From 3f63a4104c580d67757959a4d49188a5cb308310 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 16 May 2012 05:08:36 +0000 Subject: [PATCH 001/914] Moved unused files to gtsam_experimental --- gtsam/unstable/base/RefCounted.cpp | 20 -- gtsam/unstable/base/RefCounted.h | 97 --------- gtsam/unstable/discrete/PotentialTable.cpp | 173 --------------- gtsam/unstable/discrete/PotentialTable.h | 106 --------- .../unstable/discrete/TypedDiscreteFactor.cpp | 128 ----------- gtsam/unstable/discrete/TypedDiscreteFactor.h | 79 ------- .../discrete/TypedDiscreteFactorGraph.cpp | 78 ------- .../discrete/TypedDiscreteFactorGraph.h | 61 ------ gtsam/unstable/discrete/parseUAI.cpp | 168 --------------- gtsam/unstable/discrete/parseUAI.h | 33 --- .../discrete/tests/testPotentialTable.cpp | 164 -------------- .../tests/testTypedDiscreteFactor.cpp | 64 ------ .../tests/testTypedDiscreteFactorGraph.cpp | 204 ------------------ .../tests/testTypedDiscreteVariable.cpp | 80 ------- 14 files changed, 1455 deletions(-) delete mode 100644 gtsam/unstable/base/RefCounted.cpp delete mode 100644 gtsam/unstable/base/RefCounted.h delete mode 100644 gtsam/unstable/discrete/PotentialTable.cpp delete mode 100644 gtsam/unstable/discrete/PotentialTable.h delete mode 100644 gtsam/unstable/discrete/TypedDiscreteFactor.cpp delete mode 100644 gtsam/unstable/discrete/TypedDiscreteFactor.h delete mode 100644 gtsam/unstable/discrete/TypedDiscreteFactorGraph.cpp delete mode 100644 gtsam/unstable/discrete/TypedDiscreteFactorGraph.h delete mode 100644 gtsam/unstable/discrete/parseUAI.cpp delete mode 100644 gtsam/unstable/discrete/parseUAI.h delete mode 100644 gtsam/unstable/discrete/tests/testPotentialTable.cpp delete mode 100644 gtsam/unstable/discrete/tests/testTypedDiscreteFactor.cpp delete mode 100644 gtsam/unstable/discrete/tests/testTypedDiscreteFactorGraph.cpp delete mode 100644 gtsam/unstable/discrete/tests/testTypedDiscreteVariable.cpp diff --git a/gtsam/unstable/base/RefCounted.cpp b/gtsam/unstable/base/RefCounted.cpp deleted file mode 100644 index ff3981149..000000000 --- a/gtsam/unstable/base/RefCounted.cpp +++ /dev/null @@ -1,20 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 RefCounted.cpp - * @brief Simple reference-counted base class - * @author Frank Dellaert - * @date Mar 29, 2011 - */ - -#include - diff --git a/gtsam/unstable/base/RefCounted.h b/gtsam/unstable/base/RefCounted.h deleted file mode 100644 index ffa475935..000000000 --- a/gtsam/unstable/base/RefCounted.h +++ /dev/null @@ -1,97 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 RefCounted.h - * @brief Simple reference-counted base class - * @author Frank Dellaert - * @date Mar 29, 2011 - */ - -#include - -// Forward Declarations -namespace gtsam { - struct RefCounted; -} - -namespace boost { - void intrusive_ptr_add_ref(const gtsam::RefCounted * p); - void intrusive_ptr_release(const gtsam::RefCounted * p); -} - -namespace gtsam { - - /** - * Simple reference counted class inspired by - * http://www.codeproject.com/KB/stl/boostsmartptr.aspx - */ - struct RefCounted { - private: - mutable long references_; - friend void ::boost::intrusive_ptr_add_ref(const RefCounted * p); - friend void ::boost::intrusive_ptr_release(const RefCounted * p); - public: - RefCounted() : - references_(0) { - } - virtual ~RefCounted() { - } - }; - -} // namespace gtsam - -// Intrusive Pointer free functions -#ifndef DEBUG_REFCOUNT - -namespace boost { - - // increment reference count of object *p - inline void intrusive_ptr_add_ref(const gtsam::RefCounted * p) { - ++(p->references_); - } - - // decrement reference count, and delete object when reference count reaches 0 - inline void intrusive_ptr_release(const gtsam::RefCounted * p) { - if (--(p->references_) == 0) - delete p; - } - -} // namespace boost - -#else - -#include - - namespace gtsam { - static long GlobalRefCount = 0; - } - - namespace boost { - inline void intrusive_ptr_add_ref(const gtsam::RefCounted * p) { - ++(p->references_); - gtsam::GlobalRefCount++; - std::cout << "add_ref " << p << " " << p->references_ << // - " " << gtsam::GlobalRefCount << std::endl; - } - - inline void intrusive_ptr_release(const gtsam::RefCounted * p) { - gtsam::GlobalRefCount--; - std::cout << "release " << p << " " << (p->references_ - 1) << // - " " << gtsam::GlobalRefCount << std::endl; - if (--(p->references_) == 0) - delete p; - } - - } // namespace boost - -#endif - diff --git a/gtsam/unstable/discrete/PotentialTable.cpp b/gtsam/unstable/discrete/PotentialTable.cpp deleted file mode 100644 index 41677134e..000000000 --- a/gtsam/unstable/discrete/PotentialTable.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -/* - * Potentials.cpp - * - * @date Feb 21, 2011 - * @author Duy-Nguyen Ta - */ - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace gtsam { - - /* ************************************************************************* */ - void PotentialTable::Iterator::operator++() { - // note size_t is unsigned and i>=0 is always true, so strange-looking loop: - for (size_t i = size(); i--; ) { - if (++at(i) < cardinalities_[i]) - return; - else - at(i) = 0; - } - } - - /* ************************************************************************* */ - size_t PotentialTable::computeTableSize( - const std::vector& cardinalities) { - size_t tableSize = 1; - BOOST_FOREACH(const size_t c, cardinalities) - tableSize *= c; - return tableSize; - } - - /* ************************************************************************* */ - PotentialTable::PotentialTable(const std::vector& cs) : - cardinalities_(cs), table_(computeTableSize(cs)) { - generateKeyFactors(); - } - - /* ************************************************************************* */ - PotentialTable::PotentialTable(const std::vector& cardinalities, - const Table& table) : cardinalities_(cardinalities),table_(table) { - generateKeyFactors(); - } - - /* ************************************************************************* */ - PotentialTable::PotentialTable(const std::vector& cardinalities, - const std::string& tableString) : cardinalities_(cardinalities) { - parse(tableString); - generateKeyFactors(); - } - - /* ************************************************************************* */ - bool PotentialTable::equals(const PotentialTable& other, double tol) const { - //TODO: compare potentials in a more general sense with arbitrary order of keys??? - if ((cardinalities_ == other.cardinalities_) && (table_.size() - == other.table_.size()) && (keyFactors_ == other.keyFactors_)) { - for (size_t i = 0; i < table_.size(); i++) { - if (fabs(table_[i] - other.table_[i]) > tol) { - return false; - } - return true; - } - } - return false; - } - - /* ************************************************************************* */ - void PotentialTable::print(const std::string& s) const { - cout << s << endl; - for (size_t i = 0; i < cardinalities_.size(); i++) - cout << boost::format("[%d,%d]") % cardinalities_[i] % keyFactors_[i] << " "; - cout << endl; - Iterator assignment(cardinalities_); - for (size_t idx = 0; idx < table_.size(); ++idx, ++assignment) { - for (size_t k = 0; k < assignment.size(); k++) - cout << assignment[k] << "\t\t"; - cout << table_[idx] << endl; - } - } - - /* ************************************************************************* */ - const double& PotentialTable::operator()(const Assignment& var) const { - return table_[tableIndexFromAssignment(var)]; - } - - /* ************************************************************************* */ - const double& PotentialTable::operator[](const size_t index) const { - return table_.at(index); - } - - - /* ************************************************************************* */ - void PotentialTable::setPotential(const PotentialTable::Assignment& asg, const double potential) { - size_t idx = tableIndexFromAssignment(asg); - assert(idx (iss), istream_iterator (), - back_inserter(table_)); - -#ifndef NDEBUG - size_t expectedSize = computeTableSize(cardinalities_); - if (table_.size() != expectedSize) throw invalid_argument( - boost::str( - boost::format( - "String specification \"%s\" for table only contains %d doubles instead of %d") - % tableString % table_.size() % expectedSize)); -#endif - } - -} // namespace diff --git a/gtsam/unstable/discrete/PotentialTable.h b/gtsam/unstable/discrete/PotentialTable.h deleted file mode 100644 index 2cb2a7499..000000000 --- a/gtsam/unstable/discrete/PotentialTable.h +++ /dev/null @@ -1,106 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -/* - * Potentials.h - * - * @date Feb 21, 2011 - * @author Duy-Nguyen Ta - */ - -#ifndef POTENTIALS_H_ -#define POTENTIALS_H_ - -#include -#include -#include -#include -#include -#include - -namespace gtsam -{ -/** - * PotentialTable holds the real-valued potentials for Factors or Conditionals - */ -class PotentialTable { -public: - typedef std::vector Table; // container type for potentials f(x1,x2,..) - typedef std::vector Cardinalities; // just a typedef - typedef std::vector Assignment; // just a typedef - - /** - * An assignment that can be incemented - */ - struct Iterator: std::vector { - Cardinalities cardinalities_; - Iterator(const Cardinalities& cs):cardinalities_(cs) { - for(size_t i=0;i cardinalities_; // cardinalities of variables - Table table_; // Potential values of all instantiations of the variables, following the variables' order in vector Keys. - std::vector keyFactors_; // factors to multiply a key's assignment with, to access the potential table - - void generateKeyFactors(); - void parse(const std::string& tableString); - -public: - - /** compute table size from variable cardinalities */ - static size_t computeTableSize(const std::vector& cardinalities); - - /** construct an empty potential */ - PotentialTable() {} - - /** Dangerous empty n-ary potential. */ - PotentialTable(const std::vector& cardinalities); - - /** n-ary potential. */ - PotentialTable(const std::vector& cardinalities, - const Table& table); - - /** n-ary potential. */ - PotentialTable(const std::vector& cardinalities, - const std::string& tableString); - - /** return iterator to first element */ - Iterator begin() const { return Iterator(cardinalities_);} - - /** equality */ - bool equals(const PotentialTable& other, double tol = 1e-9) const; - - /** print */ - void print(const std::string& s = "Potential Table: ") const; - - /** return cardinality of a variable */ - size_t cardinality(size_t var) const { return cardinalities_[var]; } - size_t tableSize() const { return table_.size(); } - - /** accessors to potential values in the table given the assignment */ - const double& operator()(const Assignment& var) const; - const double& operator[](const size_t index) const; - - void setPotential(const Assignment& asg, const double potential); - void setPotential(const size_t tableIndex, const double potential); - - /** convert between assignment and where it is in the table */ - size_t tableIndexFromAssignment(const Assignment& var) const; - Assignment assignmentFromTableIndex(const size_t i) const; -}; - - -} // namespace - -#endif /* POTENTIALS_H_ */ diff --git a/gtsam/unstable/discrete/TypedDiscreteFactor.cpp b/gtsam/unstable/discrete/TypedDiscreteFactor.cpp deleted file mode 100644 index 769c0f095..000000000 --- a/gtsam/unstable/discrete/TypedDiscreteFactor.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 TypedDiscreteFactor.cpp - * @brief - * @author Duy-Nguyen Ta - * @date Mar 5, 2011 - */ - -#include -#include -#include -#include - -using namespace std; - -namespace gtsam { - - /* ******************************************************************************** */ - TypedDiscreteFactor::TypedDiscreteFactor(const Indices& keys, - const string& table) : - Factor (keys.begin(), keys.end()), potentials_(keys, table) { - } - - /* ******************************************************************************** */ - TypedDiscreteFactor::TypedDiscreteFactor(const Indices& keys, - const vector& table) : - Factor (keys.begin(), keys.end()), potentials_(keys, table) { - //#define DEBUG_FACTORS -#ifdef DEBUG_FACTORS - static size_t count = 0; - string dotfile = (boost::format("Factor-%03d") % ++count).str(); - potentials_.dot(dotfile); - if (count == 57) potentials_.print("57"); -#endif - } - - /* ************************************************************************* */ - double TypedDiscreteFactor::operator()(const Values& values) const { - return potentials_(values); - } - - /* ************************************************************************* */ - void TypedDiscreteFactor::print(const string&s) const { - Factor::print(s); - potentials_.print(); - } - - /* ************************************************************************* */ - bool TypedDiscreteFactor::equals(const TypedDiscreteFactor& other, double tol) const { - return potentials_.equals(other.potentials_, tol); - } - - /* ******************************************************************************** */ - DiscreteFactor::shared_ptr TypedDiscreteFactor::toDiscreteFactor( - const KeyOrdering& ordering) const { - throw std::runtime_error("broken"); - //return boost::make_shared(keys(), ordering, potentials_); - } - -#ifdef OLD -DiscreteFactor TypedDiscreteFactor::toDiscreteFactor( - const KeyOrdering& ordering, const ProblemType problemType) const { - { - static bool debug = false; - - // instantiate vector keys and column index in order - DiscreteFactor::ColumnIndex orderColumnIndex; - vector keys; - BOOST_FOREACH(const KeyOrdering::value_type& ord, ordering) - { - if (debug) cout << "Key: " << ord.first; - - // find the key with ord.first in this factor - vector::const_iterator it = std::find(keys_.begin(), - keys_.end(), ord.first); - - // if found - if (it != keys_.end()) { - if (debug) cout << "it found: " << (*it) << ", index: " - << ord.second << endl; - - keys.push_back(ord.second); // push back the ordering index - orderColumnIndex[ord.second] = columnIndex_.at(ord.first.name()); - - if (debug) cout << "map " << ord.second << " with name: " - << ord.first.name() << " to " << columnIndex_.at( - ord.first.name()) << endl; - } - } - - DiscreteFactor f(keys, potentials_, orderColumnIndex, problemType); - return f; - } - - /* ******************************************************************************** */ - std::vector TypedDiscreteFactor::init(const Indices& keys) { - vector cardinalities; - for (size_t j = 0; j < keys.size(); j++) { - Index key = keys[j]; - keys_.push_back(key); - columnIndex_[key.name()] = j; - cardinalities.push_back(key.cardinality()); - } - return cardinalities; - } - - /* ******************************************************************************** */ - double TypedDiscreteFactor::potential(const TypedValues& values) const { - vector assignment(values.size()); - BOOST_FOREACH(const TypedValues::value_type& val, values) - if (columnIndex_.find(val.first) != columnIndex_.end()) assignment[columnIndex_.at( - val.first)] = val.second; - return potentials_(assignment); - } - -#endif - -} // namespace diff --git a/gtsam/unstable/discrete/TypedDiscreteFactor.h b/gtsam/unstable/discrete/TypedDiscreteFactor.h deleted file mode 100644 index 209d4b51f..000000000 --- a/gtsam/unstable/discrete/TypedDiscreteFactor.h +++ /dev/null @@ -1,79 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 TypedDiscreteFactor.h - * @brief - * @author Duy-Nguyen Ta - * @date Mar 5, 2011 - */ - -#pragma once - -#include -#include -#include -#include - -namespace gtsam { - - /** - * A factor on discrete variables with string keys - */ - class TypedDiscreteFactor: public Factor { - - typedef AlgebraicDecisionDiagram ADD; - - /** potentials of the factor */ - ADD potentials_; - - public: - - /** A map from keys to values */ - typedef ADD::Assignment Values; - - /** Constructor from keys and string table */ - TypedDiscreteFactor(const Indices& keys, const std::string& table); - - /** Constructor from keys and doubles */ - TypedDiscreteFactor(const Indices& keys, - const std::vector& table); - - /** Evaluate */ - double operator()(const Values& values) const; - - // Testable - bool equals(const TypedDiscreteFactor& other, double tol = 1e-9) const; - void print(const std::string& s = "DiscreteFactor: ") const; - - DiscreteFactor::shared_ptr toDiscreteFactor(const KeyOrdering& ordering) const; - -#ifdef OLD - /** map each variable name to its column index in the potential table */ - typedef std::map Index2IndexMap; - Index2IndexMap columnIndex_; - - /** Initialize keys, column index, and return cardinalities */ - std::vector init(const Indices& keys); - - public: - - /** Default constructor */ - TypedDiscreteFactor() {} - - /** Evaluate potential of a given assignment of values */ - double potential(const TypedValues& values) const; - -#endif - - }; // TypedDiscreteFactor - -} // namespace diff --git a/gtsam/unstable/discrete/TypedDiscreteFactorGraph.cpp b/gtsam/unstable/discrete/TypedDiscreteFactorGraph.cpp deleted file mode 100644 index c03f92aeb..000000000 --- a/gtsam/unstable/discrete/TypedDiscreteFactorGraph.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 TypedDiscreteFactorGraph.cpp - * @brief - * @author Duy-Nguyen Ta - * @date Mar 1, 2011 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace gtsam { - - /* ************************************************************************* */ - TypedDiscreteFactorGraph::TypedDiscreteFactorGraph() { - } - - /* ************************************************************************* */ - TypedDiscreteFactorGraph::TypedDiscreteFactorGraph(const string& filename) { - bool success = parseUAI(filename, *this); - if (!success) throw runtime_error( - "TypedDiscreteFactorGraph constructor from filename failed"); - } - - /* ************************************************************************* */ - void TypedDiscreteFactorGraph::add// - (const Indices& keys, const string& table) { - push_back(boost::shared_ptr// - (new TypedDiscreteFactor(keys, table))); - } - - /* ************************************************************************* */ - void TypedDiscreteFactorGraph::add// - (const Indices& keys, const vector& table) { - push_back(boost::shared_ptr// - (new TypedDiscreteFactor(keys, table))); - } - - /* ************************************************************************* */ - void TypedDiscreteFactorGraph::print(const string s) { - cout << s << endl; - cout << "Factors: " << endl; - BOOST_FOREACH(const sharedFactor factor, factors_) - factor->print(); - } - - /* ************************************************************************* */ - double TypedDiscreteFactorGraph::operator()( - const TypedDiscreteFactor::Values& values) const { - // Loop over all factors and multiply their probabilities - double p = 1.0; - BOOST_FOREACH(const sharedFactor& factor, *this) - p *= (*factor)(values); - return p; - } - -/* ************************************************************************* */ - -} diff --git a/gtsam/unstable/discrete/TypedDiscreteFactorGraph.h b/gtsam/unstable/discrete/TypedDiscreteFactorGraph.h deleted file mode 100644 index a8fb88ff9..000000000 --- a/gtsam/unstable/discrete/TypedDiscreteFactorGraph.h +++ /dev/null @@ -1,61 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 TypedDiscreteFactorGraph.h - * @brief Factor graph with typed factors (with Index keys) - * @author Duy-Nguyen Ta - * @author Frank Dellaert - * @date Mar 1, 2011 - */ - -#pragma once - -#include -#include -#include -#include - -namespace gtsam { - - /** - * Typed discrete factor graph, where keys are strings - */ - class TypedDiscreteFactorGraph: public FactorGraph { - - public: - - /** - * Default constructor - */ - TypedDiscreteFactorGraph(); - - /** - * Constructor from file - * For now assumes in .uai format from UAI'08 Probablistic Inference Evaluation - * See http://graphmod.ics.uci.edu/uai08/FileFormat - */ - TypedDiscreteFactorGraph(const std::string& filename); - - // Add factors without shared pointer ugliness - void add(const Indices& keys, const std::string& table); - void add(const Indices& keys, const std::vector& table); - - /** print */ - void print(const std::string s); - - /** Evaluate potential of a given assignment of values */ - double operator()(const TypedDiscreteFactor::Values& values) const; - - }; // TypedDiscreteFactorGraph - - -} // namespace diff --git a/gtsam/unstable/discrete/parseUAI.cpp b/gtsam/unstable/discrete/parseUAI.cpp deleted file mode 100644 index 95e66a82c..000000000 --- a/gtsam/unstable/discrete/parseUAI.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -/* - * parseUAI.cpp - * @brief: parse UAI 2008 format - * @date March 5, 2011 - * @author Duy-Nguyen Ta - * @author Frank Dellaert - */ - -//#define PARSE -#ifdef PARSE -#include -#include // for parsing -#include // for ref -#include -#include -#include -#include - -#include - -using namespace std; -namespace qi = boost::spirit::qi; - -namespace gtsam { - - /* ************************************************************************* */ - // Keys are the vars of variables connected to a factor - // subclass of Indices with special constructor - struct Keys: public Indices { - Keys() { - } - // Pick correct vars based on indices - Keys(const Indices& vars, const vector& indices) { - BOOST_FOREACH(int i, indices) - push_back(vars[i]); - } - }; - - /* ************************************************************************* */ - // The UAI grammar is defined in a class - // Spirit local variables are used, see - // http://boost-spirit.com/home/2010/01/21/what-are-rule-bound-semantic-actions - /* ************************************************************************* */ - struct Grammar { - - // declare all parsers as instance variables - typedef vector Table; - typedef boost::spirit::istream_iterator It; - qi::rule uai, preamble, type, vars, factors, tables; - qi::rule > keys; - qi::rule > table; - - // Variables filled by preamble parser - size_t nrVars_, nrFactors_; - Indices vars_; - vector factors_; - - // Variables filled by tables parser - vector tables_; - - // The constructor defines the parser rules (declared below) - // To debug, just say debug(rule) after defining the rule - Grammar() { - using boost::phoenix::val; - using boost::phoenix::ref; - using boost::phoenix::construct; - using namespace boost::spirit::qi; - - //--------------- high level parsers with side-effects :-( ----------------- - - // A uai file consists of preamble followed by tables - uai = preamble >> tables; - - // The preamble defines the variables and factors - // The parser fills in the first set of variables above, - // including the vector of factor "Neighborhoods" - preamble = type >> vars >> int_[ref(nrFactors_) = _1] >> factors; - - // type string, does not seem to matter - type = lit("BAYES") | lit("MARKOV"); - - // vars parses "3 2 2 3" and synthesizes a Keys class, in this case - // containing Indices {v0,2}, {v1,2}, and {v2,3} - vars = int_[ref(nrVars_) = _1] >> (repeat(ref(nrVars_))[int_]) // - [ref(vars_) = construct (_1)]; - - // Parse a list of Neighborhoods and fill factors_ - factors = (repeat(ref(nrFactors_))[keys])// - [ref(factors_) = _1]; - - // The tables parser fills in the tables_ - tables = (repeat(ref(nrFactors_))[table])// - [ref(tables_) = _1]; - - //----------- basic parsers with synthesized attributes :-) ----------------- - - // keys parses strings like "2 1 2", indicating - // a binary factor (2) on variables v1 and v2. - // It returns a Keys class as attribute - keys = int_[_a = _1] >> repeat(_a)[int_] // - [_val = construct (ref(vars_), _1)]; - - // The tables are a list of doubles preceded by a count, e.g. "4 1.0 2.0 3.0 4.0" - // The table parser returns a PotentialTable::Table attribute - table = int_[_a = _1] >> repeat(_a)[double_] // - [_val = construct
(_1)]; - } - - // Add the factors to the graph - void addFactorsToGraph(TypedDiscreteFactorGraph& graph) { - assert(factors_.size()==nrFactors_); - assert(tables_.size()==nrFactors_); - for (size_t i = 0; i < nrFactors_; i++) - graph.add(factors_[i], tables_[i]); - } - - }; - - /* ************************************************************************* */ - bool parseUAI(const std::string& filename, TypedDiscreteFactorGraph& graph) { - - // open file, disable skipping of whitespace - std::ifstream in(filename.c_str()); - if (!in) { - cerr << "Could not open " << filename << endl; - return false; - } - - in.unsetf(std::ios::skipws); - - // wrap istream into iterator - boost::spirit::istream_iterator first(in); - boost::spirit::istream_iterator last; - - // Parse and add factors into the graph - Grammar grammar; - bool success = qi::phrase_parse(first, last, grammar.uai, qi::space); - if (success) grammar.addFactorsToGraph(graph); - - return success; - } -/* ************************************************************************* */ - -}// gtsam -#else - -#include - -namespace gtsam { - -/** Dummy version of function - otherwise, missing symbol */ -bool parseUAI(const std::string& filename, TypedDiscreteFactorGraph& graph) { - return false; -} - -} // \namespace gtsam -#endif diff --git a/gtsam/unstable/discrete/parseUAI.h b/gtsam/unstable/discrete/parseUAI.h deleted file mode 100644 index 7e1010ff5..000000000 --- a/gtsam/unstable/discrete/parseUAI.h +++ /dev/null @@ -1,33 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -/* - * parseUAI.h - * @brief: parse UAI 2008 format - * @date March 5, 2011 - * @author Duy-Nguyen Ta - * @author Frank Dellaert - */ - -#include -#include - -namespace gtsam { - - /** - * Constructor from file - * For now assumes in .uai format from UAI'08 Probablistic Inference Evaluation - * See http://graphmod.ics.uci.edu/uai08/FileFormat - */ - bool parseUAI(const std::string& filename, - gtsam::TypedDiscreteFactorGraph& graph); - -} // gtsam diff --git a/gtsam/unstable/discrete/tests/testPotentialTable.cpp b/gtsam/unstable/discrete/tests/testPotentialTable.cpp deleted file mode 100644 index 2a549b608..000000000 --- a/gtsam/unstable/discrete/tests/testPotentialTable.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testPotentialTable.cpp - * @brief Develop recursive potential operations - * @author Frank Dellaert - * @date Mar 6, 2011 - */ - -#include -#include // for operator += -using namespace boost::assign; - -#include -#include - -using namespace std; -using namespace gtsam; - -/* ******************************************************************************** */ -TEST( PotentialTable, Iterator) -{ - PotentialTable::Cardinalities cs; - cs += 2, 3; - PotentialTable::Iterator it(cs); - LONGS_EQUAL(0,it[0]); - LONGS_EQUAL(0,it[1]); - ++it; - LONGS_EQUAL(0,it[0]); - LONGS_EQUAL(1,it[1]); - ++it; - LONGS_EQUAL(0,it[0]); - LONGS_EQUAL(2,it[1]); - ++it; - LONGS_EQUAL(1,it[0]); - LONGS_EQUAL(0,it[1]); - ++it; - LONGS_EQUAL(1,it[0]); - LONGS_EQUAL(1,it[1]); - ++it; - LONGS_EQUAL(1,it[0]); - LONGS_EQUAL(2,it[1]); - ++it; - LONGS_EQUAL(0,it[0]); - LONGS_EQUAL(0,it[1]); -} - -/* ******************************************************************************** */ -#include - -TEST( PotentialTable, unordered_map) -{ - boost::unordered_map x; - x[false] = 7; -} - -/* ******************************************************************************** */ - -struct Factor { - vector table_; - vector keys_; - bool operator==(const Factor& f) const { - return table_ == f.table_ && keys_ == f.keys_; - } -}; - -Factor operator*(const double& s, const Factor& f) { - Factor r = f; - BOOST_FOREACH(double& ri, r.table_) - ri *= s; - return r; -} - -Factor operator*(const Factor& f, const double& s) { - Factor r = f; - BOOST_FOREACH(double& ri, r.table_) - ri *= s; - return r; -} - -Factor operator*(const Factor& f1, const Factor& f2) { - Factor r; - - // base case 1, both tables start with same key - if (f1.keys_.front() == f2.keys_.front()) { - } - - return r; -} - -/* ******************************************************************************** */ -// f(5)*f(5) = f0*f0 @ f1*f1 -TEST( PotentialTable, baseCase1a) -{ - Factor f1, f2, expected; - f1.table_ += 00, 01; - f2.table_ += 20, 21; - f1.keys_ += 5; - f2.keys_ += 5; - expected.table_ += 00 * 20, 01 * 21; - expected.keys_ += 5; - CHECK(f1*f2==expected) -} - -/* ******************************************************************************** */ -// f(0,1)*f(0) = f0(1)*f0 @ f1(1)*f1 -TEST( PotentialTable, baseCase1b) -{ - Factor f1, f2, expected; - f1.table_ += 00, 01, 10, 11; - f2.table_ += 20, 21; - f1.keys_ += 0, 1; - f2.keys_ += 0; - expected.table_ += 00 * 20, 00 * 21, 01 * 20, 01 * 21, 10 * 20, 10 * 21, 11 - * 20, 11 * 21; - expected.keys_ += 0, 1, 2; - CHECK(f1*f2==expected) -} - -/* ******************************************************************************** */ -// f0(1)*f(2) = f00*f(2) @ f01*f(2) -TEST( PotentialTable, baseCase2) -{ - Factor f1, f2, expected; - f1.table_ += 00, 01; - f2.table_ += 20, 21; - f1.keys_ += 1; - f2.keys_ += 2; - expected.table_ += 00 * 20, 00 * 21, 01 * 20, 01 * 21; - expected.keys_ += 1, 2; - CHECK(f1*f2==expected) -} - -/* ******************************************************************************** */ -// f(0,1)*f(2) = f0(1)*f(2) @ f1(1)*f(2) -// f0(1)*f(2) = f00*f(2) @ f01*f(2) -TEST( PotentialTable, multiplication) -{ - Factor f1, f2, expected; - f1.table_ += 00, 01, 10, 11; - f2.table_ += 20, 21; - f1.keys_ += 0, 1; - f2.keys_ += 2; - expected.table_ += 00 * 20, 00 * 21, 01 * 20, 01 * 21, 10 * 20, 10 * 21, 11 - * 20, 11 * 21; - expected.keys_ += 0, 1, 2; - CHECK(f1*f2==expected) -} - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ diff --git a/gtsam/unstable/discrete/tests/testTypedDiscreteFactor.cpp b/gtsam/unstable/discrete/tests/testTypedDiscreteFactor.cpp deleted file mode 100644 index 16798cd2b..000000000 --- a/gtsam/unstable/discrete/tests/testTypedDiscreteFactor.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testTypedDiscreteFactor.cpp - * @brief Typed f1s use discrete keys - * @author Duy-Nguyen Ta - * @date Mar 5, 2011 - */ - -#include -#include -#include -#include -using namespace boost::assign; - -using namespace std; -using namespace gtsam; - -/* ******************************************************************************** */ -// initialize some common test values -DiscreteKey v0("v0"), v1("v1"), v2("v2", 3); -TypedDiscreteFactor::Values values; - -void init() { - values[v0] = 0; - values[v1] = 0; - values[v2] = 1; -} - -/* ******************************************************************************** */ -TEST( TypedDiscreteFactor, constructors) -{ - TypedDiscreteFactor f1(v1 & v2, "0.210 0.333 0.457 0.811 0.000 0.189"); - EXPECT_LONGS_EQUAL(2, f1.size()); - // f1.print(); - - double expectedP001 = 0.333; - EXPECT_DOUBLES_EQUAL(expectedP001, f1(values), 1e-9); - - vector ys; - ys += 0.210, 0.333, 0.457, 0.811, 0.000, 0.189; - TypedDiscreteFactor f2(v1 & v2, ys); - - EXPECT(assert_equal(f1, f2, 1e-9)); - EXPECT_LONGS_EQUAL(2, f1.size()); - EXPECT_DOUBLES_EQUAL(expectedP001, f2(values), 1e-9); -} - -/* ************************************************************************* */ -int main() { - init(); - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ diff --git a/gtsam/unstable/discrete/tests/testTypedDiscreteFactorGraph.cpp b/gtsam/unstable/discrete/tests/testTypedDiscreteFactorGraph.cpp deleted file mode 100644 index 70aee2c48..000000000 --- a/gtsam/unstable/discrete/tests/testTypedDiscreteFactorGraph.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -/* - * testTypedDiscreteFactorGraph.cpp - * @brief test readable factor graphs - * @author Duy-Nguyen Ta - * @author Frank Dellaert - * @date Feb 14, 2011 - */ - -#include -#include -#include - -using namespace std; -using namespace gtsam; - -/* ******************************************************************************** */ -// initialize some common test values -DiscreteKey v0("v0"), v1("v1"), v2("v2", 3); -TypedDiscreteFactor::Values values; - -void init() { - values[v0] = 0; - values[v1] = 0; - values[v2] = 1; -} - -string path("../../../gtsam/discrete/tests/data/"); - -/* ************************************************************************* */ -TEST( TypedDiscreteFactorGraph, parseUAI) -{ - // This reads in a small factor graph on discrete variables v0, v1, and v2 - TypedDiscreteFactorGraph graph(path + "UAI/sampleMARKOV.uai"); - - // GTSAM_PRINT(graph); - - LONGS_EQUAL(3,graph.nrFactors()) - - double expectedP001 = 0.436 * 0.128 * 0.333; - double actualP001 = graph(values); - DOUBLES_EQUAL(expectedP001,actualP001,1e-9) -} - -/* ************************************************************************* */ -TEST( TypedDiscreteFactorGraph, parseUAI1) -{ - // This reads in a big graph from UAI 2008 - TypedDiscreteFactorGraph graph(path + "UAI/uai08_test1.uai"); - // GTSAM_PRINT(graph); - LONGS_EQUAL(54,graph.nrFactors()) -} - -/* ************************************************************************* */ -TEST( TypedDiscreteFactorGraph, parseUAI2) -{ - // This reads in a big graph from UAI 2008 - TypedDiscreteFactorGraph graph(path + "UAI/uai08_test2.uai"); - // GTSAM_PRINT(graph); - LONGS_EQUAL(21,graph.nrFactors()) -} - -/* ************************************************************************* */ -TEST( TypedDiscreteFactorGraph, parseUAI3) -{ - // This reads in a big graph from UAI 2008 - TypedDiscreteFactorGraph graph(path + "UAI/uai08_test3.uai"); - // GTSAM_PRINT(graph); - LONGS_EQUAL(13,graph.nrFactors()) -} - -///* ******************************************************************************** */ -//// global test data -// -//string graphFilename(path + "UAI/uai08_test2.uai"); -//string evidFilename (path + "UAI/uai08_test2.uai.evid"); -// -///** -// * [Cluster] Ordering splitted from libDAI -// * {x9}, {x10}, {x11}, {x12}, {x13}, {x14}, {x15}, {x16}, {x17}, {x18}, {x19}, {x20}, -// * {x0, x1, x8}, {x2, x6, x7}, {x4, x6, x8}, -// * {x1, x5, x7}, {x1, x3, x7, x8}, {x3, x6, x7, x8}) -// * -// */ -//size_t ordering[21] = {9,10,11,12,13,14,15,16,17,18,19,20,0,2,4,5,1,3,6,7,8}; -//vector vOrdering; -// -//// Container for all data read from files. -//TypedDiscreteFactorGraph container; -// -//// The factor graph generated from the data, after assigning the elimination ordering -//// for each variable -//DiscreteFactorGraph::shared_ptr graph; -// -///* ******************************************************************************** */ -//// Initialize all test data -//void initTestData() -//{ -// container.readFromFile_UAI(graphFilename); -// container.readEvidence_UAI(evidFilename); -// for (size_t i = 0; i<21; i++) vOrdering.push_back(ordering[i]); -// container.setOrdering(vOrdering); -// graph = container.generateFactorGraph(); -//} -// -// -///* ******************************************************************************** */ -//// Test reading .fg file from libDAI -//TEST( TypedDiscreteFactorGraph, readFG) -//{ -// TypedDiscreteFactorGraph graph; -// graph.readFromFile_FG(path + "FG/alarm.fg"); -//// graph.print(); -//} -// -///* ******************************************************************************** */ -//TEST( TypedDiscreteFactorGraph, testSequentialSolver) -//{ -//// tic(0, "Sequential Solver"); -// -// boost::shared_ptr actualMPE -// = DiscreteSequentialSolver(*graph).optimize(); -// BOOST_FOREACH(const PotentialTable::MapAssignment::value_type asg, *actualMPE) -// cout << vOrdering[asg.first] << ": " << asg.second << endl; -// -//// toc(0, "Sequential Solver"); -// tictoc_print(); -// -//} -// -///* ******************************************************************************** */ -//void backSubstitute(const BayesTree::sharedClique currentClique, -// PotentialTable::MapAssignment& assignments) { -// -// // solve the bayes net in the current node -// DiscreteBayesNet::const_reverse_iterator it = currentClique->rbegin(); -// for (; it!=currentClique->rend(); ++it) { -// size_t val = (*it)->solve(assignments); // Solve for that variable -// assignments[(*it)->key()] = val; // store result in partial solution -// } -// -// // solve the bayes nets in the child nodes -// BOOST_FOREACH(const BayesTree::sharedClique& child, -// currentClique->children()) { -// backSubstitute(child, assignments); -// } -//} -// -// -//void optimizeMultiFrontal(DiscreteFactorGraph::shared_ptr graph) { -// -// VariableIndex::shared_ptr structure(new VariableIndex(*graph)); -// JunctionTree::shared_ptr junctionTree(new JunctionTree(*graph, *structure)); -// BayesTree::sharedClique rootClique = junctionTree->eliminate(); -// -//// toc(1, "GJT eliminate"); -// -//// tictoc_print(); -// -//// // Allocate solution vector -//// tic(2, "allocate VectorValues"); -//// vector dims(rootClique->back()->key() + 1, 0); -//// countDims(rootClique, dims); -//// VectorValues result(dims); -//// toc(2, "allocate VectorValues"); -//// -//// // back-substitution -//// tic(3, "back-substitute"); -//// btreeBackSubstitute(rootClique, result); -//// toc(3, "back-substitute"); -//// return result; -//} -// -// -///* ******************************************************************************** */ -// -//TEST( TypedDiscreteFactorGraph, multifrontalSolver) -//{ -// tic(0, "Multifrontal Solver"); -// optimizeMultiFrontal(graph); -// -// toc(0, "Multifrontal Solver"); -// tictoc_print(); -//} - - -/* ************************************************************************* */ -int main() { /*initTestData(); */ - init(); - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ - diff --git a/gtsam/unstable/discrete/tests/testTypedDiscreteVariable.cpp b/gtsam/unstable/discrete/tests/testTypedDiscreteVariable.cpp deleted file mode 100644 index 1a264f00c..000000000 --- a/gtsam/unstable/discrete/tests/testTypedDiscreteVariable.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -/* - * testTypedDiscreteVariable.cpp - * - * @date March 2, 2011 - * @author Duy-Nguyen Ta - */ - -#include - -using namespace std; - -/* ******************************************************************************** */ - -class DiscreteVariable { - int v_; -public: - DiscreteVariable(int v) : - v_(v) { - } - bool operator ==(const DiscreteVariable& other) const { - return v_ == other.v_; - } - bool operator !=(const DiscreteVariable& other) const { - return v_ != other.v_; - } -}; - -class Color: public DiscreteVariable { -public: - enum Value { - red, green, blue - }; - Color(Value v) : - DiscreteVariable(v) { - } -}; - -class Flavor: public DiscreteVariable { -public: - enum Value { - sweet, sour - }; - Flavor(Value v) : - DiscreteVariable(v) { - } -}; - -//TEST( TypedDiscreteFactorGraph, simple) -//{ -// Color v1(Color::red), v2(Color::green); -// CHECK(v1!=v2); -// CHECK(v1==v1); -// -// // Declare a bunch of keys -// DiscreteKey C("Color"); -// DiscreteKey F("Flavor"); -// -// // Create a factor saying red is associated with sweet, -// // green with sour, blue with both -// TypedDiscreteFactor factor(C, F, "1 0 0 1 1 1"); -//} - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ - From 6def916bdbab31492719610d4b57315f66628422 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 16 May 2012 05:15:15 +0000 Subject: [PATCH 002/914] Commented out non-implemented functionality, since the interface appears to have changed - Frank? --- gtsam_unstable/discrete/tests/testCSP.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gtsam_unstable/discrete/tests/testCSP.cpp b/gtsam_unstable/discrete/tests/testCSP.cpp index 46bf61240..5d6d22792 100644 --- a/gtsam_unstable/discrete/tests/testCSP.cpp +++ b/gtsam_unstable/discrete/tests/testCSP.cpp @@ -54,27 +54,27 @@ TEST_UNSAFE( CSP, allInOne) invalid[ID.first] = 0; invalid[UT.first] = 0; invalid[AZ.first] = 0; - EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); +// EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface // Check a valid combination DiscreteFactor::Values valid; valid[ID.first] = 0; valid[UT.first] = 1; valid[AZ.first] = 0; - EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); +// EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface // Just for fun, create the product and check it - DecisionTreeFactor product = csp.product(); +// DecisionTreeFactor product = csp.product(); // FIXME: fails due to lack of product() // product.dot("product"); - DecisionTreeFactor expectedProduct(ID & AZ & UT, "0 1 0 0 0 0 1 0"); - EXPECT(assert_equal(expectedProduct,product)); +// DecisionTreeFactor expectedProduct(ID & AZ & UT, "0 1 0 0 0 0 1 0"); +// EXPECT(assert_equal(expectedProduct,product)); // Solve CSP::sharedValues mpe = csp.optimalAssignment(); CSP::Values expected; insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 1); EXPECT(assert_equal(expected,*mpe)); - EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); +// EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface } /* ************************************************************************* */ @@ -122,7 +122,7 @@ TEST_UNSAFE( CSP, WesternUS) (MT.first,1)(WY.first,0)(NM.first,3)(CO.first,2) (ID.first,2)(UT.first,1)(AZ.first,0); EXPECT(assert_equal(expected,*mpe)); - EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); +// EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface // Write out the dual graph for hmetis #ifdef DUAL @@ -167,21 +167,21 @@ TEST_UNSAFE( CSP, AllDiff) invalid[ID.first] = 0; invalid[UT.first] = 1; invalid[AZ.first] = 0; - EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); +// EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface // Check a valid combination DiscreteFactor::Values valid; valid[ID.first] = 0; valid[UT.first] = 1; valid[AZ.first] = 2; - EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); +// EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface // Solve CSP::sharedValues mpe = csp.optimalAssignment(); CSP::Values expected; insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 2); EXPECT(assert_equal(expected,*mpe)); - EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); +// EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface // Arc-consistency vector domains; From 320c1f58e2e25b32966f92598314ead9bcf74926 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 16 May 2012 05:18:04 +0000 Subject: [PATCH 003/914] Removed empty folder From d0218cf512413f9bc4244194bfc46aef0e1d7675 Mon Sep 17 00:00:00 2001 From: bpeasle Date: Wed, 16 May 2012 18:09:59 +0000 Subject: [PATCH 004/914] --- tests/testOccupancyGrid.cpp | 191 ++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 tests/testOccupancyGrid.cpp diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp new file mode 100644 index 000000000..3aad53829 --- /dev/null +++ b/tests/testOccupancyGrid.cpp @@ -0,0 +1,191 @@ +/** + * @file testOccupancyGrid.cpp + * @date May 14, 2012 + * @author Brian Peasley + * @author Frank Dellaert + */ + + +#include +#include +#include +#include +#include + +using namespace std; +using namespace gtsam; + + +/** + * Point Class + * @brief simple class that holds x,y,z coordinates + */ +/*class Point{ +public: + double x,y,z; +};*/ + +/** + * Laser Factor + * @brief factor that encodes a laser measurements likelihood. + */ +class LaserFactor : public DiscreteFactor{ +public: + + ///constructor + LaserFactor(){ + } + + /// Find value for given assignment of values to variables + /// return 1000 if any of the non-last cell is occupied and 1 otherwise + /// Values contains all occupancy values (0 or 1) + virtual double operator()(const Values&) const{ + return 0; + } + + /// Multiply in a DecisionTreeFactor and return the result as DecisionTreeFactor + virtual DecisionTreeFactor operator*(const DecisionTreeFactor&) const{ + throw runtime_error("operator DecisionTreeFactor not implemented"); + } + + virtual operator DecisionTreeFactor() const{ + throw runtime_error("operator DecisionTreeFactor not implemented"); + } +}; + +/** + * OccupancyGrid Class + * An occupancy grid is just a factor graph. + * Every cell in the occupancy grid is a variable in the factor graph. + * Measurements will create factors, as well as the prior. + */ +class OccupancyGrid : public DiscreteFactorGraph { +private: + //bool *m_grid; //array of boolean that denotes if cell is occupied or free + //Point *m_location; //location of each cell + int m_width; //number of cells wide the grid is + int m_height; //number of cells tall the grid is + double m_res; //the resolution at which the grid is created + +public: + + ///constructor + ///Creates a 2d grid of cells with the origin in the center of the grid + OccupancyGrid(double width, double height, double resolution){ + m_width = width/resolution; + m_height = height/resolution; + m_res = resolution; + + /*m_grid = (bool *)malloc(cellCount()*sizeof(bool)); + m_location = (Point *)malloc(cellCount()*sizeof(Point)); + + for(int i = 0; i < cellCount(); i++){ + m_grid[i] = false; + m_location[i].x = (i%m_width)*resolution - width/2.0; + m_location[i].y = (i/m_width)*resolution - height/2.0; + }*/ + } + + ///add a prior + void addPrior(Index cell, double prior){ + size_t numStates = 2; + DiscreteKey key(cell, numStates); + + //add a factor + vector table(2); + table[0] = 1-prior; + table[1] = prior; + add(key, table); + } + + ///add a laser measurement + void addLaser(const Pose2 &pose, double range){ + //ray trace from pose to range to find all cells the laser passes through + double x = pose.x(); //start position of the laser + double y = pose.y(); + double step = m_res/8.0; //amount to step in each iteration of laser traversal + int index; + vector cells; //ordered vector that contain the indicis of all cells hit by the laser + + //traverse laser + for(double i = 0; i < range; i += step){ + //get point on laser + x = pose.x() + i*cos(pose.theta()); + y = pose.y() + i*sin(pose.theta()); + + //get the index of the cell that holds point (x,y) + index = cellLookup(x,y); + + //add cell to list of cells if it is new + if(i == 0 || index != cells[cells.size()-1]) + cells.push_back(index); + } + + for(int i = 0; i < cells.size(); i++) + printf("%d,",cells[i]); + + //add a factor that connects all those cells + push_back(boost::make_shared()); + } + + /// returns the number of cells in the grid + int cellCount() const { + return m_width*m_height; + } + + /// returns the index of the cell in which point (x,y) lies. + int cellLookup(double x, double y) const { + //move (x,y) to the nearest resolution + x *= (1.0/m_res); + y *= (1.0/m_res); + + //round to nearest integer + x = (double)((int)x); + y = (double)((int)y); + + + //determine index + x += m_width/2; + y = m_height/2 - y; + + //bounds checking + int index = (int)(y*m_width + x); + index = index >= m_width*m_height ? -1 : index; + + return index; + } + +}; + +/* ************************************************************************* */ +TEST_UNSAFE( OccupancyGrid, Test1) { + //Build a small grid and test optimization + + //Build small grid + double width = 3; //meters + double height = 2; //meters + double resolution = 0.5; //meters + OccupancyGrid occupancyGrid(width, height, resolution); //default center to middle + + //Add measurements + Pose2 pose(0,0,0); + double range = 1.0; + + occupancyGrid.addPrior(0, 0.7); + EXPECT_LONGS_EQUAL(1, occupancyGrid.size()); + + occupancyGrid.addLaser(pose, range); + EXPECT_LONGS_EQUAL(2, occupancyGrid.size()); + //run MCMC + +} + + + +/* ************************************************************************* */ +int main() { + TestResult tr; + return TestRegistry::runAllTests(tr); +} +/* ************************************************************************* */ + From c50b972dd194e9d80dfdd5edca88fa478a8278e4 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 17 May 2012 16:33:51 +0000 Subject: [PATCH 005/914] Added discrete to convenience libraries dependencies --- tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0dd41638a..1101a0a4b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,6 +2,7 @@ set(tests_local_libs slam nonlinear linear + discrete inference geometry base From b571a2a7eeaf4f5bc49f0bd2667df260deb6c90a Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 17 May 2012 18:08:34 +0000 Subject: [PATCH 006/914] Uncommented failing code, re-enabled testScheduler - both fail to compile --- gtsam_unstable/discrete/CMakeLists.txt | 3 ++- gtsam_unstable/discrete/tests/testCSP.cpp | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index b049562a5..56f62b1bf 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -16,7 +16,8 @@ set (discrete_full_libs gtsam_unstable-static) # Exclude tests that don't work -set (discrete_excluded_tests "${CMAKE_CURRENT_SOURCE_DIR}/tests/testScheduler.cpp") +set (discrete_excluded_tests "") +#"${CMAKE_CURRENT_SOURCE_DIR}/tests/testScheduler.cpp") # Add all tests gtsam_add_subdir_tests(discrete_unstable "${discrete_local_libs}" "${discrete_full_libs}" "${discrete_excluded_tests}") diff --git a/gtsam_unstable/discrete/tests/testCSP.cpp b/gtsam_unstable/discrete/tests/testCSP.cpp index 5d6d22792..4d04afb92 100644 --- a/gtsam_unstable/discrete/tests/testCSP.cpp +++ b/gtsam_unstable/discrete/tests/testCSP.cpp @@ -54,27 +54,27 @@ TEST_UNSAFE( CSP, allInOne) invalid[ID.first] = 0; invalid[UT.first] = 0; invalid[AZ.first] = 0; -// EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface // Check a valid combination DiscreteFactor::Values valid; valid[ID.first] = 0; valid[UT.first] = 1; valid[AZ.first] = 0; -// EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface // Just for fun, create the product and check it -// DecisionTreeFactor product = csp.product(); // FIXME: fails due to lack of product() + DecisionTreeFactor product = csp.product(); // FIXME: fails due to lack of product() // product.dot("product"); -// DecisionTreeFactor expectedProduct(ID & AZ & UT, "0 1 0 0 0 0 1 0"); -// EXPECT(assert_equal(expectedProduct,product)); + DecisionTreeFactor expectedProduct(ID & AZ & UT, "0 1 0 0 0 0 1 0"); + EXPECT(assert_equal(expectedProduct,product)); // Solve CSP::sharedValues mpe = csp.optimalAssignment(); CSP::Values expected; insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 1); EXPECT(assert_equal(expected,*mpe)); -// EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface } /* ************************************************************************* */ @@ -122,7 +122,7 @@ TEST_UNSAFE( CSP, WesternUS) (MT.first,1)(WY.first,0)(NM.first,3)(CO.first,2) (ID.first,2)(UT.first,1)(AZ.first,0); EXPECT(assert_equal(expected,*mpe)); -// EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface // Write out the dual graph for hmetis #ifdef DUAL @@ -167,21 +167,21 @@ TEST_UNSAFE( CSP, AllDiff) invalid[ID.first] = 0; invalid[UT.first] = 1; invalid[AZ.first] = 0; -// EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface // Check a valid combination DiscreteFactor::Values valid; valid[ID.first] = 0; valid[UT.first] = 1; valid[AZ.first] = 2; -// EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface // Solve CSP::sharedValues mpe = csp.optimalAssignment(); CSP::Values expected; insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 2); EXPECT(assert_equal(expected,*mpe)); -// EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface // Arc-consistency vector domains; From 9682745b81833262e3378ce09ab7d0aa3f05645e Mon Sep 17 00:00:00 2001 From: bpeasle Date: Fri, 18 May 2012 20:12:08 +0000 Subject: [PATCH 007/914] Added ray tracing and implemented LaserFactor::operator()(const Values &) --- tests/testOccupancyGrid.cpp | 138 +++++++++++++++++++++++++----------- 1 file changed, 96 insertions(+), 42 deletions(-) diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp index 3aad53829..55b256712 100644 --- a/tests/testOccupancyGrid.cpp +++ b/tests/testOccupancyGrid.cpp @@ -15,37 +15,44 @@ using namespace std; using namespace gtsam; - -/** - * Point Class - * @brief simple class that holds x,y,z coordinates - */ -/*class Point{ -public: - double x,y,z; -};*/ - /** * Laser Factor * @brief factor that encodes a laser measurements likelihood. */ + class LaserFactor : public DiscreteFactor{ +private: + DiscreteKeys m_cells; public: ///constructor - LaserFactor(){ + LaserFactor(const DiscreteKeys &cells) { + m_cells.resize(cells.size()); + for(unsigned int i = 0; i < cells.size(); i++) + m_cells[i] = cells[i]; } /// Find value for given assignment of values to variables /// return 1000 if any of the non-last cell is occupied and 1 otherwise /// Values contains all occupancy values (0 or 1) - virtual double operator()(const Values&) const{ - return 0; + virtual double operator()(const Values &vals) const{ + + for(unsigned int i = 0; i < m_cells.size() - 1; i++){ + if(vals.at(m_cells[i].first) == 1) + return 1000; + } + + if(vals.at(m_cells[m_cells.size() - 1].first) == 0) + return 1000; + + return 1; + + } /// Multiply in a DecisionTreeFactor and return the result as DecisionTreeFactor virtual DecisionTreeFactor operator*(const DecisionTreeFactor&) const{ - throw runtime_error("operator DecisionTreeFactor not implemented"); + throw runtime_error("operator * not implemented"); } virtual operator DecisionTreeFactor() const{ @@ -61,11 +68,12 @@ public: */ class OccupancyGrid : public DiscreteFactorGraph { private: - //bool *m_grid; //array of boolean that denotes if cell is occupied or free - //Point *m_location; //location of each cell - int m_width; //number of cells wide the grid is - int m_height; //number of cells tall the grid is - double m_res; //the resolution at which the grid is created + int m_width; //number of cells wide the grid is + int m_height; //number of cells tall the grid is + double m_res; //the resolution at which the grid is created + + DiscreteKeys m_cells; //list of keys of all cells in the grid + Values m_vals; //mapping from Index to value (0 or 1) public: @@ -76,14 +84,12 @@ public: m_height = height/resolution; m_res = resolution; - /*m_grid = (bool *)malloc(cellCount()*sizeof(bool)); - m_location = (Point *)malloc(cellCount()*sizeof(Point)); - for(int i = 0; i < cellCount(); i++){ - m_grid[i] = false; - m_location[i].x = (i%m_width)*resolution - width/2.0; - m_location[i].y = (i/m_width)*resolution - height/2.0; - }*/ + m_cells.push_back(DiscreteKey(i,2)); + m_vals.insert(pair((Index)i,0)); + } + m_vals[0]; + } ///add a prior @@ -104,8 +110,8 @@ public: double x = pose.x(); //start position of the laser double y = pose.y(); double step = m_res/8.0; //amount to step in each iteration of laser traversal - int index; - vector cells; //ordered vector that contain the indicis of all cells hit by the laser + DiscreteKey key; + DiscreteKeys cells; //list of keys of cells hit by the laser //traverse laser for(double i = 0; i < range; i += step){ @@ -113,19 +119,20 @@ public: x = pose.x() + i*cos(pose.theta()); y = pose.y() + i*sin(pose.theta()); - //get the index of the cell that holds point (x,y) - index = cellLookup(x,y); + //get the key of the cell that holds point (x,y) + key = keyLookup(x,y); //add cell to list of cells if it is new - if(i == 0 || index != cells[cells.size()-1]) - cells.push_back(index); + if(i == 0 || key != cells[cells.size()-1]) + cells.push_back(key); } - for(int i = 0; i < cells.size(); i++) - printf("%d,",cells[i]); + for(unsigned int i = 0; i < cells.size(); i++) + printf("%d,", (int)cells[i].first); //add a factor that connects all those cells - push_back(boost::make_shared()); + push_back(boost::make_shared(cells)); + } /// returns the number of cells in the grid @@ -133,8 +140,8 @@ public: return m_width*m_height; } - /// returns the index of the cell in which point (x,y) lies. - int cellLookup(double x, double y) const { + /// returns the key of the cell in which point (x,y) lies. + DiscreteKey keyLookup(double x, double y) const { //move (x,y) to the nearest resolution x *= (1.0/m_res); y *= (1.0/m_res); @@ -149,10 +156,48 @@ public: y = m_height/2 - y; //bounds checking - int index = (int)(y*m_width + x); + int index = y*m_width + x; index = index >= m_width*m_height ? -1 : index; - return index; + return m_cells[index]; + } + + /// access a cell in the grid via its index + size_t &operator[](Index index){ + return m_vals[index]; + } + const size_t operator[](Index index) const{ + return m_vals.at(index); + } + + /// access a cell in the grid via its row and column + size_t &operator()(int row, int col){ + Index index = (Index)(row*m_width + col); + return m_vals[index]; + } + const size_t operator()(int row, int col) const{ + Index index = (Index)(row*m_width + col); + return m_vals.at(index); + } + + /// prints an ASCII grid to the console + void print() const { + Index index; + printf("\n"); + for(int i = 0; i < m_height; i++){ + for(int j = 0; j < m_width; j++){ + printf("%ld ", m_vals.at(index)); + index++; + } + printf("\n"); + } + } + double operator()(int index) const{ + return (*factors_[index + 1])(m_vals); + } + + void assignments()const { + m_vals.print(); } }; @@ -176,12 +221,21 @@ TEST_UNSAFE( OccupancyGrid, Test1) { occupancyGrid.addLaser(pose, range); EXPECT_LONGS_EQUAL(2, occupancyGrid.size()); + EXPECT_LONGS_EQUAL(1000, occupancyGrid(0)); + + occupancyGrid[16] = 1; + EXPECT_LONGS_EQUAL(1, occupancyGrid(0)); + + occupancyGrid[15] = 1; + EXPECT_LONGS_EQUAL(1000, occupancyGrid(0)); + + occupancyGrid[16] = 0; + EXPECT_LONGS_EQUAL(1000, occupancyGrid(0)); + + //run MCMC - } - - /* ************************************************************************* */ int main() { TestResult tr; From ba6439dbb146d5235d5eaffd9557eaed8ea5dfaf Mon Sep 17 00:00:00 2001 From: bpeasle Date: Fri, 18 May 2012 22:09:20 +0000 Subject: [PATCH 008/914] Implemented a very slow Metropolis algorithm --- tests/testOccupancyGrid.cpp | 170 ++++++++++++++++++++++++------------ 1 file changed, 116 insertions(+), 54 deletions(-) diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp index 55b256712..2289e444b 100644 --- a/tests/testOccupancyGrid.cpp +++ b/tests/testOccupancyGrid.cpp @@ -9,6 +9,9 @@ #include #include #include +#include +#include + #include #include @@ -22,32 +25,34 @@ using namespace gtsam; class LaserFactor : public DiscreteFactor{ private: - DiscreteKeys m_cells; + //FIX ME + //m_cells changed to vector + DiscreteKeys m_cells; ///cells in which laser passes through + public: ///constructor - LaserFactor(const DiscreteKeys &cells) { - m_cells.resize(cells.size()); - for(unsigned int i = 0; i < cells.size(); i++) - m_cells[i] = cells[i]; - } + LaserFactor(const DiscreteKeys &cells) : m_cells(cells) {} - /// Find value for given assignment of values to variables - /// return 1000 if any of the non-last cell is occupied and 1 otherwise - /// Values contains all occupancy values (0 or 1) + /** + * Find value for given assignment of values to variables + * return 1000 if any of the non-last cell is occupied and 1 otherwise + * Values contains all occupancy values (0 or 1) + */ virtual double operator()(const Values &vals) const{ - for(unsigned int i = 0; i < m_cells.size() - 1; i++){ + // loops through all but the last cell and checks that they are all 0. Otherwise return 1000. + for(Index i = 0; i < m_cells.size() - 1; i++){ if(vals.at(m_cells[i].first) == 1) return 1000; } + // check if the last cell hit by the laser is 1. return 1000 otherwise. if(vals.at(m_cells[m_cells.size() - 1].first) == 0) return 1000; return 1; - } /// Multiply in a DecisionTreeFactor and return the result as DecisionTreeFactor @@ -68,15 +73,23 @@ public: */ class OccupancyGrid : public DiscreteFactorGraph { private: - int m_width; //number of cells wide the grid is - int m_height; //number of cells tall the grid is - double m_res; //the resolution at which the grid is created + size_t m_width; //number of cells wide the grid is + size_t m_height; //number of cells tall the grid is + double m_res; //the resolution at which the grid is created DiscreteKeys m_cells; //list of keys of all cells in the grid - Values m_vals; //mapping from Index to value (0 or 1) + public: + class Occupancy : public Values { + private: + + public: + + }; + + typedef std::vector Marginals; ///constructor ///Creates a 2d grid of cells with the origin in the center of the grid OccupancyGrid(double width, double height, double resolution){ @@ -84,12 +97,16 @@ public: m_height = height/resolution; m_res = resolution; - for(int i = 0; i < cellCount(); i++){ + for(size_t i = 0; i < cellCount(); i++) m_cells.push_back(DiscreteKey(i,2)); - m_vals.insert(pair((Index)i,0)); - } - m_vals[0]; + } + Occupancy emptyOccupancy(){ + Occupancy occupancy; //mapping from Index to value (0 or 1) + for(size_t i = 0; i < cellCount(); i++) + occupancy.insert(pair((Index)i,0)); + + return occupancy; } ///add a prior @@ -127,7 +144,7 @@ public: cells.push_back(key); } - for(unsigned int i = 0; i < cells.size(); i++) + for(Index i = 0; i < cells.size(); i++) printf("%d,", (int)cells[i].first); //add a factor that connects all those cells @@ -136,7 +153,7 @@ public: } /// returns the number of cells in the grid - int cellCount() const { + size_t cellCount() const { return m_width*m_height; } @@ -156,48 +173,85 @@ public: y = m_height/2 - y; //bounds checking - int index = y*m_width + x; + size_t index = y*m_width + x; index = index >= m_width*m_height ? -1 : index; return m_cells[index]; } - /// access a cell in the grid via its index - size_t &operator[](Index index){ - return m_vals[index]; - } - const size_t operator[](Index index) const{ - return m_vals.at(index); - } + /// access a cell in the grid via its row and column - size_t &operator()(int row, int col){ + /*size_t &cell(int row, int col){ Index index = (Index)(row*m_width + col); return m_vals[index]; } - const size_t operator()(int row, int col) const{ + const size_t cell(int row, int col) const{ Index index = (Index)(row*m_width + col); return m_vals.at(index); - } + }*/ /// prints an ASCII grid to the console - void print() const { - Index index; - printf("\n"); - for(int i = 0; i < m_height; i++){ - for(int j = 0; j < m_width; j++){ - printf("%ld ", m_vals.at(index)); - index++; - } - printf("\n"); - } - } - double operator()(int index) const{ - return (*factors_[index + 1])(m_vals); +// void print() const { +// Index index; +// printf("\n"); +// for(size_t i = 0; i < m_height; i++){ +// for(size_t j = 0; j < m_width; j++){ +// printf("%ld ", m_vals.at(index)); +// index++; +// } +// printf("\n"); +// } +// } + + //FIX ME + //better name + double laserFactorValue(int index, const Occupancy &occupancy) const{ + return (*factors_[index + 1])(occupancy); } - void assignments()const { - m_vals.print(); + /** + * @brief Run a metropolis sampler. + * @param iterations defines the number of iterations to run. + * @return vector of marginal probabilities. + */ + Marginals runMetropolis(size_t iterations){ + Occupancy occupancy = emptyOccupancy(); + + size_t size = cellCount(); + Marginals marginals(size); + + boost::random::mt19937 rng; + boost::random::uniform_int_distribution six(0,size-1); + + // run Metropolis for the requested number of operations + // compute initial probability of occupancy grid, P(x_t) + double Px = (*this)(occupancy); + for(size_t it; it < iterations; it++){ + //choose a random cell + Index x = six(rng); + + //flip the state of a random cell, x + occupancy[x] = 1 - occupancy[x]; + + //compute probability of new occupancy grid, P(x') + // sum over all LaserFactor::operator() + double Px_prime = (*this)(occupancy); + + //calculate acceptance ratio, a + double a = Px_prime/Px; + + + //if a >= 1 otherwise accept with probability a + //if we accept the new state P(x_t) = P(x') + if(a >= 1){ + Px = Px_prime; + }else{ + occupancy[x] = 1 - occupancy[x]; + } + } + + return marginals; } }; @@ -221,19 +275,27 @@ TEST_UNSAFE( OccupancyGrid, Test1) { occupancyGrid.addLaser(pose, range); EXPECT_LONGS_EQUAL(2, occupancyGrid.size()); - EXPECT_LONGS_EQUAL(1000, occupancyGrid(0)); - occupancyGrid[16] = 1; - EXPECT_LONGS_EQUAL(1, occupancyGrid(0)); - occupancyGrid[15] = 1; - EXPECT_LONGS_EQUAL(1000, occupancyGrid(0)); + OccupancyGrid::Occupancy occupancy = occupancyGrid.emptyOccupancy(); + EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); - occupancyGrid[16] = 0; - EXPECT_LONGS_EQUAL(1000, occupancyGrid(0)); + + occupancy[16] = 1; + EXPECT_LONGS_EQUAL(1, occupancyGrid.laserFactorValue(0,occupancy)); + + occupancy[15] = 1; + EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); + + occupancy[16] = 0; + EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); //run MCMC + OccupancyGrid::Marginals occupancyMarginals = occupancyGrid.runMetropolis(5); + EXPECT_LONGS_EQUAL( (width*height)/pow(resolution,2), occupancyMarginals.size()); + //select a cell at a random to flip + } /* ************************************************************************* */ From 720ff3ac82b037304bf6fc8ab5ba846aa590ae1d Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 19 May 2012 02:21:21 +0000 Subject: [PATCH 009/914] Added a flag to optionally remove examples from "all" target --- CMakeLists.txt | 2 ++ examples/CMakeLists.txt | 6 ++++++ gtsam_unstable/discrete/CMakeLists.txt | 8 ++++++++ 3 files changed, 16 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6c9bc422..5d2acb464 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,7 @@ endif(GTSAM_USE_QUATERNIONS) # Alternative version to keep tests from building during make install # Use the EXCLUDE_FROM_ALL property on test executables option(GTSAM_ENABLE_INSTALL_TEST_FIX "Enable/Disable fix to remove dependency of tests on 'all' target" ON) +option(GTSAM_ENABLE_INSTALL_EXAMPLE_FIX "Enable/Disable fix to remove dependency of examples on 'all' target" OFF) # Pull in infrastructure if (GTSAM_BUILD_TESTS) @@ -162,6 +163,7 @@ if(GTSAM_UNSTABLE_AVAILABLE) print_config_flag(${GTSAM_BUILD_UNSTABLE} "Build libgtsam_unstable ") endif() print_config_flag(${GTSAM_ENABLE_INSTALL_TEST_FIX} "Tests excluded from all target ") +print_config_flag(${GTSAM_ENABLE_INSTALL_EXAMPLE_FIX} "Examples excluded from all target ") string(TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_toupper) message(STATUS " Build type : ${CMAKE_BUILD_TYPE}") message(STATUS " C compilation flags : ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${cmake_build_type_toupper}}") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 55f2db60b..116379489 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -8,6 +8,12 @@ foreach(example_src ${example_srcs} ) message(STATUS "Adding Example ${example_bin}") add_dependencies(examples ${example_bin}) add_executable(${example_bin} ${example_src}) + + # Disable building during make all/install + if (GTSAM_ENABLE_INSTALL_EXAMPLE_FIX) + set_target_properties(${example_bin} PROPERTIES EXCLUDE_FROM_ALL ON) + endif() + target_link_libraries(${example_bin} gtsam-static) add_custom_target(${example_bin}.run ${EXECUTABLE_OUTPUT_PATH}${example_bin} ${ARGN}) endforeach(example_src) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index 56f62b1bf..f3c481ad4 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -25,6 +25,14 @@ gtsam_add_subdir_tests(discrete_unstable "${discrete_local_libs}" "${discrete_fu # add examples foreach(example schedulingExample schedulingQuals12) add_executable(${example} "examples/${example}.cpp") + + # Disable building during make all/install + if (GTSAM_ENABLE_INSTALL_EXAMPLE_FIX) + set_target_properties(${example} PROPERTIES EXCLUDE_FROM_ALL ON) + endif() + + add_dependencies(examples ${example}) + add_dependencies(${example} gtsam-static gtsam_unstable-static) target_link_libraries(${example} gtsam-static gtsam_unstable-static) add_custom_target(${example}.run ${EXECUTABLE_OUTPUT_PATH}${example} ${ARGN}) From 272734fab7ecd4fa345934ad2165ea42c1a79c1a Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 20 May 2012 16:53:07 +0000 Subject: [PATCH 010/914] Information about XCode version 4.3 --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 8ec8a99f8..45698af8e 100644 --- a/README +++ b/README @@ -53,6 +53,7 @@ Important Installation Notes GTSAM requires the following libraries to be installed on your system: - BOOST version 1.40 or greater (install through Linux repositories or MacPorts) - Cmake version 2.6 or higher + - Support for XCode 4.3 command line tools on Mac requires CMake 2.8.8 or higher Tested compilers - GCC 4.2-4.7 From fd80a9da904f036a5bddf164398813e61d80ce53 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 20 May 2012 17:31:55 +0000 Subject: [PATCH 011/914] const correctness, moved optimizer to cpp --- gtsam/slam/planarSLAM.cpp | 7 ++++++- gtsam/slam/planarSLAM.h | 5 +---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/gtsam/slam/planarSLAM.cpp b/gtsam/slam/planarSLAM.cpp index b5f7b18ef..b490a76cb 100644 --- a/gtsam/slam/planarSLAM.cpp +++ b/gtsam/slam/planarSLAM.cpp @@ -16,7 +16,7 @@ **/ #include -#include +#include // Use planarSLAM namespace for specific SLAM instance namespace planarSLAM { @@ -63,6 +63,11 @@ namespace planarSLAM { } /* ************************************************************************* */ + Values Graph::optimize(const Values& initialEstimate) const { + return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); + } + + /* ************************************************************************* */ } // planarSLAM diff --git a/gtsam/slam/planarSLAM.h b/gtsam/slam/planarSLAM.h index 07e6896e5..818879f26 100644 --- a/gtsam/slam/planarSLAM.h +++ b/gtsam/slam/planarSLAM.h @@ -24,7 +24,6 @@ #include #include #include -#include #include // Use planarSLAM namespace for specific SLAM instance @@ -108,9 +107,7 @@ namespace planarSLAM { void addBearingRange(Index poseKey, Index pointKey, const Rot2& bearing, double range, const SharedNoiseModel& model); /// Optimize - Values optimize(const Values& initialEstimate) { - return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); - } + Values optimize(const Values& initialEstimate) const; }; } // planarSLAM From 8af4581139e968c70b05b746e1c4164b5689857d Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 20 May 2012 17:38:46 +0000 Subject: [PATCH 012/914] Making GTSAM_BUILD_EXAMPLES flag affect unstable examples --- gtsam_unstable/discrete/CMakeLists.txt | 31 +++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index f3c481ad4..8c94b0e46 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -23,18 +23,19 @@ set (discrete_excluded_tests "") gtsam_add_subdir_tests(discrete_unstable "${discrete_local_libs}" "${discrete_full_libs}" "${discrete_excluded_tests}") # add examples -foreach(example schedulingExample schedulingQuals12) - add_executable(${example} "examples/${example}.cpp") - - # Disable building during make all/install - if (GTSAM_ENABLE_INSTALL_EXAMPLE_FIX) - set_target_properties(${example} PROPERTIES EXCLUDE_FROM_ALL ON) - endif() - - add_dependencies(examples ${example}) - - add_dependencies(${example} gtsam-static gtsam_unstable-static) - target_link_libraries(${example} gtsam-static gtsam_unstable-static) - add_custom_target(${example}.run ${EXECUTABLE_OUTPUT_PATH}${example} ${ARGN}) -endforeach(example) - +if (GTSAM_BUILD_EXAMPLES) + foreach(example schedulingExample schedulingQuals12) + add_executable(${example} "examples/${example}.cpp") + + # Disable building during make all/install + if (GTSAM_ENABLE_INSTALL_EXAMPLE_FIX) + set_target_properties(${example} PROPERTIES EXCLUDE_FROM_ALL ON) + endif() + + add_dependencies(examples ${example}) + + add_dependencies(${example} gtsam-static gtsam_unstable-static) + target_link_libraries(${example} gtsam-static gtsam_unstable-static) + add_custom_target(${example}.run ${EXECUTABLE_OUTPUT_PATH}${example} ${ARGN}) + endforeach(example) +endif (GTSAM_BUILD_EXAMPLES) From edb9c17962d7e66908e904dd674b50b5f9bd19de Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 20 May 2012 20:31:33 +0000 Subject: [PATCH 013/914] Cleaned up planar SLAM example and created new Localization example --- examples/LocalizationExample.cpp | 63 +++++++++++++++++++++++++ examples/PlanarSLAMExample_easy.cpp | 71 +++++++++++++---------------- 2 files changed, 95 insertions(+), 39 deletions(-) create mode 100644 examples/LocalizationExample.cpp diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp new file mode 100644 index 000000000..fdf522f73 --- /dev/null +++ b/examples/LocalizationExample.cpp @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------------- + + * 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 LocalizationExample.cpp + * @brief Simple robot localization example + * @author Frank Dellaert + */ + +// pull in the 2D PoseSLAM domain with all typedefs and helper functions defined +#include + +using namespace std; +using namespace gtsam; + +/** + * Example of a simple 2D localization example + * - Robot poses are facing along the X axis (horizontal, to the right in 2D) + * - The robot moves 2 meters each step + * - We have full odometry between poses + */ +int main(int argc, char** argv) { + + // create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) + pose2SLAM::Graph graph; + + // add a Gaussian prior on pose x_1 + Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin + SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta + graph.addPrior(1, priorMean, priorNoise); // add directly to graph + + // add two odometry factors + Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) + SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + graph.addOdometry(1, 2, odometry, odometryNoise); + graph.addOdometry(2, 3, odometry, odometryNoise); + + // print + graph.print("\nFactor graph:\n"); + + // create (deliberatly inaccurate) initial estimate + pose2SLAM::Values initialEstimate; + initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); + initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); + + initialEstimate.print("\nInitial estimate:\n "); + + // optimize using Levenberg-Marquardt optimization with an ordering from colamd + pose2SLAM::Values result = graph.optimize(initialEstimate); + result.print("\nFinal result:\n "); + + return 0; +} + diff --git a/examples/PlanarSLAMExample_easy.cpp b/examples/PlanarSLAMExample_easy.cpp index 912589080..5039b1145 100644 --- a/examples/PlanarSLAMExample_easy.cpp +++ b/examples/PlanarSLAMExample_easy.cpp @@ -15,64 +15,57 @@ * @author Alex Cunningham */ -#include -#include - // pull in the planar SLAM domain with all typedefs and helper functions defined #include -#include using namespace std; using namespace gtsam; -using namespace planarSLAM; /** - * In this version of the system we make the following assumptions: - * - All values are axis aligned - * - Robot poses are facing along the X axis (horizontal, to the right in images) + * Example of a simple 2D planar slam example with landmarls + * - The robot and landmarks are on a 2 meter grid + * - Robot poses are facing along the X axis (horizontal, to the right in 2D) + * - The robot moves 2 meters each step + * - We have full odometry between poses * - We have bearing and range information for measurements - * - We have full odometry for measurements - * - The robot and landmarks are on a grid, moving 2 meters each step * - Landmarks are 2 meters away from the robot trajectory */ int main(int argc, char** argv) { - // create graph container and add factors to it - Graph graph; + // create the graph (defined in planarSlam.h, derived from NonlinearFactorGraph) + planarSLAM::Graph graph; - /* add prior */ - // gaussian for prior - SharedDiagonal prior_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - Pose2 prior_measurement(0.0, 0.0, 0.0); // prior at origin - graph.addPrior(1, prior_measurement, prior_model); // add directly to graph + // add a Gaussian prior on pose x_1 + Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin + SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta + graph.addPrior(1, priorMean, priorNoise); // add directly to graph - /* add odometry */ - // general noisemodel for odometry - SharedDiagonal odom_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - Pose2 odom_measurement(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - graph.addOdometry(1, 2, odom_measurement, odom_model); - graph.addOdometry(2, 3, odom_measurement, odom_model); + // add two odometry factors + Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) + SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + graph.addOdometry(1, 2, odometry, odometryNoise); + graph.addOdometry(2, 3, odometry, odometryNoise); - /* add measurements */ - // general noisemodel for measurements - SharedDiagonal meas_model = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); + // create a noise model for the landmark measurements + SharedDiagonal measurementNoise(Vector_(2, 0.1, 0.2)); // 0.1 rad std on bearing, 20cm on range // create the measurement values - indices are (pose id, landmark id) Rot2 bearing11 = Rot2::fromDegrees(45), - bearing21 = Rot2::fromDegrees(90), - bearing32 = Rot2::fromDegrees(90); + bearing21 = Rot2::fromDegrees(90), + bearing32 = Rot2::fromDegrees(90); double range11 = sqrt(4+4), - range21 = 2.0, - range32 = 2.0; + range21 = 2.0, + range32 = 2.0; - // create bearing/range factors and add them - graph.addBearingRange(1, 1, bearing11, range11, meas_model); - graph.addBearingRange(2, 1, bearing21, range21, meas_model); - graph.addBearingRange(3, 2, bearing32, range32, meas_model); + // add bearing/range factors (created by "addBearingRange") + graph.addBearingRange(1, 1, bearing11, range11, measurementNoise); + graph.addBearingRange(2, 1, bearing21, range21, measurementNoise); + graph.addBearingRange(3, 2, bearing32, range32, measurementNoise); - graph.print("full graph"); + // print + graph.print("Factor graph"); - // initialize to noisy points + // create (deliberatly inaccurate) initial estimate planarSLAM::Values initialEstimate; initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); @@ -80,11 +73,11 @@ int main(int argc, char** argv) { initialEstimate.insertPoint(1, Point2(1.8, 2.1)); initialEstimate.insertPoint(2, Point2(4.1, 1.8)); - initialEstimate.print("initial estimate"); + initialEstimate.print("Initial estimate:\n "); // optimize using Levenberg-Marquardt optimization with an ordering from colamd - planarSLAM::Values result = LevenbergMarquardtOptimizer(graph, initialEstimate).optimize(); - result.print("final result"); + planarSLAM::Values result = graph.optimize(initialEstimate); + result.print("Final result:\n "); return 0; } From 33de8d6c0026d6df7cc6690dddbc440e27f68bc6 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 20 May 2012 20:31:56 +0000 Subject: [PATCH 014/914] Print with less precision --- gtsam/geometry/Pose2.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gtsam/geometry/Pose2.cpp b/gtsam/geometry/Pose2.cpp index a15929c67..e39dbc803 100644 --- a/gtsam/geometry/Pose2.cpp +++ b/gtsam/geometry/Pose2.cpp @@ -20,6 +20,8 @@ #include #include #include +#include +#include using namespace std; @@ -44,7 +46,7 @@ Matrix Pose2::matrix() const { /* ************************************************************************* */ void Pose2::print(const string& s) const { - cout << s << "(" << t_.x() << ", " << t_.y() << ", " << r_.theta() << ")" << endl; + cout << s << setprecision(2) << "(" << t_.x() << ", " << t_.y() << ", " << r_.theta() << ")" << endl; } /* ************************************************************************* */ From 00c56b0d0aa712edd3f795a5ca8f04e8e2beb231 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 20 May 2012 20:32:16 +0000 Subject: [PATCH 015/914] Fixed small formatting glitches --- gtsam/nonlinear/Values.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/Values.cpp b/gtsam/nonlinear/Values.cpp index c3d3bd8df..a6804c1a6 100644 --- a/gtsam/nonlinear/Values.cpp +++ b/gtsam/nonlinear/Values.cpp @@ -41,7 +41,7 @@ namespace gtsam { /* ************************************************************************* */ void Values::print(const string& str, const KeyFormatter& keyFormatter) const { - cout << str << "Values with " << size() << " values:\n" << endl; + cout << str << "Values with " << size() << " values:" << endl; for(const_iterator key_value = begin(); key_value != end(); ++key_value) { cout << " " << keyFormatter(key_value->key) << ": "; key_value->value.print(""); From 7a28e6d5cb5b3c523f2d5f0e70dbe76e280085fb Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 20 May 2012 22:02:11 +0000 Subject: [PATCH 016/914] marginals --- examples/LocalizationExample.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index fdf522f73..6b9a48339 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -18,6 +18,13 @@ // pull in the 2D PoseSLAM domain with all typedefs and helper functions defined #include +// include this for marginals +#include +#include + +#include +#include + using namespace std; using namespace gtsam; @@ -58,6 +65,14 @@ int main(int argc, char** argv) { pose2SLAM::Values result = graph.optimize(initialEstimate); result.print("\nFinal result:\n "); + // use an explicit Optimizer object so we can query the marginals + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); + Marginals marginals(graph, result); + cout.precision(2); + cout << "\nP1:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(1)) << endl; + cout << "\nP2:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(2)) << endl; + cout << "\nP3:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(3)) << endl; + return 0; } From 861d1d7dbd123fe6ae833952624303625b7ebd23 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 21 May 2012 05:17:35 +0000 Subject: [PATCH 017/914] Fixed small formatting glitches --- gtsam/linear/NoiseModel.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index b6472061f..073097ee2 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -226,7 +226,7 @@ Diagonal::shared_ptr Diagonal::Sigmas(const Vector& sigmas, bool smart) { /* ************************************************************************* */ void Diagonal::print(const string& name) const { - gtsam::print(sigmas_, name + ": diagonal sigmas"); + gtsam::print(sigmas_, name + "diagonal sigmas"); } /* ************************************************************************* */ @@ -290,8 +290,8 @@ Constrained::shared_ptr Constrained::MixedSigmas(const Vector& mu, const Vector& /* ************************************************************************* */ void Constrained::print(const std::string& name) const { - gtsam::print(sigmas_, name + ": constrained sigmas"); - gtsam::print(mu_, name + ": constrained mu"); + gtsam::print(sigmas_, name + "constrained sigmas"); + gtsam::print(mu_, name + "constrained mu"); } /* ************************************************************************* */ @@ -436,7 +436,7 @@ Isotropic::shared_ptr Isotropic::Variance(size_t dim, double variance, bool smar /* ************************************************************************* */ void Isotropic::print(const string& name) const { - cout << name << ": isotropic sigma " << " " << sigma_ << endl; + cout << name << "isotropic sigma " << " " << sigma_ << endl; } /* ************************************************************************* */ @@ -480,7 +480,7 @@ Vector Isotropic::sample() const { // Unit /* ************************************************************************* */ void Unit::print(const std::string& name) const { - cout << name << ": unit (" << dim_ << ") " << endl; + cout << name << "unit (" << dim_ << ") " << endl; } /* ************************************************************************* */ @@ -583,7 +583,7 @@ void Base::reweight(Matrix &A1, Matrix &A2, Matrix &A3, Vector &error) const { /* ************************************************************************* */ void Null::print(const std::string &s="") const -{ cout << s << ": null ()" << endl; } +{ cout << s << "null ()" << endl; } Null::shared_ptr Null::Create() { return shared_ptr(new Null()); } @@ -604,7 +604,7 @@ double Fair::weight(const double &error) const { return 1.0 / (1.0 + fabs(error)/c_); } void Fair::print(const std::string &s="") const -{ cout << s << ": fair (" << c_ << ")" << endl; } +{ cout << s << "fair (" << c_ << ")" << endl; } bool Fair::equals(const Base &expected, const double tol) const { const Fair* p = dynamic_cast (&expected); @@ -632,7 +632,7 @@ double Huber::weight(const double &error) const { } void Huber::print(const std::string &s="") const { - cout << s << ": huber (" << k_ << ")" << endl; + cout << s << "huber (" << k_ << ")" << endl; } bool Huber::equals(const Base &expected, const double tol) const { From 5a397f0c2520affc83a3bb3d4c34bb8311896940 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 21 May 2012 05:18:06 +0000 Subject: [PATCH 018/914] Second localization example, with GPS-like factors --- examples/LocalizationExample2.cpp | 99 +++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 examples/LocalizationExample2.cpp diff --git a/examples/LocalizationExample2.cpp b/examples/LocalizationExample2.cpp new file mode 100644 index 000000000..419975537 --- /dev/null +++ b/examples/LocalizationExample2.cpp @@ -0,0 +1,99 @@ +/* ---------------------------------------------------------------------------- + + * 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 LocalizationExample.cpp + * @brief Simple robot localization example + * @author Frank Dellaert + */ + +// pull in the 2D PoseSLAM domain with all typedefs and helper functions defined +#include + +// include this for marginals +#include +#include + +#include +#include + +using namespace std; +using namespace gtsam; + +/** + * UnaryFactor + * Example on how to create a GPS-like factor on position alone. + */ +class UnaryFactor: public NoiseModelFactor1 { + double mx_, my_; ///< X and Y measurements + +public: + UnaryFactor(Key j, double x, double y, const SharedNoiseModel& model): + NoiseModelFactor1(model, j), mx_(x), my_(y) {} + + Vector evaluateError(const Pose2& q, + boost::optional H = boost::none) const + { + if (H) (*H) = Matrix_(2,3, 1.0,0.0,0.0, 0.0,1.0,0.0); + return Vector_(2, q.x() - mx_, q.y() - my_); + } +}; + +/** + * Example of a more complex 2D localization example + * - Robot poses are facing along the X axis (horizontal, to the right in 2D) + * - The robot moves 2 meters each step + * - We have full odometry between poses + * - We have unary measurement factors at eacht time step + */ +int main(int argc, char** argv) { + + // create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) + pose2SLAM::Graph graph; + + // add two odometry factors + Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) + SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + graph.addOdometry(1, 2, odometry, odometryNoise); + graph.addOdometry(2, 3, odometry, odometryNoise); + + // add unary measurement factors, like GPS, on all three poses + SharedDiagonal noiseModel(Vector_(2, 0.1, 0.1)); // 10cm std on x,y + Symbol x1('x',1), x2('x',2), x3('x',3); + graph.push_back(boost::make_shared(x1, 0, 0, noiseModel)); + graph.push_back(boost::make_shared(x2, 2, 0, noiseModel)); + graph.push_back(boost::make_shared(x3, 4, 0, noiseModel)); + + // print + graph.print("\nFactor graph:\n"); + + // create (deliberatly inaccurate) initial estimate + pose2SLAM::Values initialEstimate; + initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); + initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); + + initialEstimate.print("\nInitial estimate:\n "); + + // use an explicit Optimizer object, used for both optimization and marginal inference + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); + pose2SLAM::Values result = optimizer.optimize(); + result.print("\nFinal result:\n "); + Values resultMultifrontal = optimizer.optimize(); + Marginals marginals(graph, result); + cout.precision(2); + cout << "\nP1:\n" << marginals.marginalCovariance(x1) << endl; + cout << "\nP2:\n" << marginals.marginalCovariance(x2) << endl; + cout << "\nP3:\n" << marginals.marginalCovariance(x3) << endl; + + return 0; +} + From 8938c659b66604d09c2bf2dce831e41ce8d86ff3 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 21 May 2012 17:57:50 +0000 Subject: [PATCH 019/914] removed broken definitions --- gtsam.h | 155 -------------------------------------------------------- 1 file changed, 155 deletions(-) diff --git a/gtsam.h b/gtsam.h index 18c8921cb..3fed4da7f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -535,158 +535,3 @@ class Graph { // TODO: add factors, etc. }///\namespace simulated2DOriented - - -//// These are considered to be broken and will be added back as they start working -//// It's assumed that there have been interface changes that might break this -// -//class Ordering{ -// Ordering(string key); -// void print(string s) const; -// bool equals(const Ordering& ord, double tol) const; -// Ordering subtract(const Ordering& keys) const; -// void unique (); -// void reverse (); -// void push_back(string s); -//}; -// -//class GaussianFactorSet { -// GaussianFactorSet(); -// void push_back(GaussianFactor* factor); -//}; -// -//class Simulated2DPosePrior { -// Simulated2DPosePrior(Point2& mu, const SharedDiagonal& model, int i); -// void print(string s) const; -// double error(const Simulated2DValues& c) const; -//}; -// -//class Simulated2DOrientedPosePrior { -// Simulated2DOrientedPosePrior(Pose2& mu, const SharedDiagonal& model, int i); -// void print(string s) const; -// double error(const Simulated2DOrientedValues& c) const; -//}; -// -//class Simulated2DPointPrior { -// Simulated2DPointPrior(Point2& mu, const SharedDiagonal& model, int i); -// void print(string s) const; -// double error(const Simulated2DValues& c) const; -//}; -// -//class Simulated2DOdometry { -// Simulated2DOdometry(Point2& mu, const SharedDiagonal& model, int i1, int i2); -// void print(string s) const; -// double error(const Simulated2DValues& c) const; -//}; -// -//class Simulated2DOrientedOdometry { -// Simulated2DOrientedOdometry(Pose2& mu, const SharedDiagonal& model, int i1, int i2); -// void print(string s) const; -// double error(const Simulated2DOrientedValues& c) const; -//}; -// -//class Simulated2DMeasurement { -// Simulated2DMeasurement(Point2& mu, const SharedDiagonal& model, int i, int j); -// void print(string s) const; -// double error(const Simulated2DValues& c) const; -//}; -// -//class GaussianFactor { -// GaussianFactor(string key1, -// Matrix A1, -// Vector b_in, -// const SharedDiagonal& model); -// GaussianFactor(string key1, -// Matrix A1, -// string key2, -// Matrix A2, -// Vector b_in, -// const SharedDiagonal& model); -// GaussianFactor(string key1, -// Matrix A1, -// string key2, -// Matrix A2, -// string key3, -// Matrix A3, -// Vector b_in, -// const SharedDiagonal& model); -// bool involves(string key) const; -// Matrix getA(string key) const; -// pair matrix(const Ordering& ordering) const; -// pair eliminate(string key) const; -//}; -// -//class GaussianFactorGraph { -// GaussianConditional* eliminateOne(string key); -// GaussianBayesNet* eliminate_(const Ordering& ordering); -// VectorValues* optimize_(const Ordering& ordering); -// pair matrix(const Ordering& ordering) const; -// VectorValues* steepestDescent_(const VectorValues& x0) const; -// VectorValues* conjugateGradientDescent_(const VectorValues& x0) const; -//}; -// -//class gtsam::Pose2Values{ -// Pose2Values(); -// Pose2 get(string key) const; -// void insert(string name, const gtsam::Pose2& val); -// void print(string s) const; -// void clear(); -// int size(); -//}; -// -//class gtsam::Pose2Factor { -// Pose2Factor(string key1, string key2, -// const gtsam::Pose2& measured, Matrix measurement_covariance); -// void print(string name) const; -// double error(const gtsam::Pose2Values& c) const; -// size_t size() const; -// GaussianFactor* linearize(const gtsam::Pose2Values& config) const; -//}; -// -//class gtsam::pose2SLAM::Graph{ -// pose2SLAM::Graph(); -// void print(string s) const; -// GaussianFactorGraph* linearize_(const gtsam::Pose2Values& config) const; -// void push_back(Pose2Factor* factor); -//}; -// -//class SymbolicFactor{ -// SymbolicFactor(const Ordering& keys); -// void print(string s) const; -//}; -// -//class Simulated2DPosePrior { -// GaussianFactor* linearize(const Simulated2DValues& config) const; -//}; -// -//class Simulated2DOrientedPosePrior { -// GaussianFactor* linearize(const Simulated2DOrientedValues& config) const; -//}; -// -//class Simulated2DPointPrior { -// GaussianFactor* linearize(const Simulated2DValues& config) const; -//}; -// -//class Simulated2DOdometry { -// GaussianFactor* linearize(const Simulated2DValues& config) const; -//}; -// -//class Simulated2DOrientedOdometry { -// GaussianFactor* linearize(const Simulated2DOrientedValues& config) const; -//}; -// -//class Simulated2DMeasurement { -// GaussianFactor* linearize(const Simulated2DValues& config) const; -//}; -// -//class gtsam::Pose2SLAMOptimizer { -// Pose2SLAMOptimizer(string dataset_name); -// void print(string s) const; -// void update(Vector x) const; -// Vector optimize() const; -// double error() const; -// Matrix a1() const; -// Matrix a2() const; -// Vector b1() const; -// Vector b2() const; -//}; From d4a70b66d96fd415a2676444481892503d8d2f9e Mon Sep 17 00:00:00 2001 From: bpeasle Date: Mon, 21 May 2012 19:06:26 +0000 Subject: [PATCH 020/914] Added code to run MCMC with real data. --- tests/testOccupancyGrid.cpp | 260 +++++++++++++++++++++++------------- 1 file changed, 165 insertions(+), 95 deletions(-) diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp index 2289e444b..542c144f4 100644 --- a/tests/testOccupancyGrid.cpp +++ b/tests/testOccupancyGrid.cpp @@ -12,12 +12,14 @@ #include #include +#include #include #include using namespace std; using namespace gtsam; + /** * Laser Factor * @brief factor that encodes a laser measurements likelihood. @@ -25,14 +27,12 @@ using namespace gtsam; class LaserFactor : public DiscreteFactor{ private: - //FIX ME - //m_cells changed to vector - DiscreteKeys m_cells; ///cells in which laser passes through + vector m_cells; ///cells in which laser passes through public: ///constructor - LaserFactor(const DiscreteKeys &cells) : m_cells(cells) {} + LaserFactor(const vector &cells) : m_cells(cells) {} /** * Find value for given assignment of values to variables @@ -43,13 +43,13 @@ public: // loops through all but the last cell and checks that they are all 0. Otherwise return 1000. for(Index i = 0; i < m_cells.size() - 1; i++){ - if(vals.at(m_cells[i].first) == 1) + if(vals.at(m_cells[i]) == 1) return 1000; } - // check if the last cell hit by the laser is 1. return 1000 otherwise. - if(vals.at(m_cells[m_cells.size() - 1].first) == 0) - return 1000; + // check if the last cell hit by the laser is 1. return 900 otherwise. + if(vals.at(m_cells[m_cells.size() - 1]) == 0) + return 900; return 1; @@ -73,34 +73,42 @@ public: */ class OccupancyGrid : public DiscreteFactorGraph { private: - size_t m_width; //number of cells wide the grid is - size_t m_height; //number of cells tall the grid is - double m_res; //the resolution at which the grid is created + size_t width_; //number of cells wide the grid is + size_t height_; //number of cells tall the grid is + double res_; //the resolution at which the grid is created - DiscreteKeys m_cells; //list of keys of all cells in the grid + vector cells_; //list of keys of all cells in the grid + vector laser_indices_; //indices of the laser factor in factors_ public: + size_t width() const { + return width_; + } + size_t height() const { + return height_; + } + // should we just not typedef Values Occupancy; ? class Occupancy : public Values { private: - public: - }; + typedef std::vector Marginals; ///constructor ///Creates a 2d grid of cells with the origin in the center of the grid OccupancyGrid(double width, double height, double resolution){ - m_width = width/resolution; - m_height = height/resolution; - m_res = resolution; + width_ = width/resolution; + height_ = height/resolution; + res_ = resolution; - for(size_t i = 0; i < cellCount(); i++) - m_cells.push_back(DiscreteKey(i,2)); + for(Index i = 0; i < cellCount(); i++) + cells_.push_back(i); } + /// Returns an empty occupancy grid of size width_ x height_ Occupancy emptyOccupancy(){ Occupancy occupancy; //mapping from Index to value (0 or 1) for(size_t i = 0; i < cellCount(); i++) @@ -123,12 +131,13 @@ public: ///add a laser measurement void addLaser(const Pose2 &pose, double range){ - //ray trace from pose to range to find all cells the laser passes through + //ray trace from pose to range t//a >= 1 accept new stateo find all cells the laser passes through double x = pose.x(); //start position of the laser double y = pose.y(); - double step = m_res/8.0; //amount to step in each iteration of laser traversal - DiscreteKey key; - DiscreteKeys cells; //list of keys of cells hit by the laser + double step = res_/8.0; //amount to step in each iteration of laser traversal + + Index key; + vector cells; //list of keys of cells hit by the laser //traverse laser for(double i = 0; i < range; i += step){ @@ -136,6 +145,7 @@ public: x = pose.x() + i*cos(pose.theta()); y = pose.y() + i*sin(pose.theta()); + //printf("%lf %lf\n", x, y); //get the key of the cell that holds point (x,y) key = keyLookup(x,y); @@ -144,70 +154,64 @@ public: cells.push_back(key); } - for(Index i = 0; i < cells.size(); i++) - printf("%d,", (int)cells[i].first); +// for(size_t i = 0; i < cells.size(); i++) +// printf("%ld ", cells[i]); +// printf("\n"); //add a factor that connects all those cells + laser_indices_.push_back(factors_.size()); push_back(boost::make_shared(cells)); } /// returns the number of cells in the grid size_t cellCount() const { - return m_width*m_height; + return width_*height_; } /// returns the key of the cell in which point (x,y) lies. - DiscreteKey keyLookup(double x, double y) const { + Index keyLookup(double x, double y) const { //move (x,y) to the nearest resolution - x *= (1.0/m_res); - y *= (1.0/m_res); + x *= (1.0/res_); + y *= (1.0/res_); //round to nearest integer x = (double)((int)x); y = (double)((int)y); - //determine index - x += m_width/2; - y = m_height/2 - y; + x += width_/2; + y = height_/2 - y; //bounds checking - size_t index = y*m_width + x; - index = index >= m_width*m_height ? -1 : index; + size_t index = y*width_ + x; + index = index >= width_*height_ ? -1 : index; - return m_cells[index]; + return cells_[index]; } - - - /// access a cell in the grid via its row and column - /*size_t &cell(int row, int col){ - Index index = (Index)(row*m_width + col); - return m_vals[index]; + /** + * @brief Computes the value of a laser factor + * @param index defines which laser is to be used + * @param occupancy defines the grid which the laser will be evaulated with + * @ret a double value that is the value of the specified laser factor for the grid + */ + double laserFactorValue(Index index, const Occupancy &occupancy) const{ + return (*factors_[ laser_indices_[index] ])(occupancy); } - const size_t cell(int row, int col) const{ - Index index = (Index)(row*m_width + col); - return m_vals.at(index); - }*/ - /// prints an ASCII grid to the console -// void print() const { -// Index index; -// printf("\n"); -// for(size_t i = 0; i < m_height; i++){ -// for(size_t j = 0; j < m_width; j++){ -// printf("%ld ", m_vals.at(index)); -// index++; -// } -// printf("\n"); -// } -// } + /// returns the sum of the laser factors for the current state of the grid + double operator()(const Occupancy &occupancy) const { + double value = 0; - //FIX ME - //better name - double laserFactorValue(int index, const Occupancy &occupancy) const{ - return (*factors_[index + 1])(occupancy); + // loop over all laser factors in the graph + //printf("%ld\n", (*this).size()); + + for(Index i = 0; i < laser_indices_.size(); i++){ + value += laserFactorValue(i, occupancy); + } + + return value; } /** @@ -222,35 +226,55 @@ public: Marginals marginals(size); boost::random::mt19937 rng; - boost::random::uniform_int_distribution six(0,size-1); + boost::random::uniform_int_distribution random_cell(0,size-1); + // run Metropolis for the requested number of operations // compute initial probability of occupancy grid, P(x_t) - double Px = (*this)(occupancy); - for(size_t it; it < iterations; it++){ - //choose a random cell - Index x = six(rng); + double Px = (*this)(occupancy); + + for(size_t it = 0; it < marginals.size(); it++) + marginals[it] = 0; + + for(size_t it = 0; it < iterations; it++){ + //choose a random cell + Index x = random_cell(rng); + //printf("%ld:",x); //flip the state of a random cell, x occupancy[x] = 1 - occupancy[x]; - //compute probability of new occupancy grid, P(x') - // sum over all LaserFactor::operator() - double Px_prime = (*this)(occupancy); + //compute probability of new occupancy grid, P(x') + //by summing over all LaserFactor::operator() + double Px_prime = (*this)(occupancy); + //occupancy.print(); //calculate acceptance ratio, a double a = Px_prime/Px; - - //if a >= 1 otherwise accept with probability a + //if a <= 1 otherwise accept with probability a //if we accept the new state P(x_t) = P(x') - if(a >= 1){ + // printf(" %.3lf %.3lf\t", Px, Px_prime); + if(a <= 1){ Px = Px_prime; - }else{ + //printf("\taccept\n"); + } + else{ occupancy[x] = 1 - occupancy[x]; + // printf("\treject\n"); + } + + //increment the number of iterations each cell has been on + for(size_t i = 0; i < size; i++){ + if(occupancy[i] == 1) + marginals[i]++; } } + //compute the marginals + for(size_t it = 0; it < size; it++) + marginals[it] /= iterations; + return marginals; } @@ -261,41 +285,87 @@ TEST_UNSAFE( OccupancyGrid, Test1) { //Build a small grid and test optimization //Build small grid - double width = 3; //meters - double height = 2; //meters - double resolution = 0.5; //meters + double width = 20; //meters + double height = 20; //meters + double resolution = 0.2; //meters OccupancyGrid occupancyGrid(width, height, resolution); //default center to middle //Add measurements - Pose2 pose(0,0,0); - double range = 1.0; +// Pose2 pose(0,0,0); +// double range = 4.499765; +// +// occupancyGrid.addPrior(0, 0.7); +// EXPECT_LONGS_EQUAL(1, occupancyGrid.size()); +// +// occupancyGrid.addLaser(pose, range); +// EXPECT_LONGS_EQUAL(2, occupancyGrid.size()); - occupancyGrid.addPrior(0, 0.7); - EXPECT_LONGS_EQUAL(1, occupancyGrid.size()); - - occupancyGrid.addLaser(pose, range); - EXPECT_LONGS_EQUAL(2, occupancyGrid.size()); + //add lasers + int n_frames = 1; + int n_lasers_per_frame = 640; + char laser_list_file[1000]; - OccupancyGrid::Occupancy occupancy = occupancyGrid.emptyOccupancy(); - EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); + for(int i = 0; i < n_frames; i++){ + sprintf(laser_list_file, "/home/brian/Desktop/research/user/bpeasle/code/KinectInterface/Data/ScanLinesAsLasers/KinectRecording9/laser_list%.4d", i); + FILE *fptr = fopen(laser_list_file,"r"); + double x,y, theta; + double range, angle; + fscanf(fptr, "%lf %lf %lf", &x, &y, &theta); + + for(int j = 0; j < n_lasers_per_frame; j++){ + fscanf(fptr, "%lf %lf", &range, &angle); + //if(j == 159){ + Pose2 pose(x,y, theta+angle); + + occupancyGrid.addLaser(pose, range); + //} + } + fclose(fptr); + + } - occupancy[16] = 1; - EXPECT_LONGS_EQUAL(1, occupancyGrid.laserFactorValue(0,occupancy)); - - occupancy[15] = 1; - EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); - - occupancy[16] = 0; - EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); +// OccupancyGrid::Occupancy occupancy = occupancyGrid.emptyOccupancy(); +// EXPECT_LONGS_EQUAL(900, occupancyGrid.laserFactorValue(0,occupancy)); +// +// +// occupancy[16] = 1; +// EXPECT_LONGS_EQUAL(1, occupancyGrid.laserFactorValue(0,occupancy)); +// +// occupancy[15] = 1; +// EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); +// +// occupancy[16] = 0; +// EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); //run MCMC - OccupancyGrid::Marginals occupancyMarginals = occupancyGrid.runMetropolis(5); - EXPECT_LONGS_EQUAL( (width*height)/pow(resolution,2), occupancyMarginals.size()); + OccupancyGrid::Marginals occupancyMarginals = occupancyGrid.runMetropolis(50000); + //EXPECT_LONGS_EQUAL( (width*height)/pow(resolution,2), occupancyMarginals.size()); //select a cell at a random to flip + + printf("\n"); + for(size_t i = 0, it = 0; i < occupancyGrid.height(); i++){ + for(size_t j = 0; j < occupancyGrid.width(); j++, it++){ + printf("%.2lf ", occupancyMarginals[it]); + } + printf("\n"); + } + + char marginalsOutput[1000]; + sprintf(marginalsOutput, "/home/brian/Desktop/research/user/bpeasle/code/KinectInterface/marginals.txt"); + FILE *fptr = fopen(marginalsOutput, "w"); + fprintf(fptr, "%d %d\n", occupancyGrid.width(), occupancyGrid.height()); + + for(int i = 0; i < occupancyMarginals.size(); i++){ + fprintf(fptr, "%lf ", occupancyMarginals[i]); + } + fclose(fptr); + + + } /* ************************************************************************* */ From 9dfc7656965ec276c37543047d194fad47d8334d Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 21 May 2012 19:44:24 +0000 Subject: [PATCH 021/914] Disabling broken tests in gtsam_unstable/discrete by excluding from build --- gtsam_unstable/discrete/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index 8c94b0e46..25a6a214b 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -16,8 +16,10 @@ set (discrete_full_libs gtsam_unstable-static) # Exclude tests that don't work -set (discrete_excluded_tests "") -#"${CMAKE_CURRENT_SOURCE_DIR}/tests/testScheduler.cpp") +set (discrete_excluded_tests +"${CMAKE_CURRENT_SOURCE_DIR}/tests/testScheduler.cpp" +"${CMAKE_CURRENT_SOURCE_DIR}/tests/testCSP.cpp") + # Add all tests gtsam_add_subdir_tests(discrete_unstable "${discrete_local_libs}" "${discrete_full_libs}" "${discrete_excluded_tests}") From b66dc3586d91cd00248ac7cc7c6ef75ee49b9911 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 21 May 2012 19:44:25 +0000 Subject: [PATCH 022/914] Small change to merge in compatibility patch --- tests/testOccupancyGrid.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp index 542c144f4..35f2df3d8 100644 --- a/tests/testOccupancyGrid.cpp +++ b/tests/testOccupancyGrid.cpp @@ -10,7 +10,8 @@ #include #include #include -#include +//#include // FIXME: does not exist in boost 1.46 +#include // Old header - should still exist #include #include @@ -225,9 +226,9 @@ public: size_t size = cellCount(); Marginals marginals(size); - boost::random::mt19937 rng; - boost::random::uniform_int_distribution random_cell(0,size-1); - + // NOTE: using older interface for boost.random due to interface changes after boost 1.46 + boost::mt19937 rng; + boost::uniform_int random_cell(0,size-1); // run Metropolis for the requested number of operations // compute initial probability of occupancy grid, P(x_t) From 75673e28f1e569d4fe0e055abdee6a7c3226a4ab Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 21 May 2012 20:21:09 +0000 Subject: [PATCH 023/914] Disabled unstable discrete examples bacause they don't build currently --- gtsam_unstable/discrete/CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index 25a6a214b..3ba34d12b 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -24,9 +24,14 @@ set (discrete_excluded_tests # Add all tests gtsam_add_subdir_tests(discrete_unstable "${discrete_local_libs}" "${discrete_full_libs}" "${discrete_excluded_tests}") -# add examples +# List examples to build - comment out here to exclude from compilation +set(discrete_unstable_examples +#schedulingExample +#schedulingQuals12 +) + if (GTSAM_BUILD_EXAMPLES) - foreach(example schedulingExample schedulingQuals12) + foreach(example ${discrete_unstable_examples}) add_executable(${example} "examples/${example}.cpp") # Disable building during make all/install From 54f6f3629cf6a75fd6261ee17d70856865692e1a Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 21 May 2012 20:54:40 +0000 Subject: [PATCH 024/914] Added clone() functionality to nonlinear factors --- .cproject | 339 ++++++++++--------- examples/CameraResectioning.cpp | 2 + examples/LocalizationExample2.cpp | 4 + gtsam/nonlinear/NonlinearEquality.h | 8 + gtsam/nonlinear/NonlinearFactor.h | 16 + gtsam/nonlinear/WhiteNoiseFactor.h | 2 + gtsam/slam/AntiFactor.h | 2 + gtsam/slam/BearingFactor.h | 2 + gtsam/slam/BearingRangeFactor.h | 2 + gtsam/slam/BetweenFactor.h | 2 + gtsam/slam/GeneralSFMFactor.h | 2 + gtsam/slam/PartialPriorFactor.h | 2 + gtsam/slam/PriorFactor.h | 2 + gtsam/slam/ProjectionFactor.h | 2 + gtsam/slam/RangeFactor.h | 2 + gtsam/slam/StereoFactor.h | 3 + gtsam/slam/simulated2D.h | 24 +- gtsam/slam/simulated2DConstraints.h | 9 + gtsam/slam/simulated2DOriented.h | 6 + gtsam/slam/smallExample.cpp | 2 + gtsam_unstable/dynamics/FullIMUFactor.h | 2 + gtsam_unstable/dynamics/IMUFactor.h | 2 + gtsam_unstable/dynamics/VelocityConstraint.h | 2 + tests/CMakeLists.txt | 1 + tests/testExtendedKalmanFilter.cpp | 4 + tests/testNonlinearFactor.cpp | 20 ++ 26 files changed, 292 insertions(+), 172 deletions(-) diff --git a/.cproject b/.cproject index efdaf0c8a..be5e7bc64 100644 --- a/.cproject +++ b/.cproject @@ -311,6 +311,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -337,7 +345,6 @@ make - tests/testBayesTree.run true false @@ -345,7 +352,6 @@ make - testBinaryBayesNet.run true false @@ -393,7 +399,6 @@ make - testSymbolicBayesNet.run true false @@ -401,7 +406,6 @@ make - tests/testSymbolicFactor.run true false @@ -409,7 +413,6 @@ make - testSymbolicFactorGraph.run true false @@ -425,20 +428,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -465,6 +459,7 @@ make + testGraph.run true false @@ -536,6 +531,7 @@ make + testInference.run true false @@ -543,6 +539,7 @@ make + testGaussianFactor.run true false @@ -550,6 +547,7 @@ make + testJunctionTree.run true false @@ -557,6 +555,7 @@ make + testSymbolicBayesNet.run true false @@ -564,6 +563,7 @@ make + testSymbolicFactorGraph.run true false @@ -665,22 +665,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -697,6 +681,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -721,26 +721,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -777,18 +769,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -1049,6 +1049,14 @@ true true + + make + -j5 + testNonlinearFactor.run + true + true + true + make -j2 @@ -1139,7 +1147,6 @@ make - testErrors.run true false @@ -1595,6 +1602,7 @@ make + testSimulated2DOriented.run true false @@ -1634,6 +1642,7 @@ make + testSimulated2D.run true false @@ -1641,6 +1650,7 @@ make + testSimulated3D.run true false @@ -1832,6 +1842,7 @@ make + tests/testGaussianISAM2 true false @@ -1853,6 +1864,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -2054,7 +2161,6 @@ cpack - -G DEB true false @@ -2062,7 +2168,6 @@ cpack - -G RPM true false @@ -2070,7 +2175,6 @@ cpack - -G TGZ true false @@ -2078,7 +2182,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2092,98 +2195,42 @@ true true - + make - -j2 - testRot3.run + -j5 + wrap.testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + wrap.testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run + -j5 + wrap_gtsam true true true - + make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2227,46 +2274,6 @@ false true - - make - -j5 - wrap.testSpirit.run - true - true - true - - - make - -j5 - wrap.testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/examples/CameraResectioning.cpp b/examples/CameraResectioning.cpp index 7d0e37e7f..0280a4f8d 100644 --- a/examples/CameraResectioning.cpp +++ b/examples/CameraResectioning.cpp @@ -44,6 +44,8 @@ public: virtual ~ResectioningFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(ResectioningFactor) + virtual Vector evaluateError(const Pose3& X, boost::optional H = boost::none) const { SimpleCamera camera(*K_, X); Point2 reprojectionError(camera.project(P_, H) - p_); diff --git a/examples/LocalizationExample2.cpp b/examples/LocalizationExample2.cpp index 419975537..a19526a67 100644 --- a/examples/LocalizationExample2.cpp +++ b/examples/LocalizationExample2.cpp @@ -39,12 +39,16 @@ public: UnaryFactor(Key j, double x, double y, const SharedNoiseModel& model): NoiseModelFactor1(model, j), mx_(x), my_(y) {} + virtual ~UnaryFactor() {} + Vector evaluateError(const Pose2& q, boost::optional H = boost::none) const { if (H) (*H) = Matrix_(2,3, 1.0,0.0,0.0, 0.0,1.0,0.0); return Vector_(2, q.x() - mx_, q.y() - my_); } + + ADD_CLONE_NONLINEAR_FACTOR(UnaryFactor) }; /** diff --git a/gtsam/nonlinear/NonlinearEquality.h b/gtsam/nonlinear/NonlinearEquality.h index a1c685668..e9710c780 100644 --- a/gtsam/nonlinear/NonlinearEquality.h +++ b/gtsam/nonlinear/NonlinearEquality.h @@ -161,6 +161,8 @@ namespace gtsam { return GaussianFactor::shared_ptr(new JacobianFactor(ordering[this->key()], A, b, model)); } + ADD_CLONE_NONLINEAR_FACTOR(This) + /// @} private: @@ -190,6 +192,7 @@ namespace gtsam { protected: typedef NoiseModelFactor1 Base; + typedef NonlinearEquality1 This; /** default constructor to allow for serialization */ NonlinearEquality1() {} @@ -209,6 +212,8 @@ namespace gtsam { virtual ~NonlinearEquality1() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** g(x) with optional derivative */ Vector evaluateError(const X& x1, boost::optional H = boost::none) const { if (H) (*H) = eye(x1.dim()); @@ -248,6 +253,7 @@ namespace gtsam { protected: typedef NoiseModelFactor2 Base; + typedef NonlinearEquality2 This; GTSAM_CONCEPT_MANIFOLD_TYPE(X); @@ -263,6 +269,8 @@ namespace gtsam { : Base(noiseModel::Constrained::All(X::Dim(), fabs(mu)), key1, key2) {} virtual ~NonlinearEquality2() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** g(x) with optional derivative2 */ Vector evaluateError(const X& x1, const X& x2, boost::optional H1 = boost::none, diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index bf19555bf..809df99fa 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -35,6 +35,14 @@ #include #include +/** + * Macro to add a standard clone function to a derived factor + */ +#define ADD_CLONE_NONLINEAR_FACTOR(Derived) \ + virtual gtsam::NonlinearFactor::shared_ptr clone() const { \ + return boost::static_pointer_cast( \ + gtsam::NonlinearFactor::shared_ptr(new Derived(*this))); } + namespace gtsam { /* ************************************************************************* */ @@ -146,6 +154,14 @@ public: return IndexFactor::shared_ptr(new IndexFactor(indices)); } + /** + * Creates a shared_ptr clone of the factor - needs to be specialized to allow + * for subclasses + * + * Default implementation will slice the factor + */ + virtual shared_ptr clone() const =0; + }; // \class NonlinearFactor /* ************************************************************************* */ diff --git a/gtsam/nonlinear/WhiteNoiseFactor.h b/gtsam/nonlinear/WhiteNoiseFactor.h index f5fb7fae1..354a1bcbc 100644 --- a/gtsam/nonlinear/WhiteNoiseFactor.h +++ b/gtsam/nonlinear/WhiteNoiseFactor.h @@ -163,6 +163,8 @@ namespace gtsam { return linearize(z_, u, p, j1, j2); } + ADD_CLONE_NONLINEAR_FACTOR(This) + /// @} }; diff --git a/gtsam/slam/AntiFactor.h b/gtsam/slam/AntiFactor.h index 633360fed..47e0fd40c 100644 --- a/gtsam/slam/AntiFactor.h +++ b/gtsam/slam/AntiFactor.h @@ -50,6 +50,8 @@ namespace gtsam { virtual ~AntiFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** implement functions needed for Testable */ /** print */ diff --git a/gtsam/slam/BearingFactor.h b/gtsam/slam/BearingFactor.h index 7c208436a..edd484e36 100644 --- a/gtsam/slam/BearingFactor.h +++ b/gtsam/slam/BearingFactor.h @@ -55,6 +55,8 @@ namespace gtsam { virtual ~BearingFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** h(x)-z -> between(z,h(x)) for Rot2 manifold */ Vector evaluateError(const Pose& pose, const Point& point, boost::optional H1, boost::optional H2) const { diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index 4c170c811..9fe70123e 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -57,6 +57,8 @@ namespace gtsam { virtual ~BearingRangeFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** Print */ virtual void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { std::cout << s << ": BearingRangeFactor(" diff --git a/gtsam/slam/BetweenFactor.h b/gtsam/slam/BetweenFactor.h index 2df0b98de..ec55c253b 100644 --- a/gtsam/slam/BetweenFactor.h +++ b/gtsam/slam/BetweenFactor.h @@ -62,6 +62,8 @@ namespace gtsam { virtual ~BetweenFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** implement functions needed for Testable */ /** print */ diff --git a/gtsam/slam/GeneralSFMFactor.h b/gtsam/slam/GeneralSFMFactor.h index 4f1f48958..d046d0e1b 100644 --- a/gtsam/slam/GeneralSFMFactor.h +++ b/gtsam/slam/GeneralSFMFactor.h @@ -61,6 +61,8 @@ namespace gtsam { virtual ~GeneralSFMFactor() {} ///< destructor + ADD_CLONE_NONLINEAR_FACTOR(This) + /** * print * @param s optional string naming the factor diff --git a/gtsam/slam/PartialPriorFactor.h b/gtsam/slam/PartialPriorFactor.h index 4c7069174..479fd3fa6 100644 --- a/gtsam/slam/PartialPriorFactor.h +++ b/gtsam/slam/PartialPriorFactor.h @@ -86,6 +86,8 @@ namespace gtsam { this->fillH(); } + ADD_CLONE_NONLINEAR_FACTOR(This) + /** implement functions needed for Testable */ /** print */ diff --git a/gtsam/slam/PriorFactor.h b/gtsam/slam/PriorFactor.h index 2ab011bf5..6d958c652 100644 --- a/gtsam/slam/PriorFactor.h +++ b/gtsam/slam/PriorFactor.h @@ -56,6 +56,8 @@ namespace gtsam { Base(model, key), prior_(prior) { } + ADD_CLONE_NONLINEAR_FACTOR(This) + /** implement functions needed for Testable */ /** print */ diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index d5e9048e5..179362a42 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -70,6 +70,8 @@ namespace gtsam { /** Virtual destructor */ virtual ~GenericProjectionFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** * print * @param s optional string naming the factor diff --git a/gtsam/slam/RangeFactor.h b/gtsam/slam/RangeFactor.h index 489f751db..ee3dc0b8e 100644 --- a/gtsam/slam/RangeFactor.h +++ b/gtsam/slam/RangeFactor.h @@ -51,6 +51,8 @@ namespace gtsam { virtual ~RangeFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** h(x)-z */ Vector evaluateError(const Pose& pose, const Point& point, boost::optional H1, boost::optional H2) const { double hx = pose.range(point, H1, H2); diff --git a/gtsam/slam/StereoFactor.h b/gtsam/slam/StereoFactor.h index ae2deeae3..500009ab4 100644 --- a/gtsam/slam/StereoFactor.h +++ b/gtsam/slam/StereoFactor.h @@ -34,6 +34,7 @@ public: // shorthand for base class type typedef NoiseModelFactor2 Base; ///< typedef for base class + typedef GenericStereoFactor This; ///< typedef for this class (with templates) typedef boost::shared_ptr shared_ptr; ///< typedef for shared pointer to this object typedef POSE CamPose; ///< typedef for Pose Lie Value type @@ -56,6 +57,8 @@ public: virtual ~GenericStereoFactor() {} ///< Virtual destructor + ADD_CLONE_NONLINEAR_FACTOR(This) + /** * print * @param s optional string naming the factor diff --git a/gtsam/slam/simulated2D.h b/gtsam/slam/simulated2D.h index ca9c0cf15..e9b4f2bc9 100644 --- a/gtsam/slam/simulated2D.h +++ b/gtsam/slam/simulated2D.h @@ -123,6 +123,7 @@ namespace simulated2D { class GenericPrior: public NoiseModelFactor1 { public: typedef NoiseModelFactor1 Base; ///< base class + typedef GenericPrior This; typedef boost::shared_ptr > shared_ptr; typedef VALUE Pose; ///< shortcut to Pose type @@ -138,11 +139,14 @@ namespace simulated2D { return (prior(x, H) - measured_).vector(); } + virtual ~GenericPrior() {} + + ADD_CLONE_NONLINEAR_FACTOR(This) + private: /// Default constructor - GenericPrior() { - } + GenericPrior() { } /// Serialization function friend class boost::serialization::access; @@ -160,6 +164,7 @@ namespace simulated2D { class GenericOdometry: public NoiseModelFactor2 { public: typedef NoiseModelFactor2 Base; ///< base class + typedef GenericOdometry This; typedef boost::shared_ptr > shared_ptr; typedef VALUE Pose; ///< shortcut to Pose type @@ -177,11 +182,14 @@ namespace simulated2D { return (odo(x1, x2, H1, H2) - measured_).vector(); } + virtual ~GenericOdometry() {} + + ADD_CLONE_NONLINEAR_FACTOR(This) + private: /// Default constructor - GenericOdometry() { - } + GenericOdometry() { } /// Serialization function friend class boost::serialization::access; @@ -199,6 +207,7 @@ namespace simulated2D { class GenericMeasurement: public NoiseModelFactor2 { public: typedef NoiseModelFactor2 Base; ///< base class + typedef GenericMeasurement This; typedef boost::shared_ptr > shared_ptr; typedef POSE Pose; ///< shortcut to Pose type typedef LANDMARK Landmark; ///< shortcut to Landmark type @@ -217,11 +226,14 @@ namespace simulated2D { return (mea(x1, x2, H1, H2) - measured_).vector(); } + virtual ~GenericMeasurement() {} + + ADD_CLONE_NONLINEAR_FACTOR(This) + private: /// Default constructor - GenericMeasurement() { - } + GenericMeasurement() { } /// Serialization function friend class boost::serialization::access; diff --git a/gtsam/slam/simulated2DConstraints.h b/gtsam/slam/simulated2DConstraints.h index b44062933..4594a8e1f 100644 --- a/gtsam/slam/simulated2DConstraints.h +++ b/gtsam/slam/simulated2DConstraints.h @@ -53,11 +53,14 @@ namespace simulated2D { template struct ScalarCoordConstraint1: public BoundingConstraint1 { typedef BoundingConstraint1 Base; ///< Base class convenience typedef + typedef ScalarCoordConstraint1 This; ///< This class convenience typedef typedef boost::shared_ptr > shared_ptr; ///< boost::shared_ptr convenience typedef typedef VALUE Point; ///< Constrained variable type virtual ~ScalarCoordConstraint1() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** * Constructor for constraint * @param key is the label for the constrained variable @@ -116,10 +119,13 @@ namespace simulated2D { template struct MaxDistanceConstraint : public BoundingConstraint2 { typedef BoundingConstraint2 Base; ///< Base class for factor + typedef MaxDistanceConstraint This; ///< This class for factor typedef VALUE Point; ///< Type of variable constrained virtual ~MaxDistanceConstraint() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** * Primary constructor for factor * @param key1 is the first variable key @@ -158,11 +164,14 @@ namespace simulated2D { template struct MinDistanceConstraint : public BoundingConstraint2 { typedef BoundingConstraint2 Base; ///< Base class for factor + typedef MinDistanceConstraint This; ///< This class for factor typedef POSE Pose; ///< Type of pose variable constrained typedef POINT Point; ///< Type of point variable constrained virtual ~MinDistanceConstraint() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** * Primary constructor for factor * @param key1 is the first variable key diff --git a/gtsam/slam/simulated2DOriented.h b/gtsam/slam/simulated2DOriented.h index 242aab94b..c7ebd466c 100644 --- a/gtsam/slam/simulated2DOriented.h +++ b/gtsam/slam/simulated2DOriented.h @@ -102,6 +102,8 @@ namespace simulated2DOriented { struct GenericOdometry: public NoiseModelFactor2 { Pose2 measured_; ///< Between measurement for odometry factor + typedef GenericOdometry This; + /** * Creates an odometry factor between two poses */ @@ -110,6 +112,8 @@ namespace simulated2DOriented { NoiseModelFactor2(model, i1, i2), measured_(measured) { } + virtual ~GenericOdometry() {} + /// Evaluate error and optionally derivative Vector evaluateError(const VALUE& x1, const VALUE& x2, boost::optional H1 = boost::none, @@ -117,6 +121,8 @@ namespace simulated2DOriented { return measured_.localCoordinates(odo(x1, x2, H1, H2)); } + ADD_CLONE_NONLINEAR_FACTOR(This) + }; typedef GenericOdometry Odometry; diff --git a/gtsam/slam/smallExample.cpp b/gtsam/slam/smallExample.cpp index 170f3ef03..fae2d2e22 100644 --- a/gtsam/slam/smallExample.cpp +++ b/gtsam/slam/smallExample.cpp @@ -211,6 +211,8 @@ namespace example { return (h(x) - z_).vector(); } + ADD_CLONE_NONLINEAR_FACTOR(UnaryFactor) + }; } diff --git a/gtsam_unstable/dynamics/FullIMUFactor.h b/gtsam_unstable/dynamics/FullIMUFactor.h index 29b77c661..306ec5191 100644 --- a/gtsam_unstable/dynamics/FullIMUFactor.h +++ b/gtsam_unstable/dynamics/FullIMUFactor.h @@ -51,6 +51,8 @@ public: virtual ~FullIMUFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** Check if two factors are equal */ virtual bool equals(const NonlinearFactor& e, double tol = 1e-9) const { const This* const f = dynamic_cast(&e); diff --git a/gtsam_unstable/dynamics/IMUFactor.h b/gtsam_unstable/dynamics/IMUFactor.h index 7ded5ef82..b1ccdb3bc 100644 --- a/gtsam_unstable/dynamics/IMUFactor.h +++ b/gtsam_unstable/dynamics/IMUFactor.h @@ -44,6 +44,8 @@ public: virtual ~IMUFactor() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + /** Check if two factors are equal */ virtual bool equals(const NonlinearFactor& e, double tol = 1e-9) const { const This* const f = dynamic_cast(&e); diff --git a/gtsam_unstable/dynamics/VelocityConstraint.h b/gtsam_unstable/dynamics/VelocityConstraint.h index a35f09bb7..7646b7486 100644 --- a/gtsam_unstable/dynamics/VelocityConstraint.h +++ b/gtsam_unstable/dynamics/VelocityConstraint.h @@ -72,6 +72,8 @@ public: virtual ~VelocityConstraint() {} + ADD_CLONE_NONLINEAR_FACTOR(VelocityConstraint) + /** * Calculates the error for trapezoidal model given */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1101a0a4b..43420e1c9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,6 +13,7 @@ set(tests_local_libs # note the source dir on each set (tests_exclude "${CMAKE_CURRENT_SOURCE_DIR}/testPose2SLAMwSPCG.cpp" + #"${CMAKE_CURRENT_SOURCE_DIR}/testOccupancyGrid.cpp" ) # Build tests diff --git a/tests/testExtendedKalmanFilter.cpp b/tests/testExtendedKalmanFilter.cpp index d9e5643a4..c0e5af4f7 100644 --- a/tests/testExtendedKalmanFilter.cpp +++ b/tests/testExtendedKalmanFilter.cpp @@ -120,6 +120,8 @@ public: virtual ~NonlinearMotionModel() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + // Calculate the next state prediction using the nonlinear function f() T f(const T& x_t0) const { @@ -262,6 +264,8 @@ public: virtual ~NonlinearMeasurementModel() {} + ADD_CLONE_NONLINEAR_FACTOR(This) + // Calculate the predicted measurement using the nonlinear function h() // Byproduct: updates Jacobian H, and noiseModel (R) Vector h(const T& x_t1) const { diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index d32a50fe5..c74c3adab 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -254,6 +254,8 @@ public: } return (Vector(1) << x1 + x2 + x3 + x4).finished(); } + + ADD_CLONE_NONLINEAR_FACTOR(TestFactor4) }; /* ************************************ */ @@ -301,6 +303,8 @@ public: } return (Vector(1) << x1 + x2 + x3 + x4 + x5).finished(); } + + ADD_CLONE_NONLINEAR_FACTOR(TestFactor5) }; /* ************************************ */ @@ -353,6 +357,8 @@ public: } return (Vector(1) << x1 + x2 + x3 + x4 + x5 + x6).finished(); } + + ADD_CLONE_NONLINEAR_FACTOR(TestFactor6) }; /* ************************************ */ @@ -385,6 +391,20 @@ TEST(NonlinearFactor, NoiseModelFactor6) { } +/* ************************************************************************* */ +TEST( NonlinearFactor, clone ) +{ + shared_nlf init(new TestFactor4()); + EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]); + EXPECT_LONGS_EQUAL(PoseKey(2), init->keys()[1]); + EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]); + EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]); + + shared_nlf actClone = init->clone(); + EXPECT(actClone.get() != init.get()); // Ensure different pointers + EXPECT(assert_equal(*init, *actClone)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr);} /* ************************************************************************* */ From 2bd7a0ed43cafcb641405f70ea76397b30518b35 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 21 May 2012 20:54:42 +0000 Subject: [PATCH 025/914] Added generic re-key function to nonlinear factor --- gtsam/nonlinear/NonlinearFactor.h | 13 +++++++++++-- tests/testNonlinearFactor.cpp | 24 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 809df99fa..89b6de3dd 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -157,11 +157,20 @@ public: /** * Creates a shared_ptr clone of the factor - needs to be specialized to allow * for subclasses - * - * Default implementation will slice the factor */ virtual shared_ptr clone() const =0; + /** + * Clones a factor and replaces its keys + */ + shared_ptr rekey(const std::vector& new_keys) const { + assert(new_keys.size() == this->keys().size()); + shared_ptr new_factor = clone(); + new_factor->keys() = new_keys; + return new_factor; + } + + }; // \class NonlinearFactor /* ************************************************************************* */ diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index c74c3adab..d5e91d0d7 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -392,7 +392,7 @@ TEST(NonlinearFactor, NoiseModelFactor6) { } /* ************************************************************************* */ -TEST( NonlinearFactor, clone ) +TEST( NonlinearFactor, clone_rekey ) { shared_nlf init(new TestFactor4()); EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]); @@ -400,9 +400,31 @@ TEST( NonlinearFactor, clone ) EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]); EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]); + // Standard clone shared_nlf actClone = init->clone(); EXPECT(actClone.get() != init.get()); // Ensure different pointers EXPECT(assert_equal(*init, *actClone)); + + // Re-key factor - clones with different keys + std::vector new_keys(4); + new_keys[0] = PoseKey(5); + new_keys[1] = PoseKey(6); + new_keys[2] = PoseKey(7); + new_keys[3] = PoseKey(8); + shared_nlf actRekey = init->rekey(new_keys); + EXPECT(actRekey.get() != init.get()); // Ensure different pointers + + // Ensure init is unchanged + EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]); + EXPECT_LONGS_EQUAL(PoseKey(2), init->keys()[1]); + EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]); + EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]); + + // Check new keys + EXPECT_LONGS_EQUAL(PoseKey(5), actRekey->keys()[0]); + EXPECT_LONGS_EQUAL(PoseKey(6), actRekey->keys()[1]); + EXPECT_LONGS_EQUAL(PoseKey(7), actRekey->keys()[2]); + EXPECT_LONGS_EQUAL(PoseKey(8), actRekey->keys()[3]); } /* ************************************************************************* */ From 399a81911e2dae353775f1bd1ca3bcca0dd94cd0 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 21 May 2012 21:52:50 +0000 Subject: [PATCH 026/914] Fixed optimizer/marginals confusion --- examples/LocalizationExample.cpp | 4 +--- examples/LocalizationExample2.cpp | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index 6b9a48339..ae2a31040 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -19,7 +19,6 @@ #include // include this for marginals -#include #include #include @@ -65,8 +64,7 @@ int main(int argc, char** argv) { pose2SLAM::Values result = graph.optimize(initialEstimate); result.print("\nFinal result:\n "); - // use an explicit Optimizer object so we can query the marginals - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); + // Query the marginals Marginals marginals(graph, result); cout.precision(2); cout << "\nP1:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(1)) << endl; diff --git a/examples/LocalizationExample2.cpp b/examples/LocalizationExample2.cpp index a19526a67..903101d87 100644 --- a/examples/LocalizationExample2.cpp +++ b/examples/LocalizationExample2.cpp @@ -84,14 +84,14 @@ int main(int argc, char** argv) { initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); - initialEstimate.print("\nInitial estimate:\n "); - // use an explicit Optimizer object, used for both optimization and marginal inference + // use an explicit Optimizer object LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); pose2SLAM::Values result = optimizer.optimize(); result.print("\nFinal result:\n "); - Values resultMultifrontal = optimizer.optimize(); + + // Query the marginals Marginals marginals(graph, result); cout.precision(2); cout << "\nP1:\n" << marginals.marginalCovariance(x1) << endl; From 3e9ceda0626f2858effe60eb1f963db5f0caf33a Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 21 May 2012 21:53:26 +0000 Subject: [PATCH 027/914] Sync with C++ example --- examples/matlab/LocalizationExample.m | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 examples/matlab/LocalizationExample.m diff --git a/examples/matlab/LocalizationExample.m b/examples/matlab/LocalizationExample.m new file mode 100644 index 000000000..361a1c8b1 --- /dev/null +++ b/examples/matlab/LocalizationExample.m @@ -0,0 +1,50 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Example of a simple 2D localization example +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - Robot poses are facing along the X axis (horizontal, to the right in 2D) +% - The robot moves 2 meters each step +% - The robot is on a grid, moving 2 meters each step + +%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) +graph = pose2SLAMGraph; + +%% Add a Gaussian prior on pose x_1 +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +graph.addPrior(1, priorMean, priorNoise); % add directly to graph + +%% Add two odometry factors +odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +graph.addOdometry(1, 2, odometry, odometryNoise); +graph.addOdometry(2, 3, odometry, odometryNoise); + +%% print +graph.print(sprintf('\nFactor graph:\n')); + +%% Initialize to noisy points +initialEstimate = pose2SLAMValues; +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); +initialEstimate.print(sprintf('\nInitial estimate:\n ')); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); +result.print(sprintf('\nFinal result:\n ')); + +%% Use an explicit Optimizer object so we can query the marginals +% marginals = gtsamMarginals(graph, result); +% marginals.marginalCovariance(pose2SLAMPoseKey(1)) +% marginals.marginalCovariance(pose2SLAMPoseKey(2)) +% marginals.marginalCovariance(pose2SLAMPoseKey(3)) From d00febb7a9b7b7e162b3ba7713884424f61da436 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 21 May 2012 21:53:56 +0000 Subject: [PATCH 028/914] Added (commented out) marginals class --- gtsam.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gtsam.h b/gtsam.h index 3fed4da7f..5b909e053 100644 --- a/gtsam.h +++ b/gtsam.h @@ -57,9 +57,6 @@ * - TODO: Handle gtsam::Rot3M conversions to quaternions */ -// Everything is in the gtsam namespace, so we avoid copying everything in -//using namespace gtsam; - namespace gtsam { //************************************************************************* @@ -410,6 +407,11 @@ class Ordering { void push_back(size_t key); }; +// Frank says: this does not work. Why not? +//class Marginals { +// Marginals(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& solution); +//}; + }///\namespace gtsam //************************************************************************* From 6be07e33bfc3137aea36b3489466af383bd5ee97 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 21 May 2012 22:32:40 +0000 Subject: [PATCH 029/914] Dependency checking requires class definitions for all gtsam classes used in arguments of wrapped objects --- gtsam.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/gtsam.h b/gtsam.h index 5b909e053..628c91733 100644 --- a/gtsam.h +++ b/gtsam.h @@ -407,10 +407,21 @@ class Ordering { void push_back(size_t key); }; +//Andrew says: Required definitions for Marginal arguments +class NonlinearFactorGraph { + NonlinearFactorGraph(); + //This need to be populated with whatever functions might be needed. +}; + +class Values { + Values(); + //Same here +}; + // Frank says: this does not work. Why not? -//class Marginals { -// Marginals(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& solution); -//}; +class Marginals { + Marginals(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& solution); +}; }///\namespace gtsam From 1bcb3966f39759af13a7ce9d061f920bbe30d4c3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 21 May 2012 23:38:22 +0000 Subject: [PATCH 030/914] Created branch /branches/cmake_config_files from /trunk:10643 From a164a66b7715b52c10c6b0ec752f4a14c0422c04 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 21 May 2012 23:38:25 +0000 Subject: [PATCH 031/914] In progress with cmake config files --- CMakeLists.txt | 7 +++++++ gtsam/CMakeLists.txt | 2 +- gtsam/base/cholesky.h | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6c9bc422..eb55a989a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,9 @@ if (GTSAM_BUILD_TESTS) endif() # Find boost +if(CYGWIN OR MSVC OR WIN32) + set(Boost_USE_STATIC_LIBS 1) +endif() find_package(Boost 1.40 COMPONENTS serialization REQUIRED) # General build settings @@ -128,6 +131,10 @@ if (GTSAM_BUILD_UNSTABLE) add_subdirectory(gtsam_unstable) endif(GTSAM_BUILD_UNSTABLE) +# Make config file +include(GtsamMakeConfigFile) +GtsamMakeConfigFile(gtsam) + # Set up CPack set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM") set(CPACK_PACKAGE_VENDOR "Frank Dellaert, Georgia Institute of Technology") diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index b3e639917..a905b6944 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -97,6 +97,6 @@ if (GTSAM_BUILD_SHARED_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) - install(TARGETS gtsam-shared LIBRARY DESTINATION lib ) + install(TARGETS gtsam-shared DESTINATION lib ) endif(GTSAM_BUILD_SHARED_LIBRARY) diff --git a/gtsam/base/cholesky.h b/gtsam/base/cholesky.h index 50d3b24a8..46d342d24 100644 --- a/gtsam/base/cholesky.h +++ b/gtsam/base/cholesky.h @@ -34,7 +34,7 @@ struct NegativeMatrixException : public std::exception { Matrix A; ///< The original matrix attempted to factor Matrix U; ///< The produced upper-triangular factor Matrix D; ///< The produced diagonal factor - Detail(const Matrix& _A, const Matrix& _U, const Matrix& _D) /**< Detail constructor */ : A(_A), U(_U), D(_D) {} + Detail(const Matrix& A, const Matrix& U, const Matrix& D) /**< Detail constructor */ : A(A), U(U), D(D) {} void print(const std::string& str = "") const { std::cout << str << "\n"; gtsam::print(A, " A: "); From 9caf04dccda7aa0cc726237d68daf45b985406a8 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 04:30:30 +0000 Subject: [PATCH 032/914] addConstraint --- gtsam/slam/pose2SLAM.cpp | 6 ++++++ gtsam/slam/pose2SLAM.h | 13 ++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp index e8cbcd7fe..dd80b821b 100644 --- a/gtsam/slam/pose2SLAM.cpp +++ b/gtsam/slam/pose2SLAM.cpp @@ -16,6 +16,7 @@ **/ #include +#include // Use pose2SLAM namespace for specific SLAM instance @@ -51,5 +52,10 @@ namespace pose2SLAM { } /* ************************************************************************* */ + Values Graph::optimize(const Values& initialEstimate) const { + return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); + } + + /* ************************************************************************* */ } // pose2SLAM diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 6dc682f9b..42e22a85d 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -17,14 +17,13 @@ #pragma once -#include #include #include #include #include #include #include -#include +#include // Use pose2SLAM namespace for specific SLAM instance namespace pose2SLAM { @@ -93,10 +92,14 @@ namespace pose2SLAM { void addOdometry(Index i, Index j, const Pose2& z, const SharedNoiseModel& model); - /// Optimize - Values optimize(const Values& initialEstimate) const { - return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); + /// AddConstraint adds a soft constraint between factor between keys i and j + void addConstraint(Index i, Index j, const Pose2& z, + const SharedNoiseModel& model) { + addOdometry(i,j,z,model); // same for now } + + /// Optimize + Values optimize(const Values& initialEstimate) const; }; } // pose2SLAM From 10456a153cf509c0aad29661217efb72e9d169cd Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 04:31:05 +0000 Subject: [PATCH 033/914] More complex Pose2SLAM example, synced up with manual (in progress) --- examples/LocalizationExample.cpp | 1 - examples/Pose2SLAMExample_easy.cpp | 67 ++++++++++++++---------------- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index ae2a31040..6963f75f1 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -57,7 +57,6 @@ int main(int argc, char** argv) { initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); - initialEstimate.print("\nInitial estimate:\n "); // optimize using Levenberg-Marquardt optimization with an ordering from colamd diff --git a/examples/Pose2SLAMExample_easy.cpp b/examples/Pose2SLAMExample_easy.cpp index 18a756aba..b6507d7fc 100644 --- a/examples/Pose2SLAMExample_easy.cpp +++ b/examples/Pose2SLAMExample_easy.cpp @@ -11,59 +11,54 @@ /** * @file Pose2SLAMExample_easy.cpp - * - * A 2D Pose SLAM example using the predefined typedefs in gtsam/slam/pose2SLAM.h - * + * @brief A 2D Pose SLAM example using the predefined typedefs in gtsam/slam/pose2SLAM.h * @date Oct 21, 2010 - * @author ydjian + * @author Yong Dian Jian */ -#include -#include -#include - // pull in the Pose2 SLAM domain with all typedefs and helper functions defined #include -#include +#include using namespace std; using namespace gtsam; -using namespace pose2SLAM; int main(int argc, char** argv) { - /* 1. create graph container and add factors to it */ - Graph graph ; + // 1. Create graph container and add factors to it + pose2SLAM::Graph graph ; - /* 2.a add prior */ - // gaussian for prior - SharedDiagonal prior_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - Pose2 prior_measurement(0.0, 0.0, 0.0); // prior at origin - graph.addPrior(1, prior_measurement, prior_model); // add directly to graph + // 2a. Add Gaussian prior + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin + SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); + graph.addPrior(1, priorMean, priorNoise); - /* 2.b add odometry */ - // general noisemodel for odometry - SharedDiagonal odom_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + // 2b. Add odometry factors + SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); + graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); + graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - /* Pose2 measurements take (x,y,theta), where theta is taken from the positive x-axis*/ - Pose2 odom_measurement(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - graph.addOdometry(1, 2, odom_measurement, odom_model); - graph.addOdometry(2, 3, odom_measurement, odom_model); - graph.print("full graph"); + // 2c. Add pose constraint + SharedDiagonal constraintUncertainty(Vector_(3, 0.2, 0.2, 0.1)); + graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); - /* 3. Create the data structure to hold the initial estinmate to the solution - * initialize to noisy points */ - pose2SLAM::Values initial; - initial.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initial.insertPose(2, Pose2(2.3, 0.1,-0.2)); - initial.insertPose(3, Pose2(4.1, 0.1, 0.1)); - initial.print("initial estimate"); + // print + graph.print("\nFactor graph:\n"); - /* 4 Single Step Optimization - * optimize using Levenberg-Marquardt optimization with an ordering from colamd */ - pose2SLAM::Values result = graph.optimize(initial); - result.print("final result"); + // 3. Create the data structure to hold the initialEstimate estinmate to the solution + pose2SLAM::Values initialEstimate; + Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); + Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); + Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); + Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); + Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); + initialEstimate.print("\nInitial estimate:\n "); + // 4. Single Step Optimization using Levenberg-Marquardt + pose2SLAM::Values result = graph.optimize(initialEstimate); + result.print("\nFinal result:\n "); return 0; } From 18e23c20dfc1c037e3119a7aa93968da928fae6c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 12:27:34 +0000 Subject: [PATCH 034/914] Added missing header --- gtsam/slam/tests/testPose2SLAM.cpp | 10 +++++++--- tests/testNonlinearOptimizer.cpp | 27 +++++++++++++-------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 22c02ab52..5aa633bbf 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include using namespace gtsam; @@ -145,7 +146,7 @@ TEST( Pose2SLAM, linearization ) } /* ************************************************************************* */ -TEST(Pose2Graph, optimize) { +TEST(Pose2SLAM, optimize) { // create a Pose graph with one equality constraint and one measurement pose2SLAM::Graph fg; @@ -171,11 +172,14 @@ TEST(Pose2Graph, optimize) { expected.insert(pose2SLAM::PoseKey(0), Pose2(0,0,0)); expected.insert(pose2SLAM::PoseKey(1), Pose2(1,2,M_PI_2)); CHECK(assert_equal(expected, actual)); + + // Check marginals + Marginals marginals = fg.marginals(actual); } /* ************************************************************************* */ // test optimization with 3 poses -TEST(Pose2Graph, optimizeThreePoses) { +TEST(Pose2SLAM, optimizeThreePoses) { // Create a hexagon of poses pose2SLAM::Values hexagon = pose2SLAM::circle(3,1.0); @@ -289,7 +293,7 @@ TEST_UNSAFE(Pose2SLAM, optimizeCircle) { } /* ************************************************************************* */ -TEST(Pose2Graph, optimize2) { +TEST(Pose2SLAM, optimize2) { // Pose2SLAMOptimizer myOptimizer("100"); // Matrix A1 = myOptimizer.a1(); // Matrix A2 = myOptimizer.a2(); diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index d1eb01f27..a926b9e1b 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -15,26 +15,25 @@ * @author Frank Dellaert */ -#include -using namespace std; - -#include // for operator += -using namespace boost::assign; +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -using namespace boost; +#include // for operator += +using namespace boost::assign; -#include -#include -#include -#include -#include -#include -#include -#include +#include +using namespace std; using namespace gtsam; const double tol = 1e-5; From 5145018053eb4a80e4f5c834103662f8b82a545d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 12:28:17 +0000 Subject: [PATCH 035/914] Fixed some test targets --- .cproject | 238 +++++++++++++++++++++++++----------------------------- 1 file changed, 111 insertions(+), 127 deletions(-) diff --git a/.cproject b/.cproject index be5e7bc64..5ee6f0fdb 100644 --- a/.cproject +++ b/.cproject @@ -593,38 +593,6 @@ true true - - make - -j5 - testBTree.run - true - true - true - - - make - -j5 - testDSF.run - true - true - true - - - make - -j5 - testDSFVector.run - true - true - true - - - make - -j5 - testFixedVector.run - true - true - true - make -j2 @@ -721,50 +689,50 @@ true true - + make -j5 - testValues.run + nonlinear.testValues.run true true true - + make -j5 - testOrdering.run + nonlinear.testOrdering.run true true true - + make - -j2 - tests/testGeneralSFMFactor.run + -j5 + testGeneralSFMFactor.run true true true - + make - -j2 - tests/testPlanarSLAM.run + -j5 + testPlanarSLAM.run true true true - + make - -j2 - tests/testPose2SLAM.run + -j5 + testPose2SLAM.run true true true - + make - -j2 - tests/testPose3SLAM.run + -j5 + testPose3SLAM.run true true true @@ -793,46 +761,6 @@ true true - - make - -j5 - schedulingExample.run - true - true - true - - - make - -j5 - testCSP.run - true - true - true - - - make - -j5 - testScheduler.run - true - true - true - - - make - -j5 - schedulingQuals12.run - true - true - true - - - make - -j5 - testSudoku.run - true - true - true - make -j2 @@ -865,10 +793,10 @@ true true - + make -j5 - testDiscreteFactor.run + check true true true @@ -1049,14 +977,6 @@ true true - - make - -j5 - testNonlinearFactor.run - true - true - true - make -j2 @@ -1672,74 +1592,82 @@ true true - + make - -j5 - testVectorValues.run + -j2 + tests/testVectorValues.run true true true - + make -j5 - testNoiseModel.run + linear.testNoiseModel.run true true true - + make - -j5 - testHessianFactor.run + -j2 + tests/testGaussianFactor.run true true true - + make - -j5 - testGaussianConditional.run + -j2 + tests/testHessianFactor.run true true true - + make - -j5 - testGaussianFactorGraph.run + -j2 + tests/testGaussianConditional.run true true true - + make - -j5 - testGaussianJunctionTree.run + -j2 + tests/testGaussianFactorGraph.run true true true - + make - -j5 - testKalmanFilter.run + -j2 + tests/testGaussianJunctionTree.run true true true - + make - -j5 - testGaussianDensity.run + -j2 + tests/testKalmanFilter.run true true true - + + make + -j2 + tests/testGaussianDensity.run + true + true + true + + make -j5 - testSerializationLinear.run + linear.testSerializationLinear.run true true true @@ -1832,6 +1760,22 @@ true true + + make + -j5 + LocalizationExample.run + true + true + true + + + make + -j5 + LocalizationExample2.run + true + true + true + make -j2 @@ -2195,18 +2139,58 @@ true true - + make -j5 - wrap.testSpirit.run + wrap_gtsam_unstable true true true - + make -j5 - wrap.testWrap.run + check.wrap + true + true + true + + + make + -j5 + check.dynamics_unstable + true + true + true + + + make + -j5 + check.slam_unstable + true + true + true + + + make + -j5 + check.base_unstable + true + true + true + + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run true true true From 3baa6c6e042c1b7d14b29e192392d4a1895d8447 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 12:31:59 +0000 Subject: [PATCH 036/914] Added marginals function (could move to superclass?) --- gtsam/slam/pose2SLAM.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 42e22a85d..50944cf2f 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -23,6 +23,7 @@ #include #include #include +#include #include // Use pose2SLAM namespace for specific SLAM instance @@ -100,6 +101,12 @@ namespace pose2SLAM { /// Optimize Values optimize(const Values& initialEstimate) const; + + /// Return a Marginals object + Marginals marginals(const Values& solution) const { + return Marginals(*this,solution); + } + }; } // pose2SLAM From 11e844470c614184f10de022020ee62383f1787f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 14:50:10 +0000 Subject: [PATCH 037/914] marginals fail with pose constraint... --- gtsam/slam/tests/testPose2SLAM.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 5aa633bbf..a2d99ca88 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -36,12 +36,12 @@ using pose2SLAM::PoseKey; // common measurement covariance static double sx=0.5, sy=0.5,st=0.1; -static noiseModel::Gaussian::shared_ptr covariance( - noiseModel::Gaussian::Covariance(Matrix_(3, 3, +static Matrix cov(Matrix_(3, 3, sx*sx, 0.0, 0.0, 0.0, sy*sy, 0.0, 0.0, 0.0, st*st - ))); + )); +static noiseModel::Gaussian::shared_ptr covariance(noiseModel::Gaussian::Covariance(cov)); //static noiseModel::Gaussian::shared_ptr I3(noiseModel::Unit::Create(3)); const Key kx0 = Symbol('x',0), kx1 = Symbol('x',1), kx2 = Symbol('x',2), kx3 = Symbol('x',3), kx4 = Symbol('x',4), kx5 = Symbol('x',5), kl1 = Symbol('l',1); @@ -175,6 +175,12 @@ TEST(Pose2SLAM, optimize) { // Check marginals Marginals marginals = fg.marginals(actual); + // Matrix expectedP0 = Infinity, as we have a pose constraint !? + // Matrix actualP0 = marginals.marginalCovariance(pose2SLAM::PoseKey(0)); + // EQUALITY(expectedP0, actualP0); + Matrix expectedP1 = cov; // the second pose really should have just the noise covariance + Matrix actualP1 = marginals.marginalCovariance(pose2SLAM::PoseKey(1)); + EQUALITY(expectedP1, actualP1); } /* ************************************************************************* */ From c3ca8175e9fcc7df42fe50eafa80c0b2589d709e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 22 May 2012 15:05:15 +0000 Subject: [PATCH 038/914] removed old SPCG test --- tests/CMakeLists.txt | 1 - tests/testPose2SLAMwSPCG.cpp | 72 ------------------------------------ 2 files changed, 73 deletions(-) delete mode 100644 tests/testPose2SLAMwSPCG.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 43420e1c9..4d29dd557 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,7 +12,6 @@ set(tests_local_libs # exclude certain files # note the source dir on each set (tests_exclude - "${CMAKE_CURRENT_SOURCE_DIR}/testPose2SLAMwSPCG.cpp" #"${CMAKE_CURRENT_SOURCE_DIR}/testOccupancyGrid.cpp" ) diff --git a/tests/testPose2SLAMwSPCG.cpp b/tests/testPose2SLAMwSPCG.cpp deleted file mode 100644 index 439228c79..000000000 --- a/tests/testPose2SLAMwSPCG.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @file testPose2SLAMwSPCG - * @author Alex Cunningham - */ - -#include - -#include -#include - -using namespace std; -using namespace gtsam; -using namespace pose2SLAM; - -const double tol = 1e-5; - -/* ************************************************************************* */ -TEST(testPose2SLAMwSPCG, example1) { - - /* generate synthetic data */ - const SharedNoiseModel sigma(noiseModel::Unit::Create(0.1)); - Key x1(1), x2(2), x3(3), x4(4), x5(5), x6(6), x7(7), x8(8), x9(9); - - // create a 3 by 3 grid - // x3 x6 x9 - // x2 x5 x8 - // x1 x4 x7 - Graph graph; - graph.addConstraint(x1,x2,Pose2(0,2,0),sigma) ; - graph.addConstraint(x2,x3,Pose2(0,2,0),sigma) ; - graph.addConstraint(x4,x5,Pose2(0,2,0),sigma) ; - graph.addConstraint(x5,x6,Pose2(0,2,0),sigma) ; - graph.addConstraint(x7,x8,Pose2(0,2,0),sigma) ; - graph.addConstraint(x8,x9,Pose2(0,2,0),sigma) ; - graph.addConstraint(x1,x4,Pose2(2,0,0),sigma) ; - graph.addConstraint(x4,x7,Pose2(2,0,0),sigma) ; - graph.addConstraint(x2,x5,Pose2(2,0,0),sigma) ; - graph.addConstraint(x5,x8,Pose2(2,0,0),sigma) ; - graph.addConstraint(x3,x6,Pose2(2,0,0),sigma) ; - graph.addConstraint(x6,x9,Pose2(2,0,0),sigma) ; - graph.addPrior(x1, Pose2(0,0,0), sigma) ; - - Values initial; - initial.insert(x1, Pose2( 0, 0, 0)); - initial.insert(x2, Pose2( 0, 2.1, 0.01)); - initial.insert(x3, Pose2( 0, 3.9,-0.01)); - initial.insert(x4, Pose2(2.1,-0.1, 0)); - initial.insert(x5, Pose2(1.9, 2.1, 0.02)); - initial.insert(x6, Pose2(2.0, 3.9,-0.02)); - initial.insert(x7, Pose2(4.0, 0.1, 0.03 )); - initial.insert(x8, Pose2(3.9, 2.1, 0.01)); - initial.insert(x9, Pose2(4.1, 3.9,-0.01)); - - Values expected; - expected.insert(x1, Pose2(0.0, 0.0, 0.0)); - expected.insert(x2, Pose2(0.0, 2.0, 0.0)); - expected.insert(x3, Pose2(0.0, 4.0, 0.0)); - expected.insert(x4, Pose2(2.0, 0.0, 0.0)); - expected.insert(x5, Pose2(2.0, 2.0, 0.0)); - expected.insert(x6, Pose2(2.0, 4.0, 0.0)); - expected.insert(x7, Pose2(4.0, 0.0, 0.0 )); - expected.insert(x8, Pose2(4.0, 2.0, 0.0)); - expected.insert(x9, Pose2(4.0, 4.0, 0.0)); - - Values actual = optimizeSPCG(graph, initial); - - EXPECT(assert_equal(expected, actual, tol)); -} - -/* ************************************************************************* */ -int main() { TestResult tr; return TestRegistry::runAllTests(tr); } -/* ************************************************************************* */ From 69e91e32b64eaeda4b60f77ded8cd4cbcf6ab1fe Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 17:57:30 +0000 Subject: [PATCH 039/914] Fixed some test targets --- .cproject | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.cproject b/.cproject index 5ee6f0fdb..9cd83790e 100644 --- a/.cproject +++ b/.cproject @@ -689,18 +689,26 @@ true true - + make -j5 - nonlinear.testValues.run + testValues.run true true true - + make -j5 - nonlinear.testOrdering.run + testOrdering.run + true + true + true + + + make + -j5 + testKey.run true true true From 67892e59e0fa24eefd33326cb735b2a76734b426 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 17:58:03 +0000 Subject: [PATCH 040/914] fixed print/headers --- gtsam/inference/BayesNet-inl.h | 2 +- gtsam/nonlinear/Symbol.h | 16 ++++++++++------ gtsam/nonlinear/Values.h | 12 ++++++------ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 7ff8fc076..53e0ec18d 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -37,7 +37,7 @@ namespace gtsam { /* ************************************************************************* */ template void BayesNet::print(const string& s) const { - cout << s << ":\n"; + cout << s; BOOST_REVERSE_FOREACH(sharedConditional conditional,conditionals_) conditional->print(); } diff --git a/gtsam/nonlinear/Symbol.h b/gtsam/nonlinear/Symbol.h index f671a4b30..03fd4aa1f 100644 --- a/gtsam/nonlinear/Symbol.h +++ b/gtsam/nonlinear/Symbol.h @@ -18,8 +18,8 @@ #pragma once -#include -#include +#include + #include #include #include @@ -28,7 +28,8 @@ #include #include -#include +#include +#include namespace gtsam { @@ -70,8 +71,8 @@ public: j_ = key & indexMask; } - /** Cast to integer */ - operator Key() const { + /** return Key (integer) representation */ + Key key() const { const size_t keyBits = sizeof(Key) * 8; const size_t chrBits = sizeof(unsigned char) * 8; const size_t indexBits = keyBits - chrBits; @@ -83,9 +84,12 @@ public: return key; } + /** Cast to integer */ + operator Key() const { return key(); } + // Testable Requirements void print(const std::string& s = "") const { - std::cout << s << ": " << (std::string) (*this) << std::endl; + std::cout << s << (std::string) (*this) << std::endl; } bool equals(const Symbol& expected, double tol = 0.0) const { return (*this) == expected; diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 4af8e5a3e..4a03ab05e 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -24,8 +24,10 @@ #pragma once -#include -#include +#include +#include +#include +#include #include #include @@ -37,10 +39,8 @@ #include #include -#include -#include -#include -#include +#include +#include namespace gtsam { From 9394ede66b1f1760399a2a7439cb38109112056b Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 17:58:27 +0000 Subject: [PATCH 041/914] Added print, moved instance variables --- gtsam/nonlinear/Marginals.cpp | 8 +++++++ gtsam/nonlinear/Marginals.h | 43 +++++++++++++++++++---------------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index 34d620bc2..ec837bc26 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -43,6 +43,14 @@ Marginals::Marginals(const NonlinearFactorGraph& graph, const Values& solution, bayesTree_ = *GaussianMultifrontalSolver(graph_, true).eliminate(); } +/* ************************************************************************* */ +void Marginals::print(const std::string& str, const KeyFormatter& keyFormatter) const { + ordering_.print(str+"Ordering: ", keyFormatter); + graph_.print(str+"Graph: "); + values_.print(str+"Solution: ", keyFormatter); + bayesTree_.print(str+"Bayes Tree: "); +} + /* ************************************************************************* */ Matrix Marginals::marginalCovariance(Key variable) const { return marginalInformation(variable).inverse(); diff --git a/gtsam/nonlinear/Marginals.h b/gtsam/nonlinear/Marginals.h index 77bccdfd2..afbeed43d 100644 --- a/gtsam/nonlinear/Marginals.h +++ b/gtsam/nonlinear/Marginals.h @@ -40,6 +40,16 @@ public: QR }; +protected: + + GaussianFactorGraph graph_; + Ordering ordering_; + Values values_; + Factorization factorization_; + GaussianBayesTree bayesTree_; + +public: + /** Construct a marginals class. * @param graph The factor graph defining the full joint density on all variables. * @param solution The linearization point about which to compute Gaussian marginals (usually the MLE as obtained from a NonlinearOptimizer). @@ -47,6 +57,9 @@ public: */ Marginals(const NonlinearFactorGraph& graph, const Values& solution, Factorization factorization = CHOLESKY); + /** print */ + void print(const std::string& str = "Marginals: ", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; + /** Compute the marginal covariance of a single variable */ Matrix marginalCovariance(Key variable) const; @@ -60,14 +73,6 @@ public: /** Compute the joint marginal information of several variables */ JointMarginal jointMarginalInformation(const std::vector& variables) const; - -protected: - - GaussianFactorGraph graph_; - Values values_; - Ordering ordering_; - Factorization factorization_; - GaussianBayesTree bayesTree_; }; /** @@ -76,7 +81,17 @@ protected: class JointMarginal { protected: - typedef SymmetricBlockView BlockView; + + typedef SymmetricBlockView BlockView; + + Matrix fullMatrix_; + BlockView blockView_; + Ordering indices_; + + JointMarginal(const Matrix& fullMatrix, const std::vector& dims, const Ordering& indices) : + fullMatrix_(fullMatrix), blockView_(fullMatrix_, dims.begin(), dims.end()), indices_(indices) {} + + friend class Marginals; public: /** A block view of the joint marginal - this stores a reference to the @@ -101,16 +116,6 @@ public: */ Block operator()(Key iVariable, Key jVariable) const { return blockView_(indices_[iVariable], indices_[jVariable]); } - -protected: - Matrix fullMatrix_; - BlockView blockView_; - Ordering indices_; - - JointMarginal(const Matrix& fullMatrix, const std::vector& dims, const Ordering& indices) : - fullMatrix_(fullMatrix), blockView_(fullMatrix_, dims.begin(), dims.end()), indices_(indices) {} - - friend class Marginals; }; } /* namespace gtsam */ From 382e3311fda4401f80c59a50b9bbf103372c85da Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 17:58:50 +0000 Subject: [PATCH 042/914] test new key() method --- gtsam/nonlinear/tests/testKey.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtsam/nonlinear/tests/testKey.cpp b/gtsam/nonlinear/tests/testKey.cpp index 54a2e504a..dedb45332 100644 --- a/gtsam/nonlinear/tests/testKey.cpp +++ b/gtsam/nonlinear/tests/testKey.cpp @@ -27,11 +27,11 @@ using namespace gtsam; /* ************************************************************************* */ TEST(Key, KeySymbolConversion) { - Symbol expected('j', 4); - Key key(expected); + Symbol original('j', 4); + Key key(original); + EXPECT(assert_equal(key, original.key())) Symbol actual(key); - - EXPECT(assert_equal(expected, actual)) + EXPECT(assert_equal(original, actual)) } /* ************************************************************************* */ From 8a69bb8bcb7b8f67ebb8415e1842813843477975 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 22 May 2012 19:01:40 +0000 Subject: [PATCH 043/914] Added marginals in MATLAB, but had to fix a bug in converting from 64 bit ints to size_t. This begs the question what happens on 32-bit machines with Symbols. --- examples/LocalizationExample.cpp | 2 +- examples/matlab/LocalizationExample.m | 10 +++---- gtsam.h | 38 +++++++++++++++++---------- wrap/matlab.h | 36 +++++++++++++++++-------- 4 files changed, 55 insertions(+), 31 deletions(-) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index 6963f75f1..2d2357dad 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -64,7 +64,7 @@ int main(int argc, char** argv) { result.print("\nFinal result:\n "); // Query the marginals - Marginals marginals(graph, result); + Marginals marginals = graph.marginals(result); cout.precision(2); cout << "\nP1:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(1)) << endl; cout << "\nP2:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(2)) << endl; diff --git a/examples/matlab/LocalizationExample.m b/examples/matlab/LocalizationExample.m index 361a1c8b1..4aa122dd8 100644 --- a/examples/matlab/LocalizationExample.m +++ b/examples/matlab/LocalizationExample.m @@ -43,8 +43,8 @@ initialEstimate.print(sprintf('\nInitial estimate:\n ')); result = graph.optimize(initialEstimate); result.print(sprintf('\nFinal result:\n ')); -%% Use an explicit Optimizer object so we can query the marginals -% marginals = gtsamMarginals(graph, result); -% marginals.marginalCovariance(pose2SLAMPoseKey(1)) -% marginals.marginalCovariance(pose2SLAMPoseKey(2)) -% marginals.marginalCovariance(pose2SLAMPoseKey(3)) +%% Query the marginals +marginals = graph.marginals(result); +x1=gtsamSymbol('x',1); marginals.marginalCovariance(x1.key) +x2=gtsamSymbol('x',2); marginals.marginalCovariance(x2.key) +x3=gtsamSymbol('x',3); marginals.marginalCovariance(x3.key) diff --git a/gtsam.h b/gtsam.h index 628c91733..665b9bb52 100644 --- a/gtsam.h +++ b/gtsam.h @@ -347,13 +347,14 @@ class GaussianFactorGraph { // Building the graph void add(gtsam::JacobianFactor* factor); - void add(Vector b); - void add(int key1, Matrix A1, Vector b, const gtsam::SharedDiagonal& model); - void add(int key1, Matrix A1, int key2, Matrix A2, Vector b, - const gtsam::SharedDiagonal& model); - void add(int key1, Matrix A1, int key2, Matrix A2, int key3, Matrix A3, - Vector b, const gtsam::SharedDiagonal& model); - void add(gtsam::HessianFactor* factor); + // all these won't work as MATLAB can't handle overloading +// void add(Vector b); +// void add(int key1, Matrix A1, Vector b, const gtsam::SharedDiagonal& model); +// void add(int key1, Matrix A1, int key2, Matrix A2, Vector b, +// const gtsam::SharedDiagonal& model); +// void add(int key1, Matrix A1, int key2, Matrix A2, int key3, Matrix A3, +// Vector b, const gtsam::SharedDiagonal& model); +// void add(gtsam::HessianFactor* factor); // error and probability double error(const gtsam::VectorValues& c) const; @@ -380,7 +381,7 @@ class GaussianSequentialSolver { class KalmanFilter { KalmanFilter(size_t n); - gtsam::GaussianDensity* init(Vector x0, const gtsam::SharedDiagonal& P0); + // gtsam::GaussianDensity* init(Vector x0, const gtsam::SharedDiagonal& P0); gtsam::GaussianDensity* init(Vector x0, Matrix P0); void print(string s) const; static int step(gtsam::GaussianDensity* p); @@ -400,6 +401,12 @@ class KalmanFilter { // nonlinear //************************************************************************* +class Symbol { + Symbol(char c, size_t j); + void print(string s) const; + size_t key() const; +}; + class Ordering { Ordering(); void print(string s) const; @@ -407,20 +414,21 @@ class Ordering { void push_back(size_t key); }; -//Andrew says: Required definitions for Marginal arguments class NonlinearFactorGraph { NonlinearFactorGraph(); - //This need to be populated with whatever functions might be needed. }; class Values { Values(); - //Same here + void print(string s) const; + bool exists(size_t j) const; }; -// Frank says: this does not work. Why not? class Marginals { Marginals(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& solution); + void print(string s) const; + Matrix marginalCovariance(size_t variable) const; + Matrix marginalInformation(size_t variable) const; }; }///\namespace gtsam @@ -471,7 +479,7 @@ class Odometry { }///\namespace planarSLAM //************************************************************************* -// gtsam::Pose2SLAM +// Pose2SLAM //************************************************************************* #include @@ -481,6 +489,7 @@ class Values { Values(); void print(string s) const; void insertPose(int key, const gtsam::Pose2& pose); + gtsam::Symbol poseKey(int i); gtsam::Pose2 pose(int i); }; @@ -497,7 +506,8 @@ class Graph { void addPrior(int key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); void addPoseConstraint(int key, const gtsam::Pose2& pose); void addOdometry(int key1, int key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); - pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate); + pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate) const; + gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; }; }///\namespace pose2SLAM diff --git a/wrap/matlab.h b/wrap/matlab.h index 2ef81f37f..b6d200e43 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -206,39 +206,53 @@ string unwrap(const mxArray* array) { return str; } +// Check for 64-bit, as Mathworks says mxGetScalar only good for 32 bit +template +T myGetScalar(const mxArray* array) { + switch (mxGetClassID(array)) { + case mxINT64_CLASS: + return (T) *(int64_t*) mxGetData(array); + case mxUINT64_CLASS: + return (T) *(uint64_t*) mxGetData(array); + default: + // hope for the best! + return (T) mxGetScalar(array); + } +} + // specialization to bool template<> bool unwrap(const mxArray* array) { checkScalar(array,"unwrap"); - return mxGetScalar(array) != 0.0; + return myGetScalar(array); } // specialization to bool template<> char unwrap(const mxArray* array) { checkScalar(array,"unwrap"); - return (char)mxGetScalar(array); -} - -// specialization to size_t -template<> -size_t unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return (size_t)mxGetScalar(array); + return myGetScalar(array); } // specialization to int template<> int unwrap(const mxArray* array) { checkScalar(array,"unwrap"); - return (int)mxGetScalar(array); + return myGetScalar(array); +} + +// specialization to size_t +template<> +size_t unwrap(const mxArray* array) { + checkScalar(array, "unwrap"); + return myGetScalar(array); } // specialization to double template<> double unwrap(const mxArray* array) { checkScalar(array,"unwrap"); - return (double)mxGetScalar(array); + return myGetScalar(array); } // specialization to Eigen vector From 7fc7bd8f4d9f875d4248bd171c7772e8d00f26fe Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 22 May 2012 20:37:09 +0000 Subject: [PATCH 044/914] Created branch /branches/windows from /trunk:10699 From 2060f1dd22b9e960bb83076b1a60f07e871802e4 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 22 May 2012 20:37:13 +0000 Subject: [PATCH 045/914] Initial changes to compile on windows --- CMakeLists.txt | 5 ++++- gtsam/CMakeLists.txt | 4 +++- gtsam/base/timing.cpp | 7 ++----- gtsam/base/timing.h | 6 +++++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d2acb464..8bdbc486a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ include(GtsamTesting) include(GtsamPrinting) # guard against in-source builds -if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} AND NOT MSVC) message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. ") endif() @@ -94,6 +94,9 @@ if (GTSAM_BUILD_TESTS) endif() # Find boost +if(MSVC) + set(Boost_USE_STATIC_LIBS 1) +endif() find_package(Boost 1.40 COMPONENTS serialization REQUIRED) # General build settings diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index b3e639917..2adc83365 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -71,6 +71,8 @@ set(gtsam_srcs ${slam_srcs} ) +#gtsam_assign_source_folders("${gtsam_srcs}") + # Versions set(gtsam_version ${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}) set(gtsam_soversion ${GTSAM_VERSION_MAJOR}) @@ -97,6 +99,6 @@ if (GTSAM_BUILD_SHARED_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) - install(TARGETS gtsam-shared LIBRARY DESTINATION lib ) + install(TARGETS gtsam-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) endif(GTSAM_BUILD_SHARED_LIBRARY) diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index 1388c2f18..393791e6a 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -153,15 +152,13 @@ const boost::shared_ptr& TimingOutline::child(size_t child, const void TimingOutline::tic() { assert(!timerActive_); timerActive_ = true; - gettimeofday(&t0_, NULL); + t0_ = clock_t::now(); } /* ************************************************************************* */ void TimingOutline::toc() { - struct timeval t; - gettimeofday(&t, NULL); assert(timerActive_); - add(t.tv_sec*1000000 + t.tv_usec - (t0_.tv_sec*1000000 + t0_.tv_usec)); + add(boost::chrono::duration_cast(clock_t::now() - t0_).count()); timerActive_ = false; } diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index 94498c3b3..56ac1a762 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -22,6 +22,7 @@ #include #include #include +#include class TimingOutline; extern boost::shared_ptr timingRoot; @@ -29,6 +30,9 @@ extern boost::weak_ptr timingCurrent; class TimingOutline { protected: + typedef boost::chrono::high_resolution_clock clock_t; + typedef boost::chrono::microseconds duration_t; + size_t t_; double t2_ ; /* cache the \sum t_i^2 */ size_t tIt_; @@ -39,7 +43,7 @@ protected: boost::weak_ptr parent_; std::vector > children_; - struct timeval t0_; + clock_t::time_point t0_; bool timerActive_; void add(size_t usecs); From 25a53815e01664d52847eaa41ade058d216b18ff Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 22 May 2012 22:52:08 +0000 Subject: [PATCH 046/914] Initial changes to compile on windows --- gtsam/base/DerivedValue.h | 2 +- gtsam/base/Matrix.cpp | 1 + gtsam/base/Matrix.h | 3 ++- gtsam/base/Vector.cpp | 5 +++-- gtsam/base/cholesky.cpp | 13 +++++++------ gtsam/base/timing.cpp | 8 +++++--- gtsam/base/types.h | 16 +++++++++++++++- 7 files changed, 34 insertions(+), 14 deletions(-) diff --git a/gtsam/base/DerivedValue.h b/gtsam/base/DerivedValue.h index 1919f9540..83ecea510 100644 --- a/gtsam/base/DerivedValue.h +++ b/gtsam/base/DerivedValue.h @@ -50,7 +50,7 @@ public: * Destroy and deallocate this object, only if it was originally allocated using clone_(). */ virtual void deallocate_() const { - this->~Value(); + this->Value::~Value(); boost::singleton_pool::free((void*)this); } diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index 849dc3f5a..050f66ff0 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -15,6 +15,7 @@ * @author Christian Potthast */ +#include #include #include #include diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index 3a70d9b76..fd7dac1fc 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -26,6 +26,7 @@ #include #include #include +#include /** * Matrix is a typedef in the gtsam namespace @@ -87,7 +88,7 @@ bool equal_with_abs_tol(const Eigen::DenseBase& A, const Eigen::DenseBas for(size_t i=0; i tol) return false; diff --git a/gtsam/base/Vector.cpp b/gtsam/base/Vector.cpp index 27b56830c..2d319961d 100644 --- a/gtsam/base/Vector.cpp +++ b/gtsam/base/Vector.cpp @@ -35,6 +35,7 @@ #include #include +#include using namespace std; @@ -169,7 +170,7 @@ bool equal_with_abs_tol(const Vector& vec1, const Vector& vec2, double tol) { if (vec1.size()!=vec2.size()) return false; size_t m = vec1.size(); for(size_t i=0; i tol) return false; @@ -182,7 +183,7 @@ bool equal_with_abs_tol(const SubVector& vec1, const SubVector& vec2, double tol if (vec1.size()!=vec2.size()) return false; size_t m = vec1.size(); for(size_t i=0; i tol) return false; diff --git a/gtsam/base/cholesky.cpp b/gtsam/base/cholesky.cpp index 66bbbde55..84c03f78b 100644 --- a/gtsam/base/cholesky.cpp +++ b/gtsam/base/cholesky.cpp @@ -16,6 +16,10 @@ * @date Nov 5, 2010 */ +#include +#include +#include + #include #include #include @@ -23,9 +27,6 @@ #include #include -#include -#include - using namespace std; namespace gtsam { @@ -129,7 +130,7 @@ void choleskyPartial(Matrix& ABC, size_t nFrontal) { tic(1, "lld"); ABC.block(0,0,nFrontal,nFrontal).triangularView() = ABC.block(0,0,nFrontal,nFrontal).selfadjointView().llt().matrixU(); - assert(ABC.topLeftCorner(nFrontal,nFrontal).triangularView().toDenseMatrix().unaryExpr(&isfinite).all()); + assert(ABC.topLeftCorner(nFrontal,nFrontal).triangularView().toDenseMatrix().unaryExpr(ptr_fun(isfinite)).all()); toc(1, "lld"); if(debug) cout << "R:\n" << Eigen::MatrixXd(ABC.topLeftCorner(nFrontal,nFrontal).triangularView()) << endl; @@ -140,7 +141,7 @@ void choleskyPartial(Matrix& ABC, size_t nFrontal) { ABC.topLeftCorner(nFrontal,nFrontal).triangularView().transpose().solveInPlace( ABC.topRightCorner(nFrontal, n-nFrontal)); } - assert(ABC.topRightCorner(nFrontal, n-nFrontal).unaryExpr(&isfinite).all()); + assert(ABC.topRightCorner(nFrontal, n-nFrontal).unaryExpr(ptr_fun(isfinite)).all()); if(debug) cout << "S:\n" << ABC.topRightCorner(nFrontal, n-nFrontal) << endl; toc(2, "compute S"); @@ -150,7 +151,7 @@ void choleskyPartial(Matrix& ABC, size_t nFrontal) { if(n - nFrontal > 0) ABC.bottomRightCorner(n-nFrontal,n-nFrontal).selfadjointView().rankUpdate( ABC.topRightCorner(nFrontal, n-nFrontal).transpose(), -1.0); - assert(ABC.bottomRightCorner(n-nFrontal,n-nFrontal).selfadjointView().toDenseMatrix().unaryExpr(&isfinite).all()); + assert(ABC.bottomRightCorner(n-nFrontal,n-nFrontal).selfadjointView().toDenseMatrix().unaryExpr(ptr_fun(isfinite)).all()); if(debug) cout << "L:\n" << Eigen::MatrixXd(ABC.bottomRightCorner(n-nFrontal,n-nFrontal).selfadjointView()) << endl; toc(3, "compute L"); } diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index 393791e6a..305f86a74 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -241,9 +241,11 @@ void Timing::print() { /* ************************************************************************* */ double _tic_() { - struct timeval t; - gettimeofday(&t, NULL); - return ((double)t.tv_sec + ((double)t.tv_usec)/1000000.); + typedef boost::chrono::high_resolution_clock clock_t; + typedef boost::chrono::duration duration_t; + + clock_t::time_point t = clock_t::now(); + return boost::chrono::duration_cast< duration_t >(t.time_since_epoch()).count(); } /* ************************************************************************* */ diff --git a/gtsam/base/types.h b/gtsam/base/types.h index b6c5617a5..6106f49fd 100644 --- a/gtsam/base/types.h +++ b/gtsam/base/types.h @@ -19,7 +19,7 @@ #pragma once -#include +#include namespace gtsam { @@ -71,3 +71,17 @@ namespace gtsam { } +#ifdef _MSC_VER + +#include +using boost::math::isfinite; +using boost::math::isnan; +using boost::math::isinf; + +#include +#ifndef M_PI +#define M_PI (boost::math::constants::pi()) +#endif + +#endif + From 510e2eacac8ca366bae1e075ccb798d83393eeed Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 22 May 2012 22:52:17 +0000 Subject: [PATCH 047/914] More progress in compiling on windows --- gtsam/base/Matrix.cpp | 4 +-- gtsam/base/Vector.cpp | 28 +++++++++---------- gtsam/base/Vector.h | 1 + gtsam/base/types.h | 8 ++++++ gtsam/discrete/Signature.cpp | 11 ++++---- gtsam/geometry/Point3.h | 3 +- gtsam/inference/BayesTree-inl.h | 4 +-- gtsam/inference/ClusterTree-inl.h | 2 +- .../inference/GenericMultifrontalSolver-inl.h | 9 +++--- gtsam/linear/GaussianConditional.cpp | 4 +-- gtsam/linear/HessianFactor.cpp | 6 ++-- gtsam/linear/JacobianFactor.cpp | 6 ++-- gtsam/linear/NoiseModel.h | 3 +- gtsam/nonlinear/DoglegOptimizerImpl.cpp | 9 +++--- gtsam/nonlinear/ISAM2-impl.cpp | 5 ++-- .../nonlinear/LevenbergMarquardtOptimizer.cpp | 4 ++- gtsam/slam/pose2SLAM.cpp | 2 +- 17 files changed, 62 insertions(+), 47 deletions(-) diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index 050f66ff0..57a45d4a1 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -26,8 +26,8 @@ #include #include -#include -#include +#include +#include #include #include #include diff --git a/gtsam/base/Vector.cpp b/gtsam/base/Vector.cpp index 2d319961d..98ad43e05 100644 --- a/gtsam/base/Vector.cpp +++ b/gtsam/base/Vector.cpp @@ -16,7 +16,7 @@ * @author Frank Dellaert */ -#include +#include #include #include #include @@ -25,11 +25,7 @@ #include #include #include -#include - -#ifdef WIN32 -#include -#endif +#include #include #include @@ -37,6 +33,10 @@ #include #include +//#ifdef WIN32 +//#include +//#endif + using namespace std; boost::minstd_rand generator(42u); @@ -56,11 +56,11 @@ void odprintf_(const char *format, ostream& stream, ...) { #endif va_end(args); -#ifdef WIN32 - OutputDebugString(buf); -#else +//#ifdef WIN32 +// OutputDebugString(buf); +//#else stream << buf; -#endif +//#endif } /* ************************************************************************* */ @@ -77,11 +77,11 @@ void odprintf(const char *format, ...) { #endif va_end(args); -#ifdef WIN32 - OutputDebugString(buf); -#else +//#ifdef WIN32 +// OutputDebugString(buf); +//#else cout << buf; -#endif +//#endif } /* ************************************************************************* */ diff --git a/gtsam/base/Vector.h b/gtsam/base/Vector.h index 84fd506cb..b4be74f4e 100644 --- a/gtsam/base/Vector.h +++ b/gtsam/base/Vector.h @@ -22,6 +22,7 @@ #include #include +#include #include #include diff --git a/gtsam/base/types.h b/gtsam/base/types.h index 6106f49fd..e9264d516 100644 --- a/gtsam/base/types.h +++ b/gtsam/base/types.h @@ -84,4 +84,12 @@ using boost::math::isinf; #endif #endif + +#ifdef min +#undef min +#endif + +#ifdef max +#undef max +#endif diff --git a/gtsam/discrete/Signature.cpp b/gtsam/discrete/Signature.cpp index ee7c1e59a..439f20864 100644 --- a/gtsam/discrete/Signature.cpp +++ b/gtsam/discrete/Signature.cpp @@ -33,6 +33,7 @@ namespace gtsam { #ifdef BOOST_HAVE_PARSER namespace qi = boost::spirit::qi; + namespace ph = boost::phoenix; // parser for strings of form "99/1 80/20" etc... namespace parser { @@ -85,9 +86,9 @@ namespace gtsam { // check for OR, AND on whole phrase It f = spec.begin(), l = spec.end(); if (qi::parse(f, l, - qi::lit("OR")[ref(table) = logic(false, true, true, true)]) || + qi::lit("OR")[ph::ref(table) = logic(false, true, true, true)]) || qi::parse(f, l, - qi::lit("AND")[ref(table) = logic(false, false, false, true)])) + qi::lit("AND")[ph::ref(table) = logic(false, false, false, true)])) return true; // tokenize into separate rows @@ -97,9 +98,9 @@ namespace gtsam { Signature::Row values; It tf = token.begin(), tl = token.end(); bool r = qi::parse(tf, tl, - qi::double_[push_back(ref(values), qi::_1)] >> +("/" >> qi::double_[push_back(ref(values), qi::_1)]) | - qi::lit("T")[ref(values) = T] | - qi::lit("F")[ref(values) = F] ); + qi::double_[push_back(ph::ref(values), qi::_1)] >> +("/" >> qi::double_[push_back(ph::ref(values), qi::_1)]) | + qi::lit("T")[ph::ref(values) = T] | + qi::lit("F")[ph::ref(values) = F] ); if (!r) return false; table.push_back(values); diff --git a/gtsam/geometry/Point3.h b/gtsam/geometry/Point3.h index 9eeb748db..7f7845dfb 100644 --- a/gtsam/geometry/Point3.h +++ b/gtsam/geometry/Point3.h @@ -21,6 +21,7 @@ #pragma once +#include #include #include @@ -150,7 +151,7 @@ namespace gtsam { /** distance between two points */ double dist(const Point3& p2) const { - return sqrt(pow(x()-p2.x(),2.0) + pow(y()-p2.y(),2.0) + pow(z()-p2.z(),2.0)); + return std::sqrt(pow(x()-p2.x(),2.0) + pow(y()-p2.y(),2.0) + pow(z()-p2.z(),2.0)); } /** Distance of the point from the origin */ diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 95b070739..00cd38609 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -53,7 +53,7 @@ namespace gtsam { template void BayesTree::getCliqueData(CliqueData& data, - BayesTree::sharedClique clique) const { + typename BayesTree::sharedClique clique) const { data.conditionalSizes.push_back((*clique)->nrFrontals()); data.separatorSizes.push_back((*clique)->nrParents()); BOOST_FOREACH(sharedClique c, clique->children_) { @@ -74,7 +74,7 @@ namespace gtsam { template void BayesTree::saveGraph(ostream &s, - BayesTree::sharedClique clique, + typename BayesTree::sharedClique clique, int parentnum) const { static int num = 0; bool first = true; diff --git a/gtsam/inference/ClusterTree-inl.h b/gtsam/inference/ClusterTree-inl.h index 0f1f823af..0a0b9e64e 100644 --- a/gtsam/inference/ClusterTree-inl.h +++ b/gtsam/inference/ClusterTree-inl.h @@ -58,7 +58,7 @@ namespace gtsam { /* ************************************************************************* */ template - bool ClusterTree::Cluster::equals(const ClusterTree::Cluster& other) const { + bool ClusterTree::Cluster::equals(const Cluster& other) const { if (frontal != other.frontal) return false; if (separator != other.separator) return false; if (children_.size() != other.children_.size()) return false; diff --git a/gtsam/inference/GenericMultifrontalSolver-inl.h b/gtsam/inference/GenericMultifrontalSolver-inl.h index 652db02ca..b24db8484 100644 --- a/gtsam/inference/GenericMultifrontalSolver-inl.h +++ b/gtsam/inference/GenericMultifrontalSolver-inl.h @@ -49,15 +49,14 @@ namespace gtsam { } /* ************************************************************************* */ - template - typename BayesTree::shared_ptr GenericMultifrontalSolver::eliminate( - typename FactorGraph::Eliminate function) const { + template + typename BayesTree::shared_ptr GenericMultifrontalSolver::eliminate(Eliminate function) const { // eliminate junction tree, returns pointer to root - typename BayesTree::sharedClique root = junctionTree_->eliminate(function); + typename BayesTree::sharedClique root = junctionTree_->eliminate(function); // create an empty Bayes tree and insert root clique - typename BayesTree::shared_ptr bayesTree(new BayesTree); + typename BayesTree::shared_ptr bayesTree(new BayesTree); bayesTree->insert(root); // return the Bayes tree diff --git a/gtsam/linear/GaussianConditional.cpp b/gtsam/linear/GaussianConditional.cpp index de459a00f..c048c8dd8 100644 --- a/gtsam/linear/GaussianConditional.cpp +++ b/gtsam/linear/GaussianConditional.cpp @@ -73,7 +73,7 @@ GaussianConditional::GaussianConditional(Index key, const Vector& d, const Matri const Matrix& R, const list >& parents, const Vector& sigmas) : IndexConditional(key, GetKeys(parents.size(), parents.begin(), parents.end())), rsd_(matrix_), sigmas_(sigmas) { assert(R.rows() <= R.cols()); - size_t dims[1+parents.size()+1]; + size_t* dims = (size_t*)alloca(sizeof(size_t)*(1+parents.size()+1)); // FIXME: alloca is bad, just ask Google. dims[0] = R.cols(); size_t j=1; std::list >::const_iterator parent=parents.begin(); @@ -95,7 +95,7 @@ GaussianConditional::GaussianConditional(const std::list Index_Matrix; BOOST_FOREACH(const Index_Matrix& term, terms) { diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index b1f829005..ebe94514b 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -188,7 +188,7 @@ HessianFactor::HessianFactor(const std::vector& js, const std::vectorsecond.slot; @@ -399,7 +399,7 @@ void HessianFactor::updateATA(const JacobianFactor& update, const Scatter& scatt // First build an array of slots tic(1, "slots"); - size_t slots[update.size()]; + size_t* slots = (size_t*)alloca(sizeof(size_t)*update.size()); // FIXME: alloca is bad, just ask Google. size_t slot = 0; BOOST_FOREACH(Index j, update) { slots[slot] = scatter.find(j)->second.slot; diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index e2facec40..37fd74c39 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -118,7 +118,7 @@ namespace gtsam { GaussianFactor(GetKeys(terms.size(), terms.begin(), terms.end())), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { - size_t dims[terms.size()+1]; + size_t* dims = (size_t*)alloca(sizeof(size_t)*(terms.size()+1)); // FIXME: alloca is bad, just ask Google. for(size_t j=0; j >::const_iterator term=terms.begin(); for(; term!=terms.end(); ++term,++j) @@ -488,7 +488,7 @@ namespace gtsam { size_t>& varDims, size_t m) { keys_.resize(variableSlots.size()); std::transform(variableSlots.begin(), variableSlots.end(), begin(), - bind(&VariableSlots::const_iterator::value_type::first, + boost::bind(&VariableSlots::const_iterator::value_type::first, boost::lambda::_1)); varDims.push_back(1); Ab_.copyStructureFrom(BlockAb(matrix_, varDims.begin(), varDims.end(), m)); diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index b6cf4deac..87391be0a 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -20,6 +20,7 @@ #include #include +#include namespace gtsam { @@ -609,7 +610,7 @@ namespace gtsam { virtual bool equals(const Base& expected, const double tol=1e-8) const = 0; inline double sqrtWeight(const double &error) const - { return sqrt(weight(error)); } + { return std::sqrt(weight(error)); } /** produce a weight vector according to an error vector and the implemented * robust function */ diff --git a/gtsam/nonlinear/DoglegOptimizerImpl.cpp b/gtsam/nonlinear/DoglegOptimizerImpl.cpp index 480d76f6a..ccfdf781a 100644 --- a/gtsam/nonlinear/DoglegOptimizerImpl.cpp +++ b/gtsam/nonlinear/DoglegOptimizerImpl.cpp @@ -15,6 +15,7 @@ * @author Richard Roberts */ +#include #include namespace gtsam { @@ -27,12 +28,12 @@ VectorValues DoglegOptimizerImpl::ComputeDoglegPoint( double DeltaSq = Delta*Delta; double x_u_norm_sq = dx_u.vector().squaredNorm(); double x_n_norm_sq = dx_n.vector().squaredNorm(); - if(verbose) cout << "Steepest descent magnitude " << sqrt(x_u_norm_sq) << ", Newton's method magnitude " << sqrt(x_n_norm_sq) << endl; + if(verbose) cout << "Steepest descent magnitude " << std::sqrt(x_u_norm_sq) << ", Newton's method magnitude " << std::sqrt(x_n_norm_sq) << endl; if(DeltaSq < x_u_norm_sq) { // Trust region is smaller than steepest descent update VectorValues x_d = VectorValues::SameStructure(dx_u); - x_d.vector() = dx_u.vector() * sqrt(DeltaSq / x_u_norm_sq); - if(verbose) cout << "In steepest descent region with fraction " << sqrt(DeltaSq / x_u_norm_sq) << " of steepest descent magnitude" << endl; + x_d.vector() = dx_u.vector() * std::sqrt(DeltaSq / x_u_norm_sq); + if(verbose) cout << "In steepest descent region with fraction " << std::sqrt(DeltaSq / x_u_norm_sq) << " of steepest descent magnitude" << endl; return x_d; } else if(DeltaSq < x_n_norm_sq) { // Trust region boundary is between steepest descent point and Newton's method point @@ -59,7 +60,7 @@ VectorValues DoglegOptimizerImpl::ComputeBlend(double Delta, const VectorValues& const double a = uu - 2.*un + nn; const double b = 2. * (un - uu); const double c = uu - Delta*Delta; - double sqrt_b_m4ac = sqrt(b*b - 4*a*c); + double sqrt_b_m4ac = std::sqrt(b*b - 4*a*c); // Compute blending parameter double tau1 = (-b + sqrt_b_m4ac) / (2.*a); diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 8fe117e34..e8847e5c0 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -15,6 +15,7 @@ * @author Michael Kaess, Richard Roberts */ +#include #include #include #include @@ -149,7 +150,7 @@ void ISAM2::Impl::ExpmapMasked(Values& values, const Permuted& del cout << " " << keyFormatter(key_value->key) << " (j = " << var << "), delta = " << delta[var].transpose() << endl; } assert(delta[var].size() == (int)key_value->value.dim()); - assert(delta[var].unaryExpr(&isfinite).all()); + assert(delta[var].unaryExpr(ptr_fun(isfinite)).all()); if(mask[var]) { Value* retracted = key_value->value.retract_(delta[var]); key_value->value = *retracted; @@ -305,7 +306,7 @@ size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std: #ifndef NDEBUG for(size_t j=0; j).all()); + assert(delta.container()[j].unaryExpr(ptr_fun(isfinite)).all()); #endif } diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 1b19cfe75..b9523b538 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -16,6 +16,8 @@ * @created Feb 26, 2012 */ +#include + #include #include // For NegativeMatrixException @@ -48,7 +50,7 @@ void LevenbergMarquardtOptimizer::iterate() { // TODO: replace this dampening with a backsubstitution approach GaussianFactorGraph dampedSystem(*linear); { - double sigma = 1.0 / sqrt(state_.lambda); + double sigma = 1.0 / std::sqrt(state_.lambda); dampedSystem.reserve(dampedSystem.size() + dimensions_.size()); // for each of the variables, add a prior for(Index j=0; j Date: Wed, 23 May 2012 12:35:48 +0000 Subject: [PATCH 048/914] Plot covariance ellipses in MATLAB --- examples/matlab/LocalizationExample.m | 24 ++++++++++++++++--- examples/matlab/covarianceEllipse.m | 34 +++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 examples/matlab/covarianceEllipse.m diff --git a/examples/matlab/LocalizationExample.m b/examples/matlab/LocalizationExample.m index 4aa122dd8..521c768ec 100644 --- a/examples/matlab/LocalizationExample.m +++ b/examples/matlab/LocalizationExample.m @@ -45,6 +45,24 @@ result.print(sprintf('\nFinal result:\n ')); %% Query the marginals marginals = graph.marginals(result); -x1=gtsamSymbol('x',1); marginals.marginalCovariance(x1.key) -x2=gtsamSymbol('x',2); marginals.marginalCovariance(x2.key) -x3=gtsamSymbol('x',3); marginals.marginalCovariance(x3.key) +x{1}=gtsamSymbol('x',1); P{1}=marginals.marginalCovariance(x{1}.key) +x{2}=gtsamSymbol('x',2); P{2}=marginals.marginalCovariance(x{2}.key) +x{3}=gtsamSymbol('x',3); P{3}=marginals.marginalCovariance(x{3}.key) + +%% Plot Trajectory +figure(1) +clf +X=[];Y=[]; +for i=1:3 + pose_i = result.pose(i); + X=[X;pose_i.x]; + Y=[Y;pose_i.y]; +end +plot(X,Y,'b*-'); + +%% Plot Covariance Ellipses +hold on +for i=1:3 + pose_i = result.pose(i); + covarianceEllipse([pose_i.x;pose_i.y],P{i},'g') +end diff --git a/examples/matlab/covarianceEllipse.m b/examples/matlab/covarianceEllipse.m new file mode 100644 index 000000000..106a10d6e --- /dev/null +++ b/examples/matlab/covarianceEllipse.m @@ -0,0 +1,34 @@ +function covarianceEllipse(x,P,color) +% covarianceEllipse: plot a Gaussian as an uncertainty ellipse +% Based on Maybeck Vol 1, page 366 +% k=2.296 corresponds to 1 std, 68.26% of all probability +% k=11.82 corresponds to 3 std, 99.74% of all probability +% +% covarianceEllipse(x,P,color) +% it is assumed x and y are the first two components of state x + +[e,s] = eig(P(1:2,1:2)); +s1 = s(1,1); +s2 = s(2,2); +k = 2.296; +[ex,ey] = ellipse( sqrt(s1*k)*e(:,1), sqrt(s2*k)*e(:,2), x(1:2) ); +line(ex,ey,'color',color); + +function [x,y] = ellipse(a,b,c); +% ellipse: return the x and y coordinates for an ellipse +% [x,y] = ellipse(a,b,c); +% a, and b are the axes. c is the center + +global ellipse_x ellipse_y +if ~exist('elipse_x') + q =0:2*pi/25:2*pi; + ellipse_x = cos(q); + ellipse_y = sin(q); +end + +points = a*ellipse_x + b*ellipse_y; +x = c(1) + points(1,:); +y = c(2) + points(2,:); +end + +end \ No newline at end of file From 3264bd5a3970f9622971bc3887be0264becd198c Mon Sep 17 00:00:00 2001 From: bpeasle Date: Wed, 23 May 2012 15:57:12 +0000 Subject: [PATCH 049/914] Reverted testOccupancyGrid.cpp back so that it does not break make check. --- tests/testOccupancyGrid.cpp | 86 +++++++++---------------------------- 1 file changed, 20 insertions(+), 66 deletions(-) diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp index 35f2df3d8..504d958f5 100644 --- a/tests/testOccupancyGrid.cpp +++ b/tests/testOccupancyGrid.cpp @@ -286,84 +286,38 @@ TEST_UNSAFE( OccupancyGrid, Test1) { //Build a small grid and test optimization //Build small grid - double width = 20; //meters - double height = 20; //meters - double resolution = 0.2; //meters + double width = 3; //meters + double height = 2; //meters + double resolution = 0.5; //meters OccupancyGrid occupancyGrid(width, height, resolution); //default center to middle //Add measurements -// Pose2 pose(0,0,0); -// double range = 4.499765; -// -// occupancyGrid.addPrior(0, 0.7); -// EXPECT_LONGS_EQUAL(1, occupancyGrid.size()); -// -// occupancyGrid.addLaser(pose, range); -// EXPECT_LONGS_EQUAL(2, occupancyGrid.size()); + Pose2 pose(0,0,0); + double range = 1; - //add lasers - int n_frames = 1; - int n_lasers_per_frame = 640; - char laser_list_file[1000]; + occupancyGrid.addPrior(0, 0.7); + EXPECT_LONGS_EQUAL(1, occupancyGrid.size()); + + occupancyGrid.addLaser(pose, range); + EXPECT_LONGS_EQUAL(2, occupancyGrid.size()); + + OccupancyGrid::Occupancy occupancy = occupancyGrid.emptyOccupancy(); + EXPECT_LONGS_EQUAL(900, occupancyGrid.laserFactorValue(0,occupancy)); - for(int i = 0; i < n_frames; i++){ - sprintf(laser_list_file, "/home/brian/Desktop/research/user/bpeasle/code/KinectInterface/Data/ScanLinesAsLasers/KinectRecording9/laser_list%.4d", i); - FILE *fptr = fopen(laser_list_file,"r"); - double x,y, theta; - double range, angle; - fscanf(fptr, "%lf %lf %lf", &x, &y, &theta); + occupancy[16] = 1; + EXPECT_LONGS_EQUAL(1, occupancyGrid.laserFactorValue(0,occupancy)); - for(int j = 0; j < n_lasers_per_frame; j++){ - fscanf(fptr, "%lf %lf", &range, &angle); - //if(j == 159){ - Pose2 pose(x,y, theta+angle); + occupancy[15] = 1; + EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); - occupancyGrid.addLaser(pose, range); - //} - } - fclose(fptr); - - } - - -// OccupancyGrid::Occupancy occupancy = occupancyGrid.emptyOccupancy(); -// EXPECT_LONGS_EQUAL(900, occupancyGrid.laserFactorValue(0,occupancy)); -// -// -// occupancy[16] = 1; -// EXPECT_LONGS_EQUAL(1, occupancyGrid.laserFactorValue(0,occupancy)); -// -// occupancy[15] = 1; -// EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); -// -// occupancy[16] = 0; -// EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); + occupancy[16] = 0; + EXPECT_LONGS_EQUAL(1000, occupancyGrid.laserFactorValue(0,occupancy)); //run MCMC OccupancyGrid::Marginals occupancyMarginals = occupancyGrid.runMetropolis(50000); - //EXPECT_LONGS_EQUAL( (width*height)/pow(resolution,2), occupancyMarginals.size()); - //select a cell at a random to flip - - - printf("\n"); - for(size_t i = 0, it = 0; i < occupancyGrid.height(); i++){ - for(size_t j = 0; j < occupancyGrid.width(); j++, it++){ - printf("%.2lf ", occupancyMarginals[it]); - } - printf("\n"); - } - - char marginalsOutput[1000]; - sprintf(marginalsOutput, "/home/brian/Desktop/research/user/bpeasle/code/KinectInterface/marginals.txt"); - FILE *fptr = fopen(marginalsOutput, "w"); - fprintf(fptr, "%d %d\n", occupancyGrid.width(), occupancyGrid.height()); - - for(int i = 0; i < occupancyMarginals.size(); i++){ - fprintf(fptr, "%lf ", occupancyMarginals[i]); - } - fclose(fptr); + EXPECT_LONGS_EQUAL( (width*height)/pow(resolution,2), occupancyMarginals.size()); From edc4ffa6833e8d9b1f4bddfc4009a2bdee5ed752 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 23 May 2012 18:51:39 +0000 Subject: [PATCH 050/914] Fixed missing copy constructor and assignment operators in Marginals --- gtsam/nonlinear/Marginals.cpp | 13 +++++++++++++ gtsam/nonlinear/Marginals.h | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index 34d620bc2..6df7dfdac 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -73,6 +73,19 @@ Matrix Marginals::marginalInformation(Key variable) const { } } +/* ************************************************************************* */ +JointMarginal::JointMarginal(const JointMarginal& other) : + blockView_(fullMatrix_) { + *this = other; +} + +/* ************************************************************************* */ +JointMarginal& JointMarginal::operator=(const JointMarginal& rhs) { + indices_ = rhs.indices_; + blockView_.assignNoalias(rhs.blockView_); + return *this; +} + /* ************************************************************************* */ JointMarginal Marginals::jointMarginalCovariance(const std::vector& variables) const { JointMarginal info = jointMarginalInformation(variables); diff --git a/gtsam/nonlinear/Marginals.h b/gtsam/nonlinear/Marginals.h index 77bccdfd2..fe5d4b21d 100644 --- a/gtsam/nonlinear/Marginals.h +++ b/gtsam/nonlinear/Marginals.h @@ -102,6 +102,12 @@ public: Block operator()(Key iVariable, Key jVariable) const { return blockView_(indices_[iVariable], indices_[jVariable]); } + /** Copy constructor */ + JointMarginal(const JointMarginal& other); + + /** Assignment operator */ + JointMarginal& operator=(const JointMarginal& rhs); + protected: Matrix fullMatrix_; BlockView blockView_; From 7cdd8e19da3cf899461ee73c909fb882e24e2622 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 23 May 2012 18:51:42 +0000 Subject: [PATCH 051/914] Tweaking build scripts for visual studio --- CMakeLists.txt | 14 +++++++++++--- examples/CMakeLists.txt | 4 +++- gtsam/CMakeLists.txt | 10 +++++++++- gtsam/slam/CMakeLists.txt | 4 ++++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bdbc486a..7198c5dfb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,10 +52,18 @@ if(GTSAM_UNSTABLE_AVAILABLE) option(GTSAM_BUILD_UNSTABLE "Enable/Disable libgtsam_unstable" OFF) endif() option(GTSAM_BUILD_WRAP "Enable/Disable building of matlab wrap utility (necessary for matlab interface)" ON) -option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" ON) +if(MSVC) + option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" OFF) +else() + option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" ON) +endif() option(GTSAM_BUILD_STATIC_LIBRARY "Enable/Disable building of a static version of gtsam" ON) option(GTSAM_USE_QUATERNIONS "Enable/Disable using an internal Quaternion representation for rotations instead of rotation matrices" OFF) -option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" ON) +if(MSVC) + option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" OFF) +else() + option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" ON) +endif() option(GTSAM_INSTALL_MATLAB_TOOLBOX "Enable/Disable installation of matlab toolbox" ON) option(GTSAM_INSTALL_MATLAB_EXAMPLES "Enable/Disable installation of matlab examples" ON) option(GTSAM_INSTALL_MATLAB_TESTS "Enable/Disable installation of matlab tests" ON) @@ -97,7 +105,7 @@ endif() if(MSVC) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.40 COMPONENTS serialization REQUIRED) +find_package(Boost 1.40 COMPONENTS serialization system chrono REQUIRED) # General build settings include_directories( diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 116379489..00a93904a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -15,7 +15,9 @@ foreach(example_src ${example_srcs} ) endif() target_link_libraries(${example_bin} gtsam-static) - add_custom_target(${example_bin}.run ${EXECUTABLE_OUTPUT_PATH}${example_bin} ${ARGN}) + if(NOT MSVC) + add_custom_target(${example_bin}.run ${EXECUTABLE_OUTPUT_PATH}${example_bin} ${ARGN}) + endif() endforeach(example_src) add_subdirectory(vSLAMexample) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 2adc83365..e0cc0eae1 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -46,6 +46,8 @@ endif() foreach(subdir ${gtsam_subdirs}) # Build convenience libraries file(GLOB subdir_srcs "${subdir}/*.cpp") + file(GLOB subdir_headers "${subdir}/*.h") + set(subdir_srcs ${subdir_srcs} ${subdir_headers}) # Include header files so they show up in Visual Studio list(REMOVE_ITEM subdir_srcs ${excluded_sources}) set(${subdir}_srcs ${subdir_srcs}) if (GTSAM_BUILD_CONVENIENCE_LIBRARIES) @@ -71,7 +73,11 @@ set(gtsam_srcs ${slam_srcs} ) -#gtsam_assign_source_folders("${gtsam_srcs}") +# Create MSVC structure +file(GLOB_RECURSE all_c_srcs "*.c") +file(GLOB_RECURSE all_cpp_srcs "*.cpp") +file(GLOB_RECURSE all_headers "*.h") +gtsam_assign_source_folders("${all_c_srcs};${all_cpp_srcs};${all_headers}") # Versions set(gtsam_version ${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}) @@ -83,6 +89,7 @@ message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") if (GTSAM_BUILD_STATIC_LIBRARY) message(STATUS "Building GTSAM - static") add_library(gtsam-static STATIC ${gtsam_srcs}) + target_link_libraries(gtsam-static ${Boost_LIBRARIES}) set_target_properties(gtsam-static PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 @@ -94,6 +101,7 @@ endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) message(STATUS "Building GTSAM - shared") add_library(gtsam-shared SHARED ${gtsam_srcs}) + target_link_libraries(gtsam-shared ${Boost_LIBRARIES}) set_target_properties(gtsam-shared PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 diff --git a/gtsam/slam/CMakeLists.txt b/gtsam/slam/CMakeLists.txt index c25e32bd4..768ab2307 100644 --- a/gtsam/slam/CMakeLists.txt +++ b/gtsam/slam/CMakeLists.txt @@ -24,6 +24,10 @@ if (GTSAM_BUILD_TESTS) gtsam_add_subdir_tests(slam "${slam_local_libs}" "gtsam-static" "${slam_excluded_files}") endif(GTSAM_BUILD_TESTS) +if(MSVC) + add_definitions("/bigobj") +endif() + # Build timing scripts if (GTSAM_BUILD_TIMING) gtsam_add_subdir_timing(slam "${slam_local_libs}" "gtsam-static" "${slam_excluded_files}") From c2c9c4a982bccf1d233f81c5c7151ae24a31a777 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 23 May 2012 18:51:49 +0000 Subject: [PATCH 052/914] Almost everything compiles and passes in windows --- examples/PlanarSLAMExample_easy.cpp | 2 +- gtsam/base/tests/testVector.cpp | 2 +- gtsam/discrete/DecisionTree-inl.h | 2 +- gtsam/geometry/tests/testCalibratedCamera.cpp | 2 +- gtsam/geometry/tests/testFundamental.cpp | 8 +- gtsam/geometry/tests/testHomography2.cpp | 18 ++--- gtsam/geometry/tests/testPoint2.cpp | 4 +- gtsam/geometry/tests/testPose2.cpp | 74 +++++++++---------- gtsam/geometry/tests/testPose3.cpp | 12 +-- gtsam/geometry/tests/testRot2.cpp | 8 +- gtsam/geometry/tests/testRot3M.cpp | 2 +- gtsam/geometry/tests/testSimpleCamera.cpp | 2 +- gtsam/geometry/tests/testTensors.cpp | 12 +-- gtsam/inference/graph-inl.h | 4 +- gtsam/slam/tests/testGeneralSFMFactor.cpp | 4 +- .../testGeneralSFMFactor_Cal3Bundler.cpp | 4 +- gtsam/slam/tests/testPlanarSLAM.cpp | 16 ++-- gtsam/slam/tests/testPose2SLAM.cpp | 32 ++++---- tests/testDoglegOptimizer.cpp | 5 +- tests/testGaussianFactor.cpp | 4 +- tests/testGaussianFactorGraphB.cpp | 4 +- tests/testGraph.cpp | 2 +- tests/testInferenceB.cpp | 2 +- tests/testMarginals.cpp | 2 +- 24 files changed, 113 insertions(+), 114 deletions(-) diff --git a/examples/PlanarSLAMExample_easy.cpp b/examples/PlanarSLAMExample_easy.cpp index 5039b1145..808de3ba3 100644 --- a/examples/PlanarSLAMExample_easy.cpp +++ b/examples/PlanarSLAMExample_easy.cpp @@ -53,7 +53,7 @@ int main(int argc, char** argv) { Rot2 bearing11 = Rot2::fromDegrees(45), bearing21 = Rot2::fromDegrees(90), bearing32 = Rot2::fromDegrees(90); - double range11 = sqrt(4+4), + double range11 = std::sqrt(4.0+4.0), range21 = 2.0, range32 = 2.0; diff --git a/gtsam/base/tests/testVector.cpp b/gtsam/base/tests/testVector.cpp index 8b8757027..6657d41f9 100644 --- a/gtsam/base/tests/testVector.cpp +++ b/gtsam/base/tests/testVector.cpp @@ -251,7 +251,7 @@ TEST( TestVector, axpy ) /* ************************************************************************* */ TEST( TestVector, equals ) { - Vector v1 = Vector_(1, 0.0/0.0); //testing nan + Vector v1 = Vector_(1, 0.0/std::numeric_limits::quiet_NaN()); //testing nan Vector v2 = Vector_(1, 1.0); double tol = 1.; EXPECT(!equal_with_abs_tol(v1, v2, tol)); diff --git a/gtsam/discrete/DecisionTree-inl.h b/gtsam/discrete/DecisionTree-inl.h index 1fa750ace..a9953d506 100644 --- a/gtsam/discrete/DecisionTree-inl.h +++ b/gtsam/discrete/DecisionTree-inl.h @@ -81,7 +81,7 @@ namespace gtsam { bool equals(const Node& q, double tol) const { const Leaf* other = dynamic_cast (&q); if (!other) return false; - return fabs(this->constant_ - other->constant_) < tol; + return fabs(double(this->constant_ - other->constant_)) < tol; } /** print */ diff --git a/gtsam/geometry/tests/testCalibratedCamera.cpp b/gtsam/geometry/tests/testCalibratedCamera.cpp index 5bb1ebe65..7fe88bce0 100644 --- a/gtsam/geometry/tests/testCalibratedCamera.cpp +++ b/gtsam/geometry/tests/testCalibratedCamera.cpp @@ -65,7 +65,7 @@ TEST( CalibratedCamera, level1) TEST( CalibratedCamera, level2) { // Create a level camera, looking in Y-direction - Pose2 pose2(0.4,0.3,M_PI_2); + Pose2 pose2(0.4,0.3,M_PI/2.0); CalibratedCamera camera = CalibratedCamera::level(pose2, 0.1); // expected diff --git a/gtsam/geometry/tests/testFundamental.cpp b/gtsam/geometry/tests/testFundamental.cpp index 297b36036..46a051609 100644 --- a/gtsam/geometry/tests/testFundamental.cpp +++ b/gtsam/geometry/tests/testFundamental.cpp @@ -34,11 +34,11 @@ using namespace tensors; /* ************************************************************************* */ // Indices -Index<3, 'a'> a; -Index<3, 'b'> b; +tensors::Index<3, 'a'> a; +tensors::Index<3, 'b'> b; -Index<4, 'A'> A; -Index<4, 'B'> B; +tensors::Index<4, 'A'> A; +tensors::Index<4, 'B'> B; /* ************************************************************************* */ TEST( Tensors, FundamentalMatrix) diff --git a/gtsam/geometry/tests/testHomography2.cpp b/gtsam/geometry/tests/testHomography2.cpp index 417d41977..062de9d1d 100644 --- a/gtsam/geometry/tests/testHomography2.cpp +++ b/gtsam/geometry/tests/testHomography2.cpp @@ -36,9 +36,9 @@ using namespace tensors; /* ************************************************************************* */ // Indices -Index<3, 'a'> a, _a; -Index<3, 'b'> b, _b; -Index<3, 'c'> c, _c; +tensors::Index<3, 'a'> a, _a; +tensors::Index<3, 'b'> b, _b; +tensors::Index<3, 'c'> c, _c; /* ************************************************************************* */ TEST( Homography2, RealImages) @@ -120,8 +120,8 @@ Homography2 patchH(const Pose3& tEc) { namespace gtsam { // size_t dim(const tensors::Tensor2<3, 3>& H) {return 9;} Vector toVector(const tensors::Tensor2<3, 3>& H) { - Index<3, 'T'> _T; // covariant 2D template - Index<3, 'C'> I; // contravariant 2D camera + tensors::Index<3, 'T'> _T; // covariant 2D template + tensors::Index<3, 'C'> I; // contravariant 2D camera return toVector(H(I,_T)); } Vector localCoordinates(const tensors::Tensor2<3, 3>& A, const tensors::Tensor2<3, 3>& B) { @@ -134,8 +134,8 @@ namespace gtsam { /* ************************************************************************* */ TEST( Homography2, patchH) { - Index<3, 'T'> _T; // covariant 2D template - Index<3, 'C'> I; // contravariant 2D camera + tensors::Index<3, 'T'> _T; // covariant 2D template + tensors::Index<3, 'C'> I; // contravariant 2D camera // data[_T][I] double data1[3][3] = {{1,0,0},{0,-1,0},{0,0,10}}; @@ -160,8 +160,8 @@ TEST( Homography2, patchH) /* ************************************************************************* */ TEST( Homography2, patchH2) { - Index<3, 'T'> _T; // covariant 2D template - Index<3, 'C'> I; // contravariant 2D camera + tensors::Index<3, 'T'> _T; // covariant 2D template + tensors::Index<3, 'C'> I; // contravariant 2D camera // data[_T][I] double data1[3][3] = {{1,0,0},{0,-1,0},{0,0,10}}; diff --git a/gtsam/geometry/tests/testPoint2.cpp b/gtsam/geometry/tests/testPoint2.cpp index 3416361cd..f7fee0418 100644 --- a/gtsam/geometry/tests/testPoint2.cpp +++ b/gtsam/geometry/tests/testPoint2.cpp @@ -72,7 +72,7 @@ TEST( Point2, arithmetic) /* ************************************************************************* */ TEST( Point2, norm) { - Point2 p0(cos(5), sin(5)); + Point2 p0(cos(5.0), sin(5.0)); DOUBLES_EQUAL(1,p0.norm(),1e-6); Point2 p1(4, 5), p2(1, 1); DOUBLES_EQUAL( 5,p1.dist(p2),1e-6); @@ -85,7 +85,7 @@ TEST( Point2, unit) Point2 p0(10.0, 0.0), p1(0.0,-10.0), p2(10.0, 10.0); EXPECT(assert_equal(Point2(1.0, 0.0), p0.unit(), 1e-6)); EXPECT(assert_equal(Point2(0.0,-1.0), p1.unit(), 1e-6)); - EXPECT(assert_equal(Point2(sqrt(2)/2.0, sqrt(2)/2.0), p2.unit(), 1e-6)); + EXPECT(assert_equal(Point2(sqrt(2.0)/2.0, sqrt(2.0)/2.0), p2.unit(), 1e-6)); } /* ************************************************************************* */ diff --git a/gtsam/geometry/tests/testPose2.cpp b/gtsam/geometry/tests/testPose2.cpp index 14e529613..cdde3cd54 100644 --- a/gtsam/geometry/tests/testPose2.cpp +++ b/gtsam/geometry/tests/testPose2.cpp @@ -44,14 +44,14 @@ TEST(Pose2, constructors) { Pose2 pose(0,p); Pose2 origin; assert_equal(pose,origin); - Pose2 t(M_PI_2+0.018, Point2(1.015, 2.01)); + Pose2 t(M_PI/2.0+0.018, Point2(1.015, 2.01)); EXPECT(assert_equal(t,Pose2(t.matrix()))); } /* ************************************************************************* */ TEST(Pose2, manifold) { - Pose2 t1(M_PI_2, Point2(1, 2)); - Pose2 t2(M_PI_2+0.018, Point2(1.015, 2.01)); + Pose2 t1(M_PI/2.0, Point2(1, 2)); + Pose2 t2(M_PI/2.0+0.018, Point2(1.015, 2.01)); Pose2 origin; Vector d12 = t1.localCoordinates(t2); EXPECT(assert_equal(t2, t1.retract(d12))); @@ -63,11 +63,11 @@ TEST(Pose2, manifold) { /* ************************************************************************* */ TEST(Pose2, retract) { - Pose2 pose(M_PI_2, Point2(1, 2)); + Pose2 pose(M_PI/2.0, Point2(1, 2)); #ifdef SLOW_BUT_CORRECT_EXPMAP Pose2 expected(1.00811, 2.01528, 2.5608); #else - Pose2 expected(M_PI_2+0.99, Point2(1.015, 2.01)); + Pose2 expected(M_PI/2.0+0.99, Point2(1.015, 2.01)); #endif Pose2 actual = pose.retract(Vector_(3, 0.01, -0.015, 0.99)); EXPECT(assert_equal(expected, actual, 1e-5)); @@ -75,7 +75,7 @@ TEST(Pose2, retract) { /* ************************************************************************* */ TEST(Pose2, expmap) { - Pose2 pose(M_PI_2, Point2(1, 2)); + Pose2 pose(M_PI/2.0, Point2(1, 2)); Pose2 expected(1.00811, 2.01528, 2.5608); Pose2 actual = expmap_default(pose, Vector_(3, 0.01, -0.015, 0.99)); EXPECT(assert_equal(expected, actual, 1e-5)); @@ -83,7 +83,7 @@ TEST(Pose2, expmap) { /* ************************************************************************* */ TEST(Pose2, expmap2) { - Pose2 pose(M_PI_2, Point2(1, 2)); + Pose2 pose(M_PI/2.0, Point2(1, 2)); Pose2 expected(1.00811, 2.01528, 2.5608); Pose2 actual = expmap_default(pose, Vector_(3, 0.01, -0.015, 0.99)); EXPECT(assert_equal(expected, actual, 1e-5)); @@ -110,11 +110,11 @@ TEST(Pose2, expmap3) { /* ************************************************************************* */ TEST(Pose2, expmap0) { - Pose2 pose(M_PI_2, Point2(1, 2)); + Pose2 pose(M_PI/2.0, Point2(1, 2)); //#ifdef SLOW_BUT_CORRECT_EXPMAP Pose2 expected(1.01491, 2.01013, 1.5888); //#else -// Pose2 expected(M_PI_2+0.018, Point2(1.015, 2.01)); +// Pose2 expected(M_PI/2.0+0.018, Point2(1.015, 2.01)); //#endif Pose2 actual = pose * (Pose2::Expmap(Vector_(3, 0.01, -0.015, 0.018))); EXPECT(assert_equal(expected, actual, 1e-5)); @@ -122,7 +122,7 @@ TEST(Pose2, expmap0) { /* ************************************************************************* */ TEST(Pose2, expmap0_full) { - Pose2 pose(M_PI_2, Point2(1, 2)); + Pose2 pose(M_PI/2.0, Point2(1, 2)); Pose2 expected(1.01491, 2.01013, 1.5888); Pose2 actual = pose * Pose2::Expmap(Vector_(3, 0.01, -0.015, 0.018)); EXPECT(assert_equal(expected, actual, 1e-5)); @@ -130,7 +130,7 @@ TEST(Pose2, expmap0_full) { /* ************************************************************************* */ TEST(Pose2, expmap0_full2) { - Pose2 pose(M_PI_2, Point2(1, 2)); + Pose2 pose(M_PI/2.0, Point2(1, 2)); Pose2 expected(1.01491, 2.01013, 1.5888); Pose2 actual = pose * Pose2::Expmap(Vector_(3, 0.01, -0.015, 0.018)); EXPECT(assert_equal(expected, actual, 1e-5)); @@ -170,8 +170,8 @@ TEST(Pose3, expmap_c_full) /* ************************************************************************* */ TEST(Pose2, logmap) { - Pose2 pose0(M_PI_2, Point2(1, 2)); - Pose2 pose(M_PI_2+0.018, Point2(1.015, 2.01)); + Pose2 pose0(M_PI/2.0, Point2(1, 2)); + Pose2 pose(M_PI/2.0+0.018, Point2(1.015, 2.01)); #ifdef SLOW_BUT_CORRECT_EXPMAP Vector expected = Vector_(3, 0.00986473, -0.0150896, 0.018); #else @@ -183,8 +183,8 @@ TEST(Pose2, logmap) { /* ************************************************************************* */ TEST(Pose2, logmap_full) { - Pose2 pose0(M_PI_2, Point2(1, 2)); - Pose2 pose(M_PI_2+0.018, Point2(1.015, 2.01)); + Pose2 pose0(M_PI/2.0, Point2(1, 2)); + Pose2 pose(M_PI/2.0+0.018, Point2(1.015, 2.01)); Vector expected = Vector_(3, 0.00986473, -0.0150896, 0.018); Vector actual = logmap_default(pose0, pose); EXPECT(assert_equal(expected, actual, 1e-5)); @@ -197,7 +197,7 @@ Point2 transform_to_proxy(const Pose2& pose, const Point2& point) { TEST( Pose2, transform_to ) { - Pose2 pose(M_PI_2, Point2(1,2)); // robot at (1,2) looking towards y + Pose2 pose(M_PI/2.0, Point2(1,2)); // robot at (1,2) looking towards y Point2 point(-1,4); // landmark at (-1,4) // expected @@ -226,7 +226,7 @@ Point2 transform_from_proxy(const Pose2& pose, const Point2& point) { TEST (Pose2, transform_from) { - Pose2 pose(1., 0., M_PI_2); + Pose2 pose(1., 0., M_PI/2.0); Point2 pt(2., 1.); Matrix H1, H2; Point2 actual = pose.transform_from(pt, H1, H2); @@ -326,7 +326,7 @@ TEST(Pose2, compose_c) TEST(Pose2, inverse ) { Point2 origin, t(1,2); - Pose2 gTl(M_PI_2, t); // robot at (1,2) looking towards y + Pose2 gTl(M_PI/2.0, t); // robot at (1,2) looking towards y Pose2 identity, lTg = gTl.inverse(); EXPECT(assert_equal(identity,lTg.compose(gTl))); @@ -362,7 +362,7 @@ Matrix matrix(const Pose2& gTl) { TEST( Pose2, matrix ) { Point2 origin, t(1,2); - Pose2 gTl(M_PI_2, t); // robot at (1,2) looking towards y + Pose2 gTl(M_PI/2.0, t); // robot at (1,2) looking towards y Matrix gMl = matrix(gTl); EXPECT(assert_equal(Matrix_(3,3, 0.0, -1.0, 1.0, @@ -393,7 +393,7 @@ TEST( Pose2, matrix ) /* ************************************************************************* */ TEST( Pose2, compose_matrix ) { - Pose2 gT1(M_PI_2, Point2(1,2)); // robot at (1,2) looking towards y + Pose2 gT1(M_PI/2.0, Point2(1,2)); // robot at (1,2) looking towards y Pose2 _1T2(M_PI, Point2(-1,4)); // local robot at (-1,4) loooking at negative x Matrix gM1(matrix(gT1)),_1M2(matrix(_1T2)); EXPECT(assert_equal(gM1*_1M2,matrix(gT1.compose(_1T2)))); // RIGHT DOES NOT @@ -407,11 +407,11 @@ TEST( Pose2, between ) // ^ // // *--0--*--* - Pose2 gT1(M_PI_2, Point2(1,2)); // robot at (1,2) looking towards y + Pose2 gT1(M_PI/2.0, Point2(1,2)); // robot at (1,2) looking towards y Pose2 gT2(M_PI, Point2(-1,4)); // robot at (-1,4) loooking at negative x Matrix actualH1,actualH2; - Pose2 expected(M_PI_2, Point2(2,2)); + Pose2 expected(M_PI/2.0, Point2(2,2)); Pose2 actual1 = gT1.between(gT2); Pose2 actual2 = gT1.between(gT2,actualH1,actualH2); EXPECT(assert_equal(expected,actual1)); @@ -443,7 +443,7 @@ TEST( Pose2, between ) // reverse situation for extra test TEST( Pose2, between2 ) { - Pose2 p2(M_PI_2, Point2(1,2)); // robot at (1,2) looking towards y + Pose2 p2(M_PI/2.0, Point2(1,2)); // robot at (1,2) looking towards y Pose2 p1(M_PI, Point2(-1,4)); // robot at (-1,4) loooking at negative x Matrix actualH1,actualH2; @@ -472,7 +472,7 @@ TEST(Pose2, members) /* ************************************************************************* */ // some shared test values -Pose2 x1, x2(1, 1, 0), x3(1, 1, M_PI_4); +Pose2 x1, x2(1, 1, 0), x3(1, 1, M_PI/4.0); Point2 l1(1, 0), l2(1, 1), l3(2, 2), l4(1, 3); /* ************************************************************************* */ @@ -488,11 +488,11 @@ TEST( Pose2, bearing ) EXPECT(assert_equal(Rot2(),x1.bearing(l1))); // establish bearing is indeed 45 degrees - EXPECT(assert_equal(Rot2::fromAngle(M_PI_4),x1.bearing(l2))); + EXPECT(assert_equal(Rot2::fromAngle(M_PI/4.0),x1.bearing(l2))); // establish bearing is indeed 45 degrees even if shifted Rot2 actual23 = x2.bearing(l3, actualH1, actualH2); - EXPECT(assert_equal(Rot2::fromAngle(M_PI_4),actual23)); + EXPECT(assert_equal(Rot2::fromAngle(M_PI/4.0),actual23)); // Check numerical derivatives expectedH1 = numericalDerivative21(bearing_proxy, x2, l3); @@ -502,7 +502,7 @@ TEST( Pose2, bearing ) // establish bearing is indeed 45 degrees even if rotated Rot2 actual34 = x3.bearing(l4, actualH1, actualH2); - EXPECT(assert_equal(Rot2::fromAngle(M_PI_4),actual34)); + EXPECT(assert_equal(Rot2::fromAngle(M_PI/4.0),actual34)); // Check numerical derivatives expectedH1 = numericalDerivative21(bearing_proxy, x3, l4); @@ -518,7 +518,7 @@ Rot2 bearing_pose_proxy(const Pose2& pose, const Pose2& pt) { TEST( Pose2, bearing_pose ) { - Pose2 xl1(1, 0, M_PI_2), xl2(1, 1, M_PI), xl3(2.0, 2.0,-M_PI_2), xl4(1, 3, 0); + Pose2 xl1(1, 0, M_PI/2.0), xl2(1, 1, M_PI), xl3(2.0, 2.0,-M_PI/2.0), xl4(1, 3, 0); Matrix expectedH1, actualH1, expectedH2, actualH2; @@ -526,11 +526,11 @@ TEST( Pose2, bearing_pose ) EXPECT(assert_equal(Rot2(),x1.bearing(xl1))); // establish bearing is indeed 45 degrees - EXPECT(assert_equal(Rot2::fromAngle(M_PI_4),x1.bearing(xl2))); + EXPECT(assert_equal(Rot2::fromAngle(M_PI/4.0),x1.bearing(xl2))); // establish bearing is indeed 45 degrees even if shifted Rot2 actual23 = x2.bearing(xl3, actualH1, actualH2); - EXPECT(assert_equal(Rot2::fromAngle(M_PI_4),actual23)); + EXPECT(assert_equal(Rot2::fromAngle(M_PI/4.0),actual23)); // Check numerical derivatives expectedH1 = numericalDerivative21(bearing_pose_proxy, x2, xl3); @@ -540,7 +540,7 @@ TEST( Pose2, bearing_pose ) // establish bearing is indeed 45 degrees even if rotated Rot2 actual34 = x3.bearing(xl4, actualH1, actualH2); - EXPECT(assert_equal(Rot2::fromAngle(M_PI_4),actual34)); + EXPECT(assert_equal(Rot2::fromAngle(M_PI/4.0),actual34)); // Check numerical derivatives expectedH1 = numericalDerivative21(bearing_pose_proxy, x3, xl4); @@ -561,11 +561,11 @@ TEST( Pose2, range ) EXPECT_DOUBLES_EQUAL(1,x1.range(l1),1e-9); // establish range is indeed 45 degrees - EXPECT_DOUBLES_EQUAL(sqrt(2),x1.range(l2),1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),x1.range(l2),1e-9); // Another pair double actual23 = x2.range(l3, actualH1, actualH2); - EXPECT_DOUBLES_EQUAL(sqrt(2),actual23,1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),actual23,1e-9); // Check numerical derivatives expectedH1 = numericalDerivative21(range_proxy, x2, l3); @@ -590,7 +590,7 @@ LieVector range_pose_proxy(const Pose2& pose, const Pose2& point) { } TEST( Pose2, range_pose ) { - Pose2 xl1(1, 0, M_PI_2), xl2(1, 1, M_PI), xl3(2.0, 2.0,-M_PI_2), xl4(1, 3, 0); + Pose2 xl1(1, 0, M_PI/2.0), xl2(1, 1, M_PI), xl3(2.0, 2.0,-M_PI/2.0), xl4(1, 3, 0); Matrix expectedH1, actualH1, expectedH2, actualH2; @@ -598,11 +598,11 @@ TEST( Pose2, range_pose ) EXPECT_DOUBLES_EQUAL(1,x1.range(xl1),1e-9); // establish range is indeed 45 degrees - EXPECT_DOUBLES_EQUAL(sqrt(2),x1.range(xl2),1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),x1.range(xl2),1e-9); // Another pair double actual23 = x2.range(xl3, actualH1, actualH2); - EXPECT_DOUBLES_EQUAL(sqrt(2),actual23,1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),actual23,1e-9); // Check numerical derivatives expectedH1 = numericalDerivative21(range_pose_proxy, x2, xl3); @@ -637,7 +637,7 @@ TEST(Pose2, align_1) { TEST(Pose2, align_2) { Point2 t(20,10); - Rot2 R = Rot2::fromAngle(M_PI_2); + Rot2 R = Rot2::fromAngle(M_PI/2.0); Pose2 expected(R, t); vector correspondences; diff --git a/gtsam/geometry/tests/testPose3.cpp b/gtsam/geometry/tests/testPose3.cpp index eb2d410f8..4ec1c6aee 100644 --- a/gtsam/geometry/tests/testPose3.cpp +++ b/gtsam/geometry/tests/testPose3.cpp @@ -535,7 +535,7 @@ TEST( Pose3, between ) /* ************************************************************************* */ // some shared test values - pulled from equivalent test in Pose2 Point3 l1(1, 0, 0), l2(1, 1, 0), l3(2, 2, 0), l4(1, 4,-4); -Pose3 x1, x2(Rot3::ypr(0.0, 0.0, 0.0), l2), x3(Rot3::ypr(M_PI_4, 0.0, 0.0), l2); +Pose3 x1, x2(Rot3::ypr(0.0, 0.0, 0.0), l2), x3(Rot3::ypr(M_PI/4.0, 0.0, 0.0), l2); Pose3 xl1(Rot3::ypr(0.0, 0.0, 0.0), Point3(1, 0, 0)), xl2(Rot3::ypr(0.0, 1.0, 0.0), Point3(1, 1, 0)), @@ -554,11 +554,11 @@ TEST( Pose3, range ) EXPECT_DOUBLES_EQUAL(1,x1.range(l1),1e-9); // establish range is indeed sqrt2 - EXPECT_DOUBLES_EQUAL(sqrt(2),x1.range(l2),1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),x1.range(l2),1e-9); // Another pair double actual23 = x2.range(l3, actualH1, actualH2); - EXPECT_DOUBLES_EQUAL(sqrt(2),actual23,1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),actual23,1e-9); // Check numerical derivatives expectedH1 = numericalDerivative21(range_proxy, x2, l3); @@ -589,11 +589,11 @@ TEST( Pose3, range_pose ) EXPECT_DOUBLES_EQUAL(1,x1.range(xl1),1e-9); // establish range is indeed sqrt2 - EXPECT_DOUBLES_EQUAL(sqrt(2),x1.range(xl2),1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),x1.range(xl2),1e-9); // Another pair double actual23 = x2.range(xl3, actualH1, actualH2); - EXPECT_DOUBLES_EQUAL(sqrt(2),actual23,1e-9); + EXPECT_DOUBLES_EQUAL(sqrt(2.0),actual23,1e-9); // Check numerical derivatives expectedH1 = numericalDerivative21(range_pose_proxy, x2, xl3); @@ -619,7 +619,7 @@ TEST( Pose3, unicycle ) Vector x_step = delta(6,3,1.0); EXPECT(assert_equal(Pose3(Rot3::ypr(0,0,0), l1), expmap_default(x1, x_step), tol)); EXPECT(assert_equal(Pose3(Rot3::ypr(0,0,0), Point3(2,1,0)), expmap_default(x2, x_step), tol)); - EXPECT(assert_equal(Pose3(Rot3::ypr(M_PI_4,0,0), Point3(2,2,0)), expmap_default(x3, sqrt(2) * x_step), tol)); + EXPECT(assert_equal(Pose3(Rot3::ypr(M_PI/4.0,0,0), Point3(2,2,0)), expmap_default(x3, sqrt(2.0) * x_step), tol)); } /* ************************************************************************* */ diff --git a/gtsam/geometry/tests/testRot2.cpp b/gtsam/geometry/tests/testRot2.cpp index e23224898..acf385fab 100644 --- a/gtsam/geometry/tests/testRot2.cpp +++ b/gtsam/geometry/tests/testRot2.cpp @@ -43,7 +43,7 @@ TEST( Rot2, constructors_and_angle) TEST( Rot2, unit) { EXPECT(assert_equal(Point2(1.0, 0.0), Rot2::fromAngle(0).unit())); - EXPECT(assert_equal(Point2(0.0, 1.0), Rot2::fromAngle(M_PI_2).unit())); + EXPECT(assert_equal(Point2(0.0, 1.0), Rot2::fromAngle(M_PI/2.0).unit())); } /* ************************************************************************* */ @@ -94,9 +94,9 @@ TEST( Rot2, expmap) /* ************************************************************************* */ TEST(Rot2, logmap) { - Rot2 rot0(Rot2::fromAngle(M_PI_2)); + Rot2 rot0(Rot2::fromAngle(M_PI/2.0)); Rot2 rot(Rot2::fromAngle(M_PI)); - Vector expected = Vector_(1, M_PI_2); + Vector expected = Vector_(1, M_PI/2.0); Vector actual = rot0.localCoordinates(rot); CHECK(assert_equal(expected, actual)); } @@ -146,7 +146,7 @@ TEST( Rot2, relativeBearing ) // establish relativeBearing is indeed 45 degrees Rot2 actual2 = Rot2::relativeBearing(l2, actualH); - CHECK(assert_equal(Rot2::fromAngle(M_PI_4),actual2)); + CHECK(assert_equal(Rot2::fromAngle(M_PI/4.0),actual2)); // Check numerical derivative expectedH = numericalDerivative11(relativeBearing_, l2); diff --git a/gtsam/geometry/tests/testRot3M.cpp b/gtsam/geometry/tests/testRot3M.cpp index a5047f14b..7c8bd04bd 100644 --- a/gtsam/geometry/tests/testRot3M.cpp +++ b/gtsam/geometry/tests/testRot3M.cpp @@ -131,7 +131,7 @@ TEST( Rot3, rodriguez3) TEST( Rot3, rodriguez4) { Vector axis = Vector_(3,0.,0.,1.); // rotation around Z - double angle = M_PI_2; + double angle = M_PI/2.0; Rot3 actual = Rot3::rodriguez(axis, angle); double c=cos(angle),s=sin(angle); Rot3 expected(c,-s, 0, diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index b3df0d8f8..1990ad00a 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -53,7 +53,7 @@ TEST( SimpleCamera, constructor) TEST( SimpleCamera, level2) { // Create a level camera, looking in Y-direction - Pose2 pose2(0.4,0.3,M_PI_2); + Pose2 pose2(0.4,0.3,M_PI/2.0); SimpleCamera camera = SimpleCamera::level(K, pose2, 0.1); // expected diff --git a/gtsam/geometry/tests/testTensors.cpp b/gtsam/geometry/tests/testTensors.cpp index 755b274a6..85437b850 100644 --- a/gtsam/geometry/tests/testTensors.cpp +++ b/gtsam/geometry/tests/testTensors.cpp @@ -34,12 +34,12 @@ using namespace tensors; /* ************************************************************************* */ // Indices -Index<3, 'a'> a, _a; -Index<3, 'b'> b, _b; -Index<3, 'c'> c, _c; +tensors::Index<3, 'a'> a, _a; +tensors::Index<3, 'b'> b, _b; +tensors::Index<3, 'c'> c, _c; -Index<4, 'A'> A; -Index<4, 'B'> B; +tensors::Index<4, 'A'> A; +tensors::Index<4, 'B'> B; /* ************************************************************************* */ // Tensor1 @@ -58,7 +58,7 @@ TEST(Tensor1, Basics) CHECK(assert_equivalent(p(a),q(a))) // projectively equivalent // and you can take a norm, typically for normalization to the sphere - DOUBLES_EQUAL(sqrt(14),norm(p(a)),1e-9) + DOUBLES_EQUAL(sqrt(14.0),norm(p(a)),1e-9) } /* ************************************************************************* */ diff --git a/gtsam/inference/graph-inl.h b/gtsam/inference/graph-inl.h index d8395942a..f9f8aa07c 100644 --- a/gtsam/inference/graph-inl.h +++ b/gtsam/inference/graph-inl.h @@ -196,8 +196,8 @@ boost::shared_ptr composePoses(const G& graph, const PredecessorMap PoseVertex v2 = key2vertex.find(key2)->second; POSE l1Xl2 = factor->measured(); - tie(edge12, found1) = boost::edge(v1, v2, g); - tie(edge21, found2) = boost::edge(v2, v1, g); + boost::tie(edge12, found1) = boost::edge(v1, v2, g); + boost::tie(edge21, found2) = boost::edge(v2, v1, g); if (found1 && found2) throw invalid_argument ("composePoses: invalid spanning tree"); if (!found1 && !found2) continue; if (found1) diff --git a/gtsam/slam/tests/testGeneralSFMFactor.cpp b/gtsam/slam/tests/testGeneralSFMFactor.cpp index 5b8a217bc..341549309 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor.cpp @@ -144,8 +144,8 @@ vector genCameraVariableCalibration() { return X ; } -shared_ptr getOrdering(const vector& X, const vector& L) { - shared_ptr ordering(new Ordering); +boost::shared_ptr getOrdering(const vector& X, const vector& L) { + boost::shared_ptr ordering(new Ordering); for ( size_t i = 0 ; i < L.size() ; ++i ) ordering->push_back(Symbol('l', i)) ; for ( size_t i = 0 ; i < X.size() ; ++i ) ordering->push_back(Symbol('x', i)) ; return ordering ; diff --git a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp index 76cf7d180..34391c070 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp @@ -146,8 +146,8 @@ vector genCameraVariableCalibration() { return X ; } -shared_ptr getOrdering(const vector& X, const vector& L) { - shared_ptr ordering(new Ordering); +boost::shared_ptr getOrdering(const vector& X, const vector& L) { + boost::shared_ptr ordering(new Ordering); for ( size_t i = 0 ; i < L.size() ; ++i ) ordering->push_back(Symbol('l', i)) ; for ( size_t i = 0 ; i < X.size() ; ++i ) ordering->push_back(Symbol('x', i)) ; return ordering ; diff --git a/gtsam/slam/tests/testPlanarSLAM.cpp b/gtsam/slam/tests/testPlanarSLAM.cpp index b32bf9a9c..4b69252b3 100644 --- a/gtsam/slam/tests/testPlanarSLAM.cpp +++ b/gtsam/slam/tests/testPlanarSLAM.cpp @@ -26,7 +26,7 @@ using namespace gtsam; using namespace planarSLAM; // some shared test values -static Pose2 x1, x2(1, 1, 0), x3(1, 1, M_PI_4); +static Pose2 x1, x2(1, 1, 0), x3(1, 1, M_PI/4.0); static Point2 l1(1, 0), l2(1, 1), l3(2, 2), l4(1, 3); SharedNoiseModel @@ -47,7 +47,7 @@ TEST( planarSLAM, PriorFactor_equals ) TEST( planarSLAM, BearingFactor ) { // Create factor - Rot2 z = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 + Rot2 z = Rot2::fromAngle(M_PI/4.0 + 0.1); // h(x) - z = -0.1 planarSLAM::Bearing factor(PoseKey(2), PointKey(3), z, sigma); // create config @@ -75,7 +75,7 @@ TEST( planarSLAM, BearingFactor_equals ) TEST( planarSLAM, RangeFactor ) { // Create factor - double z(sqrt(2) - 0.22); // h(x) - z = 0.22 + double z(sqrt(2.0) - 0.22); // h(x) - z = 0.22 planarSLAM::Range factor(PoseKey(2), PointKey(3), z, sigma); // create config @@ -101,8 +101,8 @@ TEST( planarSLAM, RangeFactor_equals ) TEST( planarSLAM, BearingRangeFactor ) { // Create factor - Rot2 r = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 - double b(sqrt(2) - 0.22); // h(x) - z = 0.22 + Rot2 r = Rot2::fromAngle(M_PI/4.0 + 0.1); // h(x) - z = -0.1 + double b(sqrt(2.0) - 0.22); // h(x) - z = 0.22 planarSLAM::BearingRange factor(PoseKey(2), PointKey(3), r, b, sigma2); // create config @@ -158,14 +158,14 @@ TEST( planarSLAM, constructor ) G.addPoseConstraint(2, x2); // make it feasible :-) // Add odometry - G.addOdometry(2, 3, Pose2(0, 0, M_PI_4), I3); + G.addOdometry(2, 3, Pose2(0, 0, M_PI/4.0), I3); // Create bearing factor - Rot2 z1 = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 + Rot2 z1 = Rot2::fromAngle(M_PI/4.0 + 0.1); // h(x) - z = -0.1 G.addBearing(2, 3, z1, sigma); // Create range factor - double z2(sqrt(2) - 0.22); // h(x) - z = 0.22 + double z2(sqrt(2.0) - 0.22); // h(x) - z = 0.22 G.addRange(2, 3, z2, sigma); Vector expected0 = Vector_(3, 0.0, 0.0, 0.0); diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 5aa633bbf..d97f99c72 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -72,7 +72,7 @@ TEST( Pose2SLAM, constraint1 ) /* ************************************************************************* */ // Test constraint, large displacement Vector f2(const Pose2& pose1, const Pose2& pose2) { - Pose2 z(2,2,M_PI_2); + Pose2 z(2,2,M_PI/2.0); Pose2Factor constraint(PoseKey(1), PoseKey(2), z, covariance); return constraint.evaluateError(pose1, pose2); } @@ -80,7 +80,7 @@ Vector f2(const Pose2& pose1, const Pose2& pose2) { TEST( Pose2SLAM, constraint2 ) { // create a factor between unknown poses p1 and p2 - Pose2 pose1, pose2(2,2,M_PI_2); + Pose2 pose1, pose2(2,2,M_PI/2.0); Pose2Factor constraint(PoseKey(1), PoseKey(2), pose2, covariance); Matrix H1, H2; Vector actual = constraint.evaluateError(pose1, pose2, H1, H2); @@ -96,7 +96,7 @@ TEST( Pose2SLAM, constraint2 ) TEST( Pose2SLAM, constructor ) { // create a factor between unknown poses p1 and p2 - Pose2 measured(2,2,M_PI_2); + Pose2 measured(2,2,M_PI/2.0); pose2SLAM::Graph graph; graph.addOdometry(1,2,measured, covariance); // get the size of the graph @@ -110,13 +110,13 @@ TEST( Pose2SLAM, constructor ) TEST( Pose2SLAM, linearization ) { // create a factor between unknown poses p1 and p2 - Pose2 measured(2,2,M_PI_2); + Pose2 measured(2,2,M_PI/2.0); Pose2Factor constraint(PoseKey(1), PoseKey(2), measured, covariance); pose2SLAM::Graph graph; graph.addOdometry(1,2,measured, covariance); // Choose a linearization point - Pose2 p1(1.1,2,M_PI_2); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) + Pose2 p1(1.1,2,M_PI/2.0); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) Pose2 p2(-1,4.1,M_PI); // robot at (-1,4) looking at negative (ground truth is at 4.1,2) pose2SLAM::Values config; config.insert(pose2SLAM::PoseKey(1),p1); @@ -151,7 +151,7 @@ TEST(Pose2SLAM, optimize) { // create a Pose graph with one equality constraint and one measurement pose2SLAM::Graph fg; fg.addPoseConstraint(0, Pose2(0,0,0)); - fg.addOdometry(0, 1, Pose2(1,2,M_PI_2), covariance); + fg.addOdometry(0, 1, Pose2(1,2,M_PI/2.0), covariance); // Create initial config Values initial; @@ -170,7 +170,7 @@ TEST(Pose2SLAM, optimize) { // Check with expected config Values expected; expected.insert(pose2SLAM::PoseKey(0), Pose2(0,0,0)); - expected.insert(pose2SLAM::PoseKey(1), Pose2(1,2,M_PI_2)); + expected.insert(pose2SLAM::PoseKey(1), Pose2(1,2,M_PI/2.0)); CHECK(assert_equal(expected, actual)); // Check marginals @@ -348,9 +348,9 @@ TEST(Pose2Values, pose2Circle ) { // expected is 4 poses tangent to circle with radius 1m pose2SLAM::Values expected; - expected.insert(pose2SLAM::PoseKey(0), Pose2( 1, 0, M_PI_2)); + expected.insert(pose2SLAM::PoseKey(0), Pose2( 1, 0, M_PI/2.0)); expected.insert(pose2SLAM::PoseKey(1), Pose2( 0, 1, - M_PI )); - expected.insert(pose2SLAM::PoseKey(2), Pose2(-1, 0, - M_PI_2)); + expected.insert(pose2SLAM::PoseKey(2), Pose2(-1, 0, - M_PI/2.0)); expected.insert(pose2SLAM::PoseKey(3), Pose2( 0, -1, 0 )); pose2SLAM::Values actual = pose2SLAM::circle(4,1.0); @@ -362,9 +362,9 @@ TEST(Pose2SLAM, expmap ) { // expected is circle shifted to right pose2SLAM::Values expected; - expected.insert(pose2SLAM::PoseKey(0), Pose2( 1.1, 0, M_PI_2)); + expected.insert(pose2SLAM::PoseKey(0), Pose2( 1.1, 0, M_PI/2.0)); expected.insert(pose2SLAM::PoseKey(1), Pose2( 0.1, 1, - M_PI )); - expected.insert(pose2SLAM::PoseKey(2), Pose2(-0.9, 0, - M_PI_2)); + expected.insert(pose2SLAM::PoseKey(2), Pose2(-0.9, 0, - M_PI/2.0)); expected.insert(pose2SLAM::PoseKey(3), Pose2( 0.1, -1, 0 )); // Note expmap coordinates are in local coordinates, so shifting to right requires thought !!! @@ -418,7 +418,7 @@ TEST( Pose2Prior, error ) /* ************************************************************************* */ // common Pose2Prior for tests below -static gtsam::Pose2 priorVal(2,2,M_PI_2); +static gtsam::Pose2 priorVal(2,2,M_PI/2.0); static pose2SLAM::Prior priorFactor(PoseKey(1), priorVal, sigmas); /* ************************************************************************* */ @@ -484,14 +484,14 @@ TEST( Pose2Factor, error ) /* ************************************************************************* */ // common Pose2Factor for tests below -static Pose2 measured(2,2,M_PI_2); +static Pose2 measured(2,2,M_PI/2.0); static Pose2Factor factor(PoseKey(1),PoseKey(2),measured, covariance); /* ************************************************************************* */ TEST( Pose2Factor, rhs ) { // Choose a linearization point - Pose2 p1(1.1,2,M_PI_2); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) + Pose2 p1(1.1,2,M_PI/2.0); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) Pose2 p2(-1,4.1,M_PI); // robot at (-1,4.1) looking at negative (ground truth is at -1,4) pose2SLAM::Values x0; x0.insert(pose2SLAM::PoseKey(1),p1); @@ -504,7 +504,7 @@ TEST( Pose2Factor, rhs ) // Check RHS Pose2 hx0 = p1.between(p2); - CHECK(assert_equal(Pose2(2.1, 2.1, M_PI_2),hx0)); + CHECK(assert_equal(Pose2(2.1, 2.1, M_PI/2.0),hx0)); Vector expected_b = Vector_(3, -0.1/sx, 0.1/sy, 0.0); CHECK(assert_equal(expected_b,-factor.whitenedError(x0))); CHECK(assert_equal(expected_b,linear->getb())); @@ -521,7 +521,7 @@ LieVector h(const Pose2& p1,const Pose2& p2) { TEST( Pose2Factor, linearize ) { // Choose a linearization point at ground truth - Pose2 p1(1,2,M_PI_2); + Pose2 p1(1,2,M_PI/2.0); Pose2 p2(-1,4,M_PI); pose2SLAM::Values x0; x0.insert(pose2SLAM::PoseKey(1),p1); diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index b16ac0cdc..c6241124a 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -31,7 +31,6 @@ using namespace std; using namespace gtsam; -using boost::shared_ptr; /* ************************************************************************* */ double computeError(const GaussianBayesNet& gbn, const LieVector& values) { @@ -381,7 +380,7 @@ TEST(DoglegOptimizer, ComputeDoglegPoint) { /* ************************************************************************* */ TEST(DoglegOptimizer, Iterate) { // really non-linear factor graph - shared_ptr fg(new example::Graph( + boost::shared_ptr fg(new example::Graph( example::createReallyNonlinearFactorGraph())); // config far from minimum @@ -390,7 +389,7 @@ TEST(DoglegOptimizer, Iterate) { config->insert(simulated2D::PoseKey(1), x0); // ordering - shared_ptr ord(new Ordering()); + boost::shared_ptr ord(new Ordering()); ord->push_back(simulated2D::PoseKey(1)); double Delta = 1.0; diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index 2cfb7a076..cb3ea18e7 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -263,7 +263,7 @@ TEST( GaussianFactor, matrix ) EQUALITY(b_act2,b2); // Ensure that whitening is consistent - shared_ptr model = lf->get_model(); + boost::shared_ptr model = lf->get_model(); model->WhitenSystem(A_act2, b_act2); EQUALITY(A_act1, A_act2); EQUALITY(b_act1, b_act2); @@ -307,7 +307,7 @@ TEST( GaussianFactor, matrix_aug ) EQUALITY(Ab_act2,Ab2); // Ensure that whitening is consistent - shared_ptr model = lf->get_model(); + boost::shared_ptr model = lf->get_model(); model->WhitenInPlace(Ab_act1); EQUALITY(Ab_act1, Ab_act2); } diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 2e68200f5..82e8401d6 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -232,7 +232,7 @@ TEST( GaussianFactorGraph, eliminateOne_l1 ) GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, 0, EliminateQR).first; // create expected Conditional Gaussian - double sig = sqrt(2)/10.; + double sig = sqrt(2.0)/10.; Matrix I = eye(2)/sig, R11 = I, S12 = -0.5*I, S13 = -0.5*I; Vector d = Vector_(2, -0.1, 0.25)/sig, sigma = ones(2); GaussianConditional expected(ordering[kl(1)],d,R11,ordering[kx(1)],S12,ordering[kx(2)],S13,sigma); @@ -295,7 +295,7 @@ TEST( GaussianFactorGraph, eliminateOne_l1_fast ) GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, ordering[kl(1)], EliminateQR).first; // create expected Conditional Gaussian - double sig = sqrt(2)/10.; + double sig = sqrt(2.0)/10.; Matrix I = eye(2)/sig, R11 = I, S12 = -0.5*I, S13 = -0.5*I; Vector d = Vector_(2, -0.1, 0.25)/sig, sigma = ones(2); GaussianConditional expected(ordering[kl(1)],d,R11,ordering[kx(1)],S12,ordering[kx(2)],S13,sigma); diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index f56efae82..6ab543d1e 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -70,7 +70,7 @@ TEST( Graph, predecessorMap2Graph ) p_map.insert(kx(1), kx(2)); p_map.insert(kx(2), kx(2)); p_map.insert(kx(3), kx(2)); - tie(graph, root, key2vertex) = predecessorMap2Graph, SVertex, Key>(p_map); + boost::tie(graph, root, key2vertex) = predecessorMap2Graph, SVertex, Key>(p_map); LONGS_EQUAL(3, boost::num_vertices(graph)); CHECK(root == key2vertex[kx(2)]); diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index 6ad070698..d399f6eac 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -41,7 +41,7 @@ TEST( inference, marginals ) *GaussianSequentialSolver(GaussianFactorGraph(cbn)).jointFactorGraph(xvar)).eliminate(); // expected is just scalar Gaussian on x - GaussianBayesNet expected = scalarGaussian(0, 4, sqrt(2)); + GaussianBayesNet expected = scalarGaussian(0, 4, sqrt(2.0)); CHECK(assert_equal(expected,actual)); } diff --git a/tests/testMarginals.cpp b/tests/testMarginals.cpp index a91e6b576..1563e395e 100644 --- a/tests/testMarginals.cpp +++ b/tests/testMarginals.cpp @@ -71,7 +71,7 @@ TEST(Marginals, planarSLAMmarginals) { Rot2 bearing11 = Rot2::fromDegrees(45), bearing21 = Rot2::fromDegrees(90), bearing32 = Rot2::fromDegrees(90); - double range11 = sqrt(4+4), + double range11 = sqrt(4.0+4.0), range21 = 2.0, range32 = 2.0; From 5a3316af9e2f7ce3df6a0fe9ad951494a2a3404a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 23 May 2012 20:56:19 +0000 Subject: [PATCH 053/914] Tweaked more build settings for visual studio --- gtsam/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index e0cc0eae1..e8dc712aa 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -95,6 +95,10 @@ if (GTSAM_BUILD_STATIC_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) + if(MSVC) + set_target_properties(gtsam-static PROPERTIES + COMPILE_FLAGS "/MP") + endif() install(TARGETS gtsam-static ARCHIVE DESTINATION lib) endif (GTSAM_BUILD_STATIC_LIBRARY) @@ -107,6 +111,10 @@ if (GTSAM_BUILD_SHARED_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) + if(MSVC) + set_target_properties(gtsam-shared PROPERTIES + COMPILE_FLAGS "/MP") + endif() install(TARGETS gtsam-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) endif(GTSAM_BUILD_SHARED_LIBRARY) From 6e2312294cf22e86d9237dba756256e5577e45f7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 23 May 2012 20:56:22 +0000 Subject: [PATCH 054/914] Added computeInformation function to GaussianFactor to properly compute information matrix including noise models, and using it to fix bug in Marginals where noise model was not being accounted for (only affects when hard constraints are used) --- gtsam/linear/GaussianFactor.h | 11 +++++++++++ gtsam/linear/HessianFactor.cpp | 11 ++++++++--- gtsam/linear/HessianFactor.h | 17 +++++++++++++++++ gtsam/linear/JacobianFactor.cpp | 10 ++++++++-- gtsam/linear/JacobianFactor.h | 10 ++++++++++ gtsam/nonlinear/Marginals.cpp | 13 +++---------- 6 files changed, 57 insertions(+), 15 deletions(-) diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index 3fdad19c6..e2537b7b4 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -20,6 +20,7 @@ #pragma once +#include #include #include @@ -88,6 +89,16 @@ namespace gtsam { /** Return the dimension of the variable pointed to by the given key iterator */ virtual size_t getDim(const_iterator variable) const = 0; + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + */ + virtual Matrix computeInformation() const = 0; + /** Clone a factor (make a deep copy) */ virtual GaussianFactor::shared_ptr clone() const = 0; diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index ebe94514b..8628c95ef 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -188,7 +188,7 @@ HessianFactor::HessianFactor(const std::vector& js, const std::vectorsize(), this->size(), 0); } +/* ************************************************************************* */ +Matrix HessianFactor::computeInformation() const { + return info_.full().selfadjointView(); +} + /* ************************************************************************* */ double HessianFactor::error(const VectorValues& c) const { // error 0.5*(f - 2*x'*g + x'*G*x) @@ -345,7 +350,7 @@ void HessianFactor::updateATA(const HessianFactor& update, const Scatter& scatte // First build an array of slots tic(1, "slots"); - size_t* slots = (size_t*)alloca(sizeof(size_t)*update.size()); // FIXME: alloca is bad, just ask Google. + size_t* slots = (size_t*)alloca(sizeof(size_t)*update.size()); // FIXME: alloca is bad, just ask Google. size_t slot = 0; BOOST_FOREACH(Index j, update) { slots[slot] = scatter.find(j)->second.slot; @@ -399,7 +404,7 @@ void HessianFactor::updateATA(const JacobianFactor& update, const Scatter& scatt // First build an array of slots tic(1, "slots"); - size_t* slots = (size_t*)alloca(sizeof(size_t)*update.size()); // FIXME: alloca is bad, just ask Google. + size_t* slots = (size_t*)alloca(sizeof(size_t)*update.size()); // FIXME: alloca is bad, just ask Google. size_t slot = 0; BOOST_FOREACH(Index j, update) { slots[slot] = scatter.find(j)->second.slot; diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index d6ff23159..1454e7a36 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -269,6 +269,23 @@ namespace gtsam { /** Return the complete linear term \f$ g \f$ as described above. * @return The linear term \f$ g \f$ */ constColumn linearTerm() const; + + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + * + * For HessianFactor, this is the same as info() except that this function + * returns a complete symmetric matrix whereas info() returns a matrix where + * only the upper triangle is valid, but should be interpreted as symmetric. + * This is because info() returns only a reference to the internal + * representation of the augmented information matrix, which stores only the + * upper triangle. + */ + virtual Matrix computeInformation() const; // Friend unit test classes friend class ::ConversionConstructorHessianFactorTest; diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 37fd74c39..2b884e1bd 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -118,7 +118,7 @@ namespace gtsam { GaussianFactor(GetKeys(terms.size(), terms.begin(), terms.end())), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { - size_t* dims = (size_t*)alloca(sizeof(size_t)*(terms.size()+1)); // FIXME: alloca is bad, just ask Google. + size_t* dims = (size_t*)alloca(sizeof(size_t)*(terms.size()+1)); // FIXME: alloca is bad, just ask Google. for(size_t j=0; j >::const_iterator term=terms.begin(); for(; term!=terms.end(); ++term,++j) @@ -271,6 +271,12 @@ namespace gtsam { return 0.5 * weighted.dot(weighted); } + /* ************************************************************************* */ + Matrix JacobianFactor::computeInformation() const { + Matrix AbWhitened = Ab_.full(); + model_->WhitenInPlace(AbWhitened); + return AbWhitened.transpose() * AbWhitened; + } /* ************************************************************************* */ Vector JacobianFactor::operator*(const VectorValues& x) const { diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index b5a2dd500..048d44981 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -154,6 +154,16 @@ namespace gtsam { Vector unweighted_error(const VectorValues& c) const; /** (A*x-b) */ Vector error_vector(const VectorValues& c) const; /** (A*x-b)/sigma */ virtual double error(const VectorValues& c) const; /** 0.5*(A*x-b)'*D*(A*x-b) */ + + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + */ + virtual Matrix computeInformation() const; /** Check if the factor contains no information, i.e. zero rows. This does * not necessarily mean that the factor involves no variables (to check for diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index 61f7f8dad..936cfb806 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -69,16 +69,9 @@ Matrix Marginals::marginalInformation(Key variable) const { marginalFactor = bayesTree_.marginalFactor(index, EliminateQR); // Get information matrix (only store upper-right triangle) - if(typeid(*marginalFactor) == typeid(JacobianFactor)) { - JacobianFactor::constABlock A = static_cast(*marginalFactor).getA(); - return A.transpose() * A; // Compute A'A - } else if(typeid(*marginalFactor) == typeid(HessianFactor)) { - const HessianFactor& hessian = static_cast(*marginalFactor); - const size_t dim = hessian.getDim(hessian.begin()); - return hessian.info().topLeftCorner(dim,dim).selfadjointView(); // Take the non-augmented part of the information matrix - } else { - throw runtime_error("Internal error: Marginals::marginalInformation expected either a JacobianFactor or HessianFactor"); - } + Matrix info = marginalFactor->computeInformation(); + const int dim = info.rows() - 1; + return info.topLeftCorner(dim,dim); // Take the non-augmented part of the information matrix } /* ************************************************************************* */ From ac150043bdf83240add766c5810943d69a7d5a91 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 23 May 2012 21:23:27 +0000 Subject: [PATCH 055/914] Fixed wrap under windows --- wrap/Module.cpp | 9 +++++---- wrap/tests/testWrap.cpp | 11 +++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index dfd781016..98525e65d 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -25,12 +25,14 @@ #include #include #include +#include #include using namespace std; using namespace wrap; using namespace BOOST_SPIRIT_CLASSIC_NS; +namespace fs = boost::filesystem; typedef rule Rule; @@ -279,8 +281,8 @@ void verifyReturnTypes(const vector& validtypes, const vector& vt) { /* ************************************************************************* */ void Module::matlab_code(const string& toolboxPath, const string& mexExt, const string& mexFlags) const { - string installCmd = "install -d " + toolboxPath; - system(installCmd.c_str()); + + fs::create_directories(toolboxPath); // create make m-file string matlabMakeFileName = toolboxPath + "/make_" + name + ".m"; @@ -327,8 +329,7 @@ void Module::matlab_code(const string& toolboxPath, BOOST_FOREACH(Class cls, classes) { // create directory if needed string classPath = toolboxPath + "/@" + cls.qualifiedName(); - string installCmd = "install -d " + classPath; - system(installCmd.c_str()); + fs::create_directories(classPath); // create proxy class string classFile = classPath + "/" + cls.qualifiedName() + ".m"; diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index cdee692a5..91b2161f7 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ using namespace std; using namespace boost::assign; using namespace wrap; +namespace fs = boost::filesystem; static bool enable_verbose = false; #ifdef TOPSRCDIR static string topdir = TOPSRCDIR; @@ -57,8 +59,7 @@ TEST( wrap, check_exception ) { CHECK_EXCEPTION(Module("/alsonotarealpath", "geometry",enable_verbose), CantOpenFile); // clean out previous generated code - string cleanCmd = "rm -rf actual_deps"; - system(cleanCmd.c_str()); + fs::remove_all("actual_deps"); string path = topdir + "/wrap/tests"; Module module(path.c_str(), "testDependencies",enable_verbose); @@ -208,8 +209,7 @@ TEST( wrap, matlab_code_namespaces ) { string path = topdir + "/wrap"; // clean out previous generated code - string cleanCmd = "rm -rf actual_namespaces"; - system(cleanCmd.c_str()); + fs::remove_all("actual_namespaces"); // emit MATLAB code string exp_path = path + "/tests/expected_namespaces/"; @@ -263,8 +263,7 @@ TEST( wrap, matlab_code ) { string path = topdir + "/wrap"; // clean out previous generated code - string cleanCmd = "rm -rf actual"; - system(cleanCmd.c_str()); + fs::remove_all("actual"); // emit MATLAB code // make_geometry will not compile, use make testwrap to generate real make From 90717dd5836d99f9c2d7fcd881423a5dc8541794 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 23 May 2012 21:23:32 +0000 Subject: [PATCH 056/914] Tweaking build settings for visual studio --- CMakeLists.txt | 2 +- examples/CMakeLists.txt | 14 ++++++++++++-- examples/vSLAMexample/CMakeLists.txt | 12 ++++++++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7198c5dfb..7f0b09e3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,7 +105,7 @@ endif() if(MSVC) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.40 COMPONENTS serialization system chrono REQUIRED) +find_package(Boost 1.40 COMPONENTS serialization system chrono filesystem REQUIRED) # General build settings include_directories( diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 00a93904a..f92312296 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,4 +1,6 @@ -add_custom_target(examples) +if(NOT MSVC) + add_custom_target(examples) +endif() # Build example executables FILE(GLOB example_srcs "*.cpp") @@ -6,7 +8,9 @@ foreach(example_src ${example_srcs} ) get_filename_component(example_base ${example_src} NAME_WE) set( example_bin ${example_base} ) message(STATUS "Adding Example ${example_bin}") - add_dependencies(examples ${example_bin}) + if(NOT MSVC) + add_dependencies(examples ${example_bin}) + endif() add_executable(${example_bin} ${example_src}) # Disable building during make all/install @@ -18,6 +22,12 @@ foreach(example_src ${example_srcs} ) if(NOT MSVC) add_custom_target(${example_bin}.run ${EXECUTABLE_OUTPUT_PATH}${example_bin} ${ARGN}) endif() + + # Set up Visual Studio folder + if(MSVC) + set_property(TARGET ${example_bin} PROPERTY FOLDER "Examples") + endif() + endforeach(example_src) add_subdirectory(vSLAMexample) diff --git a/examples/vSLAMexample/CMakeLists.txt b/examples/vSLAMexample/CMakeLists.txt index 57fd6bf6d..e231a03e6 100644 --- a/examples/vSLAMexample/CMakeLists.txt +++ b/examples/vSLAMexample/CMakeLists.txt @@ -3,12 +3,20 @@ message(STATUS "Adding Example vISAMexample") add_executable(vISAMexample vISAMexample.cpp vSLAMutils.cpp) target_link_libraries(vISAMexample gtsam-static) -add_dependencies(examples vISAMexample) +if(NOT MSVC) + add_dependencies(examples vISAMexample) +else() + set_property(TARGET vISAMexample PROPERTY FOLDER "Examples") +endif() message(STATUS "Adding Example vSFMexample") add_executable(vSFMexample vSFMexample.cpp vSLAMutils.cpp) target_link_libraries(vSFMexample gtsam-static) -add_dependencies(examples vSFMexample) +if(NOT MSVC) + add_dependencies(examples vSFMexample) +else() + set_property(TARGET vSFMexample PROPERTY FOLDER "Examples") +endif() From e57b569531d786afb3727380f5cee03ebc898627 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 24 May 2012 02:55:39 +0000 Subject: [PATCH 057/914] More descriptive error message when accessing a key that is not present - now tells what the key was --- gtsam/nonlinear/Ordering.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gtsam/nonlinear/Ordering.h b/gtsam/nonlinear/Ordering.h index e2837a1ca..879b50677 100644 --- a/gtsam/nonlinear/Ordering.h +++ b/gtsam/nonlinear/Ordering.h @@ -93,7 +93,8 @@ public: /// behavior of std::map) Index& operator[](Key key) { iterator i=order_.find(key); - if(i == order_.end()) throw std::out_of_range(std::string("Attempting to access a key from an ordering that does not contain that key")); + if(i == order_.end()) throw std::out_of_range( + std::string("Attempting to access a key from an ordering that does not contain that key:") + DefaultKeyFormatter(key)); else return i->second; } /// Access the index for the requested key, throws std::out_of_range if the @@ -101,7 +102,8 @@ public: /// behavior of std::map) Index operator[](Key key) const { const_iterator i=order_.find(key); - if(i == order_.end()) throw std::out_of_range(std::string("Attempting to access a key from an ordering that does not contain that key")); + if(i == order_.end()) throw std::out_of_range( + std::string("Attempting to access a key from an ordering that does not contain that key:") + DefaultKeyFormatter(key)); else return i->second; } /** Returns an iterator pointing to the symbol/index pair with the requested, From 32871bfceb9bafbc04c60e0ccd148c39a94976f9 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 24 May 2012 02:55:41 +0000 Subject: [PATCH 058/914] Fixed delete vs. delete[] in SimpleString - possible source of subtle errors --- CppUnitLite/SimpleString.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CppUnitLite/SimpleString.cpp b/CppUnitLite/SimpleString.cpp index 19dc7f258..190010d87 100644 --- a/CppUnitLite/SimpleString.cpp +++ b/CppUnitLite/SimpleString.cpp @@ -41,7 +41,7 @@ SimpleString::SimpleString (const SimpleString& other) SimpleString SimpleString::operator= (const SimpleString& other) { - delete buffer_; + delete [] buffer_; buffer_ = new char [other.size() + 1]; strcpy(buffer_, other.buffer_); return *this; @@ -50,7 +50,7 @@ SimpleString SimpleString::operator= (const SimpleString& other) SimpleString SimpleString::operator+ (const SimpleString& other) { SimpleString ret; - delete ret.buffer_; + delete [] ret.buffer_; ret.buffer_ = new char [size() + other.size() - 1]; strcpy(ret.buffer_, buffer_); strcat(ret.buffer_, other.buffer_); From 42853e0e599ad603497ddb5f6d8b18546bc2876a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 03:13:24 +0000 Subject: [PATCH 059/914] Fixed external From 47830cd56f337447821468b8ae270689c4d87e6e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 24 May 2012 16:05:01 +0000 Subject: [PATCH 060/914] Added clone and rekey facilities to nonlinear factor graph --- gtsam/nonlinear/NonlinearFactor.h | 18 +- gtsam/nonlinear/NonlinearFactorGraph.cpp | 208 +++++++++++++---------- gtsam/nonlinear/NonlinearFactorGraph.h | 16 ++ tests/testNonlinearFactorGraph.cpp | 37 ++++ 4 files changed, 186 insertions(+), 93 deletions(-) diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 89b6de3dd..2b7311306 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -161,7 +161,23 @@ public: virtual shared_ptr clone() const =0; /** - * Clones a factor and replaces its keys + * Creates a shared_ptr clone of the factor with different keys using + * a map from old->new keys + */ + shared_ptr rekey(const std::map& rekey_mapping) const { + shared_ptr new_factor = clone(); + for (size_t i=0; isize(); ++i) { + Key& cur_key = new_factor->keys()[i]; + std::map::const_iterator mapping = rekey_mapping.find(cur_key); + if (mapping != rekey_mapping.end()) + cur_key = mapping->second; + } + return new_factor; + } + + /** + * Clones a factor and fully replaces its keys + * @param new_keys is the full replacement set of keys */ shared_ptr rekey(const std::vector& new_keys) const { assert(new_keys.size() == this->keys().size()); diff --git a/gtsam/nonlinear/NonlinearFactorGraph.cpp b/gtsam/nonlinear/NonlinearFactorGraph.cpp index 2400ea996..d29e7282d 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.cpp +++ b/gtsam/nonlinear/NonlinearFactorGraph.cpp @@ -27,112 +27,136 @@ using namespace std; namespace gtsam { - /* ************************************************************************* */ - double NonlinearFactorGraph::probPrime(const Values& c) const { - return exp(-0.5 * error(c)); +/* ************************************************************************* */ +double NonlinearFactorGraph::probPrime(const Values& c) const { + return exp(-0.5 * error(c)); +} + +/* ************************************************************************* */ +void NonlinearFactorGraph::print(const std::string& str, const KeyFormatter& keyFormatter) const { + cout << str << "size: " << size() << endl; + for (size_t i = 0; i < factors_.size(); i++) { + stringstream ss; + ss << "factor " << i << ": "; + if (factors_[i] != NULL) factors_[i]->print(ss.str(), keyFormatter); } +} - /* ************************************************************************* */ - void NonlinearFactorGraph::print(const std::string& str, const KeyFormatter& keyFormatter) const { - cout << str << "size: " << size() << endl; - for (size_t i = 0; i < factors_.size(); i++) { - stringstream ss; - ss << "factor " << i << ": "; - if (factors_[i] != NULL) factors_[i]->print(ss.str(), keyFormatter); - } +/* ************************************************************************* */ +double NonlinearFactorGraph::error(const Values& c) const { + double total_error = 0.; + // iterate over all the factors_ to accumulate the log probabilities + BOOST_FOREACH(const sharedFactor& factor, this->factors_) { + if(factor) + total_error += factor->error(c); } + return total_error; +} - /* ************************************************************************* */ - double NonlinearFactorGraph::error(const Values& c) const { - double total_error = 0.; - // iterate over all the factors_ to accumulate the log probabilities - BOOST_FOREACH(const sharedFactor& factor, this->factors_) { - if(factor) - total_error += factor->error(c); - } - return total_error; +/* ************************************************************************* */ +std::set NonlinearFactorGraph::keys() const { + std::set keys; + BOOST_FOREACH(const sharedFactor& factor, this->factors_) { + if(factor) + keys.insert(factor->begin(), factor->end()); } + return keys; +} - /* ************************************************************************* */ - std::set NonlinearFactorGraph::keys() const { - std::set keys; - BOOST_FOREACH(const sharedFactor& factor, this->factors_) { - if(factor) - keys.insert(factor->begin(), factor->end()); - } - return keys; - } - - /* ************************************************************************* */ - Ordering::shared_ptr NonlinearFactorGraph::orderingCOLAMD( - const Values& config) const { - - // Create symbolic graph and initial (iterator) ordering - SymbolicFactorGraph::shared_ptr symbolic; - Ordering::shared_ptr ordering; - boost::tie(symbolic, ordering) = this->symbolic(config); - - // Compute the VariableIndex (column-wise index) - VariableIndex variableIndex(*symbolic, ordering->size()); - if (config.size() != variableIndex.size()) throw std::runtime_error( - "orderingCOLAMD: some variables in the graph are not constrained!"); - - // Compute a fill-reducing ordering with COLAMD - Permutation::shared_ptr colamdPerm(inference::PermutationCOLAMD( - variableIndex)); - - // Permute the Ordering with the COLAMD ordering - ordering->permuteWithInverse(*colamdPerm->inverse()); - - // Return the Ordering and VariableIndex to be re-used during linearization - // and elimination - return ordering; - } - - /* ************************************************************************* */ - SymbolicFactorGraph::shared_ptr NonlinearFactorGraph::symbolic(const Ordering& ordering) const { - // Generate the symbolic factor graph - SymbolicFactorGraph::shared_ptr symbolicfg(new SymbolicFactorGraph); - symbolicfg->reserve(this->size()); - - BOOST_FOREACH(const sharedFactor& factor, this->factors_) { - if(factor) - symbolicfg->push_back(factor->symbolic(ordering)); - else - symbolicfg->push_back(SymbolicFactorGraph::sharedFactor()); - } - - return symbolicfg; - } - - /* ************************************************************************* */ - pair NonlinearFactorGraph::symbolic( +/* ************************************************************************* */ +Ordering::shared_ptr NonlinearFactorGraph::orderingCOLAMD( const Values& config) const { - // Generate an initial key ordering in iterator order - Ordering::shared_ptr ordering(config.orderingArbitrary()); - return make_pair(symbolic(*ordering), ordering); + + // Create symbolic graph and initial (iterator) ordering + SymbolicFactorGraph::shared_ptr symbolic; + Ordering::shared_ptr ordering; + boost::tie(symbolic, ordering) = this->symbolic(config); + + // Compute the VariableIndex (column-wise index) + VariableIndex variableIndex(*symbolic, ordering->size()); + if (config.size() != variableIndex.size()) throw std::runtime_error( + "orderingCOLAMD: some variables in the graph are not constrained!"); + + // Compute a fill-reducing ordering with COLAMD + Permutation::shared_ptr colamdPerm(inference::PermutationCOLAMD( + variableIndex)); + + // Permute the Ordering with the COLAMD ordering + ordering->permuteWithInverse(*colamdPerm->inverse()); + + // Return the Ordering and VariableIndex to be re-used during linearization + // and elimination + return ordering; +} + +/* ************************************************************************* */ +SymbolicFactorGraph::shared_ptr NonlinearFactorGraph::symbolic(const Ordering& ordering) const { + // Generate the symbolic factor graph + SymbolicFactorGraph::shared_ptr symbolicfg(new SymbolicFactorGraph); + symbolicfg->reserve(this->size()); + + BOOST_FOREACH(const sharedFactor& factor, this->factors_) { + if(factor) + symbolicfg->push_back(factor->symbolic(ordering)); + else + symbolicfg->push_back(SymbolicFactorGraph::sharedFactor()); } - /* ************************************************************************* */ - GaussianFactorGraph::shared_ptr NonlinearFactorGraph::linearize( - const Values& config, const Ordering& ordering) const { + return symbolicfg; +} - // create an empty linear FG - GaussianFactorGraph::shared_ptr linearFG(new GaussianFactorGraph); - linearFG->reserve(this->size()); +/* ************************************************************************* */ +pair NonlinearFactorGraph::symbolic( + const Values& config) const { + // Generate an initial key ordering in iterator order + Ordering::shared_ptr ordering(config.orderingArbitrary()); + return make_pair(symbolic(*ordering), ordering); +} - // linearize all factors - BOOST_FOREACH(const sharedFactor& factor, this->factors_) { - if(factor) { - GaussianFactor::shared_ptr lf = factor->linearize(config, ordering); - if (lf) linearFG->push_back(lf); - } else - linearFG->push_back(GaussianFactor::shared_ptr()); - } +/* ************************************************************************* */ +GaussianFactorGraph::shared_ptr NonlinearFactorGraph::linearize( + const Values& config, const Ordering& ordering) const { - return linearFG; + // create an empty linear FG + GaussianFactorGraph::shared_ptr linearFG(new GaussianFactorGraph); + linearFG->reserve(this->size()); + + // linearize all factors + BOOST_FOREACH(const sharedFactor& factor, this->factors_) { + if(factor) { + GaussianFactor::shared_ptr lf = factor->linearize(config, ordering); + if (lf) linearFG->push_back(lf); + } else + linearFG->push_back(GaussianFactor::shared_ptr()); } + return linearFG; +} + +/* ************************************************************************* */ +NonlinearFactorGraph NonlinearFactorGraph::clone() const { + NonlinearFactorGraph result; + BOOST_FOREACH(const sharedFactor& f, *this) { + if (f) + result.push_back(f->clone()); + else + result.push_back(sharedFactor()); // Passes on null factors so indices remain valid + } + return result; +} + +/* ************************************************************************* */ +NonlinearFactorGraph NonlinearFactorGraph::rekey(const std::map& rekey_mapping) const { + NonlinearFactorGraph result; + BOOST_FOREACH(const sharedFactor& f, *this) { + if (f) + result.push_back(f->rekey(rekey_mapping)); + else + result.push_back(sharedFactor()); + } + return result; +} + /* ************************************************************************* */ } // namespace gtsam diff --git a/gtsam/nonlinear/NonlinearFactorGraph.h b/gtsam/nonlinear/NonlinearFactorGraph.h index 3caeec680..82b364ddf 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.h +++ b/gtsam/nonlinear/NonlinearFactorGraph.h @@ -87,6 +87,22 @@ namespace gtsam { boost::shared_ptr linearize(const Values& config, const Ordering& ordering) const; + /** + * Clone() performs a deep-copy of the graph, including all of the factors + */ + NonlinearFactorGraph clone() const; + + /** + * Rekey() performs a deep-copy of all of the factors, and changes + * keys according to a mapping. + * + * Keys not specified in the mapping will remain unchanged. + * + * @param rekey_mapping is a map of old->new keys + * @result a cloned graph with updated keys + */ + NonlinearFactorGraph rekey(const std::map& rekey_mapping) const; + private: /** Serialization function */ diff --git a/tests/testNonlinearFactorGraph.cpp b/tests/testNonlinearFactorGraph.cpp index 92e569038..4f3e7560f 100644 --- a/tests/testNonlinearFactorGraph.cpp +++ b/tests/testNonlinearFactorGraph.cpp @@ -107,6 +107,43 @@ TEST( Graph, linearize ) CHECK(assert_equal(expected,*linearized)); // Needs correct linearizations } +/* ************************************************************************* */ +TEST( Graph, clone ) +{ + Graph fg = createNonlinearFactorGraph(); + Graph actClone = fg.clone(); + EXPECT(assert_equal(fg, actClone)); + for (size_t i=0; i rekey_mapping; + rekey_mapping.insert(make_pair(kl(1), kl(4))); + Graph actRekey = init.rekey(rekey_mapping); + + // ensure deep clone + LONGS_EQUAL(init.size(), actRekey.size()); + for (size_t i=0; i Date: Thu, 24 May 2012 20:11:36 +0000 Subject: [PATCH 061/914] Removed leading-underscore names that conflict with windows macros --- gtsam/base/cholesky.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/base/cholesky.h b/gtsam/base/cholesky.h index 50d3b24a8..46d342d24 100644 --- a/gtsam/base/cholesky.h +++ b/gtsam/base/cholesky.h @@ -34,7 +34,7 @@ struct NegativeMatrixException : public std::exception { Matrix A; ///< The original matrix attempted to factor Matrix U; ///< The produced upper-triangular factor Matrix D; ///< The produced diagonal factor - Detail(const Matrix& _A, const Matrix& _U, const Matrix& _D) /**< Detail constructor */ : A(_A), U(_U), D(_D) {} + Detail(const Matrix& A, const Matrix& U, const Matrix& D) /**< Detail constructor */ : A(A), U(U), D(D) {} void print(const std::string& str = "") const { std::cout << str << "\n"; gtsam::print(A, " A: "); From d945dd8b6ad68a63234a66bb53f36a7b31aebc91 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:11:38 +0000 Subject: [PATCH 062/914] Tweaking build settings for visual studio --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b598bacf..983fece25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ include(GtsamTesting) include(GtsamPrinting) # guard against in-source builds -if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} AND NOT MSVC) +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. ") endif() From da5b01ff0fc4e588e83874961b80f9e3928b644d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:11:40 +0000 Subject: [PATCH 063/914] Updated boost version requirement in README --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 45698af8e..c38c12306 100644 --- a/README +++ b/README @@ -51,7 +51,7 @@ Important Installation Notes 1) GTSAM requires the following libraries to be installed on your system: - - BOOST version 1.40 or greater (install through Linux repositories or MacPorts) + - BOOST version 1.43 or greater (install through Linux repositories or MacPorts) - Cmake version 2.6 or higher - Support for XCode 4.3 command line tools on Mac requires CMake 2.8.8 or higher From 9cf1d8649d106e3779aedb5cd74b08858ccae1ea Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:11:42 +0000 Subject: [PATCH 064/914] Build script fixes --- gtsam/CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index e8dc712aa..8dd9a72ce 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -74,10 +74,7 @@ set(gtsam_srcs ) # Create MSVC structure -file(GLOB_RECURSE all_c_srcs "*.c") -file(GLOB_RECURSE all_cpp_srcs "*.cpp") -file(GLOB_RECURSE all_headers "*.h") -gtsam_assign_source_folders("${all_c_srcs};${all_cpp_srcs};${all_headers}") +gtsam_assign_all_source_folders() # Versions set(gtsam_version ${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}) From 8f43298d2142df5b975912c86fb10478058665af Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:11:45 +0000 Subject: [PATCH 065/914] Whitespace --- gtsam/linear/JacobianFactor.h | 20 ++++++++++---------- gtsam/nonlinear/ISAM2.cpp | 16 ++++++++-------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 048d44981..30e8e19bb 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -154,16 +154,16 @@ namespace gtsam { Vector unweighted_error(const VectorValues& c) const; /** (A*x-b) */ Vector error_vector(const VectorValues& c) const; /** (A*x-b)/sigma */ virtual double error(const VectorValues& c) const; /** 0.5*(A*x-b)'*D*(A*x-b) */ - - /** Return the augmented information matrix represented by this GaussianFactor. - * The augmented information matrix contains the information matrix with an - * additional column holding the information vector, and an additional row - * holding the transpose of the information vector. The lower-right entry - * contains the constant error term (when \f$ \delta x = 0 \f$). The - * augmented information matrix is described in more detail in HessianFactor, - * which in fact stores an augmented information matrix. - */ - virtual Matrix computeInformation() const; + + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + */ + virtual Matrix computeInformation() const; /** Check if the factor contains no information, i.e. zero rows. This does * not necessarily mean that the factor involves no variables (to check for diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index bae2252d6..d785657a3 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -348,7 +348,7 @@ boost::shared_ptr > ISAM2::recalculate( // Reeliminated keys for detailed results if(params_.enableDetailedResults) { BOOST_FOREACH(Key key, theta_.keys()) { - result.detail->variableStatus[key].isReeliminated = true; + result.detail->variableStatus[key].isReeliminated = true; } } @@ -372,7 +372,7 @@ boost::shared_ptr > ISAM2::recalculate( // Reeliminated keys for detailed results if(params_.enableDetailedResults) { BOOST_FOREACH(Index index, affectedAndNewKeys) { - result.detail->variableStatus[inverseOrdering_->at(index)].isReeliminated = true; + result.detail->variableStatus[inverseOrdering_->at(index)].isReeliminated = true; } } @@ -485,7 +485,7 @@ boost::shared_ptr > ISAM2::recalculate( // Root clique variables for detailed results if(params_.enableDetailedResults) { BOOST_FOREACH(Index index, this->root()->conditional()->frontals()) { - result.detail->variableStatus[inverseOrdering_->at(index)].inRootClique = true; + result.detail->variableStatus[inverseOrdering_->at(index)].inRootClique = true; } } @@ -572,7 +572,7 @@ ISAM2Result ISAM2::update( // Observed keys for detailed results if(params_.enableDetailedResults) { BOOST_FOREACH(Index index, markedKeys) { - result.detail->variableStatus[inverseOrdering_->at(index)].isObserved = true; + result.detail->variableStatus[inverseOrdering_->at(index)].isObserved = true; } } // NOTE: we use assign instead of the iterator constructor here because this @@ -732,10 +732,10 @@ Values ISAM2::calculateEstimate() const { // We use ExpmapMasked here instead of regular expmap because the former // handles Permuted tic(1, "Copy Values"); - Values ret(theta_); - toc(1, "Copy Values"); - tic(2, "getDelta"); - const Permuted& delta(getDelta()); + Values ret(theta_); + toc(1, "Copy Values"); + tic(2, "getDelta"); + const Permuted& delta(getDelta()); toc(2, "getDelta"); tic(3, "Expmap"); vector mask(ordering_.nVars(), true); From c3052fe5362b9124f5c0892db9ae5575dcddd905 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:11:48 +0000 Subject: [PATCH 066/914] Fixed conflicts with build-in windows names --- gtsam/base/Matrix.cpp | 4 ++-- gtsam/base/Matrix.h | 6 +++--- gtsam/base/Vector.cpp | 4 ++-- gtsam/base/Vector.h | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index 57a45d4a1..320dbe896 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -236,8 +236,8 @@ void save(const Matrix& A, const string &s, const string& filename) { } /* ************************************************************************* */ -void insertSub(Matrix& big, const Matrix& small, size_t i, size_t j) { - big.block(i, j, small.rows(), small.cols()) = small; +void insertSub(Matrix& fullMatrix, const Matrix& subMatrix, size_t i, size_t j) { + fullMatrix.block(i, j, subMatrix.rows(), subMatrix.cols()) = subMatrix; } /* ************************************************************************* */ diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index fd7dac1fc..9093fb99d 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -201,12 +201,12 @@ Eigen::Block sub(const MATRIX& A, size_t i1, size_t i2, size_t j1, /** * insert a submatrix IN PLACE at a specified location in a larger matrix * NOTE: there is no size checking - * @param large matrix to be updated - * @param small matrix to be inserted + * @param fullMatrix matrix to be updated + * @param subMatrix matrix to be inserted * @param i is the row of the upper left corner insert location * @param j is the column of the upper left corner insert location */ -void insertSub(Matrix& big, const Matrix& small, size_t i, size_t j); +void insertSub(Matrix& fullMatrix, const Matrix& subMatrix, size_t i, size_t j); /** * Extracts a column view from a matrix that avoids a copy diff --git a/gtsam/base/Vector.cpp b/gtsam/base/Vector.cpp index 98ad43e05..19546016f 100644 --- a/gtsam/base/Vector.cpp +++ b/gtsam/base/Vector.cpp @@ -251,8 +251,8 @@ ConstSubVector sub(const Vector &v, size_t i1, size_t i2) { } /* ************************************************************************* */ -void subInsert(Vector& big, const Vector& small, size_t i) { - big.segment(i, small.size()) = small; +void subInsert(Vector& fullVector, const Vector& subVector, size_t i) { + fullVector.segment(i, subVector.size()) = subVector; } /* ************************************************************************* */ diff --git a/gtsam/base/Vector.h b/gtsam/base/Vector.h index b4be74f4e..40fed145c 100644 --- a/gtsam/base/Vector.h +++ b/gtsam/base/Vector.h @@ -209,11 +209,11 @@ ConstSubVector sub(const Vector &v, size_t i1, size_t i2); /** * Inserts a subvector into a vector IN PLACE - * @param big is the vector to be changed - * @param small is the vector to insert + * @param fullVector is the vector to be changed + * @param subVector is the vector to insert * @param i is the index where the subvector should be inserted */ -void subInsert(Vector& big, const Vector& small, size_t i); +void subInsert(Vector& fullVector, const Vector& subVector, size_t i); /** * elementwise multiplication From c12d316fff27697705567f4df3b9235dfbf5f892 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:11:52 +0000 Subject: [PATCH 067/914] Updated svn:ignore From b73af866d62e9a80244b86ce3225bc40e96691ce Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:43:19 +0000 Subject: [PATCH 068/914] Added computeInformation function to GaussianFactor to properly compute information matrix including noise models, and using it to fix bug in Marginals where noise model was not being accounted for (only affects when hard constraints are used) --- gtsam/linear/GaussianFactor.h | 11 +++++++++++ gtsam/linear/HessianFactor.cpp | 5 +++++ gtsam/linear/HessianFactor.h | 17 +++++++++++++++++ gtsam/linear/JacobianFactor.cpp | 6 ++++++ gtsam/linear/JacobianFactor.h | 10 ++++++++++ gtsam/nonlinear/Marginals.cpp | 13 +++---------- 6 files changed, 52 insertions(+), 10 deletions(-) diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index 3fdad19c6..e2537b7b4 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -20,6 +20,7 @@ #pragma once +#include #include #include @@ -88,6 +89,16 @@ namespace gtsam { /** Return the dimension of the variable pointed to by the given key iterator */ virtual size_t getDim(const_iterator variable) const = 0; + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + */ + virtual Matrix computeInformation() const = 0; + /** Clone a factor (make a deep copy) */ virtual GaussianFactor::shared_ptr clone() const = 0; diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index b1f829005..aca473053 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -324,6 +324,11 @@ HessianFactor::constColumn HessianFactor::linearTerm() const { return info_.rangeColumn(0, this->size(), this->size(), 0); } +/* ************************************************************************* */ +Matrix HessianFactor::computeInformation() const { + return info_.full().selfadjointView(); +} + /* ************************************************************************* */ double HessianFactor::error(const VectorValues& c) const { // error 0.5*(f - 2*x'*g + x'*G*x) diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index d6ff23159..1454e7a36 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -269,6 +269,23 @@ namespace gtsam { /** Return the complete linear term \f$ g \f$ as described above. * @return The linear term \f$ g \f$ */ constColumn linearTerm() const; + + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + * + * For HessianFactor, this is the same as info() except that this function + * returns a complete symmetric matrix whereas info() returns a matrix where + * only the upper triangle is valid, but should be interpreted as symmetric. + * This is because info() returns only a reference to the internal + * representation of the augmented information matrix, which stores only the + * upper triangle. + */ + virtual Matrix computeInformation() const; // Friend unit test classes friend class ::ConversionConstructorHessianFactorTest; diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index e2facec40..c7cdf6ce3 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -271,6 +271,12 @@ namespace gtsam { return 0.5 * weighted.dot(weighted); } + /* ************************************************************************* */ + Matrix JacobianFactor::computeInformation() const { + Matrix AbWhitened = Ab_.full(); + model_->WhitenInPlace(AbWhitened); + return AbWhitened.transpose() * AbWhitened; + } /* ************************************************************************* */ Vector JacobianFactor::operator*(const VectorValues& x) const { diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index b5a2dd500..048d44981 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -154,6 +154,16 @@ namespace gtsam { Vector unweighted_error(const VectorValues& c) const; /** (A*x-b) */ Vector error_vector(const VectorValues& c) const; /** (A*x-b)/sigma */ virtual double error(const VectorValues& c) const; /** 0.5*(A*x-b)'*D*(A*x-b) */ + + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + */ + virtual Matrix computeInformation() const; /** Check if the factor contains no information, i.e. zero rows. This does * not necessarily mean that the factor involves no variables (to check for diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index ec837bc26..1abeb5ae9 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -69,16 +69,9 @@ Matrix Marginals::marginalInformation(Key variable) const { marginalFactor = bayesTree_.marginalFactor(index, EliminateQR); // Get information matrix (only store upper-right triangle) - if(typeid(*marginalFactor) == typeid(JacobianFactor)) { - JacobianFactor::constABlock A = static_cast(*marginalFactor).getA(); - return A.transpose() * A; // Compute A'A - } else if(typeid(*marginalFactor) == typeid(HessianFactor)) { - const HessianFactor& hessian = static_cast(*marginalFactor); - const size_t dim = hessian.getDim(hessian.begin()); - return hessian.info().topLeftCorner(dim,dim).selfadjointView(); // Take the non-augmented part of the information matrix - } else { - throw runtime_error("Internal error: Marginals::marginalInformation expected either a JacobianFactor or HessianFactor"); - } + Matrix info = marginalFactor->computeInformation(); + const int dim = info.rows() - 1; + return info.topLeftCorner(dim,dim); // Take the non-augmented part of the information matrix } /* ************************************************************************* */ From 451dd5ef1b632209d15a7679f05569a5e647406c Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 24 May 2012 20:43:22 +0000 Subject: [PATCH 069/914] Updated boost version requirement in README --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 45698af8e..c38c12306 100644 --- a/README +++ b/README @@ -51,7 +51,7 @@ Important Installation Notes 1) GTSAM requires the following libraries to be installed on your system: - - BOOST version 1.40 or greater (install through Linux repositories or MacPorts) + - BOOST version 1.43 or greater (install through Linux repositories or MacPorts) - Cmake version 2.6 or higher - Support for XCode 4.3 command line tools on Mac requires CMake 2.8.8 or higher From 421a0725dd356cd7dc871c27b1049632065a30d2 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 25 May 2012 14:12:28 +0000 Subject: [PATCH 070/914] Added a default implementation of clone() for nonlinear factor so not all subclasses need to implement clone(). Default implementation throws an exception. --- gtsam/nonlinear/NonlinearFactor.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 2b7311306..bf6527599 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -157,8 +157,14 @@ public: /** * Creates a shared_ptr clone of the factor - needs to be specialized to allow * for subclasses + * + * By default, throws exception if subclass does not implement the function. */ - virtual shared_ptr clone() const =0; + virtual shared_ptr clone() const { + // TODO: choose better exception to throw here + throw std::runtime_error("NonlinearFactor::clone(): Attempting to clone factor with no clone() implemented!"); + return shared_ptr(); + } /** * Creates a shared_ptr clone of the factor with different keys using From 4ed447ca8e87e82f1df6d2b108a387b94e20839e Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 25 May 2012 14:51:03 +0000 Subject: [PATCH 071/914] Fixed CSP, now a DiscreteFactorGraph again, uses dynamic_cast for Constraint-specific functionality :-( --- gtsam_unstable/discrete/AllDiff.cpp | 2 +- gtsam_unstable/discrete/BinaryAllDiff.h | 2 +- gtsam_unstable/discrete/CMakeLists.txt | 3 +- gtsam_unstable/discrete/CSP.cpp | 11 ++-- gtsam_unstable/discrete/CSP.h | 59 ++++++++------------ gtsam_unstable/discrete/SingleValue.cpp | 4 +- gtsam_unstable/discrete/tests/testCSP.cpp | 18 +++--- gtsam_unstable/discrete/tests/testSudoku.cpp | 10 ++-- 8 files changed, 52 insertions(+), 57 deletions(-) diff --git a/gtsam_unstable/discrete/AllDiff.cpp b/gtsam_unstable/discrete/AllDiff.cpp index 46efd4499..0cab961e1 100644 --- a/gtsam_unstable/discrete/AllDiff.cpp +++ b/gtsam_unstable/discrete/AllDiff.cpp @@ -21,7 +21,7 @@ namespace gtsam { /* ************************************************************************* */ void AllDiff::print(const std::string& s) const { - std::cout << s << ": AllDiff on "; + std::cout << s << "AllDiff on "; BOOST_FOREACH (Index dkey, keys_) std::cout << dkey << " "; std::cout << std::endl; diff --git a/gtsam_unstable/discrete/BinaryAllDiff.h b/gtsam_unstable/discrete/BinaryAllDiff.h index 04eeba953..46901fc7d 100644 --- a/gtsam_unstable/discrete/BinaryAllDiff.h +++ b/gtsam_unstable/discrete/BinaryAllDiff.h @@ -34,7 +34,7 @@ namespace gtsam { // print virtual void print(const std::string& s = "") const { - std::cout << s << ": BinaryAllDiff on " << keys_[0] << " and " << keys_[1] + std::cout << s << "BinaryAllDiff on " << keys_[0] << " and " << keys_[1] << std::endl; } diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index 3ba34d12b..707a67d84 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -18,7 +18,8 @@ set (discrete_full_libs # Exclude tests that don't work set (discrete_excluded_tests "${CMAKE_CURRENT_SOURCE_DIR}/tests/testScheduler.cpp" -"${CMAKE_CURRENT_SOURCE_DIR}/tests/testCSP.cpp") +#"${CMAKE_CURRENT_SOURCE_DIR}/tests/testCSP.cpp" +) # Add all tests diff --git a/gtsam_unstable/discrete/CSP.cpp b/gtsam_unstable/discrete/CSP.cpp index 4da2f440a..10c27d2bb 100644 --- a/gtsam_unstable/discrete/CSP.cpp +++ b/gtsam_unstable/discrete/CSP.cpp @@ -49,8 +49,9 @@ namespace gtsam { // if not already a singleton if (!domains[v].isSingleton()) { // get the constraint and call its ensureArcConsistency method - Constraint::shared_ptr factor = (*this)[f]; - changed[v] = factor->ensureArcConsistency(v,domains) || changed[v]; + Constraint::shared_ptr constraint = boost::dynamic_pointer_cast((*this)[f]); + if (!constraint) throw runtime_error("CSP:runArcConsistency: non-constraint factor"); + changed[v] = constraint->ensureArcConsistency(v,domains) || changed[v]; } } // f if (changed[v]) anyChange = true; @@ -84,8 +85,10 @@ namespace gtsam { // TODO: create a new ordering as we go, to ensure a connected graph // KeyOrdering ordering; // vector dkeys; - BOOST_FOREACH(const Constraint::shared_ptr& factor, factors_) { - Constraint::shared_ptr reduced = factor->partiallyApply(domains); + BOOST_FOREACH(const DiscreteFactor::shared_ptr& f, factors_) { + Constraint::shared_ptr constraint = boost::dynamic_pointer_cast(f); + if (!constraint) throw runtime_error("CSP:runArcConsistency: non-constraint factor"); + Constraint::shared_ptr reduced = constraint->partiallyApply(domains); if (print) reduced->print(); } #endif diff --git a/gtsam_unstable/discrete/CSP.h b/gtsam_unstable/discrete/CSP.h index e2e2a2251..ef4bbc17a 100644 --- a/gtsam_unstable/discrete/CSP.h +++ b/gtsam_unstable/discrete/CSP.h @@ -18,7 +18,7 @@ namespace gtsam { * A specialization of a DiscreteFactorGraph. * It knows about CSP-specific constraints and algorithms */ - class CSP: public FactorGraph { + class CSP: public DiscreteFactorGraph { public: /** A map from keys to values */ @@ -27,30 +27,10 @@ namespace gtsam { typedef boost::shared_ptr sharedValues; public: - /// Constructor - CSP() { - } - template - void add(const DiscreteKey& j, SOURCE table) { - DiscreteKeys keys; - keys.push_back(j); - push_back(boost::make_shared(keys, table)); - } - - template - void add(const DiscreteKey& j1, const DiscreteKey& j2, SOURCE table) { - DiscreteKeys keys; - keys.push_back(j1); - keys.push_back(j2); - push_back(boost::make_shared(keys, table)); - } - - /** add shared discreteFactor immediately from arguments */ - template - void add(const DiscreteKeys& keys, SOURCE table) { - push_back(boost::make_shared(keys, table)); - } +// /// Constructor +// CSP() { +// } /// Add a unary constraint, allowing only a single value void addSingleValue(const DiscreteKey& dkey, size_t value) { @@ -71,19 +51,28 @@ namespace gtsam { push_back(factor); } +// /** return product of all factors as a single factor */ +// DecisionTreeFactor product() const { +// DecisionTreeFactor result; +// BOOST_FOREACH(const sharedFactor& factor, *this) +// if (factor) result = (*factor) * result; +// return result; +// } + /// Find the best total assignment - can be expensive sharedValues optimalAssignment() const; - /* - * Perform loopy belief propagation - * True belief propagation would check for each value in domain - * whether any satisfying separator assignment can be found. - * This corresponds to hyper-arc consistency in CSP speak. - * This can be done by creating a mini-factor graph and search. - * For a nine-by-nine Sudoku, the search tree will be 8+6+6=20 levels deep. - * It will be very expensive to exclude values that way. - */ - // void applyBeliefPropagation(size_t nrIterations = 10) const; +// /* +// * Perform loopy belief propagation +// * True belief propagation would check for each value in domain +// * whether any satisfying separator assignment can be found. +// * This corresponds to hyper-arc consistency in CSP speak. +// * This can be done by creating a mini-factor graph and search. +// * For a nine-by-nine Sudoku, the search tree will be 8+6+6=20 levels deep. +// * It will be very expensive to exclude values that way. +// */ +// void applyBeliefPropagation(size_t nrIterations = 10) const; + /* * Apply arc-consistency ~ Approximate loopy belief propagation * We need to give the domains to a constraint, and it returns @@ -92,7 +81,7 @@ namespace gtsam { */ void runArcConsistency(size_t cardinality, size_t nrIterations = 10, bool print = false) const; - }; + }; // CSP } // gtsam diff --git a/gtsam_unstable/discrete/SingleValue.cpp b/gtsam_unstable/discrete/SingleValue.cpp index 855d62353..a626ecf13 100644 --- a/gtsam_unstable/discrete/SingleValue.cpp +++ b/gtsam_unstable/discrete/SingleValue.cpp @@ -17,8 +17,8 @@ namespace gtsam { /* ************************************************************************* */ void SingleValue::print(const string& s) const { - cout << s << ": SingleValue on " << keys_[0] << " (j=" << keys_[0] - << ") with value " << value_ << endl; + cout << s << "SingleValue on " << "j=" << keys_[0] + << " with value " << value_ << endl; } /* ************************************************************************* */ diff --git a/gtsam_unstable/discrete/tests/testCSP.cpp b/gtsam_unstable/discrete/tests/testCSP.cpp index 4d04afb92..c92cbe1f9 100644 --- a/gtsam_unstable/discrete/tests/testCSP.cpp +++ b/gtsam_unstable/discrete/tests/testCSP.cpp @@ -54,17 +54,17 @@ TEST_UNSAFE( CSP, allInOne) invalid[ID.first] = 0; invalid[UT.first] = 0; invalid[AZ.first] = 0; - EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // Check a valid combination DiscreteFactor::Values valid; valid[ID.first] = 0; valid[UT.first] = 1; valid[AZ.first] = 0; - EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // Just for fun, create the product and check it - DecisionTreeFactor product = csp.product(); // FIXME: fails due to lack of product() + DecisionTreeFactor product = csp.product(); // product.dot("product"); DecisionTreeFactor expectedProduct(ID & AZ & UT, "0 1 0 0 0 0 1 0"); EXPECT(assert_equal(expectedProduct,product)); @@ -74,7 +74,7 @@ TEST_UNSAFE( CSP, allInOne) CSP::Values expected; insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 1); EXPECT(assert_equal(expected,*mpe)); - EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); } /* ************************************************************************* */ @@ -122,7 +122,7 @@ TEST_UNSAFE( CSP, WesternUS) (MT.first,1)(WY.first,0)(NM.first,3)(CO.first,2) (ID.first,2)(UT.first,1)(AZ.first,0); EXPECT(assert_equal(expected,*mpe)); - EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // Write out the dual graph for hmetis #ifdef DUAL @@ -146,7 +146,7 @@ TEST_UNSAFE( CSP, AllDiff) dkeys += ID,UT,AZ; csp.addAllDiff(dkeys); csp.addSingleValue(AZ,2); - //GTSAM_PRINT(csp); +// GTSAM_PRINT(csp); // Check construction and conversion SingleValue s(AZ,2); @@ -167,21 +167,21 @@ TEST_UNSAFE( CSP, AllDiff) invalid[ID.first] = 0; invalid[UT.first] = 1; invalid[AZ.first] = 0; - EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(0, csp(invalid), 1e-9); // Check a valid combination DiscreteFactor::Values valid; valid[ID.first] = 0; valid[UT.first] = 1; valid[AZ.first] = 2; - EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9); // Solve CSP::sharedValues mpe = csp.optimalAssignment(); CSP::Values expected; insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 2); EXPECT(assert_equal(expected,*mpe)); - EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // FIXME: fails due to lack of operator() interface + EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9); // Arc-consistency vector domains; diff --git a/gtsam_unstable/discrete/tests/testSudoku.cpp b/gtsam_unstable/discrete/tests/testSudoku.cpp index 1bbac4777..583364ade 100644 --- a/gtsam_unstable/discrete/tests/testSudoku.cpp +++ b/gtsam_unstable/discrete/tests/testSudoku.cpp @@ -14,6 +14,8 @@ using namespace std; using namespace gtsam; +#define PRINT false + class Sudoku: public CSP { /// sudoku size @@ -119,7 +121,7 @@ TEST_UNSAFE( Sudoku, small) 0,1, 0,0); // Do BP - csp.runArcConsistency(4); + csp.runArcConsistency(4,10,PRINT); // optimize and check CSP::sharedValues solution = csp.optimalAssignment(); @@ -150,7 +152,7 @@ TEST_UNSAFE( Sudoku, easy) 5,0,0, 0,3,0, 7,0,0); // Do BP - sudoku.runArcConsistency(4); + sudoku.runArcConsistency(4,10,PRINT); // sudoku.printSolution(); // don't do it } @@ -172,7 +174,7 @@ TEST_UNSAFE( Sudoku, extreme) 0,0,0, 2,7,5, 9,0,0); // Do BP - sudoku.runArcConsistency(9,10,false); + sudoku.runArcConsistency(9,10,PRINT); #ifdef METIS VariableIndex index(sudoku); @@ -201,7 +203,7 @@ TEST_UNSAFE( Sudoku, AJC_3star_Feb8_2012) 0,0,0, 1,0,0, 0,3,7); // Do BP - sudoku.runArcConsistency(9,10,true); + sudoku.runArcConsistency(9,10,PRINT); //sudoku.printSolution(); // don't do it } From 14f119a787e9327a7b2289641e129de4b0b08f4f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 25 May 2012 15:09:59 +0000 Subject: [PATCH 072/914] Printing --- gtsam/discrete/DecisionTreeFactor.cpp | 2 +- gtsam/discrete/DecisionTreeFactor.h | 2 +- gtsam/discrete/DiscreteFactor.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gtsam/discrete/DecisionTreeFactor.cpp b/gtsam/discrete/DecisionTreeFactor.cpp index 23b761b3b..105ff3a38 100644 --- a/gtsam/discrete/DecisionTreeFactor.cpp +++ b/gtsam/discrete/DecisionTreeFactor.cpp @@ -49,7 +49,7 @@ namespace gtsam { /* ************************************************************************* */ void DecisionTreeFactor::print(const string& s) const { - cout << s << ":\n"; + cout << s; IndexFactor::print("IndexFactor:"); Potentials::print("Potentials:"); } diff --git a/gtsam/discrete/DecisionTreeFactor.h b/gtsam/discrete/DecisionTreeFactor.h index c63e59517..537bb3e60 100644 --- a/gtsam/discrete/DecisionTreeFactor.h +++ b/gtsam/discrete/DecisionTreeFactor.h @@ -72,7 +72,7 @@ namespace gtsam { bool equals(const DecisionTreeFactor& other, double tol = 1e-9) const; // print - void print(const std::string& s = "DecisionTreeFactor: ") const; + void print(const std::string& s = "DecisionTreeFactor:\n") const; /// @} /// @name Standard Interface diff --git a/gtsam/discrete/DiscreteFactor.h b/gtsam/discrete/DiscreteFactor.h index 8152ff726..3789389e4 100644 --- a/gtsam/discrete/DiscreteFactor.h +++ b/gtsam/discrete/DiscreteFactor.h @@ -82,7 +82,7 @@ namespace gtsam { /// @{ // print - virtual void print(const std::string& s = "DiscreteFactor") const { + virtual void print(const std::string& s = "DiscreteFactor\n") const { IndexFactor::print(s); } From de79924e7346f0b642c17e4cb03e752bb60f6b60 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 25 May 2012 15:10:13 +0000 Subject: [PATCH 073/914] Fixed discrete examples --- gtsam_unstable/discrete/CMakeLists.txt | 11 +++++------ gtsam_unstable/discrete/Scheduler.cpp | 11 +---------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index 707a67d84..5d61db848 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -16,10 +16,9 @@ set (discrete_full_libs gtsam_unstable-static) # Exclude tests that don't work -set (discrete_excluded_tests -"${CMAKE_CURRENT_SOURCE_DIR}/tests/testScheduler.cpp" -#"${CMAKE_CURRENT_SOURCE_DIR}/tests/testCSP.cpp" -) +#set (discrete_excluded_tests +#"${CMAKE_CURRENT_SOURCE_DIR}/tests/testScheduler.cpp" +#) # Add all tests @@ -27,8 +26,8 @@ gtsam_add_subdir_tests(discrete_unstable "${discrete_local_libs}" "${discrete_fu # List examples to build - comment out here to exclude from compilation set(discrete_unstable_examples -#schedulingExample -#schedulingQuals12 +schedulingExample +schedulingQuals12 ) if (GTSAM_BUILD_EXAMPLES) diff --git a/gtsam_unstable/discrete/Scheduler.cpp b/gtsam_unstable/discrete/Scheduler.cpp index 678ba1580..d551b1f0b 100644 --- a/gtsam_unstable/discrete/Scheduler.cpp +++ b/gtsam_unstable/discrete/Scheduler.cpp @@ -105,7 +105,6 @@ namespace gtsam { /** Add student-specific constraints to the graph */ void Scheduler::addStudentSpecificConstraints(size_t i, boost::optional slot) { -#ifdef BROKEN bool debug = ISDEBUG("Scheduler::buildGraph"); assert(i Date: Fri, 25 May 2012 15:11:40 +0000 Subject: [PATCH 074/914] ignore From ace43278970359c250793f65250d04a4c81d4684 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Fri, 25 May 2012 15:26:30 +0000 Subject: [PATCH 075/914] reorg the nonlinear/linear parameters to accommodate the iterative solvers --- examples/PlanarSLAMSelfContained_advanced.cpp | 2 +- gtsam/nonlinear/DoglegOptimizer.cpp | 20 ++--- gtsam/nonlinear/GaussNewtonOptimizer.cpp | 17 ++-- .../nonlinear/LevenbergMarquardtOptimizer.cpp | 19 +++-- .../SuccessiveLinearizationOptimizer.h | 83 ++++++++++++------- tests/testNonlinearOptimizer.cpp | 4 +- 6 files changed, 87 insertions(+), 58 deletions(-) diff --git a/examples/PlanarSLAMSelfContained_advanced.cpp b/examples/PlanarSLAMSelfContained_advanced.cpp index bd5c5295a..36f9ad8ca 100644 --- a/examples/PlanarSLAMSelfContained_advanced.cpp +++ b/examples/PlanarSLAMSelfContained_advanced.cpp @@ -113,7 +113,7 @@ int main(int argc, char** argv) { // first using sequential elimination LevenbergMarquardtParams lmParams; - lmParams.elimination = LevenbergMarquardtParams::SEQUENTIAL; + lmParams.linearSolverType = LevenbergMarquardtParams::SEQUENTIAL_CHOLESKY; Values resultSequential = LevenbergMarquardtOptimizer(graph, initial, lmParams).optimize(); resultSequential.print("final result (solved with a sequential solver)"); diff --git a/gtsam/nonlinear/DoglegOptimizer.cpp b/gtsam/nonlinear/DoglegOptimizer.cpp index 84090d666..91b3c92fd 100644 --- a/gtsam/nonlinear/DoglegOptimizer.cpp +++ b/gtsam/nonlinear/DoglegOptimizer.cpp @@ -33,25 +33,25 @@ void DoglegOptimizer::iterate(void) { const Ordering& ordering = *params_.ordering; GaussianFactorGraph::shared_ptr linear = graph_.linearize(state_.values, ordering); - // Get elimination method - GaussianFactorGraph::Eliminate eliminationMethod = params_.getEliminationFunction(); - // Pull out parameters we'll use const bool dlVerbose = (params_.verbosityDL > DoglegParams::SILENT); // Do Dogleg iteration with either Multifrontal or Sequential elimination DoglegOptimizerImpl::IterationResult result; - if(params_.elimination == DoglegParams::MULTIFRONTAL) { + if ( params_.isMultifrontal() ) { GaussianBayesTree bt; - bt.insert(GaussianJunctionTree(*linear).eliminate(eliminationMethod)); + bt.insert(GaussianJunctionTree(*linear).eliminate(params_.getEliminationFunction())); result = DoglegOptimizerImpl::Iterate(state_.Delta, DoglegOptimizerImpl::ONE_STEP_PER_ITERATION, bt, graph_, state_.values, ordering, state_.error, dlVerbose); - - } else if(params_.elimination == DoglegParams::SEQUENTIAL) { - GaussianBayesNet::shared_ptr bn = EliminationTree::Create(*linear)->eliminate(eliminationMethod); + } + else if ( params_.isSequential() ) { + GaussianBayesNet::shared_ptr bn = EliminationTree::Create(*linear)->eliminate(params_.getEliminationFunction()); result = DoglegOptimizerImpl::Iterate(state_.Delta, DoglegOptimizerImpl::ONE_STEP_PER_ITERATION, *bn, graph_, state_.values, ordering, state_.error, dlVerbose); - - } else { + } + else if ( params_.isSPCG() ) { + throw runtime_error("todo: "); + } + else { throw runtime_error("Optimization parameter is invalid: DoglegParams::elimination"); } diff --git a/gtsam/nonlinear/GaussNewtonOptimizer.cpp b/gtsam/nonlinear/GaussNewtonOptimizer.cpp index 8e2b20859..8d09b3edc 100644 --- a/gtsam/nonlinear/GaussNewtonOptimizer.cpp +++ b/gtsam/nonlinear/GaussNewtonOptimizer.cpp @@ -35,13 +35,18 @@ void GaussNewtonOptimizer::iterate() { // Optimize VectorValues delta; { - GaussianFactorGraph::Eliminate eliminationMethod = params_.getEliminationFunction(); - if(params_.elimination == GaussNewtonParams::MULTIFRONTAL) - delta = GaussianJunctionTree(*linear).optimize(eliminationMethod); - else if(params_.elimination == GaussNewtonParams::SEQUENTIAL) - delta = gtsam::optimize(*EliminationTree::Create(*linear)->eliminate(eliminationMethod)); - else + if ( params_.isMultifrontal() ) { + delta = GaussianJunctionTree(*linear).optimize(params_.getEliminationFunction()); + } + else if ( params_.isSequential() ) { + delta = gtsam::optimize(*EliminationTree::Create(*linear)->eliminate(params_.getEliminationFunction())); + } + else if ( params_.isSPCG() ) { + throw runtime_error("todo: "); + } + else { throw runtime_error("Optimization parameter is invalid: GaussNewtonParams::elimination"); + } } // Maybe show output diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 1b19cfe75..3ad26cb3a 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -32,9 +32,6 @@ void LevenbergMarquardtOptimizer::iterate() { // Linearize graph GaussianFactorGraph::shared_ptr linear = graph_.linearize(state_.values, *params_.ordering); - // Get elimination method - GaussianFactorGraph::Eliminate eliminationMethod = params_.getEliminationFunction(); - // Pull out parameters we'll use const NonlinearOptimizerParams::Verbosity nloVerbosity = params_.verbosity; const LevenbergMarquardtParams::VerbosityLM lmVerbosity = params_.verbosityLM; @@ -67,12 +64,18 @@ void LevenbergMarquardtOptimizer::iterate() { // Optimize VectorValues delta; - if(params_.elimination == SuccessiveLinearizationParams::MULTIFRONTAL) - delta = GaussianJunctionTree(dampedSystem).optimize(eliminationMethod); - else if(params_.elimination == SuccessiveLinearizationParams::SEQUENTIAL) - delta = gtsam::optimize(*EliminationTree::Create(dampedSystem)->eliminate(eliminationMethod)); - else + if ( params_.isMultifrontal() ) { + delta = GaussianJunctionTree(dampedSystem).optimize(params_.getEliminationFunction()); + } + else if ( params_.isSequential() ) { + delta = gtsam::optimize(*EliminationTree::Create(dampedSystem)->eliminate(params_.getEliminationFunction())); + } + else if ( params_.isSPCG() ) { + throw runtime_error("todo: "); + } + else { throw runtime_error("Optimization parameter is invalid: LevenbergMarquardtParams::elimination"); + } if (lmVerbosity >= LevenbergMarquardtParams::TRYLAMBDA) cout << "linear delta norm = " << delta.vector().norm() << endl; if (lmVerbosity >= LevenbergMarquardtParams::TRYDELTA) delta.print("delta"); diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index f17e01d49..2b3bfd3b6 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -24,42 +24,44 @@ namespace gtsam { class SuccessiveLinearizationParams : public NonlinearOptimizerParams { public: - /** See SuccessiveLinearizationParams::elimination */ - enum Elimination { - MULTIFRONTAL, - SEQUENTIAL + /** See SuccessiveLinearizationParams::linearSolverType */ + enum LinearSolverType { + MULTIFRONTAL_CHOLESKY, + MULTIFRONTAL_QR, + SEQUENTIAL_CHOLESKY, + SEQUENTIAL_QR, + SPCG }; - /** See SuccessiveLinearizationParams::factorization */ - enum Factorization { - CHOLESKY, - QR, - }; - - Elimination elimination; ///< The elimination algorithm to use (default: MULTIFRONTAL) - Factorization factorization; ///< The numerical factorization (default: Cholesky) + LinearSolverType linearSolverType; ///< The type of linear solver to use in the nonlinear optimizer boost::optional ordering; ///< The variable elimination ordering, or empty to use COLAMD (default: empty) - SuccessiveLinearizationParams() : - elimination(MULTIFRONTAL), factorization(CHOLESKY) {} + SuccessiveLinearizationParams() : linearSolverType(MULTIFRONTAL_CHOLESKY) {} virtual ~SuccessiveLinearizationParams() {} virtual void print(const std::string& str = "") const { NonlinearOptimizerParams::print(str); - if(elimination == MULTIFRONTAL) - std::cout << " elimination method: MULTIFRONTAL\n"; - else if(elimination == SEQUENTIAL) - std::cout << " elimination method: SEQUENTIAL\n"; - else - std::cout << " elimination method: (invalid)\n"; - - if(factorization == CHOLESKY) - std::cout << " factorization method: CHOLESKY\n"; - else if(factorization == QR) - std::cout << " factorization method: QR\n"; - else - std::cout << " factorization method: (invalid)\n"; + switch ( linearSolverType ) { + case MULTIFRONTAL_CHOLESKY: + std::cout << " linear solver type: MULTIFRONTAL CHOLESKY\n"; + break; + case MULTIFRONTAL_QR: + std::cout << " linear solver type: MULTIFRONTAL QR\n"; + break; + case SEQUENTIAL_CHOLESKY: + std::cout << " linear solver type: SEQUENTIAL CHOLESKY\n"; + break; + case SEQUENTIAL_QR: + std::cout << " linear solver type: SEQUENTIAL QR\n"; + break; + case SPCG: + std::cout << " linear solver type: SPCG\n"; + break; + default: + std::cout << " linear solver type: (invalid)\n"; + break; + } if(ordering) std::cout << " ordering: custom\n"; @@ -69,13 +71,32 @@ public: std::cout.flush(); } - GaussianFactorGraph::Eliminate getEliminationFunction() const { - if(factorization == SuccessiveLinearizationParams::CHOLESKY) + inline bool isMultifrontal() const { + return (linearSolverType == MULTIFRONTAL_CHOLESKY) || (linearSolverType == MULTIFRONTAL_QR); + } + + inline bool isSequential() const { + return (linearSolverType == SEQUENTIAL_CHOLESKY) || (linearSolverType == SEQUENTIAL_QR); + } + + inline bool isSPCG() const { + return (linearSolverType == SPCG); + } + + GaussianFactorGraph::Eliminate getEliminationFunction() { + switch (linearSolverType) { + case MULTIFRONTAL_CHOLESKY: + case MULTIFRONTAL_QR: return EliminatePreferCholesky; - else if(factorization == SuccessiveLinearizationParams::QR) + + case SEQUENTIAL_CHOLESKY: + case SEQUENTIAL_QR: return EliminateQR; - else + + default: throw runtime_error("Nonlinear optimization parameter \"factorization\" is invalid"); + break; + } } }; diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index a926b9e1b..eb6357fbd 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -149,9 +149,9 @@ TEST( NonlinearOptimizer, SimpleDLOptimizer ) TEST( NonlinearOptimizer, optimization_method ) { LevenbergMarquardtParams paramsQR; - paramsQR.factorization = LevenbergMarquardtParams::QR; + paramsQR.linearSolverType = LevenbergMarquardtParams::MULTIFRONTAL_QR; LevenbergMarquardtParams paramsChol; - paramsChol.factorization = LevenbergMarquardtParams::CHOLESKY; + paramsChol.linearSolverType = LevenbergMarquardtParams::MULTIFRONTAL_CHOLESKY; example::Graph fg = example::createReallyNonlinearFactorGraph(); From efd94014b78001da4395c53c840887d1a56ec2e3 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 25 May 2012 16:12:55 +0000 Subject: [PATCH 076/914] Added check.unstable target - currently runs each unstable group separately, however --- .cproject | 280 +++++++++++++++---------- gtsam_unstable/CMakeLists.txt | 2 + gtsam_unstable/base/CMakeLists.txt | 2 +- gtsam_unstable/discrete/CMakeLists.txt | 1 + gtsam_unstable/dynamics/CMakeLists.txt | 2 +- gtsam_unstable/slam/CMakeLists.txt | 2 +- 6 files changed, 170 insertions(+), 119 deletions(-) diff --git a/.cproject b/.cproject index 9cd83790e..0acb12e7e 100644 --- a/.cproject +++ b/.cproject @@ -593,6 +593,38 @@ true true + + make + -j5 + testBTree.run + true + true + true + + + make + -j5 + testDSF.run + true + true + true + + + make + -j5 + testDSFVector.run + true + true + true + + + make + -j5 + testFixedVector.run + true + true + true + make -j2 @@ -705,42 +737,34 @@ true true - + make - -j5 - testKey.run + -j2 + tests/testGeneralSFMFactor.run true true true - + make - -j5 - testGeneralSFMFactor.run + -j2 + tests/testPlanarSLAM.run true true true - + make - -j5 - testPlanarSLAM.run + -j2 + tests/testPose2SLAM.run true true true - + make - -j5 - testPose2SLAM.run - true - true - true - - - make - -j5 - testPose3SLAM.run + -j2 + tests/testPose3SLAM.run true true true @@ -769,6 +793,46 @@ true true + + make + -j5 + schedulingExample.run + true + true + true + + + make + -j5 + testCSP.run + true + true + true + + + make + -j5 + testScheduler.run + true + true + true + + + make + -j5 + schedulingQuals12.run + true + true + true + + + make + -j5 + testSudoku.run + true + true + true + make -j2 @@ -801,10 +865,10 @@ true true - + make -j5 - check + testDiscreteFactor.run true true true @@ -985,6 +1049,14 @@ true true + + make + -j5 + testNonlinearFactor.run + true + true + true + make -j2 @@ -1600,82 +1672,74 @@ true true - - make - -j2 - tests/testVectorValues.run - true - true - true - - + make -j5 - linear.testNoiseModel.run + testVectorValues.run true true true - - make - -j2 - tests/testGaussianFactor.run - true - true - true - - - make - -j2 - tests/testHessianFactor.run - true - true - true - - - make - -j2 - tests/testGaussianConditional.run - true - true - true - - - make - -j2 - tests/testGaussianFactorGraph.run - true - true - true - - - make - -j2 - tests/testGaussianJunctionTree.run - true - true - true - - - make - -j2 - tests/testKalmanFilter.run - true - true - true - - - make - -j2 - tests/testGaussianDensity.run - true - true - true - - + make -j5 - linear.testSerializationLinear.run + testNoiseModel.run + true + true + true + + + make + -j5 + testHessianFactor.run + true + true + true + + + make + -j5 + testGaussianConditional.run + true + true + true + + + make + -j5 + testGaussianFactorGraph.run + true + true + true + + + make + -j5 + testGaussianJunctionTree.run + true + true + true + + + make + -j5 + testKalmanFilter.run + true + true + true + + + make + -j5 + testGaussianDensity.run + true + true + true + + + make + -j5 + testSerializationLinear.run true true true @@ -1768,22 +1832,6 @@ true true - - make - -j5 - LocalizationExample.run - true - true - true - - - make - -j5 - LocalizationExample2.run - true - true - true - make -j2 @@ -2147,18 +2195,18 @@ true true - + make -j5 - wrap_gtsam_unstable + check.discrete_unstable true true true - + make -j5 - check.wrap + check.base_unstable true true true @@ -2179,26 +2227,26 @@ true true - + make -j5 - check.base_unstable + check.unstable true true true - + make -j5 - testSpirit.run + wrap.testSpirit.run true true true - + make -j5 - testWrap.run + wrap.testWrap.run true true true diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index f7563f8ff..3fac03616 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -7,6 +7,8 @@ set (gtsam_unstable_subdirs slam ) +add_custom_target(check.unstable COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) + # assemble core libaries foreach(subdir ${gtsam_unstable_subdirs}) # Build convenience libraries diff --git a/gtsam_unstable/base/CMakeLists.txt b/gtsam_unstable/base/CMakeLists.txt index 7e455e9bf..0545cd4c9 100644 --- a/gtsam_unstable/base/CMakeLists.txt +++ b/gtsam_unstable/base/CMakeLists.txt @@ -16,4 +16,4 @@ set (base_excluded_tests "") # Add all tests gtsam_add_subdir_tests(base_unstable "${base_local_libs}" "${base_full_libs}" "${base_excluded_tests}") - +add_dependencies(check.unstable check.base_unstable) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index 5d61db848..edec85416 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -23,6 +23,7 @@ set (discrete_full_libs # Add all tests gtsam_add_subdir_tests(discrete_unstable "${discrete_local_libs}" "${discrete_full_libs}" "${discrete_excluded_tests}") +add_dependencies(check.unstable check.discrete_unstable) # List examples to build - comment out here to exclude from compilation set(discrete_unstable_examples diff --git a/gtsam_unstable/dynamics/CMakeLists.txt b/gtsam_unstable/dynamics/CMakeLists.txt index 66d0b9ac1..d0d45e0e4 100644 --- a/gtsam_unstable/dynamics/CMakeLists.txt +++ b/gtsam_unstable/dynamics/CMakeLists.txt @@ -23,4 +23,4 @@ set (dynamics_excluded_tests "") # Add all tests gtsam_add_subdir_tests(dynamics_unstable "${dynamics_local_libs}" "${dynamics_full_libs}" "${dynamics_excluded_tests}") - +add_dependencies(check.unstable check.dynamics_unstable) diff --git a/gtsam_unstable/slam/CMakeLists.txt b/gtsam_unstable/slam/CMakeLists.txt index b0442044f..afe453279 100644 --- a/gtsam_unstable/slam/CMakeLists.txt +++ b/gtsam_unstable/slam/CMakeLists.txt @@ -23,4 +23,4 @@ set (slam_excluded_tests "") # Add all tests gtsam_add_subdir_tests(slam_unstable "${slam_local_libs}" "${slam_full_libs}" "${slam_excluded_tests}") - +add_dependencies(check.unstable check.slam_unstable) From 8f5dd13cf7cbe560a3b781759bc5485e4c4264c4 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 25 May 2012 17:55:02 +0000 Subject: [PATCH 077/914] Added access to the variable index in the iSAM2 solver --- gtsam/nonlinear/ISAM2.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 30f0b14d2..42c38514c 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -490,6 +490,9 @@ public: /** Access the current ordering */ const Ordering& getOrdering() const { return ordering_; } + /** Access the nonlinear variable index */ + const VariableIndex& getVariableIndex() const { return variableIndex_; } + size_t lastAffectedVariableCount; size_t lastAffectedFactorCount; size_t lastAffectedCliqueCount; From bce105ed585115663211f21c82b290be57d3dee4 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 25 May 2012 21:18:40 +0000 Subject: [PATCH 078/914] Removed nonexistent function from matlab interface --- gtsam.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 665b9bb52..e80a37a0b 100644 --- a/gtsam.h +++ b/gtsam.h @@ -489,7 +489,6 @@ class Values { Values(); void print(string s) const; void insertPose(int key, const gtsam::Pose2& pose); - gtsam::Symbol poseKey(int i); gtsam::Pose2 pose(int i); }; From 0d597082f23af78b3de48368becf396f5087afc5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 25 May 2012 21:18:41 +0000 Subject: [PATCH 079/914] Added optional target to build the matlab toolbox as a part of the gtsam build process --- CMakeLists.txt | 3 +++ wrap/CMakeLists.txt | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d2acb464..7819cfdc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,6 +61,9 @@ option(GTSAM_INSTALL_MATLAB_EXAMPLES "Enable/Disable installation of matlab option(GTSAM_INSTALL_MATLAB_TESTS "Enable/Disable installation of matlab tests" ON) option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility" ON) +# Experimental - features disabled by default +option(GTSAM_ENABLE_BUILD_MEX_BINARIES "Enable/Disable building of matlab mex files" OFF) + # Flags for choosing default packaging tools set(CPACK_SOURCE_GENERATOR "TGZ" CACHE STRING "CPack Default Source Generator") set(CPACK_GENERATOR "TGZ" CACHE STRING "CPack Default Binary Generator") diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 8feb5779b..36415df35 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -47,6 +47,17 @@ add_custom_target(wrap_gtsam ALL COMMAND ${EXECUTABLE_OUTPUT_PATH}/wrap ${GTSAM_MEX_BIN_EXTENSION} ${CMAKE_CURRENT_SOURCE_DIR}/../ ${moduleName} ${toolbox_path} "${mexFlags}" DEPENDS wrap) +# Build command +# Experimental: requires matlab to be on your path +if (GTSAM_ENABLE_BUILD_MEX_BINARIES) + # Actually compile the mex files when building the library + set(TOOLBOX_MAKE_FLAGS "-j2") + add_custom_target(wrap_gtsam_build + COMMAND make ${TOOLBOX_MAKE_FLAGS} + WORKING_DIRECTORY ${toolbox_path} + DEPENDS wrap_gtsam) +endif (GTSAM_ENABLE_BUILD_MEX_BINARIES) + set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTRING "Path to install matlab toolbox") if (GTSAM_INSTALL_MATLAB_TOOLBOX) From b0c91d2fcf8bd8e315082ba6769be4da2f5ca340 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sun, 27 May 2012 18:26:25 +0000 Subject: [PATCH 080/914] --- gtsam/nonlinear/DoglegOptimizer.cpp | 2 +- gtsam/nonlinear/GaussNewtonOptimizer.cpp | 2 +- .../nonlinear/LevenbergMarquardtOptimizer.cpp | 2 +- .../SuccessiveLinearizationOptimizer.h | 24 +++++++++++++++---- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/gtsam/nonlinear/DoglegOptimizer.cpp b/gtsam/nonlinear/DoglegOptimizer.cpp index 91b3c92fd..3edb35a76 100644 --- a/gtsam/nonlinear/DoglegOptimizer.cpp +++ b/gtsam/nonlinear/DoglegOptimizer.cpp @@ -48,7 +48,7 @@ void DoglegOptimizer::iterate(void) { GaussianBayesNet::shared_ptr bn = EliminationTree::Create(*linear)->eliminate(params_.getEliminationFunction()); result = DoglegOptimizerImpl::Iterate(state_.Delta, DoglegOptimizerImpl::ONE_STEP_PER_ITERATION, *bn, graph_, state_.values, ordering, state_.error, dlVerbose); } - else if ( params_.isSPCG() ) { + else if ( params_.isCG() ) { throw runtime_error("todo: "); } else { diff --git a/gtsam/nonlinear/GaussNewtonOptimizer.cpp b/gtsam/nonlinear/GaussNewtonOptimizer.cpp index 8d09b3edc..c81369299 100644 --- a/gtsam/nonlinear/GaussNewtonOptimizer.cpp +++ b/gtsam/nonlinear/GaussNewtonOptimizer.cpp @@ -41,7 +41,7 @@ void GaussNewtonOptimizer::iterate() { else if ( params_.isSequential() ) { delta = gtsam::optimize(*EliminationTree::Create(*linear)->eliminate(params_.getEliminationFunction())); } - else if ( params_.isSPCG() ) { + else if ( params_.isCG() ) { throw runtime_error("todo: "); } else { diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 3ad26cb3a..f1f5ab1df 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -70,7 +70,7 @@ void LevenbergMarquardtOptimizer::iterate() { else if ( params_.isSequential() ) { delta = gtsam::optimize(*EliminationTree::Create(dampedSystem)->eliminate(params_.getEliminationFunction())); } - else if ( params_.isSPCG() ) { + else if ( params_.isCG() ) { throw runtime_error("todo: "); } else { diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index 2b3bfd3b6..387a550db 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -19,6 +19,7 @@ #pragma once #include +#include namespace gtsam { @@ -30,11 +31,14 @@ public: MULTIFRONTAL_QR, SEQUENTIAL_CHOLESKY, SEQUENTIAL_QR, - SPCG + CHOLMOD, /* Experimental Flag */ + PCG, /* Experimental Flag */ + LSPCG /* Experimental Flag */ }; LinearSolverType linearSolverType; ///< The type of linear solver to use in the nonlinear optimizer boost::optional ordering; ///< The variable elimination ordering, or empty to use COLAMD (default: empty) + boost::optional iterativeParams; ///< The container for iterativeOptimization parameters. SuccessiveLinearizationParams() : linearSolverType(MULTIFRONTAL_CHOLESKY) {} @@ -55,8 +59,14 @@ public: case SEQUENTIAL_QR: std::cout << " linear solver type: SEQUENTIAL QR\n"; break; - case SPCG: - std::cout << " linear solver type: SPCG\n"; + case CHOLMOD: + std::cout << " linear solver type: CHOLMOD\n"; + break; + case PCG: + std::cout << " linear solver type: PCG\n"; + break; + case LSPCG: + std::cout << " linear solver type: LSPCG\n"; break; default: std::cout << " linear solver type: (invalid)\n"; @@ -79,8 +89,12 @@ public: return (linearSolverType == SEQUENTIAL_CHOLESKY) || (linearSolverType == SEQUENTIAL_QR); } - inline bool isSPCG() const { - return (linearSolverType == SPCG); + inline bool isCholmod() const { + return (linearSolverType == CHOLMOD); + } + + inline bool isCG() const { + return (linearSolverType == PCG || linearSolverType == LSPCG); } GaussianFactorGraph::Eliminate getEliminationFunction() { From 3c694e25f71a12ed43c8444150aae80b9c431258 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 27 May 2012 20:05:42 +0000 Subject: [PATCH 081/914] Added experimental target for building unstable matlab toolbox --- gtsam_unstable/CMakeLists.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 3fac03616..9e9d66a7c 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -88,6 +88,17 @@ if (GTSAM_BUILD_WRAP) ${CMAKE_BINARY_DIR}/wrap/wrap ${GTSAM_MEX_BIN_EXTENSION} ${CMAKE_CURRENT_SOURCE_DIR} ${moduleName} ${toolbox_path} "${mexFlags}" DEPENDS wrap) + # Build command + # Experimental: requires matlab to be on your path + if (GTSAM_ENABLE_BUILD_MEX_BINARIES) + # Actually compile the mex files when building the library + set(TOOLBOX_MAKE_FLAGS "-j2") + add_custom_target(wrap_gtsam_unstable_build + COMMAND make ${TOOLBOX_MAKE_FLAGS} + WORKING_DIRECTORY ${toolbox_path} + DEPENDS wrap_gtsam_unstable) + endif (GTSAM_ENABLE_BUILD_MEX_BINARIES) + if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Primary toolbox files message(STATUS "Installing Matlab Toolbox to ${GTSAM_TOOLBOX_INSTALL_PATH}") From 2a98ba5857147b59c1c819c9b4f543d63a726441 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 28 May 2012 12:20:49 +0000 Subject: [PATCH 082/914] Whitespace --- gtsam/linear/HessianFactor.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 1454e7a36..aa31bc9c0 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -269,23 +269,23 @@ namespace gtsam { /** Return the complete linear term \f$ g \f$ as described above. * @return The linear term \f$ g \f$ */ constColumn linearTerm() const; - - /** Return the augmented information matrix represented by this GaussianFactor. - * The augmented information matrix contains the information matrix with an - * additional column holding the information vector, and an additional row - * holding the transpose of the information vector. The lower-right entry - * contains the constant error term (when \f$ \delta x = 0 \f$). The - * augmented information matrix is described in more detail in HessianFactor, - * which in fact stores an augmented information matrix. - * - * For HessianFactor, this is the same as info() except that this function - * returns a complete symmetric matrix whereas info() returns a matrix where - * only the upper triangle is valid, but should be interpreted as symmetric. - * This is because info() returns only a reference to the internal - * representation of the augmented information matrix, which stores only the - * upper triangle. - */ - virtual Matrix computeInformation() const; + + /** Return the augmented information matrix represented by this GaussianFactor. + * The augmented information matrix contains the information matrix with an + * additional column holding the information vector, and an additional row + * holding the transpose of the information vector. The lower-right entry + * contains the constant error term (when \f$ \delta x = 0 \f$). The + * augmented information matrix is described in more detail in HessianFactor, + * which in fact stores an augmented information matrix. + * + * For HessianFactor, this is the same as info() except that this function + * returns a complete symmetric matrix whereas info() returns a matrix where + * only the upper triangle is valid, but should be interpreted as symmetric. + * This is because info() returns only a reference to the internal + * representation of the augmented information matrix, which stores only the + * upper triangle. + */ + virtual Matrix computeInformation() const; // Friend unit test classes friend class ::ConversionConstructorHessianFactorTest; From e378d13e1ab0a1b271a6b051818c865eb8b2c0ff Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 28 May 2012 14:59:48 +0000 Subject: [PATCH 083/914] Fixed duplicate function --- gtsam/linear/JacobianFactor.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 1cdf9e1c7..30e8e19bb 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -154,16 +154,6 @@ namespace gtsam { Vector unweighted_error(const VectorValues& c) const; /** (A*x-b) */ Vector error_vector(const VectorValues& c) const; /** (A*x-b)/sigma */ virtual double error(const VectorValues& c) const; /** 0.5*(A*x-b)'*D*(A*x-b) */ - - /** Return the augmented information matrix represented by this GaussianFactor. - * The augmented information matrix contains the information matrix with an - * additional column holding the information vector, and an additional row - * holding the transpose of the information vector. The lower-right entry - * contains the constant error term (when \f$ \delta x = 0 \f$). The - * augmented information matrix is described in more detail in HessianFactor, - * which in fact stores an augmented information matrix. - */ - virtual Matrix computeInformation() const; /** Return the augmented information matrix represented by this GaussianFactor. * The augmented information matrix contains the information matrix with an From 363b44057bd04f6fe18424b156db296f784e4c30 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 28 May 2012 14:59:50 +0000 Subject: [PATCH 084/914] Made new cmake config scripts find correct build configuration --- CMakeLists.txt | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 046209aa7..12f1e614f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,4 @@ + project(GTSAM CXX C) cmake_minimum_required(VERSION 2.6) @@ -9,8 +10,12 @@ set (GTSAM_VERSION_PATCH 0) # Set the default install path to home #set (CMAKE_INSTALL_PREFIX ${HOME} CACHE PATH "Install prefix for library") +set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Load build type flags and default to Debug mode +include(GtsamBuildTypes) + # Use macros for creating tests/timing scripts -set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${PROJECT_SOURCE_DIR}/cmake") include(GtsamTesting) include(GtsamPrinting) @@ -26,24 +31,6 @@ else() set(GTSAM_UNSTABLE_AVAILABLE 0) endif() -# Load build type flags and default to Debug mode -include(GtsamBuildTypes) - -# Check build types -if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} VERSION_GREATER 2.8 OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} VERSION_EQUAL 2.8) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS None Debug Release Timing Profiling RelWithDebInfo MinSizeRel) -endif() -string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_tolower) -if( NOT cmake_build_type_tolower STREQUAL "" - AND NOT cmake_build_type_tolower STREQUAL "none" - AND NOT cmake_build_type_tolower STREQUAL "debug" - AND NOT cmake_build_type_tolower STREQUAL "release" - AND NOT cmake_build_type_tolower STREQUAL "timing" - AND NOT cmake_build_type_tolower STREQUAL "profiling" - AND NOT cmake_build_type_tolower STREQUAL "relwithdebinfo") - message(FATAL_ERROR "Unknown build type \"${CMAKE_BUILD_TYPE}\". Allowed values are None, Debug, Release, Timing, Profiling, RelWithDebInfo (case-insensitive).") -endif() - # Configurable Options option(GTSAM_BUILD_TESTS "Enable/Disable building of tests" ON) option(GTSAM_BUILD_TIMING "Enable/Disable building of timing scripts" ON) @@ -83,8 +70,8 @@ endif() # Add the Quaternion Build Flag if requested if (GTSAM_USE_QUATERNIONS) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGTSAM_DEFAULT_QUATERNIONS") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTSAM_DEFAULT_QUATERNIONS") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGTSAM_DEFAULT_QUATERNIONS") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTSAM_DEFAULT_QUATERNIONS") endif(GTSAM_USE_QUATERNIONS) # Avoid building non-installed exes and unit tests when installing From 069be2b143767eabb4d9c95a4af4965fead2aaec Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 28 May 2012 20:48:32 +0000 Subject: [PATCH 085/914] Fixed examples compiling on windows --- examples/PlanarSLAMSelfContained_advanced.cpp | 2 +- examples/Pose2SLAMExample_easy.cpp | 14 +++++++------- examples/vSLAMexample/vISAMexample.cpp | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/PlanarSLAMSelfContained_advanced.cpp b/examples/PlanarSLAMSelfContained_advanced.cpp index 36f9ad8ca..102dcc315 100644 --- a/examples/PlanarSLAMSelfContained_advanced.cpp +++ b/examples/PlanarSLAMSelfContained_advanced.cpp @@ -83,7 +83,7 @@ int main(int argc, char** argv) { Rot2 bearing11 = Rot2::fromDegrees(45), bearing21 = Rot2::fromDegrees(90), bearing32 = Rot2::fromDegrees(90); - double range11 = sqrt(4+4), + double range11 = sqrt(4.0+4.0), range21 = 2.0, range32 = 2.0; diff --git a/examples/Pose2SLAMExample_easy.cpp b/examples/Pose2SLAMExample_easy.cpp index b6507d7fc..ef704c5fc 100644 --- a/examples/Pose2SLAMExample_easy.cpp +++ b/examples/Pose2SLAMExample_easy.cpp @@ -17,8 +17,8 @@ */ // pull in the Pose2 SLAM domain with all typedefs and helper functions defined -#include #include +#include using namespace std; using namespace gtsam; @@ -36,13 +36,13 @@ int main(int argc, char** argv) { // 2b. Add odometry factors SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); - graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI/2.0), odometryNoise); + graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI/2.0), odometryNoise); + graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI/2.0), odometryNoise); // 2c. Add pose constraint SharedDiagonal constraintUncertainty(Vector_(3, 0.2, 0.2, 0.1)); - graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI/2.0), constraintUncertainty); // print graph.print("\nFactor graph:\n"); @@ -51,9 +51,9 @@ int main(int argc, char** argv) { pose2SLAM::Values initialEstimate; Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); - Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); + Pose2 x3(4.1, 0.1, M_PI/2.0); initialEstimate.insertPose(3, x3); Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); - Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); + Pose2 x5(2.1, 2.1,-M_PI/2.0); initialEstimate.insertPose(5, x5); initialEstimate.print("\nInitial estimate:\n "); // 4. Single Step Optimization using Levenberg-Marquardt diff --git a/examples/vSLAMexample/vISAMexample.cpp b/examples/vSLAMexample/vISAMexample.cpp index 71d5516a2..7c16072d8 100644 --- a/examples/vSLAMexample/vISAMexample.cpp +++ b/examples/vSLAMexample/vISAMexample.cpp @@ -76,11 +76,11 @@ void readAllDataISAM() { /** * Setup newFactors and initialValues for each new pose and set of measurements at each frame. */ -void createNewFactors(shared_ptr& newFactors, boost::shared_ptr& initialValues, +void createNewFactors(boost::shared_ptr& newFactors, boost::shared_ptr& initialValues, int pose_id, const Pose3& pose, const std::vector& measurements, SharedNoiseModel measurementSigma, shared_ptrK calib) { // Create a graph of newFactors with new measurements - newFactors = shared_ptr (new Graph()); + newFactors = boost::shared_ptr (new Graph()); for (size_t i = 0; i < measurements.size(); i++) { newFactors->addMeasurement( measurements[i].m_p, @@ -97,7 +97,7 @@ void createNewFactors(shared_ptr& newFactors, boost::shared_ptr& } // Create initial values for all nodes in the newFactors - initialValues = shared_ptr (new Values()); + initialValues = boost::shared_ptr (new Values()); initialValues->insert(PoseKey(pose_id), pose); for (size_t i = 0; i < measurements.size(); i++) { initialValues->insert(PointKey(measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); @@ -127,8 +127,8 @@ int main(int argc, char* argv[]) { typedef std::map > FeatureMap; BOOST_FOREACH(const FeatureMap::value_type& features, g_measurements) { const int poseId = features.first; - shared_ptr newFactors; - shared_ptr initialValues; + boost::shared_ptr newFactors; + boost::shared_ptr initialValues; createNewFactors(newFactors, initialValues, poseId, g_poses[poseId], features.second, measurementSigma, g_calib); From 592a251a053ed6159c700e12387a879ac9f4aec0 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 28 May 2012 20:48:36 +0000 Subject: [PATCH 086/914] Fixed path and compile problems with matlab wrapper on windows --- CMakeLists.txt | 2 +- wrap/Argument.cpp | 2 +- wrap/CMakeLists.txt | 6 +++++- wrap/Method.cpp | 2 +- wrap/Module.cpp | 2 +- wrap/ReturnValue.cpp | 6 +++--- wrap/matlab.h | 12 ++++++------ wrap/utilities.cpp | 2 +- 8 files changed, 19 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 12f1e614f..7be750b02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,7 +95,7 @@ endif() if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.40 COMPONENTS serialization system chrono filesystem REQUIRED) +find_package(Boost 1.40 COMPONENTS serialization system chrono filesystem thread REQUIRED) # General build settings include_directories( diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index ff42b33b1..b03431d72 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -46,7 +46,7 @@ void Argument::matlab_unwrap(FileWriter& file, const string& matlabName) const { if (is_ptr) // A pointer: emit an "unwrap_shared_ptr" call which returns a pointer - file.oss << "shared_ptr<" << cppType << "> " << name << " = unwrap_shared_ptr< "; + file.oss << "boost::shared_ptr<" << cppType << "> " << name << " = unwrap_shared_ptr< "; else if (is_ref) // A reference: emit an "unwrap_shared_ptr" call and de-reference the pointer file.oss << cppType << "& " << name << " = *unwrap_shared_ptr< "; diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 36415df35..a4286df98 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -31,6 +31,9 @@ endif(GTSAM_BUILD_TESTS) # [mexFlags] : extra flags for the mex command set(mexFlags "-I${Boost_INCLUDE_DIR} -I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/gtsam -I${CMAKE_INSTALL_PREFIX}/include/gtsam/base -I${CMAKE_INSTALL_PREFIX}/include/gtsam/geometry -I${CMAKE_INSTALL_PREFIX}/include/gtsam/linear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/nonlinear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/slam -L${CMAKE_INSTALL_PREFIX}/lib -lgtsam") +if(MSVC OR CYGWIN OR WINGW) + set(mexFlags "${mexFlags} LINKFLAGS='$LINKFLAGS /LIBPATH:${Boost_LIBRARY_DIRS}'") +endif() set(toolbox_path ${CMAKE_BINARY_DIR}/wrap/gtsam) set(moduleName gtsam) @@ -43,8 +46,9 @@ if (NOT EXECUTABLE_OUTPUT_PATH) endif() # Code generation command +get_property(WRAP_EXE TARGET wrap PROPERTY LOCATION) add_custom_target(wrap_gtsam ALL COMMAND - ${EXECUTABLE_OUTPUT_PATH}/wrap ${GTSAM_MEX_BIN_EXTENSION} ${CMAKE_CURRENT_SOURCE_DIR}/../ ${moduleName} ${toolbox_path} "${mexFlags}" + ${WRAP_EXE} ${GTSAM_MEX_BIN_EXTENSION} ${CMAKE_CURRENT_SOURCE_DIR}/../ ${moduleName} ${toolbox_path} "${mexFlags}" DEPENDS wrap) # Build command diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 3d53956f1..7261c88a0 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -73,7 +73,7 @@ void Method::matlab_wrapper(const string& classPath, // get class pointer // example: shared_ptr = unwrap_shared_ptr< Test >(in[0], "Test"); - file.oss << " shared_ptr<" << cppClassName << "> self = unwrap_shared_ptr< " << cppClassName + file.oss << " boost::shared_ptr<" << cppClassName << "> self = unwrap_shared_ptr< " << cppClassName << " >(in[0],\"" << matlabClassName << "\");" << endl; // unwrap arguments, see Argument.cpp diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 98525e65d..af2238038 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -294,7 +294,7 @@ void Module::matlab_code(const string& toolboxPath, makeModuleMfile.oss << "echo on" << endl << endl; makeModuleMfile.oss << "toolboxpath = mfilename('fullpath');" << endl; - makeModuleMfile.oss << "delims = find(toolboxpath == '/');" << endl; + makeModuleMfile.oss << "delims = find(toolboxpath == '/' | toolboxpath == '\\');" << endl; makeModuleMfile.oss << "toolboxpath = toolboxpath(1:(delims(end)-1));" << endl; makeModuleMfile.oss << "clear delims" << endl; makeModuleMfile.oss << "addpath(toolboxpath);" << endl << endl; diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index 2095abc5e..ace1159ec 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -53,7 +53,7 @@ void ReturnValue::wrap_result(FileWriter& file) const { if (isPtr1) // if we already have a pointer file.oss << " out[0] = wrap_shared_ptr(result.first,\"" << matlabType1 << "\");\n"; else if (category1 == ReturnValue::CLASS) // if we are going to make one - file.oss << " out[0] = wrap_shared_ptr(make_shared< " << cppType1 << " >(result.first),\"" << matlabType1 << "\");\n"; + file.oss << " out[0] = wrap_shared_ptr(boost::make_shared< " << cppType1 << " >(result.first),\"" << matlabType1 << "\");\n"; else // if basis type file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result.first);\n"; @@ -61,14 +61,14 @@ void ReturnValue::wrap_result(FileWriter& file) const { if (isPtr2) // if we already have a pointer file.oss << " out[1] = wrap_shared_ptr(result.second,\"" << matlabType2 << "\");\n"; else if (category2 == ReturnValue::CLASS) // if we are going to make one - file.oss << " out[1] = wrap_shared_ptr(make_shared< " << cppType2 << " >(result.second),\"" << matlabType2 << "\");\n"; + file.oss << " out[1] = wrap_shared_ptr(boost::make_shared< " << cppType2 << " >(result.second),\"" << matlabType2 << "\");\n"; else file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(result.second);\n"; } else if (isPtr1) file.oss << " out[0] = wrap_shared_ptr(result,\"" << matlabType1 << "\");\n"; else if (category1 == ReturnValue::CLASS) - file.oss << " out[0] = wrap_shared_ptr(make_shared< " << cppType1 << " >(result),\"" << matlabType1 << "\");\n"; + file.oss << " out[0] = wrap_shared_ptr(boost::make_shared< " << cppType1 << " >(result),\"" << matlabType1 << "\");\n"; else if (matlabType1!="void") file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result);\n"; } diff --git a/wrap/matlab.h b/wrap/matlab.h index b6d200e43..a69d8aba4 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -300,19 +300,19 @@ class ObjectHandle { private: ObjectHandle* signature; // use 'this' as a unique object signature const std::type_info* type; // type checking information - shared_ptr t; // object pointer + boost::shared_ptr t; // object pointer public: // Constructor for free-store allocated objects. // Creates shared pointer, will delete if is last one to hold pointer ObjectHandle(T* ptr) : - type(&typeid(T)), t(shared_ptr (ptr)) { + type(&typeid(T)), t(boost::shared_ptr (ptr)) { signature = this; } // Constructor for shared pointers // Creates shared pointer, will delete if is last one to hold pointer - ObjectHandle(shared_ptr ptr) : + ObjectHandle(boost::shared_ptr ptr) : /*type(&typeid(T)),*/ t(ptr) { signature = this; } @@ -323,7 +323,7 @@ public: } // Get the actual object contained by handle - shared_ptr get_object() const { + boost::shared_ptr get_object() const { return t; } @@ -419,7 +419,7 @@ mxArray* create_object(const char *classname, mxArray* h) { class to matlab. */ template -mxArray* wrap_shared_ptr(shared_ptr< Class > shared_ptr, const char *classname) { +mxArray* wrap_shared_ptr(boost::shared_ptr< Class > shared_ptr, const char *classname) { ObjectHandle* handle = new ObjectHandle(shared_ptr); return create_object(classname,handle->to_mex_handle()); } @@ -436,7 +436,7 @@ mxArray* wrap_shared_ptr(shared_ptr< Class > shared_ptr, const char *classname) to the object. */ template -shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { //Why is this here? #ifndef UNSAFE_WRAP bool isClass = mxIsClass(obj, className.c_str()); diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 7b82d9b9d..bfd1e77df 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -104,7 +104,7 @@ bool files_equal(const string& expected, const string& actual, bool skipheader) /* ************************************************************************* */ string maybe_shared_ptr(bool add, const string& type) { - string str = add? "shared_ptr<" : ""; + string str = add? "boost::shared_ptr<" : ""; str += type; if (add) str += ">"; return str; From dc036a0891aed075bb53b05fd8ad73a3497839e7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 29 May 2012 19:29:29 +0000 Subject: [PATCH 087/914] Updated wrap unit tests --- wrap/tests/expected/@Point2/argChar.cpp | 2 +- wrap/tests/expected/@Point2/argUChar.cpp | 2 +- wrap/tests/expected/@Point2/dim.cpp | 2 +- wrap/tests/expected/@Point2/returnChar.cpp | 2 +- wrap/tests/expected/@Point2/vectorConfusion.cpp | 2 +- wrap/tests/expected/@Point2/x.cpp | 2 +- wrap/tests/expected/@Point2/y.cpp | 2 +- wrap/tests/expected/@Point3/norm.cpp | 2 +- wrap/tests/expected/@Test/arg_EigenConstRef.cpp | 2 +- wrap/tests/expected/@Test/create_MixedPtrs.cpp | 4 ++-- wrap/tests/expected/@Test/create_ptrs.cpp | 4 ++-- wrap/tests/expected/@Test/print.cpp | 2 +- wrap/tests/expected/@Test/return_Point2Ptr.cpp | 4 ++-- wrap/tests/expected/@Test/return_Test.cpp | 4 ++-- wrap/tests/expected/@Test/return_TestPtr.cpp | 6 +++--- wrap/tests/expected/@Test/return_bool.cpp | 2 +- wrap/tests/expected/@Test/return_double.cpp | 2 +- wrap/tests/expected/@Test/return_field.cpp | 2 +- wrap/tests/expected/@Test/return_int.cpp | 2 +- wrap/tests/expected/@Test/return_matrix1.cpp | 2 +- wrap/tests/expected/@Test/return_matrix2.cpp | 2 +- wrap/tests/expected/@Test/return_pair.cpp | 2 +- wrap/tests/expected/@Test/return_ptrs.cpp | 8 ++++---- wrap/tests/expected/@Test/return_size_t.cpp | 2 +- wrap/tests/expected/@Test/return_string.cpp | 2 +- wrap/tests/expected/@Test/return_vector1.cpp | 2 +- wrap/tests/expected/@Test/return_vector2.cpp | 2 +- wrap/tests/expected/make_geometry.m | 2 +- .../expected_namespaces/@ns2ClassA/memberFunction.cpp | 2 +- wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp | 2 +- wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp | 2 +- wrap/tests/expected_namespaces/make_testNamespaces.m | 2 +- 32 files changed, 41 insertions(+), 41 deletions(-) diff --git a/wrap/tests/expected/@Point2/argChar.cpp b/wrap/tests/expected/@Point2/argChar.cpp index 017fe1761..18548ee8f 100644 --- a/wrap/tests/expected/@Point2/argChar.cpp +++ b/wrap/tests/expected/@Point2/argChar.cpp @@ -4,7 +4,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("argChar",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); + boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); char a = unwrap< char >(in[1]); self->argChar(a); } diff --git a/wrap/tests/expected/@Point2/argUChar.cpp b/wrap/tests/expected/@Point2/argUChar.cpp index 341e4f8a7..bbaa65a8f 100644 --- a/wrap/tests/expected/@Point2/argUChar.cpp +++ b/wrap/tests/expected/@Point2/argUChar.cpp @@ -4,7 +4,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("argUChar",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); + boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); unsigned char a = unwrap< unsigned char >(in[1]); self->argUChar(a); } diff --git a/wrap/tests/expected/@Point2/dim.cpp b/wrap/tests/expected/@Point2/dim.cpp index 454153690..1349dc267 100644 --- a/wrap/tests/expected/@Point2/dim.cpp +++ b/wrap/tests/expected/@Point2/dim.cpp @@ -4,7 +4,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("dim",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); + boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); int result = self->dim(); out[0] = wrap< int >(result); } diff --git a/wrap/tests/expected/@Point2/returnChar.cpp b/wrap/tests/expected/@Point2/returnChar.cpp index 3b7733862..c5b67a018 100644 --- a/wrap/tests/expected/@Point2/returnChar.cpp +++ b/wrap/tests/expected/@Point2/returnChar.cpp @@ -4,7 +4,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("returnChar",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); + boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); char result = self->returnChar(); out[0] = wrap< char >(result); } diff --git a/wrap/tests/expected/@Point2/vectorConfusion.cpp b/wrap/tests/expected/@Point2/vectorConfusion.cpp index 90be4194b..bb6f02927 100644 --- a/wrap/tests/expected/@Point2/vectorConfusion.cpp +++ b/wrap/tests/expected/@Point2/vectorConfusion.cpp @@ -4,7 +4,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("vectorConfusion",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); + boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); VectorNotEigen result = self->vectorConfusion(); out[0] = wrap_shared_ptr(make_shared< VectorNotEigen >(result),"VectorNotEigen"); } diff --git a/wrap/tests/expected/@Point2/x.cpp b/wrap/tests/expected/@Point2/x.cpp index 8df8c6bbc..65e56cae5 100644 --- a/wrap/tests/expected/@Point2/x.cpp +++ b/wrap/tests/expected/@Point2/x.cpp @@ -4,7 +4,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("x",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); + boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); double result = self->x(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Point2/y.cpp b/wrap/tests/expected/@Point2/y.cpp index 14e3663ed..f8e10dc5d 100644 --- a/wrap/tests/expected/@Point2/y.cpp +++ b/wrap/tests/expected/@Point2/y.cpp @@ -4,7 +4,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("y",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); + boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); double result = self->y(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Point3/norm.cpp b/wrap/tests/expected/@Point3/norm.cpp index 9936958d7..0c7ac2038 100644 --- a/wrap/tests/expected/@Point3/norm.cpp +++ b/wrap/tests/expected/@Point3/norm.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("norm",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point3 >(in[0],"Point3"); + boost::shared_ptr self = unwrap_shared_ptr< Point3 >(in[0],"Point3"); double result = self->norm(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp b/wrap/tests/expected/@Test/arg_EigenConstRef.cpp index 487741c07..09a5c6f62 100644 --- a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp +++ b/wrap/tests/expected/@Test/arg_EigenConstRef.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("arg_EigenConstRef",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); self->arg_EigenConstRef(value); } diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.cpp b/wrap/tests/expected/@Test/create_MixedPtrs.cpp index 269bb990c..9c685d6cf 100644 --- a/wrap/tests/expected/@Test/create_MixedPtrs.cpp +++ b/wrap/tests/expected/@Test/create_MixedPtrs.cpp @@ -5,8 +5,8 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("create_MixedPtrs",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - pair< Test, shared_ptr > result = self->create_MixedPtrs(); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + pair< Test, boost::shared_ptr > result = self->create_MixedPtrs(); out[0] = wrap_shared_ptr(make_shared< Test >(result.first),"Test"); out[1] = wrap_shared_ptr(result.second,"Test"); } diff --git a/wrap/tests/expected/@Test/create_ptrs.cpp b/wrap/tests/expected/@Test/create_ptrs.cpp index bfd9f39bf..830d62a12 100644 --- a/wrap/tests/expected/@Test/create_ptrs.cpp +++ b/wrap/tests/expected/@Test/create_ptrs.cpp @@ -5,8 +5,8 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("create_ptrs",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - pair< shared_ptr, shared_ptr > result = self->create_ptrs(); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + pair< boost::shared_ptr, boost::shared_ptr > result = self->create_ptrs(); out[0] = wrap_shared_ptr(result.first,"Test"); out[1] = wrap_shared_ptr(result.second,"Test"); } diff --git a/wrap/tests/expected/@Test/print.cpp b/wrap/tests/expected/@Test/print.cpp index e93f5f09a..1d259f2e8 100644 --- a/wrap/tests/expected/@Test/print.cpp +++ b/wrap/tests/expected/@Test/print.cpp @@ -5,6 +5,6 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("print",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); self->print(); } diff --git a/wrap/tests/expected/@Test/return_Point2Ptr.cpp b/wrap/tests/expected/@Test/return_Point2Ptr.cpp index 9ad2a4360..e6990198e 100644 --- a/wrap/tests/expected/@Test/return_Point2Ptr.cpp +++ b/wrap/tests/expected/@Test/return_Point2Ptr.cpp @@ -5,8 +5,8 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_Point2Ptr",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); bool value = unwrap< bool >(in[1]); - shared_ptr result = self->return_Point2Ptr(value); + boost::shared_ptr result = self->return_Point2Ptr(value); out[0] = wrap_shared_ptr(result,"Point2"); } diff --git a/wrap/tests/expected/@Test/return_Test.cpp b/wrap/tests/expected/@Test/return_Test.cpp index 73c63a899..458e0c74d 100644 --- a/wrap/tests/expected/@Test/return_Test.cpp +++ b/wrap/tests/expected/@Test/return_Test.cpp @@ -5,8 +5,8 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_Test",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); Test result = self->return_Test(value); out[0] = wrap_shared_ptr(make_shared< Test >(result),"Test"); } diff --git a/wrap/tests/expected/@Test/return_TestPtr.cpp b/wrap/tests/expected/@Test/return_TestPtr.cpp index 607e48cfd..3c053791d 100644 --- a/wrap/tests/expected/@Test/return_TestPtr.cpp +++ b/wrap/tests/expected/@Test/return_TestPtr.cpp @@ -5,8 +5,8 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_TestPtr",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - shared_ptr result = self->return_TestPtr(value); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); + boost::shared_ptr result = self->return_TestPtr(value); out[0] = wrap_shared_ptr(result,"Test"); } diff --git a/wrap/tests/expected/@Test/return_bool.cpp b/wrap/tests/expected/@Test/return_bool.cpp index d700ead2b..92612a279 100644 --- a/wrap/tests/expected/@Test/return_bool.cpp +++ b/wrap/tests/expected/@Test/return_bool.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_bool",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); bool value = unwrap< bool >(in[1]); bool result = self->return_bool(value); out[0] = wrap< bool >(result); diff --git a/wrap/tests/expected/@Test/return_double.cpp b/wrap/tests/expected/@Test/return_double.cpp index 38770e1cd..e167a16c0 100644 --- a/wrap/tests/expected/@Test/return_double.cpp +++ b/wrap/tests/expected/@Test/return_double.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_double",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); double value = unwrap< double >(in[1]); double result = self->return_double(value); out[0] = wrap< double >(result); diff --git a/wrap/tests/expected/@Test/return_field.cpp b/wrap/tests/expected/@Test/return_field.cpp index b5e067801..838bab0a4 100644 --- a/wrap/tests/expected/@Test/return_field.cpp +++ b/wrap/tests/expected/@Test/return_field.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_field",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); bool result = self->return_field(t); out[0] = wrap< bool >(result); diff --git a/wrap/tests/expected/@Test/return_int.cpp b/wrap/tests/expected/@Test/return_int.cpp index e2dfd25e8..4cdaf5abc 100644 --- a/wrap/tests/expected/@Test/return_int.cpp +++ b/wrap/tests/expected/@Test/return_int.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_int",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); int value = unwrap< int >(in[1]); int result = self->return_int(value); out[0] = wrap< int >(result); diff --git a/wrap/tests/expected/@Test/return_matrix1.cpp b/wrap/tests/expected/@Test/return_matrix1.cpp index 8bb9acff8..f7fb72040 100644 --- a/wrap/tests/expected/@Test/return_matrix1.cpp +++ b/wrap/tests/expected/@Test/return_matrix1.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_matrix1",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); Matrix value = unwrap< Matrix >(in[1]); Matrix result = self->return_matrix1(value); out[0] = wrap< Matrix >(result); diff --git a/wrap/tests/expected/@Test/return_matrix2.cpp b/wrap/tests/expected/@Test/return_matrix2.cpp index f1a22da47..f8b6823fa 100644 --- a/wrap/tests/expected/@Test/return_matrix2.cpp +++ b/wrap/tests/expected/@Test/return_matrix2.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_matrix2",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); Matrix value = unwrap< Matrix >(in[1]); Matrix result = self->return_matrix2(value); out[0] = wrap< Matrix >(result); diff --git a/wrap/tests/expected/@Test/return_pair.cpp b/wrap/tests/expected/@Test/return_pair.cpp index 8f6949d7c..54b3f6522 100644 --- a/wrap/tests/expected/@Test/return_pair.cpp +++ b/wrap/tests/expected/@Test/return_pair.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_pair",nargout,nargin-1,2); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); Vector v = unwrap< Vector >(in[1]); Matrix A = unwrap< Matrix >(in[2]); pair< Vector, Matrix > result = self->return_pair(v,A); diff --git a/wrap/tests/expected/@Test/return_ptrs.cpp b/wrap/tests/expected/@Test/return_ptrs.cpp index 20d6c57fe..eea94ca3c 100644 --- a/wrap/tests/expected/@Test/return_ptrs.cpp +++ b/wrap/tests/expected/@Test/return_ptrs.cpp @@ -5,10 +5,10 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_ptrs",nargout,nargin-1,2); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); - shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); - pair< shared_ptr, shared_ptr > result = self->return_ptrs(p1,p2); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); + boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); + pair< boost::shared_ptr, boost::shared_ptr > result = self->return_ptrs(p1,p2); out[0] = wrap_shared_ptr(result.first,"Test"); out[1] = wrap_shared_ptr(result.second,"Test"); } diff --git a/wrap/tests/expected/@Test/return_size_t.cpp b/wrap/tests/expected/@Test/return_size_t.cpp index 6b12a167b..901c5c9bd 100644 --- a/wrap/tests/expected/@Test/return_size_t.cpp +++ b/wrap/tests/expected/@Test/return_size_t.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_size_t",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); size_t value = unwrap< size_t >(in[1]); size_t result = self->return_size_t(value); out[0] = wrap< size_t >(result); diff --git a/wrap/tests/expected/@Test/return_string.cpp b/wrap/tests/expected/@Test/return_string.cpp index c05a57fba..778e07522 100644 --- a/wrap/tests/expected/@Test/return_string.cpp +++ b/wrap/tests/expected/@Test/return_string.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_string",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); string value = unwrap< string >(in[1]); string result = self->return_string(value); out[0] = wrap< string >(result); diff --git a/wrap/tests/expected/@Test/return_vector1.cpp b/wrap/tests/expected/@Test/return_vector1.cpp index 3710e5d48..5e8aed397 100644 --- a/wrap/tests/expected/@Test/return_vector1.cpp +++ b/wrap/tests/expected/@Test/return_vector1.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_vector1",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); Vector value = unwrap< Vector >(in[1]); Vector result = self->return_vector1(value); out[0] = wrap< Vector >(result); diff --git a/wrap/tests/expected/@Test/return_vector2.cpp b/wrap/tests/expected/@Test/return_vector2.cpp index 72564f05c..4c3242f2e 100644 --- a/wrap/tests/expected/@Test/return_vector2.cpp +++ b/wrap/tests/expected/@Test/return_vector2.cpp @@ -5,7 +5,7 @@ using namespace geometry; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_vector2",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); Vector value = unwrap< Vector >(in[1]); Vector result = self->return_vector2(value); out[0] = wrap< Vector >(result); diff --git a/wrap/tests/expected/make_geometry.m b/wrap/tests/expected/make_geometry.m index 7baac182f..2858f2994 100644 --- a/wrap/tests/expected/make_geometry.m +++ b/wrap/tests/expected/make_geometry.m @@ -2,7 +2,7 @@ echo on toolboxpath = mfilename('fullpath'); -delims = find(toolboxpath == '/'); +delims = find(toolboxpath == '/' | toolboxpath == '\'); toolboxpath = toolboxpath(1:(delims(end)-1)); clear delims addpath(toolboxpath); diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp index 8e5bc3960..514e5db08 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp @@ -5,7 +5,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("memberFunction",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); + boost::shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); double result = self->memberFunction(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp index 7c06bcfdc..789b0815e 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp @@ -5,7 +5,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("nsArg",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); + boost::shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); int result = self->nsArg(arg); out[0] = wrap< int >(result); diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp index c6714ee9f..826e30c8c 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp @@ -5,7 +5,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("nsReturn",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); + boost::shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); double q = unwrap< double >(in[1]); ns2::ns3::ClassB result = self->nsReturn(q); out[0] = wrap_shared_ptr(make_shared< ns2::ns3::ClassB >(result),"ns2ns3ClassB"); diff --git a/wrap/tests/expected_namespaces/make_testNamespaces.m b/wrap/tests/expected_namespaces/make_testNamespaces.m index eac4146c8..d835a2da0 100644 --- a/wrap/tests/expected_namespaces/make_testNamespaces.m +++ b/wrap/tests/expected_namespaces/make_testNamespaces.m @@ -2,7 +2,7 @@ echo on toolboxpath = mfilename('fullpath'); -delims = find(toolboxpath == '/'); +delims = find(toolboxpath == '/' | toolboxpath == '\'); toolboxpath = toolboxpath(1:(delims(end)-1)); clear delims addpath(toolboxpath); From d636534e407d3944857698ad527aab0744317048 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 29 May 2012 19:30:59 +0000 Subject: [PATCH 088/914] Updated wrap unit tests --- wrap/tests/expected/@Point2/vectorConfusion.cpp | 2 +- wrap/tests/expected/@Test/create_MixedPtrs.cpp | 2 +- wrap/tests/expected/@Test/return_Test.cpp | 2 +- wrap/tests/expected/Point3_StaticFunctionRet.cpp | 2 +- wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/wrap/tests/expected/@Point2/vectorConfusion.cpp b/wrap/tests/expected/@Point2/vectorConfusion.cpp index bb6f02927..d992d1d94 100644 --- a/wrap/tests/expected/@Point2/vectorConfusion.cpp +++ b/wrap/tests/expected/@Point2/vectorConfusion.cpp @@ -6,5 +6,5 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) checkArguments("vectorConfusion",nargout,nargin-1,0); boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); VectorNotEigen result = self->vectorConfusion(); - out[0] = wrap_shared_ptr(make_shared< VectorNotEigen >(result),"VectorNotEigen"); + out[0] = wrap_shared_ptr(boost::make_shared< VectorNotEigen >(result),"VectorNotEigen"); } diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.cpp b/wrap/tests/expected/@Test/create_MixedPtrs.cpp index 9c685d6cf..81bcdc5d8 100644 --- a/wrap/tests/expected/@Test/create_MixedPtrs.cpp +++ b/wrap/tests/expected/@Test/create_MixedPtrs.cpp @@ -7,6 +7,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) checkArguments("create_MixedPtrs",nargout,nargin-1,0); boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); pair< Test, boost::shared_ptr > result = self->create_MixedPtrs(); - out[0] = wrap_shared_ptr(make_shared< Test >(result.first),"Test"); + out[0] = wrap_shared_ptr(boost::make_shared< Test >(result.first),"Test"); out[1] = wrap_shared_ptr(result.second,"Test"); } diff --git a/wrap/tests/expected/@Test/return_Test.cpp b/wrap/tests/expected/@Test/return_Test.cpp index 458e0c74d..63e9f5a3b 100644 --- a/wrap/tests/expected/@Test/return_Test.cpp +++ b/wrap/tests/expected/@Test/return_Test.cpp @@ -8,5 +8,5 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); Test result = self->return_Test(value); - out[0] = wrap_shared_ptr(make_shared< Test >(result),"Test"); + out[0] = wrap_shared_ptr(boost::make_shared< Test >(result),"Test"); } diff --git a/wrap/tests/expected/Point3_StaticFunctionRet.cpp b/wrap/tests/expected/Point3_StaticFunctionRet.cpp index 062194bd5..652d8713e 100644 --- a/wrap/tests/expected/Point3_StaticFunctionRet.cpp +++ b/wrap/tests/expected/Point3_StaticFunctionRet.cpp @@ -7,5 +7,5 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) checkArguments("Point3_StaticFunctionRet",nargout,nargin,1); double z = unwrap< double >(in[0]); Point3 result = Point3::StaticFunctionRet(z); - out[0] = wrap_shared_ptr(make_shared< Point3 >(result),"Point3"); + out[0] = wrap_shared_ptr(boost::make_shared< Point3 >(result),"Point3"); } diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp index 826e30c8c..dbeb42f60 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp @@ -8,5 +8,5 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) boost::shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); double q = unwrap< double >(in[1]); ns2::ns3::ClassB result = self->nsReturn(q); - out[0] = wrap_shared_ptr(make_shared< ns2::ns3::ClassB >(result),"ns2ns3ClassB"); + out[0] = wrap_shared_ptr(boost::make_shared< ns2::ns3::ClassB >(result),"ns2ns3ClassB"); } From cf232fe4a8aad4bc4993ffb68cdca7e719534918 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 29 May 2012 20:03:15 +0000 Subject: [PATCH 089/914] Added missing boost filesystem library to link with wrap --- wrap/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index a4286df98..01d873bac 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -5,7 +5,7 @@ file(GLOB wrap_srcs "*.cpp") list(REMOVE_ITEM wrap_srcs wrap.cpp) add_library(wrap_lib STATIC ${wrap_srcs}) add_executable(wrap wrap.cpp) -target_link_libraries(wrap wrap_lib) +target_link_libraries(wrap wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) # Install wrap binary if (GTSAM_INSTALL_WRAP) From 8bcd2da2f076d6dfb80451765aa96c5e6c914bdf Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 31 May 2012 15:06:21 +0000 Subject: [PATCH 090/914] Fixed wrap support for unsigned char --- gtsam.h | 2 +- wrap/matlab.h | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gtsam.h b/gtsam.h index e80a37a0b..fcf6f0a9f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -19,7 +19,7 @@ * Arguments to functions any of * - Eigen types: Matrix, Vector * - Eigen types and classes as an optionally const reference - * - C/C++ basic types: string, bool, size_t, int, double + * - C/C++ basic types: string, bool, size_t, int, double, char * - Any class with which be copied with boost::make_shared() (except Eigen) * - boost::shared_ptr of any object type (except Eigen) * Comments can use either C++ or C style, with multiple lines diff --git a/wrap/matlab.h b/wrap/matlab.h index b6d200e43..1a47430b5 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -106,6 +106,14 @@ mxArray* wrap(char& value) { return result; } +// specialization to unsigned char +template<> +mxArray* wrap(unsigned char& value) { + mxArray *result = scalar(mxUINT32OR64_CLASS); + *(unsigned char*)mxGetData(result) = value; + return result; +} + // specialization to bool template<> mxArray* wrap(bool& value) { @@ -227,13 +235,20 @@ bool unwrap(const mxArray* array) { return myGetScalar(array); } -// specialization to bool +// specialization to char template<> char unwrap(const mxArray* array) { checkScalar(array,"unwrap"); return myGetScalar(array); } +// specialization to unsigned char +template<> +unsigned char unwrap(const mxArray* array) { + checkScalar(array,"unwrap"); + return myGetScalar(array); +} + // specialization to int template<> int unwrap(const mxArray* array) { From 5160c2eb502827d3fb3e03c422d81bedc6e032db Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 2 Jun 2012 16:18:40 +0000 Subject: [PATCH 091/914] Significant API change in slam (GTSAM 2.0.1 or 2.1): to eliminate confusion and give the user more freedom in creating their own Keys, the different slam variants no longer create Symbol keys themselves. Instead, all interaction is done via Keys (which are just unordered, unsigned ints). All PoseSLAM unit tests and examples now just use sequential keys. However, a user can still create Keys using the Symbol constructor, which is illustrated in the landmark-based unit tests and examples. --- .cproject | 719 ++++++++---------- examples/LocalizationExample.cpp | 6 +- examples/LocalizationExample2.cpp | 13 +- examples/PlanarSLAMExample_easy.cpp | 26 +- examples/PlanarSLAMSelfContained_advanced.cpp | 62 +- examples/Pose2SLAMExample_advanced.cpp | 17 +- examples/matlab/LocalizationExample.m | 6 +- examples/vSLAMexample/Feature2D.h | 2 +- examples/vSLAMexample/vISAMexample.cpp | 35 +- examples/vSLAMexample/vSFMexample.cpp | 37 +- examples/vSLAMexample/vSLAMutils.h | 5 +- gtsam/nonlinear/ISAM2.h | 4 +- gtsam/slam/dataset.cpp | 8 +- gtsam/slam/planarSLAM.cpp | 24 +- gtsam/slam/planarSLAM.h | 56 +- gtsam/slam/pose2SLAM.cpp | 15 +- gtsam/slam/pose2SLAM.h | 25 +- gtsam/slam/pose3SLAM.cpp | 14 +- gtsam/slam/pose3SLAM.h | 9 +- gtsam/slam/simulated2D.h | 30 +- gtsam/slam/simulated2DOriented.h | 25 +- gtsam/slam/smallExample.cpp | 59 +- gtsam/slam/tests/testAntiFactor.cpp | 18 +- gtsam/slam/tests/testPlanarSLAM.cpp | 49 +- gtsam/slam/tests/testPose2SLAM.cpp | 133 ++-- gtsam/slam/tests/testPose3SLAM.cpp | 80 +- gtsam/slam/tests/testProjectionFactor.cpp | 36 +- gtsam/slam/tests/testSerializationSLAM.cpp | 37 +- gtsam/slam/tests/testSimulated2D.cpp | 4 +- gtsam/slam/tests/testSimulated2DOriented.cpp | 10 +- gtsam/slam/tests/testStereoFactor.cpp | 26 +- .../{testVSLAM.cpp => testVisualSLAM.cpp} | 122 +-- gtsam/slam/visualSLAM.cpp | 24 +- gtsam/slam/visualSLAM.h | 18 +- gtsam_unstable/slam/simulated3D.h | 11 +- gtsam_unstable/slam/tests/testSimulated3D.cpp | 4 +- tests/testBoundingConstraint.cpp | 2 +- tests/testDoglegOptimizer.cpp | 4 +- tests/testGaussianISAM2.cpp | 423 ++++------- tests/testGaussianJunctionTreeB.cpp | 43 +- tests/testGraph.cpp | 54 +- tests/testInferenceB.cpp | 26 +- tests/testNonlinearEquality.cpp | 8 +- tests/testNonlinearFactor.cpp | 97 +-- tests/testNonlinearISAM.cpp | 2 +- tests/testNonlinearOptimizer.cpp | 34 +- 46 files changed, 1118 insertions(+), 1344 deletions(-) rename gtsam/slam/tests/{testVSLAM.cpp => testVisualSLAM.cpp} (65%) diff --git a/.cproject b/.cproject index 0acb12e7e..c19b1a91a 100644 --- a/.cproject +++ b/.cproject @@ -311,14 +311,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -345,6 +337,7 @@ make + tests/testBayesTree.run true false @@ -352,6 +345,7 @@ make + testBinaryBayesNet.run true false @@ -399,6 +393,7 @@ make + testSymbolicBayesNet.run true false @@ -406,6 +401,7 @@ make + tests/testSymbolicFactor.run true false @@ -413,6 +409,7 @@ make + testSymbolicFactorGraph.run true false @@ -428,168 +425,17 @@ make + tests/testBayesTree true false true - + make -j2 - check - true - true - true - - - make - -j2 - testGaussianFactorGraph.run - true - true - true - - - make - -j2 - testGaussianISAM.run - true - true - true - - - make - - testGraph.run - true - false - true - - - make - -j2 - testIterative.run - true - true - true - - - make - -j2 - testNonlinearEquality.run - true - true - true - - - make - -j2 - testNonlinearFactor.run - true - true - true - - - make - -j2 - testNonlinearFactorGraph.run - true - true - true - - - make - -j2 - testNonlinearOptimizer.run - true - true - true - - - make - -j2 - testSubgraphPreconditioner.run - true - true - true - - - make - -j2 - testTupleConfig.run - true - true - true - - - make - -j2 - timeGaussianFactorGraph.run - true - true - true - - - make - - testInference.run - true - false - true - - - make - testGaussianFactor.run true - false - true - - - make - - testJunctionTree.run - true - false - true - - - make - - testSymbolicBayesNet.run - true - false - true - - - make - - testSymbolicFactorGraph.run - true - false - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testGaussianJunctionTree - true - true - true - - - make - -j2 - testSerialization.run - true true true @@ -665,22 +511,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -697,6 +527,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -721,54 +567,6 @@ true true - - make - -j5 - testValues.run - true - true - true - - - make - -j5 - testOrdering.run - true - true - true - - - make - -j2 - tests/testGeneralSFMFactor.run - true - true - true - - - make - -j2 - tests/testPlanarSLAM.run - true - true - true - - - make - -j2 - tests/testPose2SLAM.run - true - true - true - - - make - -j2 - tests/testPose3SLAM.run - true - true - true - make -j2 @@ -793,6 +591,94 @@ true true + + make + -j5 + testGeneralSFMFactor.run + true + true + true + + + make + -j5 + testPlanarSLAM.run + true + true + true + + + make + -j5 + testPose2SLAM.run + true + true + true + + + make + -j5 + testPose3SLAM.run + true + true + true + + + make + -j5 + testSimulated2D.run + true + true + true + + + make + -j5 + testSimulated2DOriented.run + true + true + true + + + make + -j5 + testVisualSLAM.run + true + true + true + + + make + -j5 + testProjectionFactor.run + true + true + true + + + make + -j5 + testSerializationSLAM.run + true + true + true + + + make + -j5 + testValues.run + true + true + true + + + make + -j5 + testOrdering.run + true + true + true + make -j5 @@ -897,22 +783,6 @@ true true - - make - -j2 - testGaussianJunctionTree.run - true - true - true - - - make - -j2 - testGaussianFactorGraph.run - true - true - true - make -j2 @@ -921,42 +791,26 @@ true true - + make - -j2 - testTupleConfig.run + -j5 + testMarginals.run true true true - + make - -j2 - testSerialization.run + -j5 + testGaussianISAM2.run true true true - + make - -j2 - testInference.run - true - true - true - - - make - -j2 - testGaussianISAM.run - true - true - true - - - make - -j2 - testSymbolicFactorGraph.run + -j5 + testSymbolicFactorGraphB.run true true true @@ -985,14 +839,6 @@ true true - - make - -j2 - testPose2SLAMwSPCG.run - true - true - true - make -j2 @@ -1017,14 +863,6 @@ true true - - make - -j5 - tests.testBoundingConstraint.run - true - true - true - make -j2 @@ -1057,6 +895,62 @@ true true + + make + -j5 + clean + true + true + true + + + make + -j5 + testGaussianJunctionTreeB.run + true + true + true + + + make + + testGraph.run + true + false + true + + + make + + testJunctionTree.run + true + false + true + + + make + + testSymbolicBayesNetB.run + true + false + true + + + make + -j5 + testGaussianISAM.run + true + true + true + + + make + -j5 + testDoglegOptimizer.run + true + true + true + make -j2 @@ -1147,6 +1041,7 @@ make + testErrors.run true false @@ -1602,7 +1497,6 @@ make - testSimulated2DOriented.run true false @@ -1642,7 +1536,6 @@ make - testSimulated2D.run true false @@ -1650,7 +1543,6 @@ make - testSimulated3D.run true false @@ -1752,10 +1644,10 @@ true true - + make - -j2 - CameraResectioning + -j5 + CameraResectioning.run true true true @@ -1832,6 +1724,30 @@ true true + + make + -j5 + LocalizationExample.run + true + true + true + + + make + -j5 + LocalizationExample2.run + true + true + true + + + make + -j5 + Pose2SLAMwSPCG_advanced.run + true + true + true + make -j2 @@ -1842,7 +1758,6 @@ make - tests/testGaussianISAM2 true false @@ -1864,102 +1779,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -2161,6 +1980,7 @@ cpack + -G DEB true false @@ -2168,6 +1988,7 @@ cpack + -G RPM true false @@ -2175,6 +1996,7 @@ cpack + -G TGZ true false @@ -2182,6 +2004,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2235,42 +2058,98 @@ true true - + make - -j5 - wrap.testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - wrap.testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap_gtsam + -j2 + timeRot3.run true true true - + make - -j5 - wrap + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2314,6 +2193,46 @@ false true + + make + -j5 + wrap.testSpirit.run + true + true + true + + + make + -j5 + wrap.testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index 2d2357dad..a8ff59d68 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -66,9 +66,9 @@ int main(int argc, char** argv) { // Query the marginals Marginals marginals = graph.marginals(result); cout.precision(2); - cout << "\nP1:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(1)) << endl; - cout << "\nP2:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(2)) << endl; - cout << "\nP3:\n" << marginals.marginalCovariance(pose2SLAM::PoseKey(3)) << endl; + cout << "\nP1:\n" << marginals.marginalCovariance(1) << endl; + cout << "\nP2:\n" << marginals.marginalCovariance(2) << endl; + cout << "\nP3:\n" << marginals.marginalCovariance(3) << endl; return 0; } diff --git a/examples/LocalizationExample2.cpp b/examples/LocalizationExample2.cpp index 903101d87..9a4330181 100644 --- a/examples/LocalizationExample2.cpp +++ b/examples/LocalizationExample2.cpp @@ -71,10 +71,9 @@ int main(int argc, char** argv) { // add unary measurement factors, like GPS, on all three poses SharedDiagonal noiseModel(Vector_(2, 0.1, 0.1)); // 10cm std on x,y - Symbol x1('x',1), x2('x',2), x3('x',3); - graph.push_back(boost::make_shared(x1, 0, 0, noiseModel)); - graph.push_back(boost::make_shared(x2, 2, 0, noiseModel)); - graph.push_back(boost::make_shared(x3, 4, 0, noiseModel)); + graph.push_back(boost::make_shared(1, 0, 0, noiseModel)); + graph.push_back(boost::make_shared(2, 2, 0, noiseModel)); + graph.push_back(boost::make_shared(3, 4, 0, noiseModel)); // print graph.print("\nFactor graph:\n"); @@ -94,9 +93,9 @@ int main(int argc, char** argv) { // Query the marginals Marginals marginals(graph, result); cout.precision(2); - cout << "\nP1:\n" << marginals.marginalCovariance(x1) << endl; - cout << "\nP2:\n" << marginals.marginalCovariance(x2) << endl; - cout << "\nP3:\n" << marginals.marginalCovariance(x3) << endl; + cout << "\nP1:\n" << marginals.marginalCovariance(1) << endl; + cout << "\nP2:\n" << marginals.marginalCovariance(2) << endl; + cout << "\nP3:\n" << marginals.marginalCovariance(3) << endl; return 0; } diff --git a/examples/PlanarSLAMExample_easy.cpp b/examples/PlanarSLAMExample_easy.cpp index 5039b1145..cd4a7aefd 100644 --- a/examples/PlanarSLAMExample_easy.cpp +++ b/examples/PlanarSLAMExample_easy.cpp @@ -35,16 +35,20 @@ int main(int argc, char** argv) { // create the graph (defined in planarSlam.h, derived from NonlinearFactorGraph) planarSLAM::Graph graph; + // Create some keys + static Symbol i1('x',1), i2('x',2), i3('x',3); + static Symbol j1('l',1), j2('l',2); + // add a Gaussian prior on pose x_1 Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta - graph.addPrior(1, priorMean, priorNoise); // add directly to graph + graph.addPrior(i1, priorMean, priorNoise); // add directly to graph // add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - graph.addOdometry(1, 2, odometry, odometryNoise); - graph.addOdometry(2, 3, odometry, odometryNoise); + graph.addOdometry(i1, i2, odometry, odometryNoise); + graph.addOdometry(i2, i3, odometry, odometryNoise); // create a noise model for the landmark measurements SharedDiagonal measurementNoise(Vector_(2, 0.1, 0.2)); // 0.1 rad std on bearing, 20cm on range @@ -58,20 +62,20 @@ int main(int argc, char** argv) { range32 = 2.0; // add bearing/range factors (created by "addBearingRange") - graph.addBearingRange(1, 1, bearing11, range11, measurementNoise); - graph.addBearingRange(2, 1, bearing21, range21, measurementNoise); - graph.addBearingRange(3, 2, bearing32, range32, measurementNoise); + graph.addBearingRange(i1, j1, bearing11, range11, measurementNoise); + graph.addBearingRange(i2, j1, bearing21, range21, measurementNoise); + graph.addBearingRange(i3, j2, bearing32, range32, measurementNoise); // print graph.print("Factor graph"); // create (deliberatly inaccurate) initial estimate planarSLAM::Values initialEstimate; - initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); - initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); - initialEstimate.insertPoint(1, Point2(1.8, 2.1)); - initialEstimate.insertPoint(2, Point2(4.1, 1.8)); + initialEstimate.insertPose(i1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insertPose(i2, Pose2(2.3, 0.1,-0.2)); + initialEstimate.insertPose(i3, Pose2(4.1, 0.1, 0.1)); + initialEstimate.insertPoint(j1, Point2(1.8, 2.1)); + initialEstimate.insertPoint(j2, Point2(4.1, 1.8)); initialEstimate.print("Initial estimate:\n "); diff --git a/examples/PlanarSLAMSelfContained_advanced.cpp b/examples/PlanarSLAMSelfContained_advanced.cpp index 36f9ad8ca..bff4ee7ea 100644 --- a/examples/PlanarSLAMSelfContained_advanced.cpp +++ b/examples/PlanarSLAMSelfContained_advanced.cpp @@ -15,29 +15,29 @@ * @author Alex Cunningham */ -#include -#include - -// for all nonlinear keys -#include - -// for points and poses -#include -#include - -// for modeling measurement uncertainty - all models included here -#include - // add in headers for specific factors #include #include #include +// for all nonlinear keys +#include + // implementations for structures - needed if self-contained, and these should be included last #include #include #include +// for modeling measurement uncertainty - all models included here +#include + +// for points and poses +#include +#include + +#include +#include + using namespace std; using namespace gtsam; @@ -52,8 +52,8 @@ using namespace gtsam; */ int main(int argc, char** argv) { // create keys for variables - Symbol x1('x',1), x2('x',2), x3('x',3); - Symbol l1('l',1), l2('l',2); + Symbol i1('x',1), i2('x',2), i3('x',3); + Symbol j1('l',1), j2('l',2); // create graph container and add factors to it NonlinearFactorGraph graph; @@ -62,7 +62,7 @@ int main(int argc, char** argv) { // gaussian for prior SharedDiagonal prior_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); Pose2 prior_measurement(0.0, 0.0, 0.0); // prior at origin - PriorFactor posePrior(x1, prior_measurement, prior_model); // create the factor + PriorFactor posePrior(i1, prior_measurement, prior_model); // create the factor graph.add(posePrior); // add the factor to the graph /* add odometry */ @@ -70,8 +70,8 @@ int main(int argc, char** argv) { SharedDiagonal odom_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); Pose2 odom_measurement(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) // create between factors to represent odometry - BetweenFactor odom12(x1, x2, odom_measurement, odom_model); - BetweenFactor odom23(x2, x3, odom_measurement, odom_model); + BetweenFactor odom12(i1, i2, odom_measurement, odom_model); + BetweenFactor odom23(i2, i3, odom_measurement, odom_model); graph.add(odom12); // add both to graph graph.add(odom23); @@ -88,9 +88,9 @@ int main(int argc, char** argv) { range32 = 2.0; // create bearing/range factors - BearingRangeFactor meas11(x1, l1, bearing11, range11, meas_model); - BearingRangeFactor meas21(x2, l1, bearing21, range21, meas_model); - BearingRangeFactor meas32(x3, l2, bearing32, range32, meas_model); + BearingRangeFactor meas11(i1, j1, bearing11, range11, meas_model); + BearingRangeFactor meas21(i2, j1, bearing21, range21, meas_model); + BearingRangeFactor meas32(i3, j2, bearing32, range32, meas_model); // add the factors graph.add(meas11); @@ -101,11 +101,11 @@ int main(int argc, char** argv) { // initialize to noisy points Values initial; - initial.insert(x1, Pose2(0.5, 0.0, 0.2)); - initial.insert(x2, Pose2(2.3, 0.1,-0.2)); - initial.insert(x3, Pose2(4.1, 0.1, 0.1)); - initial.insert(l1, Point2(1.8, 2.1)); - initial.insert(l2, Point2(4.1, 1.8)); + initial.insert(i1, Pose2(0.5, 0.0, 0.2)); + initial.insert(i2, Pose2(2.3, 0.1,-0.2)); + initial.insert(i3, Pose2(4.1, 0.1, 0.1)); + initial.insert(j1, Point2(1.8, 2.1)); + initial.insert(j2, Point2(4.1, 1.8)); initial.print("initial estimate"); @@ -126,11 +126,11 @@ int main(int argc, char** argv) { // Print marginals covariances for all variables Marginals marginals(graph, resultMultifrontal, Marginals::CHOLESKY); - print(marginals.marginalCovariance(x1), "x1 covariance"); - print(marginals.marginalCovariance(x2), "x2 covariance"); - print(marginals.marginalCovariance(x3), "x3 covariance"); - print(marginals.marginalCovariance(l1), "l1 covariance"); - print(marginals.marginalCovariance(l2), "l2 covariance"); + print(marginals.marginalCovariance(i1), "i1 covariance"); + print(marginals.marginalCovariance(i2), "i2 covariance"); + print(marginals.marginalCovariance(i3), "i3 covariance"); + print(marginals.marginalCovariance(j1), "j1 covariance"); + print(marginals.marginalCovariance(j2), "j2 covariance"); return 0; } diff --git a/examples/Pose2SLAMExample_advanced.cpp b/examples/Pose2SLAMExample_advanced.cpp index 29d8c58cf..3884e03e4 100644 --- a/examples/Pose2SLAMExample_advanced.cpp +++ b/examples/Pose2SLAMExample_advanced.cpp @@ -16,26 +16,23 @@ * @author Chris Beall */ -#include -#include -#include - // pull in the Pose2 SLAM domain with all typedefs and helper functions defined #include #include #include - #include #include +#include +#include +#include + using namespace std; using namespace gtsam; -using namespace boost; -using namespace pose2SLAM; int main(int argc, char** argv) { /* 1. create graph container and add factors to it */ - Graph graph; + pose2SLAM::Graph graph; /* 2.a add prior */ // gaussian for prior @@ -77,8 +74,8 @@ int main(int argc, char** argv) { /* Get covariances */ Marginals marginals(graph, result, Marginals::CHOLESKY); - Matrix covariance1 = marginals.marginalCovariance(PoseKey(1)); - Matrix covariance2 = marginals.marginalCovariance(PoseKey(2)); + Matrix covariance1 = marginals.marginalCovariance(1); + Matrix covariance2 = marginals.marginalCovariance(2); print(covariance1, "Covariance1"); print(covariance2, "Covariance2"); diff --git a/examples/matlab/LocalizationExample.m b/examples/matlab/LocalizationExample.m index 521c768ec..3a8282e3a 100644 --- a/examples/matlab/LocalizationExample.m +++ b/examples/matlab/LocalizationExample.m @@ -45,9 +45,9 @@ result.print(sprintf('\nFinal result:\n ')); %% Query the marginals marginals = graph.marginals(result); -x{1}=gtsamSymbol('x',1); P{1}=marginals.marginalCovariance(x{1}.key) -x{2}=gtsamSymbol('x',2); P{2}=marginals.marginalCovariance(x{2}.key) -x{3}=gtsamSymbol('x',3); P{3}=marginals.marginalCovariance(x{3}.key) +P{1}=marginals.marginalCovariance(1) +P{2}=marginals.marginalCovariance(2) +P{3}=marginals.marginalCovariance(3) %% Plot Trajectory figure(1) diff --git a/examples/vSLAMexample/Feature2D.h b/examples/vSLAMexample/Feature2D.h index aca5f9e4b..ea0f60e74 100644 --- a/examples/vSLAMexample/Feature2D.h +++ b/examples/vSLAMexample/Feature2D.h @@ -24,7 +24,7 @@ struct Feature2D { gtsam::Point2 m_p; - int m_idCamera; // id of the camera pose that makes this measurement + int m_idCamera; // id of the camera pose that makes this measurement int m_idLandmark; // id of the 3D landmark that it is associated with Feature2D(int idCamera, int idLandmark, gtsam::Point2 p) : diff --git a/examples/vSLAMexample/vISAMexample.cpp b/examples/vSLAMexample/vISAMexample.cpp index 71d5516a2..6b47c9633 100644 --- a/examples/vSLAMexample/vISAMexample.cpp +++ b/examples/vSLAMexample/vISAMexample.cpp @@ -11,14 +11,12 @@ /** * @file vISAMexample.cpp - * @brief An ISAM example for synthesis sequence - * single camera + * @brief An ISAM example for synthesis sequence, single camera * @author Duy-Nguyen Ta */ -#include -#include -using namespace boost; +#include "vSLAMutils.h" +#include "Feature2D.h" #include #include @@ -26,13 +24,12 @@ using namespace boost; #include #include -#include "vSLAMutils.h" -#include "Feature2D.h" +#include +#include +using namespace boost; using namespace std; using namespace gtsam; -using namespace visualSLAM; -using namespace boost; /* ************************************************************************* */ #define CALIB_FILE "calib.txt" @@ -45,7 +42,7 @@ string g_dataFolder; // Store groundtruth values, read from files shared_ptrK g_calib; -map g_landmarks; // map: +map g_landmarks; // map: map g_poses; // map: std::map > g_measurements; // feature sets detected at each frame @@ -76,31 +73,31 @@ void readAllDataISAM() { /** * Setup newFactors and initialValues for each new pose and set of measurements at each frame. */ -void createNewFactors(shared_ptr& newFactors, boost::shared_ptr& initialValues, +void createNewFactors(shared_ptr& newFactors, boost::shared_ptr& initialValues, int pose_id, const Pose3& pose, const std::vector& measurements, SharedNoiseModel measurementSigma, shared_ptrK calib) { // Create a graph of newFactors with new measurements - newFactors = shared_ptr (new Graph()); + newFactors = shared_ptr (new visualSLAM::Graph()); for (size_t i = 0; i < measurements.size(); i++) { newFactors->addMeasurement( measurements[i].m_p, measurementSigma, - pose_id, - measurements[i].m_idLandmark, + Symbol('x',pose_id), + Symbol('l',measurements[i].m_idLandmark), calib); } // ... we need priors on the new pose and all new landmarks newFactors->addPosePrior(pose_id, pose, poseSigma); for (size_t i = 0; i < measurements.size(); i++) { - newFactors->addPointPrior(measurements[i].m_idLandmark, g_landmarks[measurements[i].m_idLandmark]); + newFactors->addPointPrior(Symbol('x',measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); } // Create initial values for all nodes in the newFactors initialValues = shared_ptr (new Values()); - initialValues->insert(PoseKey(pose_id), pose); + initialValues->insert(Symbol('x',pose_id), pose); for (size_t i = 0; i < measurements.size(); i++) { - initialValues->insert(PointKey(measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); + initialValues->insert(Symbol('l',measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); } } @@ -127,8 +124,8 @@ int main(int argc, char* argv[]) { typedef std::map > FeatureMap; BOOST_FOREACH(const FeatureMap::value_type& features, g_measurements) { const int poseId = features.first; - shared_ptr newFactors; - shared_ptr initialValues; + shared_ptr newFactors; + shared_ptr initialValues; createNewFactors(newFactors, initialValues, poseId, g_poses[poseId], features.second, measurementSigma, g_calib); diff --git a/examples/vSLAMexample/vSFMexample.cpp b/examples/vSLAMexample/vSFMexample.cpp index 8774b79f3..6eb3955f2 100644 --- a/examples/vSLAMexample/vSFMexample.cpp +++ b/examples/vSLAMexample/vSFMexample.cpp @@ -11,26 +11,23 @@ /** * @file vSFMexample.cpp - * @brief An vSFM example for synthesis sequence - * single camera + * @brief A visual SLAM example for simulated sequence * @author Duy-Nguyen Ta */ -#include -using namespace boost; +#include "vSLAMutils.h" +#include "Feature2D.h" #include #include #include #include -#include "vSLAMutils.h" -#include "Feature2D.h" +#include +using namespace boost; using namespace std; using namespace gtsam; -using namespace visualSLAM; -using namespace boost; /* ************************************************************************* */ #define CALIB_FILE "calib.txt" @@ -43,9 +40,9 @@ string g_dataFolder; // Store groundtruth values, read from files shared_ptrK g_calib; -map g_landmarks; // map: -map g_poses; // map: -std::vector g_measurements; // Feature2D: {camera_id, landmark_id, 2d feature_position} +map g_landmarks; // map: +map g_poses; // map: +std::vector g_measurements; // Feature2D: {camera_id, landmark_id, 2d feature_position} // Noise models SharedNoiseModel measurementSigma(noiseModel::Isotropic::Sigma(2, 5.0f)); @@ -75,9 +72,9 @@ void readAllData() { * by adding and linking 2D features (measurements) detected in each captured image * with their corresponding landmarks. */ -Graph setupGraph(std::vector& measurements, SharedNoiseModel measurementSigma, shared_ptrK calib) { +visualSLAM::Graph setupGraph(std::vector& measurements, SharedNoiseModel measurementSigma, shared_ptrK calib) { - Graph g; + visualSLAM::Graph g; cout << "Built graph: " << endl; for (size_t i = 0; i < measurements.size(); i++) { @@ -86,8 +83,8 @@ Graph setupGraph(std::vector& measurements, SharedNoiseModel measurem g.addMeasurement( measurements[i].m_p, measurementSigma, - measurements[i].m_idCamera, - measurements[i].m_idLandmark, + Symbol('x',measurements[i].m_idCamera), + Symbol('l',measurements[i].m_idLandmark), calib); } @@ -101,15 +98,15 @@ Graph setupGraph(std::vector& measurements, SharedNoiseModel measurem */ Values initialize(std::map landmarks, std::map poses) { - Values initValues; + visualSLAM::Values initValues; // Initialize landmarks 3D positions. for (map::iterator lmit = landmarks.begin(); lmit != landmarks.end(); lmit++) - initValues.insert(PointKey(lmit->first), lmit->second); + initValues.insert(Symbol('l',lmit->first), lmit->second); // Initialize camera poses. for (map::iterator poseit = poses.begin(); poseit != poses.end(); poseit++) - initValues.insert(PoseKey(poseit->first), poseit->second); + initValues.insert(Symbol('x',poseit->first), poseit->second); return initValues; } @@ -129,7 +126,7 @@ int main(int argc, char* argv[]) { readAllData(); // Create a graph using the 2D measurements (features) and the calibration data - Graph graph(setupGraph(g_measurements, measurementSigma, g_calib)); + visualSLAM::Graph graph(setupGraph(g_measurements, measurementSigma, g_calib)); // Create an initial Values structure using groundtruth values as the initial estimates Values initialEstimates(initialize(g_landmarks, g_poses)); @@ -139,7 +136,7 @@ int main(int argc, char* argv[]) { // Add prior factor for all poses in the graph map::iterator poseit = g_poses.begin(); for (; poseit != g_poses.end(); poseit++) - graph.addPosePrior(poseit->first, poseit->second, noiseModel::Unit::Create(1)); + graph.addPosePrior(Symbol('x',poseit->first), poseit->second, noiseModel::Unit::Create(1)); // Optimize the graph cout << "*******************************************************" << endl; diff --git a/examples/vSLAMexample/vSLAMutils.h b/examples/vSLAMexample/vSLAMutils.h index 52d492224..2365ef35c 100644 --- a/examples/vSLAMexample/vSLAMutils.h +++ b/examples/vSLAMexample/vSLAMutils.h @@ -17,13 +17,12 @@ #pragma once -#include -#include #include "Feature2D.h" #include "gtsam/geometry/Pose3.h" #include "gtsam/geometry/Point3.h" #include "gtsam/geometry/Cal3_S2.h" - +#include +#include std::map readLandMarks(const std::string& landmarkFile); diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 42c38514c..0d5724865 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -94,8 +94,8 @@ struct ISAM2Params { * entries would be added with: * \code FastMap thresholds; - thresholds[PoseKey::chr()] = Vector_(6, 0.1, 0.1, 0.1, 0.5, 0.5, 0.5); // 0.1 rad rotation threshold, 0.5 m translation threshold - thresholds[PointKey::chr()] = Vector_(3, 1.0, 1.0, 1.0); // 1.0 m landmark position threshold + thresholds['x'] = Vector_(6, 0.1, 0.1, 0.1, 0.5, 0.5, 0.5); // 0.1 rad rotation threshold, 0.5 m translation threshold + thresholds['l'] = Vector_(3, 1.0, 1.0, 1.0); // 1.0 m landmark position threshold params.relinearizeThreshold = thresholds; \endcode */ diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index f45f560a7..2aec8e55a 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -95,7 +95,7 @@ pair load2D(const string& filename, is >> id >> x >> y >> yaw; // optional filter if (maxID && id >= maxID) continue; - poses->insert(pose2SLAM::PoseKey(id), Pose2(x, y, yaw)); + poses->insert(id, Pose2(x, y, yaw)); } is.ignore(LINESIZE, '\n'); } @@ -132,10 +132,10 @@ pair load2D(const string& filename, l1Xl2 = l1Xl2.retract((*model)->sample()); // Insert vertices if pure odometry file - if (!poses->exists(pose2SLAM::PoseKey(id1))) poses->insert(pose2SLAM::PoseKey(id1), Pose2()); - if (!poses->exists(pose2SLAM::PoseKey(id2))) poses->insert(pose2SLAM::PoseKey(id2), poses->at(pose2SLAM::PoseKey(id1)) * l1Xl2); + if (!poses->exists(id1)) poses->insert(id1, Pose2()); + if (!poses->exists(id2)) poses->insert(id2, poses->at(id1) * l1Xl2); - pose2SLAM::Graph::sharedFactor factor(new Pose2Factor(pose2SLAM::PoseKey(id1), pose2SLAM::PoseKey(id2), l1Xl2, *model)); + pose2SLAM::Graph::sharedFactor factor(new Pose2Factor(id1, id2, l1Xl2, *model)); graph->push_back(factor); } is.ignore(LINESIZE, '\n'); diff --git a/gtsam/slam/planarSLAM.cpp b/gtsam/slam/planarSLAM.cpp index b490a76cb..e385cb66f 100644 --- a/gtsam/slam/planarSLAM.cpp +++ b/gtsam/slam/planarSLAM.cpp @@ -26,39 +26,39 @@ namespace planarSLAM { NonlinearFactorGraph(graph) {} /* ************************************************************************* */ - void Graph::addPrior(Index i, const Pose2& p, const SharedNoiseModel& model) { - sharedFactor factor(new Prior(PoseKey(i), p, model)); + void Graph::addPrior(Key i, const Pose2& p, const SharedNoiseModel& model) { + sharedFactor factor(new Prior(i, p, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addPoseConstraint(Index i, const Pose2& p) { - sharedFactor factor(new Constraint(PoseKey(i), p)); + void Graph::addPoseConstraint(Key i, const Pose2& p) { + sharedFactor factor(new Constraint(i, p)); push_back(factor); } /* ************************************************************************* */ - void Graph::addOdometry(Index i, Index j, const Pose2& odometry, const SharedNoiseModel& model) { - sharedFactor factor(new Odometry(PoseKey(i), PoseKey(j), odometry, model)); + void Graph::addOdometry(Key i1, Key i2, const Pose2& odometry, const SharedNoiseModel& model) { + sharedFactor factor(new Odometry(i1, i2, odometry, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addBearing(Index i, Index j, const Rot2& z, const SharedNoiseModel& model) { - sharedFactor factor(new Bearing(PoseKey(i), PointKey(j), z, model)); + void Graph::addBearing(Key i, Key j, const Rot2& z, const SharedNoiseModel& model) { + sharedFactor factor(new Bearing(i, j, z, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addRange(Index i, Index j, double z, const SharedNoiseModel& model) { - sharedFactor factor(new Range(PoseKey(i), PointKey(j), z, model)); + void Graph::addRange(Key i, Key j, double z, const SharedNoiseModel& model) { + sharedFactor factor(new Range(i, j, z, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addBearingRange(Index i, Index j, const Rot2& z1, + void Graph::addBearingRange(Key i, Key j, const Rot2& z1, double z2, const SharedNoiseModel& model) { - sharedFactor factor(new BearingRange(PoseKey(i), PointKey(j), z1, z2, model)); + sharedFactor factor(new BearingRange(i, j, z1, z2, model)); push_back(factor); } diff --git a/gtsam/slam/planarSLAM.h b/gtsam/slam/planarSLAM.h index 818879f26..f45c3bc86 100644 --- a/gtsam/slam/planarSLAM.h +++ b/gtsam/slam/planarSLAM.h @@ -11,7 +11,7 @@ /** * @file planarSLAM.h - * @brief: bearing/range measurements in 2D plane + * @brief bearing/range measurements in 2D plane * @author Frank Dellaert */ @@ -31,29 +31,25 @@ namespace planarSLAM { using namespace gtsam; - /// Convenience function for constructing a pose key - inline Symbol PoseKey(Index j) { return Symbol('x', j); } - - /// Convenience function for constructing a pose key - inline Symbol PointKey(Index j) { return Symbol('l', j); } - /* * List of typedefs for factors */ - /// A hard constraint for PoseKeys to enforce particular values + + /// A hard constraint for poses to enforce particular values typedef NonlinearEquality Constraint; - /// A prior factor to bias the value of a PoseKey + /// A prior factor to bias the value of a pose typedef PriorFactor Prior; - /// A factor between two PoseKeys set with a Pose2 + /// A factor between two poses set with a Pose2 typedef BetweenFactor Odometry; - /// A factor between a PoseKey and a PointKey to express difference in rotation (set with a Rot2) + /// A factor between a pose and a point to express difference in rotation (set with a Rot2) typedef BearingFactor Bearing; - /// A factor between a PoseKey and a PointKey to express distance between them (set with a double) + /// A factor between a pose and a point to express distance between them (set with a double) typedef RangeFactor Range; - /// A factor between a PoseKey and a PointKey to express difference in rotation and location + /// A factor between a pose and a point to express difference in rotation and location typedef BearingRangeFactor BearingRange; - /** Values class, using specific PoseKeys and PointKeys + /** + * Values class, using specific poses and points * Mainly as a convenience for MATLAB wrapper, which does not allow for identically named methods */ struct Values: public gtsam::Values { @@ -67,16 +63,16 @@ namespace planarSLAM { } /// get a pose - Pose2 pose(Index key) const { return at(PoseKey(key)); } + Pose2 pose(Key i) const { return at(i); } /// get a point - Point2 point(Index key) const { return at(PointKey(key)); } + Point2 point(Key j) const { return at(j); } /// insert a pose - void insertPose(Index key, const Pose2& pose) { insert(PoseKey(key), pose); } + void insertPose(Key i, const Pose2& pose) { insert(i, pose); } /// insert a point - void insertPoint(Index key, const Point2& point) { insert(PointKey(key), point); } + void insertPoint(Key j, const Point2& point) { insert(j, point); } }; /// Creates a NonlinearFactorGraph with the Values type @@ -88,23 +84,23 @@ namespace planarSLAM { /// Creates a NonlinearFactorGraph based on another NonlinearFactorGraph Graph(const NonlinearFactorGraph& graph); - /// Biases the value of PoseKey key with Pose2 p given a noise model - void addPrior(Index poseKey, const Pose2& pose, const SharedNoiseModel& noiseModel); + /// Biases the value of pose key with Pose2 p given a noise model + void addPrior(Key i, const Pose2& pose, const SharedNoiseModel& noiseModel); - /// Creates a hard constraint to enforce Pose2 p for PoseKey poseKey's value - void addPoseConstraint(Index poseKey, const Pose2& pose); + /// Creates a hard constraint on the ith pose + void addPoseConstraint(Key i, const Pose2& pose); - /// Creates a factor with a Pose2 between PoseKeys poseKey and pointKey (poseKey.e. an odometry measurement) - void addOdometry(Index poseKey1, Index poseKey2, const Pose2& odometry, const SharedNoiseModel& model); + /// Creates an odometry factor between poses with keys i1 and i2 + void addOdometry(Key i1, Key i2, const Pose2& odometry, const SharedNoiseModel& model); - /// Creates a factor with a Rot2 between a PoseKey poseKey and PointKey pointKey for difference in rotation - void addBearing(Index poseKey, Index pointKey, const Rot2& bearing, const SharedNoiseModel& model); + /// Creates a bearing measurement from pose i to point j + void addBearing(Key i, Key j, const Rot2& bearing, const SharedNoiseModel& model); - /// Creates a factor with a Rot2 between a PoseKey poseKey and PointKey pointKey for difference in location - void addRange(Index poseKey, Index pointKey, double range, const SharedNoiseModel& model); + /// Creates a range measurement from pose i to point j + void addRange(Key i, Key k, double range, const SharedNoiseModel& model); - /// Creates a factor with a Rot2 between a PoseKey poseKey and PointKey pointKey for difference in rotation and location - void addBearingRange(Index poseKey, Index pointKey, const Rot2& bearing, double range, const SharedNoiseModel& model); + /// Creates a range/bearing measurement from pose i to point j + void addBearingRange(Key i, Key j, const Rot2& bearing, double range, const SharedNoiseModel& model); /// Optimize Values optimize(const Values& initialEstimate) const; diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp index dd80b821b..b08f0c305 100644 --- a/gtsam/slam/pose2SLAM.cpp +++ b/gtsam/slam/pose2SLAM.cpp @@ -27,27 +27,26 @@ namespace pose2SLAM { Values x; double theta = 0, dtheta = 2 * M_PI / n; for (size_t i = 0; i < n; i++, theta += dtheta) - x.insert(PoseKey(i), Pose2(cos(theta), sin(theta), M_PI_2 + theta)); + x.insert(i, Pose2(cos(theta), sin(theta), M_PI_2 + theta)); return x; } /* ************************************************************************* */ - void Graph::addPrior(Index i, const Pose2& p, - const SharedNoiseModel& model) { - sharedFactor factor(new Prior(PoseKey(i), p, model)); + void Graph::addPrior(Key i, const Pose2& p, const SharedNoiseModel& model) { + sharedFactor factor(new Prior(i, p, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addPoseConstraint(Index i, const Pose2& p) { - sharedFactor factor(new HardConstraint(PoseKey(i), p)); + void Graph::addPoseConstraint(Key i, const Pose2& p) { + sharedFactor factor(new HardConstraint(i, p)); push_back(factor); } /* ************************************************************************* */ - void Graph::addOdometry(Index i, Index j, const Pose2& z, + void Graph::addOdometry(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model) { - sharedFactor factor(new Odometry(PoseKey(i), PoseKey(j), z, model)); + sharedFactor factor(new Odometry(i1, i2, z, model)); push_back(factor); } diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 50944cf2f..337ab9f7a 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -31,10 +31,7 @@ namespace pose2SLAM { using namespace gtsam; - /// Convenience function for constructing a pose key - inline Symbol PoseKey(Index j) { return Symbol('x', j); } - - /// Values class, inherited from Values, using PoseKeys, mainly used as a convenience for MATLAB wrapper + /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper struct Values: public gtsam::Values { /// Default constructor @@ -48,10 +45,10 @@ namespace pose2SLAM { // Convenience for MATLAB wrapper, which does not allow for identically named methods /// get a pose - Pose2 pose(Index key) const { return at(PoseKey(key)); } + Pose2 pose(Key i) const { return at(i); } /// insert a pose - void insertPose(Index key, const Pose2& pose) { insert(PoseKey(key), pose); } + void insertPose(Key i, const Pose2& pose) { insert(i, pose); } }; /** @@ -83,20 +80,18 @@ namespace pose2SLAM { /// Creates a NonlinearFactorGraph based on another NonlinearFactorGraph Graph(const NonlinearFactorGraph& graph); - /// Adds a Pose2 prior with a noise model to one of the keys in the nonlinear factor graph - void addPrior(Index i, const Pose2& p, const SharedNoiseModel& model); + /// Adds a Pose2 prior with mean p and given noise model on pose i + void addPrior(Key i, const Pose2& p, const SharedNoiseModel& model); /// Creates a hard constraint for key i with the given Pose2 p. - void addPoseConstraint(Index i, const Pose2& p); + void addPoseConstraint(Key i, const Pose2& p); - /// Creates a between factor between keys i and j with a noise model with Pose2 z in the graph - void addOdometry(Index i, Index j, const Pose2& z, - const SharedNoiseModel& model); + /// Creates an odometry factor between poses with keys i1 and i2 + void addOdometry(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model); /// AddConstraint adds a soft constraint between factor between keys i and j - void addConstraint(Index i, Index j, const Pose2& z, - const SharedNoiseModel& model) { - addOdometry(i,j,z,model); // same for now + void addConstraint(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model) { + addOdometry(i1,i2,z,model); // same for now } /// Optimize diff --git a/gtsam/slam/pose3SLAM.cpp b/gtsam/slam/pose3SLAM.cpp index 0ab962f1e..ffce28fe7 100644 --- a/gtsam/slam/pose3SLAM.cpp +++ b/gtsam/slam/pose3SLAM.cpp @@ -36,26 +36,26 @@ namespace pose3SLAM { Point3 gti(radius*cos(theta), radius*sin(theta), 0); Rot3 _0Ri = Rot3::yaw(-theta); // negative yaw goes counterclockwise, with Z down ! Pose3 gTi(gR0 * _0Ri, gti); - x.insert(PoseKey(i), gTi); + x.insert(i, gTi); } return x; } /* ************************************************************************* */ - void Graph::addPrior(Index i, const Pose3& p, const SharedNoiseModel& model) { - sharedFactor factor(new Prior(PoseKey(i), p, model)); + void Graph::addPrior(Key i, const Pose3& p, const SharedNoiseModel& model) { + sharedFactor factor(new Prior(i, p, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addConstraint(Index i, Index j, const Pose3& z, const SharedNoiseModel& model) { - sharedFactor factor(new Constraint(PoseKey(i), PoseKey(j), z, model)); + void Graph::addConstraint(Key i1, Key i2, const Pose3& z, const SharedNoiseModel& model) { + sharedFactor factor(new Constraint(i1, i2, z, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addHardConstraint(Index i, const Pose3& p) { - sharedFactor factor(new HardConstraint(PoseKey(i), p)); + void Graph::addHardConstraint(Key i, const Pose3& p) { + sharedFactor factor(new HardConstraint(i, p)); push_back(factor); } diff --git a/gtsam/slam/pose3SLAM.h b/gtsam/slam/pose3SLAM.h index 6b4efbe6c..e42238892 100644 --- a/gtsam/slam/pose3SLAM.h +++ b/gtsam/slam/pose3SLAM.h @@ -30,9 +30,6 @@ namespace pose3SLAM { using namespace gtsam; - /// Convenience function for constructing a pose key - inline Symbol PoseKey(Index j) { return Symbol('x', j); } - /** * Create a circle of n 3D poses tangent to circle of radius R, first pose at (R,0) * @param n number of poses @@ -52,13 +49,13 @@ namespace pose3SLAM { struct Graph: public NonlinearFactorGraph { /// Adds a factor between keys of the same type - void addPrior(Index i, const Pose3& p, const SharedNoiseModel& model); + void addPrior(Key i, const Pose3& p, const SharedNoiseModel& model); /// Creates a between factor between keys i and j with a noise model with Pos3 z in the graph - void addConstraint(Index i, Index j, const Pose3& z, const SharedNoiseModel& model); + void addConstraint(Key i1, Key i2, const Pose3& z, const SharedNoiseModel& model); /// Creates a hard constraint for key i with the given Pose3 p. - void addHardConstraint(Index i, const Pose3& p); + void addHardConstraint(Key i, const Pose3& p); /// Optimize Values optimize(const Values& initialEstimate) { diff --git a/gtsam/slam/simulated2D.h b/gtsam/slam/simulated2D.h index e9b4f2bc9..403fac109 100644 --- a/gtsam/slam/simulated2D.h +++ b/gtsam/slam/simulated2D.h @@ -30,12 +30,6 @@ namespace simulated2D { // Simulated2D robots have no orientation, just a position - /// Convenience function for constructing a pose key - inline Symbol PoseKey(Index j) { return Symbol('x', j); } - - /// Convenience function for constructing a landmark key - inline Symbol PointKey(Index j) { return Symbol('l', j); } - /** * Custom Values class that holds poses and points, mainly used as a convenience for MATLAB wrapper */ @@ -57,14 +51,14 @@ namespace simulated2D { } /// Insert a pose - void insertPose(Index j, const Point2& p) { - insert(PoseKey(j), p); + void insertPose(Key i, const Point2& p) { + insert(i, p); nrPoses_++; } /// Insert a point - void insertPoint(Index j, const Point2& p) { - insert(PointKey(j), p); + void insertPoint(Key j, const Point2& p) { + insert(j, p); nrPoints_++; } @@ -79,13 +73,13 @@ namespace simulated2D { } /// Return pose i - Point2 pose(Index j) const { - return at(PoseKey(j)); + Point2 pose(Key i) const { + return at(i); } /// Return point j - Point2 point(Index j) const { - return at(PointKey(j)); + Point2 point(Key j) const { + return at(j); } }; @@ -171,8 +165,8 @@ namespace simulated2D { Pose measured_; ///< odometry measurement /// Create odometry - GenericOdometry(const Pose& measured, const SharedNoiseModel& model, Key key1, Key key2) : - Base(model, key1, key2), measured_(measured) { + GenericOdometry(const Pose& measured, const SharedNoiseModel& model, Key i1, Key i2) : + Base(model, i1, i2), measured_(measured) { } /// Evaluate error and optionally return derivatives @@ -215,8 +209,8 @@ namespace simulated2D { Landmark measured_; ///< Measurement /// Create measurement factor - GenericMeasurement(const Landmark& measured, const SharedNoiseModel& model, Key poseKey, Key landmarkKey) : - Base(model, poseKey, landmarkKey), measured_(measured) { + GenericMeasurement(const Landmark& measured, const SharedNoiseModel& model, Key i, Key j) : + Base(model, i, j), measured_(measured) { } /// Evaluate error and optionally return derivatives diff --git a/gtsam/slam/simulated2DOriented.h b/gtsam/slam/simulated2DOriented.h index c7ebd466c..ed0d8ba1a 100644 --- a/gtsam/slam/simulated2DOriented.h +++ b/gtsam/slam/simulated2DOriented.h @@ -19,6 +19,7 @@ #pragma once #include +#include #include #include @@ -27,12 +28,6 @@ namespace simulated2DOriented { using namespace gtsam; - /// Convenience function for constructing a pose key - inline Symbol PoseKey(Index j) { return Symbol('x', j); } - - /// Convenience function for constructing a landmark key - inline Symbol PointKey(Index j) { return Symbol('l', j); } - /// Specialized Values structure with syntactic sugar for /// compatibility with matlab class Values: public gtsam::Values { @@ -40,21 +35,23 @@ namespace simulated2DOriented { public: Values() : nrPoses_(0), nrPoints_(0) {} - void insertPose(Index j, const Pose2& p) { - insert(PoseKey(j), p); + /// insert a pose + void insertPose(Key i, const Pose2& p) { + insert(i, p); nrPoses_++; } - void insertPoint(Index j, const Point2& p) { - insert(PointKey(j), p); + /// insert a landmark + void insertPoint(Key j, const Point2& p) { + insert(j, p); nrPoints_++; } - int nrPoses() const { return nrPoses_; } - int nrPoints() const { return nrPoints_; } + int nrPoses() const { return nrPoses_; } ///< nr of poses + int nrPoints() const { return nrPoints_; } ///< nr of landmarks - Pose2 pose(Index j) const { return at(PoseKey(j)); } - Point2 point(Index j) const { return at(PointKey(j)); } + Pose2 pose(Key i) const { return at(i); } ///< get a pose + Point2 point(Key j) const { return at(j); } ///< get a landmark }; //TODO:: point prior is not implemented right now diff --git a/gtsam/slam/smallExample.cpp b/gtsam/slam/smallExample.cpp index fae2d2e22..2e9194466 100644 --- a/gtsam/slam/smallExample.cpp +++ b/gtsam/slam/smallExample.cpp @@ -17,28 +17,24 @@ * @author Frank dellaert */ -#include -#include +#include +#include +#include +#include +#include +#include + #include #include +#include +#include + using namespace std; -#include -#include -#include - -// template definitions -#include -#include -#include - namespace gtsam { namespace example { - using simulated2D::PoseKey; - using simulated2D::PointKey; - typedef boost::shared_ptr shared; static SharedDiagonal sigma1_0 = noiseModel::Isotropic::Sigma(2,1.0); @@ -49,6 +45,7 @@ namespace example { static const Index _l1_=0, _x1_=1, _x2_=2; static const Index _x_=0, _y_=1, _z_=2; + // Convenience for named keys Key kx(size_t i) { return Symbol('x',i); } Key kl(size_t i) { return Symbol('l',i); } @@ -60,22 +57,22 @@ namespace example { // prior on x1 Point2 mu; - shared f1(new simulated2D::Prior(mu, sigma0_1, PoseKey(1))); + shared f1(new simulated2D::Prior(mu, sigma0_1, kx(1))); nlfg->push_back(f1); // odometry between x1 and x2 Point2 z2(1.5, 0); - shared f2(new simulated2D::Odometry(z2, sigma0_1, PoseKey(1), PoseKey(2))); + shared f2(new simulated2D::Odometry(z2, sigma0_1, kx(1), kx(2))); nlfg->push_back(f2); // measurement between x1 and l1 Point2 z3(0, -1); - shared f3(new simulated2D::Measurement(z3, sigma0_2, PoseKey(1), PointKey(1))); + shared f3(new simulated2D::Measurement(z3, sigma0_2, kx(1), kl(1))); nlfg->push_back(f3); // measurement between x2 and l1 Point2 z4(-1.5, -1.); - shared f4(new simulated2D::Measurement(z4, sigma0_2, PoseKey(2), PointKey(1))); + shared f4(new simulated2D::Measurement(z4, sigma0_2, kx(2), kl(1))); nlfg->push_back(f4); return nlfg; @@ -89,9 +86,9 @@ namespace example { /* ************************************************************************* */ Values createValues() { Values c; - c.insert(PoseKey(1), Point2(0.0, 0.0)); - c.insert(PoseKey(2), Point2(1.5, 0.0)); - c.insert(PointKey(1), Point2(0.0, -1.0)); + c.insert(kx(1), Point2(0.0, 0.0)); + c.insert(kx(2), Point2(1.5, 0.0)); + c.insert(kl(1), Point2(0.0, -1.0)); return c; } @@ -107,9 +104,9 @@ namespace example { /* ************************************************************************* */ boost::shared_ptr sharedNoisyValues() { boost::shared_ptr c(new Values); - c->insert(PoseKey(1), Point2(0.1, 0.1)); - c->insert(PoseKey(2), Point2(1.4, 0.2)); - c->insert(PointKey(1), Point2(0.1, -1.1)); + c->insert(kx(1), Point2(0.1, 0.1)); + c->insert(kx(2), Point2(1.4, 0.2)); + c->insert(kl(1), Point2(0.1, -1.1)); return c; } @@ -223,7 +220,7 @@ namespace example { Vector z = Vector_(2, 1.0, 0.0); double sigma = 0.1; boost::shared_ptr factor( - new smallOptimize::UnaryFactor(z, noiseModel::Isotropic::Sigma(2,sigma), PoseKey(1))); + new smallOptimize::UnaryFactor(z, noiseModel::Isotropic::Sigma(2,sigma), kx(1))); fg->push_back(factor); return fg; } @@ -241,23 +238,23 @@ namespace example { // prior on x1 Point2 x1(1.0, 0.0); - shared prior(new simulated2D::Prior(x1, sigma1_0, PoseKey(1))); + shared prior(new simulated2D::Prior(x1, sigma1_0, kx(1))); nlfg.push_back(prior); - poses.insert(simulated2D::PoseKey(1), x1); + poses.insert(kx(1), x1); for (int t = 2; t <= T; t++) { // odometry between x_t and x_{t-1} Point2 odo(1.0, 0.0); - shared odometry(new simulated2D::Odometry(odo, sigma1_0, PoseKey(t - 1), PoseKey(t))); + shared odometry(new simulated2D::Odometry(odo, sigma1_0, kx(t - 1), kx(t))); nlfg.push_back(odometry); // measurement on x_t is like perfect GPS Point2 xt(t, 0); - shared measurement(new simulated2D::Prior(xt, sigma1_0, PoseKey(t))); + shared measurement(new simulated2D::Prior(xt, sigma1_0, kx(t))); nlfg.push_back(measurement); // initial estimate - poses.insert(PoseKey(t), xt); + poses.insert(kx(t), xt); } return make_pair(nlfg, poses); @@ -418,7 +415,7 @@ namespace example { /* ************************************************************************* */ // Create key for simulated planar graph Symbol key(int x, int y) { - return PoseKey(1000*x+y); + return kx(1000*x+y); } /* ************************************************************************* */ diff --git a/gtsam/slam/tests/testAntiFactor.cpp b/gtsam/slam/tests/testAntiFactor.cpp index 183b0c600..b73118352 100644 --- a/gtsam/slam/tests/testAntiFactor.cpp +++ b/gtsam/slam/tests/testAntiFactor.cpp @@ -27,8 +27,6 @@ using namespace std; using namespace gtsam; -using pose3SLAM::PoseKey; - /* ************************************************************************* */ TEST( AntiFactor, NegativeHessian) { @@ -42,17 +40,17 @@ TEST( AntiFactor, NegativeHessian) // Create a configuration corresponding to the ground truth boost::shared_ptr values(new Values()); - values->insert(PoseKey(1), pose1); - values->insert(PoseKey(2), pose2); + values->insert(1, pose1); + values->insert(2, pose2); // Define an elimination ordering Ordering::shared_ptr ordering(new Ordering()); - ordering->insert(PoseKey(1), 0); - ordering->insert(PoseKey(2), 1); + ordering->insert(1, 0); + ordering->insert(2, 1); // Create a "standard" factor - BetweenFactor::shared_ptr originalFactor(new BetweenFactor(PoseKey(1), PoseKey(2), z, sigma)); + BetweenFactor::shared_ptr originalFactor(new BetweenFactor(1, 2, z, sigma)); // Linearize it into a Jacobian Factor GaussianFactor::shared_ptr originalJacobian = originalFactor->linearize(*values, *ordering); @@ -103,8 +101,8 @@ TEST( AntiFactor, EquivalentBayesNet) // Create a configuration corresponding to the ground truth boost::shared_ptr values(new Values()); - values->insert(PoseKey(1), pose1); - values->insert(PoseKey(2), pose2); + values->insert(1, pose1); + values->insert(2, pose2); // Define an elimination ordering Ordering::shared_ptr ordering = graph->orderingCOLAMD(*values); @@ -117,7 +115,7 @@ TEST( AntiFactor, EquivalentBayesNet) VectorValues expectedDeltas = optimize(*expectedBayesNet); // Add an additional factor between Pose1 and Pose2 - pose3SLAM::Constraint::shared_ptr f1(new pose3SLAM::Constraint(PoseKey(1), PoseKey(2), z, sigma)); + pose3SLAM::Constraint::shared_ptr f1(new pose3SLAM::Constraint(1, 2, z, sigma)); graph->push_back(f1); // Add the corresponding AntiFactor between Pose1 and Pose2 diff --git a/gtsam/slam/tests/testPlanarSLAM.cpp b/gtsam/slam/tests/testPlanarSLAM.cpp index b32bf9a9c..8859f7a08 100644 --- a/gtsam/slam/tests/testPlanarSLAM.cpp +++ b/gtsam/slam/tests/testPlanarSLAM.cpp @@ -28,6 +28,7 @@ using namespace planarSLAM; // some shared test values static Pose2 x1, x2(1, 1, 0), x3(1, 1, M_PI_4); static Point2 l1(1, 0), l2(1, 1), l3(2, 2), l4(1, 3); +static Symbol i2('x',2), i3('x',3), j3('l',3); SharedNoiseModel sigma(noiseModel::Isotropic::Sigma(1,0.1)), @@ -37,7 +38,7 @@ SharedNoiseModel /* ************************************************************************* */ TEST( planarSLAM, PriorFactor_equals ) { - planarSLAM::Prior factor1(PoseKey(2), x1, I3), factor2(PoseKey(2), x2, I3); + planarSLAM::Prior factor1(i2, x1, I3), factor2(i2, x2, I3); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -48,12 +49,12 @@ TEST( planarSLAM, BearingFactor ) { // Create factor Rot2 z = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 - planarSLAM::Bearing factor(PoseKey(2), PointKey(3), z, sigma); + planarSLAM::Bearing factor(i2, j3, z, sigma); // create config planarSLAM::Values c; - c.insert(PoseKey(2), x2); - c.insert(PointKey(3), l3); + c.insert(i2, x2); + c.insert(j3, l3); // Check error Vector actual = factor.unwhitenedError(c); @@ -64,8 +65,8 @@ TEST( planarSLAM, BearingFactor ) TEST( planarSLAM, BearingFactor_equals ) { planarSLAM::Bearing - factor1(PoseKey(2), PointKey(3), Rot2::fromAngle(0.1), sigma), - factor2(PoseKey(2), PointKey(3), Rot2::fromAngle(2.3), sigma); + factor1(i2, j3, Rot2::fromAngle(0.1), sigma), + factor2(i2, j3, Rot2::fromAngle(2.3), sigma); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -76,12 +77,12 @@ TEST( planarSLAM, RangeFactor ) { // Create factor double z(sqrt(2) - 0.22); // h(x) - z = 0.22 - planarSLAM::Range factor(PoseKey(2), PointKey(3), z, sigma); + planarSLAM::Range factor(i2, j3, z, sigma); // create config planarSLAM::Values c; - c.insert(PoseKey(2), x2); - c.insert(PointKey(3), l3); + c.insert(i2, x2); + c.insert(j3, l3); // Check error Vector actual = factor.unwhitenedError(c); @@ -91,7 +92,7 @@ TEST( planarSLAM, RangeFactor ) /* ************************************************************************* */ TEST( planarSLAM, RangeFactor_equals ) { - planarSLAM::Range factor1(PoseKey(2), PointKey(3), 1.2, sigma), factor2(PoseKey(2), PointKey(3), 7.2, sigma); + planarSLAM::Range factor1(i2, j3, 1.2, sigma), factor2(i2, j3, 7.2, sigma); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -103,12 +104,12 @@ TEST( planarSLAM, BearingRangeFactor ) // Create factor Rot2 r = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 double b(sqrt(2) - 0.22); // h(x) - z = 0.22 - planarSLAM::BearingRange factor(PoseKey(2), PointKey(3), r, b, sigma2); + planarSLAM::BearingRange factor(i2, j3, r, b, sigma2); // create config planarSLAM::Values c; - c.insert(PoseKey(2), x2); - c.insert(PointKey(3), l3); + c.insert(i2, x2); + c.insert(j3, l3); // Check error Vector actual = factor.unwhitenedError(c); @@ -119,8 +120,8 @@ TEST( planarSLAM, BearingRangeFactor ) TEST( planarSLAM, BearingRangeFactor_equals ) { planarSLAM::BearingRange - factor1(PoseKey(2), PointKey(3), Rot2::fromAngle(0.1), 7.3, sigma2), - factor2(PoseKey(2), PointKey(3), Rot2::fromAngle(3), 2.0, sigma2); + factor1(i2, j3, Rot2::fromAngle(0.1), 7.3, sigma2), + factor2(i2, j3, Rot2::fromAngle(3), 2.0, sigma2); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -130,13 +131,13 @@ TEST( planarSLAM, BearingRangeFactor_equals ) TEST( planarSLAM, BearingRangeFactor_poses ) { typedef BearingRangeFactor PoseBearingRange; - PoseBearingRange actual(PoseKey(2), PoseKey(3), Rot2::fromDegrees(60.0), 12.3, sigma2); + PoseBearingRange actual(2, 3, Rot2::fromDegrees(60.0), 12.3, sigma2); } /* ************************************************************************* */ TEST( planarSLAM, PoseConstraint_equals ) { - planarSLAM::Constraint factor1(PoseKey(2), x2), factor2(PoseKey(2), x3); + planarSLAM::Constraint factor1(i2, x2), factor2(i2, x3); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -147,26 +148,26 @@ TEST( planarSLAM, constructor ) { // create config planarSLAM::Values c; - c.insert(PoseKey(2), x2); - c.insert(PoseKey(3), x3); - c.insert(PointKey(3), l3); + c.insert(i2, x2); + c.insert(i3, x3); + c.insert(j3, l3); // create graph planarSLAM::Graph G; // Add pose constraint - G.addPoseConstraint(2, x2); // make it feasible :-) + G.addPoseConstraint(i2, x2); // make it feasible :-) // Add odometry - G.addOdometry(2, 3, Pose2(0, 0, M_PI_4), I3); + G.addOdometry(i2, i3, Pose2(0, 0, M_PI_4), I3); // Create bearing factor Rot2 z1 = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 - G.addBearing(2, 3, z1, sigma); + G.addBearing(i2, j3, z1, sigma); // Create range factor double z2(sqrt(2) - 0.22); // h(x) - z = 0.22 - G.addRange(2, 3, z2, sigma); + G.addRange(i2, j3, z2, sigma); Vector expected0 = Vector_(3, 0.0, 0.0, 0.0); Vector expected1 = Vector_(3, 0.0, 0.0, 0.0); diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index a2d99ca88..580d40e8a 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -32,7 +32,6 @@ using namespace boost::assign; using namespace std; typedef pose2SLAM::Odometry Pose2Factor; -using pose2SLAM::PoseKey; // common measurement covariance static double sx=0.5, sy=0.5,st=0.1; @@ -44,21 +43,19 @@ static Matrix cov(Matrix_(3, 3, static noiseModel::Gaussian::shared_ptr covariance(noiseModel::Gaussian::Covariance(cov)); //static noiseModel::Gaussian::shared_ptr I3(noiseModel::Unit::Create(3)); -const Key kx0 = Symbol('x',0), kx1 = Symbol('x',1), kx2 = Symbol('x',2), kx3 = Symbol('x',3), kx4 = Symbol('x',4), kx5 = Symbol('x',5), kl1 = Symbol('l',1); - /* ************************************************************************* */ // Test constraint, small displacement Vector f1(const Pose2& pose1, const Pose2& pose2) { Pose2 z(2.1130913087, 0.468461064817, 0.436332312999); - Pose2Factor constraint(PoseKey(1), PoseKey(2), z, covariance); + Pose2Factor constraint(1, 2, z, covariance); return constraint.evaluateError(pose1, pose2); } -TEST( Pose2SLAM, constraint1 ) +TEST_UNSAFE( Pose2SLAM, constraint1 ) { // create a factor between unknown poses p1 and p2 Pose2 pose1, pose2(2.1130913087, 0.468461064817, 0.436332312999); - Pose2Factor constraint(PoseKey(1), PoseKey(2), pose2, covariance); + Pose2Factor constraint(1, 2, pose2, covariance); Matrix H1, H2; Vector actual = constraint.evaluateError(pose1, pose2, H1, H2); @@ -73,15 +70,15 @@ TEST( Pose2SLAM, constraint1 ) // Test constraint, large displacement Vector f2(const Pose2& pose1, const Pose2& pose2) { Pose2 z(2,2,M_PI_2); - Pose2Factor constraint(PoseKey(1), PoseKey(2), z, covariance); + Pose2Factor constraint(1, 2, z, covariance); return constraint.evaluateError(pose1, pose2); } -TEST( Pose2SLAM, constraint2 ) +TEST_UNSAFE( Pose2SLAM, constraint2 ) { // create a factor between unknown poses p1 and p2 Pose2 pose1, pose2(2,2,M_PI_2); - Pose2Factor constraint(PoseKey(1), PoseKey(2), pose2, covariance); + Pose2Factor constraint(1, 2, pose2, covariance); Matrix H1, H2; Vector actual = constraint.evaluateError(pose1, pose2, H1, H2); @@ -93,7 +90,7 @@ TEST( Pose2SLAM, constraint2 ) } /* ************************************************************************* */ -TEST( Pose2SLAM, constructor ) +TEST_UNSAFE( Pose2SLAM, constructor ) { // create a factor between unknown poses p1 and p2 Pose2 measured(2,2,M_PI_2); @@ -107,11 +104,11 @@ TEST( Pose2SLAM, constructor ) } /* ************************************************************************* */ -TEST( Pose2SLAM, linearization ) +TEST_UNSAFE( Pose2SLAM, linearization ) { // create a factor between unknown poses p1 and p2 Pose2 measured(2,2,M_PI_2); - Pose2Factor constraint(PoseKey(1), PoseKey(2), measured, covariance); + Pose2Factor constraint(1, 2, measured, covariance); pose2SLAM::Graph graph; graph.addOdometry(1,2,measured, covariance); @@ -119,8 +116,8 @@ TEST( Pose2SLAM, linearization ) Pose2 p1(1.1,2,M_PI_2); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) Pose2 p2(-1,4.1,M_PI); // robot at (-1,4) looking at negative (ground truth is at 4.1,2) pose2SLAM::Values config; - config.insert(pose2SLAM::PoseKey(1),p1); - config.insert(pose2SLAM::PoseKey(2),p2); + config.insert(1,p1); + config.insert(2,p2); // Linearize Ordering ordering(*config.orderingArbitrary()); boost::shared_ptr > lfg_linearized = graph.linearize(config, ordering); @@ -140,13 +137,13 @@ TEST( Pose2SLAM, linearization ) Vector b = Vector_(3,-0.1/sx,0.1/sy,0.0); SharedDiagonal probModel1 = noiseModel::Unit::Create(3); - lfg_expected.push_back(JacobianFactor::shared_ptr(new JacobianFactor(ordering[kx1], A1, ordering[kx2], A2, b, probModel1))); + lfg_expected.push_back(JacobianFactor::shared_ptr(new JacobianFactor(ordering[1], A1, ordering[2], A2, b, probModel1))); CHECK(assert_equal(lfg_expected, *lfg_linearized)); } /* ************************************************************************* */ -TEST(Pose2SLAM, optimize) { +TEST_UNSAFE(Pose2SLAM, optimize) { // create a Pose graph with one equality constraint and one measurement pose2SLAM::Graph fg; @@ -155,12 +152,12 @@ TEST(Pose2SLAM, optimize) { // Create initial config Values initial; - initial.insert(pose2SLAM::PoseKey(0), Pose2(0,0,0)); - initial.insert(pose2SLAM::PoseKey(1), Pose2(0,0,0)); + initial.insert(0, Pose2(0,0,0)); + initial.insert(1, Pose2(0,0,0)); // Choose an ordering and optimize Ordering ordering; - ordering += kx0, kx1; + ordering += 0, 1; LevenbergMarquardtParams params; params.relativeErrorTol = 1e-15; @@ -169,23 +166,23 @@ TEST(Pose2SLAM, optimize) { // Check with expected config Values expected; - expected.insert(pose2SLAM::PoseKey(0), Pose2(0,0,0)); - expected.insert(pose2SLAM::PoseKey(1), Pose2(1,2,M_PI_2)); + expected.insert(0, Pose2(0,0,0)); + expected.insert(1, Pose2(1,2,M_PI_2)); CHECK(assert_equal(expected, actual)); // Check marginals Marginals marginals = fg.marginals(actual); // Matrix expectedP0 = Infinity, as we have a pose constraint !? - // Matrix actualP0 = marginals.marginalCovariance(pose2SLAM::PoseKey(0)); + // Matrix actualP0 = marginals.marginalCovariance(0); // EQUALITY(expectedP0, actualP0); Matrix expectedP1 = cov; // the second pose really should have just the noise covariance - Matrix actualP1 = marginals.marginalCovariance(pose2SLAM::PoseKey(1)); + Matrix actualP1 = marginals.marginalCovariance(1); EQUALITY(expectedP1, actualP1); } /* ************************************************************************* */ -// test optimization with 3 poses -TEST(Pose2SLAM, optimizeThreePoses) { +// test optimization with 3 poses, note we use plain Keys here, not symbols +TEST_UNSAFE(Pose2SLAM, optimizeThreePoses) { // Create a hexagon of poses pose2SLAM::Values hexagon = pose2SLAM::circle(3,1.0); @@ -207,7 +204,7 @@ TEST(Pose2SLAM, optimizeThreePoses) { // Choose an ordering Ordering ordering; - ordering += kx0,kx1,kx2; + ordering += 0,1,2; // optimize LevenbergMarquardtParams params; @@ -231,12 +228,12 @@ TEST_UNSAFE(Pose2SLAM, optimizeCircle) { pose2SLAM::Graph fg; fg.addPoseConstraint(0, p0); Pose2 delta = p0.between(p1); - fg.addOdometry(0, 1, delta, covariance); + fg.addOdometry(0,1, delta, covariance); fg.addOdometry(1,2, delta, covariance); fg.addOdometry(2,3, delta, covariance); fg.addOdometry(3,4, delta, covariance); fg.addOdometry(4,5, delta, covariance); - fg.addOdometry(5, 0, delta, covariance); + fg.addOdometry(5,0, delta, covariance); // Create initial config pose2SLAM::Values initial; @@ -249,7 +246,7 @@ TEST_UNSAFE(Pose2SLAM, optimizeCircle) { // Choose an ordering Ordering ordering; - ordering += kx0,kx1,kx2,kx3,kx4,kx5; + ordering += 0,1,2,3,4,5; // optimize LevenbergMarquardtParams params; @@ -261,7 +258,7 @@ TEST_UNSAFE(Pose2SLAM, optimizeCircle) { CHECK(assert_equal((const Values&)hexagon, actual)); // Check loop closure - CHECK(assert_equal(delta, actual.at(PoseKey(5)).between(actual.at(PoseKey(0))))); + CHECK(assert_equal(delta, actual.at(5).between(actual.at(0)))); // Pose2SLAMOptimizer myOptimizer("3"); @@ -299,7 +296,7 @@ TEST_UNSAFE(Pose2SLAM, optimizeCircle) { } /* ************************************************************************* */ -TEST(Pose2SLAM, optimize2) { +TEST_UNSAFE(Pose2SLAM, optimize2) { // Pose2SLAMOptimizer myOptimizer("100"); // Matrix A1 = myOptimizer.a1(); // Matrix A2 = myOptimizer.a2(); @@ -317,7 +314,7 @@ TEST(Pose2SLAM, optimize2) { } ///* ************************************************************************* */ -// SL-NEEDED? TEST(Pose2SLAM, findMinimumSpanningTree) { +// SL-NEEDED? TEST_UNSAFE(Pose2SLAM, findMinimumSpanningTree) { // pose2SLAM::Graph G, T, C; // G.addConstraint(1, 2, Pose2(0.,0.,0.), I3); // G.addConstraint(1, 3, Pose2(0.,0.,0.), I3); @@ -331,7 +328,7 @@ TEST(Pose2SLAM, optimize2) { //} // ///* ************************************************************************* */ -// SL-NEEDED? TEST(Pose2SLAM, split) { +// SL-NEEDED? TEST_UNSAFE(Pose2SLAM, split) { // pose2SLAM::Graph G, T, C; // G.addConstraint(1, 2, Pose2(0.,0.,0.), I3); // G.addConstraint(1, 3, Pose2(0.,0.,0.), I3); @@ -350,37 +347,37 @@ TEST(Pose2SLAM, optimize2) { using namespace pose2SLAM; /* ************************************************************************* */ -TEST(Pose2Values, pose2Circle ) +TEST_UNSAFE(Pose2Values, pose2Circle ) { // expected is 4 poses tangent to circle with radius 1m pose2SLAM::Values expected; - expected.insert(pose2SLAM::PoseKey(0), Pose2( 1, 0, M_PI_2)); - expected.insert(pose2SLAM::PoseKey(1), Pose2( 0, 1, - M_PI )); - expected.insert(pose2SLAM::PoseKey(2), Pose2(-1, 0, - M_PI_2)); - expected.insert(pose2SLAM::PoseKey(3), Pose2( 0, -1, 0 )); + expected.insert(0, Pose2( 1, 0, M_PI_2)); + expected.insert(1, Pose2( 0, 1, - M_PI )); + expected.insert(2, Pose2(-1, 0, - M_PI_2)); + expected.insert(3, Pose2( 0, -1, 0 )); pose2SLAM::Values actual = pose2SLAM::circle(4,1.0); CHECK(assert_equal(expected,actual)); } /* ************************************************************************* */ -TEST(Pose2SLAM, expmap ) +TEST_UNSAFE(Pose2SLAM, expmap ) { // expected is circle shifted to right pose2SLAM::Values expected; - expected.insert(pose2SLAM::PoseKey(0), Pose2( 1.1, 0, M_PI_2)); - expected.insert(pose2SLAM::PoseKey(1), Pose2( 0.1, 1, - M_PI )); - expected.insert(pose2SLAM::PoseKey(2), Pose2(-0.9, 0, - M_PI_2)); - expected.insert(pose2SLAM::PoseKey(3), Pose2( 0.1, -1, 0 )); + expected.insert(0, Pose2( 1.1, 0, M_PI_2)); + expected.insert(1, Pose2( 0.1, 1, - M_PI )); + expected.insert(2, Pose2(-0.9, 0, - M_PI_2)); + expected.insert(3, Pose2( 0.1, -1, 0 )); // Note expmap coordinates are in local coordinates, so shifting to right requires thought !!! pose2SLAM::Values circle(pose2SLAM::circle(4,1.0)); Ordering ordering(*circle.orderingArbitrary()); VectorValues delta(circle.dims(ordering)); - delta[ordering[pose2SLAM::PoseKey(0)]] = Vector_(3, 0.0,-0.1,0.0); - delta[ordering[pose2SLAM::PoseKey(1)]] = Vector_(3, -0.1,0.0,0.0); - delta[ordering[pose2SLAM::PoseKey(2)]] = Vector_(3, 0.0,0.1,0.0); - delta[ordering[pose2SLAM::PoseKey(3)]] = Vector_(3, 0.1,0.0,0.0); + delta[ordering[0]] = Vector_(3, 0.0,-0.1,0.0); + delta[ordering[1]] = Vector_(3, -0.1,0.0,0.0); + delta[ordering[2]] = Vector_(3, 0.0,0.1,0.0); + delta[ordering[3]] = Vector_(3, 0.1,0.0,0.0); pose2SLAM::Values actual = circle.retract(delta, ordering); CHECK(assert_equal(expected,actual)); } @@ -390,15 +387,15 @@ static SharedNoiseModel sigmas = sharedSigmas(Vector_(3,sx,sy,st)); /* ************************************************************************* */ // Very simple test establishing Ax-b \approx z-h(x) -TEST( Pose2Prior, error ) +TEST_UNSAFE( Pose2Prior, error ) { // Choose a linearization point Pose2 p1(1, 0, 0); // robot at (1,0) pose2SLAM::Values x0; - x0.insert(PoseKey(1), p1); + x0.insert(1, p1); // Create factor - pose2SLAM::Prior factor(PoseKey(1), p1, sigmas); + pose2SLAM::Prior factor(1, p1, sigmas); // Actual linearization Ordering ordering(*x0.orderingArbitrary()); @@ -407,14 +404,14 @@ TEST( Pose2Prior, error ) // Check error at x0, i.e. delta = zero ! VectorValues delta(VectorValues::Zero(x0.dims(ordering))); - delta[ordering[kx1]] = zero(3); + delta[ordering[1]] = zero(3); Vector error_at_zero = Vector_(3,0.0,0.0,0.0); CHECK(assert_equal(error_at_zero,factor.whitenedError(x0))); CHECK(assert_equal(-error_at_zero,linear->error_vector(delta))); // Check error after increasing p2 VectorValues addition(VectorValues::Zero(x0.dims(ordering))); - addition[ordering[kx1]] = Vector_(3, 0.1, 0.0, 0.0); + addition[ordering[1]] = Vector_(3, 0.1, 0.0, 0.0); VectorValues plus = delta + addition; pose2SLAM::Values x1 = x0.retract(plus, ordering); Vector error_at_plus = Vector_(3,0.1/sx,0.0,0.0); // h(x)-z = 0.1 ! @@ -425,7 +422,7 @@ TEST( Pose2Prior, error ) /* ************************************************************************* */ // common Pose2Prior for tests below static gtsam::Pose2 priorVal(2,2,M_PI_2); -static pose2SLAM::Prior priorFactor(PoseKey(1), priorVal, sigmas); +static pose2SLAM::Prior priorFactor(1, priorVal, sigmas); /* ************************************************************************* */ // The error |A*dx-b| approximates (h(x0+dx)-z) = -error_vector @@ -435,7 +432,7 @@ LieVector hprior(const Pose2& p1) { } /* ************************************************************************* */ -TEST( Pose2Prior, linearize ) +TEST_UNSAFE( Pose2Prior, linearize ) { // Choose a linearization point at ground truth pose2SLAM::Values x0; @@ -448,12 +445,12 @@ TEST( Pose2Prior, linearize ) // Test with numerical derivative Matrix numericalH = numericalDerivative11(hprior, priorVal); - CHECK(assert_equal(numericalH,actual->getA(actual->find(ordering[kx1])))); + CHECK(assert_equal(numericalH,actual->getA(actual->find(ordering[1])))); } /* ************************************************************************* */ // Very simple test establishing Ax-b \approx z-h(x) -TEST( Pose2Factor, error ) +TEST_UNSAFE( Pose2Factor, error ) { // Choose a linearization point Pose2 p1; // robot at origin @@ -464,7 +461,7 @@ TEST( Pose2Factor, error ) // Create factor Pose2 z = p1.between(p2); - Pose2Factor factor(PoseKey(1), PoseKey(2), z, covariance); + Pose2Factor factor(1, 2, z, covariance); // Actual linearization Ordering ordering(*x0.orderingArbitrary()); @@ -473,15 +470,15 @@ TEST( Pose2Factor, error ) // Check error at x0, i.e. delta = zero ! VectorValues delta(x0.dims(ordering)); - delta[ordering[kx1]] = zero(3); - delta[ordering[kx2]] = zero(3); + delta[ordering[1]] = zero(3); + delta[ordering[2]] = zero(3); Vector error_at_zero = Vector_(3,0.0,0.0,0.0); CHECK(assert_equal(error_at_zero,factor.unwhitenedError(x0))); CHECK(assert_equal(-error_at_zero, linear->error_vector(delta))); // Check error after increasing p2 VectorValues plus = delta; - plus[ordering[kx2]] = Vector_(3, 0.1, 0.0, 0.0); + plus[ordering[2]] = Vector_(3, 0.1, 0.0, 0.0); pose2SLAM::Values x1 = x0.retract(plus, ordering); Vector error_at_plus = Vector_(3,0.1/sx,0.0,0.0); // h(x)-z = 0.1 ! CHECK(assert_equal(error_at_plus,factor.whitenedError(x1))); @@ -491,17 +488,17 @@ TEST( Pose2Factor, error ) /* ************************************************************************* */ // common Pose2Factor for tests below static Pose2 measured(2,2,M_PI_2); -static Pose2Factor factor(PoseKey(1),PoseKey(2),measured, covariance); +static Pose2Factor factor(1,2,measured, covariance); /* ************************************************************************* */ -TEST( Pose2Factor, rhs ) +TEST_UNSAFE( Pose2Factor, rhs ) { // Choose a linearization point Pose2 p1(1.1,2,M_PI_2); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) Pose2 p2(-1,4.1,M_PI); // robot at (-1,4.1) looking at negative (ground truth is at -1,4) pose2SLAM::Values x0; - x0.insert(pose2SLAM::PoseKey(1),p1); - x0.insert(pose2SLAM::PoseKey(2),p2); + x0.insert(1,p1); + x0.insert(2,p2); // Actual linearization Ordering ordering(*x0.orderingArbitrary()); @@ -524,14 +521,14 @@ LieVector h(const Pose2& p1,const Pose2& p2) { } /* ************************************************************************* */ -TEST( Pose2Factor, linearize ) +TEST_UNSAFE( Pose2Factor, linearize ) { // Choose a linearization point at ground truth Pose2 p1(1,2,M_PI_2); Pose2 p2(-1,4,M_PI); pose2SLAM::Values x0; - x0.insert(pose2SLAM::PoseKey(1),p1); - x0.insert(pose2SLAM::PoseKey(2),p2); + x0.insert(1,p1); + x0.insert(2,p2); // expected linearization Matrix expectedH1 = covariance->Whiten(Matrix_(3,3, @@ -549,7 +546,7 @@ TEST( Pose2Factor, linearize ) // expected linear factor Ordering ordering(*x0.orderingArbitrary()); SharedDiagonal probModel1 = noiseModel::Unit::Create(3); - JacobianFactor expected(ordering[kx1], expectedH1, ordering[kx2], expectedH2, expected_b, probModel1); + JacobianFactor expected(ordering[1], expectedH1, ordering[2], expectedH2, expected_b, probModel1); // Actual linearization boost::shared_ptr actual = diff --git a/gtsam/slam/tests/testPose3SLAM.cpp b/gtsam/slam/tests/testPose3SLAM.cpp index d4ab3afdb..4ebe7d27f 100644 --- a/gtsam/slam/tests/testPose3SLAM.cpp +++ b/gtsam/slam/tests/testPose3SLAM.cpp @@ -10,39 +10,33 @@ * -------------------------------------------------------------------------- */ /** - * @file testPose3Graph.cpp - * @author Frank Dellaert, Viorela Ila + * @file testpose3SLAM.cpp + * @author Frank Dellaert + * @author Viorela Ila **/ -#include +#include +#include +#include + +#include -#include #include #include #include using namespace boost; using namespace boost::assign; -#include - -// TODO: DANGEROUS, create shared pointers -#define GTSAM_MAGIC_GAUSSIAN 6 - -#include -#include -#include +#include using namespace std; using namespace gtsam; -using namespace pose3SLAM; // common measurement covariance -static Matrix covariance = eye(6); +static noiseModel::Gaussian::shared_ptr covariance(noiseModel::Unit::Create(6)); const double tol=1e-5; -const Key kx0 = Symbol('x',0), kx1 = Symbol('x',1), kx2 = Symbol('x',2), kx3 = Symbol('x',3), kx4 = Symbol('x',4), kx5 = Symbol('x',5); - /* ************************************************************************* */ // test optimization with 6 poses arranged in a hexagon and a loop closure TEST(Pose3Graph, optimizeCircle) { @@ -50,7 +44,7 @@ TEST(Pose3Graph, optimizeCircle) { // Create a hexagon of poses double radius = 10; Values hexagon = pose3SLAM::circle(6,radius); - Pose3 gT0 = hexagon.at(PoseKey(0)), gT1 = hexagon.at(PoseKey(1)); + Pose3 gT0 = hexagon.at(0), gT1 = hexagon.at(1); // create a Pose graph with one equality constraint and one measurement pose3SLAM::Graph fg; @@ -67,16 +61,16 @@ TEST(Pose3Graph, optimizeCircle) { // Create initial config Values initial; - initial.insert(PoseKey(0), gT0); - initial.insert(PoseKey(1), hexagon.at(PoseKey(1)).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); - initial.insert(PoseKey(2), hexagon.at(PoseKey(2)).retract(Vector_(6, 0.1,-0.1, 0.1, 0.1,-0.1, 0.1))); - initial.insert(PoseKey(3), hexagon.at(PoseKey(3)).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); - initial.insert(PoseKey(4), hexagon.at(PoseKey(4)).retract(Vector_(6, 0.1,-0.1, 0.1, 0.1,-0.1, 0.1))); - initial.insert(PoseKey(5), hexagon.at(PoseKey(5)).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); + initial.insert(0, gT0); + initial.insert(1, hexagon.at(1).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); + initial.insert(2, hexagon.at(2).retract(Vector_(6, 0.1,-0.1, 0.1, 0.1,-0.1, 0.1))); + initial.insert(3, hexagon.at(3).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); + initial.insert(4, hexagon.at(4).retract(Vector_(6, 0.1,-0.1, 0.1, 0.1,-0.1, 0.1))); + initial.insert(5, hexagon.at(5).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); // Choose an ordering and optimize Ordering ordering; - ordering += kx0,kx1,kx2,kx3,kx4,kx5; + ordering += 0,1,2,3,4,5; Values actual = LevenbergMarquardtOptimizer(fg, initial, ordering).optimize(); @@ -84,7 +78,7 @@ TEST(Pose3Graph, optimizeCircle) { CHECK(assert_equal(hexagon, actual,1e-4)); // Check loop closure - CHECK(assert_equal(_0T1, actual.at(PoseKey(5)).between(actual.at(PoseKey(0))),1e-5)); + CHECK(assert_equal(_0T1, actual.at(5).between(actual.at(0)),1e-5)); } /* ************************************************************************* */ @@ -94,11 +88,10 @@ TEST(Pose3Graph, partial_prior_height) { // reference: Pose3 Expmap - (0-2: Rot3) (3-5: Point3) // height prior - single element interface - Symbol key = PoseKey(1); double exp_height = 5.0; SharedDiagonal model = noiseModel::Unit::Create(1); Pose3 init(Rot3(), Point3(1.0, 2.0, 3.0)), expected(Rot3(), Point3(1.0, 2.0, exp_height)); - Partial height(key, 5, exp_height, model); + Partial height(1, 5, exp_height, model); Matrix actA; EXPECT(assert_equal(Vector_(1,-2.0), height.evaluateError(init, actA), tol)); Matrix expA = Matrix_(1, 6, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); @@ -108,13 +101,13 @@ TEST(Pose3Graph, partial_prior_height) { graph.add(height); Values values; - values.insert(key, init); + values.insert(1, init); // linearization EXPECT_DOUBLES_EQUAL(2.0, height.error(values), tol); Values actual = LevenbergMarquardtOptimizer(graph, values).optimize(); - EXPECT(assert_equal(expected, actual.at(key), tol)); + EXPECT(assert_equal(expected, actual.at(1), tol)); EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol); } @@ -128,12 +121,12 @@ TEST( Pose3Factor, error ) // Create factor SharedNoiseModel I6(noiseModel::Unit::Create(6)); - pose3SLAM::Constraint factor(PoseKey(1), PoseKey(2), z, I6); + pose3SLAM::Constraint factor(1, 2, z, I6); // Create config Values x; - x.insert(PoseKey(1),t1); - x.insert(PoseKey(2),t2); + x.insert(1,t1); + x.insert(2,t2); // Get error h(x)-z -> localCoordinates(z,h(x)) = localCoordinates(z,between(t1,t2)) Vector actual = factor.unwhitenedError(x); @@ -146,12 +139,11 @@ TEST(Pose3Graph, partial_prior_xy) { typedef PartialPriorFactor Partial; // XY prior - full mask interface - Symbol key = PoseKey(1); Vector exp_xy = Vector_(2, 3.0, 4.0); SharedDiagonal model = noiseModel::Unit::Create(2); Pose3 init(Rot3(), Point3(1.0,-2.0, 3.0)), expected(Rot3(), Point3(3.0, 4.0, 3.0)); vector mask; mask += 3, 4; - Partial priorXY(key, mask, exp_xy, model); + Partial priorXY(1, mask, exp_xy, model); Matrix actA; EXPECT(assert_equal(Vector_(2,-2.0,-6.0), priorXY.evaluateError(init, actA), tol)); Matrix expA = Matrix_(2, 6, @@ -163,10 +155,10 @@ TEST(Pose3Graph, partial_prior_xy) { graph.add(priorXY); Values values; - values.insert(key, init); + values.insert(1, init); Values actual = LevenbergMarquardtOptimizer(graph, values).optimize(); - EXPECT(assert_equal(expected, actual.at(key), tol)); + EXPECT(assert_equal(expected, actual.at(1), tol)); EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol); } @@ -182,10 +174,10 @@ TEST( Values, pose3Circle ) { // expected is 4 poses tangent to circle with radius 1m Values expected; - expected.insert(PoseKey(0), Pose3(R1, Point3( 1, 0, 0))); - expected.insert(PoseKey(1), Pose3(R2, Point3( 0, 1, 0))); - expected.insert(PoseKey(2), Pose3(R3, Point3(-1, 0, 0))); - expected.insert(PoseKey(3), Pose3(R4, Point3( 0,-1, 0))); + expected.insert(0, Pose3(R1, Point3( 1, 0, 0))); + expected.insert(1, Pose3(R2, Point3( 0, 1, 0))); + expected.insert(2, Pose3(R3, Point3(-1, 0, 0))); + expected.insert(3, Pose3(R4, Point3( 0,-1, 0))); Values actual = pose3SLAM::circle(4,1.0); CHECK(assert_equal(expected,actual)); @@ -195,10 +187,10 @@ TEST( Values, pose3Circle ) TEST( Values, expmap ) { Values expected; - expected.insert(PoseKey(0), Pose3(R1, Point3( 1.0, 0.1, 0))); - expected.insert(PoseKey(1), Pose3(R2, Point3(-0.1, 1.0, 0))); - expected.insert(PoseKey(2), Pose3(R3, Point3(-1.0,-0.1, 0))); - expected.insert(PoseKey(3), Pose3(R4, Point3( 0.1,-1.0, 0))); + expected.insert(0, Pose3(R1, Point3( 1.0, 0.1, 0))); + expected.insert(1, Pose3(R2, Point3(-0.1, 1.0, 0))); + expected.insert(2, Pose3(R3, Point3(-1.0,-0.1, 0))); + expected.insert(3, Pose3(R4, Point3( 0.1,-1.0, 0))); Ordering ordering(*expected.orderingArbitrary()); VectorValues delta(expected.dims(ordering)); diff --git a/gtsam/slam/tests/testProjectionFactor.cpp b/gtsam/slam/tests/testProjectionFactor.cpp index 8b4ecbf21..80b35f269 100644 --- a/gtsam/slam/tests/testProjectionFactor.cpp +++ b/gtsam/slam/tests/testProjectionFactor.cpp @@ -16,13 +16,11 @@ * @date Nov 2009 */ -#include - #include +#include using namespace std; using namespace gtsam; -using namespace visualSLAM; // make cube static Point3 @@ -37,23 +35,23 @@ static Cal3_S2 K(fov,w,h); static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); static shared_ptrK sK(new Cal3_S2(K)); -const Key kx1 = Symbol('x',1), kl1 = Symbol('l',1); - -// make cameras +// Convenience for named keys +Key kx(size_t i) { return Symbol('x',i); } +Key kl(size_t i) { return Symbol('l',i); } /* ************************************************************************* */ TEST( ProjectionFactor, error ) { // Create the factor with a measurement that is 3 pixels off in x Point2 z(323.,240.); - int cameraFrameNumber=1, landmarkNumber=1; + int i=1, j=1; boost::shared_ptr - factor(new visualSLAM::ProjectionFactor(z, sigma, PoseKey(cameraFrameNumber), PointKey(landmarkNumber), sK)); + factor(new visualSLAM::ProjectionFactor(z, sigma, kx(i), kl(j), sK)); // For the following values structure, the factor predicts 320,240 Values config; - Rot3 R;Point3 t1(0,0,-6); Pose3 x1(R,t1); config.insert(PoseKey(1), x1); - Point3 l1; config.insert(PointKey(1), l1); + Rot3 R;Point3 t1(0,0,-6); Pose3 x1(R,t1); config.insert(kx(1), x1); + Point3 l1; config.insert(kl(1), l1); // Point should project to Point2(320.,240.) CHECK(assert_equal(Vector_(2, -3.0, 0.0), factor->unwhitenedError(config))); @@ -61,12 +59,12 @@ TEST( ProjectionFactor, error ) DOUBLES_EQUAL(4.5,factor->error(config),1e-9); // Check linearize - Ordering ordering; ordering += kx1,kl1; + Ordering ordering; ordering += kx(1),kl(1); Matrix Ax1 = Matrix_(2, 6, 0., -554.256, 0., -92.376, 0., 0., 554.256, 0., 0., 0., -92.376, 0.); Matrix Al1 = Matrix_(2, 3, 92.376, 0., 0., 0., 92.376, 0.); Vector b = Vector_(2,3.,0.); SharedDiagonal probModel1 = noiseModel::Unit::Create(2); - JacobianFactor expected(ordering[kx1], Ax1, ordering[kl1], Al1, b, probModel1); + JacobianFactor expected(ordering[kx(1)], Ax1, ordering[kl(1)], Al1, b, probModel1); JacobianFactor::shared_ptr actual = boost::dynamic_pointer_cast(factor->linearize(config, ordering)); CHECK(assert_equal(expected,*actual,1e-3)); @@ -81,11 +79,11 @@ TEST( ProjectionFactor, error ) // expmap on a config Values expected_config; - Point3 t2(1,1,-5); Pose3 x2(R,t2); expected_config.insert(PoseKey(1), x2); - Point3 l2(1,2,3); expected_config.insert(PointKey(1), l2); + Point3 t2(1,1,-5); Pose3 x2(R,t2); expected_config.insert(kx(1), x2); + Point3 l2(1,2,3); expected_config.insert(kl(1), l2); VectorValues delta(expected_config.dims(ordering)); - delta[ordering[kx1]] = Vector_(6, 0.,0.,0., 1.,1.,1.); - delta[ordering[kl1]] = Vector_(3, 1.,2.,3.); + delta[ordering[kx(1)]] = Vector_(6, 0.,0.,0., 1.,1.,1.); + delta[ordering[kl(1)]] = Vector_(3, 1.,2.,3.); Values actual_config = config.retract(delta, ordering); CHECK(assert_equal(expected_config,actual_config,1e-9)); } @@ -95,12 +93,12 @@ TEST( ProjectionFactor, equals ) { // Create two identical factors and make sure they're equal Vector z = Vector_(2,323.,240.); - int cameraFrameNumber=1, landmarkNumber=1; + int i=1, j=1; boost::shared_ptr - factor1(new visualSLAM::ProjectionFactor(z, sigma, PoseKey(cameraFrameNumber), PointKey(landmarkNumber), sK)); + factor1(new visualSLAM::ProjectionFactor(z, sigma, kx(i), kl(j), sK)); boost::shared_ptr - factor2(new visualSLAM::ProjectionFactor(z, sigma, PoseKey(cameraFrameNumber), PointKey(landmarkNumber), sK)); + factor2(new visualSLAM::ProjectionFactor(z, sigma, kx(i), kl(j), sK)); CHECK(assert_equal(*factor1, *factor2)); } diff --git a/gtsam/slam/tests/testSerializationSLAM.cpp b/gtsam/slam/tests/testSerializationSLAM.cpp index 9cfb8bb72..4442d73fc 100644 --- a/gtsam/slam/tests/testSerializationSLAM.cpp +++ b/gtsam/slam/tests/testSerializationSLAM.cpp @@ -11,7 +11,7 @@ /** * @file testSerializationSLAM.cpp - * @brief + * @brief test serialization * @author Richard Roberts * @date Feb 7, 2012 */ @@ -109,19 +109,20 @@ BOOST_CLASS_EXPORT(gtsam::Pose2) TEST (Serialization, planar_system) { using namespace planarSLAM; planarSLAM::Values values; - values.insert(PointKey(3), Point2(1.0, 2.0)); - values.insert(PoseKey(4), Pose2(1.0, 2.0, 0.3)); + Symbol i2('x',2), i3('x',3), i4('x',4), i9('x',9), j3('l',3), j5('l',5), j9('l',9); + values.insert(j3, Point2(1.0, 2.0)); + values.insert(i4, Pose2(1.0, 2.0, 0.3)); SharedNoiseModel model1 = noiseModel::Isotropic::Sigma(1, 0.3); SharedNoiseModel model2 = noiseModel::Isotropic::Sigma(2, 0.3); SharedNoiseModel model3 = noiseModel::Isotropic::Sigma(3, 0.3); - Prior prior(PoseKey(3), Pose2(0.1,-0.3, 0.2), model1); - Bearing bearing(PoseKey(3), PointKey(5), Rot2::fromDegrees(0.5), model1); - Range range(PoseKey(2), PointKey(9), 7.0, model1); - BearingRange bearingRange(PoseKey(2), PointKey(3), Rot2::fromDegrees(0.6), 2.0, model2); - Odometry odometry(PoseKey(2), PoseKey(3), Pose2(1.0, 2.0, 0.3), model3); - Constraint constraint(PoseKey(9), Pose2(2.0,-1.0, 0.2)); + Prior prior(i3, Pose2(0.1,-0.3, 0.2), model1); + Bearing bearing(i3, j5, Rot2::fromDegrees(0.5), model1); + Range range(i2, j9, 7.0, model1); + BearingRange bearingRange(i2, j3, Rot2::fromDegrees(0.6), 2.0, model2); + Odometry odometry(i2, i3, Pose2(1.0, 2.0, 0.3), model3); + Constraint constraint(i9, Pose2(2.0,-1.0, 0.2)); Graph graph; graph.add(prior); @@ -132,8 +133,8 @@ TEST (Serialization, planar_system) { graph.add(constraint); // text - EXPECT(equalsObj(PoseKey(2))); - EXPECT(equalsObj(PointKey(3))); + EXPECT(equalsObj(i2)); + EXPECT(equalsObj(j3)); EXPECT(equalsObj(values)); EXPECT(equalsObj(prior)); EXPECT(equalsObj(bearing)); @@ -144,8 +145,8 @@ TEST (Serialization, planar_system) { EXPECT(equalsObj(graph)); // xml - EXPECT(equalsXML(PoseKey(2))); - EXPECT(equalsXML(PointKey(3))); + EXPECT(equalsXML(i2)); + EXPECT(equalsXML(j3)); EXPECT(equalsXML(values)); EXPECT(equalsXML(prior)); EXPECT(equalsXML(bearing)); @@ -189,11 +190,11 @@ TEST (Serialization, visual_system) { boost::shared_ptr K(new Cal3_S2(cal1)); Graph graph; - graph.addMeasurement(Point2(1.0, 2.0), model2, 1, 1, K); - graph.addPointConstraint(1, pt1); - graph.addPointPrior(1, pt2, model3); - graph.addPoseConstraint(1, pose1); - graph.addPosePrior(1, pose2, model6); + graph.addMeasurement(Point2(1.0, 2.0), model2, x1, l1, K); + graph.addPointConstraint(l1, pt1); + graph.addPointPrior(l1, pt2, model3); + graph.addPoseConstraint(x1, pose1); + graph.addPosePrior(x1, pose2, model6); EXPECT(equalsObj(values)); EXPECT(equalsObj(graph)); diff --git a/gtsam/slam/tests/testSimulated2D.cpp b/gtsam/slam/tests/testSimulated2D.cpp index 3513927a7..b72a8f4c0 100644 --- a/gtsam/slam/tests/testSimulated2D.cpp +++ b/gtsam/slam/tests/testSimulated2D.cpp @@ -31,8 +31,8 @@ using namespace simulated2D; TEST( simulated2D, Simulated2DValues ) { simulated2D::Values actual; - actual.insert(simulated2D::PoseKey(1),Point2(1,1)); - actual.insert(simulated2D::PointKey(2),Point2(2,2)); + actual.insert(1,Point2(1,1)); + actual.insert(2,Point2(2,2)); EXPECT(assert_equal(actual,actual,1e-9)); } diff --git a/gtsam/slam/tests/testSimulated2DOriented.cpp b/gtsam/slam/tests/testSimulated2DOriented.cpp index 64844cb2a..b3d6e8d9e 100644 --- a/gtsam/slam/tests/testSimulated2DOriented.cpp +++ b/gtsam/slam/tests/testSimulated2DOriented.cpp @@ -28,6 +28,10 @@ using namespace std; using namespace gtsam; using namespace simulated2DOriented; +// Convenience for named keys +Key kx(size_t i) { return Symbol('x',i); } +Key kl(size_t i) { return Symbol('l',i); } + /* ************************************************************************* */ TEST( simulated2DOriented, Dprior ) { @@ -55,11 +59,11 @@ TEST( simulated2DOriented, constructor ) { Pose2 measurement(0.2, 0.3, 0.1); SharedDiagonal model(Vector_(3, 1., 1., 1.)); - simulated2DOriented::Odometry factor(measurement, model, simulated2DOriented::PoseKey(1), simulated2DOriented::PoseKey(2)); + simulated2DOriented::Odometry factor(measurement, model, kx(1), kx(2)); simulated2DOriented::Values config; - config.insert(simulated2DOriented::PoseKey(1), Pose2(1., 0., 0.2)); - config.insert(simulated2DOriented::PoseKey(2), Pose2(2., 0., 0.1)); + config.insert(kx(1), Pose2(1., 0., 0.2)); + config.insert(kx(2), Pose2(2., 0., 0.1)); boost::shared_ptr lf = factor.linearize(config, *config.orderingArbitrary()); } diff --git a/gtsam/slam/tests/testStereoFactor.cpp b/gtsam/slam/tests/testStereoFactor.cpp index 25cd6e16f..ffa512d96 100644 --- a/gtsam/slam/tests/testStereoFactor.cpp +++ b/gtsam/slam/tests/testStereoFactor.cpp @@ -12,24 +12,20 @@ /** * @file testStereoFactor.cpp * @brief Unit test for StereoFactor - * single camera * @author Chris Beall */ -#include - -#include -#include +#include +#include #include #include -#include +#include +#include -#include +#include using namespace std; using namespace gtsam; -using namespace boost; -using namespace visualSLAM; Pose3 camera1(Matrix_(3,3, 1., 0., 0., @@ -45,6 +41,10 @@ StereoCamera stereoCam(Pose3(), K); Point3 p(0, 0, 5); static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); +// Convenience for named keys +Key kx(size_t i) { return Symbol('x',i); } +Key kl(size_t i) { return Symbol('l',i); } + /* ************************************************************************* */ TEST( StereoFactor, singlePoint) { @@ -52,18 +52,18 @@ TEST( StereoFactor, singlePoint) boost::shared_ptr K(new Cal3_S2Stereo(625, 625, 0, 320, 240, 0.5)); NonlinearFactorGraph graph; - graph.add(visualSLAM::PoseConstraint(PoseKey(1),camera1)); + graph.add(visualSLAM::PoseConstraint(kx(1),camera1)); StereoPoint2 z14(320,320.0-50, 240); // arguments: measurement, sigma, cam#, measurement #, K, baseline (m) - graph.add(visualSLAM::StereoFactor(z14,sigma, PoseKey(1), PointKey(1), K)); + graph.add(visualSLAM::StereoFactor(z14,sigma, kx(1), kl(1), K)); // Create a configuration corresponding to the ground truth Values values; - values.insert(PoseKey(1), camera1); // add camera at z=6.25m looking towards origin + values.insert(kx(1), camera1); // add camera at z=6.25m looking towards origin Point3 l1(0, 0, 0); - values.insert(PointKey(1), l1); // add point at origin; + values.insert(kl(1), l1); // add point at origin; GaussNewtonOptimizer optimizer(graph, values); diff --git a/gtsam/slam/tests/testVSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp similarity index 65% rename from gtsam/slam/tests/testVSLAM.cpp rename to gtsam/slam/tests/testVisualSLAM.cpp index bb7623954..27b930022 100644 --- a/gtsam/slam/tests/testVSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -10,43 +10,45 @@ * -------------------------------------------------------------------------- */ /** - * @file testGraph.cpp - * @brief Unit test for two cameras and four landmarks - * single camera + * @file testVisualSLAM.cpp + * @brief Unit test for two cameras and four landmarks, single camera * @author Chris Beall * @author Frank Dellaert * @author Viorela Ila */ +#include +#include +#include + #include #include using namespace boost; -#include -#include -#include - using namespace std; using namespace gtsam; -using namespace boost; -using namespace visualSLAM; + +/* ************************************************************************* */ static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); -/* ************************************************************************* */ -Point3 landmark1(-1.0,-1.0, 0.0); -Point3 landmark2(-1.0, 1.0, 0.0); -Point3 landmark3( 1.0, 1.0, 0.0); -Point3 landmark4( 1.0,-1.0, 0.0); +// Convenience for named keys +Key kx(size_t i) { return Symbol('x',i); } +Key kl(size_t i) { return Symbol('l',i); } -Pose3 camera1(Matrix_(3,3, +static Point3 landmark1(-1.0,-1.0, 0.0); +static Point3 landmark2(-1.0, 1.0, 0.0); +static Point3 landmark3( 1.0, 1.0, 0.0); +static Point3 landmark4( 1.0,-1.0, 0.0); + +static Pose3 camera1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,6.25)); -Pose3 camera2(Matrix_(3,3, +static Pose3 camera2(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. @@ -66,14 +68,14 @@ visualSLAM::Graph testGraph() { shared_ptrK sK(new Cal3_S2(625, 625, 0, 0, 0)); visualSLAM::Graph g; - g.addMeasurement(z11, sigma, 1, 1, sK); - g.addMeasurement(z12, sigma, 1, 2, sK); - g.addMeasurement(z13, sigma, 1, 3, sK); - g.addMeasurement(z14, sigma, 1, 4, sK); - g.addMeasurement(z21, sigma, 2, 1, sK); - g.addMeasurement(z22, sigma, 2, 2, sK); - g.addMeasurement(z23, sigma, 2, 3, sK); - g.addMeasurement(z24, sigma, 2, 4, sK); + g.addMeasurement(z11, sigma, kx(1), kl(1), sK); + g.addMeasurement(z12, sigma, kx(1), kl(2), sK); + g.addMeasurement(z13, sigma, kx(1), kl(3), sK); + g.addMeasurement(z14, sigma, kx(1), kl(4), sK); + g.addMeasurement(z21, sigma, kx(2), kl(1), sK); + g.addMeasurement(z22, sigma, kx(2), kl(2), sK); + g.addMeasurement(z23, sigma, kx(2), kl(3), sK); + g.addMeasurement(z24, sigma, kx(2), kl(4), sK); return g; } @@ -83,22 +85,22 @@ TEST( Graph, optimizeLM) // build a graph visualSLAM::Graph graph(testGraph()); // add 3 landmark constraints - graph.addPointConstraint(1, landmark1); - graph.addPointConstraint(2, landmark2); - graph.addPointConstraint(3, landmark3); + graph.addPointConstraint(kl(1), landmark1); + graph.addPointConstraint(kl(2), landmark2); + graph.addPointConstraint(kl(3), landmark3); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(PoseKey(1), camera1); - initialEstimate.insert(PoseKey(2), camera2); - initialEstimate.insert(PointKey(1), landmark1); - initialEstimate.insert(PointKey(2), landmark2); - initialEstimate.insert(PointKey(3), landmark3); - initialEstimate.insert(PointKey(4), landmark4); + initialEstimate.insert(kx(1), camera1); + initialEstimate.insert(kx(2), camera2); + initialEstimate.insert(kl(1), landmark1); + initialEstimate.insert(kl(2), landmark2); + initialEstimate.insert(kl(3), landmark3); + initialEstimate.insert(kl(4), landmark4); // Create an ordering of the variables Ordering ordering; - ordering += PointKey(1),PointKey(2),PointKey(3),PointKey(4),PoseKey(1),PoseKey(2); + ordering += kl(1),kl(2),kl(3),kl(4),kx(1),kx(2); // Create an optimizer and check its error // We expect the initial to be zero because config is the ground truth @@ -121,21 +123,21 @@ TEST( Graph, optimizeLM2) // build a graph visualSLAM::Graph graph(testGraph()); // add 2 camera constraints - graph.addPoseConstraint(1, camera1); - graph.addPoseConstraint(2, camera2); + graph.addPoseConstraint(kx(1), camera1); + graph.addPoseConstraint(kx(2), camera2); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(PoseKey(1), camera1); - initialEstimate.insert(PoseKey(2), camera2); - initialEstimate.insert(PointKey(1), landmark1); - initialEstimate.insert(PointKey(2), landmark2); - initialEstimate.insert(PointKey(3), landmark3); - initialEstimate.insert(PointKey(4), landmark4); + initialEstimate.insert(kx(1), camera1); + initialEstimate.insert(kx(2), camera2); + initialEstimate.insert(kl(1), landmark1); + initialEstimate.insert(kl(2), landmark2); + initialEstimate.insert(kl(3), landmark3); + initialEstimate.insert(kl(4), landmark4); // Create an ordering of the variables Ordering ordering; - ordering += PointKey(1),PointKey(2),PointKey(3),PointKey(4),PoseKey(1),PoseKey(2); + ordering += kl(1),kl(2),kl(3),kl(4),kx(1),kx(2); // Create an optimizer and check its error // We expect the initial to be zero because config is the ground truth @@ -158,17 +160,17 @@ TEST( Graph, CHECK_ORDERING) // build a graph visualSLAM::Graph graph = testGraph(); // add 2 camera constraints - graph.addPoseConstraint(1, camera1); - graph.addPoseConstraint(2, camera2); + graph.addPoseConstraint(kx(1), camera1); + graph.addPoseConstraint(kx(2), camera2); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(PoseKey(1), camera1); - initialEstimate.insert(PoseKey(2), camera2); - initialEstimate.insert(PointKey(1), landmark1); - initialEstimate.insert(PointKey(2), landmark2); - initialEstimate.insert(PointKey(3), landmark3); - initialEstimate.insert(PointKey(4), landmark4); + initialEstimate.insert(kx(1), camera1); + initialEstimate.insert(kx(2), camera2); + initialEstimate.insert(kl(1), landmark1); + initialEstimate.insert(kl(2), landmark2); + initialEstimate.insert(kl(3), landmark3); + initialEstimate.insert(kl(4), landmark4); // Create an optimizer and check its error // We expect the initial to be zero because config is the ground truth @@ -189,21 +191,21 @@ TEST( Values, update_with_large_delta) { // this test ensures that if the update for delta is larger than // the size of the config, it only updates existing variables Values init; - init.insert(PoseKey(1), Pose3()); - init.insert(PointKey(1), Point3(1.0, 2.0, 3.0)); + init.insert(kx(1), Pose3()); + init.insert(kl(1), Point3(1.0, 2.0, 3.0)); Values expected; - expected.insert(PoseKey(1), Pose3(Rot3(), Point3(0.1, 0.1, 0.1))); - expected.insert(PointKey(1), Point3(1.1, 2.1, 3.1)); + expected.insert(kx(1), Pose3(Rot3(), Point3(0.1, 0.1, 0.1))); + expected.insert(kl(1), Point3(1.1, 2.1, 3.1)); Ordering largeOrdering; Values largeValues = init; - largeValues.insert(PoseKey(2), Pose3()); - largeOrdering += PoseKey(1),PointKey(1),PoseKey(2); + largeValues.insert(kx(2), Pose3()); + largeOrdering += kx(1),kl(1),kx(2); VectorValues delta(largeValues.dims(largeOrdering)); - delta[largeOrdering[PoseKey(1)]] = Vector_(6, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1); - delta[largeOrdering[PointKey(1)]] = Vector_(3, 0.1, 0.1, 0.1); - delta[largeOrdering[PoseKey(2)]] = Vector_(6, 0.0, 0.0, 0.0, 100.1, 4.1, 9.1); + delta[largeOrdering[kx(1)]] = Vector_(6, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1); + delta[largeOrdering[kl(1)]] = Vector_(3, 0.1, 0.1, 0.1); + delta[largeOrdering[kx(2)]] = Vector_(6, 0.0, 0.0, 0.0, 100.1, 4.1, 9.1); Values actual = init.retract(delta, largeOrdering); CHECK(assert_equal(expected,actual)); diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index bc2ee199b..cc37e8bff 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -22,38 +22,38 @@ namespace visualSLAM { /* ************************************************************************* */ void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, - Index poseKey, Index pointKey, const shared_ptrK& K) { - boost::shared_ptr factor(new ProjectionFactor(measured, model, PoseKey(poseKey), PointKey(pointKey), K)); + Key poseKey, Key pointKey, const shared_ptrK& K) { + boost::shared_ptr factor(new ProjectionFactor(measured, model, poseKey, pointKey, K)); push_back(factor); } /* ************************************************************************* */ - void Graph::addPoseConstraint(Index poseKey, const Pose3& p) { - boost::shared_ptr factor(new PoseConstraint(PoseKey(poseKey), p)); + void Graph::addPoseConstraint(Key poseKey, const Pose3& p) { + boost::shared_ptr factor(new PoseConstraint(poseKey, p)); push_back(factor); } /* ************************************************************************* */ - void Graph::addPointConstraint(Index pointKey, const Point3& p) { - boost::shared_ptr factor(new PointConstraint(PointKey(pointKey), p)); + void Graph::addPointConstraint(Key pointKey, const Point3& p) { + boost::shared_ptr factor(new PointConstraint(pointKey, p)); push_back(factor); } /* ************************************************************************* */ - void Graph::addPosePrior(Index poseKey, const Pose3& p, const SharedNoiseModel& model) { - boost::shared_ptr factor(new PosePrior(PoseKey(poseKey), p, model)); + void Graph::addPosePrior(Key poseKey, const Pose3& p, const SharedNoiseModel& model) { + boost::shared_ptr factor(new PosePrior(poseKey, p, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addPointPrior(Index pointKey, const Point3& p, const SharedNoiseModel& model) { - boost::shared_ptr factor(new PointPrior(PointKey(pointKey), p, model)); + void Graph::addPointPrior(Key pointKey, const Point3& p, const SharedNoiseModel& model) { + boost::shared_ptr factor(new PointPrior(pointKey, p, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addRangeFactor(Index poseKey, Index pointKey, double range, const SharedNoiseModel& model) { - push_back(boost::shared_ptr(new RangeFactor(PoseKey(poseKey), PointKey(pointKey), range, model))); + void Graph::addRangeFactor(Key poseKey, Key pointKey, double range, const SharedNoiseModel& model) { + push_back(boost::shared_ptr(new RangeFactor(poseKey, pointKey, range, model))); } /* ************************************************************************* */ diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 38d3312a7..9933c4d9f 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -34,12 +34,6 @@ namespace visualSLAM { using namespace gtsam; - /// Convenience function for constructing a pose key - inline Symbol PoseKey(Index j) { return Symbol('x', j); } - - /// Convenience function for constructing a pose key - inline Symbol PointKey(Index j) { return Symbol('l', j); } - /** * Typedefs that make up the visualSLAM namespace. */ @@ -85,21 +79,21 @@ namespace visualSLAM { * @param K shared pointer to calibration object */ void addMeasurement(const Point2& measured, const SharedNoiseModel& model, - Index poseKey, Index pointKey, const shared_ptrK& K); + Key poseKey, Key pointKey, const shared_ptrK& K); /** * Add a constraint on a pose (for now, *must* be satisfied in any Values) * @param key variable key of the camera pose * @param p to which pose to constrain it to */ - void addPoseConstraint(Index poseKey, const Pose3& p = Pose3()); + void addPoseConstraint(Key poseKey, const Pose3& p = Pose3()); /** * Add a constraint on a point (for now, *must* be satisfied in any Values) * @param key variable key of the landmark * @param p point around which soft prior is defined */ - void addPointConstraint(Index pointKey, const Point3& p = Point3()); + void addPointConstraint(Key pointKey, const Point3& p = Point3()); /** * Add a prior on a pose @@ -107,7 +101,7 @@ namespace visualSLAM { * @param p around which soft prior is defined * @param model uncertainty model of this prior */ - void addPosePrior(Index poseKey, const Pose3& p = Pose3(), const SharedNoiseModel& model = noiseModel::Unit::Create(6)); + void addPosePrior(Key poseKey, const Pose3& p = Pose3(), const SharedNoiseModel& model = noiseModel::Unit::Create(6)); /** * Add a prior on a landmark @@ -115,7 +109,7 @@ namespace visualSLAM { * @param p to which point to constrain it to * @param model uncertainty model of this prior */ - void addPointPrior(Index pointKey, const Point3& p = Point3(), const SharedNoiseModel& model = noiseModel::Unit::Create(3)); + void addPointPrior(Key pointKey, const Point3& p = Point3(), const SharedNoiseModel& model = noiseModel::Unit::Create(3)); /** * Add a range prior to a landmark @@ -124,7 +118,7 @@ namespace visualSLAM { * @param range approximate range to landmark * @param model uncertainty model of this prior */ - void addRangeFactor(Index poseKey, Index pointKey, double range, const SharedNoiseModel& model = noiseModel::Unit::Create(1)); + void addRangeFactor(Key poseKey, Key pointKey, double range, const SharedNoiseModel& model = noiseModel::Unit::Create(1)); /** * Optimize the graph diff --git a/gtsam_unstable/slam/simulated3D.h b/gtsam_unstable/slam/simulated3D.h index 7b4dfce37..66552b926 100644 --- a/gtsam_unstable/slam/simulated3D.h +++ b/gtsam_unstable/slam/simulated3D.h @@ -36,12 +36,6 @@ namespace simulated3D { * the simulated2D domain. */ - /// Convenience function for constructing a pose key - inline Symbol PoseKey(Index j) { return Symbol('x', j); } - - /// Convenience function for constructing a pose key - inline Symbol PointKey(Index j) { return Symbol('l', j); } - /** * Prior on a single pose */ @@ -105,9 +99,8 @@ struct Simulated3DMeasurement: public NoiseModelFactor2 { * @param poseKey is the pose key of the robot * @param pointKey is the point key for the landmark */ - Simulated3DMeasurement(const Point3& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey) : - NoiseModelFactor2(model, poseKey, pointKey), measured_(measured) {} + Simulated3DMeasurement(const Point3& measured, const SharedNoiseModel& model, Key i, Key j) : + NoiseModelFactor2(model, i, j), measured_(measured) {} /** * Error function with optional derivatives diff --git a/gtsam_unstable/slam/tests/testSimulated3D.cpp b/gtsam_unstable/slam/tests/testSimulated3D.cpp index 50171bc76..5aca0ce3a 100644 --- a/gtsam_unstable/slam/tests/testSimulated3D.cpp +++ b/gtsam_unstable/slam/tests/testSimulated3D.cpp @@ -30,8 +30,8 @@ using namespace simulated3D; TEST( simulated3D, Values ) { Values actual; - actual.insert(simulated3D::PointKey(1),Point3(1,1,1)); - actual.insert(simulated3D::PoseKey(2),Point3(2,2,2)); + actual.insert(Symbol('l',1),Point3(1,1,1)); + actual.insert(Symbol('x',2),Point3(2,2,2)); EXPECT(assert_equal(actual,actual,1e-9)); } diff --git a/tests/testBoundingConstraint.cpp b/tests/testBoundingConstraint.cpp index e1b685fc8..35b1833ee 100644 --- a/tests/testBoundingConstraint.cpp +++ b/tests/testBoundingConstraint.cpp @@ -32,7 +32,7 @@ SharedDiagonal soft_model2_alt = noiseModel::Isotropic::Sigma(2, 0.1); SharedDiagonal hard_model1 = noiseModel::Constrained::All(1); // some simple inequality constraints -Symbol key(simulated2D::PoseKey(1)); +Symbol key('x',1); double mu = 10.0; // greater than iq2D::PoseXInequality constraint1(key, 1.0, true, mu); diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index b16ac0cdc..ae8c6e00e 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -387,11 +387,11 @@ TEST(DoglegOptimizer, Iterate) { // config far from minimum Point2 x0(3,0); boost::shared_ptr config(new Values); - config->insert(simulated2D::PoseKey(1), x0); + config->insert(Symbol('x',1), x0); // ordering shared_ptr ord(new Ordering()); - ord->push_back(simulated2D::PoseKey(1)); + ord->push_back(Symbol('x',1)); double Delta = 1.0; for(size_t it=0; it<10; ++it) { diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 40e1ca4e1..cf2842af9 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -4,13 +4,6 @@ * @author Michael Kaess */ -#include -#include // for operator += -#include -using namespace boost::assign; - -#include - #include #include #include @@ -21,26 +14,32 @@ using namespace boost::assign; #include #include +#include + +#include +#include // for operator += +#include +using namespace boost::assign; + using namespace std; using namespace gtsam; -using namespace example; using boost::shared_ptr; const double tol = 1e-4; +// SETDEBUG("ISAM2 update", true); +// SETDEBUG("ISAM2 update verbose", true); +// SETDEBUG("ISAM2 recalculate", true); + +// Set up parameters +SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); +SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); + ISAM2 createSlamlikeISAM2( boost::optional init_values = boost::none, boost::optional full_graph = boost::none, const ISAM2Params& params = ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, true)) { - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - // These variables will be reused and accumulate factors and values ISAM2 isam(params); // ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, true)); @@ -57,8 +56,8 @@ ISAM2 createSlamlikeISAM2( fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); isam.update(newfactors, init); } @@ -70,8 +69,8 @@ ISAM2 createSlamlikeISAM2( fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -80,17 +79,17 @@ ISAM2 createSlamlikeISAM2( { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); isam.update(newfactors, init); ++ i; @@ -103,8 +102,8 @@ ISAM2 createSlamlikeISAM2( fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -113,13 +112,13 @@ ISAM2 createSlamlikeISAM2( { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); isam.update(newfactors, init); ++ i; @@ -139,10 +138,10 @@ TEST_UNSAFE(ISAM2, AddVariables) { // Create initial state Values theta; - theta.insert(planarSLAM::PoseKey(0), Pose2(.1, .2, .3)); - theta.insert(planarSLAM::PointKey(0), Point2(.4, .5)); + theta.insert((0), Pose2(.1, .2, .3)); + theta.insert(100, Point2(.4, .5)); Values newTheta; - newTheta.insert(planarSLAM::PoseKey(1), Pose2(.6, .7, .8)); + newTheta.insert((1), Pose2(.6, .7, .8)); VectorValues deltaUnpermuted; deltaUnpermuted.insert(0, Vector_(3, .1, .2, .3)); @@ -176,21 +175,21 @@ TEST_UNSAFE(ISAM2, AddVariables) { vector replacedKeys(2, false); - Ordering ordering; ordering += planarSLAM::PointKey(0), planarSLAM::PoseKey(0); + Ordering ordering; ordering += 100, (0); ISAM2::Nodes nodes(2); // Verify initial state - LONGS_EQUAL(0, ordering[planarSLAM::PointKey(0)]); - LONGS_EQUAL(1, ordering[planarSLAM::PoseKey(0)]); - EXPECT(assert_equal(deltaUnpermuted[1], delta[ordering[planarSLAM::PointKey(0)]])); - EXPECT(assert_equal(deltaUnpermuted[0], delta[ordering[planarSLAM::PoseKey(0)]])); + LONGS_EQUAL(0, ordering[100]); + LONGS_EQUAL(1, ordering[(0)]); + EXPECT(assert_equal(deltaUnpermuted[1], delta[ordering[100]])); + EXPECT(assert_equal(deltaUnpermuted[0], delta[ordering[(0)]])); // Create expected state Values thetaExpected; - thetaExpected.insert(planarSLAM::PoseKey(0), Pose2(.1, .2, .3)); - thetaExpected.insert(planarSLAM::PointKey(0), Point2(.4, .5)); - thetaExpected.insert(planarSLAM::PoseKey(1), Pose2(.6, .7, .8)); + thetaExpected.insert((0), Pose2(.1, .2, .3)); + thetaExpected.insert(100, Point2(.4, .5)); + thetaExpected.insert((1), Pose2(.6, .7, .8)); VectorValues deltaUnpermutedExpected; deltaUnpermutedExpected.insert(0, Vector_(3, .1, .2, .3)); @@ -230,7 +229,7 @@ TEST_UNSAFE(ISAM2, AddVariables) { vector replacedKeysExpected(3, false); - Ordering orderingExpected; orderingExpected += planarSLAM::PointKey(0), planarSLAM::PoseKey(0), planarSLAM::PoseKey(1); + Ordering orderingExpected; orderingExpected += 100, (0), (1); ISAM2::Nodes nodesExpected( 3, ISAM2::sharedClique()); @@ -255,10 +254,10 @@ TEST_UNSAFE(ISAM2, AddVariables) { // using namespace gtsam::planarSLAM; // typedef GaussianISAM2::Impl Impl; // -// Ordering ordering; ordering += PointKey(0), PoseKey(0), PoseKey(1); +// Ordering ordering; ordering += (0), (0), (1); // planarSLAM::Graph graph; -// graph.addPrior(PoseKey(0), Pose2(), sharedUnit(Pose2::dimension)); -// graph.addRange(PoseKey(0), PointKey(0), 1.0, sharedUnit(1)); +// graph.addPrior((0), Pose2(), sharedUnit(Pose2::dimension)); +// graph.addRange((0), (0), 1.0, sharedUnit(1)); // // FastSet expected; // expected.insert(0); @@ -307,7 +306,7 @@ TEST(ISAM2, optimize2) { // Create initialization Values theta; - theta.insert(planarSLAM::PoseKey(0), Pose2(0.01, 0.01, 0.01)); + theta.insert((0), Pose2(0.01, 0.01, 0.01)); // Create conditional Vector d(3); d << -0.1, -0.1, -0.31831; @@ -318,7 +317,7 @@ TEST(ISAM2, optimize2) { GaussianConditional::shared_ptr conditional(new GaussianConditional(0, d, R, Vector::Ones(3))); // Create ordering - Ordering ordering; ordering += planarSLAM::PoseKey(0); + Ordering ordering; ordering += (0); // Expected vector VectorValues expected(1, 3); @@ -353,18 +352,6 @@ bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, cons TEST(ISAM2, slamlike_solution_gaussnewton) { -// SETDEBUG("ISAM2 update", true); -// SETDEBUG("ISAM2 update verbose", true); -// SETDEBUG("ISAM2 recalculate", true); - - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - // These variables will be reused and accumulate factors and values ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; @@ -380,8 +367,8 @@ TEST(ISAM2, slamlike_solution_gaussnewton) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); isam.update(newfactors, init); } @@ -395,8 +382,8 @@ TEST(ISAM2, slamlike_solution_gaussnewton) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -405,17 +392,17 @@ TEST(ISAM2, slamlike_solution_gaussnewton) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); isam.update(newfactors, init); ++ i; @@ -428,8 +415,8 @@ TEST(ISAM2, slamlike_solution_gaussnewton) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -438,13 +425,13 @@ TEST(ISAM2, slamlike_solution_gaussnewton) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); isam.update(newfactors, init); ++ i; @@ -485,19 +472,6 @@ TEST(ISAM2, slamlike_solution_gaussnewton) /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_dogleg) { - -// SETDEBUG("ISAM2 update", true); -// SETDEBUG("ISAM2 update verbose", true); -// SETDEBUG("ISAM2 recalculate", true); - - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - // These variables will be reused and accumulate factors and values ISAM2 isam(ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false)); Values fullinit; @@ -513,8 +487,8 @@ TEST(ISAM2, slamlike_solution_dogleg) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); isam.update(newfactors, init); } @@ -528,8 +502,8 @@ TEST(ISAM2, slamlike_solution_dogleg) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -538,17 +512,17 @@ TEST(ISAM2, slamlike_solution_dogleg) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); isam.update(newfactors, init); ++ i; @@ -561,8 +535,8 @@ TEST(ISAM2, slamlike_solution_dogleg) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -571,13 +545,13 @@ TEST(ISAM2, slamlike_solution_dogleg) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); isam.update(newfactors, init); ++ i; @@ -618,19 +592,6 @@ TEST(ISAM2, slamlike_solution_dogleg) /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_gaussnewton_qr) { - -// SETDEBUG("ISAM2 update", true); -// SETDEBUG("ISAM2 update verbose", true); -// SETDEBUG("ISAM2 recalculate", true); - - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - // These variables will be reused and accumulate factors and values ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, false, ISAM2Params::QR)); Values fullinit; @@ -646,8 +607,8 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); isam.update(newfactors, init); } @@ -661,8 +622,8 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -671,17 +632,17 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); isam.update(newfactors, init); ++ i; @@ -694,8 +655,8 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -704,13 +665,13 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); isam.update(newfactors, init); ++ i; @@ -751,19 +712,6 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_dogleg_qr) { - -// SETDEBUG("ISAM2 update", true); -// SETDEBUG("ISAM2 update verbose", true); -// SETDEBUG("ISAM2 recalculate", true); - - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - // These variables will be reused and accumulate factors and values ISAM2 isam(ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false, false, ISAM2Params::QR)); Values fullinit; @@ -779,8 +727,8 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); isam.update(newfactors, init); } @@ -794,8 +742,8 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -804,17 +752,17 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); isam.update(newfactors, init); ++ i; @@ -827,8 +775,8 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -837,13 +785,13 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); isam.update(newfactors, init); ++ i; @@ -894,8 +842,8 @@ TEST(ISAM2, clone) { // Modify original isam NonlinearFactorGraph factors; - factors.add(BetweenFactor(Symbol('x',0), Symbol('x',10), - isam.calculateEstimate(Symbol('x',0)).between(isam.calculateEstimate(Symbol('x',10))), sharedUnit(3))); + factors.add(BetweenFactor(0, 10, + isam.calculateEstimate(0).between(isam.calculateEstimate(10)), sharedUnit(3))); isam.update(factors); CHECK(assert_equal(createSlamlikeISAM2(), clone2)); @@ -978,22 +926,9 @@ TEST(ISAM2, permute_cached) { /* ************************************************************************* */ TEST(ISAM2, removeFactors) { - -// SETDEBUG("ISAM2 update", true); -// SETDEBUG("ISAM2 update verbose", true); -// SETDEBUG("ISAM2 recalculate", true); - // This test builds a graph in the same way as the "slamlike" test above, but // then removes the 2nd-to-last landmark measurement - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - // These variables will be reused and accumulate factors and values ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; @@ -1009,8 +944,8 @@ TEST(ISAM2, removeFactors) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); isam.update(newfactors, init); } @@ -1024,8 +959,8 @@ TEST(ISAM2, removeFactors) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -1034,17 +969,17 @@ TEST(ISAM2, removeFactors) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); isam.update(newfactors, init); ++ i; @@ -1057,8 +992,8 @@ TEST(ISAM2, removeFactors) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init); } @@ -1067,14 +1002,14 @@ TEST(ISAM2, removeFactors) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors[0]); fullgraph.push_back(newfactors[2]); // Don't add measurement on landmark 0 Values init; - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); ISAM2Result result = isam.update(newfactors, init); ++ i; @@ -1119,24 +1054,11 @@ TEST(ISAM2, removeFactors) } /* ************************************************************************* */ -TEST(ISAM2, swapFactors) +TEST_UNSAFE(ISAM2, swapFactors) { - -// SETDEBUG("ISAM2 update", true); -// SETDEBUG("ISAM2 update verbose", true); -// SETDEBUG("ISAM2 recalculate", true); - // This test builds a graph in the same way as the "slamlike" test above, but // then swaps the 2nd-to-last landmark measurement with a different one - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - Values fullinit; planarSLAM::Graph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph); @@ -1149,8 +1071,8 @@ TEST(ISAM2, swapFactors) fullgraph.remove(swap_idx); planarSLAM::Graph swapfactors; -// swapfactors.addBearingRange(10, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); // original factor - swapfactors.addBearingRange(10, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 5.0, brNoise); +// swapfactors.addBearingRange(10, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); // original factor + swapfactors.addBearingRange(10, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 5.0, brNoise); fullgraph.push_back(swapfactors); isam.update(swapfactors, Values(), toRemove); } @@ -1191,19 +1113,6 @@ TEST(ISAM2, swapFactors) /* ************************************************************************* */ TEST(ISAM2, constrained_ordering) { - -// SETDEBUG("ISAM2 update", true); -// SETDEBUG("ISAM2 update verbose", true); -// SETDEBUG("ISAM2 recalculate", true); - - // Pose and landmark key types from planarSLAM - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - - // Set up parameters - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); - // These variables will be reused and accumulate factors and values ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; @@ -1211,8 +1120,8 @@ TEST(ISAM2, constrained_ordering) // We will constrain x3 and x4 to the end FastMap constrained; - constrained.insert(make_pair(planarSLAM::PoseKey(3), 1)); - constrained.insert(make_pair(planarSLAM::PoseKey(4), 2)); + constrained.insert(make_pair((3), 1)); + constrained.insert(make_pair((4), 2)); // i keeps track of the time step size_t i = 0; @@ -1224,8 +1133,8 @@ TEST(ISAM2, constrained_ordering) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); isam.update(newfactors, init); } @@ -1239,8 +1148,8 @@ TEST(ISAM2, constrained_ordering) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); if(i >= 3) isam.update(newfactors, init, FastVector(), constrained); @@ -1252,17 +1161,17 @@ TEST(ISAM2, constrained_ordering) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); isam.update(newfactors, init, FastVector(), constrained); ++ i; @@ -1275,8 +1184,8 @@ TEST(ISAM2, constrained_ordering) fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); isam.update(newfactors, init, FastVector(), constrained); } @@ -1285,13 +1194,13 @@ TEST(ISAM2, constrained_ordering) { planarSLAM::Graph newfactors; newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); Values init; - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); isam.update(newfactors, init, FastVector(), constrained); ++ i; @@ -1301,7 +1210,7 @@ TEST(ISAM2, constrained_ordering) EXPECT(isam_check(fullgraph, fullinit, isam)); // Check that x3 and x4 are last, but either can come before the other - EXPECT(isam.getOrdering()[planarSLAM::PoseKey(3)] == 12 && isam.getOrdering()[planarSLAM::PoseKey(4)] == 13); + EXPECT(isam.getOrdering()[(3)] == 12 && isam.getOrdering()[(4)] == 13); // Check gradient at each node typedef ISAM2::sharedClique sharedClique; diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 074693123..6ec160a5d 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -125,9 +125,6 @@ TEST( GaussianJunctionTree, optimizeMultiFrontal2) /* ************************************************************************* */ TEST(GaussianJunctionTree, slamlike) { - using planarSLAM::PoseKey; - using planarSLAM::PointKey; - Values init; planarSLAM::Graph newfactors; planarSLAM::Graph fullgraph; @@ -137,39 +134,39 @@ TEST(GaussianJunctionTree, slamlike) { size_t i = 0; newfactors = planarSLAM::Graph(); - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - init.insert(PoseKey(0), Pose2(0.01, 0.01, 0.01)); + newfactors.addPrior(kx(0), Pose2(0.0, 0.0, 0.0), odoNoise); + init.insert(kx(0), Pose2(0.01, 0.01, 0.01)); fullgraph.push_back(newfactors); for( ; i<5; ++i) { newfactors = planarSLAM::Graph(); - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + init.insert(kx(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } newfactors = planarSLAM::Graph(); - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - init.insert(PoseKey(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(PointKey(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(PointKey(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(kx(i), kl(0), Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(kx(i), kl(1), Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + init.insert(kx(i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(kl(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(kl(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); fullgraph.push_back(newfactors); ++ i; for( ; i<5; ++i) { newfactors = planarSLAM::Graph(); - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - init.insert(PoseKey(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + init.insert(kx(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } newfactors = planarSLAM::Graph(); - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 0, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 1, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - init.insert(PoseKey(i+1), Pose2(6.9, 0.1, 0.01)); + newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(kx(i), kl(0), Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(kx(i), kl(1), Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + init.insert(kx(i+1), Pose2(6.9, 0.1, 0.01)); fullgraph.push_back(newfactors); ++ i; @@ -195,12 +192,12 @@ TEST(GaussianJunctionTree, simpleMarginal) { // Create a simple graph pose2SLAM::Graph fg; - fg.addPrior(0, Pose2(), sharedSigma(3, 10.0)); - fg.addOdometry(0, 1, Pose2(1.0, 0.0, 0.0), sharedSigmas(Vector_(3, 10.0, 1.0, 1.0))); + fg.addPrior(kx(0), Pose2(), sharedSigma(3, 10.0)); + fg.addOdometry(kx(0), kx(1), Pose2(1.0, 0.0, 0.0), sharedSigmas(Vector_(3, 10.0, 1.0, 1.0))); Values init; - init.insert(pose2SLAM::PoseKey(0), Pose2()); - init.insert(pose2SLAM::PoseKey(1), Pose2(1.0, 0.0, 0.0)); + init.insert(kx(0), Pose2()); + init.insert(kx(1), Pose2(1.0, 0.0, 0.0)); Ordering ordering; ordering += kx(1), kx(0); diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index f56efae82..c75c42b49 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -16,38 +16,34 @@ * @brief unit test for graph-inl.h */ -#include +#include +#include + +#include + #include #include // for operator += using namespace boost::assign; -#include - -// TODO: DANGEROUS, create shared pointers -#define GTSAM_MAGIC_GAUSSIAN 3 - -#include -#include +#include using namespace std; using namespace gtsam; -Key kx(size_t i) { return Symbol('x',i); } - /* ************************************************************************* */ // x1 -> x2 // -> x3 -> x4 // -> x5 TEST ( Ordering, predecessorMap2Keys ) { PredecessorMap p_map; - p_map.insert(kx(1),kx(1)); - p_map.insert(kx(2),kx(1)); - p_map.insert(kx(3),kx(1)); - p_map.insert(kx(4),kx(3)); - p_map.insert(kx(5),kx(1)); + p_map.insert(1,1); + p_map.insert(2,1); + p_map.insert(3,1); + p_map.insert(4,3); + p_map.insert(5,1); list expected; - expected += kx(4),kx(5),kx(3),kx(2),kx(1);//PoseKey(4), PoseKey(5), PoseKey(3), PoseKey(2), PoseKey(1); + expected += 4,5,3,2,1; list actual = predecessorMap2Keys(p_map); LONGS_EQUAL(expected.size(), actual.size()); @@ -67,20 +63,20 @@ TEST( Graph, predecessorMap2Graph ) map key2vertex; PredecessorMap p_map; - p_map.insert(kx(1), kx(2)); - p_map.insert(kx(2), kx(2)); - p_map.insert(kx(3), kx(2)); + p_map.insert(1, 2); + p_map.insert(2, 2); + p_map.insert(3, 2); tie(graph, root, key2vertex) = predecessorMap2Graph, SVertex, Key>(p_map); LONGS_EQUAL(3, boost::num_vertices(graph)); - CHECK(root == key2vertex[kx(2)]); + CHECK(root == key2vertex[2]); } /* ************************************************************************* */ TEST( Graph, composePoses ) { pose2SLAM::Graph graph; - Matrix cov = eye(3); + SharedNoiseModel cov = SharedNoiseModel::Unit(3); Pose2 p1(1.0, 2.0, 0.3), p2(4.0, 5.0, 0.6), p3(7.0, 8.0, 0.9), p4(2.0, 2.0, 2.9); Pose2 p12=p1.between(p2), p23=p2.between(p3), p43=p4.between(p3); graph.addOdometry(1,2, p12, cov); @@ -88,10 +84,10 @@ TEST( Graph, composePoses ) graph.addOdometry(4,3, p43, cov); PredecessorMap tree; - tree.insert(pose2SLAM::PoseKey(1),pose2SLAM::PoseKey(2)); - tree.insert(pose2SLAM::PoseKey(2),pose2SLAM::PoseKey(2)); - tree.insert(pose2SLAM::PoseKey(3),pose2SLAM::PoseKey(2)); - tree.insert(pose2SLAM::PoseKey(4),pose2SLAM::PoseKey(3)); + tree.insert(1,2); + tree.insert(2,2); + tree.insert(3,2); + tree.insert(4,3); Pose2 rootPose = p2; @@ -99,10 +95,10 @@ TEST( Graph, composePoses ) Pose2, Key> (graph, tree, rootPose); Values expected; - expected.insert(pose2SLAM::PoseKey(1), p1); - expected.insert(pose2SLAM::PoseKey(2), p2); - expected.insert(pose2SLAM::PoseKey(3), p3); - expected.insert(pose2SLAM::PoseKey(4), p4); + expected.insert(1, p1); + expected.insert(2, p2); + expected.insert(3, p3); + expected.insert(4, p4); LONGS_EQUAL(4, actual->size()); CHECK(assert_equal(expected, *actual)); diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index 6ad070698..05573c686 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -25,6 +25,10 @@ using namespace std; using namespace gtsam; +// Convenience for named keys +Key kx(size_t i) { return Symbol('x',i); } +Key kl(size_t i) { return Symbol('l',i); } + /* ************************************************************************* */ // The tests below test the *generic* inference algorithms. Some of these have // specialized versions in the derived classes GaussianFactorGraph etc... @@ -52,23 +56,23 @@ TEST( inference, marginals2) SharedDiagonal poseModel(sharedSigma(3, 0.1)); SharedDiagonal pointModel(sharedSigma(3, 0.1)); - fg.addPrior(0, Pose2(), poseModel); - fg.addOdometry(0, 1, Pose2(1.0,0.0,0.0), poseModel); - fg.addOdometry(1, 2, Pose2(1.0,0.0,0.0), poseModel); - fg.addBearingRange(0, 0, Rot2(), 1.0, pointModel); - fg.addBearingRange(1, 0, Rot2(), 1.0, pointModel); - fg.addBearingRange(2, 0, Rot2(), 1.0, pointModel); + fg.addPrior(kx(0), Pose2(), poseModel); + fg.addOdometry(kx(0), kx(1), Pose2(1.0,0.0,0.0), poseModel); + fg.addOdometry(kx(1), kx(2), Pose2(1.0,0.0,0.0), poseModel); + fg.addBearingRange(kx(0), kl(0), Rot2(), 1.0, pointModel); + fg.addBearingRange(kx(1), kl(0), Rot2(), 1.0, pointModel); + fg.addBearingRange(kx(2), kl(0), Rot2(), 1.0, pointModel); Values init; - init.insert(planarSLAM::PoseKey(0), Pose2(0.0,0.0,0.0)); - init.insert(planarSLAM::PoseKey(1), Pose2(1.0,0.0,0.0)); - init.insert(planarSLAM::PoseKey(2), Pose2(2.0,0.0,0.0)); - init.insert(planarSLAM::PointKey(0), Point2(1.0,1.0)); + init.insert(kx(0), Pose2(0.0,0.0,0.0)); + init.insert(kx(1), Pose2(1.0,0.0,0.0)); + init.insert(kx(2), Pose2(2.0,0.0,0.0)); + init.insert(kl(0), Point2(1.0,1.0)); Ordering ordering(*fg.orderingCOLAMD(init)); FactorGraph::shared_ptr gfg(fg.linearize(init, ordering)); GaussianMultifrontalSolver solver(*gfg); - solver.marginalFactor(ordering[planarSLAM::PointKey(0)]); + solver.marginalFactor(ordering[kl(0)]); } /* ************************************************************************* */ diff --git a/tests/testNonlinearEquality.cpp b/tests/testNonlinearEquality.cpp index 94ab58831..639e67591 100644 --- a/tests/testNonlinearEquality.cpp +++ b/tests/testNonlinearEquality.cpp @@ -535,13 +535,13 @@ TEST (testNonlinearEqualityConstraint, stereo_constrained ) { VGraph graph; // create equality constraints for poses - graph.addPoseConstraint(1, camera1.pose()); - graph.addPoseConstraint(2, camera2.pose()); + graph.addPoseConstraint(x1, camera1.pose()); + graph.addPoseConstraint(x2, camera2.pose()); // create factors SharedDiagonal vmodel = noiseModel::Unit::Create(3); - graph.addMeasurement(camera1.project(landmark), vmodel, 1, 1, shK); - graph.addMeasurement(camera2.project(landmark), vmodel, 2, 2, shK); + graph.addMeasurement(camera1.project(landmark), vmodel, x1, l1, shK); + graph.addMeasurement(camera2.project(landmark), vmodel, x2, l2, shK); // add equality constraint graph.add(Point3Equality(l1, l2)); diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index d5e91d0d7..d1a891356 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -37,8 +37,9 @@ using namespace std; using namespace gtsam; using namespace example; -using simulated2D::PoseKey; -using simulated2D::PointKey; +// Convenience for named keys +Key kx(size_t i) { return Symbol('x',i); } +Key kl(size_t i) { return Symbol('l',i); } typedef boost::shared_ptr shared_nlf; @@ -49,11 +50,11 @@ TEST( NonlinearFactor, equals ) // create two nonlinear2 factors Point2 z3(0.,-1.); - simulated2D::Measurement f0(z3, sigma, PoseKey(1),PointKey(1)); + simulated2D::Measurement f0(z3, sigma, kx(1),kl(1)); // measurement between x2 and l1 Point2 z4(-1.5, -1.); - simulated2D::Measurement f1(z4, sigma, PoseKey(2),PointKey(1)); + simulated2D::Measurement f1(z4, sigma, kx(2),kl(1)); CHECK(assert_equal(f0,f0)); CHECK(f0.equals(f0)); @@ -199,16 +200,16 @@ TEST( NonlinearFactor, linearize_constraint1 ) SharedDiagonal constraint = noiseModel::Constrained::MixedSigmas(sigmas); Point2 mu(1., -1.); - Graph::sharedFactor f0(new simulated2D::Prior(mu, constraint, PoseKey(1))); + Graph::sharedFactor f0(new simulated2D::Prior(mu, constraint, kx(1))); Values config; - config.insert(simulated2D::PoseKey(1), Point2(1.0, 2.0)); + config.insert(kx(1), Point2(1.0, 2.0)); GaussianFactor::shared_ptr actual = f0->linearize(config, *config.orderingArbitrary()); // create expected Ordering ord(*config.orderingArbitrary()); Vector b = Vector_(2, 0., -3.); - JacobianFactor expected(ord[PoseKey(1)], Matrix_(2,2, 5.0, 0.0, 0.0, 1.0), b, constraint); + JacobianFactor expected(ord[kx(1)], Matrix_(2,2, 5.0, 0.0, 0.0, 1.0), b, constraint); CHECK(assert_equal((const GaussianFactor&)expected, *actual)); } @@ -219,18 +220,18 @@ TEST( NonlinearFactor, linearize_constraint2 ) SharedDiagonal constraint = noiseModel::Constrained::MixedSigmas(sigmas); Point2 z3(1.,-1.); - simulated2D::Measurement f0(z3, constraint, PoseKey(1),PointKey(1)); + simulated2D::Measurement f0(z3, constraint, kx(1),kl(1)); Values config; - config.insert(simulated2D::PoseKey(1), Point2(1.0, 2.0)); - config.insert(simulated2D::PointKey(1), Point2(5.0, 4.0)); + config.insert(kx(1), Point2(1.0, 2.0)); + config.insert(kl(1), Point2(5.0, 4.0)); GaussianFactor::shared_ptr actual = f0.linearize(config, *config.orderingArbitrary()); // create expected Ordering ord(*config.orderingArbitrary()); Matrix A = Matrix_(2,2, 5.0, 0.0, 0.0, 1.0); Vector b = Vector_(2, -15., -3.); - JacobianFactor expected(ord[PoseKey(1)], -1*A, ord[PointKey(1)], A, b, constraint); + JacobianFactor expected(ord[kx(1)], -1*A, ord[kl(1)], A, b, constraint); CHECK(assert_equal((const GaussianFactor&)expected, *actual)); } @@ -238,7 +239,7 @@ TEST( NonlinearFactor, linearize_constraint2 ) class TestFactor4 : public NoiseModelFactor4 { public: typedef NoiseModelFactor4 Base; - TestFactor4() : Base(sharedSigmas(Vector_(1, 2.0)), PoseKey(1), PoseKey(2), PoseKey(3), PoseKey(4)) {} + TestFactor4() : Base(sharedSigmas(Vector_(1, 2.0)), kx(1), kx(2), kx(3), kx(4)) {} virtual Vector evaluateError(const LieVector& x1, const LieVector& x2, const LieVector& x3, const LieVector& x4, @@ -262,13 +263,13 @@ public: TEST(NonlinearFactor, NoiseModelFactor4) { TestFactor4 tf; Values tv; - tv.insert(PoseKey(1), LieVector(1, 1.0)); - tv.insert(PoseKey(2), LieVector(1, 2.0)); - tv.insert(PoseKey(3), LieVector(1, 3.0)); - tv.insert(PoseKey(4), LieVector(1, 4.0)); + tv.insert(kx(1), LieVector(1, 1.0)); + tv.insert(kx(2), LieVector(1, 2.0)); + tv.insert(kx(3), LieVector(1, 3.0)); + tv.insert(kx(4), LieVector(1, 4.0)); EXPECT(assert_equal(Vector_(1, 10.0), tf.unwhitenedError(tv))); DOUBLES_EQUAL(25.0/2.0, tf.error(tv), 1e-9); - Ordering ordering; ordering += PoseKey(1), PoseKey(2), PoseKey(3), PoseKey(4); + Ordering ordering; ordering += kx(1), kx(2), kx(3), kx(4); JacobianFactor jf(*boost::dynamic_pointer_cast(tf.linearize(tv, ordering))); LONGS_EQUAL(jf.keys()[0], 0); LONGS_EQUAL(jf.keys()[1], 1); @@ -285,7 +286,7 @@ TEST(NonlinearFactor, NoiseModelFactor4) { class TestFactor5 : public NoiseModelFactor5 { public: typedef NoiseModelFactor5 Base; - TestFactor5() : Base(sharedSigmas(Vector_(1, 2.0)), PoseKey(1), PoseKey(2), PoseKey(3), PoseKey(4), PoseKey(5)) {} + TestFactor5() : Base(sharedSigmas(Vector_(1, 2.0)), kx(1), kx(2), kx(3), kx(4), kx(5)) {} virtual Vector evaluateError(const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, @@ -311,14 +312,14 @@ public: TEST(NonlinearFactor, NoiseModelFactor5) { TestFactor5 tf; Values tv; - tv.insert(PoseKey(1), LieVector(1, 1.0)); - tv.insert(PoseKey(2), LieVector(1, 2.0)); - tv.insert(PoseKey(3), LieVector(1, 3.0)); - tv.insert(PoseKey(4), LieVector(1, 4.0)); - tv.insert(PoseKey(5), LieVector(1, 5.0)); + tv.insert(kx(1), LieVector(1, 1.0)); + tv.insert(kx(2), LieVector(1, 2.0)); + tv.insert(kx(3), LieVector(1, 3.0)); + tv.insert(kx(4), LieVector(1, 4.0)); + tv.insert(kx(5), LieVector(1, 5.0)); EXPECT(assert_equal(Vector_(1, 15.0), tf.unwhitenedError(tv))); DOUBLES_EQUAL(56.25/2.0, tf.error(tv), 1e-9); - Ordering ordering; ordering += PoseKey(1), PoseKey(2), PoseKey(3), PoseKey(4), PoseKey(5); + Ordering ordering; ordering += kx(1), kx(2), kx(3), kx(4), kx(5); JacobianFactor jf(*boost::dynamic_pointer_cast(tf.linearize(tv, ordering))); LONGS_EQUAL(jf.keys()[0], 0); LONGS_EQUAL(jf.keys()[1], 1); @@ -337,7 +338,7 @@ TEST(NonlinearFactor, NoiseModelFactor5) { class TestFactor6 : public NoiseModelFactor6 { public: typedef NoiseModelFactor6 Base; - TestFactor6() : Base(sharedSigmas(Vector_(1, 2.0)), PoseKey(1), PoseKey(2), PoseKey(3), PoseKey(4), PoseKey(5), PoseKey(6)) {} + TestFactor6() : Base(sharedSigmas(Vector_(1, 2.0)), kx(1), kx(2), kx(3), kx(4), kx(5), kx(6)) {} virtual Vector evaluateError(const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, @@ -365,15 +366,15 @@ public: TEST(NonlinearFactor, NoiseModelFactor6) { TestFactor6 tf; Values tv; - tv.insert(PoseKey(1), LieVector(1, 1.0)); - tv.insert(PoseKey(2), LieVector(1, 2.0)); - tv.insert(PoseKey(3), LieVector(1, 3.0)); - tv.insert(PoseKey(4), LieVector(1, 4.0)); - tv.insert(PoseKey(5), LieVector(1, 5.0)); - tv.insert(PoseKey(6), LieVector(1, 6.0)); + tv.insert(kx(1), LieVector(1, 1.0)); + tv.insert(kx(2), LieVector(1, 2.0)); + tv.insert(kx(3), LieVector(1, 3.0)); + tv.insert(kx(4), LieVector(1, 4.0)); + tv.insert(kx(5), LieVector(1, 5.0)); + tv.insert(kx(6), LieVector(1, 6.0)); EXPECT(assert_equal(Vector_(1, 21.0), tf.unwhitenedError(tv))); DOUBLES_EQUAL(110.25/2.0, tf.error(tv), 1e-9); - Ordering ordering; ordering += PoseKey(1), PoseKey(2), PoseKey(3), PoseKey(4), PoseKey(5), PoseKey(6); + Ordering ordering; ordering += kx(1), kx(2), kx(3), kx(4), kx(5), kx(6); JacobianFactor jf(*boost::dynamic_pointer_cast(tf.linearize(tv, ordering))); LONGS_EQUAL(jf.keys()[0], 0); LONGS_EQUAL(jf.keys()[1], 1); @@ -395,10 +396,10 @@ TEST(NonlinearFactor, NoiseModelFactor6) { TEST( NonlinearFactor, clone_rekey ) { shared_nlf init(new TestFactor4()); - EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]); - EXPECT_LONGS_EQUAL(PoseKey(2), init->keys()[1]); - EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]); - EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]); + EXPECT_LONGS_EQUAL(kx(1), init->keys()[0]); + EXPECT_LONGS_EQUAL(kx(2), init->keys()[1]); + EXPECT_LONGS_EQUAL(kx(3), init->keys()[2]); + EXPECT_LONGS_EQUAL(kx(4), init->keys()[3]); // Standard clone shared_nlf actClone = init->clone(); @@ -407,24 +408,24 @@ TEST( NonlinearFactor, clone_rekey ) // Re-key factor - clones with different keys std::vector new_keys(4); - new_keys[0] = PoseKey(5); - new_keys[1] = PoseKey(6); - new_keys[2] = PoseKey(7); - new_keys[3] = PoseKey(8); + new_keys[0] = kx(5); + new_keys[1] = kx(6); + new_keys[2] = kx(7); + new_keys[3] = kx(8); shared_nlf actRekey = init->rekey(new_keys); EXPECT(actRekey.get() != init.get()); // Ensure different pointers // Ensure init is unchanged - EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]); - EXPECT_LONGS_EQUAL(PoseKey(2), init->keys()[1]); - EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]); - EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]); + EXPECT_LONGS_EQUAL(kx(1), init->keys()[0]); + EXPECT_LONGS_EQUAL(kx(2), init->keys()[1]); + EXPECT_LONGS_EQUAL(kx(3), init->keys()[2]); + EXPECT_LONGS_EQUAL(kx(4), init->keys()[3]); // Check new keys - EXPECT_LONGS_EQUAL(PoseKey(5), actRekey->keys()[0]); - EXPECT_LONGS_EQUAL(PoseKey(6), actRekey->keys()[1]); - EXPECT_LONGS_EQUAL(PoseKey(7), actRekey->keys()[2]); - EXPECT_LONGS_EQUAL(PoseKey(8), actRekey->keys()[3]); + EXPECT_LONGS_EQUAL(kx(5), actRekey->keys()[0]); + EXPECT_LONGS_EQUAL(kx(6), actRekey->keys()[1]); + EXPECT_LONGS_EQUAL(kx(7), actRekey->keys()[2]); + EXPECT_LONGS_EQUAL(kx(8), actRekey->keys()[3]); } /* ************************************************************************* */ diff --git a/tests/testNonlinearISAM.cpp b/tests/testNonlinearISAM.cpp index 80ed7b6b6..cf8782e09 100644 --- a/tests/testNonlinearISAM.cpp +++ b/tests/testNonlinearISAM.cpp @@ -54,7 +54,7 @@ TEST(testNonlinearISAM, markov_chain ) { ordering.push_back(secondLast); isam.setOrdering(ordering); - Ordering expected; expected += PoseKey(0), PoseKey(1), PoseKey(2), PoseKey(4), PoseKey(3); + Ordering expected; expected += (0), (1), (2), (4), (3); EXPECT(assert_equal(expected, isam.getOrdering())); } diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index eb6357fbd..1a134b8a3 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -50,7 +50,7 @@ TEST( NonlinearOptimizer, iterateLM ) // config far from minimum Point2 x0(3,0); Values config; - config.insert(simulated2D::PoseKey(1), x0); + config.insert(kx(1), x0); // normal iterate GaussNewtonParams gnParams; @@ -74,13 +74,13 @@ TEST( NonlinearOptimizer, optimize ) // test error at minimum Point2 xstar(0,0); Values cstar; - cstar.insert(simulated2D::PoseKey(1), xstar); + cstar.insert(kx(1), xstar); DOUBLES_EQUAL(0.0,fg.error(cstar),0.0); // test error at initial = [(1-cos(3))^2 + (sin(3))^2]*50 = Point2 x0(3,3); Values c0; - c0.insert(simulated2D::PoseKey(1), x0); + c0.insert(kx(1), x0); DOUBLES_EQUAL(199.0,fg.error(c0),1e-3); // optimize parameters @@ -113,7 +113,7 @@ TEST( NonlinearOptimizer, SimpleLMOptimizer ) Point2 x0(3,3); Values c0; - c0.insert(simulated2D::PoseKey(1), x0); + c0.insert(kx(1), x0); Values actual = LevenbergMarquardtOptimizer(fg, c0).optimize(); DOUBLES_EQUAL(0,fg.error(actual),tol); @@ -126,7 +126,7 @@ TEST( NonlinearOptimizer, SimpleGNOptimizer ) Point2 x0(3,3); Values c0; - c0.insert(simulated2D::PoseKey(1), x0); + c0.insert(kx(1), x0); Values actual = GaussNewtonOptimizer(fg, c0).optimize(); DOUBLES_EQUAL(0,fg.error(actual),tol); @@ -139,7 +139,7 @@ TEST( NonlinearOptimizer, SimpleDLOptimizer ) Point2 x0(3,3); Values c0; - c0.insert(simulated2D::PoseKey(1), x0); + c0.insert(kx(1), x0); Values actual = DoglegOptimizer(fg, c0).optimize(); DOUBLES_EQUAL(0,fg.error(actual),tol); @@ -157,7 +157,7 @@ TEST( NonlinearOptimizer, optimization_method ) Point2 x0(3,3); Values c0; - c0.insert(simulated2D::PoseKey(1), x0); + c0.insert(kx(1), x0); Values actualMFQR = LevenbergMarquardtOptimizer(fg, c0, paramsQR).optimize(); DOUBLES_EQUAL(0,fg.error(actualMFQR),tol); @@ -170,23 +170,23 @@ TEST( NonlinearOptimizer, optimization_method ) TEST( NonlinearOptimizer, Factorization ) { Values config; - config.insert(pose2SLAM::PoseKey(1), Pose2(0.,0.,0.)); - config.insert(pose2SLAM::PoseKey(2), Pose2(1.5,0.,0.)); + config.insert(kx(1), Pose2(0.,0.,0.)); + config.insert(kx(2), Pose2(1.5,0.,0.)); pose2SLAM::Graph graph; - graph.addPrior(1, Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); - graph.addOdometry(1,2, Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); + graph.addPrior(kx(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); + graph.addOdometry(kx(1),kx(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); Ordering ordering; - ordering.push_back(pose2SLAM::PoseKey(1)); - ordering.push_back(pose2SLAM::PoseKey(2)); + ordering.push_back(kx(1)); + ordering.push_back(kx(2)); LevenbergMarquardtOptimizer optimizer(graph, config, ordering); optimizer.iterate(); Values expected; - expected.insert(pose2SLAM::PoseKey(1), Pose2(0.,0.,0.)); - expected.insert(pose2SLAM::PoseKey(2), Pose2(1.,0.,0.)); + expected.insert(kx(1), Pose2(0.,0.,0.)); + expected.insert(kx(2), Pose2(1.,0.,0.)); CHECK(assert_equal(expected, optimizer.values(), 1e-5)); } @@ -201,13 +201,13 @@ TEST(NonlinearOptimizer, NullFactor) { // test error at minimum Point2 xstar(0,0); Values cstar; - cstar.insert(simulated2D::PoseKey(1), xstar); + cstar.insert(kx(1), xstar); DOUBLES_EQUAL(0.0,fg.error(cstar),0.0); // test error at initial = [(1-cos(3))^2 + (sin(3))^2]*50 = Point2 x0(3,3); Values c0; - c0.insert(simulated2D::PoseKey(1), x0); + c0.insert(kx(1), x0); DOUBLES_EQUAL(199.0,fg.error(c0),1e-3); // optimize parameters From a2512475c925cd3772f0e65a0338beac174de5a1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 2 Jun 2012 19:05:38 +0000 Subject: [PATCH 092/914] Symbol.h is now included just in time, no longer by default everywhere. --- .cproject | 8 ++++ examples/PlanarSLAMExample_easy.cpp | 3 ++ examples/easyPoint2KalmanFilter.cpp | 1 + examples/vSLAMexample/vISAMexample.cpp | 7 ++-- examples/vSLAMexample/vSFMexample.cpp | 7 ++-- gtsam/nonlinear/ISAM2-impl.cpp | 8 ++-- gtsam/nonlinear/NonlinearFactor.h | 1 - gtsam/nonlinear/Ordering.h | 6 +-- gtsam/nonlinear/tests/testOrdering.cpp | 5 ++- .../tests/testSerializationNonlinear.cpp | 3 +- gtsam/nonlinear/tests/testValues.cpp | 23 ++++++------ gtsam/slam/GeneralSFMFactor.h | 5 ++- gtsam/slam/pose2SLAM.h | 1 - gtsam/slam/pose3SLAM.h | 1 - gtsam/slam/smallExample.cpp | 1 + gtsam/slam/tests/testGeneralSFMFactor.cpp | 25 +++++++------ .../testGeneralSFMFactor_Cal3Bundler.cpp | 32 ++++++++-------- gtsam/slam/tests/testPlanarSLAM.cpp | 10 ++--- gtsam/slam/tests/testProjectionFactor.cpp | 1 + gtsam/slam/tests/testSerializationSLAM.cpp | 6 +-- gtsam/slam/tests/testSimulated2DOriented.cpp | 12 +++--- gtsam/slam/tests/testStereoFactor.cpp | 1 + gtsam/slam/tests/testVisualSLAM.cpp | 1 + gtsam/slam/visualSLAM.h | 1 - gtsam_unstable/slam/simulated3D.h | 1 - gtsam_unstable/slam/tests/testSimulated3D.cpp | 5 ++- tests/testBoundingConstraint.cpp | 5 ++- tests/testDoglegOptimizer.cpp | 14 ++++--- tests/testExtendedKalmanFilter.cpp | 5 ++- tests/testGaussianFactor.cpp | 37 +++++++++---------- tests/testGaussianFactorGraphB.cpp | 25 +++++++------ tests/testGaussianISAM.cpp | 19 +++++----- tests/testGaussianJunctionTreeB.cpp | 26 +++++++------ tests/testInferenceB.cpp | 1 + tests/testNonlinearEquality.cpp | 7 ++-- tests/testNonlinearFactor.cpp | 1 + tests/testNonlinearFactorGraph.cpp | 1 + tests/testNonlinearISAM.cpp | 1 + tests/testNonlinearOptimizer.cpp | 1 + tests/testRot3Optimization.cpp | 1 + tests/testSymbolicBayesNetB.cpp | 1 + tests/testSymbolicFactorGraphB.cpp | 26 ++++++------- 42 files changed, 192 insertions(+), 154 deletions(-) diff --git a/.cproject b/.cproject index c19b1a91a..ec6a2bf6f 100644 --- a/.cproject +++ b/.cproject @@ -663,6 +663,14 @@ true true + + make + -j5 + testGeneralSFMFactor_Cal3Bundler.run + true + true + true + make -j5 diff --git a/examples/PlanarSLAMExample_easy.cpp b/examples/PlanarSLAMExample_easy.cpp index cd4a7aefd..fc371033e 100644 --- a/examples/PlanarSLAMExample_easy.cpp +++ b/examples/PlanarSLAMExample_easy.cpp @@ -18,6 +18,9 @@ // pull in the planar SLAM domain with all typedefs and helper functions defined #include +// we will use Symbol keys +#include + using namespace std; using namespace gtsam; diff --git a/examples/easyPoint2KalmanFilter.cpp b/examples/easyPoint2KalmanFilter.cpp index b13058a07..2b4d2476a 100644 --- a/examples/easyPoint2KalmanFilter.cpp +++ b/examples/easyPoint2KalmanFilter.cpp @@ -22,6 +22,7 @@ */ #include +#include #include #include #include diff --git a/examples/vSLAMexample/vISAMexample.cpp b/examples/vSLAMexample/vISAMexample.cpp index 6b47c9633..d23ea9b10 100644 --- a/examples/vSLAMexample/vISAMexample.cpp +++ b/examples/vSLAMexample/vISAMexample.cpp @@ -18,15 +18,16 @@ #include "vSLAMutils.h" #include "Feature2D.h" -#include -#include #include #include #include +#include +#include +#include #include #include -using namespace boost; +using boost::shared_ptr; using namespace std; using namespace gtsam; diff --git a/examples/vSLAMexample/vSFMexample.cpp b/examples/vSLAMexample/vSFMexample.cpp index 6eb3955f2..be41ad831 100644 --- a/examples/vSLAMexample/vSFMexample.cpp +++ b/examples/vSLAMexample/vSFMexample.cpp @@ -18,13 +18,14 @@ #include "vSLAMutils.h" #include "Feature2D.h" -#include -#include #include #include +#include +#include +#include #include -using namespace boost; +using boost::shared_ptr; using namespace std; using namespace gtsam; diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 8fe117e34..46fbe94f9 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -12,13 +12,15 @@ /** * @file ISAM2-impl.cpp * @brief Incremental update functionality (ISAM2) for BayesTree, with fluid relinearization. - * @author Michael Kaess, Richard Roberts + * @author Michael Kaess + * @author Richard Roberts */ +#include +#include // for selective linearization thresholds +#include #include #include -#include -#include namespace gtsam { diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index bf6527599..12001551c 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -33,7 +33,6 @@ #include #include -#include /** * Macro to add a standard clone function to a derived factor diff --git a/gtsam/nonlinear/Ordering.h b/gtsam/nonlinear/Ordering.h index 879b50677..f775f168b 100644 --- a/gtsam/nonlinear/Ordering.h +++ b/gtsam/nonlinear/Ordering.h @@ -17,14 +17,14 @@ #pragma once -#include -#include +#include #include -#include +#include #include #include #include +#include namespace gtsam { diff --git a/gtsam/nonlinear/tests/testOrdering.cpp b/gtsam/nonlinear/tests/testOrdering.cpp index f57e3281a..beb16f741 100644 --- a/gtsam/nonlinear/tests/testOrdering.cpp +++ b/gtsam/nonlinear/tests/testOrdering.cpp @@ -14,9 +14,10 @@ * @author Alex Cunningham */ -#include -#include #include +#include +#include +#include using namespace std; using namespace gtsam; diff --git a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp index 120a9fa94..bc023f115 100644 --- a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp +++ b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp @@ -16,11 +16,12 @@ * @date Feb 7, 2012 */ +#include +#include #include #include #include #include -#include #include #include diff --git a/gtsam/nonlinear/tests/testValues.cpp b/gtsam/nonlinear/tests/testValues.cpp index 6ccd3b083..f5caa846b 100644 --- a/gtsam/nonlinear/tests/testValues.cpp +++ b/gtsam/nonlinear/tests/testValues.cpp @@ -10,28 +10,29 @@ * -------------------------------------------------------------------------- */ /** - * @file testDynamicValues.cpp + * @file testValues.cpp * @author Richard Roberts */ -#include -#include -#include -#include // for operator += -using namespace boost::assign; - +#include +#include +#include +#include #include #include #include -#include -#include -#include + +#include +#include // for operator += +using namespace boost::assign; +#include +#include using namespace gtsam; using namespace std; static double inf = std::numeric_limits::infinity(); -const Key key1(Symbol('v',1)), key2(Symbol('v',2)), key3(Symbol('v',3)), key4(Symbol('v',4)); +const Symbol key1('v',1), key2('v',2), key3('v',3), key4('v',4); /* ************************************************************************* */ TEST( Values, equals1 ) diff --git a/gtsam/slam/GeneralSFMFactor.h b/gtsam/slam/GeneralSFMFactor.h index d046d0e1b..d64585b7d 100644 --- a/gtsam/slam/GeneralSFMFactor.h +++ b/gtsam/slam/GeneralSFMFactor.h @@ -20,9 +20,10 @@ #pragma once -#include #include - +#include +#include +#include namespace gtsam { diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 337ab9f7a..84fbc528f 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -19,7 +19,6 @@ #include #include -#include #include #include #include diff --git a/gtsam/slam/pose3SLAM.h b/gtsam/slam/pose3SLAM.h index e42238892..f81070818 100644 --- a/gtsam/slam/pose3SLAM.h +++ b/gtsam/slam/pose3SLAM.h @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/gtsam/slam/smallExample.cpp b/gtsam/slam/smallExample.cpp index 2e9194466..b0e709a80 100644 --- a/gtsam/slam/smallExample.cpp +++ b/gtsam/slam/smallExample.cpp @@ -18,6 +18,7 @@ */ #include +#include #include #include #include diff --git a/gtsam/slam/tests/testGeneralSFMFactor.cpp b/gtsam/slam/tests/testGeneralSFMFactor.cpp index 5b8a217bc..f9911ce7d 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor.cpp @@ -16,23 +16,24 @@ * @brief unit tests for GeneralSFMFactor */ -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include using namespace boost; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include using namespace std; using namespace gtsam; diff --git a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp index 76cf7d180..7698acae4 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp @@ -10,28 +10,30 @@ * -------------------------------------------------------------------------- */ /** - * @file testGeneralSFMFactor.cpp + * @file testGeneralSFMFactor_Cal3Bundler.cpp * @date Dec 27, 2010 * @author nikai * @brief unit tests for GeneralSFMFactor */ -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -using namespace boost; -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include using namespace std; using namespace gtsam; @@ -146,8 +148,8 @@ vector genCameraVariableCalibration() { return X ; } -shared_ptr getOrdering(const vector& X, const vector& L) { - shared_ptr ordering(new Ordering); +boost::shared_ptr getOrdering(const std::vector& X, const std::vector& L) { + boost::shared_ptr ordering(new Ordering); for ( size_t i = 0 ; i < L.size() ; ++i ) ordering->push_back(Symbol('l', i)) ; for ( size_t i = 0 ; i < X.size() ; ++i ) ordering->push_back(Symbol('x', i)) ; return ordering ; diff --git a/gtsam/slam/tests/testPlanarSLAM.cpp b/gtsam/slam/tests/testPlanarSLAM.cpp index 8859f7a08..11efc7b5e 100644 --- a/gtsam/slam/tests/testPlanarSLAM.cpp +++ b/gtsam/slam/tests/testPlanarSLAM.cpp @@ -14,16 +14,16 @@ * @author Frank Dellaert **/ +#include +#include +#include +#include + #include #include -#include -#include -#include - using namespace std; using namespace gtsam; -using namespace planarSLAM; // some shared test values static Pose2 x1, x2(1, 1, 0), x3(1, 1, M_PI_4); diff --git a/gtsam/slam/tests/testProjectionFactor.cpp b/gtsam/slam/tests/testProjectionFactor.cpp index 80b35f269..2ec97f301 100644 --- a/gtsam/slam/tests/testProjectionFactor.cpp +++ b/gtsam/slam/tests/testProjectionFactor.cpp @@ -17,6 +17,7 @@ */ #include +#include #include using namespace std; diff --git a/gtsam/slam/tests/testSerializationSLAM.cpp b/gtsam/slam/tests/testSerializationSLAM.cpp index 4442d73fc..23093a28e 100644 --- a/gtsam/slam/tests/testSerializationSLAM.cpp +++ b/gtsam/slam/tests/testSerializationSLAM.cpp @@ -16,12 +16,12 @@ * @date Feb 7, 2012 */ -#include -#include #include #include #include - +#include +#include +#include #include #include diff --git a/gtsam/slam/tests/testSimulated2DOriented.cpp b/gtsam/slam/tests/testSimulated2DOriented.cpp index b3d6e8d9e..afca72402 100644 --- a/gtsam/slam/tests/testSimulated2DOriented.cpp +++ b/gtsam/slam/tests/testSimulated2DOriented.cpp @@ -16,17 +16,17 @@ * @brief unit tests for simulated2DOriented */ -#include -#include - -#include -#include #include #include +#include +#include +#include using namespace std; using namespace gtsam; -using namespace simulated2DOriented; + +#include +#include // Convenience for named keys Key kx(size_t i) { return Symbol('x',i); } diff --git a/gtsam/slam/tests/testStereoFactor.cpp b/gtsam/slam/tests/testStereoFactor.cpp index ffa512d96..9a8a27054 100644 --- a/gtsam/slam/tests/testStereoFactor.cpp +++ b/gtsam/slam/tests/testStereoFactor.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp index 27b930022..dc9b64f4d 100644 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 9933c4d9f..32824b60e 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include diff --git a/gtsam_unstable/slam/simulated3D.h b/gtsam_unstable/slam/simulated3D.h index 66552b926..ef79991b8 100644 --- a/gtsam_unstable/slam/simulated3D.h +++ b/gtsam_unstable/slam/simulated3D.h @@ -23,7 +23,6 @@ #include #include #include -#include // \namespace diff --git a/gtsam_unstable/slam/tests/testSimulated3D.cpp b/gtsam_unstable/slam/tests/testSimulated3D.cpp index 5aca0ce3a..d7633f473 100644 --- a/gtsam_unstable/slam/tests/testSimulated3D.cpp +++ b/gtsam_unstable/slam/tests/testSimulated3D.cpp @@ -18,10 +18,11 @@ #include #include +#include +#include +#include #include #include -#include -#include using namespace gtsam; using namespace simulated3D; diff --git a/tests/testBoundingConstraint.cpp b/tests/testBoundingConstraint.cpp index 35b1833ee..d728742f7 100644 --- a/tests/testBoundingConstraint.cpp +++ b/tests/testBoundingConstraint.cpp @@ -15,12 +15,13 @@ * @author Alex Cunningham */ -#include - #include +#include #include #include +#include + namespace iq2D = simulated2D::inequality_constraints; using namespace std; using namespace gtsam; diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index ae8c6e00e..f175ca9f3 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -15,15 +15,17 @@ * @author Richard Roberts */ -#include -#include -#include +#include +#include +#include +#include #include #include #include -#include -#include -#include +#include +#include + +#include #include #include // for 'list_of()' diff --git a/tests/testExtendedKalmanFilter.cpp b/tests/testExtendedKalmanFilter.cpp index c0e5af4f7..9071d9c63 100644 --- a/tests/testExtendedKalmanFilter.cpp +++ b/tests/testExtendedKalmanFilter.cpp @@ -14,14 +14,15 @@ * @author Stephen Williams */ -#include - #include #include #include #include +#include #include +#include + using namespace gtsam; /* ************************************************************************* */ diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index 2cfb7a076..f380ad4e2 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -16,7 +16,14 @@ * @author Frank Dellaert **/ -#include +#include +#include +#include +#include +#include +#include + +#include #include #include // for operator += @@ -24,18 +31,10 @@ #include // for insert using namespace boost::assign; -#include - -#include -#include -#include -#include -#include +#include using namespace std; using namespace gtsam; -using namespace example; -using namespace boost; static SharedDiagonal sigma0_1 = sharedSigma(2,0.1), sigma_02 = sharedSigma(2,0.2), @@ -53,7 +52,7 @@ TEST( GaussianFactor, linearFactor ) JacobianFactor expected(ordering[kx1], -10*I,ordering[kx2], 10*I, b, noiseModel::Unit::Create(2)); // create a small linear factor graph - FactorGraph fg = createGaussianFactorGraph(ordering); + FactorGraph fg = example::createGaussianFactorGraph(ordering); // get the factor kf2 from the factor graph JacobianFactor::shared_ptr lf = fg[1]; @@ -94,7 +93,7 @@ TEST( GaussianFactor, getDim ) { // get a factor Ordering ordering; ordering += kx1,kx2,kl1; - GaussianFactorGraph fg = createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); GaussianFactor::shared_ptr factor = fg[0]; // get the size of a variable @@ -166,13 +165,13 @@ TEST( GaussianFactor, error ) { // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - GaussianFactorGraph fg = createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); // get the first factor from the factor graph GaussianFactor::shared_ptr lf = fg[0]; // check the error of the first factor with noisy config - VectorValues cfg = createZeroDelta(ordering); + VectorValues cfg = example::createZeroDelta(ordering); // calculate the error from the factor kf1 // note the error is the same as in testNonlinearFactor @@ -226,7 +225,7 @@ TEST( GaussianFactor, matrix ) { // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - FactorGraph fg = createGaussianFactorGraph(ordering); + FactorGraph fg = example::createGaussianFactorGraph(ordering); // get the factor kf2 from the factor graph //GaussianFactor::shared_ptr lf = fg[1]; // NOTE: using the older version @@ -263,7 +262,7 @@ TEST( GaussianFactor, matrix ) EQUALITY(b_act2,b2); // Ensure that whitening is consistent - shared_ptr model = lf->get_model(); + boost::shared_ptr model = lf->get_model(); model->WhitenSystem(A_act2, b_act2); EQUALITY(A_act1, A_act2); EQUALITY(b_act1, b_act2); @@ -274,7 +273,7 @@ TEST( GaussianFactor, matrix_aug ) { // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - FactorGraph fg = createGaussianFactorGraph(ordering); + FactorGraph fg = example::createGaussianFactorGraph(ordering); // get the factor kf2 from the factor graph //GaussianFactor::shared_ptr lf = fg[1]; @@ -307,7 +306,7 @@ TEST( GaussianFactor, matrix_aug ) EQUALITY(Ab_act2,Ab2); // Ensure that whitening is consistent - shared_ptr model = lf->get_model(); + boost::shared_ptr model = lf->get_model(); model->WhitenInPlace(Ab_act1); EQUALITY(Ab_act1, Ab_act2); } @@ -385,7 +384,7 @@ TEST( GaussianFactor, size ) { // create a linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - GaussianFactorGraph fg = createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); // get some factors from the graph boost::shared_ptr factor1 = fg[0]; diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 2e68200f5..6eb673018 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -15,9 +15,16 @@ * @author Christian Potthast **/ -#include -#include -using namespace std; +#include +#include +#include +#include +#include +#include +#include +#include + +#include #include #include @@ -26,16 +33,10 @@ using namespace std; #include // for operator += using namespace boost::assign; -#include - -#include -#include -#include -#include -#include -#include -#include +#include +#include +using namespace std; using namespace gtsam; using namespace example; diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index 4c798aa8d..d4946a625 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -15,20 +15,21 @@ * @author Michael Kaess */ -#include -#include // for operator += -using namespace boost::assign; - -#include - -#include +#include #include +#include #include -#include #include #include #include -#include +#include +#include + +#include + +#include +#include // for operator += +using namespace boost::assign; using namespace std; using namespace gtsam; diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 6ec160a5d..7d73ef83b 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -15,9 +15,20 @@ * @author nikai */ -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include + +#include #include #include // for operator += @@ -25,16 +36,7 @@ #include using namespace boost::assign; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include using namespace std; using namespace gtsam; diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index 05573c686..e023fe7e3 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -17,6 +17,7 @@ #include +#include #include #include #include diff --git a/tests/testNonlinearEquality.cpp b/tests/testNonlinearEquality.cpp index 639e67591..2b35e9f60 100644 --- a/tests/testNonlinearEquality.cpp +++ b/tests/testNonlinearEquality.cpp @@ -14,15 +14,16 @@ * @author Alex Cunningham */ -#include - -#include #include #include #include +#include #include #include #include +#include + +#include using namespace std; using namespace gtsam; diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index d1a891356..eac14d480 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -32,6 +32,7 @@ #include #include #include +#include using namespace std; using namespace gtsam; diff --git a/tests/testNonlinearFactorGraph.cpp b/tests/testNonlinearFactorGraph.cpp index 4f3e7560f..59ee0977e 100644 --- a/tests/testNonlinearFactorGraph.cpp +++ b/tests/testNonlinearFactorGraph.cpp @@ -32,6 +32,7 @@ using namespace boost::assign; #include #include #include +#include using namespace gtsam; using namespace example; diff --git a/tests/testNonlinearISAM.cpp b/tests/testNonlinearISAM.cpp index cf8782e09..28926ff5d 100644 --- a/tests/testNonlinearISAM.cpp +++ b/tests/testNonlinearISAM.cpp @@ -7,6 +7,7 @@ #include #include +#include #include using namespace gtsam; diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index 1a134b8a3..a59584c96 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include diff --git a/tests/testRot3Optimization.cpp b/tests/testRot3Optimization.cpp index df2471933..3e78414e9 100644 --- a/tests/testRot3Optimization.cpp +++ b/tests/testRot3Optimization.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include diff --git a/tests/testSymbolicBayesNetB.cpp b/tests/testSymbolicBayesNetB.cpp index e25cf33ca..356f4bb34 100644 --- a/tests/testSymbolicBayesNetB.cpp +++ b/tests/testSymbolicBayesNetB.cpp @@ -26,6 +26,7 @@ using namespace boost::assign; #include #include #include +#include using namespace std; using namespace gtsam; diff --git a/tests/testSymbolicFactorGraphB.cpp b/tests/testSymbolicFactorGraphB.cpp index 9b195e0c1..cb64ddb4a 100644 --- a/tests/testSymbolicFactorGraphB.cpp +++ b/tests/testSymbolicFactorGraphB.cpp @@ -15,20 +15,20 @@ * @author Frank Dellaert */ -#include // for operator += -using namespace boost::assign; - -#include - #include +#include +#include #include #include #include -#include + +#include + +#include // for operator += +using namespace boost::assign; using namespace std; using namespace gtsam; -using namespace example; Key kx(size_t i) { return Symbol('x',i); } Key kl(size_t i) { return Symbol('l',i); } @@ -45,7 +45,7 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) expected.push_factor(o[kx(2)],o[kl(1)]); // construct it from the factor graph - GaussianFactorGraph factorGraph = createGaussianFactorGraph(o); + GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(o); SymbolicFactorGraph actual(factorGraph); CHECK(assert_equal(expected, actual)); @@ -55,7 +55,7 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) //TEST( SymbolicFactorGraph, findAndRemoveFactors ) //{ // // construct it from the factor graph graph -// GaussianFactorGraph factorGraph = createGaussianFactorGraph(); +// GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(); // SymbolicFactorGraph actual(factorGraph); // SymbolicFactor::shared_ptr f1 = actual[0]; // SymbolicFactor::shared_ptr f3 = actual[2]; @@ -75,7 +75,7 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) //TEST( SymbolicFactorGraph, factors) //{ // // create a test graph -// GaussianFactorGraph factorGraph = createGaussianFactorGraph(); +// GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(); // SymbolicFactorGraph fg(factorGraph); // // // ask for all factor indices connected to x1 @@ -95,7 +95,7 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) //TEST( SymbolicFactorGraph, removeAndCombineFactors ) //{ // // create a test graph -// GaussianFactorGraph factorGraph = createGaussianFactorGraph(); +// GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(); // SymbolicFactorGraph fg(factorGraph); // // // combine all factors connected to x1 @@ -111,7 +111,7 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) //{ // Ordering o; o += kx(1),kl(1),kx(2); // // create a test graph -// GaussianFactorGraph factorGraph = createGaussianFactorGraph(o); +// GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(o); // SymbolicFactorGraph fg(factorGraph); // // // eliminate @@ -139,7 +139,7 @@ TEST( SymbolicFactorGraph, eliminate ) expected.push_back(x1); // create a test graph - GaussianFactorGraph factorGraph = createGaussianFactorGraph(o); + GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(o); SymbolicFactorGraph fg(factorGraph); // eliminate it From 8440939f27f2fe550b2ca19642010e4d8240cf60 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 2 Jun 2012 19:28:21 +0000 Subject: [PATCH 093/914] Using symbol_shorthand instead of redundant kx, kl functions --- examples/vSLAMexample/vISAMexample.cpp | 14 +- examples/vSLAMexample/vSFMexample.cpp | 14 +- gtsam/nonlinear/tests/testValues.cpp | 8 +- gtsam/slam/smallExample.cpp | 58 ++--- gtsam/slam/tests/testGeneralSFMFactor.cpp | 236 +++++++++--------- .../testGeneralSFMFactor_Cal3Bundler.cpp | 226 +++++++++-------- gtsam/slam/tests/testProjectionFactor.cpp | 26 +- gtsam/slam/tests/testSerializationSLAM.cpp | 6 +- gtsam/slam/tests/testSimulated2DOriented.cpp | 10 +- gtsam/slam/tests/testStereoFactor.cpp | 12 +- gtsam/slam/tests/testVisualSLAM.cpp | 92 +++---- gtsam_unstable/slam/tests/testSimulated3D.cpp | 16 +- tests/testDoglegOptimizer.cpp | 8 +- tests/testExtendedKalmanFilter.cpp | 8 +- tests/testGaussianFactor.cpp | 6 +- tests/testGaussianFactorGraphB.cpp | 236 +++++++++--------- tests/testGaussianISAM.cpp | 94 +++---- tests/testGaussianJunctionTreeB.cpp | 66 ++--- tests/testInferenceB.cpp | 26 +- tests/testNonlinearFactor.cpp | 96 +++---- tests/testNonlinearFactorGraph.cpp | 18 +- tests/testNonlinearOptimizer.cpp | 42 ++-- tests/testSymbolicBayesNetB.cpp | 12 +- tests/testSymbolicFactorGraphB.cpp | 38 +-- 24 files changed, 704 insertions(+), 664 deletions(-) diff --git a/examples/vSLAMexample/vISAMexample.cpp b/examples/vSLAMexample/vISAMexample.cpp index d23ea9b10..16c250953 100644 --- a/examples/vSLAMexample/vISAMexample.cpp +++ b/examples/vSLAMexample/vISAMexample.cpp @@ -32,6 +32,10 @@ using boost::shared_ptr; using namespace std; using namespace gtsam; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + /* ************************************************************************* */ #define CALIB_FILE "calib.txt" #define LANDMARKS_FILE "landmarks.txt" @@ -83,22 +87,22 @@ void createNewFactors(shared_ptr& newFactors, boost::shared_p newFactors->addMeasurement( measurements[i].m_p, measurementSigma, - Symbol('x',pose_id), - Symbol('l',measurements[i].m_idLandmark), + X(pose_id), + L(measurements[i].m_idLandmark), calib); } // ... we need priors on the new pose and all new landmarks newFactors->addPosePrior(pose_id, pose, poseSigma); for (size_t i = 0; i < measurements.size(); i++) { - newFactors->addPointPrior(Symbol('x',measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); + newFactors->addPointPrior(X(measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); } // Create initial values for all nodes in the newFactors initialValues = shared_ptr (new Values()); - initialValues->insert(Symbol('x',pose_id), pose); + initialValues->insert(X(pose_id), pose); for (size_t i = 0; i < measurements.size(); i++) { - initialValues->insert(Symbol('l',measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); + initialValues->insert(L(measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); } } diff --git a/examples/vSLAMexample/vSFMexample.cpp b/examples/vSLAMexample/vSFMexample.cpp index be41ad831..66e9a475b 100644 --- a/examples/vSLAMexample/vSFMexample.cpp +++ b/examples/vSLAMexample/vSFMexample.cpp @@ -30,6 +30,10 @@ using boost::shared_ptr; using namespace std; using namespace gtsam; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + /* ************************************************************************* */ #define CALIB_FILE "calib.txt" #define LANDMARKS_FILE "landmarks.txt" @@ -84,8 +88,8 @@ visualSLAM::Graph setupGraph(std::vector& measurements, SharedNoiseMo g.addMeasurement( measurements[i].m_p, measurementSigma, - Symbol('x',measurements[i].m_idCamera), - Symbol('l',measurements[i].m_idLandmark), + X(measurements[i].m_idCamera), + L(measurements[i].m_idLandmark), calib); } @@ -103,11 +107,11 @@ Values initialize(std::map landmarks, std::map poses) { // Initialize landmarks 3D positions. for (map::iterator lmit = landmarks.begin(); lmit != landmarks.end(); lmit++) - initValues.insert(Symbol('l',lmit->first), lmit->second); + initValues.insert(L(lmit->first), lmit->second); // Initialize camera poses. for (map::iterator poseit = poses.begin(); poseit != poses.end(); poseit++) - initValues.insert(Symbol('x',poseit->first), poseit->second); + initValues.insert(X(poseit->first), poseit->second); return initValues; } @@ -137,7 +141,7 @@ int main(int argc, char* argv[]) { // Add prior factor for all poses in the graph map::iterator poseit = g_poses.begin(); for (; poseit != g_poses.end(); poseit++) - graph.addPosePrior(Symbol('x',poseit->first), poseit->second, noiseModel::Unit::Create(1)); + graph.addPosePrior(X(poseit->first), poseit->second, noiseModel::Unit::Create(1)); // Optimize the graph cout << "*******************************************************" << endl; diff --git a/gtsam/nonlinear/tests/testValues.cpp b/gtsam/nonlinear/tests/testValues.cpp index f5caa846b..3818e99a2 100644 --- a/gtsam/nonlinear/tests/testValues.cpp +++ b/gtsam/nonlinear/tests/testValues.cpp @@ -32,6 +32,10 @@ using namespace gtsam; using namespace std; static double inf = std::numeric_limits::infinity(); +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + const Symbol key1('v',1), key2('v',2), key3('v',3), key4('v',4); /* ************************************************************************* */ @@ -333,9 +337,9 @@ TEST(Values, Symbol_filter) { Pose3 pose3(Pose2(0.3, 0.7, 0.9)); Values values; - values.insert(Symbol('x',0), pose0); + values.insert(X(0), pose0); values.insert(Symbol('y',1), pose1); - values.insert(Symbol('x',2), pose2); + values.insert(X(2), pose2); values.insert(Symbol('y',3), pose3); int i = 0; diff --git a/gtsam/slam/smallExample.cpp b/gtsam/slam/smallExample.cpp index b0e709a80..5b0ee90dd 100644 --- a/gtsam/slam/smallExample.cpp +++ b/gtsam/slam/smallExample.cpp @@ -47,8 +47,8 @@ namespace example { static const Index _x_=0, _y_=1, _z_=2; // Convenience for named keys - Key kx(size_t i) { return Symbol('x',i); } - Key kl(size_t i) { return Symbol('l',i); } + using symbol_shorthand::X; + using symbol_shorthand::L; /* ************************************************************************* */ boost::shared_ptr sharedNonlinearFactorGraph() { @@ -58,22 +58,22 @@ namespace example { // prior on x1 Point2 mu; - shared f1(new simulated2D::Prior(mu, sigma0_1, kx(1))); + shared f1(new simulated2D::Prior(mu, sigma0_1, X(1))); nlfg->push_back(f1); // odometry between x1 and x2 Point2 z2(1.5, 0); - shared f2(new simulated2D::Odometry(z2, sigma0_1, kx(1), kx(2))); + shared f2(new simulated2D::Odometry(z2, sigma0_1, X(1), X(2))); nlfg->push_back(f2); // measurement between x1 and l1 Point2 z3(0, -1); - shared f3(new simulated2D::Measurement(z3, sigma0_2, kx(1), kl(1))); + shared f3(new simulated2D::Measurement(z3, sigma0_2, X(1), L(1))); nlfg->push_back(f3); // measurement between x2 and l1 Point2 z4(-1.5, -1.); - shared f4(new simulated2D::Measurement(z4, sigma0_2, kx(2), kl(1))); + shared f4(new simulated2D::Measurement(z4, sigma0_2, X(2), L(1))); nlfg->push_back(f4); return nlfg; @@ -87,9 +87,9 @@ namespace example { /* ************************************************************************* */ Values createValues() { Values c; - c.insert(kx(1), Point2(0.0, 0.0)); - c.insert(kx(2), Point2(1.5, 0.0)); - c.insert(kl(1), Point2(0.0, -1.0)); + c.insert(X(1), Point2(0.0, 0.0)); + c.insert(X(2), Point2(1.5, 0.0)); + c.insert(L(1), Point2(0.0, -1.0)); return c; } @@ -105,9 +105,9 @@ namespace example { /* ************************************************************************* */ boost::shared_ptr sharedNoisyValues() { boost::shared_ptr c(new Values); - c->insert(kx(1), Point2(0.1, 0.1)); - c->insert(kx(2), Point2(1.4, 0.2)); - c->insert(kl(1), Point2(0.1, -1.1)); + c->insert(X(1), Point2(0.1, 0.1)); + c->insert(X(2), Point2(1.4, 0.2)); + c->insert(L(1), Point2(0.1, -1.1)); return c; } @@ -119,18 +119,18 @@ namespace example { /* ************************************************************************* */ VectorValues createCorrectDelta(const Ordering& ordering) { VectorValues c(vector(3,2)); - c[ordering[kl(1)]] = Vector_(2, -0.1, 0.1); - c[ordering[kx(1)]] = Vector_(2, -0.1, -0.1); - c[ordering[kx(2)]] = Vector_(2, 0.1, -0.2); + c[ordering[L(1)]] = Vector_(2, -0.1, 0.1); + c[ordering[X(1)]] = Vector_(2, -0.1, -0.1); + c[ordering[X(2)]] = Vector_(2, 0.1, -0.2); return c; } /* ************************************************************************* */ VectorValues createZeroDelta(const Ordering& ordering) { VectorValues c(vector(3,2)); - c[ordering[kl(1)]] = zero(2); - c[ordering[kx(1)]] = zero(2); - c[ordering[kx(2)]] = zero(2); + c[ordering[L(1)]] = zero(2); + c[ordering[X(1)]] = zero(2); + c[ordering[X(2)]] = zero(2); return c; } @@ -142,16 +142,16 @@ namespace example { SharedDiagonal unit2 = noiseModel::Unit::Create(2); // linearized prior on x1: c[_x1_]+x1=0 i.e. x1=-c[_x1_] - fg.add(ordering[kx(1)], 10*eye(2), -1.0*ones(2), unit2); + fg.add(ordering[X(1)], 10*eye(2), -1.0*ones(2), unit2); // odometry between x1 and x2: x2-x1=[0.2;-0.1] - fg.add(ordering[kx(1)], -10*eye(2),ordering[kx(2)], 10*eye(2), Vector_(2, 2.0, -1.0), unit2); + fg.add(ordering[X(1)], -10*eye(2),ordering[X(2)], 10*eye(2), Vector_(2, 2.0, -1.0), unit2); // measurement between x1 and l1: l1-x1=[0.0;0.2] - fg.add(ordering[kx(1)], -5*eye(2), ordering[kl(1)], 5*eye(2), Vector_(2, 0.0, 1.0), unit2); + fg.add(ordering[X(1)], -5*eye(2), ordering[L(1)], 5*eye(2), Vector_(2, 0.0, 1.0), unit2); // measurement between x2 and l1: l1-x2=[-0.2;0.3] - fg.add(ordering[kx(2)], -5*eye(2), ordering[kl(1)], 5*eye(2), Vector_(2, -1.0, 1.5), unit2); + fg.add(ordering[X(2)], -5*eye(2), ordering[L(1)], 5*eye(2), Vector_(2, -1.0, 1.5), unit2); return *fg.dynamicCastFactors >(); } @@ -221,7 +221,7 @@ namespace example { Vector z = Vector_(2, 1.0, 0.0); double sigma = 0.1; boost::shared_ptr factor( - new smallOptimize::UnaryFactor(z, noiseModel::Isotropic::Sigma(2,sigma), kx(1))); + new smallOptimize::UnaryFactor(z, noiseModel::Isotropic::Sigma(2,sigma), X(1))); fg->push_back(factor); return fg; } @@ -239,23 +239,23 @@ namespace example { // prior on x1 Point2 x1(1.0, 0.0); - shared prior(new simulated2D::Prior(x1, sigma1_0, kx(1))); + shared prior(new simulated2D::Prior(x1, sigma1_0, X(1))); nlfg.push_back(prior); - poses.insert(kx(1), x1); + poses.insert(X(1), x1); for (int t = 2; t <= T; t++) { // odometry between x_t and x_{t-1} Point2 odo(1.0, 0.0); - shared odometry(new simulated2D::Odometry(odo, sigma1_0, kx(t - 1), kx(t))); + shared odometry(new simulated2D::Odometry(odo, sigma1_0, X(t - 1), X(t))); nlfg.push_back(odometry); // measurement on x_t is like perfect GPS Point2 xt(t, 0); - shared measurement(new simulated2D::Prior(xt, sigma1_0, kx(t))); + shared measurement(new simulated2D::Prior(xt, sigma1_0, X(t))); nlfg.push_back(measurement); // initial estimate - poses.insert(kx(t), xt); + poses.insert(X(t), xt); } return make_pair(nlfg, poses); @@ -416,7 +416,7 @@ namespace example { /* ************************************************************************* */ // Create key for simulated planar graph Symbol key(int x, int y) { - return kx(1000*x+y); + return X(1000*x+y); } /* ************************************************************************* */ diff --git a/gtsam/slam/tests/testGeneralSFMFactor.cpp b/gtsam/slam/tests/testGeneralSFMFactor.cpp index f9911ce7d..1b924aa55 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor.cpp @@ -38,6 +38,10 @@ using namespace boost; using namespace std; using namespace gtsam; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + typedef PinholeCamera GeneralCamera; typedef GeneralSFMFactor Projection; typedef NonlinearEquality CameraConstraint; @@ -46,16 +50,16 @@ typedef NonlinearEquality Point3Constraint; class Graph: public NonlinearFactorGraph { public: void addMeasurement(int i, int j, const Point2& z, const SharedNoiseModel& model) { - push_back(boost::make_shared(z, model, Symbol('x',i), Symbol('l',j))); + push_back(boost::make_shared(z, model, X(i), L(j))); } void addCameraConstraint(int j, const GeneralCamera& p) { - boost::shared_ptr factor(new CameraConstraint(Symbol('x',j), p)); + boost::shared_ptr factor(new CameraConstraint(X(j), p)); push_back(factor); } void addPoint3Constraint(int j, const Point3& p) { - boost::shared_ptr factor(new Point3Constraint(Symbol('l',j), p)); + boost::shared_ptr factor(new Point3Constraint(L(j), p)); push_back(factor); } @@ -98,14 +102,14 @@ TEST( GeneralSFMFactor, equals ) TEST( GeneralSFMFactor, error ) { Point2 z(3.,0.); const SharedNoiseModel sigma(noiseModel::Unit::Create(1)); - boost::shared_ptr factor(new Projection(z, sigma, Symbol('x',1), Symbol('l',1))); + boost::shared_ptr factor(new Projection(z, sigma, X(1), L(1))); // For the following configuration, the factor predicts 320,240 Values values; Rot3 R; Point3 t1(0,0,-6); Pose3 x1(R,t1); - values.insert(Symbol('x',1), GeneralCamera(x1)); - Point3 l1; values.insert(Symbol('l',1), l1); + values.insert(X(1), GeneralCamera(x1)); + Point3 l1; values.insert(L(1), l1); EXPECT(assert_equal(Vector_(2, -3.0, 0.0), factor->unwhitenedError(values))); } @@ -114,20 +118,20 @@ static const double baseline = 5.0 ; /* ************************************************************************* */ vector genPoint3() { const double z = 5; - vector L ; - L.push_back(Point3 (-1.0,-1.0, z)); - L.push_back(Point3 (-1.0, 1.0, z)); - L.push_back(Point3 ( 1.0, 1.0, z)); - L.push_back(Point3 ( 1.0,-1.0, z)); - L.push_back(Point3 (-1.5,-1.5, 1.5*z)); - L.push_back(Point3 (-1.5, 1.5, 1.5*z)); - L.push_back(Point3 ( 1.5, 1.5, 1.5*z)); - L.push_back(Point3 ( 1.5,-1.5, 1.5*z)); - L.push_back(Point3 (-2.0,-2.0, 2*z)); - L.push_back(Point3 (-2.0, 2.0, 2*z)); - L.push_back(Point3 ( 2.0, 2.0, 2*z)); - L.push_back(Point3 ( 2.0,-2.0, 2*z)); - return L ; + vector landmarks ; + landmarks.push_back(Point3 (-1.0,-1.0, z)); + landmarks.push_back(Point3 (-1.0, 1.0, z)); + landmarks.push_back(Point3 ( 1.0, 1.0, z)); + landmarks.push_back(Point3 ( 1.0,-1.0, z)); + landmarks.push_back(Point3 (-1.5,-1.5, 1.5*z)); + landmarks.push_back(Point3 (-1.5, 1.5, 1.5*z)); + landmarks.push_back(Point3 ( 1.5, 1.5, 1.5*z)); + landmarks.push_back(Point3 ( 1.5,-1.5, 1.5*z)); + landmarks.push_back(Point3 (-2.0,-2.0, 2*z)); + landmarks.push_back(Point3 (-2.0, 2.0, 2*z)); + landmarks.push_back(Point3 ( 2.0, 2.0, 2*z)); + landmarks.push_back(Point3 ( 2.0,-2.0, 2*z)); + return landmarks ; } vector genCameraDefaultCalibration() { @@ -145,10 +149,10 @@ vector genCameraVariableCalibration() { return X ; } -shared_ptr getOrdering(const vector& X, const vector& L) { +shared_ptr getOrdering(const vector& cameras, const vector& landmarks) { shared_ptr ordering(new Ordering); - for ( size_t i = 0 ; i < L.size() ; ++i ) ordering->push_back(Symbol('l', i)) ; - for ( size_t i = 0 ; i < X.size() ; ++i ) ordering->push_back(Symbol('x', i)) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) ordering->push_back(L(i)) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) ordering->push_back(X(i)) ; return ordering ; } @@ -156,37 +160,37 @@ shared_ptr getOrdering(const vector& X, const vector L = genPoint3(); - vector X = genCameraDefaultCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraDefaultCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = X.size()*L.size() ; + const size_t nMeasurements = cameras.size()*landmarks.size() ; // add initial const double noise = baseline*0.1; Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; - for ( size_t i = 0 ; i < L.size() ; ++i ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - values.insert(Symbol('l',i), pt) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + values.insert(L(i), pt) ; } - graph.addCameraConstraint(0, X[0]); + graph.addCameraConstraint(0, cameras[0]); // Create an ordering of the variables - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * 1e-5 * nMeasurements); @@ -194,42 +198,42 @@ TEST( GeneralSFMFactor, optimize_defaultK ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = X.size()*L.size() ; + const size_t nMeasurements = cameras.size()*landmarks.size() ; // add initial const double noise = baseline*0.1; Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; // add noise only to the first landmark - for ( size_t i = 0 ; i < L.size() ; ++i ) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { if ( i == 0 ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - values.insert(Symbol('l',i), pt) ; + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + values.insert(L(i), pt) ; } else { - values.insert(Symbol('l',i), L[i]) ; + values.insert(L(i), landmarks[i]) ; } } - graph.addCameraConstraint(0, X[0]); + graph.addCameraConstraint(0, cameras[0]); const double reproj_error = 1e-5; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); @@ -238,39 +242,39 @@ TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_FixCameras ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise const double noise = baseline*0.1; Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = L.size()*X.size(); + const size_t nMeasurements = landmarks.size()*cameras.size(); Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; - for ( size_t i = 0 ; i < L.size() ; ++i ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - //Point3 pt(L[i].x(), L[i].y(), L[i].z()); - values.insert(Symbol('l',i), pt) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + //Point3 pt(landmarks[i].x(), landmarks[i].y(), landmarks[i].z()); + values.insert(L(i), pt) ; } - for ( size_t i = 0 ; i < X.size() ; ++i ) - graph.addCameraConstraint(i, X[i]); + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + graph.addCameraConstraint(i, cameras[i]); const double reproj_error = 1e-5 ; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); @@ -279,29 +283,29 @@ TEST( GeneralSFMFactor, optimize_varK_FixCameras ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = L.size()*X.size(); + const size_t nMeasurements = landmarks.size()*cameras.size(); Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) { + for ( size_t i = 0 ; i < cameras.size() ; ++i ) { const double rot_noise = 1e-5, trans_noise = 1e-3, focal_noise = 1, skew_noise = 1e-5; if ( i == 0 ) { - values.insert(Symbol('x',i), X[i]) ; + values.insert(X(i), cameras[i]) ; } else { @@ -312,22 +316,22 @@ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { skew_noise, // s trans_noise, trans_noise // ux, uy ) ; - values.insert(Symbol('x',i), X[i].retract(delta)) ; + values.insert(X(i), cameras[i].retract(delta)) ; } } - for ( size_t i = 0 ; i < L.size() ; ++i ) { - values.insert(Symbol('l',i), L[i]) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + values.insert(L(i), landmarks[i]) ; } - // fix X0 and all landmarks, allow only the X[1] to move - graph.addCameraConstraint(0, X[0]); - for ( size_t i = 0 ; i < L.size() ; ++i ) - graph.addPoint3Constraint(i, L[i]); + // fix X0 and all landmarks, allow only the cameras[1] to move + graph.addCameraConstraint(0, cameras[0]); + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) + graph.addPoint3Constraint(i, landmarks[i]); const double reproj_error = 1e-5 ; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); @@ -335,43 +339,43 @@ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_BA ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = X.size()*L.size() ; + const size_t nMeasurements = cameras.size()*landmarks.size() ; // add initial const double noise = baseline*0.1; Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; // add noise only to the first landmark - for ( size_t i = 0 ; i < L.size() ; ++i ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - values.insert(Symbol('l',i), pt) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + values.insert(L(i), pt) ; } // Constrain position of system with the first camera constrained to the origin - graph.addCameraConstraint(0, X[0]); + graph.addCameraConstraint(0, cameras[0]); // Constrain the scale of the problem with a soft range factor of 1m between the cameras - graph.add(RangeFactor(Symbol('x',0), Symbol('x',1), 2.0, sharedSigma(1, 10.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 10.0))); const double reproj_error = 1e-5 ; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); @@ -382,17 +386,17 @@ TEST(GeneralSFMFactor, GeneralCameraPoseRange) { // Tests range factor between a GeneralCamera and a Pose3 Graph graph; graph.addCameraConstraint(0, GeneralCamera()); - graph.add(RangeFactor(Symbol('x',0), Symbol('x',1), 2.0, sharedSigma(1, 1.0))); - graph.add(PriorFactor(Symbol('x',1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), sharedSigma(6, 1.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 1.0))); + graph.add(PriorFactor(X(1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), sharedSigma(6, 1.0))); Values init; - init.insert(Symbol('x',0), GeneralCamera()); - init.insert(Symbol('x',1), Pose3(Rot3(), Point3(1.0,1.0,1.0))); + init.insert(X(0), GeneralCamera()); + init.insert(X(1), Pose3(Rot3(), Point3(1.0,1.0,1.0))); // The optimal value between the 2m range factor and 1m prior is 1.5m Values expected; - expected.insert(Symbol('x',0), GeneralCamera()); - expected.insert(Symbol('x',1), Pose3(Rot3(), Point3(1.5,0.0,0.0))); + expected.insert(X(0), GeneralCamera()); + expected.insert(X(1), Pose3(Rot3(), Point3(1.5,0.0,0.0))); LevenbergMarquardtParams params; params.absoluteErrorTol = 1e-9; @@ -406,17 +410,17 @@ TEST(GeneralSFMFactor, GeneralCameraPoseRange) { TEST(GeneralSFMFactor, CalibratedCameraPoseRange) { // Tests range factor between a CalibratedCamera and a Pose3 NonlinearFactorGraph graph; - graph.add(PriorFactor(Symbol('x',0), CalibratedCamera(), sharedSigma(6, 1.0))); - graph.add(RangeFactor(Symbol('x',0), Symbol('x',1), 2.0, sharedSigma(1, 1.0))); - graph.add(PriorFactor(Symbol('x',1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), sharedSigma(6, 1.0))); + graph.add(PriorFactor(X(0), CalibratedCamera(), sharedSigma(6, 1.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 1.0))); + graph.add(PriorFactor(X(1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), sharedSigma(6, 1.0))); Values init; - init.insert(Symbol('x',0), CalibratedCamera()); - init.insert(Symbol('x',1), Pose3(Rot3(), Point3(1.0,1.0,1.0))); + init.insert(X(0), CalibratedCamera()); + init.insert(X(1), Pose3(Rot3(), Point3(1.0,1.0,1.0))); Values expected; - expected.insert(Symbol('x',0), CalibratedCamera(Pose3(Rot3(), Point3(-0.333333333333, 0, 0)))); - expected.insert(Symbol('x',1), Pose3(Rot3(), Point3(1.333333333333, 0, 0))); + expected.insert(X(0), CalibratedCamera(Pose3(Rot3(), Point3(-0.333333333333, 0, 0)))); + expected.insert(X(1), Pose3(Rot3(), Point3(1.333333333333, 0, 0))); LevenbergMarquardtParams params; params.absoluteErrorTol = 1e-9; diff --git a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp index 7698acae4..142c27e7e 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp @@ -38,6 +38,10 @@ using namespace std; using namespace gtsam; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + typedef PinholeCamera GeneralCamera; typedef GeneralSFMFactor Projection; typedef NonlinearEquality CameraConstraint; @@ -47,16 +51,16 @@ typedef NonlinearEquality Point3Constraint; class Graph: public NonlinearFactorGraph { public: void addMeasurement(const int& i, const int& j, const Point2& z, const SharedNoiseModel& model) { - push_back(boost::make_shared(z, model, Symbol('x',i), Symbol('l',j))); + push_back(boost::make_shared(z, model, X(i), L(j))); } void addCameraConstraint(int j, const GeneralCamera& p) { - boost::shared_ptr factor(new CameraConstraint(Symbol('x', j), p)); + boost::shared_ptr factor(new CameraConstraint(X(j), p)); push_back(factor); } void addPoint3Constraint(int j, const Point3& p) { - boost::shared_ptr factor(new Point3Constraint(Symbol('l', j), p)); + boost::shared_ptr factor(new Point3Constraint(L(j), p)); push_back(factor); } @@ -100,14 +104,14 @@ TEST( GeneralSFMFactor, error ) { Point2 z(3.,0.); const SharedNoiseModel sigma(noiseModel::Unit::Create(1)); boost::shared_ptr - factor(new Projection(z, sigma, Symbol('x',1), Symbol('l',1))); + factor(new Projection(z, sigma, X(1), L(1))); // For the following configuration, the factor predicts 320,240 Values values; Rot3 R; Point3 t1(0,0,-6); Pose3 x1(R,t1); - values.insert(Symbol('x',1), GeneralCamera(x1)); - Point3 l1; values.insert(Symbol('l',1), l1); + values.insert(X(1), GeneralCamera(x1)); + Point3 l1; values.insert(L(1), l1); EXPECT(assert_equal(Vector_(2, -3.0, 0.0), factor->unwhitenedError(values))); } @@ -117,78 +121,78 @@ static const double baseline = 5.0 ; /* ************************************************************************* */ vector genPoint3() { const double z = 5; - vector L ; - L.push_back(Point3 (-1.0,-1.0, z)); - L.push_back(Point3 (-1.0, 1.0, z)); - L.push_back(Point3 ( 1.0, 1.0, z)); - L.push_back(Point3 ( 1.0,-1.0, z)); - L.push_back(Point3 (-1.5,-1.5, 1.5*z)); - L.push_back(Point3 (-1.5, 1.5, 1.5*z)); - L.push_back(Point3 ( 1.5, 1.5, 1.5*z)); - L.push_back(Point3 ( 1.5,-1.5, 1.5*z)); - L.push_back(Point3 (-2.0,-2.0, 2*z)); - L.push_back(Point3 (-2.0, 2.0, 2*z)); - L.push_back(Point3 ( 2.0, 2.0, 2*z)); - L.push_back(Point3 ( 2.0,-2.0, 2*z)); - return L ; + vector landmarks ; + landmarks.push_back(Point3 (-1.0,-1.0, z)); + landmarks.push_back(Point3 (-1.0, 1.0, z)); + landmarks.push_back(Point3 ( 1.0, 1.0, z)); + landmarks.push_back(Point3 ( 1.0,-1.0, z)); + landmarks.push_back(Point3 (-1.5,-1.5, 1.5*z)); + landmarks.push_back(Point3 (-1.5, 1.5, 1.5*z)); + landmarks.push_back(Point3 ( 1.5, 1.5, 1.5*z)); + landmarks.push_back(Point3 ( 1.5,-1.5, 1.5*z)); + landmarks.push_back(Point3 (-2.0,-2.0, 2*z)); + landmarks.push_back(Point3 (-2.0, 2.0, 2*z)); + landmarks.push_back(Point3 ( 2.0, 2.0, 2*z)); + landmarks.push_back(Point3 ( 2.0,-2.0, 2*z)); + return landmarks ; } vector genCameraDefaultCalibration() { - vector X ; - X.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)))); - X.push_back(GeneralCamera(Pose3(eye(3),Point3( baseline/2.0, 0.0, 0.0)))); - return X ; + vector cameras ; + cameras.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)))); + cameras.push_back(GeneralCamera(Pose3(eye(3),Point3( baseline/2.0, 0.0, 0.0)))); + return cameras ; } vector genCameraVariableCalibration() { const Cal3Bundler K(500,1e-3,1e-3); - vector X ; - X.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)), K)); - X.push_back(GeneralCamera(Pose3(eye(3),Point3( baseline/2.0, 0.0, 0.0)), K)); - return X ; + vector cameras ; + cameras.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)), K)); + cameras.push_back(GeneralCamera(Pose3(eye(3),Point3( baseline/2.0, 0.0, 0.0)), K)); + return cameras ; } -boost::shared_ptr getOrdering(const std::vector& X, const std::vector& L) { +boost::shared_ptr getOrdering(const std::vector& cameras, const std::vector& landmarks) { boost::shared_ptr ordering(new Ordering); - for ( size_t i = 0 ; i < L.size() ; ++i ) ordering->push_back(Symbol('l', i)) ; - for ( size_t i = 0 ; i < X.size() ; ++i ) ordering->push_back(Symbol('x', i)) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) ordering->push_back(L(i)) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) ordering->push_back(X(i)) ; return ordering ; } /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_defaultK ) { - vector L = genPoint3(); - vector X = genCameraDefaultCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraDefaultCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = X.size()*L.size() ; + const size_t nMeasurements = cameras.size()*landmarks.size() ; // add initial const double noise = baseline*0.1; Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; - for ( size_t i = 0 ; i < L.size() ; ++i ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - values.insert(Symbol('l',i), pt) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + values.insert(L(i), pt) ; } - graph.addCameraConstraint(0, X[0]); + graph.addCameraConstraint(0, cameras[0]); // Create an ordering of the variables - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * 1e-5 * nMeasurements); @@ -196,42 +200,42 @@ TEST( GeneralSFMFactor, optimize_defaultK ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = X.size()*L.size() ; + const size_t nMeasurements = cameras.size()*landmarks.size() ; // add initial const double noise = baseline*0.1; Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; // add noise only to the first landmark - for ( size_t i = 0 ; i < L.size() ; ++i ) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { if ( i == 0 ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - values.insert(Symbol('l',i), pt) ; + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + values.insert(L(i), pt) ; } else { - values.insert(Symbol('l',i), L[i]) ; + values.insert(L(i), landmarks[i]) ; } } - graph.addCameraConstraint(0, X[0]); + graph.addCameraConstraint(0, cameras[0]); const double reproj_error = 1e-5; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); @@ -240,39 +244,39 @@ TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_FixCameras ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise const double noise = baseline*0.1; Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = L.size()*X.size(); + const size_t nMeasurements = landmarks.size()*cameras.size(); Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; - for ( size_t i = 0 ; i < L.size() ; ++i ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - //Point3 pt(L[i].x(), L[i].y(), L[i].z()); - values.insert(Symbol('l',i), pt) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + //Point3 pt(landmarks[i].x(), landmarks[i].y(), landmarks[i].z()); + values.insert(L(i), pt) ; } - for ( size_t i = 0 ; i < X.size() ; ++i ) - graph.addCameraConstraint(i, X[i]); + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + graph.addCameraConstraint(i, cameras[i]); const double reproj_error = 1e-5 ; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); @@ -281,27 +285,27 @@ TEST( GeneralSFMFactor, optimize_varK_FixCameras ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = L.size()*X.size(); + const size_t nMeasurements = landmarks.size()*cameras.size(); Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) { + for ( size_t i = 0 ; i < cameras.size() ; ++i ) { const double rot_noise = 1e-5, trans_noise = 1e-3, focal_noise = 1, distort_noise = 1e-3; if ( i == 0 ) { - values.insert(Symbol('x',i), X[i]) ; + values.insert(X(i), cameras[i]) ; } else { @@ -310,22 +314,22 @@ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { trans_noise, trans_noise, trans_noise, // translation focal_noise, distort_noise, distort_noise // f, k1, k2 ) ; - values.insert(Symbol('x',i), X[i].retract(delta)) ; + values.insert(X(i), cameras[i].retract(delta)) ; } } - for ( size_t i = 0 ; i < L.size() ; ++i ) { - values.insert(Symbol('l',i), L[i]) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + values.insert(L(i), landmarks[i]) ; } - // fix X0 and all landmarks, allow only the X[1] to move - graph.addCameraConstraint(0, X[0]); - for ( size_t i = 0 ; i < L.size() ; ++i ) - graph.addPoint3Constraint(i, L[i]); + // fix X0 and all landmarks, allow only the cameras[1] to move + graph.addCameraConstraint(0, cameras[0]); + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) + graph.addPoint3Constraint(i, landmarks[i]); const double reproj_error = 1e-5 ; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); @@ -333,43 +337,43 @@ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { /* ************************************************************************* */ TEST( GeneralSFMFactor, optimize_varK_BA ) { - vector L = genPoint3(); - vector X = genCameraVariableCalibration(); + vector landmarks = genPoint3(); + vector cameras = genCameraVariableCalibration(); // add measurement with noise Graph graph; - for ( size_t j = 0 ; j < X.size() ; ++j) { - for ( size_t i = 0 ; i < L.size() ; ++i) { - Point2 pt = X[j].project(L[i]) ; + for ( size_t j = 0 ; j < cameras.size() ; ++j) { + for ( size_t i = 0 ; i < landmarks.size() ; ++i) { + Point2 pt = cameras[j].project(landmarks[i]) ; graph.addMeasurement(j, i, pt, sigma1); } } - const size_t nMeasurements = X.size()*L.size() ; + const size_t nMeasurements = cameras.size()*landmarks.size() ; // add initial const double noise = baseline*0.1; Values values; - for ( size_t i = 0 ; i < X.size() ; ++i ) - values.insert(Symbol('x',i), X[i]) ; + for ( size_t i = 0 ; i < cameras.size() ; ++i ) + values.insert(X(i), cameras[i]) ; // add noise only to the first landmark - for ( size_t i = 0 ; i < L.size() ; ++i ) { - Point3 pt(L[i].x()+noise*getGaussian(), - L[i].y()+noise*getGaussian(), - L[i].z()+noise*getGaussian()); - values.insert(Symbol('l',i), pt) ; + for ( size_t i = 0 ; i < landmarks.size() ; ++i ) { + Point3 pt(landmarks[i].x()+noise*getGaussian(), + landmarks[i].y()+noise*getGaussian(), + landmarks[i].z()+noise*getGaussian()); + values.insert(L(i), pt) ; } // Constrain position of system with the first camera constrained to the origin - graph.addCameraConstraint(0, X[0]); + graph.addCameraConstraint(X(0), cameras[0]); // Constrain the scale of the problem with a soft range factor of 1m between the cameras - graph.add(RangeFactor(Symbol('x',0), Symbol('x',1), 2.0, sharedSigma(1, 10.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 10.0))); const double reproj_error = 1e-5 ; - Ordering ordering = *getOrdering(X,L); + Ordering ordering = *getOrdering(cameras,landmarks); LevenbergMarquardtOptimizer optimizer(graph, values, ordering); Values final = optimizer.optimize(); EXPECT(optimizer.error() < 0.5 * reproj_error * nMeasurements); diff --git a/gtsam/slam/tests/testProjectionFactor.cpp b/gtsam/slam/tests/testProjectionFactor.cpp index 2ec97f301..0cd357c70 100644 --- a/gtsam/slam/tests/testProjectionFactor.cpp +++ b/gtsam/slam/tests/testProjectionFactor.cpp @@ -37,8 +37,8 @@ static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); static shared_ptrK sK(new Cal3_S2(K)); // Convenience for named keys -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( ProjectionFactor, error ) @@ -47,12 +47,12 @@ TEST( ProjectionFactor, error ) Point2 z(323.,240.); int i=1, j=1; boost::shared_ptr - factor(new visualSLAM::ProjectionFactor(z, sigma, kx(i), kl(j), sK)); + factor(new visualSLAM::ProjectionFactor(z, sigma, X(i), L(j), sK)); // For the following values structure, the factor predicts 320,240 Values config; - Rot3 R;Point3 t1(0,0,-6); Pose3 x1(R,t1); config.insert(kx(1), x1); - Point3 l1; config.insert(kl(1), l1); + Rot3 R;Point3 t1(0,0,-6); Pose3 x1(R,t1); config.insert(X(1), x1); + Point3 l1; config.insert(L(1), l1); // Point should project to Point2(320.,240.) CHECK(assert_equal(Vector_(2, -3.0, 0.0), factor->unwhitenedError(config))); @@ -60,12 +60,12 @@ TEST( ProjectionFactor, error ) DOUBLES_EQUAL(4.5,factor->error(config),1e-9); // Check linearize - Ordering ordering; ordering += kx(1),kl(1); + Ordering ordering; ordering += X(1),L(1); Matrix Ax1 = Matrix_(2, 6, 0., -554.256, 0., -92.376, 0., 0., 554.256, 0., 0., 0., -92.376, 0.); Matrix Al1 = Matrix_(2, 3, 92.376, 0., 0., 0., 92.376, 0.); Vector b = Vector_(2,3.,0.); SharedDiagonal probModel1 = noiseModel::Unit::Create(2); - JacobianFactor expected(ordering[kx(1)], Ax1, ordering[kl(1)], Al1, b, probModel1); + JacobianFactor expected(ordering[X(1)], Ax1, ordering[L(1)], Al1, b, probModel1); JacobianFactor::shared_ptr actual = boost::dynamic_pointer_cast(factor->linearize(config, ordering)); CHECK(assert_equal(expected,*actual,1e-3)); @@ -80,11 +80,11 @@ TEST( ProjectionFactor, error ) // expmap on a config Values expected_config; - Point3 t2(1,1,-5); Pose3 x2(R,t2); expected_config.insert(kx(1), x2); - Point3 l2(1,2,3); expected_config.insert(kl(1), l2); + Point3 t2(1,1,-5); Pose3 x2(R,t2); expected_config.insert(X(1), x2); + Point3 l2(1,2,3); expected_config.insert(L(1), l2); VectorValues delta(expected_config.dims(ordering)); - delta[ordering[kx(1)]] = Vector_(6, 0.,0.,0., 1.,1.,1.); - delta[ordering[kl(1)]] = Vector_(3, 1.,2.,3.); + delta[ordering[X(1)]] = Vector_(6, 0.,0.,0., 1.,1.,1.); + delta[ordering[L(1)]] = Vector_(3, 1.,2.,3.); Values actual_config = config.retract(delta, ordering); CHECK(assert_equal(expected_config,actual_config,1e-9)); } @@ -96,10 +96,10 @@ TEST( ProjectionFactor, equals ) Vector z = Vector_(2,323.,240.); int i=1, j=1; boost::shared_ptr - factor1(new visualSLAM::ProjectionFactor(z, sigma, kx(i), kl(j), sK)); + factor1(new visualSLAM::ProjectionFactor(z, sigma, X(i), L(j), sK)); boost::shared_ptr - factor2(new visualSLAM::ProjectionFactor(z, sigma, kx(i), kl(j), sK)); + factor2(new visualSLAM::ProjectionFactor(z, sigma, X(i), L(j), sK)); CHECK(assert_equal(*factor1, *factor2)); } diff --git a/gtsam/slam/tests/testSerializationSLAM.cpp b/gtsam/slam/tests/testSerializationSLAM.cpp index 23093a28e..51d37db74 100644 --- a/gtsam/slam/tests/testSerializationSLAM.cpp +++ b/gtsam/slam/tests/testSerializationSLAM.cpp @@ -29,6 +29,10 @@ using namespace std; using namespace gtsam; using namespace gtsam::serializationTestHelpers; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + /* Create GUIDs for factors */ /* ************************************************************************* */ BOOST_CLASS_EXPORT_GUID(gtsam::JacobianFactor, "gtsam::JacobianFactor"); @@ -49,7 +53,7 @@ BOOST_CLASS_EXPORT_GUID(gtsam::SharedDiagonal, "gtsam_SharedDiagonal"); TEST (Serialization, smallExample_linear) { using namespace example; - Ordering ordering; ordering += Symbol('x',1),Symbol('x',2),Symbol('l',1); + Ordering ordering; ordering += X(1),X(2),L(1); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); EXPECT(equalsObj(ordering)); EXPECT(equalsXML(ordering)); diff --git a/gtsam/slam/tests/testSimulated2DOriented.cpp b/gtsam/slam/tests/testSimulated2DOriented.cpp index afca72402..d017512ce 100644 --- a/gtsam/slam/tests/testSimulated2DOriented.cpp +++ b/gtsam/slam/tests/testSimulated2DOriented.cpp @@ -29,8 +29,8 @@ using namespace gtsam; #include // Convenience for named keys -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( simulated2DOriented, Dprior ) @@ -59,11 +59,11 @@ TEST( simulated2DOriented, constructor ) { Pose2 measurement(0.2, 0.3, 0.1); SharedDiagonal model(Vector_(3, 1., 1., 1.)); - simulated2DOriented::Odometry factor(measurement, model, kx(1), kx(2)); + simulated2DOriented::Odometry factor(measurement, model, X(1), X(2)); simulated2DOriented::Values config; - config.insert(kx(1), Pose2(1., 0., 0.2)); - config.insert(kx(2), Pose2(2., 0., 0.1)); + config.insert(X(1), Pose2(1., 0., 0.2)); + config.insert(X(2), Pose2(2., 0., 0.1)); boost::shared_ptr lf = factor.linearize(config, *config.orderingArbitrary()); } diff --git a/gtsam/slam/tests/testStereoFactor.cpp b/gtsam/slam/tests/testStereoFactor.cpp index 9a8a27054..35ef081bc 100644 --- a/gtsam/slam/tests/testStereoFactor.cpp +++ b/gtsam/slam/tests/testStereoFactor.cpp @@ -43,8 +43,8 @@ Point3 p(0, 0, 5); static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); // Convenience for named keys -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( StereoFactor, singlePoint) @@ -53,18 +53,18 @@ TEST( StereoFactor, singlePoint) boost::shared_ptr K(new Cal3_S2Stereo(625, 625, 0, 320, 240, 0.5)); NonlinearFactorGraph graph; - graph.add(visualSLAM::PoseConstraint(kx(1),camera1)); + graph.add(visualSLAM::PoseConstraint(X(1),camera1)); StereoPoint2 z14(320,320.0-50, 240); // arguments: measurement, sigma, cam#, measurement #, K, baseline (m) - graph.add(visualSLAM::StereoFactor(z14,sigma, kx(1), kl(1), K)); + graph.add(visualSLAM::StereoFactor(z14,sigma, X(1), L(1), K)); // Create a configuration corresponding to the ground truth Values values; - values.insert(kx(1), camera1); // add camera at z=6.25m looking towards origin + values.insert(X(1), camera1); // add camera at z=6.25m looking towards origin Point3 l1(0, 0, 0); - values.insert(kl(1), l1); // add point at origin; + values.insert(L(1), l1); // add point at origin; GaussNewtonOptimizer optimizer(graph, values); diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp index dc9b64f4d..f09d5117a 100644 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -34,8 +34,8 @@ using namespace gtsam; static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); // Convenience for named keys -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; static Point3 landmark1(-1.0,-1.0, 0.0); static Point3 landmark2(-1.0, 1.0, 0.0); @@ -69,14 +69,14 @@ visualSLAM::Graph testGraph() { shared_ptrK sK(new Cal3_S2(625, 625, 0, 0, 0)); visualSLAM::Graph g; - g.addMeasurement(z11, sigma, kx(1), kl(1), sK); - g.addMeasurement(z12, sigma, kx(1), kl(2), sK); - g.addMeasurement(z13, sigma, kx(1), kl(3), sK); - g.addMeasurement(z14, sigma, kx(1), kl(4), sK); - g.addMeasurement(z21, sigma, kx(2), kl(1), sK); - g.addMeasurement(z22, sigma, kx(2), kl(2), sK); - g.addMeasurement(z23, sigma, kx(2), kl(3), sK); - g.addMeasurement(z24, sigma, kx(2), kl(4), sK); + g.addMeasurement(z11, sigma, X(1), L(1), sK); + g.addMeasurement(z12, sigma, X(1), L(2), sK); + g.addMeasurement(z13, sigma, X(1), L(3), sK); + g.addMeasurement(z14, sigma, X(1), L(4), sK); + g.addMeasurement(z21, sigma, X(2), L(1), sK); + g.addMeasurement(z22, sigma, X(2), L(2), sK); + g.addMeasurement(z23, sigma, X(2), L(3), sK); + g.addMeasurement(z24, sigma, X(2), L(4), sK); return g; } @@ -86,22 +86,22 @@ TEST( Graph, optimizeLM) // build a graph visualSLAM::Graph graph(testGraph()); // add 3 landmark constraints - graph.addPointConstraint(kl(1), landmark1); - graph.addPointConstraint(kl(2), landmark2); - graph.addPointConstraint(kl(3), landmark3); + graph.addPointConstraint(L(1), landmark1); + graph.addPointConstraint(L(2), landmark2); + graph.addPointConstraint(L(3), landmark3); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(kx(1), camera1); - initialEstimate.insert(kx(2), camera2); - initialEstimate.insert(kl(1), landmark1); - initialEstimate.insert(kl(2), landmark2); - initialEstimate.insert(kl(3), landmark3); - initialEstimate.insert(kl(4), landmark4); + initialEstimate.insert(X(1), camera1); + initialEstimate.insert(X(2), camera2); + initialEstimate.insert(L(1), landmark1); + initialEstimate.insert(L(2), landmark2); + initialEstimate.insert(L(3), landmark3); + initialEstimate.insert(L(4), landmark4); // Create an ordering of the variables Ordering ordering; - ordering += kl(1),kl(2),kl(3),kl(4),kx(1),kx(2); + ordering += L(1),L(2),L(3),L(4),X(1),X(2); // Create an optimizer and check its error // We expect the initial to be zero because config is the ground truth @@ -124,21 +124,21 @@ TEST( Graph, optimizeLM2) // build a graph visualSLAM::Graph graph(testGraph()); // add 2 camera constraints - graph.addPoseConstraint(kx(1), camera1); - graph.addPoseConstraint(kx(2), camera2); + graph.addPoseConstraint(X(1), camera1); + graph.addPoseConstraint(X(2), camera2); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(kx(1), camera1); - initialEstimate.insert(kx(2), camera2); - initialEstimate.insert(kl(1), landmark1); - initialEstimate.insert(kl(2), landmark2); - initialEstimate.insert(kl(3), landmark3); - initialEstimate.insert(kl(4), landmark4); + initialEstimate.insert(X(1), camera1); + initialEstimate.insert(X(2), camera2); + initialEstimate.insert(L(1), landmark1); + initialEstimate.insert(L(2), landmark2); + initialEstimate.insert(L(3), landmark3); + initialEstimate.insert(L(4), landmark4); // Create an ordering of the variables Ordering ordering; - ordering += kl(1),kl(2),kl(3),kl(4),kx(1),kx(2); + ordering += L(1),L(2),L(3),L(4),X(1),X(2); // Create an optimizer and check its error // We expect the initial to be zero because config is the ground truth @@ -161,17 +161,17 @@ TEST( Graph, CHECK_ORDERING) // build a graph visualSLAM::Graph graph = testGraph(); // add 2 camera constraints - graph.addPoseConstraint(kx(1), camera1); - graph.addPoseConstraint(kx(2), camera2); + graph.addPoseConstraint(X(1), camera1); + graph.addPoseConstraint(X(2), camera2); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(kx(1), camera1); - initialEstimate.insert(kx(2), camera2); - initialEstimate.insert(kl(1), landmark1); - initialEstimate.insert(kl(2), landmark2); - initialEstimate.insert(kl(3), landmark3); - initialEstimate.insert(kl(4), landmark4); + initialEstimate.insert(X(1), camera1); + initialEstimate.insert(X(2), camera2); + initialEstimate.insert(L(1), landmark1); + initialEstimate.insert(L(2), landmark2); + initialEstimate.insert(L(3), landmark3); + initialEstimate.insert(L(4), landmark4); // Create an optimizer and check its error // We expect the initial to be zero because config is the ground truth @@ -192,21 +192,21 @@ TEST( Values, update_with_large_delta) { // this test ensures that if the update for delta is larger than // the size of the config, it only updates existing variables Values init; - init.insert(kx(1), Pose3()); - init.insert(kl(1), Point3(1.0, 2.0, 3.0)); + init.insert(X(1), Pose3()); + init.insert(L(1), Point3(1.0, 2.0, 3.0)); Values expected; - expected.insert(kx(1), Pose3(Rot3(), Point3(0.1, 0.1, 0.1))); - expected.insert(kl(1), Point3(1.1, 2.1, 3.1)); + expected.insert(X(1), Pose3(Rot3(), Point3(0.1, 0.1, 0.1))); + expected.insert(L(1), Point3(1.1, 2.1, 3.1)); Ordering largeOrdering; Values largeValues = init; - largeValues.insert(kx(2), Pose3()); - largeOrdering += kx(1),kl(1),kx(2); + largeValues.insert(X(2), Pose3()); + largeOrdering += X(1),L(1),X(2); VectorValues delta(largeValues.dims(largeOrdering)); - delta[largeOrdering[kx(1)]] = Vector_(6, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1); - delta[largeOrdering[kl(1)]] = Vector_(3, 0.1, 0.1, 0.1); - delta[largeOrdering[kx(2)]] = Vector_(6, 0.0, 0.0, 0.0, 100.1, 4.1, 9.1); + delta[largeOrdering[X(1)]] = Vector_(6, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1); + delta[largeOrdering[L(1)]] = Vector_(3, 0.1, 0.1, 0.1); + delta[largeOrdering[X(2)]] = Vector_(6, 0.0, 0.0, 0.0, 100.1, 4.1, 9.1); Values actual = init.retract(delta, largeOrdering); CHECK(assert_equal(expected,actual)); diff --git a/gtsam_unstable/slam/tests/testSimulated3D.cpp b/gtsam_unstable/slam/tests/testSimulated3D.cpp index d7633f473..7283544a1 100644 --- a/gtsam_unstable/slam/tests/testSimulated3D.cpp +++ b/gtsam_unstable/slam/tests/testSimulated3D.cpp @@ -15,24 +15,28 @@ * @author Alex Cunningham **/ -#include -#include - #include #include #include #include #include +#include + +#include + using namespace gtsam; -using namespace simulated3D; + +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( simulated3D, Values ) { Values actual; - actual.insert(Symbol('l',1),Point3(1,1,1)); - actual.insert(Symbol('x',2),Point3(2,2,2)); + actual.insert(L(1),Point3(1,1,1)); + actual.insert(X(2),Point3(2,2,2)); EXPECT(assert_equal(actual,actual,1e-9)); } diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index f175ca9f3..e9d1e2f05 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -35,6 +35,10 @@ using namespace std; using namespace gtsam; using boost::shared_ptr; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + /* ************************************************************************* */ double computeError(const GaussianBayesNet& gbn, const LieVector& values) { @@ -389,11 +393,11 @@ TEST(DoglegOptimizer, Iterate) { // config far from minimum Point2 x0(3,0); boost::shared_ptr config(new Values); - config->insert(Symbol('x',1), x0); + config->insert(X(1), x0); // ordering shared_ptr ord(new Ordering()); - ord->push_back(Symbol('x',1)); + ord->push_back(X(1)); double Delta = 1.0; for(size_t it=0; it<10; ++it) { diff --git a/tests/testExtendedKalmanFilter.cpp b/tests/testExtendedKalmanFilter.cpp index 9071d9c63..440119e66 100644 --- a/tests/testExtendedKalmanFilter.cpp +++ b/tests/testExtendedKalmanFilter.cpp @@ -25,6 +25,10 @@ using namespace gtsam; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + /* ************************************************************************* */ TEST( ExtendedKalmanFilter, linear ) { @@ -414,11 +418,11 @@ TEST( ExtendedKalmanFilter, nonlinear ) { Point2 x_predict, x_update; for(unsigned int i = 0; i < 10; ++i){ // Create motion factor - NonlinearMotionModel motionFactor(Symbol('x',i), Symbol('x',i+1)); + NonlinearMotionModel motionFactor(X(i), X(i+1)); x_predict = ekf.predict(motionFactor); // Create a measurement factor - NonlinearMeasurementModel measurementFactor(Symbol('x',i+1), Vector_(1, z[i])); + NonlinearMeasurementModel measurementFactor(X(i+1), Vector_(1, z[i])); x_update = ekf.update(measurementFactor); EXPECT(assert_equal(expected_predict[i],x_predict, 1e-6)); diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index f380ad4e2..cb91bc88c 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -36,11 +36,15 @@ using namespace boost::assign; using namespace std; using namespace gtsam; +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + static SharedDiagonal sigma0_1 = sharedSigma(2,0.1), sigma_02 = sharedSigma(2,0.2), constraintModel = noiseModel::Constrained::All(2); -const Key kx1 = Symbol('x',1), kx2 = Symbol('x',2), kl1 = Symbol('l',1); +const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); /* ************************************************************************* */ TEST( GaussianFactor, linearFactor ) diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 6eb673018..616c96ab6 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -42,13 +42,13 @@ using namespace example; double tol=1e-5; -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( GaussianFactorGraph, equals ) { - Ordering ordering; ordering += kx(1),kx(2),kl(1); + Ordering ordering; ordering += X(1),X(2),L(1); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); GaussianFactorGraph fg2 = createGaussianFactorGraph(ordering); EXPECT(fg.equals(fg2)); @@ -56,7 +56,7 @@ TEST( GaussianFactorGraph, equals ) { /* ************************************************************************* */ //TEST( GaussianFactorGraph, error ) { -// Ordering ordering; ordering += kx(1),kx(2),kl(1); +// Ordering ordering; ordering += X(1),X(2),L(1); // FactorGraph fg = createGaussianFactorGraph(ordering); // VectorValues cfg = createZeroDelta(ordering); // @@ -74,10 +74,10 @@ TEST( GaussianFactorGraph, equals ) { //{ // GaussianFactorGraph fg = createGaussianFactorGraph(); // -// set separator = fg.find_separator(kx(2)); +// set separator = fg.find_separator(X(2)); // set expected; -// expected.insert(kx(1)); -// expected.insert(kl(1)); +// expected.insert(X(1)); +// expected.insert(L(1)); // // EXPECT(separator.size()==expected.size()); // set::iterator it1 = separator.begin(), it2 = expected.begin(); @@ -92,7 +92,7 @@ TEST( GaussianFactorGraph, equals ) { // GaussianFactorGraph fg = createGaussianFactorGraph(); // // // combine all factors -// GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,kx(1)); +// GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,X(1)); // // // the expected linear factor // Matrix Al1 = Matrix_(6,2, @@ -132,11 +132,11 @@ TEST( GaussianFactorGraph, equals ) { // b(5) = 1; // // vector > meas; -// meas.push_back(make_pair(kl(1), Al1)); -// meas.push_back(make_pair(kx(1), Ax1)); -// meas.push_back(make_pair(kx(2), Ax2)); +// meas.push_back(make_pair(L(1), Al1)); +// meas.push_back(make_pair(X(1), Ax1)); +// meas.push_back(make_pair(X(2), Ax2)); // GaussianFactor expected(meas, b, ones(6)); -// //GaussianFactor expected(kl(1), Al1, kx(1), Ax1, kx(2), Ax2, b); +// //GaussianFactor expected(L(1), Al1, X(1), Ax1, X(2), Ax2, b); // // // check if the two factors are the same // EXPECT(assert_equal(expected,*actual)); @@ -149,7 +149,7 @@ TEST( GaussianFactorGraph, equals ) { // GaussianFactorGraph fg = createGaussianFactorGraph(); // // // combine all factors -// GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,kx(2)); +// GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,X(2)); // // // the expected linear factor // Matrix Al1 = Matrix_(4,2, @@ -184,9 +184,9 @@ TEST( GaussianFactorGraph, equals ) { // b(3) = 1.5; // // vector > meas; -// meas.push_back(make_pair(kl(1), Al1)); -// meas.push_back(make_pair(kx(1), Ax1)); -// meas.push_back(make_pair(kx(2), Ax2)); +// meas.push_back(make_pair(L(1), Al1)); +// meas.push_back(make_pair(X(1), Ax1)); +// meas.push_back(make_pair(X(2), Ax2)); // GaussianFactor expected(meas, b, ones(4)); // // // check if the two factors are the same @@ -196,7 +196,7 @@ TEST( GaussianFactorGraph, equals ) { /* ************************************************************************* */ TEST( GaussianFactorGraph, eliminateOne_x1 ) { - Ordering ordering; ordering += kx(1),kl(1),kx(2); + Ordering ordering; ordering += X(1),L(1),X(2); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); GaussianFactorGraph::FactorizationResult result = inference::eliminateOne(fg, 0, EliminateQR); @@ -204,7 +204,7 @@ TEST( GaussianFactorGraph, eliminateOne_x1 ) // create expected Conditional Gaussian Matrix I = 15*eye(2), R11 = I, S12 = -0.111111*I, S13 = -0.444444*I; Vector d = Vector_(2, -0.133333, -0.0222222), sigma = ones(2); - GaussianConditional expected(ordering[kx(1)],15*d,R11,ordering[kl(1)],S12,ordering[kx(2)],S13,sigma); + GaussianConditional expected(ordering[X(1)],15*d,R11,ordering[L(1)],S12,ordering[X(2)],S13,sigma); EXPECT(assert_equal(expected,*result.first,tol)); } @@ -212,7 +212,7 @@ TEST( GaussianFactorGraph, eliminateOne_x1 ) /* ************************************************************************* */ TEST( GaussianFactorGraph, eliminateOne_x2 ) { - Ordering ordering; ordering += kx(2),kl(1),kx(1); + Ordering ordering; ordering += X(2),L(1),X(1); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, 0, EliminateQR).first; @@ -220,7 +220,7 @@ TEST( GaussianFactorGraph, eliminateOne_x2 ) double sig = 0.0894427; Matrix I = eye(2)/sig, R11 = I, S12 = -0.2*I, S13 = -0.8*I; Vector d = Vector_(2, 0.2, -0.14)/sig, sigma = ones(2); - GaussianConditional expected(ordering[kx(2)],d,R11,ordering[kl(1)],S12,ordering[kx(1)],S13,sigma); + GaussianConditional expected(ordering[X(2)],d,R11,ordering[L(1)],S12,ordering[X(1)],S13,sigma); EXPECT(assert_equal(expected,*actual,tol)); } @@ -228,7 +228,7 @@ TEST( GaussianFactorGraph, eliminateOne_x2 ) /* ************************************************************************* */ TEST( GaussianFactorGraph, eliminateOne_l1 ) { - Ordering ordering; ordering += kl(1),kx(1),kx(2); + Ordering ordering; ordering += L(1),X(1),X(2); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, 0, EliminateQR).first; @@ -236,7 +236,7 @@ TEST( GaussianFactorGraph, eliminateOne_l1 ) double sig = sqrt(2)/10.; Matrix I = eye(2)/sig, R11 = I, S12 = -0.5*I, S13 = -0.5*I; Vector d = Vector_(2, -0.1, 0.25)/sig, sigma = ones(2); - GaussianConditional expected(ordering[kl(1)],d,R11,ordering[kx(1)],S12,ordering[kx(2)],S13,sigma); + GaussianConditional expected(ordering[L(1)],d,R11,ordering[X(1)],S12,ordering[X(2)],S13,sigma); EXPECT(assert_equal(expected,*actual,tol)); } @@ -244,16 +244,16 @@ TEST( GaussianFactorGraph, eliminateOne_l1 ) /* ************************************************************************* */ TEST( GaussianFactorGraph, eliminateOne_x1_fast ) { - Ordering ordering; ordering += kx(1),kl(1),kx(2); + Ordering ordering; ordering += X(1),L(1),X(2); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); - GaussianFactorGraph::FactorizationResult result = inference::eliminateOne(fg, ordering[kx(1)], EliminateQR); + GaussianFactorGraph::FactorizationResult result = inference::eliminateOne(fg, ordering[X(1)], EliminateQR); GaussianConditional::shared_ptr conditional = result.first; GaussianFactorGraph remaining = result.second; // create expected Conditional Gaussian Matrix I = 15*eye(2), R11 = I, S12 = -0.111111*I, S13 = -0.444444*I; Vector d = Vector_(2, -0.133333, -0.0222222), sigma = ones(2); - GaussianConditional expected(ordering[kx(1)],15*d,R11,ordering[kl(1)],S12,ordering[kx(2)],S13,sigma); + GaussianConditional expected(ordering[X(1)],15*d,R11,ordering[L(1)],S12,ordering[X(2)],S13,sigma); // Create expected remaining new factor JacobianFactor expectedFactor(1, Matrix_(4,2, @@ -275,15 +275,15 @@ TEST( GaussianFactorGraph, eliminateOne_x1_fast ) /* ************************************************************************* */ TEST( GaussianFactorGraph, eliminateOne_x2_fast ) { - Ordering ordering; ordering += kx(1),kl(1),kx(2); + Ordering ordering; ordering += X(1),L(1),X(2); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); - GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, ordering[kx(2)], EliminateQR).first; + GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, ordering[X(2)], EliminateQR).first; // create expected Conditional Gaussian double sig = 0.0894427; Matrix I = eye(2)/sig, R11 = I, S12 = -0.2*I, S13 = -0.8*I; Vector d = Vector_(2, 0.2, -0.14)/sig, sigma = ones(2); - GaussianConditional expected(ordering[kx(2)],d,R11,ordering[kx(1)],S13,ordering[kl(1)],S12,sigma); + GaussianConditional expected(ordering[X(2)],d,R11,ordering[X(1)],S13,ordering[L(1)],S12,sigma); EXPECT(assert_equal(expected,*actual,tol)); } @@ -291,15 +291,15 @@ TEST( GaussianFactorGraph, eliminateOne_x2_fast ) /* ************************************************************************* */ TEST( GaussianFactorGraph, eliminateOne_l1_fast ) { - Ordering ordering; ordering += kx(1),kl(1),kx(2); + Ordering ordering; ordering += X(1),L(1),X(2); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); - GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, ordering[kl(1)], EliminateQR).first; + GaussianConditional::shared_ptr actual = inference::eliminateOne(fg, ordering[L(1)], EliminateQR).first; // create expected Conditional Gaussian double sig = sqrt(2)/10.; Matrix I = eye(2)/sig, R11 = I, S12 = -0.5*I, S13 = -0.5*I; Vector d = Vector_(2, -0.1, 0.25)/sig, sigma = ones(2); - GaussianConditional expected(ordering[kl(1)],d,R11,ordering[kx(1)],S12,ordering[kx(2)],S13,sigma); + GaussianConditional expected(ordering[L(1)],d,R11,ordering[X(1)],S12,ordering[X(2)],S13,sigma); EXPECT(assert_equal(expected,*actual,tol)); } @@ -311,18 +311,18 @@ TEST( GaussianFactorGraph, eliminateAll ) Matrix I = eye(2); Ordering ordering; - ordering += kx(2),kl(1),kx(1); + ordering += X(2),L(1),X(1); Vector d1 = Vector_(2, -0.1,-0.1); - GaussianBayesNet expected = simpleGaussian(ordering[kx(1)],d1,0.1); + GaussianBayesNet expected = simpleGaussian(ordering[X(1)],d1,0.1); double sig1 = 0.149071; Vector d2 = Vector_(2, 0.0, 0.2)/sig1, sigma2 = ones(2); - push_front(expected,ordering[kl(1)],d2, I/sig1,ordering[kx(1)], (-1)*I/sig1,sigma2); + push_front(expected,ordering[L(1)],d2, I/sig1,ordering[X(1)], (-1)*I/sig1,sigma2); double sig2 = 0.0894427; Vector d3 = Vector_(2, 0.2, -0.14)/sig2, sigma3 = ones(2); - push_front(expected,ordering[kx(2)],d3, I/sig2,ordering[kl(1)], (-0.2)*I/sig2, ordering[kx(1)], (-0.8)*I/sig2, sigma3); + push_front(expected,ordering[X(2)],d3, I/sig2,ordering[L(1)], (-0.2)*I/sig2, ordering[X(1)], (-0.8)*I/sig2, sigma3); // Check one ordering GaussianFactorGraph fg1 = createGaussianFactorGraph(ordering); @@ -340,20 +340,20 @@ TEST( GaussianFactorGraph, eliminateAll ) // Matrix I = eye(2); // // Vector d1 = Vector_(2, -0.1,-0.1); -// GaussianBayesNet expected = simpleGaussian(kx(1),d1,0.1); +// GaussianBayesNet expected = simpleGaussian(X(1),d1,0.1); // // double sig1 = 0.149071; // Vector d2 = Vector_(2, 0.0, 0.2)/sig1, sigma2 = ones(2); -// push_front(expected,kl(1),d2, I/sig1,kx(1), (-1)*I/sig1,sigma2); +// push_front(expected,L(1),d2, I/sig1,X(1), (-1)*I/sig1,sigma2); // // double sig2 = 0.0894427; // Vector d3 = Vector_(2, 0.2, -0.14)/sig2, sigma3 = ones(2); -// push_front(expected,kx(2),d3, I/sig2,kl(1), (-0.2)*I/sig2, kx(1), (-0.8)*I/sig2, sigma3); +// push_front(expected,X(2),d3, I/sig2,L(1), (-0.2)*I/sig2, X(1), (-0.8)*I/sig2, sigma3); // // // Check one ordering // GaussianFactorGraph fg1 = createGaussianFactorGraph(); // Ordering ordering; -// ordering += kx(2),kl(1),kx(1); +// ordering += X(2),L(1),X(1); // GaussianBayesNet actual = fg1.eliminate(ordering, false); // EXPECT(assert_equal(expected,actual,tol)); //} @@ -361,16 +361,16 @@ TEST( GaussianFactorGraph, eliminateAll ) ///* ************************************************************************* */ //TEST( GaussianFactorGraph, add_priors ) //{ -// Ordering ordering; ordering += kl(1),kx(1),kx(2); +// Ordering ordering; ordering += L(1),X(1),X(2); // GaussianFactorGraph fg = createGaussianFactorGraph(ordering); // GaussianFactorGraph actual = fg.add_priors(3, vector(3,2)); // GaussianFactorGraph expected = createGaussianFactorGraph(ordering); // Matrix A = eye(2); // Vector b = zero(2); // SharedDiagonal sigma = sharedSigma(2,3.0); -// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[kl(1)],A,b,sigma))); -// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[kx(1)],A,b,sigma))); -// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[kx(2)],A,b,sigma))); +// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[L(1)],A,b,sigma))); +// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[X(1)],A,b,sigma))); +// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[X(2)],A,b,sigma))); // EXPECT(assert_equal(expected,actual)); //} @@ -378,7 +378,7 @@ TEST( GaussianFactorGraph, eliminateAll ) TEST( GaussianFactorGraph, copying ) { // Create a graph - Ordering ordering; ordering += kx(2),kl(1),kx(1); + Ordering ordering; ordering += X(2),L(1),X(1); GaussianFactorGraph actual = createGaussianFactorGraph(ordering); // Copy the graph ! @@ -399,7 +399,7 @@ TEST( GaussianFactorGraph, copying ) //{ // // render with a given ordering // Ordering ord; -// ord += kx(2),kl(1),kx(1); +// ord += X(2),L(1),X(1); // // // Create a graph // GaussianFactorGraph fg = createGaussianFactorGraph(ordering); @@ -438,7 +438,7 @@ TEST( GaussianFactorGraph, copying ) TEST( GaussianFactorGraph, CONSTRUCTOR_GaussianBayesNet ) { Ordering ord; - ord += kx(2),kl(1),kx(1); + ord += X(2),L(1),X(1); GaussianFactorGraph fg = createGaussianFactorGraph(ord); // render with a given ordering @@ -458,20 +458,20 @@ TEST( GaussianFactorGraph, CONSTRUCTOR_GaussianBayesNet ) /* ************************************************************************* */ TEST( GaussianFactorGraph, getOrdering) { - Ordering original; original += kl(1),kx(1),kx(2); + Ordering original; original += L(1),X(1),X(2); FactorGraph symbolic(createGaussianFactorGraph(original)); Permutation perm(*inference::PermutationCOLAMD(VariableIndex(symbolic))); Ordering actual = original; actual.permuteWithInverse((*perm.inverse())); - Ordering expected; expected += kl(1),kx(2),kx(1); + Ordering expected; expected += L(1),X(2),X(1); EXPECT(assert_equal(expected,actual)); } // SL-FIX TEST( GaussianFactorGraph, getOrdering2) //{ // Ordering expected; -// expected += kl(1),kx(1); +// expected += L(1),X(1); // GaussianFactorGraph fg = createGaussianFactorGraph(); -// set interested; interested += kl(1),kx(1); +// set interested; interested += L(1),X(1); // Ordering actual = fg.getOrdering(interested); // EXPECT(assert_equal(expected,actual)); //} @@ -480,7 +480,7 @@ TEST( GaussianFactorGraph, getOrdering) TEST( GaussianFactorGraph, optimize_Cholesky ) { // create an ordering - Ordering ord; ord += kx(2),kl(1),kx(1); + Ordering ord; ord += X(2),L(1),X(1); // create a graph GaussianFactorGraph fg = createGaussianFactorGraph(ord); @@ -498,7 +498,7 @@ TEST( GaussianFactorGraph, optimize_Cholesky ) TEST( GaussianFactorGraph, optimize_QR ) { // create an ordering - Ordering ord; ord += kx(2),kl(1),kx(1); + Ordering ord; ord += X(2),L(1),X(1); // create a graph GaussianFactorGraph fg = createGaussianFactorGraph(ord); @@ -516,7 +516,7 @@ TEST( GaussianFactorGraph, optimize_QR ) // SL-FIX TEST( GaussianFactorGraph, optimizeMultiFrontlas ) //{ // // create an ordering -// Ordering ord; ord += kx(2),kl(1),kx(1); +// Ordering ord; ord += X(2),L(1),X(1); // // // create a graph // GaussianFactorGraph fg = createGaussianFactorGraph(ord); @@ -534,7 +534,7 @@ TEST( GaussianFactorGraph, optimize_QR ) TEST( GaussianFactorGraph, combine) { // create an ordering - Ordering ord; ord += kx(2),kl(1),kx(1); + Ordering ord; ord += X(2),L(1),X(1); // create a test graph GaussianFactorGraph fg1 = createGaussianFactorGraph(ord); @@ -556,7 +556,7 @@ TEST( GaussianFactorGraph, combine) TEST( GaussianFactorGraph, combine2) { // create an ordering - Ordering ord; ord += kx(2),kl(1),kx(1); + Ordering ord; ord += X(2),L(1),X(1); // create a test graph GaussianFactorGraph fg1 = createGaussianFactorGraph(ord); @@ -589,13 +589,13 @@ void print(vector v) { // GaussianFactorGraph fg = createGaussianFactorGraph(); // // // ask for all factor indices connected to x1 -// list x1_factors = fg.factors(kx(1)); +// list x1_factors = fg.factors(X(1)); // size_t x1_indices[] = { 0, 1, 2 }; // list x1_expected(x1_indices, x1_indices + 3); // EXPECT(x1_factors==x1_expected); // // // ask for all factor indices connected to x2 -// list x2_factors = fg.factors(kx(2)); +// list x2_factors = fg.factors(X(2)); // size_t x2_indices[] = { 1, 3 }; // list x2_expected(x2_indices, x2_indices + 2); // EXPECT(x2_factors==x2_expected); @@ -613,7 +613,7 @@ void print(vector v) { // GaussianFactor::shared_ptr f2 = fg[2]; // // // call the function -// vector factors = fg.findAndRemoveFactors(kx(1)); +// vector factors = fg.findAndRemoveFactors(X(1)); // // // Check the factors // EXPECT(f0==factors[0]); @@ -638,7 +638,7 @@ TEST(GaussianFactorGraph, createSmoother) //{ // GaussianFactorGraph fg = createGaussianFactorGraph(); // Dimensions expected; -// insert(expected)(kl(1), 2)(kx(1), 2)(kx(2), 2); +// insert(expected)(L(1), 2)(X(1), 2)(X(2), 2); // Dimensions actual = fg.dimensions(); // EXPECT(expected==actual); //} @@ -648,7 +648,7 @@ TEST(GaussianFactorGraph, createSmoother) //{ // GaussianFactorGraph fg = createGaussianFactorGraph(); // Ordering expected; -// expected += kl(1),kx(1),kx(2); +// expected += L(1),X(1),X(2); // EXPECT(assert_equal(expected,fg.keys())); //} @@ -656,16 +656,16 @@ TEST(GaussianFactorGraph, createSmoother) // SL-NEEDED? TEST( GaussianFactorGraph, involves ) //{ // GaussianFactorGraph fg = createGaussianFactorGraph(); -// EXPECT(fg.involves(kl(1))); -// EXPECT(fg.involves(kx(1))); -// EXPECT(fg.involves(kx(2))); -// EXPECT(!fg.involves(kx(3))); +// EXPECT(fg.involves(L(1))); +// EXPECT(fg.involves(X(1))); +// EXPECT(fg.involves(X(2))); +// EXPECT(!fg.involves(X(3))); //} /* ************************************************************************* */ double error(const VectorValues& x) { // create an ordering - Ordering ord; ord += kx(2),kl(1),kx(1); + Ordering ord; ord += X(2),L(1),X(1); GaussianFactorGraph fg = createGaussianFactorGraph(ord); return fg.error(x); @@ -679,11 +679,11 @@ double error(const VectorValues& x) { // // Construct expected gradient // VectorValues expected; // -// // 2*f(x) = 100*(x1+c[kx(1)])^2 + 100*(x2-x1-[0.2;-0.1])^2 + 25*(l1-x1-[0.0;0.2])^2 + 25*(l1-x2-[-0.2;0.3])^2 +// // 2*f(x) = 100*(x1+c[X(1)])^2 + 100*(x2-x1-[0.2;-0.1])^2 + 25*(l1-x1-[0.0;0.2])^2 + 25*(l1-x2-[-0.2;0.3])^2 // // worked out: df/dx1 = 100*[0.1;0.1] + 100*[0.2;-0.1]) + 25*[0.0;0.2] = [10+20;10-10+5] = [30;5] -// expected.insert(kl(1),Vector_(2, 5.0,-12.5)); -// expected.insert(kx(1),Vector_(2, 30.0, 5.0)); -// expected.insert(kx(2),Vector_(2,-25.0, 17.5)); +// expected.insert(L(1),Vector_(2, 5.0,-12.5)); +// expected.insert(X(1),Vector_(2, 30.0, 5.0)); +// expected.insert(X(2),Vector_(2,-25.0, 17.5)); // // // Check the gradient at delta=0 // VectorValues zero = createZeroDelta(); @@ -696,7 +696,7 @@ double error(const VectorValues& x) { // // // Check the gradient at the solution (should be zero) // Ordering ord; -// ord += kx(2),kl(1),kx(1); +// ord += X(2),L(1),X(1); // GaussianFactorGraph fg2 = createGaussianFactorGraph(); // VectorValues solution = fg2.optimize(ord); // destructive // VectorValues actual2 = fg.gradient(solution); @@ -707,7 +707,7 @@ double error(const VectorValues& x) { TEST( GaussianFactorGraph, multiplication ) { // create an ordering - Ordering ord; ord += kx(2),kl(1),kx(1); + Ordering ord; ord += X(2),L(1),X(1); FactorGraph A = createGaussianFactorGraph(ord); VectorValues x = createCorrectDelta(ord); @@ -724,7 +724,7 @@ TEST( GaussianFactorGraph, multiplication ) // SL-NEEDED? TEST( GaussianFactorGraph, transposeMultiplication ) //{ // // create an ordering -// Ordering ord; ord += kx(2),kl(1),kx(1); +// Ordering ord; ord += X(2),L(1),X(1); // // GaussianFactorGraph A = createGaussianFactorGraph(ord); // Errors e; @@ -734,9 +734,9 @@ TEST( GaussianFactorGraph, multiplication ) // e += Vector_(2,-7.5,-5.0); // // VectorValues expected = createZeroDelta(ord), actual = A ^ e; -// expected[ord[kl(1)]] = Vector_(2, -37.5,-50.0); -// expected[ord[kx(1)]] = Vector_(2,-150.0, 25.0); -// expected[ord[kx(2)]] = Vector_(2, 187.5, 25.0); +// expected[ord[L(1)]] = Vector_(2, -37.5,-50.0); +// expected[ord[X(1)]] = Vector_(2,-150.0, 25.0); +// expected[ord[X(2)]] = Vector_(2, 187.5, 25.0); // EXPECT(assert_equal(expected,actual)); //} @@ -744,7 +744,7 @@ TEST( GaussianFactorGraph, multiplication ) // SL-NEEDED? TEST( GaussianFactorGraph, rhs ) //{ // // create an ordering -// Ordering ord; ord += kx(2),kl(1),kx(1); +// Ordering ord; ord += X(2),L(1),X(1); // // GaussianFactorGraph Ab = createGaussianFactorGraph(ord); // Errors expected = createZeroDelta(ord), actual = Ab.rhs(); @@ -760,21 +760,21 @@ TEST( GaussianFactorGraph, multiplication ) TEST( GaussianFactorGraph, elimination ) { Ordering ord; - ord += kx(1), kx(2); + ord += X(1), X(2); // Create Gaussian Factor Graph GaussianFactorGraph fg; Matrix Ap = eye(1), An = eye(1) * -1; Vector b = Vector_(1, 0.0); SharedDiagonal sigma = sharedSigma(1,2.0); - fg.add(ord[kx(1)], An, ord[kx(2)], Ap, b, sigma); - fg.add(ord[kx(1)], Ap, b, sigma); - fg.add(ord[kx(2)], Ap, b, sigma); + fg.add(ord[X(1)], An, ord[X(2)], Ap, b, sigma); + fg.add(ord[X(1)], Ap, b, sigma); + fg.add(ord[X(2)], Ap, b, sigma); // Eliminate GaussianBayesNet bayesNet = *GaussianSequentialSolver(fg).eliminate(); // Check sigma - EXPECT_DOUBLES_EQUAL(1.0,bayesNet[ord[kx(2)]]->get_sigmas()(0),1e-5); + EXPECT_DOUBLES_EQUAL(1.0,bayesNet[ord[X(2)]]->get_sigmas()(0),1e-5); // Check matrix Matrix R;Vector d; @@ -877,18 +877,18 @@ SharedDiagonal model = sharedSigma(2,1); // GaussianFactorGraph g; // Matrix I = eye(2); // Vector b = Vector_(0, 0, 0); -// g.add(kx(1), I, kx(2), I, b, model); -// g.add(kx(1), I, kx(3), I, b, model); -// g.add(kx(1), I, kx(4), I, b, model); -// g.add(kx(2), I, kx(3), I, b, model); -// g.add(kx(2), I, kx(4), I, b, model); -// g.add(kx(3), I, kx(4), I, b, model); +// g.add(X(1), I, X(2), I, b, model); +// g.add(X(1), I, X(3), I, b, model); +// g.add(X(1), I, X(4), I, b, model); +// g.add(X(2), I, X(3), I, b, model); +// g.add(X(2), I, X(4), I, b, model); +// g.add(X(3), I, X(4), I, b, model); // // map tree = g.findMinimumSpanningTree(); -// EXPECT(tree[kx(1)].compare(kx(1))==0); -// EXPECT(tree[kx(2)].compare(kx(1))==0); -// EXPECT(tree[kx(3)].compare(kx(1))==0); -// EXPECT(tree[kx(4)].compare(kx(1))==0); +// EXPECT(tree[X(1)].compare(X(1))==0); +// EXPECT(tree[X(2)].compare(X(1))==0); +// EXPECT(tree[X(3)].compare(X(1))==0); +// EXPECT(tree[X(4)].compare(X(1))==0); //} ///* ************************************************************************* */ @@ -897,17 +897,17 @@ SharedDiagonal model = sharedSigma(2,1); // GaussianFactorGraph g; // Matrix I = eye(2); // Vector b = Vector_(0, 0, 0); -// g.add(kx(1), I, kx(2), I, b, model); -// g.add(kx(1), I, kx(3), I, b, model); -// g.add(kx(1), I, kx(4), I, b, model); -// g.add(kx(2), I, kx(3), I, b, model); -// g.add(kx(2), I, kx(4), I, b, model); +// g.add(X(1), I, X(2), I, b, model); +// g.add(X(1), I, X(3), I, b, model); +// g.add(X(1), I, X(4), I, b, model); +// g.add(X(2), I, X(3), I, b, model); +// g.add(X(2), I, X(4), I, b, model); // // PredecessorMap tree; -// tree[kx(1)] = kx(1); -// tree[kx(2)] = kx(1); -// tree[kx(3)] = kx(1); -// tree[kx(4)] = kx(1); +// tree[X(1)] = X(1); +// tree[X(2)] = X(1); +// tree[X(3)] = X(1); +// tree[X(4)] = X(1); // // GaussianFactorGraph Ab1, Ab2; // g.split(tree, Ab1, Ab2); @@ -918,17 +918,17 @@ SharedDiagonal model = sharedSigma(2,1); /* ************************************************************************* */ TEST(GaussianFactorGraph, replace) { - Ordering ord; ord += kx(1),kx(2),kx(3),kx(4),kx(5),kx(6); + Ordering ord; ord += X(1),X(2),X(3),X(4),X(5),X(6); SharedDiagonal noise(sharedSigma(3, 1.0)); GaussianFactorGraph::sharedFactor f1(new JacobianFactor( - ord[kx(1)], eye(3,3), ord[kx(2)], eye(3,3), zero(3), noise)); + ord[X(1)], eye(3,3), ord[X(2)], eye(3,3), zero(3), noise)); GaussianFactorGraph::sharedFactor f2(new JacobianFactor( - ord[kx(2)], eye(3,3), ord[kx(3)], eye(3,3), zero(3), noise)); + ord[X(2)], eye(3,3), ord[X(3)], eye(3,3), zero(3), noise)); GaussianFactorGraph::sharedFactor f3(new JacobianFactor( - ord[kx(3)], eye(3,3), ord[kx(4)], eye(3,3), zero(3), noise)); + ord[X(3)], eye(3,3), ord[X(4)], eye(3,3), zero(3), noise)); GaussianFactorGraph::sharedFactor f4(new JacobianFactor( - ord[kx(5)], eye(3,3), ord[kx(6)], eye(3,3), zero(3), noise)); + ord[X(5)], eye(3,3), ord[X(6)], eye(3,3), zero(3), noise)); GaussianFactorGraph actual; actual.push_back(f1); @@ -964,7 +964,7 @@ TEST(GaussianFactorGraph, replace) // // // combine in a factor // Matrix Ab; SharedDiagonal noise; -// Ordering order; order += kx(2), kl(1), kx(1); +// Ordering order; order += X(2), L(1), X(1); // boost::tie(Ab, noise) = combineFactorsAndCreateMatrix(lfg, order, dimensions); // // // the expected augmented matrix @@ -992,26 +992,26 @@ TEST(GaussianFactorGraph, replace) // typedef GaussianFactorGraph::sharedFactor Factor; // SharedDiagonal model(Vector_(1, 0.5)); // GaussianFactorGraph fg; -// Factor factor1(new JacobianFactor(kx(1), Matrix_(1,1,1.), kx(2), Matrix_(1,1,1.), Vector_(1,1.), model)); -// Factor factor2(new JacobianFactor(kx(2), Matrix_(1,1,1.), kx(3), Matrix_(1,1,1.), Vector_(1,1.), model)); -// Factor factor3(new JacobianFactor(kx(3), Matrix_(1,1,1.), kx(3), Matrix_(1,1,1.), Vector_(1,1.), model)); +// Factor factor1(new JacobianFactor(X(1), Matrix_(1,1,1.), X(2), Matrix_(1,1,1.), Vector_(1,1.), model)); +// Factor factor2(new JacobianFactor(X(2), Matrix_(1,1,1.), X(3), Matrix_(1,1,1.), Vector_(1,1.), model)); +// Factor factor3(new JacobianFactor(X(3), Matrix_(1,1,1.), X(3), Matrix_(1,1,1.), Vector_(1,1.), model)); // fg.push_back(factor1); // fg.push_back(factor2); // fg.push_back(factor3); // -// Ordering frontals; frontals += kx(2), kx(1); +// Ordering frontals; frontals += X(2), X(1); // GaussianBayesNet bn = fg.eliminateFrontals(frontals); // // GaussianBayesNet bn_expected; -// GaussianBayesNet::sharedConditional conditional1(new GaussianConditional(kx(2), Vector_(1, 2.), Matrix_(1, 1, 2.), -// kx(1), Matrix_(1, 1, 1.), kx(3), Matrix_(1, 1, 1.), Vector_(1, 1.))); -// GaussianBayesNet::sharedConditional conditional2(new GaussianConditional(kx(1), Vector_(1, 0.), Matrix_(1, 1, -1.), -// kx(3), Matrix_(1, 1, 1.), Vector_(1, 1.))); +// GaussianBayesNet::sharedConditional conditional1(new GaussianConditional(X(2), Vector_(1, 2.), Matrix_(1, 1, 2.), +// X(1), Matrix_(1, 1, 1.), X(3), Matrix_(1, 1, 1.), Vector_(1, 1.))); +// GaussianBayesNet::sharedConditional conditional2(new GaussianConditional(X(1), Vector_(1, 0.), Matrix_(1, 1, -1.), +// X(3), Matrix_(1, 1, 1.), Vector_(1, 1.))); // bn_expected.push_back(conditional1); // bn_expected.push_back(conditional2); // EXPECT(assert_equal(bn_expected, bn)); // -// GaussianFactorGraph::sharedFactor factor_expected(new JacobianFactor(kx(3), Matrix_(1, 1, 2.), Vector_(1, 2.), SharedDiagonal(Vector_(1, 1.)))); +// GaussianFactorGraph::sharedFactor factor_expected(new JacobianFactor(X(3), Matrix_(1, 1, 2.), Vector_(1, 2.), SharedDiagonal(Vector_(1, 1.)))); // GaussianFactorGraph fg_expected; // fg_expected.push_back(factor_expected); // EXPECT(assert_equal(fg_expected, fg)); @@ -1027,8 +1027,8 @@ TEST(GaussianFactorGraph, createSmoother2) LONGS_EQUAL(5,fg2.size()); // eliminate - vector x3var; x3var.push_back(ordering[kx(3)]); - vector x1var; x1var.push_back(ordering[kx(1)]); + vector x3var; x3var.push_back(ordering[X(3)]); + vector x1var; x1var.push_back(ordering[X(1)]); GaussianBayesNet p_x3 = *GaussianSequentialSolver( *GaussianSequentialSolver(fg2).jointFactorGraph(x3var)).eliminate(); GaussianBayesNet p_x1 = *GaussianSequentialSolver( @@ -1045,7 +1045,7 @@ TEST(GaussianFactorGraph, hasConstraints) FactorGraph fgc2 = createSimpleConstraintGraph() ; EXPECT(hasConstraints(fgc2)); - Ordering ordering; ordering += kx(1), kx(2), kl(1); + Ordering ordering; ordering += X(1), X(2), L(1); FactorGraph fg = createGaussianFactorGraph(ordering); EXPECT(!hasConstraints(fg)); } diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index d4946a625..03a747196 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -35,8 +35,8 @@ using namespace std; using namespace gtsam; using namespace example; -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ // Some numbers that should be consistent among all smoother tests @@ -50,7 +50,7 @@ const double tol = 1e-4; TEST_UNSAFE( ISAM, iSAM_smoother ) { Ordering ordering; - for (int t = 1; t <= 7; t++) ordering += kx(t); + for (int t = 1; t <= 7; t++) ordering += X(t); // Create smoother with 7 nodes GaussianFactorGraph smoother = createSmoother(7, ordering).first; @@ -83,7 +83,7 @@ TEST_UNSAFE( ISAM, iSAM_smoother ) // GaussianFactorGraph smoother = createSmoother(7); // // // Create initial tree from first 4 timestamps in reverse order ! -// Ordering ord; ord += kx(4),kx(3),kx(2),kx(1); +// Ordering ord; ord += X(4),X(3),X(2),X(1); // GaussianFactorGraph factors1; // for (int i=0;i<7;i++) factors1.push_back(smoother[i]); // GaussianISAM actual(*inference::Eliminate(factors1)); @@ -130,7 +130,7 @@ TEST_UNSAFE( BayesTree, linear_smoother_shortcuts ) EXPECT(assert_equal(empty,actual1,tol)); // Check the conditional P(C2|Root) - GaussianISAM::sharedClique C2 = isamTree[ordering[kx(5)]]; + GaussianISAM::sharedClique C2 = isamTree[ordering[X(5)]]; GaussianBayesNet actual2 = GaussianISAM::shortcut(C2,R); EXPECT(assert_equal(empty,actual2,tol)); @@ -138,8 +138,8 @@ TEST_UNSAFE( BayesTree, linear_smoother_shortcuts ) double sigma3 = 0.61808; Matrix A56 = Matrix_(2,2,-0.382022,0.,0.,-0.382022); GaussianBayesNet expected3; - push_front(expected3,ordering[kx(5)], zero(2), eye(2)/sigma3, ordering[kx(6)], A56/sigma3, ones(2)); - GaussianISAM::sharedClique C3 = isamTree[ordering[kx(4)]]; + push_front(expected3,ordering[X(5)], zero(2), eye(2)/sigma3, ordering[X(6)], A56/sigma3, ones(2)); + GaussianISAM::sharedClique C3 = isamTree[ordering[X(4)]]; GaussianBayesNet actual3 = GaussianISAM::shortcut(C3,R); EXPECT(assert_equal(expected3,actual3,tol)); @@ -147,8 +147,8 @@ TEST_UNSAFE( BayesTree, linear_smoother_shortcuts ) double sigma4 = 0.661968; Matrix A46 = Matrix_(2,2,-0.146067,0.,0.,-0.146067); GaussianBayesNet expected4; - push_front(expected4, ordering[kx(4)], zero(2), eye(2)/sigma4, ordering[kx(6)], A46/sigma4, ones(2)); - GaussianISAM::sharedClique C4 = isamTree[ordering[kx(3)]]; + push_front(expected4, ordering[X(4)], zero(2), eye(2)/sigma4, ordering[X(6)], A46/sigma4, ones(2)); + GaussianISAM::sharedClique C4 = isamTree[ordering[X(3)]]; GaussianBayesNet actual4 = GaussianISAM::shortcut(C4,R); EXPECT(assert_equal(expected4,actual4,tol)); } @@ -176,7 +176,7 @@ TEST_UNSAFE( BayesTree, balanced_smoother_marginals ) { // Create smoother with 7 nodes Ordering ordering; - ordering += kx(1),kx(3),kx(5),kx(7),kx(2),kx(6),kx(4); + ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); GaussianFactorGraph smoother = createSmoother(7, ordering).first; // Create the Bayes tree @@ -193,48 +193,48 @@ TEST_UNSAFE( BayesTree, balanced_smoother_marginals ) double tol=1e-5; // Check marginal on x1 - GaussianBayesNet expected1 = simpleGaussian(ordering[kx(1)], zero(2), sigmax1); - GaussianBayesNet actual1 = *bayesTree.marginalBayesNet(ordering[kx(1)]); + GaussianBayesNet expected1 = simpleGaussian(ordering[X(1)], zero(2), sigmax1); + GaussianBayesNet actual1 = *bayesTree.marginalBayesNet(ordering[X(1)]); Matrix expectedCovarianceX1 = eye(2,2) * (sigmax1 * sigmax1); Matrix actualCovarianceX1; - actualCovarianceX1 = bayesTree.marginalCovariance(ordering[kx(1)]); + actualCovarianceX1 = bayesTree.marginalCovariance(ordering[X(1)]); EXPECT(assert_equal(expectedCovarianceX1, actualCovarianceX1, tol)); EXPECT(assert_equal(expected1,actual1,tol)); // Check marginal on x2 double sigx2 = 0.68712938; // FIXME: this should be corrected analytically - GaussianBayesNet expected2 = simpleGaussian(ordering[kx(2)], zero(2), sigx2); - GaussianBayesNet actual2 = *bayesTree.marginalBayesNet(ordering[kx(2)]); + GaussianBayesNet expected2 = simpleGaussian(ordering[X(2)], zero(2), sigx2); + GaussianBayesNet actual2 = *bayesTree.marginalBayesNet(ordering[X(2)]); Matrix expectedCovarianceX2 = eye(2,2) * (sigx2 * sigx2); Matrix actualCovarianceX2; - actualCovarianceX2 = bayesTree.marginalCovariance(ordering[kx(2)]); + actualCovarianceX2 = bayesTree.marginalCovariance(ordering[X(2)]); EXPECT(assert_equal(expectedCovarianceX2, actualCovarianceX2, tol)); EXPECT(assert_equal(expected2,actual2,tol)); // Check marginal on x3 - GaussianBayesNet expected3 = simpleGaussian(ordering[kx(3)], zero(2), sigmax3); - GaussianBayesNet actual3 = *bayesTree.marginalBayesNet(ordering[kx(3)]); + GaussianBayesNet expected3 = simpleGaussian(ordering[X(3)], zero(2), sigmax3); + GaussianBayesNet actual3 = *bayesTree.marginalBayesNet(ordering[X(3)]); Matrix expectedCovarianceX3 = eye(2,2) * (sigmax3 * sigmax3); Matrix actualCovarianceX3; - actualCovarianceX3 = bayesTree.marginalCovariance(ordering[kx(3)]); + actualCovarianceX3 = bayesTree.marginalCovariance(ordering[X(3)]); EXPECT(assert_equal(expectedCovarianceX3, actualCovarianceX3, tol)); EXPECT(assert_equal(expected3,actual3,tol)); // Check marginal on x4 - GaussianBayesNet expected4 = simpleGaussian(ordering[kx(4)], zero(2), sigmax4); - GaussianBayesNet actual4 = *bayesTree.marginalBayesNet(ordering[kx(4)]); + GaussianBayesNet expected4 = simpleGaussian(ordering[X(4)], zero(2), sigmax4); + GaussianBayesNet actual4 = *bayesTree.marginalBayesNet(ordering[X(4)]); Matrix expectedCovarianceX4 = eye(2,2) * (sigmax4 * sigmax4); Matrix actualCovarianceX4; - actualCovarianceX4 = bayesTree.marginalCovariance(ordering[kx(4)]); + actualCovarianceX4 = bayesTree.marginalCovariance(ordering[X(4)]); EXPECT(assert_equal(expectedCovarianceX4, actualCovarianceX4, tol)); EXPECT(assert_equal(expected4,actual4,tol)); // Check marginal on x7 (should be equal to x1) - GaussianBayesNet expected7 = simpleGaussian(ordering[kx(7)], zero(2), sigmax7); - GaussianBayesNet actual7 = *bayesTree.marginalBayesNet(ordering[kx(7)]); + GaussianBayesNet expected7 = simpleGaussian(ordering[X(7)], zero(2), sigmax7); + GaussianBayesNet actual7 = *bayesTree.marginalBayesNet(ordering[X(7)]); Matrix expectedCovarianceX7 = eye(2,2) * (sigmax7 * sigmax7); Matrix actualCovarianceX7; - actualCovarianceX7 = bayesTree.marginalCovariance(ordering[kx(7)]); + actualCovarianceX7 = bayesTree.marginalCovariance(ordering[X(7)]); EXPECT(assert_equal(expectedCovarianceX7, actualCovarianceX7, tol)); EXPECT(assert_equal(expected7,actual7,tol)); } @@ -244,7 +244,7 @@ TEST_UNSAFE( BayesTree, balanced_smoother_shortcuts ) { // Create smoother with 7 nodes Ordering ordering; - ordering += kx(1),kx(3),kx(5),kx(7),kx(2),kx(6),kx(4); + ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); GaussianFactorGraph smoother = createSmoother(7, ordering).first; // Create the Bayes tree @@ -258,19 +258,19 @@ TEST_UNSAFE( BayesTree, balanced_smoother_shortcuts ) EXPECT(assert_equal(empty,actual1,tol)); // Check the conditional P(C2|Root) - GaussianISAM::sharedClique C2 = isamTree[ordering[kx(3)]]; + GaussianISAM::sharedClique C2 = isamTree[ordering[X(3)]]; GaussianBayesNet actual2 = GaussianISAM::shortcut(C2,R); EXPECT(assert_equal(empty,actual2,tol)); // Check the conditional P(C3|Root), which should be equal to P(x2|x4) /** TODO: Note for multifrontal conditional: - * p_x2_x4 is now an element conditional of the multifrontal conditional bayesTree[ordering[kx(2)]]->conditional() + * p_x2_x4 is now an element conditional of the multifrontal conditional bayesTree[ordering[X(2)]]->conditional() * We don't know yet how to take it out. */ -// GaussianConditional::shared_ptr p_x2_x4 = bayesTree[ordering[kx(2)]]->conditional(); +// GaussianConditional::shared_ptr p_x2_x4 = bayesTree[ordering[X(2)]]->conditional(); // p_x2_x4->print("Conditional p_x2_x4: "); // GaussianBayesNet expected3(p_x2_x4); -// GaussianISAM::sharedClique C3 = isamTree[ordering[kx(1)]]; +// GaussianISAM::sharedClique C3 = isamTree[ordering[X(1)]]; // GaussianBayesNet actual3 = GaussianISAM::shortcut(C3,R); // EXPECT(assert_equal(expected3,actual3,tol)); } @@ -280,7 +280,7 @@ TEST_UNSAFE( BayesTree, balanced_smoother_shortcuts ) //{ // // Create smoother with 7 nodes // Ordering ordering; -// ordering += kx(1),kx(3),kx(5),kx(7),kx(2),kx(6),kx(4); +// ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); // GaussianFactorGraph smoother = createSmoother(7, ordering).first; // // // Create the Bayes tree @@ -289,9 +289,9 @@ TEST_UNSAFE( BayesTree, balanced_smoother_shortcuts ) // // // Check the clique marginal P(C3) // double sigmax2_alt = 1/1.45533; // THIS NEEDS TO BE CHECKED! -// GaussianBayesNet expected = simpleGaussian(ordering[kx(2)],zero(2),sigmax2_alt); -// push_front(expected,ordering[kx(1)], zero(2), eye(2)*sqrt(2), ordering[kx(2)], -eye(2)*sqrt(2)/2, ones(2)); -// GaussianISAM::sharedClique R = bayesTree.root(), C3 = bayesTree[ordering[kx(1)]]; +// GaussianBayesNet expected = simpleGaussian(ordering[X(2)],zero(2),sigmax2_alt); +// push_front(expected,ordering[X(1)], zero(2), eye(2)*sqrt(2), ordering[X(2)], -eye(2)*sqrt(2)/2, ones(2)); +// GaussianISAM::sharedClique R = bayesTree.root(), C3 = bayesTree[ordering[X(1)]]; // GaussianFactorGraph marginal = C3->marginal(R); // GaussianVariableIndex varIndex(marginal); // Permutation toFront(Permutation::PullToFront(C3->keys(), varIndex.size())); @@ -309,7 +309,7 @@ TEST_UNSAFE( BayesTree, balanced_smoother_joint ) { // Create smoother with 7 nodes Ordering ordering; - ordering += kx(1),kx(3),kx(5),kx(7),kx(2),kx(6),kx(4); + ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); GaussianFactorGraph smoother = createSmoother(7, ordering).first; // Create the Bayes tree, expected to look like: @@ -328,41 +328,41 @@ TEST_UNSAFE( BayesTree, balanced_smoother_joint ) GaussianBayesNet expected1; // Why does the sign get flipped on the prior? GaussianConditional::shared_ptr - parent1(new GaussianConditional(ordering[kx(7)], zero(2), -1*I/sigmax7, ones(2))); + parent1(new GaussianConditional(ordering[X(7)], zero(2), -1*I/sigmax7, ones(2))); expected1.push_front(parent1); - push_front(expected1,ordering[kx(1)], zero(2), I/sigmax7, ordering[kx(7)], A/sigmax7, sigma); - GaussianBayesNet actual1 = *bayesTree.jointBayesNet(ordering[kx(1)],ordering[kx(7)]); + push_front(expected1,ordering[X(1)], zero(2), I/sigmax7, ordering[X(7)], A/sigmax7, sigma); + GaussianBayesNet actual1 = *bayesTree.jointBayesNet(ordering[X(1)],ordering[X(7)]); EXPECT(assert_equal(expected1,actual1,tol)); // // Check the joint density P(x7,x1) factored as P(x7|x1)P(x1) // GaussianBayesNet expected2; // GaussianConditional::shared_ptr -// parent2(new GaussianConditional(ordering[kx(1)], zero(2), -1*I/sigmax1, ones(2))); +// parent2(new GaussianConditional(ordering[X(1)], zero(2), -1*I/sigmax1, ones(2))); // expected2.push_front(parent2); -// push_front(expected2,ordering[kx(7)], zero(2), I/sigmax1, ordering[kx(1)], A/sigmax1, sigma); -// GaussianBayesNet actual2 = *bayesTree.jointBayesNet(ordering[kx(7)],ordering[kx(1)]); +// push_front(expected2,ordering[X(7)], zero(2), I/sigmax1, ordering[X(1)], A/sigmax1, sigma); +// GaussianBayesNet actual2 = *bayesTree.jointBayesNet(ordering[X(7)],ordering[X(1)]); // EXPECT(assert_equal(expected2,actual2,tol)); // Check the joint density P(x1,x4), i.e. with a root variable GaussianBayesNet expected3; GaussianConditional::shared_ptr - parent3(new GaussianConditional(ordering[kx(4)], zero(2), I/sigmax4, ones(2))); + parent3(new GaussianConditional(ordering[X(4)], zero(2), I/sigmax4, ones(2))); expected3.push_front(parent3); double sig14 = 0.784465; Matrix A14 = -0.0769231*I; - push_front(expected3,ordering[kx(1)], zero(2), I/sig14, ordering[kx(4)], A14/sig14, sigma); - GaussianBayesNet actual3 = *bayesTree.jointBayesNet(ordering[kx(1)],ordering[kx(4)]); + push_front(expected3,ordering[X(1)], zero(2), I/sig14, ordering[X(4)], A14/sig14, sigma); + GaussianBayesNet actual3 = *bayesTree.jointBayesNet(ordering[X(1)],ordering[X(4)]); EXPECT(assert_equal(expected3,actual3,tol)); // // Check the joint density P(x4,x1), i.e. with a root variable, factored the other way // GaussianBayesNet expected4; // GaussianConditional::shared_ptr -// parent4(new GaussianConditional(ordering[kx(1)], zero(2), -1.0*I/sigmax1, ones(2))); +// parent4(new GaussianConditional(ordering[X(1)], zero(2), -1.0*I/sigmax1, ones(2))); // expected4.push_front(parent4); // double sig41 = 0.668096; // Matrix A41 = -0.055794*I; -// push_front(expected4,ordering[kx(4)], zero(2), I/sig41, ordering[kx(1)], A41/sig41, sigma); -// GaussianBayesNet actual4 = *bayesTree.jointBayesNet(ordering[kx(4)],ordering[kx(1)]); +// push_front(expected4,ordering[X(4)], zero(2), I/sig41, ordering[X(1)], A41/sig41, sigma); +// GaussianBayesNet actual4 = *bayesTree.jointBayesNet(ordering[X(4)],ordering[X(1)]); // EXPECT(assert_equal(expected4,actual4,tol)); } diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 7d73ef83b..03e2d27d3 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -42,8 +42,8 @@ using namespace std; using namespace gtsam; using namespace example; -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* * Bayes tree for smoother with "nested dissection" ordering: @@ -55,20 +55,20 @@ Key kl(size_t i) { return Symbol('l',i); } TEST( GaussianJunctionTree, constructor2 ) { // create a graph - Ordering ordering; ordering += kx(1),kx(3),kx(5),kx(7),kx(2),kx(6),kx(4); + Ordering ordering; ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); GaussianFactorGraph fg = createSmoother(7, ordering).first; // create an ordering GaussianJunctionTree actual(fg); - vector frontal1; frontal1 += ordering[kx(5)], ordering[kx(6)], ordering[kx(4)]; - vector frontal2; frontal2 += ordering[kx(3)], ordering[kx(2)]; - vector frontal3; frontal3 += ordering[kx(1)]; - vector frontal4; frontal4 += ordering[kx(7)]; + vector frontal1; frontal1 += ordering[X(5)], ordering[X(6)], ordering[X(4)]; + vector frontal2; frontal2 += ordering[X(3)], ordering[X(2)]; + vector frontal3; frontal3 += ordering[X(1)]; + vector frontal4; frontal4 += ordering[X(7)]; vector sep1; - vector sep2; sep2 += ordering[kx(4)]; - vector sep3; sep3 += ordering[kx(2)]; - vector sep4; sep4 += ordering[kx(6)]; + vector sep2; sep2 += ordering[X(4)]; + vector sep3; sep3 += ordering[X(2)]; + vector sep4; sep4 += ordering[X(6)]; EXPECT(assert_equal(frontal1, actual.root()->frontal)); EXPECT(assert_equal(sep1, actual.root()->separator)); LONGS_EQUAL(5, actual.root()->size()); @@ -103,7 +103,7 @@ TEST( GaussianJunctionTree, optimizeMultiFrontal ) VectorValues expected(vector(7,2)); // expected solution Vector v = Vector_(2, 0., 0.); for (int i=1; i<=7; i++) - expected[ordering[Symbol('x',i)]] = v; + expected[ordering[X(i)]] = v; EXPECT(assert_equal(expected,actual)); } @@ -113,7 +113,7 @@ TEST( GaussianJunctionTree, optimizeMultiFrontal2) // create a graph example::Graph nlfg = createNonlinearFactorGraph(); Values noisy = createNoisyValues(); - Ordering ordering; ordering += kx(1),kx(2),kl(1); + Ordering ordering; ordering += X(1),X(2),L(1); GaussianFactorGraph fg = *nlfg.linearize(noisy, ordering); // optimize the graph @@ -136,39 +136,39 @@ TEST(GaussianJunctionTree, slamlike) { size_t i = 0; newfactors = planarSLAM::Graph(); - newfactors.addPrior(kx(0), Pose2(0.0, 0.0, 0.0), odoNoise); - init.insert(kx(0), Pose2(0.01, 0.01, 0.01)); + newfactors.addPrior(X(0), Pose2(0.0, 0.0, 0.0), odoNoise); + init.insert(X(0), Pose2(0.01, 0.01, 0.01)); fullgraph.push_back(newfactors); for( ; i<5; ++i) { newfactors = planarSLAM::Graph(); - newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); - init.insert(kx(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } newfactors = planarSLAM::Graph(); - newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(kx(i), kl(0), Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(kx(i), kl(1), Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - init.insert(kx(i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(kl(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(kl(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(X(i), L(0), Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(X(i), L(1), Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + init.insert(X(i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(L(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(L(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); fullgraph.push_back(newfactors); ++ i; for( ; i<5; ++i) { newfactors = planarSLAM::Graph(); - newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); - init.insert(kx(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } newfactors = planarSLAM::Graph(); - newfactors.addOdometry(kx(i), kx(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(kx(i), kl(0), Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(kx(i), kl(1), Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - init.insert(kx(i+1), Pose2(6.9, 0.1, 0.01)); + newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(X(i), L(0), Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(X(i), L(1), Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + init.insert(X(i+1), Pose2(6.9, 0.1, 0.01)); fullgraph.push_back(newfactors); ++ i; @@ -194,15 +194,15 @@ TEST(GaussianJunctionTree, simpleMarginal) { // Create a simple graph pose2SLAM::Graph fg; - fg.addPrior(kx(0), Pose2(), sharedSigma(3, 10.0)); - fg.addOdometry(kx(0), kx(1), Pose2(1.0, 0.0, 0.0), sharedSigmas(Vector_(3, 10.0, 1.0, 1.0))); + fg.addPrior(X(0), Pose2(), sharedSigma(3, 10.0)); + fg.addOdometry(X(0), X(1), Pose2(1.0, 0.0, 0.0), sharedSigmas(Vector_(3, 10.0, 1.0, 1.0))); Values init; - init.insert(kx(0), Pose2()); - init.insert(kx(1), Pose2(1.0, 0.0, 0.0)); + init.insert(X(0), Pose2()); + init.insert(X(1), Pose2(1.0, 0.0, 0.0)); Ordering ordering; - ordering += kx(1), kx(0); + ordering += X(1), X(0); GaussianFactorGraph gfg = *fg.linearize(init, ordering); diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index e023fe7e3..262d1801c 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -27,8 +27,8 @@ using namespace std; using namespace gtsam; // Convenience for named keys -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ // The tests below test the *generic* inference algorithms. Some of these have @@ -57,23 +57,23 @@ TEST( inference, marginals2) SharedDiagonal poseModel(sharedSigma(3, 0.1)); SharedDiagonal pointModel(sharedSigma(3, 0.1)); - fg.addPrior(kx(0), Pose2(), poseModel); - fg.addOdometry(kx(0), kx(1), Pose2(1.0,0.0,0.0), poseModel); - fg.addOdometry(kx(1), kx(2), Pose2(1.0,0.0,0.0), poseModel); - fg.addBearingRange(kx(0), kl(0), Rot2(), 1.0, pointModel); - fg.addBearingRange(kx(1), kl(0), Rot2(), 1.0, pointModel); - fg.addBearingRange(kx(2), kl(0), Rot2(), 1.0, pointModel); + fg.addPrior(X(0), Pose2(), poseModel); + fg.addOdometry(X(0), X(1), Pose2(1.0,0.0,0.0), poseModel); + fg.addOdometry(X(1), X(2), Pose2(1.0,0.0,0.0), poseModel); + fg.addBearingRange(X(0), L(0), Rot2(), 1.0, pointModel); + fg.addBearingRange(X(1), L(0), Rot2(), 1.0, pointModel); + fg.addBearingRange(X(2), L(0), Rot2(), 1.0, pointModel); Values init; - init.insert(kx(0), Pose2(0.0,0.0,0.0)); - init.insert(kx(1), Pose2(1.0,0.0,0.0)); - init.insert(kx(2), Pose2(2.0,0.0,0.0)); - init.insert(kl(0), Point2(1.0,1.0)); + init.insert(X(0), Pose2(0.0,0.0,0.0)); + init.insert(X(1), Pose2(1.0,0.0,0.0)); + init.insert(X(2), Pose2(2.0,0.0,0.0)); + init.insert(L(0), Point2(1.0,1.0)); Ordering ordering(*fg.orderingCOLAMD(init)); FactorGraph::shared_ptr gfg(fg.linearize(init, ordering)); GaussianMultifrontalSolver solver(*gfg); - solver.marginalFactor(ordering[kl(0)]); + solver.marginalFactor(ordering[L(0)]); } /* ************************************************************************* */ diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index eac14d480..e203bcf94 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -39,8 +39,8 @@ using namespace gtsam; using namespace example; // Convenience for named keys -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; typedef boost::shared_ptr shared_nlf; @@ -51,11 +51,11 @@ TEST( NonlinearFactor, equals ) // create two nonlinear2 factors Point2 z3(0.,-1.); - simulated2D::Measurement f0(z3, sigma, kx(1),kl(1)); + simulated2D::Measurement f0(z3, sigma, X(1),L(1)); // measurement between x2 and l1 Point2 z4(-1.5, -1.); - simulated2D::Measurement f1(z4, sigma, kx(2),kl(1)); + simulated2D::Measurement f1(z4, sigma, X(2),L(1)); CHECK(assert_equal(f0,f0)); CHECK(f0.equals(f0)); @@ -201,16 +201,16 @@ TEST( NonlinearFactor, linearize_constraint1 ) SharedDiagonal constraint = noiseModel::Constrained::MixedSigmas(sigmas); Point2 mu(1., -1.); - Graph::sharedFactor f0(new simulated2D::Prior(mu, constraint, kx(1))); + Graph::sharedFactor f0(new simulated2D::Prior(mu, constraint, X(1))); Values config; - config.insert(kx(1), Point2(1.0, 2.0)); + config.insert(X(1), Point2(1.0, 2.0)); GaussianFactor::shared_ptr actual = f0->linearize(config, *config.orderingArbitrary()); // create expected Ordering ord(*config.orderingArbitrary()); Vector b = Vector_(2, 0., -3.); - JacobianFactor expected(ord[kx(1)], Matrix_(2,2, 5.0, 0.0, 0.0, 1.0), b, constraint); + JacobianFactor expected(ord[X(1)], Matrix_(2,2, 5.0, 0.0, 0.0, 1.0), b, constraint); CHECK(assert_equal((const GaussianFactor&)expected, *actual)); } @@ -221,18 +221,18 @@ TEST( NonlinearFactor, linearize_constraint2 ) SharedDiagonal constraint = noiseModel::Constrained::MixedSigmas(sigmas); Point2 z3(1.,-1.); - simulated2D::Measurement f0(z3, constraint, kx(1),kl(1)); + simulated2D::Measurement f0(z3, constraint, X(1),L(1)); Values config; - config.insert(kx(1), Point2(1.0, 2.0)); - config.insert(kl(1), Point2(5.0, 4.0)); + config.insert(X(1), Point2(1.0, 2.0)); + config.insert(L(1), Point2(5.0, 4.0)); GaussianFactor::shared_ptr actual = f0.linearize(config, *config.orderingArbitrary()); // create expected Ordering ord(*config.orderingArbitrary()); Matrix A = Matrix_(2,2, 5.0, 0.0, 0.0, 1.0); Vector b = Vector_(2, -15., -3.); - JacobianFactor expected(ord[kx(1)], -1*A, ord[kl(1)], A, b, constraint); + JacobianFactor expected(ord[X(1)], -1*A, ord[L(1)], A, b, constraint); CHECK(assert_equal((const GaussianFactor&)expected, *actual)); } @@ -240,7 +240,7 @@ TEST( NonlinearFactor, linearize_constraint2 ) class TestFactor4 : public NoiseModelFactor4 { public: typedef NoiseModelFactor4 Base; - TestFactor4() : Base(sharedSigmas(Vector_(1, 2.0)), kx(1), kx(2), kx(3), kx(4)) {} + TestFactor4() : Base(sharedSigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4)) {} virtual Vector evaluateError(const LieVector& x1, const LieVector& x2, const LieVector& x3, const LieVector& x4, @@ -264,13 +264,13 @@ public: TEST(NonlinearFactor, NoiseModelFactor4) { TestFactor4 tf; Values tv; - tv.insert(kx(1), LieVector(1, 1.0)); - tv.insert(kx(2), LieVector(1, 2.0)); - tv.insert(kx(3), LieVector(1, 3.0)); - tv.insert(kx(4), LieVector(1, 4.0)); + tv.insert(X(1), LieVector(1, 1.0)); + tv.insert(X(2), LieVector(1, 2.0)); + tv.insert(X(3), LieVector(1, 3.0)); + tv.insert(X(4), LieVector(1, 4.0)); EXPECT(assert_equal(Vector_(1, 10.0), tf.unwhitenedError(tv))); DOUBLES_EQUAL(25.0/2.0, tf.error(tv), 1e-9); - Ordering ordering; ordering += kx(1), kx(2), kx(3), kx(4); + Ordering ordering; ordering += X(1), X(2), X(3), X(4); JacobianFactor jf(*boost::dynamic_pointer_cast(tf.linearize(tv, ordering))); LONGS_EQUAL(jf.keys()[0], 0); LONGS_EQUAL(jf.keys()[1], 1); @@ -287,7 +287,7 @@ TEST(NonlinearFactor, NoiseModelFactor4) { class TestFactor5 : public NoiseModelFactor5 { public: typedef NoiseModelFactor5 Base; - TestFactor5() : Base(sharedSigmas(Vector_(1, 2.0)), kx(1), kx(2), kx(3), kx(4), kx(5)) {} + TestFactor5() : Base(sharedSigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4), X(5)) {} virtual Vector evaluateError(const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, @@ -313,14 +313,14 @@ public: TEST(NonlinearFactor, NoiseModelFactor5) { TestFactor5 tf; Values tv; - tv.insert(kx(1), LieVector(1, 1.0)); - tv.insert(kx(2), LieVector(1, 2.0)); - tv.insert(kx(3), LieVector(1, 3.0)); - tv.insert(kx(4), LieVector(1, 4.0)); - tv.insert(kx(5), LieVector(1, 5.0)); + tv.insert(X(1), LieVector(1, 1.0)); + tv.insert(X(2), LieVector(1, 2.0)); + tv.insert(X(3), LieVector(1, 3.0)); + tv.insert(X(4), LieVector(1, 4.0)); + tv.insert(X(5), LieVector(1, 5.0)); EXPECT(assert_equal(Vector_(1, 15.0), tf.unwhitenedError(tv))); DOUBLES_EQUAL(56.25/2.0, tf.error(tv), 1e-9); - Ordering ordering; ordering += kx(1), kx(2), kx(3), kx(4), kx(5); + Ordering ordering; ordering += X(1), X(2), X(3), X(4), X(5); JacobianFactor jf(*boost::dynamic_pointer_cast(tf.linearize(tv, ordering))); LONGS_EQUAL(jf.keys()[0], 0); LONGS_EQUAL(jf.keys()[1], 1); @@ -339,7 +339,7 @@ TEST(NonlinearFactor, NoiseModelFactor5) { class TestFactor6 : public NoiseModelFactor6 { public: typedef NoiseModelFactor6 Base; - TestFactor6() : Base(sharedSigmas(Vector_(1, 2.0)), kx(1), kx(2), kx(3), kx(4), kx(5), kx(6)) {} + TestFactor6() : Base(sharedSigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4), X(5), X(6)) {} virtual Vector evaluateError(const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, @@ -367,15 +367,15 @@ public: TEST(NonlinearFactor, NoiseModelFactor6) { TestFactor6 tf; Values tv; - tv.insert(kx(1), LieVector(1, 1.0)); - tv.insert(kx(2), LieVector(1, 2.0)); - tv.insert(kx(3), LieVector(1, 3.0)); - tv.insert(kx(4), LieVector(1, 4.0)); - tv.insert(kx(5), LieVector(1, 5.0)); - tv.insert(kx(6), LieVector(1, 6.0)); + tv.insert(X(1), LieVector(1, 1.0)); + tv.insert(X(2), LieVector(1, 2.0)); + tv.insert(X(3), LieVector(1, 3.0)); + tv.insert(X(4), LieVector(1, 4.0)); + tv.insert(X(5), LieVector(1, 5.0)); + tv.insert(X(6), LieVector(1, 6.0)); EXPECT(assert_equal(Vector_(1, 21.0), tf.unwhitenedError(tv))); DOUBLES_EQUAL(110.25/2.0, tf.error(tv), 1e-9); - Ordering ordering; ordering += kx(1), kx(2), kx(3), kx(4), kx(5), kx(6); + Ordering ordering; ordering += X(1), X(2), X(3), X(4), X(5), X(6); JacobianFactor jf(*boost::dynamic_pointer_cast(tf.linearize(tv, ordering))); LONGS_EQUAL(jf.keys()[0], 0); LONGS_EQUAL(jf.keys()[1], 1); @@ -397,10 +397,10 @@ TEST(NonlinearFactor, NoiseModelFactor6) { TEST( NonlinearFactor, clone_rekey ) { shared_nlf init(new TestFactor4()); - EXPECT_LONGS_EQUAL(kx(1), init->keys()[0]); - EXPECT_LONGS_EQUAL(kx(2), init->keys()[1]); - EXPECT_LONGS_EQUAL(kx(3), init->keys()[2]); - EXPECT_LONGS_EQUAL(kx(4), init->keys()[3]); + EXPECT_LONGS_EQUAL(X(1), init->keys()[0]); + EXPECT_LONGS_EQUAL(X(2), init->keys()[1]); + EXPECT_LONGS_EQUAL(X(3), init->keys()[2]); + EXPECT_LONGS_EQUAL(X(4), init->keys()[3]); // Standard clone shared_nlf actClone = init->clone(); @@ -409,24 +409,24 @@ TEST( NonlinearFactor, clone_rekey ) // Re-key factor - clones with different keys std::vector new_keys(4); - new_keys[0] = kx(5); - new_keys[1] = kx(6); - new_keys[2] = kx(7); - new_keys[3] = kx(8); + new_keys[0] = X(5); + new_keys[1] = X(6); + new_keys[2] = X(7); + new_keys[3] = X(8); shared_nlf actRekey = init->rekey(new_keys); EXPECT(actRekey.get() != init.get()); // Ensure different pointers // Ensure init is unchanged - EXPECT_LONGS_EQUAL(kx(1), init->keys()[0]); - EXPECT_LONGS_EQUAL(kx(2), init->keys()[1]); - EXPECT_LONGS_EQUAL(kx(3), init->keys()[2]); - EXPECT_LONGS_EQUAL(kx(4), init->keys()[3]); + EXPECT_LONGS_EQUAL(X(1), init->keys()[0]); + EXPECT_LONGS_EQUAL(X(2), init->keys()[1]); + EXPECT_LONGS_EQUAL(X(3), init->keys()[2]); + EXPECT_LONGS_EQUAL(X(4), init->keys()[3]); // Check new keys - EXPECT_LONGS_EQUAL(kx(5), actRekey->keys()[0]); - EXPECT_LONGS_EQUAL(kx(6), actRekey->keys()[1]); - EXPECT_LONGS_EQUAL(kx(7), actRekey->keys()[2]); - EXPECT_LONGS_EQUAL(kx(8), actRekey->keys()[3]); + EXPECT_LONGS_EQUAL(X(5), actRekey->keys()[0]); + EXPECT_LONGS_EQUAL(X(6), actRekey->keys()[1]); + EXPECT_LONGS_EQUAL(X(7), actRekey->keys()[2]); + EXPECT_LONGS_EQUAL(X(8), actRekey->keys()[3]); } /* ************************************************************************* */ diff --git a/tests/testNonlinearFactorGraph.cpp b/tests/testNonlinearFactorGraph.cpp index 59ee0977e..d1d240a67 100644 --- a/tests/testNonlinearFactorGraph.cpp +++ b/tests/testNonlinearFactorGraph.cpp @@ -37,8 +37,8 @@ using namespace boost::assign; using namespace gtsam; using namespace example; -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( Graph, equals ) @@ -68,16 +68,16 @@ TEST( Graph, keys ) set actual = fg.keys(); LONGS_EQUAL(3, actual.size()); set::const_iterator it = actual.begin(); - LONGS_EQUAL(kl(1), *(it++)); - LONGS_EQUAL(kx(1), *(it++)); - LONGS_EQUAL(kx(2), *(it++)); + LONGS_EQUAL(L(1), *(it++)); + LONGS_EQUAL(X(1), *(it++)); + LONGS_EQUAL(X(2), *(it++)); } /* ************************************************************************* */ TEST( Graph, GET_ORDERING) { // Ordering expected; expected += "x1","l1","x2"; // For starting with x1,x2,l1 - Ordering expected; expected += kl(1), kx(2), kx(1); // For starting with l1,x1,x2 + Ordering expected; expected += L(1), X(2), X(1); // For starting with l1,x1,x2 Graph nlfg = createNonlinearFactorGraph(); SymbolicFactorGraph::shared_ptr symbolic; Ordering::shared_ptr ordering; @@ -123,7 +123,7 @@ TEST( Graph, rekey ) { Graph init = createNonlinearFactorGraph(); map rekey_mapping; - rekey_mapping.insert(make_pair(kl(1), kl(4))); + rekey_mapping.insert(make_pair(L(1), L(4))); Graph actRekey = init.rekey(rekey_mapping); // ensure deep clone @@ -139,8 +139,8 @@ TEST( Graph, rekey ) // updated measurements Point2 z3(0, -1), z4(-1.5, -1.); SharedDiagonal sigma0_2 = noiseModel::Isotropic::Sigma(2,0.2); - expRekey.add(simulated2D::Measurement(z3, sigma0_2, kx(1), kl(4))); - expRekey.add(simulated2D::Measurement(z4, sigma0_2, kx(2), kl(4))); + expRekey.add(simulated2D::Measurement(z3, sigma0_2, X(1), L(4))); + expRekey.add(simulated2D::Measurement(z4, sigma0_2, X(2), L(4))); EXPECT(assert_equal(expRekey, actRekey)); } diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index a59584c96..7cb8bb045 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -39,8 +39,8 @@ using namespace gtsam; const double tol = 1e-5; -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( NonlinearOptimizer, iterateLM ) @@ -51,7 +51,7 @@ TEST( NonlinearOptimizer, iterateLM ) // config far from minimum Point2 x0(3,0); Values config; - config.insert(kx(1), x0); + config.insert(X(1), x0); // normal iterate GaussNewtonParams gnParams; @@ -75,18 +75,18 @@ TEST( NonlinearOptimizer, optimize ) // test error at minimum Point2 xstar(0,0); Values cstar; - cstar.insert(kx(1), xstar); + cstar.insert(X(1), xstar); DOUBLES_EQUAL(0.0,fg.error(cstar),0.0); // test error at initial = [(1-cos(3))^2 + (sin(3))^2]*50 = Point2 x0(3,3); Values c0; - c0.insert(kx(1), x0); + c0.insert(X(1), x0); DOUBLES_EQUAL(199.0,fg.error(c0),1e-3); // optimize parameters Ordering ord; - ord.push_back(kx(1)); + ord.push_back(X(1)); // Gauss-Newton GaussNewtonParams gnParams; @@ -114,7 +114,7 @@ TEST( NonlinearOptimizer, SimpleLMOptimizer ) Point2 x0(3,3); Values c0; - c0.insert(kx(1), x0); + c0.insert(X(1), x0); Values actual = LevenbergMarquardtOptimizer(fg, c0).optimize(); DOUBLES_EQUAL(0,fg.error(actual),tol); @@ -127,7 +127,7 @@ TEST( NonlinearOptimizer, SimpleGNOptimizer ) Point2 x0(3,3); Values c0; - c0.insert(kx(1), x0); + c0.insert(X(1), x0); Values actual = GaussNewtonOptimizer(fg, c0).optimize(); DOUBLES_EQUAL(0,fg.error(actual),tol); @@ -140,7 +140,7 @@ TEST( NonlinearOptimizer, SimpleDLOptimizer ) Point2 x0(3,3); Values c0; - c0.insert(kx(1), x0); + c0.insert(X(1), x0); Values actual = DoglegOptimizer(fg, c0).optimize(); DOUBLES_EQUAL(0,fg.error(actual),tol); @@ -158,7 +158,7 @@ TEST( NonlinearOptimizer, optimization_method ) Point2 x0(3,3); Values c0; - c0.insert(kx(1), x0); + c0.insert(X(1), x0); Values actualMFQR = LevenbergMarquardtOptimizer(fg, c0, paramsQR).optimize(); DOUBLES_EQUAL(0,fg.error(actualMFQR),tol); @@ -171,23 +171,23 @@ TEST( NonlinearOptimizer, optimization_method ) TEST( NonlinearOptimizer, Factorization ) { Values config; - config.insert(kx(1), Pose2(0.,0.,0.)); - config.insert(kx(2), Pose2(1.5,0.,0.)); + config.insert(X(1), Pose2(0.,0.,0.)); + config.insert(X(2), Pose2(1.5,0.,0.)); pose2SLAM::Graph graph; - graph.addPrior(kx(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); - graph.addOdometry(kx(1),kx(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); + graph.addPrior(X(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); + graph.addOdometry(X(1),X(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); Ordering ordering; - ordering.push_back(kx(1)); - ordering.push_back(kx(2)); + ordering.push_back(X(1)); + ordering.push_back(X(2)); LevenbergMarquardtOptimizer optimizer(graph, config, ordering); optimizer.iterate(); Values expected; - expected.insert(kx(1), Pose2(0.,0.,0.)); - expected.insert(kx(2), Pose2(1.,0.,0.)); + expected.insert(X(1), Pose2(0.,0.,0.)); + expected.insert(X(2), Pose2(1.,0.,0.)); CHECK(assert_equal(expected, optimizer.values(), 1e-5)); } @@ -202,18 +202,18 @@ TEST(NonlinearOptimizer, NullFactor) { // test error at minimum Point2 xstar(0,0); Values cstar; - cstar.insert(kx(1), xstar); + cstar.insert(X(1), xstar); DOUBLES_EQUAL(0.0,fg.error(cstar),0.0); // test error at initial = [(1-cos(3))^2 + (sin(3))^2]*50 = Point2 x0(3,3); Values c0; - c0.insert(kx(1), x0); + c0.insert(X(1), x0); DOUBLES_EQUAL(199.0,fg.error(c0),1e-3); // optimize parameters Ordering ord; - ord.push_back(kx(1)); + ord.push_back(X(1)); // Gauss-Newton Values actual1 = GaussNewtonOptimizer(fg, c0, ord).optimize(); diff --git a/tests/testSymbolicBayesNetB.cpp b/tests/testSymbolicBayesNetB.cpp index 356f4bb34..4f0d04595 100644 --- a/tests/testSymbolicBayesNetB.cpp +++ b/tests/testSymbolicBayesNetB.cpp @@ -32,18 +32,18 @@ using namespace std; using namespace gtsam; using namespace example; -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( SymbolicBayesNet, constructor ) { - Ordering o; o += kx(2),kl(1),kx(1); + Ordering o; o += X(2),L(1),X(1); // Create manually IndexConditional::shared_ptr - x2(new IndexConditional(o[kx(2)],o[kl(1)], o[kx(1)])), - l1(new IndexConditional(o[kl(1)],o[kx(1)])), - x1(new IndexConditional(o[kx(1)])); + x2(new IndexConditional(o[X(2)],o[L(1)], o[X(1)])), + l1(new IndexConditional(o[L(1)],o[X(1)])), + x1(new IndexConditional(o[X(1)])); BayesNet expected; expected.push_back(x2); expected.push_back(l1); diff --git a/tests/testSymbolicFactorGraphB.cpp b/tests/testSymbolicFactorGraphB.cpp index cb64ddb4a..8fde094ed 100644 --- a/tests/testSymbolicFactorGraphB.cpp +++ b/tests/testSymbolicFactorGraphB.cpp @@ -30,19 +30,19 @@ using namespace boost::assign; using namespace std; using namespace gtsam; -Key kx(size_t i) { return Symbol('x',i); } -Key kl(size_t i) { return Symbol('l',i); } +using symbol_shorthand::X; +using symbol_shorthand::L; /* ************************************************************************* */ TEST( SymbolicFactorGraph, symbolicFactorGraph ) { - Ordering o; o += kx(1),kl(1),kx(2); + Ordering o; o += X(1),L(1),X(2); // construct expected symbolic graph SymbolicFactorGraph expected; - expected.push_factor(o[kx(1)]); - expected.push_factor(o[kx(1)],o[kx(2)]); - expected.push_factor(o[kx(1)],o[kl(1)]); - expected.push_factor(o[kx(2)],o[kl(1)]); + expected.push_factor(o[X(1)]); + expected.push_factor(o[X(1)],o[X(2)]); + expected.push_factor(o[X(1)],o[L(1)]); + expected.push_factor(o[X(2)],o[L(1)]); // construct it from the factor graph GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(o); @@ -59,7 +59,7 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) // SymbolicFactorGraph actual(factorGraph); // SymbolicFactor::shared_ptr f1 = actual[0]; // SymbolicFactor::shared_ptr f3 = actual[2]; -// actual.findAndRemoveFactors(kx(2)); +// actual.findAndRemoveFactors(X(2)); // // // construct expected graph after find_factors_and_remove // SymbolicFactorGraph expected; @@ -79,13 +79,13 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) // SymbolicFactorGraph fg(factorGraph); // // // ask for all factor indices connected to x1 -// list x1_factors = fg.factors(kx(1)); +// list x1_factors = fg.factors(X(1)); // int x1_indices[] = { 0, 1, 2 }; // list x1_expected(x1_indices, x1_indices + 3); // CHECK(x1_factors==x1_expected); // // // ask for all factor indices connected to x2 -// list x2_factors = fg.factors(kx(2)); +// list x2_factors = fg.factors(X(2)); // int x2_indices[] = { 1, 3 }; // list x2_expected(x2_indices, x2_indices + 2); // CHECK(x2_factors==x2_expected); @@ -99,26 +99,26 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) // SymbolicFactorGraph fg(factorGraph); // // // combine all factors connected to x1 -// SymbolicFactor::shared_ptr actual = removeAndCombineFactors(fg,kx(1)); +// SymbolicFactor::shared_ptr actual = removeAndCombineFactors(fg,X(1)); // // // check result -// SymbolicFactor expected(kl(1),kx(1),kx(2)); +// SymbolicFactor expected(L(1),X(1),X(2)); // CHECK(assert_equal(expected,*actual)); //} ///* ************************************************************************* */ //TEST( SymbolicFactorGraph, eliminateOne ) //{ -// Ordering o; o += kx(1),kl(1),kx(2); +// Ordering o; o += X(1),L(1),X(2); // // create a test graph // GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(o); // SymbolicFactorGraph fg(factorGraph); // // // eliminate -// IndexConditional::shared_ptr actual = GaussianSequentialSolver::EliminateUntil(fg, o[kx(1)]+1); +// IndexConditional::shared_ptr actual = GaussianSequentialSolver::EliminateUntil(fg, o[X(1)]+1); // // // create expected symbolic IndexConditional -// IndexConditional expected(o[kx(1)],o[kl(1)],o[kx(2)]); +// IndexConditional expected(o[X(1)],o[L(1)],o[X(2)]); // // CHECK(assert_equal(expected,*actual)); //} @@ -126,12 +126,12 @@ TEST( SymbolicFactorGraph, symbolicFactorGraph ) /* ************************************************************************* */ TEST( SymbolicFactorGraph, eliminate ) { - Ordering o; o += kx(2),kl(1),kx(1); + Ordering o; o += X(2),L(1),X(1); // create expected Chordal bayes Net - IndexConditional::shared_ptr x2(new IndexConditional(o[kx(2)], o[kl(1)], o[kx(1)])); - IndexConditional::shared_ptr l1(new IndexConditional(o[kl(1)], o[kx(1)])); - IndexConditional::shared_ptr x1(new IndexConditional(o[kx(1)])); + IndexConditional::shared_ptr x2(new IndexConditional(o[X(2)], o[L(1)], o[X(1)])); + IndexConditional::shared_ptr l1(new IndexConditional(o[L(1)], o[X(1)])); + IndexConditional::shared_ptr x1(new IndexConditional(o[X(1)])); SymbolicBayesNet expected; expected.push_back(x2); From ca7e9b6919ade7c20e1ea000ec6f3f517e4cd950 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 2 Jun 2012 20:48:04 +0000 Subject: [PATCH 094/914] under development --- .../discrete/tests/testPlanning.cpp | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 gtsam_unstable/discrete/tests/testPlanning.cpp diff --git a/gtsam_unstable/discrete/tests/testPlanning.cpp b/gtsam_unstable/discrete/tests/testPlanning.cpp new file mode 100644 index 000000000..939dd50b2 --- /dev/null +++ b/gtsam_unstable/discrete/tests/testPlanning.cpp @@ -0,0 +1,37 @@ +/* + * testPlanning.cpp + * @brief develop code for planning example + * @date Feb 13, 2012 + * @author Frank Dellaert + */ + +#include +#include +#include +#include + +using namespace std; +using namespace gtsam; + +/* ************************************************************************* */ +TEST_UNSAFE(Planner, allInOne) +{ + // A small planning problem + // First variable is location + DiscreteKey location("location",3), + haveRock("haveRock",2), haveSoil("haveSoil",2), haveImage("haveImage",2), + commRock("commRock",2), commSoil("commSoil",2), commImage("commImage",2), + haveRock("haveRock",2), haveSoil("haveSoil",2), haveImage("haveImage",2); + + // There are 3 actions: + // Drive, communicate, sample +} + + +/* ************************************************************************* */ +int main() { + TestResult tr; + return TestRegistry::runAllTests(tr); +} +/* ************************************************************************* */ + From f29afd62b4f57057737eaed5bfe1c42bf96b8418 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 2 Jun 2012 22:10:22 +0000 Subject: [PATCH 095/914] Fixed compile errors --- gtsam_unstable/discrete/tests/testPlanning.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gtsam_unstable/discrete/tests/testPlanning.cpp b/gtsam_unstable/discrete/tests/testPlanning.cpp index 939dd50b2..2ad1ff9ae 100644 --- a/gtsam_unstable/discrete/tests/testPlanning.cpp +++ b/gtsam_unstable/discrete/tests/testPlanning.cpp @@ -5,7 +5,8 @@ * @author Frank Dellaert */ -#include +//#include +#include #include #include #include @@ -18,10 +19,9 @@ TEST_UNSAFE(Planner, allInOne) { // A small planning problem // First variable is location - DiscreteKey location("location",3), - haveRock("haveRock",2), haveSoil("haveSoil",2), haveImage("haveImage",2), - commRock("commRock",2), commSoil("commSoil",2), commImage("commImage",2), - haveRock("haveRock",2), haveSoil("haveSoil",2), haveImage("haveImage",2); + DiscreteKey location(0,3), + haveRock(1,2), haveSoil(2,2), haveImage(3,2), + commRock(4,2), commSoil(5,2), commImage(6,2); // There are 3 actions: // Drive, communicate, sample From a00074579948c008fd2aac30d108f11a39996a9e Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 2 Jun 2012 23:21:25 +0000 Subject: [PATCH 096/914] small printing detail --- gtsam/slam/BearingRangeFactor.h | 2 +- gtsam/slam/BetweenFactor.h | 2 +- gtsam/slam/PriorFactor.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index 9fe70123e..0bfa86540 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -66,7 +66,7 @@ namespace gtsam { << keyFormatter(this->key2()) << ")\n"; measuredBearing_.print(" measured bearing"); std::cout << " measured range: " << measuredRange_ << std::endl; - this->noiseModel_->print(" noise model"); + this->noiseModel_->print(" noise model: "); } /** equals */ diff --git a/gtsam/slam/BetweenFactor.h b/gtsam/slam/BetweenFactor.h index ec55c253b..62f66cc48 100644 --- a/gtsam/slam/BetweenFactor.h +++ b/gtsam/slam/BetweenFactor.h @@ -72,7 +72,7 @@ namespace gtsam { << keyFormatter(this->key1()) << "," << keyFormatter(this->key2()) << ")\n"; measured_.print(" measured"); - this->noiseModel_->print(" noise model"); + this->noiseModel_->print(" noise model: "); } /** equals */ diff --git a/gtsam/slam/PriorFactor.h b/gtsam/slam/PriorFactor.h index 6d958c652..608e717dd 100644 --- a/gtsam/slam/PriorFactor.h +++ b/gtsam/slam/PriorFactor.h @@ -64,7 +64,7 @@ namespace gtsam { virtual void print(const std::string& s, const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { std::cout << s << "PriorFactor(" << keyFormatter(this->key()) << ")\n"; prior_.print(" prior"); - this->noiseModel_->print(" noise model"); + this->noiseModel_->print(" noise model: "); } /** equals */ From fd8ec0a605e499526af87e908677909119de1b57 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sun, 3 Jun 2012 02:53:17 +0000 Subject: [PATCH 097/914] fix a switch bug --- .../nonlinear/SuccessiveLinearizationOptimizer.h | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index 387a550db..ea54dd344 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -32,8 +32,7 @@ public: SEQUENTIAL_CHOLESKY, SEQUENTIAL_QR, CHOLMOD, /* Experimental Flag */ - PCG, /* Experimental Flag */ - LSPCG /* Experimental Flag */ + CG, /* Experimental Flag */ }; LinearSolverType linearSolverType; ///< The type of linear solver to use in the nonlinear optimizer @@ -62,11 +61,8 @@ public: case CHOLMOD: std::cout << " linear solver type: CHOLMOD\n"; break; - case PCG: - std::cout << " linear solver type: PCG\n"; - break; - case LSPCG: - std::cout << " linear solver type: LSPCG\n"; + case CG: + std::cout << " linear solver type: CG\n"; break; default: std::cout << " linear solver type: (invalid)\n"; @@ -94,16 +90,16 @@ public: } inline bool isCG() const { - return (linearSolverType == PCG || linearSolverType == LSPCG); + return (linearSolverType == CG); } GaussianFactorGraph::Eliminate getEliminationFunction() { switch (linearSolverType) { case MULTIFRONTAL_CHOLESKY: - case MULTIFRONTAL_QR: + case SEQUENTIAL_CHOLESKY: return EliminatePreferCholesky; - case SEQUENTIAL_CHOLESKY: + case MULTIFRONTAL_QR: case SEQUENTIAL_QR: return EliminateQR; From 608155851a549d0c2feecef144803880eebb5a1c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 03:31:31 +0000 Subject: [PATCH 098/914] formatting --- gtsam.h | 202 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 105 insertions(+), 97 deletions(-) diff --git a/gtsam.h b/gtsam.h index fcf6f0a9f..b2dc6ca79 100644 --- a/gtsam.h +++ b/gtsam.h @@ -68,17 +68,17 @@ namespace gtsam { //************************************************************************* class Point2 { - Point2(); - Point2(double x, double y); - static gtsam::Point2 Expmap(Vector v); + Point2(); + Point2(double x, double y); + static gtsam::Point2 Expmap(Vector v); static Vector Logmap(const gtsam::Point2& p); void print(string s) const; double x(); double y(); - Vector localCoordinates(const gtsam::Point2& p); + Vector localCoordinates(const gtsam::Point2& p); gtsam::Point2 compose(const gtsam::Point2& p2); gtsam::Point2 between(const gtsam::Point2& p2); - gtsam::Point2 retract(Vector v); + gtsam::Point2 retract(Vector v); }; class Point3 { @@ -124,22 +124,22 @@ class Rot2 { class Rot3 { Rot3(); Rot3(Matrix R); - static gtsam::Rot3 Rx(double t); - static gtsam::Rot3 Ry(double t); - static gtsam::Rot3 Rz(double t); + static gtsam::Rot3 Rx(double t); + static gtsam::Rot3 Ry(double t); + static gtsam::Rot3 Rz(double t); // static gtsam::Rot3 RzRyRx(double x, double y, double z); // FIXME: overloaded functions don't work yet - static gtsam::Rot3 RzRyRx(Vector xyz); - static gtsam::Rot3 yaw (double t); // positive yaw is to right (as in aircraft heading) - static gtsam::Rot3 pitch(double t); // positive pitch is up (increasing aircraft altitude) - static gtsam::Rot3 roll (double t); // positive roll is to right (increasing yaw in aircraft) - static gtsam::Rot3 ypr(double y, double p, double r); - static gtsam::Rot3 quaternion(double w, double x, double y, double z); - static gtsam::Rot3 rodriguez(Vector v); + static gtsam::Rot3 RzRyRx(Vector xyz); + static gtsam::Rot3 yaw(double t); // positive yaw is to right (as in aircraft heading) + static gtsam::Rot3 pitch(double t); // positive pitch is up (increasing aircraft altitude) + static gtsam::Rot3 roll(double t); // positive roll is to right (increasing yaw in aircraft) + static gtsam::Rot3 ypr(double y, double p, double r); + static gtsam::Rot3 quaternion(double w, double x, double y, double z); + static gtsam::Rot3 rodriguez(Vector v); void print(string s) const; bool equals(const gtsam::Rot3& rot, double tol) const; - static gtsam::Rot3 identity(); - gtsam::Rot3 compose(const gtsam::Rot3& p2) const; - gtsam::Rot3 inverse() const; + static gtsam::Rot3 identity(); + gtsam::Rot3 compose(const gtsam::Rot3& p2) const; + gtsam::Rot3 inverse() const; gtsam::Rot3 between(const gtsam::Rot3& p2) const; gtsam::Point3 rotate(const gtsam::Point3& p) const; gtsam::Point3 unrotate(const gtsam::Point3& p) const; @@ -154,9 +154,9 @@ class Rot3 { Vector xyz() const; Vector ypr() const; Vector rpy() const; - double roll() const; - double pitch() const; - double yaw() const; + double roll() const; + double pitch() const; + double yaw() const; // Vector toQuaternion() const; // FIXME: Can't cast to Vector properly }; @@ -202,39 +202,36 @@ class Pose3 { gtsam::Pose3 between(const gtsam::Pose3& p2); gtsam::Pose3 retract(Vector v); gtsam::Pose3 retractFirstOrder(Vector v); - Vector localCoordinates(const gtsam::Pose3& T2) const; + Vector localCoordinates(const gtsam::Pose3& T2) const; gtsam::Point3 translation() const; gtsam::Rot3 rotation() const; }; class CalibratedCamera { - - CalibratedCamera(); - CalibratedCamera(const gtsam::Pose3& pose); - CalibratedCamera(const Vector& v); - void print(string s) const; - bool equals(const gtsam::CalibratedCamera& camera, double tol) const; + CalibratedCamera(); + CalibratedCamera(const gtsam::Pose3& pose); + CalibratedCamera(const Vector& v); - gtsam::Pose3 pose() const; + void print(string s) const; + bool equals(const gtsam::CalibratedCamera& camera, double tol) const; - gtsam::CalibratedCamera compose(const gtsam::CalibratedCamera& c) const; - gtsam::CalibratedCamera inverse() const; - gtsam::CalibratedCamera level(const gtsam::Pose2& pose2, double height); - gtsam::CalibratedCamera retract(const Vector& d) const; - Vector localCoordinates(const gtsam::CalibratedCamera& T2) const; + gtsam::Pose3 pose() const; - gtsam::Point2 project(const gtsam::Point3& point) const; - static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); + gtsam::CalibratedCamera compose(const gtsam::CalibratedCamera& c) const; + gtsam::CalibratedCamera inverse() const; + gtsam::CalibratedCamera level(const gtsam::Pose2& pose2, double height); + gtsam::CalibratedCamera retract(const Vector& d) const; + Vector localCoordinates(const gtsam::CalibratedCamera& T2) const; + + gtsam::Point2 project(const gtsam::Point3& point) const; + static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); }; - //************************************************************************* // inference //************************************************************************* - - //************************************************************************* // linear //************************************************************************* @@ -305,7 +302,8 @@ class GaussianFactor { class JacobianFactor { JacobianFactor(); JacobianFactor(Vector b_in); - JacobianFactor(int i1, Matrix A1, Vector b, const gtsam::SharedDiagonal& model); + JacobianFactor(int i1, Matrix A1, Vector b, + const gtsam::SharedDiagonal& model); JacobianFactor(int i1, Matrix A1, int i2, Matrix A2, Vector b, const gtsam::SharedDiagonal& model); JacobianFactor(int i1, Matrix A1, int i2, Matrix A2, int i3, Matrix A3, @@ -330,16 +328,16 @@ class HessianFactor { double f); HessianFactor(const gtsam::GaussianConditional& cg); HessianFactor(const gtsam::GaussianFactor& factor); - void print(string s) const; - bool equals(const gtsam::GaussianFactor& lf, double tol) const; - double error(const gtsam::VectorValues& c) const; + void print(string s) const; + bool equals(const gtsam::GaussianFactor& lf, double tol) const; + double error(const gtsam::VectorValues& c) const; }; class GaussianFactorGraph { GaussianFactorGraph(); - GaussianFactorGraph(const gtsam::GaussianBayesNet& CBN); + GaussianFactorGraph(const gtsam::GaussianBayesNet& CBN); - // From FactorGraph + // From FactorGraph void push_back(gtsam::GaussianFactor* factor); void print(string s) const; bool equals(const gtsam::GaussianFactorGraph& lfgraph, double tol) const; @@ -361,8 +359,9 @@ class GaussianFactorGraph { double probPrime(const gtsam::VectorValues& c) const; // combining - static gtsam::GaussianFactorGraph combine2(const gtsam::GaussianFactorGraph& lfg1, - const gtsam::GaussianFactorGraph& lfg2); + static gtsam::GaussianFactorGraph combine2( + const gtsam::GaussianFactorGraph& lfg1, + const gtsam::GaussianFactorGraph& lfg2); void combine(const gtsam::GaussianFactorGraph& lfg); // Conversion to matrices @@ -372,11 +371,12 @@ class GaussianFactorGraph { }; class GaussianSequentialSolver { - GaussianSequentialSolver(const gtsam::GaussianFactorGraph& graph, bool useQR); - gtsam::GaussianBayesNet* eliminate() const; - gtsam::VectorValues* optimize() const; - gtsam::GaussianFactor* marginalFactor(int j) const; - Matrix marginalCovariance(int j) const; + GaussianSequentialSolver(const gtsam::GaussianFactorGraph& graph, + bool useQR); + gtsam::GaussianBayesNet* eliminate() const; + gtsam::VectorValues* optimize() const; + gtsam::GaussianFactor* marginalFactor(int j) const; + Matrix marginalCovariance(int j) const; }; class KalmanFilter { @@ -385,16 +385,16 @@ class KalmanFilter { gtsam::GaussianDensity* init(Vector x0, Matrix P0); void print(string s) const; static int step(gtsam::GaussianDensity* p); - gtsam::GaussianDensity* predict(gtsam::GaussianDensity* p, Matrix F, Matrix B, Vector u, - const gtsam::SharedDiagonal& modelQ); - gtsam::GaussianDensity* predictQ(gtsam::GaussianDensity* p, Matrix F, Matrix B, Vector u, - Matrix Q); - gtsam::GaussianDensity* predict2(gtsam::GaussianDensity* p, Matrix A0, Matrix A1, Vector b, - const gtsam::SharedDiagonal& model); - gtsam::GaussianDensity* update(gtsam::GaussianDensity* p, Matrix H, Vector z, - const gtsam::SharedDiagonal& model); - gtsam::GaussianDensity* updateQ(gtsam::GaussianDensity* p, Matrix H, Vector z, - Matrix Q); + gtsam::GaussianDensity* predict(gtsam::GaussianDensity* p, Matrix F, + Matrix B, Vector u, const gtsam::SharedDiagonal& modelQ); + gtsam::GaussianDensity* predictQ(gtsam::GaussianDensity* p, Matrix F, + Matrix B, Vector u, Matrix Q); + gtsam::GaussianDensity* predict2(gtsam::GaussianDensity* p, Matrix A0, + Matrix A1, Vector b, const gtsam::SharedDiagonal& model); + gtsam::GaussianDensity* update(gtsam::GaussianDensity* p, Matrix H, + Vector z, const gtsam::SharedDiagonal& model); + gtsam::GaussianDensity* updateQ(gtsam::GaussianDensity* p, Matrix H, + Vector z, Matrix Q); }; //************************************************************************* @@ -402,9 +402,9 @@ class KalmanFilter { //************************************************************************* class Symbol { - Symbol(char c, size_t j); + Symbol(char c, size_t j); void print(string s) const; - size_t key() const; + size_t key() const; }; class Ordering { @@ -415,23 +415,24 @@ class Ordering { }; class NonlinearFactorGraph { - NonlinearFactorGraph(); + NonlinearFactorGraph(); }; class Values { - Values(); - void print(string s) const; - bool exists(size_t j) const; + Values(); + void print(string s) const; + bool exists(size_t j) const; }; class Marginals { - Marginals(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& solution); - void print(string s) const; - Matrix marginalCovariance(size_t variable) const; - Matrix marginalInformation(size_t variable) const; + Marginals(const gtsam::NonlinearFactorGraph& graph, + const gtsam::Values& solution); + void print(string s) const; + Matrix marginalCovariance(size_t variable) const; + Matrix marginalInformation(size_t variable) const; }; -}///\namespace gtsam +} ///\namespace gtsam //************************************************************************* // planarSLAM @@ -459,13 +460,17 @@ class Graph { gtsam::GaussianFactorGraph* linearize(const planarSLAM::Values& values, const gtsam::Ordering& ordering) const; - void addPrior(int key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); - void addPoseConstraint(int key, const gtsam::Pose2& pose); - void addOdometry(int key1, int key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); - void addBearing(int poseKey, int pointKey, const gtsam::Rot2& bearing, const gtsam::SharedNoiseModel& noiseModel); - void addRange(int poseKey, int pointKey, double range, const gtsam::SharedNoiseModel& noiseModel); - void addBearingRange(int poseKey, int pointKey, const gtsam::Rot2& bearing, double range, + void addPrior(int key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); + void addPoseConstraint(int key, const gtsam::Pose2& pose); + void addOdometry(int key1, int key2, const gtsam::Pose2& odometry, + const gtsam::SharedNoiseModel& noiseModel); + void addBearing(int poseKey, int pointKey, const gtsam::Rot2& bearing, + const gtsam::SharedNoiseModel& noiseModel); + void addRange(int poseKey, int pointKey, double range, + const gtsam::SharedNoiseModel& noiseModel); + void addBearingRange(int poseKey, int pointKey, const gtsam::Rot2& bearing, + double range, const gtsam::SharedNoiseModel& noiseModel); planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate); }; @@ -473,10 +478,11 @@ class Odometry { Odometry(int key1, int key2, const gtsam::Pose2& measured, const gtsam::SharedNoiseModel& model); void print(string s) const; - gtsam::GaussianFactor* linearize(const planarSLAM::Values& center, const gtsam::Ordering& ordering) const; + gtsam::GaussianFactor* linearize(const planarSLAM::Values& center, + const gtsam::Ordering& ordering) const; }; -}///\namespace planarSLAM +} ///\namespace planarSLAM //************************************************************************* // Pose2SLAM @@ -486,30 +492,32 @@ class Odometry { namespace pose2SLAM { class Values { - Values(); - void print(string s) const; - void insertPose(int key, const gtsam::Pose2& pose); - gtsam::Pose2 pose(int i); + Values(); + void print(string s) const; + void insertPose(int key, const gtsam::Pose2& pose); + gtsam::Pose2 pose(int i); }; class Graph { - Graph(); + Graph(); - void print(string s) const; + void print(string s) const; - double error(const pose2SLAM::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const pose2SLAM::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const pose2SLAM::Values& values, - const gtsam::Ordering& ordering) const; + double error(const pose2SLAM::Values& values) const; + gtsam::Ordering* orderingCOLAMD(const pose2SLAM::Values& values) const; + gtsam::GaussianFactorGraph* linearize(const pose2SLAM::Values& values, + const gtsam::Ordering& ordering) const; - void addPrior(int key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); - void addPoseConstraint(int key, const gtsam::Pose2& pose); - void addOdometry(int key1, int key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); - pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate) const; - gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; + void addPrior(int key, const gtsam::Pose2& pose, + const gtsam::SharedNoiseModel& noiseModel); + void addPoseConstraint(int key, const gtsam::Pose2& pose); + void addOdometry(int key1, int key2, const gtsam::Pose2& odometry, + const gtsam::SharedNoiseModel& noiseModel); + pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate) const; + gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; }; -}///\namespace pose2SLAM +} ///\namespace pose2SLAM //************************************************************************* // Simulated2D From f924d01bc345ac917728a2f5cf335fb607354304 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 05:25:05 +0000 Subject: [PATCH 099/914] Synchronized mixed case naming --- examples/LocalizationExample.cpp | 12 ++++---- examples/PlanarSLAMSelfContained_advanced.cpp | 14 ++++----- examples/Pose2SLAMExample_advanced.cpp | 30 ++++++++----------- examples/matlab/LocalizationExample.m | 6 ++-- examples/matlab/Pose2SLAMExample_advanced.m | 28 +++++++---------- examples/matlab/Pose2SLAMExample_easy.m | 23 +++++++------- tests/testMarginals.cpp | 14 ++++----- 7 files changed, 57 insertions(+), 70 deletions(-) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index a8ff59d68..578f33558 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -35,7 +35,7 @@ using namespace gtsam; */ int main(int argc, char** argv) { - // create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) + // create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) pose2SLAM::Graph graph; // add a Gaussian prior on pose x_1 @@ -55,7 +55,7 @@ int main(int argc, char** argv) { // create (deliberatly inaccurate) initial estimate pose2SLAM::Values initialEstimate; initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); + initialEstimate.insertPose(2, Pose2(2.3, 0.1, -0.2)); initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print("\nInitial estimate:\n "); @@ -64,11 +64,11 @@ int main(int argc, char** argv) { result.print("\nFinal result:\n "); // Query the marginals - Marginals marginals = graph.marginals(result); cout.precision(2); - cout << "\nP1:\n" << marginals.marginalCovariance(1) << endl; - cout << "\nP2:\n" << marginals.marginalCovariance(2) << endl; - cout << "\nP3:\n" << marginals.marginalCovariance(3) << endl; + Marginals marginals = graph.marginals(result); + cout << "\nP1:\n" << marginals.marginalCovariance(1) << endl; + cout << "\nP2:\n" << marginals.marginalCovariance(2) << endl; + cout << "\nP3:\n" << marginals.marginalCovariance(3) << endl; return 0; } diff --git a/examples/PlanarSLAMSelfContained_advanced.cpp b/examples/PlanarSLAMSelfContained_advanced.cpp index bff4ee7ea..f7c321f2d 100644 --- a/examples/PlanarSLAMSelfContained_advanced.cpp +++ b/examples/PlanarSLAMSelfContained_advanced.cpp @@ -60,18 +60,18 @@ int main(int argc, char** argv) { /* add prior */ // gaussian for prior - SharedDiagonal prior_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - Pose2 prior_measurement(0.0, 0.0, 0.0); // prior at origin - PriorFactor posePrior(i1, prior_measurement, prior_model); // create the factor + SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin + PriorFactor posePrior(i1, priorMean, priorNoise); // create the factor graph.add(posePrior); // add the factor to the graph /* add odometry */ // general noisemodel for odometry - SharedDiagonal odom_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - Pose2 odom_measurement(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) + SharedDiagonal odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) // create between factors to represent odometry - BetweenFactor odom12(i1, i2, odom_measurement, odom_model); - BetweenFactor odom23(i2, i3, odom_measurement, odom_model); + BetweenFactor odom12(i1, i2, odometry, odometryNoise); + BetweenFactor odom23(i2, i3, odometry, odometryNoise); graph.add(odom12); // add both to graph graph.add(odom23); diff --git a/examples/Pose2SLAMExample_advanced.cpp b/examples/Pose2SLAMExample_advanced.cpp index 3884e03e4..083585c73 100644 --- a/examples/Pose2SLAMExample_advanced.cpp +++ b/examples/Pose2SLAMExample_advanced.cpp @@ -35,26 +35,22 @@ int main(int argc, char** argv) { pose2SLAM::Graph graph; /* 2.a add prior */ - // gaussian for prior - SharedDiagonal prior_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - Pose2 prior_measurement(0.0, 0.0, 0.0); // prior at origin - graph.addPrior(1, prior_measurement, prior_model); // add directly to graph + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin + SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta + graph.addPrior(1, priorMean, priorNoise); // add directly to graph /* 2.b add odometry */ - // general noisemodel for odometry - SharedDiagonal odom_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - - /* Pose2 measurements take (x,y,theta), where theta is taken from the positive x-axis*/ - Pose2 odom_measurement(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - graph.addOdometry(1, 2, odom_measurement, odom_model); - graph.addOdometry(2, 3, odom_measurement, odom_model); + SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) + graph.addOdometry(1, 2, odometry, odometryNoise); + graph.addOdometry(2, 3, odometry, odometryNoise); graph.print("full graph"); - /* 3. Create the data structure to hold the initial estimate to the solution - * initialize to noisy points */ + /* 3. Create the data structure to hold the initial estimate to the solution + * initialize to noisy points */ pose2SLAM::Values initial; initial.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initial.insertPose(2, Pose2(2.3, 0.1,-0.2)); + initial.insertPose(2, Pose2(2.3, 0.1, -0.2)); initial.insertPose(3, Pose2(4.1, 0.1, 0.1)); initial.print("initial estimate"); @@ -67,15 +63,15 @@ int main(int argc, char** argv) { params.absoluteErrorTol = 1e-15; params.relativeErrorTol = 1e-15; params.ordering = ordering; - LevenbergMarquardtOptimizer optimizer(graph, initial, params); + LevenbergMarquardtOptimizer optimizer(graph, initial, params); pose2SLAM::Values result = optimizer.optimize(); result.print("final result"); /* Get covariances */ Marginals marginals(graph, result, Marginals::CHOLESKY); - Matrix covariance1 = marginals.marginalCovariance(1); - Matrix covariance2 = marginals.marginalCovariance(2); + Matrix covariance1 = marginals.marginalCovariance(1); + Matrix covariance2 = marginals.marginalCovariance(2); print(covariance1, "Covariance1"); print(covariance2, "Covariance2"); diff --git a/examples/matlab/LocalizationExample.m b/examples/matlab/LocalizationExample.m index 3a8282e3a..ae66a131c 100644 --- a/examples/matlab/LocalizationExample.m +++ b/examples/matlab/LocalizationExample.m @@ -45,9 +45,9 @@ result.print(sprintf('\nFinal result:\n ')); %% Query the marginals marginals = graph.marginals(result); -P{1}=marginals.marginalCovariance(1) -P{2}=marginals.marginalCovariance(2) -P{3}=marginals.marginalCovariance(3) +P{1}=marginals.marginalCovariance(1); +P{2}=marginals.marginalCovariance(2); +P{3}=marginals.marginalCovariance(3); %% Plot Trajectory figure(1) diff --git a/examples/matlab/Pose2SLAMExample_advanced.m b/examples/matlab/Pose2SLAMExample_advanced.m index 2199def5b..f2739803e 100644 --- a/examples/matlab/Pose2SLAMExample_advanced.m +++ b/examples/matlab/Pose2SLAMExample_advanced.m @@ -20,24 +20,21 @@ % - We have full odometry for measurements % - The robot is on a grid, moving 2 meters each step -%% Create keys for variables -x1 = 1; x2 = 2; x3 = 3; - %% Create graph container and add factors to it graph = pose2SLAMGraph; %% Add prior % gaussian for prior -prior_model = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); -prior_measurement = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -graph.addPrior(x1, prior_measurement, prior_model); % add directly to graph +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odom_model = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); -odom_measurement = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -graph.addOdometry(x1, x2, odom_measurement, odom_model); -graph.addOdometry(x2, x3, odom_measurement, odom_model); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +graph.addOdometry(1, 2, odometry, odometryNoise); +graph.addOdometry(2, 3, odometry, odometryNoise); %% Add measurements % general noisemodel for measurements @@ -48,9 +45,9 @@ graph.print('full graph'); %% Initialize to noisy points initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(x1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(x2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(x3, gtsamPose2(4.1, 0.1, 0.1)); +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); initialEstimate.print('initial estimate'); @@ -62,10 +59,7 @@ initialEstimate.print('initial estimate'); %result = pose2SLAMOptimizer(graph,initialEstimate,ord,params); %result.print('final result'); -% % -% % disp('\\\'); -% % -% % %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate); result.print('final result'); diff --git a/examples/matlab/Pose2SLAMExample_easy.m b/examples/matlab/Pose2SLAMExample_easy.m index 6c359f314..b0200946b 100644 --- a/examples/matlab/Pose2SLAMExample_easy.m +++ b/examples/matlab/Pose2SLAMExample_easy.m @@ -18,24 +18,21 @@ % - We have full odometry for measurements % - The robot is on a grid, moving 2 meters each step -%% Create keys for variables -x1 = 1; x2 = 2; x3 = 3; - %% Create graph container and add factors to it graph = pose2SLAMGraph; %% Add prior % gaussian for prior -prior_model = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); -prior_measurement = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -graph.addPrior(x1, prior_measurement, prior_model); % add directly to graph +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odom_model = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); -odom_measurement = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -graph.addOdometry(x1, x2, odom_measurement, odom_model); -graph.addOdometry(x2, x3, odom_measurement, odom_model); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +graph.addOdometry(1, 2, odometry, odometryNoise); +graph.addOdometry(2, 3, odometry, odometryNoise); %% Add measurements % general noisemodel for measurements @@ -46,9 +43,9 @@ graph.print('full graph'); %% Initialize to noisy points initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(x1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(x2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(x3, gtsamPose2(4.1, 0.1, 0.1)); +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); initialEstimate.print('initial estimate'); diff --git a/tests/testMarginals.cpp b/tests/testMarginals.cpp index a91e6b576..76b1f7c82 100644 --- a/tests/testMarginals.cpp +++ b/tests/testMarginals.cpp @@ -51,17 +51,17 @@ TEST(Marginals, planarSLAMmarginals) { /* add prior */ // gaussian for prior - SharedDiagonal prior_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - Pose2 prior_measurement(0.0, 0.0, 0.0); // prior at origin - graph.add(PriorFactor(x1, prior_measurement, prior_model)); // add the factor to the graph + SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin + graph.add(PriorFactor(x1, priorMean, priorNoise)); // add the factor to the graph /* add odometry */ // general noisemodel for odometry - SharedDiagonal odom_model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - Pose2 odom_measurement(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) + SharedDiagonal odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) // create between factors to represent odometry - graph.add(BetweenFactor(x1, x2, odom_measurement, odom_model)); - graph.add(BetweenFactor(x2, x3, odom_measurement, odom_model)); + graph.add(BetweenFactor(x1, x2, odometry, odometryNoise)); + graph.add(BetweenFactor(x2, x3, odometry, odometryNoise)); /* add measurements */ // general noisemodel for measurements From 20a5eed0510979464e513baa655dec983600b768 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 05:25:50 +0000 Subject: [PATCH 100/914] Fixed keys in planarSLAM matlab example --- examples/matlab/PlanarSLAMExample_easy.m | 18 +-- examples/matlab/symbol.m | 4 + gtsam.h | 197 ++++++++++++----------- 3 files changed, 115 insertions(+), 104 deletions(-) create mode 100644 examples/matlab/symbol.m diff --git a/examples/matlab/PlanarSLAMExample_easy.m b/examples/matlab/PlanarSLAMExample_easy.m index 54462732b..88a988755 100644 --- a/examples/matlab/PlanarSLAMExample_easy.m +++ b/examples/matlab/PlanarSLAMExample_easy.m @@ -20,24 +20,24 @@ % - Landmarks are 2 meters away from the robot trajectory %% Create keys for variables -x1 = 1; x2 = 2; x3 = 3; -l1 = 1; l2 = 2; +x1 = symbol('x',1); x2 = symbol('x',2); x3 = symbol('x',3); +l1 = symbol('l',1); l2 = symbol('l',2); %% Create graph container and add factors to it graph = planarSLAMGraph; %% Add prior % gaussian for prior -prior_model = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); -prior_measurement = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -graph.addPrior(x1, prior_measurement, prior_model); % add directly to graph +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +graph.addPrior(x1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odom_model = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); -odom_measurement = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -graph.addOdometry(x1, x2, odom_measurement, odom_model); -graph.addOdometry(x2, x3, odom_measurement, odom_model); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +graph.addOdometry(x1, x2, odometry, odometryNoise); +graph.addOdometry(x2, x3, odometry, odometryNoise); %% Add measurements % general noisemodel for measurements diff --git a/examples/matlab/symbol.m b/examples/matlab/symbol.m new file mode 100644 index 000000000..c7c4af2c6 --- /dev/null +++ b/examples/matlab/symbol.m @@ -0,0 +1,4 @@ +function key = symbol(c,i) +% generate a key corresponding to a symbol +s = gtsamSymbol(c,i); +key = s.key(); \ No newline at end of file diff --git a/gtsam.h b/gtsam.h index b2dc6ca79..2c6b5a13e 100644 --- a/gtsam.h +++ b/gtsam.h @@ -9,7 +9,7 @@ * Only one Method/Constructor per line * Methods can return * - Eigen types: Matrix, Vector - * - C/C++ basic types: string, bool, size_t, int, double, char + * - C/C++ basic types: string, bool, size_t, size_t, double, char * - void * - Any class with which be copied with boost::make_shared() * - boost::shared_ptr of any object type @@ -19,7 +19,7 @@ * Arguments to functions any of * - Eigen types: Matrix, Vector * - Eigen types and classes as an optionally const reference - * - C/C++ basic types: string, bool, size_t, int, double, char + * - C/C++ basic types: string, bool, size_t, size_t, double, char * - Any class with which be copied with boost::make_shared() (except Eigen) * - boost::shared_ptr of any object type (except Eigen) * Comments can use either C++ or C style, with multiple lines @@ -150,7 +150,7 @@ class Rot3 { static Vector Logmap(const gtsam::Rot3& p); Matrix matrix() const; Matrix transpose() const; - gtsam::Point3 column(int index) const; + gtsam::Point3 column(size_t index) const; Vector xyz() const; Vector ypr() const; Vector rpy() const; @@ -173,7 +173,7 @@ class Pose2 { double x() const; double y() const; double theta() const; - int dim() const; + size_t dim() const; Vector localCoordinates(const gtsam::Pose2& p); gtsam::Pose2 retract(Vector v); gtsam::Pose2 compose(const gtsam::Pose2& p2); @@ -228,10 +228,13 @@ class CalibratedCamera { static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); }; + //************************************************************************* // inference //************************************************************************* + + //************************************************************************* // linear //************************************************************************* @@ -260,25 +263,25 @@ class SharedNoiseModel { class VectorValues { VectorValues(); - VectorValues(int nVars, int varDim); + VectorValues(size_t nVars, size_t varDim); void print(string s) const; bool equals(const gtsam::VectorValues& expected, double tol) const; - int size() const; - void insert(int j, Vector value); + size_t size() const; + void insert(size_t j, Vector value); }; class GaussianConditional { - GaussianConditional(int key, Vector d, Matrix R, Vector sigmas); - GaussianConditional(int key, Vector d, Matrix R, int name1, Matrix S, + GaussianConditional(size_t key, Vector d, Matrix R, Vector sigmas); + GaussianConditional(size_t key, Vector d, Matrix R, size_t name1, Matrix S, Vector sigmas); - GaussianConditional(int key, Vector d, Matrix R, int name1, Matrix S, - int name2, Matrix T, Vector sigmas); + GaussianConditional(size_t key, Vector d, Matrix R, size_t name1, Matrix S, + size_t name2, Matrix T, Vector sigmas); void print(string s) const; bool equals(const gtsam::GaussianConditional &cg, double tol) const; }; class GaussianDensity { - GaussianDensity(int key, Vector d, Matrix R, Vector sigmas); + GaussianDensity(size_t key, Vector d, Matrix R, Vector sigmas); void print(string s) const; Vector mean() const; Matrix information() const; @@ -302,11 +305,11 @@ class GaussianFactor { class JacobianFactor { JacobianFactor(); JacobianFactor(Vector b_in); - JacobianFactor(int i1, Matrix A1, Vector b, + JacobianFactor(size_t i1, Matrix A1, Vector b, const gtsam::SharedDiagonal& model); - JacobianFactor(int i1, Matrix A1, int i2, Matrix A2, Vector b, + JacobianFactor(size_t i1, Matrix A1, size_t i2, Matrix A2, Vector b, const gtsam::SharedDiagonal& model); - JacobianFactor(int i1, Matrix A1, int i2, Matrix A2, int i3, Matrix A3, + JacobianFactor(size_t i1, Matrix A1, size_t i2, Matrix A2, size_t i3, Matrix A3, Vector b, const gtsam::SharedDiagonal& model); void print(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; @@ -319,11 +322,11 @@ class JacobianFactor { class HessianFactor { HessianFactor(const gtsam::HessianFactor& gf); HessianFactor(); - HessianFactor(int j, Matrix G, Vector g, double f); - HessianFactor(int j, Vector mu, Matrix Sigma); - HessianFactor(int j1, int j2, Matrix G11, Matrix G12, Vector g1, Matrix G22, + HessianFactor(size_t j, Matrix G, Vector g, double f); + HessianFactor(size_t j, Vector mu, Matrix Sigma); + HessianFactor(size_t j1, size_t j2, Matrix G11, Matrix G12, Vector g1, Matrix G22, Vector g2, double f); - HessianFactor(int j1, int j2, int j3, Matrix G11, Matrix G12, Matrix G13, + HessianFactor(size_t j1, size_t j2, size_t j3, Matrix G11, Matrix G12, Matrix G13, Vector g1, Matrix G22, Matrix G23, Vector g2, Matrix G33, Vector g3, double f); HessianFactor(const gtsam::GaussianConditional& cg); @@ -341,16 +344,16 @@ class GaussianFactorGraph { void push_back(gtsam::GaussianFactor* factor); void print(string s) const; bool equals(const gtsam::GaussianFactorGraph& lfgraph, double tol) const; - int size() const; + size_t size() const; // Building the graph void add(gtsam::JacobianFactor* factor); // all these won't work as MATLAB can't handle overloading // void add(Vector b); -// void add(int key1, Matrix A1, Vector b, const gtsam::SharedDiagonal& model); -// void add(int key1, Matrix A1, int key2, Matrix A2, Vector b, +// void add(size_t key1, Matrix A1, Vector b, const gtsam::SharedDiagonal& model); +// void add(size_t key1, Matrix A1, size_t key2, Matrix A2, Vector b, // const gtsam::SharedDiagonal& model); -// void add(int key1, Matrix A1, int key2, Matrix A2, int key3, Matrix A3, +// void add(size_t key1, Matrix A1, size_t key2, Matrix A2, size_t key3, Matrix A3, // Vector b, const gtsam::SharedDiagonal& model); // void add(gtsam::HessianFactor* factor); @@ -375,8 +378,8 @@ class GaussianSequentialSolver { bool useQR); gtsam::GaussianBayesNet* eliminate() const; gtsam::VectorValues* optimize() const; - gtsam::GaussianFactor* marginalFactor(int j) const; - Matrix marginalCovariance(int j) const; + gtsam::GaussianFactor* marginalFactor(size_t j) const; + Matrix marginalCovariance(size_t j) const; }; class KalmanFilter { @@ -384,7 +387,7 @@ class KalmanFilter { // gtsam::GaussianDensity* init(Vector x0, const gtsam::SharedDiagonal& P0); gtsam::GaussianDensity* init(Vector x0, Matrix P0); void print(string s) const; - static int step(gtsam::GaussianDensity* p); + static size_t step(gtsam::GaussianDensity* p); gtsam::GaussianDensity* predict(gtsam::GaussianDensity* p, Matrix F, Matrix B, Vector u, const gtsam::SharedDiagonal& modelQ); gtsam::GaussianDensity* predictQ(gtsam::GaussianDensity* p, Matrix F, @@ -420,6 +423,7 @@ class NonlinearFactorGraph { class Values { Values(); + size_t size() const; void print(string s) const; bool exists(size_t j) const; }; @@ -432,57 +436,7 @@ class Marginals { Matrix marginalInformation(size_t variable) const; }; -} ///\namespace gtsam - -//************************************************************************* -// planarSLAM -//************************************************************************* - -#include -namespace planarSLAM { - -class Values { - Values(); - void print(string s) const; - gtsam::Pose2 pose(int key) const; - gtsam::Point2 point(int key) const; - void insertPose(int key, const gtsam::Pose2& pose); - void insertPoint(int key, const gtsam::Point2& point); -}; - -class Graph { - Graph(); - - void print(string s) const; - - double error(const planarSLAM::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const planarSLAM::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const planarSLAM::Values& values, - const gtsam::Ordering& ordering) const; - - void addPrior(int key, const gtsam::Pose2& pose, - const gtsam::SharedNoiseModel& noiseModel); - void addPoseConstraint(int key, const gtsam::Pose2& pose); - void addOdometry(int key1, int key2, const gtsam::Pose2& odometry, - const gtsam::SharedNoiseModel& noiseModel); - void addBearing(int poseKey, int pointKey, const gtsam::Rot2& bearing, - const gtsam::SharedNoiseModel& noiseModel); - void addRange(int poseKey, int pointKey, double range, - const gtsam::SharedNoiseModel& noiseModel); - void addBearingRange(int poseKey, int pointKey, const gtsam::Rot2& bearing, - double range, const gtsam::SharedNoiseModel& noiseModel); - planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate); -}; - -class Odometry { - Odometry(int key1, int key2, const gtsam::Pose2& measured, - const gtsam::SharedNoiseModel& model); - void print(string s) const; - gtsam::GaussianFactor* linearize(const planarSLAM::Values& center, - const gtsam::Ordering& ordering) const; -}; - -} ///\namespace planarSLAM +}///\namespace gtsam //************************************************************************* // Pose2SLAM @@ -493,9 +447,10 @@ namespace pose2SLAM { class Values { Values(); + void insertPose(size_t key, const gtsam::Pose2& pose); + size_t size() const; void print(string s) const; - void insertPose(int key, const gtsam::Pose2& pose); - gtsam::Pose2 pose(int i); + gtsam::Pose2 pose(size_t i); }; class Graph { @@ -508,16 +463,68 @@ class Graph { gtsam::GaussianFactorGraph* linearize(const pose2SLAM::Values& values, const gtsam::Ordering& ordering) const; - void addPrior(int key, const gtsam::Pose2& pose, + void addPrior(size_t key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); - void addPoseConstraint(int key, const gtsam::Pose2& pose); - void addOdometry(int key1, int key2, const gtsam::Pose2& odometry, + void addPoseConstraint(size_t key, const gtsam::Pose2& pose); + void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, + const gtsam::SharedNoiseModel& noiseModel); + void addConstraint(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate) const; gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; }; -} ///\namespace pose2SLAM +}///\namespace pose2SLAM + +//************************************************************************* +// planarSLAM +//************************************************************************* + +#include +namespace planarSLAM { + +class Values { + Values(); + void insertPose(size_t key, const gtsam::Pose2& pose); + void insertPoint(size_t key, const gtsam::Point2& point); + void print(string s) const; + gtsam::Pose2 pose(size_t key) const; + gtsam::Point2 point(size_t key) const; +}; + +class Graph { + Graph(); + + void print(string s) const; + + double error(const planarSLAM::Values& values) const; + gtsam::Ordering* orderingCOLAMD(const planarSLAM::Values& values) const; + gtsam::GaussianFactorGraph* linearize(const planarSLAM::Values& values, + const gtsam::Ordering& ordering) const; + + void addPrior(size_t key, const gtsam::Pose2& pose, + const gtsam::SharedNoiseModel& noiseModel); + void addPoseConstraint(size_t key, const gtsam::Pose2& pose); + void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, + const gtsam::SharedNoiseModel& noiseModel); + void addBearing(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, + const gtsam::SharedNoiseModel& noiseModel); + void addRange(size_t poseKey, size_t pointKey, double range, + const gtsam::SharedNoiseModel& noiseModel); + void addBearingRange(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, + double range, const gtsam::SharedNoiseModel& noiseModel); + planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate); +}; + +class Odometry { + Odometry(size_t key1, size_t key2, const gtsam::Pose2& measured, + const gtsam::SharedNoiseModel& model); + void print(string s) const; + gtsam::GaussianFactor* linearize(const planarSLAM::Values& center, + const gtsam::Ordering& ordering) const; +}; + +}///\namespace planarSLAM //************************************************************************* // Simulated2D @@ -528,12 +535,12 @@ namespace simulated2D { class Values { Values(); - void insertPose(int i, const gtsam::Point2& p); - void insertPoint(int j, const gtsam::Point2& p); - int nrPoses() const; - int nrPoints() const; - gtsam::Point2 pose(int i); - gtsam::Point2 point(int j); + void insertPose(size_t i, const gtsam::Point2& p); + void insertPoint(size_t j, const gtsam::Point2& p); + size_t nrPoses() const; + size_t nrPoints() const; + gtsam::Point2 pose(size_t i); + gtsam::Point2 point(size_t j); }; class Graph { @@ -550,12 +557,12 @@ namespace simulated2DOriented { class Values { Values(); - void insertPose(int i, const gtsam::Pose2& p); - void insertPoint(int j, const gtsam::Point2& p); - int nrPoses() const; - int nrPoints() const; - gtsam::Pose2 pose(int i); - gtsam::Point2 point(int j); + void insertPose(size_t i, const gtsam::Pose2& p); + void insertPoint(size_t j, const gtsam::Point2& p); + size_t nrPoses() const; + size_t nrPoints() const; + gtsam::Pose2 pose(size_t i); + gtsam::Point2 point(size_t j); }; class Graph { From a75c9f1da34e411486fe3840e7a42c14e751d93e Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 05:26:30 +0000 Subject: [PATCH 101/914] Small Manhattan world example --- examples/Data/w100-odom.graph | 440 +++++++++++++++++++++++ examples/matlab/Pose2SLAMExample_graph.m | 75 ++++ examples/matlab/plotTrajectory.m | 10 + 3 files changed, 525 insertions(+) create mode 100644 examples/Data/w100-odom.graph create mode 100644 examples/matlab/Pose2SLAMExample_graph.m create mode 100644 examples/matlab/plotTrajectory.m diff --git a/examples/Data/w100-odom.graph b/examples/Data/w100-odom.graph new file mode 100644 index 000000000..a88d18741 --- /dev/null +++ b/examples/Data/w100-odom.graph @@ -0,0 +1,440 @@ +VERTEX2 0 0 0 0 +VERTEX2 1 0.995595 0.0837204 0.0146728 +VERTEX2 2 2.0463 0.0352563 -0.0332615 +VERTEX2 3 3.01173 0.00117694 -0.0153904 +VERTEX2 4 4.00973 -0.0790194 -0.02875 +VERTEX2 5 5.0196 -0.0664912 -0.039715 +VERTEX2 6 5.02744 0.934341 1.51768 +VERTEX2 7 5.04775 1.89323 1.51033 +VERTEX2 8 5.15306 2.87418 1.49866 +VERTEX2 9 5.22304 3.87497 1.48364 +VERTEX2 10 5.23596 4.87041 1.47951 +VERTEX2 11 4.24581 4.94796 2.99944 +VERTEX2 12 3.22758 5.09551 2.99492 +VERTEX2 13 2.19142 5.16887 2.98707 +VERTEX2 14 1.1311 5.24329 2.97244 +VERTEX2 15 0.158988 5.30427 2.95438 +VERTEX2 16 -0.12526 4.26995 -1.76551 +VERTEX2 17 -0.25431 3.29165 -1.77099 +VERTEX2 18 -0.413555 2.30595 -1.76019 +VERTEX2 19 -0.536073 1.30685 -1.75991 +VERTEX2 20 -0.808468 0.302589 -1.76466 +VERTEX2 21 0.165652 0.0941948 -0.204681 +VERTEX2 22 1.09464 -0.0109951 -0.196319 +VERTEX2 23 2.15691 -0.187264 -0.20809 +VERTEX2 24 3.19115 -0.448207 -0.192611 +VERTEX2 25 4.13241 -0.636131 -0.162687 +VERTEX2 26 4.34104 0.512161 1.44413 +VERTEX2 27 4.44536 1.59548 1.42312 +VERTEX2 28 4.57241 2.60423 1.37618 +VERTEX2 29 4.86591 3.53433 1.35616 +VERTEX2 30 5.11392 4.4801 1.35985 +VERTEX2 31 4.21358 4.6527 2.91174 +VERTEX2 32 3.22654 4.82431 2.94929 +VERTEX2 33 2.23774 5.00761 2.97485 +VERTEX2 34 1.22736 5.20153 2.98412 +VERTEX2 35 0.123255 5.26802 2.9767 +VERTEX2 36 0.00632935 4.33864 -1.76346 +VERTEX2 37 -0.10879 3.36173 -1.7901 +VERTEX2 38 -0.321951 2.4384 -1.78648 +VERTEX2 39 -0.543773 1.34377 -1.77905 +VERTEX2 40 -0.658597 0.382801 -1.78632 +VERTEX2 41 0.317835 0.0716759 -0.235552 +VERTEX2 42 1.3002 -0.181376 -0.217406 +VERTEX2 43 2.34947 -0.372484 -0.22532 +VERTEX2 44 3.34502 -0.63322 -0.236028 +VERTEX2 45 4.3567 -0.866613 -0.24513 +VERTEX2 46 4.61743 0.074884 1.32649 +VERTEX2 47 4.7283 1.10386 1.31325 +VERTEX2 48 4.88942 2.06218 1.34353 +VERTEX2 49 5.1224 3.05224 1.34 +VERTEX2 50 5.37031 3.89715 1.33962 +VERTEX2 51 4.40295 4.12271 2.91276 +VERTEX2 52 3.40284 4.39024 2.9116 +VERTEX2 53 2.43673 4.61578 2.93887 +VERTEX2 54 1.51408 4.75597 2.91757 +VERTEX2 55 0.505735 4.96923 2.92324 +VERTEX2 56 0.256695 4.01175 -1.78543 +VERTEX2 57 0.0116126 2.99092 -1.79932 +VERTEX2 58 -0.153788 2.07052 -1.80614 +VERTEX2 59 -0.31455 1.12993 -1.83961 +VERTEX2 60 -0.593175 0.109086 -1.83163 +VERTEX2 61 -1.51899 0.241119 2.87633 +VERTEX2 62 -2.44041 0.564876 2.86065 +VERTEX2 63 -3.38567 0.881461 2.88557 +VERTEX2 64 -4.33636 1.15673 2.87003 +VERTEX2 65 -5.3523 1.33309 2.88766 +VERTEX2 66 -5.08987 2.28075 1.31311 +VERTEX2 67 -4.8429 3.23082 1.32403 +VERTEX2 68 -4.59105 4.20251 1.31499 +VERTEX2 69 -4.38824 5.10708 1.32873 +VERTEX2 70 -4.13462 5.98725 1.31402 +VERTEX2 71 -5.15517 6.29412 2.90024 +VERTEX2 72 -6.16852 6.57768 2.91315 +VERTEX2 73 -7.19212 6.7759 2.90733 +VERTEX2 74 -8.19083 6.96321 2.87753 +VERTEX2 75 -9.21776 7.31653 2.85231 +VERTEX2 76 -9.46536 6.44658 -1.86253 +VERTEX2 77 -9.70116 5.60413 -1.86719 +VERTEX2 78 -10.0031 4.63377 -1.8642 +VERTEX2 79 -10.2892 3.70939 -1.85209 +VERTEX2 80 -10.5468 2.73555 -1.86536 +VERTEX2 81 -9.53131 2.42844 -0.348286 +VERTEX2 82 -8.67728 2.03155 -0.326912 +VERTEX2 83 -7.76543 1.7035 -0.340149 +VERTEX2 84 -6.72871 1.23422 -0.332391 +VERTEX2 85 -5.7871 0.960473 -0.298466 +VERTEX2 86 -6.15287 -0.0181319 -1.84594 +VERTEX2 87 -6.48069 -0.957942 -1.82387 +VERTEX2 88 -6.74441 -1.90271 -1.83019 +VERTEX2 89 -6.98263 -2.8633 -1.82672 +VERTEX2 90 -7.25581 -3.79723 -1.7991 +VERTEX2 91 -6.24938 -3.97274 -0.228747 +VERTEX2 92 -5.2193 -4.22592 -0.231118 +VERTEX2 93 -4.2791 -4.41808 -0.244412 +VERTEX2 94 -3.27605 -4.63989 -0.262869 +VERTEX2 95 -2.21195 -4.90921 -0.241867 +VERTEX2 96 -1.9446 -3.94139 1.35224 +VERTEX2 97 -1.7284 -2.88069 1.34979 +VERTEX2 98 -1.4787 -1.9068 1.36613 +VERTEX2 99 -1.32193 -0.941704 1.35348 +EDGE2 1 0 -0.99879 0.0417574 -0.00818381 1 0 1 1 0 0 +EDGE2 2 1 -1.00336 0.0235924 -0.0056968 1 0 1 1 0 0 +EDGE2 3 2 -0.972181 0.0502932 -0.0342992 1 0 1 1 0 0 +EDGE2 4 3 -1.03801 0.00907053 -0.0116629 1 0 1 1 0 0 +EDGE2 5 4 -0.993225 0.0522372 0.00915452 1 0 1 1 0 0 +EDGE2 6 5 -1.1127 0.00877534 -1.55251 1 0 1 1 0 0 +EDGE2 7 6 -1.02681 0.0465162 -0.0118557 1 0 1 1 0 0 +EDGE2 8 7 -0.917358 0.0291951 -0.0343225 1 0 1 1 0 0 +EDGE2 9 8 -1.05727 -0.00948761 -0.0459367 1 0 1 1 0 0 +EDGE2 10 9 -0.989284 0.0306925 -0.000322391 1 0 1 1 0 0 +EDGE2 11 10 -0.997544 0.0340262 -1.59025 1 0 1 1 0 0 +EDGE2 12 11 -0.900141 -0.0311005 0.0198686 1 0 1 1 0 0 +EDGE2 13 12 -0.934983 -0.0793681 -0.00127435 1 0 1 1 0 0 +EDGE2 14 13 -0.885324 -0.0619103 0.0131666 1 0 1 1 0 0 +EDGE2 15 14 -0.90106 -0.0376226 -0.0082473 1 0 1 1 0 0 +EDGE2 16 15 -0.992517 0.00499859 -1.61534 1 0 1 1 0 0 +EDGE2 17 16 -0.975795 0.00721342 -0.00783327 1 0 1 1 0 0 +EDGE2 18 17 -0.997573 0.0333984 0.0275033 1 0 1 1 0 0 +EDGE2 19 18 -1.01687 0.04722 -0.0197328 1 0 1 1 0 0 +EDGE2 19 0 0.973663 0.0205486 1.57776 1 0 1 1 0 0 +EDGE2 20 19 -1.02103 0.00401273 0.0118729 1 0 1 1 0 0 +EDGE2 20 1 0.050153 0.95087 1.5776 1 0 1 1 0 0 +EDGE2 20 0 0.0746671 0.0345259 1.54892 1 0 1 1 0 0 +EDGE2 21 2 1.04442 -0.0648639 0.0369546 1 0 1 1 0 0 +EDGE2 21 1 -0.060912 -0.0429049 0.0281134 1 0 1 1 0 0 +EDGE2 21 0 -1.03635 -0.0239619 0.0119243 1 0 1 1 0 0 +EDGE2 21 20 -0.993726 -0.0523398 -1.58635 1 0 1 1 0 0 +EDGE2 22 2 0.0369633 -0.0141374 0.0250929 1 0 1 1 0 0 +EDGE2 22 3 1.06863 0.0015984 0.00161736 1 0 1 1 0 0 +EDGE2 22 1 -0.998706 0.0305766 0.0318395 1 0 1 1 0 0 +EDGE2 22 21 -1.03575 -0.0195948 0.0195394 1 0 1 1 0 0 +EDGE2 23 4 1.02992 0.127035 -0.0346718 1 0 1 1 0 0 +EDGE2 23 2 -0.969735 -0.0376916 -0.00768099 1 0 1 1 0 0 +EDGE2 23 3 -0.0191715 -0.0462526 0.0191143 1 0 1 1 0 0 +EDGE2 23 22 -0.923346 0.0731681 -0.0296362 1 0 1 1 0 0 +EDGE2 24 5 0.947991 -0.0175548 -0.0253511 1 0 1 1 0 0 +EDGE2 24 4 -0.0109939 0.0915607 -0.0086247 1 0 1 1 0 0 +EDGE2 24 3 -1.14502 0.0593321 -0.00746596 1 0 1 1 0 0 +EDGE2 24 23 -1.01657 -0.115682 0.0089996 1 0 1 1 0 0 +EDGE2 25 6 -0.0597013 1.02123 1.59642 1 0 1 1 0 0 +EDGE2 25 24 -1.09573 0.0614943 0.0261947 1 0 1 1 0 0 +EDGE2 25 5 -0.0734935 -0.0017356 -0.00885563 1 0 1 1 0 0 +EDGE2 25 4 -1.00036 -0.0171662 0.0202356 1 0 1 1 0 0 +EDGE2 26 7 1.00531 0.00107148 0.0302732 1 0 1 1 0 0 +EDGE2 26 25 -0.979494 0.0230425 -1.59852 1 0 1 1 0 0 +EDGE2 26 6 -0.00315216 -0.0685196 0.0109497 1 0 1 1 0 0 +EDGE2 26 5 -0.972334 0.0191047 -1.57567 1 0 1 1 0 0 +EDGE2 27 8 0.898284 -0.0536875 0.0186598 1 0 1 1 0 0 +EDGE2 27 7 0.0724439 -0.00529359 -0.000353825 1 0 1 1 0 0 +EDGE2 27 6 -1.05569 0.0767555 -0.00615115 1 0 1 1 0 0 +EDGE2 27 26 -0.967053 0.019671 0.00377432 1 0 1 1 0 0 +EDGE2 28 9 1.01666 -0.0683645 -0.023268 1 0 1 1 0 0 +EDGE2 28 27 -0.934108 -0.101065 0.00574705 1 0 1 1 0 0 +EDGE2 28 8 0.00153443 -0.0194617 0.00533619 1 0 1 1 0 0 +EDGE2 28 7 -1.0055 -0.0583432 -0.0150068 1 0 1 1 0 0 +EDGE2 29 10 1.08105 0.00811641 -0.0127997 1 0 1 1 0 0 +EDGE2 29 9 0.000458911 -0.119207 0.0094008 1 0 1 1 0 0 +EDGE2 29 8 -1.03153 0.0730486 -0.00615654 1 0 1 1 0 0 +EDGE2 29 28 -0.967347 0.0195529 -0.0185565 1 0 1 1 0 0 +EDGE2 30 10 -0.0111261 -0.0223523 -0.0275291 1 0 1 1 0 0 +EDGE2 30 11 0.0777909 0.988987 1.57983 1 0 1 1 0 0 +EDGE2 30 29 -1.04043 0.0504065 0.0370536 1 0 1 1 0 0 +EDGE2 30 9 -0.984437 -0.00337167 0.0067686 1 0 1 1 0 0 +EDGE2 31 10 -0.988697 0.0379451 -1.55557 1 0 1 1 0 0 +EDGE2 31 30 -1.00276 -0.102334 -1.55246 1 0 1 1 0 0 +EDGE2 31 11 -0.0363097 0.0438826 0.00956678 1 0 1 1 0 0 +EDGE2 31 12 1.07396 -0.0654312 -0.012633 1 0 1 1 0 0 +EDGE2 32 31 -1.07853 -0.0168996 0.00213085 1 0 1 1 0 0 +EDGE2 32 11 -1.01502 -0.0432938 -0.0288545 1 0 1 1 0 0 +EDGE2 32 12 -0.00161924 -0.0369144 0.0119887 1 0 1 1 0 0 +EDGE2 32 13 1.04694 0.02334 -0.0125276 1 0 1 1 0 0 +EDGE2 33 32 -1.04882 -0.0552537 0.046005 1 0 1 1 0 0 +EDGE2 33 12 -1.04043 -0.0558011 -0.0162327 1 0 1 1 0 0 +EDGE2 33 13 0.0562588 0.104327 0.00415458 1 0 1 1 0 0 +EDGE2 33 14 0.977863 0.0186884 0.0127758 1 0 1 1 0 0 +EDGE2 34 33 -0.994151 0.0271125 -0.0029927 1 0 1 1 0 0 +EDGE2 34 13 -0.992533 0.0446083 0.0139962 1 0 1 1 0 0 +EDGE2 34 14 0.0338907 0.00424032 0.0260941 1 0 1 1 0 0 +EDGE2 34 15 0.967129 -0.0598619 -0.0205361 1 0 1 1 0 0 +EDGE2 35 14 -0.992147 -0.0193694 -0.0208901 1 0 1 1 0 0 +EDGE2 35 34 -0.977902 0.0673003 0.0245254 1 0 1 1 0 0 +EDGE2 35 15 0.0688948 0.0729152 -0.0423015 1 0 1 1 0 0 +EDGE2 35 16 -0.0108759 0.943493 1.58518 1 0 1 1 0 0 +EDGE2 36 35 -0.974289 -0.034236 -1.59368 1 0 1 1 0 0 +EDGE2 36 15 -1.00822 0.00249408 -1.57297 1 0 1 1 0 0 +EDGE2 36 16 -0.00217215 0.103762 -0.003117 1 0 1 1 0 0 +EDGE2 36 17 1.0238 -0.0222964 0.0129001 1 0 1 1 0 0 +EDGE2 37 36 -1.01533 -0.00862644 -0.0058424 1 0 1 1 0 0 +EDGE2 37 16 -1.01359 -0.0613493 -0.0122542 1 0 1 1 0 0 +EDGE2 37 18 1.03711 0.0426359 0.00482447 1 0 1 1 0 0 +EDGE2 37 17 -0.0242366 0.0142009 -0.00533508 1 0 1 1 0 0 +EDGE2 38 18 0.0345562 0.021662 -0.0131412 1 0 1 1 0 0 +EDGE2 38 37 -0.981448 0.0523343 -0.0417572 1 0 1 1 0 0 +EDGE2 38 17 -0.961596 0.00213889 -0.00047585 1 0 1 1 0 0 +EDGE2 38 19 1.0594 -0.0430789 0.0123265 1 0 1 1 0 0 +EDGE2 39 38 -1.04804 -0.036889 -0.0235853 1 0 1 1 0 0 +EDGE2 39 18 -1.03632 -0.0536162 0.048128 1 0 1 1 0 0 +EDGE2 39 19 0.0361672 -0.0534412 -0.00346497 1 0 1 1 0 0 +EDGE2 39 0 1.00175 0.0276332 1.57543 1 0 1 1 0 0 +EDGE2 39 20 0.964769 0.103526 -0.00735911 1 0 1 1 0 0 +EDGE2 40 39 -1.03933 0.097229 0.0136057 1 0 1 1 0 0 +EDGE2 40 19 -1.02893 -0.0692033 0.00855088 1 0 1 1 0 0 +EDGE2 40 1 0.0574661 1.07674 1.54189 1 0 1 1 0 0 +EDGE2 40 21 0.0696538 0.998274 1.58379 1 0 1 1 0 0 +EDGE2 40 0 -0.03593 0.00262297 1.5732 1 0 1 1 0 0 +EDGE2 40 20 0.0769078 -0.0463276 -0.0240456 1 0 1 1 0 0 +EDGE2 41 40 -1.07316 0.00254372 -1.56145 1 0 1 1 0 0 +EDGE2 41 2 0.97152 -0.00150084 -0.0165972 1 0 1 1 0 0 +EDGE2 41 22 0.93936 -0.00378253 0.0077679 1 0 1 1 0 0 +EDGE2 41 1 0.0512203 -0.0531063 -0.0128993 1 0 1 1 0 0 +EDGE2 41 21 0.0969106 -0.00304953 -0.00537574 1 0 1 1 0 0 +EDGE2 41 0 -1.0034 -0.025292 -0.00388085 1 0 1 1 0 0 +EDGE2 41 20 -1.05749 0.0115896 -1.58133 1 0 1 1 0 0 +EDGE2 42 2 0.0235949 0.00811449 -0.00358233 1 0 1 1 0 0 +EDGE2 42 3 0.991071 -0.0286072 0.0236739 1 0 1 1 0 0 +EDGE2 42 23 1.05311 0.0104005 -0.00518416 1 0 1 1 0 0 +EDGE2 42 22 -0.0455836 0.0249413 -0.011739 1 0 1 1 0 0 +EDGE2 42 1 -1.01015 -0.014061 -0.0169645 1 0 1 1 0 0 +EDGE2 42 21 -0.892462 -0.0125915 0.0271967 1 0 1 1 0 0 +EDGE2 42 41 -1.03813 0.0163744 0.00425822 1 0 1 1 0 0 +EDGE2 43 24 0.932658 0.079441 0.00305436 1 0 1 1 0 0 +EDGE2 43 4 1.04656 0.04523 -0.0109827 1 0 1 1 0 0 +EDGE2 43 2 -1.01747 0.0488344 -0.00688551 1 0 1 1 0 0 +EDGE2 43 42 -0.988066 -0.0104386 0.0502105 1 0 1 1 0 0 +EDGE2 43 3 -0.0201045 -0.059931 0.0208538 1 0 1 1 0 0 +EDGE2 43 23 0.0121089 0.0411716 0.0274525 1 0 1 1 0 0 +EDGE2 43 22 -1.06541 0.00647669 -0.0152333 1 0 1 1 0 0 +EDGE2 44 43 -1.06111 -0.0138941 -0.0151349 1 0 1 1 0 0 +EDGE2 44 25 0.907841 -0.0585735 -0.0156694 1 0 1 1 0 0 +EDGE2 44 24 0.080514 0.0102301 -0.000739134 1 0 1 1 0 0 +EDGE2 44 5 0.994756 0.106482 -0.0329364 1 0 1 1 0 0 +EDGE2 44 4 0.0336562 0.0350477 -0.0134209 1 0 1 1 0 0 +EDGE2 44 3 -0.977117 0.0175205 0.0431175 1 0 1 1 0 0 +EDGE2 44 23 -0.995286 0.0403712 0.0311094 1 0 1 1 0 0 +EDGE2 45 25 0.086721 0.0210672 -0.01128 1 0 1 1 0 0 +EDGE2 45 6 -0.00964881 0.917532 1.58991 1 0 1 1 0 0 +EDGE2 45 26 -0.107945 1.00294 1.60674 1 0 1 1 0 0 +EDGE2 45 24 -1.06401 0.0985536 0.00301256 1 0 1 1 0 0 +EDGE2 45 44 -1.11052 0.0279259 0.0194036 1 0 1 1 0 0 +EDGE2 45 5 0.00693003 -0.107152 0.0347982 1 0 1 1 0 0 +EDGE2 45 4 -0.975055 0.00541385 0.00019082 1 0 1 1 0 0 +EDGE2 46 27 0.957182 -0.0308347 0.0232143 1 0 1 1 0 0 +EDGE2 46 7 1.08788 0.0127277 -0.00918705 1 0 1 1 0 0 +EDGE2 46 25 -1.07359 0.0262712 -1.59817 1 0 1 1 0 0 +EDGE2 46 6 0.0251908 0.0703469 -0.0114448 1 0 1 1 0 0 +EDGE2 46 26 -0.0555992 -0.0169743 -0.0141156 1 0 1 1 0 0 +EDGE2 46 45 -1.06391 0.0367663 -1.53 1 0 1 1 0 0 +EDGE2 46 5 -0.997558 0.013946 -1.56515 1 0 1 1 0 0 +EDGE2 47 27 -0.00659155 0.0206818 0.0308512 1 0 1 1 0 0 +EDGE2 47 8 0.932297 0.0905773 0.0189001 1 0 1 1 0 0 +EDGE2 47 28 1.01628 -0.0421346 0.06175 1 0 1 1 0 0 +EDGE2 47 7 -0.0838918 0.100573 -0.00623043 1 0 1 1 0 0 +EDGE2 47 6 -1.09254 -3.79076e-05 0.00973934 1 0 1 1 0 0 +EDGE2 47 26 -0.969367 0.0109812 0.0193835 1 0 1 1 0 0 +EDGE2 47 46 -0.968302 -0.0552186 0.0358645 1 0 1 1 0 0 +EDGE2 48 29 1.07313 -0.148712 0.00196928 1 0 1 1 0 0 +EDGE2 48 9 1.0849 0.0223434 0.00590472 1 0 1 1 0 0 +EDGE2 48 27 -0.914726 -0.0647734 -0.0173613 1 0 1 1 0 0 +EDGE2 48 8 0.0426816 -0.042649 -0.0177828 1 0 1 1 0 0 +EDGE2 48 28 0.0379321 -0.0109102 -0.0102417 1 0 1 1 0 0 +EDGE2 48 47 -1.06887 -0.0121303 -0.0489097 1 0 1 1 0 0 +EDGE2 48 7 -0.965107 -0.034685 -0.000290141 1 0 1 1 0 0 +EDGE2 49 10 1.12226 -0.0111233 -0.007791 1 0 1 1 0 0 +EDGE2 49 30 0.989907 -0.0123868 0.019701 1 0 1 1 0 0 +EDGE2 49 29 -0.0472499 0.0649252 -0.0229459 1 0 1 1 0 0 +EDGE2 49 9 -0.0543329 0.00135195 0.015534 1 0 1 1 0 0 +EDGE2 49 8 -0.989154 0.0177114 -0.00459804 1 0 1 1 0 0 +EDGE2 49 28 -0.904061 0.0569324 0.0300751 1 0 1 1 0 0 +EDGE2 49 48 -0.973676 0.051129 -0.0317589 1 0 1 1 0 0 +EDGE2 50 31 0.0033669 0.916796 1.58905 1 0 1 1 0 0 +EDGE2 50 10 -0.0446702 0.0139044 -0.0111686 1 0 1 1 0 0 +EDGE2 50 30 0.000176756 0.0422134 0.00416723 1 0 1 1 0 0 +EDGE2 50 11 0.0535292 0.975834 1.58092 1 0 1 1 0 0 +EDGE2 50 29 -0.944412 -0.113794 -0.0170506 1 0 1 1 0 0 +EDGE2 50 49 -1.02827 0.0163842 -0.0269791 1 0 1 1 0 0 +EDGE2 50 9 -0.979417 -0.0710258 -0.00133216 1 0 1 1 0 0 +EDGE2 51 31 -0.0518575 0.0249306 -0.00251684 1 0 1 1 0 0 +EDGE2 51 10 -1.07854 0.0248414 -1.59534 1 0 1 1 0 0 +EDGE2 51 30 -1.03347 0.0253831 -1.58701 1 0 1 1 0 0 +EDGE2 51 50 -1.04958 0.0503268 -1.58131 1 0 1 1 0 0 +EDGE2 51 32 1.00485 0.0028486 0.0195914 1 0 1 1 0 0 +EDGE2 51 11 0.0349253 -0.0171134 0.00953402 1 0 1 1 0 0 +EDGE2 51 12 1.00549 0.0628512 -0.0162726 1 0 1 1 0 0 +EDGE2 52 31 -0.982801 -0.0303748 -0.00113303 1 0 1 1 0 0 +EDGE2 52 51 -0.953712 -0.0847509 0.00541592 1 0 1 1 0 0 +EDGE2 52 32 -0.0729728 -0.0432622 0.0151166 1 0 1 1 0 0 +EDGE2 52 11 -0.994905 -0.0296327 -0.0114404 1 0 1 1 0 0 +EDGE2 52 12 -0.108004 -0.0318606 0.0170936 1 0 1 1 0 0 +EDGE2 52 33 0.918793 0.0285272 0.00925295 1 0 1 1 0 0 +EDGE2 52 13 0.992951 0.0318294 -0.007191 1 0 1 1 0 0 +EDGE2 53 32 -0.986992 -0.0026008 0.00451185 1 0 1 1 0 0 +EDGE2 53 52 -0.960158 -0.0578602 0.0212446 1 0 1 1 0 0 +EDGE2 53 12 -0.938384 0.0130893 0.0177479 1 0 1 1 0 0 +EDGE2 53 33 -0.00487972 0.0802647 -0.0156472 1 0 1 1 0 0 +EDGE2 53 13 -0.0429264 -0.0121861 0.0191245 1 0 1 1 0 0 +EDGE2 53 14 0.972309 0.0374106 -0.0227226 1 0 1 1 0 0 +EDGE2 53 34 0.920651 -0.0381205 0.00156026 1 0 1 1 0 0 +EDGE2 54 35 1.02746 -0.0232173 -0.00733268 1 0 1 1 0 0 +EDGE2 54 53 -1.03388 0.0605877 -0.0242274 1 0 1 1 0 0 +EDGE2 54 33 -0.953977 -0.0238591 0.0112294 1 0 1 1 0 0 +EDGE2 54 13 -1.01876 0.000850867 0.023767 1 0 1 1 0 0 +EDGE2 54 14 0.0142706 0.0568535 0.0156199 1 0 1 1 0 0 +EDGE2 54 34 0.029565 0.110446 -0.0176974 1 0 1 1 0 0 +EDGE2 54 15 1.08373 0.101394 0.0117167 1 0 1 1 0 0 +EDGE2 55 35 -0.0483156 -0.0176008 0.0190501 1 0 1 1 0 0 +EDGE2 55 54 -1.05102 -0.0108082 -0.0129526 1 0 1 1 0 0 +EDGE2 55 14 -1.00768 0.0938761 0.0063347 1 0 1 1 0 0 +EDGE2 55 34 -1.01362 0.020014 -0.00713884 1 0 1 1 0 0 +EDGE2 55 15 0.0386252 0.0479351 -0.000568738 1 0 1 1 0 0 +EDGE2 55 36 -0.00378631 0.992718 1.59098 1 0 1 1 0 0 +EDGE2 55 16 0.0886423 1.02733 1.62359 1 0 1 1 0 0 +EDGE2 56 35 -0.974585 -0.0699549 -1.57271 1 0 1 1 0 0 +EDGE2 56 55 -1.05595 -0.00465349 -1.60392 1 0 1 1 0 0 +EDGE2 56 15 -0.928016 -0.00655726 -1.55364 1 0 1 1 0 0 +EDGE2 56 36 0.0437675 -0.00458342 -0.011688 1 0 1 1 0 0 +EDGE2 56 16 0.024268 -0.090309 -0.00528886 1 0 1 1 0 0 +EDGE2 56 37 0.949795 -0.0460936 0.0143859 1 0 1 1 0 0 +EDGE2 56 17 0.962006 0.0477689 -0.00212384 1 0 1 1 0 0 +EDGE2 57 36 -1.08411 0.0570905 -0.015367 1 0 1 1 0 0 +EDGE2 57 56 -0.983438 -0.000514897 -0.005883 1 0 1 1 0 0 +EDGE2 57 16 -0.973679 0.00432404 -0.00761843 1 0 1 1 0 0 +EDGE2 57 38 0.907871 -0.109092 -0.00238144 1 0 1 1 0 0 +EDGE2 57 18 1.00501 0.0775972 0.00722838 1 0 1 1 0 0 +EDGE2 57 37 0.00880416 -0.0508718 0.0130591 1 0 1 1 0 0 +EDGE2 57 17 0.000245102 0.0241579 0.0127276 1 0 1 1 0 0 +EDGE2 58 57 -0.991164 0.0516127 0.0222056 1 0 1 1 0 0 +EDGE2 58 38 -0.0687829 0.0653377 -0.00943642 1 0 1 1 0 0 +EDGE2 58 18 -0.0626875 -0.108306 -0.00969368 1 0 1 1 0 0 +EDGE2 58 37 -0.941803 0.0279259 0.0445915 1 0 1 1 0 0 +EDGE2 58 17 -1.05002 -0.0131603 -0.0219704 1 0 1 1 0 0 +EDGE2 58 39 0.902028 -0.0456874 0.0293116 1 0 1 1 0 0 +EDGE2 58 19 1.05936 0.100124 -0.010211 1 0 1 1 0 0 +EDGE2 59 38 -1.02644 -0.0343746 0.00425898 1 0 1 1 0 0 +EDGE2 59 58 -0.850528 -0.00749867 0.0421351 1 0 1 1 0 0 +EDGE2 59 18 -0.885152 0.00873652 -0.00819438 1 0 1 1 0 0 +EDGE2 59 39 -0.0649969 -0.0533229 -0.0304834 1 0 1 1 0 0 +EDGE2 59 19 0.0817007 0.0632502 -0.00511583 1 0 1 1 0 0 +EDGE2 59 40 1.00694 -0.114722 0.0220379 1 0 1 1 0 0 +EDGE2 59 0 0.937874 0.0125331 1.55639 1 0 1 1 0 0 +EDGE2 59 20 0.983498 0.0680913 -0.0101281 1 0 1 1 0 0 +EDGE2 60 59 -1.0258 -0.02312 0.0206348 1 0 1 1 0 0 +EDGE2 60 39 -0.871643 -0.0291038 0.00245518 1 0 1 1 0 0 +EDGE2 60 19 -0.991389 -0.0174307 0.00265999 1 0 1 1 0 0 +EDGE2 60 40 -0.0639512 0.0351714 0.00972188 1 0 1 1 0 0 +EDGE2 60 1 0.0945945 0.903081 1.5947 1 0 1 1 0 0 +EDGE2 60 21 -0.0395067 0.984867 1.57746 1 0 1 1 0 0 +EDGE2 60 41 -0.0961783 1.01885 1.59479 1 0 1 1 0 0 +EDGE2 60 0 0.0351455 -0.0494314 1.58969 1 0 1 1 0 0 +EDGE2 60 20 -0.10896 0.00568799 -0.00742316 1 0 1 1 0 0 +EDGE2 61 40 -1.02371 -0.0384713 1.56846 1 0 1 1 0 0 +EDGE2 61 60 -1.00157 0.013005 1.56099 1 0 1 1 0 0 +EDGE2 61 0 -0.999539 -0.0815131 -3.11522 1 0 1 1 0 0 +EDGE2 61 20 -1.05417 -0.0432731 1.57241 1 0 1 1 0 0 +EDGE2 62 61 -1.06614 -0.0518437 0.0210032 1 0 1 1 0 0 +EDGE2 63 62 -1.00226 0.0602444 0.013051 1 0 1 1 0 0 +EDGE2 64 63 -1.04961 0.0446695 0.0205524 1 0 1 1 0 0 +EDGE2 65 64 -1.01538 -0.0917619 -0.00399046 1 0 1 1 0 0 +EDGE2 66 65 -1.06092 -0.0548153 1.59301 1 0 1 1 0 0 +EDGE2 67 66 -1.01683 -0.0120376 -0.0043823 1 0 1 1 0 0 +EDGE2 68 67 -1.00712 -0.0263215 -0.00660172 1 0 1 1 0 0 +EDGE2 69 68 -1.02908 0.012488 -0.0426752 1 0 1 1 0 0 +EDGE2 70 69 -0.933982 0.0175617 -0.00804355 1 0 1 1 0 0 +EDGE2 71 70 -0.951899 0.105287 -1.5595 1 0 1 1 0 0 +EDGE2 72 71 -0.990263 -0.0891221 -0.0303282 1 0 1 1 0 0 +EDGE2 73 72 -1.00818 0.0534858 0.0341473 1 0 1 1 0 0 +EDGE2 74 73 -0.927587 0.0355366 0.0278978 1 0 1 1 0 0 +EDGE2 75 74 -1.00835 0.0200616 -0.00325495 1 0 1 1 0 0 +EDGE2 76 75 -0.911527 -0.0580256 -1.56211 1 0 1 1 0 0 +EDGE2 77 76 -1.0866 -0.0563987 -0.0305906 1 0 1 1 0 0 +EDGE2 78 77 -1.02909 0.0703149 0.0223702 1 0 1 1 0 0 +EDGE2 79 78 -1.0709 0.00915469 0.0140786 1 0 1 1 0 0 +EDGE2 80 79 -1.02792 0.0686446 0.027726 1 0 1 1 0 0 +EDGE2 81 80 -0.959181 -0.0396398 -1.571 1 0 1 1 0 0 +EDGE2 82 81 -1.04191 0.0577756 0.00427146 1 0 1 1 0 0 +EDGE2 83 82 -0.936917 -0.0584888 0.00552186 1 0 1 1 0 0 +EDGE2 84 65 0.951358 0.0212743 -3.15858 1 0 1 1 0 0 +EDGE2 84 83 -1.01061 -0.0528576 -0.0203836 1 0 1 1 0 0 +EDGE2 85 65 0.124357 0.0505873 -3.15701 1 0 1 1 0 0 +EDGE2 85 66 -0.0270947 1.02244 1.57347 1 0 1 1 0 0 +EDGE2 85 64 1.02493 0.016563 -3.16695 1 0 1 1 0 0 +EDGE2 85 84 -0.987886 0.00451597 0.00269797 1 0 1 1 0 0 +EDGE2 86 65 -1.02735 -0.0704468 -1.56691 1 0 1 1 0 0 +EDGE2 86 85 -0.972762 -0.0528197 1.57225 1 0 1 1 0 0 +EDGE2 87 86 -0.91883 0.0375303 -0.0123346 1 0 1 1 0 0 +EDGE2 88 87 -1.08097 -0.104538 0.0061549 1 0 1 1 0 0 +EDGE2 89 88 -1.00986 -0.0113462 -0.00742318 1 0 1 1 0 0 +EDGE2 90 89 -1.03219 -0.0165154 -0.00181226 1 0 1 1 0 0 +EDGE2 91 90 -0.940739 0.0240986 -1.5619 1 0 1 1 0 0 +EDGE2 92 91 -1.15555 -0.0727788 -0.00855884 1 0 1 1 0 0 +EDGE2 93 92 -1.04254 0.083779 0.034681 1 0 1 1 0 0 +EDGE2 94 93 -1.07811 0.0709857 -0.00287562 1 0 1 1 0 0 +EDGE2 95 94 -0.916162 0.0464945 -0.0109007 1 0 1 1 0 0 +EDGE2 96 95 -0.983042 -0.10662 -1.57228 1 0 1 1 0 0 +EDGE2 97 96 -0.933411 0.024514 0.0124052 1 0 1 1 0 0 +EDGE2 98 97 -1.03384 0.0366015 -0.00108394 1 0 1 1 0 0 +EDGE2 99 40 0.949815 -0.0200951 -3.15597 1 0 1 1 0 0 +EDGE2 99 60 0.982217 0.038669 -3.1331 1 0 1 1 0 0 +EDGE2 99 0 1.14879 0.0129747 -1.57804 1 0 1 1 0 0 +EDGE2 99 20 1.00089 0.0504254 -3.15355 1 0 1 1 0 0 +EDGE2 99 98 -1.00067 -0.053216 -0.0254751 1 0 1 1 0 0 +EQUIV 21 1 +EQUIV 22 2 +EQUIV 23 3 +EQUIV 24 4 +EQUIV 25 5 +EQUIV 26 6 +EQUIV 27 7 +EQUIV 28 8 +EQUIV 29 9 +EQUIV 30 10 +EQUIV 31 11 +EQUIV 32 12 +EQUIV 33 13 +EQUIV 34 14 +EQUIV 35 15 +EQUIV 36 16 +EQUIV 37 17 +EQUIV 38 18 +EQUIV 39 19 +EQUIV 40 20 +EQUIV 41 1 +EQUIV 42 2 +EQUIV 43 3 +EQUIV 44 4 +EQUIV 45 5 +EQUIV 46 6 +EQUIV 47 7 +EQUIV 48 8 +EQUIV 49 9 +EQUIV 50 10 +EQUIV 51 11 +EQUIV 52 12 +EQUIV 53 13 +EQUIV 54 14 +EQUIV 55 15 +EQUIV 56 16 +EQUIV 57 17 +EQUIV 58 18 +EQUIV 59 19 +EQUIV 60 20 diff --git a/examples/matlab/Pose2SLAMExample_graph.m b/examples/matlab/Pose2SLAMExample_graph.m new file mode 100644 index 000000000..d4c5f261a --- /dev/null +++ b/examples/matlab/Pose2SLAMExample_graph.m @@ -0,0 +1,75 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create graph container and add factors to it +graph = pose2SLAMGraph; +initialEstimate = pose2SLAMValues; +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +constraint=gtsamPose2; % identity + +%% Add a Gaussian prior on pose x_1 +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +graph.addPrior(0, priorMean, priorNoise); % add directly to graph + +%% Read File and create graph and initial estimate +fid = fopen('../Data/w100-odom.graph'); +if fid < 0 + error('Cannot open the file '); +end + +disp('Reading data from file...') +lines=textscan(fid,'%s','delimiter','\n'); +fclose(fid); +n=size(lines{1},1); + +for i=1:n + text=cell2mat(lines{1}(i)); + if strcmp('VERTEX2',text(1:7)) + v = textscan(text,'%s %d %f %f %f',1); + initialEstimate.insertPose(v{2}, gtsamPose2(v{3}, v{4}, v{5})); + elseif strcmp('EDGE2',text(1:5)) + e = textscan(text,'%s %d %d %f %f %f',1); + graph.addOdometry(e{2}, e{3}, gtsamPose2(e{4}, e{5}, e{6}), odometryNoise); + end +end + +%% Plot Initial Estimate +figure(1) +clf +plotTrajectory(initialEstimate,'r-*') +hold on + +addEquivalences=0; +if addEquivalences + %% Add equivalence constraints + for i=1:n + text=cell2mat(lines{1}(i)); + if strcmp('EQUIV',text(1:5)) + equiv = textscan(text,'%s %d %d',1); + graph.addOdometry(e{2}, e{3}, constraint, odometryNoise); + end + end + +end + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); +plotTrajectory(result,'g-*') + +%% Plot Covariance Ellipses +% marginals = graph.marginals(result); +% for i=0:result2.size()-1 +% pose_i = result.pose(i); +% P_i=marginals.marginalCovariance(i); +% covarianceEllipse([pose_i.x;pose_i.y],P_i,'g') +% end diff --git a/examples/matlab/plotTrajectory.m b/examples/matlab/plotTrajectory.m new file mode 100644 index 000000000..e67663a55 --- /dev/null +++ b/examples/matlab/plotTrajectory.m @@ -0,0 +1,10 @@ +function plotTrajectory(values,color) +% plotTrajectory: plot the poses in a values object +% assumes keys are 0 to N-1, where N is values.size() +X=[];Y=[]; +for i=0:values.size()-1 + pose_i = values.pose(i); + X=[X;pose_i.x]; + Y=[Y;pose_i.y]; +end +plot(X,Y,color); From 7d132ef2177ceb85146d5bc7566b0b39bb2c254b Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sun, 3 Jun 2012 14:52:26 +0000 Subject: [PATCH 102/914] add a simple spcg implementation and revive the example --- examples/Pose2SLAMwSPCG_advanced.cpp | 109 --------- examples/Pose2SLAMwSPCG_easy.cpp | 101 ++++---- .../linear/IterativeOptimizationParameters.h | 6 +- gtsam/linear/IterativeSolver.h | 11 +- gtsam/linear/SimpleSPCGSolver.cpp | 230 ++++++++++++++++++ gtsam/linear/SimpleSPCGSolver.h | 87 +++++++ .../nonlinear/LevenbergMarquardtOptimizer.cpp | 4 +- 7 files changed, 366 insertions(+), 182 deletions(-) delete mode 100644 examples/Pose2SLAMwSPCG_advanced.cpp create mode 100644 gtsam/linear/SimpleSPCGSolver.cpp create mode 100644 gtsam/linear/SimpleSPCGSolver.h diff --git a/examples/Pose2SLAMwSPCG_advanced.cpp b/examples/Pose2SLAMwSPCG_advanced.cpp deleted file mode 100644 index 12d17a6e9..000000000 --- a/examples/Pose2SLAMwSPCG_advanced.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Pose2SLAMwSPCG_advanced.cpp - * @brief Solve a simple 3 by 3 grid of Pose2 SLAM problem by using advanced SPCG interface - * @author Yong Dian - * Created October 21, 2010 - */ - -#include - -#if ENABLE_SPCG - -#include - -#include -#include -#include - -using namespace std; -using namespace gtsam; -using namespace pose2SLAM; - -typedef boost::shared_ptr sharedGraph ; -typedef boost::shared_ptr sharedValue ; -//typedef NonlinearOptimizer > SPCGOptimizer; - - -typedef SubgraphSolver Solver; -typedef boost::shared_ptr sharedSolver ; -typedef NonlinearOptimizer SPCGOptimizer; - -sharedGraph graph; -sharedValue initial; -Values result; - -/* ************************************************************************* */ -int main(void) { - - /* generate synthetic data */ - const SharedNoiseModel sigma(noiseModel::Unit::Create(0.1)); - Key x1(1), x2(2), x3(3), x4(4), x5(5), x6(6), x7(7), x8(8), x9(9); - - graph = boost::make_shared() ; - initial = boost::make_shared() ; - - // create a 3 by 3 grid - // x3 x6 x9 - // x2 x5 x8 - // x1 x4 x7 - graph->addConstraint(x1,x2,Pose2(0,2,0),sigma) ; - graph->addConstraint(x2,x3,Pose2(0,2,0),sigma) ; - graph->addConstraint(x4,x5,Pose2(0,2,0),sigma) ; - graph->addConstraint(x5,x6,Pose2(0,2,0),sigma) ; - graph->addConstraint(x7,x8,Pose2(0,2,0),sigma) ; - graph->addConstraint(x8,x9,Pose2(0,2,0),sigma) ; - graph->addConstraint(x1,x4,Pose2(2,0,0),sigma) ; - graph->addConstraint(x4,x7,Pose2(2,0,0),sigma) ; - graph->addConstraint(x2,x5,Pose2(2,0,0),sigma) ; - graph->addConstraint(x5,x8,Pose2(2,0,0),sigma) ; - graph->addConstraint(x3,x6,Pose2(2,0,0),sigma) ; - graph->addConstraint(x6,x9,Pose2(2,0,0),sigma) ; - graph->addPrior(x1, Pose2(0,0,0), sigma) ; - - initial->insert(x1, Pose2( 0, 0, 0)); - initial->insert(x2, Pose2( 0, 2.1, 0.01)); - initial->insert(x3, Pose2( 0, 3.9,-0.01)); - initial->insert(x4, Pose2(2.1,-0.1, 0)); - initial->insert(x5, Pose2(1.9, 2.1, 0.02)); - initial->insert(x6, Pose2(2.0, 3.9,-0.02)); - initial->insert(x7, Pose2(4.0, 0.1, 0.03 )); - initial->insert(x8, Pose2(3.9, 2.1, 0.01)); - initial->insert(x9, Pose2(4.1, 3.9,-0.01)); - /* done with generating data */ - - - graph->print("full graph") ; - initial->print("initial estimate") ; - - sharedSolver solver(new Solver(*graph, *initial)) ; - SPCGOptimizer optimizer(graph, initial, solver->ordering(), solver) ; - - cout << "before optimization, sum of error is " << optimizer.error() << endl; - SPCGOptimizer optimizer2 = optimizer.levenbergMarquardt(); - cout << "after optimization, sum of error is " << optimizer2.error() << endl; - - result = *optimizer2.values() ; - result.print("final result") ; - - return 0 ; -} - -#else - -int main() { - std::cout << "SPCG is currently disabled" << std::endl; - return 0; -} - -#endif diff --git a/examples/Pose2SLAMwSPCG_easy.cpp b/examples/Pose2SLAMwSPCG_easy.cpp index e610d327c..5565b6206 100644 --- a/examples/Pose2SLAMwSPCG_easy.cpp +++ b/examples/Pose2SLAMwSPCG_easy.cpp @@ -9,79 +9,60 @@ * -------------------------------------------------------------------------- */ -/* - * @file Pose2SLAMwSPCG_easy.cpp - * @brief Solve a simple 3 by 3 grid of Pose2 SLAM problem by using easy SPCG interface - * @author Yong Dian - * Created October 21, 2010 - */ - -#include - -#if ENABLE_SPCG +#include +#include +#include #include - -#include -#include - +#include using namespace std; using namespace gtsam; -using namespace pose2SLAM; - -Graph graph; -Values initial, result; /* ************************************************************************* */ int main(void) { - /* generate synthetic data */ - const SharedNoiseModel sigma(noiseModel::Unit::Create(0.1)); - Key x1(1), x2(2), x3(3), x4(4), x5(5), x6(6), x7(7), x8(8), x9(9); + // 1. Create graph container and add factors to it + pose2SLAM::Graph graph ; - // create a 3 by 3 grid - // x3 x6 x9 - // x2 x5 x8 - // x1 x4 x7 - graph.addConstraint(x1,x2,Pose2(0,2,0),sigma) ; - graph.addConstraint(x2,x3,Pose2(0,2,0),sigma) ; - graph.addConstraint(x4,x5,Pose2(0,2,0),sigma) ; - graph.addConstraint(x5,x6,Pose2(0,2,0),sigma) ; - graph.addConstraint(x7,x8,Pose2(0,2,0),sigma) ; - graph.addConstraint(x8,x9,Pose2(0,2,0),sigma) ; - graph.addConstraint(x1,x4,Pose2(2,0,0),sigma) ; - graph.addConstraint(x4,x7,Pose2(2,0,0),sigma) ; - graph.addConstraint(x2,x5,Pose2(2,0,0),sigma) ; - graph.addConstraint(x5,x8,Pose2(2,0,0),sigma) ; - graph.addConstraint(x3,x6,Pose2(2,0,0),sigma) ; - graph.addConstraint(x6,x9,Pose2(2,0,0),sigma) ; - graph.addPrior(x1, Pose2(0,0,0), sigma) ; + // 2a. Add Gaussian prior + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin + SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); + graph.addPrior(1, priorMean, priorNoise); - initial.insert(x1, Pose2( 0, 0, 0)); - initial.insert(x2, Pose2( 0, 2.1, 0.01)); - initial.insert(x3, Pose2( 0, 3.9,-0.01)); - initial.insert(x4, Pose2(2.1,-0.1, 0)); - initial.insert(x5, Pose2(1.9, 2.1, 0.02)); - initial.insert(x6, Pose2(2.0, 3.9,-0.02)); - initial.insert(x7, Pose2(4.0, 0.1, 0.03 )); - initial.insert(x8, Pose2(3.9, 2.1, 0.01)); - initial.insert(x9, Pose2(4.1, 3.9,-0.01)); - /* done */ + // 2b. Add odometry factors + SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); + graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); + graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + // 2c. Add pose constraint + SharedDiagonal constraintUncertainty(Vector_(3, 0.2, 0.2, 0.1)); + graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + + // print + graph.print("\nFactor graph:\n"); + + // 3. Create the data structure to hold the initialEstimate estinmate to the solution + pose2SLAM::Values initialEstimate; + Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); + Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); + Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); + Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); + Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); + initialEstimate.print("\nInitial estimate:\n "); + cout << "initial error = " << graph.error(initialEstimate) << endl ; + + // 4. Single Step Optimization using Levenberg-Marquardt + LevenbergMarquardtParams param; + param.linearSolverType = SuccessiveLinearizationParams::CG; + param.iterativeParams = boost::make_shared(); + + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, param); + Values result = optimizer.optimize(); + cout << "final error = " << graph.error(result) << endl; - graph.print("full graph") ; - initial.print("initial estimate"); - result = optimizeSPCG(graph, initial); - result.print("final result") ; return 0 ; } -#else - -int main() { - std::cout << "SPCG is currently disabled" << std::endl; - return 0; -} - -#endif diff --git a/gtsam/linear/IterativeOptimizationParameters.h b/gtsam/linear/IterativeOptimizationParameters.h index b38f6ab1a..f6b1877ce 100644 --- a/gtsam/linear/IterativeOptimizationParameters.h +++ b/gtsam/linear/IterativeOptimizationParameters.h @@ -96,7 +96,7 @@ struct PreconditionerParameters { enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ - PreconditionerParameters(): kernel_(CHOLMOD), type_(Combinatorial), verbosity_(SILENT) {} + PreconditionerParameters(): kernel_(GTSAM), type_(Combinatorial), verbosity_(SILENT) {} PreconditionerParameters(Kernel kernel, const CombinatorialParameters &combinatorial, Verbosity verbosity) : kernel_(kernel), type_(Combinatorial), combinatorial_(combinatorial), verbosity_(verbosity) {} @@ -180,13 +180,13 @@ public: PreconditionerParameters preconditioner_; ConjugateGradientParameters cg_; - enum Kernel { PCG = 0 /*, PCGPlus*/, LSPCG } kernel_ ; /* Iterative Method Kernel */ + enum Kernel { PCG = 0, LSPCG } kernel_ ; /* Iterative Method Kernel */ enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ public: IterativeOptimizationParameters() - : preconditioner_(), cg_(), kernel_(PCG), verbosity_(SILENT) {} + : preconditioner_(), cg_(), kernel_(LSPCG), verbosity_(SILENT) {} IterativeOptimizationParameters(const IterativeOptimizationParameters &p) : preconditioner_(p.preconditioner_), cg_(p.cg_), kernel_(p.kernel_), verbosity_(p.verbosity_) {} diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 7b1c1e630..9b07d8e07 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -9,18 +9,11 @@ * -------------------------------------------------------------------------- */ -/** - * @file IterativeSolver.h - * @date Oct 24, 2010 - * @author Yong-Dian Jian - * @brief Base Class for all iterative solvers of linear systems - */ - #pragma once -#include #include #include +#include namespace gtsam { @@ -46,7 +39,7 @@ public: virtual VectorValues::shared_ptr optimize () = 0; - Parameters::shared_ptr parameters() { return parameters_ ; } + inline Parameters::shared_ptr parameters() { return parameters_ ; } }; } diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp new file mode 100644 index 000000000..4379d70e4 --- /dev/null +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -0,0 +1,230 @@ +/* ---------------------------------------------------------------------------- + + * 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 + + * -------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gtsam { + +/* utility function */ +std::vector extractRowSpec_(const FactorGraph& jfg) { + std::vector spec; spec.reserve(jfg.size()); + BOOST_FOREACH ( const JacobianFactor::shared_ptr &jf, jfg ) { + spec.push_back(jf->rows()); + } + return spec; +} + +std::vector extractColSpec_(const FactorGraph& gfg, const VariableIndex &index) { + const size_t n = index.size(); + std::vector spec(n, 0); + for ( Index i = 0 ; i < n ; ++i ) { + const GaussianFactor &gf = *(gfg[index[i].front()]); + for ( GaussianFactor::const_iterator it = gf.begin() ; it != gf.end() ; ++it ) { + spec[*it] = gf.getDim(it); + } + } + return spec; +} + +SimpleSPCGSolver::SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters::shared_ptr ¶meters) + : Base(parameters) +{ + std::vector colSpec = extractColSpec_(gfg, VariableIndex(gfg)); + + nVar_ = colSpec.size(); + + /* split the factor graph into At (tree) and Ac (constraints) */ + GaussianFactorGraph::shared_ptr At; + boost::tie(At, Ac_) = this->splitGraph(gfg); + + /* construct row vector spec of the new system */ + nAc_ = Ac_->size(); + std::vector rowSpec = extractRowSpec_(*Ac_); + for ( Index i = 0 ; i < nVar_ ; ++i ) { + rowSpec.push_back(colSpec[i]); + } + + /* solve the tree with direct solver. get preconditioner */ + Rt_ = EliminationTree::Create(*At)->eliminate(EliminateQR); + xt_ = boost::make_shared(gtsam::optimize(*Rt_)); + + /* initial value for the lspcg method */ + y0_ = boost::make_shared(VectorValues::Zero(colSpec)); + + /* the right hand side of the new system */ + by_ = boost::make_shared(VectorValues::Zero(rowSpec)); + for ( Index i = 0 ; i < nAc_ ; ++i ) { + JacobianFactor::shared_ptr jf = (*Ac_)[i]; + Vector xi = internal::extractVectorValuesSlices(*xt_, jf->begin(), jf->end()); + (*by_)[i] = jf->getb() - jf->getA()*xi; + } + + /* allocate buffer for row and column vectors */ + tmpY_ = boost::make_shared(VectorValues::Zero(colSpec)); + tmpB_ = boost::make_shared(VectorValues::Zero(rowSpec)); +} + +/* implements the CGLS method in Section 7.4 of Bjork's book */ +VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial) { + + VectorValues::shared_ptr x(new VectorValues(initial)); + VectorValues r = VectorValues::Zero(*by_), + q = VectorValues::Zero(*by_), + p = VectorValues::Zero(*y0_), + s = VectorValues::Zero(*y0_); + + residual(*x, r); + transposeMultiply(r, s) ; + p.vector() = s.vector() ; + + double gamma = s.vector().squaredNorm(), new_gamma = 0.0, alpha = 0.0, beta = 0.0 ; + + const double threshold = + ::max(parameters_->epsilon_abs(), + parameters_->epsilon() * parameters_->epsilon() * gamma); + const size_t iMaxIterations = parameters_->maxIterations(); + + if ( parameters_->verbosity() >= IterativeOptimizationParameters::ERROR ) + cout << "[SimpleSPCGSolver] epsilon = " << parameters_->epsilon() + << ", max = " << parameters_->maxIterations() + << ", ||r0|| = " << std::sqrt(gamma) + << ", threshold = " << threshold << std::endl; + + size_t k ; + for ( k = 1 ; k < iMaxIterations ; ++k ) { + + multiply(p, q); + alpha = gamma / q.vector().squaredNorm() ; + x->vector() += (alpha * p.vector()); + r.vector() -= (alpha * q.vector()); + transposeMultiply(r, s); + new_gamma = s.vector().squaredNorm(); + beta = new_gamma / gamma ; + p.vector() = s.vector() + beta * p.vector(); + gamma = new_gamma ; + + if ( parameters_->verbosity() >= IterativeOptimizationParameters::ERROR) { + cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << endl; + } + + if ( gamma < threshold ) break ; + } // k + + if ( parameters_->verbosity() >= IterativeOptimizationParameters::ERROR ) + cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << endl; + + /* transform y back to x */ + return this->transform(*x); +} + +void SimpleSPCGSolver::residual(const VectorValues &input, VectorValues &output) { + output.vector() = by_->vector(); + this->multiply(input, *tmpB_); + axpy(-1.0, *tmpB_, output); +} + +void SimpleSPCGSolver::multiply(const VectorValues &input, VectorValues &output) { + this->backSubstitute(input, *tmpY_); + gtsam::multiply(*Ac_, *tmpY_, output); + for ( Index i = 0 ; i < nVar_ ; ++i ) { + output[i + nAc_] = input[i]; + } +} + +void SimpleSPCGSolver::transposeMultiply(const VectorValues &input, VectorValues &output) { + gtsam::transposeMultiply(*Ac_, input, *tmpY_); + this->transposeBackSubstitute(*tmpY_, output); + for ( Index i = 0 ; i < nVar_ ; ++i ) { + output[i] += input[nAc_+i]; + } +} + +void SimpleSPCGSolver::backSubstitute(const VectorValues &input, VectorValues &output) { + for ( Index i = 0 ; i < input.size() ; ++i ) { + output[i] = input[i] ; + } + BOOST_REVERSE_FOREACH(const boost::shared_ptr cg, *Rt_) { + const Index key = *(cg->beginFrontals()); + Vector xS = internal::extractVectorValuesSlices(output, cg->beginParents(), cg->endParents()); + xS = input[key] - cg->get_S() * xS; + output[key] = cg->get_R().triangularView().solve(xS); + } +} + +void SimpleSPCGSolver::transposeBackSubstitute(const VectorValues &input, VectorValues &output) { + for ( Index i = 0 ; i < input.size() ; ++i ) { + output[i] = input[i] ; + } + BOOST_FOREACH(const boost::shared_ptr cg, *Rt_) { + const Index key = *(cg->beginFrontals()); + output[key] = gtsam::backSubstituteUpper(output[key], Matrix(cg->get_R())); + const Vector d = internal::extractVectorValuesSlices(output, cg->beginParents(), cg->endParents()) + - cg->get_S().transpose() * output[key]; + internal::writeVectorValuesSlices(d, output, cg->beginParents(), cg->endParents()); + } +} + +VectorValues::shared_ptr SimpleSPCGSolver::transform(const VectorValues &y) { + VectorValues::shared_ptr x = boost::make_shared(VectorValues::Zero(y)); + this->backSubstitute(y, *x); + axpy(1.0, *xt_, *x); + return x; +} + +boost::tuple::shared_ptr> +SimpleSPCGSolver::splitGraph(const GaussianFactorGraph &gfg) { + + VariableIndex index(gfg); + size_t n = index.size(); + std::vector connected(n, false); + + GaussianFactorGraph::shared_ptr At(new GaussianFactorGraph()); + FactorGraph::shared_ptr Ac( new FactorGraph()); + + BOOST_FOREACH ( const GaussianFactor::shared_ptr &gf, gfg ) { + bool augment = false ; + + /* check whether this factor should be augmented to the "tree" graph */ + if ( gf->keys().size() == 1 ) augment = true; + else { + BOOST_FOREACH ( const Index key, *gf ) { + if ( connected[key] == false ) { + augment = true ; + } + connected[key] = true; + } + } + + if ( augment ) At->push_back(gf); + else Ac->push_back(boost::dynamic_pointer_cast(gf)); + } + +// gfg.print("gfg"); +// At->print("At"); +// Ac->print("Ac"); + + return boost::tie(At, Ac); +} + + + + + + +} diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h new file mode 100644 index 000000000..416826cc7 --- /dev/null +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -0,0 +1,87 @@ +/* ---------------------------------------------------------------------------- + + * 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 + + * -------------------------------------------------------------------------- */ + +#pragma once + +#include +#include +#include +#include + +namespace gtsam { + +/** + * This class gives a simple implementation to the SPCG solver presented in Dellaert et al. IROS'10. + * Given a linear least-squares problem f(x) = |A x - b|^2. + * We split the problem into f(x) = |At - bt|^2 + |Ac - bc|^2 where At denotes the "tree" part, + * and Ac denotes the "constraint" part. At is factorized into Qt Rt, and we compute ct = Qt\bt, and xt = Rt\ct. + * Then we solve reparametrized problem f(y) = |y|^2 + |Ac Rt \ y - by|^2, where y = Rt(x - xt), and by = (bc - Ac xt) + * In the matrix form, it is equivalent to solving [Ac Rt^{-1} ; I ] y = [by ; 0]. + */ + +class SimpleSPCGSolver : public IterativeSolver { + +public: + + typedef IterativeSolver Base; + typedef boost::shared_ptr shared_ptr; + +protected: + + size_t nVar_ ; /* number of variables */ + size_t nAc_ ; /* number of factors in Ac */ + + /* for SPCG */ + FactorGraph::shared_ptr Ac_; + GaussianBayesNet::shared_ptr Rt_; + VectorValues::shared_ptr xt_; + VectorValues::shared_ptr y0_; + VectorValues::shared_ptr by_; /* [bc_bar ; 0 ] */ + + /* buffer for row and column vectors in */ + VectorValues::shared_ptr tmpY_; + VectorValues::shared_ptr tmpB_; + +public: + + SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters::shared_ptr ¶meters); + virtual ~SimpleSPCGSolver() {} + virtual VectorValues::shared_ptr optimize () {return optimize(*y0_);} + +protected: + + VectorValues::shared_ptr optimize (const VectorValues &initial); + + /* output = [bc_bar ; 0 ] - [Ac Rt^{-1} ; I] y */ + void residual(const VectorValues &input, VectorValues &output); + + /* output = [Ac Rt^{-1} ; I] input */ + void multiply(const VectorValues &input, VectorValues &output); + + /* output = [Rt^{-T} Ac^T, I] input */ + void transposeMultiply(const VectorValues &input, VectorValues &output); + + /* output = Rt^{-1} input */ + void backSubstitute(const VectorValues &rhs, VectorValues &sol) ; + + /* output = Rt^{-T} input */ + void transposeBackSubstitute(const VectorValues &rhs, VectorValues &sol) ; + + /* return x = Rt^{-1} y + x_t */ + VectorValues::shared_ptr transform(const VectorValues &y); + + /* naively split a gaussian factor graph into tree and constraint parts */ + boost::tuple::shared_ptr> + splitGraph(const GaussianFactorGraph &gfg); + +}; + +} diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index f1f5ab1df..e1133d86e 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -21,6 +21,7 @@ #include // For NegativeMatrixException #include #include +#include using namespace std; @@ -71,7 +72,8 @@ void LevenbergMarquardtOptimizer::iterate() { delta = gtsam::optimize(*EliminationTree::Create(dampedSystem)->eliminate(params_.getEliminationFunction())); } else if ( params_.isCG() ) { - throw runtime_error("todo: "); + SimpleSPCGSolver solver(dampedSystem, *params_.iterativeParams); + delta = *solver.optimize(); } else { throw runtime_error("Optimization parameter is invalid: LevenbergMarquardtParams::elimination"); From 26f1f3fa4fc191144c6bc9aaec9a88619b2b1dda Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sun, 3 Jun 2012 15:07:10 +0000 Subject: [PATCH 103/914] --- gtsam/linear/SimpleSPCGSolver.cpp | 3 ++- gtsam/linear/SimpleSPCGSolver.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index 4379d70e4..e7cef9e64 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -49,7 +49,8 @@ SimpleSPCGSolver::SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Paramet nVar_ = colSpec.size(); - /* split the factor graph into At (tree) and Ac (constraints) */ + /* Split the factor graph into At (tree) and Ac (constraints) + * Note: This part has to be refined for your graph/application */ GaussianFactorGraph::shared_ptr At; boost::tie(At, Ac_) = this->splitGraph(gfg); diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h index 416826cc7..c7367f663 100644 --- a/gtsam/linear/SimpleSPCGSolver.h +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -78,7 +78,8 @@ protected: /* return x = Rt^{-1} y + x_t */ VectorValues::shared_ptr transform(const VectorValues &y); - /* naively split a gaussian factor graph into tree and constraint parts */ + /* naively split a gaussian factor graph into tree and constraint parts + * Note: This function has to be refined for your graph/application */ boost::tuple::shared_ptr> splitGraph(const GaussianFactorGraph &gfg); From 950bd8fcad258bb3b8c147799b9d4f66c8632fa5 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 15:44:39 +0000 Subject: [PATCH 104/914] Added MATLAB utility functions to pose2SLAM --- examples/matlab/Pose2SLAMExample_graph.m | 36 +++++++++++------------- examples/matlab/plotTrajectory.m | 10 ------- gtsam.h | 5 +++- gtsam/slam/pose2SLAM.cpp | 30 ++++++++++++++++++++ gtsam/slam/pose2SLAM.h | 8 ++++-- gtsam/slam/tests/testPose2SLAM.cpp | 12 +++++++- 6 files changed, 67 insertions(+), 34 deletions(-) delete mode 100644 examples/matlab/plotTrajectory.m diff --git a/examples/matlab/Pose2SLAMExample_graph.m b/examples/matlab/Pose2SLAMExample_graph.m index d4c5f261a..af0b1f3fb 100644 --- a/examples/matlab/Pose2SLAMExample_graph.m +++ b/examples/matlab/Pose2SLAMExample_graph.m @@ -12,7 +12,7 @@ %% Create graph container and add factors to it graph = pose2SLAMGraph; -initialEstimate = pose2SLAMValues; +initial = pose2SLAMValues; odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); constraint=gtsamPose2; % identity @@ -27,35 +27,33 @@ if fid < 0 error('Cannot open the file '); end -disp('Reading data from file...') -lines=textscan(fid,'%s','delimiter','\n'); +columns=textscan(fid,'%s','delimiter','\n'); fclose(fid); -n=size(lines{1},1); +lines=columns{1}; +n=size(lines,1); for i=1:n - text=cell2mat(lines{1}(i)); - if strcmp('VERTEX2',text(1:7)) - v = textscan(text,'%s %d %f %f %f',1); - initialEstimate.insertPose(v{2}, gtsamPose2(v{3}, v{4}, v{5})); - elseif strcmp('EDGE2',text(1:5)) - e = textscan(text,'%s %d %d %f %f %f',1); + line_i=lines{i}; + if strcmp('VERTEX2',line_i(1:7)) + v = textscan(line_i,'%s %d %f %f %f',1); + initial.insertPose(v{2}, gtsamPose2(v{3}, v{4}, v{5})); + elseif strcmp('EDGE2',line_i(1:5)) + e = textscan(line_i,'%s %d %d %f %f %f',1); graph.addOdometry(e{2}, e{3}, gtsamPose2(e{4}, e{5}, e{6}), odometryNoise); end end %% Plot Initial Estimate -figure(1) -clf -plotTrajectory(initialEstimate,'r-*') -hold on +figure(1);clf +plot(initial.xs(),initial.ys(),'r-*'); axis equal addEquivalences=0; if addEquivalences %% Add equivalence constraints for i=1:n - text=cell2mat(lines{1}(i)); - if strcmp('EQUIV',text(1:5)) - equiv = textscan(text,'%s %d %d',1); + line_i=cell2mat(lines(i)); + if strcmp('EQUIV',line_i(1:5)) + equiv = textscan(line_i,'%s %d %d',1); graph.addOdometry(e{2}, e{3}, constraint, odometryNoise); end end @@ -63,8 +61,8 @@ if addEquivalences end %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); -plotTrajectory(result,'g-*') +result = graph.optimize(initial); +hold on; plot(result.xs(),result.ys(),'g-*') %% Plot Covariance Ellipses % marginals = graph.marginals(result); diff --git a/examples/matlab/plotTrajectory.m b/examples/matlab/plotTrajectory.m deleted file mode 100644 index e67663a55..000000000 --- a/examples/matlab/plotTrajectory.m +++ /dev/null @@ -1,10 +0,0 @@ -function plotTrajectory(values,color) -% plotTrajectory: plot the poses in a values object -% assumes keys are 0 to N-1, where N is values.size() -X=[];Y=[]; -for i=0:values.size()-1 - pose_i = values.pose(i); - X=[X;pose_i.x]; - Y=[Y;pose_i.y]; -end -plot(X,Y,color); diff --git a/gtsam.h b/gtsam.h index 2c6b5a13e..57f2a6e23 100644 --- a/gtsam.h +++ b/gtsam.h @@ -448,9 +448,12 @@ namespace pose2SLAM { class Values { Values(); void insertPose(size_t key, const gtsam::Pose2& pose); - size_t size() const; + size_t size() const; void print(string s) const; gtsam::Pose2 pose(size_t i); + Vector xs() const; + Vector ys() const; + Vector thetas() const; }; class Graph { diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp index b08f0c305..a1e5932d9 100644 --- a/gtsam/slam/pose2SLAM.cpp +++ b/gtsam/slam/pose2SLAM.cpp @@ -31,6 +31,36 @@ namespace pose2SLAM { return x; } + /* ************************************************************************* */ + Vector Values::xs() const { + size_t j=0; + Vector result(size()); + ConstFiltered poses = filter(); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.x(); + return result; + } + + /* ************************************************************************* */ + Vector Values::ys() const { + size_t j=0; + Vector result(size()); + ConstFiltered poses = filter(); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.y(); + return result; + } + + /* ************************************************************************* */ + Vector Values::thetas() const { + size_t j=0; + Vector result(size()); + ConstFiltered poses = filter(); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.theta (); + return result; + } + /* ************************************************************************* */ void Graph::addPrior(Key i, const Pose2& p, const SharedNoiseModel& model) { sharedFactor factor(new Prior(i, p, model)); diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 84fbc528f..f438ce24d 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -41,13 +41,15 @@ namespace pose2SLAM { gtsam::Values(values) { } - // Convenience for MATLAB wrapper, which does not allow for identically named methods + /// insert a pose + void insertPose(Key i, const Pose2& pose) { insert(i, pose); } /// get a pose Pose2 pose(Key i) const { return at(i); } - /// insert a pose - void insertPose(Key i, const Pose2& pose) { insert(i, pose); } + Vector xs() const; ///< get all x coordinates in a matrix + Vector ys() const; ///< get all y coordinates in a matrix + Vector thetas() const; ///< get all orientations in a matrix }; /** diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 580d40e8a..7f329f1cb 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -41,7 +41,17 @@ static Matrix cov(Matrix_(3, 3, 0.0, 0.0, st*st )); static noiseModel::Gaussian::shared_ptr covariance(noiseModel::Gaussian::Covariance(cov)); -//static noiseModel::Gaussian::shared_ptr I3(noiseModel::Unit::Create(3)); + +/* ************************************************************************* */ +TEST_UNSAFE( Pose2SLAM, XYT ) +{ + pose2SLAM::Values values; + values.insertPose(1,Pose2(1,2,3)); + values.insertPose(2,Pose2(4,5,6)); + EXPECT(assert_equal(Vector_(2,1.0,4.0),values.xs())); + EXPECT(assert_equal(Vector_(2,2.0,5.0),values.ys())); + EXPECT(assert_equal(Vector_(2,3.0,6.0-2*M_PI),values.thetas())); +} /* ************************************************************************* */ // Test constraint, small displacement From bd7724781d9ccda76ec986b227150c2e0f93a97c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 18:20:48 +0000 Subject: [PATCH 105/914] Manhattan world example with covariances, in C++ and MATLAB --- .cproject | 332 +++++++++++----------- examples/Pose2SLAMExample_graph.cpp | 53 ++++ examples/matlab/Pose2SLAMExample_graph.m | 64 +---- examples/matlab/load2D.m | 29 ++ gtsam/slam/dataset.cpp | 342 ++++++++++++----------- gtsam/slam/dataset.h | 73 ++--- gtsam/slam/pose2SLAM.h | 8 +- 7 files changed, 489 insertions(+), 412 deletions(-) create mode 100644 examples/Pose2SLAMExample_graph.cpp create mode 100644 examples/matlab/load2D.m diff --git a/.cproject b/.cproject index ec6a2bf6f..b075667ed 100644 --- a/.cproject +++ b/.cproject @@ -311,6 +311,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -337,7 +345,6 @@ make - tests/testBayesTree.run true false @@ -345,7 +352,6 @@ make - testBinaryBayesNet.run true false @@ -393,7 +399,6 @@ make - testSymbolicBayesNet.run true false @@ -401,7 +406,6 @@ make - tests/testSymbolicFactor.run true false @@ -409,7 +413,6 @@ make - testSymbolicFactorGraph.run true false @@ -425,20 +428,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -511,22 +505,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -543,6 +521,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -567,26 +561,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -671,18 +657,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -921,7 +915,6 @@ make - testGraph.run true false @@ -929,7 +922,6 @@ make - testJunctionTree.run true false @@ -937,7 +929,6 @@ make - testSymbolicBayesNetB.run true false @@ -1049,7 +1040,6 @@ make - testErrors.run true false @@ -1505,6 +1495,7 @@ make + testSimulated2DOriented.run true false @@ -1544,6 +1535,7 @@ make + testSimulated2D.run true false @@ -1551,6 +1543,7 @@ make + testSimulated3D.run true false @@ -1748,10 +1741,10 @@ true true - + make -j5 - Pose2SLAMwSPCG_advanced.run + Pose2SLAMExample_graph.run true true true @@ -1766,6 +1759,7 @@ make + tests/testGaussianISAM2 true false @@ -1787,6 +1781,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -1988,7 +2078,6 @@ cpack - -G DEB true false @@ -1996,7 +2085,6 @@ cpack - -G RPM true false @@ -2004,7 +2092,6 @@ cpack - -G TGZ true false @@ -2012,7 +2099,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2066,98 +2152,42 @@ true true - + make - -j2 - testRot3.run + -j5 + wrap.testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + wrap.testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run + -j5 + wrap_gtsam true true true - + make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2201,46 +2231,6 @@ false true - - make - -j5 - wrap.testSpirit.run - true - true - true - - - make - -j5 - wrap.testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/examples/Pose2SLAMExample_graph.cpp b/examples/Pose2SLAMExample_graph.cpp new file mode 100644 index 000000000..6abeceb55 --- /dev/null +++ b/examples/Pose2SLAMExample_graph.cpp @@ -0,0 +1,53 @@ +/* ---------------------------------------------------------------------------- + + * 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 Pose2SLAMExample_graph->cpp + * @brief Read graph from file and perform GraphSLAM + * @date June 3, 2012 + * @author Frank Dellaert + */ + +#include +#include +#include +#include +#include + +using namespace std; +using namespace gtsam; + +int main(int argc, char** argv) { + + // Read File and create graph and initial estimate + // we are in build/examples, data is in examples/Data + pose2SLAM::Graph::shared_ptr graph ; + pose2SLAM::Values::shared_ptr initial; + SharedDiagonal model(Vector_(3, 0.05, 0.05, 5.0*M_PI/180.0)); + boost::tie(graph,initial) = load2D("../../examples/Data/w100-odom.graph",model); + initial->print("Initial estimate:\n"); + + // Add a Gaussian prior on first poses + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin + SharedDiagonal priorNoise(Vector_(3, 0.01, 0.01, 0.01)); + graph->addPrior(0, priorMean, priorNoise); + + // Single Step Optimization using Levenberg-Marquardt + pose2SLAM::Values result = graph->optimize(*initial); + result.print("\nFinal result:\n"); + + // Plot the covariance of the last pose + Marginals marginals(*graph, result); + cout.precision(2); + cout << "\nP3:\n" << marginals.marginalCovariance(99) << endl; + +return 0; +} diff --git a/examples/matlab/Pose2SLAMExample_graph.m b/examples/matlab/Pose2SLAMExample_graph.m index af0b1f3fb..7118efe01 100644 --- a/examples/matlab/Pose2SLAMExample_graph.m +++ b/examples/matlab/Pose2SLAMExample_graph.m @@ -10,64 +10,30 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create graph container and add factors to it -graph = pose2SLAMGraph; -initial = pose2SLAMValues; -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); -constraint=gtsamPose2; % identity +%% Initialize graph, initial estimate, and odometry noise +model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 5*pi/180]); +[graph,initial]=load2D('../Data/w100-odom.graph',model); +initial.print('Initial estimate:\n'); %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +priorNoise = gtsamSharedNoiseModel_Sigmas([0.01; 0.01; 0.01]); graph.addPrior(0, priorMean, priorNoise); % add directly to graph -%% Read File and create graph and initial estimate -fid = fopen('../Data/w100-odom.graph'); -if fid < 0 - error('Cannot open the file '); -end - -columns=textscan(fid,'%s','delimiter','\n'); -fclose(fid); -lines=columns{1}; -n=size(lines,1); - -for i=1:n - line_i=lines{i}; - if strcmp('VERTEX2',line_i(1:7)) - v = textscan(line_i,'%s %d %f %f %f',1); - initial.insertPose(v{2}, gtsamPose2(v{3}, v{4}, v{5})); - elseif strcmp('EDGE2',line_i(1:5)) - e = textscan(line_i,'%s %d %d %f %f %f',1); - graph.addOdometry(e{2}, e{3}, gtsamPose2(e{4}, e{5}, e{6}), odometryNoise); - end -end - %% Plot Initial Estimate figure(1);clf -plot(initial.xs(),initial.ys(),'r-*'); axis equal - -addEquivalences=0; -if addEquivalences - %% Add equivalence constraints - for i=1:n - line_i=cell2mat(lines(i)); - if strcmp('EQUIV',line_i(1:5)) - equiv = textscan(line_i,'%s %d %d',1); - graph.addOdometry(e{2}, e{3}, constraint, odometryNoise); - end - end - -end +plot(initial.xs(),initial.ys(),'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initial); -hold on; plot(result.xs(),result.ys(),'g-*') +hold on; plot(result.xs(),result.ys(),'b-*') +result.print('\nFinal result:\n'); %% Plot Covariance Ellipses -% marginals = graph.marginals(result); -% for i=0:result2.size()-1 -% pose_i = result.pose(i); -% P_i=marginals.marginalCovariance(i); -% covarianceEllipse([pose_i.x;pose_i.y],P_i,'g') -% end +marginals = graph.marginals(result); +for i=1:result.size()-1 + pose_i = result.pose(i); + P{i}=marginals.marginalCovariance(i); + covarianceEllipse([pose_i.x;pose_i.y],P{i},'b') +end +fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file diff --git a/examples/matlab/load2D.m b/examples/matlab/load2D.m new file mode 100644 index 000000000..e459dfc63 --- /dev/null +++ b/examples/matlab/load2D.m @@ -0,0 +1,29 @@ +function [graph,initial] = load2D(filename,model) +% load2D: read TORO pose graph +% cannot read noise model from file yet, uses specified model + +fid = fopen(filename); +if fid < 0 + error(['load2D: Cannot open file ' filename]); +end + +% scan all lines into a cell array +columns=textscan(fid,'%s','delimiter','\n'); +fclose(fid); +lines=columns{1}; + +% loop over lines and add vertices +graph = pose2SLAMGraph; +initial = pose2SLAMValues; +n=size(lines,1); +for i=1:n + line_i=lines{i}; + if strcmp('VERTEX2',line_i(1:7)) + v = textscan(line_i,'%s %d %f %f %f',1); + initial.insertPose(v{2}, gtsamPose2(v{3}, v{4}, v{5})); + elseif strcmp('EDGE2',line_i(1:5)) + e = textscan(line_i,'%s %d %d %f %f %f',1); + graph.addOdometry(e{2}, e{3}, gtsamPose2(e{4}, e{5}, e{6}), model); + end +end + diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index 2aec8e55a..d4be33f31 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -16,7 +16,6 @@ * @brief utility functions for loading datasets */ - #include #include #include @@ -28,192 +27,219 @@ using namespace gtsam; #define LINESIZE 81920 -typedef boost::shared_ptr sharedPose2Graph; -typedef pose2SLAM::Odometry Pose2Factor; ///< Typedef for Constraint class for backwards compatibility - namespace gtsam { -/* ************************************************************************* */ -pair > dataset(const string& dataset, const string& user_path) { - string path = user_path, set = dataset; - boost::optional null_model; - boost::optional identity(noiseModel::Unit::Create(3)); - boost::optional small(noiseModel::Diagonal::Variances( - gtsam::Vector_(3, 0.0001, 0.0001, 0.0003))); + /* ************************************************************************* */ + pair > dataset(const string& dataset, + const string& user_path) { + string path = user_path, set = dataset; + boost::optional null_model; + boost::optional identity(noiseModel::Unit::Create(3)); + boost::optional small( + noiseModel::Diagonal::Variances( + gtsam::Vector_(3, 0.0001, 0.0001, 0.0003))); - if (path.empty()) path = string(getenv("HOME")) + "/data"; - if (set.empty()) set = string(getenv("DATASET")); + if (path.empty()) + path = string(getenv("HOME")) + "/data"; + if (set.empty()) + set = string(getenv("DATASET")); - if (set == "intel") return make_pair(path + "/Intel/intel.graph", null_model); - if (set == "intel-gfs") return make_pair(path + "/Intel/intel.gfs.graph", null_model); - if (set == "Killian-gfs") return make_pair(path + "/Killian/Killian.gfs.graph", null_model); - if (set == "Killian") return make_pair(path + "/Killian/Killian.graph", small); - if (set == "Killian-noised") return make_pair(path + "/Killian/Killian-noised.graph", null_model); - if (set == "3") return make_pair(path + "/TORO/w3-odom.graph", identity); - if (set == "100") return make_pair(path + "/TORO/w100-odom.graph", identity); - if (set == "10K") return make_pair(path + "/TORO/w10000-odom.graph", identity); - if (set == "10K2") return make_pair(path + "/hogman/data/2D/w10000.graph", - noiseModel::Diagonal::Variances(gtsam::Vector_(3, 0.1, 0.1, 0.05))); - if (set == "Eiffel100") return make_pair(path + "/TORO/w100-Eiffel.graph", identity); - if (set == "Eiffel10K") return make_pair(path + "/TORO/w10000-Eiffel.graph", identity); - if (set == "olson") return make_pair(path + "/Olson/olson06icra.graph", null_model); - if (set == "victoria") return make_pair(path + "/VictoriaPark/victoria_park.graph", null_model); - if (set == "beijing") return make_pair(path + "/Beijing/beijingData_trips.graph", null_model); + if (set == "intel") + return make_pair(path + "/Intel/intel.graph", null_model); + if (set == "intel-gfs") + return make_pair(path + "/Intel/intel.gfs.graph", null_model); + if (set == "Killian-gfs") + return make_pair(path + "/Killian/Killian.gfs.graph", null_model); + if (set == "Killian") + return make_pair(path + "/Killian/Killian.graph", small); + if (set == "Killian-noised") + return make_pair(path + "/Killian/Killian-noised.graph", null_model); + if (set == "3") + return make_pair(path + "/TORO/w3-odom.graph", identity); + if (set == "100") + return make_pair(path + "/TORO/w100-odom.graph", identity); + if (set == "10K") + return make_pair(path + "/TORO/w10000-odom.graph", identity); + if (set == "10K2") + return make_pair(path + "/hogman/data/2D/w10000.graph", + noiseModel::Diagonal::Variances(gtsam::Vector_(3, 0.1, 0.1, 0.05))); + if (set == "Eiffel100") + return make_pair(path + "/TORO/w100-Eiffel.graph", identity); + if (set == "Eiffel10K") + return make_pair(path + "/TORO/w10000-Eiffel.graph", identity); + if (set == "olson") + return make_pair(path + "/Olson/olson06icra.graph", null_model); + if (set == "victoria") + return make_pair(path + "/VictoriaPark/victoria_park.graph", null_model); + if (set == "beijing") + return make_pair(path + "/Beijing/beijingData_trips.graph", null_model); - return make_pair("unknown", null_model); -} - -/* ************************************************************************* */ - -pair load2D( - pair > dataset, - int maxID, bool addNoise, bool smart) { - return load2D(dataset.first, dataset.second, maxID, addNoise, smart); -} - -pair load2D(const string& filename, - boost::optional model, int maxID, bool addNoise, bool smart) { - cout << "Will try to read " << filename << endl; - ifstream is(filename.c_str()); - if (!is) { - cout << "load2D: can not find the file!"; - exit(-1); + return make_pair("unknown", null_model); } - Values::shared_ptr poses(new Values); - sharedPose2Graph graph(new pose2SLAM::Graph); + /* ************************************************************************* */ - string tag; + pair load2D( + pair > dataset, + int maxID, bool addNoise, bool smart) { + return load2D(dataset.first, dataset.second, maxID, addNoise, smart); + } - // load the poses - while (is) { - is >> tag; - - if ((tag == "VERTEX2") || (tag == "VERTEX")) { - int id; - double x, y, yaw; - is >> id >> x >> y >> yaw; - // optional filter - if (maxID && id >= maxID) continue; - poses->insert(id, Pose2(x, y, yaw)); + pair load2D( + const string& filename, boost::optional model, int maxID, + bool addNoise, bool smart) { + cout << "Will try to read " << filename << endl; + ifstream is(filename.c_str()); + if (!is) { + cout << "load2D: can not find the file!"; + exit(-1); } - is.ignore(LINESIZE, '\n'); - } - is.clear(); /* clears the end-of-file and error flags */ - is.seekg(0, ios::beg); - // load the factors - while (is) { - is >> tag; + pose2SLAM::Values::shared_ptr poses(new pose2SLAM::Values); + pose2SLAM::Graph::shared_ptr graph(new pose2SLAM::Graph); - if ((tag == "EDGE2") || (tag == "EDGE") || (tag == "ODOMETRY")) { - int id1, id2; - double x, y, yaw; + string tag; - is >> id1 >> id2 >> x >> y >> yaw; - Matrix m = eye(3); - is >> m(0, 0) >> m(0, 1) >> m(1, 1) >> m(2, 2) >> m(0, 2) >> m(1, 2); - m(2, 0) = m(0, 2); - m(2, 1) = m(1, 2); - m(1, 0) = m(0, 1); + // load the poses + while (is) { + is >> tag; - // optional filter - if (maxID && (id1 >= maxID || id2 >= maxID)) continue; - - Pose2 l1Xl2(x, y, yaw); - - // SharedNoiseModel noise = noiseModel::Gaussian::Covariance(m, smart); - if (!model) { - Vector variances = Vector_(3,m(0,0),m(1,1),m(2,2)); - model = noiseModel::Diagonal::Variances(variances, smart); + if ((tag == "VERTEX2") || (tag == "VERTEX")) { + int id; + double x, y, yaw; + is >> id >> x >> y >> yaw; + // optional filter + if (maxID && id >= maxID) + continue; + poses->insert(id, Pose2(x, y, yaw)); } - - if (addNoise) - l1Xl2 = l1Xl2.retract((*model)->sample()); - - // Insert vertices if pure odometry file - if (!poses->exists(id1)) poses->insert(id1, Pose2()); - if (!poses->exists(id2)) poses->insert(id2, poses->at(id1) * l1Xl2); - - pose2SLAM::Graph::sharedFactor factor(new Pose2Factor(id1, id2, l1Xl2, *model)); - graph->push_back(factor); + is.ignore(LINESIZE, '\n'); } - is.ignore(LINESIZE, '\n'); - } + is.clear(); /* clears the end-of-file and error flags */ + is.seekg(0, ios::beg); - cout << "load2D read a graph file with " << poses->size() << " vertices and " - << graph->nrFactors() << " factors" << endl; + // load the factors + while (is) { + is >> tag; - return make_pair(graph, poses); -} + if ((tag == "EDGE2") || (tag == "EDGE") || (tag == "ODOMETRY")) { + int id1, id2; + double x, y, yaw; -/* ************************************************************************* */ -void save2D(const pose2SLAM::Graph& graph, const Values& config, const SharedDiagonal model, - const string& filename) { + is >> id1 >> id2 >> x >> y >> yaw; + Matrix m = eye(3); + is >> m(0, 0) >> m(0, 1) >> m(1, 1) >> m(2, 2) >> m(0, 2) >> m(1, 2); + m(2, 0) = m(0, 2); + m(2, 1) = m(1, 2); + m(1, 0) = m(0, 1); - fstream stream(filename.c_str(), fstream::out); + // optional filter + if (maxID && (id1 >= maxID || id2 >= maxID)) + continue; - // save poses - BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, config) { - const Pose2& pose = dynamic_cast(key_value.value); - stream << "VERTEX2 " << key_value.key << " " << pose.x() << " " << pose.y() << " " << pose.theta() << endl; - } + Pose2 l1Xl2(x, y, yaw); - // save edges - Matrix R = model->R(); - Matrix RR = trans(R)*R;//prod(trans(R),R); - BOOST_FOREACH(boost::shared_ptr factor_, graph) { - boost::shared_ptr factor = boost::dynamic_pointer_cast(factor_); - if (!factor) continue; + // SharedNoiseModel noise = noiseModel::Gaussian::Covariance(m, smart); + if (!model) { + Vector variances = Vector_(3, m(0, 0), m(1, 1), m(2, 2)); + model = noiseModel::Diagonal::Variances(variances, smart); + } - Pose2 pose = factor->measured().inverse(); - stream << "EDGE2 " << factor->key2() << " " << factor->key1() - << " " << pose.x() << " " << pose.y() << " " << pose.theta() - << " " << RR(0, 0) << " " << RR(0, 1) << " " << RR(1, 1) << " " << RR(2, 2) - << " " << RR(0, 2) << " " << RR(1, 2) << endl; - } + if (addNoise) + l1Xl2 = l1Xl2.retract((*model)->sample()); - stream.close(); -} + // Insert vertices if pure odometry file + if (!poses->exists(id1)) + poses->insert(id1, Pose2()); + if (!poses->exists(id2)) + poses->insert(id2, poses->at(id1) * l1Xl2); -/* ************************************************************************* */ -bool load3D(const string& filename) { - ifstream is(filename.c_str()); - if (!is) return false; - - while (is) { - char buf[LINESIZE]; - is.getline(buf, LINESIZE); - istringstream ls(buf); - string tag; - ls >> tag; - - if (tag == "VERTEX3") { - int id; - double x, y, z, roll, pitch, yaw; - ls >> id >> x >> y >> z >> roll >> pitch >> yaw; + pose2SLAM::Graph::sharedFactor factor( + new pose2SLAM::Odometry(id1, id2, l1Xl2, *model)); + graph->push_back(factor); + } + is.ignore(LINESIZE, '\n'); } + + cout << "load2D read a graph file with " << poses->size() + << " vertices and " << graph->nrFactors() << " factors" << endl; + + return make_pair(graph, poses); } - is.clear(); /* clears the end-of-file and error flags */ - is.seekg(0, ios::beg); - while (is) { - char buf[LINESIZE]; - is.getline(buf, LINESIZE); - istringstream ls(buf); - string tag; - ls >> tag; + /* ************************************************************************* */ + void save2D(const pose2SLAM::Graph& graph, const Values& config, + const SharedDiagonal model, const string& filename) { - if (tag == "EDGE3") { - int id1, id2; - double x, y, z, roll, pitch, yaw; - ls >> id1 >> id2 >> x >> y >> z >> roll >> pitch >> yaw; - Matrix m = eye(6); - for (int i = 0; i < 6; i++) - for (int j = i; j < 6; j++) - ls >> m(i, j); + fstream stream(filename.c_str(), fstream::out); + + // save poses + BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, config) + { + const Pose2& pose = dynamic_cast(key_value.value); + stream << "VERTEX2 " << key_value.key << " " << pose.x() << " " + << pose.y() << " " << pose.theta() << endl; + } + + // save edges + Matrix R = model->R(); + Matrix RR = trans(R) * R; //prod(trans(R),R); + BOOST_FOREACH(boost::shared_ptr factor_, graph) + { + boost::shared_ptr factor = + boost::dynamic_pointer_cast(factor_); + if (!factor) + continue; + + Pose2 pose = factor->measured().inverse(); + stream << "EDGE2 " << factor->key2() << " " << factor->key1() << " " + << pose.x() << " " << pose.y() << " " << pose.theta() << " " + << RR(0, 0) << " " << RR(0, 1) << " " << RR(1, 1) << " " + << RR(2, 2) << " " << RR(0, 2) << " " << RR(1, 2) << endl; + } + + stream.close(); + } + + /* ************************************************************************* */ + bool load3D(const string& filename) { + ifstream is(filename.c_str()); + if (!is) + return false; + + while (is) { + char buf[LINESIZE]; + is.getline(buf, LINESIZE); + istringstream ls(buf); + string tag; + ls >> tag; + + if (tag == "VERTEX3") { + int id; + double x, y, z, roll, pitch, yaw; + ls >> id >> x >> y >> z >> roll >> pitch >> yaw; + } } + is.clear(); /* clears the end-of-file and error flags */ + is.seekg(0, ios::beg); + + while (is) { + char buf[LINESIZE]; + is.getline(buf, LINESIZE); + istringstream ls(buf); + string tag; + ls >> tag; + + if (tag == "EDGE3") { + int id1, id2; + double x, y, z, roll, pitch, yaw; + ls >> id1 >> id2 >> x >> y >> z >> roll >> pitch >> yaw; + Matrix m = eye(6); + for (int i = 0; i < 6; i++) + for (int j = i; j < 6; j++) + ls >> m(i, j); + } + } + return true; } - return true; -} } diff --git a/gtsam/slam/dataset.h b/gtsam/slam/dataset.h index 5e06e583d..a099fb3d5 100644 --- a/gtsam/slam/dataset.h +++ b/gtsam/slam/dataset.h @@ -18,43 +18,52 @@ #pragma once - -#include #include +#include -namespace gtsam -{ -/** - * Construct dataset filename from short name - * Currently has "Killian" "intel.gfs", "10K", etc... - * @param filename - * @param optional dataset, if empty will try to getenv $DATASET - * @param optional path, if empty will try to getenv $HOME - */ -std::pair > +namespace gtsam { + /** + * Construct dataset filename from short name + * Currently has "Killian" "intel.gfs", "10K", etc... + * @param filename + * @param optional dataset, if empty will try to getenv $DATASET + * @param optional path, if empty will try to getenv $HOME + */ + std::pair > dataset(const std::string& dataset = "", const std::string& path = ""); -/** - * Load TORO 2D Graph - * @param filename - * @param maxID, if non-zero cut out vertices >= maxID - * @param smart: try to reduce complexity of covariance to cheapest model - */ -std::pair, boost::shared_ptr > load2D( - std::pair > dataset, - int maxID = 0, bool addNoise=false, bool smart=true); -std::pair, boost::shared_ptr > load2D( - const std::string& filename, - boost::optional model = boost::optional(), - int maxID = 0, bool addNoise=false, bool smart=true); + /** + * Load TORO 2D Graph + * @param dataset/model pair as constructed by [dataset] + * @param maxID if non-zero cut out vertices >= maxID + * @param addNoise add noise to the edges + * @param smart try to reduce complexity of covariance to cheapest model + */ + std::pair load2D( + std::pair > dataset, + int maxID = 0, bool addNoise = false, bool smart = true); -/** save 2d graph */ -void save2D(const pose2SLAM::Graph& graph, const Values& config, const gtsam::SharedDiagonal model, - const std::string& filename); + /** + * Load TORO 2D Graph + * @param filename + * @param model optional noise model to use instead of one specified by file + * @param maxID if non-zero cut out vertices >= maxID + * @param addNoise add noise to the edges + * @param smart try to reduce complexity of covariance to cheapest model + */ + std::pair load2D( + const std::string& filename, + boost::optional model = boost::optional< + gtsam::SharedDiagonal>(), int maxID = 0, bool addNoise = false, + bool smart = true); -/** - * Load TORO 3D Graph - */ -bool load3D(const std::string& filename); + /** save 2d graph */ + void save2D(const pose2SLAM::Graph& graph, const Values& config, + const gtsam::SharedDiagonal model, const std::string& filename); + + /** + * Load TORO 3D Graph + */ + bool load3D(const std::string& filename); } // namespace gtsam diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index f438ce24d..5668f8ad0 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -33,7 +33,9 @@ namespace pose2SLAM { /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper struct Values: public gtsam::Values { - /// Default constructor + typedef boost::shared_ptr shared_ptr; + + /// Default constructor Values() {} /// Copy constructor @@ -75,7 +77,9 @@ namespace pose2SLAM { /// Graph struct Graph: public NonlinearFactorGraph { - /// Default constructor for a NonlinearFactorGraph + typedef boost::shared_ptr shared_ptr; + + /// Default constructor for a NonlinearFactorGraph Graph(){} /// Creates a NonlinearFactorGraph based on another NonlinearFactorGraph From 720db709bed571c9c6cf26d1e633b23fb0a2bec4 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 3 Jun 2012 19:26:28 +0000 Subject: [PATCH 106/914] Examples install now installs data for Matlab examples. Fixed typo in examples documentation --- examples/README | 2 +- wrap/CMakeLists.txt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/README b/examples/README index d7706a0b8..3c0c90850 100644 --- a/examples/README +++ b/examples/README @@ -1,4 +1,4 @@ -This directory contains a number of exapmples that illustrate the use of GTSAM: +This directory contains a number of examples that illustrate the use of GTSAM: SimpleRotation: a super-simple example of optimizing a single rotation according to a single prior diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 36415df35..d1cd2ac64 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -72,6 +72,10 @@ if (GTSAM_INSTALL_MATLAB_TOOLBOX) message(STATUS "Installing Matlab Toolbox Examples") file(GLOB matlab_examples "${CMAKE_SOURCE_DIR}/examples/matlab/*.m") install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) + + message(STATUS "Installing Matlab Toolbox Examples (Data)") + file(GLOB matlab_examples_data "${CMAKE_SOURCE_DIR}/examples/Data/*.*") + install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples/Data) endif (GTSAM_INSTALL_MATLAB_EXAMPLES) # Tests From 73d1f0f6e06cd8f6f40c2f705029e013de9548c6 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 19:50:04 +0000 Subject: [PATCH 107/914] use make_shared, cleanup --- examples/CameraResectioning.cpp | 111 +++++++++++++++----------------- 1 file changed, 52 insertions(+), 59 deletions(-) diff --git a/examples/CameraResectioning.cpp b/examples/CameraResectioning.cpp index 0280a4f8d..3f586a67f 100644 --- a/examples/CameraResectioning.cpp +++ b/examples/CameraResectioning.cpp @@ -17,88 +17,81 @@ */ #include -#include -#include -#include -#include -#include #include +#include +#include using namespace gtsam; +using symbol_shorthand::X; /** - * Unary factor for the pose. + * Unary factor on the unknown pose, resulting from meauring the projection of + * a known 3D point in the image */ class ResectioningFactor: public NoiseModelFactor1 { - typedef NoiseModelFactor1 Base; + typedef NoiseModelFactor1 Base; - shared_ptrK K_; // camera's intrinsic parameters - Point3 P_; // 3D point on the calibration rig - Point2 p_; // 2D measurement of the 3D point + shared_ptrK K_; // camera's intrinsic parameters + Point3 P_; // 3D point on the calibration rig + Point2 p_; // 2D measurement of the 3D point public: - ResectioningFactor(const SharedNoiseModel& model, const Symbol& key, - const shared_ptrK& calib, const Point2& p, const Point3& P) : - Base(model, key), K_(calib), P_(P), p_(p) { - } - virtual ~ResectioningFactor() {} + /// Construct factor given known point P and its projection p + ResectioningFactor(const SharedNoiseModel& model, const Key& key, + const shared_ptrK& calib, const Point2& p, const Point3& P) : + Base(model, key), K_(calib), P_(P), p_(p) { + } - ADD_CLONE_NONLINEAR_FACTOR(ResectioningFactor) - - virtual Vector evaluateError(const Pose3& X, boost::optional H = boost::none) const { - SimpleCamera camera(*K_, X); - Point2 reprojectionError(camera.project(P_, H) - p_); - return reprojectionError.vector(); - } + /// evaluate the error + virtual Vector evaluateError(const Pose3& pose, boost::optional H = + boost::none) const { + SimpleCamera camera(*K_, pose); + Point2 reprojectionError(camera.project(P_, H) - p_); + return reprojectionError.vector(); + } }; -/*******************************************************************************/ -/** - * Camera: f = 1.0, Image: 100x100, center: 50.0, 50.0 +/******************************************************************************* + * Camera: f = 1, Image: 100x100, center: 50, 50.0 * Pose (ground truth): (Xw, -Yw, -Zw, [0,0,2.0]') * Known landmarks: * 3D Points: (10,10,0) (-10,10,0) (-10,-10,0) (10,-10,0) * Perfect measurements: * 2D Point: (55,45) (45,45) (45,55) (55,55) - */ + *******************************************************************************/ int main(int argc, char* argv[]) { - /* read camera intrinsic parameters */ - shared_ptrK calib(new Cal3_S2(1.0, 1.0, 0, 50.0, 50.0)); + /* read camera intrinsic parameters */ + shared_ptrK calib(new Cal3_S2(1, 1, 0, 50, 50)); - /* create keys for variables */ - // we have only 1 variable to solve: the camera pose - Symbol X('x',1); + /* 1. create graph */ + NonlinearFactorGraph graph; - /* 1. create graph */ - NonlinearFactorGraph graph; + /* 2. add factors to the graph */ + // add measurement factors + SharedDiagonal measurementNoise = sharedSigmas(Vector_(2, 0.5, 0.5)); + boost::shared_ptr factor; + graph.push_back( + boost::make_shared(measurementNoise, X(1), calib, + Point2(55, 45), Point3(10, 10, 0))); + graph.push_back( + boost::make_shared(measurementNoise, X(1), calib, + Point2(45, 45), Point3(-10, 10, 0))); + graph.push_back( + boost::make_shared(measurementNoise, X(1), calib, + Point2(45, 55), Point3(-10, -10, 0))); + graph.push_back( + boost::make_shared(measurementNoise, X(1), calib, + Point2(55, 55), Point3(10, -10, 0))); - /* 2. add factors to the graph */ - // add measurement factors - SharedDiagonal measurementNoise = sharedSigmas(Vector_(2, 0.5, 0.5)); - boost::shared_ptr factor; - factor = boost::shared_ptr(new ResectioningFactor( - measurementNoise, X, calib, Point2(55.0, 45.0), Point3(10.0, 10.0, 0.0))); - graph.push_back(factor); - factor = boost::shared_ptr(new ResectioningFactor( - measurementNoise, X, calib, Point2(45.0, 45.0), Point3(-10.0, 10.0, 0.0))); - graph.push_back(factor); - factor = boost::shared_ptr(new ResectioningFactor( - measurementNoise, X, calib, Point2(45.0, 55.0), Point3(-10.0, -10.0, 0.0))); - graph.push_back(factor); - factor = boost::shared_ptr(new ResectioningFactor( - measurementNoise, X, calib, Point2(55.0, 55.0), Point3(10.0, -10.0, 0.0))); - graph.push_back(factor); + /* 3. Create an initial estimate for the camera pose */ + Values initial; + initial.insert(X(1), + Pose3(Rot3(1, 0, 0, 0, -1, 0, 0, 0, -1), Point3(0, 0, 2))); - /* 3. Create an initial estimate for the camera pose */ - Values initial; - initial.insert(X, Pose3(Rot3(1.,0.,0., - 0.,-1.,0., - 0.,0.,-1.), Point3(0.,0.,2.0))); + /* 4. Optimize the graph using Levenberg-Marquardt*/ + Values result = LevenbergMarquardtOptimizer(graph, initial).optimize(); + result.print("Final result:\n"); - /* 4. Optimize the graph using Levenberg-Marquardt*/ - Values result = LevenbergMarquardtOptimizer(graph, initial).optimize(); - result.print("Final result: "); - - return 0; + return 0; } From e23818431e21ed6a243fc75731dccfb353551c53 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 19:52:35 +0000 Subject: [PATCH 108/914] Renamed examples to not have _easy.... --- .../{PlanarSLAMExample_easy.cpp => PlanarSLAMExample.cpp} | 0 .../{Pose2SLAMExample_easy.cpp => Pose2SLAMExample.cpp} | 2 +- examples/{Pose2SLAMwSPCG_easy.cpp => Pose2SLAMwSPCG.cpp} | 0 examples/README | 8 +++++--- 4 files changed, 6 insertions(+), 4 deletions(-) rename examples/{PlanarSLAMExample_easy.cpp => PlanarSLAMExample.cpp} (100%) rename examples/{Pose2SLAMExample_easy.cpp => Pose2SLAMExample.cpp} (98%) rename examples/{Pose2SLAMwSPCG_easy.cpp => Pose2SLAMwSPCG.cpp} (100%) diff --git a/examples/PlanarSLAMExample_easy.cpp b/examples/PlanarSLAMExample.cpp similarity index 100% rename from examples/PlanarSLAMExample_easy.cpp rename to examples/PlanarSLAMExample.cpp diff --git a/examples/Pose2SLAMExample_easy.cpp b/examples/Pose2SLAMExample.cpp similarity index 98% rename from examples/Pose2SLAMExample_easy.cpp rename to examples/Pose2SLAMExample.cpp index b6507d7fc..851363b2e 100644 --- a/examples/Pose2SLAMExample_easy.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file Pose2SLAMExample_easy.cpp + * @file Pose2SLAMExample.cpp * @brief A 2D Pose SLAM example using the predefined typedefs in gtsam/slam/pose2SLAM.h * @date Oct 21, 2010 * @author Yong Dian Jian diff --git a/examples/Pose2SLAMwSPCG_easy.cpp b/examples/Pose2SLAMwSPCG.cpp similarity index 100% rename from examples/Pose2SLAMwSPCG_easy.cpp rename to examples/Pose2SLAMwSPCG.cpp diff --git a/examples/README b/examples/README index 3c0c90850..8558ea62d 100644 --- a/examples/README +++ b/examples/README @@ -11,10 +11,11 @@ errorStateKalmanFilter: simple 1D example of a moving target measured by a accel 2D Pose SLAM ============ -Pose2SLAMExample_easy: A 2D Pose SLAM example using the predefined typedefs in gtsam/slam/pose2SLAM.h +LocalizationExample.cpp: modeling robot motion +LocalizationExample2.cpp: example with GPS like measurements +Pose2SLAMExample: A 2D Pose SLAM example using the predefined typedefs in gtsam/slam/pose2SLAM.h Pose2SLAMExample_advanced: same, but uses an Optimizer object -Pose2SLAMwSPCG_easy: solve a simple 3 by 3 grid of Pose2 SLAM problem by using easy SPCG interface -Pose2SLAMwSPCG_advanced: solve a simple 3 by 3 grid of Pose2 SLAM problem by using advanced SPCG interface +Pose2SLAMwSPCG: solve a simple 3 by 3 grid of Pose2 SLAM problem by using easy SPCG interface Planar SLAM with landmarks ========================== @@ -23,6 +24,7 @@ PlanarSLAMSelfContained_advanced: simple robotics example with all typedefs inte Visual SLAM =========== +CameraResectioning.cpp: An example of gtsam for solving the camera resectioning problem The directory vSLAMexample includes 2 simple examples using GTSAM: - vSFMexample using visualSLAM in for structure-from-motion (SFM), and - vISAMexample using visualSLAM and ISAM for incremental SLAM updates From 839b539aad1f1c1ea6890bed9244e2ce43e4b16c Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 3 Jun 2012 20:08:46 +0000 Subject: [PATCH 109/914] Fixed a bug in cmake install that tried to copy a .svn folder --- wrap/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index d1cd2ac64..0ed4cc903 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -74,7 +74,9 @@ if (GTSAM_INSTALL_MATLAB_TOOLBOX) install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) message(STATUS "Installing Matlab Toolbox Examples (Data)") + set(data_excludes "${CMAKE_SOURCE_DIR}/examples/Data/.svn") file(GLOB matlab_examples_data "${CMAKE_SOURCE_DIR}/examples/Data/*.*") + list(REMOVE_ITEM matlab_examples_data ${data_excludes}) install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples/Data) endif (GTSAM_INSTALL_MATLAB_EXAMPLES) From 0baa83cf45f98522985267f4e83f02c08a068d90 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 20:11:40 +0000 Subject: [PATCH 110/914] Another rename --- .cproject | 24 +++++++++---------- ...pp => PlanarSLAMExample_selfcontained.cpp} | 2 +- examples/README | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) rename examples/{PlanarSLAMSelfContained_advanced.cpp => PlanarSLAMExample_selfcontained.cpp} (99%) diff --git a/.cproject b/.cproject index b075667ed..1f29f86b7 100644 --- a/.cproject +++ b/.cproject @@ -1653,10 +1653,10 @@ true true - + make - -j2 - PlanarSLAMExample_easy.run + -j5 + PlanarSLAMExample.run true true true @@ -1685,10 +1685,10 @@ true true - + make - -j2 - PlanarSLAMSelfContained_advanced.run + -j5 + PlanarSLAMExample_selfcontained.run true true true @@ -1701,18 +1701,18 @@ true true - + make - -j2 - Pose2SLAMExample_easy.run + -j5 + Pose2SLAMExample.run true true true - + make - -j2 - Pose2SLAMwSPCG_easy.run + -j5 + Pose2SLAMwSPCG.run true true true diff --git a/examples/PlanarSLAMSelfContained_advanced.cpp b/examples/PlanarSLAMExample_selfcontained.cpp similarity index 99% rename from examples/PlanarSLAMSelfContained_advanced.cpp rename to examples/PlanarSLAMExample_selfcontained.cpp index f7c321f2d..7e17c2a0e 100644 --- a/examples/PlanarSLAMSelfContained_advanced.cpp +++ b/examples/PlanarSLAMExample_selfcontained.cpp @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file PlanarSLAMSelfContained_advanced.cpp + * @file PlanarSLAMExample_selfcontained.cpp * @brief Simple robotics example with all typedefs internal to this script. * @author Alex Cunningham */ diff --git a/examples/README b/examples/README index 8558ea62d..2a54459f3 100644 --- a/examples/README +++ b/examples/README @@ -20,7 +20,7 @@ Pose2SLAMwSPCG: solve a simple 3 by 3 grid of Pose2 SLAM problem by using easy S Planar SLAM with landmarks ========================== PlanarSLAMExample: simple robotics example using the pre-built planar SLAM domain -PlanarSLAMSelfContained_advanced: simple robotics example with all typedefs internal to this script. +PlanarSLAMExample_selfcontained: simple robotics example with all typedefs internal to this script. Visual SLAM =========== From 6895481f0dcd29d7d991067e73a934c8f8d5fc66 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 20:12:12 +0000 Subject: [PATCH 111/914] Synchronized C++ and MATLAB --- examples/Pose2SLAMExample.cpp | 6 ++--- examples/matlab/Pose2SLAMExample_easy.m | 34 +++++++++++++----------- examples/matlab/Pose2SLAMExample_graph.m | 4 +-- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/examples/Pose2SLAMExample.cpp b/examples/Pose2SLAMExample.cpp index 851363b2e..265e323db 100644 --- a/examples/Pose2SLAMExample.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -47,18 +47,18 @@ int main(int argc, char** argv) { // print graph.print("\nFactor graph:\n"); - // 3. Create the data structure to hold the initialEstimate estinmate to the solution + // 3. Create the data structure to hold the initialEstimate estimate to the solution pose2SLAM::Values initialEstimate; Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); - initialEstimate.print("\nInitial estimate:\n "); + initialEstimate.print("\nInitial estimate:\n"); // 4. Single Step Optimization using Levenberg-Marquardt pose2SLAM::Values result = graph.optimize(initialEstimate); - result.print("\nFinal result:\n "); + result.print("\nFinal result:\n"); return 0; } diff --git a/examples/matlab/Pose2SLAMExample_easy.m b/examples/matlab/Pose2SLAMExample_easy.m index b0200946b..2172f5767 100644 --- a/examples/matlab/Pose2SLAMExample_easy.m +++ b/examples/matlab/Pose2SLAMExample_easy.m @@ -1,9 +1,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% GTSAM Copyright 2010, Georgia Tech Research Corporation, +% 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 % % @brief Simple robotics example using the pre-built planar SLAM domain @@ -23,32 +23,34 @@ graph = pose2SLAMGraph; %% Add prior % gaussian for prior -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); -odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -graph.addOdometry(1, 2, odometry, odometryNoise); -graph.addOdometry(2, 3, odometry, odometryNoise); +graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -%% Add measurements -% general noisemodel for measurements -meas_model = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); +%% Add pose constraint +constraintUncertainty = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), constraintUncertainty); % print -graph.print('full graph'); +graph.print(sprintf('/nFactor graph:\n')); %% Initialize to noisy points initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); - -initialEstimate.print('initial estimate'); +x1 = gtsamPose2(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); +x2 = gtsamPose2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); +x3 = gtsamPose2(4.1, 0.1, pi/2); initialEstimate.insertPose(3, x3); +x4 = gtsamPose2(4.0, 2.0, pi ); initialEstimate.insertPose(4, x4); +x5 = gtsamPose2(2.1, 2.1,-pi/2); initialEstimate.insertPose(5, x5); +initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate); -result.print('final result'); +result.print(sprintf('\nFinal result:\n')); diff --git a/examples/matlab/Pose2SLAMExample_graph.m b/examples/matlab/Pose2SLAMExample_graph.m index 7118efe01..142c9b36d 100644 --- a/examples/matlab/Pose2SLAMExample_graph.m +++ b/examples/matlab/Pose2SLAMExample_graph.m @@ -13,7 +13,7 @@ %% Initialize graph, initial estimate, and odometry noise model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 5*pi/180]); [graph,initial]=load2D('../Data/w100-odom.graph',model); -initial.print('Initial estimate:\n'); +initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin @@ -27,7 +27,7 @@ plot(initial.xs(),initial.ys(),'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initial); hold on; plot(result.xs(),result.ys(),'b-*') -result.print('\nFinal result:\n'); +result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses marginals = graph.marginals(result); From 2d4fcbf1012237a2bad6ce2957a00b3912474304 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 20:14:23 +0000 Subject: [PATCH 112/914] renamed MATLAB examples --- .../matlab/{PlanarSLAMExample_easy.m => PlanarSLAMExample.m} | 0 examples/matlab/{Pose2SLAMExample_easy.m => Pose2SLAMExample.m} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename examples/matlab/{PlanarSLAMExample_easy.m => PlanarSLAMExample.m} (100%) rename examples/matlab/{Pose2SLAMExample_easy.m => Pose2SLAMExample.m} (98%) diff --git a/examples/matlab/PlanarSLAMExample_easy.m b/examples/matlab/PlanarSLAMExample.m similarity index 100% rename from examples/matlab/PlanarSLAMExample_easy.m rename to examples/matlab/PlanarSLAMExample.m diff --git a/examples/matlab/Pose2SLAMExample_easy.m b/examples/matlab/Pose2SLAMExample.m similarity index 98% rename from examples/matlab/Pose2SLAMExample_easy.m rename to examples/matlab/Pose2SLAMExample.m index 2172f5767..41d4c0708 100644 --- a/examples/matlab/Pose2SLAMExample_easy.m +++ b/examples/matlab/Pose2SLAMExample.m @@ -40,7 +40,7 @@ constraintUncertainty = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), constraintUncertainty); % print -graph.print(sprintf('/nFactor graph:\n')); +graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points initialEstimate = pose2SLAMValues; From 5aee7b4439c2ca67fe66fc3ac42a42711d7ac34a Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sun, 3 Jun 2012 20:24:58 +0000 Subject: [PATCH 113/914] add doxygen-comment to spcg solver --- examples/Pose2SLAMwSPCG.cpp | 13 ++++++-- gtsam/linear/SimpleSPCGSolver.h | 55 +++++++++++++++++---------------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index 5565b6206..c5c2efc66 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -9,6 +9,13 @@ * -------------------------------------------------------------------------- */ +/** + * @file Pose2SLAMwSPCG.cpp + * @brief A 2D Pose SLAM example using the SimpleSPCGSolver. + * @author Yong-Dian Jian + * @date June 2, 2012 + */ + #include #include #include @@ -55,6 +62,9 @@ int main(void) { cout << "initial error = " << graph.error(initialEstimate) << endl ; // 4. Single Step Optimization using Levenberg-Marquardt + // Note: Although there are many options in IterativeOptimizationParameters, + // the SimpleSPCGSolver doesn't actually use all of them at this moment. + // More detail in the next release. LevenbergMarquardtParams param; param.linearSolverType = SuccessiveLinearizationParams::CG; param.iterativeParams = boost::make_shared(); @@ -63,6 +73,5 @@ int main(void) { Values result = optimizer.optimize(); cout << "final error = " << graph.error(result) << endl; - return 0 ; + return 0 ; } - diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h index c7367f663..04729fc1a 100644 --- a/gtsam/linear/SimpleSPCGSolver.h +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -19,12 +19,19 @@ namespace gtsam { /** - * This class gives a simple implementation to the SPCG solver presented in Dellaert et al. IROS'10. - * Given a linear least-squares problem f(x) = |A x - b|^2. - * We split the problem into f(x) = |At - bt|^2 + |Ac - bc|^2 where At denotes the "tree" part, - * and Ac denotes the "constraint" part. At is factorized into Qt Rt, and we compute ct = Qt\bt, and xt = Rt\ct. - * Then we solve reparametrized problem f(y) = |y|^2 + |Ac Rt \ y - by|^2, where y = Rt(x - xt), and by = (bc - Ac xt) - * In the matrix form, it is equivalent to solving [Ac Rt^{-1} ; I ] y = [by ; 0]. + * This class gives a simple implementation to the SPCG solver presented in Dellaert et al in IROS'10. + * + * Given a linear least-squares problem \f$ f(x) = |A x - b|^2 \f$. We split the problem into + * \f$ f(x) = |A_t - b_t|^2 + |A_c - b_c|^2 \f$ where \f$ A_t \f$ denotes the "tree" part, and \f$ A_c \f$ denotes the "constraint" part. + * \f$ A_t \f$ is factorized into \f$ Q_t R_t \f$, and we compute \f$ c_t = Q_t^{-1} b_t \f$, and \f$ x_t = R_t^{-1} c_t \f$ accordingly. + * Then we solve a reparametrized problem \f$ f(y) = |y|^2 + |A_c R_t^{-1} y - \bar{b_y}|^2 \f$, where \f$ y = R_t(x - x_t) \f$, and \f$ \bar{b_y} = (b_c - A_c x_t) \f$ + * + * In the matrix form, it is equivalent to solving \f$ [A_c R_t^{-1} ; I ] y = [\bar{b_y} ; 0] \f$. We can solve it + * with the least-squares variation of the conjugate gradient method. + * + * Note: A full SPCG implementation will come up soon in the next release. + * + * \nosubgrouping */ class SimpleSPCGSolver : public IterativeSolver { @@ -36,19 +43,15 @@ public: protected: - size_t nVar_ ; /* number of variables */ - size_t nAc_ ; /* number of factors in Ac */ - - /* for SPCG */ - FactorGraph::shared_ptr Ac_; - GaussianBayesNet::shared_ptr Rt_; - VectorValues::shared_ptr xt_; - VectorValues::shared_ptr y0_; - VectorValues::shared_ptr by_; /* [bc_bar ; 0 ] */ - - /* buffer for row and column vectors in */ - VectorValues::shared_ptr tmpY_; - VectorValues::shared_ptr tmpB_; + size_t nVar_ ; ///< number of variables \f$ x \f$ + size_t nAc_ ; ///< number of factors in \f$ A_c \f$ + FactorGraph::shared_ptr Ac_; ///< the constrained part of the graph + GaussianBayesNet::shared_ptr Rt_; ///< the gaussian bayes net of the tree part of the graph + VectorValues::shared_ptr xt_; ///< the solution of the \f$ A_t^{-1} b_t \f$ + VectorValues::shared_ptr y0_; ///< a column zero vector + VectorValues::shared_ptr by_; ///< \f$ [\bar{b_y} ; 0 ] \f$ + VectorValues::shared_ptr tmpY_; ///< buffer for the column vectors + VectorValues::shared_ptr tmpB_; ///< buffer for the row vectors public: @@ -60,25 +63,25 @@ protected: VectorValues::shared_ptr optimize (const VectorValues &initial); - /* output = [bc_bar ; 0 ] - [Ac Rt^{-1} ; I] y */ + /** output = \f$ [\bar{b_y} ; 0 ] - [A_c R_t^{-1} ; I] \f$ input */ void residual(const VectorValues &input, VectorValues &output); - /* output = [Ac Rt^{-1} ; I] input */ + /** output = \f$ [A_c R_t^{-1} ; I] \f$ input */ void multiply(const VectorValues &input, VectorValues &output); - /* output = [Rt^{-T} Ac^T, I] input */ + /** output = \f$ [R_t^{-T} A_c^T, I] \f$ input */ void transposeMultiply(const VectorValues &input, VectorValues &output); - /* output = Rt^{-1} input */ + /** output = \f$ R_t^{-1} \f$ input */ void backSubstitute(const VectorValues &rhs, VectorValues &sol) ; - /* output = Rt^{-T} input */ + /** output = \f$ R_t^{-T} \f$ input */ void transposeBackSubstitute(const VectorValues &rhs, VectorValues &sol) ; - /* return x = Rt^{-1} y + x_t */ + /** return \f$ R_t^{-1} y + x_t \f$ */ VectorValues::shared_ptr transform(const VectorValues &y); - /* naively split a gaussian factor graph into tree and constraint parts + /** naively split a gaussian factor graph into tree and constraint parts * Note: This function has to be refined for your graph/application */ boost::tuple::shared_ptr> splitGraph(const GaussianFactorGraph &gfg); From abcb6c6bd933a6f1b239f24f182cdc1db62c4242 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sun, 3 Jun 2012 20:45:00 +0000 Subject: [PATCH 114/914] move iterative.* to unstable --- gtsam_unstable/linear/CMakeLists.txt | 20 +++++++++++++++++++ .../linear/iterative-inl.h | 5 ++--- .../linear/iterative.cpp | 6 ++++-- {gtsam => gtsam_unstable}/linear/iterative.h | 0 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 gtsam_unstable/linear/CMakeLists.txt rename {gtsam => gtsam_unstable}/linear/iterative-inl.h (99%) rename {gtsam => gtsam_unstable}/linear/iterative.cpp (98%) rename {gtsam => gtsam_unstable}/linear/iterative.h (100%) diff --git a/gtsam_unstable/linear/CMakeLists.txt b/gtsam_unstable/linear/CMakeLists.txt new file mode 100644 index 000000000..d5429a5df --- /dev/null +++ b/gtsam_unstable/linear/CMakeLists.txt @@ -0,0 +1,20 @@ +# Install headers +file(GLOB base_headers "*.h") +install(FILES ${linear_headers} DESTINATION include/gtsam_unstable/linear) + +# Components to link tests in this subfolder against +set(linear_local_libs + linear + linear_unstable + base) + +set (linear_full_libs + gtsam-static + gtsam_unstable-static) + +# Exclude tests that don't work +set (base_excluded_tests "") + +# Add all tests +gtsam_add_subdir_tests(linear_unstable "${linear_local_libs}" "${linear_full_libs}" "${linear_excluded_tests}") +add_dependencies(check.unstable check.linear_unstable) diff --git a/gtsam/linear/iterative-inl.h b/gtsam_unstable/linear/iterative-inl.h similarity index 99% rename from gtsam/linear/iterative-inl.h rename to gtsam_unstable/linear/iterative-inl.h index 02048d3df..73b1e9497 100644 --- a/gtsam/linear/iterative-inl.h +++ b/gtsam_unstable/linear/iterative-inl.h @@ -18,10 +18,9 @@ #pragma once -#include - +#include #include -#include +#include using namespace std; diff --git a/gtsam/linear/iterative.cpp b/gtsam_unstable/linear/iterative.cpp similarity index 98% rename from gtsam/linear/iterative.cpp rename to gtsam_unstable/linear/iterative.cpp index c431e0c82..35b11f16d 100644 --- a/gtsam/linear/iterative.cpp +++ b/gtsam_unstable/linear/iterative.cpp @@ -15,13 +15,15 @@ * @author Frank Dellaert * @date Dec 28, 2009 */ -#include +#include #include #include #include #include -#include + + +#include using namespace std; diff --git a/gtsam/linear/iterative.h b/gtsam_unstable/linear/iterative.h similarity index 100% rename from gtsam/linear/iterative.h rename to gtsam_unstable/linear/iterative.h From 009907c347980a01ddd7db46dd97fb1de618d252 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sun, 3 Jun 2012 20:45:36 +0000 Subject: [PATCH 115/914] --- gtsam_unstable/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 9e9d66a7c..b50667f48 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -4,6 +4,7 @@ set (gtsam_unstable_subdirs base discrete dynamics + linear slam ) @@ -29,6 +30,7 @@ set(gtsam_unstable_srcs ${base_srcs} ${discrete_srcs} ${dynamics_srcs} + ${linear_srcs} ${slam_srcs} ) From 6bf036d3c112878408ef22b702ecdc4bc1e3a180 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 3 Jun 2012 21:51:33 +0000 Subject: [PATCH 116/914] Corrected some doxygen warnings --- gtsam/inference/BayesNet.h | 2 +- gtsam/inference/BayesTree-inl.h | 2 +- gtsam/inference/BayesTree.h | 2 +- gtsam/inference/BayesTreeCliqueBase-inl.h | 2 +- gtsam/inference/BayesTreeCliqueBase.h | 2 +- gtsam/inference/EliminationTree-inl.h | 2 +- gtsam/inference/graph-inl.h | 4 ++-- gtsam/inference/inference.cpp | 5 +++-- gtsam/inference/inference.h | 3 ++- gtsam/linear/GaussianBayesTree-inl.h | 2 +- gtsam/linear/GaussianISAM.cpp | 2 +- gtsam/linear/GaussianISAM.h | 2 +- gtsam/linear/GaussianSequentialSolver.cpp | 2 +- gtsam/linear/GaussianSequentialSolver.h | 2 +- gtsam/linear/KalmanFilter.h | 7 ++----- gtsam/nonlinear/NonlinearFactor.h | 4 ++-- 16 files changed, 22 insertions(+), 23 deletions(-) diff --git a/gtsam/inference/BayesNet.h b/gtsam/inference/BayesNet.h index 0f78a15e3..f6721816c 100644 --- a/gtsam/inference/BayesNet.h +++ b/gtsam/inference/BayesNet.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file BayesNet + * @file BayesNet.h * @brief Bayes network * @author Frank Dellaert */ diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 95b070739..3a871c29a 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file BayesTree.cpp + * @file BayesTree-inl.h * @brief Bayes Tree is a tree of cliques of a Bayes Chain * @author Frank Dellaert * @author Michael Kaess diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index a9ed53ee9..a4cdbaafe 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file BayesTree + * @file BayesTree.h * @brief Bayes Tree is a tree of cliques of a Bayes Chain * @author Frank Dellaert */ diff --git a/gtsam/inference/BayesTreeCliqueBase-inl.h b/gtsam/inference/BayesTreeCliqueBase-inl.h index dfc8864f7..c57d6ed50 100644 --- a/gtsam/inference/BayesTreeCliqueBase-inl.h +++ b/gtsam/inference/BayesTreeCliqueBase-inl.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file BayesTreeCliqueBase + * @file BayesTreeCliqueBase-inl.h * @brief Base class for cliques of a BayesTree * @author Richard Roberts and Frank Dellaert */ diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index 194b616b7..7ae2c15f9 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file BayesTreeCliqueBase + * @file BayesTreeCliqueBase.h * @brief Base class for cliques of a BayesTree * @author Richard Roberts and Frank Dellaert */ diff --git a/gtsam/inference/EliminationTree-inl.h b/gtsam/inference/EliminationTree-inl.h index 488911127..e5f50a867 100644 --- a/gtsam/inference/EliminationTree-inl.h +++ b/gtsam/inference/EliminationTree-inl.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file EliminationTree.cpp + * @file EliminationTree-inl.h * @author Frank Dellaert * @date Oct 13, 2010 */ diff --git a/gtsam/inference/graph-inl.h b/gtsam/inference/graph-inl.h index d8395942a..8f6feb55d 100644 --- a/gtsam/inference/graph-inl.h +++ b/gtsam/inference/graph-inl.h @@ -10,9 +10,9 @@ * -------------------------------------------------------------------------- */ /* - * graph-inl.h + * @file graph-inl.h * @brief Graph algorithm using boost library - * @author: Kai Ni + * @author Kai Ni */ #pragma once diff --git a/gtsam/inference/inference.cpp b/gtsam/inference/inference.cpp index 9b7252030..7afad8330 100644 --- a/gtsam/inference/inference.cpp +++ b/gtsam/inference/inference.cpp @@ -10,9 +10,10 @@ * -------------------------------------------------------------------------- */ /** - * @file inference-inl.h + * @file inference.cpp * @brief inference definitions - * @author Frank Dellaert, Richard Roberts + * @author Frank Dellaert + * @author Richard Roberts */ #include diff --git a/gtsam/inference/inference.h b/gtsam/inference/inference.h index d87720b5a..38f896a0f 100644 --- a/gtsam/inference/inference.h +++ b/gtsam/inference/inference.h @@ -13,7 +13,8 @@ * @file inference.h * @brief Contains *generic* inference algorithms that convert between templated * graphical models, i.e., factor graphs, Bayes nets, and Bayes trees - * @author Frank Dellaert, Richard Roberts + * @author Frank Dellaert + * @author Richard Roberts */ #pragma once diff --git a/gtsam/linear/GaussianBayesTree-inl.h b/gtsam/linear/GaussianBayesTree-inl.h index 4972b13bf..4e398ef7f 100644 --- a/gtsam/linear/GaussianBayesTree-inl.h +++ b/gtsam/linear/GaussianBayesTree-inl.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file GaussianBayesTree.cpp + * @file GaussianBayesTree-inl.h * @brief Gaussian Bayes Tree, the result of eliminating a GaussianJunctionTree * @brief GaussianBayesTree * @author Frank Dellaert diff --git a/gtsam/linear/GaussianISAM.cpp b/gtsam/linear/GaussianISAM.cpp index 6207d6ac7..f78d8b3c3 100644 --- a/gtsam/linear/GaussianISAM.cpp +++ b/gtsam/linear/GaussianISAM.cpp @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file GaussianISAM + * @file GaussianISAM.cpp * @brief Linear ISAM only * @author Michael Kaess */ diff --git a/gtsam/linear/GaussianISAM.h b/gtsam/linear/GaussianISAM.h index af96d5317..e4ac62704 100644 --- a/gtsam/linear/GaussianISAM.h +++ b/gtsam/linear/GaussianISAM.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file GaussianISAM + * @file GaussianISAM.h * @brief Linear ISAM only * @author Michael Kaess */ diff --git a/gtsam/linear/GaussianSequentialSolver.cpp b/gtsam/linear/GaussianSequentialSolver.cpp index b83926647..d3ff3146c 100644 --- a/gtsam/linear/GaussianSequentialSolver.cpp +++ b/gtsam/linear/GaussianSequentialSolver.cpp @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file SequentialSolver.cpp + * @file GaussianSequentialSolver.cpp * @author Richard Roberts * @date Oct 19, 2010 */ diff --git a/gtsam/linear/GaussianSequentialSolver.h b/gtsam/linear/GaussianSequentialSolver.h index 2fad97867..36e93bcf4 100644 --- a/gtsam/linear/GaussianSequentialSolver.h +++ b/gtsam/linear/GaussianSequentialSolver.h @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file SequentialSolver.h + * @file GaussianSequentialSolver.h * @brief Solves a GaussianFactorGraph (i.e. a sparse linear system) using sequential variable elimination. * @author Richard Roberts * @date Oct 19, 2010 diff --git a/gtsam/linear/KalmanFilter.h b/gtsam/linear/KalmanFilter.h index b74a0db7d..6df029b61 100644 --- a/gtsam/linear/KalmanFilter.h +++ b/gtsam/linear/KalmanFilter.h @@ -10,11 +10,8 @@ * -------------------------------------------------------------------------- */ /** - * @file testKalmanFilter.cpp - * - * Simple linear Kalman filter. - * Implemented using factor graphs, i.e., does Cholesky-based SRIF, really. - * + * @file KalmanFilter.h + * @brief Simple linear Kalman filter. Implemented using factor graphs, i.e., does Cholesky-based SRIF, really. * @date Sep 3, 2011 * @author Stephen Williams * @author Frank Dellaert diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 12001551c..73c150695 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -10,8 +10,8 @@ * -------------------------------------------------------------------------- */ /** - * @file NoiseModelFactor.h - * @brief Non-linear factor class + * @file NonlinearFactor.h + * @brief Non-linear factor base classes * @author Frank Dellaert * @author Richard Roberts */ From c558a67786158374b75dfe133d79ec5034308093 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 4 Jun 2012 00:36:21 +0000 Subject: [PATCH 117/914] fleshed out visualSLAM namespace for Matlab wrapping --- gtsam/slam/tests/testSerializationSLAM.cpp | 2 +- gtsam/slam/visualSLAM.cpp | 7 +++++ gtsam/slam/visualSLAM.h | 32 ++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/gtsam/slam/tests/testSerializationSLAM.cpp b/gtsam/slam/tests/testSerializationSLAM.cpp index 51d37db74..275abe1b8 100644 --- a/gtsam/slam/tests/testSerializationSLAM.cpp +++ b/gtsam/slam/tests/testSerializationSLAM.cpp @@ -181,7 +181,7 @@ Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); /* ************************************************************************* */ TEST (Serialization, visual_system) { using namespace visualSLAM; - Values values; + visualSLAM::Values values; Symbol x1('x',1), x2('x',2); Symbol l1('l',1), l2('l',2); Pose3 pose1 = pose3, pose2 = pose3.inverse(); diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index cc37e8bff..346455063 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -27,6 +27,13 @@ namespace visualSLAM { push_back(factor); } + /* ************************************************************************* */ + void Graph::addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, + Key poseKey, Key pointKey, const shared_ptrKStereo& K) { + boost::shared_ptr factor(new StereoFactor(measured, model, poseKey, pointKey, K)); + push_back(factor); + } + /* ************************************************************************* */ void Graph::addPoseConstraint(Key poseKey, const Pose3& p) { boost::shared_ptr factor(new PoseConstraint(poseKey, p)); diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 32824b60e..f13755836 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -46,6 +46,27 @@ namespace visualSLAM { typedef GenericProjectionFactor ProjectionFactor; typedef GenericStereoFactor StereoFactor; + /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper + struct Values: public gtsam::Values { + + typedef boost::shared_ptr shared_ptr; + + /// Default constructor + Values() {} + + /// Copy constructor + Values(const gtsam::Values& values) : + gtsam::Values(values) { + } + + /// insert a pose + void insertPose(Key i, const Pose3& pose) { insert(i, pose); } + + /// get a pose + Pose3 pose(Key i) const { return at(i); } + + }; + /** * Non-linear factor graph for vanilla visual SLAM */ @@ -80,6 +101,17 @@ namespace visualSLAM { void addMeasurement(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrK& K); + /** + * Add a stereo factor measurement + * @param measured the measurement + * @param model the noise model for the measurement + * @param poseKey variable key for the camera pose + * @param pointKey variable key for the landmark + * @param K shared pointer to stereo calibration object + */ + void addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, + Key poseKey, Key pointKey, const shared_ptrKStereo& K); + /** * Add a constraint on a pose (for now, *must* be satisfied in any Values) * @param key variable key of the camera pose From 877e9d4045b0b81b33d9a5a8b28f72a6d0c91e3e Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 00:41:13 +0000 Subject: [PATCH 118/914] new Pose3SLAM examples in C++ and MATLAB --- examples/Data/sphere_smallnoise.graph | 10847 ++++++++++++++++++++ examples/Pose2SLAMExample.cpp | 20 +- examples/matlab/Pose2SLAMExample.m | 14 +- examples/matlab/Pose2SLAMExample_circle.m | 48 + examples/matlab/Pose3SLAMExample_circle.m | 49 + examples/matlab/Pose3SLAMExample_graph.m | 28 + examples/matlab/load3D.m | 38 + gtsam.h | 96 +- gtsam/slam/planarSLAM.h | 21 +- gtsam/slam/pose2SLAM.cpp | 2 +- gtsam/slam/pose2SLAM.h | 28 +- gtsam/slam/pose3SLAM.cpp | 32 +- gtsam/slam/pose3SLAM.h | 51 +- gtsam/slam/tests/testPose2SLAM.cpp | 8 +- gtsam/slam/tests/testPose3SLAM.cpp | 6 +- 15 files changed, 11221 insertions(+), 67 deletions(-) create mode 100644 examples/Data/sphere_smallnoise.graph create mode 100644 examples/matlab/Pose2SLAMExample_circle.m create mode 100644 examples/matlab/Pose3SLAMExample_circle.m create mode 100644 examples/matlab/Pose3SLAMExample_graph.m create mode 100644 examples/matlab/load3D.m diff --git a/examples/Data/sphere_smallnoise.graph b/examples/Data/sphere_smallnoise.graph new file mode 100644 index 000000000..121d73021 --- /dev/null +++ b/examples/Data/sphere_smallnoise.graph @@ -0,0 +1,10847 @@ +VERTEX3 0 18.7381 0 98.2287 0 -0 0 +VERTEX3 1 19.0431 1.63954 98.2211 -0.00241135 0.00245691 0.0227253 +VERTEX3 2 19.3024 1.46516 98.2348 -0.0073934 0.0114248 0.0385095 +VERTEX3 3 19.4696 1.22986 98.2737 -0.0101597 0.010242 0.0436139 +VERTEX3 4 19.697 0.303547 98.2997 -0.00852083 0.00885516 0.0545687 +VERTEX3 5 19.5789 -0.379743 98.3832 -0.00736082 0.0109028 0.0566972 +VERTEX3 6 19.328 -1.14383 98.4195 -0.0303184 0.00646135 0.0658667 +VERTEX3 7 19.0094 -1.9915 98.4898 -0.026699 0.00843884 0.0734272 +VERTEX3 8 18.7529 -2.8681 98.5345 -0.0313252 0.00411628 0.0715125 +VERTEX3 9 18.3629 -3.4453 98.5719 -0.0260115 -0.00323782 0.081969 +VERTEX3 10 18.0513 -3.8475 98.6776 -0.0318878 -0.000172174 0.0894192 +VERTEX3 11 17.54 -3.94508 98.7117 -0.0323191 -0.0056373 0.0985955 +VERTEX3 12 17.0645 -3.83338 98.7999 -0.0333963 -0.00697699 0.091581 +VERTEX3 13 16.4558 -3.45396 98.8986 -0.0231773 0.0104809 0.121622 +VERTEX3 14 15.9229 -2.86382 99.0857 -0.0268982 0.00209767 0.126171 +VERTEX3 15 15.1885 -2.10545 99.0647 -0.0253835 0.00266245 0.14307 +VERTEX3 16 14.5113 -1.23672 99.1655 -0.0243512 0.00633828 0.150758 +VERTEX3 17 13.8832 -0.242326 99.3399 -0.0233449 0.00963607 0.174731 +VERTEX3 18 13.2505 1.11904 99.4251 -0.0224392 0.00946535 0.187379 +VERTEX3 19 12.5924 2.43885 99.4403 -0.02154 0.0104606 0.193732 +VERTEX3 20 11.8083 3.98539 99.5278 -0.0201605 0.0122858 0.22571 +VERTEX3 21 10.9248 5.66426 99.5785 -0.0203364 0.0139431 0.241639 +VERTEX3 22 9.96621 7.48105 99.685 -0.0202533 0.0141297 0.267345 +VERTEX3 23 8.86717 9.44094 99.7319 -0.0217672 0.0209338 0.299055 +VERTEX3 24 7.84805 11.7304 99.7871 -0.0151343 0.0300637 0.335819 +VERTEX3 25 6.75298 14.1789 99.8258 -0.0222049 0.00977758 0.380242 +VERTEX3 26 6.66164 -11.3275 100.544 -0.0348774 0.0258583 -0.450329 +VERTEX3 27 8.18757 -9.18792 100.396 -0.0319172 0.0154049 -0.386265 +VERTEX3 28 9.8547 -7.01838 100.215 -0.0289861 0.0132436 -0.34143 +VERTEX3 29 11.3935 -5.0482 100.044 -0.0212305 0.00839623 -0.322697 +VERTEX3 30 12.8887 -3.21259 99.864 -0.0181839 0.00845826 -0.303685 +VERTEX3 31 14.3689 -1.41408 99.7661 -0.0176336 0.00986848 -0.275464 +VERTEX3 32 15.6414 0.131429 99.5676 -0.0171928 0.010443 -0.241435 +VERTEX3 33 16.9814 1.62681 99.3211 -0.0178572 0.00967744 -0.217815 +VERTEX3 34 18.1532 3.07372 99.1282 -0.0176445 0.00988235 -0.19267 +VERTEX3 35 19.2752 4.23291 98.9086 -0.0181049 0.0100056 -0.170796 +VERTEX3 36 20.4523 5.3459 98.6673 -0.0177775 0.0109792 -0.143551 +VERTEX3 37 21.5701 6.16994 98.4602 -0.0166439 0.0110263 -0.130014 +VERTEX3 38 22.4932 6.99136 98.2554 -0.016624 0.0116879 -0.12521 +VERTEX3 39 23.4018 7.51119 98.0431 -0.0151229 0.0108868 -0.104843 +VERTEX3 40 24.1576 7.91325 97.8702 -0.013317 0.0107001 -0.0771072 +VERTEX3 41 24.8414 8.17505 97.6836 -0.0130127 0.0103971 -0.0902155 +VERTEX3 42 25.3083 8.17358 97.6147 -0.0120062 0.0105253 -0.0876668 +VERTEX3 43 25.8319 7.8319 97.4666 -0.0104065 0.0103863 -0.0667465 +VERTEX3 44 26.0541 7.55701 97.3668 -0.00868694 0.010105 -0.0525759 +VERTEX3 45 26.2512 7.30886 97.1978 -0.00762366 0.0103282 -0.0394376 +VERTEX3 46 26.1181 6.93392 97.1105 -0.00625356 0.0107515 -0.0221595 +VERTEX3 47 25.7894 5.97876 96.9855 -0.00421194 0.0118785 -0.0301238 +VERTEX3 48 25.3781 5.17218 96.8359 -0.00231106 0.0104723 -0.0108145 +VERTEX3 49 24.9278 4.07306 96.8126 -0.00147794 0.0118428 0.00568265 +VERTEX3 50 24.5154 2.14705 96.8328 0.000531641 0.0143275 0.00362636 +VERTEX3 51 24.9377 1.71636 96.8362 0.000458836 0.00133284 0.00691283 +VERTEX3 52 25.2263 0.852695 96.8461 -0.00328711 0.00292652 0.0100214 +VERTEX3 53 25.4724 0.704763 96.9054 -0.00353908 0.00879119 0.0374325 +VERTEX3 54 25.5201 0.766064 96.9592 -0.0134706 0.00879055 0.0411312 +VERTEX3 55 25.4329 -1.02434 96.9932 -0.0129435 0.00717268 0.0351519 +VERTEX3 56 25.2581 -2.05662 97.0357 -0.0147605 0.00518744 0.0364517 +VERTEX3 57 24.9361 -2.49761 97.1333 -0.0304483 0.00695934 0.0539866 +VERTEX3 58 24.5629 -2.66456 97.1506 -0.0282838 0.00705871 0.054551 +VERTEX3 59 24.2557 -3.32287 97.2281 -0.0310153 0.00298143 0.0700066 +VERTEX3 60 23.8654 -3.91999 97.2572 -0.027892 -0.00326376 0.0776848 +VERTEX3 61 23.4823 -3.91511 97.3456 -0.027995 -0.000404544 0.0827778 +VERTEX3 62 22.9837 -3.98946 97.3927 -0.0241689 -0.00658063 0.0897529 +VERTEX3 63 22.4588 -3.4532 97.4894 -0.0290707 0.00270369 0.0966411 +VERTEX3 64 21.8303 -2.6535 97.5345 -0.0316777 0.00335803 0.111628 +VERTEX3 65 21.2376 -1.55993 97.6378 -0.027891 0.00573747 0.12521 +VERTEX3 66 20.5596 -0.558266 97.7363 -0.016786 0.00864771 0.156246 +VERTEX3 67 19.8838 0.541952 97.8151 -0.0238187 0.0158773 0.157195 +VERTEX3 68 19.1843 2.02178 97.8985 -0.0297446 0.00701025 0.173511 +VERTEX3 69 18.5 3.46906 97.919 -0.021413 0.00728889 0.184167 +VERTEX3 70 17.6533 5.20553 97.9837 -0.023219 0.0052847 0.215628 +VERTEX3 71 16.7926 7.04863 98.0052 -0.0182994 0.00419914 0.238596 +VERTEX3 72 15.7916 8.98756 98.0491 -0.0143915 0.0110095 0.264976 +VERTEX3 73 14.6901 11.1309 98.1062 -0.0198685 0.013208 0.304693 +VERTEX3 74 13.4447 13.2672 98.1198 -0.023077 0.0170768 0.325497 +VERTEX3 75 11.9119 16.6733 98.1357 -0.0175844 0.0136989 0.374549 +VERTEX3 76 11.6957 -14.2078 98.859 -0.0269731 0.0197359 -0.446859 +VERTEX3 77 13.7327 -11.1485 98.7505 -0.0276853 0.0148285 -0.370582 +VERTEX3 78 15.4114 -9.09654 98.5503 -0.0200776 0.00949301 -0.357439 +VERTEX3 79 17.0839 -6.9128 98.3455 -0.0139678 0.00307272 -0.315605 +VERTEX3 80 18.5805 -4.94485 98.2337 -0.0174116 0.00964099 -0.300458 +VERTEX3 81 20.0627 -3.09976 98.0757 -0.0159514 0.0117068 -0.261272 +VERTEX3 82 21.4325 -1.20975 97.832 -0.0178905 0.0105611 -0.241944 +VERTEX3 83 22.7292 0.565337 97.6548 -0.0172572 0.0118895 -0.206957 +VERTEX3 84 23.9359 2.11851 97.4518 -0.0157039 0.00783226 -0.186477 +VERTEX3 85 25.1764 3.49742 97.189 -0.0197331 0.0105972 -0.164414 +VERTEX3 86 26.2828 4.88098 96.9558 -0.0175524 0.00965658 -0.13204 +VERTEX3 87 27.3216 6.00114 96.7147 -0.0160848 0.0118506 -0.121016 +VERTEX3 88 28.2935 6.86364 96.5102 -0.0173208 0.010394 -0.110139 +VERTEX3 89 29.1403 7.16356 96.3462 -0.0141689 0.00981626 -0.0905138 +VERTEX3 90 29.93 7.63017 96.1377 -0.0130906 0.00872201 -0.0851961 +VERTEX3 91 30.5247 7.96979 95.9731 -0.0113708 0.0103857 -0.0723159 +VERTEX3 92 31.0742 8.17089 95.9158 -0.011943 0.0102842 -0.0651156 +VERTEX3 93 31.5137 8.1664 95.7869 -0.0091081 0.00909655 -0.0627943 +VERTEX3 94 31.8569 8.46609 95.6654 -0.00714208 0.00903537 -0.0265849 +VERTEX3 95 31.9899 8.68866 95.5586 -0.00858013 0.0108937 -0.0106073 +VERTEX3 96 31.8433 7.78904 95.4472 -0.00210287 0.00807332 -0.00423543 +VERTEX3 97 31.6484 7.33843 95.321 -0.00266957 0.00724898 -0.0107552 +VERTEX3 98 31.3174 7.02041 95.2156 -0.000103182 0.00818872 0.0215139 +VERTEX3 99 30.9799 5.58016 95.2658 0.000349446 0.0122205 0.0105508 +VERTEX3 100 30.4115 4.4518 95.1409 -0.00733057 0.0118369 0.00939817 +VERTEX3 101 31.0979 3.80369 95.1553 -0.00330977 0.0144393 0.0334789 +VERTEX3 102 31.1815 1.54179 95.1747 0.000276712 0.00101047 0.0115908 +VERTEX3 103 31.307 -0.132339 95.1948 -0.00455116 0.00420414 0.0027018 +VERTEX3 104 31.3521 -0.221947 95.2609 -0.00612114 0.00963425 0.0313164 +VERTEX3 105 31.2343 -0.960116 95.2491 -0.0114691 0.0109294 0.0370107 +VERTEX3 106 30.9344 -2.04778 95.3158 -0.0137909 0.00925146 0.0315664 +VERTEX3 107 30.7016 -3.44835 95.3832 -0.0199873 0.00289646 0.0229635 +VERTEX3 108 30.3169 -3.88218 95.4598 -0.0322434 0.00571897 0.0383342 +VERTEX3 109 29.9794 -3.29521 95.4485 -0.0300729 0.0057917 0.0578236 +VERTEX3 110 29.5992 -3.91519 95.54 -0.0309675 0.00416479 0.060503 +VERTEX3 111 29.1146 -3.95674 95.545 -0.0286037 -0.000682102 0.0780192 +VERTEX3 112 28.6817 -3.58002 95.6102 -0.025824 0.0064369 0.0829424 +VERTEX3 113 28.2494 -3.33123 95.6415 -0.0289705 0.00254784 0.0839666 +VERTEX3 114 27.6921 -2.98007 95.7282 -0.0236726 0.000599134 0.0919779 +VERTEX3 115 27.0235 -1.26194 95.7816 -0.0256379 0.0070606 0.123469 +VERTEX3 116 26.4697 -0.269902 95.8745 -0.0288758 0.00743495 0.128328 +VERTEX3 117 25.7676 1.22429 95.9507 -0.0215253 0.0157407 0.156737 +VERTEX3 118 25.0738 2.65035 95.9927 -0.0256493 0.0148382 0.158228 +VERTEX3 119 24.3393 4.21613 96.0715 -0.0225589 0.0051257 0.18621 +VERTEX3 120 23.518 6.19188 96.0795 -0.0215945 0.00899906 0.210802 +VERTEX3 121 22.5582 8.21755 96.0766 -0.0206737 0.00488189 0.229891 +VERTEX3 122 21.468 10.4341 96.1437 -0.0224599 0.0122417 0.267621 +VERTEX3 123 20.3043 12.5752 96.1509 -0.0161611 0.0149012 0.284652 +VERTEX3 124 18.9626 14.7846 96.1714 -0.0194037 0.0132889 0.303179 +VERTEX3 125 17.7327 15.057 96.1763 -0.0121755 0.0133191 0.291129 +VERTEX3 126 17.1526 -14.4063 96.8277 -0.0244446 0.00739059 -0.368134 +VERTEX3 127 18.9799 -13.1478 96.7234 -0.0182744 0.00846097 -0.365577 +VERTEX3 128 20.8783 -10.905 96.5543 -0.0195324 0.00681554 -0.345683 +VERTEX3 129 22.5703 -8.71185 96.3838 -0.0182961 0.00986199 -0.310825 +VERTEX3 130 24.1453 -6.56332 96.2322 -0.0148158 0.0120787 -0.292349 +VERTEX3 131 25.6768 -4.49152 96.034 -0.017234 0.0107222 -0.263094 +VERTEX3 132 27.0845 -2.39564 95.8279 -0.0189898 0.0116002 -0.229641 +VERTEX3 133 28.3672 -0.529281 95.5605 -0.0159257 0.00545177 -0.203712 +VERTEX3 134 29.6394 1.52757 95.3757 -0.0194406 0.0106727 -0.172636 +VERTEX3 135 30.8921 3.20772 95.1005 -0.0187285 0.00873204 -0.155577 +VERTEX3 136 31.9762 4.84145 94.8708 -0.0155924 0.011527 -0.127137 +VERTEX3 137 32.9662 5.77529 94.6296 -0.0189144 0.0102638 -0.113076 +VERTEX3 138 33.9099 6.41449 94.4373 -0.0153641 0.00850889 -0.107168 +VERTEX3 139 34.8426 7.01592 94.215 -0.0156515 0.00726808 -0.0929324 +VERTEX3 140 35.4118 7.76243 94.0772 -0.0111209 0.0105036 -0.0691761 +VERTEX3 141 36.1092 8.18389 93.9663 -0.0132564 0.00993041 -0.0643384 +VERTEX3 142 36.6721 8.16846 93.8224 -0.00966773 0.0073055 -0.0645549 +VERTEX3 143 37.1581 9.29979 93.7426 -0.00839045 0.00836085 -0.0377757 +VERTEX3 144 37.5831 9.60526 93.6417 -0.0104634 0.00997669 -0.00324379 +VERTEX3 145 37.558 9.0258 93.5309 -0.00216952 0.0070321 -0.0048974 +VERTEX3 146 37.5242 8.54219 93.4052 -0.00327091 0.0036437 -0.00883219 +VERTEX3 147 37.4954 8.30516 93.3466 -0.00166914 0.00646641 0.00728159 +VERTEX3 148 37.2607 7.40863 93.3253 -0.00259922 0.0103178 0.00037836 +VERTEX3 149 36.8616 6.01074 93.2331 -0.00632169 0.0126778 0.00435345 +VERTEX3 150 36.2678 5.53456 93.0843 -0.025248 0.00346207 0.00809319 +VERTEX3 151 36.8649 5.02302 93.1417 -0.00972696 0.0106343 0.0258219 +VERTEX3 152 37.156 3.91249 93.1654 -0.00281496 0.0118514 0.031775 +VERTEX3 153 37.1018 0.890491 93.184 -0.00110979 0.00186807 0.0190227 +VERTEX3 154 37.0254 -0.689558 93.113 -0.00858903 0.00695249 0.0175215 +VERTEX3 155 36.8031 -2.01294 93.183 -0.0139687 0.000688787 0.0221209 +VERTEX3 156 36.6302 -1.6406 93.1629 -0.0233927 0.00397166 0.043387 +VERTEX3 157 36.2216 -3.60523 93.2734 -0.0168067 0.00770949 0.0206717 +VERTEX3 158 35.9986 -4.96612 93.368 -0.0259719 0.00259378 0.0175894 +VERTEX3 159 35.5304 -4.92109 93.3916 -0.0322047 0.00599191 0.0314009 +VERTEX3 160 35.1197 -3.51701 93.3557 -0.0328336 0.00522108 0.0724699 +VERTEX3 161 34.6663 -3.60332 93.362 -0.0319687 0.00795682 0.0671392 +VERTEX3 162 34.1193 -3.22954 93.3979 -0.0291492 0.00250004 0.076752 +VERTEX3 163 33.7626 -3.57626 93.4619 -0.0230928 0.00341402 0.070179 +VERTEX3 164 33.3681 -3.44988 93.5474 -0.0327331 0.00721935 0.0753668 +VERTEX3 165 32.7966 -2.15741 93.5858 -0.021467 0.00551433 0.088741 +VERTEX3 166 32.1991 -0.331191 93.6497 -0.0238498 0.0132423 0.12405 +VERTEX3 167 31.5715 1.10197 93.6873 -0.0294406 0.00889597 0.130206 +VERTEX3 168 30.8228 2.95316 93.7561 -0.0331277 0.0155968 0.149866 +VERTEX3 169 30.0489 4.81832 93.7601 -0.023877 0.0108186 0.178418 +VERTEX3 170 29.1668 7.09719 93.8701 -0.0163594 0.0175811 0.211058 +VERTEX3 171 28.1379 9.44028 93.8253 -0.0170904 0.017475 0.231264 +VERTEX3 172 27.0585 11.7551 93.8225 -0.0214148 0.00783437 0.255882 +VERTEX3 173 25.7636 14.2517 93.8684 -0.0189599 0.00771667 0.289402 +VERTEX3 174 24.3318 16.7325 93.7969 -0.00964824 0.0111545 0.306263 +VERTEX3 175 22.528 18.6209 93.7871 -0.0185982 0.0150742 0.328539 +VERTEX3 176 22.0456 -16.1705 94.5646 -0.018547 0.00816572 -0.34854 +VERTEX3 177 24.1531 -15.3887 94.4134 -0.0144201 0.00617665 -0.363904 +VERTEX3 178 26.1557 -12.9154 94.2797 -0.0180697 0.00793879 -0.338244 +VERTEX3 179 27.9325 -10.4569 94.0593 -0.0153478 0.0108136 -0.311328 +VERTEX3 180 29.5587 -8.02761 93.8519 -0.017022 0.0102683 -0.28203 +VERTEX3 181 31.1671 -5.39307 93.6011 -0.0209 0.012699 -0.248507 +VERTEX3 182 32.5488 -3.22304 93.4257 -0.0147168 0.00551401 -0.217202 +VERTEX3 183 33.853 -1.16682 93.1889 -0.0208794 0.0103585 -0.196666 +VERTEX3 184 35.1658 0.923973 92.9078 -0.0191762 0.00758819 -0.173286 +VERTEX3 185 36.3775 2.80367 92.6915 -0.0152731 0.0106402 -0.147626 +VERTEX3 186 37.4885 4.62995 92.4578 -0.0198137 0.0102643 -0.12416 +VERTEX3 187 38.4413 5.93657 92.2114 -0.0147303 0.0101725 -0.100396 +VERTEX3 188 39.3406 6.37862 91.9725 -0.0163142 0.00634806 -0.090481 +VERTEX3 189 40.115 7.2008 91.8244 -0.0113768 0.0090775 -0.0817062 +VERTEX3 190 40.8237 7.9458 91.672 -0.0139457 0.0095102 -0.0662515 +VERTEX3 191 41.4888 8.65839 91.5238 -0.0102748 0.0069031 -0.0580508 +VERTEX3 192 42.1019 9.88137 91.4392 -0.00926486 0.00764163 -0.0383765 +VERTEX3 193 42.7271 10.646 91.3311 -0.011681 0.00869893 -0.00486813 +VERTEX3 194 42.9601 9.6259 91.2596 -0.00574842 0.00831312 -0.0262822 +VERTEX3 195 42.9607 9.48173 91.1788 -0.00767549 0.00149152 -0.00738801 +VERTEX3 196 43.2733 8.99865 91.1021 -0.00179586 0.00463512 -0.0180911 +VERTEX3 197 43.3865 7.73204 91.0724 -0.00351333 0.00700084 -0.016824 +VERTEX3 198 43.2091 6.72635 90.9602 -0.00804303 0.0101448 -0.0175351 +VERTEX3 199 42.6864 6.06131 90.9231 -0.0204641 0.00211402 -0.00958039 +VERTEX3 200 42.0493 5.98768 90.8281 -0.0258122 -0.00352534 0.0112084 +VERTEX3 201 42.4448 6.11614 90.7872 -0.0209057 0.000244279 0.0348737 +VERTEX3 202 42.7911 6.08794 90.7698 -0.00996632 0.00951632 0.0411544 +VERTEX3 203 42.8355 3.80596 90.7647 -0.00473647 0.0111743 0.0493289 +VERTEX3 204 42.4877 -0.613564 90.7466 -0.00207197 0.00168505 0.0260488 +VERTEX3 205 42.1735 -3.02592 90.7744 -0.00872064 0.00756572 0.00354301 +VERTEX3 206 41.9967 -2.6619 90.8262 -0.00747492 0.013584 0.0266514 +VERTEX3 207 41.6952 -2.96483 90.8084 -0.0164887 0.0101264 0.0320374 +VERTEX3 208 41.2774 -4.70711 90.8524 -0.0144553 0.0113441 0.024693 +VERTEX3 209 40.9951 -5.86584 90.8993 -0.026856 0.00487047 0.0138285 +VERTEX3 210 40.3822 -4.55055 90.9268 -0.0301713 0.00669348 0.0428715 +VERTEX3 211 39.9516 -4.02476 90.8042 -0.0374017 0.00495706 0.0550349 +VERTEX3 212 39.5094 -3.76336 90.9046 -0.0313426 0.010312 0.0628488 +VERTEX3 213 39.0044 -2.67473 90.8721 -0.0239327 0.00224738 0.0718391 +VERTEX3 214 38.7381 -3.37271 90.9461 -0.028035 0.00291263 0.0751641 +VERTEX3 215 38.2876 -2.55936 91.0295 -0.0314697 0.0106547 0.0793077 +VERTEX3 216 37.6925 -1.16076 91.0717 -0.0155103 0.0131703 0.0989161 +VERTEX3 217 37.1588 0.55877 91.0731 -0.0257954 0.00647873 0.116135 +VERTEX3 218 36.3131 3.30824 91.126 -0.0252985 0.0122561 0.146996 +VERTEX3 219 35.5933 5.1726 91.1751 -0.0256257 0.016561 0.171313 +VERTEX3 220 34.7089 7.3932 91.1708 -0.0223948 0.0189361 0.196181 +VERTEX3 221 33.7794 9.62474 91.2488 -0.0198814 0.0174494 0.206621 +VERTEX3 222 32.585 12.7319 91.1972 -0.0171336 0.00606898 0.257863 +VERTEX3 223 31.1626 15.7521 91.1704 -0.0112738 0.0181165 0.288665 +VERTEX3 224 29.5695 18.9818 91.1538 -0.0157337 0.0101569 0.323906 +VERTEX3 225 27.184 24.4568 91.046 -0.00731085 0.0265293 0.398136 +VERTEX3 226 26.2692 -23.1299 92.0767 -0.0165918 -0.0018507 -0.429514 +VERTEX3 227 29.1756 -17.9157 91.8177 -0.0200508 0.0064862 -0.3658 +VERTEX3 228 31.3558 -14.597 91.6035 -0.0151194 0.0084496 -0.328375 +VERTEX3 229 33.2601 -11.7451 91.3588 -0.0190942 0.0106214 -0.295442 +VERTEX3 230 34.9307 -8.65991 91.0775 -0.0178334 0.0124084 -0.256464 +VERTEX3 231 36.4247 -6.4145 90.8897 -0.0156864 0.0101529 -0.23383 +VERTEX3 232 37.8846 -3.58911 90.7159 -0.0212188 0.00970111 -0.2043 +VERTEX3 233 39.1733 -1.60256 90.4066 -0.0196651 0.00785152 -0.188822 +VERTEX3 234 40.527 1.83738 90.1429 -0.0152096 0.0108924 -0.146622 +VERTEX3 235 41.6245 3.59952 89.8858 -0.0198035 0.0101814 -0.119802 +VERTEX3 236 42.6213 5.48164 89.6239 -0.0156348 0.0102529 -0.0983248 +VERTEX3 237 43.6469 5.18 89.4398 -0.0172803 0.00740659 -0.115 +VERTEX3 238 44.3539 5.63772 89.219 -0.0127776 0.00739459 -0.102402 +VERTEX3 239 45.193 7.45937 89.0758 -0.0140002 0.00722082 -0.0792281 +VERTEX3 240 45.9657 8.16232 88.9261 -0.0118492 0.00476766 -0.0623407 +VERTEX3 241 46.6868 9.45313 88.8168 -0.0111335 0.00704082 -0.052036 +VERTEX3 242 47.4476 11.2507 88.6801 -0.0107415 0.00913278 -0.0185667 +VERTEX3 243 47.8529 9.80544 88.6305 -0.00842304 0.00836716 -0.0337021 +VERTEX3 244 48.1177 9.77475 88.5366 -0.00311681 -0.00104574 -0.031711 +VERTEX3 245 48.546 9.33722 88.4759 -0.000639106 0.00427005 -0.0353251 +VERTEX3 246 49.0739 8.43625 88.5279 -0.00176567 0.00596916 -0.0318445 +VERTEX3 247 49.0006 7.60564 88.3814 -0.00776272 0.0116327 -0.0325183 +VERTEX3 248 48.7965 6.82653 88.3341 -0.0161005 0.00841758 -0.0235092 +VERTEX3 249 48.3504 6.38894 88.2829 -0.0216175 0.00343137 -0.00267015 +VERTEX3 250 47.7871 6.90949 88.2467 -0.0170413 -0.00771353 0.0237798 +VERTEX3 251 47.824 6.53193 88.1284 -0.018816 -0.00590621 0.0290749 +VERTEX3 252 48.1577 7.97313 88.0506 -0.0156694 -0.00400866 0.0599835 +VERTEX3 253 48.206 6.72145 88.0359 -0.0120049 0.00766364 0.0603658 +VERTEX3 254 47.983 3.47606 88.028 -0.00564696 0.00991443 0.0617474 +VERTEX3 255 47.4745 -1.53616 88.0254 -0.0031495 0.00124759 0.0334062 +VERTEX3 256 47.1206 -3.4936 88.0047 -0.0126309 0.00894819 0.014046 +VERTEX3 257 46.7981 -3.55168 88.0596 -0.0136643 0.00730151 0.0207311 +VERTEX3 258 46.4821 -3.60253 87.9682 -0.0240055 0.0033672 0.0338751 +VERTEX3 259 45.8736 -6.99354 88.0368 -0.0240007 0.00217524 0.00142332 +VERTEX3 260 45.5624 -6.63014 88.0454 -0.0324391 0.00563522 0.00849053 +VERTEX3 261 45.0402 -5.54552 88.0795 -0.0314893 0.00899855 0.0424069 +VERTEX3 262 44.6278 -3.61351 87.981 -0.0365982 0.00364569 0.0623058 +VERTEX3 263 44.1384 -3.31822 88.0574 -0.0300874 0.0110131 0.0666091 +VERTEX3 264 43.7273 -2.04614 88.0062 -0.0234442 0.00720599 0.0856983 +VERTEX3 265 43.4595 -2.36662 88.0767 -0.0297064 0.00953527 0.0898884 +VERTEX3 266 42.9 -1.40723 88.1179 -0.0221175 0.00501959 0.0886559 +VERTEX3 267 42.2881 0.461852 88.1295 -0.0209767 0.0106945 0.115893 +VERTEX3 268 41.7794 1.92878 88.1921 -0.0274977 0.0118375 0.113074 +VERTEX3 269 40.8137 5.60694 88.1643 -0.0228177 0.0163788 0.157891 +VERTEX3 270 40.1614 7.34311 88.2539 -0.0210596 0.0203325 0.179144 +VERTEX3 271 38.9845 10.2915 88.2206 -0.020733 0.0216654 0.217714 +VERTEX3 272 37.9525 12.8701 88.269 -0.0199978 0.0136043 0.226518 +VERTEX3 273 36.4547 16.8091 88.1799 -0.0151305 0.00852438 0.282264 +VERTEX3 274 34.8469 20.6579 88.1273 -0.00912609 0.0226782 0.323818 +VERTEX3 275 32.9775 25.5154 88.0767 -0.0152005 0.0214195 0.382066 +VERTEX3 276 31.8114 -24.4822 89.0724 -0.0207859 -0.0106072 -0.421882 +VERTEX3 277 34.3552 -19.8472 88.8562 -0.0178365 0.00693785 -0.364299 +VERTEX3 278 36.4165 -16.2755 88.6063 -0.0211672 0.00863163 -0.322221 +VERTEX3 279 38.4511 -12.3619 88.3403 -0.0153426 0.0126034 -0.267863 +VERTEX3 280 40.0787 -9.4811 88.0625 -0.0160568 0.0135352 -0.24923 +VERTEX3 281 41.5946 -6.67104 87.8032 -0.0208137 0.00863237 -0.213 +VERTEX3 282 42.8998 -4.4716 87.5928 -0.0205152 0.00798031 -0.206696 +VERTEX3 283 44.4531 0.0878576 87.2821 -0.0157226 0.0116036 -0.155897 +VERTEX3 284 45.4809 2.35727 87.0229 -0.0187623 0.0091144 -0.122535 +VERTEX3 285 46.5344 3.7684 86.7867 -0.0180181 0.0100143 -0.113321 +VERTEX3 286 47.5569 4.70341 86.5341 -0.0146926 0.00886279 -0.100293 +VERTEX3 287 48.295 4.73445 86.3357 -0.0143244 0.00603333 -0.119497 +VERTEX3 288 49.2738 6.86687 86.1393 -0.0126632 0.00531304 -0.0843809 +VERTEX3 289 50.0691 7.38357 85.9993 -0.0153552 0.00386585 -0.086006 +VERTEX3 290 50.926 9.37286 85.8536 -0.00861199 0.00569045 -0.0454257 +VERTEX3 291 51.7816 11.3144 85.743 -0.0136382 0.00460322 -0.0201641 +VERTEX3 292 52.2021 10.8973 85.6603 -0.00808742 0.00633879 -0.0291576 +VERTEX3 293 52.6698 9.74307 85.5788 -0.00121572 -0.000323863 -0.0523786 +VERTEX3 294 53.3129 9.52836 85.504 -0.00182236 0.00313452 -0.0383241 +VERTEX3 295 54.2103 8.85963 85.5466 0.00376076 -0.00204448 -0.0545593 +VERTEX3 296 54.2246 8.72837 85.3804 -0.00429423 0.012428 -0.0454551 +VERTEX3 297 54.4387 6.78057 85.5171 -0.00753946 0.00434939 -0.0518757 +VERTEX3 298 54.2998 7.04302 85.3524 -0.0187441 0.00983161 -0.0224887 +VERTEX3 299 54.0027 7.02312 85.2707 -0.0173609 -0.00212601 -0.00385293 +VERTEX3 300 52.8618 7.30162 85.3291 -0.0116664 -0.00128202 0.0409096 +VERTEX3 301 53.3034 9.25705 85.1346 -0.0156878 -0.00665091 0.0512054 +VERTEX3 302 53.3246 8.21382 85.0182 -0.0199737 -0.00272629 0.0475818 +VERTEX3 303 53.3511 10.1293 84.9859 -0.0146764 -0.00497814 0.0826852 +VERTEX3 304 53.0751 6.64083 84.946 -0.0086387 0.00520841 0.0732263 +VERTEX3 305 52.4531 3.13363 84.9037 -0.0054137 0.00787717 0.0695493 +VERTEX3 306 52.0876 -0.729835 84.8932 -0.00506627 0.00401312 0.042684 +VERTEX3 307 51.6691 -2.72039 84.876 -0.0174581 0.0117496 0.027297 +VERTEX3 308 51.2524 -4.15717 84.9218 -0.0132013 0.0104503 0.0220666 +VERTEX3 309 50.7469 -5.44227 84.8149 -0.0137358 0.00653209 0.0215345 +VERTEX3 310 50.3575 -6.98886 84.8543 -0.0206327 0.00824173 0.014389 +VERTEX3 311 50.0203 -6.65409 84.8605 -0.0281371 0.0094832 0.027194 +VERTEX3 312 49.3769 -5.18728 84.9156 -0.0316749 0.0074292 0.045931 +VERTEX3 313 48.9674 -3.31332 84.8429 -0.0366243 0.00563657 0.0666582 +VERTEX3 314 48.5642 -3.1944 84.8788 -0.0284662 0.0134263 0.0758405 +VERTEX3 315 48.113 -1.69834 84.8628 -0.0258907 0.00783621 0.086462 +VERTEX3 316 47.7699 -1.08922 84.8297 -0.0218239 0.0111825 0.0950321 +VERTEX3 317 47.0809 0.590193 84.8725 -0.0200756 0.012399 0.112768 +VERTEX3 318 46.5662 1.65136 84.9038 -0.0158028 0.0164964 0.117043 +VERTEX3 319 45.9541 4.42236 84.8937 -0.0222877 0.0182376 0.139208 +VERTEX3 320 44.8932 8.18537 84.9635 -0.0153056 0.0150618 0.192615 +VERTEX3 321 44.0435 10.2362 84.9762 -0.0189525 0.0164869 0.202367 +VERTEX3 322 42.8151 13.4608 84.9007 -0.0172332 0.0147029 0.231354 +VERTEX3 323 41.5681 17.1238 84.929 -0.0154683 0.0163099 0.263481 +VERTEX3 324 40.1139 21.0238 84.8345 -0.0141852 0.0141372 0.306749 +VERTEX3 325 38.7583 24.8025 84.8342 0.00172569 0.0143736 0.327956 +VERTEX3 326 37.4356 -24.1681 85.7029 -0.019998 0.00812255 -0.374158 +VERTEX3 327 39.2963 -20.9927 85.5285 -0.0200141 0.00574686 -0.356102 +VERTEX3 328 41.5697 -16.6116 85.2656 -0.0147631 0.0134988 -0.297473 +VERTEX3 329 43.2697 -13.2526 84.9794 -0.0185111 0.0141511 -0.269271 +VERTEX3 330 44.9139 -9.87548 84.6988 -0.0222706 0.00925746 -0.235988 +VERTEX3 331 46.3226 -7.19546 84.4035 -0.0204193 0.00767958 -0.210845 +VERTEX3 332 47.9028 -3.30338 84.1409 -0.0178905 0.0120887 -0.18323 +VERTEX3 333 49.1575 -0.22443 83.8875 -0.0195495 0.00726769 -0.14888 +VERTEX3 334 50.063 1.78881 83.63 -0.0186805 0.0109868 -0.127296 +VERTEX3 335 51.1095 2.72229 83.3944 -0.0188865 0.0102934 -0.137589 +VERTEX3 336 52.089 4.1104 83.1479 -0.014415 0.00504187 -0.11476 +VERTEX3 337 52.8928 5.96989 82.9416 -0.0110425 0.00360222 -0.0912912 +VERTEX3 338 53.8174 6.44283 82.7694 -0.0175414 0.00429366 -0.0982823 +VERTEX3 339 54.7318 8.69066 82.6567 -0.0117662 0.00214116 -0.0639128 +VERTEX3 340 55.8435 10.6476 82.4755 -0.0121865 0.00416663 -0.0405144 +VERTEX3 341 56.2612 10.8325 82.4013 -0.0110964 0.00370072 -0.0441374 +VERTEX3 342 56.7024 11.7892 82.3315 -0.0055979 -0.0133948 -0.0331851 +VERTEX3 343 57.6866 11.8022 82.2553 -0.00158032 0.00079952 -0.0477242 +VERTEX3 344 58.6795 11.0363 82.3082 -0.00508068 -0.00147263 -0.0478878 +VERTEX3 345 58.983 8.77299 82.0856 -0.00234426 0.0165918 -0.0708636 +VERTEX3 346 59.54 6.69726 82.2711 -0.000337434 0.00525307 -0.0782234 +VERTEX3 347 59.6479 6.94175 82.0872 -0.0139771 0.0155834 -0.0521094 +VERTEX3 348 59.7066 7.56812 81.9907 -0.0162841 0.0030676 -0.0421693 +VERTEX3 349 59.0705 7.3607 81.8676 -0.0125108 0.0041549 0.00499556 +VERTEX3 350 58.1547 8.1463 82.0428 -0.000236845 0.0155917 0.0328911 +VERTEX3 351 58.3742 9.72465 81.9437 -0.0100658 0.00673074 0.0640865 +VERTEX3 352 58.5366 11.4676 81.6841 -0.0158302 -0.00443173 0.0753584 +VERTEX3 353 58.3357 10.7552 81.5708 -0.00921954 -0.00852275 0.0667829 +VERTEX3 354 57.9462 12.3776 81.5456 -0.0116313 -0.0061721 0.102174 +VERTEX3 355 57.4719 6.72108 81.5696 -0.00489903 0.00306231 0.0857961 +VERTEX3 356 57.0042 3.03386 81.4331 -0.00563327 0.00684218 0.0850879 +VERTEX3 357 55.9318 -3.89106 81.3852 -0.00757423 -0.00351823 0.0443944 +VERTEX3 358 55.5448 -5.1348 81.309 -0.017091 0.0103967 0.0151922 +VERTEX3 359 55.3969 -5.71786 81.4475 -0.0181324 0.0078429 0.0216881 +VERTEX3 360 54.9072 -6.07489 81.2901 -0.0186981 0.00694225 0.026996 +VERTEX3 361 54.3739 -7.54876 81.3603 -0.0282531 0.00504636 0.0135742 +VERTEX3 362 54.1162 -6.44117 81.3426 -0.0328252 0.0103752 0.0231513 +VERTEX3 363 53.5158 -5.70248 81.4541 -0.0343553 0.00641285 0.0328333 +VERTEX3 364 53.2078 -4.38531 81.3757 -0.0297427 0.00629165 0.0506519 +VERTEX3 365 52.6304 -3.15572 81.3745 -0.029218 0.013395 0.0623224 +VERTEX3 366 52.2156 -1.88586 81.2298 -0.0249024 0.00709789 0.0790467 +VERTEX3 367 51.684 0.549144 81.2707 -0.0190287 0.0163713 0.115265 +VERTEX3 368 51.1786 0.970172 81.3096 -0.0129235 0.016258 0.0997907 +VERTEX3 369 50.3472 3.49006 81.391 -0.0127545 0.0205797 0.134406 +VERTEX3 370 49.621 6.97447 81.3749 -0.0148 0.0140277 0.167097 +VERTEX3 371 48.7966 10.0152 81.3977 -0.0171923 0.0166634 0.182617 +VERTEX3 372 47.5875 13.4739 81.3188 -0.0169172 0.0183232 0.218401 +VERTEX3 373 46.417 16.9998 81.2888 -0.0105419 0.023786 0.243675 +VERTEX3 374 44.939 21.0269 81.2546 -0.0137017 0.0159969 0.294126 +VERTEX3 375 43.6791 24.505 81.1854 -0.00437607 0.0187288 0.292194 +VERTEX3 376 41.9694 -25.0616 82.1798 -0.0210245 0.00640811 -0.359642 +VERTEX3 377 44.0151 -21.5049 81.9306 -0.0190587 0.0128252 -0.335569 +VERTEX3 378 45.9619 -17.6826 81.6263 -0.0185916 0.0116823 -0.288727 +VERTEX3 379 47.6576 -14.2809 81.3545 -0.025934 0.00997016 -0.268326 +VERTEX3 380 49.4102 -10.3341 81.0027 -0.0220898 0.00647798 -0.230215 +VERTEX3 381 51.0296 -6.20303 80.7 -0.0191605 0.0125317 -0.188826 +VERTEX3 382 52.3145 -2.87997 80.3809 -0.0206769 0.00785875 -0.173006 +VERTEX3 383 53.4673 0.821883 80.1324 -0.0155493 0.0143461 -0.114181 +VERTEX3 384 54.5058 1.82858 79.8804 -0.0162972 0.0114383 -0.124281 +VERTEX3 385 55.3058 3.84338 79.6655 -0.0144553 0.00483867 -0.103282 +VERTEX3 386 56.2798 6.32554 79.3828 -0.00743437 0.00321532 -0.077218 +VERTEX3 387 57.3306 6.14706 79.1968 -0.0156265 0.00266835 -0.0884776 +VERTEX3 388 58.0121 9.68045 79.0663 -0.0102521 0.00578961 -0.0510542 +VERTEX3 389 59.272 9.13286 78.9185 -0.0120131 0.00126654 -0.0605636 +VERTEX3 390 59.6225 10.1016 78.8271 -0.012715 1.00557e-05 -0.0582124 +VERTEX3 391 60.4181 11.9598 78.7649 -0.00950182 -0.0149355 -0.0452632 +VERTEX3 392 61.2478 11.8081 78.6518 -0.00242329 -0.00284914 -0.0498899 +VERTEX3 393 62.9509 9.30021 78.781 0.000996058 -0.00386947 -0.0744884 +VERTEX3 394 63.4689 6.96376 78.6417 0.00126054 -0.00504597 -0.102857 +VERTEX3 395 64.1598 6.02072 78.7593 0.00327825 0.00595128 -0.10115 +VERTEX3 396 64.5278 6.66364 78.5252 -0.00850405 0.0197559 -0.0880397 +VERTEX3 397 64.8457 7.40588 78.3969 -0.0164645 0.00942504 -0.0665152 +VERTEX3 398 64.643 7.3492 78.2605 -0.0173933 0.00716967 -0.0324846 +VERTEX3 399 64.2652 8.69175 78.2816 -0.00462239 0.0144421 0.00182276 +VERTEX3 400 63.2982 9.63682 78.3163 -0.000956363 0.0228255 0.0570765 +VERTEX3 401 63.4008 11.0172 78.1972 -0.00625819 0.0100715 0.0688494 +VERTEX3 402 63.3129 12.7229 78.1096 -0.00877722 0.00556811 0.0859024 +VERTEX3 403 63.0141 12.4707 77.9192 -0.00782167 -0.00958918 0.088706 +VERTEX3 404 62.71 12.0261 77.7899 -0.00998784 -0.00778121 0.0910458 +VERTEX3 405 62.2395 12.9419 77.8394 -0.0029998 -0.0152832 0.122142 +VERTEX3 406 61.6289 9.24046 77.8222 -0.0140223 0.00048557 0.117079 +VERTEX3 407 61.247 6.5719 77.6658 -0.00712804 0.00799585 0.115447 +VERTEX3 408 59.9707 -2.5706 77.7526 -0.0105768 -0.00201727 0.0619532 +VERTEX3 409 59.2641 -6.26597 77.4844 -0.0178507 0.0101053 0.0134197 +VERTEX3 410 59.1501 -6.83826 77.6469 -0.0301172 0.000881152 0.0234388 +VERTEX3 411 58.6923 -5.64551 77.4318 -0.0132619 0.0130986 0.0322892 +VERTEX3 412 58.3319 -5.63062 77.5053 -0.0255062 0.00908024 0.0390824 +VERTEX3 413 58.0218 -4.23643 77.5295 -0.0296689 0.0124983 0.0583346 +VERTEX3 414 57.3359 -5.28592 77.6532 -0.0338433 0.0088794 0.0346287 +VERTEX3 415 56.9738 -2.72338 77.4893 -0.0265633 0.00939769 0.0631637 +VERTEX3 416 56.4299 -2.85433 77.4708 -0.0300276 0.0143169 0.0631664 +VERTEX3 417 55.8671 -0.802812 77.3925 -0.0255527 0.00935022 0.0860371 +VERTEX3 418 55.215 1.85593 77.3817 -0.0170959 0.0131833 0.115508 +VERTEX3 419 54.8615 1.75589 77.4867 -0.0113912 0.0238497 0.102179 +VERTEX3 420 54.0147 5.02775 77.4698 -0.0131635 0.0177119 0.140952 +VERTEX3 421 53.1925 8.64852 77.4829 -0.0228566 0.0176436 0.164332 +VERTEX3 422 51.9769 13.3908 77.4736 -0.0146001 0.0165344 0.207288 +VERTEX3 423 50.6549 17.0366 77.464 -0.0136697 0.0235943 0.234901 +VERTEX3 424 49.4907 20.206 77.3083 -0.0147383 0.0135959 0.261982 +VERTEX3 425 47.9159 25.3051 77.3561 -0.00585661 0.0179526 0.31106 +VERTEX3 426 45.8921 -27.0224 78.2493 -0.028661 0.00947968 -0.381061 +VERTEX3 427 48.2103 -22.0819 77.9499 -0.0182368 0.00799805 -0.314946 +VERTEX3 428 50.3988 -17.652 77.6974 -0.0291636 0.0103978 -0.283802 +VERTEX3 429 51.8576 -14.5857 77.3425 -0.0237484 0.00572123 -0.252586 +VERTEX3 430 53.8299 -8.95697 76.9689 -0.0197983 0.012415 -0.20116 +VERTEX3 431 55.1967 -5.56211 76.6667 -0.0217975 0.00800023 -0.173298 +VERTEX3 432 56.384 -3.1187 76.4018 -0.0183685 0.01166 -0.156683 +VERTEX3 433 57.3447 -1.67049 76.167 -0.0209109 0.0118942 -0.158124 +VERTEX3 434 58.4074 1.42038 75.9104 -0.0165197 0.00450599 -0.11794 +VERTEX3 435 59.2853 4.4271 75.7066 -0.00656003 0.00621908 -0.0963727 +VERTEX3 436 60.4693 5.41208 75.4647 -0.0137325 0.00273594 -0.0956792 +VERTEX3 437 61.1156 9.12959 75.2207 -0.0110223 0.00526189 -0.0611246 +VERTEX3 438 62.3196 7.701 75.0428 -0.0137894 0.00236249 -0.0882388 +VERTEX3 439 62.6771 10.5194 74.9931 -0.0143716 -0.00142506 -0.056913 +VERTEX3 440 63.3276 13.4347 74.7971 -0.00912592 -0.0205888 -0.0391359 +VERTEX3 441 64.439 13.2635 74.7299 -0.00223452 -0.0108832 -0.0490566 +VERTEX3 442 66.4676 10.0728 74.9514 0.00344393 -0.00708555 -0.0963595 +VERTEX3 443 67.173 7.09337 74.8281 0.00496153 0.0127804 -0.121559 +VERTEX3 444 68.1252 4.34066 74.9595 0.0191388 0.00531332 -0.148547 +VERTEX3 445 68.94 5.07015 74.6995 -0.0027131 0.0226251 -0.122104 +VERTEX3 446 69.4435 7.30718 74.5579 -0.016048 0.0156949 -0.0956836 +VERTEX3 447 69.5651 6.25942 74.4611 -0.0185344 0.00888102 -0.0749965 +VERTEX3 448 69.6689 8.22666 74.3786 -0.00873363 0.0137603 -0.0414374 +VERTEX3 449 69.1043 9.39205 74.2189 -0.001218 0.0147728 0.0102962 +VERTEX3 450 68.4241 11.237 74.1527 -0.0210666 0.0223965 0.0697487 +VERTEX3 451 68.2765 13.6974 74.0308 -0.00345937 0.0143825 0.0836464 +VERTEX3 452 68.0955 15.1976 74.0536 -0.0147625 0.00592209 0.0987413 +VERTEX3 453 67.7231 15.97 73.9494 -0.00649374 0.00328026 0.108612 +VERTEX3 454 67.242 15.8636 73.8615 -0.00699582 -0.0101478 0.106043 +VERTEX3 455 66.7489 14.4718 73.767 -0.00675332 -0.0143118 0.110757 +VERTEX3 456 65.9155 16.441 73.765 -0.00543522 -0.0147423 0.142279 +VERTEX3 457 65.4664 11.7671 73.7269 -0.015879 -0.000361369 0.13612 +VERTEX3 458 64.7075 6.73981 73.5793 -0.00717743 0.00802261 0.13491 +VERTEX3 459 63.3232 -1.53533 73.5323 -0.0119245 0.00415147 0.0888973 +VERTEX3 460 63.332 -3.50054 73.2627 -0.0252262 0.0165114 0.0582553 +VERTEX3 461 63.0084 -2.70223 73.4545 -0.02263 0.0170142 0.0600761 +VERTEX3 462 62.511 -3.42772 73.2389 -0.0277893 0.0154091 0.0558396 +VERTEX3 463 61.8677 -3.72763 73.3972 -0.024564 0.00937038 0.0600196 +VERTEX3 464 61.3435 -1.10094 73.2903 -0.0251617 0.0114812 0.0935594 +VERTEX3 465 60.6994 -3.99231 73.5258 -0.0350107 0.0127011 0.0565168 +VERTEX3 466 60.2898 -1.30918 73.2557 -0.0245449 0.016124 0.0908228 +VERTEX3 467 59.6986 -1.97127 73.3598 -0.0302134 0.0154029 0.077648 +VERTEX3 468 59.1139 1.59609 73.1751 -0.024592 0.0167363 0.113077 +VERTEX3 469 58.5795 2.41601 73.2331 -0.0185944 0.0106954 0.104467 +VERTEX3 470 57.9173 4.92057 73.4016 -0.0235468 0.018602 0.14382 +VERTEX3 471 57.1765 6.88811 73.3298 -0.01219 0.0209868 0.146249 +VERTEX3 472 55.9428 11.8582 73.3021 -0.0144801 0.0171955 0.179662 +VERTEX3 473 54.9287 15.6549 73.2984 -0.0163535 0.0172499 0.209187 +VERTEX3 474 53.5001 19.7125 73.2763 -0.0112309 0.0224411 0.246531 +VERTEX3 475 51.8058 24.6228 73.2482 -0.0156025 0.0137502 0.273545 +VERTEX3 476 49.8691 -26.9123 74.0291 -0.0264362 0.0136142 -0.335365 +VERTEX3 477 52.276 -21.6791 73.766 -0.0288048 0.0098075 -0.295135 +VERTEX3 478 54.0818 -17.858 73.4612 -0.0251528 0.00613289 -0.263375 +VERTEX3 479 55.9046 -13.234 73.0435 -0.0219545 0.0106667 -0.238822 +VERTEX3 480 57.4574 -9.00501 72.6966 -0.0237749 0.00998082 -0.187569 +VERTEX3 481 58.7003 -6.95292 72.3707 -0.0234198 0.0083984 -0.188185 +VERTEX3 482 59.9235 -3.72211 72.158 -0.0192912 0.0131822 -0.162399 +VERTEX3 483 60.8814 -1.74465 71.879 -0.0223822 0.00249604 -0.145318 +VERTEX3 484 61.9153 2.29054 71.6609 -0.00668479 0.0103825 -0.110035 +VERTEX3 485 63.1237 2.89165 71.4348 -0.0176539 0.00462231 -0.125802 +VERTEX3 486 63.9924 6.49247 71.2674 -0.00977598 0.00470964 -0.0935598 +VERTEX3 487 65.2827 5.55641 70.9849 -0.0147603 0.00577535 -0.124225 +VERTEX3 488 65.4534 9.12334 70.8798 -0.0145269 -0.00320107 -0.0779135 +VERTEX3 489 65.9674 12.4312 70.7255 -0.0132076 -0.0245447 -0.060476 +VERTEX3 490 67.5953 11.7244 70.6305 -0.00314398 -0.0131012 -0.0754407 +VERTEX3 491 69.5222 9.05291 70.7949 0.00419939 -0.0111996 -0.117712 +VERTEX3 492 70.3114 5.18692 70.6436 0.0198126 -0.000336537 -0.15383 +VERTEX3 493 71.5844 3.71806 70.9162 0.0254219 0.00346829 -0.16721 +VERTEX3 494 72.547 3.23532 70.5916 0.00603258 0.0237559 -0.155141 +VERTEX3 495 73.4197 6.11513 70.5261 -0.0144478 0.0209778 -0.129998 +VERTEX3 496 73.9081 4.9484 70.3371 -0.0150833 0.00774103 -0.119647 +VERTEX3 497 74.485 7.15776 70.2901 -0.0121846 0.0114154 -0.0707053 +VERTEX3 498 74.0112 8.59563 70.0284 -0.00114316 0.00839202 -0.0324119 +VERTEX3 499 73.8878 10.2177 69.9394 -0.0207945 0.0110628 0.00851152 +VERTEX3 500 72.9021 12.6687 69.6664 -0.0198636 0.0155312 0.0672125 +VERTEX3 501 72.8187 15.9078 69.6023 -0.0170608 0.0182499 0.0903465 +VERTEX3 502 72.3862 17.1435 69.5154 -0.003253 0.00655729 0.109385 +VERTEX3 503 72.1064 19.3584 69.6099 -0.0169192 0.00222569 0.12361 +VERTEX3 504 71.4706 19.5397 69.5581 -0.00619347 0.000910415 0.131234 +VERTEX3 505 70.7138 18.2478 69.4385 -0.0106572 -0.00994795 0.128194 +VERTEX3 506 70.2678 17.6728 69.4477 -0.00897994 -0.0144248 0.12647 +VERTEX3 507 69.3305 20.9445 69.3983 -0.016738 -0.00534117 0.16626 +VERTEX3 508 68.6328 13.7978 69.2971 -0.0181947 -4.58686e-05 0.151825 +VERTEX3 509 67.6505 6.65243 69.1586 -0.00498227 0.00584294 0.13429 +VERTEX3 510 67.0301 0.0713851 69.1736 -0.015661 0.00382371 0.111357 +VERTEX3 511 66.7591 -0.214575 68.7331 -0.0317461 0.0242646 0.103667 +VERTEX3 512 66.4387 -0.191031 68.9652 -0.0290795 0.0239169 0.0891438 +VERTEX3 513 65.7179 -2.69549 68.7582 -0.0224177 0.0234266 0.0752196 +VERTEX3 514 64.9126 -5.43215 69.0302 -0.0312073 0.0130684 0.0574907 +VERTEX3 515 64.534 -1.2359 68.8544 -0.0281637 0.0147902 0.101471 +VERTEX3 516 63.7712 -4.49547 68.9778 -0.0362755 0.0120358 0.0465539 +VERTEX3 517 63.3709 -1.58647 68.8414 -0.0204645 0.016708 0.0991738 +VERTEX3 518 62.8038 -1.84308 68.9164 -0.0274236 0.0157835 0.0771993 +VERTEX3 519 62.1497 2.39575 68.8165 -0.0238642 0.0174438 0.109651 +VERTEX3 520 61.7167 2.44126 68.8668 -0.0191361 0.0133861 0.106758 +VERTEX3 521 60.4333 8.09033 68.9003 -0.0187312 0.0104871 0.16503 +VERTEX3 522 59.8168 9.77281 68.9017 -0.0168229 0.0201278 0.153985 +VERTEX3 523 58.3034 14.9317 68.8821 -0.0210837 0.0232989 0.201864 +VERTEX3 524 57.1085 18.5324 68.8642 -0.0185215 0.0162721 0.219102 +VERTEX3 525 55.7025 20.6617 68.9418 -0.016362 0.0117448 0.216682 +VERTEX3 526 53.4525 -23.8672 69.6497 -0.0254921 0.00896929 -0.278487 +VERTEX3 527 55.5557 -21.3724 69.2384 -0.0256016 0.00750632 -0.268885 +VERTEX3 528 57.1827 -17.8436 68.9897 -0.0232625 0.00646636 -0.27328 +VERTEX3 529 59.3078 -13.1385 68.6078 -0.0237676 0.0099175 -0.220816 +VERTEX3 530 60.7696 -9.51791 68.2069 -0.0251335 0.0121282 -0.192675 +VERTEX3 531 62.4274 -5.10762 67.8136 -0.0164664 0.0142004 -0.157319 +VERTEX3 532 63.2869 -4.23786 67.5856 -0.0239037 0.0018702 -0.158805 +VERTEX3 533 64.4045 1.21919 67.3233 -0.00856687 0.0119505 -0.109921 +VERTEX3 534 65.3899 -0.0223879 67.1478 -0.0160778 0.00572351 -0.134413 +VERTEX3 535 66.2996 4.99242 66.8729 -0.0113177 0.00566002 -0.101125 +VERTEX3 536 67.6211 4.49741 66.7139 -0.0110988 0.00594051 -0.132086 +VERTEX3 537 67.9704 7.20759 66.5075 -0.0141954 -0.00574413 -0.0995988 +VERTEX3 538 68.3642 10.0364 66.2823 -0.012281 -0.0273209 -0.0932424 +VERTEX3 539 70.0281 9.96763 66.226 -0.0018921 -0.0111663 -0.116995 +VERTEX3 540 72.1347 6.67781 66.4278 0.00485565 -0.0136738 -0.150651 +VERTEX3 541 73.0287 2.91844 66.0916 0.0264976 0.00400386 -0.177941 +VERTEX3 542 74.3023 2.37699 66.5287 0.0331381 0.00277734 -0.189925 +VERTEX3 543 75.2037 4.88287 66.2073 0.00715625 0.0274876 -0.179612 +VERTEX3 544 77.0117 3.77966 66.1815 -0.0105626 0.0242853 -0.172339 +VERTEX3 545 77.6488 4.01919 65.9045 -0.00328614 0.00733363 -0.174923 +VERTEX3 546 78.6413 5.48303 66.0191 -0.0149087 0.0113116 -0.110616 +VERTEX3 547 78.368 6.80824 65.7354 -0.00448093 0.00170976 -0.0784174 +VERTEX3 548 78.6828 8.54995 65.625 -0.0206747 0.000929625 -0.0390994 +VERTEX3 549 78.0498 11.3843 65.3666 -0.0140676 0.0134489 0.00965939 +VERTEX3 550 77.2744 14.1655 64.9978 -0.0305618 0.0334602 0.070167 +VERTEX3 551 77.0737 17.7293 65.0039 -0.0195533 0.0127829 0.0987012 +VERTEX3 552 76.7113 20.6389 64.9577 -0.0130705 0.0116092 0.113114 +VERTEX3 553 76.043 21.4763 64.884 -0.00436681 -0.00143108 0.134442 +VERTEX3 554 75.5439 22.6771 64.9367 -0.0220706 -0.00549649 0.140533 +VERTEX3 555 74.4289 22.3423 64.8422 -0.0055472 -0.00338694 0.150518 +VERTEX3 556 73.8 21.4641 64.7314 -0.0157799 -0.00623357 0.152662 +VERTEX3 557 73.3615 18.6491 64.8823 -0.011394 -0.0128741 0.140426 +VERTEX3 558 72.1731 22.3335 64.6344 -0.0121934 -0.00789981 0.181131 +VERTEX3 559 71.5097 13.5287 64.5201 -0.00430385 0.00469868 0.148417 +VERTEX3 560 70.6922 8.10643 64.4697 -0.00312417 0.00438471 0.139508 +VERTEX3 561 70.3688 4.54558 64.3419 -0.014973 0.0127616 0.137704 +VERTEX3 562 69.2697 4.18345 63.8837 -0.0380339 0.0319302 0.156718 +VERTEX3 563 69.1765 1.41171 64.2264 -0.026407 0.026275 0.125302 +VERTEX3 564 68.299 -2.52475 63.9873 -0.0197439 0.0277398 0.103419 +VERTEX3 565 67.5973 -1.82928 64.2044 -0.0340759 0.0155011 0.102751 +VERTEX3 566 67.3759 -1.87231 64.1446 -0.0316334 0.0153528 0.10037 +VERTEX3 567 66.5058 -5.02009 64.3706 -0.0370282 0.0158515 0.059691 +VERTEX3 568 66.1212 0.136473 64.1429 -0.0217427 0.0151685 0.101932 +VERTEX3 569 65.522 -1.04537 64.2909 -0.0307658 0.0169898 0.0734802 +VERTEX3 570 64.8059 2.40621 64.1795 -0.0220424 0.0155618 0.104646 +VERTEX3 571 64.0023 5.47544 64.2078 -0.0182753 0.0239214 0.131166 +VERTEX3 572 62.8848 9.17477 64.2525 -0.0230451 0.0110014 0.145094 +VERTEX3 573 61.7298 13.125 64.2082 -0.0182305 0.0213898 0.178673 +VERTEX3 574 60.7473 15.0814 64.1768 -0.0220088 0.00758102 0.175674 +VERTEX3 575 59.5618 16.149 64.3019 -0.0274041 0.014593 0.160044 +VERTEX3 576 57.0182 -21.0478 64.8053 -0.0211283 0.00914641 -0.230013 +VERTEX3 577 58.587 -20.1162 64.5406 -0.0213846 0.00754474 -0.254278 +VERTEX3 578 60.2913 -17.4132 64.2049 -0.0257598 0.0114625 -0.246807 +VERTEX3 579 62.5821 -11.7067 63.8441 -0.0187325 0.0188071 -0.184893 +VERTEX3 580 63.9633 -9.2356 63.4528 -0.0240968 0.0137532 -0.194062 +VERTEX3 581 65.1371 -6.21548 63.1538 -0.0214582 0.00561087 -0.146091 +VERTEX3 582 66.3709 -1.83556 62.7715 -0.0121062 0.0143219 -0.127558 +VERTEX3 583 67.4129 -2.57782 62.6392 -0.0204508 0.00766102 -0.151933 +VERTEX3 584 68.2319 2.34781 62.3668 -0.013405 0.00908074 -0.116246 +VERTEX3 585 69.4642 1.17755 62.2102 -0.0123348 0.00529402 -0.147832 +VERTEX3 586 70.1503 4.31575 62.0396 -0.0180162 -0.0019453 -0.135434 +VERTEX3 587 70.8228 6.58046 61.8574 -0.010316 -0.0281312 -0.128768 +VERTEX3 588 71.8267 7.59569 61.5587 -0.00251341 -0.0168587 -0.13834 +VERTEX3 589 73.8905 5.05312 61.6631 0.00630761 -0.0188925 -0.172777 +VERTEX3 590 75.044 0.726053 61.2899 0.0286976 0.0138554 -0.199511 +VERTEX3 591 76.4597 -2.09378 61.8458 0.0459106 -0.00818757 -0.234268 +VERTEX3 592 77.6904 1.05987 61.5977 0.0222279 0.0262248 -0.209293 +VERTEX3 593 79.635 0.338552 61.6617 -0.00445757 0.0228081 -0.215563 +VERTEX3 594 80.6909 0.152197 61.5177 -0.00391415 0.0175093 -0.213233 +VERTEX3 595 81.9552 2.65621 61.5252 -0.0160377 0.0119054 -0.158546 +VERTEX3 596 82.2938 3.44608 61.3057 -0.00288757 -0.00391636 -0.129754 +VERTEX3 597 82.8194 5.74513 61.1493 -0.0159921 -0.00811412 -0.10755 +VERTEX3 598 82.5207 9.97892 60.8498 -0.0129034 0.00518367 -0.0333057 +VERTEX3 599 82.2119 12.1143 60.5216 -0.0272962 0.0126568 0.0173892 +VERTEX3 600 81.2849 15.723 60.0519 -0.0496055 0.00233739 0.0909591 +VERTEX3 601 81.2085 19.1877 60.0782 -0.0295108 0.0227628 0.109213 +VERTEX3 602 80.4634 21.9961 60.1543 -0.0179702 0.00742205 0.125145 +VERTEX3 603 79.9762 25.3812 60.1483 -0.01404 0.00702298 0.142076 +VERTEX3 604 79.0695 26.2525 59.984 -0.00567697 -0.00942734 0.158199 +VERTEX3 605 78.3156 26.2257 60.0379 -0.0271245 -0.00983481 0.159773 +VERTEX3 606 77.2975 26.4239 60.0444 -0.00519576 -0.00687188 0.170469 +VERTEX3 607 76.4604 23.8726 59.8059 -0.0110877 -0.00856797 0.165667 +VERTEX3 608 75.8459 22.248 59.9637 -0.00203011 -0.0131179 0.154363 +VERTEX3 609 74.6143 24.1761 59.715 -0.00651044 -0.00431777 0.190519 +VERTEX3 610 73.8821 15.4076 59.6353 -0.00387742 0.00568921 0.158144 +VERTEX3 611 73.1041 9.03693 59.6121 -0.00195893 0.00305752 0.148808 +VERTEX3 612 73.0668 2.39615 59.3603 -0.0173103 0.00852702 0.147059 +VERTEX3 613 72.0262 1.06787 59.018 -0.0380871 0.0280999 0.138365 +VERTEX3 614 71.5494 -1.00855 59.2986 -0.0486662 0.0174049 0.131034 +VERTEX3 615 70.5525 0.584952 58.9933 -0.0481738 0.0278705 0.136642 +VERTEX3 616 70.0018 -0.433854 59.2301 -0.0271072 0.0214773 0.139175 +VERTEX3 617 69.6029 0.117763 59.1727 -0.0370342 0.0150098 0.12934 +VERTEX3 618 68.9342 -3.16959 59.457 -0.0340436 0.0165674 0.0866023 +VERTEX3 619 68.3952 0.650422 59.2777 -0.0262818 0.0206145 0.114213 +VERTEX3 620 67.7347 0.158112 59.3949 -0.0291606 0.0217105 0.0977045 +VERTEX3 621 66.4882 6.29146 59.2342 -0.0248595 0.0228696 0.144311 +VERTEX3 622 65.8141 8.56539 59.3143 -0.0186248 0.0169654 0.145585 +VERTEX3 623 64.9461 11.2379 59.3602 -0.0233613 0.00897686 0.158008 +VERTEX3 624 63.3163 15.8112 59.3773 -0.0184729 0.0201146 0.190482 +VERTEX3 625 61.7714 20.0803 59.1756 -0.0207913 0.0160139 0.209711 +VERTEX3 626 59.0775 -26.123 60.1316 -0.022467 0.00597761 -0.28838 +VERTEX3 627 61.1362 -21.7498 59.7594 -0.0290432 0.0127289 -0.266368 +VERTEX3 628 63.5841 -15.5999 59.2024 -0.0217032 0.0169284 -0.202217 +VERTEX3 629 65.0603 -13.3881 58.894 -0.0247724 0.0146361 -0.214769 +VERTEX3 630 66.2009 -10.3298 58.7073 -0.0234632 0.00532806 -0.183126 +VERTEX3 631 67.7717 -5.70785 58.2364 -0.022651 0.0106468 -0.164964 +VERTEX3 632 68.9052 -4.59089 57.9265 -0.0191271 0.0101303 -0.150208 +VERTEX3 633 69.9215 -0.00118403 57.7501 -0.016873 0.0125514 -0.136438 +VERTEX3 634 71.2978 -0.624354 57.3862 -0.0144851 0.00350512 -0.154454 +VERTEX3 635 71.9675 -0.277563 57.3249 -0.0304416 0.00557193 -0.17481 +VERTEX3 636 72.325 3.60756 57.0739 -0.015984 -0.026738 -0.149086 +VERTEX3 637 73.476 3.25872 56.6898 -0.00445076 -0.0108853 -0.184118 +VERTEX3 638 75.3636 0.412476 56.7188 0.00410794 -0.021358 -0.229584 +VERTEX3 639 76.4284 -1.37913 56.4738 0.0258366 0.00181339 -0.217454 +VERTEX3 640 78.4093 -4.26884 57.0099 0.0480991 -0.00804896 -0.246185 +VERTEX3 641 79.679 -1.58055 56.7824 0.0323394 0.0329524 -0.230975 +VERTEX3 642 81.4553 -1.61343 56.8832 0.00358333 0.0196743 -0.251662 +VERTEX3 643 82.7457 -3.62521 56.7107 0.0002787 0.0291731 -0.255105 +VERTEX3 644 84.5576 -1.84396 56.8836 -0.0158184 0.0127981 -0.223578 +VERTEX3 645 85.2334 -0.103952 56.5932 -0.00279365 -0.00585068 -0.180698 +VERTEX3 646 86.4118 2.64203 56.4817 -0.0142534 -0.0144041 -0.155635 +VERTEX3 647 86.3337 7.44155 56.116 -0.00578343 0.000395855 -0.0893416 +VERTEX3 648 86.5562 9.41025 55.8172 -0.0211082 -0.00535714 -0.0397055 +VERTEX3 649 85.9882 13.1036 55.517 -0.0393055 -0.0103625 0.0305467 +VERTEX3 650 85.2456 16.9952 55.0394 -0.0653024 -0.00489155 0.0823954 +VERTEX3 651 84.7615 21.2367 55.0361 -0.044144 0.00297867 0.120424 +VERTEX3 652 84.2599 23.8285 54.9792 -0.028836 0.016039 0.144811 +VERTEX3 653 83.1138 26.2779 55.136 -0.0140803 0.000443527 0.148413 +VERTEX3 654 82.6075 30.5563 55.1196 -0.0117488 0.00196197 0.167341 +VERTEX3 655 81.4227 31.6188 54.9825 -0.0063561 -0.0149053 0.182333 +VERTEX3 656 80.6683 31.54 54.8549 -0.0271707 -0.00831737 0.182721 +VERTEX3 657 79.469 30.0633 54.9229 -0.00185389 -0.00722509 0.191852 +VERTEX3 658 78.5274 26.1463 54.6882 -0.0083664 -0.00606912 0.179345 +VERTEX3 659 77.8452 21.3982 54.7913 -0.00728453 -0.00881074 0.164337 +VERTEX3 660 76.8418 23.1384 54.5572 0.00103212 -0.00609967 0.200877 +VERTEX3 661 76.0389 14.0178 54.4937 0.0087243 0.00734398 0.160755 +VERTEX3 662 75.4546 15.3479 54.4672 -0.00424914 0.00390731 0.190033 +VERTEX3 663 75.2141 1.85736 54.2239 -0.0178186 0.00611395 0.152217 +VERTEX3 664 74.0611 -3.87672 54.0219 -0.0319787 0.0204804 0.0843422 +VERTEX3 665 73.7649 0.872922 54.1695 -0.0417122 0.0249753 0.170759 +VERTEX3 666 72.5544 0.527322 53.8358 -0.0412049 0.0308947 0.157653 +VERTEX3 667 71.9336 0.489995 53.9602 -0.024856 0.0232993 0.152055 +VERTEX3 668 71.6147 0.0746133 54.0787 -0.0344393 0.013569 0.132328 +VERTEX3 669 70.8036 -2.30255 54.322 -0.0357963 0.0200361 0.10007 +VERTEX3 670 70.2642 0.793434 54.219 -0.0303896 0.022171 0.108532 +VERTEX3 671 69.4453 2.04554 54.323 -0.0296545 0.0258137 0.118342 +VERTEX3 672 68.1272 9.33041 54.1366 -0.0210678 0.0277584 0.165877 +VERTEX3 673 67.5531 10.8511 54.2853 -0.0154632 0.011338 0.168723 +VERTEX3 674 66.2142 15.5656 54.2038 -0.0150835 0.021151 0.186656 +VERTEX3 675 64.7788 20.4513 54.0834 -0.0142432 0.0182531 0.217196 +VERTEX3 676 61.6644 -27.8617 55.0661 -0.0302867 0.0101545 -0.294392 +VERTEX3 677 64.0967 -21.2778 54.5198 -0.0271138 0.0139832 -0.236316 +VERTEX3 678 65.9291 -17.5881 54.2108 -0.0249015 0.0110091 -0.227902 +VERTEX3 679 67.0632 -14.3148 53.9177 -0.0260127 0.0126639 -0.20145 +VERTEX3 680 68.8231 -8.90158 53.496 -0.0235066 0.00917395 -0.175062 +VERTEX3 681 70.2181 -4.49989 53.0455 -0.00777254 0.0108478 -0.120554 +VERTEX3 682 70.9546 -2.53736 52.7953 -0.01751 0.00772758 -0.132115 +VERTEX3 683 72.2727 -3.80811 52.6122 -0.017709 0.00646656 -0.173109 +VERTEX3 684 72.9709 -2.26777 52.462 -0.0323484 0.00365506 -0.184364 +VERTEX3 685 73.443 -0.00666649 52.1329 -0.0233338 -0.0205968 -0.170622 +VERTEX3 686 74.7822 -1.13646 51.7919 -0.0163444 -0.00592588 -0.232203 +VERTEX3 687 76.819 0.244013 51.681 0.00870999 -0.022023 -0.229575 +VERTEX3 688 77.5416 1.23527 51.4647 0.0191525 0.00635124 -0.240481 +VERTEX3 689 79.539 -4.73134 51.9025 0.0513422 -0.012826 -0.262398 +VERTEX3 690 81.0333 -3.55678 51.7264 0.0400741 0.0353231 -0.248539 +VERTEX3 691 82.9526 -4.44361 52.0851 0.0119945 0.0317988 -0.262551 +VERTEX3 692 83.959 -5.42022 51.6595 -0.00350701 0.0423192 -0.29258 +VERTEX3 693 86.3688 -5.35618 51.9621 -0.0124104 0.013657 -0.268545 +VERTEX3 694 87.2069 -1.75126 51.6198 -0.000208912 -0.00936682 -0.228211 +VERTEX3 695 88.6518 1.58732 51.4324 -0.0168626 -0.01704 -0.16986 +VERTEX3 696 89.2306 4.18682 51.1844 -0.00347875 -0.0118634 -0.139061 +VERTEX3 697 89.8863 6.4037 50.9373 -0.0108058 -0.0197895 -0.0991312 +VERTEX3 698 89.9117 9.92413 50.6316 -0.0233607 -0.0226689 -0.0419584 +VERTEX3 699 89.7141 13.6821 50.236 -0.0509179 -0.0191863 0.0240457 +VERTEX3 700 88.7268 17.6031 49.7715 -0.0573131 -0.0200124 0.100447 +VERTEX3 701 88.176 22.2026 49.7451 -0.0476565 -0.00577339 0.125869 +VERTEX3 702 87.0895 26.0313 49.7974 -0.0311996 -0.00114507 0.149417 +VERTEX3 703 86.4875 28.4075 49.7758 -0.0243294 0.0111182 0.174384 +VERTEX3 704 85.2928 30.6089 49.9998 -0.0112716 -0.00533961 0.173596 +VERTEX3 705 84.2316 32.7021 49.8069 -0.00554105 -0.00291513 0.179217 +VERTEX3 706 83.4494 33.7355 49.7011 -0.00506101 -0.0187771 0.204932 +VERTEX3 707 82.4178 35.8213 49.4495 -0.0253326 -0.010242 0.200114 +VERTEX3 708 81.1177 32.9756 49.5875 -0.0069687 -0.0117909 0.210594 +VERTEX3 709 80.3438 28.4174 49.3098 -0.00429908 -0.00701249 0.191519 +VERTEX3 710 80.1213 24.8159 49.5895 -0.00190644 -0.0109947 0.181382 +VERTEX3 711 78.7289 23.5946 49.239 0.00816397 -0.012609 0.211648 +VERTEX3 712 77.9394 17.1219 49.2002 0.00779781 0.00900162 0.183332 +VERTEX3 713 77.3238 14.3804 49.1862 -0.00274127 0.00206134 0.187515 +VERTEX3 714 77.2672 2.88997 48.7895 -0.0185098 0.00801291 0.16012 +VERTEX3 715 76.2745 -3.26535 48.6884 -0.0338626 0.019794 0.0847692 +VERTEX3 716 75.5774 1.44698 48.7045 -0.050735 0.0291475 0.188527 +VERTEX3 717 74.2441 1.16782 48.3381 -0.041669 0.0412639 0.176864 +VERTEX3 718 73.4907 0.148022 48.7587 -0.0235938 0.0208275 0.165006 +VERTEX3 719 72.7997 1.5401 48.7549 -0.0354551 0.0224181 0.156335 +VERTEX3 720 72.2946 -1.02371 49.1278 -0.0317287 0.0213259 0.134221 +VERTEX3 721 71.6542 1.80545 48.9271 -0.0341099 0.030297 0.117687 +VERTEX3 722 70.484 5.93975 49.073 -0.0293064 0.0327116 0.157811 +VERTEX3 723 69.1132 12.559 48.8584 -0.0152093 0.0372826 0.191493 +VERTEX3 724 68.7582 14.7609 48.8935 -0.0155415 0.021025 0.178775 +VERTEX3 725 67.1879 21.2275 48.804 -0.0166714 0.0218242 0.236231 +VERTEX3 726 64.3485 -28.7828 49.8313 -0.021826 0.0153218 -0.279644 +VERTEX3 727 66.5123 -22.3704 49.4143 -0.0256503 0.0117715 -0.250336 +VERTEX3 728 67.9183 -17.8878 49.0274 -0.0349258 0.0202727 -0.216996 +VERTEX3 729 69.1616 -13.28 48.678 -0.0320404 0.00757678 -0.205966 +VERTEX3 730 71.0932 -8.591 48.135 -0.0148272 0.0126036 -0.144099 +VERTEX3 731 71.8148 -4.83797 47.8617 -0.021217 0.00702918 -0.142254 +VERTEX3 732 72.767 -6.11825 47.5371 -0.0133301 0.00220335 -0.190372 +VERTEX3 733 73.3443 -6.51402 47.5871 -0.0374845 0.00756988 -0.21513 +VERTEX3 734 74.2691 -1.82092 47.0645 -0.0332907 -0.0136747 -0.195262 +VERTEX3 735 75.2537 -3.09486 46.6236 -0.018922 -0.00833399 -0.235782 +VERTEX3 736 77.6551 -3.74452 46.4503 0.00914821 -0.0232189 -0.260852 +VERTEX3 737 78.6873 -3.75921 46.1817 0.0123879 0.00362384 -0.249844 +VERTEX3 738 80.1767 -7.29744 46.7122 0.0570214 -0.0184548 -0.282695 +VERTEX3 739 81.5864 -4.91052 46.477 0.0466541 0.04541 -0.251544 +VERTEX3 740 83.5286 -6.8539 46.9192 0.0200306 0.0384633 -0.279398 +VERTEX3 741 84.4976 -9.2165 46.7503 -0.021048 0.0599997 -0.325122 +VERTEX3 742 87.5451 -6.86467 46.8733 -0.00845063 0.0164523 -0.280938 +VERTEX3 743 88.5471 -4.98959 46.6215 0.000902497 -0.0118972 -0.272579 +VERTEX3 744 90.4677 -1.25128 46.3998 -0.01494 -0.0205508 -0.217845 +VERTEX3 745 91.4563 -0.168826 45.9984 0.000449029 -0.0272835 -0.19124 +VERTEX3 746 92.5544 3.07436 45.7499 0.000482062 -0.0333236 -0.158464 +VERTEX3 747 92.9546 6.16456 45.5195 -0.00557253 -0.0312157 -0.110376 +VERTEX3 748 93.2565 10.7866 45.1652 -0.036139 -0.0320056 -0.0385905 +VERTEX3 749 93.0126 14.358 44.7575 -0.0378294 -0.0329598 0.0309347 +VERTEX3 750 91.8962 18.3813 44.3939 -0.0417227 -0.0375177 0.109074 +VERTEX3 751 91.1509 23.0409 44.2863 -0.0316845 -0.0208533 0.135708 +VERTEX3 752 89.9635 26.7624 44.3448 -0.0344164 -0.00677082 0.156769 +VERTEX3 753 88.7134 31.1812 44.5134 -0.0228679 -0.00272198 0.173755 +VERTEX3 754 88.0237 34.1775 44.3158 -0.0190899 0.00837531 0.200118 +VERTEX3 755 86.8154 36.8346 44.6536 -0.00680533 -0.00701978 0.199318 +VERTEX3 756 85.8033 36.1306 44.4461 -0.00295266 -0.00885419 0.196774 +VERTEX3 757 84.9081 37.6388 44.2965 -0.00402514 -0.02127 0.221382 +VERTEX3 758 83.9733 37.3668 43.9811 -0.0241206 -0.00980375 0.218354 +VERTEX3 759 82.7706 37.7459 44.0898 -0.0024727 -0.0164722 0.227421 +VERTEX3 760 81.8628 32.4158 43.8135 -0.00284029 -0.00766301 0.207483 +VERTEX3 761 81.573 28.9208 44.0455 0.00421434 -0.0147532 0.202206 +VERTEX3 762 79.9551 30.6401 43.8562 -0.00260638 0.00297771 0.238728 +VERTEX3 763 79.2023 25.4387 43.8535 -0.011235 0.0117529 0.219517 +VERTEX3 764 79.1609 17.1392 43.7901 -0.00187428 0.00144287 0.196959 +VERTEX3 765 78.5854 3.77956 43.3984 -0.0182481 0.00517545 0.171316 +VERTEX3 766 77.7226 -0.386012 42.8536 -0.0429081 0.0356231 0.171533 +VERTEX3 767 76.7207 2.42442 43.0388 -0.0490994 0.0457613 0.217845 +VERTEX3 768 75.168 2.24544 42.9077 -0.0478442 0.0543478 0.203527 +VERTEX3 769 74.3495 1.34438 43.2648 -0.0254237 0.0251692 0.189184 +VERTEX3 770 73.6622 1.88617 43.3629 -0.0271375 0.0284353 0.177605 +VERTEX3 771 72.8999 2.1778 43.6404 -0.0236098 0.0248541 0.172921 +VERTEX3 772 72.5773 3.88452 43.4588 -0.0395586 0.0398246 0.142885 +VERTEX3 773 71.1431 9.87463 43.5642 -0.0219303 0.0383658 0.181876 +VERTEX3 774 69.9124 16.8523 43.358 -0.00654434 0.024109 0.218046 +VERTEX3 775 69.8098 19.0899 43.4737 -0.0187744 0.017472 0.207215 +VERTEX3 776 66.6654 -28.2559 44.401 -0.0205661 0.00874708 -0.259159 +VERTEX3 777 67.4084 -24.6081 44.1218 -0.0399563 0.0119249 -0.257004 +VERTEX3 778 69.0013 -18.3261 43.7172 -0.0439058 0.00866503 -0.229007 +VERTEX3 779 71.0994 -12.811 43.1487 -0.038899 0.0138586 -0.193363 +VERTEX3 780 71.7491 -9.63101 42.8928 -0.0358887 0.0133382 -0.184156 +VERTEX3 781 73.087 -9.76997 42.554 -0.0414415 0.0116755 -0.20629 +VERTEX3 782 73.5787 -7.49873 42.4838 -0.0315206 0.00333684 -0.206435 +VERTEX3 783 74.438 -5.01415 41.8262 -0.0381511 -0.0177585 -0.2008 +VERTEX3 784 75.1426 -4.79576 41.3239 -0.0198418 -0.00959162 -0.23284 +VERTEX3 785 77.9581 -6.61293 41.1742 0.00238311 -0.0228563 -0.265142 +VERTEX3 786 78.7431 -5.58161 40.6963 0.00792276 0.00433743 -0.255938 +VERTEX3 787 80.315 -9.36942 41.1854 0.053059 -0.0228838 -0.287114 +VERTEX3 788 81.5692 -7.34563 40.9808 0.0554175 0.0384372 -0.265752 +VERTEX3 789 83.744 -9.59211 41.7562 0.0347555 0.0277383 -0.302815 +VERTEX3 790 84.5246 -12.3419 41.6279 -0.0230054 0.0684783 -0.343828 +VERTEX3 791 87.8868 -8.74928 41.5534 0.00324076 0.0175355 -0.314053 +VERTEX3 792 88.8645 -7.3465 41.3252 2.57702e-05 -0.00673755 -0.307821 +VERTEX3 793 91.2667 -5.78782 41.1368 -0.00782841 -0.0273139 -0.286757 +VERTEX3 794 92.8183 -3.20153 40.7896 0.00471264 -0.0363312 -0.238503 +VERTEX3 795 94.4407 0.0806823 40.5364 0.00717885 -0.0433231 -0.209045 +VERTEX3 796 95.0656 3.26784 40.2193 0.00551944 -0.0397135 -0.155485 +VERTEX3 797 95.9004 6.54999 39.9343 -0.00675385 -0.0450258 -0.119225 +VERTEX3 798 96.3202 10.5706 39.5202 -0.0226616 -0.0433004 -0.0374635 +VERTEX3 799 96.025 14.9195 39.1987 -0.0236025 -0.0457592 0.0375302 +VERTEX3 800 95.0195 19.2736 38.8348 -0.0119422 -0.0404395 0.132083 +VERTEX3 801 93.857 24.3492 38.8971 -0.0226028 -0.0403526 0.14339 +VERTEX3 802 92.7406 29.3867 38.8258 -0.0169669 -0.0187487 0.168118 +VERTEX3 803 91.2799 33.1738 38.8249 -0.0226129 -0.00814665 0.189813 +VERTEX3 804 89.7379 37.031 38.9446 -0.0186513 -0.000107412 0.194662 +VERTEX3 805 89.0682 40.563 38.8515 -0.0139417 0.00644184 0.223932 +VERTEX3 806 87.7829 41.2988 39.2151 -0.00478567 -0.011273 0.219388 +VERTEX3 807 86.964 42.3753 38.9821 -0.00454707 -0.0110082 0.218739 +VERTEX3 808 85.6957 40.5741 38.6944 0.00305122 -0.0284001 0.237967 +VERTEX3 809 84.882 42.7515 38.2719 -0.0231545 -0.00731446 0.236306 +VERTEX3 810 83.8131 40.4231 38.4781 -3.83705e-05 -0.0152826 0.244418 +VERTEX3 811 82.8524 36.9522 38.1225 -0.00369005 -0.00789432 0.227375 +VERTEX3 812 82.5977 28.0957 38.4081 -0.0150085 -0.0109505 0.207274 +VERTEX3 813 81.0882 36.1604 38.1444 -0.0087173 0.00569088 0.254475 +VERTEX3 814 80.9047 24.3946 38.0879 0.00845652 0.0168275 0.221295 +VERTEX3 815 80.5387 17.3938 37.9923 -0.0021335 0.00167887 0.238877 +VERTEX3 816 80.307 4.02098 37.699 -0.0179766 0.00718499 0.187857 +VERTEX3 817 79.012 -0.898475 37.3289 -0.0427737 0.0341572 0.17152 +VERTEX3 818 77.2642 2.86946 37.4378 -0.0622276 0.0485225 0.229242 +VERTEX3 819 75.7646 2.58782 37.207 -0.0438448 0.0564378 0.216746 +VERTEX3 820 74.8482 1.24031 37.6436 -0.0231073 0.030577 0.203643 +VERTEX3 821 73.9004 4.07489 37.6685 -0.0279664 0.0371406 0.195663 +VERTEX3 822 73.6673 2.94936 38.1475 -0.0255558 0.0293448 0.159458 +VERTEX3 823 72.679 8.85885 37.8855 -0.0108823 0.0241046 0.180747 +VERTEX3 824 71.6974 13.0255 38.1447 -0.0102513 0.0375358 0.201243 +VERTEX3 825 70.724 20.0533 37.9656 -0.00743145 0.0162494 0.236708 +VERTEX3 826 67.2919 -30.0744 39.0366 -0.0320212 0.0170405 -0.274086 +VERTEX3 827 68.5783 -23.4809 38.7724 -0.0573399 0.0126836 -0.257328 +VERTEX3 828 70.2826 -18.7485 38.2906 -0.0589858 0.0120071 -0.224974 +VERTEX3 829 71.9206 -10.4943 37.6911 -0.0392262 0.0192259 -0.187423 +VERTEX3 830 73.2034 -11.2044 37.2975 -0.0430428 0.00797433 -0.208217 +VERTEX3 831 73.0549 -9.13192 36.924 -0.033209 0.000154555 -0.212667 +VERTEX3 832 74.3147 -7.18577 36.5472 -0.0406435 -0.0171191 -0.20553 +VERTEX3 833 75.0206 -8.45688 35.999 -0.0345958 -0.0118897 -0.25543 +VERTEX3 834 77.8891 -8.4156 35.7036 -0.00698505 -0.0205155 -0.255737 +VERTEX3 835 78.4648 -7.86034 35.0958 0.0141115 0.00500525 -0.264488 +VERTEX3 836 80.2538 -10.2391 35.5922 0.0438854 -0.0265048 -0.271478 +VERTEX3 837 81.5518 -12.4397 35.45 0.0649043 0.0387323 -0.260491 +VERTEX3 838 83.5886 -13.5825 36.2531 0.0424768 0.0208539 -0.314221 +VERTEX3 839 84.2149 -13.7229 36.1698 -0.0104683 0.0668428 -0.356279 +VERTEX3 840 87.3919 -10.4633 36.1704 0.011558 0.0189238 -0.327891 +VERTEX3 841 88.74 -10.3418 36.027 -0.0106985 -0.0110454 -0.335305 +VERTEX3 842 91.2524 -8.65395 35.71 -0.00443315 -0.0310386 -0.328439 +VERTEX3 843 93.1161 -6.09449 35.3348 0.0171112 -0.0410631 -0.282354 +VERTEX3 844 95.2828 -4.11703 35.0521 0.0198627 -0.0565447 -0.264384 +VERTEX3 845 96.4038 -2.28665 34.7546 0.0266996 -0.0452288 -0.227543 +VERTEX3 846 97.7109 2.35334 34.5295 0.00694717 -0.0522237 -0.177855 +VERTEX3 847 98.5858 6.05717 34.2551 -0.00421416 -0.0512593 -0.117913 +VERTEX3 848 99.1546 11.1278 33.7757 -0.0101386 -0.0519381 -0.0308685 +VERTEX3 849 98.7567 15.6346 33.4199 0.00056047 -0.0462044 0.0525942 +VERTEX3 850 97.5708 20.0513 33.2324 0.0266315 -0.0622728 0.135617 +VERTEX3 851 96.2663 25.1484 33.2657 0.000697124 -0.0504064 0.166284 +VERTEX3 852 94.8456 30.318 33.3895 -0.0125521 -0.0384403 0.177163 +VERTEX3 853 93.5268 35.736 33.2057 -0.00995911 -0.0172135 0.198969 +VERTEX3 854 91.8318 38.3622 33.1434 -0.0125323 -0.00762999 0.214953 +VERTEX3 855 90.3415 44.3052 33.305 -0.0127198 0.0033146 0.220629 +VERTEX3 856 89.2695 45.8417 33.1504 -0.011064 0.00624199 0.246328 +VERTEX3 857 88.2946 45.8859 33.5598 -0.00159321 -0.0140026 0.237243 +VERTEX3 858 87.4654 46.3885 33.2368 -0.0031829 -0.015908 0.239141 +VERTEX3 859 86.4158 47.2277 33.214 0.000173278 -0.0295058 0.253125 +VERTEX3 860 85.8064 44.0963 32.6225 -0.0249718 -0.0177527 0.236266 +VERTEX3 861 84.5784 43.6517 32.8593 -0.00145867 -0.017607 0.263424 +VERTEX3 862 83.6176 41.3757 32.4042 -0.00564905 -0.0114591 0.252432 +VERTEX3 863 83.7441 37.4903 32.5499 -0.00575323 -0.017266 0.237605 +VERTEX3 864 82.4906 34.3058 32.2993 0.00167366 -0.00974163 0.257162 +VERTEX3 865 82.0892 25.4482 32.3694 0.00605039 0.0133082 0.237301 +VERTEX3 866 81.5089 17.9967 32.2501 -0.00400783 0.000332292 0.238348 +VERTEX3 867 81.0099 4.59099 31.9663 -0.0152583 0.0128673 0.212431 +VERTEX3 868 79.5326 -1.14842 31.586 -0.0437149 0.0341829 0.183512 +VERTEX3 869 77.8028 2.54774 31.7857 -0.059978 0.0594901 0.247463 +VERTEX3 870 75.6536 4.04561 31.3373 -0.0560108 0.0624992 0.238044 +VERTEX3 871 75.1147 2.76931 31.9989 -0.0205686 0.0352053 0.212954 +VERTEX3 872 74.7506 3.09072 32.0943 -0.0214248 0.0333909 0.170928 +VERTEX3 873 74.0016 4.5285 32.4901 -0.0194581 0.0338776 0.161565 +VERTEX3 874 73.139 12.2032 32.3358 -0.0094863 0.0395323 0.207347 +VERTEX3 875 73.1067 13.8325 32.6051 -0.0130038 0.022361 0.183678 +VERTEX3 876 69.7281 -24.8338 33.1706 -0.0307646 0.0188661 -0.207228 +VERTEX3 877 70.4405 -21.4706 32.8854 -0.0437953 0.0168858 -0.207635 +VERTEX3 878 71.3222 -16.2964 32.5547 -0.0597641 0.0193163 -0.202945 +VERTEX3 879 73.2791 -12.3453 32.0608 -0.0518969 0.0203363 -0.190549 +VERTEX3 880 73.2382 -11.331 31.6985 -0.0493152 0.000119803 -0.222079 +VERTEX3 881 73.749 -11.9299 31.2457 -0.0571868 0.00124496 -0.236902 +VERTEX3 882 74.653 -10.1745 30.5677 -0.0329956 -0.00853775 -0.233008 +VERTEX3 883 77.6594 -10.1384 30.2416 -0.0175852 -0.0165183 -0.250383 +VERTEX3 884 77.7468 -8.27746 29.4923 0.000793561 -0.0127203 -0.254147 +VERTEX3 885 79.715 -11.4812 29.8763 0.0360046 -0.0306003 -0.270512 +VERTEX3 886 81.0369 -13.7286 29.75 0.0697085 0.0277705 -0.263992 +VERTEX3 887 83.0948 -15.7549 30.6753 0.0375469 0.0235328 -0.308433 +VERTEX3 888 83.0023 -13.6896 30.3636 -0.000871611 0.0634918 -0.358004 +VERTEX3 889 86.4098 -12.0574 30.4155 0.0180877 0.0200957 -0.331328 +VERTEX3 890 87.8663 -10.724 30.3759 -0.00333483 -0.00808121 -0.351829 +VERTEX3 891 90.6222 -10.0913 30.0743 -0.00597919 -0.0321591 -0.337831 +VERTEX3 892 92.6995 -7.07631 29.7262 0.0238818 -0.0471227 -0.318546 +VERTEX3 893 95.1121 -7.38781 29.3345 0.0308118 -0.0652476 -0.312641 +VERTEX3 894 96.5973 -6.61514 29.0656 0.0410534 -0.0480305 -0.2923 +VERTEX3 895 98.667 -1.85419 28.9821 0.0244347 -0.0558943 -0.237912 +VERTEX3 896 99.9638 2.7128 28.6754 0.00924538 -0.0536852 -0.176145 +VERTEX3 897 101.226 6.3945 28.3438 0.000173633 -0.0569418 -0.101465 +VERTEX3 898 101.484 11.8024 27.9604 0.00986498 -0.0457209 -0.032121 +VERTEX3 899 101.144 16.1471 27.7207 0.0299245 -0.0563168 0.0593548 +VERTEX3 900 99.6968 20.8425 27.4657 0.0347954 -0.0569954 0.159849 +VERTEX3 901 98.3941 26.5844 27.7623 0.0204176 -0.0585735 0.169055 +VERTEX3 902 96.7939 31.33 27.6178 0.00393892 -0.051798 0.196495 +VERTEX3 903 95.3227 37.4575 27.8083 -0.0122295 -0.0354355 0.203057 +VERTEX3 904 93.6451 41.2732 27.4248 -0.00562051 -0.0148934 0.228244 +VERTEX3 905 92.0787 46.611 27.3374 -0.00684606 -0.00466384 0.248122 +VERTEX3 906 90.2291 49.1868 27.5153 -0.00871402 0.00695026 0.242556 +VERTEX3 907 89.2189 50.748 27.3696 -0.00497306 0.0053735 0.265452 +VERTEX3 908 88.5949 49.5354 27.8253 0.000800117 -0.0152455 0.251022 +VERTEX3 909 87.696 50.514 27.5513 -0.000499234 -0.0200351 0.256319 +VERTEX3 910 86.4485 50.842 27.4135 0.00215842 -0.0326726 0.268397 +VERTEX3 911 86.1179 47.5161 26.6507 -0.024731 -0.0187803 0.242995 +VERTEX3 912 84.1803 49.8089 27.0392 -0.00350032 -0.0206321 0.276078 +VERTEX3 913 83.3772 51.8799 26.4659 -0.00098724 -0.00835962 0.297469 +VERTEX3 914 84.2711 42.5083 26.7628 0.00197912 -0.0198422 0.261959 +VERTEX3 915 83.2214 36.1383 26.4487 -0.00715951 -0.00534549 0.273038 +VERTEX3 916 82.7248 28.2329 26.5524 0.00686666 0.0135867 0.250236 +VERTEX3 917 82.004 19.3581 26.4645 -0.00259301 3.37616e-05 0.25819 +VERTEX3 918 80.7598 5.48385 26.1246 -0.0165318 0.0283876 0.242756 +VERTEX3 919 79.5061 0.161512 25.7498 -0.0474137 0.0421985 0.230616 +VERTEX3 920 77.2335 3.4575 25.8813 -0.0580096 0.064044 0.253739 +VERTEX3 921 75.2369 6.21816 25.6306 -0.0558128 0.0696474 0.267353 +VERTEX3 922 74.729 6.12524 26.1387 -0.0112882 0.0465818 0.228773 +VERTEX3 923 74.7763 5.32272 26.2992 -0.00961688 0.0461016 0.183113 +VERTEX3 924 74.1887 5.84587 26.9443 -0.0120328 0.0474528 0.192645 +VERTEX3 925 73.7923 12.9829 26.8071 -0.0256166 0.0333401 0.214095 +VERTEX3 926 70.5068 -23.9748 27.4458 -0.0220276 0.0293106 -0.195783 +VERTEX3 927 71.0002 -16.9177 27.2483 -0.0486557 0.0191653 -0.177228 +VERTEX3 928 72.6177 -14.4514 26.9469 -0.0720108 0.00257769 -0.185961 +VERTEX3 929 72.6642 -13.1281 26.4097 -0.0706787 -0.000874428 -0.220108 +VERTEX3 930 73.2739 -12.897 25.7393 -0.0616737 0.00843685 -0.235995 +VERTEX3 931 74.3625 -10.6226 25.1135 -0.033418 0.0063125 -0.202982 +VERTEX3 932 77.0276 -11.6057 24.7292 -0.0341137 -0.0109173 -0.236747 +VERTEX3 933 77.4514 -13.0915 24.1891 0.00678828 -0.016098 -0.243817 +VERTEX3 934 79.2688 -12.9411 24.3967 0.0207257 -0.0301501 -0.25051 +VERTEX3 935 80.258 -14.2014 24.044 0.063558 0.0167009 -0.256097 +VERTEX3 936 81.8866 -18.6372 24.9904 0.0298731 0.0183804 -0.303167 +VERTEX3 937 81.5734 -15.7245 24.4312 0.00297667 0.0610712 -0.359949 +VERTEX3 938 85.2083 -14.222 24.8793 0.0203799 0.0210246 -0.327024 +VERTEX3 939 86.6159 -12.3723 24.7918 0.00223586 -0.00978514 -0.361085 +VERTEX3 940 89.3744 -13.0671 24.4751 -0.00222667 -0.0355754 -0.370197 +VERTEX3 941 91.5297 -9.89542 23.8795 0.029068 -0.0573822 -0.353279 +VERTEX3 942 94.2784 -10.7966 23.4896 0.0422989 -0.0729581 -0.358601 +VERTEX3 943 96.2205 -8.45915 23.3116 0.054727 -0.05195 -0.327713 +VERTEX3 944 98.6851 -6.26479 23.1983 0.0417263 -0.0564506 -0.298154 +VERTEX3 945 100.17 -0.707113 23.0248 0.0223145 -0.0535905 -0.228092 +VERTEX3 946 102.051 3.03715 22.8008 0.0109153 -0.0585798 -0.174902 +VERTEX3 947 103.034 7.38286 22.416 0.0158333 -0.0455272 -0.105752 +VERTEX3 948 103.484 12.4445 22.117 0.0324002 -0.0493337 -0.0189377 +VERTEX3 949 102.966 17.0734 21.89 0.0321838 -0.0470088 0.0641089 +VERTEX3 950 101.634 22.1744 21.6695 0.039753 -0.0508548 0.161744 +VERTEX3 951 99.9691 27.7668 21.9305 0.0289194 -0.0580206 0.176651 +VERTEX3 952 98.4302 32.5789 22.0205 0.0112354 -0.0610046 0.190675 +VERTEX3 953 96.8592 38.7446 21.8941 -0.000252529 -0.0501237 0.225524 +VERTEX3 954 95.089 43.5584 22.0336 -0.0124445 -0.0307544 0.225666 +VERTEX3 955 93.2025 48.7941 21.6299 -0.006095 -0.0104039 0.253492 +VERTEX3 956 91.5333 53.8134 21.5649 -0.00273945 0.000125013 0.279198 +VERTEX3 957 89.4803 54.6467 21.6549 -0.00486466 0.0106214 0.266477 +VERTEX3 958 88.8642 57.0889 21.5423 -0.00273128 0.00828965 0.286329 +VERTEX3 959 88.2896 54.3654 22.0496 0.00194709 -0.0167276 0.264563 +VERTEX3 960 87.3276 55.3366 21.741 0.000725331 -0.0220226 0.271184 +VERTEX3 961 86.5775 55.0778 21.6024 0.00362258 -0.0340009 0.281346 +VERTEX3 962 86.2539 52.5494 20.6746 -0.0236411 -0.0170783 0.257171 +VERTEX3 963 84.399 51.4208 21.1235 -0.00102338 -0.0123666 0.300273 +VERTEX3 964 83.1278 55.0209 20.4727 -0.00582745 -0.0154827 0.325112 +VERTEX3 965 84.6683 42.004 20.8796 -0.00994202 -0.0276856 0.266623 +VERTEX3 966 83.5542 39.0583 20.679 -0.00286224 -0.00905735 0.292355 +VERTEX3 967 82.9071 30.7273 20.6806 0.00493734 0.00650257 0.270891 +VERTEX3 968 81.8305 19.3204 20.5695 -0.00277313 -0.00169787 0.268242 +VERTEX3 969 80.3722 4.7429 20.1538 -0.0119651 0.0310861 0.265732 +VERTEX3 970 78.6845 1.92812 19.7029 -0.0497548 0.0486225 0.277158 +VERTEX3 971 77.2026 2.05097 20.3088 -0.0445525 0.0541222 0.261656 +VERTEX3 972 74.9811 6.41803 20.0193 -0.0186081 0.0489899 0.262336 +VERTEX3 973 74.3459 6.75042 20.4866 -0.00436457 0.0625445 0.247019 +VERTEX3 974 74.7373 4.54161 20.8993 -0.000237355 0.0625423 0.217772 +VERTEX3 975 74.2481 6.98282 21.4618 -0.0114457 0.043441 0.231035 +VERTEX3 976 71.3154 -17.9418 21.5599 -0.0134231 0.0637925 -0.0799272 +VERTEX3 977 72.4889 -15.2809 21.4502 -0.084949 -0.0167412 -0.231205 +VERTEX3 978 71.8983 -16.0828 21.2591 -0.0722491 -0.0197962 -0.197553 +VERTEX3 979 72.3665 -16.5163 20.5118 -0.0592749 0.0223235 -0.236633 +VERTEX3 980 73.4875 -10.7543 19.5943 -0.0420552 0.0163662 -0.18926 +VERTEX3 981 75.7206 -13.2541 19.2045 -0.0507122 0.000988665 -0.224742 +VERTEX3 982 76.605 -13.6306 18.5088 0.000383505 -0.0251016 -0.223081 +VERTEX3 983 77.8688 -15.8177 18.6647 0.00806814 -0.0306323 -0.232068 +VERTEX3 984 79.3684 -15.9341 18.2883 0.0581428 -0.00737198 -0.245057 +VERTEX3 985 81.0947 -22.0888 19.3175 0.0254135 0.0081612 -0.298464 +VERTEX3 986 80.0695 -19.5136 18.748 0.0165622 0.0598972 -0.348013 +VERTEX3 987 83.4792 -18.3581 18.9665 0.0208834 0.0231857 -0.324326 +VERTEX3 988 84.7701 -15.0997 18.9671 0.00312498 -0.0136693 -0.363368 +VERTEX3 989 87.5586 -16.7254 18.6985 -0.00305111 -0.0361276 -0.378381 +VERTEX3 990 89.909 -13.6044 18.0683 0.0310584 -0.0622628 -0.38263 +VERTEX3 991 92.7955 -12.9515 17.6429 0.0443947 -0.0800941 -0.386392 +VERTEX3 992 94.6637 -11.9511 17.3596 0.0639286 -0.0553061 -0.373527 +VERTEX3 993 97.5529 -9.58343 17.2539 0.0544127 -0.0550978 -0.346805 +VERTEX3 994 99.3036 -5.16331 17.1218 0.0355688 -0.0523035 -0.30214 +VERTEX3 995 101.934 -0.992612 17.0735 0.0166943 -0.0547902 -0.228097 +VERTEX3 996 103.385 3.71844 16.8065 0.0193303 -0.0424914 -0.173705 +VERTEX3 997 104.588 8.78346 16.363 0.03407 -0.0440226 -0.0908203 +VERTEX3 998 104.842 13.019 16.157 0.0287244 -0.0372216 -0.0220955 +VERTEX3 999 104.312 18.0013 15.9781 0.0351795 -0.0322261 0.0506716 +VERTEX3 1000 103.059 23.5471 15.7369 0.0567426 -0.0347185 0.142488 +VERTEX3 1001 101.478 29.4407 16.0243 0.0362124 -0.0550921 0.173532 +VERTEX3 1002 99.6448 34.2147 16.1992 0.0211697 -0.0580943 0.196127 +VERTEX3 1003 98.033 39.0053 16.0925 0.00387875 -0.0572551 0.213185 +VERTEX3 1004 96.2053 45.5429 15.9275 -0.00531061 -0.0460444 0.245362 +VERTEX3 1005 94.3354 49.5051 16.137 -0.0139756 -0.0260709 0.247183 +VERTEX3 1006 92.2028 54.8705 15.6485 -0.00589873 -0.00394912 0.276759 +VERTEX3 1007 90.5383 57.7502 15.5878 0.00153185 0.00349447 0.294959 +VERTEX3 1008 88.446 60.2033 15.6233 -0.00327507 0.0143891 0.287386 +VERTEX3 1009 87.9058 62.2535 15.6966 0.000199508 0.011241 0.300907 +VERTEX3 1010 87.5657 61.9897 16.267 0.00327557 -0.0134803 0.282594 +VERTEX3 1011 87.2116 60.8158 15.9751 0.00302768 -0.0227211 0.281374 +VERTEX3 1012 85.8404 59.7814 15.6865 0.00512056 -0.0338918 0.294016 +VERTEX3 1013 85.9062 56.5297 14.5287 -0.0264257 -0.0179655 0.267583 +VERTEX3 1014 83.489 58.8127 15.1612 -0.00549742 -0.0229229 0.313435 +VERTEX3 1015 82.3266 60.3477 14.4305 -0.00508877 -0.0253363 0.340382 +VERTEX3 1016 84.83 44.8781 15.153 -0.0068276 -0.0289127 0.280193 +VERTEX3 1017 83.1924 43.9899 14.8601 -0.0177938 -0.0239789 0.308191 +VERTEX3 1018 82.2075 29.5092 14.8343 0.00792855 0.00633603 0.270182 +VERTEX3 1019 80.7783 19.4151 14.6167 -0.00438154 -0.00178099 0.286908 +VERTEX3 1020 79.6416 5.31413 14.2246 -0.0103099 0.0314893 0.280166 +VERTEX3 1021 78.0447 1.75878 14.1411 -0.0511027 0.0525858 0.313705 +VERTEX3 1022 76.6016 2.73504 14.6745 -0.0307107 0.045673 0.283702 +VERTEX3 1023 74.2846 7.07883 14.3983 0.0417928 0.0366766 0.308824 +VERTEX3 1024 74.6987 3.82253 15.2711 -0.0125278 0.0603764 0.253178 +VERTEX3 1025 74.56 5.55644 15.5142 -0.0222571 0.0430691 0.262186 +VERTEX3 1026 72.0891 -16.3254 15.6669 0.0272022 0.103421 0.204902 +VERTEX3 1027 70.8741 -16.9322 16.4689 -0.154163 0.0665954 -0.131188 +VERTEX3 1028 71.1441 -17.7772 15.1644 -0.0623474 0.0269729 -0.197359 +VERTEX3 1029 72.2123 -16.9733 14.5827 -0.0835868 0.030437 -0.203723 +VERTEX3 1030 74.2312 -16.9886 13.7905 -0.065445 0.0213744 -0.233468 +VERTEX3 1031 75.777 -14.4302 13.1075 -0.033349 -0.0461558 -0.161794 +VERTEX3 1032 76.6549 -16.9379 13.0264 -0.00292766 -0.0266126 -0.209676 +VERTEX3 1033 78.0858 -19.2748 12.7828 0.0471608 -0.018565 -0.222569 +VERTEX3 1034 78.9553 -24.7999 13.6334 0.0143672 -0.00147636 -0.288723 +VERTEX3 1035 77.9972 -21.969 12.9853 0.00345983 0.0605983 -0.352317 +VERTEX3 1036 81.8997 -18.3567 13.1205 0.014137 0.0173411 -0.301855 +VERTEX3 1037 82.7793 -18.1004 13.0889 -0.00268413 -0.0229934 -0.365076 +VERTEX3 1038 85.4287 -18.4498 12.8427 -0.00325741 -0.0366004 -0.380648 +VERTEX3 1039 87.5612 -17.857 12.0295 0.032071 -0.0646141 -0.402586 +VERTEX3 1040 90.576 -16.3985 11.568 0.0515019 -0.083921 -0.416585 +VERTEX3 1041 92.4336 -15.182 11.4057 0.071597 -0.0575257 -0.40918 +VERTEX3 1042 95.5028 -11.6297 11.3424 0.05789 -0.0509776 -0.376418 +VERTEX3 1043 97.7294 -7.96817 11.2854 0.0410403 -0.0493845 -0.335244 +VERTEX3 1044 100.657 -5.58522 11.1742 0.0283111 -0.0516512 -0.304338 +VERTEX3 1045 102.686 0.195165 11.0102 0.0243595 -0.0385792 -0.222763 +VERTEX3 1046 104.604 3.92122 10.6118 0.0334331 -0.0370405 -0.173662 +VERTEX3 1047 105.453 8.3456 10.3802 0.0268666 -0.0259976 -0.110039 +VERTEX3 1048 105.663 13.265 10.152 0.033592 -0.0257298 -0.0378955 +VERTEX3 1049 105.281 18.6176 10.0071 0.0547692 -0.0161271 0.033409 +VERTEX3 1050 104.049 25.1756 9.83788 0.0524174 -0.0298727 0.117444 +VERTEX3 1051 102.433 30.7741 10.1642 0.0469431 -0.0414216 0.152721 +VERTEX3 1052 100.783 36.3091 10.2324 0.029336 -0.0583167 0.185222 +VERTEX3 1053 98.7084 41.2081 10.3377 0.0108505 -0.0612033 0.20879 +VERTEX3 1054 97.1854 46.8218 10.1862 -0.00209071 -0.0494368 0.239328 +VERTEX3 1055 94.9752 51.6894 9.88676 -0.0110411 -0.0403209 0.263726 +VERTEX3 1056 93.052 56.1167 10.1402 -0.0133659 -0.0190963 0.271172 +VERTEX3 1057 90.8342 59.7553 9.58889 -0.00735591 0.00678266 0.293863 +VERTEX3 1058 89.0091 63.083 9.56128 0.00330238 0.00618845 0.310975 +VERTEX3 1059 87.0242 67.8012 9.80051 -0.0016365 0.0202865 0.304731 +VERTEX3 1060 86.5918 67.3307 9.72973 0.00461268 0.0123604 0.311799 +VERTEX3 1061 86.1976 67.4326 10.4486 0.00288173 -0.0122339 0.298519 +VERTEX3 1062 86.0268 64.5473 9.9268 0.00700723 -0.0206937 0.291 +VERTEX3 1063 85.3206 63.8789 9.76569 0.00600014 -0.0349044 0.309439 +VERTEX3 1064 85.1126 58.1053 8.56229 -0.0279744 -0.0185489 0.275693 +VERTEX3 1065 83.1152 61.2275 9.29973 -0.00611334 -0.0219216 0.339296 +VERTEX3 1066 82.4299 60.9155 8.54346 -0.00798345 -0.0145973 0.340313 +VERTEX3 1067 84.1484 48.5787 9.09265 -0.00414128 -0.0286877 0.297156 +VERTEX3 1068 82.469 43.3929 8.92641 -0.0103722 -0.0307413 0.323927 +VERTEX3 1069 80.6045 29.4122 8.82315 0.00495913 0.00138174 0.274921 +VERTEX3 1070 79.5957 26.1971 8.815 -0.00771985 0.00143876 0.323087 +VERTEX3 1071 78.4377 6.60274 8.54425 -0.0116461 0.0278558 0.294852 +VERTEX3 1072 77.0218 1.83283 8.45629 -0.052328 0.0523211 0.323391 +VERTEX3 1073 75.7967 3.73625 9.16428 -0.0397738 0.0295847 0.282703 +VERTEX3 1074 73.733 7.00582 8.95756 -0.0426107 0.0816772 0.41614 +VERTEX3 1075 74.297 3.0349 9.59858 -0.0118396 0.0498902 0.380706 +VERTEX3 1076 70.9067 -14.1333 9.97449 0.0527306 0.0913325 0.248182 +VERTEX3 1077 69.0805 -17.4387 9.78211 -0.0504505 0.0247129 -0.103869 +VERTEX3 1078 69.6357 -16.2457 8.99165 -0.0745709 0.0402424 -0.163997 +VERTEX3 1079 73.0864 -14.2112 8.25149 -0.0474728 0.0427071 -0.170023 +VERTEX3 1080 74.0658 -12.5749 7.58748 -0.0595483 -0.0277258 -0.105523 +VERTEX3 1081 75.4478 -15.9866 7.35953 -0.0297052 -0.0120624 -0.172575 +VERTEX3 1082 76.7504 -19.3263 7.06845 0.0229341 -0.0332858 -0.200387 +VERTEX3 1083 77.9899 -24.6449 7.84722 0.00251242 -0.0101493 -0.264447 +VERTEX3 1084 75.9264 -23.7363 7.19821 -0.00025484 0.0556789 -0.343579 +VERTEX3 1085 79.925 -20.4486 7.16773 0.0176384 0.0109517 -0.289693 +VERTEX3 1086 80.5511 -19.5898 7.08443 -0.00963365 -0.0201353 -0.358975 +VERTEX3 1087 82.8584 -21.2152 6.94671 -0.00401899 -0.0330954 -0.389398 +VERTEX3 1088 85.04 -18.6722 6.0578 0.0307829 -0.0654615 -0.400692 +VERTEX3 1089 88.1031 -19.2311 5.57463 0.0540056 -0.0871013 -0.435743 +VERTEX3 1090 90.031 -16.6817 5.37282 0.0753514 -0.0588239 -0.430361 +VERTEX3 1091 93.0947 -14.4129 5.35833 0.0619494 -0.0480571 -0.405873 +VERTEX3 1092 95.5905 -10.8537 5.41744 0.0476138 -0.0453734 -0.375658 +VERTEX3 1093 98.7482 -8.94825 5.2924 0.0310372 -0.0480703 -0.341183 +VERTEX3 1094 101.064 -3.92651 5.18875 0.0250489 -0.0328766 -0.280168 +VERTEX3 1095 103.394 -0.216954 4.79049 0.0313675 -0.0296326 -0.249139 +VERTEX3 1096 104.772 3.48071 4.44237 0.0263016 -0.0163983 -0.18878 +VERTEX3 1097 105.758 8.53782 4.22271 0.0335165 -0.0185501 -0.119101 +VERTEX3 1098 106.029 13.2948 4.09344 0.0515731 -0.00311782 -0.0543766 +VERTEX3 1099 105.556 20.0903 4.0138 0.060231 -0.00562593 0.0208155 +VERTEX3 1100 104.581 26.8045 3.8212 0.0534378 0.00738774 0.0788925 +VERTEX3 1101 103.061 32.6529 4.18499 0.0352346 -0.0286862 0.124853 +VERTEX3 1102 101.343 38.017 4.40792 0.0342876 -0.0455287 0.166797 +VERTEX3 1103 99.4872 43.178 4.41695 0.0205583 -0.0592937 0.200461 +VERTEX3 1104 97.4773 48.9336 4.45999 0.0035384 -0.0514108 0.231046 +VERTEX3 1105 95.7011 52.4884 4.10206 -0.0139579 -0.050723 0.249699 +VERTEX3 1106 93.3739 58.63 3.76858 -0.0151554 -0.0347248 0.288613 +VERTEX3 1107 91.166 62.1013 3.96115 -0.0134389 -0.0127829 0.295347 +VERTEX3 1108 89.1375 65.1188 3.53013 -0.00710201 0.014834 0.31449 +VERTEX3 1109 87.0454 68.7599 3.64186 0.00635931 0.0110297 0.326754 +VERTEX3 1110 85.3282 71.4602 3.74147 0.00504343 0.0207078 0.324972 +VERTEX3 1111 84.8627 72.5008 3.76079 0.00561304 0.0140077 0.324679 +VERTEX3 1112 84.5908 71.1852 4.48655 0.00442932 -0.012333 0.310984 +VERTEX3 1113 84.059 69.2736 4.03383 0.00875011 -0.0186635 0.302126 +VERTEX3 1114 83.8852 66.842 3.80061 0.00478991 -0.0359672 0.316757 +VERTEX3 1115 84.5278 61.7495 2.52458 -0.0308112 -0.0147507 0.288066 +VERTEX3 1116 82.4167 63.2503 3.55227 -0.00851416 -0.0324323 0.348165 +VERTEX3 1117 82.1822 60.3009 2.79166 -0.00855047 -0.0224177 0.345507 +VERTEX3 1118 84.0394 46.4225 3.35743 -0.00731408 -0.0300463 0.299373 +VERTEX3 1119 81.6301 36.1146 3.05559 -0.0120528 -0.00461644 0.318332 +VERTEX3 1120 79.6203 27.9383 3.24562 0.0172242 0.00450319 0.265146 +VERTEX3 1121 78.3271 22.9335 3.24499 -0.0092568 -0.00474733 0.305913 +VERTEX3 1122 78.1991 5.30328 3.17077 -0.011837 0.00675399 0.25816 +VERTEX3 1123 76.3549 -0.405883 3.05963 -0.0571119 0.0504622 0.336787 +VERTEX3 1124 75.1435 3.27147 3.66389 -0.043601 0.0304841 0.436928 +VERTEX3 1125 73.9272 3.68146 3.54846 -0.0259989 0.0405054 0.454005 +VERTEX3 1126 71.0879 -10.9191 3.99045 -0.0016906 0.0275773 0.28656 +VERTEX3 1127 68.6473 -12.6955 3.58655 0.0099481 0.0416466 -0.0335375 +VERTEX3 1128 71.9007 -13.5569 3.05133 -0.0283895 0.0554242 -0.104567 +VERTEX3 1129 71.9901 -13.6566 2.71191 -0.108653 0.0218727 -0.0324667 +VERTEX3 1130 74.031 -15.9882 1.91786 -0.0422108 -0.0134503 -0.149036 +VERTEX3 1131 74.9646 -17.9905 1.37685 0.00526312 -0.0207965 -0.159201 +VERTEX3 1132 76.0395 -23.4177 2.02514 -0.0134217 -0.018847 -0.236866 +VERTEX3 1133 74.7787 -22.1051 1.22647 0.00604903 0.039518 -0.319973 +VERTEX3 1134 77.4737 -24.0712 1.30703 0.035623 0.0111688 -0.292155 +VERTEX3 1135 78.0862 -22.4798 1.0933 -0.0194445 -0.0321828 -0.348415 +VERTEX3 1136 80.2091 -24.9782 1.10302 -0.00483399 -0.0334551 -0.38956 +VERTEX3 1137 82.2607 -20.646 0.23251 0.0312612 -0.0682335 -0.402618 +VERTEX3 1138 84.9077 -20.8653 -0.537811 0.056931 -0.0855173 -0.45037 +VERTEX3 1139 87.1853 -18.5195 -0.728383 0.0769378 -0.0582693 -0.441679 +VERTEX3 1140 90.1044 -15.4329 -0.638816 0.0613566 -0.0463688 -0.419436 +VERTEX3 1141 92.5887 -13.8735 -0.621585 0.0528772 -0.0417371 -0.425673 +VERTEX3 1142 96.2038 -12.6049 -0.584942 0.035596 -0.0427828 -0.381603 +VERTEX3 1143 98.4432 -8.99375 -0.68372 0.0200583 -0.0316375 -0.347512 +VERTEX3 1144 101.126 -6.34696 -1.02383 0.0275621 -0.0204383 -0.322799 +VERTEX3 1145 103.201 -0.923875 -1.36371 0.022547 -0.00815101 -0.253114 +VERTEX3 1146 104.595 3.68673 -1.63136 0.0274021 -0.00522803 -0.2048 +VERTEX3 1147 105.573 8.76577 -1.84308 0.0481215 0.00494724 -0.123455 +VERTEX3 1148 105.639 15.2591 -1.88183 0.0563773 0.00680422 -0.0623659 +VERTEX3 1149 105.195 21.5064 -2.00729 0.054831 0.0119975 0.0015033 +VERTEX3 1150 104.508 28.1927 -2.12129 0.0049771 0.029859 0.0484415 +VERTEX3 1151 103.092 33.8413 -1.799 0.0283991 0.00509983 0.104623 +VERTEX3 1152 101.398 39.1976 -1.68573 0.0251964 -0.0298118 0.141874 +VERTEX3 1153 99.6027 44.1795 -1.53527 0.0182617 -0.0485243 0.184597 +VERTEX3 1154 97.6904 49.6092 -1.60859 0.0121987 -0.0561152 0.216082 +VERTEX3 1155 95.5441 54.5546 -1.64772 -0.00536375 -0.0494701 0.248361 +VERTEX3 1156 94.025 60.5839 -2.10452 -0.0192926 -0.0413509 0.272868 +VERTEX3 1157 91.4493 64.739 -2.2575 -0.0213773 -0.0256094 0.310542 +VERTEX3 1158 89.0697 67.7992 -2.14752 -0.013674 -0.00646633 0.314417 +VERTEX3 1159 86.899 72.2487 -2.50285 -0.00422663 0.0198423 0.339628 +VERTEX3 1160 84.7941 74.1652 -2.35951 0.0113365 0.0145124 0.348647 +VERTEX3 1161 83.0857 76.5472 -2.12889 0.00386896 0.0264215 0.335954 +VERTEX3 1162 82.989 76.5902 -2.22657 0.00520651 0.0165107 0.33695 +VERTEX3 1163 82.7849 74.6372 -1.44042 0.00839239 -0.0102914 0.317774 +VERTEX3 1164 82.7661 71.4096 -1.82946 0.00923791 -0.0149831 0.314195 +VERTEX3 1165 82.7714 69.9164 -1.98034 0.00719829 -0.0350717 0.32419 +VERTEX3 1166 83.7627 64.4632 -3.25862 -0.0314086 -0.0129482 0.289852 +VERTEX3 1167 81.6488 64.0252 -2.2093 -0.00752771 -0.0355216 0.360283 +VERTEX3 1168 81.3882 59.5914 -2.9805 -0.0101715 -0.0197099 0.341856 +VERTEX3 1169 82.8554 44.8109 -2.39364 -0.0123337 -0.0297559 0.300386 +VERTEX3 1170 80.8064 38.4605 -2.66169 -0.00519611 -0.0178147 0.317418 +VERTEX3 1171 78.7458 26.5639 -2.41208 0.024552 0.00968293 0.255371 +VERTEX3 1172 77.4778 23.0638 -2.2884 -0.011729 -0.000211783 0.264963 +VERTEX3 1173 77.7003 2.42224 -2.48002 -0.00923401 -0.0300511 0.19307 +VERTEX3 1174 74.9559 -5.65046 -1.9815 -0.0304413 0.00785309 0.109905 +VERTEX3 1175 74.8007 -4.6826 -1.94116 -0.01422 0.0223402 0.24615 +VERTEX3 1176 71.19 -6.58172 -1.79388 0.0254262 0.0383313 0.343171 +VERTEX3 1177 71.2102 -8.99473 -2.24042 0.0494784 0.0556124 0.108021 +VERTEX3 1178 69.9164 -11.9516 -2.28158 -0.244774 0.183036 0.0554382 +VERTEX3 1179 72.3187 -14.8375 -3.46759 -0.0528585 0.000143584 -0.0951997 +VERTEX3 1180 72.3564 -14.3747 -4.2234 -0.0318443 -0.0158956 -0.12011 +VERTEX3 1181 73.6601 -21.7836 -3.83033 -0.0284435 -0.0351781 -0.20329 +VERTEX3 1182 72.367 -21.6338 -4.58437 0.0102437 0.0215603 -0.296056 +VERTEX3 1183 75.3178 -21.8377 -4.4979 0.0363644 0.000101474 -0.255328 +VERTEX3 1184 75.8572 -23.7876 -4.66691 -0.0129793 -0.031842 -0.328701 +VERTEX3 1185 77.3953 -24.3165 -4.70552 -0.00278642 -0.0288893 -0.354624 +VERTEX3 1186 79.0313 -21.206 -5.55861 0.0345001 -0.0835213 -0.397493 +VERTEX3 1187 81.8557 -23.0224 -6.45638 0.0569626 -0.0848289 -0.442944 +VERTEX3 1188 83.8299 -19.7487 -6.5691 0.0767704 -0.0590772 -0.444839 +VERTEX3 1189 86.7369 -19.682 -6.66512 0.0676505 -0.0536447 -0.457568 +VERTEX3 1190 88.7403 -19.022 -6.48968 0.0560508 -0.0387112 -0.483934 +VERTEX3 1191 92.6238 -14.4447 -6.45597 0.0382809 -0.0384081 -0.410918 +VERTEX3 1192 95.4547 -13.3407 -6.347 0.0172319 -0.0271912 -0.39596 +VERTEX3 1193 98.3728 -7.81299 -6.83 0.0254097 -0.0117048 -0.348058 +VERTEX3 1194 100.653 -4.04911 -7.18494 0.0205976 -0.00231736 -0.309434 +VERTEX3 1195 102.522 -0.111635 -7.40569 0.0270601 0.000834624 -0.262415 +VERTEX3 1196 104.081 4.91688 -7.65039 0.0444182 0.013127 -0.189849 +VERTEX3 1197 104.559 9.9534 -7.70826 0.0568354 0.0180718 -0.141309 +VERTEX3 1198 104.616 16.2397 -7.87332 0.0574717 0.0143763 -0.0728839 +VERTEX3 1199 104.4 22.3491 -7.77876 0.0121502 0.0194916 -0.0158936 +VERTEX3 1200 103.843 29.1796 -8.08152 -0.0222252 0.0443297 0.0251871 +VERTEX3 1201 102.725 35.1721 -7.87865 0.0111388 0.0154574 0.0793328 +VERTEX3 1202 101.052 40.4 -7.63602 0.015829 -0.00256088 0.132833 +VERTEX3 1203 99.4174 46.1929 -7.51763 0.0144497 -0.0302346 0.168078 +VERTEX3 1204 97.4595 50.9988 -7.50154 0.00324392 -0.0460781 0.200278 +VERTEX3 1205 95.4946 56.5468 -7.592 0.00129658 -0.0551516 0.235621 +VERTEX3 1206 93.3879 61.7356 -7.77506 -0.0118536 -0.0425861 0.269998 +VERTEX3 1207 91.5268 65.374 -8.25697 -0.0263303 -0.0374612 0.286493 +VERTEX3 1208 88.9754 70.1111 -8.48761 -0.0224097 -0.0200942 0.32525 +VERTEX3 1209 86.435 72.7001 -8.42822 -0.0117433 -0.00129605 0.333494 +VERTEX3 1210 83.9232 79.9047 -8.28781 0.00143508 0.0235472 0.364819 +VERTEX3 1211 82.3857 79.4995 -8.14862 0.0129676 0.017167 0.363883 +VERTEX3 1212 80.7115 81.8337 -8.00759 0.00456137 0.0289059 0.35001 +VERTEX3 1213 81.3761 78.8663 -8.12064 0.0036436 0.0205111 0.347022 +VERTEX3 1214 81.2059 77.3703 -7.26258 0.00858498 -0.00522576 0.324095 +VERTEX3 1215 81.2077 75.675 -7.53534 0.0078726 -0.0173893 0.328179 +VERTEX3 1216 81.8475 72.3103 -7.73306 0.0148957 -0.0380784 0.331014 +VERTEX3 1217 83.3369 61.5672 -8.92893 -0.03144 -0.0168632 0.287905 +VERTEX3 1218 80.3288 65.004 -7.97729 0.00179872 -0.0219542 0.376629 +VERTEX3 1219 80.6719 52.7105 -8.84282 -0.0153042 -0.0128739 0.325965 +VERTEX3 1220 81.1243 43.1771 -8.22468 -0.0175829 -0.0374032 0.303956 +VERTEX3 1221 79.2687 31.1219 -8.37012 -0.00311982 -0.00471273 0.314959 +VERTEX3 1222 77.7435 18.1455 -8.31572 -0.00486642 -0.00103523 0.24348 +VERTEX3 1223 76.4913 3.9214 -8.02426 0.00616318 0.00724347 0.134074 +VERTEX3 1224 76.8507 -7.39855 -8.24748 0.0225994 -0.0675278 0.0804446 +VERTEX3 1225 74.5392 -12.2109 -7.86857 -0.0277796 -0.00889509 0.103939 +VERTEX3 1226 72.8447 -7.79649 -7.77953 0.00467399 0.0094727 0.320118 +VERTEX3 1227 68.4314 -9.79474 -7.85742 0.106297 0.13256 0.245586 +VERTEX3 1228 70.4801 -15.4665 -8.25776 -0.0298713 0.0267168 0.0278861 +VERTEX3 1229 70.304 -16.9267 -8.87985 -0.172882 -0.10602 -0.0553573 +VERTEX3 1230 71.4626 -20.9224 -9.36886 -0.0442628 -0.0391052 -0.153547 +VERTEX3 1231 71.3899 -22.735 -10.3921 0.033463 -0.0246688 -0.232201 +VERTEX3 1232 74.3376 -23.2969 -10.0983 0.0350362 -0.0267105 -0.208303 +VERTEX3 1233 73.9003 -24.9648 -10.6262 0.00436445 -0.0346488 -0.305409 +VERTEX3 1234 74.863 -27.8742 -10.5354 0.000231151 -0.0329434 -0.36957 +VERTEX3 1235 76.269 -21.8104 -11.2598 0.0354941 -0.0726451 -0.390089 +VERTEX3 1236 78.7359 -23.8755 -12.335 0.0541377 -0.0762931 -0.426262 +VERTEX3 1237 80.3579 -20.6291 -12.4358 0.0706984 -0.0636366 -0.431544 +VERTEX3 1238 83.1522 -20.6376 -12.4364 0.063751 -0.0544011 -0.462854 +VERTEX3 1239 84.9823 -21.3294 -12.2842 0.0546657 -0.0359992 -0.51037 +VERTEX3 1240 88.8323 -16.6923 -12.1486 0.0367786 -0.0350916 -0.45254 +VERTEX3 1241 91.8436 -13.932 -12.039 0.00987791 -0.0201408 -0.421532 +VERTEX3 1242 94.6722 -11.6554 -12.5001 0.0177186 -0.00605775 -0.422882 +VERTEX3 1243 97.0659 -9.30018 -12.8274 0.0142468 0.00518579 -0.366077 +VERTEX3 1244 99.3893 -4.22684 -13.2085 0.0204033 0.0112127 -0.324095 +VERTEX3 1245 101.399 0.685483 -13.4528 0.0419652 0.0262226 -0.259598 +VERTEX3 1246 102.394 5.67334 -13.5837 0.0524014 0.020915 -0.210373 +VERTEX3 1247 102.975 10.8643 -13.6766 0.0620211 0.015636 -0.141583 +VERTEX3 1248 103.18 16.7522 -13.4299 0.0253194 0.00519764 -0.0824193 +VERTEX3 1249 103.059 23.3656 -13.5369 -0.0111815 0.0178306 -0.0378081 +VERTEX3 1250 102.808 30.1016 -13.9724 -0.0351439 0.0340978 0.0195871 +VERTEX3 1251 101.737 35.837 -13.9076 -0.00507266 0.0257768 0.0631085 +VERTEX3 1252 100.339 41.7433 -13.6094 0.0109674 0.00499879 0.109786 +VERTEX3 1253 98.6079 47.3103 -13.4714 0.0100093 -0.0096757 0.160022 +VERTEX3 1254 96.7215 52.3238 -13.4062 0.00667019 -0.0318488 0.194675 +VERTEX3 1255 94.8292 57.3973 -13.4875 -0.00900545 -0.0469279 0.223037 +VERTEX3 1256 92.8733 63.1951 -13.6297 -0.00750391 -0.0526985 0.254019 +VERTEX3 1257 90.6304 67.5191 -13.9199 -0.0200651 -0.0340821 0.293177 +VERTEX3 1258 89.26 70.9867 -14.5062 -0.0336553 -0.0346251 0.299157 +VERTEX3 1259 86.2376 74.4509 -14.687 -0.0223353 -0.0133562 0.339903 +VERTEX3 1260 83.7456 77.5298 -14.301 -0.0127067 0.0042866 0.348598 +VERTEX3 1261 80.8097 83.5533 -14.1857 0.00339609 0.0289195 0.381964 +VERTEX3 1262 79.8981 82.9545 -14.163 0.0222862 0.0205641 0.385028 +VERTEX3 1263 77.9405 83.858 -13.9108 0.00856015 0.0331153 0.360828 +VERTEX3 1264 79.0054 80.1391 -13.8371 0.00253496 0.0285421 0.348501 +VERTEX3 1265 79.2694 79.6859 -13.0246 0.00904043 0.00253342 0.332408 +VERTEX3 1266 78.8514 81.3109 -13.246 0.00929292 -0.0156473 0.341458 +VERTEX3 1267 80.4501 75.1182 -13.4117 0.0205318 -0.0299432 0.339813 +VERTEX3 1268 81.5368 66.5022 -14.9471 -0.0306462 -0.00562778 0.293715 +VERTEX3 1269 79.9173 63.396 -13.7231 -0.00327021 -0.0195656 0.360888 +VERTEX3 1270 79.9252 51.1734 -14.5626 -0.0187616 -0.00993927 0.317786 +VERTEX3 1271 80.6412 41.6909 -13.795 -0.0191426 -0.0382995 0.304714 +VERTEX3 1272 79.674 37.0047 -14.0273 -0.0266299 0.0129488 0.315192 +VERTEX3 1273 77.3278 13.6183 -14.2667 -0.0224451 -0.011642 0.216951 +VERTEX3 1274 75.4748 -0.0613323 -14.2328 0.00630963 -0.0114561 0.13767 +VERTEX3 1275 76.6455 -8.44618 -14.1607 0.0317513 -0.0257725 0.174075 +VERTEX3 1276 73.483 -15.7754 -13.7801 -0.0330723 -0.0153088 0.178813 +VERTEX3 1277 71.5966 -17.2679 -13.7028 -0.0108484 0.00864999 0.135935 +VERTEX3 1278 68.9605 -18.0136 -13.9107 0.0242787 0.143726 0.180315 +VERTEX3 1279 71.1862 -22.943 -14.4225 -0.049479 -0.0771943 -0.0841227 +VERTEX3 1280 71.1407 -23.5583 -16.1346 0.144646 -0.179537 0.000220692 +VERTEX3 1281 72.4185 -23.4654 -15.6694 0.0258126 -0.0590649 -0.147387 +VERTEX3 1282 71.5181 -24.3114 -16.5327 0.0459855 -0.0309742 -0.271359 +VERTEX3 1283 72.6632 -27.8453 -16.314 0.0218294 -0.0265078 -0.339001 +VERTEX3 1284 72.8953 -26.6179 -17.3429 0.0417885 -0.0731508 -0.384789 +VERTEX3 1285 75.3258 -22.6736 -17.9111 0.048001 -0.0688159 -0.377722 +VERTEX3 1286 77.0138 -22.1895 -18.1304 0.0737441 -0.0731059 -0.420926 +VERTEX3 1287 78.8563 -21.6363 -18.2697 0.0573669 -0.06393 -0.464765 +VERTEX3 1288 80.2678 -21.059 -18.041 0.0555 -0.0358356 -0.510032 +VERTEX3 1289 84.3793 -17.4774 -17.7173 0.0331607 -0.0338576 -0.449023 +VERTEX3 1290 87.2308 -15.8191 -17.4931 0.0101578 -0.0254895 -0.454049 +VERTEX3 1291 90.3805 -13.814 -17.929 0.0103168 -0.00450789 -0.458284 +VERTEX3 1292 92.8791 -11.9297 -18.307 0.0044327 0.0120635 -0.403689 +VERTEX3 1293 95.5848 -7.65435 -18.766 0.0171867 0.0163565 -0.36335 +VERTEX3 1294 97.8382 -4.35542 -19.1603 0.032991 0.0368721 -0.320033 +VERTEX3 1295 99.3616 1.15439 -19.3178 0.0469868 0.0230926 -0.275714 +VERTEX3 1296 100.461 6.37476 -19.3728 0.0630318 0.0188934 -0.200638 +VERTEX3 1297 101.043 11.8194 -19.0524 0.0421192 -0.00527413 -0.14787 +VERTEX3 1298 101.315 17.6241 -19.0168 0.000303335 -0.00165028 -0.100188 +VERTEX3 1299 101.425 23.9219 -19.221 -0.0265959 0.00511864 -0.0519599 +VERTEX3 1300 101.283 30.8625 -19.8178 -0.0532187 0.0323724 -0.0135793 +VERTEX3 1301 100.408 36.9034 -19.7367 -0.0221237 0.0259656 0.0488794 +VERTEX3 1302 99.0533 42.5839 -19.588 0.00417551 0.0133585 0.0961228 +VERTEX3 1303 97.5133 47.9993 -19.3305 0.00870615 -0.00463965 0.141514 +VERTEX3 1304 95.5213 52.9892 -19.2643 0.00160894 -0.0120312 0.184391 +VERTEX3 1305 93.7395 59.9752 -19.2817 -0.00428006 -0.0390388 0.230267 +VERTEX3 1306 91.7936 64.3215 -19.4239 -0.0193926 -0.0471674 0.246231 +VERTEX3 1307 89.7473 68.3839 -19.7273 -0.0155656 -0.0496626 0.276215 +VERTEX3 1308 87.1195 73.3173 -20.0351 -0.0270417 -0.0292455 0.310668 +VERTEX3 1309 85.9587 75.5201 -20.5774 -0.0405061 -0.0308533 0.315621 +VERTEX3 1310 82.4419 81.1381 -20.7155 -0.0257659 -0.00674696 0.367027 +VERTEX3 1311 80.3529 82.252 -20.366 -0.0139368 0.00826526 0.366177 +VERTEX3 1312 77.1359 86.5127 -20.0988 0.00347965 0.0351286 0.392889 +VERTEX3 1313 76.5156 86.4944 -19.8553 0.0238729 0.025273 0.402659 +VERTEX3 1314 75.2368 86.1415 -19.6173 0.00553657 0.0377597 0.369154 +VERTEX3 1315 76.263 82.6352 -19.7841 0.00535766 0.0316811 0.347463 +VERTEX3 1316 75.7055 86.6126 -18.4933 0.00582403 0.000440815 0.356588 +VERTEX3 1317 76.2845 84.4133 -18.8272 0.00932038 -0.00719141 0.34242 +VERTEX3 1318 78.4283 76.7918 -19.1619 0.0271662 -0.020743 0.342292 +VERTEX3 1319 79.8705 64.7422 -20.6589 -0.0353287 0.000272578 0.296196 +VERTEX3 1320 78.9279 62.2205 -19.4752 -0.00550534 -0.0139921 0.361319 +VERTEX3 1321 78.7001 51.1252 -20.1725 -0.0212203 -0.00554888 0.314568 +VERTEX3 1322 79.8174 42.1094 -19.5503 -0.00784157 -0.0399082 0.313338 +VERTEX3 1323 79.3245 33.7398 -19.9575 -0.0209771 0.0309024 0.275647 +VERTEX3 1324 76.7663 8.38749 -19.9387 0.0127331 0.00531526 0.1793 +VERTEX3 1325 75.403 -8.50678 -20.0295 0.0291059 -0.00195436 0.151744 +VERTEX3 1326 75.1101 -16.6737 -20.0672 0.0119601 0.0119183 0.171307 +VERTEX3 1327 70.4915 -22.4119 -19.3448 0.00772829 -0.0171968 0.006875 +VERTEX3 1328 70.5473 -24.1169 -19.6299 -0.0400066 0.0424437 0.235709 +VERTEX3 1329 68.5609 -27.4756 -20.4098 -0.143228 -0.0199764 0.100668 +VERTEX3 1330 70.2572 -23.2097 -21.3117 0.0114816 -0.0520322 -0.0594078 +VERTEX3 1331 69.4773 -24.1567 -22.628 0.223018 0.0711652 -0.137354 +VERTEX3 1332 70.519 -25.645 -21.8848 0.0630278 -0.0224552 -0.27251 +VERTEX3 1333 70.028 -26.7984 -23.0378 0.0521477 -0.0318274 -0.372528 +VERTEX3 1334 73.4555 -22.466 -23.2433 0.0574713 -0.055085 -0.346844 +VERTEX3 1335 73.7371 -22.1879 -23.5571 0.0824985 -0.0760087 -0.380702 +VERTEX3 1336 74.4275 -23.8008 -23.8412 0.0677453 -0.0776483 -0.472208 +VERTEX3 1337 76.1327 -21.9057 -23.6339 0.061827 -0.0321065 -0.500497 +VERTEX3 1338 79.915 -19.7609 -23.1794 0.0332315 -0.0375082 -0.458649 +VERTEX3 1339 82.2882 -18.5526 -22.7836 0.0118466 -0.0168059 -0.475353 +VERTEX3 1340 85.5458 -15.2193 -23.2839 0.0103312 -0.00511828 -0.47318 +VERTEX3 1341 88.2855 -12.4578 -23.5063 -0.0071372 0.013722 -0.424944 +VERTEX3 1342 90.7416 -10.8002 -24.0646 -0.000726261 0.0254574 -0.417428 +VERTEX3 1343 93.5212 -6.62188 -24.5628 0.0246902 0.0403493 -0.3592 +VERTEX3 1344 95.1479 -3.26831 -25.0228 0.042963 0.0393222 -0.336746 +VERTEX3 1345 97.1451 2.803 -24.9967 0.0567076 0.0257069 -0.248615 +VERTEX3 1346 98.0553 6.96242 -24.689 0.0547455 -0.00422754 -0.203856 +VERTEX3 1347 98.6139 12.3551 -24.4809 0.0284504 -0.0188159 -0.16331 +VERTEX3 1348 99.1425 18.5453 -24.5342 -0.00855181 -0.0177912 -0.113689 +VERTEX3 1349 99.2859 25.0951 -24.9369 -0.0394976 -0.00230053 -0.0774991 +VERTEX3 1350 99.1934 31.3636 -25.3675 -0.0635576 0.0150663 -0.029258 +VERTEX3 1351 98.5343 37.3796 -25.512 -0.0334968 0.027031 0.0253742 +VERTEX3 1352 97.4745 43.4306 -25.3384 -0.0114219 0.019827 0.0815107 +VERTEX3 1353 95.9164 48.9811 -25.1712 0.0078121 0.00796862 0.125119 +VERTEX3 1354 94.1486 53.8575 -25.0348 0.0026573 -0.0115853 0.171036 +VERTEX3 1355 92.0286 58.4139 -24.9997 -0.00249795 -0.0173898 0.211496 +VERTEX3 1356 90.0836 65.8756 -25.1693 -0.0142972 -0.0478136 0.262619 +VERTEX3 1357 88.2566 68.3545 -25.5241 -0.0259652 -0.0423123 0.265946 +VERTEX3 1358 86.0228 72.6682 -25.762 -0.0216215 -0.047334 0.299699 +VERTEX3 1359 83.4822 75.4046 -26.0334 -0.0341828 -0.0288618 0.321779 +VERTEX3 1360 81.9022 80.6545 -26.7792 -0.0459437 -0.0223319 0.33828 +VERTEX3 1361 78.7139 83.7704 -26.834 -0.025886 -0.00030478 0.383787 +VERTEX3 1362 76.8536 86.901 -26.1386 -0.0213267 0.0142978 0.379751 +VERTEX3 1363 74.3345 89.9396 -25.8483 0.00431052 0.0439694 0.400729 +VERTEX3 1364 73.3193 89.0602 -25.5207 0.0236476 0.0296516 0.413848 +VERTEX3 1365 72.8997 88.4662 -25.1117 -0.000823544 0.0441112 0.368777 +VERTEX3 1366 73.4024 85.7139 -25.3084 0.0100271 0.0364887 0.351837 +VERTEX3 1367 72.5856 89.2706 -24.0012 0.00576697 0.00594832 0.371969 +VERTEX3 1368 74.2332 84.9363 -24.5306 0.0138638 0.0074292 0.339855 +VERTEX3 1369 76.5277 75.714 -24.9532 0.0233447 -0.00661115 0.342878 +VERTEX3 1370 78.1913 65.4724 -26.1779 -0.031716 0.0154709 0.306381 +VERTEX3 1371 77.2495 61.9924 -25.27 -0.00379662 -0.0124099 0.35377 +VERTEX3 1372 77.3383 50.767 -25.6826 -0.0209697 -0.00118228 0.312195 +VERTEX3 1373 79.1097 42.0622 -25.2066 0.0130806 -0.0343648 0.304086 +VERTEX3 1374 78.1268 25.5176 -25.577 0.0309944 -0.0119889 0.206391 +VERTEX3 1375 75.8766 6.83724 -25.5522 -0.00760425 0.0143067 0.0794913 +VERTEX3 1376 75.5187 -8.84063 -25.7064 0.0269143 -0.00958516 0.26088 +VERTEX3 1377 74.1222 -21.818 -25.7371 -0.0025662 0.00917756 0.156186 +VERTEX3 1378 69.2992 -29.4657 -25.294 -0.0127597 -0.015665 0.143207 +VERTEX3 1379 69.7248 -25.2439 -26.8396 0.0274069 -0.0351142 0.224327 +VERTEX3 1380 69.3694 -22.7413 -27.9067 0.0133123 -0.15812 0.17486 +VERTEX3 1381 67.9744 -25.3842 -27.1695 0.0708595 -0.0328513 -0.155685 +VERTEX3 1382 67.0122 -25.7192 -28.0365 0.0249375 0.176853 -0.326856 +VERTEX3 1383 70.2703 -23.0832 -28.7005 0.0631188 -0.0267923 -0.331509 +VERTEX3 1384 70.616 -22.3494 -28.9414 0.0884913 -0.0559426 -0.35865 +VERTEX3 1385 71.2981 -23.2486 -29.0055 0.0643955 -0.0645951 -0.444657 +VERTEX3 1386 72.0034 -22.0017 -28.9124 0.0678631 -0.0166746 -0.478628 +VERTEX3 1387 75.6536 -21.5335 -28.7126 0.0358616 -0.0428282 -0.479667 +VERTEX3 1388 77.5055 -18.3072 -28.1804 0.0133852 -0.0162659 -0.482668 +VERTEX3 1389 80.4772 -17.5712 -28.4667 0.00959993 -0.0121629 -0.498398 +VERTEX3 1390 82.9138 -14.9443 -28.5427 -0.0236725 0.00714229 -0.458885 +VERTEX3 1391 85.6555 -12.13 -29.2649 -0.00823902 0.0243446 -0.433283 +VERTEX3 1392 88.651 -9.86972 -29.8163 0.0069994 0.040044 -0.410604 +VERTEX3 1393 90.547 -6.27145 -30.373 0.0328122 0.0408231 -0.381344 +VERTEX3 1394 92.7285 -1.63219 -30.566 0.0597995 0.0336122 -0.310953 +VERTEX3 1395 94.2839 3.59208 -30.3074 0.0605617 0.0059707 -0.246835 +VERTEX3 1396 95.1085 8.03284 -30.0544 0.0590874 -0.0179465 -0.219276 +VERTEX3 1397 95.9138 13.5782 -29.8927 0.0189336 -0.0383062 -0.179774 +VERTEX3 1398 96.4507 19.6802 -30.0322 -0.0218806 -0.026314 -0.132146 +VERTEX3 1399 96.7889 25.8164 -30.4303 -0.0523149 -0.0185321 -0.0883789 +VERTEX3 1400 96.824 31.8195 -30.9362 -0.0416177 0.00646906 -0.0261174 +VERTEX3 1401 96.1451 37.4629 -30.9588 -0.0383565 0.0203326 0.00735733 +VERTEX3 1402 95.158 43.3953 -30.9547 -0.0193734 0.0227557 0.0661056 +VERTEX3 1403 93.7444 48.7313 -30.8208 -0.00793037 0.0153917 0.106667 +VERTEX3 1404 92.1278 54.6759 -30.706 0.0105422 0.00205355 0.154034 +VERTEX3 1405 90.2937 59.8412 -30.5344 0.000514297 -0.0203848 0.201394 +VERTEX3 1406 87.958 64.9758 -30.809 -0.00484595 -0.0269136 0.244687 +VERTEX3 1407 86.0955 71.2584 -30.9911 -0.0277449 -0.0482068 0.291444 +VERTEX3 1408 84.1426 73.0053 -31.4141 -0.0329671 -0.0409192 0.28922 +VERTEX3 1409 82.2472 77.5983 -31.8511 -0.0315614 -0.0426421 0.326738 +VERTEX3 1410 79.6371 79.9707 -32.0474 -0.0406592 -0.0293542 0.33505 +VERTEX3 1411 78.1062 84.407 -32.6634 -0.0482315 -0.0121693 0.361296 +VERTEX3 1412 75.1183 86.6696 -32.6148 -0.029536 0.00605543 0.395925 +VERTEX3 1413 73.308 89.0894 -31.8535 -0.0227556 0.0232596 0.394914 +VERTEX3 1414 71.2955 89.7274 -31.4354 0.00303822 0.0543128 0.406308 +VERTEX3 1415 69.787 91.5569 -30.8555 0.0291562 0.0314514 0.418447 +VERTEX3 1416 69.7671 90.2587 -30.6632 0.0037346 0.0477577 0.379247 +VERTEX3 1417 69.7269 88.787 -30.5953 0.0116304 0.0419974 0.360568 +VERTEX3 1418 70.3176 89.2417 -29.4754 0.00972371 0.0176884 0.369921 +VERTEX3 1419 71.4472 86.3016 -30.0195 0.0208826 0.0297319 0.339483 +VERTEX3 1420 73.7578 74.4881 -30.6095 0.0237172 0.00552682 0.346719 +VERTEX3 1421 75.0753 66.1264 -31.6354 -0.0392941 0.0236057 0.308146 +VERTEX3 1422 75.863 62.0432 -30.6028 -0.0130147 -0.010823 0.322768 +VERTEX3 1423 75.2829 54.8412 -31.2213 -0.0173902 0.00609504 0.304494 +VERTEX3 1424 78.1937 43.0889 -30.6846 0.00705521 0.0228965 0.198947 +VERTEX3 1425 77.9607 26.5737 -30.9792 -0.0267162 -0.0210202 0.111681 +VERTEX3 1426 76.7212 12.181 -30.9087 -0.00993802 0.00211786 0.154679 +VERTEX3 1427 74.1408 -6.45782 -31.5739 0.0240627 0.0152098 0.179241 +VERTEX3 1428 72.6978 -21.9769 -31.8933 -0.0141232 -0.00244169 0.116764 +VERTEX3 1429 67.6314 -29.8428 -30.9745 -0.00249805 0.00541729 0.00396337 +VERTEX3 1430 66.7463 -29.6754 -32.5291 0.00971802 0.000361179 0.128907 +VERTEX3 1431 65.4271 -25.0572 -33.1542 0.0926776 -0.0804334 0.0928079 +VERTEX3 1432 67.2575 -22.9298 -33.4803 0.0615321 0.0144616 -0.21238 +VERTEX3 1433 66.4936 -22.0665 -33.6761 -0.0333907 0.0360579 -0.366224 +VERTEX3 1434 67.3936 -23.3629 -34.0999 0.0398032 -0.0398812 -0.392117 +VERTEX3 1435 68.1639 -21.1797 -34.2554 0.051015 -0.00698637 -0.458979 +VERTEX3 1436 71.174 -22.2207 -34.0169 0.0356906 -0.0391033 -0.47758 +VERTEX3 1437 72.8035 -19.157 -33.388 0.00785402 -0.00510342 -0.483534 +VERTEX3 1438 75.2985 -18.4456 -33.7809 0.00621085 -0.0205892 -0.510805 +VERTEX3 1439 77.1405 -16.7445 -33.5028 -0.0289752 -0.000752808 -0.476324 +VERTEX3 1440 80.0987 -14.3355 -34.1896 -0.0238553 0.0209735 -0.461372 +VERTEX3 1441 82.8013 -13.1957 -34.7851 -0.0195396 0.0276134 -0.45019 +VERTEX3 1442 85.5539 -7.49551 -35.3843 0.0205829 0.0359955 -0.410974 +VERTEX3 1443 87.7944 -4.50207 -35.7542 0.0502611 0.0474093 -0.365888 +VERTEX3 1444 89.8272 0.717651 -35.7664 0.0735168 0.0186221 -0.292078 +VERTEX3 1445 90.9904 4.41165 -35.592 0.0652191 -0.0100662 -0.260011 +VERTEX3 1446 91.9443 9.38018 -35.3157 0.0546525 -0.0410433 -0.241549 +VERTEX3 1447 92.8547 15.0717 -35.2712 0.00368378 -0.0458927 -0.180592 +VERTEX3 1448 93.5937 20.8523 -35.4278 -0.0226035 -0.0371043 -0.132394 +VERTEX3 1449 93.912 26.3331 -35.907 -0.033033 -0.0278691 -0.101234 +VERTEX3 1450 93.9694 32.2258 -36.2281 -0.0327045 0.00789771 -0.0473936 +VERTEX3 1451 93.4517 37.7881 -36.391 -0.0202188 0.0195613 0.000174701 +VERTEX3 1452 92.4319 43.5283 -36.2987 -0.0215584 0.0204936 0.0348913 +VERTEX3 1453 91.3003 49.3211 -36.2367 -0.00383684 0.0187722 0.104374 +VERTEX3 1454 89.6363 53.9764 -36.0828 -0.00380787 0.0120067 0.134683 +VERTEX3 1455 87.8037 59.713 -36.0672 0.00968017 -0.00293164 0.178328 +VERTEX3 1456 85.8238 64.3053 -36.0608 -0.000689511 -0.0294747 0.230969 +VERTEX3 1457 83.5159 70.4977 -36.4274 -0.0090868 -0.0379646 0.281395 +VERTEX3 1458 81.6597 74.2725 -36.7412 -0.0279386 -0.0403392 0.304868 +VERTEX3 1459 79.7716 77.3602 -37.2666 -0.0426384 -0.0386008 0.316639 +VERTEX3 1460 77.6781 81.2863 -37.6305 -0.0393752 -0.0340383 0.351231 +VERTEX3 1461 75.341 84.0647 -37.8212 -0.0447329 -0.0160148 0.362526 +VERTEX3 1462 74.4442 87.1637 -38.4902 -0.0524327 -0.00441544 0.379999 +VERTEX3 1463 71.3904 88.4898 -38.2795 -0.0341535 0.0141816 0.415028 +VERTEX3 1464 69.3312 91.2277 -37.2906 -0.0216433 0.0321534 0.408703 +VERTEX3 1465 67.0577 93.0302 -36.8122 0.012206 0.0592892 0.426359 +VERTEX3 1466 65.8319 94.8326 -36.3225 0.0333656 0.0326046 0.432775 +VERTEX3 1467 66.1824 92.3533 -35.9384 0.00310777 0.0479104 0.384037 +VERTEX3 1468 67.4996 87.779 -35.9754 0.00928708 0.0501685 0.369739 +VERTEX3 1469 67.3733 88.5294 -34.8014 0.0248913 0.0311666 0.367688 +VERTEX3 1470 68.9776 84.4395 -35.2169 0.0196048 0.051194 0.351823 +VERTEX3 1471 70.9904 74.7676 -35.8206 0.0150734 0.0166876 0.335095 +VERTEX3 1472 72.4621 66.5139 -36.662 -0.040102 0.032325 0.308628 +VERTEX3 1473 73.2169 60.8857 -35.8399 -0.0141627 -0.00604112 0.308299 +VERTEX3 1474 72.9717 56.383 -36.4601 -0.0116308 0.000800865 0.284443 +VERTEX3 1475 76.8823 42.1512 -35.9493 -0.0166959 -0.0225436 0.165209 +VERTEX3 1476 76.3364 29.3476 -36.5345 0.0139248 -0.034737 0.143234 +VERTEX3 1477 74.963 17.019 -36.5036 -0.000772206 0.00471935 0.169186 +VERTEX3 1478 72.6542 -4.9166 -36.9487 0.030794 -0.00361164 0.156656 +VERTEX3 1479 70.9178 -20.3618 -37.4833 0.0217225 -0.0397358 0.069246 +VERTEX3 1480 64.8818 -26.3958 -36.3331 0.0122885 0.0165145 -0.0369337 +VERTEX3 1481 64.8909 -22.5536 -38.3766 0.0496567 0.0212276 -0.0352648 +VERTEX3 1482 63.8705 -22.2005 -37.8756 0.0320127 0.0338142 -0.0407457 +VERTEX3 1483 64.0589 -23.3015 -38.6045 0.0217371 0.0136269 -0.291723 +VERTEX3 1484 64.155 -23.4411 -39.0591 0.0114174 -0.0820904 -0.432983 +VERTEX3 1485 66.7899 -22.9587 -39.0253 0.0133064 -0.0294094 -0.414646 +VERTEX3 1486 67.745 -19.7986 -38.4394 0.00968615 -0.00384322 -0.458981 +VERTEX3 1487 70.2388 -17.6577 -38.8163 0.00908037 -0.0330107 -0.495141 +VERTEX3 1488 71.8437 -17.8684 -38.354 -0.0229907 -0.0116344 -0.491994 +VERTEX3 1489 74.434 -16.4085 -38.9162 -0.0279992 0.0111495 -0.474053 +VERTEX3 1490 77.5076 -12.1651 -39.6007 -0.0219847 0.0114424 -0.447458 +VERTEX3 1491 79.6457 -9.35047 -40.2263 -0.00723005 0.0335816 -0.43607 +VERTEX3 1492 82.4631 -6.18508 -40.776 0.0285012 0.0466896 -0.404587 +VERTEX3 1493 84.4667 -3.00146 -40.9737 0.0735362 0.0359303 -0.337655 +VERTEX3 1494 86.2617 1.58491 -40.9146 0.0647485 0.00844629 -0.299086 +VERTEX3 1495 87.4412 5.80572 -40.7444 0.0778222 -0.0240954 -0.292836 +VERTEX3 1496 88.6216 11.0578 -40.4579 0.0273573 -0.0456696 -0.221676 +VERTEX3 1497 89.5603 16.1545 -40.512 0.00677166 -0.0577759 -0.19126 +VERTEX3 1498 90.1296 21.3822 -40.729 -0.012784 -0.0524927 -0.161613 +VERTEX3 1499 90.7726 27.0133 -41.1119 -0.028196 -0.0187793 -0.104133 +VERTEX3 1500 90.6504 32.4456 -41.5362 0.00974103 0.00644344 -0.0665111 +VERTEX3 1501 90.1924 38.0363 -41.5816 -0.0115209 0.00482246 -0.0183163 +VERTEX3 1502 89.4655 43.7608 -41.5566 -0.00745852 0.0205168 0.039763 +VERTEX3 1503 88.2373 49.3497 -41.4436 0.00275464 0.0165505 0.0750216 +VERTEX3 1504 86.7563 54.5414 -41.2932 0.00413368 0.0138075 0.132955 +VERTEX3 1505 85.1674 59.6311 -41.2783 0.00904693 0.00359723 0.173624 +VERTEX3 1506 83.1429 64.669 -41.2271 0.0130311 -0.011177 0.211844 +VERTEX3 1507 81.0834 70.3497 -41.2255 0.00334403 -0.0395699 0.263313 +VERTEX3 1508 78.8343 74.5378 -41.837 -0.0170524 -0.036409 0.306685 +VERTEX3 1509 76.9704 78.2887 -42.2503 -0.0331141 -0.0333555 0.331987 +VERTEX3 1510 75.2054 80.7248 -42.9092 -0.0435674 -0.0367561 0.344026 +VERTEX3 1511 72.6188 86.2679 -43.0253 -0.0485311 -0.0250179 0.372545 +VERTEX3 1512 70.6295 88.4758 -43.3962 -0.0506844 -0.00140851 0.39131 +VERTEX3 1513 70.0415 89.3238 -44.0338 -0.0567597 0.00143673 0.397717 +VERTEX3 1514 67.0893 92.4475 -43.6743 -0.0334864 0.0238809 0.431566 +VERTEX3 1515 64.7998 92.7336 -42.6753 -0.0147136 0.0404554 0.423831 +VERTEX3 1516 62.0483 97.2257 -41.7662 0.0185617 0.0590311 0.443489 +VERTEX3 1517 62.1762 95.2864 -41.4949 0.0362763 0.0328954 0.442675 +VERTEX3 1518 61.5057 93.9803 -41.0312 0.0117039 0.0487058 0.402903 +VERTEX3 1519 63.1576 92.8176 -40.9474 0.0137075 0.0533245 0.393667 +VERTEX3 1520 63.5069 89.4044 -39.9268 0.0392544 0.0384033 0.377802 +VERTEX3 1521 65.5795 84.3928 -40.2234 0.0159522 0.0606865 0.374846 +VERTEX3 1522 67.9504 74.881 -40.7915 -0.0052072 0.0299281 0.312824 +VERTEX3 1523 69.1993 67.8689 -41.7627 -0.0231658 0.0149076 0.307748 +VERTEX3 1524 69.4518 64.4947 -40.922 0.00826868 -0.00872438 0.321109 +VERTEX3 1525 69.9314 57.0487 -41.6044 0.0601814 -0.00742069 0.333947 +VERTEX3 1526 73.1128 39.6102 -41.3803 0.0313457 -0.0270637 0.326901 +VERTEX3 1527 73.816 33.9347 -41.8335 0.0368638 -0.0580909 0.228645 +VERTEX3 1528 71.8484 11.838 -41.875 0.00187991 -0.00694296 0.149076 +VERTEX3 1529 68.9599 -7.76811 -42.4075 0.0301345 0.00937665 0.105541 +VERTEX3 1530 69.0249 -19.0142 -42.9454 0.0340705 -0.0319851 0.00458727 +VERTEX3 1531 60.4047 -23.7862 -41.3963 0.0524904 0.043109 -0.293497 +VERTEX3 1532 61.9664 -23.441 -43.0317 -0.0269563 0.0579514 -0.122643 +VERTEX3 1533 60.8664 -23.5713 -42.8119 -0.039173 0.0372099 -0.097467 +VERTEX3 1534 62.6175 -21.9478 -43.6007 -0.0107893 0.0156774 -0.243175 +VERTEX3 1535 63.3952 -20.4979 -43.5802 0.10752 -0.062379 -0.351754 +VERTEX3 1536 65.3089 -19.8889 -43.6383 0.0188405 -0.0275393 -0.443048 +VERTEX3 1537 66.1896 -18.2747 -43.1642 -0.00992678 -0.0228956 -0.48091 +VERTEX3 1538 69.1522 -15.3075 -43.7994 -0.0226127 -0.00113957 -0.467901 +VERTEX3 1539 71.8914 -13.0369 -44.1099 -0.0267934 -0.0101685 -0.447369 +VERTEX3 1540 74.0138 -9.81389 -44.8021 -0.0117699 0.0103916 -0.450975 +VERTEX3 1541 76.3878 -8.63215 -45.5268 0.00955247 0.0323776 -0.44717 +VERTEX3 1542 79.0051 -4.45005 -45.8084 0.0417157 0.037963 -0.363136 +VERTEX3 1543 80.6544 -0.985547 -45.9746 0.0552245 0.0244523 -0.345563 +VERTEX3 1544 82.3479 3.44551 -45.955 0.0807357 -0.00578394 -0.329279 +VERTEX3 1545 83.5474 7.57172 -45.5453 0.0564404 -0.035608 -0.26663 +VERTEX3 1546 84.7522 11.6749 -45.5049 0.0370355 -0.0643527 -0.253696 +VERTEX3 1547 85.5967 17.0407 -45.5306 0.00924211 -0.066065 -0.211407 +VERTEX3 1548 86.6575 22.2161 -45.8742 -0.0155821 -0.0421759 -0.162294 +VERTEX3 1549 87.0036 27.4286 -46.2157 -0.00651994 -0.0277934 -0.139081 +VERTEX3 1550 87.0431 32.741 -46.5636 0.0506177 -0.0115966 -0.0888988 +VERTEX3 1551 86.7316 38.3438 -46.5432 0.00997907 -0.000602856 -0.0336428 +VERTEX3 1552 86.0127 43.946 -46.6595 0.0102262 0.00482278 0.026331 +VERTEX3 1553 84.8687 49.5182 -46.5006 0.00800615 0.0178503 0.0671717 +VERTEX3 1554 83.4624 54.7969 -46.3385 0.0215592 0.00774776 0.11422 +VERTEX3 1555 81.8702 59.758 -46.1448 0.0164729 0.0112076 0.163042 +VERTEX3 1556 80.1483 64.5699 -46.1701 0.0150514 -0.00696872 0.209347 +VERTEX3 1557 78.1347 69.3005 -46.1619 0.0211841 -0.01813 0.242827 +VERTEX3 1558 76.0457 75.0519 -46.307 0.00119785 -0.0449532 0.290414 +VERTEX3 1559 73.8076 79.1733 -47.161 -0.023604 -0.0451409 0.34156 +VERTEX3 1560 72.1729 81.2573 -47.6044 -0.0386634 -0.034443 0.358967 +VERTEX3 1561 70.2429 83.0558 -48.1462 -0.0438765 -0.0313977 0.361136 +VERTEX3 1562 67.9455 87.5354 -48.3964 -0.0493049 -0.0164865 0.396091 +VERTEX3 1563 65.7726 89.333 -48.6702 -0.0545475 0.00176637 0.406749 +VERTEX3 1564 65.3508 92.6897 -49.6827 -0.056951 0.0148531 0.422295 +VERTEX3 1565 62.5012 95.1066 -48.8092 -0.0334693 0.0318517 0.448826 +VERTEX3 1566 60.2425 94.9023 -47.7367 -0.018932 0.0460175 0.434654 +VERTEX3 1567 58.2074 98.535 -46.9354 0.0232097 0.0637755 0.456122 +VERTEX3 1568 58.2205 93.4584 -46.6027 0.0353268 0.0310175 0.445409 +VERTEX3 1569 57.0309 94.8645 -46.0578 0.0125333 0.0508423 0.410386 +VERTEX3 1570 59.4046 90.3547 -45.7076 0.0131228 0.0572616 0.404577 +VERTEX3 1571 59.9908 87.3313 -44.5548 0.0453813 0.0387983 0.388478 +VERTEX3 1572 61.1953 86.2104 -44.8249 0.0155927 0.0556547 0.402045 +VERTEX3 1573 64.5191 71.271 -45.6235 -0.038489 0.0417302 0.287886 +VERTEX3 1574 65.9231 68.393 -46.4579 0.0315401 -0.00898587 0.311249 +VERTEX3 1575 66.6109 66.2246 -45.6938 0.0982034 -0.0244743 0.360901 +VERTEX3 1576 66.0301 60.6619 -46.3939 0.0604048 -0.0129078 0.453147 +VERTEX3 1577 69.2244 50.0548 -46.0686 0.0511843 -0.0350808 0.358729 +VERTEX3 1578 70.953 33.951 -46.9949 0.0408667 -0.0530907 0.242033 +VERTEX3 1579 68.0135 12.4102 -47.0225 -0.00033589 -0.017148 0.134823 +VERTEX3 1580 65.1657 -3.74171 -47.325 0.023265 -0.000811127 0.070539 +VERTEX3 1581 65.6787 -17.988 -47.8933 0.0378558 -0.0237926 -0.0403539 +VERTEX3 1582 57.9155 -22.851 -46.3846 0.0627694 0.0476114 -0.298624 +VERTEX3 1583 60.4012 -23.8006 -48.0722 -0.0175409 0.0405722 -0.0937199 +VERTEX3 1584 60.9663 -23.5908 -48.1829 -0.062876 0.0189939 -0.0496778 +VERTEX3 1585 61.1276 -20.5712 -48.6701 -0.0178985 -0.00666239 -0.304668 +VERTEX3 1586 61.2104 -19.4996 -48.0108 0.0512212 -0.0121056 -0.481076 +VERTEX3 1587 63.5276 -15.749 -48.5364 -0.000159891 0.00092903 -0.440198 +VERTEX3 1588 65.9498 -15.1022 -48.633 -0.0193073 -0.0238762 -0.444414 +VERTEX3 1589 67.7228 -12.5174 -49.3539 -0.0425397 0.00319549 -0.490492 +VERTEX3 1590 70.0327 -9.94011 -50.0068 0.000240103 0.00720765 -0.47477 +VERTEX3 1591 73.0252 -6.24211 -50.317 0.01905 0.040978 -0.398292 +VERTEX3 1592 74.7622 -2.46746 -50.6494 0.0345091 0.0271332 -0.37735 +VERTEX3 1593 76.7075 1.6127 -50.8283 0.0680304 0.0117515 -0.364232 +VERTEX3 1594 78.2718 5.31932 -50.6004 0.063757 -0.022457 -0.298487 +VERTEX3 1595 79.4207 8.61003 -50.4364 0.0553205 -0.0497188 -0.296582 +VERTEX3 1596 80.3699 12.6642 -50.2663 0.0372382 -0.0764539 -0.284692 +VERTEX3 1597 81.8456 17.7424 -50.5004 0.00120569 -0.0597593 -0.221021 +VERTEX3 1598 82.5677 23.0228 -50.7938 -0.00368701 -0.0523462 -0.194979 +VERTEX3 1599 83.1467 28.0163 -51.3426 0.0264985 -0.0276392 -0.150217 +VERTEX3 1600 83.083 33.2442 -51.3508 0.071062 -0.0274328 -0.119475 +VERTEX3 1601 82.9376 38.7775 -51.3289 0.034942 -0.00911516 -0.0555139 +VERTEX3 1602 82.2223 44.047 -51.4787 0.0199511 0.00031195 0.0078893 +VERTEX3 1603 81.235 49.8355 -51.4378 0.0225789 0.00783699 0.0693072 +VERTEX3 1604 79.8098 55.2067 -51.1796 0.0305873 0.0144443 0.118577 +VERTEX3 1605 78.1332 59.7655 -50.9493 0.0345899 0.00689298 0.149462 +VERTEX3 1606 76.4592 64.4058 -50.7958 0.0293862 -0.00051899 0.195062 +VERTEX3 1607 74.7561 69.0161 -50.8706 0.0134262 -0.0119253 0.234279 +VERTEX3 1608 72.7954 73.3398 -50.8495 0.0212072 -0.0251977 0.273053 +VERTEX3 1609 70.9188 78.5322 -51.1866 -0.00511357 -0.0468202 0.314757 +VERTEX3 1610 68.0514 83.316 -52.1482 -0.031432 -0.0533178 0.372687 +VERTEX3 1611 66.5279 86.1676 -52.5791 -0.0500573 -0.03711 0.388967 +VERTEX3 1612 64.809 86.7991 -53.2007 -0.0541831 -0.0246155 0.388138 +VERTEX3 1613 62.9225 89.5577 -53.5741 -0.051962 -0.00485298 0.423703 +VERTEX3 1614 61.556 90.637 -53.8707 -0.0561293 0.00796829 0.428079 +VERTEX3 1615 60.6739 93.5791 -54.7538 -0.0592086 0.0210413 0.440965 +VERTEX3 1616 57.9844 95.6453 -53.8787 -0.0381556 0.0385851 0.461591 +VERTEX3 1617 55.2106 96.1563 -52.4626 -0.0139746 0.0527838 0.454671 +VERTEX3 1618 53.9497 98.1681 -51.8105 0.0282638 0.0625585 0.464345 +VERTEX3 1619 53.9363 95.4543 -51.3244 0.0419894 0.0301883 0.468353 +VERTEX3 1620 52.8747 94.844 -50.6344 0.0101632 0.0561052 0.42219 +VERTEX3 1621 55.8505 87.8868 -49.9376 0.016767 0.0616231 0.420459 +VERTEX3 1622 55.8146 89.0563 -48.7483 0.0434447 0.0215768 0.384589 +VERTEX3 1623 57.8895 81.2073 -49.3424 0.050625 0.020892 0.446723 +VERTEX3 1624 60.1648 73.7911 -50.2444 0.171415 -0.0559134 0.424003 +VERTEX3 1625 61.2856 67.6605 -51.2386 0.0556166 -0.0382272 0.416263 +VERTEX3 1626 62.2855 64.783 -50.6363 0.0913669 -0.0483881 0.478669 +VERTEX3 1627 60.7017 61.8075 -51.2552 0.0615943 -0.0212416 0.440049 +VERTEX3 1628 64.5343 53.0613 -50.9176 0.0590381 -0.04557 0.36518 +VERTEX3 1629 66.2934 36.188 -51.9737 0.0464774 -0.0487828 0.249114 +VERTEX3 1630 64.6643 17.0237 -51.9552 -0.0039024 -0.0276437 0.128314 +VERTEX3 1631 62.648 0.502743 -52.2198 0.0167538 -0.00590928 0.0617311 +VERTEX3 1632 62.1568 -16.1515 -52.8663 0.0212865 -0.018424 -0.0779923 +VERTEX3 1633 55.8008 -21.5124 -51.6047 0.0494936 0.0525557 -0.320453 +VERTEX3 1634 57.9108 -24.1961 -52.8426 -0.0174842 0.0200288 -0.101986 +VERTEX3 1635 58.0568 -20.8858 -52.8774 -0.0278663 0.0113851 -0.0728 +VERTEX3 1636 58.3775 -17.6467 -53.1316 -0.00907174 -0.0196403 -0.319869 +VERTEX3 1637 60.4528 -14.1464 -52.8378 0.0114437 0.00874521 -0.491188 +VERTEX3 1638 62.1657 -12.2925 -53.6505 -0.0132846 0.00564484 -0.466092 +VERTEX3 1639 64.3023 -9.64571 -54.3088 0.00358489 -0.0251754 -0.447503 +VERTEX3 1640 66.9866 -6.94619 -54.5589 0.000746575 0.00937587 -0.399259 +VERTEX3 1641 68.7441 -3.8202 -54.948 0.0131459 0.0322259 -0.410645 +VERTEX3 1642 70.573 -0.708933 -55.4092 0.0430693 0.0190722 -0.388022 +VERTEX3 1643 72.1408 2.47028 -55.3981 0.0728895 -0.00588852 -0.345363 +VERTEX3 1644 73.6919 6.36997 -55.1771 0.0647471 -0.0350007 -0.33031 +VERTEX3 1645 74.9984 10.1176 -55.0305 0.0525586 -0.0736392 -0.30331 +VERTEX3 1646 76.3387 14.1691 -54.9958 0.0223109 -0.0749091 -0.275895 +VERTEX3 1647 77.3534 19.007 -55.1929 0.00207055 -0.0720503 -0.246173 +VERTEX3 1648 78.4068 23.8489 -55.8254 0.011039 -0.0399416 -0.206449 +VERTEX3 1649 78.925 28.8148 -56.0499 0.0442096 -0.0207818 -0.181131 +VERTEX3 1650 78.9242 33.9009 -56.0554 0.0770191 -0.021857 -0.12546 +VERTEX3 1651 78.7924 39.3736 -56.0194 0.0458866 -0.0219841 -0.0539153 +VERTEX3 1652 78.1815 44.582 -56.0909 0.026711 -0.0117767 -0.00516767 +VERTEX3 1653 77.0213 49.5617 -56.0946 0.0306011 0.00361666 0.0451139 +VERTEX3 1654 75.6695 54.6574 -55.9034 0.0391872 0.00831596 0.103864 +VERTEX3 1655 74.0377 59.39 -55.5877 0.0316699 -0.000177788 0.142361 +VERTEX3 1656 72.3066 64.1195 -55.3608 0.0420282 0.00568674 0.182937 +VERTEX3 1657 70.6785 69.065 -55.0893 0.0474014 -0.0138362 0.231972 +VERTEX3 1658 68.8495 73.6249 -55.1709 0.0269143 -0.0297898 0.272733 +VERTEX3 1659 66.96 77.3989 -55.2628 0.0149941 -0.0310161 0.299433 +VERTEX3 1660 65.1493 81.674 -55.7805 -0.0112689 -0.0488553 0.338859 +VERTEX3 1661 62.2549 85.2314 -56.9933 -0.0424886 -0.0420677 0.389157 +VERTEX3 1662 60.6726 87.5413 -57.522 -0.0531561 -0.0275884 0.407265 +VERTEX3 1663 59.367 89.4468 -58.1803 -0.0610866 -0.0190834 0.416218 +VERTEX3 1664 56.984 93.3002 -58.3441 -0.0619431 -0.00201218 0.449691 +VERTEX3 1665 54.9877 94.8247 -58.6055 -0.0659844 0.0243993 0.454672 +VERTEX3 1666 55.3147 96.0022 -59.4359 -0.0656131 0.0324148 0.464534 +VERTEX3 1667 52.3335 97.1347 -58.6571 -0.0419177 0.0432607 0.480069 +VERTEX3 1668 50.3584 97.5508 -57.0374 -0.00760617 0.0552772 0.477965 +VERTEX3 1669 49.5887 96.3877 -56.1715 0.0268199 0.0621249 0.471145 +VERTEX3 1670 49.749 95.3347 -55.9161 0.0537566 0.0306794 0.485664 +VERTEX3 1671 49.1487 95.2242 -54.9086 -0.00259879 0.0628461 0.42541 +VERTEX3 1672 50.0265 91.6156 -54.0854 0.0295514 0.0460888 0.439395 +VERTEX3 1673 51.5455 90.0031 -53.1189 0.0412057 -0.0177738 0.406468 +VERTEX3 1674 53.4036 83.6667 -53.37 0.124173 -0.104891 0.409794 +VERTEX3 1675 55.571 76.5196 -54.2349 0.163103 -0.1209 0.510145 +VERTEX3 1676 55.9986 68.7935 -55.9996 0.0557666 -0.0394882 0.466972 +VERTEX3 1677 56.9519 64.254 -55.7565 0.0929533 -0.0364926 0.433434 +VERTEX3 1678 55.8584 63.926 -55.8106 0.0668746 -0.0262408 0.433705 +VERTEX3 1679 60.5731 50.183 -56.0335 0.0549869 -0.0507677 0.319697 +VERTEX3 1680 61.9902 40.2031 -56.6253 0.0423343 -0.048869 0.251774 +VERTEX3 1681 62.026 25.8712 -56.7336 0.0123102 -0.0153988 0.139326 +VERTEX3 1682 59.1251 7.3394 -56.8448 0.0232372 -0.00415434 0.0773901 +VERTEX3 1683 59.3377 -10.1283 -57.4468 0.0193145 -0.012943 -0.0920053 +VERTEX3 1684 53.6737 -15.1773 -55.9065 0.030672 0.0454935 -0.299846 +VERTEX3 1685 55.2892 -22.9012 -57.3839 -0.0128868 -0.0021168 -0.110866 +VERTEX3 1686 55.7751 -17.5166 -57.475 -0.0300287 -2.33206e-06 -0.0998741 +VERTEX3 1687 56.3469 -13.4508 -57.7633 0.0107341 0.00187005 -0.346624 +VERTEX3 1688 58.3475 -10.75 -58.4112 -0.0169039 -0.0392486 -0.470037 +VERTEX3 1689 60.592 -8.79832 -58.5696 -0.00555821 -0.0156995 -0.41107 +VERTEX3 1690 62.3049 -5.1375 -58.9744 0.0199685 0.0223154 -0.417517 +VERTEX3 1691 64.1655 -2.02053 -59.4679 0.0183074 0.013186 -0.385781 +VERTEX3 1692 65.9882 0.571519 -59.7117 0.0574075 0.0131322 -0.379798 +VERTEX3 1693 67.8846 4.15251 -59.721 0.0679322 -0.0211506 -0.350074 +VERTEX3 1694 69.17 8.1552 -59.5264 0.0645466 -0.0612314 -0.322138 +VERTEX3 1695 70.4126 11.3167 -59.367 0.03808 -0.0706774 -0.3118 +VERTEX3 1696 71.7179 15.8947 -59.4617 0.0193038 -0.082456 -0.296601 +VERTEX3 1697 73.0909 20.4201 -60.0504 0.00563424 -0.0499294 -0.253718 +VERTEX3 1698 73.9058 25.0039 -60.3814 0.0206197 -0.0258846 -0.229111 +VERTEX3 1699 74.4806 29.7009 -60.6755 0.0546062 -0.0182068 -0.165146 +VERTEX3 1700 74.3544 34.6867 -60.4748 0.0695779 -0.0216751 -0.129602 +VERTEX3 1701 74.1802 39.677 -60.5095 0.0612297 -0.0298644 -0.0636002 +VERTEX3 1702 73.582 44.5993 -60.6159 0.0348727 -0.00922697 -0.0169943 +VERTEX3 1703 72.614 49.6817 -60.5548 0.0326741 -0.0109325 0.0449876 +VERTEX3 1704 71.2743 54.487 -60.4037 0.0425928 0.00407588 0.0949632 +VERTEX3 1705 69.729 59.4041 -60.0839 0.0495943 0.00595392 0.140326 +VERTEX3 1706 68.0248 63.7815 -59.7291 0.0462903 -0.0023227 0.171427 +VERTEX3 1707 66.3155 68.0637 -59.3526 0.0513778 -0.00647078 0.220588 +VERTEX3 1708 64.5436 72.846 -59.1296 0.0485154 -0.0229759 0.259367 +VERTEX3 1709 62.8404 77.4145 -59.372 0.0275584 -0.0390415 0.301677 +VERTEX3 1710 60.4797 81.3068 -59.4507 0.0202033 -0.0441482 0.338725 +VERTEX3 1711 59.0767 84.7917 -60.3184 -0.0118212 -0.0590962 0.368415 +VERTEX3 1712 56.4974 87.0296 -61.611 -0.0494985 -0.0472883 0.417511 +VERTEX3 1713 55.2505 90.2049 -61.9827 -0.0570955 -0.0359827 0.433114 +VERTEX3 1714 53.3019 91.855 -62.7044 -0.0705535 -0.0204712 0.442438 +VERTEX3 1715 50.872 94.3255 -63.0162 -0.0668881 -0.000329256 0.474599 +VERTEX3 1716 49.1936 94.9755 -62.8802 -0.0724593 0.0298077 0.475115 +VERTEX3 1717 49.1341 98.0803 -63.9714 -0.0677492 0.0376015 0.486526 +VERTEX3 1718 46.8521 98.1144 -62.9838 -0.0394825 0.0523739 0.508271 +VERTEX3 1719 45.2256 99.4973 -61.5657 -0.00437631 0.0604651 0.490813 +VERTEX3 1720 45.2052 96.3534 -60.5041 0.0314596 0.0565641 0.49013 +VERTEX3 1721 44.0464 96.3823 -59.9069 0.0525823 0.0217661 0.514213 +VERTEX3 1722 44.0832 93.9915 -59.0027 -0.00857415 0.0571628 0.434494 +VERTEX3 1723 44.2085 93.2944 -58.0396 0.0650397 0.0501997 0.467071 +VERTEX3 1724 46.5806 89.0765 -57.4312 0.0666503 -0.0946212 0.454995 +VERTEX3 1725 47.6973 86.7758 -57.7257 0.0863492 -0.112585 0.513884 +VERTEX3 1726 48.6564 83.2187 -58.0643 0.177261 -0.107197 0.539185 +VERTEX3 1727 50.0614 73.669 -60.4271 0.0859508 -0.0351274 0.487024 +VERTEX3 1728 50.1269 72.1378 -59.5519 0.0968304 -0.0572411 0.505991 +VERTEX3 1729 51.6289 64.0647 -60.463 0.0676479 -0.021952 0.429308 +VERTEX3 1730 55.7835 49.7732 -60.7178 0.0486592 -0.0535784 0.298203 +VERTEX3 1731 57.1488 44.4036 -61.0898 0.0459442 -0.0533531 0.245034 +VERTEX3 1732 56.1718 28.4248 -61.3515 0.00824817 -0.0231386 0.140473 +VERTEX3 1733 55.0352 14.5195 -61.1758 0.0261326 -0.00919164 0.0750305 +VERTEX3 1734 56.3231 -6.15129 -62.0977 0.00700058 -0.020237 -0.124144 +VERTEX3 1735 51.9878 -10.4694 -60.1149 0.0112769 0.0235055 -0.377364 +VERTEX3 1736 53.1939 -17.7295 -62.4339 -0.0413673 -0.0263325 -0.145663 +VERTEX3 1737 53.5765 -13.8955 -62.1326 -0.0392027 0.013498 -0.115993 +VERTEX3 1738 54.9279 -10.1014 -62.4959 -0.0101166 -0.0253715 -0.297327 +VERTEX3 1739 56.1604 -6.23388 -62.9787 0.0529321 -0.0123385 -0.415158 +VERTEX3 1740 57.8814 -3.80254 -63.2752 0.0109233 0.00542434 -0.359942 +VERTEX3 1741 59.3854 -0.742067 -63.5429 0.0341985 -0.000609707 -0.380215 +VERTEX3 1742 61.3853 2.36111 -63.8216 0.0370305 -0.0168322 -0.373882 +VERTEX3 1743 62.7056 5.78665 -63.6994 0.0697464 -0.0363465 -0.35187 +VERTEX3 1744 64.225 9.4645 -63.5484 0.0594516 -0.0637584 -0.341395 +VERTEX3 1745 65.6247 13.3325 -63.6098 0.03658 -0.0759437 -0.337625 +VERTEX3 1746 67.241 17.3927 -64.0821 0.00458227 -0.061329 -0.297101 +VERTEX3 1747 68.4089 21.7944 -64.4046 0.0158904 -0.0354714 -0.265285 +VERTEX3 1748 69.1995 26.1429 -64.9054 0.0309512 -0.0179822 -0.20953 +VERTEX3 1749 69.5336 30.6739 -64.7877 0.0527196 -0.0191025 -0.16852 +VERTEX3 1750 69.5192 35.3917 -64.7375 0.0607308 -0.0149992 -0.131989 +VERTEX3 1751 69.3292 40.2618 -64.7384 0.0630347 -0.0227009 -0.0517246 +VERTEX3 1752 68.7312 45.035 -64.7933 0.0436394 -0.023063 -0.00355308 +VERTEX3 1753 67.7834 49.5741 -64.8783 0.0490539 -0.0103742 0.0405948 +VERTEX3 1754 66.6094 54.5226 -64.6531 0.041045 -0.0102153 0.0916795 +VERTEX3 1755 64.947 58.9841 -64.3624 0.0500934 -0.00137193 0.135035 +VERTEX3 1756 63.4801 63.4754 -64.0145 0.065226 0.00360539 0.173906 +VERTEX3 1757 61.622 67.7608 -63.504 0.0618711 -0.0109055 0.219572 +VERTEX3 1758 59.7812 72.1596 -63.1062 0.0596254 -0.0169868 0.260357 +VERTEX3 1759 58.1155 76.4019 -63.0846 0.0519292 -0.0310219 0.287382 +VERTEX3 1760 56.3482 80.2468 -63.3294 0.0279986 -0.0468454 0.329745 +VERTEX3 1761 54.0874 83.7585 -63.5919 0.0156552 -0.0470901 0.365466 +VERTEX3 1762 52.6443 86.8863 -64.4157 -0.0151945 -0.0661246 0.392556 +VERTEX3 1763 50.227 88.6119 -65.822 -0.0552322 -0.0545042 0.441882 +VERTEX3 1764 48.4204 91.318 -66.2535 -0.0662409 -0.0333662 0.452266 +VERTEX3 1765 47.2943 93.2038 -67.1005 -0.0766437 -0.0165476 0.465405 +VERTEX3 1766 45.2065 95.3992 -67.2946 -0.0725798 -0.00319633 0.499141 +VERTEX3 1767 43.3668 96.0438 -67.2382 -0.0760618 0.0359872 0.501137 +VERTEX3 1768 44.0228 95.7522 -68.0259 -0.0672127 0.0372323 0.506925 +VERTEX3 1769 40.7409 97.6482 -67.3086 -0.0428731 0.0587607 0.541086 +VERTEX3 1770 39.5602 98.5713 -65.6199 0.00821531 0.0562472 0.510485 +VERTEX3 1771 39.3459 97.2482 -64.1908 0.0286841 0.0452622 0.50917 +VERTEX3 1772 38.0209 97.3059 -63.787 0.0535012 0.0142373 0.536149 +VERTEX3 1773 37.327 96.8171 -62.3239 -0.00443934 0.039068 0.463619 +VERTEX3 1774 39.027 93.92 -61.8194 -0.0101629 -0.0493274 0.450683 +VERTEX3 1775 41.5106 89.9954 -61.8382 0.056301 -0.0562955 0.479161 +VERTEX3 1776 40.2566 88.3126 -62.3392 0.166285 -0.0773232 0.543564 +VERTEX3 1777 41.983 85.6626 -62.1681 0.169947 -0.0850316 0.580736 +VERTEX3 1778 44.7225 74.277 -64.6675 0.0906845 -0.0431956 0.506504 +VERTEX3 1779 44.2997 74.0466 -63.5018 0.101092 -0.0481866 0.517885 +VERTEX3 1780 45.806 66.0834 -64.4375 0.0667343 -0.0262342 0.426623 +VERTEX3 1781 49.7376 57.9573 -64.9033 0.0552413 -0.0492267 0.329298 +VERTEX3 1782 51.7127 49.4154 -65.2496 0.0477929 -0.0567764 0.260465 +VERTEX3 1783 51.8042 33.1071 -65.5734 -0.00670684 -0.029926 0.129556 +VERTEX3 1784 51.0716 18.3023 -65.5085 0.0191902 -0.0183824 0.0633567 +VERTEX3 1785 54.3381 -1.6193 -66.4933 -0.0154732 -0.0316991 -0.15604 +VERTEX3 1786 51.3867 -4.67073 -63.8092 -0.000973995 -0.00225807 -0.424776 +VERTEX3 1787 50.6989 -14.3172 -66.4872 -0.043013 -0.0311849 -0.178406 +VERTEX3 1788 51.1781 -9.25357 -66.7917 -0.0515382 -0.0544333 -0.102505 +VERTEX3 1789 52.2911 -4.95729 -67.2625 0.0418156 -0.0502509 -0.291184 +VERTEX3 1790 53.4023 -1.95538 -67.0019 0.036898 -0.0348244 -0.349426 +VERTEX3 1791 54.7408 0.901373 -67.4448 0.0149885 -0.0341862 -0.312568 +VERTEX3 1792 56.2331 4.45426 -67.5893 0.0481461 -0.0363228 -0.337825 +VERTEX3 1793 57.7984 7.75013 -67.4032 0.0547966 -0.0511088 -0.356205 +VERTEX3 1794 59.1455 10.935 -67.5384 0.0362486 -0.0603257 -0.381828 +VERTEX3 1795 60.9295 14.7174 -67.891 0.00681238 -0.0640295 -0.330537 +VERTEX3 1796 62.1987 18.6796 -68.2441 0.0112598 -0.0450772 -0.317694 +VERTEX3 1797 63.4894 22.9438 -68.7776 0.0194881 -0.0209386 -0.240184 +VERTEX3 1798 63.9877 27.0244 -68.7544 0.0360027 -0.0211803 -0.215373 +VERTEX3 1799 64.2585 31.4965 -68.642 0.0558066 -0.0207846 -0.175224 +VERTEX3 1800 64.284 36.0283 -68.742 0.0656547 -0.014923 -0.12538 +VERTEX3 1801 64.1113 40.8596 -68.6553 0.0586827 -0.0204628 -0.0485757 +VERTEX3 1802 63.5302 45.368 -68.7607 0.0497088 -0.0245773 0.00613674 +VERTEX3 1803 62.5167 49.5883 -68.828 0.0437082 -0.0238253 0.0312588 +VERTEX3 1804 61.4377 54.1962 -68.7682 0.0455089 -0.0126029 0.0908543 +VERTEX3 1805 59.996 58.2482 -68.5501 0.0606525 -0.0167948 0.116544 +VERTEX3 1806 58.3256 62.7179 -68.0633 0.0564886 -0.00177205 0.166854 +VERTEX3 1807 56.7052 66.6598 -67.656 0.0755828 -0.00474091 0.211025 +VERTEX3 1808 54.8557 70.7593 -67.1635 0.0622474 -0.0195536 0.244935 +VERTEX3 1809 52.8983 74.8078 -66.7585 0.0626893 -0.0235536 0.285765 +VERTEX3 1810 51.4424 78.5235 -66.8405 0.0512875 -0.0403206 0.310947 +VERTEX3 1811 49.6889 81.8999 -67.1202 0.0268959 -0.05484 0.351622 +VERTEX3 1812 47.443 85.8119 -67.2704 0.0221461 -0.0604285 0.39053 +VERTEX3 1813 45.8901 89.3066 -68.2615 -0.00797281 -0.0848569 0.421078 +VERTEX3 1814 43.5629 90.9868 -69.7625 -0.0559375 -0.07341 0.477212 +VERTEX3 1815 42.5049 92.4395 -70.2434 -0.0725885 -0.0334114 0.475339 +VERTEX3 1816 40.7608 93.4302 -70.8474 -0.0813349 -0.0201963 0.486377 +VERTEX3 1817 38.974 96.2755 -71.2598 -0.0814795 0.00332032 0.527831 +VERTEX3 1818 36.8964 96.2633 -71.0307 -0.0816237 0.0358263 0.521635 +VERTEX3 1819 37.7773 97.8696 -71.9973 -0.0723257 0.0381067 0.528168 +VERTEX3 1820 35.041 97.5935 -70.9601 -0.0467862 0.0654745 0.565597 +VERTEX3 1821 33.8753 98.6852 -68.8135 0.00349001 0.0452419 0.513332 +VERTEX3 1822 32.5438 98.7539 -67.708 0.0274727 0.0341363 0.528814 +VERTEX3 1823 32.8552 95.5365 -67.3983 0.0339578 0.00323584 0.563058 +VERTEX3 1824 30.6042 96.4327 -65.6226 0.00858175 0.0241303 0.506985 +VERTEX3 1825 31.7509 93.4162 -65.9379 0.105106 0.00313648 0.522596 +VERTEX3 1826 31.7071 97.146 -65.0775 0.143118 -0.0262367 0.573344 +VERTEX3 1827 33.6423 91.5445 -65.4195 0.15523 -0.0442244 0.575294 +VERTEX3 1828 35.8834 87.5045 -65.728 0.178017 -0.0761437 0.603038 +VERTEX3 1829 38.5068 75.0073 -68.0089 0.0777038 -0.039091 0.502337 +VERTEX3 1830 37.741 76.6648 -67.1657 0.0928064 -0.049841 0.522125 +VERTEX3 1831 39.5738 68.1288 -68.3151 0.0688702 -0.0218267 0.432477 +VERTEX3 1832 43.229 61.407 -68.6788 0.049872 -0.0604497 0.354298 +VERTEX3 1833 46.1796 53.7503 -69.2358 0.0404848 -0.0424343 0.272829 +VERTEX3 1834 47.2952 35.8957 -69.7182 0.00511198 -0.030671 0.14576 +VERTEX3 1835 46.3887 23.4366 -69.6325 0.0250362 -0.0240461 0.0450621 +VERTEX3 1836 50.8001 4.37894 -70.7724 -0.0042091 -0.0577055 -0.141137 +VERTEX3 1837 49.5829 2.37075 -67.9502 0.0101198 -0.0531911 -0.400042 +VERTEX3 1838 47.7807 -7.7209 -71.0821 0.0193553 -0.065219 -0.091507 +VERTEX3 1839 48.0417 -4.06701 -70.6586 0.0249012 -0.0767101 -0.0676939 +VERTEX3 1840 48.6204 -0.52556 -70.8098 0.0702206 -0.0385074 -0.176341 +VERTEX3 1841 49.715 2.64014 -71.0752 0.088025 -0.0407426 -0.305623 +VERTEX3 1842 50.9345 5.71366 -70.8407 0.0339793 -0.0714089 -0.311277 +VERTEX3 1843 52.2358 9.06175 -71.0874 0.0306347 -0.0540231 -0.392307 +VERTEX3 1844 54.1976 12.5481 -71.4713 -0.00215719 -0.0551932 -0.343393 +VERTEX3 1845 55.7076 16.1955 -71.781 0.016451 -0.0389927 -0.360111 +VERTEX3 1846 57.1102 19.9438 -72.3465 -0.00373607 -0.0252085 -0.273815 +VERTEX3 1847 58.0361 23.8816 -72.3009 0.0348639 -0.0277618 -0.245947 +VERTEX3 1848 58.5113 28.1356 -72.3239 0.0643751 -0.0291716 -0.202744 +VERTEX3 1849 58.7448 32.3545 -72.378 0.0685432 -0.0120197 -0.156888 +VERTEX3 1850 58.736 36.7586 -72.4224 0.0644997 -0.0077458 -0.121726 +VERTEX3 1851 58.4947 41.2016 -72.3195 0.0611276 -0.00830416 -0.0517221 +VERTEX3 1852 57.8882 45.6027 -72.4269 0.0531953 -0.019875 0.00483553 +VERTEX3 1853 57.0035 49.6977 -72.4611 0.0494983 -0.0255059 0.0437728 +VERTEX3 1854 55.869 53.7867 -72.5259 0.0455818 -0.0175008 0.0799205 +VERTEX3 1855 54.6363 57.7992 -72.4284 0.0477718 -0.0167576 0.116146 +VERTEX3 1856 53.1481 61.8398 -72.0907 0.0649986 -0.0112799 0.166503 +VERTEX3 1857 51.3289 66.0776 -71.4378 0.0603905 -0.00371299 0.225762 +VERTEX3 1858 49.6799 69.4452 -71.0535 0.078099 -0.0131861 0.234482 +VERTEX3 1859 47.9704 73.6655 -70.5783 0.0690108 -0.0302555 0.284582 +VERTEX3 1860 46.0527 77.9255 -70.071 0.0679916 -0.0351452 0.32829 +VERTEX3 1861 44.6581 80.9195 -70.2296 0.0543901 -0.0476633 0.3406 +VERTEX3 1862 42.9964 83.4074 -70.7718 0.0276533 -0.0631747 0.374188 +VERTEX3 1863 40.9327 87.1329 -70.9689 0.0238402 -0.0698928 0.414431 +VERTEX3 1864 39.7237 90.0243 -71.925 -0.0171285 -0.0816139 0.429347 +VERTEX3 1865 36.9445 91.867 -73.2886 -0.0575774 -0.087189 0.503982 +VERTEX3 1866 35.6847 94.0752 -73.9 -0.0814237 -0.0493982 0.504019 +VERTEX3 1867 34.0506 93.6469 -74.7703 -0.0908416 -0.0276637 0.514528 +VERTEX3 1868 32.4114 95.8517 -74.4978 -0.0918378 -0.00377598 0.543957 +VERTEX3 1869 30.5043 95.8527 -74.231 -0.0874893 0.0317217 0.530791 +VERTEX3 1870 31.4973 97.6436 -75.4362 -0.0708186 0.031852 0.547094 +VERTEX3 1871 28.3763 97.7909 -74.0527 -0.0497846 0.0730399 0.593917 +VERTEX3 1872 27.9061 99.5666 -72.2657 -0.00870408 0.0377193 0.509776 +VERTEX3 1873 27.3665 98.0906 -71.2106 0.0121083 0.0161978 0.519718 +VERTEX3 1874 26.3572 96.7325 -70.7668 -0.0455768 0.00657163 0.498587 +VERTEX3 1875 25.5615 94.839 -69.2198 0.0371563 0.0200439 0.541686 +VERTEX3 1876 24.986 94.3408 -68.7426 0.119811 -0.00826249 0.641577 +VERTEX3 1877 25.9407 92.8078 -68.5984 0.108256 -0.00568681 0.628982 +VERTEX3 1878 26.6432 92.4314 -68.7597 0.140817 -0.0299348 0.610857 +VERTEX3 1879 27.7448 91.6545 -68.0164 0.156039 -0.0848344 0.610157 +VERTEX3 1880 31.0623 78.0268 -71.4907 0.0693311 -0.0316486 0.526857 +VERTEX3 1881 31.9342 76.4005 -70.5516 0.0902305 -0.0488824 0.530424 +VERTEX3 1882 33.2064 70.5789 -71.3644 0.0559091 -0.01573 0.434626 +VERTEX3 1883 38.4751 62.1267 -72.6886 0.0523241 -0.0533454 0.36118 +VERTEX3 1884 41.7628 54.5776 -73.0264 0.0482672 -0.0575338 0.23991 +VERTEX3 1885 42.5451 38.8532 -73.327 0.00965469 -0.0382898 0.145106 +VERTEX3 1886 42.7198 31.3109 -73.2648 0.0403775 -0.0394006 0.0904425 +VERTEX3 1887 47.7873 10.4648 -74.7441 0.0101594 -0.0660065 -0.0895705 +VERTEX3 1888 48.9082 8.07421 -71.6188 0.0530299 -0.122187 -0.390501 +VERTEX3 1889 44.3558 -3.12046 -74.0271 0.0427791 -0.0675318 -0.00520117 +VERTEX3 1890 44.2658 0.146922 -74.4368 0.0265395 -0.0311434 0.0224595 +VERTEX3 1891 44.4759 4.08223 -74.0772 0.0319812 -0.0259037 -0.145474 +VERTEX3 1892 45.6906 7.56433 -74.2783 0.0298423 -0.0383224 -0.358355 +VERTEX3 1893 47.4883 10.7377 -74.6742 -0.000653894 -0.0351765 -0.289304 +VERTEX3 1894 48.9165 14.2972 -75.1012 0.0284853 -0.0240271 -0.356378 +VERTEX3 1895 50.4273 17.5658 -75.4973 -0.00548515 -0.025442 -0.276841 +VERTEX3 1896 51.5801 21.0719 -75.5771 0.0433387 -0.0334902 -0.276346 +VERTEX3 1897 52.407 25.1091 -75.6664 0.0827169 -0.0387254 -0.212105 +VERTEX3 1898 52.8462 29.0943 -75.7821 0.0661201 -0.00890314 -0.178046 +VERTEX3 1899 53.0241 33.2373 -75.8292 0.0731518 0.00944145 -0.14312 +VERTEX3 1900 52.9784 37.4437 -75.8124 0.0545659 0.0107846 -0.0985955 +VERTEX3 1901 52.6765 41.6955 -75.6776 0.0567996 -0.000144775 -0.043312 +VERTEX3 1902 52.1132 45.8058 -75.6419 0.0569245 -0.00992546 0.00420332 +VERTEX3 1903 51.2782 49.7469 -75.7522 0.0446038 -0.0195664 0.0425253 +VERTEX3 1904 50.223 53.6573 -75.9056 0.0474965 -0.0159187 0.0979833 +VERTEX3 1905 48.9467 57.4311 -75.7609 0.048903 -0.00889394 0.129918 +VERTEX3 1906 47.6644 60.9757 -75.7237 0.0566702 -0.0136726 0.16626 +VERTEX3 1907 45.9323 64.8232 -75.1949 0.0644641 -0.0158518 0.216885 +VERTEX3 1908 44.0439 68.6311 -74.5221 0.0660979 -0.0114449 0.264715 +VERTEX3 1909 42.4649 72.0947 -74.1379 0.07747 -0.0177242 0.279348 +VERTEX3 1910 40.9603 75.6996 -73.8419 0.0749661 -0.0298082 0.316323 +VERTEX3 1911 38.836 79.2882 -73.1883 0.0676941 -0.0415307 0.343729 +VERTEX3 1912 37.4306 82.5704 -73.4097 0.0650714 -0.0619873 0.382384 +VERTEX3 1913 36.1086 85.1943 -73.9748 0.0324046 -0.0732406 0.400791 +VERTEX3 1914 34.3165 88.4465 -74.1554 0.0170483 -0.079472 0.437677 +VERTEX3 1915 33.2356 89.4338 -75.4171 -0.0303389 -0.0750736 0.429464 +VERTEX3 1916 30.7357 90.7804 -76.8708 -0.0753643 -0.0709983 0.495239 +VERTEX3 1917 29.3697 93.8517 -77.2655 -0.0847643 -0.0553499 0.518952 +VERTEX3 1918 27.9607 93.3514 -78.2418 -0.09505 -0.0356567 0.528513 +VERTEX3 1919 26.6967 95.5142 -78.3213 -0.0937122 -0.0231254 0.561295 +VERTEX3 1920 24.0903 96.1564 -77.3042 -0.0873097 0.0300479 0.556854 +VERTEX3 1921 25.502 96.2981 -78.496 -0.0707939 0.0135777 0.54991 +VERTEX3 1922 21.6296 97.8238 -76.9635 -0.051452 0.0771031 0.629486 +VERTEX3 1923 21.479 98.8785 -75.0754 -0.0412234 0.00415065 0.504323 +VERTEX3 1924 21.4452 96.9748 -74.6804 -0.113834 0.0167937 0.486479 +VERTEX3 1925 19.4613 97.5269 -73.5974 -0.0578181 0.0177974 0.584887 +VERTEX3 1926 16.9293 96.9671 -71.9714 0.0485484 0.0214901 0.665904 +VERTEX3 1927 19.3062 93.5457 -71.5992 0.02296 0.0425284 0.61955 +VERTEX3 1928 19.443 91.5848 -71.4124 0.0898132 0.00939128 0.636407 +VERTEX3 1929 19.1323 94.9609 -71.1906 0.12309 -0.0206251 0.632929 +VERTEX3 1930 22.0107 90.9892 -71.0253 0.138306 -0.0742575 0.621506 +VERTEX3 1931 24.3411 77.9382 -74.1613 0.0610564 -0.0214447 0.537952 +VERTEX3 1932 24.9718 77.839 -73.4342 0.079377 -0.0562397 0.559959 +VERTEX3 1933 26.5457 74.3197 -74.1058 0.0655314 -0.0104352 0.479969 +VERTEX3 1934 33.0352 65.6626 -75.727 0.0632631 -0.0434166 0.378416 +VERTEX3 1935 36.8998 50.5081 -76.7578 0.0449163 -0.0630733 0.23286 +VERTEX3 1936 35.7465 43.1918 -76.66 0.0305953 -0.0384996 0.156694 +VERTEX3 1937 36.7778 35.3007 -76.5388 0.0530877 -0.0438974 0.128123 +VERTEX3 1938 44.97 15.6653 -78.5937 0.03539 -0.0664452 -0.0380426 +VERTEX3 1939 45.2239 14.004 -75.3575 0.0604397 -0.0956521 -0.201077 +VERTEX3 1940 39.3976 0.762585 -76.4525 0.0748007 0.00627836 0.11115 +VERTEX3 1941 39.9846 4.63833 -77.2016 0.0873847 0.0174208 0.290373 +VERTEX3 1942 40.6842 8.34019 -77.5525 0.0686212 0.033083 -0.0851293 +VERTEX3 1943 41.9796 12.0302 -77.9001 0.0590025 0.0140724 -0.305938 +VERTEX3 1944 43.5776 15.2548 -78.2923 0.0159239 -0.00777515 -0.244819 +VERTEX3 1945 44.8587 18.6454 -78.5065 0.060029 -0.0389079 -0.280305 +VERTEX3 1946 45.9511 22.3728 -78.7411 0.0931855 -0.0334258 -0.203146 +VERTEX3 1947 46.5877 26.0756 -78.8032 0.0694916 -0.00456786 -0.204156 +VERTEX3 1948 46.9556 30.0297 -78.949 0.0828498 0.0186215 -0.147817 +VERTEX3 1949 47.1571 34.074 -78.8654 0.0562827 0.0190139 -0.123599 +VERTEX3 1950 46.9524 38.1018 -78.7208 0.0608436 0.00622471 -0.0816126 +VERTEX3 1951 46.6736 42.1107 -78.6566 0.0575091 -0.000774509 -0.0349605 +VERTEX3 1952 46.0745 45.9823 -78.5978 0.0584532 -0.00780566 0.00991831 +VERTEX3 1953 45.2493 49.7224 -78.6616 0.050468 -0.0157779 0.0514239 +VERTEX3 1954 44.2446 53.3852 -78.8086 0.0365802 -0.0188592 0.0891382 +VERTEX3 1955 43.0869 56.932 -78.8784 0.0436227 -0.00608156 0.131368 +VERTEX3 1956 41.6857 60.2748 -78.7072 0.063056 -0.0145801 0.149291 +VERTEX3 1957 40.3485 63.7729 -78.5516 0.047502 -0.0227672 0.190381 +VERTEX3 1958 38.5869 67.1383 -78.0453 0.0709781 -0.0116698 0.253595 +VERTEX3 1959 36.7861 70.5664 -77.4552 0.0769042 -0.011282 0.279885 +VERTEX3 1960 35.0385 74.1188 -76.9573 0.0885218 -0.0224047 0.333323 +VERTEX3 1961 33.6776 77.4263 -76.7163 0.0712455 -0.0337445 0.353242 +VERTEX3 1962 31.633 80.176 -76.1822 0.0767151 -0.0440396 0.371115 +VERTEX3 1963 30.1055 83.172 -76.2283 0.0571075 -0.0697134 0.399278 +VERTEX3 1964 28.8474 85.4199 -76.9736 0.0327172 -0.0794347 0.414074 +VERTEX3 1965 26.9911 88.4253 -77.215 0.015787 -0.0880039 0.457925 +VERTEX3 1966 26.1023 89.7187 -78.334 -0.0179878 -0.0883208 0.455279 +VERTEX3 1967 23.7294 90.3741 -80.1275 -0.0732659 -0.088739 0.525754 +VERTEX3 1968 22.808 92.2368 -80.4656 -0.0843487 -0.0574289 0.533569 +VERTEX3 1969 22.0488 92.5593 -81.1812 -0.0907704 -0.0392747 0.536926 +VERTEX3 1970 20.0246 95.3647 -81.1615 -0.0981018 -0.0446423 0.574279 +VERTEX3 1971 18.2861 93.9276 -79.8236 -0.0898721 0.0215666 0.563819 +VERTEX3 1972 19.3691 95.5119 -81.3306 -0.0743501 0.000850648 0.550503 +VERTEX3 1973 15.2219 96.6198 -79.347 -0.0691886 0.046616 0.638201 +VERTEX3 1974 14.5841 99.3252 -78.4554 -0.130245 -0.010459 0.532067 +VERTEX3 1975 14.5622 96.4233 -77.8165 -0.114993 0.0170842 0.551151 +VERTEX3 1976 10.0471 99.1918 -75.9075 -0.0371201 0.0169997 0.669441 +VERTEX3 1977 9.25447 97.6024 -74.0004 -0.0150127 0.0454837 0.63089 +VERTEX3 1978 11.5359 93.8944 -74.4977 0.0299729 0.0712649 0.642413 +VERTEX3 1979 11.8613 93.4285 -73.7741 0.0726103 0.0159853 0.647898 +VERTEX3 1980 12.9441 94.6217 -73.6212 0.102954 -0.0214397 0.630423 +VERTEX3 1981 15.9283 87.4026 -74.4691 0.129178 -0.0548504 0.622895 +VERTEX3 1982 18.0204 82.1859 -76.4879 0.0436971 -0.0220331 0.553682 +VERTEX3 1983 17.6849 80.2446 -75.8019 0.0868338 -0.0317355 0.570846 +VERTEX3 1984 19.9782 75.0866 -76.6981 0.067256 -0.00295401 0.499612 +VERTEX3 1985 26.397 67.8193 -78.5629 0.0635666 -0.0419446 0.397068 +VERTEX3 1986 30.8282 54.9442 -79.4295 0.0513358 -0.0539242 0.235964 +VERTEX3 1987 30.6369 48.4292 -79.5573 0.0612329 -0.0229929 0.181574 +VERTEX3 1988 34.1711 39.3641 -79.4145 0.0690593 -0.0512033 0.165084 +VERTEX3 1989 40.5253 20.4014 -81.4225 0.0410996 -0.0571432 0.0291694 +VERTEX3 1990 41.1713 19.138 -78.1516 0.0973976 -0.0660403 0.0694834 +VERTEX3 1991 35.4576 4.68454 -79.9672 0.141007 0.00760599 0.154831 +VERTEX3 1992 35.4919 8.49002 -80.3714 0.0943516 0.0344841 0.282268 +VERTEX3 1993 36.4435 12.9171 -80.8009 0.0856261 0.0194345 -0.0881992 +VERTEX3 1994 37.933 16.0737 -81.098 0.0577474 -0.0178556 -0.241333 +VERTEX3 1995 39.2535 19.8117 -81.3975 0.0983559 -0.0244375 -0.16547 +VERTEX3 1996 40.047 23.4044 -81.4756 0.0755447 0.00835773 -0.236466 +VERTEX3 1997 40.6849 27.0933 -81.643 0.09713 0.0298163 -0.14202 +VERTEX3 1998 40.9833 30.8942 -81.578 0.0648936 0.0287971 -0.141801 +VERTEX3 1999 40.9878 34.7622 -81.482 0.0532878 0.00746004 -0.0931129 +VERTEX3 2000 40.7599 38.5881 -81.3918 0.0626097 -0.00178757 -0.0626329 +VERTEX3 2001 40.4356 42.431 -81.2878 0.0555154 -0.00506915 -0.0248232 +VERTEX3 2002 39.9148 46.14 -81.2412 0.0527279 -0.00339003 0.0242243 +VERTEX3 2003 39.1123 49.7141 -81.282 0.0559819 -0.012948 0.0546299 +VERTEX3 2004 38.086 53.2033 -81.3388 0.0389824 -0.0152592 0.0873154 +VERTEX3 2005 37.0126 56.4561 -81.4356 0.0417022 -0.0117098 0.126044 +VERTEX3 2006 35.7006 59.6377 -81.4676 0.0489646 -0.00837448 0.157983 +VERTEX3 2007 34.2124 62.7424 -81.2941 0.0588396 -0.00912422 0.193952 +VERTEX3 2008 32.8572 65.9552 -81.1679 0.0614528 -0.0232299 0.231523 +VERTEX3 2009 31.1397 69.2136 -80.5595 0.0719747 -0.0154259 0.268935 +VERTEX3 2010 29.4314 71.8531 -80.0309 0.0786852 -0.0126794 0.297042 +VERTEX3 2011 27.8506 75.3425 -79.4987 0.0884411 -0.0281845 0.336231 +VERTEX3 2012 26.3386 77.9337 -79.2548 0.0804978 -0.0449886 0.339081 +VERTEX3 2013 24.23 80.9224 -78.8128 0.0857474 -0.0549773 0.413886 +VERTEX3 2014 22.8595 83.7054 -78.9023 0.0702921 -0.0849524 0.437234 +VERTEX3 2015 21.6956 86.6764 -79.5909 0.0385249 -0.0982523 0.456638 +VERTEX3 2016 19.9678 88.2306 -80.0323 0.024132 -0.104128 0.478787 +VERTEX3 2017 19.1976 89.3763 -81.3932 -0.0205904 -0.0981521 0.487893 +VERTEX3 2018 17.1105 89.8889 -82.91 -0.0627063 -0.103832 0.559412 +VERTEX3 2019 16.6859 91.3275 -83.2604 -0.0788411 -0.062797 0.549254 +VERTEX3 2020 15.6964 91.5584 -83.9378 -0.0873838 -0.0598267 0.551004 +VERTEX3 2021 14.3648 93.2868 -83.7416 -0.0948045 -0.0655157 0.568999 +VERTEX3 2022 13.3612 91.2222 -82.7605 -0.0926581 0.012078 0.579448 +VERTEX3 2023 13.6466 93.1127 -84.4531 -0.102246 -0.0545069 0.541298 +VERTEX3 2024 11.2325 93.3272 -82.8532 -0.149148 -0.0577159 0.502825 +VERTEX3 2025 9.29993 93.0536 -81.3405 -0.150999 -0.0190247 0.587865 +VERTEX3 2026 6.10611 97.5651 -79.9603 -0.102172 0.0137303 0.612153 +VERTEX3 2027 2.85611 97.4212 -77.9474 -0.0233576 0.010564 0.696969 +VERTEX3 2028 1.7192 97.5443 -76.7102 -0.0124749 0.0637671 0.646009 +VERTEX3 2029 3.8061 96.9095 -76.7039 0.0296187 0.0460259 0.676427 +VERTEX3 2030 4.63129 94.9065 -75.58 0.0721879 0.0042416 0.658464 +VERTEX3 2031 8.243 89.5189 -76.806 0.0909659 -0.0513534 0.612778 +VERTEX3 2032 7.53075 91.0373 -76.2816 0.132098 -0.0674787 0.655215 +VERTEX3 2033 9.96755 81.1449 -79.0855 0.0494774 -0.021918 0.563363 +VERTEX3 2034 11.5755 80.2282 -78.2764 0.0838184 -0.0215837 0.560912 +VERTEX3 2035 13.3695 75.8195 -78.9298 0.0748057 -0.012148 0.515693 +VERTEX3 2036 20.5397 68.5642 -81.2041 0.0720635 -0.0378482 0.394968 +VERTEX3 2037 23.8299 62.4746 -81.8951 0.0635937 -0.018939 0.289286 +VERTEX3 2038 25.2779 53.957 -81.7809 0.0737504 0.000395671 0.219494 +VERTEX3 2039 28.6326 42.3836 -81.4158 0.105169 -0.0406259 0.201124 +VERTEX3 2040 36.9044 25.2454 -83.9854 0.09121 -0.0375593 0.0480131 +VERTEX3 2041 37.1644 23.5931 -80.6249 0.135641 -0.010971 0.00215452 +VERTEX3 2042 30.6109 8.92323 -82.8131 0.178299 0.0308416 0.106919 +VERTEX3 2043 31.3049 12.3188 -83.2945 0.12111 0.110064 0.181783 +VERTEX3 2044 32.4631 16.5499 -83.6093 0.0256117 0.0558443 -0.0902135 +VERTEX3 2045 33.2612 20.5381 -83.8106 0.113115 0.0290952 -0.242531 +VERTEX3 2046 34.1251 24.3878 -83.8784 0.0946885 0.0300854 -0.107271 +VERTEX3 2047 34.6207 28.0037 -83.8381 0.0645083 0.0392504 -0.134196 +VERTEX3 2048 34.7638 31.5823 -83.7246 0.0481873 0.00323533 -0.0944506 +VERTEX3 2049 34.7386 35.1793 -83.8056 0.0532923 -0.00773964 -0.0695123 +VERTEX3 2050 34.5423 39.0126 -83.7789 0.0532896 -0.00427051 -0.0366751 +VERTEX3 2051 34.1816 42.7091 -83.6245 0.0571378 -0.0082795 -0.0100111 +VERTEX3 2052 33.6386 46.2587 -83.5712 0.0537359 -0.00423278 0.0178886 +VERTEX3 2053 32.8068 49.6586 -83.559 0.043355 -0.0127213 0.052519 +VERTEX3 2054 31.8013 52.8707 -83.5585 0.0479291 -0.0177583 0.094279 +VERTEX3 2055 30.6525 56.1081 -83.701 0.0354619 -0.0100209 0.120514 +VERTEX3 2056 29.4706 59.0422 -83.6946 0.034425 -0.00602211 0.163871 +VERTEX3 2057 28.1775 61.8816 -83.6654 0.0446807 0.00223513 0.165387 +VERTEX3 2058 26.5228 64.6581 -83.3603 0.0519731 -0.00802533 0.232559 +VERTEX3 2059 24.948 67.3752 -83.1884 0.0568428 0.00284082 0.286105 +VERTEX3 2060 23.4758 70.3972 -82.6534 0.0696108 -0.00590124 0.302908 +VERTEX3 2061 21.821 72.9392 -82.2477 0.0739015 -0.0159087 0.331775 +VERTEX3 2062 20.2975 75.8178 -81.7778 0.0918027 -0.025868 0.349756 +VERTEX3 2063 18.9159 78.565 -81.6263 0.0706382 -0.0513819 0.393698 +VERTEX3 2064 17.0597 81.0097 -81.3082 0.0871394 -0.0666701 0.432751 +VERTEX3 2065 15.4561 83.8511 -81.3147 0.0791463 -0.0896172 0.464547 +VERTEX3 2066 14.1864 86.0068 -82.157 0.0404523 -0.107971 0.494905 +VERTEX3 2067 12.9651 87.8764 -82.6688 0.030267 -0.116699 0.511912 +VERTEX3 2068 12.3045 88.9928 -84.179 -0.00216064 -0.119486 0.526916 +VERTEX3 2069 10.2528 88.797 -85.2919 -0.0387746 -0.111783 0.602893 +VERTEX3 2070 9.80535 90.9387 -85.4369 -0.0501389 -0.0993777 0.583977 +VERTEX3 2071 9.16036 89.5295 -86.2651 -0.0824807 -0.0777186 0.554661 +VERTEX3 2072 8.61301 90.6894 -85.8006 -0.0644884 -0.0797484 0.556349 +VERTEX3 2073 6.0255 89.956 -85.039 -0.0987078 0.0061534 0.565269 +VERTEX3 2074 7.88408 92.1315 -87.7246 -0.212441 -0.116268 0.507132 +VERTEX3 2075 5.21389 88.9443 -85.723 -0.168566 -0.0532508 0.621515 +VERTEX3 2076 2.69788 91.8289 -84.3502 -0.14482 -0.0368777 0.615906 +VERTEX3 2077 -2.07436 94.1466 -81.7257 -0.0875297 0.00201308 0.663464 +VERTEX3 2078 -4.11861 93.7246 -79.9599 -0.00993509 0.00403457 0.710582 +VERTEX3 2079 -5.33246 97.4421 -78.6965 0.00413603 0.0477431 0.688219 +VERTEX3 2080 -2.71068 92.6864 -78.6001 0.0332008 0.0345172 0.698171 +VERTEX3 2081 -1.76222 91.1676 -78.0498 0.0786855 -0.000137918 0.66347 +VERTEX3 2082 0.0854451 90.5317 -78.8298 0.117325 -0.0451849 0.638551 +VERTEX3 2083 0.716968 87.2533 -79.2609 0.128226 -0.0711413 0.663907 +VERTEX3 2084 3.15642 81.1969 -80.9143 0.0594741 -0.02347 0.594176 +VERTEX3 2085 4.71291 79.5289 -80.8875 0.0946156 -0.0439354 0.617505 +VERTEX3 2086 6.04421 76.8796 -80.7899 0.0780193 -0.00519796 0.528813 +VERTEX3 2087 13.2752 70.2637 -83.1182 0.0785033 -0.0343548 0.414009 +VERTEX3 2088 16.205 66.8186 -83.4462 0.0803667 -0.00809935 0.321697 +VERTEX3 2089 20.3243 56.6614 -83.4107 0.0859119 0.0103291 0.23649 +VERTEX3 2090 22.6071 46.9737 -83.0334 0.124417 -0.0163069 0.240139 +VERTEX3 2091 30.9614 29.1471 -86.056 0.0982134 -0.0119317 0.0630405 +VERTEX3 2092 32.0326 27.9634 -83.1447 0.169571 0.0224512 -0.0341313 +VERTEX3 2093 26.37 12.2234 -84.8527 0.0395428 0.0811368 0.0737493 +VERTEX3 2094 26.835 16.9482 -85.4993 -0.0069056 0.047071 0.176479 +VERTEX3 2095 27.6244 21.6295 -85.5746 0.0179836 -0.00862691 -0.0454231 +VERTEX3 2096 28.1766 25.0249 -85.6696 0.0718067 0.0263806 -0.117667 +VERTEX3 2097 28.3301 28.3965 -85.6474 0.0433474 -0.00728908 -0.0781235 +VERTEX3 2098 28.5956 31.7989 -85.826 0.0424355 -0.0123338 -0.0503035 +VERTEX3 2099 28.5316 35.3905 -85.8681 0.0478232 -0.00589004 -0.0418625 +VERTEX3 2100 28.2887 39.2638 -85.8645 0.0578278 -0.00803495 -0.0194572 +VERTEX3 2101 27.8813 43.0043 -85.7001 0.0548511 -0.0151308 -0.000820259 +VERTEX3 2102 27.3117 46.4751 -85.5917 0.0508446 -0.00010016 0.0234164 +VERTEX3 2103 26.5017 49.6768 -85.5443 0.0474012 -0.0119646 0.0570464 +VERTEX3 2104 25.5163 52.7468 -85.5624 0.0398394 -0.0185799 0.0850362 +VERTEX3 2105 24.372 55.7045 -85.5801 0.0364677 -0.00875465 0.123829 +VERTEX3 2106 23.1355 58.4267 -85.5616 0.0260707 -0.0143636 0.147497 +VERTEX3 2107 21.8316 61.0204 -85.5301 0.0279862 0.00181258 0.190089 +VERTEX3 2108 20.4831 63.7224 -85.3266 0.0352458 0.00886067 0.20327 +VERTEX3 2109 18.7956 66.1999 -84.9974 0.039773 0.00179714 0.268146 +VERTEX3 2110 17.2246 68.4476 -84.8448 0.0524037 0.00479596 0.31846 +VERTEX3 2111 15.6879 71.1197 -84.3791 0.0705106 0.00378009 0.336909 +VERTEX3 2112 14.1521 73.2974 -84.0705 0.0764135 -0.0175097 0.35302 +VERTEX3 2113 12.5514 75.6335 -83.5801 0.0843354 -0.0407246 0.401118 +VERTEX3 2114 11.225 78.3883 -83.5548 0.0780064 -0.0492917 0.419609 +VERTEX3 2115 10.1262 80.8709 -83.6398 0.0837756 -0.0733875 0.433159 +VERTEX3 2116 8.2499 83.1106 -83.5742 0.0886329 -0.0932051 0.495186 +VERTEX3 2117 6.84383 84.6665 -84.1835 0.0437442 -0.119012 0.513604 +VERTEX3 2118 5.91447 85.5864 -84.9627 0.0337708 -0.113187 0.528265 +VERTEX3 2119 5.49645 87.4518 -86.4388 -0.00165373 -0.122638 0.556498 +VERTEX3 2120 3.49706 86.8458 -87.2716 -0.0281845 -0.118571 0.607441 +VERTEX3 2121 3.04709 88.1668 -87.4858 -0.0388034 -0.0974479 0.594671 +VERTEX3 2122 2.97687 87.9358 -88.2363 -0.0699044 -0.101528 0.555215 +VERTEX3 2123 1.96557 88.3345 -87.4894 -0.0733296 -0.0900134 0.538457 +VERTEX3 2124 1.86959 87.9682 -88.5837 -0.12994 -0.151403 0.466804 +VERTEX3 2125 1.48676 88.3267 -90.0909 -0.203944 -0.106238 0.609845 +VERTEX3 2126 -1.00845 87.7566 -89.3068 -0.18304 -0.157893 0.652104 +VERTEX3 2127 -4.72409 88.6341 -86.7466 -0.12335 -0.0535365 0.653507 +VERTEX3 2128 -9.5428 91.689 -83.0155 -0.0483839 0.00775433 0.703119 +VERTEX3 2129 -11.0832 91.5288 -82.0828 0.0320013 0.00653879 0.779219 +VERTEX3 2130 -12.1738 94.5236 -80.3392 0.0107212 0.049133 0.70939 +VERTEX3 2131 -10.0688 90.196 -80.1196 0.0676094 0.0239131 0.725968 +VERTEX3 2132 -8.92858 90.7979 -79.575 0.0981619 -0.0298122 0.694357 +VERTEX3 2133 -7.72232 89.689 -79.4618 0.128066 -0.0311166 0.655874 +VERTEX3 2134 -7.52264 86.0488 -80.5517 0.1649 -0.0772111 0.706791 +VERTEX3 2135 -2.94821 76.6426 -83.19 0.074619 -0.0188033 0.611991 +VERTEX3 2136 -3.09225 77.5116 -82.5687 0.100208 -0.0496773 0.641992 +VERTEX3 2137 -2.29397 75.4963 -82.2921 0.0801652 -0.0133826 0.557309 +VERTEX3 2138 6.31504 70.3743 -85.0365 0.0550685 -0.0275175 0.445197 +VERTEX3 2139 9.19418 68.1566 -84.5833 0.0757831 0.00745422 0.351282 +VERTEX3 2140 12.1748 59.1231 -84.7792 0.0824904 0.0319236 0.268874 +VERTEX3 2141 17.7249 48.4467 -85.1966 0.11947 -0.00401447 0.250789 +VERTEX3 2142 24.8674 32.288 -86.8169 0.0851689 0.000742898 0.0666717 +VERTEX3 2143 26.7842 32.7526 -84.0394 0.0604382 0.00298747 -0.0972074 +VERTEX3 2144 22.9044 18.258 -86.8396 -0.0119474 -0.0324646 -0.0293011 +VERTEX3 2145 21.946 21.9655 -86.9637 -0.0175105 -0.116215 0.0343457 +VERTEX3 2146 22.1093 25.7389 -87.3067 0.0398916 -0.0185703 -0.0592771 +VERTEX3 2147 22.4825 28.7377 -87.5099 0.0373099 -0.0105938 -0.0514556 +VERTEX3 2148 22.5344 31.8102 -87.5843 0.0480397 -0.0138408 -0.02935 +VERTEX3 2149 22.413 35.1516 -87.6161 0.046826 -0.0142177 0.0102079 +VERTEX3 2150 22.0872 39.3751 -87.5809 0.0370333 -0.00951407 -0.0048061 +VERTEX3 2151 21.5991 43.4046 -87.5808 0.0455734 -0.00403579 0.0105308 +VERTEX3 2152 21.0028 46.8098 -87.3574 0.0484471 -0.00853964 0.0183059 +VERTEX3 2153 20.1841 49.8845 -87.1498 0.0533349 0.00186745 0.0577735 +VERTEX3 2154 19.2668 52.7922 -87.1573 0.0396434 -0.0225669 0.0863421 +VERTEX3 2155 18.158 55.4408 -87.1944 0.0443021 -0.016011 0.122051 +VERTEX3 2156 16.8033 57.9298 -87.1455 0.0338998 -0.0115199 0.156057 +VERTEX3 2157 15.4937 60.2661 -87.0744 0.0144642 -0.012263 0.183393 +VERTEX3 2158 14.2038 62.5685 -86.9083 0.0233847 0.000912242 0.221617 +VERTEX3 2159 12.7262 64.8406 -86.6518 0.0230927 0.0114155 0.26811 +VERTEX3 2160 10.8165 66.5822 -86.2948 0.0293884 0.0100912 0.317748 +VERTEX3 2161 9.36252 69.0291 -86.1012 0.0483477 -0.00160536 0.338498 +VERTEX3 2162 7.87264 71.202 -85.7075 0.0695868 -0.00433769 0.372113 +VERTEX3 2163 6.2556 72.7985 -85.4125 0.0510762 -0.0218987 0.41194 +VERTEX3 2164 4.8946 75.2378 -85.1459 0.0913781 -0.0300965 0.458245 +VERTEX3 2165 3.4504 77.5237 -85.1433 0.0835395 -0.0449172 0.478539 +VERTEX3 2166 2.65616 79.8988 -85.4705 0.092832 -0.0805468 0.458074 +VERTEX3 2167 1.00181 81.7609 -85.1986 0.0742895 -0.105677 0.508851 +VERTEX3 2168 -0.29051 83.0413 -86.1074 0.0573884 -0.132094 0.544662 +VERTEX3 2169 -1.31562 83.9933 -86.6151 0.0376515 -0.120793 0.589598 +VERTEX3 2170 -2.00214 84.9116 -88.4304 0.0190973 -0.112602 0.604581 +VERTEX3 2171 -3.23043 84.4407 -89.0344 -0.0140785 -0.121231 0.610856 +VERTEX3 2172 -3.92153 85.1857 -89.3279 -0.0184642 -0.115705 0.622273 +VERTEX3 2173 -3.77134 85.268 -90.0429 -0.0454441 -0.104908 0.552169 +VERTEX3 2174 -4.65356 85.5777 -89.1687 -0.0559612 -0.0815005 0.50913 +VERTEX3 2175 -4.32665 85.1656 -92.2244 -0.154355 -0.215721 0.521151 +VERTEX3 2176 -4.66212 85.638 -93.1377 -0.23383 -0.143649 0.658356 +VERTEX3 2177 -6.8185 84.2358 -91.3375 -0.14321 -0.10731 0.675582 +VERTEX3 2178 -12.509 87.1407 -88.4816 -0.0886555 -0.00334049 0.712524 +VERTEX3 2179 -16.8509 89.6678 -83.85 0.0148775 0.0319656 0.73975 +VERTEX3 2180 -17.6722 88.447 -83.71 0.025572 0.0148284 0.829327 +VERTEX3 2181 -18.6577 90.2934 -81.4577 0.0305519 0.0569415 0.760543 +VERTEX3 2182 -15.9026 85.7975 -81.133 0.0788247 0.0320382 0.739417 +VERTEX3 2183 -18.0913 89.8247 -79.7858 0.149073 -0.0206896 0.769805 +VERTEX3 2184 -14.9782 87.7241 -81.1194 0.1565 -0.0286867 0.712056 +VERTEX3 2185 -14.0298 81.9858 -82.2944 0.174499 -0.0792735 0.734223 +VERTEX3 2186 -11.163 75.2578 -84.2586 0.0773982 -0.0387776 0.619108 +VERTEX3 2187 -11.2716 76.316 -83.4225 0.0885283 -0.0413106 0.694424 +VERTEX3 2188 -9.31986 74.7234 -83.4242 0.0768401 -0.00804366 0.597363 +VERTEX3 2189 -2.4011 74.5708 -85.917 0.0313288 -0.0212139 0.508444 +VERTEX3 2190 3.39947 67.5464 -85.79 0.0805489 0.013599 0.379546 +VERTEX3 2191 5.70867 60.2679 -85.998 0.0758443 0.038523 0.298099 +VERTEX3 2192 10.991 48.6416 -85.9646 0.103162 -0.00460586 0.247197 +VERTEX3 2193 16.4362 36.0375 -86.6343 0.080482 -0.0285982 0.0620725 +VERTEX3 2194 25.8089 41.3126 -86.129 0.00931581 -0.158237 -0.26874 +VERTEX3 2195 17.4577 25.9681 -88.0948 0.0155294 -0.0112181 -0.0363624 +VERTEX3 2196 16.5712 26.2782 -88.8208 0.0189714 -0.0179318 -0.0367534 +VERTEX3 2197 16.5033 28.8886 -88.9656 0.0287555 -0.0189706 -0.0464295 +VERTEX3 2198 16.5143 31.7149 -88.9742 0.0445089 -0.0106482 -0.0154963 +VERTEX3 2199 16.3609 34.3897 -88.9486 0.0458629 -0.0248266 0.0647399 +EDGE3 0 1 0.142135 2.35517 -0.0102327 -0.0319376 0.0249381 0.144005 +EDGE3 1 2 -0.0302179 2.31152 -0.263451 -0.0324139 -0.000441195 0.148003 +EDGE3 2 3 0.0557936 2.41308 -0.0907328 0.000177213 -0.0159508 0.111957 +EDGE3 3 4 0.0329358 2.32759 -0.0910751 -0.0229219 -0.00723734 0.116474 +EDGE3 4 5 -0.0246424 2.43228 -0.0826252 0.036889 -0.00360582 0.106896 +EDGE3 5 6 -0.0441412 2.4152 -0.0450475 -0.000902747 0.0144355 0.0620788 +EDGE3 6 7 0.126405 2.52821 -0.0471717 0.0448278 0.0295693 0.115857 +EDGE3 7 8 0.174745 2.40918 -0.0978439 0.0345772 0.0433886 0.103089 +EDGE3 8 9 0.0920302 2.45716 -0.0624008 0.0199746 -0.00115823 0.118818 +EDGE3 9 10 0.1012 2.51161 0.0289767 -0.0393727 0.0187841 0.12601 +EDGE3 10 11 -0.0432916 2.55211 -0.0489115 0.0429138 -0.0345108 0.112142 +EDGE3 11 12 0.0323137 2.68638 0.0164828 -0.0208246 0.0329187 0.11095 +EDGE3 12 13 -0.0458792 2.46896 0.051913 0.0834607 0.00994417 0.163069 +EDGE3 13 14 0.028409 2.74036 0.154456 0.011377 0.00823426 0.0994095 +EDGE3 14 15 -0.255521 2.51875 -0.260493 -0.020439 -0.0115567 0.10063 +EDGE3 15 16 -0.207298 2.55606 -0.00750751 0.0288935 8.92498e-05 0.102035 +EDGE3 16 17 -0.0232232 2.62218 0.161642 -0.0117727 0.0142764 0.157621 +EDGE3 17 18 0.172624 2.82809 0.0200802 -0.0320181 -0.0186073 0.116387 +EDGE3 18 19 0.104784 2.60351 -0.165277 -0.00359431 -0.0262071 0.092372 +EDGE3 19 20 -0.00918021 2.89065 -0.00847865 0.0431695 -0.0180277 0.134949 +EDGE3 20 21 -0.00459382 2.86276 -0.0630594 -0.0083998 0.00714964 0.100628 +EDGE3 21 22 0.033076 2.8195 0.0638549 -0.0158611 0.0143183 0.115772 +EDGE3 22 23 -0.0280515 2.77973 -0.0805694 -0.0116863 0.0122267 0.114286 +EDGE3 23 24 0.23428 2.76917 -0.0230835 0.0441419 -0.0161249 0.109122 +EDGE3 24 25 -0.0571718 2.76825 0.124032 -0.0240298 -0.0603932 0.121259 +EDGE3 25 26 -0.0637599 2.74527 -0.0293876 -0.0168431 0.0173628 0.128587 +EDGE3 27 26 -0.386467 -2.72002 0.112517 -0.0293406 0.0297129 -0.160592 +EDGE3 28 27 -0.35837 -2.81956 0.111961 0.00796789 -0.0169516 -0.132868 +EDGE3 29 28 -0.215582 -2.88708 0.0849365 -0.0271487 0.0302639 -0.109097 +EDGE3 30 29 -0.300383 -2.69956 0.0568224 0.00118963 -0.0290945 -0.0838263 +EDGE3 31 30 -0.452357 -3.01403 -0.112578 0.0336296 0.017111 -0.119611 +EDGE3 32 31 -0.303143 -2.82183 0.0723764 0.0117906 0.0072254 -0.156743 +EDGE3 33 32 -0.573439 -2.85446 0.134837 -0.00948703 0.00664943 -0.147758 +EDGE3 34 33 -0.342564 -2.81535 0.037161 0.00365999 -0.00139288 -0.139315 +EDGE3 35 34 -0.392514 -2.71287 0.0429635 0.0114237 0.044421 -0.142207 +EDGE3 36 35 -0.501577 -2.93792 0.04093 0.0201385 -0.0232079 -0.145391 +EDGE3 37 36 -0.370257 -2.9791 0.035805 -0.0237647 -0.0103308 -0.118169 +EDGE3 38 37 -0.0829781 -3.11147 0.0302124 0.0470629 0.0098856 -0.0937817 +EDGE3 39 38 -0.292685 -2.68255 0.0321595 0.00364105 -0.00773812 -0.119864 +EDGE3 40 39 -0.330289 -2.88119 0.0464991 -0.0108285 -0.00510689 -0.140758 +EDGE3 41 40 -0.227377 -2.9709 -0.0179701 0.038939 0.0332026 -0.0572276 +EDGE3 42 41 -0.21224 -2.91837 -0.232378 0.055362 -0.0612021 -0.112429 +EDGE3 43 42 -0.525825 -2.92151 -0.0550979 0.0159841 0.0340644 -0.167465 +EDGE3 44 43 -0.274194 -3.00492 -0.111905 0.00780266 0.010964 -0.153163 +EDGE3 45 44 -0.353819 -2.99966 0.0250547 0.0120463 0.0153602 -0.129819 +EDGE3 46 45 -0.33367 -2.92216 -0.136702 0.0102404 -0.0292803 -0.125359 +EDGE3 47 46 -0.311254 -2.97259 0.0792712 -0.0122079 -0.014873 -0.108863 +EDGE3 48 47 -0.459223 -3.24941 0.122781 0.000278327 -0.0139984 -0.151906 +EDGE3 49 48 -0.363993 -3.2445 -0.135323 0.0152571 -0.00060928 -0.122627 +EDGE3 50 49 -0.348649 -3.04902 -0.113275 0.0205495 0.0279895 -0.109262 +EDGE3 50 51 -0.0886201 3.21568 -0.0264528 -0.000214552 0.016896 0.0879504 +EDGE3 51 52 0.063002 3.26176 -0.00684437 -0.0146257 -0.0354942 0.111862 +EDGE3 52 53 -0.0557637 3.17409 0.0734774 0.0709498 0.0288949 0.105063 +EDGE3 53 54 -0.108727 3.24709 -0.0137857 -0.0226472 0.0251277 0.0593623 +EDGE3 54 55 -0.0249343 3.06161 -0.132549 0.00100221 0.0140341 0.102152 +EDGE3 55 56 -0.105718 3.14621 -0.177419 -0.0211034 0.00969485 0.134409 +EDGE3 56 57 -0.0705069 3.21174 0.01297 -0.0388077 0.0366992 0.128814 +EDGE3 57 58 -0.308481 3.23319 -0.0291353 -0.0268371 0.00527244 0.100488 +EDGE3 58 59 -0.141402 3.27307 -0.0251842 -0.0205711 0.0169529 0.182837 +EDGE3 59 60 0.0213947 3.14314 -0.145891 0.0272168 -0.00321541 0.181868 +EDGE3 60 61 0.0553422 3.42191 0.0226578 0.000485278 0.0170686 0.119882 +EDGE3 61 62 -0.0876106 3.43325 -0.0604015 0.0315106 -0.0143553 0.133301 +EDGE3 62 63 -0.0231087 3.33901 -0.048245 -0.01919 0.0269634 0.0893058 +EDGE3 63 64 -0.173162 3.41663 -0.0409807 0.00179984 -0.0224518 0.115081 +EDGE3 64 65 0.0750887 3.36666 -0.00884558 0.0185089 -0.000408084 0.132289 +EDGE3 65 66 -0.318426 3.53535 0.0236881 0.0552963 -0.00696908 0.154044 +EDGE3 66 67 -0.309377 3.45796 -0.0860191 -0.0211663 0.00841756 0.0671391 +EDGE3 67 68 -0.0971846 3.40725 0.0457422 -0.00494101 -0.0430919 0.0839735 +EDGE3 68 69 -0.0796663 3.4423 -0.0600108 0.0285404 0.00307746 0.117533 +EDGE3 69 70 -0.165549 3.56416 0.0506461 -0.00239879 -0.00239417 0.16383 +EDGE3 70 71 -0.0136551 3.43078 -0.133598 0.00967105 -0.00759251 0.121395 +EDGE3 71 72 -0.0975885 3.49352 -0.0818545 0.0272017 0.0132885 0.142509 +EDGE3 72 73 -0.112144 3.48107 0.0107524 -0.0252711 0.00661745 0.154767 +EDGE3 73 74 -0.160196 3.45397 -0.0511834 0.00229982 -0.00639532 0.102674 +EDGE3 74 75 -0.282206 3.60103 0.0468579 0.00620231 -0.0138812 0.112074 +EDGE3 75 76 0.0905726 3.44264 0.0529876 -0.02339 0.0432606 0.155551 +EDGE3 76 77 -0.18962 3.51291 0.00250796 0.0620965 -0.0202881 0.164875 +EDGE3 77 78 -0.202746 3.61235 -0.155095 -0.0136941 -0.0180363 0.0797913 +EDGE3 78 79 -0.182209 3.80077 -0.152645 0.0285578 0.00892133 0.15202 +EDGE3 79 80 -0.2676 3.51719 0.037503 -0.0302086 0.0195235 0.0998354 +EDGE3 80 81 -0.0943781 3.5582 0.0260418 -0.0141752 -0.00114926 0.149545 +EDGE3 81 82 -0.153905 3.6196 -0.0831981 -0.024463 -0.018801 0.106203 +EDGE3 82 83 -0.0511099 3.50428 0.0805038 0.00321157 0.0320512 0.133777 +EDGE3 83 84 -0.110098 3.67012 0.0566261 0.0193253 -0.00966843 0.128798 +EDGE3 84 85 0.150045 3.65128 -0.165603 0.0193725 -0.0249613 0.130933 +EDGE3 85 86 -0.0750947 3.65015 -0.0738416 0.0087435 -0.0229523 0.142259 +EDGE3 86 87 -0.152509 3.66838 -0.125702 0.0170946 -0.018765 0.0955062 +EDGE3 87 88 -0.210828 3.60356 0.0387055 0.0185886 -0.0144925 0.122519 +EDGE3 88 89 -0.237042 3.73872 0.0621342 0.0281414 0.0132942 0.174402 +EDGE3 89 90 -0.0659852 3.62327 -0.163814 0.0457237 0.025888 0.128578 +EDGE3 90 91 -0.0755625 3.88051 -0.141069 0.040632 -0.022785 0.129242 +EDGE3 91 92 -0.125054 3.93774 0.152497 -0.0179436 -0.0259232 0.135525 +EDGE3 92 93 -0.171306 3.98819 -0.0564251 -0.0144252 -0.00732604 0.101429 +EDGE3 93 94 -0.0531429 3.79977 -0.0968367 0.0241054 -0.0287072 0.164231 +EDGE3 94 95 -0.213337 3.91223 -0.0196613 -0.0271055 0.00191728 0.129472 +EDGE3 95 96 -0.164284 3.86593 -0.0470053 -0.000387943 0.00940256 0.145048 +EDGE3 96 97 -0.0911524 3.82732 -0.0705018 0.00217022 -0.0153075 0.102982 +EDGE3 97 98 -0.0762562 3.77685 -0.0689707 0.00757101 -0.0174396 0.180875 +EDGE3 98 99 -0.126096 3.90627 0.218151 -0.0215133 -0.0223877 0.104291 +EDGE3 99 100 -0.19657 3.85101 -0.148813 -0.0322272 0.0245035 0.11489 +EDGE3 100 101 -0.20423 3.78051 -0.06825 0.0350258 0.0165113 0.149537 +EDGE3 101 102 -0.344937 3.76706 -0.0943634 0.0166364 -0.0131174 0.0705575 +EDGE3 102 103 -0.14548 3.99729 -0.088884 0.00699129 -0.0199978 0.150397 +EDGE3 103 104 -0.149122 4.08855 0.0296653 0.00249468 0.00680085 0.127341 +EDGE3 104 105 -0.312816 3.94794 -0.0316304 0.0115394 0.0282431 0.0840934 +EDGE3 105 106 -0.289434 3.96915 0.0778426 0.0324076 0.0371659 0.102094 +EDGE3 106 107 -0.308684 4.09533 -0.0487997 0.00639588 -0.0484115 0.123161 +EDGE3 107 108 -0.0852886 4.06372 -0.0590066 -0.0143034 0.00214382 0.144228 +EDGE3 108 109 -0.056877 4.00889 -0.00679841 0.0198124 -0.0292408 0.130576 +EDGE3 109 110 -0.181533 4.10299 0.0131423 -0.0297673 -0.00261885 0.167454 +EDGE3 110 111 -0.400916 3.80665 -0.0874299 0.023104 -0.00360747 0.17231 +EDGE3 111 112 -0.1297 3.94953 -0.127398 0.0368532 0.00590058 0.11817 +EDGE3 112 113 0.0459538 3.92951 -0.166167 -0.0326106 -0.00250775 0.120093 +EDGE3 113 114 -0.243649 4.08725 0.00557096 -0.00728232 -0.0128223 0.147401 +EDGE3 114 115 -0.32401 4.20696 -0.107443 -0.0416876 0.0161834 0.11112 +EDGE3 115 116 0.015186 4.16084 -0.0269265 -0.0105456 -0.00453071 0.0944201 +EDGE3 116 117 -0.134025 4.18648 -0.130159 0.0234535 0.0222454 0.110573 +EDGE3 117 118 -0.135213 4.2278 -0.152068 0.0222367 -0.0270057 0.077513 +EDGE3 118 119 -0.19008 4.09412 -0.0884868 0.00721055 -0.0416622 0.143695 +EDGE3 119 120 0.0358051 4.06397 -0.185127 -0.0340904 -0.00425677 0.103772 +EDGE3 120 121 -0.151363 4.2604 -0.101765 -0.0214325 -0.0170534 0.094002 +EDGE3 121 122 -0.299053 4.46516 0.120951 -0.0227337 0.0344527 0.129506 +EDGE3 122 123 -0.0984725 4.2376 0.0435968 -0.0138749 0.011999 0.0695923 +EDGE3 123 124 -0.102902 4.40859 0.0281922 -0.0142061 -0.0113519 0.0842801 +EDGE3 124 125 -0.134992 4.144 -0.0690061 0.0309679 -0.0199303 0.116839 +EDGE3 125 126 -0.182781 4.25239 0.0834474 -0.0173434 -0.0209024 0.158314 +EDGE3 126 127 -0.0689352 4.19323 -0.0569205 0.0558599 0.000818794 0.135913 +EDGE3 127 128 -0.126881 4.2556 -0.127496 0.00975383 -0.0067199 0.0912189 +EDGE3 128 129 -0.200728 4.29767 -0.0911094 0.0187601 0.0213499 0.139639 +EDGE3 129 130 -0.138033 4.33834 0.100025 -0.00948774 0.0326693 0.110684 +EDGE3 130 131 -0.066077 4.27212 0.0656955 0.00546449 -0.0157767 0.140902 +EDGE3 131 132 -0.272859 4.33127 -0.0550355 0.0246522 -0.0284517 0.140479 +EDGE3 132 133 -0.21487 4.48746 -0.150587 0.0218374 -0.0474505 0.131947 +EDGE3 133 134 -0.134073 4.39316 0.0771663 -0.0392448 0.00470948 0.124585 +EDGE3 134 135 -0.0224035 4.44216 -0.0946582 -0.010292 -0.0344783 0.133732 +EDGE3 135 136 -0.191931 4.52107 0.0350766 0.016454 0.00787966 0.171414 +EDGE3 136 137 -0.137611 4.39735 -0.0477466 0.0176583 -0.000941463 0.155746 +EDGE3 137 138 -0.101065 4.23609 0.0901895 0.0410279 0.0197357 0.120103 +EDGE3 138 139 -0.159007 4.4015 -0.0498357 7.32788e-05 -0.0378347 0.139843 +EDGE3 139 140 -0.275202 4.48776 0.034439 -0.0169564 0.0204812 0.130544 +EDGE3 140 141 -0.159022 4.42229 0.0616493 -0.00454529 -0.000856909 0.107349 +EDGE3 141 142 -0.272201 4.51234 -0.0947978 0.0117618 0.0368787 0.0839234 +EDGE3 143 144 -0.255482 4.51575 -0.0739281 -0.028103 -0.00495913 0.155526 +EDGE3 142 143 -0.097304 4.58142 -0.0736633 -0.0320536 0.0104575 0.100456 +EDGE3 144 145 -0.385323 4.59499 -0.121908 0.0247199 0.025731 0.101292 +EDGE3 145 146 -0.206457 4.50356 -0.0602837 0.0197184 -0.00273717 0.0823597 +EDGE3 146 147 -0.18928 4.61647 -0.0325388 -0.0151648 -0.00386753 0.139787 +EDGE3 147 148 -0.386073 4.54645 0.0632019 -0.0131948 0.00377531 0.106561 +EDGE3 148 149 -0.147303 4.57143 0.0419046 0.0252386 0.0387545 0.142836 +EDGE3 149 150 -0.118035 4.68216 -0.0521234 -0.0116969 -0.00274196 0.130723 +EDGE3 150 151 -0.339267 4.45238 -0.0541226 -0.00163232 -0.0237458 0.0845283 +EDGE3 151 152 -0.243219 4.51817 -0.0146676 0.0136779 -0.0258474 0.116357 +EDGE3 152 153 -0.0781915 4.85099 -0.0140594 0.0196969 -0.0166335 0.114992 +EDGE3 153 154 -0.240721 4.59969 -0.217156 -0.00862397 0.0213331 0.141065 +EDGE3 154 155 -0.142871 4.83704 -0.0642088 0.00577313 -0.0395843 0.114089 +EDGE3 156 157 -0.29275 4.76278 0.120575 0.0385443 0.0183706 0.0863786 +EDGE3 155 156 -0.15659 4.68608 0.105994 -0.0240786 0.00518535 0.139893 +EDGE3 158 159 -0.299824 4.71138 -0.193589 0.0288563 0.0060698 0.106073 +EDGE3 157 158 -0.028912 4.75216 0.0677388 0.0122943 0.0369683 0.121612 +EDGE3 160 161 -0.243643 4.65001 -0.120949 0.0317491 0.010423 0.0666234 +EDGE3 159 160 -0.262292 4.76241 0.0410303 0.0189934 0.0297567 0.13968 +EDGE3 162 163 -0.198378 4.66298 -0.00438035 0.013954 -0.0543858 0.108956 +EDGE3 161 162 -0.252329 4.70628 0.00806183 -0.0111775 -0.00767887 0.122225 +EDGE3 164 165 -0.240054 4.9405 -0.0138128 0.0405259 -0.0335959 0.100304 +EDGE3 163 164 -0.0267818 4.79204 0.0403253 -0.0110744 0.0045597 0.131009 +EDGE3 166 167 -0.168398 4.9929 -0.118626 -0.0190328 -0.0239155 0.110258 +EDGE3 165 166 -0.197095 4.81149 -0.0330859 0.0150544 0.0259011 0.137913 +EDGE3 168 169 -0.18715 4.90632 -0.0718764 0.0422783 -0.0156785 0.137961 +EDGE3 167 168 -0.270621 4.89055 -0.0383258 -0.00988663 0.03459 0.116952 +EDGE3 170 171 -0.292729 4.99474 -0.209804 0.0137478 -0.00416969 0.105009 +EDGE3 169 170 -0.152504 4.868 0.114387 -0.00621294 0.0219811 0.13889 +EDGE3 172 173 -0.265749 5.01558 0.1494 -0.00237613 -0.0146942 0.139835 +EDGE3 171 172 -0.220358 4.93485 0.0323752 -0.032323 -0.0300738 0.115408 +EDGE3 174 175 -0.282261 4.86028 -0.132406 -0.0152879 -0.0115124 0.130259 +EDGE3 173 174 -0.186445 4.87784 -0.274047 0.0275943 -0.00343321 0.105444 +EDGE3 176 177 -0.0438111 4.98778 -0.0464294 -0.0118425 -0.00815569 0.0927031 +EDGE3 175 176 -0.115254 5.13221 -0.0981557 -0.016045 -0.00869769 0.124088 +EDGE3 177 178 -0.260288 5.18088 0.13145 -0.00196104 0.0344686 0.146702 +EDGE3 178 179 -0.128284 5.05343 -0.0894707 -0.00256193 0.015808 0.142937 +EDGE3 179 180 -0.20451 5.03758 -0.144187 0.0114089 0.0176209 0.120633 +EDGE3 180 181 -0.10932 5.15666 -0.203533 -0.00418625 -0.0345385 0.127748 +EDGE3 181 182 -0.137429 4.95756 0.111282 0.0666966 0.014501 0.138999 +EDGE3 182 183 -0.128894 5.11948 -0.0746981 -0.0196952 0.0335056 0.117457 +EDGE3 183 184 -0.0426974 5.26807 0.00722057 -0.00268944 0.00228903 0.121203 +EDGE3 184 185 -0.176608 5.15589 0.105139 -0.0196593 0.0219684 0.171487 +EDGE3 185 186 -0.0724968 5.33276 0.0953149 -0.0344686 -0.000414231 0.15386 +EDGE3 186 187 -0.170391 5.1262 -0.0197287 0.0179753 0.0126892 0.161331 +EDGE3 187 188 -0.206124 5.08518 -0.0756103 0.0285042 -0.0245537 0.146681 +EDGE3 188 189 -0.159074 5.20131 -0.0249554 -0.00877015 0.0349892 0.108252 +EDGE3 189 190 -0.19152 5.16404 -0.145727 -0.0453383 -0.0106902 0.155328 +EDGE3 190 191 -0.304567 5.14359 -0.0854163 0.019153 -0.00908424 0.101875 +EDGE3 191 192 -0.069315 5.24923 -0.127874 0.0147642 -0.00140473 0.140956 +EDGE3 192 193 -0.181774 5.18485 0.0353037 -0.0160255 0.0300726 0.154863 +EDGE3 193 194 -0.349823 5.28889 0.0862399 0.0276565 0.0423226 0.11623 +EDGE3 194 195 -0.266975 5.32905 0.120325 -0.0228959 0.00404313 0.148293 +EDGE3 195 196 -0.176757 5.21125 -0.118905 0.0514739 -0.0203354 0.101833 +EDGE3 196 197 -0.192456 5.32629 -0.162274 0.00583045 0.025454 0.142682 +EDGE3 197 198 -0.0375575 5.39605 -0.0660908 -0.00396299 -0.00171043 0.107452 +EDGE3 198 199 -0.261083 5.28004 0.0197804 -0.0222015 -0.0141646 0.132872 +EDGE3 199 200 -0.154357 5.307 -0.0599985 0.0510435 -0.0210083 0.165102 +EDGE3 200 201 -0.18301 5.23617 0.179408 0.0147445 -0.0337847 0.145137 +EDGE3 201 202 -0.207534 5.45395 -0.0141131 -0.0100034 -0.0200326 0.0842041 +EDGE3 202 203 -0.0901731 5.32156 0.12452 0.0201203 0.00534604 0.158978 +EDGE3 203 204 -0.167935 5.44067 0.00570177 0.0178792 -0.0179276 0.10599 +EDGE3 204 205 -0.277681 5.38684 -0.0725682 0.0179784 0.0150085 0.122321 +EDGE3 205 206 -0.21396 5.42145 -0.0976752 -0.0125054 -0.0209873 0.133115 +EDGE3 206 207 -0.198938 5.2524 -0.0749508 0.00237304 -0.0240009 0.109479 +EDGE3 207 208 -0.225355 5.53694 -0.021574 -0.0145894 -0.00231135 0.16542 +EDGE3 208 209 -0.271788 5.55949 -0.00998529 0.00653119 -0.0124467 0.141473 +EDGE3 209 210 -0.123474 5.49317 -0.0142897 -0.0273656 0.0139248 0.125765 +EDGE3 210 211 -0.31667 5.60524 -0.230642 -0.00351458 0.0335388 0.135207 +EDGE3 211 212 -0.429308 5.55196 0.176962 0.0717385 -0.00108499 0.13023 +EDGE3 212 213 -0.294454 5.54343 -0.0738791 0.00805116 -0.0520405 0.0961659 +EDGE3 213 214 -0.127386 5.46526 0.0173131 -0.0364378 0.0378839 0.131557 +EDGE3 214 215 -0.0953996 5.68339 -0.0235317 -1.1317e-05 0.0263273 0.103308 +EDGE3 215 216 -0.153878 5.67983 -0.0843109 0.0306884 0.00214383 0.120359 +EDGE3 216 217 -0.0316685 5.50859 -0.150817 -0.0260768 -0.0352015 0.133498 +EDGE3 217 218 -0.360676 5.6911 0.0319997 -0.0049324 0.0127573 0.135087 +EDGE3 218 219 -0.276267 5.49165 -0.0382517 -0.00574681 -0.000528913 0.14361 +EDGE3 219 220 -0.201916 5.53677 -0.0608488 0.0118859 0.00586753 0.1262 +EDGE3 220 221 -0.17791 5.68525 0.00654041 0.0110899 0.00331986 0.109356 +EDGE3 221 222 -0.0718961 5.69822 -0.0407743 -0.0016869 -0.0321656 0.169673 +EDGE3 222 223 -0.250475 5.59282 -0.0705694 0.021158 0.0297186 0.135155 +EDGE3 223 224 -0.185195 5.66279 0.057013 -0.00277035 -0.014198 0.114482 +EDGE3 224 225 -0.0449758 5.8838 -0.0245691 0.0234626 0.0079427 0.119976 +EDGE3 225 226 -0.241206 5.83895 0.0180653 0.0161452 -0.0183924 0.0953997 +EDGE3 226 227 -0.207589 5.5903 -0.0287962 -0.0516147 -0.0183791 0.108106 +EDGE3 227 228 -0.265743 5.95296 -0.0885802 0.0100804 0.0331044 0.118104 +EDGE3 228 229 -0.205391 5.72913 -0.250733 -0.00508861 0.018364 0.132151 +EDGE3 229 230 -0.41706 5.63978 -0.174954 0.0431777 0.00261166 0.119334 +EDGE3 230 231 -0.11708 5.86131 0.0807168 0.0227041 -0.0151595 0.137597 +EDGE3 231 232 -0.253704 6.00866 0.167756 -0.00584601 -0.0170768 0.120421 +EDGE3 232 233 -0.09401 5.84826 -0.15422 0.0135274 -0.0114439 0.109624 +EDGE3 233 234 -0.278448 5.65642 -0.0121759 0.0319552 -0.000653121 0.0965139 +EDGE3 234 235 -0.139914 5.88256 -0.157413 -0.0082663 -0.0155741 0.132386 +EDGE3 235 236 -0.12009 5.74838 -0.22755 0.0537052 0.0172294 0.104256 +EDGE3 236 237 -0.260112 5.82256 -0.00885689 0.063814 0.0266587 0.13616 +EDGE3 237 238 -0.29173 5.89892 -0.158266 0.0380039 0.00659016 0.150315 +EDGE3 238 239 -0.285701 5.8673 0.0554619 0.0131379 -0.00426412 0.128867 +EDGE3 239 240 -0.265612 5.87949 -0.0251238 0.0206753 0.0317912 0.128765 +EDGE3 240 241 -0.123536 5.83636 -0.0627261 -0.044028 -0.00918571 0.10167 +EDGE3 241 242 -0.203755 6.03092 -0.0767133 -0.00740014 0.0373389 0.131151 +EDGE3 242 243 -0.221696 5.90483 -0.150491 0.0112752 -0.0156589 0.151316 +EDGE3 243 244 -0.313655 5.78523 0.0234292 0.0152533 -0.0327036 0.131037 +EDGE3 244 245 -0.196634 6.11515 0.0338495 0.0149984 0.00680414 0.129316 +EDGE3 245 246 -0.260782 5.856 0.0582826 -0.04272 -0.00991024 0.154523 +EDGE3 246 247 -0.229033 5.90092 -0.117842 0.0105775 0.000103767 0.114672 +EDGE3 247 248 -0.165909 6.02486 -0.268601 0.015611 -0.0416227 0.119997 +EDGE3 248 249 -0.476145 5.99729 -0.0593761 -0.00577091 0.0667937 0.103867 +EDGE3 249 250 -0.147093 6.27639 -0.163905 -0.0309321 0.0117725 0.0844452 +EDGE3 250 251 -0.306841 5.98168 0.0782619 0.0267528 0.0060458 0.114936 +EDGE3 251 252 -0.188074 6.1932 0.0220776 0.00224128 0.00855477 0.118151 +EDGE3 252 253 -0.290927 6.11527 -0.0316084 -0.0342139 0.00106036 0.120249 +EDGE3 253 254 -0.306348 6.16344 -0.00449441 0.0128476 0.0310485 0.141298 +EDGE3 254 255 -0.289866 6.23757 0.0179525 0.0309225 0.00777286 0.101842 +EDGE3 255 256 -0.311617 6.05838 0.0144193 0.00125611 -0.00190156 0.0952534 +EDGE3 256 257 -0.299391 6.27975 -0.0137484 0.00297409 -0.0148299 0.110673 +EDGE3 257 258 -0.407112 6.09062 0.203572 -0.0182518 -0.0162262 0.121533 +EDGE3 258 259 -0.342489 6.16495 -0.0776685 -0.00312932 0.0131473 0.128296 +EDGE3 259 260 -0.518559 6.29251 -0.186837 0.00951991 0.0115848 0.132184 +EDGE3 260 261 -0.374513 6.0136 -0.0769947 0.0248762 0.0234757 0.13874 +EDGE3 261 262 -0.263125 6.09461 -0.0216502 -0.0696866 0.0136161 0.12007 +EDGE3 262 263 -0.461176 6.14063 -0.0145906 -0.00311276 -0.0105357 0.135609 +EDGE3 263 264 -0.198863 6.20898 -0.0892126 0.0298264 -0.0070054 0.153833 +EDGE3 264 265 -0.137828 6.26879 0.0251088 -0.0184647 0.0172799 0.180391 +EDGE3 265 266 -0.355581 6.18666 -0.129394 0.00167192 -0.043291 0.13191 +EDGE3 266 267 -0.210085 6.33182 -0.165093 0.00385954 0.0026185 0.149206 +EDGE3 267 268 -0.234599 6.11217 0.049536 -0.037364 -0.0122323 0.0920534 +EDGE3 268 269 -0.174787 6.35142 -0.176676 -0.0368132 0.0221748 0.132238 +EDGE3 269 270 -0.220475 6.47983 0.0799236 0.0192662 0.0377441 0.178708 +EDGE3 270 271 -0.305033 6.23089 -0.0660993 -0.0174429 -0.00285046 0.132673 +EDGE3 271 272 -0.226065 6.21834 0.149414 0.0404853 -0.0484581 0.0997897 +EDGE3 272 273 -0.116505 6.39546 -0.0859603 0.0216735 -0.0281443 0.155884 +EDGE3 273 274 -0.382225 6.37769 -0.0585425 0.0174617 0.0448119 0.132065 +EDGE3 274 275 -0.265045 6.43778 0.0528551 -0.0140606 5.03913e-05 0.122823 +EDGE3 275 276 -0.50521 6.25973 -0.139667 0.0412911 -0.00495785 0.105221 +EDGE3 276 277 -0.139287 6.36876 -0.0492238 0.046997 0.00194629 0.109231 +EDGE3 277 278 -0.291209 6.47977 -0.0922055 -0.00959331 -0.00868988 0.147266 +EDGE3 278 279 -0.271462 6.34679 -0.12973 0.0192379 0.0476055 0.151216 +EDGE3 279 280 -0.179483 6.43573 -0.163837 -0.0355744 0.0194119 0.0944955 +EDGE3 280 281 -0.315922 6.42081 -0.189789 -0.00478106 -0.0062045 0.126777 +EDGE3 281 282 -0.244814 6.39786 0.0244255 -0.0120658 0.0124054 0.0916939 +EDGE3 282 283 -0.188631 6.47975 -0.0429045 0.0110663 0.0284756 0.103994 +EDGE3 283 284 -0.3802 6.42411 -0.0240862 -0.0308488 -0.000716775 0.170119 +EDGE3 284 285 -0.315105 6.66071 -0.00671108 0.000619618 -0.0328924 0.17872 +EDGE3 285 286 -0.297076 6.2699 -0.0473597 -0.0352913 0.0168416 0.156064 +EDGE3 286 287 -0.364394 6.73693 -0.0649376 0.00423585 -0.0370471 0.0947235 +EDGE3 287 288 -0.301245 6.34139 -0.0543941 0.00644608 -0.0307823 0.143658 +EDGE3 288 289 -0.415957 6.40738 -0.0237532 -0.00711722 -0.0175969 0.13412 +EDGE3 289 290 -0.203709 6.62071 -0.0431002 0.00750846 0.00380843 0.201315 +EDGE3 290 291 -0.378004 6.48828 0.0126148 -0.0369936 -0.0169296 0.117075 +EDGE3 291 292 -0.373317 6.51582 -0.179085 0.00627607 0.04723 0.147726 +EDGE3 292 293 -0.49836 6.5099 -0.240885 0.0498283 0.0376378 0.125834 +EDGE3 293 294 -0.328326 6.60907 -0.27776 0.0246523 0.00762804 0.17008 +EDGE3 294 295 -0.288191 6.65589 -0.0697811 0.0272862 -0.0188782 0.0865777 +EDGE3 295 296 -0.208722 6.74618 -0.121642 0.0328034 0.00732636 0.117764 +EDGE3 296 297 -0.403886 6.56466 0.000471949 -0.0399555 -0.00836041 0.124855 +EDGE3 297 298 -0.291196 6.60875 -0.298389 -0.0145947 0.0281814 0.134794 +EDGE3 298 299 -0.447174 6.77839 -0.102871 0.0108042 0.005024 0.120044 +EDGE3 299 300 -0.441918 6.73804 -0.147716 0.0372278 -0.0104087 0.113026 +EDGE3 300 301 -0.345221 6.76053 -0.0790742 -0.00454523 -0.0454633 0.0875795 +EDGE3 301 302 -0.306963 6.79506 -0.021975 0.014399 -0.0252016 0.0672863 +EDGE3 302 303 -0.249519 7.02314 0.0885546 0.0174238 -0.0106512 0.160564 +EDGE3 303 304 -0.202091 6.74385 -0.0452568 -0.00612253 -0.00350822 0.128085 +EDGE3 304 305 -0.418033 6.56986 -0.099662 -0.00123412 0.00347393 0.129761 +EDGE3 305 306 -0.33336 6.86862 -0.181845 -0.0337862 0.0291422 0.0819294 +EDGE3 306 307 -0.341731 6.5602 -0.179031 0.0214415 0.00744373 0.126203 +EDGE3 307 308 -0.267374 6.7623 -0.0697621 0.00110004 0.0060061 0.132197 +EDGE3 308 309 -0.329307 6.86644 -0.0263814 0.0211008 -0.00737005 0.122007 +EDGE3 309 310 -0.31168 6.64336 -0.161507 0.0435947 0.032828 0.137195 +EDGE3 310 311 -0.397507 6.78392 -0.0968239 0.0244611 -0.00786954 0.121092 +EDGE3 311 312 -0.440273 6.93345 -0.139358 -0.0168342 -0.0208526 0.0822262 +EDGE3 312 313 -0.259345 6.86603 -0.00709458 -0.00700497 -0.0218923 0.10882 +EDGE3 313 314 -0.41427 6.81077 -0.23316 0.0197853 0.00975285 0.115905 +EDGE3 314 315 -0.365038 6.97567 0.00637845 -0.00408156 -0.00424793 0.10811 +EDGE3 315 316 -0.348294 7.07014 -0.0319342 0.0261802 -0.0129522 0.118167 +EDGE3 316 317 -0.34783 6.82512 -0.0755667 0.0261249 -0.0085242 0.120377 +EDGE3 317 318 -0.123984 6.77423 -0.12572 -0.00477777 0.00148744 0.127399 +EDGE3 318 319 -0.239918 6.98193 -0.230643 0.0022871 0.0117171 0.118388 +EDGE3 319 320 -0.319352 6.9193 0.144191 0.0112265 0.0076107 0.169197 +EDGE3 320 321 -0.399105 7.04384 0.0462207 -0.0150236 -0.016549 0.110241 +EDGE3 321 322 -0.564005 6.95406 -0.164822 -0.000716126 -0.0119039 0.0906097 +EDGE3 322 323 -0.447963 6.92362 -0.143051 -0.0241763 -0.00848537 0.109522 +EDGE3 323 324 -0.402428 6.95093 -0.146908 0.0166168 -0.0325103 0.146588 +EDGE3 324 325 -0.3593 6.96169 0.000771052 0.0698217 -0.0259074 0.0903649 +EDGE3 325 326 -0.314644 7.03789 -0.240565 0.0103167 -0.017128 0.0946256 +EDGE3 326 327 -0.327328 7.12381 -0.0679445 0.0159936 0.0183989 0.105554 +EDGE3 327 328 -0.241996 7.22495 0.127068 -0.0389857 0.00464302 0.130719 +EDGE3 328 329 -0.38789 6.98455 -0.2031 -0.0416603 -0.00368547 0.12432 +EDGE3 329 330 -0.359264 7.00691 -0.0816846 -0.0291695 -0.00742125 0.140793 +EDGE3 330 331 -0.381711 7.16197 0.0512942 -0.0111174 -0.0157115 0.147214 +EDGE3 331 332 -0.314497 7.20595 0.150845 0.0184514 0.00353971 0.089392 +EDGE3 332 333 -0.195221 7.10457 0.226581 0.0240019 -0.012737 0.122627 +EDGE3 333 334 -0.483872 6.98259 0.0846365 -0.0394022 -0.00613389 0.132791 +EDGE3 334 335 -0.174763 7.15678 0.0963808 0.00397314 0.0164767 0.0855997 +EDGE3 335 336 -0.513065 7.33157 0.0811313 0.0518754 -0.0166084 0.159407 +EDGE3 336 337 -0.460535 7.27088 -0.0746995 0.0661065 -0.0201173 0.160249 +EDGE3 337 338 -0.495268 7.12169 0.0239769 -0.00737198 0.00873455 0.115576 +EDGE3 338 339 -0.298193 7.09735 0.013873 0.0398327 0.0341804 0.17588 +EDGE3 339 340 -0.471672 7.28981 -0.168874 -0.00844272 0.0240478 0.105719 +EDGE3 340 341 -0.290982 7.10652 -0.154532 -0.031517 -0.0122867 0.131795 +EDGE3 341 342 -0.289588 7.38346 -0.0415564 -0.0181227 -0.00989775 0.156366 +EDGE3 342 343 -0.512159 7.40841 -0.0995836 -0.00195341 0.0105576 0.127667 +EDGE3 343 344 -0.327359 7.33888 0.00376917 0.0207776 0.0103706 0.155138 +EDGE3 344 345 -0.326594 7.24704 -0.0779745 -0.00107341 0.00144351 0.102142 +EDGE3 345 346 -0.324916 7.12867 0.0066772 0.00609143 0.0188474 0.105241 +EDGE3 346 347 -0.466736 7.24746 -0.105563 -0.0341224 0.0193462 0.115436 +EDGE3 347 348 -0.166151 7.21114 -0.0139893 -0.0182654 -0.0455993 0.0930972 +EDGE3 348 349 -0.343193 7.38308 -0.177468 0.0117456 0.0239018 0.17742 +EDGE3 349 350 -0.435881 7.35502 -0.00383498 0.0417073 -0.0527999 0.130515 +EDGE3 350 351 -0.424147 7.24712 0.0106165 0.0122323 0.0348256 0.148363 +EDGE3 351 352 -0.321421 7.42099 -0.236993 0.0189539 -0.0233557 0.138536 +EDGE3 352 353 -0.331285 7.29861 -0.128183 0.0227967 0.0538116 0.100242 +EDGE3 353 354 -0.294051 7.57864 -0.0508621 -0.00420202 -0.0489545 0.157267 +EDGE3 354 355 -0.318636 7.51158 0.00931779 0.00224477 -0.00921433 0.124864 +EDGE3 355 356 -0.38982 7.47294 -0.183408 -0.0175109 -0.0434762 0.124775 +EDGE3 356 357 -0.450535 7.47795 -0.127175 -0.0230318 -0.0180209 0.0513385 +EDGE3 357 358 -0.367346 7.42128 -0.19407 -0.0257274 -0.000995052 0.0915583 +EDGE3 358 359 -0.35183 7.53079 -0.0384286 0.0174051 -0.0138286 0.133187 +EDGE3 359 360 -0.362337 7.45021 0.095778 0.00490927 -0.0224211 0.14475 +EDGE3 360 361 -0.289407 7.34714 -0.212998 -0.0213031 -0.00416772 0.113496 +EDGE3 361 362 -0.398513 7.42867 -0.135834 0.0194426 -0.0127327 0.107113 +EDGE3 362 363 -0.467374 7.40511 0.117043 -0.0168589 0.031372 0.130347 +EDGE3 363 364 -0.430438 7.55523 -0.0896207 0.0527486 0.0107349 0.124064 +EDGE3 364 365 -0.44464 7.51521 -0.111201 -0.00259341 -0.0418141 0.132399 +EDGE3 365 366 -0.334993 7.63084 -0.130237 0.0133781 -0.0503707 0.19146 +EDGE3 366 367 -0.348949 7.62019 -0.0570106 0.0134576 0.011392 0.133942 +EDGE3 367 368 -0.369212 7.63824 -0.112723 0.0303205 0.00711482 0.0884786 +EDGE3 368 369 -0.60569 7.57312 0.0554561 -0.024587 0.0276736 0.102307 +EDGE3 369 370 -0.276132 7.70662 -0.0604016 -0.0205383 -0.0374382 0.107185 +EDGE3 370 371 -0.41593 7.59031 -0.107835 0.0320172 -0.0121835 0.0903998 +EDGE3 371 372 -0.519649 7.66616 -0.35216 0.00923389 0.00812977 0.132743 +EDGE3 372 373 -0.361941 7.75176 -0.0970457 -0.00414803 0.0232936 0.130094 +EDGE3 373 374 -0.365021 7.71616 -0.21589 -0.00766946 -0.0250347 0.158153 +EDGE3 374 375 -0.213179 7.56203 -0.176771 0.0409642 0.0203622 0.0692837 +EDGE3 375 376 -0.484104 7.74679 0.0654065 -0.0285554 0.00175926 0.159178 +EDGE3 376 377 -0.36053 7.78363 -0.0469128 -0.00927446 0.0348228 0.142195 +EDGE3 377 378 -0.60831 7.69588 -0.220311 -0.00346805 0.00128982 0.167409 +EDGE3 378 379 -0.539657 7.72185 -0.203823 -0.0145936 0.000264654 0.119391 +EDGE3 379 380 -0.49621 7.8573 0.0204334 0.0228932 -0.0544016 0.117059 +EDGE3 380 381 -0.340544 7.66679 -0.120353 0.00861942 0.00492649 0.130951 +EDGE3 381 382 -0.502971 7.79176 -0.127304 0.00399649 -0.00219746 0.0783963 +EDGE3 382 383 -0.461663 7.96204 0.0484136 0.0506863 -0.0115576 0.156771 +EDGE3 383 384 -0.352589 7.88395 -0.152792 0.00913233 -0.0172087 0.12202 +EDGE3 384 385 -0.338078 7.78747 0.0664706 0.000399229 -0.0264734 0.111816 +EDGE3 385 386 -0.438664 7.64666 -0.121845 0.0330983 -0.00643196 0.153259 +EDGE3 386 387 -0.456326 7.92971 -0.12803 -0.0330157 -0.00594895 0.174375 +EDGE3 387 388 -0.465092 7.90317 0.0333784 0.00447255 0.0447764 0.124025 +EDGE3 388 389 -0.461796 7.66644 -0.0240828 -0.011301 0.0223567 0.123412 +EDGE3 389 390 -0.433644 8.02876 -0.140436 -0.00800061 -0.00163427 0.119047 +EDGE3 390 391 -0.484512 7.88387 -0.0133902 0.00368255 -0.00601561 0.153059 +EDGE3 391 392 -0.450612 7.78232 0.0647279 -0.0187011 0.00368104 0.118386 +EDGE3 392 393 -0.416113 7.88317 -0.0806501 0.0148424 0.0112132 0.153255 +EDGE3 393 394 -0.213231 7.99549 0.00277645 -0.0311085 -0.0166296 0.0758448 +EDGE3 394 395 -0.361689 7.94116 -0.0429917 -0.0592402 -0.0238552 0.138727 +EDGE3 395 396 -0.307581 7.91512 -0.115812 0.0142473 -0.0062351 0.0952673 +EDGE3 396 397 -0.301425 7.82616 -0.00267573 0.029296 -0.00791017 0.122068 +EDGE3 397 398 -0.221977 8.20695 -0.0094634 -0.028754 -0.0172231 0.131358 +EDGE3 398 399 -0.427193 8.02193 0.0760342 0.0357997 0.0134089 0.0922434 +EDGE3 399 400 -0.599883 7.98856 -0.0814807 0.0247783 -0.0006705 0.116111 +EDGE3 400 401 -0.430841 8.11269 -0.0805113 -0.039502 0.0218786 0.116833 +EDGE3 401 402 -0.510491 7.89051 0.0936199 0.00695343 -0.0159469 0.0763351 +EDGE3 403 404 -0.38243 7.95766 -0.116497 -0.00268248 -0.0373247 0.119375 +EDGE3 402 403 -0.282788 8.17468 -0.122917 0.0278857 0.023823 0.139946 +EDGE3 404 405 -0.37098 8.04012 0.146353 0.0366774 0.000151369 0.158814 +EDGE3 405 406 -0.222215 7.90193 -0.0463443 0.0161802 -0.0451143 0.137556 +EDGE3 406 407 -0.255756 8.10085 -0.265487 0.0349962 -0.0212111 0.0955479 +EDGE3 407 408 -0.360968 7.84594 -0.101769 0.0120226 0.0241738 0.0836279 +EDGE3 408 409 -0.433919 8.00366 -0.265797 -0.00511802 0.00396629 0.102454 +EDGE3 409 410 -0.23413 7.97685 -0.246367 0.0527548 -0.0126535 0.129381 +EDGE3 410 411 -0.522892 8.17708 0.0757195 0.0361676 -0.0103683 0.122667 +EDGE3 411 412 -0.215494 8.07998 -0.0560468 -0.00219501 -0.0023633 0.156104 +EDGE3 412 413 -0.431862 8.2939 -0.0209909 -0.0206642 0.0353441 0.096709 +EDGE3 413 414 -0.289082 8.1301 -0.0437401 -0.0257984 -0.0502111 0.124169 +EDGE3 415 416 -0.437384 8.16679 -0.195404 -0.000248661 0.0284357 0.153092 +EDGE3 414 415 -0.281812 8.18002 -0.0346473 0.00280905 -0.0186126 0.131823 +EDGE3 417 418 -0.342633 7.90252 -0.00755947 0.00935774 -0.0153745 0.142144 +EDGE3 416 417 -0.382121 8.03039 -0.083664 -0.00525419 -0.0109717 0.153566 +EDGE3 419 420 -0.550505 8.33022 -0.0220178 0.0160033 -0.00731072 0.153742 +EDGE3 418 419 -0.317548 8.21024 0.0563052 0.0600606 0.0283211 0.174815 +EDGE3 421 422 -0.267462 8.14808 0.0747701 -0.0148343 0.000836764 0.111869 +EDGE3 420 421 -0.352911 8.31221 0.13358 -0.0389225 -0.00172561 0.110593 +EDGE3 423 424 -0.23902 8.33397 -0.214084 0.0126035 -0.0579096 0.148372 +EDGE3 422 423 -0.254086 8.25901 -0.0275482 -0.013612 -0.0223807 0.122398 +EDGE3 424 425 -0.349637 8.29754 0.104886 0.0268208 -0.00338755 0.117437 +EDGE3 425 426 -0.466595 8.17724 0.0328284 -0.0148383 -0.00552209 0.120946 +EDGE3 427 428 -0.327944 8.20628 0.0434102 -0.0104504 -0.0305986 0.0560338 +EDGE3 429 430 -0.24729 8.3572 -0.0637449 0.000234418 0.00291992 0.124359 +EDGE3 426 427 -0.322477 8.31157 -0.145061 0.0395717 0.020559 0.141934 +EDGE3 428 429 -0.372263 8.39966 -0.0688922 0.0437728 -0.00380981 0.148578 +EDGE3 431 432 -0.384125 8.40676 -0.0765537 -0.0198326 0.0368127 0.132825 +EDGE3 436 437 -0.268718 8.44329 -0.120604 0.0203313 0.00369001 0.0958537 +EDGE3 430 431 -0.262744 8.4217 -0.201423 0.0130343 0.0267576 0.128738 +EDGE3 433 434 -0.336028 8.43961 -0.12835 -0.0016515 0.0313221 0.116388 +EDGE3 432 433 -0.417435 8.5386 -0.124034 -0.008168 0.0220811 0.102224 +EDGE3 435 436 -0.473287 8.40719 -0.111323 -0.0145611 0.022009 0.0983852 +EDGE3 434 435 -0.458533 8.40616 -0.109733 0.0465909 0.0356733 0.0982615 +EDGE3 437 438 -0.467589 8.42459 -0.0846966 0.0058799 0.0278826 0.127137 +EDGE3 439 440 -0.355049 8.37392 -0.191231 -0.0017256 -0.0224864 0.10608 +EDGE3 438 439 -0.183057 8.47045 0.0165827 0.00440716 0.0399039 0.114469 +EDGE3 441 442 -0.440014 8.32316 0.0751723 0.00798134 0.0316293 0.139444 +EDGE3 440 441 -0.515284 8.316 -0.0134315 0.0423165 -0.000218951 0.118725 +EDGE3 443 444 -0.263655 8.54026 -0.0588436 0.00138821 0.0105152 0.0648383 +EDGE3 442 443 -0.487613 8.51892 -0.0863076 0.00364204 -0.00182546 0.172867 +EDGE3 445 446 -0.437614 8.48113 -0.159538 -0.00904871 -0.011935 0.104976 +EDGE3 444 445 -0.437261 8.56933 -0.128224 0.000991035 0.0182145 0.136707 +EDGE3 447 448 -0.565332 8.61757 -0.0370061 -0.00386988 0.0360681 0.101336 +EDGE3 446 447 -0.572918 8.37567 0.0385506 -0.00667776 -0.0280234 0.142535 +EDGE3 449 450 -0.541756 8.64418 -0.156552 0.0162982 -0.00629936 0.161229 +EDGE3 448 449 -0.452174 8.54732 -0.101602 0.0365854 0.00286452 0.152606 +EDGE3 451 452 -0.347272 8.60958 0.0328558 -0.040003 -0.0234987 0.125116 +EDGE3 450 451 -0.601967 8.73047 -0.0298237 -0.0255084 -0.00189225 0.153175 +EDGE3 453 454 -0.589468 8.77247 0.138391 -0.0162598 -0.0204174 0.0873047 +EDGE3 452 453 -0.568865 8.44027 0.123681 -0.00520777 0.0142177 0.100941 +EDGE3 455 456 -0.535613 8.82371 -0.0763683 0.00217258 -0.0125038 0.113213 +EDGE3 454 455 -0.58811 8.44701 0.0668973 0.0372283 0.0102666 0.154915 +EDGE3 457 458 -0.256188 8.73948 -0.12757 -0.0369256 0.0136276 0.13116 +EDGE3 456 457 -0.522493 8.54065 -0.124454 -0.0379307 0.0142894 0.178268 +EDGE3 459 460 -0.353645 8.54842 -0.0157639 0.0178955 0.00523677 0.155109 +EDGE3 458 459 -0.515442 8.70522 -0.182895 -0.025918 -0.0390726 0.118065 +EDGE3 461 462 -0.354431 8.9698 -0.146955 0.00466264 0.00260255 0.161032 +EDGE3 460 461 -0.596404 8.56173 -0.0108794 0.0282405 0.0547754 0.115589 +EDGE3 463 464 -0.409111 8.82506 -0.0980703 0.0336059 -0.00871474 0.132945 +EDGE3 462 463 -0.398452 8.67786 -0.111927 -0.0353116 -0.0171325 0.154703 +EDGE3 465 466 -0.445378 8.73539 -0.103833 0.0301955 -0.00448571 0.148343 +EDGE3 464 465 -0.489933 8.78312 -0.111033 0.0388942 0.0226806 0.113417 +EDGE3 466 467 -0.43498 8.53986 -0.0806792 -0.0110679 0.026869 0.118985 +EDGE3 467 468 -0.69459 8.69643 -0.061953 0.0101418 -0.0249657 0.114346 +EDGE3 468 469 -0.337617 8.82595 -0.0524814 -0.0059929 -0.0177854 0.0951108 +EDGE3 469 470 -0.454443 8.93918 -0.0503985 -0.0124927 0.037068 0.165459 +EDGE3 470 471 -0.465247 8.92013 -0.163899 0.0240518 0.000860826 0.141848 +EDGE3 471 472 -0.464433 8.61186 -0.160517 0.00111495 -0.020857 0.0912254 +EDGE3 472 473 -0.413722 8.7452 -0.163814 -0.038652 0.000401327 0.146031 +EDGE3 473 474 -0.486992 8.7851 -0.232136 0.00712578 -0.0113172 0.111992 +EDGE3 474 475 -0.574006 8.82327 -0.061089 -0.00969662 -0.0300251 0.0595619 +EDGE3 475 476 -0.366638 8.81534 -0.256391 -0.00895192 -0.0307831 0.138637 +EDGE3 476 477 -0.506603 8.86427 -0.223392 -0.0177369 -0.00737143 0.108261 +EDGE3 477 478 -0.572177 8.87267 -0.0521832 -0.000187405 -0.0559154 0.131358 +EDGE3 478 479 -0.514755 8.84958 -0.333054 -0.028547 -0.0247071 0.109534 +EDGE3 479 480 -0.55578 8.93466 -0.123499 -0.00644457 -0.0397195 0.166562 +EDGE3 480 481 -0.34408 9.07796 -0.307937 0.0250893 0.00928829 0.146185 +EDGE3 481 482 -0.427784 8.70292 -0.158329 -0.00203107 0.0167213 0.120012 +EDGE3 482 483 -0.493023 9.01167 -0.0966264 -0.012913 -0.0377006 0.126077 +EDGE3 483 484 -0.48568 9.05593 0.0399712 -0.00972107 0.072696 0.115236 +EDGE3 484 485 -0.299056 9.02511 -0.168671 0.00579021 -0.0216768 0.106628 +EDGE3 485 486 -0.476042 8.87354 0.0555164 0.00168605 -0.00261282 0.122487 +EDGE3 486 487 -0.734916 8.88152 -0.218934 -0.018971 -0.0109556 0.113967 +EDGE3 487 488 -0.555044 9.06573 -0.00155804 -0.0153195 -0.021958 0.130199 +EDGE3 488 489 -0.522393 8.844 -0.0687633 0.0382916 0.0299628 0.100833 +EDGE3 489 490 -0.370167 9.15574 -0.144327 -0.00238295 0.0186785 0.146947 +EDGE3 490 491 -0.493346 8.98223 -0.0762153 -0.0335898 -0.0414022 0.128782 +EDGE3 491 492 -0.445487 9.21843 -0.218112 -0.00844879 -0.0220795 0.1522 +EDGE3 492 493 -0.542594 9.14072 0.0839263 0.021215 -0.0264453 0.125125 +EDGE3 493 494 -0.39901 9.31731 -0.303058 -0.011686 0.0154655 0.132133 +EDGE3 494 495 -0.575162 9.12137 0.006909 0.0448272 -0.0305856 0.134666 +EDGE3 495 496 -0.546822 9.13005 -0.0302824 0.0367385 -0.0282096 0.152368 +EDGE3 496 497 -0.379396 9.19432 0.0362434 0.0253803 -0.0357325 0.126904 +EDGE3 497 498 -0.552156 9.13659 -0.117194 -0.00609656 -0.000972302 0.129734 +EDGE3 498 499 -0.457165 9.01459 -0.121282 -0.0126682 -0.00728707 0.118066 +EDGE3 499 500 -0.43803 9.31174 -0.0766824 0.0411612 -0.0040434 0.176417 +EDGE3 500 501 -0.569857 9.26711 -0.0300711 -0.00379863 0.0178006 0.117924 +EDGE3 501 502 -0.437069 9.25257 0.0926344 0.0263895 0.0335336 0.162987 +EDGE3 502 503 -0.552879 9.186 0.0698416 -0.00745889 0.000806748 0.141751 +EDGE3 503 504 -0.686667 9.27159 -0.160943 -0.00914751 0.0430203 0.0984795 +EDGE3 504 505 -0.45831 9.45354 -0.130343 -0.0112251 -0.0277202 0.111636 +EDGE3 505 506 -0.338601 9.0729 0.0410798 -0.00251065 -0.0212787 0.107336 +EDGE3 506 507 -0.476825 9.06218 0.0595855 -0.0110154 0.011024 0.146084 +EDGE3 507 508 -0.446877 9.28334 -0.129783 -0.0194013 -0.0100633 0.121749 +EDGE3 508 509 -0.37063 9.41235 0.0314632 -0.0236581 -0.0093092 0.053082 +EDGE3 509 510 -0.317881 9.41413 -0.123953 -0.0258931 -0.0199813 0.102382 +EDGE3 510 511 -0.35013 9.48594 0.0113874 -0.0220122 -0.068619 0.0979869 +EDGE3 511 512 -0.64268 9.22251 -0.018341 -0.0330827 -0.00272866 0.117717 +EDGE3 512 513 -0.494166 9.35387 -0.061975 0.0244273 -0.0339078 0.142557 +EDGE3 513 514 -0.563986 9.19402 -0.0929664 -0.0328964 0.0108264 0.134578 +EDGE3 514 515 -0.421108 9.40295 -0.0839779 -0.0191058 -0.0255789 0.101147 +EDGE3 515 516 -0.502986 9.4368 -0.300206 -0.0116004 -0.0259118 0.0963746 +EDGE3 516 517 -0.352716 9.14454 -0.0899693 0.0166243 0.00446938 0.143652 +EDGE3 517 518 -0.426168 9.32154 0.00442749 -0.0510774 -0.0186415 0.113655 +EDGE3 518 519 -0.332113 9.38871 -0.0493224 0.00969522 0.0238789 0.0706846 +EDGE3 519 520 -0.30962 9.26529 -0.0357703 0.0315462 0.0169164 0.108641 +EDGE3 520 521 -0.416562 9.45416 -0.120916 -0.0130777 -0.0227879 0.0981623 +EDGE3 521 522 -0.590017 9.53584 -0.102417 -0.0118831 0.0161194 0.094979 +EDGE3 522 523 -0.448896 9.37788 0.011292 -0.0131154 0.0184698 0.123384 +EDGE3 523 524 -0.395166 9.40029 -0.100971 -0.021769 -0.0208863 0.144898 +EDGE3 524 525 -0.460876 9.42286 0.0237108 0.0396481 -0.00254159 0.130558 +EDGE3 525 526 -0.513207 9.36216 -0.212452 0.0451533 -0.0357377 0.156618 +EDGE3 526 527 -0.524077 9.42056 -0.3499 0.00616626 -0.0270493 0.142572 +EDGE3 527 528 -0.529384 9.54286 -0.0523876 0.0468028 0.0186213 0.0629372 +EDGE3 528 529 -0.529857 9.50906 -0.0782934 -0.00432528 0.0242863 0.133344 +EDGE3 529 530 -0.590688 9.46638 -0.0814354 -0.0206749 -0.0324303 0.120242 +EDGE3 530 531 -0.466574 9.52159 -0.0527169 -0.00496506 0.0359684 0.0937304 +EDGE3 531 532 -0.671514 9.37158 -0.0274986 0.0190377 -0.0597186 0.125043 +EDGE3 532 533 -0.584392 9.40076 0.0906729 0.0222835 0.00311586 0.127285 +EDGE3 533 534 -0.506768 9.37415 -0.111074 -0.0285215 0.0202286 0.167191 +EDGE3 534 535 -0.663299 9.61647 -0.125291 -0.000438631 -0.0309457 0.0773595 +EDGE3 535 536 -0.464902 9.47018 -0.00758329 -0.0319925 0.0334662 0.109773 +EDGE3 536 537 -0.502731 9.71254 -0.0199327 -0.0381572 -0.017015 0.146335 +EDGE3 537 538 -0.537205 9.53955 -0.0344392 -0.00543011 -0.0399408 0.0866508 +EDGE3 538 539 -0.618342 9.61444 -0.0824221 -0.00414043 0.0447278 0.102938 +EDGE3 539 540 -0.562583 9.49411 -0.113767 -0.0288634 0.0262352 0.129955 +EDGE3 540 541 -0.344221 9.50985 -0.152159 0.0225676 -0.00142588 0.141663 +EDGE3 541 542 -0.481969 9.73707 -0.178698 -0.0396246 0.016919 0.110817 +EDGE3 542 543 -0.51686 9.61598 -0.158557 0.00194433 -0.0411607 0.122784 +EDGE3 543 544 -0.575754 9.59928 -0.0997329 -0.00890796 0.014824 0.119639 +EDGE3 544 545 -0.591223 9.58282 0.122702 0.0416951 0.0114928 0.133286 +EDGE3 545 546 -0.702113 9.72486 -0.0349227 -0.0400373 0.0195651 0.145968 +EDGE3 546 547 -0.611933 9.64652 -0.0603332 0.0210497 0.0193649 0.171309 +EDGE3 547 548 -0.459222 9.36974 -0.0804079 -0.0110629 0.0025275 0.144307 +EDGE3 548 549 -0.6803 9.65765 -0.00323615 -0.00963622 0.0158699 0.0924834 +EDGE3 549 550 -0.341837 9.66781 -0.163417 0.0205601 -0.0306335 0.116093 +EDGE3 550 551 -0.611013 9.68684 -0.0499366 -0.0304591 -0.0373063 0.0969126 +EDGE3 551 552 -0.553838 9.69608 -0.1345 0.0651477 0.0454051 0.0724827 +EDGE3 552 553 -0.467236 9.76765 -0.0899421 -0.015889 -0.0324208 0.151207 +EDGE3 553 554 -0.509782 9.61949 -0.0865762 -0.0157573 -0.0319506 0.133654 +EDGE3 554 555 -0.458336 9.95321 -0.238727 -0.00229506 0.00987974 0.117784 +EDGE3 555 556 -0.623492 9.69664 -0.190644 -0.000436359 -0.013997 0.137374 +EDGE3 556 557 -0.43388 9.52128 -0.0704121 -0.00662889 0.0685089 0.106466 +EDGE3 557 558 -0.449489 9.7938 -0.231752 -0.0050126 -0.0363099 0.117696 +EDGE3 558 559 -0.591202 9.90393 -0.175584 -0.0071838 -0.0172871 0.0943697 +EDGE3 559 560 -0.384864 9.84072 -0.210058 -0.0164692 0.0297865 0.106377 +EDGE3 560 561 -0.345077 9.86296 0.0377365 -0.0132922 -0.00544132 0.175107 +EDGE3 561 562 -0.640874 9.64354 -0.0754047 0.0240544 0.0128955 0.130881 +EDGE3 562 563 -0.583957 9.6882 -0.133283 0.0275744 0.00409077 0.131214 +EDGE3 563 564 -0.759293 9.77637 -0.180837 0.0223968 -0.0467652 0.157285 +EDGE3 564 565 -0.435371 9.92055 -0.0652115 -0.0279807 0.0455928 0.129266 +EDGE3 565 566 -0.504608 10.0585 -0.220355 -0.00423892 -0.0253905 0.154577 +EDGE3 566 567 -0.583105 9.62726 -0.0385599 0.0125931 0.00157288 0.142248 +EDGE3 567 568 -0.418812 9.93973 -0.00904712 0.00424079 -0.025666 0.094345 +EDGE3 568 569 -0.660907 9.80915 0.110031 0.0168833 0.0148951 0.118886 +EDGE3 569 570 -0.580249 9.89147 -0.056416 0.000514778 -0.0310825 0.157983 +EDGE3 570 571 -0.51902 9.77384 -0.0229751 0.0165559 -0.000165297 0.147221 +EDGE3 571 572 -0.65107 9.94078 -0.171718 -0.0762897 -0.0235964 0.0998249 +EDGE3 572 573 -0.546394 9.79195 -0.180318 -0.00559716 0.0168309 0.138522 +EDGE3 573 574 -0.547492 9.80602 -0.0736028 -0.0272302 -0.0282391 0.129652 +EDGE3 574 575 -0.442276 9.99348 -0.0295679 0.00151356 -0.000614518 0.124358 +EDGE3 575 576 -0.669799 10.0336 -0.0869805 0.0201473 -0.0230748 0.125988 +EDGE3 576 577 -0.521559 9.99507 -0.0828248 -0.0150498 -0.00161678 0.11056 +EDGE3 577 578 -0.605875 9.78451 -0.161816 -0.0189688 0.0148465 0.112221 +EDGE3 578 579 -0.606097 9.93736 -0.0481117 0.0312628 0.00137681 0.153689 +EDGE3 579 580 -0.637171 9.98879 -0.28808 0.0301391 -0.0334228 0.0756378 +EDGE3 580 581 -0.500365 9.96867 -0.049431 -0.00215555 0.00976091 0.182599 +EDGE3 581 582 -0.51425 9.90448 -0.208316 -0.0221798 0.0239713 0.10424 +EDGE3 582 583 -0.520655 10.0627 0.0528264 0.0338507 -0.0073872 0.14008 +EDGE3 583 584 -0.728797 10.0483 -0.0995101 -0.0098034 0.00207775 0.138799 +EDGE3 584 585 -0.648124 10.0921 -0.0463311 -0.0175443 0.0507535 0.139984 +EDGE3 585 586 -0.675211 10.0736 0.0223114 -0.0372474 -0.00882792 0.160912 +EDGE3 586 587 -0.503704 9.95501 -0.0267546 -0.00485875 -0.0167479 0.188249 +EDGE3 587 588 -0.411349 10.0697 -0.186202 0.0134565 -0.0227012 0.116589 +EDGE3 588 589 -0.406305 9.98461 -0.0243892 -0.0350094 -0.0208405 0.148564 +EDGE3 589 590 -0.691014 9.95415 -0.189219 0.0348537 -0.00579765 0.151461 +EDGE3 590 591 -0.520553 10.2755 0.109334 0.0239092 -0.037998 0.151086 +EDGE3 591 592 -0.491369 10.1135 -0.0179466 0.00889856 -0.0320038 0.157605 +EDGE3 592 593 -0.492019 10.0383 -0.0382401 -0.00755509 -0.0188169 0.168164 +EDGE3 593 594 -0.449471 10.0017 -0.168103 0.0201938 0.00858649 0.113326 +EDGE3 594 595 -0.729879 10.188 -0.155232 0.0181417 0.00686436 0.14031 +EDGE3 595 596 -0.560451 9.94493 0.0690176 0.000107528 -0.00133283 0.0872198 +EDGE3 596 597 -0.673625 10.1489 0.00164459 -0.00780484 0.025646 0.0614847 +EDGE3 597 598 -0.595394 10.2273 -0.155035 0.0160663 -0.0218437 0.140097 +EDGE3 598 599 -0.495583 10.1149 -0.123623 0.00150941 -0.000877285 0.092582 +EDGE3 599 600 -0.579736 10.2914 -0.135385 -0.00549596 -0.00844412 0.103752 +EDGE3 600 601 -0.35365 10.3 -0.0775417 0.0272434 0.0115904 0.16466 +EDGE3 601 602 -0.565761 10.107 -0.10121 0.00313286 -0.0423423 0.147761 +EDGE3 602 603 -0.593917 10.0805 0.0298388 0.00783662 0.0498798 0.156444 +EDGE3 603 604 -0.88015 10.1421 -0.279469 -0.0378369 -0.0440429 0.128848 +EDGE3 604 605 -0.638044 10.2548 -0.0110429 -0.037602 -0.0662479 0.131769 +EDGE3 605 606 -0.541378 10.1016 -0.128887 0.0236247 0.019471 0.115706 +EDGE3 606 607 -0.692832 10.3356 -0.214519 -0.00562418 -0.0091895 0.117071 +EDGE3 607 608 -0.708266 10.2425 -0.143215 -0.0015925 -0.00778284 0.122099 +EDGE3 608 609 -0.560394 10.3593 -0.0922635 0.0266184 -0.00048235 0.113584 +EDGE3 609 610 -0.549282 10.2762 -0.139436 0.0232315 0.000280683 0.131045 +EDGE3 610 611 -0.444711 10.1474 -0.0863799 -0.0310167 0.0342651 0.146897 +EDGE3 611 612 -0.539971 10.2137 -0.0922161 0.0020689 0.0198164 0.154814 +EDGE3 612 613 -0.428171 10.2533 -0.152533 -8.26767e-05 0.0201169 0.0880881 +EDGE3 613 614 -0.610657 10.2509 -0.0701177 -0.0257348 -0.0523752 0.115455 +EDGE3 614 615 -0.561901 10.302 0.0733974 0.00796174 0.0202938 0.131953 +EDGE3 615 616 -0.604516 10.3608 -0.247837 -0.000144893 0.0309366 0.150894 +EDGE3 616 617 -0.732578 10.4415 -0.0970806 0.0126057 -0.00494759 0.130808 +EDGE3 617 618 -0.632955 10.4202 -0.180957 -0.039366 -0.000601025 0.140456 +EDGE3 618 619 -0.549868 10.3996 0.0239032 0.0155975 -0.0135102 0.145876 +EDGE3 619 620 -0.647024 10.2839 0.0722994 0.0185783 -0.00502041 0.145412 +EDGE3 620 621 -0.588486 10.5196 -0.165451 0.0325856 0.0119994 0.08248 +EDGE3 621 622 -0.503606 10.3338 -0.0450918 -0.00387436 -0.00991225 0.0845384 +EDGE3 622 623 -0.744862 10.4182 -0.0497198 -0.0122801 0.00679071 0.147813 +EDGE3 623 624 -0.590932 10.2843 0.0562619 -0.00200569 0.0261227 0.125755 +EDGE3 624 625 -0.744319 10.2473 -0.130149 -0.00153428 -0.00792725 0.131123 +EDGE3 625 626 -0.505545 10.4701 -0.225927 0.055853 0.00136355 0.123407 +EDGE3 626 627 -0.589711 10.3257 -0.140715 -0.00242569 -0.00648368 0.137392 +EDGE3 627 628 -0.741252 10.2845 -0.122007 0.0416197 -0.0131725 0.141614 +EDGE3 628 629 -0.543724 10.509 -0.0342301 -0.024719 -0.0265984 0.12517 +EDGE3 629 630 -0.474407 10.4362 0.0620068 0.0263064 -0.0185907 0.134034 +EDGE3 630 631 -0.653661 10.4495 -0.127224 -0.0101667 -0.0125662 0.109287 +EDGE3 631 632 -0.541593 10.4344 0.0145756 -0.00610309 0.0240927 0.175733 +EDGE3 632 633 -0.334204 10.3252 -0.172498 -0.00791622 0.0301704 0.0719397 +EDGE3 633 634 -0.401928 10.4628 -0.0759232 0.0507576 -0.0423364 0.128575 +EDGE3 634 635 -0.54982 10.6061 -0.074204 0.0266019 -0.0108024 0.145464 +EDGE3 635 636 -0.523432 10.2874 0.0174404 0.0519617 -0.019657 0.138193 +EDGE3 636 637 -0.516915 10.75 -0.227485 -0.0289954 0.0212853 0.124561 +EDGE3 637 638 -0.937634 10.4344 0.0581246 0.0337455 -0.014629 0.122119 +EDGE3 638 639 -0.48899 10.4637 0.0204038 -0.00265827 -0.0214176 0.119839 +EDGE3 639 640 -0.456639 10.4182 0.00365541 0.0368173 -0.00870094 0.148835 +EDGE3 640 641 -0.498878 10.5087 -0.116529 0.00185414 -0.00704054 0.063953 +EDGE3 641 642 -0.592383 10.4133 -0.0815473 0.0482175 -0.0226021 0.0812033 +EDGE3 642 643 -0.658431 10.5858 -0.151967 -0.00535787 0.0379488 0.162242 +EDGE3 643 644 -0.591201 10.6868 -0.25712 -0.000603227 -0.0138138 0.118098 +EDGE3 644 645 -0.412254 10.5399 -0.217776 0.0410632 -0.0104835 0.157256 +EDGE3 645 646 -0.501536 10.5984 -0.148369 -0.00694208 -0.00959108 0.114519 +EDGE3 646 647 -0.441658 10.6053 -0.225141 -0.0269647 0.0197185 0.163727 +EDGE3 647 648 -0.617436 10.499 0.0300789 0.0496128 -0.00845607 0.12086 +EDGE3 648 649 -0.400338 10.8294 0.0939878 -0.0115074 0.00974918 0.132292 +EDGE3 649 650 -0.494651 10.7357 -0.0217466 0.018297 -0.0295749 0.103268 +EDGE3 650 651 -0.664646 10.5759 -0.207607 -0.0537879 0.0070636 0.132489 +EDGE3 651 652 -0.601087 10.9141 -0.107328 0.0181305 -0.0314801 0.148572 +EDGE3 652 653 -0.74691 10.5242 -0.126424 0.0284586 -0.0120015 0.110807 +EDGE3 653 654 -0.669063 10.6436 -0.0978641 -0.0381515 0.0107075 0.152494 +EDGE3 654 655 -0.790162 10.5872 -0.238857 0.0213422 0.0181164 0.138819 +EDGE3 655 656 -0.380003 10.6851 -0.147754 -0.0155301 -0.00222968 0.142109 +EDGE3 656 657 -0.588139 10.5769 -0.00977376 0.0100096 0.0434776 0.0994393 +EDGE3 657 658 -0.497226 10.8091 -0.0333826 -0.0019529 0.00684735 0.131408 +EDGE3 658 659 -0.654484 10.6906 -0.235507 -0.0102234 -0.040742 0.133663 +EDGE3 659 660 -0.630369 10.6297 -0.00718587 0.0117387 -0.0267532 0.136378 +EDGE3 660 661 -0.392746 10.7911 0.0273434 0.029475 0.0132902 0.136582 +EDGE3 661 662 -0.616919 10.6644 -0.0247015 -0.0340377 0.000319917 0.151231 +EDGE3 662 663 -0.596472 10.7392 0.0878943 0.0141532 0.00273509 0.19548 +EDGE3 663 664 -0.713512 10.7477 -0.0453047 -0.0270619 -0.0227445 0.129743 +EDGE3 665 666 -0.66227 10.7237 -0.225771 -0.00139248 -0.0270882 0.121723 +EDGE3 664 665 -0.768584 10.8786 -0.0541496 0.00653078 0.024345 0.0885954 +EDGE3 666 667 -0.732639 11.0507 -0.24366 -0.00605878 -0.000319506 0.130026 +EDGE3 667 668 -0.485504 10.9053 0.0338068 -0.0810854 0.00712353 0.145792 +EDGE3 668 669 -0.525756 10.6861 -0.150324 0.041852 0.0319852 0.0992715 +EDGE3 669 670 -0.58733 10.7819 -0.0117443 0.0120091 0.0301826 0.111398 +EDGE3 670 671 -0.589293 10.6998 -0.0479086 -0.0136142 -0.0147259 0.151874 +EDGE3 671 672 -0.609871 10.8995 -0.181929 -0.0257439 -0.00325175 0.0890023 +EDGE3 672 673 -0.716451 10.8434 0.0113366 -0.0343243 -0.0594388 0.109766 +EDGE3 673 674 -0.620625 10.67 -0.101183 0.0394398 0.0111823 0.0941084 +EDGE3 674 675 -0.510752 10.9294 -0.107232 0.0137948 -0.00702233 0.0921856 +EDGE3 675 676 -0.82033 10.6322 -0.115144 0.00111414 0.005019 0.118744 +EDGE3 676 677 -0.803215 10.8527 -0.0205366 0.0100041 0.00413699 0.13062 +EDGE3 677 678 -0.534875 10.8963 -0.0478353 0.0195009 0.0250323 0.100169 +EDGE3 678 679 -0.627679 10.9044 0.00515022 -0.0427811 0.0265479 0.126642 +EDGE3 679 680 -0.506963 10.9328 -0.0542087 0.0175667 -0.0129558 0.108869 +EDGE3 680 681 -0.839095 10.7499 -0.0815838 0.0180634 -0.00926397 0.151749 +EDGE3 681 682 -0.594669 10.8893 -0.215995 0.00901051 0.00676044 0.144758 +EDGE3 682 683 -0.52551 10.7654 -0.0631472 0.0334564 -0.020682 0.130264 +EDGE3 683 684 -0.687474 10.8662 0.039089 -0.0488736 -0.0392234 0.174572 +EDGE3 684 685 -0.835656 10.7627 -0.178378 -0.00671276 -0.0111898 0.159491 +EDGE3 685 686 -0.647665 10.8169 -0.209463 -0.00911933 0.0233011 0.0996128 +EDGE3 686 687 -0.616611 10.9003 -0.112664 0.0205933 0.00719554 0.141574 +EDGE3 687 688 -0.530757 10.7944 -0.0126989 -0.0465488 -0.00108581 0.138003 +EDGE3 688 689 -0.752658 10.9632 -0.245523 -0.0211544 0.00242759 0.157612 +EDGE3 689 690 -0.695292 10.8638 -0.0637187 -0.0252215 -0.0101434 0.159737 +EDGE3 690 691 -0.600469 10.9865 0.0600297 0.0165616 0.0592252 0.177891 +EDGE3 691 692 -0.65458 11.2186 -0.150787 0.00163396 0.00471959 0.094319 +EDGE3 692 693 -0.712945 11.007 -0.09499 0.000779006 -0.0399446 0.125397 +EDGE3 693 694 -0.794894 11.0985 -0.235501 0.0242815 0.0172316 0.127108 +EDGE3 694 695 -0.591949 11.088 -0.069569 0.0227117 -0.00291555 0.141675 +EDGE3 695 696 -0.687442 11.2161 -0.196157 -0.0336719 -0.00239286 0.103052 +EDGE3 696 697 -0.815084 10.8452 -0.00495947 -0.00369475 -0.0355957 0.0826594 +EDGE3 697 698 -0.462624 11.0265 -0.133709 -0.00189978 -0.00966264 0.107543 +EDGE3 698 699 -0.521762 10.8635 -0.152054 -0.0225095 -0.00447384 0.122426 +EDGE3 699 700 -0.68687 10.942 -0.0148899 0.0531824 -0.0251391 0.127166 +EDGE3 700 701 -0.562204 11.0006 0.00239 0.00912703 0.0519027 0.144637 +EDGE3 701 702 -0.705836 10.9017 -0.139435 0.0157412 0.0188574 0.123963 +EDGE3 702 703 -0.523375 11.1483 -0.0962653 -0.00851938 0.00374179 0.161846 +EDGE3 703 704 -0.745986 11.0664 -0.123423 0.034364 0.0160229 0.0986006 +EDGE3 704 705 -0.639699 11.0407 -0.12836 0.00964839 0.0272245 0.128389 +EDGE3 705 706 -0.487976 11.0265 -0.0677891 -0.000661507 -0.0498312 0.17019 +EDGE3 706 707 -0.725944 11.0945 -0.181028 0.0249788 0.000549032 0.106139 +EDGE3 707 708 -0.683211 10.9898 0.117685 -0.0282752 0.0315459 0.143414 +EDGE3 708 709 -0.575169 11.1271 -0.0186034 -0.0268973 0.00689893 0.104732 +EDGE3 709 710 -0.559964 10.8057 -0.141654 -0.0384226 -0.0114162 0.103481 +EDGE3 710 711 -0.576749 11.2275 -0.20321 0.00891208 0.0155504 0.110963 +EDGE3 711 712 -0.625349 11.1447 -0.171747 -0.022725 0.0240097 0.121514 +EDGE3 712 713 -0.669889 11.2322 -0.142713 -0.0215008 -0.0132082 0.121461 +EDGE3 713 714 -0.621843 10.9936 -0.0522736 0.0119736 -0.0163135 0.124995 +EDGE3 714 715 -0.599411 11.0718 -0.031367 0.00230053 -0.00178688 0.0973502 +EDGE3 715 716 -0.490987 10.9074 -0.300811 0.0058404 -0.00999171 0.1563 +EDGE3 716 717 -0.573421 11.0741 -0.127133 0.0170648 0.0188859 0.0911173 +EDGE3 717 718 -0.623086 10.9148 -0.104811 -0.00923749 0.022186 0.105062 +EDGE3 718 719 -0.654924 11.0737 -0.0628252 0.00980152 0.0103942 0.151889 +EDGE3 719 720 -0.383911 11.126 -0.0593576 -0.00758614 0.0318917 0.146101 +EDGE3 720 721 -0.686745 11.1537 -0.15888 0.0322838 0.00911944 0.079761 +EDGE3 721 722 -0.723595 10.9838 -0.0266405 0.0193496 0.041608 0.125644 +EDGE3 722 723 -0.569306 11.3456 -0.064007 0.041307 -0.0214223 0.113298 +EDGE3 723 724 -0.62814 11.1692 -0.103583 0.0207471 -0.0251809 0.110041 +EDGE3 724 725 -0.68316 11.0803 -0.159238 0.027791 0.0191503 0.135797 +EDGE3 725 726 -0.623816 10.9559 -0.0735625 0.0357481 0.0340893 0.126012 +EDGE3 726 727 -0.640317 11.2773 0.0414476 0.00722929 -0.00844479 0.0454878 +EDGE3 727 728 -0.662705 11.2037 -0.192275 -0.0117891 -0.0116422 0.135117 +EDGE3 729 730 -0.629166 11.254 -0.00967143 0.0167398 0.0275291 0.169343 +EDGE3 728 729 -0.747785 11.3066 -0.0776214 0.0130414 0.0142884 0.122937 +EDGE3 731 732 -0.645297 11.2255 -0.105746 -0.0375322 0.00904361 0.109279 +EDGE3 730 731 -0.591718 11.1375 -0.113566 0.00986028 -0.00441137 0.0672201 +EDGE3 733 734 -0.627899 11.2116 -0.0810211 -0.0448976 -0.0295828 0.0968198 +EDGE3 732 733 -0.786294 11.3323 -0.212644 -0.0415294 0.0194585 0.143641 +EDGE3 735 736 -0.632089 11.304 -0.0768134 0.00424355 -0.0696194 0.118225 +EDGE3 734 735 -0.673566 11.2043 -0.127292 0.0138337 -0.0244379 0.119011 +EDGE3 737 738 -0.713155 11.3351 -0.0724339 0.00934276 0.00759895 0.119831 +EDGE3 736 737 -0.673207 11.2067 -0.136162 0.010352 0.000784984 0.123193 +EDGE3 739 740 -0.640923 11.1974 -0.158405 0.00979466 -0.0498866 0.10765 +EDGE3 738 739 -0.569882 11.1028 -0.0435145 0.0149744 0.035056 0.109788 +EDGE3 741 742 -0.708584 11.2493 -0.121609 -0.0134295 -0.0426803 0.172525 +EDGE3 740 741 -0.740787 11.2632 -0.138114 0.00650163 -0.0146527 0.0765449 +EDGE3 743 744 -0.491888 11.2774 -0.0353431 -0.00387397 0.0131329 0.156673 +EDGE3 742 743 -0.641856 11.2807 0.0274325 0.0158226 0.0531381 0.0924723 +EDGE3 745 746 -0.808268 11.1206 -0.0483386 -0.0122947 -0.00389021 0.134917 +EDGE3 744 745 -0.771917 11.2746 -0.196096 0.0544498 0.010539 0.114427 +EDGE3 747 748 -0.586487 11.2847 -0.102844 0.0219995 0.0074276 0.155189 +EDGE3 746 747 -0.669507 11.1769 -0.0452237 0.02907 -0.0278881 0.119061 +EDGE3 749 750 -0.858715 11.4476 -0.0213388 -0.0624871 -0.00103245 0.0862353 +EDGE3 748 749 -0.641533 11.3025 -0.00871579 0.0427654 0.029676 0.122719 +EDGE3 750 751 -0.649309 11.2636 -0.147157 0.0352236 -0.00799235 0.138275 +EDGE3 751 752 -0.869942 11.2278 -0.0720114 -0.0473905 0.0050812 0.132713 +EDGE3 752 753 -0.823801 11.1947 -0.168883 0.0407627 -0.0125927 0.121908 +EDGE3 753 754 -0.738987 11.3756 -0.359176 0.00389317 0.0148241 0.15601 +EDGE3 754 755 -0.761464 11.3628 -0.117523 0.00101623 0.00661009 0.119072 +EDGE3 755 756 -0.62733 11.4863 -0.179828 0.0144695 -0.0339339 0.142466 +EDGE3 756 757 -0.759613 11.2009 -0.3027 -0.00153063 -0.0182157 0.172399 +EDGE3 757 758 -0.753795 11.5658 -0.186494 -0.00478204 0.0381412 0.127497 +EDGE3 758 759 -0.716432 11.5854 0.019814 0.0215565 -0.0156851 0.0878506 +EDGE3 759 760 -0.857631 11.3725 -0.324034 -0.0286909 -0.0072389 0.115925 +EDGE3 760 761 -0.564986 11.2901 -0.168735 0.0335559 0.0132867 0.1178 +EDGE3 761 762 -0.624602 11.4161 -0.103096 -0.0742735 0.00547345 0.0966695 +EDGE3 762 763 -0.730441 11.325 -0.00859699 0.0289852 -0.0404061 0.0980436 +EDGE3 763 764 -0.623399 11.4052 -0.0405101 0.0166184 0.00422661 0.131983 +EDGE3 764 765 -0.751135 11.345 -0.245395 -0.0296714 0.0247943 0.126582 +EDGE3 765 766 -0.456256 11.4209 -0.217299 -0.0359357 0.0155084 0.152613 +EDGE3 766 767 -0.497603 11.2884 -0.223088 -0.0168023 0.0492511 0.0955121 +EDGE3 767 768 -0.607295 11.3577 -0.0242014 -0.0407421 -0.0188519 0.120699 +EDGE3 768 769 -0.762157 11.3324 -0.23283 0.0123768 -0.0166862 0.121811 +EDGE3 769 770 -0.63583 11.5181 -0.057269 -0.0191341 0.00461432 0.131446 +EDGE3 770 771 -0.733513 11.5643 -0.0645911 0.00383694 -0.0056335 0.128574 +EDGE3 771 772 -0.702886 11.4133 -0.148503 0.0164051 0.0149995 0.0691098 +EDGE3 772 773 -0.670083 11.3915 -0.0944627 0.00714223 -0.00596539 0.114582 +EDGE3 773 774 -0.553672 11.4808 -0.348721 0.0175321 -0.0313712 0.11777 +EDGE3 774 775 -0.819521 11.3265 -0.100717 -0.0317067 -0.0039908 0.119591 +EDGE3 775 776 -0.605185 11.5203 0.0535101 0.0384817 -0.0161191 0.131636 +EDGE3 776 777 -0.489229 11.498 0.046753 -0.0289639 0.00439944 0.144558 +EDGE3 777 778 -0.662014 11.472 -0.0895961 0.0100766 -0.0116892 0.110842 +EDGE3 778 779 -0.593485 11.4806 0.0292226 -0.0272418 -0.00739642 0.122532 +EDGE3 779 780 -0.613724 11.5799 -0.0421083 0.0298456 0.00144193 0.144726 +EDGE3 780 781 -0.522931 11.4698 -0.157904 -0.0302536 0.00087618 0.123218 +EDGE3 781 782 -0.868297 11.5272 -0.0100059 0.0187538 0.0195099 0.145113 +EDGE3 782 783 -0.693848 11.6522 -0.285085 0.00727625 -0.0111887 0.0864028 +EDGE3 783 784 -0.730065 11.4833 0.0680907 0.00525073 0.00946078 0.100429 +EDGE3 784 785 -0.694131 11.4139 -0.123119 0.00201867 0.0348285 0.141161 +EDGE3 785 786 -0.613879 11.5545 -0.106061 -0.0305967 0.00378237 0.0648066 +EDGE3 786 787 -0.550279 11.5459 -0.227432 0.0130018 0.0160446 0.111967 +EDGE3 787 788 -0.57525 11.7817 0.0237502 0.00553513 0.00328994 0.138892 +EDGE3 788 789 -0.770584 11.5206 0.0433127 -0.013363 0.00848641 0.0891157 +EDGE3 789 790 -0.622863 11.7297 -0.0711459 -0.0123988 0.0605069 0.163007 +EDGE3 790 791 -0.510269 11.5654 -0.168263 0.0224371 -0.0110497 0.135575 +EDGE3 791 792 -0.682655 11.4946 -0.0998997 0.00257173 0.0397944 0.151197 +EDGE3 792 793 -0.730061 11.5514 -0.142537 -0.0199822 -0.0277997 0.116125 +EDGE3 793 794 -0.60549 11.5649 -0.0159346 0.0210973 -0.0177114 0.145375 +EDGE3 794 795 -0.815238 11.554 -0.14138 -0.0223306 -0.0363467 0.102426 +EDGE3 795 796 -0.633403 11.5727 -0.256176 0.001124 -0.0134933 0.138225 +EDGE3 796 797 -0.786517 11.5877 -0.178135 -0.0250794 0.0194774 0.0654389 +EDGE3 797 798 -0.719277 11.662 -0.243779 0.0171121 0.0156303 0.176665 +EDGE3 798 799 -0.685454 11.6387 0.063688 0.00513375 0.00388497 0.109556 +EDGE3 799 800 -0.589601 11.7057 -0.0918285 0.00323494 -0.00905249 0.11474 +EDGE3 800 801 -0.616668 11.6399 -0.127585 0.0208997 -0.0428943 0.0698618 +EDGE3 801 802 -0.750759 11.647 0.00527676 -0.0314129 0.0381739 0.14109 +EDGE3 802 803 -0.689934 11.6104 -0.144727 -0.00691586 0.0110097 0.138723 +EDGE3 803 804 -0.654329 11.6807 -0.299351 -0.016207 -0.0130176 0.0922021 +EDGE3 804 805 -0.71325 11.6174 -0.247185 -0.0131055 0.0231408 0.136037 +EDGE3 805 806 -0.831539 11.819 -0.156321 0.0211648 0.0185782 0.0956072 +EDGE3 806 807 -0.665039 11.6899 -0.165244 -0.017346 0.00670423 0.122658 +EDGE3 807 808 -0.826803 11.6651 -0.206612 0.00154575 0.0194254 0.156979 +EDGE3 808 809 -0.585279 11.7909 -0.134395 -0.0386023 0.00198799 0.152156 +EDGE3 809 810 -0.898298 11.7763 -0.192646 0.00389181 -0.0210774 0.0670251 +EDGE3 810 811 -0.75429 11.7916 -0.237213 -0.0461283 0.0074222 0.0927254 +EDGE3 811 812 -0.663224 11.6124 -0.189041 -0.00123376 0.0101671 0.164593 +EDGE3 812 813 -0.765255 11.74 -0.151041 0.00504807 -0.00635209 0.124817 +EDGE3 813 814 -0.632111 11.5904 -0.282287 -0.0592282 -0.0223453 0.136917 +EDGE3 814 815 -0.702276 11.5611 0.111001 -0.0146572 -0.0297494 0.17961 +EDGE3 815 816 -0.633299 11.7893 -0.156848 0.00196402 -0.0368688 0.109714 +EDGE3 816 817 -0.590886 11.7373 -0.233355 0.0101475 -0.00730159 0.13714 +EDGE3 817 818 -0.667103 11.8448 -0.227906 -0.0241993 0.0195925 0.0947878 +EDGE3 818 819 -0.739056 11.6907 -0.266086 0.0166344 0.017775 0.114675 +EDGE3 819 820 -0.753734 11.7017 -0.100248 -0.00763366 -0.0038417 0.194878 +EDGE3 820 821 -0.680164 11.7826 -0.184943 -0.000873303 0.00507169 0.105098 +EDGE3 821 822 -0.632523 11.5689 -0.0588963 -0.000657909 0.0192009 0.107669 +EDGE3 822 823 -0.717916 11.7235 -0.238238 -0.00867143 -0.0152566 0.121073 +EDGE3 823 824 -0.857452 11.6628 -0.0859608 -0.00366124 0.0357554 0.108158 +EDGE3 824 825 -0.789681 11.7622 -0.217677 0.0041665 -0.00385137 0.12833 +EDGE3 825 826 -0.792671 11.6024 -0.243491 -0.017026 0.0360949 0.123282 +EDGE3 826 827 -0.58394 11.6733 -0.13811 -0.0206171 -0.018804 0.0939978 +EDGE3 827 828 -0.789333 11.8553 -0.141847 0.030524 -0.00959597 0.137998 +EDGE3 828 829 -0.539641 11.8278 -0.0101806 -0.0303427 0.0334132 0.11254 +EDGE3 829 830 -0.617863 12.0277 -0.0706224 0.0226627 0.000919939 0.131682 +EDGE3 830 831 -0.670354 11.8194 -0.0832365 -0.0246532 -0.0109335 0.142523 +EDGE3 831 832 -0.698097 11.8348 -0.162876 0.0291299 -0.00230172 0.157775 +EDGE3 832 833 -0.829211 11.9336 -0.117647 0.0396994 -0.0250838 0.0992035 +EDGE3 833 834 -0.691895 11.9213 0.0318949 0.0170468 -0.0134209 0.139691 +EDGE3 834 835 -0.455491 11.8175 -0.272552 -0.00763231 -0.00397073 0.112506 +EDGE3 835 836 -0.539987 11.872 -0.0826496 -0.0134346 -0.033923 0.130991 +EDGE3 836 837 -0.760323 11.847 -0.196677 -0.0029314 0.0136777 0.104547 +EDGE3 837 838 -0.843612 11.7159 -0.187819 0.0271338 0.0197938 0.100072 +EDGE3 838 839 -0.615614 11.761 -0.0664561 -0.0161247 0.00179751 0.156159 +EDGE3 839 840 -0.810274 11.8291 -0.0109603 0.0431663 -0.032561 0.0883044 +EDGE3 840 841 -0.832701 12.0225 -0.0440459 -0.00858529 -0.0272606 0.127188 +EDGE3 841 842 -0.712871 11.9951 -0.240134 -0.00693222 0.0026366 0.122756 +EDGE3 842 843 -0.77068 11.9913 -0.153277 0.0317926 -0.0394176 0.160023 +EDGE3 843 844 -0.690626 12.1066 -0.031988 0.0153329 0.00237161 0.147308 +EDGE3 844 845 -0.771342 11.7605 -0.0798066 0.00314307 0.0282584 0.158631 +EDGE3 845 846 -0.804645 11.8315 -0.20449 -0.0093038 0.0136013 0.106236 +EDGE3 846 847 -0.736638 12.0176 -0.0281956 -0.0840391 0.0289455 0.0904216 +EDGE3 847 848 -0.459807 11.9297 -0.321135 -0.0628447 0.0310872 0.1199 +EDGE3 848 849 -0.699828 11.8898 -0.0758647 0.0172072 0.00796348 0.120963 +EDGE3 849 850 -0.717524 12.0151 -0.00356581 -0.0076972 -0.0510018 0.13303 +EDGE3 850 851 -0.734513 11.7539 -0.126567 0.00835793 -0.018566 0.135551 +EDGE3 851 852 -0.57587 11.8564 -0.0115039 0.0108649 -0.0149321 0.145063 +EDGE3 852 853 -0.771243 11.9346 -0.238415 0.00423455 0.000355828 0.0916853 +EDGE3 853 854 -0.773857 11.9675 -0.0771789 -0.0354557 -0.00573538 0.121763 +EDGE3 854 855 -0.799955 12.0126 0.0232991 -0.00340641 -0.0132741 0.11525 +EDGE3 855 856 -0.72757 11.9195 -0.0294622 -0.0287391 -0.00519506 0.179788 +EDGE3 856 857 -0.557111 11.945 -0.207288 -0.0449343 -0.050059 0.129505 +EDGE3 857 858 -0.586848 12.1391 -0.150817 -0.016757 0.000806583 0.119582 +EDGE3 858 859 -0.756425 11.972 -0.0591718 0.00608936 0.00319501 0.103747 +EDGE3 859 860 -0.739117 12.1288 -0.038381 -0.0156557 0.0153042 0.117149 +EDGE3 860 861 -0.715078 11.8469 -0.0344951 -0.0128342 0.00266633 0.120967 +EDGE3 861 862 -0.732168 12.2183 -0.0625808 0.00437515 0.0270384 0.143665 +EDGE3 862 863 -0.645136 11.9812 -0.155359 -0.00264511 -0.00441136 0.123699 +EDGE3 863 864 -0.894341 11.884 -0.103596 0.0343545 0.0356571 0.11499 +EDGE3 864 865 -0.810778 11.94 -0.0442439 0.00117971 0.00552553 0.154264 +EDGE3 865 866 -0.654913 12.0156 -0.296066 -0.0329312 0.0282763 0.109329 +EDGE3 866 867 -0.659943 11.9182 -0.11817 -0.0116617 -0.00322966 0.0813899 +EDGE3 867 868 -0.577719 12.0034 -0.142515 -0.0459935 0.0127893 0.104513 +EDGE3 868 869 -0.783146 11.9312 0.0170831 -0.0197049 -0.000868907 0.144051 +EDGE3 869 870 -0.997622 11.8427 -0.140152 -0.0200887 -0.00538 0.131414 +EDGE3 870 871 -0.62283 11.9317 -0.0221585 0.0131853 0.0267817 0.106995 +EDGE3 871 872 -0.834861 12.0936 -0.0430666 -0.00969133 -0.0196581 0.106678 +EDGE3 872 873 -0.767198 12.0252 -0.00618724 -0.00733851 -0.0261495 0.0899095 +EDGE3 873 874 -0.641691 12.0225 -0.0202817 -0.0217425 0.000286311 0.141538 +EDGE3 874 875 -0.693478 12.0514 -0.0528624 -0.0240539 -0.0562632 0.14046 +EDGE3 875 876 -0.750347 11.9617 -0.0686156 -0.0213461 -0.0238533 0.123387 +EDGE3 876 877 -0.782156 12.1556 0.103009 0.0467122 0.00485887 0.137216 +EDGE3 877 878 -0.739106 12.0054 0.096128 0.0435807 0.00647681 0.0929089 +EDGE3 878 879 -0.567285 11.9689 -0.177967 -0.0244536 -0.0298197 0.112014 +EDGE3 879 880 -0.559373 12.0689 -0.0868761 0.0272594 0.0111953 0.116944 +EDGE3 880 881 -0.58923 11.9119 -0.203776 0.0191678 -0.00800863 0.13014 +EDGE3 881 882 -0.723155 12.0635 -0.112818 0.00700565 -0.0375723 0.154246 +EDGE3 882 883 -0.656861 12.152 0.00750553 0.00303905 -0.00254118 0.158492 +EDGE3 883 884 -0.778584 12.3151 -0.124851 -0.00716528 0.0210182 0.123722 +EDGE3 884 885 -0.886622 12.0711 -0.046487 -0.00714683 -0.0152155 0.0860002 +EDGE3 885 886 -0.774558 12.1531 -0.13755 -0.00730911 0.0256613 0.159071 +EDGE3 886 887 -0.646913 11.9812 -0.0578245 0.0220106 0.0453262 0.130622 +EDGE3 887 888 -0.862665 12.0598 -0.134801 -0.0102033 -0.0108392 0.13163 +EDGE3 888 889 -0.825993 12.0537 -0.0475197 0.0637299 -0.0171945 0.141465 +EDGE3 889 890 -0.783528 11.9474 -0.0401985 -0.00697926 -0.0167632 0.0827948 +EDGE3 890 891 -0.72636 12.1457 -0.172064 0.00786199 -0.0180467 0.110721 +EDGE3 891 892 -0.636433 12.2437 -0.0113698 -0.00619282 -0.0650527 0.0988323 +EDGE3 892 893 -0.883243 12.0078 -0.0537395 -0.00394482 -0.0407889 0.123224 +EDGE3 893 894 -0.741357 12.3913 -0.0770973 -0.00372312 0.0160375 0.10736 +EDGE3 894 895 -0.784783 12.0805 -0.140978 -0.0301552 0.0109459 0.149605 +EDGE3 895 896 -0.677119 12.1097 -0.194749 -0.0362648 -0.0419967 0.163679 +EDGE3 896 897 -0.686436 12.1398 -0.275661 -0.004902 0.00397047 0.197478 +EDGE3 897 898 -0.716522 12.2355 -0.0700259 -0.0691566 0.0386549 0.0954966 +EDGE3 898 899 -0.780579 11.951 -0.0563514 -0.00401373 0.0275071 0.149314 +EDGE3 899 900 -0.684515 12.2782 -0.0329125 -0.00990015 0.0264426 0.104344 +EDGE3 900 901 -0.810444 12.2319 -0.0659277 -0.000169738 -0.00983914 0.17002 +EDGE3 901 902 -0.815265 12.2327 -0.177169 -0.0204132 0.0105872 0.118563 +EDGE3 902 903 -0.812253 12.2449 -0.0819598 -0.0509856 -0.0268032 0.125356 +EDGE3 903 904 -0.835369 12.1473 -0.0695565 0.0253345 0.0152324 0.144658 +EDGE3 904 905 -0.723494 12.2123 -0.316082 -0.0280839 -0.019402 0.109898 +EDGE3 905 906 -0.68831 11.9487 0.000435407 0.030422 -0.0157061 0.11782 +EDGE3 906 907 -0.696601 12.1307 -0.190448 0.0481673 0.00260072 0.125452 +EDGE3 907 908 -0.680013 12.1329 -0.337967 0.0311842 0.0425776 0.151644 +EDGE3 908 909 -0.784191 12.1762 -0.195542 -0.0334178 0.00566662 0.133343 +EDGE3 909 910 -0.848076 12.0579 -0.297072 -0.0152558 0.0290907 0.105801 +EDGE3 910 911 -0.556112 12.104 -0.123092 0.00755576 -0.013093 0.0983882 +EDGE3 911 912 -0.835501 12.1023 0.0148817 -0.00697699 0.020446 0.105861 +EDGE3 912 913 -0.544022 12.2493 -0.0566269 0.00073424 -0.030655 0.11402 +EDGE3 913 914 -0.775706 12.1821 -0.253796 -0.0383812 -0.0240629 0.173704 +EDGE3 914 915 -0.772151 12.0979 -0.128805 0.0306251 -0.00822216 0.143357 +EDGE3 915 916 -0.726597 12.2193 -0.143278 0.0116003 0.0642104 0.123343 +EDGE3 916 917 -0.531344 12.2871 -0.234532 -0.0143685 -0.019085 0.158591 +EDGE3 917 918 -0.632429 12.3343 -0.150348 -0.00829013 -0.0186821 0.0991102 +EDGE3 918 919 -0.736976 12.3324 -0.253539 0.0666724 -0.0131432 0.112259 +EDGE3 919 920 -0.806298 12.1291 -0.104578 -0.00133974 0.0234099 0.093851 +EDGE3 920 921 -0.755241 12.273 -0.203616 0.0203431 0.00211243 0.156837 +EDGE3 921 922 -0.74127 12.2971 -0.0118481 0.0193089 -0.0253733 0.12345 +EDGE3 922 923 -0.792226 12.2143 -0.177647 -0.0174911 -0.0367932 0.168977 +EDGE3 923 924 -0.760733 12.1451 -0.267815 -0.015081 0.000973712 0.157705 +EDGE3 924 925 -0.770571 12.3439 -0.298049 -0.027788 0.00497538 0.119392 +EDGE3 925 926 -0.831669 12.2765 -0.0114447 0.0381671 -0.0053206 0.157376 +EDGE3 926 927 -0.866158 12.2497 -0.284571 0.0357926 -0.02924 0.161034 +EDGE3 927 928 -0.709464 12.3084 -0.173047 -0.0296195 -0.021156 0.125486 +EDGE3 928 929 -0.797004 12.3717 -0.0325491 -0.018157 0.017341 0.117049 +EDGE3 929 930 -0.631737 12.2908 -0.0362696 -0.010444 -0.00359219 0.155562 +EDGE3 930 931 -0.867702 12.3322 -0.116586 0.0423811 0.0229631 0.166948 +EDGE3 931 932 -0.772188 12.2295 -0.125337 0.01155 -0.0111061 0.12044 +EDGE3 932 933 -0.701517 12.2167 -0.0948382 0.0214928 0.0160242 0.0805813 +EDGE3 933 934 -0.671083 12.3393 -0.105229 0.0251512 -0.0197197 0.122603 +EDGE3 935 936 -0.768807 12.453 -0.0211649 0.00120655 0.00290915 0.0852832 +EDGE3 934 935 -0.932697 12.1915 -0.0483363 -0.0494348 0.0208588 0.130589 +EDGE3 937 938 -0.818838 12.2557 -0.0260403 -0.00692361 0.0331361 0.164103 +EDGE3 936 937 -0.817335 12.3918 -0.0764988 -0.0206066 0.0150018 0.0865452 +EDGE3 939 940 -0.902114 12.0891 -0.155462 -0.0341703 -0.00101813 0.115427 +EDGE3 938 939 -0.695052 12.2774 -0.158173 0.00232756 0.00429144 0.131076 +EDGE3 941 942 -0.605786 12.3235 -0.0211012 -0.0137308 0.00134488 0.142249 +EDGE3 940 941 -0.624621 12.3004 -0.16873 0.0135855 0.0239019 0.138063 +EDGE3 943 944 -0.618929 12.4169 -0.00908552 0.0276399 -0.00873477 0.117642 +EDGE3 942 943 -0.512801 12.2296 0.015682 0.00197144 0.0272809 0.109174 +EDGE3 945 946 -0.784871 12.3572 -0.188394 -0.00599221 -0.0144124 0.103471 +EDGE3 944 945 -0.795445 12.1095 -0.0678067 0.00542462 0.00230227 0.125306 +EDGE3 947 948 -0.827982 12.2142 -0.212925 0.00119153 0.025298 0.150139 +EDGE3 946 947 -0.652731 12.1527 -0.408477 -0.00622862 0.00935509 0.135019 +EDGE3 949 950 -0.854788 11.9969 -0.198278 0.00673434 0.036451 0.128129 +EDGE3 948 949 -0.716527 12.3319 -0.226126 0.028264 0.0651313 0.130979 +EDGE3 951 952 -0.68031 12.3753 -0.0154732 -0.0284807 -0.000782939 0.117897 +EDGE3 950 951 -0.760208 12.2798 -0.0851598 0.0606329 -0.0264887 0.0926776 +EDGE3 953 954 -0.82016 12.2662 -0.165759 -0.0100074 0.00548445 0.127921 +EDGE3 952 953 -0.857142 12.2694 -0.0366153 -0.0207386 0.0151242 0.148294 +EDGE3 955 956 -0.730325 12.1761 -0.215835 -0.00796853 -0.0100465 0.0944207 +EDGE3 954 955 -1.06855 12.414 -0.0159135 0.00741257 -0.0112472 0.138041 +EDGE3 957 958 -0.924797 12.3325 -0.29464 -0.0200971 -0.0163561 0.133858 +EDGE3 956 957 -0.840251 12.2534 -0.0605857 -0.0166428 0.0292487 0.100407 +EDGE3 959 960 -0.673839 12.3522 -0.0540179 -0.00368146 -0.00642344 0.149871 +EDGE3 958 959 -0.890572 12.3049 -0.0738878 0.0148263 0.00141786 0.149776 +EDGE3 961 962 -0.743323 12.5171 -0.255888 -0.0116075 0.00824523 0.184157 +EDGE3 960 961 -0.668838 12.3246 -0.187756 -0.0135488 0.0553892 0.144504 +EDGE3 963 964 -0.879538 12.4358 -0.142695 -0.0102119 -0.0258646 0.152962 +EDGE3 962 963 -0.621808 12.4563 -0.162884 -0.016232 -0.0127233 0.134937 +EDGE3 965 966 -0.89436 12.4375 -0.194219 -0.0421899 0.00207009 0.104813 +EDGE3 964 965 -0.837207 12.4484 -0.259812 -0.0395812 0.00677228 0.112721 +EDGE3 967 968 -0.831167 12.212 -0.203825 -0.00886314 -0.0290924 0.146539 +EDGE3 966 967 -0.743807 12.396 0.0171032 0.00436761 0.0428979 0.125092 +EDGE3 969 970 -0.882147 12.3404 -0.195925 0.0106351 0.0184583 0.150728 +EDGE3 968 969 -0.749005 12.3064 -0.0786516 -0.0279086 0.0196705 0.16171 +EDGE3 971 972 -0.593741 12.3109 -0.245133 0.00114195 -0.022784 0.127932 +EDGE3 970 971 -0.728467 12.4067 -0.037172 -0.0086391 0.0153284 0.13324 +EDGE3 973 974 -0.799276 12.3987 -0.069661 0.0313798 0.0142803 0.13439 +EDGE3 972 973 -0.899244 12.425 -0.13861 0.0131767 -0.0158468 0.119804 +EDGE3 975 976 -0.55343 12.5124 -0.209114 -0.0307383 0.0530055 0.12917 +EDGE3 974 975 -0.795531 12.5232 -0.11732 -0.0208296 0.0119754 0.14353 +EDGE3 977 978 -0.753021 12.2499 -0.152241 0.0260755 -0.0382892 0.176485 +EDGE3 976 977 -0.764614 12.5324 -0.00413744 -0.0129302 -0.00597653 0.136102 +EDGE3 979 980 -0.850845 12.4883 -0.139722 -0.0331608 -0.021345 0.129172 +EDGE3 978 979 -0.739118 12.2633 0.0275688 0.0318407 0.0150229 0.10233 +EDGE3 981 982 -0.953901 12.277 -0.308221 -0.00881291 0.012377 0.115896 +EDGE3 980 981 -0.771884 12.3306 -0.185693 -0.0125218 -0.0282315 0.14249 +EDGE3 983 984 -0.654837 12.2968 -0.247198 -0.0563104 -0.0243699 0.119513 +EDGE3 982 983 -0.777138 12.4338 -0.223396 -0.000681145 0.011324 0.127693 +EDGE3 985 986 -0.8113 12.5012 0.0576306 0.0134755 -0.0322337 0.132422 +EDGE3 984 985 -0.919598 12.4127 -0.254859 -0.00603206 0.0171533 0.172918 +EDGE3 987 988 -0.773409 12.2891 -0.0260586 0.0414523 0.00656872 0.0896918 +EDGE3 986 987 -0.740969 12.433 0.00683932 -0.0326555 0.0222159 0.134067 +EDGE3 989 990 -0.741325 12.3486 -0.144608 -0.0127338 0.0299149 0.12895 +EDGE3 988 989 -0.813187 12.4354 -0.0684864 -0.0188532 0.0443436 0.137879 +EDGE3 991 992 -0.806567 12.4337 -0.190982 0.0234849 0.0199472 0.087183 +EDGE3 990 991 -0.776819 12.3899 -0.162899 -0.00240002 0.0110967 0.133645 +EDGE3 993 994 -0.777737 12.558 -0.0168142 -0.0194726 0.0542417 0.109253 +EDGE3 992 993 -0.691569 12.3834 -0.312581 -0.00681118 0.0229237 0.0842752 +EDGE3 995 996 -0.713526 12.3547 -0.159192 0.0486005 0.0327949 0.0958806 +EDGE3 994 995 -0.753184 12.5707 -0.133179 -0.0152624 -0.00779516 0.150971 +EDGE3 997 998 -0.609292 12.432 -0.119188 0.0248267 0.0168224 0.13237 +EDGE3 996 997 -0.638763 12.4736 -0.283511 0.0548062 -0.0220283 0.170199 +EDGE3 998 999 -0.94129 12.621 -0.123122 -0.0231088 0.0101881 0.112475 +EDGE3 999 1000 -0.770355 12.5119 -0.0112162 -0.00362324 -0.00765399 0.149456 +EDGE3 1001 1002 -0.818004 12.3718 -0.0739948 0.0350102 0.0213367 0.139486 +EDGE3 1000 1001 -0.754289 12.4218 -0.0235324 -0.0143865 0.014946 0.133153 +EDGE3 1003 1004 -0.628151 12.7001 0.099821 -0.0544134 -0.0188109 0.111529 +EDGE3 1002 1003 -0.780939 12.4841 -0.222558 -0.0186912 -0.0265403 0.153187 +EDGE3 1005 1006 -0.685569 12.4991 -0.17753 0.014353 0.0213487 0.157336 +EDGE3 1004 1005 -0.774782 12.361 -0.123567 0.0136591 0.00500777 0.137322 +EDGE3 1007 1008 -0.678872 12.4765 -0.101926 0.0208593 0.00682785 0.150527 +EDGE3 1006 1007 -0.855423 12.4642 -0.155348 -0.0127244 0.0221665 0.117101 +EDGE3 1009 1010 -0.792503 12.4501 -0.230941 0.057893 0.00381654 0.111096 +EDGE3 1008 1009 -0.752591 12.2735 -0.231635 0.000390032 0.0287599 0.142325 +EDGE3 1011 1012 -0.767666 12.462 -0.210168 0.0308723 -0.0720105 0.0978262 +EDGE3 1010 1011 -0.686065 12.5991 -0.110267 0.00147787 0.0210146 0.159407 +EDGE3 1013 1014 -0.776654 12.5145 -0.0180128 0.0183683 0.0180729 0.0909042 +EDGE3 1012 1013 -0.72987 12.498 -0.455596 0.0550661 -0.0342372 0.101391 +EDGE3 1015 1016 -0.801317 12.334 -0.0574876 0.00245043 0.0240828 0.141272 +EDGE3 1014 1015 -0.653216 12.6133 -0.119983 -0.0098045 0.0182495 0.118618 +EDGE3 1017 1018 -0.730502 12.3266 -0.041379 0.0397401 0.00331037 0.122346 +EDGE3 1016 1017 -0.662213 12.5072 -0.192535 -0.0309323 -0.0439541 0.177429 +EDGE3 1019 1020 -0.79374 12.4242 -0.184693 -0.00955902 -0.00038612 0.1024 +EDGE3 1018 1019 -0.745691 12.5231 -0.179064 0.0031453 0.0157125 0.115233 +EDGE3 1021 1022 -0.771216 12.563 -0.21576 0.0177217 0.00799737 0.170896 +EDGE3 1020 1021 -0.822661 12.3176 -0.10949 0.0133385 0.0333913 0.171937 +EDGE3 1023 1024 -0.624188 12.5846 -0.139115 -0.031795 0.0153855 0.0986369 +EDGE3 1022 1023 -0.672843 12.5216 -0.0840654 0.0490084 -0.0248084 0.131441 +EDGE3 1025 1026 -0.908039 12.4056 -0.128283 -0.00035526 -0.00737729 0.154627 +EDGE3 1024 1025 -0.909052 12.363 -0.286727 -0.0169572 -0.000294458 0.103581 +EDGE3 1027 1028 -0.821987 12.6213 -0.126123 -0.00128162 -0.0199038 0.134766 +EDGE3 1026 1027 -0.734965 12.4168 -0.0464078 -0.0130175 -0.0129324 0.183371 +EDGE3 1029 1030 -0.723338 12.4691 -0.191035 -0.0501349 -0.00509426 0.0905996 +EDGE3 1028 1029 -0.889808 12.4777 0.0410057 -0.0371751 -0.0150807 0.118381 +EDGE3 1030 1031 -0.731658 12.6184 -0.208084 -0.0503483 0.00697068 0.0970263 +EDGE3 1031 1032 -0.781821 12.5399 -0.150645 0.01668 -0.0105589 0.0898273 +EDGE3 1032 1033 -0.837034 12.3004 -0.118316 0.0058053 0.0040919 0.0992607 +EDGE3 1033 1034 -0.747228 12.5607 -0.240128 -0.0411953 -0.0193755 0.159705 +EDGE3 1034 1035 -0.815566 12.5947 -0.182688 -0.0194676 0.0296271 0.149699 +EDGE3 1035 1036 -0.693142 12.498 -0.104325 -0.0514158 -0.0140275 0.122265 +EDGE3 1036 1037 -0.762587 12.325 -0.0843814 0.041794 0.0231222 0.130226 +EDGE3 1037 1038 -0.747134 12.4408 -0.0717559 -0.0572477 0.0275566 0.123142 +EDGE3 1038 1039 -0.651832 12.5975 -0.111613 0.0354207 -0.0324765 0.145073 +EDGE3 1039 1040 -0.782276 12.5773 -0.247266 -0.011791 -0.0110472 0.104183 +EDGE3 1040 1041 -0.7945 12.4415 0.00714978 0.0175498 0.012309 0.0891308 +EDGE3 1041 1042 -0.531202 12.3911 -0.111094 -0.0356944 0.0269212 0.117978 +EDGE3 1042 1043 -0.726103 12.3322 -0.0656701 0.00191577 -0.0315541 0.144546 +EDGE3 1043 1044 -0.731681 12.5301 -0.0589063 -0.04129 -0.0366536 0.08393 +EDGE3 1044 1045 -0.882057 12.6495 -0.140599 0.0161681 0.00599155 0.143304 +EDGE3 1045 1046 -0.638213 12.3644 -0.188435 0.00399867 -0.00310412 0.0983785 +EDGE3 1046 1047 -0.605123 12.4468 -0.0798453 0.040033 -0.0539916 0.109847 +EDGE3 1047 1048 -0.890712 12.6131 -0.17422 0.0547023 -0.041738 0.133018 +EDGE3 1048 1049 -0.753494 12.5052 -0.054073 0.00392159 0.0258411 0.11469 +EDGE3 1049 1050 -0.828331 12.5565 -0.047078 -0.00846573 0.0188966 0.143595 +EDGE3 1050 1051 -0.715009 12.4392 -0.10279 0.0250455 -0.00628338 0.107394 +EDGE3 1051 1052 -0.435144 12.5755 -0.252303 -0.0169955 -0.0366715 0.140231 +EDGE3 1052 1053 -0.732725 12.7205 -0.197998 0.0149291 0.00505819 0.108381 +EDGE3 1053 1054 -0.879687 12.4814 -0.155387 0.0234694 0.0228448 0.174477 +EDGE3 1054 1055 -0.785634 12.4901 -0.275353 0.00910175 -0.0214037 0.108947 +EDGE3 1055 1056 -0.728128 12.3562 -0.056325 -0.000285393 0.0250425 0.103778 +EDGE3 1056 1057 -0.69518 12.7271 0.0461303 -0.0216063 0.00920557 0.138244 +EDGE3 1057 1058 -0.631501 12.6392 -0.241629 0.0224738 -0.0468653 0.0983846 +EDGE3 1058 1059 -0.850292 12.6121 -0.192422 -0.0190627 0.0549652 0.0806549 +EDGE3 1059 1060 -0.740747 12.4755 -0.112769 0.003535 0.0491866 0.135885 +EDGE3 1060 1061 -0.740349 12.4733 -0.265983 -0.0220753 -0.00305963 0.13946 +EDGE3 1061 1062 -0.720855 12.618 -0.107745 0.0213858 -0.0169565 0.152976 +EDGE3 1062 1063 -0.590413 12.5931 -0.0986973 -0.0118397 0.0252493 0.106009 +EDGE3 1063 1064 -0.795179 12.3691 -0.0384184 -0.0352546 -0.00972836 0.137016 +EDGE3 1064 1065 -0.686523 12.4968 -0.104686 0.0217138 0.00692024 0.142748 +EDGE3 1065 1066 -0.798703 12.6303 -0.0217108 0.00554084 -0.056043 0.125246 +EDGE3 1066 1067 -0.831702 12.4412 -0.0811123 0.0410297 0.0128999 0.111193 +EDGE3 1067 1068 -1.04225 12.5657 -0.0694902 0.0116373 0.0549997 0.13377 +EDGE3 1068 1069 -0.990176 12.4967 -0.145739 0.0312609 0.0170363 0.106247 +EDGE3 1069 1070 -0.816414 12.6942 -0.0752947 0.0297632 0.0150448 0.151402 +EDGE3 1070 1071 -0.681553 12.4263 -0.0945759 -0.0175128 0.0252157 0.121203 +EDGE3 1071 1072 -0.703745 12.4857 -0.0767908 -0.00293553 0.0330753 0.0973052 +EDGE3 1072 1073 -0.839586 12.5044 -0.0280504 0.0528131 -0.0192426 0.0787383 +EDGE3 1073 1074 -0.924749 12.6256 -0.174491 0.0321006 -0.00313833 0.122073 +EDGE3 1074 1075 -0.765064 12.5144 0.0606124 0.0016112 -0.0353892 0.112808 +EDGE3 1075 1076 -0.787592 12.6311 -0.0778356 0.0331455 -0.0205273 0.140018 +EDGE3 1076 1077 -0.990849 12.6374 -0.229828 -0.000105282 -0.0273064 0.125833 +EDGE3 1077 1078 -0.801727 12.5354 0.0265144 0.0116702 -0.0139968 0.115083 +EDGE3 1078 1079 -0.623978 12.6615 -0.0939149 0.00704453 0.0318289 0.128861 +EDGE3 1079 1080 -0.756447 12.4542 -0.234464 -0.0319813 -0.0046501 0.120837 +EDGE3 1080 1081 -0.79652 12.4158 -0.115873 0.0177111 -0.0286509 0.13282 +EDGE3 1081 1082 -0.789525 12.4921 -0.206165 -0.0250937 -0.00800609 0.109927 +EDGE3 1082 1083 -0.833059 12.4333 -0.117314 0.0200546 0.00925566 0.099367 +EDGE3 1083 1084 -0.591853 12.3595 -0.0383181 -0.0029524 -0.0264318 0.123433 +EDGE3 1084 1085 -0.926778 12.6015 -0.224136 -0.0197319 0.00898412 0.126695 +EDGE3 1085 1086 -0.733089 12.3599 -0.106224 0.00546669 0.0245284 0.0991958 +EDGE3 1086 1087 -0.65631 12.6264 -0.150219 -0.014264 0.0470751 0.175067 +EDGE3 1087 1088 -0.465686 12.51 -0.119103 -0.00349824 -0.0307427 0.146987 +EDGE3 1088 1089 -0.933717 12.5656 0.109646 0.000632387 -0.0219584 0.107281 +EDGE3 1089 1090 -0.724227 12.5217 -0.234716 -0.0165076 -0.00572283 0.104309 +EDGE3 1090 1091 -0.717197 12.459 0.0821954 -0.0463596 -0.00898305 0.134268 +EDGE3 1091 1092 -0.969065 12.382 0.0296537 0.032643 -0.0516508 0.0982767 +EDGE3 1092 1093 -0.753424 12.6136 -0.0494608 -0.00204066 -0.00417727 0.0825469 +EDGE3 1093 1094 -0.797022 12.417 -0.14165 -0.00811949 -0.00552145 0.12937 +EDGE3 1094 1095 -1.01685 12.4773 -0.120251 0.0270233 0.00541681 0.0889332 +EDGE3 1095 1096 -0.857953 12.2914 -0.275835 -0.0122648 0.00764989 0.143949 +EDGE3 1096 1097 -0.68087 12.3926 -0.0729806 0.0239692 -0.0142844 0.141829 +EDGE3 1097 1098 -0.919982 12.4827 0.00187034 -0.00210643 0.0221727 0.111072 +EDGE3 1098 1099 -0.825996 12.6881 -0.165042 -0.0173384 -0.00451508 0.124043 +EDGE3 1099 1100 -0.858915 12.3649 -0.0271965 0.026845 -9.85807e-06 0.147287 +EDGE3 1100 1101 -0.772153 12.4102 -0.0623332 0.01447 0.0341856 0.169474 +EDGE3 1101 1102 -0.785761 12.6024 -0.144963 0.0479966 -0.00147985 0.120885 +EDGE3 1102 1103 -0.85271 12.2782 -0.00494598 -0.00622242 -0.0132988 0.139948 +EDGE3 1103 1104 -0.833367 12.6336 -0.281304 -0.0128805 0.01025 0.135782 +EDGE3 1104 1105 -0.755286 12.4609 -0.413721 -0.0191708 0.00827125 0.110034 +EDGE3 1105 1106 -0.742074 12.4623 -0.187391 0.00432955 0.00521205 0.135643 +EDGE3 1106 1107 -0.862454 12.5147 -0.116846 -0.0165442 0.0068695 0.181068 +EDGE3 1107 1108 -0.78334 12.3555 -0.0776388 -0.0543136 0.0258084 0.132024 +EDGE3 1108 1109 -0.823323 12.5004 0.0437409 -0.0214253 -0.0111727 0.110166 +EDGE3 1109 1110 -0.808854 12.3671 0.00198705 0.00623536 -0.0321668 0.120863 +EDGE3 1110 1111 -0.635779 12.5323 -0.115266 -0.0188159 0.0302042 0.110546 +EDGE3 1111 1112 -0.809074 12.719 0.0116912 0.00497934 -0.0211418 0.100699 +EDGE3 1112 1113 -0.71939 12.4927 -0.0315646 0.0135474 -0.0119496 0.147188 +EDGE3 1113 1114 -0.754315 12.4959 -0.264231 -0.00259993 0.00913415 0.17253 +EDGE3 1114 1115 -0.668579 12.5126 -0.107317 -0.000723847 0.00695196 0.151462 +EDGE3 1115 1116 -0.897525 12.6723 -0.102936 -0.0535634 0.0413187 0.16023 +EDGE3 1116 1117 -0.794323 12.522 -0.253217 0.00323741 -0.0335356 0.126145 +EDGE3 1117 1118 -0.651032 12.6022 -0.101413 0.0120751 -0.0270611 0.113199 +EDGE3 1118 1119 -0.776478 12.4911 -0.136575 0.0101979 -0.0253755 0.11864 +EDGE3 1119 1120 -0.733726 12.5121 -0.0102805 0.0117753 0.00405281 0.136651 +EDGE3 1120 1121 -0.911914 12.4526 -0.0131908 -0.0284082 -0.00875204 0.155088 +EDGE3 1121 1122 -0.860829 12.526 -0.0683573 0.0443302 -0.0218693 0.120775 +EDGE3 1122 1123 -0.721918 12.6046 -0.21373 0.0159194 -0.036437 0.121023 +EDGE3 1123 1124 -0.868351 12.5978 -0.139496 0.0167591 -0.0152655 0.108223 +EDGE3 1124 1125 -0.796384 12.5513 -0.131221 -0.0107527 -0.0111349 0.10225 +EDGE3 1125 1126 -0.788196 12.6125 -0.161816 -0.00315955 -0.0304467 0.151397 +EDGE3 1126 1127 -0.778603 12.6598 -0.0754588 0.0240203 -0.0124679 0.130594 +EDGE3 1127 1128 -0.908567 12.2984 0.00491043 0.0416383 -0.00636808 0.151772 +EDGE3 1128 1129 -0.855732 12.3899 -0.0698179 0.00811709 -0.0145261 0.118269 +EDGE3 1129 1130 -0.804651 12.3467 -0.0617064 0.0101954 -0.0255771 0.13636 +EDGE3 1130 1131 -0.710992 12.5994 -0.119558 0.0260809 0.0359178 0.136332 +EDGE3 1131 1132 -0.847771 12.4472 -0.156954 0.0229275 -0.00185368 0.111874 +EDGE3 1132 1133 -0.811202 12.3886 -0.387482 -0.00942735 -0.00132775 0.139869 +EDGE3 1133 1134 -0.7869 12.5172 -0.177601 0.0392972 -0.0149341 0.149887 +EDGE3 1134 1135 -0.817702 12.4248 -0.304638 -0.0380489 0.0133559 0.130093 +EDGE3 1135 1136 -0.58445 12.4536 -0.119818 0.0378513 0.0410753 0.110431 +EDGE3 1136 1137 -0.664822 12.5267 0.0231428 -0.0692308 0.00138725 0.133613 +EDGE3 1137 1138 -0.857431 12.5357 -0.150121 0.00397956 0.0181406 0.133225 +EDGE3 1138 1139 -0.888336 12.6292 -0.195213 0.00478887 0.0442317 0.140915 +EDGE3 1139 1140 -0.744867 12.3339 -0.00465638 0.00222677 0.00215427 0.121159 +EDGE3 1140 1141 -0.991314 12.5563 -0.023335 0.0144567 0.0117237 0.0927539 +EDGE3 1141 1142 -0.671108 12.5083 0.256103 -0.0434176 -0.0150734 0.117063 +EDGE3 1142 1143 -0.819006 12.5513 -0.260452 -0.0062211 0.0121409 0.129258 +EDGE3 1143 1144 -0.731941 12.5975 -0.163325 0.00906185 -0.0334905 0.138091 +EDGE3 1144 1145 -0.691764 12.5525 -0.250085 -0.04127 -0.0192603 0.116049 +EDGE3 1145 1146 -0.803703 12.4888 -0.195616 0.0063526 -0.00146383 0.11134 +EDGE3 1146 1147 -0.639592 12.6042 -0.236119 0.0319318 -0.0400727 0.187501 +EDGE3 1147 1148 -0.802389 12.6576 -0.223571 -0.0265324 -0.00120531 0.108159 +EDGE3 1148 1149 -0.749546 12.4741 -0.0879908 0.0367422 -0.0185836 0.145177 +EDGE3 1149 1150 -0.716935 12.6437 -0.209265 0.00281375 -0.0154812 0.113142 +EDGE3 1150 1151 -0.936019 12.3328 -0.221051 -0.0108293 -0.00789023 0.136028 +EDGE3 1151 1152 -0.73303 12.5943 -0.257879 0.00277937 -0.00838823 0.121128 +EDGE3 1152 1153 -0.849206 12.321 -0.0738153 0.00945629 0.0254735 0.126482 +EDGE3 1153 1154 -0.749741 12.492 0.0892094 -0.0387141 0.0225577 0.0938238 +EDGE3 1154 1155 -0.600096 12.5758 -0.143537 -0.00152963 0.0345001 0.102382 +EDGE3 1155 1156 -0.913824 12.6864 -0.377033 0.0427868 0.011256 0.108045 +EDGE3 1156 1157 -0.988468 12.405 -0.0783507 0.00347449 -0.000151338 0.127965 +EDGE3 1157 1158 -0.927428 12.4531 -0.0233127 -0.0322861 0.0239156 0.102982 +EDGE3 1158 1159 -0.797129 12.6712 -0.119019 -0.018228 -0.0115119 0.118505 +EDGE3 1159 1160 -0.84417 12.5614 -0.10585 -0.00954048 0.00478953 0.0926699 +EDGE3 1160 1161 -0.817871 12.5965 -0.0861484 0.0216967 -0.0320851 0.1156 +EDGE3 1161 1162 -0.735517 12.4585 -0.00154843 0.030331 0.00141573 0.113914 +EDGE3 1162 1163 -0.789226 12.3998 -0.302286 -0.0173661 0.0348246 0.067842 +EDGE3 1163 1164 -0.633133 12.4845 -0.146209 -0.0364115 -0.00340375 0.098432 +EDGE3 1164 1165 -0.7876 12.5508 -0.0393589 -0.0241999 0.00561999 0.132963 +EDGE3 1165 1166 -0.823789 12.5912 -0.0435388 0.0022122 0.033123 0.118373 +EDGE3 1166 1167 -0.930948 12.4261 -0.191883 -0.041044 -0.0116811 0.132732 +EDGE3 1167 1168 -0.763355 12.4847 -0.0787949 0.00776993 -0.0122851 0.103003 +EDGE3 1168 1169 -0.856148 12.3922 -0.204437 0.039647 0.020311 0.145123 +EDGE3 1169 1170 -0.785115 12.4417 -0.118671 -0.00472596 0.0293514 0.127414 +EDGE3 1170 1171 -0.748856 12.404 -0.242712 -0.0206827 0.0304359 0.135246 +EDGE3 1171 1172 -0.8625 12.4146 0.0104258 -0.0246914 0.03911 0.150619 +EDGE3 1172 1173 -0.790135 12.713 -0.0729537 -0.0111894 -0.0492399 0.119697 +EDGE3 1173 1174 -0.89193 12.402 -0.238788 -0.0147997 0.016507 0.153249 +EDGE3 1174 1175 -0.735006 12.531 -0.110458 0.0296792 -0.00687659 0.121304 +EDGE3 1175 1176 -0.722321 12.5275 0.0300987 0.0172517 0.0205361 0.174112 +EDGE3 1176 1177 -0.782931 12.5222 -0.0501092 0.0172428 -0.00397769 0.161583 +EDGE3 1177 1178 -0.693008 12.5711 -0.21346 0.0127482 0.018479 0.0959852 +EDGE3 1178 1179 -0.766151 12.4991 -0.00995519 -0.0468468 0.0301627 0.121027 +EDGE3 1179 1180 -0.751762 12.3618 -0.19722 0.0152374 0.0128254 0.129581 +EDGE3 1180 1181 -0.657175 12.4211 -0.139112 -0.0208983 -0.00754057 0.102347 +EDGE3 1181 1182 -0.77584 12.4945 -0.102264 0.0321366 -0.0081119 0.115284 +EDGE3 1182 1183 -0.783642 12.5516 -0.18892 -0.00945349 -0.0141636 0.100705 +EDGE3 1183 1184 -0.677123 12.4139 -0.0848239 -0.0138487 -0.00531698 0.151948 +EDGE3 1184 1185 -0.776482 12.4234 -0.33341 -0.012839 -0.00574343 0.145001 +EDGE3 1185 1186 -0.850756 12.3156 -0.1402 0.0632415 -0.000272199 0.0819622 +EDGE3 1186 1187 -0.957324 12.3395 -0.230737 -0.0174201 0.041367 0.146066 +EDGE3 1187 1188 -0.796333 12.3511 -0.41599 0.0159921 -0.00975515 0.129375 +EDGE3 1188 1189 -0.852928 12.3758 -0.207563 -0.0508036 0.0176112 0.141099 +EDGE3 1189 1190 -0.872272 12.3317 -0.0503095 0.00894568 0.00144999 0.0699763 +EDGE3 1190 1191 -0.544967 12.3648 -0.114126 0.0213397 0.0177479 0.147981 +EDGE3 1191 1192 -0.776307 12.5664 -0.121353 0.0113748 0.0147404 0.0756688 +EDGE3 1192 1193 -0.702309 12.3447 -0.013556 -0.00781213 -0.00893891 0.11442 +EDGE3 1193 1194 -0.69813 12.538 -0.0611002 -0.0190521 -0.0083518 0.0688788 +EDGE3 1194 1195 -0.853062 12.4697 0.037131 -0.0038554 -0.0376803 0.146687 +EDGE3 1196 1197 -0.861133 12.4181 -0.0545411 -0.0424741 -0.00911003 0.129386 +EDGE3 1195 1196 -0.712554 12.422 -0.159236 0.0155645 -0.00482563 0.180342 +EDGE3 1198 1199 -0.845607 12.3727 -0.0574562 -0.00190775 -0.0233758 0.160973 +EDGE3 1197 1198 -0.751045 12.6032 -0.267506 -0.00851468 -0.00832336 0.121196 +EDGE3 1200 1201 -0.80668 12.4819 -0.228459 -0.0141935 -0.0174682 0.148114 +EDGE3 1199 1200 -0.902277 12.4033 -0.0312846 0.021594 -0.0217372 0.102764 +EDGE3 1202 1203 -0.722074 12.3318 -0.145612 -0.00995298 -0.00089475 0.115223 +EDGE3 1201 1202 -0.667427 12.4091 -0.26436 -0.0242534 0.0314238 0.155284 +EDGE3 1204 1205 -0.673241 12.3767 -0.0468558 0.0301398 -0.0108884 0.140457 +EDGE3 1203 1204 -0.678486 12.4176 -0.119364 -0.0130957 -0.0157687 0.129614 +EDGE3 1206 1207 -0.886947 12.4257 -0.225643 -0.0124275 -0.00630303 0.127085 +EDGE3 1205 1206 -1.02723 12.4637 -0.385809 0.00157578 -0.0232944 0.141481 +EDGE3 1208 1209 -0.988785 12.3833 -0.213264 0.0404305 -0.000324879 0.153387 +EDGE3 1207 1208 -0.710404 12.3052 -0.0545979 0.0142867 -0.0143264 0.0995945 +EDGE3 1210 1211 -0.861428 12.2404 -0.0238624 -0.0172973 -0.0103933 0.111399 +EDGE3 1209 1210 -0.783643 12.4919 -0.0648402 -0.0516596 -0.0146461 0.123738 +EDGE3 1212 1213 -0.839693 12.3961 -0.0604631 0.00889217 0.0288303 0.138794 +EDGE3 1211 1212 -0.822085 12.2858 -0.131934 -0.0291164 -0.00326437 0.155672 +EDGE3 1214 1215 -0.702483 12.3166 -0.125061 0.00479767 -0.0241418 0.140614 +EDGE3 1213 1214 -0.681827 12.4016 -0.222287 0.00547444 0.0294125 0.132737 +EDGE3 1216 1217 -0.716699 12.4926 -0.143158 -0.00327405 0.0034653 0.140385 +EDGE3 1215 1216 -0.843242 12.309 -0.0763986 -0.0307148 -0.0130668 0.119268 +EDGE3 1218 1219 -0.772705 12.4024 -0.215492 -0.000352322 -0.0174578 0.119366 +EDGE3 1217 1218 -0.756967 12.3564 -0.144785 -0.0236129 -0.00347629 0.107003 +EDGE3 1220 1221 -0.700779 12.3706 -0.126685 0.00379263 0.0144208 0.0943649 +EDGE3 1219 1220 -0.808667 12.1974 0.0570679 -0.00311913 -0.0461368 0.146269 +EDGE3 1222 1223 -0.670966 12.2531 -0.171491 -0.00374155 -0.00412058 0.116419 +EDGE3 1221 1222 -0.866031 12.2959 -0.33312 0.0434942 -0.0262303 0.142853 +EDGE3 1224 1225 -0.884302 12.2937 -0.123316 -0.0295333 0.0473116 0.160529 +EDGE3 1223 1224 -0.8776 12.3149 -0.11356 -0.00221338 0.0139828 0.14119 +EDGE3 1226 1227 -0.806892 12.3633 -0.0123984 -0.000127234 -0.00349064 0.136879 +EDGE3 1225 1226 -0.79282 12.4909 -0.0899478 -0.0276372 0.0299006 0.149449 +EDGE3 1227 1228 -0.860151 12.2867 -0.0184986 0.0523384 0.0162535 0.119475 +EDGE3 1228 1229 -0.790172 12.4609 0.0899135 0.0171633 0.0432199 0.14999 +EDGE3 1230 1231 -0.816158 12.4524 -0.131123 -0.00996922 -0.00380826 0.140953 +EDGE3 1229 1230 -1.00305 12.4599 0.154766 -0.00802493 -0.00614235 0.139232 +EDGE3 1232 1233 -0.719502 12.2225 -0.217832 0.0370142 -0.0253072 0.133426 +EDGE3 1231 1232 -1.00965 12.2733 -0.107555 0.0323453 -0.0424615 0.111498 +EDGE3 1234 1235 -0.697948 12.2642 -0.0589788 -0.0205887 0.0121659 0.121964 +EDGE3 1233 1234 -0.813467 12.4608 -0.151524 0.00478477 0.0129009 0.0786574 +EDGE3 1236 1237 -0.762126 12.4229 -0.169406 -0.0393205 0.0167299 0.13461 +EDGE3 1235 1236 -0.748305 12.3458 -0.173462 0.0117476 -0.0119367 0.155289 +EDGE3 1238 1239 -0.862671 12.3948 -0.0546003 0.00415348 -0.00257711 0.0974128 +EDGE3 1237 1238 -0.743788 12.3236 -0.00411578 0.0306769 0.0132594 0.105509 +EDGE3 1239 1240 -0.803885 12.2117 -0.0834363 -0.0162548 0.0242856 0.0989188 +EDGE3 1240 1241 -0.812326 12.4017 -0.0437063 -0.0292471 -0.0252176 0.148336 +EDGE3 1242 1243 -0.781459 12.3264 -0.023355 -0.00608859 0.0493463 0.17668 +EDGE3 1241 1242 -0.852638 12.3511 -0.206032 -0.00610804 0.00874669 0.119898 +EDGE3 1244 1245 -0.950813 12.2909 -0.0740868 -0.00962383 0.0124166 0.11645 +EDGE3 1243 1244 -0.680246 12.4943 -0.0766248 -0.0139339 -0.0344716 0.101515 +EDGE3 1246 1247 -0.938563 12.3153 -0.176809 -0.0197283 0.00691395 0.131552 +EDGE3 1245 1246 -0.969925 12.1355 -0.121222 -0.020854 -0.0310131 0.128255 +EDGE3 1248 1249 -0.836884 12.3692 -0.138954 -0.0195941 -0.0215527 0.0946925 +EDGE3 1247 1248 -0.80511 12.219 -0.171564 0.00259103 0.0230244 0.145368 +EDGE3 1250 1251 -0.769846 12.3328 -0.254269 -0.00867739 0.0274762 0.136517 +EDGE3 1249 1250 -0.606475 12.2878 -0.157212 0.00851567 0.0406143 0.117254 +EDGE3 1252 1253 -0.723394 12.2781 -0.313188 -0.00642307 0.00325152 0.13004 +EDGE3 1251 1252 -0.931364 12.3285 -0.147633 0.0030453 0.00426807 0.113662 +EDGE3 1254 1255 -0.765652 12.2466 -0.166886 -0.0101955 -0.00618195 0.143135 +EDGE3 1253 1254 -0.691007 12.2354 -0.143707 -0.010361 -0.0102161 0.130414 +EDGE3 1256 1257 -0.858177 12.2573 -0.158425 0.0356095 0.0571238 0.16801 +EDGE3 1255 1256 -0.796502 12.4437 -0.0130356 -0.00527113 -0.0106525 0.132048 +EDGE3 1258 1259 -0.737669 12.4091 -0.180379 0.0176887 0.0341503 0.127268 +EDGE3 1257 1258 -0.746751 12.1851 -0.136577 0.000548884 0.0164011 0.111759 +EDGE3 1260 1261 -0.799662 12.2056 -0.201153 0.0245346 -0.0393064 0.116588 +EDGE3 1259 1260 -0.614564 12.4215 -0.067711 -0.0181053 0.023508 0.137064 +EDGE3 1262 1263 -0.79533 12.2346 -0.126395 0.0131611 0.00959128 0.132933 +EDGE3 1261 1262 -0.806833 12.3519 -0.0439146 0.0291913 0.00446906 0.113079 +EDGE3 1264 1265 -0.76675 12.4134 -0.231076 0.0237018 0.0183025 0.143347 +EDGE3 1263 1264 -0.759006 12.2137 -0.0116762 -0.0583745 -0.0163062 0.142273 +EDGE3 1266 1267 -0.891209 12.2678 -0.063428 0.0299251 -0.000640529 0.137764 +EDGE3 1265 1266 -0.766429 12.2505 -0.192683 0.0114053 -0.013732 0.163833 +EDGE3 1268 1269 -0.650854 12.2238 -0.0875825 -0.022698 -0.00379764 0.170215 +EDGE3 1267 1268 -0.819702 12.4449 -0.098448 0.0659571 -0.0073964 0.0715519 +EDGE3 1270 1271 -0.84125 12.3193 -0.160556 -0.0136565 0.0183058 0.101217 +EDGE3 1269 1270 -0.735243 12.3631 -0.058338 0.00676789 -0.0469137 0.129961 +EDGE3 1271 1272 -0.591237 12.3282 -0.0865608 -0.00471564 -0.00318567 0.132424 +EDGE3 1272 1273 -0.769951 12.3133 -0.282971 0.0112926 -0.0473084 0.103424 +EDGE3 1273 1274 -0.883183 12.2623 -0.0518669 0.0231263 -0.0169026 0.145245 +EDGE3 1275 1276 -0.828858 12.1287 -0.265766 0.012077 0.0262825 0.121718 +EDGE3 1274 1275 -0.988851 12.212 -0.0670057 0.0367974 0.00325669 0.141122 +EDGE3 1277 1278 -0.784786 12.3763 -0.172246 -0.0227695 0.00810399 0.140919 +EDGE3 1276 1277 -0.74237 12.1641 -0.208523 -0.0538659 0.0235538 0.130633 +EDGE3 1279 1280 -0.888104 12.1118 -0.0185607 0.025373 0.00235985 0.0836864 +EDGE3 1278 1279 -0.929166 12.3988 -0.1247 0.031497 -0.0455582 0.137022 +EDGE3 1281 1282 -0.664597 12.0971 -0.0167583 0.00360117 0.0163293 0.112967 +EDGE3 1280 1281 -0.868137 12.331 -0.170373 0.0158178 -0.023355 0.128839 +EDGE3 1283 1284 -0.626211 12.1559 -0.145243 0.0197651 -0.0227788 0.139504 +EDGE3 1282 1283 -0.797237 12.2269 -0.0686978 -0.00518878 0.0229453 0.158277 +EDGE3 1285 1286 -0.907458 12.0382 -0.191678 -0.0129944 0.0302146 0.0955465 +EDGE3 1284 1285 -0.823607 12.0479 -0.0809862 0.040098 0.0265536 0.16812 +EDGE3 1287 1288 -0.919614 12.3106 0.217546 -0.011072 -0.0351878 0.0939521 +EDGE3 1286 1287 -0.789442 12.2897 -0.207579 -0.00652209 -0.0118296 0.127173 +EDGE3 1289 1290 -0.759629 12.3178 -0.120001 0.0446145 0.0562033 0.130228 +EDGE3 1288 1289 -0.955676 12.36 -0.0875679 -0.0169318 0.00885564 0.147673 +EDGE3 1291 1292 -0.92057 12.3099 -0.239487 0.0049801 -0.00611858 0.184877 +EDGE3 1290 1291 -0.801111 12.2154 -0.394202 0.0120607 0.00158057 0.0941174 +EDGE3 1293 1294 -0.781873 12.1643 -0.0925599 0.0117655 -0.0156562 0.151304 +EDGE3 1292 1293 -0.758101 12.1323 0.018594 -0.0291584 -0.00468972 0.12606 +EDGE3 1295 1296 -0.793388 12.0793 -0.185524 0.012752 0.0232685 0.134681 +EDGE3 1294 1295 -0.742573 11.9303 -0.184643 -0.0320537 -0.00670904 0.114304 +EDGE3 1297 1298 -0.754169 12.0977 -0.320613 -0.0070434 0.010235 0.136003 +EDGE3 1296 1297 -0.67201 12.3085 -0.200004 -0.0484806 -0.0325451 0.128451 +EDGE3 1299 1300 -0.73058 12.1956 -0.202637 -0.0108407 0.0698999 0.116711 +EDGE3 1298 1299 -0.789573 12.2183 -0.208253 -0.00430319 0.0225841 0.089825 +EDGE3 1301 1302 -0.945178 12.156 -0.134329 0.0289662 0.0106269 0.133167 +EDGE3 1300 1301 -0.882569 12.034 -0.024424 0.0123463 0.0250567 0.112304 +EDGE3 1303 1304 -0.836201 12.2291 -0.264556 0.0152187 0.0330022 0.124654 +EDGE3 1302 1303 -0.730557 11.9861 -0.227482 0.0291296 0.01263 0.100409 +EDGE3 1304 1305 -0.702553 12.1394 -0.184521 0.0227313 -0.0109202 0.139177 +EDGE3 1305 1306 -0.791688 12.1324 0.106315 -0.0095733 -0.0272333 0.102289 +EDGE3 1306 1307 -0.935688 12.0418 -0.00694845 -0.00253757 0.0130594 0.125389 +EDGE3 1307 1308 -0.713379 12.1097 -0.138882 0.0213719 0.0228486 0.117072 +EDGE3 1308 1309 -0.966686 12.1262 0.0341837 -0.047567 -0.0139987 0.108238 +EDGE3 1309 1310 -0.811815 12.0413 -0.195317 0.0228135 0.0030112 0.112337 +EDGE3 1310 1311 -0.982287 12.2707 -0.017432 -0.00365071 0.0165951 0.138207 +EDGE3 1311 1312 -0.983701 11.9804 0.145028 0.00343086 -0.00797887 0.115199 +EDGE3 1312 1313 -0.825672 12.0367 0.0275205 -0.000468846 0.0127843 0.123156 +EDGE3 1313 1314 -0.823716 12.1114 -0.0441964 0.0242275 -0.0213864 0.111801 +EDGE3 1314 1315 -0.799025 11.9701 -0.013472 0.00808835 0.0031495 0.107076 +EDGE3 1315 1316 -0.861002 11.8915 -0.121361 -0.0147643 0.0171523 0.11254 +EDGE3 1316 1317 -0.729512 12.0466 -0.249011 -0.00774228 -0.0050502 0.138429 +EDGE3 1317 1318 -0.735584 12.1696 -0.0160353 0.0144281 0.018214 0.166206 +EDGE3 1318 1319 -0.990533 11.8331 -0.24167 0.054792 0.00970411 0.148109 +EDGE3 1319 1320 -0.86178 12.1703 -0.186876 -0.043775 0.0771451 0.146378 +EDGE3 1320 1321 -0.793556 12.1056 -0.228617 -0.0208618 -0.0232394 0.0935922 +EDGE3 1321 1322 -0.758953 12.0865 -0.0303057 -0.0140141 0.0258464 0.146609 +EDGE3 1322 1323 -0.737868 11.8571 0.0233552 0.00245447 0.0304675 0.0883039 +EDGE3 1323 1324 -0.804965 12.3022 -0.247828 0.0237053 -0.0175099 0.146459 +EDGE3 1324 1325 -0.717003 11.9212 -0.00331699 0.00937107 0.00687555 0.156716 +EDGE3 1325 1326 -1.00768 12.1694 -0.133516 -0.00693954 0.0145239 0.119644 +EDGE3 1326 1327 -0.629665 12.0505 -0.131829 -0.0107651 0.0118886 0.119028 +EDGE3 1327 1328 -0.984617 12.0183 -0.0843823 0.00167344 -0.00424255 0.1661 +EDGE3 1328 1329 -0.933936 12.1076 -0.0293551 -0.0127874 -0.0180616 0.102034 +EDGE3 1329 1330 -1.0146 11.9573 -0.0958437 0.00757741 0.0100863 0.108842 +EDGE3 1330 1331 -0.650533 11.9312 -0.130486 0.0028506 -0.012938 0.101266 +EDGE3 1331 1332 -0.900239 12.0154 -0.22497 0.0212258 -0.00250526 0.146527 +EDGE3 1332 1333 -0.747805 11.9054 -0.245036 -0.0101559 0.00828855 0.141268 +EDGE3 1333 1334 -0.753453 12.0182 0.0529639 0.0641287 -0.00780485 0.124629 +EDGE3 1334 1335 -0.770693 11.8443 -0.25502 -0.00123542 0.0064145 0.117986 +EDGE3 1335 1336 -0.695679 12.0943 -0.168065 -0.0204761 0.0490668 0.113296 +EDGE3 1336 1337 -0.744405 11.9031 -0.212637 0.0290468 0.0157393 0.151736 +EDGE3 1337 1338 -0.771289 11.7711 -0.0411591 -0.0289121 0.0124695 0.155669 +EDGE3 1338 1339 -0.826106 11.9936 -0.145368 0.0206775 -0.00169836 0.0801288 +EDGE3 1339 1340 -0.782837 12.0873 -0.0800497 0.025886 0.018826 0.123696 +EDGE3 1340 1341 -0.66962 12.1338 0.154884 -0.0327428 -0.0443728 0.147588 +EDGE3 1341 1342 -0.803471 11.9545 0.0855889 0.0161247 0.00782076 0.10747 +EDGE3 1342 1343 -0.743322 11.9014 -0.182173 -0.0295864 -0.0106612 0.163383 +EDGE3 1343 1344 -0.944872 12.074 -0.218413 -0.0615357 -0.00020445 0.107335 +EDGE3 1344 1345 -0.747414 11.8612 -0.194711 -0.0501881 0.00797458 0.126083 +EDGE3 1345 1346 -0.824218 11.9013 -0.154884 -0.00863052 -0.0126516 0.0982118 +EDGE3 1346 1347 -0.842135 11.8166 -0.180752 -0.0333679 0.0192797 0.117598 +EDGE3 1347 1348 -0.840643 12.0078 -0.0841456 -0.00959472 0.0174407 0.130311 +EDGE3 1348 1349 -0.774275 11.972 -0.120342 0.00693938 0.0565239 0.0985948 +EDGE3 1349 1350 -0.832251 11.8432 -0.102235 -0.0264931 0.0181544 0.124893 +EDGE3 1350 1351 -0.779054 12.0336 -0.290394 -0.0102469 -0.00447793 0.098528 +EDGE3 1351 1352 -0.786555 11.9526 -0.0226899 -0.016668 0.0602669 0.0877403 +EDGE3 1352 1353 -0.798062 11.9416 -0.0558789 -0.00666802 -0.0165047 0.0878853 +EDGE3 1353 1354 -0.700096 11.9539 -0.171745 -0.0349201 -0.0208252 0.167667 +EDGE3 1354 1355 -0.719402 11.9779 0.113515 -0.013193 0.00113915 0.120793 +EDGE3 1355 1356 -0.79139 11.6873 -0.331983 0.0179002 -0.0328026 0.0940167 +EDGE3 1356 1357 -0.784704 11.7875 -0.0382493 -0.0299714 0.0213664 0.0721916 +EDGE3 1357 1358 -0.762963 11.8764 0.0466898 0.0163282 -0.0196949 0.116623 +EDGE3 1358 1359 -0.798901 11.6667 -0.11002 -0.0319706 0.00672098 0.149647 +EDGE3 1359 1360 -0.814716 11.8394 -0.0592042 -0.0427142 0.0474467 0.0730908 +EDGE3 1360 1361 -0.689121 11.917 0.00332776 0.00714921 0.00593088 0.132905 +EDGE3 1361 1362 -0.660026 11.8077 -0.186604 -0.00163899 -0.0526037 0.158285 +EDGE3 1362 1363 -0.822355 11.6923 0.0296671 0.0264888 0.0463792 0.129634 +EDGE3 1363 1364 -0.814428 11.7786 -0.171731 -0.02146 -0.00596728 0.136569 +EDGE3 1364 1365 -0.579423 11.8241 -0.0858328 -0.0575565 0.0485542 0.0833544 +EDGE3 1365 1366 -0.665442 11.9109 -0.0967144 0.0025702 0.00524053 0.108089 +EDGE3 1366 1367 -0.722304 11.8761 -0.0313011 -0.0469573 -0.0408388 0.151373 +EDGE3 1367 1368 -0.682696 11.8446 -0.36714 0.0277877 -0.0054819 0.121762 +EDGE3 1368 1369 -0.856309 11.8939 -0.0768773 -0.0200263 0.0160288 0.0992931 +EDGE3 1369 1370 -0.897246 11.8349 -0.115679 0.0153567 -0.0113878 0.106408 +EDGE3 1370 1371 -0.856552 11.9573 -0.259284 0.00462919 -0.0166829 0.168378 +EDGE3 1371 1372 -0.76779 11.8113 -0.0931533 0.0281835 0.0471003 0.110785 +EDGE3 1372 1373 -0.744916 11.9064 -0.170095 0.0119182 -0.0136532 0.0915877 +EDGE3 1373 1374 -0.825192 11.9023 -0.127432 -0.0342841 0.00730106 0.147814 +EDGE3 1374 1375 -0.811616 11.7436 0.0820167 0.0307064 -0.000783944 0.0856391 +EDGE3 1375 1376 -0.586391 11.8062 -0.0672479 0.00183668 -0.0226567 0.157618 +EDGE3 1376 1377 -0.819068 11.9438 -0.119926 -0.0408053 0.0131732 0.127633 +EDGE3 1377 1378 -0.839271 11.8362 -0.118041 -0.0480242 0.0111452 0.112669 +EDGE3 1378 1379 -0.666394 11.8042 -0.252287 -0.020601 -0.00282024 0.0859291 +EDGE3 1379 1380 -0.768884 11.6379 -0.146264 -0.0128409 -0.066376 0.103683 +EDGE3 1380 1381 -0.921111 11.8447 -0.182707 0.00115635 0.0178621 0.131413 +EDGE3 1381 1382 -0.737121 11.8152 -0.11212 0.018377 0.00358594 0.123183 +EDGE3 1382 1383 -0.805375 11.8113 -0.0169906 0.0373025 -0.00245433 0.148791 +EDGE3 1383 1384 -0.871585 11.7365 -0.290456 0.0161881 0.0444514 0.137575 +EDGE3 1384 1385 -0.778345 11.9838 -0.0138095 0.00833746 -0.00561478 0.0797175 +EDGE3 1385 1386 -0.590383 11.7688 -0.258004 0.0298175 0.0220758 0.102266 +EDGE3 1386 1387 -0.900737 11.7975 -0.0425456 -0.0054614 0.0146762 0.140778 +EDGE3 1387 1388 -0.733355 11.5802 -0.137701 0.0297265 0.000795569 0.164939 +EDGE3 1388 1389 -0.975583 11.898 -0.12008 -0.0216711 -0.0202621 0.0806006 +EDGE3 1389 1390 -0.969744 11.7388 -0.152364 0.00900466 -0.00422325 0.111515 +EDGE3 1390 1391 -0.871444 11.688 -0.122702 -0.0133609 0.0136091 0.149733 +EDGE3 1391 1392 -0.829461 11.8717 -0.0986319 -0.0309951 -0.00206554 0.150517 +EDGE3 1392 1393 -0.676338 11.6227 -0.0283759 0.0468111 0.0103981 0.146265 +EDGE3 1393 1394 -0.542889 11.7129 -0.143317 -0.00242164 -0.00330196 0.147251 +EDGE3 1394 1395 -0.768617 11.7596 -0.0441211 0.00378035 -0.00610623 0.118017 +EDGE3 1395 1396 -0.635278 11.7682 -0.134542 0.00854777 0.036817 0.0812196 +EDGE3 1396 1397 -0.6104 11.6663 -0.187143 0.0356053 -0.0245132 0.144709 +EDGE3 1397 1398 -0.893405 11.6276 -0.154773 -0.0436727 0.000313128 0.130832 +EDGE3 1398 1399 -0.846959 11.5714 -0.356598 0.000758036 0.00339251 0.103303 +EDGE3 1399 1400 -0.693171 11.4969 -0.297452 0.00994171 0.0188534 0.123821 +EDGE3 1400 1401 -0.796185 11.7212 -0.009858 -0.0315123 0.0159471 0.140022 +EDGE3 1401 1402 -0.827763 11.7785 -0.188607 -0.0141076 0.0136513 0.136725 +EDGE3 1402 1403 -0.787718 11.6683 -0.191096 0.0197769 0.00950959 0.103896 +EDGE3 1403 1404 -0.77952 11.6848 -0.0536958 0.0223559 0.00456974 0.119348 +EDGE3 1404 1405 -0.959704 11.7649 0.0348177 -0.061575 0.00536396 0.156093 +EDGE3 1405 1406 -0.712966 11.6692 -0.0804254 -0.00884551 -0.00925545 0.124502 +EDGE3 1406 1407 -0.820816 11.6123 -0.0364543 -0.00701027 -0.00997736 0.165811 +EDGE3 1407 1408 -0.82251 11.6059 -0.128308 -0.0111028 -0.0168345 0.0506063 +EDGE3 1408 1409 -0.821776 11.5633 -0.396898 0.0256322 -0.0190286 0.144005 +EDGE3 1410 1411 -0.876479 11.6207 -0.0793301 -0.0032306 0.0209685 0.117338 +EDGE3 1409 1410 -0.710045 11.5475 -0.0284623 -0.0115149 -0.0113998 0.121515 +EDGE3 1411 1412 -0.856749 11.6937 0.0255868 0.027961 -0.0213085 0.0989736 +EDGE3 1412 1413 -0.763543 11.7598 -0.14573 0.0449363 -0.0202933 0.166212 +EDGE3 1413 1414 -0.680835 11.6897 -0.155915 -0.00405386 0.0380819 0.0851686 +EDGE3 1414 1415 -0.778176 11.6399 -0.151085 0.00195139 -0.0159879 0.108327 +EDGE3 1415 1416 -0.741368 11.5399 -0.20159 0.00654486 -0.00726792 0.177794 +EDGE3 1416 1417 -0.91147 11.5006 0.000404051 0.0118345 0.00969925 0.0993426 +EDGE3 1417 1418 -0.657594 11.6394 -0.0657549 -0.0143215 0.0248796 0.125337 +EDGE3 1418 1419 -0.871444 11.5047 -0.262347 0.0577808 0.0271843 0.126636 +EDGE3 1419 1420 -0.897742 11.5818 -0.120179 0.0270982 0.0061948 0.136262 +EDGE3 1420 1421 -0.812095 11.6808 -0.136057 0.000884894 0.000597447 0.135071 +EDGE3 1421 1422 -0.776001 11.6524 -0.282054 -0.0150095 -0.0236921 0.11237 +EDGE3 1422 1423 -0.613431 11.3701 0.0157257 -0.0200309 -0.0350426 0.106018 +EDGE3 1423 1424 -0.841308 11.3794 -0.174224 -0.00594777 0.0154246 0.169812 +EDGE3 1424 1425 -0.665214 11.3418 0.0174502 -0.0279905 -0.0410385 0.123049 +EDGE3 1425 1426 -0.649516 11.6404 0.0293444 -0.0327545 0.00547115 0.140387 +EDGE3 1426 1427 -0.893391 11.4727 -0.235329 -0.00464517 -0.0253355 0.111074 +EDGE3 1427 1428 -0.716273 11.6328 -0.216738 0.010056 0.0129966 0.130839 +EDGE3 1428 1429 -0.733729 11.3917 -0.269975 -0.00393141 0.0187485 0.0921307 +EDGE3 1429 1430 -0.813826 11.4885 -0.0806007 0.0799635 0.0281475 0.167696 +EDGE3 1430 1431 -0.828383 11.5524 -0.172817 -0.0132395 -0.0130521 0.170482 +EDGE3 1431 1432 -0.806366 11.6873 -0.0609479 -0.00397904 0.0401142 0.113959 +EDGE3 1432 1433 -0.806661 11.5081 -0.0578801 -0.0155841 -0.052093 0.100963 +EDGE3 1433 1434 -0.599341 11.5539 -0.252967 -0.0140946 -0.0257361 0.131702 +EDGE3 1434 1435 -0.868387 11.3653 -0.339184 0.00368109 0.00380729 0.129812 +EDGE3 1435 1436 -0.786055 11.3047 -0.0786072 -0.0318224 -0.0170316 0.114299 +EDGE3 1436 1437 -0.850573 11.1946 -0.0672425 -0.00803865 -0.0498899 0.162521 +EDGE3 1437 1438 -0.603858 11.5023 -0.141589 0.00451381 0.0243574 0.128579 +EDGE3 1438 1439 -0.801626 11.3986 -0.13742 -0.00436166 -0.0560819 0.146774 +EDGE3 1439 1440 -0.700423 11.3599 -0.0369072 0.00301212 0.0408504 0.118363 +EDGE3 1440 1441 -0.774697 11.4406 0.0101551 0.0242244 -0.00530323 0.139772 +EDGE3 1441 1442 -0.812613 11.2173 -0.155805 -0.0322704 -0.0238879 0.109239 +EDGE3 1442 1443 -0.607804 11.3752 -0.0596414 0.0594983 -0.0664418 0.0835887 +EDGE3 1443 1444 -0.838306 11.328 -0.267443 0.00768937 0.0192162 0.124551 +EDGE3 1444 1445 -0.78955 11.3559 -0.0680996 0.0278957 -0.000737604 0.16213 +EDGE3 1445 1446 -0.812158 11.3339 -0.0249855 0.00742199 0.00554896 0.1171 +EDGE3 1446 1447 -0.882546 11.3717 -0.145949 -0.00651766 -0.00797405 0.166311 +EDGE3 1447 1448 -0.690989 11.3228 0.0248374 0.0215674 -0.0247041 0.162759 +EDGE3 1448 1449 -0.837859 11.2483 -0.195422 -0.0459137 -0.00813576 0.0800538 +EDGE3 1449 1450 -0.782263 11.5688 0.100273 -0.0262383 0.0304964 0.138808 +EDGE3 1450 1451 -0.760442 11.3001 -0.158593 0.0178551 0.0182557 0.14619 +EDGE3 1451 1452 -0.967307 11.3302 -0.0686258 -0.0202678 0.000495313 0.0888337 +EDGE3 1452 1453 -0.80471 11.2074 -0.114732 -0.0112914 0.00496791 0.17872 +EDGE3 1453 1454 -0.921578 11.2433 -0.0610521 0.00135609 -0.0129158 0.090625 +EDGE3 1454 1455 -0.75371 11.3546 -0.274965 0.0114079 -0.039285 0.115953 +EDGE3 1455 1456 -0.745355 11.1681 -0.223118 0.0123589 -0.028418 0.192386 +EDGE3 1456 1457 -0.754116 11.2956 -0.181995 0.00184101 -0.00914509 0.0797238 +EDGE3 1458 1459 -0.849999 11.1177 -0.15955 0.0178027 0.0257186 0.159379 +EDGE3 1457 1458 -0.876006 11.3497 -0.146994 -0.0391045 -0.0376052 0.125674 +EDGE3 1459 1460 -0.590112 11.2111 -0.188623 -0.000457719 0.00486483 0.133515 +EDGE3 1461 1462 -0.704637 11.256 -0.11585 -0.00602132 -0.0319319 0.10829 +EDGE3 1460 1461 -0.837583 11.3456 -0.111729 -0.0543936 -0.0102497 0.0990217 +EDGE3 1463 1464 -0.767407 11.3036 -0.188317 -0.0135848 0.0194825 0.11208 +EDGE3 1462 1463 -0.724378 11.3264 0.018622 0.000118991 -0.0553296 0.133517 +EDGE3 1465 1466 -0.95251 11.0561 -0.19506 -0.0142185 -0.0239008 0.0968331 +EDGE3 1464 1465 -0.870734 11.3247 -0.124523 -0.00027597 0.0177895 0.0931748 +EDGE3 1467 1468 -0.708355 11.2657 -0.143747 0.017014 0.0420845 0.0882473 +EDGE3 1466 1467 -0.831784 11.2277 -0.201753 -0.0270441 -0.0122548 0.118756 +EDGE3 1469 1470 -0.62715 11.3087 -0.0480176 0.0350884 0.0270743 0.100753 +EDGE3 1468 1469 -0.694412 11.4101 -0.10874 -0.0144114 0.00636916 0.153123 +EDGE3 1471 1472 -0.895712 11.2816 -0.131131 -0.0352698 0.0314744 0.11232 +EDGE3 1470 1471 -0.88351 11.0799 -0.0110643 -0.0185043 0.0270078 0.117324 +EDGE3 1473 1474 -0.77596 11.1113 -0.0815159 0.0225371 0.0406637 0.134382 +EDGE3 1472 1473 -0.9131 10.851 -0.330717 0.0244994 0.0198407 0.11724 +EDGE3 1475 1476 -0.770635 10.9133 -0.0572933 0.0562031 0.0100874 0.124178 +EDGE3 1474 1475 -0.593468 11.1918 -0.0725627 0.0160431 -0.0199526 0.12497 +EDGE3 1477 1478 -0.662065 11.1213 -0.113727 -0.0235817 0.0236609 0.142745 +EDGE3 1476 1477 -0.805332 11.1856 -0.212281 -0.00230514 0.0257032 0.148823 +EDGE3 1479 1480 -0.710236 11.1029 -0.256448 0.0342344 -0.0345521 0.134626 +EDGE3 1478 1479 -0.789311 10.9183 -0.152258 0.00977046 0.0328559 0.10948 +EDGE3 1481 1482 -0.679895 11.1791 -0.161556 0.00737476 0.00409407 0.131477 +EDGE3 1480 1481 -0.868566 11.0486 -0.119752 0.0054756 -0.0250801 0.0815931 +EDGE3 1483 1484 -0.812379 11.29 -0.0191434 0.0176504 0.0335709 0.11927 +EDGE3 1482 1483 -0.716695 11.1946 -0.0739413 -0.00692351 0.00072719 0.141028 +EDGE3 1485 1486 -0.651917 11.2907 -0.187375 0.0185111 -0.0035518 0.116695 +EDGE3 1484 1485 -0.767046 10.9699 -0.254401 0.00831831 -0.0164869 0.117487 +EDGE3 1487 1488 -0.726768 11.1517 -0.185653 0.0268055 0.0235779 0.134298 +EDGE3 1486 1487 -0.846506 11.1812 -0.194739 0.0232121 0.0376882 0.077808 +EDGE3 1489 1490 -0.949679 11.0637 -0.228917 -0.0461066 -0.00232072 0.112125 +EDGE3 1488 1489 -0.575267 11.0809 -0.0881461 -0.000161423 0.0135956 0.162035 +EDGE3 1491 1492 -0.696829 11.1188 -0.127157 -0.0133798 0.00458376 0.101004 +EDGE3 1490 1491 -0.651701 10.8896 -0.111338 -0.0101202 0.016122 0.107558 +EDGE3 1493 1494 -0.629951 10.8582 -0.125346 -0.0258668 -0.0265167 0.128707 +EDGE3 1492 1493 -0.86919 10.9333 -0.107071 -0.0139128 0.0451828 0.154112 +EDGE3 1495 1496 -0.858548 10.9579 -0.197242 -0.00159841 -0.000965489 0.186342 +EDGE3 1494 1495 -0.698575 10.8827 -0.188322 0.0120596 -0.0145786 0.112334 +EDGE3 1496 1497 -0.890954 10.955 -0.231359 -0.000837553 0.0107415 0.108104 +EDGE3 1497 1498 -0.657766 10.9258 -0.135147 -0.000398218 0.00433947 0.114692 +EDGE3 1499 1500 -0.818764 10.955 -0.152322 0.0183064 0.0471909 0.15569 +EDGE3 1498 1499 -0.769315 10.907 -0.0488937 -0.0400005 -0.00414637 0.18452 +EDGE3 1501 1502 -0.690969 10.949 -0.0654607 -0.0300232 0.0282235 0.180199 +EDGE3 1500 1501 -0.812384 10.7363 2.62281e-05 -0.0287062 0.0118043 0.125751 +EDGE3 1503 1504 -0.913549 11.0041 -0.264661 -0.0326939 0.0105017 0.167743 +EDGE3 1502 1503 -0.634835 11.0925 -0.165126 0.00069321 -0.0290792 0.108394 +EDGE3 1505 1506 -0.858482 10.8079 -0.279851 -0.0113901 0.0101563 0.087233 +EDGE3 1504 1505 -0.754814 11.0131 -0.190758 0.0511133 0.0141315 0.135092 +EDGE3 1507 1508 -0.763786 10.8238 -0.139534 0.0098563 0.0551534 0.118198 +EDGE3 1506 1507 -0.78375 10.8728 -0.158525 -0.0433313 -0.0410103 0.118399 +EDGE3 1509 1510 -0.731288 11.1831 -0.585292 0.0281752 -0.00560898 0.116249 +EDGE3 1508 1509 -0.811729 10.8933 0.0176502 0.0272373 0.0333963 0.13345 +EDGE3 1511 1512 -0.545265 10.975 -0.28565 0.0601932 0.0296601 0.147667 +EDGE3 1510 1511 -0.70313 10.8141 -0.122002 -0.0289339 0.0140558 0.101257 +EDGE3 1513 1514 -0.645929 10.9226 -0.0627868 0.0151821 0.0240891 0.137027 +EDGE3 1512 1513 -0.623788 10.8109 -0.184549 -0.0108516 0.000160591 0.119949 +EDGE3 1515 1516 -0.766135 10.806 -0.0152587 -0.0116156 -0.0335572 0.106718 +EDGE3 1514 1515 -0.823034 10.9067 -0.126091 0.0215245 0.0322627 0.162977 +EDGE3 1517 1518 -0.82753 10.9038 -0.13801 0.0345412 -0.0347808 0.149708 +EDGE3 1516 1517 -0.77377 10.8021 -0.0526588 0.0181989 -0.0255275 0.146536 +EDGE3 1519 1520 -0.504773 11.0947 -0.0426348 -0.0260844 0.0114665 0.122245 +EDGE3 1518 1519 -0.800935 10.7977 -0.151099 0.0073104 -0.0217946 0.101813 +EDGE3 1521 1522 -0.814388 10.683 -0.0553387 -0.0301726 -0.0319639 0.0886656 +EDGE3 1520 1521 -0.750944 10.9378 -0.178184 0.0161717 -0.0274563 0.0853167 +EDGE3 1523 1524 -0.690492 10.8253 -0.243758 0.00327874 0.00341512 0.116672 +EDGE3 1522 1523 -0.752952 10.7956 -0.150516 -0.00794958 -0.0193869 0.134512 +EDGE3 1525 1526 -0.599542 10.7155 -0.174667 -0.00744494 0.00867748 0.150445 +EDGE3 1524 1525 -0.725211 10.7114 -0.181242 -0.0139456 0.0133567 0.107132 +EDGE3 1527 1528 -0.868936 10.8311 -0.0597591 -0.0253752 0.00329597 0.144883 +EDGE3 1526 1527 -0.845192 10.7503 -0.166406 -0.00940567 -0.00948667 0.129376 +EDGE3 1529 1530 -0.668843 10.493 -0.0887836 0.00320154 -0.00745328 0.101759 +EDGE3 1528 1529 -0.886508 10.8592 -0.0016041 0.0103112 -0.01435 0.0983258 +EDGE3 1531 1532 -0.799073 10.6665 -0.191071 0.00371089 0.0433023 0.114702 +EDGE3 1530 1531 -0.788502 10.7334 -0.0207101 0.0251228 -0.0309115 0.135584 +EDGE3 1533 1534 -0.805161 10.7776 0.0472833 0.00545121 0.0353866 0.136711 +EDGE3 1532 1533 -0.779409 10.7329 -0.0610058 -0.0763342 -0.00124007 0.114103 +EDGE3 1535 1536 -0.70088 10.775 -0.155415 -0.0248442 0.016121 0.134439 +EDGE3 1534 1535 -0.839707 10.8445 -0.0904785 0.0066291 -0.0338992 0.135829 +EDGE3 1537 1538 -0.591685 10.6795 -0.0166187 0.00715553 0.01674 0.134092 +EDGE3 1536 1537 -0.786647 10.5853 -0.0753195 0.0101503 -0.0348154 0.133204 +EDGE3 1539 1540 -0.720201 10.8424 -0.24334 0.0249414 0.00527282 0.137787 +EDGE3 1538 1539 -0.798068 10.4831 0.0648581 0.0181288 -0.0042326 0.0962613 +EDGE3 1541 1542 -0.565793 10.625 -0.151464 0.0282195 0.0246272 0.137461 +EDGE3 1540 1541 -0.640804 10.6849 -0.0834486 -0.00925988 0.0191227 0.144058 +EDGE3 1543 1544 -0.745627 10.717 -0.0892168 -0.0173037 0.00968544 0.0950442 +EDGE3 1542 1543 -0.665858 10.6288 -0.131034 -0.0072079 -0.0150632 0.108855 +EDGE3 1545 1546 -0.503655 10.5886 -0.159636 0.0303124 0.054497 0.149942 +EDGE3 1544 1545 -0.866148 10.6356 0.0157844 -0.0149982 0.00537119 0.11604 +EDGE3 1547 1548 -0.674165 10.4401 -0.198423 0.0115663 -0.00928917 0.129788 +EDGE3 1546 1547 -0.877123 10.591 -0.0863929 0.00905625 -0.0206582 0.121586 +EDGE3 1549 1550 -0.845812 10.4845 -0.266295 0.024116 0.0305419 0.13779 +EDGE3 1548 1549 -0.650655 10.541 0.0249421 0.0197304 -0.0374091 0.0944233 +EDGE3 1551 1552 -0.833972 10.5307 -0.185718 0.0189974 -0.0373438 0.124938 +EDGE3 1550 1551 -0.806666 10.5978 -0.0860458 -0.0590688 0.0372662 0.108483 +EDGE3 1553 1554 -0.70908 10.5389 -0.240168 -0.0143333 -0.0240184 0.15497 +EDGE3 1552 1553 -0.649057 10.859 -0.101642 0.00935434 0.0325665 0.0777964 +EDGE3 1555 1556 -0.637226 10.4245 -0.0111009 -0.0257128 0.0121119 0.178361 +EDGE3 1554 1555 -0.718854 10.6258 -0.000948513 0.0383765 0.0207531 0.164019 +EDGE3 1557 1558 -0.739799 10.4902 -0.0684403 -0.0132278 0.019566 0.105018 +EDGE3 1556 1557 -0.680336 10.499 -0.0801165 0.0245101 -0.0255263 0.0890899 +EDGE3 1559 1560 -0.605944 10.5713 -0.05904 -0.00943931 0.0213736 0.139103 +EDGE3 1558 1559 -0.955356 10.3799 -0.210076 0.00166901 0.0149256 0.130334 +EDGE3 1561 1562 -0.889502 10.3846 0.00874363 -0.0271694 -0.00251044 0.13106 +EDGE3 1560 1561 -0.64644 10.4547 0.100447 0.000289085 0.0228146 0.0560401 +EDGE3 1563 1564 -0.68361 10.4009 -0.0327574 -4.78827e-05 0.0209629 0.152052 +EDGE3 1562 1563 -0.934278 10.2971 -0.304762 -0.0180024 -0.00667622 0.133499 +EDGE3 1565 1566 -0.752588 10.3549 -0.0185723 -0.000520119 -0.0166283 0.141391 +EDGE3 1564 1565 -0.719816 10.2226 -0.095684 0.00248192 -0.00166925 0.160408 +EDGE3 1566 1567 -0.587131 10.4908 -0.249476 -0.0114429 -0.0305195 0.113804 +EDGE3 1567 1568 -0.877173 10.405 -0.0689086 -0.000821324 -0.016827 0.126927 +EDGE3 1569 1570 -0.553903 10.3833 0.0637206 0.00127865 -0.0371223 0.100478 +EDGE3 1568 1569 -0.757547 10.4845 -0.070405 -0.00480287 0.0337041 0.0919309 +EDGE3 1571 1572 -0.671897 10.5405 -0.12211 -0.00531599 0.0523828 0.142585 +EDGE3 1570 1571 -0.722669 10.2312 -0.181582 0.00460263 -0.00432729 0.137502 +EDGE3 1572 1573 -0.704374 10.3227 -0.114147 0.0129803 0.0218594 0.132708 +EDGE3 1573 1574 -0.897113 10.4688 -0.0730705 -0.0217608 0.0284533 0.140451 +EDGE3 1574 1575 -0.85006 10.3487 -0.156801 -0.00515724 0.00237515 0.143018 +EDGE3 1575 1576 -0.594273 10.413 -0.13624 -0.00249707 0.0031658 0.131444 +EDGE3 1576 1577 -0.873298 10.1833 0.0374786 0.0134838 -0.0151321 0.154252 +EDGE3 1577 1578 -0.789229 10.2971 -0.0196367 0.00657941 0.018792 0.109646 +EDGE3 1578 1579 -0.66171 10.3759 -0.103992 0.0178227 -0.016167 0.133814 +EDGE3 1579 1580 -0.711348 10.1878 -0.162254 0.00798455 0.0459019 0.139432 +EDGE3 1580 1581 -0.866341 10.4057 -0.1932 0.0198864 0.0259737 0.169639 +EDGE3 1581 1582 -0.704626 10.2825 -0.00461196 -0.0253643 0.0398469 0.135941 +EDGE3 1582 1583 -0.575311 10.3451 -0.204039 0.0024565 -0.0245127 0.111989 +EDGE3 1583 1584 -0.77396 10.311 -0.187003 -0.0118499 -0.00113107 0.1368 +EDGE3 1584 1585 -0.814996 10.2975 -0.163829 -0.0111298 0.0233787 0.113658 +EDGE3 1585 1586 -0.606138 10.2286 -0.217942 1.48502e-05 0.00684994 0.144967 +EDGE3 1586 1587 -0.789966 10.3835 -0.13967 -0.0378476 0.00189062 0.0977099 +EDGE3 1587 1588 -0.734098 10.2444 -0.091238 0.010668 -0.0202097 0.12683 +EDGE3 1588 1589 -0.643881 10.1186 -0.264428 -0.0239292 0.0133554 0.114543 +EDGE3 1589 1590 -0.574632 10.0996 -0.0175673 0.00189412 0.0205331 0.158711 +EDGE3 1590 1591 -0.832586 10.1173 -0.295389 0.00842653 -0.020139 0.148985 +EDGE3 1591 1592 -0.924837 10.2214 -0.180035 0.0128151 0.0056863 0.154282 +EDGE3 1592 1593 -0.54893 10.2235 -0.0904191 -0.0234473 0.0496487 0.107614 +EDGE3 1593 1594 -0.745669 10.1842 -0.115633 -0.0318602 0.00472356 0.167626 +EDGE3 1594 1595 -0.698573 10.2861 -0.0736418 0.0539673 -0.0193833 0.116712 +EDGE3 1595 1596 -0.620752 10.1322 -0.146062 0.0278095 0.00252667 0.102596 +EDGE3 1596 1597 -0.543616 10.2947 -0.283068 -0.023585 -0.000168661 0.197775 +EDGE3 1597 1598 -0.639174 10.0937 0.0609723 -0.0167607 -0.0659889 0.14698 +EDGE3 1598 1599 -0.702633 10.0605 -0.0391199 0.0100379 -0.00932702 0.136223 +EDGE3 1599 1600 -0.75894 10.0663 0.123634 0.0322061 0.00586886 0.117895 +EDGE3 1600 1601 -0.659198 10.105 0.0745058 -0.0297447 0.0547458 0.142817 +EDGE3 1601 1602 -0.687542 10.105 -0.375305 -0.00794135 0.000451448 0.14969 +EDGE3 1602 1603 -0.678793 10.1007 -0.105843 0.0107559 0.00372365 0.17195 +EDGE3 1603 1604 -0.821376 10.0977 0.064333 0.0313828 -0.0147148 0.152392 +EDGE3 1604 1605 -0.717183 9.95414 -0.170076 0.00364762 -0.0060896 0.119541 +EDGE3 1605 1606 -0.792106 10.1496 -0.211601 -0.00750109 0.032913 0.124917 +EDGE3 1606 1607 -0.864513 10.1466 -0.0198275 0.00693507 0.0125637 0.114364 +EDGE3 1607 1608 -0.73648 10.0324 -0.0849179 0.0159353 -0.00492891 0.147049 +EDGE3 1608 1609 -0.829717 10.0675 -0.126887 -0.026664 0.031747 0.0859422 +EDGE3 1609 1610 -0.824807 10.0256 -0.0601421 -0.0329291 0.00857567 0.108399 +EDGE3 1610 1611 -0.703937 10.129 -0.0209478 0.00626935 -0.0262067 0.175728 +EDGE3 1611 1612 -0.769169 9.9703 -0.155508 0.0272901 -0.00440823 0.151324 +EDGE3 1612 1613 -0.938286 9.88498 -0.165278 0.0267188 0.0151059 0.147732 +EDGE3 1613 1614 -0.80734 9.96917 -0.196437 0.0100816 -0.0360232 0.131929 +EDGE3 1614 1615 -0.777518 10.2014 -0.179278 0.0264011 -0.0120214 0.145467 +EDGE3 1615 1616 -0.703685 10.0412 -0.211756 0.00637657 -0.00935921 0.114022 +EDGE3 1616 1617 -0.88836 9.90036 -0.099825 -0.00813145 0.0161376 0.097188 +EDGE3 1617 1618 -0.724321 9.96978 -0.0210966 0.00751956 0.0287284 0.105586 +EDGE3 1618 1619 -0.552716 9.83963 -0.263627 -0.0423327 0.0290408 0.127647 +EDGE3 1619 1620 -0.70747 9.88663 -0.0861064 0.0148009 -0.0161281 0.133085 +EDGE3 1620 1621 -0.734189 9.66826 -0.0597107 -0.0256024 0.0460396 0.0652566 +EDGE3 1621 1622 -0.732204 9.81497 -0.280626 -0.00466485 -0.00484158 0.145787 +EDGE3 1622 1623 -0.746092 10.029 -0.119288 -0.0208656 -0.0225175 0.139583 +EDGE3 1623 1624 -0.73048 9.88919 -0.147405 0.00805315 0.0204661 0.128377 +EDGE3 1624 1625 -0.681575 9.96345 -0.00939034 -0.00809732 0.0137319 0.105381 +EDGE3 1625 1626 -0.757497 10.0876 -0.0535463 0.0373648 -0.0437511 0.144844 +EDGE3 1626 1627 -0.889859 10.1134 -0.194024 0.00604145 0.029758 0.117944 +EDGE3 1627 1628 -0.700483 9.90796 -0.177935 0.00266432 -0.000381426 0.120311 +EDGE3 1628 1629 -0.663937 9.87457 0.0213945 0.00704161 -0.023901 0.0931819 +EDGE3 1629 1630 -0.754584 9.92231 0.0864061 -0.0419924 0.0169616 0.115129 +EDGE3 1630 1631 -0.564508 9.88318 -0.304356 -0.0208714 0.0119623 0.115354 +EDGE3 1631 1632 -0.562155 9.62966 -0.170801 -0.0137264 -0.00591212 0.0923673 +EDGE3 1632 1633 -0.70906 9.89422 -0.159184 -0.0381354 0.00677309 0.0782353 +EDGE3 1633 1634 -0.708872 9.78846 -0.199598 -0.0161811 0.0233108 0.131592 +EDGE3 1634 1635 -0.63312 9.72897 0.17502 0.0354555 -0.0167249 0.138678 +EDGE3 1635 1636 -0.793904 9.72406 -0.134484 -0.000763664 0.00315353 0.125993 +EDGE3 1636 1637 -0.780034 9.78164 0.038766 0.00578832 0.00831429 0.144622 +EDGE3 1637 1638 -0.708446 9.82755 -0.105839 0.009442 0.0105601 0.124663 +EDGE3 1638 1639 -0.687722 9.66508 -0.0623805 0.0246893 -0.00952608 0.12762 +EDGE3 1639 1640 -0.626764 9.83257 -0.120097 -0.0093811 0.045762 0.146071 +EDGE3 1640 1641 -0.584435 9.68008 -0.0301858 -0.00217936 0.0158657 0.118887 +EDGE3 1641 1642 -0.595825 9.69538 -0.117311 0.0142343 0.00654262 0.139512 +EDGE3 1642 1643 -0.842967 9.74655 -0.124403 0.0261376 0.0342276 0.176946 +EDGE3 1643 1644 -0.656335 9.74766 0.12482 -0.0246025 -0.028557 0.118166 +EDGE3 1644 1645 -0.687351 9.60586 -0.314446 0.02515 -0.0176447 0.130441 +EDGE3 1645 1646 -0.67405 9.58808 -0.218654 0.0170867 -0.00520986 0.0898719 +EDGE3 1646 1647 -0.872089 9.83861 -0.209887 0.0245379 -0.0282538 0.134539 +EDGE3 1647 1648 -0.77804 9.75372 -0.167887 -0.0147619 0.0260108 0.119597 +EDGE3 1648 1649 -0.644343 9.70163 -0.0436996 0.00835036 0.0404947 0.120772 +EDGE3 1649 1650 -0.696945 9.51407 -0.166362 0.00904026 -0.00279738 0.164611 +EDGE3 1650 1651 -0.748223 9.6971 -0.0307378 -0.0122166 -0.0103572 0.175052 +EDGE3 1651 1652 -0.513724 9.57845 -0.1456 -0.0250517 0.00802307 0.0960922 +EDGE3 1652 1653 -0.698201 9.69768 0.0433684 0.0501978 0.012006 0.107207 +EDGE3 1653 1654 -0.647688 9.67397 0.146256 0.0159569 -0.0202746 0.155391 +EDGE3 1654 1655 -0.514112 9.52581 0.0412062 -0.034541 -0.018956 0.119738 +EDGE3 1655 1656 -0.744897 9.67447 -0.137684 0.050452 0.0255678 0.148118 +EDGE3 1656 1657 -0.650381 9.26115 -0.010917 -0.0600465 -0.0212044 0.148168 +EDGE3 1657 1658 -0.593845 9.55213 -0.0213887 -0.0493912 0.0217435 0.0842465 +EDGE3 1658 1659 -0.704211 9.42074 0.00739194 0.0015695 0.0514317 0.0865727 +EDGE3 1659 1660 -0.778782 9.5952 0.0433267 -0.00531216 0.0223656 0.12429 +EDGE3 1660 1661 -0.729748 9.56465 0.10144 -0.00557635 0.00579897 0.115577 +EDGE3 1661 1662 -0.635403 9.53393 -0.135975 -0.000707109 0.0233408 0.183467 +EDGE3 1662 1663 -0.57024 9.42204 0.028072 0.018783 -0.0180629 0.148946 +EDGE3 1663 1664 -0.568602 9.56169 -0.0348408 -0.00119566 -0.014026 0.118828 +EDGE3 1664 1665 -0.7148 9.41446 -0.0613961 0.076926 -0.00242408 0.161939 +EDGE3 1665 1666 -0.723319 9.48487 -0.0146073 0.0476083 0.0199671 0.137729 +EDGE3 1666 1667 -0.857875 9.41139 -0.0827327 -0.0222894 0.0159279 0.0669186 +EDGE3 1667 1668 -0.573171 9.57019 -0.233681 -0.00666988 -0.0110857 0.172771 +EDGE3 1668 1669 -0.744694 9.49026 -0.0710553 0.0101353 -0.0208969 0.112845 +EDGE3 1669 1670 -0.560253 9.49395 -0.213524 0.0178051 0.00769472 0.114583 +EDGE3 1670 1671 -0.809284 9.35543 -0.00558665 -0.0467412 -7.57943e-06 0.126381 +EDGE3 1671 1672 -0.46807 9.67677 -0.317399 -0.00225475 -0.00185606 0.101114 +EDGE3 1672 1673 -0.556198 9.42756 -0.184035 -0.0163652 0.0158387 0.166884 +EDGE3 1673 1674 -0.785348 9.46187 -0.0683788 -0.0267214 0.0020553 0.1076 +EDGE3 1674 1675 -0.568183 9.34009 -0.0366307 -0.0519397 0.0122884 0.0945701 +EDGE3 1675 1676 -0.722784 9.39659 -0.156157 0.0449734 0.0230453 0.148599 +EDGE3 1676 1677 -0.663429 9.36498 -0.317055 0.00321725 -0.00578545 0.119963 +EDGE3 1677 1678 -0.643589 9.45744 -0.000340064 0.0370378 0.00576772 0.128112 +EDGE3 1678 1679 -0.678352 9.38289 -0.282192 0.0206799 0.0101582 0.115906 +EDGE3 1679 1680 -0.749277 9.22989 -0.283966 0.0203346 0.0176743 0.0889679 +EDGE3 1680 1681 -0.735439 9.33041 -0.257581 0.0118447 -0.0108115 0.126129 +EDGE3 1681 1682 -0.686815 9.35258 0.0409327 -0.0259937 -0.0602435 0.120302 +EDGE3 1682 1683 -0.705145 9.22934 -0.127375 0.00848075 -0.0120483 0.0917773 +EDGE3 1683 1684 -0.712508 9.3165 -0.0796427 -0.0178537 0.00453738 0.140811 +EDGE3 1684 1685 -0.545364 9.37687 0.10263 -0.0010473 0.00275426 0.0851827 +EDGE3 1685 1686 -0.579159 9.34232 -0.0576823 -0.000358068 -0.0196 0.129116 +EDGE3 1686 1687 -0.808803 9.315 -0.0674509 -0.0268298 -0.00401599 0.103319 +EDGE3 1687 1688 -0.759367 9.15696 0.182457 0.0344086 -0.0242115 0.162364 +EDGE3 1688 1689 -0.717845 9.41303 -0.189579 -0.0200928 -0.0472496 0.117321 +EDGE3 1689 1690 -0.774564 9.29599 -0.0396722 -0.0525672 0.0453419 0.124735 +EDGE3 1690 1691 -0.720963 9.32326 -0.198101 0.00714728 0.00557752 0.127224 +EDGE3 1691 1692 -0.602951 9.35424 -0.0303865 0.0419929 -0.0131379 0.146085 +EDGE3 1692 1693 -0.93931 8.91467 -0.128691 -0.0160606 -0.0201286 0.139829 +EDGE3 1693 1694 -0.688711 9.29549 -0.0398784 0.0309624 -0.035245 0.110457 +EDGE3 1694 1695 -0.712653 9.03587 0.00547407 -0.0154061 -0.0288973 0.0895659 +EDGE3 1695 1696 -0.781559 9.19843 -0.0417933 -0.00220844 -0.00856946 0.0717394 +EDGE3 1696 1697 -0.693671 9.23885 -0.205869 0.000304972 -0.015721 0.107157 +EDGE3 1697 1698 -0.779164 9.12891 -0.131712 -0.0238033 -0.00653049 0.0969046 +EDGE3 1698 1699 -0.516838 9.12342 -0.109469 0.0326453 -0.000856792 0.154649 +EDGE3 1699 1700 -0.814797 9.33593 -0.01895 0.026248 0.0504155 0.107485 +EDGE3 1700 1701 -0.682209 9.06116 -0.162985 -0.00312337 0.00409629 0.134856 +EDGE3 1701 1702 -0.561639 8.96407 -0.194499 -0.0286583 0.0575284 0.126905 +EDGE3 1702 1703 -0.592798 9.13809 -0.110837 0.0304426 -0.0681029 0.165322 +EDGE3 1703 1704 -0.560217 9.19852 -0.156208 0.0584248 0.010993 0.147009 +EDGE3 1704 1705 -0.75988 9.1467 -0.0255926 0.000584789 0.00163579 0.128592 +EDGE3 1705 1706 -0.780831 9.18134 -0.157225 -0.0117138 -0.0213192 0.142391 +EDGE3 1706 1707 -0.474108 9.09002 -0.22295 -0.0322755 -0.00176778 0.126078 +EDGE3 1707 1708 -0.552497 9.07047 -0.0288139 -0.00367801 0.00155875 0.124782 +EDGE3 1708 1709 -0.676401 9.05583 -0.386603 -0.00563702 0.0113754 0.151259 +EDGE3 1709 1710 -0.807525 9.10391 -0.0761 0.029222 0.00570347 0.113883 +EDGE3 1710 1711 -0.625976 8.86045 -0.202683 0.00441529 -0.0190318 0.118447 +EDGE3 1711 1712 -0.776971 8.95951 -0.0657595 -0.00115974 -0.0097228 0.0992452 +EDGE3 1712 1713 -0.674098 9.10612 -0.0192329 -0.0201587 -0.0303272 0.114536 +EDGE3 1713 1714 -0.62253 9.00068 -0.0497596 -0.0132215 0.0208661 0.0923799 +EDGE3 1714 1715 -0.849589 9.15427 -0.21847 -0.00288796 -0.01632 0.156287 +EDGE3 1715 1716 -0.560842 8.93406 0.0711721 -0.0240781 0.0131156 0.146082 +EDGE3 1716 1717 -0.632669 8.91991 -0.248108 0.00918403 0.0108692 0.114394 +EDGE3 1717 1718 -0.750974 8.91528 -0.204321 -0.0289998 0.0147743 0.0788022 +EDGE3 1718 1719 -0.640254 8.9575 -0.203921 -0.0111372 0.0139786 0.11519 +EDGE3 1719 1720 -0.677173 8.85533 -0.145493 0.0120212 0.0477844 0.111859 +EDGE3 1720 1721 -0.767934 8.83573 -0.10138 0.00674059 0.0246641 0.126807 +EDGE3 1722 1723 -0.736755 8.94689 -0.117932 -0.00254839 -0.0206319 0.184527 +EDGE3 1721 1722 -0.648896 8.90637 -0.0896637 0.0172373 0.00616958 0.1126 +EDGE3 1724 1725 -0.669399 8.7364 -0.250348 -0.0202047 0.0332804 0.126648 +EDGE3 1723 1724 -0.706499 8.75531 -0.164559 0.0120312 -0.00135698 0.186484 +EDGE3 1726 1727 -0.655875 8.72136 -0.145399 -0.0110006 0.0400038 0.12634 +EDGE3 1725 1726 -0.741493 8.75915 -0.0164839 0.0129082 -0.05129 0.104809 +EDGE3 1728 1729 -0.777844 8.86409 -0.167866 -0.0168468 0.0477061 0.103469 +EDGE3 1727 1728 -0.828755 8.72127 -0.217803 -0.00197419 -0.0147115 0.131111 +EDGE3 1730 1731 -0.585116 8.9135 -0.0729074 0.0185185 -0.026955 0.112559 +EDGE3 1729 1730 -0.579206 9.04998 -0.0741514 -0.0256319 0.00589723 0.153035 +EDGE3 1732 1733 -0.603184 8.73013 -0.137046 -0.0481282 0.0256601 0.12502 +EDGE3 1731 1732 -0.494768 8.73032 -0.186201 0.00773131 0.000734901 0.129756 +EDGE3 1734 1735 -0.659853 8.82085 -0.258604 -0.0102844 0.0196813 0.141938 +EDGE3 1733 1734 -0.774192 8.69864 0.0306604 0.0375445 0.0135582 0.124304 +EDGE3 1736 1737 -0.678966 8.68085 -0.199623 0.0162647 0.0035466 0.13546 +EDGE3 1735 1736 -0.752781 8.75014 -0.184129 -0.000646369 -0.0479652 0.160016 +EDGE3 1738 1739 -0.645147 8.82355 0.036166 -0.0218937 -0.00889489 0.160658 +EDGE3 1737 1738 -0.430789 8.95105 -0.203691 0.0127907 -0.0461139 0.125903 +EDGE3 1740 1741 -0.694621 8.646 -0.103002 -0.0270463 0.0405312 0.171305 +EDGE3 1739 1740 -0.662647 8.53992 -0.0333173 -0.00335517 -0.0170043 0.127648 +EDGE3 1742 1743 -0.584646 8.76157 -0.0163477 -0.00883968 0.000192248 0.0951631 +EDGE3 1741 1742 -0.708331 8.81685 -0.108245 0.0126437 -0.0308474 0.0894812 +EDGE3 1743 1744 -0.709631 8.62351 -0.0321975 0.000188318 0.0452064 0.0921412 +EDGE3 1744 1745 -0.786989 8.76276 -0.0835905 0.00511522 0.00937952 0.144446 +EDGE3 1746 1747 -0.70017 8.73094 -0.123239 0.0311117 0.00875913 0.159535 +EDGE3 1745 1746 -0.576809 8.5749 -0.184519 0.00906226 0.000989937 0.101131 +EDGE3 1748 1749 -0.388173 8.49807 -0.0683552 0.00145625 0.00107192 0.157595 +EDGE3 1747 1748 -0.596757 8.68158 -0.182011 0.0267092 -0.0229518 0.0984165 +EDGE3 1750 1751 -0.803654 8.40349 -0.0437228 0.000261433 -0.0159064 0.183327 +EDGE3 1749 1750 -0.485232 8.48924 -0.114901 -0.00303902 -0.0156962 0.118598 +EDGE3 1752 1753 -0.58819 8.34542 -0.0900196 0.0292324 -0.00916929 0.101214 +EDGE3 1751 1752 -0.677485 8.74875 -0.0597782 -0.0527454 0.00858423 0.11597 +EDGE3 1754 1755 -0.667748 8.63223 -0.153379 -0.0168325 -0.00679313 0.105471 +EDGE3 1753 1754 -0.624866 8.60142 -0.10477 -0.0343928 -0.0140979 0.115482 +EDGE3 1756 1757 -0.712165 8.43949 -0.151737 -0.0254416 -0.0368607 0.124393 +EDGE3 1755 1756 -0.306251 8.50136 -0.152428 0.0306043 -0.00736677 0.138076 +EDGE3 1758 1759 -0.70848 8.48636 -0.0536761 0.0639316 0.00182 0.114804 +EDGE3 1757 1758 -0.422942 8.27454 -0.198104 -0.00680361 0.0172089 0.120451 +EDGE3 1760 1761 -0.71823 8.47413 -0.146248 0.0309916 0.00236926 0.0728556 +EDGE3 1759 1760 -0.599689 8.43768 0.0314285 0.0272454 -0.00578223 0.125805 +EDGE3 1762 1763 -0.814696 8.39753 0.206215 -0.0397832 -0.000219592 0.178783 +EDGE3 1761 1762 -0.707567 8.44297 -0.148556 -0.0267319 -0.036005 0.156107 +EDGE3 1764 1765 -0.536458 8.25601 0.0306788 0.0257825 0.0173608 0.123464 +EDGE3 1763 1764 -0.660847 8.37624 -0.0128089 -0.00955636 0.00828518 0.111864 +EDGE3 1765 1766 -0.705058 8.50952 -0.0684241 -0.00200543 -0.00117036 0.115512 +EDGE3 1766 1767 -0.565805 8.4194 -0.0928328 0.0479989 0.0216385 0.164741 +EDGE3 1767 1768 -0.723391 8.48469 -0.128015 0.0271598 0.0112233 0.123839 +EDGE3 1769 1770 -0.690778 8.38054 -0.0710786 0.0228547 -0.00504621 0.164824 +EDGE3 1768 1769 -0.65917 8.40844 -0.118198 0.0219117 -0.00948477 0.117545 +EDGE3 1771 1772 -0.668571 8.22355 -0.151659 0.0258845 -0.00916531 0.125334 +EDGE3 1770 1771 -0.646399 8.32393 -0.0479328 -0.0291056 -0.0511223 0.118658 +EDGE3 1773 1774 -0.598979 8.38568 -0.149155 0.00278584 0.00836642 0.0615321 +EDGE3 1772 1773 -0.75194 8.32408 -0.0970834 0.0240853 0.0200909 0.116664 +EDGE3 1775 1776 -0.809922 8.27049 -0.0143896 0.0264685 0.00840505 0.122448 +EDGE3 1774 1775 -0.779119 8.30466 -0.119626 0.0100166 0.0304653 0.150759 +EDGE3 1777 1778 -0.746655 8.15559 -0.131233 0.0207767 -0.00230481 0.159991 +EDGE3 1776 1777 -0.593338 8.25504 -0.109116 0.0209401 0.0172667 0.0994542 +EDGE3 1779 1780 -0.699635 8.30135 -0.188942 0.00125318 0.0110711 0.0759287 +EDGE3 1778 1779 -0.677233 8.2617 -0.0430685 0.00261889 0.00397712 0.126189 +EDGE3 1781 1782 -0.531911 8.32118 -0.108374 -0.0456388 -0.0457196 0.145503 +EDGE3 1780 1781 -0.356799 8.08 0.179814 0.0175428 0.0133354 0.105841 +EDGE3 1783 1784 -0.702485 8.28048 -0.236952 0.032631 0.0132036 0.121639 +EDGE3 1782 1783 -0.517194 8.3647 -0.0816039 -0.0113316 -0.00935498 0.123588 +EDGE3 1785 1786 -0.657038 8.28114 -0.076788 -0.0267116 -0.0276254 0.12593 +EDGE3 1784 1785 -0.530726 8.05879 0.0280617 0.0283196 -0.00223296 0.147409 +EDGE3 1787 1788 -0.625021 8.21201 -0.169548 0.00359036 0.0282426 0.156112 +EDGE3 1786 1787 -0.606124 8.09641 -0.118244 -0.0174261 0.0108715 0.0779915 +EDGE3 1789 1790 -0.637342 7.97393 0.0176927 0.0125417 0.00602878 0.117514 +EDGE3 1788 1789 -0.603221 8.15783 0.0131202 0.0135851 -0.0300718 0.0887418 +EDGE3 1791 1792 -0.4675 8.10172 -0.227874 -0.0202107 -0.00505762 0.187154 +EDGE3 1790 1791 -0.642156 8.49444 -0.00505507 0.0155492 0.00667434 0.212576 +EDGE3 1793 1794 -0.692717 7.97644 -0.218317 0.0412772 -0.0190072 0.111222 +EDGE3 1792 1793 -0.583262 8.24003 -0.0586081 -0.0106597 0.0192138 0.118053 +EDGE3 1795 1796 -0.701217 8.11458 -0.19062 -0.0131211 0.0212533 0.172709 +EDGE3 1794 1795 -0.50726 7.94177 -0.0550599 0.0132374 0.00381553 0.156416 +EDGE3 1797 1798 -0.638789 7.85882 -0.0404762 -4.81768e-05 -0.00715674 0.114194 +EDGE3 1796 1797 -0.583463 8.05999 0.0603924 -0.0135708 -0.00240073 0.148866 +EDGE3 1798 1799 -0.502956 8.00445 0.128703 -0.0133184 -0.0154281 0.142503 +EDGE3 1799 1800 -0.350681 7.98474 -0.168339 0.0162657 -0.00395115 0.123277 +EDGE3 1801 1802 -0.489703 7.88749 -0.16153 -0.0185827 0.0243479 0.10266 +EDGE3 1800 1801 -0.586369 8.12125 0.025178 -0.0105243 0.00561974 0.14307 +EDGE3 1803 1804 -0.738894 7.96495 -0.00044407 -0.00714149 0.0163517 0.136468 +EDGE3 1802 1803 -0.777747 8.04265 0.00208033 -0.0169064 0.0325872 0.0884066 +EDGE3 1805 1806 -0.518517 8.02274 -0.156522 0.0140339 0.0517636 0.114445 +EDGE3 1804 1805 -0.561816 7.95631 -0.0495785 0.021295 -0.0075046 0.0951483 +EDGE3 1807 1808 -0.481337 7.82601 -0.108736 -0.02562 -0.0247567 0.117765 +EDGE3 1806 1807 -0.760717 7.83769 -0.21828 0.0277379 0.00369227 0.139079 +EDGE3 1809 1810 -0.54389 7.61162 -0.0275404 -0.0113437 0.000628877 0.137917 +EDGE3 1808 1809 -0.608133 7.99125 -0.0130481 0.0066436 -0.0250742 0.107451 +EDGE3 1811 1812 -0.495784 7.90348 -0.249235 0.00844911 -0.00503745 0.118693 +EDGE3 1810 1811 -0.59716 7.90639 0.0469827 -0.0143403 -0.0180821 0.154239 +EDGE3 1813 1814 -0.388583 7.87127 -0.201358 0.0201414 -0.020978 0.121156 +EDGE3 1812 1813 -0.656688 7.99965 0.0895815 0.00689396 0.00956668 0.125024 +EDGE3 1815 1816 -0.628084 7.83523 -0.15015 0.00235578 -0.0286318 0.114708 +EDGE3 1814 1815 -0.622409 7.73601 0.0454894 0.00971084 0.0263658 0.135219 +EDGE3 1817 1818 -0.752244 7.85653 0.219354 -0.0110083 0.00080948 0.121152 +EDGE3 1816 1817 -0.613556 7.90055 -0.135437 0.0419799 0.0116236 0.154949 +EDGE3 1819 1820 -0.557105 7.88868 -0.0568595 -0.000570752 -0.0251284 0.144818 +EDGE3 1818 1819 -0.444548 7.65223 -0.0622384 0.0220599 0.0123457 0.142817 +EDGE3 1820 1821 -0.558478 7.77024 -0.154082 -0.0379633 -0.0458024 0.115681 +EDGE3 1821 1822 -0.552669 7.60146 -0.149529 -0.0335837 -0.00866322 0.12301 +EDGE3 1823 1824 -0.479236 7.74255 -0.0890336 0.0317214 0.0231099 0.138777 +EDGE3 1822 1823 -0.497872 7.68574 0.0731087 -0.0229599 0.0139356 0.140911 +EDGE3 1825 1826 -0.643607 7.70309 -0.151663 0.022961 -0.0264489 0.12192 +EDGE3 1824 1825 -0.66249 7.67649 -0.280377 0.0428323 0.0103799 0.0938533 +EDGE3 1827 1828 -0.454281 7.62164 -0.0463409 0.0252649 0.00227443 0.132087 +EDGE3 1826 1827 -0.561888 7.63463 0.0813791 0.0482654 0.036408 0.119062 +EDGE3 1829 1830 -0.486236 7.71437 -0.0874024 0.0133049 0.0269794 0.0979645 +EDGE3 1828 1829 -0.616636 7.6669 -0.0283236 0.00132114 -0.0330184 0.0576458 +EDGE3 1831 1832 -0.503936 7.46525 0.0265229 -0.049481 -0.00662286 0.101659 +EDGE3 1830 1831 -0.544641 7.70487 -0.0302348 0.00968046 0.0214385 0.129918 +EDGE3 1833 1834 -0.369273 7.65201 -0.147934 0.00180613 0.00814367 0.141954 +EDGE3 1832 1833 -0.612607 7.65591 0.000338277 0.0477223 0.0144674 0.116775 +EDGE3 1835 1836 -0.725499 7.63309 -0.0695771 0.0200752 -0.0240662 0.11843 +EDGE3 1834 1835 -0.710925 7.63661 -0.12204 -0.0177994 0.0460849 0.0986058 +EDGE3 1837 1838 -0.484545 7.3979 -0.0843257 0.0393262 -0.0135392 0.119364 +EDGE3 1836 1837 -0.76968 7.60858 -0.055365 -0.0261081 -0.0347166 0.111402 +EDGE3 1839 1840 -0.596747 7.58721 -0.160864 0.00423862 0.00205655 0.117602 +EDGE3 1838 1839 -0.676206 7.57469 -0.127567 0.0205093 -0.00760563 0.119678 +EDGE3 1840 1841 -0.540566 7.37722 -0.0365421 -0.0137144 -0.0236966 0.119016 +EDGE3 1841 1842 -0.56783 7.57108 -0.0170808 -0.00517779 -0.0323436 0.100381 +EDGE3 1842 1843 -0.816632 7.37883 -0.242684 -0.00891008 -0.0019314 0.14686 +EDGE3 1843 1844 -0.574793 7.39348 0.000207881 -0.0149629 0.0187528 0.128942 +EDGE3 1844 1845 -0.639812 7.52313 -0.0712206 -0.00746899 0.0135401 0.126963 +EDGE3 1845 1846 -0.516564 7.4524 -0.109927 -0.00617191 0.019503 0.144732 +EDGE3 1846 1847 -0.602926 7.43068 0.080351 0.0259564 -0.00846394 0.156553 +EDGE3 1847 1848 -0.744843 7.36491 -0.118338 -0.0152024 -0.00463471 0.115466 +EDGE3 1848 1849 -0.784863 7.27879 0.0796544 0.00714721 0.0256237 0.142206 +EDGE3 1849 1850 -0.790865 7.40565 -0.188289 -0.0350114 -0.00988119 0.145072 +EDGE3 1850 1851 -0.824957 7.36214 -0.126318 0.0285922 0.0149701 0.137677 +EDGE3 1851 1852 -0.697343 7.46488 -0.334852 0.00578286 -0.022918 0.137522 +EDGE3 1852 1853 -0.491588 7.14689 0.0288469 0.0148793 0.0028611 0.100779 +EDGE3 1853 1854 -0.492023 7.21562 -0.276767 -0.0264316 0.0274543 0.0795735 +EDGE3 1854 1855 -0.492999 7.37041 -0.0204402 -0.0153191 -0.00818353 0.139639 +EDGE3 1855 1856 -0.583586 7.28588 0.0692816 0.0482741 -0.00975336 0.173601 +EDGE3 1856 1857 -0.542649 7.19335 -0.055555 -0.0226198 0.0181123 0.153751 +EDGE3 1857 1858 -0.458883 7.154 -0.0709714 0.0149913 -0.0105976 0.0927687 +EDGE3 1858 1859 -0.708149 7.28573 -0.0596832 -0.0304885 -0.0132937 0.166873 +EDGE3 1859 1860 -0.469572 7.17958 0.0603819 0.00101145 0.0238537 0.140439 +EDGE3 1860 1861 -0.712995 7.37549 -0.0023453 0.0590481 -0.00796288 0.113657 +EDGE3 1861 1862 -0.695822 7.20255 -0.0793183 -0.0146376 0.0407952 0.148829 +EDGE3 1862 1863 -0.653343 7.10013 0.0480446 -0.00649662 0.00155642 0.0774294 +EDGE3 1863 1864 -0.421038 7.31658 0.0464421 -0.0429812 0.00391796 0.0835818 +EDGE3 1864 1865 -0.482741 7.21506 -0.145924 -0.0117366 -0.0502524 0.134296 +EDGE3 1865 1866 -0.462875 7.16726 -0.0646054 0.0229863 0.023502 0.107869 +EDGE3 1866 1867 -0.550954 7.12792 -0.00313669 0.0248844 -0.00718612 0.142472 +EDGE3 1867 1868 -0.627023 7.11465 0.183613 -0.0307109 -0.0131778 0.114119 +EDGE3 1868 1869 -0.566914 7.02341 -0.0171478 0.0715752 -0.00772276 0.111022 +EDGE3 1869 1870 -0.540516 7.0914 -0.200393 0.0164244 0.00535865 0.157917 +EDGE3 1870 1871 -0.598124 7.03068 -0.10254 0.00742962 -0.0159418 0.136031 +EDGE3 1871 1872 -0.529143 7.02926 -0.0606631 0.0496358 -0.000917296 0.137647 +EDGE3 1872 1873 -0.678895 7.0873 0.0317984 -0.0391698 0.0391945 0.128879 +EDGE3 1873 1874 -0.610457 7.08198 -0.157537 -0.0356447 -0.0123137 0.112108 +EDGE3 1874 1875 -0.411361 6.88049 0.0822774 0.0365559 -0.0248319 0.133273 +EDGE3 1875 1876 -0.483482 6.99332 -0.0991983 -0.0194078 0.0178814 0.145435 +EDGE3 1876 1877 -0.748537 7.05946 -0.185719 -0.0121376 -0.0249354 0.146576 +EDGE3 1877 1878 -0.44977 6.93113 -0.10735 -0.00825561 -0.00445305 0.159435 +EDGE3 1878 1879 -0.64854 6.98633 -0.171388 -0.0259558 -0.0057098 0.090701 +EDGE3 1879 1880 -0.733591 6.83706 -0.156914 0.0111935 0.0702085 0.104652 +EDGE3 1880 1881 -0.72918 7.05224 -0.042273 -0.0248102 0.0110796 0.150161 +EDGE3 1881 1882 -0.526627 6.86658 -0.243012 -0.0459226 0.0136922 0.101599 +EDGE3 1882 1883 -0.421446 6.93485 -0.160414 0.0227686 0.027115 0.129951 +EDGE3 1883 1884 -0.696787 7.05659 -0.0109707 0.0110354 -0.0158986 0.135579 +EDGE3 1884 1885 -0.540851 6.91019 -0.260604 -0.00144137 0.00926761 0.18409 +EDGE3 1885 1886 -0.257752 6.95582 -0.285759 0.0277204 0.017442 0.0912489 +EDGE3 1886 1887 -0.497657 6.69758 -0.10556 -0.00206537 -0.0379426 0.16344 +EDGE3 1887 1888 -0.641877 6.63517 -0.113503 0.0142757 0.00465219 0.152178 +EDGE3 1888 1889 -0.690905 6.90573 -0.049073 -0.010793 0.0515383 0.144111 +EDGE3 1889 1890 -0.578388 6.85599 -0.119272 0.00912032 0.0225459 0.132499 +EDGE3 1890 1891 -0.412337 6.94012 -0.0196423 -0.0085138 -0.0125884 0.109291 +EDGE3 1891 1892 -0.368362 6.84904 -0.0792601 -0.0209925 0.0073428 0.129688 +EDGE3 1892 1893 -0.516569 6.94656 0.0711192 -0.0097681 0.00523245 0.12667 +EDGE3 1893 1894 -0.567491 6.79457 -0.332485 -0.0024642 0.0298564 0.135783 +EDGE3 1894 1895 -0.479747 6.78196 -0.156684 0.00724659 0.00412863 0.1236 +EDGE3 1895 1896 -0.404523 6.8344 -0.00829495 0.00329313 0.0337603 0.128635 +EDGE3 1896 1897 -0.449896 6.82615 -0.122386 0.0658244 0.023348 0.161592 +EDGE3 1897 1898 -0.629848 6.52678 -0.1765 -0.0312836 0.0150351 0.157928 +EDGE3 1898 1899 -0.721029 6.59479 -0.0018331 -0.041782 -0.0101293 0.104508 +EDGE3 1899 1900 -0.482961 6.6938 -0.141305 -0.0107854 0.00633317 0.145487 +EDGE3 1900 1901 -0.636508 6.7001 -0.176703 0.0176969 0.0449217 0.130211 +EDGE3 1901 1902 -0.521729 6.69379 0.0221292 0.0118396 -0.0175751 0.121839 +EDGE3 1902 1903 -0.599245 6.55218 -0.160692 -0.0171311 -0.0256619 0.138851 +EDGE3 1903 1904 -0.602417 6.6389 -0.280088 0.00411982 -0.0034784 0.187328 +EDGE3 1904 1905 -0.405013 6.69431 -0.0213429 0.0125513 0.0178674 0.121182 +EDGE3 1905 1906 -0.673734 6.69019 -0.154756 0.0361362 -0.0245292 0.127328 +EDGE3 1906 1907 -0.694768 6.65434 -0.0382554 -0.0163453 0.0108215 0.121861 +EDGE3 1907 1908 -0.582602 6.6863 -0.107225 -0.0174115 0.0219284 0.149327 +EDGE3 1908 1909 -0.529598 6.57438 -0.165611 0.037633 0.0251834 0.122439 +EDGE3 1909 1910 -0.550003 6.49588 -0.131708 0.0347732 0.00820918 0.146815 +EDGE3 1910 1911 -0.604966 6.55066 -0.0576862 -0.0300207 0.00607614 0.0536557 +EDGE3 1911 1912 -0.519194 6.48382 -0.000380502 0.022061 0.00674755 0.176131 +EDGE3 1912 1913 -0.58462 6.54622 0.112154 0.0235749 0.0118063 0.139007 +EDGE3 1913 1914 -0.617625 6.49059 -0.148337 0.00535814 -0.00172524 0.129453 +EDGE3 1914 1915 -0.479683 6.62715 -0.080135 -0.0178309 -0.00365513 0.0875597 +EDGE3 1915 1916 -0.58749 6.70822 0.0847443 -0.0305741 0.00754548 0.129222 +EDGE3 1916 1917 -0.451042 6.48218 -0.0207604 0.018108 0.0189387 0.117504 +EDGE3 1917 1918 -0.391254 6.60939 -0.173592 0.0496346 0.0202329 0.0947357 +EDGE3 1918 1919 -0.392004 6.42854 -0.047911 0.00284509 -0.0178553 0.12102 +EDGE3 1919 1920 -0.3076 6.52029 -0.00805391 0.00960978 -0.00877807 0.111829 +EDGE3 1920 1921 -0.482137 6.50725 0.0133788 0.0128875 -0.0255452 0.145842 +EDGE3 1921 1922 -0.422145 6.36038 -0.146317 -0.0380725 -0.00340331 0.128358 +EDGE3 1922 1923 -0.628684 6.32894 -0.155959 -0.000589319 -0.00927705 0.090458 +EDGE3 1923 1924 -0.489771 6.38105 -0.0216703 -0.0315264 0.00371578 0.140759 +EDGE3 1924 1925 -0.472106 6.34225 -0.20346 0.00230964 0.018118 0.1366 +EDGE3 1925 1926 -0.516094 6.42739 -0.129203 0.0551955 -0.0316826 0.125383 +EDGE3 1926 1927 -0.313683 6.38208 -0.050251 -0.0169743 0.0259984 0.0812736 +EDGE3 1927 1928 -0.477272 6.2889 -0.0326432 0.00185164 0.0239854 0.148875 +EDGE3 1928 1929 -0.457734 6.37111 -0.0477562 -0.0254784 -0.0154525 0.11644 +EDGE3 1929 1930 -0.50595 6.45736 -0.0867234 -0.0517454 -0.0307942 0.157101 +EDGE3 1930 1931 -0.647519 6.18865 -0.167554 0.0337091 0.00535225 0.131821 +EDGE3 1931 1932 -0.417839 6.3653 -0.191163 -0.0250263 0.0148571 0.131897 +EDGE3 1932 1933 -0.368519 6.39371 0.0628883 0.00944716 0.00232136 0.136309 +EDGE3 1933 1934 -0.407855 6.22758 -0.208137 -0.00569539 -0.00339384 0.152747 +EDGE3 1934 1935 -0.522082 6.06436 -0.00142494 -0.029872 -0.0185306 0.158903 +EDGE3 1935 1936 -0.549863 6.27677 -0.156211 -0.00563626 -0.0254933 0.143366 +EDGE3 1936 1937 -0.620376 6.10427 0.0152066 -0.00857525 -0.0180701 0.130078 +EDGE3 1937 1938 -0.470794 6.18691 0.0259853 0.00828865 0.0259791 0.130076 +EDGE3 1938 1939 -0.656877 6.23153 -0.100291 0.026037 0.0110495 0.0894652 +EDGE3 1939 1940 -0.635102 6.26215 -0.1812 0.0141179 0.00524722 0.124909 +EDGE3 1940 1941 -0.29092 6.22965 -0.0967064 -0.00883403 -0.019549 0.106338 +EDGE3 1941 1942 -0.589252 6.19792 0.0795378 0.00113142 0.00466372 0.159739 +EDGE3 1942 1943 -0.494553 6.07509 0.125068 0.0333908 0.0240146 0.068152 +EDGE3 1943 1944 -0.523077 6.14972 0.0384974 0.0279524 -0.0172954 0.119458 +EDGE3 1944 1945 -0.611566 6.08104 -0.037546 0.00407767 -0.0236275 0.11156 +EDGE3 1945 1946 -0.429217 6.02741 -0.180638 0.0141882 -0.00131638 0.181681 +EDGE3 1946 1947 -0.546358 6.22259 -0.0712174 -0.0239666 0.011451 0.115811 +EDGE3 1947 1948 -0.562523 6.13647 -0.0875678 -0.0105486 -0.00541187 0.122796 +EDGE3 1948 1949 -0.472512 6.15933 0.0987717 0.00384033 0.00405963 0.104676 +EDGE3 1949 1950 -0.475066 6.06233 -0.102596 0.0299962 0.0314837 0.0969954 +EDGE3 1950 1951 -0.511935 6.096 -0.220851 -0.0213939 -0.0033149 0.133139 +EDGE3 1951 1952 -0.381362 6.09181 0.0147118 0.0123153 0.0129928 0.116547 +EDGE3 1952 1953 -0.493175 6.04878 0.00131681 -0.0263127 -0.0282194 0.133053 +EDGE3 1953 1954 -0.47168 6.02958 -0.0846494 -0.0310142 -0.0065865 0.113841 +EDGE3 1954 1955 -0.275485 5.98738 0.0365826 0.0246277 0.0271227 0.124561 +EDGE3 1955 1956 -0.348478 5.86413 0.0151256 0.00602854 -0.0440739 0.0823114 +EDGE3 1956 1957 -0.584079 5.82886 -0.0905523 -0.0779055 -0.0115231 0.112895 +EDGE3 1957 1958 -0.510719 5.71333 0.0859423 0.0481265 -0.00488138 0.166338 +EDGE3 1958 1959 -0.433647 5.88994 -0.0425325 0.00630578 0.00902273 0.0885019 +EDGE3 1959 1960 -0.530816 5.86674 -0.0648881 -0.0063362 -0.0147436 0.129832 +EDGE3 1960 1961 -0.304594 5.77582 -0.113258 -0.0409613 0.00897089 0.135249 +EDGE3 1961 1962 -0.674556 5.83977 0.0558007 0.0200031 -0.0266717 0.104946 +EDGE3 1962 1963 -0.535759 5.90929 -0.040472 -0.0127562 -0.0306056 0.120575 +EDGE3 1963 1964 -0.217277 5.60784 -0.152631 0.0201969 -0.0422482 0.138303 +EDGE3 1964 1965 -0.543294 5.76971 0.091288 -0.0136055 0.0222789 0.143091 +EDGE3 1965 1966 -0.360085 5.80105 0.0883711 -0.0380865 0.0073375 0.102164 +EDGE3 1966 1967 -0.364984 5.81232 0.0157722 -0.0173888 0.0388329 0.0916746 +EDGE3 1967 1968 -0.486811 5.79092 -0.188699 0.012606 0.0375289 0.135605 +EDGE3 1968 1969 -0.464428 5.81241 -0.0374998 0.00117953 -0.00249678 0.132459 +EDGE3 1969 1970 -0.53232 5.52107 -0.0579246 -0.0457853 0.0192236 0.127546 +EDGE3 1970 1971 -0.390767 5.82101 -0.240988 0.00989655 0.000650397 0.140344 +EDGE3 1971 1972 -0.476969 5.77308 -0.00352681 0.00546006 0.00573579 0.133397 +EDGE3 1972 1973 -0.587015 5.76284 0.0642154 0.00948602 0.00942862 0.132311 +EDGE3 1973 1974 -0.585743 5.54748 -0.110048 0.0671397 -0.0149584 0.132186 +EDGE3 1974 1975 -0.428105 5.78837 -0.128039 -0.00878907 0.0170606 0.116039 +EDGE3 1975 1976 -0.52385 5.64427 -0.10341 -0.0367064 -0.0184896 0.146108 +EDGE3 1976 1977 -0.488289 5.50558 -0.326557 0.00112729 -0.0106616 0.0851344 +EDGE3 1977 1978 -0.482771 5.59547 0.0791137 0.0258674 0.0283043 0.120395 +EDGE3 1978 1979 -0.391061 5.71276 -0.0322463 -0.0414818 0.024244 0.139271 +EDGE3 1979 1980 -0.702794 5.62131 -0.176999 -0.0226085 -0.0162185 0.162242 +EDGE3 1980 1981 -0.4975 5.6404 0.199187 -0.0115058 0.0311392 0.124026 +EDGE3 1981 1982 -0.427967 5.61673 0.124204 -0.0177554 0.054869 0.0853869 +EDGE3 1982 1983 -0.410515 5.77818 0.0865397 0.00134919 0.0120908 0.124951 +EDGE3 1983 1984 -0.343418 5.69079 -0.208926 0.00737766 0.00820264 0.129788 +EDGE3 1984 1985 -0.524235 5.44817 -0.125203 0.0226284 0.0001204 0.100746 +EDGE3 1985 1986 -0.514837 5.45277 -0.0772258 -0.00204544 -0.0158974 0.0850198 +EDGE3 1986 1987 -0.401212 5.50711 -0.244434 0.0454171 0.0344975 0.134734 +EDGE3 1987 1988 -0.448047 5.60183 -0.0694431 0.0077945 0.00634264 0.114974 +EDGE3 1989 1990 -0.521532 5.51511 -0.203855 -0.0175875 -0.0356895 0.148315 +EDGE3 1988 1989 -0.447219 5.70468 -0.117758 -0.0254064 -0.0530245 0.103838 +EDGE3 1991 1992 -0.612525 5.37322 0.106326 -0.0349751 0.0235161 0.102388 +EDGE3 1990 1991 -0.526438 5.57083 -0.102111 -0.0259494 -0.0107402 0.101864 +EDGE3 1993 1994 -0.504727 5.32919 -0.0139626 -0.0265182 0.0154989 0.136552 +EDGE3 1992 1993 -0.366157 5.40521 -0.0683859 -0.0408997 0.0262 0.0864175 +EDGE3 1995 1996 -0.500908 5.36918 -0.00902292 0.00719876 -0.0325022 0.134315 +EDGE3 1994 1995 -0.515844 5.30031 -0.0592006 -0.00689442 -0.0143751 0.114798 +EDGE3 1997 1998 -0.583692 5.25541 -0.0275784 -0.00180304 -0.0030146 0.100445 +EDGE3 1996 1997 -0.34656 5.2351 -0.115611 0.049704 -0.0620094 0.111174 +EDGE3 1999 2000 -0.547622 5.28742 -0.0284439 0.00042945 0.010526 0.0914189 +EDGE3 1998 1999 -0.474041 5.5418 -0.145192 -0.0659393 0.00513539 0.125029 +EDGE3 2001 2002 -0.312809 5.23361 -0.044017 0.0287767 0.0156405 0.145694 +EDGE3 2000 2001 -0.572651 5.37553 -0.0311355 -0.0204672 -0.0165423 0.118667 +EDGE3 2003 2004 -0.46431 5.33129 0.162549 -0.041681 -0.00440007 0.109217 +EDGE3 2002 2003 -0.390939 5.2792 -0.0299605 0.0249188 0.00263654 0.0925308 +EDGE3 2005 2006 -0.599122 5.21584 -0.0843733 0.0220407 -0.00558616 0.122876 +EDGE3 2004 2005 -0.310875 5.31006 0.105366 0.00588317 -0.0475671 0.121278 +EDGE3 2007 2008 -0.606692 5.02984 0.0140732 -0.0333321 -0.0208616 0.146249 +EDGE3 2006 2007 -0.505119 5.31184 -0.00702885 0.0145621 0.0144722 0.121631 +EDGE3 2009 2010 -0.544477 5.11131 -0.0141051 0.00774711 0.0299208 0.148513 +EDGE3 2008 2009 -0.515179 5.17657 0.0106107 -0.0524172 0.0129831 0.135736 +EDGE3 2011 2012 -0.399633 5.14524 -0.118435 0.00562244 -0.00326332 0.100216 +EDGE3 2010 2011 -0.519642 5.05966 -0.137022 -0.0101053 -0.015811 0.122661 +EDGE3 2013 2014 -0.373308 5.21712 -0.0576836 -0.0147453 -0.0226989 0.120168 +EDGE3 2012 2013 -0.249265 4.96769 -0.125062 0.0115382 -0.00502312 0.139843 +EDGE3 2015 2016 -0.354819 5.14559 -0.0329543 0.0237119 -0.0426784 0.0853697 +EDGE3 2014 2015 -0.398446 5.09908 -0.112416 -0.0310785 -0.0146828 0.0966568 +EDGE3 2017 2018 -0.440011 5.24708 0.0875014 -0.00646356 -0.0276751 0.109471 +EDGE3 2016 2017 -0.416948 4.97894 -0.0427855 0.0201379 0.0183188 0.0877941 +EDGE3 2019 2020 -0.542174 5.01498 -0.24226 0.0191092 -0.0269399 0.10241 +EDGE3 2018 2019 -0.429374 5.18693 -0.104807 -0.0218478 0.0118937 0.0939241 +EDGE3 2021 2022 -0.433611 5.05696 0.0452068 0.0500272 0.00608865 0.150643 +EDGE3 2020 2021 -0.338687 4.89056 0.0779519 -0.0432755 -0.0424353 0.137962 +EDGE3 2023 2024 -0.580713 4.85174 -0.0214444 -0.00537442 0.0299923 0.0852498 +EDGE3 2022 2023 -0.329746 4.95757 -0.0850476 0.0356472 -0.0221145 0.142208 +EDGE3 2025 2026 -0.49215 5.0963 -0.0883497 0.000909229 -0.0241072 0.124497 +EDGE3 2024 2025 -0.475041 5.03223 -0.0614471 -0.00086757 0.00342266 0.119408 +EDGE3 2027 2028 -0.42349 5.09462 -0.0390856 -0.0112489 0.050239 0.143096 +EDGE3 2026 2027 -0.507461 5.09471 0.0658235 0.0113328 0.00183257 0.102365 +EDGE3 2029 2030 -0.583709 4.91967 -0.110588 -0.0552586 -0.0124483 0.133408 +EDGE3 2028 2029 -0.318981 4.76875 -0.00648015 0.00477891 0.0324749 0.0966385 +EDGE3 2031 2032 -0.260634 4.79268 -0.0325196 0.0184041 0.024755 0.142562 +EDGE3 2030 2031 -0.482101 4.70613 0.0417364 0.00891472 -0.0286942 0.15621 +EDGE3 2033 2034 -0.454825 4.94776 0.0465314 0.00351966 0.0344107 0.0988248 +EDGE3 2032 2033 -0.516957 4.90376 -0.172098 -0.00464732 0.0156243 0.112177 +EDGE3 2035 2036 -0.439556 4.66194 0.0489877 0.0301647 0.0428953 0.0902943 +EDGE3 2034 2035 -0.507534 4.97008 -0.118139 0.00837736 -0.0371207 0.110429 +EDGE3 2037 2038 -0.389706 4.69751 -0.134574 -0.0213516 0.00112269 0.130692 +EDGE3 2036 2037 -0.408103 4.9473 0.0216892 0.00115213 0.0146561 0.119241 +EDGE3 2039 2040 -0.395351 4.8987 -0.248401 -0.00267135 -0.00223908 0.127113 +EDGE3 2038 2039 -0.321593 4.73296 0.0884741 -0.005992 -0.0301676 0.119422 +EDGE3 2041 2042 -0.421757 4.60352 -0.0621156 -0.000916826 0.0034686 0.114247 +EDGE3 2040 2041 -0.358396 4.52372 0.0908028 0.0171255 -0.0142731 0.124731 +EDGE3 2043 2044 -0.338578 4.71598 0.0592084 -0.0124516 0.0345618 0.132249 +EDGE3 2042 2043 -0.523519 4.90062 -0.0526348 0.0368997 0.00527632 0.154218 +EDGE3 2045 2046 -0.221895 4.69512 -0.119361 0.03271 -0.0129443 0.121912 +EDGE3 2044 2045 -0.44992 4.83419 -0.0365695 0.00394512 -0.00914366 0.125644 +EDGE3 2047 2048 -0.438778 4.65677 -0.0303755 -0.0145647 -0.00145236 0.104334 +EDGE3 2046 2047 -0.382569 4.67905 0.0149483 -0.0228594 -0.0394021 0.139759 +EDGE3 2049 2050 -0.376983 4.62465 -0.112158 -0.00979766 -0.0110348 0.147876 +EDGE3 2048 2049 -0.428095 4.63229 -0.179287 0.0346308 -0.0323035 0.115618 +EDGE3 2051 2052 -0.255441 4.63863 -0.0455181 0.0085658 -0.000388081 0.122786 +EDGE3 2050 2051 -0.472955 4.63599 0.0639244 0.0186395 -0.0238679 0.121089 +EDGE3 2053 2054 -0.498458 4.33483 0.0329605 0.0358891 -0.00674524 0.146459 +EDGE3 2052 2053 -0.528183 4.54758 -0.148431 -0.0153674 -0.0285004 0.134527 +EDGE3 2055 2056 -0.223668 4.32295 0.00821725 0.00449827 0.00690212 0.134715 +EDGE3 2054 2055 -0.564532 4.57377 -0.212894 0.00721899 0.0418787 0.104927 +EDGE3 2057 2058 -0.399334 4.47999 0.0335685 0.00223499 -0.0456975 0.159375 +EDGE3 2056 2057 -0.331414 4.49365 -0.0418413 0.0409293 -0.00435209 0.0483188 +EDGE3 2059 2060 -0.312336 4.31939 -0.0300159 0.00506485 -0.000735401 0.0932429 +EDGE3 2058 2059 -0.495439 4.4803 0.0142532 -0.00829215 0.0139699 0.151718 +EDGE3 2060 2061 -0.373709 4.51656 -0.247001 -0.0099552 0.00739603 0.121673 +EDGE3 2061 2062 -0.303543 4.47449 -0.0822246 0.0203961 0.0196796 0.106226 +EDGE3 2063 2064 -0.478755 4.4357 -0.0258076 0.0051342 0.0296656 0.145708 +EDGE3 2062 2063 -0.286471 4.37132 0.0697163 -0.043802 -0.00528043 0.149795 +EDGE3 2065 2066 -0.255043 4.47359 -0.0718906 -0.0172138 -0.0246145 0.112685 +EDGE3 2064 2065 -0.36699 4.36082 -0.120507 -0.00213403 -0.00880765 0.111823 +EDGE3 2067 2068 -0.539926 4.25985 0.037346 -0.0221291 0.0348844 0.108918 +EDGE3 2066 2067 -0.659544 4.37798 -0.0812727 0.0299449 -0.0307418 0.125229 +EDGE3 2069 2070 -0.246703 4.4746 -0.0252056 -0.00916487 -0.0204101 0.0861235 +EDGE3 2068 2069 -0.388155 4.24081 0.0138345 -0.0247264 -0.00521176 0.150454 +EDGE3 2071 2072 -0.242405 4.25616 0.0571753 0.0202348 -0.0360929 0.108214 +EDGE3 2070 2071 -0.422488 4.37786 -0.126737 -0.00262252 -0.0126008 0.0880332 +EDGE3 2073 2074 -0.586037 4.3634 0.0255608 0.0136325 -0.00934094 0.147259 +EDGE3 2072 2073 -0.483544 4.24506 -0.0127363 -0.0174106 -0.0285645 0.138677 +EDGE3 2075 2076 -0.50635 4.24873 -0.187114 0.0363163 0.0270832 0.125179 +EDGE3 2074 2075 -0.329825 4.37637 -0.0571882 0.0540096 -0.0123013 0.122029 +EDGE3 2077 2078 -0.458412 4.20437 -0.104977 -0.00444973 -0.00653571 0.120028 +EDGE3 2076 2077 -0.480937 4.12185 0.032162 -0.00906752 -0.0252135 0.132499 +EDGE3 2079 2080 -0.368506 4.3189 -0.112995 -0.0121304 0.00932147 0.0948559 +EDGE3 2078 2079 -0.383013 4.05359 -0.169534 -0.0172697 -0.00368956 0.174349 +EDGE3 2081 2082 -0.340467 4.0127 0.0683315 -0.021181 0.0288935 0.0792961 +EDGE3 2080 2081 -0.348399 4.00885 -0.0061549 -0.0127559 0.00532245 0.109732 +EDGE3 2083 2084 -0.355871 3.94276 0.0545487 -0.0279213 -0.0106175 0.151973 +EDGE3 2082 2083 -0.239076 4.21758 0.159709 -0.000660526 -0.00489396 0.106588 +EDGE3 2085 2086 -0.638831 4.13665 -0.0376657 0.00645468 -0.0493665 0.138198 +EDGE3 2084 2085 -0.206529 4.07329 -0.0644068 0.0483776 -0.00317396 0.119356 +EDGE3 2087 2088 -0.437943 4.12418 -0.0314736 -0.00410521 -0.0174836 0.0950981 +EDGE3 2086 2087 -0.385467 3.87543 0.00442321 0.00391159 -0.0333253 0.101732 +EDGE3 2088 2089 -0.233343 4.02357 0.126569 -0.00398826 -0.0105054 0.142584 +EDGE3 2089 2090 -0.345758 4.19701 0.209383 0.00710551 0.00594399 0.11812 +EDGE3 2091 2092 -0.523829 3.95018 0.12284 0.00384545 -0.00988734 0.128046 +EDGE3 2090 2091 -0.238709 4.114 0.0694156 0.0195278 0.0052906 0.0873507 +EDGE3 2093 2094 -0.468779 3.99719 0.00149628 -0.00136685 0.0242758 0.122566 +EDGE3 2092 2093 -0.357733 3.98815 -0.112344 -0.0113886 0.0165248 0.0811303 +EDGE3 2095 2096 -0.343115 4.02607 -0.179906 -0.00137142 -0.0141484 0.118193 +EDGE3 2094 2095 -0.152154 4.09628 -0.0128303 0.0472699 0.00169536 0.13308 +EDGE3 2097 2098 -0.397498 3.94481 -0.0399098 0.00785127 0.00815518 0.146541 +EDGE3 2096 2097 -0.561775 3.68276 0.0304805 -0.0129884 0.000657146 0.150934 +EDGE3 2099 2100 -0.262284 3.97534 -0.0708596 0.0468841 0.000787167 0.12766 +EDGE3 2098 2099 -0.344704 4.03312 0.0364982 0.0503092 0.0274198 0.0790719 +EDGE3 2101 2102 -0.243919 3.90218 -0.043411 -0.0121436 0.0551011 0.135513 +EDGE3 2100 2101 -0.300191 3.90584 -0.079496 0.00411474 -0.018062 0.141545 +EDGE3 2103 2104 -0.370023 3.71395 -0.173548 -0.00319332 0.0068217 0.143651 +EDGE3 2102 2103 -0.373436 3.62371 -0.240326 -0.0147725 0.00585939 0.14323 +EDGE3 2105 2106 -0.271121 3.59149 -0.00521158 -0.0318148 -0.0229441 0.111739 +EDGE3 2104 2105 -0.366994 3.97445 0.0286571 0.0187668 0.0398842 0.140562 +EDGE3 2107 2108 -0.300902 3.88135 0.157735 0.00257844 0.000842808 0.108121 +EDGE3 2106 2107 -0.310479 3.79284 -0.00865958 0.00319283 0.0272631 0.139212 +EDGE3 2108 2109 -0.36613 3.78291 -0.0780083 0.0160674 -0.0271713 0.188626 +EDGE3 2109 2110 -0.359845 3.62636 -0.124719 0.0391131 0.0195548 0.116916 +EDGE3 2110 2111 -0.457321 3.7129 0.00377192 0.0484372 0.0320785 0.143974 +EDGE3 2111 2112 -0.393646 3.6869 -0.195922 0.00921651 0.0175116 0.125097 +EDGE3 2112 2113 -0.519908 3.78778 -0.0644208 -0.0108008 0.0174971 0.157071 +EDGE3 2113 2114 -0.229349 3.73056 -0.0148032 -0.00745241 0.0414395 0.126361 +EDGE3 2114 2115 -0.193192 3.55246 -0.228516 0.012054 0.00408945 0.121099 +EDGE3 2115 2116 -0.222599 3.50787 0.144924 0.0322544 -0.00458533 0.12141 +EDGE3 2116 2117 -0.268603 3.68938 -0.0532237 -0.0752953 0.00907558 0.117842 +EDGE3 2117 2118 -0.260218 3.55967 -0.0645148 0.0284328 0.00849421 0.147603 +EDGE3 2118 2119 -0.227869 3.52706 -0.0112385 -0.0482244 0.00744426 0.150821 +EDGE3 2119 2120 -0.329455 3.61025 0.0568174 -0.0545829 -0.0375774 0.115223 +EDGE3 2120 2121 -0.367203 3.61667 0.0261338 0.0395744 0.0308126 0.133276 +EDGE3 2121 2122 -0.376642 3.58524 -0.0650613 -0.0226514 -0.0151484 0.123784 +EDGE3 2122 2123 -0.291807 3.35753 -0.0136846 -0.00368396 -0.0278952 0.175945 +EDGE3 2123 2124 -0.338772 3.4126 -0.100525 -0.0431838 0.0383965 0.135469 +EDGE3 2124 2125 -0.313579 3.46764 -0.0177514 -0.0140072 -0.00857195 0.158676 +EDGE3 2125 2126 -0.304983 3.38346 0.0359959 -0.0128374 0.00432931 0.113893 +EDGE3 2126 2127 -0.456496 3.55347 0.0258878 -0.00955113 -0.0165964 0.0751755 +EDGE3 2127 2128 -0.376412 3.65576 0.0795448 0.0160295 -0.01699 0.114707 +EDGE3 2128 2129 -0.447092 3.40566 0.00259089 0.015369 -0.00933781 0.17731 +EDGE3 2129 2130 -0.384177 3.16738 -0.0412008 0.0029327 -0.0381975 0.0848206 +EDGE3 2130 2131 -0.249144 3.46968 0.0772509 0.0287055 -0.0014407 0.128105 +EDGE3 2131 2132 -0.569481 3.30907 0.0223868 -0.0334409 -0.026451 0.128195 +EDGE3 2132 2133 -0.381632 3.46961 0.0168547 0.0112736 -0.0192883 0.097197 +EDGE3 2133 2134 -0.277535 3.43106 0.00162986 0.0682083 0.00622863 0.139186 +EDGE3 2134 2135 -0.257373 3.32976 0.0537254 0.0102248 0.0520881 0.150005 +EDGE3 2135 2136 -0.500683 3.21517 -0.00655658 0.00440678 -0.00835893 0.13689 +EDGE3 2136 2137 -0.425913 3.38135 -0.0464894 -0.0295259 -0.0156306 0.126458 +EDGE3 2137 2138 -0.411947 3.37001 -0.0941055 0.0247919 0.0101788 0.160034 +EDGE3 2138 2139 -0.350875 3.37953 0.127347 -0.00227724 0.0161401 0.0781318 +EDGE3 2139 2140 -0.290386 3.22483 -0.0888212 0.0354362 -0.0294238 0.154179 +EDGE3 2140 2141 -0.414677 3.41706 -0.0785646 0.0585221 -0.0273342 0.169193 +EDGE3 2141 2142 -0.304253 3.22849 0.0222473 -0.04485 -0.0197185 0.149429 +EDGE3 2142 2143 -0.570469 3.03762 0.172966 0.00238423 0.0143802 0.105794 +EDGE3 2143 2144 -0.276433 3.14283 -0.229714 -0.0590761 -0.000852069 0.153949 +EDGE3 2144 2145 -0.476828 3.14647 -0.00497408 0.0218346 -0.0221408 0.123277 +EDGE3 2145 2146 -0.354536 3.28295 -0.0673383 0.0172952 -0.0322631 0.119778 +EDGE3 2146 2147 -0.262497 3.24927 0.0242772 -0.0376368 -0.00202607 0.147035 +EDGE3 2147 2148 -0.183434 3.11527 0.0607952 0.0102891 0.00339872 0.115713 +EDGE3 2148 2149 -0.26609 3.00762 -0.012202 -0.0206214 -0.0135885 0.149266 +EDGE3 2149 2150 -0.28481 3.03301 0.0261367 -0.0371017 0.00796192 0.142538 +EDGE3 2150 2151 -0.271156 3.07781 -0.0783475 0.0269962 0.0313542 0.116099 +EDGE3 2151 2152 -0.350715 3.05003 0.100727 0.0355376 0.000180312 0.100613 +EDGE3 2152 2153 -0.460707 3.03847 0.198754 0.0328567 0.0279823 0.158516 +EDGE3 2153 2154 -0.139386 3.26386 -0.115362 0.0040301 -0.0393049 0.130678 +EDGE3 2154 2155 -0.244288 3.05564 -0.19253 0.0486173 0.00494355 0.140303 +EDGE3 2155 2156 -0.539936 3.00394 0.0253834 0.00264492 0.00972574 0.139272 +EDGE3 2156 2157 -0.193718 3.13855 0.0848396 -0.0132581 -0.00568187 0.101724 +EDGE3 2157 2158 -0.129617 2.90492 -0.082859 0.0105433 0.00975997 0.130277 +EDGE3 2158 2159 -0.385451 3.04461 0.011358 -0.00816929 -0.00439847 0.155419 +EDGE3 2159 2160 -0.274864 3.12992 0.0111191 0.00963108 -0.0225251 0.132072 +EDGE3 2160 2161 -0.188753 3.16129 0.0158772 0.0253924 -0.0101975 0.146565 +EDGE3 2161 2162 -0.303669 2.81564 -0.233823 0.0109381 0.0270462 0.132246 +EDGE3 2162 2163 -0.272499 3.02014 -0.200364 -0.0481388 0.00446362 0.0901503 +EDGE3 2163 2164 -0.416703 2.94702 -0.00709744 0.0684473 0.00750391 0.121027 +EDGE3 2164 2165 -0.28055 2.9404 -0.0983855 -0.0341548 0.0332497 0.135951 +EDGE3 2165 2166 -0.308037 2.93372 0.114088 0.00879064 0.0100941 0.104938 +EDGE3 2166 2167 -0.295054 2.72435 -0.0958041 -0.0418857 0.0141957 0.14019 +EDGE3 2167 2168 -0.336536 2.99512 0.0453042 0.0092147 -0.0395417 0.114873 +EDGE3 2168 2169 -0.485427 2.59407 0.0435769 0.0112219 0.024779 0.15133 +EDGE3 2169 2170 -0.397112 3.11285 0.0233423 0.0109822 0.0219091 0.112808 +EDGE3 2170 2171 -0.237364 2.69977 0.0251846 -0.00945971 -0.0867999 0.145593 +EDGE3 2171 2172 -0.216685 2.71949 0.0793537 0.0334259 -0.0287089 0.143025 +EDGE3 2172 2173 -0.196393 2.7068 -0.0747247 0.0203775 -0.0114432 0.117915 +EDGE3 2173 2174 -0.244509 2.80858 0.0917827 0.0611263 -0.0282318 0.103042 +EDGE3 2174 2175 -0.303928 2.70238 0.0834894 0.0116897 -0.0384431 0.125828 +EDGE3 2175 2176 -0.178839 2.63782 -0.114192 -0.0403661 0.0167718 0.16091 +EDGE3 2176 2177 -0.365693 2.67761 -0.090914 0.00431867 0.0300641 0.144282 +EDGE3 2177 2178 -0.573187 2.69333 0.0321854 0.0440861 0.0122099 0.137537 +EDGE3 2178 2179 -0.241427 2.75633 0.123438 0.0390555 0.0164026 0.0916524 +EDGE3 2179 2180 -0.412806 2.71437 -0.126052 -0.0193805 -0.0327717 0.120305 +EDGE3 2180 2181 -0.223389 2.55472 -0.119283 0.0181588 0.00205435 0.149626 +EDGE3 2181 2182 -0.438496 2.61804 -0.258022 -0.00743053 0.00181643 0.134271 +EDGE3 2182 2183 -0.312247 2.8061 0.0262284 0.0179308 -0.0371144 0.123919 +EDGE3 2183 2184 -0.333049 2.57089 -0.0434236 0.000387814 0.0338181 0.105089 +EDGE3 2184 2185 -0.418959 2.62445 -0.0485909 0.0104749 -0.00935471 0.0976884 +EDGE3 2185 2186 -0.320784 2.6523 -0.0805229 -0.0029181 -0.00459747 0.13705 +EDGE3 2186 2187 -0.359886 2.77581 -0.00102536 0.0144222 0.0438116 0.174932 +EDGE3 2187 2188 -0.464076 2.37126 0.0230619 0.0403605 -0.00636144 0.13897 +EDGE3 2188 2189 -0.231647 2.50154 0.0574979 -0.0312312 0.0288644 0.137979 +EDGE3 2189 2190 -0.18352 2.52334 0.0630677 0.0412319 0.0183486 0.0894673 +EDGE3 2190 2191 -0.220055 2.49616 -0.0719331 0.022317 0.00697179 0.0780407 +EDGE3 2191 2192 -0.291871 2.36747 -0.0549767 0.0059337 -0.0266488 0.166061 +EDGE3 2192 2193 -0.363183 2.56969 -0.195767 -0.0486885 -0.0341254 0.0787843 +EDGE3 2193 2194 -0.396833 2.4404 -0.13062 0.00521292 0.0444312 0.151497 +EDGE3 2194 2195 -0.102905 2.33035 0.165493 0.00611316 0.0822779 0.147485 +EDGE3 2195 2196 -0.33889 2.47023 -0.0753643 -0.0130358 -0.00694314 0.107615 +EDGE3 2196 2197 -0.256704 2.42585 -0.0648995 -0.00503635 -0.0451276 0.102136 +EDGE3 2197 2198 -0.218847 2.29165 -0.00149348 0.0236019 0.00647133 0.133826 +EDGE3 2198 2199 -0.305947 2.28296 -0.0741077 0.00690545 -0.018478 0.123715 +EDGE3 0 50 6.11972 -0.00893354 -1.37462 -0.00140696 6.3417e-06 -0.00254705 +EDGE3 1 51 6.11514 -0.00290397 -1.38349 0.00562235 -0.00768984 0.00161913 +EDGE3 0 51 6.04391 3.14356 -1.41259 -0.00644228 0.00357308 0.131948 +EDGE3 1 50 5.83111 -3.10491 -1.36611 0.00458924 -0.000677471 -0.126733 +EDGE3 2 52 6.11412 0.00711414 -1.38086 -0.0015433 -0.00486572 -0.00645222 +EDGE3 1 52 6.03837 3.14063 -1.4057 0.00246388 0.000846598 0.131307 +EDGE3 2 51 5.80837 -3.12404 -1.34349 0.00367301 0.0142587 -0.115736 +EDGE3 3 53 6.12942 -0.0133073 -1.38707 0.000990927 0.00270694 -0.00150327 +EDGE3 2 53 6.05655 3.16355 -1.41058 -0.00499746 0.00859955 0.126062 +EDGE3 3 52 5.82319 -3.15449 -1.35521 0.0147945 -0.00398036 -0.120132 +EDGE3 4 54 6.1255 0.00296309 -1.38875 0.00235303 0.0027581 -0.00705106 +EDGE3 3 54 6.04319 3.1786 -1.41531 -0.00338597 0.000143261 0.126311 +EDGE3 4 53 5.80413 -3.14468 -1.36569 0.0105311 0.00455924 -0.125827 +EDGE3 5 55 6.12837 -0.0153614 -1.4065 0.00249087 -0.00194728 -0.0111866 +EDGE3 4 55 6.04289 3.18862 -1.43 0.00205797 -0.00614753 0.129514 +EDGE3 5 54 5.80003 -3.17592 -1.38066 -0.000825679 0.00145031 -0.137231 +EDGE3 6 56 6.12002 0.00234157 -1.43075 -0.00293303 -0.00241829 0.00800579 +EDGE3 5 56 6.03108 3.20151 -1.43091 0.00652512 0.000165788 0.125585 +EDGE3 6 55 5.79982 -3.19297 -1.37245 -0.00357574 -0.00680968 -0.113685 +EDGE3 7 57 6.12028 -0.00529645 -1.42844 0.00130073 -0.00793789 -0.00970794 +EDGE3 6 57 6.03646 3.2089 -1.4581 0.00614243 0.000840213 0.129426 +EDGE3 7 56 5.81089 -3.2101 -1.37476 -0.00116205 -0.00471664 -0.124446 +EDGE3 8 58 6.11394 -0.000244263 -1.41543 0.000683067 0.0069321 -0.00233103 +EDGE3 7 58 6.02528 3.24551 -1.46555 0.00215408 0.000398194 0.11986 +EDGE3 8 57 5.79834 -3.22258 -1.39436 0.00597684 -0.00685523 -0.128387 +EDGE3 9 59 6.11751 -0.00272915 -1.45837 -0.000896292 -0.00206561 0.00685052 +EDGE3 8 59 6.04778 3.25214 -1.46288 0.00084791 -0.00624071 0.115623 +EDGE3 9 58 5.799 -3.22677 -1.41648 0.00454012 0.00362566 -0.119379 +EDGE3 10 60 6.11508 0.00822253 -1.44906 0.00104493 -0.00745347 0.00189926 +EDGE3 9 60 6.02311 3.26098 -1.47035 -0.00682864 -0.00234109 0.118316 +EDGE3 10 59 5.7731 -3.24279 -1.42359 0.00105967 0.000812415 -0.119723 +EDGE3 11 61 6.11224 0.00529221 -1.45051 0.00509044 -0.000526403 0.00150985 +EDGE3 10 61 6.03088 3.27506 -1.4833 -0.00302734 0.00680906 0.125786 +EDGE3 11 60 5.78424 -3.27257 -1.44272 0.00453576 -0.00700791 -0.125021 +EDGE3 12 62 6.12548 0.00963191 -1.46432 -0.00217819 -0.00739997 0.00954359 +EDGE3 11 62 6.02053 3.30247 -1.49029 0.00278748 0.00433126 0.124884 +EDGE3 12 61 5.76208 -3.28478 -1.44483 0.00288805 0.000449133 -0.124563 +EDGE3 13 63 6.11576 0.00464429 -1.46125 -0.0100611 -7.30015e-06 -0.00366677 +EDGE3 12 63 6.03592 3.32433 -1.4844 -0.00393364 3.32169e-05 0.132115 +EDGE3 13 62 5.77712 -3.29756 -1.43531 -0.00652166 -0.000168746 -0.124441 +EDGE3 14 64 6.10133 0.00519366 -1.51067 -0.00302036 0.00457974 -0.000642689 +EDGE3 13 64 6.013 3.34303 -1.48952 -0.00553703 0.00135806 0.132571 +EDGE3 14 63 5.7757 -3.31015 -1.45119 -0.00138074 -0.0050302 -0.132279 +EDGE3 15 65 6.1119 -0.00885476 -1.50807 0.0010952 0.00259957 0.00385277 +EDGE3 14 65 6.00864 3.3564 -1.50614 -0.00112172 0.000604592 0.125188 +EDGE3 15 64 5.79546 -3.3311 -1.46713 -0.0108716 0.00233333 -0.126937 +EDGE3 16 66 6.09882 -0.00194252 -1.48662 -0.00167374 0.00665682 -0.00701816 +EDGE3 15 66 6.01572 3.34859 -1.52163 -0.00744685 0.00471465 0.126111 +EDGE3 16 65 5.77986 -3.35107 -1.47069 -0.000120601 0.00345986 -0.133812 +EDGE3 17 67 6.0892 0.00632952 -1.50137 -0.00515412 -0.00577457 0.00138417 +EDGE3 16 67 5.99839 3.38152 -1.52469 -0.00981933 0.00375253 0.121643 +EDGE3 17 66 5.77988 -3.37061 -1.46554 -0.00703118 0.00220301 -0.126292 +EDGE3 18 68 6.0957 0.00274021 -1.50315 0.0107457 0.00405349 0.00166667 +EDGE3 18 67 5.76555 -3.37926 -1.47646 -0.00831819 -0.00163993 -0.123521 +EDGE3 17 68 6.00516 3.38432 -1.52743 -0.00341189 -0.00293382 0.122562 +EDGE3 18 69 6.02081 3.41336 -1.55061 -0.0039215 0.000497732 0.120386 +EDGE3 19 69 6.09289 -0.0010636 -1.53527 -0.00434216 -0.0137288 0.00504408 +EDGE3 19 68 5.75096 -3.38374 -1.47753 -8.92084e-05 -0.0043936 -0.131904 +EDGE3 20 70 6.10776 -0.00165257 -1.52364 -0.00502246 -0.000853576 0.00452281 +EDGE3 20 69 5.75619 -3.41027 -1.47674 -0.000916691 0.00178291 -0.128619 +EDGE3 19 70 5.98449 3.41518 -1.53642 -0.00138635 -0.00702438 0.114834 +EDGE3 20 71 5.99928 3.42898 -1.53952 0.00496064 -0.00126123 0.117708 +EDGE3 21 71 6.1032 0.0020736 -1.5429 -0.00231419 -0.00209502 0.000297051 +EDGE3 21 70 5.7523 -3.42038 -1.49199 0.00313763 -0.00434981 -0.139778 +EDGE3 22 72 6.07901 0.00524933 -1.55217 -0.00042224 -0.00118569 -0.00240268 +EDGE3 22 71 5.76198 -3.44653 -1.49968 -0.00275238 -0.00466739 -0.1245 +EDGE3 21 72 5.99484 3.45407 -1.5764 0.00163465 -0.00991686 0.128759 +EDGE3 22 73 6.0027 3.45738 -1.56607 -0.0158309 -0.00836225 0.127586 +EDGE3 23 73 6.10082 0.0114996 -1.55869 -0.00459807 -0.00377348 -0.00275574 +EDGE3 23 72 5.74655 -3.437 -1.51677 -0.000104165 -0.00350296 -0.134412 +EDGE3 24 74 6.08705 -0.00174821 -1.5618 0.00225707 -0.0107219 -0.00484899 +EDGE3 24 73 5.74605 -3.46888 -1.53533 -0.00455136 -0.00164241 -0.113423 +EDGE3 23 74 6.00632 3.4872 -1.56678 0.00647538 -0.00825944 0.133528 +EDGE3 24 75 5.97269 3.49694 -1.5782 -0.00413921 0.00183854 0.128583 +EDGE3 25 75 6.08548 0.00644914 -1.56033 -0.00112687 0.00895353 0.00810095 +EDGE3 26 76 6.07292 0.0116776 -1.57593 0.00170253 0.00572192 -0.00189936 +EDGE3 25 74 5.74968 -3.4811 -1.5236 0.0031843 -0.00310187 -0.122483 +EDGE3 26 75 5.73831 -3.47876 -1.53688 0.00175372 0.00917918 -0.129456 +EDGE3 25 76 5.98043 3.49578 -1.6028 -0.00283601 -0.00217983 0.125177 +EDGE3 26 77 6.00535 3.51437 -1.60966 0.00406358 0.000828482 0.120604 +EDGE3 27 77 6.07569 -0.0167229 -1.58397 -0.00690304 -0.00266619 -0.00204782 +EDGE3 28 78 6.05775 -0.0026225 -1.58506 -0.00134303 0.00626699 0.00460407 +EDGE3 27 76 5.74584 -3.50261 -1.53829 0.00392433 0.0013632 -0.125453 +EDGE3 28 77 5.73282 -3.5292 -1.55189 0.006444 -0.000873506 -0.128736 +EDGE3 27 78 5.97786 3.55065 -1.64091 0.000196978 -0.00241483 0.114408 +EDGE3 29 79 6.07839 0.00871151 -1.60479 0.000653261 0.00125151 -0.00440816 +EDGE3 28 79 5.95552 3.56276 -1.60466 0.000431372 -0.00350532 0.128129 +EDGE3 30 80 6.07887 -0.000467234 -1.59729 -0.0050971 0.00315035 -0.00538498 +EDGE3 29 78 5.7384 -3.53912 -1.55937 -0.0146235 0.0096842 -0.123732 +EDGE3 30 79 5.74311 -3.54913 -1.58299 0.00400892 0.00381975 -0.124435 +EDGE3 29 80 5.97867 3.55793 -1.63818 3.63498e-05 0.00167426 0.122272 +EDGE3 30 81 5.97535 3.58252 -1.63017 -0.0104082 -0.00788805 0.133384 +EDGE3 31 81 6.07709 0.00789514 -1.63126 0.00235593 -0.00263501 0.00452326 +EDGE3 31 80 5.74026 -3.56241 -1.5681 -0.00137377 0.00602363 -0.122371 +EDGE3 32 82 6.09127 -0.00170803 -1.62439 0.000905333 0.00893894 -0.00543269 +EDGE3 32 81 5.70358 -3.58975 -1.58553 0.00460823 0.00443611 -0.120746 +EDGE3 31 82 5.97333 3.60952 -1.66157 -0.00745494 0.00936585 0.118701 +EDGE3 32 83 5.95712 3.61499 -1.65999 0.0100373 0.00615694 0.127332 +EDGE3 33 83 6.07521 0.0215373 -1.61475 -0.00378559 -0.0106738 -0.000936307 +EDGE3 34 84 6.06661 0.0131072 -1.6243 0.00127815 -0.00414332 -0.00297664 +EDGE3 33 82 5.72509 -3.61366 -1.60653 0.00670891 0.0023183 -0.127472 +EDGE3 34 83 5.70783 -3.62572 -1.60243 -0.0117971 -0.000496231 -0.122681 +EDGE3 33 84 5.95487 3.6237 -1.64215 -0.00381053 0.00197684 0.130719 +EDGE3 34 85 5.96025 3.63742 -1.6773 0.00298356 -0.00661316 0.123014 +EDGE3 35 85 6.06855 -0.00601976 -1.64585 -0.00306934 -0.00628035 0.00914347 +EDGE3 36 86 6.0482 -0.00545503 -1.63736 0.0058088 0.00763211 -0.00139153 +EDGE3 35 84 5.71811 -3.61977 -1.59417 0.00619054 0.0013204 -0.131927 +EDGE3 36 85 5.69827 -3.64089 -1.61004 0.00619133 -0.00274829 -0.120178 +EDGE3 35 86 5.95059 3.68645 -1.67028 0.00463549 -0.00507429 0.124095 +EDGE3 36 87 5.91882 3.68691 -1.66845 -0.00539114 0.00509546 0.121941 +EDGE3 37 87 6.04133 -0.00512753 -1.66253 0.0110282 0.00265496 0.00291036 +EDGE3 37 86 5.71234 -3.65366 -1.61589 0.00118313 0.000680967 -0.119826 +EDGE3 38 88 6.05637 0.00572577 -1.66459 -0.00109847 0.00202454 -0.00201039 +EDGE3 38 87 5.71034 -3.67735 -1.63441 0.00167769 -0.00181151 -0.123806 +EDGE3 37 88 5.96495 3.68893 -1.68873 -0.00201893 0.000114073 0.119409 +EDGE3 38 89 5.93434 3.69993 -1.68917 -0.00450868 0.00357424 0.124044 +EDGE3 39 89 6.05151 0.00204118 -1.65308 -0.00337722 -0.00555212 0.00190195 +EDGE3 40 90 6.05717 0.00215565 -1.67535 -0.00314402 0.00164513 -0.00262336 +EDGE3 39 88 5.70599 -3.69934 -1.62652 0.0115456 0.00480078 -0.126253 +EDGE3 40 89 5.70788 -3.71013 -1.6514 0.00160722 0.0126867 -0.116163 +EDGE3 39 90 5.96413 3.73711 -1.71614 0.00282817 0.00199093 0.116416 +EDGE3 41 91 6.02996 0.00340548 -1.6772 -0.00172707 -0.00578159 4.41152e-05 +EDGE3 40 91 5.94827 3.74233 -1.72612 0.00544204 -0.000112154 0.131835 +EDGE3 42 92 6.04331 -5.52922e-05 -1.67095 -0.00376112 0.00836861 -0.00166795 +EDGE3 41 90 5.69804 -3.71125 -1.64371 -0.00187847 -0.00113179 -0.124437 +EDGE3 42 91 5.70507 -3.74148 -1.652 -0.00256422 0.00467398 -0.128983 +EDGE3 41 92 5.93401 3.74396 -1.72775 -0.00230964 -0.0118949 0.121803 +EDGE3 43 93 6.04352 0.0112597 -1.69363 -0.00176643 -0.00236959 -0.00114396 +EDGE3 42 93 5.93332 3.75536 -1.72847 -0.00972283 0.0128125 0.131137 +EDGE3 43 92 5.70351 -3.74262 -1.65159 -0.00610045 0.00014783 -0.127868 +EDGE3 44 94 6.0404 -0.00701323 -1.71356 -0.012758 0.00297533 0.00231851 +EDGE3 44 93 5.66988 -3.75656 -1.66603 -0.00108493 0.00543821 -0.123818 +EDGE3 43 94 5.9224 3.8029 -1.75138 0.00756069 -0.00963278 0.126029 +EDGE3 45 95 6.0476 -0.00331057 -1.70741 -0.000275016 -0.000828961 -0.00885021 +EDGE3 44 95 5.92909 3.80093 -1.74291 0.00392362 -0.00517788 0.123572 +EDGE3 45 94 5.69054 -3.78947 -1.64988 -0.0043428 0.00497947 -0.121811 +EDGE3 46 96 6.04318 -0.0154277 -1.71302 0.00101432 0.000319837 0.00350709 +EDGE3 46 95 5.69722 -3.799 -1.68612 0.000737577 -0.0052598 -0.133251 +EDGE3 45 96 5.91098 3.8227 -1.74532 -0.00510277 0.00123765 0.128198 +EDGE3 47 97 6.02878 -0.000466955 -1.73518 0.00200047 -0.00280864 0.00639932 +EDGE3 46 97 5.94027 3.82516 -1.75217 0.00133727 -0.00438804 0.123545 +EDGE3 47 96 5.68469 -3.80975 -1.69467 0.00501961 0.00298858 -0.121042 +EDGE3 48 98 6.02799 -0.0078803 -1.73595 -0.00298315 -0.00249077 -0.00261699 +EDGE3 48 97 5.67953 -3.82498 -1.69742 0.00200933 0.00482214 -0.121903 +EDGE3 47 98 5.92121 3.83587 -1.78062 -0.00859352 0.0102645 0.12717 +EDGE3 48 99 5.89924 3.83969 -1.76523 0.00296935 -0.00170359 0.126294 +EDGE3 49 99 6.03454 0.0159482 -1.75145 -0.00398306 0.00322142 -0.00156115 +EDGE3 49 98 5.66837 -3.83309 -1.69796 -0.0101816 0.00165774 -0.134616 +EDGE3 50 100 6.0531 0.00240527 -1.75145 0.00411842 -0.00588856 0.00643063 +EDGE3 50 99 5.68042 -3.87551 -1.72859 0.00930807 -0.00118271 -0.125911 +EDGE3 49 100 5.91226 3.88987 -1.77621 -0.00225962 -0.00787795 0.122022 +EDGE3 51 101 6.03686 0.000657682 -1.76089 0.00628174 -0.00268936 -0.000874877 +EDGE3 50 101 5.91108 3.90306 -1.79918 0.00509332 0.00471123 0.123859 +EDGE3 51 100 5.66957 -3.87177 -1.72535 0.00669151 0.00645065 -0.121051 +EDGE3 51 102 5.8956 3.89896 -1.80576 -0.000906502 0.00182485 0.127674 +EDGE3 52 102 6.03728 0.021938 -1.77295 -0.000403002 -0.00384297 0.0103737 +EDGE3 53 103 6.03234 0.00942228 -1.7609 0.0014608 0.00436922 -0.00697081 +EDGE3 52 101 5.67377 -3.89812 -1.71417 -0.00393782 0.000205524 -0.119897 +EDGE3 53 102 5.6672 -3.89522 -1.7396 -0.00551343 0.00523723 -0.124743 +EDGE3 52 103 5.89539 3.93757 -1.80931 -0.00399877 -0.0026882 0.124382 +EDGE3 53 104 5.90106 3.92763 -1.8006 -0.00652602 0.00963387 0.125856 +EDGE3 54 104 6.00989 0.00351003 -1.77361 0.0105765 0.00178354 0.00350889 +EDGE3 54 103 5.65164 -3.91323 -1.75306 -0.00385172 -0.000520094 -0.129294 +EDGE3 55 105 6.03449 -0.0101708 -1.78792 -0.00157436 0.000837582 -0.00612044 +EDGE3 55 104 5.64169 -3.92853 -1.74457 0.000971946 -0.00204357 -0.12908 +EDGE3 54 105 5.88807 3.94929 -1.82509 -0.00351371 0.0021823 0.134014 +EDGE3 55 106 5.896 3.94648 -1.83918 0.00229979 0.00462339 0.124973 +EDGE3 56 106 6.01795 0.000289357 -1.7949 -0.00407186 -0.00126609 0.000479507 +EDGE3 56 105 5.64194 -3.95722 -1.76479 0.00367483 -0.000108103 -0.129101 +EDGE3 57 107 6.01889 -0.00401374 -1.79805 0.00417964 0.00311521 -0.00731797 +EDGE3 56 107 5.89403 3.98321 -1.82501 -0.000395498 7.39681e-05 0.128587 +EDGE3 57 106 5.64834 -3.97073 -1.7447 -0.00821173 0.00201262 -0.128365 +EDGE3 58 108 6.00971 0.00320372 -1.81931 -0.00322353 -0.00254353 -0.00357634 +EDGE3 57 108 5.87502 3.9924 -1.84262 -0.00681329 0.00478126 0.131855 +EDGE3 58 107 5.63614 -3.98315 -1.7678 -0.00297391 0.00084563 -0.122423 +EDGE3 59 109 6.01502 0.00367891 -1.83032 0.00405322 0.00170815 0.0102004 +EDGE3 58 109 5.88189 4.00595 -1.8665 -0.00139562 0.000522079 0.1347 +EDGE3 59 108 5.63889 -3.97906 -1.7831 0.00571502 0.00510993 -0.128205 +EDGE3 60 110 6.01105 0.00486262 -1.83422 -0.00457399 -0.00937262 0.00465961 +EDGE3 59 110 5.87321 4.04018 -1.85452 -0.00305856 -0.00302085 0.116906 +EDGE3 60 109 5.65083 -3.99674 -1.78317 0.00636851 0.00326326 -0.130214 +EDGE3 61 111 5.99294 -0.00403463 -1.84267 -2.53093e-05 -0.00461734 0.0045153 +EDGE3 60 111 5.86589 4.03051 -1.86926 0.00811962 -0.00179903 0.131346 +EDGE3 61 110 5.63079 -4.03171 -1.78604 -0.00751893 0.00848692 -0.132133 +EDGE3 62 112 6.00123 -0.0225977 -1.86017 0.00639095 0.00361916 0.00858639 +EDGE3 61 112 5.86269 4.05155 -1.86056 -0.00168688 -0.00519357 0.132769 +EDGE3 62 111 5.63413 -4.04472 -1.81469 -0.00271435 0.00562838 -0.11943 +EDGE3 63 113 6.01285 0.0024979 -1.84839 0.00125242 -0.00745156 0.00238935 +EDGE3 62 113 5.86038 4.06022 -1.89464 0.00866457 0.00730321 0.11955 +EDGE3 63 112 5.62836 -4.04302 -1.80749 -0.00462706 0.00052154 -0.135054 +EDGE3 64 114 6.00514 0.0107073 -1.8577 -0.00246795 0.00661229 -0.00271618 +EDGE3 63 114 5.85389 4.08625 -1.89571 -0.0016836 0.000585519 0.123909 +EDGE3 64 113 5.6221 -4.05993 -1.80437 -0.00357727 0.00397533 -0.130237 +EDGE3 65 115 5.97423 -0.00124733 -1.86892 0.0107997 6.49482e-06 0.00278011 +EDGE3 64 115 5.8562 4.10172 -1.89133 -0.00358338 0.00653456 0.120558 +EDGE3 65 114 5.61346 -4.09308 -1.84484 -0.00176369 -0.00548107 -0.128441 +EDGE3 66 116 6.00761 0.00534811 -1.88 -0.00550347 0.00739692 0.00235886 +EDGE3 65 116 5.85984 4.10187 -1.915 -0.00295189 0.00231472 0.129399 +EDGE3 66 115 5.63176 -4.10504 -1.82524 0.00137605 0.000780177 -0.127757 +EDGE3 67 117 5.98894 0.00877832 -1.88028 0.0030903 0.00068311 -0.0034402 +EDGE3 66 117 5.8582 4.12491 -1.89571 -0.000927213 -0.00216092 0.122863 +EDGE3 67 116 5.60413 -4.11751 -1.83832 -0.00945141 -0.00607642 -0.133117 +EDGE3 68 118 5.98853 -0.0199316 -1.888 -1.72056e-05 0.00215641 -0.000416189 +EDGE3 67 118 5.85264 4.13973 -1.9045 0.00249698 0.00152702 0.118707 +EDGE3 68 117 5.60264 -4.1509 -1.84876 0.00502446 0.000825705 -0.116886 +EDGE3 69 119 5.98526 -0.00951125 -1.88391 -0.00183865 -0.00276394 -0.00258148 +EDGE3 68 119 5.86141 4.15074 -1.91434 0.00725971 0.00326193 0.122789 +EDGE3 69 118 5.6027 -4.13985 -1.86089 -0.00364568 0.00598778 -0.121289 +EDGE3 70 120 5.99651 -0.00380666 -1.89442 0.00373236 0.00828163 0.0101294 +EDGE3 69 120 5.84588 4.1912 -1.93315 0.000848833 -0.0051159 0.128787 +EDGE3 70 119 5.6231 -4.16327 -1.86491 -0.00587796 0.00178752 -0.128629 +EDGE3 71 121 5.98972 0.00592975 -1.90604 0.00502805 0.00442367 0.00408159 +EDGE3 70 121 5.84565 4.17928 -1.92629 -3.7778e-05 0.00844592 0.126213 +EDGE3 71 120 5.61305 -4.16728 -1.85273 0.000778363 0.000255474 -0.12405 +EDGE3 72 122 5.97803 -0.0122998 -1.9405 -0.00469539 -0.00196644 -0.000187522 +EDGE3 71 122 5.82896 4.21127 -1.96047 0.00158939 -0.000391047 0.129698 +EDGE3 72 121 5.61647 -4.19136 -1.87703 0.00110015 -0.00156968 -0.133313 +EDGE3 73 123 5.97932 -0.000350682 -1.92511 -0.00190039 0.00754586 -0.000459796 +EDGE3 72 123 5.82336 4.21635 -1.96844 -0.00818846 -0.00331346 0.130343 +EDGE3 73 122 5.59325 -4.19327 -1.88537 0.0067114 0.0010906 -0.129288 +EDGE3 74 124 5.97536 0.005986 -1.90834 0.0071056 -0.00584422 -0.00740203 +EDGE3 73 124 5.83579 4.23927 -1.98399 -0.000376386 0.00294787 0.119293 +EDGE3 74 123 5.59857 -4.21007 -1.89681 0.000835168 0.00501631 -0.124868 +EDGE3 75 125 5.97123 0.000836197 -1.92828 0.0033444 -0.000389582 0.0035775 +EDGE3 74 125 5.82021 4.22932 -1.95624 -0.000652997 0.00174419 0.120155 +EDGE3 75 124 5.58109 -4.23365 -1.89523 0.00211956 -0.0025085 -0.128198 +EDGE3 76 126 5.97962 -0.00338912 -1.93769 0.00724903 0.00673398 -0.000199736 +EDGE3 75 126 5.81015 4.2486 -1.97798 0.00126694 -0.00140472 0.126549 +EDGE3 76 125 5.56677 -4.25114 -1.91582 0.00538321 -0.00431924 -0.129771 +EDGE3 77 127 5.96511 0.00893781 -1.95147 -0.000695422 0.00851389 -0.00629203 +EDGE3 76 127 5.82324 4.25904 -1.98487 -0.00768402 0.00276818 0.132595 +EDGE3 77 126 5.58485 -4.25162 -1.92233 -0.0054113 -0.000870646 -0.126026 +EDGE3 78 128 5.96684 0.0106055 -1.96988 -0.00468598 -0.00565406 0.00478326 +EDGE3 77 128 5.80221 4.29024 -2.01328 0.00199218 -0.00993031 0.128122 +EDGE3 78 127 5.58807 -4.2686 -1.92474 0.00301168 0.00879572 -0.122302 +EDGE3 79 129 5.97656 0.00365134 -1.96406 -0.00398241 0.000860163 0.00169638 +EDGE3 78 129 5.81543 4.32468 -2.00892 -0.00374706 -0.00115868 0.120855 +EDGE3 79 128 5.57724 -4.27281 -1.90963 0.00618196 -0.0020938 -0.131176 +EDGE3 80 130 5.96562 -0.00161367 -1.97003 0.00411857 -0.00158802 -0.00244967 +EDGE3 79 130 5.82018 4.31862 -2.01151 -0.00211037 0.0165855 0.129756 +EDGE3 80 129 5.56852 -4.3028 -1.91962 0.0025639 -0.00394968 -0.120306 +EDGE3 81 131 5.94521 0.0162818 -1.9948 -0.00172237 0.000865583 -0.00260826 +EDGE3 80 131 5.82783 4.35356 -2.03651 0.00598564 -0.000982933 0.124428 +EDGE3 81 130 5.55323 -4.31746 -1.92856 0.00540562 0.00496053 -0.128523 +EDGE3 82 132 5.96408 0.0020805 -1.96162 -0.000683424 -0.000772931 0.00759713 +EDGE3 81 132 5.8125 4.34462 -2.04241 0.00161407 -7.70415e-05 0.124894 +EDGE3 82 131 5.56577 -4.33336 -1.94502 0.000679807 -0.00364073 -0.131766 +EDGE3 83 133 5.94316 0.00238086 -2.03116 0.00152152 0.00274034 0.0142897 +EDGE3 82 133 5.80439 4.34888 -2.02987 -0.00527469 -0.00410501 0.12436 +EDGE3 83 132 5.57623 -4.35223 -1.96252 0.00181198 -0.00303318 -0.132748 +EDGE3 84 134 5.95646 -0.0180557 -2.03408 -0.0103255 -0.00724995 0.00136713 +EDGE3 83 134 5.78748 4.37572 -2.0411 0.00221214 -0.00761497 0.123993 +EDGE3 84 133 5.55653 -4.37245 -1.96775 0.00709833 -0.00281156 -0.125832 +EDGE3 85 135 5.94208 0.00493401 -2.02688 0.00472784 -3.47198e-05 0.00591051 +EDGE3 84 135 5.79381 4.39278 -2.04457 -0.0041578 -0.00321466 0.122687 +EDGE3 85 134 5.56439 -4.38217 -1.97612 0.00526743 0.0115213 -0.112686 +EDGE3 86 136 5.94761 0.00671231 -2.02566 -0.00306292 -0.00317852 0.0115797 +EDGE3 85 136 5.79455 4.42109 -2.06022 0.00803026 0.00599991 0.121686 +EDGE3 86 135 5.55584 -4.39217 -1.97548 0.0073747 0.000987974 -0.123783 +EDGE3 87 137 5.94259 -0.00115577 -2.031 0.000740562 -0.00239206 -0.00923927 +EDGE3 86 137 5.77271 4.43999 -2.05869 0.00256194 0.00475416 0.126048 +EDGE3 87 136 5.55483 -4.42709 -1.98169 0.00557298 0.000198146 -0.134599 +EDGE3 88 138 5.94258 -0.00361728 -2.04355 0.00481512 -0.011422 -0.00249253 +EDGE3 87 138 5.78317 4.43385 -2.1069 0.00370164 0.00368922 0.119196 +EDGE3 88 137 5.53985 -4.42804 -1.98674 0.00509582 0.00338233 -0.130823 +EDGE3 89 139 5.94516 -0.00249866 -2.03337 -0.00859126 0.00295914 -0.00537613 +EDGE3 88 139 5.77471 4.44999 -2.0936 -0.00717492 -0.00362283 0.124473 +EDGE3 89 138 5.54099 -4.44564 -2.00634 -0.0110852 -0.000549116 -0.127031 +EDGE3 90 140 5.94748 -0.00306102 -2.04996 -0.00625194 -0.00152921 -0.00129463 +EDGE3 89 140 5.77254 4.44635 -2.08843 0.00515903 -0.0054336 0.128899 +EDGE3 90 139 5.54158 -4.44279 -2.01508 -0.000136648 -0.00381583 -0.124038 +EDGE3 91 141 5.94033 -0.00592582 -2.04659 -0.00248979 -0.00513761 -0.00388407 +EDGE3 90 141 5.76119 4.48277 -2.10685 -0.00347186 -0.0045345 0.124881 +EDGE3 91 140 5.54484 -4.46782 -2.00898 0.00308155 0.00244027 -0.133813 +EDGE3 92 142 5.93628 -0.00700654 -2.07294 0.00242552 -0.00272029 -0.00377451 +EDGE3 91 142 5.75676 4.50852 -2.10521 0.00750575 0.00459178 0.121185 +EDGE3 92 141 5.53831 -4.48086 -2.03158 0.011379 0.00496877 -0.122346 +EDGE3 93 143 5.93916 -0.0118729 -2.08482 0.00111161 -0.00246535 -0.00710477 +EDGE3 92 143 5.76493 4.50571 -2.09541 -0.00329549 0.0046654 0.126824 +EDGE3 93 142 5.54164 -4.49599 -2.03001 -0.000962885 0.00280491 -0.118919 +EDGE3 94 144 5.9335 -0.0057197 -2.09441 -0.0018911 -0.000335212 -0.00478258 +EDGE3 93 144 5.77849 4.53759 -2.10989 0.00329856 0.00355965 0.129626 +EDGE3 94 143 5.51396 -4.51852 -2.03305 -0.00422389 -0.00690553 -0.123483 +EDGE3 95 145 5.91591 0.000661672 -2.10186 -0.00145643 0.0014295 0.00148329 +EDGE3 94 145 5.75588 4.54557 -2.11957 -0.000482724 -0.00460314 0.120762 +EDGE3 95 144 5.50652 -4.53556 -2.05973 0.00106481 0.00596608 -0.127319 +EDGE3 96 146 5.91818 0.00555718 -2.09958 0.00445131 -0.00633504 0.0034371 +EDGE3 95 146 5.76897 4.54789 -2.15406 0.0125085 -0.00391636 0.126051 +EDGE3 96 145 5.52807 -4.54252 -2.05661 -0.00142262 -0.00201221 -0.123565 +EDGE3 97 147 5.92883 -0.00816408 -2.10848 -0.00851119 0.00167811 0.00396104 +EDGE3 96 147 5.7446 4.55625 -2.14862 -0.00362468 0.000322689 0.122169 +EDGE3 97 146 5.50413 -4.55442 -2.04778 -0.00168099 -0.00224073 -0.122386 +EDGE3 98 148 5.91495 -0.02329 -2.11426 -0.00255287 -0.00118894 -0.00125806 +EDGE3 97 148 5.75839 4.59625 -2.15156 0.00515329 0.0109351 0.127274 +EDGE3 98 147 5.50959 -4.55731 -2.05593 -0.00649675 0.00817046 -0.122436 +EDGE3 99 149 5.92614 0.00563662 -2.11202 -0.0039517 -0.00045968 -0.0034078 +EDGE3 98 149 5.75515 4.59924 -2.1584 -0.00189203 0.00378308 0.113912 +EDGE3 99 148 5.50266 -4.58317 -2.06714 -0.00452115 -0.00812471 -0.124576 +EDGE3 100 150 5.89927 -0.00171002 -2.12712 0.00975283 -0.00121676 0.00218433 +EDGE3 99 150 5.74189 4.59605 -2.17907 -0.0111121 -0.0093574 0.127396 +EDGE3 100 149 5.53721 -4.59747 -2.09629 -0.000313599 -0.00408999 -0.116414 +EDGE3 101 151 5.90943 0.00669807 -2.13923 -0.0114859 -0.00141246 0.00114711 +EDGE3 100 151 5.74882 4.61929 -2.16734 -0.00121867 0.000422508 0.125296 +EDGE3 101 150 5.51791 -4.61208 -2.09307 0.00064946 0.00147765 -0.119846 +EDGE3 102 152 5.91426 -0.0046948 -2.16166 0.00899636 0.00926201 -0.000597472 +EDGE3 101 152 5.73251 4.62673 -2.15896 -6.3422e-05 0.00758668 0.123069 +EDGE3 102 151 5.5065 -4.62967 -2.09849 -0.00404858 -0.00638891 -0.124717 +EDGE3 103 153 5.89028 -0.0105186 -2.15423 0.00653543 0.00131055 -0.007956 +EDGE3 102 153 5.73193 4.66068 -2.18882 -0.00259482 -0.00358205 0.126595 +EDGE3 103 152 5.49435 -4.63766 -2.10545 -0.00706556 -0.00584102 -0.122815 +EDGE3 104 154 5.91477 -0.00162084 -2.16084 0.0084456 0.00810927 -0.00261921 +EDGE3 103 154 5.74257 4.6813 -2.20924 -0.00360991 9.95637e-05 0.12444 +EDGE3 104 153 5.47923 -4.65323 -2.13027 0.000952286 -0.00104826 -0.124772 +EDGE3 105 155 5.90082 -0.0256945 -2.17346 0.0044721 -0.0015286 0.00186278 +EDGE3 104 155 5.70767 4.69517 -2.21296 -0.00367287 -0.00751175 0.112486 +EDGE3 105 154 5.48129 -4.67686 -2.1206 -0.0091494 0.00362415 -0.130924 +EDGE3 106 156 5.87398 0.00822346 -2.18284 -0.00191114 0.0121077 -0.000770441 +EDGE3 106 155 5.4691 -4.68429 -2.10923 -0.00144972 0.0108972 -0.12369 +EDGE3 105 156 5.70191 4.70367 -2.21478 0.00103006 0.00844556 0.127081 +EDGE3 107 157 5.89072 0.0034803 -2.18206 0.00473961 -0.00198469 0.000331075 +EDGE3 107 156 5.48947 -4.69443 -2.14727 -0.000488885 -0.000787864 -0.121187 +EDGE3 106 157 5.71296 4.70389 -2.22313 -0.00590836 -0.0048013 0.130996 +EDGE3 107 158 5.71809 4.7096 -2.22289 -0.00234133 0.00693978 0.121249 +EDGE3 108 158 5.88531 0.000829966 -2.18625 0.00392153 -0.00256932 0.00319547 +EDGE3 109 159 5.90608 0.0096382 -2.18957 -0.00562035 0.00756161 -3.9901e-06 +EDGE3 108 157 5.49402 -4.72491 -2.14124 -0.0019229 0.0050416 -0.127212 +EDGE3 109 158 5.48339 -4.72683 -2.14706 0.0066325 0.00213795 -0.12895 +EDGE3 108 159 5.69969 4.76387 -2.24174 0.000527659 0.0028797 0.124346 +EDGE3 110 160 5.89676 0.0119852 -2.19602 -0.000331319 -0.00125258 -0.00494893 +EDGE3 109 160 5.70302 4.77212 -2.23386 0.000903606 0.0114715 0.125686 +EDGE3 110 159 5.47188 -4.75354 -2.15492 -0.0071824 -0.00102591 -0.123905 +EDGE3 110 161 5.6997 4.76112 -2.24607 -0.00261295 0.00721901 0.126415 +EDGE3 111 161 5.87787 -0.0244173 -2.20934 0.00368255 0.000942475 -0.00406739 +EDGE3 112 162 5.86889 -0.00562809 -2.23451 0.00541625 -0.00340068 -0.00696874 +EDGE3 111 160 5.46021 -4.74912 -2.16461 0.000464701 -0.00172643 -0.124538 +EDGE3 111 162 5.69558 4.79227 -2.24369 -0.00110732 -0.00286821 0.12321 +EDGE3 112 161 5.4535 -4.76453 -2.17599 0.00162129 0.0101455 -0.124948 +EDGE3 112 163 5.69631 4.80607 -2.25245 0.00800149 0.00366524 0.126133 +EDGE3 113 163 5.88131 0.00311327 -2.211 -0.00451385 0.00750783 0.00244361 +EDGE3 114 164 5.87413 -0.000175372 -2.2373 -0.00245302 -0.00390279 0.00417027 +EDGE3 113 162 5.4606 -4.78171 -2.18494 -0.00233199 -0.00620389 -0.126769 +EDGE3 114 163 5.4578 -4.80116 -2.17808 -0.00370648 0.00104254 -0.120747 +EDGE3 113 164 5.67238 4.80009 -2.27183 0.0037754 -0.00236843 0.131 +EDGE3 114 165 5.68948 4.83358 -2.28606 -0.00706079 0.00382505 0.126379 +EDGE3 115 165 5.87474 0.0111029 -2.24937 -0.00384167 0.00163294 -0.00326941 +EDGE3 116 166 5.87354 -0.00199616 -2.24632 -0.00320704 -0.00584065 0.00383598 +EDGE3 115 164 5.46442 -4.81239 -2.18844 -0.00589885 0.00580503 -0.112992 +EDGE3 115 166 5.67641 4.8502 -2.28855 -0.00134322 3.48353e-05 0.127661 +EDGE3 116 165 5.4475 -4.81495 -2.19482 0.000139381 0.00256851 -0.129053 +EDGE3 116 167 5.66491 4.86528 -2.29585 -0.00477419 -0.00059989 0.131747 +EDGE3 117 167 5.87944 -0.0124728 -2.24469 -0.0107505 0.00696478 0.00193708 +EDGE3 118 168 5.85323 0.00571888 -2.26368 0.00322066 0.00520114 -0.00501883 +EDGE3 117 166 5.44706 -4.83286 -2.19908 0.000646507 0.00265544 -0.127321 +EDGE3 118 167 5.45001 -4.85537 -2.23138 -0.000403095 -0.00734491 -0.119992 +EDGE3 117 168 5.64922 4.88115 -2.29113 -0.00647886 -0.00235151 0.108707 +EDGE3 118 169 5.67006 4.88958 -2.29077 -0.00533963 -0.00247105 0.117073 +EDGE3 119 169 5.86033 0.0139012 -2.28436 -0.00731334 -0.00208742 -0.00715914 +EDGE3 120 170 5.85089 -0.00562153 -2.2838 0.00642547 0.00940477 -0.00208428 +EDGE3 119 168 5.42989 -4.86642 -2.22973 -0.00835869 -0.0023744 -0.119837 +EDGE3 120 169 5.44382 -4.88834 -2.21988 0.00391662 -0.00224901 -0.115502 +EDGE3 119 170 5.67647 4.89386 -2.30626 -0.00382326 0.00174977 0.132028 +EDGE3 120 171 5.65423 4.91245 -2.31495 -0.00161161 0.00355253 0.130867 +EDGE3 121 171 5.8582 -0.0061348 -2.29434 -0.000618087 0.00568092 0.000994068 +EDGE3 122 172 5.8349 0.0074152 -2.29339 -0.000347891 -0.000551568 -0.00377615 +EDGE3 121 170 5.42134 -4.91352 -2.22649 -0.00193692 -0.00217144 -0.124404 +EDGE3 122 171 5.42522 -4.92462 -2.21826 -0.00308573 -0.00296274 -0.12297 +EDGE3 121 172 5.64846 4.93566 -2.33134 0.014239 -0.00915116 0.12262 +EDGE3 122 173 5.66465 4.94408 -2.34903 -0.00190267 -0.00257364 0.123996 +EDGE3 123 173 5.8491 0.0105335 -2.29719 -0.00523605 0.00332237 0.00470214 +EDGE3 124 174 5.85034 0.0104126 -2.29107 0.0103412 -0.0032568 -0.00540688 +EDGE3 123 172 5.41278 -4.92991 -2.23374 -0.00593764 0.00273019 -0.127082 +EDGE3 124 173 5.40336 -4.95046 -2.27406 -0.00203444 0.00612564 -0.119921 +EDGE3 123 174 5.63452 4.9648 -2.35178 0.00148572 -0.000824591 0.128495 +EDGE3 124 175 5.63355 4.97256 -2.34242 0.00432748 0.00132032 0.128943 +EDGE3 125 175 5.86013 0.013637 -2.33266 -0.00317936 0.00139432 -0.0052309 +EDGE3 126 176 5.83958 -0.00734298 -2.31412 -0.00441762 0.000826256 0.00078006 +EDGE3 125 174 5.41067 -4.96335 -2.26176 0.00742763 -0.00104166 -0.131905 +EDGE3 125 176 5.63856 4.99214 -2.38472 0.0130859 -0.00667206 0.118375 +EDGE3 126 175 5.4053 -4.95672 -2.27088 -0.000778198 0.0054299 -0.124555 +EDGE3 127 177 5.83927 -0.00122769 -2.32478 0.000477313 -0.00325058 0.00831139 +EDGE3 126 177 5.64143 5.01691 -2.35627 0.00473058 0.00394112 0.131258 +EDGE3 127 176 5.42368 -4.9976 -2.26462 -0.00442978 -0.00228202 -0.122 +EDGE3 127 178 5.64677 5.03737 -2.38375 -0.0070724 -0.00379547 0.13378 +EDGE3 128 178 5.83293 -0.00263856 -2.33337 0.00546661 0.00462911 0.00332802 +EDGE3 129 179 5.81781 0.0107309 -2.35394 0.0108488 0.00136009 -0.0110731 +EDGE3 128 177 5.42559 -5.0029 -2.26235 0.00325546 0.000287597 -0.121128 +EDGE3 129 178 5.3986 -5.01378 -2.30153 0.00772899 0.00358826 -0.133183 +EDGE3 128 179 5.62883 5.02037 -2.36585 0.00628176 -0.00336656 0.127019 +EDGE3 129 180 5.62222 5.05427 -2.395 -0.000759545 0.00199995 0.126886 +EDGE3 130 180 5.82184 -0.0197342 -2.3476 0.0089105 0.0107607 -0.00124023 +EDGE3 131 181 5.82193 -0.00619168 -2.34967 -0.00502768 -0.0027434 0.0030363 +EDGE3 130 179 5.3852 -5.04655 -2.30443 -0.00394044 0.00892445 -0.125781 +EDGE3 131 180 5.38776 -5.03624 -2.30596 -0.00103941 -0.0106571 -0.122426 +EDGE3 130 181 5.63674 5.05861 -2.41404 -0.00307442 -0.00909254 0.13335 +EDGE3 131 182 5.61802 5.08478 -2.39021 0.00111917 0.00326738 0.12637 +EDGE3 132 182 5.80975 -0.00613824 -2.36684 0.00222272 -0.00119453 0.00329392 +EDGE3 132 181 5.38875 -5.05656 -2.32502 -0.00816902 -0.0021291 -0.129809 +EDGE3 133 183 5.81899 0.0107705 -2.37083 -0.00303004 0.00172401 -0.000898821 +EDGE3 133 182 5.37904 -5.0875 -2.32445 0.000368746 -0.00195891 -0.125782 +EDGE3 132 183 5.59666 5.09276 -2.41657 -0.0102684 -0.00472247 0.123377 +EDGE3 133 184 5.61406 5.11065 -2.42405 0.000260489 0.00477785 0.123652 +EDGE3 134 184 5.82014 0.0127996 -2.39008 0.00164003 0.00871486 -0.00056987 +EDGE3 135 185 5.7891 -0.00198527 -2.3821 0.00319664 0.000327952 0.007284 +EDGE3 134 183 5.3817 -5.09477 -2.34226 0.00251445 0.00504492 -0.126381 +EDGE3 135 184 5.35712 -5.10464 -2.33129 -0.00470771 0.00446522 -0.120954 +EDGE3 134 185 5.61675 5.1262 -2.44749 0.00835458 0.00190111 0.120545 +EDGE3 135 186 5.58809 5.13123 -2.44386 0.00070762 -0.000931367 0.126615 +EDGE3 136 186 5.79541 0.00361309 -2.39212 0.000357085 0.00042635 0.00276907 +EDGE3 137 187 5.81003 0.0185833 -2.40675 0.00139138 -0.00433147 0.00672109 +EDGE3 136 185 5.38298 -5.13344 -2.34788 -0.00155289 0.000747263 -0.11945 +EDGE3 137 186 5.35682 -5.12205 -2.35757 -0.0012033 -0.00455866 -0.117761 +EDGE3 136 187 5.6083 5.13318 -2.44779 0.00291495 0.00845843 0.131367 +EDGE3 138 188 5.79736 0.00589466 -2.41443 0.00204346 -0.000325463 0.000341762 +EDGE3 137 188 5.58194 5.17677 -2.43977 -0.00257519 0.000312419 0.127528 +EDGE3 139 189 5.78926 0.00911122 -2.40126 -0.00567608 -0.00290277 0.00891849 +EDGE3 138 187 5.38927 -5.14813 -2.35346 -0.0060845 -0.000639396 -0.122968 +EDGE3 139 188 5.35467 -5.17133 -2.3692 0.00401004 -0.00905843 -0.116158 +EDGE3 138 189 5.58018 5.17467 -2.448 0.00454724 0.0047342 0.128385 +EDGE3 139 190 5.58665 5.20524 -2.47663 -0.0100811 -0.00283907 0.120983 +EDGE3 140 190 5.80184 0.000538131 -2.42515 0.00196545 -0.005324 -0.00618282 +EDGE3 141 191 5.77935 -0.00748809 -2.45042 -0.0100766 -0.00349617 0.00118143 +EDGE3 140 189 5.35874 -5.17083 -2.36919 0.000413041 0.000711537 -0.12565 +EDGE3 141 190 5.3628 -5.18387 -2.37445 -0.000241221 -0.00400845 -0.125639 +EDGE3 140 191 5.59494 5.20946 -2.47172 0.000885458 0.00429421 0.127445 +EDGE3 141 192 5.57286 5.21887 -2.49066 -0.000100917 -0.0021753 0.126676 +EDGE3 142 192 5.80576 0.0302671 -2.4382 -0.0128519 -0.00360723 -0.0048857 +EDGE3 143 193 5.77508 0.00394147 -2.42653 0.00841756 0.00135545 -0.0038313 +EDGE3 142 191 5.35462 -5.20314 -2.38674 0.000141457 -0.00282519 -0.128137 +EDGE3 143 192 5.3575 -5.23209 -2.38195 -0.00608188 -0.00444574 -0.1279 +EDGE3 142 193 5.56018 5.23833 -2.47906 -0.00176067 -0.00240263 0.125972 +EDGE3 143 194 5.56614 5.2335 -2.49796 0.00169487 -0.00732731 0.115616 +EDGE3 144 194 5.77143 0.00770613 -2.45164 -0.00417982 0.00866606 -0.00768732 +EDGE3 144 193 5.32936 -5.23967 -2.40444 0.000459216 0.00738128 -0.130647 +EDGE3 145 195 5.79225 0.0169204 -2.45245 -0.00110723 -0.00522928 -0.0065441 +EDGE3 144 195 5.58427 5.25898 -2.50291 0.0125382 -0.00764612 0.130573 +EDGE3 145 194 5.32872 -5.24648 -2.38929 -0.00193962 0.00760089 -0.129508 +EDGE3 146 196 5.77789 -0.00336557 -2.4744 0.00724279 -0.00414377 -0.00432928 +EDGE3 145 196 5.56039 5.28432 -2.5096 0.00611974 -0.00697688 0.123842 +EDGE3 146 195 5.3312 -5.27335 -2.40405 -0.00734407 0.000824763 -0.121347 +EDGE3 147 197 5.77977 -0.0183222 -2.48332 -0.00242465 -0.00601997 0.00309158 +EDGE3 146 197 5.54336 5.29048 -2.51322 0.00184973 -0.00380715 0.118812 +EDGE3 147 196 5.32505 -5.2783 -2.4143 -0.000803917 0.000159992 -0.124847 +EDGE3 148 198 5.77698 -0.017851 -2.48584 0.00878536 -0.00334252 0.00883341 +EDGE3 147 198 5.55894 5.29027 -2.53193 0.00615159 -0.000320007 0.129699 +EDGE3 148 197 5.32001 -5.28555 -2.41291 -0.00530757 0.000901927 -0.127068 +EDGE3 149 199 5.76686 0.0091611 -2.48136 -0.00112461 0.00922937 -0.00736067 +EDGE3 148 199 5.54112 5.31599 -2.54936 0.00127283 0.00621928 0.129475 +EDGE3 149 198 5.317 -5.32603 -2.4434 0.000883617 0.000357384 -0.125185 +EDGE3 150 200 5.7562 -0.0154595 -2.49467 0.00402636 0.00606298 -0.00307981 +EDGE3 149 200 5.54619 5.33972 -2.545 -0.00213811 0.0103017 0.120335 +EDGE3 150 199 5.32714 -5.35155 -2.45816 0.00825779 -0.00256778 -0.120056 +EDGE3 151 201 5.78054 -0.00882844 -2.49694 -0.000287276 0.0129323 -0.00473433 +EDGE3 151 200 5.31259 -5.34387 -2.43048 -0.00124561 -0.000855617 -0.124947 +EDGE3 150 201 5.52494 5.35234 -2.55254 0.00313984 0.00199059 0.117356 +EDGE3 152 202 5.75609 0.0207007 -2.51162 0.00560916 -0.00530332 0.00903449 +EDGE3 151 202 5.54255 5.36158 -2.56342 0.00674792 0.00302477 0.124916 +EDGE3 152 201 5.31184 -5.34705 -2.43526 -0.00452262 0.000654235 -0.126352 +EDGE3 153 203 5.75805 0.00540865 -2.50041 0.0012938 -0.00163891 0.00203313 +EDGE3 152 203 5.54515 5.37483 -2.57021 -0.00293532 -0.00979789 0.128554 +EDGE3 153 202 5.31332 -5.35592 -2.46136 -0.00738724 -0.00348712 -0.12721 +EDGE3 154 204 5.73889 0.0145687 -2.5206 0.00751353 0.00293891 0.00325345 +EDGE3 153 204 5.53425 5.3947 -2.5844 -0.00788534 0.00737028 0.126994 +EDGE3 154 203 5.28339 -5.37749 -2.465 -0.00539866 0.000686579 -0.119765 +EDGE3 155 205 5.74354 -0.00765853 -2.53338 0.000957149 0.00308731 0.00622773 +EDGE3 154 205 5.53481 5.40069 -2.58287 0.00474479 -0.0043952 0.121714 +EDGE3 155 204 5.31147 -5.40358 -2.46433 -0.00145406 -0.000207486 -0.121814 +EDGE3 156 206 5.74077 -0.0119403 -2.54469 0.00061614 0.0084617 0.00847225 +EDGE3 155 206 5.52356 5.41836 -2.59158 -0.0013559 -0.00207364 0.127637 +EDGE3 156 205 5.29464 -5.42748 -2.46362 -0.00409261 -0.00210303 -0.125072 +EDGE3 157 207 5.71651 -0.00650672 -2.55504 -0.00332362 0.00644226 -0.00308994 +EDGE3 156 207 5.51727 5.43027 -2.59884 0.000974606 -0.00750827 0.136223 +EDGE3 157 206 5.29194 -5.41319 -2.4781 -0.00651488 0.000944405 -0.131178 +EDGE3 158 208 5.75205 0.00809209 -2.55805 -0.00825876 0.00133194 0.000854928 +EDGE3 157 208 5.51073 5.44707 -2.59634 -0.00307028 0.00414619 0.132165 +EDGE3 158 207 5.28055 -5.42201 -2.51945 0.0143834 0.00474337 -0.126466 +EDGE3 159 209 5.74068 0.0112159 -2.56117 -0.0130545 -0.00430078 0.00384576 +EDGE3 158 209 5.51516 5.45878 -2.60055 0.00465947 -0.00295911 0.12412 +EDGE3 159 208 5.28139 -5.45586 -2.49098 0.00195884 0.00572952 -0.126633 +EDGE3 160 210 5.7346 -0.00654048 -2.56862 -0.00340003 -0.00199602 -0.00827291 +EDGE3 159 210 5.5014 5.4802 -2.61394 0.0040518 0.0033648 0.12103 +EDGE3 160 209 5.25612 -5.46358 -2.52297 -0.00231086 -0.00294848 -0.127605 +EDGE3 161 211 5.72575 0.0177602 -2.57482 -0.0034082 -0.00182098 -0.00139454 +EDGE3 160 211 5.51817 5.48953 -2.62701 0.00195526 0.00518635 0.128303 +EDGE3 161 210 5.27343 -5.48151 -2.51497 0.00501552 0.0015921 -0.126976 +EDGE3 162 212 5.73358 0.0190177 -2.59076 -0.00228277 0.0123627 0.00143952 +EDGE3 161 212 5.48375 5.50831 -2.63331 0.0046686 -0.00580639 0.114338 +EDGE3 162 211 5.27359 -5.50173 -2.52515 -0.00441229 0.00110085 -0.124214 +EDGE3 163 213 5.7196 0.00824366 -2.59774 0.00226308 -0.00134595 -0.00683796 +EDGE3 162 213 5.48007 5.50722 -2.63511 0.00763833 -0.00777952 0.121173 +EDGE3 163 212 5.26056 -5.50537 -2.53088 -0.00277407 0.00230028 -0.126173 +EDGE3 164 214 5.72237 -0.00825224 -2.60969 -0.00467588 0.00329792 0.00711357 +EDGE3 163 214 5.50375 5.52481 -2.64868 0.00249999 0.00549918 0.126665 +EDGE3 164 213 5.2569 -5.52079 -2.54529 0.00327059 0.00101119 -0.123196 +EDGE3 165 215 5.72991 -0.0130351 -2.5836 -0.00978211 -0.0011212 0.00170482 +EDGE3 164 215 5.49594 5.54304 -2.65036 -0.00534129 -0.0026147 0.13013 +EDGE3 165 214 5.25512 -5.53692 -2.56244 0.00260399 -0.00068308 -0.128689 +EDGE3 166 216 5.72393 0.00368218 -2.61628 -0.00249097 -0.00558572 -0.00384151 +EDGE3 165 216 5.48351 5.54018 -2.67681 0.000854679 0.00436414 0.1246 +EDGE3 166 215 5.2473 -5.55196 -2.55502 -0.00141156 0.0169631 -0.123119 +EDGE3 167 217 5.71272 -0.00628011 -2.63087 -0.00778733 0.00157421 -0.00626345 +EDGE3 166 217 5.47304 5.56926 -2.68068 0.00348615 0.00837144 0.123796 +EDGE3 167 216 5.23987 -5.5691 -2.55701 -0.00190647 0.00977801 -0.129046 +EDGE3 168 218 5.70121 -0.00460123 -2.62326 0.000227827 0.00622522 0.00416443 +EDGE3 167 218 5.45772 5.60375 -2.67494 -4.5013e-05 0.00640296 0.132244 +EDGE3 168 217 5.24754 -5.58352 -2.56321 -0.00692286 -0.0018102 -0.11982 +EDGE3 169 219 5.71504 0.00203965 -2.62734 -0.00107923 0.00261847 0.000539422 +EDGE3 168 219 5.457 5.59963 -2.68502 -0.00283424 0.00742396 0.12701 +EDGE3 169 218 5.21433 -5.60481 -2.59877 0.00507696 -0.00992058 -0.12887 +EDGE3 170 220 5.69518 0.00930935 -2.64097 -0.00103116 -0.00557348 -0.00195959 +EDGE3 170 219 5.24638 -5.60682 -2.56982 0.0038678 0.00454005 -0.125142 +EDGE3 169 220 5.47585 5.61079 -2.68439 0.000463241 -0.00263866 0.125312 +EDGE3 171 221 5.70022 -0.00497816 -2.64524 0.00272628 0.00127152 0.00289555 +EDGE3 170 221 5.45848 5.63214 -2.69054 -0.000947434 0.000958733 0.133475 +EDGE3 171 220 5.24227 -5.61745 -2.56936 -0.0118452 -0.0013965 -0.127175 +EDGE3 172 222 5.70163 0.00875117 -2.64296 -0.00151686 0.000839614 0.00432467 +EDGE3 171 222 5.45007 5.6618 -2.70671 0.00373858 -0.00382736 0.130612 +EDGE3 172 221 5.2198 -5.62542 -2.59758 0.000117031 0.00154721 -0.130821 +EDGE3 173 223 5.70108 -0.0203346 -2.6379 0.000717357 -0.00398153 0.00405844 +EDGE3 172 223 5.44212 5.64459 -2.70345 0.00955057 0.00523261 0.11973 +EDGE3 173 222 5.21552 -5.63644 -2.61464 -0.00394663 0.00938608 -0.11797 +EDGE3 174 224 5.69039 -0.00934215 -2.65729 -0.000636047 -0.00450725 0.000571352 +EDGE3 174 223 5.21741 -5.64529 -2.61793 0.00631962 -0.00259502 -0.130891 +EDGE3 173 224 5.44203 5.66903 -2.71401 -0.00321256 -0.000206332 0.137264 +EDGE3 175 225 5.69836 0.00360652 -2.65019 0.00127774 -0.00418832 0.000661435 +EDGE3 174 225 5.44863 5.68978 -2.70313 -0.000271414 0.00219224 0.123585 +EDGE3 175 224 5.20348 -5.67623 -2.60925 -0.000610676 -0.00074851 -0.121645 +EDGE3 176 226 5.68978 -0.00123422 -2.69126 -0.00717981 -0.00105451 0.00195912 +EDGE3 175 226 5.44649 5.69959 -2.74264 0.0133318 0.0061567 0.118429 +EDGE3 176 225 5.21033 -5.7009 -2.61975 0.00234792 0.00133415 -0.130126 +EDGE3 177 227 5.67134 -0.00980794 -2.69715 0.00127255 -0.00161092 -0.00123338 +EDGE3 176 227 5.43597 5.70907 -2.74674 -0.000553111 -0.000999087 0.130047 +EDGE3 177 226 5.20948 -5.68986 -2.61937 0.00111188 0.00321067 -0.122676 +EDGE3 178 228 5.66137 -0.0200877 -2.69106 0.00112623 0.00834103 0.00498475 +EDGE3 177 228 5.42161 5.73674 -2.74592 -0.00641124 -0.00859996 0.126995 +EDGE3 178 227 5.18563 -5.71411 -2.62773 0.00864731 -0.00125788 -0.114085 +EDGE3 179 229 5.67355 -0.00540887 -2.68706 -0.00464168 0.00517855 -0.00187282 +EDGE3 178 229 5.40338 5.75353 -2.75046 -0.00191577 -0.00524981 0.127282 +EDGE3 179 228 5.18759 -5.72278 -2.64526 -0.00204173 0.00247132 -0.122487 +EDGE3 180 230 5.69332 -0.00345162 -2.70496 0.00253649 0.000832369 0.00587571 +EDGE3 179 230 5.41995 5.75862 -2.75012 0.00271393 0.00453144 0.142366 +EDGE3 180 229 5.18813 -5.74585 -2.66121 -0.00219612 -0.00200361 -0.124176 +EDGE3 181 231 5.65998 -0.00810357 -2.71726 -0.00357751 0.00127123 1.82223e-05 +EDGE3 180 231 5.41895 5.76476 -2.77408 -0.00143302 -0.00145822 0.129515 +EDGE3 181 230 5.18537 -5.76176 -2.65636 -0.00572485 -0.00482494 -0.119443 +EDGE3 182 232 5.6555 -0.000193813 -2.72322 -0.000258984 -0.00637001 -0.00179685 +EDGE3 181 232 5.42787 5.80761 -2.77927 -0.0134134 -0.00287348 0.125778 +EDGE3 182 231 5.19673 -5.77472 -2.64873 0.000315872 -0.00779232 -0.119268 +EDGE3 183 233 5.66419 0.00508272 -2.72413 -0.00371601 0.00120713 -0.00333641 +EDGE3 182 233 5.39168 5.77913 -2.77211 0.00474791 0.00260123 0.124428 +EDGE3 183 232 5.17485 -5.79618 -2.66991 0.00180784 -0.00967104 -0.127362 +EDGE3 184 234 5.66085 -0.00547281 -2.73169 0.000748645 0.00208808 -0.000860597 +EDGE3 183 234 5.40112 5.82406 -2.7974 -0.00307088 -7.13772e-05 0.120616 +EDGE3 184 233 5.17831 -5.80262 -2.66754 -0.00129222 0.00356908 -0.134378 +EDGE3 185 235 5.65732 -0.0109558 -2.75635 0.00711419 -0.00547322 0.00179182 +EDGE3 184 235 5.408 5.80065 -2.79951 -0.0157253 0.00704819 0.120861 +EDGE3 185 234 5.17799 -5.81957 -2.68761 -0.00426062 0.00366648 -0.130818 +EDGE3 186 236 5.63339 -0.00827312 -2.751 -0.0110922 -0.00508354 0.00149513 +EDGE3 185 236 5.39281 5.8531 -2.7987 -0.00345573 -0.00997029 0.119619 +EDGE3 186 235 5.16738 -5.83473 -2.68695 0.000416481 -0.00173212 -0.129461 +EDGE3 187 237 5.64776 -0.00336791 -2.75866 0.00160899 -0.00910978 0.000928463 +EDGE3 186 237 5.36833 5.84313 -2.80863 0.00555427 0.00434125 0.130482 +EDGE3 187 236 5.1528 -5.82917 -2.72503 0.0100905 0.00357962 -0.124625 +EDGE3 188 238 5.63081 -0.00243124 -2.77045 -0.00100979 0.00118096 0.0133921 +EDGE3 187 238 5.36261 5.85505 -2.79953 -0.00178385 0.00280293 0.131339 +EDGE3 188 237 5.16046 -5.83338 -2.71593 -0.00340923 0.00177035 -0.128438 +EDGE3 189 239 5.63011 -0.016553 -2.7844 0.0107624 -0.00286546 -0.00631263 +EDGE3 188 239 5.36853 5.90386 -2.81748 -0.0050575 0.00869306 0.121246 +EDGE3 189 238 5.14754 -5.87156 -2.72027 -0.000969913 -0.00172586 -0.126021 +EDGE3 190 240 5.64259 -0.0100221 -2.77632 -0.00174618 -0.00463429 -0.00188685 +EDGE3 189 240 5.37916 5.89146 -2.84064 -0.0014954 -0.0025996 0.128553 +EDGE3 190 239 5.14504 -5.89497 -2.71144 0.00247667 0.00410107 -0.126566 +EDGE3 191 241 5.62879 -0.00464936 -2.78458 -0.00459359 0.00292511 0.00245095 +EDGE3 190 241 5.37454 5.90749 -2.83379 0.00509864 -0.0059042 0.129645 +EDGE3 191 240 5.14542 -5.89809 -2.74901 0.0143751 -0.00870689 -0.133753 +EDGE3 192 242 5.63009 0.00531532 -2.80406 0.00787219 -0.00177989 0.00123312 +EDGE3 191 242 5.36499 5.92451 -2.85593 0.00461249 0.00361625 0.119002 +EDGE3 192 241 5.13355 -5.92388 -2.71278 -0.00918494 -0.00523815 -0.126294 +EDGE3 193 243 5.62665 -0.00965967 -2.8014 0.000585478 -0.00562915 0.000450034 +EDGE3 192 243 5.36466 5.92768 -2.84473 -0.00714825 0.00493181 0.125106 +EDGE3 193 242 5.14747 -5.91789 -2.74535 -0.00370175 -0.00237716 -0.13104 +EDGE3 194 244 5.63572 0.01122 -2.82287 -0.00797533 0.00243817 0.00184757 +EDGE3 193 244 5.36441 5.96056 -2.85979 -0.00634215 0.00270466 0.116885 +EDGE3 195 245 5.61037 -0.00287581 -2.80848 0.00370576 0.00165629 -0.00459601 +EDGE3 194 243 5.15 -5.96628 -2.77125 0.00486761 0.000542237 -0.130749 +EDGE3 194 245 5.33819 5.97826 -2.86999 -0.00118042 -0.0050262 0.128895 +EDGE3 196 246 5.59853 0.00338405 -2.84012 -0.00309265 -0.00373368 0.00553647 +EDGE3 195 244 5.10975 -5.96687 -2.7689 0.00289216 -0.00705341 -0.126488 +EDGE3 196 245 5.12115 -5.9743 -2.77164 -0.00117539 -0.00473617 -0.127642 +EDGE3 195 246 5.36587 5.984 -2.87861 0.00186173 -0.00867208 0.11747 +EDGE3 197 247 5.60996 -0.00820362 -2.82718 -0.000610771 -0.00674931 -0.00443733 +EDGE3 196 247 5.35493 6.00578 -2.88822 0.00392779 -0.00854464 0.129236 +EDGE3 198 248 5.60029 0.0122551 -2.83963 -0.00254273 0.00714214 0.000587309 +EDGE3 197 246 5.13501 -5.99738 -2.77946 -0.0110365 -0.000454168 -0.123331 +EDGE3 198 247 5.10253 -5.99341 -2.79447 0.00101249 0.00453254 -0.130104 +EDGE3 197 248 5.34015 6.00182 -2.89708 -0.0019431 0.00629643 0.133357 +EDGE3 198 249 5.35092 6.0355 -2.91745 0.00405763 0.00356624 0.126799 +EDGE3 199 249 5.60055 0.0125382 -2.82653 -0.00354375 -0.00320807 -0.00139164 +EDGE3 199 248 5.10305 -6.01506 -2.79044 0.00214552 6.39272e-05 -0.124024 +EDGE3 200 250 5.61108 0.0148192 -2.85084 0.00431736 -0.000337999 0.00663123 +EDGE3 200 249 5.10449 -6.01133 -2.79246 0.000521379 -3.96923e-05 -0.121528 +EDGE3 199 250 5.3292 6.02936 -2.90527 0.00106622 -0.00643111 0.128582 +EDGE3 201 251 5.59013 -0.00743196 -2.84857 0.00884108 3.53843e-05 -0.00617016 +EDGE3 200 251 5.32704 6.05258 -2.91027 -0.00483897 -0.00292767 0.129554 +EDGE3 201 250 5.09882 -6.0268 -2.79962 -0.0159607 0.00315331 -0.126483 +EDGE3 201 252 5.33098 6.07238 -2.91037 0.00611606 -9.06802e-05 0.130136 +EDGE3 202 252 5.59485 0.0223155 -2.87135 0.00362976 -0.00414064 0.00110163 +EDGE3 203 253 5.57936 0.00148591 -2.86545 0.0058263 0.00610799 -0.00151249 +EDGE3 202 251 5.10549 -6.03476 -2.80909 0.000135952 0.0101902 -0.129256 +EDGE3 203 252 5.09386 -6.0599 -2.82043 0.00437412 0.00860174 -0.11976 +EDGE3 202 253 5.29822 6.05526 -2.92252 0.00574996 0.00447968 0.11807 +EDGE3 204 254 5.58725 -0.00510351 -2.86338 0.000148867 -0.00348714 0.00212196 +EDGE3 203 254 5.31183 6.0851 -2.93827 0.000826606 -0.0048196 0.124139 +EDGE3 205 255 5.57885 -0.00433947 -2.88398 0.00549276 -0.00418488 0.00475266 +EDGE3 204 253 5.08788 -6.08477 -2.81308 0.00541816 0.00176208 -0.124587 +EDGE3 205 254 5.0803 -6.1029 -2.82673 -0.00443602 0.000346991 -0.124026 +EDGE3 204 255 5.30828 6.08365 -2.93019 -0.000700436 -0.000691011 0.126474 +EDGE3 205 256 5.31297 6.13163 -2.96506 -0.000856499 -0.00833334 0.124964 +EDGE3 206 256 5.58503 0.0122368 -2.89086 -0.000861996 -0.00489995 0.0009036 +EDGE3 207 257 5.56001 9.14398e-05 -2.91083 -0.00258294 0.00309321 -0.000812676 +EDGE3 206 255 5.07222 -6.09691 -2.84323 -0.0032043 -0.00320701 -0.127916 +EDGE3 206 257 5.29863 6.13298 -2.96111 -0.00322059 -0.00163801 0.125651 +EDGE3 207 256 5.07736 -6.12617 -2.83147 0.00613326 0.00679253 -0.122377 +EDGE3 207 258 5.28533 6.15371 -2.97314 -0.00133849 0.00624459 0.130432 +EDGE3 208 258 5.55821 0.00895179 -2.91072 -0.0128322 0.000915018 -0.00665918 +EDGE3 209 259 5.56868 -0.00413472 -2.91323 0.000282983 -0.00697001 -0.00342294 +EDGE3 208 257 5.07548 -6.12852 -2.846 0.00261474 0.00561432 -0.125376 +EDGE3 208 259 5.28839 6.1554 -2.9542 -0.00392393 -0.00778073 0.131669 +EDGE3 209 258 5.05838 -6.16122 -2.84819 0.00245423 -0.00420368 -0.124412 +EDGE3 209 260 5.27432 6.1859 -2.96895 0.000307793 -0.00429792 0.132774 +EDGE3 210 260 5.56595 0.00504558 -2.91542 0.0012642 -0.000508167 0.00544831 +EDGE3 211 261 5.56176 -0.0079744 -2.93077 -0.00129557 0.00120963 0.00600065 +EDGE3 210 259 5.07906 -6.15475 -2.84731 0.00300364 -0.00938758 -0.128453 +EDGE3 211 260 5.06219 -6.17201 -2.87906 -0.00388378 0.00904707 -0.114292 +EDGE3 210 261 5.28844 6.18448 -2.99247 -0.00524846 0.00301783 0.126769 +EDGE3 211 262 5.2774 6.20065 -2.98696 -0.00209432 -0.00726245 0.126899 +EDGE3 212 262 5.55368 0.000175569 -2.94276 0.00878515 -0.00738728 0.00067105 +EDGE3 213 263 5.55803 -0.00222484 -2.94365 0.000236606 0.0031112 -0.00343774 +EDGE3 212 261 5.04849 -6.18763 -2.87176 -0.00396174 0.00405756 -0.122846 +EDGE3 213 262 5.06431 -6.20803 -2.87011 0.000843709 -0.002089 -0.119412 +EDGE3 212 263 5.27038 6.19767 -2.99379 0.010667 -0.00100277 0.137248 +EDGE3 213 264 5.27209 6.22609 -3.00736 -0.00662612 0.00104638 0.130947 +EDGE3 214 264 5.55302 -0.00500383 -2.93615 0.00471031 -0.00881772 0.00642843 +EDGE3 215 265 5.54275 0.00531179 -2.94492 0.00873938 -0.00174286 0.0102921 +EDGE3 214 263 5.05181 -6.22121 -2.87762 -0.0139794 0.00302457 -0.134358 +EDGE3 215 264 5.03688 -6.22165 -2.89924 -0.00473188 -0.00460084 -0.127016 +EDGE3 214 265 5.25292 6.24884 -3.01057 0.00213821 -0.00652799 0.134767 +EDGE3 216 266 5.52208 -0.00370182 -2.97737 0.00112232 -0.000181451 -0.00298144 +EDGE3 215 266 5.26674 6.26503 -3.02364 -0.00116255 0.00601984 0.126746 +EDGE3 216 265 5.03912 -6.23766 -2.90235 0.000180229 -0.00507376 -0.123458 +EDGE3 216 267 5.24678 6.25859 -3.0123 0.00109594 -0.00296084 0.128649 +EDGE3 217 267 5.5394 0.00415257 -2.97904 -0.0042656 -0.00178282 -0.000774338 +EDGE3 218 268 5.5361 -0.00767141 -2.98703 -0.00802583 0.00152106 -0.00320633 +EDGE3 217 266 5.01901 -6.25615 -2.92064 -0.00265829 0.00387811 -0.121482 +EDGE3 218 267 5.01934 -6.2443 -2.89251 -0.00341205 -0.0150605 -0.122031 +EDGE3 217 268 5.24232 6.30096 -3.01367 0.00467514 -0.000390222 0.121208 +EDGE3 218 269 5.25249 6.29153 -3.03227 0.00443477 0.00387701 0.121538 +EDGE3 219 269 5.53548 -0.0176421 -2.97731 -0.00451322 0.0132581 -0.00185255 +EDGE3 220 270 5.52213 -0.00648808 -2.97925 0.00475388 -0.00398332 -0.00995929 +EDGE3 219 268 5.03248 -6.29704 -2.93069 0.00225453 0.00289403 -0.131234 +EDGE3 219 270 5.23215 6.31914 -3.05329 -0.00605935 5.72982e-05 0.131995 +EDGE3 220 269 5.0022 -6.3138 -2.93078 0.00720007 -0.00682822 -0.127204 +EDGE3 220 271 5.23822 6.33092 -3.05399 -0.000412335 0.000605746 0.127995 +EDGE3 221 271 5.51517 -0.0111389 -3.01277 0.0112763 0.00356529 0.00505068 +EDGE3 222 272 5.50915 0.0139361 -3.0059 -0.00835159 0.00192785 0.00690006 +EDGE3 221 270 5.03219 -6.30839 -2.94352 -0.0124484 -0.000292667 -0.118497 +EDGE3 222 271 5.01615 -6.33414 -2.94146 0.00203755 -0.00101235 -0.129842 +EDGE3 221 272 5.23123 6.34195 -3.06182 0.00242542 -0.00446925 0.116497 +EDGE3 223 273 5.52075 -0.000149756 -2.99993 0.000604763 -0.0023122 -0.00311226 +EDGE3 222 273 5.21833 6.34143 -3.07122 -0.00274573 0.00349874 0.130513 +EDGE3 223 272 4.99842 -6.33582 -2.96008 0.00441995 -0.00493651 -0.124767 +EDGE3 223 274 5.20621 6.37323 -3.05518 0.00563142 -0.0025157 0.12439 +EDGE3 224 274 5.51417 0.0119246 -3.03344 0.00602365 0.00117234 0.00331348 +EDGE3 224 273 4.99645 -6.37092 -2.95012 -0.00117516 0.00511441 -0.128256 +EDGE3 225 275 5.50899 -0.00326492 -3.03087 0.00360157 -0.00308821 -0.00714632 +EDGE3 224 275 5.22473 6.38433 -3.06505 -0.00105509 -0.00549735 0.130124 +EDGE3 226 276 5.50797 0.00743388 -3.01963 -0.00366911 -0.0145918 -0.00243786 +EDGE3 225 274 4.99643 -6.38092 -2.96137 -0.0017886 0.00106681 -0.125539 +EDGE3 226 275 5.00093 -6.38836 -2.96633 0.00338015 -0.000891871 -0.130143 +EDGE3 225 276 5.21574 6.39248 -3.08528 -0.0104843 -0.00890487 0.127159 +EDGE3 226 277 5.20909 6.40337 -3.10033 -0.00108852 0.00449258 0.12618 +EDGE3 227 277 5.50744 0.00638313 -3.03994 -0.0036519 0.000757313 -0.00365164 +EDGE3 228 278 5.49568 -0.00932806 -3.04432 -0.00749447 -0.00154948 -0.0012305 +EDGE3 227 276 4.97242 -6.41141 -2.97669 0.000787533 -0.00267261 -0.125722 +EDGE3 228 277 4.99585 -6.41104 -2.97534 -0.0028433 0.00250345 -0.116276 +EDGE3 227 278 5.2025 6.42396 -3.0974 -0.0050579 -0.00257609 0.131659 +EDGE3 228 279 5.20794 6.43943 -3.0991 -0.00350462 -0.00151308 0.132775 +EDGE3 229 279 5.48364 0.000510246 -3.05345 0.00331325 0.00102331 0.00115266 +EDGE3 230 280 5.48863 0.000603872 -3.05648 0.00621932 0.00438185 0.00958958 +EDGE3 229 278 4.9821 -6.43921 -2.99879 0.000608137 -0.0063293 -0.120215 +EDGE3 230 279 4.96582 -6.43688 -2.98534 -0.0013785 -0.00175749 -0.123104 +EDGE3 229 280 5.17877 6.45871 -3.11832 0.00132879 0.00209826 0.127745 +EDGE3 230 281 5.18267 6.46019 -3.1171 0.00359102 0.000175126 0.13148 +EDGE3 231 281 5.49012 -0.01805 -3.05803 0.00542177 0.00968785 -0.0119625 +EDGE3 231 280 4.96542 -6.44952 -3.00274 0.00265113 0.000552572 -0.130552 +EDGE3 232 282 5.48304 0.00226914 -3.07471 0.00216862 -0.00128414 -0.000708762 +EDGE3 231 282 5.1718 6.46288 -3.1307 0.0114639 -0.00524814 0.127516 +EDGE3 232 281 4.95523 -6.47165 -3.03276 0.00356974 -0.00658082 -0.114928 +EDGE3 233 283 5.47151 0.00100731 -3.08639 -0.0020429 -0.00394253 0.00338911 +EDGE3 232 283 5.1799 6.48219 -3.14791 -0.00446491 0.00429073 0.122212 +EDGE3 233 282 4.96438 -6.47367 -3.00375 0.000178466 -0.00192541 -0.129065 +EDGE3 234 284 5.46797 0.0132731 -3.08858 -0.00559802 -0.00491985 -0.00424409 +EDGE3 233 284 5.18676 6.48371 -3.15208 0.00766089 0.00969444 0.122728 +EDGE3 234 283 4.96279 -6.48527 -3.00584 -0.00383465 -0.00182908 -0.123567 +EDGE3 235 285 5.45026 -0.0169477 -3.10045 -0.00603362 0.00191477 -0.00372417 +EDGE3 234 285 5.15661 6.51284 -3.14055 -0.00747502 -0.00693036 0.1287 +EDGE3 235 284 4.95194 -6.51282 -3.02818 0.00662871 -5.03283e-05 -0.121361 +EDGE3 236 286 5.47475 -0.00740574 -3.12291 -0.00225724 -0.0117553 -0.0116044 +EDGE3 235 286 5.16413 6.51527 -3.157 -0.00155674 -0.00398257 0.118644 +EDGE3 236 285 4.94357 -6.52696 -3.04901 -0.00195743 0.00716524 -0.125696 +EDGE3 237 287 5.4811 0.00665819 -3.10516 -0.0012375 -0.00165195 -0.00364606 +EDGE3 236 287 5.15673 6.54727 -3.16333 -0.00244503 0.0145701 0.12535 +EDGE3 237 286 4.94121 -6.50855 -3.04845 -0.00476196 -0.00169207 -0.112113 +EDGE3 238 288 5.44787 0.00394819 -3.12036 0.00319991 -0.00605266 0.00219998 +EDGE3 237 288 5.15877 6.55326 -3.18741 0.0031107 0.0122362 0.126034 +EDGE3 238 287 4.93341 -6.53205 -3.04272 0.00194695 -0.00179728 -0.123819 +EDGE3 239 289 5.45817 0.0111234 -3.1138 0.000512803 -0.00440063 0.000583011 +EDGE3 238 289 5.16256 6.56148 -3.19757 0.00353602 -0.00057207 0.129761 +EDGE3 239 288 4.93501 -6.54121 -3.05213 -0.00126133 -0.00420166 -0.124097 +EDGE3 240 290 5.45053 0.0100044 -3.11913 -0.00411782 -0.000976444 1.80109e-05 +EDGE3 239 290 5.152 6.57817 -3.19872 0.00514163 0.000206234 0.120737 +EDGE3 240 289 4.92825 -6.56288 -3.07441 0.0032601 0.00374743 -0.132422 +EDGE3 241 291 5.43166 0.00862436 -3.11926 0.00406577 -0.00437004 -0.000551912 +EDGE3 240 291 5.1338 6.59208 -3.19954 0.00766373 0.00402098 0.13595 +EDGE3 241 290 4.93627 -6.58294 -3.06661 0.00155676 0.00402179 -0.123722 +EDGE3 242 292 5.44055 -0.00486903 -3.1404 -0.00392076 0.0074179 0.000731179 +EDGE3 242 291 4.93016 -6.57527 -3.09318 -0.00316706 0.000666799 -0.126481 +EDGE3 241 292 5.15313 6.61836 -3.20155 -0.00116943 -0.003175 0.12135 +EDGE3 243 293 5.42508 -0.00934516 -3.13597 0.00476955 0.00663805 -0.00659988 +EDGE3 242 293 5.13859 6.60634 -3.2321 0.000278645 0.00167672 0.130864 +EDGE3 244 294 5.40892 -0.0107356 -3.1453 0.00270068 0.00333384 0.00760643 +EDGE3 243 292 4.92586 -6.62206 -3.09261 0.00202214 0.00119654 -0.12575 +EDGE3 243 294 5.12524 6.63455 -3.22126 0.00828426 0.0013328 0.129956 +EDGE3 244 293 4.9088 -6.62136 -3.08311 -0.00164893 0.00223169 -0.127986 +EDGE3 245 295 5.42048 0.0057147 -3.15328 0.00803038 0.00240249 0.00844143 +EDGE3 244 295 5.11159 6.6501 -3.21226 -0.000550698 -0.00185667 0.124658 +EDGE3 245 294 4.88823 -6.63876 -3.10817 -0.00679315 0.00292588 -0.121018 +EDGE3 246 296 5.42161 0.0153014 -3.17534 0.00593621 -0.00537435 -0.00926714 +EDGE3 245 296 5.09949 6.66048 -3.22853 0.00916531 -0.00413916 0.122669 +EDGE3 246 295 4.90635 -6.62889 -3.11324 0.0021014 0.00136475 -0.129371 +EDGE3 247 297 5.4263 -0.00877355 -3.18383 0.00238451 -0.00290521 0.000257543 +EDGE3 246 297 5.09639 6.68724 -3.22701 0.00787618 0.000947643 0.1243 +EDGE3 247 296 4.87912 -6.66273 -3.11925 -0.000130779 -0.00151923 -0.130224 +EDGE3 248 298 5.43265 -0.00434997 -3.18155 0.00182059 -0.00168597 0.00618919 +EDGE3 247 298 5.0927 6.69043 -3.23346 0.00244651 0.00213085 0.131549 +EDGE3 248 297 4.88172 -6.68042 -3.12005 0.00651999 -0.000336627 -0.134107 +EDGE3 249 299 5.40456 0.0151498 -3.20193 0.00277883 0.00570035 0.00336773 +EDGE3 248 299 5.0888 6.69792 -3.24818 -0.000177389 -0.00198716 0.123436 +EDGE3 249 298 4.88239 -6.69162 -3.10618 -0.0112478 0.00251019 -0.126545 +EDGE3 250 300 5.39933 0.00813087 -3.21225 -0.00297852 0.0048837 0.00600314 +EDGE3 249 300 5.09878 6.72075 -3.25086 0.0106186 0.00020785 0.126653 +EDGE3 250 299 4.89959 -6.69853 -3.13103 -0.000412611 0.000196737 -0.123394 +EDGE3 251 301 5.41067 0.00083568 -3.21539 0.000496562 0.000990227 0.000837513 +EDGE3 251 300 4.85693 -6.71508 -3.13652 -0.00281962 -0.00385658 -0.127052 +EDGE3 250 301 5.09008 6.72705 -3.25139 0.00742812 0.0029925 0.126313 +EDGE3 252 302 5.39622 -0.00538103 -3.17504 0.00297166 -0.000514373 -0.00139814 +EDGE3 251 302 5.1135 6.73372 -3.27022 -0.00170259 -0.000376412 0.119803 +EDGE3 252 301 4.85995 -6.72822 -3.14297 0.00750694 -0.00570432 -0.127131 +EDGE3 253 303 5.39368 -0.0021081 -3.22232 0.000475584 -0.00755415 -0.000627045 +EDGE3 252 303 5.08017 6.74682 -3.26979 -0.00158622 -0.00401124 0.127568 +EDGE3 253 302 4.87687 -6.73723 -3.17254 -0.00164508 -0.00218044 -0.127781 +EDGE3 254 304 5.37352 0.0205802 -3.22174 0.0067146 0.00482225 0.00342044 +EDGE3 253 304 5.05817 6.77577 -3.28736 -0.00182185 -0.00175093 0.131061 +EDGE3 254 303 4.86381 -6.7623 -3.17046 0.00231894 -0.00440473 -0.120624 +EDGE3 255 305 5.38145 -0.00345948 -3.23045 -0.0027773 0.00250695 -0.00174968 +EDGE3 254 305 5.07976 6.78685 -3.29042 -0.00333686 -0.0130463 0.133745 +EDGE3 255 304 4.8569 -6.78377 -3.16787 0.00567279 0.000501424 -0.126119 +EDGE3 256 306 5.38497 0.0182302 -3.23946 0.0026426 -0.000784359 -0.00626292 +EDGE3 255 306 5.075 6.79204 -3.29428 0.00342846 -0.00262557 0.123821 +EDGE3 256 305 4.82759 -6.78633 -3.17726 0.00592224 -0.007314 -0.126964 +EDGE3 257 307 5.3813 -0.000308903 -3.24652 -0.00948695 -0.00906708 0.00157051 +EDGE3 257 306 4.83632 -6.79318 -3.18393 0.00438808 0.00194382 -0.12117 +EDGE3 256 307 5.07909 6.80204 -3.30585 -0.00150696 -0.000897198 0.127209 +EDGE3 258 308 5.36728 0.00137117 -3.25205 0.00758383 -0.00227775 -0.00345179 +EDGE3 257 308 5.03753 6.82899 -3.33468 -0.00235691 -0.000669521 0.120767 +EDGE3 258 307 4.84409 -6.82378 -3.19449 -0.00705895 -0.00271906 -0.127771 +EDGE3 259 309 5.36424 0.00554813 -3.25916 -0.00616131 0.00551423 0.000323097 +EDGE3 258 309 5.05077 6.83824 -3.31713 -0.00460874 0.00397837 0.114516 +EDGE3 259 308 4.83782 -6.82686 -3.20179 0.00344517 0.000880065 -0.125318 +EDGE3 260 310 5.38082 -0.00443584 -3.26877 -0.00106722 0.00233864 0.00383481 +EDGE3 259 310 5.05586 6.85435 -3.33275 -0.00720592 -0.00435552 0.133339 +EDGE3 260 309 4.82717 -6.82137 -3.19145 0.00203539 0.0125647 -0.116785 +EDGE3 261 311 5.36926 -0.00650657 -3.26492 -0.000120723 -0.000841319 0.00735514 +EDGE3 260 311 5.05391 6.86216 -3.33276 -0.00228272 0.00774138 0.128304 +EDGE3 261 310 4.81866 -6.85119 -3.20953 0.00227368 0.00664809 -0.122443 +EDGE3 262 312 5.35635 -0.00282258 -3.24847 -0.00412182 -0.000169067 -0.00461352 +EDGE3 261 312 5.03066 6.88057 -3.33992 0.00300346 -0.0137782 0.12509 +EDGE3 262 311 4.81763 -6.86299 -3.20588 0.00155772 -0.00481732 -0.120012 +EDGE3 263 313 5.3372 -0.0158583 -3.30367 -8.60871e-05 0.00126905 -0.00124473 +EDGE3 262 313 5.04164 6.87276 -3.33733 0.00595866 -5.70527e-06 0.131523 +EDGE3 263 312 4.82521 -6.88601 -3.21523 0.000763975 0.00836663 -0.123322 +EDGE3 264 314 5.34177 0.000814248 -3.29855 -0.00268505 0.000753952 -0.0010966 +EDGE3 263 314 5.02236 6.90389 -3.34336 0.0106759 -0.00589425 0.128413 +EDGE3 264 313 4.80602 -6.89411 -3.21239 0.00501782 0.00111687 -0.131643 +EDGE3 265 315 5.3413 -0.00959307 -3.2901 -0.00223825 0.00146348 -0.00307337 +EDGE3 264 315 5.00667 6.91518 -3.35169 -0.0055706 0.00241409 0.122952 +EDGE3 265 314 4.81887 -6.91634 -3.22234 -0.00122376 -0.000212156 -0.128928 +EDGE3 266 316 5.34154 -0.00288012 -3.32434 -0.00869203 0.00252905 -0.00442364 +EDGE3 265 316 5.01078 6.92099 -3.36775 0.00169323 -0.0120643 0.127417 +EDGE3 266 315 4.80356 -6.90957 -3.2431 -0.00664684 -3.36993e-05 -0.122999 +EDGE3 267 317 5.32999 -0.00642501 -3.31268 0.00160127 -0.00525228 0.0100557 +EDGE3 266 317 5.01756 6.93346 -3.37179 0.00453221 0.00528213 0.129261 +EDGE3 267 316 4.77767 -6.92316 -3.23968 0.00645285 0.00987134 -0.120023 +EDGE3 268 318 5.34975 0.0122049 -3.32866 0.00232917 -0.00111033 -0.00212467 +EDGE3 267 318 5.01399 6.94519 -3.37089 -0.00491123 0.00203469 0.124224 +EDGE3 268 317 4.78893 -6.93772 -3.25043 0.00382879 0.00530138 -0.130831 +EDGE3 269 319 5.32472 -0.0034687 -3.31924 5.51239e-05 -0.000242999 -0.00362235 +EDGE3 268 319 5.00354 6.95292 -3.40433 -0.00419935 0.00393593 0.132912 +EDGE3 269 318 4.78472 -6.95715 -3.24832 0.00965665 0.00799651 -0.12045 +EDGE3 270 320 5.32618 0.00888813 -3.35734 0.00239 -0.000225544 0.00188561 +EDGE3 269 320 4.99824 6.96473 -3.40227 0.00536281 0.00450597 0.122742 +EDGE3 270 319 4.77086 -6.97035 -3.26716 0.00976577 -0.00306358 -0.128053 +EDGE3 271 321 5.31425 0.00983701 -3.34013 0.00403641 0.00113441 -0.00319915 +EDGE3 270 321 4.97671 6.9835 -3.39554 -0.00345172 -0.00178737 0.121862 +EDGE3 271 320 4.77729 -6.97 -3.2671 0.00426974 0.0089309 -0.126248 +EDGE3 272 322 5.3127 -0.00047001 -3.35381 0.0100724 -0.0064886 0.00970991 +EDGE3 271 322 4.99153 7.00617 -3.41097 0.00148069 0.00345704 0.131892 +EDGE3 272 321 4.77213 -6.99046 -3.29368 -0.00147294 -0.00227328 -0.130607 +EDGE3 273 323 5.31904 -0.00866203 -3.33558 0.00768825 -0.00444776 0.00805644 +EDGE3 272 323 4.96925 7.01963 -3.41329 0.00907159 0.00331943 0.127475 +EDGE3 273 322 4.77239 -7.0253 -3.28563 0.0107447 0.000875417 -0.121445 +EDGE3 274 324 5.30576 0.00528195 -3.34099 0.00686695 -0.000954944 -0.00376616 +EDGE3 273 324 4.98007 7.01751 -3.44573 -0.000240119 0.00203245 0.121152 +EDGE3 274 323 4.76368 -7.02255 -3.27398 0.00605046 0.000954305 -0.129642 +EDGE3 275 325 5.30366 -0.000733496 -3.37514 0.00684711 -0.00177394 0.000724025 +EDGE3 274 325 4.95174 7.05491 -3.43747 0.00531212 -0.00114522 0.130808 +EDGE3 275 324 4.75829 -7.03927 -3.30075 0.00167727 0.00757102 -0.126605 +EDGE3 276 326 5.29701 -0.00884783 -3.36267 9.63852e-05 0.0055247 -0.00230038 +EDGE3 275 326 4.96677 7.06858 -3.44353 0.000538449 0.0106302 0.11951 +EDGE3 276 325 4.75673 -7.02554 -3.29616 -0.00263592 -0.000361563 -0.131996 +EDGE3 277 327 5.30923 -0.000414631 -3.38874 -0.00342415 -0.00814345 0.00680564 +EDGE3 276 327 4.95408 7.07626 -3.4497 0.00422264 0.00256547 0.129127 +EDGE3 277 326 4.73723 -7.06489 -3.32266 -0.00344716 0.000691333 -0.128637 +EDGE3 278 328 5.31552 0.00362209 -3.38106 -0.00247284 0.00803886 -0.00614412 +EDGE3 277 328 4.95582 7.0906 -3.44805 -0.00111338 0.000577849 0.127826 +EDGE3 278 327 4.73156 -7.0878 -3.32598 -0.00370094 0.00122652 -0.128847 +EDGE3 279 329 5.27515 -0.0101051 -3.38517 0.00456258 0.00275102 0.00484745 +EDGE3 278 329 4.95016 7.09391 -3.45135 0.000443529 -0.00295582 0.120287 +EDGE3 279 328 4.75325 -7.07823 -3.32672 0.00271708 6.75249e-05 -0.12499 +EDGE3 280 330 5.28396 0.00321603 -3.40262 0.00603177 -0.00385507 0.00118044 +EDGE3 279 330 4.93358 7.12576 -3.46284 -0.00296045 0.00227558 0.127415 +EDGE3 280 329 4.73094 -7.09562 -3.32803 -0.00523736 -0.00433921 -0.125377 +EDGE3 281 331 5.26972 0.0224014 -3.38718 -0.00632536 0.00159225 0.0024423 +EDGE3 280 331 4.93153 7.13552 -3.466 0.00432328 0.00310229 0.124446 +EDGE3 281 330 4.72143 -7.07438 -3.33263 0.00117903 -0.00404315 -0.130857 +EDGE3 282 332 5.27076 0.00222047 -3.42029 -0.0043592 -0.00346917 0.00700112 +EDGE3 281 332 4.9296 7.13237 -3.48967 -0.00674608 -0.00571493 0.131041 +EDGE3 282 331 4.73063 -7.11675 -3.34812 0.00387357 0.00715841 -0.13926 +EDGE3 283 333 5.26606 0.00316672 -3.42244 -0.00394095 0.00125985 0.00608847 +EDGE3 283 332 4.70984 -7.14131 -3.34317 -0.00128959 -0.0068415 -0.129993 +EDGE3 282 333 4.93218 7.1529 -3.48956 0.00834592 -0.00425056 0.123028 +EDGE3 283 334 4.91817 7.1598 -3.5008 -0.00260229 -0.00267104 0.124957 +EDGE3 284 334 5.25345 0.0101857 -3.41853 0.00300856 -0.00401419 -0.00300591 +EDGE3 285 335 5.25458 -0.00694611 -3.42936 -0.00145348 0.0086461 0.00508639 +EDGE3 284 333 4.71603 -7.14881 -3.35085 0.00087731 0.00200956 -0.135854 +EDGE3 285 334 4.70884 -7.16362 -3.35226 0.00475534 0.00309204 -0.125194 +EDGE3 284 335 4.92487 7.17077 -3.49546 0.00303139 0.00661435 0.115379 +EDGE3 285 336 4.91872 7.17326 -3.50102 0.00539882 0.00256458 0.12944 +EDGE3 286 336 5.27306 0.0131506 -3.42832 -0.00683929 0.00300978 0.0051484 +EDGE3 286 335 4.71324 -7.16693 -3.3728 0.00367022 -0.0125966 -0.130253 +EDGE3 287 337 5.27263 -0.0219927 -3.43973 -0.000109206 -0.00331181 0.005187 +EDGE3 287 336 4.69797 -7.19129 -3.37384 0.00686909 -0.0101516 -0.122963 +EDGE3 286 337 4.91255 7.19295 -3.49994 0.00235877 0.00271487 0.130435 +EDGE3 287 338 4.89709 7.22271 -3.51303 0.0088595 -4.56621e-05 0.126314 +EDGE3 288 338 5.23937 -0.00513111 -3.44776 0.00314584 -0.00526636 0.0077139 +EDGE3 289 339 5.23563 -0.0143446 -3.4617 -0.00989623 -0.000472679 0.00677214 +EDGE3 288 337 4.68468 -7.19317 -3.3767 -0.00106196 -0.00318699 -0.13387 +EDGE3 289 338 4.675 -7.21426 -3.39375 0.000997063 -0.00636891 -0.121707 +EDGE3 288 339 4.90814 7.22878 -3.52055 -0.000913168 -0.000920795 0.115553 +EDGE3 289 340 4.88888 7.2394 -3.52267 -0.0028627 -0.00570697 0.122994 +EDGE3 290 340 5.2295 0.00188221 -3.46116 -0.00434062 0.00202252 0.000374372 +EDGE3 291 341 5.22297 0.00112411 -3.46572 0.00183029 -0.00576059 0.00788 +EDGE3 290 339 4.6815 -7.23937 -3.40209 0.00208773 -0.00533075 -0.130698 +EDGE3 291 340 4.67689 -7.24437 -3.39699 0.000525311 0.00209842 -0.125583 +EDGE3 290 341 4.87221 7.25773 -3.53869 -0.000673119 -0.00123875 0.121079 +EDGE3 291 342 4.89265 7.25651 -3.53389 0.0094974 0.0111056 0.122576 +EDGE3 292 342 5.23107 0.0036855 -3.48859 0.00433732 -0.000527689 -0.00370109 +EDGE3 292 341 4.67478 -7.2437 -3.40606 -0.00393988 0.0017299 -0.120952 +EDGE3 293 343 5.23099 -0.00281096 -3.46143 0.00494847 0.0022926 -0.00311287 +EDGE3 293 342 4.6472 -7.26485 -3.41132 0.00623181 0.00533696 -0.120062 +EDGE3 292 343 4.8593 7.26975 -3.55761 -0.00131468 0.00235821 0.130712 +EDGE3 294 344 5.21395 -6.03386e-05 -3.50948 0.00541413 -0.00300986 -0.00364755 +EDGE3 293 344 4.87142 7.28286 -3.57095 -0.00427414 0.00410075 0.121784 +EDGE3 294 343 4.65879 -7.25234 -3.41387 -0.00353217 0.00435463 -0.123299 +EDGE3 294 345 4.86422 7.31563 -3.55943 0.00393639 -0.00249 0.129747 +EDGE3 295 345 5.20824 0.0183396 -3.49286 -0.00421197 0.00709284 -0.00532277 +EDGE3 295 344 4.64913 -7.28184 -3.44068 0.0014658 0.00597931 -0.122072 +EDGE3 296 346 5.21647 -0.00822866 -3.52919 -0.00324745 0.0057251 -0.000538479 +EDGE3 295 346 4.8818 7.30648 -3.56118 0.000422618 0.0022513 0.122864 +EDGE3 296 345 4.6505 -7.30003 -3.4258 -0.00637986 -0.00134523 -0.124619 +EDGE3 297 347 5.2015 0.0198264 -3.52329 0.00117392 -0.00124138 -0.00589716 +EDGE3 297 346 4.63027 -7.31738 -3.44967 -0.00118144 -0.0060611 -0.116847 +EDGE3 296 347 4.85705 7.32633 -3.59102 -0.00329295 0.00526941 0.125969 +EDGE3 298 348 5.20122 -0.00702076 -3.51647 -0.00153437 -0.00315206 -0.0056583 +EDGE3 297 348 4.85261 7.3676 -3.59127 0.00440251 0.00134394 0.113785 +EDGE3 298 347 4.62493 -7.33831 -3.45149 0.00862939 -0.00448048 -0.11856 +EDGE3 298 349 4.86003 7.36735 -3.60227 0.00412265 0.00291451 0.118019 +EDGE3 299 349 5.19349 0.00158059 -3.50666 0.00281171 0.00503243 0.00154164 +EDGE3 300 350 5.20798 -0.00618375 -3.53289 0.00760205 0.000930222 -0.00237812 +EDGE3 299 348 4.63105 -7.32634 -3.45171 -0.00145691 0.00110253 -0.124696 +EDGE3 299 350 4.82996 7.36763 -3.60765 0.00406258 0.00412285 0.121856 +EDGE3 300 349 4.63802 -7.35895 -3.46214 -0.0105528 0.00261566 -0.122303 +EDGE3 300 351 4.8221 7.38695 -3.61685 -0.00522341 0.0023905 0.126793 +EDGE3 301 351 5.18521 -0.0198223 -3.53 -0.00786829 -0.00756402 0.00681044 +EDGE3 301 350 4.63089 -7.35775 -3.4667 0.0013421 -0.0100733 -0.124341 +EDGE3 302 352 5.18826 0.00197664 -3.5428 0.00231724 0.00163158 0.00394299 +EDGE3 302 351 4.6086 -7.37857 -3.46896 -0.00516796 0.00622784 -0.122651 +EDGE3 301 352 4.83067 7.40378 -3.61332 -0.00332967 -0.00174264 0.12348 +EDGE3 303 353 5.19223 -0.0183207 -3.56474 -0.000138575 -0.000629148 -0.00617778 +EDGE3 302 353 4.82893 7.40769 -3.62899 0.000648136 0.00612907 0.120924 +EDGE3 303 352 4.61915 -7.38958 -3.49484 0.00529113 0.00154781 -0.125388 +EDGE3 303 354 4.81161 7.40616 -3.62146 0.0064561 -0.00123142 0.123501 +EDGE3 304 354 5.1802 -0.0016878 -3.5434 -0.000133045 -0.00169137 0.000416754 +EDGE3 305 355 5.17575 0.00933508 -3.55473 -0.00808288 0.0117736 -0.00031732 +EDGE3 304 353 4.61143 -7.39372 -3.47867 -0.00779878 0.0105422 -0.128794 +EDGE3 305 354 4.60188 -7.43271 -3.50745 -0.00130728 -0.00120823 -0.129831 +EDGE3 304 355 4.81899 7.43288 -3.64818 -0.00919267 -0.00147422 0.123198 +EDGE3 306 356 5.16891 -0.000348674 -3.5783 -0.00444664 -0.0048138 -0.00303024 +EDGE3 305 356 4.78846 7.43657 -3.61986 0.00128933 0.00382521 0.119512 +EDGE3 306 355 4.61475 -7.44814 -3.49232 0.00226921 0.00401331 -0.117983 +EDGE3 306 357 4.80174 7.48053 -3.64725 0.00413559 0.00526274 0.13057 +EDGE3 307 357 5.15888 0.00168566 -3.57661 0.00335223 -0.0103393 -0.00192021 +EDGE3 307 356 4.61197 -7.4424 -3.50066 -0.00696626 0.0038236 -0.120756 +EDGE3 308 358 5.15732 -0.00170081 -3.58842 0.000777634 -0.00188635 -0.00492502 +EDGE3 307 358 4.79288 7.4481 -3.65137 0.0109289 0.00286741 0.125838 +EDGE3 308 357 4.5874 -7.46866 -3.49513 -0.0124088 0.00239726 -0.133055 +EDGE3 309 359 5.16267 -0.011913 -3.6099 -0.0052221 -0.00123747 -0.00558877 +EDGE3 309 358 4.58534 -7.46716 -3.51699 0.000661772 -0.00527076 -0.123893 +EDGE3 308 359 4.77646 7.49874 -3.65473 0.00375709 -0.00212942 0.123314 +EDGE3 310 360 5.15613 -0.00676186 -3.58818 0.00515092 -0.00168444 -0.00230858 +EDGE3 309 360 4.77329 7.49046 -3.66944 0.00300008 -0.00448722 0.124629 +EDGE3 310 359 4.5854 -7.46714 -3.50692 -0.00114439 -0.00262357 -0.120497 +EDGE3 310 361 4.77054 7.49984 -3.66051 0.00598418 0.00651171 0.125241 +EDGE3 311 361 5.1554 0.00169213 -3.59582 0.000390798 -0.00571874 -0.00723143 +EDGE3 312 362 5.13489 0.0109115 -3.60482 -0.00613456 -0.00377641 -0.00355483 +EDGE3 311 360 4.57274 -7.5155 -3.50853 -0.00114815 0.00145272 -0.130297 +EDGE3 312 361 4.56995 -7.50106 -3.51624 -0.000264858 0.00442652 -0.12955 +EDGE3 311 362 4.76898 7.5123 -3.65724 -0.00152231 -0.00536298 0.131292 +EDGE3 312 363 4.77641 7.53275 -3.65812 0.00160941 0.00324989 0.12889 +EDGE3 313 363 5.14432 -0.00244244 -3.61247 0.00762064 0.00675734 -0.00369396 +EDGE3 313 362 4.56284 -7.51367 -3.5286 -0.0045661 -0.00138884 -0.126264 +EDGE3 314 364 5.11153 -0.00158307 -3.61078 -0.000804189 -0.00208261 -0.00748232 +EDGE3 313 364 4.76757 7.54431 -3.68145 -0.00142991 0.00433295 0.12435 +EDGE3 315 365 5.11869 -0.00293335 -3.62299 -0.00426283 -0.0023868 0.00139749 +EDGE3 314 363 4.56319 -7.54313 -3.55927 0.00343744 -0.0033267 -0.13163 +EDGE3 315 364 4.54847 -7.5318 -3.54709 -0.00687866 -0.00132723 -0.120884 +EDGE3 314 365 4.75019 7.56652 -3.6987 0.00951762 0.00207759 0.12031 +EDGE3 315 366 4.7441 7.56844 -3.7084 0.00518891 0.00751403 0.126363 +EDGE3 316 366 5.1099 0.0109213 -3.63342 0.00115441 -0.0029587 -0.00518759 +EDGE3 316 365 4.55987 -7.56201 -3.5702 0.000310677 0.0013978 -0.125583 +EDGE3 317 367 5.13464 0.00281821 -3.61914 0.00479334 -0.000981886 -0.00758962 +EDGE3 316 367 4.7511 7.59105 -3.71473 0.00490971 -0.00033883 0.129078 +EDGE3 318 368 5.11945 0.000757482 -3.66104 -0.00224391 -0.00302172 -0.00508161 +EDGE3 317 366 4.55466 -7.55802 -3.55487 0.00660199 -0.00520606 -0.125313 +EDGE3 318 367 4.54488 -7.58847 -3.57734 -0.00258183 0.0046155 -0.12355 +EDGE3 317 368 4.7499 7.60446 -3.7167 0.00131168 0.00128628 0.130647 +EDGE3 319 369 5.10886 -0.00994389 -3.65762 0.000441408 -0.00623437 -0.0017055 +EDGE3 318 369 4.7442 7.60388 -3.72096 -0.000989965 0.00647954 0.130643 +EDGE3 319 368 4.53896 -7.57344 -3.59383 -0.00600196 0.00251413 -0.121998 +EDGE3 320 370 5.11717 -0.00719236 -3.6749 -0.0013097 -0.00755472 0.00731651 +EDGE3 319 370 4.73118 7.62864 -3.73163 0.00168694 -0.00121312 0.122794 +EDGE3 320 369 4.52363 -7.59098 -3.58188 0.00715951 -0.00384393 -0.125575 +EDGE3 321 371 5.11018 0.00659597 -3.66973 -0.0029433 0.00131195 0.00413438 +EDGE3 320 371 4.70403 7.64376 -3.74083 0.00328758 -0.000922663 0.118704 +EDGE3 321 370 4.5232 -7.61178 -3.59258 -0.000152425 0.00187952 -0.126411 +EDGE3 322 372 5.1004 0.00673136 -3.67494 -0.000491537 0.00470768 -0.00222359 +EDGE3 321 372 4.71606 7.65125 -3.76729 -0.00550151 0.00185853 0.125216 +EDGE3 322 371 4.50665 -7.62888 -3.57787 0.00178917 0.00682545 -0.128463 +EDGE3 323 373 5.104 0.0104661 -3.67376 0.00656823 0.00301126 -0.00264311 +EDGE3 322 373 4.70883 7.6548 -3.73591 -0.00283797 0.00826127 0.129503 +EDGE3 323 372 4.52899 -7.64943 -3.59538 -0.00525952 0.00108687 -0.123604 +EDGE3 324 374 5.06849 -0.00541623 -3.69268 0.00855555 0.0106644 0.00473618 +EDGE3 323 374 4.71393 7.66471 -3.77234 -0.00247908 0.00178324 0.125719 +EDGE3 324 373 4.50719 -7.65011 -3.61784 -0.00701898 0.00447824 -0.120935 +EDGE3 325 375 5.07964 -0.0123011 -3.68635 -0.000432729 -0.00488317 -0.00523085 +EDGE3 324 375 4.71832 7.66912 -3.78193 -0.000533478 0.00377659 0.124391 +EDGE3 325 374 4.49059 -7.68733 -3.60857 -0.00207099 -0.0023721 -0.120907 +EDGE3 326 376 5.06142 0.00857789 -3.69571 0.00505374 -0.00404372 -0.00654221 +EDGE3 325 376 4.69887 7.69094 -3.77465 -0.0113286 0.000878981 0.124581 +EDGE3 326 375 4.4938 -7.6671 -3.61888 0.00249322 -0.00636655 -0.129164 +EDGE3 327 377 5.06841 -0.00128512 -3.69641 0.00844676 -0.00174208 -0.000794641 +EDGE3 326 377 4.70374 7.71111 -3.76744 0.00452571 0.00461192 0.126306 +EDGE3 327 376 4.48832 -7.69642 -3.6208 -0.00115376 -0.00461354 -0.118722 +EDGE3 328 378 5.07642 -0.0124288 -3.72591 0.00393803 -0.00697853 -0.00174498 +EDGE3 327 378 4.65454 7.71284 -3.7749 -0.000307572 -0.0092107 0.133214 +EDGE3 328 377 4.46614 -7.7034 -3.62058 -0.00772183 -0.00759098 -0.122143 +EDGE3 329 379 5.06823 0.00254853 -3.73311 0.00926039 0.00586166 0.00293346 +EDGE3 328 379 4.68742 7.75239 -3.77732 -0.0128152 0.00143088 0.132932 +EDGE3 329 378 4.47478 -7.70583 -3.61802 -0.00276804 0.00675404 -0.11492 +EDGE3 330 380 5.08048 0.0104838 -3.73695 -0.000258345 -0.00479206 0.000565091 +EDGE3 329 380 4.67565 7.74221 -3.79901 -0.00457615 0.00234753 0.120683 +EDGE3 330 379 4.46535 -7.74197 -3.64818 -0.000738568 -0.00684931 -0.126316 +EDGE3 331 381 5.06273 0.00473243 -3.72695 -0.0099737 -0.00188187 -0.000940728 +EDGE3 330 381 4.66762 7.7573 -3.79597 0.00562467 -0.00756877 0.126954 +EDGE3 331 380 4.46236 -7.74217 -3.65984 0.00469702 0.00448384 -0.125584 +EDGE3 332 382 5.03988 -0.00474901 -3.74532 -0.00262537 -0.00132171 -0.00230994 +EDGE3 331 382 4.66118 7.76664 -3.80789 0.00924951 -0.0039651 0.126674 +EDGE3 332 381 4.46249 -7.75677 -3.65522 0.00187573 0.00275606 -0.131749 +EDGE3 333 383 5.03589 0.0175517 -3.7563 0.00485334 0.000462331 0.000245739 +EDGE3 332 383 4.64077 7.78382 -3.81455 0.00504277 0.00204101 0.134913 +EDGE3 333 382 4.44585 -7.77146 -3.68641 0.000925746 0.00792186 -0.131931 +EDGE3 334 384 5.03527 -0.0018251 -3.75224 0.00331544 -0.00228455 0.000625089 +EDGE3 333 384 4.66634 7.80395 -3.82592 -0.0116588 -0.00200891 0.118595 +EDGE3 334 383 4.45522 -7.78469 -3.67846 -0.00544015 -0.000445811 -0.13155 +EDGE3 335 385 5.02008 -0.00546497 -3.76129 8.87587e-05 -0.00920985 0.00559895 +EDGE3 334 385 4.65739 7.80763 -3.85247 0.00203164 -0.00769545 0.135167 +EDGE3 335 384 4.45397 -7.7687 -3.67883 -0.000937056 -0.0014124 -0.129615 +EDGE3 336 386 5.03023 0.0112397 -3.77542 -0.0103919 0.00356547 0.000823122 +EDGE3 335 386 4.64327 7.81319 -3.85476 0.000655539 0.0083018 0.131288 +EDGE3 336 385 4.43866 -7.80083 -3.69008 0.00238642 -0.00809175 -0.125833 +EDGE3 337 387 5.02415 0.0111479 -3.76232 -0.0045081 -0.00187194 0.0070478 +EDGE3 336 387 4.64037 7.8315 -3.84794 -0.00539877 -0.00396664 0.124774 +EDGE3 337 386 4.43058 -7.81326 -3.69106 -0.00395819 0.0026372 -0.117537 +EDGE3 338 388 5.02551 -0.00177614 -3.76476 0.00683327 -0.00564778 -0.00898816 +EDGE3 337 388 4.64839 7.83148 -3.84044 -0.00462735 -0.0085297 0.124985 +EDGE3 338 387 4.42797 -7.84025 -3.68615 0.00789601 -0.00237466 -0.117125 +EDGE3 339 389 5.02837 -0.0130423 -3.78011 -0.00132524 0.00459681 0.0047369 +EDGE3 338 389 4.62712 7.83479 -3.84777 -0.000344857 0.00709117 0.129234 +EDGE3 339 388 4.41725 -7.83962 -3.69963 0.00257468 -0.00796599 -0.123356 +EDGE3 340 390 5.00666 0.0015451 -3.7959 0.0058095 0.00943503 -0.00229497 +EDGE3 339 390 4.62899 7.86684 -3.85957 -0.00177122 -0.00242763 0.136042 +EDGE3 340 389 4.41756 -7.8542 -3.70838 0.000854946 -0.00036804 -0.120285 +EDGE3 341 391 5.01263 -0.00450694 -3.80809 -0.000265533 0.0100209 -0.00742185 +EDGE3 340 391 4.61307 7.88668 -3.85863 0.00254935 -0.00605278 0.119872 +EDGE3 341 390 4.41345 -7.87187 -3.73619 -0.00983164 0.000274363 -0.126221 +EDGE3 342 392 4.99801 -0.00661182 -3.80441 -0.00193643 0.000863579 0.00621028 +EDGE3 341 392 4.61436 7.89708 -3.86513 -0.00068812 0.00711011 0.138367 +EDGE3 342 391 4.41156 -7.87705 -3.74114 0.000972471 -0.00398341 -0.129168 +EDGE3 343 393 4.99443 -0.0134479 -3.82299 -0.00529948 -0.00266649 0.00525289 +EDGE3 342 393 4.60678 7.8869 -3.87608 -0.00239984 -0.00234137 0.122291 +EDGE3 343 392 4.4027 -7.88152 -3.71704 0.00339445 -0.00297566 -0.116958 +EDGE3 344 394 4.99036 0.0038501 -3.82268 0.000449781 -0.00771565 0.00215886 +EDGE3 343 394 4.59127 7.925 -3.88018 0.00268071 0.00913486 0.130336 +EDGE3 344 393 4.40116 -7.90468 -3.74116 0.0121208 -0.00661542 -0.116291 +EDGE3 345 395 4.9769 0.0165764 -3.8301 0.000390736 0.000869437 0.00486579 +EDGE3 344 395 4.60265 7.91649 -3.89904 0.00307459 0.00404805 0.127409 +EDGE3 345 394 4.39139 -7.90923 -3.73106 -0.000897178 -0.00378701 -0.121292 +EDGE3 346 396 4.98362 -0.0226614 -3.82845 -0.00277821 0.00219071 -0.00276573 +EDGE3 345 396 4.57571 7.94452 -3.88035 -0.00261042 -0.00487108 0.12797 +EDGE3 346 395 4.36995 -7.94154 -3.73081 -0.00148922 -0.00807076 -0.123094 +EDGE3 347 397 4.97392 0.0104379 -3.83003 -0.00904234 -0.0031929 0.000792214 +EDGE3 346 397 4.59403 7.95425 -3.91384 -0.00609907 0.00466886 0.128546 +EDGE3 347 396 4.36967 -7.93159 -3.76081 0.00131358 0.00171544 -0.115889 +EDGE3 348 398 4.96127 -0.0174523 -3.84232 -0.00191327 -0.000499655 0.00405152 +EDGE3 347 398 4.58851 7.96818 -3.91725 -0.00194372 -0.00183641 0.120014 +EDGE3 348 397 4.37238 -7.95723 -3.74827 -0.00771918 -0.00845821 -0.119941 +EDGE3 349 399 4.97217 0.00263291 -3.82564 -0.00115816 0.000622225 -0.000931302 +EDGE3 348 399 4.5709 7.97975 -3.91574 -0.00314144 -0.00029531 0.130894 +EDGE3 349 398 4.36857 -7.94575 -3.76298 -0.00169906 0.00262548 -0.125164 +EDGE3 350 400 4.97158 0.00796588 -3.85914 0.0153152 -0.00756615 0.00154984 +EDGE3 349 400 4.56331 7.98318 -3.92962 0.00296887 -0.00069307 0.11805 +EDGE3 350 399 4.36876 -7.95946 -3.7666 0.00346655 -0.0126685 -0.125872 +EDGE3 351 401 4.95679 0.0196543 -3.86608 0.00333032 0.00496832 -0.0018899 +EDGE3 350 401 4.54953 8.00478 -3.93261 0.00633296 -0.0056816 0.115595 +EDGE3 351 400 4.35709 -7.97257 -3.78395 -0.00893347 -0.00550349 -0.128877 +EDGE3 352 402 4.9479 0.0202718 -3.87565 0.0042 0.0109065 0.00750408 +EDGE3 351 402 4.54827 8.02094 -3.93395 0.00543631 -0.00238215 0.11983 +EDGE3 352 401 4.3509 -8.00137 -3.79433 0.000258262 0.00248269 -0.126069 +EDGE3 353 403 4.97094 0.00656891 -3.88351 0.000967876 -0.00191513 -0.000823 +EDGE3 352 403 4.54606 8.01971 -3.92846 0.00370851 -0.0042957 0.115558 +EDGE3 353 402 4.36032 -8.0005 -3.79494 -0.00101843 -1.45854e-05 -0.12755 +EDGE3 354 404 4.94321 0.000866796 -3.85967 -0.00231341 -0.00507498 -0.00325392 +EDGE3 353 404 4.53802 8.034 -3.9549 -0.00870796 0.000309774 0.122371 +EDGE3 354 403 4.3427 -8.03834 -3.80889 0.00180847 -0.00595298 -0.117025 +EDGE3 355 405 4.9601 0.00668282 -3.87911 -0.00188927 0.00897153 -0.0014764 +EDGE3 354 405 4.53679 8.06909 -3.9625 0.000904624 0.00104172 0.128238 +EDGE3 355 404 4.33386 -8.0327 -3.79066 -0.00141185 0.00650725 -0.129932 +EDGE3 356 406 4.92512 -0.0140995 -3.90582 -0.00163314 -0.00336223 0.000725895 +EDGE3 355 406 4.50891 8.06352 -3.96353 0.00678225 0.00113704 0.132028 +EDGE3 356 405 4.34827 -8.05724 -3.80597 -0.00164758 0.00107093 -0.133234 +EDGE3 357 407 4.92834 0.00401079 -3.88636 -0.0057786 -0.00520713 -0.00609876 +EDGE3 356 407 4.51622 8.0763 -3.97294 0.000985639 -0.00062198 0.124648 +EDGE3 357 406 4.33071 -8.04641 -3.80706 -0.00181967 0.00852725 -0.126467 +EDGE3 358 408 4.92374 -0.00769128 -3.88007 -0.000246349 0.00397473 0.00406293 +EDGE3 357 408 4.51429 8.08558 -3.96669 0.0104701 -0.00635154 0.121852 +EDGE3 358 407 4.32092 -8.0872 -3.81755 0.000578147 0.00177707 -0.118891 +EDGE3 359 409 4.91243 -4.48047e-05 -3.92197 0.00110176 -0.017488 -0.00436426 +EDGE3 358 409 4.50767 8.09643 -3.98984 0.00275837 0.001117 0.118379 +EDGE3 359 408 4.30818 -8.09239 -3.83868 0.00248047 0.00109342 -0.128038 +EDGE3 360 410 4.91769 -0.00862005 -3.90588 0.0098829 -0.00917511 -3.45582e-05 +EDGE3 360 409 4.3116 -8.08913 -3.83987 -0.000605062 0.00399345 -0.125637 +EDGE3 359 410 4.51167 8.10622 -3.98202 0.0102244 0.000125645 0.132624 +EDGE3 361 411 4.92753 0.00138583 -3.90261 0.00566904 -0.0105127 -0.00829726 +EDGE3 360 411 4.5026 8.11997 -4.02051 0.00107883 -0.000397466 0.126768 +EDGE3 361 410 4.31829 -8.11356 -3.83646 0.000546509 0.00167291 -0.13124 +EDGE3 362 412 4.9018 0.00469098 -3.92868 -0.00238059 0.00257935 -0.00256316 +EDGE3 361 412 4.48872 8.13108 -3.98362 -6.03082e-05 0.000195551 0.127383 +EDGE3 362 411 4.2927 -8.12065 -3.84489 0.00444567 0.00367119 -0.130845 +EDGE3 363 413 4.90601 -0.0130183 -3.91941 0.00405986 -0.00573173 -0.000792147 +EDGE3 362 413 4.48718 8.13628 -4.00359 0.00392991 -0.00495398 0.124901 +EDGE3 363 412 4.29444 -8.12482 -3.83232 0.00418876 0.00262949 -0.127627 +EDGE3 364 414 4.90288 0.00682515 -3.9566 -0.00931283 0.00240036 0.00240636 +EDGE3 363 414 4.47365 8.17333 -3.9964 -0.00339396 -0.00545757 0.122761 +EDGE3 364 413 4.28793 -8.14775 -3.86161 0.00546352 0.00223075 -0.123646 +EDGE3 365 415 4.88162 0.0031664 -3.95582 0.00143412 -0.0122659 0.000864707 +EDGE3 364 415 4.48278 8.16897 -4.01549 -0.000367708 0.00505097 0.123902 +EDGE3 365 414 4.28961 -8.14301 -3.8486 0.00427035 0.00755624 -0.134858 +EDGE3 366 416 4.88913 -0.00445064 -3.9426 0.000201074 -0.0104031 -0.00317898 +EDGE3 365 416 4.4744 8.18015 -4.01416 -0.00338068 0.00570549 0.121576 +EDGE3 366 415 4.26577 -8.18359 -3.84894 0.00196663 0.00280892 -0.127453 +EDGE3 367 417 4.88763 0.0117824 -3.94096 -0.0111957 0.00419083 -0.00402932 +EDGE3 366 417 4.44246 8.1927 -4.05719 -0.00111178 -0.00557221 0.12038 +EDGE3 367 416 4.25741 -8.17834 -3.8867 -0.00471152 -0.00300538 -0.122852 +EDGE3 368 418 4.8672 -0.00332876 -3.95407 0.00301769 -0.00333804 -0.00276251 +EDGE3 367 418 4.46188 8.1934 -4.03065 -0.00841869 -0.00153824 0.133318 +EDGE3 368 417 4.28211 -8.18649 -3.87103 -0.00135249 -0.0075627 -0.117761 +EDGE3 369 419 4.86777 0.0168232 -3.96217 0.0104887 -0.000737349 0.002571 +EDGE3 368 419 4.43269 8.20725 -4.03893 0.00510678 0.00130811 0.128755 +EDGE3 369 418 4.2549 -8.20326 -3.89327 -0.00487672 -0.00715176 -0.1219 +EDGE3 370 420 4.85165 -0.00361041 -3.96909 -0.000445213 -0.0016333 0.00974149 +EDGE3 369 420 4.45416 8.21632 -4.04396 -0.00672489 0.00328322 0.129418 +EDGE3 370 419 4.26593 -8.23024 -3.8918 -0.000447123 -0.00335364 -0.122771 +EDGE3 371 421 4.85396 0.00512663 -3.97378 0.000242258 0.00321163 -0.00628078 +EDGE3 370 421 4.44817 8.24007 -4.05969 -0.00482967 -0.000564085 0.121999 +EDGE3 371 420 4.25196 -8.23152 -3.90844 0.00197604 0.00222262 -0.129877 +EDGE3 372 422 4.88366 0.00687048 -3.98764 -0.000733838 -9.00018e-05 0.000918687 +EDGE3 371 422 4.431 8.24759 -4.08428 0.012643 0.00745917 0.114915 +EDGE3 372 421 4.23055 -8.26477 -3.89364 0.000840027 0.0079207 -0.127134 +EDGE3 372 423 4.42686 8.28009 -4.08291 0.00291527 -0.00275457 0.122615 +EDGE3 373 423 4.83422 -0.0145329 -3.99674 0.00186163 -0.00181514 -0.00297329 +EDGE3 374 424 4.83735 -0.0194247 -3.99913 -0.0054322 -0.0021102 0.00791248 +EDGE3 373 422 4.22027 -8.26965 -3.90999 0.00218752 -0.0111067 -0.115003 +EDGE3 374 423 4.23382 -8.26719 -3.91157 0.00199242 0.00313487 -0.128609 +EDGE3 373 424 4.42313 8.26656 -4.08339 -0.0019238 -0.00370224 0.129955 +EDGE3 374 425 4.40896 8.28436 -4.08278 -0.00249355 -0.000405683 0.129348 +EDGE3 375 425 4.82304 -0.0116702 -4.01642 -0.00296505 0.00690399 0.00355008 +EDGE3 376 426 4.84161 0.0170846 -4.01126 0.00135222 0.00185468 -0.00285597 +EDGE3 375 424 4.22773 -8.26426 -3.928 0.000186728 -3.32109e-05 -0.125906 +EDGE3 376 425 4.21552 -8.27546 -3.93386 0.00341439 -0.00299966 -0.122665 +EDGE3 375 426 4.4097 8.30817 -4.07504 0.00536028 0.00205262 0.125994 +EDGE3 376 427 4.4012 8.29609 -4.09623 0.00506341 0.00368494 0.131624 +EDGE3 377 427 4.8216 8.72762e-05 -4.01393 0.0110272 1.18326e-05 -0.00726676 +EDGE3 377 426 4.217 -8.31094 -3.92639 -0.0012704 -0.00522473 -0.125477 +EDGE3 378 428 4.83096 0.00665987 -4.0066 0.00802441 0.00340213 0.00220694 +EDGE3 378 427 4.21255 -8.3289 -3.9336 -0.00171791 0.00247462 -0.131841 +EDGE3 377 428 4.39072 8.33862 -4.1012 -0.00405505 -0.0109167 0.131917 +EDGE3 378 429 4.40049 8.33277 -4.10021 -0.00548825 -0.00612841 0.122503 +EDGE3 379 429 4.82011 0.00292529 -4.01865 -0.00490138 0.0017629 -0.00244888 +EDGE3 380 430 4.82761 0.00687348 -4.03069 -0.00616107 0.000891643 0.00391855 +EDGE3 379 428 4.20428 -8.32005 -3.94715 -0.00215372 -0.00217059 -0.127539 +EDGE3 380 429 4.20317 -8.31536 -3.95238 -0.00447876 -0.00064154 -0.132706 +EDGE3 379 430 4.39352 8.33435 -4.11152 -0.00625486 0.00522705 0.129128 +EDGE3 381 431 4.80538 -0.00683138 -4.03787 -0.00278676 0.00684405 -0.00167718 +EDGE3 380 431 4.383 8.34591 -4.11771 0.00461078 -0.00378762 0.127935 +EDGE3 381 430 4.19461 -8.34465 -3.94652 0.00498655 -0.00266467 -0.123359 +EDGE3 381 432 4.37235 8.37976 -4.12615 -0.00430171 -0.00158883 0.121278 +EDGE3 382 432 4.81251 0.0142145 -4.05062 0.000738998 0.00284294 0.00088365 +EDGE3 383 433 4.79455 0.00189433 -4.05558 -0.00115964 0.000139413 -0.00105097 +EDGE3 382 431 4.19278 -8.35411 -3.95276 -0.0026177 0.00278343 -0.120264 +EDGE3 382 433 4.38938 8.39524 -4.12902 0.000949192 -0.00203818 0.123274 +EDGE3 383 432 4.18746 -8.35064 -3.95875 -0.00466211 -0.00151415 -0.122335 +EDGE3 383 434 4.37437 8.38866 -4.12978 0.00879626 -0.00108228 0.120529 +EDGE3 384 434 4.794 -0.00583219 -4.06493 0.000466625 0.00305896 0.00530155 +EDGE3 385 435 4.76924 0.0105372 -4.06437 -0.00134591 0.000327723 -0.00106986 +EDGE3 384 433 4.19986 -8.38454 -3.9545 0.00174562 0.0134921 -0.124859 +EDGE3 385 434 4.16821 -8.38969 -3.96196 0.00885095 0.0129451 -0.121571 +EDGE3 384 435 4.37063 8.39872 -4.14243 -0.00168188 0.00317365 0.13644 +EDGE3 385 436 4.34745 8.40599 -4.16178 -0.0050623 -0.0051752 0.131399 +EDGE3 386 436 4.79272 0.00695906 -4.07366 0.000298465 0.00909627 -0.0019957 +EDGE3 387 437 4.79155 0.00326566 -4.07639 -0.000159035 -0.00115927 -0.00231758 +EDGE3 386 435 4.17766 -8.38981 -3.97906 -0.00206209 0.00277342 -0.131217 +EDGE3 387 436 4.1733 -8.41433 -3.98587 -0.00201535 0.0111306 -0.124213 +EDGE3 386 437 4.33666 8.42184 -4.1611 0.00107242 0.00404979 0.125348 +EDGE3 388 438 4.7645 -0.00116036 -4.09109 -0.00316022 -0.000263544 -6.91563e-05 +EDGE3 387 438 4.34644 8.44141 -4.15977 0.00268993 -0.0120346 0.124085 +EDGE3 388 437 4.15408 -8.44965 -4.0065 -0.0032489 0.00802205 -0.13226 +EDGE3 389 439 4.76327 -0.00770417 -4.09312 -0.00787148 -0.00319326 -0.000474833 +EDGE3 388 439 4.34631 8.46564 -4.17703 -0.000616679 0.00577214 0.127916 +EDGE3 389 438 4.12336 -8.42825 -4.00604 -0.00549498 -0.00493104 -0.126304 +EDGE3 389 440 4.33144 8.46497 -4.18255 0.00830592 0.000627931 0.119467 +EDGE3 390 440 4.76206 0.00522355 -4.08442 -0.00237764 0.00117901 0.000296611 +EDGE3 391 441 4.76885 -0.0046574 -4.08039 0.000213674 0.0109031 -0.00543371 +EDGE3 390 439 4.1441 -8.46102 -4.01856 0.00703051 -0.00556671 -0.123222 +EDGE3 391 440 4.127 -8.46265 -4.01327 0.00206002 -0.00294082 -0.120706 +EDGE3 390 441 4.31041 8.46589 -4.16965 0.00713928 0.00239767 0.126659 +EDGE3 391 442 4.31409 8.48247 -4.21597 -0.00266734 0.0021525 0.120262 +EDGE3 392 442 4.75951 -0.0194552 -4.09559 -0.00320612 0.00205768 0.000807853 +EDGE3 393 443 4.75732 0.00137537 -4.12169 -0.00355339 -0.00154642 0.00187147 +EDGE3 392 441 4.11702 -8.45868 -4.01134 0.00011098 -0.00868365 -0.13826 +EDGE3 393 442 4.13345 -8.48151 -4.02344 -0.00217262 0.00322287 -0.134454 +EDGE3 392 443 4.30127 8.49153 -4.20789 0.0104067 0.000255658 0.129191 +EDGE3 393 444 4.30831 8.50131 -4.18799 -0.00390141 -0.00270911 0.118167 +EDGE3 394 444 4.72955 0.00869874 -4.12397 -0.00411443 -0.00406581 0.00602378 +EDGE3 395 445 4.71676 0.00657177 -4.13373 -0.00124225 0.00549297 -0.00904429 +EDGE3 394 443 4.10299 -8.51416 -4.02222 0.00248194 -0.00217062 -0.125143 +EDGE3 395 444 4.10536 -8.50181 -4.04599 -0.00174588 -0.00271071 -0.125821 +EDGE3 394 445 4.31005 8.52674 -4.21008 -0.00511435 0.00454499 0.129832 +EDGE3 395 446 4.29234 8.53121 -4.21907 -0.00429905 0.00317943 0.127785 +EDGE3 396 446 4.72033 -0.0019518 -4.12578 0.0012661 -0.00153326 -0.000449368 +EDGE3 397 447 4.74299 -0.00364977 -4.13202 -4.97661e-05 -0.00755684 -0.00526585 +EDGE3 396 445 4.09283 -8.53242 -4.05474 -0.00282266 -0.00201547 -0.129197 +EDGE3 396 447 4.28002 8.54441 -4.22462 -0.0036212 -0.0106854 0.123839 +EDGE3 397 446 4.11087 -8.52328 -4.05708 0.00238404 -0.00212055 -0.123346 +EDGE3 397 448 4.27282 8.53114 -4.20086 -0.00438108 -0.00727879 0.129392 +EDGE3 398 448 4.72746 0.00379485 -4.14278 0.00799445 0.0016098 0.00350092 +EDGE3 399 449 4.71728 -0.00230005 -4.13046 -0.00152274 -0.00332992 0.0118784 +EDGE3 398 447 4.07775 -8.5578 -4.04646 -0.00850334 0.00708971 -0.120855 +EDGE3 399 448 4.07602 -8.54279 -4.0715 -0.000824725 0.00455174 -0.130853 +EDGE3 398 449 4.28375 8.57912 -4.24273 0.00329938 0.00170942 0.13436 +EDGE3 399 450 4.27379 8.57434 -4.241 -0.00653824 -0.0037044 0.12218 +EDGE3 400 450 4.71202 -0.00458911 -4.15694 0.00207862 0.00194389 0.00849214 +EDGE3 400 449 4.07108 -8.57415 -4.05572 -0.00163788 0.0117923 -0.123832 +EDGE3 401 451 4.71027 -0.0010429 -4.14887 0.00114139 -0.000246267 0.000303934 +EDGE3 400 451 4.26122 8.58104 -4.24028 0.00416266 -0.00380019 0.125093 +EDGE3 402 452 4.70555 -0.000177511 -4.1709 0.00109319 -0.00875931 -0.00318283 +EDGE3 401 450 4.08889 -8.58432 -4.08811 0.00114032 0.00232697 -0.124844 +EDGE3 401 452 4.25175 8.60654 -4.24215 -0.00692016 0.000838846 0.120739 +EDGE3 402 451 4.07711 -8.58209 -4.08239 0.00667654 0.00078251 -0.127415 +EDGE3 402 453 4.23271 8.61763 -4.2623 0.0105967 -0.00230396 0.12052 +EDGE3 403 453 4.69742 0.0258518 -4.17836 -0.00291733 -0.00502013 -0.00486934 +EDGE3 403 452 4.06433 -8.59896 -4.07796 0.0124541 -0.00761885 -0.123026 +EDGE3 404 454 4.66896 0.00937462 -4.19122 -0.00262734 0.000766227 0.00505904 +EDGE3 404 453 4.0686 -8.59657 -4.09119 0.0100571 -0.00261986 -0.121255 +EDGE3 403 454 4.23947 8.62984 -4.23582 0.0119009 0.0063767 0.124468 +EDGE3 404 455 4.23251 8.63759 -4.26903 -0.00294338 -0.000752992 0.128835 +EDGE3 405 455 4.69048 -0.00521975 -4.1901 0.00749779 0.0076058 -0.00395745 +EDGE3 406 456 4.66284 -0.0144267 -4.19542 -0.000841928 -0.00232922 -0.00284939 +EDGE3 405 454 4.04716 -8.60464 -4.09334 -0.00701207 0.00303296 -0.128953 +EDGE3 406 455 4.03751 -8.64016 -4.10918 -0.00208913 0.00957555 -0.125272 +EDGE3 405 456 4.23753 8.64132 -4.28141 0.0107133 0.00188361 0.130507 +EDGE3 406 457 4.21455 8.65384 -4.2726 0.00820539 0.000338709 0.122027 +EDGE3 407 457 4.68114 -0.00184307 -4.18895 0.00179132 0.00166117 0.00753611 +EDGE3 407 456 4.02909 -8.63773 -4.11218 -0.0023262 -0.00470401 -0.133783 +EDGE3 408 458 4.67338 0.00692819 -4.21252 0.00540386 0.00232803 0.00415996 +EDGE3 407 458 4.21582 8.65786 -4.28609 0.00262166 0.00425399 0.127261 +EDGE3 408 457 4.04544 -8.67016 -4.12441 -0.00164382 -0.00832043 -0.123993 +EDGE3 409 459 4.65373 0.00246177 -4.20629 0.000858865 -0.00079496 0.00169577 +EDGE3 408 459 4.21147 8.68214 -4.30297 0.000708895 -0.00205957 0.128268 +EDGE3 409 458 4.03521 -8.67366 -4.10828 -0.00357964 0.000152626 -0.125052 +EDGE3 410 460 4.6427 -0.00140269 -4.21399 0.00173181 0.00143873 -0.00101598 +EDGE3 409 460 4.20046 8.66639 -4.29462 0.00368705 0.00718217 0.125177 +EDGE3 410 459 4.02075 -8.68485 -4.12672 -0.00354549 0.00203699 -0.126695 +EDGE3 411 461 4.66917 0.00404305 -4.22156 -0.00101616 -0.00373274 -0.00249198 +EDGE3 410 461 4.19997 8.68926 -4.3016 0.001801 0.00558589 0.125389 +EDGE3 411 460 4.01826 -8.6936 -4.13387 -0.00018138 -0.000477563 -0.128652 +EDGE3 412 462 4.67163 -0.00481572 -4.22165 0.000794155 0.00741723 -0.00206011 +EDGE3 411 462 4.19611 8.70717 -4.31673 -0.00190511 -0.000557274 0.129973 +EDGE3 412 461 4.01349 -8.69078 -4.10698 0.000352223 -0.00870805 -0.124596 +EDGE3 413 463 4.65257 -0.00870496 -4.22101 -0.00710989 -0.00138723 -0.00859486 +EDGE3 412 463 4.18433 8.71896 -4.31277 -0.00214546 -0.000906057 0.123712 +EDGE3 413 462 3.99644 -8.70935 -4.14466 -0.000362304 0.00329408 -0.126208 +EDGE3 414 464 4.62103 0.0241052 -4.23638 -0.00514254 0.00185119 -0.00494612 +EDGE3 413 464 4.20174 8.73939 -4.30553 0.00460808 -0.00277764 0.113643 +EDGE3 414 463 3.99419 -8.72407 -4.13879 -0.00209654 -0.0013959 -0.127191 +EDGE3 415 465 4.64274 -0.0140296 -4.24531 -0.0077619 0.00694975 0.00584839 +EDGE3 414 465 4.17639 8.73773 -4.33067 -0.00186635 0.00178009 0.123322 +EDGE3 415 464 3.98291 -8.73845 -4.15898 0.00619411 0.00151918 -0.122943 +EDGE3 416 466 4.6338 0.00803756 -4.24064 -0.000672492 0.00118131 -0.000640919 +EDGE3 415 466 4.16805 8.7726 -4.33179 -0.000197155 0.00162769 0.128839 +EDGE3 416 465 3.99299 -8.7519 -4.15252 -0.00934493 -0.0100476 -0.125441 +EDGE3 417 467 4.63787 -0.00113345 -4.26319 0.00029973 -0.00327688 0.00172955 +EDGE3 416 467 4.15843 8.76355 -4.34447 -0.000646187 -0.00151652 0.13017 +EDGE3 417 466 3.97104 -8.75208 -4.1617 0.00204109 0.00743808 -0.129446 +EDGE3 418 468 4.62089 0.0155916 -4.24707 -0.00808739 -0.00439673 -0.000899771 +EDGE3 417 468 4.15494 8.78568 -4.35093 0.00492428 0.00280689 0.122005 +EDGE3 418 467 3.96834 -8.77367 -4.17113 0.00516713 0.00589029 -0.124305 +EDGE3 419 469 4.60461 -0.0103161 -4.27045 -0.00408807 -0.00186651 0.00649129 +EDGE3 418 469 4.16138 8.79426 -4.34257 -0.00491058 0.00910918 0.117558 +EDGE3 419 468 3.95292 -8.77313 -4.16075 -0.00251864 0.00134444 -0.127788 +EDGE3 420 470 4.60279 0.0152601 -4.26772 -0.00263282 -0.000804701 0.00434388 +EDGE3 419 470 4.14438 8.79874 -4.35431 0.0147857 0.000957149 0.13373 +EDGE3 420 469 3.95144 -8.7859 -4.18804 -0.00313203 0.00270865 -0.124724 +EDGE3 421 471 4.61627 -0.0149304 -4.28252 -0.00417573 0.00381349 0.00135768 +EDGE3 420 471 4.14352 8.82043 -4.33821 0.0124943 0.00919296 0.125027 +EDGE3 421 470 3.93842 -8.79268 -4.20477 -0.000770601 -0.00734292 -0.123384 +EDGE3 422 472 4.59409 -0.00479256 -4.27888 0.00197236 -0.00371171 -0.0184485 +EDGE3 421 472 4.12511 8.8118 -4.35494 0.000422545 0.00368148 0.122169 +EDGE3 422 471 3.93486 -8.81784 -4.2068 0.00384048 0.000918364 -0.131299 +EDGE3 423 473 4.59109 -0.00810733 -4.28865 0.00389538 -0.00521222 -0.0027848 +EDGE3 422 473 4.132 8.83293 -4.35972 0.0109298 -0.000834119 0.120396 +EDGE3 423 472 3.93925 -8.84539 -4.20016 -0.00842516 -0.0043818 -0.128417 +EDGE3 424 474 4.5747 0.00993123 -4.30366 -0.00468356 -0.00570556 0.00748708 +EDGE3 423 474 4.10857 8.85248 -4.34576 0.00230146 -0.00441504 0.1237 +EDGE3 424 473 3.94637 -8.85219 -4.20209 0.00115356 -0.00195602 -0.129136 +EDGE3 425 475 4.56341 -0.0183107 -4.30547 -0.0020359 -0.0121482 0.00164963 +EDGE3 424 475 4.10606 8.87733 -4.38036 -0.00110174 0.00899314 0.126823 +EDGE3 425 474 3.92815 -8.86067 -4.2101 5.53004e-05 -0.00311513 -0.134242 +EDGE3 426 476 4.56994 0.00159592 -4.32369 0.000929 0.00504051 -0.000565551 +EDGE3 425 476 4.12035 8.87673 -4.39153 -0.00582304 -0.00127072 0.122396 +EDGE3 426 475 3.91723 -8.86576 -4.22157 0.00678782 -0.00402211 -0.118634 +EDGE3 427 477 4.56864 0.00289456 -4.30918 0.000121405 -0.00888252 0.00596433 +EDGE3 426 477 4.11309 8.90116 -4.39106 -0.0045902 -0.00242611 0.130372 +EDGE3 427 476 3.92001 -8.87364 -4.23141 -0.00409631 0.00700027 -0.12838 +EDGE3 428 478 4.57158 0.00272975 -4.31673 0.00835906 -0.00408993 0.00141278 +EDGE3 427 478 4.09772 8.89454 -4.40773 -0.011016 0.00103161 0.131098 +EDGE3 428 477 3.91741 -8.89377 -4.22206 0.00611481 0.00644024 -0.123466 +EDGE3 429 479 4.57127 -0.00691111 -4.3301 -0.00419164 0.00575553 -0.0036068 +EDGE3 428 479 4.09602 8.9265 -4.39571 0.000719131 0.000200779 0.127747 +EDGE3 429 478 3.90569 -8.90778 -4.24785 -0.00162401 0.000147973 -0.136635 +EDGE3 430 480 4.55261 -0.00113857 -4.33984 -0.00318463 0.000685871 0.00495338 +EDGE3 429 480 4.09953 8.92729 -4.40047 -0.0025605 0.00109224 0.115923 +EDGE3 430 479 3.91018 -8.91348 -4.23535 -0.00310413 0.00937015 -0.121017 +EDGE3 431 481 4.54296 -0.0089901 -4.33284 0.00651452 0.00232873 0.00160121 +EDGE3 430 481 4.08493 8.91848 -4.41336 -0.000377263 0.00222274 0.121871 +EDGE3 431 480 3.8981 -8.91632 -4.25143 -0.00187073 -0.00238809 -0.126192 +EDGE3 432 482 4.55021 0.0013497 -4.35025 0.00565387 0.000773725 -0.00299977 +EDGE3 431 482 4.08773 8.94182 -4.42437 -0.0082858 0.000749383 0.123238 +EDGE3 432 481 3.87714 -8.91516 -4.23181 -0.00767218 -0.00743687 -0.121052 +EDGE3 433 483 4.52841 0.00113511 -4.35059 -0.00509797 0.00205942 -0.00787933 +EDGE3 432 483 4.06779 8.91923 -4.44723 0.00314881 -0.0048247 0.132919 +EDGE3 433 482 3.90044 -8.95851 -4.25953 0.00287777 0.0106134 -0.125848 +EDGE3 434 484 4.52305 0.00786831 -4.37212 -0.00518343 -0.00339698 0.00123626 +EDGE3 433 484 4.07599 8.96601 -4.4383 -0.00224922 0.0086267 0.118641 +EDGE3 434 483 3.88846 -8.96219 -4.25681 0.000286184 -0.0041413 -0.125565 +EDGE3 435 485 4.52149 0.00147322 -4.34396 0.00897689 -0.0053617 -0.00118086 +EDGE3 434 485 4.04447 8.97963 -4.43907 -0.00145999 -0.00344838 0.124566 +EDGE3 435 484 3.85971 -8.96637 -4.24905 -0.00302946 -0.000109285 -0.133546 +EDGE3 436 486 4.52634 0.03519 -4.35239 -0.00149937 0.0065813 -0.00221448 +EDGE3 435 486 4.05402 8.98613 -4.44778 -0.0129389 -0.00277441 0.126159 +EDGE3 436 485 3.86802 -8.98886 -4.28116 -0.00343323 -0.00455391 -0.128546 +EDGE3 437 487 4.51556 -0.0174308 -4.36946 0.00718587 0.000195153 -0.0071827 +EDGE3 436 487 4.03696 9.00581 -4.43607 0.00434352 0.00421216 0.118677 +EDGE3 437 486 3.85336 -8.9885 -4.27646 0.000307028 0.00327935 -0.128313 +EDGE3 438 488 4.51371 0.0103637 -4.39627 0.00597743 0.000308835 0.000648539 +EDGE3 437 488 4.03109 8.9855 -4.46353 0.000925044 -0.00684544 0.125926 +EDGE3 438 487 3.86897 -9.00341 -4.28367 0.00351401 -0.0042042 -0.134643 +EDGE3 439 489 4.50965 0.00945107 -4.37629 0.000144386 -0.00192123 -0.00375691 +EDGE3 438 489 4.03323 9.02125 -4.45343 -0.00296393 -0.00650574 0.135581 +EDGE3 439 488 3.87451 -9.02421 -4.27698 -0.00534294 0.00440338 -0.130313 +EDGE3 440 490 4.49311 0.0147791 -4.40435 0.00184162 -0.0100709 0.00281962 +EDGE3 439 490 4.02623 9.0211 -4.48427 -0.00354644 -0.00564276 0.132606 +EDGE3 440 489 3.82562 -9.02862 -4.29873 -0.00236352 -0.00291452 -0.124412 +EDGE3 441 491 4.49268 -0.00723129 -4.39388 -0.00263583 -0.000839567 -0.00694676 +EDGE3 440 491 4.01074 9.04701 -4.48835 -0.00672183 0.00170294 0.127935 +EDGE3 441 490 3.84064 -9.03746 -4.29512 0.0063258 -0.00200503 -0.12287 +EDGE3 442 492 4.48798 -0.00984396 -4.41207 0.000775047 -0.00188949 -0.00468223 +EDGE3 441 492 4.0137 9.05408 -4.47383 -0.00111131 -0.0063851 0.121592 +EDGE3 442 491 3.83785 -9.04046 -4.30876 0.00115502 -0.00426462 -0.119116 +EDGE3 443 493 4.50133 0.00415041 -4.41984 -0.00411575 -0.00341031 0.00221174 +EDGE3 442 493 4.01253 9.06255 -4.47863 0.00200547 -0.008557 0.12637 +EDGE3 443 492 3.81151 -9.05489 -4.32351 0.00499192 0.0014407 -0.136849 +EDGE3 444 494 4.47089 0.00139535 -4.40078 -0.000681643 -0.0103149 -0.000446979 +EDGE3 443 494 4.00336 9.05927 -4.51307 -0.00135311 -6.37329e-05 0.128887 +EDGE3 444 493 3.82395 -9.07356 -4.31826 0.0021528 -0.00424393 -0.120894 +EDGE3 444 495 3.99071 9.08458 -4.49154 -0.00637525 -0.00353196 0.12485 +EDGE3 445 495 4.46811 -0.0123327 -4.42161 -0.00359029 -0.00150655 0.00459229 +EDGE3 445 494 3.81308 -9.07314 -4.32999 0.00235247 -0.00154702 -0.128873 +EDGE3 446 496 4.45273 -0.00402707 -4.42438 -0.00389881 0.000382871 0.0043404 +EDGE3 445 496 3.97484 9.08678 -4.50715 -0.00375917 -0.00236377 0.122741 +EDGE3 446 495 3.80636 -9.10172 -4.324 -0.000823194 0.00131497 -0.119686 +EDGE3 447 497 4.46925 -0.0101787 -4.41308 0.00469703 0.000859355 0.00793543 +EDGE3 446 497 3.95962 9.11366 -4.50147 -0.00352974 0.00711813 0.126732 +EDGE3 447 496 3.79934 -9.09034 -4.34004 -0.00219331 -0.0100989 -0.126014 +EDGE3 448 498 4.44804 -0.0249742 -4.44139 0.0063633 -0.0070511 0.00780944 +EDGE3 447 498 3.95208 9.10996 -4.52518 -0.00039552 0.00142602 0.122932 +EDGE3 448 497 3.80802 -9.08673 -4.35234 0.00275432 0.000294407 -0.124648 +EDGE3 449 499 4.46777 0.00433552 -4.43764 -0.00505844 -0.00320605 0.00360026 +EDGE3 448 499 3.96524 9.12588 -4.51926 0.00201026 -0.000536744 0.137997 +EDGE3 449 498 3.79614 -9.12137 -4.35973 -0.00191318 -0.00605343 -0.120238 +EDGE3 450 500 4.4438 0.000585628 -4.44406 0.0069077 -0.00167683 0.00114603 +EDGE3 449 500 3.97771 9.13241 -4.52192 0.00348611 -0.00070893 0.123483 +EDGE3 450 499 3.78446 -9.13064 -4.34753 -0.00505808 0.00789829 -0.118054 +EDGE3 451 501 4.42912 -0.00264163 -4.44882 -0.00265223 0.000170219 0.0041435 +EDGE3 450 501 3.93222 9.15503 -4.54872 -0.000430175 -0.000997469 0.120295 +EDGE3 451 500 3.78325 -9.1436 -4.36561 -0.00359195 0.000710573 -0.11229 +EDGE3 452 502 4.45112 0.0107525 -4.45139 0.00100503 -0.00010858 -0.00413616 +EDGE3 451 502 3.94303 9.15222 -4.53836 -0.00488579 0.0117283 0.127967 +EDGE3 452 501 3.76334 -9.15814 -4.38167 -0.00125983 0.00798383 -0.129368 +EDGE3 453 503 4.42806 -0.0105151 -4.46911 -0.0104299 0.00117303 0.0040258 +EDGE3 452 503 3.93866 9.1636 -4.53927 0.00755897 0.00604064 0.12815 +EDGE3 453 502 3.77073 -9.15601 -4.38349 0.00581606 -0.00716472 -0.133786 +EDGE3 454 504 4.4126 0.00441391 -4.45242 0.00118639 -0.00416583 -0.00264234 +EDGE3 453 504 3.92062 9.18911 -4.55048 -0.00474685 -0.000815412 0.131861 +EDGE3 454 503 3.76925 -9.17649 -4.37696 -0.0102395 -0.00307416 -0.123273 +EDGE3 455 505 4.41757 0.00292422 -4.46467 -0.00405902 -0.00211707 0.00315777 +EDGE3 454 505 3.92547 9.1748 -4.56186 0.00343033 0.00361293 0.122626 +EDGE3 455 504 3.75518 -9.18432 -4.374 -6.42109e-05 0.00268801 -0.127149 +EDGE3 456 506 4.41097 -0.00113746 -4.46722 0.00942265 -0.00184549 -0.00360706 +EDGE3 455 506 3.91444 9.18799 -4.5649 0.000493278 -0.0069317 0.127144 +EDGE3 456 505 3.74545 -9.18811 -4.37748 0.00674851 -0.00153417 -0.123841 +EDGE3 457 507 4.40455 0.0130242 -4.47205 6.43813e-05 -0.00112738 -0.000424206 +EDGE3 456 507 3.91188 9.20618 -4.55201 -6.05605e-06 -0.0066025 0.118733 +EDGE3 457 506 3.73126 -9.19583 -4.389 -0.00812589 0.00246594 -0.128159 +EDGE3 458 508 4.37647 -0.00130796 -4.49107 -0.000987593 0.000589256 -0.00694141 +EDGE3 457 508 3.88946 9.24017 -4.56841 0.00486678 -0.00617095 0.128088 +EDGE3 458 507 3.73603 -9.22472 -4.39566 0.00101462 -0.000488958 -0.120792 +EDGE3 459 509 4.39207 0.0113856 -4.50105 -0.00303555 -0.00246949 0.00334227 +EDGE3 458 509 3.88706 9.24298 -4.57662 -0.00998333 0.00115429 0.125516 +EDGE3 459 508 3.73141 -9.23563 -4.4077 0.000428822 0.00427186 -0.129317 +EDGE3 459 510 3.895 9.23709 -4.57898 -0.00491291 -0.00287953 0.123856 +EDGE3 460 510 4.3984 -0.00979754 -4.48633 0.00557091 -0.00109358 0.000345308 +EDGE3 461 511 4.36361 -0.00659598 -4.50844 0.000676541 0.00638383 0.00858618 +EDGE3 460 509 3.71566 -9.23746 -4.41098 0.00369497 -0.000396262 -0.123401 +EDGE3 461 510 3.71738 -9.25488 -4.39331 0.00796446 -0.000875389 -0.122843 +EDGE3 460 511 3.88384 9.27543 -4.57766 -0.00494227 -0.000301361 0.12233 +EDGE3 461 512 3.88296 9.25454 -4.58653 -0.00451259 0.00138487 0.134416 +EDGE3 462 512 4.38339 0.00444704 -4.51201 0.00733386 0.000242163 -0.00543636 +EDGE3 463 513 4.3856 -0.0258101 -4.52243 0.0105997 0.00201351 0.00971301 +EDGE3 462 511 3.69614 -9.26938 -4.41313 0.00413974 -0.00368415 -0.123013 +EDGE3 463 512 3.70904 -9.2544 -4.43359 -0.000204846 -0.00275828 -0.117515 +EDGE3 462 513 3.86324 9.29306 -4.60453 0.00712544 -0.00187496 0.124772 +EDGE3 463 514 3.86418 9.27529 -4.60182 0.00330037 -0.00723082 0.121644 +EDGE3 464 514 4.36616 0.0125572 -4.51997 0.000284976 0.00397017 -0.00164582 +EDGE3 465 515 4.35887 0.00697985 -4.53167 0.00811278 -0.00809916 -0.0050713 +EDGE3 464 513 3.68749 -9.26242 -4.41289 -0.000795482 -0.000341774 -0.110798 +EDGE3 465 514 3.68921 -9.28482 -4.4301 -0.00570997 -0.00271051 -0.125325 +EDGE3 464 515 3.87003 9.29496 -4.60722 0.000296508 0.000813475 0.128379 +EDGE3 465 516 3.85482 9.31504 -4.61277 -0.00166672 -0.00441831 0.121398 +EDGE3 466 516 4.34018 -0.0282718 -4.53392 -0.00221111 0.00169866 0.000807383 +EDGE3 467 517 4.32667 -0.00106913 -4.53293 -0.00226038 0.0117101 0.00297681 +EDGE3 466 515 3.68241 -9.30626 -4.43444 -0.00208536 0.00376548 -0.125412 +EDGE3 467 516 3.66666 -9.31421 -4.4412 -0.0101136 0.00469609 -0.128701 +EDGE3 466 517 3.8681 9.31121 -4.63525 -0.0038434 -0.000185829 0.126194 +EDGE3 467 518 3.84541 9.34398 -4.64247 0.00128541 0.00251905 0.130651 +EDGE3 468 518 4.34859 0.0192658 -4.53271 0.00216262 -0.00129017 0.00826521 +EDGE3 469 519 4.3493 -0.00126534 -4.53966 0.00205069 0.0046152 0.00155489 +EDGE3 468 517 3.66359 -9.31825 -4.43635 0.000810034 0.00571807 -0.12431 +EDGE3 469 518 3.67697 -9.31745 -4.45284 0.00277816 0.00186874 -0.130567 +EDGE3 468 519 3.8438 9.34069 -4.62501 -0.00235294 0.00475151 0.121809 +EDGE3 469 520 3.82799 9.34282 -4.6439 -0.00298332 0.0117143 0.128796 +EDGE3 470 520 4.32516 0.00862274 -4.57184 -0.00383357 -0.00454308 0.00280321 +EDGE3 470 519 3.65445 -9.32784 -4.44473 -0.0035448 -0.00569625 -0.134589 +EDGE3 471 521 4.34001 0.00303558 -4.55669 -0.000380407 -0.00632393 0.000473022 +EDGE3 470 521 3.81567 9.35759 -4.64269 -0.000587436 -0.00103594 0.121099 +EDGE3 472 522 4.30938 -0.0119973 -4.57881 0.00708179 0.00947614 -0.0061111 +EDGE3 471 520 3.67201 -9.34512 -4.44888 -0.00106011 -0.00276066 -0.126149 +EDGE3 472 521 3.63318 -9.34176 -4.46865 -9.26789e-05 -0.000961381 -0.126472 +EDGE3 471 522 3.82766 9.37451 -4.6587 -0.00177727 -0.0116751 0.130746 +EDGE3 472 523 3.83257 9.38047 -4.64007 -0.00318128 0.00987191 0.123525 +EDGE3 473 523 4.3162 0.00176307 -4.55985 -0.00130718 0.00262373 0.0030138 +EDGE3 474 524 4.32049 0.00278908 -4.58301 -0.000939691 -0.00328576 -0.0100397 +EDGE3 473 522 3.63936 -9.36162 -4.47485 -0.00484355 0.000803198 -0.125517 +EDGE3 473 524 3.81956 9.39898 -4.67051 -0.00293468 -0.00285522 0.126315 +EDGE3 474 523 3.64741 -9.38572 -4.49487 -0.00635023 0.00137556 -0.125314 +EDGE3 474 525 3.77696 9.40708 -4.67396 -0.000493666 0.00158248 0.128937 +EDGE3 475 525 4.30821 -0.00583262 -4.58187 0.00243817 0.00152706 -0.00307994 +EDGE3 476 526 4.28478 -0.0158121 -4.57053 -0.00267136 0.0019298 -0.00462347 +EDGE3 475 524 3.63194 -9.40371 -4.49264 0.00230255 0.00766336 -0.129974 +EDGE3 476 525 3.63028 -9.42441 -4.48978 0.00547564 0.00138931 -0.121167 +EDGE3 475 526 3.79781 9.42409 -4.66373 0.00768182 0.00430548 0.130575 +EDGE3 476 527 3.7752 9.42636 -4.66278 0.00299709 -0.00289345 0.120558 +EDGE3 477 527 4.29722 0.00982699 -4.58643 0.00711675 0.0093642 -0.00321283 +EDGE3 478 528 4.28258 0.0102563 -4.58456 0.00736021 -0.000607597 0.00286324 +EDGE3 477 526 3.62088 -9.41565 -4.50035 -0.00258348 -0.0124318 -0.129621 +EDGE3 478 527 3.6222 -9.43473 -4.50089 -0.00861207 -0.00689988 -0.134271 +EDGE3 477 528 3.77901 9.42006 -4.67541 -0.00226501 -0.00434855 0.132384 +EDGE3 479 529 4.27734 -0.00500611 -4.58956 -0.00240998 -0.00393679 0.00306961 +EDGE3 478 529 3.75822 9.43348 -4.69187 -0.00226591 -0.00056534 0.126643 +EDGE3 479 528 3.5918 -9.44003 -4.50055 0.00591585 0.00483288 -0.12523 +EDGE3 479 530 3.74922 9.45088 -4.71502 -0.00764642 0.0120798 0.124493 +EDGE3 480 530 4.28331 -0.00418513 -4.60804 -0.00150897 0.00938811 0.00311896 +EDGE3 481 531 4.25215 -0.00562922 -4.62958 -0.000474893 -0.00243374 -0.00444501 +EDGE3 480 529 3.58841 -9.45475 -4.48903 -0.0038548 0.00288203 -0.129007 +EDGE3 480 531 3.74744 9.45536 -4.70572 0.00301528 -0.00344631 0.122845 +EDGE3 481 530 3.58944 -9.46251 -4.51976 -0.00669757 -0.00339585 -0.126758 +EDGE3 481 532 3.74848 9.45992 -4.68522 -0.00478233 -0.00613862 0.124537 +EDGE3 482 532 4.28692 -0.00740014 -4.60512 0.00974222 0.00303854 -0.00184898 +EDGE3 483 533 4.25579 0.0160559 -4.63356 -0.00186941 0.00203941 0.0033389 +EDGE3 482 531 3.58979 -9.46506 -4.51784 -0.00241629 0.00373398 -0.139133 +EDGE3 483 532 3.5806 -9.48023 -4.52957 0.00668511 -0.00796709 -0.127545 +EDGE3 482 533 3.73554 9.48791 -4.7027 0.00451924 -0.00150199 0.129505 +EDGE3 483 534 3.74179 9.49896 -4.72329 0.000744549 -0.00037773 0.121851 +EDGE3 484 534 4.24796 -0.0108564 -4.639 -0.00334043 0.00396119 0.00340903 +EDGE3 485 535 4.23932 0.0137116 -4.63688 -0.00666614 0.00412243 -0.00384557 +EDGE3 484 533 3.56819 -9.48972 -4.53999 0.00295305 -0.0103521 -0.133445 +EDGE3 485 534 3.56229 -9.48717 -4.54422 0.000527135 0.00385807 -0.129048 +EDGE3 484 535 3.73621 9.5096 -4.72662 0.000157986 0.00269972 0.127155 +EDGE3 486 536 4.22894 -0.00304636 -4.66589 -0.000146676 -0.00475341 -0.00611295 +EDGE3 485 536 3.73143 9.52325 -4.72238 -0.00142931 0.000867925 0.130002 +EDGE3 486 535 3.56353 -9.50133 -4.53893 0.00790428 -0.00264756 -0.130664 +EDGE3 486 537 3.71054 9.53676 -4.7353 0.00364515 -0.000625419 0.125346 +EDGE3 487 537 4.22497 0.0064544 -4.63037 -0.0044213 0.00385964 -0.00224518 +EDGE3 488 538 4.20956 0.0123207 -4.66223 -2.06876e-05 -0.00236003 -0.0011884 +EDGE3 487 536 3.57192 -9.52547 -4.56132 0.00403437 0.0024417 -0.125672 +EDGE3 488 537 3.54561 -9.51902 -4.56 -0.00445842 0.00317633 -0.122704 +EDGE3 487 538 3.71751 9.53637 -4.73557 -0.00107065 -0.000273753 0.118399 +EDGE3 488 539 3.70762 9.54178 -4.76902 0.00687816 0.00122113 0.125447 +EDGE3 489 539 4.19527 -0.0171783 -4.64623 0.000182571 0.00784881 -0.00818993 +EDGE3 490 540 4.22681 0.00233117 -4.66005 -0.00333173 -0.00366281 0.00318824 +EDGE3 489 538 3.52823 -9.54011 -4.56461 0.000753414 -0.000422539 -0.132209 +EDGE3 490 539 3.5226 -9.53174 -4.54868 -0.00234797 0.00325414 -0.131106 +EDGE3 489 540 3.70962 9.55728 -4.7381 -0.00344725 -0.003182 0.126237 +EDGE3 490 541 3.68599 9.56212 -4.74471 0.00467137 -0.00216046 0.128399 +EDGE3 491 541 4.20719 -0.00644492 -4.68085 -0.00366979 0.00333009 0.00547133 +EDGE3 492 542 4.19209 -0.0149234 -4.67106 -0.00245462 0.0067297 -0.00556997 +EDGE3 491 540 3.54066 -9.56675 -4.5613 0.00587859 -0.00381476 -0.119791 +EDGE3 492 541 3.52642 -9.57361 -4.56059 0.00443117 0.00328704 -0.121653 +EDGE3 491 542 3.67528 9.58816 -4.77598 -0.00720201 0.00364224 0.12283 +EDGE3 492 543 3.67489 9.5732 -4.76549 0.00560097 -0.0042829 0.130689 +EDGE3 493 543 4.19582 0.000802126 -4.67935 -0.00354961 0.0017257 -0.00480723 +EDGE3 493 542 3.50962 -9.56515 -4.56927 -0.00327771 -0.00585462 -0.12849 +EDGE3 494 544 4.19389 0.000187639 -4.69407 -0.00128506 -0.00104836 -0.0051884 +EDGE3 493 544 3.67821 9.59169 -4.76552 -0.00346186 0.00582375 0.128592 +EDGE3 495 545 4.19281 0.00430629 -4.68089 0.000802375 0.000433807 0.00572064 +EDGE3 494 543 3.51611 -9.5846 -4.59299 0.00159228 -0.00784582 -0.12186 +EDGE3 495 544 3.50299 -9.58261 -4.57028 0.00142152 0.00601806 -0.123879 +EDGE3 494 545 3.68138 9.60775 -4.79481 0.00722174 -0.00141838 0.126819 +EDGE3 496 546 4.18838 -0.00399047 -4.68092 0.00143343 0.0062599 0.00524899 +EDGE3 495 546 3.66433 9.61194 -4.78087 -0.00106899 -0.00168743 0.121679 +EDGE3 496 545 3.49632 -9.59036 -4.60046 -0.00276472 -0.0055603 -0.132577 +EDGE3 497 547 4.1804 -0.013696 -4.68442 0.00199332 -0.00540211 -0.00127077 +EDGE3 496 547 3.6764 9.62388 -4.77141 0.00236224 0.00190691 0.131245 +EDGE3 497 546 3.48576 -9.62548 -4.59881 0.0031902 -0.00110833 -0.120974 +EDGE3 498 548 4.16518 0.0064734 -4.70278 0.00682253 0.0055233 -0.00592631 +EDGE3 497 548 3.6278 9.63946 -4.80134 -0.00302253 -0.00392766 0.13435 +EDGE3 498 547 3.47223 -9.6108 -4.60246 0.00466718 -0.00328426 -0.119694 +EDGE3 499 549 4.15791 -0.00732062 -4.70741 -0.00197779 0.00039554 -0.00708716 +EDGE3 498 549 3.65651 9.63989 -4.79925 0.00227211 -0.00203024 0.126557 +EDGE3 499 548 3.47697 -9.62217 -4.61775 0.00746111 -0.00851916 -0.126831 +EDGE3 500 550 4.14949 0.0154234 -4.721 -0.000617331 0.0029541 0.00823078 +EDGE3 499 550 3.63826 9.6678 -4.79371 -0.000905687 -0.00170521 0.120723 +EDGE3 500 549 3.46885 -9.64332 -4.62537 0.0005706 -0.00111207 -0.123795 +EDGE3 501 551 4.15923 0.00451624 -4.71473 0.00504002 -0.00858697 0.00572171 +EDGE3 500 551 3.6321 9.66187 -4.80008 0.00849207 -0.00533413 0.122748 +EDGE3 501 550 3.4548 -9.65727 -4.62511 -0.00584993 -0.0066021 -0.119783 +EDGE3 502 552 4.1427 0.00212205 -4.72175 -0.00115117 0.00230963 0.00683042 +EDGE3 501 552 3.62452 9.66402 -4.82595 0.00472735 0.00336391 0.126726 +EDGE3 502 551 3.46323 -9.66807 -4.63206 -0.00355687 0.010865 -0.115082 +EDGE3 503 553 4.14482 0.00119137 -4.73145 0.0121461 -0.000265577 -0.0106829 +EDGE3 502 553 3.6184 9.68669 -4.80189 0.0022467 0.00214415 0.122719 +EDGE3 503 552 3.43517 -9.70183 -4.61193 -0.00530769 -0.00296587 -0.127946 +EDGE3 504 554 4.12818 -0.00619947 -4.7402 0.00627131 -0.0106814 -0.00339176 +EDGE3 503 554 3.58666 9.69888 -4.83354 0.00315743 0.00328739 0.125201 +EDGE3 504 553 3.43126 -9.69907 -4.63824 -0.00150223 0.000758634 -0.124385 +EDGE3 505 555 4.11822 0.00267496 -4.73283 0.00330058 -0.00252665 -0.00278923 +EDGE3 504 555 3.59196 9.69217 -4.84122 -0.00492016 0.00518678 0.121755 +EDGE3 505 554 3.44055 -9.68527 -4.64115 -0.000992927 -0.0070481 -0.12154 +EDGE3 506 556 4.11654 -0.0124659 -4.73846 -0.000159192 0.00541983 0.00189885 +EDGE3 505 556 3.58536 9.70737 -4.832 0.00486707 0.00549397 0.127502 +EDGE3 506 555 3.41037 -9.69422 -4.6475 -0.000150767 -0.00146194 -0.134125 +EDGE3 507 557 4.10179 0.00696934 -4.73075 0.00132416 -0.00953774 0.00269777 +EDGE3 506 557 3.58605 9.72679 -4.84834 -0.00103521 0.00207854 0.119438 +EDGE3 507 556 3.40924 -9.7178 -4.63544 -0.00518813 -0.00122171 -0.131038 +EDGE3 508 558 4.1035 -0.00438821 -4.73318 0.00219785 -0.00578937 -0.00173877 +EDGE3 507 558 3.58542 9.7341 -4.86189 0.00767791 -0.00920081 0.128817 +EDGE3 508 557 3.4099 -9.71971 -4.66645 0.00115426 -0.00621893 -0.122215 +EDGE3 509 559 4.09675 -0.0135113 -4.7546 0.00398875 0.00344973 0.000694147 +EDGE3 508 559 3.56288 9.75692 -4.85822 0.00204337 0.00121208 0.130158 +EDGE3 509 558 3.42362 -9.74812 -4.65772 -0.00289663 0.00404109 -0.117528 +EDGE3 510 560 4.09132 -0.00672032 -4.7601 -0.000441616 -0.00222122 0.00399146 +EDGE3 509 560 3.5858 9.76069 -4.87611 -0.00371683 -0.00239476 0.122082 +EDGE3 510 559 3.40311 -9.73637 -4.65841 -0.00314021 -0.00395072 -0.124906 +EDGE3 511 561 4.08194 -0.000697243 -4.75798 0.00517048 0.00125971 -0.00370729 +EDGE3 510 561 3.53331 9.78179 -4.8498 0.00553035 -0.00123634 0.122129 +EDGE3 511 560 3.38376 -9.76635 -4.66545 0.0129425 -0.0127281 -0.11754 +EDGE3 512 562 4.07729 0.011889 -4.78732 0.00239271 -0.00245931 -0.00865113 +EDGE3 511 562 3.55326 9.78063 -4.86914 -0.0199118 0.00128986 0.126518 +EDGE3 512 561 3.388 -9.77349 -4.68642 0.00187042 0.00602555 -0.124018 +EDGE3 513 563 4.08893 -0.00865785 -4.77604 0.00741595 0.00456975 0.00479194 +EDGE3 512 563 3.5472 9.76598 -4.87289 0.00575902 -0.00916243 0.125045 +EDGE3 513 562 3.37588 -9.77711 -4.68021 0.00186833 -0.00234762 -0.132934 +EDGE3 514 564 4.07738 -0.0094426 -4.80382 -0.00576292 0.00392908 0.0012686 +EDGE3 513 564 3.5536 9.78408 -4.8814 0.00503503 -0.00893179 0.127353 +EDGE3 514 563 3.34177 -9.7796 -4.68949 -0.00317643 -0.00508339 -0.123622 +EDGE3 515 565 4.07775 0.000977889 -4.79526 -0.000697836 0.00438713 -0.00336755 +EDGE3 515 564 3.37794 -9.79214 -4.68379 0.00737673 -0.0018037 -0.127326 +EDGE3 514 565 3.53188 9.80959 -4.87714 -0.00267239 -0.00109422 0.123886 +EDGE3 516 566 4.07758 -0.00118916 -4.78617 -0.000585809 0.00349573 0.000664776 +EDGE3 515 566 3.52075 9.80708 -4.91457 -0.000115363 0.00274199 0.119602 +EDGE3 516 565 3.35629 -9.8012 -4.69551 0.000415383 -0.00196459 -0.131364 +EDGE3 517 567 4.03888 -0.00214749 -4.79807 0.00338858 -0.000757947 -0.00465044 +EDGE3 516 567 3.5127 9.82092 -4.88371 -0.00729674 0.00352403 0.121271 +EDGE3 517 566 3.36555 -9.81436 -4.6996 -0.00159854 0.00406745 -0.135273 +EDGE3 518 568 4.04904 -0.00706546 -4.81248 -0.00371939 -0.00262885 0.00114072 +EDGE3 517 568 3.5215 9.84508 -4.90148 0.000980446 -0.00409751 0.124936 +EDGE3 518 567 3.33685 -9.81396 -4.71451 0.000686678 0.00804762 -0.130607 +EDGE3 519 569 4.0575 0.00925076 -4.81218 -0.00221392 0.00409576 0.000819555 +EDGE3 518 569 3.49986 9.84985 -4.92138 -0.00161288 -0.00322739 0.124533 +EDGE3 519 568 3.33865 -9.83495 -4.70684 -0.000532094 0.000538281 -0.122139 +EDGE3 520 570 4.04302 -0.00637454 -4.7988 0.00614663 -0.0110641 0.00561409 +EDGE3 519 570 3.48767 9.8622 -4.89698 0.00398223 -0.00198312 0.116895 +EDGE3 520 569 3.3241 -9.85331 -4.70272 0.00107714 0.00143828 -0.126696 +EDGE3 521 571 4.03041 -0.00642155 -4.82722 0.0024287 0.00490068 -0.000878068 +EDGE3 520 571 3.49468 9.85249 -4.92475 -0.0104841 0.00222573 0.118492 +EDGE3 521 570 3.33575 -9.84127 -4.70976 0.00273546 -0.00792195 -0.128145 +EDGE3 522 572 4.02111 0.0112725 -4.80805 0.0115583 0.00253466 -0.00517774 +EDGE3 521 572 3.47232 9.87783 -4.90207 0.00539142 -0.000694509 0.127818 +EDGE3 522 571 3.33086 -9.86013 -4.73736 -0.00412435 -0.00968588 -0.126023 +EDGE3 523 573 4.01974 -0.00441439 -4.82157 -0.00235696 -0.00193668 0.00793338 +EDGE3 522 573 3.48737 9.8839 -4.92953 0.0034771 0.00250372 0.123863 +EDGE3 523 572 3.2987 -9.84753 -4.74058 -4.80784e-05 -0.00302448 -0.139368 +EDGE3 524 574 3.99768 -0.00125708 -4.83461 -0.00116032 -0.00430551 -0.000839172 +EDGE3 523 574 3.4738 9.89469 -4.93055 0.00357332 0.00290221 0.13018 +EDGE3 524 573 3.31039 -9.89349 -4.74799 -0.00443884 0.00358139 -0.118403 +EDGE3 525 575 4.00631 0.00860313 -4.83945 0.00185717 -0.000311803 0.00689974 +EDGE3 525 574 3.31155 -9.90603 -4.74934 -0.00567759 -0.00894816 -0.124262 +EDGE3 524 575 3.47284 9.90683 -4.93887 -0.00206223 0.00111991 0.122986 +EDGE3 526 576 3.98852 -0.00255505 -4.84052 0.000411446 0.00159472 -0.00136491 +EDGE3 525 576 3.44174 9.91444 -4.93969 0.00345647 0.00913779 0.126618 +EDGE3 526 575 3.30788 -9.9142 -4.74332 -0.00199853 -0.00151992 -0.119616 +EDGE3 527 577 3.9894 0.0028358 -4.84881 0.000360983 0.000411097 -0.00887963 +EDGE3 526 577 3.4487 9.91287 -4.96418 0.00468098 -0.0105841 0.11479 +EDGE3 527 576 3.30238 -9.91384 -4.75431 -0.000778514 0.00295694 -0.127775 +EDGE3 528 578 3.96655 0.00306449 -4.85734 -0.00500999 -0.00325866 0.00764169 +EDGE3 527 578 3.42914 9.92161 -4.97259 0.000294414 -0.00186577 0.129655 +EDGE3 528 577 3.2983 -9.93021 -4.74861 0.00140282 0.00530942 -0.128108 +EDGE3 529 579 3.98042 -0.00224137 -4.85618 -0.00315555 -0.0049015 -0.00592833 +EDGE3 528 579 3.43629 9.93668 -4.97002 -0.00340408 -0.0035769 0.122598 +EDGE3 529 578 3.27164 -9.95273 -4.76841 -0.00121472 -0.00155622 -0.127515 +EDGE3 530 580 3.97888 -0.00333401 -4.84897 -0.00075931 0.00801667 -0.00267996 +EDGE3 529 580 3.43819 9.95929 -4.95262 -0.0043934 -0.00258725 0.12916 +EDGE3 530 579 3.25464 -9.93401 -4.76449 -0.00392042 -0.00344075 -0.123831 +EDGE3 531 581 3.95683 -0.00908862 -4.86583 -0.00449404 0.00075964 -0.00381363 +EDGE3 530 581 3.42423 9.94719 -4.95846 -0.000973163 0.00220244 0.123455 +EDGE3 531 580 3.28234 -9.97361 -4.78189 -0.00539012 0.00892801 -0.121404 +EDGE3 532 582 3.97364 -0.0157707 -4.88499 -0.00798657 0.00582659 0.00151331 +EDGE3 531 582 3.41861 9.96168 -4.9815 -0.00109205 -0.00729404 0.119546 +EDGE3 532 581 3.26398 -9.97311 -4.79553 0.000229185 0.00530905 -0.125368 +EDGE3 533 583 3.96646 0.00352582 -4.87948 -0.00203322 0.00128946 0.00147149 +EDGE3 532 583 3.40279 9.982 -4.9785 0.00369907 0.00399036 0.124626 +EDGE3 533 582 3.25613 -9.98058 -4.77576 -0.00172696 0.00638431 -0.118459 +EDGE3 534 584 3.95183 0.0176136 -4.89655 -0.00162179 0.00771819 -0.00298993 +EDGE3 533 584 3.40787 9.97056 -4.96955 -0.000648277 0.00375655 0.129307 +EDGE3 534 583 3.24176 -9.98736 -4.77469 0.00201472 0.00952813 -0.121386 +EDGE3 535 585 3.92862 0.0147385 -4.88557 0.00419773 0.00676158 0.000431731 +EDGE3 534 585 3.39451 9.99785 -4.98515 0.00151308 -0.00629905 0.122634 +EDGE3 535 584 3.2398 -9.99751 -4.78282 -0.0110348 -0.00340262 -0.124769 +EDGE3 536 586 3.92612 -0.00835786 -4.88821 -0.0058865 0.00565802 -0.0012982 +EDGE3 535 586 3.37856 10.026 -5.00695 0.00179954 -0.0010196 0.12231 +EDGE3 536 585 3.22657 -10.0146 -4.78616 0.005602 0.000799481 -0.126458 +EDGE3 537 587 3.93775 -0.0147492 -4.90017 -0.00396336 -0.000883943 0.000830095 +EDGE3 536 587 3.38168 10.0041 -4.9902 -0.00366044 0.00208036 0.116929 +EDGE3 537 586 3.2214 -9.99115 -4.80297 0.00755293 -0.00967819 -0.118324 +EDGE3 538 588 3.92128 0.00339189 -4.91585 -0.00720396 0.00557486 -0.000780481 +EDGE3 537 588 3.38609 10.0247 -4.99953 -0.00829706 -0.000996155 0.114736 +EDGE3 538 587 3.24326 -10.0285 -4.7985 0.0015965 0.00458703 -0.127058 +EDGE3 539 589 3.91256 -0.00816618 -4.9049 0.0141676 0.00195063 0.000699316 +EDGE3 538 589 3.3644 10.0309 -5.01313 0.000377384 0.00168912 0.12653 +EDGE3 539 588 3.21191 -10.0099 -4.8176 -0.00192969 -0.00487285 -0.116265 +EDGE3 540 590 3.91937 -0.015299 -4.92356 -0.0013048 -0.000742081 -0.00764226 +EDGE3 539 590 3.35164 10.0534 -5.00686 0.00203989 0.00363289 0.136568 +EDGE3 540 589 3.20688 -10.0393 -4.80559 0.00383257 -0.00789076 -0.126794 +EDGE3 541 591 3.90686 0.0236799 -4.93637 -0.000124232 -0.00810089 0.000212981 +EDGE3 540 591 3.33141 10.0519 -5.02584 -0.00431859 -0.000653587 0.128539 +EDGE3 541 590 3.20409 -10.0564 -4.81636 0.00269504 -0.00489055 -0.12779 +EDGE3 542 592 3.92179 0.0106822 -4.92495 -0.00154363 -0.0117366 0.0014445 +EDGE3 541 592 3.35001 10.0616 -5.02564 0.0011433 -0.00406623 0.121512 +EDGE3 542 591 3.19207 -10.0552 -4.8195 0.00374529 0.000602474 -0.135443 +EDGE3 543 593 3.89432 0.0139376 -4.93201 -0.00343457 -0.00777345 0.000660048 +EDGE3 542 593 3.35389 10.0716 -5.01827 -0.000140461 -0.00129354 0.122699 +EDGE3 543 592 3.16207 -10.0608 -4.84113 0.00155928 -0.00861627 -0.129089 +EDGE3 544 594 3.87678 0.0114387 -4.92657 0.00840292 0.0158842 -0.00248239 +EDGE3 543 594 3.32907 10.0796 -5.04344 -0.000867459 -0.000601082 0.130037 +EDGE3 544 593 3.18442 -10.0832 -4.82374 -0.00160502 -0.00760596 -0.131887 +EDGE3 545 595 3.8674 0.00932061 -4.93534 0.00383057 0.000584725 0.00553015 +EDGE3 544 595 3.33795 10.1035 -5.01982 0.00360112 0.00320271 0.126171 +EDGE3 545 594 3.1608 -10.0877 -4.8414 -0.00644328 0.00190853 -0.130516 +EDGE3 546 596 3.8645 0.0193658 -4.94495 0.00141499 -0.00230874 -0.00773035 +EDGE3 545 596 3.33422 10.0995 -5.04725 0.00468276 0.00223843 0.122468 +EDGE3 546 595 3.17125 -10.088 -4.8586 -0.00158982 -0.000231364 -0.134238 +EDGE3 547 597 3.85686 0.0151523 -4.95261 -0.0079788 -0.0100979 -0.00342357 +EDGE3 546 597 3.31763 10.1204 -5.04773 -0.00321789 -0.00884067 0.118385 +EDGE3 547 596 3.14958 -10.1079 -4.84755 0.00179919 0.00277049 -0.128513 +EDGE3 548 598 3.8609 -5.36797e-05 -4.93516 -0.00178044 -0.00712289 0.00210986 +EDGE3 547 598 3.31281 10.1229 -5.05602 0.0114115 0.00266677 0.124151 +EDGE3 548 597 3.1279 -10.1019 -4.85694 -0.00242146 0.00436408 -0.125472 +EDGE3 549 599 3.87529 0.00888275 -4.96046 0.00982521 -0.00479767 -0.00124262 +EDGE3 549 598 3.12972 -10.1199 -4.85243 -0.000302915 0.000257775 -0.127534 +EDGE3 548 599 3.30019 10.1286 -5.04082 0.00296697 0.0016437 0.121842 +EDGE3 549 600 3.30158 10.1297 -5.06788 -0.00131834 -0.00345372 0.126114 +EDGE3 550 600 3.82823 0.00655218 -4.96854 -0.00495529 0.00942092 -0.00329515 +EDGE3 551 601 3.84805 0.00374558 -4.96947 -0.00678603 0.000336017 0.00626651 +EDGE3 550 599 3.14777 -10.1389 -4.8583 -0.000786435 -0.00438039 -0.121681 +EDGE3 551 600 3.11776 -10.1534 -4.87678 -0.00466327 -0.00131053 -0.122787 +EDGE3 550 601 3.2854 10.1505 -5.09028 0.00219828 0.00071179 0.123601 +EDGE3 551 602 3.28227 10.1398 -5.07079 0.00453387 0.00235954 0.133931 +EDGE3 552 602 3.82007 -0.00293255 -4.97248 -0.00974981 0.00157341 0.00148268 +EDGE3 553 603 3.83165 -0.00687894 -4.98651 0.00200402 1.44298e-05 -0.00257029 +EDGE3 552 601 3.11583 -10.1377 -4.86241 -0.00682819 0.00801697 -0.125693 +EDGE3 552 603 3.27561 10.1659 -5.07376 0.00891808 0.00378381 0.129857 +EDGE3 553 602 3.12703 -10.1447 -4.88694 -0.0034448 0.00144459 -0.120709 +EDGE3 553 604 3.25717 10.1693 -5.07588 0.0083614 -0.00285395 0.121852 +EDGE3 554 604 3.82333 -0.00396218 -4.9956 -0.0079467 -0.00474782 -0.00198388 +EDGE3 555 605 3.81496 -0.00794495 -4.986 -0.00301686 0.011294 0.0102581 +EDGE3 554 603 3.12033 -10.1597 -4.87839 0.00143811 -0.00540824 -0.124863 +EDGE3 555 604 3.10646 -10.1744 -4.89193 0.000975086 0.00457002 -0.128631 +EDGE3 554 605 3.25709 10.1716 -5.0799 -0.00564956 -0.00308346 0.126355 +EDGE3 555 606 3.24774 10.1906 -5.09857 0.00373184 0.00204915 0.120407 +EDGE3 556 606 3.80716 0.00550729 -4.99073 0.00994994 0.00100582 0.0016069 +EDGE3 557 607 3.79638 -0.0191686 -4.98166 -0.00292982 -0.00212358 0.00154171 +EDGE3 556 605 3.10187 -10.1969 -4.89018 -0.00267339 0.00290024 -0.125933 +EDGE3 557 606 3.08767 -10.1849 -4.89557 0.00663556 -0.00332835 -0.11929 +EDGE3 556 607 3.245 10.2067 -5.09445 -0.00819503 0.00387711 0.12444 +EDGE3 557 608 3.22453 10.2111 -5.10585 0.00740736 -0.00577389 0.122797 +EDGE3 558 608 3.78735 0.0174316 -5.00772 0.00555325 -0.0021304 -0.00868195 +EDGE3 559 609 3.76988 0.00436843 -5.01031 -0.0079796 -0.000111677 0.000475844 +EDGE3 558 607 3.10225 -10.2009 -4.87015 -0.00492774 0.00106625 -0.13108 +EDGE3 558 609 3.22077 10.2347 -5.09677 0.00147674 -0.0139149 0.135386 +EDGE3 559 608 3.08143 -10.2167 -4.90211 -0.00663998 0.00242962 -0.127638 +EDGE3 559 610 3.20519 10.2288 -5.07939 0.00780585 -0.00680841 0.120996 +EDGE3 560 610 3.77899 0.0159936 -5.01243 -0.00346712 0.00465191 -0.00267682 +EDGE3 561 611 3.76255 -0.00859258 -5.01438 -0.00322155 -0.000337761 -0.00172883 +EDGE3 560 609 3.08385 -10.2172 -4.90957 0.00026934 -0.00189635 -0.125366 +EDGE3 560 611 3.19878 10.2787 -5.10731 -0.00205786 -0.00136652 0.128817 +EDGE3 561 610 3.06865 -10.2328 -4.92088 0.00469559 0.00834797 -0.124568 +EDGE3 561 612 3.21536 10.2541 -5.11478 0.00219086 0.0015216 0.129281 +EDGE3 562 612 3.77417 0.0118356 -5.02251 -0.000348278 -0.00342046 0.00329064 +EDGE3 562 611 3.06334 -10.2568 -4.91926 -0.00193059 0.000267828 -0.129755 +EDGE3 563 613 3.76559 0.0110292 -5.01811 0.00719274 0.00452825 0.00441772 +EDGE3 563 612 3.06096 -10.2484 -4.92205 -0.00376813 -0.00689205 -0.128626 +EDGE3 562 613 3.17976 10.267 -5.1434 -0.000497215 0.0025646 0.125523 +EDGE3 563 614 3.20497 10.2629 -5.13571 0.00368702 -0.00216351 0.12264 +EDGE3 564 614 3.75796 0.00957941 -5.03742 -0.000391669 0.0014036 0.00441769 +EDGE3 565 615 3.73867 -0.00936694 -5.03895 -0.0103294 -0.00753822 -0.00467508 +EDGE3 564 613 3.04242 -10.2546 -4.92979 0.00549757 -0.00508619 -0.12855 +EDGE3 564 615 3.1885 10.2705 -5.12991 -0.00743847 -0.000538305 0.126152 +EDGE3 565 614 3.03687 -10.2794 -4.93008 0.00178389 -0.0069832 -0.122606 +EDGE3 566 616 3.74387 0.00714648 -5.03446 -0.00149376 -0.00746568 -0.00366393 +EDGE3 565 616 3.18992 10.2972 -5.1382 -0.00354582 0.00144486 0.128721 +EDGE3 566 615 3.04177 -10.2742 -4.93843 -0.0008827 0.0129637 -0.121033 +EDGE3 566 617 3.18538 10.2947 -5.15304 0.00290427 0.000370332 0.121245 +EDGE3 567 617 3.73523 -0.0204864 -5.02594 0.00961214 0.00732521 -0.00130556 +EDGE3 568 618 3.72462 0.00671839 -5.04447 -0.00854892 0.00566754 -0.00756221 +EDGE3 567 616 3.0325 -10.3085 -4.94576 -0.00189192 0.00911211 -0.124694 +EDGE3 568 617 3.01177 -10.3018 -4.94888 -0.00222413 0.00441774 -0.131421 +EDGE3 567 618 3.18261 10.3183 -5.1515 -0.000351505 -0.00117082 0.12455 +EDGE3 569 619 3.73103 -0.00532177 -5.03098 -0.00250045 0.00188954 -0.00249899 +EDGE3 568 619 3.17457 10.3165 -5.14468 0.00937468 0.00043789 0.127563 +EDGE3 569 618 3.03641 -10.3005 -4.95345 -0.00407424 0.00174603 -0.120663 +EDGE3 569 620 3.15358 10.3335 -5.15428 -0.000329511 0.00868366 0.126232 +EDGE3 570 620 3.7177 -0.0121787 -5.06965 -0.00247778 -0.00158323 -0.0051888 +EDGE3 571 621 3.7139 0.0111902 -5.05937 0.00388199 -0.00336577 -0.000177325 +EDGE3 570 619 3.01758 -10.3096 -4.95128 0.00495331 0.00504841 -0.125925 +EDGE3 571 620 2.99372 -10.3217 -4.95494 -0.00232028 0.000374211 -0.125192 +EDGE3 570 621 3.13857 10.3379 -5.16669 -0.00387291 -0.00132343 0.127286 +EDGE3 572 622 3.70756 -0.00695913 -5.0624 -0.000777122 0.00600515 -0.00493467 +EDGE3 571 622 3.14573 10.3369 -5.17198 0.00910736 0.00855032 0.118944 +EDGE3 572 621 2.99503 -10.3465 -4.96314 -0.00895931 -0.011011 -0.119544 +EDGE3 572 623 3.14076 10.3486 -5.16924 -0.000611718 0.00468037 0.125264 +EDGE3 573 623 3.71084 -0.0105865 -5.07073 -0.00604556 -0.00640938 -0.0011717 +EDGE3 574 624 3.69457 -0.0044826 -5.08854 -0.00657541 -0.00354436 -0.00333611 +EDGE3 573 622 2.98761 -10.3322 -4.97437 0.00166695 0.00332842 -0.116772 +EDGE3 573 624 3.11966 10.3604 -5.16885 0.00527336 -0.000352594 0.122276 +EDGE3 574 623 2.97741 -10.3474 -4.97412 -0.000487101 0.00270548 -0.122328 +EDGE3 574 625 3.11555 10.363 -5.17012 -0.000287521 -0.00637485 0.129212 +EDGE3 575 625 3.6961 0.0134447 -5.07345 -0.000532977 -0.0026263 0.00361198 +EDGE3 576 626 3.68365 0.00017119 -5.08578 -0.00146287 0.00459213 -0.00443297 +EDGE3 575 624 2.98517 -10.3666 -4.97705 0.0024264 0.00110496 -0.126456 +EDGE3 576 625 2.98019 -10.3618 -4.97615 -0.000155968 -0.00152001 -0.122704 +EDGE3 575 626 3.11702 10.4019 -5.18667 -0.00511362 -0.0106532 0.117063 +EDGE3 576 627 3.10521 10.3876 -5.18565 -0.00249675 -0.00208774 0.124722 +EDGE3 577 627 3.6809 0.0239462 -5.08164 -0.00643921 -0.000466334 0.00238767 +EDGE3 578 628 3.67222 0.000951464 -5.11166 -0.00785244 -0.000608851 -0.00554089 +EDGE3 577 626 2.95597 -10.336 -4.9897 -0.0092191 0.00396602 -0.128216 +EDGE3 577 628 3.10356 10.3848 -5.19834 0.00205978 0.00634897 0.135653 +EDGE3 578 627 2.9646 -10.3742 -5.00093 -0.00150028 -0.00993813 -0.125634 +EDGE3 578 629 3.08427 10.4007 -5.20206 -0.00647998 -0.0096042 0.118611 +EDGE3 579 629 3.66583 0.0130949 -5.098 0.000609887 -0.00325081 -0.00931334 +EDGE3 580 630 3.67295 0.0131679 -5.09729 0.00110559 0.00492199 0.00092105 +EDGE3 579 628 2.93627 -10.4121 -4.99627 -0.00206394 -0.00975469 -0.118776 +EDGE3 580 629 2.94789 -10.4023 -5.00679 -0.00792868 -0.00258082 -0.12401 +EDGE3 579 630 3.09527 10.4138 -5.19304 -0.00116282 -0.00424251 0.117442 +EDGE3 580 631 3.07694 10.398 -5.23034 -0.00612778 -0.00892822 0.122879 +EDGE3 581 631 3.6455 0.023339 -5.11564 0.00728923 -0.00172121 0.000856054 +EDGE3 582 632 3.64234 0.00738819 -5.11118 0.00696971 -0.000579707 -0.00555056 +EDGE3 581 630 2.92739 -10.4046 -5.01324 0.0113205 -0.00033522 -0.122932 +EDGE3 581 632 3.05946 10.4342 -5.20567 0.00447077 -0.00180377 0.125802 +EDGE3 582 631 2.92184 -10.4195 -5.00784 -0.000359283 -0.00155658 -0.121677 +EDGE3 582 633 3.06478 10.4327 -5.22456 -0.000264441 -0.00362871 0.130468 +EDGE3 583 633 3.63134 0.022564 -5.13015 0.000576548 -0.00315635 0.007846 +EDGE3 584 634 3.63912 -0.006232 -5.13529 0.00606761 0.00815455 0.00719029 +EDGE3 583 632 2.91582 -10.4265 -5.00227 -0.00851286 0.011639 -0.128906 +EDGE3 584 633 2.90607 -10.4545 -5.01848 -0.00155885 -0.00314861 -0.125224 +EDGE3 583 634 3.04247 10.4505 -5.2147 -0.0109566 -0.00519447 0.119398 +EDGE3 585 635 3.62388 -0.0103171 -5.11905 -0.000505142 0.00111259 -0.00455332 +EDGE3 584 635 3.0457 10.4479 -5.22938 0.00415102 0.0119525 0.133848 +EDGE3 585 634 2.89954 -10.427 -5.03319 0.000255717 0.00268095 -0.1274 +EDGE3 585 636 3.04478 10.4557 -5.23901 -0.00837509 0.00527005 0.122421 +EDGE3 586 636 3.62663 0.0106495 -5.14216 -4.30652e-08 0.00270637 -0.00888913 +EDGE3 586 635 2.90381 -10.4347 -5.01108 0.000910584 0.00299108 -0.12414 +EDGE3 587 637 3.60706 0.0147326 -5.13862 -0.0025231 0.00264951 0.00225619 +EDGE3 586 637 3.02111 10.4734 -5.24915 -0.00187728 -0.00471263 0.129977 +EDGE3 587 636 2.88693 -10.4593 -5.03275 0.00608968 0.00411299 -0.121216 +EDGE3 588 638 3.60748 -0.00485091 -5.14359 -0.00187241 -4.69797e-05 0.00794143 +EDGE3 587 638 3.01032 10.4912 -5.25429 0.00236286 0.00277458 0.130541 +EDGE3 588 637 2.87738 -10.4502 -5.04413 0.00402322 -0.00747167 -0.124814 +EDGE3 589 639 3.58888 0.000664792 -5.15325 0.00428066 -0.00340252 -0.00486861 +EDGE3 588 639 3.0199 10.4984 -5.24282 -0.000408244 -0.00311866 0.124571 +EDGE3 589 638 2.86526 -10.4766 -5.04917 0.00161265 -0.00452018 -0.12592 +EDGE3 590 640 3.59252 0.00125891 -5.14594 -0.00152935 -0.00495138 0.00128097 +EDGE3 589 640 3.02296 10.4972 -5.25408 0.0042626 0.00839083 0.129212 +EDGE3 590 639 2.87252 -10.4812 -5.04266 -0.00379797 -0.000198726 -0.130765 +EDGE3 591 641 3.59079 0.016206 -5.16173 0.00857632 -0.00115809 -0.00431113 +EDGE3 590 641 3.00219 10.5143 -5.26455 -0.00712749 0.000362911 0.124272 +EDGE3 591 640 2.87344 -10.498 -5.05434 -0.00208811 -0.00228114 -0.121919 +EDGE3 592 642 3.57683 -0.0134408 -5.15345 -0.00209095 -0.00166858 -0.00441533 +EDGE3 591 642 2.98732 10.5103 -5.24486 0.0101411 0.00402231 0.123659 +EDGE3 592 641 2.85375 -10.5002 -5.05202 -0.00441883 -0.00983458 -0.136898 +EDGE3 593 643 3.58094 0.01018 -5.15716 0.00156996 0.001886 0.00680967 +EDGE3 592 643 2.99781 10.5203 -5.2575 0.000973076 -0.00297489 0.134847 +EDGE3 593 642 2.85451 -10.5199 -5.06653 -0.00195246 0.00286662 -0.128595 +EDGE3 594 644 3.56778 -0.00193442 -5.16807 -0.00164859 -0.00690597 0.00343734 +EDGE3 593 644 2.98611 10.5367 -5.27311 0.00803942 0.0013775 0.129092 +EDGE3 594 643 2.84504 -10.5413 -5.05285 0.00480486 -0.0039019 -0.129169 +EDGE3 595 645 3.56049 -0.0137223 -5.17058 0.00742806 0.00836759 -0.00278037 +EDGE3 594 645 2.98565 10.5451 -5.27986 -0.00529153 -0.00198083 0.125056 +EDGE3 595 644 2.85327 -10.5236 -5.07684 0.000308236 0.00497646 -0.124102 +EDGE3 596 646 3.55228 -0.0241371 -5.1826 0.00294394 0.00112561 -0.00177976 +EDGE3 595 646 2.96297 10.5585 -5.28194 -0.00546859 0.00224122 0.119551 +EDGE3 596 645 2.82092 -10.5248 -5.06875 -0.00121963 -0.0040158 -0.122469 +EDGE3 597 647 3.54456 0.0128081 -5.18954 0.00314372 0.00216931 -0.00287284 +EDGE3 596 647 2.97308 10.5614 -5.28403 0.00287946 0.000286137 0.123676 +EDGE3 597 646 2.81467 -10.546 -5.09254 -0.00868927 -0.000585499 -0.121743 +EDGE3 598 648 3.53181 0.00456606 -5.19795 -0.00430959 0.00191029 -0.00119972 +EDGE3 597 648 2.96685 10.5685 -5.28111 -0.00328496 0.0071269 0.129149 +EDGE3 598 647 2.82413 -10.5578 -5.07173 -0.00580296 -0.00185207 -0.128787 +EDGE3 599 649 3.53023 0.0102111 -5.21279 -0.0027712 -0.00115779 -0.00195078 +EDGE3 598 649 2.95715 10.5787 -5.29639 0.00455685 -0.00357852 0.137216 +EDGE3 599 648 2.81091 -10.5866 -5.07752 0.00643665 -0.00970259 -0.130937 +EDGE3 600 650 3.53315 0.00730917 -5.20402 0.00185326 -0.00665992 0.00283373 +EDGE3 599 650 2.9205 10.5812 -5.28899 -0.000541595 0.00114891 0.119214 +EDGE3 600 649 2.78736 -10.5677 -5.08822 0.00471372 0.00123046 -0.123238 +EDGE3 601 651 3.51951 0.026805 -5.19683 0.0081466 -0.00291228 -0.00952172 +EDGE3 600 651 2.9458 10.5874 -5.30364 0.00194616 0.000966582 0.122493 +EDGE3 601 650 2.77931 -10.5793 -5.09956 0.00508244 0.00117906 -0.122995 +EDGE3 602 652 3.53448 0.00934916 -5.20308 -0.00217426 -0.00229758 -0.00584186 +EDGE3 601 652 2.9199 10.5923 -5.3222 0.00556671 -0.00506105 0.126214 +EDGE3 602 651 2.77501 -10.5891 -5.08643 0.000562902 -0.00547223 -0.133159 +EDGE3 603 653 3.51477 -0.012748 -5.22259 0.00700089 0.0020643 0.0037993 +EDGE3 602 653 2.91285 10.6278 -5.32538 -0.00174327 -0.0135517 0.12841 +EDGE3 603 652 2.76831 -10.6056 -5.09984 -0.000865774 0.00604586 -0.128656 +EDGE3 604 654 3.50282 -0.00747928 -5.22427 -0.00882473 -0.00605915 0.000222335 +EDGE3 603 654 2.898 10.614 -5.33382 0.00715097 0.00760289 0.12429 +EDGE3 604 653 2.77937 -10.6081 -5.11801 -0.00740228 0.00599245 -0.125665 +EDGE3 605 655 3.49171 -0.00388981 -5.2173 -0.00750843 9.63905e-05 0.00916696 +EDGE3 604 655 2.90518 10.6276 -5.32749 -0.00653898 0.00383125 0.130683 +EDGE3 605 654 2.75958 -10.6128 -5.12713 0.0115676 0.0106257 -0.130366 +EDGE3 606 656 3.47898 -0.0211428 -5.19835 -0.00170571 0.00134892 0.00382286 +EDGE3 605 656 2.88104 10.6365 -5.31641 -0.00401263 0.000957359 0.132174 +EDGE3 606 655 2.7531 -10.6157 -5.1144 -0.00223818 -2.61333e-05 -0.130014 +EDGE3 607 657 3.47712 -0.000639328 -5.23099 -0.00579484 -0.000226544 0.0017379 +EDGE3 606 657 2.88427 10.6549 -5.32913 0.000793254 0.00307786 0.130432 +EDGE3 607 656 2.73656 -10.6341 -5.11655 0.000898028 0.00242115 -0.131999 +EDGE3 608 658 3.49482 0.0075782 -5.22351 -0.00711598 -0.00152942 0.000646439 +EDGE3 607 658 2.87898 10.6676 -5.33218 0.00263004 -0.00153248 0.129563 +EDGE3 608 657 2.74496 -10.632 -5.12307 0.00687905 0.00450287 -0.131635 +EDGE3 609 659 3.4798 0.0108957 -5.23146 -0.00269386 6.45534e-05 -0.00455512 +EDGE3 608 659 2.87556 10.653 -5.34276 0.00527513 -0.00815719 0.125044 +EDGE3 609 658 2.73576 -10.6473 -5.13657 -0.0019682 0.00249631 -0.12448 +EDGE3 610 660 3.47784 0.00982109 -5.24433 0.00394751 0.00405392 0.00209812 +EDGE3 609 660 2.86139 10.6509 -5.34988 0.00417717 -0.0106181 0.129289 +EDGE3 610 659 2.72598 -10.6538 -5.13463 -0.00658531 0.00496931 -0.128085 +EDGE3 611 661 3.46442 6.94668e-05 -5.23168 0.00811602 0.00401118 -0.004607 +EDGE3 610 661 2.85296 10.6561 -5.35564 -0.00160062 0.00423427 0.121263 +EDGE3 611 660 2.71495 -10.6733 -5.15635 -0.0018777 -0.00747242 -0.12791 +EDGE3 612 662 3.4473 -0.0141399 -5.23931 0.00513964 -0.00244985 0.00357715 +EDGE3 611 662 2.85521 10.676 -5.32186 0.000360537 0.00937129 0.121576 +EDGE3 612 661 2.71588 -10.6798 -5.15405 0.00415164 0.0100265 -0.126221 +EDGE3 613 663 3.44453 0.0123163 -5.24166 0.00190264 0.0152992 0.00127457 +EDGE3 612 663 2.84997 10.6845 -5.34793 -0.00053691 -0.000369167 0.120468 +EDGE3 613 662 2.70449 -10.6861 -5.12622 -0.00354325 -0.0106397 -0.132653 +EDGE3 614 664 3.44726 0.00789725 -5.26035 -0.00131178 -0.00232765 0.00744142 +EDGE3 613 664 2.83618 10.6912 -5.36728 -0.00321286 0.00358921 0.128003 +EDGE3 614 663 2.68705 -10.6998 -5.14392 0.000882297 -0.00225991 -0.133225 +EDGE3 615 665 3.43863 0.00626131 -5.25396 -0.00140698 -0.00827181 -0.00171009 +EDGE3 614 665 2.8414 10.713 -5.37402 0.00134808 -0.00573254 0.130502 +EDGE3 615 664 2.67628 -10.6966 -5.14199 -0.00242538 -0.000707067 -0.134045 +EDGE3 616 666 3.41194 0.00690884 -5.25568 -0.00436937 -0.00239982 0.00254715 +EDGE3 615 666 2.83286 10.7074 -5.3655 0.00731332 -0.00731598 0.121759 +EDGE3 616 665 2.68132 -10.7021 -5.17002 0.000318671 6.03661e-05 -0.125784 +EDGE3 617 667 3.42605 0.000214182 -5.24437 -0.00012013 -0.00922803 -0.00189607 +EDGE3 616 667 2.8018 10.7189 -5.38176 -0.00411574 0.00644514 0.122673 +EDGE3 617 666 2.66572 -10.7153 -5.15112 -0.00386031 0.00279067 -0.130522 +EDGE3 618 668 3.39848 0.010705 -5.29843 0.00110524 -0.00515543 0.00519818 +EDGE3 617 668 2.80146 10.7329 -5.36784 -0.00497484 0.00553968 0.120891 +EDGE3 618 667 2.6737 -10.7281 -5.16945 -0.000752269 -0.00849776 -0.127738 +EDGE3 619 669 3.38646 0.0233382 -5.27848 -0.00521083 -0.00551452 0.00735511 +EDGE3 618 669 2.791 10.7307 -5.39944 -0.00371772 -0.00480861 0.124986 +EDGE3 619 668 2.67752 -10.7359 -5.17111 -2.36674e-05 0.00131565 -0.130293 +EDGE3 620 670 3.39916 0.0181789 -5.26006 -0.00303767 -0.0045622 -0.0051081 +EDGE3 619 670 2.78241 10.7526 -5.39207 -0.00338094 -0.000440483 0.131091 +EDGE3 620 669 2.65666 -10.7373 -5.14719 0.00190323 -0.000854851 -0.129222 +EDGE3 621 671 3.4007 0.0180387 -5.28441 0.0024381 0.00548995 0.000916983 +EDGE3 620 671 2.80104 10.7601 -5.40236 -0.005545 0.00167571 0.12082 +EDGE3 621 670 2.65257 -10.7492 -5.18361 0.00874136 0.0046007 -0.130915 +EDGE3 622 672 3.38853 0.0142383 -5.2987 -4.55248e-05 0.00533208 -0.00341795 +EDGE3 621 672 2.77087 10.7592 -5.39485 0.00135002 -0.00272101 0.133344 +EDGE3 622 671 2.64998 -10.7531 -5.18318 0.00246688 0.000606753 -0.123626 +EDGE3 623 673 3.39023 -0.00551997 -5.29959 0.0147376 0.00877538 0.00455015 +EDGE3 622 673 2.77491 10.7623 -5.41071 0.00257915 -0.00185045 0.135894 +EDGE3 623 672 2.62676 -10.7795 -5.19637 -0.00683169 0.00093575 -0.119619 +EDGE3 624 674 3.37154 0.0161744 -5.30949 0.00374595 -0.00199673 -2.78629e-05 +EDGE3 623 674 2.76896 10.7769 -5.41238 -0.00120939 0.0002927 0.132802 +EDGE3 624 673 2.63096 -10.7877 -5.18565 0.00899243 -0.0104504 -0.122686 +EDGE3 625 675 3.35165 -0.00066222 -5.304 -0.00247299 0.0015913 0.00649492 +EDGE3 624 675 2.76501 10.7993 -5.40933 0.00915562 0.00548342 0.132952 +EDGE3 625 674 2.63075 -10.7906 -5.18133 0.000252692 -0.000673009 -0.128982 +EDGE3 626 676 3.36115 0.0072872 -5.30009 -0.000526752 0.00489191 -2.93153e-05 +EDGE3 625 676 2.74831 10.7846 -5.41047 -0.00616774 0.0144304 0.127462 +EDGE3 626 675 2.61117 -10.7751 -5.20515 -0.00487763 0.00883784 -0.128366 +EDGE3 627 677 3.34783 0.00397299 -5.31958 -0.00605865 -0.000358211 -0.00284394 +EDGE3 626 677 2.75331 10.8133 -5.43379 0.00674238 0.00305624 0.125762 +EDGE3 627 676 2.57924 -10.7901 -5.19208 0.000667297 0.00794027 -0.116553 +EDGE3 628 678 3.33642 -0.006344 -5.32916 -0.00429892 -0.00229212 0.00909879 +EDGE3 627 678 2.72881 10.8134 -5.41384 0.00972272 0.00586277 0.116652 +EDGE3 628 677 2.61158 -10.793 -5.19323 -0.00870985 0.00277971 -0.123209 +EDGE3 629 679 3.34239 0.000577287 -5.3065 0.00278917 0.00152274 -0.000969741 +EDGE3 628 679 2.71771 10.8344 -5.42944 0.000914798 -0.0094227 0.120555 +EDGE3 629 678 2.60426 -10.8106 -5.22656 0.0021237 0.00314506 -0.115391 +EDGE3 630 680 3.32208 -0.000755709 -5.31971 -0.00197466 0.00058688 0.00397953 +EDGE3 629 680 2.72894 10.8306 -5.42636 -0.00124856 0.000510928 0.127111 +EDGE3 630 679 2.59127 -10.8071 -5.21644 -0.0071931 0.00413442 -0.114241 +EDGE3 631 681 3.3159 -0.0179892 -5.32855 -0.00355605 0.00315728 0.0115818 +EDGE3 630 681 2.71292 10.8349 -5.44984 0.00639012 -0.00249686 0.122061 +EDGE3 631 680 2.57635 -10.8247 -5.21745 -0.00489811 0.00548327 -0.122046 +EDGE3 632 682 3.32591 0.00295453 -5.32738 0.00679915 0.00284379 -0.00400042 +EDGE3 631 682 2.7082 10.8701 -5.43363 0.00318026 -3.15211e-06 0.133053 +EDGE3 632 681 2.5682 -10.8285 -5.22237 0.00226009 -0.000689087 -0.121434 +EDGE3 633 683 3.29398 -0.00235708 -5.3296 0.000292255 -0.0077051 -0.00933184 +EDGE3 632 683 2.6961 10.8476 -5.43301 -0.00241474 -0.00519437 0.134988 +EDGE3 633 682 2.59198 -10.8457 -5.2366 -0.00226952 -0.00622913 -0.118553 +EDGE3 634 684 3.32157 0.009226 -5.34063 0.000444925 -0.00911401 0.00664541 +EDGE3 633 684 2.69547 10.8586 -5.44786 0.0020578 0.00159952 0.121664 +EDGE3 634 683 2.55327 -10.8531 -5.23495 0.00106692 0.00291438 -0.129132 +EDGE3 635 685 3.30529 -0.0189795 -5.34069 0.00763387 0.0023016 0.00427264 +EDGE3 634 685 2.69039 10.8664 -5.44562 -0.00616287 -0.00320061 0.119869 +EDGE3 635 684 2.54402 -10.8601 -5.23284 0.00376843 -0.000254647 -0.124777 +EDGE3 636 686 3.27781 -0.000513519 -5.3667 0.00225983 0.006719 -0.00585983 +EDGE3 636 685 2.54082 -10.87 -5.25191 0.00302485 0.00245554 -0.129096 +EDGE3 635 686 2.69046 10.8826 -5.45561 -0.00281402 0.00327323 0.126209 +EDGE3 637 687 3.28501 0.00603132 -5.35105 4.1101e-05 0.00586277 -0.0136012 +EDGE3 637 686 2.53617 -10.8771 -5.24958 0.00345714 -0.00440465 -0.119244 +EDGE3 636 687 2.67178 10.8805 -5.44459 -0.0078509 0.00220673 0.126974 +EDGE3 637 688 2.63917 10.907 -5.45181 0.00488923 -0.00220586 0.12598 +EDGE3 638 688 3.2764 0.00332349 -5.35042 -0.0135902 1.65947e-05 0.00926759 +EDGE3 638 687 2.5331 -10.8767 -5.25482 -0.00854533 -0.0088928 -0.124796 +EDGE3 639 689 3.26458 -0.00159519 -5.35517 0.00238274 -0.00308579 0.00601476 +EDGE3 639 688 2.50988 -10.906 -5.25453 -0.00858395 0.00471177 -0.134369 +EDGE3 638 689 2.65773 10.8818 -5.48716 0.00508704 0.00461288 0.13136 +EDGE3 639 690 2.64176 10.9168 -5.47955 0.00266614 -0.00494338 0.125775 +EDGE3 640 690 3.25376 -0.00387781 -5.3626 -2.73386e-05 -0.0059474 0.00201741 +EDGE3 641 691 3.26023 -0.0166018 -5.35754 0.00725756 -0.00608524 0.00363861 +EDGE3 640 689 2.53086 -10.905 -5.26803 0.000775096 0.00239597 -0.123977 +EDGE3 641 690 2.51609 -10.9107 -5.26096 0.00298331 0.00796982 -0.118696 +EDGE3 640 691 2.63382 10.8983 -5.46978 0.00108546 -0.00393157 0.117085 +EDGE3 641 692 2.64028 10.9223 -5.49508 -0.00465823 0.00538517 0.129215 +EDGE3 642 692 3.24796 -0.0150826 -5.3929 -0.000251645 0.00554776 -0.00409487 +EDGE3 643 693 3.24222 -0.00421274 -5.38471 0.00659945 0.00238907 -0.000350811 +EDGE3 642 691 2.53027 -10.921 -5.27564 0.00199855 0.00980178 -0.126971 +EDGE3 642 693 2.62465 10.9238 -5.48634 -0.00316347 0.00590836 0.127001 +EDGE3 643 692 2.499 -10.9005 -5.24788 0.00432512 -0.000286113 -0.126666 +EDGE3 644 694 3.22579 -0.00880867 -5.38481 -0.00130432 -0.00266242 -0.00133765 +EDGE3 643 694 2.62053 10.9561 -5.47244 0.00281816 0.001772 0.119255 +EDGE3 644 693 2.47373 -10.9627 -5.26468 -0.00180328 0.00326535 -0.124231 +EDGE3 645 695 3.23494 0.00688347 -5.37916 -0.00469572 -0.00273881 -0.00461903 +EDGE3 644 695 2.61432 10.9315 -5.49249 -0.0110731 -0.00130522 0.126446 +EDGE3 646 696 3.22914 0.0100797 -5.39878 0.000170213 0.00472957 -0.00535417 +EDGE3 645 694 2.48342 -10.9275 -5.2676 5.83251e-05 0.00331757 -0.12203 +EDGE3 646 695 2.48391 -10.9527 -5.28231 0.00468282 -0.00517073 -0.1241 +EDGE3 645 696 2.60821 10.9577 -5.50515 -0.00263536 0.00726316 0.12698 +EDGE3 646 697 2.58834 10.9387 -5.49986 -0.00527447 -0.00835079 0.121213 +EDGE3 647 697 3.21551 0.00775847 -5.41701 -0.00176185 0.00205458 0.00142436 +EDGE3 648 698 3.21432 0.00830836 -5.41499 -0.000997305 -0.011419 0.00393356 +EDGE3 647 696 2.48218 -10.9569 -5.29196 -0.00898503 -0.00113199 -0.121513 +EDGE3 648 697 2.43355 -10.9526 -5.30605 0.00222677 0.000673788 -0.128862 +EDGE3 647 698 2.56625 10.9707 -5.49704 0.00645049 0.0029057 0.123801 +EDGE3 648 699 2.58623 10.9569 -5.49772 0.00669391 -0.00109197 0.126131 +EDGE3 649 699 3.22393 0.00661831 -5.40973 0.000404662 0.0057752 -0.00577708 +EDGE3 650 700 3.20569 -0.00429299 -5.40735 0.00192764 0.00672831 0.00500631 +EDGE3 649 698 2.45331 -10.966 -5.28328 0.000354159 0.000714208 -0.124237 +EDGE3 650 699 2.44366 -10.9662 -5.30493 0.00123325 -0.0027734 -0.120474 +EDGE3 649 700 2.58997 10.9794 -5.51129 0.00149298 -0.00284768 0.121625 +EDGE3 650 701 2.57033 10.9944 -5.51443 -0.00379019 0.00668801 0.124518 +EDGE3 651 701 3.19299 -0.0157759 -5.41984 0.0047022 -0.00391507 0.00285424 +EDGE3 652 702 3.20825 -0.00213636 -5.41133 0.00486422 0.00369486 -0.004589 +EDGE3 651 700 2.45165 -11.0043 -5.30874 -0.00632889 0.00122756 -0.124623 +EDGE3 652 701 2.43013 -10.9923 -5.29238 -0.00263025 -0.00023298 -0.129635 +EDGE3 651 702 2.56534 11.002 -5.52501 0.00602545 0.00464385 0.12164 +EDGE3 653 703 3.17071 -0.00587069 -5.40347 -0.00576471 -0.00162808 0.00583512 +EDGE3 652 703 2.55481 11.0145 -5.51907 -0.0079271 -0.00841403 0.114999 +EDGE3 654 704 3.15929 -0.00802741 -5.42712 0.00525602 0.00188731 -0.00166246 +EDGE3 653 702 2.40496 -10.9964 -5.30409 0.00237658 -0.00137453 -0.126564 +EDGE3 654 703 2.38819 -11.0071 -5.32149 0.00716492 -0.00462283 -0.131624 +EDGE3 653 704 2.53863 11.0326 -5.5474 0.00284284 -0.00134417 0.119812 +EDGE3 654 705 2.52882 11.0318 -5.53571 0.00729459 -0.00313775 0.125164 +EDGE3 655 705 3.15273 -0.0146992 -5.42856 -0.00506061 -0.0043957 0.00427792 +EDGE3 656 706 3.16084 0.00389713 -5.44698 -0.00277608 0.0117911 -0.00434843 +EDGE3 655 704 2.41088 -11.0233 -5.31734 0.000208596 -0.00982155 -0.120927 +EDGE3 656 705 2.39445 -11.017 -5.33207 -0.00204425 0.00223939 -0.129471 +EDGE3 655 706 2.5368 11.0449 -5.5499 -0.00558078 0.00972029 0.126253 +EDGE3 656 707 2.51668 11.044 -5.5461 -0.0091897 9.43268e-05 0.127397 +EDGE3 657 707 3.13821 0.00816313 -5.439 0.00610598 0.0016529 0.00678744 +EDGE3 657 706 2.38678 -11.0376 -5.32847 0.00583567 -0.00549897 -0.127423 +EDGE3 658 708 3.14578 0.00148285 -5.42755 -0.00184347 0.00556698 -0.00841119 +EDGE3 658 707 2.37954 -11.0358 -5.34942 -0.0025599 -0.00323134 -0.121728 +EDGE3 657 708 2.51423 11.0573 -5.53897 -0.00129688 0.00596307 0.117204 +EDGE3 659 709 3.14312 -0.00955484 -5.44521 -0.00295373 0.00227585 -0.00452448 +EDGE3 658 709 2.51381 11.0489 -5.54759 0.00754172 -0.00633197 0.11942 +EDGE3 659 708 2.38161 -11.0324 -5.3237 0.000315381 0.00464773 -0.120147 +EDGE3 659 710 2.50843 11.0658 -5.55747 0.00494454 0.00971684 0.125934 +EDGE3 660 710 3.11583 0.0144155 -5.4425 0.001029 -0.00395667 -0.00495863 +EDGE3 661 711 3.12809 -0.0103671 -5.4447 0.00141253 -0.00289323 0.00553146 +EDGE3 660 709 2.39044 -11.0562 -5.33431 -0.005222 0.00748247 -0.122049 +EDGE3 661 710 2.38111 -11.0449 -5.3614 0.00177127 -0.00848762 -0.127398 +EDGE3 660 711 2.49839 11.0547 -5.55562 0.00453506 0.00858348 0.121176 +EDGE3 662 712 3.11083 0.00658058 -5.46349 -0.00891125 -0.000299279 -0.00703956 +EDGE3 661 712 2.49504 11.0741 -5.58131 0.00377718 -0.00471976 0.126865 +EDGE3 662 711 2.35615 -11.0921 -5.35217 -0.00217872 -0.00928728 -0.116502 +EDGE3 662 713 2.49147 11.0772 -5.57359 -0.000511252 -0.00181774 0.126867 +EDGE3 663 713 3.08862 0.010631 -5.4421 -0.00597536 0.00355305 -0.00680103 +EDGE3 664 714 3.10514 -0.0075908 -5.46575 -0.000280252 0.00490649 -0.0134259 +EDGE3 663 712 2.34767 -11.0576 -5.35955 -0.004612 -0.00658689 -0.13266 +EDGE3 664 713 2.34626 -11.0743 -5.33912 0.00380304 -0.00586309 -0.133888 +EDGE3 663 714 2.47419 11.079 -5.58272 -0.00773182 -0.00750751 0.125645 +EDGE3 664 715 2.46856 11.0913 -5.57066 -0.00192344 0.00105709 0.129348 +EDGE3 665 715 3.09398 0.00488262 -5.48468 0.00401377 0.00325879 0.00516225 +EDGE3 666 716 3.07798 0.00438289 -5.47519 0.0090196 0.00272414 -0.00303572 +EDGE3 665 714 2.34135 -11.0794 -5.34404 -0.000982328 -0.00743289 -0.129982 +EDGE3 666 715 2.3268 -11.1009 -5.36314 0.00636603 0.00357994 -0.133066 +EDGE3 665 716 2.4543 11.0844 -5.56877 0.00358031 -0.00340148 0.11997 +EDGE3 667 717 3.07592 -0.00254398 -5.47109 0.00467366 -0.00660649 0.000322891 +EDGE3 666 717 2.44914 11.1054 -5.58426 -0.0026971 -0.00546378 0.13086 +EDGE3 668 718 3.08916 0.00706369 -5.47864 -0.00562518 -0.00912327 0.00422307 +EDGE3 667 716 2.3258 -11.1002 -5.38653 -0.0102063 -0.00117528 -0.130672 +EDGE3 668 717 2.29885 -11.1077 -5.35546 -0.0106815 0.00309349 -0.129889 +EDGE3 667 718 2.42405 11.1047 -5.58576 0.00457738 -0.00313889 0.126132 +EDGE3 668 719 2.4302 11.1215 -5.59696 -0.00128603 -0.00622139 0.129004 +EDGE3 669 719 3.07379 0.0237102 -5.4745 0.000591618 0.00386754 -0.00115179 +EDGE3 670 720 3.05795 0.0117416 -5.48082 0.00408836 0.0036976 0.00360537 +EDGE3 669 718 2.31253 -11.1136 -5.3578 -0.0131862 -0.00990467 -0.119853 +EDGE3 670 719 2.31148 -11.1141 -5.40229 -0.00561444 0.00154231 -0.132376 +EDGE3 669 720 2.4403 11.1273 -5.57916 0.00576095 0.000239963 0.135489 +EDGE3 670 721 2.43141 11.1269 -5.58453 0.0156876 -0.0037319 0.124935 +EDGE3 671 721 3.06038 -0.0035533 -5.49059 0.00111122 0.00538531 0.00471228 +EDGE3 671 720 2.28635 -11.1227 -5.36052 0.00214029 -0.00156001 -0.137636 +EDGE3 672 722 3.05844 -0.00216468 -5.50266 0.000577424 -0.00616314 -0.00069187 +EDGE3 671 722 2.41468 11.1268 -5.62655 0.00597954 0.0105475 0.125748 +EDGE3 672 721 2.28988 -11.1448 -5.3873 0.00324249 0.0137619 -0.122546 +EDGE3 673 723 3.0359 0.00602202 -5.50746 0.00399703 -0.00247079 0.002523 +EDGE3 672 723 2.39423 11.1717 -5.63687 -0.00135727 0.00129664 0.126193 +EDGE3 673 722 2.28743 -11.155 -5.37664 -0.00533869 0.00217378 -0.133718 +EDGE3 674 724 3.02532 0.0132361 -5.50522 -0.00213546 -0.00519174 -0.00224275 +EDGE3 673 724 2.40157 11.1544 -5.62834 0.00802757 -0.00217302 0.117051 +EDGE3 674 723 2.29482 -11.1553 -5.40531 0.00160019 0.0114978 -0.11736 +EDGE3 675 725 3.02078 -0.00792746 -5.52225 -0.00346226 -0.00265901 0.00521949 +EDGE3 674 725 2.37833 11.1603 -5.60666 5.18617e-05 -0.0037949 0.12918 +EDGE3 675 724 2.2688 -11.1563 -5.40342 -0.00591174 0.000364811 -0.121622 +EDGE3 676 726 2.994 0.00824623 -5.50171 -0.00231833 -0.000457719 -0.00394966 +EDGE3 675 726 2.36881 11.1733 -5.62831 -0.0091388 0.00279924 0.130107 +EDGE3 676 725 2.24792 -11.1676 -5.38335 0.00134399 -0.00234803 -0.132375 +EDGE3 677 727 3.01569 0.00253266 -5.54076 0.0102567 -0.0010397 0.00266533 +EDGE3 676 727 2.38688 11.1692 -5.63993 0.00868037 -0.00483925 0.125338 +EDGE3 677 726 2.2568 -11.1786 -5.40194 -0.00297512 0.00615843 -0.119175 +EDGE3 678 728 3.00446 -0.00765036 -5.50831 0.00122777 -0.00557978 -0.00217663 +EDGE3 677 728 2.35998 11.2054 -5.64368 -0.001711 0.00442207 0.126051 +EDGE3 678 727 2.26917 -11.1622 -5.40576 -0.00852762 -0.00716694 -0.125686 +EDGE3 679 729 2.9875 -0.0049591 -5.51862 -0.00205546 -0.00770817 -0.00172245 +EDGE3 678 729 2.37287 11.2037 -5.6128 0.000170173 0.00651936 0.117198 +EDGE3 679 728 2.22451 -11.1748 -5.4036 -0.00384138 -0.000196333 -0.122723 +EDGE3 680 730 3.00293 0.00763425 -5.52026 0.00438006 0.00126942 0.000888038 +EDGE3 679 730 2.35394 11.1942 -5.62644 0.00276113 -0.00569452 0.127404 +EDGE3 680 729 2.23338 -11.1943 -5.42943 0.00356039 -0.00334336 -0.120332 +EDGE3 681 731 2.98843 -0.00235014 -5.54082 -0.0027869 -0.00125951 -0.00437472 +EDGE3 680 731 2.33204 11.2073 -5.63171 0.00158909 0.00498643 0.128738 +EDGE3 681 730 2.22103 -11.1907 -5.42574 0.00106119 0.00828243 -0.123615 +EDGE3 682 732 2.9776 0.00165386 -5.53456 0.00309813 0.00786635 -0.00888145 +EDGE3 681 732 2.32308 11.2238 -5.62656 0.00410007 -0.00545216 0.116981 +EDGE3 682 731 2.24785 -11.2136 -5.43082 0.00165819 0.00210324 -0.129606 +EDGE3 683 733 2.98965 0.0200035 -5.54347 0.00512376 0.00474693 0.0013732 +EDGE3 682 733 2.35322 11.2347 -5.65424 0.00128888 0.00491638 0.120813 +EDGE3 683 732 2.21359 -11.2149 -5.43719 0.00120678 0.0025902 -0.131407 +EDGE3 684 734 2.96963 0.00699067 -5.5479 -0.00173777 0.00568274 0.00286206 +EDGE3 683 734 2.32686 11.2336 -5.65636 -0.00956511 0.0037211 0.121875 +EDGE3 684 733 2.20817 -11.213 -5.39511 0.007339 -0.000193578 -0.119257 +EDGE3 685 735 2.95321 0.00421967 -5.54895 -0.00416884 0.0028691 -0.0022224 +EDGE3 684 735 2.31319 11.2564 -5.65269 0.00491452 0.00111927 0.126419 +EDGE3 685 734 2.19056 -11.248 -5.42678 -0.00102958 -0.00470655 -0.122253 +EDGE3 686 736 2.96482 -0.00659202 -5.57297 -0.00507627 0.00831641 -0.00171944 +EDGE3 685 736 2.29667 11.2584 -5.66916 -0.00635889 -0.0014494 0.11794 +EDGE3 686 735 2.18993 -11.2132 -5.43913 0.00326963 -0.000525273 -0.131249 +EDGE3 687 737 2.93276 -0.00532779 -5.54371 0.00483125 0.00366904 0.00232911 +EDGE3 686 737 2.27675 11.2622 -5.6589 0.00100898 -1.75989e-05 0.131458 +EDGE3 687 736 2.19805 -11.2443 -5.44417 -0.00103232 -0.00325488 -0.116316 +EDGE3 688 738 2.95257 0.0128689 -5.55923 -0.00797728 0.0063751 -0.00183378 +EDGE3 687 738 2.29753 11.276 -5.65956 -0.00515751 -0.00301004 0.120118 +EDGE3 688 737 2.18103 -11.2475 -5.43451 0.00691902 0.00274696 -0.129386 +EDGE3 689 739 2.92845 0.00265626 -5.56091 -0.00261743 0.0041004 0.00909401 +EDGE3 688 739 2.27504 11.2733 -5.65863 0.00244345 -0.000418402 0.125925 +EDGE3 689 738 2.17784 -11.2665 -5.43881 0.00643306 -0.00495825 -0.124137 +EDGE3 690 740 2.94249 -0.0142831 -5.56405 -0.00023124 0.00150793 -0.00257882 +EDGE3 689 740 2.25914 11.2726 -5.66925 3.32978e-05 -0.000875355 0.127827 +EDGE3 690 739 2.16646 -11.2592 -5.44626 -0.0089866 -0.00098245 -0.118203 +EDGE3 691 741 2.91114 -0.0180938 -5.55357 -0.00424722 -0.00257671 0.00860215 +EDGE3 690 741 2.26746 11.2763 -5.67132 -0.014013 0.00104214 0.118603 +EDGE3 691 740 2.1567 -11.2836 -5.45196 0.00626197 0.00193463 -0.131205 +EDGE3 692 742 2.90879 -0.0105658 -5.5675 -0.00421916 -0.00172595 0.00610005 +EDGE3 691 742 2.26378 11.2825 -5.69722 0.000210173 0.00304373 0.125295 +EDGE3 692 741 2.12923 -11.2671 -5.4593 -0.00755896 0.00373156 -0.124462 +EDGE3 693 743 2.90422 -0.00231427 -5.575 0.00218117 0.00104663 -0.00136966 +EDGE3 692 743 2.25324 11.2777 -5.65914 0.0028874 0.0131369 0.128127 +EDGE3 693 742 2.13268 -11.2833 -5.43387 0.00598244 -0.000317965 -0.12179 +EDGE3 694 744 2.87574 -0.0115949 -5.582 -0.00170586 -0.00311926 -0.005256 +EDGE3 693 744 2.24289 11.2856 -5.68171 0.00731741 -0.00063642 0.124988 +EDGE3 694 743 2.11848 -11.2895 -5.43337 0.000315774 -0.00822463 -0.121107 +EDGE3 695 745 2.90452 -0.0224957 -5.57004 6.54399e-05 -0.00340535 0.00434976 +EDGE3 694 745 2.22265 11.311 -5.69151 -0.00253968 -0.0044063 0.121727 +EDGE3 695 744 2.10876 -11.3105 -5.45575 0.00088396 0.00399071 -0.128631 +EDGE3 696 746 2.86505 -0.00916533 -5.5735 -0.00032092 -0.00116057 0.00122672 +EDGE3 695 746 2.21958 11.321 -5.68753 0.00247744 -0.0107087 0.127023 +EDGE3 696 745 2.10751 -11.3106 -5.47337 0.000490654 -0.00491303 -0.132888 +EDGE3 697 747 2.87425 0.00492534 -5.59872 -0.00248637 -0.00389203 -0.0039998 +EDGE3 696 747 2.21228 11.3194 -5.69489 0.00054545 0.00591152 0.124856 +EDGE3 697 746 2.10794 -11.3167 -5.46507 -0.00283587 -0.00697077 -0.125717 +EDGE3 698 748 2.86565 8.08475e-05 -5.59093 -0.00187278 -0.00491143 0.00103075 +EDGE3 697 748 2.20104 11.3178 -5.70462 -0.00416272 0.00138265 0.123878 +EDGE3 698 747 2.10937 -11.3234 -5.49155 -0.0109064 0.00490727 -0.127763 +EDGE3 699 749 2.87229 -0.00351402 -5.60296 -2.0995e-05 0.00477961 -0.00503376 +EDGE3 698 749 2.18228 11.3197 -5.71393 -0.000283003 8.44992e-05 0.11797 +EDGE3 699 748 2.10169 -11.3229 -5.46985 -0.00619267 -0.0111943 -0.131747 +EDGE3 700 750 2.85275 -0.00384588 -5.60746 0.00719871 -0.00607033 -0.0110539 +EDGE3 699 750 2.19314 11.3597 -5.72041 0.00388018 0.00346099 0.120614 +EDGE3 700 749 2.08565 -11.3317 -5.46393 0.0006382 -0.00263004 -0.125999 +EDGE3 701 751 2.84365 0.00273466 -5.60367 -0.0037816 -0.00171522 0.00987049 +EDGE3 700 751 2.2044 11.3496 -5.71008 0.00391959 0.00687841 0.126338 +EDGE3 701 750 2.0673 -11.3353 -5.49287 0.000963603 -0.000349693 -0.129806 +EDGE3 702 752 2.82946 0.0198147 -5.59751 -0.00939747 0.00282579 0.000976887 +EDGE3 701 752 2.17925 11.3527 -5.71894 0.00478148 -0.00489951 0.122937 +EDGE3 702 751 2.08393 -11.3371 -5.48959 -3.94029e-05 3.52847e-05 -0.132811 +EDGE3 703 753 2.84511 -0.0137373 -5.61442 0.00446996 0.00237982 -0.00348336 +EDGE3 702 753 2.16326 11.3719 -5.70593 0.0041021 -0.000435272 0.121096 +EDGE3 703 752 2.04356 -11.3509 -5.48643 0.00174764 0.00341677 -0.129154 +EDGE3 704 754 2.81449 -0.0054251 -5.61251 -0.00410529 0.00666579 0.00321477 +EDGE3 703 754 2.17976 11.3506 -5.7232 -0.00689582 0.00650081 0.123331 +EDGE3 704 753 2.06415 -11.3579 -5.48859 0.00489778 -0.00523539 -0.125073 +EDGE3 705 755 2.81622 -0.00705598 -5.6232 -0.00151222 0.00144958 0.00137241 +EDGE3 704 755 2.16485 11.3682 -5.70808 -0.00158727 -0.00439418 0.125563 +EDGE3 705 754 2.03742 -11.3663 -5.48931 -0.00442153 -0.00596838 -0.13015 +EDGE3 706 756 2.8034 0.01105 -5.62965 0.0023295 -0.00258073 -0.00102984 +EDGE3 705 756 2.1469 11.3823 -5.72028 -0.00486448 -0.00441162 0.127917 +EDGE3 706 755 2.03634 -11.4015 -5.50421 -0.0106169 -0.0120838 -0.121422 +EDGE3 707 757 2.80274 -0.00296326 -5.62609 -0.00297874 0.00128047 0.00184436 +EDGE3 706 757 2.1482 11.3842 -5.72574 -0.00345893 -0.003669 0.125474 +EDGE3 707 756 2.04378 -11.389 -5.52804 0.00103698 -0.00289384 -0.118273 +EDGE3 708 758 2.76882 -0.00111354 -5.6291 -0.00572772 0.00387281 0.00218804 +EDGE3 707 758 2.13146 11.4014 -5.74856 -0.00461305 0.00451214 0.134671 +EDGE3 708 757 2.01599 -11.3867 -5.50267 0.00280224 0.0023058 -0.116994 +EDGE3 709 759 2.80165 0.00400825 -5.62643 0.0060565 -0.000339151 -0.0014062 +EDGE3 708 759 2.12782 11.4055 -5.73449 -0.003148 0.00753463 0.11764 +EDGE3 709 758 2.03011 -11.3933 -5.51832 0.00265261 -0.00589279 -0.140204 +EDGE3 710 760 2.78892 -0.0235017 -5.61263 0.0063813 0.00762754 -0.00849109 +EDGE3 709 760 2.11512 11.4227 -5.75436 -0.00534348 -0.00607981 0.127956 +EDGE3 710 759 2.01813 -11.4086 -5.51061 0.00990668 -0.0042833 -0.123877 +EDGE3 711 761 2.77228 -0.0116383 -5.64291 -0.00446313 -0.00205222 0.00173194 +EDGE3 710 761 2.11802 11.4088 -5.74149 -0.00582033 -0.00121501 0.119393 +EDGE3 711 760 2.00709 -11.4002 -5.50917 0.00403486 0.00190605 -0.124833 +EDGE3 712 762 2.76989 -0.00377797 -5.63554 0.00566134 0.00540246 -0.00196133 +EDGE3 711 762 2.11267 11.4072 -5.75133 -0.00418655 -0.00499411 0.11713 +EDGE3 712 761 1.97588 -11.4056 -5.52034 -0.00111519 -0.00542833 -0.122155 +EDGE3 713 763 2.76527 -0.00479498 -5.66084 -0.00356252 -4.77328e-05 0.00278872 +EDGE3 712 763 2.09328 11.4207 -5.77525 0.007542 0.00205616 0.117251 +EDGE3 713 762 1.99216 -11.4227 -5.54014 -0.00600098 -0.0128276 -0.12655 +EDGE3 714 764 2.74373 0.0019611 -5.63803 0.00206666 0.00504587 0.00267917 +EDGE3 713 764 2.10218 11.4239 -5.76242 0.00418478 0.00151255 0.11858 +EDGE3 714 763 1.97548 -11.4251 -5.51834 -0.00025938 0.00093812 -0.123283 +EDGE3 715 765 2.7509 -0.00281 -5.63559 -0.00242977 -0.00338711 -0.00441875 +EDGE3 714 765 2.09333 11.4354 -5.75497 -0.00714783 0.00314786 0.129926 +EDGE3 715 764 1.97861 -11.4388 -5.52793 0.00218536 -0.00281737 -0.129652 +EDGE3 716 766 2.72761 -0.0124774 -5.65805 -0.00475766 0.00228341 0.00304106 +EDGE3 715 766 2.07668 11.4625 -5.77122 0.00681256 -0.00132129 0.132441 +EDGE3 716 765 1.97262 -11.4404 -5.51673 -0.00561529 0.00270999 -0.132025 +EDGE3 717 767 2.72915 0.026128 -5.664 0.00310353 0.00141434 -0.000343185 +EDGE3 716 767 2.06037 11.4625 -5.76735 0.00100364 0.00350328 0.120891 +EDGE3 717 766 1.95338 -11.4658 -5.53602 0.00748284 0.00673228 -0.123935 +EDGE3 718 768 2.71881 -0.0211844 -5.67176 -0.00123089 -0.00442538 -0.00365814 +EDGE3 717 768 2.04365 11.4539 -5.77352 0.00198783 -0.00100989 0.124324 +EDGE3 718 767 1.93871 -11.4501 -5.55198 -0.00252834 0.000636146 -0.124059 +EDGE3 719 769 2.72018 -0.00921075 -5.67929 0.000967367 0.00378405 0.00157509 +EDGE3 718 769 2.0489 11.4789 -5.77199 -0.000258614 -0.00239432 0.12991 +EDGE3 719 768 1.95345 -11.46 -5.54621 0.000114627 0.00146812 -0.125769 +EDGE3 720 770 2.7045 -0.00145254 -5.67081 0.0095351 -0.00404065 -0.00467624 +EDGE3 719 770 2.03698 11.48 -5.77775 -0.00689224 -0.00136032 0.132838 +EDGE3 720 769 1.93315 -11.4465 -5.5455 -4.4509e-05 -0.000970695 -0.119755 +EDGE3 721 771 2.7228 0.000695874 -5.65866 -0.00214024 0.0055149 -0.00631783 +EDGE3 720 771 2.03111 11.4642 -5.78881 0.000546242 0.00648078 0.124383 +EDGE3 721 770 1.92848 -11.467 -5.55857 -0.00426814 0.00585794 -0.128188 +EDGE3 722 772 2.68051 0.000939971 -5.66726 0.00606725 0.00625356 -0.00301353 +EDGE3 721 772 2.03941 11.4754 -5.79796 -0.00669062 -0.00212535 0.123437 +EDGE3 722 771 1.92999 -11.4787 -5.56095 0.00511097 -0.00205956 -0.118413 +EDGE3 723 773 2.69724 0.00168702 -5.68681 0.00429671 0.0057651 -0.00547096 +EDGE3 722 773 2.01728 11.4724 -5.80305 0.00137948 -0.00253772 0.117738 +EDGE3 723 772 1.91755 -11.5004 -5.56645 -0.00149826 -0.00234864 -0.116526 +EDGE3 724 774 2.68359 -0.0164968 -5.68219 -0.00568802 0.00026885 0.00406809 +EDGE3 723 774 2.01868 11.486 -5.77823 -0.0111716 -0.00206641 0.125421 +EDGE3 725 775 2.68445 -0.00314103 -5.68342 0.00105683 -0.00516397 0.00461788 +EDGE3 724 773 1.90758 -11.5063 -5.5536 0.0021998 -0.0015994 -0.119809 +EDGE3 725 774 1.88604 -11.5077 -5.56678 0.00486602 0.00436772 -0.118757 +EDGE3 724 775 2.0145 11.5045 -5.79197 -0.00636481 0.00333455 0.126655 +EDGE3 725 776 2.00046 11.5155 -5.79281 -0.00276776 0.00526781 0.125126 +EDGE3 726 776 2.67248 -0.0113522 -5.6799 -0.0027347 0.00775743 0.00535381 +EDGE3 727 777 2.66338 0.00271755 -5.66664 0.00262552 0.00121644 0.00285352 +EDGE3 726 775 1.89146 -11.4995 -5.58232 -0.000503255 0.00535226 -0.13189 +EDGE3 727 776 1.88597 -11.5066 -5.56761 0.00739138 -0.00429675 -0.123765 +EDGE3 726 777 1.99101 11.5268 -5.80066 0.00356539 0.00142404 0.120931 +EDGE3 727 778 1.99038 11.539 -5.81819 -0.00371 -0.0047736 0.124123 +EDGE3 728 778 2.65402 0.0173175 -5.68548 0.000362213 -0.00253853 -0.00306661 +EDGE3 728 777 1.86905 -11.5231 -5.5755 -0.000522001 -0.00307991 -0.118588 +EDGE3 729 779 2.64931 0.0106759 -5.69156 0.00119036 -0.00323312 -0.00257743 +EDGE3 729 778 1.87666 -11.5316 -5.58209 -0.000999236 -0.00354125 -0.123423 +EDGE3 728 779 1.99872 11.551 -5.81239 -0.00652777 0.00245745 0.121878 +EDGE3 730 780 2.62605 -0.00257988 -5.69938 -0.00924701 -0.00818741 -0.00183031 +EDGE3 729 780 1.96924 11.5497 -5.82751 -0.00350915 -0.00305181 0.131119 +EDGE3 730 779 1.87221 -11.5141 -5.5831 -0.00293569 -0.00187604 -0.122577 +EDGE3 731 781 2.63344 -0.0145517 -5.70934 0.000722254 -0.00522924 -0.00460473 +EDGE3 730 781 1.96787 11.5449 -5.82076 -0.00304083 0.00407595 0.13284 +EDGE3 731 780 1.83632 -11.548 -5.58229 0.0039264 -8.16437e-05 -0.127068 +EDGE3 731 782 1.96463 11.5506 -5.83325 -0.00452691 -0.00466957 0.125905 +EDGE3 732 782 2.61985 -0.0124523 -5.69786 -0.00180619 0.00923827 0.00349675 +EDGE3 733 783 2.62485 0.0070233 -5.70063 0.00508283 -0.00206436 -0.00818665 +EDGE3 732 781 1.85226 -11.5258 -5.58773 -0.00186037 0.00242378 -0.115973 +EDGE3 733 782 1.85451 -11.5486 -5.60359 0.00774103 -0.00393741 -0.125985 +EDGE3 732 783 1.92419 11.5484 -5.82315 0.00157489 -0.00645487 0.123332 +EDGE3 734 784 2.60765 0.000596309 -5.70878 0.0068294 -0.00529719 -0.000291515 +EDGE3 733 784 1.95179 11.5549 -5.82799 0.00705561 0.00581374 0.130116 +EDGE3 734 783 1.8409 -11.5506 -5.5937 0.00461831 0.00237386 -0.119618 +EDGE3 734 785 1.9431 11.5612 -5.82746 0.00486872 -0.00654993 0.124986 +EDGE3 735 785 2.6053 -0.00536876 -5.72914 0.00661358 0.0067684 -0.00134062 +EDGE3 736 786 2.59212 -0.000516151 -5.71996 -0.00782652 0.00285417 0.00633123 +EDGE3 735 784 1.82293 -11.5657 -5.59463 0.00131161 -0.00496211 -0.121715 +EDGE3 735 786 1.90386 11.5849 -5.84312 0.0031598 -0.000381679 0.125007 +EDGE3 736 785 1.81328 -11.5628 -5.59317 0.00138586 -0.00581601 -0.124434 +EDGE3 736 787 1.90479 11.5771 -5.86588 -0.00366903 0.00385023 0.126084 +EDGE3 737 787 2.58232 -0.0256925 -5.71286 0.0116319 0.000707341 0.000812141 +EDGE3 738 788 2.56203 0.0134205 -5.73991 -0.00911915 -0.00361785 0.00133391 +EDGE3 737 786 1.82882 -11.5707 -5.63008 0.00162746 0.00461138 -0.122502 +EDGE3 738 787 1.80238 -11.5697 -5.63718 0.00514571 -0.00532388 -0.130035 +EDGE3 737 788 1.89681 11.5794 -5.85569 -0.00893866 -0.00572029 0.126288 +EDGE3 738 789 1.89962 11.5824 -5.84818 -0.00563718 0.00534526 0.126007 +EDGE3 739 789 2.5643 0.0165219 -5.75012 -0.00264367 0.00496268 -0.00118027 +EDGE3 740 790 2.56869 -0.0103541 -5.74119 0.0051391 0.000385615 -0.00490763 +EDGE3 739 788 1.78738 -11.578 -5.62594 -0.000393354 0.000408293 -0.12307 +EDGE3 740 789 1.79813 -11.589 -5.61904 0.00193426 0.00530097 -0.131742 +EDGE3 739 790 1.87956 11.6012 -5.84919 -0.00290183 0.0118061 0.119435 +EDGE3 740 791 1.88945 11.6007 -5.83403 0.00142107 -0.00282246 0.118036 +EDGE3 741 791 2.56138 0.00547732 -5.73379 0.0130413 0.00482474 -0.00114944 +EDGE3 742 792 2.55107 -0.000904931 -5.7373 -0.0015475 0.00489067 0.0134115 +EDGE3 741 790 1.78306 -11.5859 -5.63754 -0.000276105 0.00308992 -0.134497 +EDGE3 742 791 1.78512 -11.5921 -5.63091 -0.00556308 0.00556985 -0.125023 +EDGE3 741 792 1.89241 11.6256 -5.84628 -0.000329146 -0.000822643 0.122313 +EDGE3 743 793 2.52561 -0.00279006 -5.7416 -0.00523876 -0.00189339 -0.00410228 +EDGE3 742 793 1.85579 11.6199 -5.8604 -0.00291 -0.00504965 0.11525 +EDGE3 743 792 1.7501 -11.6108 -5.61658 -0.000975666 -0.00520135 -0.13059 +EDGE3 744 794 2.5163 -0.00704287 -5.74526 0.000380781 -0.000539547 -0.00560682 +EDGE3 743 794 1.86351 11.6229 -5.88632 -0.00963708 -0.00347372 0.125889 +EDGE3 745 795 2.53468 -0.0104163 -5.75097 -0.00989428 0.00282234 0.000720028 +EDGE3 744 793 1.77172 -11.6016 -5.62802 0.00970272 0.000289515 -0.125223 +EDGE3 745 794 1.75212 -11.6228 -5.63451 -0.000722702 -0.00599737 -0.1297 +EDGE3 744 795 1.86527 11.6144 -5.86555 -0.00684233 0.00338161 0.130549 +EDGE3 746 796 2.51136 0.00870336 -5.72249 0.00739381 -0.000693711 -0.00545614 +EDGE3 745 796 1.86854 11.6194 -5.87342 -0.0043212 0.00671362 0.119635 +EDGE3 746 795 1.74925 -11.6035 -5.64224 0.00351454 -0.00489505 -0.121463 +EDGE3 746 797 1.84768 11.6259 -5.8704 0.000845793 -0.00500953 0.130844 +EDGE3 747 797 2.52806 0.00744564 -5.74602 0.00293126 0.0048215 -0.000991763 +EDGE3 748 798 2.51387 -0.0178833 -5.7639 0.0086968 -0.00847308 0.0037842 +EDGE3 747 796 1.74211 -11.6261 -5.63932 -0.00455708 0.00399416 -0.122291 +EDGE3 748 797 1.72076 -11.6428 -5.63673 0.000149974 0.00465535 -0.123347 +EDGE3 747 798 1.81654 11.6561 -5.87095 -0.0022793 -0.00193789 0.11506 +EDGE3 748 799 1.81953 11.6429 -5.87301 0.00131083 0.00534328 0.132611 +EDGE3 749 799 2.4802 -0.0061336 -5.74931 -0.00607472 0.00205175 -0.0028734 +EDGE3 750 800 2.49862 0.0082638 -5.77072 0.00230316 -0.001735 -0.00240446 +EDGE3 749 798 1.73161 -11.6356 -5.66029 0.00193124 0.00489205 -0.125621 +EDGE3 750 799 1.72727 -11.6519 -5.6468 -0.0054363 0.00474412 -0.134944 +EDGE3 749 800 1.80823 11.6556 -5.87524 0.00183726 0.00870731 0.117615 +EDGE3 751 801 2.49096 -0.00354145 -5.7555 0.000129719 -0.00395419 -0.00171529 +EDGE3 750 801 1.80384 11.664 -5.89005 0.00284636 -0.00042959 0.132132 +EDGE3 751 800 1.69059 -11.6497 -5.64752 -0.00279109 -0.00310102 -0.130229 +EDGE3 751 802 1.79739 11.6507 -5.88074 -0.00390298 0.0050827 0.129565 +EDGE3 752 802 2.4759 -0.00654326 -5.78171 0.00356024 0.00998617 -0.000839141 +EDGE3 753 803 2.4787 0.00300082 -5.76343 -0.000199942 0.00345704 0.00902867 +EDGE3 752 801 1.69091 -11.6627 -5.65369 0.000268323 -0.00125702 -0.123309 +EDGE3 753 802 1.68065 -11.6803 -5.65595 0.000322267 0.00530471 -0.132229 +EDGE3 752 803 1.78358 11.6683 -5.90323 0.00466553 0.00247576 0.117638 +EDGE3 754 804 2.45534 0.00800497 -5.78022 -0.000124856 -0.0057662 0.000244834 +EDGE3 753 804 1.78464 11.6767 -5.88712 -0.00744982 0.00152889 0.125736 +EDGE3 754 803 1.69021 -11.6646 -5.65845 -0.00216919 0.0118496 -0.130025 +EDGE3 754 805 1.77845 11.681 -5.91046 0.00291214 0.00427228 0.113822 +EDGE3 755 805 2.45615 0.00633166 -5.77695 0.000835518 -0.0034207 -0.0110422 +EDGE3 755 804 1.66936 -11.6715 -5.66269 -0.00524181 -0.0127454 -0.116598 +EDGE3 756 806 2.44934 0.00836975 -5.78497 -0.00946834 -0.00244703 0.000916183 +EDGE3 755 806 1.74502 11.7046 -5.86887 -0.00073445 0.0105035 0.127909 +EDGE3 757 807 2.44399 0.000240831 -5.78337 0.00129701 0.00144546 -0.000350348 +EDGE3 756 805 1.65743 -11.6808 -5.6681 -0.00348338 0.00435933 -0.12133 +EDGE3 756 807 1.73896 11.6844 -5.89306 0.00577459 -0.00800321 0.12623 +EDGE3 757 806 1.67804 -11.6882 -5.68882 -0.00221858 -0.00346605 -0.122817 +EDGE3 758 808 2.43747 0.00902785 -5.78921 -0.00211969 -0.00181356 -0.00162664 +EDGE3 757 808 1.72416 11.6766 -5.90429 0.00247557 0.00046096 0.127453 +EDGE3 758 807 1.64935 -11.6856 -5.68296 -0.000876679 0.00296847 -0.123485 +EDGE3 758 809 1.75314 11.7047 -5.9245 0.00617195 -0.00593301 0.131271 +EDGE3 759 809 2.43705 -0.00862636 -5.79463 0.00741967 0.00402201 0.0029681 +EDGE3 760 810 2.41392 -0.00229971 -5.79542 -0.00898301 0.00483592 0.00410863 +EDGE3 759 808 1.64466 -11.7033 -5.6771 -0.000242572 -0.000125987 -0.127185 +EDGE3 760 809 1.63919 -11.6914 -5.67435 0.00367696 -0.00611354 -0.127191 +EDGE3 759 810 1.73948 11.7132 -5.91191 0.00587463 0.00410486 0.128249 +EDGE3 761 811 2.41412 0.00130129 -5.80926 -0.00175173 -0.00168737 -0.00105234 +EDGE3 760 811 1.72891 11.7122 -5.91129 0.010596 -0.00574336 0.129543 +EDGE3 761 810 1.62887 -11.7126 -5.68122 0.000132319 0.0019321 -0.120786 +EDGE3 762 812 2.40971 -0.00524921 -5.7865 0.0017257 -0.000489674 -0.00657978 +EDGE3 762 811 1.60418 -11.7334 -5.6602 -0.00316692 0.00365396 -0.127599 +EDGE3 761 812 1.70537 11.7194 -5.91306 -0.00980028 0.00459687 0.12939 +EDGE3 763 813 2.40534 -0.000829876 -5.81883 -0.00552753 0.00687605 0.00318518 +EDGE3 762 813 1.72375 11.7274 -5.92011 0.00415107 0.00713312 0.123581 +EDGE3 763 812 1.62685 -11.7338 -5.68579 0.0100415 -0.000135465 -0.131719 +EDGE3 764 814 2.39077 -0.00882328 -5.80077 -0.00267523 0.00237168 -0.000538015 +EDGE3 763 814 1.69835 11.7201 -5.90806 -0.000536347 0.00300922 0.131492 +EDGE3 764 813 1.61551 -11.7268 -5.68324 -0.00316522 -0.00459767 -0.121064 +EDGE3 765 815 2.39047 0.00368618 -5.81495 0.00141319 -0.00838279 -0.00422081 +EDGE3 764 815 1.66784 11.7445 -5.93434 0.00973396 0.00131217 0.129051 +EDGE3 765 814 1.60004 -11.7274 -5.70305 0.00819532 -0.000934952 -0.129862 +EDGE3 766 816 2.37961 -0.00977852 -5.82193 0.00534495 0.000499097 -0.00597449 +EDGE3 765 816 1.68203 11.7389 -5.92257 0.00298038 -0.00271931 0.119033 +EDGE3 766 815 1.61467 -11.7484 -5.70977 0.00227915 -0.00463423 -0.118802 +EDGE3 767 817 2.36162 -0.00353685 -5.83035 -0.000299935 -0.00267002 0.0028879 +EDGE3 766 817 1.69408 11.7484 -5.9318 0.000647175 -0.000985892 0.124712 +EDGE3 767 816 1.58542 -11.735 -5.68148 0.00705249 -0.00247316 -0.132705 +EDGE3 768 818 2.35609 0.00125962 -5.8409 -0.00293412 -0.000256459 0.00237719 +EDGE3 767 818 1.67878 11.7574 -5.94074 -0.00372422 -0.00789176 0.124747 +EDGE3 768 817 1.59208 -11.7388 -5.70719 -0.000972723 -0.00367923 -0.130308 +EDGE3 769 819 2.3428 0.00528838 -5.81396 0.0099698 0.00592761 0.000996464 +EDGE3 768 819 1.68 11.7645 -5.94348 -0.00662561 0.0011839 0.126268 +EDGE3 769 818 1.58547 -11.7471 -5.71039 -0.00534031 -0.00447617 -0.126057 +EDGE3 770 820 2.35642 -0.015724 -5.8334 0.00885919 -0.012735 -0.00150751 +EDGE3 769 820 1.65933 11.7727 -5.95206 0.00727048 0.0017146 0.12836 +EDGE3 770 819 1.56807 -11.7544 -5.68886 -0.00999196 -0.000599639 -0.12365 +EDGE3 771 821 2.34045 -0.0164303 -5.83977 0.000875369 -0.000805234 0.00310956 +EDGE3 771 820 1.56471 -11.7611 -5.71581 0.00388497 -0.000524425 -0.132602 +EDGE3 770 821 1.65898 11.7688 -5.95753 0.00661046 0.000930338 0.121726 +EDGE3 772 822 2.34529 -0.0031114 -5.81532 -0.0129285 0.00542533 0.00468173 +EDGE3 771 822 1.65778 11.762 -5.92777 0.000284518 0.00562107 0.121511 +EDGE3 772 821 1.55267 -11.7733 -5.7227 -0.00730147 0.00597215 -0.126667 +EDGE3 773 823 2.33611 -0.0174068 -5.84217 -0.00455835 -0.00120224 -0.0116181 +EDGE3 772 823 1.63827 11.774 -5.93868 0.0065783 0.00556819 0.11788 +EDGE3 773 822 1.52841 -11.7637 -5.72346 0.00459595 -0.00685447 -0.122584 +EDGE3 774 824 2.32233 0.00114909 -5.84496 -0.00315661 -0.00584872 0.00251303 +EDGE3 773 824 1.62231 11.7845 -5.95154 -0.000705455 -0.00483397 0.130967 +EDGE3 774 823 1.53855 -11.7713 -5.72862 -0.00326715 0.0014088 -0.11877 +EDGE3 775 825 2.30443 0.00608216 -5.84506 0.00443486 -0.000368812 0.0102086 +EDGE3 774 825 1.62232 11.8014 -5.95453 0.00165345 0.00571035 0.129232 +EDGE3 775 824 1.53151 -11.7709 -5.72372 -0.000159128 0.00170648 -0.124141 +EDGE3 776 826 2.31421 0.00645773 -5.83775 0.000166188 -0.00496248 0.00134926 +EDGE3 775 826 1.61165 11.7989 -5.97367 -0.0136207 0.000411757 0.125325 +EDGE3 776 825 1.51359 -11.8005 -5.71314 -0.00163848 0.00565938 -0.131531 +EDGE3 777 827 2.30154 0.000584579 -5.83959 -0.00289323 0.00221946 -0.00862519 +EDGE3 776 827 1.6201 11.7957 -5.95637 0.00180954 -0.00803954 0.120434 +EDGE3 777 826 1.51781 -11.7793 -5.75011 -0.000488211 0.00100824 -0.125084 +EDGE3 778 828 2.29718 0.0103525 -5.86644 0.00115626 0.00565683 0.00381352 +EDGE3 777 828 1.58972 11.8049 -5.969 -0.00129422 0.00833191 0.121213 +EDGE3 778 827 1.52038 -11.7845 -5.72544 0.00097092 0.00264396 -0.121752 +EDGE3 779 829 2.29019 -0.00813538 -5.85039 -0.0107214 -0.00483326 -0.00259556 +EDGE3 778 829 1.5853 11.8098 -5.97965 -0.00658705 -0.00642227 0.12378 +EDGE3 779 828 1.50032 -11.8248 -5.73226 -0.00241595 0.0058126 -0.12724 +EDGE3 779 830 1.57913 11.8529 -5.98043 -0.00753491 0.000572819 0.129971 +EDGE3 780 830 2.28012 0.0119239 -5.84863 -0.00452717 -0.000116882 0.00252775 +EDGE3 780 829 1.49996 -11.8243 -5.73722 0.000398777 0.00190652 -0.126359 +EDGE3 781 831 2.27622 -0.00466227 -5.86175 -0.00974654 0.00201948 -0.00640202 +EDGE3 780 831 1.57853 11.8286 -5.96491 -0.0034699 0.00533165 0.125629 +EDGE3 781 830 1.47864 -11.808 -5.72904 0.00706209 0.00675502 -0.124853 +EDGE3 782 832 2.27822 -0.0118531 -5.85955 -0.0103146 0.00027783 -0.0139776 +EDGE3 781 832 1.55894 11.8119 -5.97689 -0.0015111 -0.0023653 0.115973 +EDGE3 782 831 1.48201 -11.8276 -5.72841 -0.00341147 0.00855101 -0.132046 +EDGE3 783 833 2.25905 0.00459392 -5.86525 -0.00635833 0.00193513 0.00948059 +EDGE3 782 833 1.5652 11.8459 -5.9756 -0.00402785 -0.00259595 0.126121 +EDGE3 783 832 1.46858 -11.8351 -5.74806 0.00306129 -0.00605431 -0.132478 +EDGE3 784 834 2.2525 0.00670814 -5.87458 -1.3725e-05 -0.000500015 -0.00455497 +EDGE3 783 834 1.55862 11.8284 -5.97433 -0.00293594 -0.00460503 0.117999 +EDGE3 784 833 1.46485 -11.8627 -5.73479 -0.00056449 0.00604493 -0.130379 +EDGE3 785 835 2.22867 0.0104561 -5.87824 -0.00438847 -0.00161596 0.000382377 +EDGE3 784 835 1.54125 11.8495 -5.98116 0.0028911 -0.000866683 0.128766 +EDGE3 785 834 1.44776 -11.8591 -5.75772 -0.00293175 0.00733414 -0.118731 +EDGE3 786 836 2.20225 -0.0166318 -5.87197 -0.00288248 -0.00372957 0.00235901 +EDGE3 785 836 1.52265 11.859 -5.98208 0.0022426 -0.00102325 0.130689 +EDGE3 786 835 1.44394 -11.8264 -5.74712 0.00711199 -0.0139865 -0.123999 +EDGE3 787 837 2.23627 0.000318812 -5.88383 -0.00158641 -0.00708874 0.00537359 +EDGE3 786 837 1.51416 11.8741 -5.99676 0.0025882 0.00113388 0.128977 +EDGE3 787 836 1.44243 -11.8343 -5.76797 -0.00313238 0.00603102 -0.132128 +EDGE3 788 838 2.20994 -0.00772375 -5.87653 -0.00562642 -0.00389846 -0.00315921 +EDGE3 788 837 1.43915 -11.8627 -5.76639 0.00467388 -0.00535555 -0.133307 +EDGE3 787 838 1.5206 11.85 -6.0023 0.00268599 0.000327385 0.124747 +EDGE3 789 839 2.20668 0.0269647 -5.86293 -0.00455173 0.0011404 -0.00562433 +EDGE3 788 839 1.50534 11.8688 -5.98779 0.00886853 0.00455737 0.124759 +EDGE3 789 838 1.41361 -11.8568 -5.76536 0.00056457 -0.0109216 -0.122226 +EDGE3 790 840 2.20846 0.0263834 -5.89106 -0.00301806 -0.00117535 0.0024286 +EDGE3 789 840 1.5024 11.8716 -6.00305 0.00151108 0.00338537 0.136517 +EDGE3 790 839 1.41067 -11.8801 -5.7667 -3.20962e-06 -0.00602139 -0.11901 +EDGE3 791 841 2.20242 -0.015531 -5.87671 4.21545e-05 -0.00448403 -0.00478215 +EDGE3 790 841 1.49929 11.8726 -5.9947 0.00655279 0.00151526 0.133473 +EDGE3 791 840 1.40448 -11.8805 -5.75656 0.00118258 0.00146309 -0.122024 +EDGE3 792 842 2.18844 -0.0073256 -5.89235 0.00491152 0.00134138 0.000344377 +EDGE3 791 842 1.49454 11.872 -6.0204 -0.00867807 -0.000525844 0.13073 +EDGE3 792 841 1.40798 -11.8802 -5.76872 0.00241327 0.00337141 -0.123819 +EDGE3 793 843 2.19917 -0.00172866 -5.87151 0.00651196 0.00693405 -0.00932789 +EDGE3 792 843 1.47361 11.8856 -6.00021 0.00891963 -0.0017126 0.126203 +EDGE3 793 842 1.39117 -11.8724 -5.78787 -0.00659695 -0.00316663 -0.124642 +EDGE3 794 844 2.17287 0.00469166 -5.89256 -0.00806472 0.000162006 -0.00233831 +EDGE3 793 844 1.47193 11.8888 -6.01435 0.00531479 0.00153998 0.129016 +EDGE3 794 843 1.38228 -11.8924 -5.76654 0.000636554 0.00027774 -0.128424 +EDGE3 795 845 2.14913 0.0140983 -5.90015 0.000483149 -0.00574998 0.00123381 +EDGE3 794 845 1.46553 11.8997 -6.00652 0.00374126 0.000824085 0.127738 +EDGE3 795 844 1.38026 -11.8971 -5.76149 0.00684816 -0.00125273 -0.124882 +EDGE3 796 846 2.16039 -0.0119012 -5.89813 0.00248492 0.00107182 -0.00773043 +EDGE3 795 846 1.44026 11.8981 -6.02666 0.00610419 0.00165284 0.119723 +EDGE3 796 845 1.38256 -11.8971 -5.76901 0.00638999 -0.00479558 -0.121643 +EDGE3 797 847 2.15936 0.0101284 -5.88508 0.00516548 -0.00486083 -0.00177277 +EDGE3 796 847 1.42453 11.9201 -6.01446 -0.00149711 0.00176946 0.127138 +EDGE3 797 846 1.3539 -11.889 -5.77288 0.000471518 -0.00236871 -0.131544 +EDGE3 798 848 2.13683 0.0120661 -5.90911 -0.00309 0.00175106 0.00698358 +EDGE3 797 848 1.43051 11.9158 -6.01548 0.00230236 -0.0049842 0.126844 +EDGE3 798 847 1.33728 -11.916 -5.77396 -0.0030096 0.00324108 -0.127116 +EDGE3 799 849 2.14226 -0.00345139 -5.92105 -0.00298886 0.00425502 0.00713835 +EDGE3 798 849 1.41803 11.9208 -6.0239 0.0035133 -0.00182312 0.13646 +EDGE3 799 848 1.35052 -11.9291 -5.78795 0.00213228 -0.0021464 -0.127067 +EDGE3 800 850 2.12183 0.00835586 -5.90667 0.00203609 0.000633491 -0.00034584 +EDGE3 799 850 1.41943 11.9307 -6.02957 0.00739703 -0.0065112 0.124379 +EDGE3 800 849 1.35091 -11.9332 -5.78827 0.00226706 -0.00129218 -0.132554 +EDGE3 801 851 2.11771 0.00183574 -5.92255 -0.00310879 0.00373037 0.000911997 +EDGE3 800 851 1.41028 11.9312 -6.02498 -0.00256509 0.0017658 0.122763 +EDGE3 801 850 1.3312 -11.9281 -5.78416 0.000849618 0.00269227 -0.135984 +EDGE3 802 852 2.11466 0.00090054 -5.91369 -0.00816507 -0.000486031 0.00764242 +EDGE3 801 852 1.42525 11.9392 -6.03149 -0.0124395 -0.00506436 0.132093 +EDGE3 802 851 1.31879 -11.9297 -5.79954 0.00295144 0.00532936 -0.123534 +EDGE3 803 853 2.11082 0.0184593 -5.91063 -0.00326166 0.00137206 -0.00279012 +EDGE3 802 853 1.39312 11.9517 -6.03645 -0.00656968 -0.000576831 0.124818 +EDGE3 803 852 1.31083 -11.9452 -5.80912 -0.000805925 0.00450235 -0.13459 +EDGE3 804 854 2.1 -0.00369457 -5.92381 -0.00281142 0.000289088 -0.00326611 +EDGE3 803 854 1.38103 11.9353 -6.0273 0.00261358 -0.00870923 0.110411 +EDGE3 804 853 1.30271 -11.9566 -5.80023 0.000513715 -0.00476877 -0.121892 +EDGE3 805 855 2.07198 0.0223091 -5.9212 0.00489448 -0.00206859 0.000881145 +EDGE3 804 855 1.39704 11.9513 -6.04575 -0.00153853 -0.00044917 0.119971 +EDGE3 805 854 1.31011 -11.924 -5.79439 0.00980786 -0.0023212 -0.121993 +EDGE3 806 856 2.09121 -0.0114145 -5.92155 -0.00446858 -0.00138703 -0.004147 +EDGE3 805 856 1.38923 11.9561 -6.04233 0.00451395 0.00117857 0.11787 +EDGE3 806 855 1.31303 -11.9325 -5.81215 0.00868416 0.00423995 -0.122288 +EDGE3 807 857 2.08352 0.0179574 -5.93465 0.000787709 -0.00372004 -0.00592673 +EDGE3 806 857 1.36521 11.9756 -6.03244 -0.00196637 0.00275095 0.120353 +EDGE3 807 856 1.30193 -11.9248 -5.80813 0.00719633 -0.0033603 -0.120421 +EDGE3 808 858 2.06451 -0.0010456 -5.95028 -0.0013471 0.000597734 0.00959404 +EDGE3 807 858 1.35194 11.9572 -6.03827 0.00398403 0.00286554 0.12354 +EDGE3 808 857 1.27168 -11.9569 -5.81141 0.00757422 0.000868616 -0.125726 +EDGE3 809 859 2.03881 0.00478169 -5.9432 -0.00445308 0.00396269 0.00189575 +EDGE3 808 859 1.34127 11.9617 -6.03625 0.00333183 -0.00182063 0.130661 +EDGE3 809 858 1.26963 -11.9563 -5.81285 0.00561401 -0.00654724 -0.123102 +EDGE3 810 860 2.05279 -0.0360266 -5.94892 0.00692252 -0.00730895 -0.00200445 +EDGE3 809 860 1.36653 11.9721 -6.07186 0.00159884 -0.00505428 0.126014 +EDGE3 810 859 1.26909 -11.9822 -5.81107 -0.0113513 0.00691894 -0.127442 +EDGE3 811 861 2.04279 -0.00875178 -5.93205 0.00131231 0.00566204 0.00116875 +EDGE3 810 861 1.33482 11.9823 -6.0613 -0.010452 0.012496 0.112736 +EDGE3 811 860 1.26341 -11.9628 -5.83049 -0.00053054 -0.00323956 -0.124311 +EDGE3 812 862 2.03901 0.00205241 -5.94527 0.0129708 -0.00432974 -0.0049913 +EDGE3 811 862 1.32805 11.9735 -6.05676 -0.00204589 -0.0068969 0.128208 +EDGE3 812 861 1.23236 -11.9828 -5.83235 0.00582818 0.00391764 -0.131285 +EDGE3 812 863 1.31751 11.9647 -6.06081 -0.00150118 0.00202978 0.122796 +EDGE3 813 863 2.01825 -0.0123959 -5.93405 0.00274168 -0.00759239 -0.00330288 +EDGE3 813 862 1.22483 -11.9621 -5.81909 0.00565927 0.00722911 -0.125605 +EDGE3 813 864 1.30125 11.9957 -6.06483 -0.00468812 -0.00440993 0.12787 +EDGE3 814 864 2.01733 0.0175112 -5.9454 0.000379654 -0.00347433 0.00632795 +EDGE3 815 865 2.00621 0.00824656 -5.94439 -0.000416067 -0.00131415 0.00610232 +EDGE3 814 863 1.22946 -11.9797 -5.8318 0.0121469 0.00218449 -0.135827 +EDGE3 814 865 1.30495 12.0033 -6.05073 -0.00494651 -0.000425304 0.122771 +EDGE3 815 864 1.21952 -11.978 -5.82741 -0.00190253 -0.00145659 -0.127208 +EDGE3 816 866 1.99517 -0.00952941 -5.96915 0.000505084 0.00355317 -0.000180049 +EDGE3 815 866 1.28615 12.0055 -6.0727 -0.00486554 -0.00292437 0.129121 +EDGE3 816 865 1.23102 -11.9836 -5.8455 0.00140198 -0.00398878 -0.119996 +EDGE3 816 867 1.30001 12.0156 -6.07725 0.00663726 -0.0125419 0.124771 +EDGE3 817 867 2.00314 -0.0195482 -5.95368 0.00466738 -0.00297114 -0.00223317 +EDGE3 818 868 1.9967 0.00828371 -5.94664 0.00293717 0.00110017 0.000618502 +EDGE3 817 866 1.20405 -12.0015 -5.84681 -0.00342883 -0.00394411 -0.130552 +EDGE3 818 867 1.19803 -11.9969 -5.82647 0.0070656 -0.00843305 -0.128768 +EDGE3 817 868 1.2806 11.9952 -6.07368 -0.00534044 -0.000147634 0.127624 +EDGE3 818 869 1.26123 12.0202 -6.08151 -0.00402094 0.00481498 0.132381 +EDGE3 819 869 1.96988 -0.00204691 -5.94443 0.00362112 0.00578664 -0.0019223 +EDGE3 820 870 1.96576 -0.00742169 -5.96893 -0.00435902 -0.00534314 0.00168526 +EDGE3 819 868 1.18034 -11.9947 -5.83194 -0.00324608 -0.00584593 -0.123678 +EDGE3 819 870 1.24913 12.0179 -6.07748 -0.00588493 -0.00348182 0.13098 +EDGE3 820 869 1.18857 -12.0162 -5.83638 -0.00189752 4.03866e-05 -0.122603 +EDGE3 821 871 1.98569 0.000595772 -5.95102 -0.000451126 0.000456551 -5.67083e-05 +EDGE3 820 871 1.25142 12.0216 -6.08728 -0.00109074 0.00502821 0.127873 +EDGE3 821 870 1.17613 -12.0083 -5.84926 0.00055611 -0.000877783 -0.130604 +EDGE3 821 872 1.25174 12.0388 -6.0813 -0.0124639 -0.000261302 0.1262 +EDGE3 822 872 1.96864 0.0058054 -5.97447 0.00646916 0.0120133 -0.00338049 +EDGE3 822 871 1.17205 -12.0007 -5.85346 -0.00252318 0.0116096 -0.120951 +EDGE3 823 873 1.94475 -0.00086957 -5.95224 -0.000632581 0.00726937 0.00773686 +EDGE3 822 873 1.23163 12.0229 -6.08206 0.0059614 0.00249595 0.122742 +EDGE3 823 872 1.14471 -12.0175 -5.86091 0.00409297 -0.00305164 -0.126103 +EDGE3 824 874 1.94045 -0.00471709 -5.94966 -0.00897789 -0.00288969 -0.0031815 +EDGE3 823 874 1.24903 12.0351 -6.09854 -0.000299568 -0.00956158 0.130713 +EDGE3 825 875 1.95462 0.00261263 -5.97892 0.00483919 0.0103772 0.00371967 +EDGE3 824 873 1.14305 -12.0353 -5.84427 -0.00458908 -0.00573016 -0.121229 +EDGE3 825 874 1.15079 -12.046 -5.85357 -0.000188872 0.0050351 -0.126219 +EDGE3 824 875 1.21542 12.0342 -6.09054 -0.00419864 -0.00232028 0.129019 +EDGE3 826 876 1.92898 -0.00485005 -5.98265 0.00706413 -0.00673247 0.000315243 +EDGE3 825 876 1.19932 12.0212 -6.10688 -0.000634171 0.00601971 0.120119 +EDGE3 826 875 1.13747 -12.0342 -5.85053 -0.00474757 0.00836684 -0.123599 +EDGE3 826 877 1.20725 12.059 -6.0968 0.00617517 -0.00614817 0.129675 +EDGE3 827 877 1.92491 0.00333346 -5.96861 0.00547675 0.000568531 0.000165878 +EDGE3 827 876 1.13982 -12.0331 -5.86936 -0.00229788 0.00243665 -0.124378 +EDGE3 828 878 1.90855 0.00456295 -5.97841 0.000674254 -0.00527596 0.000600599 +EDGE3 827 878 1.20983 12.059 -6.11937 0.0119959 0.00376439 0.125582 +EDGE3 828 877 1.12751 -12.039 -5.85306 0.00813642 -0.00814409 -0.127482 +EDGE3 829 879 1.91022 -0.0034828 -5.98332 0.0052853 0.00304796 -0.00624285 +EDGE3 829 878 1.1125 -12.0619 -5.85758 0.0047023 -0.0041127 -0.124813 +EDGE3 828 879 1.18423 12.044 -6.0827 0.000654356 0.00214317 0.1338 +EDGE3 829 880 1.18007 12.0524 -6.09856 0.00511994 -0.00529767 0.131159 +EDGE3 830 880 1.91754 -0.0130844 -5.99138 -0.00414606 0.000184111 0.00519203 +EDGE3 831 881 1.89052 0.00620731 -5.99503 -0.00782829 -0.000867404 -0.000525781 +EDGE3 830 879 1.12112 -12.0412 -5.88083 -0.00502852 -0.00549515 -0.126966 +EDGE3 830 881 1.17349 12.0592 -6.12603 -0.000897118 0.00619145 0.125878 +EDGE3 831 880 1.09745 -12.0624 -5.87337 -0.0110797 -0.00455032 -0.133957 +EDGE3 832 882 1.88034 -0.018567 -5.99428 -0.000274963 0.000299098 -0.00279299 +EDGE3 831 882 1.1784 12.0715 -6.11607 -0.00778558 0.000734624 0.137145 +EDGE3 832 881 1.1001 -12.0675 -5.8887 -1.30697e-05 0.00597958 -0.128258 +EDGE3 832 883 1.15917 12.0459 -6.10891 0.00847446 -0.000653668 0.131233 +EDGE3 833 883 1.89705 0.0049625 -5.98265 0.00176224 -0.00265363 0.00100641 +EDGE3 834 884 1.88257 -0.00786731 -6.00022 -0.00930213 0.00369157 0.0047952 +EDGE3 833 882 1.07875 -12.0525 -5.8692 0.00770437 -0.00393323 -0.128796 +EDGE3 834 883 1.07537 -12.0728 -5.88813 -0.00436731 0.00204486 -0.131782 +EDGE3 833 884 1.17887 12.0597 -6.10366 -0.00489365 0.0132128 0.118988 +EDGE3 834 885 1.15357 12.0776 -6.12194 0.00825521 0.00345653 0.121427 +EDGE3 835 885 1.87629 0.0093865 -6.01616 0.00763092 0.00534127 0.00246453 +EDGE3 836 886 1.85448 0.0177185 -6.01067 0.00726836 0.00323789 -0.00497609 +EDGE3 835 884 1.06264 -12.0732 -5.86573 -0.00369827 -0.00254005 -0.117925 +EDGE3 836 885 1.05656 -12.0879 -5.87386 0.00503274 0.000303769 -0.122103 +EDGE3 835 886 1.13211 12.0816 -6.11614 -0.000559163 0.00072707 0.129207 +EDGE3 836 887 1.12955 12.0806 -6.13527 0.00527254 0.00114159 0.127345 +EDGE3 837 887 1.86391 -0.0189603 -5.99865 0.00223615 -0.00399944 -0.0076471 +EDGE3 838 888 1.84743 0.00436205 -6.01063 -0.000926747 0.00774537 -0.00418757 +EDGE3 837 886 1.04196 -12.1109 -5.87953 0.000367893 0.00806824 -0.125757 +EDGE3 837 888 1.12836 12.0937 -6.13301 0.00258518 -0.00081878 0.117884 +EDGE3 838 887 1.06071 -12.0838 -5.87317 0.00309489 0.00303682 -0.125075 +EDGE3 838 889 1.11742 12.1086 -6.14732 0.0104823 0.00688199 0.129708 +EDGE3 839 889 1.85233 0.013385 -5.98314 0.00461622 -0.00870684 0.00269726 +EDGE3 839 888 1.04296 -12.0918 -5.88239 0.00280295 -0.00557242 -0.13233 +EDGE3 840 890 1.82701 -0.00119477 -6.0139 0.00407334 0.00311346 -0.0011379 +EDGE3 840 889 1.02703 -12.0967 -5.86052 -0.00412497 0.00247381 -0.120496 +EDGE3 839 890 1.12033 12.1055 -6.13767 0.00192801 0.00308989 0.126685 +EDGE3 841 891 1.82079 0.00863532 -6.01247 -0.000306694 -0.00188889 0.00218368 +EDGE3 840 891 1.10712 12.0958 -6.13449 0.00280643 -0.000619347 0.129744 +EDGE3 841 890 1.02577 -12.1112 -5.88499 -0.00068308 -0.00222606 -0.127475 +EDGE3 841 892 1.10666 12.1189 -6.13215 0.00331988 0.000472936 0.125466 +EDGE3 842 892 1.81943 0.00523215 -6.00412 -0.000829264 0.002805 0.00665456 +EDGE3 843 893 1.80855 0.00351855 -6.02545 -0.00138023 0.00699898 0.00071884 +EDGE3 842 891 1.03033 -12.1197 -5.89151 0.00529102 0.00594643 -0.124302 +EDGE3 843 892 1.00706 -12.105 -5.89848 -0.00739648 -0.00287963 -0.124247 +EDGE3 842 893 1.08225 12.1028 -6.14152 0.00850283 -0.00113 0.124778 +EDGE3 843 894 1.08295 12.1147 -6.15282 0.00365233 0.00914247 0.12391 +EDGE3 844 894 1.78995 0.00688332 -6.01553 0.00518344 -0.00373122 0.000391933 +EDGE3 844 893 0.985032 -12.1246 -5.89632 -0.000744154 0.00184531 -0.129614 +EDGE3 845 895 1.78687 -0.0120422 -6.0248 0.00520436 0.00501177 0.000781545 +EDGE3 845 894 1.00333 -12.1346 -5.90772 -0.00495757 -0.00200142 -0.118333 +EDGE3 844 895 1.0725 12.1075 -6.13354 -0.00285752 -0.00662632 0.126513 +EDGE3 845 896 1.06546 12.1098 -6.13842 0.0045627 0.00649236 0.125209 +EDGE3 846 896 1.7727 -0.00112547 -6.0173 -0.000300849 0.00471429 0.0107027 +EDGE3 846 895 0.999341 -12.1093 -5.87985 -0.00203697 -0.00482931 -0.124826 +EDGE3 847 897 1.78398 -0.00962529 -6.0137 -0.000549791 0.00415667 -0.00501239 +EDGE3 846 897 1.0539 12.1456 -6.13956 -0.00500197 -0.00258688 0.124993 +EDGE3 848 898 1.76866 0.00494662 -6.02821 0.00468551 -0.00380313 -0.000102201 +EDGE3 847 896 0.969113 -12.1089 -5.93698 0.00530942 0.00112415 -0.13791 +EDGE3 847 898 1.05317 12.1346 -6.15158 0.00209412 0.00690479 0.126024 +EDGE3 848 897 0.967358 -12.1404 -5.89336 0.00551052 -0.00353007 -0.125277 +EDGE3 848 899 1.02211 12.1345 -6.15058 0.00200652 0.00657007 0.121114 +EDGE3 849 899 1.74233 -0.00443813 -6.00945 -0.00127707 0.0105347 -0.00405627 +EDGE3 850 900 1.75994 -0.0110252 -6.0417 0.000177874 0.0068535 -0.00228921 +EDGE3 849 898 0.957754 -12.1386 -5.90976 -0.00589716 0.000945099 -0.133445 +EDGE3 850 899 0.963021 -12.1377 -5.91003 -0.00611099 0.00562652 -0.127994 +EDGE3 849 900 1.00599 12.1247 -6.14967 0.00502904 -0.000145953 0.129866 +EDGE3 851 901 1.75193 -0.0136552 -6.02672 -0.00968263 0.0021221 -0.0113579 +EDGE3 850 901 1.02124 12.1395 -6.14486 -0.00490352 -0.00384582 0.130802 +EDGE3 851 900 0.951048 -12.1305 -5.92725 -0.00290695 0.00630252 -0.131805 +EDGE3 852 902 1.73727 -0.00200656 -6.04841 0.00347953 -0.000244478 -0.00137436 +EDGE3 851 902 1.03155 12.1434 -6.13294 0.00283438 -0.00239452 0.122608 +EDGE3 852 901 0.948104 -12.1445 -5.90517 0.0021509 -0.000524806 -0.127449 +EDGE3 853 903 1.72089 -0.00447584 -6.03902 -0.00768025 0.00199358 -0.00353719 +EDGE3 852 903 1.01602 12.1314 -6.15592 -0.00364084 0.00146694 0.123206 +EDGE3 853 902 0.921932 -12.1448 -5.91816 0.0036389 -0.0038507 -0.117518 +EDGE3 854 904 1.72371 -0.0177653 -6.04172 0.00333064 -0.00514626 0.0101329 +EDGE3 853 904 1.00546 12.1493 -6.17103 0.00114648 0.00341822 0.129316 +EDGE3 854 903 0.935676 -12.1376 -5.90471 0.00321629 -0.00433544 -0.121459 +EDGE3 855 905 1.71626 0.00651119 -6.05882 0.00656925 -0.000570821 0.00546282 +EDGE3 854 905 0.987057 12.1605 -6.19165 0.00925539 -0.00484159 0.125551 +EDGE3 855 904 0.90712 -12.1479 -5.90574 0.00160784 -0.00346108 -0.127273 +EDGE3 856 906 1.73036 0.0108288 -6.05166 0.00502372 -0.0082705 -0.0116607 +EDGE3 855 906 0.988125 12.158 -6.16958 0.00478877 -0.00335011 0.129412 +EDGE3 856 905 0.893349 -12.1531 -5.93359 0.0103584 -0.00350634 -0.126353 +EDGE3 857 907 1.70832 0.00847832 -6.05125 -0.0017711 -0.00548456 0.00028176 +EDGE3 856 907 0.987051 12.1729 -6.18985 0.000870794 0.00425425 0.126962 +EDGE3 857 906 0.896643 -12.1714 -5.9409 -0.00096852 0.00264136 -0.133063 +EDGE3 858 908 1.70222 -0.00403641 -6.03752 -0.00355917 0.00093064 0.00694135 +EDGE3 857 908 0.961097 12.1732 -6.18767 0.00145094 0.00818253 0.128464 +EDGE3 858 907 0.90734 -12.1826 -5.93642 0.0115288 -0.00278476 -0.127775 +EDGE3 859 909 1.69986 0.0133803 -6.05764 0.00699989 0.00833856 -0.000837243 +EDGE3 858 909 0.952814 12.1773 -6.18313 0.00616611 0.00298787 0.128652 +EDGE3 859 908 0.894945 -12.1824 -5.91862 0.00387565 -0.00205963 -0.129095 +EDGE3 860 910 1.68044 -0.00254566 -6.05477 -0.00331513 0.00528609 0.00829555 +EDGE3 859 910 0.936177 12.1944 -6.16529 0.00392529 -0.00101161 0.118349 +EDGE3 860 909 0.894087 -12.1521 -5.94064 0.00102497 0.00436984 -0.119418 +EDGE3 861 911 1.67161 0.00743957 -6.04603 -0.00213043 0.00430212 0.0007115 +EDGE3 860 911 0.946767 12.1728 -6.17717 -0.00412537 0.00663372 0.133674 +EDGE3 861 910 0.861401 -12.1614 -5.93884 0.00250769 -0.00350423 -0.131213 +EDGE3 862 912 1.66932 -0.0110147 -6.06506 0.00995457 0.00368497 -0.00731657 +EDGE3 861 912 0.93691 12.1949 -6.18219 -0.00145821 0.00724876 0.120568 +EDGE3 862 911 0.851515 -12.1866 -5.9339 -0.00164256 0.00405475 -0.128201 +EDGE3 863 913 1.63624 0.000861727 -6.0542 -0.000455248 0.000629157 -0.0126124 +EDGE3 862 913 0.928728 12.1815 -6.17682 0.0085481 -9.85677e-05 0.124301 +EDGE3 863 912 0.873728 -12.1864 -5.937 -0.00182943 0.00882066 -0.130999 +EDGE3 864 914 1.64629 0.000176364 -6.0733 -0.00941336 -0.011222 0.00107066 +EDGE3 863 914 0.921106 12.2043 -6.18302 -0.00026931 -0.000630394 0.126036 +EDGE3 864 913 0.841436 -12.197 -5.93628 0.00837586 -0.00219594 -0.129531 +EDGE3 865 915 1.63942 0.00149199 -6.06084 -0.000498063 -0.00585475 -0.00130138 +EDGE3 864 915 0.912925 12.2036 -6.19159 -0.00301541 -0.00214707 0.123589 +EDGE3 865 914 0.837615 -12.204 -5.9429 0.000741937 0.00373998 -0.120397 +EDGE3 866 916 1.62956 -0.0054475 -6.06615 0.00156917 0.00212585 0.00784586 +EDGE3 865 916 0.881087 12.2207 -6.1928 0.00155757 -0.0028791 0.124223 +EDGE3 866 915 0.828413 -12.2158 -5.93621 -0.00205591 -0.00664818 -0.123616 +EDGE3 867 917 1.63005 -0.0129665 -6.06856 -0.00152699 0.00622885 0.00600017 +EDGE3 866 917 0.875732 12.2051 -6.19175 0.00375506 -0.0022796 0.120874 +EDGE3 867 916 0.827703 -12.2061 -5.95116 0.00120195 -0.00155964 -0.122963 +EDGE3 868 918 1.60684 -0.00078039 -6.07056 0.00793164 -0.0111246 -0.00470944 +EDGE3 867 918 0.868928 12.2086 -6.18927 0.00917531 0.00317103 0.130605 +EDGE3 868 917 0.813612 -12.2091 -5.96986 0.000674705 -0.00110597 -0.122131 +EDGE3 869 919 1.58308 0.0185352 -6.06952 -0.00567149 0.00128495 -0.0044895 +EDGE3 868 919 0.886536 12.1993 -6.20133 -0.00235097 -0.00229109 0.126136 +EDGE3 869 918 0.828037 -12.2034 -5.95527 -0.00411932 0.000688125 -0.127839 +EDGE3 870 920 1.59281 0.0133142 -6.07326 -0.00977118 -0.00298965 0.00314698 +EDGE3 869 920 0.871665 12.2238 -6.19068 0.00492663 -0.00716624 0.131081 +EDGE3 870 919 0.809862 -12.2142 -5.96098 0.00278095 0.00453759 -0.121608 +EDGE3 871 921 1.58727 0.0191441 -6.06746 -0.00396078 0.00337828 -0.00346538 +EDGE3 870 921 0.855889 12.2296 -6.20137 0.00202137 0.00372579 0.120692 +EDGE3 871 920 0.799123 -12.2143 -5.95002 -0.00536295 0.00672357 -0.129208 +EDGE3 872 922 1.60099 -0.0126592 -6.07414 -0.000342814 -0.00457794 0.00504796 +EDGE3 871 922 0.85305 12.2021 -6.19878 0.00571845 -0.00315179 0.11948 +EDGE3 872 921 0.794637 -12.2306 -5.9538 -0.00556701 0.00948214 -0.130115 +EDGE3 873 923 1.57293 -0.00456019 -6.09199 0.00851155 0.0049535 0.0114109 +EDGE3 872 923 0.849978 12.2158 -6.18073 0.00295018 0.00437693 0.126106 +EDGE3 873 922 0.75217 -12.216 -5.96262 0.00120852 -0.00246669 -0.128349 +EDGE3 874 924 1.56831 -0.00338196 -6.06418 -0.00736727 -0.00961187 -0.00631643 +EDGE3 873 924 0.837831 12.2281 -6.18556 -0.00477589 0.00215686 0.126829 +EDGE3 874 923 0.770795 -12.2328 -5.96428 -0.00489889 -0.00705048 -0.115828 +EDGE3 875 925 1.57146 0.0155599 -6.08796 0.00267395 -0.00216922 0.0097358 +EDGE3 874 925 0.834774 12.2434 -6.2105 -0.00131976 0.00686627 0.135601 +EDGE3 875 924 0.762562 -12.2267 -5.95707 0.00701006 -0.00714314 -0.127384 +EDGE3 876 926 1.54517 0.0264433 -6.09614 0.00476846 -0.00207043 -0.00196642 +EDGE3 875 926 0.802388 12.2413 -6.19781 0.00826718 0.00519418 0.121495 +EDGE3 876 925 0.765895 -12.236 -5.96017 -0.00770301 -0.00970274 -0.121337 +EDGE3 877 927 1.54941 -0.0101766 -6.09442 -0.000880471 0.00228689 -0.00484935 +EDGE3 876 927 0.78783 12.2345 -6.2067 -0.0113938 0.00327799 0.125381 +EDGE3 877 926 0.728308 -12.2376 -5.9504 -0.00275042 -0.00272258 -0.124298 +EDGE3 878 928 1.53842 0.00511774 -6.08875 0.00420479 9.21229e-05 0.0102586 +EDGE3 877 928 0.805904 12.2389 -6.22681 0.00411265 0.000692376 0.121956 +EDGE3 878 927 0.730931 -12.2332 -5.95711 0.00401833 0.00442824 -0.127114 +EDGE3 879 929 1.54388 0.00564821 -6.07967 -0.00466938 -0.00629668 0.0071779 +EDGE3 878 929 0.806145 12.2479 -6.22518 0.00630658 -0.00331757 0.124001 +EDGE3 879 928 0.734654 -12.2359 -5.96993 0.0024339 -0.0064463 -0.124547 +EDGE3 880 930 1.52092 -0.0200736 -6.07815 0.00223972 -0.00481296 -0.0037577 +EDGE3 879 930 0.793747 12.2556 -6.23158 -0.0143903 0.00424964 0.121178 +EDGE3 880 929 0.736986 -12.2593 -5.96658 0.00222248 -0.00149305 -0.128842 +EDGE3 881 931 1.52796 -0.0162652 -6.10854 -0.0029415 -0.00325457 0.0177393 +EDGE3 880 931 0.796325 12.238 -6.22134 0.00772182 -0.00155858 0.128357 +EDGE3 881 930 0.730585 -12.2594 -5.98845 -0.00622949 -0.00468509 -0.117277 +EDGE3 882 932 1.51505 0.0188581 -6.11323 0.00171375 0.00334658 -0.00954714 +EDGE3 881 932 0.764653 12.2508 -6.21282 -0.00785029 0.00953886 0.1178 +EDGE3 882 931 0.691332 -12.2274 -5.99057 -0.00124746 0.00108924 -0.127497 +EDGE3 883 933 1.49359 0.0191942 -6.11118 0.00444573 0.00710988 0.00570388 +EDGE3 882 933 0.750185 12.2543 -6.21952 -0.00365167 0.00978427 0.11995 +EDGE3 883 932 0.689432 -12.2537 -5.94878 0.00322838 -0.00191524 -0.118898 +EDGE3 884 934 1.48516 0.0278332 -6.10104 -0.006499 0.00178763 0.000342488 +EDGE3 883 934 0.749413 12.265 -6.2198 0.00123555 -0.00221853 0.126192 +EDGE3 884 933 0.68917 -12.2662 -5.98565 -0.00149517 -0.00566414 -0.127329 +EDGE3 885 935 1.46994 0.00102549 -6.10823 -0.00154801 0.0019736 -0.00394332 +EDGE3 884 935 0.76727 12.2525 -6.21259 -0.00199341 -0.0031217 0.122212 +EDGE3 885 934 0.679759 -12.2553 -5.98225 -0.00335947 0.00281087 -0.118889 +EDGE3 886 936 1.48404 0.00578128 -6.09789 -0.00224585 -0.00981119 0.00233621 +EDGE3 885 936 0.753603 12.2389 -6.2224 0.00628623 0.00660957 0.133052 +EDGE3 886 935 0.674955 -12.2544 -5.997 -0.00204275 0.000749662 -0.128678 +EDGE3 887 937 1.47697 0.00273799 -6.09659 -0.00587024 -0.00413905 0.00425405 +EDGE3 886 937 0.721961 12.2736 -6.22921 -0.00680653 -0.00687626 0.126839 +EDGE3 887 936 0.684002 -12.2603 -5.97549 0.00431096 0.00133943 -0.127448 +EDGE3 888 938 1.47392 0.0147619 -6.09011 0.00465732 -0.0016465 -0.00917904 +EDGE3 887 938 0.717436 12.2814 -6.24298 0.00502734 0.00485527 0.125542 +EDGE3 888 937 0.655543 -12.2714 -5.98309 -0.000586057 -0.00625423 -0.124608 +EDGE3 889 939 1.44882 -0.00275644 -6.11854 -0.00508675 -0.000227348 -0.00427255 +EDGE3 888 939 0.7247 12.2885 -6.24637 0.00754575 0.00889299 0.115665 +EDGE3 889 938 0.650713 -12.2627 -5.99132 0.00490747 -0.0040527 -0.121805 +EDGE3 890 940 1.42707 -0.00399678 -6.10228 -0.00344419 0.000887015 0.00202043 +EDGE3 889 940 0.727586 12.2629 -6.23353 9.95735e-05 -0.0028624 0.12088 +EDGE3 890 939 0.657739 -12.2772 -5.98493 0.00400031 -0.00461732 -0.115389 +EDGE3 891 941 1.42865 -0.00266502 -6.12498 -0.00672694 -0.00680511 0.000299843 +EDGE3 890 941 0.710973 12.2793 -6.24239 0.00897506 -0.00219723 0.126502 +EDGE3 891 940 0.629808 -12.2762 -6.00218 0.000216954 0.00451187 -0.130954 +EDGE3 892 942 1.42348 0.00908154 -6.1202 0.0034079 -0.000573099 -0.000884965 +EDGE3 891 942 0.690669 12.2905 -6.23199 0.000951298 0.0156951 0.133277 +EDGE3 892 941 0.628498 -12.286 -5.98537 -0.00286556 -0.00623093 -0.133582 +EDGE3 893 943 1.43374 -0.0147197 -6.12995 -0.00397117 0.00132482 0.00760863 +EDGE3 892 943 0.69171 12.2884 -6.24057 0.00974778 0.000734885 0.1236 +EDGE3 893 942 0.629189 -12.3093 -6.00316 0.000404133 -0.00128007 -0.12597 +EDGE3 894 944 1.41823 -0.000248059 -6.12806 -0.00209535 -0.00219695 0.00103773 +EDGE3 893 944 0.682728 12.2819 -6.23668 0.000806391 0.00851101 0.12351 +EDGE3 894 943 0.635955 -12.2841 -5.99608 -0.00467699 -0.00376475 -0.134576 +EDGE3 894 945 0.679318 12.2818 -6.23195 0.00118825 -0.00795286 0.12366 +EDGE3 895 945 1.40864 -0.012844 -6.13002 -0.00834935 0.00142604 0.00723521 +EDGE3 895 944 0.592132 -12.2793 -6.0035 0.00639186 0.00485144 -0.128133 +EDGE3 896 946 1.40423 0.0207073 -6.10975 0.00144999 0.00569358 -0.00660274 +EDGE3 895 946 0.639775 12.3113 -6.25143 0.00477225 -0.0166717 0.130281 +EDGE3 896 945 0.603417 -12.3056 -6.00374 0.0018931 0.0069759 -0.120542 +EDGE3 897 947 1.38251 0.006984 -6.13284 -0.00282607 -0.00411714 0.00133398 +EDGE3 896 947 0.63355 12.2813 -6.25267 0.00338005 -0.00808447 0.126239 +EDGE3 897 946 0.606659 -12.285 -6.00366 -0.00216654 -0.000355686 -0.128443 +EDGE3 898 948 1.3909 -0.0116025 -6.11676 -0.0124431 0.0111889 -0.0016828 +EDGE3 897 948 0.625937 12.3015 -6.25425 0.00845906 -0.00346932 0.12775 +EDGE3 898 947 0.593954 -12.302 -6.01007 -0.00119957 0.00456379 -0.121408 +EDGE3 899 949 1.37202 -0.0136238 -6.13328 0.000720631 -0.00133088 -0.0110404 +EDGE3 898 949 0.639001 12.3261 -6.24684 0.00899655 -0.00944377 0.126999 +EDGE3 899 948 0.576264 -12.3042 -6.00148 -0.00671951 -0.00920198 -0.127563 +EDGE3 900 950 1.37329 0.0095969 -6.14614 -0.000917323 0.00145675 0.00959225 +EDGE3 899 950 0.624442 12.3186 -6.2517 0.00197005 -0.00365961 0.130801 +EDGE3 900 949 0.569496 -12.3046 -6.01912 -0.00482615 -0.00351297 -0.123512 +EDGE3 900 951 0.619796 12.3117 -6.25467 -0.00105109 -0.000439623 0.120709 +EDGE3 901 951 1.34886 -0.0060602 -6.12723 -0.00299602 0.00186384 -0.00688798 +EDGE3 901 950 0.557983 -12.3053 -6.01626 0.00307654 -0.00394967 -0.121758 +EDGE3 901 952 0.610262 12.323 -6.24225 0.000972969 -0.00775554 0.12794 +EDGE3 902 952 1.35074 0.0162183 -6.11486 -0.00260742 -0.0049862 -0.00742132 +EDGE3 903 953 1.35723 0.00301418 -6.14143 0.00182306 0.00273582 0.00156668 +EDGE3 902 951 0.54796 -12.3023 -6.00424 -0.00246647 0.00114503 -0.131791 +EDGE3 903 952 0.552873 -12.3064 -5.9944 -0.00524744 0.00960853 -0.135848 +EDGE3 902 953 0.61223 12.3162 -6.25979 -0.00672935 -0.00430197 0.128348 +EDGE3 903 954 0.60383 12.3181 -6.26166 -0.0065822 -0.00835047 0.121902 +EDGE3 904 954 1.33441 0.0162009 -6.13698 0.00109401 0.0016154 -0.0038345 +EDGE3 905 955 1.3513 0.0106065 -6.15494 0.00488442 -0.0094876 -0.00170702 +EDGE3 904 953 0.53814 -12.3086 -6.02747 -0.00211598 -0.0022468 -0.123028 +EDGE3 905 954 0.53123 -12.3278 -6.02766 -0.0107462 -0.00592624 -0.117485 +EDGE3 904 955 0.57163 12.2975 -6.2396 0.00980072 -0.00526237 0.126709 +EDGE3 905 956 0.57085 12.3451 -6.25168 0.00801696 -0.00916345 0.130752 +EDGE3 906 956 1.31424 -0.0144378 -6.1428 -0.0020807 0.00134536 0.00486643 +EDGE3 907 957 1.31343 -0.00156147 -6.14747 -0.00119716 -0.00752041 0.00314761 +EDGE3 906 955 0.548212 -12.3312 -6.02117 4.07418e-05 -0.00493943 -0.128466 +EDGE3 906 957 0.578923 12.334 -6.27241 0.00850346 -0.00428564 0.127366 +EDGE3 907 956 0.52155 -12.3284 -6.01529 0.00439637 0.0090872 -0.122959 +EDGE3 907 958 0.587257 12.3351 -6.28879 -0.0073452 0.00174003 0.12443 +EDGE3 908 958 1.3068 -0.0112024 -6.14629 -0.00827801 -0.0035917 0.00613237 +EDGE3 909 959 1.29294 0.00703196 -6.13834 -0.00137629 0.000787664 0.00284521 +EDGE3 908 957 0.517327 -12.3224 -6.0128 0.00372952 -0.0013103 -0.128488 +EDGE3 909 958 0.499074 -12.3173 -6.00622 0.00687222 0.00377256 -0.128713 +EDGE3 908 959 0.561221 12.3405 -6.26909 -0.00783498 -0.0034372 0.125126 +EDGE3 909 960 0.543874 12.3251 -6.26349 -0.00129033 -0.00465335 0.122618 +EDGE3 910 960 1.29938 -0.00500983 -6.12778 0.0110455 -0.0105456 -0.00838596 +EDGE3 911 961 1.29606 0.00927738 -6.15944 -0.00297269 -0.00631774 0.00076435 +EDGE3 910 959 0.503782 -12.356 -6.00761 0.0115427 -0.00662942 -0.120722 +EDGE3 911 960 0.500549 -12.336 -6.03311 -0.00272687 -0.000448331 -0.125328 +EDGE3 910 961 0.540121 12.3474 -6.27953 -0.00455784 -0.00466248 0.124369 +EDGE3 912 962 1.27201 -0.0139277 -6.16434 -0.00170814 -0.00598426 -0.00128215 +EDGE3 911 962 0.523151 12.3318 -6.2762 -0.00423856 0.00469918 0.128898 +EDGE3 912 961 0.467285 -12.3407 -6.03466 0.000672055 0.00642302 -0.116371 +EDGE3 912 963 0.511173 12.3581 -6.28681 -0.000296436 -0.00588855 0.121275 +EDGE3 913 963 1.26538 0.0195631 -6.15703 -0.00100129 -0.000729118 0.00415576 +EDGE3 914 964 1.26889 0.00670503 -6.15493 -0.00159202 0.0103915 -0.00476241 +EDGE3 913 962 0.478175 -12.3578 -6.03211 0.00635982 0.00103811 -0.120296 +EDGE3 914 963 0.463203 -12.3527 -6.00585 0.000517109 0.000179433 -0.133705 +EDGE3 913 964 0.503917 12.3483 -6.25446 0.00148432 -0.00978965 0.118567 +EDGE3 915 965 1.24987 0.00820747 -6.15274 -0.00183071 -0.00662569 -0.00437037 +EDGE3 914 965 0.508178 12.3487 -6.2792 -0.00888262 0.00319929 0.128555 +EDGE3 915 964 0.446331 -12.3637 -6.02018 -0.00270743 -0.000991937 -0.125723 +EDGE3 915 966 0.499055 12.3504 -6.27269 0.00529931 0.00524925 0.114664 +EDGE3 916 966 1.25736 -0.00732422 -6.1452 -0.00660202 -0.00241542 0.00205075 +EDGE3 917 967 1.25239 0.0142705 -6.16553 -0.00645039 0.00803827 -0.00336245 +EDGE3 916 965 0.442367 -12.3339 -6.05349 -0.00639634 -0.00107273 -0.128076 +EDGE3 917 966 0.440082 -12.3385 -6.02526 -0.00114231 -0.000667393 -0.129356 +EDGE3 916 967 0.49644 12.3634 -6.27959 -0.00549495 0.00197265 0.120583 +EDGE3 918 968 1.23434 -0.00365065 -6.16906 -0.00496249 0.00236078 -0.000482333 +EDGE3 917 968 0.489728 12.3596 -6.27967 0.00142932 0.00719276 0.121319 +EDGE3 918 967 0.439968 -12.3541 -6.02642 -0.00216102 -0.00405389 -0.126493 +EDGE3 919 969 1.22516 0.00278926 -6.17017 -0.00117255 0.00412758 -0.000391844 +EDGE3 918 969 0.485572 12.3515 -6.26848 -0.000295214 -0.00118443 0.133584 +EDGE3 919 968 0.404469 -12.3773 -6.02557 -0.00795 -0.000211222 -0.133178 +EDGE3 919 970 0.467878 12.3758 -6.29101 0.0026752 -0.000834151 0.128323 +EDGE3 920 970 1.20835 -0.0131753 -6.16145 0.00161694 -0.001946 -0.000185535 +EDGE3 921 971 1.20561 0.0240297 -6.14075 0.0010094 0.00105745 0.00482321 +EDGE3 920 969 0.424364 -12.3529 -6.03515 0.0052887 0.00568446 -0.134672 +EDGE3 921 970 0.408734 -12.3598 -6.03674 -0.00649797 0.00384049 -0.117609 +EDGE3 920 971 0.452423 12.3788 -6.2915 0.00534066 0.00860607 0.128024 +EDGE3 921 972 0.446416 12.3764 -6.29522 0.0118329 0.00381232 0.132894 +EDGE3 922 972 1.20259 0.00355417 -6.15925 -0.00334537 -0.00697004 0.00234159 +EDGE3 923 973 1.18514 9.88396e-05 -6.18673 -0.000197293 -0.000985483 0.00192457 +EDGE3 922 971 0.38916 -12.3611 -6.04069 -0.000906461 -0.00416266 -0.133335 +EDGE3 922 973 0.448542 12.3739 -6.29604 0.00731807 -0.00754805 0.117346 +EDGE3 923 972 0.397423 -12.3939 -6.02388 0.000357669 -0.00288618 -0.124522 +EDGE3 924 974 1.18403 -0.00836346 -6.19252 0.0036563 -0.00194892 -0.000335919 +EDGE3 923 974 0.455072 12.3751 -6.29541 -0.00661486 0.00226548 0.122106 +EDGE3 924 973 0.377117 -12.3771 -6.04292 -0.00270048 0.0007927 -0.122845 +EDGE3 924 975 0.444272 12.3819 -6.30368 -0.00295162 0.00375906 0.116932 +EDGE3 925 975 1.17679 -0.00664939 -6.17047 -0.00158945 -0.0029452 0.00275905 +EDGE3 926 976 1.17834 -0.000155212 -6.15423 -0.00135211 -0.00577859 -0.00206245 +EDGE3 925 974 0.383113 -12.378 -6.04826 0.00562315 0.00519983 -0.125417 +EDGE3 925 976 0.414358 12.3858 -6.30084 0.00985756 0.000863773 0.132234 +EDGE3 926 975 0.375483 -12.3546 -6.04929 -0.000907777 -0.00740617 -0.132387 +EDGE3 926 977 0.409055 12.3843 -6.30332 -0.00763188 -0.00681301 0.125619 +EDGE3 927 977 1.16376 2.1267e-05 -6.1711 0.000326814 0.00847342 -0.00644074 +EDGE3 928 978 1.1642 0.000725468 -6.17526 0.00522955 0.00562953 -0.00244397 +EDGE3 927 976 0.346956 -12.3954 -6.05748 0.00301377 0.00143497 -0.131173 +EDGE3 928 977 0.36385 -12.3746 -6.0453 -0.00113535 -0.00898666 -0.132716 +EDGE3 927 978 0.404142 12.3725 -6.31458 0.0016967 -0.00086194 0.122392 +EDGE3 928 979 0.406518 12.3926 -6.30909 -0.00205739 -0.0115175 0.126615 +EDGE3 929 979 1.15249 -0.0141578 -6.17874 0.00392177 0.0114613 -0.00787066 +EDGE3 930 980 1.15316 0.00662657 -6.18451 0.000673186 -0.0002735 -0.00218742 +EDGE3 929 978 0.332521 -12.3791 -6.04325 -0.00654529 0.0032146 -0.125374 +EDGE3 930 979 0.34678 -12.39 -6.06228 0.00363697 0.00956232 -0.121316 +EDGE3 929 980 0.376984 12.3761 -6.31112 0.00508869 0.00266834 0.131037 +EDGE3 931 981 1.13178 0.00989899 -6.17257 -0.00547956 -0.00540132 -0.00153698 +EDGE3 930 981 0.378683 12.3852 -6.31768 0.0106281 0.00515017 0.141748 +EDGE3 931 980 0.332082 -12.4032 -6.04846 0.00554293 -0.00621236 -0.129254 +EDGE3 931 982 0.368375 12.4005 -6.29202 0.00408758 0.00390761 0.126541 +EDGE3 932 982 1.11534 -0.00120998 -6.16943 -0.00186869 0.00151602 0.00609478 +EDGE3 933 983 1.12554 0.0010008 -6.16528 -0.00278668 -0.0024285 -0.00607145 +EDGE3 932 981 0.314015 -12.3977 -6.05397 -0.00931639 -0.00117561 -0.128467 +EDGE3 933 982 0.319896 -12.3922 -6.05596 0.000163447 0.00580317 -0.13248 +EDGE3 932 983 0.35329 12.4024 -6.30786 0.00381123 0.00911388 0.119247 +EDGE3 933 984 0.348531 12.4103 -6.30853 0.00613441 0.00214688 0.125815 +EDGE3 934 984 1.10265 -0.00317828 -6.19798 -0.00289627 0.00138017 0.00781783 +EDGE3 935 985 1.09279 -0.00110114 -6.18044 -0.00478717 0.000300407 0.00500331 +EDGE3 934 983 0.314762 -12.3997 -6.06645 0.010192 -0.0103441 -0.119909 +EDGE3 934 985 0.349656 12.4159 -6.29735 0.00417574 0.000120967 0.122828 +EDGE3 935 984 0.305898 -12.4011 -6.06493 0.00502932 0.00278193 -0.127088 +EDGE3 936 986 1.09356 -0.00760128 -6.20371 0.00522372 0.000677498 -0.00291573 +EDGE3 935 986 0.338843 12.3824 -6.30497 0.00465162 -0.00268077 0.130236 +EDGE3 936 985 0.299258 -12.3861 -6.06812 -0.000948761 -0.00572699 -0.134244 +EDGE3 937 987 1.09011 0.00214327 -6.21089 0.00340262 0.000245568 -8.05977e-05 +EDGE3 936 987 0.322797 12.4271 -6.32068 -0.00793681 0.00650166 0.130631 +EDGE3 937 986 0.273276 -12.382 -6.06418 -0.00376226 0.00989404 -0.122372 +EDGE3 937 988 0.327626 12.4099 -6.31625 0.004722 -0.00168676 0.13254 +EDGE3 938 988 1.0772 0.00149656 -6.19341 0.000721342 0.00242046 -0.0111369 +EDGE3 938 987 0.282006 -12.4124 -6.07474 0.000401273 -0.00210328 -0.123923 +EDGE3 939 989 1.05859 0.0100306 -6.18469 0.00345259 0.00746671 0.00170097 +EDGE3 939 988 0.265342 -12.4167 -6.05214 -0.00523398 0.000627432 -0.122683 +EDGE3 938 989 0.299902 12.4205 -6.32466 -0.00429049 -0.0060912 0.134902 +EDGE3 940 990 1.05781 0.00739267 -6.19975 0.00015984 0.00686348 0.00627322 +EDGE3 939 990 0.310918 12.414 -6.31428 -0.00195948 -0.00357482 0.133624 +EDGE3 940 989 0.28778 -12.4056 -6.05775 -0.00376916 0.00302647 -0.134332 +EDGE3 941 991 1.0436 -0.0038343 -6.19714 0.00731681 0.00766539 0.00477858 +EDGE3 940 991 0.293219 12.4055 -6.33126 0.00915607 -0.00109939 0.119326 +EDGE3 941 990 0.266476 -12.4428 -6.07313 -0.0115682 -0.00165735 -0.12753 +EDGE3 942 992 1.04932 -0.0119403 -6.19012 0.00614943 -0.00957267 0.00640563 +EDGE3 941 992 0.28831 12.4034 -6.3047 -0.00171662 -3.57282e-05 0.12345 +EDGE3 942 991 0.247061 -12.4149 -6.06 0.00230425 0.00205061 -0.118095 +EDGE3 943 993 1.02358 -0.000630432 -6.20979 0.00191047 0.00276662 0.00273742 +EDGE3 942 993 0.269846 12.3999 -6.32157 -0.000529359 0.00724439 0.130329 +EDGE3 943 992 0.254435 -12.4292 -6.07158 0.0019671 0.00329468 -0.127201 +EDGE3 944 994 1.01583 0.00333199 -6.19533 -0.0101065 0.00658922 -0.00581701 +EDGE3 943 994 0.268617 12.4226 -6.31759 -0.00583432 -0.000550325 0.126998 +EDGE3 944 993 0.232943 -12.404 -6.08019 -0.0119207 4.58911e-05 -0.128864 +EDGE3 945 995 1.03632 -0.00630561 -6.19381 0.00195529 0.00326532 -0.00153914 +EDGE3 944 995 0.259965 12.4222 -6.33106 -0.0011013 0.00777909 0.118781 +EDGE3 945 994 0.233637 -12.4304 -6.06943 -0.000337167 0.00155628 -0.1164 +EDGE3 946 996 1.02151 0.00226066 -6.19641 -0.0102334 -0.000275929 0.00380689 +EDGE3 945 996 0.265137 12.4192 -6.31392 -0.00654312 0.00739586 0.128055 +EDGE3 946 995 0.212411 -12.4401 -6.08152 -0.00432938 -0.00150195 -0.125131 +EDGE3 947 997 0.998747 -0.000323848 -6.21549 0.002334 0.00469351 0.00299717 +EDGE3 946 997 0.237235 12.4187 -6.33066 -0.00558011 -0.00404293 0.137165 +EDGE3 947 996 0.228891 -12.4152 -6.08457 0.00186884 -0.00221371 -0.124625 +EDGE3 948 998 1.00376 0.00116976 -6.19593 0.00446083 0.000746661 -0.000748174 +EDGE3 947 998 0.241058 12.4373 -6.31868 -0.00598619 -0.00328714 0.132187 +EDGE3 948 997 0.196387 -12.4269 -6.08796 0.00673003 0.00220982 -0.130886 +EDGE3 949 999 1.00512 0.013779 -6.19131 -0.00565071 -0.00108759 -0.0105754 +EDGE3 948 999 0.225287 12.4377 -6.31977 0.000249408 -0.000821685 0.119942 +EDGE3 949 998 0.213248 -12.4309 -6.08001 -0.00222964 0.0023799 -0.126443 +EDGE3 950 1000 0.98102 -0.00306605 -6.19836 -0.00613493 -0.00135893 -0.0014606 +EDGE3 949 1000 0.232585 12.4419 -6.33436 0.00142009 -0.00242366 0.12687 +EDGE3 950 999 0.189062 -12.4256 -6.08281 0.00523343 0.00185522 -0.128949 +EDGE3 951 1001 0.975375 0.00768072 -6.22692 -0.00430789 0.00594 -0.000118962 +EDGE3 950 1001 0.208603 12.4269 -6.32333 -0.00536162 -0.00363218 0.119767 +EDGE3 951 1000 0.166275 -12.4273 -6.05729 0.00276332 0.000174576 -0.12653 +EDGE3 952 1002 0.987853 -0.00704614 -6.20494 0.0097229 -0.00393268 -0.00183978 +EDGE3 951 1002 0.194063 12.4326 -6.32394 0.00767435 0.00574661 0.127801 +EDGE3 952 1001 0.168852 -12.4225 -6.09701 0.000262297 -0.003593 -0.122415 +EDGE3 953 1003 0.950081 0.0153816 -6.20727 0.000254372 -0.00731587 -0.0060114 +EDGE3 952 1003 0.199526 12.4346 -6.32731 -0.000378253 -0.00606396 0.121514 +EDGE3 953 1002 0.150809 -12.4282 -6.07986 -0.000304953 0.00969106 -0.128889 +EDGE3 954 1004 0.946486 -0.000680319 -6.21236 0.00115896 -0.0057485 -0.000970213 +EDGE3 953 1004 0.193372 12.447 -6.33848 -0.00286072 -0.000892881 0.124768 +EDGE3 954 1003 0.155744 -12.4297 -6.07309 0.00249413 -0.00455836 -0.12696 +EDGE3 955 1005 0.940928 -0.00203069 -6.21673 -0.00125915 0.0107538 -0.00424114 +EDGE3 954 1005 0.186946 12.4365 -6.32083 0.0079441 -0.00673425 0.126728 +EDGE3 955 1004 0.154942 -12.4329 -6.08457 0.00488344 -0.00174657 -0.128409 +EDGE3 956 1006 0.933847 0.00238688 -6.21548 -0.0059931 -0.00201045 0.0125526 +EDGE3 955 1006 0.183827 12.4484 -6.32521 0.000647669 -0.00654096 0.132527 +EDGE3 956 1005 0.13535 -12.4563 -6.09488 -0.00585735 -0.00921591 -0.129447 +EDGE3 957 1007 0.930173 0.0161028 -6.22105 0.0106482 -0.000524441 -0.000184783 +EDGE3 956 1007 0.174524 12.4546 -6.35331 0.00175205 0.00228829 0.122308 +EDGE3 957 1006 0.138436 -12.445 -6.06686 0.00210672 0.0086721 -0.117886 +EDGE3 958 1008 0.903825 -0.00192976 -6.22001 0.00029388 -0.0107945 0.00477784 +EDGE3 957 1008 0.179146 12.4369 -6.32006 0.00279259 -0.0110523 0.126417 +EDGE3 958 1007 0.101163 -12.4464 -6.07986 0.000541385 0.00249453 -0.116964 +EDGE3 959 1009 0.906342 -0.00856364 -6.21543 0.00127277 0.00878754 0.00580358 +EDGE3 958 1009 0.156611 12.4367 -6.3438 0.00703469 0.00251908 0.118819 +EDGE3 959 1008 0.111431 -12.4608 -6.09641 0.00367663 -0.0063909 -0.129193 +EDGE3 960 1010 0.907487 0.000488393 -6.19627 0.00206818 -0.000659155 0.00141199 +EDGE3 959 1010 0.161393 12.4397 -6.32495 -0.00421346 0.00162753 0.130389 +EDGE3 960 1009 0.127172 -12.4682 -6.06094 -3.79076e-06 -0.00925412 -0.127221 +EDGE3 961 1011 0.899081 0.00612654 -6.21293 -0.00552186 0.00316975 0.00484587 +EDGE3 960 1011 0.105455 12.4696 -6.3236 0.00223434 0.00849022 0.126156 +EDGE3 961 1010 0.0863344 -12.4362 -6.08998 -0.0042649 0.00426816 -0.130004 +EDGE3 962 1012 0.886889 0.00758642 -6.22781 -0.00121303 -0.00688673 -0.00256044 +EDGE3 961 1012 0.120181 12.4637 -6.36714 -0.00111233 0.012226 0.125591 +EDGE3 962 1011 0.0890432 -12.457 -6.09793 0.00649252 -0.00472499 -0.120738 +EDGE3 963 1013 0.881525 -0.0108666 -6.23151 0.00177114 0.00108455 0.00388351 +EDGE3 962 1013 0.130425 12.4777 -6.34613 0.0051129 0.0026324 0.133182 +EDGE3 963 1012 0.0671111 -12.4561 -6.11101 0.00139044 -0.00446702 -0.1211 +EDGE3 964 1014 0.881881 3.53512e-05 -6.22672 -0.00241655 0.00535292 0.00104181 +EDGE3 963 1014 0.0881992 12.4713 -6.33989 0.00163842 -0.00282723 0.121401 +EDGE3 964 1013 0.061778 -12.4544 -6.1097 0.00249306 -0.00518575 -0.125997 +EDGE3 965 1015 0.870588 -0.0157077 -6.22349 0.00253831 -0.0033471 -0.00613663 +EDGE3 964 1015 0.112943 12.452 -6.35418 0.00028486 0.000485103 0.123035 +EDGE3 965 1014 0.0647916 -12.4532 -6.08749 0.00628512 0.000548888 -0.12328 +EDGE3 966 1016 0.851725 0.00343974 -6.23145 -0.00847509 0.00462879 -0.000283258 +EDGE3 965 1016 0.0861448 12.449 -6.34448 -0.00296327 0.000509518 0.129443 +EDGE3 966 1015 0.0540731 -12.4835 -6.10408 0.00285272 -0.00812065 -0.12139 +EDGE3 967 1017 0.856345 -0.00140981 -6.21976 -0.00026008 0.00130084 -0.00179775 +EDGE3 966 1017 0.0751446 12.4732 -6.34603 0.00130893 0.00616158 0.130975 +EDGE3 967 1016 0.0687291 -12.4645 -6.09054 -0.00121861 -0.00429264 -0.129576 +EDGE3 968 1018 0.849638 -0.00553813 -6.21589 -0.00381205 -0.00793486 -0.00568065 +EDGE3 967 1018 0.0739925 12.4723 -6.34859 0.00605877 -0.00338811 0.123831 +EDGE3 968 1017 0.0401351 -12.456 -6.11257 8.50867e-05 -0.00187582 -0.122856 +EDGE3 969 1019 0.845703 0.00285412 -6.21462 0.0110446 0.0029565 0.00390498 +EDGE3 968 1019 0.090834 12.4852 -6.3593 -0.00176008 -0.00483156 0.128593 +EDGE3 969 1018 0.034976 -12.477 -6.09197 0.00938761 -0.000768285 -0.128902 +EDGE3 970 1020 0.83051 -0.00272349 -6.22438 0.00479351 0.00386252 -0.00178471 +EDGE3 969 1020 0.0610178 12.4693 -6.35181 0.00273283 0.00886423 0.130709 +EDGE3 970 1019 0.0153774 -12.4634 -6.07613 -0.000465349 -0.00559529 -0.126142 +EDGE3 971 1021 0.817369 0.0143968 -6.24514 -0.000458342 0.00437675 0.0042899 +EDGE3 970 1021 0.0363313 12.4765 -6.35843 -0.00460936 -0.00502051 0.124341 +EDGE3 971 1020 0.0311528 -12.4776 -6.09635 0.00570905 -0.00841142 -0.126195 +EDGE3 972 1022 0.81075 0.00331246 -6.23729 0.000432404 0.00263212 -0.00147075 +EDGE3 971 1022 0.0244935 12.4547 -6.35744 0.00775972 0.000501019 0.125068 +EDGE3 972 1021 0.00365524 -12.4699 -6.10094 0.00241579 2.45102e-05 -0.122399 +EDGE3 973 1023 0.813347 0.00176729 -6.22425 0.00653377 -0.00687829 0.00555141 +EDGE3 972 1023 0.0165697 12.4622 -6.35939 0.00279259 0.00581969 0.12324 +EDGE3 973 1022 0.00342813 -12.4832 -6.08325 -0.00456874 -0.00979716 -0.131156 +EDGE3 974 1024 0.815219 0.0118716 -6.21697 -0.00343746 -0.00264425 -0.00255276 +EDGE3 974 1023 -0.0123738 -12.4877 -6.11063 0.00632502 0.00817007 -0.133285 +EDGE3 973 1024 0.0286498 12.5061 -6.35357 0.000873652 0.0114848 0.136197 +EDGE3 975 1025 0.764418 0.00138704 -6.23517 0.00125331 -0.00621262 0.00550948 +EDGE3 974 1025 0.0356864 12.4744 -6.36392 -0.002312 -0.00258022 0.123132 +EDGE3 975 1024 -0.0152994 -12.4505 -6.0972 -0.00174307 0.000861127 -0.12505 +EDGE3 976 1026 0.786564 -0.0127902 -6.23227 -0.00969193 0.00945945 0.00243047 +EDGE3 975 1026 0.0109601 12.4713 -6.34578 0.00188468 -0.00961783 0.127328 +EDGE3 976 1025 -0.0271344 -12.4707 -6.09649 0.000568799 -0.010896 -0.120939 +EDGE3 977 1027 0.764001 -0.00474215 -6.23829 0.0013005 -0.000156542 -0.000584371 +EDGE3 976 1027 -0.0103972 12.4807 -6.36363 -0.00432731 -0.00541724 0.132256 +EDGE3 977 1026 -0.0353862 -12.4924 -6.10864 0.00602444 -0.000226257 -0.120413 +EDGE3 978 1028 0.772794 -0.00992252 -6.22901 -0.00917619 -0.00153822 0.00513809 +EDGE3 978 1027 -0.0380511 -12.482 -6.11259 0.0012488 -0.00290825 -0.127314 +EDGE3 977 1028 -0.013139 12.4699 -6.36171 -0.00120376 -0.00168333 0.131217 +EDGE3 979 1029 0.759536 0.0132035 -6.25783 0.0105287 0.00481008 -0.00201089 +EDGE3 978 1029 -0.0280818 12.4854 -6.35505 0.00534858 -0.000818452 0.118082 +EDGE3 979 1028 -0.0334488 -12.4676 -6.09426 0.00200616 -0.00083474 -0.118689 +EDGE3 980 1030 0.736581 0.0176947 -6.23907 -0.00563987 -0.00866033 0.0021715 +EDGE3 979 1030 -0.00427572 12.479 -6.37696 0.000915469 -0.00708981 0.131256 +EDGE3 980 1029 -0.0345964 -12.4891 -6.10523 -0.00396398 0.00408186 -0.118732 +EDGE3 981 1031 0.751903 -0.00838249 -6.23848 -0.00584888 0.00630827 0.00106786 +EDGE3 980 1031 -0.0221652 12.4765 -6.35986 -0.00528576 -0.00106134 0.121417 +EDGE3 981 1030 -0.045977 -12.46 -6.12338 0.00224393 -0.00270947 -0.129517 +EDGE3 982 1032 0.73582 0.00498661 -6.23796 0.000451597 0.00121135 -0.0063392 +EDGE3 981 1032 -0.0485907 12.4821 -6.36222 -0.00528197 0.0027238 0.126636 +EDGE3 982 1031 -0.0563575 -12.47 -6.11338 -0.0104538 -0.00809705 -0.128747 +EDGE3 983 1033 0.722397 -0.00197137 -6.23714 -0.00165154 -0.00321876 -0.0018558 +EDGE3 982 1033 -0.0377629 12.5008 -6.36542 -0.00727788 -0.0155552 0.127888 +EDGE3 983 1032 -0.0548767 -12.4961 -6.11928 0.00709857 -0.00781062 -0.116993 +EDGE3 984 1034 0.726123 0.0167675 -6.24256 -0.010662 0.00169584 -0.00272517 +EDGE3 983 1034 -0.0457609 12.5036 -6.36618 0.00366015 -0.00338398 0.128765 +EDGE3 984 1033 -0.0834204 -12.499 -6.11644 0.0038669 -0.00177835 -0.129259 +EDGE3 985 1035 0.711576 0.0297586 -6.23777 0.00504254 8.86711e-05 -0.00181071 +EDGE3 984 1035 -0.0693881 12.4914 -6.37234 -0.00518308 0.00806861 0.119295 +EDGE3 985 1034 -0.0848856 -12.4897 -6.09056 0.000648842 -0.00588309 -0.13259 +EDGE3 986 1036 0.686904 0.00869389 -6.24361 -0.00747684 -0.00395844 -0.00662683 +EDGE3 985 1036 -0.0529557 12.4904 -6.35279 -0.00852332 0.00252901 0.125931 +EDGE3 986 1035 -0.0867065 -12.487 -6.13249 -0.00820808 4.3468e-05 -0.121558 +EDGE3 987 1037 0.695887 -0.00734272 -6.25551 -0.00501449 -0.000509627 0.00120932 +EDGE3 986 1037 -0.0696702 12.4848 -6.36072 -0.00306572 0.00632569 0.12058 +EDGE3 987 1036 -0.0994351 -12.4966 -6.12421 -0.00108775 0.00175917 -0.127472 +EDGE3 988 1038 0.701279 0.00704053 -6.23898 0.00661434 0.000931187 0.00342452 +EDGE3 987 1038 -0.0812596 12.503 -6.36863 0.0061399 0.00485606 0.124638 +EDGE3 988 1037 -0.113711 -12.4815 -6.11564 -3.33223e-05 -0.00464663 -0.122587 +EDGE3 989 1039 0.686689 -0.0019094 -6.25017 -0.0069805 -0.000595511 -0.00399799 +EDGE3 988 1039 -0.0866314 12.4955 -6.35568 -0.00249889 -0.00705797 0.123274 +EDGE3 989 1038 -0.116493 -12.4994 -6.12099 0.00291063 0.00682524 -0.124108 +EDGE3 990 1040 0.666889 0.00411714 -6.2503 -0.00265148 0.000459866 -0.00126887 +EDGE3 989 1040 -0.11478 12.4837 -6.3658 0.00173656 0.00558397 0.122541 +EDGE3 990 1039 -0.111651 -12.4974 -6.12395 -0.00332879 0.00543914 -0.12576 +EDGE3 990 1041 -0.105947 12.5168 -6.37371 -0.00525133 -0.00233592 0.123398 +EDGE3 991 1041 0.663029 0.0103897 -6.24071 -0.00362649 0.00568044 0.00334326 +EDGE3 992 1042 0.651015 0.00510679 -6.24883 0.00149873 0.0071623 -0.00663872 +EDGE3 991 1040 -0.139454 -12.5021 -6.11105 0.00110819 -0.005998 -0.124646 +EDGE3 992 1041 -0.127648 -12.5039 -6.11687 -0.00152544 -0.00198732 -0.123334 +EDGE3 991 1042 -0.11525 12.4887 -6.36796 0.00155542 -0.00262199 0.122935 +EDGE3 993 1043 0.639084 0.00180092 -6.24663 -0.00416522 -0.00182369 0.0018346 +EDGE3 992 1043 -0.121616 12.5032 -6.36786 0.00133817 0.0027953 0.128497 +EDGE3 993 1042 -0.139204 -12.4856 -6.13006 0.000833801 -0.00449236 -0.120986 +EDGE3 994 1044 0.624405 -0.000203848 -6.25704 -0.010349 -0.00591468 -0.0024043 +EDGE3 993 1044 -0.134905 12.5104 -6.38312 -0.00795368 -0.0018399 0.12749 +EDGE3 994 1043 -0.167308 -12.4984 -6.12636 -0.00100597 -0.00304658 -0.123693 +EDGE3 995 1045 0.630872 -0.000963202 -6.25075 0.00127655 -0.00261569 -0.00384713 +EDGE3 994 1045 -0.128148 12.502 -6.36727 0.00147246 -0.00205872 0.124576 +EDGE3 995 1044 -0.166231 -12.5013 -6.11632 0.00227439 0.0101222 -0.1341 +EDGE3 995 1046 -0.144957 12.4919 -6.37531 0.00349469 0.00249614 0.128982 +EDGE3 996 1046 0.637001 0.00638378 -6.2754 -0.00904298 -0.010392 0.00803121 +EDGE3 997 1047 0.614585 0.00510201 -6.24706 -0.00937562 0.00120399 0.00854015 +EDGE3 996 1045 -0.165641 -12.5047 -6.13066 0.00163576 -0.002318 -0.120639 +EDGE3 996 1047 -0.171014 12.5126 -6.37352 -0.00590674 0.00241845 0.122097 +EDGE3 997 1046 -0.185196 -12.5168 -6.15078 0.0012904 -0.00518797 -0.131865 +EDGE3 998 1048 0.602199 -0.0108784 -6.26008 0.00153997 -0.00234764 0.00892435 +EDGE3 997 1048 -0.160551 12.5201 -6.377 -0.000631774 -0.00598233 0.12043 +EDGE3 998 1047 -0.186443 -12.5106 -6.12934 0.00668855 0.00882906 -0.123751 +EDGE3 999 1049 0.607332 -0.0120566 -6.23938 0.00137675 -0.00483602 -0.00343843 +EDGE3 998 1049 -0.197888 12.5163 -6.38189 -0.0052321 0.00173962 0.129771 +EDGE3 999 1048 -0.181935 -12.5011 -6.13397 0.00410851 -0.00524469 -0.128643 +EDGE3 1000 1050 0.588093 -0.0148445 -6.26741 -0.00231877 -0.00100235 -0.0130073 +EDGE3 999 1050 -0.199047 12.5145 -6.3724 0.00492259 -0.00491484 0.122803 +EDGE3 1000 1049 -0.185762 -12.5051 -6.12252 0.0059023 -0.00303613 -0.129209 +EDGE3 1001 1051 0.576651 -0.0230348 -6.24744 0.00163988 -0.00371232 -0.00621163 +EDGE3 1000 1051 -0.190744 12.5071 -6.38772 -0.00761961 0.000404192 0.122363 +EDGE3 1001 1050 -0.214301 -12.5126 -6.13313 0.00646623 0.000543313 -0.123637 +EDGE3 1002 1052 0.583151 0.0160916 -6.23927 -0.00395168 0.000580358 -0.00446611 +EDGE3 1001 1052 -0.199188 12.5125 -6.39291 -0.00579728 -0.00311895 0.122716 +EDGE3 1002 1051 -0.219506 -12.5088 -6.1194 0.00620535 0.00369892 -0.132393 +EDGE3 1002 1053 -0.195822 12.5058 -6.40341 -0.00598364 0.000842441 0.121318 +EDGE3 1003 1053 0.545872 -0.0138138 -6.24532 0.002653 -0.00576536 0.00257887 +EDGE3 1004 1054 0.557681 0.018481 -6.24866 -0.00543603 0.00150283 0.00551855 +EDGE3 1003 1052 -0.233489 -12.5056 -6.12649 -0.00438419 0.0066131 -0.127839 +EDGE3 1004 1053 -0.22399 -12.5041 -6.14365 -0.00713551 -0.00379206 -0.127584 +EDGE3 1003 1054 -0.21314 12.5051 -6.40255 0.000985135 0.00195386 0.127411 +EDGE3 1005 1055 0.559756 0.00319804 -6.25159 0.00166463 -0.00546423 0.00351203 +EDGE3 1004 1055 -0.220853 12.529 -6.37933 0.000678529 -0.00895906 0.118821 +EDGE3 1005 1054 -0.250759 -12.5088 -6.13133 0.00505392 0.00319929 -0.121046 +EDGE3 1006 1056 0.548373 -0.000856317 -6.24571 -0.00575078 0.00921525 -0.00712818 +EDGE3 1005 1056 -0.226918 12.4862 -6.38549 0.000862255 0.00682133 0.139088 +EDGE3 1006 1055 -0.237524 -12.5277 -6.13865 0.000106748 -0.00917776 -0.126228 +EDGE3 1007 1057 0.536273 0.0158555 -6.24922 0.00360437 0.000913854 -0.00510339 +EDGE3 1006 1057 -0.22783 12.5045 -6.38718 -0.00314142 0.000183785 0.134188 +EDGE3 1008 1058 0.52877 0.0132027 -6.25477 -0.000238392 -0.00466798 -0.00515544 +EDGE3 1007 1056 -0.270363 -12.5179 -6.12874 0.00464371 0.00404607 -0.119477 +EDGE3 1007 1058 -0.25221 12.508 -6.39139 0.00473052 0.00561593 0.119774 +EDGE3 1008 1057 -0.277897 -12.5259 -6.13128 0.00801065 -0.00276281 -0.128398 +EDGE3 1009 1059 0.506995 -0.00850315 -6.28101 0.00558712 -0.00138337 -0.000697701 +EDGE3 1008 1059 -0.2426 12.5065 -6.39821 0.00158702 -0.00567758 0.120517 +EDGE3 1009 1058 -0.261819 -12.5165 -6.11328 -0.009556 -0.00487809 -0.12106 +EDGE3 1010 1060 0.512187 0.00380349 -6.27106 0.00575713 0.00574692 -0.0027486 +EDGE3 1009 1060 -0.262489 12.5225 -6.38027 -0.00650878 0.00315928 0.12692 +EDGE3 1010 1059 -0.262447 -12.5249 -6.14288 0.000213439 0.00106896 -0.123348 +EDGE3 1011 1061 0.507848 -0.0132595 -6.25333 -0.00497433 0.00022107 0.00169572 +EDGE3 1010 1061 -0.276878 12.5253 -6.38623 0.000493188 -0.00062713 0.120933 +EDGE3 1011 1060 -0.302541 -12.5237 -6.13515 -0.00021765 0.00386733 -0.123577 +EDGE3 1012 1062 0.495755 -0.00342218 -6.26372 0.00328661 -0.0066673 -0.000715521 +EDGE3 1011 1062 -0.276972 12.523 -6.38398 -0.00306386 0.00376326 0.120178 +EDGE3 1012 1061 -0.287706 -12.5064 -6.13656 -0.00316163 -0.00273037 -0.123854 +EDGE3 1013 1063 0.486013 0.0201915 -6.2588 -0.00705937 -0.00536856 -0.0024275 +EDGE3 1012 1063 -0.280634 12.5144 -6.38975 0.00153201 0.00372571 0.128677 +EDGE3 1014 1064 0.482747 0.00405779 -6.25622 0.00321114 0.00128575 0.00041016 +EDGE3 1013 1062 -0.300117 -12.5166 -6.148 0.00104096 0.00125921 -0.125917 +EDGE3 1013 1064 -0.299535 12.5097 -6.38625 -0.0088264 0.00474337 0.133462 +EDGE3 1014 1063 -0.298692 -12.5233 -6.1392 -0.00924332 -0.000568681 -0.123759 +EDGE3 1015 1065 0.47199 -0.00530056 -6.2637 -0.00522823 0.00148066 -0.00435683 +EDGE3 1014 1065 -0.308605 12.5192 -6.3829 -0.00670152 -0.00147826 0.129165 +EDGE3 1016 1066 0.44431 0.00287273 -6.26808 -0.00501712 -0.00289772 0.000776499 +EDGE3 1015 1064 -0.319473 -12.5018 -6.12574 -0.00325072 0.00140551 -0.126934 +EDGE3 1015 1066 -0.301862 12.5248 -6.39567 -0.00113133 0.00435017 0.125263 +EDGE3 1016 1065 -0.319821 -12.5254 -6.14241 -0.00434756 -0.00243053 -0.128796 +EDGE3 1017 1067 0.464498 0.00829791 -6.25089 -0.00514171 0.00147153 -0.00499085 +EDGE3 1016 1067 -0.310813 12.5415 -6.39103 0.01152 -0.00207167 0.127184 +EDGE3 1017 1066 -0.351802 -12.5211 -6.14126 -0.000203881 -0.000846365 -0.122255 +EDGE3 1018 1068 0.44746 -0.000470335 -6.28817 0.00393862 0.00316305 -0.012556 +EDGE3 1017 1068 -0.31083 12.5006 -6.37347 0.00533918 -0.000463818 0.133204 +EDGE3 1019 1069 0.446319 0.0142445 -6.26833 0.00434445 0.00640258 0.00746184 +EDGE3 1018 1067 -0.340905 -12.5207 -6.14163 0.00626786 -0.00631899 -0.12472 +EDGE3 1019 1068 -0.351197 -12.5189 -6.14598 0.00144921 -0.00373631 -0.127866 +EDGE3 1018 1069 -0.320945 12.5284 -6.38844 -0.00678782 0.001441 0.123295 +EDGE3 1020 1070 0.427504 0.0126791 -6.26717 -0.00110486 -0.00600884 0.00151282 +EDGE3 1019 1070 -0.338156 12.5276 -6.38908 -0.00400373 -0.000136708 0.129281 +EDGE3 1020 1069 -0.362348 -12.534 -6.1418 -0.00161087 -0.00410936 -0.123078 +EDGE3 1021 1071 0.425285 -0.0075892 -6.2624 0.00177453 0.00235862 -0.00175729 +EDGE3 1020 1071 -0.35949 12.5254 -6.38792 -0.00455641 0.00330665 0.120728 +EDGE3 1021 1070 -0.372646 -12.538 -6.11628 0.0145607 0.00172648 -0.133737 +EDGE3 1022 1072 0.40939 -0.0108033 -6.27539 0.000631527 -0.00410589 -0.00448087 +EDGE3 1021 1072 -0.385797 12.5414 -6.39678 -0.00205942 -0.00155908 0.120386 +EDGE3 1022 1071 -0.378597 -12.5527 -6.14593 -0.00680235 -0.00126295 -0.116706 +EDGE3 1023 1073 0.404221 0.00579676 -6.27893 -0.00495481 -0.00184616 -0.00522322 +EDGE3 1022 1073 -0.379647 12.5247 -6.3939 0.00434515 0.000411133 0.136366 +EDGE3 1024 1074 0.391503 -0.0138821 -6.26853 0.00194373 0.00817654 -0.00384202 +EDGE3 1023 1072 -0.384374 -12.5484 -6.14782 -0.00302179 0.000226253 -0.12822 +EDGE3 1023 1074 -0.387382 12.5268 -6.39582 -0.00215746 -0.00797828 0.120408 +EDGE3 1024 1073 -0.404685 -12.5148 -6.12644 0.000971984 0.00606791 -0.122076 +EDGE3 1025 1075 0.406576 0.00623958 -6.2726 0.000118843 -0.00161025 0.000426346 +EDGE3 1024 1075 -0.386386 12.5168 -6.3935 -0.00273871 -0.000416093 0.12274 +EDGE3 1025 1074 -0.380451 -12.5189 -6.14221 -0.000935182 0.000587987 -0.126968 +EDGE3 1026 1076 0.387173 0.0222664 -6.26207 -0.00446999 0.00661585 -0.0162995 +EDGE3 1025 1076 -0.39731 12.5183 -6.40298 0.00313331 -0.00142002 0.113178 +EDGE3 1027 1077 0.381764 0.0177537 -6.27712 -0.00473262 0.00518458 -0.00172216 +EDGE3 1026 1075 -0.398159 -12.5313 -6.13373 0.000320591 -0.00223746 -0.12076 +EDGE3 1026 1077 -0.404623 12.5393 -6.39946 -0.00703611 -0.00506246 0.129275 +EDGE3 1027 1076 -0.421867 -12.5319 -6.12938 0.00080054 2.16396e-06 -0.12071 +EDGE3 1028 1078 0.364941 -0.00682327 -6.26263 -0.00222127 0.00361208 -0.00277724 +EDGE3 1027 1078 -0.402639 12.5019 -6.38842 0.00572882 -0.00113922 0.112137 +EDGE3 1028 1077 -0.423337 -12.5223 -6.12316 0.000953783 -0.00698766 -0.124035 +EDGE3 1029 1079 0.36205 0.000555717 -6.26377 0.00103909 0.00292397 0.0018167 +EDGE3 1028 1079 -0.416218 12.5104 -6.39309 0.00149309 0.00678344 0.127842 +EDGE3 1030 1080 0.354122 0.000557097 -6.26988 0.00610043 0.00512122 0.00121343 +EDGE3 1029 1078 -0.415947 -12.5206 -6.14146 0.00641839 -0.00368707 -0.127464 +EDGE3 1029 1080 -0.425649 12.5332 -6.41522 -0.00691993 0.00747921 0.125989 +EDGE3 1030 1079 -0.444427 -12.5228 -6.1564 0.00385524 -0.000270493 -0.131101 +EDGE3 1031 1081 0.323141 -0.00174244 -6.28445 0.00585087 0.00274641 -0.0026642 +EDGE3 1030 1081 -0.431584 12.5317 -6.38935 -0.00519359 0.00404818 0.122387 +EDGE3 1031 1080 -0.43128 -12.5365 -6.17378 0.00686573 -0.00112914 -0.125687 +EDGE3 1032 1082 0.343282 -0.00258827 -6.27217 0.00785878 0.00193116 0.00194795 +EDGE3 1031 1082 -0.450662 12.5164 -6.41051 0.00293462 -0.0076397 0.126313 +EDGE3 1032 1081 -0.451586 -12.5083 -6.14878 0.00271711 0.00320522 -0.126127 +EDGE3 1033 1083 0.33372 -0.0235262 -6.26866 0.00163728 0.00428167 0.00456563 +EDGE3 1032 1083 -0.44836 12.523 -6.40191 -0.00887786 -0.0102621 0.118729 +EDGE3 1033 1082 -0.470893 -12.5342 -6.14275 -0.00111154 0.00349921 -0.130402 +EDGE3 1034 1084 0.317439 0.00428264 -6.27274 0.00174271 0.00149354 -0.00434332 +EDGE3 1033 1084 -0.437451 12.5304 -6.38576 0.00154293 0.00119669 0.127318 +EDGE3 1034 1083 -0.446281 -12.5253 -6.16127 -0.00440954 0.00272367 -0.126248 +EDGE3 1035 1085 0.298068 0.00256139 -6.29128 -0.00455709 0.00258623 0.00892775 +EDGE3 1034 1085 -0.460094 12.5377 -6.39615 -0.00387592 0.0072131 0.134939 +EDGE3 1035 1084 -0.472045 -12.525 -6.14212 0.00525149 0.00604261 -0.121385 +EDGE3 1036 1086 0.298859 0.00220704 -6.25972 -0.011724 0.00497854 -0.00716465 +EDGE3 1035 1086 -0.47334 12.5329 -6.40778 -0.000835223 0.0012579 0.12997 +EDGE3 1036 1085 -0.484904 -12.5176 -6.14107 0.00506844 0.00237413 -0.121361 +EDGE3 1037 1087 0.285679 0.0104881 -6.25979 -0.00472771 0.00425943 -0.00251493 +EDGE3 1036 1087 -0.481177 12.5171 -6.39547 -0.00100882 0.0012827 0.117663 +EDGE3 1037 1086 -0.506808 -12.5305 -6.15569 0.00760808 0.00539201 -0.120935 +EDGE3 1038 1088 0.297579 -0.00682341 -6.26887 -0.00328675 8.67593e-05 -0.000967068 +EDGE3 1037 1088 -0.495501 12.5242 -6.40356 0.00743762 -0.00333221 0.12703 +EDGE3 1038 1087 -0.480813 -12.531 -6.14404 0.00152894 -0.0025846 -0.122954 +EDGE3 1039 1089 0.278612 -0.0134488 -6.26645 0.00664905 -0.00347998 0.00264618 +EDGE3 1038 1089 -0.504149 12.53 -6.40451 0.00469796 0.00639568 0.125592 +EDGE3 1039 1088 -0.500858 -12.5452 -6.14331 0.00632373 -0.00292675 -0.134841 +EDGE3 1040 1090 0.270624 -0.00372858 -6.27733 -0.00873867 0.0039414 0.00433455 +EDGE3 1039 1090 -0.505859 12.5401 -6.40265 -0.00274282 -0.00663094 0.127929 +EDGE3 1040 1089 -0.516525 -12.5457 -6.14969 0.00670202 -0.00319466 -0.12781 +EDGE3 1041 1091 0.272474 -0.00369477 -6.2653 -0.00120342 0.00222899 0.0011086 +EDGE3 1040 1091 -0.493425 12.5347 -6.38473 -0.00185871 0.0010592 0.131945 +EDGE3 1041 1090 -0.524219 -12.5313 -6.15082 0.0104448 -0.00801705 -0.120278 +EDGE3 1042 1092 0.265304 0.000762534 -6.27577 0.00210914 -0.00142372 -0.00471483 +EDGE3 1041 1092 -0.508479 12.5344 -6.41172 -0.000427451 -0.00670079 0.125384 +EDGE3 1042 1091 -0.531107 -12.5259 -6.12991 -0.00620666 0.00161012 -0.123038 +EDGE3 1043 1093 0.255221 -0.0114643 -6.29279 -0.000814872 0.00217647 0.0102762 +EDGE3 1042 1093 -0.522997 12.5472 -6.40753 0.00341459 -0.00497783 0.131574 +EDGE3 1043 1092 -0.537352 -12.5338 -6.14354 0.00562279 0.00687441 -0.124954 +EDGE3 1044 1094 0.231708 -0.0137804 -6.27151 0.0033834 0.00410246 0.00296196 +EDGE3 1043 1094 -0.53021 12.5404 -6.39912 0.000834043 -0.00393727 0.131139 +EDGE3 1044 1093 -0.537188 -12.55 -6.14679 0.0080184 0.00161169 -0.121808 +EDGE3 1045 1095 0.253302 -0.00834 -6.27605 -0.00672171 -0.00236143 -0.0123973 +EDGE3 1044 1095 -0.537043 12.5343 -6.38888 0.0055114 -0.000246843 0.115042 +EDGE3 1045 1094 -0.52802 -12.5492 -6.13887 0.00340438 0.00233629 -0.129119 +EDGE3 1046 1096 0.236117 0.00644192 -6.2777 -0.00366992 0.0051391 -0.00765547 +EDGE3 1045 1096 -0.568126 12.5357 -6.39896 0.00556515 -0.00362158 0.126788 +EDGE3 1046 1095 -0.554654 -12.5286 -6.16316 0.000297155 -0.00156953 -0.122061 +EDGE3 1047 1097 0.215826 0.0027056 -6.29331 0.00420513 -0.00916484 0.00529622 +EDGE3 1047 1096 -0.575023 -12.5387 -6.14175 -0.00218035 -0.000235105 -0.126417 +EDGE3 1046 1097 -0.570179 12.5379 -6.40405 -0.00543667 -0.00178978 0.123264 +EDGE3 1048 1098 0.215206 -0.00976241 -6.27914 -0.00153683 -0.000180451 -0.00335491 +EDGE3 1047 1098 -0.564887 12.5387 -6.38683 0.000722098 -0.00234415 0.125471 +EDGE3 1048 1097 -0.58808 -12.5472 -6.16781 -0.0096506 0.00195949 -0.128922 +EDGE3 1049 1099 0.213304 -0.00205135 -6.2654 0.00422135 -0.00499441 -0.00743441 +EDGE3 1048 1099 -0.573358 12.5255 -6.40817 0.00559041 0.00313199 0.132105 +EDGE3 1049 1098 -0.584573 -12.5558 -6.15662 -0.000590938 0.00193715 -0.121993 +EDGE3 1050 1100 0.196842 -0.00878122 -6.26398 0.00502871 -0.00912132 -0.00387076 +EDGE3 1050 1099 -0.596702 -12.5365 -6.15971 -0.00321903 0.000360408 -0.123481 +EDGE3 1049 1100 -0.58747 12.5334 -6.40297 0.00511473 0.00303579 0.13453 +EDGE3 1051 1101 0.186447 0.00807411 -6.27847 -0.00775935 0.00481857 -0.00328007 +EDGE3 1050 1101 -0.605399 12.5384 -6.4021 -0.00267565 -0.00393191 0.128833 +EDGE3 1051 1100 -0.6121 -12.5372 -6.15949 -0.00136945 0.00689434 -0.129984 +EDGE3 1052 1102 0.181803 0.00180035 -6.27212 -0.00174061 -0.00486135 0.00449928 +EDGE3 1051 1102 -0.591592 12.5322 -6.40781 0.0063865 -0.00166408 0.121012 +EDGE3 1052 1101 -0.604733 -12.522 -6.1555 0.00351985 0.00652907 -0.122691 +EDGE3 1053 1103 0.178218 -0.000337323 -6.27229 0.000536779 0.00684484 -0.0021648 +EDGE3 1052 1103 -0.585298 12.5264 -6.41144 0.00103311 0.00827947 0.124093 +EDGE3 1053 1102 -0.614128 -12.5375 -6.15385 0.000120277 0.00737525 -0.120787 +EDGE3 1054 1104 0.150053 -0.00540746 -6.28945 0.00468344 -0.00733821 -0.00120659 +EDGE3 1053 1104 -0.610268 12.5227 -6.38996 -0.00127093 -0.00741288 0.12665 +EDGE3 1054 1103 -0.628142 -12.5387 -6.15311 0.00627335 -0.00557564 -0.12232 +EDGE3 1055 1105 0.157036 0.00225103 -6.2568 -0.0108907 -0.00280618 -0.00584148 +EDGE3 1054 1105 -0.616292 12.5246 -6.39907 -0.0030841 -0.0093312 0.131113 +EDGE3 1055 1104 -0.625805 -12.5288 -6.14966 0.00199975 -0.00412772 -0.121731 +EDGE3 1056 1106 0.158603 -0.00407588 -6.28066 0.00140752 -0.00675594 -0.00570593 +EDGE3 1055 1106 -0.632382 12.5321 -6.39424 0.00608578 0.000663047 0.129288 +EDGE3 1056 1105 -0.656775 -12.5298 -6.15814 -5.40591e-05 0.00682029 -0.129037 +EDGE3 1057 1107 0.151505 -0.00415746 -6.27098 -0.00125841 0.0042056 -0.00464014 +EDGE3 1057 1106 -0.634193 -12.5425 -6.13072 0.00699202 -0.000568379 -0.120617 +EDGE3 1056 1107 -0.630261 12.5235 -6.41326 -0.00123813 -0.00416774 0.118434 +EDGE3 1058 1108 0.130147 0.00137597 -6.29459 0.0016229 0.00480329 0.00144662 +EDGE3 1057 1108 -0.627731 12.53 -6.40611 0.000434816 -0.00558811 0.122298 +EDGE3 1058 1107 -0.634353 -12.53 -6.15021 0.00082961 -0.000214506 -0.12332 +EDGE3 1059 1109 0.139252 -4.85242e-05 -6.28016 -0.00286651 -0.00129127 -0.00448589 +EDGE3 1058 1109 -0.656046 12.5204 -6.40345 0.00187218 -0.00634739 0.130203 +EDGE3 1059 1108 -0.666997 -12.545 -6.15648 0.00273863 -0.00101674 -0.116751 +EDGE3 1060 1110 0.126571 0.00593311 -6.26836 -0.000589104 0.00432292 -0.00938123 +EDGE3 1059 1110 -0.670749 12.5307 -6.40041 0.009735 0.000874088 0.126952 +EDGE3 1060 1109 -0.679967 -12.5531 -6.1694 0.00242599 -0.0056071 -0.13027 +EDGE3 1061 1111 0.118784 -0.00889716 -6.29441 -0.000169401 -0.0113408 -0.000393405 +EDGE3 1060 1111 -0.67643 12.5292 -6.40984 0.000426927 -0.00351018 0.114537 +EDGE3 1061 1110 -0.674807 -12.5157 -6.16288 0.00871761 0.00550555 -0.124798 +EDGE3 1062 1112 0.105382 0.0180988 -6.29827 -0.0108443 -0.000692556 -0.00726544 +EDGE3 1061 1112 -0.671611 12.5378 -6.39889 0.00392201 -0.000251143 0.134209 +EDGE3 1062 1111 -0.685911 -12.536 -6.15941 -0.00755406 -0.000760265 -0.122366 +EDGE3 1063 1113 0.0881616 0.0224931 -6.30795 0.000253918 -0.00933923 -0.00344978 +EDGE3 1062 1113 -0.680954 12.5197 -6.41158 0.00690387 -0.00394083 0.12975 +EDGE3 1063 1112 -0.693239 -12.5362 -6.18083 -0.00753381 -0.00438918 -0.130141 +EDGE3 1064 1114 0.101602 0.00307337 -6.2694 -0.00659361 0.00427556 0.00404577 +EDGE3 1063 1114 -0.691795 12.5247 -6.42841 -0.00172994 -0.00555966 0.132909 +EDGE3 1064 1113 -0.698631 -12.5388 -6.1615 -0.00163118 -0.001496 -0.119288 +EDGE3 1065 1115 0.0793443 -0.00219868 -6.27819 -0.00167051 -0.00360164 0.00386995 +EDGE3 1064 1115 -0.699234 12.5191 -6.40585 0.00136968 -0.00314091 0.126146 +EDGE3 1065 1114 -0.70301 -12.5239 -6.1635 0.00371223 -0.0161884 -0.128878 +EDGE3 1066 1116 0.0673886 -0.00413551 -6.27449 -0.00228833 -0.00444908 0.0044582 +EDGE3 1065 1116 -0.724344 12.5431 -6.39829 0.00136248 -0.00528446 0.124388 +EDGE3 1066 1115 -0.714459 -12.5228 -6.15068 0.00763655 0.00356848 -0.116576 +EDGE3 1067 1117 0.0692146 0.0115431 -6.28964 -0.000991295 -0.00243402 0.00191106 +EDGE3 1066 1117 -0.725343 12.5329 -6.39238 0.00329202 -0.00198851 0.123636 +EDGE3 1067 1116 -0.698362 -12.5378 -6.15465 -0.00108499 -0.00583977 -0.127373 +EDGE3 1068 1118 0.0591034 -0.00439366 -6.28936 0.00178434 -0.000877614 -0.000206415 +EDGE3 1067 1118 -0.721072 12.5356 -6.41317 -0.00747704 0.000238211 0.124507 +EDGE3 1068 1117 -0.724828 -12.5482 -6.14913 0.00194813 0.00398907 -0.122854 +EDGE3 1069 1119 0.0513294 -0.0144649 -6.28754 -0.0066207 0.00399452 -0.00697591 +EDGE3 1068 1119 -0.73771 12.5209 -6.38839 0.00947757 0.00133226 0.124942 +EDGE3 1069 1118 -0.731358 -12.5352 -6.15417 -0.00491621 0.00261442 -0.117228 +EDGE3 1070 1120 0.0610248 -0.020333 -6.28211 0.00181477 -0.000250336 -0.00246901 +EDGE3 1069 1120 -0.726403 12.5144 -6.38889 -0.00744381 0.00560057 0.120091 +EDGE3 1070 1119 -0.733996 -12.5488 -6.15235 -0.0106787 0.00343041 -0.128956 +EDGE3 1071 1121 0.0459769 -0.0078815 -6.2772 0.000832492 0.00453685 -0.00967456 +EDGE3 1070 1121 -0.738711 12.5276 -6.40419 0.00876837 -0.00217113 0.122835 +EDGE3 1071 1120 -0.75472 -12.5294 -6.15331 -0.00576202 -0.000252038 -0.12591 +EDGE3 1072 1122 0.0254335 0.0170265 -6.26833 0.00100882 0.00122348 0.000899456 +EDGE3 1071 1122 -0.756057 12.5231 -6.39586 0.00412678 -0.00554809 0.125329 +EDGE3 1072 1121 -0.781539 -12.5095 -6.16597 -0.00225318 -0.00497592 -0.131812 +EDGE3 1073 1123 -0.00779686 0.0127342 -6.28762 -0.00181948 0.00980043 -0.000891788 +EDGE3 1072 1123 -0.768888 12.535 -6.40935 -0.00214086 -0.000726923 0.127879 +EDGE3 1073 1122 -0.765813 -12.5358 -6.16614 0.00258391 0.00376022 -0.125167 +EDGE3 1074 1124 0.00760943 0.00885651 -6.27791 -6.29263e-05 -0.00288755 -0.00255675 +EDGE3 1073 1124 -0.774086 12.5283 -6.40037 -0.000684656 -0.00204612 0.120947 +EDGE3 1074 1123 -0.774678 -12.5189 -6.14477 0.00597172 -0.000830503 -0.130335 +EDGE3 1075 1125 -0.0114419 -0.0104234 -6.27668 -0.00358681 -0.00433574 -0.00303269 +EDGE3 1074 1125 -0.780464 12.5266 -6.41603 -0.00282593 0.00522903 0.128835 +EDGE3 1075 1124 -0.776114 -12.5351 -6.14075 -0.00541994 0.00666464 -0.127735 +EDGE3 1076 1126 -0.00638068 0.00804933 -6.28179 -0.00262233 0.00523934 0.0049855 +EDGE3 1075 1126 -0.791402 12.523 -6.39566 0.00216761 -0.00189525 0.126251 +EDGE3 1076 1125 -0.777749 -12.5238 -6.15664 0.00845533 -0.00576496 -0.123574 +EDGE3 1077 1127 -0.00783565 0.00656201 -6.27246 0.00362951 -5.40804e-06 0.0128864 +EDGE3 1076 1127 -0.799878 12.5316 -6.40765 0.00281899 0.000215755 0.128125 +EDGE3 1077 1126 -0.798945 -12.5205 -6.15536 0.00680282 0.0107364 -0.114397 +EDGE3 1078 1128 -0.00407535 0.0175364 -6.28299 -0.000764176 -0.00386429 0.000772284 +EDGE3 1077 1128 -0.801422 12.5271 -6.43103 -0.00792257 0.00353903 0.117007 +EDGE3 1078 1127 -0.805814 -12.5215 -6.16464 0.00218513 0.00335927 -0.126909 +EDGE3 1079 1129 -0.0434275 0.00298766 -6.28523 0.00390387 -0.00561875 -0.00984356 +EDGE3 1078 1129 -0.814488 12.5314 -6.41883 -0.00126625 0.00332843 0.125542 +EDGE3 1079 1128 -0.814984 -12.5133 -6.15136 0.00485604 0.0062283 -0.124007 +EDGE3 1080 1130 -0.045893 -0.0118615 -6.26462 0.00396884 0.00240737 0.00349117 +EDGE3 1079 1130 -0.821212 12.5163 -6.40514 -0.00152007 -0.00215704 0.12986 +EDGE3 1080 1129 -0.814512 -12.5379 -6.1463 -0.00110188 0.00237988 -0.127855 +EDGE3 1081 1131 -0.0468393 -0.0163697 -6.30317 -0.00785785 -0.00556961 -0.00246851 +EDGE3 1080 1131 -0.832953 12.5325 -6.39371 -0.00589152 -0.00633728 0.130426 +EDGE3 1081 1130 -0.825406 -12.5183 -6.16685 0.00327162 0.00224276 -0.127414 +EDGE3 1082 1132 -0.0459218 0.00443567 -6.28107 -0.000253152 -0.000406939 -0.00594454 +EDGE3 1081 1132 -0.834901 12.5315 -6.41685 -0.00139795 0.00360313 0.126465 +EDGE3 1082 1131 -0.832122 -12.5216 -6.15362 -0.00664387 -0.0105139 -0.126425 +EDGE3 1083 1133 -0.0698737 -0.0156165 -6.27997 -0.0069158 0.000102981 -0.0122023 +EDGE3 1082 1133 -0.837836 12.5064 -6.40685 0.00226147 -0.00408177 0.124737 +EDGE3 1083 1132 -0.868362 -12.5218 -6.12821 0.000828495 -0.00682059 -0.13481 +EDGE3 1084 1134 -0.0783844 -0.00377666 -6.27044 0.00884074 0.00450091 0.0114331 +EDGE3 1083 1134 -0.853754 12.5204 -6.41936 0.00309048 -0.000604733 0.133968 +EDGE3 1084 1133 -0.85316 -12.519 -6.14943 0.0013359 0.00375342 -0.120594 +EDGE3 1085 1135 -0.0778737 0.00462773 -6.27116 -0.00677234 -0.00454022 0.00144336 +EDGE3 1084 1135 -0.868098 12.5108 -6.409 -0.00701461 -0.00268314 0.123658 +EDGE3 1085 1134 -0.857416 -12.5345 -6.1496 0.00312789 -0.00519318 -0.130011 +EDGE3 1086 1136 -0.0975345 -0.0027181 -6.27561 -0.00257942 0.000305097 0.00153199 +EDGE3 1085 1136 -0.865826 12.5104 -6.40781 0.00389424 0.00265239 0.127288 +EDGE3 1086 1135 -0.876613 -12.5188 -6.16435 0.00317809 -0.00790368 -0.126882 +EDGE3 1087 1137 -0.096935 0.00655381 -6.28275 0.00208458 0.0104077 -0.00184949 +EDGE3 1086 1137 -0.862719 12.5124 -6.40403 -0.00347192 -0.000758677 0.120583 +EDGE3 1087 1136 -0.860165 -12.5213 -6.14097 -0.00582715 0.00498118 -0.125193 +EDGE3 1088 1138 -0.109095 0.00141071 -6.27141 0.0100394 -0.000398728 -0.000848339 +EDGE3 1087 1138 -0.888182 12.5287 -6.41397 -0.00101225 0.00164728 0.125147 +EDGE3 1088 1137 -0.867487 -12.5327 -6.14717 -0.00163485 -0.0062262 -0.127204 +EDGE3 1089 1139 -0.0987892 0.00556001 -6.27803 -0.00392567 -0.00782832 -0.0043616 +EDGE3 1088 1139 -0.875542 12.5133 -6.42399 0.00989572 0.00718132 0.127078 +EDGE3 1089 1138 -0.89189 -12.5038 -6.15741 0.0067184 0.000656689 -0.122156 +EDGE3 1090 1140 -0.113966 0.00208943 -6.27087 0.000670377 -0.000912757 0.00787094 +EDGE3 1089 1140 -0.887397 12.517 -6.40755 0.00414071 0.00289189 0.127287 +EDGE3 1090 1139 -0.881523 -12.5174 -6.17016 -0.000351448 0.014347 -0.124184 +EDGE3 1091 1141 -0.124202 0.00295499 -6.27776 -0.000503642 -0.000975296 1.37225e-05 +EDGE3 1090 1141 -0.915778 12.5166 -6.41626 -0.00438083 -0.00370541 0.132603 +EDGE3 1091 1140 -0.893598 -12.5089 -6.16473 0.00592008 -0.00352478 -0.12203 +EDGE3 1092 1142 -0.129381 0.00544804 -6.29541 0.00302814 -0.00229747 0.00657968 +EDGE3 1091 1142 -0.919333 12.5131 -6.39722 -0.0136385 0.000758554 0.119932 +EDGE3 1092 1141 -0.912312 -12.497 -6.1554 -0.00714949 0.00374814 -0.125657 +EDGE3 1093 1143 -0.141795 0.00806683 -6.27518 0.0047886 -0.0058043 -0.00343647 +EDGE3 1092 1143 -0.914027 12.5149 -6.41402 0.00698689 -0.0028781 0.132316 +EDGE3 1093 1142 -0.919735 -12.525 -6.15504 0.00510256 -0.000182855 -0.125697 +EDGE3 1094 1144 -0.166421 0.00606214 -6.28296 0.000374797 0.00587916 0.0042037 +EDGE3 1093 1144 -0.936606 12.515 -6.41444 0.00162268 0.000931264 0.128989 +EDGE3 1094 1143 -0.91299 -12.5135 -6.15346 -0.00573733 0.00848649 -0.129095 +EDGE3 1095 1145 -0.154578 0.00122621 -6.27942 0.00607516 0.000997757 -0.00238887 +EDGE3 1094 1145 -0.944486 12.503 -6.3932 0.000661065 -0.00186277 0.136708 +EDGE3 1095 1144 -0.937622 -12.5044 -6.15589 -0.00136383 -0.00957742 -0.130975 +EDGE3 1096 1146 -0.165094 0.00209877 -6.294 -0.00433526 0.00127575 -0.00394661 +EDGE3 1095 1146 -0.939003 12.505 -6.39882 0.0044036 0.00202793 0.123312 +EDGE3 1097 1147 -0.174899 -0.00612051 -6.27081 0.00204433 0.007099 0.00186977 +EDGE3 1096 1145 -0.955157 -12.5163 -6.17346 0.00409817 0.006041 -0.127833 +EDGE3 1096 1147 -0.961609 12.5179 -6.39155 0.00204675 -0.00390506 0.133012 +EDGE3 1097 1146 -0.94185 -12.5076 -6.12955 -0.00377234 -0.000429559 -0.128042 +EDGE3 1098 1148 -0.183013 0.0101433 -6.28188 -0.00189697 -0.00206328 -0.00286082 +EDGE3 1097 1148 -0.965557 12.5181 -6.41087 0.00258561 0.000486965 0.13112 +EDGE3 1099 1149 -0.182364 0.0068286 -6.27621 0.000141089 0.000234572 -0.000813911 +EDGE3 1098 1147 -0.949378 -12.5049 -6.15245 -0.00756487 0.0020052 -0.124889 +EDGE3 1098 1149 -0.968069 12.5191 -6.39378 -0.000471492 -0.00097045 0.125785 +EDGE3 1099 1148 -0.970387 -12.5038 -6.18284 0.00485415 -0.00384521 -0.121302 +EDGE3 1100 1150 -0.197281 0.0098871 -6.28516 -0.00484884 0.00676031 0.00621865 +EDGE3 1099 1150 -0.97585 12.5337 -6.40475 3.53013e-05 -0.00710516 0.124239 +EDGE3 1100 1149 -0.966361 -12.5097 -6.15233 -0.000943084 0.00651667 -0.118789 +EDGE3 1101 1151 -0.192477 -0.00135961 -6.28448 0.00107028 0.00826492 0.000232148 +EDGE3 1100 1151 -0.993534 12.4989 -6.41365 -0.00214601 0.00424887 0.127495 +EDGE3 1102 1152 -0.20576 0.00479457 -6.28118 -0.00240482 -0.00546877 -0.000109253 +EDGE3 1101 1150 -0.97874 -12.5071 -6.15667 0.00297478 0.00446162 -0.121113 +EDGE3 1101 1152 -1.00439 12.5047 -6.40834 -0.00642854 0.00221269 0.119191 +EDGE3 1102 1151 -1.02303 -12.4903 -6.16081 0.00936253 0.0053886 -0.117043 +EDGE3 1103 1153 -0.227326 0.0151366 -6.2743 0.000669211 -0.00327835 -0.00113438 +EDGE3 1102 1153 -0.991906 12.4954 -6.41187 0.000557244 -0.00457961 0.128665 +EDGE3 1103 1152 -1.00386 -12.4961 -6.1534 0.00530795 0.00183167 -0.128995 +EDGE3 1104 1154 -0.20562 -0.0103333 -6.28251 -0.000770337 0.00495012 0.00490129 +EDGE3 1103 1154 -1.01864 12.5289 -6.4025 -0.00954296 -0.00467357 0.124002 +EDGE3 1104 1153 -1.01472 -12.505 -6.14222 0.000943881 -0.00237764 -0.131712 +EDGE3 1105 1155 -0.233487 0.0156592 -6.2919 -0.00307039 0.00736793 0.000524926 +EDGE3 1104 1155 -1.01576 12.4977 -6.39919 -0.000217362 -0.000540274 0.125859 +EDGE3 1105 1154 -0.998059 -12.5003 -6.14902 -0.00190637 0.00431375 -0.131983 +EDGE3 1106 1156 -0.249008 0.0111789 -6.26149 -0.00795216 0.000400304 0.0054032 +EDGE3 1105 1156 -1.04198 12.5149 -6.40396 -0.00103399 -0.00173012 0.130534 +EDGE3 1106 1155 -1.03128 -12.5115 -6.1508 -0.00334882 -0.00254142 -0.123098 +EDGE3 1107 1157 -0.267114 -0.0108505 -6.2652 -0.00424052 0.00224323 0.00385502 +EDGE3 1106 1157 -1.04186 12.518 -6.39461 0.00530245 0.000875085 0.128863 +EDGE3 1107 1156 -1.03029 -12.4993 -6.14479 -0.00488674 -0.00379305 -0.120569 +EDGE3 1108 1158 -0.267896 -0.00180163 -6.274 0.00481841 0.000862869 0.00374872 +EDGE3 1107 1158 -1.04674 12.5028 -6.39934 0.0114884 -0.00119308 0.126397 +EDGE3 1108 1157 -1.03347 -12.4941 -6.14574 -0.00195252 -0.000725568 -0.126743 +EDGE3 1109 1159 -0.262922 0.00307386 -6.27473 0.000710437 -0.00397651 4.80272e-05 +EDGE3 1108 1159 -1.06708 12.4959 -6.39241 -0.00420049 0.000143168 0.12012 +EDGE3 1110 1160 -0.291329 0.001467 -6.29047 -0.0056683 -0.000296991 0.00187339 +EDGE3 1109 1158 -1.04916 -12.4837 -6.14632 -0.00189699 -0.00340629 -0.123477 +EDGE3 1109 1160 -1.07353 12.5091 -6.39514 -0.00179805 0.00625127 0.124588 +EDGE3 1110 1159 -1.05825 -12.4965 -6.1482 -0.00394227 0.00281992 -0.122474 +EDGE3 1111 1161 -0.290128 -0.000431997 -6.26954 0.00632831 -0.000248789 0.009529 +EDGE3 1110 1161 -1.07269 12.5087 -6.40273 -0.00984037 0.00413139 0.130199 +EDGE3 1111 1160 -1.07036 -12.4982 -6.16617 -0.00141526 -0.00304624 -0.114398 +EDGE3 1112 1162 -0.290437 0.0135134 -6.28197 -7.83919e-05 -0.000368196 -0.00634729 +EDGE3 1111 1162 -1.07818 12.4999 -6.41405 -0.00906332 -0.00118348 0.118044 +EDGE3 1112 1161 -1.07025 -12.4968 -6.16223 -0.000366692 -0.00125681 -0.130316 +EDGE3 1113 1163 -0.305132 0.0072518 -6.28435 -0.00378351 -0.00675076 -0.00867628 +EDGE3 1112 1163 -1.09356 12.4986 -6.41101 0.011558 -0.000753522 0.116756 +EDGE3 1114 1164 -0.292756 0.0083907 -6.27806 0.00142468 0.000935005 -0.00275041 +EDGE3 1113 1162 -1.06703 -12.4818 -6.12884 -0.00276761 -0.00258534 -0.128452 +EDGE3 1113 1164 -1.10781 12.4909 -6.39269 -0.00430571 -0.00982759 0.125231 +EDGE3 1114 1163 -1.07098 -12.4849 -6.16523 -8.84263e-06 -1.10456e-05 -0.13083 +EDGE3 1115 1165 -0.317373 0.000611869 -6.27525 -0.0102376 0.00122091 -0.00851337 +EDGE3 1114 1165 -1.10531 12.4968 -6.38615 0.00611183 -0.00311739 0.134007 +EDGE3 1116 1166 -0.315932 0.00761311 -6.27221 -0.00453342 5.68516e-05 -0.00233333 +EDGE3 1115 1164 -1.1022 -12.4953 -6.15233 -0.00179131 -0.000770119 -0.124698 +EDGE3 1115 1166 -1.13358 12.514 -6.40399 -0.00524425 0.00238572 0.129481 +EDGE3 1116 1165 -1.09707 -12.4932 -6.15464 -0.00187637 0.00141395 -0.13028 +EDGE3 1117 1167 -0.329076 0.00306938 -6.26731 -0.0035933 0.00437327 0.00163566 +EDGE3 1116 1167 -1.11187 12.4821 -6.40888 -0.00758156 0.000363913 0.11873 +EDGE3 1117 1166 -1.10518 -12.4987 -6.13346 -0.00527378 -0.00759503 -0.121498 +EDGE3 1118 1168 -0.334661 0.00281413 -6.2652 -0.00258763 0.006578 0.000108296 +EDGE3 1117 1168 -1.13046 12.4936 -6.40269 -0.00489374 -0.00309957 0.137602 +EDGE3 1118 1167 -1.12059 -12.4988 -6.14696 -0.0022611 0.00222554 -0.135732 +EDGE3 1119 1169 -0.370959 0.0134238 -6.27035 0.00805687 -0.00194641 -0.000756692 +EDGE3 1118 1169 -1.13911 12.4813 -6.40489 -0.00286812 0.00121766 0.114926 +EDGE3 1119 1168 -1.13137 -12.4763 -6.15619 -0.00235513 0.00589098 -0.122065 +EDGE3 1120 1170 -0.354939 0.0120693 -6.26792 -0.00504379 -0.00662669 0.00211435 +EDGE3 1119 1170 -1.12717 12.4919 -6.39848 -0.00532776 0.000484042 0.121484 +EDGE3 1120 1169 -1.1338 -12.4896 -6.15676 -0.00700229 -0.000769194 -0.127495 +EDGE3 1121 1171 -0.368385 -0.0117644 -6.24798 -0.00590976 -0.00514894 0.00455674 +EDGE3 1120 1171 -1.15302 12.4822 -6.40702 0.00215277 -0.00862968 0.126863 +EDGE3 1121 1170 -1.12311 -12.4826 -6.14444 0.0063806 -0.00438645 -0.127325 +EDGE3 1122 1172 -0.394286 -0.00407713 -6.27858 -0.00485079 0.000317228 0.00493517 +EDGE3 1121 1172 -1.18002 12.4972 -6.38416 -0.00302051 -0.000830927 0.131673 +EDGE3 1122 1171 -1.14042 -12.4763 -6.13725 -0.00172928 -0.00624078 -0.124985 +EDGE3 1123 1173 -0.366899 -0.00161897 -6.29175 -0.00508234 0.0109501 0.00786028 +EDGE3 1122 1173 -1.16627 12.4765 -6.39602 -0.00193793 0.00243046 0.126608 +EDGE3 1123 1172 -1.16721 -12.4911 -6.1294 0.00140047 0.00701018 -0.131134 +EDGE3 1124 1174 -0.383681 -0.01491 -6.25964 0.00419434 -0.00423263 -0.0100899 +EDGE3 1123 1174 -1.17847 12.4846 -6.4099 0.0029396 0.00295888 0.13103 +EDGE3 1124 1173 -1.16932 -12.4734 -6.15568 0.00555355 0.00287042 -0.128975 +EDGE3 1125 1175 -0.400121 0.0076747 -6.27039 -0.00588675 0.00102817 0.00122083 +EDGE3 1124 1175 -1.16705 12.4776 -6.38223 0.00174903 0.00844701 0.128263 +EDGE3 1125 1174 -1.15388 -12.4636 -6.1313 0.00236248 0.00639083 -0.12525 +EDGE3 1126 1176 -0.393196 0.000278181 -6.26279 0.0111172 0.00650104 0.00118288 +EDGE3 1125 1176 -1.20199 12.4682 -6.39378 -0.0001634 -0.00334664 0.131098 +EDGE3 1126 1175 -1.17806 -12.4935 -6.14965 -0.00672026 -0.00763399 -0.123712 +EDGE3 1127 1177 -0.408955 -0.0106567 -6.28594 -0.00143213 0.00440894 -0.00121945 +EDGE3 1126 1177 -1.20365 12.4795 -6.39071 -0.00227853 0.000721709 0.123161 +EDGE3 1127 1176 -1.18872 -12.4777 -6.1465 -0.0055142 0.00356504 -0.135225 +EDGE3 1128 1178 -0.404673 0.00502308 -6.26392 0.00857917 0.00294463 -0.00614155 +EDGE3 1127 1178 -1.21329 12.4818 -6.38577 0.0010936 0.00480299 0.125881 +EDGE3 1128 1177 -1.17338 -12.4754 -6.15075 0.00366834 0.00538329 -0.127241 +EDGE3 1129 1179 -0.434678 0.00753375 -6.2782 0.00371986 -0.0037118 -0.000104051 +EDGE3 1128 1179 -1.20476 12.4635 -6.38293 -0.00166745 0.0004277 0.129091 +EDGE3 1129 1178 -1.18936 -12.4667 -6.13828 -0.00173314 0.00140469 -0.126736 +EDGE3 1130 1180 -0.446793 -0.00125806 -6.25365 0.00727707 0.00129413 0.00574578 +EDGE3 1129 1180 -1.23446 12.4679 -6.40268 -0.00230645 -0.00735853 0.124157 +EDGE3 1130 1179 -1.21512 -12.4798 -6.12957 -0.00112857 -0.0048296 -0.122774 +EDGE3 1131 1181 -0.43429 -0.00163414 -6.25789 -0.00698041 -0.011099 -0.00453026 +EDGE3 1130 1181 -1.24254 12.464 -6.38143 0.00771033 0.0032751 0.124741 +EDGE3 1131 1180 -1.21108 -12.4698 -6.14472 -9.11429e-05 -0.00941339 -0.126362 +EDGE3 1132 1182 -0.451668 -0.00670992 -6.264 -0.00265706 0.000763521 0.00442736 +EDGE3 1131 1182 -1.23863 12.4713 -6.4022 -0.00241968 -0.00585911 0.126309 +EDGE3 1132 1181 -1.22861 -12.4557 -6.12607 0.00604151 0.00134307 -0.123231 +EDGE3 1133 1183 -0.46563 -0.00588496 -6.27225 -0.00761845 -0.00399791 -0.000888786 +EDGE3 1132 1183 -1.23214 12.4801 -6.37229 0.0011017 0.00141825 0.123807 +EDGE3 1133 1182 -1.22353 -12.4654 -6.12973 0.00569313 -0.00361411 -0.121587 +EDGE3 1134 1184 -0.474359 -0.0113289 -6.26268 0.00379009 0.00436689 0.00194472 +EDGE3 1133 1184 -1.2414 12.4671 -6.39577 -0.000649172 0.00294076 0.127997 +EDGE3 1134 1183 -1.23828 -12.4574 -6.14626 0.00510683 -0.000745595 -0.132677 +EDGE3 1135 1185 -0.474928 -0.00563032 -6.2688 -0.00218833 -0.00994081 0.0110615 +EDGE3 1134 1185 -1.2545 12.467 -6.38094 0.000409748 0.00553728 0.127049 +EDGE3 1135 1184 -1.23746 -12.4592 -6.13676 -0.0092394 0.000263692 -0.126086 +EDGE3 1136 1186 -0.482346 -0.00418313 -6.26197 0.00323975 -0.00671356 -0.0116578 +EDGE3 1135 1186 -1.27084 12.453 -6.394 -0.00182894 0.00443698 0.126412 +EDGE3 1136 1185 -1.25762 -12.4344 -6.14642 -0.0155331 0.000385683 -0.134145 +EDGE3 1137 1187 -0.49667 2.46165e-05 -6.25282 -0.00412981 -0.0098808 0.000812814 +EDGE3 1136 1187 -1.27627 12.4508 -6.38308 0.0112331 -0.0034759 0.119962 +EDGE3 1137 1186 -1.27274 -12.4508 -6.15342 -0.0102071 0.000189771 -0.123034 +EDGE3 1138 1188 -0.510962 -0.00449185 -6.29165 0.00883581 -4.61351e-05 0.00687042 +EDGE3 1137 1188 -1.27963 12.4535 -6.4008 -0.00281529 -0.00265015 0.120812 +EDGE3 1138 1187 -1.26168 -12.4533 -6.10848 0.00470036 -0.00557284 -0.122271 +EDGE3 1139 1189 -0.502879 -0.00259996 -6.251 -0.00639205 -0.00160921 -0.00314994 +EDGE3 1138 1189 -1.3073 12.4334 -6.40493 -0.00125572 0.00320951 0.122231 +EDGE3 1139 1188 -1.26125 -12.4527 -6.1372 -0.00349041 0.000443425 -0.123466 +EDGE3 1140 1190 -0.505676 -0.00320927 -6.2545 0.00355525 0.00459492 -0.00177641 +EDGE3 1139 1190 -1.29707 12.4539 -6.39549 -0.000248724 0.00508721 0.132889 +EDGE3 1140 1189 -1.29575 -12.4314 -6.14881 0.00381312 0.00284565 -0.123623 +EDGE3 1141 1191 -0.551153 -0.0201324 -6.25561 -0.00417653 0.0039219 -0.00366754 +EDGE3 1140 1191 -1.32546 12.4504 -6.37074 -0.00518676 -0.00208013 0.126404 +EDGE3 1141 1190 -1.29858 -12.45 -6.13345 -0.000487034 -0.00458502 -0.126707 +EDGE3 1142 1192 -0.538303 -0.00465327 -6.26118 0.00870901 0.00776655 -0.00114944 +EDGE3 1141 1192 -1.33001 12.4323 -6.38018 0.00930426 0.00559845 0.130761 +EDGE3 1142 1191 -1.28876 -12.4357 -6.12471 -0.00976616 0.00254014 -0.135864 +EDGE3 1143 1193 -0.536172 -0.00665845 -6.24827 -0.00100424 -0.000314238 0.00418091 +EDGE3 1142 1193 -1.32558 12.4376 -6.38176 0.00110592 -0.00381456 0.117852 +EDGE3 1143 1192 -1.32285 -12.4549 -6.13039 -0.00447119 -0.00769086 -0.124213 +EDGE3 1144 1194 -0.557223 -0.00414318 -6.24913 0.00020639 -0.00883285 0.0052873 +EDGE3 1143 1194 -1.32877 12.4599 -6.38804 -6.73799e-05 0.00829707 0.116383 +EDGE3 1144 1193 -1.3185 -12.4478 -6.13446 0.00111132 0.00401293 -0.121848 +EDGE3 1145 1195 -0.560861 0.00253176 -6.25091 0.00247524 0.000115599 -0.00455864 +EDGE3 1144 1195 -1.32834 12.4463 -6.38486 -0.000986783 0.000957479 0.119914 +EDGE3 1145 1194 -1.29091 -12.4488 -6.11485 0.00232274 -0.00933427 -0.118718 +EDGE3 1146 1196 -0.551998 0.00155121 -6.26379 0.00505227 0.00473573 -0.00217483 +EDGE3 1145 1196 -1.35228 12.4529 -6.39977 -0.00222373 0.00316324 0.128741 +EDGE3 1146 1195 -1.32114 -12.4574 -6.13544 0.00633365 -0.00753104 -0.12892 +EDGE3 1147 1197 -0.562501 0.00942395 -6.26038 0.0033491 0.000513356 -0.00189708 +EDGE3 1146 1197 -1.35097 12.43 -6.38535 -0.00737338 0.00443769 0.1223 +EDGE3 1147 1196 -1.33939 -12.4371 -6.14619 -0.00830984 0.00217976 -0.123683 +EDGE3 1148 1198 -0.590994 0.0192849 -6.2698 -0.00202452 -0.00368814 -0.00685307 +EDGE3 1147 1198 -1.3738 12.4478 -6.38487 0.00222474 -0.00058079 0.119631 +EDGE3 1148 1197 -1.33111 -12.4588 -6.12577 -0.00253556 -0.000320812 -0.130778 +EDGE3 1149 1199 -0.587603 -0.000896544 -6.2723 0.00326635 0.000227711 -0.000139426 +EDGE3 1148 1199 -1.37133 12.4424 -6.38131 -0.000849926 0.00610281 0.125046 +EDGE3 1149 1198 -1.3548 -12.4257 -6.1194 0.00751652 0.00605468 -0.118622 +EDGE3 1150 1200 -0.59432 -0.00309264 -6.26435 0.00662331 0.00768897 -0.00616144 +EDGE3 1149 1200 -1.37716 12.4124 -6.38937 0.00182846 0.00877233 0.132345 +EDGE3 1150 1199 -1.35851 -12.4496 -6.13635 0.00781719 -0.000305581 -0.130435 +EDGE3 1151 1201 -0.586411 -0.00197727 -6.25899 -1.80105e-05 0.00136251 0.0045931 +EDGE3 1150 1201 -1.39733 12.4237 -6.38844 0.0025011 0.00630897 0.11704 +EDGE3 1151 1200 -1.37493 -12.4266 -6.12415 0.00570452 0.00149984 -0.12929 +EDGE3 1152 1202 -0.595211 -0.000157541 -6.26593 0.00210539 0.00568672 0.00270636 +EDGE3 1151 1202 -1.39162 12.4349 -6.38536 0.000541972 0.00410612 0.120554 +EDGE3 1152 1201 -1.37092 -12.4439 -6.12784 0.00295538 0.00150208 -0.126699 +EDGE3 1153 1203 -0.635168 -0.00486661 -6.24583 0.00282225 -0.00286902 0.00439298 +EDGE3 1152 1203 -1.41501 12.4461 -6.37822 -0.000295701 0.00348059 0.129702 +EDGE3 1153 1202 -1.37921 -12.418 -6.14436 -0.00451733 0.00483192 -0.124277 +EDGE3 1154 1204 -0.600757 0.00226591 -6.24939 -0.00655518 0.00339705 0.00772898 +EDGE3 1153 1204 -1.42801 12.4329 -6.37841 0.00189543 -0.00580807 0.128183 +EDGE3 1154 1203 -1.39093 -12.4048 -6.12743 -0.0044348 0.000535885 -0.122091 +EDGE3 1155 1205 -0.627949 -0.00160153 -6.26067 -0.00543475 -0.00255809 0.000653994 +EDGE3 1154 1205 -1.41601 12.4263 -6.39838 0.00313799 0.00116731 0.128462 +EDGE3 1155 1204 -1.41182 -12.4276 -6.1253 0.000853007 -0.00487916 -0.127081 +EDGE3 1156 1206 -0.636788 -0.00066393 -6.24982 0.0024096 0.00113378 0.00552543 +EDGE3 1155 1206 -1.43575 12.4268 -6.37132 -0.0014241 0.00499067 0.127249 +EDGE3 1156 1205 -1.40524 -12.4303 -6.13553 -0.00177166 0.00326531 -0.127681 +EDGE3 1157 1207 -0.6448 -0.0165122 -6.25331 0.00430846 -0.000585867 -0.00118496 +EDGE3 1156 1207 -1.45617 12.421 -6.4 0.0117396 -0.00686455 0.131121 +EDGE3 1157 1206 -1.4231 -12.4117 -6.1256 -0.000129109 0.00215538 -0.130824 +EDGE3 1158 1208 -0.663585 -0.00767057 -6.25304 0.00560569 0.000647777 0.00285543 +EDGE3 1157 1208 -1.43514 12.4089 -6.3803 0.00325477 -0.00553079 0.125687 +EDGE3 1158 1207 -1.41294 -12.4241 -6.11132 0.00610925 -0.00106644 -0.125066 +EDGE3 1159 1209 -0.67398 -0.0106482 -6.23675 -0.00153959 -0.00836891 -0.0116235 +EDGE3 1158 1209 -1.44371 12.4257 -6.36928 -0.0062069 0.00536281 0.117764 +EDGE3 1159 1208 -1.43823 -12.4233 -6.10205 -0.000103496 -0.00190288 -0.124737 +EDGE3 1160 1210 -0.679385 0.013206 -6.25238 -0.000164712 0.000626074 -0.00497088 +EDGE3 1160 1209 -1.44299 -12.4073 -6.1134 -0.00465573 0.00956272 -0.127114 +EDGE3 1159 1210 -1.44685 12.4045 -6.38246 0.00955379 0.00315166 0.122554 +EDGE3 1161 1211 -0.679047 -0.0135624 -6.25026 -0.00289291 -0.00138044 -0.00169663 +EDGE3 1160 1211 -1.45841 12.4152 -6.36943 0.00100184 -0.00666248 0.126239 +EDGE3 1161 1210 -1.45473 -12.4167 -6.13224 0.00589661 0.000328984 -0.127899 +EDGE3 1162 1212 -0.686377 -0.00321335 -6.25032 -0.00135121 -0.0032389 -0.00222297 +EDGE3 1161 1212 -1.47143 12.4137 -6.35941 0.00395357 -0.000711455 0.130383 +EDGE3 1162 1211 -1.44657 -12.4068 -6.11333 0.0049946 0.00233977 -0.118389 +EDGE3 1163 1213 -0.701179 -0.00604158 -6.25104 0.00856247 0.000594793 0.0035117 +EDGE3 1162 1213 -1.4842 12.4078 -6.37056 -0.00703041 -0.00157224 0.132491 +EDGE3 1163 1212 -1.46823 -12.4002 -6.12652 0.00633445 0.000530256 -0.118726 +EDGE3 1164 1214 -0.70435 -0.0047501 -6.2457 0.0048552 0.000659478 0.00619372 +EDGE3 1163 1214 -1.50486 12.4034 -6.37587 -0.0173164 0.00211157 0.137258 +EDGE3 1164 1213 -1.47391 -12.4096 -6.12384 -0.000689562 -0.00470653 -0.118704 +EDGE3 1165 1215 -0.70691 -0.00886458 -6.22262 -0.00044565 0.000692605 -0.00885956 +EDGE3 1165 1214 -1.46885 -12.4131 -6.12485 -0.00380164 -0.0130799 -0.125222 +EDGE3 1164 1215 -1.50313 12.4 -6.39051 0.000789801 -0.0018477 0.126353 +EDGE3 1166 1216 -0.705393 0.0045749 -6.23281 -0.00086591 -0.000245656 -0.00196658 +EDGE3 1165 1216 -1.51739 12.3849 -6.36889 0.00041872 -0.00251242 0.135977 +EDGE3 1166 1215 -1.48058 -12.3936 -6.11618 -0.00219755 0.00496567 -0.125051 +EDGE3 1167 1217 -0.718231 -0.0228425 -6.22801 0.0106428 -0.00186047 0.00153311 +EDGE3 1166 1217 -1.51621 12.3991 -6.36484 0.00162031 0.00261421 0.123418 +EDGE3 1168 1218 -0.73265 0.00157157 -6.26599 -0.00473128 -0.00678256 0.00318402 +EDGE3 1167 1216 -1.48909 -12.409 -6.11174 0.00740139 0.00395354 -0.113494 +EDGE3 1167 1218 -1.53665 12.3936 -6.36287 0.0091274 -0.00551667 0.128787 +EDGE3 1168 1217 -1.50762 -12.4263 -6.10888 0.0108017 -0.00142379 -0.125029 +EDGE3 1169 1219 -0.735563 0.00484933 -6.23511 0.00427211 -0.00627739 -0.00159464 +EDGE3 1168 1219 -1.53195 12.3919 -6.36695 -0.00516485 0.00177597 0.125843 +EDGE3 1169 1218 -1.50259 -12.3838 -6.11001 0.00571677 0.00222725 -0.117759 +EDGE3 1170 1220 -0.7572 0.0303086 -6.25535 0.00505249 -0.00414314 -0.00583963 +EDGE3 1169 1220 -1.53628 12.3864 -6.35881 -0.00390475 0.00101454 0.126971 +EDGE3 1170 1219 -1.50543 -12.3905 -6.109 -0.00324758 -0.00668458 -0.133453 +EDGE3 1171 1221 -0.753061 0.00369138 -6.23582 -0.000606474 -0.00228344 -0.00372008 +EDGE3 1170 1221 -1.53767 12.3826 -6.35654 0.00349867 -0.00114773 0.129268 +EDGE3 1171 1220 -1.5164 -12.3859 -6.11212 0.00336792 -0.0123343 -0.130266 +EDGE3 1172 1222 -0.763491 0.0106626 -6.23321 -0.000962191 -0.00369468 0.00694799 +EDGE3 1171 1222 -1.57513 12.3776 -6.37447 -0.00033356 -0.00826851 0.123252 +EDGE3 1172 1221 -1.52038 -12.3764 -6.10855 -0.00396646 -0.00158179 -0.119533 +EDGE3 1173 1223 -0.763488 -0.0107969 -6.24917 -0.00985355 -0.00141101 0.00847526 +EDGE3 1172 1223 -1.56717 12.3823 -6.35321 0.00511763 0.00327859 0.11817 +EDGE3 1173 1222 -1.53533 -12.3802 -6.1047 -0.00371159 -0.00354694 -0.127693 +EDGE3 1174 1224 -0.777216 -0.0098318 -6.23862 -0.0017637 -0.0043056 0.000635683 +EDGE3 1173 1224 -1.56544 12.3868 -6.34448 -0.00549841 -0.0021243 0.120657 +EDGE3 1174 1223 -1.52344 -12.3975 -6.12241 0.00210697 -0.0061466 -0.12554 +EDGE3 1175 1225 -0.781507 -0.0112002 -6.24903 0.00659307 -0.00539597 -0.00512159 +EDGE3 1174 1225 -1.58304 12.385 -6.37081 0.000650196 -0.00327674 0.133791 +EDGE3 1175 1224 -1.54609 -12.3768 -6.10079 0.00831849 -0.00136114 -0.121132 +EDGE3 1176 1226 -0.804981 0.00202589 -6.24009 -0.00346532 -0.00218222 -0.00376092 +EDGE3 1175 1226 -1.57726 12.3745 -6.35364 0.00628964 -0.0058507 0.127389 +EDGE3 1176 1225 -1.5553 -12.3718 -6.1218 -0.00660064 0.00253584 -0.129355 +EDGE3 1177 1227 -0.793313 -0.00266463 -6.23934 -0.00376673 0.00756279 -0.00919838 +EDGE3 1176 1227 -1.58679 12.3671 -6.36993 -0.00293694 0.00735976 0.122177 +EDGE3 1177 1226 -1.55463 -12.3735 -6.09386 0.00425956 0.00556456 -0.129283 +EDGE3 1178 1228 -0.81202 0.00839967 -6.23836 -0.00342949 -0.00510324 0.000481975 +EDGE3 1177 1228 -1.58444 12.3793 -6.34453 -0.0130475 0.00234623 0.131364 +EDGE3 1178 1227 -1.56988 -12.3775 -6.09538 0.00170343 -0.00855224 -0.118549 +EDGE3 1179 1229 -0.819681 -0.00146664 -6.21548 0.0024772 0.00142246 -0.0010728 +EDGE3 1178 1229 -1.60239 12.3775 -6.33719 -0.00364842 0.000428227 0.116919 +EDGE3 1179 1228 -1.57759 -12.3528 -6.10399 0.000922843 -0.0023273 -0.125846 +EDGE3 1180 1230 -0.826948 0.00702994 -6.23185 -0.000792159 0.00573375 0.00366799 +EDGE3 1179 1230 -1.60736 12.3585 -6.36222 -0.00883054 -0.00284198 0.130768 +EDGE3 1180 1229 -1.58947 -12.3665 -6.11719 -0.00318914 -0.014479 -0.131971 +EDGE3 1181 1231 -0.819097 -0.0144827 -6.22762 0.0164132 -0.00254258 -0.00242639 +EDGE3 1180 1231 -1.64084 12.3531 -6.36304 -0.00125319 -0.00220802 0.124162 +EDGE3 1181 1230 -1.59255 -12.3911 -6.10882 -0.00121015 -0.000936434 -0.134288 +EDGE3 1182 1232 -0.849732 -0.0104626 -6.21429 0.00518874 0.00475526 -0.0070891 +EDGE3 1181 1232 -1.64576 12.3513 -6.35973 -0.00397475 -0.00255912 0.139053 +EDGE3 1183 1233 -0.848792 0.00276789 -6.24248 0.00663918 0.000641935 0.00324398 +EDGE3 1182 1231 -1.60136 -12.3521 -6.1019 -0.00189278 0.0154098 -0.12539 +EDGE3 1182 1233 -1.63958 12.3544 -6.35841 0.00241164 -0.00278116 0.132014 +EDGE3 1183 1232 -1.59689 -12.3727 -6.11118 -0.00526534 -0.000953964 -0.123822 +EDGE3 1184 1234 -0.858642 -0.00535503 -6.22055 -0.00154394 -0.0026196 0.00413952 +EDGE3 1183 1234 -1.65459 12.3641 -6.35624 0.000139436 -0.00187189 0.122093 +EDGE3 1185 1235 -0.867928 0.0151242 -6.2251 0.0040971 -0.00499601 -0.00218141 +EDGE3 1184 1233 -1.62664 -12.3624 -6.11224 0.000566359 -0.00664919 -0.122561 +EDGE3 1184 1235 -1.65701 12.3592 -6.34187 -0.0145183 0.00303589 0.12618 +EDGE3 1185 1234 -1.62961 -12.359 -6.10785 -0.000682001 -0.0154569 -0.117635 +EDGE3 1186 1236 -0.880972 0.00449595 -6.2451 0.00284941 0.00389047 -0.000919068 +EDGE3 1185 1236 -1.67055 12.3545 -6.33324 -0.0042438 0.00563803 0.138882 +EDGE3 1186 1235 -1.62868 -12.3518 -6.10943 -0.0104544 0.0021298 -0.130561 +EDGE3 1187 1237 -0.897219 0.00473512 -6.21713 0.00305191 0.00129906 -0.000465018 +EDGE3 1186 1237 -1.67452 12.3573 -6.34577 0.00361794 -0.000286836 0.129597 +EDGE3 1187 1236 -1.64955 -12.3376 -6.09292 -0.00624895 0.0102394 -0.12062 +EDGE3 1188 1238 -0.894591 0.0157677 -6.22303 0.000837784 0.00226877 -0.00314804 +EDGE3 1187 1238 -1.68594 12.3533 -6.34927 0.00391305 0.00859562 0.119104 +EDGE3 1188 1237 -1.61997 -12.3579 -6.08902 0.00981328 0.00253788 -0.114168 +EDGE3 1189 1239 -0.910828 -0.00292587 -6.2126 -0.00368063 -0.00993909 0.00374927 +EDGE3 1188 1239 -1.69598 12.3509 -6.3315 -0.00334413 0.0104578 0.130202 +EDGE3 1189 1238 -1.64359 -12.3495 -6.1157 0.00518003 -0.00876998 -0.128567 +EDGE3 1190 1240 -0.894763 -0.00565593 -6.215 0.00231346 0.00537624 0.00327782 +EDGE3 1189 1240 -1.69179 12.3428 -6.33005 0.00673863 0.00593239 0.128766 +EDGE3 1190 1239 -1.66718 -12.3422 -6.09574 -0.00459611 -0.00989935 -0.130184 +EDGE3 1191 1241 -0.913107 -0.00505721 -6.20033 -0.00218368 -0.00149836 0.00205478 +EDGE3 1190 1241 -1.69225 12.3359 -6.34792 0.0011659 0.00249614 0.136879 +EDGE3 1191 1240 -1.6619 -12.3393 -6.09342 0.00197051 -0.0100604 -0.120317 +EDGE3 1192 1242 -0.917034 0.00391925 -6.21638 0.00537179 -0.00126021 -0.00268889 +EDGE3 1191 1242 -1.70746 12.3452 -6.33797 -0.00416107 0.00363011 0.12321 +EDGE3 1192 1241 -1.65792 -12.3381 -6.10052 0.0064255 -0.00338841 -0.129358 +EDGE3 1193 1243 -0.92281 -0.0209285 -6.2046 0.00541615 -0.000899427 0.00097326 +EDGE3 1192 1243 -1.7232 12.3214 -6.33879 0.000147049 0.000997954 0.125844 +EDGE3 1193 1242 -1.67952 -12.3498 -6.09598 0.00570572 0.00126854 -0.122115 +EDGE3 1194 1244 -0.932399 0.0136746 -6.20022 0.000373589 0.000758173 -0.00511807 +EDGE3 1193 1244 -1.71445 12.3427 -6.33502 -0.00246144 0.00148607 0.120707 +EDGE3 1194 1243 -1.67639 -12.3325 -6.10116 0.000575354 -0.0006999 -0.128711 +EDGE3 1195 1245 -0.947068 -0.0159339 -6.21965 -0.0020889 0.00343984 -0.000447912 +EDGE3 1194 1245 -1.74262 12.3433 -6.32067 -0.00279331 -0.00139498 0.121312 +EDGE3 1195 1244 -1.6975 -12.3218 -6.10274 -0.00139401 -0.00598316 -0.121729 +EDGE3 1196 1246 -0.956521 0.00284064 -6.1981 0.00465378 -0.00846642 0.00434723 +EDGE3 1195 1246 -1.74668 12.3239 -6.33238 0.0045658 0.00689945 0.114054 +EDGE3 1196 1245 -1.71997 -12.3114 -6.09187 0.00447424 0.00354544 -0.123122 +EDGE3 1197 1247 -0.964136 0.0249829 -6.21537 0.00575565 0.00700707 -0.00216186 +EDGE3 1196 1247 -1.75594 12.3181 -6.35857 -0.0105942 0.00717302 0.131755 +EDGE3 1197 1246 -1.7055 -12.3234 -6.08857 0.00557127 0.00564596 -0.121938 +EDGE3 1198 1248 -0.942183 0.0212091 -6.21479 -0.00304121 -0.00543524 0.00371356 +EDGE3 1197 1248 -1.74687 12.3083 -6.3571 0.00406631 0.00278414 0.122172 +EDGE3 1198 1247 -1.72927 -12.3218 -6.07901 0.00083757 0.00306922 -0.122826 +EDGE3 1199 1249 -0.969275 0.00929195 -6.20055 0.0066406 -0.010653 -0.00292078 +EDGE3 1198 1249 -1.75837 12.3007 -6.33481 0.00463599 0.0100471 0.114156 +EDGE3 1199 1248 -1.74687 -12.2941 -6.0752 0.00121964 0.005099 -0.123172 +EDGE3 1199 1250 -1.76289 12.3132 -6.34708 -0.000409603 -0.00500224 0.122606 +EDGE3 1200 1250 -0.972567 -0.0135679 -6.1963 0.0036266 0.0118962 0.00300274 +EDGE3 1201 1251 -1.00084 -0.023625 -6.20128 0.0157634 0.00505926 0.00292634 +EDGE3 1200 1249 -1.72918 -12.3026 -6.06105 -0.000784109 0.0053741 -0.126668 +EDGE3 1200 1251 -1.75265 12.3054 -6.32302 -0.00156812 0.00282481 0.127818 +EDGE3 1201 1250 -1.72467 -12.3309 -6.0746 0.00335735 -0.0024894 -0.127736 +EDGE3 1202 1252 -0.996101 0.0119611 -6.19813 -0.00158611 -0.00687317 -0.00271154 +EDGE3 1201 1252 -1.80797 12.3031 -6.34114 -0.00305013 0.000366288 0.132034 +EDGE3 1202 1251 -1.74947 -12.316 -6.09044 0.00409927 -0.00368663 -0.130431 +EDGE3 1203 1253 -1.00038 -0.012893 -6.22226 -0.00231213 0.00156721 -0.00681858 +EDGE3 1202 1253 -1.79371 12.3035 -6.34167 0.00254504 -0.00508333 0.124495 +EDGE3 1203 1252 -1.76087 -12.2991 -6.07558 0.00214568 -0.00621734 -0.136847 +EDGE3 1204 1254 -1.0246 -0.0106408 -6.20367 0.00400399 -0.0086143 -0.0097092 +EDGE3 1203 1254 -1.8121 12.2913 -6.32236 0.000591115 0.00213519 0.123904 +EDGE3 1204 1253 -1.78266 -12.3085 -6.07163 -0.00334506 0.00512779 -0.130678 +EDGE3 1205 1255 -1.01535 -0.00579947 -6.1829 -0.0072431 -0.00118367 -0.000967873 +EDGE3 1204 1255 -1.81181 12.3012 -6.33358 0.00150901 -0.0052744 0.120237 +EDGE3 1205 1254 -1.75333 -12.2951 -6.08254 0.000711817 0.00215391 -0.127414 +EDGE3 1206 1256 -1.04132 -0.00887721 -6.20046 -0.00812428 -0.00332842 -0.00209666 +EDGE3 1205 1256 -1.80654 12.2732 -6.33852 -0.00752239 -0.00646584 0.124853 +EDGE3 1206 1255 -1.7928 -12.2968 -6.07913 -0.00365201 -0.00233409 -0.119524 +EDGE3 1207 1257 -1.03619 0.0111894 -6.21236 0.00504466 -0.00377497 0.00291732 +EDGE3 1206 1257 -1.82652 12.2776 -6.33292 -0.00839611 0.00308718 0.132292 +EDGE3 1207 1256 -1.79659 -12.2967 -6.06751 -0.00490736 0.00666142 -0.119734 +EDGE3 1208 1258 -1.06385 -0.0123796 -6.19049 0.00428118 -0.00262243 -0.00458791 +EDGE3 1207 1258 -1.84071 12.3061 -6.31205 0.00687508 -0.00476635 0.123949 +EDGE3 1208 1257 -1.79091 -12.2858 -6.07519 0.00597829 -0.00752509 -0.127747 +EDGE3 1209 1259 -1.05641 -0.00459719 -6.20575 -0.0017895 -0.0084225 -0.00455486 +EDGE3 1208 1259 -1.84033 12.2852 -6.2891 0.00793653 0.00740437 0.120969 +EDGE3 1209 1258 -1.79148 -12.2879 -6.06025 -0.00155408 -0.00524682 -0.119909 +EDGE3 1210 1260 -1.05354 -0.00756719 -6.18498 0.000613067 0.00713599 0.00804207 +EDGE3 1209 1260 -1.85116 12.2808 -6.32282 0.00482571 -0.0010936 0.132816 +EDGE3 1210 1259 -1.81046 -12.2856 -6.06614 0.000196469 -0.00418579 -0.115611 +EDGE3 1211 1261 -1.07177 -0.00722255 -6.17624 0.010805 0.00361448 -0.00580038 +EDGE3 1210 1261 -1.83089 12.2695 -6.32085 -0.00411543 0.00422507 0.132881 +EDGE3 1211 1260 -1.81693 -12.278 -6.06467 0.00143987 0.00332467 -0.137683 +EDGE3 1212 1262 -1.07532 0.00167455 -6.18548 0.0123053 0.0011156 -0.00439697 +EDGE3 1211 1262 -1.86153 12.2805 -6.31079 0.00366122 0.0116569 0.124319 +EDGE3 1212 1261 -1.82467 -12.292 -6.07596 0.000532281 -0.0108006 -0.127354 +EDGE3 1213 1263 -1.09111 -0.00961441 -6.18967 0.00233809 0.00265332 -0.00271401 +EDGE3 1212 1263 -1.87388 12.2594 -6.31658 0.00157653 -0.00434533 0.118173 +EDGE3 1213 1262 -1.83439 -12.2697 -6.07915 -0.00280867 0.00871566 -0.124175 +EDGE3 1214 1264 -1.0987 -0.00877206 -6.20448 0.000767642 -0.00497041 -0.00185726 +EDGE3 1213 1264 -1.88466 12.2661 -6.31414 0.000460357 0.00609586 0.126159 +EDGE3 1214 1263 -1.827 -12.2607 -6.06063 -0.00481043 -0.000340906 -0.121319 +EDGE3 1215 1265 -1.08314 0.00762757 -6.19038 -0.00236598 -0.00647256 -0.00104305 +EDGE3 1214 1265 -1.87105 12.2643 -6.31362 0.00666331 0.00523199 0.12244 +EDGE3 1215 1264 -1.84349 -12.2711 -6.07067 -0.00243733 -0.00217267 -0.122715 +EDGE3 1216 1266 -1.09478 -0.00463532 -6.19459 -0.00904273 -0.0048407 -0.0028139 +EDGE3 1215 1266 -1.90051 12.2404 -6.30074 0.00410241 -0.000156571 0.128368 +EDGE3 1216 1265 -1.86132 -12.2745 -6.08004 0.00408617 0.00477359 -0.114533 +EDGE3 1217 1267 -1.10535 0.0139236 -6.18249 0.00502376 0.00250516 0.0031884 +EDGE3 1216 1267 -1.89451 12.235 -6.30547 -0.00239452 0.00321745 0.123634 +EDGE3 1217 1266 -1.85769 -12.2613 -6.05902 0.00929293 0.00148311 -0.125499 +EDGE3 1218 1268 -1.13341 0.0168396 -6.18031 -0.00191958 -0.00127183 -0.00198688 +EDGE3 1217 1268 -1.92365 12.2473 -6.30529 0.0022198 0.00231362 0.13381 +EDGE3 1218 1267 -1.86666 -12.2588 -6.07876 -0.00128407 -0.00436919 -0.128535 +EDGE3 1219 1269 -1.12169 -0.0108364 -6.18995 -0.000389061 -0.00135127 -0.00506213 +EDGE3 1218 1269 -1.92542 12.2496 -6.31181 -0.00309408 -0.00463105 0.136943 +EDGE3 1219 1268 -1.88867 -12.2364 -6.04839 -0.000866239 0.00342127 -0.127255 +EDGE3 1220 1270 -1.13858 -0.00411489 -6.16896 -0.00321739 -0.00578906 -0.00290691 +EDGE3 1219 1270 -1.94321 12.2434 -6.29829 0.00129743 0.00192137 0.115095 +EDGE3 1220 1269 -1.88274 -12.2541 -6.044 0.00361667 -0.00565734 -0.122567 +EDGE3 1221 1271 -1.14464 -0.0118791 -6.17439 0.0017851 -0.00228636 0.00238571 +EDGE3 1220 1271 -1.9391 12.236 -6.30188 0.00522051 0.00715627 0.123608 +EDGE3 1221 1270 -1.8811 -12.2514 -6.05135 -0.00901113 0.00683299 -0.131139 +EDGE3 1222 1272 -1.14702 0.00835665 -6.17428 -0.00201767 0.000469808 -0.00636336 +EDGE3 1221 1272 -1.94433 12.2351 -6.30181 0.00775178 0.00521698 0.129031 +EDGE3 1222 1271 -1.89865 -12.2583 -6.05882 -0.00102919 -0.000966689 -0.127156 +EDGE3 1223 1273 -1.17371 0.0060038 -6.17322 0.00369641 -0.00626277 -0.00108109 +EDGE3 1222 1273 -1.93962 12.2484 -6.31735 -0.00358253 -0.000116019 0.124343 +EDGE3 1223 1272 -1.92081 -12.2285 -6.05671 -0.0162591 0.00325434 -0.118824 +EDGE3 1224 1274 -1.15361 0.0125065 -6.18039 -0.00169667 0.00423324 -0.00585996 +EDGE3 1223 1274 -1.97487 12.2255 -6.29246 -0.0034531 0.00267028 0.127377 +EDGE3 1224 1273 -1.90266 -12.24 -6.05009 0.00697523 0.00442224 -0.12444 +EDGE3 1225 1275 -1.18331 -0.00874076 -6.17338 -0.00696206 0.00401516 0.00927983 +EDGE3 1224 1275 -1.9621 12.233 -6.30308 -0.00176359 -0.00228289 0.124519 +EDGE3 1225 1274 -1.9157 -12.2388 -6.05089 0.0100405 0.00127213 -0.130941 +EDGE3 1226 1276 -1.16514 0.00146596 -6.18837 0.00836612 -0.00154315 0.000498531 +EDGE3 1225 1276 -1.9772 12.2319 -6.29892 0.00276664 -0.0018002 0.122883 +EDGE3 1226 1275 -1.93158 -12.2399 -6.02457 0.00575992 0.000936377 -0.122232 +EDGE3 1227 1277 -1.18331 0.00594239 -6.17027 0.00168002 -0.00158513 0.00647278 +EDGE3 1226 1277 -1.96451 12.2158 -6.29634 -0.00034545 -0.00475471 0.122795 +EDGE3 1227 1276 -1.91374 -12.2221 -6.04779 -0.00321915 -0.00417287 -0.127122 +EDGE3 1228 1278 -1.19758 -0.00285214 -6.1541 0.00149302 0.00113628 -0.00430181 +EDGE3 1227 1278 -1.99137 12.2339 -6.28134 0.00878801 -0.0159384 0.131276 +EDGE3 1228 1277 -1.9253 -12.2317 -6.02268 0.000138531 0.00243892 -0.120581 +EDGE3 1229 1279 -1.19879 0.00389309 -6.15542 -5.2347e-05 -0.00408218 0.0039793 +EDGE3 1228 1279 -2.00587 12.2183 -6.27045 0.00348686 -0.00589381 0.121596 +EDGE3 1229 1278 -1.95774 -12.2234 -6.03662 0.000913849 0.00680407 -0.115628 +EDGE3 1230 1280 -1.22856 -0.0168639 -6.16801 0.00249322 -0.00367486 -0.00610038 +EDGE3 1229 1280 -1.99262 12.2191 -6.30148 -0.00408974 -0.000362377 0.125398 +EDGE3 1230 1279 -1.95023 -12.2046 -6.06046 -0.00530008 -0.00528074 -0.126404 +EDGE3 1231 1281 -1.21624 -0.00801326 -6.16293 0.00568207 0.00290833 -0.00509283 +EDGE3 1230 1281 -2.01498 12.2158 -6.29586 0.00403715 0.0035511 0.12374 +EDGE3 1231 1280 -1.96413 -12.2088 -6.04283 0.000665685 0.000793022 -0.117262 +EDGE3 1232 1282 -1.22118 -0.0118305 -6.16958 0.00242084 0.00312542 0.00559026 +EDGE3 1231 1282 -2.01717 12.2055 -6.2776 0.00385332 -0.00424741 0.12249 +EDGE3 1232 1281 -1.96298 -12.198 -6.03237 -0.00143891 0.0015397 -0.127541 +EDGE3 1233 1283 -1.2291 0.0122761 -6.15611 0.00235038 0.00424668 -0.00222943 +EDGE3 1232 1283 -2.01804 12.1985 -6.26552 -0.00592713 0.00322047 0.124302 +EDGE3 1233 1282 -1.98382 -12.1999 -6.04308 0.00643384 -0.000327816 -0.128581 +EDGE3 1234 1284 -1.24411 0.000547453 -6.16692 -0.00234368 -0.00446131 0.00517295 +EDGE3 1233 1284 -2.04346 12.2026 -6.27827 0.00769644 0.00294447 0.127361 +EDGE3 1234 1283 -1.98228 -12.2104 -6.02568 0.00576656 -0.000474741 -0.119634 +EDGE3 1235 1285 -1.25846 -0.0199646 -6.14654 -0.00631555 0.000547062 -0.00284981 +EDGE3 1234 1285 -2.0366 12.1922 -6.27048 -0.00119716 -0.00625033 0.124605 +EDGE3 1235 1284 -1.99315 -12.1949 -6.05176 4.15408e-05 -0.00079272 -0.126211 +EDGE3 1236 1286 -1.27018 0.000222362 -6.16443 -0.00952945 -0.0151464 -0.00280213 +EDGE3 1235 1286 -2.04396 12.2044 -6.26218 0.00982608 -0.00160672 0.122111 +EDGE3 1236 1285 -2.0032 -12.2021 -6.02577 -0.0024461 0.00376029 -0.12427 +EDGE3 1237 1287 -1.26505 -0.0150062 -6.14101 0.00856082 -0.00230722 -0.00196391 +EDGE3 1236 1287 -2.05473 12.1925 -6.30113 -0.000554669 0.00202528 0.133614 +EDGE3 1237 1286 -2.00354 -12.2032 -6.02624 -0.00135999 0.00975434 -0.131344 +EDGE3 1238 1288 -1.28944 -0.00470621 -6.15602 -0.0035996 -0.00757718 0.00498385 +EDGE3 1237 1288 -2.06631 12.1822 -6.26822 -0.00321739 0.00342101 0.121374 +EDGE3 1238 1287 -2.02472 -12.1779 -6.01642 -0.00436331 0.00326753 -0.122864 +EDGE3 1239 1289 -1.28066 0.00993117 -6.15701 -0.00368617 -0.00308197 -0.00498237 +EDGE3 1238 1289 -2.07073 12.19 -6.26735 0.00223921 0.00526294 0.121279 +EDGE3 1239 1288 -2.02504 -12.1737 -6.02208 0.00377636 0.00497753 -0.125195 +EDGE3 1240 1290 -1.28279 0.00134617 -6.14866 -0.00608044 -0.00253244 -0.00851474 +EDGE3 1239 1290 -2.074 12.1743 -6.28308 0.000749529 0.000330805 0.127833 +EDGE3 1240 1289 -2.0317 -12.1811 -6.02773 -0.00281243 -0.00673481 -0.122388 +EDGE3 1241 1291 -1.31583 -6.14079e-05 -6.13955 0.00326675 -0.0100391 0.00646376 +EDGE3 1240 1291 -2.06456 12.1748 -6.27352 -0.00109743 -0.00424295 0.118305 +EDGE3 1241 1290 -2.0336 -12.1889 -6.00968 -0.00270611 -0.0100466 -0.131889 +EDGE3 1242 1292 -1.30444 -0.0118768 -6.13677 -0.000505111 0.00434088 0.00393113 +EDGE3 1241 1292 -2.10023 12.1661 -6.26732 -0.000469047 0.00270923 0.121277 +EDGE3 1242 1291 -2.04919 -12.174 -6.01323 -0.000844905 -0.00106643 -0.127852 +EDGE3 1243 1293 -1.31129 0.00563454 -6.14438 0.00399283 0.00423763 -0.00168003 +EDGE3 1242 1293 -2.10361 12.1662 -6.26749 -0.00421995 -0.0177817 0.124474 +EDGE3 1243 1292 -2.04982 -12.1544 -6.01781 0.00149 -0.00440563 -0.121036 +EDGE3 1244 1294 -1.31709 -0.00687083 -6.15593 -0.00396446 -0.0029324 0.0037965 +EDGE3 1243 1294 -2.1009 12.1569 -6.26394 0.000768394 -0.000535804 0.127365 +EDGE3 1244 1293 -2.06812 -12.1688 -6.00591 -0.00519289 0.0012088 -0.122312 +EDGE3 1245 1295 -1.34037 0.00652716 -6.13633 0.00614232 0.00218485 0.00581452 +EDGE3 1244 1295 -2.11786 12.1493 -6.25509 -0.00578447 0.00372867 0.130179 +EDGE3 1245 1294 -2.07726 -12.1548 -6.02752 0.0030141 -0.00142089 -0.12282 +EDGE3 1246 1296 -1.33639 0.0134093 -6.14038 -0.00401677 0.00936825 -0.000461159 +EDGE3 1245 1296 -2.13878 12.1593 -6.26254 -0.00522006 -0.00131234 0.122195 +EDGE3 1246 1295 -2.06574 -12.1595 -6.005 0.000424218 -0.00192294 -0.120507 +EDGE3 1247 1297 -1.35412 -0.00325291 -6.12414 0.00335858 -0.00268119 -0.00631245 +EDGE3 1246 1297 -2.13529 12.1385 -6.25312 0.00359257 -0.00161698 0.120191 +EDGE3 1247 1296 -2.08062 -12.164 -6.007 0.00106704 0.000280806 -0.117932 +EDGE3 1248 1298 -1.35233 0.000291612 -6.12489 0.00170123 -0.0144593 0.000122918 +EDGE3 1247 1298 -2.12837 12.1457 -6.23816 -0.0084349 -0.000697213 0.132738 +EDGE3 1248 1297 -2.0863 -12.1747 -6.02457 -0.0010739 0.00701766 -0.132396 +EDGE3 1249 1299 -1.35318 0.00744235 -6.11775 -0.00580461 -0.00169409 0.001103 +EDGE3 1248 1299 -2.14842 12.1525 -6.25132 -0.000310301 -0.000699131 0.128637 +EDGE3 1249 1298 -2.0993 -12.1587 -6.02493 0.00043086 -0.0019789 -0.12557 +EDGE3 1250 1300 -1.37942 0.0151423 -6.13484 -0.00937957 0.00511074 -0.000813706 +EDGE3 1249 1300 -2.15075 12.1347 -6.25379 -0.00146478 -0.00157745 0.121385 +EDGE3 1250 1299 -2.11283 -12.1568 -6.00313 0.00432578 -0.00128353 -0.118984 +EDGE3 1251 1301 -1.37846 -0.000350633 -6.13117 -0.00168149 -0.00363873 -0.00392459 +EDGE3 1250 1301 -2.17019 12.1306 -6.24802 -0.00750885 -0.000575472 0.121108 +EDGE3 1251 1300 -2.12189 -12.1388 -6.00945 5.18724e-05 -0.00138 -0.116866 +EDGE3 1252 1302 -1.40555 -0.00222531 -6.13326 0.000538556 0.00364973 0.00413479 +EDGE3 1251 1302 -2.15406 12.153 -6.25025 0.00605685 -0.00550907 0.117702 +EDGE3 1252 1301 -2.10283 -12.1531 -6.01255 -0.00662142 0.00758138 -0.131594 +EDGE3 1253 1303 -1.40694 0.0134627 -6.11629 0.00482936 -0.00170619 0.00712515 +EDGE3 1252 1303 -2.17478 12.1365 -6.26123 0.0043719 0.00968412 0.128662 +EDGE3 1253 1302 -2.14163 -12.1177 -5.99595 -0.00360701 0.00332719 -0.116875 +EDGE3 1254 1304 -1.40976 0.0070358 -6.11956 -9.66299e-05 0.0102076 0.00480182 +EDGE3 1253 1304 -2.18112 12.1354 -6.23165 -0.000142355 0.000998488 0.131786 +EDGE3 1254 1303 -2.14081 -12.1402 -5.99492 0.00774031 -0.00149616 -0.130669 +EDGE3 1255 1305 -1.42094 0.00291775 -6.12517 0.000190237 -0.000375257 -0.00552713 +EDGE3 1254 1305 -2.2073 12.1187 -6.24335 0.00104601 -0.00514933 0.128043 +EDGE3 1255 1304 -2.15186 -12.1207 -6.01328 0.00839223 0.00349578 -0.12843 +EDGE3 1256 1306 -1.42105 -0.0115984 -6.13226 -0.0110806 0.00140196 -0.000830412 +EDGE3 1255 1306 -2.2118 12.1101 -6.23602 -0.00784496 -0.000743815 0.123149 +EDGE3 1256 1305 -2.15716 -12.1097 -5.99816 0.00293951 0.0110516 -0.129362 +EDGE3 1257 1307 -1.4295 -0.000681066 -6.11017 0.00634681 -0.00215732 0.00519381 +EDGE3 1256 1307 -2.1954 12.1028 -6.23405 -0.00707876 0.00224949 0.123109 +EDGE3 1258 1308 -1.43761 0.00459071 -6.10718 -0.0043448 0.0127841 -0.00494358 +EDGE3 1257 1306 -2.14915 -12.1182 -5.99308 0.00226786 0.000953503 -0.127209 +EDGE3 1257 1308 -2.22861 12.089 -6.22847 -0.000926303 -0.00338132 0.120358 +EDGE3 1258 1307 -2.17043 -12.1005 -5.99476 -0.00238094 -0.00485529 -0.12465 +EDGE3 1259 1309 -1.4409 -0.00182216 -6.11276 -0.00274354 -0.00373551 -0.00118229 +EDGE3 1258 1309 -2.24785 12.0904 -6.236 6.67365e-05 0.00723567 0.127557 +EDGE3 1259 1308 -2.15246 -12.1036 -5.99256 -0.000965259 -0.00246632 -0.125484 +EDGE3 1260 1310 -1.44398 -0.0133503 -6.11883 0.00317479 0.0075861 -0.0054342 +EDGE3 1259 1310 -2.24558 12.1133 -6.24137 -0.000589602 0.00409464 0.132188 +EDGE3 1261 1311 -1.45734 0.00600779 -6.12056 -0.00398036 0.00260343 -0.0034433 +EDGE3 1260 1309 -2.17664 -12.0878 -6.01317 0.00298838 -0.00235212 -0.125238 +EDGE3 1260 1311 -2.23831 12.0983 -6.22391 0.00949638 -0.00441574 0.12557 +EDGE3 1261 1310 -2.21328 -12.1124 -5.99043 -0.00433315 -0.00968734 -0.124835 +EDGE3 1261 1312 -2.24415 12.0804 -6.23819 -0.00356356 0.000939557 0.135699 +EDGE3 1262 1312 -1.44972 -0.0110206 -6.09281 0.0019977 0.00467761 0.00812821 +EDGE3 1263 1313 -1.47353 0.00101646 -6.09712 -0.000572981 -0.000188722 0.00524961 +EDGE3 1262 1311 -2.18364 -12.081 -5.97161 0.00746218 0.00509931 -0.120027 +EDGE3 1262 1313 -2.26123 12.0783 -6.21131 -0.00330616 0.0015646 0.126899 +EDGE3 1263 1312 -2.20526 -12.0924 -5.98741 0.0092469 0.000248713 -0.1294 +EDGE3 1264 1314 -1.47958 -0.00584973 -6.10019 3.02705e-05 0.00451208 -0.00309143 +EDGE3 1263 1314 -2.27829 12.0767 -6.22721 -0.00647477 0.00186124 0.122308 +EDGE3 1264 1313 -2.20524 -12.0967 -5.97025 -0.00640462 0.00369756 -0.12624 +EDGE3 1264 1315 -2.27583 12.0866 -6.23057 -0.00341038 0.00779401 0.128658 +EDGE3 1265 1315 -1.48777 0.0091003 -6.10271 0.00319431 0.00120349 0.0049289 +EDGE3 1266 1316 -1.50084 -0.00376698 -6.09813 0.00818154 -0.00491756 0.00482189 +EDGE3 1265 1314 -2.19319 -12.1017 -5.98519 -0.00038786 -0.0104403 -0.124903 +EDGE3 1265 1316 -2.27338 12.074 -6.23861 0.00460128 0.00414457 0.129045 +EDGE3 1266 1315 -2.21617 -12.0826 -5.96838 -0.00359898 0.00336519 -0.133058 +EDGE3 1267 1317 -1.49715 -0.00276979 -6.11344 0.00989139 0.00741322 -0.0016671 +EDGE3 1266 1317 -2.28964 12.0634 -6.23994 -0.00333484 -0.00393824 0.128328 +EDGE3 1267 1316 -2.22995 -12.0806 -6.00694 0.00054658 -0.00302717 -0.118556 +EDGE3 1268 1318 -1.50153 -0.00934452 -6.10131 0.000249297 0.00333808 0.00236405 +EDGE3 1267 1318 -2.31092 12.0779 -6.21988 -0.00864298 -0.00472854 0.123837 +EDGE3 1268 1317 -2.23278 -12.0406 -5.96993 -0.00342743 -0.00347145 -0.134521 +EDGE3 1268 1319 -2.30874 12.0589 -6.23223 0.00153403 -0.000171724 0.118817 +EDGE3 1269 1319 -1.50319 0.0141769 -6.11633 0.00133831 0.00929505 0.00772275 +EDGE3 1269 1318 -2.22564 -12.0662 -5.96651 -0.00459008 -0.000405658 -0.129487 +EDGE3 1270 1320 -1.5275 0.000202204 -6.10183 0.00706587 -0.00430586 -0.011852 +EDGE3 1269 1320 -2.3018 12.0768 -6.22607 0.000319115 -0.00198138 0.118729 +EDGE3 1270 1319 -2.23993 -12.0692 -5.98585 -0.000709333 -0.00844005 -0.122934 +EDGE3 1271 1321 -1.52954 0.00613655 -6.12232 -5.8557e-05 -0.00808747 -0.00187447 +EDGE3 1270 1321 -2.3095 12.0515 -6.22452 -0.002412 0.003136 0.119856 +EDGE3 1271 1320 -2.25838 -12.0526 -5.97479 -0.00220788 -0.0031448 -0.127302 +EDGE3 1272 1322 -1.56145 -0.00480953 -6.09284 -0.00278172 -0.0109717 -0.00335514 +EDGE3 1271 1322 -2.31738 12.0459 -6.21809 0.000914676 0.000140788 0.118537 +EDGE3 1273 1323 -1.53337 0.0102646 -6.08164 -0.00653184 0.00546746 -0.000700168 +EDGE3 1272 1321 -2.2687 -12.0488 -5.9678 0.000470836 -0.00607245 -0.132725 +EDGE3 1272 1323 -2.33551 12.0311 -6.23072 -0.00618778 0.00212377 0.129713 +EDGE3 1273 1322 -2.27763 -12.0352 -5.96667 0.0053364 -0.000747174 -0.126485 +EDGE3 1274 1324 -1.54091 0.000817357 -6.07772 -0.00605633 0.000294675 0.00431891 +EDGE3 1273 1324 -2.34835 12.0215 -6.22758 0.000542945 -0.00277123 0.117092 +EDGE3 1274 1323 -2.26783 -12.0358 -5.96988 -0.00271654 -0.00138657 -0.122558 +EDGE3 1274 1325 -2.35497 12.0033 -6.2107 0.00132606 -0.00611024 0.121075 +EDGE3 1275 1325 -1.5587 0.00614759 -6.08555 0.00804712 0.0031965 0.00448047 +EDGE3 1276 1326 -1.57658 0.00401627 -6.07418 0.000490823 -0.00382333 0.00655783 +EDGE3 1275 1324 -2.30018 -12.038 -5.94182 0.000171203 0.00032874 -0.123127 +EDGE3 1275 1326 -2.35695 12.0118 -6.19629 -0.00393793 -0.00795257 0.133065 +EDGE3 1276 1325 -2.29708 -12.0327 -5.96024 -0.00658664 -0.00157855 -0.123008 +EDGE3 1277 1327 -1.58984 3.00826e-05 -6.06857 -0.00274808 -0.00231439 0.00209328 +EDGE3 1276 1327 -2.34459 12.0135 -6.20425 -0.000143207 -8.19409e-05 0.122355 +EDGE3 1277 1326 -2.31439 -12.0338 -5.95164 0.00155841 0.0017382 -0.118541 +EDGE3 1278 1328 -1.59229 0.0150069 -6.06933 0.00368343 -0.000701584 -0.00170895 +EDGE3 1277 1328 -2.34664 12.0221 -6.20544 -0.00691473 0.00948792 0.129383 +EDGE3 1278 1327 -2.30175 -12.0324 -5.95158 -0.00764838 -0.00749032 -0.131261 +EDGE3 1279 1329 -1.58175 0.00141946 -6.07914 -0.0111587 -0.000899976 -7.1957e-05 +EDGE3 1278 1329 -2.38859 12.0118 -6.21624 -0.00201875 -0.0052995 0.127963 +EDGE3 1279 1328 -2.33874 -12.0115 -5.95145 0.000326289 -0.0025738 -0.135077 +EDGE3 1280 1330 -1.59796 -0.00742339 -6.07298 0.00747963 -0.00756291 0.00311896 +EDGE3 1279 1330 -2.37785 12.0116 -6.18952 0.0096843 0.00141551 0.129709 +EDGE3 1280 1329 -2.33645 -12.0332 -5.95123 0.00194766 0.000334106 -0.123968 +EDGE3 1281 1331 -1.62306 -0.00799634 -6.08019 0.00014948 -0.0125508 0.00212468 +EDGE3 1280 1331 -2.39275 11.9991 -6.19565 0.0120879 -0.00105182 0.12904 +EDGE3 1281 1330 -2.33677 -11.999 -5.94944 0.000471318 0.00317299 -0.130521 +EDGE3 1282 1332 -1.62028 -8.72218e-05 -6.07506 0.00185516 0.000757638 -7.01057e-05 +EDGE3 1281 1332 -2.40533 12.0035 -6.20692 0.00754218 0.00383978 0.118747 +EDGE3 1282 1331 -2.3288 -12.002 -5.93943 -0.0145985 -0.00274275 -0.127086 +EDGE3 1282 1333 -2.41501 11.998 -6.19774 0.00154167 -0.000414636 0.124857 +EDGE3 1283 1333 -1.62231 0.0146721 -6.09773 0.00305455 0.00576136 -0.0020391 +EDGE3 1284 1334 -1.65106 -0.0102057 -6.05991 -0.0053115 -0.00238632 0.00368596 +EDGE3 1283 1332 -2.33728 -12.0141 -5.95598 0.00181538 -0.000140374 -0.130294 +EDGE3 1283 1334 -2.41235 12.0027 -6.19628 -0.00822353 -0.00606917 0.127199 +EDGE3 1284 1333 -2.34506 -12.0103 -5.938 -0.00541812 -0.00497025 -0.132537 +EDGE3 1285 1335 -1.63721 0.00954581 -6.05108 0.00727057 0.0064704 -0.00198049 +EDGE3 1284 1335 -2.43496 11.9972 -6.18988 -0.00836 0.00590854 0.127608 +EDGE3 1285 1334 -2.34456 -12.0052 -5.94908 -0.00358037 0.0107971 -0.121157 +EDGE3 1286 1336 -1.63753 -0.00421474 -6.04801 0.00317879 -0.000811129 0.00334045 +EDGE3 1285 1336 -2.4403 11.9708 -6.18325 -0.00735558 -0.00223817 0.122772 +EDGE3 1286 1335 -2.36727 -12.0076 -5.9427 -0.00541697 -0.0090488 -0.137799 +EDGE3 1287 1337 -1.66452 0.03716 -6.04646 0.000735507 -0.000593098 0.00612003 +EDGE3 1286 1337 -2.43665 12.0005 -6.18643 -0.000791997 -0.000535018 0.131089 +EDGE3 1287 1336 -2.36762 -11.9931 -5.92606 -0.00795122 -0.00179453 -0.126679 +EDGE3 1288 1338 -1.66573 -0.00601106 -6.07448 -0.00318751 0.00488577 -0.00303404 +EDGE3 1287 1338 -2.44622 11.9681 -6.18621 -0.00447479 -0.00546236 0.119286 +EDGE3 1288 1337 -2.38052 -11.9894 -5.93991 -0.00341111 -0.0035226 -0.119877 +EDGE3 1289 1339 -1.67321 -0.00599371 -6.07106 -0.00616076 -0.000454494 -0.00659816 +EDGE3 1288 1339 -2.45765 11.9893 -6.15936 0.000939473 -0.00320556 0.127029 +EDGE3 1289 1338 -2.38507 -11.9909 -5.92491 0.000188746 0.00243447 -0.121011 +EDGE3 1290 1340 -1.66223 -0.00766776 -6.04287 0.00285241 -0.00187795 0.00302848 +EDGE3 1289 1340 -2.46265 11.9732 -6.18715 0.00395238 0.00520042 0.123825 +EDGE3 1290 1339 -2.38439 -11.9732 -5.93962 -0.0071926 3.07388e-05 -0.115829 +EDGE3 1291 1341 -1.68531 0.0133967 -6.03859 0.000729536 0.00576483 0.00147798 +EDGE3 1290 1341 -2.4416 11.9562 -6.17604 0.00380665 0.00878932 0.120654 +EDGE3 1291 1340 -2.38928 -11.964 -5.92338 -0.0064761 -0.00210947 -0.130841 +EDGE3 1292 1342 -1.68766 0.0133976 -6.05027 -0.000489278 -0.00513934 0.0041362 +EDGE3 1291 1342 -2.47442 11.9546 -6.16864 -0.0124541 0.00298216 0.122372 +EDGE3 1292 1341 -2.41221 -11.9702 -5.92769 -0.00178072 -0.00292831 -0.121789 +EDGE3 1293 1343 -1.69025 0.0146882 -6.04436 -0.00135414 -0.000111591 0.00130123 +EDGE3 1292 1343 -2.49785 11.9624 -6.17812 -0.00431373 0.00160997 0.129042 +EDGE3 1293 1342 -2.41509 -11.9431 -5.94178 0.00164927 -0.000792807 -0.134956 +EDGE3 1294 1344 -1.70121 0.00131409 -6.04345 0.00925854 -0.013055 0.000942711 +EDGE3 1293 1344 -2.49743 11.939 -6.1646 -0.00257235 0.00161158 0.129183 +EDGE3 1294 1343 -2.42336 -11.9498 -5.93086 0.000238883 0.000890428 -0.127615 +EDGE3 1295 1345 -1.71894 -0.00391819 -6.06344 -8.89785e-06 -0.00353461 -0.00677507 +EDGE3 1294 1345 -2.49849 11.9535 -6.17641 0.00428347 -0.00205208 0.128081 +EDGE3 1295 1344 -2.4207 -11.961 -5.93387 -0.00239371 0.00120947 -0.130391 +EDGE3 1296 1346 -1.72018 0.00946666 -6.04734 -0.00305978 0.00601013 -0.00172191 +EDGE3 1295 1346 -2.5122 11.9547 -6.17181 0.000661366 -0.00329964 0.12125 +EDGE3 1296 1345 -2.42735 -11.9418 -5.93571 0.00362645 -0.00229236 -0.125073 +EDGE3 1297 1347 -1.7257 -0.0071358 -6.0347 0.00155559 -0.00498411 0.00725145 +EDGE3 1296 1347 -2.51045 11.9172 -6.17198 0.00124584 0.000524956 0.121647 +EDGE3 1297 1346 -2.45073 -11.9297 -5.91915 0.00097152 0.00256432 -0.129202 +EDGE3 1298 1348 -1.74303 0.00526137 -6.03296 0.00476063 -0.0012479 -0.00372027 +EDGE3 1297 1348 -2.51429 11.9267 -6.14523 0.00228167 0.00200698 0.130112 +EDGE3 1298 1347 -2.44781 -11.9526 -5.91614 -0.00348542 -0.0019382 -0.135149 +EDGE3 1299 1349 -1.74693 0.00921731 -6.03427 -0.0120259 0.0147114 0.00164735 +EDGE3 1298 1349 -2.52865 11.9197 -6.16475 -0.000464738 -0.00658666 0.122406 +EDGE3 1299 1348 -2.44712 -11.9388 -5.93204 0.0088224 -0.00227875 -0.111424 +EDGE3 1300 1350 -1.75371 0.0129269 -6.03403 0.00158358 -0.00081 0.0032821 +EDGE3 1299 1350 -2.53421 11.9089 -6.16576 -0.00973236 -0.00319772 0.121914 +EDGE3 1300 1349 -2.47756 -11.9262 -5.91336 -0.00016288 -0.0117434 -0.126914 +EDGE3 1301 1351 -1.78171 -0.0066518 -6.01064 0.000541027 -0.00827982 0.00687067 +EDGE3 1300 1351 -2.54769 11.9161 -6.14625 0.00445508 0.00254884 0.116812 +EDGE3 1301 1350 -2.46925 -11.9 -5.9 0.0077249 -0.00278785 -0.117734 +EDGE3 1302 1352 -1.77809 -0.0198924 -6.02306 -0.00188075 -0.005498 -0.00337847 +EDGE3 1301 1352 -2.53261 11.9081 -6.15507 -0.0108137 -0.00271034 0.12752 +EDGE3 1302 1351 -2.46261 -11.931 -5.90677 -0.00104695 -0.00286695 -0.126841 +EDGE3 1303 1353 -1.77421 -0.000720837 -6.0275 -0.00161205 -0.000382982 0.00816154 +EDGE3 1302 1353 -2.55889 11.902 -6.12721 -0.00376901 -0.0027801 0.128155 +EDGE3 1303 1352 -2.48205 -11.9048 -5.89978 -0.00444734 -0.00211646 -0.131889 +EDGE3 1304 1354 -1.79916 0.00423345 -6.01537 -0.00302115 0.0027325 -0.00963069 +EDGE3 1303 1354 -2.55779 11.8924 -6.14165 -0.00254435 0.00626875 0.122067 +EDGE3 1304 1353 -2.51619 -11.9014 -5.88231 0.00794002 -0.000243216 -0.134041 +EDGE3 1305 1355 -1.80318 5.36478e-05 -6.02597 0.00418759 0.000213165 0.00731267 +EDGE3 1304 1355 -2.58044 11.8954 -6.12945 -0.0028399 0.00755985 0.136765 +EDGE3 1305 1354 -2.50311 -11.8876 -5.9178 0.00183962 0.00828727 -0.120411 +EDGE3 1306 1356 -1.78864 -0.0038653 -6.01843 0.00700442 -0.00695609 0.00584936 +EDGE3 1305 1356 -2.58291 11.8912 -6.13133 0.00483228 -0.0019554 0.122837 +EDGE3 1306 1355 -2.50982 -11.881 -5.90084 0.00213121 -0.00465355 -0.123658 +EDGE3 1307 1357 -1.80885 -0.00664941 -6.02121 -0.00536365 0.00638962 -0.000416983 +EDGE3 1306 1357 -2.58265 11.8827 -6.14632 -0.00042139 -0.00549883 0.132412 +EDGE3 1307 1356 -2.52989 -11.8891 -5.90323 -0.00222472 -0.000802468 -0.122778 +EDGE3 1308 1358 -1.8095 0.0026296 -6.02621 -0.00217093 0.0107824 0.000241181 +EDGE3 1307 1358 -2.58655 11.8775 -6.12781 0.00311644 0.00199054 0.1258 +EDGE3 1308 1357 -2.5262 -11.8923 -5.90686 -0.00063681 -0.00087927 -0.116956 +EDGE3 1309 1359 -1.80976 0.00739359 -6.01778 0.00371392 0.00597432 0.00377424 +EDGE3 1308 1359 -2.59711 11.8763 -6.1471 -0.0110076 -0.00361975 0.114907 +EDGE3 1309 1358 -2.53031 -11.8848 -5.89454 -0.0121089 -0.00610809 -0.118418 +EDGE3 1310 1360 -1.82527 0.0190463 -5.99818 -0.00139675 -0.010531 -0.00460139 +EDGE3 1309 1360 -2.61192 11.8631 -6.13534 -0.0095887 0.0061446 0.12836 +EDGE3 1310 1359 -2.54105 -11.8705 -5.8951 -0.00187179 0.00267709 -0.113221 +EDGE3 1311 1361 -1.83318 -0.00631814 -5.99326 -0.000825265 0.00420988 0.000221901 +EDGE3 1310 1361 -2.61708 11.8722 -6.14297 0.00397209 -0.0038316 0.126145 +EDGE3 1311 1360 -2.52782 -11.8717 -5.88694 -0.00272966 0.0056701 -0.128998 +EDGE3 1312 1362 -1.84696 -0.00523842 -6.01816 -0.00364537 -0.00516287 0.00167897 +EDGE3 1311 1362 -2.63324 11.8525 -6.1302 0.00108359 0.00084881 0.125288 +EDGE3 1312 1361 -2.55155 -11.8741 -5.87788 -0.0036631 -0.00131576 -0.12652 +EDGE3 1313 1363 -1.85839 0.00789332 -6.00963 0.00600651 0.00580216 -0.00605588 +EDGE3 1312 1363 -2.6281 11.8694 -6.11573 0.00217007 -0.00129061 0.120771 +EDGE3 1313 1362 -2.55814 -11.8625 -5.87272 0.00527217 -0.00647406 -0.119997 +EDGE3 1314 1364 -1.86689 0.00716934 -5.97973 -0.000850539 -0.00546238 0.0108753 +EDGE3 1313 1364 -2.62569 11.8586 -6.12541 -0.00459027 -0.00641495 0.125858 +EDGE3 1314 1363 -2.54088 -11.8496 -5.87007 0.00461091 -0.000150298 -0.129973 +EDGE3 1315 1365 -1.86286 -0.00616268 -5.99338 0.00145637 0.00338557 -0.00569419 +EDGE3 1314 1365 -2.66726 11.8531 -6.11111 -0.00581086 -0.0018703 0.122607 +EDGE3 1315 1364 -2.56683 -11.8574 -5.86834 0.00847801 -0.00548614 -0.129981 +EDGE3 1316 1366 -1.88098 -0.00282237 -6.01335 -2.47839e-05 -0.00123034 0.00575307 +EDGE3 1315 1366 -2.6487 11.8449 -6.09557 0.00309447 -0.00283814 0.131986 +EDGE3 1316 1365 -2.56373 -11.8351 -5.84998 -0.00332312 -0.00197341 -0.116672 +EDGE3 1317 1367 -1.88879 0.0143499 -6.00996 6.82173e-05 0.00436986 2.86247e-05 +EDGE3 1316 1367 -2.65734 11.8384 -6.11558 0.00126667 -0.000540804 0.124981 +EDGE3 1317 1366 -2.59234 -11.8461 -5.87185 -0.00113643 0.00116381 -0.129374 +EDGE3 1318 1368 -1.87554 0.007359 -5.99264 -0.00805397 0.00630289 -0.003966 +EDGE3 1317 1368 -2.65323 11.8349 -6.13222 -0.00735887 0.00824941 0.138 +EDGE3 1318 1367 -2.60315 -11.8343 -5.86376 -0.00201128 0.00464356 -0.124199 +EDGE3 1319 1369 -1.92 0.00426302 -5.99042 -0.00160949 0.000212093 -0.00188433 +EDGE3 1318 1369 -2.67426 11.8265 -6.11172 -0.00665069 0.0111154 0.124088 +EDGE3 1319 1368 -2.59544 -11.8276 -5.86826 0.00457307 -0.00218169 -0.122518 +EDGE3 1320 1370 -1.90568 -0.00993958 -5.98935 -0.00536499 0.00209453 0.00401445 +EDGE3 1319 1370 -2.68671 11.8009 -6.10901 -0.00353979 -0.00844318 0.124858 +EDGE3 1320 1369 -2.59493 -11.8225 -5.85077 0.00296225 -0.00333627 -0.13219 +EDGE3 1321 1371 -1.89516 0.000702676 -5.99344 0.00011751 -0.00278936 -0.000603697 +EDGE3 1320 1371 -2.69007 11.8132 -6.10964 0.000805738 -0.00368312 0.125685 +EDGE3 1321 1370 -2.601 -11.8129 -5.86248 0.000881011 -0.00555493 -0.126598 +EDGE3 1322 1372 -1.90741 -0.00249263 -5.9909 -0.0114209 0.000337295 0.00644336 +EDGE3 1321 1372 -2.70271 11.7985 -6.08914 0.00368769 -0.000486535 0.128784 +EDGE3 1322 1371 -2.62884 -11.813 -5.87147 -0.00326796 0.000202365 -0.125082 +EDGE3 1323 1373 -1.92135 0.0181157 -5.98056 -0.000794109 0.00582665 0.014451 +EDGE3 1322 1373 -2.70266 11.8182 -6.1169 0.00511262 -0.000557783 0.128661 +EDGE3 1323 1372 -2.62706 -11.8234 -5.85776 0.00204911 0.00171603 -0.119465 +EDGE3 1324 1374 -1.91219 0.000561141 -5.97128 -3.96712e-06 -0.00373292 -0.00370371 +EDGE3 1323 1374 -2.72181 11.8104 -6.10299 -0.00168496 -0.00220938 0.123399 +EDGE3 1324 1373 -2.66157 -11.8175 -5.85705 -0.0035981 0.00451443 -0.13753 +EDGE3 1325 1375 -1.95336 -0.0104498 -5.96997 0.00584897 0.000273552 0.00244025 +EDGE3 1324 1375 -2.71507 11.7903 -6.10181 0.00169681 0.00458568 0.135426 +EDGE3 1325 1374 -2.64381 -11.8031 -5.86397 -0.00326425 0.000248316 -0.127306 +EDGE3 1326 1376 -1.9523 0.00619619 -5.98098 -0.00586305 0.00205231 0.00192867 +EDGE3 1325 1376 -2.7141 11.7802 -6.08705 0.00185912 -0.00346456 0.118351 +EDGE3 1326 1375 -2.63781 -11.7946 -5.85435 0.00299786 0.00308035 -0.13059 +EDGE3 1327 1377 -1.9507 -0.00356787 -5.97097 -0.00309336 -0.0018444 -0.00364397 +EDGE3 1326 1377 -2.73072 11.8004 -6.09608 -0.00435734 0.0045611 0.120893 +EDGE3 1327 1376 -2.65323 -11.7886 -5.86795 -0.000655902 -0.00879365 -0.129187 +EDGE3 1328 1378 -1.96364 0.00334844 -5.97069 0.00347913 -0.000122212 0.00578368 +EDGE3 1328 1377 -2.68039 -11.7754 -5.85235 0.00581906 -0.00237116 -0.120349 +EDGE3 1327 1378 -2.74298 11.7787 -6.08593 -0.00184629 -0.00042 0.118805 +EDGE3 1329 1379 -1.97112 0.00587674 -5.96695 -0.0039159 0.00267405 -0.00838057 +EDGE3 1328 1379 -2.74947 11.7672 -6.08142 -0.00167645 0.00225033 0.124422 +EDGE3 1329 1378 -2.65146 -11.7615 -5.82663 0.00797255 0.00160008 -0.127269 +EDGE3 1330 1380 -1.9756 -0.000234442 -5.96984 0.00117785 -6.74639e-06 0.00232422 +EDGE3 1329 1380 -2.76736 11.7685 -6.07858 0.00277419 -0.000375039 0.125883 +EDGE3 1330 1379 -2.67463 -11.7941 -5.85277 -0.000498387 0.00123012 -0.126402 +EDGE3 1331 1381 -1.97656 -0.00428971 -5.95455 -0.00422569 0.00588883 0.00512675 +EDGE3 1330 1381 -2.76611 11.7718 -6.08092 0.00118819 -0.00465108 0.135608 +EDGE3 1331 1380 -2.70134 -11.7567 -5.84677 0.00162602 0.000657535 -0.127434 +EDGE3 1332 1382 -1.99226 -0.00521253 -5.94292 -3.68194e-06 -8.74505e-05 -0.00561228 +EDGE3 1331 1382 -2.79161 11.7662 -6.0595 -0.00232441 -0.0016582 0.126776 +EDGE3 1332 1381 -2.6919 -11.7495 -5.84331 -0.00274974 -0.000872446 -0.118032 +EDGE3 1333 1383 -2.00285 -0.0150332 -5.9561 -0.00223918 -0.0071941 -0.00185312 +EDGE3 1332 1383 -2.77841 11.7382 -6.07482 0.00825324 -0.007194 0.120698 +EDGE3 1333 1382 -2.69186 -11.749 -5.83407 -0.000991503 -0.0031569 -0.12721 +EDGE3 1334 1384 -2.00792 -0.00654286 -5.95637 -0.00313366 0.00669483 -0.00331202 +EDGE3 1333 1384 -2.76714 11.7273 -6.07346 -0.00243674 -0.00255995 0.124142 +EDGE3 1334 1383 -2.73178 -11.7542 -5.82979 -0.0053649 -0.00245217 -0.122385 +EDGE3 1335 1385 -2.02371 -0.000803676 -5.95378 -0.000461982 0.00344098 0.00509963 +EDGE3 1334 1385 -2.77345 11.7379 -6.06893 0.00687554 0.00404594 0.122015 +EDGE3 1335 1384 -2.72512 -11.7542 -5.83312 0.00405165 -0.00152516 -0.122213 +EDGE3 1336 1386 -2.01437 0.0151906 -5.93902 0.00392475 -0.00277011 -0.00560376 +EDGE3 1335 1386 -2.80271 11.7344 -6.087 -0.00753537 0.0063636 0.120834 +EDGE3 1336 1385 -2.7197 -11.7387 -5.82854 -0.00751585 0.00372245 -0.125914 +EDGE3 1337 1387 -2.04649 -0.0223202 -5.93376 -0.00195848 -0.00229445 -0.00475436 +EDGE3 1336 1387 -2.81113 11.7324 -6.06248 0.00824644 0.012429 0.126691 +EDGE3 1337 1386 -2.72356 -11.7293 -5.82517 -0.00457621 0.00684741 -0.119352 +EDGE3 1338 1388 -2.03789 -0.00118052 -5.94869 0.0034073 0.000900248 -0.00241925 +EDGE3 1337 1388 -2.82253 11.7214 -6.05366 -0.00392174 -0.000606465 0.122555 +EDGE3 1338 1387 -2.72173 -11.7273 -5.83909 0.000435962 0.00176043 -0.129607 +EDGE3 1339 1389 -2.04563 -0.00379647 -5.92873 -0.00402886 -0.00460716 -0.00763104 +EDGE3 1338 1389 -2.81278 11.7195 -6.05588 -0.00475655 -0.00192255 0.130461 +EDGE3 1339 1388 -2.7315 -11.7186 -5.83007 0.00440874 0.00647302 -0.132351 +EDGE3 1340 1390 -2.04521 0.00528209 -5.93915 -0.00970801 0.00328361 0.00452302 +EDGE3 1339 1390 -2.83 11.7257 -6.05214 0.00249097 -0.00425697 0.132146 +EDGE3 1340 1389 -2.7398 -11.7184 -5.80344 -0.0113432 0.00494857 -0.12561 +EDGE3 1341 1391 -2.06691 0.0125113 -5.92515 0.00221863 0.00228938 0.00428394 +EDGE3 1340 1391 -2.82712 11.7005 -6.05398 0.00454004 0.003363 0.130849 +EDGE3 1341 1390 -2.75494 -11.7073 -5.83017 -0.00145211 -0.000676604 -0.133932 +EDGE3 1342 1392 -2.07116 0.00584584 -5.92597 0.00155962 0.0062573 -0.00114101 +EDGE3 1342 1391 -2.75102 -11.6898 -5.81138 0.00432385 0.00761373 -0.125052 +EDGE3 1341 1392 -2.83056 11.7163 -6.04172 0.000439684 -0.00295652 0.128391 +EDGE3 1343 1393 -2.06436 -0.00327793 -5.92946 0.0072076 -0.00309323 -0.00758243 +EDGE3 1342 1393 -2.84925 11.6837 -6.06082 0.000341668 0.00992917 0.130351 +EDGE3 1343 1392 -2.76461 -11.6979 -5.82007 -0.00292462 -0.00486006 -0.129026 +EDGE3 1344 1394 -2.09386 -0.0100269 -5.92398 0.0057232 -0.00990366 0.00623911 +EDGE3 1343 1394 -2.87123 11.6756 -6.0508 0.000320383 -0.000989939 0.123428 +EDGE3 1344 1393 -2.77157 -11.6915 -5.80396 -0.00478957 -0.00031673 -0.119558 +EDGE3 1345 1395 -2.09968 -0.00362463 -5.91458 -0.0117057 0.00116366 0.00134062 +EDGE3 1344 1395 -2.84155 11.6731 -6.03879 -0.00115513 0.00165421 0.121675 +EDGE3 1345 1394 -2.7791 -11.6797 -5.80611 0.0144007 -0.000968051 -0.124029 +EDGE3 1346 1396 -2.09414 0.000818578 -5.91595 -0.000865935 0.0118625 -0.00462524 +EDGE3 1345 1396 -2.87124 11.6882 -6.04901 -8.80124e-05 -0.00208955 0.122426 +EDGE3 1346 1395 -2.82714 -11.666 -5.79224 -0.00268124 -0.00278076 -0.129708 +EDGE3 1346 1397 -2.88291 11.6641 -6.02422 0.0013857 -0.00823265 0.12932 +EDGE3 1347 1397 -2.1015 0.0046303 -5.93558 -0.00321993 0.00594853 -0.0123697 +EDGE3 1348 1398 -2.12157 -0.0144109 -5.89499 -0.0025709 0.00762666 0.00356397 +EDGE3 1347 1396 -2.80229 -11.6668 -5.80272 0.00652274 -5.63367e-05 -0.129803 +EDGE3 1347 1398 -2.87632 11.6686 -6.04372 -0.00605976 -0.00504481 0.125911 +EDGE3 1348 1397 -2.80169 -11.6905 -5.79807 -0.0027048 -0.00332164 -0.1263 +EDGE3 1348 1399 -2.90374 11.6401 -6.02051 -0.00482951 0.0041297 0.128906 +EDGE3 1349 1399 -2.12805 0.00644287 -5.89733 0.00251844 0.0008211 0.00361783 +EDGE3 1350 1400 -2.11262 -0.00546088 -5.92493 0.000128981 0.00240493 0.0022324 +EDGE3 1349 1398 -2.808 -11.6633 -5.80537 0.00216091 -0.000634407 -0.131084 +EDGE3 1349 1400 -2.92151 11.6526 -6.02526 -0.0063297 0.00277695 0.124916 +EDGE3 1350 1399 -2.78708 -11.6526 -5.78593 0.00261574 0.00314739 -0.128748 +EDGE3 1351 1401 -2.13716 0.0093222 -5.91241 -0.00109008 -0.00415744 0.0114081 +EDGE3 1350 1401 -2.91536 11.6387 -6.03576 0.00775507 0.00163024 0.133593 +EDGE3 1351 1400 -2.83417 -11.6534 -5.79806 -0.00356875 -0.000833378 -0.119376 +EDGE3 1352 1402 -2.1433 0.000872605 -5.93506 0.000789439 -0.000865031 0.00130616 +EDGE3 1351 1402 -2.91779 11.6405 -6.01816 0.00532386 0.00262071 0.124873 +EDGE3 1353 1403 -2.12489 -0.00940154 -5.88427 -0.00694076 0.00350586 -0.0060922 +EDGE3 1352 1401 -2.82409 -11.6605 -5.79831 0.000234407 -0.00434593 -0.135025 +EDGE3 1352 1403 -2.92212 11.6455 -6.01235 0.000982116 0.00604519 0.12476 +EDGE3 1353 1402 -2.8532 -11.6497 -5.784 0.00624824 -0.00446767 -0.131204 +EDGE3 1354 1404 -2.17863 9.0428e-05 -5.8798 0.000215415 -0.00210563 0.00613158 +EDGE3 1353 1404 -2.92264 11.6394 -6.02196 -0.0116512 -0.000398446 0.117838 +EDGE3 1354 1403 -2.85704 -11.6432 -5.78971 0.000391569 -0.000824934 -0.126734 +EDGE3 1355 1405 -2.1516 -0.0147218 -5.90084 0.00343109 0.0063127 0.00737831 +EDGE3 1354 1405 -2.94019 11.6375 -6.02167 0.00229474 0.0112246 0.12616 +EDGE3 1356 1406 -2.18126 0.0126154 -5.89749 0.00374579 -0.00443616 0.00168948 +EDGE3 1355 1404 -2.86322 -11.6303 -5.79425 0.00764007 0.00298421 -0.128607 +EDGE3 1355 1406 -2.93553 11.624 -6.02992 -0.00233677 0.00390463 0.1225 +EDGE3 1356 1405 -2.83889 -11.6141 -5.77702 -0.00512887 -0.000541271 -0.126224 +EDGE3 1357 1407 -2.17991 0.0134252 -5.90523 -0.00256871 0.000145256 0.00508844 +EDGE3 1356 1407 -2.93237 11.5981 -6.03117 0.00274127 0.00529651 0.132836 +EDGE3 1358 1408 -2.18872 -0.00228052 -5.88487 -0.0027026 -0.00665966 0.00636758 +EDGE3 1357 1406 -2.86015 -11.6202 -5.76883 -0.00401397 0.00592184 -0.120555 +EDGE3 1357 1408 -2.96955 11.6213 -6.02578 0.00354577 -0.00236054 0.129368 +EDGE3 1358 1407 -2.87876 -11.6086 -5.78385 -0.00210721 0.00349227 -0.126249 +EDGE3 1359 1409 -2.20008 -0.0124321 -5.87741 -0.00863848 0.00527722 0.00332043 +EDGE3 1358 1409 -2.95622 11.6125 -6.01495 -0.00113285 -0.000177207 0.12553 +EDGE3 1359 1408 -2.87993 -11.6155 -5.78151 -0.00924941 0.00167207 -0.121345 +EDGE3 1360 1410 -2.19353 -0.00566224 -5.87433 -0.00712543 -0.00403773 -0.000983106 +EDGE3 1359 1410 -2.96248 11.6051 -6.00614 -0.00748837 -0.00843276 0.123683 +EDGE3 1360 1409 -2.87574 -11.5993 -5.7686 0.00321667 0.0108476 -0.12876 +EDGE3 1361 1411 -2.23036 0.0190374 -5.88449 -0.00111954 -0.00737939 -0.00193445 +EDGE3 1360 1411 -2.98919 11.5715 -6.00921 0.00351272 0.00496397 0.124824 +EDGE3 1361 1410 -2.89253 -11.6028 -5.756 0.00817314 0.00285071 -0.127398 +EDGE3 1362 1412 -2.22146 -0.0194989 -5.88356 0.00409714 -0.00493205 -0.00424306 +EDGE3 1361 1412 -3.00803 11.5859 -5.99752 0.00259232 -0.00241496 0.124977 +EDGE3 1362 1411 -2.91271 -11.603 -5.75452 -0.00221508 0.00333959 -0.129926 +EDGE3 1363 1413 -2.22006 -0.00057697 -5.86404 -0.00602973 -0.00510602 -0.00698489 +EDGE3 1362 1413 -2.97345 11.5598 -6.00867 0.00130372 0.00318301 0.125548 +EDGE3 1363 1412 -2.9149 -11.5769 -5.79065 0.000565824 0.00430325 -0.122944 +EDGE3 1364 1414 -2.22791 -0.00812218 -5.8723 0.00244966 -0.00282358 0.00217579 +EDGE3 1363 1414 -3.00016 11.5582 -5.97633 -0.00629633 0.00116891 0.132794 +EDGE3 1364 1413 -2.90075 -11.5643 -5.74563 0.000837549 0.00209663 -0.124855 +EDGE3 1365 1415 -2.22761 0.00527864 -5.87439 0.00859264 -0.00781837 0.00472893 +EDGE3 1364 1415 -3.00268 11.552 -6.00492 0.0040985 -2.85631e-05 0.124498 +EDGE3 1365 1414 -2.93298 -11.5777 -5.74804 -0.00585783 -0.00415869 -0.140685 +EDGE3 1366 1416 -2.26805 -0.00441978 -5.85115 0.00884662 0.00735493 -0.00179339 +EDGE3 1365 1416 -3.01311 11.5507 -5.9761 0.0036449 0.00247152 0.125172 +EDGE3 1366 1415 -2.91907 -11.5518 -5.75654 -0.00278908 -0.00679583 -0.123074 +EDGE3 1367 1417 -2.24451 0.00301652 -5.87698 -0.00487798 -0.00434163 0.0036326 +EDGE3 1366 1417 -3.028 11.5604 -5.99311 0.00335944 -0.00292971 0.119826 +EDGE3 1367 1416 -2.94021 -11.5614 -5.7552 0.00410871 0.000836068 -0.129742 +EDGE3 1368 1418 -2.2677 -0.00956328 -5.86489 -6.12128e-05 -0.00228297 -0.000610906 +EDGE3 1367 1418 -3.03899 11.5531 -5.97473 -0.00191716 -0.00115322 0.118641 +EDGE3 1368 1417 -2.94269 -11.5571 -5.72579 0.00313035 0.00409602 -0.129472 +EDGE3 1369 1419 -2.26965 -0.00535092 -5.87749 0.00741453 -0.004368 0.000730071 +EDGE3 1368 1419 -3.0564 11.5337 -5.95739 -0.0060529 0.00143464 0.122211 +EDGE3 1369 1418 -2.9594 -11.5529 -5.74436 -0.0037783 -0.00844506 -0.127529 +EDGE3 1370 1420 -2.27081 -0.0182855 -5.84897 -0.00280852 -0.00182251 -0.00452195 +EDGE3 1369 1420 -3.05023 11.5285 -5.95957 -0.0111375 0.000632127 0.127047 +EDGE3 1370 1419 -2.93842 -11.5352 -5.73931 -0.00357588 0.000975737 -0.133374 +EDGE3 1371 1421 -2.28639 0.0110967 -5.84945 -0.00171443 -0.00191537 -0.00619632 +EDGE3 1370 1421 -3.05522 11.5197 -5.98805 -0.00145345 0.00265242 0.126571 +EDGE3 1371 1420 -2.96977 -11.5288 -5.72642 0.00202372 0.00149381 -0.12769 +EDGE3 1371 1422 -3.06028 11.5165 -5.96884 0.0104185 -0.00020839 0.129747 +EDGE3 1372 1422 -2.29699 0.00564388 -5.855 0.00167644 0.000264891 0.00310118 +EDGE3 1373 1423 -2.30515 0.00246983 -5.84793 -0.00584291 -0.00046039 0.00224554 +EDGE3 1372 1421 -2.98081 -11.5315 -5.72843 -0.000587863 0.00190556 -0.118693 +EDGE3 1372 1423 -3.06798 11.5128 -5.98532 0.00239842 0.00498132 0.114866 +EDGE3 1373 1422 -2.94534 -11.5177 -5.73969 0.00270589 0.0016075 -0.124978 +EDGE3 1374 1424 -2.31693 -0.00584871 -5.84466 -0.00175873 -0.00081418 -0.00279947 +EDGE3 1373 1424 -3.07531 11.516 -5.9742 -0.00611242 0.0048255 0.116612 +EDGE3 1374 1423 -2.97052 -11.5248 -5.73316 -0.00124299 -0.00623382 -0.131919 +EDGE3 1375 1425 -2.31307 8.23211e-05 -5.84543 0.00477918 0.00322486 -0.00573443 +EDGE3 1374 1425 -3.09376 11.5058 -5.96655 -0.00318943 0.00271303 0.132773 +EDGE3 1375 1424 -2.9764 -11.5052 -5.71285 -0.00491987 0.000999752 -0.120688 +EDGE3 1376 1426 -2.32691 0.00902051 -5.84959 -0.015004 0.00130273 -0.00796014 +EDGE3 1375 1426 -3.08254 11.4851 -5.97045 0.000113461 -0.00410603 0.126669 +EDGE3 1376 1425 -2.9957 -11.4958 -5.71011 0.000913137 -0.00182414 -0.127739 +EDGE3 1377 1427 -2.32941 0.0180245 -5.8209 0.00907119 0.000541622 0.00269123 +EDGE3 1376 1427 -3.09372 11.4707 -5.94013 -0.00054162 0.0015595 0.123743 +EDGE3 1377 1426 -3.01481 -11.4845 -5.72809 0.00735579 0.0048362 -0.126035 +EDGE3 1378 1428 -2.31561 -0.00428788 -5.84209 -0.00673357 0.0016468 0.00174353 +EDGE3 1377 1428 -3.10771 11.4796 -5.9416 0.00365399 0.0058741 0.116101 +EDGE3 1378 1427 -2.99644 -11.4855 -5.70567 0.00756108 0.00524484 -0.126171 +EDGE3 1379 1429 -2.36099 0.00410654 -5.83443 0.000207824 -0.00814561 0.00126078 +EDGE3 1378 1429 -3.10072 11.483 -5.93977 6.62133e-05 0.00969372 0.130531 +EDGE3 1379 1428 -3.02497 -11.4814 -5.72523 0.000614617 -0.00226643 -0.123547 +EDGE3 1380 1430 -2.36746 0.0178478 -5.84304 -0.0115887 -0.00126287 -4.07256e-05 +EDGE3 1379 1430 -3.11829 11.4729 -5.94777 -0.00348127 0.00215852 0.128064 +EDGE3 1380 1429 -3.01905 -11.4671 -5.70586 -0.00183774 0.00557964 -0.133634 +EDGE3 1381 1431 -2.35864 0.0129998 -5.81777 -0.00452356 -0.00568206 -0.00183378 +EDGE3 1380 1431 -3.12391 11.4626 -5.92034 0.00734852 -0.00177675 0.128224 +EDGE3 1381 1430 -3.03734 -11.4673 -5.71845 -0.00231555 -0.0016615 -0.122973 +EDGE3 1382 1432 -2.37407 0.00168262 -5.82809 0.00420993 -0.00050782 0.00726334 +EDGE3 1381 1432 -3.13039 11.4738 -5.94169 -0.00455199 0.0111108 0.13029 +EDGE3 1382 1431 -3.02311 -11.4838 -5.71868 0.000444025 0.0120141 -0.127952 +EDGE3 1383 1433 -2.37053 0.0037188 -5.83674 -0.00844058 0.00268044 -0.00447606 +EDGE3 1382 1433 -3.13987 11.4414 -5.93984 -0.00298402 -0.000221844 0.119496 +EDGE3 1383 1432 -3.0369 -11.4544 -5.69757 -0.0211514 0.00142936 -0.110367 +EDGE3 1384 1434 -2.39005 0.00150666 -5.81265 -0.00368792 -0.00474104 -0.00516222 +EDGE3 1383 1434 -3.14785 11.4428 -5.93305 -0.00393889 -0.00192228 0.128601 +EDGE3 1384 1433 -3.03409 -11.4553 -5.70563 -0.00616136 -0.00404152 -0.128225 +EDGE3 1385 1435 -2.36555 0.00160754 -5.80715 -0.0111066 0.00450351 0.0142738 +EDGE3 1384 1435 -3.15086 11.4455 -5.91564 0.00362311 -0.00923984 0.127925 +EDGE3 1385 1434 -3.05245 -11.4523 -5.70076 -0.00171923 0.000193516 -0.118379 +EDGE3 1386 1436 -2.40001 0.00321643 -5.79658 -0.00107261 0.00357173 0.000928172 +EDGE3 1385 1436 -3.15272 11.4203 -5.92296 0.0063208 -0.00755317 0.133455 +EDGE3 1386 1435 -3.06187 -11.417 -5.6928 0.00692614 -0.0114058 -0.119945 +EDGE3 1387 1437 -2.39981 0.00819449 -5.79501 -0.00336273 -0.00789369 0.00111894 +EDGE3 1386 1437 -3.16404 11.4196 -5.92199 0.00356836 -0.00139859 0.134907 +EDGE3 1387 1436 -3.07827 -11.4293 -5.68984 0.00542629 0.0095737 -0.127323 +EDGE3 1388 1438 -2.41213 -0.00886482 -5.78662 -0.00264805 0.0145064 0.000435654 +EDGE3 1387 1438 -3.17555 11.4172 -5.90636 0.00033516 0.00468506 0.124902 +EDGE3 1388 1437 -3.09031 -11.4251 -5.70708 0.00171596 -0.000903737 -0.127224 +EDGE3 1389 1439 -2.39746 -0.0014406 -5.8126 0.00165691 0.00492692 -0.0110674 +EDGE3 1388 1439 -3.16765 11.4084 -5.90675 -7.43948e-05 -0.000506856 0.129847 +EDGE3 1389 1438 -3.09254 -11.419 -5.68381 -0.00320677 0.000966567 -0.121645 +EDGE3 1390 1440 -2.42249 0.0025341 -5.79043 0.000579071 -0.00377649 0.000396273 +EDGE3 1389 1440 -3.18633 11.4148 -5.90238 -0.014347 -0.00414307 0.113243 +EDGE3 1390 1439 -3.10067 -11.417 -5.68664 -0.00540153 0.00300326 -0.132712 +EDGE3 1391 1441 -2.43251 0.0122439 -5.79403 -0.00289125 -0.00921633 0.00156272 +EDGE3 1390 1441 -3.18577 11.4088 -5.88666 -0.00114155 -0.00782858 0.122032 +EDGE3 1391 1440 -3.08695 -11.3977 -5.65903 0.00976536 -0.00545229 -0.125634 +EDGE3 1392 1442 -2.42634 0.00952624 -5.78506 -0.0088021 0.00166646 -0.00231507 +EDGE3 1391 1442 -3.21461 11.3768 -5.92287 0.00359752 0.00349226 0.127898 +EDGE3 1392 1441 -3.09616 -11.3986 -5.68395 0.00342265 -0.00303383 -0.132071 +EDGE3 1393 1443 -2.45456 0.0136242 -5.77217 -0.00379116 0.00148826 0.000706008 +EDGE3 1392 1443 -3.21531 11.3827 -5.90087 0.00080239 -0.00109662 0.126661 +EDGE3 1393 1442 -3.10448 -11.3919 -5.68363 0.000143597 0.00555986 -0.135291 +EDGE3 1394 1444 -2.45528 -0.00705639 -5.78234 0.00171385 -0.00749459 -0.000840034 +EDGE3 1393 1444 -3.21178 11.3696 -5.91792 -0.00179468 0.00340267 0.122346 +EDGE3 1394 1443 -3.0994 -11.3961 -5.68052 -0.000942719 -0.00428198 -0.12221 +EDGE3 1395 1445 -2.45722 -0.0114776 -5.77829 0.00259961 -0.00300421 -0.000257548 +EDGE3 1394 1445 -3.20734 11.3703 -5.89715 -0.000773842 -0.0035928 0.124711 +EDGE3 1395 1444 -3.13386 -11.3866 -5.67225 0.00923595 0.00129069 -0.130052 +EDGE3 1396 1446 -2.46599 -0.0014578 -5.77695 -0.00726054 0.0069381 0.000778885 +EDGE3 1395 1446 -3.23204 11.3576 -5.90448 -0.01009 -0.00241076 0.121992 +EDGE3 1396 1445 -3.12712 -11.3733 -5.65711 -0.00610241 0.00928759 -0.129696 +EDGE3 1397 1447 -2.49691 -0.00492325 -5.77908 0.0033435 -0.00218859 0.00405549 +EDGE3 1396 1447 -3.23753 11.374 -5.89145 -0.00280145 -0.00205007 0.13171 +EDGE3 1397 1446 -3.13259 -11.3718 -5.65528 0.0129821 0.00240126 -0.125561 +EDGE3 1398 1448 -2.4762 0.0227563 -5.76951 -0.000528655 -0.00431008 0.00890635 +EDGE3 1397 1448 -3.23382 11.3515 -5.88887 0.00632209 -0.000331738 0.129136 +EDGE3 1398 1447 -3.14522 -11.3539 -5.66361 -0.00410341 -0.0116064 -0.127732 +EDGE3 1399 1449 -2.49619 -0.0213419 -5.75234 0.00312638 -0.00631455 0.0100218 +EDGE3 1398 1449 -3.25728 11.3494 -5.87952 -0.00185935 0.00560907 0.12142 +EDGE3 1399 1448 -3.14382 -11.3706 -5.65347 0.0101214 0.00119009 -0.127515 +EDGE3 1400 1450 -2.51116 -0.00409776 -5.76849 0.000683116 0.00339789 0.00401137 +EDGE3 1399 1450 -3.25238 11.3509 -5.87727 -0.00275281 0.000352301 0.125025 +EDGE3 1400 1449 -3.15765 -11.3548 -5.65443 0.000321587 -0.00831389 -0.131236 +EDGE3 1401 1451 -2.48521 -0.0124538 -5.76841 0.00755159 -0.00288245 -0.00146646 +EDGE3 1400 1451 -3.26226 11.3275 -5.8775 -0.000775627 -0.00356031 0.123816 +EDGE3 1401 1450 -3.17531 -11.361 -5.64107 -0.00185435 0.00656927 -0.132296 +EDGE3 1402 1452 -2.49589 -0.0157905 -5.76397 0.00337121 -0.000183142 -0.0034783 +EDGE3 1401 1452 -3.27524 11.3311 -5.88984 0.00630465 0.0060838 0.12677 +EDGE3 1402 1451 -3.1635 -11.3563 -5.65303 0.00443324 -0.00331209 -0.124389 +EDGE3 1403 1453 -2.52537 -0.00594871 -5.74249 0.00363703 0.00344805 -0.00272493 +EDGE3 1402 1453 -3.28624 11.3043 -5.87494 0.00472992 -0.00106439 0.123426 +EDGE3 1403 1452 -3.18159 -11.3115 -5.63886 0.00569119 0.00343184 -0.137212 +EDGE3 1404 1454 -2.51607 -0.00603829 -5.73803 0.000950265 0.00515887 0.000452581 +EDGE3 1403 1454 -3.29699 11.3061 -5.86637 0.00579301 -0.00176469 0.118791 +EDGE3 1404 1453 -3.16932 -11.3109 -5.63284 0.00162186 -0.00355046 -0.126428 +EDGE3 1405 1455 -2.5272 0.000656615 -5.76003 -0.00755971 -0.00135987 -0.00952036 +EDGE3 1404 1455 -3.29467 11.306 -5.87011 0.00439459 0.000769998 0.129051 +EDGE3 1405 1454 -3.18934 -11.3022 -5.63825 -0.00529411 -0.000202259 -0.129231 +EDGE3 1406 1456 -2.53427 0.0027544 -5.75022 -0.000228386 0.00267798 0.00635421 +EDGE3 1406 1455 -3.18223 -11.3097 -5.62174 -0.0107863 -0.00271104 -0.111115 +EDGE3 1405 1456 -3.30507 11.301 -5.86355 0.00028346 0.00324735 0.1299 +EDGE3 1407 1457 -2.55426 0.00114953 -5.75388 0.0015796 0.0162836 0.00132451 +EDGE3 1406 1457 -3.31667 11.2858 -5.85098 0.00192668 -0.00961786 0.124355 +EDGE3 1407 1456 -3.20773 -11.286 -5.62414 -0.00281891 -0.00498004 -0.121679 +EDGE3 1408 1458 -2.56755 -0.000119075 -5.73292 -0.00216575 0.00219456 -0.00223093 +EDGE3 1407 1458 -3.31651 11.285 -5.8534 -0.00157609 -0.00300849 0.114345 +EDGE3 1408 1457 -3.22629 -11.2831 -5.62323 0.00155753 -0.000896623 -0.12888 +EDGE3 1409 1459 -2.55754 0.00455343 -5.73625 -0.000365443 0.00585974 -0.00136417 +EDGE3 1408 1459 -3.30821 11.265 -5.84876 -0.00308261 -0.0020447 0.133587 +EDGE3 1409 1458 -3.23096 -11.3032 -5.62304 0.001401 0.00812587 -0.11992 +EDGE3 1410 1460 -2.55584 -0.00337109 -5.72617 -0.00863035 -0.00330919 0.00558037 +EDGE3 1409 1460 -3.33953 11.2748 -5.85779 0.00577023 -0.00205039 0.12213 +EDGE3 1410 1459 -3.23957 -11.2912 -5.61893 -0.012736 0.00257779 -0.113418 +EDGE3 1411 1461 -2.56038 -0.00946869 -5.71988 0.00309232 -0.00157244 0.00415676 +EDGE3 1410 1461 -3.33207 11.2655 -5.85397 0.00629251 -0.000864038 0.122496 +EDGE3 1411 1460 -3.23657 -11.2792 -5.63301 0.00238282 0.00496861 -0.116857 +EDGE3 1412 1462 -2.57269 -0.000405173 -5.73253 -0.00173136 0.00245601 0.00116458 +EDGE3 1411 1462 -3.33594 11.2616 -5.84999 -0.00276663 -0.00163724 0.131309 +EDGE3 1412 1461 -3.2372 -11.281 -5.61913 0.00996514 0.00559401 -0.12721 +EDGE3 1413 1463 -2.57925 -0.00348118 -5.7256 -0.00187753 0.00495906 -0.000748259 +EDGE3 1412 1463 -3.34504 11.2466 -5.83857 0.00495612 -0.00266843 0.130416 +EDGE3 1413 1462 -3.23836 -11.2789 -5.59886 0.00563452 0.0015863 -0.121631 +EDGE3 1414 1464 -2.58499 0.0115179 -5.72675 -0.00261868 0.00428278 -0.00400632 +EDGE3 1413 1464 -3.3377 11.2499 -5.83084 -0.000312908 -0.00167721 0.128462 +EDGE3 1414 1463 -3.23097 -11.2571 -5.63055 0.00387703 0.0117649 -0.131354 +EDGE3 1415 1465 -2.59628 0.0146975 -5.71809 0.00040744 -0.00378831 -0.00256947 +EDGE3 1414 1465 -3.3603 11.2648 -5.82988 -0.00447449 -0.00834244 0.114717 +EDGE3 1415 1464 -3.25872 -11.2485 -5.60703 0.00387018 0.00302139 -0.124716 +EDGE3 1416 1466 -2.60577 0.00305904 -5.70025 0.00327024 -0.0149745 0.00136906 +EDGE3 1415 1466 -3.377 11.2218 -5.84557 0.000177391 0.0019626 0.132708 +EDGE3 1416 1465 -3.24956 -11.2375 -5.59562 0.00863004 -0.00496056 -0.119492 +EDGE3 1417 1467 -2.61484 0.00436946 -5.71676 -0.0032251 -0.00384091 0.000468286 +EDGE3 1416 1467 -3.38518 11.2406 -5.83177 -0.0125711 0.00988213 0.12516 +EDGE3 1417 1466 -3.27125 -11.2397 -5.59684 -0.00602458 -0.00448815 -0.124309 +EDGE3 1418 1468 -2.61528 0.00064688 -5.71579 -0.00418651 -0.000669222 0.00934853 +EDGE3 1417 1468 -3.36899 11.2182 -5.83721 0.00274807 0.00453714 0.127824 +EDGE3 1418 1467 -3.27472 -11.239 -5.59428 0.000329674 -0.00377459 -0.116211 +EDGE3 1419 1469 -2.61641 0.00262265 -5.70194 -0.000836085 0.00739266 -0.00364297 +EDGE3 1418 1469 -3.38638 11.1995 -5.81684 0.00101536 -0.00445328 0.122853 +EDGE3 1419 1468 -3.28568 -11.2077 -5.60671 0.00596664 -0.00482226 -0.130339 +EDGE3 1420 1470 -2.63483 0.00803992 -5.69968 0.00152253 -0.00129564 0.00320869 +EDGE3 1419 1470 -3.40561 11.1935 -5.81737 9.58078e-05 -0.00385567 0.130566 +EDGE3 1420 1469 -3.29584 -11.21 -5.59564 0.000402544 0.00243566 -0.132542 +EDGE3 1421 1471 -2.65597 -0.0029324 -5.70406 -0.00353633 -0.00569193 0.000962036 +EDGE3 1420 1471 -3.3898 11.1946 -5.82207 0.00116754 -0.00260106 0.122787 +EDGE3 1421 1470 -3.31531 -11.1995 -5.58448 0.00240274 0.00696329 -0.122902 +EDGE3 1422 1472 -2.643 0.0072549 -5.68878 -0.00271707 0.0111126 -0.00140855 +EDGE3 1421 1472 -3.40682 11.184 -5.80035 -0.00431184 0.0155264 0.127389 +EDGE3 1422 1471 -3.29914 -11.2087 -5.59908 0.0012269 0.000149205 -0.124698 +EDGE3 1423 1473 -2.64924 0.00647185 -5.69383 0.00373333 0.00339419 0.00455092 +EDGE3 1422 1473 -3.42144 11.1629 -5.81813 -0.00928808 -0.00976673 0.125093 +EDGE3 1423 1472 -3.30902 -11.2048 -5.55832 0.0128302 0.00451174 -0.119337 +EDGE3 1424 1474 -2.65643 -0.0264658 -5.67565 0.00774607 5.80981e-05 0.00209857 +EDGE3 1423 1474 -3.44057 11.1866 -5.81357 0.000114718 0.000223448 0.122423 +EDGE3 1424 1473 -3.31217 -11.1916 -5.54935 0.00334001 0.00426942 -0.130148 +EDGE3 1425 1475 -2.67255 -0.0135457 -5.67253 0.000284268 -0.00237701 0.00230505 +EDGE3 1424 1475 -3.41876 11.1575 -5.79684 -9.50579e-05 -0.0113769 0.133133 +EDGE3 1425 1474 -3.30362 -11.184 -5.5587 -0.00484341 0.00660641 -0.127428 +EDGE3 1426 1476 -2.66609 -0.000342451 -5.68387 0.000940114 0.0042832 -0.00533968 +EDGE3 1425 1476 -3.4402 11.1673 -5.78329 -0.00450174 0.00462107 0.127244 +EDGE3 1426 1475 -3.33259 -11.1611 -5.57106 -0.00216024 -0.00122585 -0.129001 +EDGE3 1427 1477 -2.67874 0.00455244 -5.66822 0.00925505 -0.000864875 -0.000292955 +EDGE3 1426 1477 -3.45226 11.1475 -5.81133 0.00156882 0.00404512 0.126136 +EDGE3 1427 1476 -3.34585 -11.152 -5.53681 -0.00562672 -0.00180824 -0.123817 +EDGE3 1428 1478 -2.69224 0.00981948 -5.68193 -0.00135094 0.00558074 0.00605272 +EDGE3 1427 1478 -3.44663 11.1443 -5.78712 -0.0095858 -0.00171284 0.123748 +EDGE3 1428 1477 -3.33179 -11.1586 -5.54466 -0.00229092 -0.00590133 -0.134915 +EDGE3 1429 1479 -2.70902 -0.0150968 -5.67795 -0.00279965 -0.000729584 0.00586528 +EDGE3 1428 1479 -3.44389 11.1491 -5.79837 -0.00571493 0.00120026 0.134068 +EDGE3 1429 1478 -3.34737 -11.1478 -5.57062 0.00582232 0.00781458 -0.132797 +EDGE3 1430 1480 -2.71352 -0.00604255 -5.66348 -0.00250387 0.00197402 -0.00419338 +EDGE3 1429 1480 -3.45749 11.1357 -5.7818 0.00095691 -0.00334008 0.12926 +EDGE3 1430 1479 -3.34437 -11.1513 -5.57257 0.000495014 -0.00155308 -0.116142 +EDGE3 1431 1481 -2.73402 -0.00375305 -5.66605 -0.000489123 0.00332675 0.00681011 +EDGE3 1430 1481 -3.46638 11.1252 -5.77958 0.00274031 0.00562718 0.13029 +EDGE3 1431 1480 -3.36927 -11.1427 -5.57105 -0.00565752 -0.000215283 -0.131286 +EDGE3 1432 1482 -2.73165 -0.0158827 -5.66152 -0.000439031 -0.00383595 -0.000662837 +EDGE3 1431 1482 -3.49306 11.1245 -5.77443 -0.00465623 0.0060127 0.121327 +EDGE3 1432 1481 -3.38257 -11.1356 -5.53411 -0.00558735 -0.00366963 -0.123547 +EDGE3 1433 1483 -2.73212 -0.0117035 -5.65875 -0.0054219 -0.000891107 -0.00347713 +EDGE3 1432 1483 -3.47603 11.1433 -5.7842 -0.00410611 0.00527587 0.126228 +EDGE3 1433 1482 -3.36802 -11.1011 -5.54939 -0.00341541 0.00638435 -0.131694 +EDGE3 1434 1484 -2.73268 -0.00778635 -5.65608 -0.00213185 -0.00692638 0.00236521 +EDGE3 1433 1484 -3.47858 11.1053 -5.77255 -0.00494056 0.00296691 0.128853 +EDGE3 1434 1483 -3.38176 -11.1006 -5.54744 0.00171519 -0.000382897 -0.131834 +EDGE3 1435 1485 -2.74662 -0.0125737 -5.65512 0.000832974 0.00897526 -0.00101962 +EDGE3 1434 1485 -3.49372 11.1034 -5.76739 0.00449267 0.00117118 0.125398 +EDGE3 1435 1484 -3.39029 -11.1008 -5.51589 -0.000963355 -0.0034631 -0.127519 +EDGE3 1435 1486 -3.50174 11.1009 -5.76051 0.0077356 -0.00482213 0.129603 +EDGE3 1436 1486 -2.75181 0.0132258 -5.66021 0.00230421 -0.0033201 0.00223483 +EDGE3 1437 1487 -2.75922 -0.00616133 -5.65511 0.00122771 0.000237489 0.00100046 +EDGE3 1436 1485 -3.38979 -11.1051 -5.54623 -0.00295137 -0.00659435 -0.125624 +EDGE3 1436 1487 -3.4935 11.1024 -5.7586 -0.0017107 0.0059031 0.117024 +EDGE3 1437 1486 -3.4083 -11.0643 -5.52466 -0.00663832 0.00773309 -0.12602 +EDGE3 1438 1488 -2.7734 0.00163961 -5.64318 0.00317729 -0.00171556 -0.00106887 +EDGE3 1437 1488 -3.51269 11.0715 -5.74819 0.00948592 0.00469768 0.125656 +EDGE3 1438 1487 -3.4016 -11.0842 -5.52362 0.00328703 0.000435361 -0.123586 +EDGE3 1439 1489 -2.76457 0.00616964 -5.6639 -0.00453745 -0.0053623 -0.00203013 +EDGE3 1438 1489 -3.54234 11.0672 -5.72874 0.00180431 -0.00207949 0.131056 +EDGE3 1439 1488 -3.4208 -11.0871 -5.53203 -0.000951846 0.00120236 -0.133541 +EDGE3 1440 1490 -2.76807 -0.00856747 -5.65457 -0.00206982 -0.00445226 0.0033067 +EDGE3 1439 1490 -3.53768 11.048 -5.74592 0.0140956 -0.00093805 0.128043 +EDGE3 1440 1489 -3.42008 -11.0542 -5.51565 0.002396 0.00229822 -0.120119 +EDGE3 1441 1491 -2.78497 -0.00185082 -5.659 0.00139777 0.00210812 -0.00372818 +EDGE3 1440 1491 -3.52873 11.0463 -5.75181 0.00794401 -0.00219174 0.134015 +EDGE3 1441 1490 -3.41962 -11.0505 -5.51925 0.0087805 0.00107607 -0.119571 +EDGE3 1442 1492 -2.79461 0.00959898 -5.64149 0.00172405 -0.00672778 -0.00107178 +EDGE3 1441 1492 -3.54522 11.0542 -5.73926 0.00240628 0.00169831 0.118858 +EDGE3 1442 1491 -3.42798 -11.0557 -5.51912 -0.00106597 -0.000380084 -0.131011 +EDGE3 1443 1493 -2.81422 0.00253006 -5.61637 0.00166022 -0.00423617 -0.00798885 +EDGE3 1442 1493 -3.54135 11.044 -5.72066 0.00176987 0.00507762 0.121897 +EDGE3 1444 1494 -2.81744 -0.00616017 -5.60465 -0.00494247 0.00134229 0.00269949 +EDGE3 1443 1492 -3.43367 -11.0432 -5.50641 0.00329887 -0.00621278 -0.123795 +EDGE3 1443 1494 -3.57552 11.0255 -5.72819 -0.000124976 -0.00200782 0.136625 +EDGE3 1444 1493 -3.45151 -11.0428 -5.50318 0.00718203 -0.00167067 -0.13043 +EDGE3 1445 1495 -2.8002 -0.00841318 -5.62115 0.00414226 0.000774577 -0.00274227 +EDGE3 1444 1495 -3.56764 11.0192 -5.71247 0.000896775 0.00106848 0.127066 +EDGE3 1445 1494 -3.44359 -11.0292 -5.50068 -0.0012264 -0.00136155 -0.116433 +EDGE3 1446 1496 -2.82194 -0.00937098 -5.62457 6.04879e-05 -0.00852213 2.37342e-05 +EDGE3 1445 1496 -3.56763 11.0152 -5.73184 0.00319088 0.00484179 0.12335 +EDGE3 1446 1495 -3.45931 -11.0263 -5.4758 0.00206778 -0.00337639 -0.127415 +EDGE3 1447 1497 -2.82962 -0.00360923 -5.61619 0.00203264 0.000865922 0.00578439 +EDGE3 1446 1497 -3.57665 11.0074 -5.72461 0.00776701 0.00795247 0.121304 +EDGE3 1447 1496 -3.46728 -11.0003 -5.48518 0.000458119 -0.00404805 -0.126236 +EDGE3 1448 1498 -2.81547 -0.00714143 -5.59524 -0.00306901 -0.00464821 -0.0108167 +EDGE3 1447 1498 -3.58647 10.9847 -5.70529 0.000805165 -0.00268278 0.136274 +EDGE3 1448 1497 -3.46438 -10.9907 -5.51478 0.00180977 -0.0050706 -0.122992 +EDGE3 1449 1499 -2.84594 0.00625667 -5.60971 -0.00836935 -0.00440722 -0.000908433 +EDGE3 1448 1499 -3.60617 11.0054 -5.71724 0.00427682 -0.00823383 0.123736 +EDGE3 1449 1498 -3.47123 -11.0034 -5.48684 0.00344935 0.00782358 -0.130211 +EDGE3 1449 1500 -3.59072 10.9917 -5.68912 0.00033721 0.00673651 0.124838 +EDGE3 1450 1500 -2.84929 0.00432901 -5.60941 0.00324497 -0.00678114 0.010171 +EDGE3 1451 1501 -2.85478 0.00526851 -5.60465 -0.00913822 0.000656339 0.000893154 +EDGE3 1450 1499 -3.48765 -10.9892 -5.46984 0.00302994 -0.00840451 -0.125254 +EDGE3 1450 1501 -3.59433 10.9679 -5.70994 0.00235761 0.00197233 0.12594 +EDGE3 1451 1500 -3.5093 -10.9797 -5.49938 -0.00427316 -0.00684061 -0.1357 +EDGE3 1451 1502 -3.61519 10.9758 -5.71783 -0.016007 -0.00736859 0.119428 +EDGE3 1452 1502 -2.87178 0.0145206 -5.57602 0.00589478 0.00431427 0.0102364 +EDGE3 1453 1503 -2.88521 0.00546249 -5.58936 3.29167e-06 -0.00305485 0.00239846 +EDGE3 1452 1501 -3.48981 -10.9751 -5.46573 -0.00637206 -0.00426297 -0.126864 +EDGE3 1452 1503 -3.60374 10.9607 -5.70362 0.00603507 -0.00278536 0.130854 +EDGE3 1453 1502 -3.49995 -10.9667 -5.47951 0.0037669 0.00584575 -0.127672 +EDGE3 1454 1504 -2.89432 0.00510481 -5.5822 0.00281199 0.00353803 0.000103062 +EDGE3 1453 1504 -3.63757 10.9609 -5.71238 0.0105568 0.00414117 0.115704 +EDGE3 1454 1503 -3.50994 -10.9498 -5.46654 0.00304232 -0.00506095 -0.12514 +EDGE3 1455 1505 -2.89561 0.000295331 -5.57934 0.00217491 -0.00137602 -0.00258596 +EDGE3 1454 1505 -3.63803 10.9565 -5.69966 9.62191e-06 -0.00162973 0.119854 +EDGE3 1455 1504 -3.52225 -10.9405 -5.46631 -0.00275404 0.00784867 -0.136293 +EDGE3 1456 1506 -2.88455 -0.00369868 -5.57219 -0.00444815 0.000189524 -0.00422039 +EDGE3 1455 1506 -3.6288 10.9363 -5.7012 -0.00316675 0.0142675 0.1298 +EDGE3 1456 1505 -3.51573 -10.93 -5.46575 -0.0011697 -0.00365719 -0.122632 +EDGE3 1457 1507 -2.90255 0.00619833 -5.56554 -0.000880792 -0.00848173 -0.0118524 +EDGE3 1456 1507 -3.64908 10.922 -5.67585 0.00262252 0.00469454 0.132788 +EDGE3 1458 1508 -2.89523 0.00904123 -5.556 0.00394008 -0.00158379 0.00513994 +EDGE3 1457 1506 -3.52458 -10.9326 -5.46812 -0.000527025 0.00388456 -0.128714 +EDGE3 1458 1507 -3.54105 -10.9401 -5.46299 0.00652906 0.0118155 -0.12217 +EDGE3 1457 1508 -3.65664 10.944 -5.66513 0.00197157 -0.00246858 0.120182 +EDGE3 1459 1509 -2.91027 -0.01045 -5.57436 -0.00465881 0.00844032 0.000438192 +EDGE3 1458 1509 -3.66337 10.9081 -5.68207 -0.0016352 0.00697288 0.12255 +EDGE3 1459 1508 -3.54233 -10.924 -5.45437 -0.00245967 0.00368546 -0.126559 +EDGE3 1460 1510 -2.91531 -0.00605302 -5.55489 -0.000684003 0.0078624 0.00217898 +EDGE3 1459 1510 -3.65852 10.9132 -5.69033 0.0110744 -0.00176858 0.127933 +EDGE3 1460 1509 -3.55395 -10.9166 -5.45894 -0.00238068 -0.00276497 -0.130673 +EDGE3 1461 1511 -2.92917 -0.000859272 -5.57261 0.00141517 0.00221116 -0.0022714 +EDGE3 1460 1511 -3.67507 10.8975 -5.66487 -0.0124876 -0.00283578 0.117722 +EDGE3 1461 1510 -3.54481 -10.9235 -5.43611 0.000320767 0.00417354 -0.122504 +EDGE3 1462 1512 -2.93551 -0.00965368 -5.54005 0.00244065 0.00289408 0.00219067 +EDGE3 1461 1512 -3.68294 10.8881 -5.66311 -0.00551703 0.00984827 0.122126 +EDGE3 1462 1511 -3.54408 -10.8965 -5.45967 -0.00517811 -0.00124878 -0.133802 +EDGE3 1463 1513 -2.9701 -0.0111825 -5.54872 -0.00577691 0.00294611 -0.000603616 +EDGE3 1462 1513 -3.68899 10.8723 -5.65391 -0.00264416 0.00509568 0.124021 +EDGE3 1463 1512 -3.57521 -10.8989 -5.43856 -0.0036946 -0.00645828 -0.124682 +EDGE3 1464 1514 -2.93285 -0.0156707 -5.53287 0.000106833 0.00784522 -0.00239737 +EDGE3 1463 1514 -3.68257 10.8733 -5.6603 0.000942069 0.00409301 0.126684 +EDGE3 1464 1513 -3.58585 -10.89 -5.43994 0.00547557 0.00306459 -0.12767 +EDGE3 1465 1515 -2.95984 0.0225991 -5.54809 0.00340336 -0.00189502 0.00481711 +EDGE3 1464 1515 -3.68836 10.8556 -5.6462 -0.00350617 -0.00440824 0.125403 +EDGE3 1465 1514 -3.58055 -10.8684 -5.45471 0.00899103 -0.00562263 -0.126365 +EDGE3 1466 1516 -2.96027 0.0188499 -5.54606 -0.00724769 -0.00326112 -0.00679317 +EDGE3 1465 1516 -3.6955 10.8688 -5.65608 0.00638966 -0.00662141 0.114734 +EDGE3 1466 1515 -3.5816 -10.8584 -5.42154 0.00259785 0.0140728 -0.13602 +EDGE3 1467 1517 -2.96692 -0.0113294 -5.55755 -0.00740837 -0.00760572 0.0067711 +EDGE3 1466 1517 -3.7045 10.8593 -5.62935 -0.000253434 -0.00360656 0.124688 +EDGE3 1467 1516 -3.588 -10.86 -5.42198 -0.00270217 -0.00230404 -0.128783 +EDGE3 1468 1518 -2.98061 -0.00703382 -5.54136 0.00120064 0.00516916 -0.00630347 +EDGE3 1467 1518 -3.72914 10.8381 -5.66386 -0.00435416 -0.00549984 0.116553 +EDGE3 1468 1517 -3.60986 -10.8563 -5.4329 0.00153298 -0.00134019 -0.139682 +EDGE3 1469 1519 -2.98462 0.00169071 -5.52377 0.00180341 -0.00180217 -0.00619437 +EDGE3 1468 1519 -3.71944 10.8399 -5.64982 0.00295103 0.00640798 0.119332 +EDGE3 1469 1518 -3.60279 -10.8371 -5.42862 0.000663197 0.00411912 -0.118499 +EDGE3 1470 1520 -2.98589 -0.0057942 -5.53048 -0.000127546 0.000472713 0.00458818 +EDGE3 1469 1520 -3.72746 10.8344 -5.64199 0.00159458 -0.0054954 0.132259 +EDGE3 1470 1519 -3.60216 -10.8327 -5.42149 -0.00190689 -0.00197094 -0.120018 +EDGE3 1471 1521 -3.00065 -0.00916784 -5.52245 -0.00258212 -0.00620428 0.00358675 +EDGE3 1470 1521 -3.74262 10.8236 -5.62556 0.00454177 -0.00636466 0.119304 +EDGE3 1471 1520 -3.61012 -10.8477 -5.42404 0.000532619 0.00583992 -0.131708 +EDGE3 1472 1522 -3.00501 -0.00172423 -5.52395 0.00219995 0.000682781 0.00681885 +EDGE3 1471 1522 -3.7316 10.8056 -5.63615 -0.0107112 -0.00357642 0.129531 +EDGE3 1472 1521 -3.62319 -10.8013 -5.40108 -0.00471786 0.00460305 -0.114293 +EDGE3 1473 1523 -3.00714 0.00668822 -5.51189 0.00538637 0.00200124 0.00882843 +EDGE3 1472 1523 -3.75965 10.792 -5.63491 -0.0131487 -0.00418266 0.123394 +EDGE3 1473 1522 -3.62207 -10.8039 -5.40337 -0.00352914 -0.00668286 -0.125057 +EDGE3 1474 1524 -3.01441 0.00118454 -5.50765 -0.00391291 0.00708384 -0.00752559 +EDGE3 1473 1524 -3.74619 10.7842 -5.62121 0.000430772 -0.00566346 0.125665 +EDGE3 1474 1523 -3.64353 -10.8184 -5.40022 0.00347607 0.00724062 -0.122146 +EDGE3 1475 1525 -3.02775 -0.0273248 -5.51721 -0.000532707 0.00320232 0.00200942 +EDGE3 1474 1525 -3.78615 10.7815 -5.62814 -7.51954e-05 0.001654 0.129379 +EDGE3 1475 1524 -3.63131 -10.7982 -5.39316 0.00424659 0.00278551 -0.134089 +EDGE3 1476 1526 -3.03409 0.0122034 -5.50328 0.00307039 -0.000561299 -0.000332066 +EDGE3 1475 1526 -3.76499 10.7831 -5.60423 0.000724418 -0.00737935 0.131147 +EDGE3 1476 1525 -3.65988 -10.7976 -5.39174 0.00131436 -0.000595005 -0.12906 +EDGE3 1477 1527 -3.03126 0.00412424 -5.50563 0.00787423 -7.92677e-05 0.00511334 +EDGE3 1476 1527 -3.76829 10.7819 -5.59814 -0.00428279 -0.00290308 0.125749 +EDGE3 1477 1526 -3.65599 -10.7745 -5.38502 -0.00625614 0.00175338 -0.123718 +EDGE3 1478 1528 -3.03583 -0.00459215 -5.47702 -0.0017379 -0.00272211 0.00353867 +EDGE3 1477 1528 -3.78962 10.762 -5.60043 -0.00142081 0.00893417 0.123663 +EDGE3 1478 1527 -3.67535 -10.7894 -5.37885 -0.0066576 -0.000595987 -0.124287 +EDGE3 1479 1529 -3.05567 -0.0189481 -5.47766 -0.00373911 0.00244372 0.00283435 +EDGE3 1478 1529 -3.79968 10.7572 -5.59174 0.00169201 -3.8441e-05 0.119872 +EDGE3 1479 1528 -3.66876 -10.7739 -5.36767 -0.00349811 -0.006589 -0.114257 +EDGE3 1480 1530 -3.06667 8.79437e-06 -5.48258 -0.00856264 0.00577917 -0.0075877 +EDGE3 1479 1530 -3.79567 10.7385 -5.57856 0.000426648 -0.00560061 0.127098 +EDGE3 1480 1529 -3.68228 -10.7699 -5.38776 -0.00268422 -0.00231433 -0.12509 +EDGE3 1481 1531 -3.06275 -0.00848308 -5.48009 -0.000360959 0.00659912 -0.000675461 +EDGE3 1480 1531 -3.80012 10.7285 -5.58297 0.000130585 -0.000298726 0.128798 +EDGE3 1481 1530 -3.67558 -10.7439 -5.38089 -0.00293304 -0.00051304 -0.129615 +EDGE3 1482 1532 -3.07036 -0.0105173 -5.47812 0.013077 -0.001994 0.00205078 +EDGE3 1481 1532 -3.80137 10.7354 -5.59027 0.0021468 -0.00477332 0.121292 +EDGE3 1482 1531 -3.70114 -10.7316 -5.3779 0.00686032 0.00657484 -0.123084 +EDGE3 1483 1533 -3.07438 0.0164715 -5.46159 0.003481 0.0031752 0.00518108 +EDGE3 1482 1533 -3.82784 10.723 -5.58552 -0.00844719 -0.00145556 0.121959 +EDGE3 1483 1532 -3.68687 -10.7362 -5.36899 0.00203284 -0.0061121 -0.126473 +EDGE3 1484 1534 -3.10274 -0.0132774 -5.47752 -0.00105101 -0.00643101 -0.000226166 +EDGE3 1483 1534 -3.82425 10.7215 -5.57981 -0.00337563 7.91389e-05 0.123812 +EDGE3 1484 1533 -3.69394 -10.7244 -5.34299 0.00207979 -0.00450844 -0.126827 +EDGE3 1485 1535 -3.11388 -0.00336538 -5.46316 -0.00104981 0.00065507 -0.00113896 +EDGE3 1484 1535 -3.83845 10.7012 -5.58572 -0.0037816 0.00420927 0.124266 +EDGE3 1485 1534 -3.70098 -10.7256 -5.34312 -0.00180757 -0.00834078 -0.119924 +EDGE3 1486 1536 -3.08745 0.00482868 -5.47773 0.00338158 -0.00126772 -2.51139e-05 +EDGE3 1485 1536 -3.82628 10.6762 -5.57409 0.00306607 -0.00446962 0.123596 +EDGE3 1486 1535 -3.69204 -10.706 -5.35597 0.00307867 0.00352418 -0.125415 +EDGE3 1487 1537 -3.10054 0.000561335 -5.45347 0.00257943 0.0038149 0.00825911 +EDGE3 1486 1537 -3.84232 10.7032 -5.57094 -0.00471528 0.0040507 0.123224 +EDGE3 1487 1536 -3.70658 -10.7088 -5.33415 -0.00283842 -0.00646614 -0.124472 +EDGE3 1488 1538 -3.09851 0.00340708 -5.46607 0.00816715 0.00921622 -0.00577539 +EDGE3 1487 1538 -3.84406 10.6769 -5.57439 -0.00489823 0.00516677 0.126995 +EDGE3 1488 1537 -3.7206 -10.6888 -5.33847 -0.00607787 -0.0061083 -0.123191 +EDGE3 1489 1539 -3.13626 -0.00272486 -5.45168 -0.00251326 0.00406789 -0.0107638 +EDGE3 1488 1539 -3.85007 10.66 -5.54827 0.00178338 -0.0125929 0.120362 +EDGE3 1489 1538 -3.73984 -10.6793 -5.3606 0.0031659 0.0043871 -0.129426 +EDGE3 1490 1540 -3.14045 0.00101574 -5.44341 0.00296604 0.0103256 -0.00337717 +EDGE3 1489 1540 -3.87369 10.6458 -5.55326 0.00662208 0.00334753 0.122564 +EDGE3 1490 1539 -3.74941 -10.6726 -5.34081 -0.000129991 -0.00385127 -0.128564 +EDGE3 1491 1541 -3.13566 0.00162465 -5.42202 0.0104003 0.00713443 -0.00156484 +EDGE3 1490 1541 -3.87287 10.6466 -5.55299 -0.00191306 -0.0108899 0.128108 +EDGE3 1491 1540 -3.74216 -10.6639 -5.33155 -0.00909836 0.00126419 -0.134022 +EDGE3 1492 1542 -3.15478 0.00208178 -5.4321 -0.00635823 -0.00147532 -0.00105229 +EDGE3 1491 1542 -3.86688 10.6481 -5.55581 -0.0085326 -0.00435925 0.133928 +EDGE3 1492 1541 -3.76518 -10.6747 -5.34244 0.00139985 -0.00585942 -0.133225 +EDGE3 1493 1543 -3.16213 0.00801121 -5.45132 0.000876086 0.00342818 -0.000912451 +EDGE3 1492 1543 -3.87894 10.6372 -5.53707 -0.004727 -0.0035524 0.117083 +EDGE3 1493 1542 -3.74297 -10.6434 -5.29949 -0.00348423 -0.00603978 -0.124046 +EDGE3 1494 1544 -3.1545 0.00194999 -5.42556 0.00834739 0.00829807 -0.00109712 +EDGE3 1493 1544 -3.86892 10.6299 -5.54505 0.00300143 -0.00359816 0.124854 +EDGE3 1494 1543 -3.75685 -10.649 -5.32532 0.00412232 -0.00736267 -0.115544 +EDGE3 1495 1545 -3.18206 -0.00384032 -5.42175 0.00285095 -0.00555932 0.00153945 +EDGE3 1494 1545 -3.89642 10.608 -5.53748 -0.000874186 0.00734301 0.120679 +EDGE3 1495 1544 -3.7704 -10.6357 -5.31094 0.0100734 -0.00308193 -0.131576 +EDGE3 1496 1546 -3.15961 0.00332659 -5.42269 0.00950074 0.00475737 -0.00649217 +EDGE3 1495 1546 -3.90062 10.614 -5.52938 0.00241018 -0.00951835 0.129445 +EDGE3 1496 1545 -3.77123 -10.6207 -5.31937 -0.00122865 0.0100908 -0.125902 +EDGE3 1497 1547 -3.19572 -0.00193143 -5.43272 0.00172976 0.00297702 0.00467913 +EDGE3 1496 1547 -3.9164 10.6088 -5.51279 0.000668297 -0.00540515 0.122614 +EDGE3 1497 1546 -3.78909 -10.5933 -5.32244 0.00242506 0.000919078 -0.127924 +EDGE3 1498 1548 -3.19779 -0.000825006 -5.41625 0.00184103 0.00507089 0.00458658 +EDGE3 1497 1548 -3.91304 10.6165 -5.5267 -0.00639719 -0.00581609 0.121555 +EDGE3 1498 1547 -3.78957 -10.6159 -5.29914 -0.0038781 -0.000582857 -0.128599 +EDGE3 1499 1549 -3.1995 0.00760044 -5.40156 -0.0043111 -0.00307495 0.00101126 +EDGE3 1498 1549 -3.91159 10.5694 -5.51309 -0.00571882 -0.00383373 0.120998 +EDGE3 1499 1548 -3.77741 -10.5997 -5.30878 -0.000661951 -0.00256837 -0.118435 +EDGE3 1500 1550 -3.20003 0.00429252 -5.41792 -0.00327761 0.00269017 0.00058342 +EDGE3 1499 1550 -3.91732 10.5733 -5.52328 0.00153488 0.00706453 0.122429 +EDGE3 1500 1549 -3.79008 -10.5944 -5.27608 -0.000483226 -0.0013095 -0.125347 +EDGE3 1501 1551 -3.2091 0.00564998 -5.40722 -0.00228055 -0.0030906 -0.000604251 +EDGE3 1500 1551 -3.90529 10.5908 -5.52308 -0.00613781 -5.36968e-05 0.122637 +EDGE3 1501 1550 -3.80115 -10.5768 -5.28592 0.00114351 0.00396865 -0.135899 +EDGE3 1502 1552 -3.20046 -0.0219335 -5.40239 0.00774445 0.00823378 -0.00661193 +EDGE3 1501 1552 -3.951 10.5634 -5.49821 0.0106181 -0.00256298 0.135589 +EDGE3 1502 1551 -3.80726 -10.5612 -5.30774 -0.00657967 -0.000224771 -0.121063 +EDGE3 1503 1553 -3.19643 0.00158948 -5.40445 0.00568389 -0.0143987 0.00197334 +EDGE3 1502 1553 -3.96178 10.5549 -5.4952 0.00242294 -0.00539163 0.130389 +EDGE3 1503 1552 -3.83992 -10.5525 -5.27223 0.00418086 0.00152073 -0.124764 +EDGE3 1504 1554 -3.23944 -0.0018978 -5.37631 5.94986e-05 -0.00682973 0.00240542 +EDGE3 1503 1554 -3.95415 10.5671 -5.48937 -0.00299751 -0.0049351 0.121694 +EDGE3 1504 1553 -3.821 -10.5294 -5.28682 -0.00115522 -0.00731157 -0.134288 +EDGE3 1505 1555 -3.23182 -0.00189645 -5.38538 0.00543846 0.000528976 -0.00666967 +EDGE3 1504 1555 -3.93934 10.5519 -5.48203 0.00361343 -0.0010198 0.127928 +EDGE3 1505 1554 -3.83168 -10.5541 -5.27583 -0.00467605 -0.00468801 -0.125255 +EDGE3 1506 1556 -3.23825 0.0343305 -5.38676 0.00296366 -0.00622642 -0.00371505 +EDGE3 1505 1556 -3.969 10.53 -5.49475 -0.00320258 0.00404776 0.13166 +EDGE3 1506 1555 -3.8352 -10.5582 -5.27975 0.00121159 -0.00166528 -0.126317 +EDGE3 1507 1557 -3.23465 -0.00741475 -5.38344 -0.00368374 -0.00143609 0.00286647 +EDGE3 1506 1557 -3.96864 10.5091 -5.49332 0.000359902 0.000817475 0.130523 +EDGE3 1507 1556 -3.84739 -10.536 -5.29048 -0.00804361 -0.00564885 -0.128769 +EDGE3 1508 1558 -3.25931 -0.0247945 -5.37252 0.00433135 -0.00100744 -0.00692064 +EDGE3 1507 1558 -3.94798 10.5052 -5.49097 -0.00664954 0.00422324 0.124761 +EDGE3 1508 1557 -3.83817 -10.5254 -5.27632 0.00428227 0.00367908 -0.124919 +EDGE3 1509 1559 -3.2494 -0.00975667 -5.3628 0.00454096 -0.00011157 0.00270291 +EDGE3 1508 1559 -3.99024 10.5085 -5.48011 -0.0106174 0.00134683 0.130006 +EDGE3 1509 1558 -3.84855 -10.5117 -5.25392 0.0010881 -0.00497193 -0.130647 +EDGE3 1510 1560 -3.26753 -0.00808517 -5.38833 -0.00848883 0.00126572 -0.00308428 +EDGE3 1509 1560 -3.97764 10.4867 -5.47331 -0.00105223 -0.00336771 0.123968 +EDGE3 1510 1559 -3.86312 -10.5181 -5.2516 -0.00105956 -0.0046268 -0.130675 +EDGE3 1511 1561 -3.25786 -0.000940883 -5.36589 0.00431132 -0.00547144 -0.00137101 +EDGE3 1510 1561 -4.01384 10.491 -5.46981 0.000171579 0.00438849 0.126389 +EDGE3 1511 1560 -3.88003 -10.5089 -5.23909 0.00466159 0.00255325 -0.125588 +EDGE3 1512 1562 -3.28222 -0.0204673 -5.35278 -0.00299863 0.00362087 -0.00101814 +EDGE3 1511 1562 -3.99471 10.4852 -5.4774 0.00386082 0.00536992 0.132426 +EDGE3 1512 1561 -3.86608 -10.4845 -5.26279 0.0047337 -0.000773671 -0.125909 +EDGE3 1513 1563 -3.27026 -0.0026923 -5.35607 -0.00319301 -0.00176075 -0.000308565 +EDGE3 1512 1563 -4.00632 10.4763 -5.4561 -0.00422499 -0.00312333 0.125186 +EDGE3 1513 1562 -3.87692 -10.4704 -5.2566 0.00196048 0.0021866 -0.124733 +EDGE3 1514 1564 -3.30168 -0.00835049 -5.34879 0.00111138 -0.00171428 0.00328747 +EDGE3 1513 1564 -4.00753 10.4519 -5.45803 0.00651049 0.00165912 0.125984 +EDGE3 1514 1563 -3.87958 -10.4748 -5.24987 -0.00225894 -0.0034708 -0.117191 +EDGE3 1515 1565 -3.30057 -0.00072943 -5.33732 -0.00257266 0.00573787 -0.00312474 +EDGE3 1514 1565 -4.00234 10.454 -5.46736 0.00100423 4.83297e-05 0.124697 +EDGE3 1515 1564 -3.8883 -10.4588 -5.23217 -0.000575764 0.000677949 -0.12109 +EDGE3 1516 1566 -3.31959 0.00459452 -5.33635 -0.00114615 -0.00777926 0.00440258 +EDGE3 1515 1566 -4.01157 10.4526 -5.42714 -0.0115759 -0.00698753 0.133508 +EDGE3 1516 1565 -3.87932 -10.4473 -5.23692 0.00861464 0.00615491 -0.125513 +EDGE3 1517 1567 -3.30466 -0.0106797 -5.34658 -0.00926816 -0.000154185 0.000896683 +EDGE3 1516 1567 -4.02671 10.4381 -5.47811 -0.00930973 -0.00524926 0.122444 +EDGE3 1517 1566 -3.91082 -10.4548 -5.23006 -0.000327621 -0.00198653 -0.1228 +EDGE3 1518 1568 -3.3154 0.00791378 -5.31576 0.00180786 0.00359704 0.00333225 +EDGE3 1517 1568 -4.02008 10.4124 -5.44747 0.000922741 0.005652 0.122847 +EDGE3 1518 1567 -3.89589 -10.4262 -5.24084 -0.00926229 0.00151465 -0.12692 +EDGE3 1519 1569 -3.31339 0.0142994 -5.32367 0.00295351 0.00503876 -0.00117254 +EDGE3 1518 1569 -4.05346 10.4008 -5.4496 0.00253758 0.0019385 0.124933 +EDGE3 1519 1568 -3.92878 -10.4328 -5.23542 0.00283254 -0.00734652 -0.125524 +EDGE3 1520 1570 -3.33207 0.00812849 -5.32024 0.00141092 0.00178208 -0.00226248 +EDGE3 1519 1570 -4.05529 10.4173 -5.42835 0.0169291 0.000284861 0.131213 +EDGE3 1520 1569 -3.91927 -10.4196 -5.23089 -0.00244167 0.00265959 -0.123931 +EDGE3 1521 1571 -3.33381 0.00607201 -5.34716 0.000992175 0.00446423 0.00079649 +EDGE3 1520 1571 -4.05312 10.3943 -5.42169 -0.00762808 -0.00185017 0.121833 +EDGE3 1521 1570 -3.93911 -10.4103 -5.23279 -0.000883845 -0.00109148 -0.130091 +EDGE3 1522 1572 -3.34813 -0.00496087 -5.31655 0.00263644 -0.00844799 -0.00321555 +EDGE3 1522 1571 -3.94956 -10.4135 -5.22066 0.00781228 0.000502291 -0.120671 +EDGE3 1521 1572 -4.03529 10.3919 -5.42521 -0.00235565 0.00926545 0.12185 +EDGE3 1522 1573 -4.06632 10.3813 -5.42938 0.00106562 -0.00584674 0.128018 +EDGE3 1523 1573 -3.37524 0.00168532 -5.30621 0.00540003 -0.0060005 0.0011052 +EDGE3 1524 1574 -3.37062 -0.0180191 -5.29668 -0.00309857 0.00670476 -0.00599861 +EDGE3 1523 1572 -3.93244 -10.3838 -5.20156 -0.00297814 -0.00394817 -0.119594 +EDGE3 1523 1574 -4.06929 10.3626 -5.41264 0.000795546 -0.00200867 0.127452 +EDGE3 1524 1573 -3.92746 -10.3788 -5.19877 -0.00269868 0.00126156 -0.12349 +EDGE3 1525 1575 -3.36435 -0.011523 -5.28915 0.000492615 -0.00163708 0.0037709 +EDGE3 1524 1575 -4.09401 10.3657 -5.41284 -0.00186757 -0.00285385 0.133215 +EDGE3 1525 1574 -3.93863 -10.3671 -5.19265 -0.00160095 -0.00220529 -0.130084 +EDGE3 1526 1576 -3.35946 -0.00804949 -5.29724 -0.006209 -0.000348838 0.00399435 +EDGE3 1525 1576 -4.09968 10.3552 -5.41311 -0.00382921 0.00254848 0.121702 +EDGE3 1526 1575 -3.94701 -10.3677 -5.19418 0.00333988 -0.000258509 -0.127703 +EDGE3 1527 1577 -3.37099 0.00729784 -5.29153 0.00722158 -0.000381864 0.000166732 +EDGE3 1526 1577 -4.0669 10.3361 -5.41023 0.00264051 0.00455866 0.122765 +EDGE3 1527 1576 -3.97422 -10.3482 -5.20087 0.00428279 -0.00165521 -0.122447 +EDGE3 1528 1578 -3.38379 -0.00324931 -5.28868 -0.0069051 -0.00203343 -0.0100777 +EDGE3 1527 1578 -4.09424 10.3462 -5.3937 0.0139202 0.00603531 0.123594 +EDGE3 1528 1577 -3.94969 -10.3405 -5.19277 -0.00959584 0.00453354 -0.125034 +EDGE3 1529 1579 -3.41054 -0.0112281 -5.30113 0.00384691 -0.000719488 0.0026762 +EDGE3 1528 1579 -4.11958 10.32 -5.40336 -0.000534206 -0.000561206 0.129175 +EDGE3 1529 1578 -3.97951 -10.3438 -5.15125 0.000680004 -0.00588547 -0.11985 +EDGE3 1530 1580 -3.40098 -0.00105606 -5.29238 0.011396 -0.00252938 -0.000219337 +EDGE3 1529 1580 -4.1021 10.3302 -5.38094 0.00573539 0.00311866 0.127079 +EDGE3 1530 1579 -3.97088 -10.3188 -5.16034 0.0056419 -0.000797192 -0.129242 +EDGE3 1531 1581 -3.42034 0.00329908 -5.27842 -0.00453064 0.00553129 0.00898623 +EDGE3 1530 1581 -4.12337 10.3112 -5.38239 0.000212252 0.0109023 0.117867 +EDGE3 1531 1580 -3.98244 -10.3161 -5.17554 -0.00364167 0.00384518 -0.125796 +EDGE3 1532 1582 -3.40401 -0.00340569 -5.28169 -0.00236212 0.0108741 -0.00920726 +EDGE3 1531 1582 -4.11926 10.3051 -5.38965 -0.000743977 0.00403732 0.122942 +EDGE3 1532 1581 -3.9836 -10.3196 -5.16161 -0.00764835 4.23959e-07 -0.12947 +EDGE3 1532 1583 -4.14923 10.3001 -5.37444 0.0019876 -0.000524307 0.12386 +EDGE3 1533 1583 -3.419 0.00478358 -5.26824 -0.0111534 0.00264491 0.000834926 +EDGE3 1534 1584 -3.41742 -0.00965317 -5.27848 0.00514389 0.00203202 0.00447265 +EDGE3 1533 1582 -3.99271 -10.3024 -5.16068 0.00434773 -0.00457059 -0.121499 +EDGE3 1533 1584 -4.15746 10.2993 -5.36032 -0.000406942 -0.00318815 0.129705 +EDGE3 1534 1583 -3.9987 -10.2982 -5.16068 0.0100202 0.00270328 -0.12353 +EDGE3 1534 1585 -4.15452 10.2603 -5.39231 0.00376476 0.00942843 0.124241 +EDGE3 1535 1585 -3.44855 0.0104101 -5.25472 -0.00334833 0.001105 0.000590841 +EDGE3 1536 1586 -3.44359 0.00807536 -5.26747 -0.000436779 0.00540867 0.00397585 +EDGE3 1535 1584 -4.00931 -10.2858 -5.14283 -0.00226256 0.00264131 -0.128726 +EDGE3 1535 1586 -4.14666 10.2766 -5.35208 0.00278474 -0.0111599 0.128181 +EDGE3 1536 1585 -4.01625 -10.2662 -5.13981 0.00421605 0.00632556 -0.120024 +EDGE3 1537 1587 -3.42448 -0.0110733 -5.23678 0.00174395 5.6944e-05 -0.00400874 +EDGE3 1536 1587 -4.14178 10.2469 -5.35364 0.000661739 0.00564955 0.117664 +EDGE3 1537 1586 -4.01943 -10.264 -5.13549 -0.00727195 -0.0041039 -0.125564 +EDGE3 1538 1588 -3.46271 0.00850521 -5.25287 -0.00358368 0.00690107 0.0102687 +EDGE3 1537 1588 -4.18216 10.2354 -5.35544 0.00458422 -2.26849e-05 0.130176 +EDGE3 1538 1587 -4.03094 -10.2616 -5.12958 -0.00363635 0.00093301 -0.131194 +EDGE3 1539 1589 -3.47051 0.0137924 -5.23276 -0.00550052 -0.00356133 0.00266842 +EDGE3 1538 1589 -4.17403 10.2211 -5.35003 0.00011848 6.51655e-05 0.129304 +EDGE3 1539 1588 -4.05423 -10.2425 -5.14249 0.0046198 -0.00244445 -0.135124 +EDGE3 1540 1590 -3.47338 0.0102543 -5.23255 0.00594671 -0.00731492 -0.000326625 +EDGE3 1539 1590 -4.16545 10.2369 -5.34934 0.00353044 -0.0047535 0.127582 +EDGE3 1540 1589 -4.04492 -10.2607 -5.15216 0.00587927 0.00652872 -0.134766 +EDGE3 1541 1591 -3.46701 0.0161239 -5.22144 0.00392386 -0.00422728 -0.00225257 +EDGE3 1540 1591 -4.18589 10.2288 -5.32542 0.00903099 -0.00370088 0.125495 +EDGE3 1541 1590 -4.0235 -10.2539 -5.13625 -0.00664931 -0.00433508 -0.124062 +EDGE3 1542 1592 -3.48794 -0.0177374 -5.22544 -0.00503345 0.00239024 0.000739383 +EDGE3 1541 1592 -4.19093 10.2032 -5.33333 -0.00536194 -0.00310539 0.12844 +EDGE3 1542 1591 -4.05445 -10.2342 -5.13502 -0.00195033 0.00407667 -0.132097 +EDGE3 1543 1593 -3.50614 0.0185158 -5.22637 -0.00512266 0.00527582 -0.000611717 +EDGE3 1542 1593 -4.18936 10.2103 -5.32632 0.00682115 -0.00361692 0.125435 +EDGE3 1543 1592 -4.051 -10.2022 -5.13263 0.0065316 -0.00017318 -0.122974 +EDGE3 1544 1594 -3.47665 -0.0128518 -5.21434 0.00500287 0.00841703 0.00717886 +EDGE3 1543 1594 -4.20051 10.1872 -5.34651 0.000439003 -0.00867328 0.124202 +EDGE3 1544 1593 -4.06499 -10.2208 -5.11795 -0.00395725 0.00614111 -0.126486 +EDGE3 1545 1595 -3.50814 -0.00237698 -5.23488 -0.00753209 -0.00125116 0.00053873 +EDGE3 1544 1595 -4.2086 10.1807 -5.33493 0.0012244 -0.00323351 0.132332 +EDGE3 1545 1594 -4.06151 -10.1914 -5.12815 -0.00319476 0.00305291 -0.126316 +EDGE3 1546 1596 -3.49879 0.005337 -5.23274 -0.00564999 -0.000189178 -0.00178393 +EDGE3 1545 1596 -4.2167 10.1782 -5.33448 0.00484774 0.00640722 0.104011 +EDGE3 1546 1595 -4.06389 -10.1863 -5.1092 -0.0039497 0.0148032 -0.119784 +EDGE3 1547 1597 -3.51372 0.00722538 -5.20909 0.00744458 0.0018121 -0.00183942 +EDGE3 1546 1597 -4.22051 10.1714 -5.29094 0.00130869 -0.00102566 0.126046 +EDGE3 1547 1596 -4.08792 -10.1748 -5.11813 0.00204926 -0.00530436 -0.12997 +EDGE3 1548 1598 -3.50479 0.00621142 -5.20466 -0.00372875 0.00108067 0.00266563 +EDGE3 1547 1598 -4.19771 10.1487 -5.30637 0.00022862 0.00559654 0.123098 +EDGE3 1548 1597 -4.09161 -10.1438 -5.10069 -0.00920407 0.00354411 -0.12142 +EDGE3 1549 1599 -3.51504 -0.000490628 -5.20989 -0.0033466 -0.00268342 0.00292676 +EDGE3 1548 1599 -4.24672 10.1414 -5.31646 9.82282e-05 -0.00483092 0.124838 +EDGE3 1549 1598 -4.09714 -10.1631 -5.1054 -0.00159799 0.00909769 -0.12626 +EDGE3 1550 1600 -3.5486 -0.00457299 -5.19774 -0.00230505 0.00335795 -0.00228513 +EDGE3 1549 1600 -4.23121 10.1462 -5.30409 0.00518272 0.000923541 0.127578 +EDGE3 1550 1599 -4.10665 -10.1607 -5.08864 0.00552679 -0.00852642 -0.133313 +EDGE3 1551 1601 -3.54084 0.00651771 -5.18653 0.000651289 0.00660348 -0.00201501 +EDGE3 1550 1601 -4.25016 10.115 -5.28893 -0.00468987 -0.000985931 0.12056 +EDGE3 1551 1600 -4.08451 -10.1507 -5.0917 0.00769748 0.0110564 -0.125445 +EDGE3 1552 1602 -3.54198 -2.24158e-05 -5.17712 -0.000383331 -0.00161238 0.00661999 +EDGE3 1551 1602 -4.24267 10.1176 -5.28623 -0.00117055 -0.00197258 0.129236 +EDGE3 1552 1601 -4.13103 -10.1217 -5.08951 0.00033323 -0.00186568 -0.132823 +EDGE3 1553 1603 -3.55843 -0.015959 -5.18961 8.99238e-05 0.0018957 -0.00550412 +EDGE3 1552 1603 -4.25386 10.1179 -5.28909 0.00959944 0.00175008 0.123593 +EDGE3 1553 1602 -4.11096 -10.1274 -5.09035 0.00417524 -0.0065092 -0.119383 +EDGE3 1554 1604 -3.55497 -0.0227741 -5.17836 -0.00264439 -0.00335857 0.00499885 +EDGE3 1553 1604 -4.26064 10.0967 -5.28384 0.0034592 0.00162139 0.121355 +EDGE3 1554 1603 -4.11302 -10.1062 -5.07979 -0.00110317 -0.00328774 -0.114964 +EDGE3 1555 1605 -3.56658 0.00793922 -5.1696 -0.00383581 -0.00230736 -0.00574036 +EDGE3 1554 1605 -4.27088 10.0829 -5.27072 0.0014014 0.0151262 0.120833 +EDGE3 1555 1604 -4.11574 -10.1043 -5.06228 -0.00383071 -0.00708338 -0.120548 +EDGE3 1556 1606 -3.57577 -0.00447534 -5.17356 0.00835564 0.00381643 -0.00698677 +EDGE3 1555 1606 -4.27801 10.0691 -5.26523 0.0115115 -0.00931568 0.137703 +EDGE3 1556 1605 -4.12703 -10.0883 -5.09197 0.00671173 -0.000176923 -0.132291 +EDGE3 1557 1607 -3.58396 0.00174595 -5.16111 0.00865732 -0.00223042 -0.00299596 +EDGE3 1556 1607 -4.27492 10.0562 -5.29007 -0.00293235 0.00277373 0.129742 +EDGE3 1557 1606 -4.11649 -10.0886 -5.07298 0.00144571 -0.00511342 -0.125331 +EDGE3 1558 1608 -3.58125 -0.010535 -5.15039 -0.00845936 0.00356933 0.00809502 +EDGE3 1557 1608 -4.28308 10.0567 -5.26185 0.00285206 0.00280926 0.125574 +EDGE3 1558 1607 -4.14292 -10.0859 -5.07721 0.00820477 0.00301233 -0.131683 +EDGE3 1559 1609 -3.59166 -0.00453603 -5.15315 -0.00557638 -0.000722837 0.00365262 +EDGE3 1558 1609 -4.27633 10.0472 -5.24097 -0.00441473 -0.000655872 0.115957 +EDGE3 1559 1608 -4.14118 -10.0545 -5.07759 -0.00596223 0.000731022 -0.12798 +EDGE3 1560 1610 -3.60225 0.00109229 -5.15316 0.00244746 -0.00460946 -0.00397078 +EDGE3 1559 1610 -4.28823 10.0208 -5.25919 0.0104509 -0.000207764 0.126008 +EDGE3 1560 1609 -4.15606 -10.0494 -5.05176 -0.0103474 -0.00342577 -0.126815 +EDGE3 1561 1611 -3.60218 0.00713124 -5.13789 -0.00567102 0.00759685 -0.00404257 +EDGE3 1560 1611 -4.29815 10.0123 -5.24596 0.00277882 0.00165496 0.124892 +EDGE3 1561 1610 -4.1631 -10.0478 -5.04061 0.000980271 2.07974e-05 -0.125795 +EDGE3 1562 1612 -3.61696 -0.0117821 -5.14919 -0.00269482 0.00509413 0.0009991 +EDGE3 1561 1612 -4.3112 10.0423 -5.26323 0.0100738 -0.002098 0.136887 +EDGE3 1562 1611 -4.15386 -10.0363 -5.03296 0.00194362 5.16783e-05 -0.13062 +EDGE3 1563 1613 -3.61386 -0.0187535 -5.14943 -0.00283247 -0.000875852 0.00604299 +EDGE3 1562 1613 -4.31913 10.0264 -5.25386 -0.000944142 0.0132116 0.119275 +EDGE3 1563 1612 -4.17547 -10.0338 -5.04718 -0.000953939 -0.00124026 -0.11551 +EDGE3 1564 1614 -3.59893 0.000347666 -5.16368 0.00235266 0.00479079 -0.00614983 +EDGE3 1563 1614 -4.31001 10.0269 -5.23595 -0.00337322 0.00210896 0.13337 +EDGE3 1564 1613 -4.188 -10.0269 -5.02224 -0.00662665 -0.00196513 -0.123873 +EDGE3 1565 1615 -3.63852 -0.00809265 -5.12297 0.00749197 0.000194488 0.00444775 +EDGE3 1564 1615 -4.33226 9.98638 -5.24037 0.00659021 -0.00208322 0.127606 +EDGE3 1565 1614 -4.17803 -10.0073 -5.01677 -0.0012669 0.000444184 -0.112392 +EDGE3 1566 1616 -3.63558 -0.0115986 -5.11558 0.000566981 -0.00462995 -0.00203157 +EDGE3 1565 1616 -4.34072 9.98845 -5.23968 -0.00283773 0.00273047 0.119764 +EDGE3 1566 1615 -4.19591 -10.0038 -5.02937 0.000199725 -0.005714 -0.117423 +EDGE3 1567 1617 -3.64549 0.00833295 -5.1218 -0.00807483 0.00984566 -0.0120979 +EDGE3 1566 1617 -4.32957 9.97276 -5.20587 -0.00124934 -0.00712589 0.132043 +EDGE3 1567 1616 -4.20324 -9.99229 -5.01938 -0.0018071 -0.00410816 -0.129028 +EDGE3 1568 1618 -3.63863 -0.0223329 -5.10543 0.00554618 -0.00374767 0.00429557 +EDGE3 1567 1618 -4.3531 10.0019 -5.23221 0.00387609 0.00458024 0.124095 +EDGE3 1568 1617 -4.21769 -9.98291 -5.01326 0.00209628 0.00088263 -0.126003 +EDGE3 1569 1619 -3.65607 -0.00325904 -5.14146 0.00987582 -0.000217701 0.00390824 +EDGE3 1568 1619 -4.33654 9.9701 -5.22477 0.00946067 -0.00549976 0.126217 +EDGE3 1569 1618 -4.20168 -9.97804 -5.00424 0.00147757 0.00327524 -0.117971 +EDGE3 1570 1620 -3.66489 0.0036406 -5.07753 -0.000128338 0.00503447 -0.00252402 +EDGE3 1569 1620 -4.34971 9.95258 -5.22206 -0.0052996 -0.00432465 0.128479 +EDGE3 1570 1619 -4.2148 -9.96691 -4.99245 -0.00723335 -0.00237562 -0.125498 +EDGE3 1571 1621 -3.65884 -0.00204754 -5.09508 -0.00334448 0.00606279 0.0054563 +EDGE3 1570 1621 -4.37346 9.93056 -5.20447 -0.00643748 -0.000714429 0.122856 +EDGE3 1571 1620 -4.20833 -9.94912 -4.99969 -0.00241584 -0.00303973 -0.12704 +EDGE3 1572 1622 -3.67668 -0.000273047 -5.0902 0.00182117 0.00896585 -0.000133226 +EDGE3 1571 1622 -4.35811 9.92213 -5.19569 0.00535566 0.00179217 0.116389 +EDGE3 1572 1621 -4.23336 -9.93144 -4.9927 -0.00286386 0.00368305 -0.125359 +EDGE3 1573 1623 -3.68681 -0.00250702 -5.0815 -0.000155244 -0.0102104 0.00168284 +EDGE3 1572 1623 -4.37351 9.90817 -5.18192 0.00431626 -0.00188128 0.125551 +EDGE3 1573 1622 -4.23791 -9.94905 -5.00083 0.00594152 -0.00310358 -0.125767 +EDGE3 1574 1624 -3.68194 0.0277759 -5.08948 0.00428177 -0.0025496 -0.00413333 +EDGE3 1573 1624 -4.38004 9.91368 -5.21025 -0.00478456 -0.00129474 0.125799 +EDGE3 1574 1623 -4.22879 -9.92741 -4.97574 -0.00285701 -0.000420778 -0.120357 +EDGE3 1575 1625 -3.69096 -0.0155177 -5.08941 0.00390224 -0.0102742 -0.0111715 +EDGE3 1575 1624 -4.23447 -9.91422 -4.98771 0.000465281 0.00443171 -0.131542 +EDGE3 1574 1625 -4.38838 9.90262 -5.17718 0.0030368 0.000933561 0.130047 +EDGE3 1576 1626 -3.69715 0.0208306 -5.06463 -0.00363674 0.00598707 -0.00325849 +EDGE3 1575 1626 -4.39394 9.87695 -5.18922 -0.00908629 -0.00332406 0.123388 +EDGE3 1576 1625 -4.2251 -9.89839 -4.98715 0.00631258 -0.00764712 -0.122105 +EDGE3 1577 1627 -3.67702 -0.0073592 -5.0752 -0.00327451 0.000705054 0.00448849 +EDGE3 1576 1627 -4.39969 9.88706 -5.18089 0.000118136 0.00376572 0.123971 +EDGE3 1577 1626 -4.24159 -9.88172 -4.97347 -0.0102284 -0.00633775 -0.12584 +EDGE3 1578 1628 -3.70567 -0.0113893 -5.07409 -0.00567536 0.00224146 -0.00758111 +EDGE3 1577 1628 -4.40214 9.85511 -5.17507 0.0082417 -0.00365676 0.124644 +EDGE3 1578 1627 -4.25578 -9.87726 -4.97108 0.00532486 0.00419119 -0.123594 +EDGE3 1579 1629 -3.71576 -0.00450309 -5.068 -0.00321693 -0.00381938 0.00172204 +EDGE3 1578 1629 -4.41017 9.8686 -5.16882 -0.0102332 0.00526992 0.126761 +EDGE3 1579 1628 -4.27373 -9.8694 -4.97428 -0.00813568 0.000802336 -0.119837 +EDGE3 1580 1630 -3.75439 -0.00319996 -5.04419 -0.00186309 0.00187137 -0.0026375 +EDGE3 1579 1630 -4.42355 9.85081 -5.16578 0.00100831 0.00177365 0.120428 +EDGE3 1580 1629 -4.26082 -9.84837 -4.96824 -0.0031334 0.00200489 -0.128 +EDGE3 1581 1631 -3.7212 -0.000697159 -5.06569 -0.00189508 -0.000939372 0.000852838 +EDGE3 1580 1631 -4.43093 9.84553 -5.15157 -0.0042398 -0.00341078 0.119283 +EDGE3 1581 1630 -4.29243 -9.84308 -4.95389 4.81824e-05 -0.000136307 -0.12242 +EDGE3 1582 1632 -3.72452 -0.00560368 -5.04324 0.00131369 -0.00155312 0.00301684 +EDGE3 1581 1632 -4.40875 9.83571 -5.1613 0.00763272 0.00296895 0.129753 +EDGE3 1582 1631 -4.28017 -9.8472 -4.96149 0.0095609 -0.00708034 -0.125916 +EDGE3 1583 1633 -3.73172 -0.0162012 -5.04554 -0.00682975 -0.00391761 0.0014282 +EDGE3 1582 1633 -4.4374 9.83096 -5.13992 -0.000488877 0.000266369 0.130164 +EDGE3 1583 1632 -4.28224 -9.83964 -4.93376 0.00823306 -0.00280928 -0.123182 +EDGE3 1584 1634 -3.75424 -0.00336306 -5.05923 0.00210903 0.00483504 -0.00568784 +EDGE3 1583 1634 -4.45011 9.83103 -5.14388 0.00832388 0.00410714 0.128949 +EDGE3 1584 1633 -4.29431 -9.81341 -4.95049 0.00768538 0.00599256 -0.122757 +EDGE3 1585 1635 -3.74725 0.0112293 -5.04271 0.00305862 -0.00317051 0.0024212 +EDGE3 1584 1635 -4.44898 9.81173 -5.13712 -0.00277218 -0.00362231 0.132735 +EDGE3 1585 1634 -4.28859 -9.82615 -4.9391 -0.00728193 0.00143582 -0.117516 +EDGE3 1586 1636 -3.76101 -0.00568854 -5.03214 6.27705e-05 0.00443087 0.00966438 +EDGE3 1585 1636 -4.47052 9.79616 -5.11843 0.000170057 0.00271954 0.125613 +EDGE3 1586 1635 -4.29649 -9.81523 -4.93209 0.00783502 5.50231e-05 -0.116897 +EDGE3 1587 1637 -3.78249 0.025841 -5.03187 0.00843805 0.00183528 -0.00132881 +EDGE3 1586 1637 -4.45501 9.78184 -5.13492 0.00643344 0.00637727 0.125311 +EDGE3 1587 1636 -4.30509 -9.77796 -4.93474 -0.0101508 0.00135915 -0.127815 +EDGE3 1588 1638 -3.76709 -0.0354175 -5.00696 -0.00111361 0.00301297 -0.00431112 +EDGE3 1587 1638 -4.45844 9.78118 -5.14089 0.0064112 0.00638984 0.122961 +EDGE3 1588 1637 -4.30605 -9.78228 -4.93068 -0.00871881 -0.00263805 -0.130626 +EDGE3 1589 1639 -3.78687 -0.00545199 -5.015 0.00319818 0.0084814 -0.00754055 +EDGE3 1588 1639 -4.46418 9.76781 -5.11293 0.00194175 0.00645614 0.122199 +EDGE3 1589 1638 -4.32508 -9.77812 -4.9272 0.00498539 0.0026815 -0.121972 +EDGE3 1590 1640 -3.77499 0.0128417 -5.02824 0.00562934 -0.00125981 -0.00310495 +EDGE3 1589 1640 -4.47535 9.76999 -5.11114 -0.00160123 -0.000992001 0.123543 +EDGE3 1590 1639 -4.31816 -9.79303 -4.92218 -0.000593397 0.00219419 -0.129369 +EDGE3 1591 1641 -3.77999 -0.00513835 -5.01499 0.00442537 -0.00708843 -0.00213608 +EDGE3 1590 1641 -4.4773 9.74917 -5.10758 -0.00183636 -0.0121756 0.125662 +EDGE3 1591 1640 -4.32235 -9.75032 -4.90054 0.00736679 0.00625114 -0.122595 +EDGE3 1592 1642 -3.80954 -0.0084493 -5.0083 0.000178729 0.00130686 -0.000446485 +EDGE3 1591 1642 -4.47132 9.74179 -5.09645 0.00481824 -0.000992736 0.12796 +EDGE3 1592 1641 -4.33361 -9.7614 -4.91923 -0.00402785 -0.00167439 -0.119664 +EDGE3 1593 1643 -3.79669 -0.00487926 -4.98624 -0.00237493 0.00194472 -0.00515592 +EDGE3 1592 1643 -4.48248 9.72588 -5.09084 0.00410064 -0.00533484 0.129115 +EDGE3 1593 1642 -4.32317 -9.74794 -4.89268 -0.00121421 0.00529443 -0.120689 +EDGE3 1594 1644 -3.79829 0.00733203 -4.97973 0.000138846 0.00562365 -0.000785532 +EDGE3 1593 1644 -4.49893 9.70819 -5.0968 0.00807222 -0.00933257 0.125534 +EDGE3 1594 1643 -4.33829 -9.72423 -4.903 0.00484578 -0.000306859 -0.138266 +EDGE3 1595 1645 -3.80703 0.00588682 -4.98329 0.0118057 0.00347943 0.00653672 +EDGE3 1594 1645 -4.51139 9.7108 -5.08955 0.00148847 -0.000853383 0.129621 +EDGE3 1595 1644 -4.3715 -9.70137 -4.90687 -0.00172957 0.000322231 -0.131124 +EDGE3 1596 1646 -3.8331 -0.0120778 -4.9876 0.00245894 0.00558116 0.00594644 +EDGE3 1595 1646 -4.50758 9.70524 -5.09598 0.00498739 0.00510976 0.123939 +EDGE3 1596 1645 -4.36013 -9.6991 -4.88764 -0.00139339 -0.00471071 -0.12667 +EDGE3 1597 1647 -3.83884 0.0102509 -4.97043 0.00712105 -0.0085306 0.013209 +EDGE3 1596 1647 -4.5082 9.69892 -5.078 -0.00101281 -0.00751629 0.125579 +EDGE3 1597 1646 -4.35886 -9.70868 -4.87876 0.00748341 0.00213334 -0.122628 +EDGE3 1598 1648 -3.8318 -0.00815436 -4.98051 -0.00664425 0.00289468 0.00364071 +EDGE3 1597 1648 -4.51111 9.67572 -5.07839 -0.00276294 -0.00687825 0.126018 +EDGE3 1598 1647 -4.3724 -9.68934 -4.8581 -0.00143469 -0.00445708 -0.116043 +EDGE3 1599 1649 -3.84648 0.00294916 -4.97196 -0.000154761 0.00270961 0.00421454 +EDGE3 1598 1649 -4.53086 9.66892 -5.06702 -0.00348607 0.000506811 0.127946 +EDGE3 1599 1648 -4.36344 -9.67959 -4.89891 0.0106584 -0.00325624 -0.12872 +EDGE3 1600 1650 -3.84611 0.00532477 -4.96708 -0.00169042 -0.000349913 -0.00220924 +EDGE3 1599 1650 -4.55602 9.66025 -5.05637 -0.00141408 0.000113175 0.128437 +EDGE3 1600 1649 -4.37781 -9.65817 -4.87188 0.00662239 -0.000275053 -0.128305 +EDGE3 1601 1651 -3.8513 0.0113764 -4.94999 -0.0061232 0.00460027 -0.00568099 +EDGE3 1600 1651 -4.54492 9.6474 -5.06231 -0.00525688 -0.000615266 0.129299 +EDGE3 1601 1650 -4.39566 -9.67067 -4.86485 0.00883199 0.00576233 -0.125805 +EDGE3 1602 1652 -3.85478 0.00758804 -4.9627 0.00022468 0.00127617 -0.00319257 +EDGE3 1601 1652 -4.53982 9.65809 -5.0522 -0.00916124 -0.00138225 0.125395 +EDGE3 1602 1651 -4.39069 -9.65869 -4.84952 -0.00900722 -0.000635133 -0.131854 +EDGE3 1603 1653 -3.87046 0.0161229 -4.9437 0.00251149 -0.000519272 -9.6468e-05 +EDGE3 1603 1652 -4.39003 -9.63958 -4.87313 -0.00238476 0.0126247 -0.131061 +EDGE3 1602 1653 -4.55192 9.62114 -5.06472 -0.00267707 -0.00437478 0.124827 +EDGE3 1604 1654 -3.87796 0.00437226 -4.93994 0.00181987 0.000406541 0.00342671 +EDGE3 1603 1654 -4.55304 9.60363 -5.05079 -0.00223277 -0.00683736 0.127783 +EDGE3 1604 1653 -4.4132 -9.59965 -4.84094 0.000462323 0.00408481 -0.129155 +EDGE3 1605 1655 -3.88744 -0.00251837 -4.92587 -0.00593637 -0.00754208 -0.000820626 +EDGE3 1604 1655 -4.56577 9.60065 -5.06254 0.00355252 -0.00914061 0.122972 +EDGE3 1605 1654 -4.39123 -9.61191 -4.83785 0.00510909 0.00130826 -0.124184 +EDGE3 1606 1656 -3.87438 0.0101672 -4.92964 0.0124174 -0.00166266 -0.00293387 +EDGE3 1605 1656 -4.58149 9.58782 -5.04326 -0.0120995 0.00458057 0.127106 +EDGE3 1606 1655 -4.4194 -9.60015 -4.85211 -0.00480755 0.00465923 -0.128022 +EDGE3 1607 1657 -3.89379 0.00245333 -4.93871 0.00546673 -0.00170363 -0.00652245 +EDGE3 1606 1657 -4.56214 9.57573 -5.03707 -0.00970359 0.0149588 0.129096 +EDGE3 1607 1656 -4.42483 -9.59559 -4.85549 -0.00623762 0.00204651 -0.129437 +EDGE3 1608 1658 -3.89987 -1.0974e-05 -4.93195 -0.00237009 -0.00136713 0.00643543 +EDGE3 1607 1658 -4.58025 9.58177 -5.02454 0.000537245 0.00747947 0.134875 +EDGE3 1608 1657 -4.42236 -9.58055 -4.83065 -0.00379324 0.00398092 -0.126188 +EDGE3 1609 1659 -3.89956 -0.00901992 -4.90905 0.00405656 0.00738194 -0.0012287 +EDGE3 1608 1659 -4.58635 9.57397 -5.0138 -0.00974519 0.00371477 0.124357 +EDGE3 1609 1658 -4.42647 -9.56584 -4.80593 0.00475952 0.00321777 -0.12015 +EDGE3 1610 1660 -3.90992 0.0109984 -4.92949 -0.00651641 -0.00555888 -0.00581141 +EDGE3 1609 1660 -4.59892 9.54755 -5.01564 0.00335306 0.00544187 0.130964 +EDGE3 1611 1661 -3.92781 -0.00613803 -4.91589 -0.00619414 0.00409828 -0.00281478 +EDGE3 1610 1659 -4.42344 -9.559 -4.83806 -0.00547621 0.00308555 -0.127486 +EDGE3 1610 1661 -4.60524 9.54465 -4.99244 -0.000469769 0.00149334 0.120851 +EDGE3 1611 1660 -4.42915 -9.54408 -4.8232 -0.000126211 -0.00175912 -0.120697 +EDGE3 1612 1662 -3.91633 -0.0124472 -4.91749 -0.00406552 0.00843814 -0.0123728 +EDGE3 1611 1662 -4.61043 9.53032 -4.99424 -0.000497285 -0.0125333 0.125973 +EDGE3 1612 1661 -4.43645 -9.5433 -4.81499 0.00267307 0.00464573 -0.122974 +EDGE3 1613 1663 -3.92673 -0.0132193 -4.90796 0.00426951 -0.000299844 0.00227193 +EDGE3 1612 1663 -4.59507 9.50162 -4.99065 0.00620364 0.00149274 0.124553 +EDGE3 1613 1662 -4.43998 -9.52409 -4.79696 0.00698627 0.00142086 -0.118162 +EDGE3 1614 1664 -3.94163 0.00562102 -4.88702 0.00903647 -0.00419683 -0.00712273 +EDGE3 1613 1664 -4.60426 9.52017 -5.02713 -0.00136018 0.00160621 0.129315 +EDGE3 1614 1663 -4.47307 -9.52156 -4.8225 -0.00480471 0.0101714 -0.121253 +EDGE3 1615 1665 -3.94243 0.0148857 -4.88517 -0.0056056 -0.00977625 -0.0051089 +EDGE3 1614 1665 -4.61163 9.50258 -4.9902 0.00512015 0.00244481 0.125817 +EDGE3 1615 1664 -4.46966 -9.52855 -4.80647 -0.00565945 -0.00308159 -0.115502 +EDGE3 1616 1666 -3.93784 -0.0155383 -4.86916 0.00164762 -0.00257413 0.000368295 +EDGE3 1615 1666 -4.61559 9.48753 -4.97239 -0.00194664 0.00519152 0.116713 +EDGE3 1616 1665 -4.46388 -9.49221 -4.79705 -0.00436074 -0.00696153 -0.129546 +EDGE3 1617 1667 -3.97883 -0.0197636 -4.88774 -0.00401697 0.00293286 -0.000603886 +EDGE3 1616 1667 -4.63354 9.48996 -4.98208 -0.00756494 0.00487015 0.128687 +EDGE3 1617 1666 -4.4876 -9.48705 -4.77472 0.00218672 -0.00229369 -0.125765 +EDGE3 1618 1668 -3.97271 0.00776969 -4.87429 0.000581721 0.0010377 -0.00271537 +EDGE3 1617 1668 -4.62691 9.46882 -4.98098 0.00134972 0.00552661 0.123666 +EDGE3 1618 1667 -4.4894 -9.49842 -4.77308 -0.00162933 -0.00175811 -0.128903 +EDGE3 1618 1669 -4.65691 9.45629 -4.97252 0.00280243 -0.00160276 0.12832 +EDGE3 1619 1669 -3.98 -0.0117081 -4.87815 0.00489591 -0.00820726 -0.00104268 +EDGE3 1620 1670 -3.98923 0.000797487 -4.87571 -0.00120427 -0.000262362 -0.00101235 +EDGE3 1619 1668 -4.48693 -9.48012 -4.77591 -0.00776969 -0.00309525 -0.133152 +EDGE3 1619 1670 -4.64215 9.43774 -4.97612 0.000649623 -0.000752692 0.135071 +EDGE3 1620 1669 -4.48376 -9.45602 -4.77713 -0.00433503 -0.00282895 -0.129813 +EDGE3 1620 1671 -4.65229 9.45587 -4.95804 -0.00239903 -0.00686543 0.127165 +EDGE3 1621 1671 -3.97509 -0.0118297 -4.87814 0.0126478 0.00412022 0.00251274 +EDGE3 1622 1672 -3.98526 -0.0177136 -4.83881 0.00827507 0.00189754 -0.00223825 +EDGE3 1621 1670 -4.5135 -9.45745 -4.76577 -8.53624e-05 0.00595202 -0.124067 +EDGE3 1621 1672 -4.66865 9.41752 -4.94886 0.00893193 -0.00141095 0.122803 +EDGE3 1622 1671 -4.49693 -9.44967 -4.74062 0.00342196 -0.000223064 -0.12353 +EDGE3 1623 1673 -3.99664 0.00628349 -4.83175 -0.00414502 -0.00517431 0.000111258 +EDGE3 1622 1673 -4.65593 9.43365 -4.94363 0.00212768 -0.00208231 0.114291 +EDGE3 1623 1672 -4.50628 -9.45179 -4.7429 -0.00297348 -0.00183553 -0.127395 +EDGE3 1624 1674 -3.99917 -0.00779385 -4.84656 0.000911287 -0.00328539 -0.000417498 +EDGE3 1623 1674 -4.67481 9.41214 -4.94524 0.000582349 0.00774535 0.127792 +EDGE3 1624 1673 -4.51775 -9.41163 -4.74162 -0.00403379 0.000744766 -0.135055 +EDGE3 1625 1675 -4.00333 -0.000140422 -4.85168 -0.0089873 0.00691374 -0.00115273 +EDGE3 1624 1675 -4.68924 9.39937 -4.94442 -0.0010351 -0.0105123 0.126767 +EDGE3 1625 1674 -4.50154 -9.40822 -4.74045 0.00265831 0.00317324 -0.119576 +EDGE3 1626 1676 -4.02287 0.012495 -4.83114 -0.00278188 -0.00289634 -0.00104604 +EDGE3 1625 1676 -4.67965 9.39081 -4.93359 -0.0059135 0.00508385 0.128124 +EDGE3 1626 1675 -4.51653 -9.40352 -4.75607 -0.00270745 -0.00546044 -0.123292 +EDGE3 1627 1677 -3.99763 -0.00245704 -4.83577 -9.80161e-05 0.00257592 -0.00287151 +EDGE3 1626 1677 -4.68509 9.38198 -4.92877 -0.00450047 0.00213519 0.115517 +EDGE3 1627 1676 -4.52462 -9.38839 -4.74712 -0.00487194 -0.00391941 -0.130653 +EDGE3 1628 1678 -4.03484 -0.0183107 -4.82184 -0.00804835 0.00135442 0.00739713 +EDGE3 1627 1678 -4.69611 9.34692 -4.93745 -0.00219465 -0.0059534 0.122988 +EDGE3 1628 1677 -4.51966 -9.37559 -4.74429 0.00266177 -0.00229253 -0.126332 +EDGE3 1629 1679 -4.02125 0.00625129 -4.81566 0.000598033 -0.00233915 0.00171649 +EDGE3 1628 1679 -4.68931 9.35371 -4.91219 0.0130683 -0.000373924 0.131694 +EDGE3 1629 1678 -4.52768 -9.38333 -4.73606 -0.00279817 0.000117254 -0.122069 +EDGE3 1630 1680 -4.03967 -0.00139867 -4.81292 -0.000580549 0.00202522 -0.000341753 +EDGE3 1629 1680 -4.70824 9.36302 -4.91046 -0.00412525 -0.0092872 0.120376 +EDGE3 1630 1679 -4.54718 -9.36024 -4.72156 0.00320506 -3.92127e-05 -0.127854 +EDGE3 1630 1681 -4.71358 9.35439 -4.90221 -0.00193992 -0.00408454 0.128857 +EDGE3 1631 1681 -4.03825 0.00315734 -4.80285 0.013327 -0.00431499 0.00452881 +EDGE3 1632 1682 -4.05285 -0.0145719 -4.8051 -0.012195 0.00106982 -0.004883 +EDGE3 1631 1680 -4.54791 -9.34692 -4.71791 -0.0105815 -0.00119107 -0.119481 +EDGE3 1632 1681 -4.54563 -9.33722 -4.70981 -0.000764211 -0.001677 -0.135726 +EDGE3 1631 1682 -4.72514 9.31124 -4.88997 0.00659377 -0.00181575 0.12787 +EDGE3 1633 1683 -4.04304 0.00335139 -4.79467 -0.00649554 0.00484032 -0.000422035 +EDGE3 1632 1683 -4.72196 9.32952 -4.88957 0.000750125 -0.00384828 0.130662 +EDGE3 1633 1682 -4.58285 -9.32197 -4.70761 -0.00596873 -0.000594463 -0.122457 +EDGE3 1634 1684 -4.07387 0.0111983 -4.8134 -0.00433656 -0.00192932 -0.00208496 +EDGE3 1633 1684 -4.72054 9.29662 -4.90427 -0.00720318 0.000286951 0.131914 +EDGE3 1635 1685 -4.05741 0.00103706 -4.81859 0.00159753 -0.00973163 -0.00651118 +EDGE3 1634 1683 -4.57002 -9.30933 -4.71695 0.00459697 -0.00179441 -0.133061 +EDGE3 1634 1685 -4.7216 9.2857 -4.87873 0.000847842 0.0018345 0.121408 +EDGE3 1635 1684 -4.56397 -9.29504 -4.67566 -0.00263603 0.00262498 -0.133278 +EDGE3 1636 1686 -4.07555 -0.0162079 -4.78054 -0.00299907 0.00608257 -0.00944236 +EDGE3 1635 1686 -4.7314 9.2784 -4.89338 -0.00354054 0.000790252 0.116462 +EDGE3 1636 1685 -4.55801 -9.29924 -4.68792 -0.00397368 -0.00549765 -0.118925 +EDGE3 1637 1687 -4.07923 -0.00350271 -4.76532 0.00342348 -0.00380505 -0.00767802 +EDGE3 1636 1687 -4.72438 9.28153 -4.876 0.00229911 0.0148171 0.120429 +EDGE3 1637 1686 -4.56796 -9.28451 -4.68346 0.00166627 0.00400281 -0.126585 +EDGE3 1638 1688 -4.09405 -0.00610734 -4.78026 -0.00740239 0.00790395 -0.00271591 +EDGE3 1637 1688 -4.74235 9.27104 -4.87224 0.00174379 -0.000168789 0.122583 +EDGE3 1638 1687 -4.58994 -9.26582 -4.68626 -0.0142717 -0.00126655 -0.128016 +EDGE3 1639 1689 -4.08748 0.00271527 -4.75022 0.00583557 0.0107021 -0.00423942 +EDGE3 1638 1689 -4.75791 9.24075 -4.87021 0.0035844 0.0010868 0.125949 +EDGE3 1639 1688 -4.58396 -9.26978 -4.66311 0.00231667 -0.0101319 -0.12417 +EDGE3 1640 1690 -4.09246 0.0137696 -4.75538 -0.00415834 -0.000803347 0.00585186 +EDGE3 1639 1690 -4.75768 9.24953 -4.85259 -0.00173352 -0.00606551 0.121507 +EDGE3 1640 1689 -4.61043 -9.26215 -4.68657 -0.00469416 0.00461811 -0.11659 +EDGE3 1641 1691 -4.10442 -0.00148162 -4.76836 0.00655073 0.00298054 -0.00234923 +EDGE3 1640 1691 -4.78386 9.24198 -4.86163 0.00802861 -0.000618831 0.126296 +EDGE3 1641 1690 -4.59637 -9.24189 -4.66707 0.00329474 -0.00291547 -0.122059 +EDGE3 1642 1692 -4.10664 0.00675134 -4.74294 0.000689346 -0.00740033 0.00160381 +EDGE3 1641 1692 -4.78308 9.2237 -4.85952 -0.00268856 -0.00148306 0.129273 +EDGE3 1642 1691 -4.59387 -9.23314 -4.6582 0.00153889 -0.00413263 -0.130297 +EDGE3 1643 1693 -4.10874 0.0119689 -4.73683 -0.00227162 -9.01147e-05 -0.00155296 +EDGE3 1642 1693 -4.7619 9.20961 -4.86523 -0.000578616 0.00980701 0.132072 +EDGE3 1643 1692 -4.61047 -9.21015 -4.67069 -0.00401153 0.0109526 -0.119774 +EDGE3 1644 1694 -4.13181 -0.0132752 -4.73285 -0.00543076 0.00676282 0.00539137 +EDGE3 1643 1694 -4.76187 9.18479 -4.83369 0.00132399 8.10511e-05 0.121896 +EDGE3 1644 1693 -4.60481 -9.22826 -4.65285 -0.00412914 0.00661897 -0.127643 +EDGE3 1645 1695 -4.13114 0.00142796 -4.73794 -0.00140266 0.000365451 0.00257162 +EDGE3 1644 1695 -4.78101 9.19467 -4.83363 0.00650734 -0.00908859 0.12591 +EDGE3 1645 1694 -4.61674 -9.19333 -4.65474 -0.00555638 0.00572368 -0.113151 +EDGE3 1646 1696 -4.134 0.0199297 -4.72526 0.00500178 0.00308011 0.00210791 +EDGE3 1645 1696 -4.79365 9.172 -4.82676 0.00590847 -0.000181931 0.123266 +EDGE3 1646 1695 -4.61604 -9.1995 -4.65888 0.00504131 -0.00509462 -0.121523 +EDGE3 1647 1697 -4.14292 -0.0260781 -4.73819 -0.00689312 -0.00643783 0.00734653 +EDGE3 1646 1697 -4.78817 9.1523 -4.82262 -0.00402016 -0.000346618 0.132817 +EDGE3 1647 1696 -4.62892 -9.18279 -4.64463 -0.00770817 0.00835736 -0.114446 +EDGE3 1648 1698 -4.13072 -0.0190185 -4.72763 -0.00566104 -0.00123399 0.00191498 +EDGE3 1647 1698 -4.80149 9.1715 -4.83527 0.0011605 0.00589671 0.121789 +EDGE3 1648 1697 -4.64154 -9.17741 -4.63158 -0.00111146 0.00614007 -0.123479 +EDGE3 1649 1699 -4.13743 0.00796612 -4.70326 -0.00112035 0.000537442 0.00336731 +EDGE3 1648 1699 -4.8148 9.1444 -4.8087 -0.00289327 0.0100136 0.129582 +EDGE3 1649 1698 -4.63987 -9.14915 -4.62477 0.00281841 -0.00107355 -0.126794 +EDGE3 1650 1700 -4.17127 -0.00825053 -4.71219 0.00485208 0.00407436 -0.000560418 +EDGE3 1649 1700 -4.80464 9.14012 -4.81456 0.00897 0.00287857 0.131535 +EDGE3 1650 1699 -4.64773 -9.16814 -4.60182 0.00576954 -0.00310573 -0.125887 +EDGE3 1651 1701 -4.14831 -0.00551818 -4.70377 -0.000998899 0.000570896 0.000608526 +EDGE3 1650 1701 -4.81733 9.13804 -4.81974 -0.00663453 0.00585558 0.135355 +EDGE3 1651 1700 -4.6408 -9.13291 -4.60457 0.00378668 -0.000967019 -0.127871 +EDGE3 1652 1702 -4.15972 0.00219901 -4.69743 0.00139407 0.00473131 -0.000183465 +EDGE3 1651 1702 -4.80267 9.12288 -4.79711 0.00376719 0.00316507 0.134023 +EDGE3 1652 1701 -4.64203 -9.11309 -4.61973 -0.00141061 -0.00154033 -0.117666 +EDGE3 1653 1703 -4.18002 -0.0131363 -4.70439 -0.00620068 0.00587402 -0.00417297 +EDGE3 1652 1703 -4.83291 9.09197 -4.78353 -0.0040886 0.00456317 0.122138 +EDGE3 1653 1702 -4.67403 -9.12976 -4.60537 0.00583185 -0.00498931 -0.126544 +EDGE3 1654 1704 -4.18448 0.0132976 -4.69551 0.00131069 -0.00277018 -0.00313953 +EDGE3 1653 1704 -4.83842 9.09462 -4.80199 -0.00543834 -0.00609983 0.126431 +EDGE3 1654 1703 -4.67207 -9.09195 -4.59234 -0.00503335 0.00533246 -0.124289 +EDGE3 1655 1705 -4.17992 -0.000181804 -4.70458 -0.00508575 -0.00167492 -0.0020341 +EDGE3 1654 1705 -4.84536 9.08775 -4.78625 0.00624939 -0.000912108 0.123695 +EDGE3 1655 1704 -4.67072 -9.09434 -4.58682 -0.000277056 -0.0047591 -0.131221 +EDGE3 1656 1706 -4.1862 -0.00509544 -4.685 0.00225679 -0.001478 -0.00690749 +EDGE3 1655 1706 -4.85122 9.07741 -4.76958 0.0139134 -0.000823002 0.119473 +EDGE3 1656 1705 -4.69196 -9.09615 -4.58242 -0.00282627 0.00680526 -0.120417 +EDGE3 1657 1707 -4.20797 0.0108874 -4.69185 -0.00604935 0.00765395 0.00175865 +EDGE3 1656 1707 -4.82838 9.06632 -4.77866 -0.00183164 0.00307254 0.129021 +EDGE3 1657 1706 -4.68609 -9.07463 -4.59433 0.00563966 -4.12237e-05 -0.124394 +EDGE3 1658 1708 -4.2049 0.0131064 -4.65251 -0.000269332 0.0114614 0.0086092 +EDGE3 1657 1708 -4.84794 9.04132 -4.75838 -0.0044332 0.00215618 0.122219 +EDGE3 1658 1707 -4.67971 -9.05718 -4.57697 0.0054647 0.00328821 -0.123489 +EDGE3 1659 1709 -4.20516 0.00637796 -4.6768 0.00556877 -0.0104431 -0.004986 +EDGE3 1658 1709 -4.84662 9.0272 -4.75824 0.00106155 0.00418357 0.124685 +EDGE3 1659 1708 -4.68691 -9.04616 -4.58556 -0.000703821 0.0042345 -0.129055 +EDGE3 1660 1710 -4.22583 0.0121506 -4.6864 -0.00373211 0.0034737 -0.00128962 +EDGE3 1659 1710 -4.87416 9.00554 -4.76317 -0.000834304 0.00854185 0.123779 +EDGE3 1660 1709 -4.70051 -9.04411 -4.5719 -0.00892585 -0.000449649 -0.12711 +EDGE3 1661 1711 -4.21597 0.0010927 -4.65447 -0.00262729 -0.00402821 0.00258358 +EDGE3 1660 1711 -4.86633 9.03598 -4.75222 0.00161562 -0.00543979 0.129682 +EDGE3 1661 1710 -4.69933 -9.02764 -4.59677 -0.00333468 0.000254433 -0.115782 +EDGE3 1662 1712 -4.23964 0.0043623 -4.67167 -0.00797579 -0.000535582 -0.00292847 +EDGE3 1661 1712 -4.88432 9.00312 -4.7636 -0.0028631 -0.00501301 0.11873 +EDGE3 1662 1711 -4.68076 -9.02561 -4.57361 0.00715125 0.00460208 -0.126044 +EDGE3 1663 1713 -4.23182 -0.00279312 -4.63545 -0.0146096 0.00638409 -0.00319001 +EDGE3 1662 1713 -4.87366 8.99752 -4.73698 -0.0047047 0.00236016 0.123878 +EDGE3 1663 1712 -4.72155 -9.00038 -4.54535 0.00376695 0.00977901 -0.119774 +EDGE3 1664 1714 -4.23958 0.0129888 -4.63304 0.0118192 -0.00518014 -0.00385078 +EDGE3 1663 1714 -4.88612 8.98903 -4.72797 -0.000169648 0.00901173 0.123017 +EDGE3 1664 1713 -4.70332 -8.98331 -4.53974 -0.00452762 0.00422932 -0.133089 +EDGE3 1665 1715 -4.22799 0.014228 -4.62972 0.00462268 0.0052475 -0.000160281 +EDGE3 1664 1715 -4.88565 8.96625 -4.73948 -0.00391411 -0.000866692 0.118549 +EDGE3 1665 1714 -4.71523 -8.97752 -4.53768 0.00445796 0.00571055 -0.126613 +EDGE3 1666 1716 -4.25162 0.0303627 -4.60348 -0.00244254 0.00108424 -0.00196495 +EDGE3 1665 1716 -4.90612 8.96607 -4.70842 -0.00262567 -0.00352035 0.12487 +EDGE3 1666 1715 -4.73483 -8.99604 -4.53557 0.000389615 0.00423651 -0.12516 +EDGE3 1667 1717 -4.24388 0.00535672 -4.62765 -0.00300106 0.00495831 0.0107925 +EDGE3 1666 1717 -4.87975 8.94878 -4.72461 -0.00231821 0.000469476 0.12322 +EDGE3 1667 1716 -4.74866 -8.96251 -4.53533 0.00621168 0.00457796 -0.114136 +EDGE3 1668 1718 -4.25532 -0.01117 -4.62464 0.00257723 -0.00180109 0.00553383 +EDGE3 1667 1718 -4.89657 8.93672 -4.70703 0.00592597 0.00443951 0.120463 +EDGE3 1668 1717 -4.74483 -8.95868 -4.51209 0.00312578 0.00451317 -0.135962 +EDGE3 1669 1719 -4.26847 -0.0131743 -4.60171 -0.00957195 0.00798558 0.00366486 +EDGE3 1668 1719 -4.91704 8.93948 -4.72277 0.00191591 0.00442546 0.112895 +EDGE3 1669 1718 -4.73625 -8.92592 -4.51377 -0.00044966 0.00228388 -0.121352 +EDGE3 1670 1720 -4.25577 -0.00464193 -4.62944 -0.000295541 0.00445142 0.00158626 +EDGE3 1669 1720 -4.92452 8.92725 -4.70996 0.00309401 0.00274767 0.127608 +EDGE3 1670 1719 -4.73779 -8.92845 -4.51816 0.0118003 0.00166168 -0.128596 +EDGE3 1671 1721 -4.28675 0.00149759 -4.60476 0.00319138 -0.00248812 -0.0125123 +EDGE3 1670 1721 -4.92671 8.9114 -4.6809 -0.00275952 0.000759767 0.129683 +EDGE3 1671 1720 -4.74808 -8.92176 -4.50678 0.00468118 0.000544573 -0.1248 +EDGE3 1672 1722 -4.29078 0.034295 -4.59209 -0.00308602 -0.00251812 -0.00979769 +EDGE3 1671 1722 -4.93283 8.88489 -4.70748 -0.00326472 -0.00469712 0.126926 +EDGE3 1672 1721 -4.77834 -8.90881 -4.50584 -0.00107413 -0.00381126 -0.114999 +EDGE3 1673 1723 -4.28242 0.00358281 -4.60462 0.00964151 0.00163484 -0.00362938 +EDGE3 1672 1723 -4.92148 8.89134 -4.68452 0.000375302 -0.00826138 0.130107 +EDGE3 1673 1722 -4.76792 -8.90306 -4.50061 0.00697895 -0.000421179 -0.125653 +EDGE3 1674 1724 -4.30052 0.00633884 -4.58515 -0.00253353 -0.00529516 -0.00127023 +EDGE3 1673 1724 -4.94464 8.86059 -4.67694 -0.000544734 -0.00258342 0.129776 +EDGE3 1674 1723 -4.76358 -8.86808 -4.49177 -0.00418489 -0.0141504 -0.127068 +EDGE3 1675 1725 -4.31165 -0.00818276 -4.58452 -0.009971 0.00886481 -0.00566623 +EDGE3 1674 1725 -4.93586 8.86321 -4.68176 -0.00422354 0.00377783 0.132577 +EDGE3 1675 1724 -4.76953 -8.87286 -4.49305 -0.00167775 0.000331235 -0.124678 +EDGE3 1676 1726 -4.31164 0.00571919 -4.58667 -0.00468263 -0.00194978 -0.00132212 +EDGE3 1675 1726 -4.93997 8.84437 -4.65261 -0.000167786 0.000104181 0.129931 +EDGE3 1676 1725 -4.77941 -8.87638 -4.49565 -0.000187769 0.00330084 -0.129126 +EDGE3 1677 1727 -4.31403 -0.0196701 -4.55716 0.0061161 -0.00555722 -0.00629173 +EDGE3 1676 1727 -4.95711 8.85579 -4.65892 -0.000919771 -0.00256334 0.127485 +EDGE3 1677 1726 -4.78228 -8.83845 -4.47707 -0.00109133 0.00110206 -0.121473 +EDGE3 1678 1728 -4.33794 -0.0164352 -4.55956 0.00429431 0.000165962 0.000884389 +EDGE3 1677 1728 -4.95661 8.82869 -4.66072 -0.00316723 0.00793386 0.124531 +EDGE3 1678 1727 -4.77785 -8.83718 -4.48595 0.00350964 0.00568172 -0.116865 +EDGE3 1679 1729 -4.31525 0.00269397 -4.55793 0.00878647 -0.00260927 -0.00383216 +EDGE3 1678 1729 -4.97346 8.83017 -4.64623 -0.00274325 -0.00307444 0.123099 +EDGE3 1679 1728 -4.786 -8.83604 -4.46671 -0.00547425 0.00542749 -0.119632 +EDGE3 1680 1730 -4.31761 0.00329516 -4.54566 0.0022042 0.000149604 0.00284097 +EDGE3 1679 1730 -4.98487 8.81945 -4.64855 0.0033144 -0.00875135 0.118714 +EDGE3 1680 1729 -4.78459 -8.81559 -4.46759 -0.00362935 -0.00184716 -0.127951 +EDGE3 1681 1731 -4.30718 0.0110936 -4.53561 0.00618073 0.0114344 -0.00232646 +EDGE3 1680 1731 -4.97796 8.78243 -4.63355 -2.14804e-05 0.00101139 0.132182 +EDGE3 1681 1730 -4.79784 -8.79698 -4.45292 -0.00452767 -0.00172435 -0.129451 +EDGE3 1682 1732 -4.3441 0.0028258 -4.54216 0.00260455 -0.00139087 0.00324802 +EDGE3 1681 1732 -4.9637 8.78635 -4.64448 -0.000174962 0.000292578 0.121342 +EDGE3 1682 1731 -4.81898 -8.80072 -4.45261 -0.00774525 -0.00684096 -0.130918 +EDGE3 1683 1733 -4.36169 -0.0158012 -4.54956 0.00387508 -0.00324181 -0.00247696 +EDGE3 1682 1733 -4.99428 8.77174 -4.6237 0.000477345 -0.00312958 0.117479 +EDGE3 1683 1732 -4.80569 -8.79585 -4.44888 0.000332706 -0.000897391 -0.126135 +EDGE3 1684 1734 -4.34099 0.00334482 -4.51972 0.000634945 0.00428358 0.00194475 +EDGE3 1684 1733 -4.82911 -8.76615 -4.4539 0.00273921 0.00138702 -0.126018 +EDGE3 1683 1734 -4.96002 8.78092 -4.64583 -0.00367001 0.00491469 0.128257 +EDGE3 1685 1735 -4.37173 -0.00410781 -4.53219 0.00418089 -0.00517842 0.00800469 +EDGE3 1684 1735 -4.9854 8.74392 -4.62322 0.000220235 0.00161138 0.119275 +EDGE3 1685 1734 -4.81719 -8.77033 -4.439 -0.0132083 -0.00706605 -0.123331 +EDGE3 1686 1736 -4.36942 -0.00402917 -4.52238 -0.0078227 -0.00206147 -0.0100731 +EDGE3 1685 1736 -5.0087 8.73428 -4.60452 -0.000282408 0.000724935 0.127412 +EDGE3 1686 1735 -4.80288 -8.73756 -4.41935 0.00381148 -0.00106239 -0.122515 +EDGE3 1687 1737 -4.36181 -0.00474635 -4.5243 0.000909483 -0.00154803 -0.000787887 +EDGE3 1686 1737 -5.01934 8.73331 -4.58611 -0.00307529 -0.000810487 0.134361 +EDGE3 1687 1736 -4.81253 -8.75108 -4.43653 -0.00153382 -0.00520643 -0.126604 +EDGE3 1688 1738 -4.38224 -0.00540633 -4.51198 0.00146375 -0.0106065 0.00305451 +EDGE3 1687 1738 -4.99891 8.7338 -4.58859 0.00298285 -0.00371002 0.127447 +EDGE3 1688 1737 -4.83451 -8.73604 -4.39548 0.00113792 0.00621816 -0.12314 +EDGE3 1689 1739 -4.39038 -0.0105854 -4.49713 -0.00131952 0.000131335 -0.00836743 +EDGE3 1688 1739 -5.01803 8.69484 -4.60688 0.0119291 0.00210997 0.127987 +EDGE3 1689 1738 -4.85527 -8.70447 -4.40592 0.00317344 -0.00593 -0.117514 +EDGE3 1690 1740 -4.36903 -0.0104012 -4.48739 0.00449158 -0.00451986 0.00648512 +EDGE3 1689 1740 -5.0075 8.69523 -4.58242 -0.00279991 0.0106408 0.137933 +EDGE3 1690 1739 -4.84747 -8.72002 -4.4058 0.000496247 0.00589708 -0.134672 +EDGE3 1691 1741 -4.39304 0.00692134 -4.5144 -0.00220463 0.0047561 -0.00138436 +EDGE3 1690 1741 -5.01704 8.68603 -4.56287 0.000847744 0.00253885 0.130202 +EDGE3 1691 1740 -4.84184 -8.70628 -4.41416 0.00562336 -0.00578378 -0.13296 +EDGE3 1692 1742 -4.38897 -0.00449661 -4.49035 0.00194257 -0.00160933 -0.00432162 +EDGE3 1691 1742 -5.03774 8.6796 -4.58548 0.000363956 -0.00486728 0.13187 +EDGE3 1692 1741 -4.84886 -8.69545 -4.40172 0.0025894 0.00295973 -0.115509 +EDGE3 1693 1743 -4.40708 -0.00569221 -4.47399 -0.00498746 0.00867546 0.00137393 +EDGE3 1692 1743 -5.04349 8.65785 -4.56907 -0.00291 0.010603 0.122057 +EDGE3 1693 1742 -4.8405 -8.66571 -4.38482 0.00135854 -0.00676043 -0.133042 +EDGE3 1694 1744 -4.4007 0.00994336 -4.48445 7.34832e-05 -0.00333746 -0.000702462 +EDGE3 1693 1744 -5.04762 8.65222 -4.56543 -0.0042012 -0.00844482 0.129686 +EDGE3 1694 1743 -4.8656 -8.66024 -4.38358 0.00085912 0.003008 -0.120074 +EDGE3 1695 1745 -4.41362 0.01294 -4.47275 -0.0038264 -0.00024204 0.00258891 +EDGE3 1694 1745 -5.0473 8.64208 -4.56154 -0.00551352 -0.0003898 0.126555 +EDGE3 1695 1744 -4.86789 -8.63062 -4.38368 0.0086523 0.00216079 -0.12185 +EDGE3 1696 1746 -4.41311 0.00214969 -4.45357 0.00159766 0.00311548 0.00226148 +EDGE3 1695 1746 -5.04746 8.62293 -4.55023 -0.00563831 0.00265312 0.119654 +EDGE3 1696 1745 -4.87957 -8.63516 -4.39027 -0.00962347 0.00130697 -0.120536 +EDGE3 1697 1747 -4.41503 0.00210496 -4.45573 0.00538025 -0.00128407 0.00668189 +EDGE3 1696 1747 -5.04101 8.62213 -4.56043 -0.00548079 0.000793909 0.125671 +EDGE3 1697 1746 -4.86441 -8.62412 -4.38519 -0.00289274 -0.00540686 -0.12782 +EDGE3 1698 1748 -4.42465 -0.00464751 -4.45985 -0.00276308 -0.00242226 -0.00663108 +EDGE3 1697 1748 -5.06591 8.6006 -4.52984 0.00335108 0.00113404 0.123171 +EDGE3 1698 1747 -4.87444 -8.60123 -4.38706 -0.00575098 -0.00337009 -0.133128 +EDGE3 1699 1749 -4.44371 -0.0113162 -4.43441 0.00809028 0.00498031 -0.0102428 +EDGE3 1698 1749 -5.07667 8.59351 -4.52404 -8.5728e-05 0.00350579 0.120422 +EDGE3 1700 1750 -4.45236 -0.00705054 -4.45754 -0.00378332 -0.00257898 0.00298916 +EDGE3 1699 1748 -4.89652 -8.61237 -4.37625 0.0129591 -0.00528218 -0.130018 +EDGE3 1699 1750 -5.04271 8.56347 -4.53598 0.003471 0.000423868 0.126308 +EDGE3 1700 1749 -4.87578 -8.59505 -4.37015 0.00935253 -0.00168296 -0.126936 +EDGE3 1701 1751 -4.46049 0.00798648 -4.45272 0.000370422 0.00267349 -0.00102382 +EDGE3 1700 1751 -5.06907 8.55351 -4.5381 0.00139123 0.0102243 0.123226 +EDGE3 1701 1750 -4.8992 -8.57448 -4.33835 0.0054555 0.00123458 -0.125788 +EDGE3 1702 1752 -4.44518 0.00323281 -4.43382 0.000826114 0.00230521 -0.000113086 +EDGE3 1701 1752 -5.07626 8.56471 -4.53058 0.00375864 0.00570348 0.128089 +EDGE3 1702 1751 -4.89665 -8.58507 -4.34155 -0.00217607 -0.00199205 -0.130974 +EDGE3 1703 1753 -4.4651 0.00939533 -4.42706 0.00350832 -0.00326822 -0.000364994 +EDGE3 1702 1753 -5.09335 8.56292 -4.52117 -0.000707714 -0.00861237 0.1291 +EDGE3 1703 1752 -4.899 -8.55566 -4.35445 0.000345189 -0.00591062 -0.125339 +EDGE3 1704 1754 -4.4497 0.00952033 -4.40723 -0.00136015 0.00483003 -0.00634331 +EDGE3 1703 1754 -5.08801 8.54132 -4.52116 0.00547432 -0.00332294 0.119197 +EDGE3 1704 1753 -4.92135 -8.54605 -4.34635 -0.00303679 0.00604921 -0.123965 +EDGE3 1705 1755 -4.45946 0.015731 -4.40319 0.000284728 -0.00592529 -0.00108802 +EDGE3 1704 1755 -5.07976 8.53654 -4.51348 0.000484851 -0.00159348 0.127008 +EDGE3 1705 1754 -4.90088 -8.53865 -4.31705 0.0088525 -0.00500423 -0.119701 +EDGE3 1706 1756 -4.46257 0.000926902 -4.40259 0.00573307 -0.00432296 -0.00555538 +EDGE3 1705 1756 -5.09243 8.52211 -4.49712 0.00406685 -0.0013744 0.12301 +EDGE3 1706 1755 -4.90005 -8.52429 -4.32648 0.00635644 -0.00675784 -0.121464 +EDGE3 1707 1757 -4.46848 0.00521947 -4.39639 0.00729026 -0.00088031 -0.00354317 +EDGE3 1706 1757 -5.09578 8.51391 -4.48832 0.0120641 0.0053398 0.132208 +EDGE3 1707 1756 -4.9173 -8.50643 -4.32755 0.00060621 -0.00779663 -0.126749 +EDGE3 1708 1758 -4.484 0.00899231 -4.40492 0.000799994 -0.0127595 0.000709404 +EDGE3 1707 1758 -5.0975 8.48278 -4.47668 0.0042559 -0.00349921 0.126635 +EDGE3 1708 1757 -4.92552 -8.50945 -4.32066 -0.000143342 -0.00113564 -0.132282 +EDGE3 1709 1759 -4.48968 0.0115846 -4.39342 -0.00164469 -0.00168715 0.000217034 +EDGE3 1708 1759 -5.10807 8.46415 -4.47587 -0.00192864 -0.00736527 0.120389 +EDGE3 1710 1760 -4.49283 0.0125112 -4.38815 0.00705472 0.00380897 -0.0037911 +EDGE3 1709 1758 -4.92315 -8.5013 -4.29363 0.00114813 -0.00283735 -0.121849 +EDGE3 1710 1759 -4.93509 -8.47433 -4.31526 0.00440049 -0.00479369 -0.120341 +EDGE3 1709 1760 -5.12883 8.46256 -4.47495 -0.00138098 -0.000103337 0.108133 +EDGE3 1710 1761 -5.1234 8.46638 -4.48053 -0.00123546 0.00885002 0.127603 +EDGE3 1711 1761 -4.49792 0.00311464 -4.3748 0.00341599 0.00660777 0.0125708 +EDGE3 1712 1762 -4.50237 -0.0160664 -4.36593 -0.00428098 0.00392426 0.00125971 +EDGE3 1711 1760 -4.94714 -8.46614 -4.29401 -0.00270889 -0.00519733 -0.124156 +EDGE3 1711 1762 -5.14711 8.43539 -4.47478 0.00136092 0.001311 0.126453 +EDGE3 1712 1761 -4.94556 -8.46075 -4.30707 0.000246495 0.00531703 -0.129555 +EDGE3 1713 1763 -4.51304 0.00697735 -4.3694 -0.0045643 -0.00260599 0.00446324 +EDGE3 1712 1763 -5.13318 8.4318 -4.46652 -0.00739496 0.00686113 0.122909 +EDGE3 1713 1762 -4.96531 -8.44798 -4.27752 -0.0038679 -0.00763536 -0.112975 +EDGE3 1714 1764 -4.51276 0.00308011 -4.35993 0.00416367 -0.00676518 -0.00111717 +EDGE3 1713 1764 -5.13018 8.41767 -4.45857 -0.00577241 -0.000868907 0.129002 +EDGE3 1714 1763 -4.97333 -8.42611 -4.27234 -0.00351826 0.00350512 -0.125859 +EDGE3 1715 1765 -4.53176 0.00413484 -4.34819 0.000817555 0.00186237 0.00165233 +EDGE3 1714 1765 -5.13922 8.39717 -4.4455 -0.00278324 0.00157898 0.117229 +EDGE3 1715 1764 -4.95969 -8.43194 -4.26933 -0.00151073 0.0123417 -0.120022 +EDGE3 1716 1766 -4.52251 0.0149422 -4.33271 0.000936408 0.00316246 0.00514966 +EDGE3 1715 1766 -5.14581 8.3821 -4.4375 0.00423475 0.000172169 0.125834 +EDGE3 1716 1765 -4.94955 -8.40509 -4.24594 -0.00567556 0.000627613 -0.126141 +EDGE3 1717 1767 -4.54202 0.00218461 -4.35846 -0.000606305 0.00768407 -0.00626311 +EDGE3 1716 1767 -5.16477 8.38548 -4.42922 0.00329349 0.00296248 0.123987 +EDGE3 1717 1766 -4.96868 -8.3877 -4.25713 -0.000186241 0.000111906 -0.13634 +EDGE3 1718 1768 -4.54136 0.0107697 -4.33926 0.00442219 -0.00220691 -0.00542465 +EDGE3 1717 1768 -5.16616 8.37161 -4.43332 -0.0114601 0.00761787 0.122307 +EDGE3 1718 1767 -4.96573 -8.37623 -4.23402 0.00309118 -0.00311486 -0.123504 +EDGE3 1719 1769 -4.53433 -0.00975262 -4.32641 -0.0070963 0.0022297 -0.00195741 +EDGE3 1718 1769 -5.1447 8.37326 -4.41194 0.00827199 -0.00413407 0.121609 +EDGE3 1719 1768 -4.99136 -8.36359 -4.26033 0.00867431 -0.00678133 -0.116108 +EDGE3 1720 1770 -4.55678 0.00171422 -4.31729 0.00138441 0.00012597 -0.00697187 +EDGE3 1719 1770 -5.16885 8.37194 -4.43036 0.00342476 0.00450472 0.128717 +EDGE3 1720 1769 -4.98139 -8.36608 -4.24723 0.00750154 -0.00449769 -0.122945 +EDGE3 1721 1771 -4.57164 0.0113314 -4.32356 -0.0040172 0.000747102 0.00468946 +EDGE3 1720 1771 -5.16851 8.32499 -4.40891 0.00178716 0.0023435 0.120161 +EDGE3 1721 1770 -5.00596 -8.33411 -4.22408 0.00926322 -0.00925389 -0.124937 +EDGE3 1721 1772 -5.16199 8.31172 -4.40662 0.000669806 -0.00175479 0.118003 +EDGE3 1722 1772 -4.56776 0.010436 -4.30607 -0.00290992 -0.00349028 0.0145956 +EDGE3 1723 1773 -4.54749 -0.00575548 -4.30011 -0.00272673 -0.00463424 -0.00632915 +EDGE3 1722 1771 -5.00931 -8.32701 -4.23034 -0.00100431 -0.00163772 -0.12069 +EDGE3 1722 1773 -5.19127 8.30533 -4.38992 -0.00153109 0.00237621 0.1232 +EDGE3 1723 1772 -4.99892 -8.33374 -4.24594 0.000498813 0.00528544 -0.134092 +EDGE3 1723 1774 -5.191 8.30273 -4.38961 -0.00434474 0.00303882 0.130567 +EDGE3 1724 1774 -4.55253 0.0114572 -4.3 0.000762637 0.00849202 0.00157689 +EDGE3 1725 1775 -4.59058 0.0197414 -4.29032 -0.0059671 0.0054069 -0.00562307 +EDGE3 1724 1773 -5.00745 -8.30539 -4.22362 -0.00745695 0.000972062 -0.119974 +EDGE3 1725 1774 -4.99439 -8.31173 -4.23116 -0.0103693 0.0021548 -0.12505 +EDGE3 1724 1775 -5.19737 8.28331 -4.38252 -0.0104314 0.00174383 0.122321 +EDGE3 1726 1776 -4.59495 0.0020752 -4.26758 0.00248563 -0.000526836 0.00723026 +EDGE3 1725 1776 -5.20232 8.28554 -4.36899 0.00523754 0.00329576 0.12395 +EDGE3 1726 1775 -5.00208 -8.28338 -4.20231 -0.00608037 0.00731839 -0.125097 +EDGE3 1727 1777 -4.58787 -0.0205211 -4.29688 -0.00101479 -0.00142098 0.000464129 +EDGE3 1726 1777 -5.19432 8.27393 -4.3709 -0.00451765 -0.00295319 0.125067 +EDGE3 1727 1776 -5.02707 -8.28532 -4.20844 -0.00284807 0.00955394 -0.120821 +EDGE3 1728 1778 -4.6086 -0.00711997 -4.29425 0.00331387 -0.00301041 -0.000453984 +EDGE3 1727 1778 -5.20365 8.24888 -4.36058 0.00406661 0.00867243 0.125156 +EDGE3 1728 1777 -5.02273 -8.2479 -4.17873 0.00400238 -0.00235402 -0.121914 +EDGE3 1729 1779 -4.63008 0.00812799 -4.27792 0.00160863 0.010225 -0.00725794 +EDGE3 1728 1779 -5.20525 8.26706 -4.34811 -0.002964 0.00736525 0.121271 +EDGE3 1729 1778 -5.02845 -8.24873 -4.19639 -0.00178973 -0.00647615 -0.131851 +EDGE3 1730 1780 -4.60187 0.000342963 -4.25134 -0.000381185 -0.00428038 0.00309793 +EDGE3 1729 1780 -5.20199 8.23186 -4.36814 -0.00823378 -0.00931865 0.128425 +EDGE3 1730 1779 -5.04228 -8.25032 -4.1859 0.00369481 0.00110395 -0.139163 +EDGE3 1731 1781 -4.60835 0.00191288 -4.26341 -0.00339761 0.00830836 0.000769442 +EDGE3 1730 1781 -5.2157 8.22484 -4.3712 0.00266939 -0.00217112 0.129647 +EDGE3 1731 1780 -5.03398 -8.2375 -4.19463 -0.0040721 -0.00166024 -0.130632 +EDGE3 1732 1782 -4.63037 0.00848965 -4.274 -0.00267054 0.0103415 0.00452662 +EDGE3 1731 1782 -5.22795 8.21063 -4.35978 0.000566959 -0.0083883 0.123631 +EDGE3 1732 1781 -5.03891 -8.2299 -4.16868 0.00065623 0.00232714 -0.130674 +EDGE3 1733 1783 -4.60016 -0.00860163 -4.25183 0.00478151 0.00117961 -0.00530487 +EDGE3 1732 1783 -5.23925 8.18871 -4.33956 0.0037349 -0.000634506 0.127712 +EDGE3 1733 1782 -5.04457 -8.19967 -4.15586 0.00421057 -0.00355809 -0.123458 +EDGE3 1734 1784 -4.62424 0.00677294 -4.24528 0.00200275 -0.000736637 0.00552751 +EDGE3 1733 1784 -5.22954 8.17159 -4.33968 -0.00295495 0.00460209 0.128511 +EDGE3 1734 1783 -5.05135 -8.20596 -4.15307 -0.000414325 -0.00168699 -0.131907 +EDGE3 1735 1785 -4.64245 0.021599 -4.23255 0.0127402 0.00594648 0.00381897 +EDGE3 1734 1785 -5.23487 8.1664 -4.33964 -0.0026474 -0.00199457 0.11777 +EDGE3 1735 1784 -5.06288 -8.19665 -4.16899 0.0078167 -0.00231779 -0.125445 +EDGE3 1736 1786 -4.62573 -0.014816 -4.2376 0.00366719 0.00154659 0.00599622 +EDGE3 1735 1786 -5.24302 8.15977 -4.32778 -0.00230045 0.00228577 0.123411 +EDGE3 1736 1785 -5.06076 -8.16643 -4.15056 0.00209257 0.00284555 -0.120358 +EDGE3 1737 1787 -4.62882 0.0146314 -4.21451 -0.00321084 0.00268585 -0.00388649 +EDGE3 1736 1787 -5.23814 8.13953 -4.3182 -0.00406714 0.00449396 0.128993 +EDGE3 1737 1786 -5.06797 -8.14391 -4.14988 0.00726148 -0.00311446 -0.121721 +EDGE3 1738 1788 -4.65693 -0.00346666 -4.2304 0.00584184 -0.00113563 -0.00302043 +EDGE3 1737 1788 -5.23424 8.12263 -4.30278 -0.00899633 -0.00147957 0.133166 +EDGE3 1738 1787 -5.06358 -8.14854 -4.14025 0.00595407 -0.00505718 -0.123507 +EDGE3 1739 1789 -4.64807 0.0141632 -4.22369 -0.0046028 0.00157621 -0.00518617 +EDGE3 1738 1789 -5.25673 8.13908 -4.31067 0.00443065 -0.0076489 0.133201 +EDGE3 1739 1788 -5.05153 -8.13869 -4.14819 0.00587418 0.000365209 -0.127118 +EDGE3 1740 1790 -4.65897 -0.0251027 -4.19734 0.00486756 -0.00282808 -0.00942836 +EDGE3 1739 1790 -5.26869 8.11189 -4.30704 0.00306314 -0.00973383 0.128872 +EDGE3 1740 1789 -5.08049 -8.11853 -4.13949 -0.00620491 -0.00229984 -0.127662 +EDGE3 1741 1791 -4.68684 -0.0130904 -4.21135 0.00489631 0.00226499 -0.000752785 +EDGE3 1740 1791 -5.27284 8.10051 -4.28521 -0.00286927 0.00720689 0.125303 +EDGE3 1741 1790 -5.07229 -8.11171 -4.13528 0.00604315 0.00806346 -0.121215 +EDGE3 1742 1792 -4.67802 0.00904448 -4.20022 -0.00331855 0.00623112 9.3183e-05 +EDGE3 1741 1792 -5.26671 8.08479 -4.27136 -0.000728376 0.00209457 0.128439 +EDGE3 1742 1791 -5.09315 -8.09908 -4.13417 0.000512083 0.00137468 -0.12285 +EDGE3 1743 1793 -4.66871 -0.00416177 -4.19493 -0.00122527 -0.00411521 0.00477443 +EDGE3 1742 1793 -5.25271 8.05949 -4.28504 -0.000997616 0.00292075 0.12906 +EDGE3 1743 1792 -5.08728 -8.10157 -4.11796 -0.00352996 0.0112946 -0.128655 +EDGE3 1744 1794 -4.67607 -0.0164956 -4.20775 -0.0010249 -0.00241265 -0.000756646 +EDGE3 1743 1794 -5.27185 8.05985 -4.28165 0.000365503 0.00337678 0.121361 +EDGE3 1744 1793 -5.07705 -8.07913 -4.11719 -0.00196629 0.00487034 -0.116681 +EDGE3 1745 1795 -4.69014 0.00689332 -4.17939 0.0013063 0.00501747 0.00589266 +EDGE3 1744 1795 -5.28611 8.04939 -4.27355 -0.00738489 0.00231815 0.123287 +EDGE3 1745 1794 -5.1018 -8.04551 -4.09743 -0.000560897 0.0046368 -0.132156 +EDGE3 1746 1796 -4.67279 -0.010781 -4.17909 -0.00402326 0.000453071 0.00120132 +EDGE3 1745 1796 -5.29535 8.04627 -4.25475 0.00144265 -0.000521883 0.120663 +EDGE3 1746 1795 -5.10249 -8.0536 -4.09243 0.0106755 0.00122832 -0.123796 +EDGE3 1747 1797 -4.6757 -0.00520637 -4.17606 0.000429574 -0.00245913 0.00416866 +EDGE3 1746 1797 -5.28419 8.02783 -4.2623 0.00463312 0.00782927 0.123273 +EDGE3 1747 1796 -5.09406 -8.0498 -4.10425 -0.00187039 0.00416645 -0.134958 +EDGE3 1748 1798 -4.71018 -0.00698221 -4.17471 -0.00258531 -0.00272227 -0.00507046 +EDGE3 1747 1798 -5.29158 8.01249 -4.2505 0.00201218 0.000138243 0.126248 +EDGE3 1748 1797 -5.12016 -8.01475 -4.08016 0.00049422 -0.00760895 -0.131083 +EDGE3 1749 1799 -4.68782 -0.0111991 -4.16818 -0.00226408 0.00574161 -0.00305846 +EDGE3 1748 1799 -5.29437 7.99409 -4.26855 0.0118761 -0.00293562 0.122421 +EDGE3 1749 1798 -5.10801 -8.0097 -4.08845 -0.00314819 -0.00526993 -0.124368 +EDGE3 1750 1800 -4.72621 0.00537238 -4.16265 -0.00318734 -0.00772941 -0.00151341 +EDGE3 1749 1800 -5.30981 7.985 -4.24272 -0.00391773 0.000450729 0.113754 +EDGE3 1750 1799 -5.13644 -7.98805 -4.08241 0.00932772 -0.00387961 -0.122076 +EDGE3 1751 1801 -4.70324 0.0138451 -4.15651 0.00166608 -0.00265305 -0.00290447 +EDGE3 1750 1801 -5.32069 7.98418 -4.23031 -0.00679922 0.00964936 0.117496 +EDGE3 1751 1800 -5.13139 -7.98015 -4.06904 0.00172066 -0.00836222 -0.130198 +EDGE3 1752 1802 -4.72115 0.0139493 -4.13187 -0.0014766 -0.014939 0.00168664 +EDGE3 1751 1802 -5.30548 7.95819 -4.23849 0.00611377 0.0028769 0.123041 +EDGE3 1752 1801 -5.11693 -7.97313 -4.05684 -0.00354816 -0.00410488 -0.119149 +EDGE3 1753 1803 -4.72733 -0.00365942 -4.13047 -0.00118614 -0.00406997 -0.0045082 +EDGE3 1752 1803 -5.31584 7.97011 -4.21404 -0.0107719 0.000955658 0.124064 +EDGE3 1753 1802 -5.13727 -7.95391 -4.04357 -0.00636282 0.00605131 -0.127976 +EDGE3 1754 1804 -4.73303 0.00824849 -4.14055 0.00320722 0.00567422 0.00613668 +EDGE3 1753 1804 -5.35771 7.92837 -4.2063 -0.000499519 -0.00438431 0.117675 +EDGE3 1754 1803 -5.1216 -7.96829 -4.05894 -0.000195688 -0.00975751 -0.127977 +EDGE3 1755 1805 -4.73812 -0.00115125 -4.11209 0.00549137 0.0016974 -0.00327842 +EDGE3 1754 1805 -5.32593 7.94897 -4.20147 0.00217093 -0.00490961 0.124266 +EDGE3 1755 1804 -5.14246 -7.951 -4.03964 -7.39711e-05 -0.0101504 -0.135882 +EDGE3 1756 1806 -4.73491 0.00554777 -4.12654 -0.00384748 -0.00756305 0.000936419 +EDGE3 1755 1806 -5.34869 7.91676 -4.20212 0.000942932 0.010556 0.128113 +EDGE3 1756 1805 -5.1391 -7.92164 -4.03041 0.000111205 0.000860223 -0.124374 +EDGE3 1757 1807 -4.73603 0.0137769 -4.1044 0.00101579 0.000533995 0.00486616 +EDGE3 1756 1807 -5.34331 7.88522 -4.19032 0.00177316 0.000687699 0.126979 +EDGE3 1757 1806 -5.15927 -7.92953 -4.03785 0.00120464 0.00362688 -0.131577 +EDGE3 1758 1808 -4.74915 0.0191835 -4.11207 0.00219347 -0.00219849 0.000813812 +EDGE3 1757 1808 -5.35028 7.88986 -4.19937 -0.00869138 -0.000909058 0.126577 +EDGE3 1758 1807 -5.15579 -7.90556 -4.02166 0.00465166 -0.00692597 -0.114966 +EDGE3 1759 1809 -4.74784 0.00746766 -4.09928 -0.00426062 0.011699 0.00576415 +EDGE3 1758 1809 -5.34219 7.89653 -4.19038 -0.00159798 -0.00228124 0.13112 +EDGE3 1759 1808 -5.16525 -7.90268 -4.01151 0.0010245 0.00525392 -0.133086 +EDGE3 1760 1810 -4.7538 0.00135746 -4.08172 -0.0070659 0.00461226 -0.000580874 +EDGE3 1759 1810 -5.34691 7.85419 -4.19329 -0.00367259 -0.00147655 0.128614 +EDGE3 1760 1809 -5.1418 -7.87608 -4.02225 0.00622532 -0.00134709 -0.133488 +EDGE3 1761 1811 -4.77255 -0.00110079 -4.0811 -0.00262756 -0.000165943 -0.00103222 +EDGE3 1760 1811 -5.34284 7.85372 -4.17837 -0.00564045 -0.0113174 0.133062 +EDGE3 1761 1810 -5.1708 -7.87224 -4.0076 0.00850324 -0.00265002 -0.124141 +EDGE3 1762 1812 -4.77692 -0.00569195 -4.09551 0.00363279 -0.00449926 0.00371681 +EDGE3 1761 1812 -5.34746 7.8393 -4.16966 0.00560402 -0.00162355 0.12054 +EDGE3 1762 1811 -5.17281 -7.85174 -4.01088 -0.00657454 0.00256248 -0.122076 +EDGE3 1763 1813 -4.80013 0.0084665 -4.09251 -0.000928648 -0.00437505 0.00119567 +EDGE3 1762 1813 -5.3615 7.82854 -4.17036 0.00455725 -0.0088188 0.121235 +EDGE3 1763 1812 -5.17578 -7.84989 -3.99364 -0.00471841 -0.00278453 -0.115941 +EDGE3 1764 1814 -4.7965 -0.00856955 -4.09089 -0.00397412 -0.00765278 0.00385453 +EDGE3 1763 1814 -5.38853 7.83431 -4.14929 -0.00045628 0.00353677 0.13121 +EDGE3 1764 1813 -5.19144 -7.83442 -3.99254 0.00352233 0.00603581 -0.118649 +EDGE3 1765 1815 -4.79206 0.00558584 -4.04563 0.00871251 -0.0042922 0.00309926 +EDGE3 1764 1815 -5.36725 7.81201 -4.15596 0.0111923 -0.00197418 0.115448 +EDGE3 1765 1814 -5.19035 -7.82217 -3.99147 0.00512521 -0.00460267 -0.128611 +EDGE3 1766 1816 -4.77845 -0.00441256 -4.0442 -0.00704164 -8.95846e-05 -0.00185803 +EDGE3 1765 1816 -5.37342 7.79742 -4.13513 -0.00552393 -0.00161662 0.124233 +EDGE3 1766 1815 -5.18121 -7.82633 -3.98698 0.00629875 -0.00856354 -0.120885 +EDGE3 1767 1817 -4.79596 -0.000962819 -4.05806 0.00413666 -0.00349824 -0.00192466 +EDGE3 1766 1817 -5.37867 7.77698 -4.13265 0.0041633 0.00647043 0.126957 +EDGE3 1767 1816 -5.18916 -7.79138 -3.98298 0.00663967 0.00766212 -0.12802 +EDGE3 1768 1818 -4.80544 0.0209846 -4.03808 -0.00441055 0.00844551 0.00481835 +EDGE3 1767 1818 -5.4133 7.76554 -4.12357 -0.00175648 -0.00383894 0.123008 +EDGE3 1768 1817 -5.19664 -7.78826 -3.97123 -0.000770452 0.00700671 -0.128765 +EDGE3 1769 1819 -4.81074 -0.00558745 -4.0382 -0.00148769 0.00269292 -0.00495283 +EDGE3 1768 1819 -5.39598 7.73728 -4.11962 0.00664756 0.00162131 0.137232 +EDGE3 1769 1818 -5.21689 -7.78695 -3.97569 0.000504212 -0.00505802 -0.119798 +EDGE3 1770 1820 -4.79754 -0.0108635 -4.04929 -0.000970622 0.011511 0.000467437 +EDGE3 1769 1820 -5.39582 7.74739 -4.13121 -0.00304358 2.85913e-05 0.129226 +EDGE3 1770 1819 -5.21457 -7.76097 -3.96217 -0.00130464 -0.0064372 -0.124357 +EDGE3 1771 1821 -4.81698 0.00055318 -4.02664 -0.00606606 -0.00974667 0.00453535 +EDGE3 1770 1821 -5.3956 7.7497 -4.11525 -0.00229933 -0.00115196 0.127435 +EDGE3 1771 1820 -5.21844 -7.75128 -3.95358 -0.00289642 -0.00191802 -0.125668 +EDGE3 1772 1822 -4.83576 0.00933636 -4.01842 -0.00413467 -0.0025674 0.00329193 +EDGE3 1771 1822 -5.40122 7.69734 -4.09303 0.000561841 0.0122773 0.125269 +EDGE3 1772 1821 -5.21745 -7.73242 -3.94373 0.0127426 0.00271038 -0.116791 +EDGE3 1773 1823 -4.82507 -0.00601204 -4.01117 -0.00208013 -0.00446983 0.0013009 +EDGE3 1772 1823 -5.42028 7.7075 -4.10698 -0.00932063 0.000346995 0.124843 +EDGE3 1773 1822 -5.20739 -7.71818 -3.93356 0.00738314 -0.00595838 -0.130112 +EDGE3 1774 1824 -4.82984 -0.00337805 -4.00393 0.00258337 0.000199836 -0.00649597 +EDGE3 1773 1824 -5.40638 7.7115 -4.09022 -0.00219855 -0.00791974 0.119325 +EDGE3 1774 1823 -5.21905 -7.68666 -3.9526 0.00558806 -0.00767765 -0.127598 +EDGE3 1775 1825 -4.83274 -0.00111258 -4.0168 0.000991733 -0.00217823 -0.00313342 +EDGE3 1774 1825 -5.41707 7.69115 -4.07404 -0.000334088 -0.00265889 0.124718 +EDGE3 1775 1824 -5.22695 -7.69678 -3.92552 -0.00166643 -0.00179389 -0.127163 +EDGE3 1776 1826 -4.84101 -0.00161329 -4.01365 -0.000490922 0.00654347 -0.00504623 +EDGE3 1775 1826 -5.41879 7.67467 -4.08883 0.00242679 -0.00406071 0.121281 +EDGE3 1776 1825 -5.22249 -7.68455 -3.92203 -0.0020291 -0.00151756 -0.121786 +EDGE3 1777 1827 -4.84104 0.0141983 -3.99493 0.00309375 0.00137081 -0.00949915 +EDGE3 1776 1827 -5.43444 7.64723 -4.06912 -0.00647614 -0.00409586 0.12987 +EDGE3 1777 1826 -5.2299 -7.66891 -3.92358 0.00713252 0.0119419 -0.121868 +EDGE3 1778 1828 -4.86067 0.0100221 -3.98931 -0.000287284 -0.00724482 0.00268864 +EDGE3 1777 1828 -5.43804 7.63237 -4.06572 0.00143094 0.00655069 0.126868 +EDGE3 1778 1827 -5.24652 -7.67455 -3.91106 -0.00828671 0.00219441 -0.116085 +EDGE3 1779 1829 -4.85624 -0.00790438 -3.97365 -0.00696169 0.00174687 -0.00645857 +EDGE3 1778 1829 -5.43117 7.6233 -4.05676 0.00106848 -0.000318647 0.115528 +EDGE3 1779 1828 -5.24423 -7.63953 -3.90257 -0.00075998 0.000594329 -0.123725 +EDGE3 1780 1830 -4.87057 0.00515478 -3.98362 0.00546996 -0.00315436 0.0069375 +EDGE3 1779 1830 -5.43175 7.62003 -4.04903 -0.00392246 0.00482205 0.125278 +EDGE3 1780 1829 -5.24138 -7.63903 -3.89189 -0.0133333 0.00501157 -0.124783 +EDGE3 1781 1831 -4.87877 0.0097089 -3.9732 -0.00788364 -0.00197953 -0.00288576 +EDGE3 1780 1831 -5.45175 7.60775 -4.0593 -0.0126872 -0.00124283 0.122769 +EDGE3 1781 1830 -5.24778 -7.62665 -3.8814 -0.00427409 0.00249382 -0.130438 +EDGE3 1782 1832 -4.86631 0.0118038 -3.96201 -0.00163373 0.0072918 0.000677132 +EDGE3 1781 1832 -5.4327 7.58986 -4.048 0.00561931 0.00744887 0.1184 +EDGE3 1782 1831 -5.24733 -7.61608 -3.89572 0.000915572 0.00402821 -0.130495 +EDGE3 1783 1833 -4.88988 -0.00472914 -3.95962 0.00369753 -0.00203298 0.000583655 +EDGE3 1782 1833 -5.45712 7.57273 -4.04446 -0.00100832 0.00541403 0.121423 +EDGE3 1783 1832 -5.25898 -7.59289 -3.87893 -0.00039329 0.00460208 -0.12344 +EDGE3 1784 1834 -4.86922 0.0125244 -3.94841 -0.00592215 0.000160338 0.00502568 +EDGE3 1783 1834 -5.46661 7.55772 -4.02775 0.0042378 0.00751998 0.130127 +EDGE3 1784 1833 -5.25606 -7.5807 -3.86885 5.93134e-05 0.000569124 -0.116905 +EDGE3 1785 1835 -4.88149 0.0105198 -3.93681 0.00343804 -0.000274619 0.010429 +EDGE3 1784 1835 -5.46573 7.54569 -4.02339 -0.00300424 -0.0135432 0.122173 +EDGE3 1785 1834 -5.27237 -7.55795 -3.87117 0.000126786 -0.00402868 -0.127021 +EDGE3 1786 1836 -4.89184 -0.0145697 -3.9628 -0.00210342 -0.00478344 -0.00693923 +EDGE3 1785 1836 -5.4493 7.55279 -4.03184 -0.00269612 -0.00411308 0.124466 +EDGE3 1786 1835 -5.27193 -7.54063 -3.86363 0.00280101 -0.00196662 -0.119777 +EDGE3 1787 1837 -4.88842 -0.00321293 -3.93906 0.00602598 -0.000603456 -0.00268222 +EDGE3 1786 1837 -5.47898 7.54868 -4.02225 -0.00141627 0.00750055 0.131317 +EDGE3 1788 1838 -4.90806 0.00472187 -3.93172 0.00442237 -0.000908216 0.00505285 +EDGE3 1787 1836 -5.2731 -7.53022 -3.86533 -0.00178273 -0.00503991 -0.122143 +EDGE3 1787 1838 -5.4657 7.51714 -4.00098 -0.00906945 -0.00451026 0.131148 +EDGE3 1788 1837 -5.29103 -7.51311 -3.84877 0.00448476 0.00818726 -0.125253 +EDGE3 1789 1839 -4.89769 -0.0126705 -3.90722 0.00238446 -0.0063316 -0.000338521 +EDGE3 1788 1839 -5.48419 7.50244 -4.01409 -0.00149754 -0.00255201 0.125979 +EDGE3 1789 1838 -5.2746 -7.49417 -3.85077 0.0115566 -0.00551092 -0.126782 +EDGE3 1790 1840 -4.8991 -0.00610139 -3.91129 0.0116912 0.00982374 -0.00438881 +EDGE3 1789 1840 -5.47897 7.48023 -4.00684 0.0039925 -0.00210537 0.122402 +EDGE3 1790 1839 -5.27324 -7.50365 -3.83917 0.00366159 -0.000412353 -0.125702 +EDGE3 1790 1841 -5.49213 7.48938 -3.99377 -0.00126395 2.82117e-05 0.120728 +EDGE3 1791 1841 -4.92089 0.0042946 -3.91402 0.00642204 0.0125096 0.000488459 +EDGE3 1792 1842 -4.92189 -0.00420187 -3.91184 0.0055212 0.00621852 -0.00670769 +EDGE3 1791 1840 -5.30365 -7.5031 -3.82928 -0.00100965 0.00777671 -0.131089 +EDGE3 1791 1842 -5.49148 7.46466 -3.9785 0.00579941 -0.00322865 0.129423 +EDGE3 1792 1841 -5.28295 -7.46247 -3.83276 -0.00696141 -0.000117526 -0.133673 +EDGE3 1793 1843 -4.92649 -0.00829784 -3.87935 0.00587566 -0.00559562 0.00698386 +EDGE3 1792 1843 -5.49405 7.45133 -3.99029 0.000400062 0.00230338 0.131241 +EDGE3 1794 1844 -4.9141 -0.00722005 -3.88016 0.000240627 -0.00325098 0.00570124 +EDGE3 1793 1842 -5.30724 -7.48533 -3.82531 -0.000744931 0.00372683 -0.120967 +EDGE3 1793 1844 -5.4891 7.45599 -3.96953 -0.000777685 -0.000151992 0.121547 +EDGE3 1794 1843 -5.30437 -7.44963 -3.82908 0.00150096 -0.00565203 -0.112878 +EDGE3 1795 1845 -4.93328 0.0150752 -3.89674 -0.00461024 0.00428676 0.00176754 +EDGE3 1794 1845 -5.4987 7.41637 -3.97222 -0.00215865 -0.000715351 0.120075 +EDGE3 1795 1844 -5.30045 -7.45393 -3.80138 -0.00692858 0.0011518 -0.126936 +EDGE3 1796 1846 -4.94757 0.0103936 -3.85632 -0.00775139 -0.00739801 0.0022732 +EDGE3 1795 1846 -5.51218 7.42517 -3.96888 -0.00720216 -0.00591771 0.122204 +EDGE3 1796 1845 -5.31366 -7.43179 -3.77559 0.00383245 -0.00292236 -0.130379 +EDGE3 1797 1847 -4.94997 0.00257094 -3.88691 0.00191343 0.00143999 -0.00282743 +EDGE3 1796 1847 -5.51375 7.39662 -3.94741 -0.0146426 0.002678 0.138598 +EDGE3 1797 1846 -5.30228 -7.40807 -3.82299 0.00269726 -0.000520389 -0.122618 +EDGE3 1798 1848 -4.96212 -0.000484764 -3.87534 0.00585509 -0.00377764 0.00505864 +EDGE3 1797 1848 -5.53592 7.39659 -3.93433 -0.000820939 0.00368366 0.114748 +EDGE3 1798 1847 -5.31345 -7.4244 -3.78397 0.00102956 -0.00420212 -0.118345 +EDGE3 1799 1849 -4.95885 0.00559666 -3.84582 0.00533096 0.00582266 0.00149242 +EDGE3 1798 1849 -5.53871 7.36775 -3.94233 0.00142874 -0.00269586 0.113878 +EDGE3 1799 1848 -5.31104 -7.3862 -3.77125 0.00167784 0.000547142 -0.126564 +EDGE3 1799 1850 -5.53526 7.35893 -3.92174 -0.00668154 -0.00367834 0.11654 +EDGE3 1800 1850 -4.96405 0.011793 -3.84382 0.00311047 0.00118596 -0.0030939 +EDGE3 1801 1851 -4.97307 0.00993378 -3.85167 0.00242888 0.00183186 -0.000197758 +EDGE3 1800 1849 -5.33449 -7.38333 -3.77724 -0.00139834 -0.00285177 -0.127622 +EDGE3 1800 1851 -5.52924 7.36526 -3.92202 -0.00591262 -0.00520716 0.124196 +EDGE3 1801 1850 -5.3247 -7.3791 -3.76751 -0.000112635 -0.00521953 -0.124198 +EDGE3 1802 1852 -4.98923 0.0112162 -3.83481 0.0114993 -0.000606867 -5.62146e-05 +EDGE3 1801 1852 -5.53664 7.34147 -3.92305 0.00301946 0.00560317 0.130139 +EDGE3 1802 1851 -5.33904 -7.3548 -3.77752 0.00361972 -0.00670066 -0.125198 +EDGE3 1803 1853 -4.9857 -0.0110467 -3.84025 -0.00147163 0.00723585 -0.00126161 +EDGE3 1802 1853 -5.54421 7.30394 -3.917 0.0107962 -0.00472256 0.121317 +EDGE3 1803 1852 -5.3286 -7.34193 -3.74367 -0.00344636 -0.000315943 -0.124393 +EDGE3 1803 1854 -5.55231 7.30411 -3.92736 0.000390471 0.00218551 0.132627 +EDGE3 1804 1854 -4.98844 0.01409 -3.82544 -0.0118589 -0.00772716 0.00283645 +EDGE3 1805 1855 -4.9818 -0.0018531 -3.84302 -0.0041274 0.00697165 -0.00486252 +EDGE3 1804 1853 -5.33442 -7.31912 -3.76166 -0.00314441 -0.00179554 -0.123176 +EDGE3 1804 1855 -5.54031 7.30667 -3.8845 -0.00337083 -0.00454509 0.122479 +EDGE3 1805 1854 -5.35693 -7.32863 -3.74797 -0.00221866 -0.00456363 -0.125097 +EDGE3 1806 1856 -4.98995 0.0114391 -3.81675 0.00821867 -0.00216048 0.00135355 +EDGE3 1805 1856 -5.55899 7.29332 -3.87808 0.00270258 0.00302759 0.123812 +EDGE3 1806 1855 -5.34247 -7.30931 -3.74234 -0.00421265 -0.0073021 -0.122341 +EDGE3 1807 1857 -5.00371 -0.00744606 -3.79101 -0.00283192 -0.00102042 -0.00199942 +EDGE3 1806 1857 -5.55272 7.26499 -3.87098 0.00288564 -0.00496099 0.115404 +EDGE3 1807 1856 -5.34783 -7.28885 -3.75279 -0.00337934 0.00858725 -0.114765 +EDGE3 1807 1858 -5.55181 7.28294 -3.88505 0.00307232 0.00378405 0.125469 +EDGE3 1808 1858 -5.00619 0.00546765 -3.79761 -0.00496154 0.0041372 0.0088314 +EDGE3 1809 1859 -5.02435 0.00583731 -3.78925 0.000721523 -0.00526779 -0.00757855 +EDGE3 1808 1857 -5.34959 -7.26569 -3.72795 -0.0106843 0.000171288 -0.124213 +EDGE3 1808 1859 -5.57999 7.25355 -3.88685 0.00157848 -0.00210909 0.11749 +EDGE3 1809 1858 -5.36856 -7.24227 -3.73412 -0.00294689 0.00179432 -0.12192 +EDGE3 1810 1860 -5.00022 -0.0147499 -3.77794 0.00391133 0.00519094 0.00577906 +EDGE3 1809 1860 -5.59024 7.24121 -3.86817 9.94707e-05 0.00979787 0.131085 +EDGE3 1810 1859 -5.35348 -7.24187 -3.73198 -0.000677837 0.000875136 -0.126649 +EDGE3 1811 1861 -5.00657 -0.0110183 -3.78119 0.00131098 -0.00759608 0.0067793 +EDGE3 1810 1861 -5.55535 7.21628 -3.87787 -0.0076914 0.00218581 0.131753 +EDGE3 1812 1862 -5.01181 -0.0126223 -3.77806 0.00703621 -0.00607796 -0.00369898 +EDGE3 1811 1860 -5.39156 -7.25552 -3.70554 -0.00371105 -0.00723323 -0.128795 +EDGE3 1811 1862 -5.58522 7.19873 -3.85832 -0.00294616 -0.0051768 0.127938 +EDGE3 1812 1861 -5.369 -7.24147 -3.69519 0.00103907 -0.0110418 -0.121532 +EDGE3 1812 1863 -5.5897 7.20084 -3.82544 0.00370806 0.000506186 0.129033 +EDGE3 1813 1863 -5.04907 0.00907158 -3.77108 0.013883 -0.00806322 0.0140914 +EDGE3 1814 1864 -5.03323 0.00949314 -3.74804 0.000907748 0.00580174 -0.00726649 +EDGE3 1813 1862 -5.36551 -7.20569 -3.68941 -0.00371072 0.00827723 -0.121557 +EDGE3 1813 1864 -5.60027 7.19589 -3.84176 0.00669964 -0.00107158 0.112612 +EDGE3 1814 1863 -5.38367 -7.19072 -3.69206 -0.00349699 0.00266039 -0.138488 +EDGE3 1815 1865 -5.02366 0.00246223 -3.73602 0.00862934 -0.00955701 0.00417376 +EDGE3 1814 1865 -5.58438 7.16074 -3.83254 0.00255022 -0.00412662 0.12528 +EDGE3 1815 1864 -5.40237 -7.17777 -3.69637 0.00666684 -0.000597053 -0.132842 +EDGE3 1815 1866 -5.57288 7.15153 -3.8424 -0.00262732 0.000943838 0.130775 +EDGE3 1816 1866 -5.039 0.00560424 -3.74756 -0.00698861 0.0015765 -0.00673983 +EDGE3 1817 1867 -5.05844 0.0258366 -3.76123 0.00451125 0.0122019 -0.00499206 +EDGE3 1816 1865 -5.37799 -7.17988 -3.6876 -0.00166073 -0.0103255 -0.120544 +EDGE3 1817 1866 -5.4046 -7.18739 -3.65828 0.00430793 -0.00822985 -0.122994 +EDGE3 1816 1867 -5.5914 7.12999 -3.82889 0.00581652 0.003029 0.132242 +EDGE3 1818 1868 -5.05815 0.00724027 -3.73092 -0.00439417 0.00764833 0.000767403 +EDGE3 1817 1868 -5.57902 7.14382 -3.80409 -0.0104346 0.00884767 0.119018 +EDGE3 1818 1867 -5.40268 -7.15587 -3.66947 0.00152587 0.00414913 -0.133321 +EDGE3 1819 1869 -5.03711 0.00814831 -3.72953 -0.00464985 0.00440622 -0.00144952 +EDGE3 1818 1869 -5.58991 7.14242 -3.8123 -0.0053982 -0.00642717 0.130444 +EDGE3 1819 1868 -5.40839 -7.15419 -3.66599 -0.00850906 -0.00177424 -0.123692 +EDGE3 1820 1870 -5.05813 0.021501 -3.71573 -0.00414362 0.0086448 -0.00285269 +EDGE3 1819 1870 -5.61953 7.10038 -3.80619 0.00568748 5.79418e-05 0.125191 +EDGE3 1820 1869 -5.39741 -7.11843 -3.65781 -0.000391103 0.00157398 -0.124734 +EDGE3 1821 1871 -5.0736 0.0212171 -3.71211 -2.08887e-05 -0.00460146 -0.002584 +EDGE3 1820 1871 -5.61621 7.08876 -3.78497 0.00397592 0.00555962 0.12192 +EDGE3 1821 1870 -5.41197 -7.11014 -3.65301 -0.00638121 0.00527497 -0.131208 +EDGE3 1822 1872 -5.04741 0.00870519 -3.70789 -0.000230292 -0.000873144 0.00307456 +EDGE3 1821 1872 -5.60137 7.087 -3.77871 0.00248309 -0.00696512 0.128778 +EDGE3 1822 1871 -5.41983 -7.1034 -3.65369 0.00162581 0.00213314 -0.124818 +EDGE3 1823 1873 -5.05267 0.00524996 -3.71638 -0.00579428 0.00923454 -0.00326197 +EDGE3 1822 1873 -5.61598 7.0637 -3.7876 0.00116371 0.00409724 0.12622 +EDGE3 1823 1872 -5.40061 -7.09643 -3.64977 -0.00558031 0.00523821 -0.129583 +EDGE3 1824 1874 -5.08303 -0.010495 -3.69223 0.00382765 0.000456398 0.0010409 +EDGE3 1823 1874 -5.61648 7.06308 -3.78506 -0.00355655 -0.00294706 0.12362 +EDGE3 1824 1873 -5.41476 -7.07109 -3.65242 0.00937302 0.00468833 -0.133854 +EDGE3 1825 1875 -5.10877 0.012724 -3.69363 -0.0103521 0.000995326 -0.00549889 +EDGE3 1824 1875 -5.62951 7.0428 -3.75334 0.00732055 0.00438405 0.126672 +EDGE3 1825 1874 -5.43053 -7.04946 -3.61772 0.00284715 -0.00141089 -0.119666 +EDGE3 1826 1876 -5.09569 -0.0024769 -3.67861 -0.00398303 -0.00362376 0.0050859 +EDGE3 1825 1876 -5.63029 7.02696 -3.76381 0.00652574 0.00265989 0.12324 +EDGE3 1826 1875 -5.42519 -7.0529 -3.63365 -0.00501932 -0.00331789 -0.124147 +EDGE3 1827 1877 -5.08086 -0.00713862 -3.67703 -0.00143428 -0.00656485 0.00515458 +EDGE3 1826 1877 -5.61835 7.02542 -3.75782 0.0075002 0.00321902 0.122756 +EDGE3 1827 1876 -5.44305 -7.03215 -3.61603 0.00146615 -0.00168102 -0.124775 +EDGE3 1828 1878 -5.09889 0.00198029 -3.6759 -0.00106914 -0.00655782 -0.00123333 +EDGE3 1827 1878 -5.6165 7.01785 -3.76056 -0.00331247 0.00053484 0.124608 +EDGE3 1828 1877 -5.44349 -7.01581 -3.6011 -0.00364302 0.00268327 -0.121456 +EDGE3 1829 1879 -5.08557 0.00965347 -3.67132 0.00061807 0.000630563 -0.000121221 +EDGE3 1828 1879 -5.63911 6.99177 -3.75324 -0.00793607 0.000761124 0.123011 +EDGE3 1829 1878 -5.44342 -6.99751 -3.60598 0.00641459 0.00331993 -0.126517 +EDGE3 1830 1880 -5.10409 -0.0011256 -3.6625 0.000963328 0.00145529 -0.00309162 +EDGE3 1829 1880 -5.64931 6.98027 -3.7556 -0.00243981 -0.000890899 0.120572 +EDGE3 1830 1879 -5.44327 -6.99225 -3.57168 0.00740068 -0.00230545 -0.128326 +EDGE3 1831 1881 -5.11302 -0.00354604 -3.64876 0.000544769 -0.00178334 -0.00879484 +EDGE3 1830 1881 -5.63538 6.98623 -3.72734 0.00257429 -0.00418372 0.123594 +EDGE3 1831 1880 -5.44074 -6.97584 -3.59001 0.00594625 0.00585397 -0.138544 +EDGE3 1832 1882 -5.12505 -0.0118521 -3.6498 -0.00705581 0.000998992 -0.00246359 +EDGE3 1831 1882 -5.64366 6.94987 -3.72683 -0.00197274 0.00102544 0.125517 +EDGE3 1832 1881 -5.45257 -6.96809 -3.58824 0.0030764 -1.95593e-05 -0.125861 +EDGE3 1833 1883 -5.10776 0.00187118 -3.64236 -0.00368273 0.00484534 -0.00368708 +EDGE3 1832 1883 -5.64553 6.94502 -3.71171 -0.00451129 -0.00357991 0.125969 +EDGE3 1833 1882 -5.44584 -6.9658 -3.55775 0.000593117 -0.00383649 -0.124425 +EDGE3 1834 1884 -5.13371 -0.00673398 -3.62898 -0.000392778 -0.0039544 0.00365269 +EDGE3 1833 1884 -5.64997 6.91941 -3.7193 -0.000514329 0.00292452 0.126277 +EDGE3 1834 1883 -5.45836 -6.93094 -3.5545 -0.000628971 0.0130496 -0.134989 +EDGE3 1835 1885 -5.12279 0.000452955 -3.63925 -0.00205259 0.00359525 0.00813425 +EDGE3 1834 1885 -5.6488 6.89551 -3.70261 0.00282603 -0.00322824 0.122874 +EDGE3 1835 1884 -5.46095 -6.92289 -3.56842 -0.00644427 -0.00466636 -0.127138 +EDGE3 1836 1886 -5.11736 0.00438354 -3.64504 -0.000908111 0.00300209 0.00391021 +EDGE3 1835 1886 -5.65238 6.8981 -3.69778 0.00270809 -0.000174884 0.126167 +EDGE3 1836 1885 -5.48396 -6.91899 -3.55135 -0.00322862 -0.00161251 -0.127153 +EDGE3 1837 1887 -5.13166 0.00167848 -3.61639 0.00234152 -0.00533239 0.00776714 +EDGE3 1836 1887 -5.67315 6.883 -3.67419 -0.00619349 0.00493397 0.127774 +EDGE3 1837 1886 -5.469 -6.90551 -3.56312 -0.0121594 -0.0025803 -0.124952 +EDGE3 1838 1888 -5.15401 -0.00535823 -3.61032 -0.000269992 -0.0133699 -0.00501315 +EDGE3 1837 1888 -5.66973 6.86408 -3.69924 0.00377233 0.00113323 0.123228 +EDGE3 1838 1887 -5.478 -6.88341 -3.53705 0.00121067 0.00338511 -0.131711 +EDGE3 1839 1889 -5.15816 0.012348 -3.59288 -0.00176348 0.00145552 -0.00142139 +EDGE3 1838 1889 -5.67174 6.84919 -3.68864 -0.00348412 0.0058242 0.129062 +EDGE3 1839 1888 -5.46317 -6.857 -3.53726 0.0094118 0.0028332 -0.123841 +EDGE3 1840 1890 -5.16255 -0.00360815 -3.59699 -0.00127088 0.00059433 -0.00135448 +EDGE3 1839 1890 -5.68185 6.83724 -3.66692 -0.00576477 -0.00066441 0.122029 +EDGE3 1840 1889 -5.46265 -6.86421 -3.52256 -0.000274476 -0.00102173 -0.128663 +EDGE3 1841 1891 -5.1708 -0.0120635 -3.58109 -0.00170977 -0.00939015 0.00776685 +EDGE3 1840 1891 -5.69528 6.83548 -3.67026 -0.000547713 0.0188776 0.127499 +EDGE3 1841 1890 -5.49495 -6.83944 -3.51688 0.00158725 0.00111175 -0.124543 +EDGE3 1842 1892 -5.15973 0.000744055 -3.58212 -0.00408669 -0.00243039 0.00247302 +EDGE3 1841 1892 -5.69756 6.82574 -3.64871 -0.00189009 -0.00380789 0.131453 +EDGE3 1842 1891 -5.49737 -6.85385 -3.52437 -0.0041385 0.00639935 -0.130551 +EDGE3 1843 1893 -5.15553 -0.000184333 -3.594 -0.00141491 -0.0113157 -0.00697898 +EDGE3 1842 1893 -5.6959 6.81562 -3.65725 0.00642619 0.00368315 0.129043 +EDGE3 1843 1892 -5.49346 -6.78955 -3.50982 0.00242095 0.00595954 -0.129134 +EDGE3 1844 1894 -5.19057 -0.00850402 -3.55761 0.0037234 0.000509833 -0.00447113 +EDGE3 1843 1894 -5.69247 6.77909 -3.64074 -0.00045393 0.00251018 0.114145 +EDGE3 1844 1893 -5.48665 -6.81181 -3.49552 -0.00466797 -0.000512546 -0.129289 +EDGE3 1845 1895 -5.19393 -0.0053208 -3.56502 0.00123233 -0.00653559 0.0109222 +EDGE3 1844 1895 -5.71488 6.78204 -3.63139 -0.00317601 -0.00313305 0.126885 +EDGE3 1845 1894 -5.50055 -6.78309 -3.49317 -0.00721908 -0.000518441 -0.114114 +EDGE3 1846 1896 -5.18598 0.00670256 -3.55278 0.00072354 0.00793236 -0.00241618 +EDGE3 1845 1896 -5.70185 6.77358 -3.63124 0.00626283 -0.00654293 0.134823 +EDGE3 1846 1895 -5.49589 -6.79489 -3.50549 0.000323905 -0.00142103 -0.124881 +EDGE3 1847 1897 -5.18581 -0.0212236 -3.54927 -0.00598339 0.00263016 0.000319618 +EDGE3 1846 1897 -5.71812 6.76556 -3.61555 0.00525337 -0.0119964 0.131982 +EDGE3 1847 1896 -5.50499 -6.76911 -3.47207 -0.000959178 0.00362545 -0.128037 +EDGE3 1848 1898 -5.19506 0.0152057 -3.53071 -0.014967 -0.0170116 -0.00631657 +EDGE3 1847 1898 -5.71701 6.73923 -3.59891 -0.000968431 0.00451709 0.127672 +EDGE3 1848 1897 -5.48812 -6.75158 -3.47401 0.0164432 0.00327616 -0.124409 +EDGE3 1849 1899 -5.18717 0.0029429 -3.55133 0.00719912 -0.000800041 -0.00267123 +EDGE3 1848 1899 -5.71834 6.73421 -3.60384 -0.00817363 0.00213857 0.1205 +EDGE3 1849 1898 -5.50698 -6.73763 -3.47791 -8.89939e-05 -0.00707023 -0.130531 +EDGE3 1850 1900 -5.19995 0.00219266 -3.53971 -0.006476 -0.00103317 0.00292286 +EDGE3 1849 1900 -5.71914 6.73051 -3.61343 -0.00169842 -0.000604634 0.127345 +EDGE3 1850 1899 -5.49664 -6.71823 -3.47202 0.00411462 0.00659787 -0.129788 +EDGE3 1851 1901 -5.21099 -0.00039306 -3.51251 0.00423305 -0.000650649 -0.0125266 +EDGE3 1850 1901 -5.71778 6.6809 -3.60384 -0.00638793 0.00241048 0.128158 +EDGE3 1851 1900 -5.51004 -6.72334 -3.45522 0.000411477 0.000994537 -0.12933 +EDGE3 1852 1902 -5.19587 0.0102717 -3.52158 -0.000126853 -0.000170372 -0.00827045 +EDGE3 1851 1902 -5.72771 6.66201 -3.59414 -0.0097872 -4.3307e-05 0.123124 +EDGE3 1852 1901 -5.52918 -6.69913 -3.43743 -0.00323176 -0.00217446 -0.125943 +EDGE3 1853 1903 -5.21226 0.0042453 -3.5288 0.00061414 -7.9598e-05 0.000548606 +EDGE3 1852 1903 -5.7323 6.67915 -3.57668 -0.00985475 0.00645645 0.123548 +EDGE3 1853 1902 -5.50293 -6.69196 -3.45305 -0.00542387 0.0123272 -0.120223 +EDGE3 1854 1904 -5.2032 -0.013113 -3.50715 -0.0125727 -0.000931647 0.00349719 +EDGE3 1853 1904 -5.72788 6.65255 -3.58224 0.0136325 0.00113703 0.129825 +EDGE3 1854 1903 -5.51908 -6.70721 -3.44234 0.00532937 0.00872313 -0.131277 +EDGE3 1855 1905 -5.20254 0.00050389 -3.47949 0.00392098 -0.00269351 -0.00563944 +EDGE3 1854 1905 -5.73292 6.65004 -3.57074 -0.00729607 0.00821942 0.12639 +EDGE3 1855 1904 -5.54267 -6.65048 -3.43759 0.00467327 -0.000531575 -0.124383 +EDGE3 1856 1906 -5.22828 0.0117716 -3.49639 0.00328251 0.00108014 0.00775688 +EDGE3 1855 1906 -5.73227 6.64264 -3.55968 -0.00499372 -0.0135159 0.131905 +EDGE3 1856 1905 -5.53262 -6.63145 -3.42776 0.000654223 0.000337119 -0.119101 +EDGE3 1857 1907 -5.23207 -0.00951556 -3.47987 0.00469953 -0.00238054 0.000414118 +EDGE3 1856 1907 -5.74549 6.61612 -3.56477 -0.00971957 0.00628617 0.123235 +EDGE3 1857 1906 -5.53195 -6.6512 -3.41654 0.000667421 -0.0026193 -0.124497 +EDGE3 1858 1908 -5.24507 0.00851595 -3.48632 -0.00516835 -0.00457761 0.00514431 +EDGE3 1857 1908 -5.74495 6.62652 -3.54158 -0.00278559 0.00405758 0.137789 +EDGE3 1858 1907 -5.53512 -6.62543 -3.40515 -0.0110708 -0.0111325 -0.127151 +EDGE3 1859 1909 -5.23841 0.017278 -3.46855 0.0021455 -0.00460282 -0.00372899 +EDGE3 1858 1909 -5.76631 6.59822 -3.53293 0.00305393 0.00719496 0.127431 +EDGE3 1859 1908 -5.55525 -6.61155 -3.40748 0.00116366 -0.00389885 -0.128165 +EDGE3 1860 1910 -5.23101 0.00499385 -3.48303 0.00187549 0.000302053 0.00418708 +EDGE3 1859 1910 -5.7616 6.57211 -3.55858 -0.00767666 -0.00408892 0.12042 +EDGE3 1860 1909 -5.55524 -6.60557 -3.39136 0.000274031 0.004333 -0.126034 +EDGE3 1861 1911 -5.26239 -0.0008173 -3.45123 0.0044654 0.000274662 0.00833256 +EDGE3 1860 1911 -5.76661 6.55365 -3.5219 -0.00353071 0.00219628 0.125549 +EDGE3 1861 1910 -5.54592 -6.56799 -3.38505 0.00590811 0.000164157 -0.130709 +EDGE3 1862 1912 -5.24175 -0.014365 -3.44558 0.000692072 -0.00263768 -0.00574217 +EDGE3 1861 1912 -5.77412 6.55102 -3.52617 0.0099999 -0.00317613 0.127624 +EDGE3 1862 1911 -5.56218 -6.57174 -3.38229 0.00523684 0.0133906 -0.12559 +EDGE3 1863 1913 -5.26658 0.00369651 -3.44044 0.00437295 -0.00271726 0.000465584 +EDGE3 1862 1913 -5.74915 6.54269 -3.51098 -0.00175548 -0.00677235 0.129113 +EDGE3 1863 1912 -5.56335 -6.54751 -3.40561 -0.00483739 0.00913401 -0.130001 +EDGE3 1864 1914 -5.26189 -0.00302098 -3.44183 -0.00987291 0.00836309 -0.000794343 +EDGE3 1863 1914 -5.76363 6.53738 -3.5149 -0.00215253 -0.00215478 0.126919 +EDGE3 1864 1913 -5.56994 -6.54897 -3.38404 0.000230485 -0.00687689 -0.116027 +EDGE3 1865 1915 -5.26253 -0.00364288 -3.4411 0.00348503 0.00159369 -0.0101161 +EDGE3 1864 1915 -5.77426 6.514 -3.50853 -0.00113978 0.00256539 0.129222 +EDGE3 1865 1914 -5.56667 -6.5213 -3.36661 0.00798109 0.0111652 -0.125763 +EDGE3 1866 1916 -5.27022 0.00511204 -3.42189 0.00470469 -0.00476784 0.00511343 +EDGE3 1865 1916 -5.75982 6.50099 -3.5042 -0.000352116 0.000689981 0.129946 +EDGE3 1866 1915 -5.56872 -6.51007 -3.35244 0.00191356 0.00793742 -0.132836 +EDGE3 1867 1917 -5.27055 0.0126347 -3.42565 0.00743785 0.00161532 -0.00466631 +EDGE3 1866 1917 -5.78311 6.47578 -3.45933 0.00320478 0.00423008 0.134552 +EDGE3 1867 1916 -5.56709 -6.4858 -3.34909 -0.00245744 -0.00333526 -0.123421 +EDGE3 1868 1918 -5.27602 -0.0188264 -3.41401 0.00550606 0.0087008 -0.00582172 +EDGE3 1867 1918 -5.7716 6.4749 -3.49017 -0.00930914 0.000555756 0.125922 +EDGE3 1868 1917 -5.57969 -6.48561 -3.34975 -0.00698191 -0.0044222 -0.132387 +EDGE3 1869 1919 -5.29277 -0.0136755 -3.41526 0.00207453 0.00400624 -0.00583018 +EDGE3 1868 1919 -5.79274 6.45672 -3.49303 -0.00540824 -0.0103684 0.129757 +EDGE3 1869 1918 -5.57228 -6.47328 -3.32796 -0.00881996 -0.00335636 -0.120297 +EDGE3 1870 1920 -5.28728 0.00328401 -3.38105 -0.00361681 0.00130894 -0.00400956 +EDGE3 1869 1920 -5.80512 6.43933 -3.46979 0.00870172 0.00683248 0.12871 +EDGE3 1870 1919 -5.5975 -6.47069 -3.34495 -0.00497276 -0.00156028 -0.121443 +EDGE3 1871 1921 -5.26175 0.00680745 -3.38121 -0.0064361 3.41879e-05 0.00694569 +EDGE3 1870 1921 -5.78615 6.44626 -3.47955 -0.00616073 0.00516728 0.129516 +EDGE3 1871 1920 -5.58841 -6.45249 -3.30494 -0.00261774 -0.00355625 -0.126504 +EDGE3 1872 1922 -5.3031 0.00467001 -3.37482 0.00446262 0.00672643 -0.00653805 +EDGE3 1871 1922 -5.78552 6.42387 -3.44719 0.00639153 -0.000512289 0.120192 +EDGE3 1872 1921 -5.58702 -6.44166 -3.32471 -0.00179406 -0.00194478 -0.123637 +EDGE3 1873 1923 -5.30883 0.0103124 -3.36053 0.00337579 -0.00301483 0.00144519 +EDGE3 1872 1923 -5.80598 6.40773 -3.45752 0.00263373 -0.00111141 0.128788 +EDGE3 1873 1922 -5.58176 -6.41815 -3.30883 0.00270731 -0.00569288 -0.124409 +EDGE3 1874 1924 -5.2837 -0.00793459 -3.35649 -0.00149375 -0.00818643 -6.70774e-05 +EDGE3 1873 1924 -5.79841 6.39653 -3.45627 -0.0036596 0.00269822 0.121319 +EDGE3 1874 1923 -5.58129 -6.40258 -3.31529 0.0039288 -0.00182464 -0.127105 +EDGE3 1875 1925 -5.31893 -0.00955089 -3.36933 0.000646228 -0.0049979 0.00289322 +EDGE3 1874 1925 -5.80502 6.40053 -3.42968 0.00225727 -0.00166103 0.136251 +EDGE3 1875 1924 -5.60889 -6.40082 -3.28398 0.0068033 -0.0114332 -0.117295 +EDGE3 1876 1926 -5.29092 0.00384964 -3.35334 0.00352746 -0.00260534 -0.00171604 +EDGE3 1875 1926 -5.81785 6.36343 -3.43491 0.0104818 0.00745003 0.127596 +EDGE3 1877 1927 -5.31817 -0.00701177 -3.34764 -0.00654147 0.00101238 -0.00180559 +EDGE3 1876 1925 -5.61908 -6.38953 -3.2925 0.0079494 -0.00333023 -0.134583 +EDGE3 1876 1927 -5.80711 6.35809 -3.41266 0.00314591 0.00213415 0.124744 +EDGE3 1877 1926 -5.60443 -6.36522 -3.28619 0.000509374 -0.0141503 -0.125705 +EDGE3 1878 1928 -5.32146 0.00114493 -3.36044 0.00471224 -0.000932439 -0.00253407 +EDGE3 1877 1928 -5.81012 6.34433 -3.41912 0.000429312 -0.00331361 0.131045 +EDGE3 1878 1927 -5.62879 -6.33611 -3.2787 0.00194759 -0.00608617 -0.124952 +EDGE3 1879 1929 -5.30061 0.00434193 -3.34086 -0.00311293 0.00926704 0.00398527 +EDGE3 1878 1929 -5.83173 6.31906 -3.38828 0.00133753 0.00265985 0.119534 +EDGE3 1879 1928 -5.6017 -6.34623 -3.26147 -0.00601599 -0.0056844 -0.122325 +EDGE3 1880 1930 -5.33595 0.00510348 -3.33204 -0.00615293 -0.00363009 -0.00124265 +EDGE3 1879 1930 -5.8464 6.3125 -3.39884 -0.00748567 -0.00479524 0.122864 +EDGE3 1880 1929 -5.6204 -6.322 -3.29004 -0.00737452 0.000543084 -0.127591 +EDGE3 1881 1931 -5.32376 0.0188107 -3.32871 0.00226888 0.00114298 -0.000860421 +EDGE3 1880 1931 -5.84215 6.28429 -3.38561 -0.00635031 0.000640743 0.123886 +EDGE3 1881 1930 -5.60928 -6.31502 -3.26762 0.00474297 0.00362334 -0.12711 +EDGE3 1882 1932 -5.34941 -0.0145751 -3.32067 -0.00551713 -0.00506063 -0.00713923 +EDGE3 1881 1932 -5.83336 6.28296 -3.40341 0.00217309 -0.0117383 0.118477 +EDGE3 1882 1931 -5.62262 -6.31396 -3.26203 0.000644942 -0.000389022 -0.116143 +EDGE3 1883 1933 -5.33678 -0.00176256 -3.30723 -0.008553 -0.000814676 -0.00253509 +EDGE3 1882 1933 -5.83333 6.27239 -3.37095 -0.00195533 0.0110726 0.121232 +EDGE3 1884 1934 -5.33191 -0.0135106 -3.29591 -0.000979606 -0.0083674 -0.000716074 +EDGE3 1883 1932 -5.62804 -6.27797 -3.25187 0.00240717 -0.00374037 -0.116508 +EDGE3 1883 1934 -5.85036 6.24668 -3.38002 0.00563628 0.00751899 0.124951 +EDGE3 1884 1933 -5.63223 -6.27262 -3.21787 -0.00632356 0.00639955 -0.121825 +EDGE3 1885 1935 -5.3417 0.000777446 -3.30502 -0.00283064 -0.00411176 0.00309049 +EDGE3 1884 1935 -5.83889 6.2415 -3.36858 0.00738546 0.00258514 0.121209 +EDGE3 1885 1934 -5.64838 -6.27245 -3.25528 0.000167137 0.00424364 -0.132344 +EDGE3 1886 1936 -5.34165 0.0129769 -3.28782 -0.00222081 -0.000199987 0.00869588 +EDGE3 1885 1936 -5.8471 6.24331 -3.35897 0.00645663 -0.000276771 0.126907 +EDGE3 1886 1935 -5.63422 -6.24597 -3.23288 -0.00164495 -0.000206825 -0.124356 +EDGE3 1887 1937 -5.3496 -0.00336737 -3.29753 0.00189651 -0.00379822 -0.00169804 +EDGE3 1886 1937 -5.84256 6.22436 -3.35095 0.00211102 -0.00436196 0.121722 +EDGE3 1888 1938 -5.35685 0.00872093 -3.28596 0.00318347 -0.0013277 0.00622994 +EDGE3 1887 1936 -5.6312 -6.23387 -3.21444 0.00798513 -0.000410798 -0.130586 +EDGE3 1887 1938 -5.85449 6.20253 -3.34263 -0.00654313 -0.00814656 0.128688 +EDGE3 1888 1937 -5.64048 -6.22007 -3.22368 0.00135903 -0.00901814 -0.118991 +EDGE3 1889 1939 -5.34808 0.01118 -3.28136 -0.00532863 0.00238961 -0.000422936 +EDGE3 1888 1939 -5.85263 6.19161 -3.33252 -0.0055176 0.00221429 0.12737 +EDGE3 1889 1938 -5.64984 -6.19307 -3.21376 0.00183303 -0.00254312 -0.126056 +EDGE3 1890 1940 -5.36943 -0.0179558 -3.2711 0.00212436 0.000554887 -0.00313354 +EDGE3 1889 1940 -5.86675 6.17547 -3.33117 0.00190882 -0.0012467 0.124803 +EDGE3 1890 1939 -5.65898 -6.1785 -3.18345 -0.000415469 0.00603812 -0.122632 +EDGE3 1891 1941 -5.36203 0.00421967 -3.26074 0.00305489 -0.00262201 -0.00121929 +EDGE3 1890 1941 -5.85405 6.15938 -3.31977 0.00346342 -0.00107154 0.125635 +EDGE3 1891 1940 -5.63669 -6.19038 -3.1908 0.00373237 0.0015159 -0.12711 +EDGE3 1892 1942 -5.36357 0.00160392 -3.27006 -0.00708724 0.00393476 -0.00414916 +EDGE3 1891 1942 -5.87015 6.16503 -3.30907 0.0018498 0.000423082 0.127875 +EDGE3 1892 1941 -5.6386 -6.1559 -3.18604 0.00219947 -0.00485354 -0.119984 +EDGE3 1893 1943 -5.35773 -0.0038269 -3.25575 -0.00235348 0.000834121 0.00152251 +EDGE3 1892 1943 -5.87439 6.13316 -3.30729 -0.000247705 -0.000988456 0.125336 +EDGE3 1893 1942 -5.64967 -6.16036 -3.19567 0.00188488 0.000852968 -0.125223 +EDGE3 1894 1944 -5.37145 -0.0092327 -3.24162 0.000189917 0.00433797 0.00365577 +EDGE3 1893 1944 -5.8763 6.11825 -3.30746 -0.000117102 0.00196663 0.130015 +EDGE3 1894 1943 -5.66446 -6.14086 -3.16173 -0.00212123 0.000973495 -0.129907 +EDGE3 1895 1945 -5.38967 0.0037349 -3.22818 0.0116071 0.000677882 -0.00259782 +EDGE3 1894 1945 -5.88192 6.11668 -3.28301 -0.00144359 0.00372206 0.121672 +EDGE3 1895 1944 -5.6635 -6.10784 -3.16296 0.00731365 0.0017216 -0.12533 +EDGE3 1896 1946 -5.39573 0.00657945 -3.22439 0.000317883 -0.00183642 0.000368526 +EDGE3 1895 1946 -5.86667 6.09899 -3.29684 -0.000263134 -0.0015017 0.12179 +EDGE3 1896 1945 -5.67412 -6.08366 -3.16545 0.0052457 0.00250773 -0.121947 +EDGE3 1897 1947 -5.39357 0.00283829 -3.24237 -0.00228744 0.000173388 -0.00512873 +EDGE3 1896 1947 -5.87511 6.08954 -3.29632 0.00478532 0.00304064 0.135981 +EDGE3 1897 1946 -5.65847 -6.08136 -3.16787 0.000409056 0.00413764 -0.125668 +EDGE3 1898 1948 -5.3819 0.00821504 -3.18909 -0.000252837 0.00906003 -0.000641906 +EDGE3 1897 1948 -5.88923 6.05664 -3.2788 -0.00104689 -0.0095697 0.12056 +EDGE3 1898 1947 -5.65132 -6.06553 -3.15595 -0.0055003 -0.000760796 -0.12838 +EDGE3 1898 1949 -5.8924 6.0315 -3.28629 0.00283168 0.00015285 0.127207 +EDGE3 1899 1949 -5.41409 0.004899 -3.18113 -0.0128026 0.00242451 -0.00301246 +EDGE3 1900 1950 -5.40555 0.00449769 -3.19031 -0.000773293 0.0085803 -0.000855349 +EDGE3 1899 1948 -5.69256 -6.07514 -3.13826 -0.00385793 4.38254e-06 -0.126257 +EDGE3 1899 1950 -5.88508 6.03227 -3.26025 0.0021558 -0.000973312 0.122006 +EDGE3 1900 1949 -5.66991 -6.05268 -3.13665 0.000980291 0.000524749 -0.115893 +EDGE3 1901 1951 -5.41686 -0.00564788 -3.20732 -0.00363837 -0.00610922 -0.000700343 +EDGE3 1900 1951 -5.89034 6.02068 -3.25921 0.00998144 0.0066982 0.119863 +EDGE3 1901 1950 -5.68476 -6.04687 -3.11809 -0.00232885 -0.00152281 -0.118596 +EDGE3 1902 1952 -5.43038 -0.00833196 -3.19583 -0.00703495 -0.00572986 0.00186532 +EDGE3 1901 1952 -5.88789 6.01479 -3.23085 -0.00535047 -0.0103298 0.121357 +EDGE3 1902 1951 -5.6708 -6.03229 -3.11827 -0.000596574 -0.00443279 -0.134258 +EDGE3 1903 1953 -5.42626 0.00738079 -3.17987 0.00709033 0.00365837 -0.00206977 +EDGE3 1902 1953 -5.89223 5.98688 -3.25339 -0.00229023 0.00156955 0.128186 +EDGE3 1903 1952 -5.68034 -6.02174 -3.1325 0.00753471 -0.000517762 -0.126598 +EDGE3 1904 1954 -5.42408 0.0199544 -3.16109 -0.00149456 -0.00244919 0.00214676 +EDGE3 1903 1954 -5.90704 5.9817 -3.2394 -0.0106598 0.00431322 0.125747 +EDGE3 1904 1953 -5.70119 -5.98925 -3.11563 -0.00611544 -0.0017025 -0.127205 +EDGE3 1905 1955 -5.4262 -0.00225865 -3.17554 -0.00220082 0.00670061 -0.00840319 +EDGE3 1904 1955 -5.9073 5.96329 -3.24276 -0.00635743 -0.00742364 0.121181 +EDGE3 1905 1954 -5.67821 -5.98115 -3.11112 -0.00418176 0.00724216 -0.123352 +EDGE3 1906 1956 -5.43128 0.00871152 -3.15222 -0.0045412 -0.0023397 0.00332764 +EDGE3 1905 1956 -5.90631 5.94665 -3.23051 -0.00299968 -0.00395425 0.123487 +EDGE3 1906 1955 -5.69797 -5.96699 -3.09568 -0.00650241 -0.00756336 -0.131506 +EDGE3 1907 1957 -5.41931 -0.00557384 -3.1389 -0.0127214 0.00485097 -0.00732458 +EDGE3 1906 1957 -5.91347 5.95343 -3.22571 0.00138954 -0.00508784 0.122327 +EDGE3 1907 1956 -5.69957 -5.9499 -3.07238 0.0050695 -0.0027827 -0.134899 +EDGE3 1908 1958 -5.45633 0.0119737 -3.16457 0.0181138 0.00275565 -0.0032894 +EDGE3 1907 1958 -5.91871 5.92302 -3.20011 -0.00220222 -0.000995355 0.128028 +EDGE3 1908 1957 -5.70374 -5.93753 -3.09047 0.00433953 0.00191999 -0.112961 +EDGE3 1909 1959 -5.43794 0.00255173 -3.12671 0.00169914 0.00327618 0.00143381 +EDGE3 1908 1959 -5.91487 5.90552 -3.21657 -0.0019754 0.00129584 0.129298 +EDGE3 1909 1958 -5.70787 -5.93481 -3.07223 0.00896748 -0.00820647 -0.13072 +EDGE3 1910 1960 -5.45253 0.00299423 -3.12474 0.00722001 0.00176273 -0.00083542 +EDGE3 1909 1960 -5.92128 5.90153 -3.21425 0.00767992 -0.00274562 0.128302 +EDGE3 1910 1959 -5.70742 -5.91613 -3.06455 0.00616479 -0.00631238 -0.12793 +EDGE3 1911 1961 -5.44458 -0.00107663 -3.142 -0.00786885 0.00688707 0.00658756 +EDGE3 1910 1961 -5.93376 5.88349 -3.17342 0.0111102 0.00311372 0.12621 +EDGE3 1911 1960 -5.72226 -5.90948 -3.06114 0.0110804 -0.000140461 -0.123374 +EDGE3 1912 1962 -5.45094 -0.00970238 -3.12651 -0.011332 -0.00322675 -0.00543351 +EDGE3 1911 1962 -5.90333 5.87903 -3.17783 0.00807875 0.0014455 0.133496 +EDGE3 1912 1961 -5.7152 -5.90113 -3.05341 -0.000771196 0.00342868 -0.127841 +EDGE3 1913 1963 -5.45458 -0.0108798 -3.11279 -0.00207864 0.0010523 0.00111623 +EDGE3 1912 1963 -5.92005 5.85179 -3.18131 -0.000944133 -0.000473549 0.1245 +EDGE3 1913 1962 -5.71749 -5.87549 -3.04925 0.0152772 -0.00274506 -0.126617 +EDGE3 1914 1964 -5.45486 0.0139235 -3.09703 0.00791159 -0.00682328 -0.00499117 +EDGE3 1913 1964 -5.92801 5.84591 -3.16384 -0.0028415 0.00221034 0.122493 +EDGE3 1914 1963 -5.7099 -5.86629 -3.03149 -0.00664256 -0.00755185 -0.124237 +EDGE3 1915 1965 -5.45465 -0.00518927 -3.09157 0.00402723 0.00513008 0.000818003 +EDGE3 1914 1965 -5.9486 5.81957 -3.16872 0.00816466 -0.000146956 0.12543 +EDGE3 1915 1964 -5.73817 -5.84353 -3.04801 0.00321765 0.00421407 -0.126767 +EDGE3 1916 1966 -5.46059 -0.00275226 -3.07958 -0.0134542 0.00801459 -0.0060315 +EDGE3 1915 1966 -5.93285 5.83272 -3.14942 0.0107932 0.00480811 0.121129 +EDGE3 1916 1965 -5.7283 -5.83024 -3.0416 -0.00678177 0.000375403 -0.123407 +EDGE3 1917 1967 -5.47525 0.00102524 -3.08743 0.00147318 8.50273e-05 0.00990075 +EDGE3 1916 1967 -5.95191 5.80714 -3.15122 -0.00863514 0.00559517 0.138128 +EDGE3 1917 1966 -5.73631 -5.82201 -3.01779 0.00481043 -0.0105813 -0.138089 +EDGE3 1918 1968 -5.46687 0.0129975 -3.0764 0.00112787 0.00416425 -0.00597787 +EDGE3 1917 1968 -5.93639 5.79409 -3.12968 0.000345783 0.0037258 0.12408 +EDGE3 1918 1967 -5.7103 -5.81196 -3.0143 0.0013524 -0.00193262 -0.133577 +EDGE3 1919 1969 -5.47851 0.00531679 -3.08727 -0.00115575 0.00299742 -0.00741325 +EDGE3 1918 1969 -5.94807 5.79671 -3.12893 0.00132322 0.00553222 0.119934 +EDGE3 1919 1968 -5.75164 -5.78267 -3.00684 -0.00500797 0.00385851 -0.128026 +EDGE3 1920 1970 -5.51027 0.00290657 -3.06881 0.00177696 -0.00481297 -0.00188406 +EDGE3 1919 1970 -5.95473 5.75885 -3.10824 -0.00776289 0.00768938 0.130911 +EDGE3 1920 1969 -5.74765 -5.78063 -3.00592 0.000494625 0.00218535 -0.118755 +EDGE3 1921 1971 -5.48623 0.0127142 -3.05473 -0.000712989 0.00595857 0.00520224 +EDGE3 1920 1971 -5.96173 5.74132 -3.12812 0.00672913 0.00156664 0.126894 +EDGE3 1921 1970 -5.74785 -5.75423 -2.9902 -0.00442636 0.00591841 -0.124254 +EDGE3 1922 1972 -5.47486 -0.00957271 -3.03015 0.00575038 0.00956175 0.00901711 +EDGE3 1921 1972 -5.96861 5.7276 -3.10775 0.00677739 -0.00107328 0.119132 +EDGE3 1922 1971 -5.75517 -5.75839 -2.99568 -0.00219476 0.00199698 -0.127549 +EDGE3 1923 1973 -5.505 -0.00324469 -3.04968 0.00360502 -0.00987679 -0.00702848 +EDGE3 1922 1973 -5.96631 5.73624 -3.10643 -0.0020861 -0.00207337 0.132013 +EDGE3 1923 1972 -5.74023 -5.71548 -2.99698 0.00335579 0.00137074 -0.124558 +EDGE3 1924 1974 -5.51265 0.00504605 -3.03273 0.00297301 0.000267571 -0.00238564 +EDGE3 1923 1974 -5.96351 5.71065 -3.11396 0.00538354 -0.00737199 0.124121 +EDGE3 1924 1973 -5.7536 -5.71326 -2.96847 0.00353678 0.0102409 -0.129999 +EDGE3 1925 1975 -5.49935 0.00976312 -3.04737 -3.64189e-05 0.00117017 -0.000540121 +EDGE3 1924 1975 -5.97896 5.67893 -3.09727 -0.0037038 0.00462302 0.124485 +EDGE3 1925 1974 -5.7542 -5.70214 -2.96842 0.0102969 0.00325885 -0.125939 +EDGE3 1926 1976 -5.51296 0.0058147 -3.02713 0.000238775 -0.000365179 -0.00342774 +EDGE3 1925 1976 -5.96709 5.67253 -3.08881 -0.00493901 -0.0139938 0.129311 +EDGE3 1926 1975 -5.73122 -5.6896 -2.97701 0.00409519 0.000105824 -0.134319 +EDGE3 1927 1977 -5.53409 0.00925834 -3.01108 -0.00234978 -0.00809264 -0.00670391 +EDGE3 1926 1977 -5.98768 5.66112 -3.07957 0.00207868 -0.00428169 0.118597 +EDGE3 1927 1976 -5.76025 -5.66852 -2.9705 0.00425601 -0.00519793 -0.124708 +EDGE3 1928 1978 -5.49545 -0.0113442 -2.97665 0.00347308 0.000693838 -0.00418668 +EDGE3 1927 1978 -5.95456 5.6351 -3.06152 -0.00627341 0.000832713 0.130825 +EDGE3 1928 1977 -5.74925 -5.6621 -2.93415 -0.00152813 -0.00691283 -0.122927 +EDGE3 1929 1979 -5.52943 0.0037856 -3.00264 -0.0031097 -0.00164873 -0.000470783 +EDGE3 1928 1979 -5.99905 5.64829 -3.0759 -0.0013635 0.00264902 0.112056 +EDGE3 1929 1978 -5.7643 -5.63266 -2.94203 0.00087833 0.00022573 -0.128858 +EDGE3 1930 1980 -5.52834 0.00646121 -2.99251 -0.00105196 -0.00491989 0.00375517 +EDGE3 1929 1980 -5.98436 5.61263 -3.06471 -0.00595355 -0.00497491 0.133621 +EDGE3 1930 1979 -5.77351 -5.65358 -2.94399 0.011942 0.00784394 -0.12568 +EDGE3 1931 1981 -5.53466 0.0108668 -2.98951 0.00335638 -0.00151867 0.00626584 +EDGE3 1930 1981 -5.97143 5.61538 -3.05299 -0.00268779 0.00806028 0.12164 +EDGE3 1931 1980 -5.76763 -5.60878 -2.92867 -0.000692859 0.00759049 -0.130414 +EDGE3 1932 1982 -5.54389 0.0158913 -2.97691 -0.00275903 -0.0020458 0.00791519 +EDGE3 1931 1982 -5.98414 5.61229 -3.04283 -0.00778799 0.0019244 0.126726 +EDGE3 1932 1981 -5.7656 -5.60498 -2.90806 -0.00058178 -7.96522e-05 -0.117146 +EDGE3 1933 1983 -5.52911 0.00249384 -2.9692 0.00255532 0.00426569 0.0105989 +EDGE3 1932 1983 -5.99046 5.57183 -3.04143 0.0114317 0.00166349 0.12025 +EDGE3 1933 1982 -5.78678 -5.60859 -2.91803 -0.00619448 0.000866437 -0.118936 +EDGE3 1934 1984 -5.5434 0.0080529 -2.96469 -0.00153978 0.00478685 -0.00970984 +EDGE3 1933 1984 -6.0028 5.56902 -3.02333 -0.0102068 0.00696758 0.12744 +EDGE3 1934 1983 -5.77199 -5.58286 -2.91125 -0.00257946 0.00054549 -0.126268 +EDGE3 1935 1985 -5.55857 -0.00577557 -2.96556 0.00483907 -0.00353712 -0.000410494 +EDGE3 1934 1985 -6.00934 5.53947 -3.01819 -0.00800605 0.00262047 0.128033 +EDGE3 1935 1984 -5.79441 -5.57675 -2.90252 -0.00133558 -0.000237224 -0.131593 +EDGE3 1936 1986 -5.54686 0.0023144 -2.94801 0.00597871 3.93326e-05 0.00112469 +EDGE3 1935 1986 -6.0051 5.54155 -3.00839 -0.00116882 -0.00665964 0.130864 +EDGE3 1936 1985 -5.78159 -5.54734 -2.89328 0.00478137 -0.00117958 -0.130937 +EDGE3 1937 1987 -5.54665 -0.011941 -2.92994 -0.00724633 -0.00108401 -0.0052027 +EDGE3 1936 1987 -6.01735 5.52662 -3.00387 0.00842214 0.00210134 0.116253 +EDGE3 1937 1986 -5.77099 -5.53528 -2.8886 0.000346885 0.00526133 -0.124321 +EDGE3 1938 1988 -5.56683 -0.00291494 -2.9358 -0.000712875 -0.00129538 -0.000686411 +EDGE3 1937 1988 -6.01441 5.51297 -3.00172 0.00520635 0.00497543 0.129399 +EDGE3 1938 1987 -5.79441 -5.50623 -2.88102 -0.0047978 -0.00417152 -0.134286 +EDGE3 1939 1989 -5.55124 -0.0158818 -2.93374 0.000801164 -0.00105943 -0.00579888 +EDGE3 1938 1989 -6.0063 5.50203 -2.98735 -0.0063503 0.00427412 0.114408 +EDGE3 1939 1988 -5.79818 -5.52221 -2.88128 0.00701604 -0.00536374 -0.112867 +EDGE3 1940 1990 -5.57132 0.0116076 -2.92598 0.00380591 -0.00131419 0.00322591 +EDGE3 1939 1990 -6.00843 5.47458 -2.98888 -0.000492734 0.00235777 0.126978 +EDGE3 1940 1989 -5.78457 -5.49092 -2.88974 0.000228448 0.00680623 -0.126548 +EDGE3 1941 1991 -5.56991 -0.00558997 -2.89809 0.00242658 0.00931747 0.00204082 +EDGE3 1940 1991 -5.99684 5.45655 -2.98526 -0.00137462 -0.00527492 0.131652 +EDGE3 1941 1990 -5.79629 -5.47263 -2.85105 0.00595228 -0.00142078 -0.12293 +EDGE3 1942 1992 -5.59152 -0.0212325 -2.90127 -0.00540962 0.00597246 0.00312764 +EDGE3 1941 1992 -6.02367 5.44705 -2.98275 0.00135644 0.00170721 0.122284 +EDGE3 1942 1991 -5.79717 -5.44616 -2.8524 0.00486424 0.00873439 -0.1335 +EDGE3 1943 1993 -5.5772 -0.010063 -2.88379 -0.00103114 -0.00478939 -0.00587242 +EDGE3 1942 1993 -6.01119 5.43886 -2.97587 -0.00725017 -0.00319134 0.126522 +EDGE3 1943 1992 -5.79927 -5.47078 -2.83014 0.00352528 0.00413822 -0.125509 +EDGE3 1944 1994 -5.57365 0.000848455 -2.88549 -0.001073 0.00572914 -0.0008407 +EDGE3 1943 1994 -6.02653 5.41374 -2.9452 -0.000383602 -0.00795551 0.12434 +EDGE3 1944 1993 -5.80088 -5.41726 -2.85127 0.0114619 -0.00490873 -0.125047 +EDGE3 1945 1995 -5.58552 0.00101109 -2.90024 -0.00814831 0.0039062 -0.00378408 +EDGE3 1944 1995 -6.01961 5.40448 -2.95355 0.00527659 0.00264058 0.13221 +EDGE3 1945 1994 -5.7977 -5.4279 -2.85378 -0.0101286 0.00276164 -0.123742 +EDGE3 1946 1996 -5.57451 -0.00145722 -2.8682 0.00169367 -0.0146546 -0.00380074 +EDGE3 1945 1996 -6.03607 5.38742 -2.9358 0.00149363 -0.00246134 0.129947 +EDGE3 1946 1995 -5.80325 -5.41852 -2.81974 0.0107271 -0.00925749 -0.122772 +EDGE3 1947 1997 -5.59283 -0.0117238 -2.87841 -0.000609928 -0.00221692 0.00111616 +EDGE3 1946 1997 -6.03117 5.36613 -2.93584 0.00889473 0.00301499 0.122241 +EDGE3 1947 1996 -5.80672 -5.37803 -2.83131 -0.0062877 -0.0032303 -0.126607 +EDGE3 1948 1998 -5.58457 -0.00119354 -2.87158 -0.00559931 -0.00844645 -0.00423722 +EDGE3 1947 1998 -6.03402 5.37986 -2.93836 -0.00682208 -0.00144857 0.11827 +EDGE3 1948 1997 -5.82088 -5.38313 -2.80311 0.000691188 0.00215266 -0.122895 +EDGE3 1949 1999 -5.59071 0.00667578 -2.86478 8.55629e-05 0.00595285 -0.0049736 +EDGE3 1948 1999 -6.02021 5.33921 -2.92573 -0.00142202 -0.00573423 0.127055 +EDGE3 1949 1998 -5.81159 -5.35273 -2.80336 0.000684082 0.0035971 -0.121843 +EDGE3 1950 2000 -5.59575 -0.00419579 -2.86647 -0.00277985 0.0104589 -0.00212302 +EDGE3 1949 2000 -6.0742 5.32421 -2.89755 0.0123511 0.00706643 0.125618 +EDGE3 1950 1999 -5.81671 -5.34966 -2.79616 0.00230823 -0.00228506 -0.126171 +EDGE3 1951 2001 -5.60296 -0.00817804 -2.8594 0.000276944 -0.000886763 0.0110153 +EDGE3 1950 2001 -6.05539 5.32921 -2.90149 -0.00189942 -0.00572901 0.119612 +EDGE3 1951 2000 -5.81911 -5.34241 -2.79742 -0.000302118 0.00617901 -0.122047 +EDGE3 1952 2002 -5.61285 0.00273397 -2.85226 -0.00131322 0.00654866 0.00451317 +EDGE3 1951 2002 -6.04454 5.31233 -2.90912 -0.00676358 -0.00176541 0.123367 +EDGE3 1952 2001 -5.81987 -5.29939 -2.7974 0.00237527 0.0029512 -0.127436 +EDGE3 1953 2003 -5.61281 0.0173624 -2.83283 -0.00821729 0.00231243 -0.00198992 +EDGE3 1952 2003 -6.0442 5.28225 -2.88559 0.00479039 -0.00290219 0.12475 +EDGE3 1953 2002 -5.84024 -5.31216 -2.76189 0.00841298 -0.00132699 -0.12934 +EDGE3 1954 2004 -5.60898 -0.00274502 -2.8168 -0.00367854 -0.00114419 0.00228453 +EDGE3 1953 2004 -6.04515 5.27668 -2.88639 0.00377854 -0.00605849 0.118488 +EDGE3 1954 2003 -5.81976 -5.29148 -2.78273 0.00333521 -0.000956545 -0.131773 +EDGE3 1955 2005 -5.61379 0.00407275 -2.82358 -0.00383064 0.00663643 -0.00336601 +EDGE3 1954 2005 -6.06558 5.26941 -2.8788 0.00720361 -0.00582111 0.123006 +EDGE3 1955 2004 -5.82779 -5.2801 -2.76155 -0.000260862 0.00568802 -0.137603 +EDGE3 1956 2006 -5.6295 -0.00297196 -2.80581 -0.00538486 0.00249065 0.00309432 +EDGE3 1955 2006 -6.0489 5.24933 -2.85136 0.00451571 -0.00804957 0.120522 +EDGE3 1956 2005 -5.83137 -5.26182 -2.75858 -0.00344215 -0.00685491 -0.121845 +EDGE3 1957 2007 -5.61548 0.00536062 -2.80103 0.00297612 -0.00503937 0.00470988 +EDGE3 1956 2007 -6.06453 5.24294 -2.8512 -0.000956403 -0.00108455 0.131191 +EDGE3 1957 2006 -5.85078 -5.26019 -2.75804 -0.00825878 -0.00388195 -0.131439 +EDGE3 1958 2008 -5.62227 0.0155275 -2.79241 0.000697699 -0.000490867 0.00176388 +EDGE3 1957 2008 -6.05818 5.22696 -2.86052 0.00365555 -0.000990128 0.124371 +EDGE3 1958 2007 -5.83188 -5.21839 -2.74016 -0.00317899 0.00187072 -0.12843 +EDGE3 1959 2009 -5.6453 0.00740263 -2.78745 0.00713127 0.00674665 0.00755264 +EDGE3 1958 2009 -6.06069 5.20371 -2.84382 0.00427806 -0.00211225 0.120322 +EDGE3 1959 2008 -5.82827 -5.22266 -2.74746 0.00499369 0.00577802 -0.115161 +EDGE3 1960 2010 -5.64157 0.0181014 -2.78037 -0.00184412 -0.00143602 -0.00150876 +EDGE3 1959 2010 -6.07768 5.19253 -2.83891 -0.00825649 -0.00219315 0.130249 +EDGE3 1960 2009 -5.84075 -5.21011 -2.71681 0.00608648 0.00230065 -0.13551 +EDGE3 1961 2011 -5.62202 0.00423525 -2.7681 0.00262469 -0.00404198 0.0140314 +EDGE3 1960 2011 -6.07257 5.18361 -2.82335 0.00486628 0.0103289 0.123439 +EDGE3 1961 2010 -5.85159 -5.20161 -2.70799 0.00840214 2.97394e-05 -0.139751 +EDGE3 1962 2012 -5.63987 0.00177652 -2.77025 0.00348143 -0.00461863 0.00311556 +EDGE3 1961 2012 -6.0871 5.15877 -2.80454 -0.000799931 0.00151283 0.128089 +EDGE3 1962 2011 -5.84812 -5.17487 -2.72569 -0.00881248 -0.0052736 -0.120447 +EDGE3 1963 2013 -5.63908 0.00053293 -2.75841 0.000588165 0.00402461 0.00584897 +EDGE3 1962 2013 -6.0823 5.15393 -2.81107 -0.00543668 0.00423426 0.127617 +EDGE3 1963 2012 -5.85326 -5.15448 -2.6814 0.00442265 -0.00197515 -0.129062 +EDGE3 1964 2014 -5.65934 0.00807446 -2.75546 -0.00137949 0.00875705 0.00398367 +EDGE3 1963 2014 -6.08205 5.12148 -2.8239 -0.000365711 -0.000260473 0.136815 +EDGE3 1965 2015 -5.65678 -0.0146728 -2.73639 -0.00254799 -0.0048732 0.00479912 +EDGE3 1964 2013 -5.85473 -5.14415 -2.70807 0.00722985 0.00339841 -0.123566 +EDGE3 1964 2015 -6.07785 5.12658 -2.79758 -0.00139057 -0.0034229 0.12108 +EDGE3 1965 2014 -5.85575 -5.12004 -2.68467 -0.0164985 0.0066618 -0.1217 +EDGE3 1966 2016 -5.65072 0.0169404 -2.72819 -0.00259626 0.00257382 0.00128452 +EDGE3 1965 2016 -6.08283 5.10486 -2.80138 -8.07433e-05 -0.00398571 0.128943 +EDGE3 1966 2015 -5.85844 -5.11895 -2.70445 0.00431656 0.00286175 -0.137684 +EDGE3 1967 2017 -5.64567 -0.00431639 -2.72747 -0.00299496 0.0081383 -0.00585009 +EDGE3 1966 2017 -6.08822 5.07109 -2.79196 0.00349544 0.00207464 0.134647 +EDGE3 1967 2016 -5.86688 -5.11326 -2.6985 0.00429477 -0.00591933 -0.128054 +EDGE3 1968 2018 -5.65801 0.0206301 -2.73953 -0.00527999 -0.000269626 -0.00189452 +EDGE3 1967 2018 -6.10321 5.06804 -2.78564 -0.000658319 0.00024317 0.123474 +EDGE3 1968 2017 -5.84895 -5.06092 -2.67389 0.00612391 0.000819214 -0.112843 +EDGE3 1969 2019 -5.65846 0.00559005 -2.70045 0.000417581 0.00408351 -0.0006966 +EDGE3 1968 2019 -6.08899 5.06229 -2.78422 0.00282868 0.00121901 0.130076 +EDGE3 1969 2018 -5.86343 -5.06675 -2.6634 -0.00217478 0.0044978 -0.121873 +EDGE3 1970 2020 -5.67546 0.0152022 -2.71622 -0.00808119 -0.00293761 0.00241239 +EDGE3 1969 2020 -6.10034 5.03042 -2.77528 0.00139948 0.0018802 0.125519 +EDGE3 1970 2019 -5.88227 -5.06667 -2.66501 0.00243645 -0.0024782 -0.124427 +EDGE3 1971 2021 -5.66792 -0.00371838 -2.70377 -0.00293968 -0.000444173 0.00155232 +EDGE3 1970 2021 -6.09984 5.04601 -2.76069 -0.00472765 0.00851885 0.119881 +EDGE3 1971 2020 -5.8707 -5.05888 -2.64735 -0.0049322 0.00401403 -0.123807 +EDGE3 1972 2022 -5.66352 -0.00179885 -2.70368 0.00346185 -9.73194e-05 -0.00571407 +EDGE3 1971 2022 -6.09477 5.03497 -2.76518 0.00128165 -0.00177571 0.118167 +EDGE3 1972 2021 -5.87806 -5.05371 -2.62816 0.00381303 0.00369958 -0.118824 +EDGE3 1973 2023 -5.67573 -0.0167079 -2.70349 0.00113967 0.00291716 -0.00290714 +EDGE3 1972 2023 -6.11164 5.01021 -2.7475 -0.00477598 -0.00138039 0.12133 +EDGE3 1973 2022 -5.87426 -5.02266 -2.65041 0.00765128 0.00101388 -0.129682 +EDGE3 1974 2024 -5.67797 -0.00440572 -2.68056 0.0069377 0.00706319 -0.00331808 +EDGE3 1973 2024 -6.11386 4.98268 -2.72325 0.00356497 0.00103656 0.134316 +EDGE3 1974 2023 -5.86791 -5.00645 -2.63004 0.00499318 0.00397367 -0.123661 +EDGE3 1975 2025 -5.69194 -0.00939471 -2.66728 -0.00371873 0.00491463 -0.00290824 +EDGE3 1974 2025 -6.10495 4.98567 -2.72957 -0.00874588 0.00174585 0.127264 +EDGE3 1975 2024 -5.87097 -4.97912 -2.62542 0.00586282 0.00449985 -0.122856 +EDGE3 1976 2026 -5.69275 0.00175766 -2.64297 -0.00659111 -0.00304246 -0.00342775 +EDGE3 1975 2026 -6.11354 4.98457 -2.69983 -0.011482 -0.00538869 0.128734 +EDGE3 1976 2025 -5.88145 -4.99451 -2.6125 -0.00802617 -0.000498878 -0.126156 +EDGE3 1977 2027 -5.68552 -0.00259463 -2.65417 -0.000895117 -0.00917468 0.00466201 +EDGE3 1976 2027 -6.10601 4.94769 -2.71653 0.000402919 0.00629842 0.12919 +EDGE3 1977 2026 -5.88762 -4.97776 -2.60792 -0.00789496 0.00442893 -0.127865 +EDGE3 1978 2028 -5.68832 -0.0120616 -2.66402 -0.00253004 0.000279988 0.00390043 +EDGE3 1977 2028 -6.12622 4.93498 -2.71018 0.00480295 0.00156111 0.126563 +EDGE3 1978 2027 -5.87971 -4.97422 -2.60538 -0.00113797 0.00451869 -0.122012 +EDGE3 1979 2029 -5.68937 -0.00483494 -2.65422 0.0019051 0.00022987 0.000628138 +EDGE3 1978 2029 -6.0981 4.92902 -2.71323 0.00349942 -0.00319367 0.122731 +EDGE3 1979 2028 -5.89997 -4.95356 -2.60002 0.00104094 -0.0029203 -0.122893 +EDGE3 1980 2030 -5.70644 0.00981718 -2.63796 -0.000810061 0.000815083 0.00394178 +EDGE3 1979 2030 -6.11012 4.91604 -2.68577 0.000373158 -0.00146418 0.12864 +EDGE3 1980 2029 -5.89608 -4.91491 -2.58249 0.00716838 0.000627993 -0.126979 +EDGE3 1981 2031 -5.70029 0.0103036 -2.61469 -0.00812967 -0.0105987 0.000201646 +EDGE3 1980 2031 -6.12635 4.89014 -2.69433 0.00496996 0.00453455 0.129435 +EDGE3 1981 2030 -5.90683 -4.90595 -2.58374 -0.00883008 0.00295164 -0.128402 +EDGE3 1982 2032 -5.71383 -0.00508804 -2.61098 -0.00172683 -0.00616701 -0.00188828 +EDGE3 1981 2032 -6.12548 4.87477 -2.66559 -0.0019092 -0.0121391 0.123419 +EDGE3 1982 2031 -5.87399 -4.87441 -2.56641 0.000194926 -0.00365293 -0.12622 +EDGE3 1983 2033 -5.70435 -4.68006e-05 -2.61322 -0.00119224 -0.00427238 -0.000459402 +EDGE3 1982 2033 -6.14499 4.86172 -2.69185 0.00258962 0.00167336 0.119678 +EDGE3 1983 2032 -5.88933 -4.87997 -2.57352 0.0136186 -0.00053469 -0.113947 +EDGE3 1984 2034 -5.70866 0.00740743 -2.6169 0.0070403 -0.00740498 -0.00426495 +EDGE3 1983 2034 -6.12992 4.8486 -2.67041 0.000613673 -0.00484777 0.123082 +EDGE3 1984 2033 -5.89246 -4.8649 -2.55875 -0.00150449 -0.000601549 -0.118692 +EDGE3 1985 2035 -5.72381 0.00196836 -2.6104 0.00474132 0.00369973 -0.00928139 +EDGE3 1984 2035 -6.14261 4.82665 -2.65943 -0.00386675 0.000172735 0.117963 +EDGE3 1985 2034 -5.91073 -4.84735 -2.54636 -0.00497801 0.00234227 -0.12809 +EDGE3 1985 2036 -6.11982 4.80201 -2.66184 -0.00324819 0.00863909 0.12945 +EDGE3 1986 2036 -5.72677 0.00382911 -2.59004 0.00980639 0.0010069 0.0089004 +EDGE3 1987 2037 -5.729 0.0125778 -2.60432 -0.00461108 -0.000919019 -0.00405932 +EDGE3 1986 2035 -5.91921 -4.82525 -2.55333 -0.0037187 0.00610245 -0.123571 +EDGE3 1986 2037 -6.14308 4.79213 -2.6394 -0.00708418 0.000286545 0.127403 +EDGE3 1987 2036 -5.90948 -4.81843 -2.53106 -0.00374852 0.0136236 -0.130216 +EDGE3 1988 2038 -5.72723 -0.012184 -2.58184 0.00280776 -0.00303138 0.00678438 +EDGE3 1987 2038 -6.13312 4.7865 -2.65133 -0.00370447 0.000732884 0.125371 +EDGE3 1988 2037 -5.88902 -4.80056 -2.54457 -0.000314103 0.00249991 -0.126326 +EDGE3 1989 2039 -5.71025 -0.00967135 -2.5907 0.00537582 1.53546e-05 -0.00146584 +EDGE3 1988 2039 -6.153 4.76545 -2.65028 0.0117102 0.00144592 0.128812 +EDGE3 1989 2038 -5.8993 -4.80011 -2.5341 0.00288866 0.0063646 -0.119684 +EDGE3 1990 2040 -5.73889 -0.00119034 -2.56429 -0.00109989 -0.00315108 0.00031357 +EDGE3 1989 2040 -6.15324 4.77179 -2.64271 -0.001378 -0.00117353 0.124713 +EDGE3 1990 2039 -5.92804 -4.7756 -2.51318 -0.000644632 0.00395925 -0.125373 +EDGE3 1991 2041 -5.71671 4.96791e-05 -2.56081 -0.00240224 0.00493047 -0.000233993 +EDGE3 1990 2041 -6.13659 4.7519 -2.61667 -0.00117809 -0.00589109 0.124796 +EDGE3 1991 2040 -5.91479 -4.76916 -2.52589 -0.00522813 -1.21103e-05 -0.123421 +EDGE3 1992 2042 -5.741 0.0163824 -2.53424 -0.00332111 0.00513903 -0.00328601 +EDGE3 1991 2042 -6.14323 4.72251 -2.59834 -0.012849 0.00702589 0.1204 +EDGE3 1992 2041 -5.91697 -4.74255 -2.49408 0.00197826 0.00233048 -0.135124 +EDGE3 1993 2043 -5.74865 0.00741669 -2.53799 -0.00231165 -0.00337837 0.00893604 +EDGE3 1992 2043 -6.15616 4.70534 -2.60166 -0.0062415 0.00222547 0.127571 +EDGE3 1993 2042 -5.9251 -4.72891 -2.48772 -0.000202461 0.00309071 -0.127355 +EDGE3 1994 2044 -5.73641 -0.00432517 -2.55032 -0.00244914 -0.00071224 -0.00606833 +EDGE3 1993 2044 -6.14334 4.6887 -2.58314 -0.00048312 0.00916664 0.136056 +EDGE3 1994 2043 -5.93669 -4.72724 -2.49448 -0.00379939 -0.00258039 -0.125835 +EDGE3 1995 2045 -5.76333 -0.00576178 -2.53612 0.0034264 0.00257061 -0.00514583 +EDGE3 1994 2045 -6.17376 4.67516 -2.59567 -0.00447444 0.00525539 0.123384 +EDGE3 1995 2044 -5.91971 -4.69424 -2.47222 -0.00527692 -0.00213859 -0.124652 +EDGE3 1996 2046 -5.75783 0.00566603 -2.5296 0.00286347 -1.47955e-05 -0.00253179 +EDGE3 1995 2046 -6.15345 4.6678 -2.56932 0.00390513 0.00643812 0.131291 +EDGE3 1996 2045 -5.92701 -4.67611 -2.47095 -0.00161134 0.000700915 -0.120453 +EDGE3 1997 2047 -5.74533 0.00651527 -2.52244 -0.00324859 0.00305536 -0.00550445 +EDGE3 1996 2047 -6.15972 4.65363 -2.56111 -0.00111321 -0.00352066 0.131328 +EDGE3 1997 2046 -5.90996 -4.66918 -2.46934 0.00750882 0.00411914 -0.125018 +EDGE3 1998 2048 -5.74915 0.00115262 -2.52889 0.000972271 -0.000143849 0.00251976 +EDGE3 1997 2048 -6.18446 4.64395 -2.57079 0.00187662 -0.00478119 0.118365 +EDGE3 1998 2047 -5.9519 -4.66086 -2.44759 -0.00208003 -0.00851716 -0.13098 +EDGE3 1999 2049 -5.76126 -0.0108822 -2.50516 -0.00467626 -0.00446563 -0.00804558 +EDGE3 1998 2049 -6.15605 4.6253 -2.56056 0.00279508 -0.0109602 0.134323 +EDGE3 1999 2048 -5.94408 -4.65923 -2.45192 0.000883096 0.00140328 -0.123139 +EDGE3 2000 2050 -5.74839 -0.00734357 -2.49863 0.000311057 -0.00142417 -0.00377704 +EDGE3 1999 2050 -6.15495 4.61349 -2.5414 -0.000181217 -0.00203306 0.129037 +EDGE3 2000 2049 -5.9317 -4.64752 -2.44503 0.00901745 0.0017234 -0.118038 +EDGE3 2001 2051 -5.75976 -0.00171117 -2.47989 -0.00792534 -0.00413709 -0.00781739 +EDGE3 2000 2051 -6.18659 4.58175 -2.54779 -0.0049066 0.00259802 0.132815 +EDGE3 2001 2050 -5.9428 -4.61092 -2.4395 -0.00525132 -0.000677051 -0.127397 +EDGE3 2002 2052 -5.76636 -0.00599688 -2.48583 -0.00468483 0.00396651 -0.0103127 +EDGE3 2001 2052 -6.17512 4.57127 -2.52633 -0.00953566 -0.00267424 0.127105 +EDGE3 2002 2051 -5.94168 -4.59943 -2.4424 0.0128335 -0.00304354 -0.120298 +EDGE3 2003 2053 -5.79252 0.00870577 -2.47847 0.00523746 0.00536477 -0.00327143 +EDGE3 2002 2053 -6.17521 4.5837 -2.53395 0.00523524 -0.00324907 0.121779 +EDGE3 2003 2052 -5.96882 -4.58883 -2.41945 -0.00478965 -0.00231544 -0.123808 +EDGE3 2004 2054 -5.7833 0.00424501 -2.44278 0.00433057 0.000918187 0.00124686 +EDGE3 2003 2054 -6.17929 4.54089 -2.51051 -0.00260013 0.00243351 0.117058 +EDGE3 2004 2053 -5.94159 -4.56642 -2.42422 -0.0102416 0.0140781 -0.130452 +EDGE3 2005 2055 -5.7833 0.0107374 -2.45063 -0.00533231 -0.00684012 -0.000816218 +EDGE3 2004 2055 -6.19837 4.55516 -2.48559 0.000204753 -0.000251432 0.127914 +EDGE3 2005 2054 -5.95925 -4.54763 -2.41681 0.00382441 0.000949968 -0.129762 +EDGE3 2006 2056 -5.7822 0.00724095 -2.46771 0.000405986 -0.00720977 0.00958064 +EDGE3 2005 2056 -6.19318 4.54003 -2.51721 -0.00390878 -0.00744035 0.1302 +EDGE3 2006 2055 -5.94797 -4.52302 -2.40885 -0.00223352 -0.000435366 -0.127858 +EDGE3 2007 2057 -5.76886 -0.010995 -2.45151 -0.00409119 0.00292958 0.000803437 +EDGE3 2006 2057 -6.17297 4.5262 -2.49637 -0.000106723 0.000946703 0.125539 +EDGE3 2007 2056 -5.96426 -4.53065 -2.40055 0.00263694 -0.0034985 -0.131254 +EDGE3 2008 2058 -5.77018 -0.0204112 -2.4319 0.000360716 0.000153387 -0.0079421 +EDGE3 2007 2058 -6.19358 4.49765 -2.4925 -0.00447799 0.00287667 0.113149 +EDGE3 2008 2057 -5.95241 -4.51212 -2.39668 0.00188614 0.000221794 -0.128015 +EDGE3 2009 2059 -5.79377 -0.00355615 -2.43807 0.00422429 -0.00966115 0.00691968 +EDGE3 2008 2059 -6.20564 4.46627 -2.49273 0.00493664 0.0116841 0.139501 +EDGE3 2009 2058 -5.95562 -4.4939 -2.39892 -0.00361686 0.00359153 -0.125469 +EDGE3 2010 2060 -5.79519 0.00593328 -2.40915 -0.00381593 -0.0016928 0.00588013 +EDGE3 2009 2060 -6.18672 4.46745 -2.47876 0.000144335 0.00164268 0.120873 +EDGE3 2010 2059 -5.95643 -4.48242 -2.37213 0.0043481 0.00783785 -0.12656 +EDGE3 2011 2061 -5.8084 0.00483225 -2.41618 -0.00410435 0.00912598 -0.00298907 +EDGE3 2010 2061 -6.1939 4.47309 -2.48134 -0.00345444 0.00244604 0.125125 +EDGE3 2011 2060 -5.95421 -4.47608 -2.36864 0.00393282 -0.00115712 -0.125808 +EDGE3 2012 2062 -5.7916 -0.0103155 -2.40741 0.00440796 -0.0042292 0.00732876 +EDGE3 2011 2062 -6.20243 4.44467 -2.44085 0.00545389 -0.00251864 0.129854 +EDGE3 2012 2061 -5.95978 -4.46504 -2.36904 -0.00628232 0.00605086 -0.134242 +EDGE3 2013 2063 -5.80251 -0.00230012 -2.40784 0.00524565 0.00500367 -0.00566374 +EDGE3 2012 2063 -6.18106 4.43892 -2.45672 -0.00168207 0.00448498 0.11631 +EDGE3 2013 2062 -5.95827 -4.43563 -2.35991 -0.00322014 0.00554915 -0.128251 +EDGE3 2014 2064 -5.80304 0.00671367 -2.40861 0.000872453 -0.000913993 0.00346853 +EDGE3 2013 2064 -6.19008 4.41356 -2.43988 0.00097156 0.000918992 0.124359 +EDGE3 2014 2063 -5.96061 -4.43742 -2.34713 -0.00370086 0.00230485 -0.137001 +EDGE3 2015 2065 -5.81365 0.0123481 -2.38514 0.00597459 0.00638675 0.00180554 +EDGE3 2014 2065 -6.18997 4.40277 -2.43678 0.00531478 -0.00600919 0.137856 +EDGE3 2015 2064 -5.97621 -4.40493 -2.35252 0.00517561 -0.00258623 -0.13144 +EDGE3 2016 2066 -5.8239 7.80055e-05 -2.38256 0.00114378 0.000400493 -0.00672078 +EDGE3 2015 2066 -6.21408 4.37576 -2.4204 0.00113157 0.00491068 0.126303 +EDGE3 2016 2065 -5.97451 -4.38431 -2.32349 0.0028395 0.000518966 -0.126846 +EDGE3 2017 2067 -5.80374 0.00506115 -2.38624 0.00253928 -0.00218819 0.00485385 +EDGE3 2016 2067 -6.2197 4.37089 -2.42721 -0.0024466 0.00569053 0.134454 +EDGE3 2017 2066 -5.97597 -4.39096 -2.33083 0.0049088 0.0070123 -0.127994 +EDGE3 2018 2068 -5.82648 -0.00861741 -2.37066 0.00697215 0.000547904 -0.00279348 +EDGE3 2017 2068 -6.19444 4.35555 -2.42256 0.000219624 -0.0110437 0.123259 +EDGE3 2018 2067 -5.97059 -4.38785 -2.31398 1.04194e-05 0.00621861 -0.12852 +EDGE3 2019 2069 -5.80385 -0.00352564 -2.36774 -0.00704168 0.000723321 -0.00191423 +EDGE3 2018 2069 -6.21276 4.32614 -2.40585 -0.00160973 0.00251451 0.130108 +EDGE3 2019 2068 -5.9617 -4.34041 -2.31218 -0.00708811 -0.00108708 -0.125522 +EDGE3 2020 2070 -5.83385 0.00635566 -2.3591 0.000765425 -0.00515953 -0.00173899 +EDGE3 2019 2070 -6.20354 4.30528 -2.38995 0.00356041 0.00194851 0.125916 +EDGE3 2020 2069 -5.99653 -4.32351 -2.31091 0.00615782 0.00345513 -0.12581 +EDGE3 2021 2071 -5.83393 0.0100619 -2.34017 0.000727191 0.00295602 0.00110959 +EDGE3 2020 2071 -6.20915 4.30663 -2.38045 0.0100873 -0.00218948 0.124519 +EDGE3 2021 2070 -5.97817 -4.32804 -2.29347 -0.0105248 0.00268003 -0.122087 +EDGE3 2022 2072 -5.83059 0.00238502 -2.32805 0.00647476 0.00336423 0.000347121 +EDGE3 2021 2072 -6.21032 4.26182 -2.36848 0.000354677 -0.00429968 0.129391 +EDGE3 2022 2071 -5.98414 -4.30602 -2.27938 -0.00124225 -0.0037437 -0.123231 +EDGE3 2023 2073 -5.83805 -0.0115723 -2.33592 -0.00125895 0.00622693 0.00276862 +EDGE3 2022 2073 -6.21702 4.27521 -2.38644 -0.00671104 -0.00493245 0.130302 +EDGE3 2023 2072 -5.9682 -4.28582 -2.29304 0.000612942 0.000517881 -0.122715 +EDGE3 2024 2074 -5.83251 0.00559975 -2.33102 -0.0104946 0.0164411 0.00527033 +EDGE3 2023 2074 -6.24346 4.25569 -2.35235 -0.0127289 -0.00158394 0.122382 +EDGE3 2024 2073 -5.98361 -4.27659 -2.27014 0.000852951 -0.000268478 -0.124245 +EDGE3 2025 2075 -5.84432 -0.0043367 -2.30416 0.00142142 -0.0139681 0.0054916 +EDGE3 2024 2075 -6.21793 4.23589 -2.38595 -0.00411979 0.00232766 0.130071 +EDGE3 2025 2074 -5.97864 -4.27134 -2.27045 0.000218453 0.00108944 -0.12459 +EDGE3 2026 2076 -5.84998 -0.00841108 -2.30584 -0.00659239 -0.0041332 0.0008237 +EDGE3 2025 2076 -6.23664 4.24875 -2.35552 -0.000885832 -0.00414104 0.122379 +EDGE3 2026 2075 -5.97911 -4.23375 -2.27409 0.00146301 0.00393549 -0.126333 +EDGE3 2027 2077 -5.85399 -0.00585114 -2.28287 -0.00519583 0.00325914 -0.00544765 +EDGE3 2026 2077 -6.22213 4.22228 -2.35188 0.00435178 -0.0022694 0.124392 +EDGE3 2027 2076 -5.98967 -4.25109 -2.24203 -0.00117375 -0.000104374 -0.124877 +EDGE3 2028 2078 -5.8556 -0.0145199 -2.28983 -0.00370232 0.000997988 0.00241736 +EDGE3 2027 2078 -6.23325 4.20675 -2.32378 -0.00389323 -0.00590218 0.132073 +EDGE3 2028 2077 -5.99815 -4.21702 -2.2503 0.00131463 0.00908124 -0.127731 +EDGE3 2029 2079 -5.86068 -0.000478759 -2.28712 -0.00291423 0.00643992 0.00393346 +EDGE3 2028 2079 -6.22131 4.1642 -2.33212 0.00327394 -0.00161573 0.120087 +EDGE3 2029 2078 -5.99865 -4.18534 -2.25262 -0.00351711 -0.00678459 -0.129411 +EDGE3 2030 2080 -5.85913 0.00446869 -2.28147 0.000442265 0.00113292 -0.00210327 +EDGE3 2029 2080 -6.24286 4.17357 -2.31826 0.00177325 0.00623765 0.134839 +EDGE3 2030 2079 -5.99571 -4.17766 -2.24153 0.00919467 0.00274864 -0.128124 +EDGE3 2031 2081 -5.85781 -0.0160372 -2.27548 -0.00382007 -0.00619762 0.000436276 +EDGE3 2030 2081 -6.22337 4.14928 -2.30504 0.000240443 -0.00183813 0.125692 +EDGE3 2031 2080 -6.01474 -4.16035 -2.22424 0.0023934 0.00116799 -0.130487 +EDGE3 2032 2082 -5.84634 -0.0062411 -2.25471 0.00865758 -0.00232937 -0.00418461 +EDGE3 2031 2082 -6.22871 4.13936 -2.30863 -0.00277793 -0.00107957 0.132704 +EDGE3 2032 2081 -6.00274 -4.16545 -2.21108 0.000359335 -0.00290276 -0.118996 +EDGE3 2033 2083 -5.85054 0.00949504 -2.24279 -0.00635169 0.00243061 -0.00338636 +EDGE3 2032 2083 -6.23964 4.12851 -2.28834 -0.00215614 0.00680466 0.115213 +EDGE3 2033 2082 -6.00463 -4.14174 -2.22231 -0.00581243 0.00401506 -0.132008 +EDGE3 2034 2084 -5.87131 0.00838508 -2.24898 -0.00244151 -0.00607362 -0.00497452 +EDGE3 2033 2084 -6.24794 4.12703 -2.29615 -0.00197469 0.00280664 0.127452 +EDGE3 2034 2083 -6.02421 -4.12386 -2.19896 0.00349072 0.00482069 -0.127935 +EDGE3 2035 2085 -5.86511 -0.00753024 -2.23834 -0.000541617 0.00813806 -0.0022203 +EDGE3 2034 2085 -6.25948 4.0999 -2.27972 0.00391953 -0.00315987 0.1222 +EDGE3 2035 2084 -6.01528 -4.12841 -2.18704 0.00806919 -0.0040663 -0.128841 +EDGE3 2036 2086 -5.87231 -0.000927928 -2.23761 -0.00699801 0.001145 -0.00780654 +EDGE3 2035 2086 -6.22068 4.09428 -2.26396 0.000181202 -0.00136591 0.130219 +EDGE3 2036 2085 -6.01062 -4.08862 -2.18894 0.00327048 0.00376078 -0.125059 +EDGE3 2037 2087 -5.8695 -0.00294309 -2.23628 -0.00122512 -0.00687364 0.00207906 +EDGE3 2036 2087 -6.24167 4.08063 -2.26722 0.00307176 0.0012598 0.128077 +EDGE3 2037 2086 -6.01905 -4.08751 -2.16404 -0.0127306 -0.000965616 -0.13013 +EDGE3 2038 2088 -5.87968 -0.00743799 -2.23356 -0.00187816 0.00561564 -0.00257699 +EDGE3 2037 2088 -6.26274 4.04235 -2.27455 -0.00104656 -0.00614102 0.129228 +EDGE3 2038 2087 -6.01639 -4.06037 -2.18795 -0.00952976 0.00116822 -0.122361 +EDGE3 2039 2089 -5.86936 0.0040752 -2.20638 0.000257152 0.00160038 0.000578811 +EDGE3 2038 2089 -6.2602 4.03527 -2.25464 -0.00531985 0.00681172 0.117852 +EDGE3 2039 2088 -6.00039 -4.04052 -2.16153 -0.0042891 -0.000712407 -0.13484 +EDGE3 2040 2090 -5.87311 0.00831174 -2.20651 -0.00266108 -0.0116939 -0.00732333 +EDGE3 2039 2090 -6.25099 4.01829 -2.25358 -0.000399423 0.00143383 0.116277 +EDGE3 2040 2089 -6.04156 -4.03864 -2.15024 0.00151055 -0.000227002 -0.134871 +EDGE3 2041 2091 -5.88369 0.00800965 -2.20798 0.00321538 0.00583027 0.0021009 +EDGE3 2040 2091 -6.26768 3.99771 -2.24542 -0.00529336 -0.00064505 0.125849 +EDGE3 2041 2090 -6.0111 -4.01032 -2.15688 -0.0051762 0.00233999 -0.127105 +EDGE3 2042 2092 -5.89063 0.000370012 -2.19317 -0.00209198 0.00170177 0.00051837 +EDGE3 2041 2092 -6.24767 3.99418 -2.23575 0.0068385 0.00698524 0.118561 +EDGE3 2042 2091 -6.02067 -4.01682 -2.17581 -0.000193594 -0.00142719 -0.133227 +EDGE3 2043 2093 -5.89392 -8.55446e-05 -2.19132 -0.00353716 -9.00468e-05 -0.00858542 +EDGE3 2042 2093 -6.25764 3.95972 -2.23607 0.00451716 0.00473665 0.122068 +EDGE3 2043 2092 -6.0342 -3.99828 -2.14328 0.00666641 -0.0047847 -0.114355 +EDGE3 2044 2094 -5.89738 0.00615196 -2.16601 0.00463567 0.000952493 0.000717161 +EDGE3 2043 2094 -6.26914 3.96955 -2.21102 0.0100643 0.00323086 0.113249 +EDGE3 2044 2093 -6.01532 -3.9753 -2.12826 -0.00666583 0.000778069 -0.126675 +EDGE3 2045 2095 -5.9074 -0.00391655 -2.17908 0.00334858 0.00458424 -0.00117983 +EDGE3 2044 2095 -6.24863 3.93941 -2.20677 -0.000369341 -0.0029873 0.119971 +EDGE3 2045 2094 -6.03339 -3.97444 -2.12564 0.00202228 0.00965025 -0.127493 +EDGE3 2046 2096 -5.89056 0.00343853 -2.16229 0.00014085 -0.0031088 -0.00446368 +EDGE3 2045 2096 -6.25946 3.93629 -2.21792 -0.00840579 0.00637255 0.110481 +EDGE3 2046 2095 -6.03598 -3.94212 -2.11982 0.0034826 -0.00953041 -0.117463 +EDGE3 2047 2097 -5.90413 -0.00970724 -2.13146 0.000712657 -0.00221239 -0.00229294 +EDGE3 2046 2097 -6.26189 3.92256 -2.19438 0.00479461 -0.00113208 0.122579 +EDGE3 2047 2096 -6.02093 -3.92911 -2.10968 -0.0124571 0.000737624 -0.132679 +EDGE3 2048 2098 -5.9095 0.00881503 -2.14741 -0.00537507 -0.00561318 0.00606886 +EDGE3 2047 2098 -6.25978 3.90568 -2.19037 -0.00672361 0.00161057 0.129421 +EDGE3 2048 2097 -6.02379 -3.92629 -2.1073 -0.000847256 0.000310481 -0.125608 +EDGE3 2049 2099 -5.92216 -0.00660758 -2.1383 -0.0047532 -0.00565192 0.00346489 +EDGE3 2048 2099 -6.2708 3.87426 -2.18496 0.00179536 0.00121711 0.114605 +EDGE3 2049 2098 -6.0221 -3.90099 -2.09934 0.00383356 -0.00277464 -0.124785 +EDGE3 2050 2100 -5.92667 0.00175771 -2.12584 0.00108367 -0.00313783 0.000666733 +EDGE3 2049 2100 -6.27179 3.88072 -2.1908 0.0024905 0.00965048 0.123347 +EDGE3 2050 2099 -6.02507 -3.89527 -2.08976 -0.00481411 0.00495421 -0.127296 +EDGE3 2051 2101 -5.93393 0.00979347 -2.12608 0.00396038 0.000821505 0.0019976 +EDGE3 2050 2101 -6.26942 3.86654 -2.16611 -0.00395801 -0.00287421 0.129068 +EDGE3 2051 2100 -6.03857 -3.86839 -2.07855 0.000358259 0.00107249 -0.124883 +EDGE3 2052 2102 -5.90758 0.00308433 -2.12404 -0.0033241 0.00645193 -0.0012438 +EDGE3 2051 2102 -6.27038 3.85507 -2.16632 -0.00116234 0.00212495 0.123367 +EDGE3 2052 2101 -6.05148 -3.87227 -2.06772 0.00202365 -0.00908501 -0.123291 +EDGE3 2053 2103 -5.91533 -0.00751206 -2.09308 0.00349201 0.00481191 0.00400347 +EDGE3 2052 2103 -6.26918 3.84046 -2.14182 0.000346807 0.00338979 0.129896 +EDGE3 2054 2104 -5.93149 0.00908506 -2.09416 -0.00273292 -0.00148151 -0.00370212 +EDGE3 2053 2102 -6.04058 -3.84883 -2.06405 0.0064755 0.00402051 -0.131411 +EDGE3 2053 2104 -6.29198 3.82114 -2.14431 -0.0053049 -0.00671709 0.125853 +EDGE3 2054 2103 -6.04273 -3.82665 -2.05713 -0.00168238 -0.000167931 -0.137384 +EDGE3 2055 2105 -5.91969 -0.00430229 -2.07836 -0.00713583 0.00467845 -0.0039021 +EDGE3 2054 2105 -6.28623 3.8111 -2.14904 -0.00768072 -0.001408 0.128283 +EDGE3 2056 2106 -5.93314 -0.000461604 -2.08572 -0.00594782 0.00270033 -0.00448599 +EDGE3 2055 2104 -6.05003 -3.80292 -2.04927 -0.011553 -0.000521331 -0.128087 +EDGE3 2055 2106 -6.27874 3.79357 -2.11565 -0.00119753 0.00605238 0.13569 +EDGE3 2056 2105 -6.03948 -3.81879 -2.04731 -0.00206279 0.000526761 -0.127595 +EDGE3 2057 2107 -5.93791 0.00623255 -2.08121 -0.0022489 -0.00395187 0.00768184 +EDGE3 2056 2107 -6.26979 3.75976 -2.11732 -0.00247653 -0.00188549 0.129675 +EDGE3 2057 2106 -6.07606 -3.77956 -2.03081 0.00149475 0.0042671 -0.124208 +EDGE3 2058 2108 -5.92822 0.0088042 -2.05192 0.00381683 0.000620686 -0.00965019 +EDGE3 2057 2108 -6.29437 3.76767 -2.11551 0.00109404 -0.0113543 0.128986 +EDGE3 2058 2107 -6.03879 -3.78978 -2.04012 0.00751838 0.00694709 -0.124118 +EDGE3 2059 2109 -5.93245 -0.0113038 -2.05206 -0.00369534 -0.00320599 -0.00649021 +EDGE3 2058 2109 -6.2967 3.70899 -2.11219 0.00107844 0.0026395 0.1366 +EDGE3 2059 2108 -6.05884 -3.76036 -2.0264 0.00622424 0.00225682 -0.12689 +EDGE3 2060 2110 -5.9355 -0.0190349 -2.07067 0.00290023 0.000620301 0.00730811 +EDGE3 2059 2110 -6.28739 3.72561 -2.07671 -0.00223055 -0.000211957 0.123687 +EDGE3 2061 2111 -5.92652 0.00189824 -2.04278 -0.00711868 0.00821108 -0.00122415 +EDGE3 2060 2109 -6.04357 -3.72466 -2.00346 0.00692385 -0.00728787 -0.126196 +EDGE3 2060 2111 -6.27882 3.70464 -2.08489 0.00548529 -0.00206663 0.130796 +EDGE3 2061 2110 -6.0465 -3.7205 -2.00394 0.000299136 0.0120955 -0.123387 +EDGE3 2062 2112 -5.95038 -0.0226301 -2.03134 0.000446199 0.00143466 -0.00327498 +EDGE3 2061 2112 -6.29146 3.68536 -2.10226 -0.00661116 -0.000432953 0.117982 +EDGE3 2062 2111 -6.0493 -3.72286 -1.99942 0.00435613 0.00179494 -0.126614 +EDGE3 2063 2113 -5.93952 0.000585731 -2.02381 -0.00118808 -0.000536908 -0.00812612 +EDGE3 2062 2113 -6.29619 3.67743 -2.07443 -0.00225026 -0.00392104 0.126678 +EDGE3 2063 2112 -6.08045 -3.71915 -1.9964 0.0024397 -0.00454503 -0.130236 +EDGE3 2064 2114 -5.94825 -0.000532564 -2.01971 -0.00369132 0.00909343 0.00216733 +EDGE3 2063 2114 -6.29575 3.68247 -2.06419 0.00953423 -0.00405272 0.119145 +EDGE3 2064 2113 -6.06373 -3.68082 -1.97632 -0.00544145 0.00372757 -0.125031 +EDGE3 2065 2115 -5.95068 0.00513786 -2.01439 0.00143478 0.00478867 0.00409069 +EDGE3 2064 2115 -6.29672 3.6439 -2.05649 0.000561371 0.00142515 0.126307 +EDGE3 2065 2114 -6.05683 -3.66435 -1.96301 -0.0067498 -0.000446725 -0.114579 +EDGE3 2066 2116 -5.95544 0.00671604 -2.021 -0.00103876 5.14945e-06 -0.00130655 +EDGE3 2065 2116 -6.28359 3.65731 -2.07078 0.005645 0.00563761 0.129405 +EDGE3 2066 2115 -6.05639 -3.6417 -1.97955 0.000542635 0.000584542 -0.128521 +EDGE3 2067 2117 -5.94927 -0.0140771 -2.01216 0.00683763 0.00606834 0.00272283 +EDGE3 2066 2117 -6.31134 3.60498 -2.04821 0.00153988 -0.00475633 0.120193 +EDGE3 2067 2116 -6.06027 -3.6338 -1.97689 -0.00555853 0.00160332 -0.120354 +EDGE3 2068 2118 -5.953 -0.00371038 -1.99547 -0.00271618 0.00776533 0.00241446 +EDGE3 2067 2118 -6.30762 3.61152 -2.03263 0.0032646 -0.00301803 0.126952 +EDGE3 2068 2117 -6.06969 -3.61773 -1.95472 -0.00850289 0.00116892 -0.125973 +EDGE3 2068 2119 -6.29498 3.57367 -2.03019 -0.00540186 -0.00346286 0.134715 +EDGE3 2069 2119 -5.98185 0.0114605 -1.9936 0.00290407 0.00276769 0.00239547 +EDGE3 2070 2120 -5.97477 -0.00316827 -1.96173 0.00186382 0.00515816 -0.00656733 +EDGE3 2069 2118 -6.0582 -3.58813 -1.9671 0.003653 -0.00412479 -0.120012 +EDGE3 2069 2120 -6.31353 3.56648 -2.02285 0.00834139 0.00168444 0.127785 +EDGE3 2070 2119 -6.06804 -3.58682 -1.93565 -0.00269927 0.0014436 -0.124743 +EDGE3 2071 2121 -5.98216 -0.00571616 -1.96118 0.00317048 -0.00589334 -0.000540103 +EDGE3 2070 2121 -6.33194 3.54488 -2.00153 0.0136365 -0.00761714 0.119832 +EDGE3 2071 2120 -6.07413 -3.56923 -1.91845 -0.00345911 -0.00121302 -0.123701 +EDGE3 2071 2122 -6.29725 3.53959 -2.00067 -0.00314443 0.000628238 0.128557 +EDGE3 2072 2122 -5.96748 -0.0015084 -1.99386 -0.00951151 0.000348671 0.00744 +EDGE3 2073 2123 -5.97319 0.011017 -1.96971 -0.00910832 0.00358224 -0.00199302 +EDGE3 2072 2121 -6.0773 -3.55398 -1.92424 0.00153828 -0.00143892 -0.13044 +EDGE3 2072 2123 -6.31332 3.5188 -1.99706 0.00404255 0.000858063 0.124509 +EDGE3 2073 2122 -6.06986 -3.53597 -1.94962 -0.00103369 0.0028723 -0.126331 +EDGE3 2074 2124 -5.98892 -0.000392381 -1.95866 -0.000804872 0.00684446 -0.000457259 +EDGE3 2073 2124 -6.28515 3.52381 -2.00725 0.00276886 0.00825662 0.117109 +EDGE3 2074 2123 -6.07522 -3.52987 -1.89962 0.000737912 -0.000937212 -0.116506 +EDGE3 2075 2125 -5.96068 0.0173979 -1.9445 0.00103332 0.00293935 0.00287142 +EDGE3 2074 2125 -6.32713 3.50678 -1.9772 0.00174963 0.00332514 0.120492 +EDGE3 2076 2126 -5.97277 -0.0178712 -1.9284 -0.000101728 -0.00608443 0.00703662 +EDGE3 2075 2124 -6.06783 -3.53235 -1.90033 -0.00589156 0.0042456 -0.126481 +EDGE3 2075 2126 -6.31638 3.47845 -1.96574 -0.00313076 -0.00266076 0.117886 +EDGE3 2076 2125 -6.08533 -3.48031 -1.91061 0.000601945 -0.00100547 -0.1291 +EDGE3 2077 2127 -5.98331 -0.00234423 -1.93982 0.00365559 0.00331466 0.0024518 +EDGE3 2076 2127 -6.32156 3.46942 -1.96339 -0.000680103 -0.0101067 0.120489 +EDGE3 2077 2126 -6.07254 -3.47158 -1.90369 0.0114106 0.000478325 -0.133952 +EDGE3 2078 2128 -5.98693 -0.00280221 -1.91354 0.00215617 0.000803247 -0.000263122 +EDGE3 2077 2128 -6.31929 3.4433 -1.96018 0.00296542 0.000386859 0.119064 +EDGE3 2078 2127 -6.08694 -3.4604 -1.88881 -0.0024729 -0.00829517 -0.130498 +EDGE3 2079 2129 -5.98147 0.0070781 -1.91989 -0.00159125 -0.000797719 -0.00341666 +EDGE3 2078 2129 -6.30045 3.44762 -1.96472 -0.00144504 0.00174931 0.117837 +EDGE3 2079 2128 -6.08249 -3.45943 -1.87459 -0.00387627 -0.000661715 -0.124688 +EDGE3 2080 2130 -5.97924 -0.000312655 -1.91332 -0.0105905 -0.00193327 0.000221905 +EDGE3 2079 2130 -6.33803 3.42882 -1.94711 -0.00341034 0.00823967 0.11694 +EDGE3 2081 2131 -5.98859 0.00279185 -1.89873 -0.00160391 -0.00207205 -0.00417025 +EDGE3 2080 2129 -6.08952 -3.44871 -1.86505 -0.00164381 0.00248843 -0.126939 +EDGE3 2080 2131 -6.33061 3.40838 -1.94915 0.00291881 0.00797559 0.132987 +EDGE3 2081 2130 -6.0788 -3.41594 -1.87535 -0.0013287 -0.00791277 -0.125402 +EDGE3 2082 2132 -6.0015 -0.00652335 -1.89215 -4.18205e-05 0.00102996 0.00807322 +EDGE3 2081 2132 -6.32091 3.39962 -1.91889 -0.00143505 0.00151983 0.123785 +EDGE3 2082 2131 -6.08934 -3.39579 -1.85926 -0.0111783 0.00252409 -0.117537 +EDGE3 2083 2133 -5.98507 -0.0120733 -1.86438 0.0088407 -0.000948591 0.00930804 +EDGE3 2082 2133 -6.33084 3.40599 -1.92476 -2.61182e-05 -0.00179654 0.126582 +EDGE3 2083 2132 -6.0878 -3.40112 -1.84172 -0.000539774 0.000508492 -0.115756 +EDGE3 2084 2134 -6.01648 0.00418231 -1.88188 0.000283529 0.00925755 0.00191758 +EDGE3 2083 2134 -6.32832 3.34385 -1.93447 0.0100678 9.59947e-05 0.127495 +EDGE3 2084 2133 -6.09274 -3.36285 -1.83756 0.0015268 -0.00190316 -0.121878 +EDGE3 2085 2135 -6.00625 0.0115873 -1.86914 -0.00734993 -0.00171104 -0.00343614 +EDGE3 2084 2135 -6.34637 3.36636 -1.90868 0.00178518 -0.00195286 0.124479 +EDGE3 2085 2134 -6.07863 -3.35867 -1.84407 -0.0073883 -1.90668e-05 -0.126297 +EDGE3 2086 2136 -6.00136 0.00962977 -1.86404 0.00681084 -0.00439823 -0.000295294 +EDGE3 2085 2136 -6.31204 3.33194 -1.8932 0.00303882 0.0115107 0.125339 +EDGE3 2086 2135 -6.0749 -3.37437 -1.82204 0.00312573 0.00548964 -0.129293 +EDGE3 2087 2137 -6.00067 -0.00189323 -1.8569 0.00658947 0.00517575 -0.00109841 +EDGE3 2086 2137 -6.34788 3.30463 -1.88166 -0.00365125 0.00527173 0.122573 +EDGE3 2087 2136 -6.08537 -3.31952 -1.84878 -0.00232596 -0.00728576 -0.121916 +EDGE3 2088 2138 -5.9965 -0.00206411 -1.84616 -0.00791901 0.00103662 -0.00379793 +EDGE3 2087 2138 -6.33761 3.29809 -1.8893 -0.00339555 0.00220343 0.126114 +EDGE3 2088 2137 -6.09966 -3.30036 -1.80643 0.00715213 -0.00281162 -0.134379 +EDGE3 2089 2139 -5.99174 -0.0132134 -1.82407 -0.00141107 -0.00367747 0.00326636 +EDGE3 2088 2139 -6.33806 3.27951 -1.87007 0.00226315 0.0142096 0.116329 +EDGE3 2089 2138 -6.08719 -3.30371 -1.82199 -0.010199 -0.00269967 -0.122222 +EDGE3 2090 2140 -6.00763 0.0110368 -1.84088 -0.00368553 0.0044039 0.00242902 +EDGE3 2089 2140 -6.33415 3.27942 -1.87885 -0.00402238 0.00323564 0.120321 +EDGE3 2090 2139 -6.08789 -3.27756 -1.80309 0.00483719 -0.00178446 -0.123195 +EDGE3 2091 2141 -6.00517 -0.00312004 -1.82225 0.00150712 0.0016927 0.00909287 +EDGE3 2090 2141 -6.34152 3.24619 -1.87426 -6.66586e-05 -0.00323963 0.123026 +EDGE3 2091 2140 -6.08532 -3.27743 -1.78561 0.00225822 -0.00210238 -0.122902 +EDGE3 2092 2142 -6.03401 0.00626047 -1.82865 0.00698572 0.00196595 0.00153133 +EDGE3 2091 2142 -6.33349 3.24546 -1.86974 -0.00453172 0.00936996 0.132012 +EDGE3 2092 2141 -6.1117 -3.26464 -1.7908 -0.00115097 0.00475354 -0.127528 +EDGE3 2093 2143 -6.00735 0.0142423 -1.82259 -0.00461933 -0.00242872 0.00164205 +EDGE3 2092 2143 -6.31528 3.21693 -1.84663 0.00271098 -0.0110172 0.123544 +EDGE3 2093 2142 -6.08444 -3.22965 -1.77742 0.00457179 0.00343976 -0.120475 +EDGE3 2094 2144 -6.01503 -0.0258424 -1.79562 0.00153992 0.00118445 -0.0107001 +EDGE3 2093 2144 -6.33681 3.21361 -1.832 -0.00727946 0.00135847 0.125971 +EDGE3 2094 2143 -6.11136 -3.23391 -1.77058 -0.000747774 0.00142893 -0.13029 +EDGE3 2095 2145 -6.00283 0.00428907 -1.79587 0.000318612 -0.00216324 -0.000631388 +EDGE3 2094 2145 -6.35785 3.18705 -1.82212 0.000896689 -0.0153748 0.124053 +EDGE3 2095 2144 -6.07596 -3.2214 -1.75577 0.00790089 0.0031951 -0.126049 +EDGE3 2096 2146 -6.02561 0.0080687 -1.79064 -0.00507079 0.00328523 0.00183576 +EDGE3 2095 2146 -6.337 3.17915 -1.82029 -0.00493707 0.0112835 0.129667 +EDGE3 2096 2145 -6.08761 -3.19806 -1.75927 -0.00446779 -0.001626 -0.123207 +EDGE3 2097 2147 -6.01608 -0.00307987 -1.78843 -0.00292477 0.00055812 -0.00100634 +EDGE3 2096 2147 -6.34148 3.17192 -1.81007 -0.00231259 -0.0127814 0.126525 +EDGE3 2097 2146 -6.1011 -3.18861 -1.73935 -5.00321e-05 -0.00405163 -0.120742 +EDGE3 2098 2148 -6.02953 0.0192381 -1.76784 0.00358078 0.0164029 0.00620056 +EDGE3 2097 2148 -6.34781 3.14471 -1.8083 0.00189213 -0.00610294 0.127296 +EDGE3 2098 2147 -6.12284 -3.15342 -1.71728 0.00217708 0.00334693 -0.128702 +EDGE3 2099 2149 -6.027 0.0149826 -1.7701 -0.00181979 0.00372934 0.00120963 +EDGE3 2098 2149 -6.34578 3.16253 -1.78907 -0.0108032 0.00262441 0.123235 +EDGE3 2099 2148 -6.10303 -3.1315 -1.72147 0.000696869 -0.00218441 -0.130784 +EDGE3 2100 2150 -6.02553 0.00773579 -1.73273 -0.0102786 0.0104801 -0.00180978 +EDGE3 2099 2150 -6.3549 3.12636 -1.78701 0.0145635 0.00922558 0.122406 +EDGE3 2100 2149 -6.08038 -3.13274 -1.71283 0.00250838 -0.00395404 -0.1218 +EDGE3 2101 2151 -6.03733 -0.0317082 -1.77018 -0.00136621 -0.00191629 0.00706098 +EDGE3 2100 2151 -6.33985 3.08642 -1.76906 -0.00482753 -0.00366189 0.132566 +EDGE3 2101 2150 -6.1141 -3.10638 -1.72232 -0.00832088 0.00416842 -0.122835 +EDGE3 2102 2152 -6.03043 0.00073681 -1.72199 -0.00695688 0.00389192 0.0114215 +EDGE3 2101 2152 -6.34919 3.08712 -1.75736 -0.000196628 -0.00857404 0.122979 +EDGE3 2102 2151 -6.0997 -3.09302 -1.71509 -0.00054366 -0.0039425 -0.123984 +EDGE3 2103 2153 -6.03353 0.00575997 -1.72863 -0.000793797 -0.00226973 -0.00308441 +EDGE3 2102 2153 -6.35863 3.0853 -1.7594 0.00169966 0.00122449 0.119839 +EDGE3 2103 2152 -6.11868 -3.08371 -1.70151 -0.00565734 0.00863588 -0.129928 +EDGE3 2104 2154 -6.03913 -0.00903318 -1.72153 0.000441206 -0.0107704 0.00665143 +EDGE3 2103 2154 -6.3513 3.05071 -1.74727 1.85428e-05 0.00455478 0.115662 +EDGE3 2104 2153 -6.11176 -3.06929 -1.7098 -0.00608003 -0.00810215 -0.127324 +EDGE3 2105 2155 -6.02528 -0.00434033 -1.72147 -0.00392665 0.00117417 -0.0025338 +EDGE3 2104 2155 -6.36168 3.04685 -1.76197 -0.00883081 0.00551195 0.125251 +EDGE3 2105 2154 -6.11603 -3.04845 -1.67309 -0.00779575 -0.000829919 -0.130793 +EDGE3 2106 2156 -6.0549 0.0118093 -1.70126 0.00352563 0.000499884 -6.95599e-05 +EDGE3 2105 2156 -6.36003 3.02673 -1.75821 0.00425138 -0.00225235 0.129514 +EDGE3 2106 2155 -6.12348 -3.04461 -1.6753 -0.00312301 0.00134217 -0.124023 +EDGE3 2107 2157 -6.06793 0.0120463 -1.69289 0.000101849 0.00220657 -0.00448867 +EDGE3 2106 2157 -6.35827 3.00143 -1.75305 -0.000481849 0.00468383 0.122905 +EDGE3 2107 2156 -6.13058 -3.02213 -1.67988 0.00626093 0.000690364 -0.133951 +EDGE3 2108 2158 -6.04005 -0.0119155 -1.69567 -0.00236322 -0.0035188 -0.00341967 +EDGE3 2107 2158 -6.36007 3.00323 -1.72501 0.000254628 -0.00222055 0.13303 +EDGE3 2108 2157 -6.10696 -3.02373 -1.66927 -0.00990192 -0.00440656 -0.126474 +EDGE3 2109 2159 -6.05669 -0.00487156 -1.66083 0.00262555 -0.000106343 0.00409873 +EDGE3 2108 2159 -6.3709 2.9766 -1.7174 -0.00384179 -0.00474646 0.126509 +EDGE3 2109 2158 -6.12488 -2.97947 -1.67041 0.00172027 -0.00221907 -0.127918 +EDGE3 2110 2160 -6.05226 0.00580043 -1.67865 -0.00604458 0.00589595 -0.00127039 +EDGE3 2109 2160 -6.36689 2.97288 -1.71598 -0.00314415 -0.00235884 0.119416 +EDGE3 2110 2159 -6.11442 -2.97335 -1.64219 0.00202833 0.00581036 -0.1219 +EDGE3 2111 2161 -6.04573 -0.0119217 -1.68149 -0.0113585 -0.00672606 -0.00117277 +EDGE3 2110 2161 -6.36804 2.94244 -1.70661 -0.00107658 0.00394848 0.123894 +EDGE3 2111 2160 -6.12621 -2.96081 -1.63363 -0.00916809 0.000980626 -0.120193 +EDGE3 2112 2162 -6.05338 -0.000203396 -1.65019 -0.00904445 0.00661086 -0.00284396 +EDGE3 2111 2162 -6.35452 2.9241 -1.70362 -0.0022817 -0.0022037 0.1257 +EDGE3 2112 2161 -6.13453 -2.93853 -1.62646 -0.000721912 0.00441845 -0.118948 +EDGE3 2113 2163 -6.05195 0.0015401 -1.65438 0.00462622 -0.00560956 -0.00125981 +EDGE3 2112 2163 -6.362 2.91011 -1.6789 -0.00427048 -0.00475044 0.136729 +EDGE3 2113 2162 -6.13157 -2.92505 -1.63907 0.00054087 0.00506513 -0.126685 +EDGE3 2114 2164 -6.05391 -0.0110752 -1.64791 -0.00183539 0.00680735 0.00778786 +EDGE3 2113 2164 -6.37927 2.9022 -1.68537 -0.00155023 -0.000636592 0.127315 +EDGE3 2114 2163 -6.13008 -2.91453 -1.61082 -0.00131687 0.00164425 -0.115962 +EDGE3 2115 2165 -6.05837 -0.00536234 -1.64635 0.00531262 0.00272633 0.00390719 +EDGE3 2114 2165 -6.36506 2.89054 -1.67492 0.00788926 0.000512568 0.127069 +EDGE3 2115 2164 -6.13556 -2.88816 -1.61398 -0.00353546 -0.00426429 -0.122942 +EDGE3 2116 2166 -6.05586 0.0164184 -1.63172 -0.00456012 0.00524413 -0.00572001 +EDGE3 2115 2166 -6.37999 2.87212 -1.65844 0.00647418 -0.00297022 0.131947 +EDGE3 2116 2165 -6.12219 -2.8845 -1.60356 -0.00487163 -0.00215806 -0.132524 +EDGE3 2117 2167 -6.0765 -0.00431003 -1.61947 0.00140154 0.00572974 0.00180628 +EDGE3 2116 2167 -6.37091 2.84255 -1.65185 -0.0130899 0.00296803 0.131669 +EDGE3 2117 2166 -6.11041 -2.8769 -1.59221 -0.00178785 0.00305872 -0.12958 +EDGE3 2118 2168 -6.07319 -0.00338633 -1.60982 0.000314876 -0.0152391 0.00097525 +EDGE3 2117 2168 -6.3836 2.84333 -1.64003 0.00150838 -0.00290157 0.123579 +EDGE3 2118 2167 -6.13013 -2.861 -1.57997 0.00508284 0.00137805 -0.132691 +EDGE3 2119 2169 -6.06416 -0.000941054 -1.60049 0.00652932 -0.00301904 -0.00397358 +EDGE3 2118 2169 -6.37021 2.83421 -1.63404 0.00254658 -0.00852544 0.132168 +EDGE3 2119 2168 -6.12462 -2.8317 -1.56718 0.00200924 -0.00249719 -0.12779 +EDGE3 2120 2170 -6.07631 0.00591338 -1.60152 -0.0042621 -0.00776457 0.00956044 +EDGE3 2119 2170 -6.39578 2.82416 -1.65718 -0.00514111 0.00302487 0.126869 +EDGE3 2120 2169 -6.1271 -2.81399 -1.57315 -0.00133484 -0.00169273 -0.123637 +EDGE3 2121 2171 -6.07852 0.000810951 -1.58402 0.00596351 -0.00547316 0.0101805 +EDGE3 2120 2171 -6.36135 2.80402 -1.63166 -0.00455756 0.0038687 0.12453 +EDGE3 2121 2170 -6.13231 -2.80301 -1.55883 0.00472195 0.0070168 -0.121146 +EDGE3 2122 2172 -6.07008 -0.0017845 -1.60475 0.00259908 0.000368062 0.0018074 +EDGE3 2121 2172 -6.38381 2.77421 -1.62897 0.000865094 0.00416186 0.136695 +EDGE3 2122 2171 -6.14235 -2.78041 -1.55596 0.00346219 0.00324749 -0.120924 +EDGE3 2123 2173 -6.07456 0.00110896 -1.57546 0.004553 0.00214091 -0.00303332 +EDGE3 2122 2173 -6.37167 2.7682 -1.6128 -0.000399282 -0.00363955 0.130541 +EDGE3 2123 2172 -6.13029 -2.79074 -1.54255 -0.00213953 0.00412228 -0.122702 +EDGE3 2124 2174 -6.07244 0.0203096 -1.57634 0.00338031 -0.00450822 -0.00219025 +EDGE3 2123 2174 -6.37143 2.74232 -1.617 -0.00580911 0.00709085 0.119948 +EDGE3 2124 2173 -6.13209 -2.77122 -1.55071 -0.00214452 0.00303414 -0.124703 +EDGE3 2125 2175 -6.08263 0.00116373 -1.57643 0.0123183 0.00337668 -0.00368489 +EDGE3 2124 2175 -6.37265 2.7365 -1.60193 0.00926088 -0.00486739 0.124118 +EDGE3 2125 2174 -6.12399 -2.76354 -1.53341 0.00403033 -0.00215533 -0.129689 +EDGE3 2126 2176 -6.08205 -0.0048357 -1.54839 -0.00430769 -0.0073771 0.000171346 +EDGE3 2125 2176 -6.37034 2.71354 -1.59441 0.00126459 -0.00375126 0.132072 +EDGE3 2126 2175 -6.14745 -2.74803 -1.52824 -0.000883027 -0.00460627 -0.128433 +EDGE3 2127 2177 -6.10591 0.000609767 -1.53792 -0.000622008 -0.0028017 0.00022089 +EDGE3 2126 2177 -6.38215 2.70491 -1.58228 0.000172778 0.00387577 0.122669 +EDGE3 2127 2176 -6.12158 -2.71872 -1.535 -0.0085379 0.000986664 -0.123754 +EDGE3 2128 2178 -6.09077 -0.0074687 -1.55364 0.00401524 -0.000991005 -0.00202728 +EDGE3 2127 2178 -6.38272 2.67497 -1.55352 0.00625341 0.000722047 0.127526 +EDGE3 2128 2177 -6.15985 -2.69293 -1.5191 0.000295744 -0.000654235 -0.131033 +EDGE3 2129 2179 -6.09723 -0.00578023 -1.54735 -0.000964619 -0.00710696 -0.00175898 +EDGE3 2128 2179 -6.38609 2.67657 -1.57239 -0.000837059 -0.00398319 0.117444 +EDGE3 2129 2178 -6.14394 -2.685 -1.50108 -0.00654075 0.00555596 -0.127701 +EDGE3 2130 2180 -6.09436 -0.00327573 -1.52755 0.00295263 -0.00187795 0.00216958 +EDGE3 2129 2180 -6.37714 2.651 -1.57105 0.00825667 0.0034253 0.125462 +EDGE3 2130 2179 -6.14308 -2.66974 -1.50666 0.00358796 -0.00641402 -0.117388 +EDGE3 2131 2181 -6.09577 -0.00596404 -1.50406 -0.00211756 0.00412137 -0.00393596 +EDGE3 2130 2181 -6.37517 2.63331 -1.54984 0.000552114 -0.00541878 0.120572 +EDGE3 2131 2180 -6.14972 -2.63524 -1.48873 -0.00326281 -0.00191088 -0.117339 +EDGE3 2132 2182 -6.11207 0.00268296 -1.49052 0.00510036 -0.00257811 -0.00705217 +EDGE3 2131 2182 -6.36456 2.62522 -1.53036 -0.00109818 0.00586741 0.126426 +EDGE3 2132 2181 -6.12752 -2.64179 -1.47741 0.00222706 -0.00516707 -0.12597 +EDGE3 2133 2183 -6.11688 -8.67769e-05 -1.48019 0.00257475 0.00634067 0.000886748 +EDGE3 2132 2183 -6.39302 2.59857 -1.54223 0.000957418 -0.00358733 0.126392 +EDGE3 2133 2182 -6.15706 -2.62245 -1.48218 0.00584931 0.00202588 -0.120456 +EDGE3 2134 2184 -6.09973 -0.0178222 -1.50356 -0.00104042 -0.000329482 0.0070011 +EDGE3 2133 2184 -6.38645 2.61291 -1.5038 0.0017519 -0.00653232 0.129353 +EDGE3 2134 2183 -6.13959 -2.61078 -1.46489 -0.00592665 -0.000108386 -0.11698 +EDGE3 2135 2185 -6.10005 -0.0061933 -1.49553 -0.00203202 0.00415748 -0.0019906 +EDGE3 2134 2185 -6.37266 2.57842 -1.52533 -0.00583527 0.00162562 0.131321 +EDGE3 2135 2184 -6.14496 -2.59396 -1.45414 0.00984246 -0.00287154 -0.128299 +EDGE3 2136 2186 -6.09993 0.0107231 -1.48455 -0.00787635 -0.00168988 -2.50032e-05 +EDGE3 2135 2186 -6.37952 2.58117 -1.49995 -0.00290006 -0.00180907 0.126585 +EDGE3 2136 2185 -6.15098 -2.57152 -1.44654 0.00873902 -0.00732699 -0.121588 +EDGE3 2137 2187 -6.10714 0.0117103 -1.47509 0.00482699 0.000655149 0.00090774 +EDGE3 2136 2187 -6.38518 2.55236 -1.48876 -0.00449889 -0.00660463 0.135141 +EDGE3 2137 2186 -6.16191 -2.56178 -1.43126 -0.00430394 0.0046619 -0.122503 +EDGE3 2138 2188 -6.106 0.00308513 -1.4515 0.0018441 -0.00337575 -0.000502985 +EDGE3 2137 2188 -6.40285 2.53676 -1.50177 -0.000308542 0.000709305 0.120844 +EDGE3 2138 2187 -6.13839 -2.54467 -1.43005 -0.0053218 0.00455299 -0.114026 +EDGE3 2139 2189 -6.11215 -0.00473784 -1.47926 0.00679294 -0.00686528 0.00191059 +EDGE3 2138 2189 -6.37667 2.52462 -1.47615 0.00651111 -0.00572575 0.125506 +EDGE3 2139 2188 -6.15772 -2.5293 -1.43358 0.00144712 0.00197916 -0.124438 +EDGE3 2140 2190 -6.11653 0.0132158 -1.43492 -0.000992057 -0.00542207 -0.00349857 +EDGE3 2139 2190 -6.39125 2.48389 -1.4831 -0.000458761 0.00275437 0.129613 +EDGE3 2140 2189 -6.13765 -2.51636 -1.43566 0.00283962 -0.00291675 -0.12503 +EDGE3 2141 2191 -6.13182 -0.000536986 -1.43488 -0.0033865 0.00311662 0.00325182 +EDGE3 2140 2191 -6.39627 2.47308 -1.46308 0.0021683 0.0021346 0.127294 +EDGE3 2142 2192 -6.10187 -0.000164833 -1.41509 -0.00128835 -0.00975593 -0.0143848 +EDGE3 2141 2190 -6.13596 -2.50414 -1.39065 0.0045157 -0.0128132 -0.131329 +EDGE3 2141 2192 -6.39218 2.45169 -1.47588 -0.00472987 0.00119736 0.116863 +EDGE3 2142 2191 -6.1559 -2.4968 -1.40346 0.00414847 -0.00305708 -0.126816 +EDGE3 2143 2193 -6.12946 -0.0037127 -1.41332 0.00638844 0.00933395 -0.00319108 +EDGE3 2142 2193 -6.40405 2.46818 -1.45208 -0.00375872 -0.0069903 0.129572 +EDGE3 2143 2192 -6.15173 -2.4652 -1.4171 0.00115789 0.000694659 -0.11778 +EDGE3 2144 2194 -6.12063 -0.00987962 -1.42416 0.00257147 -0.0060495 0.00181636 +EDGE3 2143 2194 -6.40232 2.43988 -1.45723 0.00092139 0.00862409 0.128122 +EDGE3 2144 2193 -6.14829 -2.45543 -1.38257 0.000375646 -0.0053709 -0.124203 +EDGE3 2144 2195 -6.36838 2.41735 -1.43774 0.00318859 0.00697568 0.126441 +EDGE3 2145 2195 -6.12206 0.0130165 -1.40111 -0.00104551 0.00435546 0.0041184 +EDGE3 2146 2196 -6.12333 0.00923855 -1.40085 0.000617235 -0.00852599 0.00702703 +EDGE3 2145 2194 -6.16123 -2.45199 -1.39543 -0.00397966 0.00478315 -0.120256 +EDGE3 2145 2196 -6.40247 2.40632 -1.43996 0.00673291 -0.0035812 0.120468 +EDGE3 2146 2195 -6.15134 -2.45205 -1.37734 -0.00554773 0.00230355 -0.117139 +EDGE3 2147 2197 -6.14246 0.00655082 -1.38848 0.00463948 0.000769383 0.00365289 +EDGE3 2146 2197 -6.38223 2.40253 -1.42925 0.00349251 -0.00279098 0.124835 +EDGE3 2147 2196 -6.14631 -2.40903 -1.37557 0.00310143 -0.00497783 -0.115797 +EDGE3 2148 2198 -6.11874 -0.00852451 -1.38781 -0.00247982 0.00334181 -0.0107674 +EDGE3 2147 2198 -6.41417 2.36241 -1.436 0.00198569 -0.00842032 0.122813 +EDGE3 2148 2197 -6.14889 -2.37743 -1.3569 -0.00182153 -0.0016591 -0.122868 +EDGE3 2149 2199 -6.13725 0.00467317 -1.38531 -0.0020732 -0.00170083 0.000104444 +EDGE3 2148 2199 -6.41574 2.36567 -1.40254 -0.00460387 -0.00190647 0.122777 +EDGE3 2149 2198 -6.16 -2.36539 -1.34615 -0.000799026 0.00527669 -0.12699 diff --git a/examples/Pose2SLAMExample.cpp b/examples/Pose2SLAMExample.cpp index 265e323db..8118004af 100644 --- a/examples/Pose2SLAMExample.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -26,7 +26,7 @@ using namespace gtsam; int main(int argc, char** argv) { // 1. Create graph container and add factors to it - pose2SLAM::Graph graph ; + pose2SLAM::Graph graph; // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin @@ -35,25 +35,25 @@ int main(int argc, char** argv) { // 2b. Add odometry factors SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); - graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); + graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0), odometryNoise); graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); // 2c. Add pose constraint - SharedDiagonal constraintUncertainty(Vector_(3, 0.2, 0.2, 0.1)); - graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + SharedDiagonal model(Vector_(3, 0.2, 0.2, 0.1)); + graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), model); // print graph.print("\nFactor graph:\n"); - // 3. Create the data structure to hold the initialEstimate estimate to the solution + // 3. Create the data structure to hold the initialEstimate estimate to the solution pose2SLAM::Values initialEstimate; - Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); - Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); - Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); - Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); - Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); + initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insertPose(2, Pose2(2.3, 0.1, -0.2)); + initialEstimate.insertPose(3, Pose2(4.1, 0.1, M_PI_2)); + initialEstimate.insertPose(4, Pose2(4.0, 2.0, M_PI)); + initialEstimate.insertPose(5, Pose2(2.1, 2.1, -M_PI_2)); initialEstimate.print("\nInitial estimate:\n"); // 4. Single Step Optimization using Levenberg-Marquardt diff --git a/examples/matlab/Pose2SLAMExample.m b/examples/matlab/Pose2SLAMExample.m index 41d4c0708..5641d2ac3 100644 --- a/examples/matlab/Pose2SLAMExample.m +++ b/examples/matlab/Pose2SLAMExample.m @@ -36,19 +36,19 @@ graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -constraintUncertainty = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); -graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), constraintUncertainty); +model = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); % print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points initialEstimate = pose2SLAMValues; -x1 = gtsamPose2(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); -x2 = gtsamPose2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); -x3 = gtsamPose2(4.1, 0.1, pi/2); initialEstimate.insertPose(3, x3); -x4 = gtsamPose2(4.0, 2.0, pi ); initialEstimate.insertPose(4, x4); -x5 = gtsamPose2(2.1, 2.1,-pi/2); initialEstimate.insertPose(5, x5); +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2 )); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2 )); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, pi/2)); +initialEstimate.insertPose(4, gtsamPose2(4.0, 2.0, pi )); +initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd diff --git a/examples/matlab/Pose2SLAMExample_circle.m b/examples/matlab/Pose2SLAMExample_circle.m new file mode 100644 index 000000000..7e7ab6694 --- /dev/null +++ b/examples/matlab/Pose2SLAMExample_circle.m @@ -0,0 +1,48 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create a hexagon of poses +hexagon = pose2SLAMValues_Circle(6,1.0); +p0 = hexagon.pose(0); +p1 = hexagon.pose(1); + +%% create a Pose graph with one equality constraint and one measurement +fg = pose2SLAMGraph; +fg.addPoseConstraint(0, p0); +delta = p0.between(p1); +covariance = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 5*pi/180]); +fg.addOdometry(0,1, delta, covariance); +fg.addOdometry(1,2, delta, covariance); +fg.addOdometry(2,3, delta, covariance); +fg.addOdometry(3,4, delta, covariance); +fg.addOdometry(4,5, delta, covariance); +fg.addOdometry(5,0, delta, covariance); + +%% Create initial config +initial = pose2SLAMValues; +initial.insertPose(0, p0); +initial.insertPose(1, hexagon.pose(1).retract([-0.1, 0.1,-0.1]')); +initial.insertPose(2, hexagon.pose(2).retract([ 0.1,-0.1, 0.1]')); +initial.insertPose(3, hexagon.pose(3).retract([-0.1, 0.1,-0.1]')); +initial.insertPose(4, hexagon.pose(4).retract([ 0.1,-0.1, 0.1]')); +initial.insertPose(5, hexagon.pose(5).retract([-0.1, 0.1,-0.1]')); + +%% Plot Initial Estimate +figure(1);clf +plot(initial.xs(),initial.ys(),'g-*'); axis equal + +%% optimize +result = fg.optimize(initial); + +%% Show Result +hold on; plot(result.xs(),result.ys(),'b-*') +result.print(sprintf('\nFinal result:\n')); diff --git a/examples/matlab/Pose3SLAMExample_circle.m b/examples/matlab/Pose3SLAMExample_circle.m new file mode 100644 index 000000000..d1676626c --- /dev/null +++ b/examples/matlab/Pose3SLAMExample_circle.m @@ -0,0 +1,49 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create a hexagon of poses +hexagon = pose3SLAMValues_Circle(6,1.0); +p0 = hexagon.pose(0); +p1 = hexagon.pose(1); + +%% create a Pose graph with one equality constraint and one measurement +fg = pose3SLAMGraph; +fg.addHardConstraint(0, p0); +delta = p0.between(p1); +covariance = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +fg.addConstraint(0,1, delta, covariance); +fg.addConstraint(1,2, delta, covariance); +fg.addConstraint(2,3, delta, covariance); +fg.addConstraint(3,4, delta, covariance); +fg.addConstraint(4,5, delta, covariance); +fg.addConstraint(5,0, delta, covariance); + +%% Create initial config +initial = pose3SLAMValues; +s = 0.10; +initial.insertPose(0, p0); +initial.insertPose(1, hexagon.pose(1).retract(s*randn(6,1))); +initial.insertPose(2, hexagon.pose(2).retract(s*randn(6,1))); +initial.insertPose(3, hexagon.pose(3).retract(s*randn(6,1))); +initial.insertPose(4, hexagon.pose(4).retract(s*randn(6,1))); +initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); + +%% Plot Initial Estimate +figure(1);clf +plot3(initial.xs(),initial.ys(),initial.zs(),'g-*'); axis equal + +%% optimize +result = fg.optimize(initial); + +%% Show Result +hold on; plot3(result.xs(),result.ys(),result.zs(),'b-*') +result.print(sprintf('\nFinal result:\n')); diff --git a/examples/matlab/Pose3SLAMExample_graph.m b/examples/matlab/Pose3SLAMExample_graph.m new file mode 100644 index 000000000..a42484484 --- /dev/null +++ b/examples/matlab/Pose3SLAMExample_graph.m @@ -0,0 +1,28 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Initialize graph, initial estimate, and odometry noise +model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +[graph,initial]=load3D('../Data/sphere_smallnoise.graph',model,100); + +%% Fix first pose +first = initial.pose(0); +graph.addHardConstraint(0, first); % add directly to graph + +%% Plot Initial Estimate +figure(1);clf +plot3(initial.xs(),initial.ys(),initial.zs(),'g-'); hold on +plot3(first.x(),first.y(),first.z(),'r*'); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initial); +hold on; plot3(result.xs(),result.ys(),result.zs(),'b-');axis equal; \ No newline at end of file diff --git a/examples/matlab/load3D.m b/examples/matlab/load3D.m new file mode 100644 index 000000000..0ed6ecd61 --- /dev/null +++ b/examples/matlab/load3D.m @@ -0,0 +1,38 @@ +function [graph,initial] = load3D(filename,model,N) +% load3D: read TORO 3D pose graph +% cannot read noise model from file yet, uses specified model +fid = fopen(filename); +if fid < 0 + error(['load2D: Cannot open file ' filename]); +end + +% scan all lines into a cell array +columns=textscan(fid,'%s','delimiter','\n'); +fclose(fid); +lines=columns{1}; + +% loop over lines and add vertices +graph = pose3SLAMGraph; +initial = pose3SLAMValues; +n=size(lines,1); +if nargin<3, N=n;end + +for i=1:n + line_i=lines{i}; + if strcmp('VERTEX3',line_i(1:7)) + v = textscan(line_i,'%s %d %f %f %f %f %f %f',1); + if v{2} +namespace pose3SLAM { + +class Values { + Values(); + size_t size() const; + void print(string s) const; + static pose3SLAM::Values Circle(size_t n, double R); + void insertPose(size_t key, const gtsam::Pose3& pose); + gtsam::Pose3 pose(size_t i); + Vector xs() const; + Vector ys() const; + Vector zs() const; +}; + +class Graph { + Graph(); + + // FactorGraph + void print(string s) const; + bool equals(const pose3SLAM::Graph& fg, double tol) const; + size_t size() const; + bool empty() const; + void remove(size_t i); + size_t nrFactors() const; + + // NonlinearFactorGraph + double error(const pose3SLAM::Values& values) const; + double probPrime(const pose3SLAM::Values& values) const; + gtsam::Ordering* orderingCOLAMD(const pose3SLAM::Values& values) const; + gtsam::GaussianFactorGraph* linearize(const pose3SLAM::Values& values, + const gtsam::Ordering& ordering) const; + + // pose3SLAM-specific + void addPrior(size_t key, const gtsam::Pose3& p, const gtsam::SharedNoiseModel& model); + void addConstraint(size_t key1, size_t key2, const gtsam::Pose3& z, const gtsam::SharedNoiseModel& model); + void addHardConstraint(size_t i, const gtsam::Pose3& p); + pose3SLAM::Values optimize(const pose3SLAM::Values& initialEstimate) const; + gtsam::Marginals marginals(const pose3SLAM::Values& solution) const; +}; + +}///\namespace pose3SLAM + //************************************************************************* // planarSLAM //************************************************************************* @@ -488,9 +542,10 @@ namespace planarSLAM { class Values { Values(); + size_t size() const; + void print(string s) const; void insertPose(size_t key, const gtsam::Pose2& pose); void insertPoint(size_t key, const gtsam::Point2& point); - void print(string s) const; gtsam::Pose2 pose(size_t key) const; gtsam::Point2 point(size_t key) const; }; @@ -498,25 +553,30 @@ class Values { class Graph { Graph(); + // FactorGraph void print(string s) const; + bool equals(const planarSLAM::Graph& fg, double tol) const; + size_t size() const; + bool empty() const; + void remove(size_t i); + size_t nrFactors() const; + // NonlinearFactorGraph double error(const planarSLAM::Values& values) const; + double probPrime(const planarSLAM::Values& values) const; gtsam::Ordering* orderingCOLAMD(const planarSLAM::Values& values) const; gtsam::GaussianFactorGraph* linearize(const planarSLAM::Values& values, const gtsam::Ordering& ordering) const; - void addPrior(size_t key, const gtsam::Pose2& pose, - const gtsam::SharedNoiseModel& noiseModel); + // planarSLAM-specific + void addPrior(size_t key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); void addPoseConstraint(size_t key, const gtsam::Pose2& pose); - void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, - const gtsam::SharedNoiseModel& noiseModel); - void addBearing(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, - const gtsam::SharedNoiseModel& noiseModel); - void addRange(size_t poseKey, size_t pointKey, double range, - const gtsam::SharedNoiseModel& noiseModel); - void addBearingRange(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, - double range, const gtsam::SharedNoiseModel& noiseModel); + void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); + void addBearing(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, const gtsam::SharedNoiseModel& noiseModel); + void addRange(size_t poseKey, size_t pointKey, double range, const gtsam::SharedNoiseModel& noiseModel); + void addBearingRange(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing,double range, const gtsam::SharedNoiseModel& noiseModel); planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate); + gtsam::Marginals marginals(const planarSLAM::Values& solution) const; }; class Odometry { diff --git a/gtsam/slam/planarSLAM.h b/gtsam/slam/planarSLAM.h index f45c3bc86..5d03cd646 100644 --- a/gtsam/slam/planarSLAM.h +++ b/gtsam/slam/planarSLAM.h @@ -24,8 +24,13 @@ #include #include #include +#include #include +/** + * @defgroup SLAM + */ + // Use planarSLAM namespace for specific SLAM instance namespace planarSLAM { @@ -48,9 +53,9 @@ namespace planarSLAM { /// A factor between a pose and a point to express difference in rotation and location typedef BearingRangeFactor BearingRange; - /** - * Values class, using specific poses and points - * Mainly as a convenience for MATLAB wrapper, which does not allow for identically named methods + /* + * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper + * @ingroup SLAM */ struct Values: public gtsam::Values { @@ -75,7 +80,10 @@ namespace planarSLAM { void insertPoint(Key j, const Point2& point) { insert(j, point); } }; - /// Creates a NonlinearFactorGraph with the Values type + /** + * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper + * @ingroup SLAM + */ struct Graph: public NonlinearFactorGraph { /// Default constructor for a NonlinearFactorGraph @@ -104,6 +112,11 @@ namespace planarSLAM { /// Optimize Values optimize(const Values& initialEstimate) const; + + /// Return a Marginals object + Marginals marginals(const Values& solution) const { + return Marginals(*this,solution); + } }; } // planarSLAM diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp index a1e5932d9..49ab37111 100644 --- a/gtsam/slam/pose2SLAM.cpp +++ b/gtsam/slam/pose2SLAM.cpp @@ -23,7 +23,7 @@ namespace pose2SLAM { /* ************************************************************************* */ - Values circle(size_t n, double R) { + Values Values::Circle(size_t n, double R) { Values x; double theta = 0, dtheta = 2 * M_PI / n; for (size_t i = 0; i < n; i++, theta += dtheta) diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 5668f8ad0..d7ebd3323 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -30,7 +30,10 @@ namespace pose2SLAM { using namespace gtsam; - /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper + /* + * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper + * @ingroup SLAM + */ struct Values: public gtsam::Values { typedef boost::shared_ptr shared_ptr; @@ -43,6 +46,15 @@ namespace pose2SLAM { gtsam::Values(values) { } + /** + * Create a circle of n 2D poses tangent to circle of radius R, first pose at (R,0) + * @param n number of poses + * @param R radius of circle + * @param c character to use for keys + * @return circle of n 2D poses + */ + static Values Circle(size_t n, double R); + /// insert a pose void insertPose(Key i, const Pose2& pose) { insert(i, pose); } @@ -54,15 +66,6 @@ namespace pose2SLAM { Vector thetas() const; ///< get all orientations in a matrix }; - /** - * Create a circle of n 2D poses tangent to circle of radius R, first pose at (R,0) - * @param n number of poses - * @param R radius of circle - * @param c character to use for keys - * @return circle of n 2D poses - */ - Values circle(size_t n, double R); - /** * List of typedefs for factors */ @@ -74,7 +77,10 @@ namespace pose2SLAM { /// A factor to add an odometry measurement between two poses. typedef BetweenFactor Odometry; - /// Graph + /** + * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper + * @ingroup SLAM + */ struct Graph: public NonlinearFactorGraph { typedef boost::shared_ptr shared_ptr; diff --git a/gtsam/slam/pose3SLAM.cpp b/gtsam/slam/pose3SLAM.cpp index ffce28fe7..c7f8a29c5 100644 --- a/gtsam/slam/pose3SLAM.cpp +++ b/gtsam/slam/pose3SLAM.cpp @@ -22,7 +22,7 @@ namespace pose3SLAM { /* ************************************************************************* */ - Values circle(size_t n, double radius) { + Values Values::Circle(size_t n, double radius) { Values x; double theta = 0, dtheta = 2 * M_PI / n; // We use aerospace/navlab convention, X forward, Y right, Z down @@ -41,6 +41,36 @@ namespace pose3SLAM { return x; } + /* ************************************************************************* */ + Vector Values::xs() const { + size_t j=0; + Vector result(size()); + ConstFiltered poses = filter(); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.x(); + return result; + } + + /* ************************************************************************* */ + Vector Values::ys() const { + size_t j=0; + Vector result(size()); + ConstFiltered poses = filter(); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.y(); + return result; + } + + /* ************************************************************************* */ + Vector Values::zs() const { + size_t j=0; + Vector result(size()); + ConstFiltered poses = filter(); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.z(); + return result; + } + /* ************************************************************************* */ void Graph::addPrior(Key i, const Pose3& p, const SharedNoiseModel& model) { sharedFactor factor(new Prior(i, p, model)); diff --git a/gtsam/slam/pose3SLAM.h b/gtsam/slam/pose3SLAM.h index f81070818..448914f0d 100644 --- a/gtsam/slam/pose3SLAM.h +++ b/gtsam/slam/pose3SLAM.h @@ -17,25 +17,53 @@ #pragma once -#include #include #include #include #include #include +#include +#include /// Use pose3SLAM namespace for specific SLAM instance namespace pose3SLAM { using namespace gtsam; - /** - * Create a circle of n 3D poses tangent to circle of radius R, first pose at (R,0) - * @param n number of poses - * @param R radius of circle - * @return circle of n 3D poses + /* + * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper + * @ingroup SLAM */ - Values circle(size_t n, double R); + struct Values: public gtsam::Values { + + typedef boost::shared_ptr shared_ptr; + + /// Default constructor + Values() {} + + /// Copy constructor + Values(const gtsam::Values& values) : + gtsam::Values(values) { + } + + /** + * Create a circle of n 3D poses tangent to circle of radius R, first pose at (R,0) + * @param n number of poses + * @param R radius of circle + * @return circle of n 3D poses + */ + static Values Circle(size_t n, double R); + + /// insert a pose + void insertPose(Key i, const Pose3& pose) { insert(i, pose); } + + /// get a pose + Pose3 pose(Key i) const { return at(i); } + + Vector xs() const; ///< get all x coordinates in a matrix + Vector ys() const; ///< get all y coordinates in a matrix + Vector zs() const; ///< get all z coordinates in a matrix + }; /// A prior factor on Key with Pose3 data type. typedef PriorFactor Prior; @@ -44,7 +72,10 @@ namespace pose3SLAM { /// A hard constraint would enforce that the given key would have the input value in the results. typedef NonlinearEquality HardConstraint; - /// Graph + /** + * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper + * @ingroup SLAM + */ struct Graph: public NonlinearFactorGraph { /// Adds a factor between keys of the same type @@ -61,6 +92,10 @@ namespace pose3SLAM { return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); } + /// Return a Marginals object + Marginals marginals(const Values& solution) const { + return Marginals(*this,solution); + } }; } // pose3SLAM diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 7f329f1cb..55558b106 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -195,7 +195,7 @@ TEST_UNSAFE(Pose2SLAM, optimize) { TEST_UNSAFE(Pose2SLAM, optimizeThreePoses) { // Create a hexagon of poses - pose2SLAM::Values hexagon = pose2SLAM::circle(3,1.0); + pose2SLAM::Values hexagon = pose2SLAM::Values::Circle(3,1.0); Pose2 p0 = hexagon.pose(0), p1 = hexagon.pose(1); // create a Pose graph with one equality constraint and one measurement @@ -231,7 +231,7 @@ TEST_UNSAFE(Pose2SLAM, optimizeThreePoses) { TEST_UNSAFE(Pose2SLAM, optimizeCircle) { // Create a hexagon of poses - pose2SLAM::Values hexagon = pose2SLAM::circle(6,1.0); + pose2SLAM::Values hexagon = pose2SLAM::Values::Circle(6,1.0); Pose2 p0 = hexagon.pose(0), p1 = hexagon.pose(1); // create a Pose graph with one equality constraint and one measurement @@ -366,7 +366,7 @@ TEST_UNSAFE(Pose2Values, pose2Circle ) expected.insert(2, Pose2(-1, 0, - M_PI_2)); expected.insert(3, Pose2( 0, -1, 0 )); - pose2SLAM::Values actual = pose2SLAM::circle(4,1.0); + pose2SLAM::Values actual = pose2SLAM::Values::Circle(4,1.0); CHECK(assert_equal(expected,actual)); } @@ -381,7 +381,7 @@ TEST_UNSAFE(Pose2SLAM, expmap ) expected.insert(3, Pose2( 0.1, -1, 0 )); // Note expmap coordinates are in local coordinates, so shifting to right requires thought !!! - pose2SLAM::Values circle(pose2SLAM::circle(4,1.0)); + pose2SLAM::Values circle = pose2SLAM::Values::Circle(4,1.0); Ordering ordering(*circle.orderingArbitrary()); VectorValues delta(circle.dims(ordering)); delta[ordering[0]] = Vector_(3, 0.0,-0.1,0.0); diff --git a/gtsam/slam/tests/testPose3SLAM.cpp b/gtsam/slam/tests/testPose3SLAM.cpp index 4ebe7d27f..46a1c35c5 100644 --- a/gtsam/slam/tests/testPose3SLAM.cpp +++ b/gtsam/slam/tests/testPose3SLAM.cpp @@ -43,7 +43,7 @@ TEST(Pose3Graph, optimizeCircle) { // Create a hexagon of poses double radius = 10; - Values hexagon = pose3SLAM::circle(6,radius); + Values hexagon = pose3SLAM::Values::Circle(6,radius); Pose3 gT0 = hexagon.at(0), gT1 = hexagon.at(1); // create a Pose graph with one equality constraint and one measurement @@ -179,7 +179,7 @@ TEST( Values, pose3Circle ) expected.insert(2, Pose3(R3, Point3(-1, 0, 0))); expected.insert(3, Pose3(R4, Point3( 0,-1, 0))); - Values actual = pose3SLAM::circle(4,1.0); + Values actual = pose3SLAM::Values::Circle(4,1.0); CHECK(assert_equal(expected,actual)); } @@ -199,7 +199,7 @@ TEST( Values, expmap ) 0.0,0.0,0.0, 0.1, 0.0, 0.0, 0.0,0.0,0.0, 0.1, 0.0, 0.0, 0.0,0.0,0.0, 0.1, 0.0, 0.0); - Values actual = pose3SLAM::circle(4,1.0).retract(delta, ordering); + Values actual = pose3SLAM::Values::Circle(4,1.0).retract(delta, ordering); CHECK(assert_equal(expected,actual)); } From ae78b89c6f6cd1edf66d6e20d6d0a25719572eec Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 4 Jun 2012 02:41:14 +0000 Subject: [PATCH 119/914] finished wrapping visualSLAM namespace --- examples/vSLAMexample/vISAMexample.cpp | 4 +- gtsam.h | 74 ++++++++++++++++++++++++++ gtsam/slam/visualSLAM.cpp | 4 +- gtsam/slam/visualSLAM.h | 16 +++++- 4 files changed, 92 insertions(+), 6 deletions(-) diff --git a/examples/vSLAMexample/vISAMexample.cpp b/examples/vSLAMexample/vISAMexample.cpp index 16c250953..7b37a57fb 100644 --- a/examples/vSLAMexample/vISAMexample.cpp +++ b/examples/vSLAMexample/vISAMexample.cpp @@ -78,7 +78,7 @@ void readAllDataISAM() { /** * Setup newFactors and initialValues for each new pose and set of measurements at each frame. */ -void createNewFactors(shared_ptr& newFactors, boost::shared_ptr& initialValues, +void createNewFactors(shared_ptr& newFactors, boost::shared_ptr& initialValues, int pose_id, const Pose3& pose, const std::vector& measurements, SharedNoiseModel measurementSigma, shared_ptrK calib) { // Create a graph of newFactors with new measurements @@ -99,7 +99,7 @@ void createNewFactors(shared_ptr& newFactors, boost::shared_p } // Create initial values for all nodes in the newFactors - initialValues = shared_ptr (new Values()); + initialValues = shared_ptr (new visualSLAM::Values()); initialValues->insert(X(pose_id), pose); for (size_t i = 0; i < measurements.size(); i++) { initialValues->insert(L(measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); diff --git a/gtsam.h b/gtsam.h index 64dbf1cec..f1e6fff45 100644 --- a/gtsam.h +++ b/gtsam.h @@ -81,6 +81,18 @@ class Point2 { gtsam::Point2 retract(Vector v); }; +class StereoPoint2 { + StereoPoint2(); + StereoPoint2(double uL, double uR, double v); + static gtsam::StereoPoint2 Expmap(Vector v); + static Vector Logmap(const gtsam::StereoPoint2& p); + void print(string s) const; + Vector localCoordinates(const gtsam::StereoPoint2& p); + gtsam::StereoPoint2 compose(const gtsam::StereoPoint2& p2); + gtsam::StereoPoint2 between(const gtsam::StereoPoint2& p2); + gtsam::StereoPoint2 retract(Vector v); +}; + class Point3 { Point3(); Point3(double x, double y, double z); @@ -207,6 +219,20 @@ class Pose3 { gtsam::Rot3 rotation() const; }; +class Cal3_S2 { + Cal3_S2(); + Cal3_S2(double fx, double fy, double s, double u0, double v0); + + void print(string s) const; +}; + +class Cal3_S2Stereo { + Cal3_S2Stereo(); + Cal3_S2Stereo(double fx, double fy, double s, double u0, double v0, double b); + + void print(string s) const; +}; + class CalibratedCamera { CalibratedCamera(); @@ -635,3 +661,51 @@ class Graph { // TODO: add factors, etc. }///\namespace simulated2DOriented + +//************************************************************************* +// VisualSLAM +//************************************************************************* + +#include +namespace visualSLAM { + +class Values { + Values(); + void insertPose(size_t key, const gtsam::Pose3& pose); + void insertPoint(size_t key, const gtsam::Point3& pose); + size_t size() const; + void print(string s) const; + gtsam::Pose3 pose(size_t i); + gtsam::Point3 point(size_t j); +}; + +class Graph { + Graph(); + + void print(string s) const; + + double error(const pose2SLAM::Values& values) const; + gtsam::Ordering* orderingCOLAMD(const pose2SLAM::Values& values) const; + gtsam::GaussianFactorGraph* linearize(const pose2SLAM::Values& values, + const gtsam::Ordering& ordering) const; + + // Measurements + void addMeasurement(const gtsam::Point2& measured, const gtsam::SharedNoiseModel& model, + size_t poseKey, size_t pointKey, const gtsam::Cal3_S2* K); + void addStereoMeasurement(const gtsam::StereoPoint2& measured, const gtsam::SharedNoiseModel& model, + size_t poseKey, size_t pointKey, const gtsam::Cal3_S2Stereo* K); + + // Constraints + void addPoseConstraint(size_t poseKey, const gtsam::Pose3& p); + void addPointConstraint(size_t pointKey, const gtsam::Point3& p); + + // Priors + void addPosePrior(size_t poseKey, const gtsam::Pose3& p, const gtsam::SharedNoiseModel& model); + void addPointPrior(size_t pointKey, const gtsam::Point3& p, const gtsam::SharedNoiseModel& model); + void addRangeFactor(size_t poseKey, size_t pointKey, double range, const gtsam::SharedNoiseModel& model); + + visualSLAM::Values optimize(const visualSLAM::Values& initialEstimate) const; + gtsam::Marginals marginals(const visualSLAM::Values& solution) const; +}; + +}///\namespace visualSLAM diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 346455063..f4cdb0af3 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -22,14 +22,14 @@ namespace visualSLAM { /* ************************************************************************* */ void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrK& K) { + Key poseKey, Key pointKey, const shared_ptrK K) { boost::shared_ptr factor(new ProjectionFactor(measured, model, poseKey, pointKey, K)); push_back(factor); } /* ************************************************************************* */ void Graph::addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrKStereo& K) { + Key poseKey, Key pointKey, const shared_ptrKStereo K) { boost::shared_ptr factor(new StereoFactor(measured, model, poseKey, pointKey, K)); push_back(factor); } diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index f13755836..f71d0c4ca 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -62,9 +63,15 @@ namespace visualSLAM { /// insert a pose void insertPose(Key i, const Pose3& pose) { insert(i, pose); } + /// insert a point + void insertPoint(Key j, const Point3& point) { insert(j, point); } + /// get a pose Pose3 pose(Key i) const { return at(i); } + /// get a point + Point3 point(Key j) const { return at(j); } + }; /** @@ -99,7 +106,7 @@ namespace visualSLAM { * @param K shared pointer to calibration object */ void addMeasurement(const Point2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrK& K); + Key poseKey, Key pointKey, const shared_ptrK K); /** * Add a stereo factor measurement @@ -110,7 +117,7 @@ namespace visualSLAM { * @param K shared pointer to stereo calibration object */ void addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrKStereo& K); + Key poseKey, Key pointKey, const shared_ptrKStereo K); /** * Add a constraint on a pose (for now, *must* be satisfied in any Values) @@ -162,6 +169,11 @@ namespace visualSLAM { return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); } + /// Return a Marginals object + Marginals marginals(const Values& solution) const { + return Marginals(*this,solution); + } + }; // Graph } // namespaces From aedaec8135125f3059abc4b7dcc3b559776fcc72 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 4 Jun 2012 02:50:41 +0000 Subject: [PATCH 120/914] bugfix --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index f1e6fff45..1a227b319 100644 --- a/gtsam.h +++ b/gtsam.h @@ -684,7 +684,7 @@ class Graph { void print(string s) const; - double error(const pose2SLAM::Values& values) const; + double error(const visualSLAM::Values& values) const; gtsam::Ordering* orderingCOLAMD(const pose2SLAM::Values& values) const; gtsam::GaussianFactorGraph* linearize(const pose2SLAM::Values& values, const gtsam::Ordering& ordering) const; From 28801525e35f392486e42db193c6d6f4260f615c Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 4 Jun 2012 02:51:49 +0000 Subject: [PATCH 121/914] two more small fixes --- gtsam.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam.h b/gtsam.h index 1a227b319..48a205e2e 100644 --- a/gtsam.h +++ b/gtsam.h @@ -685,8 +685,8 @@ class Graph { void print(string s) const; double error(const visualSLAM::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const pose2SLAM::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const pose2SLAM::Values& values, + gtsam::Ordering* orderingCOLAMD(const visualSLAM::Values& values) const; + gtsam::GaussianFactorGraph* linearize(const visualSLAM::Values& values, const gtsam::Ordering& ordering) const; // Measurements From 198279f4ff47fad3a8861c664a5bf6185c51e401 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 05:51:36 +0000 Subject: [PATCH 122/914] Michael's example with our conventions... --- examples/Data/sphere2500.txt | 4949 ++++++++++++++++++++++ examples/Data/sphere2500_groundtruth.txt | 4949 ++++++++++++++++++++++ 2 files changed, 9898 insertions(+) create mode 100644 examples/Data/sphere2500.txt create mode 100644 examples/Data/sphere2500_groundtruth.txt diff --git a/examples/Data/sphere2500.txt b/examples/Data/sphere2500.txt new file mode 100644 index 000000000..dd76a3c8d --- /dev/null +++ b/examples/Data/sphere2500.txt @@ -0,0 +1,4949 @@ +EDGE3 0 1 0.341895 -0.0416997 0.0330394 -0.00305942 0.00822248 0.1802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1 2 0.229005 0.138346 -0.0985239 -0.00165533 0.0168837 0.111357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2 3 0.134845 -0.100952 -0.235999 -0.00238046 -0.00487134 0.120841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 3 4 0.160394 0.0789167 -0.144281 0.00735169 -5.00329e-05 0.153437 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 4 5 0.325826 -0.0659292 -0.0839178 -0.0155927 0.00860976 0.170047 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 5 6 0.204328 -0.0241672 -0.0128254 -0.00899836 0.00684956 0.0630334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 6 7 0.259333 -0.220076 -0.122115 0.0124792 0.0181515 0.151092 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 7 8 0.330423 -0.218479 0.184829 -0.00315405 0.00835744 0.119863 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 8 9 0.279749 -0.0817312 -0.0311683 0.0129414 0.00155956 0.0807447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 9 10 0.439651 -0.036304 -0.0979001 -0.0188992 -0.00969819 0.153405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 10 11 0.448391 0.0194033 -0.0588868 -0.00494734 0.0022853 0.133584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 11 12 0.601774 -0.00596884 -0.0316864 0.0135014 -0.000518361 0.149296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 12 13 0.0850905 -0.0358214 0.0945044 0.00108708 -0.00405567 0.0956726 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 13 14 0.406341 -0.0979121 0.0146315 -0.00708947 0.00952537 0.0850412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 14 15 0.34657 0.120479 -0.0772302 0.011385 -0.0136623 0.132946 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 15 16 0.456464 -0.230793 0.0240143 -0.0126459 0.00734671 0.157528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 16 17 0.514306 -0.0150626 -0.0145896 -0.00750411 0.00513844 0.227827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 17 18 0.534286 0.253572 0.100366 -0.00394475 0.02339 0.14888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 18 19 0.345823 0.105393 0.0308981 0.000962285 0.00837484 0.0281836 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 19 20 0.46807 -0.0543662 0.0352444 -0.00353143 0.0115196 0.0685084 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 20 21 0.569866 0.153941 0.181648 0.00462734 0.0263004 0.0594094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 21 22 0.48147 -0.165285 -0.024962 0.00338119 0.0215372 0.0682864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 22 23 0.457005 -0.154486 0.111581 -0.00610449 0.0139356 0.159452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 23 24 0.460068 0.0012191 -0.000311304 0.0160318 0.0121493 0.154983 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 24 25 0.505705 -0.0457969 0.0571836 0.00455934 0.00520171 0.186015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 25 26 0.396066 -0.0147835 0.0752318 0.00398689 0.00314298 0.111818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 26 27 0.554342 -0.082874 0.0195301 -0.000183441 0.0103731 0.143704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 27 28 0.405677 -0.0164516 -0.14359 0.00905256 0.020269 0.165999 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 28 29 0.366064 0.109363 0.0995936 -0.0117813 0.0132566 0.0900062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 29 30 0.447825 -0.0626529 -0.073141 0.00491515 0.00257864 0.162262 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 30 31 0.446624 -0.149658 0.0423714 0.00803511 0.0203393 0.146502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 31 32 0.327353 -0.0599871 0.00611897 0.018532 0.00795743 0.120627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 32 33 0.709329 -0.188287 0.0378529 -0.0021579 0.0227656 0.167402 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 33 34 0.428707 0.162405 0.00594776 -0.0121099 0.00270696 0.145808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 34 35 0.356338 0.033284 -0.199599 -0.0140608 0.0128365 0.185326 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 35 36 0.521019 -0.0505509 -0.164282 -0.0129157 0.0206636 0.156898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 36 37 0.329602 0.0156168 0.0525484 0.00677584 0.0125686 0.198656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 37 38 0.366813 -0.0752683 -0.115229 0.00276851 0.0200873 0.0678134 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 38 39 0.618377 0.0578938 0.103393 0.0141113 0.00361122 0.13266 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 39 40 0.636906 0.157098 -0.0500064 -0.015852 0.0169927 0.0801991 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 40 41 0.55055 0.0364808 -0.0365541 0.00986673 0.019174 0.0917538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 41 42 0.660865 0.171451 -0.110704 -0.0094262 0.0176371 0.150958 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 42 43 0.502157 0.166008 -0.0195176 -0.00328711 0.0132678 0.0951723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 43 44 0.494995 0.0325404 -0.0791926 -0.000984901 0.0261799 0.016442 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 44 45 0.357421 -0.179353 -0.253832 -0.00177872 0.0336155 0.111331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 45 46 0.549017 -0.0323211 0.0437218 -0.0199969 0.014327 0.0995373 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 46 47 0.59857 -0.0825892 -0.0750772 -0.00203336 0.00684634 0.157466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 47 48 0.634876 -0.0183952 0.0245626 -0.00470859 0.012947 0.150374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 48 49 0.542938 -0.115345 0.00522098 0.00766275 0.0289495 0.159793 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 49 50 0.786233 0.0643949 -0.139267 0.00527237 0.0170935 0.178381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 0 50 0.123684 -3.04765 -0.0287081 0.0530372 -0.0120609 -0.0849653 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 50 51 0.670888 -0.239288 0.144786 0.0122646 0.00233746 0.0980908 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1 51 -0.119112 -3.01805 -0.0691574 0.062941 -0.00919775 -0.0807439 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 51 52 0.988066 -0.119053 0.079414 -0.0073222 0.0152928 0.110527 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2 52 -0.245056 -2.86505 -0.129966 0.0741988 0.00212195 -0.00388232 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 52 53 0.550309 0.112491 -0.159187 -0.00202003 0.0132805 0.0357324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 3 53 -0.0837652 -3.07691 -0.138081 0.0598365 -0.00661566 -0.00823764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 53 54 0.638918 0.0661151 0.0442451 0.00714191 0.00528336 0.0763707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 4 54 -0.0711695 -2.97051 -0.100013 0.0618648 0.0103853 -0.00667934 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 54 55 0.62477 -0.00411993 -0.0479437 0.000918363 0.0215121 0.102648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 5 55 0.100612 -3.03312 -0.090605 0.0466845 0.00534488 0.0147111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 55 56 0.765626 -0.0632934 -0.14521 0.00169523 0.0125478 0.123455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 6 56 0.0371277 -3.07963 -0.176527 0.0621802 0.00868157 -0.0494556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 56 57 0.780791 0.0445135 0.076528 0.0146365 0.0234281 0.0577835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 7 57 0.104692 -3.09555 -0.120551 0.0713038 0.000495396 0.0600088 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 57 58 0.677334 0.0523832 -0.129781 0.00652229 0.00917402 0.0769604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 8 58 0.00719936 -3.14389 -0.027828 0.0624536 0.00342915 -0.0442992 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 58 59 0.770904 0.00617635 -0.0745303 0.00312528 0.0267292 0.122643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 9 59 0.0926379 -3.00401 -0.0471469 0.0624169 -0.000724871 0.0195497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 59 60 0.774808 -0.135367 -0.0248524 -0.00390813 0.00350772 0.158576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 10 60 0.0708412 -3.06927 -0.0337878 0.0617057 0.00304641 -0.013248 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 60 61 0.479333 -0.0126589 -0.102246 0.0136302 0.00491826 0.182465 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 11 61 0.154444 -3.02448 -0.160338 0.0570176 -0.00126667 0.0980274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 61 62 0.797582 0.0438476 0.0310194 0.00323644 0.0280618 0.149832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 12 62 0.178067 -3.03583 -0.146661 0.0667198 -0.00346562 -0.0308351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 62 63 0.742007 0.107876 -0.103637 0.00312823 0.00702323 0.185749 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 13 63 0.113612 -3.13653 0.00541842 0.0425655 0.00547184 0.0944204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 63 64 0.689769 0.199185 0.0815092 0.00595832 0.0212964 0.191178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 14 64 -0.191278 -3.10587 -0.315564 0.0792905 -0.0108376 -0.0168051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 64 65 0.925214 0.170788 -0.0242523 0.000629209 0.00328006 0.094619 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 15 65 -0.0746119 -3.10285 -0.027189 0.0672817 -0.0130186 -0.00728663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 65 66 0.706086 0.26849 -0.0748405 -0.00176989 0.0120543 0.117096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 16 66 0.00767487 -2.90585 -0.0636412 0.0677065 -0.00101756 0.0539061 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 66 67 0.638484 -0.0754865 -0.0200711 0.00257019 0.0237712 0.0978569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 17 67 0.0348257 -3.07488 0.0865152 0.0564331 -0.0325694 -0.0386875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 67 68 0.856711 0.0944398 0.0924844 0.0176543 0.0199852 0.162469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 18 68 0.034272 -2.9771 -0.0275615 0.0596048 -0.00746308 -0.022851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 68 69 0.833231 0.0810845 -0.168993 -0.0104211 0.0256571 0.121276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 19 69 0.0414539 -2.94622 -0.147426 0.0339762 0.0020352 0.0597721 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 69 70 0.657439 -0.0980627 -0.177485 -0.00599363 0.0139985 0.0703728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 20 70 -0.0269102 -2.79063 -0.0848862 0.07 0.00218479 -0.022311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 70 71 0.706164 -0.049235 -0.0823152 0.00304587 0.00223893 0.0819797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 21 71 -0.0671743 -3.07386 -0.0497795 0.0413955 0.00343211 0.0236128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 71 72 0.747846 -0.0790405 0.0165401 -0.00427178 -0.0167707 0.161205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 22 72 -0.0362474 -3.05248 -0.160313 0.0548681 0.00678718 0.0033359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 72 73 0.920407 -0.0152539 0.117976 0.0108622 0.011454 0.145331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 23 73 0.119773 -3.09523 -0.13553 0.071927 0.0117753 0.0781413 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 73 74 0.517825 0.0136797 -0.0438358 0.00960028 -0.00581963 0.0677343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 24 74 0.14435 -2.94311 -0.0670919 0.0550877 0.00814789 0.0152755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 74 75 0.830853 -0.144022 -0.147814 0.00188492 0.0273945 0.156717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 25 75 0.0212556 -3.1875 -0.154731 0.0599553 -0.00954908 0.0151185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 75 76 0.75027 -0.0799915 -0.0511733 -0.00332044 0.024846 0.116136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 26 76 0.0657844 -3.08702 -0.00356366 0.0551804 0.00618433 0.0365075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 76 77 0.906628 0.0631322 0.137461 -0.00533686 0.041319 0.134266 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 27 77 -0.0102091 -2.86533 0.139962 0.0316793 0.00190037 -0.0466061 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 77 78 0.727647 -0.028039 0.00313257 -0.0121147 0.0101058 0.0317401 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 28 78 -0.116977 -3.13993 -0.0097921 0.0610097 0.00271574 0.038266 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 78 79 0.732052 -0.0104581 -0.178661 0.00100567 0.0259595 0.130936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 29 79 -0.0591044 -3.10293 -0.164402 0.0778681 -0.0135122 -0.0160974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 79 80 0.866 0.115588 -0.170978 0.0205527 0.0208347 0.158125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 30 80 -0.192369 -3.0277 0.0384235 0.0683819 -0.00885277 -0.0211964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 80 81 0.918307 0.211437 -0.0455169 0.0101531 0.0110553 0.0215029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 31 81 -0.0590693 -3.17731 -0.0370921 0.0778469 -8.21782e-05 -0.0427244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 81 82 0.660276 -0.0939153 0.0456885 -0.0102971 0.0148405 0.148103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 32 82 0.0104447 -2.95858 -0.123556 0.0650866 0.0103634 -0.0189355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 82 83 0.808712 0.0158234 0.0759911 0.0163393 0.0257923 0.102308 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 33 83 -0.166851 -3.00612 -0.0390378 0.0577458 0.0108401 -0.0267258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 83 84 0.977589 -0.0806277 -0.0165069 0.00213041 -0.00959509 0.0372927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 34 84 -0.0838249 -2.94966 -0.159055 0.0583742 0.0147493 -0.0694411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 84 85 0.931384 -0.0211719 0.045156 0.00756331 0.0138164 0.0928838 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 35 85 -0.0330709 -3.08556 -0.027849 0.0752036 -0.00987694 -0.0274941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 85 86 0.847935 0.105966 -0.0790951 0.00428931 0.00828281 0.140235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 36 86 0.0352295 -3.03801 -0.120413 0.0595869 -0.00147408 -0.0323874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 86 87 0.816373 -0.0484386 0.0967984 0.00611094 0.0188194 0.11687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 37 87 0.0288712 -3.21631 0.0677728 0.0650017 0.0149769 0.0713844 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 87 88 1.09479 0.103914 -0.166369 0.00657754 0.0309438 0.13905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 38 88 -0.0353526 -2.88279 -0.148361 0.075654 0.00102302 0.0378177 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 88 89 0.951079 0.0478632 0.079033 0.000633434 0.0269522 0.148837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 39 89 -0.00830657 -3.0073 0.00305971 0.0371114 -0.0114751 -0.0340174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 89 90 0.898548 0.0121024 -0.0233981 -0.00845966 0.0260817 0.0816812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 40 90 0.0777223 -2.85121 0.0761198 0.0645183 0.011419 0.0371427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 90 91 0.986115 0.0617607 -0.07348 0.0162668 0.0182121 0.138291 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 41 91 0.021105 -3.00492 -0.133593 0.0660761 -0.00215976 -0.0467747 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 91 92 1.19151 -0.125735 -0.140539 0.0172272 0.0115928 0.115608 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 42 92 -0.089812 -3.01466 -0.287607 0.0613892 -0.00326825 0.0134093 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 92 93 0.969192 0.137519 -0.0466096 -0.00273227 0.0170129 0.0609192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 43 93 0.130522 -3.11783 -0.311142 0.0435 0.00716509 -0.0287382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 93 94 0.935602 -0.0420428 -0.278862 0.0049017 0.0236357 0.143001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 44 94 -0.0979209 -2.95504 -0.0934092 0.0514609 -0.00431777 0.060794 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 94 95 0.933126 0.0691404 -0.0493149 0.013523 0.0221061 0.0887086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 45 95 -0.0384673 -3.09158 -0.00400611 0.0764242 -0.0122058 -0.00549579 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 95 96 0.980764 0.00375579 -0.101989 -0.0151014 0.0219557 0.179364 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 46 96 0.107757 -2.94807 -0.0544414 0.0615862 0.000351276 -0.0248295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 96 97 1.12489 -0.0646296 0.0312703 0.0159264 0.0251221 0.166064 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 47 97 0.191799 -2.98088 -0.114885 0.0574689 -0.0206359 0.0206131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 97 98 0.92336 0.12824 -0.110114 -0.00649851 -0.00482511 0.0686087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 48 98 -0.114557 -2.90895 -0.336941 0.0632329 0.00908172 0.00472821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 98 99 0.978164 0.0557018 0.0139987 0.012144 0.0170814 0.0551827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 49 99 0.0447448 -3.17938 -0.0524665 0.0373712 0.0252483 0.0543531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 99 100 1.02609 0.0363458 -0.0675104 -0.00120738 0.00734949 0.0963506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 50 100 0.294107 -2.97696 0.0372275 0.0522773 0.0092289 -0.00933808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 100 101 1.13013 0.028431 -0.203878 0.0192625 -0.00258903 0.121634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 51 101 -0.0215351 -3.05915 -0.14967 0.0579652 -0.00267727 0.0292234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 101 102 0.969271 -0.00770857 0.0840952 0.0192736 0.028709 0.0958533 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 52 102 -0.173278 -3.06042 0.177547 0.062305 0.0012112 0.0126766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 102 103 1.04189 0.021552 -0.101847 0.00109935 6.5766e-05 0.13003 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 53 103 -0.00268539 -3.08559 -0.202858 0.0525346 0.0105739 -0.0401761 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 103 104 1.03192 0.122897 0.253434 -0.00899381 0.0419305 0.136339 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 54 104 0.0433166 -3.06641 -0.116031 0.046668 -0.0105325 0.0487376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 104 105 1.08911 0.113631 -0.230208 0.00445056 0.00934039 0.0489845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 55 105 0.0259222 -2.88869 0.00719153 0.0559624 0.00737045 -0.0210868 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 105 106 1.03026 0.175845 -0.148347 -0.00802826 0.0258392 0.0752439 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 56 106 -0.0785152 -3.13599 -0.180788 0.0626308 0.00787653 -0.0364762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 106 107 1.02205 0.0709188 -0.0572234 -0.00613664 0.0242141 0.124595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 57 107 -0.0441094 -2.91311 -0.116708 0.0625226 0.00366493 0.0213254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 107 108 0.980173 0.0959369 -0.0752456 -0.00338487 0.0191653 0.0715011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 58 108 0.0230801 -2.97504 -0.357061 0.0670757 -0.00907589 0.0247295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 108 109 1.05095 -0.0257689 -0.023528 0.00852657 -0.00166744 0.141457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 59 109 -0.00305562 -3.12308 -0.287325 0.0571011 0.00406724 0.031909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 109 110 1.20359 -0.0647622 -0.0597841 -0.0088591 0.0106593 0.142081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 60 110 -0.025776 -2.93824 -0.0518619 0.0586967 -0.00746266 -0.00333775 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 110 111 0.95796 0.131102 -0.0761098 0.00586207 0.0213103 0.0522156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 61 111 -0.0288368 -3.12871 -0.17189 0.0684542 0.00932534 -0.0442089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 111 112 1.05014 -0.0223277 -0.233038 -0.00120831 0.0330753 0.180874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 62 112 -0.129161 -3.26124 -0.190558 0.053319 -0.0129184 -0.0431992 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 112 113 1.11301 -0.131397 -0.0723134 0.00787925 0.021937 0.114543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 63 113 0.0883249 -3.13239 -0.04713 0.0580108 0.0103668 0.0864995 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 113 114 1.147 -0.0327704 0.0305984 0.0149103 0.0156073 0.0978184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 64 114 0.0154263 -3.12403 -0.0570956 0.0536973 -0.0147353 0.0828102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 114 115 1.1207 -0.0117095 -0.223917 -0.00635155 0.0218446 0.195917 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 65 115 0.184162 -3.0453 -0.118383 0.0452144 0.00487106 0.0290297 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 115 116 1.07318 -0.0107915 -0.191525 -0.00909093 0.0330703 0.153907 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 66 116 0.0749906 -3.08305 -0.135897 0.0728186 0.000699285 0.00679558 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 116 117 1.19468 -0.159599 -0.0241275 -0.00377132 0.0304561 0.104646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 67 117 -0.0305342 -3.10432 0.00537417 0.0588 0.00781384 0.0588515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 117 118 1.18149 0.0809769 0.0817434 0.0125689 0.0203771 0.0860039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 68 118 -0.0387159 -3.01347 -0.108519 0.0443164 -0.00294548 -0.012414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 118 119 1.27252 0.0408358 -0.0858404 -0.00278268 0.0175813 0.118333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 69 119 -0.0875281 -2.96544 -0.0468108 0.0598179 -0.00805469 0.0347036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 119 120 1.19134 0.0228141 0.0131211 -0.00107807 0.0364803 0.225035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 70 120 -0.0501515 -3.09343 -0.0300745 0.0650498 -0.0223053 -0.0662907 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 120 121 1.24715 0.0802271 0.0691544 0.00313991 0.0247522 0.118582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 71 121 0.00551799 -3.1507 -0.223002 0.070943 -0.0169216 -0.0146807 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 121 122 1.30121 -0.0106717 0.100456 0.0173213 0.00872086 0.0631275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 72 122 0.0597231 -3.08063 -0.127074 0.068257 -0.0144557 -0.0379985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 122 123 1.17626 0.120445 0.0833338 0.00792691 0.0209958 0.115622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 73 123 0.0273583 -3.01523 -0.0374404 0.0724553 -0.00740781 -0.0536889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 123 124 1.44683 0.08159 0.130293 -0.00790478 0.010436 0.143127 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 74 124 -0.140182 -2.86662 -0.0667824 0.0576166 0.0029843 0.0347212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 124 125 1.15683 0.0142598 -0.0920316 -0.000941139 0.0175395 0.0916134 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 75 125 0.149265 -3.11637 0.114881 0.0633796 -0.00387822 -0.021386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 125 126 1.14944 -0.152584 -0.0639707 -0.00797578 0.0142752 0.130386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 76 126 0.0649766 -3.13012 0.115222 0.0622991 -0.00751953 -0.0528066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 126 127 1.31421 -0.0301921 0.0136282 0.0260088 0.0234023 0.0419565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 77 127 -0.0452628 -2.9625 -0.119995 0.0736495 0.00141112 -0.0667184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 127 128 1.1777 -0.0441652 -0.0328759 0.00563511 0.0284357 0.129802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 78 128 -0.0235386 -3.20664 -0.00789819 0.0569585 -0.0118202 0.0244622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 128 129 1.25589 -0.0832053 0.0755096 0.0201099 0.04141 0.0353544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 79 129 0.0433156 -2.9881 0.0160618 0.0592976 0.00213029 -0.00344917 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 129 130 1.22503 0.0665453 0.0105143 -0.00481882 0.0290614 0.0833613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 80 130 -0.190593 -3.07302 0.0165346 0.0586789 -0.0121648 0.00239104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 130 131 1.38719 0.0506626 -0.103822 -0.00259601 0.031707 0.0950021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 81 131 -0.0259444 -2.8563 -0.0218777 0.0452204 -0.0147614 0.045108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 131 132 1.14129 0.0525289 0.0422534 -0.00530144 0.0162883 0.18614 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 82 132 -0.103071 -2.91015 -0.16109 0.0636226 0.00560219 -0.0313934 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 132 133 1.36611 0.0933038 0.0101952 0.0117211 0.00470633 0.0384473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 83 133 -0.0731008 -3.07324 -0.165711 0.0591486 -0.00617429 0.0386802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 133 134 1.39693 0.0169225 0.0380645 0.00434782 0.0207293 0.168213 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 84 134 -0.107305 -3.25517 0.0327166 0.068988 -0.00667694 0.0180861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 134 135 1.23352 0.143751 -0.0425504 0.00736683 0.0135378 0.160424 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 85 135 -0.0838882 -3.19586 -0.207621 0.0688347 0.0144063 -0.0207002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 135 136 1.41106 -0.0532619 -0.0108934 -0.00082031 0.0144103 0.168857 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 86 136 0.0157613 -2.92032 -0.0431684 0.0642352 -0.00618065 0.0184377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 136 137 1.15381 0.177075 0.0374688 0.0119533 0.0261397 0.127272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 87 137 0.00197004 -3.03679 0.0128745 0.0554739 -0.0215757 -0.0446642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 137 138 1.42676 -0.0517682 -0.164318 -0.0025454 0.0328103 0.0494846 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 88 138 -0.12332 -3.08132 -0.0995277 0.0708194 -0.00806477 -0.00861412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 138 139 1.26672 0.0397922 -0.0564532 0.00656277 0.0363474 0.202066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 89 139 -0.00275223 -3.19583 -0.0819252 0.053211 -0.00469646 -0.0567531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 139 140 1.44915 -0.0475323 0.092421 0.00373852 0.0314975 0.121736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 90 140 0.104303 -3.11898 -0.266343 0.0649362 0.00958872 0.0740299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 140 141 1.33591 -0.214487 0.010121 0.00626807 0.017005 0.127453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 91 141 -0.024415 -2.83466 -0.257886 0.0714659 -0.00812374 -0.0244863 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 141 142 1.35222 0.0658626 0.0313342 -0.00698821 0.0398324 0.129372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 92 142 -0.0307797 -2.98277 0.074437 0.0607682 -0.0276133 0.0376202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 142 143 1.48539 0.0659756 0.0937671 0.019014 0.0325928 0.109309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 93 143 -0.0211845 -3.16763 -0.127323 0.073686 -0.0126257 0.0229932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 143 144 1.47044 -0.0991464 -0.018496 0.0127829 0.0364172 0.0830905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 94 144 0.108172 -3.12806 -0.223934 0.0594942 -0.000423085 -0.0965125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 144 145 1.45225 -0.0303321 0.0124329 -0.00337534 0.0361522 0.176161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 95 145 0.0559591 -2.82278 -0.0672094 0.0623157 0.00409275 0.000815069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 145 146 1.39071 -0.210258 -0.0390088 0.00971164 0.0238097 0.163629 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 96 146 0.000928069 -3.04331 0.00953992 0.0516296 -0.0059651 0.0733197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 146 147 1.57347 0.0979423 0.0218775 -0.00357969 0.0192539 0.213089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 97 147 0.0309534 -2.97941 -0.114619 0.0555605 0.0175574 -0.0188221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 147 148 1.27099 -0.0250882 0.0109643 0.0143423 0.0321854 0.154002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 98 148 -0.193633 -3.07722 -0.0303492 0.0739744 -0.0113989 -0.00917065 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 148 149 1.40051 0.10627 -0.101023 0.00968476 0.0286493 0.140976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 99 149 -0.0268638 -3.02365 -0.11236 0.0816159 -0.00328121 0.0173223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 149 150 1.53584 0.259858 -0.067094 0.00836184 0.0232924 0.181033 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 100 150 -0.091195 -3.10917 -0.131026 0.0582938 0.00552301 -0.0772711 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 150 151 1.50343 0.0900941 -0.0232025 -0.00333805 0.0340989 0.121424 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 101 151 -0.184789 -3.14272 -0.235034 0.0588545 -0.00470093 0.0879531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 151 152 1.54611 0.27024 -0.0573247 0.00315426 0.0491033 0.0892431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 102 152 -0.0763466 -3.00259 -0.111874 0.0798404 -0.0149104 0.0211824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 152 153 1.40938 -0.0190962 0.0406198 0.0074728 0.0221496 0.0478455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 103 153 0.0438277 -2.96722 0.0459768 0.0666088 0.00244816 0.0292068 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 153 154 1.40071 -0.0348716 0.0796097 0.0191604 0.0397561 0.104492 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 104 154 -0.0624419 -3.03437 -0.157666 0.0475526 -0.00097643 0.0339232 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 154 155 1.37532 0.0303392 0.00973663 0.00341224 0.0323813 0.0992893 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 105 155 0.117743 -2.83783 -0.167352 0.0623962 -0.00793055 -0.000516027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 155 156 1.22703 0.0210456 -0.0498942 0.014615 0.0325815 0.11638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 106 156 0.0449871 -3.06183 -0.169848 0.0665598 -0.00462507 -0.0692146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 156 157 1.31766 -0.118396 -0.0643189 0.00910642 0.0185014 0.0524095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 107 157 -0.0960327 -3.08018 -0.160623 0.0653476 -0.00869054 -0.017762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 157 158 1.4538 0.111238 0.022365 0.00772061 0.0409316 0.170237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 108 158 0.104944 -3.01454 -0.0810527 0.0558659 0.000301541 0.0165061 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 158 159 1.47945 0.0548181 -0.117826 -0.00222687 0.0358195 0.165498 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 109 159 0.019539 -2.96727 -0.106413 0.0564583 -0.000718725 0.0118056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 159 160 1.38283 0.0324891 0.255533 0.0110349 0.0325244 0.12145 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 110 160 -0.00660569 -3.09514 -0.054324 0.0658628 -0.00299355 0.0832041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 160 161 1.39937 0.0949158 0.03063 0.00995492 0.0392517 0.128412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 111 161 -0.175793 -3.09713 -0.0226281 0.0514343 -0.00820071 -0.0265973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 161 162 1.32635 0.00237235 -0.158713 -0.00312757 0.0324963 0.0821186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 112 162 0.0302867 -2.89947 0.0285285 0.06533 0.000808399 -0.0229159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 162 163 1.43595 -0.0666765 -0.0226963 0.00287416 0.0456007 0.199184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 113 163 -0.0432065 -3.1782 -0.150945 0.0711739 -0.0125488 0.084453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 163 164 1.37631 0.125108 0.101829 0.020338 0.0304776 0.0919236 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 114 164 -0.00322512 -3.02308 0.0908843 0.0864855 0.00608706 -0.0108954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 164 165 1.47347 -0.0114871 0.0244473 0.00279986 0.0295578 0.104601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 115 165 0.0180775 -3.05186 -0.186293 0.068491 -0.0050778 -0.0416453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 165 166 1.39015 -0.0627038 -0.100217 0.00289206 0.0333439 0.0864933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 116 166 -0.0975132 -3.20295 -0.17434 0.0605142 0.00171958 0.0192081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 166 167 1.42634 -0.0434544 -0.0641663 -0.00552483 0.0171293 0.093275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 117 167 0.0654124 -2.96418 -0.217887 0.0633597 -0.00646462 0.0204986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 167 168 1.46179 -0.000134202 -0.235566 -0.00136664 0.0190626 0.148571 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 118 168 0.100361 -3.04344 -0.158514 0.0432215 0.0123417 -0.00337237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 168 169 1.50116 -0.0630477 0.110722 0.000250842 0.0448257 0.133308 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 119 169 0.180965 -3.16839 0.0125299 0.0731425 0.000851626 -0.0517885 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 169 170 1.56377 0.144771 0.103893 -0.00860669 0.0354396 0.0886395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 120 170 0.0746068 -3.01461 -0.18407 0.0589369 -0.0178595 -0.00795362 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 170 171 1.5639 0.00334451 -0.0976223 -0.0049772 0.0323328 0.100328 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 121 171 0.0109993 -3.01379 -0.102388 0.0573484 0.0022302 0.0182129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 171 172 1.68862 -0.0586818 -0.0303397 -0.00806027 0.0326367 0.0838935 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 122 172 -0.111558 -2.94293 -0.195782 0.0681368 -0.000829466 -0.0214527 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 172 173 1.58131 0.00755403 -0.0452305 0.00340913 0.019952 0.147633 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 123 173 0.0800822 -3.3112 -0.124141 0.0680485 -0.00713025 -0.0775001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 173 174 1.72212 0.0594114 -0.167495 0.00341528 0.0368757 0.143856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 124 174 -0.0792538 -3.01441 0.00500951 0.0601768 0.00993413 -0.0598378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 174 175 1.59936 -0.0663353 0.0552965 0.00100654 0.0136019 0.144131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 125 175 0.0662933 -2.99194 -0.286008 0.0782552 -0.0101059 0.0277765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 175 176 1.72026 0.0330118 -0.0506746 0.0101457 0.0330823 0.166277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 126 176 -0.0173762 -3.1868 -0.0394693 0.0597979 0.00592918 -0.0261937 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 176 177 1.60182 0.0883911 0.132384 0.00968364 0.0338752 0.0774389 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 127 177 -0.0569387 -2.96806 -0.200005 0.0443698 0.013978 0.0326017 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 177 178 1.692 0.0275745 0.0436645 -0.008861 0.0166822 0.172091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 128 178 -0.0739367 -3.07313 -0.0364267 0.0708591 -0.026773 0.0548767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 178 179 1.4636 0.277218 0.00306782 0.00246004 0.0290051 0.121671 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 129 179 0.0334896 -3.08379 -0.165323 0.057635 0.0059853 0.0459455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 179 180 1.85634 -0.0585747 0.0483485 0.0141806 0.0294442 0.179783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 130 180 0.0600659 -3.04662 -0.232627 0.0534284 -0.000797089 0.00862149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 180 181 1.64267 -0.0179925 0.00251776 0.00863421 0.0417442 0.0998906 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 131 181 -0.0705189 -3.08063 -0.0281943 0.0510869 0.0133379 0.0199902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 181 182 1.80108 0.00341645 0.1077 -0.00103219 0.033739 0.0928288 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 132 182 0.137935 -3.01711 -0.24742 0.063955 -0.0153704 -0.0151215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 182 183 1.68527 0.061889 -0.183727 0.00135907 0.0340176 0.145758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 133 183 0.113449 -3.24191 -0.0118171 0.0583434 0.0133421 0.0758862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 183 184 1.51155 0.149797 0.0264479 -0.00738633 0.0406307 0.101637 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 134 184 -0.00249721 -3.08846 -0.119883 0.0578308 -0.00454597 -0.00656585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 184 185 1.68482 0.0347309 -0.0284604 0.00380256 0.0478564 0.109049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 135 185 0.00297203 -3.10605 0.158867 0.0726803 0.00413905 -0.0172719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 185 186 1.76482 -0.0323671 0.069191 0.00190559 0.022595 0.175645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 136 186 0.0484651 -2.93186 -0.241964 0.0607642 -0.000809346 -0.0574341 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 186 187 1.50619 0.2211 -0.0934862 0.0213632 0.038668 0.144495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 137 187 0.0697683 -3.12328 -0.185728 0.081538 -0.000836861 -0.070255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 187 188 1.77122 -0.15748 0.0888511 0.0125665 0.0469711 0.0232227 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 138 188 -0.182655 -3.20378 -0.147575 0.0469276 0.00145833 -0.0471949 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 188 189 1.59992 0.0430631 -0.0982293 0.00496286 0.0396087 0.101366 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 139 189 -0.0892435 -2.88768 -0.0776466 0.0541292 0.00431353 -0.0701898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 189 190 1.77684 -0.12741 -0.065838 0.00588863 0.0356693 0.0745784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 140 190 -0.0090601 -3.01519 -0.0517473 0.0579129 -0.0073762 0.120663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 190 191 1.81203 0.0301962 0.0214748 -0.00284979 0.0326308 0.0810004 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 141 191 0.00510901 -2.98367 -0.207731 0.0618182 -0.013076 -0.00249131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 191 192 1.72204 -0.00873939 -0.125301 -0.00194083 0.027942 0.123151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 142 192 0.0666604 -2.89114 -0.0680906 0.062445 0.00488451 0.0292928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 192 193 1.62744 0.000274444 0.135329 0.0139251 0.0362447 0.0973624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 143 193 -0.022781 -3.08216 -0.0800965 0.0701637 -0.00246595 -0.0643767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 193 194 1.82308 0.0310364 0.155292 -0.000520669 0.045176 0.0986018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 144 194 0.00638825 -3.00042 -0.151838 0.0498274 -0.00580071 0.0144146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 194 195 1.5502 0.0689414 -0.120656 0.0216901 0.0413976 0.140854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 145 195 0.0368719 -2.91428 -0.0857056 0.0586239 -0.000996116 0.0439876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 195 196 1.78057 0.146144 0.0610981 -0.0104951 0.0417118 0.0880281 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 146 196 -0.0114202 -3.19583 -0.309015 0.0606655 0.00342527 0.0297961 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 196 197 1.65409 -0.196292 0.0459151 0.00268357 0.019473 0.101011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 147 197 -0.00871662 -3.01961 -0.137155 0.0507975 0.00196904 -0.0465022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 197 198 1.69503 0.195056 -0.169086 0.0124826 0.0199831 0.110915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 148 198 -0.0677675 -2.98079 -0.0382307 0.0585965 -0.00817753 0.111116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 198 199 1.76688 0.097001 -0.0593896 0.00970437 0.0438005 0.156703 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 149 199 0.0191126 -3.02994 -0.129049 0.0661753 -0.0107078 -0.0667044 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 199 200 1.90254 0.325562 -0.0777571 -0.00630681 0.0371526 0.0846623 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 150 200 0.0382134 -3.05662 -0.135943 0.0639997 0.0117655 -0.000529756 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 200 201 1.68051 -0.033179 -0.0389823 0.00465261 0.0285638 0.144896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 151 201 0.0731876 -3.11192 -0.196398 0.0713868 0.00265962 -0.0227748 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 201 202 1.86513 0.254449 0.00888724 0.0247806 0.044651 0.176677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 152 202 0.130243 -3.0951 -0.054181 0.0575143 -0.0119977 0.0214721 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 202 203 1.82231 -0.109072 -0.163625 0.000832615 0.0403943 0.19324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 153 203 0.0630173 -2.91525 0.0364883 0.0720316 -0.00919023 -0.00282688 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 203 204 1.92344 0.0251315 0.120875 0.00792463 0.0475588 0.0693731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 154 204 0.161642 -3.15779 0.00582814 0.0567933 0.00481272 0.0254752 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 204 205 1.62506 0.111677 -0.0497328 0.00150407 0.0363835 0.14885 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 155 205 -0.0757689 -3.06476 -0.0242418 0.0620182 0.00852524 -0.0957239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 205 206 1.96882 0.0238452 0.0993766 0.0173079 0.0231871 0.11098 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 156 206 0.102407 -3.05569 -0.172852 0.0768964 0.0127887 -0.011598 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 206 207 2.00298 0.01153 -0.045501 0.00967042 0.0356864 0.117864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 157 207 -0.0809565 -3.10199 0.0555457 0.0529998 0.0146578 0.0412121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 207 208 1.66844 0.0318303 -0.13248 0.00210799 0.0507095 0.153367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 158 208 0.102104 -3.09037 -0.0644268 0.0546204 0.00778132 -0.0176055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 208 209 1.78938 0.194344 0.0187949 0.0120475 0.0205472 0.0718317 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 159 209 -0.0346452 -3.11184 -0.0606164 0.0479362 -0.00520853 0.0396631 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 209 210 1.75655 -0.145987 -0.138479 0.00822308 0.0312839 0.147412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 160 210 0.0286888 -2.96378 -0.17248 0.0364285 0.00383676 -0.112886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 210 211 1.74459 -0.0573695 -0.00494877 0.00746975 0.034189 0.146847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 161 211 -0.142765 -3.17487 -0.190226 0.0360753 -0.00268244 -0.0282957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 211 212 1.83911 0.0396383 0.138066 0.000450027 0.0316329 0.0797656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 162 212 -0.0016887 -3.03451 -0.0732073 0.0533917 0.00219507 -0.0102065 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 212 213 2.02525 0.0376045 -0.121723 0.00198343 0.0433563 0.118119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 163 213 0.0686502 -2.99854 -0.033735 0.0487614 -0.0172263 0.0117656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 213 214 1.8112 0.014488 0.0610334 0.0120029 0.03957 0.0178461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 164 214 0.00559263 -3.04826 0.110138 0.0777598 -0.00437256 0.0252081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 214 215 1.92421 0.0628544 -0.0421914 0.0202207 0.030154 0.166039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 165 215 -0.079513 -2.93213 -0.228321 0.0642961 0.00276748 -0.0160108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 215 216 1.85809 0.12447 -0.126272 -0.00750494 0.0511746 0.146717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 166 216 0.000612582 -3.13253 -0.0272573 0.0653026 -0.00817894 -0.0157567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 216 217 1.92819 0.131562 -0.0262865 -0.0176944 0.0477917 0.108702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 167 217 0.0263059 -2.91893 -0.272428 0.0582499 0.0179859 -0.0208515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 217 218 2.09045 0.0502047 0.00895368 0.011666 0.0311209 0.16451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 168 218 -0.0999359 -2.98392 -0.0647397 0.0654386 0.00280013 -0.0144617 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 218 219 1.66963 -0.0146119 0.0298604 0.00176515 0.0319432 0.171465 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 169 219 0.106994 -3.21091 -0.297587 0.0450544 -0.00822723 0.00345636 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 219 220 1.94352 0.0237944 -0.0206842 -0.00532697 0.0384581 0.132339 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 170 220 0.0292042 -3.14077 -0.131728 0.0489925 0.00504376 0.00583801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 220 221 2.08627 0.0695488 -0.0603994 0.006781 0.0221916 0.123998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 171 221 0.0251717 -3.00265 0.0194363 0.070476 -0.0231494 0.00647591 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 221 222 1.74306 0.123654 0.00155131 -0.0147609 0.0406629 0.165205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 172 222 -0.134656 -3.05362 0.13276 0.06591 -0.0096463 -0.00436685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 222 223 1.85398 0.259788 0.0394136 0.00485837 0.0331025 0.0911351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 173 223 -0.062719 -3.15837 -0.0502821 0.0653893 -0.00820904 0.0454966 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 223 224 1.93641 0.262807 0.0398305 0.0108066 0.0295743 0.189469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 174 224 0.163986 -3.13471 -0.0134047 0.0715719 -0.00539493 0.00133295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 224 225 1.73706 -0.0894922 -0.214004 -0.00848344 0.0427249 0.207368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 175 225 0.0106959 -3.0434 -0.204951 0.0740667 -0.00174896 0.0280807 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 225 226 1.95821 0.0290485 -0.00119628 0.00483109 0.0404749 0.106243 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 176 226 0.0531572 -3.02179 -0.167399 0.0532579 0.0120966 -0.000209975 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 226 227 2.05299 0.0827588 -0.0318831 -0.00520823 0.0498765 0.129382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 177 227 0.0213529 -3.26506 0.031713 0.0584324 0.0142313 -0.0478921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 227 228 2.07201 0.0649026 -0.00477684 0.001229 0.031251 0.105419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 178 228 -0.0484436 -3.11359 -0.154497 0.0631709 0.00976347 -0.114208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 228 229 1.95294 0.039408 -0.0464725 0.00167196 0.0409431 0.131136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 179 229 -0.00643492 -3.05845 -0.118459 0.0613074 0.00773031 0.0342483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 229 230 2.03641 0.0722071 -0.0815322 -0.000493797 0.044832 0.131649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 180 230 0.115083 -2.96394 -0.0422853 0.0540187 0.0032323 0.0455786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 230 231 1.8818 -0.11954 -0.0325278 0.00161878 0.0286758 0.109708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 181 231 -0.0168854 -3.08755 -0.309933 0.0605794 -0.00810053 0.0060085 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 231 232 2.14098 -0.168831 0.0265906 -0.0150479 0.0263096 0.106862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 182 232 0.147606 -3.0981 -0.0701534 0.0699415 -0.000295278 0.0688972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 232 233 1.83433 0.0734373 0.0660469 -0.00903129 0.0494465 0.121396 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 183 233 -0.00321555 -3.05285 0.0449213 0.0591974 -0.00976622 -0.0415753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 233 234 1.88659 0.110046 -0.107002 0.000349286 0.0477397 0.127259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 184 234 -0.0602762 -3.06792 -0.163193 0.079075 -0.00470511 -0.0390876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 234 235 2.26289 0.0870066 0.000505862 -0.00299947 0.0544787 0.0840462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 185 235 -0.161752 -3.10469 -0.1211 0.0624799 0.016216 0.0029447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 235 236 1.98665 -0.0129186 0.00442581 0.00839079 0.0560474 0.159022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 186 236 0.0346363 -2.96773 -0.0157169 0.0833375 -0.00214156 -0.00922428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 236 237 1.91157 0.183219 -0.0222053 0.00457593 0.0308936 0.0621001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 187 237 0.165213 -2.99257 0.00310385 0.0803587 -0.00341481 -0.0300767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 237 238 2.09429 -0.00379929 -0.134306 0.00880035 0.0410323 0.180148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 188 238 0.0185541 -3.0517 -0.103473 0.0730379 -0.0124127 -0.0223637 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 238 239 1.77477 -0.0360535 -0.0690612 0.00785704 0.0328021 0.169314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 189 239 -0.0267558 -3.0413 -0.0526275 0.0711473 0.0155586 0.0168998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 239 240 2.27011 0.219717 -0.00370011 -0.00356763 0.0603441 0.0819961 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 190 240 0.0767567 -3.03596 -0.000666132 0.0651999 0.00572908 -0.0268885 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 240 241 1.86571 -0.115437 0.00537699 0.0017837 0.0369354 0.0448219 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 191 241 -0.246869 -3.09503 -0.0705801 0.0608872 -0.0132719 0.0295155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 241 242 1.93868 0.0763127 -0.101444 -0.0013484 0.0343296 0.0914025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 192 242 -0.0467043 -3.0884 -0.213095 0.0510451 0.0143328 -0.00912357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 242 243 2.08485 0.0765796 0.0597433 -0.00491673 0.0435209 0.162546 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 193 243 -0.126682 -2.94999 -0.20823 0.0586476 -0.000688903 0.00177961 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 243 244 2.24831 -0.0292934 0.0381868 0.0111353 0.0450596 0.161896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 194 244 -0.102618 -3.06055 -0.105585 0.0609778 0.00808177 0.0350429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 244 245 2.12642 -0.0938462 -0.262251 0.00400024 0.0343815 0.0669298 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 195 245 -0.152002 -3.17768 -0.0386919 0.0732517 0.0102084 -0.0124038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 245 246 2.25275 -0.068501 -0.164155 0.00637231 0.0627578 0.0814566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 196 246 -0.234046 -3.08278 -0.442751 0.0522283 -0.000301327 -0.00317474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 246 247 2.02421 0.208041 0.0553142 0.0219963 0.0309713 0.232485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 197 247 0.137088 -2.90179 -0.283476 0.0563091 -0.00532127 -0.0126661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 247 248 2.25098 0.199637 0.10075 0.00813927 0.0473805 0.16878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 198 248 -0.167221 -3.21719 -0.0115691 0.0578296 0.00322409 -0.038098 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 248 249 2.10342 0.107357 -0.15673 0.00997207 0.0528462 0.133786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 199 249 0.110486 -3.16289 -0.0433531 0.0726547 0.00959121 0.0346844 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 249 250 2.19817 0.218015 -0.00786808 0.0129408 0.0307759 0.154194 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 200 250 -0.0717296 -3.07548 0.0211213 0.0627264 -0.0055114 -0.0103608 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 250 251 2.31288 -0.052153 -0.0731027 -0.00719742 0.0400024 0.116925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 201 251 -0.00681805 -3.17906 -0.346013 0.054638 0.00747675 -0.0134403 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 251 252 2.18756 -0.0633361 -0.118089 0.00495692 0.052449 0.115732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 202 252 0.0431136 -3.00939 -0.0155636 0.0716749 -0.00317407 -0.0400628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 252 253 2.08733 0.05078 -0.0744808 0.00736145 0.0274147 0.0869374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 203 253 0.131396 -2.95578 -0.00510312 0.0657131 0.0257113 0.028103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 253 254 2.09822 0.190315 -0.18488 0.000465939 0.0490045 0.138205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 204 254 0.0838311 -3.06117 -0.143531 0.0593527 -0.0067121 -0.0382022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 254 255 2.07268 0.043896 0.0290046 0.0137189 0.0463347 0.104311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 205 255 -0.000913512 -3.09839 -0.126894 0.0531193 -0.000258623 0.0253931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 255 256 2.03781 -0.05167 0.123522 0.013832 0.0346036 0.0916014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 206 256 -0.0419883 -3.08009 0.02822 0.0508768 -0.00188593 -0.0164474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 256 257 2.45744 0.148313 -0.109088 -0.00411675 0.0396744 0.147067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 207 257 -0.0163456 -3.02109 -0.162527 0.055254 0.0189569 -0.0301234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 257 258 2.3833 -0.00345305 -0.128278 -0.00581145 0.0395637 0.0883512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 208 258 0.0830395 -3.17885 0.0327568 0.0467335 -0.0225947 -0.0348089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 258 259 2.20419 0.199405 -0.00605771 -0.00420014 0.0416097 0.112066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 209 259 0.0667935 -2.96176 -0.0639898 0.0689552 -0.00737743 0.0511222 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 259 260 2.29002 0.135432 0.0287787 -0.0027658 0.0451641 0.0831062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 210 260 0.0305222 -3.08883 -0.141418 0.0645893 -0.00811835 -0.012858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 260 261 2.15078 -0.00596316 -0.135764 0.000299779 0.037295 0.193327 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 211 261 -0.110706 -3.09079 -0.00819562 0.0549579 0.00219491 2.57521e-05 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 261 262 2.20337 0.0580157 0.00134658 0.00386203 0.0501052 0.165391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 212 262 -0.102122 -3.00302 -0.0615906 0.0609671 -0.0102547 -0.0317258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 262 263 2.03672 0.197414 -0.19402 0.0269777 0.0520744 0.143433 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 213 263 -0.179033 -3.1427 -0.0505253 0.071954 -0.0128928 0.0568992 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 263 264 2.1035 0.124143 0.0255684 0.015117 0.0505631 0.110192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 214 264 0.0658537 -3.04313 0.0580409 0.0587429 0.000650224 -0.00385978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 264 265 2.30918 -0.100238 -0.145686 0.0075786 0.0251499 0.106305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 215 265 -0.143185 -3.06723 -0.314008 0.0527471 0.00543168 -0.0116116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 265 266 2.21367 0.0949277 -0.155361 -0.00334258 0.038799 0.149246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 216 266 -0.0101691 -3.01743 -0.195877 0.0742527 0.00104353 -0.0868762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 266 267 2.13462 -0.146741 0.0671172 -0.00667222 0.0416776 0.128528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 217 267 -0.00330242 -3.002 -0.109077 0.0678437 0.010472 0.00506311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 267 268 2.41615 0.05162 0.0750816 -0.00952927 0.0426124 0.16367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 218 268 -0.218145 -3.15421 -0.0598618 0.0722774 0.00925724 -0.0436768 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 268 269 2.23469 0.0453752 -0.145289 0.0205 0.0341337 0.128676 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 219 269 -0.0605602 -2.83477 0.0536274 0.0716696 0.00541583 -0.0430848 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 269 270 2.02699 0.121645 0.051122 0.00116677 0.0201445 0.149441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 220 270 0.0970233 -3.10062 -0.0246899 0.0600018 -0.0140873 -0.0143543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 270 271 2.27153 0.199102 0.161268 0.0111928 0.0504626 0.0939937 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 221 271 0.0456638 -2.9805 -0.0302129 0.0665857 -0.00501504 -0.0111736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 271 272 2.18299 -0.107375 0.0409429 0.013585 0.0395822 0.138031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 222 272 0.148506 -3.07901 -0.218243 0.0753982 0.00574885 0.0366255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 272 273 2.24056 0.080279 0.130438 0.0105625 0.0342771 0.182198 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 223 273 -0.0556997 -3.18523 -0.235704 0.077776 -0.00873111 0.0409011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 273 274 2.4215 0.195034 -0.155046 0.00803924 0.0567937 0.139719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 224 274 -0.0250337 -3.14967 -0.163133 0.0499743 -0.00438829 0.0577658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 274 275 2.17327 0.134645 0.0613398 -0.00125863 0.0484273 0.0687721 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 225 275 -0.127119 -2.98858 -0.00343526 0.0670647 0.0100908 -0.0347278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 275 276 2.35378 -0.0715283 -0.0653343 0.0136437 0.0546804 0.122561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 226 276 0.229636 -3.10875 -0.0812266 0.0574506 0.0125476 0.0860414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 276 277 1.96311 0.155108 -0.0384223 -0.021755 0.0444909 0.0821412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 227 277 -0.0786455 -3.13901 -0.0697428 0.0534407 0.018922 -0.0118873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 277 278 2.27018 0.14436 -0.136726 -0.00354742 0.0421929 0.150762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 228 278 0.144844 -3.10515 -0.272418 0.0473179 -0.0108012 -0.0179344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 278 279 2.34324 0.0231502 -0.114825 0.000656235 0.0499106 0.148202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 229 279 0.135237 -3.10469 0.106597 0.0789428 -0.0188134 0.0214502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 279 280 2.16599 0.0295354 -0.0855455 0.00969605 0.0411425 0.101733 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 230 280 -0.027205 -3.18812 -0.0374326 0.0701757 0.00788794 -0.00326006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 280 281 2.25687 0.158581 0.223971 0.0117773 0.0338342 0.142574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 231 281 0.116528 -3.07257 -0.205221 0.0678889 -0.03243 0.0331513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 281 282 2.46519 0.125342 -0.083333 -0.00302696 0.0355066 0.0924926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 232 282 0.102083 -3.10287 -0.150421 0.0469525 -0.0027142 -0.0280216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 282 283 2.47559 0.0556753 0.219299 0.000645852 0.0396109 0.150877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 233 283 0.0656143 -3.1271 -0.00171123 0.0801474 0.00726626 0.0179317 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 283 284 2.39062 0.0988383 -0.0962819 -0.0120396 0.0622843 0.107813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 234 284 -0.000547869 -3.10502 -0.171998 0.0541426 0.0049636 -0.0116743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 284 285 2.35824 -0.0287721 -0.145039 0.01653 0.0438322 0.161942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 235 285 -0.0816881 -2.81858 -0.172729 0.0743499 -0.00842549 -0.0485102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 285 286 2.42832 0.0930126 -0.0489046 0.0106349 0.0476784 0.0673158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 236 286 0.0484962 -3.03673 -0.273522 0.0629573 -0.00090137 -0.0453009 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 286 287 2.44284 0.0404911 -0.136321 0.026261 0.0466477 0.0555865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 237 287 -0.032727 -3.13576 -0.16107 0.0573894 -0.0123586 0.0611874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 287 288 2.41488 0.00870183 -0.20671 -0.00720146 0.0461846 0.122732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 238 288 -0.0496857 -3.07509 -0.251657 0.0688863 -0.00133531 -0.0200851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 288 289 2.28864 -0.0381635 -0.0898246 -0.00293641 0.0640621 0.0676576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 239 289 0.0193968 -2.92723 -0.142801 0.0680957 0.000437974 0.0448117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 289 290 2.4637 0.0262221 -0.242672 0.0173369 0.0409467 0.0860674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 240 290 -0.0211913 -2.98593 -0.0887671 0.0585756 -0.0164923 -0.0339397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 290 291 2.28355 -0.0154505 -0.0915172 -0.00477286 0.0422064 0.0813018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 241 291 0.086062 -3.04769 -0.116784 0.0708585 0.0146636 -0.0392523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 291 292 2.58915 0.0339442 -0.0232328 -0.00322147 0.0374201 0.096972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 242 292 0.00631038 -3.09328 0.107673 0.0559532 0.004636 0.0277906 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 292 293 2.42997 0.0755426 -0.0699184 -0.00669618 0.0435254 0.102059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 243 293 -0.0706993 -3.09109 -0.0811525 0.0697684 0.00246776 0.0193687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 293 294 2.49862 0.00910517 0.00335106 0.0157926 0.0401925 0.130325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 244 294 -0.0228583 -3.2339 -0.0736715 0.045959 5.7608e-05 -0.0290403 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 294 295 2.31422 0.0562027 -0.246499 -0.00411792 0.055953 0.0661303 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 245 295 0.133367 -3.07528 -0.259682 0.0566562 0.0194897 0.0301528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 295 296 2.46919 0.0840357 -0.067019 0.0167165 0.0550077 0.0923467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 246 296 -0.0569526 -2.8712 -0.0547276 0.0729565 -0.00132937 0.0161054 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 296 297 2.46877 0.0685008 -0.176631 0.00230117 0.0498114 0.162736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 247 297 0.0586638 -2.97212 -0.0881569 0.0512024 0.00992174 0.0853792 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 297 298 2.49273 0.0234559 -0.0633944 0.0136503 0.0600681 0.153273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 248 298 0.175276 -3.06391 0.226309 0.0759751 0.00671959 0.12724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 298 299 2.44053 0.135077 0.0680864 0.00664862 0.0449906 0.12216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 249 299 -0.0558853 -3.02436 -0.136848 0.0698958 0.00686718 0.0254077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 299 300 2.75217 0.0228351 -0.220441 0.0015072 0.0417684 0.0754465 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 250 300 -0.133213 -3.12674 -0.0957537 0.0724965 -0.00742683 -0.011595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 300 301 2.4764 0.12383 -0.0145078 0.0112092 0.0532307 0.0698002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 251 301 -0.0651135 -3.03122 -0.170269 0.0683717 0.00515989 0.0554553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 301 302 2.5853 0.0742644 -0.153793 0.00304487 0.0464858 0.157709 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 252 302 -0.0288678 -3.09016 -0.0523891 0.0510187 -0.00374584 -0.0376563 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 302 303 2.48018 0.167181 -0.0769526 -0.00644395 0.0620504 0.13335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 253 303 -0.144662 -3.20284 -0.133085 0.0801223 -0.00115644 -0.0253926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 303 304 2.43786 0.0831799 -0.240887 0.008843 0.0571093 0.194069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 254 304 -0.0576414 -2.97553 0.0633291 0.062827 0.00159969 -0.0273465 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 304 305 2.6149 -0.0417122 -0.00826959 -0.00122509 0.0348447 0.179542 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 255 305 0.204381 -3.09634 -0.21618 0.0807465 -0.00262199 -0.028427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 305 306 2.65096 -0.0204622 -0.203166 0.00557884 0.0560473 0.103369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 256 306 -0.0455904 -3.09673 -0.0862219 0.0549526 0.0193621 0.0184641 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 306 307 2.59701 0.0913949 -0.110267 -0.0172836 0.0417482 0.130464 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 257 307 -0.0810938 -3.07172 0.0394254 0.0754092 -0.000272243 0.00175795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 307 308 2.6107 0.171221 -0.172001 0.0169908 0.0467304 0.0793681 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 258 308 -0.038977 -2.98935 -0.041741 0.0518484 0.00350401 0.0563979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 308 309 2.58052 0.156052 -0.0282611 0.026831 0.0615415 0.103556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 259 309 0.117742 -3.02558 -0.291466 0.0690481 -0.016789 0.0141453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 309 310 2.54353 0.161132 -0.101395 0.0055641 0.05408 0.148084 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 260 310 0.0983486 -3.04401 0.0630866 0.0647968 0.00689383 0.0215674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 310 311 2.52355 -0.0753586 -0.0144411 0.00808827 0.0647891 0.0419549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 261 311 0.103972 -3.23229 -0.132702 0.0606288 -0.00911027 -0.0407024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 311 312 2.55843 0.191971 -0.117608 0.0192683 0.0332596 0.0574377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 262 312 -0.146462 -3.2258 -0.024178 0.0555791 -0.00128182 -0.0545485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 312 313 2.59115 0.0146552 -0.0545087 0.00410721 0.0378454 0.0866658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 263 313 0.041537 -3.11484 -0.211902 0.0519565 0.0146515 -0.0366972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 313 314 2.7719 0.0842506 0.00799343 0.00496255 0.05914 0.0863856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 264 314 0.0122075 -2.67492 -0.159409 0.0574287 -0.0123743 0.0430818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 314 315 2.59943 0.08656 0.0773209 0.0114575 0.061365 0.129965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 265 315 0.0623737 -3.07501 -0.135195 0.0678648 0.00309969 0.0473259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 315 316 2.56185 -0.038594 -0.130812 0.0146796 0.0591207 0.111583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 266 316 0.0202681 -3.02132 -0.108423 0.0636476 -0.00817666 0.00235996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 316 317 2.58343 0.0497491 0.0273671 -0.0138387 0.0544616 0.0936768 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 267 317 -0.157225 -3.18032 -0.0391657 0.0513371 -0.00506462 0.0475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 317 318 2.45417 -0.0622298 0.0542601 0.00629408 0.0499152 0.150717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 268 318 0.227863 -2.92362 -0.0551483 0.0629681 -0.0186735 -0.0347945 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 318 319 2.5998 -0.0572395 -0.184706 0.014423 0.03419 0.13126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 269 319 0.150875 -3.14073 0.056212 0.0565669 -0.0224126 -0.0450683 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 319 320 2.69845 0.0876705 -0.0726314 0.0124856 0.0467442 0.0674456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 270 320 0.0302405 -2.94097 0.0195797 0.0521747 0.00694305 -0.001221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 320 321 2.64474 -0.141128 -0.0760252 0.00991935 0.0306692 0.168295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 271 321 0.111483 -2.98989 -0.0668654 0.0551202 -0.000331409 -0.0557024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 321 322 2.53724 0.0399798 -0.0673388 0.00503454 0.054849 0.119775 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 272 322 -0.0252455 -3.08534 -0.0673068 0.0588059 -0.00231154 -0.0192559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 322 323 2.64459 0.197896 0.086238 -0.0188356 0.0652948 0.103952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 273 323 0.0460613 -3.01295 -0.117746 0.0455812 0.00663504 0.0431067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 323 324 2.74405 0.118855 -0.128794 0.00338399 0.0597662 0.0975454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 274 324 0.00630421 -3.02644 -0.0487656 0.0589253 -0.00266446 0.0222746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 324 325 2.79623 0.150104 -0.103291 0.00423849 0.0476681 0.119731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 275 325 0.158625 -3.15376 -0.134453 0.0507231 0.0156692 0.0396078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 325 326 2.58383 0.101972 0.0547001 -0.00101533 0.069927 0.0714858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 276 326 0.048248 -2.98662 -0.0409321 0.0432863 0.00107726 0.0014342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 326 327 2.73928 0.236487 -0.0642725 0.00747905 0.0165434 0.185547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 277 327 0.13536 -3.03136 -0.0904836 0.0734037 -0.0135481 0.00495507 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 327 328 2.5945 0.328433 -0.0731877 0.0037788 0.0487799 0.15722 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 278 328 0.0149143 -3.15991 -0.126968 0.0527968 -0.000477374 8.30888e-06 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 328 329 2.71027 0.159758 -0.00752501 -0.0096679 0.0410819 0.0840555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 279 329 0.0451922 -3.16909 -0.140876 0.0608477 -0.00631788 0.023486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 329 330 2.74073 0.181573 -0.0288775 0.014218 0.0470764 0.0647657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 280 330 0.0695638 -3.07913 -0.0356025 0.0481555 0.00100569 -0.0310602 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 330 331 2.80562 -0.00400767 -0.165928 0.0180792 0.040529 0.158776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 281 331 0.0315745 -3.1598 -0.233664 0.0617464 0.00124763 0.0260476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 331 332 2.65997 -0.0256876 -0.0245655 0.00993111 0.048713 0.107842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 282 332 -0.0577875 -2.93112 -0.122457 0.0588323 -0.00405377 0.0489408 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 332 333 2.61047 0.0522071 -0.053205 0.00120208 0.0543207 0.147944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 283 333 -0.0268156 -2.75783 -0.115114 0.0546577 0.0162552 0.0115813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 333 334 2.66212 0.106019 -0.0891965 -0.00732021 0.0635404 0.0916861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 284 334 -0.0721355 -3.09307 -0.013885 0.0685537 0.00030565 -0.0448545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 334 335 2.86176 0.0803541 0.0339033 0.0109522 0.0376732 0.0752878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 285 335 0.150753 -2.80772 -0.149334 0.0611653 -0.0332896 -0.0561361 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 335 336 2.63173 0.0857922 -0.0765264 1.53475e-05 0.052641 0.122235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 286 336 0.0608423 -3.02065 -0.0145856 0.0561999 0.0129869 0.0281077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 336 337 2.63794 0.162968 -0.0143013 0.00197288 0.065805 0.0636246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 287 337 -0.0255246 -3.05047 -0.185222 0.070739 -0.00597479 0.00128604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 337 338 2.86214 0.133707 0.0364661 0.00436976 0.0625681 0.142672 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 288 338 0.0331453 -3.00436 -0.0687598 0.0588309 -0.00273267 -0.0396027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 338 339 2.85028 0.00576298 -0.04141 0.0130163 0.0583887 0.142645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 289 339 0.0314378 -2.99084 -0.0456048 0.0604781 0.00116494 -0.0513464 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 339 340 2.71056 0.189705 -0.199337 0.000398493 0.066848 0.118615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 290 340 0.0876317 -3.21416 -0.0478817 0.0728223 -0.018189 0.0330845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 340 341 2.73563 0.14105 -0.210063 0.0139426 0.0607439 0.0944863 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 291 341 -0.0927587 -3.09953 0.0212842 0.0511708 -0.00457383 0.00536161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 341 342 2.8134 0.160499 -0.0633969 0.000677356 0.0660403 0.111132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 292 342 -0.152173 -3.15096 0.123591 0.0775026 -0.00439625 0.0413479 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 342 343 2.9477 0.0578942 -0.185103 0.0185431 0.0479529 0.0581119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 293 343 -0.0792689 -2.99066 -0.176326 0.051252 -0.00702787 0.0431172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 343 344 2.87939 0.28442 0.111384 0.00133339 0.0366732 0.110842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 294 344 -0.0749327 -3.07287 -0.169298 0.0534514 0.000271136 0.000986308 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 344 345 2.79356 0.136136 -0.163805 -0.00194104 0.0379549 0.0219771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 295 345 -0.0298243 -3.06462 -0.058291 0.0709493 -0.00815554 0.0317147 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 345 346 2.84246 0.109173 -0.141872 -0.00920729 0.0553079 0.154226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 296 346 -0.208389 -3.11332 -0.158929 0.0642027 -0.00334567 0.042405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 346 347 2.84809 0.131258 -0.0112449 -0.0014044 0.0652313 0.189728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 297 347 0.00397964 -3.16043 -0.229948 0.0614931 -0.0160772 0.0761069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 347 348 3.03374 0.123149 0.0392922 0.02612 0.0543123 0.0898261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 298 348 0.0542878 -2.83593 0.0760777 0.0643477 -0.00150513 0.00642693 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 348 349 2.71507 0.0797169 -0.0195319 0.0020167 0.0532774 0.105998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 299 349 0.0954617 -2.9754 -0.130473 0.0654208 0.00382247 0.0785619 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 349 350 2.82924 -0.026305 -0.0527465 -0.0111115 0.0483014 0.10985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 300 350 -0.0343199 -3.01386 -0.138736 0.0540196 0.0109195 0.0138185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 350 351 2.87978 0.000666609 0.00867498 0.00593418 0.0544811 0.0584537 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 301 351 0.265006 -3.15289 -0.019854 0.0473533 0.00963643 -0.0199246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 351 352 2.8458 0.130492 0.00630286 0.00456671 0.0575172 0.14053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 302 352 -0.117375 -3.10649 -0.151037 0.0430529 -0.0114369 0.0337997 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 352 353 2.89921 0.207804 0.139018 0.00202502 0.0480767 0.137702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 303 353 -0.1724 -3.12157 0.204506 0.0501468 -0.0168333 -0.0626732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 353 354 3.03432 0.108421 -0.201936 0.000991819 0.0624457 0.054975 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 304 354 0.0457296 -3.00187 -0.21433 0.0588106 0.0153098 0.0108644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 354 355 2.83666 0.0997601 0.117516 0.00752237 0.0664889 0.0882141 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 305 355 0.0365762 -3.20068 -0.120433 0.0711442 -0.00588895 0.0200344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 355 356 2.83688 -0.108716 -0.142772 -0.0086111 0.0542311 0.141148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 306 356 -0.0840794 -2.99812 -0.0461709 0.0632397 0.0118873 0.0279077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 356 357 2.93553 0.148458 -0.31026 0.00595053 0.0478201 0.248812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 307 357 0.123624 -3.1738 -0.232172 0.0714473 0.00122137 0.000212123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 357 358 2.86284 0.062805 -0.0995848 0.00610352 0.0736154 0.1608 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 308 358 0.184947 -2.95908 0.074224 0.0727213 0.00146253 0.0233154 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 358 359 2.82224 0.228264 -0.179339 0.00612176 0.0558687 0.100173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 309 359 -0.0679075 -2.92765 0.0616984 0.0608368 -0.00528454 0.101143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 359 360 2.87326 -0.0120272 0.0680689 -0.00286332 0.0477168 0.124242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 310 360 -0.0660665 -3.25747 -0.0252614 0.0494632 -0.00833563 -0.0461579 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 360 361 2.94578 0.103857 -0.00621059 0.0131982 0.0482684 0.105892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 311 361 -0.0881092 -2.99737 -0.115497 0.0512331 0.00978022 0.00682433 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 361 362 2.87397 0.145398 -0.125625 -0.0199799 0.0539534 0.134913 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 312 362 -0.0289822 -3.03785 -0.0624406 0.0707626 0.00670005 -0.0375735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 362 363 2.66867 0.067003 -0.117472 -0.00118966 0.0740494 0.104503 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 313 363 -0.151813 -3.28227 -0.277165 0.0543925 -0.00365733 0.0230941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 363 364 2.91263 -0.0694548 -0.160375 0.00735127 0.082979 0.112313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 314 364 -0.00254953 -3.19376 -0.00343866 0.033928 0.00799826 -0.035226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 364 365 2.91952 0.129288 -0.168713 0.00877359 0.0726576 0.143324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 315 365 0.0155068 -2.96301 -0.179671 0.0512492 0.00806169 -0.0143289 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 365 366 2.94564 0.101368 -0.0217288 0.0142392 0.0715118 0.150179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 316 366 0.0664133 -3.11125 -0.0599331 0.0628588 -0.00326163 0.0553416 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 366 367 3.05253 0.227679 0.0875629 0.000632479 0.0526161 0.0772915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 317 367 -0.1074 -3.00215 0.0437778 0.0586543 0.00157632 -0.0105174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 367 368 2.90293 -0.113606 -0.0359419 0.00282247 0.0482182 0.0628278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 318 368 0.0884503 -3.14416 -0.241082 0.0785013 -0.000574608 -0.00577866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 368 369 2.73985 0.213837 0.0781447 0.0299315 0.0574055 0.153566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 319 369 -0.129026 -3.04014 0.0962665 0.076494 0.00602457 -0.00764817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 369 370 2.96903 0.0841959 -0.012548 0.0076488 0.0522346 0.113021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 320 370 0.0266504 -3.09222 -0.0154214 0.0835037 -7.04221e-05 -0.0160302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 370 371 3.04959 0.17682 0.0770593 0.00945497 0.05475 0.106421 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 321 371 0.0231897 -3.04714 -0.174079 0.0492951 -0.00102889 0.00799371 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 371 372 2.87679 0.0868652 -0.348639 0.0100684 0.0743655 0.119378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 322 372 0.0857668 -3.07846 -0.175278 0.051206 0.00428826 0.0216727 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 372 373 3.15181 0.0931108 -0.130737 0.00331165 0.0582827 0.119341 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 323 373 0.0151937 -3.11577 -0.0335541 0.0614269 -0.00985371 0.0710828 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 373 374 2.9804 0.0300695 -0.133022 0.0179785 0.0725955 0.122143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 324 374 -0.0533005 -2.9534 -0.0210836 0.0564708 -0.00443932 -0.0140842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 374 375 2.796 0.119305 -0.132021 0.0156483 0.0530531 0.0863005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 325 375 -0.0850833 -3.09657 0.0424286 0.0625068 -0.00282612 -0.0451653 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 375 376 2.97303 0.0353721 -0.0658551 -0.00465192 0.0806502 0.0483663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 326 376 0.0681386 -3.14417 -0.0568083 0.0543433 0.0102875 0.0369799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 376 377 2.90809 0.096925 -0.0287028 0.00475966 0.0667139 0.0328017 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 327 377 -0.0986384 -3.04283 -0.00246123 0.0684494 0.012665 0.0220771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 377 378 2.86714 -0.140645 0.0190846 -0.000852787 0.0561766 0.168859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 328 378 0.0270612 -3.18904 0.0068394 0.0582885 0.00551692 -0.0587517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 378 379 2.98309 0.0224041 -0.0317134 0.0187183 0.0575962 0.155708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 329 379 0.0423988 -3.14623 0.00629121 0.0728886 -0.0101116 0.0430335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 379 380 3.07073 0.0327595 -0.0758744 0.000379658 0.0556845 0.186298 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 330 380 0.0400586 -3.17669 -0.00120155 0.0743761 -0.00873533 -0.00679735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 380 381 3.10564 0.0907773 0.0914588 0.00644539 0.0677491 0.0982332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 331 381 0.0515707 -2.98244 -0.119449 0.0673407 -0.00682151 0.0132342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 381 382 3.16325 0.0180853 -0.0669987 0.00318931 0.0639728 0.0649999 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 332 382 -0.121467 -3.06315 -0.137284 0.0851848 0.00636444 -0.0091023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 382 383 3.03272 -0.00647344 -0.0858751 0.000451769 0.0519935 0.0546537 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 333 383 0.0810237 -2.98352 -0.079982 0.0614974 0.000664671 -0.0186466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 383 384 3.10634 0.144404 -0.304956 0.00345544 0.07107 0.134859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 334 384 -0.0612038 -3.14884 0.0278424 0.0738103 0.00823268 -0.0308931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 384 385 3.18203 0.08945 -0.147059 0.0115985 0.0658424 0.0916337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 335 385 -0.0917869 -2.89855 -0.0774573 0.0757601 -0.00317688 -0.0486844 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 385 386 3.11767 0.0502868 -0.0732789 -0.00248194 0.0682921 0.150294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 336 386 0.023934 -3.0237 -0.194363 0.061112 -0.00524443 0.0195153 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 386 387 3.01447 0.081949 -0.00580409 0.00122972 0.0599023 0.147966 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 337 387 0.112594 -3.22375 -0.258141 0.0617473 0.00743139 -0.0409924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 387 388 3.20588 0.200952 -0.109076 0.0365328 0.0559534 0.106005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 338 388 -0.122149 -3.1064 -0.180947 0.0534253 -0.00151982 0.0530027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 388 389 3.08185 -0.0043165 -0.198868 0.00502045 0.0700785 0.0533675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 339 389 -0.122625 -3.14797 -0.063126 0.0711918 0.00297775 -0.0206773 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 389 390 3.19034 -0.0125952 -0.105443 -0.012163 0.0735104 0.0541364 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 340 390 0.0557067 -3.0186 -0.180773 0.0594348 0.0214338 -0.0393865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 390 391 3.11216 0.162806 -0.267381 0.0124649 0.0664924 0.0946969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 341 391 -0.0238847 -3.08454 -0.120323 0.0642753 -0.00845573 -0.0514858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 391 392 2.97079 0.13584 -0.1802 -0.0142952 0.067535 0.0966197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 342 392 0.0492906 -3.05011 -0.0925048 0.064389 0.0247469 -0.041795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 392 393 3.20136 0.202724 -0.0513181 0.0136725 0.0615387 0.0576334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 343 393 0.18446 -2.95983 -0.0489129 0.0635761 0.0140854 -0.0382634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 393 394 3.30615 0.147441 -0.0178528 0.00853044 0.0692574 0.0965268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 344 394 0.0987677 -3.08234 -0.146997 0.0623897 -0.0125023 0.01614 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 394 395 3.10456 0.186036 -0.10306 0.0118121 0.0592698 0.0647979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 345 395 -0.0766605 -3.20372 -0.188753 0.0545575 -0.00429321 -0.00106916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 395 396 3.02261 0.0745221 -0.211983 0.0163996 0.0649906 0.146119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 346 396 -0.0504546 -3.05566 -0.0827472 0.0635477 0.0132165 0.00471594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 396 397 3.18018 0.0461198 0.0624689 0.0192863 0.0663766 0.0862823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 347 397 0.109153 -3.0851 -0.209512 0.0537192 0.000488301 0.0163928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 397 398 3.07187 0.124298 0.0504869 0.00819872 0.0763682 0.144783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 348 398 0.0309543 -3.08974 -0.13822 0.0522938 0.00771685 0.0370596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 398 399 3.19152 0.0914991 -0.142671 -0.00253466 0.0703534 0.107224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 349 399 0.0265289 -2.91285 0.0861061 0.0665995 -0.00752491 -0.0341986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 399 400 3.21972 0.149408 -0.172255 -0.0062377 0.0598966 0.1133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 350 400 -0.0421807 -3.24188 0.065461 0.064132 -0.00978236 -0.00385851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 400 401 3.27413 -0.024151 -0.182691 0.0023934 0.0673349 0.128761 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 351 401 0.0413224 -3.1157 -0.233956 0.0660047 0.00178252 -0.0124006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 401 402 3.16193 0.214827 -0.189693 0.00562081 0.0492187 0.125822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 352 402 -0.083502 -3.1765 -0.257381 0.0704937 0.00282212 -0.0634518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 402 403 3.23378 -0.0293437 -0.0900133 0.0226492 0.0413576 0.150006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 353 403 -0.0650663 -3.24076 -0.139133 0.0625174 0.00108883 -0.0155092 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 403 404 3.22247 -0.0128357 -0.141105 -0.0134586 0.0705725 0.121427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 354 404 -0.192399 -3.05254 -0.0205584 0.060591 0.0002854 -0.013883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 404 405 3.12734 0.0737837 -0.330096 -0.000906265 0.0869039 0.12337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 355 405 -0.0605368 -2.91813 0.151889 0.0654096 0.0185753 -0.0576067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 405 406 3.32 -0.0202808 -0.182474 -0.00161277 0.061404 0.143872 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 356 406 0.0697443 -3.11318 -0.0605606 0.0608481 -0.00977865 0.0313103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 406 407 3.39081 0.0510789 0.0479507 0.00910013 0.0652233 0.0363149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 357 407 -0.052607 -3.14251 -0.256375 0.0736337 0.00172698 -0.0436513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 407 408 3.26193 0.161083 -0.0500117 0.0015418 0.0720797 0.0593477 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 358 408 0.112514 -2.98367 0.0173553 0.0602897 -0.0090976 0.0378503 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 408 409 3.31422 0.155672 0.0320465 0.00767183 0.0415094 0.0580505 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 359 409 -0.0525742 -3.20008 -0.0944529 0.0493181 -0.00233522 -0.0687765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 409 410 3.12657 0.253023 -0.0846193 0.0123177 0.0763351 0.0350927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 360 410 -0.18415 -2.94843 -0.074468 0.0568125 -0.00028706 -0.0179449 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 410 411 3.37265 0.028787 -0.074283 0.0056486 0.0545174 0.0537736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 361 411 -0.0716385 -3.01298 -0.0871289 0.0651812 -0.00308784 -0.0166344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 411 412 3.4127 0.00462193 -0.204093 -0.00795592 0.0584474 0.0656573 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 362 412 0.0542683 -3.23037 -0.117154 0.0679359 0.000893003 0.0105506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 412 413 3.22292 0.103352 -0.0944368 -0.00684744 0.09333 -0.00604946 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 363 413 0.013873 -3.02507 -0.102966 0.082015 -0.00501019 0.00471072 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 413 414 3.26788 0.0146335 0.0374291 0.00842318 0.0859766 0.180298 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 364 414 -0.0182592 -2.94417 -0.00237069 0.0639197 -0.000574346 0.0147323 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 414 415 3.17238 0.0633887 -0.0437359 0.0187326 0.0652702 0.125705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 365 415 -0.11561 -3.28737 -0.263701 0.0582578 -0.00499865 0.0455227 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 415 416 3.30838 0.0944925 -0.0954845 0.00729597 0.0607829 0.126268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 366 416 0.0202636 -2.92963 -0.109526 0.068734 -0.00326315 0.055255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 416 417 3.23944 0.0461074 -0.0681797 0.00509117 0.0769717 0.132596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 367 417 -0.0540784 -3.02968 0.04813 0.0539106 0.00124784 0.0076004 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 417 418 3.26348 0.127138 -0.1021 0.00996694 0.0555856 0.127564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 368 418 -0.175451 -3.09671 -0.0820867 0.0601473 0.000380817 -0.061502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 418 419 3.2143 0.22254 -0.0195218 0.00763005 0.0674576 0.064736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 369 419 0.0532406 -3.03388 -0.175604 0.0451139 -0.000250139 0.0104006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 419 420 3.35026 -0.0314446 -0.122256 -0.000908794 0.0857293 0.149367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 370 420 -0.0564968 -3.09617 -0.0723869 0.040321 -0.00654928 0.0210118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 420 421 3.35593 0.166072 0.00112407 0.00736939 0.0619274 0.0813255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 371 421 -0.0627655 -3.09987 -0.098957 0.0603596 -0.00491288 0.0348535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 421 422 3.41509 0.201902 -0.191458 0.0156394 0.060328 0.0575159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 372 422 -0.171848 -3.312 -0.154478 0.0706557 -0.00784438 -0.0270189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 422 423 3.5661 -0.0468487 -0.141353 0.0126043 0.0628571 0.103265 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 373 423 -0.0468701 -3.1413 -0.0624481 0.0659145 -0.00731169 -0.00254067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 423 424 3.3959 0.122381 -0.136459 -0.0016161 0.0566852 0.0991456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 374 424 0.088291 -3.02906 -0.155652 0.0665207 0.0031223 0.0225128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 424 425 3.21485 -0.0281558 0.0346627 1.70487e-05 0.0655007 0.0809431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 375 425 0.207394 -2.91419 -0.114998 0.0443429 0.00476568 -0.00916546 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 425 426 3.30277 -0.0664087 -0.201607 -0.000455865 0.0718705 0.0716525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 376 426 0.0181117 -3.01259 0.000238796 0.0600674 0.00945289 -0.0117362 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 426 427 3.2611 0.114489 -0.231325 -0.00404 0.0563417 0.164283 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 377 427 -0.041838 -3.06789 -0.0795635 0.0490841 0.025016 -0.00609523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 427 428 3.37976 0.141219 -0.306502 0.0166451 0.0717761 0.187493 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 378 428 0.0931215 -2.97914 -0.308081 0.0706244 0.0190079 -0.0114075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 428 429 3.31658 -0.058278 -0.173215 -0.0041398 0.0666654 0.162559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 379 429 0.0257219 -3.1835 -0.15155 0.0603111 -0.0197848 0.0457061 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 429 430 3.3345 0.102947 -0.105852 0.0042141 0.0684127 0.113874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 380 430 -0.0319896 -3.33208 -0.0583484 0.0570383 0.00351714 -0.0468665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 430 431 3.35613 0.0908043 -0.205256 0.00772584 0.0845123 0.102353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 381 431 0.126897 -3.13356 -0.14294 0.0759472 0.0126129 -0.0126956 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 431 432 3.29621 0.199104 -0.10716 0.00594896 0.0771551 0.118976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 382 432 0.0565417 -3.26596 -0.108116 0.0541018 -0.00129124 0.0238849 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 432 433 3.45039 0.344012 -0.170228 0.0105124 0.0711753 0.0548195 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 383 433 0.07558 -3.15481 -0.213848 0.0563858 -0.00896761 -0.0022658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 433 434 3.32673 0.157965 -0.025901 0.0148389 0.077518 0.127199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 384 434 0.0770277 -3.0559 0.0140446 0.0620608 -0.00685316 0.0523082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 434 435 3.27829 0.135749 -0.18293 0.0177394 0.0777283 0.053291 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 385 435 -0.0283599 -3.1751 -0.271241 0.0682922 0.0110072 0.0185807 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 435 436 3.56308 0.192495 0.0145542 0.00651771 0.0713745 0.167788 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 386 436 0.1967 -3.05667 -0.0109382 0.0712059 -0.000642856 -0.0140095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 436 437 3.20551 0.0425734 -0.168717 0.00981742 0.0820111 0.0857287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 387 437 0.109931 -2.92796 0.0553454 0.0355482 -0.015978 0.0121646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 437 438 3.39451 0.209493 -0.20637 -0.00910851 0.0772339 0.0799571 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 388 438 0.00671874 -3.11942 -0.0945887 0.0512102 -0.00634607 0.000368925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 438 439 3.18075 -0.080392 -0.132056 -0.0025742 0.042594 0.109325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 389 439 0.032196 -3.17175 -0.172647 0.0502252 -0.00628953 -0.0250875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 439 440 3.54228 0.143921 -0.241116 0.00100928 0.0578819 0.158373 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 390 440 -0.033753 -3.14126 -0.147433 0.0719109 0.00547693 0.0763904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 440 441 3.38823 -0.051158 -0.0980165 0.0144754 0.0684642 0.125917 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 391 441 -0.0315664 -3.1566 -0.00745872 0.0656866 -0.0134408 -0.0209012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 441 442 3.27827 0.124023 -0.102063 -0.00416668 0.0736536 0.0532165 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 392 442 -0.0306541 -3.08218 0.0422496 0.0601903 -0.000588123 -0.0067049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 442 443 3.56728 -0.0719442 -0.377339 0.00757625 0.07661 0.118502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 393 443 0.102152 -3.07496 -0.0456719 0.056529 -0.00136995 -0.0137568 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 443 444 3.62625 0.0721493 -0.156417 0.0222885 0.0759356 0.107998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 394 444 -0.0507474 -3.10341 0.0431926 0.0732952 -0.00367414 -0.00546226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 444 445 3.32187 0.127136 -0.110797 0.0263874 0.0819347 0.117101 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 395 445 -0.0172256 -3.22721 -0.117645 0.061752 -0.00315061 -0.0430562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 445 446 3.53989 0.127564 -0.0473487 0.0056888 0.0652421 0.121905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 396 446 0.106587 -3.11316 0.0185749 0.0484163 -0.0063512 -0.0209178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 446 447 3.58459 -0.00379123 -0.0336647 0.0219403 0.0659642 0.116624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 397 447 -0.0201798 -3.03708 -0.0914904 0.0655264 -0.00178806 -0.0116168 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 447 448 3.46325 0.173719 -0.0595293 0.00733091 0.0624233 0.157544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 398 448 -0.147206 -3.16075 -0.0171375 0.065731 -0.00422425 -0.0618062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 448 449 3.55411 0.204853 -0.184507 -0.00155623 0.0502297 0.0839438 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 399 449 -0.104981 -3.10923 -0.0205621 0.0603971 0.00120703 -0.0118557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 449 450 3.57962 0.0782268 -0.119861 0.0147521 0.0724566 0.0747318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 400 450 -0.203892 -3.06867 0.0130038 0.0517254 -0.0102964 -0.0364815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 450 451 3.35634 0.127703 0.102256 0.00931259 0.0601557 0.133427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 401 451 -0.0173478 -2.99093 -0.184401 0.0628268 -0.0151161 -0.00193195 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 451 452 3.61229 0.184675 -0.168935 0.00261009 0.067708 0.103225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 402 452 0.0359814 -3.03873 -0.0784567 0.0661043 0.020562 0.0101725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 452 453 3.57427 0.0722839 -0.0655716 0.00413538 0.0886351 0.0986128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 403 453 -0.022771 -3.00832 0.0193771 0.0630506 0.00120391 0.0182758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 453 454 3.47514 0.116031 -0.215117 0.0112577 0.0862787 0.118197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 404 454 -0.0361572 -3.00766 0.0409691 0.0728597 0.0131933 0.0233485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 454 455 3.61715 0.0685614 -0.0014102 0.0126773 0.072259 0.113569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 405 455 -0.031604 -2.83553 -0.119168 0.0580639 -0.00373161 0.0470486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 455 456 3.45329 0.18322 -0.121366 0.0148615 0.0841383 0.070395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 406 456 0.0127513 -3.19293 -0.0453915 0.0653588 -0.00340459 -0.0137889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 456 457 3.76647 0.211655 -0.347048 0.00476863 0.0812274 0.176235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 407 457 -0.0906149 -2.99691 -0.172306 0.066498 -0.0062711 0.00669413 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 457 458 3.4447 0.189049 -0.00781451 0.00164876 0.0805827 0.190063 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 408 458 0.121398 -3.02982 -0.363333 0.0581788 -0.00173128 -0.0916576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 458 459 3.53498 0.0785846 0.0688918 -0.00562856 0.0728812 0.0453671 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 409 459 0.00134455 -3.14766 -0.0476588 0.058278 -0.00106286 0.0183033 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 459 460 3.60933 0.123437 -0.309198 -0.00327918 0.0661405 0.122024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 410 460 0.0447064 -3.27094 -0.141518 0.0585911 -0.00702426 -0.0335374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 460 461 3.38766 0.201033 -0.133137 0.00358922 0.0955989 0.121226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 411 461 -0.0889622 -2.85268 -0.0480516 0.0647974 0.00941662 -0.0388561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 461 462 3.51512 0.221229 -0.173054 0.00618404 0.0712243 0.162774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 412 462 0.0372867 -3.18528 -0.271924 0.0573535 -0.00743599 0.102081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 462 463 3.54555 0.142099 -0.169522 0.000488576 0.074359 0.107033 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 413 463 0.096881 -3.08444 -0.144603 0.0663503 -0.00937494 0.0398517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 463 464 3.54701 0.145732 -0.306492 -0.0011144 0.0835083 0.0511724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 414 464 -0.0822471 -3.01655 -0.0870149 0.0693481 0.012466 -0.0123817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 464 465 3.62741 0.0754943 -0.233159 0.00765328 0.065801 0.13613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 415 465 0.119231 -2.87575 0.0312047 0.0476469 -0.00013909 -0.00460523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 465 466 3.60857 -0.0900581 -0.286237 0.0189407 0.0598527 0.144245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 416 466 -0.0238928 -2.89703 -0.104066 0.0461448 -0.00695667 0.0236071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 466 467 3.59722 0.203756 -0.0427307 0.00596031 0.0457527 0.151585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 417 467 0.00737793 -3.0064 -0.10457 0.0651257 -0.00994244 0.00527011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 467 468 3.56376 0.162283 -0.100662 0.0098684 0.0832587 0.121443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 418 468 -0.117599 -3.19109 -0.0209419 0.058818 0.000310715 -0.0133034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 468 469 3.54669 -0.0492029 0.00153818 -0.00898604 0.063461 0.153763 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 419 469 -0.137726 -3.07157 -0.293235 0.0562408 3.93579e-05 0.0395334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 469 470 3.64499 0.0668751 0.0793052 0.00728216 0.0634792 0.0813333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 420 470 -0.0588484 -2.98912 0.0163386 0.0462394 -0.00551386 -0.0118488 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 470 471 3.69806 0.169708 -0.211487 0.0106137 0.0811955 0.0964504 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 421 471 0.0588939 -3.08021 -0.274182 0.069182 0.00438603 0.0226383 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 471 472 3.49565 0.182365 -0.168005 0.0145362 0.0860038 0.147629 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 422 472 0.0998706 -3.09977 -0.117523 0.0753753 -0.000740373 0.0663712 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 472 473 3.62298 0.0511005 -0.266726 0.0112909 0.0735707 0.0828631 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 423 473 -0.245608 -3.16258 0.0298535 0.0619629 0.0127773 -0.0207177 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 473 474 3.71147 0.192303 -0.091043 0.00835421 0.084388 0.161083 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 424 474 -0.0366605 -3.16246 -0.275683 0.0728952 -0.00321742 0.0235333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 474 475 3.74325 0.0567789 -0.0913575 0.0199787 0.0675884 0.142338 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 425 475 -0.00977704 -3.09312 -0.100344 0.0779361 -0.00936006 0.00371811 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 475 476 3.59765 -0.10032 -0.0151919 0.0116111 0.0798173 0.0648273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 426 476 -0.111029 -3.08446 -0.211274 0.0679393 0.00530336 0.0359134 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 476 477 3.67405 0.121143 -0.100621 -0.00723202 0.0727352 0.0518767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 427 477 -0.0108214 -3.09198 -0.0355495 0.0575443 0.00591971 0.0289628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 477 478 3.62676 0.177563 -0.174458 0.00410312 0.0693503 0.0994985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 428 478 -0.0573733 -3.1696 -0.106993 0.0848252 -0.00389152 0.0292275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 478 479 3.67612 0.158047 -0.357277 0.0111516 0.0806011 0.112475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 429 479 0.163057 -2.92047 -0.175626 0.0578112 -0.00673874 0.00383637 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 479 480 3.60555 0.204163 -0.266459 0.00292518 0.062502 0.127485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 430 480 0.0446952 -3.1157 0.0497409 0.0591882 0.00596649 0.0160401 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 480 481 3.65388 0.054029 -0.316871 0.00326098 0.0733995 0.117662 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 431 481 0.0376101 -3.07516 0.0221836 0.0616573 -0.00502553 0.00636831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 481 482 3.86591 0.0935133 -0.0553218 0.00236865 0.0758955 0.122872 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 432 482 0.0519618 -3.10432 -0.0415326 0.046882 -0.0021714 0.0118425 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 482 483 3.65019 0.18456 -0.190368 -0.0110337 0.0642148 0.0859518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 433 483 0.0776679 -2.84919 -0.135489 0.0635802 0.0168134 -0.032814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 483 484 3.69693 0.0751205 -0.291048 -0.00694089 0.0649147 0.0681274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 434 484 -0.117491 -2.89128 -0.0367233 0.0665251 -0.0060374 0.0642309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 484 485 3.62024 0.27103 -0.0687773 0.00762217 0.0713111 0.0696647 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 435 485 -0.1062 -2.99011 -0.142849 0.0652837 -0.00187974 0.0201052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 485 486 3.77084 0.313037 -0.115862 -0.00445653 0.0944266 0.115348 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 436 486 -0.000317152 -2.9345 -0.204794 0.051365 0.0059283 0.00284339 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 486 487 3.70517 0.187198 -0.129466 -0.00885559 0.0931207 0.115496 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 437 487 -0.0508378 -3.03232 -0.0248464 0.079242 -0.0147366 -0.00104854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 487 488 3.8475 0.256771 -0.130784 0.00299356 0.0930348 0.0788507 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 438 488 -0.0578187 -2.9426 -0.145818 0.0651443 -0.007795 -0.0723541 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 488 489 3.78842 0.0223509 -0.0382019 -0.00377433 0.0779189 0.146746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 439 489 -0.087692 -2.96877 0.0486791 0.0458999 0.00524889 0.00396505 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 489 490 3.88276 0.158716 -0.180889 0.00116958 0.0754741 0.178986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 440 490 -0.101993 -3.2531 -0.163744 0.0646804 -0.0151943 -0.0614372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 490 491 3.75782 0.083999 -0.1481 0.00357087 0.0620913 0.00107785 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 441 491 -0.0548397 -2.97261 -0.161954 0.0606027 0.00948554 0.0115832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 491 492 3.77221 -0.111307 -0.254365 0.00197053 0.0667299 0.080233 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 442 492 0.0476361 -3.03631 -0.0250002 0.0598625 0.00977126 -0.00378224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 492 493 3.58833 0.0925936 -0.145602 0.0288871 0.0722581 0.11045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 443 493 0.214312 -2.99151 -0.150953 0.0649247 -0.00125136 0.0266043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 493 494 3.82132 0.0112118 -0.245382 0.00614675 0.051671 0.0942329 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 444 494 -0.0656956 -3.17403 -0.0652417 0.0607093 -0.009534 0.0424553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 494 495 3.82029 0.2063 -0.203608 0.0130572 0.0748444 0.141814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 445 495 -0.0713465 -2.86925 0.0338818 0.0709912 -0.000325425 -0.00895378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 495 496 3.76289 0.134068 -0.0645702 -0.0100058 0.0697079 0.154513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 446 496 0.0593604 -3.02213 -0.113658 0.0699398 0.00136843 -0.0636795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 496 497 3.73 0.173224 -0.328378 0.00436913 0.0666895 0.130199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 447 497 -0.0463884 -3.06277 0.0458042 0.0477075 0.0163994 -0.0263504 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 497 498 3.84273 0.145939 -0.220872 -0.0154486 0.0743354 0.12186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 448 498 0.0517956 -2.92205 -0.0539414 0.0542212 -0.00577298 0.101138 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 498 499 3.79888 0.0821883 -0.08635 0.0020933 0.0656837 0.0278159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 449 499 0.110917 -3.00957 -0.0831002 0.0638767 -0.00309468 -0.0415856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 499 500 3.83306 0.0759601 -0.253652 0.0139164 0.0817269 0.0839091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 450 500 0.0434672 -2.90754 -0.0126111 0.0676594 0.0183853 0.0524981 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 500 501 3.85151 0.138466 0.128253 -0.00870097 0.0904362 0.194709 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 451 501 -0.0013868 -3.14524 -0.00917391 0.0632742 0.0126577 -0.0189674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 501 502 3.91966 0.0524988 -0.0996591 -0.00861704 0.0857304 0.165154 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 452 502 -0.275645 -3.12191 -0.0770046 0.0442581 0.00897228 0.0148245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 502 503 3.98606 0.194653 -0.345098 0.0246064 0.0880796 0.134648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 453 503 0.0725374 -3.00983 0.0475128 0.067025 -0.000981525 -0.0277845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 503 504 3.73441 0.108589 -0.160056 0.00124094 0.0802607 0.0750512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 454 504 0.123422 -3.18604 -0.0824937 0.062116 -0.0122956 -0.0437691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 504 505 3.78242 0.0320403 -0.322713 0.0137592 0.0790056 0.0854509 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 455 505 0.11624 -3.08774 -0.0372738 0.0729123 0.00194156 -0.0251189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 505 506 3.70364 0.0432564 -0.226615 -0.00139495 0.0766945 0.128247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 456 506 0.0899581 -3.09202 -0.191797 0.0614763 0.00428884 -0.0322435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 506 507 3.91129 0.000431945 -0.0944495 0.0340613 0.0992868 0.0908592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 457 507 -0.0583982 -2.92281 -0.123895 0.0648013 -0.00474148 -0.0584832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 507 508 3.97862 0.213963 0.00115162 0.0211217 0.0786748 0.0448445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 458 508 -0.0224024 -3.01623 -0.00626124 0.0559473 -0.0151359 -0.0247848 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 508 509 3.96986 0.0386509 -0.109516 0.00646992 0.0679851 0.106532 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 459 509 0.00568359 -3.23055 -0.0902167 0.0637837 0.00321402 0.0295698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 509 510 3.81819 -0.0859875 -0.110866 -0.00463445 0.0766746 0.119883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 460 510 0.0356975 -3.09423 -0.138503 0.0594513 0.00653494 0.016994 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 510 511 3.91914 0.03392 -0.133456 0.0113921 0.0735092 0.0521714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 461 511 0.00870035 -3.16357 -0.135112 0.0485771 -0.00968329 0.0032561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 511 512 3.88996 -0.0281958 -0.276218 0.00295617 0.0613643 0.0912502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 462 512 0.122157 -3.09977 0.0239496 0.0770165 -0.000713433 -1.41527e-05 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 512 513 3.83797 0.0297327 -0.179258 0.0122462 0.0919223 0.0463176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 463 513 -0.113572 -3.0456 -0.172146 0.0449117 0.0119165 0.0456888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 513 514 3.71781 0.170462 -0.223852 0.00158274 0.0873435 0.0611164 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 464 514 0.0424182 -3.164 -0.146429 0.0450361 0.0205531 0.0636576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 514 515 3.89482 0.0222389 0.0105008 -0.00288901 0.0655682 0.0710208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 465 515 0.0409562 -3.13976 -0.0892642 0.0590593 -0.014298 0.0976616 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 515 516 3.95329 0.0473616 -0.10755 -0.00445798 0.0862988 0.123392 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 466 516 -0.164743 -3.22428 -0.0865446 0.0735216 0.00238483 0.0270441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 516 517 3.97917 0.0879153 -0.191707 -0.00372869 0.0939442 0.115294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 467 517 0.054379 -3.11355 -0.19167 0.0716972 0.0105228 -3.59251e-05 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 517 518 4.00829 0.0957642 -0.284959 0.0169499 0.0813068 0.0313315 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 468 518 -0.106701 -3.09214 -0.220984 0.0659333 0.00377642 0.00775913 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 518 519 3.92345 0.0291007 -0.158137 0.0124476 0.0908164 0.110767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 469 519 0.107002 -2.95947 -0.139402 0.0620113 0.0044476 0.0549781 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 519 520 3.87629 0.0684311 -0.0609025 0.00993632 0.0734299 0.0877509 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 470 520 -0.108656 -3.03903 0.083943 0.0545671 0.0124822 0.0120321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 520 521 3.87616 0.165536 -0.111575 0.00530646 0.0659726 0.154374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 471 521 -0.0784969 -2.83155 -0.0241067 0.0606587 -0.0144503 0.062287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 521 522 3.93336 0.138194 -0.0748747 0.00176335 0.101838 0.167977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 472 522 0.0114856 -3.00226 -0.0845597 0.0685469 -0.0164081 0.0381552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 522 523 3.95375 -0.0797769 -0.20141 -0.00535917 0.0798415 0.0484603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 473 523 -0.0513233 -2.92298 -0.0297458 0.0585826 -0.00928159 -0.04187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 523 524 3.88044 0.232017 -0.0105122 -0.00432516 0.0799176 0.108934 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 474 524 0.0427063 -2.96872 -0.100256 0.0789954 0.021286 -0.00420237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 524 525 3.95145 0.0683336 -0.0597149 0.0143596 0.0838335 0.0941658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 475 525 -0.0549014 -3.09318 -0.0342945 0.0490925 -0.0104972 0.0182039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 525 526 3.80783 0.177405 -0.0379598 0.0146907 0.0729651 0.0696751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 476 526 0.0680504 -2.99512 -0.101228 0.0688634 0.00518964 0.0184658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 526 527 3.87202 0.222751 -0.107692 0.000693948 0.087039 0.154982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 477 527 -0.122992 -3.14268 -0.311588 0.0700966 0.00631231 -0.0473039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 527 528 3.95992 0.153623 -0.202136 0.00814916 0.0694172 0.027455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 478 528 -0.0623314 -2.95136 0.167926 0.0730348 -0.001431 -0.0477075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 528 529 3.94116 0.18508 0.0194119 -0.0142119 0.0838081 0.0594661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 479 529 -0.110363 -3.09787 0.00308389 0.0556246 0.00425071 0.0180718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 529 530 4.16337 0.296778 -0.180989 0.00145806 0.0942497 0.0540158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 480 530 -0.171417 -3.10396 -0.143155 0.0812484 -0.0075318 -0.0341758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 530 531 3.98305 0.0858175 -0.0788322 0.00500794 0.0753316 0.0629777 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 481 531 0.00744409 -3.19463 0.116307 0.0444314 0.00388385 -0.00893924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 531 532 4.07791 0.104417 -0.0402646 -0.00618066 0.0742438 0.106636 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 482 532 0.0172885 -3.07817 -0.0402404 0.0556358 -0.00105077 -0.0129042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 532 533 4.16867 0.29963 -0.149733 -0.00275708 0.0670716 0.125705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 483 533 0.0944517 -3.24257 -0.130989 0.0662688 0.011916 -0.0310471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 533 534 4.06409 0.189856 0.00061951 0.00689985 0.0925781 0.155153 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 484 534 0.140157 -3.06507 -0.0512154 0.0562917 0.0091265 -0.0478581 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 534 535 3.92174 0.2644 -0.079848 -0.00500359 0.0833138 0.0557615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 485 535 0.0622585 -3.03014 -0.0791398 0.0750876 0.0082449 -0.0455365 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 535 536 3.98814 0.115147 -0.186112 0.0101489 0.0839566 0.135988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 486 536 0.0850827 -3.07701 -0.109627 0.0644013 -0.001719 -0.0590063 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 536 537 3.84776 0.0917744 -0.141178 0.00202551 0.0764908 0.0863808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 487 537 -0.174879 -3.11156 -0.0305111 0.0620026 -0.00486258 -0.0279257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 537 538 4.11214 0.057549 -0.346564 0.00483302 0.062109 0.056964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 488 538 -0.0598301 -2.9678 -0.203583 0.0565507 0.0226589 0.0526871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 538 539 3.9898 -0.0804338 -0.225186 0.00364604 0.0870435 0.063733 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 489 539 -0.136908 -3.23325 -0.0968695 0.0528514 -0.0106577 -0.0341014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 539 540 4.0618 0.0327376 -0.126014 -0.00978959 0.0869334 0.148875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 490 540 0.0183003 -3.15107 -0.0892686 0.0518073 -0.0139294 0.0479056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 540 541 4.0698 0.119983 -0.067476 0.0106398 0.0926672 0.123709 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 491 541 0.144867 -3.06526 -0.156464 0.0435905 -0.0172536 -0.0105708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 541 542 4.14792 0.120745 0.10754 -0.0200338 0.0882109 0.0827413 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 492 542 0.0404083 -2.82931 0.0840477 0.0639405 -0.0115791 0.0347076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 542 543 4.09568 -0.0551356 -0.0582114 0.00127462 0.0780678 0.134079 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 493 543 -0.215644 -2.96754 -0.125685 0.0589795 0.00998454 -0.0443006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 543 544 4.08339 0.135212 -0.0655433 -0.00880676 0.0702492 0.0763876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 494 544 0.257973 -3.25769 -0.0483693 0.0658216 -0.00802967 0.0863524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 544 545 4.0795 0.0328024 -0.0783405 -0.00366906 0.0733206 0.0711361 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 495 545 0.158184 -2.9657 -0.109624 0.0684312 -0.00530189 0.0601699 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 545 546 3.93024 0.105637 -0.0186476 0.00191596 0.0713991 0.094287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 496 546 -0.0478889 -3.20087 -0.0707272 0.07427 0.000812378 0.0181383 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 546 547 3.98135 0.127568 -0.144685 0.00726214 0.0880063 0.056445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 497 547 -0.0394371 -3.09159 -0.175059 0.0569448 0.00200361 -0.00607273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 547 548 4.19208 -0.101253 -0.316889 -0.00601598 0.0877118 0.151029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 498 548 -0.00543063 -3.10341 -0.177335 0.0755875 -0.00873274 -0.00851482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 548 549 4.14219 0.303988 0.0285385 0.0081434 0.0806931 0.119864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 499 549 0.158279 -2.95606 -0.0763056 0.0595573 0.00912355 0.0454654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 549 550 4.14084 0.123261 0.0149417 0.0191959 0.0817442 0.0320899 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 500 550 -0.163621 -3.16965 0.0545318 0.0659283 0.0130754 -0.0151886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 550 551 4.2856 0.132956 -0.18382 0.00392179 0.0874209 0.0775827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 501 551 -0.104354 -3.21142 -0.0373729 0.0620785 0.00287161 0.04368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 551 552 3.95876 0.130382 -0.147787 0.0190924 0.0735096 0.0743083 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 502 552 0.0419734 -3.15903 -0.0196529 0.0572659 -0.00629986 -0.0473105 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 552 553 4.15462 0.207674 0.0782872 0.00413373 0.0899008 0.133173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 503 553 0.102133 -2.97393 -0.12117 0.0730434 0.0208993 0.00503202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 553 554 4.03899 0.195841 -0.22051 0.010788 0.0844967 0.102643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 504 554 -0.0251412 -3.15216 -0.0474008 0.0595686 0.00111218 -0.0393948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 554 555 4.33492 0.0454974 -0.412621 0.000461212 0.104188 0.0516918 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 505 555 -0.00332317 -3.05428 -0.0346111 0.0617502 0.0188119 -0.0374979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 555 556 4.14312 -0.0246469 -0.110072 -0.000282772 0.0688482 0.0589417 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 506 556 -0.0533068 -3.13507 -0.0539043 0.0549669 0.00561657 0.00112993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 556 557 4.08848 0.269272 -0.264466 0.0103545 0.0731958 0.0720859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 507 557 0.0683012 -3.15511 0.054601 0.0718749 0.0130784 -0.00276691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 557 558 4.21301 0.228984 -0.211934 0.00401038 0.0888661 0.0506419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 508 558 -0.150612 -3.02293 -0.024401 0.0679468 0.00516331 -0.0627376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 558 559 4.08028 0.122719 -0.00964286 0.00839008 0.111177 0.121302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 509 559 0.129548 -3.07578 -0.213948 0.0643898 -0.0129508 0.0163419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 559 560 4.13282 0.0802045 -0.206804 0.019373 0.103119 0.0328415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 510 560 0.115483 -3.05728 -0.133386 0.0654732 -0.0111095 -0.0754246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 560 561 4.27962 0.0680338 -0.167726 -0.0149808 0.0874889 0.127181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 511 561 -0.164549 -3.1017 -0.0506549 0.0657427 0.0115839 0.003209 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 561 562 4.13902 0.151543 -0.0770345 0.00259444 0.083451 0.093259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 512 562 0.0121592 -3.07021 -0.0297745 0.0826955 -0.00731092 -0.00623018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 562 563 4.1572 0.0191463 -0.333908 0.00316001 0.0973112 0.0700092 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 513 563 0.00163415 -3.14105 -0.165022 0.0646058 0.00494038 -0.00206431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 563 564 4.00573 0.225083 -0.2103 -0.0163633 0.0903101 0.094936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 514 564 -0.0918992 -3.21551 -0.0462589 0.0808105 -0.0200222 0.00698442 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 564 565 4.23684 0.0345225 -0.189857 0.0207427 0.0710984 0.118987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 515 565 -0.00941106 -2.9553 0.0309539 0.0647967 0.00530812 -0.00774183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 565 566 4.11766 0.0936709 -0.244863 0.00602986 0.0787818 0.0647949 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 516 566 0.0881701 -3.16325 -0.0750626 0.0712499 0.0127565 0.00993766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 566 567 4.09546 0.171931 -0.290686 0.00579386 0.0756382 0.0597698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 517 567 0.117849 -2.80609 -0.232063 0.0708833 0.0281805 -0.0155169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 567 568 4.33513 0.0646891 -0.345993 0.00742182 0.0910747 0.116173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 518 568 0.137367 -2.90154 -0.0226107 0.0546203 0.0107624 -0.0699045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 568 569 4.31873 0.0483286 -0.177583 0.0249496 0.10265 0.131922 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 519 569 0.15282 -2.9799 -0.0173958 0.0387413 0.00586395 -0.00137159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 569 570 4.16762 0.139206 -0.208122 0.0177862 0.0887795 0.0473907 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 520 570 -0.169751 -2.95091 -0.182311 0.0531366 -0.0071244 -0.043167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 570 571 4.1774 0.100141 -0.270994 -0.0056551 0.0743315 0.10291 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 521 571 0.118028 -3.16972 -0.00385608 0.0544589 -0.00237523 0.0404745 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 571 572 4.21111 0.028043 -0.214451 -0.000724635 0.0788917 0.0865979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 522 572 0.0744819 -3.06681 -0.10571 0.0523037 0.0115457 0.0297215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 572 573 3.97529 0.0323595 -0.266289 0.00754517 0.0762605 0.047991 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 523 573 -0.173998 -2.97492 -0.0652306 0.0536759 -0.000476282 0.0543073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 573 574 4.2122 0.0110234 -0.169995 -0.0116139 0.0825434 0.126044 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 524 574 -0.123564 -2.85526 -0.0244972 0.0592113 0.00188334 -0.038221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 574 575 4.52554 0.0814973 -0.218838 0.00440094 0.0707324 0.0872324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 525 575 0.0111203 -3.13927 -0.125059 0.0518476 0.00430814 -0.0149984 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 575 576 4.20093 0.178484 -0.153546 0.0193646 0.0929959 0.0672811 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 526 576 -0.255423 -2.9201 -0.196621 0.0525716 0.0109868 -0.0708919 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 576 577 4.45554 0.134722 -0.293898 0.0145586 0.0855079 0.096924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 527 577 -0.0583655 -3.09565 -0.0726507 0.0628596 -0.00247638 0.0197565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 577 578 4.49419 0.0859528 -0.176432 0.0210922 0.0746585 0.0779077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 528 578 0.0365176 -3.12017 0.0846079 0.0631303 0.00553076 0.023496 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 578 579 4.29297 0.133856 -0.289144 -0.00498905 0.0843463 -0.00076648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 529 579 0.0365424 -3.01631 -0.181254 0.0521487 0.00696544 -0.070675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 579 580 4.09957 -0.0325063 -0.161072 0.0158663 0.0793271 0.110988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 530 580 0.0981233 -3.08102 -0.226484 0.0749365 0.0025697 0.0096942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 580 581 4.53389 0.226595 -0.133671 0.0149898 0.0902461 0.0710543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 531 581 0.123115 -3.10015 -0.403189 0.0652793 0.00918251 -0.0460467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 581 582 4.27189 0.238078 -0.126906 0.0125389 0.0977546 0.0870196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 532 582 -0.0367158 -2.95233 -0.152982 0.0714582 -0.000864546 -0.0237354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 582 583 4.23315 0.245158 -0.226537 0.0195492 0.097047 0.140917 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 533 583 0.0902465 -3.11587 -0.178165 0.0649509 0.00203572 -0.0393786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 583 584 4.25792 0.192358 -0.285872 0.0236409 0.0975044 0.0781299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 534 584 0.0440548 -2.96893 -0.0821 0.0601803 0.00307157 0.0405787 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 584 585 4.35623 0.165366 -0.264653 0.00360205 0.0906646 0.0910438 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 535 585 -0.143013 -2.9968 -0.0868078 0.067938 0.00776744 -0.0100572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 585 586 4.46245 0.192824 -0.199804 -0.0157825 0.0971969 0.144557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 536 586 -0.0114761 -3.03959 0.00187525 0.0728051 -0.000103808 -0.0677429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 586 587 4.39104 0.119623 -0.0441801 0.0171875 0.0745751 0.0431043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 537 587 0.0941817 -3.30746 -0.0836066 0.0609027 0.00374263 0.0555212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 587 588 4.27077 0.0866119 -0.193441 0.0184127 0.0897319 0.101872 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 538 588 -0.0647356 -3.06441 -0.189473 0.082692 0.00873622 -0.0362541 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 588 589 4.31423 0.0100555 -0.00976918 -0.00254526 0.0880652 0.0691444 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 539 589 -0.111086 -2.93712 -0.0480663 0.063339 -0.00507121 -0.0057921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 589 590 4.15984 -0.00327917 -0.0570958 0.0160054 0.0768483 0.0933413 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 540 590 0.174395 -2.91901 -0.381083 0.0555307 -0.0146265 0.034813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 590 591 4.08242 0.195928 -0.249705 0.0293336 0.104667 0.175302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 541 591 0.0193627 -3.01033 -0.196237 0.0591627 0.0134977 0.0896685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 591 592 4.34058 0.289463 -0.236897 0.00757568 0.0792726 0.106466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 542 592 0.0930682 -2.9934 -0.291053 0.0721574 -0.0089411 -0.0290288 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 592 593 4.19862 0.27484 -0.343434 0.0201772 0.10111 0.0462058 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 543 593 -0.133796 -3.14294 0.109997 0.0556209 0.0169792 0.00969205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 593 594 4.31115 0.106374 -0.105547 0.00338607 0.0947796 0.122571 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 544 594 0.0323602 -3.15931 -0.052984 0.0623382 -0.0111761 -0.0195102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 594 595 4.32924 0.0533522 -0.266254 -0.000194612 0.0833887 0.102272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 545 595 0.121139 -3.06999 -0.154193 0.05892 -0.0114917 -0.023365 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 595 596 4.24461 0.0746417 -0.0334534 0.00128484 0.0880958 0.0712577 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 546 596 0.0248243 -3.05119 -0.120918 0.0735632 -0.00226406 0.000988924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 596 597 4.33841 0.498751 0.0540982 0.0191623 0.103731 0.0968355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 547 597 -0.0769754 -3.19866 -0.306113 0.0623925 0.0150405 0.00700658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 597 598 4.49115 0.110355 -0.119654 0.00718546 0.0903655 0.0729678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 548 598 0.0275225 -3.1356 0.0673245 0.0562348 0.0124765 0.00491015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 598 599 4.50303 -0.0453035 0.00094901 0.0175725 0.0965551 0.0792973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 549 599 -0.0222005 -3.05045 -0.216093 0.0588531 -0.0180662 0.0567825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 599 600 4.48083 0.313245 -0.371852 0.0181941 0.0895536 0.0697882 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 550 600 -0.0913171 -3.07627 -0.227804 0.0614361 0.0112592 0.034566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 600 601 4.37029 0.0298635 -0.182147 -0.00411168 0.105197 0.0687257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 551 601 0.217781 -3.08133 -0.0219625 0.0602339 0.0024877 0.0449566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 601 602 4.29162 0.279554 -0.242674 -0.00953771 0.101397 0.0817215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 552 602 0.138177 -2.98575 -0.21377 0.0701632 -0.0208669 -0.0432925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 602 603 4.32291 0.10136 -0.182155 0.017475 0.0965541 0.136022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 553 603 0.105881 -3.09497 -0.225522 0.0500544 0.000549661 -0.0255553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 603 604 4.57205 0.00141839 -0.115226 0.0237602 0.072418 0.0695433 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 554 604 0.0383596 -3.06322 -0.0970011 0.0688265 -0.00782867 -0.0237748 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 604 605 4.31508 0.115225 -0.287968 0.0225182 0.0793418 0.102334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 555 605 -0.0493043 -3.06466 -0.00136487 0.0742192 0.00912396 0.00193998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 605 606 4.47606 0.0393742 -0.258725 -0.0144144 0.088022 0.124299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 556 606 0.0645644 -2.97867 -0.150372 0.0551866 -0.00887039 -0.067846 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 606 607 4.3798 0.174756 -0.324664 -0.00269858 0.0906761 0.153474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 557 607 0.0085063 -2.88327 -0.245031 0.0749656 0.000652253 -0.0220066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 607 608 4.45626 0.334622 -0.174912 0.0134196 0.102041 0.109118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 558 608 -0.117246 -3.1119 -0.127917 0.0591194 -0.0039858 0.0340398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 608 609 4.51434 0.222591 -0.174641 0.019614 0.089533 0.109305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 559 609 -0.0263756 -3.24024 -0.16108 0.0691611 -0.00877491 -0.00945361 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 609 610 4.44196 0.124978 -0.155572 0.0115446 0.0881469 0.0889334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 560 610 0.167257 -3.23493 -0.0561997 0.0800341 -0.0125998 0.0266861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 610 611 4.43806 0.145389 -0.227869 0.00627523 0.0986787 0.0593833 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 561 611 -0.130666 -3.12044 -0.359361 0.0602523 0.00832909 0.0446015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 611 612 4.45431 -0.0354811 -0.177062 0.00591113 0.0967784 0.0359976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 562 612 -0.0075968 -2.98718 0.0539465 0.0650847 -0.00268539 0.0451599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 612 613 4.5437 0.219906 -0.195187 0.00452443 0.106376 0.0708472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 563 613 -0.0297144 -3.02826 -0.0633629 0.061842 0.00307799 0.0274596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 613 614 4.40734 0.262372 -0.324841 -0.00395617 0.0800662 0.080889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 564 614 -0.0219157 -3.08952 0.0546854 0.0648266 -0.017525 -0.0414769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 614 615 4.38916 0.11042 -0.151074 -0.00552542 0.0745524 0.122006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 565 615 -0.180138 -2.92808 -0.146498 0.0697574 0.015307 0.0126191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 615 616 4.35209 0.0124038 -0.172293 -0.000650352 0.0967829 0.101845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 566 616 -0.0209347 -3.13195 -0.0894558 0.0671641 0.00742254 -0.0981321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 616 617 4.42599 0.171881 -0.135108 -0.00890943 0.0647961 0.0611661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 567 617 0.103565 -2.87903 -0.0553424 0.0632051 0.00247305 0.0240435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 617 618 4.61995 0.282469 -0.162463 0.000609223 0.0952048 0.0118725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 568 618 0.0717569 -3.03175 -0.147548 0.0551176 -0.00692343 0.00524318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 618 619 4.49564 0.227836 -0.0659887 0.00110848 0.0813638 0.0455096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 569 619 0.176132 -3.03593 -0.226181 0.0712884 -0.00166718 -0.00768827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 619 620 4.43863 0.344181 -0.209121 0.00346999 0.0829503 0.0170208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 570 620 0.0262121 -3.2364 -0.31317 0.0618361 -0.000765218 0.0192015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 620 621 4.39079 0.243594 -0.142127 0.00308221 0.0994166 0.101129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 571 621 -0.0771407 -3.21892 -0.143892 0.0551687 -0.00892679 -0.0431961 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 621 622 4.38629 0.127724 -0.109179 0.0110774 0.103313 0.0777007 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 572 622 -0.0191508 -2.89773 -0.192926 0.0551379 -0.00276794 -0.0876222 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 622 623 4.318 0.166077 0.0118998 -0.0091904 0.112464 0.140886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 573 623 0.115673 -2.9967 -0.184285 0.0725852 0.00775889 0.0703655 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 623 624 4.46395 0.299958 0.0533495 0.00154629 0.0859621 0.104486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 574 624 -0.0805158 -3.0637 -0.0155647 0.0532142 0.00222468 -0.00334276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 624 625 4.55022 0.0422739 -0.0393174 -0.00941836 0.0900885 0.101733 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 575 625 -0.149993 -3.03048 -0.0277595 0.065365 0.00717818 0.0387678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 625 626 4.60777 0.170551 -0.294149 0.0094881 0.0768213 0.117291 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 576 626 0.116528 -3.22838 -0.0339172 0.0584637 0.00383351 0.0103322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 626 627 4.58635 0.0437147 -0.247564 0.00345608 0.1075 0.12136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 577 627 -0.110781 -3.10471 -0.199706 0.0682467 0.00170832 0.0806603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 627 628 4.56696 0.121635 -0.0161831 -0.0115688 0.0859945 0.123461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 578 628 0.00109741 -3.14353 -0.105799 0.0616737 -0.0112345 -0.00630755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 628 629 4.58803 0.231626 -0.137042 -0.00895203 0.0828832 0.0453989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 579 629 0.0974902 -3.11791 -0.131678 0.0583319 -0.0051011 -0.0723996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 629 630 4.69801 0.123747 -0.334257 -0.0140901 0.080342 0.0610762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 580 630 0.00453313 -2.9714 0.0925819 0.0557266 0.00532714 0.0275552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 630 631 4.58682 0.0279869 -0.174891 0.0123522 0.0798607 0.0458531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 581 631 -0.115355 -2.98364 0.157234 0.062758 -0.00972008 0.0418193 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 631 632 4.43235 0.257981 -0.246344 -0.0203994 0.101156 0.123704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 582 632 0.132042 -3.11403 -0.0589675 0.0685233 -0.0107664 -0.0571613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 632 633 4.67311 0.342888 -0.255237 -0.00415209 0.080697 0.0811915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 583 633 -0.0531079 -3.28654 -0.178329 0.0517913 0.0161975 -0.0490589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 633 634 4.70961 0.101084 -0.302912 -0.00379722 0.0752333 0.0690831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 584 634 -0.102543 -2.91659 -0.169003 0.0490259 -0.010582 -0.00404935 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 634 635 4.5897 0.252222 -0.198263 0.00337098 0.0868275 0.061946 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 585 635 0.0188628 -3.08291 -0.0545405 0.0567148 -0.00985038 -0.0124196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 635 636 4.51069 0.200092 -0.303932 -0.00223501 0.0911032 0.0438181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 586 636 -0.0186219 -2.91079 -0.169436 0.0649621 0.00858233 -0.107501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 636 637 4.69478 0.255173 -0.0433796 0.00363234 0.0969772 0.103413 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 587 637 0.163032 -2.88887 -0.20214 0.0678423 0.0102075 -0.0248551 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 637 638 4.58338 0.0998904 -0.327242 -0.00232782 0.0917768 0.0803202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 588 638 -0.0349211 -2.90975 -0.0629346 0.0547944 0.00492398 0.016901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 638 639 4.52351 0.0892914 -0.0622867 0.0269003 0.0947183 0.111687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 589 639 -0.0784669 -2.92389 0.048557 0.0649188 -0.00841817 0.0468179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 639 640 4.53851 0.151947 -0.268693 0.00450729 0.106453 0.00778613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 590 640 -0.0971855 -3.25658 -0.121232 0.0561153 0.00448277 -0.0340979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 640 641 4.61971 0.236515 -0.218548 -0.00665171 0.0870592 0.0661211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 591 641 -0.0338137 -3.10458 -0.0901958 0.0490569 0.00192585 -0.0352977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 641 642 4.58013 0.130569 -0.0589895 -0.00800215 0.0962558 0.160234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 592 642 0.0211381 -3.10805 0.117471 0.0504094 0.0122607 0.00332331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 642 643 4.5533 8.58184e-06 -0.145173 0.010368 0.0931664 0.0691247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 593 643 -0.0390567 -2.88846 -0.0667041 0.0654715 0.000640355 -0.00159488 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 643 644 4.56742 0.318652 -0.223275 0.00055354 0.0923862 0.120507 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 594 644 -0.0688095 -2.9161 -0.064569 0.0536461 -0.00677999 -0.0678712 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 644 645 4.69144 0.086352 -0.252866 0.00713131 0.0964524 0.0958729 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 595 645 0.104472 -3.12484 -0.116632 0.0616614 -0.00136236 0.0398051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 645 646 4.47829 0.286719 -0.328534 -0.00268613 0.105356 0.0631085 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 596 646 -0.0754471 -3.10779 -0.122706 0.0585459 0.0018651 -0.0621258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 646 647 4.5677 0.304649 -0.263829 0.000226583 0.0889639 0.0266707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 597 647 -0.293249 -3.21274 -0.103374 0.0516183 0.000753764 -0.00369899 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 647 648 4.61671 0.135063 -0.248071 -0.00991093 0.0934847 0.114669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 598 648 -0.0803516 -3.08883 -0.0913335 0.0715421 -0.01484 -0.0131632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 648 649 4.59082 -0.0719269 -0.282693 0.00415818 0.0880186 0.137642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 599 649 0.135486 -3.16659 0.0217741 0.0709937 0.0129039 -0.0738981 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 649 650 4.59289 0.202558 -0.197916 0.0120858 0.091541 0.0879692 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 600 650 -0.034966 -3.0843 -0.0254212 0.0657932 3.44249e-06 -0.0428018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 650 651 4.6122 0.311188 -0.346963 -0.000633006 0.0964039 0.106399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 601 651 -0.0783863 -2.89001 -0.088552 0.052777 -0.00435127 -0.00922282 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 651 652 4.58803 0.210786 -0.337134 -0.00809259 0.0931546 0.0775802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 602 652 0.0286726 -3.02008 -0.0385886 0.0513643 -0.00266806 0.0464828 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 652 653 4.63035 0.0195722 -0.322998 -0.000505567 0.103379 0.103236 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 603 653 0.0625562 -3.10728 -0.0534136 0.0605436 -0.00902888 -0.00962723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 653 654 4.64071 -0.0476349 -0.390215 0.000775472 0.0897673 0.0730786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 604 654 -0.0726515 -3.11078 -0.0699573 0.0576288 -0.016824 0.0145728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 654 655 4.49805 0.208642 -0.108222 0.0264607 0.0856655 0.149565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 605 655 0.111023 -2.91284 -0.167086 0.0349309 0.000675564 -0.0227562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 655 656 4.99066 0.168336 -0.259591 0.00104361 0.10026 0.0887065 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 606 656 0.0301243 -3.10369 -0.0933881 0.062009 0.0109385 -0.014552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 656 657 4.59405 0.135321 -0.253109 0.00783487 0.0847765 0.0874815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 607 657 0.250933 -2.89436 -0.0721453 0.0658007 0.00349657 -0.00166186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 657 658 4.82022 -0.00036991 -0.219453 0.00250863 0.109499 0.10809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 608 658 -0.142257 -2.94673 -0.100253 0.0529481 0.00168719 0.0453418 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 658 659 4.69842 0.0679796 -0.276004 7.54776e-05 0.0818596 0.0853074 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 609 659 -0.106918 -3.22448 -0.120135 0.0680987 -0.00060922 0.0120484 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 659 660 4.77755 0.0719081 -0.0206436 0.0124007 0.104744 0.0538124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 610 660 -0.107243 -3.09151 -0.121869 0.0528376 0.00159081 -0.0506813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 660 661 4.77593 0.0848698 -0.202075 0.0185212 0.0858977 0.164082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 611 661 0.0576411 -2.92054 -0.0636224 0.0607549 0.00528018 0.0021466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 661 662 4.71358 0.0893484 -0.151853 -0.00554666 0.0943674 0.122246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 612 662 0.080842 -3.10442 -0.0254554 0.0556198 -0.0063859 -0.0113843 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 662 663 4.75095 0.0201234 -0.328919 0.0241477 0.0942646 0.0449238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 613 663 -0.000810475 -2.91316 -0.22155 0.0585487 -0.0115252 -0.00866135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 663 664 4.58738 0.117525 -0.069831 0.00870518 0.0853772 0.170112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 614 664 -0.131808 -2.9568 0.0245631 0.0548007 0.00269959 0.0160802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 664 665 4.78619 0.0194477 -0.149245 -0.00716306 0.0942794 0.0933988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 615 665 0.139337 -2.98617 -0.145113 0.0545958 0.00794486 -0.0094797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 665 666 4.77068 0.138414 -0.16816 -0.00139318 0.0937291 0.0599373 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 616 666 0.0209602 -3.14324 -0.14566 0.0561549 0.00774943 -0.0796565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 666 667 4.84049 0.248311 -0.17468 0.00795232 0.101196 0.0742189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 617 667 -0.0323372 -3.03405 -0.00795233 0.0611662 0.00763729 0.00179287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 667 668 4.8285 0.100505 -0.349505 0.0107263 0.0943786 0.0762927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 618 668 0.0625432 -2.96391 -0.249299 0.0492326 -0.00482146 0.018272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 668 669 4.88883 0.14119 -0.46285 0.0108026 0.083383 0.05812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 619 669 -0.00919857 -3.20073 -0.110496 0.0685864 -0.00867677 0.0797899 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 669 670 4.75482 0.0806364 -0.0462016 0.0122757 0.109008 0.0731757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 620 670 0.142185 -3.16806 -0.183042 0.0625283 -0.00285848 -0.012259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 670 671 4.71246 0.175771 -0.371031 -0.00129681 0.110878 0.0838478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 621 671 -0.0838522 -3.06195 -0.104522 0.0525652 -0.00659028 -0.0842468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 671 672 4.97834 0.0192568 -0.103205 0.0117431 0.0875083 0.0812011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 622 672 -0.146327 -3.08104 -0.203005 0.0479553 -0.00266307 0.020203 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 672 673 4.82775 0.142154 -0.256223 0.0151808 0.0981574 0.140873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 623 673 0.129303 -3.00686 -0.0162339 0.0769462 0.00864174 -0.0396603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 673 674 4.82017 0.176759 -0.338064 0.00367771 0.104707 0.0637959 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 624 674 -0.120919 -2.88785 -0.0695128 0.0646997 0.00110876 -0.0121386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 674 675 4.9748 0.27584 -0.316333 0.00762002 0.0966097 0.130372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 625 675 0.108143 -3.22631 -0.0574474 0.0562434 -0.00145129 -0.0311135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 675 676 4.61906 0.20413 -0.273103 0.00422076 0.0913695 0.0835297 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 626 676 0.00855134 -3.03155 0.0720902 0.0643427 -0.00230099 0.00408353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 676 677 4.86599 0.0423888 -0.306918 0.0100479 0.0902857 0.0825479 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 627 677 -0.0407317 -2.99311 -0.0451831 0.0712133 0.0036444 -0.0216028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 677 678 4.93698 0.26028 -0.2249 -0.00220309 0.0906377 0.0549771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 628 678 0.153689 -3.03586 -0.119724 0.0684265 0.00762086 -0.0201499 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 678 679 4.73583 0.13002 -0.312245 -0.00537247 0.0850064 0.0723021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 629 679 -0.0667627 -3.17025 -0.0865129 0.0393907 -0.00128729 0.00811489 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 679 680 4.86816 0.0790258 -0.165199 0.0123455 0.097114 0.065086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 630 680 0.240884 -2.94906 -0.146747 0.0512329 0.000560319 -0.0705929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 680 681 4.89984 0.228714 -0.238236 0.0001698 0.0974527 0.104206 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 631 681 -0.0322977 -3.11386 -0.256465 0.0600328 0.00703726 -0.0155486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 681 682 4.82551 0.128119 -0.207736 0.0112305 0.0916274 0.0641891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 632 682 0.0458059 -3.10663 -0.230961 0.054357 0.00603689 0.0183501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 682 683 4.80184 0.00748369 -0.0880933 -0.00360608 0.0881013 0.123437 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 633 683 0.105267 -3.06434 -0.0411372 0.0503826 -0.00677093 -0.0558923 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 683 684 4.97453 0.156508 -0.317605 0.0053586 0.0978108 0.163665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 634 684 0.0417394 -2.95678 -0.00337082 0.0483179 0.0124118 0.0394632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 684 685 4.80416 0.100665 -0.078458 0.0121502 0.105107 0.0227515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 635 685 0.100183 -3.00557 -0.0809461 0.0610304 -0.0183025 -0.00347699 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 685 686 4.91193 0.0590685 -0.250704 -0.00173355 0.102507 0.0405014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 636 686 0.0405188 -2.94075 -0.0807655 0.0442812 0.00892195 0.0306478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 686 687 4.72536 0.254034 -0.280541 0.00922299 0.0977044 0.122585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 637 687 0.0948729 -3.1515 -0.0340898 0.0600422 0.0100612 0.0159968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 687 688 4.75524 0.229598 -0.219658 0.00497092 0.0988943 0.065752 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 638 688 -0.0413858 -3.18189 -0.024737 0.055668 0.000888519 0.0246513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 688 689 4.9573 0.231367 -0.269147 0.0284867 0.103992 0.170789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 639 689 0.116434 -3.10073 -0.158501 0.0593271 -0.0159908 0.00912532 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 689 690 4.77554 0.273571 -0.0551941 -0.00636443 0.0760468 0.0520727 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 640 690 0.0824377 -3.11335 -0.148959 0.0582237 -0.0101342 0.0423113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 690 691 4.88762 0.0357302 -0.223774 0.00848941 0.103085 0.0840575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 641 691 -0.104628 -3.00161 -0.103736 0.0635966 -0.0171134 -0.029571 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 691 692 4.81846 0.145556 -0.237586 0.00539458 0.0910077 0.0717718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 642 692 -0.0255222 -3.10173 0.0753851 0.040855 -0.0190997 0.0485578 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 692 693 4.9306 0.16921 -0.199292 -0.0168024 0.0997127 0.0869785 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 643 693 0.134381 -2.95403 -0.107628 0.0715033 -0.00426043 0.0236282 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 693 694 4.84945 0.253784 -0.235495 0.0175242 0.0953525 0.0539144 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 644 694 -0.0927595 -3.01516 -0.0966376 0.0605483 -0.00666778 0.0137219 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 694 695 4.74567 0.176565 -0.0688786 0.00102781 0.0832532 0.139511 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 645 695 0.0650283 -3.09518 0.00256764 0.0707439 0.00543479 0.0205599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 695 696 4.72455 0.182174 -0.351116 -0.0104963 0.106076 0.040436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 646 696 0.06834 -3.10697 -0.0879081 0.0651332 0.00683409 0.00528532 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 696 697 4.79913 0.104392 -0.298193 0.00656325 0.0982445 0.0645916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 647 697 -0.104393 -3.08199 -0.114826 0.0646953 0.0100784 -0.0466152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 697 698 4.9526 -0.0545478 -0.158798 0.00162925 0.120881 0.0967649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 648 698 -0.138608 -2.95232 -0.11823 0.0568332 -0.00746389 -0.0268482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 698 699 4.82726 0.436867 -0.0359374 0.00183485 0.100675 0.0362665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 649 699 -0.257695 -2.99525 -0.149945 0.0463249 0.00945625 -0.0238801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 699 700 4.94314 0.14087 -0.139945 -0.00556348 0.083005 0.0493162 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 650 700 -0.0894419 -3.19973 0.0132695 0.0714461 0.00213881 -0.0250355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 700 701 5.04451 0.244174 -0.161839 0.0157913 0.0954645 0.0721594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 651 701 -0.0248016 -2.97752 -0.110349 0.0705567 0.0257843 0.00494596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 701 702 4.84351 0.105472 -0.29265 -0.00615854 0.0833187 0.102861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 652 702 0.0620787 -3.20143 -0.312803 0.0553836 -0.0145885 0.0203886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 702 703 4.92655 0.161364 -0.0337247 -0.00695027 0.102421 0.0186239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 653 703 0.0826487 -3.06463 0.0273676 0.0615081 -0.0135372 -0.0268066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 703 704 4.92279 0.129379 -0.302255 0.0117016 0.114484 0.127468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 654 704 -0.0814438 -3.13962 -0.148475 0.056607 -0.0119339 -0.00497065 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 704 705 4.8111 0.245733 -0.30226 0.00508755 0.0907482 0.090034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 655 705 0.0662315 -3.07415 -0.103446 0.0535861 0.010794 0.00358945 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 705 706 5.0641 0.15892 -0.225412 0.0105472 0.0907386 0.0616333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 656 706 -0.000459968 -3.02377 -0.110942 0.0699077 0.00844676 -0.0478905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 706 707 4.80976 0.157741 -0.169973 -0.00686053 0.103871 0.0693185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 657 707 0.0770635 -2.9474 -0.049141 0.0593674 0.00457421 0.0324447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 707 708 4.8845 0.108034 -0.261472 0.0195029 0.0944785 0.148876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 658 708 -0.0495085 -3.27615 -0.147046 0.0621023 0.00396419 0.0550467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 708 709 4.80948 0.262969 -0.0422534 0.011107 0.0984069 0.0897239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 659 709 0.0033146 -2.96458 -0.00803129 0.0625363 -0.00361804 -0.0223613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 709 710 4.88789 0.0453553 -0.263956 -0.00325074 0.0868413 0.0909004 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 660 710 0.243191 -3.20723 -0.0870602 0.0723569 -0.000358629 -0.0549854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 710 711 4.96909 0.0945721 -0.235013 0.00877381 0.0933477 0.0913585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 661 711 0.204564 -3.00899 -0.185351 0.070743 -0.00195415 0.0411016 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 711 712 4.957 0.20409 -0.166317 -0.00513373 0.115013 -0.00219833 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 662 712 -0.0463396 -2.9789 -0.0567237 0.0649891 0.0106183 -0.0136026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 712 713 4.82769 -0.0779356 -0.0859007 0.00286543 0.111851 0.0719682 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 663 713 -0.0362462 -3.02737 0.0813519 0.0480504 0.0029693 -0.0409108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 713 714 4.99237 0.226358 -0.201009 0.0175574 0.0899334 0.0937055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 664 714 -0.0650279 -2.9986 -0.160333 0.0550692 0.00899256 -0.0263011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 714 715 4.847 0.185863 -0.273731 -0.00655556 0.11656 0.120036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 665 715 0.131739 -3.09642 -0.071034 0.076089 0.00550913 0.0278143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 715 716 4.91373 0.20578 -0.241385 0.0305883 0.100785 0.106056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 666 716 0.0797012 -2.97075 -0.0576583 0.0738755 -0.00907578 0.0275996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 716 717 5.03791 0.0643769 -0.223127 -0.00223908 0.0909435 0.116042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 667 717 -0.00621292 -3.17685 -0.199553 0.0568477 -0.00849604 0.0556099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 717 718 5.0882 0.286328 -0.308134 0.00395751 0.113028 0.0820751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 668 718 0.060683 -3.00908 -0.180527 0.0419437 0.00309748 0.0113851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 718 719 5.13539 0.131652 -0.36562 -0.00721369 0.101202 0.16685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 669 719 -0.0318945 -3.14906 0.0363823 0.0662179 -0.0046484 0.00147924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 719 720 5.11758 0.004806 -0.354268 -0.00169348 0.0869805 0.125518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 670 720 0.178589 -3.10867 0.0191606 0.07398 0.0119983 -0.0277615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 720 721 5.04158 0.136478 -0.222813 0.00480269 0.0940545 0.125554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 671 721 -0.0155655 -3.08082 -0.0531484 0.0658749 -0.00664142 -0.0913176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 721 722 4.94569 0.0317493 -0.155873 -0.00103506 0.11041 0.113469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 672 722 0.150353 -3.0813 -0.0456873 0.0871214 -0.00183637 0.0234943 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 722 723 4.99568 0.172668 -0.416876 0.0258139 0.101952 0.0717157 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 673 723 0.0097035 -3.05826 -0.0986314 0.0681282 0.0148936 -0.00734021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 723 724 5.0321 0.0729174 -0.381444 0.00469404 0.084094 0.0323003 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 674 724 -0.0599824 -3.06906 -0.221878 0.0571129 0.00517287 -0.0150848 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 724 725 5.10744 0.304035 -0.365794 0.01609 0.104756 0.150386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 675 725 0.0611193 -2.84611 -0.118206 0.07331 -0.0147959 -0.000308622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 725 726 5.23308 0.150503 -0.271173 -0.00547725 0.109904 0.0174743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 676 726 0.0710463 -2.91241 -0.208907 0.0530331 0.00253356 0.045755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 726 727 5.00387 -0.0204341 -0.221934 -0.00900423 0.115366 0.108748 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 677 727 0.0518681 -2.99773 -0.150974 0.0589842 0.0122081 0.0233584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 727 728 4.83586 0.262332 -0.307353 0.00961491 0.0889457 0.109844 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 678 728 -0.225372 -3.01335 -0.0491786 0.0505986 0.00125697 0.0301993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 728 729 5.13506 0.159915 -0.107686 -0.00318129 0.107694 -0.000191493 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 679 729 -0.012386 -3.14058 -0.147946 0.0613115 -0.00893748 0.0327034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 729 730 5.14321 0.185646 -0.461683 0.000511147 0.0852827 0.0518702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 680 730 0.127501 -3.23616 -0.146851 0.0858101 -0.000631745 -0.0425273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 730 731 5.11076 0.142116 -0.190949 0.0105194 0.103873 0.0524803 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 681 731 -0.0608466 -3.12941 -0.124451 0.0718154 0.00541046 0.0129321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 731 732 5.00292 0.032622 -0.351662 0.00313734 0.0969511 0.118482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 682 732 0.0172322 -3.23209 -0.0754052 0.050612 0.00145916 0.071669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 732 733 5.1493 0.111485 -0.309985 0.00568752 0.108775 0.0793158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 683 733 -0.159021 -3.05302 0.0570758 0.0796614 -0.00918807 -0.0512263 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 733 734 5.02261 -0.0151599 -0.395022 -0.0107817 0.0958243 0.133202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 684 734 -0.0431675 -3.03141 -0.165398 0.0645764 -0.00403677 0.0519855 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 734 735 5.08378 0.10967 -0.160555 -0.00247786 0.0940024 0.129468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 685 735 -0.0694909 -3.00382 0.0168952 0.0518273 -0.0125248 0.0036106 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 735 736 4.96436 0.347592 -0.0562935 0.0198373 0.104835 0.0688686 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 686 736 0.0843335 -3.03308 0.0133178 0.054561 0.0112583 -0.00585566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 736 737 5.15269 0.240358 -0.326321 -0.000265483 0.0972981 0.0518618 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 687 737 -0.0155025 -3.00305 -0.0920616 0.0434408 -0.0221745 0.00507161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 737 738 5.13317 0.140882 -0.236203 5.65843e-05 0.114924 0.0837862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 688 738 -0.0530177 -3.07663 -0.197915 0.0578139 0.00825078 -0.0333102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 738 739 5.01557 0.123123 -0.408925 0.0102592 0.0962423 0.0528312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 689 739 -0.03415 -3.04972 -0.0554636 0.0379105 -0.0154694 -0.0283152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 739 740 5.0204 -0.0823697 -0.284228 -0.00486723 0.103381 0.0115507 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 690 740 -0.123281 -3.04403 -0.230141 0.057816 0.0113993 0.0335845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 740 741 5.10069 0.104287 -0.153915 0.0053845 0.0999738 0.103005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 691 741 -0.108546 -2.95644 0.104505 0.0611476 0.00262854 0.0219741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 741 742 5.0754 -0.013166 -0.118819 0.021454 0.0935835 0.0983873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 692 742 -0.02648 -2.98653 -0.00950177 0.0555314 -0.0202864 0.0220555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 742 743 5.04127 0.11027 -0.188268 0.00197452 0.110593 0.0749265 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 693 743 0.136399 -2.98141 -0.0754871 0.0550242 -0.0118737 -0.0300052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 743 744 5.12915 0.0372705 -0.328298 0.0130503 0.0940853 0.0761804 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 694 744 0.0250219 -3.03039 -0.178337 0.0640917 0.0065361 0.0651105 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 744 745 5.18019 -0.115299 -0.200111 0.0114283 0.110952 0.145932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 695 745 -0.0317407 -3.02702 -0.00655395 0.041714 0.0138171 -0.0528609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 745 746 4.96612 0.298684 -0.216537 0.0159545 0.0948664 0.0939178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 696 746 0.0349984 -3.07044 -0.335171 0.046457 0.00342512 0.0290837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 746 747 5.03097 -0.0854337 -0.22582 0.0145452 0.105745 0.0696372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 697 747 0.0869135 -3.03999 -0.0430887 0.0810378 -0.0225104 -0.0463209 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 747 748 5.2337 0.0856714 -0.305334 0.00621032 0.10018 0.170719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 698 748 0.081417 -3.11205 0.0585525 0.0655414 -0.0121962 0.00284265 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 748 749 5.26509 0.0247955 -0.384943 0.013629 0.0821419 0.0958031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 699 749 0.0472414 -3.27667 -0.0135453 0.0537665 0.0133011 -0.0344399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 749 750 5.1928 0.367558 -0.188986 -0.00505421 0.0914533 0.0813406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 700 750 0.00143124 -3.02074 -0.130756 0.0515915 -0.00649855 -0.0459152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 750 751 5.25921 0.179427 -0.0422579 -0.000191209 0.102508 0.044356 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 701 751 -0.0646202 -3.13637 -0.221832 0.0754449 -0.0102576 -0.0266814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 751 752 4.99562 0.0922855 -0.160848 0.0162467 0.104019 0.053426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 702 752 0.0602422 -3.06527 0.0551907 0.0516273 -0.0138274 -0.0643509 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 752 753 5.15008 -0.209059 -0.275634 0.0148778 0.102075 0.0722559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 703 753 0.0497318 -3.14818 -0.284565 0.0624102 0.00343305 -0.0627504 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 753 754 4.94842 0.0104051 -0.209326 0.0189345 0.0994756 0.0204951 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 704 754 0.200219 -3.01629 -0.164168 0.0671322 -0.00966129 0.0167748 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 754 755 5.02932 0.076045 -0.171217 0.0110879 0.0964613 0.0799254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 705 755 -0.052488 -2.81056 -0.262404 0.0747598 -0.00847666 -0.0677819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 755 756 5.36261 0.0304361 -0.355689 0.00618968 0.102007 0.0748421 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 706 756 0.136117 -3.26935 -0.0411376 0.0698121 -0.0098603 -0.00597304 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 756 757 5.12642 0.00873206 -0.305722 -0.00551368 0.110076 0.023757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 707 757 -0.0220964 -3.13557 -0.109377 0.0728401 0.00349502 -0.0436676 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 757 758 5.09088 0.0265784 -0.387801 0.000447018 0.103646 0.0744597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 708 758 0.1715 -2.92704 -0.0953862 0.0579933 0.011182 0.0554201 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 758 759 5.17741 0.185837 -0.246811 0.0112648 0.101432 -0.0292101 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 709 759 -0.0177704 -2.92812 -0.12304 0.0577677 0.00176575 -0.0364849 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 759 760 4.99066 0.0269255 -0.272423 0.00788422 0.117211 0.0892273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 710 760 -0.00132276 -3.15674 -0.0104801 0.0560096 -0.00410729 0.015905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 760 761 5.33196 0.0395832 -0.0656167 0.00173319 0.124705 0.0737187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 711 761 0.232386 -3.19802 -0.0631278 0.0511183 0.0098773 -0.0104103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 761 762 5.0744 0.139963 -0.525425 0.0150037 0.0808953 0.159698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 712 762 0.0735347 -3.03618 -0.170271 0.0531005 -0.00717228 -0.0429163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 762 763 5.05055 0.188472 -0.369217 0.0184699 0.105553 0.0261748 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 713 763 -0.102391 -2.98661 -0.0574297 0.0516266 -0.02512 -0.0303779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 763 764 5.31834 0.2129 -0.2007 0.0136198 0.0997641 0.136163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 714 764 0.0790525 -3.07381 0.0923594 0.0434949 -0.0113052 -0.00645312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 764 765 5.10367 0.0125937 -0.33263 0.00155229 0.113295 0.0488067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 715 765 -0.246045 -2.94552 -0.0813163 0.0697639 0.0068265 -0.00907065 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 765 766 5.23799 0.046888 -0.332553 0.0159955 0.107376 0.0891476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 716 766 0.0421949 -3.12307 -0.00169529 0.0742734 -0.00265166 0.0158117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 766 767 5.11997 0.302825 -0.221093 -0.00158137 0.109389 0.0759755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 717 767 -0.0764322 -2.9681 -0.186424 0.0566583 0.0152756 0.0377777 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 767 768 5.15075 0.180305 -0.330729 -0.00199442 0.105313 0.0886047 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 718 768 0.145398 -3.18209 -0.0298385 0.0614519 -0.011378 -0.0592105 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 768 769 5.39527 0.0977658 -0.12326 -0.00536426 0.113237 0.0646543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 719 769 0.228894 -3.07293 -0.122738 0.0718271 -0.0104225 -0.0169696 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 769 770 5.21957 -0.0183566 -0.0775419 -0.0152212 0.110608 0.058591 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 720 770 0.0141565 -3.11093 -0.065615 0.0578667 -0.00623231 -0.00766028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 770 771 5.11023 0.0165693 -0.360401 -0.00328817 0.0979028 0.0653148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 721 771 -0.163798 -3.03062 -0.144652 0.0628255 -0.00166916 -0.0263083 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 771 772 5.19766 0.226146 -0.340504 -0.00436364 0.105971 0.0948516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 722 772 0.00167071 -3.00048 -0.203674 0.0631385 0.0106892 -0.112683 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 772 773 5.22283 0.251145 0.00810585 0.00879955 0.109563 0.074257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 723 773 -0.0744552 -3.10671 -0.261514 0.0601962 4.57808e-05 -0.0434785 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 773 774 5.08066 0.17895 -0.0709691 0.00320106 0.0918504 0.0537634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 724 774 -0.0401624 -3.08972 -0.11275 0.0603262 0.00322228 0.0574886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 774 775 5.2177 0.199758 -0.191193 0.0169965 0.112934 0.0301586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 725 775 0.0601041 -3.05128 -0.0216824 0.0602345 -0.00999635 -0.0440078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 775 776 5.26067 0.207537 -0.439405 0.0172082 0.0907427 0.0905976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 726 776 0.0712137 -3.10376 -0.139921 0.0582393 0.00500706 0.0333057 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 776 777 5.24894 0.103057 -0.373697 -0.0149189 0.108681 -0.015175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 727 777 0.0553983 -3.0064 -0.0140212 0.043505 0.00360782 -0.0524554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 777 778 5.26307 0.0661414 -0.149344 0.00157535 0.110997 0.148914 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 728 778 0.10469 -2.94151 -0.0784139 0.0482516 -0.0036051 0.0244932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 778 779 5.48233 0.00571877 -0.339827 0.00748891 0.107663 0.0845218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 729 779 0.0935204 -3.05444 0.0383777 0.0595314 0.0119992 -0.0144589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 779 780 5.23838 0.246089 -0.220833 0.0105228 0.0926641 0.0333228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 730 780 0.0792262 -2.97175 -0.261219 0.0653545 0.0106858 0.011921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 780 781 5.32681 0.209297 -0.116294 -0.0157647 0.103939 0.0122542 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 731 781 -0.0647844 -3.19386 0.0147493 0.0772045 -0.0137697 0.0205495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 781 782 5.31848 0.092892 -0.216081 0.0208823 0.0923527 0.0931964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 732 782 -0.113585 -3.20825 -0.123464 0.063508 -0.00998247 -0.0624735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 782 783 5.35902 0.258926 -0.336743 -0.00439501 0.117874 0.140314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 733 783 -0.0380606 -3.23021 -0.0350393 0.0803182 0.020459 -0.0179491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 783 784 5.34362 0.0600009 -0.224552 -0.00122531 0.120554 0.103394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 734 784 -0.0532074 -2.92181 0.0252862 0.0686423 -0.00763397 -0.017811 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 784 785 5.20441 0.285658 -0.247576 -0.0143382 0.0976633 0.0468873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 735 785 -0.0742974 -2.96135 -0.0917263 0.0702588 -0.0122577 -0.0607646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 785 786 5.20415 0.160135 -0.371703 0.0197402 0.113456 0.000414329 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 736 786 -0.0594782 -3.04182 0.169928 0.0704612 -0.00872593 -0.0085634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 786 787 5.41632 0.247935 -0.265075 0.00180537 0.0802425 0.00915503 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 737 787 -0.05792 -2.93917 -0.00708197 0.0672262 0.000110484 0.00434743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 787 788 5.35646 0.110047 -0.240483 0.00916755 0.106768 0.0771856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 738 788 -0.048066 -2.97112 -0.122619 0.0539979 0.00678632 0.0203701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 788 789 5.3763 0.163994 -0.199547 -0.00395076 0.0985334 0.0837336 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 739 789 -0.0804408 -3.06758 -0.195288 0.0577575 0.00147955 -0.013511 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 789 790 5.22384 0.118062 -0.251427 -0.0101278 0.106145 0.0677628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 740 790 -0.100383 -3.24976 -0.177829 0.0554303 0.0131824 -0.00879511 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 790 791 5.2674 0.163355 -0.181639 -0.00264569 0.119881 0.14238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 741 791 0.08881 -3.15537 -0.204829 0.0605312 -0.0197986 0.00472212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 791 792 5.46235 0.112308 -0.294751 0.0270857 0.0955492 0.100532 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 742 792 -0.0426849 -3.00134 0.0248191 0.0436301 -0.00484735 -0.00197588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 792 793 5.34053 0.143157 -0.288242 0.017041 0.098476 0.0745186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 743 793 0.136526 -3.09036 -0.312215 0.0685499 -0.00623336 -0.0573417 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 793 794 5.39772 0.181356 -0.45949 0.0179753 0.109447 0.0378973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 744 794 0.122074 -3.13615 -0.0690339 0.0716314 0.015146 0.018444 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 794 795 5.26147 0.0881441 -0.462425 0.000927567 0.123707 0.0463908 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 745 795 -0.0408824 -3.06165 -0.180283 0.0552084 0.00107738 0.03285 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 795 796 5.24086 0.0843215 -0.230388 0.01595 0.110735 0.0735558 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 746 796 0.0291763 -3.14629 -0.121005 0.0535681 0.0112398 -0.0476228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 796 797 5.4018 0.0630877 -0.438817 -0.011858 0.128578 0.0284576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 747 797 0.00995621 -3.09276 -0.134331 0.0710484 -0.0107197 -0.0420688 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 797 798 5.18226 0.00183321 -0.282823 -0.00976103 0.0920822 0.069275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 748 798 -0.229286 -2.88429 -0.0733723 0.0628713 0.00159554 0.0224301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 798 799 5.49213 0.318543 -0.236335 -0.00890456 0.0986672 0.0576018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 749 799 0.0947196 -3.10909 -0.00814159 0.0741363 -0.00183075 -0.0274043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 799 800 5.19784 0.0269897 -0.132272 -0.00320711 0.104496 0.114689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 750 800 0.139404 -2.95773 -0.0703432 0.058182 -0.0051102 -0.026768 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 800 801 5.36766 0.118349 -0.227007 0.00833261 0.100888 0.0785892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 751 801 -0.18957 -3.11952 0.0212357 0.0730987 0.00696412 -0.00842283 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 801 802 5.29734 0.0321226 -0.301724 -0.00357714 0.0962285 0.115381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 752 802 -0.0838925 -3.13107 -0.192335 0.0634132 0.014516 0.0288194 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 802 803 5.08873 0.375587 -0.333561 0.0108267 0.1075 0.0262502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 753 803 0.0237125 -2.91934 -0.282738 0.0639136 -0.00187631 0.0126091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 803 804 5.26387 0.118944 -0.284624 -3.1821e-05 0.118843 0.0422896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 754 804 0.0289448 -3.15941 -0.0906228 0.0448238 -0.00331117 -0.00142978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 804 805 5.38505 -0.0123196 -0.252434 0.00948839 0.0858826 0.0770298 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 755 805 0.00110749 -3.21089 0.0477078 0.0534735 -0.00243264 0.0211487 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 805 806 5.50148 0.270317 -0.370595 0.00579029 0.099864 0.0422823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 756 806 0.0533136 -2.97653 -0.0578557 0.06795 -0.0229109 -0.0355867 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 806 807 5.42807 0.0265666 -0.143237 -0.00168787 0.118841 0.133913 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 757 807 0.0501075 -3.12399 0.100344 0.0699577 -0.0202014 0.0192439 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 807 808 5.35942 0.0292008 -0.322296 -0.00311433 0.100764 -0.0422457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 758 808 0.0597505 -2.93625 -0.0114413 0.0625734 -0.00702917 -0.0331654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 808 809 5.48797 0.280071 -0.321361 0.013126 0.102316 0.0597303 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 759 809 -0.0970999 -3.08923 -0.195035 0.0473844 -0.00729651 0.0252052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 809 810 5.19527 0.225186 -0.288108 -0.011669 0.113584 0.109592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 760 810 0.192883 -3.12142 -0.0530891 0.077817 0.00637572 -0.00350111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 810 811 5.42915 -0.103176 -0.377902 0.0248556 0.0877771 0.0359431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 761 811 -0.0395695 -3.06851 -0.313869 0.067643 0.00703421 0.0181108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 811 812 5.40434 0.0836267 -0.377622 -0.00354704 0.101012 0.0487211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 762 812 0.0564086 -3.06752 0.0406841 0.0643097 -0.00896107 0.0215275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 812 813 5.27955 0.10831 -0.0775811 0.00186326 0.086852 0.0301668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 763 813 -0.0523111 -3.21446 0.161864 0.0446022 0.0110227 -0.0163725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 813 814 5.31338 0.157936 -0.192599 -0.00520697 0.100725 0.150978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 764 814 0.0710168 -3.02492 -0.010862 0.0848809 -0.00436382 0.00852261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 814 815 5.43932 0.049648 -0.189942 0.00864415 0.110105 0.0170614 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 765 815 0.0274515 -2.82089 -0.197057 0.061044 0.000424802 -0.0540304 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 815 816 5.37214 0.170266 -0.11408 0.00580319 0.102471 0.0639901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 766 816 -0.0747144 -3.01466 -0.0141552 0.0676841 -0.0119294 0.00194098 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 816 817 5.43239 0.244191 -0.336115 -0.00503401 0.107893 -0.0233215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 767 817 -0.167955 -2.95638 -0.0868385 0.0566331 0.00628874 -0.0146945 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 817 818 5.41394 0.182768 -0.465227 -0.0063678 0.107568 0.0626569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 768 818 0.216837 -2.77782 -0.00104291 0.0453445 0.00575401 0.0952461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 818 819 5.4727 0.182763 -0.361857 0.00336686 0.121225 0.118431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 769 819 -0.0817631 -3.05623 -0.0165462 0.0656581 0.0150448 0.105707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 819 820 5.33132 0.0880952 -0.132311 0.00307682 0.122254 0.0856968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 770 820 -0.0594606 -3.01292 -0.0726309 0.0678638 0.00609485 0.00452306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 820 821 5.41932 0.0351362 -0.347685 -0.000127612 0.117281 -0.000893112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 771 821 0.0547593 -3.00883 -0.00264238 0.0633193 0.00704458 0.00263415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 821 822 5.38314 0.229323 -0.217536 0.00112345 0.107214 0.0720548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 772 822 0.169894 -3.15755 -0.271426 0.0642536 0.007527 0.0147595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 822 823 5.44748 0.218967 -0.308589 0.00187153 0.110575 0.013727 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 773 823 -0.0341699 -2.95514 0.0818555 0.0592414 -0.00517063 -0.0542876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 823 824 5.43172 0.209787 -0.450308 0.013103 0.0932253 0.029456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 774 824 0.120443 -3.11704 -0.0224861 0.0584597 0.0178717 0.0463588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 824 825 5.373 0.133324 -0.271507 -0.00131408 0.107804 0.0528033 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 775 825 -0.000459441 -3.19053 0.0264692 0.0755326 -0.00362131 0.00871091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 825 826 5.46788 0.0849329 -0.229361 0.0116053 0.0963948 0.0682973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 776 826 0.039589 -3.11227 -0.1894 0.0530115 0.0153331 0.00852723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 826 827 5.38079 -0.127509 -0.102887 0.0250106 0.0998114 0.0912061 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 777 827 0.108719 -3.0155 -0.154969 0.0669255 -0.0154642 0.0874035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 827 828 5.37724 -0.0326756 -0.138603 0.00581951 0.104075 0.00791883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 778 828 0.08269 -3.0464 -0.0044232 0.0581182 -0.0229147 0.0312964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 828 829 5.3739 0.035482 -0.321164 -0.00486669 0.0966779 0.0684455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 779 829 0.0893296 -3.03656 -0.104166 0.0679718 0.0231424 0.0225762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 829 830 5.33084 0.273933 -0.334283 -0.0126767 0.0987737 -0.0256534 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 780 830 -0.128343 -2.88215 -0.0714147 0.0587598 -0.00284567 0.0029651 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 830 831 5.52419 0.00794975 -0.227209 0.00578264 0.104423 0.0154299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 781 831 -0.0714586 -3.04641 -0.0191768 0.0487401 -0.0110235 -0.0178563 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 831 832 5.42515 0.0714178 -0.478357 -0.000903342 0.0972547 0.0927954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 782 832 0.0764801 -3.00032 0.120822 0.0520786 0.00494684 0.0826291 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 832 833 5.58756 0.210566 -0.307069 0.0162071 0.104831 -0.0143357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 783 833 0.0855575 -2.98796 -0.213588 0.0768222 -0.00151586 -0.0297891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 833 834 5.50835 0.184763 -0.228267 0.0137564 0.105822 0.0756419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 784 834 0.221665 -3.04702 -0.297344 0.061733 -0.00932508 -0.0376221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 834 835 5.61127 0.0507605 -0.17027 0.0114251 0.0952634 0.0284885 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 785 835 0.0742049 -2.93847 -0.161161 0.0634248 -0.00210513 0.0108337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 835 836 5.48043 0.0209374 -0.418011 -0.00283636 0.12559 -0.017185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 786 836 -0.151716 -3.13695 -0.203101 0.0668202 -0.00340238 -0.0012111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 836 837 5.56699 0.175323 -0.351172 0.00180907 0.110506 0.0553422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 787 837 -0.0894004 -2.88441 -0.136029 0.0825449 0.00152065 0.0354937 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 837 838 5.32762 0.11804 -0.350563 -0.000753829 0.0907529 0.0400098 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 788 838 0.0210524 -3.00989 -0.154816 0.0578179 -0.0146046 0.014603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 838 839 5.42237 0.164304 -0.384447 0.0153668 0.0916537 0.0993906 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 789 839 -0.0140701 -3.2293 0.139781 0.0468194 -0.0128685 -0.0781856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 839 840 5.44521 0.162823 -0.328552 0.0104145 0.0968614 0.148829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 790 840 -0.0565142 -3.02495 -0.025964 0.0739753 0.018297 -0.00467218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 840 841 5.61253 0.069914 -0.223577 0.0174301 0.119212 0.0460968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 791 841 0.0164769 -3.13911 -0.106503 0.0637163 0.00857961 0.00943962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 841 842 5.39787 0.258225 -0.197657 0.00438106 0.102756 0.0815166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 792 842 0.0203868 -3.29879 -0.159645 0.0640894 0.0012212 -0.0503669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 842 843 5.43317 -0.085881 -0.210751 0.00805972 0.107217 0.0983152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 793 843 0.0103455 -2.78627 -0.0255142 0.0776721 0.00849335 0.0329023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 843 844 5.40771 0.215645 -0.200565 0.0256466 0.105592 0.0599317 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 794 844 -0.0729561 -3.07995 -0.105971 0.0568126 0.00324068 -0.00766464 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 844 845 5.52266 0.0229137 -0.387959 0.0100185 0.117434 0.0598418 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 795 845 0.0618721 -3.06492 0.0399359 0.0707327 0.00123784 -0.0196934 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 845 846 5.49201 0.0676575 -0.366536 0.0106634 0.10972 -0.0236267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 796 846 -0.0485375 -2.99825 -0.180241 0.061976 -0.00625801 0.080142 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 846 847 5.38153 0.0831649 -0.258973 0.000377965 0.098076 0.0835005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 797 847 -0.124664 -3.00604 -0.0641998 0.0469996 -0.0108647 0.12554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 847 848 5.35694 -0.0482841 -0.330069 0.0182184 0.129096 0.109391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 798 848 0.0205685 -2.96612 0.0694419 0.077109 0.00444003 0.0286734 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 848 849 5.27639 0.0945423 -0.288511 -0.00284569 0.10812 0.0889412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 799 849 0.0676333 -3.01993 -0.238978 0.0600366 -0.00477505 -0.0126593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 849 850 5.44542 0.183225 -0.34732 0.0352274 0.111688 0.0404952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 800 850 0.0754936 -3.06356 -0.116271 0.0650193 0.0101746 -0.0505819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 850 851 5.55677 0.286422 -0.438426 -0.00545376 0.109529 0.0217729 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 801 851 0.052372 -3.12787 -0.0102487 0.0643244 -0.00419776 0.0126394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 851 852 5.52507 0.118717 -0.196016 0.0195774 0.105559 0.0351438 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 802 852 0.0471629 -3.07179 0.25904 0.0680487 0.0128719 -0.0125969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 852 853 5.46886 0.159076 -0.271589 0.0114994 0.0966973 0.108508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 803 853 -0.0385874 -3.096 -0.1376 0.0671632 0.0108091 0.0187646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 853 854 5.51199 0.217291 -0.299369 0.00440555 0.132907 0.0390139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 804 854 -0.0372246 -3.02773 -0.294749 0.0655991 -0.0114882 -0.0156043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 854 855 5.51543 0.283903 -0.381323 0.0176572 0.106779 0.0590828 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 805 855 0.152984 -3.14281 0.0157709 0.0658771 -0.00263678 -0.054367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 855 856 5.65074 -0.0270548 -0.216601 0.00163097 0.11022 -0.0073571 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 806 856 -0.0951268 -3.23544 -0.042613 0.0501963 -0.00169054 -0.0407583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 856 857 5.30723 0.182254 -0.322114 0.00589103 0.111282 0.0572112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 807 857 0.0551192 -3.09255 -0.114165 0.0427529 0.007684 0.0401774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 857 858 5.5815 0.102338 -0.487154 -0.0037479 0.0981932 0.0550238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 808 858 0.00516526 -3.17746 -0.10912 0.0664482 0.0100229 0.0208556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 858 859 5.54776 -0.0447337 -0.342395 0.00463873 0.119114 0.00615207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 809 859 -0.0471174 -3.05994 -0.0632384 0.0467488 -0.00668901 0.0537764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 859 860 5.73325 -0.0703218 -0.298173 0.00186512 0.106859 0.0394859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 810 860 0.0273089 -3.13088 -0.0920744 0.0469507 0.0208641 0.0066657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 860 861 5.44636 -0.101466 -0.227333 0.0132672 0.104276 -0.0154156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 811 861 0.251966 -3.12255 -0.0955193 0.0675776 0.00409941 -0.0486017 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 861 862 5.46832 0.0034815 -0.48038 0.0168354 0.107328 0.0637843 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 812 862 0.0608597 -3.08813 -0.138249 0.0679572 0.00889264 0.0604949 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 862 863 5.60754 0.110966 -0.340274 -0.000507501 0.115182 0.111914 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 813 863 -0.109336 -3.20256 -0.0661604 0.0622308 -0.0156592 0.0353477 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 863 864 5.6811 0.0430915 -0.330111 0.00423997 0.12454 0.0690777 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 814 864 0.0767307 -2.82207 0.0408218 0.0676136 0.00724741 0.0423628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 864 865 5.53086 0.188418 -0.350275 0.00284788 0.0918312 0.0032867 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 815 865 0.174826 -3.06884 -0.244626 0.0603843 -0.0025261 0.041339 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 865 866 5.48949 0.142582 -0.318214 -0.0035865 0.0951289 0.0773789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 816 866 -0.00499317 -2.98111 -0.153201 0.0440066 0.00265665 -0.0238713 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 866 867 5.82972 0.149178 -0.298758 0.00315607 0.122793 0.0050502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 817 867 0.00560511 -3.01963 -0.252672 0.0649075 -0.0114234 0.0216059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 867 868 5.57386 0.223666 -0.276354 -0.00104587 0.120213 0.0525573 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 818 868 -0.297951 -3.0727 0.0959597 0.0644723 0.00432807 -0.0328016 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 868 869 5.61316 0.0253105 -0.377634 -0.00695867 0.118322 -0.0114218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 819 869 -0.0823634 -3.12234 -0.127509 0.0542311 0.00133779 -0.0403975 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 869 870 5.62345 -0.120347 -0.192941 -0.000277778 0.126276 0.0647631 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 820 870 -0.0146496 -2.90021 -0.12713 0.06483 0.0122235 0.0230018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 870 871 5.69018 0.0424455 -0.410373 -0.00407878 0.127353 0.111729 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 821 871 -0.102696 -3.03492 0.0019022 0.06137 -0.0164409 0.0158564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 871 872 5.62336 0.108373 -0.20576 0.00624347 0.122285 0.0482832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 822 872 -0.0623595 -3.14125 -0.152182 0.0665468 -0.00494298 -0.0687816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 872 873 5.63896 0.00598252 -0.294655 -0.00703519 0.0944308 0.0563393 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 823 873 0.206902 -2.83793 -0.265399 0.0539451 -0.0106572 -0.0081036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 873 874 5.44794 0.176577 -0.379727 -0.00919274 0.126872 0.0403889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 824 874 0.00242097 -2.98718 0.0651186 0.071002 0.00756906 0.00124292 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 874 875 5.47986 0.15967 -0.190827 -0.0012769 0.0901644 0.015987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 825 875 -0.140471 -3.19624 -0.290119 0.0656985 0.000932556 -0.0642646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 875 876 5.61406 -0.0213291 -0.266134 0.00429432 0.112224 0.0162696 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 826 876 0.0134897 -2.98252 -0.123038 0.0558555 -0.0177147 -0.142812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 876 877 5.79605 0.114555 -0.34615 0.0215349 0.101346 0.0748463 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 827 877 -0.0057657 -2.98519 -0.0225819 0.0648041 0.0202072 0.0209343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 877 878 5.55674 0.0988603 -0.207797 -0.00634477 0.105889 0.0847202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 828 878 -0.00118392 -3.043 -0.0397329 0.0667516 -0.010456 -0.0436006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 878 879 5.46382 0.141946 -0.254806 -0.00583483 0.117211 -0.0309035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 829 879 -0.0541385 -3.04666 -0.135317 0.0488924 0.00974442 -0.00902855 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 879 880 5.68799 0.127466 -0.327294 -0.00899907 0.109082 0.139587 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 830 880 -0.0395402 -3.13943 -0.0582472 0.0488669 0.0112481 0.0491593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 880 881 5.78704 0.106964 -0.528972 -0.0015892 0.118725 0.0665529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 831 881 -0.162072 -3.05012 -0.105102 0.065211 -0.00035457 0.00359769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 881 882 5.72918 0.138789 -0.156362 -0.00154343 0.100118 0.0953245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 832 882 -0.0389838 -3.2889 -0.060577 0.0786346 -0.00232569 0.0595627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 882 883 5.86222 0.0796744 -0.241965 0.00487163 0.129456 0.0928662 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 833 883 -0.02885 -3.05762 -0.0613176 0.0568149 0.00792373 -0.0182448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 883 884 5.74574 0.117091 -0.0058916 0.00856249 0.105505 0.055369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 834 884 -0.0767035 -2.91371 -0.0139103 0.0537297 0.00636968 0.00771971 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 884 885 5.51883 -0.00973307 -0.438069 0.00183971 0.114528 0.0788894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 835 885 0.145044 -3.18457 -0.0862953 0.0645326 0.00124387 0.0610584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 885 886 5.60348 0.213426 -0.329835 0.00921274 0.119903 0.0782399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 836 886 0.0105162 -2.94827 -0.0144536 0.0633864 0.00474876 -0.0265795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 886 887 5.74311 0.13457 -0.423206 0.00967385 0.0948428 0.104191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 837 887 -0.0145459 -2.98616 -0.070004 0.054668 0.000173385 -0.040764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 887 888 5.65981 0.14786 -0.205742 0.0050061 0.107568 0.0499248 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 838 888 0.120328 -3.01565 -0.175568 0.0577028 0.00752391 0.0458964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 888 889 5.62041 0.125545 -0.399808 0.00236579 0.113118 0.118538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 839 889 -0.00527073 -2.89964 -0.166186 0.071987 -0.0194947 0.0322962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 889 890 5.79303 0.153249 -0.341452 0.00979922 0.117016 0.0855099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 840 890 -0.0661851 -3.09684 -0.143534 0.0534907 0.00666852 0.0469769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 890 891 5.85574 -0.0637915 -0.421095 -0.00198457 0.12123 0.0597487 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 841 891 0.0175324 -3.23279 -0.175266 0.0468126 -0.00283092 -0.0302702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 891 892 5.73138 -0.0787459 -0.407888 0.016708 0.121855 0.0582726 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 842 892 -0.0641623 -3.1783 0.0883321 0.0578649 -0.00330838 0.0691626 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 892 893 5.60928 0.0926899 -0.382789 0.00821818 0.107891 -0.0299389 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 843 893 -0.0394914 -3.00401 -0.104158 0.0621685 0.00151955 -0.00214253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 893 894 5.67846 0.160198 -0.326742 0.0062275 0.111128 0.100415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 844 894 0.0570183 -3.00372 -0.274852 0.0738882 0.00832292 0.0188151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 894 895 5.68276 0.0336129 -0.272 0.00057233 0.126866 0.0709469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 845 895 -0.0380615 -3.10552 -0.140992 0.0638313 -0.0019301 -0.0175082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 895 896 5.67846 -0.0196392 -0.483228 -0.00375038 0.110561 0.0353133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 846 896 -0.0796676 -2.87112 -0.0243779 0.0644395 0.00141475 -0.000537595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 896 897 5.70897 -0.0344093 -0.313103 -0.000494778 0.116177 0.00908831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 847 897 -0.0672669 -2.86321 0.117066 0.0541894 -0.0100323 -0.000995567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 897 898 5.8709 0.0972814 -0.176418 0.0063692 0.119902 0.0187295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 848 898 0.106736 -3.17697 -0.00982482 0.0631819 -0.00555778 0.00902965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 898 899 5.68489 0.113443 -0.288222 -0.00895948 0.108205 0.108482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 849 899 -0.123366 -3.07337 -0.0261452 0.060131 -0.00948015 0.0286471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 899 900 5.71728 0.00504936 -0.166699 0.0151203 0.100867 0.103704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 850 900 0.0514619 -3.01406 -0.00618753 0.0787327 -0.00129161 0.00294897 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 900 901 5.81606 0.130423 -0.307906 0.00177775 0.103953 0.0582778 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 851 901 0.129484 -2.98772 -0.107677 0.0890209 0.0108462 0.0257882 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 901 902 5.58134 0.106567 -0.366241 0.00636359 0.106493 0.0598277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 852 902 0.186296 -3.01508 -0.0508652 0.0538734 -0.0029991 -0.0306229 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 902 903 5.66485 0.0396712 -0.491777 0.00543491 0.11764 0.0719504 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 853 903 -0.0617121 -2.92871 -0.187727 0.0627519 -0.0152531 -0.00339369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 903 904 5.78158 -0.0729035 -0.267288 -0.00268518 0.10262 0.117285 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 854 904 0.0657111 -2.91251 -0.153895 0.0591152 -0.00812452 0.0379513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 904 905 5.71539 0.110967 -0.316183 0.00890228 0.115505 0.0816919 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 855 905 0.0576527 -2.9949 -0.0201603 0.0643084 -0.00387708 -0.0246904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 905 906 5.61754 0.00202861 -0.257216 0.0112767 0.11772 0.0186353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 856 906 -0.072813 -3.03136 -0.135348 0.0785048 0.00291089 -0.0408013 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 906 907 5.66768 0.00672407 -0.43321 0.013643 0.100485 -0.0305147 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 857 907 -0.0950345 -3.13145 -0.114097 0.0616122 0.00699456 -0.0397035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 907 908 5.74752 0.088552 -0.375093 -0.0172569 0.114828 0.0836396 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 858 908 -0.0824084 -2.95155 -0.0565634 0.0550739 0.013475 -0.0837597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 908 909 5.74854 0.0195906 -0.432354 -0.00133347 0.120554 0.0344148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 859 909 0.135732 -3.14951 -0.13595 0.0627147 0.017062 0.00260443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 909 910 5.75807 0.0225051 -0.510702 0.000449932 0.10978 0.102883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 860 910 0.0645128 -3.09717 -0.0901706 0.0686501 0.0153251 0.0164404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 910 911 5.89262 0.168562 -0.386208 -0.0122869 0.119459 -0.01978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 861 911 0.133169 -3.11375 -0.179508 0.0563896 0.00554515 0.00646966 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 911 912 5.8348 0.140481 -0.282375 0.0151944 0.109572 0.0633228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 862 912 0.208141 -3.06997 -0.275004 0.0695253 -0.00527307 0.0261105 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 912 913 5.59309 0.202325 -0.398574 0.0189627 0.114065 -0.0394421 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 863 913 0.0228452 -3.08999 -0.161828 0.0759145 0.00132259 0.00384099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 913 914 5.63077 0.0391913 -0.313469 0.00620642 0.125196 0.0362862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 864 914 -0.173054 -3.13543 -0.116261 0.0532399 0.0138001 -0.0201843 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 914 915 5.73142 0.0274934 -0.268815 -0.00389896 0.0965665 0.0516985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 865 915 -0.0217807 -2.9891 -0.128035 0.0761984 -0.0141238 -0.0604898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 915 916 5.71058 0.154148 -0.443108 0.00311788 0.128862 0.0674009 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 866 916 -0.1345 -3.07454 -0.15849 0.06658 0.0154465 -0.0605996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 916 917 5.87182 0.186107 -0.260194 0.00222168 0.10634 0.0170501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 867 917 0.022569 -3.07268 -0.0394752 0.0494245 -0.00369295 0.00146992 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 917 918 5.83543 0.123671 -0.422451 -0.000657822 0.120018 0.140724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 868 918 0.113911 -2.98425 -0.047503 0.0484126 -0.0106649 0.00920957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 918 919 5.63953 0.0833965 -0.361634 0.0130403 0.106961 0.057925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 869 919 0.0935929 -2.8295 -0.189479 0.0579376 0.015114 -0.0721362 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 919 920 5.74183 0.046585 -0.415589 -0.00724635 0.108646 -0.0168076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 870 920 -0.143523 -2.85812 -0.120242 0.0681002 0.00275955 -0.0458604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 920 921 5.83403 0.0342787 -0.272573 -0.0090147 0.128102 -0.0311093 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 871 921 -0.164815 -3.13075 -0.130331 0.0553706 -0.0119622 0.010073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 921 922 5.66737 0.0669562 -0.452664 0.00267173 0.101129 0.0607469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 872 922 0.152668 -3.13297 0.0524221 0.0612179 -0.00604264 0.0342896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 922 923 5.70358 0.0310954 -0.289324 -0.0162986 0.0950071 0.102293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 873 923 0.110593 -3.24041 -0.187065 0.0599794 0.00924838 -0.021805 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 923 924 5.61169 0.139257 -0.367081 0.0270063 0.112215 -0.00191026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 874 924 -0.179357 -2.99108 -0.120697 0.064618 -0.012754 -0.00829556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 924 925 5.69891 0.0508799 -0.393864 0.00318184 0.0999299 0.0847622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 875 925 0.0464449 -3.18683 -0.168479 0.0657639 0.00953888 0.0612318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 925 926 5.88813 0.228558 -0.19915 -0.0109772 0.143133 0.0343204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 876 926 -0.00381915 -3.10149 -0.0986604 0.0684909 -0.00776917 0.0667639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 926 927 5.88074 0.142328 -0.447172 -0.0091385 0.111694 0.0711913 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 877 927 0.041688 -3.21411 -0.132363 0.0743085 -0.00270315 0.0471978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 927 928 5.76557 0.178848 -0.369578 0.00221802 0.106501 0.0117871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 878 928 -0.00643717 -2.87597 -0.0149175 0.0722528 0.0108956 0.010617 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 928 929 5.70815 0.0326216 -0.244624 0.00666373 0.124035 0.0302921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 879 929 0.0588748 -3.09383 -0.188432 0.0545491 0.000348733 -0.060142 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 929 930 5.83768 0.00219686 -0.328391 0.0150373 0.111617 0.0942473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 880 930 -0.0138014 -3.06391 -0.170621 0.0735855 0.00507305 0.0333795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 930 931 5.90511 -0.0241702 -0.27371 -0.0113712 0.125803 0.00628711 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 881 931 0.108728 -3.12562 0.0733991 0.0529694 -0.00238387 -0.0441871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 931 932 5.84093 0.0277419 -0.364922 0.0198569 0.127319 0.0320153 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 882 932 0.0719464 -3.01479 -0.220671 0.0433315 0.0111216 0.0159775 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 932 933 5.80103 0.342445 -0.311277 -0.011791 0.114894 0.0664954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 883 933 0.0731653 -3.12337 0.036976 0.0546755 -0.000236786 0.0605988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 933 934 5.84555 0.127618 -0.289495 0.00635182 0.121654 0.00986428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 884 934 -0.0267161 -3.05159 -0.0843282 0.0508906 0.00154887 -0.0673117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 934 935 5.7416 0.256171 -0.276999 0.033529 0.132517 0.0292434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 885 935 0.23322 -3.1108 0.0916384 0.0646734 0.00554178 0.0366757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 935 936 5.73812 0.324558 -0.304425 -0.00885694 0.102511 0.0734478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 886 936 -0.156601 -2.97509 -0.0986761 0.0645083 -0.014308 0.00539802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 936 937 5.90347 0.154624 -0.182696 0.00953335 0.135071 0.0993044 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 887 937 -0.0366022 -3.10577 -0.153094 0.0710203 0.0223415 0.013002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 937 938 5.78436 0.244822 -0.315574 -0.00517519 0.115547 0.0794457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 888 938 -0.10024 -2.92706 -0.289488 0.0614908 -0.00223339 0.00484492 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 938 939 5.91267 -0.00339733 -0.36096 0.0216386 0.146158 0.078458 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 889 939 0.0663865 -3.01716 0.0277817 0.0743617 0.00858848 -0.0434251 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 939 940 5.6436 0.0739063 -0.545369 -0.000694263 0.0987482 0.0103039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 890 940 0.0893573 -3.07206 0.0981277 0.0664399 0.00432704 -0.00081773 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 940 941 6.14703 0.0470746 -0.412763 0.00594781 0.108138 0.0520303 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 891 941 0.0978213 -3.04167 -0.0766208 0.0427588 0.010634 -0.0483327 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 941 942 5.93524 0.180158 -0.368718 0.00111394 0.133292 0.0162197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 892 942 -0.00161554 -3.09857 -0.00185938 0.0731623 0.00376455 -0.0160248 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 942 943 5.6897 -0.0722077 -0.43154 0.000801379 0.124512 0.110326 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 893 943 0.0209751 -3.16323 -0.134262 0.0670576 0.00997867 0.0775382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 943 944 5.9741 -0.0735058 -0.255266 0.00825349 0.128401 0.0473012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 894 944 0.182204 -3.07618 -0.139507 0.0492743 -0.00841748 -0.00133312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 944 945 5.94247 0.207794 -0.351528 0.00104922 0.123517 0.0750056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 895 945 -0.0416307 -3.08688 -0.245167 0.0674619 -0.0221368 0.0245415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 945 946 5.81961 0.0534436 -0.343714 0.0079812 0.13621 0.0265039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 896 946 0.147749 -3.25451 -0.220992 0.0555959 0.00139987 -0.0668342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 946 947 5.76548 -0.00733043 -0.535869 0.01101 0.107925 0.100967 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 897 947 0.0477481 -2.97821 -0.220782 0.0635092 0.00120738 0.01634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 947 948 5.93372 0.160423 -0.245852 -0.0105612 0.110863 0.071377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 898 948 0.0862325 -3.07872 -0.242241 0.0474091 -0.00161979 -0.0913925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 948 949 5.83659 0.190445 -0.278819 -0.00573364 0.116972 0.0692949 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 899 949 -0.0340798 -3.01524 -0.31136 0.0510148 -0.00793078 -0.0531107 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 949 950 5.80575 0.0490006 -0.217435 0.00965528 0.129397 0.0716405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 900 950 0.0314062 -3.20278 0.0229703 0.0408542 -0.00531462 -0.0297082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 950 951 5.94037 -0.105746 -0.383996 0.00480533 0.123295 0.0209278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 901 951 0.130807 -3.07881 -0.156298 0.0609175 0.00627261 0.0524152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 951 952 5.93269 0.118407 -0.361279 0.00448006 0.112453 0.0864886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 902 952 0.123132 -3.00814 -0.11484 0.0645225 -0.00726641 -0.00984185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 952 953 5.77817 0.122147 -0.168345 -0.00855567 0.115176 0.0996461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 903 953 -0.018327 -2.932 -0.00186501 0.0569702 0.00410564 0.0123333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 953 954 5.87231 0.0449308 -0.325559 0.0087398 0.115921 0.0883216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 904 954 -0.049517 -2.96606 -0.111201 0.0759981 0.01359 0.0195804 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 954 955 5.95759 -0.10446 -0.461411 -0.00317467 0.100563 0.00989361 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 905 955 0.229266 -3.11498 -0.223046 0.0635466 0.00990741 -0.0438346 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 955 956 5.78406 0.0738019 -0.441606 0.00483629 0.132172 -0.00585784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 906 956 0.0738805 -2.97624 0.0149636 0.0789268 -0.0102231 -0.0497579 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 956 957 5.95271 0.145364 -0.482912 -0.00172477 0.103041 0.11615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 907 957 0.0781099 -2.94845 0.041319 0.062285 0.00523114 -0.0263351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 957 958 5.98294 0.0981044 -0.314154 -0.00698192 0.117709 0.0458176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 908 958 0.169471 -3.10141 -0.0932237 0.0795286 -0.0180737 0.00635261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 958 959 5.7759 0.128567 -0.228232 0.0127759 0.133689 0.0156009 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 909 959 -0.149071 -3.00445 -0.0775245 0.0568293 -0.0143429 0.0188036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 959 960 5.89375 0.0637932 -0.254576 0.00618815 0.109029 0.00967233 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 910 960 -0.132917 -2.78686 -0.105742 0.0550426 0.00603796 -0.00611394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 960 961 5.9505 -0.0616201 -0.446693 -0.0208308 0.118784 0.0281147 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 911 961 0.0432995 -3.121 0.00564701 0.0730457 -0.000563106 0.0062399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 961 962 5.8297 0.085111 -0.342315 -0.00202488 0.138658 -0.0256182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 912 962 0.0811981 -3.1013 -0.105646 0.0823669 0.00364722 -0.015005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 962 963 5.8165 0.221306 -0.185925 -0.00589091 0.112857 0.00861302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 913 963 -0.232083 -3.11313 -0.10773 0.0569758 0.00304915 -0.0038394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 963 964 6.00393 -0.00931952 -0.462183 -0.00454362 0.127775 0.0578766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 914 964 0.030681 -2.99322 -0.0111456 0.0528007 0.00763373 -0.0309236 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 964 965 5.86789 0.0261723 -0.306497 0.00241238 0.111484 0.0428847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 915 965 0.0777047 -3.13883 -0.0212222 0.0579308 0.000774597 -0.00978926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 965 966 5.98908 0.0378531 -0.256978 -0.00739232 0.128456 0.0762562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 916 966 0.0671234 -3.21668 -0.0925357 0.0591847 0.00220768 0.0410104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 966 967 5.93551 0.266178 -0.358432 0.000255048 0.103896 0.0526172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 917 967 0.055155 -3.1811 -0.0594103 0.0571803 -0.00402892 0.0858504 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 967 968 5.78028 0.228768 -0.360943 0.00156527 0.118668 0.102718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 918 968 -0.0307255 -3.15193 0.0216286 0.0581273 -0.000945855 -0.044067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 968 969 5.7936 0.0885477 -0.277645 -0.0117364 0.112363 0.0483899 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 919 969 0.0815884 -3.23011 -0.0179284 0.0465296 0.000997434 -0.0309407 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 969 970 5.91996 0.0673377 -0.349883 0.00862644 0.118104 0.14286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 920 970 0.0373945 -3.02067 -0.0581669 0.0546434 0.012708 0.0316409 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 970 971 5.89389 0.168067 -0.444025 0.00420566 0.104966 0.0211506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 921 971 0.0661091 -3.17381 -0.16367 0.0664496 0.00435437 -0.0196274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 971 972 5.84825 0.149212 -0.287992 0.0146029 0.103478 0.0682334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 922 972 -0.160708 -3.05045 -0.243504 0.0624209 0.02044 0.015893 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 972 973 6.02934 0.0713096 -0.27386 0.0256645 0.134482 0.0539952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 923 973 -0.117801 -3.11897 -0.245365 0.0601549 -0.0063569 0.0361674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 973 974 5.91278 0.131277 -0.509767 0.00773773 0.117834 0.0465795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 924 974 -0.0462526 -2.9713 -0.15525 0.0593279 0.0100355 -0.0303601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 974 975 5.832 0.0566081 -0.246129 0.00370733 0.119746 -0.0253347 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 925 975 0.0561672 -2.96208 -0.297658 0.0560562 -0.00872338 0.021644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 975 976 5.78135 0.0543821 -0.423562 -0.00489479 0.1251 -0.0708398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 926 976 0.226172 -2.94283 -0.184377 0.0870218 0.012055 -0.0115809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 976 977 5.87459 0.140453 -0.474698 6.55509e-05 0.127088 0.021701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 927 977 -0.045037 -3.02154 -0.106196 0.0515899 0.00274159 0.0366376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 977 978 5.90999 0.0765201 -0.34204 -0.00117448 0.108235 0.084709 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 928 978 -0.0921606 -3.01449 -0.144193 0.0577033 -0.0125742 0.00148354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 978 979 5.91373 -0.0464542 -0.424729 -0.00175246 0.119142 0.0554509 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 929 979 -0.0591735 -3.19667 -0.0879218 0.055739 0.00278888 -0.00604483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 979 980 5.92006 -0.0370302 -0.394517 0.00175098 0.126061 0.0010585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 930 980 -0.00201238 -3.11049 0.0113263 0.0523772 0.00542789 -0.0204863 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 980 981 5.67788 0.160756 -0.482692 -0.0138013 0.130793 0.0195738 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 931 981 -0.24441 -3.02352 -0.181153 0.0573253 -0.000853116 0.0146156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 981 982 5.81624 -0.0320606 -0.355133 0.0116294 0.107808 -0.00469732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 932 982 0.033071 -3.04145 0.0382333 0.0657392 0.000871986 -0.0433737 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 982 983 6.01713 0.210474 -0.204899 0.021088 0.130198 0.0405009 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 933 983 0.0436633 -3.1605 -0.195206 0.0620472 -0.00666152 0.076645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 983 984 5.92896 0.0675336 -0.57383 -0.00585476 0.126578 0.0838544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 934 984 -0.0459296 -2.85428 -0.186596 0.0671636 -0.00187333 0.00301786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 984 985 6.11662 0.020977 -0.424975 0.00816502 0.113181 0.0442294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 935 985 0.0203099 -2.95208 -0.0260574 0.0685339 0.00147742 0.0482901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 985 986 5.87066 0.0469223 -0.506174 -0.00298515 0.0952878 0.0224686 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 936 986 -0.182141 -3.10238 -0.238111 0.0698601 0.00222993 0.020132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 986 987 5.91167 0.103836 -0.465919 0.000893594 0.124621 0.00877801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 937 987 0.0267933 -3.04949 -0.129168 0.0586268 -0.0121383 0.00168218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 987 988 5.8007 0.0691662 -0.407599 -0.021429 0.133207 0.016605 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 938 988 -0.0819009 -3.0526 -0.118019 0.0705099 0.0178594 -0.0780517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 988 989 5.92943 0.0156208 -0.199829 -0.0142409 0.115684 0.0578818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 939 989 -0.0570242 -2.99449 0.0191212 0.0686818 0.0095252 -0.0213175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 989 990 5.98538 0.110079 -0.419333 0.022156 0.114461 0.065051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 940 990 0.0616481 -3.06456 0.0486347 0.0684938 -0.00890722 0.00528942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 990 991 5.99323 0.060736 -0.552609 -0.00211683 0.115178 0.100135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 941 991 -0.0672321 -2.93812 -0.0297879 0.0708174 0.0148777 0.00790822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 991 992 5.87864 0.00983747 -0.301448 0.00664587 0.133948 0.0416467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 942 992 -0.0582761 -3.13893 -0.247103 0.0667328 -0.00121704 0.00750106 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 992 993 6.05482 0.0756201 -0.41822 0.00283092 0.128495 0.117523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 943 993 -0.0755444 -2.81495 -0.187806 0.0543995 -0.004082 0.0464925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 993 994 6.03533 0.0059417 -0.304103 0.0036887 0.102961 -0.00603561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 944 994 0.153973 -3.269 -0.0465982 0.0671981 0.00690557 0.0563223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 994 995 6.03443 0.12901 -0.252569 0.0140838 0.119445 0.115117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 945 995 -0.05785 -3 -0.11265 0.0698289 -0.00615208 -0.000365173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 995 996 5.96137 0.0238147 -0.302607 0.011709 0.109706 0.0763255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 946 996 -0.101075 -3.34018 -0.00949362 0.0703672 -0.0144498 -0.0541034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 996 997 5.95767 0.0792133 -0.469595 0.00582529 0.120029 0.0803362 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 947 997 0.116916 -3.00919 -0.132406 0.0530687 -0.0112767 0.0698936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 997 998 5.78988 0.181554 -0.349835 -0.00400251 0.113389 0.0224244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 948 998 -0.0515803 -2.84711 -0.0145609 0.0546773 0.00695092 0.0226123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 998 999 5.99736 0.0144268 -0.270316 -0.00702106 0.127906 0.0335552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 949 999 0.0227854 -3.11563 -0.0776197 0.0602293 -0.00144853 -0.00859518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 999 1000 6.02616 0.16531 -0.61513 0.00798092 0.1269 0.019448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 950 1000 -0.0304937 -3.03547 -0.11559 0.0700084 0.012317 0.0392633 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1000 1001 5.87236 0.0343077 -0.196024 0.00738804 0.134282 0.0767825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 951 1001 0.0840092 -2.95577 -0.017715 0.0865725 0.00121891 -0.00545879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1001 1002 6.00823 0.187838 -0.18849 0.00767158 0.128257 0.0272487 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 952 1002 0.083814 -3.03054 -0.0857193 0.0599518 -0.0022857 -0.00430316 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1002 1003 5.94887 0.0268525 -0.230844 -0.0108393 0.113799 0.0839244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 953 1003 -0.0817822 -3.00663 -0.136828 0.0790884 0.00225068 0.0329214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1003 1004 5.80156 0.0651958 -0.4677 0.00422433 0.125709 0.0111342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 954 1004 -0.133527 -3.11044 -0.21021 0.0840047 -0.0285565 0.112517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1004 1005 6.0407 0.140861 -0.372566 0.00857235 0.103025 -0.0161311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 955 1005 0.163475 -3.11015 -0.0109611 0.0680815 -0.0173532 0.049124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1005 1006 5.87842 -0.0265365 -0.626934 0.00608827 0.117344 0.107922 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 956 1006 0.088096 -3.15635 -0.127318 0.06994 0.0164995 -0.0398786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1006 1007 5.83783 0.0109809 -0.340803 0.0090729 0.121909 0.0471533 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 957 1007 -0.0151472 -2.95095 -0.151123 0.0431925 -0.0145254 -0.0390335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1007 1008 6.03981 0.051088 -0.538192 0.0167969 0.114486 0.0973489 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 958 1008 -0.0279193 -3.03789 -0.0273645 0.0622433 -0.00230048 0.00544718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1008 1009 5.86934 0.0524011 -0.357282 0.0114007 0.112558 0.0428634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 959 1009 -0.275265 -2.85042 -0.0567159 0.0554497 0.00700271 -0.00609385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1009 1010 6.0856 -0.0641573 -0.228599 0.00160243 0.118649 -0.00469985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 960 1010 0.0303055 -3.00106 -0.0687602 0.0719371 0.0132331 -0.0318831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1010 1011 5.91605 0.0942708 -0.400208 0.0100291 0.119557 0.045976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 961 1011 0.207652 -3.07523 -0.10412 0.0696832 -0.00801302 -0.0763837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1011 1012 5.90871 0.0513194 -0.363139 0.00738567 0.12125 0.00826238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 962 1012 -0.0622008 -3.17816 -0.349235 0.0524629 -0.00672636 0.00919596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1012 1013 6.16339 -0.00735077 -0.317404 0.00734191 0.124362 0.00563829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 963 1013 -0.106456 -3.08668 -0.0620185 0.0820027 -0.00111664 -0.00121897 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1013 1014 6.10255 0.0940275 -0.635988 0.00728009 0.0995202 0.0384983 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 964 1014 -0.164922 -3.05599 -0.0657857 0.0579574 0.00578415 0.020974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1014 1015 6.27194 0.102547 -0.211161 0.0138729 0.110419 0.0648463 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 965 1015 -0.031883 -3.03663 -0.245354 0.0443117 -0.0216675 0.0744507 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1015 1016 6.10932 0.0610938 -0.221518 0.00581769 0.120043 0.0194876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 966 1016 -0.141263 -3.00011 -0.0275538 0.0572684 0.00989163 0.0107657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1016 1017 5.97724 0.0958543 -0.326323 -0.0181937 0.123108 0.0405011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 967 1017 -0.0167885 -2.90299 -0.0969139 0.0644305 0.00176229 0.0447208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1017 1018 6.18252 -0.0466147 -0.480401 0.00881654 0.135978 0.047472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 968 1018 -0.0860026 -3.04599 -0.132652 0.0445599 0.00924848 -0.0494069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1018 1019 5.86558 -0.0521078 -0.200907 -0.0142739 0.123925 0.0950651 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 969 1019 -0.0851597 -2.90807 -0.0658584 0.0467597 -0.00181803 0.0338525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1019 1020 6.00306 -0.0442583 -0.379921 -0.00814603 0.128117 -0.0121779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 970 1020 -0.0396013 -3.08293 0.0506673 0.0666653 -0.000767108 0.00219506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1020 1021 5.94107 0.0144093 -0.24275 -0.00193209 0.119015 0.118382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 971 1021 0.250576 -3.15329 -0.01005 0.0825083 0.0105149 -0.00420336 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1021 1022 6.08892 0.231953 -0.176065 -0.00878297 0.121511 -0.018491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 972 1022 -0.117976 -3.1559 -0.198695 0.0493489 -0.00191379 0.0374746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1022 1023 6.03162 0.180877 -0.421028 0.00122719 0.126431 -0.0206739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 973 1023 0.0333009 -3.00712 -0.133243 0.056294 0.0134939 0.0253223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1023 1024 6.00148 0.129429 -0.372576 -0.00324585 0.111877 0.0875596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 974 1024 0.0674308 -3.17344 -0.247803 0.0675724 -0.000510293 0.0475125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1024 1025 6.05035 0.174562 -0.415445 -0.0104056 0.108639 0.0588222 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 975 1025 0.0496622 -3.02014 -0.0797395 0.0579268 0.0174453 0.0278119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1025 1026 5.99791 0.128957 -0.452235 0.000154361 0.111976 -0.00325675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 976 1026 0.0947565 -3.11326 -0.0268186 0.0676865 0.0050996 -0.0264718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1026 1027 6.13104 0.0557912 -0.494837 0.0269934 0.118852 0.0360486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 977 1027 0.00946112 -2.96368 -0.199493 0.0585492 -0.000676508 -0.0368704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1027 1028 6.19718 0.00188284 -0.0350639 -0.00955501 0.1273 -0.0384479 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 978 1028 -0.155117 -2.95919 -0.00336052 0.0535169 -0.00421628 -0.0149222 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1028 1029 6.04898 -0.149089 -0.43079 0.00581417 0.111957 0.070227 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 979 1029 0.0282176 -2.97821 -0.0547399 0.0734951 0.0116447 0.0268212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1029 1030 6.07776 0.213207 -0.460237 -0.00308963 0.103757 0.0544478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 980 1030 0.0162313 -2.96715 -0.219687 0.0462596 -0.00738348 0.0848479 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1030 1031 5.96802 -0.00522613 -0.457727 -0.00657492 0.116739 0.0263718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 981 1031 -0.0333699 -3.10039 -0.0891244 0.0479216 -0.00166146 -0.0687814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1031 1032 6.22543 -0.182285 -0.205716 0.0107511 0.136033 -0.0117332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 982 1032 0.0971304 -3.18518 -0.0758457 0.0667924 0.0260403 -0.01148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1032 1033 5.92141 -0.0835197 -0.488146 -0.0180658 0.111202 0.0591831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 983 1033 -0.00646451 -3.02791 -0.0224793 0.0643403 0.000866321 -0.0497889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1033 1034 5.95662 0.131831 -0.471892 0.00873253 0.117292 -0.00757291 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 984 1034 -0.0419264 -3.08604 -0.0624456 0.0489771 0.0026509 0.138746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1034 1035 6.16636 -0.0920027 -0.24997 0.00251567 0.139279 0.0717414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 985 1035 0.00219053 -3.01637 -0.369443 0.0531906 0.0167349 0.00782572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1035 1036 6.14762 -0.0920677 -0.371614 0.00537592 0.119448 -0.0338471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 986 1036 -0.0333529 -3.02544 -0.0404052 0.0611655 -0.00360411 -0.0166452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1036 1037 5.83265 0.192045 -0.309486 0.0186863 0.119958 0.0482069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 987 1037 -0.109172 -3.07893 -0.350339 0.0777384 0.00887061 -0.00527102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1037 1038 6.23999 0.0602393 -0.31331 0.0175159 0.113136 0.092817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 988 1038 0.067169 -3.02183 -0.227826 0.0491288 0.0044626 0.00317888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1038 1039 6.05938 -0.0866351 -0.498915 0.000903431 0.124568 0.083255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 989 1039 0.0719154 -3.09438 0.0893046 0.0646731 -0.00242078 -0.0329685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1039 1040 6.08795 -0.0407294 -0.313913 0.0222579 0.131683 -0.00795161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 990 1040 -0.0840367 -3.13153 -0.168456 0.0569444 0.00405093 -0.0472401 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1040 1041 6.17816 0.0865528 -0.32067 0.019615 0.119353 0.0803474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 991 1041 -0.0433143 -3.24167 0.0373899 0.0550988 -0.00967664 0.0097021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1041 1042 6.0294 0.0910283 -0.423507 -0.00225374 0.130097 0.0364678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 992 1042 -0.032313 -3.10775 -0.0399503 0.0689362 0.00230051 0.0722558 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1042 1043 6.08031 0.174105 -0.491993 0.00980618 0.125089 0.0206214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 993 1043 -0.0450076 -3.17491 -0.232357 0.0727028 -0.00269359 0.0275724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1043 1044 5.92115 -0.0679761 -0.327502 0.000636537 0.123108 0.0508335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 994 1044 0.0924275 -3.24373 -0.0502466 0.0660651 -0.00548627 0.0123695 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1044 1045 6.11748 -0.139381 -0.265619 0.0101849 0.120455 0.0145643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 995 1045 0.0513226 -3.13533 0.11357 0.0627962 -0.00631016 0.00366889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1045 1046 6.07842 0.14253 -0.318501 0.00492996 0.133787 0.0794774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 996 1046 -0.12181 -3.10575 0.0530604 0.0518041 0.0130986 -0.00827446 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1046 1047 6.25197 -0.00353764 -0.211457 0.0179816 0.132517 0.0865781 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 997 1047 0.0468625 -2.92249 -0.190572 0.0834802 0.00338914 0.011461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1047 1048 6.14763 0.0153264 -0.29719 -0.00444939 0.148724 0.0746292 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 998 1048 0.158801 -3.07445 -0.0622193 0.0474084 -0.0136047 0.00203594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1048 1049 6.26747 0.0405014 -0.23807 -0.00773223 0.113679 -0.0287896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 999 1049 0.0872764 -3.03741 -0.0709993 0.050718 0.0125808 -0.000447079 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1049 1050 6.19465 0.0756759 -0.388615 0.019697 0.118971 0.0466244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1000 1050 0.0364527 -3.06329 -0.230868 0.0416661 -0.00739203 -0.0276971 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1050 1051 5.98696 -0.187737 -0.236546 -0.0144769 0.127957 0.0295118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1001 1051 -0.017474 -3.08181 -0.291564 0.0513922 0.00458928 0.0742654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1051 1052 6.21685 0.0684367 -0.35136 0.00336755 0.12926 0.0740847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1002 1052 -0.243078 -2.88971 -0.220245 0.0526813 -0.000596104 0.0386078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1052 1053 5.82945 -0.131538 -0.359098 -0.00297047 0.117403 -0.00665205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1003 1053 0.160787 -3.1623 0.00306187 0.0726408 -0.00643517 -0.0305586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1053 1054 6.108 0.0588155 -0.362254 0.00406484 0.126868 0.117953 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1004 1054 0.0172477 -3.13248 -0.0673503 0.0714904 -0.00114416 0.0507116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1054 1055 6.03233 -0.0878955 -0.43975 0.00190804 0.113205 -0.0116043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1005 1055 0.00300913 -3.08044 -0.188548 0.0638552 0.00309908 0.0739211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1055 1056 6.09999 -0.159129 -0.463801 0.00166706 0.120228 0.0706548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1006 1056 -0.165673 -3.03641 -0.0542256 0.0707612 -0.004204 0.00653362 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1056 1057 6.14705 -0.0628454 -0.38181 0.0249239 0.133412 0.0145723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1007 1057 -0.0855289 -3.04582 -0.110658 0.0414245 0.00401868 -0.0614075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1057 1058 6.01423 0.11765 -0.295349 0.0181719 0.136629 0.0105968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1008 1058 -0.107003 -3.13213 -0.186061 0.0730631 -0.000571837 0.0284418 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1058 1059 6.27957 0.0556596 -0.31728 0.0140392 0.120582 0.0386207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1009 1059 -0.0528766 -3.05043 -0.152313 0.0479548 0.014155 -0.00409452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1059 1060 6.06892 0.092216 -0.491312 0.0164436 0.11161 0.00809407 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1010 1060 -0.124881 -2.98574 0.0201914 0.0594855 0.0108129 -0.0874743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1060 1061 6.12134 -0.0398637 -0.421935 0.00423477 0.116186 0.055598 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1011 1061 0.00912172 -3.15744 -0.0800272 0.0467645 -0.00975609 -0.0415492 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1061 1062 6.09705 0.167517 -0.460076 0.00967046 0.137158 -0.00784866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1012 1062 0.267354 -2.92757 0.107772 0.0601418 -0.00422359 -0.061707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1062 1063 6.19134 0.0928044 -0.500595 0.00885297 0.108547 0.0267062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1013 1063 -0.0857843 -3.20239 -0.0271958 0.0655521 0.0127662 0.0417003 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1063 1064 6.00901 -0.0938813 -0.257377 0.00208365 0.127158 0.0639285 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1014 1064 0.00202644 -3.35284 -0.0148275 0.0458927 -0.0145341 -0.0248595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1064 1065 6.13156 0.137904 -0.402413 -0.0168735 0.123365 0.0307077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1015 1065 -0.0557483 -3.26206 -0.0966394 0.0552693 -0.00597417 -0.00234309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1065 1066 5.8166 -0.0438778 -0.317794 -0.00066452 0.132376 -0.0671454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1016 1066 -0.0688921 -3.10151 -0.0695297 0.0453311 -0.00733452 -0.0451296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1066 1067 6.1669 0.0253997 -0.260424 0.00961925 0.114448 -0.0185609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1017 1067 -0.0400608 -2.96519 -0.0261511 0.0563196 0.014745 -0.019549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1067 1068 6.09435 0.22418 -0.244341 0.00270531 0.102024 0.0201089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1018 1068 -0.0140463 -3.22367 -0.135489 0.05285 0.00648796 0.0143812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1068 1069 6.03226 -0.0692829 -0.487135 0.00987708 0.131153 0.0231141 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1019 1069 -0.00889372 -3.11194 -0.00547035 0.0903767 0.00175286 0.0123234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1069 1070 6.21386 -0.0629814 -0.417564 -0.00114716 0.125351 0.0341042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1020 1070 0.119134 -3.10407 -0.0784602 0.0515334 0.00128572 0.0698075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1070 1071 6.16485 -0.104516 -0.265045 -0.00331851 0.133338 0.0288868 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1021 1071 0.0445396 -2.89137 -0.0238769 0.0766207 0.00710428 0.0413658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1071 1072 6.05964 -0.0833047 -0.390707 -0.00327706 0.126676 -0.0209907 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1022 1072 0.0405111 -3.13078 -0.132292 0.041961 0.00690881 -0.0723588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1072 1073 6.07877 -0.0476411 -0.302659 0.00340964 0.119548 0.00585338 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1023 1073 0.032551 -3.02805 -0.0452315 0.0581739 -0.00955866 -0.0339816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1073 1074 6.0445 -0.00762603 -0.495496 0.0190381 0.118102 0.0296039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1024 1074 -0.197006 -3.07459 -0.118671 0.0672448 0.00306581 -0.0120736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1074 1075 6.12225 0.368408 -0.592146 0.00265349 0.120887 0.0266601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1025 1075 0.0554664 -3.11073 0.109185 0.0622849 -0.0036393 0.0621697 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1075 1076 6.05755 -0.021068 -0.485975 -0.000560902 0.126397 -0.0136746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1026 1076 -0.0760813 -3.03559 -0.119675 0.0685157 0.00755513 0.0119111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1076 1077 6.31811 0.0947494 -0.306213 0.00184166 0.111588 0.00296177 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1027 1077 -0.166508 -3.09051 -0.0148712 0.0595456 -0.0121267 0.050153 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1077 1078 6.15222 0.112098 -0.523338 0.0125899 0.115575 0.0375225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1028 1078 -0.0133315 -3.05111 -0.206278 0.0772941 0.0116131 -0.0555171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1078 1079 6.17755 0.12819 -0.189973 0.000843511 0.116096 0.00879123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1029 1079 -0.0219378 -3.04446 -0.102629 0.0636134 0.00783117 -0.00159266 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1079 1080 5.95207 0.0939997 -0.368303 -0.00750328 0.121706 0.100502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1030 1080 -0.0221662 -3.00588 0.0265332 0.0695503 0.0132984 -0.0348094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1080 1081 6.05785 0.0426549 -0.326202 -0.00984398 0.118128 -0.00632891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1031 1081 -0.143291 -3.18771 -0.242497 0.056048 0.00119822 0.0461257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1081 1082 6.20024 -0.206181 -0.499325 -0.00457969 0.119587 -0.00198287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1032 1082 -0.0884373 -3.14039 -0.00446338 0.0566139 0.000695243 -0.0213606 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1082 1083 6.24174 0.152607 -0.390138 -0.00802617 0.122366 0.0956332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1033 1083 0.0597932 -2.98147 -0.125644 0.0516008 0.0118111 -0.00173589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1083 1084 6.06745 0.08815 -0.402558 0.0034183 0.0941492 0.0322419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1034 1084 0.0236397 -3.03106 -0.303444 0.0619699 0.00625717 -0.0188944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1084 1085 6.18171 0.17784 -0.444196 -0.00483133 0.131197 0.0321817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1035 1085 0.063638 -3.10132 -0.0102661 0.0604996 0.00226534 -0.0351615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1085 1086 6.2606 0.147161 -0.343331 0.0120022 0.121572 0.0256834 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1036 1086 -0.0182845 -3.16163 -0.0492317 0.0627212 0.00763229 -0.0292377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1086 1087 6.00922 0.0565105 -0.400682 -0.0164795 0.118815 0.0544954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1037 1087 -0.0705535 -2.90117 0.0136399 0.0528724 -0.00757374 0.000569421 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1087 1088 6.01097 0.00313886 -0.305999 0.0211516 0.126623 -0.0111902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1038 1088 0.0791077 -2.93616 -0.0308763 0.0743151 -0.0165291 -0.0371178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1088 1089 6.16575 -0.171466 -0.550936 0.00719995 0.111632 0.0238555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1039 1089 -0.103707 -3.04427 -0.113873 0.0703263 0.00028678 -0.0362127 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1089 1090 6.21322 -0.00849605 -0.355218 0.00706184 0.117116 -0.0180281 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1040 1090 -0.0173157 -3.0989 -0.157895 0.0567648 -0.0113957 -0.00613244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1090 1091 6.26951 -0.0628921 -0.299126 0.0140689 0.116714 0.0338002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1041 1091 -0.0740555 -3.10747 -0.126066 0.0525692 0.0115862 -0.0223028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1091 1092 6.28048 0.148534 -0.239882 0.00610426 0.113751 -0.000840489 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1042 1092 0.104559 -3.06209 0.111713 0.0838355 -0.00447292 0.0242562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1092 1093 6.02017 0.0976359 -0.377826 -0.00156448 0.11978 0.0440217 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1043 1093 -0.0955397 -3.19568 -0.0795252 0.0785121 0.00964025 0.0377329 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1093 1094 5.97986 0.0143573 -0.433581 0.0079164 0.137914 0.109198 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1044 1094 -0.0650137 -3.05473 -0.0704064 0.0633922 -0.00593448 -0.0496577 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1094 1095 6.15037 0.136784 -0.300618 -0.008954 0.111454 0.0658604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1045 1095 0.129152 -3.19416 -0.265199 0.0662617 -0.00910922 0.0177384 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1095 1096 6.17229 0.0309696 -0.408303 -0.00419139 0.125479 0.030393 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1046 1096 -0.148981 -3.08871 -0.0483914 0.0850839 0.0186987 -0.023607 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1096 1097 6.2309 -0.140674 -0.511553 -0.00871321 0.136884 -0.0163486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1047 1097 0.00992533 -3.1456 -0.00346286 0.0513165 0.00933384 0.0524112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1097 1098 6.00354 -0.119569 -0.219026 -0.0105782 0.118753 -0.0395874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1048 1098 0.0585119 -3.11981 -0.170435 0.0542401 -0.00340165 -0.0108663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1098 1099 5.96052 -0.00606136 -0.365239 -0.0100354 0.135354 0.00402471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1049 1099 -0.0788919 -3.01608 -0.082015 0.0652414 0.00383805 0.0108272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1099 1100 6.25167 -0.011181 -0.436577 0.0038566 0.130473 0.0502447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1050 1100 0.0846936 -2.84773 -0.0178092 0.0715169 -0.0159994 -0.079684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1100 1101 6.28251 0.060292 -0.286956 0.0220496 0.113477 -0.0131819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1051 1101 0.0292993 -3.19096 -0.0247129 0.0515801 0.0113776 -0.0118587 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1101 1102 6.10196 -0.10118 -0.358981 -0.0187578 0.118576 0.0929051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1052 1102 0.0542849 -2.80355 -0.005091 0.0498093 -0.0072343 -0.0367911 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1102 1103 6.21236 -0.047097 -0.391111 -0.00644082 0.111769 0.02081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1053 1103 0.0795033 -2.99578 -0.145515 0.0531904 -0.00182233 0.0220957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1103 1104 6.14272 0.210213 -0.293225 -0.00246537 0.140693 0.003642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1054 1104 0.0221612 -3.00317 -0.0829812 0.0481857 -0.00387521 0.0011354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1104 1105 6.20722 -0.0358492 -0.386077 -0.000974491 0.124548 -0.0195871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1055 1105 0.0211163 -2.96602 -0.135401 0.0634003 0.0173043 -0.0299232 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1105 1106 6.21492 -0.0181741 -0.468509 -0.00719059 0.112028 -0.0239765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1056 1106 0.160901 -3.04948 -0.262677 0.0547535 0.00324715 0.0382597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1106 1107 6.24165 -0.0238348 -0.372464 -0.00279274 0.119885 0.00466365 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1057 1107 -0.00241801 -2.91995 0.0207867 0.0677379 0.0032765 -0.0156418 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1107 1108 6.21019 0.0794247 -0.351371 -0.00242369 0.107898 -0.00418186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1058 1108 0.0591185 -2.98281 -0.0250635 0.0695111 0.00564023 -0.0877169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1108 1109 5.93823 -0.00466762 -0.501215 -0.0186952 0.120498 0.0393097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1059 1109 0.0638423 -3.14503 0.0594812 0.0624415 0.00418805 -0.00882451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1109 1110 6.17681 -0.0820368 -0.49288 -0.000916301 0.133056 -0.0155687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1060 1110 0.0901483 -3.19161 -0.217534 0.0491502 0.00153027 -0.0201118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1110 1111 6.29545 0.0712638 -0.411115 0.0377754 0.113678 0.018377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1061 1111 0.0732734 -2.94313 -0.196864 0.0625231 0.0154915 -0.050175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1111 1112 6.06504 0.0138377 -0.485242 0.00170041 0.143767 0.0598643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1062 1112 -0.043966 -3.08859 0.0557771 0.0736201 -0.000847484 0.00699583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1112 1113 6.17025 0.0210747 -0.366295 0.00860459 0.126354 0.0615852 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1063 1113 -0.0642777 -3.2544 -0.212404 0.0578576 0.00726952 0.0744094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1113 1114 6.1543 0.16621 -0.242877 0.00117569 0.118924 -0.0275076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1064 1114 0.032159 -3.17742 -0.0284652 0.0696175 -0.00245622 -0.0412676 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1114 1115 6.22605 -0.095196 -0.470942 0.0170335 0.130495 0.00650548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1065 1115 -0.02792 -3.15506 -0.165897 0.0563792 -0.0107167 0.0487689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1115 1116 6.01358 0.0878971 -0.424228 -0.0166978 0.126216 0.0107246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1066 1116 0.104795 -3.08425 -0.204007 0.0449939 0.0341304 -0.0514564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1116 1117 6.16229 0.22305 -0.31995 -0.00150606 0.131846 0.0413941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1067 1117 -0.158638 -3.09852 -0.0296164 0.0662336 -0.0145423 -0.0504572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1117 1118 6.16712 0.149935 -0.312976 -0.0113039 0.132253 0.0558755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1068 1118 -0.111918 -3.16048 -0.105541 0.05971 -0.0114813 0.0145301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1118 1119 6.34942 0.103401 -0.406601 0.00389863 0.11997 0.0687055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1069 1119 0.0454455 -3.04932 -0.090615 0.0664826 0.00343029 -0.0935179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1119 1120 6.08571 0.0943472 -0.265715 0.0112952 0.122013 -0.00596728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1070 1120 0.0289694 -3.03173 -0.20876 0.0647357 0.00606774 0.086683 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1120 1121 6.00073 -0.0804251 -0.178711 -0.0170954 0.120458 0.124963 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1071 1121 -0.159112 -3.22867 -0.121974 0.0625469 -0.000263131 -0.0143031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1121 1122 6.06097 -0.0730442 -0.528845 -0.00254867 0.13277 0.0377239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1072 1122 -0.158343 -2.99913 -0.134118 0.044007 -0.00180094 0.0133859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1122 1123 6.27635 0.0225442 -0.330146 0.0168033 0.129204 0.015818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1073 1123 -0.0339182 -3.00933 -0.117717 0.056271 0.00974681 0.0625455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1123 1124 6.20388 -0.123736 -0.320419 0.0250547 0.128394 -0.00816691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1074 1124 -0.115012 -3.16768 -0.07791 0.0617937 0.00895912 0.0258813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1124 1125 6.19488 0.0489028 -0.40507 -0.0220558 0.141578 0.0362234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1075 1125 -0.0255793 -3.22819 -0.117767 0.0580595 0.00167263 0.0105117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1125 1126 6.34134 0.0211631 -0.488231 -0.0132564 0.128261 0.0253446 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1076 1126 -0.00893484 -2.96332 0.026229 0.0616841 0.00529419 0.0148742 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1126 1127 6.27149 -0.00500805 -0.2324 0.00735068 0.118331 0.0933392 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1077 1127 0.105186 -2.96758 -0.0759412 0.0640446 0.00878758 0.0212397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1127 1128 6.05908 0.0801083 -0.328133 -0.00762452 0.131783 0.0517594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1078 1128 -0.0191909 -2.93195 -0.296513 0.0614619 0.00854899 -0.0013414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1128 1129 6.06045 0.0970754 -0.257414 0.0121556 0.113352 0.0185225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1079 1129 -0.00207403 -3.10804 -0.284215 0.0736289 0.00112952 0.00848881 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1129 1130 6.19519 0.023938 -0.465982 0.00604271 0.12612 -0.00431508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1080 1130 0.0287871 -3.02091 -0.0798066 0.0581025 0.003915 0.0151224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1130 1131 6.2437 0.00818919 -0.282187 5.06439e-05 0.120334 0.0279945 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1081 1131 -0.01036 -2.95319 -0.267749 0.0665137 0.00313463 0.0353665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1131 1132 6.17458 -0.157841 -0.456966 0.01145 0.108147 0.0939827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1082 1132 0.0065057 -3.04553 0.0311802 0.079447 -0.0111594 0.00784671 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1132 1133 5.97333 0.128973 -0.364609 0.00599042 0.137116 0.0531381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1083 1133 -0.0435569 -3.0335 0.0190937 0.0594872 -0.00491381 0.00369368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1133 1134 6.29684 0.00526453 -0.371747 0.0131013 0.127585 0.00362231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1084 1134 -0.0712779 -3.1773 -0.0214954 0.0468121 -0.00589329 0.000670697 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1134 1135 6.33641 -0.158932 -0.206777 -0.00091457 0.132517 0.108933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1085 1135 0.133739 -3.27775 -0.174547 0.0531023 -0.00393874 -0.0311202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1135 1136 6.15569 0.0989295 -0.218852 0.000485009 0.124438 -0.0289829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1086 1136 0.16106 -3.26226 0.0412023 0.0550875 -0.00152333 -0.0633918 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1136 1137 6.19086 -0.290265 -0.400818 0.0232141 0.125976 0.00145055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1087 1137 0.265508 -3.09031 -0.147831 0.069088 -0.0133488 -0.0353985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1137 1138 6.10112 0.125422 -0.421247 0.00711764 0.146202 0.0224651 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1088 1138 0.117624 -3.10572 -0.107534 0.0481438 0.0184414 0.0138854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1138 1139 6.28191 -0.137981 -0.375466 -0.000363153 0.124761 0.0493158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1089 1139 0.0900041 -3.01079 0.0336033 0.0672826 -0.00538783 -0.0503312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1139 1140 6.18316 0.0500493 -0.324958 -0.0112912 0.11931 0.0454003 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1090 1140 -0.0123915 -2.98739 -0.0590395 0.0379968 -0.00716509 0.0111404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1140 1141 6.08349 0.136814 -0.497156 0.0011048 0.119299 0.0229301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1091 1141 -0.000347532 -2.9763 -0.070558 0.0715813 -0.00247412 0.0476235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1141 1142 6.155 0.0205256 -0.330061 -0.00213636 0.127456 -0.0252327 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1092 1142 0.0170841 -3.03 -0.00536934 0.0591185 -0.00452181 0.017787 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1142 1143 6.28604 0.025346 -0.421007 -0.0162974 0.121919 0.112466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1093 1143 0.0794835 -3.01918 -0.0688588 0.0578745 0.0134547 -0.0346294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1143 1144 6.26062 0.0205431 -0.677658 0.00428368 0.126012 -0.0385355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1094 1144 0.108576 -3.19047 -0.156856 0.0494548 -0.0163793 0.0102638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1144 1145 6.24365 -0.0324574 -0.262743 -0.0049103 0.127112 0.00951213 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1095 1145 -0.0581562 -2.90244 0.012481 0.0434028 0.00263195 -0.0287951 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1145 1146 6.20747 -0.0339152 -0.392379 -0.000234102 0.118708 -0.0293292 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1096 1146 0.115824 -3.19631 -0.0213371 0.0421217 -0.00522808 -0.00975261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1146 1147 6.17383 -0.0545486 -0.330068 0.00652005 0.105633 0.00926072 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1097 1147 0.231058 -2.97191 -0.0633144 0.0554662 0.0120193 0.0251226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1147 1148 6.19562 -0.0312521 -0.508851 -0.00400235 0.127798 0.0500741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1098 1148 0.0906347 -3.0823 -0.0654172 0.0671222 -0.00576249 -0.0420048 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1148 1149 6.2634 -0.0914435 -0.49194 -0.000185698 0.126647 0.0596173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1099 1149 -0.0709827 -2.99242 -0.100519 0.0522911 0.0107663 -0.0665954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1149 1150 6.20794 0.00706315 -0.366789 0.00491578 0.116074 0.0396255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1100 1150 -0.217694 -3.0471 -0.241971 0.0595434 -0.00299944 0.0307673 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1150 1151 6.3853 0.0766322 -0.371624 -0.004531 0.115342 0.0513507 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1101 1151 -0.133997 -3.18039 -0.298347 0.0585356 0.00161758 -0.045421 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1151 1152 6.36965 0.00317052 -0.340421 0.00713771 0.131289 0.00930946 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1102 1152 -0.120782 -3.10771 -0.132829 0.0542114 -0.00147593 -0.0292094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1152 1153 6.25122 0.119082 -0.489597 0.0134678 0.140105 0.0241665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1103 1153 0.0651546 -3.08526 0.0333165 0.053678 -0.00110048 0.0495263 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1153 1154 6.38591 0.0431815 -0.249205 0.021483 0.128554 0.0183652 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1104 1154 -0.13073 -3.10417 -0.0207559 0.0570843 -0.0033487 0.0265582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1154 1155 6.22207 -0.126374 -0.551195 0.00632646 0.140176 0.038975 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1105 1155 0.000154459 -3.19468 -0.219612 0.0717736 -0.00997412 -0.0318834 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1155 1156 6.24973 0.0357949 -0.346418 0.00727606 0.107899 -0.026173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1106 1156 -0.0526983 -3.14509 -0.0514529 0.054524 -0.00459064 0.0115624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1156 1157 6.28222 0.0285707 -0.466702 -0.00109388 0.119678 -0.00257011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1107 1157 0.021276 -3.03634 0.0578121 0.0690819 0.00523775 0.0187549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1157 1158 6.02883 -0.0220242 -0.272902 0.0104637 0.134122 0.0219901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1108 1158 -0.034091 -3.05927 -0.0180954 0.0409502 0.00491874 0.0411946 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1158 1159 6.25064 0.0633914 -0.346644 0.00177177 0.139352 -0.0448145 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1109 1159 0.0976821 -2.96001 -0.091843 0.0665695 0.00910561 -0.0377344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1159 1160 6.22868 -0.0403906 -0.411585 -0.0147735 0.121385 0.054934 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1110 1160 -0.0205294 -3.13789 0.114621 0.0592746 -0.000284181 -0.0480345 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1160 1161 6.0705 -0.0717024 -0.375346 -0.00132932 0.104671 -0.0268544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1111 1161 0.091867 -2.94575 -0.372363 0.0433479 -0.0122475 0.0396798 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1161 1162 6.29081 -0.069955 -0.449193 0.00155694 0.118082 -0.0249379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1112 1162 0.162605 -3.15417 -0.179408 0.0475352 -0.0104949 -0.0208354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1162 1163 6.14631 -0.0120103 -0.47997 0.0150382 0.138681 0.0572245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1113 1163 0.0157016 -3.09259 0.0738619 0.0590827 0.00998473 0.0376913 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1163 1164 6.22764 -3.65271e-05 -0.550282 -0.00710382 0.137956 0.00092898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1114 1164 0.0998559 -3.04731 -0.27322 0.0331142 0.0156435 -0.0522191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1164 1165 6.2428 -0.0654257 -0.421962 -0.0123629 0.121843 0.0232916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1115 1165 0.0358571 -3.03004 -0.157249 0.0444812 -0.00708214 0.0302565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1165 1166 6.2161 -0.155607 -0.382093 -0.0012638 0.142177 -0.0035467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1116 1166 0.0257678 -3.09835 -0.0826716 0.0563032 -0.00457881 -0.0166752 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1166 1167 6.15893 -0.0574 -0.40431 -0.00913287 0.127124 -0.0243037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1117 1167 -0.0353658 -3.05448 -0.151444 0.0510831 0.0157569 -0.0345797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1167 1168 6.05773 -0.168017 -0.413493 0.00471689 0.108466 -0.0371183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1118 1168 0.0758524 -2.9502 -0.244958 0.0407956 -0.00395624 -0.0118775 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1168 1169 6.28452 0.000196641 -0.238558 -0.00781353 0.11138 0.00850205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1119 1169 -0.00501287 -2.75295 -0.2332 0.057217 0.00624272 -0.039381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1169 1170 6.58885 -0.295857 -0.378598 0.0200237 0.13312 0.0413619 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1120 1170 -0.128876 -3.07645 -0.0519347 0.0510374 0.0017215 0.00370018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1170 1171 6.3906 -0.0581844 -0.399454 0.0127656 0.126514 -0.00685001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1121 1171 0.175866 -3.02884 0.142398 0.0517692 0.00542184 -0.0490466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1171 1172 6.15073 0.102358 -0.410398 -0.000684918 0.121311 -0.0298668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1122 1172 -0.0466014 -3.01999 -0.124203 0.0654775 0.0162323 -0.0749021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1172 1173 6.16127 -0.146017 -0.499986 0.0109923 0.117013 -0.00513184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1123 1173 0.0476419 -2.8824 -0.029238 0.0549883 -0.0191383 0.0143575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1173 1174 6.22705 0.0784242 -0.488882 0.00798086 0.122065 0.0512638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1124 1174 0.113472 -3.02205 0.0360127 0.0622727 0.00223291 0.0606059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1174 1175 6.14964 0.0735096 -0.220936 0.00974938 0.111929 -0.0222428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1125 1175 0.164588 -2.921 -0.0232025 0.0535143 -0.0112863 -0.0134635 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1175 1176 6.38982 0.0183722 -0.435402 0.00607739 0.126548 0.04336 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1126 1176 -0.067375 -2.962 -0.0608439 0.0350147 -0.00210198 -0.027105 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1176 1177 6.52476 0.0590775 -0.171495 0.0116967 0.139899 -0.0214495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1127 1177 0.111208 -3.27 -0.00309067 0.0708333 0.00424104 -0.0298877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1177 1178 6.22519 0.00334483 -0.524122 -0.022457 0.118181 0.00798823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1128 1178 0.0696515 -2.92745 -0.232218 0.0596541 -0.0212403 0.0446132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1178 1179 5.98156 -0.188664 -0.281838 0.0214618 0.119389 -0.0218256 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1129 1179 -0.0872156 -3.00687 -0.242848 0.0509584 -0.00114863 0.00146875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1179 1180 6.12504 0.0176742 -0.511712 0.0110223 0.142761 0.0227157 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1130 1180 0.135662 -2.98974 -0.166074 0.0676836 -0.00142452 0.0746129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1180 1181 6.10667 -0.0374723 -0.241947 0.00594995 0.118198 -0.00308398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1131 1181 0.0126317 -3.00361 0.0692822 0.0413905 -0.0175662 0.0494715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1181 1182 6.35836 -0.0447324 -0.440683 -0.00323157 0.123551 -0.0531008 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1132 1182 0.087144 -3.00094 0.00257029 0.0414581 0.00552438 -0.00460815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1182 1183 6.31991 0.0903055 -0.108557 -0.0037222 0.129444 -0.0201744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1133 1183 0.0226019 -3.04873 -0.299544 0.0739847 0.00325843 0.0105872 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1183 1184 6.3725 0.181198 -0.36497 0.00450368 0.115141 -0.03112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1134 1184 -0.140581 -3.05227 0.0454369 0.0682553 -0.00626141 -0.0614491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1184 1185 6.1966 0.201242 -0.518595 0.00328037 0.120757 -0.0282697 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1135 1185 0.0316004 -2.98084 -0.193694 0.0548329 -0.00660026 0.00418652 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1185 1186 6.23127 -0.0799887 -0.438554 0.0155449 0.114729 0.0382819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1136 1186 0.0678883 -3.03565 -0.13131 0.047952 -0.00323373 0.0268506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1186 1187 6.14199 -0.0961718 -0.446934 0.0105936 0.11905 0.0168399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1137 1187 -0.0966377 -3.0895 -0.144126 0.0667826 -0.00180578 -0.0124919 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1187 1188 6.20196 -0.128109 -0.216675 0.00196043 0.111597 -0.00616853 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1138 1188 -0.191259 -3.12618 -0.287744 0.0659891 0.00926523 -0.0576857 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1188 1189 6.46824 -0.0118163 -0.309085 -0.00168811 0.119072 -0.0511947 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1139 1189 0.120915 -2.91691 -0.0350008 0.0638543 0.0088096 -0.000771982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1189 1190 6.21507 -0.071789 -0.293747 -0.00148837 0.125161 0.0211515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1140 1190 0.11299 -3.07753 -0.0105921 0.0485608 0.00893849 0.115698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1190 1191 6.3815 0.011158 -0.191186 0.00603326 0.12735 -0.0131462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1141 1191 0.0181987 -3.08558 0.044592 0.0799863 0.00623674 -0.0131192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1191 1192 6.14022 -0.0361197 -0.317708 0.00276229 0.123296 0.0153926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1142 1192 0.0601452 -3.00042 0.150736 0.0525887 -0.00807706 -0.0304554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1192 1193 6.21883 0.0924226 -0.388814 -0.00105321 0.112256 -0.0225528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1143 1193 0.0722748 -3.04419 -0.145982 0.0479098 -0.00529585 -0.00320511 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1193 1194 6.2813 -0.0791019 -0.302846 -0.00892097 0.113642 0.0173518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1144 1194 0.0237231 -3.05141 -0.215397 0.0497263 -0.00440838 0.0326057 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1194 1195 6.23938 -0.0764255 -0.319361 -0.000338102 0.130198 0.0417771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1145 1195 0.028394 -3.23374 -0.246211 0.0595846 -0.0149741 0.0962783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1195 1196 6.25058 -0.199206 -0.369816 -0.00540097 0.130799 0.0717416 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1146 1196 0.223023 -3.01226 0.118686 0.0764673 -0.00628123 -0.0159071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1196 1197 6.26815 -0.176915 -0.460459 -0.00143768 0.13026 0.0716267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1147 1197 0.0295023 -2.99339 -0.110198 0.0644165 -0.0168296 0.0253937 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1197 1198 6.15318 0.00500709 -0.408395 0.0197267 0.120722 0.00674476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1148 1198 -0.0636762 -3.05069 0.0395257 0.0639131 -0.0143176 -0.0942336 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1198 1199 6.24575 0.052209 -0.510219 0.0183878 0.129016 0.027767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1149 1199 0.0128021 -3.04374 -0.148374 0.0670007 0.00461108 -0.0906184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1199 1200 6.26576 -0.0804633 -0.345597 0.0028857 0.145858 -0.0348468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1150 1200 0.0837259 -3.23437 -0.161845 0.047648 -0.00239266 -0.0217948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1200 1201 6.2058 0.00716553 -0.407173 -0.0131567 0.115069 -0.0158414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1151 1201 -0.00140064 -3.01718 -0.0967987 0.0579447 -0.00919273 0.00184034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1201 1202 6.21133 -0.199235 -0.226973 -0.0023761 0.142525 -0.0835644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1152 1202 0.0271031 -3.06013 0.00867464 0.0782588 0.00743101 -0.000629788 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1202 1203 6.21438 0.0122662 -0.380782 0.00530027 0.12915 0.00691982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1153 1203 0.0217358 -2.96145 -0.106814 0.0601789 0.0153562 0.00271351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1203 1204 6.21195 -0.0819153 -0.444214 0.0157669 0.116926 -0.034367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1154 1204 0.0270931 -2.91063 0.0451615 0.0767124 -0.00402041 -0.014525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1204 1205 6.16872 -0.12651 -0.42569 -0.0111502 0.126023 0.0817227 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1155 1205 0.0800109 -2.89701 -0.183108 0.0709816 -0.0114715 0.0727754 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1205 1206 6.21633 0.111715 -0.359401 0.00639357 0.116679 -0.0216481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1156 1206 -0.0248295 -3.01964 -0.0582447 0.0464199 -0.00723046 -0.0306108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1206 1207 6.32873 0.109302 -0.395666 0.0108302 0.106908 -0.0123529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1157 1207 0.113841 -3.10738 -0.114207 0.0582474 0.0112536 -0.0138955 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1207 1208 6.29206 -0.212852 -0.281398 0.00323675 0.10375 -0.0425858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1158 1208 0.038877 -2.98515 -0.256207 0.0707347 -0.0252301 0.0407279 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1208 1209 6.45017 -0.034892 -0.593871 -0.00506067 0.139349 -0.00049116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1159 1209 0.0217916 -3.14152 0.148494 0.0447892 -0.00411327 0.0538952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1209 1210 6.32709 -0.133107 -0.460409 -0.00244919 0.130486 -0.00112364 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1160 1210 0.043156 -3.04312 -0.0215019 0.074753 -0.00227475 -0.0331218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1210 1211 6.21435 -0.0563002 -0.193585 -0.0104876 0.118732 0.0250732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1161 1211 -0.160744 -2.9101 -0.152645 0.054119 -0.00484394 -0.0636794 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1211 1212 6.40085 -0.126828 -0.394095 0.00722234 0.127954 -0.0237984 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1162 1212 -0.0771665 -2.93696 -0.078103 0.0605476 -0.00554644 -0.000576041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1212 1213 6.29461 -0.0960924 -0.113984 -0.00180288 0.135772 0.0110639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1163 1213 0.0374038 -2.82418 -0.000826757 0.0613369 -0.0078006 0.00385694 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1213 1214 6.03313 0.0836024 -0.478308 0.00181283 0.119755 -0.00353573 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1164 1214 -0.230059 -3.00784 7.51296e-05 0.0581886 0.00392659 -0.0563753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1214 1215 6.36117 -0.0184892 -0.427555 0.00482647 0.106701 0.0017714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1165 1215 0.033549 -2.82354 -0.0558731 0.0669523 0.00443503 0.0254013 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1215 1216 6.19065 -0.130134 -0.622243 0.012899 0.127552 -0.0340309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1166 1216 -0.00977411 -3.07625 -0.188491 0.0722305 0.018588 -0.0409259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1216 1217 6.19733 -0.102603 -0.313682 0.00579556 0.13399 0.0234923 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1167 1217 0.0216891 -2.93679 -0.0716218 0.0786563 0.00765587 -0.023588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1217 1218 6.17407 -0.126553 -0.298197 0.000179622 0.133641 -0.0346398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1168 1218 0.0706638 -3.06932 -0.137611 0.061247 -0.00304523 -0.0114267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1218 1219 6.31511 -0.126804 -0.414715 0.00180041 0.132426 0.0355416 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1169 1219 0.156672 -3.09943 -0.0141817 0.0699514 0.0115585 -0.031943 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1219 1220 6.39377 -0.288752 -0.304232 -0.00787355 0.120574 -0.0622604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1170 1220 0.00982461 -2.92941 -0.0510959 0.0571931 -0.00887197 0.01336 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1220 1221 6.39289 -0.0663798 -0.305302 -0.0169902 0.136597 -0.0275191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1171 1221 0.0582776 -3.09627 -0.169073 0.0682808 -0.00669876 -0.101574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1221 1222 6.28966 -0.00119897 -0.270048 0.0162912 0.125255 -0.0405335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1172 1222 0.104497 -3.0923 -0.0486395 0.0586285 -0.0102709 0.0263689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1222 1223 6.17122 0.0132848 -0.391997 -0.00234707 0.116056 0.00404941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1173 1223 0.0400036 -3.0597 -0.00726114 0.0701801 0.00448127 -0.0461388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1223 1224 6.29206 -0.0198421 -0.189114 0.00439959 0.120182 0.026061 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1174 1224 0.0599887 -3.19008 0.0384103 0.0601458 -0.0156649 -0.0061596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1224 1225 6.28551 0.118613 -0.317331 0.0056966 0.120361 0.00823602 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1175 1225 0.0836869 -2.95782 -0.264283 0.0390534 0.00488864 -0.0085675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1225 1226 6.35893 0.0761398 -0.14686 -0.00129582 0.113948 0.0210617 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1176 1226 0.0365858 -2.99531 -0.0278675 0.0464319 -0.00479809 0.0340089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1226 1227 6.29498 -0.0588479 -0.4579 -0.0158094 0.111851 0.00251321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1177 1227 -0.0305253 -3.07889 -0.18549 0.071092 -0.00919756 -0.0354398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1227 1228 6.03972 -0.00553889 -0.459341 0.0131592 0.135019 -0.00939779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1178 1228 -0.0319369 -3.01015 -0.177579 0.0662978 -0.00281894 0.0492645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1228 1229 6.05532 -0.0844357 -0.300037 0.00958365 0.130753 -0.0491874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1179 1229 -0.0523832 -2.98778 -0.239663 0.0627745 -0.00669453 -0.0837139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1229 1230 6.3632 -0.0759518 -0.388078 -0.0199902 0.113556 0.0185039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1180 1230 -0.0983646 -2.9026 0.12701 0.065465 5.19111e-05 0.0157345 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1230 1231 6.22883 0.0639962 -0.388497 0.00793759 0.124069 -0.0269226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1181 1231 -0.00253273 -3.13452 -0.205119 0.0540255 0.0107875 0.0663391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1231 1232 6.15602 0.048115 -0.397565 -0.0170432 0.118064 0.00999427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1182 1232 -0.123887 -3.1491 0.0293308 0.0629327 0.0131407 0.000552936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1232 1233 6.17968 -0.0168155 -0.406422 0.0178193 0.121558 -0.0298427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1183 1233 0.0530003 -3.14802 -0.0660283 0.057909 0.0019715 0.0587453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1233 1234 6.31784 0.019186 -0.279467 0.00599333 0.128451 -0.0227361 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1184 1234 -0.0920964 -3.03163 -0.0502112 0.068293 -0.0227271 0.0301324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1234 1235 6.18515 -0.0802051 -0.231245 -0.00572597 0.148774 -0.0115332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1185 1235 0.150772 -3.17657 0.0119297 0.0588427 -0.0153285 -0.0323586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1235 1236 6.18542 -0.182362 -0.404059 0.00192593 0.146087 -0.00738 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1186 1236 -0.0118933 -3.07448 -0.216914 0.052578 0.00304382 -0.0242472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1236 1237 6.22582 -0.0130983 -0.631928 -0.000336692 0.130282 0.0108888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1187 1237 0.107145 -3.11149 0.0407158 0.0719982 0.0120477 -0.0186877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1237 1238 6.22747 0.0813933 -0.36263 0.0124855 0.133053 -0.00511183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1188 1238 0.0785587 -3.07704 -0.0334033 0.0596239 0.0272998 -0.0548149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1238 1239 6.13728 -0.245842 -0.469497 -0.00427778 0.118902 0.0466426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1189 1239 0.057874 -3.01272 -0.0126197 0.0757248 -0.0150501 0.063832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1239 1240 6.43442 0.0421073 -0.445315 -0.00501035 0.122143 -0.0453351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1190 1240 0.00429653 -3.0416 -0.15987 0.0619307 -0.000361436 0.0533429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1240 1241 6.22238 0.00147875 -0.419885 0.000407927 0.106906 0.0127659 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1191 1241 -0.153794 -3.16575 -0.134849 0.0559876 0.0122063 0.0450317 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1241 1242 6.3993 0.0521169 -0.274175 0.00375655 0.118329 -0.0649456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1192 1242 -0.0535129 -3.01837 -0.0370581 0.0476833 -0.0033379 0.0754286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1242 1243 6.33238 0.0638039 -0.303752 -0.00148295 0.119543 0.053673 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1193 1243 -0.0321359 -3.04146 -0.171921 0.0740651 -0.0150853 -0.0420449 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1243 1244 6.2392 -0.35763 -0.230175 0.0217479 0.138351 -0.0987499 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1194 1244 0.213947 -3.15164 -0.0665557 0.0535713 0.00134492 0.0123857 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1244 1245 6.19106 -0.00378847 -0.528655 0.0127252 0.134084 0.0853756 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1195 1245 -0.0477612 -2.98379 -0.224037 0.0444271 0.00274965 0.0276601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1245 1246 6.29399 0.0514532 -0.393738 0.00260047 0.132047 -0.0760102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1196 1246 -0.0851834 -3.07162 -0.135769 0.0686547 -0.00424456 -0.0428751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1246 1247 6.33133 -0.108199 -0.230448 -0.00960094 0.117035 -0.0188169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1197 1247 -0.196691 -3.20303 -0.125991 0.0617405 0.00402568 -0.00692368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1247 1248 6.18836 -0.026359 -0.419592 0.00541732 0.140542 -0.0312918 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1198 1248 -0.150325 -2.90899 0.0488011 0.0556008 -0.000482173 0.0402078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1248 1249 6.25769 -0.0970828 -0.322165 0.0124265 0.141384 -0.0427235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1199 1249 0.0185902 -3.19486 -0.0656763 0.0770903 -0.0181362 -0.00148543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1249 1250 6.2899 -0.116221 -0.353315 0.00520953 0.122698 -0.0454123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1200 1250 0.0357137 -3.20493 -0.0478291 0.0582689 -0.000781128 -0.0243026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1250 1251 6.12708 -0.158827 -0.517068 0.0107317 0.131897 0.0286125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1201 1251 -0.200729 -2.95837 -0.0138394 0.0573847 -0.00546167 -0.00537273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1251 1252 6.27115 -0.0676382 -0.360185 0.00527464 0.127017 0.00330841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1202 1252 0.0326011 -3.11654 -0.0152223 0.0602674 0.00980507 -0.0372124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1252 1253 6.1248 -0.147014 -0.489388 0.0091367 0.119432 -0.00173097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1203 1253 -0.0285094 -3.12084 -0.182164 0.0704937 -0.014826 0.0258192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1253 1254 6.53703 0.0602544 -0.456811 0.00528208 0.126167 -0.00356809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1204 1254 0.0110536 -3.01092 0.027117 0.0572131 -0.0150525 -0.0461112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1254 1255 6.33501 0.016488 -0.398003 -0.00296916 0.114376 -0.0320971 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1205 1255 0.0674776 -3.06268 -0.0976775 0.0645557 0.00949903 0.0161793 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1255 1256 6.14413 -0.18662 -0.551819 -0.00269528 0.124437 0.0352449 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1206 1256 -0.0196083 -2.9626 -0.153325 0.0729159 0.00158927 0.0229019 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1256 1257 6.55898 0.051227 -0.377206 0.0173017 0.120196 -0.0369111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1207 1257 0.0859312 -3.26951 -0.0912336 0.0747766 0.00101945 -0.0106442 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1257 1258 6.21983 -0.122294 -0.398302 0.00658924 0.127051 0.039338 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1208 1258 -0.0147072 -3.12703 -0.0531484 0.0540965 0.0211755 0.0722214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1258 1259 6.45607 0.0608365 -0.660542 -0.0158525 0.138364 -0.0706216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1209 1259 -0.014849 -3.08558 -0.149916 0.07215 0.00711505 -0.0512541 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1259 1260 6.20101 -0.203207 -0.363907 0.00472023 0.132387 -0.0243728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1210 1260 0.0938793 -3.08888 -0.0800416 0.060821 0.0106298 0.0195448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1260 1261 6.35532 0.104986 -0.260977 -0.00445762 0.133627 -0.0307316 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1211 1261 0.0756502 -3.09672 0.0478999 0.0602605 0.0178682 -0.032861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1261 1262 6.3133 -0.0197678 -0.442567 -0.00698201 0.126456 -0.0268019 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1212 1262 -0.0436352 -3.17113 -0.0700736 0.0397673 0.00439854 0.00182757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1262 1263 6.20818 -0.255142 -0.269164 -0.000876024 0.104709 -0.00241014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1213 1263 -0.0794503 -3.06742 -0.191774 0.0457172 0.000594096 0.00614631 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1263 1264 6.3877 -0.0229373 -0.413832 0.00763503 0.12965 0.0449614 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1214 1264 0.137458 -3.09804 -0.143777 0.0673827 -0.00395199 -0.0903852 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1264 1265 6.05697 -0.00198107 -0.408921 0.00411694 0.128608 -0.0538856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1215 1265 -0.12901 -3.00058 -0.155794 0.056092 -0.015383 -0.0232422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1265 1266 6.28397 -0.153569 -0.664427 0.00553475 0.117594 0.00342066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1216 1266 0.19784 -2.96466 -0.0681702 0.0575392 -0.0165516 0.043202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1266 1267 6.24397 -0.120219 -0.435927 0.00103501 0.140058 0.0291781 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1217 1267 0.009327 -3.11755 -0.187005 0.0640473 -0.00614662 -0.015543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1267 1268 6.30926 -0.150044 -0.303697 -0.000639542 0.110922 -0.0299466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1218 1268 -0.216884 -3.15929 -0.000483977 0.0705086 -0.0103581 -0.0363552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1268 1269 6.29611 -0.00343735 -0.285131 -0.00477395 0.130331 -0.0146041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1219 1269 -0.0404176 -3.01787 -0.0454893 0.0635019 0.00881953 0.0126743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1269 1270 6.22615 0.10802 -0.349673 -0.00346955 0.122879 -0.0236909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1220 1270 -0.0343912 -2.85548 0.0651266 0.0871021 -0.00707767 -9.66944e-05 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1270 1271 6.36892 -0.235919 -0.351455 -0.00792541 0.131043 0.0215698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1221 1271 0.0500387 -3.16555 -0.0646421 0.0629708 -0.0189852 -0.0328915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1271 1272 6.27609 0.0295116 -0.429726 0.00057528 0.131179 -0.0342096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1222 1272 -0.0950962 -3.27799 -0.034505 0.048752 -0.0108364 -0.00564083 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1272 1273 6.35224 -0.0636227 -0.390599 0.00579051 0.130529 -0.0520118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1223 1273 0.000903979 -3.12157 -0.143615 0.0746695 0.00215029 0.0254664 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1273 1274 6.15911 -0.164483 -0.555666 0.00374065 0.129338 0.0120567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1224 1274 0.103299 -2.88434 0.089176 0.0548347 -0.00954624 -0.025369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1274 1275 6.28843 -0.127801 -0.507534 -0.00844453 0.145672 -0.0329174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1225 1275 -0.0430658 -3.02258 -0.326879 0.0463749 -0.00429992 -0.0334999 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1275 1276 6.2427 0.0626399 -0.3638 0.0023189 0.103687 -0.0227484 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1226 1276 0.131429 -3.06407 -0.116871 0.057516 0.00416119 0.0918204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1276 1277 6.17248 -0.0642882 -0.306885 0.0170405 0.124522 -0.0382094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1227 1277 0.0874076 -3.00898 -0.201226 0.051516 -0.00453837 0.0394725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1277 1278 6.11498 -0.0413086 -0.456354 0.0112505 0.126034 -0.0217124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1228 1278 0.0221527 -2.92567 -0.00606727 0.061344 0.0238919 0.0231577 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1278 1279 6.25378 -0.174784 -0.257661 -0.00636555 0.123086 -0.11108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1229 1279 -0.0827371 -3.1309 -0.126949 0.0672071 -1.52551e-05 -0.0230076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1279 1280 6.17019 0.0616008 -0.393819 0.00608905 0.135674 0.0209437 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1230 1280 -0.00340917 -3.02148 -0.128066 0.0585612 -0.0233853 -0.00412157 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1280 1281 6.18631 -0.0294208 -0.500332 -0.000119226 0.124411 -0.0331476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1231 1281 -0.0597199 -3.02169 0.0538403 0.0825918 0.000621827 -0.0493559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1281 1282 6.16046 -0.152861 -0.463147 -0.00710748 0.119054 -0.0234503 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1232 1282 0.00633811 -3.18101 -0.128797 0.0678917 -0.0023235 0.0314107 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1282 1283 6.48933 -0.114148 -0.558952 0.016254 0.132427 0.00568016 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1233 1283 0.123263 -2.99847 0.0159669 0.0498338 -0.0106584 -0.0856789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1283 1284 6.23021 0.0689084 -0.49952 0.00108541 0.123661 -0.0589047 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1234 1284 0.058116 -2.96013 -0.118725 0.0784062 0.00302203 0.0418499 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1284 1285 6.21662 -0.0675519 -0.509614 -7.74085e-06 0.135943 0.0514599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1235 1285 -0.0321683 -3.14952 -0.17281 0.0589978 0.00494735 -0.00149692 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1285 1286 6.24696 -0.00355016 -0.421317 -0.0101002 0.13188 0.0551212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1236 1286 -0.0432638 -2.92605 -0.126502 0.0600392 -0.00353916 -0.111385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1286 1287 6.27844 -0.125261 -0.484204 -0.000469104 0.116518 0.00967152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1237 1287 -0.164066 -3.11587 -0.138526 0.0459771 0.0103624 0.0386395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1287 1288 6.30194 -0.175161 -0.519588 0.00570471 0.130042 0.00483855 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1238 1288 0.0922468 -3.03399 0.0613566 0.0513318 0.00111965 0.0255852 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1288 1289 6.15168 0.185523 -0.541771 0.0102575 0.127273 -0.0232311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1239 1289 -0.0299831 -3.07901 -0.380572 0.0637487 0.000762412 0.0245203 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1289 1290 6.06952 -0.136027 -0.407924 -0.00596985 0.121079 -0.00770528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1240 1290 0.0548115 -3.01175 -0.0288549 0.074494 -0.0253328 0.0153122 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1290 1291 6.16751 -0.0684213 -0.49552 0.00222471 0.118259 0.0334444 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1241 1291 0.0094919 -3.12566 -0.139396 0.0606138 0.000236116 0.0242394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1291 1292 6.38761 -0.0557133 -0.479586 -0.00784479 0.11649 -0.0644483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1242 1292 -0.0838546 -3.10407 -0.0704546 0.0654677 -0.0170895 -0.00324016 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1292 1293 6.09212 -0.171625 -0.299539 0.0105154 0.141035 -0.0409676 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1243 1293 0.286475 -3.11071 -0.151375 0.0663687 -0.00959548 -0.0285603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1293 1294 6.18646 -0.154189 -0.195278 -0.0146626 0.115924 -0.0642156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1244 1294 -0.0813753 -3.09128 -0.0170196 0.0792947 -0.0017218 0.0128393 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1294 1295 6.24633 -0.0847706 -0.482392 0.016668 0.131099 0.0163391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1245 1295 0.0220437 -3.08965 -0.243809 0.0532947 0.00688378 -0.00718575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1295 1296 6.26818 -0.146763 -0.431497 0.00448523 0.124349 -0.00751718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1246 1296 0.1711 -3.22702 -0.229123 0.0558606 -0.00196703 0.0148428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1296 1297 6.16198 -0.0799677 -0.242041 0.00209855 0.112333 -0.0512353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1247 1297 -0.109196 -3.17172 -0.339867 0.0604321 0.0158696 -0.00205957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1297 1298 6.09268 -0.137636 -0.358679 0.0061355 0.127449 -0.0124003 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1248 1298 0.102301 -2.80005 -0.0583969 0.0782237 -0.00766947 -0.0299266 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1298 1299 6.20567 -0.169428 -0.399089 -0.011463 0.11987 -0.0607119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1249 1299 -0.113522 -2.91989 -0.256649 0.0538864 0.0122353 0.024665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1299 1300 6.19215 -0.193602 -0.357342 0.0234807 0.113824 -0.00232494 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1250 1300 -0.0575381 -3.15703 -0.0173465 0.0560862 -0.0181203 -0.0417794 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1300 1301 6.22112 -0.0285158 -0.401262 -0.00606963 0.129094 -0.00593831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1251 1301 -0.0208661 -3.04281 -0.262711 0.0486373 -0.0116369 -0.0227831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1301 1302 6.34695 -0.123071 -0.457444 0.0048172 0.130174 -0.0904355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1252 1302 -0.17397 -3.06393 -0.108863 0.0478713 -0.00453879 -0.0394134 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1302 1303 6.29111 -0.166395 -0.306891 -0.00519042 0.124023 0.0435879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1253 1303 -0.0151913 -3.10748 -0.0844892 0.0603145 0.00180362 0.0129624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1303 1304 6.31488 -0.202562 -0.344266 -0.00334094 0.135412 0.00399967 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1254 1304 0.0651676 -3.18321 -0.103595 0.0556416 -0.00419141 -0.00132177 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1304 1305 6.35699 -0.141824 -0.373519 0.00516648 0.133134 -0.0213091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1255 1305 -0.0440867 -3.07231 -0.112743 0.0574387 -0.00359851 -0.0357969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1305 1306 6.30369 -0.190767 -0.443207 -0.00739282 0.129526 -0.0846501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1256 1306 -0.123172 -3.18236 -0.125023 0.0496843 0.0127799 0.000362878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1306 1307 6.44043 -0.123385 -0.501931 -0.021574 0.123638 -0.0128373 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1257 1307 0.0905932 -3.08052 0.127835 0.0783303 -0.0063064 -0.0239268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1307 1308 6.21538 -0.152431 -0.359177 -0.00578684 0.131289 -0.0588231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1258 1308 -0.100321 -3.02651 -0.221678 0.0798382 -0.00937771 -0.00299728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1308 1309 6.27574 -0.154201 -0.518586 -0.000907577 0.115278 0.00984685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1259 1309 -0.0283104 -3.10143 -0.272325 0.0537936 -0.000298833 -0.0202115 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1309 1310 6.09744 -0.226017 -0.258046 -0.0115795 0.114699 -0.0443007 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1260 1310 -0.0214668 -3.03514 -0.187348 0.0631736 0.00419606 -0.0324818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1310 1311 6.20693 -0.0159063 -0.19181 -0.00987638 0.128406 0.0356525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1261 1311 0.0726882 -2.98127 -0.144517 0.0644936 -0.0196089 0.0325518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1311 1312 6.29708 -0.158061 -0.146104 0.0108482 0.134657 0.0114973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1262 1312 0.00471941 -3.09863 -0.116504 0.0665405 0.00399041 -0.0219051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1312 1313 6.34431 -0.0177462 -0.298745 -0.00242028 0.120898 -0.0570523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1263 1313 0.1264 -3.18058 0.071293 0.049349 -0.00179828 -0.0209318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1313 1314 6.24302 -0.30347 -0.375339 -0.000830958 0.119596 -0.0236711 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1264 1314 -0.14519 -3.21131 -0.198725 0.0613887 0.000136054 0.0094161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1314 1315 6.31953 -0.237597 -0.21995 0.00103115 0.125343 0.0467928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1265 1315 0.0172603 -3.10497 -0.0672765 0.0614839 0.00463369 0.0103852 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1315 1316 6.11825 -0.118747 -0.465761 0.0074704 0.125082 0.0793701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1266 1316 -0.042448 -3.00457 -0.150366 0.0518905 -0.0339651 0.0330414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1316 1317 6.22251 -0.171544 -0.378444 -0.00556181 0.138316 -0.0597551 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1267 1317 -0.0418052 -2.99817 -0.208835 0.0337551 0.00835285 0.0358527 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1317 1318 6.21844 -0.0718262 -0.339217 -0.0019239 0.136535 -0.00214604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1268 1318 -0.0760421 -2.87396 -0.0420749 0.0472971 0.00278051 0.0474409 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1318 1319 6.2523 -0.194656 -0.254226 0.00873374 0.12282 0.0680378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1269 1319 0.101262 -2.84592 -0.213601 0.0616402 0.00595651 -0.0550343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1319 1320 6.34696 -0.123717 -0.29561 -0.00765357 0.11189 -0.0212815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1270 1320 0.0903656 -3.00274 -0.141047 0.076211 -0.00417802 -0.00582132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1320 1321 6.16656 0.0333055 -0.377473 0.000487587 0.117168 -0.066752 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1271 1321 0.0231358 -2.84813 -0.0955439 0.0738655 0.0152974 0.0347263 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1321 1322 6.24314 -0.130521 -0.364895 0.00602578 0.103819 -0.00714588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1272 1322 0.196866 -3.05021 0.025311 0.0654254 -0.00668304 0.0156272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1322 1323 6.22752 -0.134193 -0.414806 -0.0171638 0.12082 -0.0376235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1273 1323 -0.0727416 -3.1449 0.0670576 0.0595661 -0.0106434 -0.0281229 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1323 1324 6.2488 0.0423297 -0.47685 -0.00239673 0.114041 -0.0306187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1274 1324 -0.0156132 -3.00505 -0.295934 0.0560122 -0.00522284 -0.0139018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1324 1325 6.18545 -0.0947276 -0.346643 -0.00542558 0.138176 -0.0211824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1275 1325 0.0789107 -3.12503 0.142463 0.0618578 -0.00282627 0.0312357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1325 1326 6.23699 -0.298 -0.228957 -0.000149999 0.127537 0.000587954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1276 1326 -0.0672725 -3.153 -0.0609681 0.081745 -0.00187555 0.0643672 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1326 1327 6.23197 -0.26787 -0.390065 0.00747707 0.132918 -0.0378892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1277 1327 0.0913388 -2.99895 0.0160893 0.0842274 -0.00302083 -0.0315639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1327 1328 6.18426 -0.144952 -0.475915 -0.00835148 0.117644 0.0148712 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1278 1328 0.0164034 -3.07669 0.0493066 0.0744174 -0.00921978 -0.0162468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1328 1329 6.18676 0.0648548 -0.499528 0.00706569 0.135685 0.00277929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1279 1329 -0.0222329 -3.02261 -0.065597 0.0592349 -0.00741687 0.0159005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1329 1330 6.15092 -0.0838465 -0.440878 0.00438362 0.125174 0.0507155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1280 1330 0.0725016 -2.98363 -0.136355 0.0744213 -0.00860575 -0.0185231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1330 1331 6.23806 -0.221246 -0.303774 -0.00183151 0.129366 -0.00519121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1281 1331 -0.0213452 -3.10214 -0.143385 0.0638852 0.00848861 0.0369964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1331 1332 6.27513 -0.0853939 -0.411111 0.0102379 0.120619 -0.0400112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1282 1332 0.0328465 -3.1208 -0.169905 0.0714499 -0.0108968 0.0770387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1332 1333 6.2786 -0.223558 -0.195378 0.0113889 0.127027 0.0288591 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1283 1333 -0.0300653 -2.87785 -0.011728 0.0604565 -0.00457112 -0.0246904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1333 1334 6.39039 -0.00275384 -0.533357 -0.0224172 0.135746 0.000182133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1284 1334 -0.0541019 -3.16241 -0.0731676 0.0650972 -0.00280485 0.0482165 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1334 1335 6.20043 -0.159617 -0.424376 -0.0179198 0.111197 -0.0543473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1285 1335 -0.123151 -3.11357 -0.0709806 0.0619399 -0.0219791 -0.00586649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1335 1336 6.42572 -0.102746 -0.535746 0.00347688 0.12939 -0.0215104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1286 1336 0.0846766 -3.13313 -0.172657 0.0711094 0.0130331 -0.0236692 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1336 1337 6.28704 -0.147034 -0.470362 0.000200042 0.116975 -0.054245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1287 1337 0.129784 -3.08153 -0.191773 0.0515718 0.011975 -0.0732215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1337 1338 6.30014 -0.112928 -0.302107 -0.00913041 0.142751 -0.0668146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1288 1338 0.0912647 -3.04488 -0.0878891 0.0724135 -0.00214719 0.00114433 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1338 1339 6.11531 -0.33832 -0.345553 -0.00795829 0.117375 0.0403616 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1289 1339 0.0633721 -3.02641 -0.176723 0.0340894 0.0175776 0.00220281 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1339 1340 6.02633 -0.164862 -0.27763 -0.00694843 0.135948 0.0355381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1290 1340 0.040094 -3.13084 0.0623061 0.0693734 0.00366114 0.00679749 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1340 1341 6.2373 -0.126054 -0.476603 -0.00324391 0.124117 -0.0669994 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1291 1341 0.117051 -2.93544 -0.200153 0.0772734 -0.000996978 0.00103887 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1341 1342 6.25852 -0.103477 -0.434705 -0.0183101 0.115919 0.0432434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1292 1342 -0.0954122 -3.11456 -0.214924 0.0636121 0.0195949 -0.0467751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1342 1343 6.34528 -0.0859691 -0.300043 -0.00707373 0.134346 0.0880443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1293 1343 -0.107863 -3.0765 -0.138434 0.0731123 0.00188181 -0.0199851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1343 1344 6.22885 -0.170272 -0.494296 -0.00801141 0.126607 0.0503689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1294 1344 -0.0506967 -3.11434 -0.212269 0.0521337 0.0127944 -0.0175316 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1344 1345 6.15728 -0.0504386 -0.358963 -0.0128624 0.139655 -0.0272258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1295 1345 0.100709 -3.21198 -0.24691 0.061676 -0.0052131 -0.0228803 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1345 1346 6.0505 -0.157932 -0.318045 -0.0159028 0.124094 -0.042166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1296 1346 -0.0193429 -3.02744 -0.193487 0.0592263 -0.00759576 0.0674409 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1346 1347 6.47365 -0.000612863 -0.514904 0.00969294 0.129354 0.000967374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1297 1347 0.0708384 -3.25031 -0.118709 0.0703136 0.0132948 0.0214276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1347 1348 6.2339 -0.00389345 -0.419243 0.00766642 0.121445 -0.0516315 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1298 1348 0.00108843 -2.97985 -0.0529146 0.0541891 -0.00852176 0.0250052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1348 1349 6.14442 -0.166148 -0.547432 -0.00168206 0.121439 -0.0274039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1299 1349 -0.0774533 -2.99245 -0.102199 0.0672855 0.00690929 -0.0856849 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1349 1350 6.24987 0.0348018 -0.347181 0.0115012 0.124663 0.00274186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1300 1350 -0.135449 -3.18796 -0.130342 0.0511162 -0.01106 0.0619865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1350 1351 6.35901 -0.154356 -0.41679 0.0143761 0.110358 -0.00753472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1301 1351 0.0863229 -3.01904 -0.146394 0.0551198 0.00785159 0.0996557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1351 1352 6.34683 -0.147685 -0.477567 -0.0106044 0.125373 -0.0921588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1302 1352 -0.0886227 -3.07618 0.0863092 0.061364 -0.000349922 -0.0135701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1352 1353 6.17108 -0.117185 -0.379815 -0.00688363 0.148603 -0.0503782 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1303 1353 0.098698 -3.03124 -0.145067 0.0424208 -0.00513333 -0.087276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1353 1354 6.19896 -0.153606 -0.36276 -0.000610075 0.135646 -0.0922879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1304 1354 -0.192031 -3.13288 0.0865867 0.0588621 0.0154258 0.0409268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1354 1355 6.21077 -0.109665 -0.333462 0.00383074 0.137909 0.0174263 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1305 1355 0.0730041 -3.23254 -0.0434189 0.0539883 -0.00292294 -0.000401201 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1355 1356 6.02145 0.0205289 -0.549595 -0.00213076 0.119904 0.0208861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1306 1356 0.0144543 -3.20331 0.040632 0.0622832 0.0263164 -0.0335154 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1356 1357 6.19608 -0.175023 -0.492295 -0.00980655 0.13878 -0.0169445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1307 1357 0.000991237 -3.19475 -0.233741 0.0553458 -0.000679122 -0.054863 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1357 1358 6.32081 -0.0949116 -0.47565 -0.00557439 0.137245 0.000416272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1308 1358 -0.171001 -2.93116 -0.0731253 0.0516754 -0.0034792 0.0331167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1358 1359 6.16269 0.02142 -0.447676 0.00340591 0.139982 -0.00580837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1309 1359 0.0849326 -2.85309 -0.173527 0.0673889 -0.000299645 0.0139254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1359 1360 6.17655 -0.0299125 -0.316326 -0.010134 0.135787 0.0453249 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1310 1360 0.0788349 -3.01811 -0.166758 0.0524034 0.0159887 -0.00251527 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1360 1361 6.30924 0.0763557 -0.559063 0.00275395 0.133246 -0.0498026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1311 1361 -0.0457107 -2.97227 0.0170211 0.0646043 -0.000215917 -0.0336582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1361 1362 6.18382 -0.127721 -0.356647 -0.00513167 0.130489 0.00630343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1312 1362 0.0391832 -3.04532 -0.17623 0.072537 0.00707339 -0.0277942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1362 1363 6.35586 -0.36993 -0.284798 -0.000716211 0.116358 -0.034882 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1313 1363 -0.0514189 -3.02893 -0.315396 0.0473976 -0.0164098 0.0214352 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1363 1364 6.17803 -0.186773 -0.527587 0.0160689 0.122344 -0.0441987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1314 1364 -0.0323157 -3.05847 -0.0958673 0.0584865 0.0087537 0.00964478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1364 1365 6.31881 -0.229596 -0.495082 -0.00220729 0.126938 -0.0144915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1315 1365 0.125174 -3.0133 -0.0689619 0.0741111 -0.00659632 0.0371802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1365 1366 6.31475 -0.197426 -0.278192 0.0026716 0.107188 0.00581629 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1316 1366 0.234237 -2.96419 -0.0508271 0.0752879 0.00918547 0.0873697 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1366 1367 6.16042 -0.221415 -0.379171 -0.00821592 0.122627 -0.0402313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1317 1367 0.122871 -3.10854 -0.114482 0.0635472 0.00987242 0.0116272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1367 1368 6.05653 -0.171271 -0.254775 -0.0196225 0.117745 0.0203381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1318 1368 0.0196499 -2.99553 -0.0891939 0.0658658 -0.0100712 0.048836 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1368 1369 6.08874 0.0328503 -0.387274 -0.00634521 0.116876 -0.0593773 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1319 1369 0.0294847 -3.09914 0.0669154 0.0497298 0.00346906 -0.0287709 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1369 1370 6.11512 -0.0346746 -0.42042 0.00345043 0.107816 -0.0290675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1320 1370 -0.0243636 -3.11324 0.000406849 0.0690978 -0.00127054 -0.0858427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1370 1371 6.2184 -0.393157 -0.348097 0.0107075 0.12454 0.0721411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1321 1371 -0.0885003 -3.08063 0.00394994 0.0593954 0.00151714 -0.025069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1371 1372 6.05691 -0.26693 -0.55506 -0.00164788 0.129256 0.0204186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1322 1372 -0.0644299 -3.1561 -0.1362 0.0779913 0.00945756 0.0624406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1372 1373 6.10713 -0.124195 -0.254268 0.00953403 0.138629 -0.0250095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1323 1373 -0.129697 -2.82568 -0.0770265 0.0863426 -0.00621421 -0.0595498 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1373 1374 6.23581 -0.26679 -0.548397 0.00987692 0.120844 0.0362534 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1324 1374 -0.031255 -2.96979 -0.0713494 0.0492207 -0.00675091 0.015638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1374 1375 6.26018 -0.154932 -0.306531 0.00785009 0.141337 -0.00623773 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1325 1375 -0.00792822 -3.10115 -0.0591035 0.060535 0.000214208 0.0296064 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1375 1376 6.04549 -0.32269 -0.421921 -0.0147898 0.110048 -0.0580431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1326 1376 -0.0375512 -3.03737 -0.126621 0.0768076 -0.00439573 0.110714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1376 1377 5.9869 -0.226792 -0.364534 0.00448135 0.126773 -0.0780523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1327 1377 0.123801 -3.1379 -0.177073 0.0588106 -0.00876132 -0.00179833 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1377 1378 6.24655 -0.0563683 -0.455999 0.000603677 0.135794 0.0145561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1328 1378 0.0473298 -3.06573 -0.112554 0.0683254 0.00356538 -0.0043221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1378 1379 6.14658 -0.296394 -0.269106 -0.00554602 0.120544 -0.0326916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1329 1379 -0.0299222 -2.98244 -0.0324959 0.0462015 -0.00330524 -0.0466604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1379 1380 6.17964 -0.369421 -0.379227 0.00334583 0.130517 -0.0687187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1330 1380 0.0112869 -3.06834 0.0314856 0.0663052 0.00564651 -0.0511797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1380 1381 6.24977 -0.0820678 -0.384023 -0.00556243 0.11058 0.00709975 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1331 1381 0.221602 -3.09163 0.0614727 0.061958 -0.000203844 0.0122524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1381 1382 6.13005 -0.183719 -0.368163 0.0184854 0.126183 -0.0189129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1332 1382 0.118677 -3.11276 -0.261401 0.0508654 -0.00583509 0.029423 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1382 1383 5.99288 -0.371239 -0.382527 0.00129876 0.125701 -0.0929394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1333 1383 -0.0791063 -3.12113 0.163113 0.0472803 0.00913988 0.0121603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1383 1384 6.35917 -0.13502 -0.395678 0.0153094 0.115308 -0.0125983 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1334 1384 0.0665855 -3.00528 0.0403633 0.0792484 -0.00818354 0.0135477 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1384 1385 6.20461 -0.00668903 -0.529339 0.00137144 0.12598 -0.00332228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1335 1385 0.00731679 -3.01045 -0.0693185 0.0587577 0.00338095 0.0381203 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1385 1386 6.10261 0.0345962 -0.451116 0.00205541 0.140139 0.04557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1336 1386 0.0707095 -2.9723 -0.0640878 0.0703759 -0.00959158 -0.0105589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1386 1387 6.06628 -0.242093 -0.536489 0.014487 0.120288 -0.0306972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1337 1387 0.24516 -3.05638 -0.17008 0.0651738 0.000413062 -0.00123889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1387 1388 6.42854 -0.160517 -0.433313 0.000449497 0.115891 -0.0510779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1338 1388 -0.133061 -3.07977 0.00842736 0.0776013 0.0047655 -0.0490726 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1388 1389 6.34016 -0.0943848 -0.271538 0.00134892 0.134419 -0.0174397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1339 1389 0.0267053 -3.08914 -0.174307 0.0663553 0.0111123 -0.0038368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1389 1390 6.16941 -0.0900359 -0.255688 -0.0128628 0.124586 -0.0765119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1340 1390 -0.065725 -3.16306 -0.22173 0.0662765 0.00772302 -0.00937377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1390 1391 6.04025 -0.24079 -0.238049 -0.0150281 0.130099 -0.0434135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1341 1391 0.249362 -2.97866 -0.137487 0.0653987 0.00169749 -0.0652879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1391 1392 6.3639 -0.199885 -0.159773 0.00104207 0.106717 0.0234947 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1342 1392 -0.0188619 -2.96372 0.0335782 0.0568973 -0.0111872 -0.0620218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1392 1393 6.25003 -0.279508 -0.367931 0.000527776 0.134087 -0.0907225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1343 1393 0.101523 -3.01196 -0.0992638 0.070162 -0.00366289 0.11143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1393 1394 6.21748 -0.160159 -0.290193 -0.0107113 0.131245 -0.0100895 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1344 1394 -0.10246 -3.06114 0.0283579 0.0622374 0.0154011 -0.0467315 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1394 1395 6.082 -0.222128 -0.478707 0.00850339 0.123402 -0.0126787 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1345 1395 0.126295 -3.02449 -0.119801 0.0534102 0.00605503 -0.029815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1395 1396 6.07123 0.103348 -0.331839 -0.0136554 0.131052 0.0381617 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1346 1396 -0.164039 -2.81797 -0.128848 0.0695433 0.00788694 0.0136664 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1396 1397 6.28588 -0.0463461 -0.361253 -0.00721689 0.139579 0.0254278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1347 1397 0.0642075 -3.12925 -0.283189 0.061878 0.00765653 0.0137282 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1397 1398 6.20156 -0.118891 -0.409095 0.0130242 0.140423 -0.063099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1348 1398 0.061399 -3.1661 -0.0734478 0.0647782 -0.00487747 0.0290046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1398 1399 6.09568 -0.0658503 -0.291645 0.0165812 0.118282 -0.0427588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1349 1399 -0.14636 -3.15239 0.0734351 0.0736348 -0.0114041 0.0580626 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1399 1400 6.18937 -0.180996 -0.413041 0.00710056 0.116709 -0.0377543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1350 1400 -0.140195 -3.13059 -0.116467 0.0543153 0.0200771 0.00669299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1400 1401 5.99165 -0.154059 -0.204484 0.00728459 0.128189 0.0376016 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1351 1401 -0.0616465 -3.15171 -0.0461224 0.0468709 0.00362259 -0.00601178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1401 1402 6.05785 -0.0653862 -0.342765 0.0030223 0.0984601 -0.00987176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1352 1402 -0.122224 -2.78434 -0.193178 0.0697432 0.00272268 0.0239871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1402 1403 6.22215 -0.0829228 -0.464193 0.00927284 0.138555 -0.00214689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1353 1403 -0.0961264 -3.04238 -0.248621 0.0666803 -0.00440849 0.011247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1403 1404 6.21331 -0.153434 -0.400361 -0.00681653 0.123235 0.0100431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1354 1404 0.123914 -3.06153 -0.259859 0.0615485 -0.0046311 -0.0308019 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1404 1405 6.19031 -0.0573191 -0.335526 0.00911303 0.12737 -0.0116962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1355 1405 -0.0435789 -3.06667 -0.0159335 0.0561305 0.00179222 0.00831948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1405 1406 6.18312 -0.0382142 -0.540216 0.00699367 0.114161 -0.0317702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1356 1406 -0.0250662 -3.19135 -0.312431 0.0720535 0.00404941 -0.0245335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1406 1407 6.1622 -0.126882 -0.267793 0.0117852 0.129465 -0.0458126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1357 1407 -0.0337986 -3.29913 -0.120742 0.0554299 0.0146751 0.0113163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1407 1408 6.23149 -0.207789 -0.468071 -0.00928667 0.124123 0.0284846 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1358 1408 0.188488 -2.96307 -0.215817 0.0562167 -0.00583458 -0.0131889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1408 1409 6.11789 -0.103072 -0.356617 -0.00465357 0.141164 -0.0107242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1359 1409 0.0588821 -3.08888 -0.10601 0.0701974 0.0162021 0.0270288 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1409 1410 6.15333 -0.0880778 -0.330333 -0.00546819 0.12523 -0.0751604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1360 1410 -0.130273 -3.03285 0.0446737 0.066687 -0.00584246 -0.0612057 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1410 1411 6.08747 -0.230189 -0.459166 -0.00129684 0.108804 -0.0442114 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1361 1411 0.137714 -3.07736 -0.34693 0.0461578 0.0022198 0.0277717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1411 1412 6.27994 -0.0944692 -0.251418 0.00906917 0.129936 -0.0578556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1362 1412 0.0617815 -2.90856 -0.119507 0.0581285 0.0201209 -0.0254075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1412 1413 6.2563 0.111186 -0.399352 0.00835982 0.124868 0.0171425 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1363 1413 0.000388562 -2.95835 -0.273994 0.0632606 -0.00498305 0.0186935 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1413 1414 6.26289 -0.139937 -0.51785 -0.0056831 0.122524 -0.0690066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1364 1414 -0.117077 -2.94846 -0.154331 0.0745735 -0.0133048 -0.0440171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1414 1415 6.1037 -0.174219 -0.370236 0.011975 0.124678 -0.0498704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1365 1415 0.138866 -3.08177 -0.273103 0.0509035 -0.01264 -0.0666915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1415 1416 6.19373 0.0312867 -0.412646 0.00398377 0.139164 -0.0293642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1366 1416 0.0815604 -3.11526 -0.140667 0.0489597 -0.00509044 -0.0211174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1416 1417 5.97719 -0.153279 -0.233219 -0.0266029 0.123761 -0.0579885 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1367 1417 0.0851823 -3.00174 0.105478 0.0516367 -0.0116361 -0.0171806 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1417 1418 6.17937 -0.126027 -0.400826 0.0119704 0.116487 -0.00362574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1368 1418 -0.0444368 -2.90327 -0.185914 0.0662058 0.00839529 0.00342798 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1418 1419 6.25898 -0.0528018 -0.512342 -0.00113869 0.116178 -0.147921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1369 1419 -0.0490994 -3.12999 -0.0129322 0.0509604 -0.00666623 -0.0175448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1419 1420 6.24686 -0.0848768 -0.398167 -0.0111941 0.121146 -0.0131136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1370 1420 -0.0343025 -3.09612 0.0298384 0.0547074 -0.0040033 -0.00721476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1420 1421 6.23642 -0.183417 -0.306788 0.00133654 0.128281 -0.0295159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1371 1421 0.118178 -2.93711 -0.0889908 0.0780479 0.00716225 -0.0574702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1421 1422 6.18093 -0.156664 -0.43569 0.0200686 0.116158 0.000661378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1372 1422 -0.0925934 -3.00313 -0.0839782 0.0649498 -0.00857933 -0.0125595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1422 1423 6.09856 -0.200275 -0.510928 0.0115847 0.123101 -0.0174179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1373 1423 0.0799127 -3.13026 0.053292 0.0370658 0.00441546 -0.013664 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1423 1424 6.23155 -0.180851 -0.404976 -0.0173255 0.134618 -0.0742817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1374 1424 -0.066994 -3.00604 -0.0426163 0.0809034 -0.00168159 0.00295714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1424 1425 5.95385 -0.118479 -0.515534 0.00954057 0.129722 -0.0337531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1375 1425 0.313067 -2.91797 0.0345355 0.072359 -0.00700212 0.00256193 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1425 1426 6.05494 -0.247218 -0.467427 0.00351528 0.133058 -0.00117462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1376 1426 -0.160073 -3.05797 0.0140968 0.0707071 -0.0102097 -0.0330448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1426 1427 5.96243 -0.0742347 -0.202936 -0.00693743 0.129894 -0.0435058 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1377 1427 0.0114447 -3.10837 -0.150238 0.0688077 -0.00769804 0.0277486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1427 1428 6.18918 -0.156636 -0.291154 -0.0051626 0.115819 -0.0811012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1378 1428 0.166134 -2.88169 -0.0126063 0.056382 -0.00323255 0.0536752 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1428 1429 6.08753 -0.0190211 -0.445059 0.0242494 0.124441 -0.0571014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1379 1429 0.0128448 -3.03928 -0.130835 0.0473485 0.0165995 0.0315705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1429 1430 6.21752 -0.139977 -0.277539 -0.00261023 0.147573 0.0051677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1380 1430 0.189056 -3.04874 0.102951 0.0559536 0.0131767 -0.0583113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1430 1431 6.13333 -0.118259 -0.462708 0.0231094 0.123543 0.00836591 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1381 1431 0.00165198 -3.11531 -0.0230139 0.0670188 -0.000306608 -0.0105856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1431 1432 5.99663 -0.257932 -0.197358 -0.0108571 0.128803 -0.113567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1382 1432 -0.208759 -2.98 -0.159831 0.0401332 0.00813426 -0.047469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1432 1433 6.08133 -0.245919 -0.464953 0.0164291 0.121864 -0.0601259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1383 1433 -0.0998267 -3.0062 -0.11769 0.0606215 -0.00551111 -0.0298601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1433 1434 6.34284 -0.111503 -0.364125 -0.00837969 0.114923 0.012549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1384 1434 -0.0040618 -2.88701 -0.0346106 0.0551135 0.00923711 0.0205142 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1434 1435 6.15365 -0.187555 -0.408228 0.0124158 0.11455 -0.0638346 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1385 1435 -0.232551 -2.85677 -0.0106074 0.0747041 0.010108 -0.0460196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1435 1436 6.08677 -0.305591 -0.329864 -0.018071 0.128791 -0.012451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1386 1436 0.0412898 -3.05322 -0.00766552 0.0892667 0.00212398 -0.0217395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1436 1437 6.17393 -0.182168 -0.220124 -0.0062963 0.117772 0.04488 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1387 1437 0.0945153 -3.01835 -0.0651342 0.0752168 -0.0208646 0.0118985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1437 1438 6.2243 -0.278793 -0.226109 0.00839665 0.131108 0.035376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1388 1438 0.00684625 -3.02375 -0.160322 0.0583357 0.00629984 -0.0207399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1438 1439 6.19107 -0.06378 -0.45245 -0.00512761 0.127324 0.0387043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1389 1439 0.0533143 -2.92101 0.0682153 0.0670475 -0.000818174 0.0345932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1439 1440 5.91366 -0.116944 -0.321484 -0.00437871 0.119168 -0.130488 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1390 1440 -0.0677061 -3.04323 0.0948217 0.0744655 -0.00117337 0.083724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1440 1441 6.18863 0.128748 -0.552268 0.0173837 0.107879 -0.0106567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1391 1441 0.114623 -3.1265 -0.062847 0.0416787 -0.0100751 0.00106035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1441 1442 6.12783 -0.221019 -0.244211 0.00740432 0.11358 0.0235426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1392 1442 -0.0744187 -3.11913 -0.0777796 0.0851612 0.0125156 0.0130687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1442 1443 6.12316 -0.171644 -0.254996 -0.00124564 0.13014 -0.0401135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1393 1443 0.0170717 -3.23287 0.0958371 0.0580701 -0.00762169 -0.0408247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1443 1444 6.20766 -0.160746 -0.462858 0.0063381 0.118146 0.0020909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1394 1444 -0.0186652 -3.12685 -0.268548 0.0502591 -0.00725028 -0.0308373 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1444 1445 6.09538 -0.214699 -0.294306 -0.0122057 0.112418 -0.07329 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1395 1445 0.0617102 -3.20129 -0.315528 0.0684298 -0.0194598 0.0489742 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1445 1446 6.01016 -0.153446 -0.203129 0.0194585 0.124313 -0.0212877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1396 1446 -0.0168841 -3.00355 -0.0743806 0.0772402 0.0289977 0.00812042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1446 1447 6.19772 -0.13341 -0.367262 0.00516644 0.13159 -0.0196683 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1397 1447 -0.0445362 -3.00702 -0.0515179 0.054395 -0.00634871 -0.042434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1447 1448 6.075 -0.202533 -0.273878 0.00677098 0.1229 0.035129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1398 1448 -0.0715959 -3.16938 -0.215106 0.0566154 -0.0126726 0.0222052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1448 1449 6.0769 -0.157555 -0.271993 -0.00246021 0.119149 0.0127071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1399 1449 -0.117625 -3.25715 -0.0273246 0.0701064 0.0107712 -0.0481098 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1449 1450 6.04936 -0.152104 -0.334901 -0.0132461 0.124931 0.0312824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1400 1450 -0.11432 -3.22112 -0.143187 0.0592906 -0.00302804 -0.0321466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1450 1451 6.0736 -0.0261451 -0.419548 0.0169376 0.103912 -0.0543292 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1401 1451 0.0970733 -3.03483 -0.170898 0.0585997 0.014997 0.0333254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1451 1452 6.12136 -0.140748 -0.39245 0.0170421 0.134432 0.0323519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1402 1452 0.0695612 -3.06127 -0.00410004 0.0796017 0.0157045 -0.0234827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1452 1453 6.07048 -0.0358362 -0.298025 0.000312056 0.147379 0.065019 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1403 1453 -0.0691311 -3.16751 -0.135613 0.0553644 0.00761282 -0.0964677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1453 1454 6.03095 -0.341544 -0.236688 0.010251 0.125193 -0.0751816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1404 1454 -0.0665629 -2.90613 -0.112797 0.0742713 -0.000766948 -0.0436524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1454 1455 5.96737 -0.118697 -0.317615 0.00420679 0.105808 -0.0245612 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1405 1455 -0.145496 -3.14114 -0.037312 0.0506323 0.00293545 -0.0295816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1455 1456 6.15516 -0.219293 -0.339482 -0.0118371 0.113477 -0.106373 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1406 1456 -0.0680009 -2.96203 -0.153302 0.0678903 0.0172271 -0.0165301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1456 1457 6.28059 -0.178807 -0.39012 0.00677239 0.116284 -0.0367025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1407 1457 -0.0451566 -3.15697 -0.0886921 0.0720196 -0.0142984 0.0286645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1457 1458 6.05287 -0.118721 -0.385972 0.00857199 0.138324 -0.0389104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1408 1458 -0.0171086 -3.13116 0.0238625 0.068981 -0.0105539 -0.00990347 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1458 1459 5.89172 -0.0725097 -0.296829 -0.00231725 0.13542 -0.0639112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1409 1459 0.0447583 -2.92111 -0.177546 0.0726917 0.0105957 -0.0595585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1459 1460 6.13755 -0.206726 -0.437175 -0.00356085 0.129794 0.0302953 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1410 1460 0.0488749 -3.11124 0.110536 0.0440881 -0.0205042 -0.080661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1460 1461 6.05655 0.01612 -0.407569 0.00516603 0.125982 -0.000677473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1411 1461 -0.000562506 -3.08526 -0.152169 0.0545927 0.0020852 0.0746242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1461 1462 6.11832 -0.121048 -0.487158 0.003971 0.117025 0.0223662 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1412 1462 0.0858479 -3.06055 -0.0716978 0.0825499 -0.0156003 0.111653 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1462 1463 5.99079 -0.20462 -0.386277 -0.000912133 0.119886 0.0126024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1413 1463 -0.0917391 -3.07495 -0.200095 0.0476129 -0.00544581 -0.039587 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1463 1464 6.06114 -0.159668 -0.488708 -0.0087628 0.112866 -0.0934021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1414 1464 0.0346657 -2.9515 -0.0695061 0.0613631 -0.0110999 0.0390885 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1464 1465 6.05344 -0.152504 -0.467002 -0.0172332 0.111851 -0.0581871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1415 1465 0.0982136 -2.79815 0.100074 0.0548338 0.00258702 -0.0182369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1465 1466 5.79639 -0.250515 -0.353694 -0.000257374 0.105969 0.0292526 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1416 1466 0.00521197 -3.18371 -0.0845621 0.082391 -0.000314755 0.0378731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1466 1467 6.05326 -0.360524 -0.38023 -0.0100579 0.120634 -0.0882227 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1417 1467 0.0820985 -3.02064 -0.134152 0.0780365 0.00589157 -0.0260725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1467 1468 6.13361 -0.172173 -0.400285 0.00356977 0.140868 -0.0189514 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1418 1468 -0.0615935 -3.16019 -0.120833 0.0702464 0.005434 0.039276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1468 1469 5.87955 -0.0870466 -0.320997 0.0102548 0.135626 -0.0976272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1419 1469 -0.113872 -3.01411 -0.22652 0.0630839 0.00334795 0.0139758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1469 1470 6.1625 -0.0770182 -0.261371 0.0115992 0.112337 -0.0134101 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1420 1470 0.128669 -3.06275 -0.116707 0.0687729 0.000531634 -0.0397298 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1470 1471 6.01587 -0.198168 -0.677768 -0.00707955 0.103314 0.0422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1421 1471 -0.02931 -3.20346 -0.0236705 0.0584768 -0.017075 -0.0319344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1471 1472 5.98135 0.0381998 -0.319193 0.00804527 0.130399 0.0224076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1422 1472 -0.106077 -2.9925 -0.0624821 0.073748 0.00686503 0.0393698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1472 1473 6.03524 -0.228531 -0.444687 -0.00750233 0.122549 -0.0665912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1423 1473 -0.0239414 -3.02144 0.0058184 0.0708999 -0.00526973 0.0695402 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1473 1474 6.15876 -0.147951 -0.482231 -0.00944582 0.117945 -0.102802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1424 1474 0.190346 -3.02244 -0.130642 0.0732372 -0.00116514 -0.0162531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1474 1475 6.07276 -0.319651 -0.215809 -0.0122446 0.0995757 -0.00173406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1425 1475 0.070112 -3.16877 -0.0659235 0.0486081 -0.00378028 -0.0771792 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1475 1476 6.19029 -0.0943584 -0.251671 0.0105876 0.107864 -0.0197862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1426 1476 -0.00797889 -2.97364 0.0134975 0.05733 -0.00438671 0.0436236 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1476 1477 6.02899 -0.315797 -0.546651 0.0148656 0.118713 -0.0595451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1427 1477 0.0392187 -2.95795 -0.0517485 0.0646616 0.0118014 -0.0199018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1477 1478 5.99699 -0.308442 -0.256416 -0.00164928 0.119522 -0.0514924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1428 1478 -0.0164042 -3.24258 0.202607 0.0650985 -0.0039974 0.0165545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1478 1479 6.02757 0.0471519 -0.422199 0.00541481 0.141026 -0.0393898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1429 1479 0.0770042 -3.15714 -0.134491 0.0764393 0.00660087 -0.0126845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1479 1480 6.16629 -0.150351 -0.45152 0.00665076 0.121026 -0.0255925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1430 1480 0.232111 -3.0744 -0.0264087 0.0549031 0.00160062 -0.0261133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1480 1481 5.90642 -0.176904 -0.332377 0.00387056 0.123183 0.0176196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1431 1481 -0.122164 -3.07109 -0.138505 0.0660462 0.00409373 -0.0388179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1481 1482 5.98013 -0.288847 -0.35072 0.0202979 0.12584 0.050431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1432 1482 -0.0694643 -3.14477 -0.0191628 0.0453165 -0.0110355 0.0212669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1482 1483 5.89233 -0.1167 -0.176689 -0.00419559 0.110337 -0.0688524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1433 1483 -0.163045 -3.05614 -0.126269 0.0662233 0.0112792 0.0583533 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1483 1484 6.07312 -0.130923 -0.344971 -8.07498e-05 0.131057 -0.0864181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1434 1484 0.197643 -2.96686 0.0603323 0.0703616 -0.00650056 0.0386695 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1484 1485 6.16322 -0.190019 -0.280612 0.00212731 0.111561 -0.0901867 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1435 1485 0.0384799 -3.15804 -0.153314 0.07026 0.00964581 -0.00568065 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1485 1486 6.09943 -0.193193 -0.323324 0.00558652 0.120831 -0.0482617 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1436 1486 0.0415012 -3.10148 0.0240764 0.0788238 0.00923461 0.0129404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1486 1487 6.00874 0.0768275 -0.41798 0.0166022 0.121765 -0.0206124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1437 1487 0.108971 -3.07799 -0.110145 0.0736319 0.00148968 -0.020866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1487 1488 5.63109 -0.160346 -0.225785 -0.00466224 0.110715 -0.049523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1438 1488 -0.044113 -2.99646 -0.104815 0.0693849 0.00386431 0.0780909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1488 1489 6.05897 0.057926 -0.316827 -0.0118161 0.120749 -0.00172968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1439 1489 -0.149219 -3.24801 -0.0301921 0.0539367 -0.013061 -0.0237986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1489 1490 6.16847 -0.309778 -0.2984 -0.0117436 0.131846 -0.0437028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1440 1490 0.112179 -3.00944 -0.120006 0.0494516 -0.00881205 0.0137996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1490 1491 6.09984 -0.120332 -0.37713 0.0113995 0.115744 0.00971879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1441 1491 -0.00439428 -3.01418 -0.203456 0.0594241 -0.00702853 -0.0303928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1491 1492 5.88367 -0.0629221 -0.209305 -0.0156856 0.127092 -0.0219118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1442 1492 -0.109151 -3.22516 0.156737 0.0610014 0.00891273 0.0404915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1492 1493 6.068 -0.230995 -0.281951 -0.0156341 0.116885 -0.0131461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1443 1493 0.0220061 -3.01042 0.0186233 0.0546629 -0.0179082 0.0500645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1493 1494 5.91328 -0.354315 -0.32983 0.0115276 0.104371 -0.123597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1444 1494 -0.0226628 -2.97448 -0.257686 0.0658895 -0.00297107 0.0627458 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1494 1495 6.00362 -0.242939 -0.477028 0.00582819 0.118106 -0.0391929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1445 1495 -0.0831201 -3.0404 -0.139814 0.0516752 -0.0233197 0.0277563 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1495 1496 6.05784 -0.119466 -0.520138 -0.00291896 0.122902 -0.103181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1446 1496 0.144303 -2.95004 -0.104787 0.0653108 0.0020728 0.10304 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1496 1497 5.97743 -0.266069 -0.398548 0.00109539 0.107392 -0.0703816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1447 1497 0.164602 -3.18762 -0.201016 0.0773302 -0.00152468 -0.00937868 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1497 1498 6.03483 -0.00999005 -0.424085 -0.00205763 0.112621 -0.0450435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1448 1498 -0.0949916 -3.04431 0.0663403 0.0511379 -0.0152116 0.00495744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1498 1499 5.94019 -0.291595 -0.392269 -0.0095386 0.107198 -0.0240439 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1449 1499 0.0579622 -3.126 0.048343 0.0736293 0.00454796 -0.0151949 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1499 1500 5.94704 -0.17863 -0.26738 -0.000850967 0.109864 -0.019029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1450 1500 -0.0122964 -3.03331 -0.137219 0.0491206 0.00104854 0.0410658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1500 1501 5.98286 -0.170064 -0.198508 -6.94832e-05 0.125728 -0.133179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1451 1501 0.242926 -3.09036 0.0153387 0.0626338 -0.0118128 0.0308092 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1501 1502 5.99281 -0.117677 -0.118552 0.00406159 0.112915 0.011944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1452 1502 0.0371973 -3.00307 0.0262124 0.06579 -0.00629308 -0.0133447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1502 1503 6.16767 -0.179064 -0.349133 -0.0107951 0.140918 -0.0617012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1453 1503 -0.0245438 -3.05885 -0.111534 0.0639343 -0.0161155 0.0118561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1503 1504 5.95318 -0.172401 -0.427493 -0.00540398 0.132854 -0.0433293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1454 1504 -0.166886 -3.13229 -0.0732931 0.0545925 0.00206823 -0.0476691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1504 1505 5.8782 -0.172979 -0.431631 -0.0141913 0.114533 -0.0330959 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1455 1505 -0.163036 -3.03205 -0.00025729 0.0635217 0.00920785 -0.10096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1505 1506 5.84763 -0.151272 -0.536484 0.0197927 0.128274 -0.0577312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1456 1506 0.0771592 -3.10403 -0.138116 0.0718416 0.012668 0.0278719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1506 1507 5.87092 -0.222001 -0.456434 -0.0065847 0.121136 -0.0234796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1457 1507 0.0484934 -2.98207 -0.164762 0.0346717 -0.0094675 0.055489 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1507 1508 6.0398 -0.270812 -0.166162 0.00432724 0.108029 0.00101333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1458 1508 0.0815976 -3.08308 -0.102886 0.0394647 0.00456846 -0.000392664 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1508 1509 5.91221 -0.289195 -0.412727 -0.00927877 0.120345 -0.101028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1459 1509 0.156271 -2.99707 -0.191499 0.0681083 0.00963372 0.0253516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1509 1510 5.85272 -0.37319 -0.561597 -0.00559181 0.135547 -0.0295506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1460 1510 4.05521e-05 -3.04457 -0.124608 0.0764181 0.0148044 0.0312512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1510 1511 5.78371 -0.198786 -0.348603 0.0168736 0.0928275 -0.00655454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1461 1511 0.0331207 -3.09185 -0.137245 0.0683752 0.0095138 0.0144855 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1511 1512 5.92286 -0.194858 -0.0916729 0.00107064 0.122295 -0.0881439 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1462 1512 0.0908232 -3.0238 -0.101309 0.0711652 0.0140852 0.0114161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1512 1513 6.01927 -0.042442 -0.385958 0.000583265 0.123155 0.00567899 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1463 1513 0.00864268 -3.04522 -0.123863 0.0821691 0.0182979 -0.0274555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1513 1514 5.95877 -0.194465 -0.326077 0.00397247 0.106627 -0.0160681 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1464 1514 -0.0502985 -3.12814 -0.0510892 0.0576524 -0.00889767 0.0235024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1514 1515 6.0762 -0.265267 -0.492219 -0.00104569 0.11212 -0.0107924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1465 1515 -0.00707759 -3.03875 -0.0285588 0.0559109 -0.00778751 -0.0600034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1515 1516 5.98213 -0.0818445 -0.240155 0.00718568 0.12 -0.0387357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1466 1516 -0.208393 -3.0294 -0.0746222 0.0549912 0.00169751 -0.018117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1516 1517 5.87105 -0.134005 -0.440708 0.0125851 0.10533 0.0157576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1467 1517 -0.08451 -3.04205 -0.0603531 0.0604685 0.00515505 -0.0462448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1517 1518 5.92085 -0.313127 -0.314374 -0.0077797 0.119137 -0.00294262 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1468 1518 -0.0505602 -2.99182 -0.0667217 0.0655882 -0.0104671 0.0445742 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1518 1519 6.00421 -0.112948 -0.446379 -0.00223438 0.133424 -0.00115862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1469 1519 -0.173974 -2.87874 -0.24046 0.0466518 -0.002804 0.0405722 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1519 1520 5.95863 -0.122336 -0.385533 0.00491622 0.122611 -0.0362417 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1470 1520 0.0793507 -3.09859 0.0506259 0.0528458 -0.0210768 0.0272711 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1520 1521 5.82393 -0.191902 -0.301191 0.0039109 0.110866 -0.0731426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1471 1521 -0.0849729 -3.13148 -0.0183556 0.0596168 -0.0102684 -0.043532 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1521 1522 5.7463 -0.29481 -0.337992 -0.00549352 0.117202 -0.032945 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1472 1522 0.0875691 -3.04439 -0.301831 0.0467093 0.00309956 -0.0660296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1522 1523 6.06437 -0.251527 -0.25787 -0.00838409 0.119691 -0.0684587 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1473 1523 0.0440002 -2.88071 0.0616479 0.0633957 -0.0156538 0.00468792 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1523 1524 6.01187 -0.134671 -0.284085 -0.005816 0.108558 -0.0718074 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1474 1524 -0.0292739 -3.01869 -0.136298 0.0766686 -0.00995432 -0.0108085 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1524 1525 5.892 -0.179557 -0.515688 -0.00162244 0.121657 -0.0220181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1475 1525 0.0348511 -3.03297 -0.307273 0.0605437 -0.00543309 -0.0323728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1525 1526 5.8185 -0.133914 -0.141418 -0.00258167 0.113294 -0.0435976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1476 1526 0.200722 -3.03673 -0.198971 0.0601141 -0.00171392 -0.00539927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1526 1527 5.83975 -0.199714 -0.382486 -0.00418352 0.106711 -0.076774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1477 1527 0.0704842 -3.01271 -0.103731 0.0646671 -0.0008368 0.00136598 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1527 1528 5.91736 -0.241596 -0.420749 -0.00344651 0.122921 -0.0654129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1478 1528 -0.26117 -3.01328 -0.100638 0.0591198 0.00429147 0.0284717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1528 1529 5.79337 -0.134957 -0.550117 0.00056868 0.117669 -0.0428818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1479 1529 -0.0738299 -2.8944 -0.0195218 0.0429103 0.00606049 0.00498765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1529 1530 5.88823 -0.103277 -0.346065 -0.00219001 0.0997805 -0.00962669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1480 1530 -0.0702237 -3.33992 -0.048626 0.0580585 -0.0146464 -0.0148905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1530 1531 5.91472 -0.187818 -0.375774 0.00405881 0.133378 -0.000635866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1481 1531 0.0471118 -2.96882 -0.0471514 0.0730989 -0.000801137 -0.0309024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1531 1532 5.88493 -0.211666 -0.523099 -0.00260497 0.103609 -0.0298985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1482 1532 0.132377 -2.97142 -0.0937641 0.0604169 0.0152166 0.0322203 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1532 1533 5.82982 -0.380093 -0.476638 0.00317657 0.114172 -0.0124295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1483 1533 0.0480049 -3.01471 0.0816344 0.0528384 0.00715055 -0.00156575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1533 1534 5.92871 -0.209305 -0.399149 -0.00743937 0.0971285 -0.0465478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1484 1534 0.093426 -3.06443 -0.0992595 0.0538423 -0.0162916 -0.0266222 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1534 1535 5.95962 -0.300768 -0.382427 -0.00415626 0.0987859 -0.119812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1485 1535 -0.0459628 -3.07576 -0.232439 0.0660294 -0.000407574 -0.00648659 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1535 1536 5.83785 -0.119313 -0.301585 0.00131275 0.119057 -0.0905173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1486 1536 -0.142974 -3.23039 -0.112534 0.0634954 -0.0135311 0.0322473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1536 1537 5.95114 -0.25736 -0.281579 -0.00706972 0.12354 -0.0776269 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1487 1537 0.0274043 -2.9532 -0.231942 0.0704048 -0.00614341 0.0582442 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1537 1538 5.87094 -0.3729 -0.208277 -0.0227541 0.137067 -0.0280577 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1488 1538 0.0370613 -2.91405 -0.0548517 0.0722532 0.00714865 0.0172267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1538 1539 5.84388 -0.150725 -0.349349 0.00801198 0.118224 -0.099876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1489 1539 -0.213618 -3.31568 -0.177221 0.0639273 0.00482042 -0.00063798 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1539 1540 5.81634 -0.135421 -0.555087 -0.0019541 0.11382 -0.0187826 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1490 1540 -0.241457 -3.04921 -0.0988095 0.0690001 0.000701801 0.00504568 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1540 1541 5.63269 -0.238251 -0.330804 0.0172518 0.106777 0.0221156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1491 1541 0.095635 -3.09193 -0.0365968 0.0554264 -0.00559803 -0.0336795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1541 1542 5.72755 -0.120957 -0.372014 0.00770878 0.11409 -0.0410835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1492 1542 0.0129842 -2.97485 -0.0496116 0.0749496 0.0235896 -0.0220508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1542 1543 5.99108 0.0197304 -0.265671 -0.000767736 0.128761 -0.0777125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1493 1543 0.0162058 -3.13924 -0.0190449 0.0606079 0.00816592 -0.015555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1543 1544 6.19967 -0.0738819 -0.254256 -0.00514373 0.0894225 -0.0341511 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1494 1544 -0.177366 -3.04872 -0.0104906 0.0844797 -0.0104946 0.0116971 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1544 1545 5.80372 -0.190032 -0.208933 0.011792 0.111487 -0.0834589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1495 1545 -0.0858572 -2.92129 -0.297449 0.0666936 -0.0156252 0.0074547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1545 1546 5.90347 -0.220884 -0.140256 -0.0100549 0.132204 -0.0889557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1496 1546 0.0849363 -3.10063 -0.118535 0.0541621 0.0220473 0.0796636 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1546 1547 5.67361 -0.293754 -0.41847 -0.00810889 0.113289 -0.00374694 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1497 1547 0.00887894 -2.96862 -0.172428 0.0553777 -0.00966336 0.0275099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1547 1548 5.81023 -0.230911 -0.205293 -0.00705718 0.121855 0.000586998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1498 1548 -0.0369421 -3.09309 -0.0425388 0.0604782 -0.002838 -0.00450717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1548 1549 5.91899 -0.330966 -0.474763 0.0150607 0.114179 -0.023839 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1499 1549 0.0949579 -3.08466 -0.209415 0.0614496 -0.0115627 0.00503602 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1549 1550 5.84152 -0.0485259 -0.3017 -0.0117662 0.123042 0.0554946 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1500 1550 0.00156628 -3.06113 -0.0297818 0.0620316 -0.0147953 0.0198973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1550 1551 6.0009 -0.22941 -0.520813 0.00754493 0.121408 -0.100827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1501 1551 0.0950155 -3.05002 -0.132304 0.0674602 -0.00983489 0.0192621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1551 1552 5.80783 -0.32215 -0.434128 -2.80624e-05 0.117024 -0.035786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1502 1552 0.0328266 -3.09963 -0.141513 0.0499989 -0.00280149 -0.0512595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1552 1553 5.6913 -0.441063 -0.306862 -0.00802477 0.113641 -0.102734 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1503 1553 0.140479 -3.04174 -0.105443 0.0728809 0.00146524 -0.00099028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1553 1554 5.78404 -0.338284 -0.317967 -0.0142854 0.11694 -0.0404216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1504 1554 -0.112078 -3.14015 -0.21846 0.0615923 0.00208856 -0.0240485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1554 1555 5.8828 -0.302725 -0.486025 -0.00174132 0.105688 -0.0931471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1505 1555 0.0407665 -2.93725 -0.290733 0.0665326 -0.00933265 0.0132741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1555 1556 5.8463 -0.146008 -0.253573 0.00686353 0.113494 -0.0883384 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1506 1556 0.183703 -2.96895 -0.050741 0.0669844 -0.00142952 -0.075122 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1556 1557 5.88169 -0.0990942 -0.408735 0.00277847 0.122369 -0.0335445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1507 1557 0.245295 -3.00013 -0.270078 0.0592498 -0.00141938 -0.0447121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1557 1558 5.82589 -0.166206 -0.358672 -0.00681034 0.109887 -0.034767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1508 1558 -0.0636927 -2.97486 -0.216055 0.0411978 0.00108876 -0.00738468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1558 1559 5.95843 -0.127235 -0.44534 -0.0048509 0.116929 -0.0735231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1509 1559 0.158999 -3.20143 -0.166864 0.0656541 0.0117994 -0.0127503 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1559 1560 5.6615 -0.215944 -0.416092 -0.00199412 0.114097 -0.037835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1510 1560 -0.0322777 -3.15676 -0.114948 0.0635113 -0.000208495 -0.0261909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1560 1561 5.76049 -0.29065 -0.573953 0.00210919 0.107692 -0.0737341 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1511 1561 0.321175 -3.04157 -0.108344 0.0582586 0.00382299 0.0219256 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1561 1562 5.81755 -0.0890094 -0.54307 0.00565565 0.111724 0.01841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1512 1562 0.0674057 -3.10072 -0.0309059 0.0514909 -0.0179714 0.01344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1562 1563 5.69892 -0.190968 -0.264943 0.0151608 0.115723 -0.0573675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1513 1563 -0.0832783 -3.01555 -0.0727245 0.0613226 -0.00813247 -0.0453113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1563 1564 6.12145 -0.215822 -0.489462 -0.00497218 0.103094 -0.0188962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1514 1564 0.00619854 -3.11583 0.00291023 0.068031 -0.0160581 0.00228582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1564 1565 5.92713 -0.250536 -0.332552 0.0109503 0.117666 -0.0521221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1515 1565 0.158505 -3.06267 0.0192168 0.0524892 0.0105107 -0.033417 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1565 1566 5.83814 -0.173257 -0.327372 -0.0166671 0.107469 -0.0955429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1516 1566 0.0508353 -3.05966 -0.196511 0.0923874 0.000389881 -0.0254827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1566 1567 5.66148 -0.192818 -0.217624 -0.00723749 0.113304 -0.0360662 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1517 1567 0.0834154 -3.07007 -0.131744 0.0650538 -0.000608748 0.0415096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1567 1568 5.82959 -0.212556 -0.381363 0.000963062 0.122671 -0.0292327 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1518 1568 0.047666 -3.10564 -0.0815679 0.0587136 -0.00366369 -0.0206969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1568 1569 5.81956 -0.211381 -0.352314 -0.00686106 0.103008 -0.11257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1519 1569 0.0416736 -3.09731 -0.264139 0.0585296 0.0160115 0.0477856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1569 1570 5.83564 -0.356768 -0.558223 -0.0133237 0.126058 -0.0423006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1520 1570 0.139476 -2.90002 -0.134585 0.0659699 0.00290329 0.0196701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1570 1571 5.83171 -0.181027 -0.400486 0.00524636 0.106886 -0.0737646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1521 1571 0.0682854 -2.98598 -0.353151 0.0732769 0.0222844 -0.0125969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1571 1572 5.85581 -0.165517 -0.537131 -0.0243718 0.111708 -0.0744955 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1522 1572 -0.01798 -2.99719 -0.204302 0.0644995 -0.00367124 -0.0670055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1572 1573 5.90662 -0.094729 -0.291514 0.00198291 0.122052 -0.0644589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1523 1573 -0.0701957 -3.22193 -0.0141426 0.0539316 0.00242078 0.00537524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1573 1574 5.90962 -0.35592 -0.277949 0.00248369 0.113239 -0.0925231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1524 1574 0.0515603 -3.02432 -0.246666 0.0580984 0.00999748 -0.142128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1574 1575 5.69246 -0.441492 -0.428471 -0.00504572 0.129279 -0.0408155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1525 1575 -0.0498292 -3.0713 -0.0289877 0.0630137 -0.00119014 -0.0407786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1575 1576 5.71801 -0.351783 -0.346667 0.00979633 0.115284 0.00246374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1526 1576 0.148204 -3.11252 -0.122259 0.0555761 -0.0036703 0.0288339 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1576 1577 5.77244 -0.230265 -0.342915 -0.00328031 0.115025 -0.0436336 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1527 1577 0.057824 -3.09071 -0.085049 0.0401411 0.00913436 -0.0359974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1577 1578 5.96243 -0.147179 -0.37116 -0.0039555 0.132521 -0.0497224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1528 1578 0.0276849 -2.89431 -0.0889154 0.0509554 0.00952733 -0.0592883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1578 1579 5.68104 -0.261293 -0.391156 -0.00653185 0.112687 -0.0203868 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1529 1579 0.0257364 -3.1602 0.056284 0.0510245 -0.000781618 0.0533957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1579 1580 5.68544 -0.0248533 -0.444981 -0.00369766 0.105983 -0.0652649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1530 1580 0.205012 -3.06721 -0.103237 0.0678933 0.020496 -0.00761364 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1580 1581 5.93609 -0.169332 -0.181955 0.0138779 0.121232 -0.0289522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1531 1581 -0.0751571 -3.10181 -0.069928 0.0572417 -0.0120146 0.0440557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1581 1582 5.54992 -0.152544 -0.285497 0.00375113 0.120941 -0.0198732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1532 1582 0.180332 -3.17757 -0.192242 0.0425063 0.00492029 -0.0480547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1582 1583 5.67688 -0.139629 -0.367766 -0.00637417 0.113013 -0.0728457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1533 1583 -0.178464 -2.93268 -0.171116 0.0673504 -0.0036134 0.0621937 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1583 1584 5.8078 -0.332436 -0.396811 0.00112272 0.100021 -0.0384031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1534 1584 -0.0968383 -3.09195 -0.222963 0.0571767 -0.000397247 0.0170741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1584 1585 5.77208 -0.121083 -0.305198 -0.00813589 0.109799 -0.0915337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1535 1585 -0.0803853 -3.0655 -0.10692 0.0444203 0.00743466 -0.0400119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1585 1586 5.70439 -0.0246809 -0.428153 -0.00870984 0.125529 -0.0734912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1536 1586 -0.124951 -3.0527 -0.0749644 0.0431358 0.0137238 -0.0515109 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1586 1587 5.94212 -0.104465 -0.20606 -0.0121571 0.12349 -0.0543809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1537 1587 0.0843247 -2.93162 -0.0166234 0.0579608 -0.011171 -0.0231839 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1587 1588 5.83269 -0.284165 -0.494471 0.00848985 0.103436 -0.10382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1538 1588 -0.0354141 -3.07986 -0.0371913 0.067683 -0.00406239 0.0530327 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1588 1589 5.70446 -0.2841 -0.283626 0.00537396 0.119674 -0.0595997 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1539 1589 0.0579006 -3.12999 -0.115683 0.0565248 0.0162626 0.02948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1589 1590 5.68211 -0.25275 -0.158042 0.00202559 0.122263 -0.0450793 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1540 1590 0.0309525 -3.05556 -0.144786 0.0561867 0.00374344 -0.0566783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1590 1591 5.3438 -0.36873 -0.190521 0.00091118 0.116146 -0.0852498 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1541 1591 -0.0824848 -3.09321 -0.136869 0.0649271 0.000256575 -0.00962566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1591 1592 5.78099 -0.294512 -0.425263 -0.00476385 0.11194 -0.0789823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1542 1592 0.102397 -3.25193 -0.0840623 0.0556791 0.00840076 0.0750726 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1592 1593 5.57376 -0.201251 -0.444932 -0.00649834 0.12421 -0.0145933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1543 1593 0.136431 -3.12683 -0.0761961 0.0501069 -0.000811528 -0.105396 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1593 1594 5.71974 -0.20467 -0.283885 -0.00187895 0.141016 -0.0746923 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1544 1594 -0.013614 -3.04535 -0.184227 0.0533517 -0.000210912 -0.0747208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1594 1595 5.75849 -0.20117 -0.357509 -0.0302811 0.112856 -0.0221186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1545 1595 0.00857537 -3.14204 -0.0663572 0.059851 0.0179518 0.0270832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1595 1596 5.61286 -0.0884936 -0.31422 -0.0126588 0.126457 -0.131374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1546 1596 0.152529 -2.94189 -0.138613 0.0683508 -0.0138919 -0.0557097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1596 1597 5.77492 -0.109292 -0.125878 -0.0171986 0.0984815 -0.064501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1547 1597 0.108353 -2.91482 -0.197133 0.0506047 0.00849604 -0.000736901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1597 1598 5.66117 -0.061563 -0.391314 0.00736351 0.1182 -0.0754743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1548 1598 -0.152337 -3.12747 -0.173032 0.0626554 -0.0187039 0.00766624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1598 1599 5.70526 -0.276877 -0.441099 -0.0143323 0.117723 -0.0839891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1549 1599 0.000407988 -3.12924 -0.276538 0.0588762 -0.000432243 -0.04753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1599 1600 5.60682 -0.120076 -0.330928 0.00628235 0.123539 -0.0347865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1550 1600 0.297469 -3.02632 -0.0428668 0.0787283 0.0125591 0.0137679 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1600 1601 5.64771 -0.279165 -0.443105 -0.00477294 0.11298 -0.0259905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1551 1601 -0.12387 -3.21715 -0.148698 0.0532849 0.00251894 -0.0117197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1601 1602 5.81012 -0.109233 -0.309062 0.00474167 0.099196 -0.136739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1552 1602 -0.155186 -2.95413 -0.126659 0.0566545 -0.0192055 -0.022744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1602 1603 5.70761 -0.264572 -0.515114 -0.00111677 0.111565 -0.0736347 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1553 1603 0.0382022 -3.02486 -0.0846732 0.0532651 -0.00646327 -0.0020424 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1603 1604 5.56281 -0.154022 -0.286283 0.000386446 0.124304 -0.0430972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1554 1604 0.0467163 -3.06866 -0.148987 0.0789478 -0.000201119 0.0389988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1604 1605 5.61783 -0.0363336 -0.268403 0.00221464 0.110349 -0.0525786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1555 1605 0.0791336 -3.02089 -0.121887 0.0555259 -0.00910509 -0.0231167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1605 1606 5.74654 -0.18503 -0.349848 0.00378276 0.11035 -0.069462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1556 1606 -0.142713 -2.99072 -0.305487 0.0679541 -0.00634749 0.041413 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1606 1607 5.76855 -0.165762 -0.152218 0.018543 0.115527 -0.0785103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1557 1607 0.150274 -3.20286 0.00644862 0.0586103 -0.00855788 0.0164565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1607 1608 5.63459 -0.338279 -0.284295 0.0188354 0.110066 -0.0604448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1558 1608 -0.0379044 -2.85366 -0.0437557 0.0717006 -0.0167016 -0.0155869 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1608 1609 5.73145 -0.0978749 -0.280522 -0.0114913 0.124443 -0.049845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1559 1609 -0.194397 -2.9518 -0.0592383 0.0518265 0.0133258 0.00922732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1609 1610 5.67285 -0.333748 -0.336244 0.00411706 0.103602 -0.116392 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1560 1610 -0.00375714 -3.02137 -0.0404717 0.0554744 0.0136632 0.0183815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1610 1611 5.53061 -0.231102 -0.283425 0.000615865 0.102973 0.0505642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1561 1611 -0.0358943 -3.12345 -0.00474627 0.0651309 0.0142175 0.0557261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1611 1612 5.5764 0.00283082 -0.230684 0.000994843 0.114451 -0.0761232 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1562 1612 0.0659228 -2.9928 -0.159089 0.0719509 -0.00304922 0.0385667 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1612 1613 5.64868 -0.286334 -0.280741 0.0111761 0.131229 -0.0608806 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1563 1613 -0.17369 -3.1001 -0.264821 0.050077 0.00404418 -0.0130707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1613 1614 5.74863 -0.217187 -0.232726 -0.000743087 0.11437 -0.07996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1564 1614 -0.0166508 -3.03011 -0.208047 0.0514598 -0.00331119 -0.0449084 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1614 1615 5.68037 -0.233575 -0.373229 0.00474925 0.112884 -0.0193557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1565 1615 -0.0967041 -2.97105 -0.11496 0.0519639 -0.00813856 0.0392753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1615 1616 5.78489 -0.209503 -0.292304 0.002241 0.116515 -0.0234287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1566 1616 0.0338935 -3.19303 -0.157456 0.058711 0.00313376 0.0199009 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1616 1617 5.60224 -0.178294 -0.329285 -0.00680134 0.124124 -0.0586121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1567 1617 -0.0162452 -3.15712 -0.279401 0.0719426 -0.00345568 0.0368333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1617 1618 5.4853 -0.336129 -0.462814 -0.0134851 0.109028 -0.0376728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1568 1618 -0.102844 -3.14731 -0.178781 0.0645585 0.000934957 0.0206786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1618 1619 5.65201 -0.208786 -0.318516 -0.000954612 0.113561 0.00449782 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1569 1619 0.0477148 -2.95365 -0.161581 0.0577269 -0.00294064 -0.0469588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1619 1620 5.71771 -0.319449 -0.41066 0.00201193 0.111473 -0.0832197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1570 1620 0.183173 -2.89732 -0.145997 0.080819 0.00356566 0.0232357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1620 1621 5.54848 -0.282517 -0.358541 0.0170185 0.0982016 -0.104919 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1571 1621 0.137378 -3.17708 -0.200221 0.0498387 -0.0114542 -0.00189167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1621 1622 5.53183 0.00483989 -0.35496 -0.00987197 0.11396 -0.0848484 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1572 1622 0.0461384 -2.98229 -0.0882955 0.0510345 -0.00211882 -0.0619753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1622 1623 5.53053 -0.383895 -0.163466 -0.00454234 0.118862 -0.122108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1573 1623 0.0796928 -3.21416 -0.0475025 0.0740122 -7.75462e-05 -0.0565686 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1623 1624 5.67842 -0.409818 -0.337252 -0.00709902 0.117899 -0.0734284 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1574 1624 0.222315 -3.06482 0.0530381 0.0611135 -0.00808136 -0.0360804 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1624 1625 5.75103 -0.248264 -0.4541 0.0126868 0.0978992 -0.00373233 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1575 1625 -0.108282 -3.08746 -0.165596 0.0592756 0.0058499 -0.0261984 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1625 1626 5.66925 -0.191549 -0.565643 0.0048126 0.110398 -0.134443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1576 1626 0.105345 -3.16815 0.0341791 0.0534489 0.00102422 -0.0270134 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1626 1627 5.41653 -0.29655 -0.217024 -0.0152272 0.121261 -0.0877128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1577 1627 0.00948316 -3.042 -0.148562 0.0789286 0.00402783 -0.00863581 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1627 1628 5.49879 -0.207547 -0.490245 -0.00604702 0.114273 -0.124554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1578 1628 -0.0972393 -3.00185 -0.170597 0.0736478 -0.00536017 0.0557376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1628 1629 5.36114 -0.0963816 -0.370428 0.00422355 0.11396 -0.142146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1579 1629 0.0342073 -2.9237 -0.121685 0.0627764 -0.00522617 -0.0503367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1629 1630 5.69037 -0.251802 -0.157803 -0.00074647 0.114668 -0.0777519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1580 1630 0.138625 -2.80367 -0.0962346 0.0688963 0.0209701 0.0596788 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1630 1631 5.49614 -0.285244 -0.193573 -0.0175016 0.10328 -0.0562671 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1581 1631 -0.133626 -2.93352 -0.0487959 0.0612235 -0.00694272 -0.0184481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1631 1632 5.61857 -0.180084 -0.260074 0.00309239 0.112297 -0.0385516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1582 1632 0.00200666 -3.12127 -0.0231594 0.0629602 0.00956999 -0.00110633 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1632 1633 5.61879 -0.227054 -0.202296 -0.00120255 0.0889981 -0.0333077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1583 1633 0.0254032 -3.03705 -0.191644 0.0691058 -0.0106546 0.0044343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1633 1634 5.44046 -0.08572 -0.407531 0.0039125 0.108116 -0.0925526 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1584 1634 -0.0988332 -3.11012 0.0885873 0.081753 0.0098446 -0.0196322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1634 1635 5.54424 -0.153366 -0.262257 0.0039212 0.12979 -0.00709443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1585 1635 -0.03036 -3.16518 -0.276968 0.064361 -0.0111223 -0.0921271 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1635 1636 5.6326 -0.388838 -0.346591 -0.0111498 0.120114 -0.00586186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1586 1636 0.00720786 -3.09961 -0.0169409 0.0650693 0.0104528 0.0500851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1636 1637 5.4785 -0.312539 -0.203813 0.00497026 0.103047 -0.0380676 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1587 1637 0.0104427 -3.20077 -0.143173 0.0664791 0.00280422 0.0466656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1637 1638 5.66111 -0.239979 -0.290939 -0.000742511 0.122235 -0.121049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1588 1638 -0.02948 -2.82963 -0.0371475 0.0492193 0.00582857 0.0596119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1638 1639 5.41803 -0.0392968 -0.216189 -0.00793861 0.114143 -0.0354136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1589 1639 0.0658815 -3.01629 -0.155712 0.0433198 -0.00759661 0.00226155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1639 1640 5.62971 -0.214313 -0.276993 0.00601698 0.102605 -0.0635528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1590 1640 0.181601 -3.23754 -0.0428018 0.0677251 -0.00278767 -0.0261613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1640 1641 5.75768 -0.199339 -0.281215 0.00940911 0.109109 -0.0396471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1591 1641 0.076053 -3.28055 -0.0558072 0.0614747 -0.0157336 -0.0197351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1641 1642 5.43598 -0.212853 -0.23949 0.00369504 0.108067 -0.0696886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1592 1642 -0.152447 -3.21976 -0.0570661 0.0626118 -0.00128048 -0.0754866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1642 1643 5.42725 -0.261564 -0.571297 -0.00760412 0.11099 -0.119274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1593 1643 0.0409769 -3.00659 -0.205898 0.0515276 0.00408202 -0.0310424 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1643 1644 5.42862 -0.13988 -0.44302 -0.00219361 0.11347 -0.0621839 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1594 1644 -0.153103 -2.8164 0.0547661 0.0784733 0.0144601 -0.0278942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1644 1645 5.64125 -0.18543 -0.207965 -0.00590996 0.102062 -0.0869638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1595 1645 -0.00201381 -3.14387 -0.0924819 0.0571935 0.000944579 -0.0415041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1645 1646 5.53901 -0.299434 -0.38595 0.0116954 0.108341 0.0209867 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1596 1646 -0.038192 -3.05168 -0.0614017 0.0524556 -0.0061408 0.0432445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1646 1647 5.46448 -0.124707 -0.180061 -0.0131195 0.116975 -0.0928159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1597 1647 0.126749 -3.1517 0.0630315 0.0701366 0.00112528 0.00316337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1647 1648 5.63194 -0.0755708 -0.368714 0.00341192 0.107138 -0.0587038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1598 1648 -0.0975346 -2.98387 -0.0200672 0.0753017 -0.00285773 -0.0201186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1648 1649 5.52432 -0.24094 -0.26555 0.008667 0.116997 -0.0487044 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1599 1649 0.0902319 -3.21333 -0.176788 0.0612723 -0.00831218 -0.0744219 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1649 1650 5.54032 -0.285128 -0.341258 -0.0136427 0.123151 -0.0722945 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1600 1650 0.0113906 -2.93396 -0.0407956 0.0563525 0.0107655 -0.00287557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1650 1651 5.52155 -0.207308 -0.122315 -0.00653354 0.124109 -0.0926272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1601 1651 -0.0993613 -2.90503 -0.0932279 0.0495431 -0.00706941 0.0223639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1651 1652 5.27444 -0.236102 -0.404528 -0.00798657 0.113578 -0.038441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1602 1652 0.0681438 -3.04095 -0.297807 0.0526162 0.00716833 0.0222933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1652 1653 5.51253 -0.220782 -0.167644 -0.0157178 0.0954799 -0.0720011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1603 1653 -0.0878251 -3.15728 -0.148614 0.0758602 0.00323297 0.0177011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1653 1654 5.38209 -0.314531 -0.468195 0.00968066 0.108625 -0.0828892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1604 1654 0.0712583 -3.05481 -0.235197 0.0515433 -0.0069804 -0.043173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1654 1655 5.53469 -0.158532 -0.279071 0.0108189 0.112169 -0.0741669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1605 1655 -0.0625302 -2.9818 -0.0786953 0.0714198 0.00366227 -0.067973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1655 1656 5.47425 -0.182735 -0.315019 -0.0133892 0.109108 -0.0818932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1606 1656 0.0938803 -3.08946 -0.413693 0.0418843 -0.00223879 -0.0294188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1656 1657 5.55803 -0.23683 -0.218304 -0.00923203 0.132747 0.0104853 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1607 1657 0.0369366 -3.05858 -0.198546 0.0577019 -0.010494 0.0829879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1657 1658 5.54262 -0.238804 -0.360897 0.00975698 0.103127 -0.0703173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1608 1658 0.00161531 -3.15978 -0.0607119 0.0664338 -0.00553071 0.0184819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1658 1659 5.56632 -0.158518 -0.286174 -0.0120564 0.118405 -0.0629932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1609 1659 -0.0103481 -3.15779 -0.0547871 0.0592434 -0.00952148 -0.0456869 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1659 1660 5.42069 -0.481186 -0.478567 0.00933092 0.116507 -0.0341024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1610 1660 -0.0548329 -3.13305 -0.153966 0.0520365 0.0111749 -0.0298809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1660 1661 5.72129 -0.0861371 -0.0544607 -0.0102156 0.10542 -0.0130278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1611 1661 -0.0671868 -3.33123 -0.0408857 0.0703234 -0.015364 -0.0474052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1661 1662 5.52541 -0.248406 -0.425005 -0.0198206 0.0909803 -0.0786283 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1612 1662 0.140147 -2.82919 -0.171349 0.0719486 0.00466138 -0.0207814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1662 1663 5.60399 -0.138925 -0.218597 -0.0110683 0.104951 -0.0288543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1613 1663 -0.0396074 -2.93462 -0.184178 0.0590053 -0.0013146 0.00881843 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1663 1664 5.63845 -0.206175 -0.164425 -0.00824896 0.101925 -0.101831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1614 1664 -0.110135 -3.04507 0.0684345 0.0806635 0.00947116 -0.0764552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1664 1665 5.48893 -0.172662 -0.354478 -0.0131798 0.0969381 -0.0105414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1615 1665 -0.00200346 -3.0994 0.052167 0.043864 0.00934771 0.00480478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1665 1666 5.60033 -0.117329 -0.276369 0.000746666 0.0918276 -0.0506355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1616 1666 -0.00590666 -2.91518 -0.0742091 0.0581915 3.59225e-05 0.0271654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1666 1667 5.31158 -0.302827 -0.257372 -0.00469752 0.113483 -0.0782334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1617 1667 0.0460345 -3.09381 -0.0892004 0.0739722 0.0189058 -0.0105247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1667 1668 5.30232 -0.248693 -0.609168 0.00399492 0.108062 -0.123087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1618 1668 -0.0160461 -3.08989 -0.20474 0.0399664 0.0133005 -0.0661245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1668 1669 5.41677 -0.211496 -0.2647 -0.000299844 0.119286 -0.0386435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1619 1669 0.0475918 -3.05535 -0.120123 0.0661918 0.00667878 -0.0267463 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1669 1670 5.46626 -0.0506232 -0.434064 0.00498049 0.100567 -0.0458024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1620 1670 0.160021 -3.10133 -0.0992102 0.0577509 -0.0181986 -0.0203886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1670 1671 5.52434 -0.137252 -0.341014 -0.0104677 0.0975904 -0.0226001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1621 1671 -0.175509 -2.99319 0.148156 0.0534119 0.0129769 0.0280177 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1671 1672 5.38058 -0.302676 -0.0714206 -0.0128491 0.113251 -0.0194697 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1622 1672 0.0694192 -3.16129 -0.0963938 0.0667254 -0.00979451 -0.0309278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1672 1673 5.45055 -0.173234 -0.296356 -0.000592449 0.0965307 -0.0183261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1623 1673 -0.0428872 -2.81883 -0.291116 0.0622938 -0.00688944 -0.0118973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1673 1674 5.47176 -0.421152 -0.336756 0.00706709 0.118123 -0.021886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1624 1674 -0.0375019 -3.02594 -0.0849859 0.0560455 -0.0198905 0.0233997 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1674 1675 5.48972 -0.260733 -0.242777 -0.0157526 0.112245 -0.0626784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1625 1675 -0.0517798 -3.06874 -0.308725 0.0649374 -0.00821055 -0.0277186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1675 1676 5.18825 -0.287163 -0.161593 0.00552439 0.121365 -0.0118932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1626 1676 0.0643848 -3.18905 -0.188479 0.0701268 0.00304083 -0.0421675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1676 1677 5.24264 -0.381415 -0.28704 -0.0119082 0.115904 -0.0588984 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1627 1677 -0.115431 -3.06355 -0.11944 0.0608747 -0.00233747 -0.0338837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1677 1678 5.36808 -0.522253 -0.296253 -0.0119816 0.122273 -0.0556066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1628 1678 -0.110637 -3.08698 -0.0296284 0.0729156 -0.00786997 0.0139269 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1678 1679 5.29391 -0.375306 -0.426814 -0.0136422 0.112174 -0.0308639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1629 1679 0.15098 -2.99992 -0.0210215 0.0427021 0.000205052 -0.0707799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1679 1680 5.30603 -0.149564 -0.225105 0.00542077 0.119318 -0.124558 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1630 1680 0.0590887 -2.98946 -0.289894 0.0584781 -0.0165178 -0.0400762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1680 1681 5.43539 -0.216739 -0.279844 -0.0100303 0.114169 -0.0626758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1631 1681 -0.0725235 -3.25599 -0.0819169 0.0496319 -0.000273978 -0.0130374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1681 1682 5.39725 -0.296233 -0.22819 -0.0178416 0.113091 -0.0903468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1632 1682 0.107594 -3.05843 -0.183283 0.0534378 0.011724 -0.0158117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1682 1683 5.50438 -0.0940604 -0.384976 -0.00665726 0.102489 -0.0654925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1633 1683 0.0412327 -2.97898 -0.191612 0.0663011 0.0096541 -0.0174495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1683 1684 5.39524 -0.221685 -0.14542 -0.0111 0.130316 -0.0342428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1634 1684 -0.118428 -3.04648 8.63391e-05 0.0662929 -0.0126526 -0.0359134 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1684 1685 5.47863 -0.290319 -0.26666 -0.00853284 0.116885 -0.0131467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1635 1685 -0.0262526 -2.97872 -0.0666303 0.0784035 -0.0144846 0.0231709 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1685 1686 5.40783 -0.263143 -0.175894 0.00415399 0.108542 -0.0806445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1636 1686 0.00612217 -3.09045 -0.0383116 0.0623278 -0.0097341 0.00739669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1686 1687 5.43558 -0.392199 -0.311421 -0.00840441 0.109613 -0.077788 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1637 1687 0.061165 -2.83709 -0.02318 0.0742605 -0.0150954 -0.0140377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1687 1688 5.30549 -0.266912 -0.536441 -0.00100288 0.112194 -0.0535861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1638 1688 -0.202789 -3.12508 -0.061688 0.056443 0.00677952 0.0203563 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1688 1689 5.40989 -0.0817816 -0.146584 -0.00350565 0.103753 -0.0778912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1639 1689 0.102684 -3.05348 -0.159201 0.068554 0.00590927 -0.0599095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1689 1690 5.43296 -0.096869 -0.280769 -0.00255301 0.109075 -0.00396185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1640 1690 -0.123522 -3.07836 -0.0645511 0.0496427 -0.00145858 0.0784978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1690 1691 5.28814 -0.373082 -0.575759 -0.0036033 0.113473 -0.179572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1641 1691 -0.214862 -3.04197 0.0174581 0.0478059 -0.00651916 -0.000340415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1691 1692 5.33409 -0.22076 -0.218809 -0.00853651 0.113742 -0.0647997 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1642 1692 -0.0999051 -3.14174 -0.0649029 0.0790391 0.000303399 0.00640238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1692 1693 5.3397 -0.135899 -0.339108 0.00488595 0.105167 -0.101286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1643 1693 -0.0270549 -3.09517 0.0979253 0.0521506 0.00031477 -0.0142848 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1693 1694 5.39282 -0.0952923 -0.251287 0.005865 0.110969 -0.0707873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1644 1694 0.251858 -3.13504 -0.0540823 0.052765 0.00615171 0.0093411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1694 1695 5.22027 -0.247357 -0.328483 -0.00466415 0.117178 0.0409995 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1645 1695 0.0632309 -3.10388 -0.143395 0.0639042 0.0173622 -0.0326657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1695 1696 5.26518 -0.167352 -0.412785 0.00966509 0.109422 -0.0921209 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1646 1696 -0.0132941 -3.06547 0.155902 0.0627379 0.00394893 0.0536723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1696 1697 5.24761 -0.303176 -0.339079 -0.00793687 0.102205 0.00146887 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1647 1697 0.15223 -3.0546 0.0286233 0.0557066 -0.00211994 0.0583085 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1697 1698 5.31741 -0.07745 -0.215945 -0.00178904 0.117647 -0.00358666 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1648 1698 -0.00535924 -2.83381 -0.140466 0.0682319 -0.0181336 0.00634813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1698 1699 5.4001 -0.324897 -0.213265 -0.00251519 0.11234 -0.0033435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1649 1699 0.118396 -3.08906 0.0453904 0.0573686 -0.00401473 0.0640535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1699 1700 5.31005 -0.212246 -0.0792141 -0.00872768 0.114238 -0.0389002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1650 1700 -0.00102611 -3.14787 -0.167715 0.0488781 -0.0151907 -0.0430835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1700 1701 5.32973 -0.20021 -0.263265 -0.00287997 0.110193 -0.0491445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1651 1701 -0.0433758 -2.96061 0.0751878 0.0685861 0.00402185 -0.00999983 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1701 1702 5.37667 -0.158821 -0.385745 0.00759807 0.112303 -0.0616547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1652 1702 0.11179 -3.12457 -0.364802 0.04401 -0.0123255 0.0637295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1702 1703 5.37615 -0.269116 -0.350623 0.000168484 0.117107 -0.0109136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1653 1703 -0.154935 -3.04908 -0.0287741 0.0530416 -0.0213127 0.00707095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1703 1704 5.21114 -0.263812 -0.0860465 -0.01049 0.0939937 -0.125626 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1654 1704 0.135974 -3.11749 -0.234774 0.0714388 0.0179497 0.0649358 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1704 1705 5.3006 -0.226295 -0.387647 -0.0118594 0.10442 -0.0669425 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1655 1705 0.0437273 -3.16784 -0.196305 0.0563562 0.0143828 0.0346647 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1705 1706 5.35171 -0.137301 -0.279671 0.0138223 0.123434 -0.0268814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1656 1706 0.0506714 -3.08938 -0.0608264 0.06271 0.00346024 -0.0206133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1706 1707 5.34153 -0.227327 -0.349089 0.00672268 0.105672 -0.0873741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1657 1707 0.0812404 -3.04582 -0.0344527 0.0544687 -0.00216403 -0.000556519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1707 1708 5.15051 -0.193634 -0.419786 -0.0129222 0.101682 -0.0875975 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1658 1708 0.0544718 -3.13966 -0.0445559 0.0692005 -0.00721094 -0.0226742 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1708 1709 5.3675 -0.434195 -0.228045 -0.022604 0.113593 -0.0448314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1659 1709 -0.0549216 -3.11848 0.0220124 0.0546264 -0.0101745 -0.0459723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1709 1710 5.21468 -0.223632 -0.158705 -0.000110622 0.10327 -0.0635111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1660 1710 0.00410954 -2.88244 -0.139973 0.0776505 0.00926517 -0.0156711 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1710 1711 5.35165 -0.192269 -0.328329 -0.0144935 0.107748 -0.134481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1661 1711 -0.208269 -2.79218 -0.0660456 0.0619961 0.00837778 -0.017742 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1711 1712 5.31447 -0.371108 -0.160969 -0.0246961 0.0900557 -0.138832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1662 1712 -0.0558018 -3.05597 -0.129454 0.0749731 0.00570612 0.0726595 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1712 1713 5.09853 -0.179806 -0.156039 -0.00233622 0.114513 -0.0685277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1663 1713 0.0266015 -2.95221 -0.206465 0.0488209 0.00889565 0.0232198 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1713 1714 5.22918 -0.340417 -0.245276 -0.0103863 0.101745 -0.0833775 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1664 1714 -0.0221156 -2.94292 -0.0317615 0.0769271 -0.00259843 -0.0516553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1714 1715 5.34764 -0.145038 -0.320751 -0.0111109 0.109721 -0.021115 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1665 1715 0.0581985 -3.07787 -0.0319369 0.0710848 -0.0139158 0.0985367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1715 1716 5.21627 -0.277662 -0.318961 0.00749723 0.0880979 -0.0550252 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1666 1716 0.0506571 -3.02512 -0.0852228 0.0427903 -0.0134995 0.0130409 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1716 1717 5.46677 -0.192156 -0.254347 -0.00247721 0.118075 -0.118221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1667 1717 0.077404 -3.0042 -0.107131 0.0786723 -0.00227383 0.0321633 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1717 1718 5.12361 -0.182455 -0.311828 -0.0052538 0.096407 -0.0909123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1668 1718 0.0409891 -3.05918 0.0264745 0.045631 0.00669727 0.00281707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1718 1719 5.15102 -0.340883 -0.248257 -0.00522952 0.118697 -0.0599244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1669 1719 0.108854 -3.03893 -0.0885588 0.0577416 -0.0204497 -0.0250257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1719 1720 5.1014 -0.305378 -0.135992 -0.0235389 0.107511 -0.0544182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1670 1720 0.155178 -2.92992 -0.0914363 0.0521235 0.00990708 0.0406062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1720 1721 5.09683 -0.30535 -0.338787 -0.00779872 0.124067 -0.0339609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1671 1721 0.0784795 -2.79313 -0.310891 0.049882 -0.0159659 -0.00936441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1721 1722 5.23714 -0.322653 -0.234773 -0.00242734 0.113848 -0.0641167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1672 1722 0.139524 -3.07754 -0.153381 0.0482207 -0.013061 0.034499 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1722 1723 5.22082 -0.117568 -0.246577 -0.0120677 0.0996088 -0.0711965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1673 1723 -0.130169 -3.03599 -0.273301 0.0520484 0.00692607 0.00524426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1723 1724 5.3624 -0.365673 -0.274439 0.00251912 0.0941435 -0.0844526 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1674 1724 0.0779968 -3.1295 0.00196105 0.0851071 -0.000128804 0.120796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1724 1725 5.37723 -0.142066 -0.0682578 -0.0042974 0.115647 -0.0729801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1675 1725 -0.0435085 -3.10494 -0.320083 0.0848444 0.021352 0.0667564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1725 1726 5.23363 -0.300123 -0.344702 -0.00255536 0.116403 -0.0808624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1676 1726 -0.0301303 -2.9805 -0.214438 0.0574105 0.00595831 0.0523378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1726 1727 5.28022 -0.266609 -0.314112 -0.0237049 0.0969272 -0.0415865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1677 1727 -0.0183632 -3.19129 -0.00449826 0.0575552 -0.00375288 0.00847265 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1727 1728 5.25237 -0.14767 -0.327057 0.0031337 0.101626 -0.0452932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1678 1728 0.111327 -3.07551 -0.0892905 0.0525536 0.0143075 -0.0285053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1728 1729 5.41879 -0.238739 -0.181582 0.00604898 0.109823 -0.0949593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1679 1729 -0.0589236 -3.02074 0.0763044 0.075601 0.0041462 -0.0342464 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1729 1730 5.38416 -0.108165 -0.258329 -0.00526292 0.10416 -0.0508566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1680 1730 -0.0988038 -3.07371 -0.108336 0.0748652 -0.0146594 -0.0327911 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1730 1731 5.27998 -0.339819 -0.244178 -0.0257112 0.121404 -0.0603909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1681 1731 -1.00753e-05 -2.92608 -0.106771 0.0740366 -0.0114927 0.0323707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1731 1732 5.20375 -0.172093 -0.143254 -0.0116436 0.0910198 -0.0500723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1682 1732 0.0997533 -2.99329 -0.129506 0.0518241 0.0215475 0.0241953 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1732 1733 5.36092 -0.113734 -0.209393 -0.0151156 0.108803 -0.0361898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1683 1733 -0.0855856 -3.06501 0.0632772 0.054403 -0.0133323 -0.054223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1733 1734 5.00381 -0.183795 -0.27611 0.0214675 0.0969569 -0.0730745 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1684 1734 -0.0372099 -3.0216 -0.239376 0.0554562 -0.00653835 -0.0796314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1734 1735 5.15945 -0.388414 -0.377163 -0.0127909 0.0959744 -0.0911948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1685 1735 -0.0751894 -3.03127 -0.0171367 0.0702485 -0.00316761 -0.0179208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1735 1736 5.13365 -0.344961 -0.269009 -0.0248953 0.115518 -0.120135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1686 1736 0.0683954 -3.05474 -0.0261658 0.0664722 -0.0024304 0.003431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1736 1737 5.34535 -0.355494 -0.313169 -0.0120609 0.0891939 -0.121664 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1687 1737 0.0897784 -2.94217 -0.106125 0.0512759 -0.00830643 0.0132204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1737 1738 5.1421 -0.149039 -0.236403 0.00496833 0.0957299 -0.0839081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1688 1738 -0.0233192 -3.20379 0.0603546 0.0476192 0.00335686 0.044507 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1738 1739 5.26696 -0.210099 -0.538185 0.00125349 0.098402 -0.0823363 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1689 1739 0.0312816 -3.02489 -0.125454 0.0498953 0.00227936 -0.0342217 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1739 1740 5.11757 -0.240167 -0.202272 0.000225482 0.0918612 -0.0856793 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1690 1740 0.050222 -3.08711 -0.260233 0.0536449 -0.000627557 -0.00562751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1740 1741 5.09557 -0.261468 -0.226319 -0.0165765 0.105763 -0.0712561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1691 1741 0.000232103 -3.12867 -0.0661392 0.052384 -0.0102861 0.0153483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1741 1742 5.1509 -0.31557 -0.33131 -0.0178079 0.110371 -0.0635718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1692 1742 -0.00234648 -3.00674 -0.064097 0.0712402 -0.00768645 0.0672575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1742 1743 5.05177 -0.271059 -0.220028 -0.000639199 0.102502 -0.051658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1693 1743 0.0151753 -2.96066 -0.0288111 0.0821135 -0.00185153 0.025916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1743 1744 5.17976 -0.309352 -0.346285 -0.00847352 0.096469 -0.0601704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1694 1744 0.0376473 -3.11896 0.159874 0.0753405 0.0138827 0.0268798 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1744 1745 5.08443 -0.232754 -0.192742 -0.0157728 0.104767 -0.00356622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1695 1745 -0.00373479 -2.95707 -0.035569 0.0556143 -0.0116211 -0.00392871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1745 1746 5.06282 -0.148988 -0.108716 -0.00615296 0.100331 -0.0398386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1696 1746 -0.144719 -3.07335 0.0154428 0.0638846 -0.0281165 0.0281369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1746 1747 5.13999 -0.351509 -0.28481 -0.00315093 0.100755 -0.0257939 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1697 1747 0.0831829 -2.96305 -0.19567 0.0707313 0.0016152 0.0621866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1747 1748 5.10221 -0.208006 -0.111125 0.000933293 0.0990091 -0.0491483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1698 1748 0.0399274 -3.04172 -0.0943693 0.0556363 0.00446933 0.0138841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1748 1749 5.19163 -0.316871 -0.0556211 -0.00661727 0.0947991 -0.119547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1699 1749 -0.0447719 -3.14214 -0.068291 0.0429456 0.000466281 -0.0298963 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1749 1750 4.96233 -0.0370499 -0.338332 0.00655668 0.110331 -0.0988197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1700 1750 0.0294699 -3.11978 -0.0135458 0.0605065 0.0182167 0.0120151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1750 1751 5.13469 -0.168774 -0.208992 -0.0211247 0.102718 -0.0321316 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1701 1751 -0.224595 -3.0665 -0.0867665 0.0639967 -0.00473644 -0.0232712 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1751 1752 5.05912 -0.0357039 -0.0785567 -0.0203671 0.106647 -0.101273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1702 1752 -0.0987004 -3.09572 -0.168813 0.0610131 -0.00065001 -0.0102696 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1752 1753 5.18405 -0.16026 -0.226098 -0.00242535 0.103807 -0.0744918 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1703 1753 0.0928793 -3.01206 -0.00747065 0.0655767 0.00581311 0.00957212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1753 1754 5.15883 -0.336766 -0.316554 0.00359139 0.0884198 -0.0759128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1704 1754 0.136436 -3.29781 -0.010292 0.070665 0.00556715 -0.0138147 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1754 1755 4.94534 -0.154155 -0.15906 0.0117564 0.0970189 -0.0871264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1705 1755 -0.0985199 -2.9693 0.130487 0.0520932 -0.013393 0.00759027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1755 1756 5.02992 -0.316172 -0.225531 -0.0046333 0.0966119 -0.0112592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1706 1756 -0.0243237 -3.13349 -0.0924315 0.065697 0.0123383 0.048212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1756 1757 5.03435 -0.277086 -0.254374 3.57966e-06 0.0783776 -0.107226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1707 1757 0.038385 -3.1399 -0.0395141 0.0553597 0.000830794 -0.0713513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1757 1758 4.918 -0.183459 -0.33853 0.00231255 0.124888 -0.0310429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1708 1758 -0.0217017 -2.9289 -0.0520931 0.0599912 -0.00831103 -0.00798498 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1758 1759 5.0202 -0.258962 -0.319223 0.0081808 0.104246 -0.106029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1709 1759 0.02184 -3.07267 -0.118739 0.0654458 0.00755739 0.0503701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1759 1760 5.09639 -0.0864276 -0.231226 -0.0211054 0.0807318 -0.0707132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1710 1760 0.0835784 -3.02283 -0.212193 0.0521434 -0.0170137 0.0203284 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1760 1761 5.11283 -0.375161 -0.165648 -0.0271125 0.0947828 -0.0889622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1711 1761 0.0616834 -3.16791 -0.119757 0.0595417 0.0107941 0.0377087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1761 1762 5.16159 -0.228799 -0.251336 -0.0126219 0.119838 -0.110506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1712 1762 -0.0229592 -2.96465 -0.0271811 0.0533317 -0.00719889 -0.0263462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1762 1763 5.18125 -0.27907 -0.271409 -0.00428465 0.0986156 -0.153796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1713 1763 0.0254188 -3.035 -0.087917 0.0618986 0.00247026 -0.0778262 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1763 1764 5.04027 -0.203104 -0.169254 0.00279834 0.0937873 -0.0783212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1714 1764 -0.0385847 -3.06702 -0.000142204 0.0766439 0.0086413 -0.036947 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1764 1765 5.12174 -0.236564 -0.215704 -0.00714981 0.114455 -0.0529487 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1715 1765 -0.0373318 -2.9153 -0.0751231 0.067205 -0.00803852 0.0710451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1765 1766 5.26865 -0.233047 -0.208571 -0.00889891 0.105851 -0.0735401 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1716 1766 0.0665495 -3.08995 -0.0838247 0.0419185 -0.00357765 -0.00864219 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1766 1767 5.11228 -0.199159 -0.253987 -0.00393215 0.102707 -0.0869522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1717 1767 0.115077 -3.11648 -0.0208489 0.0590557 0.00787203 -0.0181757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1767 1768 5.12173 -0.184384 -0.282995 -0.0193505 0.0846426 -0.0764836 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1718 1768 -0.152788 -3.07458 -0.0430562 0.0588557 0.0114501 -0.0152301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1768 1769 5.02767 -0.344458 -0.310333 -0.0190489 0.108258 -0.0759524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1719 1769 0.0290396 -2.93778 -0.174998 0.0586799 0.000185658 -0.0514896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1769 1770 5.09559 -0.0512366 -0.271712 -0.0215205 0.0966126 -0.108596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1720 1770 0.0872993 -3.17508 -0.300186 0.069219 -0.00729303 -0.0136273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1770 1771 5.11342 -0.280845 -0.207459 0.00802989 0.0992093 -0.0205482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1721 1771 -0.0808485 -2.98209 0.0666504 0.0571862 -0.0170698 0.025118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1771 1772 5.17651 -0.306526 -0.253489 -0.0076864 0.100045 -0.0697205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1722 1772 -0.0741631 -3.10956 -0.357373 0.0438161 0.016262 0.0270955 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1772 1773 5.11425 -0.225281 -0.230751 0.00489981 0.10891 -0.0410992 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1723 1773 -0.0024191 -3.04392 -0.13162 0.0654803 -0.00389728 0.0342213 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1773 1774 4.94863 -0.196555 -0.208993 -0.0169112 0.091039 -0.0534657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1724 1774 -0.061164 -3.11648 -0.101092 0.0597395 -0.000715408 0.00704871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1774 1775 5.06016 -0.20434 -0.0522081 -0.00848024 0.101393 -0.0882082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1725 1775 0.0422005 -3.21286 -0.101498 0.051245 0.000673453 0.0488583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1775 1776 5.10048 -0.309485 -0.109571 -0.0065981 0.10455 -0.0625986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1726 1776 -0.0693445 -2.94606 0.00886117 0.0621589 0.00580464 0.0569154 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1776 1777 4.98326 -0.158293 -0.304665 0.00892294 0.100281 -0.0825051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1727 1777 0.0283331 -3.04883 -0.0458735 0.055171 -0.0234592 -0.0263705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1777 1778 5.07 -0.171504 -0.110436 -0.00229188 0.113286 -0.0761549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1728 1778 0.0956368 -3.06028 -0.115547 0.0611168 -0.00355672 0.0148993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1778 1779 5.19136 -0.287359 -0.306423 0.000523697 0.110397 -0.0877705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1729 1779 -0.0217363 -2.95882 -0.147397 0.0513307 0.00683968 0.00219447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1779 1780 5.0023 -0.344019 -0.126438 -0.00329916 0.100815 -0.0913329 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1730 1780 0.0993559 -3.08697 -0.146995 0.0711057 0.000420213 -0.0240329 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1780 1781 5.0345 -0.482599 -0.148384 0.00983611 0.102309 -0.0336878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1731 1781 0.269392 -3.16796 -0.106407 0.0614438 0.000933647 -0.0873864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1781 1782 4.92071 -0.324862 -0.241897 0.00135277 0.0816579 -0.0972105 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1732 1782 0.0567221 -3.09554 -0.117844 0.0579469 0.0188528 0.0401364 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1782 1783 4.82176 -0.337135 -0.0834293 0.0144756 0.0937229 -0.0114978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1733 1783 -0.0383315 -3.05183 -0.165114 0.0806398 0.00921275 -0.029123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1783 1784 5.05136 -0.257181 -0.317027 -0.00288921 0.101461 -0.0964022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1734 1784 0.0273392 -3.22064 -0.0606707 0.0471434 0.0119806 -0.0591094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1784 1785 4.89393 -0.181988 -0.298799 -0.000145038 0.126299 -0.0134191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1735 1785 0.0179814 -3.19759 -0.0163119 0.0762702 0.0104228 -0.020123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1785 1786 5.0384 -0.128486 -0.212315 0.0123447 0.100283 -0.0807534 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1736 1786 -0.0580247 -3.14452 -0.0615037 0.0506813 -0.00878618 -0.0378451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1786 1787 5.02545 -0.460312 -0.180722 -0.019587 0.0858189 -0.0222926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1737 1787 -0.0142271 -2.91858 -0.216564 0.0617981 -0.0109615 0.0693965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1787 1788 4.83218 -0.198488 -0.344257 -0.00615943 0.0987421 -0.0695063 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1738 1788 0.0322481 -3.35482 -0.0579082 0.0517647 -0.00869215 -0.0415983 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1788 1789 4.90438 -0.208304 -0.292683 -0.018938 0.0827866 -0.0553459 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1739 1789 -0.107296 -3.17349 -0.00766549 0.0452655 -0.0115544 -0.0189254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1789 1790 5.09904 -0.261975 -0.275921 -0.00798948 0.101937 -0.0826196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1740 1790 -0.0283242 -3.10696 -0.151051 0.0808494 -0.0199533 0.0043042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1790 1791 4.92126 -0.296514 -0.183025 -0.0027896 0.0920821 -0.0972734 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1741 1791 0.129306 -3.07778 -0.0748081 0.0680715 0.0324997 -0.00785929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1791 1792 4.92158 -0.187052 -0.278332 -0.00171466 0.0893782 -0.0491221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1742 1792 0.0474685 -3.21232 -0.076853 0.0570036 0.00561036 0.020444 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1792 1793 4.98289 -0.235286 -0.136228 0.00142005 0.106536 -0.139555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1743 1793 0.0387287 -3.04757 -0.152162 0.0675135 -0.0161684 -0.0485659 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1793 1794 4.95651 -0.211982 -0.330773 -0.0129083 0.109445 -0.0489901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1744 1794 0.109502 -3.01428 -0.0774052 0.0626841 -0.00164219 -0.0207031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1794 1795 4.90502 -0.40185 -0.176247 0.00303706 0.118182 -0.105131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1745 1795 -0.00973706 -3.02964 -0.146674 0.0705599 -0.00153592 -0.0494031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1795 1796 4.98873 -0.090772 -0.125356 0.00267283 0.0968311 -0.090112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1746 1796 -0.216773 -2.97528 -0.322252 0.0536997 0.0110756 0.0888586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1796 1797 4.75329 -0.0154757 -0.10417 0.00243186 0.0985611 -0.0735988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1747 1797 0.118012 -3.03699 -0.104414 0.0640525 -0.0279547 0.0438113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1797 1798 4.92674 -0.109837 -0.138109 0.0160474 0.0958195 -0.11533 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1748 1798 -0.0150702 -3.06263 -0.131972 0.0633138 -0.0113576 0.0081699 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1798 1799 4.90501 -0.347689 -0.231813 0.00569333 0.0983242 -0.135091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1749 1799 0.0492402 -3.07448 -0.168954 0.075632 -0.0294492 -0.0414156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1799 1800 4.77922 -0.223 -0.165329 -0.00747573 0.0908522 -0.0747077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1750 1800 0.182859 -3.05399 -0.0975698 0.0572889 0.000289157 -0.0183538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1800 1801 5.09266 -0.282487 -0.304662 -0.0108894 0.10383 0.0150758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1751 1801 -0.152133 -3.16877 -0.149779 0.0649602 -0.0129182 -0.00521459 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1801 1802 4.97544 -0.211475 -0.223103 -0.0023098 0.0949104 -0.191431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1752 1802 0.125603 -3.09023 -0.0306891 0.0616846 0.00807663 0.0223447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1802 1803 4.77412 -0.318084 0.0552795 -0.0165723 0.0905459 -0.0305154 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1753 1803 -0.0365699 -3.04003 -0.15614 0.0692653 0.000997783 -0.0163272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1803 1804 4.80861 -0.26475 -0.388229 -0.0159291 0.0825196 -0.104522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1754 1804 0.0302507 -3.08727 -0.270373 0.0583092 -0.0160674 -0.034554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1804 1805 4.88532 -0.165758 -0.228279 -0.00501391 0.0972952 -0.0472278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1755 1805 0.0189872 -3.05832 -0.242167 0.0624271 -0.00301431 -0.00764289 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1805 1806 4.9284 -0.132573 -0.231986 -0.0122576 0.113036 -0.0439441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1756 1806 -0.012015 -3.03427 -0.124307 0.0703052 -0.00725931 0.0189767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1806 1807 4.77373 -0.360763 -0.212926 0.00205494 0.0947878 -0.0831569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1757 1807 0.0375861 -3.06606 -0.22404 0.0762869 -0.00250805 0.0331713 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1807 1808 4.85952 -0.260821 -0.139659 -0.0153147 0.0892659 -0.145059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1758 1808 -0.0955637 -2.97001 0.115194 0.0647913 -0.0138467 -0.0826333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1808 1809 4.82634 -0.171044 -0.203148 -0.0176003 0.0944871 -0.0478894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1759 1809 -0.114555 -2.943 -0.0308129 0.0683268 -0.00557105 0.0175325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1809 1810 4.95183 -0.208995 -0.101037 -0.0179122 0.0973581 -0.0989459 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1760 1810 0.0123224 -3.24788 -0.212326 0.0483225 0.00452046 -0.0171185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1810 1811 4.79758 -0.32531 -0.122337 -0.000533753 0.104216 -0.0920073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1761 1811 -0.0408912 -3.00739 0.0422893 0.0794163 0.00520002 0.0158059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1811 1812 4.91477 -0.120461 -0.40838 -0.0182614 0.0959427 -0.00513937 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1762 1812 0.219922 -3.03153 0.0134531 0.0654384 0.00485157 -0.00673817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1812 1813 4.81165 -0.271805 -0.288145 -0.00286115 0.0959124 -0.0651372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1763 1813 -0.0222045 -3.08264 -0.211468 0.0708378 0.00405578 -0.00728253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1813 1814 5.01526 -0.396095 -0.225831 0.00706039 0.103839 -0.074546 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1764 1814 0.0415692 -2.96824 -0.000418305 0.0499308 -0.00767938 -0.0594156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1814 1815 4.87234 -0.130062 -0.269351 -0.0219584 0.106965 -0.0241689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1765 1815 -0.062842 -3.11635 -0.0526797 0.0592243 -0.006188 0.00441467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1815 1816 4.88553 -0.28768 -0.145095 -0.005929 0.0933327 -0.0792619 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1766 1816 -0.0287574 -3.03978 -0.231726 0.0506148 -0.0138973 0.0436976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1816 1817 4.75327 -0.0974786 -0.203379 0.00488044 0.0865973 -0.148864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1767 1817 0.0282841 -2.93195 -0.09693 0.0773798 -0.0132547 0.0211111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1817 1818 4.7098 -0.268331 -0.263478 0.0186111 0.0889934 -0.0865322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1768 1818 -0.0435599 -2.97465 -0.14503 0.0449447 -0.012731 0.0820732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1818 1819 4.82591 -0.266342 -0.438479 0.0045304 0.0862127 -0.11871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1769 1819 0.0680926 -2.90573 -0.211321 0.0519969 -0.00144775 -0.0135646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1819 1820 4.83841 -0.161507 -0.0770926 -0.0072428 0.102658 -0.0999522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1770 1820 0.0616235 -3.05767 -0.126215 0.0541905 0.0195727 -0.0169415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1820 1821 4.97919 -0.447477 -0.280722 -0.00136713 0.0737957 -0.109513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1771 1821 -0.10416 -3.02821 -0.057326 0.054687 0.0024022 0.0511145 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1821 1822 4.85974 -0.317102 -0.480157 0.0193524 0.10041 -0.0435742 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1772 1822 0.192023 -2.87943 -0.114734 0.0511578 -0.000645648 -0.0339111 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1822 1823 4.83929 -0.238797 -0.319069 0.000335712 0.0992771 -0.119442 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1773 1823 -0.178231 -3.0507 -0.0438601 0.0483637 -0.010466 -0.0372206 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1823 1824 4.78394 -0.403704 -0.205208 -0.0137986 0.112579 -0.17247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1774 1824 -0.0987786 -3.0068 0.0045094 0.0677603 0.00353463 0.038038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1824 1825 4.81702 -0.348762 -0.265972 -0.0138826 0.108581 -0.0580538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1775 1825 -0.0648302 -2.8894 0.0399057 0.0632194 0.00959133 0.0814225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1825 1826 4.81675 -0.24492 -0.117994 -0.0050721 0.096936 -0.0792821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1776 1826 -0.0078235 -3.08813 -0.181108 0.0590393 -0.0140913 -0.0173059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1826 1827 4.89557 -0.361056 -0.307536 -0.00451122 0.0921269 -0.067931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1777 1827 -0.122792 -3.09499 -0.100944 0.0577895 -0.0130607 -0.0319942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1827 1828 4.75582 -0.271349 -0.15809 -0.00711898 0.0896873 -0.112515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1778 1828 0.0388573 -3.02131 -0.00652277 0.0699269 0.00239921 -0.00742824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1828 1829 4.73049 -0.294431 -0.301175 -0.000526391 0.0832795 -0.167077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1779 1829 -0.000309022 -2.90919 -0.0208505 0.0695055 0.0112504 -0.0158502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1829 1830 4.92886 -0.130165 -0.165002 -0.00368411 0.11642 -0.0336335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1780 1830 -0.108461 -3.1802 -0.18677 0.0527164 -0.00321506 0.0381845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1830 1831 4.6298 -0.435083 -0.137867 -0.001988 0.0936441 -0.0641449 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1781 1831 0.140164 -2.96356 -0.014656 0.0670866 -0.0031135 -0.0168279 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1831 1832 4.74803 -0.151841 -0.288237 0.00829702 0.102145 -0.0820254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1782 1832 -0.012127 -2.9899 -0.0295551 0.0853943 -0.000852896 -0.00686466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1832 1833 4.85339 -0.343561 -0.169301 -0.00163656 0.0984554 -0.0891252 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1783 1833 -0.0144925 -3.00285 0.0284105 0.0498564 0.00939331 -0.0142215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1833 1834 4.54808 -0.392319 -0.214532 -0.0152504 0.0951623 -0.0283661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1784 1834 0.222172 -3.02502 -0.029758 0.0608715 0.0120433 -0.0150827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1834 1835 4.64417 -0.311206 -0.476396 -0.00560264 0.0966071 -0.0407182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1785 1835 -0.0482292 -3.04667 0.0326862 0.0683461 -0.00275642 -0.0589991 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1835 1836 4.95349 -0.223524 -0.261534 -0.00795382 0.0943563 -0.0346849 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1786 1836 -0.0335317 -3.04668 -0.0991304 0.0546924 0.00177815 0.000480783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1836 1837 4.70114 -0.124719 -0.272527 -0.010809 0.102571 -0.0946032 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1787 1837 -0.0626125 -3.03427 0.0676801 0.0516742 -0.00187972 -0.0475634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1837 1838 4.62714 -0.201168 -0.165333 -0.0100206 0.107918 -0.0331809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1788 1838 0.0471752 -3.08736 0.05968 0.030737 0.0159755 0.0527381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1838 1839 4.77426 -0.113355 -0.322589 -0.0143616 0.0943777 -0.0917203 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1789 1839 0.0188436 -3.06368 0.0720668 0.0818474 0.0114799 -0.00345901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1839 1840 4.61616 -0.293992 -0.216557 0.000582939 0.0886109 -0.121437 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1790 1840 -0.0206358 -3.06349 -0.261491 0.0681527 0.0134471 0.00972475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1840 1841 4.67614 -0.295208 -0.313561 -0.00382282 0.117662 -0.090094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1791 1841 0.0958677 -3.05315 -0.22173 0.0458412 0.00462257 -0.0468129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1841 1842 4.61225 -0.179533 -0.271756 -0.0149073 0.114372 -0.0772276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1792 1842 -0.0715469 -3.11082 -0.306459 0.0653106 -0.00790786 0.037411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1842 1843 4.76378 -0.377619 -0.214941 0.00412791 0.0865911 -0.0728148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1793 1843 0.0518907 -2.91562 -0.122442 0.043295 0.00439581 -0.086833 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1843 1844 4.75419 -0.359341 -0.170499 -0.00531465 0.0949683 -0.118355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1794 1844 -0.0159708 -3.12139 -0.0824815 0.0623852 -0.00142231 -0.0483063 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1844 1845 4.68768 -0.252698 -0.156315 -0.00677702 0.100201 -0.209675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1795 1845 0.120579 -3.15235 0.146184 0.0437515 0.0034017 -0.0390961 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1845 1846 4.72071 -0.0861133 -0.295451 9.50973e-05 0.100831 -0.0547042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1796 1846 0.123159 -3.01997 -0.253439 0.0580113 0.00828285 0.0588462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1846 1847 4.5354 -0.407092 -0.101975 -0.00891557 0.0920906 -0.0191004 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1797 1847 0.144637 -3.16179 -0.265119 0.0764653 -0.00658368 0.0460853 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1847 1848 4.60801 -0.126293 -0.244688 -0.0052939 0.103868 -0.094666 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1798 1848 -0.12162 -2.98479 -0.154439 0.0671829 0.0324719 -0.00283929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1848 1849 4.61804 -0.109776 0.0579462 0.00955842 0.100207 -0.0700888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1799 1849 0.132477 -3.03471 -0.145067 0.0609105 0.01149 -0.0127041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1849 1850 4.77603 -0.15837 -0.10548 0.000827253 0.103943 -0.0752349 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1800 1850 -0.108137 -2.87796 -0.224581 0.0708447 0.000116664 0.00372955 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1850 1851 4.63142 -0.272999 -0.128289 0.00536304 0.0791685 -0.108227 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1801 1851 0.042069 -2.80394 -0.18803 0.0621952 -0.0043172 -0.0157536 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1851 1852 4.68181 -0.0973537 -0.151376 -0.00658094 0.0990499 -0.0917664 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1802 1852 -0.0877699 -3.17664 -0.0572846 0.0479959 0.00962734 0.100438 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1852 1853 4.6503 -0.320069 -0.331807 -0.00976131 0.100877 -0.13558 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1803 1853 -0.0742592 -2.90932 0.0189127 0.0721261 -0.0165091 -0.036432 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1853 1854 4.69398 -0.193299 0.0197714 -0.0176067 0.0909729 -0.0080528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1804 1854 -0.0383705 -3.16786 -0.0654075 0.0584352 0.0208323 -0.00536037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1854 1855 4.6655 -0.267701 -0.190265 -0.00211648 0.0865708 -0.0278417 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1805 1855 -0.00902558 -2.92915 -0.120399 0.0591487 -0.00488917 -0.0315146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1855 1856 4.42177 -0.256342 -0.205254 -0.016843 0.0949576 -0.0944535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1806 1856 -0.0765701 -3.12898 -0.090606 0.0768918 0.011933 0.0750656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1856 1857 4.71076 -0.367691 -0.227541 -0.0133918 0.113067 0.000679603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1807 1857 0.14094 -3.05249 -0.343382 0.0792538 -0.0139568 -0.0145973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1857 1858 4.50405 -0.294668 -0.26997 -0.0185135 0.101194 -0.0647436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1808 1858 -0.0761782 -3.09231 -0.0246564 0.072825 -0.0149646 0.0251462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1858 1859 4.55554 -0.148973 -0.182055 0.00290392 0.0906017 0.0354924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1809 1859 -0.188033 -2.9272 -0.113857 0.0612109 0.00747083 0.0431749 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1859 1860 4.64651 -0.277451 -0.359388 -0.00926957 0.107963 -0.0562575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1810 1860 -0.090876 -3.05835 -0.290709 0.0765461 0.00631462 -0.0388976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1860 1861 4.56676 -0.36899 -0.164651 0.00580102 0.084293 -0.0688952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1811 1861 0.0526861 -3.07877 -0.169244 0.059532 -0.00797233 -0.0827041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1861 1862 4.50337 -0.230667 -0.177172 0.0030579 0.0919689 -0.111539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1812 1862 0.116739 -2.98034 -0.217091 0.0702648 -0.00609367 0.0199529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1862 1863 4.64065 -0.300941 -0.158616 -0.010913 0.0907156 -0.0926637 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1813 1863 -0.13546 -3.11522 -0.0917262 0.0692889 -0.0125472 0.0151566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1863 1864 4.59642 -0.254075 -0.0463375 0.017004 0.0800944 -0.149026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1814 1864 -0.0866169 -3.00286 -0.293697 0.0728429 0.00244369 0.00365238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1864 1865 4.63337 -0.209633 -0.260197 -0.0123506 0.0894912 -0.0123663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1815 1865 -0.169136 -3.01777 -0.0343924 0.0739501 -0.0276018 0.0202029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1865 1866 4.42479 -0.240782 -0.264261 -0.00605098 0.102242 -0.0886238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1816 1866 0.10855 -3.03261 -0.123647 0.0590287 0.006759 -0.0136211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1866 1867 4.55391 -0.261659 -0.358861 -0.00253605 0.0808509 -0.0814289 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1817 1867 0.1199 -3.1384 -0.247879 0.0475286 0.00597141 0.031673 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1867 1868 4.55404 -0.030304 -0.261655 0.0110733 0.087561 -0.123222 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1818 1868 0.101038 -3.15884 -0.0424015 0.0570756 0.0125934 0.124163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1868 1869 4.59594 -0.359304 -0.28261 -0.00562722 0.0929925 -0.0350109 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1819 1869 0.0952807 -2.85621 0.124586 0.0332439 -0.0103211 -0.00109132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1869 1870 4.78738 -0.167502 -0.151601 0.00195706 0.0897277 -0.10005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1820 1870 -0.0168166 -3.04721 -0.239359 0.0431807 0.0042476 -0.0155395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1870 1871 4.56802 -0.129037 -0.20308 0.00238513 0.098059 -0.111834 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1821 1871 0.0803017 -3.02661 -0.191708 0.0635411 0.0149503 -0.0343494 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1871 1872 4.48885 -0.0342608 -0.0181551 0.0193062 0.0753743 -0.0586859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1822 1872 0.0739379 -2.96847 0.00569321 0.0682755 0.00374356 0.0332516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1872 1873 4.3311 -0.264852 -0.186083 -0.0110717 0.104062 -0.132561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1823 1873 -0.0143154 -3.23242 -0.0257429 0.0622019 0.00240997 -0.0137481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1873 1874 4.49719 -0.261598 0.0532623 0.00122266 0.0922871 -0.093952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1824 1874 0.0613559 -2.92594 -0.312506 0.0596012 -0.00863976 -0.052485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1874 1875 4.58532 -0.23031 -0.192696 -0.00494584 0.101564 -0.10779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1825 1875 0.00772411 -3.10499 -0.0477326 0.0679275 -0.000813983 -0.0185891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1875 1876 4.35546 -0.339718 -0.169654 -0.0109987 0.0809854 -0.0920165 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1826 1876 0.161524 -3.2491 -0.114827 0.0804324 0.00224102 -0.0176379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1876 1877 4.54031 -0.244959 -0.267222 0.00241677 0.0762422 -0.0662324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1827 1877 0.186278 -3.11028 -0.0133621 0.052274 -0.00292716 0.0280542 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1877 1878 4.60547 -0.309716 -0.251823 -0.00599094 0.0954587 -0.179015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1828 1878 0.0531775 -3.08589 -0.112001 0.0405242 -0.0064053 0.00917279 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1878 1879 4.54325 -0.115893 -0.140441 -0.0146982 0.0978564 -0.0836896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1829 1879 -0.020543 -3.27013 -0.212735 0.0564147 0.0128103 -0.0760244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1879 1880 4.52617 -0.302251 -0.37575 -0.00183563 0.108235 -0.158284 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1830 1880 -0.00259814 -3.14464 -0.087878 0.0695936 -0.00956796 -0.0445708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1880 1881 4.54856 -0.158533 -0.254646 0.00205262 0.0994201 -0.100491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1831 1881 -0.0893566 -3.07893 -0.18693 0.0610658 0.00073669 0.0440814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1881 1882 4.35954 -0.288155 -0.211167 0.00745067 0.0837914 -0.0691687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1832 1882 0.116092 -2.92028 -0.0442224 0.0677234 -0.00204854 0.0439028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1882 1883 4.56887 -0.0929468 -0.311223 0.000460255 0.0872684 -0.178205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1833 1883 0.0758564 -3.18104 -0.226805 0.0709626 0.0129886 0.00358545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1883 1884 4.46033 -0.294934 -0.219197 0.00569462 0.102623 -0.0999751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1834 1884 -0.084759 -3.22165 0.0114432 0.0499421 -0.0148616 0.00918912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1884 1885 4.38959 -0.196717 -0.208776 0.00624706 0.0935683 -0.108966 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1835 1885 0.0548894 -2.99025 -0.144123 0.0655518 -0.00423922 -0.0542006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1885 1886 4.43024 -0.160032 -0.239509 -0.0349875 0.090498 -0.123335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1836 1886 0.0885277 -3.14703 -0.0265822 0.0579084 0.0137227 0.00905663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1886 1887 4.50574 -0.253492 -0.131022 -0.00630733 0.0910965 -0.0538159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1837 1887 0.0218338 -3.13588 -0.113553 0.0668271 0.00372304 -0.0991861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1887 1888 4.51343 -0.429701 -0.287934 -0.000209637 0.108305 -0.149976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1838 1888 -0.00821434 -3.17133 0.00805733 0.0666172 -0.00824035 -0.0363585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1888 1889 4.47962 -0.37622 -0.272483 -0.00789119 0.0813587 -0.06964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1839 1889 -0.0509058 -2.91188 -0.212373 0.067461 -0.0205428 -0.000182639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1889 1890 4.34179 -0.0240087 -0.241593 0.00726602 0.0975707 -0.0839039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1840 1890 -0.0505836 -2.91351 -0.250506 0.08337 -0.00630299 -0.0501471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1890 1891 4.35205 -0.16348 -0.20882 -0.0123174 0.087271 -0.0518578 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1841 1891 -0.129239 -3.18183 -0.230686 0.0538964 -0.000225464 -0.0838791 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1891 1892 4.30193 -0.281841 -0.088496 -0.00954845 0.0929985 -0.157635 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1842 1892 -0.0535983 -2.92779 -0.0518271 0.0799358 0.0142019 -0.00681962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1892 1893 4.21476 -0.111473 -0.192084 -0.0180358 0.0735265 -0.0606514 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1843 1893 0.0324093 -3.19663 -0.0408329 0.0612652 -0.00871208 -0.04819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1893 1894 4.4421 -0.337322 -0.22283 -0.000882865 0.0823614 -0.0208079 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1844 1894 -0.0770178 -3.16532 -0.0640183 0.0707633 -0.00977542 -0.0208785 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1894 1895 4.38043 -0.385174 -0.169445 0.00567405 0.101163 -0.0937427 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1845 1895 -0.0234045 -3.15978 -0.0221831 0.0646353 -0.0128911 0.0948391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1895 1896 4.31434 -0.270794 -0.282302 0.00240869 0.0900273 -0.0768036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1846 1896 -0.0843723 -3.00494 0.000423335 0.0531676 -0.0111417 -0.0622419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1896 1897 4.44356 -0.29539 -0.240215 -0.0141811 0.0836801 -0.0817204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1847 1897 0.191385 -2.92016 -0.208971 0.0585519 0.00772875 0.0571633 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1897 1898 4.46323 -0.226667 -0.147095 0.0140399 0.0697035 -0.121016 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1848 1898 0.202927 -3.05126 -0.142374 0.0555069 0.0103147 -0.011735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1898 1899 4.31549 -0.306274 -0.332723 0.0109474 0.0945646 -0.0817513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1849 1899 0.0403644 -3.03129 -0.0179074 0.0614092 -0.00291469 0.028469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1899 1900 4.18451 -0.150939 -0.40337 -0.00138186 0.0876948 -0.0471816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1850 1900 0.0957077 -3.01279 -0.044987 0.0506446 -0.000660243 -0.019608 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1900 1901 4.3209 -0.0123597 -0.102028 9.83534e-05 0.0922107 -0.051044 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1851 1901 -0.174056 -3.04715 -0.111642 0.0621035 -0.00755424 0.0135644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1901 1902 4.319 -0.192356 -0.0337542 -0.0182751 0.0833723 -0.0809759 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1852 1902 0.0680705 -3.14048 -0.178702 0.0607085 0.0135957 -0.00229303 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1902 1903 4.41828 -0.0962022 -0.211985 -0.00995988 0.0744657 -0.110466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1853 1903 0.00378761 -3.16236 -0.141362 0.0591533 0.00509642 -0.0140452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1903 1904 4.25658 -0.12072 -0.0793969 0.00515729 0.0963357 -0.00792459 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1854 1904 0.095026 -2.88379 -0.278144 0.0622662 0.00417311 0.0479794 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1904 1905 4.25253 -0.242802 -0.268575 0.0113678 0.0943997 -0.0600259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1855 1905 -0.32096 -3.21696 -0.1433 0.0553023 0.0075246 -0.00153905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1905 1906 4.49917 -0.266086 -0.377066 -0.0152041 0.0946548 -0.193306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1856 1906 -0.0141632 -2.94756 -0.266488 0.0727217 0.00277965 -0.0160306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1906 1907 4.31382 -0.267079 -0.208264 -0.000243839 0.0892815 -0.114627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1857 1907 0.123448 -3.11809 -0.0386667 0.0618456 0.0068748 -0.0346133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1907 1908 4.45144 -0.365909 -0.312542 -0.013901 0.0890966 -0.112512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1858 1908 0.175612 -3.00971 0.0343817 0.0670299 -0.000263977 0.0405356 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1908 1909 4.26669 -0.274093 -0.135733 -0.0133767 0.0888738 -0.0922154 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1859 1909 -0.0143492 -3.03281 -0.191016 0.0633778 0.0168929 0.048693 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1909 1910 4.24691 -0.11138 -0.14229 0.000229511 0.0858012 -0.0592783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1860 1910 -0.0958643 -3.07388 0.0497909 0.0470989 0.00508015 -0.0126608 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1910 1911 4.22629 -0.253439 -0.157639 0.00267606 0.0815736 -0.075993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1861 1911 -0.0332655 -2.95962 0.0264198 0.0576656 -0.00461829 0.00380271 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1911 1912 4.2983 -0.148176 -0.101345 -0.00615889 0.0695333 -0.11309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1862 1912 -0.0801627 -3.03279 -0.126231 0.066146 -0.000662345 0.0254509 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1912 1913 4.29847 -0.247014 -0.216417 0.00466853 0.0894955 -0.167794 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1863 1913 -0.0067682 -2.99896 -0.114812 0.0652925 -0.00769526 -0.0398806 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1913 1914 4.28744 -0.190456 -0.1246 -0.00523147 0.0884533 -0.132183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1864 1914 -0.0875273 -3.18437 0.008422 0.0670764 -0.0098103 0.0340302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1914 1915 4.26013 -0.293275 -0.118631 0.00162434 0.0840828 -0.0931572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1865 1915 0.110046 -2.95598 -0.203223 0.0707307 0.0097679 -0.00974171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1915 1916 4.29278 -0.211865 -0.419779 -0.00516219 0.0925443 -0.104693 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1866 1916 0.165809 -2.92397 -0.0639948 0.0704789 0.00142009 0.0184804 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1916 1917 4.43892 -0.212728 -0.157385 -0.00128075 0.0870124 -0.177047 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1867 1917 -0.25459 -2.94055 -0.067981 0.0766394 0.00910864 -0.0155151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1917 1918 4.24089 -0.232276 -0.177805 -0.01324 0.0511016 -0.120929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1868 1918 0.0744493 -3.18284 -0.0596563 0.0497036 -0.0110359 -0.0138372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1918 1919 4.16527 -0.25614 -0.129577 -0.00676019 0.0739457 -0.0449676 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1869 1919 0.0474249 -3.14388 -0.120452 0.0523094 -0.000940022 0.0649863 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1919 1920 4.2376 -0.208001 -0.244516 0.0025855 0.0658397 -0.128578 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1870 1920 -0.131812 -2.99875 -0.0187358 0.0535419 -0.00572999 -0.0170683 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1920 1921 4.26588 -0.244314 -0.138584 0.0169447 0.0923461 -0.129302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1871 1921 0.172469 -3.1663 -0.203053 0.057713 0.00698398 -0.00323928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1921 1922 4.29202 -0.326796 -0.249091 0.00999889 0.0881306 -0.0893554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1872 1922 -0.100465 -3.18693 -0.118614 0.0761284 0.0021087 -0.0232732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1922 1923 4.17805 -0.216368 -0.262239 -0.0106656 0.0997709 -0.046544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1873 1923 -0.0256783 -3.09551 -0.206493 0.0508551 0.00287114 -0.0136379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1923 1924 4.27869 -0.319575 -0.233288 -0.0235943 0.0785207 -0.0909385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1874 1924 0.153733 -3.12105 -0.0643246 0.0435506 -0.00758778 -0.00679884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1924 1925 4.29058 -0.376121 -0.384833 -0.00123667 0.0939581 -0.112237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1875 1925 -0.0190031 -3.11941 -0.0322153 0.0538352 2.90802e-05 0.0887264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1925 1926 4.39244 -0.23956 0.0539397 -0.01035 0.0845915 -0.127842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1876 1926 0.0236955 -2.959 -0.096646 0.0505093 -0.0271878 0.000431228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1926 1927 4.19606 -0.34414 -0.142735 -0.00773727 0.0841039 -0.0667369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1877 1927 0.173492 -3.00229 -0.127557 0.0588094 -0.000669096 0.0608391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1927 1928 4.30325 -0.266877 -0.14374 -0.0123015 0.0828402 -0.0535617 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1878 1928 -0.162028 -3.22612 -0.195156 0.0718848 -0.00182541 0.0323809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1928 1929 4.19134 -0.324255 -0.178556 -0.0162972 0.0883525 -0.0796562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1879 1929 -0.0358555 -3.01209 -0.053434 0.0657251 0.00166911 -0.0196347 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1929 1930 4.09887 -0.297373 -0.32448 0.00265376 0.0759434 -0.0684646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1880 1930 0.157879 -3.04929 -0.0713773 0.0655567 0.00327823 0.0290589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1930 1931 4.23549 -0.303304 -0.379125 0.00468234 0.0774373 -0.0812882 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1881 1931 0.0286061 -3.12105 0.0517603 0.0694921 -0.0056283 0.0145916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1931 1932 4.08328 -0.391529 -0.19426 -0.0121089 0.0722206 -0.0945631 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1882 1932 -0.0399439 -2.92277 -0.0809829 0.0527822 -0.0069721 0.0710042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1932 1933 4.06086 -0.167069 -0.0924443 -0.0182719 0.0867986 -0.0859814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1883 1933 -0.052735 -2.93029 -0.147111 0.0653108 -0.00151232 0.00249172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1933 1934 4.15542 -0.178941 -0.0754697 -0.0181083 0.0880364 -0.119904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1884 1934 -0.0664556 -2.95549 -0.0643582 0.0736804 -0.0074965 -0.00673016 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1934 1935 4.28579 -0.482084 -0.197275 -0.000602183 0.0745662 -0.0762575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1885 1935 -0.120315 -3.15726 -0.190176 0.0599016 0.00897308 -0.025345 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1935 1936 4.3514 -0.266014 -0.196074 -0.0118994 0.0771209 -0.0921799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1886 1936 0.154242 -3.04692 -0.0974953 0.0547337 -0.000535011 0.0662167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1936 1937 4.12983 -0.285903 -0.183014 0.0179957 0.0561641 -0.0796293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1887 1937 -0.0863398 -3.22479 -0.161658 0.0534412 0.00288308 0.0673637 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1937 1938 4.21764 -0.27165 -0.0621017 -0.00391806 0.0844955 -0.142137 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1888 1938 -0.0734187 -3.02007 0.0673569 0.0676042 0.0134512 -0.0555018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1938 1939 4.08981 -0.344466 -0.0921311 -0.0263845 0.0760042 -0.0575004 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1889 1939 0.0840464 -3.17894 -0.0339765 0.0519333 -0.0111514 0.0558327 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1939 1940 3.9116 -0.223302 -0.244041 -0.00472284 0.0642214 -0.0360385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1890 1940 0.0570372 -2.8924 -0.0610536 0.0479607 -0.00817971 -0.0361353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1940 1941 4.26428 -0.17288 -0.229269 0.00422024 0.103071 -0.115945 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1891 1941 0.131844 -3.0645 -0.232504 0.0791449 -0.00380398 0.0389546 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1941 1942 4.15675 -0.219201 -0.266267 -0.000560014 0.0727546 -0.135641 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1892 1942 0.0777617 -3.04831 -0.0535451 0.0631704 0.00942701 -0.0371857 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1942 1943 4.14824 -0.308997 -0.252387 -0.000623447 0.0904886 -0.0854588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1893 1943 -0.128108 -2.88505 -0.155163 0.0588831 0.00675514 -0.0422598 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1943 1944 4.25728 -0.188387 -0.156685 -0.0101019 0.0732098 -0.112368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1894 1944 0.153072 -3.01143 -0.0797814 0.0677367 -0.00878229 -0.007482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1944 1945 4.02996 -0.35726 -0.0912853 0.00188491 0.0954209 -0.132888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1895 1945 0.164682 -2.9473 -0.119452 0.0611001 -0.000673267 -0.0181416 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1945 1946 4.12195 -0.337303 -0.280472 -0.00303241 0.0869872 -0.0903253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1896 1946 -0.023264 -3.04771 -0.152045 0.0619894 -0.00634507 0.0392784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1946 1947 4.06167 -0.23868 -0.11998 0.00265271 0.0892516 -0.0327593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1897 1947 0.00547007 -3.09013 -0.0511763 0.0619846 0.0226482 -0.0110786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1947 1948 4.0425 -0.258 -0.250096 -0.0115353 0.0709673 -0.101372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1898 1948 0.121128 -3.11473 -0.121931 0.0492621 0.0190299 -0.0223325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1948 1949 3.97484 -0.296761 -0.193436 -0.0193701 0.0916655 -0.0781071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1899 1949 0.151909 -2.89019 0.101183 0.0594345 -0.00383205 -0.0576626 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1949 1950 4.20071 -0.309989 -0.326205 0.00498975 0.0794809 -0.0219681 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1900 1950 -0.0558459 -3.05886 -0.00808693 0.0555724 -0.00178108 -0.00258199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1950 1951 3.98914 -0.377714 -0.146508 -0.00503001 0.0779264 -0.0456139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1901 1951 0.020223 -3.10738 -0.0417297 0.058371 -0.00154075 -0.00161483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1951 1952 4.15649 -0.474466 -0.205463 0.013224 0.0776772 -0.149838 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1902 1952 -0.030244 -3.05845 -0.136567 0.073076 0.0222177 -0.0470917 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1952 1953 4.07392 -0.131107 -0.159059 -0.0101704 0.0816373 -0.020526 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1903 1953 0.0557011 -2.99479 -0.102065 0.0675648 -0.00381538 -0.0271069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1953 1954 4.12942 -0.238501 -0.193384 -0.0172608 0.0778085 -0.0947855 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1904 1954 -0.216131 -3.03897 -0.0433695 0.0675301 0.0177496 -0.115951 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1954 1955 4.02161 -0.230868 -0.153143 -0.0050373 0.0722148 -0.164973 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1905 1955 -0.0897988 -2.97752 -0.10118 0.0403913 0.010461 0.0133102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1955 1956 4.0127 -0.332368 -0.219003 -0.00789817 0.0838446 -0.0571936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1906 1956 -0.14467 -3.05528 -0.312279 0.0916964 -0.00669889 -0.007295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1956 1957 4.03161 -0.142439 -0.102149 -0.0106457 0.0602491 -0.0406136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1907 1957 -0.00123278 -2.90526 -0.26953 0.0627806 -0.0049433 0.045618 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1957 1958 4.12457 -0.027463 -0.204845 -0.00720539 0.0870151 -0.0582056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1908 1958 -0.0813435 -3.02588 -0.157532 0.0655548 -0.00357006 0.0378483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1958 1959 4.1822 -0.196563 -0.382705 0.0133169 0.063573 -0.0505472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1909 1959 -0.0978837 -2.90575 0.093453 0.0612773 -0.0101771 -0.0149189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1959 1960 4.01098 -0.16293 -0.205224 0.000690703 0.0683197 -0.125481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1910 1960 0.0592711 -3.1138 -0.247364 0.042871 0.0105628 0.0428797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1960 1961 4.15577 -0.195198 -0.143934 -0.0131374 0.0808275 -0.0620354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1911 1961 -0.150285 -2.98368 -0.165131 0.055658 0.0171125 -0.0177415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1961 1962 4.09018 -0.436098 -0.185573 0.00168603 0.0734392 -0.0857874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1912 1962 -0.0789751 -3.01499 -0.00610366 0.0720518 -0.0216005 -0.0843853 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1962 1963 4.23886 -0.278578 -0.0758427 -0.015394 0.0964312 -0.0925962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1913 1963 -0.0355763 -3.07105 -0.0748421 0.065682 0.00753022 0.0274502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1963 1964 3.98134 -0.180001 -0.190638 -0.0111859 0.0981133 -0.124912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1914 1964 0.0190411 -2.94673 -0.0715748 0.0608257 0.00820011 -0.0121434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1964 1965 4.0293 -0.29605 -0.192949 -0.0197484 0.0819707 -0.0836343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1915 1965 -0.0626555 -2.99931 -0.241992 0.0651594 -0.0174585 0.0097151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1965 1966 4.05788 -0.0722964 -0.149412 -0.0178659 0.0895746 -0.0876653 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1916 1966 -0.0834555 -3.04717 -0.145403 0.0560101 0.00345291 0.0225831 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1966 1967 4.0752 -0.299522 -0.203021 0.00613674 0.0771903 -0.0641583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1917 1967 -0.0617324 -3.03557 -0.0924446 0.0617031 -0.00550161 0.0236195 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1967 1968 4.04603 -0.198135 -0.355313 -0.00646143 0.0831503 -0.0733695 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1918 1968 0.108933 -3.15224 -0.290402 0.0598904 0.0105879 -0.00255137 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1968 1969 3.97505 -0.193533 -0.0404268 0.000963879 0.0850782 -0.0726859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1919 1969 -0.113101 -3.01724 -0.00961383 0.0669725 0.00283789 -0.0347312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1969 1970 3.85677 -0.19319 -0.0938565 -0.0142197 0.083613 -0.0351686 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1920 1970 -0.197512 -3.11572 -0.157018 0.0708744 -0.00664834 0.0273647 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1970 1971 3.93538 -0.192721 -0.100265 -0.00327336 0.0778942 -0.0921695 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1921 1971 -0.179218 -3.18095 -0.0896117 0.0861331 -0.000132903 0.081152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1971 1972 3.87697 -0.23189 -0.142868 -0.00194415 0.0649033 -0.0405224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1922 1972 -0.0476279 -3.02727 -0.0677929 0.0620293 0.0183332 -0.0468609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1972 1973 3.93295 -0.351428 -0.0692229 0.00157272 0.0777122 -0.0645434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1923 1973 -0.18019 -3.1274 -0.215239 0.0605612 -0.000547583 -0.0478365 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1973 1974 4.08117 -0.325844 -0.143426 0.011943 0.0773388 -0.0861566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1924 1974 0.0718273 -3.10457 -0.177574 0.0561563 0.00150109 -0.0534509 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1974 1975 3.96931 -0.200514 -0.227838 -0.0135039 0.0838421 -0.0910143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1925 1975 -0.0852625 -2.9934 0.0333761 0.0691608 -0.000100165 0.0396848 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1975 1976 3.95499 -0.126193 -0.182623 0.0101559 0.0757382 -0.0414272 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1926 1976 -0.0549844 -2.95415 0.0503509 0.074622 0.00286758 -0.0197989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1976 1977 3.93775 -0.105977 -0.299612 0.00251116 0.0748473 -0.0919241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1927 1977 0.0499105 -3.05122 -0.122024 0.0615881 0.0182797 0.00690448 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1977 1978 3.9011 -0.365612 -0.104658 -0.00881255 0.073347 -0.031555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1928 1978 0.0773659 -3.07539 -0.0405432 0.0525861 0.000438271 -0.0102741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1978 1979 4.11376 -0.298042 -0.179663 -0.00309183 0.0877969 -0.0708691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1929 1979 0.107398 -3.25687 0.0176977 0.0494088 -0.0221734 0.00732095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1979 1980 3.83187 -0.257301 -0.171019 -0.000184932 0.0918396 -0.251722 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1930 1980 -0.11863 -3.04041 -0.122991 0.0487717 0.0118078 -0.0144252 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1980 1981 3.88607 -0.285043 -0.264392 -0.00570068 0.0822052 -0.0919888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1931 1981 0.0186651 -3.18181 -0.139696 0.0557855 0.00998612 -0.0106596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1981 1982 3.92373 -0.232823 -0.117316 0.00108363 0.0721919 -0.112173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1932 1982 -0.0241102 -2.99522 -0.167005 0.0753525 -0.0178488 -0.0100052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1982 1983 3.89774 -0.399653 -0.203818 -0.00998694 0.0693313 -0.143321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1933 1983 0.135014 -2.82967 -0.252255 0.0644094 0.00820984 0.052871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1983 1984 3.7314 -0.326964 -0.249638 -0.00458387 0.0856673 -0.149648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1934 1984 0.044808 -3.12939 -0.0859541 0.0857895 -0.0104472 -0.0701079 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1984 1985 3.89 -0.181903 -0.283264 -0.00275248 0.0796951 -0.146341 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1935 1985 0.0236924 -3.08302 -0.0928126 0.0673263 -0.00174586 -0.0534962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1985 1986 3.83248 -0.409762 -0.239389 -0.0139169 0.0736887 -0.0531359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1936 1986 -0.00505125 -3.11936 -0.122213 0.0690315 -0.00639175 0.0574055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1986 1987 4.06696 -0.272481 -0.22723 0.0143956 0.0983608 -0.0790062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1937 1987 0.0263322 -2.97505 -0.133867 0.0476881 -0.0104861 0.0182313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1987 1988 3.94074 -0.166553 -0.203753 -0.00466307 0.095582 -0.143967 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1938 1988 0.0091196 -3.11688 -0.178431 0.0461039 0.00581804 0.00249168 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1988 1989 3.99065 -0.304642 -0.162138 -0.00807173 0.0894635 -0.000532056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1939 1989 -0.00433661 -3.26607 0.0314002 0.0449051 0.00750661 -0.0135727 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1989 1990 3.71339 -0.218157 -0.0834343 -0.00850129 0.0599762 0.00411139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1940 1990 -0.0190984 -3.22341 -0.0442282 0.0567095 0.014596 -0.0250566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1990 1991 3.93 -0.204349 -0.129851 -0.000377474 0.0711486 -0.0579703 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1941 1991 0.0897336 -2.94896 -0.0238168 0.0333184 0.0052942 -0.0727295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1991 1992 3.92079 -0.288127 -0.269137 -0.00950973 0.0779951 -0.0870242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1942 1992 -0.107628 -3.15056 0.040788 0.0350415 0.00204729 0.0227784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1992 1993 3.85097 -0.408908 -0.198446 -0.00653542 0.0911453 -0.160269 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1943 1993 0.0377913 -2.97537 -0.00858782 0.0473134 0.00133275 -0.00761058 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1993 1994 3.83342 -0.209282 -0.107311 -0.00523756 0.0760703 -0.129525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1944 1994 -0.200275 -3.02643 -0.145734 0.0553561 0.0124984 0.0833295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1994 1995 3.84574 -0.097062 -0.189343 -0.0141308 0.0815852 -0.189678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1945 1995 0.0516165 -2.97591 -0.0560244 0.0752554 -0.0060587 -0.0421071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1995 1996 3.80267 -0.249033 -0.0632055 -0.0248118 0.07084 -0.091551 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1946 1996 0.121357 -3.04053 -0.200719 0.0611263 -0.00402293 0.0575747 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1996 1997 4.05999 -0.348409 -0.0678961 0.00148827 0.0813297 -0.0731714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1947 1997 -0.0308405 -3.04748 0.0571645 0.0523132 -0.00572717 0.0819391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1997 1998 3.58636 -0.259717 -0.0849707 -0.00130152 0.0771543 -0.0938153 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1948 1998 0.0536134 -3.12658 -0.320196 0.0687956 0.0098049 0.0385344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1998 1999 3.75228 -0.132566 -0.0826785 0.00855786 0.0810907 -0.0815025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1949 1999 0.030286 -3.07141 -0.0710082 0.0662994 -0.0132673 -0.0325276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1999 2000 3.7061 -0.277007 -0.229495 -0.00764001 0.0678636 -0.0723049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1950 2000 0.0148607 -3.13423 -0.138566 0.0633798 -0.00206171 0.0100648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2000 2001 3.94372 -0.364221 -0.182918 0.00645856 0.0502168 -0.103713 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1951 2001 0.0521878 -3.03471 0.0377428 0.0596219 -0.00708902 0.0657467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2001 2002 3.76193 -0.355789 -0.222014 -0.00300618 0.0753516 -0.0479499 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1952 2002 0.0312852 -3.05352 -0.188157 0.0675008 0.0202726 -0.043469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2002 2003 3.67902 -0.213382 -0.214829 0.00701115 0.0853371 -0.112833 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1953 2003 -0.138849 -3.01898 -0.0750788 0.0611615 -0.00905312 0.0224817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2003 2004 3.91755 -0.164977 -0.10725 0.0131947 0.0648788 -0.0717277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1954 2004 -0.00099052 -3.14651 -0.0146388 0.0769402 -0.0157311 -0.00425177 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2004 2005 3.77653 -0.391448 -0.0360583 -0.010608 0.0958135 -0.0435752 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1955 2005 0.0925024 -3.09935 -0.0978751 0.0809205 -0.00698252 0.0460514 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2005 2006 3.80116 -0.310168 -0.138617 -0.00192078 0.0832512 -0.0808566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1956 2006 -0.194563 -3.01287 0.0205387 0.0600865 0.00446102 0.0305715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2006 2007 3.73529 -0.459481 -0.231161 -0.00750538 0.0695369 -0.0437146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1957 2007 0.105266 -2.96184 -0.111297 0.0575965 -0.00939636 0.0651021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2007 2008 3.73511 -0.347834 -0.158496 -0.0096189 0.0724432 -0.0660995 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1958 2008 -0.108838 -2.9883 -0.0176286 0.0661488 0.0109523 -0.0218325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2008 2009 3.80865 -0.0847682 0.0484325 -0.00860126 0.0841538 -0.0958081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1959 2009 0.0198086 -2.87677 -0.0693471 0.0462626 0.0101029 -0.0620391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2009 2010 3.64592 -0.348139 -0.205187 -0.0144 0.0734242 -0.0908535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1960 2010 0.0620823 -2.86315 -0.146143 0.0516219 -0.0059276 0.0166504 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2010 2011 3.83458 -0.176115 -0.0552606 0.00770637 0.0693927 -0.100231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1961 2011 -0.104128 -3.09505 -0.0121927 0.0663289 0.00195369 0.0209419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2011 2012 3.76957 -0.220653 -0.136653 -0.0111087 0.0662607 -0.0385169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1962 2012 -0.0382338 -3.00643 -0.0654127 0.0568282 -0.00939105 -0.0513172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2012 2013 3.6968 -0.260408 -0.306459 0.00809763 0.0715436 -0.0774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1963 2013 -0.103737 -3.12396 -0.270104 0.0610715 -0.016514 0.0787495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2013 2014 3.57015 -0.217549 -0.237674 0.00505963 0.068742 -0.0933335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1964 2014 -0.0410864 -3.12942 -0.121939 0.0671667 -0.0188968 0.023357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2014 2015 3.69388 -0.331596 -0.0171443 0.0141729 0.0550964 -0.158971 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1965 2015 -0.00394692 -3.12284 -0.120259 0.0468607 -0.003365 -0.0812927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2015 2016 3.75549 -0.324537 -0.270617 0.00843679 0.0762542 -0.109485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1966 2016 0.035538 -3.01311 -0.167803 0.0735814 -0.0187464 0.0506743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2016 2017 3.66044 -0.416423 -0.151793 -0.00953658 0.0575649 -0.0875991 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1967 2017 0.00160172 -3.00319 -0.289741 0.0381222 0.00950498 0.0147429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2017 2018 3.77146 -0.2592 -0.0438973 0.00856138 0.0676355 -0.152065 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1968 2018 0.0183999 -2.92201 0.0329823 0.0560734 -0.00541229 0.0589358 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2018 2019 3.69838 -0.318102 0.0969819 -0.00353239 0.058472 -0.0906684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1969 2019 0.0269479 -3.06412 -0.134239 0.041109 0.00631797 -0.0485567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2019 2020 3.62488 -0.229052 -0.194989 -0.00431024 0.0724754 -0.0967823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1970 2020 -0.000304255 -3.18856 -0.112986 0.0627602 0.0078902 0.0385972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2020 2021 3.67628 -0.359818 -0.0531481 0.00291086 0.0821518 -0.0514497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1971 2021 0.0243198 -2.98738 -0.23178 0.0793911 -0.00397448 0.0673275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2021 2022 3.70208 -0.00211951 0.035242 0.00466816 0.0752083 -0.143919 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1972 2022 0.0411305 -2.97061 -0.0454571 0.0803237 -0.0024945 -0.0109802 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2022 2023 3.70533 -0.343122 -0.21916 -0.011092 0.062428 -0.064884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1973 2023 0.110846 -3.00954 -0.0460256 0.0523123 -0.00651303 -0.0717703 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2023 2024 3.57595 -0.130087 -0.182328 -0.00763289 0.0828123 -0.0692883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1974 2024 -0.0597523 -3.03427 -0.0776605 0.0415787 0.00119917 0.0597269 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2024 2025 3.63867 -0.362192 -0.232067 6.71021e-06 0.0872261 -0.0926256 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1975 2025 -0.0932133 -3.05779 -0.152591 0.0573443 -0.00508391 0.0396799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2025 2026 3.51279 -0.292839 -0.289881 -0.0342383 0.061289 -0.11843 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1976 2026 0.00357393 -3.23914 -0.161052 0.068616 -0.00646015 0.052866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2026 2027 3.70234 -0.387619 -0.269292 0.00404123 0.077507 -0.153865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1977 2027 -0.180899 -3.16128 -0.147999 0.084729 0.00248696 0.0222292 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2027 2028 3.56233 -0.372679 -0.200957 -0.00550305 0.0669253 -0.0339962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1978 2028 -0.13379 -3.24197 -0.172663 0.0556349 -0.00512141 -0.0460592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2028 2029 3.49367 -0.276565 -0.111897 0.00872853 0.0698488 -0.0909876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1979 2029 0.157572 -3.08483 -0.015791 0.0561958 0.00428978 -0.00142322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2029 2030 3.55546 -0.347194 -0.147411 0.00792586 0.0812436 -0.0735982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1980 2030 0.0558258 -3.01001 -0.158652 0.0705229 -0.0357807 0.0155148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2030 2031 3.59624 -0.121327 -0.182388 -0.00717412 0.0676787 -0.140362 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1981 2031 0.0523394 -3.16742 -0.19736 0.0479983 0.00712977 0.0050826 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2031 2032 3.67612 -0.369524 -0.125767 -0.0154269 0.0631136 -0.133743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1982 2032 -0.21673 -2.86464 -0.162463 0.0627936 0.00608695 -0.0030869 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2032 2033 3.55253 -0.266153 -0.0398371 0.00205329 0.0751987 -0.109453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1983 2033 -0.144195 -3.13249 0.00132992 0.0703013 -0.00318527 0.00140536 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2033 2034 3.58934 -0.307994 -0.207852 0.00107559 0.0675295 -0.0862884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1984 2034 -0.0670177 -2.888 0.237676 0.056287 -0.0128674 0.0711759 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2034 2035 3.60535 -0.133341 -0.248406 0.0114793 0.0632323 -0.0995834 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1985 2035 -0.0209647 -3.17551 -0.267033 0.0536729 0.0104624 0.031267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2035 2036 3.66779 -0.178988 -0.130556 -0.00301086 0.0635599 -0.0946509 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1986 2036 -0.0238239 -2.8232 -0.0525839 0.0708069 -0.00836265 0.0468911 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2036 2037 3.57846 -0.118432 -0.179432 0.00629884 0.0835163 -0.100247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1987 2037 -0.0504269 -3.11407 -0.185938 0.0526284 -0.00551218 -0.0259865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2037 2038 3.52523 -0.244794 -0.0520923 -0.0198477 0.0611237 -0.127133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1988 2038 -0.0189585 -3.07027 -0.0683004 0.0748082 -0.00908523 -0.0230099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2038 2039 3.7194 -0.243581 -0.219514 -0.00127801 0.0899491 -0.118238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1989 2039 0.0147197 -3.09238 -0.208605 0.056931 0.00255577 0.0326083 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2039 2040 3.43304 -0.130643 -0.142288 0.00439302 0.0684212 -0.05758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1990 2040 0.032072 -3.24973 -0.0696703 0.0679527 0.0135707 0.0290668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2040 2041 3.4791 -0.198703 -0.126062 0.0121599 0.0839251 -0.138899 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1991 2041 -0.0359589 -3.21296 -0.0623838 0.0742012 0.0253433 -0.0125126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2041 2042 3.64315 -0.226554 -0.315696 0.00271988 0.0742986 -0.151842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1992 2042 -0.0774013 -3.063 -0.0814995 0.0774075 0.00164421 0.0314242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2042 2043 3.50459 -0.266466 -0.173174 -0.0162543 0.0742343 -0.0756713 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1993 2043 -0.0160024 -2.94983 0.0273565 0.0683551 -0.0176981 0.0241458 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2043 2044 3.5959 -0.1959 -0.181279 -0.0141972 0.060515 -0.0838814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1994 2044 0.0384637 -3.16603 -0.0156016 0.0636765 -0.0178174 0.0431538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2044 2045 3.55489 -0.303045 -0.0642663 0.00604594 0.0725077 -0.0732478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1995 2045 0.010927 -3.03111 0.0104183 0.0546198 0.000893637 0.0111643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2045 2046 3.57822 -0.142312 0.105578 0.00886738 0.0837704 -0.130746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1996 2046 0.097244 -2.99099 0.048626 0.0500272 -6.90939e-05 0.0213143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2046 2047 3.42728 -0.356409 -0.161725 0.0110012 0.0698618 -0.0957525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1997 2047 -0.0624482 -3.01433 -0.0802096 0.0718351 0.000960346 -0.00992014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2047 2048 3.55289 -0.156051 -0.331846 0.0071787 0.067836 -0.072484 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1998 2048 -0.00224381 -3.00439 0.0464199 0.0498342 -0.011921 -0.000426229 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2048 2049 3.55217 -0.271874 -0.0598408 0.0101431 0.0856169 -0.089823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1999 2049 -0.0144345 -3.06316 -0.175608 0.0514101 -0.00300242 -0.00371854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2049 2050 3.60147 -0.114269 0.0564121 -0.00201539 0.0626433 -0.0877492 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2000 2050 -0.0643962 -3.18008 -0.166869 0.0550361 0.00769411 -0.0584173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2050 2051 3.57746 -0.0468281 -0.0789584 -0.00395663 0.0705354 -0.157622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2001 2051 0.0371151 -3.14533 -0.0838149 0.0651258 0.00222369 -0.0292995 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2051 2052 3.63038 -0.270854 -0.0144253 -0.00874243 0.0625857 -0.0683319 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2002 2052 0.0835603 -3.07361 -0.0633718 0.0528567 -0.000765593 -0.0420744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2052 2053 3.31559 -0.181155 -0.304759 0.00772557 0.077911 -0.0912202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2003 2053 0.115243 -3.09724 -0.138628 0.0673004 -0.00177217 -0.000381095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2053 2054 3.30556 -0.217723 -0.168323 -0.00390401 0.0572114 -0.0469201 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2004 2054 -0.0706894 -3.09164 0.00896299 0.0608617 0.0206609 0.0190265 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2054 2055 3.58314 -0.265036 0.0422537 0.0208767 0.0656358 -0.0571548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2005 2055 -0.0874422 -3.10329 -0.0692837 0.058226 -0.012659 -0.0150131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2055 2056 3.48936 -0.432252 -0.0716867 -0.013267 0.0675975 -0.128845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2006 2056 -0.0634775 -2.90446 0.0393535 0.0932889 -0.0030456 0.057481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2056 2057 3.36455 -0.26077 -0.096088 0.00434994 0.0675728 -0.140037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2007 2057 -0.00118421 -3.20395 -0.0703197 0.0534714 0.0168948 0.03099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2057 2058 3.59821 -0.233977 0.0142636 -0.0033452 0.039423 -0.115332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2008 2058 0.089576 -3.17679 -0.0790087 0.0410658 -0.000153665 -0.0114374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2058 2059 3.57646 -0.124742 0.00405078 -0.00884704 0.0842831 -0.10149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2009 2059 0.154141 -3.27799 -0.190217 0.0696598 0.000463073 -0.00592491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2059 2060 3.42214 -0.19946 -0.141362 0.0143252 0.0747396 -0.181241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2010 2060 0.0586031 -3.08102 -0.193086 0.0573666 -0.00436353 0.00348661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2060 2061 3.3802 -0.21902 -0.0964095 -0.0120444 0.0632004 -0.0349306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2011 2061 -0.0205971 -2.98712 -0.255829 0.0667232 -0.0128329 -0.0306593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2061 2062 3.48935 -0.332609 -0.0179532 0.00416518 0.0673758 -0.109937 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2012 2062 0.0452902 -2.97497 -0.245561 0.0504328 0.00205029 0.0135809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2062 2063 3.70822 -0.389152 -0.0994019 -0.0108951 0.0681705 -0.130221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2013 2063 -0.00247814 -3.00499 -0.19276 0.0671112 0.00306903 0.0167438 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2063 2064 3.39377 -0.307898 -0.0105911 0.000943008 0.0661764 -0.166664 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2014 2064 0.123495 -3.09005 -0.223313 0.0691352 0.00565192 0.0205554 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2064 2065 3.32351 -0.306747 -0.247074 0.0154149 0.073912 -0.0140332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2015 2065 -0.00684393 -3.1065 0.0218204 0.053722 -0.00422538 0.0804196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2065 2066 3.37625 -0.265736 -0.0512975 -0.00918942 0.0594238 -0.142239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2016 2066 0.00874849 -2.94551 -0.0028244 0.0602759 -0.0214517 -0.0407197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2066 2067 3.34244 -0.109624 -0.375367 0.0222302 0.0717789 -0.115241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2017 2067 0.0724536 -3.15653 -0.241265 0.0772802 0.000322605 -0.0134154 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2067 2068 3.36437 -0.170279 -0.144049 -0.00182204 0.0616702 -0.0830319 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2018 2068 -0.146806 -3.01057 -0.121051 0.0515932 0.012459 -0.00615419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2068 2069 3.34494 -0.302038 -0.0238283 -0.0074607 0.0591736 -0.0889325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2019 2069 -0.0806291 -2.9969 -0.0175986 0.0547411 -0.00986048 0.0349053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2069 2070 3.32125 -0.365839 -0.170927 -0.0108813 0.0614188 -0.101943 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2020 2070 0.186252 -3.24149 -0.179033 0.0711406 0.00587537 0.0598512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2070 2071 3.34935 0.0302785 -0.221548 -0.00861538 0.0809865 -0.0684725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2021 2071 -0.0481338 -3.13361 -0.101039 0.0601677 -0.0165501 -0.0205402 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2071 2072 3.31189 -0.293413 -0.27597 -0.00268784 0.0785462 -0.06368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2022 2072 0.112971 -3.1146 -0.0905336 0.0517298 0.00109921 -0.00731545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2072 2073 3.39301 -0.200953 -0.192076 -0.00107057 0.0730957 -0.0756835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2023 2073 0.0200438 -3.02608 -0.0331133 0.034852 0.00584668 0.0748838 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2073 2074 3.2355 -0.281565 -0.28037 0.00725043 0.066245 -0.0864896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2024 2074 -0.0596035 -3.19203 0.00444458 0.0586624 0.00533366 -0.00247801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2074 2075 3.34897 -0.243918 -0.380994 0.00719646 0.0703908 -0.080131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2025 2075 -0.154515 -3.15247 -0.0985383 0.0646652 0.00503656 -0.0110783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2075 2076 3.09958 -0.245393 0.0389515 -0.00125908 0.0733213 -0.074256 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2026 2076 0.00105436 -3.13418 -0.189395 0.0640034 -0.00734671 0.0561624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2076 2077 3.18686 -0.0629364 -0.322865 0.00663695 0.0853561 -0.133736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2027 2077 0.11636 -3.03798 -0.0808031 0.0721439 -0.00156617 0.00876136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2077 2078 3.27248 -0.0802403 -0.169341 -0.00577254 0.0860289 -0.0914254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2028 2078 -0.0823317 -2.97797 -0.0764544 0.0692111 -0.0153935 -0.0512033 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2078 2079 3.36367 -0.398205 -0.153276 -0.00617412 0.0667595 -0.0888232 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2029 2079 -0.083409 -3.16984 -0.117541 0.059723 -0.00340749 -0.031345 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2079 2080 3.33689 -0.167474 -0.173329 -0.0182651 0.0682695 -0.0790131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2030 2080 -0.026439 -3.08984 -0.168958 0.0668361 0.00477201 0.00599049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2080 2081 3.29572 -0.356409 -0.0220755 -0.0126983 0.0683333 -0.0727979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2031 2081 -0.0878578 -3.23564 -0.0802511 0.055439 0.00558155 0.0158114 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2081 2082 3.10932 -0.101866 -0.187508 0.00567295 0.0586972 -0.104557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2032 2082 0.16457 -3.02033 -0.00474537 0.0544923 0.00328378 -0.0386924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2082 2083 3.385 -0.228971 0.0418952 -0.000446854 0.0551066 -0.100299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2033 2083 0.096681 -3.17533 -0.179596 0.052828 -0.00682934 -0.0114303 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2083 2084 3.1837 -0.327535 -0.147419 0.000648578 0.0686683 -0.0733417 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2034 2084 -0.0175213 -3.17233 -0.355849 0.0597391 -0.00164909 0.0204688 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2084 2085 3.33913 -0.3002 -0.0953406 0.00583069 0.0644125 -0.0888377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2035 2085 -0.00208623 -3.05323 -0.113959 0.0829344 0.00757171 0.0242746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2085 2086 3.29366 -0.112846 -0.182767 0.00129288 0.0851211 -0.146947 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2036 2086 -0.201835 -2.89584 -0.104823 0.0503072 -0.0130249 -0.0347829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2086 2087 3.26502 -0.225465 -0.133874 -0.00978673 0.0710281 -0.159176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2037 2087 -0.0342074 -3.03427 -0.0389665 0.071919 -0.00548747 0.0203872 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2087 2088 3.31718 -0.467704 -0.249224 0.00665724 0.0688026 -0.16404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2038 2088 -0.0874539 -3.00212 -0.127525 0.0553764 0.00434 0.00207149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2088 2089 3.36706 -0.255742 -0.186457 -0.0210302 0.0651889 -0.0649077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2039 2089 -0.105224 -2.97762 -0.249731 0.0902369 -0.0123383 -0.00576199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2089 2090 3.29221 -0.213925 -0.221204 -0.0102906 0.0631515 -0.140249 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2040 2090 0.0733136 -2.91418 -0.0160392 0.061554 0.00148906 0.0453055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2090 2091 3.14634 -0.287549 -0.0415104 -0.00920953 0.0476644 -0.0834088 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2041 2091 0.00508262 -2.97265 -0.0364925 0.061254 0.000248604 -0.00907404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2091 2092 3.4355 -0.164266 -0.241845 -0.00673108 0.067254 -0.0811744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2042 2092 0.0856552 -2.91678 -0.286219 0.0425361 0.00794308 0.036011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2092 2093 3.15122 -0.262831 -0.209649 -0.00120014 0.0441063 -0.16746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2043 2093 0.173001 -3.01187 -0.172236 0.0702964 -0.0343912 -0.019426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2093 2094 3.23982 -0.0802858 0.00519565 -3.38582e-05 0.0690729 -0.149072 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2044 2094 -0.170521 -3.00903 0.0820987 0.0656561 0.00435668 0.0151329 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2094 2095 3.41168 -0.298765 -0.0959007 0.00154137 0.0716667 -0.0830857 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2045 2095 -0.0344129 -3.17738 -0.210418 0.0750575 -0.00504989 0.00342019 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2095 2096 3.19036 -0.336984 -0.0754017 0.00254432 0.0737186 -0.106548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2046 2096 0.0357437 -2.97089 -0.172259 0.037961 0.00975672 0.0566529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2096 2097 2.9825 -0.240019 -0.230277 -0.00926356 0.0664646 -0.107576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2047 2097 -0.179329 -3.05595 -0.199372 0.0557119 -0.000276223 -0.0091321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2097 2098 3.24548 -0.418819 -0.0919402 -0.0131551 0.0558481 -0.0254452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2048 2098 0.0239904 -3.14064 -0.0721547 0.0628278 0.00357536 -0.00128961 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2098 2099 3.16442 -0.257845 -0.351951 -0.00100272 0.0286973 -0.157252 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2049 2099 0.0447434 -3.06865 -0.206976 0.0413987 0.00110092 0.0353858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2099 2100 3.13503 -0.170765 -0.0585885 -0.0058766 0.0680699 -0.112874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2050 2100 -0.123194 -2.78671 -0.255897 0.0778827 0.000634355 0.00619237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2100 2101 3.11874 -0.201613 -0.165434 0.00720114 0.0736508 -0.153177 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2051 2101 0.0189238 -3.13952 -0.119553 0.0576161 -0.0200777 -0.00339139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2101 2102 3.21948 -0.242775 -0.154584 -0.0106284 0.0709991 -0.158461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2052 2102 -0.154336 -3.15101 0.00879614 0.0734826 0.0194796 -0.00151207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2102 2103 3.08549 -0.199584 -0.183659 -0.00910293 0.0642013 -0.12979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2053 2103 0.0214168 -3.01003 0.0169212 0.0589921 0.0110367 -0.0233899 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2103 2104 3.24132 -0.241215 -0.292536 0.00196296 0.0582606 -0.13969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2054 2104 0.0983086 -3.02869 -0.0370127 0.0703845 0.00778315 0.0168976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2104 2105 3.12134 -0.301012 -0.098041 0.0123789 0.058101 -0.0867257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2055 2105 0.185214 -3.3471 0.0350969 0.0619295 -0.00332093 0.0150214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2105 2106 3.19036 -0.30163 -0.207732 -0.00107278 0.070542 -0.116465 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2056 2106 -0.0120497 -3.04035 -0.225792 0.0558352 -0.0126199 -0.0729789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2106 2107 3.11121 -0.241309 0.0191096 -0.0177954 0.0594074 -0.122914 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2057 2107 -0.149921 -2.95745 -0.165196 0.0742485 0.00929994 0.0654027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2107 2108 3.07783 -0.278546 -0.123676 -0.00834733 0.061173 -0.209048 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2058 2108 0.000495389 -2.98658 -0.0119766 0.0539133 -0.00398004 0.0116258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2108 2109 3.16526 -0.0937671 -0.16787 -0.0022322 0.0714973 -0.110275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2059 2109 -0.0916159 -2.94045 -0.216918 0.0693527 0.00724444 -0.029856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2109 2110 3.00497 -0.303564 -0.00339931 -0.000248477 0.0629414 -0.123826 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2060 2110 -0.0533854 -2.85278 0.00704746 0.0612155 0.000502768 0.065519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2110 2111 3.15378 -0.297936 -0.0224724 -0.00205779 0.0556431 -0.0875043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2061 2111 -0.146266 -3.00686 -0.215619 0.0446226 -0.0209561 -0.0216762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2111 2112 3.16663 -0.0369884 -0.0054611 -0.0107492 0.055226 -0.0712642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2062 2112 -0.129272 -3.03663 -0.115804 0.0497388 -0.00357638 -0.0324303 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2112 2113 3.0169 -0.117958 -0.0508984 -0.00933431 0.0736519 -0.133225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2063 2113 -0.130455 -2.92247 -0.0128724 0.03888 -0.00499482 -0.00382037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2113 2114 3.18669 -0.224334 -0.153768 0.00498151 0.0631218 -0.0530628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2064 2114 0.261451 -3.10266 -0.0498864 0.0530091 -0.00785628 0.0562943 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2114 2115 2.91763 -0.188078 -0.206345 -0.000672828 0.0722523 -0.0837345 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2065 2115 0.0254718 -3.00189 0.0231042 0.0657407 0.0137097 0.00990657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2115 2116 3.14354 0.00118941 -0.1014 -0.00331625 0.0706252 -0.138874 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2066 2116 -0.049218 -3.13552 0.0189291 0.0516224 0.00153337 0.00243076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2116 2117 2.96317 -0.239017 -0.116822 0.0136974 0.0716234 -0.0977087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2067 2117 -0.107908 -2.88364 0.0978589 0.0653825 0.0102611 0.00733026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2117 2118 3.13744 -0.0938027 0.103234 0.0235355 0.057976 -0.0923654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2068 2118 0.0766294 -3.06592 -0.154883 0.0615836 0.00299977 0.0851522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2118 2119 3.08753 -0.21266 0.050822 -0.00288516 0.0641923 -0.0580081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2069 2119 -0.18226 -2.96298 -0.220603 0.0599494 0.0130247 0.00427652 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2119 2120 2.90142 -0.20835 -0.214941 -0.0156517 0.0556673 -0.103197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2070 2120 0.133802 -2.89555 -0.130823 0.0609887 0.0176603 -0.0365241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2120 2121 2.94659 -0.185591 -0.298557 -0.0052582 0.0430418 -0.0805965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2071 2121 0.0431569 -3.14066 -0.147187 0.0733879 0.0283546 0.0276001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2121 2122 3.05456 -0.147706 -0.163355 0.00895099 0.0441724 -0.0932113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2072 2122 0.0265842 -3.16831 0.00734246 0.0393853 -0.0204875 -0.0333689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2122 2123 2.86447 -0.186523 -0.103665 0.00509991 0.0415548 -0.109404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2073 2123 0.000393012 -2.99798 0.0855685 0.0507149 0.00252677 -0.0717992 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2123 2124 3.04689 -0.297491 -0.102629 0.00439869 0.0605626 -0.171355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2074 2124 -0.0254687 -3.02397 -0.20654 0.0672056 -0.0136651 0.0418254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2124 2125 3.08765 -0.250439 -0.0506802 0.0141969 0.0395219 -0.134943 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2075 2125 -0.0102956 -3.03346 -0.0513876 0.0696785 -0.00988992 0.0195109 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2125 2126 3.02846 -0.27499 -0.229663 -0.00414909 0.0498197 -0.0153707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2076 2126 0.0476452 -3.0611 -0.282201 0.0627264 0.0163537 -0.0171143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2126 2127 2.94135 -0.331537 -0.163876 -0.00184658 0.0718784 -0.0532898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2077 2127 -0.0510679 -2.99195 -0.320886 0.0562834 -0.00924539 -0.0591864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2127 2128 2.99822 -0.316052 -0.0903634 0.00932171 0.0470029 -0.0352046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2078 2128 0.01914 -3.14313 -0.0788628 0.0486667 -0.0109594 -0.0232551 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2128 2129 3.09378 -0.059808 -0.0984537 -0.0189384 0.0712385 -0.177982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2079 2129 0.0908892 -2.9919 -0.0835521 0.082241 0.00911466 -0.0573359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2129 2130 3.06748 -0.19482 -0.204036 0.0021858 0.0550733 -0.0808815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2080 2130 -0.0279914 -2.86856 -0.011704 0.0596608 -0.0120681 0.0510995 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2130 2131 2.88483 -0.267356 -0.0967774 -0.0166276 0.0726537 -0.0762725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2081 2131 -0.041066 -3.00748 -0.119344 0.05635 0.020397 -0.0285808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2131 2132 3.02909 -0.170109 -0.18227 0.00293366 0.0645805 -0.162191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2082 2132 -0.114778 -3.13531 -0.0993181 0.0461516 0.0322137 0.0441368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2132 2133 2.86662 -0.358957 -0.152816 -0.0185076 0.054713 -0.0922482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2083 2133 -0.0300311 -3.04495 -0.170569 0.0654075 0.00777198 -0.0401034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2133 2134 3.03495 -0.282425 0.129501 0.00286561 0.0330925 -0.128469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2084 2134 -0.233249 -2.98449 -0.139945 0.0551031 0.00284808 -0.0435305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2134 2135 3.03235 -0.337068 -0.0352917 0.00162051 0.0640574 -0.0525518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2085 2135 -0.156357 -3.00282 -0.00552253 0.068278 -0.0036317 0.00547228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2135 2136 2.99134 -0.374864 -0.0640829 -0.00024072 0.0571269 -0.207926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2086 2136 -0.0496582 -3.02762 -0.129938 0.0448528 -0.00354146 0.0879703 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2136 2137 2.85107 -0.177509 0.0270334 -0.00417102 0.0542517 -0.0881676 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2087 2137 -0.161622 -2.94154 -0.0194867 0.0385729 0.0203393 -0.0163314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2137 2138 2.705 -0.398588 -0.0867881 0.00757544 0.0525705 -0.0912204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2088 2138 -0.120914 -3.04911 -0.0946241 0.046067 -0.0102888 -0.0102718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2138 2139 3.02087 -0.144757 -0.00298317 -0.0228381 0.0736392 -0.103116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2089 2139 -0.19102 -3.08136 -0.0237986 0.0502337 -0.00177006 0.0296535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2139 2140 3.01131 -0.236663 -0.092828 -0.010391 0.0520876 -0.170082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2090 2140 -0.170683 -2.81957 -0.262863 0.0746683 -0.0113907 0.00428683 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2140 2141 2.85416 -0.214898 -0.0965311 -0.0178113 0.0680416 -0.183037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2091 2141 0.0408146 -3.10091 -0.0220481 0.0613321 0.00395719 0.0189992 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2141 2142 2.96134 -0.228075 -0.0354297 -0.00785753 0.0455761 -0.0920851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2092 2142 0.254939 -3.03945 -0.131421 0.0670357 0.00511291 -0.0629439 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2142 2143 2.93735 -0.211107 -0.0533829 -0.0156941 0.0580065 -0.104052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2093 2143 -0.0833379 -2.95533 -0.121737 0.0691359 -0.00096858 -0.0205342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2143 2144 2.94033 -0.239342 -0.134921 0.00366534 0.0535404 -0.125346 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2094 2144 -0.119895 -3.15628 -0.11941 0.0622629 -0.0136203 -0.00387472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2144 2145 2.82771 -0.058074 -0.0847544 -0.0042735 0.0771758 -0.0987404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2095 2145 -0.060066 -2.89078 -0.266169 0.0654683 0.00039393 -0.0272923 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2145 2146 2.81758 -0.241485 -0.0455579 -0.00589462 0.0769249 -0.0817759 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2096 2146 0.010105 -3.07861 -0.066546 0.0756127 -0.00710492 -0.0659996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2146 2147 2.74998 -0.415505 0.0589001 -0.0137554 0.0399766 -0.120529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2097 2147 -0.0671575 -2.98555 -0.223243 0.0580397 0.0148279 -0.0150881 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2147 2148 2.83017 -0.13845 -0.0723086 -0.00633034 0.0619657 -0.121942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2098 2148 -0.102852 -2.91569 0.0028844 0.0707376 -0.0144605 -0.0463225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2148 2149 2.8416 -0.184699 -0.0206475 0.00337293 0.0616063 -0.13522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2099 2149 0.0340349 -3.19928 -0.0715693 0.0512431 0.00256486 0.0101582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2149 2150 2.76972 0.0193745 -0.116096 -0.00344632 0.0604719 -0.148043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2100 2150 0.0117521 -3.04309 -0.0911104 0.0620405 -0.00906356 -0.00620278 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2150 2151 2.79106 -0.395836 -0.144435 0.0124217 0.0506971 -0.160353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2101 2151 0.00970708 -3.14109 -0.297364 0.0557185 0.00686157 -0.00236174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2151 2152 3.00288 -0.14102 0.0517604 0.0053679 0.06271 -0.0743961 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2102 2152 -0.0120343 -3.21792 -0.191891 0.070351 -0.00573214 -0.0445803 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2152 2153 2.80302 -0.297836 -0.17321 -0.0107993 0.0346496 -0.139972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2103 2153 -0.0482759 -3.12102 -0.127425 0.077672 -0.00428909 -0.012069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2153 2154 2.90242 -0.325618 -0.140133 0.000624627 0.0542871 -0.103751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2104 2154 -0.0249924 -2.95525 -0.0808759 0.0642462 0.0213524 0.029783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2154 2155 2.82276 -0.191489 -0.172371 -0.00978901 0.0584721 -0.0786566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2105 2155 -0.0253103 -3.07117 -0.0849674 0.0576022 0.016439 -0.0312684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2155 2156 2.67414 -0.152866 -0.173903 -0.0185616 0.0413402 -0.174089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2106 2156 -0.00699182 -2.92859 -0.128395 0.060665 0.00447888 -0.026431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2156 2157 2.82588 -0.271739 -0.046187 -0.000265027 0.0526901 -0.0930627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2107 2157 -0.0170204 -3.20539 -0.0960487 0.0570777 -0.00442251 -0.0200596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2157 2158 2.74048 -0.220883 -0.228373 0.00905551 0.0534038 -0.076724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2108 2158 0.204426 -3.10931 -0.0617148 0.0596847 0.0153916 0.035025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2158 2159 2.63973 -0.0802336 -0.190278 -0.00792756 0.0552939 -0.14816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2109 2159 -0.150567 -3.05978 -0.0651103 0.0623285 -0.00902001 -0.0463878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2159 2160 2.76106 -0.346252 -0.116985 -0.0207811 0.0286117 -0.0364182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2110 2160 0.256321 -2.90869 -0.231602 0.0697025 -0.0111693 0.0570987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2160 2161 2.62533 -0.340821 -0.0992983 -0.0148021 0.0619839 -0.074371 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2111 2161 0.145595 -3.06737 -0.100928 0.0610828 0.0118919 0.030932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2161 2162 2.6436 -0.257744 -0.0761311 -0.00198371 0.0644577 -0.138977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2112 2162 -0.102644 -3.04447 -0.132148 0.0698521 -0.00310548 0.0316294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2162 2163 2.77023 -0.410161 -0.124668 -0.0167919 0.0616824 -0.12956 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2113 2163 0.0106771 -2.97068 0.0332433 0.0643192 0.00212709 0.0603782 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2163 2164 2.58488 -0.278603 0.0174039 -0.00925431 0.0550927 -0.122031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2114 2164 0.153236 -3.11544 -0.0336354 0.0566081 0.00905873 -0.0189256 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2164 2165 2.60739 -0.257122 -0.101955 -0.0153533 0.0667349 -0.0966007 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2115 2165 -0.000287043 -2.98676 -0.147097 0.0661296 0.000172252 -0.026388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2165 2166 2.68056 -0.273622 0.0528448 0.00204809 0.0458905 -0.109995 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2116 2166 0.00458294 -3.0702 -0.00728502 0.0524605 0.00948238 0.012112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2166 2167 2.81107 -0.156203 0.0491687 -0.0133144 0.06158 -0.0379959 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2117 2167 0.061471 -3.15293 -0.0660774 0.0490614 -0.00338492 -0.00657597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2167 2168 2.76063 -0.105588 0.0212139 -0.0032577 0.0438386 -0.133228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2118 2168 0.159012 -2.93752 -0.26102 0.0675307 -0.00191728 -0.0303468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2168 2169 2.60847 -0.34208 -0.191335 0.0123268 0.056977 -0.10391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2119 2169 0.193779 -2.95555 0.00395872 0.0547442 -0.0137967 -0.0126171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2169 2170 2.69378 -0.243534 0.0365211 0.00629527 0.0484134 -0.139026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2120 2170 -0.0198997 -3.20647 -0.0217357 0.0427429 -0.00325094 -0.00539372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2170 2171 2.56223 -0.091304 0.0936846 0.00299023 0.0364252 -0.127767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2121 2171 -0.139601 -3.16729 -0.106272 0.0530322 -0.00561885 0.0544867 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2171 2172 2.62996 -0.251588 -0.126104 0.00710187 0.0535995 -0.102385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2122 2172 0.00951113 -3.08614 -0.0493098 0.0679428 -0.0168607 0.0182804 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2172 2173 2.57139 -0.170799 -0.0875925 -0.0104156 0.0589215 -0.134291 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2123 2173 0.132089 -2.95522 -0.112685 0.0728768 0.00457346 -0.0239531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2173 2174 2.78383 -0.163845 -0.171656 0.00336818 0.0477432 -0.118073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2124 2174 0.118418 -3.04213 -0.0818185 0.0847543 0.00257283 -0.0134623 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2174 2175 2.56906 -0.20738 -0.138053 -0.0141802 0.0657524 -0.106051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2125 2175 0.0139486 -3.06089 -0.0375995 0.0535071 0.00688034 -0.0275647 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2175 2176 2.58835 -0.1435 -0.203424 -0.0220256 0.0553011 -0.108426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2126 2176 -0.113293 -3.0193 -0.0628315 0.05858 -0.0160686 -0.011798 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2176 2177 2.78201 -0.0757288 -0.0590521 -0.00296881 0.0606651 -0.132334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2127 2177 0.0950199 -2.96638 -0.0580626 0.0415916 0.0109129 0.0825153 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2177 2178 2.71021 -0.280013 -0.0592529 -0.0156621 0.0437127 -0.0595227 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2128 2178 0.0648743 -2.75039 0.13961 0.0549993 0.00896194 0.0342155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2178 2179 2.55366 -0.245601 -0.0176089 0.00949529 0.0633613 -0.0300987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2129 2179 -0.0135544 -3.02566 -0.00291222 0.0584907 -0.000769573 0.0605119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2179 2180 2.5375 -0.322054 -0.168304 -0.020573 0.0660738 -0.174695 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2130 2180 0.105597 -3.10984 -0.105639 0.0802704 0.00551807 -0.0450681 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2180 2181 2.63204 -0.139707 -0.0836986 -0.00338655 0.0454505 -0.108587 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2131 2181 0.154913 -2.81921 -0.0794897 0.0642984 0.00329247 0.0504714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2181 2182 2.60929 -0.226707 -0.0366647 -0.00813421 0.0507866 -0.121907 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2132 2182 0.0572089 -3.08445 0.0161857 0.0587952 -0.0215872 -0.0789391 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2182 2183 2.46535 -0.163446 -0.0820948 -0.0162908 0.0689026 -0.111217 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2133 2183 0.20885 -3.20112 -0.112124 0.057796 0.0055474 0.0132519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2183 2184 2.60707 -0.173847 0.0184197 -0.0101192 0.0491608 -0.168649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2134 2184 -0.00756476 -3.02709 -0.190457 0.0717803 -0.00256363 0.0368102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2184 2185 2.63386 -0.098519 0.0738556 -0.00844361 0.0576049 -0.152592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2135 2185 -0.192417 -3.10896 -0.0359544 0.0758008 0.0126583 -0.0141557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2185 2186 2.58423 -0.145607 -0.0829623 -0.0233167 0.0647222 -0.0841058 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2136 2186 -0.0432472 -3.04974 0.0556173 0.0516961 0.00628261 0.0038474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2186 2187 2.71082 -0.231633 -0.0952657 0.00573524 0.0407861 -0.147922 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2137 2187 0.192097 -3.03517 -0.228358 0.0532266 0.0241612 -0.0447211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2187 2188 2.66462 -0.138512 0.0944016 -0.00179948 0.0434429 -0.081822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2138 2188 -0.0177225 -3.05202 -0.22512 0.0532346 0.0243122 -0.034997 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2188 2189 2.40702 -0.191167 -0.0507019 0.00255912 0.0455441 -0.0822839 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2139 2189 -0.0492927 -3.15565 -0.0285129 0.0531856 0.00512708 -0.0118711 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2189 2190 2.58494 -0.380584 -0.098209 0.0154096 0.0479391 -0.134884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2140 2190 0.101683 -2.87027 0.0241184 0.0657311 0.00920469 0.0086501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2190 2191 2.56239 -0.261385 -0.0668467 0.00890474 0.0484508 -0.0991698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2141 2191 -0.00193299 -3.18117 -0.137418 0.0585993 0.00424966 -0.00175326 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2191 2192 2.51927 -0.168366 -0.131046 0.0153068 0.0540741 -0.094574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2142 2192 0.0371219 -3.0515 -0.103975 0.0596846 -0.0076224 0.00152479 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2192 2193 2.53748 -0.046566 -0.0662339 0.00909192 0.0621657 -0.139698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2143 2193 0.115534 -3.02731 -0.110445 0.0789851 0.0084502 -0.067299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2193 2194 2.46796 -0.0634905 0.0617769 -0.00334595 0.0511806 -0.140635 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2144 2194 0.0262407 -2.98219 -0.140879 0.0552686 -0.00751029 -0.070464 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2194 2195 2.55324 -0.21086 -0.0280942 0.00739696 0.0499895 -0.10125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2145 2195 -0.0639281 -3.11846 -0.354936 0.071781 0.000760186 0.04394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2195 2196 2.49325 -0.160726 -0.0387394 0.0114046 0.0482068 -0.0341091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2146 2196 -0.0161992 -2.93174 -0.131956 0.062914 -0.00557051 -0.0191115 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2196 2197 2.74131 -0.235165 -0.181812 -0.0173927 0.0439551 -0.15011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2147 2197 -0.0479604 -2.94527 0.0440888 0.0591484 -0.012885 0.0628588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2197 2198 2.54727 -0.175575 -0.0673235 0.010302 0.0560763 -0.0422483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2148 2198 0.0559343 -3.08769 -0.206948 0.0671437 0.0309344 0.0315174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2198 2199 2.443 -0.192448 -0.197352 0.00137626 0.0315989 -0.111309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2149 2199 -0.187 -2.95398 -0.113378 0.0758558 -0.000467136 0.0393832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2199 2200 2.55334 -0.114688 0.105397 0.00297992 0.0416396 -0.137647 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2150 2200 0.0612344 -3.01045 -0.174001 0.042645 -0.00139287 0.11777 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2200 2201 2.53868 -0.156379 0.025403 0.00102383 0.0456967 -0.115938 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2151 2201 -0.0819293 -2.96053 -0.156127 0.0527369 -0.017202 -0.0607376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2201 2202 2.31722 -0.198021 -0.104894 -0.00218198 0.0586299 -0.103799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2152 2202 -0.171209 -3.11954 -0.167808 0.0430741 0.00181673 0.0545987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2202 2203 2.3647 -0.198329 -0.124762 0.0230278 0.0479874 -0.109354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2153 2203 -0.000337496 -2.99622 0.00581779 0.0357173 -0.0152898 -0.0439402 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2203 2204 2.56192 -0.239004 -0.0748405 0.00771442 0.0608531 -0.110621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2154 2204 -0.168527 -3.13153 -0.145714 0.0523454 -0.00158164 -0.0442335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2204 2205 2.48643 -0.155395 -0.0622614 -0.0144722 0.0484022 -0.154677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2155 2205 -0.102031 -3.02013 -0.108693 0.0455811 0.0116463 0.00559224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2205 2206 2.53363 -0.216545 -0.147638 -0.0111186 0.0477272 -0.0725542 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2156 2206 -0.0961555 -3.0657 -0.00638748 0.0737824 -0.00666913 -0.00444333 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2206 2207 2.42826 -0.25274 -0.116226 -0.0118247 0.066264 -0.142314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2157 2207 0.128899 -3.02135 -0.0742188 0.0477688 -0.0059032 -0.0212365 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2207 2208 2.32818 -0.142037 0.145586 0.00823538 0.0484547 -0.0761591 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2158 2208 0.0492144 -3.08501 -0.160657 0.0422296 0.016621 0.0040718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2208 2209 2.30257 -0.272176 -0.102851 -0.010707 0.043215 -0.0985159 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2159 2209 0.106064 -3.24122 -0.200244 0.0723842 -0.00502528 -0.0629091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2209 2210 2.45692 -0.193683 0.00993662 0.0094787 0.0368965 -0.0531162 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2160 2210 -0.0397761 -3.14273 -0.142255 0.046293 0.00345791 0.0754936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2210 2211 2.51071 -0.198808 -0.0302144 0.00240251 0.0603905 -0.0309833 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2161 2211 0.0641557 -3.12435 -0.0299417 0.0699469 -0.000729235 -0.0175618 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2211 2212 2.49369 -0.0733512 -0.0799538 -0.00157619 0.0377967 -0.102628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2162 2212 -0.041255 -3.08557 -0.0228275 0.0864277 -0.00843774 -0.00971821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2212 2213 2.39006 -0.153298 0.0373865 -0.0226361 0.0519442 -0.0801719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2163 2213 0.0304574 -3.11691 -0.160732 0.046151 -0.015834 0.0374166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2213 2214 2.43932 -0.0730176 -0.088475 -0.00612907 0.0509844 -0.105423 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2164 2214 0.108739 -3.00643 0.027084 0.085755 0.00694204 -0.0350078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2214 2215 2.18211 -0.134376 -0.15483 -0.00990024 0.0410178 -0.130337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2165 2215 0.206983 -3.06189 -0.111523 0.0529433 -0.0110484 0.0261857 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2215 2216 2.41499 -0.0178778 0.040534 -0.0208511 0.0657067 -0.0748808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2166 2216 -0.038263 -3.10795 -0.172717 0.0410832 0.00226538 0.0363367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2216 2217 2.23393 -0.421369 -0.0605318 -0.0122319 0.04604 -0.116962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2167 2217 -0.0311467 -3.33994 -0.168698 0.0585983 -0.00533927 0.0196479 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2217 2218 2.28824 -0.187991 0.266978 -0.00985517 0.0449668 -0.123766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2168 2218 0.0277269 -3.02926 -0.0189177 0.076134 0.00562826 -0.0883684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2218 2219 2.21914 -0.0891997 0.0758099 -0.00422216 0.0621502 -0.0502196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2169 2219 -0.132009 -3.20052 -0.124892 0.0752632 0.00978722 -0.0185529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2219 2220 2.28897 -0.277102 -0.0897139 0.00585621 0.0325006 -0.0626968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2170 2220 0.0515657 -3.19811 -0.0226816 0.0722133 0.0038119 -0.0238968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2220 2221 2.40356 -0.0794056 -0.0707853 0.00827225 0.042917 -0.0745777 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2171 2221 0.0020289 -3.0789 -0.105971 0.0642963 0.000587239 0.0634684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2221 2222 2.41028 -0.240465 -0.00656688 -0.013988 0.0423601 -0.207671 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2172 2222 -0.089643 -3.07374 0.0917028 0.07227 0.0203225 -0.00457888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2222 2223 2.21486 -0.265447 -0.108695 -0.00823859 0.0416198 -0.107906 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2173 2223 0.0348587 -3.13613 -0.181005 0.0703685 0.00818457 -0.0208879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2223 2224 2.35291 -0.0587143 0.16297 -0.00911025 0.0251222 -0.0962579 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2174 2224 -0.00313106 -3.06027 -0.147292 0.0826754 0.0110752 -0.0888304 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2224 2225 2.49824 -0.381568 -0.247656 0.0183914 0.0503724 -0.0649581 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2175 2225 -0.175605 -3.17031 -0.199502 0.0490859 0.000529661 0.00392985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2225 2226 2.38142 -0.166439 -0.211008 0.0036302 0.044916 -0.106245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2176 2226 -0.0534163 -3.00006 0.0805199 0.0566234 0.00399041 0.0467162 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2226 2227 2.27315 -0.201948 0.145509 0.0162738 0.0444936 -0.112116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2177 2227 0.0729397 -3.10352 -0.257411 0.050738 0.0234286 0.0101824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2227 2228 2.13866 -0.323873 0.0584076 0.00628432 0.0501886 -0.0786884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2178 2228 -0.129155 -3.00117 -0.209532 0.0635982 -0.00349307 -0.0127521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2228 2229 2.24573 -0.226832 -0.0876004 -0.00226324 0.0416601 -0.0834806 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2179 2229 -0.113299 -3.05684 -0.210092 0.0476924 0.00343535 0.0287745 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2229 2230 2.14541 -0.0988302 -0.00688579 0.000161036 0.0440841 -0.121684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2180 2230 -0.0189862 -3.10925 0.00164508 0.0754132 -0.00609559 -0.0495884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2230 2231 2.26833 -0.119201 -0.16057 -0.00263417 0.0678643 -0.0387118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2181 2231 -0.0587379 -3.11642 -0.124486 0.0634916 0.0135817 0.0329516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2231 2232 2.20321 -0.234994 -0.0591747 -0.00743613 0.0634624 -0.0870604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2182 2232 -0.0113093 -3.08881 -0.0505008 0.0722501 0.0104092 -0.00702917 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2232 2233 2.30716 -0.30245 -0.0345714 0.00339953 0.0645713 -0.088468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2183 2233 0.0726105 -3.07909 -0.0203768 0.0416527 0.00104335 -0.00793801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2233 2234 2.34224 -0.0479596 -0.117307 0.0170189 0.0467825 -0.144716 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2184 2234 -0.0302362 -3.11005 -0.154014 0.0596551 -0.0105178 0.0172454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2234 2235 2.10604 -0.211645 -0.0377961 -0.00254966 0.0262045 -0.107494 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2185 2235 0.15347 -2.98528 -0.0187968 0.0567387 0.00452622 -0.030051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2235 2236 2.18674 -0.387761 -0.0670731 -0.02454 0.0492286 -0.13848 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2186 2236 -0.0476083 -2.98281 -0.0224559 0.0509072 -0.00193434 -0.0683612 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2236 2237 2.29351 -0.21551 -0.127336 -0.00939725 0.0474332 -0.0526786 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2187 2237 -0.0408969 -3.07651 -0.124193 0.0675363 -0.00591591 -0.0189927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2237 2238 2.21828 -0.0361587 -0.149308 0.00145389 0.0522492 -0.137814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2188 2238 -0.0176007 -2.96329 -0.182624 0.0487616 0.00270851 0.00544472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2238 2239 2.13603 -0.438616 0.185176 -0.0103 0.0397437 -0.192253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2189 2239 -0.173644 -2.93198 -0.218538 0.0601447 0.0189924 -0.000201178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2239 2240 2.14175 -0.0934289 -0.0927082 -0.0115379 0.0293668 -0.139331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2190 2240 -0.0104062 -3.19554 -0.0683765 0.0504799 -0.000922227 0.0737575 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2240 2241 2.27455 -0.0841658 -0.153554 -0.00610606 0.0503873 -0.134453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2191 2241 -0.079757 -3.04263 -0.129327 0.0551978 -0.00137589 -0.0517119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2241 2242 2.40569 -0.0856973 0.00508491 -0.00437298 0.0272206 -0.119376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2192 2242 0.259483 -3.19725 -0.012703 0.0574886 0.00932987 0.0208732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2242 2243 2.19892 -0.305506 -0.00208666 -0.00105475 0.0379288 -0.15478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2193 2243 0.252445 -2.99016 -0.0735526 0.0593516 -0.00320603 -0.0113615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2243 2244 2.10773 -0.261746 -0.20281 -0.0043918 0.0420619 -0.0945009 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2194 2244 -0.0730365 -3.10255 -0.113453 0.0361795 -0.00759446 -0.00207097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2244 2245 2.20503 -0.09637 -0.0172909 0.00490303 0.0515887 -0.0251422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2195 2245 -0.0571928 -3.09838 -0.100858 0.0641565 0.0120953 0.0380407 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2245 2246 2.11452 -0.240469 -0.0303933 0.00913271 0.0391608 -0.0474607 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2196 2246 -0.0409103 -2.9799 -0.196964 0.0685299 -0.00212445 -0.0316318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2246 2247 2.08407 -0.393739 -0.0400024 0.00768771 0.0587528 -0.16516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2197 2247 -0.133508 -3.32853 -0.069374 0.0735004 -0.0021991 -0.0651638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2247 2248 2.16682 -0.247001 -0.208535 -0.0017154 0.0496419 -0.119736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2198 2248 0.095991 -3.06765 0.0395367 0.0590997 -0.00565179 0.0272462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2248 2249 2.1459 -0.111355 0.0157882 -0.0203288 0.057114 -0.13931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2199 2249 0.00152709 -3.28254 -0.19906 0.0686271 -0.00888458 0.0494557 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2249 2250 2.01073 -0.0475806 0.0156337 0.00332742 0.0484108 -0.152279 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2200 2250 0.0731715 -3.05511 -0.168677 0.0610033 0.000739234 0.0470764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2250 2251 2.12883 -0.174054 -0.0828055 0.0077702 0.0451207 -0.130534 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2201 2251 0.0318476 -3.08408 0.0372244 0.0556236 -0.0161512 -0.0249414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2251 2252 2.08477 0.0094325 0.194089 0.00578599 0.0405357 -0.0935046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2202 2252 0.135354 -3.00065 -0.070474 0.0465842 0.00553537 0.0905542 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2252 2253 2.12322 -0.15965 -0.0210489 -0.00373519 0.0338394 -0.159176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2203 2253 0.0621182 -2.99876 -0.126039 0.0566084 -0.00676457 0.0327106 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2253 2254 2.2382 -0.290356 0.145082 -0.0111957 0.0481654 -0.146779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2204 2254 0.141866 -3.13732 -0.194417 0.0781477 -0.010372 0.0650235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2254 2255 2.02312 -0.2504 0.0288613 -0.0150235 0.0288631 -0.117621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2205 2255 -0.00107366 -3.00815 -0.0399029 0.071044 -0.00886316 0.0360928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2255 2256 1.94161 -0.195137 -0.0529264 0.000324258 0.036713 -0.16058 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2206 2256 -0.00468805 -2.9346 -0.340954 0.0578146 -0.0165249 -0.0391668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2256 2257 2.05382 -0.316164 -0.000388159 -0.0104427 0.0698705 -0.0220898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2207 2257 -0.0641324 -3.197 -0.0476484 0.0594176 -0.0246235 0.000199991 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2257 2258 1.97607 -0.347581 -0.118434 -0.0141743 0.0310101 -0.069045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2208 2258 -0.0593136 -3.18147 -0.154494 0.0651677 -0.00601506 -0.00147135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2258 2259 1.89973 -0.111151 -0.179496 -0.00218827 0.0422617 -0.0715735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2209 2259 0.122889 -3.17773 0.0533363 0.0612789 0.0146025 0.0545342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2259 2260 2.01897 -0.0903023 -0.136324 -0.0031832 0.0373394 -0.0624987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2210 2260 0.0852201 -3.03755 -0.00071156 0.0646322 0.0163628 -0.050478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2260 2261 2.12452 -0.0722184 -0.164085 -0.000303897 0.0277105 -0.0816322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2211 2261 0.0888489 -2.96886 -0.0838832 0.059673 0.0107608 0.00195151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2261 2262 1.90337 -0.126811 -0.134714 0.0127164 0.0457254 -0.134046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2212 2262 -0.0848152 -2.93901 -0.11944 0.0527436 0.00334897 -0.0398191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2262 2263 1.99664 -0.107199 -0.0734655 0.00788355 0.0653937 -0.156745 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2213 2263 -0.0982209 -3.02872 0.0709948 0.0521799 0.016494 0.0290343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2263 2264 2.08043 -0.227108 -0.0959392 0.00651182 0.0401788 -0.146968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2214 2264 0.170761 -3.07959 -0.187069 0.0814214 0.0024925 -0.0158149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2264 2265 1.99483 -0.145478 -0.0256797 -0.00557818 0.044942 -0.161309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2215 2265 0.0611452 -3.00291 -0.0804721 0.0491091 -0.0148528 -0.0196653 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2265 2266 2.01374 -0.191152 -0.200787 -0.00457746 0.0380285 -0.113309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2216 2266 0.0389333 -3.1105 -0.125301 0.0595345 -0.00788476 -0.0385879 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2266 2267 1.93553 -0.221268 -0.12302 -0.0140487 0.0499578 -0.10009 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2217 2267 0.0530079 -3.1224 -0.106622 0.0735793 0.00467758 -0.0632729 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2267 2268 2.02526 -0.123949 -0.13481 0.00820823 0.0390393 -0.150725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2218 2268 0.110224 -3.18825 -0.123779 0.0479409 -0.0118006 0.0270549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2268 2269 1.92607 -0.224127 0.0275058 -0.0063251 0.0142911 -0.0817314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2219 2269 0.0352732 -2.99297 -0.122349 0.0785783 -0.00703558 0.0105912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2269 2270 2.04498 -0.12889 -0.0343222 0.00113892 0.0371032 -0.12962 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2220 2270 -0.11259 -3.10774 0.00556954 0.061117 -0.0196152 0.0178915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2270 2271 2.17281 -0.255601 -0.000481343 0.00883018 0.0489576 -0.157326 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2221 2271 0.0525041 -3.05159 -0.200526 0.0551212 -0.00266242 0.0289833 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2271 2272 1.99601 -0.159212 -0.152885 -0.00188707 0.0358892 -0.0943433 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2222 2272 -0.0463186 -3.01473 -0.0436129 0.0750965 -0.00902345 -0.029304 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2272 2273 1.90808 -0.15794 0.107742 -0.00454947 0.0282355 -0.130326 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2223 2273 -0.201168 -3.11363 0.0762748 0.0480078 -0.0131164 0.0348233 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2273 2274 1.94003 -0.103868 -0.0945336 -0.00926562 0.0254767 -0.0847906 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2224 2274 -0.00791141 -2.98722 -0.0521449 0.0697366 9.43602e-05 -0.0255034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2274 2275 1.99659 -0.119079 0.0962734 -0.00696213 0.0495352 -0.0625021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2225 2275 0.236758 -3.08478 -0.170701 0.069919 0.00181331 0.0262023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2275 2276 2.00207 -0.192687 0.00795414 -0.00197572 0.025751 -0.0779769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2226 2276 -0.0103581 -3.04668 -0.0377333 0.068364 0.0127543 0.00615847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2276 2277 2.07027 -0.234872 -0.0713098 0.00114781 0.0427079 -0.0868508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2227 2277 0.153741 -3.04103 -0.125169 0.0616774 -0.00353131 -0.00328143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2277 2278 1.69467 -0.280225 -0.125107 -0.014888 0.0422972 -0.120457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2228 2278 0.142356 -3.12135 0.0522025 0.0751974 0.0141556 -0.0277364 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2278 2279 1.93965 -0.285605 0.02596 0.0160656 0.0529081 -0.0883982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2229 2279 -0.147522 -2.92637 -0.175416 0.0568251 0.0202183 0.0239143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2279 2280 2.10948 -0.229895 0.0235473 0.011683 0.0240393 -0.158176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2230 2280 -0.0262539 -3.24955 -0.281895 0.0563195 0.00572416 -0.0636022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2280 2281 1.90619 -0.125626 -0.0514883 -0.0158303 0.0315251 -0.15712 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2231 2281 -0.0801277 -3.06658 0.0321917 0.082781 0.00434812 0.0554064 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2281 2282 1.90665 -0.151257 0.0525089 -0.0139749 0.0432134 -0.150882 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2232 2282 0.0209947 -3.17195 0.0299715 0.0665821 -0.000188366 -0.0613439 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2282 2283 2.00813 -0.125643 0.000770173 0.00260907 0.0324244 -0.087986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2233 2283 0.0453151 -3.18292 -0.117051 0.0486394 0.0131834 0.0306455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2283 2284 1.82385 -0.233781 -0.124276 -0.00232502 0.0386997 -0.0966375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2234 2284 -0.14367 -3.17219 -0.186889 0.0564919 -0.0167339 0.0287229 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2284 2285 1.70843 -0.0746772 0.0935637 0.00524045 0.0337941 -0.062141 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2235 2285 0.236379 -2.99963 -0.119173 0.0601594 0.00692067 -0.0228452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2285 2286 1.77948 -0.077969 -0.067751 0.00917599 0.0393393 -0.0919151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2236 2286 0.213813 -3.05517 0.0100068 0.0524267 -0.0113694 -0.0530015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2286 2287 1.98606 -0.383365 -0.00625424 0.00984569 0.0310147 -0.0902957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2237 2287 -0.0393351 -2.88869 0.0161872 0.0603079 -0.0100557 -0.00528367 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2287 2288 1.79612 -0.220759 -0.251684 0.0104236 0.0222496 -0.0697312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2238 2288 0.0736107 -3.12632 0.152321 0.0546737 0.00890132 0.0381808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2288 2289 1.99977 -0.205718 -0.000534324 -0.0140142 0.0395994 -0.103718 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2239 2289 -0.075851 -3.08171 -0.142838 0.0666229 -0.00488493 -0.0309152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2289 2290 1.7525 -0.0631915 -0.185304 0.000924595 0.0379304 -0.0793994 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2240 2290 -0.107804 -3.19145 -0.167181 0.0735432 0.0220161 0.0553523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2290 2291 1.68723 0.0242981 -0.00989759 0.00760996 0.0482857 -0.173045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2241 2291 0.148737 -2.87134 -0.122466 0.0642383 -0.00171842 0.0610499 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2291 2292 1.66644 -0.24247 -0.0224895 -0.0213625 0.0513636 -0.104588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2242 2292 -0.0546812 -2.88389 -0.0250769 0.0756875 -0.0137589 0.056273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2292 2293 2.01819 -0.343416 -0.193556 -0.00144894 0.036179 -0.087195 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2243 2293 -0.00924392 -3.19348 -0.127155 0.0677689 0.020185 0.0169812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2293 2294 1.75246 -0.16815 -0.0230253 0.00566216 0.0582354 -0.125771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2244 2294 0.0739248 -2.9843 -0.13323 0.0584267 0.0130617 0.0515137 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2294 2295 1.93289 -0.239617 -0.0117727 0.00365515 0.0298992 -0.0780965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2245 2295 -0.0400843 -3.15058 -0.119844 0.0542231 0.000396853 0.0730314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2295 2296 1.77148 -0.118496 -0.0111194 -0.00151149 0.0420747 -0.119993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2246 2296 -0.0364043 -3.02858 0.107759 0.0772343 -0.015815 -0.00821643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2296 2297 1.81996 -0.186001 -0.0486902 -0.00454247 0.0181332 -0.108845 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2247 2297 -0.0406195 -3.08942 -0.129353 0.0667155 -0.00581341 -0.0312832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2297 2298 1.77331 -0.0498224 0.0217255 -0.010217 0.0348168 -0.09261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2248 2298 0.0284754 -2.96216 -0.0420628 0.0618162 0.0044834 -0.0179297 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2298 2299 1.65931 -0.292628 0.0578421 -0.00576367 0.047659 -0.17516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2249 2299 -0.0193531 -3.1636 -0.175718 0.0787027 0.000528871 -0.0241526 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2299 2300 1.77318 -0.310941 -0.174551 0.000555425 0.0209107 -0.130317 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2250 2300 0.0398398 -3.21735 -0.147889 0.0613103 0.0179527 -0.0361187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2300 2301 1.72243 -0.172336 -0.109753 0.00242613 0.0381127 -0.173356 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2251 2301 -0.0816599 -3.05955 -0.158979 0.0459933 -0.00341656 -0.0192522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2301 2302 1.7992 -0.224403 -0.0128009 -0.00343199 0.0131098 -0.122157 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2252 2302 -0.00257336 -3.1386 -0.280685 0.0586122 0.0131083 -0.0163823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2302 2303 1.75965 -0.249577 0.136034 -0.00613886 0.0524706 -0.138956 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2253 2303 0.132974 -3.00218 0.0359249 0.0756309 -0.0114659 -0.000397207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2303 2304 1.76409 -0.185013 -0.0770608 -0.0148895 0.0422085 -0.043041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2254 2304 0.0288848 -3.26039 0.134843 0.0409434 0.0023404 0.00602437 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2304 2305 1.83324 -0.282671 -0.0339006 0.00622051 0.0350416 -0.198562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2255 2305 -0.0724857 -3.02757 -0.0839962 0.0488436 -0.0109341 -0.00264741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2305 2306 1.74034 -0.035354 -0.121631 0.0149805 0.0372442 -0.0218262 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2256 2306 0.130484 -3.04301 -0.22685 0.0754029 0.00757369 -0.0427814 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2306 2307 1.8047 -0.200601 0.0310601 0.00443299 0.0395201 -0.138584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2257 2307 -0.0353496 -3.17349 -0.067022 0.0565632 -0.00448649 0.00385663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2307 2308 1.57613 -0.160179 -0.0209339 -0.00996642 0.0310576 -0.140582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2258 2308 0.00969587 -3.079 -0.0460786 0.0401618 -0.00510122 -0.0392891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2308 2309 1.64404 0.108162 -0.117034 0.0055001 0.0329952 -0.113634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2259 2309 -0.0836754 -3.00392 -0.154613 0.0536925 -0.00276224 0.0160155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2309 2310 1.58565 -0.225276 0.10022 -0.00797713 0.0383131 -0.136049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2260 2310 0.100764 -3.00648 -0.0132723 0.0585415 0.0053519 -0.030129 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2310 2311 1.67408 -0.316932 -0.086084 -0.0129738 0.0357313 -0.0987939 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2261 2311 0.0790994 -3.00102 -0.10434 0.0622258 0.00741124 -0.0361891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2311 2312 1.57609 -0.130485 -0.220239 -0.00499883 0.0382758 -0.0964521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2262 2312 0.0899121 -3.07788 -0.029679 0.0824342 -0.00889839 -0.0297055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2312 2313 1.55001 -0.254157 -0.0226944 -0.000653448 0.0296712 -0.143224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2263 2313 -0.0698989 -2.95737 0.0834808 0.0821205 -0.00163185 -0.0676646 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2313 2314 1.68585 -0.216812 -0.106093 -0.00518323 0.0252269 -0.0654312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2264 2314 0.0671252 -3.11059 0.0243918 0.0503054 0.00679731 -0.0240203 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2314 2315 1.69411 -0.059591 0.00311116 0.00974437 0.0488963 -0.108483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2265 2315 0.0467165 -3.03716 -0.104013 0.0570087 0.00113857 0.0152445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2315 2316 1.53893 -0.309835 -0.115086 -0.000328106 0.0343123 -0.127533 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2266 2316 0.047945 -3.09847 -0.171384 0.0577874 -0.00254362 0.025939 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2316 2317 1.58762 -0.01135 0.0382817 -0.012901 0.0382787 -0.0614852 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2267 2317 0.0292439 -3.11168 -0.0168262 0.0608562 0.00688562 -0.0137257 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2317 2318 1.65334 -0.288916 0.0574487 -0.0183214 0.0545663 -0.142474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2268 2318 -0.145639 -3.23678 -0.071963 0.064014 -0.0123887 -0.0122148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2318 2319 1.69819 -0.236228 -0.115156 0.00361568 0.0414949 -0.142084 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2269 2319 -0.00823403 -3.01181 -0.284541 0.0639514 -0.0258121 -0.0256025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2319 2320 1.5934 -0.0217161 -0.0405252 0.0196963 0.0413379 -0.039758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2270 2320 0.0966246 -3.09019 -0.119338 0.0715683 -0.0109498 -0.00444543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2320 2321 1.60879 0.0145946 -0.0767824 -0.010222 0.0188519 -0.205189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2271 2321 0.0643968 -2.99221 -0.0939419 0.0418409 0.0105716 0.0292748 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2321 2322 1.6329 -0.0530947 -0.150271 -0.00748276 0.0169255 -0.15598 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2272 2322 -0.141084 -3.40945 -0.186194 0.0630113 0.00133289 0.0336639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2322 2323 1.46763 -0.112863 0.0644892 0.00630233 0.0465265 -0.124096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2273 2323 -0.0304286 -3.19964 -0.028086 0.0429345 -0.00061071 -0.0322583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2323 2324 1.53786 -0.263344 0.106711 -0.0162013 0.0349607 -0.0594121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2274 2324 -0.0755028 -3.03482 -0.277086 0.0727873 -0.00638227 -0.0183608 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2324 2325 1.51244 -0.249677 -0.18187 -0.00168789 0.0301748 -0.0573436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2275 2325 -0.0249669 -3.13455 -0.0897277 0.0738533 0.00178344 -0.0691228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2325 2326 1.49086 -0.176673 0.228074 -0.0103946 0.0357081 -0.112772 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2276 2326 0.00886406 -3.00058 -0.232417 0.0582479 0.00139994 0.0434161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2326 2327 1.53129 -0.0755849 -0.00869481 0.00393555 0.0288598 -0.142799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2277 2327 -0.0573412 -3.12541 -0.0248082 0.0843084 -0.00525579 -0.00690728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2327 2328 1.3665 -0.342648 0.021883 0.000878858 0.0319227 -0.121956 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2278 2328 0.151406 -3.14626 -0.0649404 0.0574064 -0.00913765 0.017077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2328 2329 1.63015 -0.326397 -0.136252 -0.00336553 0.0243547 -0.0879005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2279 2329 0.208943 -3.24225 -0.0761318 0.0785577 -0.0135863 -0.0768779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2329 2330 1.39417 -0.0359897 -0.0200153 -0.0259372 0.03505 -0.0625316 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2280 2330 0.103572 -2.96804 -0.262925 0.0754555 -0.00749583 -0.015237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2330 2331 1.44161 0.0638514 -0.0118146 -0.00336298 0.0284514 -0.180184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2281 2331 0.0703312 -3.1521 -0.214529 0.0679059 -0.00138164 -0.0405607 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2331 2332 1.68199 -0.134449 -0.0126487 -0.0200837 0.0362823 -0.13884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2282 2332 -0.05575 -2.95984 -0.0271593 0.0534981 0.00123027 -0.0653653 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2332 2333 1.48244 -0.169052 -0.0362219 -0.000210002 0.0320765 -0.0897336 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2283 2333 -0.104201 -3.05546 0.0934701 0.049229 -0.00654989 0.0197024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2333 2334 1.41509 -0.299297 -0.000997348 0.00650446 0.0253976 -0.128072 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2284 2334 -0.0957512 -3.13413 -0.124297 0.060121 0.000242917 0.00220982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2334 2335 1.36312 -0.0447894 -0.00277897 0.000418142 0.0484343 -0.145311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2285 2335 0.0349026 -3.05373 -0.0246602 0.0686 -0.00561848 0.00627797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2335 2336 1.43872 -0.108667 -0.0950942 0.00138579 0.0106616 -0.126514 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2286 2336 -0.0229829 -2.98571 0.0127402 0.0578854 0.00570252 -0.0110369 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2336 2337 1.38383 -0.146216 -0.0210355 0.0160248 0.0151822 -0.0972402 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2287 2337 0.204578 -3.19282 -0.0232178 0.0627186 0.0130144 -0.0164136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2337 2338 1.50331 -0.0553864 -0.124124 0.00232334 0.0490295 -0.166948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2288 2338 -0.00919614 -3.10004 -0.166525 0.0653096 0.00508945 -0.0374921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2338 2339 1.50281 -0.18568 -0.0580225 -0.00536571 0.0313981 -0.0500758 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2289 2339 0.0794072 -3.05918 -0.13434 0.0649385 -0.00152763 -0.00976199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2339 2340 1.48423 -0.264846 -0.055099 0.00797384 0.0455961 -0.0959498 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2290 2340 0.124318 -2.95537 -0.247582 0.0583225 0.00623077 -0.000870002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2340 2341 1.36485 -0.0976642 -0.180627 0.0078959 0.0354614 -0.106692 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2291 2341 0.158017 -2.99723 -0.0902945 0.0634522 -0.00518194 -0.000705654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2341 2342 1.53194 -0.182039 -0.0876279 -0.0102338 0.0445407 -0.121535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2292 2342 -0.0838912 -3.144 -0.17146 0.0616257 0.000495449 0.0418406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2342 2343 1.5589 -0.0554465 0.0256605 0.00551823 0.0307157 -0.161092 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2293 2343 -0.0562223 -3.12942 -0.12547 0.0422871 -0.00259562 0.0105056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2343 2344 1.48766 -0.196837 0.0568543 0.00946243 0.0308738 -0.103151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2294 2344 -0.0813901 -3.24565 -0.0308521 0.0736296 -0.0161328 0.0126117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2344 2345 1.4279 -0.253921 0.126671 -0.00699944 0.0206204 -0.240319 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2295 2345 -0.0449535 -3.18971 -0.0162136 0.0489939 0.0119744 0.0272281 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2345 2346 1.42564 -0.1609 -0.0943723 0.00592762 0.01505 -0.195206 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2296 2346 0.00695177 -2.94834 -0.165641 0.0478688 0.00223715 0.0452543 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2346 2347 1.44731 -0.314619 0.00473586 -0.00459643 0.0385995 -0.127028 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2297 2347 -0.0419891 -3.27378 -0.0566923 0.0342261 0.00385122 -0.00899117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2347 2348 1.3885 -0.162676 -0.0752585 -0.00916858 0.0345886 -0.183123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2298 2348 -0.0643839 -3.17814 -0.0325685 0.0781708 0.0117731 0.0384214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2348 2349 1.53003 -0.0655569 -0.034423 -0.0220057 0.0337815 -0.0339026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2299 2349 0.155101 -2.99267 -0.0575645 0.0862995 0.0133551 0.00166607 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2349 2350 1.17426 -0.271174 0.058394 -0.0101931 0.04638 -0.0523797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2300 2350 0.0143483 -3.15621 -0.235278 0.0695761 -0.00143256 -0.00698537 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2350 2351 1.50233 -0.019349 -0.00954614 0.00318434 0.0310995 -0.0988547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2301 2351 0.025686 -3.18099 0.0236252 0.0374687 -0.00052816 -0.0231034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2351 2352 1.5122 -0.0827326 -0.0294347 0.0193471 0.0215594 -0.136038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2302 2352 0.13058 -3.00536 -0.0259078 0.0653042 -0.00928164 -0.0248387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2352 2353 1.27187 -0.00353359 0.00199358 -0.00250159 0.0375395 -0.116383 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2303 2353 0.098438 -3.04361 -0.17478 0.0537095 -0.00203935 -0.0199316 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2353 2354 1.531 -0.251894 -0.0897503 -0.00768768 0.0302781 -0.150309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2304 2354 0.151689 -3.09663 -0.154184 0.0636659 -0.00173934 0.0269123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2354 2355 1.34621 -0.265306 -0.105326 0.00376238 0.0239642 -0.106495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2305 2355 0.0301554 -2.87532 -0.133801 0.0832357 -0.000891657 0.0319418 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2355 2356 1.29027 -0.167265 -0.0110243 -0.0135948 0.0295908 -0.184445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2306 2356 -0.0436607 -3.11451 0.0256047 0.0696562 -0.00322787 0.0428401 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2356 2357 1.43467 -0.134558 -0.159444 -0.0100503 0.0351553 -0.0995204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2307 2357 0.137609 -3.01303 -0.0444566 0.0585284 -0.00403425 -0.0264392 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2357 2358 1.39576 -0.167194 0.103494 -0.0103307 0.0434836 -0.123856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2308 2358 -0.00199259 -2.99604 -0.0836797 0.0631559 0.00832461 -0.0372798 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2358 2359 1.31826 -0.0968099 0.107417 0.0149888 0.0297234 -0.111337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2309 2359 0.0820049 -3.06322 -0.112748 0.0698792 0.0077434 -0.026766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2359 2360 1.26694 -0.164646 0.0728221 0.0103813 0.0495653 -0.169046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2310 2360 -0.0647832 -3.10886 -0.115426 0.0663978 -0.00216099 -0.0396196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2360 2361 1.13627 -0.0887732 -0.0331629 -0.0013004 0.0279233 -0.126378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2311 2361 0.0559606 -2.90588 0.111901 0.0508102 -0.00440447 -0.0336929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2361 2362 1.34974 -0.271104 -0.0434743 -0.00713999 0.00377137 -0.13518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2312 2362 0.163394 -3.18081 0.00789267 0.0621498 0.00433713 0.00938405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2362 2363 1.47457 -0.253676 0.0627284 0.00752493 0.0228907 -0.0771717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2313 2363 0.0507714 -3.06287 -0.139605 0.0478517 0.00172452 -0.0135842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2363 2364 1.19429 -0.118742 -0.0226078 -0.0049623 0.0329849 -0.161969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2314 2364 0.0742564 -2.93125 0.00617903 0.051911 0.00359584 0.0323988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2364 2365 1.4409 -0.207449 0.222692 -0.0133403 0.0437547 -0.117466 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2315 2365 0.00331017 -3.09833 -0.0890589 0.0517349 -0.0182802 0.0549729 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2365 2366 1.27185 -0.118601 0.121173 -0.0127061 0.018711 -0.124725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2316 2366 0.0290666 -3.13497 -0.21771 0.0678812 0.00697804 0.0397592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2366 2367 1.2889 -0.219168 -0.0358816 -0.00636138 0.0216098 -0.121669 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2317 2367 -0.262747 -3.00601 -0.158514 0.0674754 -0.00865707 -0.0271119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2367 2368 1.2469 -0.174755 -0.0505601 -0.0028139 0.0279411 -0.159472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2318 2368 0.0425717 -3.2411 -0.158981 0.0769582 -0.0138278 -0.0177188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2368 2369 1.42156 -0.106308 0.143844 0.00257507 0.0262686 -0.155933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2319 2369 -0.141221 -3.04945 -0.0539595 0.0438828 -0.00598622 -0.0346797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2369 2370 1.12391 -0.18855 -0.235858 0.0105836 0.0259346 -0.0652671 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2320 2370 0.0549081 -3.24491 -0.12199 0.0602815 -0.0130468 0.0409746 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2370 2371 1.18916 -0.258598 -0.0428346 -0.0148937 0.036152 -0.155547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2321 2371 -0.0218718 -3.11219 -0.0554362 0.0612933 -0.00695693 0.0282813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2371 2372 1.20085 0.0183165 0.127728 -0.0142035 0.0164817 -0.150359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2322 2372 0.189236 -3.18682 -0.243921 0.0503409 -0.00317759 -0.0515419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2372 2373 1.45807 -0.186217 -0.107362 -0.00130825 0.0191404 -0.119813 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2323 2373 -0.0731614 -3.02883 -0.174227 0.0703798 -0.00756652 0.0193816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2373 2374 1.18426 0.000197157 -0.0344764 0.00418012 0.0101834 -0.160714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2324 2374 -0.00520651 -3.03417 -0.283874 0.0666407 -0.00639997 -0.0342001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2374 2375 1.21769 -0.271659 -0.0521866 0.00170301 0.0295333 -0.137987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2325 2375 -0.0228028 -3.07056 0.0573167 0.0631828 -0.0231212 0.0242733 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2375 2376 1.26801 -0.20578 -0.324607 -0.00695021 0.0220326 -0.103082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2326 2376 -0.0621299 -3.18296 -0.0424051 0.0582665 -0.0100553 -0.0926792 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2376 2377 1.1643 -0.231669 0.0395846 -0.0193653 0.00970301 -0.179721 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2327 2377 0.0388514 -3.0083 -0.0987079 0.0618829 0.0024187 0.0173838 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2377 2378 1.0243 -0.0785003 0.00329079 -0.00360607 0.0291641 -0.153331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2328 2378 -0.191664 -2.97448 0.0292238 0.0569084 -0.00833561 0.00551469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2378 2379 1.08363 -0.205519 -0.204391 -0.00400729 0.0149072 -0.123346 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2329 2379 0.131935 -3.08183 -0.113085 0.0549028 0.0114832 0.0505372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2379 2380 1.11237 -0.108409 0.194716 0.00778232 0.019014 -0.0229398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2330 2380 -0.145342 -3.35581 -0.225241 0.0693832 0.0283036 -0.00764771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2380 2381 1.14711 -0.202115 0.0472177 -0.00616451 0.0169251 -0.10334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2331 2381 -0.107607 -3.05488 0.0839114 0.0558134 0.0151487 0.0132744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2381 2382 1.25781 -0.0421506 -0.25557 -0.00949864 0.0472852 -0.142247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2332 2382 0.321773 -3.06976 -0.253011 0.0786367 0.00492894 -0.0205592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2382 2383 1.14591 -0.198373 0.105221 0.000123181 0.022432 -0.185041 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2333 2383 0.0338217 -3.05433 -0.088552 0.0631544 -0.00171597 -0.058275 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2383 2384 0.984793 -0.248879 -0.0517567 -0.00638012 0.0198466 -0.10684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2334 2384 -0.0264963 -3.03963 -0.00924977 0.0629602 -0.00194704 0.016017 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2384 2385 1.16999 0.104466 -0.0044227 -0.00068721 0.0193063 -0.0817801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2335 2385 -0.0202104 -3.26805 -0.192235 0.0692415 0.0110898 0.0427483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2385 2386 1.20208 -0.0420889 0.163314 0.0100435 0.0173868 -0.0726622 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2336 2386 0.247688 -3.08574 0.0649253 0.0511622 0.00155898 -0.0360124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2386 2387 1.12047 -0.212918 -0.0587477 -0.0022376 0.0218674 -0.107966 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2337 2387 -0.140196 -3.09267 -0.273355 0.0653758 -0.0278868 -0.0258696 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2387 2388 1.1279 -0.189501 0.129593 -0.00327702 0.0589108 -0.108792 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2338 2388 0.0717771 -3.1169 -0.0473226 0.0438506 0.012121 -0.0190223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2388 2389 1.32964 -0.14278 0.0983584 -0.00197749 0.0317031 -0.14515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2339 2389 0.0601862 -3.19448 0.0304527 0.0684157 0.00115953 0.0423894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2389 2390 1.07822 -0.191734 -0.0171374 -0.00795168 0.025342 -0.077023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2340 2390 -0.0178538 -3.13617 -0.0680685 0.0517115 -0.0143105 -0.0811578 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2390 2391 1.07505 -0.15458 -0.111723 0.0029201 0.0260859 -0.0920008 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2341 2391 -0.0210466 -2.98952 -0.08232 0.0770481 0.0143833 0.034793 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2391 2392 1.11633 -0.0580665 -0.0592771 -0.019217 0.0226051 -0.0403911 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2342 2392 0.00965012 -3.27615 0.00561593 0.0605299 -0.0129177 0.0652139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2392 2393 1.00544 -0.183941 0.00773578 0.0219352 0.0255 -0.0693436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2343 2393 0.0676061 -3.09994 -0.179616 0.0585756 -0.0162173 -0.047858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2393 2394 1.04601 -0.117857 -0.0362245 -0.00392761 0.0128229 -0.14461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2344 2394 -0.127267 -3.04509 -0.0207292 0.0475185 0.00616505 -0.0494123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2394 2395 1.05325 -0.0347048 -0.0441859 -0.0124914 -0.000655675 -0.166959 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2345 2395 -0.10339 -3.05793 -0.190868 0.0472917 -0.0129218 -0.0202443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2395 2396 1.09705 -0.236036 -0.0712261 0.0108056 0.0128371 -0.0670747 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2346 2396 -0.11939 -2.90669 -0.103871 0.0651987 0.0143111 -0.0445552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2396 2397 1.00937 -0.135622 0.1453 0.0100368 0.00993705 -0.140917 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2347 2397 -0.0788292 -2.87156 0.05486 0.0587591 -0.0019809 0.00678225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2397 2398 0.881329 0.0668708 0.110495 0.019662 0.0195875 -0.0921784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2348 2398 -0.102262 -2.99928 0.0256153 0.0355337 -0.00811447 0.0288974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2398 2399 1.18077 -0.0155792 0.0819929 -0.00986692 0.0169261 -0.130778 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2349 2399 0.120582 -3.00399 -0.121336 0.0636855 -0.00413597 0.0263499 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2399 2400 1.24287 -0.174488 0.0146951 -0.00288808 0.0147356 -0.134903 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2350 2400 0.0257293 -3.17807 0.0465324 0.0531606 0.00896709 -0.0121308 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2400 2401 1.02689 0.0488939 -0.0107248 0.00902402 0.0121253 -0.172868 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2351 2401 0.0806618 -3.17478 -0.0318378 0.0542997 -0.0123942 -0.00968929 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2401 2402 0.922211 -0.142718 -0.00329857 -0.00715726 0.0341412 -0.177995 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2352 2402 -0.0227351 -3.07862 -0.0456497 0.0424931 -0.000934033 -0.0899075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2402 2403 0.948903 -0.100292 -0.118346 0.0117822 0.0128178 -0.106946 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2353 2403 0.114693 -3.13743 -0.309415 0.078277 -0.00280339 0.0107418 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2403 2404 0.957981 -0.167713 -0.0817728 -0.0105667 0.0269566 -0.149519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2354 2404 -0.110838 -3.05052 -0.151266 0.0536218 0.000377916 -0.0448353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2404 2405 0.966836 -0.0343883 -0.0641363 0.0241857 0.0081806 -0.0571673 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2355 2405 -0.0313224 -3.13363 -0.133837 0.0581501 0.00495669 -0.0266002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2405 2406 1.14955 -0.0517833 -0.0981234 0.00969539 0.0141592 -0.103597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2356 2406 -0.0272206 -3.22467 0.0305596 0.0514568 -0.023057 -0.055522 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2406 2407 0.880208 -0.116449 0.0152669 0.000122329 0.0238588 -0.0758653 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2357 2407 -0.204509 -3.13282 -0.160111 0.0502065 -0.00998833 0.00925931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2407 2408 0.779758 -0.231602 -0.0116363 -0.00873717 0.00288593 -0.144172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2358 2408 0.114301 -3.04663 -0.0879111 0.0661899 -0.00836855 0.00778534 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2408 2409 0.937779 -0.265218 -0.0727954 0.0122143 0.0308832 -0.140299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2359 2409 0.116292 -3.14095 0.034373 0.0498044 -0.00724255 0.041764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2409 2410 0.860547 -0.180693 -0.0319612 0.0113848 0.0129287 -0.0388687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2360 2410 -0.16278 -2.95426 -0.0687947 0.070274 0.00232961 -0.0151955 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2410 2411 0.970943 -0.0328469 0.0245733 -0.00119069 0.0211168 -0.119534 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2361 2411 -0.11203 -3.06112 -0.203332 0.0830461 0.00290484 0.0438462 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2411 2412 0.910464 -0.176781 -0.0160987 0.0245812 0.0334807 -0.191983 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2362 2412 -0.0174788 -3.11391 -0.134562 0.0602173 0.00535236 -0.010384 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2412 2413 0.716215 -0.0672759 -0.180584 -0.0102212 0.0264646 -0.0464624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2363 2413 0.0925205 -3.04294 -0.123194 0.0590799 0.0137483 0.0227182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2413 2414 1.06891 -0.0613279 -0.0121096 -0.000282554 0.0216839 -0.126702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2364 2414 0.163078 -3.02221 -0.305698 0.063076 0.0127644 0.0113707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2414 2415 0.768765 -0.234965 0.115413 -0.0154947 0.0226744 -0.121295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2365 2415 0.0898611 -3.11278 -0.230568 0.0714111 -0.0226521 -0.0105952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2415 2416 0.809282 -0.174424 -0.0118621 -0.00412179 0.0121492 -0.176736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2366 2416 0.178381 -3.07386 -0.0405802 0.069043 -0.0158566 0.00238133 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2416 2417 0.995156 -0.209479 -0.00575775 0.0102162 0.0130859 -0.153005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2367 2417 0.0435759 -2.9972 -0.241973 0.037604 -0.000362601 -0.0413059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2417 2418 0.779909 -0.0498183 0.0623948 0.00127184 0.0159649 -0.0681053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2368 2418 0.0265457 -3.18037 -0.149991 0.0727304 -0.0141485 0.0111055 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2418 2419 0.899306 0.0789548 -0.00625073 0.0205097 0.0200221 -0.150305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2369 2419 0.0404429 -3.25006 0.166059 0.0572778 0.0133024 0.00253824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2419 2420 0.74652 -0.23748 -0.00681759 0.011293 0.0130525 -0.159856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2370 2420 -0.037574 -2.96721 0.111019 0.0459223 0.00444773 -0.00182679 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2420 2421 0.936316 -0.120846 0.00285827 0.00993677 0.0327305 -0.171135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2371 2421 -0.138485 -3.11691 -0.175378 0.0519402 0.00563299 0.0340938 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2421 2422 1.09531 -0.165679 0.0372133 0.0121574 0.0278475 -0.0809984 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2372 2422 0.0084985 -3.18732 0.0652056 0.0496632 -0.0101753 -0.00692508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2422 2423 0.806983 -0.102447 0.0695419 0.00719742 0.0122177 -0.0885043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2373 2423 -0.00079279 -3.12264 -0.0881471 0.0630097 -0.00112723 -0.103492 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2423 2424 0.930682 -0.290974 0.0122849 -0.00988208 0.00815466 -0.109388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2374 2424 -0.0621977 -2.90502 -0.0614072 0.0765609 -0.00378335 0.0412032 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2424 2425 1.0523 -0.0942562 -0.0467388 -0.00653632 0.00487786 -0.192164 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2375 2425 0.0112092 -2.88165 -0.0909757 0.0588811 0.00831013 0.00112709 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2425 2426 0.824703 -0.109445 0.0693976 -0.0122318 0.0299445 -0.0911686 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2376 2426 0.0210469 -3.00441 -0.169417 0.0667231 -0.0136007 0.0227904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2426 2427 0.75497 -0.0782575 -0.0804936 -0.0240997 0.0323592 -0.0775495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2377 2427 -0.0539781 -3.20024 -0.219876 0.0691134 0.00964281 0.00626064 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2427 2428 0.96138 -0.188054 0.0592043 0.0149705 0.0247265 -0.0452124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2378 2428 0.0936004 -2.91381 -0.0953071 0.050063 -0.0155988 0.0243915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2428 2429 0.9152 -0.0855797 -0.0600578 0.0169479 0.012554 -0.0695441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2379 2429 0.113707 -3.0694 -0.167609 0.0455064 -0.00244658 -0.0387184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2429 2430 0.850647 -0.129926 -0.0223232 0.014384 0.0238581 -0.0969824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2380 2430 0.0881312 -3.06934 -0.113937 0.0439417 -0.00228684 -0.0191046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2430 2431 0.685435 -0.133605 0.077878 0.000473148 0.00381906 -0.152164 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2381 2431 -0.00909279 -3.01789 0.0443456 0.0559573 0.00761205 -0.0219043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2431 2432 0.823047 -0.149762 -0.162131 0.000595512 0.0108591 -0.106331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2382 2432 0.014111 -3.10677 -0.182714 0.0700237 -0.00159218 -0.00557386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2432 2433 0.840293 -0.239467 -0.135264 -0.0144724 0.00844198 -0.0978062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2383 2433 -0.119578 -3.14035 -0.0274269 0.0579008 -0.0131727 0.0571506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2433 2434 0.705048 -0.335835 0.136846 0.00791271 0.0143495 -0.173525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2384 2434 -0.000125601 -3.02959 -0.122347 0.0555076 0.00707249 0.0828599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2434 2435 0.707182 -0.05967 0.1415 -0.00104398 0.0115305 -0.133776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2385 2435 -0.145537 -2.97413 -0.0529797 0.0611963 -0.00321298 -0.0103854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2435 2436 0.77111 -0.274935 -0.0170584 -0.00184025 0.014379 -0.179698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2386 2436 0.0710403 -3.06771 -0.133144 0.0566319 0.000468333 0.0158188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2436 2437 0.741301 -0.188334 0.027943 0.000597373 0.00806224 -0.113294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2387 2437 0.137827 -3.10741 -0.174667 0.0697982 0.0200402 0.0258698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2437 2438 0.718309 -0.043868 -0.132531 -0.00568739 0.02139 -0.098528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2388 2438 0.0449994 -3.20431 -0.233903 0.0530649 0.0173331 -0.0346002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2438 2439 0.927783 -0.188973 0.0167979 -0.00441738 0.0189338 -0.171666 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2389 2439 0.173802 -3.16614 -0.112143 0.0513729 0.00311768 0.0134471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2439 2440 0.637889 -0.127063 -0.0647379 -0.000178452 0.0187992 -0.172063 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2390 2440 -0.0254123 -3.1022 0.00522851 0.0501957 -0.00583352 -0.0213677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2440 2441 0.773295 -0.258757 -0.095237 0.00943016 0.00856157 -0.0998296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2391 2441 0.0127781 -3.09094 -0.0970962 0.0703405 -0.00963293 0.0890245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2441 2442 0.62647 -0.178776 0.0682368 -0.00420904 0.0156397 -0.129931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2392 2442 -0.0676438 -2.86307 -0.226622 0.0758765 0.0172436 0.00180056 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2442 2443 0.676178 -0.102123 0.104527 0.00816574 0.0444575 -0.122909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2393 2443 -0.039984 -3.169 -0.0995151 0.0639306 0.00420241 0.101485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2443 2444 0.632994 -0.274214 -0.0604122 0.00101224 0.0143493 -0.118621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2394 2444 0.0530277 -3.12004 -0.0117816 0.0678628 -0.013863 -0.0907453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2444 2445 0.623687 -0.326872 0.105519 -0.00665688 0.0265943 -0.0992535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2395 2445 0.0149223 -3.10563 -0.203804 0.0665157 -0.00132788 -0.0225485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2445 2446 0.773107 -0.0253377 0.182962 0.0137606 -0.0108106 -0.0818229 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2396 2446 -0.0632931 -3.0343 -0.226887 0.0426537 -0.0047512 -0.019114 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2446 2447 0.673561 -0.154025 -0.0901807 -0.0191839 -0.0148791 -0.20063 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2397 2447 -0.0809943 -2.97586 -0.213127 0.0594819 0.00220003 0.0381013 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2447 2448 0.411284 -0.20703 0.136687 0.0116755 -0.00377624 -0.0912315 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2398 2448 -0.100975 -2.97909 -0.20848 0.0452265 -0.0196562 -0.00356765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2448 2449 0.672445 0.0464331 -0.0631548 -0.0063544 0.0209633 -0.180151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2399 2449 -0.0570497 -3.04541 0.0151781 0.0732119 -0.0085068 0.026724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2449 2450 0.665612 -0.205443 -0.135734 0.00532383 0.0131119 -0.0472187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2400 2450 0.0569956 -3.06219 -0.0730208 0.0520098 0.00849887 0.0840131 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2450 2451 0.615586 -0.0372146 0.0863717 0.00390466 0.00371816 -0.124666 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2401 2451 0.0233072 -3.05722 0.0254617 0.0649108 -0.00476468 0.0100399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2451 2452 0.579888 -0.059038 0.0357022 0.0249911 0.000716339 -0.1355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2402 2452 -0.0381196 -2.9876 -0.252388 0.066622 0.00910817 -0.000820153 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2452 2453 0.578913 -0.045787 -0.013608 0.0181774 0.0172093 -0.0783364 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2403 2453 -0.123723 -2.91757 -0.152678 0.0507555 -0.014463 -0.00911548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2453 2454 0.706556 -0.09142 -0.0870603 -0.0080065 -0.00326606 -0.101556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2404 2454 -0.00800361 -3.05468 -0.162409 0.0713166 -0.00185334 0.00664332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2454 2455 0.3758 -0.147899 0.0169202 0.00450864 0.0199126 -0.150942 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2405 2455 0.0894775 -3.09437 -0.22297 0.0549127 0.0163251 0.02647 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2455 2456 0.568694 -0.038551 0.00840634 0.0138467 0.00624925 -0.170574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2406 2456 0.0240355 -2.96653 -0.258981 0.0755388 0.00517666 0.0328618 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2456 2457 0.593057 0.068819 0.0774987 0.00654167 0.0153609 -0.131348 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2407 2457 0.11967 -2.95021 -0.0981865 0.0557045 -0.000920427 0.057171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2457 2458 0.498043 -0.0344245 -0.0750707 0.00580262 0.00880905 -0.147671 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2408 2458 -0.0141258 -3.0485 -0.0227253 0.0731998 0.0126365 0.00610021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2458 2459 0.582558 -0.0429044 0.070323 0.0200276 0.00527352 -0.155836 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2409 2459 -0.14116 -3.12543 -0.148791 0.067728 -0.0196802 -0.0100445 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2459 2460 0.386098 -0.36747 -0.134591 0.00426999 0.011702 -0.0948031 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2410 2460 0.10304 -3.05122 -0.131541 0.0626227 -0.0211071 -0.0233515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2460 2461 0.517445 -0.176057 -0.047968 -0.00549729 0.0384751 -0.102036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2411 2461 -0.0251865 -3.15388 0.0557313 0.0533006 0.0100787 0.0456261 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2461 2462 0.552157 -0.0370837 -0.040271 0.0116085 0.00494164 -0.161446 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2412 2462 0.078235 -2.91957 -0.14201 0.0798437 -0.000907816 -0.0167602 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2462 2463 0.640671 -0.150453 -0.147889 0.000563295 0.0220545 -0.0815588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2413 2463 0.0262409 -2.93312 -0.106771 0.0427433 0.00550283 -0.0273735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2463 2464 0.488227 -0.0813165 0.0287417 0.0122727 0.00419218 -0.114823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2414 2464 -0.0625469 -3.04769 0.102979 0.0600207 -0.00990314 0.0486822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2464 2465 0.462276 -0.310046 0.109169 -0.000971267 -0.00118784 -0.133384 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2415 2465 0.076364 -3.12365 -0.176031 0.0570426 -0.00229915 -0.0316881 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2465 2466 0.634099 -0.0424202 0.10411 -0.00345657 0.00234812 -0.0933225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2416 2466 0.158965 -3.13729 -0.0695265 0.0666584 -0.0191502 -0.107546 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2466 2467 0.528947 0.104114 0.109304 0.00623237 0.0138401 -0.203818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2417 2467 0.0951203 -3.09252 -0.211451 0.0646658 -0.0143471 -0.0400221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2467 2468 0.420666 -0.280616 -0.1888 0.00663029 0.00363544 -0.0894842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2418 2468 -0.0938255 -3.05576 -0.0404847 0.0581635 0.00142468 -0.0214397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2468 2469 0.496087 0.0813272 0.0606169 0.00253762 0.0198426 -0.162761 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2419 2469 -0.106433 -3.00595 -0.0774184 0.0545304 0.000300188 -0.0402652 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2469 2470 0.432009 -0.218489 -0.223036 -0.000491628 0.013526 -0.168762 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2420 2470 -0.0431197 -3.14662 -0.145837 0.0474953 0.00819686 -0.0527404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2470 2471 0.377241 -0.158585 0.125795 0.0161275 0.0248428 -0.19173 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2421 2471 0.0797938 -2.99855 -0.00896016 0.0650336 0.00721517 -0.0136197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2471 2472 0.399956 -0.036309 -0.053913 -0.00497424 0.0117679 -0.135701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2422 2472 -0.0744363 -3.11552 0.0459824 0.0609281 0.0180121 0.0401467 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2472 2473 0.419197 0.035327 0.281385 0.0109872 0.00726325 -0.118482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2423 2473 -0.290219 -2.87447 -0.0431851 0.0400738 0.0207758 0.0127375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2473 2474 0.344422 -0.276317 -0.0452232 0.0108431 -0.00762605 -0.106303 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2424 2474 -0.0905849 -3.13565 -0.19316 0.0562847 0.00449451 0.0507318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2474 2475 0.530678 -0.278126 -0.0250559 0.00063751 0.00171984 -0.0959079 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2425 2475 0.113845 -2.91556 -0.0731655 0.0725515 -0.00157771 -0.0246475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2475 2476 0.461974 0.0619353 -0.0616054 0.0121412 0.0213365 -0.0533189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2426 2476 -0.0107406 -3.03889 -0.169288 0.0498789 -0.00523033 -0.019029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2476 2477 0.299422 -0.0292875 -0.0874556 -0.00399893 0.0018028 -0.166862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2427 2477 -0.259508 -3.04391 0.148407 0.0731842 0.00856545 -0.0250325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2477 2478 0.452342 0.0281974 -0.0173345 0.00268463 0.0106544 -0.129739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2428 2478 0.109832 -2.87685 -0.274584 0.077966 0.0130997 0.0253019 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2478 2479 0.618512 -0.0966368 0.15368 0.0159476 0.0037621 -0.14744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2429 2479 0.0363237 -3.15614 -0.0869768 0.060985 0.019735 0.0523234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2479 2480 0.435326 -0.200552 -0.0933764 0.00238797 0.0150303 -0.110618 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2430 2480 0.097677 -3.18419 0.0924348 0.0725214 -0.00781518 -0.0120098 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2480 2481 0.488551 -0.179534 -0.0753795 -0.00481112 0.00309579 -0.09719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2431 2481 -0.0306665 -3.09426 -0.190765 0.0497534 -0.00735514 0.0678605 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2481 2482 0.368743 -0.169351 -0.064621 -0.0055098 -0.010371 -0.101829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2432 2482 0.0722814 -2.84839 -0.162707 0.0524311 -0.0164076 -0.0461377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2482 2483 0.424954 0.0182101 0.0646437 0.0114593 -0.00611225 -0.0964451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2433 2483 -0.0290034 -2.91556 -0.125121 0.0627587 -0.0137413 0.00535325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2483 2484 0.352777 -0.167919 0.0639258 0.00198547 0.0166012 -0.108284 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2434 2484 -0.0834858 -3.13496 -0.155794 0.0635078 0.0059674 -0.0463205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2484 2485 0.394039 0.0109916 0.133616 0.00200869 0.00264847 -0.13324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2435 2485 -0.0846365 -3.10733 -0.151788 0.0632132 -0.000311284 0.0202125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2485 2486 0.170097 -0.0569364 0.133644 0.00309653 0.00135699 -0.212218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2436 2486 0.0439303 -3.04648 -0.0140596 0.0750174 0.00428768 0.0285491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2486 2487 0.291923 -0.350715 -0.0506407 0.0215878 0.00775374 -0.0609982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2437 2487 0.101117 -2.90752 -0.24059 0.0627272 0.0140629 0.00778796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2487 2488 0.311796 -0.0618708 -0.0102698 0.0074356 0.0222731 -0.147975 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2438 2488 0.0335922 -2.95863 -0.126668 0.0886017 -0.00747481 -0.0944425 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2488 2489 0.413104 -0.13094 -0.140749 -0.000846373 0.0163652 -0.130555 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2439 2489 -0.0502104 -2.91591 0.130835 0.0661883 -0.00659339 -0.0380005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2489 2490 0.379747 -0.177883 0.0447272 0.0014528 0.0169824 -0.073449 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2440 2490 0.0375954 -3.02576 -0.0402119 0.072014 0.00884395 -0.0466011 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2490 2491 0.354395 -0.0230735 -0.0789061 0.0129899 0.0344318 -0.187288 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2441 2491 0.0977798 -3.22841 -0.0112792 0.0797777 0.00936993 -0.0301513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2491 2492 0.166564 -0.170059 0.0495732 0.0141237 -0.00888752 -0.118969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2442 2492 -0.0458312 -2.91145 0.0499288 0.0660945 0.0182401 0.0406457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2492 2493 0.293104 -0.104138 -0.110184 -0.00748046 -0.000512588 -0.0690703 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2443 2493 0.130498 -3.03704 -0.0405533 0.0627682 0.00119051 0.0827094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2493 2494 0.286681 0.0800986 -0.140534 -0.0117125 0.00136767 -0.135267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2444 2494 -0.00111674 -2.87381 -0.032075 0.0685083 0.00880956 -0.0441376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2494 2495 0.451006 0.0159923 -0.110392 -0.0128448 0.0120649 -0.121651 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2445 2495 -0.0223247 -3.03891 -0.157711 0.0603474 -0.023171 -0.025239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2495 2496 0.407636 -0.207573 -0.132776 -0.00180566 -0.00803491 -0.0849705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2446 2496 0.073903 -3.10015 -0.0759222 0.0604432 0.00807335 0.0386886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2496 2497 0.339458 -0.0490249 -0.183052 0.0126326 0.00427634 -0.121645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2447 2497 -0.095026 -3.19391 -0.103208 0.0788101 -0.012198 -0.0036844 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2497 2498 0.182255 -0.232472 -0.0869942 0.0112859 0.00743998 -0.0934717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2448 2498 -0.234395 -3.01476 0.126794 0.0599249 0.00359686 -0.0488592 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2498 2499 0.277322 -0.0641475 0.0477913 -0.00287415 0.000789099 -0.143286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2449 2499 -0.110695 -3.08307 -0.11704 0.067227 0.00205309 0.0105472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 diff --git a/examples/Data/sphere2500_groundtruth.txt b/examples/Data/sphere2500_groundtruth.txt new file mode 100644 index 000000000..1bdebb071 --- /dev/null +++ b/examples/Data/sphere2500_groundtruth.txt @@ -0,0 +1,4949 @@ +EDGE3 0 1 0.258134 -0.0450052 -0.000686593 0.00153957 0.00500934 0.125564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1 2 0.265802 -0.044524 -0.000726337 0.00154919 0.00516271 0.125558 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2 3 0.27347 -0.0440429 -0.000767259 0.00155881 0.00531607 0.125552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 3 4 0.281136 -0.0435619 -0.00080936 0.00156844 0.00546942 0.125545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 4 5 0.288803 -0.043081 -0.000852639 0.00157806 0.00562276 0.125539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 5 6 0.296469 -0.0426002 -0.000897096 0.00158767 0.00577609 0.125532 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 6 7 0.304135 -0.0421196 -0.000942729 0.00159729 0.00592942 0.125524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 7 8 0.3118 -0.041639 -0.000989541 0.0016069 0.00608273 0.125517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 8 9 0.319465 -0.0411586 -0.00103753 0.00161651 0.00623604 0.12551 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 9 10 0.327129 -0.0406782 -0.00108669 0.00162612 0.00638934 0.125502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 10 11 0.334793 -0.040198 -0.00113703 0.00163573 0.00654263 0.125494 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 11 12 0.342456 -0.0397179 -0.00118855 0.00164533 0.00669591 0.125486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 12 13 0.350119 -0.039238 -0.00124124 0.00165493 0.00684918 0.125478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 13 14 0.357781 -0.0387582 -0.00129511 0.00166453 0.00700244 0.125469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 14 15 0.365443 -0.0382785 -0.00135016 0.00167412 0.00715568 0.125461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 15 16 0.373104 -0.0377989 -0.00140637 0.00168372 0.00730892 0.125452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 16 17 0.380765 -0.0373195 -0.00146377 0.00169331 0.00746215 0.125443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 17 18 0.388425 -0.0368402 -0.00152233 0.0017029 0.00761537 0.125434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 18 19 0.396084 -0.0363611 -0.00158207 0.00171248 0.00776857 0.125425 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 19 20 0.403743 -0.0358821 -0.00164299 0.00172206 0.00792176 0.125415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 20 21 0.411401 -0.0354033 -0.00170507 0.00173164 0.00807495 0.125405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 21 22 0.419059 -0.0349246 -0.00176833 0.00174122 0.00822812 0.125395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 22 23 0.426716 -0.0344461 -0.00183276 0.00175079 0.00838127 0.125385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 23 24 0.434372 -0.0339677 -0.00189837 0.00176036 0.00853442 0.125375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 24 25 0.442028 -0.0334895 -0.00196514 0.00176993 0.00868755 0.125365 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 25 26 0.449683 -0.0330115 -0.00203309 0.00177949 0.00884067 0.125354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 26 27 0.457337 -0.0325336 -0.0021022 0.00178905 0.00899378 0.125343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 27 28 0.464991 -0.0320559 -0.00217249 0.00179861 0.00914687 0.125332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 28 29 0.472644 -0.0315784 -0.00224395 0.00180816 0.00929995 0.125321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 29 30 0.480296 -0.0311011 -0.00231657 0.00181771 0.00945302 0.12531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 30 31 0.487948 -0.0306239 -0.00239037 0.00182726 0.00960607 0.125298 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 31 32 0.495599 -0.0301469 -0.00246533 0.0018368 0.00975911 0.125286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 32 33 0.503249 -0.0296701 -0.00254146 0.00184634 0.00991213 0.125274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 33 34 0.510898 -0.0291935 -0.00261876 0.00185588 0.0100651 0.125262 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 34 35 0.518547 -0.0287171 -0.00269723 0.00186541 0.0102181 0.12525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 35 36 0.526194 -0.0282409 -0.00277686 0.00187494 0.0103711 0.125237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 36 37 0.533841 -0.0277648 -0.00285766 0.00188446 0.0105241 0.125225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 37 38 0.541488 -0.027289 -0.00293962 0.00189398 0.010677 0.125212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 38 39 0.549133 -0.0268134 -0.00302275 0.0019035 0.01083 0.125199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 39 40 0.556777 -0.026338 -0.00310705 0.00191301 0.0109829 0.125185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 40 41 0.564421 -0.0258628 -0.0031925 0.00192252 0.0111358 0.125172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 41 42 0.572064 -0.0253877 -0.00327913 0.00193202 0.0112887 0.125158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 42 43 0.579706 -0.024913 -0.00336691 0.00194152 0.0114415 0.125144 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 43 44 0.587347 -0.0244384 -0.00345586 0.00195102 0.0115944 0.12513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 44 45 0.594988 -0.023964 -0.00354597 0.00196051 0.0117472 0.125116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 45 46 0.602627 -0.0234899 -0.00363724 0.00196999 0.0119 0.125102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 46 47 0.610265 -0.023016 -0.00372967 0.00197948 0.0120528 0.125087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 47 48 0.617903 -0.0225423 -0.00382327 0.00198895 0.0122056 0.125073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 48 49 0.62554 -0.0220689 -0.00391802 0.00199843 0.0123584 0.125058 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 49 50 0.633175 -0.0215956 -0.00401393 0.0020079 0.0125111 0.125043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 0 50 2.58718e-14 -3.05972 -0.0937068 0.0612327 0 4.88498e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 50 51 0.64081 -0.0211227 -0.00411101 0.00201736 0.0126638 0.125027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1 51 2.72005e-14 -3.05972 -0.0937068 0.0612327 0 5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 51 52 0.648444 -0.0206499 -0.00420923 0.00202682 0.0128166 0.125012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2 52 2.84217e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 52 53 0.656077 -0.0201774 -0.00430862 0.00203628 0.0129692 0.124996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 3 53 2.93099e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 6.21725e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 53 54 0.663708 -0.0197052 -0.00440917 0.00204573 0.0131219 0.12498 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 4 54 3.13083e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 6.21725e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 54 55 0.671339 -0.0192332 -0.00451087 0.00205517 0.0132746 0.124964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 5 55 3.21965e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 55 56 0.678969 -0.0187614 -0.00461372 0.00206461 0.0134272 0.124948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 6 56 3.33067e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 5.77316e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 56 57 0.686598 -0.0182899 -0.00471773 0.00207405 0.0135798 0.124932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 7 57 3.5083e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 7.10543e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 57 58 0.694226 -0.0178187 -0.0048229 0.00208348 0.0137324 0.124915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 8 58 3.75255e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 6.66134e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 58 59 0.701852 -0.0173477 -0.00492922 0.0020929 0.013885 0.124898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 9 59 3.84137e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 5.77316e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 59 60 0.709478 -0.0168769 -0.00503669 0.00210232 0.0140375 0.124881 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 10 60 3.93019e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 6.66134e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 60 61 0.717103 -0.0164065 -0.00514532 0.00211174 0.01419 0.124864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 11 61 4.17999e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 7.99361e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 61 62 0.724726 -0.0159363 -0.0052551 0.00212114 0.0143425 0.124847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 12 62 4.44367e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 7.54952e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 62 63 0.732349 -0.0154664 -0.00536603 0.00213055 0.014495 0.124829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 13 63 4.54081e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 6.66134e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 63 64 0.73997 -0.0149967 -0.00547811 0.00213995 0.0146475 0.124812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 14 64 4.67404e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 7.54952e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 64 65 0.74759 -0.0145273 -0.00559134 0.00214934 0.0147999 0.124794 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 15 65 4.38538e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 7.10543e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 65 66 0.755209 -0.0140583 -0.00570571 0.00215873 0.0149524 0.124776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 16 66 3.93019e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 6.21725e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 66 67 0.762827 -0.0135894 -0.00582124 0.00216811 0.0151048 0.124757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 17 67 3.39728e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 67 68 0.770444 -0.0131209 -0.00593792 0.00217749 0.0152571 0.124739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 18 68 2.88658e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 4.44089e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 68 69 0.77806 -0.0126527 -0.00605574 0.00218686 0.0154095 0.12472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 19 69 2.35367e-14 -3.05972 -0.0937068 0.0612327 4.44089e-16 3.9968e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 69 70 0.785674 -0.0121847 -0.00617471 0.00219622 0.0155618 0.124701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 20 70 1.95399e-14 -3.05972 -0.0937068 0.0612327 0 3.10862e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 70 71 0.793288 -0.0117171 -0.00629482 0.00220558 0.0157141 0.124682 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 21 71 1.15463e-14 -3.05972 -0.0937068 0.0612327 0 1.77636e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 71 72 0.8009 -0.0112497 -0.00641608 0.00221494 0.0158664 0.124663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 22 72 8.21565e-15 -3.05972 -0.0937068 0.0612327 0 1.77636e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 72 73 0.808511 -0.0107826 -0.00653849 0.00222429 0.0160187 0.124644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 23 73 2.22045e-16 -3.05972 -0.0937068 0.0612327 0 0 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 73 74 0.816121 -0.0103159 -0.00666204 0.00223363 0.0161709 0.124624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 24 74 -2.9976e-15 -3.05972 -0.0937068 0.0612327 0 0 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 74 75 0.823729 -0.00984941 -0.00678673 0.00224296 0.0163231 0.124605 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 25 75 -1.15318e-14 -3.05972 -0.0937068 0.0612327 0 -2.22045e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 75 76 0.831336 -0.00938325 -0.00691256 0.00225229 0.0164753 0.124585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 26 76 -1.4766e-14 -3.05972 -0.0937068 0.0612327 0 -2.22045e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 76 77 0.838942 -0.00891741 -0.00703954 0.00226162 0.0166275 0.124565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 27 77 -2.34257e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-16 -3.55271e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 77 78 0.846547 -0.00845188 -0.00716765 0.00227093 0.0167796 0.124544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 28 78 -2.70894e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-16 -3.55271e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 78 79 0.854151 -0.00798666 -0.00729691 0.00228025 0.0169318 0.124524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 29 79 -3.64153e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-16 -5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 79 80 0.861753 -0.00752177 -0.0074273 0.00228955 0.0170838 0.124503 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 30 80 -3.95239e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-16 -5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 80 81 0.869354 -0.00705719 -0.00755883 0.00229885 0.0172359 0.124482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 31 81 -4.86278e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-16 -7.10543e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 81 82 0.876954 -0.00659294 -0.0076915 0.00230814 0.017388 0.124461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 32 82 -5.17364e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-16 -7.10543e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 82 83 0.884552 -0.00612901 -0.00782531 0.00231743 0.01754 0.12444 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 33 83 -5.77316e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-16 -7.99361e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 83 84 0.892149 -0.00566541 -0.00796025 0.00232671 0.017692 0.124419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 34 84 -6.4615e-14 -3.05972 -0.0937068 0.0612327 -8.88178e-16 -9.32587e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 84 85 0.899745 -0.00520214 -0.00809633 0.00233598 0.0178439 0.124397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 35 85 -7.19425e-14 -3.05972 -0.0937068 0.0612327 -8.88178e-16 -9.76996e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 85 86 0.907339 -0.00473921 -0.00823354 0.00234525 0.0179959 0.124375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 36 86 -7.88258e-14 -3.05972 -0.0937068 0.0612327 -8.88178e-16 -1.06581e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 86 87 0.914932 -0.00427662 -0.00837189 0.00235451 0.0181478 0.124353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 37 87 -8.58758e-14 -3.05972 -0.0937068 0.0612327 -8.88178e-16 -1.15463e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 87 88 0.922523 -0.00381436 -0.00851136 0.00236376 0.0182997 0.124331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 38 88 -9.31477e-14 -3.05972 -0.0937068 0.0612327 -8.88178e-16 -1.24345e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 88 89 0.930114 -0.00335245 -0.00865197 0.00237301 0.0184515 0.124309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 39 89 -1.00475e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-15 -1.37668e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 89 90 0.937702 -0.00289089 -0.00879371 0.00238225 0.0186033 0.124286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 40 90 -1.08358e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-15 -1.46549e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 90 91 0.94529 -0.00242967 -0.00893658 0.00239148 0.0187551 0.124264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 41 91 -1.15241e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-15 -1.5099e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 91 92 0.952876 -0.00196881 -0.00908058 0.00240071 0.0189069 0.124241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 42 92 -1.23457e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-15 -1.59872e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 92 93 0.96046 -0.0015083 -0.00922571 0.00240992 0.0190587 0.124218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 43 93 -1.30562e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-15 -1.68754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 93 94 0.968043 -0.00104814 -0.00937197 0.00241914 0.0192104 0.124194 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 44 94 -1.38112e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-15 -1.82077e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 94 95 0.975625 -0.000588348 -0.00951935 0.00242834 0.0193621 0.124171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 45 95 -1.46549e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-15 -1.86517e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 95 96 0.983205 -0.000128916 -0.00966786 0.00243754 0.0195137 0.124147 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 46 96 -1.54987e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-15 -1.95399e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 96 97 0.990784 0.000330151 -0.00981749 0.00244673 0.0196654 0.124123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 47 97 -1.63647e-13 -3.05972 -0.0937068 0.0612327 -2.22045e-15 -2.04281e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 97 98 0.998361 0.00078885 -0.00996825 0.00245591 0.019817 0.124099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 48 98 -1.71418e-13 -3.05972 -0.0937068 0.0612327 -2.22045e-15 -2.13163e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 98 99 1.00594 0.00124718 -0.0101201 0.00246509 0.0199685 0.124075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 49 99 -1.79967e-13 -3.05972 -0.0937068 0.0612327 -2.22045e-15 -2.22045e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 99 100 1.01351 0.00170513 -0.0102731 0.00247426 0.0201201 0.124051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 50 100 -1.88534e-13 -3.05972 -0.0937068 0.0612327 -2.22045e-15 -2.30926e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 100 101 1.02108 0.00216271 -0.0104273 0.00248342 0.0202716 0.124026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 51 101 -1.97287e-13 -3.05972 -0.0937068 0.0612327 -2.66454e-15 -2.39808e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 101 102 1.02865 0.00261991 -0.0105825 0.00249257 0.0204231 0.124002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 52 102 -2.06057e-13 -3.05972 -0.0937068 0.0612327 -2.66454e-15 -2.4869e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 102 103 1.03622 0.00307673 -0.0107389 0.00250172 0.0205745 0.123977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 53 103 -2.17382e-13 -3.05972 -0.0937068 0.0612327 -2.66454e-15 -2.66454e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 103 104 1.04379 0.00353317 -0.0108963 0.00251086 0.020726 0.123952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 54 104 -2.24709e-13 -3.05972 -0.0937068 0.0612327 -2.66454e-15 -2.66454e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 104 105 1.05136 0.00398921 -0.0110549 0.00251999 0.0208774 0.123926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 55 105 -2.30482e-13 -3.05972 -0.0937068 0.0612327 -2.66454e-15 -2.66454e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 105 106 1.05892 0.00444487 -0.0112147 0.00252911 0.0210287 0.123901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 56 106 -2.42917e-13 -3.05972 -0.0937068 0.0612327 -3.10862e-15 -2.84217e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 106 107 1.06649 0.00490014 -0.0113755 0.00253823 0.0211801 0.123875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 57 107 -2.53131e-13 -3.05972 -0.0937068 0.0612327 -3.55271e-15 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 107 108 1.07405 0.005355 -0.0115374 0.00254733 0.0213314 0.123849 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 58 108 -2.61124e-13 -3.05972 -0.0937068 0.0612327 -3.55271e-15 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 108 109 1.08161 0.00580948 -0.0117005 0.00255643 0.0214826 0.123823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 59 109 -2.66898e-13 -3.05972 -0.0937068 0.0612327 -3.55271e-15 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 109 110 1.08917 0.00626355 -0.0118647 0.00256552 0.0216339 0.123797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 60 110 -2.79554e-13 -3.05972 -0.0937068 0.0612327 -3.55271e-15 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 110 111 1.09672 0.00671721 -0.0120299 0.00257461 0.0217851 0.123771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 61 111 -2.92433e-13 -3.05972 -0.0937068 0.0612327 -3.9968e-15 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 111 112 1.10428 0.00717048 -0.0121963 0.00258368 0.0219363 0.123744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 62 112 -2.99372e-13 -3.05972 -0.0937068 0.0612327 -3.9968e-15 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 112 113 1.11183 0.00762333 -0.0123638 0.00259275 0.0220874 0.123717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 63 113 -3.06477e-13 -3.05972 -0.0937068 0.0612327 -3.9968e-15 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 113 114 1.11939 0.00807577 -0.0125325 0.00260181 0.0222385 0.123691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 64 114 -3.19078e-13 -3.05972 -0.0937068 0.0612327 -4.44089e-15 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 114 115 1.12694 0.00852779 -0.0127022 0.00261086 0.0223896 0.123663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 65 115 -3.21076e-13 -3.05972 -0.0937068 0.0612327 -4.44089e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 115 116 1.13448 0.0089794 -0.012873 0.00261991 0.0225406 0.123636 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 66 116 -3.24185e-13 -3.05972 -0.0937068 0.0612327 -4.44089e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 116 117 1.14203 0.00943059 -0.0130449 0.00262894 0.0226916 0.123609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 67 117 -3.25961e-13 -3.05972 -0.0937068 0.0612327 -4.44089e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 117 118 1.14958 0.00988136 -0.013218 0.00263797 0.0228426 0.123581 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 68 118 -3.27738e-13 -3.05972 -0.0937068 0.0612327 -4.44089e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 118 119 1.15712 0.0103317 -0.0133921 0.00264699 0.0229935 0.123553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 69 119 -3.30846e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 119 120 1.16466 0.0107816 -0.0135674 0.002656 0.0231445 0.123525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 70 120 -3.31735e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 120 121 1.1722 0.0112311 -0.0137437 0.002665 0.0232953 0.123497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 71 121 -3.33955e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 121 122 1.17974 0.0116801 -0.0139211 0.00267399 0.0234462 0.123468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 72 122 -3.36176e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 122 123 1.18728 0.0121288 -0.0140997 0.00268298 0.023597 0.12344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 73 123 -3.3884e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 123 124 1.19481 0.0125769 -0.0142793 0.00269195 0.0237477 0.123411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 74 124 -3.40727e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 124 125 1.20234 0.0130247 -0.0144601 0.00270092 0.0238985 0.123382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 75 125 -3.42982e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 125 126 1.20987 0.013472 -0.0146419 0.00270988 0.0240492 0.123353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 76 126 -3.45168e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 126 127 1.2174 0.0139188 -0.0148248 0.00271883 0.0241998 0.123324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 77 127 -3.46834e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 127 128 1.22493 0.0143652 -0.0150089 0.00272777 0.0243505 0.123294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 78 128 -3.49054e-13 -3.05972 -0.0937068 0.0612327 -4.88498e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 128 129 1.23246 0.0148111 -0.015194 0.0027367 0.0245011 0.123264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 79 129 -3.52163e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 129 130 1.23998 0.0152566 -0.0153802 0.00274562 0.0246516 0.123235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 80 130 -3.53051e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 130 131 1.2475 0.0157017 -0.0155675 0.00275453 0.0248021 0.123204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 81 131 -3.55715e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 131 132 1.25502 0.0161462 -0.0157559 0.00276344 0.0249526 0.123174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 82 132 -3.57936e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 132 133 1.26254 0.0165903 -0.0159454 0.00277233 0.0251031 0.123144 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 83 133 -3.60156e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 133 134 1.27006 0.017034 -0.0161359 0.00278122 0.0252535 0.123113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 84 134 -3.62377e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 134 135 1.27757 0.0174771 -0.0163276 0.0027901 0.0254038 0.123082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 85 135 -3.65041e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 135 136 1.28508 0.0179199 -0.0165203 0.00279897 0.0255542 0.123051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 86 136 -3.66596e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 136 137 1.29259 0.0183621 -0.0167141 0.00280782 0.0257045 0.12302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 87 137 -3.68816e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 137 138 1.3001 0.0188038 -0.016909 0.00281667 0.0258547 0.122989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 88 138 -3.70981e-13 -3.05972 -0.0937068 0.0612327 -5.32907e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 138 139 1.30761 0.0192451 -0.017105 0.00282551 0.026005 0.122957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 89 139 -3.73035e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 139 140 1.31511 0.0196859 -0.0173021 0.00283434 0.0261551 0.122926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 90 140 -3.75255e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 140 141 1.32261 0.0201262 -0.0175002 0.00284316 0.0263053 0.122894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 91 141 -3.76588e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 141 142 1.33012 0.020566 -0.0176994 0.00285197 0.0264554 0.122862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 92 142 -3.79696e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 142 143 1.33761 0.0210054 -0.0178997 0.00286077 0.0266055 0.122829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 93 143 -3.82805e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 143 144 1.34511 0.0214442 -0.0181011 0.00286957 0.0267555 0.122797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 94 144 -3.84581e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 144 145 1.35261 0.0218826 -0.0183036 0.00287835 0.0269055 0.122764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 95 145 -3.85469e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 145 146 1.3601 0.0223204 -0.0185071 0.00288712 0.0270554 0.122732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 96 146 -3.8769e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 146 147 1.36759 0.0227578 -0.0187117 0.00289588 0.0272053 0.122699 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 97 147 -3.90354e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 147 148 1.37508 0.0231946 -0.0189173 0.00290463 0.0273552 0.122665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 98 148 -3.91909e-13 -3.05972 -0.0937068 0.0612327 -5.77316e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 148 149 1.38256 0.0236309 -0.0191241 0.00291338 0.027505 0.122632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 99 149 -3.94462e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 149 150 1.39005 0.0240668 -0.0193319 0.00292211 0.0276548 0.122599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 100 150 -3.96557e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 150 151 1.39753 0.0245021 -0.0195407 0.00293083 0.0278045 0.122565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 101 151 -3.98348e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 151 152 1.40501 0.0249369 -0.0197507 0.00293954 0.0279542 0.122531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 102 152 -4.00568e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 152 153 1.41249 0.0253712 -0.0199617 0.00294824 0.0281039 0.122497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 103 153 -4.03233e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 153 154 1.41996 0.025805 -0.0201737 0.00295694 0.0282535 0.122463 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 104 154 -4.05009e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 154 155 1.42744 0.0262382 -0.0203868 0.00296562 0.0284031 0.122428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 105 155 -4.07674e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 155 156 1.43491 0.026671 -0.020601 0.00297429 0.0285526 0.122394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 106 156 -4.08562e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 156 157 1.44238 0.0271032 -0.0208163 0.00298295 0.0287021 0.122359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 107 157 -4.11227e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 157 158 1.44985 0.0275349 -0.0210326 0.0029916 0.0288516 0.122324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 108 158 -4.13003e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 158 159 1.45731 0.027966 -0.0212499 0.00300024 0.029001 0.122289 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 109 159 -4.16112e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 159 160 1.46477 0.0283966 -0.0214683 0.00300887 0.0291504 0.122253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 110 160 -4.17888e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 160 161 1.47224 0.0288267 -0.0216878 0.00301748 0.0292997 0.122218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 111 161 -4.2033e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 161 162 1.47969 0.0292562 -0.0219083 0.00302609 0.029449 0.122182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 112 162 -4.22107e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 162 163 1.48715 0.0296852 -0.0221299 0.00303469 0.0295982 0.122146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 113 163 -4.24216e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 163 164 1.4946 0.0301137 -0.0223525 0.00304328 0.0297474 0.12211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 114 164 -4.2677e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 164 165 1.50206 0.0305416 -0.0225762 0.00305185 0.0298965 0.122074 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 115 165 -4.23661e-13 -3.05972 -0.0937068 0.0612327 -6.21725e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 165 166 1.50951 0.030969 -0.0228009 0.00306042 0.0300457 0.122037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 116 166 -4.24549e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 166 167 1.51695 0.0313958 -0.0230266 0.00306897 0.0301947 0.122001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 117 167 -4.26326e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 167 168 1.5244 0.031822 -0.0232535 0.00307751 0.0303437 0.121964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 118 168 -4.2899e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 168 169 1.53184 0.0322477 -0.0234813 0.00308604 0.0304927 0.121927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 119 169 -4.31655e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 169 170 1.53928 0.0326729 -0.0237102 0.00309457 0.0306416 0.12189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 120 170 -4.33431e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 170 171 1.54672 0.0330974 -0.0239401 0.00310308 0.0307905 0.121852 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 121 171 -4.36984e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 171 172 1.55416 0.0335214 -0.0241711 0.00311157 0.0309393 0.121815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 122 172 -4.3876e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 172 173 1.56159 0.0339449 -0.0244031 0.00312006 0.0310881 0.121777 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 123 173 -4.39648e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 173 174 1.56902 0.0343678 -0.0246362 0.00312854 0.0312369 0.121739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 124 174 -4.42313e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 174 175 1.57645 0.0347901 -0.0248702 0.003137 0.0313856 0.121701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 125 175 -4.44458e-13 -3.05972 -0.0937068 0.0612327 -6.66134e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 175 176 1.58388 0.0352118 -0.0251053 0.00314546 0.0315342 0.121663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 126 176 -4.46532e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 176 177 1.5913 0.0356329 -0.0253415 0.0031539 0.0316828 0.121625 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 127 177 -4.48974e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 177 178 1.59872 0.0360535 -0.0255787 0.00316233 0.0318314 0.121586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 128 178 -4.51195e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 178 179 1.60614 0.0364735 -0.0258169 0.00317075 0.0319799 0.121547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 129 179 -4.52971e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 179 180 1.61356 0.0368929 -0.0260561 0.00317915 0.0321284 0.121508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 130 180 -4.54747e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 180 181 1.62097 0.0373117 -0.0262964 0.00318755 0.0322768 0.121469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 131 181 -4.583e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 181 182 1.62839 0.0377299 -0.0265377 0.00319594 0.0324251 0.12143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 132 182 -4.60965e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 182 183 1.63579 0.0381476 -0.02678 0.00320431 0.0325735 0.12139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 133 183 -4.62741e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 183 184 1.6432 0.0385646 -0.0270233 0.00321267 0.0327217 0.12135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 134 184 -4.64073e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 184 185 1.65061 0.0389811 -0.0272677 0.00322102 0.03287 0.121311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 135 185 -4.64961e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 185 186 1.65801 0.0393969 -0.027513 0.00322935 0.0330181 0.12127 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 136 186 -4.67182e-13 -3.05972 -0.0937068 0.0612327 -7.10543e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 186 187 1.66541 0.0398121 -0.0277594 0.00323768 0.0331663 0.12123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 137 187 -4.69735e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 187 188 1.67281 0.0402268 -0.0280068 0.00324599 0.0333143 0.12119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 138 188 -4.71845e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 188 189 1.6802 0.0406408 -0.0282552 0.00325429 0.0334624 0.121149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 139 189 -4.73621e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 189 190 1.68759 0.0410542 -0.0285047 0.00326258 0.0336103 0.121108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 140 190 -4.7562e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 190 191 1.69498 0.041467 -0.0287551 0.00327086 0.0337583 0.121067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 141 191 -4.78728e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 191 192 1.70237 0.0418792 -0.0290066 0.00327913 0.0339062 0.121026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 142 192 -4.80505e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 192 193 1.70975 0.0422908 -0.0292591 0.00328738 0.034054 0.120985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 143 193 -4.82281e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 193 194 1.71714 0.0427018 -0.0295125 0.00329562 0.0342018 0.120943 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 144 194 -4.83169e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 194 195 1.72452 0.0431121 -0.029767 0.00330385 0.0343495 0.120902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 145 195 -4.8761e-13 -3.05972 -0.0937068 0.0612327 -7.54952e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 195 196 1.73189 0.0435218 -0.0300225 0.00331206 0.0344972 0.12086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 146 196 -4.89386e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 196 197 1.73927 0.0439309 -0.030279 0.00332027 0.0346448 0.120818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 147 197 -4.90274e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 197 198 1.74664 0.0443393 -0.0305365 0.00332846 0.0347924 0.120776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 148 198 -4.93383e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 198 199 1.75401 0.0447471 -0.0307949 0.00333664 0.0349399 0.120733 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 149 199 -4.94937e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 199 200 1.76137 0.0451543 -0.0310544 0.0033448 0.0350874 0.120691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 150 200 -4.97279e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 200 201 1.76874 0.0455609 -0.0313149 0.00335296 0.0352348 0.120648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 151 201 -4.99822e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 201 202 1.7761 0.0459668 -0.0315764 0.0033611 0.0353821 0.120605 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 152 202 -5.02265e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 202 203 1.78346 0.0463721 -0.0318389 0.00336922 0.0355295 0.120562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 153 203 -5.02709e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 203 204 1.79081 0.0467767 -0.0321023 0.00337734 0.0356767 0.120518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 154 204 -5.05374e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 204 205 1.79817 0.0471807 -0.0323668 0.00338544 0.0358239 0.120475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 155 205 -5.0715e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 205 206 1.80552 0.047584 -0.0326322 0.00339353 0.0359711 0.120431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 156 206 -5.10703e-13 -3.05972 -0.0937068 0.0612327 -7.99361e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 206 207 1.81286 0.0479867 -0.0328986 0.00340161 0.0361182 0.120388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 157 207 -5.12479e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 207 208 1.82021 0.0483887 -0.0331661 0.00340967 0.0362652 0.120343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 158 208 -5.13367e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 208 209 1.82755 0.0487901 -0.0334345 0.00341772 0.0364122 0.120299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 159 209 -5.1692e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 209 210 1.83489 0.0491908 -0.0337038 0.00342576 0.0365592 0.120255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 160 210 -5.17808e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 210 211 1.84223 0.0495908 -0.0339742 0.00343379 0.0367061 0.12021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 161 211 -5.20028e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 211 212 1.84956 0.0499902 -0.0342455 0.0034418 0.0368529 0.120166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 162 212 -5.22471e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 212 213 1.85689 0.0503889 -0.0345178 0.0034498 0.0369997 0.120121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 163 213 -5.24802e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 213 214 1.86422 0.050787 -0.0347911 0.00345778 0.0371464 0.120076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 164 214 -5.2669e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 214 215 1.87155 0.0511843 -0.0350654 0.00346575 0.0372931 0.12003 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 165 215 -5.28466e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 215 216 1.87887 0.0515811 -0.0353406 0.00347371 0.0374397 0.119985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 166 216 -5.31131e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 216 217 1.88619 0.0519771 -0.0356169 0.00348166 0.0375863 0.119939 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 167 217 -5.33795e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 217 218 1.89351 0.0523724 -0.035894 0.00348959 0.0377328 0.119893 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 168 218 -5.33795e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 218 219 1.90082 0.0527671 -0.0361722 0.00349751 0.0378792 0.119847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 169 219 -5.35572e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 219 220 1.90813 0.0531611 -0.0364513 0.00350541 0.0380256 0.119801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 170 220 -5.40901e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 220 221 1.91544 0.0535544 -0.0367314 0.00351331 0.0381719 0.119755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 171 221 -5.40901e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 221 222 1.92275 0.053947 -0.0370124 0.00352118 0.0383182 0.119708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 172 222 -5.41789e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 222 223 1.93005 0.054339 -0.0372944 0.00352905 0.0384644 0.119662 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 173 223 -5.4623e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 223 224 1.93735 0.0547302 -0.0375774 0.0035369 0.0386106 0.119615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 174 224 -5.48006e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 224 225 1.94465 0.0551207 -0.0378613 0.00354473 0.0387567 0.119568 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 175 225 -5.49634e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 225 226 1.95194 0.0555106 -0.0381461 0.00355256 0.0389028 0.119521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 176 226 -5.51559e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 226 227 1.95923 0.0558997 -0.038432 0.00356037 0.0390488 0.119473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 177 227 -5.53335e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 227 228 1.96652 0.0562882 -0.0387188 0.00356816 0.0391947 0.119426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 178 228 -5.56e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 228 229 1.97381 0.0566759 -0.0390065 0.00357594 0.0393406 0.119378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 179 229 -5.59552e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 229 230 1.98109 0.057063 -0.0392952 0.00358371 0.0394864 0.11933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 180 230 -5.60441e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 230 231 1.98837 0.0574493 -0.0395848 0.00359146 0.0396322 0.119282 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 181 231 -5.62217e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 231 232 1.99565 0.0578349 -0.0398754 0.0035992 0.0397779 0.119233 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 182 232 -5.63993e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 232 233 2.00292 0.0582198 -0.0401669 0.00360693 0.0399235 0.119185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 183 233 -5.64881e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 233 234 2.01019 0.058604 -0.0404593 0.00361464 0.0400691 0.119136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 184 234 -5.68434e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 234 235 2.01746 0.0589875 -0.0407527 0.00362234 0.0402146 0.119087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 185 235 -5.69766e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 235 236 2.02472 0.0593702 -0.041047 0.00363002 0.0403601 0.119038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 186 236 -5.72875e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 236 237 2.03198 0.0597523 -0.0413423 0.00363769 0.0405055 0.118989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 187 237 -5.74651e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 237 238 2.03924 0.0601336 -0.0416385 0.00364534 0.0406508 0.11894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 188 238 -5.76539e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 238 239 2.0465 0.0605142 -0.0419357 0.00365298 0.0407961 0.11889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 189 239 -5.78204e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 239 240 2.05375 0.060894 -0.0422337 0.00366061 0.0409414 0.118841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 190 240 -5.81313e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 240 241 2.061 0.0612731 -0.0425327 0.00366822 0.0410865 0.118791 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 191 241 -5.82645e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 241 242 2.06824 0.0616515 -0.0428327 0.00367581 0.0412316 0.118741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 192 242 -5.84421e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 242 243 2.07549 0.0620292 -0.0431335 0.0036834 0.0413767 0.11869 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 193 243 -5.8531e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 243 244 2.08273 0.0624061 -0.0434353 0.00369096 0.0415217 0.11864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 194 244 -5.8975e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 244 245 2.08996 0.0627822 -0.043738 0.00369851 0.0416666 0.118589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 195 245 -5.91527e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 245 246 2.0972 0.0631577 -0.0440416 0.00370605 0.0418114 0.118538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 196 246 -5.93303e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 246 247 2.10443 0.0635324 -0.0443461 0.00371357 0.0419562 0.118488 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 197 247 -5.9508e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 247 248 2.11165 0.0639063 -0.0446516 0.00372108 0.042101 0.118436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 198 248 -5.98188e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 248 249 2.11888 0.0642795 -0.044958 0.00372858 0.0422456 0.118385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 199 249 -5.99298e-13 -3.05972 -0.0937068 0.0612327 -1.02141e-14 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 249 250 2.1261 0.0646519 -0.0452653 0.00373605 0.0423903 0.118334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 200 250 -6.01474e-13 -3.05972 -0.0937068 0.0612327 -1.02141e-14 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 250 251 2.13332 0.0650236 -0.0455734 0.00374352 0.0425348 0.118282 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 201 251 -6.03295e-13 -3.05972 -0.0937068 0.0612327 -1.02141e-14 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 251 252 2.14053 0.0653945 -0.0458826 0.00375097 0.0426793 0.11823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 202 252 -6.05294e-13 -3.05972 -0.0937068 0.0612327 -1.02141e-14 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 252 253 2.14774 0.0657647 -0.0461926 0.0037584 0.0428237 0.118178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 203 253 -6.07514e-13 -3.05972 -0.0937068 0.0612327 -1.02141e-14 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 253 254 2.15495 0.0661341 -0.0465035 0.00376582 0.0429681 0.118126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 204 254 -6.08402e-13 -3.05972 -0.0937068 0.0612327 -1.02141e-14 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 254 255 2.16216 0.0665028 -0.0468153 0.00377322 0.0431124 0.118073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 205 255 -5.48894e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 255 256 2.16936 0.0668706 -0.047128 0.00378061 0.0432566 0.118021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 206 256 -5.53335e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 256 257 2.17656 0.0672378 -0.0474416 0.00378798 0.0434008 0.117968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 207 257 -5.55112e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 257 258 2.18375 0.0676041 -0.0477562 0.00379534 0.0435449 0.117915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 208 258 -5.56888e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 258 259 2.19094 0.0679697 -0.0480716 0.00380268 0.0436889 0.117862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 209 259 -5.57776e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 259 260 2.19813 0.0683345 -0.0483879 0.00381001 0.0438329 0.117809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 210 260 -5.58664e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 260 261 2.20532 0.0686985 -0.0487051 0.00381732 0.0439768 0.117755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 211 261 -5.61329e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 261 262 2.2125 0.0690618 -0.0490232 0.00382462 0.0441206 0.117702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 212 262 -5.63549e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 262 263 2.21968 0.0694242 -0.0493422 0.0038319 0.0442644 0.117648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 213 263 -5.65215e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 263 264 2.22685 0.0697859 -0.0496621 0.00383916 0.0444081 0.117594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 214 264 -5.67102e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 264 265 2.23402 0.0701468 -0.0499828 0.00384641 0.0445518 0.11754 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 215 265 -5.69322e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 265 266 2.24119 0.0705069 -0.0503044 0.00385365 0.0446954 0.117486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 216 266 -5.71099e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 266 267 2.24836 0.0708662 -0.050627 0.00386087 0.0448389 0.117431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 217 267 -5.71099e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 267 268 2.25552 0.0712248 -0.0509504 0.00386807 0.0449823 0.117377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 218 268 -5.76428e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 268 269 2.26268 0.0715825 -0.0512746 0.00387526 0.0451257 0.117322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 219 269 -5.76428e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 269 270 2.26983 0.0719395 -0.0515998 0.00388243 0.045269 0.117267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 220 270 -5.76428e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 270 271 2.27698 0.0722956 -0.0519258 0.00388958 0.0454123 0.117212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 221 271 -5.79092e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 271 272 2.28413 0.0726509 -0.0522527 0.00389672 0.0455554 0.117156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 222 272 -5.82645e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 272 273 2.29128 0.0730055 -0.0525805 0.00390385 0.0456986 0.117101 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 223 273 -5.83089e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 273 274 2.29842 0.0733592 -0.0529091 0.00391095 0.0458416 0.117045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 224 274 -5.86198e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 274 275 2.30556 0.0737122 -0.0532386 0.00391805 0.0459846 0.116989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 225 275 -5.87397e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 275 276 2.31269 0.0740643 -0.053569 0.00392512 0.0461275 0.116933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 226 276 -5.89306e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 276 277 2.31982 0.0744156 -0.0539002 0.00393218 0.0462703 0.116877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 227 277 -5.91083e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 277 278 2.32695 0.0747661 -0.0542323 0.00393923 0.0464131 0.11682 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 228 278 -5.92415e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 278 279 2.33407 0.0751158 -0.0545652 0.00394625 0.0465558 0.116764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 229 279 -5.95968e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 279 280 2.34119 0.0754647 -0.054899 0.00395326 0.0466985 0.116707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 230 280 -5.97744e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 280 281 2.34831 0.0758127 -0.0552337 0.00396026 0.046841 0.11665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 231 281 -5.95968e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 281 282 2.35543 0.07616 -0.0555692 0.00396724 0.0469835 0.116593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 232 282 -6.00409e-13 -3.05972 -0.0937068 0.0612327 -8.88178e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 282 283 2.36254 0.0765064 -0.0559055 0.0039742 0.0471259 0.116536 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 233 283 -6.02185e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 283 284 2.36964 0.076852 -0.0562427 0.00398115 0.0472683 0.116478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 234 284 -6.03961e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 284 285 2.37674 0.0771967 -0.0565808 0.00398808 0.0474106 0.116421 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 235 285 -6.05738e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 285 286 2.38384 0.0775407 -0.0569196 0.00399499 0.0475528 0.116363 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 236 286 -6.07958e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 286 287 2.39094 0.0778838 -0.0572594 0.00400189 0.047695 0.116305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 237 287 -6.0929e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 287 288 2.39803 0.078226 -0.0575999 0.00400877 0.047837 0.116247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 238 288 -6.11067e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 288 289 2.40512 0.0785675 -0.0579413 0.00401563 0.047979 0.116188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 239 289 -6.13287e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 289 290 2.41221 0.0789081 -0.0582836 0.00402248 0.048121 0.11613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 240 290 -6.15508e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 290 291 2.41929 0.0792478 -0.0586267 0.00402931 0.0482628 0.116071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 241 291 -6.17284e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 291 292 2.42636 0.0795867 -0.0589706 0.00403612 0.0484046 0.116012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 242 292 -6.18172e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 292 293 2.43344 0.0799248 -0.0593153 0.00404292 0.0485464 0.115953 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 243 293 -6.21725e-13 -3.05972 -0.0937068 0.0612327 -9.32587e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 293 294 2.44051 0.080262 -0.0596608 0.0040497 0.048688 0.115894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 244 294 -6.23501e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 294 295 2.44758 0.0805984 -0.0600072 0.00405647 0.0488296 0.115835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 245 295 -6.23501e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 295 296 2.45464 0.0809339 -0.0603544 0.00406321 0.0489711 0.115775 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 246 296 -6.25278e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 296 297 2.4617 0.0812686 -0.0607025 0.00406994 0.0491125 0.115716 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 247 297 -6.29718e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 297 298 2.46875 0.0816024 -0.0610513 0.00407665 0.0492539 0.115656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 248 298 -6.29718e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 298 299 2.47581 0.0819354 -0.061401 0.00408335 0.0493952 0.115596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 249 299 -6.31495e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 299 300 2.48285 0.0822675 -0.0617515 0.00409003 0.0495364 0.115535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 250 300 -6.33035e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 300 301 2.4899 0.0825988 -0.0621027 0.00409669 0.0496775 0.115475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 251 301 -6.34603e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 301 302 2.49694 0.0829292 -0.0624548 0.00410334 0.0498186 0.115415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 252 302 -6.36824e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 302 303 2.50398 0.0832587 -0.0628078 0.00410996 0.0499596 0.115354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 253 303 -6.40377e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.66454e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 303 304 2.51101 0.0835873 -0.0631615 0.00411657 0.0501005 0.115293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 254 304 -6.40377e-13 -3.05972 -0.0937068 0.0612327 -9.76996e-15 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 304 305 2.51804 0.0839151 -0.063516 0.00412317 0.0502413 0.115232 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 255 305 -7.24754e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 305 306 2.52507 0.0842421 -0.0638713 0.00412974 0.0503821 0.115171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 256 306 -7.24754e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 306 307 2.53209 0.0845681 -0.0642274 0.0041363 0.0505228 0.115109 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 257 307 -7.2653e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 307 308 2.53911 0.0848933 -0.0645844 0.00414284 0.0506634 0.115047 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 258 308 -7.28306e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 308 309 2.54612 0.0852176 -0.0649421 0.00414937 0.050804 0.114986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 259 309 -7.31859e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 309 310 2.55313 0.085541 -0.0653006 0.00415588 0.0509444 0.114924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 260 310 -7.32747e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 310 311 2.56014 0.0858636 -0.0656599 0.00416236 0.0510848 0.114862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 261 311 -7.34968e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 311 312 2.56714 0.0861852 -0.06602 0.00416884 0.0512251 0.114799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 262 312 -7.3741e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 312 313 2.57414 0.086506 -0.0663808 0.00417529 0.0513654 0.114737 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 263 313 -7.39409e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 313 314 2.58113 0.0868259 -0.0667425 0.00418173 0.0515056 0.114674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 264 314 -7.41629e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 314 315 2.58813 0.0871449 -0.0671049 0.00418815 0.0516456 0.114611 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 265 315 -7.42517e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 315 316 2.59511 0.0874631 -0.0674682 0.00419455 0.0517857 0.114548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 266 316 -7.4607e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 316 317 2.6021 0.0877803 -0.0678322 0.00420093 0.0519256 0.114485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 267 317 -7.4607e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 317 318 2.60908 0.0880966 -0.0681969 0.0042073 0.0520655 0.114422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 268 318 -7.47846e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 318 319 2.61605 0.0884121 -0.0685625 0.00421365 0.0522052 0.114359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 269 319 -7.53175e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 319 320 2.62302 0.0887266 -0.0689288 0.00421998 0.0523449 0.114295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 270 320 -7.54952e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 320 321 2.62999 0.0890403 -0.0692959 0.00422629 0.0524846 0.114231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 271 321 -7.56728e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 321 322 2.63696 0.089353 -0.0696637 0.00423258 0.0526241 0.114167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 272 322 -7.56728e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 322 323 2.64392 0.0896649 -0.0700324 0.00423886 0.0527636 0.114103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 273 323 -7.59393e-13 -3.05972 -0.0937068 0.0612327 -1.28786e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 323 324 2.65087 0.0899758 -0.0704017 0.00424512 0.052903 0.114039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 274 324 -7.60281e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 324 325 2.65782 0.0902859 -0.0707719 0.00425136 0.0530423 0.113974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 275 325 -7.63405e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 325 326 2.66477 0.090595 -0.0711428 0.00425758 0.0531815 0.113909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 276 326 -7.64722e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 326 327 2.67172 0.0909032 -0.0715145 0.00426379 0.0533207 0.113844 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 277 327 -7.67386e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 327 328 2.67866 0.0912105 -0.0718869 0.00426997 0.0534598 0.113779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 278 328 -7.68274e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 328 329 2.68559 0.0915169 -0.07226 0.00427614 0.0535988 0.113714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 279 329 -7.70051e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 329 330 2.69252 0.0918224 -0.0726339 0.00428229 0.0537377 0.113649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 280 330 -7.72715e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 330 331 2.69945 0.092127 -0.0730086 0.00428843 0.0538765 0.113583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 281 331 -7.74492e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 331 332 2.70638 0.0924306 -0.073384 0.00429454 0.0540153 0.113518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 282 332 -7.79821e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 332 333 2.7133 0.0927334 -0.0737602 0.00430064 0.054154 0.113452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 283 333 -7.76268e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 333 334 2.72021 0.0930352 -0.0741371 0.00430671 0.0542926 0.113386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 284 334 -7.80709e-13 -3.05972 -0.0937068 0.0612327 -1.33227e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 334 335 2.72712 0.0933361 -0.0745147 0.00431277 0.0544311 0.11332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 285 335 -7.8515e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 335 336 2.73403 0.093636 -0.074893 0.00431881 0.0545696 0.113253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 286 336 -7.8515e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 336 337 2.74093 0.0939351 -0.0752721 0.00432484 0.0547079 0.113187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 287 337 -7.86926e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 337 338 2.74783 0.0942332 -0.075652 0.00433084 0.0548462 0.11312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 288 338 -7.88924e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 338 339 2.75473 0.0945303 -0.0760325 0.00433682 0.0549844 0.113053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 289 339 -7.90479e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 339 340 2.76162 0.0948266 -0.0764138 0.00434279 0.0551225 0.112986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 290 340 -7.93143e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 340 341 2.76851 0.0951219 -0.0767958 0.00434874 0.0552605 0.112919 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 291 341 -7.9492e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 341 342 2.77539 0.0954162 -0.0771785 0.00435467 0.0553985 0.112851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 292 342 -7.97584e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 342 343 2.78227 0.0957096 -0.077562 0.00436058 0.0555364 0.112784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 293 343 -7.99361e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 343 344 2.78914 0.0960021 -0.0779462 0.00436647 0.0556741 0.112716 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 294 344 -7.99361e-13 -3.05972 -0.0937068 0.0612327 -1.37668e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 344 345 2.79601 0.0962937 -0.078331 0.00437235 0.0558118 0.112648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 295 345 -8.01137e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 345 346 2.80288 0.0965843 -0.0787166 0.0043782 0.0559495 0.11258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 296 346 -8.02913e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 346 347 2.80974 0.0968739 -0.0791029 0.00438404 0.056087 0.112512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 297 347 -8.05578e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 347 348 2.8166 0.0971626 -0.07949 0.00438985 0.0562245 0.112443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 298 348 -8.08242e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 348 349 2.82345 0.0974504 -0.0798777 0.00439565 0.0563618 0.112375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 299 349 -8.10907e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 349 350 2.8303 0.0977372 -0.0802661 0.00440143 0.0564991 0.112306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 300 350 -8.12567e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 350 351 2.83715 0.0980231 -0.0806552 0.00440719 0.0566363 0.112237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 301 351 -8.1446e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 351 352 2.84399 0.098308 -0.0810451 0.00441293 0.0567735 0.112168 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 302 352 -8.17124e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 352 353 2.85083 0.0985919 -0.0814356 0.00441866 0.0569105 0.112099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 303 353 -8.16236e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 353 354 2.85766 0.0988749 -0.0818268 0.00442436 0.0570474 0.112029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 304 354 -8.22453e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 354 355 2.86449 0.0991569 -0.0822187 0.00443005 0.0571843 0.11196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 305 355 -8.2423e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 355 356 2.87131 0.099438 -0.0826113 0.00443571 0.0573211 0.11189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 306 356 -8.2423e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 356 357 2.87813 0.0997181 -0.0830046 0.00444136 0.0574578 0.11182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 307 357 -8.2423e-13 -3.05972 -0.0937068 0.0612327 -1.42109e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 357 358 2.88494 0.0999973 -0.0833985 0.00444698 0.0575944 0.11175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 308 358 -8.31335e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 358 359 2.89175 0.100275 -0.0837932 0.00445259 0.0577309 0.11168 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 309 359 -8.30447e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 359 360 2.89856 0.100553 -0.0841885 0.00445818 0.0578674 0.111609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 310 360 -8.32223e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 360 361 2.90536 0.100829 -0.0845845 0.00446375 0.0580037 0.111539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 311 361 -8.34444e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 361 362 2.91216 0.101104 -0.0849812 0.0044693 0.05814 0.111468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 312 362 -8.35998e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 362 363 2.91895 0.101378 -0.0853786 0.00447483 0.0582762 0.111397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 313 363 -8.38218e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 363 364 2.92574 0.101652 -0.0857766 0.00448034 0.0584123 0.111326 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 314 364 -8.38885e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 364 365 2.93253 0.101924 -0.0861753 0.00448583 0.0585483 0.111255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 315 365 -8.42881e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 365 366 2.93931 0.102196 -0.0865747 0.00449131 0.0586842 0.111183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 316 366 -8.41105e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 366 367 2.94608 0.102466 -0.0869747 0.00449676 0.0588201 0.111112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 317 367 -8.43769e-13 -3.05972 -0.0937068 0.0612327 -1.46549e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 367 368 2.95285 0.102735 -0.0873754 0.00450219 0.0589558 0.11104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 318 368 -8.45546e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 368 369 2.95962 0.103004 -0.0877767 0.00450761 0.0590915 0.110968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 319 369 -8.50875e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 369 370 2.96638 0.103271 -0.0881787 0.004513 0.059227 0.110896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 320 370 -8.54428e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 370 371 2.97314 0.103538 -0.0885814 0.00451838 0.0593625 0.110824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 321 371 -8.52651e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 371 372 2.9799 0.103803 -0.0889847 0.00452373 0.0594979 0.110751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 322 372 -8.55316e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 372 373 2.98664 0.104068 -0.0893886 0.00452907 0.0596332 0.110679 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 323 373 -8.57092e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 373 374 2.99339 0.104331 -0.0897932 0.00453438 0.0597685 0.110606 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 324 374 -8.59313e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 374 375 3.00013 0.104594 -0.0901985 0.00453968 0.0599036 0.110533 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 325 375 -8.60968e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 375 376 3.00686 0.104855 -0.0906044 0.00454496 0.0600386 0.11046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 326 376 -8.63309e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 376 377 3.0136 0.105116 -0.0910109 0.00455021 0.0601736 0.110387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 327 377 -8.64198e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 377 378 3.02032 0.105375 -0.0914181 0.00455545 0.0603085 0.110313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 328 378 -8.6775e-13 -3.05972 -0.0937068 0.0612327 -1.5099e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 378 379 3.02704 0.105634 -0.0918259 0.00456067 0.0604432 0.11024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 329 379 -8.68638e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 379 380 3.03376 0.105891 -0.0922343 0.00456587 0.0605779 0.110166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 330 380 -8.72191e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 380 381 3.04047 0.106148 -0.0926434 0.00457104 0.0607125 0.110092 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 331 381 -8.73968e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 381 382 3.04718 0.106403 -0.0930531 0.0045762 0.060847 0.110018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 332 382 -8.73968e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 382 383 3.05389 0.106658 -0.0934634 0.00458134 0.0609815 0.109944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 333 383 -8.75744e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 383 384 3.06059 0.106911 -0.0938743 0.00458645 0.0611158 0.109869 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 334 384 -8.7752e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 384 385 3.06728 0.107164 -0.0942859 0.00459155 0.06125 0.109795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 335 385 -8.78408e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 385 386 3.07397 0.107415 -0.094698 0.00459663 0.0613842 0.10972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 336 386 -8.82849e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 386 387 3.08066 0.107666 -0.0951108 0.00460169 0.0615182 0.109645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 337 387 -8.8396e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 387 388 3.08734 0.107915 -0.0955242 0.00460672 0.0616522 0.10957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 338 388 -8.8618e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 388 389 3.09401 0.108164 -0.0959382 0.00461174 0.061786 0.109495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 339 389 -8.88178e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 389 390 3.10068 0.108411 -0.0963528 0.00461674 0.0619198 0.109419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 340 390 -8.89955e-13 -3.05972 -0.0937068 0.0612327 -1.55431e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 390 391 3.10735 0.108657 -0.0967681 0.00462171 0.0620535 0.109344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 341 391 -8.91731e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 391 392 3.11401 0.108903 -0.0971839 0.00462667 0.0621871 0.109268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 342 392 -8.91731e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 392 393 3.12067 0.109147 -0.0976003 0.0046316 0.0623206 0.109192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 343 393 -8.93507e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 393 394 3.12732 0.109391 -0.0980173 0.00463652 0.062454 0.109116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 344 394 -8.98837e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 394 395 3.13397 0.109633 -0.0984349 0.00464141 0.0625873 0.10904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 345 395 -9.00613e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 395 396 3.14062 0.109874 -0.0988531 0.00464629 0.0627206 0.108964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 346 396 -9.00613e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 396 397 3.14726 0.110115 -0.0992719 0.00465114 0.0628537 0.108887 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 347 397 -9.01501e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 397 398 3.15389 0.110354 -0.0996913 0.00465598 0.0629867 0.10881 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 348 398 -9.04166e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 398 399 3.16052 0.110592 -0.100111 0.00466079 0.0631197 0.108734 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 349 399 -9.05498e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 399 400 3.16714 0.110829 -0.100532 0.00466558 0.0632525 0.108657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 350 400 -9.08561e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 400 401 3.17376 0.111065 -0.100953 0.00467036 0.0633853 0.108579 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 351 401 -9.09495e-13 -3.05972 -0.0937068 0.0612327 -1.59872e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 401 402 3.18038 0.111301 -0.101375 0.00467511 0.063518 0.108502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 352 402 -9.11271e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 402 403 3.18699 0.111535 -0.101797 0.00467984 0.0636505 0.108424 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 353 403 -9.14824e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 403 404 3.19359 0.111768 -0.10222 0.00468455 0.063783 0.108347 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 354 404 -9.14824e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 404 405 3.20019 0.112 -0.102643 0.00468924 0.0639154 0.108269 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 355 405 -9.18376e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 405 406 3.20679 0.112231 -0.103067 0.00469391 0.0640477 0.108191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 356 406 -9.166e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 406 407 3.21338 0.112461 -0.103492 0.00469856 0.0641799 0.108113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 357 407 -9.21929e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 407 408 3.21997 0.11269 -0.103917 0.00470319 0.064312 0.108034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 358 408 -9.23706e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 408 409 3.22655 0.112918 -0.104343 0.00470779 0.064444 0.107956 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 359 409 -9.25482e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 409 410 3.23313 0.113145 -0.104769 0.00471238 0.0645759 0.107877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 360 410 -9.28146e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 410 411 3.2397 0.11337 -0.105196 0.00471695 0.0647077 0.107799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 361 411 -9.29923e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 411 412 3.24626 0.113595 -0.105623 0.00472149 0.0648394 0.10772 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 362 412 -9.31255e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 412 413 3.25283 0.113819 -0.106051 0.00472601 0.064971 0.10764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 363 413 -9.32809e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 413 414 3.25938 0.114041 -0.106479 0.00473052 0.0651025 0.107561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 364 414 -9.3614e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 414 415 3.26594 0.114263 -0.106908 0.004735 0.0652339 0.107482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 365 415 -9.35252e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 415 416 3.27248 0.114484 -0.107338 0.00473946 0.0653653 0.107402 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 366 416 -9.37916e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 416 417 3.27903 0.114703 -0.107768 0.0047439 0.0654965 0.107322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 367 417 -9.41469e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 417 418 3.28556 0.114922 -0.108198 0.00474832 0.0656276 0.107242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 368 418 -9.43245e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 418 419 3.2921 0.115139 -0.10863 0.00475272 0.0657587 0.107162 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 369 419 -9.45022e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 419 420 3.29862 0.115355 -0.109061 0.0047571 0.0658896 0.107082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 370 420 -9.43245e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 420 421 3.30515 0.115571 -0.109493 0.00476145 0.0660204 0.107002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 371 421 -9.48575e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 421 422 3.31166 0.115785 -0.109926 0.00476579 0.0661512 0.106921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 372 422 -9.50351e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 422 423 3.31818 0.115998 -0.110359 0.0047701 0.0662818 0.10684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 373 423 -9.52127e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 423 424 3.32469 0.11621 -0.110793 0.00477439 0.0664124 0.106759 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 374 424 -9.53904e-13 -3.05972 -0.0937068 0.0612327 -1.68754e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 424 425 3.33119 0.116421 -0.111227 0.00477867 0.0665428 0.106678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 375 425 -9.55304e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 425 426 3.33769 0.116631 -0.111662 0.00478292 0.0666732 0.106597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 376 426 -9.57456e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 426 427 3.34418 0.11684 -0.112098 0.00478714 0.0668034 0.106516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 377 427 -9.58345e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 427 428 3.35067 0.117048 -0.112533 0.00479135 0.0669336 0.106434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 378 428 -9.61009e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 428 429 3.35715 0.117254 -0.11297 0.00479554 0.0670636 0.106352 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 379 429 -9.64562e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 429 430 3.36363 0.11746 -0.113407 0.0047997 0.0671936 0.10627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 380 430 -9.68114e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 430 431 3.3701 0.117665 -0.113844 0.00480385 0.0673234 0.106188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 381 431 -9.68114e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 431 432 3.37657 0.117868 -0.114282 0.00480797 0.0674532 0.106106 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 382 432 -9.66338e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 432 433 3.38303 0.118071 -0.11472 0.00481207 0.0675828 0.106024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 383 433 -9.69891e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 433 434 3.38949 0.118272 -0.115159 0.00481615 0.0677124 0.105941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 384 434 -9.71667e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 434 435 3.39594 0.118473 -0.115598 0.00482021 0.0678418 0.105859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 385 435 -9.74332e-13 -3.05972 -0.0937068 0.0612327 -1.73195e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 435 436 3.40239 0.118672 -0.116038 0.00482425 0.0679711 0.105776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 386 436 -9.76108e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 436 437 3.40883 0.11887 -0.116478 0.00482826 0.0681004 0.105693 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 387 437 -9.7744e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 437 438 3.41527 0.119067 -0.116919 0.00483226 0.0682295 0.10561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 388 438 -9.79439e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 438 439 3.4217 0.119263 -0.11736 0.00483623 0.0683586 0.105526 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 389 439 -9.81437e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 439 440 3.42813 0.119458 -0.117802 0.00484018 0.0684875 0.105443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 390 440 -9.83214e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 440 441 3.43455 0.119652 -0.118244 0.00484411 0.0686164 0.105359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 391 441 -9.85878e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 441 442 3.44097 0.119845 -0.118687 0.00484801 0.0687451 0.105276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 392 442 -9.89431e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 442 443 3.44738 0.120036 -0.11913 0.0048519 0.0688737 0.105192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 393 443 -9.87654e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 443 444 3.45378 0.120227 -0.119574 0.00485576 0.0690023 0.105108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 394 444 -9.89431e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 444 445 3.46018 0.120416 -0.120018 0.00485961 0.0691307 0.105023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 395 445 -9.92983e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 445 446 3.46658 0.120605 -0.120462 0.00486343 0.069259 0.104939 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 396 446 -9.9476e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 446 447 3.47297 0.120792 -0.120907 0.00486723 0.0693873 0.104854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 397 447 -9.92983e-13 -3.05972 -0.0937068 0.0612327 -1.77636e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 447 448 3.47936 0.120978 -0.121353 0.004871 0.0695154 0.10477 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 398 448 -9.97424e-13 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 448 449 3.48574 0.121164 -0.121799 0.00487476 0.0696434 0.104685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 399 449 -1.00009e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 449 450 3.49211 0.121348 -0.122245 0.00487849 0.0697713 0.1046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 400 450 -1.00115e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 450 451 3.49848 0.121531 -0.122692 0.00488221 0.0698991 0.104515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 401 451 -1.0032e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 451 452 3.50485 0.121713 -0.123139 0.0048859 0.0700269 0.104429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 402 452 -1.00453e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 452 453 3.51121 0.121893 -0.123587 0.00488956 0.0701545 0.104344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 403 453 -1.00719e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 453 454 3.51756 0.122073 -0.124035 0.00489321 0.070282 0.104258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 404 454 -1.00897e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 454 455 3.52391 0.122252 -0.124484 0.00489683 0.0704094 0.104172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 405 455 -1.00897e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 455 456 3.53025 0.122429 -0.124933 0.00490044 0.0705366 0.104086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 406 456 -1.0143e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 456 457 3.53659 0.122605 -0.125382 0.00490402 0.0706638 0.104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 407 457 -1.0143e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 457 458 3.54292 0.122781 -0.125832 0.00490758 0.0707909 0.103914 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 408 458 -1.0143e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 458 459 3.54925 0.122955 -0.126282 0.00491111 0.0709179 0.103827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 409 459 -1.01785e-12 -3.05972 -0.0937068 0.0612327 -1.82077e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 459 460 3.55557 0.123128 -0.126733 0.00491463 0.0710448 0.103741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 410 460 -1.01785e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 460 461 3.56189 0.1233 -0.127184 0.00491812 0.0711715 0.103654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 411 461 -1.02141e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 461 462 3.5682 0.123471 -0.127636 0.00492159 0.0712982 0.103567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 412 462 -1.02274e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 462 463 3.57451 0.123641 -0.128088 0.00492504 0.0714247 0.10348 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 413 463 -1.02474e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 463 464 3.58081 0.123809 -0.12854 0.00492847 0.0715512 0.103393 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 414 464 -1.02585e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 464 465 3.5871 0.123977 -0.128993 0.00493187 0.0716775 0.103305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 415 465 -1.02673e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 465 466 3.59339 0.124143 -0.129447 0.00493525 0.0718038 0.103218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 416 466 -1.02851e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 466 467 3.59968 0.124308 -0.1299 0.00493861 0.0719299 0.10313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 417 467 -1.02851e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 467 468 3.60596 0.124473 -0.130354 0.00494195 0.0720559 0.103042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 418 468 -1.03562e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 468 469 3.61223 0.124636 -0.130809 0.00494526 0.0721818 0.102954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 419 469 -1.03206e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 469 470 3.6185 0.124798 -0.131264 0.00494856 0.0723076 0.102866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 420 470 -1.04095e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 470 471 3.62476 0.124959 -0.131719 0.00495183 0.0724333 0.102778 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 421 471 -1.03917e-12 -3.05972 -0.0937068 0.0612327 -1.86517e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 471 472 3.63102 0.125118 -0.132174 0.00495508 0.0725589 0.102689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 422 472 -1.04095e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 472 473 3.63727 0.125277 -0.13263 0.0049583 0.0726844 0.102601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 423 473 -1.04272e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 473 474 3.64352 0.125435 -0.133087 0.00496151 0.0728098 0.102512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 424 474 -1.04317e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 474 475 3.64976 0.125591 -0.133544 0.00496469 0.0729351 0.102423 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 425 475 -1.04606e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 475 476 3.656 0.125746 -0.134001 0.00496785 0.0730602 0.102334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 426 476 -1.04716e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 476 477 3.66223 0.1259 -0.134458 0.00497099 0.0731853 0.102245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 427 477 -1.04983e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 477 478 3.66845 0.126053 -0.134916 0.0049741 0.0733102 0.102155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 428 478 -1.0516e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 478 479 3.67467 0.126205 -0.135375 0.00497719 0.073435 0.102066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 429 479 -1.0516e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 479 480 3.68089 0.126356 -0.135833 0.00498026 0.0735598 0.101976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 430 480 -1.04983e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 480 481 3.68709 0.126506 -0.136292 0.00498331 0.0736844 0.101886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 431 481 -1.05693e-12 -3.05972 -0.0937068 0.0612327 -1.90958e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 481 482 3.6933 0.126654 -0.136752 0.00498633 0.0738089 0.101796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 432 482 -1.06049e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 482 483 3.69949 0.126802 -0.137212 0.00498934 0.0739333 0.101706 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 433 483 -1.05871e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 483 484 3.70569 0.126948 -0.137672 0.00499232 0.0740576 0.101616 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 434 484 -1.06049e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 484 485 3.71187 0.127093 -0.138132 0.00499527 0.0741817 0.101525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 435 485 -1.06404e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 485 486 3.71805 0.127237 -0.138593 0.00499821 0.0743058 0.101435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 436 486 -1.06493e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 486 487 3.72423 0.12738 -0.139054 0.00500112 0.0744298 0.101344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 437 487 -1.06737e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 487 488 3.7304 0.127522 -0.139516 0.00500401 0.0745536 0.101253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 438 488 -1.0687e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 488 489 3.73656 0.127663 -0.139978 0.00500688 0.0746773 0.101162 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 439 489 -1.07114e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 489 490 3.74272 0.127802 -0.14044 0.00500972 0.074801 0.101071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 440 490 -1.0747e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 490 491 3.74887 0.12794 -0.140903 0.00501254 0.0749245 0.100979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 441 491 -1.0747e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 491 492 3.75502 0.128078 -0.141366 0.00501534 0.0750479 0.100888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 442 492 -1.0747e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 492 493 3.76116 0.128214 -0.141829 0.00501812 0.0751712 0.100796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 443 493 -1.07825e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 493 494 3.7673 0.128349 -0.142292 0.00502087 0.0752943 0.100704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 444 494 -1.07825e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 494 495 3.77343 0.128483 -0.142756 0.00502361 0.0754174 0.100612 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 445 495 -1.08002e-12 -3.05972 -0.0937068 0.0612327 -1.95399e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 495 496 3.77955 0.128615 -0.143221 0.00502631 0.0755403 0.10052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 446 496 -1.08358e-12 -3.05972 -0.0937068 0.0612327 -1.9984e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 496 497 3.78567 0.128747 -0.143685 0.005029 0.0756632 0.100428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 447 497 -1.08535e-12 -3.05972 -0.0937068 0.0612327 -1.9984e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 497 498 3.79178 0.128877 -0.14415 0.00503166 0.0757859 0.100335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 448 498 -1.08713e-12 -3.05972 -0.0937068 0.0612327 -2.39808e-14 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 498 499 3.79789 0.129007 -0.144615 0.0050343 0.0759085 0.100243 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 449 499 -1.08846e-12 -3.05972 -0.0937068 0.0612327 -1.9984e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 499 500 3.80399 0.129135 -0.145081 0.00503692 0.076031 0.10015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 450 500 -1.08999e-12 -3.05972 -0.0937068 0.0612327 -2.39808e-14 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 500 501 3.81009 0.129262 -0.145547 0.00503951 0.0761534 0.100057 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 451 501 -1.09157e-12 -3.05972 -0.0937068 0.0612327 -1.9984e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 501 502 3.81618 0.129388 -0.146013 0.00504209 0.0762757 0.0999639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 452 502 -1.09424e-12 -3.05972 -0.0937068 0.0612327 -2.39808e-14 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 502 503 3.82226 0.129512 -0.146479 0.00504464 0.0763978 0.0998707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 453 503 -1.09424e-12 -3.05972 -0.0937068 0.0612327 -1.9984e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 503 504 3.82834 0.129636 -0.146946 0.00504716 0.0765199 0.0997774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 454 504 -1.09779e-12 -3.05972 -0.0937068 0.0612327 -2.39808e-14 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 504 505 3.83441 0.129758 -0.147413 0.00504967 0.0766418 0.0996839 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 455 505 -1.09956e-12 -3.05972 -0.0937068 0.0612327 -1.9984e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 505 506 3.84048 0.12988 -0.14788 0.00505215 0.0767636 0.0995902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 456 506 -1.09601e-12 -3.05972 -0.0937068 0.0612327 -2.44249e-14 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 506 507 3.84654 0.13 -0.148348 0.0050546 0.0768853 0.0994964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 457 507 -1.10134e-12 -3.05972 -0.0937068 0.0612327 -2.04281e-14 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 507 508 3.8526 0.130119 -0.148816 0.00505704 0.0770069 0.0994025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 458 508 -1.10489e-12 -3.05972 -0.0937068 0.0612327 -2.44249e-14 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 508 509 3.85865 0.130237 -0.149284 0.00505945 0.0771284 0.0993084 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 459 509 -1.10489e-12 -3.05972 -0.0937068 0.0612327 -2.04281e-14 -2.93099e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 509 510 3.86469 0.130354 -0.149753 0.00506184 0.0772498 0.0992141 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 460 510 -1.10667e-12 -3.05972 -0.0937068 0.0612327 -2.44249e-14 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 510 511 3.87073 0.130469 -0.150221 0.0050642 0.077371 0.0991197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 461 511 -8.89067e-13 -3.05972 -0.0937068 0.0612327 -2.04281e-14 -2.93099e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 511 512 3.87676 0.130583 -0.150691 0.00506655 0.0774922 0.0990252 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 462 512 -6.70797e-13 -3.05972 -0.0937068 0.0612327 -1.64313e-14 -2.35367e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 512 513 3.88279 0.130697 -0.15116 0.00506887 0.0776132 0.0989305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 463 513 -4.51861e-13 -3.05972 -0.0937068 0.0612327 -1.24345e-14 -1.77636e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 513 514 3.88881 0.130809 -0.15163 0.00507116 0.0777341 0.0988356 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 464 514 -2.33591e-13 -3.05972 -0.0937068 0.0612327 -8.43769e-15 -1.19904e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 514 515 3.89483 0.13092 -0.152099 0.00507344 0.0778549 0.0987406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 465 515 -1.24345e-14 -3.05972 -0.0937068 0.0612327 -4.44089e-15 -6.21725e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 515 516 3.90084 0.13103 -0.15257 0.00507569 0.0779755 0.0986455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 466 516 2.07834e-13 -3.05972 -0.0937068 0.0612327 0 0 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 516 517 3.90684 0.131138 -0.15304 0.00507792 0.0780961 0.0985502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 467 517 4.28102e-13 -3.05972 -0.0937068 0.0612327 3.9968e-15 5.77316e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 517 518 3.91284 0.131246 -0.153511 0.00508012 0.0782165 0.0984547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 468 518 6.55476e-13 -3.05972 -0.0937068 0.0612327 7.99361e-15 1.15463e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 518 519 3.91883 0.131352 -0.153982 0.0050823 0.0783368 0.0983591 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 469 519 8.7752e-13 -3.05972 -0.0937068 0.0612327 1.19904e-14 1.73195e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 519 520 3.92481 0.131457 -0.154453 0.00508446 0.078457 0.0982634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 470 520 1.09956e-12 -3.05972 -0.0937068 0.0612327 1.64313e-14 2.30926e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 520 521 3.93079 0.131561 -0.154925 0.0050866 0.0785771 0.0981675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 471 521 1.32516e-12 -3.05972 -0.0937068 0.0612327 2.04281e-14 2.88658e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 521 522 3.93677 0.131664 -0.155396 0.00508871 0.0786971 0.0980715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 472 522 1.55076e-12 -3.05972 -0.0937068 0.0612327 2.44249e-14 3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 522 523 3.94274 0.131766 -0.155868 0.0050908 0.0788169 0.0979753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 473 523 1.77547e-12 -3.05972 -0.0937068 0.0612327 2.88658e-14 4.04121e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 523 524 3.9487 0.131867 -0.156341 0.00509286 0.0789367 0.0978789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 474 524 2.0024e-12 -3.05972 -0.0937068 0.0612327 3.28626e-14 4.61853e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 524 525 3.95466 0.131966 -0.156813 0.00509491 0.0790563 0.0977825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 475 525 2.23008e-12 -3.05972 -0.0937068 0.0612327 3.73035e-14 5.19584e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 525 526 3.96061 0.132064 -0.157286 0.00509693 0.0791758 0.0976858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 476 526 2.45803e-12 -3.05972 -0.0937068 0.0612327 4.13003e-14 5.77316e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 526 527 3.96655 0.132161 -0.157759 0.00509892 0.0792952 0.0975891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 477 527 2.68585e-12 -3.05972 -0.0937068 0.0612327 4.57412e-14 6.30607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 527 528 3.97249 0.132257 -0.158232 0.0051009 0.0794144 0.0974921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 478 528 2.91678e-12 -3.05972 -0.0937068 0.0612327 4.9738e-14 6.88338e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 528 529 3.97842 0.132352 -0.158705 0.00510285 0.0795336 0.0973951 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 479 529 3.14415e-12 -3.05972 -0.0937068 0.0612327 5.41789e-14 7.4607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 529 530 3.98435 0.132446 -0.159179 0.00510477 0.0796526 0.0972978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 480 530 3.37508e-12 -3.05972 -0.0937068 0.0612327 5.81757e-14 8.03801e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 530 531 3.99027 0.132538 -0.159653 0.00510668 0.0797715 0.0972005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 481 531 3.60423e-12 -3.05972 -0.0937068 0.0612327 6.26166e-14 8.61533e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 531 532 3.99618 0.13263 -0.160127 0.00510856 0.0798903 0.097103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 482 532 3.83871e-12 -3.05972 -0.0937068 0.0612327 6.66134e-14 9.19265e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 532 533 4.00209 0.13272 -0.160601 0.00511042 0.080009 0.0970053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 483 533 4.06786e-12 -3.05972 -0.0937068 0.0612327 7.10543e-14 9.72555e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 533 534 4.00799 0.132809 -0.161076 0.00511225 0.0801275 0.0969075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 484 534 4.30411e-12 -3.05972 -0.0937068 0.0612327 7.54952e-14 1.03029e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 534 535 4.01389 0.132897 -0.161551 0.00511406 0.080246 0.0968095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 485 535 4.53682e-12 -3.05972 -0.0937068 0.0612327 7.99361e-14 1.08802e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 535 536 4.01978 0.132983 -0.162026 0.00511585 0.0803643 0.0967115 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 486 536 4.77396e-12 -3.05972 -0.0937068 0.0612327 8.43769e-14 1.14131e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 536 537 4.02567 0.133069 -0.162501 0.00511761 0.0804825 0.0966132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 487 537 5.00888e-12 -3.05972 -0.0937068 0.0612327 8.83738e-14 1.19904e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 537 538 4.03154 0.133153 -0.162976 0.00511935 0.0806006 0.0965148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 488 538 5.24469e-12 -3.05972 -0.0937068 0.0612327 9.28146e-14 1.25233e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 538 539 4.03742 0.133236 -0.163452 0.00512107 0.0807185 0.0964163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 489 539 5.48095e-12 -3.05972 -0.0937068 0.0612327 9.72555e-14 1.31006e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 539 540 4.04328 0.133318 -0.163928 0.00512277 0.0808363 0.0963176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 490 540 5.71987e-12 -3.05972 -0.0937068 0.0612327 1.01696e-13 1.36779e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 540 541 4.04914 0.133399 -0.164404 0.00512444 0.0809541 0.0962188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 491 541 5.95612e-12 -3.05972 -0.0937068 0.0612327 1.06137e-13 1.42109e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 541 542 4.055 0.133479 -0.16488 0.00512608 0.0810716 0.0961198 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 492 542 6.19238e-12 -3.05972 -0.0937068 0.0612327 1.10578e-13 1.47438e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 542 543 4.06085 0.133557 -0.165356 0.00512771 0.0811891 0.0960207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 493 543 6.43219e-12 -3.05972 -0.0937068 0.0612327 1.15019e-13 1.53211e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 543 544 4.06669 0.133635 -0.165833 0.00512931 0.0813065 0.0959214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 494 544 6.67377e-12 -3.05972 -0.0937068 0.0612327 1.1946e-13 1.58984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 544 545 4.07252 0.133711 -0.16631 0.00513089 0.0814237 0.095822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 495 545 6.91003e-12 -3.05972 -0.0937068 0.0612327 1.23901e-13 1.64313e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 545 546 4.07835 0.133786 -0.166787 0.00513244 0.0815408 0.0957225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 496 546 7.15517e-12 -3.05972 -0.0937068 0.0612327 1.28342e-13 1.69642e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 546 547 4.08418 0.13386 -0.167264 0.00513397 0.0816578 0.0956228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 497 547 7.3932e-12 -3.05972 -0.0937068 0.0612327 1.32783e-13 1.75415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 547 548 4.09 0.133932 -0.167741 0.00513548 0.0817747 0.0955229 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 498 548 7.6561e-12 -3.05972 -0.0937068 0.0612327 1.41664e-13 1.86517e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 548 549 4.09581 0.134004 -0.168219 0.00513696 0.0818914 0.095423 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 499 549 7.88303e-12 -3.05972 -0.0937068 0.0612327 1.42109e-13 1.86517e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 549 550 4.10161 0.134074 -0.168697 0.00513842 0.082008 0.0953228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 500 550 8.14333e-12 -3.05972 -0.0937068 0.0612327 1.5099e-13 1.9762e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 550 551 4.10741 0.134143 -0.169174 0.00513986 0.0821245 0.0952226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 501 551 8.37064e-12 -3.05972 -0.0937068 0.0612327 1.5099e-13 1.97176e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 551 552 4.1132 0.134211 -0.169652 0.00514127 0.0822409 0.0951221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 502 552 8.63398e-12 -3.05972 -0.0937068 0.0612327 1.59872e-13 2.08278e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 552 553 4.11899 0.134278 -0.170131 0.00514266 0.0823572 0.0950216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 503 553 8.86224e-12 -3.05972 -0.0937068 0.0612327 1.60316e-13 2.08278e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 553 554 4.12477 0.134344 -0.170609 0.00514403 0.0824733 0.0949209 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 504 554 9.12337e-12 -3.05972 -0.0937068 0.0612327 1.69198e-13 2.1938e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 554 555 4.13055 0.134408 -0.171088 0.00514537 0.0825893 0.09482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 505 555 9.35607e-12 -3.05972 -0.0937068 0.0612327 1.69198e-13 2.18936e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 555 556 4.13632 0.134471 -0.171566 0.00514669 0.0827052 0.094719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 506 556 9.6172e-12 -3.05972 -0.0937068 0.0612327 1.78524e-13 2.30038e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 556 557 4.14208 0.134534 -0.172045 0.00514799 0.082821 0.0946179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 507 557 9.85168e-12 -3.05972 -0.0937068 0.0612327 1.78524e-13 2.30038e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 557 558 4.14783 0.134594 -0.172524 0.00514926 0.0829366 0.0945166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 508 558 1.01146e-11 -3.05972 -0.0937068 0.0612327 1.8785e-13 2.40696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 558 559 4.15358 0.134654 -0.173003 0.00515051 0.0830521 0.0944152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 509 559 1.03473e-11 -3.05972 -0.0937068 0.0612327 1.8785e-13 2.40696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 559 560 4.15933 0.134713 -0.173482 0.00515174 0.0831675 0.0943136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 510 560 1.06137e-11 -3.05972 -0.0937068 0.0612327 1.97176e-13 2.51354e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 560 561 4.16506 0.13477 -0.173962 0.00515294 0.0832828 0.0942119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 511 561 1.06306e-11 -3.05972 -0.0937068 0.0612327 1.97176e-13 2.51354e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 561 562 4.17079 0.134827 -0.174441 0.00515412 0.0833979 0.0941101 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 512 562 1.0645e-11 -3.05972 -0.0937068 0.0612327 1.9762e-13 2.5091e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 562 563 4.17652 0.134882 -0.174921 0.00515527 0.0835129 0.0940081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 513 563 1.0659e-11 -3.05972 -0.0937068 0.0612327 1.98064e-13 2.5091e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 563 564 4.18224 0.134936 -0.175401 0.00515641 0.0836278 0.093906 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 514 564 1.06732e-11 -3.05972 -0.0937068 0.0612327 1.98064e-13 2.50466e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 564 565 4.18795 0.134988 -0.175881 0.00515751 0.0837426 0.0938037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 515 565 1.06866e-11 -3.05972 -0.0937068 0.0612327 1.98508e-13 2.50466e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 565 566 4.19366 0.13504 -0.176361 0.0051586 0.0838572 0.0937013 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 516 566 1.07008e-11 -3.05972 -0.0937068 0.0612327 1.98952e-13 2.50022e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 566 567 4.19936 0.13509 -0.176841 0.00515966 0.0839718 0.0935987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 517 567 1.07168e-11 -3.05972 -0.0937068 0.0612327 1.99396e-13 2.50022e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 567 568 4.20505 0.135139 -0.177321 0.0051607 0.0840862 0.093496 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 518 568 1.07327e-11 -3.05972 -0.0937068 0.0612327 1.99396e-13 2.49578e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 568 569 4.21074 0.135187 -0.177802 0.00516171 0.0842004 0.0933932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 519 569 1.07434e-11 -3.05972 -0.0937068 0.0612327 1.9984e-13 2.49134e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 569 570 4.21642 0.135234 -0.178282 0.0051627 0.0843146 0.0932902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 520 570 1.07647e-11 -3.05972 -0.0937068 0.0612327 1.9984e-13 2.49134e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 570 571 4.22209 0.13528 -0.178763 0.00516367 0.0844286 0.0931871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 521 571 1.07789e-11 -3.05972 -0.0937068 0.0612327 2.00284e-13 2.4869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 571 572 4.22776 0.135324 -0.179244 0.00516461 0.0845425 0.0930838 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 522 572 1.07931e-11 -3.05972 -0.0937068 0.0612327 2.00728e-13 2.4869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 572 573 4.23342 0.135368 -0.179725 0.00516553 0.0846563 0.0929804 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 523 573 1.08029e-11 -3.05972 -0.0937068 0.0612327 2.01172e-13 2.48246e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 573 574 4.23908 0.13541 -0.180206 0.00516642 0.0847699 0.0928769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 524 574 1.08185e-11 -3.05972 -0.0937068 0.0612327 2.01172e-13 2.48246e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 574 575 4.24472 0.135451 -0.180687 0.0051673 0.0848834 0.0927732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 525 575 1.08331e-11 -3.05972 -0.0937068 0.0612327 2.01617e-13 2.47802e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 575 576 4.25037 0.135491 -0.181168 0.00516814 0.0849968 0.0926694 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 526 576 1.08482e-11 -3.05972 -0.0937068 0.0612327 2.02061e-13 2.47802e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 576 577 4.256 0.135529 -0.181649 0.00516897 0.0851101 0.0925654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 527 577 1.08651e-11 -3.05972 -0.0937068 0.0612327 2.02061e-13 2.47358e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 577 578 4.26163 0.135567 -0.182131 0.00516977 0.0852232 0.0924613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 528 578 1.08731e-11 -3.05972 -0.0937068 0.0612327 2.02505e-13 2.46914e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 578 579 4.26726 0.135603 -0.182612 0.00517055 0.0853362 0.0923571 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 529 579 1.08926e-11 -3.05972 -0.0937068 0.0612327 2.02949e-13 2.46914e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 579 580 4.27287 0.135638 -0.183094 0.0051713 0.0854491 0.0922527 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 530 580 1.09051e-11 -3.05972 -0.0937068 0.0612327 2.02949e-13 2.4647e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 580 581 4.27849 0.135672 -0.183575 0.00517203 0.0855618 0.0921481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 531 581 1.09193e-11 -3.05972 -0.0937068 0.0612327 2.03393e-13 2.4647e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 581 582 4.28409 0.135705 -0.184057 0.00517274 0.0856745 0.0920435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 532 582 1.0937e-11 -3.05972 -0.0937068 0.0612327 2.03837e-13 2.46025e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 582 583 4.28969 0.135736 -0.184539 0.00517342 0.085787 0.0919387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 533 583 1.09495e-11 -3.05972 -0.0937068 0.0612327 2.04281e-13 2.46025e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 583 584 4.29528 0.135766 -0.185021 0.00517408 0.0858993 0.0918337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 534 584 1.09637e-11 -3.05972 -0.0937068 0.0612327 2.04281e-13 2.45581e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 584 585 4.30086 0.135796 -0.185503 0.00517472 0.0860116 0.0917287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 535 585 1.09761e-11 -3.05972 -0.0937068 0.0612327 2.04725e-13 2.45137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 585 586 4.30644 0.135824 -0.185985 0.00517533 0.0861237 0.0916234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 536 586 1.09912e-11 -3.05972 -0.0937068 0.0612327 2.04725e-13 2.45137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 586 587 4.31201 0.13585 -0.186467 0.00517592 0.0862357 0.0915181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 537 587 1.10045e-11 -3.05972 -0.0937068 0.0612327 2.05169e-13 2.44693e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 587 588 4.31758 0.135876 -0.186949 0.00517648 0.0863475 0.0914126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 538 588 1.10183e-11 -3.05972 -0.0937068 0.0612327 2.05613e-13 2.44693e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 588 589 4.32314 0.135901 -0.187431 0.00517702 0.0864593 0.0913069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 539 589 1.1033e-11 -3.05972 -0.0937068 0.0612327 2.06057e-13 2.44249e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 589 590 4.32869 0.135924 -0.187914 0.00517754 0.0865709 0.0912012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 540 590 1.10489e-11 -3.05972 -0.0937068 0.0612327 2.06057e-13 2.44249e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 590 591 4.33424 0.135946 -0.188396 0.00517803 0.0866823 0.0910953 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 541 591 1.10596e-11 -3.05972 -0.0937068 0.0612327 2.06501e-13 2.43805e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 591 592 4.33978 0.135967 -0.188878 0.0051785 0.0867937 0.0909892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 542 592 1.10738e-11 -3.05972 -0.0937068 0.0612327 2.06946e-13 2.43805e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 592 593 4.34531 0.135986 -0.189361 0.00517895 0.0869049 0.090883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 543 593 1.10933e-11 -3.05972 -0.0937068 0.0612327 2.06946e-13 2.43361e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 593 594 4.35084 0.136005 -0.189843 0.00517937 0.087016 0.0907767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 544 594 1.11058e-11 -3.05972 -0.0937068 0.0612327 2.0739e-13 2.42917e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 594 595 4.35636 0.136022 -0.190326 0.00517977 0.0871269 0.0906702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 545 595 1.112e-11 -3.05972 -0.0937068 0.0612327 2.07834e-13 2.42917e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 595 596 4.36187 0.136039 -0.190808 0.00518014 0.0872378 0.0905636 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 546 596 1.11289e-11 -3.05972 -0.0937068 0.0612327 2.07834e-13 2.42473e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 596 597 4.36738 0.136054 -0.191291 0.00518049 0.0873484 0.0904569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 547 597 1.11466e-11 -3.05972 -0.0937068 0.0612327 2.08278e-13 2.42473e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 597 598 4.37288 0.136067 -0.191774 0.00518082 0.087459 0.09035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 548 598 1.11591e-11 -3.05972 -0.0937068 0.0612327 2.08722e-13 2.42029e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 598 599 4.37837 0.13608 -0.192256 0.00518113 0.0875694 0.090243 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 549 599 1.11724e-11 -3.05972 -0.0937068 0.0612327 2.08722e-13 2.42029e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 599 600 4.38386 0.136091 -0.192739 0.00518141 0.0876797 0.0901359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 550 600 1.11875e-11 -3.05972 -0.0937068 0.0612327 2.09166e-13 2.41585e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 600 601 4.38934 0.136102 -0.193222 0.00518166 0.0877899 0.0900286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 551 601 1.12017e-11 -3.05972 -0.0937068 0.0612327 2.0961e-13 2.4114e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 601 602 4.39481 0.136111 -0.193704 0.00518189 0.0878999 0.0899211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 552 602 1.12141e-11 -3.05972 -0.0937068 0.0612327 2.0961e-13 2.4114e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 602 603 4.40028 0.136119 -0.194187 0.0051821 0.0880099 0.0898136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 553 603 1.12266e-11 -3.05972 -0.0937068 0.0612327 2.10054e-13 2.40696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 603 604 4.40574 0.136125 -0.19467 0.00518229 0.0881196 0.0897059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 554 604 1.12479e-11 -3.05972 -0.0937068 0.0612327 2.10498e-13 2.40696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 604 605 4.4112 0.136131 -0.195153 0.00518245 0.0882293 0.0895981 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 555 605 1.12568e-11 -3.05972 -0.0937068 0.0612327 2.10498e-13 2.40252e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 605 606 4.41664 0.136135 -0.195636 0.00518259 0.0883388 0.0894901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 556 606 1.12692e-11 -3.05972 -0.0937068 0.0612327 2.10942e-13 2.39808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 606 607 4.42209 0.136138 -0.196118 0.0051827 0.0884482 0.089382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 557 607 1.12799e-11 -3.05972 -0.0937068 0.0612327 2.11386e-13 2.39808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 607 608 4.42752 0.13614 -0.196601 0.00518279 0.0885574 0.0892738 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 558 608 1.13012e-11 -3.05972 -0.0937068 0.0612327 2.11386e-13 2.39364e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 608 609 4.43295 0.136141 -0.197084 0.00518286 0.0886665 0.0891654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 559 609 1.13118e-11 -3.05972 -0.0937068 0.0612327 2.11831e-13 2.39364e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 609 610 4.43837 0.136141 -0.197567 0.0051829 0.0887755 0.0890569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 560 610 1.13278e-11 -3.05972 -0.0937068 0.0612327 2.12275e-13 2.3892e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 610 611 4.44378 0.136139 -0.19805 0.00518292 0.0888844 0.0889482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 561 611 1.13412e-11 -3.05972 -0.0937068 0.0612327 2.12275e-13 2.3892e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 611 612 4.44919 0.136136 -0.198533 0.00518291 0.0889931 0.0888395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 562 612 1.13531e-11 -3.05972 -0.0937068 0.0612327 2.12719e-13 2.38476e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 612 613 4.45459 0.136133 -0.199015 0.00518289 0.0891017 0.0887306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 563 613 1.13678e-11 -3.05972 -0.0937068 0.0612327 2.13163e-13 2.38032e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 613 614 4.45999 0.136127 -0.199498 0.00518283 0.0892101 0.0886215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 564 614 1.1382e-11 -3.05972 -0.0937068 0.0612327 2.13163e-13 2.38032e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 614 615 4.46538 0.136121 -0.199981 0.00518276 0.0893185 0.0885123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 565 615 1.13953e-11 -3.05972 -0.0937068 0.0612327 2.13607e-13 2.37588e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 615 616 4.47076 0.136114 -0.200464 0.00518266 0.0894267 0.088403 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 566 616 1.1406e-11 -3.05972 -0.0937068 0.0612327 2.13607e-13 2.37588e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 616 617 4.47613 0.136105 -0.200947 0.00518253 0.0895347 0.0882936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 567 617 1.1422e-11 -3.05972 -0.0937068 0.0612327 2.14051e-13 2.37144e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 617 618 4.4815 0.136095 -0.201429 0.00518239 0.0896426 0.088184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 568 618 1.14326e-11 -3.05972 -0.0937068 0.0612327 2.14495e-13 2.367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 618 619 4.48686 0.136084 -0.201912 0.00518221 0.0897504 0.0880743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 569 619 1.14468e-11 -3.05972 -0.0937068 0.0612327 2.14939e-13 2.367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 619 620 4.49221 0.136072 -0.202395 0.00518202 0.0898581 0.0879644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 570 620 1.14593e-11 -3.05972 -0.0937068 0.0612327 2.14939e-13 2.36255e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 620 621 4.49756 0.136059 -0.202877 0.0051818 0.0899656 0.0878544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 571 621 1.14735e-11 -3.05972 -0.0937068 0.0612327 2.15383e-13 2.36255e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 621 622 4.5029 0.136044 -0.20336 0.00518156 0.090073 0.0877443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 572 622 1.14895e-11 -3.05972 -0.0937068 0.0612327 2.15383e-13 2.35811e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 622 623 4.50824 0.136028 -0.203843 0.00518129 0.0901802 0.0876341 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 573 623 1.15072e-11 -3.05972 -0.0937068 0.0612327 2.15827e-13 2.35367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 623 624 4.51356 0.136011 -0.204325 0.005181 0.0902874 0.0875237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 574 624 1.15161e-11 -3.05972 -0.0937068 0.0612327 2.16271e-13 2.35367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 624 625 4.51888 0.135993 -0.204808 0.00518069 0.0903943 0.0874132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 575 625 1.15313e-11 -3.05972 -0.0937068 0.0612327 2.16271e-13 2.34923e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 625 626 4.5242 0.135974 -0.20529 0.00518035 0.0905012 0.0873025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 576 626 1.15428e-11 -3.05972 -0.0937068 0.0612327 2.16716e-13 2.34923e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 626 627 4.52951 0.135953 -0.205772 0.00517999 0.0906079 0.0871918 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 577 627 1.15552e-11 -3.05972 -0.0937068 0.0612327 2.1716e-13 2.34479e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 627 628 4.53481 0.135932 -0.206255 0.00517961 0.0907145 0.0870808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 578 628 1.15765e-11 -3.05972 -0.0937068 0.0612327 2.1716e-13 2.34035e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 628 629 4.5401 0.135909 -0.206737 0.0051792 0.0908209 0.0869698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 579 629 1.15836e-11 -3.05972 -0.0937068 0.0612327 2.17604e-13 2.34035e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 629 630 4.54539 0.135885 -0.207219 0.00517877 0.0909272 0.0868586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 580 630 1.15961e-11 -3.05972 -0.0937068 0.0612327 2.18048e-13 2.33591e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 630 631 4.55067 0.13586 -0.207702 0.00517831 0.0910334 0.0867473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 581 631 1.16174e-11 -3.05972 -0.0937068 0.0612327 2.18048e-13 2.33591e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 631 632 4.55594 0.135833 -0.208184 0.00517783 0.0911394 0.0866359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 582 632 1.16245e-11 -3.05972 -0.0937068 0.0612327 2.18492e-13 2.33147e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 632 633 4.5612 0.135806 -0.208666 0.00517733 0.0912453 0.0865243 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 583 633 1.1644e-11 -3.05972 -0.0937068 0.0612327 2.18492e-13 2.32703e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 633 634 4.56646 0.135777 -0.209148 0.0051768 0.0913511 0.0864126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 584 634 1.16529e-11 -3.05972 -0.0937068 0.0612327 2.18936e-13 2.32703e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 634 635 4.57172 0.135747 -0.20963 0.00517625 0.0914567 0.0863008 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 585 635 1.16653e-11 -3.05972 -0.0937068 0.0612327 2.1938e-13 2.32259e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 635 636 4.57696 0.135716 -0.210111 0.00517567 0.0915622 0.0861888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 586 636 1.16787e-11 -3.05972 -0.0937068 0.0612327 2.1938e-13 2.32259e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 636 637 4.5822 0.135684 -0.210593 0.00517507 0.0916676 0.0860767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 587 637 1.16929e-11 -3.05972 -0.0937068 0.0612327 2.19824e-13 2.31815e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 637 638 4.58743 0.13565 -0.211075 0.00517445 0.0917728 0.0859645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 588 638 1.17057e-11 -3.05972 -0.0937068 0.0612327 2.20268e-13 2.3137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 638 639 4.59266 0.135616 -0.211556 0.00517381 0.0918778 0.0858521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 589 639 1.17195e-11 -3.05972 -0.0937068 0.0612327 2.20268e-13 2.3137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 639 640 4.59787 0.13558 -0.212038 0.00517314 0.0919828 0.0857397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 590 640 1.17293e-11 -3.05972 -0.0937068 0.0612327 2.20712e-13 2.30926e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 640 641 4.60309 0.135543 -0.212519 0.00517244 0.0920876 0.085627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 591 641 1.17453e-11 -3.05972 -0.0937068 0.0612327 2.21156e-13 2.30926e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 641 642 4.60829 0.135505 -0.213001 0.00517173 0.0921923 0.0855143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 592 642 1.1763e-11 -3.05972 -0.0937068 0.0612327 2.21156e-13 2.30482e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 642 643 4.61349 0.135465 -0.213482 0.00517099 0.0922968 0.0854014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 593 643 1.17701e-11 -3.05972 -0.0937068 0.0612327 2.21601e-13 2.30038e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 643 644 4.61868 0.135425 -0.213963 0.00517022 0.0924012 0.0852884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 594 644 1.17879e-11 -3.05972 -0.0937068 0.0612327 2.22045e-13 2.30038e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 644 645 4.62386 0.135383 -0.214444 0.00516943 0.0925054 0.0851753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 595 645 1.18021e-11 -3.05972 -0.0937068 0.0612327 2.22045e-13 2.29594e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 645 646 4.62904 0.13534 -0.214925 0.00516862 0.0926095 0.085062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 596 646 1.18128e-11 -3.05972 -0.0937068 0.0612327 2.22489e-13 2.29594e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 646 647 4.63421 0.135296 -0.215406 0.00516779 0.0927135 0.0849486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 597 647 1.1827e-11 -3.05972 -0.0937068 0.0612327 2.22489e-13 2.2915e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 647 648 4.63937 0.135251 -0.215887 0.00516693 0.0928174 0.0848351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 598 648 1.18394e-11 -3.05972 -0.0937068 0.0612327 2.22933e-13 2.28706e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 648 649 4.64453 0.135204 -0.216367 0.00516604 0.0929211 0.0847214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 599 649 1.1851e-11 -3.05972 -0.0937068 0.0612327 2.23377e-13 2.28706e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 649 650 4.64967 0.135157 -0.216848 0.00516514 0.0930246 0.0846077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 600 650 1.18644e-11 -3.05972 -0.0937068 0.0612327 2.23377e-13 2.28262e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 650 651 4.65482 0.135108 -0.217328 0.00516421 0.093128 0.0844938 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 601 651 1.18785e-11 -3.05972 -0.0937068 0.0612327 2.23821e-13 2.27818e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 651 652 4.65995 0.135058 -0.217808 0.00516325 0.0932313 0.0843797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 602 652 1.18892e-11 -3.05972 -0.0937068 0.0612327 2.24265e-13 2.27818e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 652 653 4.66508 0.135007 -0.218288 0.00516228 0.0933345 0.0842656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 603 653 1.19034e-11 -3.05972 -0.0937068 0.0612327 2.24265e-13 2.27374e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 653 654 4.6702 0.134954 -0.218768 0.00516128 0.0934375 0.0841513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 604 654 1.19122e-11 -3.05972 -0.0937068 0.0612327 2.24709e-13 2.27374e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 654 655 4.67531 0.134901 -0.219248 0.00516025 0.0935403 0.0840368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 605 655 1.193e-11 -3.05972 -0.0937068 0.0612327 2.24709e-13 2.2693e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 655 656 4.68042 0.134846 -0.219728 0.0051592 0.0936431 0.0839223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 606 656 1.19407e-11 -3.05972 -0.0937068 0.0612327 2.25153e-13 2.26485e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 656 657 4.68552 0.13479 -0.220208 0.00515813 0.0937456 0.0838076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 607 657 1.19584e-11 -3.05972 -0.0937068 0.0612327 2.25597e-13 2.26485e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 657 658 4.69061 0.134733 -0.220687 0.00515704 0.0938481 0.0836928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 608 658 1.19673e-11 -3.05972 -0.0937068 0.0612327 2.25597e-13 2.26041e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 658 659 4.6957 0.134675 -0.221166 0.00515592 0.0939504 0.0835779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 609 659 1.19815e-11 -3.05972 -0.0937068 0.0612327 2.26041e-13 2.26041e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 659 660 4.70078 0.134616 -0.221646 0.00515477 0.0940526 0.0834628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 610 660 1.1994e-11 -3.05972 -0.0937068 0.0612327 2.26041e-13 2.25597e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 660 661 4.70585 0.134555 -0.222125 0.00515361 0.0941546 0.0833476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 611 661 1.20064e-11 -3.05972 -0.0937068 0.0612327 2.26485e-13 2.25153e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 661 662 4.71091 0.134494 -0.222603 0.00515242 0.0942565 0.0832323 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 612 662 1.20206e-11 -3.05972 -0.0937068 0.0612327 2.2693e-13 2.25153e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 662 663 4.71597 0.134431 -0.223082 0.0051512 0.0943582 0.0831169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 613 663 1.20335e-11 -3.05972 -0.0937068 0.0612327 2.2693e-13 2.24709e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 663 664 4.72102 0.134367 -0.223561 0.00514997 0.0944598 0.0830013 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 614 664 1.20464e-11 -3.05972 -0.0937068 0.0612327 2.27374e-13 2.24265e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 664 665 4.72606 0.134301 -0.224039 0.0051487 0.0945613 0.0828856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 615 665 1.20579e-11 -3.05972 -0.0937068 0.0612327 2.27818e-13 2.24265e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 665 666 4.7311 0.134235 -0.224517 0.00514742 0.0946626 0.0827698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 616 666 1.20721e-11 -3.05972 -0.0937068 0.0612327 2.27818e-13 2.23821e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 666 667 4.73613 0.134167 -0.224995 0.00514611 0.0947638 0.0826539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 617 667 1.20863e-11 -3.05972 -0.0937068 0.0612327 2.28262e-13 2.23821e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 667 668 4.74115 0.134099 -0.225473 0.00514478 0.0948648 0.0825378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 618 668 1.2097e-11 -3.05972 -0.0937068 0.0612327 2.28262e-13 2.23377e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 668 669 4.74617 0.134029 -0.225951 0.00514343 0.0949657 0.0824216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 619 669 1.21076e-11 -3.05972 -0.0937068 0.0612327 2.28706e-13 2.22933e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 669 670 4.75117 0.133958 -0.226429 0.00514205 0.0950665 0.0823053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 620 670 1.2129e-11 -3.05972 -0.0937068 0.0612327 2.2915e-13 2.22933e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 670 671 4.75617 0.133886 -0.226906 0.00514064 0.0951671 0.0821889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 621 671 1.21396e-11 -3.05972 -0.0937068 0.0612327 2.2915e-13 2.22489e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 671 672 4.76117 0.133812 -0.227383 0.00513922 0.0952675 0.0820723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 622 672 1.21538e-11 -3.05972 -0.0937068 0.0612327 2.29594e-13 2.22045e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 672 673 4.76615 0.133738 -0.22786 0.00513777 0.0953679 0.0819556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 623 673 1.21609e-11 -3.05972 -0.0937068 0.0612327 2.30038e-13 2.22045e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 673 674 4.77113 0.133662 -0.228337 0.0051363 0.095468 0.0818388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 624 674 1.2176e-11 -3.05972 -0.0937068 0.0612327 2.30038e-13 2.21601e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 674 675 4.77611 0.133585 -0.228814 0.0051348 0.0955681 0.0817219 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 625 675 1.21863e-11 -3.05972 -0.0937068 0.0612327 2.30482e-13 2.21156e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 675 676 4.78107 0.133507 -0.22929 0.00513328 0.095668 0.0816048 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 626 676 1.21991e-11 -3.05972 -0.0937068 0.0612327 2.30482e-13 2.21156e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 676 677 4.78603 0.133427 -0.229767 0.00513174 0.0957677 0.0814876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 627 677 1.22107e-11 -3.05972 -0.0937068 0.0612327 2.30926e-13 2.20712e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 677 678 4.79098 0.133347 -0.230243 0.00513017 0.0958674 0.0813703 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 628 678 1.22231e-11 -3.05972 -0.0937068 0.0612327 2.3137e-13 2.20712e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 678 679 4.79592 0.133265 -0.230719 0.00512858 0.0959668 0.0812528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 629 679 1.22373e-11 -3.05972 -0.0937068 0.0612327 2.3137e-13 2.20268e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 679 680 4.80086 0.133183 -0.231194 0.00512697 0.0960661 0.0811353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 630 680 1.22462e-11 -3.05972 -0.0937068 0.0612327 2.31815e-13 2.19824e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 680 681 4.80579 0.133099 -0.23167 0.00512533 0.0961653 0.0810176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 631 681 1.2264e-11 -3.05972 -0.0937068 0.0612327 2.31815e-13 2.19824e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 681 682 4.81071 0.133014 -0.232145 0.00512367 0.0962644 0.0808998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 632 682 1.22746e-11 -3.05972 -0.0937068 0.0612327 2.32259e-13 2.1938e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 682 683 4.81562 0.132927 -0.23262 0.00512199 0.0963633 0.0807819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 633 683 1.22853e-11 -3.05972 -0.0937068 0.0612327 2.32703e-13 2.1938e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 683 684 4.82053 0.13284 -0.233095 0.00512028 0.096462 0.0806638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 634 684 1.22977e-11 -3.05972 -0.0937068 0.0612327 2.32703e-13 2.18936e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 684 685 4.82543 0.132751 -0.23357 0.00511855 0.0965606 0.0805456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 635 685 1.23137e-11 -3.05972 -0.0937068 0.0612327 2.33147e-13 2.18492e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 685 686 4.83032 0.132662 -0.234044 0.00511679 0.0966591 0.0804273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 636 686 1.23253e-11 -3.05972 -0.0937068 0.0612327 2.33147e-13 2.18048e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 686 687 4.83521 0.132571 -0.234518 0.00511501 0.0967574 0.0803089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 637 687 1.23368e-11 -3.05972 -0.0937068 0.0612327 2.33591e-13 2.18048e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 687 688 4.84009 0.132479 -0.234992 0.00511321 0.0968556 0.0801904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 638 688 1.23492e-11 -3.05972 -0.0937068 0.0612327 2.34035e-13 2.17604e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 688 689 4.84496 0.132386 -0.235466 0.00511139 0.0969536 0.0800717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 639 689 1.23608e-11 -3.05972 -0.0937068 0.0612327 2.34035e-13 2.1716e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 689 690 4.84982 0.132291 -0.23594 0.00510954 0.0970515 0.0799529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 640 690 1.23777e-11 -3.05972 -0.0937068 0.0612327 2.34479e-13 2.1716e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 690 691 4.85468 0.132196 -0.236413 0.00510767 0.0971492 0.079834 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 641 691 1.23901e-11 -3.05972 -0.0937068 0.0612327 2.34479e-13 2.16716e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 691 692 4.85953 0.132099 -0.236886 0.00510578 0.0972468 0.079715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 642 692 1.23954e-11 -3.05972 -0.0937068 0.0612327 2.34923e-13 2.16716e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 692 693 4.86437 0.132001 -0.237359 0.00510386 0.0973443 0.0795958 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 643 693 1.24096e-11 -3.05972 -0.0937068 0.0612327 2.35367e-13 2.16271e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 693 694 4.86921 0.131902 -0.237831 0.00510192 0.0974416 0.0794765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 644 694 1.24238e-11 -3.05972 -0.0937068 0.0612327 2.35367e-13 2.15827e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 694 695 4.87403 0.131802 -0.238304 0.00509995 0.0975387 0.0793572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 645 695 1.24381e-11 -3.05972 -0.0937068 0.0612327 2.35811e-13 2.15827e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 695 696 4.87885 0.131701 -0.238776 0.00509796 0.0976357 0.0792376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 646 696 1.24505e-11 -3.05972 -0.0937068 0.0612327 2.35811e-13 2.15383e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 696 697 4.88367 0.131598 -0.239248 0.00509595 0.0977326 0.079118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 647 697 1.24611e-11 -3.05972 -0.0937068 0.0612327 2.36255e-13 2.14939e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 697 698 4.88847 0.131494 -0.239719 0.00509392 0.0978293 0.0789982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 648 698 1.247e-11 -3.05972 -0.0937068 0.0612327 2.367e-13 2.14939e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 698 699 4.89327 0.13139 -0.240191 0.00509186 0.0979259 0.0788784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 649 699 1.24833e-11 -3.05972 -0.0937068 0.0612327 2.367e-13 2.14495e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 699 700 4.89806 0.131284 -0.240662 0.00508978 0.0980223 0.0787584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 650 700 1.24968e-11 -3.05972 -0.0937068 0.0612327 2.37144e-13 2.14051e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 700 701 4.90284 0.131177 -0.241132 0.00508768 0.0981186 0.0786383 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 651 701 1.25091e-11 -3.05972 -0.0937068 0.0612327 2.37144e-13 2.14051e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 701 702 4.90762 0.131068 -0.241603 0.00508555 0.0982147 0.078518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 652 702 1.25233e-11 -3.05972 -0.0937068 0.0612327 2.37588e-13 2.13607e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 702 703 4.91239 0.130959 -0.242073 0.0050834 0.0983107 0.0783977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 653 703 1.25358e-11 -3.05972 -0.0937068 0.0612327 2.38032e-13 2.13163e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 703 704 4.91715 0.130848 -0.242543 0.00508122 0.0984065 0.0782772 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 654 704 1.255e-11 -3.05972 -0.0937068 0.0612327 2.38032e-13 2.13163e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 704 705 4.9219 0.130737 -0.243013 0.00507903 0.0985022 0.0781566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 655 705 1.25588e-11 -3.05972 -0.0937068 0.0612327 2.38476e-13 2.12719e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 705 706 4.92665 0.130624 -0.243482 0.00507681 0.0985978 0.0780359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 656 706 1.25659e-11 -3.05972 -0.0937068 0.0612327 2.3892e-13 2.12275e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 706 707 4.93139 0.13051 -0.243952 0.00507456 0.0986932 0.0779151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 657 707 1.25766e-11 -3.05972 -0.0937068 0.0612327 2.3892e-13 2.12275e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 707 708 4.93612 0.130395 -0.244421 0.0050723 0.0987884 0.0777941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 658 708 1.25944e-11 -3.05972 -0.0937068 0.0612327 2.39364e-13 2.11831e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 708 709 4.94085 0.130278 -0.244889 0.00507001 0.0988835 0.077673 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 659 709 1.26033e-11 -3.05972 -0.0937068 0.0612327 2.39364e-13 2.11386e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 709 710 4.94556 0.130161 -0.245357 0.00506769 0.0989785 0.0775519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 660 710 1.26192e-11 -3.05972 -0.0937068 0.0612327 2.39808e-13 2.11386e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 710 711 4.95027 0.130042 -0.245826 0.00506536 0.0990733 0.0774305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 661 711 1.26326e-11 -3.05972 -0.0937068 0.0612327 2.39808e-13 2.10942e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 711 712 4.95498 0.129923 -0.246293 0.005063 0.0991679 0.0773091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 662 712 1.26423e-11 -3.05972 -0.0937068 0.0612327 2.40252e-13 2.10498e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 712 713 4.95967 0.129802 -0.246761 0.00506062 0.0992624 0.0771876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 663 713 1.26539e-11 -3.05972 -0.0937068 0.0612327 2.40252e-13 2.10498e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 713 714 4.96436 0.12968 -0.247228 0.00505821 0.0993568 0.0770659 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 664 714 1.26645e-11 -3.05972 -0.0937068 0.0612327 2.40696e-13 2.10054e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 714 715 4.96904 0.129556 -0.247695 0.00505578 0.099451 0.0769441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 665 715 1.26779e-11 -3.05972 -0.0937068 0.0612327 2.4114e-13 2.0961e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 715 716 4.97371 0.129432 -0.248161 0.00505333 0.0995451 0.0768223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 666 716 1.26921e-11 -3.05972 -0.0937068 0.0612327 2.4114e-13 2.0961e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 716 717 4.97838 0.129307 -0.248628 0.00505086 0.099639 0.0767002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 667 717 1.26974e-11 -3.05972 -0.0937068 0.0612327 2.41585e-13 2.09166e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 717 718 4.98303 0.12918 -0.249094 0.00504836 0.0997328 0.0765781 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 668 718 1.27116e-11 -3.05972 -0.0937068 0.0612327 2.42029e-13 2.09166e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 718 719 4.98768 0.129052 -0.249559 0.00504584 0.0998264 0.0764559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 669 719 1.27258e-11 -3.05972 -0.0937068 0.0612327 2.42029e-13 2.08722e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 719 720 4.99233 0.128923 -0.250024 0.0050433 0.0999198 0.0763335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 670 720 1.27329e-11 -3.05972 -0.0937068 0.0612327 2.42473e-13 2.08278e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 720 721 4.99696 0.128793 -0.250489 0.00504073 0.100013 0.076211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 671 721 1.27436e-11 -3.05972 -0.0937068 0.0612327 2.42473e-13 2.07834e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 721 722 5.00159 0.128662 -0.250954 0.00503814 0.100106 0.0760884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 672 722 1.27578e-11 -3.05972 -0.0937068 0.0612327 2.42917e-13 2.07834e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 722 723 5.00621 0.12853 -0.251418 0.00503553 0.100199 0.0759657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 673 723 1.27702e-11 -3.05972 -0.0937068 0.0612327 2.42917e-13 2.0739e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 723 724 5.01082 0.128397 -0.251883 0.00503289 0.100292 0.0758429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 674 724 1.27844e-11 -3.05972 -0.0937068 0.0612327 2.43361e-13 2.06946e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 724 725 5.01543 0.128262 -0.252346 0.00503023 0.100385 0.07572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 675 725 1.27956e-11 -3.05972 -0.0937068 0.0612327 2.43361e-13 2.06946e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 725 726 5.02002 0.128126 -0.25281 0.00502755 0.100477 0.0755969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 676 726 1.28075e-11 -3.05972 -0.0937068 0.0612327 2.43805e-13 2.06501e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 726 727 5.02461 0.127989 -0.253273 0.00502485 0.10057 0.0754737 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 677 727 1.28182e-11 -3.05972 -0.0937068 0.0612327 2.43805e-13 2.06057e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 727 728 5.0292 0.127851 -0.253735 0.00502212 0.100662 0.0753505 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 678 728 1.28342e-11 -3.05972 -0.0937068 0.0612327 2.44249e-13 2.06057e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 728 729 5.03377 0.127712 -0.254198 0.00501937 0.100754 0.0752271 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 679 729 1.28466e-11 -3.05972 -0.0937068 0.0612327 2.44249e-13 2.05613e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 729 730 5.03834 0.127572 -0.25466 0.0050166 0.100846 0.0751035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 680 730 1.28502e-11 -3.05972 -0.0937068 0.0612327 2.44693e-13 2.05169e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 730 731 5.0429 0.127431 -0.255121 0.0050138 0.100938 0.0749799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 681 731 1.28608e-11 -3.05972 -0.0937068 0.0612327 2.45137e-13 2.05169e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 731 732 5.04745 0.127288 -0.255583 0.00501099 0.10103 0.0748562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 682 732 1.28786e-11 -3.05972 -0.0937068 0.0612327 2.45137e-13 2.04725e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 732 733 5.05199 0.127145 -0.256044 0.00500815 0.101121 0.0747323 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 683 733 1.28892e-11 -3.05972 -0.0937068 0.0612327 2.45581e-13 2.04281e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 733 734 5.05653 0.127 -0.256504 0.00500528 0.101213 0.0746083 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 684 734 1.28999e-11 -3.05972 -0.0937068 0.0612327 2.45581e-13 2.04281e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 734 735 5.06106 0.126854 -0.256965 0.0050024 0.101304 0.0744842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 685 735 1.29141e-11 -3.05972 -0.0937068 0.0612327 2.46025e-13 2.03837e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 735 736 5.06558 0.126707 -0.257425 0.00499949 0.101395 0.07436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 686 736 1.29221e-11 -3.05972 -0.0937068 0.0612327 2.4647e-13 2.03393e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 736 737 5.0701 0.126559 -0.257884 0.00499655 0.101486 0.0742357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 687 737 1.2935e-11 -3.05972 -0.0937068 0.0612327 2.4647e-13 2.03393e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 737 738 5.0746 0.126409 -0.258343 0.0049936 0.101577 0.0741113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 688 738 1.29461e-11 -3.05972 -0.0937068 0.0612327 2.46914e-13 2.02949e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 738 739 5.0791 0.126259 -0.258802 0.00499062 0.101667 0.0739868 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 689 739 1.29576e-11 -3.05972 -0.0937068 0.0612327 2.46914e-13 2.02505e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 739 740 5.08359 0.126108 -0.259261 0.00498762 0.101758 0.0738621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 690 740 1.29674e-11 -3.05972 -0.0937068 0.0612327 2.47358e-13 2.02505e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 740 741 5.08808 0.125955 -0.259719 0.0049846 0.101848 0.0737374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 691 741 1.29781e-11 -3.05972 -0.0937068 0.0612327 2.47358e-13 2.02061e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 741 742 5.09255 0.125801 -0.260176 0.00498155 0.101938 0.0736125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 692 742 1.29887e-11 -3.05972 -0.0937068 0.0612327 2.47802e-13 2.01617e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 742 743 5.09702 0.125646 -0.260634 0.00497849 0.102028 0.0734875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 693 743 1.301e-11 -3.05972 -0.0937068 0.0612327 2.48246e-13 2.01172e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 743 744 5.10148 0.12549 -0.261091 0.0049754 0.102118 0.0733624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 694 744 1.30136e-11 -3.05972 -0.0937068 0.0612327 2.48246e-13 2.01172e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 744 745 5.10594 0.125333 -0.261547 0.00497228 0.102208 0.0732372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 695 745 1.30242e-11 -3.05972 -0.0937068 0.0612327 2.4869e-13 2.00728e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 745 746 5.11038 0.125175 -0.262003 0.00496915 0.102297 0.0731118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 696 746 1.30349e-11 -3.05972 -0.0937068 0.0612327 2.4869e-13 2.00728e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 746 747 5.11482 0.125016 -0.262459 0.00496599 0.102386 0.0729864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 697 747 1.30527e-11 -3.05972 -0.0937068 0.0612327 2.49134e-13 2.00284e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 747 748 5.11925 0.124855 -0.262914 0.00496281 0.102476 0.0728609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 698 748 1.30616e-11 -3.05972 -0.0937068 0.0612327 2.49134e-13 1.9984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 748 749 5.12367 0.124693 -0.263369 0.0049596 0.102565 0.0727352 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 699 749 1.30722e-11 -3.05972 -0.0937068 0.0612327 2.49578e-13 1.99396e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 749 750 5.12809 0.124531 -0.263824 0.00495638 0.102654 0.0726094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 700 750 1.30824e-11 -3.05972 -0.0937068 0.0612327 2.49578e-13 1.99396e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 750 751 5.1325 0.124367 -0.264278 0.00495313 0.102742 0.0724835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 701 751 1.30926e-11 -3.05972 -0.0937068 0.0612327 2.50022e-13 1.98952e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 751 752 5.1369 0.124202 -0.264732 0.00494986 0.102831 0.0723576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 702 752 1.31024e-11 -3.05972 -0.0937068 0.0612327 2.50022e-13 1.98508e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 752 753 5.14129 0.124036 -0.265185 0.00494657 0.10292 0.0722314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 703 753 1.31166e-11 -3.05972 -0.0937068 0.0612327 2.50466e-13 1.98508e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 753 754 5.14567 0.123869 -0.265638 0.00494325 0.103008 0.0721052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 704 754 1.31308e-11 -3.05972 -0.0937068 0.0612327 2.50466e-13 1.98064e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 754 755 5.15005 0.123701 -0.266091 0.00493991 0.103096 0.0719789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 705 755 1.31415e-11 -3.05972 -0.0937068 0.0612327 2.5091e-13 1.9762e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 755 756 5.15442 0.123531 -0.266543 0.00493655 0.103184 0.0718525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 706 756 1.31521e-11 -3.05972 -0.0937068 0.0612327 2.51354e-13 1.9762e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 756 757 5.15878 0.123361 -0.266995 0.00493317 0.103272 0.0717259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 707 757 1.31628e-11 -3.05972 -0.0937068 0.0612327 2.51354e-13 1.97176e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 757 758 5.16313 0.123189 -0.267446 0.00492976 0.103359 0.0715993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 708 758 1.31699e-11 -3.05972 -0.0937068 0.0612327 2.51799e-13 1.96732e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 758 759 5.16748 0.123016 -0.267897 0.00492634 0.103447 0.0714725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 709 759 1.31841e-11 -3.05972 -0.0937068 0.0612327 2.51799e-13 1.96732e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 759 760 5.17181 0.122843 -0.268348 0.00492289 0.103534 0.0713457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 710 760 1.31912e-11 -3.05972 -0.0937068 0.0612327 2.52243e-13 1.96287e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 760 761 5.17614 0.122668 -0.268798 0.00491941 0.103622 0.0712187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 711 761 1.32045e-11 -3.05972 -0.0937068 0.0612327 2.52243e-13 1.95843e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 761 762 5.18047 0.122492 -0.269247 0.00491592 0.103709 0.0710916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 712 762 1.32161e-11 -3.05972 -0.0937068 0.0612327 2.52687e-13 1.95399e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 762 763 5.18478 0.122315 -0.269696 0.0049124 0.103796 0.0709644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 713 763 1.32268e-11 -3.05972 -0.0937068 0.0612327 2.52687e-13 1.95399e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 763 764 5.18909 0.122137 -0.270145 0.00490886 0.103882 0.0708371 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 714 764 1.32392e-11 -3.05972 -0.0937068 0.0612327 2.53131e-13 1.94955e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 764 765 5.19339 0.121957 -0.270594 0.0049053 0.103969 0.0707097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 715 765 1.32481e-11 -3.05972 -0.0937068 0.0612327 2.53575e-13 1.94511e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 765 766 5.19768 0.121777 -0.271041 0.00490172 0.104055 0.0705821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 716 766 1.32623e-11 -3.05972 -0.0937068 0.0612327 2.53575e-13 1.94511e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 766 767 5.20196 0.121595 -0.271489 0.00489812 0.104142 0.0704545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 717 767 1.32729e-11 -3.05972 -0.0937068 0.0612327 2.54019e-13 1.94067e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 767 768 5.20624 0.121413 -0.271936 0.00489449 0.104228 0.0703268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 718 768 1.328e-11 -3.05972 -0.0937068 0.0612327 2.54019e-13 1.93623e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 768 769 5.2105 0.121229 -0.272382 0.00489084 0.104314 0.0701989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 719 769 1.32907e-11 -3.05972 -0.0937068 0.0612327 2.54019e-13 1.93623e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 769 770 5.21476 0.121044 -0.272828 0.00488717 0.1044 0.070071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 720 770 1.33014e-11 -3.05972 -0.0937068 0.0612327 2.54463e-13 1.93179e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 770 771 5.21902 0.120859 -0.273274 0.00488347 0.104485 0.0699429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 721 771 1.33085e-11 -3.05972 -0.0937068 0.0612327 2.54907e-13 1.92735e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 771 772 5.22326 0.120672 -0.273719 0.00487976 0.104571 0.0698148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 722 772 1.33245e-11 -3.05972 -0.0937068 0.0612327 2.54907e-13 1.92291e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 772 773 5.2275 0.120484 -0.274164 0.00487602 0.104656 0.0696865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 723 773 1.33369e-11 -3.05972 -0.0937068 0.0612327 2.55351e-13 1.92291e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 773 774 5.23173 0.120294 -0.274608 0.00487226 0.104741 0.0695581 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 724 774 1.33467e-11 -3.05972 -0.0937068 0.0612327 2.55351e-13 1.91847e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 774 775 5.23595 0.120104 -0.275052 0.00486848 0.104826 0.0694296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 725 775 1.33569e-11 -3.05972 -0.0937068 0.0612327 2.55795e-13 1.91402e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 775 776 5.24016 0.119913 -0.275495 0.00486467 0.104911 0.069301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 726 776 1.3368e-11 -3.05972 -0.0937068 0.0612327 2.55795e-13 1.91402e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 776 777 5.24436 0.11972 -0.275938 0.00486085 0.104996 0.0691723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 727 777 1.33813e-11 -3.05972 -0.0937068 0.0612327 2.56239e-13 1.90958e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 777 778 5.24856 0.119527 -0.276381 0.004857 0.105081 0.0690435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 728 778 1.33866e-11 -3.05972 -0.0937068 0.0612327 2.56684e-13 1.90514e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 778 779 5.25275 0.119332 -0.276823 0.00485313 0.105165 0.0689146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 729 779 1.33973e-11 -3.05972 -0.0937068 0.0612327 2.56684e-13 1.9007e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 779 780 5.25693 0.119137 -0.277264 0.00484924 0.105249 0.0687856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 730 780 1.3415e-11 -3.05972 -0.0937068 0.0612327 2.56684e-13 1.9007e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 780 781 5.2611 0.11894 -0.277705 0.00484533 0.105333 0.0686565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 731 781 1.34222e-11 -3.05972 -0.0937068 0.0612327 2.57128e-13 1.89626e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 781 782 5.26527 0.118742 -0.278145 0.00484139 0.105417 0.0685273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 732 782 1.34293e-11 -3.05972 -0.0937068 0.0612327 2.57572e-13 1.89182e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 782 783 5.26943 0.118543 -0.278585 0.00483744 0.105501 0.0683979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 733 783 1.34364e-11 -3.05972 -0.0937068 0.0612327 2.57572e-13 1.89182e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 783 784 5.27358 0.118344 -0.279025 0.00483346 0.105585 0.0682685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 734 784 1.34524e-11 -3.05972 -0.0937068 0.0612327 2.57572e-13 1.88738e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 784 785 5.27772 0.118142 -0.279464 0.00482946 0.105668 0.068139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 735 785 1.34595e-11 -3.05972 -0.0937068 0.0612327 2.58016e-13 1.88294e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 785 786 5.28185 0.11794 -0.279902 0.00482543 0.105751 0.0680093 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 736 786 1.34737e-11 -3.05972 -0.0937068 0.0612327 2.5846e-13 1.88294e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 786 787 5.28598 0.117737 -0.28034 0.00482139 0.105835 0.0678796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 737 787 1.34839e-11 -3.05972 -0.0937068 0.0612327 2.5846e-13 1.8785e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 787 788 5.2901 0.117533 -0.280778 0.00481733 0.105918 0.0677497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 738 788 1.3495e-11 -3.05972 -0.0937068 0.0612327 2.58904e-13 1.87406e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 788 789 5.29421 0.117328 -0.281215 0.00481324 0.106 0.0676198 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 739 789 1.35048e-11 -3.05972 -0.0937068 0.0612327 2.58904e-13 1.86962e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 789 790 5.29831 0.117121 -0.281651 0.00480913 0.106083 0.0674897 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 740 790 1.35145e-11 -3.05972 -0.0937068 0.0612327 2.59348e-13 1.86962e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 790 791 5.3024 0.116914 -0.282087 0.004805 0.106166 0.0673596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 741 791 1.35252e-11 -3.05972 -0.0937068 0.0612327 2.59348e-13 1.86517e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 791 792 5.30649 0.116705 -0.282523 0.00480085 0.106248 0.0672293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 742 792 1.35394e-11 -3.05972 -0.0937068 0.0612327 2.59792e-13 1.86073e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 792 793 5.31057 0.116496 -0.282958 0.00479667 0.10633 0.0670989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 743 793 1.35465e-11 -3.05972 -0.0937068 0.0612327 2.59792e-13 1.85629e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 793 794 5.31464 0.116285 -0.283392 0.00479248 0.106412 0.0669685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 744 794 1.35572e-11 -3.05972 -0.0937068 0.0612327 2.60236e-13 1.85629e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 794 795 5.3187 0.116073 -0.283826 0.00478826 0.106494 0.0668379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 745 795 1.35678e-11 -3.05972 -0.0937068 0.0612327 2.60236e-13 1.85185e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 795 796 5.32276 0.115861 -0.28426 0.00478402 0.106576 0.0667072 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 746 796 1.3582e-11 -3.05972 -0.0937068 0.0612327 2.6068e-13 1.84741e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 796 797 5.3268 0.115647 -0.284693 0.00477976 0.106657 0.0665765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 747 797 1.35856e-11 -3.05972 -0.0937068 0.0612327 2.6068e-13 1.84741e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 797 798 5.33084 0.115432 -0.285125 0.00477548 0.106739 0.0664456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 748 798 1.3598e-11 -3.05972 -0.0937068 0.0612327 2.61124e-13 1.84297e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 798 799 5.33487 0.115216 -0.285557 0.00477118 0.10682 0.0663146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 749 799 1.36096e-11 -3.05972 -0.0937068 0.0612327 2.61124e-13 1.83853e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 799 800 5.3389 0.114999 -0.285988 0.00476686 0.106901 0.0661835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 750 800 1.3619e-11 -3.05972 -0.0937068 0.0612327 2.61569e-13 1.83853e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 800 801 5.34291 0.114781 -0.286419 0.00476251 0.106982 0.0660523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 751 801 1.36309e-11 -3.05972 -0.0937068 0.0612327 2.61569e-13 1.83409e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 801 802 5.34692 0.114562 -0.286849 0.00475815 0.107063 0.0659211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 752 802 1.36389e-11 -3.05972 -0.0937068 0.0612327 2.62013e-13 1.82965e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 802 803 5.35091 0.114341 -0.287279 0.00475376 0.107143 0.0657897 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 753 803 1.36495e-11 -3.05972 -0.0937068 0.0612327 2.62013e-13 1.82521e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 803 804 5.3549 0.11412 -0.287708 0.00474935 0.107224 0.0656582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 754 804 1.36531e-11 -3.05972 -0.0937068 0.0612327 2.62457e-13 1.82521e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 804 805 5.35889 0.113898 -0.288137 0.00474492 0.107304 0.0655266 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 755 805 1.36673e-11 -3.05972 -0.0937068 0.0612327 2.62457e-13 1.82077e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 805 806 5.36286 0.113675 -0.288565 0.00474047 0.107384 0.0653949 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 756 806 1.36779e-11 -3.05972 -0.0937068 0.0612327 2.62901e-13 1.81632e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 806 807 5.36683 0.11345 -0.288992 0.00473599 0.107464 0.0652631 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 757 807 1.36957e-11 -3.05972 -0.0937068 0.0612327 2.62901e-13 1.81188e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 807 808 5.37079 0.113225 -0.289419 0.0047315 0.107544 0.0651313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 758 808 1.36957e-11 -3.05972 -0.0937068 0.0612327 2.63345e-13 1.81188e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 808 809 5.37474 0.112998 -0.289846 0.00472698 0.107623 0.0649993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 759 809 1.37081e-11 -3.05972 -0.0937068 0.0612327 2.63345e-13 1.80744e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 809 810 5.37868 0.112771 -0.290272 0.00472245 0.107703 0.0648672 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 760 810 1.37206e-11 -3.05972 -0.0937068 0.0612327 2.63789e-13 1.803e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 810 811 5.38261 0.112542 -0.290697 0.00471789 0.107782 0.064735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 761 811 1.37277e-11 -3.05972 -0.0937068 0.0612327 2.63789e-13 1.803e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 811 812 5.38654 0.112313 -0.291122 0.00471331 0.107861 0.0646027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 762 812 1.37401e-11 -3.05972 -0.0937068 0.0612327 2.64233e-13 1.79856e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 812 813 5.39046 0.112082 -0.291546 0.00470871 0.10794 0.0644704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 763 813 1.37503e-11 -3.05972 -0.0937068 0.0612327 2.64233e-13 1.79412e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 813 814 5.39437 0.11185 -0.291969 0.00470409 0.108019 0.0643379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 764 814 1.37605e-11 -3.05972 -0.0937068 0.0612327 2.64677e-13 1.78968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 814 815 5.39827 0.111618 -0.292393 0.00469945 0.108098 0.0642053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 765 815 1.37721e-11 -3.05972 -0.0937068 0.0612327 2.64677e-13 1.78968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 815 816 5.40216 0.111384 -0.292815 0.00469479 0.108176 0.0640726 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 766 816 1.37828e-11 -3.05972 -0.0937068 0.0612327 2.65121e-13 1.78524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 816 817 5.40605 0.111149 -0.293237 0.00469011 0.108255 0.0639398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 767 817 1.37881e-11 -3.05972 -0.0937068 0.0612327 2.65121e-13 1.7808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 817 818 5.40993 0.110913 -0.293658 0.0046854 0.108333 0.063807 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 768 818 1.37987e-11 -3.05972 -0.0937068 0.0612327 2.65565e-13 1.77636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 818 819 5.41379 0.110676 -0.294079 0.00468068 0.108411 0.063674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 769 819 1.38094e-11 -3.05972 -0.0937068 0.0612327 2.65565e-13 1.77636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 819 820 5.41766 0.110439 -0.294499 0.00467593 0.108489 0.0635409 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 770 820 1.38165e-11 -3.05972 -0.0937068 0.0612327 2.66009e-13 1.77192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 820 821 5.42151 0.1102 -0.294919 0.00467116 0.108566 0.0634078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 771 821 1.38307e-11 -3.05972 -0.0937068 0.0612327 2.66009e-13 1.76748e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 821 822 5.42535 0.10996 -0.295338 0.00466638 0.108644 0.0632745 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 772 822 1.38414e-11 -3.05972 -0.0937068 0.0612327 2.66454e-13 1.76748e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 822 823 5.42919 0.109719 -0.295756 0.00466157 0.108721 0.0631412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 773 823 1.38485e-11 -3.05972 -0.0937068 0.0612327 2.66454e-13 1.76303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 823 824 5.43302 0.109477 -0.296174 0.00465674 0.108798 0.0630077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 774 824 1.38574e-11 -3.05972 -0.0937068 0.0612327 2.66898e-13 1.75859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 824 825 5.43684 0.109234 -0.296591 0.00465189 0.108875 0.0628741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 775 825 1.38682e-11 -3.05972 -0.0937068 0.0612327 2.66898e-13 1.75415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 825 826 5.44065 0.10899 -0.297008 0.00464702 0.108952 0.0627405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 776 826 1.38778e-11 -3.05972 -0.0937068 0.0612327 2.67342e-13 1.75415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 826 827 5.44446 0.108745 -0.297424 0.00464213 0.109029 0.0626068 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 777 827 1.38858e-11 -3.05972 -0.0937068 0.0612327 2.67342e-13 1.74971e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 827 828 5.44825 0.108499 -0.297839 0.00463721 0.109105 0.0624729 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 778 828 1.38982e-11 -3.05972 -0.0937068 0.0612327 2.67342e-13 1.74527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 828 829 5.45204 0.108252 -0.298254 0.00463228 0.109182 0.062339 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 779 829 1.39018e-11 -3.05972 -0.0937068 0.0612327 2.67786e-13 1.74083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 829 830 5.45582 0.108004 -0.298668 0.00462733 0.109258 0.062205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 780 830 1.3916e-11 -3.05972 -0.0937068 0.0612327 2.6823e-13 1.74083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 830 831 5.45959 0.107754 -0.299082 0.00462236 0.109334 0.0620708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 781 831 1.39266e-11 -3.05972 -0.0937068 0.0612327 2.6823e-13 1.73639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 831 832 5.46336 0.107504 -0.299495 0.00461736 0.10941 0.0619366 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 782 832 1.39408e-11 -3.05972 -0.0937068 0.0612327 2.68674e-13 1.73195e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 832 833 5.46711 0.107253 -0.299907 0.00461235 0.109486 0.0618023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 783 833 1.3948e-11 -3.05972 -0.0937068 0.0612327 2.68674e-13 1.73195e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 833 834 5.47086 0.107001 -0.300319 0.00460731 0.109561 0.0616679 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 784 834 1.39551e-11 -3.05972 -0.0937068 0.0612327 2.69118e-13 1.72751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 834 835 5.4746 0.106748 -0.30073 0.00460226 0.109637 0.0615334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 785 835 1.39639e-11 -3.05972 -0.0937068 0.0612327 2.69118e-13 1.72307e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 835 836 5.47833 0.106494 -0.301141 0.00459718 0.109712 0.0613988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 786 836 1.39737e-11 -3.05972 -0.0937068 0.0612327 2.69118e-13 1.71863e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 836 837 5.48205 0.106239 -0.301551 0.00459208 0.109787 0.0612641 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 787 837 1.3983e-11 -3.05972 -0.0937068 0.0612327 2.69562e-13 1.71418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 837 838 5.48576 0.105982 -0.30196 0.00458697 0.109862 0.0611293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 788 838 1.39928e-11 -3.05972 -0.0937068 0.0612327 2.69562e-13 1.71418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 838 839 5.48947 0.105725 -0.302369 0.00458183 0.109937 0.0609944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 789 839 1.40021e-11 -3.05972 -0.0937068 0.0612327 2.70006e-13 1.70974e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 839 840 5.49317 0.105467 -0.302777 0.00457667 0.110011 0.0608594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 790 840 1.40137e-11 -3.05972 -0.0937068 0.0612327 2.70006e-13 1.7053e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 840 841 5.49686 0.105208 -0.303184 0.0045715 0.110086 0.0607244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 791 841 1.40226e-11 -3.05972 -0.0937068 0.0612327 2.7045e-13 1.70086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 841 842 5.50054 0.104948 -0.303591 0.0045663 0.11016 0.0605892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 792 842 1.40297e-11 -3.05972 -0.0937068 0.0612327 2.7045e-13 1.70086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 842 843 5.50421 0.104687 -0.303997 0.00456108 0.110234 0.060454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 793 843 1.40439e-11 -3.05972 -0.0937068 0.0612327 2.70894e-13 1.69642e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 843 844 5.50788 0.104424 -0.304403 0.00455584 0.110308 0.0603186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 794 844 1.40474e-11 -3.05972 -0.0937068 0.0612327 2.70894e-13 1.69198e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 844 845 5.51153 0.104161 -0.304807 0.00455059 0.110382 0.0601832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 795 845 1.40581e-11 -3.05972 -0.0937068 0.0612327 2.71339e-13 1.69198e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 845 846 5.51518 0.103897 -0.305212 0.00454531 0.110455 0.0600476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 796 846 1.40652e-11 -3.05972 -0.0937068 0.0612327 2.71339e-13 1.68754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 846 847 5.51882 0.103632 -0.305615 0.00454001 0.110529 0.059912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 797 847 1.40741e-11 -3.05972 -0.0937068 0.0612327 2.71783e-13 1.6831e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 847 848 5.52245 0.103366 -0.306018 0.00453469 0.110602 0.0597763 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 798 848 1.40883e-11 -3.05972 -0.0937068 0.0612327 2.71783e-13 1.67866e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 848 849 5.52607 0.103099 -0.30642 0.00452935 0.110675 0.0596405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 799 849 1.40954e-11 -3.05972 -0.0937068 0.0612327 2.71783e-13 1.67422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 849 850 5.52969 0.102831 -0.306822 0.004524 0.110748 0.0595046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 800 850 1.41045e-11 -3.05972 -0.0937068 0.0612327 2.72227e-13 1.67422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 850 851 5.5333 0.102562 -0.307223 0.00451862 0.11082 0.0593686 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 801 851 1.41132e-11 -3.05972 -0.0937068 0.0612327 2.72227e-13 1.66978e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 851 852 5.53689 0.102292 -0.307623 0.00451322 0.110893 0.0592325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 802 852 1.4122e-11 -3.05972 -0.0937068 0.0612327 2.72671e-13 1.66533e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 852 853 5.54048 0.102021 -0.308023 0.0045078 0.110965 0.0590964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 803 853 1.41345e-11 -3.05972 -0.0937068 0.0612327 2.72671e-13 1.66089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 853 854 5.54407 0.101749 -0.308422 0.00450237 0.111038 0.0589601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 804 854 1.41362e-11 -3.05972 -0.0937068 0.0612327 2.73115e-13 1.66089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 854 855 5.54764 0.101476 -0.30882 0.00449691 0.11111 0.0588237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 805 855 1.4154e-11 -3.05972 -0.0937068 0.0612327 2.73115e-13 1.65645e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 855 856 5.55121 0.101202 -0.309217 0.00449143 0.111182 0.0586873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 806 856 1.41611e-11 -3.05972 -0.0937068 0.0612327 2.73559e-13 1.65201e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 856 857 5.55476 0.100927 -0.309614 0.00448593 0.111253 0.0585508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 807 857 1.41682e-11 -3.05972 -0.0937068 0.0612327 2.73559e-13 1.65201e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 857 858 5.55831 0.100651 -0.310011 0.00448042 0.111325 0.0584141 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 808 858 1.41789e-11 -3.05972 -0.0937068 0.0612327 2.74003e-13 1.64757e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 858 859 5.56185 0.100374 -0.310406 0.00447488 0.111396 0.0582774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 809 859 1.41895e-11 -3.05972 -0.0937068 0.0612327 2.74003e-13 1.64313e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 859 860 5.56538 0.100096 -0.310801 0.00446933 0.111468 0.0581406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 810 860 1.41966e-11 -3.05972 -0.0937068 0.0612327 2.74447e-13 1.63869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 860 861 5.56891 0.0998174 -0.311195 0.00446375 0.111539 0.0580037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 811 861 1.42064e-11 -3.05972 -0.0937068 0.0612327 2.74447e-13 1.63425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 861 862 5.57242 0.0995376 -0.311589 0.00445816 0.11161 0.0578668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 812 862 1.42131e-11 -3.05972 -0.0937068 0.0612327 2.74447e-13 1.63425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 862 863 5.57593 0.0992569 -0.311982 0.00445254 0.11168 0.0577297 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 813 863 1.4222e-11 -3.05972 -0.0937068 0.0612327 2.74891e-13 1.62981e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 863 864 5.57943 0.0989752 -0.312374 0.00444691 0.111751 0.0575925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 814 864 1.42304e-11 -3.05972 -0.0937068 0.0612327 2.74891e-13 1.62537e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 864 865 5.58292 0.0986925 -0.312765 0.00444125 0.111821 0.0574553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 815 865 1.42393e-11 -3.05972 -0.0937068 0.0612327 2.75335e-13 1.62093e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 865 866 5.5864 0.0984089 -0.313156 0.00443558 0.111892 0.057318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 816 866 1.42464e-11 -3.05972 -0.0937068 0.0612327 2.75335e-13 1.62093e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 866 867 5.58987 0.0981244 -0.313546 0.00442989 0.111962 0.0571805 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 817 867 1.4257e-11 -3.05972 -0.0937068 0.0612327 2.75779e-13 1.61648e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 867 868 5.59334 0.0978388 -0.313935 0.00442418 0.112032 0.057043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 818 868 1.42677e-11 -3.05972 -0.0937068 0.0612327 2.75779e-13 1.61204e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 868 869 5.59679 0.0975524 -0.314324 0.00441845 0.112101 0.0569054 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 819 869 1.42784e-11 -3.05972 -0.0937068 0.0612327 2.76223e-13 1.6076e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 869 870 5.60024 0.0972649 -0.314712 0.0044127 0.112171 0.0567677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 820 870 1.42855e-11 -3.05972 -0.0937068 0.0612327 2.76223e-13 1.6076e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 870 871 5.60368 0.0969766 -0.315099 0.00440693 0.11224 0.05663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 821 871 1.42926e-11 -3.05972 -0.0937068 0.0612327 2.76223e-13 1.60316e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 871 872 5.60711 0.0966873 -0.315486 0.00440114 0.11231 0.0564921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 822 872 1.42979e-11 -3.05972 -0.0937068 0.0612327 2.76668e-13 1.59872e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 872 873 5.61054 0.096397 -0.315872 0.00439533 0.112379 0.0563542 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 823 873 1.43068e-11 -3.05972 -0.0937068 0.0612327 2.76668e-13 1.59428e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 873 874 5.61395 0.0961058 -0.316257 0.0043895 0.112448 0.0562161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 824 874 1.43192e-11 -3.05972 -0.0937068 0.0612327 2.77112e-13 1.59428e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 874 875 5.61736 0.0958136 -0.316641 0.00438366 0.112516 0.056078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 825 875 1.43275e-11 -3.05972 -0.0937068 0.0612327 2.77112e-13 1.58984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 875 876 5.62075 0.0955205 -0.317025 0.00437779 0.112585 0.0559398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 826 876 1.43361e-11 -3.05972 -0.0937068 0.0612327 2.77556e-13 1.5854e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 876 877 5.62414 0.0952265 -0.317408 0.00437191 0.112653 0.0558015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 827 877 1.43441e-11 -3.05972 -0.0937068 0.0612327 2.77556e-13 1.58096e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 877 878 5.62752 0.0949315 -0.31779 0.004366 0.112721 0.0556632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 828 878 1.43547e-11 -3.05972 -0.0937068 0.0612327 2.77556e-13 1.57652e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 878 879 5.6309 0.0946356 -0.318172 0.00436008 0.112789 0.0555247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 829 879 1.43636e-11 -3.05972 -0.0937068 0.0612327 2.78e-13 1.57652e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 879 880 5.63426 0.0943388 -0.318553 0.00435414 0.112857 0.0553861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 830 880 1.43707e-11 -3.05972 -0.0937068 0.0612327 2.78e-13 1.57208e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 880 881 5.63762 0.094041 -0.318933 0.00434818 0.112925 0.0552475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 831 881 1.43778e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 1.56763e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 881 882 5.64096 0.0937423 -0.319312 0.0043422 0.112993 0.0551088 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 832 882 1.43885e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 1.56319e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 882 883 5.6443 0.0934427 -0.319691 0.0043362 0.11306 0.05497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 833 883 1.43991e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 1.56319e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 883 884 5.64763 0.0931421 -0.320069 0.00433019 0.113127 0.0548311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 834 884 1.44063e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 1.55875e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 884 885 5.65095 0.0928407 -0.320446 0.00432415 0.113194 0.0546921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 835 885 1.44151e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 1.55431e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 885 886 5.65427 0.0925383 -0.320822 0.0043181 0.113261 0.0545531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 836 886 1.44222e-11 -3.05972 -0.0937068 0.0612327 2.79332e-13 1.54987e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 886 887 5.65757 0.0922349 -0.321198 0.00431202 0.113328 0.054414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 837 887 1.44298e-11 -3.05972 -0.0937068 0.0612327 2.79332e-13 1.54987e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 887 888 5.66087 0.0919307 -0.321573 0.00430593 0.113394 0.0542747 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 838 888 1.44382e-11 -3.05972 -0.0937068 0.0612327 2.79776e-13 1.54543e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 888 889 5.66415 0.0916255 -0.321947 0.00429982 0.113461 0.0541354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 839 889 1.44471e-11 -3.05972 -0.0937068 0.0612327 2.79776e-13 1.54099e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 889 890 5.66743 0.0913195 -0.32232 0.00429369 0.113527 0.053996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 840 890 1.44524e-11 -3.05972 -0.0937068 0.0612327 2.8022e-13 1.53655e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 890 891 5.6707 0.0910125 -0.322693 0.00428755 0.113593 0.0538566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 841 891 1.44631e-11 -3.05972 -0.0937068 0.0612327 2.8022e-13 1.53211e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 891 892 5.67397 0.0907046 -0.323065 0.00428138 0.113659 0.053717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 842 892 1.44773e-11 -3.05972 -0.0937068 0.0612327 2.80664e-13 1.53211e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 892 893 5.67722 0.0903958 -0.323436 0.0042752 0.113724 0.0535774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 843 893 1.44773e-11 -3.05972 -0.0937068 0.0612327 2.80664e-13 1.52767e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 893 894 5.68047 0.090086 -0.323807 0.00426899 0.11379 0.0534377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 844 894 1.44915e-11 -3.05972 -0.0937068 0.0612327 2.80664e-13 1.52323e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 894 895 5.6837 0.0897754 -0.324176 0.00426277 0.113855 0.0532979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 845 895 1.44951e-11 -3.05972 -0.0937068 0.0612327 2.81108e-13 1.51879e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 895 896 5.68693 0.0894639 -0.324545 0.00425653 0.11392 0.053158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 846 896 1.45022e-11 -3.05972 -0.0937068 0.0612327 2.81108e-13 1.51879e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 896 897 5.69015 0.0891515 -0.324913 0.00425027 0.113985 0.053018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 847 897 1.45164e-11 -3.05972 -0.0937068 0.0612327 2.81553e-13 1.51434e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 897 898 5.69336 0.0888381 -0.325281 0.004244 0.11405 0.052878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 848 898 1.45199e-11 -3.05972 -0.0937068 0.0612327 2.81553e-13 1.5099e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 898 899 5.69656 0.0885239 -0.325647 0.0042377 0.114115 0.0527379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 849 899 1.45297e-11 -3.05972 -0.0937068 0.0612327 2.81553e-13 1.50546e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 899 900 5.69976 0.0882088 -0.326013 0.00423139 0.114179 0.0525977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 850 900 1.45371e-11 -3.05972 -0.0937068 0.0612327 2.81997e-13 1.50546e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 900 901 5.70294 0.0878927 -0.326378 0.00422506 0.114243 0.0524574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 851 901 1.45466e-11 -3.05972 -0.0937068 0.0612327 2.81997e-13 1.50102e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 901 902 5.70612 0.0875758 -0.326742 0.00421871 0.114308 0.052317 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 852 902 1.45537e-11 -3.05972 -0.0937068 0.0612327 2.82441e-13 1.49658e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 902 903 5.70929 0.087258 -0.327106 0.00421234 0.114372 0.0521766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 853 903 1.4559e-11 -3.05972 -0.0937068 0.0612327 2.82441e-13 1.49214e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 903 904 5.71245 0.0869393 -0.327469 0.00420596 0.114435 0.052036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 854 904 1.45732e-11 -3.05972 -0.0937068 0.0612327 2.82441e-13 1.4877e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 904 905 5.7156 0.0866197 -0.32783 0.00419956 0.114499 0.0518954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 855 905 1.45768e-11 -3.05972 -0.0937068 0.0612327 2.82885e-13 1.4877e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 905 906 5.71874 0.0862993 -0.328192 0.00419313 0.114562 0.0517547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 856 906 1.45874e-11 -3.05972 -0.0937068 0.0612327 2.82885e-13 1.48326e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 906 907 5.72188 0.0859779 -0.328552 0.0041867 0.114626 0.051614 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 857 907 1.45945e-11 -3.05972 -0.0937068 0.0612327 2.83329e-13 1.47882e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 907 908 5.725 0.0856557 -0.328912 0.00418024 0.114689 0.0514731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 858 908 1.46017e-11 -3.05972 -0.0937068 0.0612327 2.83329e-13 1.47438e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 908 909 5.72812 0.0853326 -0.32927 0.00417376 0.114752 0.0513322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 859 909 1.46088e-11 -3.05972 -0.0937068 0.0612327 2.83773e-13 1.46994e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 909 910 5.73123 0.0850086 -0.329628 0.00416727 0.114814 0.0511912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 860 910 1.46194e-11 -3.05972 -0.0937068 0.0612327 2.83773e-13 1.46994e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 910 911 5.73433 0.0846837 -0.329986 0.00416076 0.114877 0.0510501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 861 911 1.46247e-11 -3.05972 -0.0937068 0.0612327 2.83773e-13 1.46549e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 911 912 5.73742 0.0843579 -0.330342 0.00415423 0.114939 0.0509089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 862 912 1.46332e-11 -3.05972 -0.0937068 0.0612327 2.84217e-13 1.46105e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 912 913 5.7405 0.0840313 -0.330698 0.00414769 0.115002 0.0507677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 863 913 1.46412e-11 -3.05972 -0.0937068 0.0612327 2.84217e-13 1.45661e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 913 914 5.74357 0.0837038 -0.331052 0.00414112 0.115064 0.0506264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 864 914 1.46478e-11 -3.05972 -0.0937068 0.0612327 2.84661e-13 1.45661e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 914 915 5.74664 0.0833755 -0.331406 0.00413454 0.115126 0.050485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 865 915 1.46567e-11 -3.05972 -0.0937068 0.0612327 2.84661e-13 1.45217e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 915 916 5.7497 0.0830463 -0.33176 0.00412794 0.115187 0.0503435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 866 916 1.4662e-11 -3.05972 -0.0937068 0.0612327 2.84661e-13 1.44773e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 916 917 5.75274 0.0827162 -0.332112 0.00412133 0.115249 0.050202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 867 917 1.46727e-11 -3.05972 -0.0937068 0.0612327 2.85105e-13 1.44329e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 917 918 5.75578 0.0823852 -0.332464 0.00411469 0.11531 0.0500603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 868 918 1.46763e-11 -3.05972 -0.0937068 0.0612327 2.85105e-13 1.43885e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 918 919 5.75881 0.0820534 -0.332814 0.00410804 0.115371 0.0499186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 869 919 1.46869e-11 -3.05972 -0.0937068 0.0612327 2.85549e-13 1.43885e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 919 920 5.76184 0.0817208 -0.333164 0.00410137 0.115432 0.0497768 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 870 920 1.46976e-11 -3.05972 -0.0937068 0.0612327 2.85549e-13 1.43441e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 920 921 5.76485 0.0813873 -0.333513 0.00409469 0.115493 0.049635 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 871 921 1.47047e-11 -3.05972 -0.0937068 0.0612327 2.85993e-13 1.42997e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 921 922 5.76785 0.0810529 -0.333862 0.00408798 0.115554 0.0494931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 872 922 1.47153e-11 -3.05972 -0.0937068 0.0612327 2.85993e-13 1.42553e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 922 923 5.77085 0.0807177 -0.334209 0.00408126 0.115614 0.049351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 873 923 1.47171e-11 -3.05972 -0.0937068 0.0612327 2.85993e-13 1.42109e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 923 924 5.77384 0.0803816 -0.334556 0.00407452 0.115675 0.049209 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 874 924 1.47242e-11 -3.05972 -0.0937068 0.0612327 2.85993e-13 1.42109e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 924 925 5.77682 0.0800447 -0.334902 0.00406777 0.115735 0.0490668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 875 925 1.47331e-11 -3.05972 -0.0937068 0.0612327 2.86438e-13 1.41664e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 925 926 5.77979 0.0797069 -0.335247 0.004061 0.115795 0.0489246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 876 926 1.47411e-11 -3.05972 -0.0937068 0.0612327 2.86438e-13 1.4122e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 926 927 5.78275 0.0793683 -0.335591 0.00405421 0.115855 0.0487822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 877 927 1.47455e-11 -3.05972 -0.0937068 0.0612327 2.86882e-13 1.40776e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 927 928 5.7857 0.0790288 -0.335934 0.0040474 0.115914 0.0486399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 878 928 1.47562e-11 -3.05972 -0.0937068 0.0612327 2.86882e-13 1.40776e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 928 929 5.78865 0.0786885 -0.336277 0.00404057 0.115974 0.0484974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 879 929 1.47615e-11 -3.05972 -0.0937068 0.0612327 2.86882e-13 1.40332e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 929 930 5.79158 0.0783474 -0.336619 0.00403373 0.116033 0.0483549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 880 930 1.47722e-11 -3.05972 -0.0937068 0.0612327 2.87326e-13 1.39888e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 930 931 5.79451 0.0780054 -0.336959 0.00402688 0.116092 0.0482122 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 881 931 1.47757e-11 -3.05972 -0.0937068 0.0612327 2.87326e-13 1.39444e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 931 932 5.79743 0.0776626 -0.337299 0.00402 0.116151 0.0480696 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 882 932 1.47828e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.39e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 932 933 5.80033 0.077319 -0.337639 0.00401311 0.11621 0.0479268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 883 933 1.47899e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.39e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 933 934 5.80324 0.0769745 -0.337977 0.0040062 0.116268 0.047784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 884 934 1.48006e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.38556e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 934 935 5.80613 0.0766292 -0.338314 0.00399927 0.116327 0.0476411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 885 935 1.48077e-11 -3.05972 -0.0937068 0.0612327 2.88214e-13 1.38112e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 935 936 5.80901 0.0762831 -0.338651 0.00399233 0.116385 0.0474981 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 886 936 1.48166e-11 -3.05972 -0.0937068 0.0612327 2.88214e-13 1.37668e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 936 937 5.81189 0.0759361 -0.338987 0.00398537 0.116443 0.047355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 887 937 1.48224e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 1.37224e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 937 938 5.81475 0.0755884 -0.339322 0.0039784 0.116501 0.0472119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 888 938 1.4829e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 1.37224e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 938 939 5.81761 0.0752398 -0.339656 0.0039714 0.116559 0.0470687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 889 939 1.48361e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 1.36779e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 939 940 5.82046 0.0748904 -0.339989 0.0039644 0.116616 0.0469254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 890 940 1.4845e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 1.36335e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 940 941 5.8233 0.0745402 -0.340322 0.00395737 0.116674 0.0467821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 891 941 1.48468e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 1.35891e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 941 942 5.82613 0.0741892 -0.340653 0.00395033 0.116731 0.0466387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 892 942 1.4861e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 1.35447e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 942 943 5.82895 0.0738373 -0.340984 0.00394327 0.116788 0.0464952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 893 943 1.48646e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 1.35447e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 943 944 5.83176 0.0734847 -0.341314 0.00393619 0.116845 0.0463516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 894 944 1.48681e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 1.35003e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 944 945 5.83457 0.0731312 -0.341643 0.0039291 0.116901 0.046208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 895 945 1.48823e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 1.34559e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 945 946 5.83736 0.0727769 -0.341971 0.00392199 0.116958 0.0460643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 896 946 1.4893e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 1.34115e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 946 947 5.84015 0.0724219 -0.342298 0.00391487 0.117014 0.0459205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 897 947 1.48894e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 1.33671e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 947 948 5.84293 0.072066 -0.342624 0.00390773 0.11707 0.0457767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 898 948 1.49019e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 1.33671e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 948 949 5.8457 0.0717094 -0.34295 0.00390057 0.117126 0.0456328 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 899 949 1.49081e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 1.33227e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 949 950 5.84846 0.0713519 -0.343274 0.0038934 0.117182 0.0454888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 900 950 1.49153e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 1.32783e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 950 951 5.85121 0.0709937 -0.343598 0.00388621 0.117238 0.0453447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 901 951 1.49223e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 1.32339e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 951 952 5.85396 0.0706346 -0.343921 0.00387901 0.117293 0.0452006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 902 952 1.49285e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 1.31894e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 952 953 5.85669 0.0702748 -0.344243 0.00387178 0.117348 0.0450564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 903 953 1.49338e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 1.31894e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 953 954 5.85942 0.0699142 -0.344564 0.00386455 0.117403 0.0449121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 904 954 1.49427e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 1.3145e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 954 955 5.86213 0.0695528 -0.344884 0.00385729 0.117458 0.0447678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 905 955 1.49498e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 1.31006e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 955 956 5.86484 0.0691906 -0.345203 0.00385002 0.117513 0.0446234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 906 956 1.49569e-11 -3.05972 -0.0937068 0.0612327 2.91767e-13 1.30562e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 956 957 5.86754 0.0688276 -0.345522 0.00384274 0.117567 0.0444789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 907 957 1.49605e-11 -3.05972 -0.0937068 0.0612327 2.91767e-13 1.30118e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 957 958 5.87023 0.0684638 -0.345839 0.00383544 0.117622 0.0443344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 908 958 1.49747e-11 -3.05972 -0.0937068 0.0612327 2.91767e-13 1.30118e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 958 959 5.87291 0.0680993 -0.346156 0.00382812 0.117676 0.0441898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 909 959 1.49711e-11 -3.05972 -0.0937068 0.0612327 2.92211e-13 1.29674e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 959 960 5.87559 0.067734 -0.346472 0.00382079 0.11773 0.0440451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 910 960 1.49853e-11 -3.05972 -0.0937068 0.0612327 2.92211e-13 1.2923e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 960 961 5.87825 0.0673679 -0.346786 0.00381344 0.117784 0.0439004 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 911 961 1.49907e-11 -3.05972 -0.0937068 0.0612327 2.92211e-13 1.28786e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 961 962 5.88091 0.0670011 -0.3471 0.00380608 0.117838 0.0437556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 912 962 1.49982e-11 -3.05972 -0.0937068 0.0612327 2.92655e-13 1.28342e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 962 963 5.88355 0.0666335 -0.347413 0.0037987 0.117891 0.0436107 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 913 963 1.50053e-11 -3.05972 -0.0937068 0.0612327 2.92655e-13 1.28342e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 963 964 5.88619 0.0662651 -0.347726 0.0037913 0.117944 0.0434658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 914 964 1.50102e-11 -3.05972 -0.0937068 0.0612327 2.92655e-13 1.27898e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 964 965 5.88882 0.065896 -0.348037 0.00378389 0.117997 0.0433207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 915 965 1.50155e-11 -3.05972 -0.0937068 0.0612327 2.93099e-13 1.27454e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 965 966 5.89144 0.0655261 -0.348347 0.00377647 0.11805 0.0431757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 916 966 1.50244e-11 -3.05972 -0.0937068 0.0612327 2.93099e-13 1.2701e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 966 967 5.89405 0.0651554 -0.348657 0.00376902 0.118103 0.0430305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 917 967 1.5028e-11 -3.05972 -0.0937068 0.0612327 2.93099e-13 1.26565e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 967 968 5.89665 0.064784 -0.348965 0.00376157 0.118156 0.0428853 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 918 968 1.50351e-11 -3.05972 -0.0937068 0.0612327 2.93543e-13 1.26565e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 968 969 5.89925 0.0644118 -0.349273 0.00375409 0.118208 0.04274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 919 969 1.50457e-11 -3.05972 -0.0937068 0.0612327 2.93543e-13 1.26121e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 969 970 5.90183 0.0640389 -0.349579 0.00374661 0.11826 0.0425947 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 920 970 1.50493e-11 -3.05972 -0.0937068 0.0612327 2.93543e-13 1.25677e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 970 971 5.90441 0.0636652 -0.349885 0.0037391 0.118312 0.0424493 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 921 971 1.50564e-11 -3.05972 -0.0937068 0.0612327 2.93987e-13 1.25233e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 971 972 5.90698 0.0632908 -0.35019 0.00373159 0.118364 0.0423038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 922 972 1.50635e-11 -3.05972 -0.0937068 0.0612327 2.93987e-13 1.24789e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 972 973 5.90953 0.0629157 -0.350494 0.00372405 0.118416 0.0421583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 923 973 1.50742e-11 -3.05972 -0.0937068 0.0612327 2.93987e-13 1.24345e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 973 974 5.91208 0.0625397 -0.350797 0.0037165 0.118468 0.0420127 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 924 974 1.50777e-11 -3.05972 -0.0937068 0.0612327 2.94431e-13 1.24345e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 974 975 5.91462 0.0621631 -0.351099 0.00370894 0.118519 0.041867 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 925 975 1.50835e-11 -3.05972 -0.0937068 0.0612327 2.94431e-13 1.23901e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 975 976 5.91716 0.0617857 -0.3514 0.00370136 0.11857 0.0417213 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 926 976 1.5091e-11 -3.05972 -0.0937068 0.0612327 2.94875e-13 1.23457e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 976 977 5.91968 0.0614076 -0.3517 0.00369377 0.118621 0.0415755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 927 977 1.50973e-11 -3.05972 -0.0937068 0.0612327 2.94875e-13 1.23013e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 977 978 5.92219 0.0610287 -0.352 0.00368616 0.118672 0.0414296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 928 978 1.51008e-11 -3.05972 -0.0937068 0.0612327 2.94875e-13 1.22569e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 978 979 5.9247 0.0606491 -0.352298 0.00367854 0.118723 0.0412837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 929 979 1.51097e-11 -3.05972 -0.0937068 0.0612327 2.94875e-13 1.22569e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 979 980 5.92719 0.0602688 -0.352596 0.0036709 0.118773 0.0411377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 930 980 1.51132e-11 -3.05972 -0.0937068 0.0612327 2.95319e-13 1.22125e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 980 981 5.92968 0.0598878 -0.352892 0.00366324 0.118823 0.0409916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 931 981 1.51275e-11 -3.05972 -0.0937068 0.0612327 2.95319e-13 1.2168e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 981 982 5.93216 0.059506 -0.353188 0.00365558 0.118873 0.0408455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 932 982 1.51346e-11 -3.05972 -0.0937068 0.0612327 2.95763e-13 1.21236e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 982 983 5.93463 0.0591235 -0.353482 0.00364789 0.118923 0.0406994 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 933 983 1.51381e-11 -3.05972 -0.0937068 0.0612327 2.95763e-13 1.20792e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 983 984 5.93709 0.0587403 -0.353776 0.0036402 0.118973 0.0405531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 934 984 1.51346e-11 -3.05972 -0.0937068 0.0612327 2.95763e-13 1.20348e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 984 985 5.93954 0.0583563 -0.354069 0.00363248 0.119023 0.0404068 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 935 985 1.5147e-11 -3.05972 -0.0937068 0.0612327 2.96208e-13 1.20348e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 985 986 5.94198 0.0579717 -0.354361 0.00362476 0.119072 0.0402604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 936 986 1.51541e-11 -3.05972 -0.0937068 0.0612327 2.96208e-13 1.19904e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 986 987 5.94442 0.0575863 -0.354652 0.00361702 0.119121 0.040114 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 937 987 1.51585e-11 -3.05972 -0.0937068 0.0612327 2.96208e-13 1.1946e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 987 988 5.94684 0.0572002 -0.354942 0.00360926 0.11917 0.0399675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 938 988 1.51656e-11 -3.05972 -0.0937068 0.0612327 2.96652e-13 1.19016e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 988 989 5.94926 0.0568135 -0.355231 0.00360149 0.119219 0.039821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 939 989 1.51719e-11 -3.05972 -0.0937068 0.0612327 2.96652e-13 1.18572e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 989 990 5.95166 0.056426 -0.355519 0.00359371 0.119268 0.0396744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 940 990 1.51736e-11 -3.05972 -0.0937068 0.0612327 2.96652e-13 1.18572e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 990 991 5.95406 0.0560378 -0.355806 0.00358591 0.119316 0.0395277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 941 991 1.51879e-11 -3.05972 -0.0937068 0.0612327 2.97096e-13 1.18128e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 991 992 5.95645 0.0556489 -0.356092 0.0035781 0.119364 0.039381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 942 992 1.51843e-11 -3.05972 -0.0937068 0.0612327 2.97096e-13 1.17684e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 992 993 5.95883 0.0552593 -0.356377 0.00357027 0.119413 0.0392342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 943 993 1.52021e-11 -3.05972 -0.0937068 0.0612327 2.97096e-13 1.1724e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 993 994 5.9612 0.054869 -0.356662 0.00356243 0.119461 0.0390873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 944 994 1.52092e-11 -3.05972 -0.0937068 0.0612327 2.97096e-13 1.16795e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 994 995 5.96357 0.054478 -0.356945 0.00355457 0.119508 0.0389404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 945 995 1.52056e-11 -3.05972 -0.0937068 0.0612327 2.9754e-13 1.16795e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 995 996 5.96592 0.0540863 -0.357227 0.0035467 0.119556 0.0387934 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 946 996 1.52127e-11 -3.05972 -0.0937068 0.0612327 2.9754e-13 1.16351e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 996 997 5.96826 0.0536939 -0.357509 0.00353882 0.119603 0.0386464 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 947 997 1.52216e-11 -3.05972 -0.0937068 0.0612327 2.9754e-13 1.15907e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 997 998 5.9706 0.0533009 -0.357789 0.00353092 0.119651 0.0384993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 948 998 1.52234e-11 -3.05972 -0.0937068 0.0612327 2.97984e-13 1.15463e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 998 999 5.97292 0.0529071 -0.358068 0.00352301 0.119698 0.0383521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 949 999 1.52323e-11 -3.05972 -0.0937068 0.0612327 2.97984e-13 1.15019e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 999 1000 5.97524 0.0525127 -0.358347 0.00351508 0.119744 0.0382049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 950 1000 1.52375e-11 -3.05972 -0.0937068 0.0612327 2.97984e-13 1.14575e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1000 1001 5.97755 0.0521176 -0.358624 0.00350714 0.119791 0.0380576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 951 1001 1.5242e-11 -3.05972 -0.0937068 0.0612327 2.98428e-13 1.14575e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1001 1002 5.97985 0.0517218 -0.358901 0.00349919 0.119838 0.0379103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 952 1002 1.525e-11 -3.05972 -0.0937068 0.0612327 2.98428e-13 1.14131e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1002 1003 5.98214 0.0513253 -0.359177 0.00349122 0.119884 0.0377629 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 953 1003 1.52571e-11 -3.05972 -0.0937068 0.0612327 2.98428e-13 1.13687e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1003 1004 5.98442 0.0509282 -0.359451 0.00348324 0.11993 0.0376155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 954 1004 1.52625e-11 -3.05972 -0.0937068 0.0612327 2.98872e-13 1.13243e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1004 1005 5.9867 0.0505303 -0.359725 0.00347525 0.119976 0.037468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 955 1005 1.5266e-11 -3.05972 -0.0937068 0.0612327 2.98872e-13 1.12799e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1005 1006 5.98896 0.0501319 -0.359998 0.00346724 0.120022 0.0373204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 956 1006 1.5266e-11 -3.05972 -0.0937068 0.0612327 2.98872e-13 1.12799e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1006 1007 5.99121 0.0497327 -0.360269 0.00345922 0.120067 0.0371728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 957 1007 1.52767e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 1.1724e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1007 1008 5.99346 0.0493329 -0.36054 0.00345118 0.120113 0.0370251 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 958 1008 1.52802e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 1.16795e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1008 1009 5.9957 0.0489324 -0.36081 0.00344313 0.120158 0.0368774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 959 1009 1.52944e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 1.16351e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1009 1010 5.99793 0.0485313 -0.361078 0.00343507 0.120203 0.0367296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 960 1010 1.52927e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 1.15907e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1010 1011 6.00014 0.0481295 -0.361346 0.00342699 0.120248 0.0365817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 961 1011 1.52998e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 1.15463e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1011 1012 6.00235 0.0477271 -0.361613 0.00341891 0.120293 0.0364338 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 962 1012 1.53064e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 1.15463e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1012 1013 6.00455 0.047324 -0.361879 0.0034108 0.120337 0.0362859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 963 1013 1.53126e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 1.15019e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1013 1014 6.00675 0.0469202 -0.362144 0.00340269 0.120382 0.0361378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 964 1014 1.53175e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 1.14575e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1014 1015 6.00893 0.0465158 -0.362407 0.00339456 0.120426 0.0359898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 965 1015 1.53246e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 1.14131e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1015 1016 6.0111 0.0461108 -0.36267 0.00338642 0.12047 0.0358416 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 966 1016 1.533e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 1.13687e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1016 1017 6.01327 0.0457051 -0.362932 0.00337826 0.120514 0.0356935 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 967 1017 1.533e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 1.13243e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1017 1018 6.01542 0.0452988 -0.363193 0.00337009 0.120557 0.0355452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 968 1018 1.53406e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 1.12799e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1018 1019 6.01757 0.0448918 -0.363453 0.00336191 0.120601 0.0353969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 969 1019 1.46656e-11 -3.05972 -0.0937068 0.0612327 2.87326e-13 1.03029e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1019 1020 6.01971 0.0444842 -0.363711 0.00335372 0.120644 0.0352486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 970 1020 1.46656e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.02585e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1020 1021 6.02184 0.044076 -0.363969 0.00334551 0.120687 0.0351002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 971 1021 1.46692e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.02141e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1021 1022 6.02396 0.0436671 -0.364226 0.00333729 0.12073 0.0349517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 972 1022 1.46798e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.02141e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1022 1023 6.02607 0.0432577 -0.364482 0.00332906 0.120773 0.0348032 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 973 1023 1.46798e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.01696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1023 1024 6.02817 0.0428475 -0.364737 0.00332081 0.120815 0.0346546 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 974 1024 1.46896e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 1.01252e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1024 1025 6.03026 0.0424368 -0.364991 0.00331256 0.120857 0.034506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 975 1025 1.46936e-11 -3.05972 -0.0937068 0.0612327 2.88214e-13 1.00808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1025 1026 6.03234 0.0420255 -0.365244 0.00330429 0.1209 0.0343574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 976 1026 1.46994e-11 -3.05972 -0.0937068 0.0612327 2.88214e-13 1.00364e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1026 1027 6.03442 0.0416135 -0.365495 0.003296 0.120942 0.0342086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 977 1027 1.47047e-11 -3.05972 -0.0937068 0.0612327 2.88214e-13 1.00364e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1027 1028 6.03648 0.0412009 -0.365746 0.00328771 0.120983 0.0340599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 978 1028 1.47118e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 9.99201e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1028 1029 6.03854 0.0407877 -0.365996 0.0032794 0.121025 0.033911 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 979 1029 1.47118e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 9.9476e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1029 1030 6.04059 0.0403739 -0.366245 0.00327108 0.121066 0.0337621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 980 1030 1.47224e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 9.90319e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1030 1031 6.04263 0.0399595 -0.366492 0.00326274 0.121108 0.0336132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 981 1031 1.4726e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 9.85878e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1031 1032 6.04466 0.0395444 -0.366739 0.0032544 0.121149 0.0334642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 982 1032 1.4726e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 9.85878e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1032 1033 6.04668 0.0391288 -0.366985 0.00324604 0.12119 0.0333152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 983 1033 1.47296e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 9.81437e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1033 1034 6.04869 0.0387126 -0.36723 0.00323767 0.12123 0.0331661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 984 1034 1.47438e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 9.76996e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1034 1035 6.05069 0.0382957 -0.367473 0.00322929 0.121271 0.033017 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 985 1035 1.4742e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 9.72555e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1035 1036 6.05268 0.0378783 -0.367716 0.00322089 0.121311 0.0328678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 986 1036 1.47473e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 9.68114e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1036 1037 6.05467 0.0374603 -0.367958 0.00321249 0.121351 0.0327185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 987 1037 1.47526e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 9.68114e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1037 1038 6.05664 0.0370417 -0.368198 0.00320407 0.121391 0.0325692 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 988 1038 1.47566e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 9.63674e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1038 1039 6.05861 0.0366225 -0.368438 0.00319564 0.121431 0.0324199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 989 1039 1.47633e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 9.59233e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1039 1040 6.06056 0.0362027 -0.368676 0.0031872 0.121471 0.0322705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 990 1040 1.47686e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 9.54792e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1040 1041 6.06251 0.0357824 -0.368914 0.00317874 0.12151 0.032121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 991 1041 1.47651e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 9.50351e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1041 1042 6.06445 0.0353614 -0.369151 0.00317027 0.121549 0.0319716 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 992 1042 1.47793e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 9.50351e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1042 1043 6.06638 0.0349399 -0.369386 0.0031618 0.121588 0.031822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 993 1043 1.47793e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 9.4591e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1043 1044 6.0683 0.0345178 -0.36962 0.00315331 0.121627 0.0316724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 994 1044 1.47757e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 9.41469e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1044 1045 6.07021 0.0340951 -0.369854 0.00314481 0.121666 0.0315228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 995 1045 1.47864e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 9.37028e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1045 1046 6.07211 0.0336719 -0.370086 0.00313629 0.121704 0.0313731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 996 1046 1.47971e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 9.32587e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1046 1047 6.074 0.0332481 -0.370318 0.00312777 0.121743 0.0312234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 997 1047 1.47971e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 9.32587e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1047 1048 6.07589 0.0328237 -0.370548 0.00311923 0.121781 0.0310736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 998 1048 1.48059e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 9.28146e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1048 1049 6.07776 0.0323988 -0.370777 0.00311068 0.121819 0.0309237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 999 1049 1.48086e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 9.23706e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1049 1050 6.07963 0.0319733 -0.371005 0.00310212 0.121857 0.0307739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1000 1050 1.48133e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 9.19265e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1050 1051 6.08148 0.0315472 -0.371233 0.00309355 0.121894 0.0306239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1001 1051 1.48184e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 9.14824e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1051 1052 6.08333 0.0311206 -0.371459 0.00308497 0.121932 0.030474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1002 1052 1.48201e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 9.14824e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1052 1053 6.08517 0.0306934 -0.371684 0.00307638 0.121969 0.0303239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1003 1053 1.4829e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 9.10383e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1053 1054 6.087 0.0302657 -0.371908 0.00306777 0.122006 0.0301739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1004 1054 1.48326e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 9.05942e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1054 1055 6.08882 0.0298375 -0.372131 0.00305916 0.122043 0.0300238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1005 1055 1.48397e-11 -3.05972 -0.0937068 0.0612327 2.91767e-13 9.01501e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1055 1056 6.09063 0.0294087 -0.372353 0.00305053 0.122079 0.0298736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1006 1056 1.48397e-11 -3.05972 -0.0937068 0.0612327 2.91767e-13 8.9706e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1056 1057 6.09243 0.0289793 -0.372574 0.00304189 0.122116 0.0297234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1007 1057 1.4829e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 8.52651e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1057 1058 6.09422 0.0285494 -0.372793 0.00303325 0.122152 0.0295731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1008 1058 1.48326e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 8.4821e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1058 1059 6.09601 0.028119 -0.373012 0.00302459 0.122188 0.0294228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1009 1059 1.48397e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 8.4821e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1059 1060 6.09778 0.027688 -0.37323 0.00301592 0.122224 0.0292725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1010 1060 1.48468e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 8.43769e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1060 1061 6.09955 0.0272565 -0.373447 0.00300723 0.12226 0.0291221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1011 1061 1.48539e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 8.39329e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1061 1062 6.1013 0.0268245 -0.373662 0.00299854 0.122296 0.0289717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1012 1062 1.48548e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 8.34888e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1062 1063 6.10305 0.026392 -0.373877 0.00298984 0.122331 0.0288212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1013 1063 1.48588e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 8.34888e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1063 1064 6.10479 0.0259589 -0.37409 0.00298112 0.122366 0.0286707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1014 1064 1.48628e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 8.30447e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1064 1065 6.10651 0.0255253 -0.374303 0.0029724 0.122401 0.0285201 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1015 1065 1.48699e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 8.26006e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1065 1066 6.10823 0.0250912 -0.374514 0.00296366 0.122436 0.0283695 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1016 1066 1.48717e-11 -3.05972 -0.0937068 0.0612327 2.79332e-13 8.21565e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1066 1067 6.10994 0.0246566 -0.374724 0.00295492 0.122471 0.0282188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1017 1067 1.48823e-11 -3.05972 -0.0937068 0.0612327 2.79332e-13 8.21565e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1067 1068 6.11165 0.0242214 -0.374934 0.00294616 0.122505 0.0280681 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1018 1068 1.48788e-11 -3.05972 -0.0937068 0.0612327 2.79332e-13 8.17124e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1068 1069 6.11334 0.0237858 -0.375142 0.0029374 0.122539 0.0279174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1019 1069 1.55858e-11 -3.05972 -0.0937068 0.0612327 3.06866e-13 8.92619e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1069 1070 6.11502 0.0233496 -0.375349 0.00292862 0.122573 0.0277666 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1020 1070 1.55964e-11 -3.05972 -0.0937068 0.0612327 3.06866e-13 8.88178e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1070 1071 6.11669 0.0229129 -0.375555 0.00291983 0.122607 0.0276158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1021 1071 1.56e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 8.83738e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1071 1072 6.11836 0.0224758 -0.37576 0.00291104 0.122641 0.0274649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1022 1072 1.56035e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 8.79297e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1072 1073 6.12001 0.0220381 -0.375964 0.00290223 0.122675 0.027314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1023 1073 1.56053e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 8.74856e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1073 1074 6.12166 0.0215999 -0.376167 0.00289341 0.122708 0.027163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1024 1074 1.56088e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 8.74856e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1074 1075 6.1233 0.0211613 -0.376369 0.00288458 0.122741 0.027012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1025 1075 1.56135e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 8.70415e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1075 1076 6.12492 0.0207221 -0.376569 0.00287574 0.122774 0.026861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1026 1076 1.56177e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 8.65974e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1076 1077 6.12654 0.0202825 -0.376769 0.0028669 0.122807 0.0267099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1027 1077 1.56213e-11 -3.05972 -0.0937068 0.0612327 3.07754e-13 8.61533e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1077 1078 6.12815 0.0198423 -0.376967 0.00285804 0.12284 0.0265588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1028 1078 1.56248e-11 -3.05972 -0.0937068 0.0612327 3.07754e-13 8.57092e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1078 1079 6.12975 0.0194017 -0.377165 0.00284917 0.122872 0.0264076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1029 1079 1.56319e-11 -3.05972 -0.0937068 0.0612327 3.07754e-13 8.52651e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1079 1080 6.13134 0.0189606 -0.377361 0.00284029 0.122904 0.0262564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1030 1080 1.56355e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 8.52651e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1080 1081 6.13292 0.018519 -0.377556 0.0028314 0.122936 0.0261052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1031 1081 1.56426e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 8.4821e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1081 1082 6.1345 0.0180769 -0.377751 0.00282251 0.122968 0.0259539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1032 1082 1.5639e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 8.43769e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1082 1083 6.13606 0.0176344 -0.377944 0.0028136 0.123 0.0258025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1033 1083 1.56462e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 8.39329e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1083 1084 6.13761 0.0171914 -0.378136 0.00280468 0.123031 0.0256512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1034 1084 1.56497e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 8.34888e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1084 1085 6.13916 0.0167479 -0.378327 0.00279576 0.123063 0.0254998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1035 1085 1.5655e-11 -3.05972 -0.0937068 0.0612327 3.08642e-13 8.30447e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1085 1086 6.14069 0.016304 -0.378517 0.00278682 0.123094 0.0253483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1036 1086 1.56586e-11 -3.05972 -0.0937068 0.0612327 3.08642e-13 8.26006e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1086 1087 6.14222 0.0158596 -0.378705 0.00277788 0.123125 0.0251968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1037 1087 1.56617e-11 -3.05972 -0.0937068 0.0612327 3.08642e-13 8.26006e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1087 1088 6.14374 0.0154147 -0.378893 0.00276892 0.123155 0.0250453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1038 1088 1.56661e-11 -3.05972 -0.0937068 0.0612327 3.08642e-13 8.21565e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1088 1089 6.14525 0.0149694 -0.37908 0.00275996 0.123186 0.0248938 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1039 1089 1.56692e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 8.17124e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1089 1090 6.14674 0.0145236 -0.379265 0.00275098 0.123216 0.0247422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1040 1090 1.56728e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 8.12683e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1090 1091 6.14823 0.0140774 -0.37945 0.002742 0.123247 0.0245905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1041 1091 1.56817e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 8.08242e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1091 1092 6.14971 0.0136307 -0.379633 0.00273301 0.123277 0.0244388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1042 1092 1.56781e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 8.03801e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1092 1093 6.15119 0.0131836 -0.379815 0.00272401 0.123307 0.0242871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1043 1093 1.56852e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 7.99361e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1093 1094 6.15265 0.012736 -0.379996 0.002715 0.123336 0.0241354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1044 1094 1.56923e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 7.99361e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1094 1095 6.1541 0.012288 -0.380176 0.00270598 0.123366 0.0239836 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1045 1095 1.56994e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 7.9492e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1095 1096 6.15554 0.0118395 -0.380355 0.00269695 0.123395 0.0238318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1046 1096 1.56959e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 7.90479e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1096 1097 6.15698 0.0113906 -0.380533 0.00268791 0.123424 0.0236799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1047 1097 1.56923e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 7.86038e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1097 1098 6.1584 0.0109413 -0.38071 0.00267887 0.123453 0.023528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1048 1098 1.56994e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 7.81597e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1098 1099 6.15982 0.0104915 -0.380885 0.00266981 0.123482 0.0233761 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1049 1099 1.57048e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 7.77156e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1099 1100 6.16122 0.0100413 -0.38106 0.00266075 0.12351 0.0232241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1050 1100 1.57097e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 7.72715e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1100 1101 6.16262 0.00959072 -0.381233 0.00265168 0.123538 0.0230721 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1051 1101 1.57137e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 7.72715e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1101 1102 6.16401 0.00913968 -0.381406 0.0026426 0.123567 0.02292 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1052 1102 1.57172e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 7.68274e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1102 1103 6.16539 0.00868822 -0.381577 0.00263351 0.123595 0.022768 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1053 1103 1.57208e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 7.63833e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1103 1104 6.16676 0.00823634 -0.381747 0.00262441 0.123622 0.0226158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1054 1104 1.57243e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 7.59393e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1104 1105 6.16812 0.00778405 -0.381916 0.0026153 0.12365 0.0224637 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1055 1105 1.57208e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 7.54952e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1105 1106 6.16947 0.00733134 -0.382084 0.00260619 0.123677 0.0223115 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1056 1106 1.5735e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 7.50511e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1106 1107 6.17081 0.00687822 -0.382251 0.00259706 0.123705 0.0221593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1057 1107 1.57314e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 7.4607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1107 1108 6.17214 0.0064247 -0.382416 0.00258793 0.123732 0.022007 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1058 1108 1.57385e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 7.4607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1108 1109 6.17347 0.00597077 -0.382581 0.00257879 0.123759 0.0218547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1059 1109 1.57421e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 7.41629e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1109 1110 6.17478 0.00551644 -0.382744 0.00256964 0.123785 0.0217024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1060 1110 1.57439e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 7.37188e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1110 1111 6.17609 0.00506171 -0.382907 0.00256049 0.123812 0.0215501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1061 1111 1.57439e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 7.32747e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1111 1112 6.17738 0.00460659 -0.383068 0.00255132 0.123838 0.0213977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1062 1112 1.57505e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 7.28306e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1112 1113 6.17867 0.00415107 -0.383228 0.00254215 0.123864 0.0212453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1063 1113 1.57541e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 7.23865e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1113 1114 6.17994 0.00369516 -0.383387 0.00253297 0.12389 0.0210928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1064 1114 1.57581e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 7.19425e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1114 1115 6.18121 0.00323886 -0.383545 0.00252378 0.123916 0.0209403 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1065 1115 1.57634e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 7.19425e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1115 1116 6.18247 0.00278218 -0.383702 0.00251459 0.123941 0.0207878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1066 1116 1.57634e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 7.14984e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1116 1117 6.18372 0.00232512 -0.383857 0.00250538 0.123967 0.0206353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1067 1117 1.57705e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 7.10543e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1117 1118 6.18496 0.00186767 -0.384012 0.00249617 0.123992 0.0204827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1068 1118 1.5774e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 7.06102e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1118 1119 6.18619 0.00140985 -0.384165 0.00248695 0.124017 0.0203301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1069 1119 1.5774e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 7.01661e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1119 1120 6.18741 0.000951654 -0.384318 0.00247772 0.124042 0.0201774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1070 1120 1.5774e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 6.9722e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1120 1121 6.18862 0.000493086 -0.384469 0.00246849 0.124066 0.0200247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1071 1121 1.57776e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 6.92779e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1121 1122 6.18983 3.41497e-05 -0.384619 0.00245925 0.124091 0.019872 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1072 1122 1.57847e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 6.92779e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1122 1123 6.19102 -0.000425153 -0.384768 0.00245 0.124115 0.0197193 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1073 1123 1.57865e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 6.88338e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1123 1124 6.1922 -0.000884819 -0.384915 0.00244074 0.124139 0.0195665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1074 1124 1.57891e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 6.83897e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1124 1125 6.19338 -0.00134485 -0.385062 0.00243147 0.124163 0.0194137 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1075 1125 1.57912e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 6.79456e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1125 1126 6.19454 -0.00180523 -0.385208 0.0024222 0.124187 0.0192609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1076 1126 1.57927e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 6.75016e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1126 1127 6.1957 -0.00226597 -0.385352 0.00241292 0.12421 0.019108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1077 1127 1.57971e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 6.70575e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1127 1128 6.19685 -0.00272706 -0.385495 0.00240364 0.124233 0.0189552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1078 1128 1.58025e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 6.66134e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1128 1129 6.19799 -0.0031885 -0.385637 0.00239434 0.124256 0.0188022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1079 1129 1.5806e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 6.66134e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1129 1130 6.19911 -0.00365029 -0.385778 0.00238504 0.124279 0.0186493 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1080 1130 1.57989e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 6.61693e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1130 1131 6.20023 -0.00411242 -0.385918 0.00237573 0.124302 0.0184963 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1081 1131 1.58096e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 6.57252e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1131 1132 6.20134 -0.0045749 -0.386057 0.00236642 0.124325 0.0183433 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1082 1132 1.58096e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 6.52811e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1132 1133 6.20244 -0.00503771 -0.386195 0.0023571 0.124347 0.0181903 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1083 1133 1.58131e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 6.4837e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1133 1134 6.20353 -0.00550086 -0.386331 0.00234777 0.124369 0.0180372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1084 1134 1.58202e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 6.43929e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1134 1135 6.20462 -0.00596434 -0.386467 0.00233843 0.124391 0.0178841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1085 1135 1.58202e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 6.39488e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1135 1136 6.20569 -0.00642815 -0.386601 0.00232909 0.124413 0.017731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1086 1136 1.58238e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 6.39488e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1136 1137 6.20675 -0.00689229 -0.386734 0.00231974 0.124435 0.0175779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1087 1137 1.58251e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 6.35048e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1137 1138 6.20781 -0.00735675 -0.386866 0.00231039 0.124456 0.0174247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1088 1138 1.58273e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 6.30607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1138 1139 6.20885 -0.00782153 -0.386997 0.00230103 0.124477 0.0172715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1089 1139 1.58291e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 6.26166e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1139 1140 6.20989 -0.00828664 -0.387126 0.00229166 0.124498 0.0171183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1090 1140 1.58327e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 6.21725e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1140 1141 6.21091 -0.00875206 -0.387255 0.00228228 0.124519 0.016965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1091 1141 1.58309e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 6.17284e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1141 1142 6.21193 -0.00921779 -0.387382 0.0022729 0.12454 0.0168117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1092 1142 1.58344e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 6.12843e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1142 1143 6.21294 -0.00968383 -0.387508 0.00226351 0.12456 0.0166584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1093 1143 1.58344e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 6.12843e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1143 1144 6.21393 -0.0101502 -0.387633 0.00225412 0.124581 0.0165051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1094 1144 1.58451e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 6.08402e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1144 1145 6.21492 -0.0106168 -0.387757 0.00224472 0.124601 0.0163518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1095 1145 1.58416e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 6.03961e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1145 1146 6.2159 -0.0110838 -0.38788 0.00223531 0.124621 0.0161984 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1096 1146 1.58451e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 5.9952e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1146 1147 6.21687 -0.0115511 -0.388002 0.0022259 0.124641 0.016045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1097 1147 1.58558e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 5.9508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1147 1148 6.21783 -0.0120186 -0.388122 0.00221648 0.12466 0.0158915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1098 1148 1.5854e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 5.90639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1148 1149 6.21879 -0.0124865 -0.388242 0.00220706 0.124679 0.0157381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1099 1149 1.58566e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 5.86198e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1149 1150 6.21973 -0.0129546 -0.38836 0.00219762 0.124699 0.0155846 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1100 1150 1.58578e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 5.81757e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1150 1151 6.22066 -0.013423 -0.388477 0.00218819 0.124718 0.0154311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1101 1151 1.58611e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 5.81757e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1151 1152 6.22158 -0.0138917 -0.388593 0.00217875 0.124736 0.0152776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1102 1152 1.58629e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 5.77316e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1152 1153 6.2225 -0.0143607 -0.388708 0.0021693 0.124755 0.015124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1103 1153 1.58664e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 5.72875e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1153 1154 6.2234 -0.01483 -0.388821 0.00215984 0.124773 0.0149705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1104 1154 1.58664e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 5.68434e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1154 1155 6.2243 -0.0152996 -0.388934 0.00215038 0.124792 0.0148169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1105 1155 1.587e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 5.63993e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1155 1156 6.22518 -0.0157694 -0.389045 0.00214092 0.12481 0.0146632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1106 1156 1.587e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 5.59552e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1156 1157 6.22606 -0.0162395 -0.389155 0.00213145 0.124828 0.0145096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1107 1157 1.58771e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 5.55112e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1157 1158 6.22693 -0.0167098 -0.389264 0.00212197 0.124845 0.0143559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1108 1158 1.58806e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 5.50671e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1158 1159 6.22779 -0.0171805 -0.389372 0.00211249 0.124863 0.0142023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1109 1159 1.58806e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 5.50671e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1159 1160 6.22864 -0.0176514 -0.389479 0.002103 0.12488 0.0140485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1110 1160 1.58789e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 5.4623e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1160 1161 6.22948 -0.0181225 -0.389585 0.00209351 0.124897 0.0138948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1111 1161 1.58824e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 5.41789e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1161 1162 6.23031 -0.0185939 -0.389689 0.00208401 0.124914 0.0137411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1112 1162 1.58842e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 5.37348e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1162 1163 6.23113 -0.0190656 -0.389792 0.00207451 0.124931 0.0135873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1113 1163 1.58868e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 5.32907e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1163 1164 6.23194 -0.0195375 -0.389894 0.002065 0.124947 0.0134335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1114 1164 1.58877e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.28466e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1164 1165 6.23274 -0.0200097 -0.389995 0.00205549 0.124964 0.0132797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1115 1165 1.58895e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.24025e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1165 1166 6.23353 -0.0204821 -0.390095 0.00204597 0.12498 0.0131258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1116 1166 1.58948e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.24025e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1166 1167 6.23432 -0.0209548 -0.390194 0.00203645 0.124996 0.012972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1117 1167 1.58948e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.19584e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1167 1168 6.23509 -0.0214277 -0.390291 0.00202692 0.125012 0.0128181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1118 1168 1.58948e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.15143e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1168 1169 6.23585 -0.0219008 -0.390388 0.00201738 0.125027 0.0126642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1119 1169 1.58984e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.10703e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1169 1170 6.23661 -0.0223741 -0.390483 0.00200785 0.125043 0.0125103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1120 1170 1.59019e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.06262e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1170 1171 6.23736 -0.0228477 -0.390577 0.0019983 0.125058 0.0123564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1121 1171 1.59019e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 5.01821e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1171 1172 6.23809 -0.0233216 -0.39067 0.00198876 0.125073 0.0122024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1122 1172 1.59055e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 4.9738e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1172 1173 6.23882 -0.0237956 -0.390761 0.0019792 0.125088 0.0120484 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1123 1173 1.59055e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 4.92939e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1173 1174 6.23954 -0.0242699 -0.390852 0.00196965 0.125102 0.0118944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1124 1174 1.59082e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 4.92939e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1174 1175 6.24025 -0.0247444 -0.390941 0.00196009 0.125117 0.0117404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1125 1175 1.59096e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 4.88498e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1175 1176 6.24095 -0.0252191 -0.391029 0.00195052 0.125131 0.0115864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1126 1176 1.59126e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 4.84057e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1176 1177 6.24164 -0.025694 -0.391116 0.00194095 0.125145 0.0114324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1127 1177 1.59126e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 4.79616e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1177 1178 6.24232 -0.0261692 -0.391202 0.00193138 0.125159 0.0112783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1128 1178 1.59091e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 4.75175e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1178 1179 6.24299 -0.0266445 -0.391287 0.0019218 0.125173 0.0111242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1129 1179 1.59162e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.70735e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1179 1180 6.24365 -0.0271201 -0.391371 0.00191221 0.125186 0.0109701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1130 1180 1.59162e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.66294e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1180 1181 6.2443 -0.0275958 -0.391453 0.00190263 0.1252 0.010816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1131 1181 1.59268e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.61853e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1181 1182 6.24494 -0.0280718 -0.391534 0.00189304 0.125213 0.0106619 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1132 1182 1.59233e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.61853e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1182 1183 6.24558 -0.028548 -0.391614 0.00188344 0.125226 0.0105077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1133 1183 1.59233e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.57412e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1183 1184 6.2462 -0.0290243 -0.391693 0.00187384 0.125239 0.0103536 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1134 1184 1.59268e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.52971e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1184 1185 6.24682 -0.0295009 -0.391771 0.00186424 0.125251 0.0101994 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1135 1185 1.59268e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.4853e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1185 1186 6.24742 -0.0299776 -0.391847 0.00185463 0.125264 0.0100452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1136 1186 1.59304e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 4.44089e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1186 1187 6.24802 -0.0304545 -0.391923 0.00184502 0.125276 0.00989097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1137 1187 1.5929e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.39648e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1187 1188 6.24861 -0.0309316 -0.391997 0.00183541 0.125288 0.00973674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1138 1188 1.59313e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.35207e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1188 1189 6.24918 -0.0314089 -0.39207 0.00182579 0.1253 0.0095825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1139 1189 1.59357e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.30767e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1189 1190 6.24975 -0.0318864 -0.392142 0.00181617 0.125311 0.00942824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1140 1190 1.59339e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.30767e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1190 1191 6.25031 -0.032364 -0.392213 0.00180654 0.125323 0.00927397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1141 1191 1.59339e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.26326e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1191 1192 6.25086 -0.0328418 -0.392282 0.00179691 0.125334 0.00911968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1142 1192 1.59304e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.21885e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1192 1193 6.2514 -0.0333198 -0.39235 0.00178728 0.125345 0.00896538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1143 1193 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.17444e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1193 1194 6.25193 -0.0337979 -0.392418 0.00177764 0.125356 0.00881107 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1144 1194 1.59375e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 4.13003e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1194 1195 6.25245 -0.0342762 -0.392484 0.001768 0.125367 0.00865674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1145 1195 1.5941e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 4.08562e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1195 1196 6.25296 -0.0347547 -0.392549 0.00175836 0.125377 0.0085024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1146 1196 1.59446e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 4.04121e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1196 1197 6.25347 -0.0352333 -0.392612 0.00174871 0.125388 0.00834805 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1147 1197 1.5941e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.9968e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1197 1198 6.25396 -0.0357121 -0.392675 0.00173907 0.125398 0.00819368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1148 1198 1.59446e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.9968e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1198 1199 6.25444 -0.036191 -0.392736 0.00172941 0.125408 0.0080393 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1149 1199 1.59446e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.95239e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1199 1200 6.25492 -0.0366701 -0.392796 0.00171976 0.125417 0.00788491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1150 1200 1.59465e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.90799e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1200 1201 6.25538 -0.0371493 -0.392855 0.0017101 0.125427 0.0077305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1151 1201 1.59464e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.86358e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1201 1202 6.25584 -0.0376287 -0.392913 0.00170044 0.125436 0.00757609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1152 1202 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.81917e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1202 1203 6.25628 -0.0381082 -0.39297 0.00169077 0.125446 0.00742166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1153 1203 1.59517e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.77476e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1203 1204 6.25672 -0.0385878 -0.393025 0.00168111 0.125455 0.00726722 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1154 1204 1.59588e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1204 1205 6.25715 -0.0390676 -0.393079 0.00167144 0.125463 0.00711277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1155 1205 1.59517e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1205 1206 6.25757 -0.0395475 -0.393132 0.00166177 0.125472 0.0069583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1156 1206 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1206 1207 6.25797 -0.0400275 -0.393184 0.00165209 0.12548 0.00680383 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1157 1207 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.64153e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1207 1208 6.25837 -0.0405077 -0.393235 0.00164241 0.125489 0.00664935 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1158 1208 1.59552e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.59712e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1208 1209 6.25876 -0.040988 -0.393285 0.00163273 0.125497 0.00649486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1159 1209 1.59552e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1209 1210 6.25914 -0.0414684 -0.393333 0.00162305 0.125504 0.00634035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1160 1210 1.59552e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1210 1211 6.25952 -0.0419489 -0.39338 0.00161336 0.125512 0.00618584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1161 1211 1.59588e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1211 1212 6.25988 -0.0424295 -0.393426 0.00160368 0.12552 0.00603132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1162 1212 1.59592e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1212 1213 6.26023 -0.0429103 -0.393471 0.00159399 0.125527 0.00587678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1163 1213 1.59592e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1213 1214 6.26057 -0.0433911 -0.393515 0.0015843 0.125534 0.00572224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1164 1214 1.59606e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1214 1215 6.26091 -0.0438721 -0.393558 0.0015746 0.125541 0.00556769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1165 1215 1.59623e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1215 1216 6.26123 -0.0443532 -0.393599 0.00156491 0.125548 0.00541313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1166 1216 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1216 1217 6.26154 -0.0448343 -0.393639 0.00155521 0.125554 0.00525856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1167 1217 1.59552e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1217 1218 6.26185 -0.0453156 -0.393678 0.00154551 0.125561 0.00510399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1168 1218 1.59623e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1218 1219 6.26215 -0.045797 -0.393716 0.0015358 0.125567 0.00494941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1169 1219 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1219 1220 6.26243 -0.0462784 -0.393752 0.0015261 0.125573 0.00479481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1170 1220 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1220 1221 6.26271 -0.0467599 -0.393788 0.00151639 0.125578 0.00464022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1171 1221 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1221 1222 6.26298 -0.0472416 -0.393822 0.00150669 0.125584 0.00448561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1172 1222 1.59623e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1222 1223 6.26324 -0.0477233 -0.393855 0.00149698 0.125589 0.004331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1173 1223 1.59677e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1223 1224 6.26349 -0.048205 -0.393887 0.00148727 0.125595 0.00417638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1174 1224 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1224 1225 6.26372 -0.0486869 -0.393918 0.00147755 0.1256 0.00402175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1175 1225 1.59685e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 2.93099e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1225 1226 6.26396 -0.0491688 -0.393947 0.00146784 0.125605 0.00386712 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1176 1226 1.59686e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.88658e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1226 1227 6.26418 -0.0496508 -0.393976 0.00145812 0.125609 0.00371248 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1177 1227 1.59712e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.84217e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1227 1228 6.26439 -0.0501329 -0.394003 0.00144841 0.125614 0.00355784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1178 1228 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.79776e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1228 1229 6.26459 -0.050615 -0.394029 0.00143869 0.125618 0.00340319 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1179 1229 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1229 1230 6.26478 -0.0510972 -0.394054 0.00142897 0.125622 0.00324854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1180 1230 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1230 1231 6.26497 -0.0515795 -0.394077 0.00141925 0.125626 0.00309388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1181 1231 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1231 1232 6.26514 -0.0520618 -0.3941 0.00140952 0.12563 0.00293921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1182 1232 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.66454e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1232 1233 6.2653 -0.0525442 -0.394121 0.0013998 0.125633 0.00278454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1183 1233 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.62013e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1233 1234 6.26546 -0.0530266 -0.394141 0.00139008 0.125636 0.00262987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1184 1234 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.57572e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1234 1235 6.2656 -0.0535091 -0.39416 0.00138035 0.125639 0.00247519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1185 1235 1.59712e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.53131e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1235 1236 6.26574 -0.0539916 -0.394178 0.00137062 0.125642 0.00232051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1186 1236 1.59748e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.4869e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1236 1237 6.26587 -0.0544741 -0.394195 0.0013609 0.125645 0.00216583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1187 1237 1.59739e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.44249e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1237 1238 6.26598 -0.0549567 -0.39421 0.00135117 0.125648 0.00201114 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1188 1238 1.59734e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.44249e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1238 1239 6.26609 -0.0554394 -0.394224 0.00134144 0.12565 0.00185645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1189 1239 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 2.39808e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1239 1240 6.26619 -0.055922 -0.394237 0.00133171 0.125652 0.00170175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1190 1240 1.59712e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.35367e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1240 1241 6.26628 -0.0564047 -0.394249 0.00132198 0.125654 0.00154706 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1191 1241 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.30926e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1241 1242 6.26636 -0.0568874 -0.39426 0.00131225 0.125656 0.00139236 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1192 1242 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.26485e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1242 1243 6.26643 -0.0573702 -0.394269 0.00130252 0.125658 0.00123766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1193 1243 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.22045e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1243 1244 6.26649 -0.057853 -0.394277 0.00129279 0.125659 0.00108295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1194 1244 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.17604e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1244 1245 6.26654 -0.0583357 -0.394284 0.00128305 0.12566 0.00092825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1195 1245 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.13163e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1245 1246 6.26659 -0.0588185 -0.39429 0.00127332 0.125661 0.000773544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1196 1246 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.13163e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1246 1247 6.26662 -0.0593014 -0.394295 0.00126359 0.125662 0.000618837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1197 1247 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.08722e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1247 1248 6.26664 -0.0597842 -0.394299 0.00125385 0.125663 0.000464128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1198 1248 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 2.04281e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1248 1249 6.26666 -0.060267 -0.394301 0.00124412 0.125663 0.000309419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1199 1249 1.59757e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.9984e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1249 1250 6.26666 -0.0607499 -0.394302 0.00123439 0.125664 0.00015471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1200 1250 1.59755e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.95399e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1250 1251 6.26666 -0.0612327 -0.394302 0.00122465 0.125664 -4.88498e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1201 1251 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.90958e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1251 1252 6.26664 -0.0617155 -0.394301 0.00121492 0.125664 -0.00015471 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1202 1252 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.86517e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1252 1253 6.26662 -0.0621984 -0.394299 0.00120519 0.125663 -0.000309419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1203 1253 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.82077e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1253 1254 6.26659 -0.0626812 -0.394295 0.00119545 0.125663 -0.000464128 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1204 1254 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.82077e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1254 1255 6.26654 -0.063164 -0.39429 0.00118572 0.125662 -0.000618837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1205 1255 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.77636e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1255 1256 6.26649 -0.0636468 -0.394284 0.00117599 0.125661 -0.000773544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1206 1256 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.73195e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1256 1257 6.26643 -0.0641296 -0.394277 0.00116626 0.12566 -0.00092825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1207 1257 1.59801e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 1.68754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1257 1258 6.26636 -0.0646124 -0.394269 0.00115652 0.125659 -0.00108295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1208 1258 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.64313e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1258 1259 6.26628 -0.0650951 -0.39426 0.00114679 0.125658 -0.00123766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1209 1259 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.59872e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1259 1260 6.26619 -0.0655778 -0.394249 0.00113706 0.125656 -0.00139236 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1210 1260 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.55431e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1260 1261 6.26609 -0.0660605 -0.394237 0.00112733 0.125654 -0.00154706 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1211 1261 1.59748e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.5099e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1261 1262 6.26598 -0.0665432 -0.394224 0.0011176 0.125652 -0.00170175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1212 1262 1.59726e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.46549e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1262 1263 6.26587 -0.0670258 -0.39421 0.00110787 0.12565 -0.00185645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1213 1263 1.59734e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.46549e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1263 1264 6.26574 -0.0675084 -0.394195 0.00109814 0.125648 -0.00201114 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1214 1264 1.59748e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.42109e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1264 1265 6.2656 -0.067991 -0.394178 0.00108841 0.125645 -0.00216583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1215 1265 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.37668e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1265 1266 6.26546 -0.0684735 -0.39416 0.00107868 0.125642 -0.00232051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1216 1266 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.33227e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1266 1267 6.2653 -0.0689559 -0.394141 0.00106896 0.125639 -0.00247519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1217 1267 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.28786e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1267 1268 6.26514 -0.0694384 -0.394121 0.00105923 0.125636 -0.00262987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1218 1268 1.59766e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.24345e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1268 1269 6.26497 -0.0699207 -0.3941 0.00104951 0.125633 -0.00278454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1219 1269 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.19904e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1269 1270 6.26478 -0.070403 -0.394077 0.00103978 0.12563 -0.00293921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1220 1270 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.15463e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1270 1271 6.26459 -0.0708853 -0.394054 0.00103006 0.125626 -0.00309388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1221 1271 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.15463e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1271 1272 6.26439 -0.0713675 -0.394029 0.00102034 0.125622 -0.00324854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1222 1272 1.5973e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.11022e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1272 1273 6.26418 -0.0718496 -0.394003 0.00101062 0.125618 -0.00340319 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1223 1273 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.06581e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1273 1274 6.26396 -0.0723317 -0.393976 0.0010009 0.125614 -0.00355784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1224 1274 1.59694e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.02141e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1274 1275 6.26372 -0.0728137 -0.393947 0.000991186 0.125609 -0.00371248 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1225 1275 1.59675e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 9.76996e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1275 1276 6.26349 -0.0732956 -0.393918 0.00098147 0.125605 -0.00386712 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1226 1276 1.59677e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 9.32587e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1276 1277 6.26324 -0.0737775 -0.393887 0.000971756 0.1256 -0.00402175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1227 1277 1.59623e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 8.88178e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1277 1278 6.26298 -0.0742593 -0.393855 0.000962043 0.125595 -0.00417638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1228 1278 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 8.43769e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1278 1279 6.26271 -0.074741 -0.393822 0.000952332 0.125589 -0.004331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1229 1279 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 7.99361e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1279 1280 6.26243 -0.0752226 -0.393788 0.000942622 0.125584 -0.00448561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1230 1280 1.59659e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 7.99361e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1280 1281 6.26215 -0.0757041 -0.393752 0.000932914 0.125578 -0.00464022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1231 1281 1.59588e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 7.54952e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1281 1282 6.26185 -0.0761856 -0.393716 0.000923208 0.125573 -0.00479481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1232 1282 1.59588e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 7.10543e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1282 1283 6.26154 -0.0766669 -0.393678 0.000913504 0.125567 -0.00494941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1233 1283 1.59588e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 6.66134e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1283 1284 6.26123 -0.0771482 -0.393639 0.000903802 0.125561 -0.00510399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1234 1284 1.59588e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 6.21725e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1284 1285 6.26091 -0.0776294 -0.393599 0.000894102 0.125554 -0.00525856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1235 1285 1.59606e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 5.77316e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1285 1286 6.26057 -0.0781104 -0.393558 0.000884403 0.125548 -0.00541313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1236 1286 1.59606e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1286 1287 6.26023 -0.0785914 -0.393515 0.000874707 0.125541 -0.00556769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1237 1287 1.59588e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 4.88498e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1287 1288 6.25988 -0.0790723 -0.393471 0.000865013 0.125534 -0.00572224 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1238 1288 1.5957e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 4.88498e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1288 1289 6.25952 -0.079553 -0.393426 0.000855321 0.125527 -0.00587678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1239 1289 1.5957e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 4.44089e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1289 1290 6.25914 -0.0800336 -0.39338 0.000845631 0.12552 -0.00603132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1240 1290 1.5957e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 3.9968e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1290 1291 6.25876 -0.0805142 -0.393333 0.000835943 0.125512 -0.00618584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1241 1291 1.59517e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 3.55271e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1291 1292 6.25837 -0.0809946 -0.393285 0.000826258 0.125504 -0.00634035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1242 1292 1.59552e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 3.10862e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1292 1293 6.25797 -0.0814749 -0.393235 0.000816576 0.125497 -0.00649486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1243 1293 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 2.66454e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1293 1294 6.25757 -0.081955 -0.393184 0.000806896 0.125489 -0.00664935 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1244 1294 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 2.22045e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1294 1295 6.25715 -0.0824351 -0.393132 0.000797218 0.12548 -0.00680383 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1245 1295 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.77636e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1295 1296 6.25672 -0.082915 -0.393079 0.000787543 0.125472 -0.0069583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1246 1296 1.59517e-11 -3.05972 -0.0937068 0.0612327 3.19744e-13 1.77636e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1296 1297 6.25628 -0.0833947 -0.393025 0.00077787 0.125463 -0.00711277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1247 1297 1.59517e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 1.33227e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1297 1298 6.25584 -0.0838744 -0.39297 0.000768201 0.125455 -0.00726722 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1248 1298 1.59499e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 8.88178e-16 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1298 1299 6.25538 -0.0843539 -0.392913 0.000758534 0.125446 -0.00742166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1249 1299 1.59455e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 4.44089e-16 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1299 1300 6.25492 -0.0848333 -0.392855 0.00074887 0.125436 -0.00757609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1250 1300 1.59445e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 0 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1300 1301 6.25444 -0.0853125 -0.392796 0.000739208 0.125427 -0.0077305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1251 1301 1.59419e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -4.44089e-16 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1301 1302 6.25396 -0.0857915 -0.392736 0.00072955 0.125417 -0.00788491 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1252 1302 1.5941e-11 -3.05972 -0.0937068 0.0612327 3.19744e-13 -8.88178e-16 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1302 1303 6.25347 -0.0862705 -0.392675 0.000719895 0.125408 -0.0080393 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1253 1303 1.59481e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.33227e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1303 1304 6.25296 -0.0867493 -0.392612 0.000710243 0.125398 -0.00819368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1254 1304 1.59375e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.77636e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1304 1305 6.25245 -0.0872279 -0.392549 0.000700594 0.125388 -0.00834805 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1255 1305 1.59375e-11 -3.05972 -0.0937068 0.0612327 3.19744e-13 -1.77636e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1305 1306 6.25193 -0.0877063 -0.392484 0.000690948 0.125377 -0.0085024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1256 1306 1.5941e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -2.22045e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1306 1307 6.2514 -0.0881846 -0.392418 0.000681305 0.125367 -0.00865674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1257 1307 1.59339e-11 -3.05972 -0.0937068 0.0612327 3.19744e-13 -2.66454e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1307 1308 6.25086 -0.0886628 -0.39235 0.000671666 0.125356 -0.00881107 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1258 1308 1.59339e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -3.10862e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1308 1309 6.25031 -0.0891408 -0.392282 0.00066203 0.125345 -0.00896538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1259 1309 1.59304e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -3.55271e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1309 1310 6.24975 -0.0896186 -0.392213 0.000652397 0.125334 -0.00911968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1260 1310 1.59304e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -3.9968e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1310 1311 6.24918 -0.0900962 -0.392142 0.000642768 0.125323 -0.00927397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1261 1311 1.59304e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -4.44089e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1311 1312 6.24861 -0.0905737 -0.39207 0.000633142 0.125311 -0.00942824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1262 1312 1.59281e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -4.88498e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1312 1313 6.24802 -0.0910509 -0.391997 0.00062352 0.1253 -0.0095825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1263 1313 1.59268e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -4.88498e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1313 1314 6.24742 -0.091528 -0.391923 0.000613902 0.125288 -0.00973674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1264 1314 1.59268e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -5.32907e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1314 1315 6.24682 -0.092005 -0.391847 0.000604288 0.125276 -0.00989097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1265 1315 1.59233e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -5.77316e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1315 1316 6.2462 -0.0924817 -0.391771 0.000594677 0.125264 -0.0100452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1266 1316 1.59268e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -6.21725e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1316 1317 6.24558 -0.0929582 -0.391693 0.00058507 0.125251 -0.0101994 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1267 1317 1.59197e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -6.66134e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1317 1318 6.24494 -0.0934346 -0.391614 0.000575466 0.125239 -0.0103536 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1268 1318 1.59197e-11 -3.05972 -0.0937068 0.0612327 3.19744e-13 -7.10543e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1318 1319 6.2443 -0.0939107 -0.391534 0.000565867 0.125226 -0.0105077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1269 1319 1.59197e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -7.54952e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1319 1320 6.24365 -0.0943867 -0.391453 0.000556272 0.125213 -0.0106619 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1270 1320 1.59162e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -7.99361e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1320 1321 6.24299 -0.0948625 -0.391371 0.000546681 0.1252 -0.010816 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1271 1321 1.59197e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -8.43769e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1321 1322 6.24232 -0.095338 -0.391287 0.000537094 0.125186 -0.0109701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1272 1322 1.59126e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -8.43769e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1322 1323 6.24164 -0.0958134 -0.391202 0.000527511 0.125173 -0.0111242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1273 1323 1.59108e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -8.88178e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1323 1324 6.24095 -0.0962885 -0.391116 0.000517932 0.125159 -0.0112783 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1274 1324 1.59082e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -9.32587e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1324 1325 6.24025 -0.0967634 -0.391029 0.000508358 0.125145 -0.0114324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1275 1325 1.59066e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -9.76996e-15 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1325 1326 6.23954 -0.0972381 -0.390941 0.000498788 0.125131 -0.0115864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1276 1326 1.59046e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.02141e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1326 1327 6.23882 -0.0977126 -0.390852 0.000489222 0.125117 -0.0117404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1277 1327 1.59037e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.06581e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1327 1328 6.23809 -0.0981869 -0.390761 0.000479661 0.125102 -0.0118944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1278 1328 1.58984e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.11022e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1328 1329 6.23736 -0.098661 -0.39067 0.000470105 0.125088 -0.0120484 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1279 1329 1.58984e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.15463e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1329 1330 6.23661 -0.0991348 -0.390577 0.000460553 0.125073 -0.0122024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1280 1330 1.58913e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.15463e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1330 1331 6.23585 -0.0996084 -0.390483 0.000451005 0.125058 -0.0123564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1281 1331 1.58948e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.19904e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1331 1332 6.23509 -0.100082 -0.390388 0.000441462 0.125043 -0.0125103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1282 1332 1.59019e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.24345e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1332 1333 6.23432 -0.100555 -0.390291 0.000431925 0.125027 -0.0126642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1283 1333 1.58948e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.28786e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1333 1334 6.23353 -0.101028 -0.390194 0.000422391 0.125012 -0.0128181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1284 1334 1.58842e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.33227e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1334 1335 6.23274 -0.1015 -0.390095 0.000412863 0.124996 -0.012972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1285 1335 1.58877e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.37668e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1335 1336 6.23194 -0.101973 -0.389995 0.00040334 0.12498 -0.0131258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1286 1336 1.58842e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.42109e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1336 1337 6.23113 -0.102445 -0.389894 0.000393821 0.124964 -0.0132797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1287 1337 1.58833e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.46549e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1337 1338 6.23031 -0.102917 -0.389792 0.000384308 0.124947 -0.0134335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1288 1338 1.58815e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.46549e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1338 1339 6.22948 -0.103389 -0.389689 0.0003748 0.124931 -0.0135873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1289 1339 1.58789e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.5099e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1339 1340 6.22864 -0.10386 -0.389585 0.000365297 0.124914 -0.0137411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1290 1340 1.58753e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.55431e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1340 1341 6.22779 -0.104331 -0.389479 0.000355799 0.124897 -0.0138948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1291 1341 1.58771e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.59872e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1341 1342 6.22693 -0.104802 -0.389372 0.000346306 0.12488 -0.0140485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1292 1342 1.587e-11 -3.05972 -0.0937068 0.0612327 3.193e-13 -1.64313e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1342 1343 6.22606 -0.105273 -0.389264 0.000336819 0.124863 -0.0142023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1293 1343 1.58771e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.68754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1343 1344 6.22518 -0.105743 -0.389155 0.000327337 0.124845 -0.0143559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1294 1344 1.587e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.73195e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1344 1345 6.2243 -0.106213 -0.389045 0.000317861 0.124828 -0.0145096 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1295 1345 1.58664e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.77636e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1345 1346 6.2234 -0.106683 -0.388934 0.00030839 0.12481 -0.0146632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1296 1346 1.58593e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.82077e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1346 1347 6.2225 -0.107153 -0.388821 0.000298925 0.124792 -0.0148169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1297 1347 1.58629e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.82077e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1347 1348 6.22158 -0.107622 -0.388708 0.000289465 0.124773 -0.0149705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1298 1348 1.58575e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.86517e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1348 1349 6.22066 -0.108091 -0.388593 0.000280011 0.124755 -0.015124 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1299 1349 1.58558e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.90958e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1349 1350 6.21973 -0.10856 -0.388477 0.000270563 0.124736 -0.0152776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1300 1350 1.58538e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.95399e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1350 1351 6.21879 -0.109028 -0.38836 0.00026112 0.124718 -0.0154311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1301 1351 1.58504e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -1.9984e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1351 1352 6.21783 -0.109496 -0.388242 0.000251683 0.124699 -0.0155846 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1302 1352 1.58487e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.04281e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1352 1353 6.21687 -0.109964 -0.388122 0.000242253 0.124679 -0.0157381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1303 1353 1.58451e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.08722e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1353 1354 6.2159 -0.110431 -0.388002 0.000232828 0.12466 -0.0158915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1304 1354 1.58451e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.13163e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1354 1355 6.21492 -0.110899 -0.38788 0.000223409 0.124641 -0.016045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1305 1355 1.58451e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.13163e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1355 1356 6.21393 -0.111366 -0.387757 0.000213996 0.124621 -0.0161984 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1306 1356 1.5838e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.17604e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1356 1357 6.21294 -0.111832 -0.387633 0.00020459 0.124601 -0.0163518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1307 1357 1.58344e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.22045e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1357 1358 6.21193 -0.112299 -0.387508 0.000195189 0.124581 -0.0165051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1308 1358 1.58344e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.26485e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1358 1359 6.21091 -0.112765 -0.387382 0.000185795 0.12456 -0.0166584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1309 1359 1.58344e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.30926e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1359 1360 6.20989 -0.11323 -0.387255 0.000176407 0.12454 -0.0168117 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1310 1360 1.58273e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.35367e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1360 1361 6.20885 -0.113696 -0.387126 0.000167026 0.124519 -0.016965 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1311 1361 1.58256e-11 -3.05972 -0.0937068 0.0612327 3.18856e-13 -2.39808e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1361 1362 6.20781 -0.114161 -0.386997 0.000157651 0.124498 -0.0171183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1312 1362 1.58233e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.44249e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1362 1363 6.20675 -0.114626 -0.386866 0.000148282 0.124477 -0.0172715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1313 1363 1.58207e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.44249e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1363 1364 6.20569 -0.11509 -0.386734 0.00013892 0.124456 -0.0174247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1314 1364 1.58167e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.4869e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1364 1365 6.20462 -0.115554 -0.386601 0.000129565 0.124435 -0.0175779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1315 1365 1.58149e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.53131e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1365 1366 6.20353 -0.116018 -0.386467 0.000120216 0.124413 -0.017731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1316 1366 1.58131e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.57572e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1366 1367 6.20244 -0.116482 -0.386331 0.000110874 0.124391 -0.0178841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1317 1367 1.58131e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.62013e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1367 1368 6.20134 -0.116945 -0.386195 0.000101538 0.124369 -0.0180372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1318 1368 1.5806e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.66454e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1368 1369 6.20023 -0.117408 -0.386057 9.22099e-05 0.124347 -0.0181903 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1319 1369 1.57989e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.70894e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1369 1370 6.19911 -0.11787 -0.385918 8.28882e-05 0.124325 -0.0183433 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1320 1370 1.58025e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1370 1371 6.19799 -0.118332 -0.385778 7.35735e-05 0.124302 -0.0184963 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1321 1371 1.57954e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.75335e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1371 1372 6.19685 -0.118794 -0.385637 6.42657e-05 0.124279 -0.0186493 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1322 1372 1.57954e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.79776e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1372 1373 6.1957 -0.119255 -0.385495 5.4965e-05 0.124256 -0.0188022 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1323 1373 1.57936e-11 -3.05972 -0.0937068 0.0612327 3.18412e-13 -2.84217e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1373 1374 6.19454 -0.119717 -0.385352 4.56714e-05 0.124233 -0.0189552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1324 1374 1.579e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -2.88658e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1374 1375 6.19338 -0.120177 -0.385208 3.63849e-05 0.12421 -0.019108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1325 1375 1.57861e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -2.93099e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1375 1376 6.1922 -0.120638 -0.385062 2.71057e-05 0.124187 -0.0192609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1326 1376 1.57838e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -2.9754e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1376 1377 6.19102 -0.121098 -0.384915 1.78337e-05 0.124163 -0.0194137 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1327 1377 1.57812e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.01981e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1377 1378 6.18983 -0.121557 -0.384768 8.569e-06 0.124139 -0.0195665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1328 1378 1.57776e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.06422e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1378 1379 6.18862 -0.122017 -0.384619 -6.88288e-07 0.124115 -0.0197193 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1329 1379 1.5774e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1379 1380 6.18741 -0.122476 -0.384469 -9.93815e-06 0.124091 -0.019872 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1330 1380 1.57705e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.10862e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1380 1381 6.18619 -0.122934 -0.384318 -1.91805e-05 0.124066 -0.0200247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1331 1381 1.5774e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.15303e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1381 1382 6.18496 -0.123392 -0.384165 -2.84153e-05 0.124042 -0.0201774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1332 1382 1.57563e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.19744e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1382 1383 6.18372 -0.12385 -0.384012 -3.76426e-05 0.124017 -0.0203301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1333 1383 1.57634e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.24185e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1383 1384 6.18247 -0.124308 -0.383857 -4.68621e-05 0.123992 -0.0204827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1334 1384 1.57634e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.28626e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1384 1385 6.18121 -0.124765 -0.383702 -5.6074e-05 0.123967 -0.0206353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1335 1385 1.57563e-11 -3.05972 -0.0937068 0.0612327 3.17968e-13 -3.33067e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1385 1386 6.17994 -0.125221 -0.383545 -6.5278e-05 0.123941 -0.0207878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1336 1386 1.5751e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.37508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1386 1387 6.17867 -0.125678 -0.383387 -7.44743e-05 0.123916 -0.0209403 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1337 1387 1.57474e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1387 1388 6.17738 -0.126134 -0.383228 -8.36627e-05 0.12389 -0.0210928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1338 1388 1.57452e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.41949e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1388 1389 6.17609 -0.126589 -0.383068 -9.28431e-05 0.123864 -0.0212453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1339 1389 1.57421e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.4639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1389 1390 6.17478 -0.127044 -0.382907 -0.000102016 0.123838 -0.0213977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1340 1390 1.57385e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.5083e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1390 1391 6.17347 -0.127499 -0.382744 -0.00011118 0.123812 -0.0215501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1341 1391 1.57385e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.55271e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1391 1392 6.17214 -0.127953 -0.382581 -0.000120336 0.123785 -0.0217024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1342 1392 1.5735e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.59712e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1392 1393 6.17081 -0.128407 -0.382416 -0.000129484 0.123759 -0.0218547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1343 1393 1.57279e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.64153e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1393 1394 6.16947 -0.128861 -0.382251 -0.000138624 0.123732 -0.022007 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1344 1394 1.57208e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.68594e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1394 1395 6.16812 -0.129314 -0.382084 -0.000147756 0.123705 -0.0221593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1345 1395 1.57243e-11 -3.05972 -0.0937068 0.0612327 3.17524e-13 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1395 1396 6.16676 -0.129767 -0.381916 -0.000156879 0.123677 -0.0223115 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1346 1396 1.57208e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -3.73035e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1396 1397 6.16539 -0.130219 -0.381747 -0.000165994 0.12365 -0.0224637 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1347 1397 1.57101e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -3.77476e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1397 1398 6.16401 -0.130671 -0.381577 -0.000175101 0.123622 -0.0226158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1348 1398 1.57119e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -3.81917e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1398 1399 6.16262 -0.131122 -0.381406 -0.000184199 0.123595 -0.022768 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1349 1399 1.57083e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -3.86358e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1399 1400 6.16122 -0.131573 -0.381233 -0.000193288 0.123567 -0.02292 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1350 1400 1.57037e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -3.90799e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1400 1401 6.15982 -0.132024 -0.38106 -0.000202369 0.123538 -0.0230721 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1351 1401 1.57003e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -3.95239e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1401 1402 6.1584 -0.132474 -0.380885 -0.000211441 0.12351 -0.0232241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1352 1402 1.56941e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -3.9968e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1402 1403 6.15698 -0.132924 -0.38071 -0.000220505 0.123482 -0.0233761 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1353 1403 1.56959e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -4.04121e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1403 1404 6.15554 -0.133373 -0.380533 -0.000229559 0.123453 -0.023528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1354 1404 1.56888e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -4.04121e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1404 1405 6.1541 -0.133822 -0.380355 -0.000238605 0.123424 -0.0236799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1355 1405 1.56817e-11 -3.05972 -0.0937068 0.0612327 3.1708e-13 -4.08562e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1405 1406 6.15265 -0.134271 -0.380176 -0.000247642 0.123395 -0.0238318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1356 1406 1.56817e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.13003e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1406 1407 6.15119 -0.134719 -0.379996 -0.00025667 0.123366 -0.0239836 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1357 1407 1.56746e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.17444e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1407 1408 6.14971 -0.135166 -0.379815 -0.00026569 0.123336 -0.0241354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1358 1408 1.56746e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.21885e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1408 1409 6.14823 -0.135613 -0.379633 -0.0002747 0.123307 -0.0242871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1359 1409 1.5671e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.26326e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1409 1410 6.14674 -0.13606 -0.37945 -0.000283701 0.123277 -0.0244388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1360 1410 1.56675e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.30767e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1410 1411 6.14525 -0.136506 -0.379265 -0.000292692 0.123247 -0.0245905 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1361 1411 1.56621e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.30767e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1411 1412 6.14374 -0.136952 -0.37908 -0.000301675 0.123216 -0.0247422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1362 1412 1.56595e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.35207e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1412 1413 6.14222 -0.137397 -0.378893 -0.000310648 0.123186 -0.0248938 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1363 1413 1.56555e-11 -3.05972 -0.0937068 0.0612327 3.16636e-13 -4.39648e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1413 1414 6.14069 -0.137842 -0.378705 -0.000319612 0.123155 -0.0250453 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1364 1414 1.56515e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 -4.44089e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1414 1415 6.13916 -0.138287 -0.378517 -0.000328567 0.123125 -0.0251968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1365 1415 1.56479e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 -4.4853e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1415 1416 6.13761 -0.13873 -0.378327 -0.000337512 0.123094 -0.0253483 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1366 1416 1.56462e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 -4.52971e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1416 1417 6.13606 -0.139174 -0.378136 -0.000346448 0.123063 -0.0254998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1367 1417 1.56426e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 -4.57412e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1417 1418 6.1345 -0.139617 -0.377944 -0.000355375 0.123031 -0.0256512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1368 1418 1.56355e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 -4.61853e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1418 1419 6.13292 -0.140059 -0.377751 -0.000364291 0.123 -0.0258025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1369 1419 1.56319e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 -4.61853e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1419 1420 6.13134 -0.140502 -0.377556 -0.000373198 0.122968 -0.0259539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1370 1420 1.56284e-11 -3.05972 -0.0937068 0.0612327 3.16192e-13 -4.66294e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1420 1421 6.12975 -0.140943 -0.377361 -0.000382096 0.122936 -0.0261052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1371 1421 1.56213e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -4.70735e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1421 1422 6.12815 -0.141384 -0.377165 -0.000390983 0.122904 -0.0262564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1372 1422 1.56213e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -4.75175e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1422 1423 6.12654 -0.141825 -0.376967 -0.000399861 0.122872 -0.0264076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1373 1423 1.56142e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -4.79616e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1423 1424 6.12492 -0.142265 -0.376769 -0.000408729 0.12284 -0.0265588 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1374 1424 1.56097e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -4.84057e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1424 1425 6.1233 -0.142705 -0.376569 -0.000417587 0.122807 -0.0267099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1375 1425 1.56065e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -4.88498e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1425 1426 6.12166 -0.143144 -0.376369 -0.000426435 0.122774 -0.026861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1376 1426 1.56017e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -4.92939e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1426 1427 6.12001 -0.143582 -0.376167 -0.000435273 0.122741 -0.027012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1377 1427 1.55982e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -4.92939e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1427 1428 6.11836 -0.144021 -0.375964 -0.000444101 0.122708 -0.027163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1378 1428 1.55893e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -4.9738e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1428 1429 6.11669 -0.144458 -0.37576 -0.000452919 0.122675 -0.027314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1379 1429 1.55858e-11 -3.05972 -0.0937068 0.0612327 3.15747e-13 -5.01821e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1429 1430 6.11502 -0.144895 -0.375555 -0.000461727 0.122641 -0.0274649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1380 1430 1.55822e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -5.06262e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1430 1431 6.11334 -0.145332 -0.375349 -0.000470524 0.122607 -0.0276158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1381 1431 1.55786e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -5.10703e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1431 1432 6.11165 -0.145768 -0.375142 -0.000479312 0.122573 -0.0277666 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1382 1432 1.55822e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -5.15143e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1432 1433 6.10994 -0.146204 -0.374934 -0.000488089 0.122539 -0.0279174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1383 1433 1.55751e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -5.19584e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1433 1434 6.10823 -0.146639 -0.374724 -0.000496855 0.122505 -0.0280681 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1384 1434 1.5568e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -5.24025e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1434 1435 6.10651 -0.147074 -0.374514 -0.000505611 0.122471 -0.0282188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1385 1435 1.55609e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -5.24025e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1435 1436 6.10479 -0.147508 -0.374303 -0.000514357 0.122436 -0.0283695 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1386 1436 1.55573e-11 -3.05972 -0.0937068 0.0612327 3.15303e-13 -5.28466e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1436 1437 6.10305 -0.147941 -0.37409 -0.000523092 0.122401 -0.0285201 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1387 1437 1.55547e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 -5.32907e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1437 1438 6.1013 -0.148375 -0.373877 -0.000531816 0.122366 -0.0286707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1388 1438 1.55502e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 -5.37348e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1438 1439 6.09955 -0.148807 -0.373662 -0.00054053 0.122331 -0.0288212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1389 1439 1.55502e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 -5.41789e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1439 1440 6.09778 -0.149239 -0.373447 -0.000549233 0.122296 -0.0289717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1390 1440 1.55413e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 -5.4623e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1440 1441 6.09601 -0.149671 -0.37323 -0.000557925 0.12226 -0.0291221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1391 1441 1.5536e-11 -3.05972 -0.0937068 0.0612327 3.14859e-13 -5.50671e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1441 1442 6.09422 -0.150102 -0.373012 -0.000566607 0.122224 -0.0292725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1392 1442 1.55289e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.50671e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1442 1443 6.09243 -0.150532 -0.372793 -0.000575278 0.122188 -0.0294228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1393 1443 1.55289e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.55112e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1443 1444 6.09063 -0.150962 -0.372574 -0.000583937 0.122152 -0.0295731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1394 1444 1.55218e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.59552e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1444 1445 6.08882 -0.151391 -0.372353 -0.000592586 0.122116 -0.0297234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1395 1445 1.55218e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.63993e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1445 1446 6.087 -0.15182 -0.372131 -0.000601224 0.122079 -0.0298736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1396 1446 1.55147e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.68434e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1446 1447 6.08517 -0.152248 -0.371908 -0.000609851 0.122043 -0.0300238 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1397 1447 1.55076e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.72875e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1447 1448 6.08333 -0.152676 -0.371684 -0.000618466 0.122006 -0.0301739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1398 1448 1.55058e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.77316e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1448 1449 6.08148 -0.153103 -0.371459 -0.00062707 0.121969 -0.0303239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1399 1449 1.54978e-11 -3.05972 -0.0937068 0.0612327 3.14415e-13 -5.81757e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1449 1450 6.07963 -0.15353 -0.371233 -0.000635664 0.121932 -0.030474 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1400 1450 1.54947e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 -5.81757e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1450 1451 6.07776 -0.153956 -0.371005 -0.000644246 0.121894 -0.0306239 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1401 1451 1.54898e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 -5.86198e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1451 1452 6.07589 -0.154381 -0.370777 -0.000652816 0.121857 -0.0307739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1402 1452 1.54863e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 -5.90639e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1452 1453 6.074 -0.154806 -0.370548 -0.000661375 0.121819 -0.0309237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1403 1453 1.54792e-11 -3.05972 -0.0937068 0.0612327 3.13971e-13 -5.9508e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1453 1454 6.07211 -0.155231 -0.370318 -0.000669923 0.121781 -0.0310736 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1404 1454 1.54756e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 -5.9952e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1454 1455 6.07021 -0.155654 -0.370086 -0.000678459 0.121743 -0.0312234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1405 1455 1.54685e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 -6.03961e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1455 1456 6.0683 -0.156078 -0.369854 -0.000686984 0.121704 -0.0313731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1406 1456 1.54543e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 -6.08402e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1456 1457 6.06638 -0.1565 -0.36962 -0.000695497 0.121666 -0.0315228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1407 1457 1.54614e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 -6.12843e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1457 1458 6.06445 -0.156922 -0.369386 -0.000703999 0.121627 -0.0316724 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1408 1458 1.54543e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 -6.12843e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1458 1459 6.06251 -0.157344 -0.369151 -0.000712488 0.121588 -0.031822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1409 1459 1.54472e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 -6.17284e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1459 1460 6.06056 -0.157765 -0.368914 -0.000720967 0.121549 -0.0319716 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1410 1460 1.54454e-11 -3.05972 -0.0937068 0.0612327 3.13527e-13 -6.21725e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1460 1461 6.05861 -0.158185 -0.368676 -0.000729433 0.12151 -0.032121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1411 1461 1.54419e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 -6.26166e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1461 1462 6.05664 -0.158605 -0.368438 -0.000737887 0.121471 -0.0322705 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1412 1462 1.54357e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 -6.30607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1462 1463 6.05467 -0.159024 -0.368198 -0.00074633 0.121431 -0.0324199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1413 1463 1.54312e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 -6.35048e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1463 1464 6.05268 -0.159443 -0.367958 -0.00075476 0.121391 -0.0325692 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1414 1464 1.54259e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 -6.39488e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1464 1465 6.05069 -0.159861 -0.367716 -0.000763179 0.121351 -0.0327185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1415 1465 1.54188e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 -6.39488e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1465 1466 6.04869 -0.160278 -0.367473 -0.000771585 0.121311 -0.0328678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1416 1466 1.54117e-11 -3.05972 -0.0937068 0.0612327 3.13083e-13 -6.43929e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1466 1467 6.04668 -0.160695 -0.36723 -0.00077998 0.121271 -0.033017 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1417 1467 1.54046e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 -6.4837e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1467 1468 6.04466 -0.161111 -0.366985 -0.000788362 0.12123 -0.0331661 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1418 1468 1.54046e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 -6.52811e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1468 1469 6.04263 -0.161527 -0.366739 -0.000796732 0.12119 -0.0333152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1419 1469 1.53975e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 -6.57252e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1469 1470 6.04059 -0.161942 -0.366492 -0.00080509 0.121149 -0.0334642 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1420 1470 1.53975e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 -6.61693e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1470 1471 6.03854 -0.162356 -0.366245 -0.000813436 0.121108 -0.0336132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1421 1471 1.53868e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 -6.66134e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1471 1472 6.03648 -0.16277 -0.365996 -0.000821769 0.121066 -0.0337621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1422 1472 1.53833e-11 -3.05972 -0.0937068 0.0612327 3.12639e-13 -6.66134e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1472 1473 6.03442 -0.163183 -0.365746 -0.00083009 0.121025 -0.033911 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1423 1473 1.53815e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 -6.70575e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1473 1474 6.03234 -0.163596 -0.365495 -0.000838398 0.120983 -0.0340599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1424 1474 1.53726e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 -6.75016e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1474 1475 6.03026 -0.164008 -0.365244 -0.000846694 0.120942 -0.0342086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1425 1475 1.53683e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 -6.79456e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1475 1476 6.02817 -0.164419 -0.364991 -0.000854977 0.1209 -0.0343574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1426 1476 1.53637e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 -6.83897e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1476 1477 6.02607 -0.16483 -0.364737 -0.000863248 0.120857 -0.034506 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1427 1477 1.53566e-11 -3.05972 -0.0937068 0.0612327 3.12195e-13 -6.88338e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1477 1478 6.02396 -0.16524 -0.364482 -0.000871506 0.120815 -0.0346546 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1428 1478 1.53548e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 -6.92779e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1478 1479 6.02184 -0.16565 -0.364226 -0.000879751 0.120773 -0.0348032 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1429 1479 1.53477e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 -6.92779e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1479 1480 6.01971 -0.166059 -0.363969 -0.000887984 0.12073 -0.0349517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1430 1480 1.53442e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 -6.9722e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1480 1481 6.01757 -0.166467 -0.363711 -0.000896203 0.120687 -0.0351002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1431 1481 1.533e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 -7.01661e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1481 1482 6.01542 -0.166874 -0.363453 -0.00090441 0.120644 -0.0352486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1432 1482 1.53264e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 -7.06102e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1482 1483 6.01327 -0.167281 -0.363193 -0.000912604 0.120601 -0.0353969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1433 1483 1.533e-11 -3.05972 -0.0937068 0.0612327 3.11751e-13 -7.10543e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1483 1484 6.0111 -0.167688 -0.362932 -0.000920785 0.120557 -0.0355452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1434 1484 1.53193e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 -7.14984e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1484 1485 6.00893 -0.168093 -0.36267 -0.000928953 0.120514 -0.0356935 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1435 1485 1.5314e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 -7.19425e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1485 1486 6.00675 -0.168498 -0.362407 -0.000937109 0.12047 -0.0358416 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1436 1486 1.53086e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 -7.19425e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1486 1487 6.00455 -0.168903 -0.362144 -0.00094525 0.120426 -0.0359898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1437 1487 1.5302e-11 -3.05972 -0.0937068 0.0612327 3.11307e-13 -7.23865e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1487 1488 6.00235 -0.169307 -0.361879 -0.000953379 0.120382 -0.0361378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1438 1488 1.52971e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 -7.28306e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1488 1489 6.00014 -0.16971 -0.361613 -0.000961495 0.120337 -0.0362859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1439 1489 1.52891e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 -7.32747e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1489 1490 5.99793 -0.170112 -0.361346 -0.000969597 0.120293 -0.0364338 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1440 1490 1.52856e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 -7.37188e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1490 1491 5.9957 -0.170514 -0.361078 -0.000977686 0.120248 -0.0365817 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1441 1491 1.52802e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 -7.41629e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1491 1492 5.99346 -0.170915 -0.36081 -0.000985762 0.120203 -0.0367296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1442 1492 1.52767e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 -7.4607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1492 1493 5.99121 -0.171315 -0.36054 -0.000993824 0.120158 -0.0368774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1443 1493 1.5266e-11 -3.05972 -0.0937068 0.0612327 3.10862e-13 -7.4607e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1493 1494 5.98896 -0.171715 -0.360269 -0.00100187 0.120113 -0.0370251 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1444 1494 1.52625e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 -7.50511e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1494 1495 5.9867 -0.172114 -0.359998 -0.00100991 0.120067 -0.0371728 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1445 1495 1.52554e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 -7.54952e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1495 1496 5.98442 -0.172513 -0.359725 -0.00101793 0.120022 -0.0373204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1446 1496 1.52482e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 -7.59393e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1496 1497 5.98214 -0.172911 -0.359451 -0.00102594 0.119976 -0.037468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1447 1497 1.52447e-11 -3.05972 -0.0937068 0.0612327 3.10418e-13 -7.63833e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1497 1498 5.97985 -0.173308 -0.359177 -0.00103393 0.11993 -0.0376155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1448 1498 1.52376e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 -7.68274e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1498 1499 5.97755 -0.173704 -0.358901 -0.00104191 0.119884 -0.0377629 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1449 1499 1.5234e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 -7.72715e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1499 1500 5.97524 -0.1741 -0.358624 -0.00104988 0.119838 -0.0379103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1450 1500 1.52276e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 -7.72715e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1500 1501 5.97292 -0.174495 -0.358347 -0.00105783 0.119791 -0.0380576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1451 1501 1.52225e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 -7.77156e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1501 1502 5.9706 -0.17489 -0.358068 -0.00106577 0.119744 -0.0382049 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1452 1502 1.52163e-11 -3.05972 -0.0937068 0.0612327 3.09974e-13 -7.81597e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1502 1503 5.96826 -0.175283 -0.357789 -0.0010737 0.119698 -0.0383521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1453 1503 1.52056e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 -7.86038e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1503 1504 5.96592 -0.175676 -0.357509 -0.00108161 0.119651 -0.0384993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1454 1504 1.52056e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 -7.90479e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1504 1505 5.96357 -0.176069 -0.357227 -0.00108951 0.119603 -0.0386464 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1455 1505 1.52056e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 -7.9492e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1505 1506 5.9612 -0.176461 -0.356945 -0.00109739 0.119556 -0.0387934 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1456 1506 1.5195e-11 -3.05972 -0.0937068 0.0612327 3.0953e-13 -7.99361e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1506 1507 5.95883 -0.176852 -0.356662 -0.00110526 0.119508 -0.0389404 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1457 1507 1.51879e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 -7.99361e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1507 1508 5.95645 -0.177242 -0.356377 -0.00111312 0.119461 -0.0390873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1458 1508 1.51807e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 -8.03801e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1508 1509 5.95406 -0.177631 -0.356092 -0.00112096 0.119413 -0.0392342 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1459 1509 1.51736e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 -8.08242e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1509 1510 5.95166 -0.17802 -0.355806 -0.00112879 0.119364 -0.039381 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1460 1510 1.51665e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 -8.12683e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1510 1511 5.94926 -0.178409 -0.355519 -0.0011366 0.119316 -0.0395277 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1461 1511 1.51594e-11 -3.05972 -0.0937068 0.0612327 3.09086e-13 -8.17124e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1511 1512 5.94684 -0.178796 -0.355231 -0.0011444 0.119268 -0.0396744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1462 1512 1.51554e-11 -3.05972 -0.0937068 0.0612327 3.08642e-13 -8.21565e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1512 1513 5.94442 -0.179183 -0.354942 -0.00115218 0.119219 -0.039821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1463 1513 1.51483e-11 -3.05972 -0.0937068 0.0612327 3.08642e-13 -8.26006e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1513 1514 5.94198 -0.179569 -0.354652 -0.00115995 0.11917 -0.0399675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1464 1514 1.51417e-11 -3.05972 -0.0937068 0.0612327 3.08642e-13 -8.26006e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1514 1515 5.93954 -0.179954 -0.354361 -0.00116771 0.119121 -0.040114 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1465 1515 1.51381e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 -8.30447e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1515 1516 5.93709 -0.180339 -0.354069 -0.00117545 0.119072 -0.0402604 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1466 1516 1.5131e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 -8.34888e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1516 1517 5.93463 -0.180723 -0.353776 -0.00118318 0.119023 -0.0404068 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1467 1517 1.51203e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 -8.39329e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1517 1518 5.93216 -0.181106 -0.353482 -0.00119089 0.118973 -0.0405531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1468 1518 1.51239e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 -8.43769e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1518 1519 5.92968 -0.181489 -0.353188 -0.00119859 0.118923 -0.0406994 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1469 1519 1.51097e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 -8.4821e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1519 1520 5.92719 -0.18187 -0.352892 -0.00120627 0.118873 -0.0408455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1470 1520 1.51026e-11 -3.05972 -0.0937068 0.0612327 3.08198e-13 -8.52651e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1520 1521 5.9247 -0.182251 -0.352596 -0.00121394 0.118823 -0.0409916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1471 1521 1.5099e-11 -3.05972 -0.0937068 0.0612327 3.07754e-13 -8.52651e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1521 1522 5.92219 -0.182632 -0.352298 -0.00122159 0.118773 -0.0411377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1472 1522 1.50919e-11 -3.05972 -0.0937068 0.0612327 3.07754e-13 -8.57092e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1522 1523 5.91968 -0.183011 -0.352 -0.00122923 0.118723 -0.0412837 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1473 1523 1.50848e-11 -3.05972 -0.0937068 0.0612327 3.07754e-13 -8.61533e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1523 1524 5.91716 -0.18339 -0.3517 -0.00123685 0.118672 -0.0414296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1474 1524 1.50804e-11 -3.05972 -0.0937068 0.0612327 3.07754e-13 -8.65974e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1524 1525 5.91462 -0.183768 -0.3514 -0.00124446 0.118621 -0.0415755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1475 1525 1.50726e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 -8.70415e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1525 1526 5.91208 -0.184146 -0.351099 -0.00125205 0.11857 -0.0417213 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1476 1526 1.50671e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 -8.74856e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1526 1527 5.90953 -0.184522 -0.350797 -0.00125963 0.118519 -0.041867 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1477 1527 1.50617e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 -8.74856e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1527 1528 5.90698 -0.184898 -0.350494 -0.0012672 0.118468 -0.0420127 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1478 1528 1.50528e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 -8.79297e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1528 1529 5.90441 -0.185273 -0.35019 -0.00127474 0.118416 -0.0421583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1479 1529 1.50457e-11 -3.05972 -0.0937068 0.0612327 3.0731e-13 -8.83738e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1529 1530 5.90183 -0.185648 -0.349885 -0.00128228 0.118364 -0.0423038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1480 1530 1.50422e-11 -3.05972 -0.0937068 0.0612327 3.06866e-13 -8.88178e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1530 1531 5.89925 -0.186021 -0.349579 -0.0012898 0.118312 -0.0424493 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1481 1531 1.50351e-11 -3.05972 -0.0937068 0.0612327 3.06866e-13 -8.92619e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1531 1532 5.89665 -0.186394 -0.349273 -0.0012973 0.11826 -0.0425947 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1482 1532 1.50244e-11 -3.05972 -0.0937068 0.0612327 3.06866e-13 -8.9706e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1532 1533 5.89405 -0.186767 -0.348965 -0.00130479 0.118208 -0.04274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1483 1533 1.50138e-11 -3.05972 -0.0937068 0.0612327 3.06422e-13 -8.9706e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1533 1534 5.89144 -0.187138 -0.348657 -0.00131226 0.118156 -0.0428853 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1484 1534 1.50102e-11 -3.05972 -0.0937068 0.0612327 3.06422e-13 -9.01501e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1534 1535 5.88882 -0.187509 -0.348347 -0.00131972 0.118103 -0.0430305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1485 1535 1.50049e-11 -3.05972 -0.0937068 0.0612327 3.06422e-13 -9.05942e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1535 1536 5.88619 -0.187879 -0.348037 -0.00132716 0.11805 -0.0431757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1486 1536 1.49978e-11 -3.05972 -0.0937068 0.0612327 3.06422e-13 -9.10383e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1536 1537 5.88355 -0.188248 -0.347726 -0.00133458 0.117997 -0.0433207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1487 1537 1.49929e-11 -3.05972 -0.0937068 0.0612327 3.05977e-13 -9.14824e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1537 1538 5.88091 -0.188616 -0.347413 -0.00134199 0.117944 -0.0434658 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1488 1538 1.49858e-11 -3.05972 -0.0937068 0.0612327 3.05977e-13 -9.19265e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1538 1539 5.87825 -0.188984 -0.3471 -0.00134939 0.117891 -0.0436107 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1489 1539 1.49782e-11 -3.05972 -0.0937068 0.0612327 3.05977e-13 -9.23706e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1539 1540 5.87559 -0.18935 -0.346786 -0.00135677 0.117838 -0.0437556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1490 1540 1.49711e-11 -3.05972 -0.0937068 0.0612327 3.05533e-13 -9.23706e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1540 1541 5.87291 -0.189717 -0.346472 -0.00136413 0.117784 -0.0439004 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1491 1541 1.49605e-11 -3.05972 -0.0937068 0.0612327 3.05533e-13 -9.28146e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1541 1542 5.87023 -0.190082 -0.346156 -0.00137148 0.11773 -0.0440451 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1492 1542 1.49605e-11 -3.05972 -0.0937068 0.0612327 3.05533e-13 -9.32587e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1542 1543 5.86754 -0.190446 -0.345839 -0.00137881 0.117676 -0.0441898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1493 1543 1.49463e-11 -3.05972 -0.0937068 0.0612327 3.05533e-13 -9.37028e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1543 1544 5.86484 -0.19081 -0.345522 -0.00138613 0.117622 -0.0443344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1494 1544 1.49498e-11 -3.05972 -0.0937068 0.0612327 3.05533e-13 -9.41469e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1544 1545 5.86213 -0.191173 -0.345203 -0.00139343 0.117567 -0.0444789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1495 1545 1.49392e-11 -3.05972 -0.0937068 0.0612327 3.05089e-13 -9.4591e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1545 1546 5.85942 -0.191535 -0.344884 -0.00140072 0.117513 -0.0446234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1496 1546 1.49321e-11 -3.05972 -0.0937068 0.0612327 3.05089e-13 -9.4591e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1546 1547 5.85669 -0.191897 -0.344564 -0.00140799 0.117458 -0.0447678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1497 1547 1.49267e-11 -3.05972 -0.0937068 0.0612327 3.05089e-13 -9.50351e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1547 1548 5.85396 -0.192257 -0.344243 -0.00141524 0.117403 -0.0449121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1498 1548 1.49161e-11 -3.05972 -0.0937068 0.0612327 3.04645e-13 -9.54792e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1548 1549 5.85121 -0.192617 -0.343921 -0.00142248 0.117348 -0.0450564 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1499 1549 1.49107e-11 -3.05972 -0.0937068 0.0612327 3.04645e-13 -9.59233e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1549 1550 5.84846 -0.192976 -0.343598 -0.0014297 0.117293 -0.0452006 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1500 1550 1.49034e-11 -3.05972 -0.0937068 0.0612327 3.04645e-13 -9.63674e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1550 1551 5.8457 -0.193334 -0.343274 -0.0014369 0.117238 -0.0453447 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1501 1551 1.48956e-11 -3.05972 -0.0937068 0.0612327 3.04645e-13 -9.68114e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1551 1552 5.84293 -0.193692 -0.34295 -0.00144409 0.117182 -0.0454888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1502 1552 1.48894e-11 -3.05972 -0.0937068 0.0612327 3.04201e-13 -9.68114e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1552 1553 5.84015 -0.194049 -0.342624 -0.00145126 0.117126 -0.0456328 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1503 1553 1.48859e-11 -3.05972 -0.0937068 0.0612327 3.04201e-13 -9.72555e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1553 1554 5.83736 -0.194404 -0.342298 -0.00145842 0.11707 -0.0457767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1504 1554 1.48752e-11 -3.05972 -0.0937068 0.0612327 3.04201e-13 -9.76996e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1554 1555 5.83457 -0.194759 -0.341971 -0.00146556 0.117014 -0.0459205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1505 1555 1.48681e-11 -3.05972 -0.0937068 0.0612327 3.04201e-13 -9.81437e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1555 1556 5.83176 -0.195114 -0.341643 -0.00147269 0.116958 -0.0460643 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1506 1556 1.48539e-11 -3.05972 -0.0937068 0.0612327 3.03757e-13 -9.85878e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1556 1557 5.82895 -0.195467 -0.341314 -0.00147979 0.116901 -0.046208 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1507 1557 1.48503e-11 -3.05972 -0.0937068 0.0612327 3.03757e-13 -9.90319e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1557 1558 5.82613 -0.19582 -0.340984 -0.00148689 0.116845 -0.0463516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1508 1558 1.48468e-11 -3.05972 -0.0937068 0.0612327 3.03757e-13 -9.9476e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1558 1559 5.8233 -0.196172 -0.340653 -0.00149396 0.116788 -0.0464952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1509 1559 1.48397e-11 -3.05972 -0.0937068 0.0612327 3.03757e-13 -9.9476e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1559 1560 5.82046 -0.196523 -0.340322 -0.00150102 0.116731 -0.0466387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1510 1560 1.48326e-11 -3.05972 -0.0937068 0.0612327 3.03313e-13 -9.99201e-14 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1560 1561 5.81761 -0.196873 -0.339989 -0.00150806 0.116674 -0.0467821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1511 1561 1.4829e-11 -3.05972 -0.0937068 0.0612327 3.03313e-13 -1.00364e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1561 1562 5.81475 -0.197222 -0.339656 -0.00151509 0.116616 -0.0469254 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1512 1562 1.48179e-11 -3.05972 -0.0937068 0.0612327 3.03313e-13 -1.00808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1562 1563 5.81189 -0.197571 -0.339322 -0.0015221 0.116559 -0.0470687 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1513 1563 1.48104e-11 -3.05972 -0.0937068 0.0612327 3.02869e-13 -1.01252e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1563 1564 5.80901 -0.197919 -0.338987 -0.00152909 0.116501 -0.0472119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1514 1564 1.48024e-11 -3.05972 -0.0937068 0.0612327 3.02869e-13 -1.01696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1564 1565 5.80613 -0.198266 -0.338651 -0.00153606 0.116443 -0.047355 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1515 1565 1.47953e-11 -3.05972 -0.0937068 0.0612327 3.02869e-13 -1.01696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1565 1566 5.80324 -0.198612 -0.338314 -0.00154302 0.116385 -0.0474981 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1516 1566 1.47864e-11 -3.05972 -0.0937068 0.0612327 3.02869e-13 -1.02141e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1566 1567 5.80033 -0.198957 -0.337977 -0.00154997 0.116327 -0.0476411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1517 1567 1.47864e-11 -3.05972 -0.0937068 0.0612327 3.02425e-13 -1.02585e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1567 1568 5.79743 -0.199302 -0.337639 -0.00155689 0.116268 -0.047784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1518 1568 1.47757e-11 -3.05972 -0.0937068 0.0612327 3.02425e-13 -1.03029e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1568 1569 5.79451 -0.199645 -0.337299 -0.0015638 0.11621 -0.0479268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1519 1569 1.47544e-11 -3.05972 -0.0937068 0.0612327 3.02425e-13 -1.03473e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1569 1570 5.79158 -0.199988 -0.336959 -0.00157069 0.116151 -0.0480696 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1520 1570 1.4758e-11 -3.05972 -0.0937068 0.0612327 3.01981e-13 -1.03917e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1570 1571 5.78865 -0.20033 -0.336619 -0.00157757 0.116092 -0.0482122 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1521 1571 1.47509e-11 -3.05972 -0.0937068 0.0612327 3.01981e-13 -1.03917e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1571 1572 5.7857 -0.200671 -0.336277 -0.00158443 0.116033 -0.0483549 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1522 1572 1.4742e-11 -3.05972 -0.0937068 0.0612327 3.01981e-13 -1.04361e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1572 1573 5.78275 -0.201011 -0.335934 -0.00159127 0.115974 -0.0484974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1523 1573 1.47349e-11 -3.05972 -0.0937068 0.0612327 3.01981e-13 -1.04805e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1573 1574 5.77979 -0.201351 -0.335591 -0.00159809 0.115914 -0.0486399 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1524 1574 1.47269e-11 -3.05972 -0.0937068 0.0612327 3.01537e-13 -1.05249e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1574 1575 5.77682 -0.201689 -0.335247 -0.0016049 0.115855 -0.0487822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1525 1575 1.47203e-11 -3.05972 -0.0937068 0.0612327 3.01537e-13 -1.05693e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1575 1576 5.77384 -0.202027 -0.334902 -0.00161169 0.115795 -0.0489246 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1526 1576 1.47118e-11 -3.05972 -0.0937068 0.0612327 3.01537e-13 -1.06137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1576 1577 5.77085 -0.202364 -0.334556 -0.00161846 0.115735 -0.0490668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1527 1577 1.47011e-11 -3.05972 -0.0937068 0.0612327 3.01092e-13 -1.06137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1577 1578 5.76785 -0.2027 -0.334209 -0.00162521 0.115675 -0.049209 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1528 1578 1.46958e-11 -3.05972 -0.0937068 0.0612327 3.01092e-13 -1.06581e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1578 1579 5.76485 -0.203035 -0.333862 -0.00163195 0.115614 -0.049351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1529 1579 1.46905e-11 -3.05972 -0.0937068 0.0612327 3.01092e-13 -1.07025e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1579 1580 5.76184 -0.20337 -0.333513 -0.00163867 0.115554 -0.0494931 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1530 1580 1.46798e-11 -3.05972 -0.0937068 0.0612327 3.01092e-13 -1.0747e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1580 1581 5.75881 -0.203703 -0.333164 -0.00164538 0.115493 -0.049635 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1531 1581 1.46763e-11 -3.05972 -0.0937068 0.0612327 3.00648e-13 -1.07914e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1581 1582 5.75578 -0.204036 -0.332814 -0.00165206 0.115432 -0.0497768 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1532 1582 1.46656e-11 -3.05972 -0.0937068 0.0612327 3.00648e-13 -1.08358e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1582 1583 5.75274 -0.204368 -0.332464 -0.00165873 0.115371 -0.0499186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1533 1583 1.46585e-11 -3.05972 -0.0937068 0.0612327 3.00648e-13 -1.08358e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1583 1584 5.7497 -0.204699 -0.332112 -0.00166538 0.11531 -0.0500603 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1534 1584 1.46443e-11 -3.05972 -0.0937068 0.0612327 3.00204e-13 -1.08802e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1584 1585 5.74664 -0.205029 -0.33176 -0.00167202 0.115249 -0.050202 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1535 1585 1.46443e-11 -3.05972 -0.0937068 0.0612327 3.00204e-13 -1.09246e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1585 1586 5.74357 -0.205358 -0.331406 -0.00167863 0.115187 -0.0503435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1536 1586 1.46336e-11 -3.05972 -0.0937068 0.0612327 3.00204e-13 -1.0969e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1586 1587 5.7405 -0.205686 -0.331052 -0.00168523 0.115126 -0.050485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1537 1587 1.46279e-11 -3.05972 -0.0937068 0.0612327 2.9976e-13 -1.10134e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1587 1588 5.73742 -0.206014 -0.330698 -0.00169181 0.115064 -0.0506264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1538 1588 1.46199e-11 -3.05972 -0.0937068 0.0612327 2.9976e-13 -1.10578e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1588 1589 5.73433 -0.20634 -0.330342 -0.00169838 0.115002 -0.0507677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1539 1589 1.46123e-11 -3.05972 -0.0937068 0.0612327 2.9976e-13 -1.10578e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1589 1590 5.73123 -0.206666 -0.329986 -0.00170492 0.114939 -0.0509089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1540 1590 1.46052e-11 -3.05972 -0.0937068 0.0612327 2.99316e-13 -1.11022e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1590 1591 5.72812 -0.206991 -0.329628 -0.00171145 0.114877 -0.0510501 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1541 1591 1.45945e-11 -3.05972 -0.0937068 0.0612327 2.99316e-13 -1.11466e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1591 1592 5.725 -0.207315 -0.32927 -0.00171796 0.114814 -0.0511912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1542 1592 1.4591e-11 -3.05972 -0.0937068 0.0612327 2.99316e-13 -1.1191e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1592 1593 5.72188 -0.207638 -0.328912 -0.00172446 0.114752 -0.0513322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1543 1593 1.45839e-11 -3.05972 -0.0937068 0.0612327 2.99316e-13 -1.12355e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1593 1594 5.71874 -0.20796 -0.328552 -0.00173093 0.114689 -0.0514731 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1544 1594 1.45697e-11 -3.05972 -0.0937068 0.0612327 2.99316e-13 -1.12799e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1594 1595 5.7156 -0.208282 -0.328192 -0.00173739 0.114626 -0.051614 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1545 1595 1.45626e-11 -3.05972 -0.0937068 0.0612327 2.98872e-13 -1.12799e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1595 1596 5.71245 -0.208602 -0.32783 -0.00174383 0.114562 -0.0517547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1546 1596 1.45555e-11 -3.05972 -0.0937068 0.0612327 2.98872e-13 -1.13243e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1596 1597 5.70929 -0.208922 -0.327469 -0.00175025 0.114499 -0.0518954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1547 1597 1.4543e-11 -3.05972 -0.0937068 0.0612327 2.98428e-13 -1.13687e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1597 1598 5.70612 -0.209241 -0.327106 -0.00175665 0.114435 -0.052036 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1548 1598 1.45413e-11 -3.05972 -0.0937068 0.0612327 2.98428e-13 -1.14131e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1598 1599 5.70294 -0.209558 -0.326742 -0.00176304 0.114372 -0.0521766 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1549 1599 1.45315e-11 -3.05972 -0.0937068 0.0612327 2.98428e-13 -1.14575e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1599 1600 5.69976 -0.209875 -0.326378 -0.0017694 0.114308 -0.052317 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1550 1600 1.45234e-11 -3.05972 -0.0937068 0.0612327 2.97984e-13 -1.14575e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1600 1601 5.69656 -0.210191 -0.326013 -0.00177575 0.114243 -0.0524574 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1551 1601 1.45155e-11 -3.05972 -0.0937068 0.0612327 2.97984e-13 -1.15019e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1601 1602 5.69336 -0.210506 -0.325647 -0.00178208 0.114179 -0.0525977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1552 1602 1.45057e-11 -3.05972 -0.0937068 0.0612327 2.97984e-13 -1.15463e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1602 1603 5.69015 -0.210821 -0.325281 -0.0017884 0.114115 -0.0527379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1553 1603 1.44968e-11 -3.05972 -0.0937068 0.0612327 2.9754e-13 -1.15907e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1603 1604 5.68693 -0.211134 -0.324913 -0.00179469 0.11405 -0.052878 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1554 1604 1.4488e-11 -3.05972 -0.0937068 0.0612327 2.9754e-13 -1.16351e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1604 1605 5.6837 -0.211446 -0.324545 -0.00180097 0.113985 -0.053018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1555 1605 1.44809e-11 -3.05972 -0.0937068 0.0612327 2.9754e-13 -1.16351e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1605 1606 5.68047 -0.211758 -0.324176 -0.00180722 0.11392 -0.053158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1556 1606 1.44809e-11 -3.05972 -0.0937068 0.0612327 2.9754e-13 -1.16795e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1606 1607 5.67722 -0.212069 -0.323807 -0.00181346 0.113855 -0.0532979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1557 1607 1.44667e-11 -3.05972 -0.0937068 0.0612327 2.97096e-13 -1.1724e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1607 1608 5.67397 -0.212378 -0.323436 -0.00181968 0.11379 -0.0534377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1558 1608 1.4456e-11 -3.05972 -0.0937068 0.0612327 2.97096e-13 -1.17684e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1608 1609 5.6707 -0.212687 -0.323065 -0.00182589 0.113724 -0.0535774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1559 1609 1.44489e-11 -3.05972 -0.0937068 0.0612327 2.96652e-13 -1.18128e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1609 1610 5.66743 -0.212995 -0.322693 -0.00183207 0.113659 -0.053717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1560 1610 1.44418e-11 -3.05972 -0.0937068 0.0612327 2.96652e-13 -1.18572e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1610 1611 5.66415 -0.213302 -0.32232 -0.00183824 0.113593 -0.0538566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1561 1611 1.44329e-11 -3.05972 -0.0937068 0.0612327 2.96652e-13 -1.18572e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1611 1612 5.66087 -0.213608 -0.321947 -0.00184438 0.113527 -0.053996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1562 1612 1.44236e-11 -3.05972 -0.0937068 0.0612327 2.96652e-13 -1.19016e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1612 1613 5.65757 -0.213913 -0.321573 -0.00185051 0.113461 -0.0541354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1563 1613 1.4416e-11 -3.05972 -0.0937068 0.0612327 2.96208e-13 -1.1946e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1613 1614 5.65427 -0.214217 -0.321198 -0.00185662 0.113394 -0.0542747 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1564 1614 1.44063e-11 -3.05972 -0.0937068 0.0612327 2.96208e-13 -1.19904e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1614 1615 5.65095 -0.214521 -0.320822 -0.00186272 0.113328 -0.054414 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1565 1615 1.43974e-11 -3.05972 -0.0937068 0.0612327 2.96208e-13 -1.20348e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1615 1616 5.64763 -0.214823 -0.320446 -0.00186879 0.113261 -0.0545531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1566 1616 1.43885e-11 -3.05972 -0.0937068 0.0612327 2.95763e-13 -1.20792e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1616 1617 5.6443 -0.215125 -0.320069 -0.00187484 0.113194 -0.0546921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1567 1617 1.43814e-11 -3.05972 -0.0937068 0.0612327 2.95763e-13 -1.20792e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1617 1618 5.64096 -0.215425 -0.319691 -0.00188088 0.113127 -0.0548311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1568 1618 1.43707e-11 -3.05972 -0.0937068 0.0612327 2.95763e-13 -1.21236e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1618 1619 5.63762 -0.215725 -0.319312 -0.00188689 0.11306 -0.05497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1569 1619 1.43707e-11 -3.05972 -0.0937068 0.0612327 2.95319e-13 -1.2168e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1619 1620 5.63426 -0.216024 -0.318933 -0.00189289 0.112993 -0.0551088 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1570 1620 1.43601e-11 -3.05972 -0.0937068 0.0612327 2.95319e-13 -1.22125e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1620 1621 5.6309 -0.216321 -0.318553 -0.00189887 0.112925 -0.0552475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1571 1621 1.43459e-11 -3.05972 -0.0937068 0.0612327 2.95319e-13 -1.22569e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1621 1622 5.62752 -0.216618 -0.318172 -0.00190483 0.112857 -0.0553861 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1572 1622 1.4337e-11 -3.05972 -0.0937068 0.0612327 2.94875e-13 -1.22569e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1622 1623 5.62414 -0.216914 -0.31779 -0.00191077 0.112789 -0.0555247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1573 1623 1.43316e-11 -3.05972 -0.0937068 0.0612327 2.94875e-13 -1.23013e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1623 1624 5.62075 -0.217209 -0.317408 -0.0019167 0.112721 -0.0556632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1574 1624 1.43219e-11 -3.05972 -0.0937068 0.0612327 2.94875e-13 -1.23457e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1624 1625 5.61736 -0.217503 -0.317025 -0.0019226 0.112653 -0.0558015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1575 1625 1.43129e-11 -3.05972 -0.0937068 0.0612327 2.94431e-13 -1.23901e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1625 1626 5.61395 -0.217796 -0.316641 -0.00192848 0.112585 -0.0559398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1576 1626 1.43059e-11 -3.05972 -0.0937068 0.0612327 2.94431e-13 -1.24345e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1626 1627 5.61054 -0.218088 -0.316257 -0.00193435 0.112516 -0.056078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1577 1627 1.42979e-11 -3.05972 -0.0937068 0.0612327 2.94431e-13 -1.24345e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1627 1628 5.60711 -0.21838 -0.315872 -0.00194019 0.112448 -0.0562161 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1578 1628 1.4289e-11 -3.05972 -0.0937068 0.0612327 2.93987e-13 -1.24789e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1628 1629 5.60368 -0.21867 -0.315486 -0.00194602 0.112379 -0.0563542 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1579 1629 1.42713e-11 -3.05972 -0.0937068 0.0612327 2.93987e-13 -1.25233e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1629 1630 5.60024 -0.218959 -0.315099 -0.00195183 0.11231 -0.0564921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1580 1630 1.42677e-11 -3.05972 -0.0937068 0.0612327 2.93987e-13 -1.25677e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1630 1631 5.59679 -0.219247 -0.314712 -0.00195762 0.11224 -0.05663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1581 1631 1.42606e-11 -3.05972 -0.0937068 0.0612327 2.93543e-13 -1.26121e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1631 1632 5.59334 -0.219535 -0.314324 -0.00196339 0.112171 -0.0567677 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1582 1632 1.42499e-11 -3.05972 -0.0937068 0.0612327 2.93543e-13 -1.26121e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1632 1633 5.58987 -0.219821 -0.313935 -0.00196914 0.112101 -0.0569054 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1583 1633 1.42428e-11 -3.05972 -0.0937068 0.0612327 2.93099e-13 -1.26565e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1633 1634 5.5864 -0.220107 -0.313546 -0.00197487 0.112032 -0.057043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1584 1634 1.42393e-11 -3.05972 -0.0937068 0.0612327 2.93099e-13 -1.2701e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1634 1635 5.58292 -0.220391 -0.313156 -0.00198058 0.111962 -0.0571805 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1585 1635 1.42233e-11 -3.05972 -0.0937068 0.0612327 2.93099e-13 -1.27454e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1635 1636 5.57943 -0.220675 -0.312765 -0.00198627 0.111892 -0.057318 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1586 1636 1.4218e-11 -3.05972 -0.0937068 0.0612327 2.92655e-13 -1.27898e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1636 1637 5.57593 -0.220958 -0.312374 -0.00199195 0.111821 -0.0574553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1587 1637 1.42069e-11 -3.05972 -0.0937068 0.0612327 2.92655e-13 -1.28342e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1637 1638 5.57242 -0.221239 -0.311982 -0.0019976 0.111751 -0.0575925 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1588 1638 1.4198e-11 -3.05972 -0.0937068 0.0612327 2.92655e-13 -1.28342e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1638 1639 5.56891 -0.22152 -0.311589 -0.00200323 0.11168 -0.0577297 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1589 1639 1.41913e-11 -3.05972 -0.0937068 0.0612327 2.92211e-13 -1.28786e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1639 1640 5.56538 -0.2218 -0.311195 -0.00200885 0.11161 -0.0578668 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1590 1640 1.41842e-11 -3.05972 -0.0937068 0.0612327 2.92211e-13 -1.2923e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1640 1641 5.56185 -0.222079 -0.310801 -0.00201444 0.111539 -0.0580037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1591 1641 1.41753e-11 -3.05972 -0.0937068 0.0612327 2.92211e-13 -1.29674e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1641 1642 5.55831 -0.222357 -0.310406 -0.00202002 0.111468 -0.0581406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1592 1642 1.41647e-11 -3.05972 -0.0937068 0.0612327 2.91767e-13 -1.30118e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1642 1643 5.55476 -0.222633 -0.310011 -0.00202557 0.111396 -0.0582774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1593 1643 1.41505e-11 -3.05972 -0.0937068 0.0612327 2.91767e-13 -1.30118e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1643 1644 5.55121 -0.222909 -0.309614 -0.00203111 0.111325 -0.0584141 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1594 1644 1.41469e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 -1.30562e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1644 1645 5.54764 -0.223184 -0.309217 -0.00203663 0.111253 -0.0585508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1595 1645 1.41362e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 -1.31006e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1645 1646 5.54407 -0.223458 -0.30882 -0.00204212 0.111182 -0.0586873 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1596 1646 1.41256e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 -1.3145e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1646 1647 5.54048 -0.223731 -0.308422 -0.0020476 0.11111 -0.0588237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1597 1647 1.41149e-11 -3.05972 -0.0937068 0.0612327 2.91323e-13 -1.31894e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1647 1648 5.53689 -0.224003 -0.308023 -0.00205306 0.111038 -0.0589601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1598 1648 1.41043e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 -1.31894e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1648 1649 5.5333 -0.224274 -0.307623 -0.00205849 0.110965 -0.0590964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1599 1649 1.40989e-11 -3.05972 -0.0937068 0.0612327 2.90878e-13 -1.32339e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1649 1650 5.52969 -0.224544 -0.307223 -0.00206391 0.110893 -0.0592325 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1600 1650 1.4089e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 -1.32783e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1650 1651 5.52607 -0.224813 -0.306822 -0.00206931 0.11082 -0.0593686 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1601 1651 1.40794e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 -1.33227e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1651 1652 5.52245 -0.225081 -0.30642 -0.00207469 0.110748 -0.0595046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1602 1652 1.40723e-11 -3.05972 -0.0937068 0.0612327 2.90434e-13 -1.33671e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1652 1653 5.51882 -0.225348 -0.306018 -0.00208005 0.110675 -0.0596405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1603 1653 1.40634e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 -1.33671e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1653 1654 5.51518 -0.225615 -0.305615 -0.00208538 0.110602 -0.0597763 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1604 1654 1.40545e-11 -3.05972 -0.0937068 0.0612327 2.8999e-13 -1.34115e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1654 1655 5.51153 -0.22588 -0.305212 -0.0020907 0.110529 -0.059912 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1605 1655 1.40403e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 -1.34559e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1655 1656 5.50788 -0.226144 -0.304807 -0.002096 0.110455 -0.0600476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1606 1656 1.40332e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 -1.35003e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1656 1657 5.50421 -0.226407 -0.304403 -0.00210128 0.110382 -0.0601832 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1607 1657 1.40261e-11 -3.05972 -0.0937068 0.0612327 2.89546e-13 -1.35003e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1657 1658 5.50054 -0.226669 -0.303997 -0.00210654 0.110308 -0.0603186 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1608 1658 1.4019e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 -1.35447e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1658 1659 5.49686 -0.22693 -0.303591 -0.00211177 0.110234 -0.060454 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1609 1659 1.40048e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 -1.35891e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1659 1660 5.49317 -0.22719 -0.303184 -0.00211699 0.11016 -0.0605892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1610 1660 1.39941e-11 -3.05972 -0.0937068 0.0612327 2.89102e-13 -1.36335e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1660 1661 5.48947 -0.22745 -0.302777 -0.00212219 0.110086 -0.0607244 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1611 1661 1.3987e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 -1.36779e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1661 1662 5.48576 -0.227708 -0.302369 -0.00212737 0.110011 -0.0608594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1612 1662 1.39777e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 -1.37224e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1662 1663 5.48205 -0.227965 -0.30196 -0.00213252 0.109937 -0.0609944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1613 1663 1.3967e-11 -3.05972 -0.0937068 0.0612327 2.88658e-13 -1.37224e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1663 1664 5.47833 -0.228221 -0.301551 -0.00213766 0.109862 -0.0611293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1614 1664 1.39568e-11 -3.05972 -0.0937068 0.0612327 2.88214e-13 -1.37668e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1664 1665 5.4746 -0.228476 -0.301141 -0.00214278 0.109787 -0.0612641 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1615 1665 1.3948e-11 -3.05972 -0.0937068 0.0612327 2.88214e-13 -1.38112e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1665 1666 5.47086 -0.22873 -0.30073 -0.00214787 0.109712 -0.0613988 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1616 1666 1.39337e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 -1.38556e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1666 1667 5.46711 -0.228984 -0.300319 -0.00215295 0.109637 -0.0615334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1617 1667 1.39337e-11 -3.05972 -0.0937068 0.0612327 2.8777e-13 -1.39e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1667 1668 5.46336 -0.229236 -0.299907 -0.002158 0.109561 -0.0616679 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1618 1668 1.39195e-11 -3.05972 -0.0937068 0.0612327 2.87326e-13 -1.39e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1668 1669 5.45959 -0.229487 -0.299495 -0.00216304 0.109486 -0.0618023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1619 1669 1.39089e-11 -3.05972 -0.0937068 0.0612327 2.87326e-13 -1.39444e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1669 1670 5.45582 -0.229737 -0.299082 -0.00216805 0.10941 -0.0619366 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1620 1670 1.38947e-11 -3.05972 -0.0937068 0.0612327 2.87326e-13 -1.39888e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1670 1671 5.45204 -0.229986 -0.298668 -0.00217305 0.109334 -0.0620708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1621 1671 1.38911e-11 -3.05972 -0.0937068 0.0612327 2.86882e-13 -1.40332e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1671 1672 5.44825 -0.230234 -0.298254 -0.00217802 0.109258 -0.062205 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1622 1672 1.38822e-11 -3.05972 -0.0937068 0.0612327 2.86882e-13 -1.40332e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1672 1673 5.44446 -0.230481 -0.297839 -0.00218297 0.109182 -0.062339 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1623 1673 1.38716e-11 -3.05972 -0.0937068 0.0612327 2.86882e-13 -1.40776e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1673 1674 5.44065 -0.230727 -0.297424 -0.00218791 0.109105 -0.0624729 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1624 1674 1.38627e-11 -3.05972 -0.0937068 0.0612327 2.86438e-13 -1.4122e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1674 1675 5.43684 -0.230972 -0.297008 -0.00219282 0.109029 -0.0626068 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1625 1675 1.38518e-11 -3.05972 -0.0937068 0.0612327 2.86438e-13 -1.41664e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1675 1676 5.43302 -0.231216 -0.296591 -0.00219771 0.108952 -0.0627405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1626 1676 1.38414e-11 -3.05972 -0.0937068 0.0612327 2.85993e-13 -1.42109e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1676 1677 5.42919 -0.231459 -0.296174 -0.00220258 0.108875 -0.0628741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1627 1677 1.38325e-11 -3.05972 -0.0937068 0.0612327 2.85993e-13 -1.42109e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1677 1678 5.42535 -0.231701 -0.295756 -0.00220743 0.108798 -0.0630077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1628 1678 1.38218e-11 -3.05972 -0.0937068 0.0612327 2.85993e-13 -1.42553e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1678 1679 5.42151 -0.231942 -0.295338 -0.00221226 0.108721 -0.0631412 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1629 1679 1.3813e-11 -3.05972 -0.0937068 0.0612327 2.85549e-13 -1.42997e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1679 1680 5.41766 -0.232182 -0.294919 -0.00221707 0.108644 -0.0632745 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1630 1680 1.38023e-11 -3.05972 -0.0937068 0.0612327 2.85549e-13 -1.43441e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1680 1681 5.41379 -0.232421 -0.294499 -0.00222185 0.108566 -0.0634078 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1631 1681 1.37952e-11 -3.05972 -0.0937068 0.0612327 2.85549e-13 -1.43885e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1681 1682 5.40993 -0.232659 -0.294079 -0.00222662 0.108489 -0.0635409 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1632 1682 1.37845e-11 -3.05972 -0.0937068 0.0612327 2.85105e-13 -1.43885e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1682 1683 5.40605 -0.232896 -0.293658 -0.00223137 0.108411 -0.063674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1633 1683 1.37739e-11 -3.05972 -0.0937068 0.0612327 2.85105e-13 -1.44329e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1683 1684 5.40216 -0.233132 -0.293237 -0.00223609 0.108333 -0.063807 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1634 1684 1.37632e-11 -3.05972 -0.0937068 0.0612327 2.84661e-13 -1.44773e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1684 1685 5.39827 -0.233366 -0.292815 -0.0022408 0.108255 -0.0639398 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1635 1685 1.37561e-11 -3.05972 -0.0937068 0.0612327 2.84661e-13 -1.45217e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1685 1686 5.39437 -0.2336 -0.292393 -0.00224548 0.108176 -0.0640726 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1636 1686 1.37428e-11 -3.05972 -0.0937068 0.0612327 2.84217e-13 -1.45661e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1686 1687 5.39046 -0.233833 -0.291969 -0.00225014 0.108098 -0.0642053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1637 1687 1.37335e-11 -3.05972 -0.0937068 0.0612327 2.84217e-13 -1.45661e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1687 1688 5.38654 -0.234065 -0.291546 -0.00225478 0.108019 -0.0643379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1638 1688 1.37232e-11 -3.05972 -0.0937068 0.0612327 2.84217e-13 -1.46105e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1688 1689 5.38261 -0.234295 -0.291122 -0.0022594 0.10794 -0.0644704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1639 1689 1.37135e-11 -3.05972 -0.0937068 0.0612327 2.83773e-13 -1.46549e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1689 1690 5.37868 -0.234525 -0.290697 -0.002264 0.107861 -0.0646027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1640 1690 1.3701e-11 -3.05972 -0.0937068 0.0612327 2.83773e-13 -1.46994e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1690 1691 5.37474 -0.234753 -0.290272 -0.00226858 0.107782 -0.064735 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1641 1691 1.36957e-11 -3.05972 -0.0937068 0.0612327 2.83773e-13 -1.47438e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1691 1692 5.37079 -0.234981 -0.289846 -0.00227314 0.107703 -0.0648672 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1642 1692 1.36851e-11 -3.05972 -0.0937068 0.0612327 2.83329e-13 -1.47438e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1692 1693 5.36683 -0.235207 -0.289419 -0.00227768 0.107623 -0.0649993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1643 1693 1.36708e-11 -3.05972 -0.0937068 0.0612327 2.83329e-13 -1.47882e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1693 1694 5.36286 -0.235433 -0.288992 -0.00228219 0.107544 -0.0651313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1644 1694 1.36602e-11 -3.05972 -0.0937068 0.0612327 2.82885e-13 -1.48326e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1694 1695 5.35889 -0.235657 -0.288565 -0.00228669 0.107464 -0.0652631 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1645 1695 1.36531e-11 -3.05972 -0.0937068 0.0612327 2.82885e-13 -1.4877e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1695 1696 5.3549 -0.23588 -0.288137 -0.00229116 0.107384 -0.0653949 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1646 1696 1.36495e-11 -3.05972 -0.0937068 0.0612327 2.82441e-13 -1.4877e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1696 1697 5.35091 -0.236103 -0.287708 -0.00229561 0.107304 -0.0655266 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1647 1697 1.36353e-11 -3.05972 -0.0937068 0.0612327 2.82441e-13 -1.49214e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1697 1698 5.34692 -0.236324 -0.287279 -0.00230004 0.107224 -0.0656582 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1648 1698 1.36229e-11 -3.05972 -0.0937068 0.0612327 2.82441e-13 -1.49658e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1698 1699 5.34291 -0.236544 -0.286849 -0.00230445 0.107143 -0.0657897 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1649 1699 1.36113e-11 -3.05972 -0.0937068 0.0612327 2.81997e-13 -1.50102e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1699 1700 5.3389 -0.236763 -0.286419 -0.00230884 0.107063 -0.0659211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1650 1700 1.36017e-11 -3.05972 -0.0937068 0.0612327 2.81997e-13 -1.50546e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1700 1701 5.33487 -0.236981 -0.285988 -0.0023132 0.106982 -0.0660523 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1651 1701 1.35909e-11 -3.05972 -0.0937068 0.0612327 2.81553e-13 -1.50546e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1701 1702 5.33084 -0.237198 -0.285557 -0.00231755 0.106901 -0.0661835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1652 1702 1.35802e-11 -3.05972 -0.0937068 0.0612327 2.81553e-13 -1.5099e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1702 1703 5.3268 -0.237414 -0.285125 -0.00232187 0.10682 -0.0663146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1653 1703 1.35678e-11 -3.05972 -0.0937068 0.0612327 2.81553e-13 -1.51434e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1703 1704 5.32276 -0.237629 -0.284693 -0.00232617 0.106739 -0.0664456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1654 1704 1.35607e-11 -3.05972 -0.0937068 0.0612327 2.81108e-13 -1.51879e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1704 1705 5.3187 -0.237843 -0.28426 -0.00233046 0.106657 -0.0665765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1655 1705 1.35536e-11 -3.05972 -0.0937068 0.0612327 2.81108e-13 -1.51879e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1705 1706 5.31464 -0.238056 -0.283826 -0.00233472 0.106576 -0.0667072 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1656 1706 1.35358e-11 -3.05972 -0.0937068 0.0612327 2.80664e-13 -1.52323e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1706 1707 5.31057 -0.238268 -0.283392 -0.00233895 0.106494 -0.0668379 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1657 1707 1.35287e-11 -3.05972 -0.0937068 0.0612327 2.80664e-13 -1.52767e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1707 1708 5.30649 -0.238478 -0.282958 -0.00234317 0.106412 -0.0669685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1658 1708 1.35181e-11 -3.05972 -0.0937068 0.0612327 2.8022e-13 -1.53211e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1708 1709 5.3024 -0.238688 -0.282523 -0.00234736 0.10633 -0.0670989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1659 1709 1.35074e-11 -3.05972 -0.0937068 0.0612327 2.8022e-13 -1.53655e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1709 1710 5.29831 -0.238896 -0.282087 -0.00235154 0.106248 -0.0672293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1660 1710 1.34985e-11 -3.05972 -0.0937068 0.0612327 2.8022e-13 -1.53655e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1710 1711 5.29421 -0.239104 -0.281651 -0.00235569 0.106166 -0.0673596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1661 1711 1.3487e-11 -3.05972 -0.0937068 0.0612327 2.79776e-13 -1.54099e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1711 1712 5.2901 -0.23931 -0.281215 -0.00235982 0.106083 -0.0674897 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1662 1712 1.34763e-11 -3.05972 -0.0937068 0.0612327 2.79776e-13 -1.54543e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1712 1713 5.28598 -0.239516 -0.280778 -0.00236393 0.106 -0.0676198 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1663 1713 1.34661e-11 -3.05972 -0.0937068 0.0612327 2.79332e-13 -1.54987e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1713 1714 5.28185 -0.23972 -0.28034 -0.00236802 0.105918 -0.0677497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1664 1714 1.34577e-11 -3.05972 -0.0937068 0.0612327 2.79332e-13 -1.54987e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1714 1715 5.27772 -0.239923 -0.279902 -0.00237208 0.105835 -0.0678796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1665 1715 1.34452e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 -1.55431e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1715 1716 5.27358 -0.240125 -0.279464 -0.00237613 0.105751 -0.0680093 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1666 1716 1.34364e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 -1.55875e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1716 1717 5.26943 -0.240326 -0.279025 -0.00238015 0.105668 -0.068139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1667 1717 1.34186e-11 -3.05972 -0.0937068 0.0612327 2.78888e-13 -1.56319e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1717 1718 5.26527 -0.240526 -0.278585 -0.00238415 0.105585 -0.0682685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1668 1718 1.34115e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 -1.56319e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1718 1719 5.2611 -0.240725 -0.278145 -0.00238813 0.105501 -0.0683979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1669 1719 1.34044e-11 -3.05972 -0.0937068 0.0612327 2.78444e-13 -1.56763e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1719 1720 5.25693 -0.240923 -0.277705 -0.00239208 0.105417 -0.0685273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1670 1720 1.33902e-11 -3.05972 -0.0937068 0.0612327 2.78e-13 -1.57208e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1720 1721 5.25275 -0.241119 -0.277264 -0.00239602 0.105333 -0.0686565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1671 1721 1.3376e-11 -3.05972 -0.0937068 0.0612327 2.78e-13 -1.57652e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1721 1722 5.24856 -0.241315 -0.276823 -0.00239993 0.105249 -0.0687856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1672 1722 1.33706e-11 -3.05972 -0.0937068 0.0612327 2.78e-13 -1.58096e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1722 1723 5.24436 -0.24151 -0.276381 -0.00240382 0.105165 -0.0689146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1673 1723 1.336e-11 -3.05972 -0.0937068 0.0612327 2.77556e-13 -1.58096e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1723 1724 5.24016 -0.241703 -0.275938 -0.00240769 0.105081 -0.0690435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1674 1724 1.33493e-11 -3.05972 -0.0937068 0.0612327 2.77556e-13 -1.5854e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1724 1725 5.23595 -0.241895 -0.275495 -0.00241154 0.104996 -0.0691723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1675 1725 1.33388e-11 -3.05972 -0.0937068 0.0612327 2.77112e-13 -1.58984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1725 1726 5.23173 -0.242087 -0.275052 -0.00241537 0.104911 -0.069301 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1676 1726 1.33289e-11 -3.05972 -0.0937068 0.0612327 2.77112e-13 -1.59428e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1726 1727 5.2275 -0.242277 -0.274608 -0.00241917 0.104826 -0.0694296 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1677 1727 1.33173e-11 -3.05972 -0.0937068 0.0612327 2.76668e-13 -1.59428e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1727 1728 5.22326 -0.242466 -0.274164 -0.00242295 0.104741 -0.0695581 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1678 1728 1.33085e-11 -3.05972 -0.0937068 0.0612327 2.76668e-13 -1.59872e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1728 1729 5.21902 -0.242654 -0.273719 -0.00242671 0.104656 -0.0696865 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1679 1729 1.32978e-11 -3.05972 -0.0937068 0.0612327 2.76223e-13 -1.60316e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1729 1730 5.21476 -0.242841 -0.273274 -0.00243045 0.104571 -0.0698148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1680 1730 1.328e-11 -3.05972 -0.0937068 0.0612327 2.76223e-13 -1.6076e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1730 1731 5.2105 -0.243027 -0.272828 -0.00243416 0.104485 -0.0699429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1681 1731 1.32694e-11 -3.05972 -0.0937068 0.0612327 2.75779e-13 -1.6076e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1731 1732 5.20624 -0.243212 -0.272382 -0.00243786 0.1044 -0.070071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1682 1732 1.32694e-11 -3.05972 -0.0937068 0.0612327 2.75779e-13 -1.61204e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1732 1733 5.20196 -0.243395 -0.271936 -0.00244153 0.104314 -0.0701989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1683 1733 1.32516e-11 -3.05972 -0.0937068 0.0612327 2.75779e-13 -1.61648e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1733 1734 5.19768 -0.243578 -0.271489 -0.00244518 0.104228 -0.0703268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1684 1734 1.32339e-11 -3.05972 -0.0937068 0.0612327 2.75335e-13 -1.62093e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1734 1735 5.19339 -0.243759 -0.271041 -0.00244881 0.104142 -0.0704545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1685 1735 1.32321e-11 -3.05972 -0.0937068 0.0612327 2.75335e-13 -1.62093e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1735 1736 5.18909 -0.24394 -0.270594 -0.00245241 0.104055 -0.0705821 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1686 1736 1.32188e-11 -3.05972 -0.0937068 0.0612327 2.74891e-13 -1.62537e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1736 1737 5.18478 -0.244119 -0.270145 -0.002456 0.103969 -0.0707097 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1687 1737 1.32081e-11 -3.05972 -0.0937068 0.0612327 2.74891e-13 -1.62981e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1737 1738 5.18047 -0.244297 -0.269696 -0.00245956 0.103882 -0.0708371 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1688 1738 1.31979e-11 -3.05972 -0.0937068 0.0612327 2.74447e-13 -1.63425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1738 1739 5.17614 -0.244474 -0.269247 -0.0024631 0.103796 -0.0709644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1689 1739 1.31877e-11 -3.05972 -0.0937068 0.0612327 2.74447e-13 -1.63425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1739 1740 5.17181 -0.24465 -0.268798 -0.00246661 0.103709 -0.0710916 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1690 1740 1.3177e-11 -3.05972 -0.0937068 0.0612327 2.74447e-13 -1.63869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1740 1741 5.16748 -0.244825 -0.268348 -0.00247011 0.103622 -0.0712187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1691 1741 1.31646e-11 -3.05972 -0.0937068 0.0612327 2.74003e-13 -1.64313e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1741 1742 5.16313 -0.244999 -0.267897 -0.00247358 0.103534 -0.0713457 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1692 1742 1.31486e-11 -3.05972 -0.0937068 0.0612327 2.74003e-13 -1.64757e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1742 1743 5.15878 -0.245172 -0.267446 -0.00247703 0.103447 -0.0714725 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1693 1743 1.31415e-11 -3.05972 -0.0937068 0.0612327 2.73559e-13 -1.64757e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1743 1744 5.15442 -0.245343 -0.266995 -0.00248046 0.103359 -0.0715993 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1694 1744 1.31344e-11 -3.05972 -0.0937068 0.0612327 2.73559e-13 -1.65201e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1744 1745 5.15005 -0.245514 -0.266543 -0.00248386 0.103272 -0.0717259 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1695 1745 1.31166e-11 -3.05972 -0.0937068 0.0612327 2.73115e-13 -1.65645e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1745 1746 5.14567 -0.245683 -0.266091 -0.00248724 0.103184 -0.0718525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1696 1746 1.3106e-11 -3.05972 -0.0937068 0.0612327 2.73115e-13 -1.66089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1746 1747 5.14129 -0.245851 -0.265638 -0.0024906 0.103096 -0.0719789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1697 1747 1.30971e-11 -3.05972 -0.0937068 0.0612327 2.72671e-13 -1.66089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1747 1748 5.1369 -0.246019 -0.265185 -0.00249394 0.103008 -0.0721052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1698 1748 1.30864e-11 -3.05972 -0.0937068 0.0612327 2.72671e-13 -1.66533e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1748 1749 5.1325 -0.246185 -0.264732 -0.00249726 0.10292 -0.0722314 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1699 1749 1.30758e-11 -3.05972 -0.0937068 0.0612327 2.72227e-13 -1.66978e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1749 1750 5.12809 -0.246349 -0.264278 -0.00250055 0.102831 -0.0723576 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1700 1750 1.30635e-11 -3.05972 -0.0937068 0.0612327 2.72227e-13 -1.67422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1750 1751 5.12367 -0.246513 -0.263824 -0.00250382 0.102742 -0.0724835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1701 1751 1.30527e-11 -3.05972 -0.0937068 0.0612327 2.71783e-13 -1.67422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1751 1752 5.11925 -0.246676 -0.263369 -0.00250707 0.102654 -0.0726094 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1702 1752 1.30385e-11 -3.05972 -0.0937068 0.0612327 2.71783e-13 -1.67866e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1752 1753 5.11482 -0.246838 -0.262914 -0.0025103 0.102565 -0.0727352 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1703 1753 1.30296e-11 -3.05972 -0.0937068 0.0612327 2.71783e-13 -1.6831e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1753 1754 5.11038 -0.246998 -0.262459 -0.0025135 0.102476 -0.0728609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1704 1754 1.30171e-11 -3.05972 -0.0937068 0.0612327 2.71339e-13 -1.68754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1754 1755 5.10594 -0.247157 -0.262003 -0.00251668 0.102386 -0.0729864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1705 1755 1.30065e-11 -3.05972 -0.0937068 0.0612327 2.71339e-13 -1.68754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1755 1756 5.10148 -0.247316 -0.261547 -0.00251984 0.102297 -0.0731118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1706 1756 1.29923e-11 -3.05972 -0.0937068 0.0612327 2.70894e-13 -1.69198e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1756 1757 5.09702 -0.247473 -0.261091 -0.00252297 0.102208 -0.0732372 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1707 1757 1.29852e-11 -3.05972 -0.0937068 0.0612327 2.70894e-13 -1.69642e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1757 1758 5.09255 -0.247629 -0.260634 -0.00252609 0.102118 -0.0733624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1708 1758 1.2971e-11 -3.05972 -0.0937068 0.0612327 2.7045e-13 -1.70086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1758 1759 5.08808 -0.247784 -0.260176 -0.00252918 0.102028 -0.0734875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1709 1759 1.29603e-11 -3.05972 -0.0937068 0.0612327 2.7045e-13 -1.70086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1759 1760 5.08359 -0.247937 -0.259719 -0.00253225 0.101938 -0.0736125 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1710 1760 1.29496e-11 -3.05972 -0.0937068 0.0612327 2.70006e-13 -1.7053e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1760 1761 5.0791 -0.24809 -0.259261 -0.00253529 0.101848 -0.0737374 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1711 1761 1.2939e-11 -3.05972 -0.0937068 0.0612327 2.70006e-13 -1.70974e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1761 1762 5.0746 -0.248242 -0.258802 -0.00253831 0.101758 -0.0738621 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1712 1762 1.29274e-11 -3.05972 -0.0937068 0.0612327 2.69562e-13 -1.71418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1762 1763 5.0701 -0.248392 -0.258343 -0.00254131 0.101667 -0.0739868 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1713 1763 1.29163e-11 -3.05972 -0.0937068 0.0612327 2.69562e-13 -1.71418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1763 1764 5.06558 -0.248541 -0.257884 -0.00254429 0.101577 -0.0741113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1714 1764 1.29026e-11 -3.05972 -0.0937068 0.0612327 2.69118e-13 -1.71863e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1764 1765 5.06106 -0.248689 -0.257425 -0.00254725 0.101486 -0.0742357 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1715 1765 1.2891e-11 -3.05972 -0.0937068 0.0612327 2.69118e-13 -1.72307e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1765 1766 5.05653 -0.248836 -0.256965 -0.00255018 0.101395 -0.07436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1716 1766 1.28804e-11 -3.05972 -0.0937068 0.0612327 2.68674e-13 -1.72751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1766 1767 5.05199 -0.248982 -0.256504 -0.00255309 0.101304 -0.0744842 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1717 1767 1.28715e-11 -3.05972 -0.0937068 0.0612327 2.68674e-13 -1.72751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1767 1768 5.04745 -0.249127 -0.256044 -0.00255597 0.101213 -0.0746083 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1718 1768 1.28608e-11 -3.05972 -0.0937068 0.0612327 2.6823e-13 -1.73195e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1768 1769 5.0429 -0.249271 -0.255583 -0.00255884 0.101121 -0.0747323 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1719 1769 1.28466e-11 -3.05972 -0.0937068 0.0612327 2.6823e-13 -1.73639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1769 1770 5.03834 -0.249413 -0.255121 -0.00256168 0.10103 -0.0748562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1720 1770 1.28324e-11 -3.05972 -0.0937068 0.0612327 2.6823e-13 -1.74083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1770 1771 5.03377 -0.249555 -0.25466 -0.0025645 0.100938 -0.0749799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1721 1771 1.28253e-11 -3.05972 -0.0937068 0.0612327 2.67786e-13 -1.74083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1771 1772 5.0292 -0.249695 -0.254198 -0.00256729 0.100846 -0.0751035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1722 1772 1.28111e-11 -3.05972 -0.0937068 0.0612327 2.67342e-13 -1.74527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1772 1773 5.02461 -0.249834 -0.253735 -0.00257006 0.100754 -0.0752271 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1723 1773 1.27987e-11 -3.05972 -0.0937068 0.0612327 2.67342e-13 -1.74971e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1773 1774 5.02002 -0.249972 -0.253273 -0.00257281 0.100662 -0.0753505 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1724 1774 1.2788e-11 -3.05972 -0.0937068 0.0612327 2.67342e-13 -1.75415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1774 1775 5.01543 -0.250109 -0.25281 -0.00257554 0.10057 -0.0754737 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1725 1775 1.27758e-11 -3.05972 -0.0937068 0.0612327 2.66898e-13 -1.75415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1775 1776 5.01082 -0.250244 -0.252346 -0.00257825 0.100477 -0.0755969 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1726 1776 1.2764e-11 -3.05972 -0.0937068 0.0612327 2.66898e-13 -1.75859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1776 1777 5.00621 -0.250379 -0.251883 -0.00258093 0.100385 -0.07572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1727 1777 1.27525e-11 -3.05972 -0.0937068 0.0612327 2.66454e-13 -1.76303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1777 1778 5.00159 -0.250512 -0.251418 -0.00258358 0.100292 -0.0758429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1728 1778 1.27383e-11 -3.05972 -0.0937068 0.0612327 2.66454e-13 -1.76748e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1778 1779 4.99696 -0.250645 -0.250954 -0.00258622 0.100199 -0.0759657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1729 1779 1.27294e-11 -3.05972 -0.0937068 0.0612327 2.66009e-13 -1.76748e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1779 1780 4.99233 -0.250776 -0.250489 -0.00258883 0.100106 -0.0760884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1730 1780 1.27223e-11 -3.05972 -0.0937068 0.0612327 2.66009e-13 -1.77192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1780 1781 4.98768 -0.250906 -0.250024 -0.00259142 0.100013 -0.076211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1731 1781 1.27081e-11 -3.05972 -0.0937068 0.0612327 2.65565e-13 -1.77636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1781 1782 4.98303 -0.251035 -0.249559 -0.00259399 0.0999198 -0.0763335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1732 1782 1.26903e-11 -3.05972 -0.0937068 0.0612327 2.65565e-13 -1.77636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1782 1783 4.97838 -0.251163 -0.249094 -0.00259653 0.0998264 -0.0764559 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1733 1783 1.26796e-11 -3.05972 -0.0937068 0.0612327 2.65121e-13 -1.7808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1783 1784 4.97371 -0.251289 -0.248628 -0.00259905 0.0997328 -0.0765781 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1734 1784 1.26725e-11 -3.05972 -0.0937068 0.0612327 2.65121e-13 -1.78524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1784 1785 4.96904 -0.251415 -0.248161 -0.00260155 0.099639 -0.0767002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1735 1785 1.26583e-11 -3.05972 -0.0937068 0.0612327 2.64677e-13 -1.78968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1785 1786 4.96436 -0.251539 -0.247695 -0.00260402 0.0995451 -0.0768223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1736 1786 1.2645e-11 -3.05972 -0.0937068 0.0612327 2.64677e-13 -1.78968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1786 1787 4.95967 -0.251662 -0.247228 -0.00260647 0.099451 -0.0769441 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1737 1787 1.26343e-11 -3.05972 -0.0937068 0.0612327 2.64233e-13 -1.79412e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1787 1788 4.95498 -0.251784 -0.246761 -0.0026089 0.0993568 -0.0770659 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1738 1788 1.26206e-11 -3.05972 -0.0937068 0.0612327 2.64233e-13 -1.79856e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1788 1789 4.95027 -0.251905 -0.246293 -0.00261131 0.0992624 -0.0771876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1739 1789 1.26068e-11 -3.05972 -0.0937068 0.0612327 2.63789e-13 -1.803e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1789 1790 4.94556 -0.252025 -0.245826 -0.00261369 0.0991679 -0.0773091 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1740 1790 1.25979e-11 -3.05972 -0.0937068 0.0612327 2.63789e-13 -1.803e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1790 1791 4.94085 -0.252143 -0.245357 -0.00261605 0.0990733 -0.0774305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1741 1791 1.25819e-11 -3.05972 -0.0937068 0.0612327 2.63345e-13 -1.80744e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1791 1792 4.93612 -0.252261 -0.244889 -0.00261839 0.0989785 -0.0775519 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1742 1792 1.25695e-11 -3.05972 -0.0937068 0.0612327 2.63345e-13 -1.81188e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1792 1793 4.93139 -0.252377 -0.244421 -0.0026207 0.0988835 -0.077673 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1743 1793 1.25624e-11 -3.05972 -0.0937068 0.0612327 2.62901e-13 -1.81188e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1793 1794 4.92665 -0.252492 -0.243952 -0.00262299 0.0987884 -0.0777941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1744 1794 1.25446e-11 -3.05972 -0.0937068 0.0612327 2.62901e-13 -1.81632e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1794 1795 4.9219 -0.252606 -0.243482 -0.00262525 0.0986932 -0.0779151 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1745 1795 1.25375e-11 -3.05972 -0.0937068 0.0612327 2.62457e-13 -1.82077e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1795 1796 4.91715 -0.252719 -0.243013 -0.0026275 0.0985978 -0.0780359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1746 1796 1.25233e-11 -3.05972 -0.0937068 0.0612327 2.62457e-13 -1.82521e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1796 1797 4.91239 -0.252831 -0.242543 -0.00262972 0.0985022 -0.0781566 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1747 1797 1.25127e-11 -3.05972 -0.0937068 0.0612327 2.62013e-13 -1.82521e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1797 1798 4.90762 -0.252942 -0.242073 -0.00263192 0.0984065 -0.0782772 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1748 1798 1.25002e-11 -3.05972 -0.0937068 0.0612327 2.62013e-13 -1.82965e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1798 1799 4.90284 -0.253051 -0.241603 -0.00263409 0.0983107 -0.0783977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1749 1799 1.24869e-11 -3.05972 -0.0937068 0.0612327 2.61569e-13 -1.83409e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1799 1800 4.89806 -0.253159 -0.241132 -0.00263624 0.0982147 -0.078518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1750 1800 1.24762e-11 -3.05972 -0.0937068 0.0612327 2.61569e-13 -1.83853e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1800 1801 4.89327 -0.253266 -0.240662 -0.00263837 0.0981186 -0.0786383 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1751 1801 1.24638e-11 -3.05972 -0.0937068 0.0612327 2.61124e-13 -1.83853e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1801 1802 4.88847 -0.253372 -0.240191 -0.00264047 0.0980223 -0.0787584 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1752 1802 1.24505e-11 -3.05972 -0.0937068 0.0612327 2.61124e-13 -1.84297e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1802 1803 4.88367 -0.253477 -0.239719 -0.00264255 0.0979259 -0.0788784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1753 1803 1.24416e-11 -3.05972 -0.0937068 0.0612327 2.6068e-13 -1.84741e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1803 1804 4.87885 -0.253581 -0.239248 -0.00264461 0.0978293 -0.0789982 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1754 1804 1.24309e-11 -3.05972 -0.0937068 0.0612327 2.6068e-13 -1.84741e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1804 1805 4.87403 -0.253683 -0.238776 -0.00264664 0.0977326 -0.079118 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1755 1805 1.24167e-11 -3.05972 -0.0937068 0.0612327 2.60236e-13 -1.85185e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1805 1806 4.86921 -0.253784 -0.238304 -0.00264866 0.0976357 -0.0792376 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1756 1806 1.24025e-11 -3.05972 -0.0937068 0.0612327 2.60236e-13 -1.85629e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1806 1807 4.86437 -0.253885 -0.237831 -0.00265064 0.0975387 -0.0793572 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1757 1807 1.23954e-11 -3.05972 -0.0937068 0.0612327 2.59792e-13 -1.85629e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1807 1808 4.85953 -0.253984 -0.237359 -0.00265261 0.0974416 -0.0794765 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1758 1808 1.23812e-11 -3.05972 -0.0937068 0.0612327 2.59792e-13 -1.86073e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1808 1809 4.85468 -0.254082 -0.236886 -0.00265455 0.0973443 -0.0795958 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1759 1809 1.23634e-11 -3.05972 -0.0937068 0.0612327 2.59348e-13 -1.86517e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1809 1810 4.84982 -0.254178 -0.236413 -0.00265647 0.0972468 -0.079715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1760 1810 1.23546e-11 -3.05972 -0.0937068 0.0612327 2.59348e-13 -1.86962e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1810 1811 4.84496 -0.254274 -0.23594 -0.00265836 0.0971492 -0.079834 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1761 1811 1.23386e-11 -3.05972 -0.0937068 0.0612327 2.58904e-13 -1.86962e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1811 1812 4.84009 -0.254368 -0.235466 -0.00266023 0.0970515 -0.0799529 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1762 1812 1.23279e-11 -3.05972 -0.0937068 0.0612327 2.58904e-13 -1.87406e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1812 1813 4.83521 -0.254461 -0.234992 -0.00266208 0.0969536 -0.0800717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1763 1813 1.23159e-11 -3.05972 -0.0937068 0.0612327 2.5846e-13 -1.8785e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1813 1814 4.83032 -0.254553 -0.234518 -0.00266391 0.0968556 -0.0801904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1764 1814 1.23039e-11 -3.05972 -0.0937068 0.0612327 2.58016e-13 -1.88294e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1814 1815 4.82543 -0.254644 -0.234044 -0.00266571 0.0967574 -0.0803089 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1765 1815 1.22888e-11 -3.05972 -0.0937068 0.0612327 2.58016e-13 -1.88294e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1815 1816 4.82053 -0.254734 -0.23357 -0.00266748 0.0966591 -0.0804273 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1766 1816 1.22764e-11 -3.05972 -0.0937068 0.0612327 2.57572e-13 -1.88738e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1816 1817 4.81562 -0.254823 -0.233095 -0.00266924 0.0965606 -0.0805456 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1767 1817 1.22675e-11 -3.05972 -0.0937068 0.0612327 2.57572e-13 -1.89182e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1817 1818 4.81071 -0.25491 -0.23262 -0.00267097 0.096462 -0.0806638 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1768 1818 1.22533e-11 -3.05972 -0.0937068 0.0612327 2.57572e-13 -1.89182e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1818 1819 4.80579 -0.254996 -0.232145 -0.00267268 0.0963633 -0.0807819 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1769 1819 1.22391e-11 -3.05972 -0.0937068 0.0612327 2.57128e-13 -1.89626e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1819 1820 4.80086 -0.255081 -0.23167 -0.00267436 0.0962644 -0.0808998 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1770 1820 1.22249e-11 -3.05972 -0.0937068 0.0612327 2.56684e-13 -1.9007e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1820 1821 4.79592 -0.255165 -0.231194 -0.00267602 0.0961653 -0.0810176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1771 1821 1.22178e-11 -3.05972 -0.0937068 0.0612327 2.56684e-13 -1.90514e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1821 1822 4.79098 -0.255248 -0.230719 -0.00267766 0.0960661 -0.0811353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1772 1822 1.22036e-11 -3.05972 -0.0937068 0.0612327 2.56239e-13 -1.90514e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1822 1823 4.78603 -0.25533 -0.230243 -0.00267927 0.0959668 -0.0812528 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1773 1823 1.21876e-11 -3.05972 -0.0937068 0.0612327 2.56239e-13 -1.90958e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1823 1824 4.78107 -0.25541 -0.229767 -0.00268086 0.0958674 -0.0813703 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1774 1824 1.21769e-11 -3.05972 -0.0937068 0.0612327 2.55795e-13 -1.91402e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1824 1825 4.77611 -0.255489 -0.22929 -0.00268243 0.0957677 -0.0814876 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1775 1825 1.2165e-11 -3.05972 -0.0937068 0.0612327 2.55795e-13 -1.91402e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1825 1826 4.77113 -0.255567 -0.228814 -0.00268397 0.095668 -0.0816048 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1776 1826 1.21512e-11 -3.05972 -0.0937068 0.0612327 2.55351e-13 -1.91847e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1826 1827 4.76615 -0.255644 -0.228337 -0.00268549 0.0955681 -0.0817219 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1777 1827 1.21396e-11 -3.05972 -0.0937068 0.0612327 2.55351e-13 -1.92291e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1827 1828 4.76117 -0.25572 -0.22786 -0.00268699 0.095468 -0.0818388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1778 1828 1.2129e-11 -3.05972 -0.0937068 0.0612327 2.54907e-13 -1.92291e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1828 1829 4.75617 -0.255795 -0.227383 -0.00268846 0.0953679 -0.0819556 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1779 1829 1.21183e-11 -3.05972 -0.0937068 0.0612327 2.54907e-13 -1.92735e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1829 1830 4.75117 -0.255868 -0.226906 -0.00268991 0.0952675 -0.0820723 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1780 1830 1.21041e-11 -3.05972 -0.0937068 0.0612327 2.54463e-13 -1.93179e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1830 1831 4.74617 -0.25594 -0.226429 -0.00269134 0.0951671 -0.0821889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1781 1831 1.20934e-11 -3.05972 -0.0937068 0.0612327 2.54463e-13 -1.93623e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1831 1832 4.74115 -0.256011 -0.225951 -0.00269274 0.0950665 -0.0823053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1782 1832 1.20757e-11 -3.05972 -0.0937068 0.0612327 2.54019e-13 -1.93623e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1832 1833 4.73613 -0.256081 -0.225473 -0.00269412 0.0949657 -0.0824216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1783 1833 1.20579e-11 -3.05972 -0.0937068 0.0612327 2.54019e-13 -1.94067e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1833 1834 4.7311 -0.25615 -0.224995 -0.00269547 0.0948648 -0.0825378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1784 1834 1.20526e-11 -3.05972 -0.0937068 0.0612327 2.53575e-13 -1.94511e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1834 1835 4.72606 -0.256218 -0.224517 -0.0026968 0.0947638 -0.0826539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1785 1835 1.20384e-11 -3.05972 -0.0937068 0.0612327 2.53131e-13 -1.94511e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1835 1836 4.72102 -0.256284 -0.224039 -0.00269811 0.0946626 -0.0827698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1786 1836 1.20259e-11 -3.05972 -0.0937068 0.0612327 2.53131e-13 -1.94955e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1836 1837 4.71597 -0.256349 -0.223561 -0.0026994 0.0945613 -0.0828856 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1787 1837 1.20117e-11 -3.05972 -0.0937068 0.0612327 2.52687e-13 -1.95399e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1837 1838 4.71091 -0.256413 -0.223082 -0.00270066 0.0944598 -0.0830013 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1788 1838 1.1998e-11 -3.05972 -0.0937068 0.0612327 2.52687e-13 -1.95399e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1838 1839 4.70585 -0.256476 -0.222603 -0.00270189 0.0943582 -0.0831169 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1789 1839 1.19851e-11 -3.05972 -0.0937068 0.0612327 2.52243e-13 -1.95843e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1839 1840 4.70078 -0.256538 -0.222125 -0.00270311 0.0942565 -0.0832323 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1790 1840 1.19726e-11 -3.05972 -0.0937068 0.0612327 2.52243e-13 -1.96287e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1840 1841 4.6957 -0.256598 -0.221646 -0.0027043 0.0941546 -0.0833476 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1791 1841 1.19584e-11 -3.05972 -0.0937068 0.0612327 2.51799e-13 -1.96287e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1841 1842 4.69061 -0.256658 -0.221166 -0.00270547 0.0940526 -0.0834628 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1792 1842 1.19478e-11 -3.05972 -0.0937068 0.0612327 2.51799e-13 -1.96732e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1842 1843 4.68552 -0.256716 -0.220687 -0.00270661 0.0939504 -0.0835779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1793 1843 1.19371e-11 -3.05972 -0.0937068 0.0612327 2.51354e-13 -1.97176e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1843 1844 4.68042 -0.256773 -0.220208 -0.00270773 0.0938481 -0.0836928 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1794 1844 1.19229e-11 -3.05972 -0.0937068 0.0612327 2.51354e-13 -1.9762e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1844 1845 4.67531 -0.256829 -0.219728 -0.00270882 0.0937456 -0.0838076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1795 1845 1.19051e-11 -3.05972 -0.0937068 0.0612327 2.5091e-13 -1.9762e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1845 1846 4.6702 -0.256883 -0.219248 -0.00270989 0.0936431 -0.0839223 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1796 1846 1.18927e-11 -3.05972 -0.0937068 0.0612327 2.50466e-13 -1.98064e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1846 1847 4.66508 -0.256937 -0.218768 -0.00271094 0.0935403 -0.0840368 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1797 1847 1.18821e-11 -3.05972 -0.0937068 0.0612327 2.50466e-13 -1.98508e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1847 1848 4.65995 -0.256989 -0.218288 -0.00271197 0.0934375 -0.0841513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1798 1848 1.18696e-11 -3.05972 -0.0937068 0.0612327 2.50022e-13 -1.98508e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1848 1849 4.65482 -0.25704 -0.217808 -0.00271297 0.0933345 -0.0842656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1799 1849 1.18563e-11 -3.05972 -0.0937068 0.0612327 2.50022e-13 -1.98952e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1849 1850 4.64967 -0.25709 -0.217328 -0.00271395 0.0932313 -0.0843797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1800 1850 1.18423e-11 -3.05972 -0.0937068 0.0612327 2.49578e-13 -1.99396e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1850 1851 4.64453 -0.257139 -0.216848 -0.0027149 0.093128 -0.0844938 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1801 1851 1.18296e-11 -3.05972 -0.0937068 0.0612327 2.49578e-13 -1.99396e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1851 1852 4.63937 -0.257187 -0.216367 -0.00271583 0.0930246 -0.0846077 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1802 1852 1.18181e-11 -3.05972 -0.0937068 0.0612327 2.49134e-13 -1.9984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1852 1853 4.63421 -0.257233 -0.215887 -0.00271674 0.0929211 -0.0847214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1803 1853 1.18039e-11 -3.05972 -0.0937068 0.0612327 2.49134e-13 -2.00284e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1853 1854 4.62904 -0.257278 -0.215406 -0.00271762 0.0928174 -0.0848351 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1804 1854 1.17932e-11 -3.05972 -0.0937068 0.0612327 2.4869e-13 -2.00728e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1854 1855 4.62386 -0.257323 -0.214925 -0.00271848 0.0927135 -0.0849486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1805 1855 1.17737e-11 -3.05972 -0.0937068 0.0612327 2.4869e-13 -2.00728e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1855 1856 4.61868 -0.257365 -0.214444 -0.00271931 0.0926095 -0.085062 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1806 1856 1.17595e-11 -3.05972 -0.0937068 0.0612327 2.48246e-13 -2.01172e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1856 1857 4.61349 -0.257407 -0.213963 -0.00272013 0.0925054 -0.0851753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1807 1857 1.17524e-11 -3.05972 -0.0937068 0.0612327 2.48246e-13 -2.01617e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1857 1858 4.60829 -0.257448 -0.213482 -0.00272091 0.0924012 -0.0852884 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1808 1858 1.17346e-11 -3.05972 -0.0937068 0.0612327 2.47802e-13 -2.01617e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1858 1859 4.60309 -0.257487 -0.213001 -0.00272168 0.0922968 -0.0854014 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1809 1859 1.17222e-11 -3.05972 -0.0937068 0.0612327 2.47358e-13 -2.02061e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1859 1860 4.59787 -0.257525 -0.212519 -0.00272242 0.0921923 -0.0855143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1810 1860 1.17115e-11 -3.05972 -0.0937068 0.0612327 2.47358e-13 -2.02505e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1860 1861 4.59266 -0.257562 -0.212038 -0.00272314 0.0920876 -0.085627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1811 1861 1.16964e-11 -3.05972 -0.0937068 0.0612327 2.46914e-13 -2.02505e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1861 1862 4.58743 -0.257598 -0.211556 -0.00272383 0.0919828 -0.0857397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1812 1862 1.16835e-11 -3.05972 -0.0937068 0.0612327 2.46914e-13 -2.02949e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1862 1863 4.5822 -0.257633 -0.211075 -0.0027245 0.0918778 -0.0858521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1813 1863 1.16693e-11 -3.05972 -0.0937068 0.0612327 2.4647e-13 -2.03393e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1863 1864 4.57696 -0.257666 -0.210593 -0.00272514 0.0917728 -0.0859645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1814 1864 1.16565e-11 -3.05972 -0.0937068 0.0612327 2.4647e-13 -2.03393e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1864 1865 4.57172 -0.257698 -0.210111 -0.00272577 0.0916676 -0.0860767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1815 1865 1.16422e-11 -3.05972 -0.0937068 0.0612327 2.46025e-13 -2.03837e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1865 1866 4.56646 -0.25773 -0.20963 -0.00272636 0.0915622 -0.0861888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1816 1866 1.1628e-11 -3.05972 -0.0937068 0.0612327 2.45581e-13 -2.04281e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1866 1867 4.5612 -0.25776 -0.209148 -0.00272694 0.0914567 -0.0863008 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1817 1867 1.16174e-11 -3.05972 -0.0937068 0.0612327 2.45581e-13 -2.04281e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1867 1868 4.55594 -0.257788 -0.208666 -0.00272749 0.0913511 -0.0864126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1818 1868 1.16032e-11 -3.05972 -0.0937068 0.0612327 2.45581e-13 -2.04725e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1868 1869 4.55067 -0.257816 -0.208184 -0.00272802 0.0912453 -0.0865243 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1819 1869 1.15854e-11 -3.05972 -0.0937068 0.0612327 2.45137e-13 -2.05169e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1869 1870 4.54539 -0.257842 -0.207702 -0.00272852 0.0911394 -0.0866359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1820 1870 1.15783e-11 -3.05972 -0.0937068 0.0612327 2.44693e-13 -2.05169e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1870 1871 4.5401 -0.257867 -0.207219 -0.002729 0.0910334 -0.0867473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1821 1871 1.15623e-11 -3.05972 -0.0937068 0.0612327 2.44693e-13 -2.05613e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1871 1872 4.53481 -0.257891 -0.206737 -0.00272946 0.0909272 -0.0868586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1822 1872 1.15481e-11 -3.05972 -0.0937068 0.0612327 2.44249e-13 -2.06057e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1872 1873 4.52951 -0.257914 -0.206255 -0.00272989 0.0908209 -0.0869698 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1823 1873 1.15339e-11 -3.05972 -0.0937068 0.0612327 2.43805e-13 -2.06057e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1873 1874 4.5242 -0.257936 -0.205772 -0.0027303 0.0907145 -0.0870808 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1824 1874 1.15223e-11 -3.05972 -0.0937068 0.0612327 2.43805e-13 -2.06501e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1874 1875 4.51888 -0.257956 -0.20529 -0.00273068 0.0906079 -0.0871918 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1825 1875 1.15085e-11 -3.05972 -0.0937068 0.0612327 2.43361e-13 -2.06946e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1875 1876 4.51356 -0.257976 -0.204808 -0.00273104 0.0905012 -0.0873025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1826 1876 1.14948e-11 -3.05972 -0.0937068 0.0612327 2.43361e-13 -2.06946e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1876 1877 4.50824 -0.257994 -0.204325 -0.00273138 0.0903943 -0.0874132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1827 1877 1.14824e-11 -3.05972 -0.0937068 0.0612327 2.42917e-13 -2.0739e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1877 1878 4.5029 -0.258011 -0.203843 -0.00273169 0.0902874 -0.0875237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1828 1878 1.14699e-11 -3.05972 -0.0937068 0.0612327 2.42917e-13 -2.07834e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1878 1879 4.49756 -0.258027 -0.20336 -0.00273198 0.0901802 -0.0876341 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1829 1879 1.14557e-11 -3.05972 -0.0937068 0.0612327 2.42473e-13 -2.07834e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1879 1880 4.49221 -0.258041 -0.202877 -0.00273225 0.090073 -0.0877443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1830 1880 1.14433e-11 -3.05972 -0.0937068 0.0612327 2.42029e-13 -2.08278e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1880 1881 4.48686 -0.258054 -0.202395 -0.00273249 0.0899656 -0.0878544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1831 1881 1.14255e-11 -3.05972 -0.0937068 0.0612327 2.42029e-13 -2.08722e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1881 1882 4.4815 -0.258067 -0.201912 -0.00273271 0.0898581 -0.0879644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1832 1882 1.14184e-11 -3.05972 -0.0937068 0.0612327 2.41585e-13 -2.08722e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1882 1883 4.47613 -0.258078 -0.201429 -0.00273291 0.0897504 -0.0880743 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1833 1883 1.14007e-11 -3.05972 -0.0937068 0.0612327 2.41585e-13 -2.09166e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1883 1884 4.47076 -0.258088 -0.200947 -0.00273308 0.0896426 -0.088184 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1834 1884 1.13847e-11 -3.05972 -0.0937068 0.0612327 2.4114e-13 -2.0961e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1884 1885 4.46538 -0.258096 -0.200464 -0.00273322 0.0895347 -0.0882936 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1835 1885 1.13722e-11 -3.05972 -0.0937068 0.0612327 2.4114e-13 -2.0961e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1885 1886 4.45999 -0.258104 -0.199981 -0.00273335 0.0894267 -0.088403 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1836 1886 1.1358e-11 -3.05972 -0.0937068 0.0612327 2.40696e-13 -2.10054e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1886 1887 4.45459 -0.25811 -0.199498 -0.00273345 0.0893185 -0.0885123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1837 1887 1.13438e-11 -3.05972 -0.0937068 0.0612327 2.40252e-13 -2.10498e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1887 1888 4.44919 -0.258115 -0.199015 -0.00273352 0.0892101 -0.0886215 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1838 1888 1.13305e-11 -3.05972 -0.0937068 0.0612327 2.40252e-13 -2.10498e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1888 1889 4.44378 -0.258119 -0.198533 -0.00273358 0.0891017 -0.0887306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1839 1889 1.13189e-11 -3.05972 -0.0937068 0.0612327 2.39808e-13 -2.10942e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1889 1890 4.43837 -0.258122 -0.19805 -0.00273361 0.0889931 -0.0888395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1840 1890 1.1303e-11 -3.05972 -0.0937068 0.0612327 2.39808e-13 -2.11386e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1890 1891 4.43295 -0.258123 -0.197567 -0.00273361 0.0888844 -0.0889482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1841 1891 1.12941e-11 -3.05972 -0.0937068 0.0612327 2.39364e-13 -2.11386e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1891 1892 4.42752 -0.258124 -0.197084 -0.00273359 0.0887755 -0.0890569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1842 1892 1.12763e-11 -3.05972 -0.0937068 0.0612327 2.39364e-13 -2.11831e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1892 1893 4.42209 -0.258123 -0.196601 -0.00273355 0.0886665 -0.0891654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1843 1893 1.12621e-11 -3.05972 -0.0937068 0.0612327 2.3892e-13 -2.12275e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1893 1894 4.41664 -0.258121 -0.196118 -0.00273348 0.0885574 -0.0892738 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1844 1894 1.12443e-11 -3.05972 -0.0937068 0.0612327 2.38476e-13 -2.12275e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1894 1895 4.4112 -0.258118 -0.195636 -0.00273339 0.0884482 -0.089382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1845 1895 1.12372e-11 -3.05972 -0.0937068 0.0612327 2.38476e-13 -2.12719e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1895 1896 4.40574 -0.258113 -0.195153 -0.00273328 0.0883388 -0.0894901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1846 1896 1.12177e-11 -3.05972 -0.0937068 0.0612327 2.38032e-13 -2.13163e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1896 1897 4.40028 -0.258108 -0.19467 -0.00273314 0.0882293 -0.0895981 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1847 1897 1.12035e-11 -3.05972 -0.0937068 0.0612327 2.38032e-13 -2.13163e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1897 1898 4.39481 -0.258101 -0.194187 -0.00273298 0.0881196 -0.0897059 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1848 1898 1.1191e-11 -3.05972 -0.0937068 0.0612327 2.37588e-13 -2.13607e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1898 1899 4.38934 -0.258093 -0.193704 -0.00273279 0.0880099 -0.0898136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1849 1899 1.11795e-11 -3.05972 -0.0937068 0.0612327 2.37144e-13 -2.14051e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1899 1900 4.38386 -0.258084 -0.193222 -0.00273259 0.0878999 -0.0899211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1850 1900 1.11639e-11 -3.05972 -0.0937068 0.0612327 2.37144e-13 -2.14051e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1900 1901 4.37837 -0.258074 -0.192739 -0.00273235 0.0877899 -0.0900286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1851 1901 1.11502e-11 -3.05972 -0.0937068 0.0612327 2.367e-13 -2.14495e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1901 1902 4.37288 -0.258062 -0.192256 -0.0027321 0.0876797 -0.0901359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1852 1902 1.11342e-11 -3.05972 -0.0937068 0.0612327 2.367e-13 -2.14939e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1902 1903 4.36738 -0.25805 -0.191774 -0.00273182 0.0875694 -0.090243 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1853 1903 1.11218e-11 -3.05972 -0.0937068 0.0612327 2.36255e-13 -2.14939e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1903 1904 4.36187 -0.258036 -0.191291 -0.00273151 0.087459 -0.09035 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1854 1904 1.11058e-11 -3.05972 -0.0937068 0.0612327 2.36255e-13 -2.15383e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1904 1905 4.35636 -0.258021 -0.190808 -0.00273119 0.0873484 -0.0904569 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1855 1905 1.10951e-11 -3.05972 -0.0937068 0.0612327 2.35811e-13 -2.15827e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1905 1906 4.35084 -0.258005 -0.190326 -0.00273084 0.0872378 -0.0905636 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1856 1906 1.10809e-11 -3.05972 -0.0937068 0.0612327 2.35367e-13 -2.15827e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1906 1907 4.34531 -0.257988 -0.189843 -0.00273046 0.0871269 -0.0906702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1857 1907 1.10632e-11 -3.05972 -0.0937068 0.0612327 2.35367e-13 -2.16271e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1907 1908 4.33978 -0.257969 -0.189361 -0.00273006 0.087016 -0.0907767 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1858 1908 1.10507e-11 -3.05972 -0.0937068 0.0612327 2.34923e-13 -2.16716e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1908 1909 4.33424 -0.257949 -0.188878 -0.00272964 0.0869049 -0.090883 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1859 1909 1.10401e-11 -3.05972 -0.0937068 0.0612327 2.34479e-13 -2.16716e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1909 1910 4.32869 -0.257928 -0.188396 -0.00272919 0.0867937 -0.0909892 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1860 1910 1.10205e-11 -3.05972 -0.0937068 0.0612327 2.34479e-13 -2.1716e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1910 1911 4.32314 -0.257906 -0.187914 -0.00272872 0.0866823 -0.0910953 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1861 1911 1.1009e-11 -3.05972 -0.0937068 0.0612327 2.34035e-13 -2.17604e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1911 1912 4.31758 -0.257883 -0.187431 -0.00272823 0.0865709 -0.0912012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1862 1912 1.09948e-11 -3.05972 -0.0937068 0.0612327 2.34035e-13 -2.17604e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1912 1913 4.31201 -0.257859 -0.186949 -0.00272771 0.0864593 -0.0913069 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1863 1913 1.09805e-11 -3.05972 -0.0937068 0.0612327 2.33591e-13 -2.18048e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1913 1914 4.30644 -0.257833 -0.186467 -0.00272717 0.0863475 -0.0914126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1864 1914 1.09663e-11 -3.05972 -0.0937068 0.0612327 2.33147e-13 -2.18048e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1914 1915 4.30086 -0.257806 -0.185985 -0.00272661 0.0862357 -0.0915181 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1865 1915 1.0953e-11 -3.05972 -0.0937068 0.0612327 2.33147e-13 -2.18492e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1915 1916 4.29528 -0.257778 -0.185503 -0.00272602 0.0861237 -0.0916234 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1866 1916 1.09353e-11 -3.05972 -0.0937068 0.0612327 2.32703e-13 -2.18936e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1916 1917 4.28969 -0.257749 -0.185021 -0.00272541 0.0860116 -0.0917287 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1867 1917 1.09228e-11 -3.05972 -0.0937068 0.0612327 2.32703e-13 -2.18936e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1917 1918 4.28409 -0.257719 -0.184539 -0.00272477 0.0858993 -0.0918337 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1868 1918 1.09139e-11 -3.05972 -0.0937068 0.0612327 2.32259e-13 -2.1938e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1918 1919 4.27849 -0.257687 -0.184057 -0.00272411 0.085787 -0.0919387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1869 1919 1.08962e-11 -3.05972 -0.0937068 0.0612327 2.31815e-13 -2.19824e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1919 1920 4.27287 -0.257654 -0.183575 -0.00272343 0.0856745 -0.0920435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1870 1920 1.08749e-11 -3.05972 -0.0937068 0.0612327 2.31815e-13 -2.19824e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1920 1921 4.26726 -0.257621 -0.183094 -0.00272272 0.0855618 -0.0921481 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1871 1921 1.08678e-11 -3.05972 -0.0937068 0.0612327 2.3137e-13 -2.20268e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1921 1922 4.26163 -0.257585 -0.182612 -0.00272199 0.0854491 -0.0922527 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1872 1922 1.08535e-11 -3.05972 -0.0937068 0.0612327 2.30926e-13 -2.20268e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1922 1923 4.256 -0.257549 -0.182131 -0.00272124 0.0853362 -0.0923571 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1873 1923 1.08411e-11 -3.05972 -0.0937068 0.0612327 2.30926e-13 -2.20712e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1923 1924 4.25037 -0.257512 -0.181649 -0.00272046 0.0852232 -0.0924613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1874 1924 1.08225e-11 -3.05972 -0.0937068 0.0612327 2.30482e-13 -2.21156e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1924 1925 4.24472 -0.257473 -0.181168 -0.00271966 0.0851101 -0.0925654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1875 1925 1.08089e-11 -3.05972 -0.0937068 0.0612327 2.30482e-13 -2.21156e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1925 1926 4.23908 -0.257433 -0.180687 -0.00271884 0.0849968 -0.0926694 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1876 1926 1.07949e-11 -3.05972 -0.0937068 0.0612327 2.30038e-13 -2.21601e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1926 1927 4.23342 -0.257392 -0.180206 -0.00271799 0.0848834 -0.0927732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1877 1927 1.07789e-11 -3.05972 -0.0937068 0.0612327 2.30038e-13 -2.22045e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1927 1928 4.22776 -0.25735 -0.179725 -0.00271712 0.0847699 -0.0928769 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1878 1928 1.07647e-11 -3.05972 -0.0937068 0.0612327 2.29594e-13 -2.22045e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1928 1929 4.22209 -0.257307 -0.179244 -0.00271622 0.0846563 -0.0929804 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1879 1929 1.07487e-11 -3.05972 -0.0937068 0.0612327 2.2915e-13 -2.22489e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1929 1930 4.21642 -0.257263 -0.178763 -0.0027153 0.0845425 -0.0930838 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1880 1930 1.07363e-11 -3.05972 -0.0937068 0.0612327 2.2915e-13 -2.22933e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1930 1931 4.21074 -0.257217 -0.178282 -0.00271436 0.0844286 -0.0931871 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1881 1931 1.07256e-11 -3.05972 -0.0937068 0.0612327 2.28706e-13 -2.22933e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1931 1932 4.20505 -0.25717 -0.177802 -0.00271339 0.0843146 -0.0932902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1882 1932 1.07043e-11 -3.05972 -0.0937068 0.0612327 2.28262e-13 -2.23377e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1932 1933 4.19936 -0.257122 -0.177321 -0.0027124 0.0842004 -0.0933932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1883 1933 1.06972e-11 -3.05972 -0.0937068 0.0612327 2.28262e-13 -2.23821e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1933 1934 4.19366 -0.257073 -0.176841 -0.00271139 0.0840862 -0.093496 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1884 1934 1.06777e-11 -3.05972 -0.0937068 0.0612327 2.27818e-13 -2.23821e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1934 1935 4.18795 -0.257022 -0.176361 -0.00271035 0.0839718 -0.0935987 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1885 1935 1.06635e-11 -3.05972 -0.0937068 0.0612327 2.27818e-13 -2.24265e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1935 1936 4.18224 -0.256971 -0.175881 -0.00270929 0.0838572 -0.0937013 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1886 1936 1.06484e-11 -3.05972 -0.0937068 0.0612327 2.27374e-13 -2.24265e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1936 1937 4.17652 -0.256918 -0.175401 -0.0027082 0.0837426 -0.0938037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1887 1937 1.0635e-11 -3.05972 -0.0937068 0.0612327 2.2693e-13 -2.24709e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1937 1938 4.17079 -0.256864 -0.174921 -0.0027071 0.0836278 -0.093906 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1888 1938 1.06204e-11 -3.05972 -0.0937068 0.0612327 2.2693e-13 -2.25153e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1938 1939 4.16506 -0.256809 -0.174441 -0.00270597 0.0835129 -0.0940081 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1889 1939 1.0604e-11 -3.05972 -0.0937068 0.0612327 2.26485e-13 -2.25153e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1939 1940 4.15933 -0.256753 -0.173962 -0.00270481 0.0833979 -0.0941101 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1890 1940 1.05924e-11 -3.05972 -0.0937068 0.0612327 2.26485e-13 -2.25597e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1940 1941 4.15358 -0.256695 -0.173482 -0.00270363 0.0832828 -0.0942119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1891 1941 1.05747e-11 -3.05972 -0.0937068 0.0612327 2.26041e-13 -2.25597e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1941 1942 4.14783 -0.256637 -0.173003 -0.00270243 0.0831675 -0.0943136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1892 1942 1.05587e-11 -3.05972 -0.0937068 0.0612327 2.25597e-13 -2.26041e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1942 1943 4.14208 -0.256577 -0.172524 -0.0027012 0.0830521 -0.0944152 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1893 1943 1.05409e-11 -3.05972 -0.0937068 0.0612327 2.25597e-13 -2.26485e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1943 1944 4.13632 -0.256516 -0.172045 -0.00269995 0.0829366 -0.0945166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1894 1944 1.05373e-11 -3.05972 -0.0937068 0.0612327 2.25153e-13 -2.26485e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1944 1945 4.13055 -0.256454 -0.171566 -0.00269868 0.082821 -0.0946179 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1895 1945 1.05143e-11 -3.05972 -0.0937068 0.0612327 2.24709e-13 -2.2693e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1945 1946 4.12477 -0.256391 -0.171088 -0.00269739 0.0827052 -0.094719 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1896 1946 1.05054e-11 -3.05972 -0.0937068 0.0612327 2.24709e-13 -2.27374e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1946 1947 4.11899 -0.256326 -0.170609 -0.00269607 0.0825893 -0.09482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1897 1947 1.04894e-11 -3.05972 -0.0937068 0.0612327 2.24265e-13 -2.27374e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1947 1948 4.1132 -0.256261 -0.170131 -0.00269472 0.0824733 -0.0949209 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1898 1948 1.04716e-11 -3.05972 -0.0937068 0.0612327 2.23821e-13 -2.27818e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1948 1949 4.10741 -0.256194 -0.169652 -0.00269336 0.0823572 -0.0950216 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1899 1949 1.04583e-11 -3.05972 -0.0937068 0.0612327 2.23821e-13 -2.27818e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1949 1950 4.10161 -0.256126 -0.169174 -0.00269197 0.0822409 -0.0951221 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1900 1950 1.04437e-11 -3.05972 -0.0937068 0.0612327 2.23377e-13 -2.28262e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1950 1951 4.09581 -0.256057 -0.168697 -0.00269055 0.0821245 -0.0952226 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1901 1951 1.0429e-11 -3.05972 -0.0937068 0.0612327 2.23377e-13 -2.28706e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1951 1952 4.09 -0.255986 -0.168219 -0.00268912 0.082008 -0.0953228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1902 1952 1.04157e-11 -3.05972 -0.0937068 0.0612327 2.22933e-13 -2.28706e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1952 1953 4.08418 -0.255915 -0.167741 -0.00268766 0.0818914 -0.095423 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1903 1953 1.0397e-11 -3.05972 -0.0937068 0.0612327 2.22933e-13 -2.2915e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1953 1954 4.07835 -0.255842 -0.167264 -0.00268617 0.0817747 -0.0955229 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1904 1954 1.03881e-11 -3.05972 -0.0937068 0.0612327 2.22489e-13 -2.29594e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1954 1955 4.07252 -0.255768 -0.166787 -0.00268466 0.0816578 -0.0956228 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1905 1955 1.03668e-11 -3.05972 -0.0937068 0.0612327 2.22045e-13 -2.29594e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1955 1956 4.06669 -0.255693 -0.16631 -0.00268313 0.0815408 -0.0957225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1906 1956 1.03562e-11 -3.05972 -0.0937068 0.0612327 2.22045e-13 -2.30038e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1956 1957 4.06085 -0.255617 -0.165833 -0.00268158 0.0814237 -0.095822 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1907 1957 1.03419e-11 -3.05972 -0.0937068 0.0612327 2.21601e-13 -2.30038e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1957 1958 4.055 -0.25554 -0.165356 -0.00268 0.0813065 -0.0959214 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1908 1958 1.03242e-11 -3.05972 -0.0937068 0.0612327 2.21156e-13 -2.30482e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1958 1959 4.04914 -0.255461 -0.16488 -0.0026784 0.0811891 -0.0960207 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1909 1959 1.031e-11 -3.05972 -0.0937068 0.0612327 2.21156e-13 -2.30926e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1959 1960 4.04328 -0.255382 -0.164404 -0.00267678 0.0810716 -0.0961198 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1910 1960 1.02958e-11 -3.05972 -0.0937068 0.0612327 2.20712e-13 -2.30926e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1960 1961 4.03742 -0.255301 -0.163928 -0.00267513 0.0809541 -0.0962188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1911 1961 1.02807e-11 -3.05972 -0.0937068 0.0612327 2.20268e-13 -2.3137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1961 1962 4.03154 -0.255219 -0.163452 -0.00267346 0.0808363 -0.0963176 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1912 1962 1.02642e-11 -3.05972 -0.0937068 0.0612327 2.20268e-13 -2.3137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1962 1963 4.02567 -0.255136 -0.162976 -0.00267176 0.0807185 -0.0964163 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1913 1963 1.025e-11 -3.05972 -0.0937068 0.0612327 2.19824e-13 -2.31815e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1963 1964 4.01978 -0.255051 -0.162501 -0.00267005 0.0806006 -0.0965148 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1914 1964 1.02354e-11 -3.05972 -0.0937068 0.0612327 2.1938e-13 -2.32259e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1964 1965 4.01389 -0.254966 -0.162026 -0.0026683 0.0804825 -0.0966132 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1915 1965 1.02212e-11 -3.05972 -0.0937068 0.0612327 2.1938e-13 -2.32259e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1965 1966 4.00799 -0.254879 -0.161551 -0.00266654 0.0803643 -0.0967115 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1916 1966 1.02069e-11 -3.05972 -0.0937068 0.0612327 2.18936e-13 -2.32703e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1966 1967 4.00209 -0.254791 -0.161076 -0.00266475 0.080246 -0.0968095 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1917 1967 1.01874e-11 -3.05972 -0.0937068 0.0612327 2.18492e-13 -2.32703e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1967 1968 3.99618 -0.254702 -0.160601 -0.00266294 0.0801275 -0.0969075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1918 1968 1.0175e-11 -3.05972 -0.0937068 0.0612327 2.18492e-13 -2.33147e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1968 1969 3.99027 -0.254612 -0.160127 -0.00266111 0.080009 -0.0970053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1919 1969 1.01625e-11 -3.05972 -0.0937068 0.0612327 2.18048e-13 -2.33591e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1969 1970 3.98435 -0.254521 -0.159653 -0.00265925 0.0798903 -0.097103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1920 1970 1.0143e-11 -3.05972 -0.0937068 0.0612327 2.18048e-13 -2.33591e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1970 1971 3.97842 -0.254428 -0.159179 -0.00265737 0.0797715 -0.0972005 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1921 1971 1.01306e-11 -3.05972 -0.0937068 0.0612327 2.17604e-13 -2.34035e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1971 1972 3.97249 -0.254335 -0.158705 -0.00265547 0.0796526 -0.0972978 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1922 1972 1.01128e-11 -3.05972 -0.0937068 0.0612327 2.1716e-13 -2.34479e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1972 1973 3.96655 -0.25424 -0.158232 -0.00265354 0.0795336 -0.0973951 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1923 1973 1.00959e-11 -3.05972 -0.0937068 0.0612327 2.1716e-13 -2.34479e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1973 1974 3.96061 -0.254144 -0.157759 -0.00265159 0.0794144 -0.0974921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1924 1974 1.00857e-11 -3.05972 -0.0937068 0.0612327 2.16716e-13 -2.34923e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1974 1975 3.95466 -0.254047 -0.157286 -0.00264962 0.0792952 -0.0975891 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1925 1975 1.00687e-11 -3.05972 -0.0937068 0.0612327 2.16271e-13 -2.34923e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1975 1976 3.9487 -0.253949 -0.156813 -0.00264762 0.0791758 -0.0976858 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1926 1976 1.00528e-11 -3.05972 -0.0937068 0.0612327 2.16271e-13 -2.35367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1976 1977 3.94274 -0.253849 -0.156341 -0.0026456 0.0790563 -0.0977825 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1927 1977 1.00409e-11 -3.05972 -0.0937068 0.0612327 2.15827e-13 -2.35367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1977 1978 3.93677 -0.253749 -0.155868 -0.00264356 0.0789367 -0.0978789 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1928 1978 1.0024e-11 -3.05972 -0.0937068 0.0612327 2.15383e-13 -2.35811e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1978 1979 3.93079 -0.253647 -0.155396 -0.00264149 0.0788169 -0.0979753 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1929 1979 1.00098e-11 -3.05972 -0.0937068 0.0612327 2.15383e-13 -2.36255e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1979 1980 3.92481 -0.253544 -0.154925 -0.0026394 0.0786971 -0.0980715 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1930 1980 9.98845e-12 -3.05972 -0.0937068 0.0612327 2.14939e-13 -2.36255e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1980 1981 3.91883 -0.25344 -0.154453 -0.00263729 0.0785771 -0.0981675 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1931 1981 9.9778e-12 -3.05972 -0.0937068 0.0612327 2.14939e-13 -2.367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1981 1982 3.91284 -0.253335 -0.153982 -0.00263515 0.078457 -0.0982634 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1932 1982 9.96359e-12 -3.05972 -0.0937068 0.0612327 2.14495e-13 -2.367e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1982 1983 3.90684 -0.253228 -0.153511 -0.00263299 0.0783368 -0.0983591 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1933 1983 9.94937e-12 -3.05972 -0.0937068 0.0612327 2.14051e-13 -2.37144e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1983 1984 3.90084 -0.253121 -0.15304 -0.00263081 0.0782165 -0.0984547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1934 1984 9.93161e-12 -3.05972 -0.0937068 0.0612327 2.14051e-13 -2.37588e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1984 1985 3.89483 -0.253012 -0.15257 -0.00262861 0.0780961 -0.0985502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1935 1985 9.91562e-12 -3.05972 -0.0937068 0.0612327 2.13607e-13 -2.37588e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1985 1986 3.88881 -0.252902 -0.152099 -0.00262638 0.0779755 -0.0986455 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1936 1986 9.90141e-12 -3.05972 -0.0937068 0.0612327 2.13163e-13 -2.38032e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1986 1987 3.88279 -0.252791 -0.15163 -0.00262413 0.0778549 -0.0987406 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1937 1987 9.8852e-12 -3.05972 -0.0937068 0.0612327 2.13163e-13 -2.38032e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1987 1988 3.87676 -0.252679 -0.15116 -0.00262186 0.0777341 -0.0988356 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1938 1988 9.86988e-12 -3.05972 -0.0937068 0.0612327 2.12719e-13 -2.38476e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1988 1989 3.87073 -0.252566 -0.150691 -0.00261956 0.0776132 -0.0989305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1939 1989 9.85523e-12 -3.05972 -0.0937068 0.0612327 2.12275e-13 -2.3892e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1989 1990 3.86469 -0.252452 -0.150221 -0.00261724 0.0774922 -0.0990252 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1940 1990 9.84102e-12 -3.05972 -0.0937068 0.0612327 2.12275e-13 -2.3892e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1990 1991 3.85865 -0.252336 -0.149753 -0.0026149 0.077371 -0.0991197 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1941 1991 9.82503e-12 -3.05972 -0.0937068 0.0612327 2.11831e-13 -2.39364e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1991 1992 3.8526 -0.252219 -0.149284 -0.00261253 0.0772498 -0.0992141 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1942 1992 9.81082e-12 -3.05972 -0.0937068 0.0612327 2.11386e-13 -2.39364e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1992 1993 3.84654 -0.252101 -0.148816 -0.00261014 0.0771284 -0.0993084 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1943 1993 9.79838e-12 -3.05972 -0.0937068 0.0612327 2.11386e-13 -2.39808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1993 1994 3.84048 -0.251982 -0.148348 -0.00260773 0.0770069 -0.0994025 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1944 1994 9.77529e-12 -3.05972 -0.0937068 0.0612327 2.10942e-13 -2.39808e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1994 1995 3.83441 -0.251862 -0.14788 -0.0026053 0.0768853 -0.0994964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1945 1995 9.76108e-12 -3.05972 -0.0937068 0.0612327 2.10498e-13 -2.40252e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1995 1996 3.82834 -0.251741 -0.147413 -0.00260284 0.0767636 -0.0995902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1946 1996 9.74687e-12 -3.05972 -0.0937068 0.0612327 2.10498e-13 -2.40696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1996 1997 3.82226 -0.251619 -0.146946 -0.00260036 0.0766418 -0.0996839 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1947 1997 9.73266e-12 -3.05972 -0.0937068 0.0612327 2.10054e-13 -2.40696e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1997 1998 3.81618 -0.251495 -0.146479 -0.00259785 0.0765199 -0.0997774 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1948 1998 9.71667e-12 -3.05972 -0.0937068 0.0612327 2.0961e-13 -2.4114e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1998 1999 3.81009 -0.25137 -0.146013 -0.00259533 0.0763978 -0.0998707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1949 1999 9.6998e-12 -3.05972 -0.0937068 0.0612327 2.0961e-13 -2.4114e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1999 2000 3.80399 -0.251244 -0.145547 -0.00259278 0.0762757 -0.0999639 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1950 2000 9.68433e-12 -3.05972 -0.0937068 0.0612327 2.09166e-13 -2.41585e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2000 2001 3.79789 -0.251117 -0.145081 -0.00259021 0.0761534 -0.100057 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1951 2001 9.66782e-12 -3.05972 -0.0937068 0.0612327 2.08722e-13 -2.41585e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2001 2002 3.79178 -0.250989 -0.144615 -0.00258761 0.076031 -0.10015 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1952 2002 9.65272e-12 -3.05972 -0.0937068 0.0612327 2.08722e-13 -2.42029e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2002 2003 3.78567 -0.25086 -0.14415 -0.00258499 0.0759085 -0.100243 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1953 2003 9.63674e-12 -3.05972 -0.0937068 0.0612327 2.08278e-13 -2.42473e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2003 2004 3.77955 -0.25073 -0.143685 -0.00258235 0.0757859 -0.100335 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1954 2004 9.62252e-12 -3.05972 -0.0937068 0.0612327 2.07834e-13 -2.42473e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2004 2005 3.77343 -0.250598 -0.143221 -0.00257969 0.0756632 -0.100428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1955 2005 9.60476e-12 -3.05972 -0.0937068 0.0612327 2.0739e-13 -2.42917e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2005 2006 3.7673 -0.250465 -0.142756 -0.00257701 0.0755403 -0.10052 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1956 2006 9.5941e-12 -3.05972 -0.0937068 0.0612327 2.0739e-13 -2.42917e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2006 2007 3.76116 -0.250331 -0.142292 -0.0025743 0.0754174 -0.100612 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1957 2007 9.57634e-12 -3.05972 -0.0937068 0.0612327 2.06946e-13 -2.43361e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2007 2008 3.75502 -0.250196 -0.141829 -0.00257157 0.0752943 -0.100704 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1958 2008 9.5568e-12 -3.05972 -0.0937068 0.0612327 2.06946e-13 -2.43361e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2008 2009 3.74887 -0.25006 -0.141366 -0.00256881 0.0751712 -0.100796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1959 2009 9.54081e-12 -3.05972 -0.0937068 0.0612327 2.06501e-13 -2.43805e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2009 2010 3.74272 -0.249923 -0.140903 -0.00256604 0.0750479 -0.100888 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1960 2010 9.5266e-12 -3.05972 -0.0937068 0.0612327 2.06057e-13 -2.44249e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2010 2011 3.73656 -0.249785 -0.14044 -0.00256324 0.0749245 -0.100979 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1961 2011 9.51239e-12 -3.05972 -0.0937068 0.0612327 2.06057e-13 -2.44249e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2011 2012 3.7304 -0.249645 -0.139978 -0.00256041 0.074801 -0.101071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1962 2012 9.4964e-12 -3.05972 -0.0937068 0.0612327 2.05613e-13 -2.44693e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2012 2013 3.72423 -0.249504 -0.139516 -0.00255757 0.0746773 -0.101162 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1963 2013 9.48108e-12 -3.05972 -0.0937068 0.0612327 2.05169e-13 -2.44693e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2013 2014 3.71805 -0.249363 -0.139054 -0.0025547 0.0745536 -0.101253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1964 2014 9.46532e-12 -3.05972 -0.0937068 0.0612327 2.04725e-13 -2.45137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2014 2015 3.71187 -0.24922 -0.138593 -0.00255181 0.0744298 -0.101344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1965 2015 9.45022e-12 -3.05972 -0.0937068 0.0612327 2.04725e-13 -2.45137e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2015 2016 3.70569 -0.249076 -0.138132 -0.0025489 0.0743058 -0.101435 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1966 2016 9.43423e-12 -3.05972 -0.0937068 0.0612327 2.04281e-13 -2.45581e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2016 2017 3.69949 -0.248931 -0.137672 -0.00254597 0.0741817 -0.101525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1967 2017 9.41824e-12 -3.05972 -0.0937068 0.0612327 2.04281e-13 -2.46025e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2017 2018 3.6933 -0.248784 -0.137212 -0.00254301 0.0740576 -0.101616 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1968 2018 9.40226e-12 -3.05972 -0.0937068 0.0612327 2.03837e-13 -2.46025e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2018 2019 3.68709 -0.248637 -0.136752 -0.00254003 0.0739333 -0.101706 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1969 2019 9.38449e-12 -3.05972 -0.0937068 0.0612327 2.03393e-13 -2.4647e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2019 2020 3.68089 -0.248488 -0.136292 -0.00253703 0.0738089 -0.101796 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1970 2020 9.37206e-12 -3.05972 -0.0937068 0.0612327 2.02949e-13 -2.4647e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2020 2021 3.67467 -0.248339 -0.135833 -0.002534 0.0736844 -0.101886 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1971 2021 9.3543e-12 -3.05972 -0.0937068 0.0612327 2.02949e-13 -2.46914e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2021 2022 3.66845 -0.248188 -0.135375 -0.00253095 0.0735598 -0.101976 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1972 2022 9.34008e-12 -3.05972 -0.0937068 0.0612327 2.02505e-13 -2.46914e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2022 2023 3.66223 -0.248036 -0.134916 -0.00252788 0.073435 -0.102066 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1973 2023 9.32321e-12 -3.05972 -0.0937068 0.0612327 2.02061e-13 -2.47358e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2023 2024 3.656 -0.247883 -0.134458 -0.00252479 0.0733102 -0.102155 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1974 2024 9.30589e-12 -3.05972 -0.0937068 0.0612327 2.02061e-13 -2.47802e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2024 2025 3.64976 -0.247729 -0.134001 -0.00252168 0.0731853 -0.102245 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1975 2025 9.29086e-12 -3.05972 -0.0937068 0.0612327 2.01617e-13 -2.47802e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2025 2026 3.64352 -0.247573 -0.133544 -0.00251854 0.0730602 -0.102334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1976 2026 9.27525e-12 -3.05972 -0.0937068 0.0612327 2.01172e-13 -2.48246e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2026 2027 3.63727 -0.247417 -0.133087 -0.00251538 0.0729351 -0.102423 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1977 2027 9.25748e-12 -3.05972 -0.0937068 0.0612327 2.01172e-13 -2.48246e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2027 2028 3.63102 -0.24726 -0.13263 -0.0025122 0.0728098 -0.102512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1978 2028 9.24061e-12 -3.05972 -0.0937068 0.0612327 2.00728e-13 -2.4869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2028 2029 3.62476 -0.247101 -0.132174 -0.002509 0.0726844 -0.102601 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1979 2029 9.2264e-12 -3.05972 -0.0937068 0.0612327 2.00284e-13 -2.4869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2029 2030 3.6185 -0.246941 -0.131719 -0.00250577 0.0725589 -0.102689 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1980 2030 9.21752e-12 -3.05972 -0.0937068 0.0612327 2.00284e-13 -2.49134e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2030 2031 3.61223 -0.24678 -0.131264 -0.00250252 0.0724333 -0.102778 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1981 2031 9.19265e-12 -3.05972 -0.0937068 0.0612327 1.9984e-13 -2.49134e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2031 2032 3.60596 -0.246618 -0.130809 -0.00249925 0.0723076 -0.102866 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1982 2032 9.17666e-12 -3.05972 -0.0937068 0.0612327 1.99396e-13 -2.49578e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2032 2033 3.59968 -0.246455 -0.130354 -0.00249596 0.0721818 -0.102954 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1983 2033 9.16067e-12 -3.05972 -0.0937068 0.0612327 1.98952e-13 -2.49578e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2033 2034 3.59339 -0.246291 -0.1299 -0.00249264 0.0720559 -0.103042 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1984 2034 9.14646e-12 -3.05972 -0.0937068 0.0612327 1.98952e-13 -2.50022e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2034 2035 3.5871 -0.246126 -0.129447 -0.0024893 0.0719299 -0.10313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1985 2035 9.13225e-12 -3.05972 -0.0937068 0.0612327 1.98508e-13 -2.50466e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2035 2036 3.58081 -0.245959 -0.128993 -0.00248594 0.0718038 -0.103218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1986 2036 9.11538e-12 -3.05972 -0.0937068 0.0612327 1.98064e-13 -2.50466e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2036 2037 3.57451 -0.245792 -0.12854 -0.00248256 0.0716775 -0.103305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1987 2037 9.09872e-12 -3.05972 -0.0937068 0.0612327 1.98064e-13 -2.5091e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2037 2038 3.5682 -0.245623 -0.128088 -0.00247916 0.0715512 -0.103393 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1988 2038 9.08296e-12 -3.05972 -0.0937068 0.0612327 1.9762e-13 -2.5091e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2038 2039 3.56189 -0.245453 -0.127636 -0.00247573 0.0714247 -0.10348 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1989 2039 9.06653e-12 -3.05972 -0.0937068 0.0612327 1.97176e-13 -2.51354e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2039 2040 3.55557 -0.245282 -0.127184 -0.00247228 0.0712982 -0.103567 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1990 2040 9.04876e-12 -3.05972 -0.0937068 0.0612327 1.97176e-13 -2.51354e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2040 2041 3.54925 -0.245111 -0.126733 -0.00246881 0.0711715 -0.103654 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1991 2041 9.03277e-12 -3.05972 -0.0937068 0.0612327 1.96732e-13 -2.51799e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2041 2042 3.54292 -0.244937 -0.126282 -0.00246532 0.0710448 -0.103741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1992 2042 9.02212e-12 -3.05972 -0.0937068 0.0612327 1.96287e-13 -2.52243e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2042 2043 3.53659 -0.244763 -0.125832 -0.0024618 0.0709179 -0.103827 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1993 2043 9.00258e-12 -3.05972 -0.0937068 0.0612327 1.96287e-13 -2.52243e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2043 2044 3.53025 -0.244588 -0.125382 -0.00245827 0.0707909 -0.103914 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1994 2044 8.98659e-12 -3.05972 -0.0937068 0.0612327 1.95843e-13 -2.52243e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2044 2045 3.52391 -0.244412 -0.124933 -0.00245471 0.0706638 -0.104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1995 2045 8.96883e-12 -3.05972 -0.0937068 0.0612327 1.95399e-13 -2.52687e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2045 2046 3.51756 -0.244234 -0.124484 -0.00245113 0.0705366 -0.104086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1996 2046 8.95284e-12 -3.05972 -0.0937068 0.0612327 1.95399e-13 -2.53131e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2046 2047 3.51121 -0.244056 -0.124035 -0.00244753 0.0704094 -0.104172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1997 2047 8.93685e-12 -3.05972 -0.0937068 0.0612327 1.94955e-13 -2.53131e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2047 2048 3.50485 -0.243876 -0.123587 -0.0024439 0.070282 -0.104258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1998 2048 8.92264e-12 -3.05972 -0.0937068 0.0612327 1.94511e-13 -2.53575e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2048 2049 3.49848 -0.243695 -0.123139 -0.00244026 0.0701545 -0.104344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 1999 2049 8.90443e-12 -3.05972 -0.0937068 0.0612327 1.94067e-13 -2.53575e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2049 2050 3.49211 -0.243513 -0.122692 -0.00243659 0.0700269 -0.104429 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2000 2050 8.88867e-12 -3.05972 -0.0937068 0.0612327 1.94067e-13 -2.54019e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2050 2051 3.48574 -0.24333 -0.122245 -0.0024329 0.0698991 -0.104515 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2001 2051 8.8729e-12 -3.05972 -0.0937068 0.0612327 1.93623e-13 -2.54019e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2051 2052 3.47936 -0.243146 -0.121799 -0.00242919 0.0697713 -0.1046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2002 2052 8.85514e-12 -3.05972 -0.0937068 0.0612327 1.93179e-13 -2.54463e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2052 2053 3.47297 -0.242961 -0.121353 -0.00242545 0.0696434 -0.104685 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2003 2053 8.8427e-12 -3.05972 -0.0937068 0.0612327 1.93179e-13 -2.54907e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2053 2054 3.46658 -0.242775 -0.120907 -0.0024217 0.0695154 -0.10477 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2004 2054 8.82139e-12 -3.05972 -0.0937068 0.0612327 1.92735e-13 -2.54907e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2054 2055 3.46018 -0.242587 -0.120462 -0.00241792 0.0693873 -0.104854 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2005 2055 8.81073e-12 -3.05972 -0.0937068 0.0612327 1.92291e-13 -2.54907e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2055 2056 3.45378 -0.242399 -0.120018 -0.00241412 0.069259 -0.104939 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2006 2056 8.78586e-12 -3.05972 -0.0937068 0.0612327 1.92291e-13 -2.55351e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2056 2057 3.44738 -0.24221 -0.119574 -0.0024103 0.0691307 -0.105023 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2007 2057 8.7752e-12 -3.05972 -0.0937068 0.0612327 1.91847e-13 -2.55351e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2057 2058 3.44097 -0.242019 -0.11913 -0.00240646 0.0690023 -0.105108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2008 2058 8.75922e-12 -3.05972 -0.0937068 0.0612327 1.91402e-13 -2.55795e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2058 2059 3.43455 -0.241827 -0.118687 -0.00240259 0.0688737 -0.105192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2009 2059 8.745e-12 -3.05972 -0.0937068 0.0612327 1.90958e-13 -2.55795e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2059 2060 3.42813 -0.241634 -0.118244 -0.00239871 0.0687451 -0.105276 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2010 2060 8.72724e-12 -3.05972 -0.0937068 0.0612327 1.90958e-13 -2.56239e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2060 2061 3.4217 -0.241441 -0.117802 -0.0023948 0.0686164 -0.105359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2011 2061 8.70859e-12 -3.05972 -0.0937068 0.0612327 1.90514e-13 -2.56684e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2061 2062 3.41527 -0.241246 -0.11736 -0.00239087 0.0684875 -0.105443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2012 2062 8.69282e-12 -3.05972 -0.0937068 0.0612327 1.9007e-13 -2.56684e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2062 2063 3.40883 -0.24105 -0.116919 -0.00238692 0.0683586 -0.105526 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2013 2063 8.67595e-12 -3.05972 -0.0937068 0.0612327 1.9007e-13 -2.57128e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2063 2064 3.40239 -0.240853 -0.116478 -0.00238295 0.0682295 -0.10561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2014 2064 8.66063e-12 -3.05972 -0.0937068 0.0612327 1.89626e-13 -2.57128e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2064 2065 3.39594 -0.240654 -0.116038 -0.00237895 0.0681004 -0.105693 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2015 2065 8.64286e-12 -3.05972 -0.0937068 0.0612327 1.89182e-13 -2.57572e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2065 2066 3.38949 -0.240455 -0.115598 -0.00237494 0.0679711 -0.105776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2016 2066 8.62599e-12 -3.05972 -0.0937068 0.0612327 1.89182e-13 -2.57572e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2066 2067 3.38303 -0.240255 -0.115159 -0.0023709 0.0678418 -0.105859 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2017 2067 8.61178e-12 -3.05972 -0.0937068 0.0612327 1.88738e-13 -2.58016e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2067 2068 3.37657 -0.240053 -0.11472 -0.00236684 0.0677124 -0.105941 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2018 2068 8.59579e-12 -3.05972 -0.0937068 0.0612327 1.88294e-13 -2.58016e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2068 2069 3.3701 -0.239851 -0.114282 -0.00236276 0.0675828 -0.106024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2019 2069 8.5798e-12 -3.05972 -0.0937068 0.0612327 1.8785e-13 -2.5846e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2069 2070 3.36363 -0.239647 -0.113844 -0.00235866 0.0674532 -0.106106 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2020 2070 8.56204e-12 -3.05972 -0.0937068 0.0612327 1.8785e-13 -2.5846e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2070 2071 3.35715 -0.239443 -0.113407 -0.00235454 0.0673234 -0.106188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2021 2071 8.54783e-12 -3.05972 -0.0937068 0.0612327 1.87406e-13 -2.58904e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2071 2072 3.35067 -0.239237 -0.11297 -0.0023504 0.0671936 -0.10627 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2022 2072 8.52651e-12 -3.05972 -0.0937068 0.0612327 1.86962e-13 -2.58904e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2072 2073 3.34418 -0.23903 -0.112533 -0.00234623 0.0670636 -0.106352 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2023 2073 8.5123e-12 -3.05972 -0.0937068 0.0612327 1.86517e-13 -2.59348e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2073 2074 3.33769 -0.238822 -0.112098 -0.00234204 0.0669336 -0.106434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2024 2074 8.49498e-12 -3.05972 -0.0937068 0.0612327 1.86517e-13 -2.59348e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2074 2075 3.33119 -0.238614 -0.111662 -0.00233784 0.0668034 -0.106516 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2025 2075 8.47816e-12 -3.05972 -0.0937068 0.0612327 1.86073e-13 -2.59792e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2075 2076 3.32469 -0.238404 -0.111227 -0.00233361 0.0666732 -0.106597 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2026 2076 8.46079e-12 -3.05972 -0.0937068 0.0612327 1.85629e-13 -2.59792e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2076 2077 3.31818 -0.238193 -0.110793 -0.00232936 0.0665428 -0.106678 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2027 2077 8.44569e-12 -3.05972 -0.0937068 0.0612327 1.85629e-13 -2.60236e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2077 2078 3.31166 -0.23798 -0.110359 -0.00232509 0.0664124 -0.106759 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2028 2078 8.43059e-12 -3.05972 -0.0937068 0.0612327 1.85185e-13 -2.60236e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2078 2079 3.30515 -0.237767 -0.109926 -0.00232079 0.0662818 -0.10684 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2029 2079 8.41105e-12 -3.05972 -0.0937068 0.0612327 1.84741e-13 -2.6068e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2079 2080 3.29862 -0.237553 -0.109493 -0.00231648 0.0661512 -0.106921 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2030 2080 8.39506e-12 -3.05972 -0.0937068 0.0612327 1.84741e-13 -2.6068e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2080 2081 3.2921 -0.237338 -0.109061 -0.00231214 0.0660204 -0.107002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2031 2081 8.37908e-12 -3.05972 -0.0937068 0.0612327 1.84297e-13 -2.61124e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2081 2082 3.28556 -0.237121 -0.10863 -0.00230779 0.0658896 -0.107082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2032 2082 8.35954e-12 -3.05972 -0.0937068 0.0612327 1.83853e-13 -2.61124e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2082 2083 3.27903 -0.236904 -0.108198 -0.00230341 0.0657587 -0.107162 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2033 2083 8.3471e-12 -3.05972 -0.0937068 0.0612327 1.83409e-13 -2.61569e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2083 2084 3.27248 -0.236686 -0.107768 -0.00229901 0.0656276 -0.107242 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2034 2084 8.32756e-12 -3.05972 -0.0937068 0.0612327 1.83409e-13 -2.62013e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2084 2085 3.26594 -0.236466 -0.107338 -0.00229459 0.0654965 -0.107322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2035 2085 8.31157e-12 -3.05972 -0.0937068 0.0612327 1.82965e-13 -2.62013e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2085 2086 3.25938 -0.236246 -0.106908 -0.00229015 0.0653653 -0.107402 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2036 2086 8.2947e-12 -3.05972 -0.0937068 0.0612327 1.82521e-13 -2.62013e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2086 2087 3.25283 -0.236024 -0.106479 -0.00228569 0.0652339 -0.107482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2037 2087 8.27849e-12 -3.05972 -0.0937068 0.0612327 1.82077e-13 -2.62457e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2087 2088 3.24626 -0.235801 -0.106051 -0.00228121 0.0651025 -0.107561 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2038 2088 8.26184e-12 -3.05972 -0.0937068 0.0612327 1.82077e-13 -2.62457e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2088 2089 3.2397 -0.235578 -0.105623 -0.00227671 0.064971 -0.10764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2039 2089 8.24585e-12 -3.05972 -0.0937068 0.0612327 1.81632e-13 -2.62901e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2089 2090 3.23313 -0.235353 -0.105196 -0.00227218 0.0648394 -0.10772 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2040 2090 8.22897e-12 -3.05972 -0.0937068 0.0612327 1.81188e-13 -2.62901e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2090 2091 3.22655 -0.235127 -0.104769 -0.00226764 0.0647077 -0.107799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2041 2091 8.21032e-12 -3.05972 -0.0937068 0.0612327 1.80744e-13 -2.63345e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2091 2092 3.21997 -0.2349 -0.104343 -0.00226307 0.0645759 -0.107877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2042 2092 8.19256e-12 -3.05972 -0.0937068 0.0612327 1.80744e-13 -2.63345e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2092 2093 3.21338 -0.234672 -0.103917 -0.00225849 0.064444 -0.107956 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2043 2093 8.17479e-12 -3.05972 -0.0937068 0.0612327 1.803e-13 -2.63789e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2093 2094 3.20679 -0.234443 -0.103492 -0.00225388 0.064312 -0.108034 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2044 2094 8.16414e-12 -3.05972 -0.0937068 0.0612327 1.79856e-13 -2.63789e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2094 2095 3.20019 -0.234213 -0.103067 -0.00224925 0.0641799 -0.108113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2045 2095 8.14282e-12 -3.05972 -0.0937068 0.0612327 1.79412e-13 -2.64233e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2095 2096 3.19359 -0.233982 -0.102643 -0.0022446 0.0640477 -0.108191 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2046 2096 8.12506e-12 -3.05972 -0.0937068 0.0612327 1.79412e-13 -2.64233e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2096 2097 3.18699 -0.23375 -0.10222 -0.00223993 0.0639154 -0.108269 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2047 2097 8.11262e-12 -3.05972 -0.0937068 0.0612327 1.78968e-13 -2.64677e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2097 2098 3.18038 -0.233517 -0.101797 -0.00223524 0.063783 -0.108347 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2048 2098 8.09308e-12 -3.05972 -0.0937068 0.0612327 1.78524e-13 -2.64677e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2098 2099 3.17376 -0.233283 -0.101375 -0.00223053 0.0636505 -0.108424 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2049 2099 8.07709e-12 -3.05972 -0.0937068 0.0612327 1.78524e-13 -2.65121e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2099 2100 3.16714 -0.233048 -0.100953 -0.0022258 0.063518 -0.108502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2050 2100 8.0597e-12 -3.05972 -0.0937068 0.0612327 1.7808e-13 -2.65121e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2100 2101 3.16052 -0.232812 -0.100532 -0.00222105 0.0633853 -0.108579 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2051 2101 8.04246e-12 -3.05972 -0.0937068 0.0612327 1.77636e-13 -2.65565e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2101 2102 3.15389 -0.232575 -0.100111 -0.00221628 0.0632525 -0.108657 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2052 2102 8.02647e-12 -3.05972 -0.0937068 0.0612327 1.77192e-13 -2.65565e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2102 2103 3.14726 -0.232336 -0.0996913 -0.00221148 0.0631197 -0.108734 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2053 2103 8.00782e-12 -3.05972 -0.0937068 0.0612327 1.77192e-13 -2.66009e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2103 2104 3.14062 -0.232097 -0.0992719 -0.00220667 0.0629867 -0.10881 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2054 2104 7.99361e-12 -3.05972 -0.0937068 0.0612327 1.76748e-13 -2.66009e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2104 2105 3.13397 -0.231857 -0.0988531 -0.00220184 0.0628537 -0.108887 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2055 2105 7.97584e-12 -3.05972 -0.0937068 0.0612327 1.76303e-13 -2.66454e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2105 2106 3.12732 -0.231616 -0.0984349 -0.00219698 0.0627206 -0.108964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2056 2106 7.95808e-12 -3.05972 -0.0937068 0.0612327 1.75859e-13 -2.66454e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2106 2107 3.12067 -0.231373 -0.0980173 -0.00219211 0.0625873 -0.10904 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2057 2107 7.94032e-12 -3.05972 -0.0937068 0.0612327 1.75859e-13 -2.66898e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2107 2108 3.11401 -0.23113 -0.0976003 -0.00218721 0.062454 -0.109116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2058 2108 7.92255e-12 -3.05972 -0.0937068 0.0612327 1.75415e-13 -2.66898e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2108 2109 3.10735 -0.230885 -0.0971839 -0.0021823 0.0623206 -0.109192 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2059 2109 7.90479e-12 -3.05972 -0.0937068 0.0612327 1.74971e-13 -2.67342e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2109 2110 3.10068 -0.23064 -0.0967681 -0.00217736 0.0621871 -0.109268 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2060 2110 7.89058e-12 -3.05972 -0.0937068 0.0612327 1.74971e-13 -2.67342e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2110 2111 3.09401 -0.230394 -0.0963528 -0.0021724 0.0620535 -0.109344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2061 2111 7.8737e-12 -3.05972 -0.0937068 0.0612327 1.74527e-13 -2.67786e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2111 2112 3.08734 -0.230146 -0.0959382 -0.00216743 0.0619198 -0.109419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2062 2112 7.85572e-12 -3.05972 -0.0937068 0.0612327 1.74083e-13 -2.67786e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2112 2113 3.08066 -0.229898 -0.0955242 -0.00216243 0.061786 -0.109495 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2063 2113 7.83906e-12 -3.05972 -0.0937068 0.0612327 1.73639e-13 -2.6823e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2113 2114 3.07397 -0.229648 -0.0951108 -0.00215741 0.0616522 -0.10957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2064 2114 7.82219e-12 -3.05972 -0.0937068 0.0612327 1.73639e-13 -2.6823e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2114 2115 3.06728 -0.229398 -0.094698 -0.00215238 0.0615182 -0.109645 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2065 2115 7.80442e-12 -3.05972 -0.0937068 0.0612327 1.73195e-13 -2.68674e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2115 2116 3.06059 -0.229146 -0.0942859 -0.00214732 0.0613842 -0.10972 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2066 2116 7.78755e-12 -3.05972 -0.0937068 0.0612327 1.72751e-13 -2.68674e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2116 2117 3.05389 -0.228894 -0.0938743 -0.00214224 0.06125 -0.109795 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2067 2117 7.77334e-12 -3.05972 -0.0937068 0.0612327 1.72307e-13 -2.69118e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2117 2118 3.04718 -0.22864 -0.0934634 -0.00213715 0.0611158 -0.109869 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2068 2118 7.75202e-12 -3.05972 -0.0937068 0.0612327 1.72307e-13 -2.69118e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2118 2119 3.04047 -0.228386 -0.0930531 -0.00213203 0.0609815 -0.109944 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2069 2119 7.73603e-12 -3.05972 -0.0937068 0.0612327 1.71863e-13 -2.69118e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2119 2120 3.03376 -0.22813 -0.0926434 -0.00212689 0.060847 -0.110018 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2070 2120 7.72182e-12 -3.05972 -0.0937068 0.0612327 1.71418e-13 -2.69562e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2120 2121 3.02704 -0.227874 -0.0922343 -0.00212173 0.0607125 -0.110092 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2071 2121 7.70051e-12 -3.05972 -0.0937068 0.0612327 1.71418e-13 -2.70006e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2121 2122 3.02032 -0.227616 -0.0918259 -0.00211656 0.0605779 -0.110166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2072 2122 7.68452e-12 -3.05972 -0.0937068 0.0612327 1.70974e-13 -2.70006e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2122 2123 3.0136 -0.227358 -0.0914181 -0.00211136 0.0604432 -0.11024 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2073 2123 7.66676e-12 -3.05972 -0.0937068 0.0612327 1.7053e-13 -2.70006e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2123 2124 3.00686 -0.227098 -0.0910109 -0.00210614 0.0603085 -0.110313 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2074 2124 7.65166e-12 -3.05972 -0.0937068 0.0612327 1.70086e-13 -2.7045e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2124 2125 3.00013 -0.226838 -0.0906044 -0.00210091 0.0601736 -0.110387 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2075 2125 7.63369e-12 -3.05972 -0.0937068 0.0612327 1.69642e-13 -2.7045e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2125 2126 2.99339 -0.226576 -0.0901985 -0.00209565 0.0600386 -0.11046 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2076 2126 7.61746e-12 -3.05972 -0.0937068 0.0612327 1.69642e-13 -2.70894e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2126 2127 2.98664 -0.226314 -0.0897932 -0.00209037 0.0599036 -0.110533 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2077 2127 7.59925e-12 -3.05972 -0.0937068 0.0612327 1.69198e-13 -2.70894e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2127 2128 2.9799 -0.22605 -0.0893886 -0.00208508 0.0597685 -0.110606 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2078 2128 7.57971e-12 -3.05972 -0.0937068 0.0612327 1.68754e-13 -2.71339e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2128 2129 2.97314 -0.225786 -0.0889847 -0.00207976 0.0596332 -0.110679 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2079 2129 7.5655e-12 -3.05972 -0.0937068 0.0612327 1.6831e-13 -2.71339e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2129 2130 2.96638 -0.22552 -0.0885814 -0.00207442 0.0594979 -0.110751 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2080 2130 7.54596e-12 -3.05972 -0.0937068 0.0612327 1.6831e-13 -2.71783e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2130 2131 2.95962 -0.225254 -0.0881787 -0.00206907 0.0593625 -0.110824 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2081 2131 7.53353e-12 -3.05972 -0.0937068 0.0612327 1.67866e-13 -2.71783e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2131 2132 2.95285 -0.224986 -0.0877767 -0.00206369 0.059227 -0.110896 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2082 2132 7.51577e-12 -3.05972 -0.0937068 0.0612327 1.67422e-13 -2.72227e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2132 2133 2.94608 -0.224718 -0.0873754 -0.0020583 0.0590915 -0.110968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2083 2133 7.49445e-12 -3.05972 -0.0937068 0.0612327 1.66978e-13 -2.72227e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2133 2134 2.93931 -0.224448 -0.0869747 -0.00205289 0.0589558 -0.11104 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2084 2134 7.48024e-12 -3.05972 -0.0937068 0.0612327 1.66978e-13 -2.72671e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2134 2135 2.93253 -0.224178 -0.0865747 -0.00204745 0.0588201 -0.111112 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2085 2135 7.4607e-12 -3.05972 -0.0937068 0.0612327 1.66533e-13 -2.72671e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2135 2136 2.92574 -0.223907 -0.0861753 -0.002042 0.0586842 -0.111183 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2086 2136 7.44471e-12 -3.05972 -0.0937068 0.0612327 1.66089e-13 -2.72671e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2136 2137 2.91895 -0.223634 -0.0857766 -0.00203653 0.0585483 -0.111255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2087 2137 7.42673e-12 -3.05972 -0.0937068 0.0612327 1.65645e-13 -2.73115e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2137 2138 2.91216 -0.223361 -0.0853786 -0.00203103 0.0584123 -0.111326 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2088 2138 7.40941e-12 -3.05972 -0.0937068 0.0612327 1.65645e-13 -2.73115e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2138 2139 2.90536 -0.223087 -0.0849812 -0.00202552 0.0582762 -0.111397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2089 2139 7.39231e-12 -3.05972 -0.0937068 0.0612327 1.65201e-13 -2.73559e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2139 2140 2.89856 -0.222811 -0.0845845 -0.00201999 0.05814 -0.111468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2090 2140 7.37277e-12 -3.05972 -0.0937068 0.0612327 1.64757e-13 -2.73559e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2140 2141 2.89175 -0.222535 -0.0841885 -0.00201444 0.0580037 -0.111539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2091 2141 7.35589e-12 -3.05972 -0.0937068 0.0612327 1.64313e-13 -2.74003e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2141 2142 2.88494 -0.222258 -0.0837932 -0.00200887 0.0578674 -0.111609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2092 2142 7.33991e-12 -3.05972 -0.0937068 0.0612327 1.64313e-13 -2.74003e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2142 2143 2.87813 -0.22198 -0.0833985 -0.00200328 0.0577309 -0.11168 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2093 2143 7.32392e-12 -3.05972 -0.0937068 0.0612327 1.63869e-13 -2.74447e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2143 2144 2.87131 -0.221701 -0.0830046 -0.00199768 0.0575944 -0.11175 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2094 2144 7.3026e-12 -3.05972 -0.0937068 0.0612327 1.63425e-13 -2.74447e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2144 2145 2.86449 -0.221421 -0.0826113 -0.00199205 0.0574578 -0.11182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2095 2145 7.29017e-12 -3.05972 -0.0937068 0.0612327 1.62981e-13 -2.74447e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2145 2146 2.85766 -0.221139 -0.0822187 -0.0019864 0.0573211 -0.11189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2096 2146 7.26708e-12 -3.05972 -0.0937068 0.0612327 1.62981e-13 -2.74891e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2146 2147 2.85083 -0.220857 -0.0818268 -0.00198074 0.0571843 -0.11196 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2097 2147 7.25198e-12 -3.05972 -0.0937068 0.0612327 1.62537e-13 -2.75335e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2147 2148 2.84399 -0.220574 -0.0814356 -0.00197505 0.0570474 -0.112029 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2098 2148 7.2351e-12 -3.05972 -0.0937068 0.0612327 1.62093e-13 -2.75335e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2148 2149 2.83715 -0.220291 -0.0810451 -0.00196935 0.0569105 -0.112099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2099 2149 7.21778e-12 -3.05972 -0.0937068 0.0612327 1.61648e-13 -2.75335e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2149 2150 2.8303 -0.220006 -0.0806552 -0.00196363 0.0567735 -0.112168 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2100 2150 7.20052e-12 -3.05972 -0.0937068 0.0612327 1.61648e-13 -2.75779e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2150 2151 2.82345 -0.21972 -0.0802661 -0.00195788 0.0566363 -0.112237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2101 2151 7.18359e-12 -3.05972 -0.0937068 0.0612327 1.61204e-13 -2.75779e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2151 2152 2.8166 -0.219433 -0.0798777 -0.00195212 0.0564991 -0.112306 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2102 2152 7.16494e-12 -3.05972 -0.0937068 0.0612327 1.6076e-13 -2.76223e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2152 2153 2.80974 -0.219145 -0.07949 -0.00194634 0.0563618 -0.112375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2103 2153 7.14806e-12 -3.05972 -0.0937068 0.0612327 1.60316e-13 -2.76223e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2153 2154 2.80288 -0.218856 -0.0791029 -0.00194055 0.0562245 -0.112443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2104 2154 7.1303e-12 -3.05972 -0.0937068 0.0612327 1.60316e-13 -2.76668e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2154 2155 2.79601 -0.218567 -0.0787166 -0.00193473 0.056087 -0.112512 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2105 2155 7.11253e-12 -3.05972 -0.0937068 0.0612327 1.59872e-13 -2.76668e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2155 2156 2.78914 -0.218276 -0.078331 -0.00192889 0.0559495 -0.11258 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2106 2156 7.09655e-12 -3.05972 -0.0937068 0.0612327 1.59428e-13 -2.77112e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2156 2157 2.78227 -0.217985 -0.0779462 -0.00192304 0.0558118 -0.112648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2107 2157 7.07701e-12 -3.05972 -0.0937068 0.0612327 1.58984e-13 -2.77112e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2157 2158 2.77539 -0.217692 -0.077562 -0.00191716 0.0556741 -0.112716 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2108 2158 7.05924e-12 -3.05972 -0.0937068 0.0612327 1.58984e-13 -2.77112e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2158 2159 2.76851 -0.217399 -0.0771785 -0.00191127 0.0555364 -0.112784 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2109 2159 7.04325e-12 -3.05972 -0.0937068 0.0612327 1.5854e-13 -2.77556e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2159 2160 2.76162 -0.217104 -0.0767958 -0.00190536 0.0553985 -0.112851 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2110 2160 7.02549e-12 -3.05972 -0.0937068 0.0612327 1.58096e-13 -2.77556e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2160 2161 2.75473 -0.216809 -0.0764138 -0.00189943 0.0552605 -0.112919 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2111 2161 7.00684e-12 -3.05972 -0.0937068 0.0612327 1.57652e-13 -2.78e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2161 2162 2.74783 -0.216513 -0.0760325 -0.00189348 0.0551225 -0.112986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2112 2162 6.99041e-12 -3.05972 -0.0937068 0.0612327 1.57208e-13 -2.78e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2162 2163 2.74093 -0.216216 -0.075652 -0.00188752 0.0549844 -0.113053 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2113 2163 6.97287e-12 -3.05972 -0.0937068 0.0612327 1.57208e-13 -2.78444e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2163 2164 2.73403 -0.215918 -0.0752721 -0.00188153 0.0548462 -0.11312 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2114 2164 6.95533e-12 -3.05972 -0.0937068 0.0612327 1.56763e-13 -2.78444e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2164 2165 2.72712 -0.215619 -0.074893 -0.00187553 0.0547079 -0.113187 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2115 2165 6.93756e-12 -3.05972 -0.0937068 0.0612327 1.56319e-13 -2.78444e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2165 2166 2.72021 -0.215319 -0.0745147 -0.00186951 0.0545696 -0.113253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2116 2166 6.92069e-12 -3.05972 -0.0937068 0.0612327 1.55875e-13 -2.78888e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2166 2167 2.7133 -0.215018 -0.0741371 -0.00186346 0.0544311 -0.11332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2117 2167 6.90292e-12 -3.05972 -0.0937068 0.0612327 1.55875e-13 -2.78888e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2167 2168 2.70638 -0.214716 -0.0737602 -0.00185741 0.0542926 -0.113386 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2118 2168 6.88694e-12 -3.05972 -0.0937068 0.0612327 1.55431e-13 -2.79332e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2168 2169 2.69945 -0.214413 -0.073384 -0.00185133 0.054154 -0.113452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2119 2169 6.86562e-12 -3.05972 -0.0937068 0.0612327 1.54987e-13 -2.79332e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2169 2170 2.69252 -0.21411 -0.0730086 -0.00184523 0.0540153 -0.113518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2120 2170 6.84963e-12 -3.05972 -0.0937068 0.0612327 1.54543e-13 -2.79776e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2170 2171 2.68559 -0.213805 -0.0726339 -0.00183912 0.0538765 -0.113583 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2121 2171 6.83009e-12 -3.05972 -0.0937068 0.0612327 1.54099e-13 -2.79776e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2171 2172 2.67866 -0.213499 -0.07226 -0.00183299 0.0537377 -0.113649 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2122 2172 6.8141e-12 -3.05972 -0.0937068 0.0612327 1.54099e-13 -2.79776e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2172 2173 2.67172 -0.213193 -0.0718869 -0.00182684 0.0535988 -0.113714 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2123 2173 6.79634e-12 -3.05972 -0.0937068 0.0612327 1.53655e-13 -2.8022e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2173 2174 2.66477 -0.212886 -0.0715145 -0.00182067 0.0534598 -0.113779 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2124 2174 6.77769e-12 -3.05972 -0.0937068 0.0612327 1.53211e-13 -2.8022e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2174 2175 2.65782 -0.212578 -0.0711428 -0.00181448 0.0533207 -0.113844 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2125 2175 6.7606e-12 -3.05972 -0.0937068 0.0612327 1.52767e-13 -2.80664e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2175 2176 2.65087 -0.212268 -0.0707719 -0.00180828 0.0531815 -0.113909 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2126 2176 6.74261e-12 -3.05972 -0.0937068 0.0612327 1.52767e-13 -2.80664e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2176 2177 2.64392 -0.211958 -0.0704017 -0.00180205 0.0530423 -0.113974 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2127 2177 6.72529e-12 -3.05972 -0.0937068 0.0612327 1.52323e-13 -2.80664e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2177 2178 2.63696 -0.211647 -0.0700324 -0.00179581 0.052903 -0.114039 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2128 2178 6.70575e-12 -3.05972 -0.0937068 0.0612327 1.51879e-13 -2.81108e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2178 2179 2.62999 -0.211336 -0.0696637 -0.00178955 0.0527636 -0.114103 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2129 2179 6.68798e-12 -3.05972 -0.0937068 0.0612327 1.51434e-13 -2.81108e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2179 2180 2.62302 -0.211023 -0.0692959 -0.00178328 0.0526241 -0.114167 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2130 2180 6.67022e-12 -3.05972 -0.0937068 0.0612327 1.51434e-13 -2.81553e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2180 2181 2.61605 -0.210709 -0.0689288 -0.00177698 0.0524846 -0.114231 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2131 2181 6.65246e-12 -3.05972 -0.0937068 0.0612327 1.5099e-13 -2.81553e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2181 2182 2.60908 -0.210395 -0.0685625 -0.00177067 0.0523449 -0.114295 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2132 2182 6.63469e-12 -3.05972 -0.0937068 0.0612327 1.50546e-13 -2.81553e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2182 2183 2.6021 -0.210079 -0.0681969 -0.00176434 0.0522052 -0.114359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2133 2183 6.61693e-12 -3.05972 -0.0937068 0.0612327 1.50102e-13 -2.81997e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2183 2184 2.59511 -0.209763 -0.0678322 -0.00175799 0.0520655 -0.114422 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2134 2184 6.60005e-12 -3.05972 -0.0937068 0.0612327 1.49658e-13 -2.81997e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2184 2185 2.58813 -0.209446 -0.0674682 -0.00175162 0.0519256 -0.114485 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2135 2185 6.58495e-12 -3.05972 -0.0937068 0.0612327 1.49658e-13 -2.82441e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2185 2186 2.58113 -0.209127 -0.0671049 -0.00174524 0.0517857 -0.114548 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2136 2186 6.56541e-12 -3.05972 -0.0937068 0.0612327 1.49214e-13 -2.82441e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2186 2187 2.57414 -0.208808 -0.0667425 -0.00173884 0.0516456 -0.114611 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2137 2187 6.54743e-12 -3.05972 -0.0937068 0.0612327 1.4877e-13 -2.82885e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2187 2188 2.56714 -0.208489 -0.0663808 -0.00173242 0.0515056 -0.114674 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2138 2188 6.529e-12 -3.05972 -0.0937068 0.0612327 1.48326e-13 -2.82885e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2188 2189 2.56014 -0.208168 -0.06602 -0.00172598 0.0513654 -0.114737 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2139 2189 6.51079e-12 -3.05972 -0.0937068 0.0612327 1.48326e-13 -2.82885e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2189 2190 2.55313 -0.207846 -0.0656599 -0.00171953 0.0512251 -0.114799 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2140 2190 6.49525e-12 -3.05972 -0.0937068 0.0612327 1.47882e-13 -2.83329e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2190 2191 2.54612 -0.207524 -0.0653006 -0.00171306 0.0510848 -0.114862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2141 2191 6.47571e-12 -3.05972 -0.0937068 0.0612327 1.47438e-13 -2.83329e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2191 2192 2.53911 -0.2072 -0.0649421 -0.00170657 0.0509444 -0.114924 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2142 2192 6.45706e-12 -3.05972 -0.0937068 0.0612327 1.46994e-13 -2.83773e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2192 2193 2.53209 -0.206876 -0.0645844 -0.00170006 0.050804 -0.114986 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2143 2193 6.43752e-12 -3.05972 -0.0937068 0.0612327 1.46549e-13 -2.83773e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2193 2194 2.52507 -0.206551 -0.0642274 -0.00169354 0.0506634 -0.115047 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2144 2194 6.42153e-12 -3.05972 -0.0937068 0.0612327 1.46549e-13 -2.84217e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2194 2195 2.51804 -0.206225 -0.0638713 -0.00168699 0.0505228 -0.115109 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2145 2195 6.40199e-12 -3.05972 -0.0937068 0.0612327 1.46105e-13 -2.84217e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2195 2196 2.51101 -0.205898 -0.063516 -0.00168044 0.0503821 -0.115171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2146 2196 6.38778e-12 -3.05972 -0.0937068 0.0612327 1.45661e-13 -2.84217e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2196 2197 2.50398 -0.20557 -0.0631615 -0.00167386 0.0502413 -0.115232 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2147 2197 6.36824e-12 -3.05972 -0.0937068 0.0612327 1.45217e-13 -2.84661e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2197 2198 2.49694 -0.205241 -0.0628078 -0.00166727 0.0501005 -0.115293 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2148 2198 6.35136e-12 -3.05972 -0.0937068 0.0612327 1.44773e-13 -2.84661e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2198 2199 2.4899 -0.204912 -0.0624548 -0.00166066 0.0499596 -0.115354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2149 2199 6.33182e-12 -3.05972 -0.0937068 0.0612327 1.44773e-13 -2.85105e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2199 2200 2.48285 -0.204581 -0.0621027 -0.00165403 0.0498186 -0.115415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2150 2200 6.31435e-12 -3.05972 -0.0937068 0.0612327 1.44329e-13 -2.85105e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2200 2201 2.47581 -0.20425 -0.0617515 -0.00164738 0.0496775 -0.115475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2151 2201 6.2963e-12 -3.05972 -0.0937068 0.0612327 1.43885e-13 -2.85105e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2201 2202 2.46875 -0.203918 -0.061401 -0.00164072 0.0495364 -0.115535 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2152 2202 6.27676e-12 -3.05972 -0.0937068 0.0612327 1.43441e-13 -2.85549e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2202 2203 2.4617 -0.203585 -0.0610513 -0.00163404 0.0493952 -0.115596 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2153 2203 6.25988e-12 -3.05972 -0.0937068 0.0612327 1.43441e-13 -2.85549e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2203 2204 2.45464 -0.203251 -0.0607025 -0.00162735 0.0492539 -0.115656 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2154 2204 6.24034e-12 -3.05972 -0.0937068 0.0612327 1.42997e-13 -2.85549e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2204 2205 2.44758 -0.202916 -0.0603544 -0.00162063 0.0491125 -0.115716 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2155 2205 6.22435e-12 -3.05972 -0.0937068 0.0612327 1.42553e-13 -2.85993e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2205 2206 2.44051 -0.202581 -0.0600072 -0.0016139 0.0489711 -0.115775 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2156 2206 6.20659e-12 -3.05972 -0.0937068 0.0612327 1.42109e-13 -2.85993e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2206 2207 2.43344 -0.202245 -0.0596608 -0.00160716 0.0488296 -0.115835 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2157 2207 6.18883e-12 -3.05972 -0.0937068 0.0612327 1.41664e-13 -2.86438e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2207 2208 2.42636 -0.201907 -0.0593153 -0.00160039 0.048688 -0.115894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2158 2208 6.17284e-12 -3.05972 -0.0937068 0.0612327 1.41664e-13 -2.86438e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2208 2209 2.41929 -0.201569 -0.0589706 -0.00159361 0.0485464 -0.115953 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2159 2209 6.15419e-12 -3.05972 -0.0937068 0.0612327 1.4122e-13 -2.86882e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2209 2210 2.41221 -0.20123 -0.0586267 -0.00158682 0.0484046 -0.116012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2160 2210 6.13376e-12 -3.05972 -0.0937068 0.0612327 1.40776e-13 -2.86882e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2210 2211 2.40512 -0.200891 -0.0582836 -0.00158 0.0482628 -0.116071 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2161 2211 6.11644e-12 -3.05972 -0.0937068 0.0612327 1.40332e-13 -2.86882e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2211 2212 2.39803 -0.20055 -0.0579413 -0.00157317 0.048121 -0.11613 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2162 2212 6.09779e-12 -3.05972 -0.0937068 0.0612327 1.39888e-13 -2.87326e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2212 2213 2.39094 -0.200209 -0.0575999 -0.00156632 0.047979 -0.116188 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2163 2213 6.0798e-12 -3.05972 -0.0937068 0.0612327 1.39888e-13 -2.87326e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2213 2214 2.38384 -0.199866 -0.0572594 -0.00155946 0.047837 -0.116247 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2164 2214 6.06182e-12 -3.05972 -0.0937068 0.0612327 1.39444e-13 -2.87326e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2214 2215 2.37674 -0.199523 -0.0569196 -0.00155258 0.047695 -0.116305 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2165 2215 6.04317e-12 -3.05972 -0.0937068 0.0612327 1.39e-13 -2.8777e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2215 2216 2.36964 -0.199179 -0.0565808 -0.00154568 0.0475528 -0.116363 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2166 2216 6.0254e-12 -3.05972 -0.0937068 0.0612327 1.38556e-13 -2.8777e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2216 2217 2.36254 -0.198835 -0.0562427 -0.00153877 0.0474106 -0.116421 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2167 2217 6.00586e-12 -3.05972 -0.0937068 0.0612327 1.38112e-13 -2.8777e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2217 2218 2.35543 -0.198489 -0.0559055 -0.00153184 0.0472683 -0.116478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2168 2218 5.9881e-12 -3.05972 -0.0937068 0.0612327 1.38112e-13 -2.88214e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2218 2219 2.34831 -0.198143 -0.0555692 -0.00152489 0.0471259 -0.116536 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2169 2219 5.97211e-12 -3.05972 -0.0937068 0.0612327 1.37668e-13 -2.88214e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2219 2220 2.34119 -0.197795 -0.0552337 -0.00151793 0.0469835 -0.116593 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2170 2220 5.95257e-12 -3.05972 -0.0937068 0.0612327 1.37224e-13 -2.88658e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2220 2221 2.33407 -0.197447 -0.054899 -0.00151095 0.046841 -0.11665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2171 2221 5.9357e-12 -3.05972 -0.0937068 0.0612327 1.36779e-13 -2.88658e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2221 2222 2.32695 -0.197098 -0.0545652 -0.00150396 0.0466985 -0.116707 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2172 2222 5.91704e-12 -3.05972 -0.0937068 0.0612327 1.36779e-13 -2.88658e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2222 2223 2.31982 -0.196749 -0.0542323 -0.00149694 0.0465558 -0.116764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2173 2223 5.89928e-12 -3.05972 -0.0937068 0.0612327 1.36335e-13 -2.89102e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2223 2224 2.31269 -0.196398 -0.0539002 -0.00148992 0.0464131 -0.11682 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2174 2224 5.88063e-12 -3.05972 -0.0937068 0.0612327 1.35891e-13 -2.89102e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2224 2225 2.30556 -0.196047 -0.053569 -0.00148287 0.0462703 -0.116877 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2175 2225 5.86217e-12 -3.05972 -0.0937068 0.0612327 1.35447e-13 -2.89546e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2225 2226 2.29842 -0.195695 -0.0532386 -0.00147581 0.0461275 -0.116933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2176 2226 5.84333e-12 -3.05972 -0.0937068 0.0612327 1.35003e-13 -2.89546e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2226 2227 2.29128 -0.195342 -0.0529091 -0.00146874 0.0459846 -0.116989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2177 2227 5.82556e-12 -3.05972 -0.0937068 0.0612327 1.35003e-13 -2.89546e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2227 2228 2.28413 -0.194988 -0.0525805 -0.00146165 0.0458416 -0.117045 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2178 2228 5.80869e-12 -3.05972 -0.0937068 0.0612327 1.34559e-13 -2.8999e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2228 2229 2.27698 -0.194633 -0.0522527 -0.00145454 0.0456986 -0.117101 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2179 2229 5.78826e-12 -3.05972 -0.0937068 0.0612327 1.34115e-13 -2.8999e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2229 2230 2.26983 -0.194278 -0.0519258 -0.00144741 0.0455554 -0.117156 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2180 2230 5.77138e-12 -3.05972 -0.0937068 0.0612327 1.33671e-13 -2.8999e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2230 2231 2.26268 -0.193922 -0.0515998 -0.00144027 0.0454123 -0.117212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2181 2231 5.75184e-12 -3.05972 -0.0937068 0.0612327 1.33227e-13 -2.90434e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2231 2232 2.25552 -0.193565 -0.0512746 -0.00143312 0.045269 -0.117267 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2182 2232 5.73586e-12 -3.05972 -0.0937068 0.0612327 1.33227e-13 -2.90434e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2232 2233 2.24836 -0.193207 -0.0509504 -0.00142595 0.0451257 -0.117322 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2183 2233 5.71632e-12 -3.05972 -0.0937068 0.0612327 1.32783e-13 -2.90434e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2233 2234 2.24119 -0.192849 -0.050627 -0.00141876 0.0449823 -0.117377 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2184 2234 5.69678e-12 -3.05972 -0.0937068 0.0612327 1.32339e-13 -2.90878e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2234 2235 2.23402 -0.192489 -0.0503044 -0.00141156 0.0448389 -0.117431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2185 2235 5.6799e-12 -3.05972 -0.0937068 0.0612327 1.31894e-13 -2.90878e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2235 2236 2.22685 -0.192129 -0.0499828 -0.00140434 0.0446954 -0.117486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2186 2236 5.66036e-12 -3.05972 -0.0937068 0.0612327 1.3145e-13 -2.91323e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2236 2237 2.21968 -0.191768 -0.0496621 -0.0013971 0.0445518 -0.11754 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2187 2237 5.64304e-12 -3.05972 -0.0937068 0.0612327 1.3145e-13 -2.91323e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2237 2238 2.2125 -0.191407 -0.0493422 -0.00138986 0.0444081 -0.117594 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2188 2238 5.62506e-12 -3.05972 -0.0937068 0.0612327 1.31006e-13 -2.91323e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2238 2239 2.20532 -0.191044 -0.0490232 -0.00138259 0.0442644 -0.117648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2189 2239 5.60707e-12 -3.05972 -0.0937068 0.0612327 1.30562e-13 -2.91767e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2239 2240 2.19813 -0.190681 -0.0487051 -0.00137531 0.0441206 -0.117702 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2190 2240 5.58664e-12 -3.05972 -0.0937068 0.0612327 1.30118e-13 -2.91767e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2240 2241 2.19094 -0.190317 -0.0483879 -0.00136801 0.0439768 -0.117755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2191 2241 5.57154e-12 -3.05972 -0.0937068 0.0612327 1.29674e-13 -2.91767e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2241 2242 2.18375 -0.189952 -0.0480716 -0.0013607 0.0438329 -0.117809 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2192 2242 5.54934e-12 -3.05972 -0.0937068 0.0612327 1.2923e-13 -2.92211e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2242 2243 2.17656 -0.189587 -0.0477562 -0.00135337 0.0436889 -0.117862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2193 2243 5.53868e-12 -3.05972 -0.0937068 0.0612327 1.2923e-13 -2.92211e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2243 2244 2.16936 -0.18922 -0.0474416 -0.00134603 0.0435449 -0.117915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2194 2244 5.51381e-12 -3.05972 -0.0937068 0.0612327 1.28786e-13 -2.92211e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2244 2245 2.16216 -0.188853 -0.047128 -0.00133867 0.0434008 -0.117968 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2195 2245 5.49782e-12 -3.05972 -0.0937068 0.0612327 1.28342e-13 -2.92655e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2245 2246 2.15495 -0.188485 -0.0468153 -0.0013313 0.0432566 -0.118021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2196 2246 5.4774e-12 -3.05972 -0.0937068 0.0612327 1.27898e-13 -2.92655e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2246 2247 2.14774 -0.188117 -0.0465035 -0.00132391 0.0431124 -0.118073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2197 2247 5.45874e-12 -3.05972 -0.0937068 0.0612327 1.27898e-13 -2.93099e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2247 2248 2.14053 -0.187747 -0.0461926 -0.00131651 0.0429681 -0.118126 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2198 2248 5.44187e-12 -3.05972 -0.0937068 0.0612327 1.27454e-13 -2.93099e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2248 2249 2.13332 -0.187377 -0.0458826 -0.00130909 0.0428237 -0.118178 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2199 2249 5.42322e-12 -3.05972 -0.0937068 0.0612327 1.2701e-13 -2.93099e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2249 2250 2.1261 -0.187006 -0.0455734 -0.00130166 0.0426793 -0.11823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2200 2250 5.40451e-12 -3.05972 -0.0937068 0.0612327 1.26565e-13 -2.93543e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2250 2251 2.11888 -0.186634 -0.0452653 -0.00129421 0.0425348 -0.118282 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2201 2251 5.3868e-12 -3.05972 -0.0937068 0.0612327 1.26121e-13 -2.93543e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2251 2252 2.11165 -0.186262 -0.044958 -0.00128675 0.0423903 -0.118334 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2202 2252 5.36993e-12 -3.05972 -0.0937068 0.0612327 1.25677e-13 -2.93543e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2252 2253 2.10443 -0.185889 -0.0446516 -0.00127927 0.0422456 -0.118385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2203 2253 5.35039e-12 -3.05972 -0.0937068 0.0612327 1.25677e-13 -2.93987e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2253 2254 2.0972 -0.185515 -0.0443461 -0.00127177 0.042101 -0.118436 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2204 2254 5.33174e-12 -3.05972 -0.0937068 0.0612327 1.25233e-13 -2.93987e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2254 2255 2.08996 -0.18514 -0.0440416 -0.00126427 0.0419562 -0.118488 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2205 2255 5.3122e-12 -3.05972 -0.0937068 0.0612327 1.24789e-13 -2.93987e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2255 2256 2.08273 -0.184765 -0.043738 -0.00125674 0.0418114 -0.118538 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2206 2256 5.29354e-12 -3.05972 -0.0937068 0.0612327 1.24345e-13 -2.94431e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2256 2257 2.07549 -0.184389 -0.0434353 -0.00124921 0.0416666 -0.118589 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2207 2257 5.27756e-12 -3.05972 -0.0937068 0.0612327 1.23901e-13 -2.94431e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2257 2258 2.06824 -0.184012 -0.0431335 -0.00124165 0.0415217 -0.11864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2208 2258 5.25713e-12 -3.05972 -0.0937068 0.0612327 1.23901e-13 -2.94431e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2258 2259 2.061 -0.183634 -0.0428327 -0.00123409 0.0413767 -0.11869 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2209 2259 5.23936e-12 -3.05972 -0.0937068 0.0612327 1.23457e-13 -2.94875e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2259 2260 2.05375 -0.183256 -0.0425327 -0.00122651 0.0412316 -0.118741 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2210 2260 5.21894e-12 -3.05972 -0.0937068 0.0612327 1.23013e-13 -2.94875e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2260 2261 2.0465 -0.182877 -0.0422337 -0.00121891 0.0410865 -0.118791 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2211 2261 5.20206e-12 -3.05972 -0.0937068 0.0612327 1.22569e-13 -2.94875e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2261 2262 2.03924 -0.182497 -0.0419357 -0.0012113 0.0409414 -0.118841 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2212 2262 5.18297e-12 -3.05972 -0.0937068 0.0612327 1.22125e-13 -2.95319e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2262 2263 2.03198 -0.182116 -0.0416385 -0.00120367 0.0407961 -0.11889 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2213 2263 5.16476e-12 -3.05972 -0.0937068 0.0612327 1.2168e-13 -2.95319e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2263 2264 2.02472 -0.181735 -0.0413423 -0.00119603 0.0406508 -0.11894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2214 2264 5.14566e-12 -3.05972 -0.0937068 0.0612327 1.2168e-13 -2.95319e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2264 2265 2.01746 -0.181353 -0.041047 -0.00118838 0.0405055 -0.118989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2215 2265 5.12923e-12 -3.05972 -0.0937068 0.0612327 1.21236e-13 -2.95763e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2265 2266 2.01019 -0.18097 -0.0407527 -0.00118071 0.0403601 -0.119038 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2216 2266 5.10791e-12 -3.05972 -0.0937068 0.0612327 1.20792e-13 -2.95763e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2266 2267 2.00292 -0.180587 -0.0404593 -0.00117303 0.0402146 -0.119087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2217 2267 5.08837e-12 -3.05972 -0.0937068 0.0612327 1.20348e-13 -2.96208e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2267 2268 1.99565 -0.180202 -0.0401669 -0.00116533 0.0400691 -0.119136 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2218 2268 5.0715e-12 -3.05972 -0.0937068 0.0612327 1.19904e-13 -2.96208e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2268 2269 1.98837 -0.179817 -0.0398754 -0.00115762 0.0399235 -0.119185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2219 2269 5.05374e-12 -3.05972 -0.0937068 0.0612327 1.19904e-13 -2.96208e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2269 2270 1.98109 -0.179432 -0.0395848 -0.0011499 0.0397779 -0.119233 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2220 2270 5.03331e-12 -3.05972 -0.0937068 0.0612327 1.1946e-13 -2.96208e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2270 2271 1.97381 -0.179046 -0.0392952 -0.00114216 0.0396322 -0.119282 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2221 2271 5.01732e-12 -3.05972 -0.0937068 0.0612327 1.19016e-13 -2.96652e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2271 2272 1.96652 -0.178658 -0.0390065 -0.0011344 0.0394864 -0.11933 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2222 2272 4.99778e-12 -3.05972 -0.0937068 0.0612327 1.18572e-13 -2.96652e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2272 2273 1.95923 -0.178271 -0.0387188 -0.00112664 0.0393406 -0.119378 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2223 2273 4.97868e-12 -3.05972 -0.0937068 0.0612327 1.18128e-13 -2.96652e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2273 2274 1.95194 -0.177882 -0.038432 -0.00111885 0.0391947 -0.119426 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2224 2274 4.95981e-12 -3.05972 -0.0937068 0.0612327 1.18128e-13 -2.97096e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2274 2275 1.94465 -0.177493 -0.0381461 -0.00111106 0.0390488 -0.119473 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2225 2275 4.94177e-12 -3.05972 -0.0937068 0.0612327 1.17684e-13 -2.97096e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2275 2276 1.93735 -0.177103 -0.0378613 -0.00110325 0.0389028 -0.119521 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2226 2276 4.92317e-12 -3.05972 -0.0937068 0.0612327 1.1724e-13 -2.97096e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2276 2277 1.93005 -0.176713 -0.0375774 -0.00109543 0.0387567 -0.119568 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2227 2277 4.90452e-12 -3.05972 -0.0937068 0.0612327 1.16795e-13 -2.9754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2277 2278 1.92275 -0.176322 -0.0372944 -0.00108759 0.0386106 -0.119615 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2228 2278 4.88676e-12 -3.05972 -0.0937068 0.0612327 1.16351e-13 -2.9754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2278 2279 1.91544 -0.17593 -0.0370124 -0.00107974 0.0384644 -0.119662 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2229 2279 4.86899e-12 -3.05972 -0.0937068 0.0612327 1.15907e-13 -2.9754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2279 2280 1.90813 -0.175537 -0.0367314 -0.00107188 0.0383182 -0.119708 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2230 2280 4.84679e-12 -3.05972 -0.0937068 0.0612327 1.15907e-13 -2.97984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2280 2281 1.90082 -0.175144 -0.0364513 -0.001064 0.0381719 -0.119755 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2231 2281 4.82991e-12 -3.05972 -0.0937068 0.0612327 1.15463e-13 -2.97984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2281 2282 1.89351 -0.17475 -0.0361722 -0.00105611 0.0380256 -0.119801 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2232 2282 4.81037e-12 -3.05972 -0.0937068 0.0612327 1.15019e-13 -2.97984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2282 2283 1.88619 -0.174355 -0.035894 -0.0010482 0.0378792 -0.119847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2233 2283 4.79083e-12 -3.05972 -0.0937068 0.0612327 1.14575e-13 -2.97984e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2283 2284 1.87887 -0.17396 -0.0356169 -0.00104028 0.0377328 -0.119893 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2234 2284 4.77485e-12 -3.05972 -0.0937068 0.0612327 1.14131e-13 -2.98428e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2284 2285 1.87155 -0.173564 -0.0353406 -0.00103235 0.0375863 -0.119939 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2235 2285 4.75442e-12 -3.05972 -0.0937068 0.0612327 1.13687e-13 -2.98428e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2285 2286 1.86422 -0.173167 -0.0350654 -0.00102441 0.0374397 -0.119985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2236 2286 4.73666e-12 -3.05972 -0.0937068 0.0612327 1.13687e-13 -2.98428e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2286 2287 1.85689 -0.17277 -0.0347911 -0.00101645 0.0372931 -0.12003 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2237 2287 4.71789e-12 -3.05972 -0.0937068 0.0612327 1.13243e-13 -2.98872e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2287 2288 1.84956 -0.172371 -0.0345178 -0.00100847 0.0371464 -0.120076 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2238 2288 4.69946e-12 -3.05972 -0.0937068 0.0612327 1.12799e-13 -2.98872e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2288 2289 1.84223 -0.171973 -0.0342455 -0.00100049 0.0369997 -0.120121 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2239 2289 4.68114e-12 -3.05972 -0.0937068 0.0612327 1.12355e-13 -2.98872e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2289 2290 1.83489 -0.171573 -0.0339742 -0.00099249 0.0368529 -0.120166 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2240 2290 4.66205e-12 -3.05972 -0.0937068 0.0612327 1.1191e-13 -2.99316e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2290 2291 1.82755 -0.171173 -0.0337038 -0.000984479 0.0367061 -0.12021 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2241 2291 4.6434e-12 -3.05972 -0.0937068 0.0612327 1.1191e-13 -2.99316e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2291 2292 1.82021 -0.170773 -0.0334345 -0.000976454 0.0365592 -0.120255 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2242 2292 4.62563e-12 -3.05972 -0.0937068 0.0612327 1.11466e-13 -2.99316e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2292 2293 1.81286 -0.170371 -0.0331661 -0.000968416 0.0364122 -0.120299 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2243 2293 4.60521e-12 -3.05972 -0.0937068 0.0612327 1.11022e-13 -2.9976e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2293 2294 1.80552 -0.169969 -0.0328986 -0.000960365 0.0362652 -0.120343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2244 2294 4.58655e-12 -3.05972 -0.0937068 0.0612327 1.10578e-13 -2.9976e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2294 2295 1.79817 -0.169567 -0.0326322 -0.000952301 0.0361182 -0.120388 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2245 2295 4.56613e-12 -3.05972 -0.0937068 0.0612327 1.10134e-13 -2.9976e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2295 2296 1.79081 -0.169163 -0.0323668 -0.000944224 0.0359711 -0.120431 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2246 2296 4.55014e-12 -3.05972 -0.0937068 0.0612327 1.0969e-13 -3.00204e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2296 2297 1.78346 -0.168759 -0.0321023 -0.000936134 0.0358239 -0.120475 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2247 2297 4.53237e-12 -3.05972 -0.0937068 0.0612327 1.0969e-13 -3.00204e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2297 2298 1.7761 -0.168355 -0.0318389 -0.000928032 0.0356767 -0.120518 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2248 2298 4.5115e-12 -3.05972 -0.0937068 0.0612327 1.09246e-13 -3.00204e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2298 2299 1.76874 -0.167949 -0.0315764 -0.000919917 0.0355295 -0.120562 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2249 2299 4.49263e-12 -3.05972 -0.0937068 0.0612327 1.08802e-13 -3.00204e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2299 2300 1.76137 -0.167543 -0.0313149 -0.000911788 0.0353821 -0.120605 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2250 2300 4.47441e-12 -3.05972 -0.0937068 0.0612327 1.08358e-13 -3.00648e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2300 2301 1.75401 -0.167137 -0.0310544 -0.000903648 0.0352348 -0.120648 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2251 2301 4.4551e-12 -3.05972 -0.0937068 0.0612327 1.07914e-13 -3.00648e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2301 2302 1.74664 -0.16673 -0.0307949 -0.000895494 0.0350874 -0.120691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2252 2302 4.43645e-12 -3.05972 -0.0937068 0.0612327 1.0747e-13 -3.00648e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2302 2303 1.73927 -0.166322 -0.0305365 -0.000887328 0.0349399 -0.120733 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2253 2303 4.4178e-12 -3.05972 -0.0937068 0.0612327 1.0747e-13 -3.01092e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2303 2304 1.73189 -0.165913 -0.030279 -0.00087915 0.0347924 -0.120776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2254 2304 4.39915e-12 -3.05972 -0.0937068 0.0612327 1.07025e-13 -3.01092e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2304 2305 1.72452 -0.165504 -0.0300225 -0.000870959 0.0346448 -0.120818 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2255 2305 4.3805e-12 -3.05972 -0.0937068 0.0612327 1.06581e-13 -3.01092e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2305 2306 1.71714 -0.165095 -0.029767 -0.000862755 0.0344972 -0.12086 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2256 2306 4.36184e-12 -3.05972 -0.0937068 0.0612327 1.06137e-13 -3.01092e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2306 2307 1.70975 -0.164684 -0.0295125 -0.000854539 0.0343495 -0.120902 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2257 2307 4.34319e-12 -3.05972 -0.0937068 0.0612327 1.05693e-13 -3.01537e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2307 2308 1.70237 -0.164273 -0.0292591 -0.000846311 0.0342018 -0.120943 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2258 2308 4.32276e-12 -3.05972 -0.0937068 0.0612327 1.05249e-13 -3.01537e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2308 2309 1.69498 -0.163862 -0.0290066 -0.00083807 0.034054 -0.120985 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2259 2309 4.305e-12 -3.05972 -0.0937068 0.0612327 1.05249e-13 -3.01981e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2309 2310 1.68759 -0.16345 -0.0287551 -0.000829818 0.0339062 -0.121026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2260 2310 4.28679e-12 -3.05972 -0.0937068 0.0612327 1.04805e-13 -3.01981e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2310 2311 1.6802 -0.163037 -0.0285047 -0.000821553 0.0337583 -0.121067 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2261 2311 4.26725e-12 -3.05972 -0.0937068 0.0612327 1.04361e-13 -3.01981e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2311 2312 1.67281 -0.162623 -0.0282552 -0.000813276 0.0336103 -0.121108 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2262 2312 4.24871e-12 -3.05972 -0.0937068 0.0612327 1.03917e-13 -3.01981e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2312 2313 1.66541 -0.162209 -0.0280068 -0.000804986 0.0334624 -0.121149 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2263 2313 4.22962e-12 -3.05972 -0.0937068 0.0612327 1.03473e-13 -3.02425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2313 2314 1.65801 -0.161795 -0.0277594 -0.000796685 0.0333143 -0.12119 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2264 2314 4.21085e-12 -3.05972 -0.0937068 0.0612327 1.03029e-13 -3.02425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2314 2315 1.65061 -0.161379 -0.027513 -0.000788372 0.0331663 -0.12123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2265 2315 4.19176e-12 -3.05972 -0.0937068 0.0612327 1.03029e-13 -3.02425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2315 2316 1.6432 -0.160964 -0.0272677 -0.000780046 0.0330181 -0.12127 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2266 2316 4.17266e-12 -3.05972 -0.0937068 0.0612327 1.02585e-13 -3.02425e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2316 2317 1.63579 -0.160547 -0.0270233 -0.000771709 0.03287 -0.121311 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2267 2317 4.15579e-12 -3.05972 -0.0937068 0.0612327 1.02141e-13 -3.02869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2317 2318 1.62839 -0.16013 -0.02678 -0.00076336 0.0327217 -0.12135 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2268 2318 4.13625e-12 -3.05972 -0.0937068 0.0612327 1.01696e-13 -3.02869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2318 2319 1.62097 -0.159712 -0.0265377 -0.000754999 0.0325735 -0.12139 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2269 2319 4.11671e-12 -3.05972 -0.0937068 0.0612327 1.01252e-13 -3.02869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2319 2320 1.61356 -0.159294 -0.0262964 -0.000746627 0.0324251 -0.12143 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2270 2320 4.09806e-12 -3.05972 -0.0937068 0.0612327 1.00808e-13 -3.02869e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2320 2321 1.60614 -0.158875 -0.0260561 -0.000738243 0.0322768 -0.121469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2271 2321 4.07852e-12 -3.05972 -0.0937068 0.0612327 1.00808e-13 -3.03313e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2321 2322 1.59872 -0.158456 -0.0258169 -0.000729847 0.0321284 -0.121508 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2272 2322 4.05986e-12 -3.05972 -0.0937068 0.0612327 1.00364e-13 -3.03313e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2322 2323 1.5913 -0.158036 -0.0255787 -0.000721439 0.0319799 -0.121547 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2273 2323 4.04077e-12 -3.05972 -0.0937068 0.0612327 9.99201e-14 -3.03313e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2323 2324 1.58388 -0.157615 -0.0253415 -0.00071302 0.0318314 -0.121586 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2274 2324 4.02167e-12 -3.05972 -0.0937068 0.0612327 9.9476e-14 -3.03757e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2324 2325 1.57645 -0.157194 -0.0251053 -0.000704589 0.0316828 -0.121625 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2275 2325 4.00285e-12 -3.05972 -0.0937068 0.0612327 9.90319e-14 -3.03757e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2325 2326 1.56902 -0.156773 -0.0248702 -0.000696147 0.0315342 -0.121663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2276 2326 3.98392e-12 -3.05972 -0.0937068 0.0612327 9.85878e-14 -3.03757e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2326 2327 1.56159 -0.15635 -0.0246362 -0.000687694 0.0313856 -0.121701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2277 2327 3.96527e-12 -3.05972 -0.0937068 0.0612327 9.85878e-14 -3.03757e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2327 2328 1.55416 -0.155927 -0.0244031 -0.000679229 0.0312369 -0.121739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2278 2328 3.94529e-12 -3.05972 -0.0937068 0.0612327 9.81437e-14 -3.04201e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2328 2329 1.54672 -0.155504 -0.0241711 -0.000670753 0.0310881 -0.121777 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2279 2329 3.92575e-12 -3.05972 -0.0937068 0.0612327 9.76996e-14 -3.04201e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2329 2330 1.53928 -0.15508 -0.0239401 -0.000662266 0.0309393 -0.121815 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2280 2330 3.90887e-12 -3.05972 -0.0937068 0.0612327 9.72555e-14 -3.04201e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2330 2331 1.53184 -0.154655 -0.0237102 -0.000653767 0.0307905 -0.121852 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2281 2331 3.88756e-12 -3.05972 -0.0937068 0.0612327 9.68114e-14 -3.04201e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2331 2332 1.5244 -0.15423 -0.0234813 -0.000645257 0.0306416 -0.12189 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2282 2332 3.86891e-12 -3.05972 -0.0937068 0.0612327 9.63674e-14 -3.04645e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2332 2333 1.51695 -0.153805 -0.0232535 -0.000636737 0.0304927 -0.121927 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2283 2333 3.85025e-12 -3.05972 -0.0937068 0.0612327 9.63674e-14 -3.04645e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2333 2334 1.50951 -0.153378 -0.0230266 -0.000628205 0.0303437 -0.121964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2284 2334 3.83249e-12 -3.05972 -0.0937068 0.0612327 9.59233e-14 -3.04645e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2334 2335 1.50206 -0.152952 -0.0228009 -0.000619662 0.0301947 -0.122001 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2285 2335 3.81295e-12 -3.05972 -0.0937068 0.0612327 9.54792e-14 -3.05089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2335 2336 1.4946 -0.152524 -0.0225762 -0.000611108 0.0300457 -0.122037 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2286 2336 3.79385e-12 -3.05972 -0.0937068 0.0612327 9.50351e-14 -3.05089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2336 2337 1.48715 -0.152096 -0.0223525 -0.000602543 0.0298965 -0.122074 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2287 2337 3.77498e-12 -3.05972 -0.0937068 0.0612327 9.4591e-14 -3.05089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2337 2338 1.47969 -0.151668 -0.0221299 -0.000593968 0.0297474 -0.12211 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2288 2338 3.75633e-12 -3.05972 -0.0937068 0.0612327 9.41469e-14 -3.05089e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2338 2339 1.47224 -0.151239 -0.0219083 -0.000585381 0.0295982 -0.122146 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2289 2339 3.73701e-12 -3.05972 -0.0937068 0.0612327 9.41469e-14 -3.05533e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2339 2340 1.46477 -0.150809 -0.0216878 -0.000576784 0.029449 -0.122182 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2290 2340 3.71836e-12 -3.05972 -0.0937068 0.0612327 9.37028e-14 -3.05533e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2340 2341 1.45731 -0.150379 -0.0214683 -0.000568176 0.0292997 -0.122218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2291 2341 3.69837e-12 -3.05972 -0.0937068 0.0612327 9.32587e-14 -3.05533e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2341 2342 1.44985 -0.149949 -0.0212499 -0.000559558 0.0291504 -0.122253 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2292 2342 3.67972e-12 -3.05972 -0.0937068 0.0612327 9.28146e-14 -3.05977e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2342 2343 1.44238 -0.149517 -0.0210326 -0.000550929 0.029001 -0.122289 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2293 2343 3.66018e-12 -3.05972 -0.0937068 0.0612327 9.23706e-14 -3.05977e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2343 2344 1.43491 -0.149086 -0.0208163 -0.000542289 0.0288516 -0.122324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2294 2344 3.64242e-12 -3.05972 -0.0937068 0.0612327 9.19265e-14 -3.05977e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2344 2345 1.42744 -0.148654 -0.020601 -0.000533639 0.0287021 -0.122359 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2295 2345 3.62199e-12 -3.05972 -0.0937068 0.0612327 9.14824e-14 -3.05977e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2345 2346 1.41996 -0.148221 -0.0203868 -0.000524979 0.0285526 -0.122394 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2296 2346 3.60334e-12 -3.05972 -0.0937068 0.0612327 9.14824e-14 -3.06422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2346 2347 1.41249 -0.147788 -0.0201737 -0.000516308 0.0284031 -0.122428 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2297 2347 3.58469e-12 -3.05972 -0.0937068 0.0612327 9.10383e-14 -3.06422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2347 2348 1.40501 -0.147354 -0.0199617 -0.000507627 0.0282535 -0.122463 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2298 2348 3.56604e-12 -3.05972 -0.0937068 0.0612327 9.05942e-14 -3.06422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2348 2349 1.39753 -0.146919 -0.0197507 -0.000498935 0.0281039 -0.122497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2299 2349 3.54672e-12 -3.05972 -0.0937068 0.0612327 9.01501e-14 -3.06422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2349 2350 1.39005 -0.146485 -0.0195407 -0.000490234 0.0279542 -0.122531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2300 2350 3.52754e-12 -3.05972 -0.0937068 0.0612327 8.9706e-14 -3.06422e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2350 2351 1.38256 -0.146049 -0.0193319 -0.000481522 0.0278045 -0.122565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2301 2351 3.5083e-12 -3.05972 -0.0937068 0.0612327 8.92619e-14 -3.06866e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2351 2352 1.37508 -0.145613 -0.0191241 -0.0004728 0.0276548 -0.122599 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2302 2352 3.48832e-12 -3.05972 -0.0937068 0.0612327 8.88178e-14 -3.06866e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2352 2353 1.36759 -0.145177 -0.0189173 -0.000464068 0.027505 -0.122632 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2303 2353 3.47011e-12 -3.05972 -0.0937068 0.0612327 8.88178e-14 -3.06866e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2353 2354 1.3601 -0.14474 -0.0187117 -0.000455325 0.0273552 -0.122665 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2304 2354 3.45235e-12 -3.05972 -0.0937068 0.0612327 8.83738e-14 -3.06866e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2354 2355 1.35261 -0.144303 -0.0185071 -0.000446573 0.0272053 -0.122699 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2305 2355 3.43103e-12 -3.05972 -0.0937068 0.0612327 8.79297e-14 -3.0731e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2355 2356 1.34511 -0.143865 -0.0183036 -0.000437811 0.0270554 -0.122732 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2306 2356 3.41416e-12 -3.05972 -0.0937068 0.0612327 8.74856e-14 -3.0731e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2356 2357 1.33761 -0.143427 -0.0181011 -0.000429039 0.0269055 -0.122764 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2307 2357 3.39373e-12 -3.05972 -0.0937068 0.0612327 8.70415e-14 -3.0731e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2357 2358 1.33012 -0.142988 -0.0178997 -0.000420258 0.0267555 -0.122797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2308 2358 3.37508e-12 -3.05972 -0.0937068 0.0612327 8.65974e-14 -3.0731e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2358 2359 1.32261 -0.142549 -0.0176994 -0.000411466 0.0266055 -0.122829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2309 2359 3.3582e-12 -3.05972 -0.0937068 0.0612327 8.65974e-14 -3.07754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2359 2360 1.31511 -0.142109 -0.0175002 -0.000402665 0.0264554 -0.122862 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2310 2360 3.33555e-12 -3.05972 -0.0937068 0.0612327 8.61533e-14 -3.07754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2360 2361 1.30761 -0.141668 -0.0173021 -0.000393854 0.0263053 -0.122894 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2311 2361 3.31735e-12 -3.05972 -0.0937068 0.0612327 8.57092e-14 -3.07754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2361 2362 1.3001 -0.141228 -0.017105 -0.000385034 0.0261551 -0.122926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2312 2362 3.29836e-12 -3.05972 -0.0937068 0.0612327 8.52651e-14 -3.07754e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2362 2363 1.29259 -0.140786 -0.016909 -0.000376204 0.026005 -0.122957 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2313 2363 3.27915e-12 -3.05972 -0.0937068 0.0612327 8.4821e-14 -3.08198e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2363 2364 1.28508 -0.140345 -0.0167141 -0.000367364 0.0258547 -0.122989 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2314 2364 3.26073e-12 -3.05972 -0.0937068 0.0612327 8.43769e-14 -3.08198e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2364 2365 1.27757 -0.139902 -0.0165203 -0.000358515 0.0257045 -0.12302 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2315 2365 3.24052e-12 -3.05972 -0.0937068 0.0612327 8.43769e-14 -3.08198e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2365 2366 1.27006 -0.13946 -0.0163276 -0.000349657 0.0255542 -0.123051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2316 2366 3.22142e-12 -3.05972 -0.0937068 0.0612327 8.39329e-14 -3.08198e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2366 2367 1.26254 -0.139017 -0.0161359 -0.000340789 0.0254038 -0.123082 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2317 2367 3.20277e-12 -3.05972 -0.0937068 0.0612327 8.34888e-14 -3.08642e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2367 2368 1.25502 -0.138573 -0.0159454 -0.000331913 0.0252535 -0.123113 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2318 2368 3.18234e-12 -3.05972 -0.0937068 0.0612327 8.30447e-14 -3.08642e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2368 2369 1.2475 -0.138129 -0.0157559 -0.000323026 0.0251031 -0.123144 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2319 2369 3.16369e-12 -3.05972 -0.0937068 0.0612327 8.26006e-14 -3.08642e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2369 2370 1.23998 -0.137684 -0.0155675 -0.000314131 0.0249526 -0.123174 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2320 2370 3.14415e-12 -3.05972 -0.0937068 0.0612327 8.21565e-14 -3.08642e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2370 2371 1.23246 -0.137239 -0.0153802 -0.000305226 0.0248021 -0.123204 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2321 2371 3.1255e-12 -3.05972 -0.0937068 0.0612327 8.17124e-14 -3.09086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2371 2372 1.22493 -0.136794 -0.015194 -0.000296313 0.0246516 -0.123235 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2322 2372 3.10596e-12 -3.05972 -0.0937068 0.0612327 8.17124e-14 -3.09086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2372 2373 1.2174 -0.136348 -0.0150089 -0.00028739 0.0245011 -0.123264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2323 2373 3.08775e-12 -3.05972 -0.0937068 0.0612327 8.12683e-14 -3.09086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2373 2374 1.20987 -0.135901 -0.0148248 -0.000278459 0.0243505 -0.123294 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2324 2374 3.06821e-12 -3.05972 -0.0937068 0.0612327 8.08242e-14 -3.09086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2374 2375 1.20234 -0.135455 -0.0146419 -0.000269518 0.0241998 -0.123324 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2325 2375 3.04892e-12 -3.05972 -0.0937068 0.0612327 8.03801e-14 -3.09086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2375 2376 1.19481 -0.135007 -0.0144601 -0.000260569 0.0240492 -0.123353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2326 2376 3.0298e-12 -3.05972 -0.0937068 0.0612327 7.99361e-14 -3.09086e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2376 2377 1.18728 -0.134559 -0.0142793 -0.000251611 0.0238985 -0.123382 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2327 2377 3.01048e-12 -3.05972 -0.0937068 0.0612327 7.9492e-14 -3.0953e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2377 2378 1.17974 -0.134111 -0.0140997 -0.000242644 0.0237477 -0.123411 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2328 2378 2.99094e-12 -3.05972 -0.0937068 0.0612327 7.90479e-14 -3.0953e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2378 2379 1.1722 -0.133663 -0.0139211 -0.000233668 0.023597 -0.12344 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2329 2379 2.97229e-12 -3.05972 -0.0937068 0.0612327 7.90479e-14 -3.0953e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2379 2380 1.16466 -0.133214 -0.0137437 -0.000224684 0.0234462 -0.123468 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2330 2380 2.95319e-12 -3.05972 -0.0937068 0.0612327 7.86038e-14 -3.09974e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2380 2381 1.15712 -0.132764 -0.0135674 -0.000215691 0.0232953 -0.123497 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2331 2381 2.93454e-12 -3.05972 -0.0937068 0.0612327 7.81597e-14 -3.09974e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2381 2382 1.14958 -0.132314 -0.0133921 -0.000206689 0.0231445 -0.123525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2332 2382 2.91589e-12 -3.05972 -0.0937068 0.0612327 7.77156e-14 -3.09974e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2382 2383 1.14203 -0.131864 -0.013218 -0.000197679 0.0229935 -0.123553 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2333 2383 2.89546e-12 -3.05972 -0.0937068 0.0612327 7.72715e-14 -3.09974e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2383 2384 1.13448 -0.131413 -0.0130449 -0.000188661 0.0228426 -0.123581 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2334 2384 2.87548e-12 -3.05972 -0.0937068 0.0612327 7.68274e-14 -3.09974e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2384 2385 1.12694 -0.130962 -0.012873 -0.000179634 0.0226916 -0.123609 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2335 2385 2.85638e-12 -3.05972 -0.0937068 0.0612327 7.63833e-14 -3.10418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2385 2386 1.11939 -0.13051 -0.0127022 -0.000170599 0.0225406 -0.123636 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2336 2386 2.83795e-12 -3.05972 -0.0937068 0.0612327 7.63833e-14 -3.10418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2386 2387 1.11183 -0.130058 -0.0125325 -0.000161556 0.0223896 -0.123663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2337 2387 2.8183e-12 -3.05972 -0.0937068 0.0612327 7.59393e-14 -3.10418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2387 2388 1.10428 -0.129606 -0.0123638 -0.000152504 0.0222385 -0.123691 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2338 2388 2.79887e-12 -3.05972 -0.0937068 0.0612327 7.54952e-14 -3.10418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2388 2389 1.09672 -0.129153 -0.0121963 -0.000143444 0.0220874 -0.123717 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2339 2389 2.77933e-12 -3.05972 -0.0937068 0.0612327 7.50511e-14 -3.10418e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2389 2390 1.08917 -0.1287 -0.0120299 -0.000134377 0.0219363 -0.123744 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2340 2390 2.76001e-12 -3.05972 -0.0937068 0.0612327 7.4607e-14 -3.10862e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2390 2391 1.08161 -0.128246 -0.0118647 -0.000125301 0.0217851 -0.123771 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2341 2391 2.74136e-12 -3.05972 -0.0937068 0.0612327 7.41629e-14 -3.10862e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2391 2392 1.07405 -0.127792 -0.0117005 -0.000116217 0.0216339 -0.123797 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2342 2392 2.72271e-12 -3.05972 -0.0937068 0.0612327 7.37188e-14 -3.10862e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2392 2393 1.06649 -0.127338 -0.0115374 -0.000107125 0.0214826 -0.123823 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2343 2393 2.70273e-12 -3.05972 -0.0937068 0.0612327 7.37188e-14 -3.10862e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2393 2394 1.05892 -0.126883 -0.0113755 -9.8025e-05 0.0213314 -0.123849 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2344 2394 2.68496e-12 -3.05972 -0.0937068 0.0612327 7.32747e-14 -3.10862e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2394 2395 1.05136 -0.126427 -0.0112147 -8.89174e-05 0.0211801 -0.123875 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2345 2395 2.66409e-12 -3.05972 -0.0937068 0.0612327 7.28306e-14 -3.10862e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2395 2396 1.04379 -0.125972 -0.0110549 -7.98019e-05 0.0210287 -0.123901 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2346 2396 2.645e-12 -3.05972 -0.0937068 0.0612327 7.23865e-14 -3.11307e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2396 2397 1.03622 -0.125516 -0.0108963 -7.06787e-05 0.0208774 -0.123926 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2347 2397 2.62501e-12 -3.05972 -0.0937068 0.0612327 7.19425e-14 -3.11307e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2397 2398 1.02865 -0.125059 -0.0107389 -6.15479e-05 0.020726 -0.123952 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2348 2398 2.60569e-12 -3.05972 -0.0937068 0.0612327 7.14984e-14 -3.11307e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2398 2399 1.02108 -0.124602 -0.0105825 -5.24094e-05 0.0205745 -0.123977 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2349 2399 2.58682e-12 -3.05972 -0.0937068 0.0612327 7.10543e-14 -3.11307e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2399 2400 1.01351 -0.124145 -0.0104273 -4.32633e-05 0.0204231 -0.124002 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2350 2400 2.56745e-12 -3.05972 -0.0937068 0.0612327 7.10543e-14 -3.11751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2400 2401 1.00594 -0.123688 -0.0102731 -3.41097e-05 0.0202716 -0.124026 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2351 2401 2.54818e-12 -3.05972 -0.0937068 0.0612327 7.06102e-14 -3.11751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2401 2402 0.998361 -0.12323 -0.0101201 -2.49486e-05 0.0201201 -0.124051 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2352 2402 2.52931e-12 -3.05972 -0.0937068 0.0612327 7.01661e-14 -3.11751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2402 2403 0.990784 -0.122771 -0.00996825 -1.57802e-05 0.0199685 -0.124075 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2353 2403 2.50955e-12 -3.05972 -0.0937068 0.0612327 6.9722e-14 -3.11751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2403 2404 0.983205 -0.122313 -0.00981749 -6.60432e-06 0.019817 -0.124099 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2354 2404 2.48956e-12 -3.05972 -0.0937068 0.0612327 6.92779e-14 -3.11751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2404 2405 0.975625 -0.121854 -0.00966786 2.57882e-06 0.0196654 -0.124123 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2355 2405 2.4718e-12 -3.05972 -0.0937068 0.0612327 6.88338e-14 -3.11751e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2405 2406 0.968043 -0.121394 -0.00951935 1.17692e-05 0.0195137 -0.124147 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2356 2406 2.45182e-12 -3.05972 -0.0937068 0.0612327 6.83897e-14 -3.12195e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2406 2407 0.96046 -0.120934 -0.00937197 2.09668e-05 0.0193621 -0.124171 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2357 2407 2.43228e-12 -3.05972 -0.0937068 0.0612327 6.83897e-14 -3.12195e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2407 2408 0.952876 -0.120474 -0.00922571 3.01715e-05 0.0192104 -0.124194 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2358 2408 2.41362e-12 -3.05972 -0.0937068 0.0612327 6.79456e-14 -3.12195e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2408 2409 0.94529 -0.120014 -0.00908058 3.93833e-05 0.0190587 -0.124218 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2359 2409 2.39275e-12 -3.05972 -0.0937068 0.0612327 6.75016e-14 -3.12195e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2409 2410 0.937702 -0.119553 -0.00893658 4.86021e-05 0.0189069 -0.124241 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2360 2410 2.37366e-12 -3.05972 -0.0937068 0.0612327 6.70575e-14 -3.12639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2410 2411 0.930114 -0.119092 -0.00879371 5.7828e-05 0.0187551 -0.124264 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2361 2411 2.35456e-12 -3.05972 -0.0937068 0.0612327 6.66134e-14 -3.12639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2411 2412 0.922523 -0.11863 -0.00865197 6.70607e-05 0.0186033 -0.124286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2362 2412 2.33547e-12 -3.05972 -0.0937068 0.0612327 6.61693e-14 -3.12639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2412 2413 0.914932 -0.118168 -0.00851136 7.63003e-05 0.0184515 -0.124309 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2363 2413 2.31609e-12 -3.05972 -0.0937068 0.0612327 6.57252e-14 -3.12639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2413 2414 0.907339 -0.117706 -0.00837189 8.55467e-05 0.0182997 -0.124331 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2364 2414 2.29661e-12 -3.05972 -0.0937068 0.0612327 6.57252e-14 -3.12639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2414 2415 0.899745 -0.117243 -0.00823354 9.47999e-05 0.0181478 -0.124353 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2365 2415 2.27729e-12 -3.05972 -0.0937068 0.0612327 6.52811e-14 -3.12639e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2415 2416 0.892149 -0.11678 -0.00809633 0.00010406 0.0179959 -0.124375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2366 2416 2.25819e-12 -3.05972 -0.0937068 0.0612327 6.4837e-14 -3.13083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2416 2417 0.884552 -0.116317 -0.00796025 0.000113326 0.0178439 -0.124397 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2367 2417 2.2391e-12 -3.05972 -0.0937068 0.0612327 6.43929e-14 -3.13083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2417 2418 0.876954 -0.115854 -0.00782531 0.000122599 0.017692 -0.124419 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2368 2418 2.21956e-12 -3.05972 -0.0937068 0.0612327 6.39488e-14 -3.13083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2418 2419 0.869354 -0.11539 -0.0076915 0.000131879 0.01754 -0.12444 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2369 2419 2.19957e-12 -3.05972 -0.0937068 0.0612327 6.35048e-14 -3.13083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2419 2420 0.861753 -0.114925 -0.00755883 0.000141165 0.017388 -0.124461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2370 2420 2.18137e-12 -3.05972 -0.0937068 0.0612327 6.30607e-14 -3.13083e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2420 2421 0.854151 -0.114461 -0.0074273 0.000150458 0.0172359 -0.124482 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2371 2421 2.16049e-12 -3.05972 -0.0937068 0.0612327 6.30607e-14 -3.13527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2421 2422 0.846547 -0.113996 -0.00729691 0.000159757 0.0170838 -0.124503 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2372 2422 2.14184e-12 -3.05972 -0.0937068 0.0612327 6.26166e-14 -3.13527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2422 2423 0.838942 -0.113531 -0.00716765 0.000169062 0.0169318 -0.124524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2373 2423 2.12186e-12 -3.05972 -0.0937068 0.0612327 6.21725e-14 -3.13527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2423 2424 0.831336 -0.113065 -0.00703954 0.000178373 0.0167796 -0.124544 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2374 2424 2.10276e-12 -3.05972 -0.0937068 0.0612327 6.17284e-14 -3.13527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2424 2425 0.823729 -0.112599 -0.00691256 0.000187691 0.0166275 -0.124565 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2375 2425 2.08357e-12 -3.05972 -0.0937068 0.0612327 6.12843e-14 -3.13527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2425 2426 0.816121 -0.112133 -0.00678673 0.000197015 0.0164753 -0.124585 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2376 2426 2.06413e-12 -3.05972 -0.0937068 0.0612327 6.08402e-14 -3.13527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2426 2427 0.808511 -0.111667 -0.00666204 0.000206345 0.0163231 -0.124605 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2377 2427 2.04503e-12 -3.05972 -0.0937068 0.0612327 6.03961e-14 -3.13527e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2427 2428 0.8009 -0.1112 -0.00653849 0.000215681 0.0161709 -0.124624 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2378 2428 2.02505e-12 -3.05972 -0.0937068 0.0612327 5.9952e-14 -3.13971e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2428 2429 0.793288 -0.110733 -0.00641608 0.000225023 0.0160187 -0.124644 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2379 2429 2.00595e-12 -3.05972 -0.0937068 0.0612327 5.9952e-14 -3.13971e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2429 2430 0.785674 -0.110265 -0.00629482 0.000234371 0.0158664 -0.124663 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2380 2430 1.98641e-12 -3.05972 -0.0937068 0.0612327 5.9508e-14 -3.13971e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2430 2431 0.77806 -0.109798 -0.00617471 0.000243724 0.0157141 -0.124682 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2381 2431 1.96776e-12 -3.05972 -0.0937068 0.0612327 5.90639e-14 -3.13971e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2431 2432 0.770444 -0.10933 -0.00605574 0.000253084 0.0155618 -0.124701 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2382 2432 1.94689e-12 -3.05972 -0.0937068 0.0612327 5.86198e-14 -3.13971e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2432 2433 0.762827 -0.108862 -0.00593792 0.000262449 0.0154095 -0.12472 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2383 2433 1.92868e-12 -3.05972 -0.0937068 0.0612327 5.81757e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2433 2434 0.755209 -0.108393 -0.00582124 0.00027182 0.0152571 -0.124739 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2384 2434 1.90958e-12 -3.05972 -0.0937068 0.0612327 5.77316e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2434 2435 0.74759 -0.107924 -0.00570571 0.000281197 0.0151048 -0.124757 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2385 2435 1.88916e-12 -3.05972 -0.0937068 0.0612327 5.72875e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2435 2436 0.73997 -0.107455 -0.00559134 0.000290579 0.0149524 -0.124776 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2386 2436 1.87006e-12 -3.05972 -0.0937068 0.0612327 5.72875e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2436 2437 0.732349 -0.106986 -0.00547811 0.000299967 0.0147999 -0.124794 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2387 2437 1.85058e-12 -3.05972 -0.0937068 0.0612327 5.68434e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2437 2438 0.724726 -0.106516 -0.00536603 0.000309361 0.0146475 -0.124812 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2388 2438 1.83115e-12 -3.05972 -0.0937068 0.0612327 5.63993e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2438 2439 0.717103 -0.106046 -0.0052551 0.000318759 0.014495 -0.124829 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2389 2439 1.81211e-12 -3.05972 -0.0937068 0.0612327 5.59552e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2439 2440 0.709478 -0.105576 -0.00514532 0.000328164 0.0143425 -0.124847 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2390 2440 1.79234e-12 -3.05972 -0.0937068 0.0612327 5.55112e-14 -3.14415e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2440 2441 0.701852 -0.105106 -0.00503669 0.000337573 0.01419 -0.124864 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2391 2441 1.77325e-12 -3.05972 -0.0937068 0.0612327 5.50671e-14 -3.14859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2441 2442 0.694226 -0.104635 -0.00492922 0.000346988 0.0140375 -0.124881 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2392 2442 1.75371e-12 -3.05972 -0.0937068 0.0612327 5.4623e-14 -3.14859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2442 2443 0.686598 -0.104164 -0.0048229 0.000356408 0.013885 -0.124898 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2393 2443 1.73328e-12 -3.05972 -0.0937068 0.0612327 5.41789e-14 -3.14859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2443 2444 0.678969 -0.103693 -0.00471773 0.000365833 0.0137324 -0.124915 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2394 2444 1.71463e-12 -3.05972 -0.0937068 0.0612327 5.41789e-14 -3.14859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2444 2445 0.671339 -0.103221 -0.00461372 0.000375263 0.0135798 -0.124932 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2395 2445 1.69509e-12 -3.05972 -0.0937068 0.0612327 5.37348e-14 -3.14859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2445 2446 0.663708 -0.102749 -0.00451087 0.000384698 0.0134272 -0.124948 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2396 2446 1.67555e-12 -3.05972 -0.0937068 0.0612327 5.32907e-14 -3.14859e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2446 2447 0.656077 -0.102277 -0.00440917 0.000394138 0.0132746 -0.124964 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2397 2447 1.65645e-12 -3.05972 -0.0937068 0.0612327 5.28466e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2447 2448 0.648444 -0.101805 -0.00430862 0.000403583 0.0131219 -0.12498 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2398 2448 1.63691e-12 -3.05972 -0.0937068 0.0612327 5.24025e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2448 2449 0.64081 -0.101333 -0.00420923 0.000413033 0.0129692 -0.124996 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2399 2449 1.61715e-12 -3.05972 -0.0937068 0.0612327 5.19584e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2449 2450 0.633175 -0.10086 -0.00411101 0.000422488 0.0128166 -0.125012 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2400 2450 1.59773e-12 -3.05972 -0.0937068 0.0612327 5.15143e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2450 2451 0.62554 -0.100387 -0.00401393 0.000431947 0.0126638 -0.125027 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2401 2451 1.57818e-12 -3.05972 -0.0937068 0.0612327 5.10703e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2451 2452 0.617903 -0.0999137 -0.00391802 0.000441412 0.0125111 -0.125043 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2402 2452 1.55875e-12 -3.05972 -0.0937068 0.0612327 5.10703e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2452 2453 0.610265 -0.0994402 -0.00382327 0.000450881 0.0123584 -0.125058 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2403 2453 1.53921e-12 -3.05972 -0.0937068 0.0612327 5.06262e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2453 2454 0.602627 -0.0989666 -0.00372967 0.000460354 0.0122056 -0.125073 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2404 2454 1.51967e-12 -3.05972 -0.0937068 0.0612327 5.01821e-14 -3.15303e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2454 2455 0.594988 -0.0984926 -0.00363724 0.000469832 0.0120528 -0.125087 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2405 2455 1.50013e-12 -3.05972 -0.0937068 0.0612327 4.9738e-14 -3.15747e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2455 2456 0.587347 -0.0980185 -0.00354597 0.000479315 0.0119 -0.125102 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2406 2456 1.48104e-12 -3.05972 -0.0937068 0.0612327 4.92939e-14 -3.15747e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2456 2457 0.579706 -0.0975442 -0.00345586 0.000488801 0.0117472 -0.125116 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2407 2457 1.4615e-12 -3.05972 -0.0937068 0.0612327 4.88498e-14 -3.15747e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2457 2458 0.572064 -0.0970696 -0.00336691 0.000498293 0.0115944 -0.12513 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2408 2458 1.44196e-12 -3.05972 -0.0937068 0.0612327 4.84057e-14 -3.15747e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2458 2459 0.564421 -0.0965948 -0.00327913 0.000507788 0.0114415 -0.125144 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2409 2459 1.4222e-12 -3.05972 -0.0937068 0.0612327 4.84057e-14 -3.15747e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2459 2460 0.556777 -0.0961198 -0.0031925 0.000517288 0.0112887 -0.125158 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2410 2460 1.4031e-12 -3.05972 -0.0937068 0.0612327 4.79616e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2460 2461 0.549133 -0.0956446 -0.00310705 0.000526792 0.0111358 -0.125172 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2411 2461 1.38367e-12 -3.05972 -0.0937068 0.0612327 4.75175e-14 -3.15747e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2461 2462 0.541488 -0.0951692 -0.00302275 0.0005363 0.0109829 -0.125185 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2412 2462 1.36391e-12 -3.05972 -0.0937068 0.0612327 4.70735e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2462 2463 0.533841 -0.0946935 -0.00293962 0.000545812 0.01083 -0.125199 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2413 2463 1.34454e-12 -3.05972 -0.0937068 0.0612327 4.66294e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2463 2464 0.526194 -0.0942177 -0.00285766 0.000555329 0.010677 -0.125212 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2414 2464 1.32494e-12 -3.05972 -0.0937068 0.0612327 4.61853e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2464 2465 0.518547 -0.0937417 -0.00277686 0.000564849 0.0105241 -0.125225 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2415 2465 1.30584e-12 -3.05972 -0.0937068 0.0612327 4.57412e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2465 2466 0.510898 -0.0932654 -0.00269723 0.000574373 0.0103711 -0.125237 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2416 2466 1.2863e-12 -3.05972 -0.0937068 0.0612327 4.52971e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2466 2467 0.503249 -0.092789 -0.00261876 0.000583901 0.0102181 -0.12525 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2417 2467 1.2661e-12 -3.05972 -0.0937068 0.0612327 4.52971e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2467 2468 0.495599 -0.0923124 -0.00254146 0.000593433 0.0100651 -0.125262 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2418 2468 1.24678e-12 -3.05972 -0.0937068 0.0612327 4.4853e-14 -3.16192e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2468 2469 0.487948 -0.0918356 -0.00246533 0.000602968 0.00991213 -0.125274 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2419 2469 1.22746e-12 -3.05972 -0.0937068 0.0612327 4.44089e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2469 2470 0.480296 -0.0913586 -0.00239037 0.000612508 0.00975911 -0.125286 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2420 2470 1.20748e-12 -3.05972 -0.0937068 0.0612327 4.39648e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2470 2471 0.472644 -0.0908815 -0.00231657 0.00062205 0.00960607 -0.125298 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2421 2471 1.18883e-12 -3.05972 -0.0937068 0.0612327 4.35207e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2471 2472 0.464991 -0.0904041 -0.00224395 0.000631597 0.00945302 -0.12531 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2422 2472 1.16862e-12 -3.05972 -0.0937068 0.0612327 4.30767e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2472 2473 0.457337 -0.0899266 -0.00217249 0.000641147 0.00929995 -0.125321 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2423 2473 1.1493e-12 -3.05972 -0.0937068 0.0612327 4.26326e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2473 2474 0.449683 -0.0894489 -0.0021022 0.0006507 0.00914687 -0.125332 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2424 2474 1.12998e-12 -3.05972 -0.0937068 0.0612327 4.21885e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2474 2475 0.442028 -0.088971 -0.00203309 0.000660257 0.00899378 -0.125343 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2425 2475 1.1104e-12 -3.05972 -0.0937068 0.0612327 4.21885e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2475 2476 0.434372 -0.088493 -0.00196514 0.000669817 0.00884067 -0.125354 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2426 2476 1.09074e-12 -3.05972 -0.0937068 0.0612327 4.17444e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2476 2477 0.426716 -0.0880148 -0.00189837 0.00067938 0.00868755 -0.125365 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2427 2477 1.07125e-12 -3.05972 -0.0937068 0.0612327 4.13003e-14 -3.16636e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2477 2478 0.419059 -0.0875364 -0.00183276 0.000688947 0.00853442 -0.125375 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2428 2478 1.0516e-12 -3.05972 -0.0937068 0.0612327 4.08562e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2478 2479 0.411401 -0.0870579 -0.00176833 0.000698517 0.00838127 -0.125385 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2429 2479 1.03251e-12 -3.05972 -0.0937068 0.0612327 4.04121e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2479 2480 0.403743 -0.0865792 -0.00170507 0.00070809 0.00822812 -0.125395 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2430 2480 1.01275e-12 -3.05972 -0.0937068 0.0612327 3.9968e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2480 2481 0.396084 -0.0861004 -0.00164299 0.000717666 0.00807495 -0.125405 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2431 2481 9.9365e-13 -3.05972 -0.0937068 0.0612327 3.95239e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2481 2482 0.388425 -0.0856214 -0.00158207 0.000727245 0.00792176 -0.125415 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2432 2482 9.73888e-13 -3.05972 -0.0937068 0.0612327 3.90799e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2482 2483 0.380765 -0.0851423 -0.00152233 0.000736827 0.00776857 -0.125425 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2433 2483 9.54348e-13 -3.05972 -0.0937068 0.0612327 3.90799e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2483 2484 0.373104 -0.084663 -0.00146377 0.000746412 0.00761537 -0.125434 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2434 2484 9.3503e-13 -3.05972 -0.0937068 0.0612327 3.86358e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2484 2485 0.365443 -0.0841836 -0.00140637 0.000756 0.00746215 -0.125443 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2435 2485 9.15268e-13 -3.05972 -0.0937068 0.0612327 3.81917e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2485 2486 0.357781 -0.0837041 -0.00135016 0.00076559 0.00730892 -0.125452 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2436 2486 8.95728e-13 -3.05972 -0.0937068 0.0612327 3.77476e-14 -3.1708e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2486 2487 0.350119 -0.0832244 -0.00129511 0.000775183 0.00715568 -0.125461 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2437 2487 8.76077e-13 -3.05972 -0.0937068 0.0612327 3.73035e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2487 2488 0.342456 -0.0827446 -0.00124124 0.000784779 0.00700244 -0.125469 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2438 2488 8.56537e-13 -3.05972 -0.0937068 0.0612327 3.68594e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2488 2489 0.334793 -0.0822646 -0.00118855 0.000794378 0.00684918 -0.125478 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2439 2489 8.36831e-13 -3.05972 -0.0937068 0.0612327 3.64153e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2489 2490 0.327129 -0.0817845 -0.00113703 0.000803979 0.00669591 -0.125486 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2440 2490 8.17235e-13 -3.05972 -0.0937068 0.0612327 3.59712e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2490 2491 0.319465 -0.0813043 -0.00108669 0.000813582 0.00654263 -0.125494 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2441 2491 7.97584e-13 -3.05972 -0.0937068 0.0612327 3.59712e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2491 2492 0.3118 -0.080824 -0.00103753 0.000823188 0.00638934 -0.125502 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2442 2492 7.77822e-13 -3.05972 -0.0937068 0.0612327 3.55271e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2492 2493 0.304135 -0.0803435 -0.000989541 0.000832796 0.00623604 -0.12551 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2443 2493 7.59171e-13 -3.05972 -0.0937068 0.0612327 3.5083e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2493 2494 0.296469 -0.079863 -0.000942729 0.000842407 0.00608273 -0.125517 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2444 2494 7.39631e-13 -3.05972 -0.0937068 0.0612327 3.4639e-14 -3.17524e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2494 2495 0.288803 -0.0793823 -0.000897096 0.00085202 0.00592942 -0.125524 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2445 2495 7.19869e-13 -3.05972 -0.0937068 0.0612327 3.41949e-14 -3.17968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2495 2496 0.281136 -0.0789015 -0.000852639 0.000861635 0.00577609 -0.125532 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2446 2496 7.0044e-13 -3.05972 -0.0937068 0.0612327 3.37508e-14 -3.17968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2496 2497 0.27347 -0.0784206 -0.00080936 0.000871253 0.00562276 -0.125539 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2447 2497 6.80456e-13 -3.05972 -0.0937068 0.0612327 3.33067e-14 -3.17968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2497 2498 0.265802 -0.0779396 -0.000767259 0.000880872 0.00546942 -0.125545 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2448 2498 6.61027e-13 -3.05972 -0.0937068 0.0612327 3.28626e-14 -3.17968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2498 2499 0.258134 -0.0774585 -0.000726337 0.000890493 0.00531607 -0.125552 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 +EDGE3 2449 2499 6.41709e-13 -3.05972 -0.0937068 0.0612327 3.28626e-14 -3.17968e-13 10 0 0 0 0 0 10 0 0 0 0 10 0 0 0 100 0 0 100 0 25 From be7828b8cf7e896cde9174dd607173b68cc7a189 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 05:53:51 +0000 Subject: [PATCH 123/914] Pose3SLAM example works (MATLAB only) --- examples/matlab/Pose3SLAMExample_graph.m | 23 +++++++----- examples/matlab/load3D.m | 36 +++++++++++++----- examples/matlab/plot3DTrajectory.m | 15 ++++++++ gtsam.h | 47 ++++++++++++++++++------ 4 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 examples/matlab/plot3DTrajectory.m diff --git a/examples/matlab/Pose3SLAMExample_graph.m b/examples/matlab/Pose3SLAMExample_graph.m index a42484484..b1f0afb1a 100644 --- a/examples/matlab/Pose3SLAMExample_graph.m +++ b/examples/matlab/Pose3SLAMExample_graph.m @@ -10,19 +10,24 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +N = 2500; +% filename = '../Data/sphere_smallnoise.graph'; +% filename = '../Data/sphere2500_groundtruth.txt'; +filename = '../Data/sphere2500.txt'; + %% Initialize graph, initial estimate, and odometry noise model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -[graph,initial]=load3D('../Data/sphere_smallnoise.graph',model,100); - -%% Fix first pose +[graph,initial]=load3D(filename,model,true,N); first = initial.pose(0); -graph.addHardConstraint(0, first); % add directly to graph +graph.addHardConstraint(0, first); %% Plot Initial Estimate figure(1);clf -plot3(initial.xs(),initial.ys(),initial.zs(),'g-'); hold on -plot3(first.x(),first.y(),first.z(),'r*'); +plot3(first.x(),first.y(),first.z(),'r*'); hold on +plot3DTrajectory(initial,'g-',false); -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initial); -hold on; plot3(result.xs(),result.ys(),result.zs(),'b-');axis equal; \ No newline at end of file +%% Read again, now all constraints +[graph,discard]=load3D(filename,model,false,N); +graph.addHardConstraint(0, first); +result = graph.optimize(initial); % start from old result +plot3DTrajectory(result,'r-',false); axis equal; diff --git a/examples/matlab/load3D.m b/examples/matlab/load3D.m index 0ed6ecd61..82ae098b9 100644 --- a/examples/matlab/load3D.m +++ b/examples/matlab/load3D.m @@ -1,6 +1,9 @@ -function [graph,initial] = load3D(filename,model,N) +function [graph,initial] = load3D(filename,model,successive,N) % load3D: read TORO 3D pose graph % cannot read noise model from file yet, uses specified model +% if [successive] is tru, constructs initial estimate from odometry + +if nargin<3, successive=false; end fid = fopen(filename); if fid < 0 error(['load2D: Cannot open file ' filename]); @@ -14,24 +17,39 @@ lines=columns{1}; % loop over lines and add vertices graph = pose3SLAMGraph; initial = pose3SLAMValues; +origin=gtsamPose3; +initial.insertPose(0,origin); n=size(lines,1); -if nargin<3, N=n;end +if nargin<4, N=n;end for i=1:n line_i=lines{i}; if strcmp('VERTEX3',line_i(1:7)) v = textscan(line_i,'%s %d %f %f %f %f %f %f',1); - if v{2}i1 + initial.insertPose(i2,initial.pose(i1).compose(dpose)); + else + initial.insertPose(i1,initial.pose(i2).compose(dpose.inverse)); + end + end + end end end end diff --git a/examples/matlab/plot3DTrajectory.m b/examples/matlab/plot3DTrajectory.m new file mode 100644 index 000000000..f2c1d8f2f --- /dev/null +++ b/examples/matlab/plot3DTrajectory.m @@ -0,0 +1,15 @@ +function plot3DTrajectory(values,style,frames) +% plot3DTrajectory +if nargin<3,frames=false;end + +plot3(values.xs(),values.ys(),values.zs(),style); hold on +if frames + for i=0:N-1 + pose = values.pose(i); + t = pose.translation; + R = pose.rotation.matrix; + quiver3(t.x,t.y,t.z,R(1,1),R(2,1),R(3,1),'r'); + quiver3(t.x,t.y,t.z,R(1,2),R(2,2),R(3,2),'g'); + quiver3(t.x,t.y,t.z,R(1,3),R(2,3),R(3,3),'b'); + end +end \ No newline at end of file diff --git a/gtsam.h b/gtsam.h index 48a205e2e..2015705ae 100644 --- a/gtsam.h +++ b/gtsam.h @@ -197,26 +197,51 @@ class Pose2 { }; class Pose3 { + // Standard Constructors Pose3(); + Pose3(const gtsam::Pose3& pose); Pose3(const gtsam::Rot3& r, const gtsam::Point3& t); - Pose3(Matrix t); Pose3(const gtsam::Pose2& pose2); - static gtsam::Pose3 Expmap(Vector v); - static Vector Logmap(const gtsam::Pose3& p); + Pose3(Matrix t); + + // Testable void print(string s) const; bool equals(const gtsam::Pose3& pose, double tol) const; + + // Group + static gtsam::Pose3 identity(); + gtsam::Pose3 inverse(); + gtsam::Pose3 compose(const gtsam::Pose3& p2); + gtsam::Pose3 between(const gtsam::Pose3& p2); + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Pose3 retract(Vector v); + gtsam::Pose3 retractFirstOrder(Vector v); + Vector localCoordinates(const gtsam::Pose3& T2) const; + + // Lie Group + static gtsam::Pose3 Expmap(Vector v); + static Vector Logmap(const gtsam::Pose3& p); + Matrix adjointMap() const; + Vector adjoint(const Vector& xi) const; + static Matrix wedge(double wx, double wy, double wz, double vx, double vy, double vz); + + // Group Action on Point3 + gtsam::Point3 transform_from(const gtsam::Point3& p) const; + gtsam::Point3 transform_to(const gtsam::Point3& p) const; + + // Standard Interface + gtsam::Rot3 rotation() const; + gtsam::Point3 translation() const; double x() const; double y() const; double z() const; Matrix matrix() const; - Matrix adjointMap() const; - gtsam::Pose3 compose(const gtsam::Pose3& p2); - gtsam::Pose3 between(const gtsam::Pose3& p2); - gtsam::Pose3 retract(Vector v); - gtsam::Pose3 retractFirstOrder(Vector v); - Vector localCoordinates(const gtsam::Pose3& T2) const; - gtsam::Point3 translation() const; - gtsam::Rot3 rotation() const; + gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; + double range(const gtsam::Point3& point); + // double range(const gtsam::Pose3& pose); }; class Cal3_S2 { From 4eee4b72f48a3a705fc1a027d6922a1061f6409d Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Mon, 4 Jun 2012 08:31:26 +0000 Subject: [PATCH 124/914] add better visualSLAM examples --- examples/VisualSLAMExampleData.h | 91 +++++++++++++++++++++ examples/VisualSLAMforSFMExample.cpp | 64 +++++++++++++++ examples/VisualSLAMwISAM2Example.cpp | 113 +++++++++++++++++++++++++++ 3 files changed, 268 insertions(+) create mode 100644 examples/VisualSLAMExampleData.h create mode 100644 examples/VisualSLAMforSFMExample.cpp create mode 100644 examples/VisualSLAMwISAM2Example.cpp diff --git a/examples/VisualSLAMExampleData.h b/examples/VisualSLAMExampleData.h new file mode 100644 index 000000000..f0ee4d2b5 --- /dev/null +++ b/examples/VisualSLAMExampleData.h @@ -0,0 +1,91 @@ +/* ---------------------------------------------------------------------------- + + * 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 VisualSLAMSimulatedData.cpp + * @brief Generate ground-truth simulated data for VisualSLAM examples (SFM and ISAM2) + * @author Duy-Nguyen Ta + */ + +#pragma once + +#include +#include +#include + +/* ************************************************************************* */ +/** + * Simulated data for the example: + * - 8 Landmarks: (10,10,10) (-10,10,10) (-10,-10,10) (10,-10,10) + * (10,10,-10) (-10,10,-10) (-10,-10,-10) (10,-10,-10) + * - n 90-deg-FoV cameras with the same calibration parameters: + * f = 50.0, Image: 100x100, center: 50.0, 50.0 + * and ground-truth poses on a circle around the landmarks looking at the world's origin: + * Rot3(-sin(theta), 0, -cos(theta), + * cos(theta), 0, -sin(theta), + * 0, -1, 0 ), + * Point3(r*cos(theta), r*sin(theta), 0.0) + * (theta += 2*pi/N) + * - Measurement noise: 1 pix sigma + */ +struct VisualSLAMExampleData { + gtsam::shared_ptrK sK; // camera calibration parameters + std::vector poses; // ground-truth camera poses + gtsam::Pose3 odometry; // ground-truth odometry between 2 consecutive poses (simulated data for iSAM) + std::vector landmarks; // ground-truth landmarks + std::map > z; // 2D measurements of landmarks in each camera frame + gtsam::SharedDiagonal noiseZ; // measurement noise (noiseModel::Isotropic::Sigma(2, 5.0f)); + gtsam::SharedDiagonal noiseX; // noise for camera poses + gtsam::SharedDiagonal noiseL; // noise for landmarks + + static const VisualSLAMExampleData generate() { + VisualSLAMExampleData data; + // Landmarks (ground truth) + data.landmarks.push_back(gtsam::Point3(10.0,10.0,10.0)); + data.landmarks.push_back(gtsam::Point3(-10.0,10.0,10.0)); + data.landmarks.push_back(gtsam::Point3(-10.0,-10.0,10.0)); + data.landmarks.push_back(gtsam::Point3(10.0,-10.0,10.0)); + data.landmarks.push_back(gtsam::Point3(10.0,10.0,-10.0)); + data.landmarks.push_back(gtsam::Point3(-10.0,10.0,-10.0)); + data.landmarks.push_back(gtsam::Point3(-10.0,-10.0,-10.0)); + data.landmarks.push_back(gtsam::Point3(10.0,-10.0,-10.0)); + + // Camera calibration parameters + data.sK = gtsam::shared_ptrK(new gtsam::Cal3_S2(50.0, 50.0, 0.0, 50.0, 50.0)); + + // n camera poses + int n = 8; + double theta = 0.0; + double r = 30.0; + for (int i=0; isample())); + } + } + data.noiseX = gtsam::sharedSigmas(gtsam::Vector_(6, 0.01, 0.01, 0.01, 0.1, 0.1, 0.1)); + data.noiseL = gtsam::sharedSigma(3, 0.1); + + return data; + } +}; diff --git a/examples/VisualSLAMforSFMExample.cpp b/examples/VisualSLAMforSFMExample.cpp new file mode 100644 index 000000000..17f457908 --- /dev/null +++ b/examples/VisualSLAMforSFMExample.cpp @@ -0,0 +1,64 @@ +/* ---------------------------------------------------------------------------- + + * 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 VisualSLAMforSFMExample.cpp + * @brief A visualSLAM example for the structure-from-motion problem on a simulated dataset + * @author Duy-Nguyen Ta + */ + +#include +#include +#include +#include +#include "VisualSLAMExampleData.h" + +using namespace std; +using namespace gtsam; + +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + +/* ************************************************************************* */ +int main(int argc, char* argv[]) { + + VisualSLAMExampleData data = VisualSLAMExampleData::generate(); + + /* 1. Create graph *///using the 2D measurements (features) and the calibration data + visualSLAM::Graph graph; + + /* 2. Add factors to the graph */ + // 2a. Measurement factors + for (size_t i=0; isample())); + for (size_t j=0; jsample())); + initial.print("Intial Estimates: "); + + /* 4. Optimize the graph and print results */ + visualSLAM::Values result = GaussNewtonOptimizer(graph, initial).optimize(); +// visualSLAM::Values result = LevenbergMarquardtOptimizer(graph, initial).optimize(); + result.print("Final results: "); + + return 0; +} +/* ************************************************************************* */ + diff --git a/examples/VisualSLAMwISAM2Example.cpp b/examples/VisualSLAMwISAM2Example.cpp new file mode 100644 index 000000000..07fe0433c --- /dev/null +++ b/examples/VisualSLAMwISAM2Example.cpp @@ -0,0 +1,113 @@ +/* ---------------------------------------------------------------------------- + + * 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 VisualSLAMwISAM2Example.cpp + * @brief An ISAM example for synthesis sequence, single camera + * @author Duy-Nguyen Ta + */ + +#include +#include +#include +#include +#include "VisualSLAMExampleData.h" + +using namespace std; +using namespace gtsam; + +// Convenience for named keys +using symbol_shorthand::X; +using symbol_shorthand::L; + +/* ************************************************************************* */ +int main(int argc, char* argv[]) { + + VisualSLAMExampleData data = VisualSLAMExampleData::generate(); + + /* 1. Create a NonlinearISAM which will be relinearized and reordered after every "relinearizeInterval" updates */ + int relinearizeInterval = 3; + NonlinearISAM<> isam(relinearizeInterval); + + /* 2. At each frame (poseId) with new camera pose and set of associated measurements, + * create a graph of new factors and update ISAM */ + + // Store the current best estimate from ISAM + Values currentEstimate; + + // First two frames: + // Add factors and initial values for the first two poses and landmarks then update ISAM. + // Note: measurements from the first pose only are not enough to update ISAM: + // the system is underconstrained. + { + visualSLAM::Graph newFactors; + + // First pose with prior factor + newFactors.addPosePrior(X(0), data.poses[0], data.noiseX); + + // Second pose with odometry measurement, simulated by adding Gaussian noise to the ground-truth. + Pose3 odoMeasurement = data.odometry*Pose3::Expmap(data.noiseX->sample()); + newFactors.push_back( boost::shared_ptr >( + new BetweenFactor(X(0), X(1), odoMeasurement, data.noiseX))); + + // Visual measurements at both poses + for (size_t i=0; i<2; ++i) { + for (size_t j=0; jsample()); + initials.insert(X(0), pose0Init); + initials.insert(X(1), pose0Init*odoMeasurement); + + // Initial values for the landmarks, simulated with Gaussian noise + for (size_t j=0; jsample())); + + // Update ISAM the first time and obtain the current estimate + isam.update(newFactors, initials); + currentEstimate = isam.estimate(); + cout << "Pose 0 and 1: " << endl; + currentEstimate.print("Current estimate: "); + } + + // Subsequent frames: Add new odometry and measurement factors and initial values, + // then update ISAM at each frame + for (size_t i=2; isample()); + newFactors.push_back( boost::shared_ptr >( + new BetweenFactor(X(i-1), X(i), odoMeasurement, data.noiseX))); + // Factors for visual measurements + for (size_t j=0; j(X(i-1))*odoMeasurement); + + // update ISAM + isam.update(newFactors, initials); + currentEstimate = isam.estimate(); + cout << "****************************************************" << endl; + cout << "Pose " << i << ": " << endl; + currentEstimate.print("Current estimate: "); + } + + return 0; +} +/* ************************************************************************* */ + From 4fbdd979a1bb919fbfbb115faa077fc4d613820a Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Mon, 4 Jun 2012 08:51:03 +0000 Subject: [PATCH 125/914] small rewording --- examples/VisualSLAMwISAM2Example.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/VisualSLAMwISAM2Example.cpp b/examples/VisualSLAMwISAM2Example.cpp index 07fe0433c..1ec43136f 100644 --- a/examples/VisualSLAMwISAM2Example.cpp +++ b/examples/VisualSLAMwISAM2Example.cpp @@ -78,7 +78,7 @@ int main(int argc, char* argv[]) { // Update ISAM the first time and obtain the current estimate isam.update(newFactors, initials); currentEstimate = isam.estimate(); - cout << "Pose 0 and 1: " << endl; + cout << "Frame 0 and 1: " << endl; currentEstimate.print("Current estimate: "); } @@ -103,7 +103,7 @@ int main(int argc, char* argv[]) { isam.update(newFactors, initials); currentEstimate = isam.estimate(); cout << "****************************************************" << endl; - cout << "Pose " << i << ": " << endl; + cout << "Frame " << i << ": " << endl; currentEstimate.print("Current estimate: "); } From 9c6eba4cf8606a24365a4e51b7612c71a3e49e91 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Mon, 4 Jun 2012 08:51:34 +0000 Subject: [PATCH 126/914] remove old visual SLAM example and its data --- examples/Data/calib.txt | 1 - examples/Data/landmarks.txt | 9 -- examples/Data/measurements.txt | 12 -- examples/Data/poses.txt | 12 -- examples/Data/ttpy10.feat | 8 -- examples/Data/ttpy10.pose | 4 - examples/Data/ttpy100.feat | 8 -- examples/Data/ttpy100.pose | 4 - examples/Data/ttpy20.feat | 8 -- examples/Data/ttpy20.pose | 4 - examples/Data/ttpy30.feat | 8 -- examples/Data/ttpy30.pose | 4 - examples/Data/ttpy40.feat | 8 -- examples/Data/ttpy40.pose | 4 - examples/Data/ttpy50.feat | 8 -- examples/Data/ttpy50.pose | 4 - examples/Data/ttpy60.feat | 8 -- examples/Data/ttpy60.pose | 4 - examples/Data/ttpy70.feat | 8 -- examples/Data/ttpy70.pose | 4 - examples/Data/ttpy80.feat | 8 -- examples/Data/ttpy80.pose | 4 - examples/Data/ttpy90.feat | 8 -- examples/Data/ttpy90.pose | 4 - examples/vSLAMexample/CMakeLists.txt | 14 -- examples/vSLAMexample/Feature2D.h | 41 ------ examples/vSLAMexample/README | 101 -------------- examples/vSLAMexample/vISAMexample.cpp | 146 -------------------- examples/vSLAMexample/vSFMexample.cpp | 159 ---------------------- examples/vSLAMexample/vSLAMutils.cpp | 176 ------------------------- examples/vSLAMexample/vSLAMutils.h | 36 ----- 31 files changed, 827 deletions(-) delete mode 100644 examples/Data/calib.txt delete mode 100644 examples/Data/landmarks.txt delete mode 100644 examples/Data/measurements.txt delete mode 100644 examples/Data/poses.txt delete mode 100644 examples/Data/ttpy10.feat delete mode 100644 examples/Data/ttpy10.pose delete mode 100644 examples/Data/ttpy100.feat delete mode 100644 examples/Data/ttpy100.pose delete mode 100644 examples/Data/ttpy20.feat delete mode 100644 examples/Data/ttpy20.pose delete mode 100644 examples/Data/ttpy30.feat delete mode 100644 examples/Data/ttpy30.pose delete mode 100644 examples/Data/ttpy40.feat delete mode 100644 examples/Data/ttpy40.pose delete mode 100644 examples/Data/ttpy50.feat delete mode 100644 examples/Data/ttpy50.pose delete mode 100644 examples/Data/ttpy60.feat delete mode 100644 examples/Data/ttpy60.pose delete mode 100644 examples/Data/ttpy70.feat delete mode 100644 examples/Data/ttpy70.pose delete mode 100644 examples/Data/ttpy80.feat delete mode 100644 examples/Data/ttpy80.pose delete mode 100644 examples/Data/ttpy90.feat delete mode 100644 examples/Data/ttpy90.pose delete mode 100644 examples/vSLAMexample/CMakeLists.txt delete mode 100644 examples/vSLAMexample/Feature2D.h delete mode 100644 examples/vSLAMexample/README delete mode 100644 examples/vSLAMexample/vISAMexample.cpp delete mode 100644 examples/vSLAMexample/vSFMexample.cpp delete mode 100644 examples/vSLAMexample/vSLAMutils.cpp delete mode 100644 examples/vSLAMexample/vSLAMutils.h diff --git a/examples/Data/calib.txt b/examples/Data/calib.txt deleted file mode 100644 index cb8b77384..000000000 --- a/examples/Data/calib.txt +++ /dev/null @@ -1 +0,0 @@ -800 600 1119.61507797 1119.61507797 399.5 299.5 diff --git a/examples/Data/landmarks.txt b/examples/Data/landmarks.txt deleted file mode 100644 index f6dd9714e..000000000 --- a/examples/Data/landmarks.txt +++ /dev/null @@ -1,9 +0,0 @@ -7 -0 0 0 0 -1 10 0 0 -2 0 10 0 -3 10 10 0 -4 0 0 10 -5 10 0 10 -6 0 10 10 - diff --git a/examples/Data/measurements.txt b/examples/Data/measurements.txt deleted file mode 100644 index ffed3636e..000000000 --- a/examples/Data/measurements.txt +++ /dev/null @@ -1,12 +0,0 @@ -10 -1 ttpy10.feat -2 ttpy20.feat -3 ttpy30.feat -4 ttpy40.feat -5 ttpy50.feat -6 ttpy60.feat -7 ttpy70.feat -8 ttpy80.feat -9 ttpy90.feat -10 ttpy100.feat - diff --git a/examples/Data/poses.txt b/examples/Data/poses.txt deleted file mode 100644 index 72fec9114..000000000 --- a/examples/Data/poses.txt +++ /dev/null @@ -1,12 +0,0 @@ -10 -1 ttpy10.pose -2 ttpy20.pose -3 ttpy30.pose -4 ttpy40.pose -5 ttpy50.pose -6 ttpy60.pose -7 ttpy70.pose -8 ttpy80.pose -9 ttpy90.pose -10 ttpy100.pose - diff --git a/examples/Data/ttpy10.feat b/examples/Data/ttpy10.feat deleted file mode 100644 index 265c3dfde..000000000 --- a/examples/Data/ttpy10.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -6 424 190 -4 399.553 240.574 -2 422.974 248.632 -5 480.082 258.082 -3 496.146 264.634 -0 399.5 299.5 -1 475.915 317.106 diff --git a/examples/Data/ttpy10.pose b/examples/Data/ttpy10.pose deleted file mode 100644 index b9226c723..000000000 --- a/examples/Data/ttpy10.pose +++ /dev/null @@ -1,4 +0,0 @@ -0.93969 0.24185 -0.24185 34.202 -0.34202 -0.66446 0.66446 -93.969 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy100.feat b/examples/Data/ttpy100.feat deleted file mode 100644 index fb16b2777..000000000 --- a/examples/Data/ttpy100.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -5 321.545 223.591 -4 399.553 240.574 -1 325.395 282.512 -6 372.434 296.453 -0 399.5 299.5 -3 296.479 336.708 -2 373.796 355.347 diff --git a/examples/Data/ttpy100.pose b/examples/Data/ttpy100.pose deleted file mode 100644 index cbd21233f..000000000 --- a/examples/Data/ttpy100.pose +++ /dev/null @@ -1,4 +0,0 @@ --0.93969 -0.24185 0.24185 -34.202 --0.34202 0.66446 -0.66446 93.969 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy20.feat b/examples/Data/ttpy20.feat deleted file mode 100644 index 0afb761b9..000000000 --- a/examples/Data/ttpy20.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -6 448.854 198.317 -4 399.574 240.532 -2 446.39 257.049 -5 467.479 276.146 -3 509.674 289.86 -0 399.5 299.5 -1 463.827 335.115 diff --git a/examples/Data/ttpy20.pose b/examples/Data/ttpy20.pose deleted file mode 100644 index bba2606d0..000000000 --- a/examples/Data/ttpy20.pose +++ /dev/null @@ -1,4 +0,0 @@ -0.76604 0.45452 -0.45452 64.279 -0.64279 -0.54168 0.54168 -76.604 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy30.feat b/examples/Data/ttpy30.feat deleted file mode 100644 index 412417476..000000000 --- a/examples/Data/ttpy30.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -6 468.239 211.826 -4 399.319 240.617 -2 464.725 270.725 -5 445.7 290.2 -0 399.5 299.5 -3 510.239 317.674 -1 443.471 349.078 diff --git a/examples/Data/ttpy30.pose b/examples/Data/ttpy30.pose deleted file mode 100644 index 737e391f2..000000000 --- a/examples/Data/ttpy30.pose +++ /dev/null @@ -1,4 +0,0 @@ -0.5 0.61237 -0.61237 86.603 -0.86603 -0.35355 0.35355 -50 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy40.feat b/examples/Data/ttpy40.feat deleted file mode 100644 index 0e298272b..000000000 --- a/examples/Data/ttpy40.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -6 480.111 229.111 -4 399.556 240.556 -2 476.163 287.93 -5 417.685 298.056 -0 399.605 299.535 -3 497.1 344.3 -1 416.846 357.038 diff --git a/examples/Data/ttpy40.pose b/examples/Data/ttpy40.pose deleted file mode 100644 index 4e241c130..000000000 --- a/examples/Data/ttpy40.pose +++ /dev/null @@ -1,4 +0,0 @@ -0.17365 0.69636 -0.69636 98.481 -0.98481 -0.12279 0.12279 -17.365 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy50.feat b/examples/Data/ttpy50.feat deleted file mode 100644 index 5ec007888..000000000 --- a/examples/Data/ttpy50.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -4 399.429 240.551 -6 482.812 248.312 -5 387.364 298.964 -0 399.578 299.556 -2 478.63 307.391 -1 387.98 357.804 -3 470.922 366.471 diff --git a/examples/Data/ttpy50.pose b/examples/Data/ttpy50.pose deleted file mode 100644 index 5a57b10ef..000000000 --- a/examples/Data/ttpy50.pose +++ /dev/null @@ -1,4 +0,0 @@ --0.17365 0.69636 -0.69636 98.481 -0.98481 0.12279 -0.12279 17.365 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy60.feat b/examples/Data/ttpy60.feat deleted file mode 100644 index 05237171f..000000000 --- a/examples/Data/ttpy60.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -4 399.478 240.565 -6 474.941 267.451 -5 358.473 292.364 -0 399.5 299.5 -2 471.043 326.447 -1 360.68 351.22 -3 434.473 380.709 diff --git a/examples/Data/ttpy60.pose b/examples/Data/ttpy60.pose deleted file mode 100644 index 4e5455a0d..000000000 --- a/examples/Data/ttpy60.pose +++ /dev/null @@ -1,4 +0,0 @@ --0.5 0.61237 -0.61237 86.603 -0.86603 0.35355 -0.35355 50 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy70.feat b/examples/Data/ttpy70.feat deleted file mode 100644 index fd5af8c99..000000000 --- a/examples/Data/ttpy70.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -4 399.553 240.617 -5 335.294 279.275 -6 457.717 283.698 -0 399.5 299.5 -1 338.531 338.265 -2 454.54 342.64 -3 393.218 384.691 diff --git a/examples/Data/ttpy70.pose b/examples/Data/ttpy70.pose deleted file mode 100644 index 608e9ff7c..000000000 --- a/examples/Data/ttpy70.pose +++ /dev/null @@ -1,4 +0,0 @@ --0.76604 0.45452 -0.45452 64.279 -0.64279 0.54168 -0.54168 76.604 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy80.feat b/examples/Data/ttpy80.feat deleted file mode 100644 index 465f80804..000000000 --- a/examples/Data/ttpy80.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -4 399.5 240.5 -5 320.667 261.958 -6 432.389 295.111 -0 399.5 299.5 -1 324.653 320.898 -2 430.5 353.96 -3 352.737 377.474 diff --git a/examples/Data/ttpy80.pose b/examples/Data/ttpy80.pose deleted file mode 100644 index 8a6ae4cd1..000000000 --- a/examples/Data/ttpy80.pose +++ /dev/null @@ -1,4 +0,0 @@ --0.93969 0.24185 -0.24185 34.202 -0.34202 0.66446 -0.66446 93.969 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/Data/ttpy90.feat b/examples/Data/ttpy90.feat deleted file mode 100644 index 6731831c0..000000000 --- a/examples/Data/ttpy90.feat +++ /dev/null @@ -1,8 +0,0 @@ -7 -4 399.5 240.5 -5 316 242.5 -0 397 299.5 -6 402.765 299.588 -1 320.5 301.5 -2 402.5 358.5 -3 319 360.5 diff --git a/examples/Data/ttpy90.pose b/examples/Data/ttpy90.pose deleted file mode 100644 index 863f71fea..000000000 --- a/examples/Data/ttpy90.pose +++ /dev/null @@ -1,4 +0,0 @@ --1 -0 0 0 -0 0.70711 -0.70711 100 -0 -0.70711 -0.70711 100 -0 0 0 1 diff --git a/examples/vSLAMexample/CMakeLists.txt b/examples/vSLAMexample/CMakeLists.txt deleted file mode 100644 index 57fd6bf6d..000000000 --- a/examples/vSLAMexample/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -# Build vSLAMexample - -message(STATUS "Adding Example vISAMexample") -add_executable(vISAMexample vISAMexample.cpp vSLAMutils.cpp) -target_link_libraries(vISAMexample gtsam-static) -add_dependencies(examples vISAMexample) - -message(STATUS "Adding Example vSFMexample") -add_executable(vSFMexample vSFMexample.cpp vSLAMutils.cpp) -target_link_libraries(vSFMexample gtsam-static) -add_dependencies(examples vSFMexample) - - - diff --git a/examples/vSLAMexample/Feature2D.h b/examples/vSLAMexample/Feature2D.h deleted file mode 100644 index ea0f60e74..000000000 --- a/examples/vSLAMexample/Feature2D.h +++ /dev/null @@ -1,41 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Feature2D.h - * @brief - * @author Duy-Nguyen Ta - */ - -#pragma once - -#include "gtsam/geometry/Point2.h" -#include - -struct Feature2D -{ - - gtsam::Point2 m_p; - int m_idCamera; // id of the camera pose that makes this measurement - int m_idLandmark; // id of the 3D landmark that it is associated with - - Feature2D(int idCamera, int idLandmark, gtsam::Point2 p) : - m_p(p), - m_idCamera(idCamera), - m_idLandmark(idLandmark) {} - - void print(const std::string& s = "") const { - std::cout << s << std::endl; - std::cout << "Pose id: " << m_idCamera << " -- Landmark id: " << m_idLandmark << std::endl; - m_p.print("\tMeasurement: "); - } - -}; diff --git a/examples/vSLAMexample/README b/examples/vSLAMexample/README deleted file mode 100644 index 99b10608c..000000000 --- a/examples/vSLAMexample/README +++ /dev/null @@ -1,101 +0,0 @@ -README - vSLAMexample ------------------------------------------------------- - - vSLAMexample includes 2 simple examples using GTSAM: - - vSFMexample using visualSLAM in for structure-from-motion (SFM), and - - vISAMexample using visualSLAM and ISAM for incremental SLAM updates - - The two examples use the same visual SLAM graph structure which nodes are 6d camera poses (SE3) and 3d point landmarks. Measurement factors are 2D features detected on each image, connecting its camera-pose node and the corresponding landmark nodes. There are also prior factors on each pose nodes. - -Synthesized data generation ---------------------------- -The data are generated by using Panda3D graphics engine to render a sequence of virtual scene with 7 colorful small 3d patches viewing by camera moving around. The patches' coordinates are given in "landmarks.txt" file. Centroids of those colorful features in the rendered images are detected and stored in "ttpy*.feat" files. - -Files "ttpy*.pose" contain the poses of the virtual camera that renders the scene. A *VERY IMPORTANT* note is that the values in these "ttpy*.pose" files follow Panda3D's convention for camera frame coordinate system: "z up, y view", where as in our code, we follow OpenGL's convention: "y up, -z view". Thus, we have to change it to match with our convention. Essentially, the z- and y- axes are swapped, then the z-axis is negated to stick to the right-hand rule. Please see the function "gtsam::Pose3 readPose(const char* Fn)" in "vSLAMutils.cpp" for more information. - -File "calib.txt" contains intrinsic parameters of the virtual camera. The signs are correctly adjusted to match with our projection coordinate system's convention. - -Files "measurements.txt" and "poses.txt" simulate typical input data for a structure-from-motion problem. Similarly, "measurementsISAM.txt" and "posesISAM.txt" simulate the data used in SLAM context with incremental-update using ISAM. - -Note that for SFM, the whole graph is solved as a whole batch problem, so the camera_id's corresponding to the feature files and pose files need to be specified in "measurements.txt" and "poses.txt", but they are not necessarily in order. - -On the other hand, for ISAM, we sequentially add the camera poses and features and update after every frame; so the pose files and features files in "measurementsISAM.txt" and "posesISAM.txt" need to be specified in order (time order), even though the camera id's are not necessary. - - - -Data file format ------------------------------ - -"calib.txt": ------------- -image_width image_height fx fy ox oy - - -"landmarks.txt" ------------- -N #number of landmarks -landmark_id1 x1 y1 z1 -landmark_id2 x2 y2 z2 -... -landmark_idN xN yN zN - - -"ttpy*.feat" ------------- -N #number of features -corresponding_landmark_id1 x1 y1 -corresponding_landmark_id2 x2 y2 -... -corresponding_landmark_idN xN yN - - -"ttpy*.pose" ------------- -0.939693 0.34202 0 0 --0.241845 0.664463 -0.707107 0 --0.241845 0.664463 0.707107 0 -34.202 -93.9693 100 1 - -The camera pose matrix in column order. Note that these values follows Panda3D's convention for camera coordinate frame. We have to change it to match with our convention used in the code, which follows OpenGL system. See previous section for more details. - - -Data For SFM: - -"measurements.txt" ------------- -N #number of cameras -camera_id1 featureFile1 -camera_id2 featureFile2 -... -camera_id3 featureFile3 - -"poses.txt" ------------- -N #number of cameras -camera_id1 poseFile1 -camera_id2 poseFile2 -... -camera_id3 poseFile3 - - -Data For ISAM: - -"measurementsISAM.txt" ------------- -N #number of cameras -featureFile1 -featureFile2 -... -featureFile3 - -"posesISAM.txt" ------------- -N #number of cameras -poseFile1 -poseFile2 -... -poseFile3 - - - - diff --git a/examples/vSLAMexample/vISAMexample.cpp b/examples/vSLAMexample/vISAMexample.cpp deleted file mode 100644 index 7b37a57fb..000000000 --- a/examples/vSLAMexample/vISAMexample.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 vISAMexample.cpp - * @brief An ISAM example for synthesis sequence, single camera - * @author Duy-Nguyen Ta - */ - -#include "vSLAMutils.h" -#include "Feature2D.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -using boost::shared_ptr; - -using namespace std; -using namespace gtsam; - -// Convenience for named keys -using symbol_shorthand::X; -using symbol_shorthand::L; - -/* ************************************************************************* */ -#define CALIB_FILE "calib.txt" -#define LANDMARKS_FILE "landmarks.txt" -#define POSES_FILE "poses.txt" -#define MEASUREMENTS_FILE "measurements.txt" - -// Base data folder -string g_dataFolder; - -// Store groundtruth values, read from files -shared_ptrK g_calib; -map g_landmarks; // map: -map g_poses; // map: -std::map > g_measurements; // feature sets detected at each frame - -// Noise models -SharedNoiseModel measurementSigma(noiseModel::Isotropic::Sigma(2, 5.0f)); -SharedNoiseModel poseSigma(noiseModel::Unit::Create(1)); - - -/* ************************************************************************* */ -/** - * Read all data: calibration file, landmarks, poses, and all features measurements - * Data is stored in global variables, which are used later to simulate incremental updates. - */ -void readAllDataISAM() { - g_calib = readCalibData(g_dataFolder + CALIB_FILE); - - // Read groundtruth landmarks' positions. These will be used later as intial estimates and priors for landmark nodes. - g_landmarks = readLandMarks(g_dataFolder + LANDMARKS_FILE); - - // Read groundtruth camera poses. These will be used later as intial estimates for pose nodes. - g_poses = readPoses(g_dataFolder, POSES_FILE); - - // Read all 2d measurements. Those will become factors linking their associating pose and the corresponding landmark. - g_measurements = readAllMeasurementsISAM(g_dataFolder, MEASUREMENTS_FILE); -} - -/* ************************************************************************* */ -/** - * Setup newFactors and initialValues for each new pose and set of measurements at each frame. - */ -void createNewFactors(shared_ptr& newFactors, boost::shared_ptr& initialValues, - int pose_id, const Pose3& pose, const std::vector& measurements, SharedNoiseModel measurementSigma, shared_ptrK calib) { - - // Create a graph of newFactors with new measurements - newFactors = shared_ptr (new visualSLAM::Graph()); - for (size_t i = 0; i < measurements.size(); i++) { - newFactors->addMeasurement( - measurements[i].m_p, - measurementSigma, - X(pose_id), - L(measurements[i].m_idLandmark), - calib); - } - - // ... we need priors on the new pose and all new landmarks - newFactors->addPosePrior(pose_id, pose, poseSigma); - for (size_t i = 0; i < measurements.size(); i++) { - newFactors->addPointPrior(X(measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); - } - - // Create initial values for all nodes in the newFactors - initialValues = shared_ptr (new visualSLAM::Values()); - initialValues->insert(X(pose_id), pose); - for (size_t i = 0; i < measurements.size(); i++) { - initialValues->insert(L(measurements[i].m_idLandmark), g_landmarks[measurements[i].m_idLandmark]); - } -} - -/* ************************************************************************* */ -int main(int argc, char* argv[]) { - if (argc < 2) { - cout << "Usage: vISAMexample " << endl << endl; - cout << "\tPlease specify , which contains calibration file, initial\n" - "\tlandmarks, initial poses, and feature data." << endl; - cout << "\tSample folder is in $gtsam_source_folder$/examples/Data/" << endl << endl; - cout << "Example usage: vISAMexample '$gtsam_source_folder$/examples/Data/'" << endl; - exit(0); - } - - g_dataFolder = string(argv[1]) + "/"; - readAllDataISAM(); - - // Create a NonlinearISAM which will be relinearized and reordered after every "relinearizeInterval" updates - int relinearizeInterval = 3; - NonlinearISAM<> isam(relinearizeInterval); - - // At each frame (poseId) with new camera pose and set of associated measurements, - // create a graph of new factors and update ISAM - typedef std::map > FeatureMap; - BOOST_FOREACH(const FeatureMap::value_type& features, g_measurements) { - const int poseId = features.first; - shared_ptr newFactors; - shared_ptr initialValues; - createNewFactors(newFactors, initialValues, poseId, g_poses[poseId], - features.second, measurementSigma, g_calib); - - isam.update(*newFactors, *initialValues); - Values currentEstimate = isam.estimate(); - cout << "****************************************************" << endl; - currentEstimate.print("Current estimate: "); - } - - return 1; -} -/* ************************************************************************* */ - diff --git a/examples/vSLAMexample/vSFMexample.cpp b/examples/vSLAMexample/vSFMexample.cpp deleted file mode 100644 index 66e9a475b..000000000 --- a/examples/vSLAMexample/vSFMexample.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 vSFMexample.cpp - * @brief A visual SLAM example for simulated sequence - * @author Duy-Nguyen Ta - */ - -#include "vSLAMutils.h" -#include "Feature2D.h" - -#include -#include -#include -#include -#include - -#include -using boost::shared_ptr; - -using namespace std; -using namespace gtsam; - -// Convenience for named keys -using symbol_shorthand::X; -using symbol_shorthand::L; - -/* ************************************************************************* */ -#define CALIB_FILE "calib.txt" -#define LANDMARKS_FILE "landmarks.txt" -#define POSES_FILE "poses.txt" -#define MEASUREMENTS_FILE "measurements.txt" - -// Base data folder -string g_dataFolder; - -// Store groundtruth values, read from files -shared_ptrK g_calib; -map g_landmarks; // map: -map g_poses; // map: -std::vector g_measurements; // Feature2D: {camera_id, landmark_id, 2d feature_position} - -// Noise models -SharedNoiseModel measurementSigma(noiseModel::Isotropic::Sigma(2, 5.0f)); - -/* ************************************************************************* */ -/** - * Read all data: calibration file, landmarks, poses, and all features measurements - * Data is stored in global variables. - */ -void readAllData() { - - g_calib = readCalibData(g_dataFolder + "/" + CALIB_FILE); - - // Read groundtruth landmarks' positions. These will be used later as intial estimates for landmark nodes. - g_landmarks = readLandMarks(g_dataFolder + "/" + LANDMARKS_FILE); - - // Read groundtruth camera poses. These will be used later as intial estimates for pose nodes. - g_poses = readPoses(g_dataFolder, POSES_FILE); - - // Read all 2d measurements. Those will become factors linking their associating pose and the corresponding landmark. - g_measurements = readAllMeasurements(g_dataFolder, MEASUREMENTS_FILE); -} - -/* ************************************************************************* */ -/** - * Setup vSLAM graph - * by adding and linking 2D features (measurements) detected in each captured image - * with their corresponding landmarks. - */ -visualSLAM::Graph setupGraph(std::vector& measurements, SharedNoiseModel measurementSigma, shared_ptrK calib) { - - visualSLAM::Graph g; - - cout << "Built graph: " << endl; - for (size_t i = 0; i < measurements.size(); i++) { - measurements[i].print(); - - g.addMeasurement( - measurements[i].m_p, - measurementSigma, - X(measurements[i].m_idCamera), - L(measurements[i].m_idLandmark), - calib); - } - - return g; -} - -/* ************************************************************************* */ -/** - * Create a structure of initial estimates for all nodes (landmarks and poses) in the graph. - * The returned Values structure contains all initial values for all nodes. - */ -Values initialize(std::map landmarks, std::map poses) { - - visualSLAM::Values initValues; - - // Initialize landmarks 3D positions. - for (map::iterator lmit = landmarks.begin(); lmit != landmarks.end(); lmit++) - initValues.insert(L(lmit->first), lmit->second); - - // Initialize camera poses. - for (map::iterator poseit = poses.begin(); poseit != poses.end(); poseit++) - initValues.insert(X(poseit->first), poseit->second); - - return initValues; -} - -/* ************************************************************************* */ -int main(int argc, char* argv[]) { - if (argc < 2) { - cout << "Usage: vSFMexample " << endl << endl; - cout << "\tPlease specify , which contains calibration file, initial\n" - "\tlandmarks, initial poses, and feature data." << endl; - cout << "\tSample folder is in $gtsam_source_folder$/examples/Data" << endl << endl; - cout << "Example usage: vSFMexample '$gtsam_source_folder$/examples/Data'" << endl; - exit(0); - } - - g_dataFolder = string(argv[1]) + "/"; - readAllData(); - - // Create a graph using the 2D measurements (features) and the calibration data - visualSLAM::Graph graph(setupGraph(g_measurements, measurementSigma, g_calib)); - - // Create an initial Values structure using groundtruth values as the initial estimates - Values initialEstimates(initialize(g_landmarks, g_poses)); - cout << "*******************************************************" << endl; - initialEstimates.print("INITIAL ESTIMATES: "); - - // Add prior factor for all poses in the graph - map::iterator poseit = g_poses.begin(); - for (; poseit != g_poses.end(); poseit++) - graph.addPosePrior(X(poseit->first), poseit->second, noiseModel::Unit::Create(1)); - - // Optimize the graph - cout << "*******************************************************" << endl; - LevenbergMarquardtParams params; - params.verbosityLM = LevenbergMarquardtParams::DAMPED; - visualSLAM::Values result = LevenbergMarquardtOptimizer(graph, initialEstimates, params).optimize(); - - // Print final results - cout << "*******************************************************" << endl; - result.print("FINAL RESULTS: "); - - return 0; -} -/* ************************************************************************* */ - diff --git a/examples/vSLAMexample/vSLAMutils.cpp b/examples/vSLAMexample/vSLAMutils.cpp deleted file mode 100644 index 1c3912f2d..000000000 --- a/examples/vSLAMexample/vSLAMutils.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 VSLAMutils.cpp - * @brief - * @author Duy-Nguyen Ta - */ - -#include "vSLAMutils.h" -#include -#include - -using namespace gtsam; -using namespace std; - -/* ************************************************************************* */ -std::map readLandMarks(const std::string& landmarkFile) { - ifstream file(landmarkFile.c_str()); - if (!file) { - cout << "Cannot read landmark file: " << landmarkFile << endl; - exit(0); - } - - int num; - file >> num; - std::map landmarks; - landmarks.clear(); - for (int i = 0; i> color_id >> x >> y >> z; - landmarks[color_id] = Point3(x, y, z); - } - - file.close(); - return landmarks; -} - -/* ************************************************************************* */ -gtsam::Pose3 readPose(const char* Fn) { - ifstream poseFile(Fn); - if (!poseFile) { - cout << "Cannot read pose file: " << Fn << endl; - exit(0); - } - - double v[16]; - for (int i = 0; i<16; i++) - poseFile >> v[i]; - poseFile.close(); - - Matrix T = Matrix_(4,4, v); // row order !!! - - Pose3 pose(T); - return pose; -} -/* ************************************************************************* */ -std::map readPoses(const std::string& baseFolder, const std::string& posesFn) { - ifstream posesFile((baseFolder+posesFn).c_str()); - if (!posesFile) { - cout << "Cannot read all pose file: " << posesFn << endl; - exit(0); - } - int numPoses; - posesFile >> numPoses; - map poses; - for (int i = 0; i> poseId; - - string poseFileName; - posesFile >> poseFileName; - - Pose3 pose = readPose((baseFolder+poseFileName).c_str()); - poses[poseId] = pose; - } - - return poses; -} - -/* ************************************************************************* */ -gtsam::shared_ptrK readCalibData(const std::string& calibFn) { - ifstream calibFile(calibFn.c_str()); - if (!calibFile) { - cout << "Cannot read calib file: " << calibFn << endl; - exit(0); - } - int imX, imY; - float fx, fy, ox, oy; - calibFile >> imX >> imY >> fx >> fy >> ox >> oy; - calibFile.close(); - - return shared_ptrK(new Cal3_S2(fx, fy, 0, ox, oy)); // skew factor = 0 -} - -/* ************************************************************************* */ -std::vector readFeatures(int pose_id, const char* filename) { - ifstream file(filename); - if (!file) { - cout << "Cannot read feature file: " << filename<< endl; - exit(0); - } - - int numFeatures; - file >> numFeatures ; - - std::vector vFeatures_; - for (int i = 0; i < numFeatures; i++) { - int landmark_id; double x, y; - file >> landmark_id >> x >> y; - vFeatures_.push_back(Feature2D(pose_id, landmark_id, Point2(x, y))); - } - - file.close(); - return vFeatures_; -} - -/* ************************************************************************* */ -std::vector readAllMeasurements(const std::string& baseFolder, const std::string& measurementsFn) { - ifstream measurementsFile((baseFolder+measurementsFn).c_str()); - if (!measurementsFile) { - cout << "Cannot read all pose file: " << baseFolder+measurementsFn << endl; - exit(0); - } - int numPoses; - measurementsFile >> numPoses; - - vector allFeatures; - allFeatures.clear(); - - for (int i = 0; i> poseId; - - string featureFileName; - measurementsFile >> featureFileName; - vector features = readFeatures(poseId, (baseFolder+featureFileName).c_str()); - allFeatures.insert( allFeatures.end(), features.begin(), features.end() ); - } - - return allFeatures; -} - -/* ************************************************************************* */ -std::map > readAllMeasurementsISAM(const std::string& baseFolder, const std::string& measurementsFn) { - ifstream measurementsFile((baseFolder+measurementsFn).c_str()); - if (!measurementsFile) { - cout << "Cannot read all pose file: " << baseFolder+measurementsFn << endl; - exit(0); - } - int numPoses; - measurementsFile >> numPoses; - - std::map > allFeatures; - - for (int i = 0; i> poseId; - - string featureFileName; - measurementsFile >> featureFileName; - vector features = readFeatures(poseId, (baseFolder+featureFileName).c_str()); - allFeatures[poseId] = features; - } - - return allFeatures; -} diff --git a/examples/vSLAMexample/vSLAMutils.h b/examples/vSLAMexample/vSLAMutils.h deleted file mode 100644 index 2365ef35c..000000000 --- a/examples/vSLAMexample/vSLAMutils.h +++ /dev/null @@ -1,36 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Feature2D.cpp - * @brief - * @author Duy-Nguyen Ta - */ - -#pragma once - -#include "Feature2D.h" -#include "gtsam/geometry/Pose3.h" -#include "gtsam/geometry/Point3.h" -#include "gtsam/geometry/Cal3_S2.h" -#include -#include - -std::map readLandMarks(const std::string& landmarkFile); - -gtsam::Pose3 readPose(const char* poseFn); -std::map readPoses(const std::string& baseFolder, const std::string& posesFN); - -gtsam::shared_ptrK readCalibData(const std::string& calibFn); - -std::vector readFeatureFile(const char* filename); -std::vector readAllMeasurements(const std::string& baseFolder, const std::string& measurementsFn); -std::map > readAllMeasurementsISAM(const std::string& baseFolder, const std::string& measurementsFn); From d40d8879ae8b7f5afe7125877df1a315bcba3699 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 4 Jun 2012 12:34:58 +0000 Subject: [PATCH 127/914] removed vSLAMExample directory reference --- examples/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 116379489..57d540828 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -18,4 +18,3 @@ foreach(example_src ${example_srcs} ) add_custom_target(${example_bin}.run ${EXECUTABLE_OUTPUT_PATH}${example_bin} ${ARGN}) endforeach(example_src) -add_subdirectory(vSLAMexample) From 872c678f024d137c4e5d30bd6f6959eac0aca81d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 13:31:18 +0000 Subject: [PATCH 128/914] turn off undocumented warnings --- Doxyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doxyfile b/Doxyfile index d7dd6adff..2d1dab711 100644 --- a/Doxyfile +++ b/Doxyfile @@ -597,7 +597,7 @@ WARNINGS = YES # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. -WARN_IF_UNDOCUMENTED = YES +WARN_IF_UNDOCUMENTED = NO # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some From 695f2756db632d39254a6b15e248182c25fd4473 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 4 Jun 2012 13:44:02 +0000 Subject: [PATCH 129/914] Build scripts --- CMakeLists.txt | 5 +++-- CppUnitLite/CMakeLists.txt | 2 ++ gtsam/CMakeLists.txt | 11 +++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7be750b02..335fc76c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,9 +130,10 @@ if (GTSAM_BUILD_UNSTABLE) add_subdirectory(gtsam_unstable) endif(GTSAM_BUILD_UNSTABLE) -# Make config file +# Make config files include(GtsamMakeConfigFile) -GtsamMakeConfigFile(gtsam) +GtsamMakeConfigFile(GTSAM gtsam-static) +GtsamMakeConfigFile(CppUnitLite CppUnitLite) # Set up CPack set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM") diff --git a/CppUnitLite/CMakeLists.txt b/CppUnitLite/CMakeLists.txt index 642e8e462..286a39258 100644 --- a/CppUnitLite/CMakeLists.txt +++ b/CppUnitLite/CMakeLists.txt @@ -5,6 +5,8 @@ file(GLOB cppunitlite_src "*.cpp") add_library(CppUnitLite STATIC ${cppunitlite_src}) +gtsam_assign_source_folders("${cppunitlite_headers};${cppunitlite_src}") # MSVC project structure + option(GTSAM_INSTALL_CPPUNITLITE "Enable/Disable installation of CppUnitLite library" ON) if (GTSAM_INSTALL_CPPUNITLITE) install(FILES ${cppunitlite_headers} DESTINATION include/CppUnitLite) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 8dd9a72ce..80c57c15c 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -19,9 +19,10 @@ add_subdirectory(3rdparty) # build convenience library set (3rdparty_srcs - 3rdparty/CCOLAMD/Source/ccolamd.c - 3rdparty/CCOLAMD/Source/ccolamd_global.c - 3rdparty/UFconfig/UFconfig.c) + ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/CCOLAMD/Source/ccolamd.c + ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/CCOLAMD/Source/ccolamd_global.c + ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/UFconfig/UFconfig.c) +gtsam_assign_source_folders("${3rdparty_srcs}") # Create MSVC structure if (GTSAM_BUILD_CONVENIENCE_LIBRARIES) message(STATUS "Building Convenience Library: ccolamd") add_library(ccolamd STATIC ${3rdparty_srcs}) @@ -48,6 +49,7 @@ foreach(subdir ${gtsam_subdirs}) file(GLOB subdir_srcs "${subdir}/*.cpp") file(GLOB subdir_headers "${subdir}/*.h") set(subdir_srcs ${subdir_srcs} ${subdir_headers}) # Include header files so they show up in Visual Studio + gtsam_assign_source_folders("${subdir_srcs}") # Create MSVC structure list(REMOVE_ITEM subdir_srcs ${excluded_sources}) set(${subdir}_srcs ${subdir_srcs}) if (GTSAM_BUILD_CONVENIENCE_LIBRARIES) @@ -73,9 +75,6 @@ set(gtsam_srcs ${slam_srcs} ) -# Create MSVC structure -gtsam_assign_all_source_folders() - # Versions set(gtsam_version ${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}) set(gtsam_soversion ${GTSAM_VERSION_MAJOR}) From ec29518456e95b96f9ff5520eb222f579ab07183 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 4 Jun 2012 13:44:19 +0000 Subject: [PATCH 130/914] Header files --- gtsam/base/LieVector.cpp | 2 +- gtsam/base/Vector.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/base/LieVector.cpp b/gtsam/base/LieVector.cpp index 876c8fa6e..d5ae5d504 100644 --- a/gtsam/base/LieVector.cpp +++ b/gtsam/base/LieVector.cpp @@ -15,7 +15,7 @@ * @author Alex Cunningham */ -#include +#include #include using namespace std; diff --git a/gtsam/base/Vector.h b/gtsam/base/Vector.h index 40fed145c..6019bbd33 100644 --- a/gtsam/base/Vector.h +++ b/gtsam/base/Vector.h @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include /** From 318dd96dfb483aa4c4f8ddf315dc26ad9a40408b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 4 Jun 2012 13:44:21 +0000 Subject: [PATCH 131/914] Matrix stream input operator --- gtsam/base/Matrix.cpp | 23 +++++++++++++++++++++++ gtsam/base/Matrix.h | 7 +++++++ 2 files changed, 30 insertions(+) diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index 320dbe896..2d32ccc04 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -235,6 +235,29 @@ void save(const Matrix& A, const string &s, const string& filename) { stream.close(); } +/* ************************************************************************* */ +//istream& operator>>(istream& inputStream, Matrix& destinationMatrix) { +// destinationMatrix.resize(0,0); +// string line; +// bool first = true; +// while(getline(inputStream, line)) { +// // Read coefficients from file +// vector coeffs; +// std::copy(istream_iterator(stringstream(line)), istream_iterator(), coeffs.end()); +// if(first) { +// destinationMatrix.resize(1, +// } +// if(coeffs.size() != dimLatent()) { +// cout << "Error reading motion file, latent variable dimension does not match file" << endl; +// exit(1); +// } +// +// // Copy coefficients to alignment matrix +// alignment_.conservativeResize(alignment_.rows() + 1, dimLatent()); +// alignment_.row(alignment_.rows() - 1) = Eigen::Map(&coeffs[0], dimLatent()).transpose(); +// } +//} + /* ************************************************************************* */ void insertSub(Matrix& fullMatrix, const Matrix& subMatrix, size_t i, size_t j) { fullMatrix.block(i, j, subMatrix.rows(), subMatrix.cols()) = subMatrix; diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index 9093fb99d..553fb5b89 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -183,6 +183,13 @@ void print(const Matrix& A, const std::string& s = "", std::ostream& stream = st */ void save(const Matrix& A, const std::string &s, const std::string& filename); +/** + * Read a matrix from an input stream, such as a file. Entries can be either + * tab-, space-, or comma-separated, similar to the format read by the MATLAB + * dlmread command. + */ +//istream& operator>>(istream& inputStream, Matrix& destinationMatrix); + /** * extract submatrix, slice semantics, i.e. range = [i1,i2[ excluding i2 * @param A matrix From 2f9ed9abf2f1f1afaa42b7835ba70dfba96c8578 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 14:12:51 +0000 Subject: [PATCH 132/914] Changed data install path for toolbox --- wrap/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 0ed4cc903..16238950a 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -77,7 +77,7 @@ if (GTSAM_INSTALL_MATLAB_TOOLBOX) set(data_excludes "${CMAKE_SOURCE_DIR}/examples/Data/.svn") file(GLOB matlab_examples_data "${CMAKE_SOURCE_DIR}/examples/Data/*.*") list(REMOVE_ITEM matlab_examples_data ${data_excludes}) - install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples/Data) + install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) endif (GTSAM_INSTALL_MATLAB_EXAMPLES) # Tests From e1725fb8e308afe98e41d2c2c3a310a6ab33a97b Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 15:33:16 +0000 Subject: [PATCH 133/914] Fleshed out support for building MEX binaries during gtsam build --- .cproject | 52 +++++++++++++++++++++++++---------- CMakeLists.txt | 10 +++++-- gtsam.h | 4 +-- gtsam_unstable/CMakeLists.txt | 17 ++++++++---- wrap/CMakeLists.txt | 30 +++++++++++++------- 5 files changed, 79 insertions(+), 34 deletions(-) diff --git a/.cproject b/.cproject index 1f29f86b7..9114e4159 100644 --- a/.cproject +++ b/.cproject @@ -1653,10 +1653,10 @@ true true - + make - -j5 - PlanarSLAMExample.run + -j2 + PlanarSLAMExample_easy.run true true true @@ -1685,10 +1685,10 @@ true true - + make - -j5 - PlanarSLAMExample_selfcontained.run + -j2 + PlanarSLAMSelfContained_advanced.run true true true @@ -1701,18 +1701,18 @@ true true - + make - -j5 - Pose2SLAMExample.run + -j2 + Pose2SLAMExample_easy.run true true true - + make - -j5 - Pose2SLAMwSPCG.run + -j2 + Pose2SLAMwSPCG_easy.run true true true @@ -1741,10 +1741,10 @@ true true - + make -j5 - Pose2SLAMExample_graph.run + Pose2SLAMwSPCG_advanced.run true true true @@ -2152,6 +2152,30 @@ true true + + make + -j5 + wrap_gtsam_build + true + true + true + + + make + -j5 + wrap_gtsam_unstable_build + true + true + true + + + make + -j5 + wrap_gtsam_unstable + true + true + true + make -j5 diff --git a/CMakeLists.txt b/CMakeLists.txt index 7819cfdc8..c0f273030 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,8 +61,12 @@ option(GTSAM_INSTALL_MATLAB_EXAMPLES "Enable/Disable installation of matlab option(GTSAM_INSTALL_MATLAB_TESTS "Enable/Disable installation of matlab tests" ON) option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility" ON) -# Experimental - features disabled by default -option(GTSAM_ENABLE_BUILD_MEX_BINARIES "Enable/Disable building of matlab mex files" OFF) +# TODO: Check for matlab mex binary before handling building of binaries + +# Flags for building/installing mex files +option(GTSAM_ENABLE_BUILD_MEX_BINARIES "Enable/Disable building of matlab mex files" OFF) +option(GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL "Enable/Disable adding building of mex files to ALL target" OFF) +set(GTSAM_BUILD_MEX_BINARY_FLAGS "-j2" CACHE STRING "Flags for running make on toolbox MEX files") # Flags for choosing default packaging tools set(CPACK_SOURCE_GENERATOR "TGZ" CACHE STRING "CPack Default Source Generator") @@ -184,6 +188,8 @@ print_config_flag(${GTSAM_INSTALL_MATLAB_TOOLBOX} "Install matlab toolbox print_config_flag(${GTSAM_INSTALL_MATLAB_EXAMPLES} "Install matlab examples ") print_config_flag(${GTSAM_INSTALL_MATLAB_TESTS} "Install matlab tests ") print_config_flag(${GTSAM_INSTALL_WRAP} "Install wrap utility ") +print_config_flag(${GTSAM_ENABLE_BUILD_MEX_BINARIES} "Build MEX binaries ") +print_config_flag(${GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL} "Build MEX binaries on ALL target ") message(STATUS "===============================================================") # Include CPack *after* all flags diff --git a/gtsam.h b/gtsam.h index 2015705ae..f9062cd9e 100644 --- a/gtsam.h +++ b/gtsam.h @@ -201,7 +201,7 @@ class Pose3 { Pose3(); Pose3(const gtsam::Pose3& pose); Pose3(const gtsam::Rot3& r, const gtsam::Point3& t); - Pose3(const gtsam::Pose2& pose2); + Pose3(const gtsam::Pose2& pose2); // FIXME: shadows Pose3(Pose3 pose) Pose3(Matrix t); // Testable @@ -239,7 +239,7 @@ class Pose3 { double y() const; double z() const; Matrix matrix() const; - gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; + gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; // FIXME: shadows other transform_to() double range(const gtsam::Point3& point); // double range(const gtsam::Pose3& pose); }; diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index b50667f48..4b8b4ac11 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -91,14 +91,19 @@ if (GTSAM_BUILD_WRAP) DEPENDS wrap) # Build command - # Experimental: requires matlab to be on your path if (GTSAM_ENABLE_BUILD_MEX_BINARIES) # Actually compile the mex files when building the library - set(TOOLBOX_MAKE_FLAGS "-j2") - add_custom_target(wrap_gtsam_unstable_build - COMMAND make ${TOOLBOX_MAKE_FLAGS} - WORKING_DIRECTORY ${toolbox_path} - DEPENDS wrap_gtsam_unstable) + if (GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL) + add_custom_target(wrap_gtsam_unstable_build ALL + COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} + WORKING_DIRECTORY ${toolbox_path} + DEPENDS wrap_gtsam_unstable) + else() + add_custom_target(wrap_gtsam_unstable_build + COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} + WORKING_DIRECTORY ${toolbox_path} + DEPENDS wrap_gtsam_unstable) + endif() endif (GTSAM_ENABLE_BUILD_MEX_BINARIES) if (GTSAM_INSTALL_MATLAB_TOOLBOX) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 16238950a..6049b8a81 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -30,7 +30,7 @@ endif(GTSAM_BUILD_TESTS) # toolboxPath : the directory in which to generate the wrappers # [mexFlags] : extra flags for the mex command -set(mexFlags "-I${Boost_INCLUDE_DIR} -I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/gtsam -I${CMAKE_INSTALL_PREFIX}/include/gtsam/base -I${CMAKE_INSTALL_PREFIX}/include/gtsam/geometry -I${CMAKE_INSTALL_PREFIX}/include/gtsam/linear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/nonlinear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/slam -L${CMAKE_INSTALL_PREFIX}/lib -lgtsam") +set(mexFlags "-I${Boost_INCLUDE_DIR} -I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/gtsam -I${CMAKE_INSTALL_PREFIX}/include/gtsam/base -I${CMAKE_INSTALL_PREFIX}/include/gtsam/geometry -I${CMAKE_INSTALL_PREFIX}/include/gtsam/linear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/discrete -I${CMAKE_INSTALL_PREFIX}/include/gtsam/inference -I${CMAKE_INSTALL_PREFIX}/include/gtsam/nonlinear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/slam -L${CMAKE_INSTALL_PREFIX}/lib -lgtsam") set(toolbox_path ${CMAKE_BINARY_DIR}/wrap/gtsam) set(moduleName gtsam) @@ -48,20 +48,29 @@ add_custom_target(wrap_gtsam ALL COMMAND DEPENDS wrap) # Build command -# Experimental: requires matlab to be on your path if (GTSAM_ENABLE_BUILD_MEX_BINARIES) # Actually compile the mex files when building the library - set(TOOLBOX_MAKE_FLAGS "-j2") - add_custom_target(wrap_gtsam_build - COMMAND make ${TOOLBOX_MAKE_FLAGS} - WORKING_DIRECTORY ${toolbox_path} - DEPENDS wrap_gtsam) + # TODO: pass correct make flags from parent process + message(STATUS "Building Matlab MEX binaries for toolbox with flags ${GTSAM_BUILD_MEX_BINARY_FLAGS}") + if (GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL) + add_custom_target(wrap_gtsam_build ALL + COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} + WORKING_DIRECTORY ${toolbox_path} + DEPENDS wrap_gtsam) + else() + add_custom_target(wrap_gtsam_build + COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} + WORKING_DIRECTORY ${toolbox_path} + DEPENDS wrap_gtsam) + endif() endif (GTSAM_ENABLE_BUILD_MEX_BINARIES) set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTRING "Path to install matlab toolbox") if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Primary toolbox files + # Note that we copy the entire contents of the folder blindly - this is because + # the generated files won't exist at configuration time message(STATUS "Installing Matlab Toolbox to ${GTSAM_TOOLBOX_INSTALL_PATH}") install(DIRECTORY DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}) # make an empty folder # exploit need for trailing slash to specify a full folder, rather than just its contents to copy @@ -74,9 +83,10 @@ if (GTSAM_INSTALL_MATLAB_TOOLBOX) install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) message(STATUS "Installing Matlab Toolbox Examples (Data)") - set(data_excludes "${CMAKE_SOURCE_DIR}/examples/Data/.svn") - file(GLOB matlab_examples_data "${CMAKE_SOURCE_DIR}/examples/Data/*.*") - list(REMOVE_ITEM matlab_examples_data ${data_excludes}) + # Data files: *.graph and *.txt + file(GLOB matlab_examples_data_graph "${CMAKE_SOURCE_DIR}/examples/Data/*.graph") + file(GLOB matlab_examples_data_txt "${CMAKE_SOURCE_DIR}/examples/Data/*.txt") + set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) endif (GTSAM_INSTALL_MATLAB_EXAMPLES) From f7d7c5b9c8e5fc5eb4ab26a999a0bbd27d4eae05 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Mon, 4 Jun 2012 16:05:13 +0000 Subject: [PATCH 134/914] change filename for visualSLAM examples --- .../{VisualSLAMwISAM2Example.cpp => VisualISAMExample.cpp} | 4 ++-- examples/{VisualSLAMExampleData.h => VisualSLAMData.h} | 6 +++--- .../{VisualSLAMforSFMExample.cpp => VisualSLAMExample.cpp} | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) rename examples/{VisualSLAMwISAM2Example.cpp => VisualISAMExample.cpp} (98%) rename examples/{VisualSLAMExampleData.h => VisualSLAMData.h} (97%) rename examples/{VisualSLAMforSFMExample.cpp => VisualSLAMExample.cpp} (96%) diff --git a/examples/VisualSLAMwISAM2Example.cpp b/examples/VisualISAMExample.cpp similarity index 98% rename from examples/VisualSLAMwISAM2Example.cpp rename to examples/VisualISAMExample.cpp index 1ec43136f..682ca1743 100644 --- a/examples/VisualSLAMwISAM2Example.cpp +++ b/examples/VisualISAMExample.cpp @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file VisualSLAMwISAM2Example.cpp + * @file VisualISAMExample.cpp * @brief An ISAM example for synthesis sequence, single camera * @author Duy-Nguyen Ta */ @@ -19,7 +19,7 @@ #include #include #include -#include "VisualSLAMExampleData.h" +#include "VisualSLAMData.h" using namespace std; using namespace gtsam; diff --git a/examples/VisualSLAMExampleData.h b/examples/VisualSLAMData.h similarity index 97% rename from examples/VisualSLAMExampleData.h rename to examples/VisualSLAMData.h index f0ee4d2b5..1aa79324e 100644 --- a/examples/VisualSLAMExampleData.h +++ b/examples/VisualSLAMData.h @@ -10,8 +10,8 @@ * -------------------------------------------------------------------------- */ /** - * @file VisualSLAMSimulatedData.cpp - * @brief Generate ground-truth simulated data for VisualSLAM examples (SFM and ISAM2) + * @file VisualSLAMData.cpp + * @brief Generate ground-truth simulated data for VisualSLAM examples * @author Duy-Nguyen Ta */ @@ -23,7 +23,7 @@ /* ************************************************************************* */ /** - * Simulated data for the example: + * Simulated data for the visual SLAM examples: * - 8 Landmarks: (10,10,10) (-10,10,10) (-10,-10,10) (10,-10,10) * (10,10,-10) (-10,10,-10) (-10,-10,-10) (10,-10,-10) * - n 90-deg-FoV cameras with the same calibration parameters: diff --git a/examples/VisualSLAMforSFMExample.cpp b/examples/VisualSLAMExample.cpp similarity index 96% rename from examples/VisualSLAMforSFMExample.cpp rename to examples/VisualSLAMExample.cpp index 17f457908..0dcd970e4 100644 --- a/examples/VisualSLAMforSFMExample.cpp +++ b/examples/VisualSLAMExample.cpp @@ -10,7 +10,7 @@ * -------------------------------------------------------------------------- */ /** - * @file VisualSLAMforSFMExample.cpp + * @file VisualSLAMExample.cpp * @brief A visualSLAM example for the structure-from-motion problem on a simulated dataset * @author Duy-Nguyen Ta */ @@ -19,7 +19,7 @@ #include #include #include -#include "VisualSLAMExampleData.h" +#include "VisualSLAMData.h" using namespace std; using namespace gtsam; From 74322b076408deb26894441ce6f352b758598714 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Mon, 4 Jun 2012 17:23:45 +0000 Subject: [PATCH 135/914] remove the optional --- examples/Pose2SLAMwSPCG.cpp | 1 - .../linear/IterativeOptimizationParameters.h | 12 ++++++++---- gtsam/linear/IterativeSolver.h | 13 +++++-------- gtsam/linear/SimpleSPCGSolver.cpp | 19 ++++++++++--------- gtsam/linear/SimpleSPCGSolver.h | 2 +- .../nonlinear/LevenbergMarquardtOptimizer.cpp | 3 ++- .../SuccessiveLinearizationOptimizer.h | 4 ++-- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index c5c2efc66..46a3787f2 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -68,7 +68,6 @@ int main(void) { LevenbergMarquardtParams param; param.linearSolverType = SuccessiveLinearizationParams::CG; param.iterativeParams = boost::make_shared(); - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, param); Values result = optimizer.optimize(); cout << "final error = " << graph.error(result) << endl; diff --git a/gtsam/linear/IterativeOptimizationParameters.h b/gtsam/linear/IterativeOptimizationParameters.h index f6b1877ce..88303fa40 100644 --- a/gtsam/linear/IterativeOptimizationParameters.h +++ b/gtsam/linear/IterativeOptimizationParameters.h @@ -113,7 +113,9 @@ struct PreconditionerParameters { std::cout << "PreconditionerParameters: " << "kernel = " << kernelStr[kernel_] - << ", type = " << typeStr[type_] << std::endl; + << ", type = " << typeStr[type_] + << ", verbosity = " << verbosity_ + << std::endl; combinatorial_.print(); } }; @@ -167,6 +169,7 @@ struct ConjugateGradientParameters { << ", eps_rel = " << epsilon_rel_ << ", eps_abs = " << epsilon_abs_ << ", degree = " << degree_ + << ", verbosity = " << verbosity_ << std::endl; } }; @@ -180,8 +183,8 @@ public: PreconditionerParameters preconditioner_; ConjugateGradientParameters cg_; - enum Kernel { PCG = 0, LSPCG } kernel_ ; /* Iterative Method Kernel */ - enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ + enum Kernel { PCG = 0, LSPCG = 1 } kernel_ ; ///< Iterative Method Kernel + enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; ///< Verbosity public: @@ -221,7 +224,8 @@ public: const std::string kernelStr[2] = {"pcg", "lspcg"}; std::cout << s << std::endl << "IterativeOptimizationParameters: " - << "kernel = " << kernelStr[kernel_] << std::endl; + << "kernel = " << kernelStr[kernel_] + << ", verbosity = " << verbosity_ << std::endl; cg_.print(); preconditioner_.print(); diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 9b07d8e07..58e83d595 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -11,9 +11,8 @@ #pragma once -#include #include -#include +#include namespace gtsam { @@ -21,25 +20,23 @@ class IterativeSolver { public: - typedef boost::shared_ptr shared_ptr; typedef IterativeOptimizationParameters Parameters; protected: - Parameters::shared_ptr parameters_ ; + Parameters parameters_ ; public: - IterativeSolver(): parameters_(new Parameters()) {} + IterativeSolver(): parameters_() {} IterativeSolver(const IterativeSolver &solver) : parameters_(solver.parameters_) {} - IterativeSolver(const Parameters::shared_ptr& parameters) : parameters_(parameters) {} - IterativeSolver(const Parameters ¶meters) : parameters_(new Parameters(parameters)) {} + IterativeSolver(const Parameters ¶meters) : parameters_(parameters) {} virtual ~IterativeSolver() {} virtual VectorValues::shared_ptr optimize () = 0; - inline Parameters::shared_ptr parameters() { return parameters_ ; } + inline const Parameters& parameters() const { return parameters_ ; } }; } diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index e7cef9e64..ae7c9581c 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -42,7 +42,7 @@ std::vector extractColSpec_(const FactorGraph& gfg, cons return spec; } -SimpleSPCGSolver::SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters::shared_ptr ¶meters) +SimpleSPCGSolver::SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters) : Base(parameters) { std::vector colSpec = extractColSpec_(gfg, VariableIndex(gfg)); @@ -97,13 +97,14 @@ VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial double gamma = s.vector().squaredNorm(), new_gamma = 0.0, alpha = 0.0, beta = 0.0 ; const double threshold = - ::max(parameters_->epsilon_abs(), - parameters_->epsilon() * parameters_->epsilon() * gamma); - const size_t iMaxIterations = parameters_->maxIterations(); + ::max(parameters_.epsilon_abs(), + parameters_.epsilon() * parameters_.epsilon() * gamma); + const size_t iMaxIterations = parameters_.maxIterations(); + const ConjugateGradientParameters::Verbosity verbosity = parameters_.cg_.verbosity(); - if ( parameters_->verbosity() >= IterativeOptimizationParameters::ERROR ) - cout << "[SimpleSPCGSolver] epsilon = " << parameters_->epsilon() - << ", max = " << parameters_->maxIterations() + if ( verbosity >= ConjugateGradientParameters::ERROR ) + cout << "[SimpleSPCGSolver] epsilon = " << parameters_.epsilon() + << ", max = " << parameters_.maxIterations() << ", ||r0|| = " << std::sqrt(gamma) << ", threshold = " << threshold << std::endl; @@ -120,14 +121,14 @@ VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial p.vector() = s.vector() + beta * p.vector(); gamma = new_gamma ; - if ( parameters_->verbosity() >= IterativeOptimizationParameters::ERROR) { + if ( verbosity >= ConjugateGradientParameters::ERROR) { cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << endl; } if ( gamma < threshold ) break ; } // k - if ( parameters_->verbosity() >= IterativeOptimizationParameters::ERROR ) + if ( verbosity >= ConjugateGradientParameters::ERROR ) cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << endl; /* transform y back to x */ diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h index 04729fc1a..570169e7b 100644 --- a/gtsam/linear/SimpleSPCGSolver.h +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -55,7 +55,7 @@ protected: public: - SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters::shared_ptr ¶meters); + SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); virtual ~SimpleSPCGSolver() {} virtual VectorValues::shared_ptr optimize () {return optimize(*y0_);} diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index e1133d86e..17e92c466 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -72,7 +72,8 @@ void LevenbergMarquardtOptimizer::iterate() { delta = gtsam::optimize(*EliminationTree::Create(dampedSystem)->eliminate(params_.getEliminationFunction())); } else if ( params_.isCG() ) { - SimpleSPCGSolver solver(dampedSystem, *params_.iterativeParams); + IterativeOptimizationParameters::shared_ptr params(!params_.iterativeParams ? boost::make_shared() : params_.iterativeParams); + SimpleSPCGSolver solver(dampedSystem, *params); delta = *solver.optimize(); } else { diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index ea54dd344..156440f06 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -31,13 +31,13 @@ public: MULTIFRONTAL_QR, SEQUENTIAL_CHOLESKY, SEQUENTIAL_QR, - CHOLMOD, /* Experimental Flag */ CG, /* Experimental Flag */ + CHOLMOD, /* Experimental Flag */ }; LinearSolverType linearSolverType; ///< The type of linear solver to use in the nonlinear optimizer boost::optional ordering; ///< The variable elimination ordering, or empty to use COLAMD (default: empty) - boost::optional iterativeParams; ///< The container for iterativeOptimization parameters. + IterativeOptimizationParameters::shared_ptr iterativeParams; ///< The container for iterativeOptimization parameters. used in CG Solvers. SuccessiveLinearizationParams() : linearSolverType(MULTIFRONTAL_CHOLESKY) {} From fc437cc6416810ccd838442621440bfa5bbdd0e5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 18:23:18 +0000 Subject: [PATCH 136/914] Moved matlab wrapped PoseRTV into the gtsam namespace --- gtsam_unstable/gtsam_unstable.h | 49 +++++++++++++++++---------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index 376706e7f..91377da8c 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -2,15 +2,14 @@ * Matlab toolbox interface definition for gtsam_unstable */ -// Most things are in the gtsam namespace -using namespace gtsam; - // specify the classes from gtsam we are using class gtsam::Point3; class gtsam::Rot3; class gtsam::Pose3; class gtsam::SharedNoiseModel; +namespace gtsam { + #include class PoseRTV { PoseRTV(); @@ -22,7 +21,7 @@ class PoseRTV { PoseRTV(double roll, double pitch, double yaw, double x, double y, double z, double vx, double vy, double vz); // testable - bool equals(const PoseRTV& other, double tol) const; + bool equals(const gtsam::PoseRTV& other, double tol) const; void print(string s) const; // access @@ -39,27 +38,29 @@ class PoseRTV { // manifold/Lie static size_t Dim(); size_t dim() const; - PoseRTV retract(Vector v) const; - Vector localCoordinates(const PoseRTV& p) const; - static PoseRTV Expmap(Vector v); - static Vector Logmap(const PoseRTV& p); - PoseRTV inverse() const; - PoseRTV compose(const PoseRTV& p) const; - PoseRTV between(const PoseRTV& p) const; + gtsam::PoseRTV retract(Vector v) const; + Vector localCoordinates(const gtsam::PoseRTV& p) const; + static gtsam::PoseRTV Expmap(Vector v); + static Vector Logmap(const gtsam::PoseRTV& p); + gtsam::PoseRTV inverse() const; + gtsam::PoseRTV compose(const gtsam::PoseRTV& p) const; + gtsam::PoseRTV between(const gtsam::PoseRTV& p) const; // measurement - double range(const PoseRTV& other) const; - PoseRTV transformed_from(const gtsam::Pose3& trans) const; + double range(const gtsam::PoseRTV& other) const; + gtsam::PoseRTV transformed_from(const gtsam::Pose3& trans) const; // IMU/dynamics - PoseRTV planarDynamics(double vel_rate, double heading_rate, double max_accel, double dt) const; - PoseRTV flyingDynamics(double pitch_rate, double heading_rate, double lift_control, double dt) const; - PoseRTV generalDynamics(Vector accel, Vector gyro, double dt) const; - Vector imuPrediction(const PoseRTV& x2, double dt) const; - gtsam::Point3 translationIntegration(const PoseRTV& x2, double dt) const; - Vector translationIntegrationVec(const PoseRTV& x2, double dt) const; + gtsam::PoseRTV planarDynamics(double vel_rate, double heading_rate, double max_accel, double dt) const; + gtsam::PoseRTV flyingDynamics(double pitch_rate, double heading_rate, double lift_control, double dt) const; + gtsam::PoseRTV generalDynamics(Vector accel, Vector gyro, double dt) const; + Vector imuPrediction(const gtsam::PoseRTV& x2, double dt) const; + gtsam::Point3 translationIntegration(const gtsam::PoseRTV& x2, double dt) const; + Vector translationIntegrationVec(const gtsam::PoseRTV& x2, double dt) const; }; +}///\namespace gtsam + #include namespace imu { @@ -67,8 +68,8 @@ class Values { Values(); void print(string s) const; - void insertPose(size_t key, const PoseRTV& pose); - PoseRTV pose(size_t key) const; + void insertPose(size_t key, const gtsam::PoseRTV& pose); + gtsam::PoseRTV pose(size_t key) const; }; class Graph { @@ -76,8 +77,8 @@ class Graph { void print(string s) const; // prior factors - void addPrior(size_t key, const PoseRTV& pose, const gtsam::SharedNoiseModel& noiseModel); - void addConstraint(size_t key, const PoseRTV& pose); + void addPrior(size_t key, const gtsam::PoseRTV& pose, const gtsam::SharedNoiseModel& noiseModel); + void addConstraint(size_t key, const gtsam::PoseRTV& pose); void addHeightPrior(size_t key, double z, const gtsam::SharedNoiseModel& noiseModel); // inertial factors @@ -86,7 +87,7 @@ class Graph { void addVelocityConstraint(size_t key1, size_t key2, double dt, const gtsam::SharedNoiseModel& noiseModel); // other measurements - void addBetween(size_t key1, size_t key2, const PoseRTV& z, const gtsam::SharedNoiseModel& noiseModel); + void addBetween(size_t key1, size_t key2, const gtsam::PoseRTV& z, const gtsam::SharedNoiseModel& noiseModel); void addRange(size_t key1, size_t key2, double z, const gtsam::SharedNoiseModel& noiseModel); // optimization From 6b1e862688df5494e22588d45bca85ef714a8624 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 4 Jun 2012 18:46:05 +0000 Subject: [PATCH 137/914] Fix errors --- gtsam/base/tests/timeVirtual.cpp | 8 ++++---- gtsam/base/types.h | 6 ++++++ gtsam/geometry/StereoPoint2.h | 10 +++++----- tests/testGraph.cpp | 2 +- tests/timeMultifrontalOnDataset.cpp | 2 +- tests/timeSequentialOnDataset.cpp | 2 +- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/gtsam/base/tests/timeVirtual.cpp b/gtsam/base/tests/timeVirtual.cpp index a61ce7b77..697a219b1 100644 --- a/gtsam/base/tests/timeVirtual.cpp +++ b/gtsam/base/tests/timeVirtual.cpp @@ -87,13 +87,13 @@ int main(int argc, char *argv[]) { tic_("shared plain alloc, dealloc"); for(size_t i=0; i obj(new Plain(i)); + boost::shared_ptr obj(new Plain(i)); } toc_("shared plain alloc, dealloc"); tic_("shared virtual alloc, dealloc"); for(size_t i=0; i obj(new Virtual(i)); + boost::shared_ptr obj(new Virtual(i)); } toc_("shared virtual alloc, dealloc"); @@ -130,14 +130,14 @@ int main(int argc, char *argv[]) { tic_("shared plain alloc, dealloc, call"); for(size_t i=0; i obj(new Plain(i)); + boost::shared_ptr obj(new Plain(i)); obj->setData(i+1); } toc_("shared plain alloc, dealloc, call"); tic_("shared virtual alloc, dealloc, call"); for(size_t i=0; i obj(new Virtual(i)); + boost::shared_ptr obj(new Virtual(i)); obj->setData(i+1); } toc_("shared virtual alloc, dealloc, call"); diff --git a/gtsam/base/types.h b/gtsam/base/types.h index e9264d516..2490a0cde 100644 --- a/gtsam/base/types.h +++ b/gtsam/base/types.h @@ -82,6 +82,12 @@ using boost::math::isinf; #ifndef M_PI #define M_PI (boost::math::constants::pi()) #endif +#ifndef M_PI_2 +#define M_PI_2 (boost::math::constants::pi() / 2.0) +#endif +#ifndef M_PI_4 +#define M_PI_4 (boost::math::constants::pi() / 4.0) +#endif #endif diff --git a/gtsam/geometry/StereoPoint2.h b/gtsam/geometry/StereoPoint2.h index 43701e4e8..022296c21 100644 --- a/gtsam/geometry/StereoPoint2.h +++ b/gtsam/geometry/StereoPoint2.h @@ -119,6 +119,11 @@ namespace gtsam { return p.vector(); } + /** The difference between another point and this point */ + inline StereoPoint2 between(const StereoPoint2& p2) const { + return gtsam::between_default(*this, p2); + } + /// @} /// @name Standard Interface /// @{ @@ -133,11 +138,6 @@ namespace gtsam { return Point2(uL_, v_); } - ///TODO comment - inline StereoPoint2 between(const StereoPoint2& p2) const { - return gtsam::between_default(*this, p2); - } - private: /// @} diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index c75c42b49..63cbd43c8 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -66,7 +66,7 @@ TEST( Graph, predecessorMap2Graph ) p_map.insert(1, 2); p_map.insert(2, 2); p_map.insert(3, 2); - tie(graph, root, key2vertex) = predecessorMap2Graph, SVertex, Key>(p_map); + boost::tie(graph, root, key2vertex) = predecessorMap2Graph, SVertex, Key>(p_map); LONGS_EQUAL(3, boost::num_vertices(graph)); CHECK(root == key2vertex[2]); diff --git a/tests/timeMultifrontalOnDataset.cpp b/tests/timeMultifrontalOnDataset.cpp index 874ccf8bb..3d8ccf77e 100644 --- a/tests/timeMultifrontalOnDataset.cpp +++ b/tests/timeMultifrontalOnDataset.cpp @@ -44,7 +44,7 @@ int main(int argc, char *argv[]) { else if (argc == 4) nrTrials = strtoul(argv[3], NULL, 10); - pair, shared_ptr > data = load2D(dataset(datasetname)); + pair, boost::shared_ptr > data = load2D(dataset(datasetname)); // Add a prior on the first pose if (soft_prior) diff --git a/tests/timeSequentialOnDataset.cpp b/tests/timeSequentialOnDataset.cpp index 9e1b986f9..a37b9910c 100644 --- a/tests/timeSequentialOnDataset.cpp +++ b/tests/timeSequentialOnDataset.cpp @@ -44,7 +44,7 @@ int main(int argc, char *argv[]) { else if (argc == 4) nrTrials = strtoul(argv[3], NULL, 10); - pair, shared_ptr > data = load2D(dataset(datasetname)); + pair, boost::shared_ptr > data = load2D(dataset(datasetname)); // Add a prior on the first pose if (soft_prior) From 73b4f35e02720ebd8130e782b82c493278e7354a Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 19:23:25 +0000 Subject: [PATCH 138/914] Fixed matlab issue with unsigned char types --- wrap/Argument.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index ff42b33b1..ffac23a9d 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -30,7 +30,7 @@ string Argument::matlabClass(const string& delim) const { string result; BOOST_FOREACH(const string& ns, namespaces) result += ns + delim; - if (type=="string") + if (type=="string" || type=="unsigned char") return result + "char"; if (type=="bool" || type=="int" || type=="size_t" || type=="Vector" || type=="Matrix") return result + "double"; From a07e4a73687b63714c21461c0422391811fa6ded Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 19:45:32 +0000 Subject: [PATCH 139/914] Fixed handling of char in wrap, updated README --- wrap/Argument.cpp | 2 +- wrap/README | 15 ++++++++------- wrap/tests/expected_namespaces/@ClassD/ClassD.m | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index ffac23a9d..85073715d 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -30,7 +30,7 @@ string Argument::matlabClass(const string& delim) const { string result; BOOST_FOREACH(const string& ns, namespaces) result += ns + delim; - if (type=="string" || type=="unsigned char") + if (type=="string" || type=="unsigned char" || type=="char") return result + "char"; if (type=="bool" || type=="int" || type=="size_t" || type=="Vector" || type=="Matrix") return result + "double"; diff --git a/wrap/README b/wrap/README index 6e7acc863..92fd1967c 100644 --- a/wrap/README +++ b/wrap/README @@ -1,14 +1,17 @@ Frank Dellaert October 2011 -The wrap library wraps the GTSAM library into a MATLAB toolbox. +The wrap library wraps the GTSAM library into a MATLAB toolbox. It was designed to be more general than just wrapping GTSAM, but a small amount of GTSAM specific code exists in matlab.h, the include file that is included by the -mex files. In addition, the current makefile (Oct 11) is GTSAM specific. +mex files. The GTSAM-specific functionality consists primarily of handling of +Eigen Matrix and Vector classes. + +For notes on creating a wrap interface, see gtsam.h for what features can be +wrapped into a toolbox, as well as the current state of the toolbox for gtsam. +For more technical details on the interface, please read comments in matlab.h -The classes and methods to be wrapped are specified in gtsam.h -This tool will not wrap arbitrary methods. Please read comments in matlab.h Some good things to know: OBJECT CREATION @@ -24,7 +27,5 @@ METHOD (AND CONSTRUCTOR) ARGUMENTS generation of the correct conversion routines unwrap and unwrap - passing classes as arguments works, provided they are passed by reference. This triggers a call to unwrap_shared_ptr -- GTSAM specific: keys will be cast automatically from strings via GTSAM_magic. This - allows us to not have to declare all key types in MATLAB. Just replace key arguments with - the (non-const, non-reference) string type + \ No newline at end of file diff --git a/wrap/tests/expected_namespaces/@ClassD/ClassD.m b/wrap/tests/expected_namespaces/@ClassD/ClassD.m index 8b78750d9..9e3ddf132 100644 --- a/wrap/tests/expected_namespaces/@ClassD/ClassD.m +++ b/wrap/tests/expected_namespaces/@ClassD/ClassD.m @@ -9,7 +9,7 @@ classdef ClassD < handle if nargin ~= 13 && obj.self == 0, error('ClassD constructor failed'); end end function delete(obj) - delete_ClassD(obj) + delete_ClassD(obj); end function display(obj), obj.print(''); end function disp(obj), obj.display; end From f8d2d7a7720014929060504cfe97f9474551c930 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 4 Jun 2012 19:53:30 +0000 Subject: [PATCH 140/914] Wrapped and grouped lots of geometry methods --- gtsam.h | 286 ++++++++++++++++++++++++++++++--------- gtsam/geometry/Pose2.cpp | 6 +- gtsam/geometry/Pose2.h | 6 +- 3 files changed, 230 insertions(+), 68 deletions(-) diff --git a/gtsam.h b/gtsam.h index 2015705ae..a08c753f1 100644 --- a/gtsam.h +++ b/gtsam.h @@ -68,72 +68,142 @@ namespace gtsam { //************************************************************************* class Point2 { + // Standard Constructors Point2(); Point2(double x, double y); - static gtsam::Point2 Expmap(Vector v); + + // Testable + void print(string s) const; + bool equals(const gtsam::Point2& pose, double tol) const; + + // Group + static gtsam::Point2 identity(); + gtsam::Point2 inverse() const; + gtsam::Point2 compose(const gtsam::Point2& p2) const; + gtsam::Point2 between(const gtsam::Point2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Point2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Point2& p) const; + + // Lie Group + static gtsam::Point2 Expmap(Vector v); static Vector Logmap(const gtsam::Point2& p); - void print(string s) const; - double x(); - double y(); - Vector localCoordinates(const gtsam::Point2& p); - gtsam::Point2 compose(const gtsam::Point2& p2); - gtsam::Point2 between(const gtsam::Point2& p2); - gtsam::Point2 retract(Vector v); + + // Standard Interface + double x() const; + double y() const; + Vector vector() const; }; class StereoPoint2 { + // Standard Constructors StereoPoint2(); StereoPoint2(double uL, double uR, double v); + + // Testable + void print(string s) const; + bool equals(const gtsam::StereoPoint2& point, double tol) const; + + // Group + static gtsam::StereoPoint2 identity(); + gtsam::StereoPoint2 inverse() const; + gtsam::StereoPoint2 compose(const gtsam::StereoPoint2& p2) const; + gtsam::StereoPoint2 between(const gtsam::StereoPoint2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::StereoPoint2 retract(Vector v) const; + Vector localCoordinates(const gtsam::StereoPoint2& p) const; + + // Lie Group static gtsam::StereoPoint2 Expmap(Vector v); static Vector Logmap(const gtsam::StereoPoint2& p); - void print(string s) const; - Vector localCoordinates(const gtsam::StereoPoint2& p); - gtsam::StereoPoint2 compose(const gtsam::StereoPoint2& p2); - gtsam::StereoPoint2 between(const gtsam::StereoPoint2& p2); - gtsam::StereoPoint2 retract(Vector v); + + // Standard Interface + Vector vector() const; }; class Point3 { + // Standard Constructors Point3(); Point3(double x, double y, double z); Point3(Vector v); - static gtsam::Point3 Expmap(Vector v); + + // Testable + void print(string s) const; + bool equals(const gtsam::Point3& p, double tol) const; + + // Group + static gtsam::Point3 identity(); + gtsam::Point3 inverse() const; + gtsam::Point3 compose(const gtsam::Point3& p2) const; + gtsam::Point3 between(const gtsam::Point3& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Point3 retract(Vector v) const; + Vector localCoordinates(const gtsam::Point3& p) const; + + // Lie Group + static gtsam::Point3 Expmap(Vector v); static Vector Logmap(const gtsam::Point3& p); - void print(string s) const; - bool equals(const gtsam::Point3& p, double tol); + + // Standard Interface Vector vector() const; - double x(); - double y(); - double z(); - Vector localCoordinates(const gtsam::Point3& p); - gtsam::Point3 retract(Vector v); - gtsam::Point3 compose(const gtsam::Point3& p2); - gtsam::Point3 between(const gtsam::Point3& p2); + double x() const; + double y() const; + double z() const; }; class Rot2 { + // Standard Constructors and Named Constructors Rot2(); Rot2(double theta); - static gtsam::Rot2 Expmap(Vector v); + static gtsam::Rot2 fromAngle(double theta); + static gtsam::Rot2 fromDegrees(double theta); + static gtsam::Rot2 fromCosSin(double c, double s); + + // Testable + void print(string s) const; + bool equals(const gtsam::Rot2& rot, double tol) const; + + // Group + static gtsam::Rot2 identity(); + static gtsam::Rot2 inverse(); + gtsam::Rot2 compose(const gtsam::Rot2& p2) const; + gtsam::Rot2 between(const gtsam::Rot2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Rot2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Rot2& p) const; + + // Lie Group + static gtsam::Rot2 Expmap(Vector v); static Vector Logmap(const gtsam::Rot2& p); - static gtsam::Rot2 fromAngle(double theta); - static gtsam::Rot2 fromDegrees(double theta); - static gtsam::Rot2 fromCosSin(double c, double s); + + // Group Action on Point2 + gtsam::Point2 rotate(const gtsam::Point2& point) const; + gtsam::Point2 unrotate(const gtsam::Point2& point) const; + + // Standard Interface static gtsam::Rot2 relativeBearing(const gtsam::Point2& d); // Ignoring derivative static gtsam::Rot2 atan2(double y, double x); - void print(string s) const; - bool equals(const gtsam::Rot2& rot, double tol) const; double theta() const; double degrees() const; double c() const; double s() const; - Vector localCoordinates(const gtsam::Rot2& p); - gtsam::Rot2 retract(Vector v); - gtsam::Rot2 compose(const gtsam::Rot2& p2); - gtsam::Rot2 between(const gtsam::Rot2& p2); + Matrix matrix() const; }; class Rot3 { + // Standard Constructors and Named Constructors Rot3(); Rot3(Matrix R); static gtsam::Rot3 Rx(double t); @@ -147,17 +217,29 @@ class Rot3 { static gtsam::Rot3 ypr(double y, double p, double r); static gtsam::Rot3 quaternion(double w, double x, double y, double z); static gtsam::Rot3 rodriguez(Vector v); + + // Testable void print(string s) const; bool equals(const gtsam::Rot3& rot, double tol) const; + + // Group static gtsam::Rot3 identity(); + gtsam::Rot3 inverse() const; gtsam::Rot3 compose(const gtsam::Rot3& p2) const; - gtsam::Rot3 inverse() const; gtsam::Rot3 between(const gtsam::Rot3& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Rot3 retractCayley(Vector v) const; + gtsam::Rot3 retract(Vector v) const; + Vector localCoordinates(const gtsam::Rot3& p) const; + + // Group Action on Point3 gtsam::Point3 rotate(const gtsam::Point3& p) const; gtsam::Point3 unrotate(const gtsam::Point3& p) const; - gtsam::Rot3 retractCayley(Vector v) const; - gtsam::Rot3 retract(Vector v) const; - Vector localCoordinates(const gtsam::Rot3& p) const; + + // Standard Interface static gtsam::Rot3 Expmap(Vector v); static Vector Logmap(const gtsam::Rot3& p); Matrix matrix() const; @@ -170,30 +252,53 @@ class Rot3 { double pitch() const; double yaw() const; // Vector toQuaternion() const; // FIXME: Can't cast to Vector properly + Matrix matrix() const; }; class Pose2 { + // Standard Constructor Pose2(); Pose2(double x, double y, double theta); Pose2(double theta, const gtsam::Point2& t); Pose2(const gtsam::Rot2& r, const gtsam::Point2& t); Pose2(Vector v); + + // Testable + void print(string s) const; + bool equals(const gtsam::Pose2& pose, double tol) const; + + // Group + static gtsam::Pose2 identity(); + gtsam::Pose2 inverse() const; + gtsam::Pose2 compose(const gtsam::Pose2& p2) const; + gtsam::Pose2 between(const gtsam::Pose2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Pose2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Pose2& p) const; + + // Lie Group static gtsam::Pose2 Expmap(Vector v); static Vector Logmap(const gtsam::Pose2& p); - void print(string s) const; - bool equals(const gtsam::Pose2& pose, double tol) const; + Matrix adjointMap() const; + Vector adjoint() const; + static Matrix wedge(); + + // Group Actions on Point2 + gtsam::Point2 transform_from(const gtsam::Point2& p) const; + gtsam::Point2 transform_to(const gtsam::Point2& p) const; + + // Standard Interface double x() const; double y() const; double theta() const; - size_t dim() const; - Vector localCoordinates(const gtsam::Pose2& p); - gtsam::Pose2 retract(Vector v); - gtsam::Pose2 compose(const gtsam::Pose2& p2); - gtsam::Pose2 between(const gtsam::Pose2& p2); - gtsam::Rot2 bearing(const gtsam::Point2& point); - double range(const gtsam::Point2& point); + gtsam::Rot2 bearing(const gtsam::Point2& point) const; + double range(const gtsam::Point2& point) const; gtsam::Point2 translation() const; gtsam::Rot2 rotation() const; + Matrix matrix() const; }; class Pose3 { @@ -210,15 +315,15 @@ class Pose3 { // Group static gtsam::Pose3 identity(); - gtsam::Pose3 inverse(); - gtsam::Pose3 compose(const gtsam::Pose3& p2); - gtsam::Pose3 between(const gtsam::Pose3& p2); + gtsam::Pose3 inverse() const; + gtsam::Pose3 compose(const gtsam::Pose3& p2) const; + gtsam::Pose3 between(const gtsam::Pose3& p2) const; // Manifold static size_t Dim(); size_t dim() const; - gtsam::Pose3 retract(Vector v); - gtsam::Pose3 retractFirstOrder(Vector v); + gtsam::Pose3 retract(Vector v) const; + gtsam::Pose3 retractFirstOrder(Vector v) const; Vector localCoordinates(const gtsam::Pose3& T2) const; // Lie Group @@ -245,41 +350,98 @@ class Pose3 { }; class Cal3_S2 { + // Standard Constructors Cal3_S2(); Cal3_S2(double fx, double fy, double s, double u0, double v0); + // Testable void print(string s) const; + bool equals(const gtsam::Cal3_S2& pose, double tol) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Cal3_S2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Cal3_S2& c) const; + + // Action on Point2 + gtsam::Point2 calibrate(const gtsam::Point2& p) const; + gtsam::Point2 uncalibrate(const gtsam::Point2& p) const; + + // Standard Interface + double fx() const; + double fy() const; + double skew() const; + double px() const; + double py() const; + gtsam::Point2 principalPoint() const; + Vector vector() const; + Matrix matrix() const; + Matrix matrix_inverse() const; }; class Cal3_S2Stereo { + // Standard Constructors Cal3_S2Stereo(); Cal3_S2Stereo(double fx, double fy, double s, double u0, double v0, double b); + // Testable void print(string s) const; + bool equals(const gtsam::Cal3_S2Stereo& pose, double tol) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Cal3_S2Stereo retract(Vector v) const; + Vector localCoordinates(const gtsam::Cal3_S2Stereo& c) const; + + // Action on Point2 + gtsam::Point2 calibrate(const gtsam::Point2& p) const; + gtsam::Point2 uncalibrate(const gtsam::Point2& p) const; + + // Standard Interface + double fx() const; + double fy() const; + double skew() const; + double px() const; + double py() const; + gtsam::Point2 principalPoint() const; + Vector vector() const; + Matrix matrix() const; + Matrix matrix_inverse() const; + double baseline() const; }; class CalibratedCamera { - + // Standard Constructors and Named Constructors CalibratedCamera(); CalibratedCamera(const gtsam::Pose3& pose); CalibratedCamera(const Vector& v); + gtsam::CalibratedCamera level(const gtsam::Pose2& pose2, double height); + // Testable void print(string s) const; bool equals(const gtsam::CalibratedCamera& camera, double tol) const; + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::CalibratedCamera retract(const Vector& d) const; + Vector localCoordinates(const gtsam::CalibratedCamera& T2) const; + + // Group + gtsam::CalibratedCamera compose(const gtsam::CalibratedCamera& c) const; + gtsam::CalibratedCamera inverse() const; + + // Action on Point3 + gtsam::Point2 project(const gtsam::Point3& point) const; + static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); + + // Standard Interface gtsam::Pose3 pose() const; - - gtsam::CalibratedCamera compose(const gtsam::CalibratedCamera& c) const; - gtsam::CalibratedCamera inverse() const; - gtsam::CalibratedCamera level(const gtsam::Pose2& pose2, double height); - gtsam::CalibratedCamera retract(const Vector& d) const; - Vector localCoordinates(const gtsam::CalibratedCamera& T2) const; - - gtsam::Point2 project(const gtsam::Point3& point) const; - static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); + double range(const gtsam::Point3& p) const; // TODO: Other overloaded range methods }; - //************************************************************************* // inference //************************************************************************* diff --git a/gtsam/geometry/Pose2.cpp b/gtsam/geometry/Pose2.cpp index e39dbc803..fa02ecfb8 100644 --- a/gtsam/geometry/Pose2.cpp +++ b/gtsam/geometry/Pose2.cpp @@ -108,7 +108,7 @@ Vector Pose2::localCoordinates(const Pose2& p2) const { /* ************************************************************************* */ // Calculate Adjoint map // Ad_pose is 3*3 matrix that when applied to twist xi, returns Ad_pose(xi) -Matrix Pose2::AdjointMap() const { +Matrix Pose2::adjointMap() const { double c = r_.c(), s = r_.s(), x = t_.x(), y = t_.y(); return Matrix_(3,3, c, -s, y, @@ -119,7 +119,7 @@ Matrix Pose2::AdjointMap() const { /* ************************************************************************* */ Pose2 Pose2::inverse(boost::optional H1) const { - if (H1) *H1 = -AdjointMap(); + if (H1) *H1 = -adjointMap(); return Pose2(r_.inverse(), r_.unrotate(Point2(-t_.x(), -t_.y()))); } @@ -142,7 +142,7 @@ Point2 Pose2::transform_to(const Point2& point, Pose2 Pose2::compose(const Pose2& p2, boost::optional H1, boost::optional H2) const { // TODO: inline and reuse? - if(H1) *H1 = p2.inverse().AdjointMap(); + if(H1) *H1 = p2.inverse().adjointMap(); if(H2) *H2 = I3; return (*this)*p2; } diff --git a/gtsam/geometry/Pose2.h b/gtsam/geometry/Pose2.h index 877eb93a1..55fe0a9d4 100644 --- a/gtsam/geometry/Pose2.h +++ b/gtsam/geometry/Pose2.h @@ -158,10 +158,10 @@ public: * Calculate Adjoint map * Ad_pose is 3*3 matrix that when applied to twist xi, returns Ad_pose(xi) */ - Matrix AdjointMap() const; - inline Vector Adjoint(const Vector& xi) const { + Matrix adjointMap() const; + inline Vector adjoint(const Vector& xi) const { assert(xi.size() == 3); - return AdjointMap()*xi; + return adjointMap()*xi; } /** From e3922d7b34ad8e311a7b4357d1867280ab0432b2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 4 Jun 2012 20:10:20 +0000 Subject: [PATCH 141/914] Missed rename --- gtsam/geometry/tests/testPose2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/geometry/tests/testPose2.cpp b/gtsam/geometry/tests/testPose2.cpp index cdde3cd54..2a0f9ebec 100644 --- a/gtsam/geometry/tests/testPose2.cpp +++ b/gtsam/geometry/tests/testPose2.cpp @@ -426,7 +426,7 @@ TEST( Pose2, between ) EXPECT(assert_equal(expectedH1,actualH1)); EXPECT(assert_equal(numericalH1,actualH1)); // Assert H1 = -AdjointMap(between(p2,p1)) as in doc/math.lyx - EXPECT(assert_equal(-gT2.between(gT1).AdjointMap(),actualH1)); + EXPECT(assert_equal(-gT2.between(gT1).adjointMap(),actualH1)); Matrix expectedH2 = Matrix_(3,3, 1.0, 0.0, 0.0, From 83f656f93ded66bd0674ad92eee54b1d284f1267 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Mon, 4 Jun 2012 20:14:41 +0000 Subject: [PATCH 142/914] add the spcg example to matlab --- examples/Pose2SLAMwSPCG.cpp | 9 ++---- examples/matlab/Pose2SLAMwSPCG.m | 54 ++++++++++++++++++++++++++++++++ gtsam.h | 1 + gtsam/slam/pose2SLAM.cpp | 7 +++++ gtsam/slam/pose2SLAM.h | 1 + 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 examples/matlab/Pose2SLAMwSPCG.m diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index 46a3787f2..cec4301dc 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -63,13 +63,8 @@ int main(void) { // 4. Single Step Optimization using Levenberg-Marquardt // Note: Although there are many options in IterativeOptimizationParameters, - // the SimpleSPCGSolver doesn't actually use all of them at this moment. - // More detail in the next release. - LevenbergMarquardtParams param; - param.linearSolverType = SuccessiveLinearizationParams::CG; - param.iterativeParams = boost::make_shared(); - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, param); - Values result = optimizer.optimize(); + Values result = graph.optimizeSPCG(initialEstimate); + result.print("\nFinal result:\n"); cout << "final error = " << graph.error(result) << endl; return 0 ; diff --git a/examples/matlab/Pose2SLAMwSPCG.m b/examples/matlab/Pose2SLAMwSPCG.m new file mode 100644 index 000000000..f9c0537be --- /dev/null +++ b/examples/matlab/Pose2SLAMwSPCG.m @@ -0,0 +1,54 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Simple 2D robotics example using the SimpleSPCGSolver +% @author Yong-Dian Jian +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - All values are axis aligned +% - Robot poses are facing along the X axis (horizontal, to the right in images) +% - We have full odometry for measurements +% - The robot is on a grid, moving 2 meters each step + +%% Create graph container and add factors to it +graph = pose2SLAMGraph; + +%% Add prior +% gaussian for prior +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +graph.addPrior(1, priorMean, priorNoise); % add directly to graph + +%% Add odometry +% general noisemodel for odometry +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); + +%% Add pose constraint +model = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); + +% print +graph.print(sprintf('\nFactor graph:\n')); + +%% Initialize to noisy points +initialEstimate = pose2SLAMValues; +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2 )); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2 )); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, pi/2)); +initialEstimate.insertPose(4, gtsamPose2(4.0, 2.0, pi )); +initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); +initialEstimate.print(sprintf('\nInitial estimate:\n')); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimizeSPCG(initialEstimate); +result.print(sprintf('\nFinal result:\n')); \ No newline at end of file diff --git a/gtsam.h b/gtsam.h index f9062cd9e..c73b59c3c 100644 --- a/gtsam.h +++ b/gtsam.h @@ -532,6 +532,7 @@ class Graph { void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); void addConstraint(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate) const; + pose2SLAM::Values optimizeSPCG(const pose2SLAM::Values& initialEstimate) const; gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; }; diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp index 49ab37111..110a50551 100644 --- a/gtsam/slam/pose2SLAM.cpp +++ b/gtsam/slam/pose2SLAM.cpp @@ -85,6 +85,13 @@ namespace pose2SLAM { return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); } + Values Graph::optimizeSPCG(const Values& initialEstimate) const { + LevenbergMarquardtParams params; + params.linearSolverType = SuccessiveLinearizationParams::CG; + return LevenbergMarquardtOptimizer(*this, initialEstimate, params).optimize(); + } + + /* ************************************************************************* */ } // pose2SLAM diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index d7ebd3323..71710f823 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -107,6 +107,7 @@ namespace pose2SLAM { /// Optimize Values optimize(const Values& initialEstimate) const; + Values optimizeSPCG(const Values& initialEstimate) const; /// Return a Marginals object Marginals marginals(const Values& solution) const { From 79f063fbb79144b6580d9be3311f9ef898fc8e14 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 4 Jun 2012 20:17:24 +0000 Subject: [PATCH 143/914] Wrapped and grouped lots of geometry methods --- gtsam.h | 286 ++++++++++++++++++++++------- gtsam/geometry/Pose2.cpp | 6 +- gtsam/geometry/Pose2.h | 6 +- gtsam/geometry/tests/testPose2.cpp | 2 +- 4 files changed, 231 insertions(+), 69 deletions(-) diff --git a/gtsam.h b/gtsam.h index c73b59c3c..044e2245a 100644 --- a/gtsam.h +++ b/gtsam.h @@ -68,72 +68,142 @@ namespace gtsam { //************************************************************************* class Point2 { + // Standard Constructors Point2(); Point2(double x, double y); - static gtsam::Point2 Expmap(Vector v); + + // Testable + void print(string s) const; + bool equals(const gtsam::Point2& pose, double tol) const; + + // Group + static gtsam::Point2 identity(); + gtsam::Point2 inverse() const; + gtsam::Point2 compose(const gtsam::Point2& p2) const; + gtsam::Point2 between(const gtsam::Point2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Point2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Point2& p) const; + + // Lie Group + static gtsam::Point2 Expmap(Vector v); static Vector Logmap(const gtsam::Point2& p); - void print(string s) const; - double x(); - double y(); - Vector localCoordinates(const gtsam::Point2& p); - gtsam::Point2 compose(const gtsam::Point2& p2); - gtsam::Point2 between(const gtsam::Point2& p2); - gtsam::Point2 retract(Vector v); + + // Standard Interface + double x() const; + double y() const; + Vector vector() const; }; class StereoPoint2 { + // Standard Constructors StereoPoint2(); StereoPoint2(double uL, double uR, double v); + + // Testable + void print(string s) const; + bool equals(const gtsam::StereoPoint2& point, double tol) const; + + // Group + static gtsam::StereoPoint2 identity(); + gtsam::StereoPoint2 inverse() const; + gtsam::StereoPoint2 compose(const gtsam::StereoPoint2& p2) const; + gtsam::StereoPoint2 between(const gtsam::StereoPoint2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::StereoPoint2 retract(Vector v) const; + Vector localCoordinates(const gtsam::StereoPoint2& p) const; + + // Lie Group static gtsam::StereoPoint2 Expmap(Vector v); static Vector Logmap(const gtsam::StereoPoint2& p); - void print(string s) const; - Vector localCoordinates(const gtsam::StereoPoint2& p); - gtsam::StereoPoint2 compose(const gtsam::StereoPoint2& p2); - gtsam::StereoPoint2 between(const gtsam::StereoPoint2& p2); - gtsam::StereoPoint2 retract(Vector v); + + // Standard Interface + Vector vector() const; }; class Point3 { + // Standard Constructors Point3(); Point3(double x, double y, double z); Point3(Vector v); - static gtsam::Point3 Expmap(Vector v); + + // Testable + void print(string s) const; + bool equals(const gtsam::Point3& p, double tol) const; + + // Group + static gtsam::Point3 identity(); + gtsam::Point3 inverse() const; + gtsam::Point3 compose(const gtsam::Point3& p2) const; + gtsam::Point3 between(const gtsam::Point3& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Point3 retract(Vector v) const; + Vector localCoordinates(const gtsam::Point3& p) const; + + // Lie Group + static gtsam::Point3 Expmap(Vector v); static Vector Logmap(const gtsam::Point3& p); - void print(string s) const; - bool equals(const gtsam::Point3& p, double tol); + + // Standard Interface Vector vector() const; - double x(); - double y(); - double z(); - Vector localCoordinates(const gtsam::Point3& p); - gtsam::Point3 retract(Vector v); - gtsam::Point3 compose(const gtsam::Point3& p2); - gtsam::Point3 between(const gtsam::Point3& p2); + double x() const; + double y() const; + double z() const; }; class Rot2 { + // Standard Constructors and Named Constructors Rot2(); Rot2(double theta); - static gtsam::Rot2 Expmap(Vector v); + static gtsam::Rot2 fromAngle(double theta); + static gtsam::Rot2 fromDegrees(double theta); + static gtsam::Rot2 fromCosSin(double c, double s); + + // Testable + void print(string s) const; + bool equals(const gtsam::Rot2& rot, double tol) const; + + // Group + static gtsam::Rot2 identity(); + static gtsam::Rot2 inverse(); + gtsam::Rot2 compose(const gtsam::Rot2& p2) const; + gtsam::Rot2 between(const gtsam::Rot2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Rot2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Rot2& p) const; + + // Lie Group + static gtsam::Rot2 Expmap(Vector v); static Vector Logmap(const gtsam::Rot2& p); - static gtsam::Rot2 fromAngle(double theta); - static gtsam::Rot2 fromDegrees(double theta); - static gtsam::Rot2 fromCosSin(double c, double s); + + // Group Action on Point2 + gtsam::Point2 rotate(const gtsam::Point2& point) const; + gtsam::Point2 unrotate(const gtsam::Point2& point) const; + + // Standard Interface static gtsam::Rot2 relativeBearing(const gtsam::Point2& d); // Ignoring derivative static gtsam::Rot2 atan2(double y, double x); - void print(string s) const; - bool equals(const gtsam::Rot2& rot, double tol) const; double theta() const; double degrees() const; double c() const; double s() const; - Vector localCoordinates(const gtsam::Rot2& p); - gtsam::Rot2 retract(Vector v); - gtsam::Rot2 compose(const gtsam::Rot2& p2); - gtsam::Rot2 between(const gtsam::Rot2& p2); + Matrix matrix() const; }; class Rot3 { + // Standard Constructors and Named Constructors Rot3(); Rot3(Matrix R); static gtsam::Rot3 Rx(double t); @@ -147,17 +217,29 @@ class Rot3 { static gtsam::Rot3 ypr(double y, double p, double r); static gtsam::Rot3 quaternion(double w, double x, double y, double z); static gtsam::Rot3 rodriguez(Vector v); + + // Testable void print(string s) const; bool equals(const gtsam::Rot3& rot, double tol) const; + + // Group static gtsam::Rot3 identity(); + gtsam::Rot3 inverse() const; gtsam::Rot3 compose(const gtsam::Rot3& p2) const; - gtsam::Rot3 inverse() const; gtsam::Rot3 between(const gtsam::Rot3& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Rot3 retractCayley(Vector v) const; + gtsam::Rot3 retract(Vector v) const; + Vector localCoordinates(const gtsam::Rot3& p) const; + + // Group Action on Point3 gtsam::Point3 rotate(const gtsam::Point3& p) const; gtsam::Point3 unrotate(const gtsam::Point3& p) const; - gtsam::Rot3 retractCayley(Vector v) const; - gtsam::Rot3 retract(Vector v) const; - Vector localCoordinates(const gtsam::Rot3& p) const; + + // Standard Interface static gtsam::Rot3 Expmap(Vector v); static Vector Logmap(const gtsam::Rot3& p); Matrix matrix() const; @@ -170,30 +252,53 @@ class Rot3 { double pitch() const; double yaw() const; // Vector toQuaternion() const; // FIXME: Can't cast to Vector properly + Matrix matrix() const; }; class Pose2 { + // Standard Constructor Pose2(); Pose2(double x, double y, double theta); Pose2(double theta, const gtsam::Point2& t); Pose2(const gtsam::Rot2& r, const gtsam::Point2& t); Pose2(Vector v); + + // Testable + void print(string s) const; + bool equals(const gtsam::Pose2& pose, double tol) const; + + // Group + static gtsam::Pose2 identity(); + gtsam::Pose2 inverse() const; + gtsam::Pose2 compose(const gtsam::Pose2& p2) const; + gtsam::Pose2 between(const gtsam::Pose2& p2) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Pose2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Pose2& p) const; + + // Lie Group static gtsam::Pose2 Expmap(Vector v); static Vector Logmap(const gtsam::Pose2& p); - void print(string s) const; - bool equals(const gtsam::Pose2& pose, double tol) const; + Matrix adjointMap() const; + Vector adjoint() const; + static Matrix wedge(); + + // Group Actions on Point2 + gtsam::Point2 transform_from(const gtsam::Point2& p) const; + gtsam::Point2 transform_to(const gtsam::Point2& p) const; + + // Standard Interface double x() const; double y() const; double theta() const; - size_t dim() const; - Vector localCoordinates(const gtsam::Pose2& p); - gtsam::Pose2 retract(Vector v); - gtsam::Pose2 compose(const gtsam::Pose2& p2); - gtsam::Pose2 between(const gtsam::Pose2& p2); - gtsam::Rot2 bearing(const gtsam::Point2& point); - double range(const gtsam::Point2& point); + gtsam::Rot2 bearing(const gtsam::Point2& point) const; + double range(const gtsam::Point2& point) const; gtsam::Point2 translation() const; gtsam::Rot2 rotation() const; + Matrix matrix() const; }; class Pose3 { @@ -210,15 +315,15 @@ class Pose3 { // Group static gtsam::Pose3 identity(); - gtsam::Pose3 inverse(); - gtsam::Pose3 compose(const gtsam::Pose3& p2); - gtsam::Pose3 between(const gtsam::Pose3& p2); + gtsam::Pose3 inverse() const; + gtsam::Pose3 compose(const gtsam::Pose3& p2) const; + gtsam::Pose3 between(const gtsam::Pose3& p2) const; // Manifold static size_t Dim(); size_t dim() const; - gtsam::Pose3 retract(Vector v); - gtsam::Pose3 retractFirstOrder(Vector v); + gtsam::Pose3 retract(Vector v) const; + gtsam::Pose3 retractFirstOrder(Vector v) const; Vector localCoordinates(const gtsam::Pose3& T2) const; // Lie Group @@ -245,41 +350,98 @@ class Pose3 { }; class Cal3_S2 { + // Standard Constructors Cal3_S2(); Cal3_S2(double fx, double fy, double s, double u0, double v0); + // Testable void print(string s) const; + bool equals(const gtsam::Cal3_S2& pose, double tol) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Cal3_S2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Cal3_S2& c) const; + + // Action on Point2 + gtsam::Point2 calibrate(const gtsam::Point2& p) const; + gtsam::Point2 uncalibrate(const gtsam::Point2& p) const; + + // Standard Interface + double fx() const; + double fy() const; + double skew() const; + double px() const; + double py() const; + gtsam::Point2 principalPoint() const; + Vector vector() const; + Matrix matrix() const; + Matrix matrix_inverse() const; }; class Cal3_S2Stereo { + // Standard Constructors Cal3_S2Stereo(); Cal3_S2Stereo(double fx, double fy, double s, double u0, double v0, double b); + // Testable void print(string s) const; + bool equals(const gtsam::Cal3_S2Stereo& pose, double tol) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Cal3_S2Stereo retract(Vector v) const; + Vector localCoordinates(const gtsam::Cal3_S2Stereo& c) const; + + // Action on Point2 + gtsam::Point2 calibrate(const gtsam::Point2& p) const; + gtsam::Point2 uncalibrate(const gtsam::Point2& p) const; + + // Standard Interface + double fx() const; + double fy() const; + double skew() const; + double px() const; + double py() const; + gtsam::Point2 principalPoint() const; + Vector vector() const; + Matrix matrix() const; + Matrix matrix_inverse() const; + double baseline() const; }; class CalibratedCamera { - + // Standard Constructors and Named Constructors CalibratedCamera(); CalibratedCamera(const gtsam::Pose3& pose); CalibratedCamera(const Vector& v); + gtsam::CalibratedCamera level(const gtsam::Pose2& pose2, double height); + // Testable void print(string s) const; bool equals(const gtsam::CalibratedCamera& camera, double tol) const; + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::CalibratedCamera retract(const Vector& d) const; + Vector localCoordinates(const gtsam::CalibratedCamera& T2) const; + + // Group + gtsam::CalibratedCamera compose(const gtsam::CalibratedCamera& c) const; + gtsam::CalibratedCamera inverse() const; + + // Action on Point3 + gtsam::Point2 project(const gtsam::Point3& point) const; + static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); + + // Standard Interface gtsam::Pose3 pose() const; - - gtsam::CalibratedCamera compose(const gtsam::CalibratedCamera& c) const; - gtsam::CalibratedCamera inverse() const; - gtsam::CalibratedCamera level(const gtsam::Pose2& pose2, double height); - gtsam::CalibratedCamera retract(const Vector& d) const; - Vector localCoordinates(const gtsam::CalibratedCamera& T2) const; - - gtsam::Point2 project(const gtsam::Point3& point) const; - static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); + double range(const gtsam::Point3& p) const; // TODO: Other overloaded range methods }; - //************************************************************************* // inference //************************************************************************* diff --git a/gtsam/geometry/Pose2.cpp b/gtsam/geometry/Pose2.cpp index e39dbc803..fa02ecfb8 100644 --- a/gtsam/geometry/Pose2.cpp +++ b/gtsam/geometry/Pose2.cpp @@ -108,7 +108,7 @@ Vector Pose2::localCoordinates(const Pose2& p2) const { /* ************************************************************************* */ // Calculate Adjoint map // Ad_pose is 3*3 matrix that when applied to twist xi, returns Ad_pose(xi) -Matrix Pose2::AdjointMap() const { +Matrix Pose2::adjointMap() const { double c = r_.c(), s = r_.s(), x = t_.x(), y = t_.y(); return Matrix_(3,3, c, -s, y, @@ -119,7 +119,7 @@ Matrix Pose2::AdjointMap() const { /* ************************************************************************* */ Pose2 Pose2::inverse(boost::optional H1) const { - if (H1) *H1 = -AdjointMap(); + if (H1) *H1 = -adjointMap(); return Pose2(r_.inverse(), r_.unrotate(Point2(-t_.x(), -t_.y()))); } @@ -142,7 +142,7 @@ Point2 Pose2::transform_to(const Point2& point, Pose2 Pose2::compose(const Pose2& p2, boost::optional H1, boost::optional H2) const { // TODO: inline and reuse? - if(H1) *H1 = p2.inverse().AdjointMap(); + if(H1) *H1 = p2.inverse().adjointMap(); if(H2) *H2 = I3; return (*this)*p2; } diff --git a/gtsam/geometry/Pose2.h b/gtsam/geometry/Pose2.h index 877eb93a1..55fe0a9d4 100644 --- a/gtsam/geometry/Pose2.h +++ b/gtsam/geometry/Pose2.h @@ -158,10 +158,10 @@ public: * Calculate Adjoint map * Ad_pose is 3*3 matrix that when applied to twist xi, returns Ad_pose(xi) */ - Matrix AdjointMap() const; - inline Vector Adjoint(const Vector& xi) const { + Matrix adjointMap() const; + inline Vector adjoint(const Vector& xi) const { assert(xi.size() == 3); - return AdjointMap()*xi; + return adjointMap()*xi; } /** diff --git a/gtsam/geometry/tests/testPose2.cpp b/gtsam/geometry/tests/testPose2.cpp index 14e529613..88c3b4987 100644 --- a/gtsam/geometry/tests/testPose2.cpp +++ b/gtsam/geometry/tests/testPose2.cpp @@ -426,7 +426,7 @@ TEST( Pose2, between ) EXPECT(assert_equal(expectedH1,actualH1)); EXPECT(assert_equal(numericalH1,actualH1)); // Assert H1 = -AdjointMap(between(p2,p1)) as in doc/math.lyx - EXPECT(assert_equal(-gT2.between(gT1).AdjointMap(),actualH1)); + EXPECT(assert_equal(-gT2.between(gT1).adjointMap(),actualH1)); Matrix expectedH2 = Matrix_(3,3, 1.0, 0.0, 0.0, From 6e47a5c1b6b9e50e7ecf21d32d65c4ed8e3bae5c Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 20:51:28 +0000 Subject: [PATCH 144/914] Fixing broken functions in matlab wrapper --- gtsam.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gtsam.h b/gtsam.h index 044e2245a..5cda5deaa 100644 --- a/gtsam.h +++ b/gtsam.h @@ -9,17 +9,17 @@ * Only one Method/Constructor per line * Methods can return * - Eigen types: Matrix, Vector - * - C/C++ basic types: string, bool, size_t, size_t, double, char + * - C/C++ basic types: string, bool, size_t, size_t, double, char, unsigned char * - void * - Any class with which be copied with boost::make_shared() * - boost::shared_ptr of any object type * Limitations on methods * - Parsing does not support overloading - * - There can only be one method with a given name + * - There can only be one method (static or otherwise) with a given name * Arguments to functions any of * - Eigen types: Matrix, Vector * - Eigen types and classes as an optionally const reference - * - C/C++ basic types: string, bool, size_t, size_t, double, char + * - C/C++ basic types: string, bool, size_t, size_t, double, char, unsigned char * - Any class with which be copied with boost::make_shared() (except Eigen) * - boost::shared_ptr of any object type (except Eigen) * Comments can use either C++ or C style, with multiple lines @@ -174,7 +174,7 @@ class Rot2 { // Group static gtsam::Rot2 identity(); - static gtsam::Rot2 inverse(); + gtsam::Rot2 inverse(); gtsam::Rot2 compose(const gtsam::Rot2& p2) const; gtsam::Rot2 between(const gtsam::Rot2& p2) const; @@ -284,7 +284,7 @@ class Pose2 { static Vector Logmap(const gtsam::Pose2& p); Matrix adjointMap() const; Vector adjoint() const; - static Matrix wedge(); + static Matrix wedge(double vx, double vy, double w); // Group Actions on Point2 gtsam::Point2 transform_from(const gtsam::Point2& p) const; From 9efcf8e17ce4b5a35de2ce4f3609d8b982959980 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 21:01:25 +0000 Subject: [PATCH 145/914] Added option to include path to mex executable in CMake --- .cproject | 372 +++++++++++++++++++++++--------------------- CMakeLists.txt | 1 + wrap/CMakeLists.txt | 8 +- wrap/Module.cpp | 4 +- wrap/Module.h | 4 +- wrap/wrap.cpp | 11 +- 6 files changed, 215 insertions(+), 185 deletions(-) diff --git a/.cproject b/.cproject index 9114e4159..57e3284f1 100644 --- a/.cproject +++ b/.cproject @@ -311,14 +311,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -345,6 +337,7 @@ make + tests/testBayesTree.run true false @@ -352,6 +345,7 @@ make + testBinaryBayesNet.run true false @@ -399,6 +393,7 @@ make + testSymbolicBayesNet.run true false @@ -406,6 +401,7 @@ make + tests/testSymbolicFactor.run true false @@ -413,6 +409,7 @@ make + testSymbolicFactorGraph.run true false @@ -428,11 +425,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -505,22 +511,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -537,6 +527,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -561,18 +567,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -657,26 +671,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -915,6 +921,7 @@ make + testGraph.run true false @@ -922,6 +929,7 @@ make + testJunctionTree.run true false @@ -929,6 +937,7 @@ make + testSymbolicBayesNetB.run true false @@ -1040,6 +1049,7 @@ make + testErrors.run true false @@ -1495,7 +1505,6 @@ make - testSimulated2DOriented.run true false @@ -1535,7 +1544,6 @@ make - testSimulated2D.run true false @@ -1543,7 +1551,6 @@ make - testSimulated3D.run true false @@ -1759,7 +1766,6 @@ make - tests/testGaussianISAM2 true false @@ -1781,102 +1787,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -2078,6 +1988,7 @@ cpack + -G DEB true false @@ -2085,6 +1996,7 @@ cpack + -G RPM true false @@ -2092,6 +2004,7 @@ cpack + -G TGZ true false @@ -2099,6 +2012,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2176,39 +2090,7 @@ true true - - make - -j5 - wrap.testSpirit.run - true - true - true - - - make - -j5 - wrap.testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - + make -j5 wrap @@ -2216,6 +2098,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -2255,6 +2233,46 @@ false true + + make + -j5 + wrap.testSpirit.run + true + true + true + + + make + -j5 + wrap.testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/CMakeLists.txt b/CMakeLists.txt index c0f273030..ac8e7b0f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,7 @@ option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap ut option(GTSAM_ENABLE_BUILD_MEX_BINARIES "Enable/Disable building of matlab mex files" OFF) option(GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL "Enable/Disable adding building of mex files to ALL target" OFF) set(GTSAM_BUILD_MEX_BINARY_FLAGS "-j2" CACHE STRING "Flags for running make on toolbox MEX files") +set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)") # Flags for choosing default packaging tools set(CPACK_SOURCE_GENERATOR "TGZ" CACHE STRING "CPack Default Source Generator") diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 6049b8a81..f0999a9eb 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -44,7 +44,13 @@ endif() # Code generation command add_custom_target(wrap_gtsam ALL COMMAND - ${EXECUTABLE_OUTPUT_PATH}/wrap ${GTSAM_MEX_BIN_EXTENSION} ${CMAKE_CURRENT_SOURCE_DIR}/../ ${moduleName} ${toolbox_path} "${mexFlags}" + ${EXECUTABLE_OUTPUT_PATH}/wrap + ${MEX_COMMAND} + ${GTSAM_MEX_BIN_EXTENSION} + ${CMAKE_CURRENT_SOURCE_DIR}/../ + ${moduleName} + ${toolbox_path} + "${mexFlags}" DEPENDS wrap) # Build command diff --git a/wrap/Module.cpp b/wrap/Module.cpp index dfd781016..d9d3c5b76 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -277,7 +277,7 @@ void verifyReturnTypes(const vector& validtypes, const vector& vt) { } /* ************************************************************************* */ -void Module::matlab_code(const string& toolboxPath, +void Module::matlab_code(const string& mexCommand, const string& toolboxPath, const string& mexExt, const string& mexFlags) const { string installCmd = "install -d " + toolboxPath; system(installCmd.c_str()); @@ -297,7 +297,7 @@ void Module::matlab_code(const string& toolboxPath, makeModuleMfile.oss << "clear delims" << endl; makeModuleMfile.oss << "addpath(toolboxpath);" << endl << endl; - makeModuleMakefile.oss << "\nMEX = mex\n"; + makeModuleMakefile.oss << "\nMEX = " << mexCommand << "\n"; makeModuleMakefile.oss << "MEXENDING = " << mexExt << "\n"; makeModuleMakefile.oss << "mex_flags = " << mexFlags << "\n\n"; diff --git a/wrap/Module.h b/wrap/Module.h index 3e97d9ba2..4b650728d 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -40,7 +40,9 @@ struct Module { bool enable_verbose=true); /// MATLAB code generation: - void matlab_code(const std::string& path, + void matlab_code( + const std::string& mexCommand, + const std::string& path, const std::string& mexExt, const std::string& mexFlags) const; }; diff --git a/wrap/wrap.cpp b/wrap/wrap.cpp index f55927a5e..453eaa73a 100644 --- a/wrap/wrap.cpp +++ b/wrap/wrap.cpp @@ -31,7 +31,9 @@ using namespace std; * @param nameSpace e.g. gtsam * @param mexFlags extra arguments for mex script, i.e., include flags etc... */ -void generate_matlab_toolbox(const string& mexExt, +void generate_matlab_toolbox( + const string& mexCommand, + const string& mexExt, const string& interfacePath, const string& moduleName, const string& toolboxPath, @@ -42,13 +44,14 @@ void generate_matlab_toolbox(const string& mexExt, wrap::Module module(interfacePath, moduleName, true); // Then emit MATLAB code - module.matlab_code(toolboxPath,mexExt,mexFlags); + module.matlab_code(mexCommand,toolboxPath,mexExt,mexFlags); } /** Displays usage information */ void usage() { cerr << "wrap parses an interface file and produces a MATLAB toolbox" << endl; cerr << "usage: wrap mexExtension interfacePath moduleName toolboxPath [mexFlags]" << endl; + cerr << " mexExecutable : command to execute mex if on path, use 'mex'" << endl; cerr << " mexExtension : OS/CPU-dependent extension for MEX binaries" << endl; cerr << " interfacePath : *absolute* path to directory of module interface file" << endl; cerr << " moduleName : the name of the module, interface file must be called moduleName.h" << endl; @@ -61,7 +64,7 @@ void usage() { * Typically called from "make all" using appropriate arguments */ int main(int argc, const char* argv[]) { - if (argc<6 || argc>7) { + if (argc<7 || argc>8) { cerr << "Invalid arguments:\n"; for (int i=0; i Date: Mon, 4 Jun 2012 21:05:00 +0000 Subject: [PATCH 146/914] Fixed mex command for gtsam_unstable --- gtsam_unstable/CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 4b8b4ac11..d90cbdecf 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -87,7 +87,13 @@ if (GTSAM_BUILD_WRAP) # Code generation command add_custom_target(wrap_gtsam_unstable ALL COMMAND - ${CMAKE_BINARY_DIR}/wrap/wrap ${GTSAM_MEX_BIN_EXTENSION} ${CMAKE_CURRENT_SOURCE_DIR} ${moduleName} ${toolbox_path} "${mexFlags}" + ${CMAKE_BINARY_DIR}/wrap/wrap + ${MEX_COMMAND} + ${GTSAM_MEX_BIN_EXTENSION} + ${CMAKE_CURRENT_SOURCE_DIR} + ${moduleName} + ${toolbox_path} + "${mexFlags}" DEPENDS wrap) # Build command From cc2351da68b267198d3bf69666c07d115aa43a33 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 4 Jun 2012 21:14:47 +0000 Subject: [PATCH 147/914] Fixed documentation for wrap --- gtsam_unstable/CMakeLists.txt | 3 ++- wrap/CMakeLists.txt | 3 ++- wrap/wrap.cpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index d90cbdecf..54e95a599 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -71,7 +71,8 @@ if (GTSAM_BUILD_WRAP) include(GtsamMatlabWrap) # Wrap codegen - #usage: wrap mexExtension interfacePath moduleName toolboxPath + #usage: wrap mexExecutable mexExtension interfacePath moduleName toolboxPath [mexFlags] + # mexExecutable : command to execute mex if on path, use 'mex' # mexExtension : OS/CPU-dependent extension for MEX binaries # interfacePath : *absolute* path to directory of module interface file # moduleName : the name of the module, interface file must be called moduleName.h diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index f0999a9eb..45fb61ec0 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -23,7 +23,8 @@ if (GTSAM_BUILD_TESTS) endif(GTSAM_BUILD_TESTS) # Wrap codegen -#usage: wrap mexExtension interfacePath moduleName toolboxPath +#usage: wrap mexExecutable mexExtension interfacePath moduleName toolboxPath [mexFlags] +# mexExecutable : command to execute mex if on path, use 'mex' # mexExtension : OS/CPU-dependent extension for MEX binaries # interfacePath : *absolute* path to directory of module interface file # moduleName : the name of the module, interface file must be called moduleName.h diff --git a/wrap/wrap.cpp b/wrap/wrap.cpp index 453eaa73a..eabba647e 100644 --- a/wrap/wrap.cpp +++ b/wrap/wrap.cpp @@ -24,6 +24,7 @@ using namespace std; /** * Top-level function to wrap a module + * @param mexCommand is a sufficiently qualified command to execute mex within a makefile * @param mexExt is the extension for mex binaries for this os/cpu * @param interfacePath path to where interface file lives, e.g., borg/gtsam * @param moduleName name of the module to be generated e.g. gtsam @@ -50,7 +51,7 @@ void generate_matlab_toolbox( /** Displays usage information */ void usage() { cerr << "wrap parses an interface file and produces a MATLAB toolbox" << endl; - cerr << "usage: wrap mexExtension interfacePath moduleName toolboxPath [mexFlags]" << endl; + cerr << "usage: wrap mexExecutable mexExtension interfacePath moduleName toolboxPath [mexFlags]" << endl; cerr << " mexExecutable : command to execute mex if on path, use 'mex'" << endl; cerr << " mexExtension : OS/CPU-dependent extension for MEX binaries" << endl; cerr << " interfacePath : *absolute* path to directory of module interface file" << endl; From a17c3c8df1c14fac6494ebd34ab51351e3cc6a7a Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 21:39:29 +0000 Subject: [PATCH 148/914] Make Cal3_S2Stereo its own class, not derived --- gtsam/geometry/Cal3_S2Stereo.h | 48 +++++++++++++++++++++++----------- gtsam/geometry/StereoCamera.h | 10 ------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/gtsam/geometry/Cal3_S2Stereo.h b/gtsam/geometry/Cal3_S2Stereo.h index 7bbafd7d5..8282800c1 100644 --- a/gtsam/geometry/Cal3_S2Stereo.h +++ b/gtsam/geometry/Cal3_S2Stereo.h @@ -26,8 +26,10 @@ namespace gtsam { * @ingroup geometry * \nosubgrouping */ - class Cal3_S2Stereo: public Cal3_S2 { + class Cal3_S2Stereo { private: + + Cal3_S2 K_; double b_; public: @@ -39,12 +41,12 @@ namespace gtsam { /// default calibration leaves coordinates unchanged Cal3_S2Stereo() : - Cal3_S2(1, 1, 0, 0, 0), b_(1.0) { + K_(1, 1, 0, 0, 0), b_(1.0) { } /// constructor from doubles Cal3_S2Stereo(double fx, double fy, double s, double u0, double v0, double b) : - Cal3_S2(fx, fy, s, u0, v0), b_(b) { + K_(fx, fy, s, u0, v0), b_(b) { } /// @} @@ -52,23 +54,41 @@ namespace gtsam { /// @{ void print(const std::string& s = "") const { - gtsam::print(matrix(), s); - std::cout << "Baseline: " << b_ << std::endl; + K_.print(s+"K: "); + std::cout << s << "Baseline: " << b_ << std::endl; } - /// @} + /// Check if equal up to specified tolerance + bool equals(const Cal3_S2Stereo& other, double tol = 10e-9) const { + if (fabs(b_ - other.b_) > tol) return false; + return K_.equals(other.K_,tol); + } + + /// @} /// @name Standard Interface /// @{ - //TODO: remove? -// /** -// * Check if equal up to specified tolerance -// */ -// bool equals(const Cal3_S2& K, double tol = 10e-9) const; + /// focal length x + inline double fx() const { return K_.fx();} + /// focal length x + inline double fy() const { return K_.fy();} + /// skew + inline double skew() const { return K_.skew();} - ///TODO: comment + /// image center in x + inline double px() const { return K_.px();} + + /// image center in y + inline double py() const { return K_.py();} + + /// return the principal point + Point2 principalPoint() const { + return K_.principalPoint(); + } + + /// return baseline inline double baseline() const { return b_; } /// @} @@ -81,10 +101,8 @@ namespace gtsam { template void serialize(Archive & ar, const unsigned int version) { - ar & boost::serialization::make_nvp("Cal3_S2Stereo", - boost::serialization::base_object(*this)); + ar & BOOST_SERIALIZATION_NVP(K_); ar & BOOST_SERIALIZATION_NVP(b_); - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Cal3_S2); } /// @} diff --git a/gtsam/geometry/StereoCamera.h b/gtsam/geometry/StereoCamera.h index f5e07e66c..4c278fab9 100644 --- a/gtsam/geometry/StereoCamera.h +++ b/gtsam/geometry/StereoCamera.h @@ -71,16 +71,6 @@ public: return project(point, H1, H2); } - /* - * backproject using left camera calibration, up to scale only - * i.e. does not rely on baseline - */ - Point3 backproject(const Point2& projection, const double scale) const { - Point2 intrinsic = K_->calibrate(projection); - Point3 cameraPoint = Point3(intrinsic.x() * scale, intrinsic.y() * scale, scale);; - return pose().transform_from(cameraPoint); - } - Point3 backproject(const StereoPoint2& z) const { Vector measured = z.vector(); double Z = K_->baseline()*K_->fx()/(measured[0]-measured[1]); From f53e0a372e0dd37e3d10e5476246fc6e75142110 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 21:39:52 +0000 Subject: [PATCH 149/914] Fixed wrap problems induced by Richard :-) --- gtsam.h | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/gtsam.h b/gtsam.h index 5cda5deaa..5a6e58687 100644 --- a/gtsam.h +++ b/gtsam.h @@ -283,7 +283,7 @@ class Pose2 { static gtsam::Pose2 Expmap(Vector v); static Vector Logmap(const gtsam::Pose2& p); Matrix adjointMap() const; - Vector adjoint() const; + Vector adjoint(const Vector& xi) const; static Matrix wedge(double vx, double vy, double w); // Group Actions on Point2 @@ -389,16 +389,6 @@ class Cal3_S2Stereo { void print(string s) const; bool equals(const gtsam::Cal3_S2Stereo& pose, double tol) const; - // Manifold - static size_t Dim(); - size_t dim() const; - gtsam::Cal3_S2Stereo retract(Vector v) const; - Vector localCoordinates(const gtsam::Cal3_S2Stereo& c) const; - - // Action on Point2 - gtsam::Point2 calibrate(const gtsam::Point2& p) const; - gtsam::Point2 uncalibrate(const gtsam::Point2& p) const; - // Standard Interface double fx() const; double fy() const; @@ -406,9 +396,6 @@ class Cal3_S2Stereo { double px() const; double py() const; gtsam::Point2 principalPoint() const; - Vector vector() const; - Matrix matrix() const; - Matrix matrix_inverse() const; double baseline() const; }; From 129e29d4b25ee73a9782763a5008c98cc3f6d4be Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 4 Jun 2012 22:09:33 +0000 Subject: [PATCH 150/914] fix related to mex command --- wrap/tests/testWrap.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index cdee692a5..e3a51a71e 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -62,7 +62,7 @@ TEST( wrap, check_exception ) { string path = topdir + "/wrap/tests"; Module module(path.c_str(), "testDependencies",enable_verbose); - CHECK_EXCEPTION(module.matlab_code("actual_deps", "mexa64", "-O5"), DependencyMissing); + CHECK_EXCEPTION(module.matlab_code("mex", "actual_deps", "mexa64", "-O5"), DependencyMissing); } /* ************************************************************************* */ @@ -214,7 +214,7 @@ TEST( wrap, matlab_code_namespaces ) { // emit MATLAB code string exp_path = path + "/tests/expected_namespaces/"; string act_path = "actual_namespaces/"; - module.matlab_code("actual_namespaces", "mexa64", "-O5"); + module.matlab_code("mex", "actual_namespaces", "mexa64", "-O5"); EXPECT(files_equal(exp_path + "new_ClassD_.cpp" , act_path + "new_ClassD_.cpp" )); EXPECT(files_equal(exp_path + "new_ClassD_.m" , act_path + "new_ClassD_.m" )); @@ -268,7 +268,7 @@ TEST( wrap, matlab_code ) { // emit MATLAB code // make_geometry will not compile, use make testwrap to generate real make - module.matlab_code("actual", "mexa64", "-O5"); + module.matlab_code("mex", "actual", "mexa64", "-O5"); EXPECT(files_equal(path + "/tests/expected/@Point2/Point2.m" , "actual/@Point2/Point2.m" )); EXPECT(files_equal(path + "/tests/expected/@Point2/x.cpp" , "actual/@Point2/x.cpp" )); From 77707b97bbd9ef2b8e16db7a8201ace8934b8851 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 22:25:50 +0000 Subject: [PATCH 151/914] doxygen bug --- gtsam/discrete/tests/testDiscreteFactorGraph.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gtsam/discrete/tests/testDiscreteFactorGraph.cpp b/gtsam/discrete/tests/testDiscreteFactorGraph.cpp index f3ca4b59e..667ce9331 100644 --- a/gtsam/discrete/tests/testDiscreteFactorGraph.cpp +++ b/gtsam/discrete/tests/testDiscreteFactorGraph.cpp @@ -10,8 +10,7 @@ * -------------------------------------------------------------------------- */ /* - * testDiscreteFactorGraph.cpp - * + * @file testDiscreteFactorGraph.cpp * @date Feb 14, 2011 * @author Duy-Nguyen Ta */ From 88efe3a82e583d2dbd29899fe519aab0e1911ac6 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 22:26:12 +0000 Subject: [PATCH 152/914] test in place for DiscreteMarginals --- gtsam/discrete/DiscreteMarginals.h | 62 +++++++++++++++++++ .../discrete/tests/testDiscreteMarginals.cpp | 62 +++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 gtsam/discrete/DiscreteMarginals.h create mode 100644 gtsam/discrete/tests/testDiscreteMarginals.cpp diff --git a/gtsam/discrete/DiscreteMarginals.h b/gtsam/discrete/DiscreteMarginals.h new file mode 100644 index 000000000..f877a0128 --- /dev/null +++ b/gtsam/discrete/DiscreteMarginals.h @@ -0,0 +1,62 @@ +/* ---------------------------------------------------------------------------- + + * 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 DiscreteMarginals.h + * @brief A class for computing marginals in a DiscreteFactorGraph + * @author Abhijit Kundu + * @author Richard Roberts + * @author Frank Dellaert + * @date June 4, 2012 + */ + +#pragma once + +#include + +namespace gtsam { + + /** + * A class for computing marginals of variables in a DiscreteFactorGraph + */ + class DiscreteMarginals { + + protected: + + BayesTree bayesTree_; + + public: + + /** Construct a marginals class. + * @param graph The factor graph defining the full joint density on all variables. + */ + DiscreteMarginals(const DiscreteFactorGraph& graph) { + } + + /** print */ + void print(const std::string& str = "DiscreteMarginals: ") const { + } + + /** Compute the marginal of a single variable */ + DiscreteFactor::shared_ptr operator()(Index variable) const { + DiscreteFactor::shared_ptr p; + return p; + } + + /** Compute the marginal of a single variable */ + Vector marginalProbabilities(Index variable) const { + Vector v; + return v; + } + + }; + +} /* namespace gtsam */ diff --git a/gtsam/discrete/tests/testDiscreteMarginals.cpp b/gtsam/discrete/tests/testDiscreteMarginals.cpp new file mode 100644 index 000000000..391a5f692 --- /dev/null +++ b/gtsam/discrete/tests/testDiscreteMarginals.cpp @@ -0,0 +1,62 @@ +/* ---------------------------------------------------------------------------- + + * 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 testDiscreteMarginals.cpp + * @date Feb 14, 2011 + * @author Abhijit Kundu + * @author Richard Roberts + * @author Frank Dellaert + */ + +#include +#include + +using namespace std; +using namespace gtsam; + +/* ************************************************************************* */ + +TEST( DiscreteMarginals, UGM_small ) { + size_t nrStates = 2; + DiscreteKey Cathy(1, nrStates), Heather(2, nrStates), Mark(3, nrStates), + Allison(4, nrStates); + DiscreteFactorGraph graph; + + // add node potentials + graph.add(Cathy, "1 3"); + graph.add(Heather, "9 1"); + graph.add(Mark, "1 3"); + graph.add(Allison, "9 1"); + + // add edge potentials + graph.add(Cathy & Heather, "2 1 1 2"); + graph.add(Heather & Mark, "2 1 1 2"); + graph.add(Mark & Allison, "2 1 1 2"); + + DiscreteMarginals marginals(graph); + + DiscreteFactor::shared_ptr actualC = marginals(Cathy.first); + DiscreteFactor::Values values; + values[Cathy.first] = 0; + EXPECT_DOUBLES_EQUAL( 1.944, (*actualC)(values), 1e-9); + + Vector actualCvector = marginals.marginalProbabilities(Cathy.first); + EXPECT(assert_equal(Vector_(2,0.7,0.3), actualCvector, 1e-9)); +} + +/* ************************************************************************* */ +int main() { + TestResult tr; + return TestRegistry::runAllTests(tr); +} +/* ************************************************************************* */ + From d9e1c7b959c97e789f83f9f759cc77e11b81598a Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 22:27:10 +0000 Subject: [PATCH 153/914] new target --- .cproject | 336 +++++++++++++++++++++++++++--------------------------- 1 file changed, 167 insertions(+), 169 deletions(-) diff --git a/.cproject b/.cproject index 57e3284f1..c53d6aaaf 100644 --- a/.cproject +++ b/.cproject @@ -311,6 +311,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -337,7 +345,6 @@ make - tests/testBayesTree.run true false @@ -345,7 +352,6 @@ make - testBinaryBayesNet.run true false @@ -393,7 +399,6 @@ make - testSymbolicBayesNet.run true false @@ -401,7 +406,6 @@ make - tests/testSymbolicFactor.run true false @@ -409,7 +413,6 @@ make - testSymbolicFactorGraph.run true false @@ -425,20 +428,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -511,22 +505,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -543,6 +521,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -567,26 +561,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -671,18 +657,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -767,6 +761,14 @@ true true + + make + -j5 + testDiscreteMarginals.run + true + true + true + make -j2 @@ -921,7 +923,6 @@ make - testGraph.run true false @@ -929,7 +930,6 @@ make - testJunctionTree.run true false @@ -937,7 +937,6 @@ make - testSymbolicBayesNetB.run true false @@ -1049,7 +1048,6 @@ make - testErrors.run true false @@ -1505,6 +1503,7 @@ make + testSimulated2DOriented.run true false @@ -1544,6 +1543,7 @@ make + testSimulated2D.run true false @@ -1551,6 +1551,7 @@ make + testSimulated3D.run true false @@ -1766,6 +1767,7 @@ make + tests/testGaussianISAM2 true false @@ -1787,6 +1789,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -1988,7 +2086,6 @@ cpack - -G DEB true false @@ -1996,7 +2093,6 @@ cpack - -G RPM true false @@ -2004,7 +2100,6 @@ cpack - -G TGZ true false @@ -2012,7 +2107,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2098,98 +2192,42 @@ true true - + make - -j2 - testRot3.run + -j5 + wrap.testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + wrap.testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run + -j5 + wrap_gtsam true true true - + make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2233,46 +2271,6 @@ false true - - make - -j5 - wrap.testSpirit.run - true - true - true - - - make - -j5 - wrap.testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - From a440106330ac5659b8455afef709d901712b6f6d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 4 Jun 2012 22:57:01 +0000 Subject: [PATCH 154/914] Moved docs to gtsam --- doc/LieGroups.lyx | 4065 ++++++++++++++++++++ doc/LieGroups.pdf | Bin 0 -> 319029 bytes doc/cholesky.lyx | 170 + doc/images/circular.pdf | Bin 0 -> 62900 bytes doc/images/circular.png | Bin 0 -> 1493 bytes doc/images/gtsam-structure.graffle | 1302 +++++++ doc/images/gtsam-structure.pdf | Bin 0 -> 29463 bytes doc/images/n-steps.pdf | Bin 0 -> 62899 bytes doc/images/n-steps.png | Bin 0 -> 1427 bytes doc/macros.lyx | 294 ++ doc/math.lyx | 5746 ++++++++++++++++++++++++++++ doc/math.pdf | Bin 0 -> 118509 bytes 12 files changed, 11577 insertions(+) create mode 100644 doc/LieGroups.lyx create mode 100644 doc/LieGroups.pdf create mode 100644 doc/cholesky.lyx create mode 100644 doc/images/circular.pdf create mode 100644 doc/images/circular.png create mode 100644 doc/images/gtsam-structure.graffle create mode 100644 doc/images/gtsam-structure.pdf create mode 100644 doc/images/n-steps.pdf create mode 100644 doc/images/n-steps.png create mode 100644 doc/macros.lyx create mode 100644 doc/math.lyx create mode 100644 doc/math.pdf diff --git a/doc/LieGroups.lyx b/doc/LieGroups.lyx new file mode 100644 index 000000000..03116dbc9 --- /dev/null +++ b/doc/LieGroups.lyx @@ -0,0 +1,4065 @@ +#LyX 2.0 created this file. For more info see http://www.lyx.org/ +\lyxformat 413 +\begin_document +\begin_header +\textclass article +\use_default_options false +\begin_modules +theorems-std +\end_modules +\maintain_unincluded_children false +\language english +\language_package default +\inputencoding auto +\fontencoding global +\font_roman times +\font_sans default +\font_typewriter default +\font_default_family rmdefault +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 +\font_tt_scale 100 + +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize 12 +\spacing single +\use_hyperref false +\papersize default +\use_geometry true +\use_amsmath 1 +\use_esint 0 +\use_mhchem 1 +\use_mathdots 1 +\cite_engine basic +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\use_refstyle 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\leftmargin 1in +\topmargin 1in +\rightmargin 1in +\bottommargin 1in +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\quotes_language english +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Title +Lie Groups for Beginners +\end_layout + +\begin_layout Author +Frank Dellaert +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Derivatives +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\deriv}[2]{\frac{\partial#1}{\partial#2}} +{\frac{\partial#1}{\partial#2}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\at}[2]{#1\biggr\rvert_{#2}} +{#1\biggr\rvert_{#2}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Jac}[3]{ \at{\deriv{#1}{#2}} {#3} } +{\at{\deriv{#1}{#2}}{#3}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Lie Groups +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\xhat}{\hat{x}} +{\hat{x}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\yhat}{\hat{y}} +{\hat{y}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Ad}[1]{Ad_{#1}} +{Ad_{#1}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\AAdd}[1]{\mathbf{\mathop{Ad}}{}_{#1}} +{\mathbf{\mathop{Ad}}{}_{#1}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\define}{\stackrel{\Delta}{=}} +{\stackrel{\Delta}{=}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\gg}{\mathfrak{g}} +{\mathfrak{g}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Rn}{\mathbb{R}^{n}} +{\mathbb{R}^{n}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SO(2), 1 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\Rtwo}{\mathfrak{\mathbb{R}^{2}}} +{\mathfrak{\mathbb{R}^{2}}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SOtwo}{SO(2)} +{SO(2)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sotwo}{\mathfrak{so(2)}} +{\mathfrak{so(2)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\that}{\hat{\theta}} +{\hat{\theta}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\skew}[1]{[#1]_{+}} +{[#1]_{+}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SE(2), 3 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\SEtwo}{SE(2)} +{SE(2)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\setwo}{\mathfrak{se(2)}} +{\mathfrak{se(2)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Skew}[1]{[#1]_{\times}} +{[#1]_{\times}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SO(3), 3 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\Rthree}{\mathfrak{\mathbb{R}^{3}}} +{\mathfrak{\mathbb{R}^{3}}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SOthree}{SO(3)} +{SO(3)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sothree}{\mathfrak{so(3)}} +{\mathfrak{so(3)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\what}{\hat{\omega}} +{\hat{\omega}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SE(3),6 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\Rsix}{\mathfrak{\mathbb{R}^{6}}} +{\mathfrak{\mathbb{R}^{6}}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SEthree}{SE(3)} +{SE(3)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sethree}{\mathfrak{se(3)}} +{\mathfrak{se(3)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\xihat}{\hat{\xi}} +{\hat{\xi}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Aff(2),6 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\Afftwo}{Aff(2)} +{Aff(2)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\afftwo}{\mathfrak{aff(2)}} +{\mathfrak{aff(2)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\aa}{a} +{a} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\ahat}{\hat{a}} +{\hat{a}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status collapsed + +\begin_layout Plain Layout +SL(3),8 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\SLthree}{SL(3)} +{SL(3)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\slthree}{\mathfrak{sl(3)}} +{\mathfrak{sl(3)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\hh}{h} +{h} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\hhat}{\hat{h}} +{\hat{h}} +\end_inset + + +\end_layout + +\begin_layout Section +Motivation: Rigid Motions in the Plane +\end_layout + +\begin_layout Standard +We will start with a small example of a robot moving in a plane, parameterized + by a +\emph on +2D pose +\emph default + +\begin_inset Formula $(x,\, y,\,\theta)$ +\end_inset + +. + When we give it a small forward velocity +\begin_inset Formula $v_{x}$ +\end_inset + +, we know that the location changes as +\begin_inset Formula +\[ +\dot{x}=v_{x} +\] + +\end_inset + +The solution to this trivial differential equation is, with +\begin_inset Formula $x_{0}$ +\end_inset + + the initial +\begin_inset Formula $x$ +\end_inset + +-position of the robot, +\begin_inset Formula +\[ +x_{t}=x_{0}+v_{x}t +\] + +\end_inset + +A similar story holds for translation in the +\begin_inset Formula $y$ +\end_inset + + direction, and in fact for translations in general: +\begin_inset Formula +\[ +(x_{t},\, y_{t},\,\theta_{t})=(x_{0}+v_{x}t,\, y_{0}+v_{y}t,\,\theta_{0}) +\] + +\end_inset + +Similarly for rotation we have +\begin_inset Formula +\[ +(x_{t},\, y_{t},\,\theta_{t})=(x_{0},\, y_{0},\,\theta_{0}+\omega t) +\] + +\end_inset + +where +\begin_inset Formula $\omega$ +\end_inset + + is angular velocity, measured in +\begin_inset Formula $rad/s$ +\end_inset + + in counterclockwise direction. + +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement h +wide false +sideways false +status collapsed + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename images/circular.pdf + +\end_inset + + +\begin_inset Caption + +\begin_layout Plain Layout +Robot moving along a circular trajectory. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +However, if we combine translation and rotation, the story breaks down! + We cannot write +\begin_inset Formula +\[ +(x_{t},\, y_{t},\,\theta_{t})=(x_{0}+v_{x}t,\, y_{0}+v_{y}t,\,\theta_{0}+\omega t) +\] + +\end_inset + +The reason is that, if we move the robot a tiny bit according to the velocity + vector +\begin_inset Formula $(v_{x},\, v_{y},\,\omega)$ +\end_inset + +, we have (to first order) +\begin_inset Formula +\[ +(x_{\delta},\, y_{\delta},\,\theta_{\delta})=(x_{0}+v_{x}\delta,\, y_{0}+v_{y}\delta,\,\theta_{0}+\omega\delta) +\] + +\end_inset + +but now the robot has rotated, and for the next incremental change, the + velocity vector would have to be rotated before it can be applied. + In fact, the robot will move on a +\emph on +circular +\emph default + trajectory. + +\end_layout + +\begin_layout Standard +The reason is that +\emph on +translation and rotation do not commute +\emph default +: if we rotate and then move we will end up in a different place than if + we moved first, then rotated. + In fact, someone once said (I forget who, kudos for who can track down + the exact quote): +\end_layout + +\begin_layout Quote +If rotation and translation commuted, we could do all rotations before leaving + home. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +placement h +wide false +sideways false +status open + +\begin_layout Plain Layout +\align center +\begin_inset Graphics + filename images/n-steps.pdf + +\end_inset + + +\begin_inset Caption + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "fig:n-step-program" + +\end_inset + +Approximating a circular trajectory with +\begin_inset Formula $n$ +\end_inset + + steps. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + +To make progress, we have to be more precise about how the robot behaves. + Specifically, let us define composition of two poses +\begin_inset Formula $T_{1}$ +\end_inset + + and +\begin_inset Formula $T_{2}$ +\end_inset + + as +\begin_inset Formula +\[ +T_{1}T_{2}=(x_{1},\, y_{1},\,\theta_{1})(x_{2},\, y_{2},\,\theta_{2})=(x_{1}+\cos\theta_{1}x_{2}-\sin\theta y_{2},\, y_{1}+\sin\theta_{1}x_{2}+\cos\theta_{1}y_{2},\,\theta_{1}+\theta_{2}) +\] + +\end_inset + +This is a bit clumsy, so we resort to a trick: embed the 2D poses in the + space of +\begin_inset Formula $3\times3$ +\end_inset + + matrices, so we can define composition as matrix multiplication: +\begin_inset Formula +\[ +T_{1}T_{2}=\left[\begin{array}{cc} +R_{1} & t_{1}\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +R_{2} & t_{2}\\ +0 & 1 +\end{array}\right]=\left[\begin{array}{cc} +R_{1}R_{2} & R_{1}t_{2}+t_{1}\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + +where the matrices +\begin_inset Formula $R$ +\end_inset + + are 2D rotation matrices defined as +\begin_inset Formula +\[ +R=\left[\begin{array}{cc} +\cos\theta & -\sin\theta\\ +\sin\theta & \cos\theta +\end{array}\right] +\] + +\end_inset + +Now a +\begin_inset Quotes eld +\end_inset + +tiny +\begin_inset Quotes erd +\end_inset + + motion of the robot can be written as +\begin_inset Formula +\[ +T(\delta)=\left[\begin{array}{ccc} +\cos\omega\delta & -\sin\omega\delta & v_{x}\delta\\ +\sin\omega\delta & \cos\omega\delta & v_{y}\delta\\ +0 & 0 & 1 +\end{array}\right]\approx\left[\begin{array}{ccc} +1 & -\omega\delta & v_{x}\delta\\ +\omega\delta & 1 & v_{y}\delta\\ +0 & 0 & 1 +\end{array}\right]=I+\delta\left[\begin{array}{ccc} +0 & -\omega & v_{x}\\ +\omega & 0 & v_{y}\\ +0 & 0 & 0 +\end{array}\right] +\] + +\end_inset + +Let us define the +\emph on +2D twist +\emph default + vector +\begin_inset Formula $\xi=(v,\omega)$ +\end_inset + +, and the matrix above as +\begin_inset Formula +\[ +\xihat\define\left[\begin{array}{ccc} +0 & -\omega & v_{x}\\ +\omega & 0 & v_{y}\\ +0 & 0 & 0 +\end{array}\right] +\] + +\end_inset + +If we wanted +\begin_inset Formula $t$ +\end_inset + + to be large, we could split up +\begin_inset Formula $t$ +\end_inset + + into smaller timesteps, say +\begin_inset Formula $n$ +\end_inset + + of them, and compose them as follows: +\begin_inset Formula +\[ +T(t)\approx\left(I+\frac{t}{n}\xihat\right)\ldots\mbox{n times}\ldots\left(I+\frac{t}{n}\xihat\right)=\left(I+\frac{t}{n}\xihat\right)^{n} +\] + +\end_inset + +The result is shown in Figure +\begin_inset CommandInset ref +LatexCommand ref +reference "fig:n-step-program" + +\end_inset + +. +\end_layout + +\begin_layout Standard +Of course, the perfect solution would be obtained if we take +\begin_inset Formula $n$ +\end_inset + + to infinity: +\begin_inset Formula +\[ +T(t)=\lim_{n\rightarrow\infty}\left(I+\frac{t}{n}\xihat\right)^{n} +\] + +\end_inset + +For real numbers, this series is familiar and is actually a way to compute + the exponential function: +\begin_inset Formula +\[ +e^{x}=\lim_{n\rightarrow\infty}\left(1+\frac{x}{n}\right)^{n}=\sum_{k=0}^{\infty}\frac{x^{k}}{k!} +\] + +\end_inset + +The series can be similarly defined for square matrices, and the final result + is that we can write the motion of a robot along a circular trajectory, + resulting from the 2D twist +\begin_inset Formula $\xi=(v,\omega)$ +\end_inset + + +\begin_inset Formula $ $ +\end_inset + + as the +\emph on +matrix exponential +\emph default + of +\begin_inset Formula $\xihat$ +\end_inset + +: +\begin_inset Formula +\[ +T(t)=e^{t\xihat}\define\lim_{n\rightarrow\infty}\left(I+\frac{t}{n}\xihat\right)^{n}=\sum_{k=0}^{\infty}\frac{t^{k}}{k!}\xihat^{k} +\] + +\end_inset + +We call this mapping from 2D twists matrices +\begin_inset Formula $\xihat$ +\end_inset + + to 2D rigid transformations the +\emph on +exponential map. +\end_layout + +\begin_layout Standard +The above has all elements of Lie group theory. + We call the space of 2D rigid transformations, along with the composition + operation, the +\emph on +special Euclidean group +\emph default + +\begin_inset Formula $\SEtwo$ +\end_inset + +. + It is called a Lie group because it is simultaneously a topological group + and a manifold, which implies that the multiplication and the inversion + operations are smooth. + The space of 2D twists, together with a special binary operation to be + defined below, is called the Lie algebra +\begin_inset Formula $\setwo$ +\end_inset + + associated with +\begin_inset Formula $\SEtwo$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +Basic Lie Group Concepts +\end_layout + +\begin_layout Standard +We now define the concepts illustrated above, introduce some notation, and + see what we can say in general. + After this we then introduce the most commonly used Lie groups and their + Lie algebras. +\end_layout + +\begin_layout Subsection +A Manifold and a Group +\end_layout + +\begin_layout Standard +A +\series bold +Lie group +\series default + +\begin_inset Formula $G$ +\end_inset + + is both a group +\emph on +and +\emph default + a manifold that possesses a smooth group operation. + Associated with it is a +\series bold +Lie Algebra +\series default + +\begin_inset Formula $\gg$ +\end_inset + + which, loosely speaking, can be identified with the tangent space at the + identity and completely defines how the groups behaves around the identity. + There is a mapping from +\begin_inset Formula $\gg$ +\end_inset + + back to +\begin_inset Formula $G$ +\end_inset + +, called the +\series bold +exponential map +\series default + +\begin_inset Formula +\[ +\exp:\gg\rightarrow G +\] + +\end_inset + +which is typically a many-to-one mapping. + The corresponding inverse can be define locally around the origin and hence + is a +\begin_inset Quotes eld +\end_inset + +logarithm +\begin_inset Quotes erd +\end_inset + + +\begin_inset Formula +\[ +\log:G\rightarrow\gg +\] + +\end_inset + +that maps elements in a neighborhood of +\begin_inset Formula $id$ +\end_inset + + in G to an element in +\begin_inset Formula $\gg$ +\end_inset + +. +\end_layout + +\begin_layout Standard +An important family of Lie groups are the matrix Lie groups, whose elements + are +\begin_inset Formula $n\times n$ +\end_inset + + invertible matrices. + The set of all such matrices, together with the matrix multiplication, + is called the general linear group +\begin_inset Formula $GL(n)$ +\end_inset + + of dimension +\begin_inset Formula $n$ +\end_inset + +, and any closed subgroup of it is a +\series bold + matrix Lie group +\series default +. + Most if not all Lie groups we are interested in will be matrix Lie groups. +\end_layout + +\begin_layout Subsection +Lie Algebra +\end_layout + +\begin_layout Standard +The Lie Algebra +\begin_inset Formula $\gg$ +\end_inset + + is called an algebra because it is endowed with a binary operation, the + +\series bold +Lie bracket +\series default + +\begin_inset Formula $[X,Y]$ +\end_inset + +, the properties of which are closely related to the group operation of + +\begin_inset Formula $G$ +\end_inset + +. + For example, for algebras associated with matrix Lie groups, the Lie bracket + is given by +\begin_inset Formula $[A,B]\define AB-BA$ +\end_inset + +. +\end_layout + +\begin_layout Standard +The relationship of the Lie bracket to the group operation is as follows: + for commutative Lie groups vector addition +\begin_inset Formula $X+Y$ +\end_inset + + in +\begin_inset Formula $\gg$ +\end_inset + + mimicks the group operation. + For example, if we have +\begin_inset Formula $Z=X+Y$ +\end_inset + + in +\begin_inset Formula $\gg$ +\end_inset + +, when mapped backed to +\begin_inset Formula $G$ +\end_inset + + via the exponential map we obtain +\begin_inset Formula +\[ +e^{Z}=e^{X+Y}=e^{X}e^{Y} +\] + +\end_inset + +However, this does +\emph on +not +\emph default + hold for non-commutative Lie groups: +\begin_inset Formula +\[ +Z=\log(e^{X}e^{Y})\neq X+Y +\] + +\end_inset + +Instead, +\begin_inset Formula $Z$ +\end_inset + + can be calculated using the Baker-Campbell-Hausdorff (BCH) formula +\begin_inset CommandInset citation +LatexCommand cite +key "Hall00book" + +\end_inset + + +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +http://en.wikipedia.org/wiki/Baker–Campbell–Hausdorff_formula +\end_layout + +\end_inset + +: +\begin_inset Formula +\[ +Z=X+Y+[X,Y]/2+[X-Y,[X,Y]]/12-[Y,[X,[X,Y]]]/24+\ldots +\] + +\end_inset + +For commutative groups the bracket is zero and we recover +\begin_inset Formula $Z=X+Y$ +\end_inset + +. + For non-commutative groups we can use the BCH formula to approximate it. +\end_layout + +\begin_layout Subsection +Exponential Coordinates +\end_layout + +\begin_layout Standard +For +\begin_inset Formula $n$ +\end_inset + +-dimensional matrix Lie groups, as a vector space the Lie algebra +\begin_inset Formula $\gg$ +\end_inset + + is isomorphic to +\begin_inset Formula $\mathbb{R}^{n}$ +\end_inset + +, and we can define the hat operator +\begin_inset CommandInset citation +LatexCommand cite +after "page 41" +key "Murray94book" + +\end_inset + +, +\begin_inset Formula +\[ +\hat{}:x\in\mathbb{R}^{n}\rightarrow\xhat\in\gg +\] + +\end_inset + +which maps +\begin_inset Formula $n$ +\end_inset + +-vectors +\begin_inset Formula $x\in\mathbb{R}^{n}$ +\end_inset + + to elements of +\begin_inset Formula $\gg$ +\end_inset + +. + In the case of matrix Lie groups, the elements +\begin_inset Formula $\xhat$ +\end_inset + + of +\begin_inset Formula $\gg$ +\end_inset + + are also +\begin_inset Formula $n\times n$ +\end_inset + + matrices, and the map is given by +\begin_inset Formula +\begin{equation} +\xhat=\sum_{i=1}^{n}x_{i}G^{i}\label{eq:generators} +\end{equation} + +\end_inset + +where the +\begin_inset Formula $G^{i}$ +\end_inset + + are +\begin_inset Formula $n\times n$ +\end_inset + + matrices known as Lie group generators. + The meaning of the map +\begin_inset Formula $x\rightarrow\xhat$ +\end_inset + + will depend on the group +\begin_inset Formula $G$ +\end_inset + + and will generally have an intuitive interpretation. +\end_layout + +\begin_layout Subsection +Actions +\end_layout + +\begin_layout Standard +An important concept is that of a group element acting on an element of + a manifold +\begin_inset Formula $M$ +\end_inset + +. + For example, 2D rotations act on 2D points, 3D rotations act on 3D points, + etc. + In particular, a +\series bold +left action +\series default + of +\begin_inset Formula $G$ +\end_inset + + on +\begin_inset Formula $M$ +\end_inset + + is defined as a smooth map +\begin_inset Formula $\Phi:G\times M\rightarrow M$ +\end_inset + + such that +\begin_inset CommandInset citation +LatexCommand cite +after "Appendix A" +key "Murray94book" + +\end_inset + +: +\end_layout + +\begin_layout Enumerate +The identity element +\begin_inset Formula $e$ +\end_inset + + has no effect, i.e., +\begin_inset Formula $\Phi(e,p)=p$ +\end_inset + + +\end_layout + +\begin_layout Enumerate +Composing two actions can be combined into one action: +\begin_inset Formula $\Phi(g,\Phi(h,p))=\Phi(gh,p)$ +\end_inset + + +\end_layout + +\begin_layout Standard +The (usual) action of an +\begin_inset Formula $n$ +\end_inset + +-dimensional matrix group +\begin_inset Formula $G$ +\end_inset + + is matrix-vector multiplication on +\begin_inset Formula $\mathbb{R}^{n}$ +\end_inset + +, +\begin_inset Formula +\[ +q=Ap +\] + +\end_inset + +with +\begin_inset Formula $p,q\in\mathbb{R}^{n}$ +\end_inset + + and +\begin_inset Formula $A\in G\subseteq GL(n)$ +\end_inset + +. + +\end_layout + +\begin_layout Subsection +The Adjoint Map and Adjoint Representation +\end_layout + +\begin_layout Standard +Suppose a point +\begin_inset Formula $p$ +\end_inset + + is specified as +\begin_inset Formula $p'$ +\end_inset + + in the frame +\begin_inset Formula $T$ +\end_inset + +, i.e., +\begin_inset Formula $p'=Tp$ +\end_inset + +, where +\begin_inset Formula $T$ +\end_inset + + transforms from the global coordinates +\begin_inset Formula $p$ +\end_inset + + to the local frame +\begin_inset Formula $p'$ +\end_inset + +. + To apply an action +\begin_inset Formula $A$ +\end_inset + + we first need to undo +\begin_inset Formula $T$ +\end_inset + +, then apply +\begin_inset Formula $A$ +\end_inset + +, and then transform the result back to +\begin_inset Formula $T$ +\end_inset + +: +\begin_inset Formula +\[ +q'=TAT^{-1}p' +\] + +\end_inset + +The matrix +\begin_inset Formula $TAT^{-1}$ +\end_inset + + is said to be conjugate to +\begin_inset Formula $A$ +\end_inset + +, and this is a central element of group theory. +\end_layout + +\begin_layout Standard +In general, the +\series bold +adjoint map +\series default + +\begin_inset Formula $\AAdd g$ +\end_inset + + maps a group element +\begin_inset Formula $a\in G$ +\end_inset + + to its +\series bold +conjugate +\series default + +\begin_inset Formula $gag^{-1}$ +\end_inset + + by +\begin_inset Formula $g$ +\end_inset + +. + This map captures conjugacy in the group +\begin_inset Formula $G$ +\end_inset + +, but there is an equivalent notion in the Lie algebra +\begin_inset Formula $\mathfrak{\gg}$ +\end_inset + +, +\begin_inset Note Note +status open + +\begin_layout Plain Layout +http://en.wikipedia.org/wiki/Exponential_map +\end_layout + +\end_inset + + +\begin_inset Formula +\[ +\AAdd ge^{\xhat}=g\exp\left(\xhat\right)g^{-1}=\exp(\Ad g{\xhat}) +\] + +\end_inset + +where +\begin_inset Formula $\Ad g:\gg\rightarrow\mathfrak{\gg}$ +\end_inset + + is a map parameterized by a group element +\begin_inset Formula $g$ +\end_inset + +, and is called the +\emph on +adjoint representation +\emph default +. + The intuitive explanation is that a change +\begin_inset Formula $\exp\left(\xhat\right)$ +\end_inset + + defined around the origin, but applied at the group element +\begin_inset Formula $g$ +\end_inset + +, can be written in one step by taking the adjoint +\begin_inset Formula $\Ad g{\xhat}$ +\end_inset + + of +\begin_inset Formula $\xhat$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +In the special case of matrix Lie groups the adjoint can be written as +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +http://en.wikipedia.org/wiki/Adjoint_representation_of_a_Lie_group +\end_layout + +\end_inset + + +\begin_inset Formula +\[ +\Ad T{\xhat}\define T\xhat T^{-1} +\] + +\end_inset + +and hence we have +\end_layout + +\begin_layout Standard +\begin_inset Formula +\begin{equation} +Te^{\xhat}T^{-1}=e^{T\xhat T^{-1}}\label{eq:matrixAdjoint} +\end{equation} + +\end_inset + +where both +\begin_inset Formula $T\in G$ +\end_inset + + and +\begin_inset Formula $\xhat\in\gg$ +\end_inset + + are +\begin_inset Formula $n\times n$ +\end_inset + + matrices for an +\begin_inset Formula $n$ +\end_inset + +-dimensional Lie group. +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +2D Rotations +\end_layout + +\begin_layout Standard +We first look at a very simple group, the 2D rotations. +\end_layout + +\begin_layout Subsection +Basics +\end_layout + +\begin_layout Standard +The Lie group +\begin_inset Formula $\SOtwo$ +\end_inset + + is a subgroup of the general linear group +\begin_inset Formula $GL(2)$ +\end_inset + + of +\begin_inset Formula $2\times2$ +\end_inset + + invertible matrices. + Its Lie algebra +\begin_inset Formula $\sotwo$ +\end_inset + + is the vector space of +\begin_inset Formula $2\times2$ +\end_inset + + skew-symmetric matrices. + Since +\begin_inset Formula $\SOtwo$ +\end_inset + + is a one-dimensional manifold, +\begin_inset Formula $\sotwo$ +\end_inset + + is isomorphic to +\begin_inset Formula $\mathbb{R}$ +\end_inset + + and we define +\begin_inset Formula +\[ +\hat{}:\mathbb{R}\rightarrow\sotwo +\] + +\end_inset + + +\begin_inset Formula +\[ +\hat{}:\omega\rightarrow\what=\skew{\omega} +\] + +\end_inset + +which maps the angle +\begin_inset Formula $\omega$ +\end_inset + + to the +\begin_inset Formula $2\times2$ +\end_inset + + skew-symmetric matrix +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none + +\begin_inset Formula $\skew{\omega}$ +\end_inset + +: +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit + +\begin_inset Formula +\[ +\skew{\omega}=\left[\begin{array}{cc} +0 & -\omega\\ +\omega & 0 +\end{array}\right] +\] + +\end_inset + +The exponential map can be computed in closed form as +\begin_inset Formula +\[ +e^{\skew{\omega}}=\left[\begin{array}{cc} +\cos\omega & -\sin\omega\\ +\sin\omega & \cos\omega +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +\begin_inset CommandInset label +LatexCommand label +name "sub:Diagonalized2D" + +\end_inset + +Diagonalized Form +\end_layout + +\begin_layout Standard +The matrix +\begin_inset Formula $\skew 1$ +\end_inset + + can be diagonalized (see +\begin_inset CommandInset citation +LatexCommand cite +key "Hall00book" + +\end_inset + +) with eigenvalues +\begin_inset Formula $-i$ +\end_inset + + and +\begin_inset Formula $i$ +\end_inset + + , and eigenvectors +\begin_inset Formula $\left[\begin{array}{c} +1\\ +i +\end{array}\right]$ +\end_inset + + and +\begin_inset Formula $\left[\begin{array}{c} +i\\ +1 +\end{array}\right]$ +\end_inset + + . + Readers familiar with projective geometry will recognize these as the circular + points when promoted to homogeneous coordinates. + In particular: +\begin_inset Formula +\[ +\skew{\omega}=\left[\begin{array}{cc} +0 & -\omega\\ +\omega & 0 +\end{array}\right]=\left[\begin{array}{cc} +1 & i\\ +i & 1 +\end{array}\right]\left[\begin{array}{cc} +-i\omega & 0\\ +0 & i\omega +\end{array}\right]\left[\begin{array}{cc} +1 & i\\ +i & 1 +\end{array}\right]^{-1} +\] + +\end_inset + +and hence +\begin_inset Formula +\[ +e^{\skew{\omega}}=\frac{1}{2}\left[\begin{array}{cc} +1 & i\\ +i & 1 +\end{array}\right]\left[\begin{array}{cc} +e^{-i\omega} & 0\\ +0 & e^{i\omega} +\end{array}\right]\left[\begin{array}{cc} +1 & -i\\ +-i & 1 +\end{array}\right]=\left[\begin{array}{cc} +\cos\omega & -\sin\omega\\ +\sin\omega & \cos\omega +\end{array}\right] +\] + +\end_inset + +where the latter can be shown using +\begin_inset Formula $e^{i\omega}=\cos\omega+i\sin\omega$ +\end_inset + +. +\end_layout + +\begin_layout Subsection +Adjoint +\end_layout + +\begin_layout Standard +The adjoint for +\begin_inset Formula $\sotwo$ +\end_inset + + is trivially equal to the identity, as is the case for +\emph on +all +\emph default + commutative groups: +\begin_inset Formula +\begin{eqnarray*} +\Ad R\what & = & \left[\begin{array}{cc} +\cos\theta & -\sin\theta\\ +\sin\theta & \cos\theta +\end{array}\right]\left[\begin{array}{cc} +0 & -\omega\\ +\omega & 0 +\end{array}\right]\left[\begin{array}{cc} +\cos\theta & -\sin\theta\\ +\sin\theta & \cos\theta +\end{array}\right]^{T}\\ + & = & \omega\left[\begin{array}{cc} +-\sin\theta & -\cos\theta\\ +\cos\theta & -\sin\theta +\end{array}\right]\left[\begin{array}{cc} +\cos\theta & \sin\theta\\ +-\sin\theta & \cos\theta +\end{array}\right]=\left[\begin{array}{cc} +0 & -\omega\\ +\omega & 0 +\end{array}\right] +\end{eqnarray*} + +\end_inset + +i.e., +\begin_inset Formula +\[ +\Ad R\what=\what +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Actions +\end_layout + +\begin_layout Standard +In the case of +\begin_inset Formula $\SOtwo$ +\end_inset + + the vector space is +\begin_inset Formula $\Rtwo$ +\end_inset + +, and the group action corresponds to rotating a point +\begin_inset Formula +\[ +q=Rp +\] + +\end_inset + +We would now like to know what an incremental rotation parameterized by + +\begin_inset Formula $\omega$ +\end_inset + + would do: +\begin_inset Formula +\[ +q(\text{\omega})=Re^{\skew{\omega}}p +\] + +\end_inset + +For small angles +\begin_inset Formula $\omega$ +\end_inset + + we have +\begin_inset Formula +\[ +e^{\skew{\omega}}\approx\skew{\omega}=\omega\skew 1 +\] + +\end_inset + +where +\begin_inset Formula $\skew 1$ +\end_inset + + acts like a restricted +\begin_inset Quotes eld +\end_inset + +cross product +\begin_inset Quotes erd +\end_inset + + in the plane on points: +\begin_inset Formula +\begin{equation} +\skew 1\left[\begin{array}{c} +x\\ +y +\end{array}\right]=R_{\pi/2}\left[\begin{array}{c} +x\\ +y +\end{array}\right]=\left[\begin{array}{c} +-y\\ +x +\end{array}\right]\label{eq:RestrictedCross} +\end{equation} + +\end_inset + +Hence the derivative of the action is given as +\begin_inset Formula +\[ +\deriv{q(\omega)}{\omega}=R\deriv{}{\omega}\left(e^{\skew{\omega}}p\right)=R\deriv{}{\omega}\left(\omega\skew 1p\right)=RH_{p} +\] + +\end_inset + +where +\begin_inset Formula $H_{p}$ +\end_inset + + is a +\begin_inset Formula $2\times1$ +\end_inset + + matrix that depends on +\begin_inset Formula $p$ +\end_inset + +: +\begin_inset Formula +\[ +H_{p}\define\skew 1p=\left[\begin{array}{c} +-p_{y}\\ +p_{x} +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +2D Rigid Transformations +\end_layout + +\begin_layout Subsection +Basics +\end_layout + +\begin_layout Standard +The Lie group +\begin_inset Formula $\SEtwo$ +\end_inset + + is a subgroup of the general linear group +\begin_inset Formula $GL(3)$ +\end_inset + + of +\begin_inset Formula $3\times3$ +\end_inset + + invertible matrices of the form +\begin_inset Formula +\[ +T\define\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + +where +\begin_inset Formula $R\in\SOtwo$ +\end_inset + + is a rotation matrix and +\begin_inset Formula $t\in\Rtwo$ +\end_inset + + is a translation vector. + +\begin_inset Formula $\SEtwo$ +\end_inset + + is the +\emph on +semi-direct product +\emph default + of +\begin_inset Formula $\Rtwo$ +\end_inset + + by +\begin_inset Formula $SO(2)$ +\end_inset + +, written as +\begin_inset Formula $\SEtwo=\Rtwo\rtimes\SOtwo$ +\end_inset + +. + In particular, any element +\begin_inset Formula $T$ +\end_inset + + of +\begin_inset Formula $\SEtwo$ +\end_inset + + can be written as +\begin_inset Formula +\[ +T=\left[\begin{array}{cc} +0 & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +R & 0\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + +and they compose as +\begin_inset Formula +\[ +T_{1}T_{2}=\left[\begin{array}{cc} +R_{1} & t_{1}\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +R_{2} & t_{2}\\ +0 & 1 +\end{array}\right]=\left[\begin{array}{cc} +R_{1}R_{2} & R_{1}t_{2}+t_{1}\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + +Hence, an alternative way of writing down elements of +\begin_inset Formula $\SEtwo$ +\end_inset + + is as the ordered pair +\begin_inset Formula $(R,\, t)$ +\end_inset + +, with composition defined a +\begin_inset Formula +\[ +(R_{1},\, t_{1})(R_{2},\, t_{2})=(R_{1}R_{2},\, R{}_{1}t_{2}+t_{1}) +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +The corresponding Lie algebra +\begin_inset Formula $\setwo$ +\end_inset + + is the vector space of +\begin_inset Formula $3\times3$ +\end_inset + + twists +\begin_inset Formula $\xihat$ +\end_inset + + parameterized by the +\emph on +twist coordinates +\emph default + +\begin_inset Formula $\xi\in\Rthree$ +\end_inset + +, with the mapping +\begin_inset Formula +\[ +\xi\define\left[\begin{array}{c} +v\\ +\omega +\end{array}\right]\rightarrow\xihat\define\left[\begin{array}{cc} +\skew{\omega} & v\\ +0 & 0 +\end{array}\right] +\] + +\end_inset + +Note we think of robots as having a pose +\begin_inset Formula $(x,y,\theta)$ +\end_inset + + and hence I reserved the first two components for translation and the last + for rotation. + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +The corresponding Lie group generators are +\begin_inset Formula +\[ +G^{x}=\left[\begin{array}{ccc} +0 & 0 & 1\\ +0 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{y}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 1\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{\theta}=\left[\begin{array}{ccc} +0 & -1 & 0\\ +1 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right] +\] + +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit +Applying the exponential map to a twist +\begin_inset Formula $\xi$ +\end_inset + + yields a screw motion yielding an element in +\begin_inset Formula $\SEtwo$ +\end_inset + +: +\begin_inset Formula +\[ +T=e^{\xihat}=\left(e^{\skew{\omega}},(I-e^{\skew{\omega}})\frac{v^{\perp}}{\omega}\right) +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +The Adjoint Map +\end_layout + +\begin_layout Standard +The adjoint is +\begin_inset Formula +\begin{eqnarray} +\Ad T{\xihat} & = & T\xihat T^{-1}\nonumber \\ + & = & \left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +\skew{\omega} & v\\ +0 & 0 +\end{array}\right]\left[\begin{array}{cc} +R^{T} & -R^{T}t\\ +0 & 1 +\end{array}\right]\nonumber \\ + & = & \left[\begin{array}{cc} +\skew{\omega} & -\skew{\omega}t+Rv\\ +0 & 0 +\end{array}\right]\nonumber \\ + & = & \left[\begin{array}{cc} +\skew{\omega} & Rv-\omega R_{\pi/2}t\\ +0 & 0 +\end{array}\right]\label{eq:adjointSE2} +\end{eqnarray} + +\end_inset + +From this we can express the Adjoint map in terms of plane twist coordinates: +\begin_inset Formula +\[ +\left[\begin{array}{c} +v'\\ +\omega' +\end{array}\right]=\left[\begin{array}{cc} +R & -R_{\pi/2}t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{c} +v\\ +\omega +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Actions +\end_layout + +\begin_layout Standard +The action of +\begin_inset Formula $\SEtwo$ +\end_inset + + on 2D points is done by embedding the points in +\begin_inset Formula $\mathbb{R}^{3}$ +\end_inset + + by using homogeneous coordinates +\begin_inset Formula +\[ +\hat{q}=\left[\begin{array}{c} +q\\ +1 +\end{array}\right]=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=T\hat{p} +\] + +\end_inset + +Analoguous to +\begin_inset Formula $\SEthree$ +\end_inset + +, we can compute a velocity +\begin_inset Formula $\xihat\hat{p}$ +\end_inset + + in the local +\begin_inset Formula $T$ +\end_inset + + frame: +\begin_inset Formula +\[ +\xihat\hat{p}=\left[\begin{array}{cc} +\skew{\omega} & v\\ +0 & 0 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=\left[\begin{array}{c} +\skew{\omega}p+v\\ +0 +\end{array}\right] +\] + +\end_inset + +By only taking the top two rows, we can write this as a velocity in +\begin_inset Formula $\Rtwo$ +\end_inset + +, as the product of a +\begin_inset Formula $2\times3$ +\end_inset + + matrix +\begin_inset Formula $H_{p}$ +\end_inset + + that acts upon the exponential coordinates +\begin_inset Formula $\xi$ +\end_inset + + directly: +\begin_inset Formula +\[ +\skew{\omega}p+v=v+R_{\pi/2}p\omega=\left[\begin{array}{cc} +I_{2} & R_{\pi/2}p\end{array}\right]\left[\begin{array}{c} +v\\ +\omega +\end{array}\right]=H_{p}\xi +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +3D Rotations +\end_layout + +\begin_layout Subsection +Basics +\end_layout + +\begin_layout Standard +The Lie group +\begin_inset Formula $\SOthree$ +\end_inset + + is a subgroup of the general linear group +\begin_inset Formula $GL(3)$ +\end_inset + + of +\begin_inset Formula $3\times3$ +\end_inset + + invertible matrices. + Its Lie algebra +\begin_inset Formula $\sothree$ +\end_inset + + is the vector space of +\begin_inset Formula $3\times3$ +\end_inset + + skew-symmetric matrices +\begin_inset Formula $\what$ +\end_inset + +. + Since +\begin_inset Formula $\SOthree$ +\end_inset + + is a three-dimensional manifold, +\begin_inset Formula $\sothree$ +\end_inset + + is isomorphic to +\begin_inset Formula $\Rthree$ +\end_inset + + and we define the map +\begin_inset Formula +\[ +\hat{}:\Rthree\rightarrow\sothree +\] + +\end_inset + + +\begin_inset Formula +\[ +\hat{}:\omega\rightarrow\what=\Skew{\omega} +\] + +\end_inset + +which maps 3-vectors +\begin_inset Formula $\omega$ +\end_inset + + to skew-symmetric matrices +\begin_inset Formula $\Skew{\omega}$ +\end_inset + + : +\begin_inset Formula +\[ +\Skew{\omega}=\left[\begin{array}{ccc} +0 & -\omega_{z} & \omega_{y}\\ +\omega_{z} & 0 & -\omega_{x}\\ +-\omega_{y} & \omega_{x} & 0 +\end{array}\right]=\omega_{x}G^{x}+\omega_{y}G^{y}+\omega_{z}G^{z} +\] + +\end_inset + +Here the matrices +\begin_inset Formula $G^{i}$ +\end_inset + + are the generators for +\begin_inset Formula $\SOthree$ +\end_inset + +, +\begin_inset Formula +\[ +G^{x}=\left(\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & -1\\ +0 & 1 & 0 +\end{array}\right)\mbox{}G^{y}=\left(\begin{array}{ccc} +0 & 0 & 1\\ +0 & 0 & 0\\ +-1 & 0 & 0 +\end{array}\right)\mbox{ }G^{z}=\left(\begin{array}{ccc} +0 & -1 & 0\\ +1 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right) +\] + +\end_inset + +corresponding to a rotation around +\begin_inset Formula $X$ +\end_inset + +, +\begin_inset Formula $Y$ +\end_inset + +, and +\begin_inset Formula $Z$ +\end_inset + +, respectively. + The Lie bracket +\begin_inset Formula $[x,y]$ +\end_inset + + in +\begin_inset Formula $\sothree$ +\end_inset + + corresponds to the cross product +\begin_inset Formula $x\times y$ +\end_inset + + in +\begin_inset Formula $\Rthree$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Hence, for every +\begin_inset Formula $3$ +\end_inset + +-vector +\begin_inset Formula $\omega$ +\end_inset + + there is a corresponding rotation matrix +\begin_inset Formula +\[ +R=e^{\Skew{\omega}} +\] + +\end_inset + +which defines a canonical parameterization of +\begin_inset Formula $\SOthree$ +\end_inset + +, with +\begin_inset Formula $\omega$ +\end_inset + + known as the canonical or exponential coordinates. + It is equivalent to the axis-angle representation for rotations, where + the unit vector +\begin_inset Formula $\omega/\theta$ +\end_inset + + defines the rotation axis, and its magnitude the amount of rotation +\begin_inset Formula $\theta$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +The exponential map can be computed in closed form using +\series bold +Rodrigues' formula +\series default + +\begin_inset CommandInset citation +LatexCommand cite +after "page 28" +key "Murray94book" + +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset Formula +\begin{equation} +e^{\what}=I+\frac{\sin\theta}{\theta}\what+\frac{1\text{−}\cos\theta}{\theta^{2}}\what^{2}\label{eq:Rodrigues} +\end{equation} + +\end_inset + +where +\begin_inset Formula $\what^{2}=\omega\omega^{T}-I$ +\end_inset + +, with +\begin_inset Formula $\omega\omega^{T}$ +\end_inset + + the outer product of +\begin_inset Formula $\omega$ +\end_inset + +. + Hence, a slightly more efficient variant is +\begin_inset Formula +\begin{equation} +e^{\what}=\left(\cos\theta\right)I+\frac{\sin\theta}{\theta}\what+\frac{1\text{−}cos\theta}{\theta^{2}}\omega\omega^{T}\label{eq:Rodrigues2} +\end{equation} + +\end_inset + + +\end_layout + +\begin_layout Subsection +Diagonalized Form +\end_layout + +\begin_layout Standard +Because a 3D rotation +\begin_inset Formula $R$ +\end_inset + + leaves the axis +\begin_inset Formula $\omega$ +\end_inset + + unchanged, +\begin_inset Formula $R$ +\end_inset + + can be diagonalized as +\begin_inset Formula +\[ +R=C\left(\begin{array}{ccc} +e^{-i\theta} & 0 & 0\\ +0 & e^{i\theta} & 0\\ +0 & 0 & 1 +\end{array}\right)C^{-1} +\] + +\end_inset + +with +\begin_inset Formula $C=\left(\begin{array}{ccc} +c_{1} & c_{2} & \omega/\theta\end{array}\right)$ +\end_inset + +, where +\begin_inset Formula $c_{1}$ +\end_inset + + and +\begin_inset Formula $c_{2}$ +\end_inset + + are the complex eigenvectors corresponding to the 2D rotation around +\begin_inset Formula $\omega$ +\end_inset + +. + This also means that, by +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:matrixAdjoint" + +\end_inset + +, +\begin_inset Formula +\[ +\hat{\omega}=C\left(\begin{array}{ccc} +-i\theta & 0 & 0\\ +0 & i\theta & 0\\ +0 & 0 & 0 +\end{array}\right)C^{-1} +\] + +\end_inset + +In this case, +\begin_inset Formula $C$ +\end_inset + + has complex columns, but we also have +\begin_inset Formula +\begin{equation} +\hat{\omega}=B\left(\begin{array}{ccc} +0 & -\theta & 0\\ +\theta & 0 & 0\\ +0 & 0 & 0 +\end{array}\right)B^{T}\label{eq:OmegaDecomposed} +\end{equation} + +\end_inset + +with +\begin_inset Formula $B=\left(\begin{array}{ccc} +b_{1} & b_{2} & \omega/\theta\end{array}\right)$ +\end_inset + +, where +\begin_inset Formula $b_{1}$ +\end_inset + + and +\begin_inset Formula $b_{2}$ +\end_inset + + form a basis for the 2D plane through the origin and perpendicular to +\begin_inset Formula $\omega$ +\end_inset + +. + Clearly, from Section +\begin_inset CommandInset ref +LatexCommand ref +reference "sub:Diagonalized2D" + +\end_inset + +, we have +\begin_inset Formula +\[ +c_{1}=B\left(\begin{array}{c} +1\\ +i\\ +0 +\end{array}\right)\mbox{\,\,\,\ and\,\,\,\,\,}c_{2}=B\left(\begin{array}{c} +i\\ +1\\ +0 +\end{array}\right) +\] + +\end_inset + +and when we exponentiate +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:OmegaDecomposed" + +\end_inset + + we expose the 2D rotation around the axis +\begin_inset Formula $\omega/\theta$ +\end_inset + + with magnitude +\begin_inset Formula $\theta$ +\end_inset + +: +\begin_inset Formula +\[ +R=B\left(\begin{array}{ccc} +\cos\theta & -\sin\theta & 0\\ +\sin\theta & \cos\theta & 0\\ +0 & 0 & 1 +\end{array}\right)B^{T} +\] + +\end_inset + +The latter form for +\begin_inset Formula $R$ +\end_inset + + can be used to prove Rodrigues' formula. + Expanding the above, we get +\begin_inset Formula +\[ +R=\left(\cos\theta\right)\left(b_{1}b_{1}^{T}+b_{2}b_{2}^{T}\right)+\left(\sin\theta\right)\left(b_{2}b_{1}^{T}-b_{1}b_{2}^{T}\right)+\omega\omega^{T}/\theta^{2} +\] + +\end_inset + + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none + +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +\begin_inset Formula +\begin{eqnarray*} +R & = & \left(\begin{array}{ccc} +b_{1} & b_{2} & \omega/\theta\end{array}\right)\left(\begin{array}{ccc} +\cos\theta & -\sin\theta & 0\\ +\sin\theta & \cos\theta & 0\\ +0 & 0 & 1 +\end{array}\right)\left(\begin{array}{c} +b_{1}^{T}\\ +b_{2}^{T}\\ +\omega^{T}/\theta +\end{array}\right)\\ + & = & \left(\begin{array}{ccc} +b_{1} & b_{2} & \omega/\theta\end{array}\right)\left(\begin{array}{c} +b_{1}^{T}\cos\theta-b_{2}^{T}\sin\theta\\ +b_{1}^{T}\sin\theta+b_{2}^{T}\cos\theta\\ +\omega^{T}/\theta +\end{array}\right)\\ + & = & b_{1}b_{1}^{T}\cos\theta-b_{1}b_{2}^{T}\sin\theta+b_{2}b_{1}^{T}\sin\theta+b_{2}b_{2}^{T}\cos\theta+\omega\omega^{T}/\theta^{2} +\end{eqnarray*} + +\end_inset + + +\end_layout + +\end_inset + +Because +\begin_inset Formula $B$ +\end_inset + + is a rotation matrix, we have +\begin_inset Formula $BB^{T}=b_{1}b_{1}^{T}+b_{2}b_{2}^{T}+\omega\omega^{T}/\theta^{2}=I$ +\end_inset + +, and using +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:OmegaDecomposed" + +\end_inset + + it is easy to show that +\begin_inset Formula $b_{2}b_{1}^{T}-b_{1}b_{2}^{T}=\hat{\omega}/\theta$ +\end_inset + +, hence +\family default +\series default +\shape default +\size default +\emph default +\bar default +\strikeout default +\uuline default +\uwave default +\noun default +\color inherit + +\begin_inset Formula +\[ +R=\left(\cos\theta\right)(I-\omega\omega^{T}/\theta^{2})+\left(\sin\theta\right)\left(\hat{\omega}/\theta\right)+\omega\omega^{T}/\theta^{2} +\] + +\end_inset + +which is equivalent to +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:Rodrigues2" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +The Adjoint Map +\end_layout + +\begin_layout Standard +For rotation matrices +\begin_inset Formula $R$ +\end_inset + + we can prove the following identity (see +\begin_inset CommandInset ref +LatexCommand vref +reference "proof1" + +\end_inset + +): +\begin_inset Formula +\begin{equation} +R\Skew{\omega}R^{T}=\Skew{R\omega}\label{eq:property1} +\end{equation} + +\end_inset + +Hence, given property +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:property1" + +\end_inset + +, the adjoint map for +\begin_inset Formula $\sothree$ +\end_inset + + simplifies to +\begin_inset Formula +\[ +\Ad R{\Skew{\omega}}=R\Skew{\omega}R^{T}=\Skew{R\omega} +\] + +\end_inset + +and this can be expressed in exponential coordinates simply by rotating + the axis +\begin_inset Formula $\omega$ +\end_inset + + to +\begin_inset Formula $R\omega$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +As an example, to apply an axis-angle rotation +\begin_inset Formula $\omega$ +\end_inset + + to a point +\begin_inset Formula $p$ +\end_inset + + in the frame +\begin_inset Formula $R$ +\end_inset + +, we could: +\end_layout + +\begin_layout Enumerate +First transform +\begin_inset Formula $p$ +\end_inset + + back to the world frame, apply +\begin_inset Formula $\omega$ +\end_inset + +, and then rotate back: +\begin_inset Formula +\[ +q=Re^{\Skew{\omega}}R^{T} +\] + +\end_inset + + +\end_layout + +\begin_layout Enumerate +Immediately apply the transformed axis-angle transformation +\begin_inset Formula $\Ad R{\Skew{\omega}}=\Skew{R\omega}$ +\end_inset + +: +\begin_inset Formula +\[ +q=e^{\Skew{R\omega}}p +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Actions +\end_layout + +\begin_layout Standard +In the case of +\begin_inset Formula $\SOthree$ +\end_inset + + the vector space is +\begin_inset Formula $\Rthree$ +\end_inset + +, and the group action corresponds to rotating a point +\begin_inset Formula +\[ +q=Rp +\] + +\end_inset + +We would now like to know what an incremental rotation parameterized by + +\begin_inset Formula $\omega$ +\end_inset + + would do: +\begin_inset Formula +\[ +q(\omega)=Re^{\Skew{\omega}}p +\] + +\end_inset + +hence the derivative is: +\begin_inset Formula +\[ +\deriv{q(\omega)}{\omega}=R\deriv{}{\omega}\left(e^{\Skew{\omega}}p\right)=R\deriv{}{\omega}\left(\Skew{\omega}p\right)=R\Skew{-p} +\] + +\end_inset + +To show the last equality note that +\begin_inset Formula +\[ +\Skew{\omega}p=\omega\times p=-p\times\omega=\Skew{-p}\omega +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +3D Rigid Transformations +\end_layout + +\begin_layout Standard +The Lie group +\begin_inset Formula $\SEthree$ +\end_inset + + is a subgroup of the general linear group +\begin_inset Formula $GL(4)$ +\end_inset + + of +\begin_inset Formula $4\times4$ +\end_inset + + invertible matrices of the form +\begin_inset Formula +\[ +T\define\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + +where +\begin_inset Formula $R\in\SOthree$ +\end_inset + + is a rotation matrix and +\begin_inset Formula $t\in\Rthree$ +\end_inset + + is a translation vector. + An alternative way of writing down elements of +\begin_inset Formula $\SEthree$ +\end_inset + + is as the ordered pair +\begin_inset Formula $(R,\, t)$ +\end_inset + +, with composition defined as +\begin_inset Formula +\[ +(R_{1},\, t_{1})(R_{2},\, t_{2})=(R_{1}R_{2},\, R{}_{1}t_{2}+t_{1}) +\] + +\end_inset + + Its Lie algebra +\begin_inset Formula $\sethree$ +\end_inset + + is the vector space of +\begin_inset Formula $4\times4$ +\end_inset + + twists +\begin_inset Formula $\xihat$ +\end_inset + + parameterized by the +\emph on +twist coordinates +\emph default + +\begin_inset Formula $\xi\in\Rsix$ +\end_inset + +, with the mapping +\begin_inset CommandInset citation +LatexCommand cite +key "Murray94book" + +\end_inset + + +\begin_inset Formula +\[ +\xi\define\left[\begin{array}{c} +\omega\\ +v +\end{array}\right]\rightarrow\xihat\define\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right] +\] + +\end_inset + +Note we follow Frank Park's convention and reserve the first three components + for rotation, and the last three for translation. + Hence, with this parameterization, the generators for +\begin_inset Formula $\SEthree$ +\end_inset + + are +\begin_inset Formula +\[ +G^{1}=\left(\begin{array}{cccc} +0 & 0 & 0 & 0\\ +0 & 0 & -1 & 0\\ +0 & 1 & 0 & 0\\ +0 & 0 & 0 & 0 +\end{array}\right)\mbox{}G^{2}=\left(\begin{array}{cccc} +0 & 0 & 1 & 0\\ +0 & 0 & 0 & 0\\ +-1 & 0 & 0 & 0\\ +0 & 0 & 0 & 0 +\end{array}\right)\mbox{ }G^{3}=\left(\begin{array}{cccc} +0 & -1 & 0 & 0\\ +1 & 0 & 0 & 0\\ +0 & 0 & 0 & 0\\ +0 & 0 & 0 & 0 +\end{array}\right) +\] + +\end_inset + + +\begin_inset Formula +\[ +G^{4}=\left(\begin{array}{cccc} +0 & 0 & 0 & 1\\ +0 & 0 & 0 & 0\\ +0 & 0 & 0 & 0\\ +0 & 0 & 0 & 0 +\end{array}\right)\mbox{}G^{5}=\left(\begin{array}{cccc} +0 & 0 & 0 & 0\\ +0 & 0 & 0 & 1\\ +0 & 0 & 0 & 0\\ +0 & 0 & 0 & 0 +\end{array}\right)\mbox{ }G^{6}=\left(\begin{array}{cccc} +0 & 0 & 0 & 0\\ +0 & 0 & 0 & 0\\ +0 & 0 & 0 & 1\\ +0 & 0 & 0 & 0 +\end{array}\right) +\] + +\end_inset + +Applying the exponential map to a twist +\begin_inset Formula $\xi$ +\end_inset + + yields a screw motion yielding an element in +\begin_inset Formula $\SEthree$ +\end_inset + +: +\begin_inset Formula +\[ +T=\exp\xihat +\] + +\end_inset + +A closed form solution for the exponential map is given in +\begin_inset CommandInset citation +LatexCommand cite +after "page 42" +key "Murray94book" + +\end_inset + +. +\end_layout + +\begin_layout Standard + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +\begin_inset Formula +\[ +\exp\left(\left[\begin{array}{c} +\omega\\ +v +\end{array}\right]t\right)=\left[\begin{array}{cc} +e^{\Skew{\omega}t} & (I-e^{\Skew{\omega}t})\left(\omega\times v\right)+\omega\omega^{T}vt\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +The Adjoint Map +\end_layout + +\begin_layout Standard +The adjoint is +\begin_inset Formula +\begin{eqnarray*} +\Ad T{\xihat} & = & T\xihat T^{-1}\\ + & = & \left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right]\left[\begin{array}{cc} +R^{T} & -R^{T}t\\ +0 & 1 +\end{array}\right]\\ + & = & \left[\begin{array}{cc} +\Skew{R\omega} & -\Skew{R\omega}t+Rv\\ +0 & 0 +\end{array}\right]\\ + & = & \left[\begin{array}{cc} +\Skew{R\omega} & t\times R\omega+Rv\\ +0 & 0 +\end{array}\right] +\end{eqnarray*} + +\end_inset + +From this we can express the Adjoint map in terms of twist coordinates (see + also +\begin_inset CommandInset citation +LatexCommand cite +key "Murray94book" + +\end_inset + + and FP): +\begin_inset Formula +\[ +\left[\begin{array}{c} +\omega'\\ +v' +\end{array}\right]=\left[\begin{array}{cc} +R & 0\\ +\Skew tR & R +\end{array}\right]\left[\begin{array}{c} +\omega\\ +v +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Actions +\end_layout + +\begin_layout Standard +The action of +\begin_inset Formula $\SEthree$ +\end_inset + + on 3D points is done by embedding the points in +\begin_inset Formula $\mathbb{R}^{4}$ +\end_inset + + by using homogeneous coordinates +\begin_inset Formula +\[ +\hat{q}=\left[\begin{array}{c} +q\\ +1 +\end{array}\right]=\left[\begin{array}{c} +Rp+t\\ +1 +\end{array}\right]=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=T\hat{p} +\] + +\end_inset + +We would now like to know what an incremental rotation parameterized by + +\begin_inset Formula $\xi$ +\end_inset + + would do: +\begin_inset Formula +\[ +\hat{q}(\xi)=Te^{\xihat}\hat{p} +\] + +\end_inset + +hence the derivative is +\begin_inset Formula +\[ +\deriv{\hat{q}(\xi)}{\xi}=T\deriv{}{\xi}\left(\xihat\hat{p}\right) +\] + +\end_inset + +where +\begin_inset Formula $\xihat\hat{p}$ +\end_inset + + corresponds to a velocity in +\begin_inset Formula $\mathbb{R}^{4}$ +\end_inset + + (in the local +\begin_inset Formula $T$ +\end_inset + + frame): +\begin_inset Formula +\[ +\xihat\hat{p}=\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=\left[\begin{array}{c} +\omega\times p+v\\ +0 +\end{array}\right] +\] + +\end_inset + +Notice how velocities are analogous to points at infinity in projective + geometry: they correspond to free vectors indicating a direction and magnitude + of change. +\end_layout + +\begin_layout Standard +By only taking the top three rows, we can write this as a velocity in +\begin_inset Formula $\Rthree$ +\end_inset + +, as the product of a +\begin_inset Formula $3\times6$ +\end_inset + + matrix +\begin_inset Formula $H_{p}$ +\end_inset + + that acts upon the exponential coordinates +\begin_inset Formula $\xi$ +\end_inset + + directly: +\begin_inset Formula +\[ +\omega\times p+v=-p\times\omega+v=\left[\begin{array}{cc} +-\Skew p & I_{3}\end{array}\right]\left[\begin{array}{c} +\omega\\ +v +\end{array}\right] +\] + +\end_inset + +The inverse action +\begin_inset Formula $T^{-1}p$ +\end_inset + + is +\begin_inset Formula +\[ +\hat{q}=\left[\begin{array}{c} +q\\ +1 +\end{array}\right]=\left[\begin{array}{c} +R^{T}(p-t)\\ +1 +\end{array}\right]=\left[\begin{array}{cc} +R^{T} & -R^{T}t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=T^{-1}\hat{p} +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +2D Affine Transformations +\end_layout + +\begin_layout Standard +The Lie group +\begin_inset Formula $Aff(2)$ +\end_inset + + is a subgroup of the general linear group +\begin_inset Formula $GL(3)$ +\end_inset + + of +\begin_inset Formula $3\times3$ +\end_inset + + invertible matrices that maps the line infinity to itself, and hence preserves + paralellism. + The affine transformation matrices +\begin_inset Formula $A$ +\end_inset + + can be written as +\begin_inset CommandInset citation +LatexCommand cite +key "Mei08tro" + +\end_inset + + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none + +\begin_inset Formula +\[ +\left[\begin{array}{ccc} +m_{11} & m_{12} & t_{1}\\ +m_{21} & m_{22} & t_{2}\\ +0 & 0 & k +\end{array}\right] +\] + +\end_inset + +with +\begin_inset Formula $M\in GL(2)$ +\end_inset + +, +\begin_inset Formula $t\in\Rtwo$ +\end_inset + +, and +\begin_inset Formula $k$ +\end_inset + + a scalar chosen such that +\begin_inset Formula $det(A)=1$ +\end_inset + +. + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit +Note that just as +\begin_inset Formula $\SEtwo$ +\end_inset + + is a semi-direct product, so too is +\begin_inset Formula $Aff(2)=\Rtwo\rtimes GL(2)$ +\end_inset + +. + In particular, any affine transformation +\begin_inset Formula $A$ +\end_inset + + can be written as +\begin_inset Formula +\[ +A=\left[\begin{array}{cc} +0 & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +M & 0\\ +0 & k +\end{array}\right] +\] + +\end_inset + +and they compose as +\begin_inset Formula +\[ +A_{1}A_{2}=\left[\begin{array}{cc} +M_{1} & t_{1}\\ +0 & k_{1} +\end{array}\right]\left[\begin{array}{cc} +M_{2} & t_{2}\\ +0 & k_{2} +\end{array}\right]=\left[\begin{array}{cc} +M_{1}M_{2} & M_{2}t_{2}+k_{2}t_{1}\\ +0 & k_{1}k_{2} +\end{array}\right] +\] + +\end_inset + +From this it can be gleaned that the groups +\begin_inset Formula $\SOtwo$ +\end_inset + + and +\begin_inset Formula $\SEtwo$ +\end_inset + + are both subgroups, with +\begin_inset Formula $\SOtwo\subset\SEtwo\subset\Afftwo$ +\end_inset + +. + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +By choosing the generators carefully we maintain this hierarchy among the + associated Lie algebras. + In particular, +\begin_inset Formula $\setwo$ +\end_inset + + +\begin_inset Formula +\[ +G^{1}=\left[\begin{array}{ccc} +0 & 0 & 1\\ +0 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{2}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 1\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{3}=\left[\begin{array}{ccc} +0 & -1 & 0\\ +1 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right] +\] + +\end_inset + +can be extended to the +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit +Lie algebra +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none + +\begin_inset Formula $\afftwo$ +\end_inset + + using the three additional generators +\begin_inset Formula +\[ +G^{4}=\left[\begin{array}{ccc} +0 & 1 & 0\\ +1 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{5}=\left[\begin{array}{ccc} +1 & 0 & 0\\ +0 & -1 & 0\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{6}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & -1 & 0\\ +0 & 0 & 1 +\end{array}\right] +\] + +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit +Hence, the Lie algebra +\begin_inset Formula $\afftwo$ +\end_inset + + is the vector space of +\begin_inset Formula $3\times3$ +\end_inset + + incremental affine transformations +\begin_inset Formula $\ahat$ +\end_inset + + parameterized by 6 parameters +\begin_inset Formula $\aa\in\mathbb{R}^{6}$ +\end_inset + +, with the mapping +\begin_inset Formula +\[ +\aa\rightarrow\ahat\define\left[\begin{array}{ccc} +a_{5} & a_{4}-a_{3} & a_{1}\\ +a_{4}+a_{3} & -a_{5}-a_{6} & a_{2}\\ +0 & 0 & a_{6} +\end{array}\right] +\] + +\end_inset + +Note that +\begin_inset Formula $G_{5}$ +\end_inset + + and +\begin_inset Formula $G_{6}$ +\end_inset + + change the relative scale of +\begin_inset Formula $x$ +\end_inset + + and +\begin_inset Formula $y$ +\end_inset + + but without changing the determinant: +\begin_inset Formula +\[ +e^{xG_{5}}=\exp\left[\begin{array}{ccc} +x & 0 & 0\\ +0 & -x & 0\\ +0 & 0 & 0 +\end{array}\right]=\left[\begin{array}{ccc} +e^{x} & 0 & 0\\ +0 & 1/e^{x} & 0\\ +0 & 0 & 1 +\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +e^{xG_{6}}=\exp\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & -x & 0\\ +0 & 0 & x +\end{array}\right]=\left[\begin{array}{ccc} +1 & 0 & 0\\ +0 & 1/e^{x} & 0\\ +0 & 0 & e^{x} +\end{array}\right] +\] + +\end_inset + +It might be nicer to have the correspondence with scaling +\begin_inset Formula $x$ +\end_inset + + and +\begin_inset Formula $y$ +\end_inset + + more direct, by choosing +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none + +\begin_inset Formula +\[ +\mbox{ }G^{5}=\left[\begin{array}{ccc} +1 & 0 & 0\\ +0 & 0 & 0\\ +0 & 0 & -1 +\end{array}\right]\mbox{ }G^{6}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 1 & 0\\ +0 & 0 & -1 +\end{array}\right] +\] + +\end_inset + +and hence +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit + +\begin_inset Formula +\[ +e^{xG_{5}}=\exp\left[\begin{array}{ccc} +x & 0 & 0\\ +0 & 0 & 0\\ +0 & 0 & -x +\end{array}\right]=\left[\begin{array}{ccc} +e^{x} & 0 & 0\\ +0 & 1 & 0\\ +0 & 0 & 1/e^{x} +\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +e^{xG_{6}}=\exp\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & x & 0\\ +0 & 0 & -x +\end{array}\right]=\left[\begin{array}{ccc} +1 & 0 & 0\\ +0 & e^{x} & 0\\ +0 & 0 & 1/e^{x} +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Section +2D Homographies +\end_layout + +\begin_layout Standard +When viewed as operations on images, represented by 2D projective space + +\begin_inset Formula $\mathcal{P}^{3}$ +\end_inset + +, 3D rotations are a special case of 2D homographies. + These are now treated, loosely based on the exposition in +\begin_inset CommandInset citation +LatexCommand cite +key "Mei06iros,Mei08tro" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Basics +\end_layout + +\begin_layout Standard +The Lie group +\begin_inset Formula $\SLthree$ +\end_inset + + is a subgroup of the general linear group +\begin_inset Formula $GL(3)$ +\end_inset + + of +\begin_inset Formula $3\times3$ +\end_inset + + invertible matrices with determinant +\begin_inset Formula $1$ +\end_inset + +. + The homographies generalize transformations of the 2D projective space, + and +\begin_inset Formula $\Afftwo\subset\SLthree$ +\end_inset + +. + +\end_layout + +\begin_layout Standard + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +We can extend +\begin_inset Formula $\afftwo$ +\end_inset + + to the Lie algebra +\begin_inset Formula $\slthree$ +\end_inset + + by adding two generators +\begin_inset Formula +\[ +G^{7}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 0\\ +1 & 0 & 0 +\end{array}\right]\mbox{ }G^{8}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 0\\ +0 & 1 & 0 +\end{array}\right] +\] + +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit +obtaining the vector space of +\begin_inset Formula $3\times3$ +\end_inset + + incremental homographies +\begin_inset Formula $\hhat$ +\end_inset + + parameterized by 8 parameters +\begin_inset Formula $\hh\in\mathbb{R}^{8}$ +\end_inset + +, with the mapping +\begin_inset Formula +\[ +h\rightarrow\hhat\define\left[\begin{array}{ccc} +h_{5} & h_{4}-h_{3} & h_{1}\\ +h_{4}+h_{3} & -h_{5}-h_{6} & h_{2}\\ +h_{7} & h_{8} & h_{6} +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Tensor Notation +\end_layout + +\begin_layout Itemize +A homography between 2D projective spaces +\begin_inset Formula $A$ +\end_inset + + and +\begin_inset Formula $B$ +\end_inset + + can be written in tensor notation +\begin_inset Formula $H_{A}^{B}$ +\end_inset + + +\end_layout + +\begin_layout Itemize +Applying a homography is then a tensor contraction +\begin_inset Formula $x^{B}=H_{A}^{B}x^{A}$ +\end_inset + +, mapping points in +\begin_inset Formula $A$ +\end_inset + + to points in +\begin_inset Formula $B$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +The inverse of a homography can be found by contracting with two permutation + tensors: +\begin_inset Formula +\[ +H_{B}^{A}=H_{A_{1}}^{B_{1}}H_{A_{2}}^{B_{2}}\epsilon_{B_{1}B_{2}B}\epsilon^{A_{1}A_{2}A} +\] + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Note Note +status collapsed + +\begin_layout Subsection +The Adjoint Map +\end_layout + +\begin_layout Plain Layout +The adjoint can be done using tensor notation. + Denoting an incremental homography in space +\begin_inset Formula $A$ +\end_inset + + as +\begin_inset Formula $\hhat_{A_{1}}^{A_{2}}$ +\end_inset + +, we have, for example for +\begin_inset Formula $G_{1}$ +\end_inset + + +\begin_inset Formula +\begin{eqnarray*} +\hhat_{B_{1}}^{B_{2}}=\Ad{H_{A}^{B}}{\hhat_{A_{1}}^{A_{2}}} & = & H_{A_{2}}^{B_{2}}\hhat_{A_{1}}^{A_{2}}H_{B_{1}}^{A_{1}}\\ + & = & H_{A_{2}}^{B_{2}}\left[\begin{array}{ccc} +0 & 0 & 1\\ +0 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right]H_{A_{2}}^{B_{2}}H_{A_{3}}^{B_{3}}\epsilon_{B_{1}B_{2}B_{3}}\epsilon^{A_{1}A_{2}A_{3}}\\ + & = & H_{1}^{B_{2}}H_{A_{2}}^{B_{2}}H_{A_{3}}^{B_{3}}\epsilon_{B_{1}B_{2}B_{3}}\epsilon^{3A_{2}A_{3}} +\end{eqnarray*} + +\end_inset + +This does not seem to help. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section* +Appendix: Proof of Property +\begin_inset CommandInset ref +LatexCommand ref +reference "proof1" + +\end_inset + + +\end_layout + +\begin_layout Standard +We can prove the following identity for rotation matrices +\begin_inset Formula $R$ +\end_inset + +, +\begin_inset Formula +\begin{eqnarray} +R\Skew{\omega}R^{T} & = & R\Skew{\omega}\left[\begin{array}{ccc} +a_{1} & a_{2} & a_{3}\end{array}\right]\nonumber \\ + & = & R\left[\begin{array}{ccc} +\omega\times a_{1} & \omega\times a_{2} & \omega\times a_{3}\end{array}\right]\nonumber \\ + & = & \left[\begin{array}{ccc} +a_{1}(\omega\times a_{1}) & a_{1}(\omega\times a_{2}) & a_{1}(\omega\times a_{3})\\ +a_{2}(\omega\times a_{1}) & a_{2}(\omega\times a_{2}) & a_{2}(\omega\times a_{3})\\ +a_{3}(\omega\times a_{1}) & a_{3}(\omega\times a_{2}) & a_{3}(\omega\times a_{3}) +\end{array}\right]\nonumber \\ + & = & \left[\begin{array}{ccc} +\omega(a_{1}\times a_{1}) & \omega(a_{2}\times a_{1}) & \omega(a_{3}\times a_{1})\\ +\omega(a_{1}\times a_{2}) & \omega(a_{2}\times a_{2}) & \omega(a_{3}\times a_{2})\\ +\omega(a_{1}\times a_{3}) & \omega(a_{2}\times a_{3}) & \omega(a_{3}\times a_{3}) +\end{array}\right]\nonumber \\ + & = & \left[\begin{array}{ccc} +0 & -\omega a_{3} & \omega a_{2}\\ +\omega a_{3} & 0 & -\omega a_{1}\\ +-\omega a_{2} & \omega a_{1} & 0 +\end{array}\right]\nonumber \\ + & = & \Skew{R\omega}\label{proof1} +\end{eqnarray} + +\end_inset + +where +\begin_inset Formula $a_{1}$ +\end_inset + +, +\begin_inset Formula $a_{2}$ +\end_inset + +, and +\begin_inset Formula $a_{3}$ +\end_inset + + are the +\emph on +rows +\emph default + of +\begin_inset Formula $R$ +\end_inset + +. + Above we made use of the orthogonality of rotation matrices and the triple + product rule: +\begin_inset Formula +\[ +a(b\times c)=b(c\times a)=c(a\times b) +\] + +\end_inset + +Similarly, without proof +\begin_inset CommandInset citation +LatexCommand cite +after "Lemma 2.3" +key "Murray94book" + +\end_inset + +: +\begin_inset Formula +\[ +R(a\times b)=Ra\times Rb +\] + +\end_inset + + +\end_layout + +\begin_layout Section* +Appendix: Alternative Generators for +\begin_inset Formula $\slthree$ +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset citation +LatexCommand cite +key "Mei06iros" + +\end_inset + + uses the following generators for +\begin_inset Formula $\slthree$ +\end_inset + +: +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none + +\begin_inset Formula +\[ +G^{1}=\left[\begin{array}{ccc} +0 & 0 & 1\\ +0 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{2}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 1\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{3}=\left[\begin{array}{ccc} +0 & 1 & 0\\ +0 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +G^{4}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +1 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{5}=\left[\begin{array}{ccc} +1 & 0 & 0\\ +0 & -1 & 0\\ +0 & 0 & 0 +\end{array}\right]\mbox{ }G^{6}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & -1 & 0\\ +0 & 0 & 1 +\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +G^{7}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 0\\ +1 & 0 & 0 +\end{array}\right]\mbox{ }G^{8}=\left[\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 0\\ +0 & 1 & 0 +\end{array}\right] +\] + +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit +We choose to use a different linear combination as the basis. +\end_layout + +\begin_layout Standard +\begin_inset CommandInset bibtex +LatexCommand bibtex +bibfiles "../../../papers/refs" +options "plain" + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/doc/LieGroups.pdf b/doc/LieGroups.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f271f35c0ebd6e0ff3c3a1e9f6d207ba15dcb5ef GIT binary patch literal 319029 zcmb5U1yo$kvNjyt0tB}ZEP>!Y1cJK+cMmZ5;I2V~yEC}E4DN1$!EFcI9nHC^4+-PN{x*YoUprz9@P%+A7z{;q%f*Y?li^PI{4L3A!kHcC5VD|CK- zO4d)Nw&uhs)HJbJ`rl z>D<($97ig1H~MULDyxp=z>D3MQT9PO30s?jGMsTrE>0&NGJjipOU1kWGmEYpE+pJX zE3|*?;{0dU@lNqW$b+iE`tL?U51!D6n(;4VZnq0fEhXO?2{6A{XG^Fj%x==U%0`Y%3<6o;D&?uE9$HjL`NS7N(w z7C&6IJt#IgTU5%H>hy#xnNMx>HBRVKomCG%V7k4ThUpsm{&I7d|!p{lFv1_(^5VP_xsW#{{T{{)6qq#O#-n# z)YK#pzifK6L`eIwPxLt9zI5o;HFO;>_%O6%~`I@DPL6B4ui2O#3)>RS&RPo zfb)%DmMbc*+~W#gbXwo;JJ?`lodCAFb3+1epTZ&`* zvEjiVsrYl|uIBbSy!{qPG!GdeVcjidC1AKw4f2Qd2DnPYo8$zA1a2*Atwwu0P>bl zdg81S{O%aZ_-s7>{%fmv;!7g0(jsr=S0#%BO9UOfPgF`WhrlrG^2Vq)n9eUXr0{i` zP@THp%!NU|+7bum1)0~@)uOYPSveNALgM;9S%uy<37)>b{!WChINzwKR5`alxD8(% zco_|qJ_}<0?Hl-6*zDBEN9#o47+j(C#WQWs$B9cr94>4_;Tr`IW#1*%Z%0^8h{2zq zTId~R*H;Z5)9=IdzqOT-rej7F0f>+7z9PQk{dLB5-z~;fnR*1g(BI<~1~KUaOx5YT zX>eOc?k1JjsOtR*t7W6-D(I!E!{#R?1N5dEOeO5g5cQ<5>}Fozjzer^0xn-DlXf+X znIY9|K-RAGOM~o-tueE_)>N3N7bKo|b?qi5=yHf_DMDM1bmTiMcJ{58d_Su}va-i# zRmb%oSb93}^YEEPbK@SDf0GDsWco;zpycq7;|`S^7Pm`P8qP~I2Y>Xbx=lRhx}&@s zf#WUXf}?-g|E2zg<1)WZV}6_IYelc@HlgFDYb@V@@?kWdkWGzzIsRM)9aq&Wd=TA5 z4}fF*SAs|U-g>AQw=M*rHIRN%UHMh?-z>SBnOisG8_O=_^4JDKidEpLJFlj{<9i_Bh{-c~?lAnIbHz7c+?#-r&y z?8#N1$5bRH6*}n6*B7V0f}2r0h=dy$c3@t{876Y^ppayoTK=RX9Ot7B=oSO$%~|Z| zFFP4DNqes)%DLxIFKO^w;Lm%q$i%sMLLFJKZha2@w3bUrk)m;GOxdH^PC!iwg{$q%{vCWK9B@a zg>cE6q&Ef=TR&&aHJs7f*2OYDD=c2`h8Vo+v7OCTjxfmaB~3O4FzKj$yts>)Wu@}7 zXuEN~Ab^nF5tX7uGe;fS>Im$wVB>%Pk>o zeftq9AJ2A-$gU!u%|Dk{Pl&U8`y<&adF5Im2CwWXCSyjuR?>Dk>tg|GSWR>D8wG7; zJo8=w)rsXVaT}cyk19}?6PJ{Lw=#>XQ{3+ovx z00xZj8%f=HpJzZ9QS}w;$ND&p*v+8@Om0t5;q>zG6oT|}s*#X6o0`mE%DvQMi#H^jK%OY3)~>*09KlW=>D#MH+MFn!h`YM*sE{04e+gGf@#OV~@(lyC7JLpD>~ob>Pto zOqJE=)QGCXMv%v8@wj>Y_aZ}S2%=KCSf@Ai!Nm@lwos!9+7E~fPrS^(BF|uQchpbQfv;0Im zpoh@KXGtbTt%W^X+~4cotMxBwA!$1|Kga zN6-vUqWJ95cb>w7VwRwwL?SLCBpP}~tLAa{E(0fvtwbN;d;XGlTp?A23vhW@Nw#yN z$e3SkkH=ScDt8FEV|tBMm8G$djxp24ES0CAGZhQV6Y=^^f&ACJVZhq*#e?-$Rj9rL zR9J6kXF2G~3CjE{ngdYqN>RC2yAd0W~roVfr1T*nRWzE{-{g z2Es@7#m@yVMOX9-ko6K`<39?BOf{r#X;)r_cnOg9kr@<;FFTo~*pq4bVxi-;K@pOWyR5v3 zbsvmz0%ZHffJ=8IGaNV zhs4r7HSMLlP4KTTAlkkZs*a&4rJeiU7~sRMJ!0d}QH0l)K9u#+Z;!e0r|5xI+>(~a zU|y7f8ax|0*Y~mJ!*9~r$Uew5SLuX#iOIP~_@NB$+TZIs-RlNezqCxw{IUJ1!{Ccg z3H4Ea$yR7K%E4shgctz>AD1j1oggFASwy_pl40(5uB2t&vxqUdSgvjqy7=o_hNMO( znQyp4*wa*Jr4{6l99Gmr%){nKc6+~bqjhF%93h26MX$(ctVHPG>jdgaA6FP&vp1Ki z(X$z-WNO#Dq3N>d&SDt5OT3E?Q{pjv1V`I<3guMRKd+1oGzdqX7F zAi2<&J2{(OnGM@Q(h{GJTy{B*&AJ}NddIFXsdgA$!3%x7Q1%p%og$XFTaBw1=dy)ScJ>q&?iusdv+~v{n+Ccrzg37agNh5O zPFzF9p}IequR9A)HZgu7(i63m4nqq%ILj09W2eBjA+v`#+#n8#H` zU#`hE2Mgy`AaKIxSW6=j$H8cJq3>iqHt2pj+B$F~j#aR}x0*aVy9sPdq^bBQG2$8{@3{jQoEt8-n6e7$-Q$xDI>ls0PBChs$f^Lm zXEjN#(%Nr?vvG$jz#*H;%d{gVr5oJy9gHQ#UT(PQKt|jMi&TJ1>uv7E_Vw$jyP_=Y zb3O{P877@}Tu=~ZZV=dWB77eeMu%0VJhe&IDriAS=`e`~p`^JC^z*K8!s1IPJ97^% zTfP~M!kE@nqom^)p@PZm;UwJ_6D9Vj_D^j|NOi@dhG8I$3c=+WqVDT*A644TT@)}c zys`7v#y}R5>CVhF2-lus98qVUZpG;VBEyXrPZ@!!6?BOjyhcD3pse9kJjBdPEk_4q63TuClf zSd|{Wp%xk*73K;XQe0zw6zp6+kyoUxQ-Us@4ev#=`Ncl56afiMjb}q8o|q zW5K6WA^vxo1n8!=z`ybLv-AhH|H0~iQchlOo|7j8Or0nJ|0oc%vvq#fJ5m0j1fKD~yeZJqNYu`qQkU(y0Km>c$-~Q` zkN!*n{B7q?yFd2+PzOqmb|$K(&Xl^(qPQd_tD331Go}7BdGOpR<(~>_oGfgVy#MG~ zjpJGV@VCtMEVKWy@N7~Iz`~Bs{`UaY*q=2#e=E5E)MEcDBPjTXhWL97?EhSVf8j6K z|DMqQPGF2yEjN;^{-oF9VRoMUies0jMhT{7j?H@?d+|cQUq6!0#4Fy3e>|f$v)!z1 z!o+#ygiazZ{=Kp*q=qSC>&xR4*)H7`=6x8NO$(0vXgy>(y~hz z2!%5Pouc54Z=nZobXPD|*?Nu*Atzdo3+Lr-3p3>Rdg)*1HWb}e;1$;l4D@W*FE_WN z{parpN9ceIq)%$KwejHPktbzb=w6?U|0cxO>;;8wFpuw$BoU_q!El>&=QB3ZO zR6YIjIO<=RJaGAeQ?~Ad9hr5?Zt;6p9F9a#4dW8VEf}z0Woc;9^G@4<9~L=_fC5lg z6p>69d2oUv$PEsVK%%yg6;cU)V-1i6@z{g|HK~Y|7ttpI+A&YlPnR9pEe?6U1N#;# zBvVf{IIk}#Z6N6rWQa;|CJMT$xt-;mEXN(HzDS$%jm%xFZQ7r14Cv z)*LFbsbd!VP6^sCf%B0+HzhQ*5g~uNP^p<5kRQxHEso5p>ebh_y|JbX9xkc2AH> zrsSZQ6SoEDsO~3@c~DxFp{x(HEd7dzIn_{V0C{;6O%z8BbG2P@9W%<9imm7B&1=&w z{uff}DWU~dXO*ZbYdQSI4&UwHEpTT^f|<4n4VIA8p3$itpg zCmiF1F@O0Nsi7H4>wXKe;P&Io2IHQk*cgWu#3g}UZ6TAiIwa9{t&eT5&FjTQ%`)aC zJL^;?^2m~YmZeo;`8J}ga8;}<{-Dn~FPxPt`i!cZ$L`P zJWqHDNuHALn+MNNVU>Dy2BtvrQmpF5NfV!bc+YCb>Zscl2el%wG_|#JRXYGxeK-X^ zTC-}ia!ZG|;%EvftV#O)oC{THbf#efzG)x(`BCNRfrZa9*&$-)i~^T0ER-pZeu7N= zx_TmXXAeFn4L57@1zNR1M(M}(r^}nu<1_kwgJDAQAi6bC)J)=QDpIbLaznH7rAx!* zdxx3tm);Lk4S7nM^Tk6%boeJvuhw)OvPY|X<<>HD4DfOG?@8QcJAFL8KHSZttYZ6M z@s}D4Ni+?=CV%pR^EetzePlxaU`@8fKuIDSTjIrs zn~H3jVvyg1!h@jV^3=|Lf(>)HnYMIF`Rfq#Ir17jq^t% zQ4)3Q1ecqfA0#Oheku67)JLPK&>6Fa_=NceHO{WPntRRXe_Owz`8m3WLbFLe!t8eS zX?wgz1Ko@M$))|P6hQ(m{LB8Yck#HJa&PB` zF)){Uk*ss65p|9C8UqSS@;yfc&inO7cuGOr0?GwlBkq9<^@2|9I@!!0r?fGC&S9`nF2DA0x{raW++cz znOBG{p&wMGfJgHO53LI3&2?Gi&eK>si!v%=ZCf_e5Qn)3F)W2JaBqYO>I{#NYA8rX z_+Qdes$8<{JHlPla1iz*%Ow@}zmkNtd=-;&7}jyMqY_B5_~%mpT&U$kxGf;^X|hk zK;}dT&|0W%Tr``$ny2$U04g10Fs8=j91jJBkRXw9P}bw7-T)8n<0QH6#T#`ohIvn+|9+T=Vo+?QJsbTZ71P;&>q&5+;0+d5Yo=mjomw_Uy#Cd9>D`t& zxMYKZ<>$`GROV?^@W;=0Q!3>o zSO^z7_@lO{O;oa$lg4zKGWcX9@0SP^>^@@yS0G?Rk2_+SX<_{|m_l4^KMUY3z0%@~ zJ9u6iKkWDncz2Q7_!rKtc*AJ)hFmk4jv2-%!~xFyyl{gItt09xOyOAmsW~_*8AD$O z68zO0IS($vZy$0SJ+x@_^wyegNU=zhn2(M;I` z1Y2mT3hCqJQ=5l?X?4X%S6wmY;7=yUNq&q+u(2qdyxtl^8R0b>PJJjg|M)BOwg7!O z8UEL0C)vi`-ggnKz0%uE^x(qY0$YC$k$f>lAVOOvu>*?n#-=jiM?}~+KUOD^B7`$_ zkpn7;bo9?uGGPU-4ZOU>+*}(tgKfZ9qQM&puXdc$3l7DJB`{HlX3Pxu{M^utH|~%I zo0*o4#*%d=U3zTz?GuZt*>@QmCb(@axsp}hcKKGNS7Q)MC0KvBZ(fy~%{)<41uf_N zjwZ{jyX`r+hLmGfxC;3<>|8bHqr0tZSC&!e#C6y@88XPlns<;2>kEwi z@qR?*ydAM(>rA(?DEwC9gv*|k^^tc|c<1ON<26rs%|q{ARE!sVn%j!TCU`Mi`iobQ zE9dpw+LJO=nI9I4(1k#(7Yhxb4RU2JuC<~dp%ofBHhbd>*IcJ?<;!WT2E6osx42u?RG)So{sMt zB&W2{`}irpnY^KiYvnT-M8wQ5-_v*kl8egJGtI_L&Uxtk*@W8^E3gE72cXAwWWgxO zDUalYezj)Y9yM)t?G4VVj)A9dX@A?Snu;qPMe{D&Si0IC*tUu5G_a~d9siA8o$WEP z|GI2X>eUnbzOcO1!;NJ`Q^>Vj5@$qBfNzje4Y%b>yL~$8;a}XxcY{4Ye-!;@{6R#Z z-+U8wogPDkkY^JRu zK%)>u`|V64YQK508vkZ*6|fRzwFdmHg}gJyyuM`y7Qys}ap;zMDX@8e+9;WTKXF$)YrD$wrYVr@NK*olh zlKmg_z<{Ka$pvlmuX7h~tYO8%N7C99?-@Hw!7lYQ^CJS=W@bXGAtke#Edy^)D2CCA^ifvBaklai^Un4OKio$VjOg#CYyg*fbh#=MnD zUfkt{?ODKAj?Y&T?U9p(g$R@(kvF1zC#LX2$wYiaI~;g|oAFXXcpWWa3;&6nQ1yp= zkn~pE!dw`U2u|4BB6niYzO1mZMBaM>?05zpd5iX@j^4|xv@dNfZ9Z)tK_q1y%SW5A zy6bau!{c>je0D@De=entJRJ!fSdbTiI3P~GnGjX8Zja}W5SlK5A&!xefV9WUy)(9i z3k$;Fy3AX;Hn8GtlBEXQhaLB-A8l|)fOPUFFqtuTg@u3-44H2*huf2tz@MpLSi&=^@I-o80FLwT(RCw z3bhu%d<(X~!!pp*XC+OhGBY@JfYr2#EgptAfOg(V7XWdvHpJVHiwe73PL2XCFD;0B z0!@qsnoMcPny$Fx-oR3|CTw8CgOxt=1ycX-O{{Cq?kd7$zRw$I1VWdEaRhjf2bymT+6y;PB_5Fdj7m?>HtNrZ8+xMjc)l_afA z35nyFp-%Gz5l*cyGtNB zlEK6Q>pGNrP}jfrW8DBgP9BI?h15I8gsIukXm;|Q&T8n5VPj>{BItMp6ivwiMAlIX zghUXoFzd8AZ_|Pb7}1zFS-67x?}#rfjs2}dS1LtDMrR#55Vmj6!$G~Kum54>Gt{EH zRln8h`M78bmw+}Rw8N<(VZQlR{(C&@cTo(ZPGgD_waVtxMZ>guvHvlOyMGSn|1RX2 zO~L<9zjf`;L|L-R`P0vHZB7w=-jE<`e|zo--~U~Z`)eovI>!IilKuM_pBFJ=feC_k zjT;JjKKRV9s?6H#)!W>m&ly&KF1{Ce}hyUX^`m^EK=L-_GZ}3 z1KEUB9AJ{HE$G|Sj;UI!8D*m|kfu=%wKh&3 z6~CWP9AMlQ^r{U*B&;NG5gmqJR{}uhkDF#!nPeY<6=_K7yOQHJgWw1sk)_d zsyxOa2t5K)p+gC&wNfbWr6w!isb^sNPniaWBbA_zU(=Jrl0##xF6i_rF#42Gr0|VQ zA{udk!B~a53^3mmz#2?V#%eZS_7*b50ZtK(iz4E*R>y@|q(S9!hX*6l8W?06WNSrP zFCwmFk3DzK61BU#naHeZxs-a-vEa}-*hc03puCJpDv$H89`kAoB9T}_g=aZ!nBgd_McCS%u9SsF5WPUd)eh<5*>O44zGB*4*Chg!2$ zys%b*9^>%8(gEv&=C%(aL0gCQ;#I?DXyv1Gr6W6Dy!-4a;YhxRrmL6Z?-cKi-$o38 zR0(f#Q<{Hf4$asd)SrfO zU!5swT_`!j>rMQJ2cyaLrNcmaT6583ndI!s;eU)_MOw)KfhHrdSp5Z9K*=~)rW#eE z1l3E9+MusUDwiB|Wd^j#lQqI+%Cv-MCjOb(R>sVv&+Ew*xl<|)+#H!Cohu+UHO3Ko zE_+ziE>3>lVJqKn;sD>n3RO8^z6rOGDK(jp>wM`u$W*OP*BHeej>dQ?0euR~RumqB zH~=tqH~%%(KXTaYbNpv&YVc>Jm-t~IWLh*@>VGWHKNQoSxx&IPm|wvzm~qEFfOuFD zowRZCYt-u*Qh@cEJ!{Mg@`lQ3|mN&3Ss*K74WT7l>J3j`uM zlfn=Y^NVGHGn~@G#c}e&Y@TKRs`!>xJK_b^z1&Z$t^EyugtVVU0)A3tWwy{hFPn&r zY7v2tfAv52@LzWA9!#~^MEo0eF-!|Nv+}oR#JhnuL!9~PiHN2zFzC=uo?SIjE0_%7bk>-d&(Fs4r*MK zQk5#Z8%g4$O9?r%ak#ysCiBp}9Vda^G&Xzt#6`7NdhbSpymj?DJBKA#H9DOn0iDb& zhHD3~_ISIWOOBF&bzEHmu)Vx>h4!<{Ao@?2;WdmHJelS^M&N$zPUa zwy?t|#3C2PeC4y_`i7{n^>&tyV6cke*UQB%(U;EZ#6jP(daxryVW|FS@~>!Cw1pq? zH{;|j&oV!b{*+a4!N}5W(Ras`?Ng<AV+WqUBG9sq9nrLRqn@34fbTJ#15^wkS8d1xT3q>@wH#-b2V1$t0jVJChYsYBK%N z7FHryYoe1Rq?OW3aci1fk8rAh57QnwZ5qcWPs4w~!3Mbu9Yl9 z>#jIkr;*is>r^faXAKy^ITQ*hkO%J~L#TNeFCpZGe#xrVQ9Ba6aoxr>^3e`vWgHD9 zfR%ez=qEK%53Md;uis)b=V##Ncwd`B>+eq+q9@QH8}Vs ztFjG49G#i=AbcE@!!@Ne=^HTIgRoY(Rl3q#t2D5QN(zu%l`uRQPqjcrdnezVK@EQP z4l#ntwJ-inIQ2a@X>N3?)IJ4icnWDJf48MJIR()=3x&Mpm?<%Yi+e5WL2Rn{6d&Y6l$7jJCKEPZCx z{H#2@Wqf?kOLPu#&sEo=BmpG6HCCE;g2INh`JD`92e(*Q(e%H=Ld0|i1{M90N+`!I z@gclQ$L#kKMb-*nbJY(G^q(Z>Ie|+=51QjNV3~-*giXAe%qHIYY-4{ESQU?3$H_T`H_hkq9oee(l zfcEjBP4>&b^GE=1yjJ&T$24KyFaVQ9h>Bl;;{C_aFa3n4w&bVak5%7hRQH9Ap~i;+ zpyT5=`H#g+HHcuZs>zkdqeL@y8xg?u^}^JXDxp?@d`q9lZ<*zT4AJM1<)Y=%mfvq} zVL^jM%U@ZZMx=l$4H1e3oy@0d8K~9g+1}}QRo?oS%4-Jz(9<2pNz%P-g|^Qs^js~m z$u7L>Y2ItwtnrurQk#dL{5P`Og|%dq2d<|hUB4?Dz3jeoMfz%!d**eNv+6~7wbw^1 zjYbLHWV@3It_FVc$&OL+s(N0?qeY=!0HazD7OO7$Dq8in8}Wnh@HPP5wWR8DK_QTi zVSv@59)TBx#l&NN9uHiU4giZ~l*q5!Mgo#XxhhGGg~y#bI$IbZA4pOmOqsIv$r?5@ ze%)q1PDpDhjT(Kt=y?XDNj#YgCLP$A3U%@wYF*Q^B}5(Nx&S4T8hQ~pu#cXP!r~e> z_@K5Ji|j}IfP#$&0GeQNx~#g-bQ(t|Z_bmu6-=uvbYz?L0}-$tkB4I;r{G(!rOiAW z(l{q{onn7MuO z&o4mH0yB!~J(G&umb9|;h!EN}dlA7JbVdZD^|9H{YS=5MfRy+?eQ_P%o z!xHt;-f>1c7VS13F1o?_efp|PQ%l?UR0f4Tn!2%makKgNVnX)7i0}mUrKJu9ub>|q z$#=xPy08R)`k%h-r9ob5mZX`G&nLlL$T2rNTwOVhJztf zYCmp(=i9|-Wyu@a#5>HwyLF4-9PT)bu+fVe5wqG}A5{AnPb9F0bsfwb;$1EVO(fg| z@-XaNjqKE6Pv4clVc;{cGROuA-Z7XeE*q3ps((L9fDWw{g{Z0bV2qz6Kv4{5B0TOq z%-7R@jhKP)Po2$QLI_Vs%)Y4O_ey;pd zfmEUgU~C}<->m3b>Ux^zJ8mkr66~f;eFPsY*p1I*Xy|Td%j@}kgTEN3?fj%q2px7q zU*Wgz+kuCx6fBIYSCXt>2gF4}7ym1X@n_xC$M+(mj!iJ_ zwhl@h)j{x{ugX-IhZVzhZq4xM5L6ZdaL6Qz8rJ%Y^R{8q+guZBb(W7@SuL~YNx}kv z%D?JpXd2Ze#DB;t)maO=P`hYu94%HtA_x^VP@exPzZ^~oE2faT$HCj(7f=7BvQkWN zN;Zhmt|=oq6#Gjl<{OtU0z&l0(r|uyk6Ob^vSwCt*q8yrF^r3w%a`+EAXHm|l}*fq zmnUjMS2+EQRBw4qt>_V6GOYS6}D9p1rh$}{(<=VThDJ$_j)f*MT(bPCg*f`{K! z#(+EzXQ;L&@g1zca?kRE93-szIKxb=IH9uWYG+bHvLamQqtUEM#2skkpw9YXVP$3@ ztIo(O=)4a{pq$C+u2s`!>7$#+(lt23TUx%SI|33`J|Uyx%rR%X(QUWkvoC|d`i=G} zeD*E)@3Qd974-2>ItR4^VgM_Iaj%%xuS#8=2d+;1@k1?P?HW(!kO9nYHxis4p!%JNGkx2%K9?dR%b5g1Jo42yS_1k8qQP)S1D)5Gi=Wr^ za)v{t2sG3QE=ww#6(bPFi37G_{R9f#px#B5QNzeIi`ttP544dX$nf48EH3~~2;XQXuwe~Y5s6r`LS)wjq-KjR19bg11 zz5RUdhwPo)K%E3FNmdLMAx3lDMSk5-=Hhg}$7h)97*U6#Z4oI?tZOB>$W|`>I{=M< zWJ-DYJ($wB>2y`O9L2csOHvqCcxwc)X#$R0lC0dS^zKDc++7*!0f{MIzsXbzl$NaH z6>f~?u$KDjT|GMz@|p9iO%~$}sDE?0x`yL3=cb0LYsETH#!M_HFfVY-GccG>N~13E zho<`>C<5f{-4T|=MV@LCi7X8Dl5;!^%e@kZ%BJtlz%Mo`Kf0vDc1X>0264BLfOy(? z+2N>{&GrDiE5j$5k`Jq>tlFV^zJ%nk$Xe~E?M$N8;-~NsiykCLAg84eoxw01bhk!TNnbMV5B6R5#xWUTxV z(IDDIriXfYAZJgJ)|DlA*eo0hiE)zzsDd~+k`A83;c|>7x6 zIw{Oxd3y_rgO)@A7eDB)iv#jOz`Ocwz*_1=+bU0iCh$L}hs&8^i{ggG@{ zCvo#>X4>p070J{YICI%&VkN#}lAij%~GtZ^2J~n-TIS@fH^bhoL$pw~4Z7alpD+ zySi*TvJo;&26G5#8pt>A6)%zP{Bvgi(({#wRItkkMDWWjm6qW%{ z*|^|1l8lf5(Y<(t*{#EdKKTC(i%}YiK(N01=9}r@SNb^Bp0&lORtjh~7f) zH-msOus*;KxT^sY`x3~n&(C(E)Hb&`m2WGGcnk0AO&dQxlSnKd zSMej34LQweRs=`Nm-E+#>u>}_-oxHJg5shwj*_)}((AO(-1C3%$W_>n!G`tSezlZ% zYs_T)a`LBkYAFOvM~|AF@6u?HNM4^*V>&Iypd~|NuD`^{3QEB5PjhRz{(ZP{gB}($*?mjwY^Dh#X8GO=5QXDUx`EfcNvE&M|Os~bu zYxadEvzH!s<3??y%p)R6lxSSWr$%C97kw-Ee;SJjTXOZ{3zvEYmww3 zrmJA>b>9o)Z-8=qsW=^OJr-+a1|X#^3_D>RRCj)glXqaQ1V`<{LY-|oIaCY@2!c7l z9rdz9`C)yTv)ak2p%U=s%V)j@L52+c;IG#x~=X1jHwkjutH!6F^3j#eke<&Li$F0Lb;i zo0E6ysl$Zs*;lrrE*LTgpkGmX4Q{MkzvQ>kGoXnFgwwMy{P^?gsNh}GKHW9x&fXDt z5-qPzHA0#uA}2^Mt@`}93*13#fMh2!Sk5e z*r&%C50(t*OudVEsY=4;A(6P6>#J+FP)mva7U5B1m5>RJmgp`8QwRaJY6~C8Kz{oo zS+ZlUfRpGw7B=o3Ip{))9B@!ah{l~%r?ic$^`k?9KI%;J7-QxNRspl~JssG2%lU)f zOie1=mPBUlyNevJK)ynuThPxN`QP`}^6e@Q>2&{2uUoDH?)@I5y`zpkBxp!#R z@X^zk^UD`zx#DB}QH5(7vP;HwuC^iXPuze5F`y#Qvh2sgO1uvlukEog$)=f$9OqG$>9@I9T^KrO z9-?|fS5&RnaArSxR8f#;bbVQ2T;l5h0Tj_eI+A^Tk=@y~e?Heq3a1 z9!xFSt6XUHQGBn_S$hBNL5YRn(tb;=9bHz!9 zvYf1Hsp6uB9dRAZHlcgizJLhHn_jM@NwJJ~cTtNhDzzq?-X^pBHXmfdK<4p}f-Y@i z7iVqzTeoU_*#jC_VqGM<>s%lXhV!pUaXX9V=T-%@`xXqDGavG)zz*XR}ewc8{+NEBo&f6!o_K>4c z`hxzDoH}<&F<`yG(=a=f*C3@dB>P4j5dRg|%-YAOb;XSvbgT#AEfg)(lT=CRZG(Ja z>^yEuqaD}zo@oP6bcws~{Q=itCaXO9^K}L<*|cTFoebxXP+0f4zu*&0Fsh6Zq}6K@ zRpjKK=ZWB}QQyU^F2v%eP&eXo#6BviS>xNnU0eD_=p$$lW}z6od&lL2XPu&l2UhJ( zPkXn3GR@U|JeayB4u~?vkN&hfDN$RjwIbNETI}A9P>N*_??VAo+flmXG7r?XDt_D2 zX;o{P%;kOoc#f%1F$I_hvP#`z%f#F2PVjMq!pUo<-T>+`G@y0AWsV|VC)|8@W|H80 zYJA^#%Hc0CmRvq*9H_iRJI|s;Z~Qx9iHMhW3LY#F%vv$Cp;QYal=$i358v8)GH8_@ z5d+#`;!5y+i;_`JUe-dAQ4i~Od-lUf@WKY5<`=Tv zi(C1rC2QVz`Kk1t(mB_4kP5eTn4?&A65WTLy4Wu+D_N=JGtfhfw-Tb-8I65WvRn$! zE_4Bscf71QITW>n@FfQ~*zheg;CA5@zIP|Or{twW04IQXsLDF|UY<*5*Uk5HAe3M% zJ)zz>q0nn-k*n*gxsc%jAU`gj(WoF}FRkVOqv@-oqWZqKRZ76Yk2DOSAe|DI1_ebx z29)k*2!{^Ip#&8{q+>|wW*E8=qz4cLX6PKcyI;P)wcbC^xqF{`?!I@Od-mSXv(KRw z-l=oV=iTCkPa=IJc>tvvDBt#^D;1Y61z^fnV; zL@Eo>S?+tIT3n5Shc{47tBGMG()n|H{vRmb&5^vGDvQv|)+};+!#;};^fP6%UxZWl zdD~?BsS`4+#b@sco5kupQOSsojH$;@USJFnoHvT+G8?j767N=j%0w+4$w7=Cp(tUg z3Hp&O8pW2nrWbzg1%~6vx*2cr08yFGe=pvzB?yG187RJki(8^{W9T1M+R-p5r9@V= z6FT~^3*P74^a&msGMDI6_yJQ&*IMqg?Tw;F=*GNRt~4eCpDh0S?2MXjcNnhPS#V~M zjLv39h(+dZR~BA36uvz8s&Z%k?Zbb;|2e0CrW0^6JNwkH65?Ei^^($iP7IuEO8#_( zr9?jR2do?EKkWR_!bb3>KPIloQiXI8j{h=R> zdydfw3+sbrv5A%CM~d`bp4s$QsH38u)_={a#>n25%tgl5~h+e;ZXW12QrxG)tUF*9SpMt)LibfMtOD5NRt0uJ=qcBI202!m-*bAO7IO2#28DYm1 z)XU{eZ5+RT1iXLpZ?GS~nw6KaJOr)#Ps1%ryd`jHUV5I%`rwo2(kHTG0gbn?1F(O* z1`LttT-g&gj}D^jP5{8P!AGF|uE-}szsfZ>6xo8b5U@6d`46HZtE4&HkMH`q!+AOgLVKJQA{OhEQDlNp)lx^@W)_WbXJa0a&V zk{PMw>pyw;4tOyYoDnzIg0+aJd$B&sfUIv80d`5Y{t4|N4hVo$h{2j1S?TRdPFtZT z^I2w+(bCCrYI&2YRjXo|V+r%*`J8?JnQyfyBQpbzHxoM>-r|+~Ub9_P4fbrOtM6Ez zo@Ai6VsMz9^+H>Pjxc0p%71cG-Sx4v~CbG{;fTonv% z4U#=w#8A?4shP6HfkalK=vl#pTu*^a95=>~v<5{zA8Jeo*;7_~1dF%qQk+|=BUxJW*#exLkE~dn}zRSn5HO`sgWG3^sqPRBUGH#(z)PHl_XGFdVrc zy#C)cA&%p&w_2S?t*(HFS!=0Wv%`Cmv`b|*inaAV@cJzyuYw0DcVho`WsrohyX94V zdklo03DGp$@V+Kd7cjLi5Yxs#8Qjz1z;9{l(49jD5oO1PfLrg2_BpUwhc;E7>nJoA zvedCCbK>R=n}aI39u^f)6sSEb6{;r%eDiLDxbRKID9<6>`K7|Gf3M1@Z6PZnwLkkM z!By-T3Wrj7XQUFrvV8HQGw7B;qZ!tETd5o4%gz&|2XLCXK$>T5HvyU*q%*pestdtLLM|e=iVyEL!T>b>WMA><^efTfI%QvXrGgaLV*dj|$m{ZPvD@>vEIzih7iPW=! zjaS%MB0x3uR(NrOfkS%&xINA4)tP2bJ{8z$oQS0vp&# zVYi)lla~nnd^l*9YvR!bn>J4snovw!VkbpI)Lc^=bl7O2$&+73sV(qJ|2Ke0%p}@H zZ{WVHiPfgyf-SUK3oMkUV0-d&LX3Te_^(dvN||-FswTWE3L9B(rUNTMdO-$XP4{0X)jfCpzkjaNmT^oc&hVScBZ$8p>YMWc2(iD;oU-TRYt?Y-*v@EcKEb-KX;|q@HHKa0h_F*M)?FZ0ixBGx; zi$biR${V%*a{nLtcI>ke=ojY{NWWM|YJ+7iy`527@OZupP*DgpF_#XDpkzTNtUi1t z138FX`EUFze5ZD690Z5pmPLGk&`@_w^BD=~HY<$=Q&H|vyM%FRKB3PUcsqQ~o8YPk z?Eo_L-*#f}6|=s0uZ?wTfX$~7eJk(`$<6QH$DQ$x7>nJ}SJ5`m_g1mj#8+dj-w6yj zQR}v3lduIU^Nu!YUs^sYgX1s!E}P*prJsjDnPAls{_;H(87*6J) zus#NCShqAM+Hq0{mkEHfY_#Lrval=9UmBQ*9Wi}FG7gZ+f^Ptg1y&@&cFj;*Wc958Az98 z(LGLQZ#1l|%wqW%Un{?*rHn5Nv8fse3)D)IQ3!nEWom{0Lp2x#1b>@M-{7%+uZ7fT zTml(R?%gn!T-YAj(trH=1iaJs3qiSA7hstPLdbS((TxLU+Fm@+KHies)lm3{ElqD) zwO^2M8r@pR8deNMCN|*_q2sd zClf`EFHgYZ^}*t@5_bJ)rAyWAq#|qGf$O69x%=Sp=A|CDp}Ex7vtiwy*2{a(PscF@{2ljJ4(d4{BVV&@0G zqO%tWKA$Oc5$2)wvLE4#n99?Z1qvWQN34d~zG8kjyUx4=19)|n!2CO_5Mfq$`~&bF zqRQdFG|OL_1-zp$94N<#8$9c{HnXSO0_kWgB6$G*MCUd4r!vb{E~yrnC=Gt)tFOFk zwBjBNal-d0WJxHp0{T9F;@=~5Ul7(=oADtW)`+!@Ukt?%l1r5krW@!vT^^RHafV|B zI!1M%wO@3w(o5mN4oQvCV{DF)-#A?tT9Wn z(lTBD$RlpNyHvGg=!u;9sDF(VD4g_n*|%(T))H$m3^S49y)>@@gJsVV{xYRZ)U&1? zAnVQ14Aa9Q+z^{_$Wf701vz;zh%KKFlZA@oygwLxn%4%b&d13?a?viA`9 z>1ka`3n#G4#>TW52d?p`(n@nv7Xt48b`nn!8z+&rzk3A#b$!Ol-h|1^KU3_9Q<$SZh~ZbGPG*2Ir!k<<;sms zIo?2Kv2XvI`0cFs)9MxdgftjRs%~n2bXX<}Ek4Z0pT5DnUVa;C-l#5JIPmgAPNG>N zC65!^@kbN@dceC4SJ=Az>c^RB8=>L-(sn*i+1@-T zM1#{I1A+_%%uK^3u<^m%!6odllpXgroJ&P`P{Y1!@NBu9N&@W1aDmhvJ1M~b%B2nW zFpd6@=8Q_(Hd?u&gRtz%v2GLfioZapVqM_VK7$}D!jL_*vQ_p*&jv3{35XM2DiROe zOv0xCY(Fw7dECp8U~&q_`!ggtP;vjm7cp%j$ficwV;HKP-z?*&)IZ;M6c%}{#NfUA zOp@u&ft$>L`H42mtzXz$P6C=YLNzB-zN5P=r@l2c2G!R*C{%66Cw&uro(_c%{{_q~1 zhv)TO_=@IQLgf$6rH2sg&JW967o?hLn`5!;e=j`(VuvM>=(&6WT{?DrzhNLqs%VCq z{W}F);Uz^gnZEcSen0_>5`*PGza`kD#mLxaLz5~BFWHTbbf4Y+N7ZEW7+>3E?;A`| zj=Z41{RRG=+KVqvfVzzKd&bzdM=lrP??QK`c=c>zpWukDKKVSh%QY4q{EB&*7X$jD zS}Z>(m+^Im+j%v_6b3ANHn55Yq5X=t#rEvEAHX{bw-$a9S%q-)5WcL!yPz|&TN5i$ z=d_g?Tff`ysv5>_HqRL00c*_Cdu3mlnK==k95kh8VitEfnf_hgw*bWP%}HpKk%5VO zF?yvqs+#-!zvKLAZ(o>e77s&FHaG3;BZ6s7g(kdY6fdA&sa&mV_8^ll;(wh6Lm;)@ z7dASW%=TjE{zpx%U58g3Vt;}vD6L|DKS?LUK83W=V^u&wI zUh~@hMP=4c8#$|xQ%8*!f&Z|9-!{wy9Yx`z4Mt{KbNTT{d^5|$a>bbER`X(l1`Ah@ zRx@DSx@|%EW{v70ItGsjVJUQN{ff`l(rS+NHQM}N_Nl!CydT&!Q>Q*bKxW**M1=kZ z9eLJUybhip=P%Vh`Tg!17fA|;02y~V-M!plbHhgxdT)e9UMOB<`_Sq>6D-uOog&lU-#t3puaai-${rZVs0H2Mz3RkfW95}BD zS%w7v3$X^Sjg34)CD|TbR6%jmt}A%cEd|_|*x+)vr@t&h0>fZ|?>39yRFThLjRIf` zZObWG`l0I{5#Q;UB+-v|K-2@kDQPGb4~%CSo=G1eR##MSEu_qPPTZoVNzmh55TgR9 zXTxYU=iJujv^TW55&o0VSo>nU;uH$JcHR^h34u+Mi0!-D9=W=RWES8l(N|>eNgq~( zN7f;`hLrvcgb}f1#BdROGb;D%5X;o3azcc21E*_Zr3=Jv&cGJ|+v>D?MCreGHHxVS z{@~hlt|K6W2HqFSqq)_HNHBEhzh@S1-B-|Ckg*In)!yI{6pp(68pvPjc=Fk4?mv7h zx4^T;5hs({gSIM=#i`d{^O|30R5$zNyq6$g&_d7*4}i!%%Y63*Qr^L>{boWQ5T7-> zCA8kGFo!WkNA6yxCt%G;`3PBo{N-AFcRLT1<>SPsvj46iy@b>SLB{734+XI@sUJlrn0XgFUH@ATLR}} zb3#BQqv4Dp1@T*qe%9R6`vV~`C6~Ie0#|*XGitKvq44W4WBU?fog3P72po-Z{x0Nk z7Wm>{$z60sKq5ci_pY#rd?3wphSnSgQ!CBnp|9xmi#zKH!P@qc_(JTAumnsa)L;Xv z4EY2ZEBzN>T8Wj8rj=E%S+%DJWARC@R`5nZ!v3!yInggeV{UZ_!2$5E@tr zCn3+*5R`G=qn!U-v)IXhRM007X5VJT{$73X(~tBoI02s{{Wl#-!v6#`>5_uRo2083 z4DfDee%(>W-8QD9_N>oWv$aSgHDJ=ZdL>hY#&eNqgtdZY;NcdgM8!q@;8lJvA5*#us{oL zgaRtN@2y}0krm$Uvn{U6udpOKrlKEVXDfyuIQ#^0CB^}?9DHH3-nKMCKbi;%X~MvqWX zJbj92B$Bp}$r+N}KBX+Krm9$~p?ieM+2ed0-mpjZZPEO#j2CJ&2tus_aN*V#JH96F zF}Iq$Zzk-^p1b-;GG;(J(>`ugLXG&OCvXHwh4?z}e#HX|7|W~Eba=Q~I*02~lKH?d#h=i8;}&?t(joUB=jG;7lra!e zJXk?|;db8&)jc@{Gh1pUcK8ykN1OR{-uI89JVC;boT;dqeq3*5@C9r*#_2tR3>^Go zvF$^x>*6uX$xi2-`OH7`dEY^0rBs>HVqQ%((r!Q5xBwH!_#dwc$_SM3)w7 zc-CJQ_oMnW$FH(*VC+V`NyZ`ay zH?Q_`LTKPJ+a#=z2cldhS_zSXDs1dRx-{FbsjHv+1Ai3iH?}H*b~Cg!%|+iB)Z1-h zwzG_Zn&X-_LJk;2-1sl<^=^+|pnJ8>Wz~)-cWH;0A|5bCrk{xR(jMW`lFYYLEQUez zvNjs*Q4&D}=WDglyObtazm^2gUk%T)AIU4svoR(XjnCDAWM`_`zCk~FkaWPde5Dt4&${K50^&Kfn0p$~};wgN(q2(N9y%jBd^r*iJ- zT1}6%KyaW8ZL+t;{=hXQ8QmQ{@v3kj=vfRv)}V1~Jbm+g3|tl6Z2< zJq)b?06%26R_)Q-R`rnbk>8_(I~YCt`5amVTyqYdQu2ZA?`P2OZ!qqUpBycfL^=-{hW^7zU>t z|MvzStgS(0eCxM8MMmh@OR$z&Sf~-OZRg*g*j(_THoC6TyQJk|0lSr}Ku}SyP>(}w zJwx^^C`v&yVj3IvEXZm%Pu;9~bT=!MERh;wmxg_w(+>A5Gw zPgz;|7mr#E80<27uxa??Kk7`f4#CB-$l<^$suenRj@z5v9Ghq zY*Ja~9$^_;(+f_Hiod;XRHnXW=kV0Vvtx(3>!#)ZFZ+P3DH(Ngk9+|o&;+U|uR2~6 z{K`RGFF)1(MnzQ(KDAXhx)!OGiB^Owypu`FJ=}nq)FY;P(fHo44z(ex;- zue1jINMgoFoj+Ws7h1`Y)FR)d0T~x77@T6L`6U4s(s?U)bJUAo?s~dSD*JGx>z_A=4Id(X{#bye)7Rx%RXMw-ghKl8$Sn+0)_E9r9u6|t7h+Oo*# zI~9x1KU|rodUGc^(j4~LzmFFOn>DfdOpHkNjUU^O$~ksCR(l|q6)Z0H;UIC;==wl7 zOF|jaK#bs^bW;UZJpU~FR2Du-mu^h)!o#=9*&a}fqC;$i5-W;g16(T()!eOTQ~nB3duyN4o5)Y(Hc^owrGqC@f8z~@ zusLI3@nT)c!G3J&GqB{`Ry4z|;$kGGqLA1f>-*o0&PvwtB@6Q?(bBrsuQ3r{II9eX z?ARvpOmGs`Wd5lq2=t=>qtd0K_057od!Rfc4NY+Ly;h}9UBfW+Y~lMWRl0pB?<=PB7TD0+N$z>vZ~Gj<`7}SbKxFJi>hCebz6s3T-Su$2e(W=0QRDqsYv7;@a+}8 z#zk-x8VMzDDcjrojxrQ6jlrA+r+x<*PLOGjy_RZ~`Tm1!ZL+}wuB)U?VoGvX@#*D* zTu@hs+RPn1;h>WVY3`Gi>;xjF)E0?)n(L=@=ht zBMMF`Pm>KRA#}S^dsF2G^*j*NpJoDUj0xAf77O+I)7y5}asgZ4N46U7*j!aqj|}Fh zrnhwUtqv;oWvD`Q!9FJBb9k%D47U~!z29ZQS}ROh0Ne%WIb5;yS*QZ z$Z5Y&ivplD9JXM+{XFSDnmoPEo1jsOv}-sN#Oz)6iEY(tV*DKafLC44!w*C`Zmpg@N!XdJe#yo6bK>Z^-547O}YLO(j6p5^68~HmEh!!S! zz=_Ft0o3dyYf^5p=~-Gj%-f4iJpga@@ux+K_9S2gOwc zAHKw(_fwb+KYTZcW?}7|Tp4r}?)z5|(;W!fv^2kZ+bVGfaU0JqPBP{$2LbpkYR*^~ z4E?^b=MkoY?EZCF8((lg)be9(QGXa+9hl9x>q2jB_$QiBs;)ncRAkDovMaXNrjM|U z*2*meHs7Ww{sF9!V|5pTVVwgZ64NBL)XvVjvCE&4%G!NVIOAuC-tv+Nz@5K64%GCD za+-}*e0KgbT3+uNxaN&T*1GYN3lp?&#Ztf@%#{V+9gDHd0WzeDwVH@P>-Kbwz^p^z zhgRXQ^h`1!itnG=xLt{=P4YHB^A3d_m3{>nNG~*mgN0B$sglgC)-cYlBqDo$d5vKB zW+N3QW;Fidmv51Cmv04cRu2wAsWO>T`ksJqpmMU3%WxyPkcG3f+_*PPM&Mp+?So3b znIvP=3>;J{^46d>5bH-7;1|RvP3lGU0^f7gtYscXCW+|KA-v{6We1glqJIqk8r~h< z(3NP{?wD)!M#6XV6pGJeHg**0o0a$^SZG zd|MX)%k{(FL)L5QZKyFTc;;`-l`_F;j%Er zc}ZI8+Y9Zc>Mm-Cch@Q{Wj1 z{>sN_Iek|TSUNi*J3~q2I}=Kv0Q$Gyf@yWwvkPnpX7TU%dH49dV==DW$1*V5X0mAo&%v$)9Ruq%7w;7W94JkRV{ z0>p~dzc&KvUTvL?#`Vl{3Ko?s2fuAa3aO)x#uBo6mBcpw$uP=E!ME)_HTLRX%9_+R zQ%b=KWI`ollvYcA+Th96Z*V%d>OTgD@*zHPvyY}*GEn@|h*Ft-dLhDHzMt)0LN4|59IdrLjTpD4-o!6q_D1W8pve5vg1B4sRB^ zEBD%{Z|8T#ycm(qq&;fA=I>52YMks}Ra@6g*RQ)#5K6W!+DMlg>+EKMc{NtELmvEP zHa%LWR0mR9luP~-!Ts(o`3xM)@FgO$W4kK;*p7Pdhx-$6$rwS3?HF{?c=}EaL3rxm z%l|kK_D4^t`zocZ8v_CIEMy!7bc%K+I(O}@3XRP@Aor=|APnVa!Wy8Y^p)c%+ z%U?I%ff2`~9R!0~rK5ICSlUxNvQ`!y+e$2D_eS%EUmx`FLZ1pO3eTI6L_utC&=($+^Ah@>3XO(%1+?uC`HbM8>}82H^Ev+ zXVbx8Gjv!5C1MTD$(~pi+YU{4$72&#L(x$@NKXx#6YSMePv{MoU{tYioC6LqCl1uC}@t8tuO{VOR= z@Ev|0|5ezk!xuX$5c7Gy=AN1kFIo6Ui)=ZWwARl@S7E5$-usxg+{7n?HZ78c3_KQ= zZu(*skxXFOz18KooVsT}7jCO6sKz@94R(0fkPEC&&CX9#L1${|2BUvj!4?Ho=+dGf z?l#2^%2QP`PS0Pkl2wz8dyl zt+`coyWa}tK=VO&!OQ~H6;f>Uv>k^}ukduM{3c^PjoZJzB!?Q|ihq?F_|WRGNfs#C z$H9yov6L7#t}l1p8N_j&XxW;D?p4RWN_+ypGl)Ll6RmP`>vGh8|B6<`*udk}S-Kf` z2xfw=Z^ zus_EYe^XXY9!6wrRG6z{gO$1nXF_G1eZRr_l>gRw=W4z-WgE57v@mPttHkE-*+jzn z&>VK8C&DM#rVX2)vbV2(YJLYT1k-|FSLPPaeZlc*TpOzCZCYHw?4Ok4F#=-)Pq6ck zGOnk?{}i@#?-LrBk@qP_e|zYnUo$yku8C&g0rcf3HpB`sB9+J!TwXIh8vFjo^GnW9 zyb%gHH_3&Yn=3`_bvU9z;S)LhbsA`B@lxAhPV6W3v8VK^J*Ms|m?-J( z7l;QdHFh3@x)!}EBz*SMj()r&ED7+ayh8M9xmZ*$$}4&sQ0lHpk3D_P|BJGb9-yA$ z75Yhr=$lXh@;AR*-_=d4rq1ukOBu_)4V+sR6Avhplq5~@-a|0zj^1UkJ)Tle@{(tD z;A$v87X=x1(8vZsP_NVJF^=dTL;-nLOIqp|cR>-BiB8cSisXjD*O@R4NzOtobdn ztqT>PynXh+Xk^)(bv6fW3pkpwIH>nmS0L-CSVT-ZaIcbNBbqMpYtvrL??t^^>fp%f zQ8MQ%2?f>6SQm61|ML1-f-Cc5e%pad`uQ7Iu3r)w`DdkO_yhztuYBr?XWF*%_tRd` zgc{kCEf+E-hbu8&z`aW5M=b$~HIR>3j&+3$Z5#O&)aruvc*o ze>2rY!Oo5hzOc~h3h&CX`6m+eFr{N9v}ljjlDVUYH=ZdA6%bt2s^lVzjPpFh_w;<(&gZl|EgYHN|wfV zQe$0VL=x#%N8b9sInb-6p*4{X?5^2EQN{tqL6uEgqeWPOE2)UE}sd=Bzpx zip^r5bm$Dyv?dRYpcmi|jk*sXY=ha1N%f^Pp-Xq|w;9kw^WG;ZR?p$Q4UNe_LO(B@ z%0K1HO$cYo-*YJa+8z3@Hau*!M~$*yJRtD?(Z1}LaV+53(x(~V?UBI!`(Mva8XD}u zCd2C#XL_+??z7mcK5DjP?wvi*)p67*2ac5GW8G-U)06i$-!gy5JOB5S`m6f$YLlJa z|01L>bUzA8*U>BLN9~KNXE*do1>CdWLJqiu`acSiUA3EpP0uxdH~}MIughnwbwgXd z4a(463UmDMRPSjgKUH<<3rPA8F%QW<=aJ;ccQ+d4HdH=d6D!R7z1ZC*8X8HdnO1P7 zH|uo-9>Y!O997E1jE^ZZ-u09OMMizpI{v*cD5GyC2id6HvN~{yEULU~@Au}((PT2- zyE~Dj>~D)J#YV;R$BpGC*kQGh6^>^n3G;Su>+55o-r0v`R}$;m4Nc#Q$Qv>w#(1!p zSLIDwTz_OslO-FbQ4cdBGptRxLo53JsWKXS)-9lVm8_q9$q0v!PU}xKX!T`nmD$e7 zqPs;(-&<+!Mr0U~h25NFd0^|dL^q1xMnn9Yjl{u;x_SJF3!h$NdzzNHGkujDQTF7J zDQ-<+t^x~QIN?xNcZk_mK9g32kFIss#8eGDI5WKFkWLo7l5g(uC^laucdv|~aizmV zTmRHqMF=NMbf==maRy2g(~b?{lc7W4DVp#id{q7=b+t#+gK4c>R^f+Ue_=+(amH=- zFd>aCvD+c^trjIrV}8E+v1;S|W!0UuXx@sjC@|lDiT_}w^^wcdgleuo1Vdf@lm;$M zg_xYHu|jNU<-TyJjuqZD><3)4Wqo|i5w-@$le56F7987QhM0bWT6Kq~UsM#^ufeWV zv#74aj_;N_m2*o6SJ*#h{L?;M+J(moltiW?HfC+-Z}A^>iwx+_*GX7QfRVnp>$PZX_tt=Lu72*ok}i zBlteH4W#~BbSA&KYg)41G$ZU%Jv?hmhVtFIl`gH*iC=#h8ZQw21e>Gj(UPQ+s&d!^ zRROt7mWoflDq%n{SK#?02b4@{}$_j$Qp1UhdIJKY;)^iw;vlWy!X4S;9M&RV_Be&zFK`HIkbHG{(BO)rif z`<}`A+^Gk~VEluHv=7xQ+lqS-NL&^v_UX=)cSEUUcwSXn;kk*JxlOil@GCIlN5Qj8 zu662PYtB2kak?Gx#(rCofaApqKVn1NVX8>2@KBoDdy1twekUE~Jzak#RmYr6imU76 z4ZYK$BB44*U~k~kew$dA?8FZLisL_k&yt6U8?}Gj#8;z`j@JCczA)tSpL4e18%-ss z?lD*y84T-#{rIeWZt}F>Cr%o%x%#Q;BnFLsQ@MXqaSvmVg1+@OHl~^9J*%z;C%v6; z(N0NIkAf>uiF*F~PFnpFI(ntC&uDXKZVS^e$IEApKP6x|UX4^24| zm$(#(H)i<2W9>P!BxldO@?srKEDWu%R>XFqj2U5*U%K*gGmf&j!5O0>c0hO3y|;{& zl;de!mm3C*Hv2D!obsst8!Bl@=@rwKKu2d0>$9a8zf3;MDm3F!UsgJ9L^<)z^ zMr#rr341nn5+k=z!umg9WwU(-V`{RkFrfzqPB>8-2SaqCP|vd^v6j{2^ln5%;PrFA z-=|ucKh0SuLx4I4+;@XRM53F=f>&(r-rK6(zdT#M+)w|ov&!%pXIxl!w7i!d>RK-s zA?4#<5-Vd;py2)-J&tLjFa4$ZvQ@$?@(|W{x#vdCm)Bq6a$GQKD_nx4E6q|lyHA$B z(25Tp5_5XV_270@e)YwV`T=0%8u_Z#`|~Y1>`INmBt!%MW{6-nB-0d7ABGbHhLScM zQ|qtgGdr&|i7WmI=DInNl;Uscsb|UGt3bK|WN~T%! zC)th$HIW~>hYaQaZtb1-SASCVY>B>kMS1p9R=ZKT_t?&@4h+i7d?L4|R>{S;6hLB} zYLe(7bsH!H#)+Zs;OcJ17gT1tQWRI}Su!VfsUUMXCNVpr+YrZR?Om7rB26bt$2n=d z?7x>H@)4@Rk)36MZ>p0xi2n$O$71!_H$s?DyL_}b8FA*TVWtR!qs9o zHZs&dD9bzaMFhxC#%w3F`JF1kbIkLm4=W`QjQmuz36@ffNa)hRuV+za0Htq6vhBiu z53Xs{!2oj{+r1^c|LF7j^h(8R^-Yf^uCiLIla&NgRRRN;nwDzey4~&{I)=^*%Mep3 zEW6dt3vej&~&iL624^;HwY5Ja)p3 zPxuOX(n&<@Hoa2PQ*R#Sa(QRW`I7bE$RPWtPqehT+UhZvj zWg*OWU>4w9;v>mT$($A@PqVOW1d6TTI(n-t-_Ms1oy4iI{oMS5c5zb`kE=J-dbdRq zNVOL6&78s+@lxqslwE?9Faadyy5i2YzjmS%l^G14+!&|~l8rz<+v@E$j*j+pdD{)g z!0g~WV}|GO@|SjFVd$?iOz!}(t@VaT)P%<;&ZxDKUQ4*Ewx7Glw1}%>z68;T)q$5t zKaLt>G_xr1SUSi6Y$Nw-*bYT==VEKRUK@X8wRcZJ4LFa|J9VD4t)NGDh%->FU+BbA ztLaCP`Dh9xzmVu7lYU7P&Q>fQ!avqL0?lQ2a3*bkrD()s>LIgG{we5=8Z3)?vRXs6 z8H(Pg(3|s{NSUe<^q|+c?(*gs>F8wu!@u0aNH30h)M?9(KS1@2?w-jBETJMeyz(F@I{sncjR-MfA=X*OeVuv>Wbo8?Y6<_F3tB6~ZM9QcwI9Rw38Hu_dHI8=Cgo zE?yQQKm9r(qLlP$hv8MJ>4!i>Hfd-wPt~+?5jHSEe5Z~~78|Fz+Kmij?8_ z^`qP3=AfdgV)egXZYswA!iMtAH^c8@^A8QE&@wB3`|PisQy?C~HBh{F_hj7-baPnW zi+u6y#u0DM=3!nu3O@TpONdQE$;;$_6bKLD16zh%X1xow16C+g zW;Q#ENgJVAn}#~3|MKiW`bfoSUAG$9-vAWbodEe+)nh(u5 zVk3XHa3wG}vai|^HRKv$Q_%k2@yAnU=hNkL^F<&}M@NE44Ed{^@`6HHhs$m4LPF1m z0jHh5SuD~Aj;;8!s&m9%;MdFVFya*BR7L<}Vsv}8Z?ZF2;W_Wsf!TTkOPE@Hy^?pu zeolWW^bmH+V3b!EEXOioQ_p*|zbOW@G!yWt``D{bKYI!W`+Kd!se`ve&5|^edWD1^;zJp6;}|g<)!YJZbo;1l9RMG# zI7eqH=+(VL&^wXM9bt{yU;8YVU0h(V+~=SBzDhh9aa7>Qg`A<`rVc||a5oUe{qa^v zc-7CfAt${%>vNJR0K{|v+ke2+l>HYj1vc}GrXab9(f2luFGwpS$S_vlW)!*JA@&f< z4F=H4so^#p;rKne4`m9?fi}P$Mq%|jjIVJIKfVi_D*HJ)<4ZW25IZb1veNwkb|8z; ztPXa@4l83RV6r#Pn$*^?^i1`TFFXFz20YTJpggMln>ANGcL5NeTs!-DP6wf6ov)Yd z*ki;*0V1kx@(w95b5S!f<92Ja1Upz>ve)UoBE(3y(|p53a!&a0FN)daYwOQNNfw%@ z%|?vJa1d#*SMGY=kGo#*!%{Z$!|w1u*`BCG!9ko?wfYn+Q#j<5JuP=mkQHV(Rn$L( zpJ%dJ#Wtmajc9w~XGc|@Yj0wlD{)SFY9~eHfs{={Vn5|D)A;e1YFJG>#h4mtCu7hY zwC+M*>x)^8;o;c20;D;fzbC~!8V}v8@irS)xm;|}Okqz1esIRQkoFjoXm&X5h%w*) z1F{wFBQ&wlgpAgW)af72uTlr?9)pB`KW<9CDxa46I?2Ys5QXfGiSm)*p9{nVFmjGO zS;sm_@`r>o6iKx(milExASIrg9<#?2sN!eZY)ZzmdeA`eJ}ohdsw!{MA{>Oy(pfD- zWe}H7+i|Z;3)*oH{9B1Fs^}P<4y=Uh-u6@9qeEK6&^;qXwb$|z{-<~a&BzHs*lwNh zO|`g`omRqrm?$DXp>!C`@kV_C7pAzOwWocrKI4PmRVUnWGL2bxX}?ZI3}khST@1#d zZyL-;O{GP+(xcKpA4kf`1|+~*cnn}<=Bgus-;>Z@U!;yB%Kk&?V&q|849!$W?q>p3%ZFk$>PHfR(5&3ZScrq+xR|RVMCpR1JSb26fb0G1JPppk8|rqCyH{W#;AIGi*5xikl<(vZI|(FE(6hyd;o!al z(>yq~qzj0o>6>J{2{B(ncI6wSJC_{Y?$p@)bV#53Znwzs^&X5;gkIkhn+L9eJ61;@6Ac!M1f=VDBmaC{2-v%c*kd5xcRE<<3{c5fs<8e@>+>&rd@Zhe%RL^jqdyWuEuu zmu~4?;i~lE>i4ELBO&Xex>HedSI?jMYu=)2f(&aMnc=~gznwnZvDzlY~0fvtA0(*EDkG?N-MBQw4%N`s`2@Cp`2Q7 zUDP5^{~!X6PflB})X64vTi=y`56V93D>mM3wNAsd3Mj_kig;HeiYxQmmkYH%vBld} zru;gHHC2gXs+&01jA>aW6Z&r5-~%q4S{^c`y6xbkOLxA;&K+%PG(1q+-zejRpV8DB zP3H-~oE?K8z-S&j9en>%LA>#U{m4seq9;>|Z#|F3x&w5iuZk@X76NA9)xl}UZ+vLS zegt*vw(KY`F(}b z8tDc>ny>HP_xn8m!1LR6?94Sg#~kPEUf21lXHcE>D<-SN!or{6g)eQ2Msvp7skeLQ z5}P>g!heHdfSCD{_n5pf(tn0I_SIgS_sD_CsoDvJZDn(A4;F5@|0r6gueFF8UJbi9 z9!r-Dj`;ugd`VkYK1=agq+`#uO?8H5asJZkc)<$&FS}R2c3b6Lxa$d|Uc79%nRCy+ zdHRecw8-g`4M62fK0jlYQ+-JfIW|*LCQ53WAiaJCbE(1)aa3R(Akh7%;~68d5OQVh z_5d(f!MhmFMtoI5j06@aJD7{SyfbdnN#Ga*%|_eAq4fG!>CrmW%rn^jfT_E!e53fC zp%BZ=E5x2bhQ_e*pX3IWZ9jcCop(@26X0{WVjH_KPI{AuFl|iYsdDL<{C|Ri$yOZM zR#VAB<&;gH3y68ILsx~qkgAZZ?)y|a(SF%AsT1N1;=Mo?39<2Llt4FFQFRfvd!POF@c-ks~Uo(x1FL#pgXvVLyeG>OyQUdGMyD-daQl@IgX z6{}1l@)}Q!uB2jr_utvK0mgspaS->7nYe!+CGM7V`{CD09uwwWyveMHzMw>-B=vdX z?;i}g3hvw_G~1b=J5wdC^zOeIULe!bvPO5DSsSdn8teWTgwPa7Q{O_>$^4dFQC08t zd94)p`XHtH@)mdoaK@(=6Zhi{-=tkTDmcVuD=wFuR4yF(*o^%Q!kFg$g+o97@3PNJ-`}W#?`=&wE*6x-+HnLJ z+6%h)t#}z+d)e^VvDteCiS-F%5@ zZtFJ5pxTdbCiHg6xQ3|CCPQBItdTKn($4%I6rk_NPqI?&UcbNp+YP@}Jn5vGx7Ue+ zsKil|^l!Bvkj^Q22os>E@8@4squ1$cVOV?$7}UOSCUMrYan8~THx7&Z&ajE_hIGCA zJL3Mdgz8DZT0s9+f%lvizSf^_m%sV83Ssg>iv3%$BR!Y~y}c(ncyetiAahUg;{1sj z?ub{lr%c12oUVd-jFG;|>n)+nKa-`K=Nn=t(}QCg+xFK3D6&@j)u6K4w{m321{-38 z4TrI(sVH>zwDW35>dHd%ATYRY#!d8q=g(J|s32VpgVVDsqJE5s{ejB?x1bf-fR2!7A;{&Wt3Sj-#OElKE3H|=} zqi)+kxeG~fh;ckCf-AO==adFbw#82~4A;CSw5hgvDrQ#QJP_2ZRu63dkq{rYeeG$)hizLt71isZ)Dnv+lKo1`yEU`AApKLM&y;WrY6!S zTvLm(=>-j_`j25S&KE>Bh!A_UNJKGqA>a6(ee|y|a%$3-r*mL3m&oEH!>ib4<`fK7} zxV!A_J^CgI>P#dx2h1*a-Q4aISS2AW!a&|EMa7e+$@#S1r|i(xDVvi$vD-##2H+r1 z)nGN)6kq{43=?^)@XrPdLfT_dTUgn)xiqUEwE<9C)u9brOZ=fV)#b49f$?xTI>kzJ z=@(J-2#ZWeJ1Vaof98$!a_HRY|4dZ1c0ic-`y332ZWdhjbZI2*lc=ep1Q zZkqB|v|x|Ej3~CRMeK(a#X~yyCBDBx;CDio1OH2Lq^M!>X9``xBD?bH{0or{31%8k z+JrXa>Up%KuJU^SMTA38IYd#_Aq`mZG8ryvL^(3;Gi)l@SD7$TM{~~B|C(2>ONiLz z+KQ507ytpN0U!d_W%rBf7FcOk+Av-(xs4gLVoo7@G=7Hy^}uX3Tncdl8DR5oD0q^3 z*bgwqRb_VGW)w!ckdq5QgM%*!fX&O0E8V)M>4!X3KKcC0+JBo@v=yhas>MDQM9Fbg z4qS;PtUVWR<3uka1@RX;(TiO#!m6{;&GG>;IF$ov&zJ8)Fbj{de9(%cJ8<4S-y%lXxk9aRlDwc?0?Ch`NMQVLp?Tk;5v1w8;ve%GQ7r=D6* zU zPTelLM%AR+@whqz5dmYNh@4X2k1e}}<25WV_QH3EX;!4wQz z8c0?iQ_as1i*$egJ=448c))}#pnU{ezwPt~V`Xt@JcKD?PcoC_?gpaj7t8eC2M8=3 z$6$`;8AB>L#BHEUWben)m2YTDKJ{fFA9nJHvOz-I0m3x7WI530NG z^;)9*%UR{~lGzsEM5c*q@MD0@Uy;R98${DZGz%V}nwWDT&9PVjaDef}8~^X`qYh}a ziM)AbM{GXjx4Qz(_kTbAwX5O53+zIz`eVHGcY20CH&=XYdx0_d(iQ3t59aeK8e{oS zU#M9h`RBAzs#-}IhNY;wnp%aeJ`^s4zB-&bVeI(V%6f;^x%vXO%VCG9cJ?neUIxgKWx9&h*xmA(Rl)1a6Qx~nbOQGR7zlpMp@6XH?EuT zDE<-7Hs_+?7mzL3#|qbAHOA}0gcT)=3*@iJY#^C$AoFdVSRgVT*7CZNDhKoZ49?z6 z_=Hao0oTnKMsONk zyaC$q7jz9rD^Jrj%tDvY5j^<$rQ*nI;IOLUH;CFA$@PAQa1MsmqKQaX;2549h`Nk> zhQKVLV#Q2ZpjUC&=sVx8LTqnK8#GzbiuZT9AP5#0Q^+Nk^($Q9!EY{8gIG1Ivu#J< zfyslawM(LBh=iY$7|CA`A;SI$$j$k@BXi%o<$dNm8GZdKc*9<`7myNbj`GXo*_Ymjy8V8i1tsMeihayHgRFPc8IWlAyJU?`D#aO1qU%d{);)_>TCP; zvx>yezJ|=hj0>o9M(In~L6IQM&_fqyU{G#Z|)Q8A?Uk0}IM z)pYS)$f5pt(0RGb80R70p7Zb4bgr`WI!#V8be^MIMmec`V3?qj6Zye>(g*{=VDGvl z?_uhWr)ha#*2{^g@1F+Y+e36q(q$+ex4O-GiS_yFzJeRU-5Wt8)44C%j4uNdA3lf5 z^UfABxUkd7{T&#izVRqgtYX2xjv&s%$9`NT4+%~Yw+5G-o|SxeJ&y~i^|jpZNv zE20p{t}XTOfJLAi7ff9W_A5{RAX;qJ@Tu9^pf9V6nR9b7R|tOqALHy)p%1)TJZ;u6 zu6a-BmeLca?L*$`mzB4?QVaZZp4p5ap1PS>y#bfD_c_#9>0+X7~I}| zf175^HDzSY0!}u#GEPQ(mJlha#KgAw_JFQj+9*f1-#X3Z=RN2hE~jexD$e1|(tI?^ zAtEGiI=i$hHvx8>&l~GW=|QFdBtZ0@j%TtMjpSlX8vi$S@&9#@T9xK&`F-@h#xt$I zH#$c7w&B}SEB-Lgc#_pE&va9u4vLJ{Aq*4cRgtc2h1 zb>nT?e3ptX%U>8>acH%zt;f);lNGUMJ2Q$p#)1}EvqlhC#msvJRnD=7bmjQTn@1rk?zP<% z2g?|npk?C9gMG1|HW>ZOvdCNQI1{QuSS3hR@2#~^o?$xg9IJGy^CLOBQnq4MtR>W% za?eP{cZfQ0%H;FNX#tM!r8+~{gZ`dswCB7ZYi~qxE#r=Kj>{b$ZN(Z}1;*{IO6_ONGoS2zj8;*>LA-X$9b?0u2B*wJpTqS( z=i+7S4n>HNj|7D6h{b4c#O9$z6yP7T;4y+q&D++uweT|+U(MJ|wNewcWAByD9px*h zwmxSFxLlJ?HknhpQgaw{vl2xoII1 zXggdw*M1B|efWtQ|6Lbt4SJs&pCbmfzGfi<4B}ux^Z2z4N>L-2xS*+i1quazga~w! zlf$gKrFhG3ywH(zjO5yt0__g62Rs{MV`oUf0R~_istUrs?*=VTZm@L;oG(@G>+bgU}|EyWq(#=dv!OcwW1)}M5iHmJk ze$(dyot)0C>BW63uw6KF4_~xiA_RXJpM*yk`63CFJ(@~yZEza@Lof*vHY?I9BnUl) z(w{K>{PJ67zw0~W)bE!&bJ_g`;zF^NiDa0l&DuZM3`La#Z_C6qD)-Kso9t7InuyJEkyx+vsfk3)Oqe~&KP@!{4* zR$c12d?G$h4-=~eTpro7>ZML+37mAAcqgdP%WQtmHZUND4hUN>3O%(0MOA3|wCB=N^2wvG0!36+JSsMF971%Y^N?O#;p!ZF+uL<7E4i~U z2bErY{3KbaMvKav*vGwc0Ja|e@l?^L@_Tn$=hT}NJ-mY{7j-4;faz$60^Obr5QGO_ zJsRC@2rdm*PUZtsZ>rE#-ima$!nNcuo9bn=Z@hPk{rC)SP38tWe-^?ZGvakm1Wuwb z2^TQzAu%%!gmuD+pq-Og(Ko&VVra>SQMfh6=~a;V9kv?PbN}b_M~(fW){AkP)U!FI zLWqU%8u8Bx*4xhQIQZo+t7tS26)IL0FmaEN?gg3YhNbM~##AAMv7CifXp8 zwiqlbgx?-4NP1ZbBfWd3Pt6(s9nFDPTa$zqVZ{Y%#G z%+^X6|s&f|MuMuT9{ogk2+2-|-U^GNcLgwMU(K##NON@cT7+ z-m0VnE*#=leX98*3@!Od@`?dXAK66a*7jM-_BpG-D}^)WKOf|`vCcxNwjQF{Tb9p}Dc}Qfo`^)k9(?{CfAc~~M-cmE>Nl!!)uUC6^A8QM{7nB1 z7@q?s<5msi9amOzMed{n9B_biQ22Q2b)JAvs{EZk^|xNJPrtYpgh>Cxk< zEzeM{GP>`Dc-}1yszjfhgkG7-ui=zV`(r)okm9lD+j04}!Y1H>dv-=1NN6mq_nKa8 zM9x-BoOX!l!nB7vQ_yJnP0h;hhiYcC^g%5Jjt>lCyYY{23Snggh^#{MYb=!21C-Tw zNYP89-Zz?z@dM4>+u+0b`ct#sf~JRTzC`L?9X0lGwvM;bn2t0D;@kK_R((I*y8kha z2J$Ln(XVL^hnZZY_K3@S6!mEOham~SKT0WhI%3srWqvys zyyCOR9!x0*#&|DtPqKO|Uef?#?eHFI+pEneHq&?P#Oa@%mV&#C0Yl^Ix(iZAmW#MK z-{#XC7R&WlbYT)+-QkrDv?OmsRQF_u5nS#Yvvb3SjO*CJrv&42hA4f<)@-o2>>kA7~x z0~$PJbzmI+a6p!_EUp%OmVT!?_6Di6qa{OXZ{w9ZBKp@Z%O#&y49gb(C|}TWQElqk zccjE{?~HUA+;*+n3Wb$TJ5aFgf_q8CI9*#n^9k^SL>j0d^UxHEiUqByKqI_FMX`U0_Of9t0Ftki;X!tpFcWUD6b=Rd` zmc-yV*?kF$%pf9~K`#srsE}&@H(LkA4_j8EMv4z85PEH$rq4r`FvKfi-ZXuF8>^@80ZmaqcFR&%}dlaGr?(OIJX6lS< zmaA@%#SUT?*b=Po=>6N*d8Vq>68BeZ9y_T?dNy(5_+7(tJiu&a+L-}v<)-^ zrZ%yU`T~$3rt;I!Z?#q6n1`|i9^dfnkN6bqmFo zrFLz0lQ(N+A=7=qQMCxW8A0PFv`0y5NBH5g3~(?zGF*_z_c_+64}Z{1tLAmV;q6Ph zP33Y=KK0uxGfOFgM@8nLMySKyG>H9;7j8+Drj9ToH`S?m_frAph-0|1hdmTuPi`-{ zo_t|V+R>44FSctieCf#-^?7WRzf0k4!SlI}@a*v~=AqP{Q*1w+AMd=NQNQ)v_LS3} z-|YK!VI`JB8lPD%6O?_(c24MhZq;Ra1fdll-je8r=E>+zP(k&uD5H5^ zxmzXj;*m;QXlxHF*yZPsScOvAHYI>3Qk**+^-$`ZI=DOwV|KzQkyDYG(>X z0{#ADKpK+2&=HgtlP`S()t(vb9LCp152S*G1@ZuQ%?>n6`aS92AAb!86VYE^X-MmK z^iC2Kr5m-wE6v?(LE*=MR{?lH%vF%((z8MgH5Hc1U0Cy67lBqWs8qd{R%qJo3@@;L zb&mWpYmD4&`e`!cVYctPdKW$zTL;Z4CjkT7^sxeLb3Nw?A0xKD(LDTsfat#S18D7L z*IyHtnEwb%*O~Bztq>VmeH6N(nh;p7l!nD@+<0>Egdbrj`D0dRxc90Kh*LI)erI=Q zAzz~VhfhLcq(zpx7_>Zjxo&F|Uf2MvGa{AOnoR3V2;EsMVTCr_YREVDHomrVh6(!0(yF*+=6=4Km%^Iy(*B*{)4Q znoD%>wYFgCY512xWv_+j=gaA4a_lC(Nox6k1mXdzQZa*x5pm2d z%7pq60Sn$#C#&iR|Gn26&iZ1cVEeG??6K^P^=Ydq@}igyHGVnIg193JIy&W!e5EtG417u_)511zcopf2SHAdHKmNQ2qW)34(SS$euWxJAhT;G5b@==c&7eXBLx*>zV-%XY$2^9o zioOLi2dO$@J?mnZ=~#5lCjwe0JVN#YqGh(-$7`ODoX7zE4sf}o@xwk)>?7;~9)^C3 z81qjzPl9N^fPBh|XUjJ=!UJlc-PzM>A0IE}P30~f2=w4RYLH2Dj4ZWDY|Tk00DcDu zY5k37K3-ULnfC041_qm}Tg+%OAFd zm}`wrcNp&E92u**T8A7?Z+MM$^$(?jf6P-f=#n>~5JVv}^zJC*K?p52Vv%K%`|rri z=%;b~q}DU$sw~+z@c#srOs_?%^fAbf57VTsI{vKzqn$}Ij6W_&AW z`lVGs4A&`D{9+cZi=E+A|HS!ehy0_4x5b6Tjuwfz?Q94teh)g-o6_fv-_FLqY*73B zq~DrSCd@z!JodOMvvE^IeA+`sev~2j+ew4?QRyhdT(Wc$1$)?II8?dQmJ8~TdBJht zVV2LR_S$vh5a_5fxRcts0I>;uR~U}Gro9oNx12?FX*iMBRLhSx*8A|aYt8&upE(ka zoDc)aq?eU}%c7tGd_Ugr*?8i;7+{h0#4Qd)in;Hkp@U^5(&&I}{aytGnsxQOG+G$Y!!KUmGz<~zF0wvRH3JE{l3jX7USAF@06R7c>kO;Mn zT5%-t4xy4c5D$)G?bwp?7PtG7`2Mjx1e$7HJuU2*aA;Y0kt;~h^f2~j<4A}QiuB2GaOWR8g5Y!1OO>z$rOBG2r2eD-Bi z6Tf7g8a41 z2$OAMP#Uv$s2P1F3YtBPABWI;k76u!YD|U=!K3Vz_aM#}ngCcZQ+IRJl>9pz0{LIT zSm|Su%fW1oX>5RUe|V=E+8SF^u(0ZiJsM)311iu2Dx>3n^Z7KjpFULibZxefwvAKt z$*I?@ON5j`OV!!ZNlT}n4WHennll(ybd)oJu1le?eI{W2^0}$sIU{b~Yd|E+rx_cD zAr^s=0a$2ITgP26{A54~$mwEGY1=t}#4>@tz@c9JjkUw@{@8(E=HEw8$MR}(OOB+u z;w(Dg+yXCb+DZXH!A>iS#KBeSS|f28;F^L@ED`JC0~Vs55suaS`QKxMqaJH+iA5m; zsSJu?v#zc2uaHWza3nT^8(mdU+lVrVd_3IuRPxagQa;iR%iPFD?o)Ow125>3q42~C zS1c6|;T{mwpNZ$XhLzCcuo?ocBF`0q#0Xf9T$-43lVcfRfY!SSr$NxwnGY0u5&N*xq!=%dTsq(*8hGrPN%}k0v~3fy>YS zn2_&urz#PFqXBpUx=&=zCU1oaZLUZ5$BlFkN%5hoVOfgk3N7FpWO0HD?36!fVWGe& z{h+|;?&D4rY~oyk$=sIwJgYT1YS4#28YF@a>W;k{QlNHbRY<3X}}pLRY1iLWS9 zd|Vpom8^K8$=lumembGV_vs*E(#L9Y#|QVQujl_*(0M=I2l&+OB0Fz;{rFIo)~Z`^ zZD3zt$I=TC4P-LNq~~5P6bL`3o|_^iM|2KMPOnf5rbToV@Ih6-v1tH?cb3y0y{y@2kr^6CyN%&tA7PJ|%v#zm=rnN2*faO5!T68>l( zAL4;!eqz3-)~O+ZY`D^{L%fHvdD4O2h+mdM^dcH4HzcPLP9t(yR_O8TwoHxI;pAKI z?`Q!>_bX9!sqMSbaHb*}%fzb)(@f@i-hF|UM5muzXjWTS7Az&N`hv*;&07}wB$~zuhfiU`4WP19ipM8rkC>xJaCG2r zr{hMJaCfHsOEL!n9|3sWlK%n0f36vV*odrgX_8LXzIzX~g>psR<;RzO0AxL8?BTBs{sybHWaR!l zOu;bRb7rhwF07UHhvsX9gVDaEcJYUFqz~7okq#m zM_WAIlE9rFYdTww9dEaBNeRQ_b6)KX&A9a7=ybn-!~64)1t5Met#yu}<$wkwU7*BC zq+CmRSZ=NP7;gA?Z%4R#x2ST`&0(bYvzgn%_j_x(e(NY_o`6nIH(pR$l*{3Fa2m{- zZ(KI^55%Lni7}6~s*!E=^ax;JnrXpZ&|@ z*d)w5So_jMiZIC?^Lrujvy1_H$UIigI?f;wzaub~(^TT*4p^*D4;OH!_Y&AD)6%+y zyiZ+vQC+p)M=@W%bl!9-d*=B=?bb}A;|=9o#Dl-)yy$a#v2zAZsL7G_ZA}`CA+V>n zB&#tG_eOu{$m2JJ!$?zycL8GeE@*NE0<0`-G`j-#J*KW@D$|7-^S4HQMM0Z;uF%m6 z>!w})R+OE#yO#!(e=ZN;ENj4Hm`{U9r8KHb~+pbS$Y^nT3|JxV@(rdHF{xeY7A=22GrXKx%d zWZO6_t0V9&gbQxozM6^2ED?pCb>Wq5M!xA81I5aS56CsXpjdW`lzQQmk&#Tjl4oO@ z31p|uM&W8wLWnyzjZ=j1HcpqW@fOFMZ;Y{e2Gw?)$8Cb^tZGD;E~zn3C}0!($8_m2 zD8_aN>L8_GBj!MTN}oD+$2cfk{q5?-8l%|ga+G3WEMIi6cR|0A z2>}VFRt+N4n>k^=B0zb`>OA_J$nsmRYt@6LRgL#qhQQG%9wE&{t=y2`14j(G#pVO# zM->{1P4Z%1$H_i{0PYr?;s<4e{F+)j-I|R@F(?k5D!iAYK}~rHu;zU6~=#O6KtHBk{&+qFO+!xDQC7LGXZZ%?S;MxFb*!itxAy ze`3uI_?SHq-*`$gkQ+6b25Y^^F62kg`N%w~NQ=pdRgE15h5mFn^Dwg?E9<)cX6fr; zb5`-##d5X7uK5!*aUg}dn|Y_~Y>*Ix-sA+}Dk($mzRj2 zxz~mR<|;v^ciMI@G=DxC9i&5jbJB5$;B(SWYWl?yj&+E#y_7nBc#R5AAotKhSH^vk z%f{?oXClSdroKWFIy+l7lia`YQUgdg?!t!V1$t(F{vJc*ga{Pc*8e33P8uC2{bvhP8lSqffuN~(FG~c2%W^kK zg-8jx5}NRVmz-^e$&4Tu%jaG;j>NNOydT=kd$Ej0)>Ez|hr}@1rsCo7$Iy25XEd^L z3Y01HiTz_?>!Wzg_EtN?aO1@}tF9KaO3p;XpV?dPDG=rq-qxyfPjFg^)D3%RPq~iI zi7t|Bgq+U8xcm0vS$-y84L9_czxmwPTK%r~hH|!y3G-BZ-qKG1?xFWK8axPDN@w`g zU&(_-r{q5{sE2%5o5_q%R~I8mHF_pWGOWUxd!xQihPI#=@hrM$hfl6}^WWJi8E_c? z?j0#?LS*~DgRzm|{1r$dEY9d4)TPNYbl+<64FvM^kDx3I&h-&h=E&2}_fH$Bn#_^A z3B_$my7t}!TC_M+rBPv8 z^z)q|0H!tYecr!ZFfMucnHdE}g}=m2DVfRMG>IO8lL7i&86mGd+>3|%^Bodp25g_JqKGd^FdFweU)Y=3Q%$#ck`q+|Bw3X}|uik)8|U_W!IM z6IGHv{KO<*F#d7T^c^Ce(%7{4QPNl)5Dd8!MI?izm)lxLuekRgqu<7qGCACZUwmXx z*8vVMh`l|2&wY8BnLe~HjJ#Fy@$nL6+-K#1sP#A}}0iK9@-o%2<@ zWhIUFm!n|mrxXgIOa8$v@nq@G!(L)maE3p!fX97tzr}_pOXP=}Uv2U3{cs0PKe(pR z!3}=ZFv!Es{^0PS<41UF{f2ZsVhC9^g3+F(-1kO0hRzQcaQG{?33-kW_m;0IBdZPv zzb}kfFN_TLE_t3s$=5V2>3tLS9iK4h9PTa2Ou%*I&Tu^Ti{<%kInuf-Piw^F*3_^X zVID+PzZn=pJoqm@iZOcRsKeeaC?b80`-N&V*^huMI8!~JMoZ4%B59IFivLLxJv)$A zZ)4d+JS|`Jf^P;3`J!r|SqhV z|FFk66#9S1@__RH9ro-a(nf6eq_`~?ryG#l0`>np4-XJ$s7ylVO6@cEs>K?-QM-gUvw$uEQxDhi@+`3-JSM@*ReHll$mr4RL3!;V8lk zAKrP`@#OZW7`ot*8nKuVGOSf(L0smEJI(h(<4Rk^B>uxtu@B*OrK=s7{zToAl;&2S z6HpSd6#`qk{wo*=U(R?e(i3|5m*VB-e%4pE5V$#pINDx7c=wnt1MOe)_{zKUPE#9Z z770dGhqdSP%EpNz8kSIxxnvWc20SKI9QlA3*xzSi+l1DCHvIZtBp&~?K7^H%Z_ca@ zF8FO^g2J3+uP`L<%Vhi48eXU}wVS#c;)184PgxU7J zMm4iURBY-a;nMy;PPz%i;Q(uXPGUvc^rxE3cWtbd#y=*kuz6&&yqyl^Ecafl@<5)u zobHNk#|J{9#>dOh!|P6BiU|8rVr7e$P*R$y1DdQj#K@Nx1qzxv&%|**OpE@EPG)R+ z_xA$?mQXkpq(1w#5F;!E1Hk^2Io8dS@ol!hb zov4{);h6F~Cw(Bmi+WIp!^j6UEMq5BCgw)G!K?Se)wHH74Db50 zuDR-BMtCLbwrDOq&t6-LE{x8}TrBFQp-`nE5KizVD$;I6KBqgdsP4SBck4%fa&(Mi zecy0zZmaa`fuAJcffweT2*A>t>|U`4QH?4A2f*Rh?M+^_^DD?3l=7j^{1kZLyqk_b z4;_!+!$*@bUbQk)_*yoFFyOVa4&t^R+x_$y6TtkL7xe5q*s-;5t#blQs?=hNWOV&B zowM%4I*#b}#`Y!0gs%nP$AgZhzvyZJ%!Y~M3enBhkHzgv5%tBR>#)R&lK)PqR*C-4 zAy&QD2n_OVSJ>1R=v*M}p_TXGLb_~U&ST|qX?})<@TFa2@4*FS1#WORfyBqv?MBr! zh`-3*x_^M%J6Ktl8j09R^wZI1RsZ)%$@RRstF7z^X2!=(#=HApynheqmv$!ySgvmT z`XopyFSNq)B+@^s{GpAh`r_^=sR0Tf{Qy|oI_)iBU@65zc)VsoGm&PeIc2Xan|uuWP^1c8Glt z7OE~TX()^Pur*IWkj~n@63ohaVkt%rCJ)Xfh)!P4j`uPC%73`(AaIdrRP+#C^CXSJ zOtVzLwHosb_7$3^x-B*4t6%(O7VVEKM}%JtTnravj>M50*&(^pzg0)Ju7hp!Jl6c{@+}tY~$yHu2x#%$C3sI%RI)WL89kGbF1T0}bhi zq4&M`sSuR7Vk2-`{+%k=;+Cs?|FD8>uCIz|{#cIOkp5d}K*d$9Is(w)tvGP=06jP9 zqPJsB*(xH2rL}c-b&(tU@gq3l=4UzITFyq7+$nm4$byuuKAd;TH`?=F`*zsamT;HG zphnO3P&GeipH}5sQ&FZR9>y5@Q<|wJe;?6dd)XyaZKq@Mt9e4Fxpa=FRAZCBn<4Er z#$CdDs&p_%&egdkT5G%e`1f?m*U5%z3pZV+GK6!)NSJ9J3U-lTX)~5t-dW4j-Kfx8 zSGCRGYUZ{>$sd^PGtVoGP`J;l$gJqe#d?E8nlGTv3SBHi(&a468E~XiKLiP8BsS%m z{doo@R%s3Rn=1ywg#B-U@d zPE|xHrOq76FM^yz7HdwzkBmCSc?wvD;&}ht=UoPL(XihAi|~a%KW=UqR;D% zEV5tDF7H6jv$1jk0D`km z1PPWwm5amC2e)iUnk3h1k6)6X-fZQf@|Ka3l0<+qBLh=Pxme|#r#933)5Bi2pLtBv zxXEju8!Yu$lJ5OtcA@W86K~e+fBdzJgdN}+5GYQCl?wlOIWvK~+%{wOJJ@N+kx;a` zsY>uG$uSn-n3;5-?E*>}YG!?NgW)*er_Iisp3}A{8#6vM>!K=1S<)6p5SrYm^I-xH zsh~v(rN*JnEiK3LUYZCwig;wu*Py?@2Q*E6-2l$Y;%?r|mh98_k)t}j zdd@RKJHtOU zo>D@5rT*^LmP-UpyiV53i^xbCLFwzh7-^*tw-pgu8(c~&CprvszYigZ?p}6aw!i(s z4X%c?VRUSi%niK?05iExjZG-A<6(*T-tE-t^j2YFsT{HL%MLeN(WRT3vf8Cm?n5^A zHP>nl<+q#(orb7>aj!|ZLFJr-ZjT_^tiG$fUu9SI*OA(%GqZ7#VQ-04LntQpt3hoj zqTZ-n)|4uN!rb!ME1s{W-;*T(ik69n(hfP%R;b|urWdwiRmLW~HO0zvxjQ=C(D&wv zEvLGM_wI(h(*MDiJx-OH67lVy${e%Vz{Ihe2ZSz$H26&7qTwLZ(Z9ElQb za|-!dlVt6$T3g!;V!DzoL$zI#pbvt2#zPFBg{|t*i@$v)p=hu6{p!X zDz%t~oqvz7QUUB&u#u;=-+=vEWP@Fa7C-Q6x-w#RNbb&PPs5(!Mr4=s(_5K!V)uSM ze1zU#OH*HBmbV+~Uf(U6Lul>&SR8EBC;+@m3pZ2Y@K5~7h?83W!HJE%VYZLA4<)ns zTe52hF^DI2O5yygsE2d(hNDjbQKe$tcXYDgI&5hnxMl9A_0>^rKTO%=u(WDvT$D^{ z+?KvQypHQvo&HMXBQ>T%v&64cuKiDV(O=Hg3n-IIetUl@Fe2AwbU{#dp2w^Dql-Jl32 z4a8n*!`DM@)pn7ZcDkXS;Q9H@Du`2 zA{Tb#TfRfpvo`YpP&rq>Sg&B(nGP{`X6#-hkyI9c3k2OGPm0AVufq&B^eS@lu!1PLJtyx?j0Pmr>|2TUT*=?!ZIV~rjoL0}ke*dgex1k(= zBG4YSMNzy@!#F+eG%V!3SkQ$5dMa>QuC9_QUJ|<**Rdc5O&G0M#x9_G^5kI|R+huh zA`fPKDR1rlJRt}aE~T0Avkz(tCT$`$@3&Fjw1fOGs}d&0^_16Ug1CRly7&wfd`@y# z?Bc75Ge%kxmR;Hj0}9K+CMpkD^%X+qar3KB_4mloWHq0Y{-=FUUCQ-4r7ccT{EYpL z-YF^pcC+{vQYf%NPV72fIN<5_H3nVz{&+-)%OdTT2w|39vuCwjKv8AyuikHCDJ%BX!M7LZ{2T&XHdTiyctjSuLAcnnW!X`jYx-;lerA zhk9_zXffpF_KXophXNVVkXRy(`k>Ug`ZN{-wS9r_XwG5#$RM4T`J&aBH!A*Q`UV$f zF;1w|xk7kqldC${sSsUeUoN+wRxy0RSD2wf%sa-@0oPbA(1BCp88sE`HL&w1UdY2g zbv@HBdl+Y%Do@w3MFL+gWx2Cp<>KBD5X2Q~mXbgrrN3i41 zK$M=}D8Tf| zY92agW~S`e?AiqIPoz~!|Dr^9n_-neYQXGSm1^}kN#qOG*UE?or@q~1(VvbdH98xu zk1z+X~zMYjwW$5@X|hs^&< z5jYt?r{TN!|LPBa1)`>r3Idh5%|`imXq7(xS>}BrmTp;)L56&$toj%!7hF7eWPl8q z5H5251a5X!Eu5R_8JABD>y}kP1bsk78w6CXCN$o2L!2Y~6C{NNvg+FumI>0*O+$m? z5tTo>h0(@dX8bvY6T^{5PJJrZdi?rW9p%EGAiK1I5ng2F8?>i?R0h9QQt9h-o#O6R zBzX2H=ECWgz8`UC>}%q|Kq3A@Z86?gM6mOa)gpY0DS@@O8QB|J`Cy{1g~0&AV{zbj@1{JAMU`c+a3UEWgkCQn`GLW`t%Xy8s8b|6xRygH$A7JIY^5~bq5#Zv zDR7-L!$~OXI3Pv0>e#fOo;v{Zd5A#kXkq|xq75p1SU;5Sp<(p2aGly`m(5@L@!&|s zv^`|~D){w{-vJVQlN(t6x7Kj^h!P-%jEBq#DDS;y!KA&nM-^rPgfe4ofC~<`mqf?{ zkIdmVr)&_H^yXhxc8a4;`X*z5JZ1wRLrU!!A*dhmXj~uL&@voW!C%#7o1NcN;G^^Z zxfBIn6!&)(qlg-uIu7Wn(Ey&Gd(M-OZ7v!m6GI#^B*mA9sRDsN9!mO{ybC5$M6!-d zd%BWQ8vheERTH92vw zA@);*q-ik#XNiBeDqj7LK~!k_{kPlk+{&w;*a$b-j&Ykh$ONm5(nldj;0WL4#UUh@!!!T7Mm&Pn5r60})Qz}@HaC}gUV&;;&0hbw{eH)^Lei$oq*C@A&0_~_pntRiy zhX;k)*hUb5byH?YjPNzn#kBLxqg4{;^%zoob z$pDXD>^usYeR)Y?Dwd^WrSl2cW5Kk-nRk#i6s|^U`;)zSG^)k?4s75()T0v}bwZv4S{0`WzNCI;B!3N!b zH>P6TNoww!I?Hw=|EGH}z?t;YDmVv*<@Kxw<#Zp^kQT{et>vb~nl~kdZp(??C3LIB z%q3w8q3i|`k{4;63t5|HU@>6AjPWpq9qaP=>AjZG6oc33-#L@GgP=^0(uIe*yDqXZ z3d-_6%_G?pXNP3{8F)qiaID2bC)a-P#!H3(l3WYGc!Pl!b|l9-RtQkCL&anjhQF=G zX_HWGoXc-xpksP``{DixNTEqo)uukVp}^30^)On>`*ze#rt-9ur{U5V6ut$3^+r5X z8)<2!fLipT(#@T;|Nh}js2eYJ(an;M=;r|na))rOXmws!)8%Cs8cvBL&uIMB&HK_4 z-KO^&1ID}W#lM+nAI2G=i1iYWh!~C$;FRrZ? zF4D|SvX7DyknBkew3sb&85%T*B<#Ngkmm>N0TV5v`2`TAw~J@Ntjjr8@xq<5#6iZ8 zEHwZ?Ka^=gsZrqZGWOn?J3rT08xNu*Y&p`6n3O4%z12s-G=U8~d@Ix6)w%T8rSPmr z^CkpsGXqZ6IveZ8373b2+oF$0Bhr!ij8cLM%wWNkvX4N*$?I<^)?qA0{JKjp7h`F3 z2V@dgC#Az_Z31iWy&c8UNOmK-H^P}AaYVg2q(N|rUF?JR&>%jf`g3A<#&@z8;?jRDXRX^z7q z`Oca7SPgn0CIBCx%tA`nLh}uB_WS%Oh^r|w{Y!AK9Rio*$4!tXze{(fMl=3OG!^am2Mv@*Z8TUn$rcO2 zYTx3)9&@eFR@d>sJW4S0Uj06KjnXof@alki>UK&7E+kZ=qvlVQ9QDK4dzOh0ei`;CV zG}Tjy;55N{fVPQ}+u!67XlN%3DB((pLBm5Enub0;K;H@<)|gwHzVvuJ%X!Ucgr=ib zEcR;aFPCM5b0Q0%6bXT+50syD2k_*t>L!TVa+ z#dLKLJRRmukFv(E_0gHdP+40cpW{YG&c)^cuoYc@NjLhl2SP-#{fw?I>d32J883(N zdNImFd3U-_5CqUsIMeMvhFjOnayT~dZ4@?C5Hf-LN#nZ;uw~O--Ps2`kwddxbKo6Dq==hynDTcYBlAAC?<;6!2z+Zp;Bai;nT<3-^M>?ZWlAIZf#^IFa5G z&7I0M&7K*~WI$}$M29h(WWuuTG}n(_p}nd1*syDoR9te*mOoVEk-K2`%!wmhpz3-y zpZl6%!KdcHR8D@U*vU!h;@|%n0jep>4-yV%Ui)4~J%eK_Hn2}|wYsfGW#Lb-G3SaoYdHn6 zcl$ikS6oI>)s@Q)lY%vqvuR-Oj&^9+Ja4s_D#*oY<8}?_gPghCgS1W(p%x9>u z7&4~7ejDcnmpt&*t_(JSIz~!&UUAnd!<)U$SAbFZm_XSliu&g>ia5P3LV@3F>IPyu z+IVSbb!E5oGv;v!2WlSb<2#TH#*rDy<5{Q@wpT_T?6*30tSh@CZd5gxt>;WEcLR|b zYje9)G^fb1`tGRNGy|U|60os!r~!XWFKxe5A-;U%zI>n~<)(oR3GOrq{lz3TmHp~Q zL4v5>@jpDFNJ^(2v^0MLcSI`RH(^}ciXRjiJ}Un3ZLBR0`TiJ;_D3{vFn zq(}{*#X`%7Tj&7*(+H=FVHd!pq>eK)b$5<)MZgN>B5PEuc%a%MkWVtC*U^sW%}`G> zxth1`8?i2)3D+?STawU9^9D-b`UIRMuzQ6APv-Wil(Dx;)ZTAHFtEm@5U+6~)Vw=y z`}vzmt}o+)0{^n7ouvY!_6seD(CGrZk8kvd&Y%Qn z+TtLp@ATLE9ScthBwI}e1Jzd!Hr5e-mDPnFr7X~n^pv^89P_}DWPpO3txX>mzyR&? zi7M6nDvS8?!_$0OGF%W)3@!w`1u}jDjuET0W9_KFu)2PB;{hhT!E-d}>rjT`g9jz9 zYRMN5gropGrxY)?ptGyUDp;@^*dCPi$(%&L_;)9tLH83)?Ufj)Mbc$^4#~Fe*glII zkvy(7u-IKnuHQ;+aHH3FG|u=8_&9+2cs-cKfz>%vSNEO+b0$DCJGqzoPA#jr+u)on~2id^-f z1a{2y(E}hD?FHJ?81F4B$*eoaluvMFFQUVDSFXgc0FS{fjKfX4Za-bbKZ7=o*!POo zJOwBai)pEqw|r7e7Jq2J#3>c5?<1;)yaB~kkT{hrF%yssemjrAwB%LW4^gzk)X0l! z$CAM4z>51O6L&yc5b1nW+EZ2&bw}SE!$o!E)mnWYsrhv4Q+v*%TSivXZ*CeM<3ee6 zrho4?23VLn#PNr!`-xzfO?o8oVo^cn``wXD7wKRz!$#yQ@xvSayuhVPQ z+WanWq~}FDT6dnc?Atw&nW1JunQ`M^mTVtNjG*0U01>S(Nq!Zr(KA8AdGfG{j=mzk zWgAfOaKwe&9M$<()<0^_w7)Wwr?G&*^^J_Zr)Zoa_dQ$D@N&x-?HfXe&o#_`j7;t<1eo+x71F{RPvC4-XYqu04TZ9|; z#mya+29g*4SO48lI%RWCTs?yC&O*EXDkv0Wn;U|iHbDiXCNz%<} z%<5}IB!qgh!%xzyERRMbuHkD8w+>=oKSRek{~%qA>5ruJ6%>tnr_89R(xMMJfns%w zYdlzir=s6_w0fO2SlPe3!DN*CcXLvG;2;z6bY<~Tl~qan%BUxDvcr&dV>?t5WR&E8 zR-9$k*g^-XDx!aDHNKmY1or3J7)Zw5&-{almKA%l(mbKaS3D^lJlV&C-zFprgY%ch zpOtw2!kQCT{953zSs%Ivq=C@wCxpA~2^7${X$gXTUdjtmsuYMX<2dx-|Ihk_WTHW*Z8Gja;vw}cMPx+TRu zyW0L%t?;g}bL;>9tG!8>A_|QRc+C~_B&l+3So1G|Ef!DQ@{a0lan~3IKg@)20ZwE1 zms-bztZH^OMhjz(=P|(5=fB$fmN|dW^{$jY{{mJ2_&?WEY8Irgkp1SaDNLy)x9DG}maYQmY&dbiNvc%|Q|_#l-%#Yuv)V$$=sQkGnO zJ4&`!FGwXfa6+?7-JFWz1?`~17WR3&;KVY$dBf7j;)(BAU!ZWx-JPg47jIze*??(f z?MT9Zcpm=1Yjrw(@?W4odULkTlG?D=E6P}{c%^`}Z(~ko8G;t>C6qCNLX3c4d-n!v zEi$wAB}$*!Mx(30tGuT^g?pN}M9(yrZ#Am#4I3dc%O<5A&13mksfMt=wj&)t4frg#{ctMo4&oGR@p0xGu*#W`KOqe^ zh>pW3>V^wS0TX|B4A09fa+GrR9DIf^)$)E_xSEI8X~mb?|yII|EptYfj_bc>`41Hxm@>4O+6GZT32 zDf*ml2jq4PjJ6IQbYgaJnQ|H=30A5Eg`F4fIE;;FzAa$Rf^FJOn**PZq_`L_U?V(5 zdjp%Tm|saz(%J8XgP)c>9P{tU%8t_8Naj|L*P(?}J_>7zLf?sxnY&B`z zsES}T>f-O{+5y(VN9SyjG*RQ6u4s@XJmCQqCuXR-*b&~p<1qTUiSm(zPC!8BP8N_F zM`rMdgay^{SD-;E2pUZwOZX|3wJ0MY!UAUx*-~I~=-!_l%oKSm2TPElo117ENk|n{ z$NaupmjvzBAYpiunrzdCy!MXw*&CUAzyEqdReeAku*T^crG@0PYxEV(faU4E;leBN zQLsu`2Pizd7%ySGIg z;j*B#eiT>R0Pi@SDql7!m*3(UIHFQJhs?YC6oE1ES3GY;Xx;Ghw(0^&9>e8%Ft!;Z z`RkdI7>y{#`!yVRFZJ3?n(q4zmviaA=JlgPYRyxRDjEtx*IF1~{<3D_8A(qu{25?` zMV-4#EYH)#H=3&@h}=FZ2p*j_RRsLbDJJ@WGrnN18U*a(7X&S<e)oO-5xnm=qwS2kCNO>^;i$}9EEtKLwFT*= z%Z{dn&I3)rVr6r!@6E<6aRw9CdZw#6k2CHc8;wSs%qjT9>aB>SThj;0svP`kN`6e* z*+ZjYYAs{_HL%Te)NFbuYVWWRbQ4kVF}agyvUngjtEJ10J6u=GhNTYAbyv*`Fc`jF#;VREK>&SQaamwhQ&Jt{Qn%Hq934WkWH_)V+X1zt z=>dfW=etjJAbk&+D*ud9Mt7j1=o`XMj2&e~6T(%XP|)^30(~8Jb%0JEkw#x+1dz8GrM%J*xAenZO6wqVTlPE>xaR&@@YOTWS=X2s|BzkBD!Q zyPICAq9c__2#mnykAVw zIx_$YTvt`9ZZ{3Zb67b6`wn4U6aU>Pxl@=ow3J2k+Qi~4YMplE!mD+-8K6yS<-Nl zeEgddoXyWsCy-@_3w-&j+W0hq@s+9dg7@>YR$W|ADDZPk zK?-q4U}kR&XAFV$Oy&if88vtKu5ro!FtzaX;lDhmFqb=TOzA6ItnuCj7)(wFm0g7x3n<&T z$11yJws&&nzNC7T{qOiLI0f&V_xdeUN-Fn0h&7q54>tEjaq?T-|&x6i5NhG!IB z50F9~2*GY-fzV~mbkYKz?ye-T^?fx)wT*AsSeL&?mb1@)5f(Ll%uBU1(?kI;jC)H^ zUq%xIl+7JZw<<2o&+krK4&Ifp5`)ChS9NuIHMqms)xjE@+m-~*@MKgn@zJ_Tn6 zUz1)++!$C`BWE@aDXPzpX}us=t>w_9Lkyy3-(DSmVD`>bFpVTBE@E*`@Cj9wW zss(y%Q4i4|Uibj7+C1>?eeYIye~RrJLk!pi21mGAkMxSCrx?VJebMq?@Hrbwakeg= zfm}i zbj1B(_hxczajy)k^}pz{SZ|HKK-dv z{u7x%K1p0^n1G=^b|Iy=FpOskAgT}pbyPHLG^zM=mwdSXI$0T9>vk1 zZd`HiP_uo-68WPrO-N7355mTf4~ys8rfGqkfrmR-{0#aEeWT{Q6-X3-lb$m9Yi8Ky zd2x3%aLbgVYEdVEBYK|FKE#GCU}3SJ*9Lquz@D-6)ioP0_k22V zc#fHqd@i6-QNU(woG+wxaExN(OcOZ829$9em#DBaxm@ynkx+XQIVW(=pyZgJx+ZM< z6Q%5VBl#9WPTY~|3!)`qsxCqIE`PSeo3cUuY5Y5a8Z#aM0O25IyDADbZh;zu z;Lf-oyaiN!wxm8(awv7L%6l|y_r?~aD*uyzBhe6A6?j-oDj(ED#RDEMc+?J%Y& zU6JEb*;Y%Bx@IR`K%YZ~W!jMKq6TMEv9f{ViIe@ivVL!cv$RIig zG_gxQ7Pj!(nkXPbh5}fxw4optaRla%Q=GL6OT(_&zBupo{)Jg8yd|q`8QjJ+={7}M z^(6KR_y8dWgPn7N)0*XwGx_p9$OB_ zD6`4?w}bx=VR>(@jnbRP0@?|YIF&*OVTPnrx2qLJP!p(F_CWNty))HAHIwEzw`SOf zLAFwmjnXk_+au%sH`8oCG#K6IaOCtj@#`Xi7%F>at1htUCxm?4ggvbV#G{D^D0GtV ziGG{hn*31`_D5$K#~GUP3Eb)(mS_`cCuaweDWjlHdO=u0s0xV!h15?xPx+{xVO`!L zWCH7Wn_Y6$Vmp()b4DM>MoJ41hqpO`h`$-EM{Locd6~&v2L)8`N)hY zReAynK!F`T%^FFs*wb|}tFmFo-pwen?G5}kbn9RAfei+V!aFmmxA+m7P%m?xhMk^{i8_h-k z=OrgV^zKW~2S60MkjQk{@XDC{x{@!~Y$q%ro1INCo{|ZM^S$8SHCUyYV%KeM9KzcU zdEi{2OG`n`M>fYN`bmXOvJiQvN*{o^&bXF(L_H3%9G7rwe$E{hMIZ;=ffG(-dt{T+ zGgR%A?EE`qa$1KYpl|6#RsZxGu1^gV$5s0EF+_QXiPwA>1@xp@_$2^qBz^dp_hHym0^nw3DkGhv6Sf(!{D#C$zVsSOoLGEc=o%^F`Yl zC>t{RrMeGPDEq%N_E3JH0@$FND)_8e&zNoQ(52uN(-<*pSGXk&%k&62WahFUI}u|7 zA_L}XTYg;Yc+-*h)tgYUOu5>9yWAZ&jxhJ@QKR_mykfx$vG1U3iWpf=smt#7PCbj7 z!NV6WIT0dg8KD!;c4r69bY*V?dDSBhK#RX~g8V@4xU;a60^GubNmt+=O08B;s|$6B zdhOdBQju2L8;N4ZL|tZgS@Hf_6=Bv1gm{FNn*Q@mGPJ5C8m9CEBOqQ%255m-NMyB~ zRE&K$44Yre$oUUbuSR+@VL84al3eRY5{XKs4ctsWDe00n$T=zNSGxr*WArTd=SLsl zV#E-WehPL1Z>ZU;`KF^QyKD*I)1-=Z^dgJ+k8Vj>+*TRFXMvN3bG{)qYecMe*Py*~ zCi-4^0?OI<1Ow^jEhN+-Av;VNQOZoP-uCCzeWZL>GG`L!0_S(Y^3e`E5@9twKO(z0 z<+3zSEhT1{>$nfr>2lSMisM?g)<8z5ZN-e3VaRe$zd6b9&nW2&dnZ&1;AUf-^6XMp z;?`=_mT;R|zZp?QAzm2!!M=wmH2Fj$1+lU;s<5X7`m}FSDTCnLv~>Is)mnRmkiC6^ zJYK2n>Bb77Q!W1a!fGBcsPy^Q_&y^%BHg&Y;sIKpb|QX0s>pnXX_h>jdE@F$uR2uvthEBPge4(qT89PQO=+X>gY54LU%H z5Nw~xJKieal`eo*ixo&FXY6C>=|gZP+F`s1Wuzufa1FxTxnRc+EDZ<{s?Dgnh6!l! zY+%kE0VeF>P zsAm^+`B?0p{Z_MdCg3C=te@)i-u0eul{|vl*{@bg9A$3pqlkeqOH0|(an}|l))Uk< zT^qWaiDGoA->Z=oHUrA?6n>9O>)x83&21H8=#ha}LRw3Cn5gy{OfcxzqbGs#-Wtfe z=mQM8c5BYS)}S|wmL$l(nggl3xs~nf;~aqy=c^m3D$$sSq61xb=0L*Pr5&SreEO6> zGc|TM!bw5xCO@wy_9m^;$)AKJ>JXIDGNRD)Ar;wI?!Q^-+yPj?J;w)3!{|qoIA3qY-qx|bG>78RdSsIn)czcdaCN}SV0ASgE+$^mnWPAFCwkB z!!)#0PQY&86aC~%+t#1&@wtBrh@5sRr>worwgj%!a@raqc6)ZWBuDVF{-`Z`G;G{p z8qxV^6j)=#M1GobAzlPO>88rYi?k>9TtO-!VS68kR^fkYtK%SUdF|O)-rchBm8SD_ z3HT5r_27no=g$5{>5WSkzECEKnKnf)prMuzG$fa~XVoTZDq8$b7T)cJWwJd#kZ12y zk)^+WRgS)F+5=6#Ho~X@;N_4mxSH3HRZ=7K?{@$iV0_%BFPl!~1BZK@BsZyNhEiA* z6h$<8A4xBj;9ypDOyG-0y+sBPq^*PUeZ@CH%Q&YI-sg@l!9Q|)`N?5vgESNSpEc4rk>$3CI?Oz6JLU(^LbDFKG;EY7MT?q`Od~o#Hqchx2ui) zgGHjfXinbIKXrFbh!u!5+=A7V;?B3dvyhTJ*a=wR=A9d?(I$051di8{E_KjJzD^>- zjmYi4ev9z85zK&ui#UKK!apS3`DExPQ8s{LWCRnH8o{|fC+XcUAC=E}uiO+j5yOME z*p3AKUQp1EL;G~ISd$#7LMxrWBH+gFF9@l>6v_KMU!1BNputrq@t60pBfiQRitS^z z%XViQJ!Wb{7(XiTfn>^U=!z?~r?t`$q+rL-d;=aV_2?n;yZF?ZOxb$SQDlwp zb_bt$@?euf*x6U3PBs3^ru3i)JK1Ja9lMN#njEhMx?%CetKF~UZVVc!}u-D0GK9I>w%cu)W7Xya;zr*x;lgSET#TeYaBUys2ufA^~gZ` zNlrM+k?ljREjV7r4MZ1f*_|$cB81N#eJO z%Q}t0Lqxf})?^ZSGD5*iOpD6?U`aMM?A+clR>$^r5iih^!6 zANRrRg1@G|8oA)g2S$lpDqh*5A~u*WTcZ5T~l@9oui;c-=t zM?22HzSD<(YvNP-8A!sLlB?2Cx+X9dg{t9^@ScA>;yIFshz#JDFJ9f3XUwH^K8`_# zn3+r1mEVqumjUVOqJFkqj1!Yk3j7+O@!|pvR9KfJ6j&$g@8lT(*Ry%I7ayg0hdRvu z*kgzD3r4y@kw5tH&G&2#AgXetG2<`!Y5y(G`F_Q#=<&L@Pv(Ff=*)zr3b+a#&%6GR z!E-`U%9RPbtPo;(`1pC?VcG4K>S9CT-cBd+Qs><%1!^~!8ixe1 z=%wfz$N{Y+HdERFMs#PBO78GmL|28d0O-l5g;7DJr+H&8rhU)td9q@v&0*8r^ljhV zeGolm*rJBwmt36yRvY#YAmk_JR3y+$jQgUpmByN9XV15Q1Tm`9EHk+DXfM|{g#1!D zh{db%V(Uby#@|RYDs?a@5FB2kQL$?y1=+Nlr5ZJH{-Ong^FFawaSF9?mMk4bEgz!m zcUSKy@(b=4(Rp{=|255M2xR7H%>b?hAu&PTvnDRL+`1vskxLIT;B5KBKKJ&M)iA6L zc5_2hLtq6e;Kr0q<#ftPy3G~afKV+4Rc8>UB!8X@jY=*Ys}`imwi6Y%{eHusLS^({ z9~9r+05m<74oc=_j6ha6CGUia*&ex;rp z$cn4r2Al`P6sBHCTQ9fNgGKU~#TP?wSwrFAhNsY6I@|E8TwYydb;8{TNiA&dDkZ_Q3E4dlA!@!7sSMUs;xV1 zixdM9L(c*^MGBy@_*uV(Z8N_V-xu%WRcaO^jJ%CH-)_%kC%K&ib9$VN>P;e_t?JBK z1nJ3L(swpFt~JMp3#!SU{fri~B5y;?_Zuz>Sp2s?$mYZ?wQ))_NgIz=PX$Q<2mP~c zSo6ceYWO1JZts~7)Y=Ned()e>sH#+Y^n5#u8T*J9d$=r95%FBRWmk7>c_M(g?=^8C2=#H48PktkjcTAokjc>xuZ{EuMu4L13Bn8|D_SHR}OAW zH9uWVxfm#k&m#VCI!2J--|q-nOSCc^@*m*axpeh&St~rPs?mS_-qK3`bX{dr?Lv;2MtZi^^2$VmI*>5EQ%^TPKP zJuu}rKVN&cZn!cseix<}_vH^}r?f|J0J5d4;syYgwcRJ^Uzd4|5K!+Sp#xh&TyPgm zCXY<#zG6anYUjRV|L7ypf5SX7?L;Y^nyx_r98U3}0rvcDfm;fH?e`j@(mWxEJya4} zCxC1@`t{r?+zo(Urri8si~KW3&y4k`S86+B6gi3By}}TA|6qQ=rOj10o0#MFKSsp zJ;t+)&~lV<-Z6U7=PzABksdKON42w{RLet%aKEgpD?9Gb=_3m1seJGkyszhd+wdb} zGJn_bEuV|~d~gpMJtd^Cr{Izgj%vRjv=-IFS^Xh#wzfN14iw1~5#VLmrmf>d}WdtnyxC zl)@>q6J3ww3c2;ItSsx? z{;a6%rDx}}Fo zFFCeW@!W0SNzfF1X8)UZ716hf`vSL9coY&6jaQG^BW>fg)Oqkv_1kTNCGf(k{x*^; zUh(ODu(CJ_8XV@&v3*4tlq%7LQRuMruZL?1L7iJHbjTFvTp4k|5&g0DIM83SO;Mle z?9zMoz6djWRt>l?jiCdT{`bwvQ^KOOi|sk;_5t-s#L)QhR@>?D?xRap*1qYB4^*0a z4OG>NSk|<;t;w{0G@4sI`!XK;tm+>otUX&MbgQ;%^ECJKdpW=74L_f}QB*$OQu0U8 zUF3PR^pKe}5w8p%bU}9aQUWr|Pu$wVf!Q^o@_{tM$$%};?CY$`SE0JVTr$t0#lP57 zZtt^ZE1sT8H#*@K5mG+}sZXTp)7ApN)%~>D>P|Y40CXtKR~Zv9Urvu%rV2swwJ7jT z_Gj!bm+mbQBhR8}Ca_%4l4mSPw>BRyc25E_9v-x=41DT1UM~u4^0d%oS(>iyC?B_2 zZ6q7=0gBgUKlubB#`fVk3q#6~@BSGxcpPli8C(1N@nPOFDkR@bPg^*A(@GuaElIt&@?+|7&h)k8Oho*d{^oh9 zQG9_WI|Drtp|@<23L7)ed@~niqXE#Zkw~IrnflO=vT4H)*=`tQ^q5k_D4<%JulTA$ z=~$6fh4nhD-|y%+IU{YV7E?V!kvBOOf)w8v;Fz8t{9uY)2B8>mdwyHCJDwiHV^YVN zJX+wZ(z8TUXU2z**d13mW-?Q}1kHiIse+g;io=&wNi_{L$Mv0nwJoI;tJTSorK90o zbiaWJD3CDw`)2(ZtGY35mg3vei!u5hVUu43g`}ENYEfR)q3wPm@1BKiNWx>POpgWbR>+whcg~K%}0JYU;I_pW(EM! zNQLn@ABJg|t}$S`7ZVlD#MjJQ{(g*DL(6%KV^argy=?N zBQOmieuG*-r6fLbthi@ATGT&oVI~79>!8B$)Sb)qOWaQZbm;buo3cM*dplNT(=gKo zy_?B{UTAeM)qt%^+R!d&7|@>4@AFJq@bpJyY8OoS$Rl&Vb48iYEgf>0bS~fFe!C>h zGvi&KZbeZ7K6J9$vi7mmb(psy7IYggTb1fr!_#PBCSLY&;{td1VP9|ll2C4g7P%(lW4|?{c!tlN0nuN#WnQCs-lxh|A(mf3 z(q4-Sv|K#isyR@OiE55WstBMi-x^uaP6~sF@4@yWrdRO$yM1BpwT&9hYjnc2MGN`9 zws+VVToLFXI_`pe@bJNL;67hr{!BhdrYL_qBizYePa9I2uLa58+8Kmbqd|z)=jlcTIwZLTpX2y`25tr`Kq*M?F*`xmk=VRjQij~Dqxz)4@*RL zA0*APev$HzIR$jf$xl}GIJe7ka?J0$N9(@4Oq9@9h{}sIni8it^Y0FJyz2UaKM^=7 z8Si?;@s>rXAOsOG(4J9=0|Cp711R*=UA*nI>MJL4Q+d~xX4$cfV{DJ)TH_RG_42ptwS?Z*r$4;O@?Uxa^b$LolYfB{np)D|+k7kZ zJx_V5iv?9LrEh?&5Po|A0xTj7j(Yrsh!W7!8DWFK{Z)jFV$N4KJ*yW3)_iYG276cG zMy@2IbJnvUHvNEOJ816crl*9vM*-SnbG5_LPrk9d6s)o7m(AW9$6x;}d=jy2PcJ>ZAtCP%v^+_UAK0; zo38fm*=jtxaZ38<{7LFIe}>YHmPN;=jh3b2=QNAA8R$V}Va)MSC1=J1Sow{r>mQ%< z6%F8Tr=@mE?9_LF8SofJnWjkeST&cvvg2^?*~XcoqwVHFT(;SBzx>>;X1D`lylnL` zHp;{Ww&hzKHsKb++l^Nah@63$4ZQ);v%RL(9V3eG{5^A{8h55u>W9RqrpLrt^h?J_ zkHXBZ+*_phfNOFNIX56Yv6h@W?<3e(Su&W~%WY5j^`8%YbCF!(-cFSqkxw$Om+a6D z_QA`!Se*~WuiIYzkBVMIp>zF@M^|5ZStH|)-RGVOq_0d~-=F+V+x~DCQc_VOfP2ON zU+?ov^4A@@R~Z`F4{Qq0^trj_eJFTkkJ#T|xBiUMll7E85OiL>9)7rm@9MlR{33X@ zSUK^#68-RVs<~gEE){0g$LMPKa-F8J7tXlFaQojMuh-utA+HCo|7u+!!WFFQA!x8e)} z4FB5@5fgqZ@c&x{MgOl=N{WGB)6vt}--SU?4AG{~z^~2lmVsX$WwWv!!L#;bxjmB1uR=#LiS42=#+A%7!p;zk(d=6Ra!zl8jchkF^bAsjtC$*@zlNGe(|_#(~6Ol*f6GXFtaCDY;PV*#o9Ib$)Dx&=rO5tK$O7ob1LR^z&O7+M z(Xv<=L<|@_$TXkP^rI5Fbm?)VD%Zk$1BQpeus2rER$x6m3B|5PaCenK6w}9eLVjjI( znz-O}#}kTvp@_NQe1e8d=z!&hCLKc-Eq~2|Mq-DJjrP`7q%28SyOvRycpb|!4iG0l zM7c|=GL-d}+9_V#KGKwBY;du4#T45(nRcY0Rr?$R7zeg5NrEczmZL8uPcZSZuo35y z;3glANbLFSh1k*i#61)!G1aAOs^YWA>c8R4Z_hAPSl4o6>c|XL8?M9_%x{$M{C||a z1yoy6(=J@JIK_*#6e#WzoZ{Nx?h-sei+iEPwYUUnahKpuacQ79!QG*_LvQ-ZcmIFA z-?f#slD+rL-ZNWr@|>BI8JgCwUxvUg49#EL68+NrLjAHtr2<&r(iN~;v2M|ku)a+i zPGw0Irgt~kZ<(?zQH(_H3tyMPEd0PMl%%1=UJ&Dw%p;Yaq>}`Q_lS@Es*+;DX#8f0 z$=~EI`vMVDncSaTK3$ExbkJG+Q?xxQuNvpUIuQzkPewe71Equvs-6 z$E-#iO(IG%hgC*WO02?!!}Oksg>{|@owbl9h3S<>TmFqqL^-H@v!YjDoK1v(+poMye;)Z%gGs)rP(dSXi8Ou3G1Ecd|1YS12e8;UW zV4l92!I!qko6PUd3lyl}Znu-;u}mvSI|8&?$7U>~Gp6gNo7PLPAF|(&wzB)MN2J82 zNR3d8AhDK`OtLJL{;(f3fC>K+UTNvOyQS(8s&Q@jxtDPs;UrJ?%VE#cF$w(Oc;+|{ zeyZbd+?vyYFK4of%-S4hG*`Hq{;W+KfHc}Hvx``@qIpmr3LlEki_AqGQ69-t<4~_t zdkEohX}x?CP1r9hpPLu9K{1dR`#bY6izh2q_;C%qmAURWcst~mc-wYce;#IhVLZn% z&GDs@Z`Nzpzw(Qdj}y3&qA~0k{n+SQ_71gjZ*-Ow4@rbu1U^X+S*_ zJ>4dkn~4+YwJJJMS|z$;xePgLSr3^Z`99fc`SysbNRFsiMuIkLr6IZ&e3m!d6*Zf4 z#d9rl5wgos4V)AawNb3m2c}@CSKqp_GG8i2N~QrzXHxrxo+!7t@RQoZa}Tc8P_dfm zdhjgtV=SZ1^BwZptkxKjVb`_f(^rg5^hs|;72OmUGXyg>Q?#=A`mZ;2&rIp>-~I*$ zBob!2&}`Mx82n0NNv6p0kt(KtPvB9wmtUc9K%yUxCHrMhWp80}pbu%i1&7}9qntw_ z)`RQsQ6AVGg9Fn7e=E!V(OL1VwJM~wX(QaC)=OtyWLAiw0SfK?9k5B$HMPwm1;(U z)jzy@mYr*yZ&$9snXQNvo~p8oxg&iS>u2luZ!;4{R^WcRr%O9POo)%tk@7W|!I9MI zcxAm|%PieO-wA#)gJuY69B&|T^sV>byHegdAHF{Rx*T6`SxsA=>t3`r3KMy!#h`tq z?XAUsG%;WQaTc<)xHNm+^xJN+ti93e_r3pve`BeC8N?ylVfZ@n%I5bcElTZ$ORg{sBLp2POJ2 zmZ_9vvxu?#x2#_5@HX2p%*!5G+7ON5d9ocf`8usNL$bbSiS3|_nzpUFt{IWl9{iL| zjbh{!G8X=r{;_#0@-cbasr7iHbMDclZJ?v*wzOw@#vyig-e>1JyW`m7@esF)lFSL} zWU`07e{d9c*vbDwfXge&_h88J#}Sz)^!NK^W8XNhs@;z6$Ft`K`1S$(_w{za0#2sB z&Z=GaoP>FX2_f<}jNBacDEy#<%WuWGzn*M?V=GAa+{FET@Ox3OtUI4G;J9H-LAg%5T7ZxNZ9s>3eaj2T;XWP1G=R& z*rWUj$^-$L-ra*AZZh$I`?ldYQ}r}stM5SDk!eDwbGMDMQ?JSHzo2&DV_UqoT}h?6 ziU^(~S+{z4uY=lq!Vn((na0neP^y@fe31P@l)>L-M}z7!DS;eK(k1pL!C#Y=LLrGOCcs?j%eay4 zkE2P^Px>cd@?VfQYYoAR?+3$q^SddlFjm6k-zr;JyUZbrE@Opv%ygq5zkgo)L+>Ru zHacH)1l;`C^u!1;|92Nv>E&DkyY78$T53v3h*7FE)@&6a92mA}w8`5wpN=r+byIO&0{sHwhXpH~O#LM-c(4Uw4 zpV0sR1n;v9hhh)7AkKK;7?n3+r0?dtO(pj(zOBqJa<#?E**s7W=q_*@YH*rPW z51)HiBX;Uz1qs z(?PbkzO|5Z8jF_BwkX`J1b57(AHJRbI5^>apL$T@YZjL~sL%5BnQ`d!qH*Jt&u{69|Cm7S1^(aN&P{6GW7bZTaOoPBJ~*i z(UIiUClMo0!N#?Hzr{;34SH@5F*!JadpiH^q39ctA>)DwIjgoHUA7TO!J|27x6RqJ zRRuzxbv*G~q(XaavN@!$ul&74pi&d{&RLv6dXl~|>}Hw+wDrylrMb<+_fy@~s%#te z)xa9gmW+zQk1waDeOe~SNK+N96L|T8E;Cn$+1X)BcycsYOt&~>vEUw7jNl=LF_6{u z%ge@ybW3(9MX~izOefQs{*l|e0`)rxv$IYMN!z?6)-Cq z>UJU5t=*4HQ}`+TD>jXedQXZ=x+Dh0M|J;$U5 zar(Kx&m_#2|MAYhA||rew{{0+YU-8lIIWs9J=dE)j6qJreEU8y!Br#uCy1GRoq)Z~ z1}#?ehe=}Q(cCo#kX7(ES>VwJn(w3wgPyBFBYtI{Ka*WOZ^ZDX8+GXaLuqL=^nR*7 z5n@h7rJwwVTh3(jB*iL3wVb+!&Dp*I&JopV%OhjyiPeL8hU6cK%9Z^_OU&iL;ZdL{ zd4^h2>xG%vIbD~=I;}{){TJTv+o;6HIY|@vfo&os@u?!rXqjW8CBg870ZM|5t<16N z;xPrxG!2Dp93!-byieVkn9Bzd#8D)dppL>Q>oep`5L!^q+>RBp6K*Y{Yz-XtQ|X!L9t zO%pkP{6;F36by6)u_rDK%$?1K7Y$SBVEGxGO^^T5(OwD%_upWstMk&KjE54UP8;$X zq9~x*4JN$ISx5(*p^4;8HQNp<>T(HL+XNt4+Q{kB^&l~D-jNhIC;6_-r;C5YNhFb{ zXS0bvnHimNE0Bpl&8V{Vv9NKUNkXJo|9O~~K%1yVv?Zz;b7M5>pTIDJwPi#SOlLuT z)8u`LHeDiO>Zz6^xxQ=z-qB61@=iN`Osp6JJHCZtdT`zXalf+IE8$`V9ikJM8En7Z zd*>djq)+GaXA(|~cEL!ffkdQ6ljv);&@zO-)Tm-QB!p4hn55Nf*T$LL_{MF&VO;y_A|eY zS<1}qx>y~BCgy5Nj*25fb%HCeb;)qsTW98kq_+MIx(I;!;j!t`f``Rb!VRxj&O#mO z8ROfomsT@hP0napr%K6XH=>^%px%F99KawiL!z-)z_VuZ)~VE2Cj{{p`%{)S$Y2(; zIrIL}ONw_ws%AfTIp+VKo%-`tglQqF+gmfvL3=qPU)?0h@8N#PL#9j>*Ye~_eOO55 zoMk@ib=V%ETBV49Jv^MUr_JT}Tyz<!M zX_?gbq}y#BDZ>=M@HJi3u|B32ULz1qb!)rb*|(Po(2+qUUbisPLB7CccoMO5CmA`pjw2_&k@( z+lchYWgwzqZofqpF!@*bBt?U_`{S)tq`C}Ng}&<*6anRO_(ZqMc}dyZQe zI$AAs$7a!YN(@5NAV7k!%6NIfymze|LzSp@z8WYTbR~tDWw8Cy+2!n!W$2AEYe|!h zG|1(D{#|!Usk&tD-a$GjqgoDEl%T~KRv@Z&L)d}=TA;7Mye;N^Ug*FgpCjsEdyR#Q zyde0>mDq+$@^uJ?lB0!0Xv@tzd+Ek!Ew@-=S~jb{D{$l8W+hx%9i_#U7FN?^?ix$w zjGt4-SEAPYKWqb>LIDl*;E3{8s;o)98>YiwlB8F1HcJEQVLy6C|T z_X4~?Pch@U2!}gt)F$2b4u|jCKitP zY=PuyY5EOEEcev2^L&EUv?O7hDmrYB#;9!rdaQ$^PN5PV`O@p#xr}Ix(ew@MIIrVw zy0xV5NT|1bddIIomh>He<{qtC>3w$K{f^}ypSI>L(B)azv7;AN9vf=Ex8^e^a+KK$ zka3*OJ3ps9JU!L3nm`Vp@F*E^C>s%?<#&JS|C;LdXlg<4kTfnDPfqdUF#Q&r+8b6l zexPHE|tokKQc-Ig@7rl(>o7gd<- zQgcjNG%Sqb3pI?W6~(!Netb>M*p+^=*t;TLmH2~e7WZB z2@33|@foc3HW?|NH?On62{UY2CTc*K&4mg?B6{_rusNYzP=sZwT<*BWmxe309igyNAXeTJcdP3U--=Ag#GEHF97R%(<`J+V<1G>gOLc4@vMyt|}$??)jKxE0CdMw>}R=;Z$Ra)p^ zgRK7mt+X^|3o*y+pUE`XKdTLUOX!tE$5vr0{6R$^3lp7xPWM`AZ#B||EyI2>qp5N% zby&PhDME$a*mJF*uRC6}ZU5r|BtZ@BYj6inDvT<)#|IQa3M8ltWv>xxl+LG*;R3q) zcb-mZ>9y^D3HffSgn>7P$PD6*E;Q3!gL$Q165rHZ2F;3LEZGq%zN5jC^V*B`_Azt}x%aE=>T zjV$8$#)etSkfh<`Ca<0N+N1@G-$3p=IPguEIB}uME?!)i-%1~K3yU6#sMM?azkxCWHt)}BP#GCCN=*|9Jm;y67t_$tq?x ztB@|CKk`_5MeW5)(`8r~T6FzqoKmChj|;_aWwG6737Wfo&gpGI5e}}6?LB<_2muLN z4|Ihw$=4fx;KnD34V^-ZBF`8(BYDfI@Vy!db|y2r;p$~%yYZJwqqqbUXZ{$y5mSrC z{ULh$WG}fV2DV9Ue$P{0j0dJSH^gubYF?0N`@C~O#CJHy3bj+Q^qWOuzvosQ8*oxa zc@duKal75Jbop9j(k>U@ge&t+fj-GEq0WJk7k2{VFp|g$s>qD+ZZt-mK+9_Z68VvA zS|2a3Bkg%+Sv7WcE2&6=U)2_N6E)`;ugX|)|ukym!&^XqQyn7 zeT}f}@RvS_L9S^0R}wJCXH(Y%4?|O5;ce)gE*F~eJxcg!*Gl9ZEl9^1cD-K1J`p#X z^zuDwYzmAkBy(&Zpmydxour&=_~tz$KkcxpCT8M?<7msBhx(@pwelBvOS8RHfRmWa zgg1x%}AWhmyn;tv*ilbVWc|~iWdR=Sk z@g8a(W|Mb5D)rlOB~_GEzOS1fwwn-n2*bfPk?*OOvJ|j2b5BaS#nU-99-gSl%;?`1 zZAHJ@;JQ~%nOYld2LZp=cKQW+8c`LMc?(g5IR!0*FJzCQm>K?|@3pyY=zQKZ@HR#Y^G3ANf*4)V(7z8U+ljbak}6NqzN8j#`r*&>SH*`xzZ^=l zm3#<{PbL``;f71EJ3ci+m?X3F>VvwIT|b^finN69em_0;c$U)tpN4>c+`9iY1n>$8 zaR2)rpXc9BzrXH1E$j63uVLlt?CxS|p%k1X_XY%%z;Yunhk;0JwQ*1cZ2u|N8v?mXAsDCW&zenNJbhmK(N6SBEOv9;b z2SWH&d3l5YG@J@nb~d(d2qpQsu{foj!Okw4AIvSSXn6nHY!LI2vU77)vvQGkcKqP% z^mmUCPT2pGIp(k(7Dum`GPffH-?c@q7@esg+oh(A2oozsqi%S<@bY!w^DNXy%)`DX zq)A^56slNRC*=3kq?)V1V1>>2+35%}NrDLaLa&$LJtYYX*<2)?e)2h>G7I6F*mAx5T9Cmu7NB8JlK~+1`rQyBE`_H-4*y- z2+xqkmch94WueX{nS3C-`KjyNW}?<%ekqsE9c%)Zr}C6T$ECk+QDz29*^XNIa< zZ1A6})HDc0-dcKyVP}4uQ>n29<=Jw5IV=S~nW^crm0BZd1MDX(orthy01Pv(h5+bC z2UDWG_?U>x#grKE;{2?P56IF&tkH^&vhj*P{uMk;Z_E)s*k9of%$NUv@8VE>dRHEy zxG-a)^942!X`^_ggM3hz{h#Zz2373&JNX6UHneVj2@nz73)&^3dg)cdaH*kOE;E2E zk|k9WO@@6jw`sx>ldPam1C8gIq)qn$la8+~vQ9sW>-!vsVt(_F2R?ftr{yI=_>L@V z)GBpR|oP{s=XCu>QTkXg~1E zw4tJK4t%@>j-}xNp&O`ufku%ou^Y6yZ83oJSuxo+IQT+(?_OTmSp+$RFI7kmjZA%P zN7=ePj|6vHQTDaa?pIioxqq`jNEIh=4r%pk0BryBL-c*Pp6mHR?7K zg@X)6U;j&syML?me_zP89!LJ)z1H;2$g-8x^Cl2;ZAz6wY)G&}&Fhqqjh|g%6!=!ewzyGa-BL?}P z!gFqJsU>8s_HdbqESc;yD{{mc9+@*PoEfzKskEo}x$!2eF=IwYy``zUwT~Y|8>ywq zVsD*72Cbj%1w2~c`u1kf+8f=HLIz-&qAwoM*oLM4g#a-IT_`4vFckAycQ{r&EZiJ9 zTm|LVn^Kwv2@qX_GDb~25QDf^SO#Fx8vLRaTQZ{f%P-{km|tv?GI9V(vllD`a10os z3Wh|Jlui0fi@;utf6%O%P#z^uarI6 z%w{t@3fzg?yNK-TVI|sj2%jkSAs8zPT5doCt+7`r>!zhF+pc3_`~OwyS&lS<+s`I` z4ayDtuY)!r z+%_Gi{C%)LD!raXv0kZ0it{4sO6k~V=QK&btBZ}&fq_r0I|C01i-&6j7zh($P1bmv zdGVNAlOK(yk^Y{0j23YrBjs+@Du|CsN+%s6hO=3Clqk_rGV`)0Fhliw4>b@m669DS>LZ$Tf`2i7FL`JUQzkTo#*0dZV{dvdE3=i|b6ejub_qW4L}FVQf_ z1zQC15zFSjLP4Awltf!OP{vk&)KPz;MPveE7vH*i!ycA>9826I)W5MKSQ^;uOjSUZ zD}@d8a{pNw9qkxo8vol-In<4Y!JURTvd%JSus@dCSRn#zq&FS=GmDyAJ@T(Gyl8tx z5Xf@qD_(Ct9!M_UgRNSVEK&24rzSWQP2-Y>vDAbiiVOho^KK^eYfv=8_>y2oOA9em!y%3UqcdPK(Ef9I{z;fH zU?&{)1`**!buh#OS7_HVL$g7pcORae9`CMhVbl zqk`ZLAC-14gBW7|VqZ|*DB!55c|}T~NnQnsqIjSLmk+`;_df~4=`};XFvH8e^qQJK z$VX^<+2oKXRZezW{qxeX=$K|n2VW7X{RlK$OH2YGZZuEvtHPs960rb1s&uCQ@DFL zxEDdV!hz5IsksZ0kOg3qo8->(g6PKg-9ZuH?k)N;>j!b^rV7JGYs97ZVH4iu{m#89 zkg_(zFpw$yCRu7ZZF&(|0E?EE63tS7P>C3%7ShID){GYZ8Kd;8fc2#V z;uKZ2YuiVGwaT{yoIxA2%PjS>0G63Ehye7|!8v)JmXgHb7Dfrbsc%$rjE{+|w^+7C zazdiOB`8M&&1J&Au>R0^!OGAhXT;Or(jXBBbR(EW*Zs-~a@BDT*W{8j)At46TodG7 zqe?0cGGM@R2@x94O2on9-cQc1?fWWbj5}H0_CWBL2E7`h(QF$Hjs;qs@>gmF70VBS zWnZp#D*e~*1)(KuD*sWDzNdf1X@%6H)mO8ukJ$TK1_L%}P;J_t4Qnje8d#?nI%v&3 z8K-09@5>7%=O4GgjE7kirdFmY?L?FN8`3~e9Y5aQ(NcOF-j0&PZyK8X{NrQVD*Se$ z!G4BD9UX&m%Q_vda)1tY4%3x=cw2(=!MuwcV2#jF4Dtc!P_B=F3{wAw3{>!!kYDM6 zgZ=4tF=#nRkmr_ks4S~Eb6+J8oHOLr-dq5wZ^)yFpcX0ox~x#{#_z0{@iD9;86z>^ zpN_jqQlO1t=(fvPAn>v{tC<@)@hf^^T&S=!-!Q7qCjAs6Nq;5F8P43M6powr%i!Vc zANbMXaEu^K;0wAXeTj#>jd-BlX_m;yfs%?lcD7-&u@|mVk0!Id7UDXNd9CqZKbzyu ze}6x#%dMRmOH~;sW^#z1dM4sw!c{y$D{Uq=$}$FFzXfP3%9`qgZN+Doz7FCCJct%o^tnh{MDrmN=bd0mty&nHTU~gHiwH!T$CbcZYDW8~aX&5olw%zlC20 z(30Y6$^rf8Y`H{1OKCjP%t;21o)Zkr*@;1*1p@5eT}

f*C8G6g5H+K3;8hTCEtd>_(y)QP$?qf%xj#KsJfrVTK_;;KVPgr zVG|qMpT=81->$E%?2LaZtN(n%{_M)Y_9p@Q^ELb0`d5VY`YwKL`#V_qPY6p$MqE-@ zlUm8yz}DEn(OBt&jWmstwSld(9s@w>`zLw!C+!E#!1_Bk_J@l4pGW$miB8zU)YQb$ z#Ma2fiBJomXHH1xY;NLgKuBk2190Rbq%$_Lb~b>fdv5`-*?RppaCEjXur>z#)lWI` zzd3CIP|ojY;@>)L0c?qWhjGwage;5zU3Gw^Ix`1ApB%udvM_V}T>l%O`?FW%31)TL`<+V^HH+wF@P@;#@y41sH2V$Xi&pXwuC$@ha8*RAw03NhU^|$?S{hmtvPPD)^KmQQ`Lz9cJnH~C~QJtDBkdPD! zpJ@dpj@=F(3n75?fY;O$&~zRFXOOg(6Y-1}r?h3Y+%RbsQK!yfG0$;oh__OK?>R6Z z?hPaem_YIx5Bzg9zuv#so65-gm%;oii1>4iymGOB4yWIS*KZX)|7{%pgwo7^7lQ{p zN*X3c7C?m$2VenEg#V`+Jb)wqomK|a8~qJSb1?l?4gL>S8PMl$K*Hf~Y%-vj z=r3$C>u;RzUlH`Lpy&01{}@{TEbL+X4SE0G0l5 z*&iu#6gyCG`%g#P54CD%GW6V*AH~m4+E>j^-A->lj7o0h9c3uPo*C;6BuM9!>MM_P z`l8^Gt_x7DP!i8!^XD4ixD&K~`htQMSG)^U?V5ibUH!wLN~CzII@f2>mbZ6y$F}_J9%B#0Uj_V>8-Y1Iw{| z>1$nphY68|!9#t$is)i}LCc`nLxlZfdi&8qc?O0VmzNG9DjjBDL89Yz{8wX-%9P3j-TAc8?x?Ai%HPIfg$6*f|6k z=bJAb*cucwG*X1GQ;$9>l|gNUJhtD~OD%|rFZ5kc50M}yt&t)=E5h#o zGCDU>f{;TS^y#@52wDJQ>1$GC6F`SA=r9l{AxJ)K3vdg{Faac61d?FIKH#<4{%0br zgm*o?0F5b2^W5syN^CzxWd=aH$(miqDqGziXJJw z&bt7Iu&z%A$lW7Bu+)77Fk}gziBf@aRl3b{*WIfQ=$os|Z{hrTpZT_yg}-=;8QL}g z?<<3Vo(cC5NBAkEW|^Cw^TBnkcXp-3*c)@lUs*md1II{$lgzDqo>>yuqk;~h;~Ua{ zr32zGjvH`pGWA84WCZi1vV5vqh` zne*@pNzRPYDn2Ppsk0Fp8BLS%vzuCP)DYp~`3Jp0HcLvG4E_%oP9`JG865W=tM1Oh z!DI_A2P(<_xi{0(85_%y2g(gMS+NX^26qgPHAAQ;6ia~z%6?>-X*3=s(5AavW22tB zs!g-=4lj*KB1sJr3i(S@I*u&{TuobY{Q+BH2OpXeQjT#E@8YH@tyJa&G;XHE)k9jn z_Oug@*Ltw~5~6zvoAriFC|T)9{8b#zju#Rq+yg$_k3xGzQe#DXx_%SexTJB61%rIZ zj5iI{X)&zHxS8j544NDRm%AB>Hz^~&E>v2%eIfp20=jciPQrAAv}sKO7jK9wLsNOt zVQkMaNmb38tlpoCMYQYUvC*W6nd5OaNbjG#8Q)^hfnC^IGHY6k@m1A{Hv>Bzd(MeA zFV59I`SW%x5CKYeLsIL0NK;b}I=)pOY<2ZCLwi4(6@-P{xLc%Y!e9sU%Fe|AhK1Nl zZ0RSbh*KT9m5~Ec2AJdy^?Po~y2R36tCY62NEuMTQk9EnDEcFuI(T3H#R4K}k$ zHraBl80y;(xxtAOy68HvdtN0KUFlykC;g+~*V8;!o~TJIc(i!bfXa#|!=;|yLe{yV zi)wu3YN;(}MwM`iF2t5>^tx)IcUEX5KaFY5YIgkLDQtjcrwUz~w;5|vi>gX{!YKtO zj4e1esnTiI=@6O|b5t03DV*60|LqMqdB*C;^+E=>VyDe7_hG&^>DcF*F8MU`bB1CH z>RHXDVg8@2wm)n=Z?^Fw+@oBQ(NdC09+$q2$JLB{$s$$%W$ruga5pNh2|3 zWPuNt;_aMga&#j2YooR3$*f+>tI~;ed}CPeIdfif)6t!;a+q(_i)V5`5bJ_m?w50c z?7@LiT!OVbyFv>B%k}oDqJRGke{+$%^tDoW4s_V_!;keqFXT{60%K}9LV})xJ56$j zJjNMfodAY|WL|^CAX<`n_qqU%t4>Lu?8D7cBTsT$&y}VlbN}>N_qt{m@em!h04jE- z`=SNuxITpV#(<;n>isuHo{HJ`K4?vJ}kX;kwr^n-?3N?KO7 zmtZZiLU(1q6mNaIRKu~$tqAuHLmh~V3Ge8iXM%yD^`-9^&Ncn z!JE?4V01ypQedb>ZA!$c*J-9!&b=^G=?BUb&OEKdb~m%FqA?|zaK*-WNnD7vf~xmb zVMJUdd3feg{9KK3UvZ4*ss2K2f+CbseDkJo%hG#;Y923b@FjmcA=y zwL^2JBS`J|J|liOKU-JAODPwj8~c7INMt@-sGN)SVg_g zK_<#W8cO6kl`x;?AqK?Ir~Akd+JSpcmg~1I7c=`^B(jgxqiP_FjbVBo*4htTFSq@h zJ1(vsF|h=hx73f8u9qvGYkj@B#mfd}S?Ii0P%V8^r}x_R7iIy>(k-qo*uoHY^{O7+=96KZCSSgfbE$qi zE_vbo#F3}nM{iXR^05sbvlbJVq3nA$FGU5vSnkIe@->10!`b$ z(8wh1sVgbA&YMjZ$*U^E0voH%*JyDylK}fJ%Xo{8G#OSP*NdtaZovOkvSOL~Vv%>* z^I76aIytWmC>R2{jmjL|ZllH+gT$$aT285sPsoEZTkxQ_QFB;$Fa6lgiA}c}Gc|qf zV_Je@4?(Do2v1f?g#G(n2lCHrMO(m2kCw6%2HKy7oF+^7GveMm=yh<1zL8F{F5^xjoBAQpfiZ`6S!2E3oZ<+6>FP2x zsvXXAvjH3CA{a2O&D0)X67@rttYKA#>U|;^%VEA>W!%+swo%HhV1I8;btA=!F3J0K zDi|{!gwK%R;5ky;X&Cs!JY0qh?`7xo#=l0NT0>RNIPqZhDcTWTEQofXjR!hosLJ| z)(_cN!UKkq-hR>Ja6;5vf!{6(b7L_vDp&K5D~%sEc+@?J=}5V`G;Kkeq267mS;;|$ zttT8|rx_c^cQlu6%ck4?*r8p>K_cB6sV6PDJw|k3-|Fi|@)$AZg}Ld#l$o5H@QpzC ze?&<+TEAUxTCRcyOQz!yyo9<>{jS!L7lFBl1wOo;z-=HGTGX8wMlnP=r{3F6VC5}r z`PgRnTONR(+$tu3+2ez_@igW%>Fqle5w zOkh)+mZFkYGwLi?34^m^|Mqxr;*lzbDM8I(>9E7jcF0ah>$(M%1yhuU?SieQSh$mk z@+($*89UdOQN~WEjP@q2!D2_M=&_3%)7uJ#YW&^(qC13eKNb%3+$RD)?5hrI*`p|> zi-e)%bGIgb1eJ10@=rI<^=BO_qQRu|1|Kw^ub`^h)jy}&r4A|Y^hVsczSD6uaHS>&9n*ik}QU}9jVP}TG9$^Wq zq6ix|Gc%oh^p|s$34e2GC`nKVrD?v{IZ&F=Ek!`#W)~L~#%pXCBIRk0n%X};b&;8G z0nYsm-91^|54kvc{Mb`3wiPSAXCdT2_?}m%KS@T zhzLyUtt1IPx#xKiM0XvL{Bz6bl^TW+op?5tOZSrrSFoLl0$bV=wuU0UT?oc>;|gOI zJdgXbF8uu9D#`%LTmt+u5afeo1>~I*>WTIfHeQvGnPci2K0`Ww!m{1s)G}kur(McJ zdzH_Q_wqKWBJr1VK|^<-k_44I-}5V&dD&%0%7&V_T3l~4)?fstt;%{vvZ(U4rp>N`Qa7VmWoK%t#`y8N<48 z7;HV5)nR>cNm1e{o*xgxFIH5rY|AC{ygnSMh6P5C8atLK#$sLKvf$Se#M!+k$-?g0 z57R)-L3N=n-jkb8VI^LZmsy=?wR#dZpPPa6g+7GnyE z36~ucCjmvUHJ{qbLj3OYM%7yhZ*n{aX0-9lIg?`5Nh%~L%35P}r7~ADWM!ldirqwk zW7;vPy=e33vHHT*@w7SIZFu{GV2~@9b55o@GEh__AT%aR#}lBjj}uRJ&+rv&o4nT? zQ2pV?>ChB|1|9?_?gzzleleeWskO@NiOBN^n9s*dNws*+w>b`%%G26<{H4qcw5NbS ze>3#MG+JNj0FVc}gc0F*l!9K1(m`?*%T8 z)sk`v$vTQ7D9<|Np!?9pFnVOSL*pe|-@K*S>F?8t$3?@FDB^1k*zAKv$OQLp7R1)Ew%b z5>aZ}`~5?qS-XeQo@r?}c_cGIJPyxWK%r~;AJA1F4Kg>H3;RUD5DN&rRmo zfPq#PdJRGG_EJHxZA%=rD=UZ7_veq9*r1KdWx7`zA=XY*wm=;A4J8^)&$>RfT5h3i z$;|ou<5^5qFwenKu!oF)RAR@zq!HwYKul`pVZH9Dp41Z(fXldNu-F839{R-7-rdKOSAp?7H6ALqQ=U1MPnUNj(_p(%m*UH{s6e2U*A5#QhN$@|X2r@DO zdi`0K%JwgHsXtqOUHC615wN$v=i=G^S(nQ8&$`r~<-Ll4V_Ez+H%Y)uMxR#N6lH5I z>INGeG*$H%X(S77=u5*E_iZDz}|LlSA*Z)4=rA5|0Xzh&Y!-`s4S32TrUnPj3*1_~?YYJ`ITBa+hAiZntTs8L zu!bnvC{g$wS6N@V$}mIZm$1oi!(IE8c48NDtX(r(N)vN419x^byf#>mEEnHg80i}w zz}SJ8c|#k3gb2Ilmc~a1yPhU*3K_T{FMPh(yD~R2JXOBg1A^yQ0);f9&d%K|OqE;o zDZSA9@T~F_eFS%ORJQao-tZ)Lz-L77<_M;lO5ep;>v_-Ycz!zA#BW(>l zEd7#$!?pMXIR?IWCg)f5JPLbdh6vHuz^ZxzWRwl{F85>kq**tx@{5O#DbQmh%U$Q^ zuP-!k&vq84FReSz9?{QMCdJQk$uC+DkEaE1Kb4oE!j|ztuIXWd-hyF);&hRZ0&M~L z`1Q@-zZ4ki+t_YDzvNw>P8@Xke2xw&PyEq&k(U9>yQ?$TcZoufg2@YcbIPB_C7IF+ z9EmoP5itxz2BDfIe}>dq>tFiq-P1>!@ zRSJ4JO;S%+EY(5BIq#2`)2JZn1uF{aNb<(grh6Yt>wfmm0qlw*-4s#X3VN@q|k`dGO3~Zirt2a!_T<;k~6N2{c{(Lb`MbO5$iD1 zuv6F84E!9c{i{Wl)YQGFQ1r$I6WmkxFoY$Qo?1P=7%20O!!H)?18i}_*&+G5Mg1EQ zDM-kq9F)Wp8QJoE`p zNNDmpdsp2X{Mvprd>HCG?Wb0%fm6Mo}zsd;iS`&tr{<0UCFs zi)mS$L)4xNtq-2Ok~|mc!eCQrup2mNa4xa&b%;$;&j=(b5-(eOuAirQFC-Miv!w$m zaUh_F=+=cPYO>kP`&bILGcA9Gd)f>R7uCgyoD&hJk~?XC<#iCh4NHtm_P?Gs^Q zZRJCnue>}4Uv=5lLnM3?3GSF;F|=|*Y!%F-1s7b`WFHqudb8}n!R#FEn`3^>P_`(g z7FccH6|@sCiz%WVpFpbqI~pZ?ez z)z8dDVmZ?=M1xlOn962xqLZ50PQ8P%g>Y~0ozUbJVQ!~t5QD?ge#Iv*CaD+?OrJaC6uXX4rPK88-L@ z%B+fTqPN?qEY@MBRfJ3|1mja_`0~CoItFRlrt9>&J?MVJ5hjNzEU--! zN;{^kpBJU{WVB!gC{P#AJ}a{CIJ8c(3&KBcmC2#Od3AYdp!xJbb|4E6?%V?sq~cAv zT`ocFIkcDCPDyG@M38hDzTPtOiuW-b5|p!@VM1JXppnj+R@j%$R__b5F{!2-4N{Qr z1d2nz9VIyV{Ps{+gl08+mOwjVm5=3nRJ7in$xezom+MtSLTY^SWnAo&D!#DvER(%j zE_%ox;O_c8w;!7NGVO2OeoE&g$!6+KY~p%L+H57 zS`~kIXQ)2e1dfimKgC%MzbLTD`js=_yRnC?(a10wi9)qZJT;0E@1x@`Oq&5}H=U>i zG7oYBW<~t+`rG47Vlw`GZM1iQf0QU7a=fKj@FeB5U2)7QE^pG0Kl63_Ll6j@Q>%fd|dd~#ZFq4^N{zM%uyXU)Y4 z&4@RmKCQ7>x7+_=JL8KPU<$P_HYVw~ow%m_u7OZ(*KWqakerM8G~W7)}N8z-F-s8f>bf2N&G%PB{}%`40;98+BZH!W5!w5MrK{F03|&CPC)OJ zw6HTsD8clhX^j++hGWS`OYk&-yGrJ5;yzLU>*e4YP~^2Az*R7>ry({6?jIhn2oP5m zBs=yEbHgHDna`TA*XclbXt7Rm1LgB+;cW`~>ca0uT|V-RX7n{-On}Q1h&hZ)8_qV| zzjTLG**->V{KWF?!o1>6@bj2mHRk)!tTPniP9%ne<;1p&TnYTd9ZjjJQ{($6!^czcrSJ#{xDIL zaaHIt;9cs=pH%@a7RdM`Ayo=9Uc%yBkXQ44cT%nZP&B%QPfhbJer*YEU>y_lvcM_% zgJ9O!55tnriqu1Up|iHrbT6TXQ2x-Ltw)pggG%SNEca>a)bI98qfw8I&bsX$D?JNH zQqZAVF75nT`Ly4-o8giP;M5LIN_qa64V0SpP|o0);bP6sD1u4apznW#1&=rG5&#P* z`*NX9KwWn)5EF+5p`(~m*fld(L&FBOrkZ*_2X=V0cfy23)qJtFU$J}1Ia^y3Li7Jel z7w#(X;Fi1E59O1yxZdxwjr7_u3GMZYSH`Mj^uSB2)2uJ^ygWC%ab^->oysZ%dnGsE zJ8H^w`S?nCO|RCD>!XTH)j-BZzO=Cjp_zBd)-6lh6Ji$$kDK`;>8J0;5%q(U!thi;<6e zRerm@g`SrNqcQy08`3E%FaQL)arY^q?d9goACGU{Yg=uXI2?BnMSF4=%ap7N+vZX1 zWOVX9z-{$-o7vpraW}2SF+q26? zeEDV^w4`j!^-^2jg)ng5lTXle9H}v-85r@T^_Ubaf$Ux1r^p+^g&v?17u@FR+xTNP zR~p?xL|n?1IDGxIr}X|VxuP5VOT*_?zZfs%iWn`Ldn-=(8qlSceYNY;4#5U}aHa6i zip#k5v)bF#X7#LA5Rb4nwc>{tEFP;u?R)!H7|xPd&AanmsR+OBev<65~YyDIi4T+BL^@y&5%gDaK^ zHC%Eom060YQ{lC<#NyvYr>jYBdfXG;^q11GgWE+BN9%uedf#PufavYxKBStZD1lg^ z-&_>pBoM?0Zz()jf4Wvn7!p^Ms6x>o(q$y^Bf0;wQNz(-ACih0hFQ1tas?$+=W?=p zL?$yx9ufieL%kcg>Q`6kRsFLpx5DEeIM7+m2s~K0ghOuAqy4w4gn5ijU7H*Y?O(qU zZm&_0rO3pf`@zAR$B8N%=S6|7MN^rdA*4r0pKq)#iV<1v=s)J+2oK?A7@J-!{21YE zo;StysWJO#u**Op6?=;B4t7hj3B)tg7KMxtRjsYBCMP_|u_o=d4?HYGmQiWDfD^HQ zdjK#gp!mo{ob7+0_9%NyhX9ZPqWT`)nU0cz>5V>6_&r+%6)a$iu0A`5uNPi!vr<}% zB&QlfP&l5i4B&>9$gQ6ScGY>sQ5(UiCJIJ?G971sE2m;BCJ=_t~z6a$-7o(vjqkW4< zxN>9&f1f^)>z>v2f?u1veN`f8fqa?q@;WDCdx^x_fx78@#aNdFZrcCbAfwi%m&GsDL^*JA6;@^Bs_eD;M#LOiST0ddjToP;sQ z;-}mkl0}N==M~wa3U1!AICD1ZJT?qM5!i+JH^97NkA>Okcd|n3dAz`=OdY0d-LYrl z07U|Wf{nq!>JK)4ZrGNhKQwh|<-Q89ku1HLngPtAH)~Q6?#-lgw41&Q$4MBv%_X62 z)vw9cgMVsbr=~*9a>M`T6bNaq*B&B_gP^_f?!-Y)&lgePK)t4vdqg=rZ`OA+`+_1Z)Z#cYnbSQ zm)YtW?Y(X(8>qqdvco@V*>=>`PW>vnBrl^hHf^**@b?<9{O$=${yPWrhgW|5>pDQs0)|J?E zyqR5ajrz#cxm0H39j6f7YQnw)sUP4?`&VQPg&L?1!mf|B7i1P3W_A=atr%!7ypbRI zd{@^Ur)(TZH@p7!)G!ZCn3VuGoB_U%jJBK^3YL{`L?Vc7oC7JGZvp2p8uf9U(7oTseZgtLNaC?F~-?}Loc8SfF8^>OxK$kpM@;m>G zy~{W_|9L4#iNdgc7jpnbsO!eRk*M(5ip*4|;L8K>`sq{wB&PgJIOJjjkB9Ajsz3AU zZpbn%vlfURSBLbs^LI*#85mt3PASAV`<0MYtBV^3Jv+fhx+~P)uzspGPUv#HgFg@& zR7qNc3G8!b=rhvOA4w}H!Im)dNWBRNJ*vZFM$c~-%AAL;1T&H&KcDatD4TQTMhG}z zPo>vJfBzmMlf|g1=61OU_VOf6vZJ?R_`I(5Nk^y}GA3ZP``qNYofN)xx+f-5+!@RNKWT&=9@=ycva;Wp0cq=G+$ z-B}LZZx3mLd)rsdw^DUT#lJ*0;AYo2G~t#wm8LW|&N9E4Xg^T!X)aI&Um7Mg1ktj)^;R zN5xr4bKl@{dYe*~e|(|n91nWj$PZ5m@_s9OPZI^t zpjxtDpWDn`Q4UM9F;8H5N4u*}qa*RY?>-8zz}$S61nHAuUVW-zFX;Wo45*O^z{hkz zsS8+-c+V4}?qt`%-}A`qvv+H5tg7rS)q>VD03CVSxcM+BFC93$L2z4TuLi`GN^h#ad?Q&pI;eB}P;bVD~O(EvBZ11E7U zd1r8qcN;h0LcO3)BS)~sGM1-;HRCCJ>KW4J3w8@O&3!Xgina1@H4mXvFtLZeg3iEw zgbahzVpoZ+Ub@p~p#@hCC-O6KKGwmzGM%BwNYH{2`E+cK32hvsnAf;>U@S}l+vY+W zdmqBVOF#%kyOak`J5^u&pMvWq!={RE?Z1ECK-g`=*9-R1~3Cp}B< z#?L@(xrgax4WMN@@_~zBKR6FeUEPBtHiwjEvs@b9xV%3P(W|C@d-ddLp4!4)19-bR zWBL=fw;YHW^^$D`p)u;MIq#cC#W_ReNe92n5zvyD4~b`qBzvn|PuLjW-ot3FGxdBR zK>sdft(|1U+;`7*#XL@GJmmQ^HbIj6Ag#2778_(UDGOzA`kJSVE+y?U*;#kgU{aXW zJ0;zt<&AV#aKCjmEOaY}!M+HJUGS-|&* zq)?6WjX4lqupGko&6q~hH4h(W6we!*3-Cu4Ck@v25{-Lkl5?yUV_hdd)u`^xB;?#w zu}um}7F^(MLorV`R0_;KLy6{E;1n{sGPHRNuq<*y*rs9q*fvquWt>z^xtu!1z{%9F zfF37RFzf8Sx_dtRrURPeN2p{OgI`|qa8@im*{Bs?L-`TedJz8Xpx`6=8aUi0>I?>I zDDEyA5j9#u!yV#$pr=gap?$%`#VPiT;^S9~w@^a$Q$0s6aK;tvC0aA2D-@zn|BthG z43ezr7PhC2Y1_7K+wN)Gwrv~Jwr$(CZQGpwX711p(#Z(L!||PyBKhRXj;3cMjytPq}u8k#^Fq>t>!N%lv;H7wmxl_W}pP1TV6J(0ja!>m2;0wa( zz;Y^{gB4eOr!Xx=F(JK!0?}=-p1U3fYB4Pdao+D<<(4S(0^^iXWP3XOtoBmVj8W8c zSs~_WD~|3*zoL&bz2Q^&W{h>3Z!xy_Hw(dFb7Q&iovVEmgF@D-`avZ(O7`@AtlDBY z7vs*7WEb{XA_)6r^w}%f^<~;C#_I6rwVSiw+sX5)RYkj$`*8IF90A7px2LwK?mxw~bnk2fk1-)BU*dQWX1OpIyu ze|J}%G{vWoQ63f?&k*6La;H6G(tpyB2#i3cd_mc#ml&!>2cn22m3krDBp(@+OzkwB zFKfc|n5Hn9$TqdB7-NO%7<)Mh2dmzs7P$8>W~dMM$RC={mt~EAZ5@b`jqSpStLvW} zJpIP_vQkaflA%uf;$0tC_WDA^W1W5)k`z&D>vp+^T;*6M!rhu$dZ@SGi!Z z?Ga){j~a{52G{Jh^4b+lK`uwk>Go{xj0g8wwvGt0%huX;nXzu1Z&*9_k^(Ed0itrN z$n)?{Y7LU<#|!<;oFe|&3N%A(XQ@)Dtbx{9lI9cM1n<|$fNfnQ5V)8ycTx(>-~|O_ zv!U4fa#Z!;*f@0~i zkHUsXQd7p`IG3nIERf{Atz{@UrQ0e(*<5lktbRj1;joXlvlrBrZS6zNF{;n22nuok z#BP-M!KXeZ_#1VV6FUpT$DjLBrkIRoQe$pw*Wj8=;km<^24oko$`gU-@~!MkxIddZ z(`bBt2yO!qn8TFOdM_BBIVDp^I`Vd}*^+j6bv1cC>rQJVXSibMxmJrB_FqGJuFkp* zj^o>RghYy$tD1X+QY}PMh|^$;^V$jY6P(X!PGG1G371_r&YT^Ftgw89LVL)5YHN99 z9cT%y{jP&8UDkT?NvfOW=()x;RF8=^1p4Trij)ECL zgJ{Rx>JHtPZ1-eCcz;6$yMP)9O&Gc{;L3z$0Y#_-UpDOM&-|W!s94>1SJX-d0tHox zMg8_!RUl54#M+_gCBmJNUR%7#zNKl$ETwDJHg0rqPBaGnPFYhTw3M%CAVY3{QXM#? zA0N$m&(!843*C=t%t+>?EQkEsvui$EYPd!eNOjqJVlTsDi_#NAO@)2VdTXpIL-YAm zRJ*%LK1v_Da`J5835^dHhrdx}9kG&`|!0pK>c?0Z`HRD2AF7z1lq;Ev{KH|)2H7_SG z5t12SP6Rqe@U7uW}rxKPih3-!8B2DKCJq zpwdp;wnn-}q)P=3(*|~17{Phg0LoB$rm|zZl*tBQMOCx3`v9c`sShx525f~-0kj?Q z(~V!vTg^gVbm)>tB#M~i$o_fVSX2O9joWPmbq*w2qrPA07Ur4&mAZs_}2BU(eV*BioXv@ zH^|vzpkV7;L(<0(Yd9&I#sKDEk~sc6IyeoX0UfZzM^vOg866w?|N4>(z~XJ z>(m-l3utoOKFgG`T@ERIxdkc|j}DYE%tHYNb(I1 zllw|!@z!RQ`+dC3$HC4#9Hp!LY%O|6$`eXqCgG1)Ez(d|^>i2YKqTXM5DxjmJda==x)7(XB zTC4t64L{F6Hx)lfkH^D%xCr_$u->DW94S&Jaq|^PA}b&5VQgPJA6j`rueeo1T{yZ_ zgc!c)?6qZ!e&3ykXh}Sc2F7D6?qOFS01{&cW7j7&z}#d?a8(O zPOiHihe@~Z&V}mBJ-(!fJwxltt9GZ7wk4n6r&d)6M-a5BNbGN0diDMxxu8c?_5%Z= z2=o5<0#=A7xg)mu2$dTEJ^=;!*4unEGa@)r#Nj3v`mO-sDm*lDY7Sr=is+t$IXJvz zQ^?fG!=xX4mqk(cyjdr@y@h{vtw9rFBQaL-Vqh3*bZ2Nz7^6_0Ao<4*%jpdLt3>70 zodj(}g7|JeXhTN(Rm09>w}xo%F%gxPvEU*JUB6}NZNFnvCzspRnMdD4G@M>d?+=q8 zHcBH2Fyqd3Xv*s7@NtNMb;OR<_8NK6lK{C=6Rg-3&0N#59SaCtCHm4sb1^oo>qPBL zz4Go@MVO9J+_g4rj{yaf0Ve?I;ueW;&)>e51B#_rbTSGJz<({Okl*qMrU#M z8GbZL2oQ@)6k4so%- z;z$6J!7-S6$|aL&48eSYi%RH~A294SC3i&K^CA}W$$X>Q8Dz6O>pumnD6G|Db+oHQ zfI`(`Z(i)z(TN@=;yX^|0H-z_geRFZ$8Yp=(1>eDk`&La(Lukn2{LZ#no+x!;HW{* zFnzSJ1x9P!+1k=a9r@G{&bDVKHY;RArjZqVBcB6luM~fm2My zI%#cq`t-m$OdyEqd`h;yD@eT@iRT z2T1ZlgiE^nNPKyRy^^vw(qG}&DY}v64I9GMP?sXOsON%LD1yT-IV6_DHCqc?TjB>u zyS5|EAD|jYYaWblZ#UM%!?tU1>adG$ZEHY-)iKnQ*TG)L3qPlJO!*xnT_K@}&pMBV z2y25E?-m~tXfl`y;ZTD; zzU!Z&(vT!`Asw^Y&MJ2>zVsZMxX$FE!DiSF=$Lm~UN|iD?^ZPKu+Ptg8Cv(P zbC98S(h&ilr@|=V9nxid$Wiakm@n#F#82x-^l4U-Jgp?sJCTuGcc3=C<#auf7YQpX zTr?SkJ>#Oy)WKp=eW-(qwN6lb z`9pJ?2T$rhII2ENupShgb?5-lAN(0z#sY#pMo+Dl-ZNWOS1HZ#tAqyRYAdQGtQr)q zRHTC~{i1I%zix+u-Mp2j&K5#yDb=U^-1N+q0brz0n$q>n8E-h%ADtF0 zo;VQeoVl9`kyK}^Suc9AsA(HQq%ZIU(+bZM)v?P{R=#)SX9xwfW4UtUC>f*^ud2kM zFtla>=)1da(}>um61&geyms#6{@PMxM?;!cqr}lp;AB7n1x&*WqZp~Pz`1s6ZUKOY zL$CI0O{{>nmBe)G+Jv;4q+QZNLs|fStl;{dJ9bOzqTY^dgPhNvqtV@qoPv}xgK6(n ztrwot3~~M9g9y{w;*LG=vtnE^#L23p1Kx?CudszV3ZOjuzCdfbcYQ9KzS|TST?=9! zk4_7ZFV*K@FbI#yWGhaN@5qyos6Hrwf2jevlkmD2hn_BV;KBHnKhb6cr-6#&;fj3< zZ^Ujc;VN_v(M0-@a3!meUT*T!63WVYm&d8mPY$~GWf5Di_?Z}8bKc+aLrRdxcxdP} z7B>oir5pX~Og-eJ!@L>kNiL~k8%*>eliiy>K&Eh8@$6huT`PIxuuQ4qs{G;ucsZpi zMFhCjy@WN~sxr;$;Ar%P>)wqXN9+g&-vQfYf|ZAcgT+RGg4G?H4FLR$gFy*w2{1Nl2nA6UQ01djRp>OeSAW*SEk|arAUN-$gwI2hS`qtALHXM`bGDvD;LfT zK!>#v^hcs*ei=*1JENHkGQMWoe*bDRlwO)Q<>pK9Rl@Ncc_XQm3BTLI2f|W>3-ws< zp(wE>EV^E;uwqhO^5OtaYC5`EeVgPnXZ{V@9#Q_PT*cNygP9m`4q z^=)>9mU^06zv7!Xql&L!1jf!4J3<%JX%;L^<;XO+A}8Hne2(kPKN5ogkIrX6S^VY- zIxRz$svdSPoBX?e0-!A{BB$z|fQySe)CBdK1CN@L}2>hC(`$gooprlp#^r z?&(iKJJShNUv+%p#wmVbIdw(O08M$OVRvQtxlr?;8Pz_Tg@I zi$o!BP9%vFZMB|OIn-zRP9uq^QUMDZ5qax+AJT_i;6;}$c0zL2Ne`D}UDvqt1h4OA z#ZRWEU+bhDhS$C>-DGhpKN39Vparg?c(P~;iT7kar}X*Bh+v;MM*YL7ho%bhBIC`N zVpmIvfup4(Ud{gHSys>?^_nrW@@5&Be!pPMdH9e{NX?D@uxgToOZ8J-@!~pb7o@l8 zF`hIzsyJZd!MNa(nTbWjP_3Gy9?MQO!xqmh$2X3ED=Cqdov>7;#m|(B8C#6y*Q%B< zVcDpw^k$hGc1Fif16(s#I0&~N0yg0Yv{Tt22#B2;6I@PzSN2TG1tRy_ z=IX1*``CRIUrBvHtX_Uc^aeVL9KM6}^Z!oj$&?v$2zv3`^0da-YOU<5Fbk$~8S}Kz z5#sZdbR&(r^%L@xyxW^eJO;DaB+IDGFrTgg6CGBx+}(<5wdXBErGkVGBJkvq;UO(a znitcaG+?hO2^L@uCvNb0?u=i5IbCrVKQL0B;C%!|eI(UIEDA_Vh)AD;Ii2OPh$$AD zHRVU;!s3{TW`c!R$rSfngv^^&B=Brrpd3#2%p>CkcIV0j&|$;J+yN8>r_dSKYbtdb zLs>#9eRVm$zB9vsqq05(9v%0D!{^;OmxL|c{wm<=GGC8G)V#XScJOU}9prj54(4k* z8wu^mWd0%{8cInp$JF=c!x1CqybWkj$5RsWi=2cd!fSd`K~?i+IWE|XyStW)A`S)9Hjsp#>ZQ4|ls9v{rD{f_`m+~!Jr9Qb!S%HZtH^;C(a(`auYJn}Gl)8dJw zMJGp-A=|g#1#qwrWwFnXU(b)&c;J;0y%oma;BM+_SoZilU&irwdMVQ5V+keG03^nATF~WfObpjMyUvUk^4VRl81q+mcm{6>Zx8@Z&a{mABh1I!qM> z=>MJ)1gX;{>{IU*_RD^8bl5Uu#+|>G_F3jGXO4uQj^r$#FI{w~MtB%AH=L0&Oyv^#w|N_x`5t^)7)R ztR7B8w!6g+0r<7+52#yQILlqq^vBXJ0tP~uco)0@nKyOY+nPd*2<09TRJGzksk5V$ zTS+@I`XzE0(s>}+qX<)1%woBjWJC5wrhM)L2Hx<;9|RXZ&m9NmRN8*D*;4L4u%6&= zC64tcWjT$DxP~%=c`>>wx$Cqgw?RGzJ&Wo52OnOgiAb^5NR7BALBg`P3;F|>KvTaY zRT-n5#{fmHe(LB>Tl>PJl9Br-napU1wm%cTrTVA`#b zKwX`B+^1JeY>dC)E~fEWLd(_e|J+R-8H!FfW)~7ZM);Y8agW<32zeQ_18{J|x;QR* zMh}+@zUSM~3Kys|EXt5>sD5Ez<2z+-=QGnd@lzBe$&#eg@~WNwoaPN}R#Mt>U8f)p zvYUpiXmN!AdG$tsre@z!$$r94z#{Nq2ysm3RAV|JB?3`p!AZnZ#g^SL!vsq%ViBDz zQW4KUJrmMFDFY9ZoY3@Dkpz@38Y-s0KWxwzcO3MG`;-}OfD8h70H%xqI#&aMR3g>7 zwzG@T&lE&eKCe1S!ROC&PN0XEGSjk%Ye~03U(t6=11|&uQT5dDRhsMt;13p%Z|mWc*^)oGBqr zo$Aly+LMYUN<%6{goGf;e&a1o40zzZGYiUN%&Np8II$s98Qz32KJOZe$LZ{JZ*8FY zN`5xnMs{*4Xk(Z~3K46Nm#hJKlzi>c8tDBtorxb*)BZ)Wq3J}!dvX|M!(do=x zJ(5|~Jdqo%M9uOX<(t3IkO=;gj9*7{~k^bsic~c zQ&wgmPKL}Skw>W=2OL{AXF^B3bDh-L@BB{KHPfG~u2uH?Pb*r}c~b^(AuB9?;)7h< zdjB};|NotawTj6 zF>168JnZynoZ3YKk2=wbmgk?&sr_kEP)-!1QOqwyK4+KsyJ9gXcHj=PjD9 zf{GRwiJk{#!iCf&H){b^O`4dShw^k&lI|zi1VW!b4)253sTlA$-U?A|&lJ8#dMhns zFVo~4B#PrU76(~lvi7MQzQ0;nrcTg3l~5yVXc|BY8nmU_A0T(S61RjR(7@o`Kn&g! zMlKAq0llAZWIf#4mGod1@affU@3%n(kCLiXSM?J9TK2-sJMd?O4<`Z(4ttcAJlHgYtjThyn)vDwE{sb=7f> zG0J!sngqCh9kdHYIm-h z@<+8)a{SUCWSUQv@9R`jZT{_IZfljkfU)z_uRfLoZBWx(`|{km2JK$1)7m6ZHeZ)S z@x%{4 zhmRWFUJ{p07HR06MoO6snVxE;6#cJGkwt zeYpjZ5YH@GBp%Y*MrD@!3g$Fwu_c_*;CZI$CDq(hBExmxQNXo5I$4i!f(B&nEsI_x z$-`g#W@Wo$F5+k~Czm=G#EPs`)asXk+#s$jPJW&KHgQ0SuKWd7D!C0=BFmoZw1;Ia z6}qbW480Uej?iXYpYepZ#{Sh+w#G)Mwp+lFuy=rO%$j#W#=e?Dg{sc+WWZHVjt&ceDrf+h{pBx~R8LU2mZQ>RVib}qI%@&4+WO|WY>nR&3 zJKW9<5Jl8zu@Z|ME|izq15ovdz97}3a8Q@4GPD8?_t1m=mi z{NdYw9o+X9d>z6*`HX%V{`vy^Dx3KdJ<~M=VY0P-`&gLnMR@x9W(xnK{eJ*?|04bV z;D5iRy>$O9Z}J!K_g9#O;a{SEyVvL$8R`D%W&R8O`!o1oP~N{s{yR?j|I!00s3-{v zEB*({t6*f}^gp1y|0O#6zoEQ;fXIKMynjT;|Bdqg2O9bp9{YFf59a%){SVytFG%(` z#`(Xz|7COj)AtX*^FQI%zk%Psq2E6+?;rT|PyEmG&l&y{V)>2s{_bJ>4d4FV^JmmQ zfZso@e?Y)=e__FYX8-f~ADRB0??3R}KRNsb0MpSy{u==NU%CCs@9#YS0LTBip1Y)`u=}Fz`wKom&gBt1T+2@RQ)d_|MjTIjzwDaG#KkYNM+-rFAL^tIhvwKo2=H) zR(`)+tTb_qj=p<&R60#@ynn2ke72h`R+O8gRM8)!v7*;z5M=tsMFGey46VgQhh^P@ z@eNIk^^EfO4oM6JONPq;nC=0;#Mk%6#X+nBJz`HvO}l;R+tjWzz1at-LTvYJi?BynuZQoFahPa1j9$+ zTN}l_BY86osB3CqW%x8bi*?fN4`=)B1PII0FW6Yem`_D8=aQE~-Isc1Yiy!-_Z(CA z=o?+_atJ6lJ(2G)8fU{ALs zM3hgLjOe1b=&u)Nx_1R2%gAnLj8!y_&x8nCs!t!?u7>D0<0Y7HqB-Y3XFzqo0i&g| zuc)83d%gYwtZ!s}S3#43F|+eu(;WeKFK|IxfLGWx{pIK}tw zLmYaSot66rDX={t9EK6XI9(P6hfs~^QOqYD!=eQy>+-z>j=08~c((wP5Zr2Y!e=I7T| zP}Pn;@)4~0vL}0HK8}{KZqlj!a6cp!)ijiSj_v>f{1wT3P|tC2IfQYEEO>7pxvCapeOL| zCY+Y&g6!HB6(2oy6qk_gMr@afL|`O@>rBpc!=m~0Pr2AsMw)%~IY%6U`5bN67B0{2(SXiH4N|2cF$MURKYUMnjX6do@A)JAp~;Ub5z-@ z{Jh%g%m-sQ!(F-0n4&~Vx5aRuJ{+iikZ{{yy=BT}hJ0*jO-t$UR7=EJrhXEAZ*cgC zNi}!=IAjki2s=9rmamPsZ?ApgW{zKwKfi9zCr(f4jys_pZ_U0+ZIeY7&?K>D1@7i2 zP`kr(^=94;S)$|rje7Q_nNpY_(arh8;SkQT89sF6$2yNAbUwfZ&z8#~J)h<_S+Y(V zJs80%4s@g9P*(|c4;VHP6B1EM*cp+5oF{@29$V2u!-`Sd|Ip>2Icr(vkcb%c>9WG= zf&k#;Eb+a3P_rmsH(8eUbpnV|{z?of^IgFG16$?;DSNT5%XS|kI-M~_ zga_{cS<1oNZXo~usAOoe+3PO&SVrw%jpFPvDn&i-Bxe*K940c?C=1%(21|kGS)5&? zitOtkz+n-R<>TXL{v_1?r4Cu58neEHJjn;%uk|YzI+IiWye8zp5|S0>`;TwK5g5hU zYi7;~CfH;CR3;)JCDC5-hcN20_&x8P7esBpaWd+|8i_Tk!qb+|I6U|>V2fEQ(+p#p z!wlpe-8#L2y{8ARX=BJYb-6Q(YRvMQbEqBHU6Lvu4Tm!|d?ynM zENVn2lsT#|&6;nHG&HmV(Ce=2J7!QQV6t7($5XzTQjah29?*tdQkFGjAk#I&)7D6> zKW_qth%ilDc^785htZRM47FnbgOI^lW^(o**9MdSnBst3YO`!xZR~Jfk-DDO=CZ!%N z7~HE&+8Fy!$(ybf)trP(vq<9Nk1} zO^1+KZTHQSo#1QLEhco^CZS0P$?N(#vy#8GdqLu=G8)gQ$FP%%jO|2|q&FF6aQWQ} zH!1%L!>DrFM`XwGFA;Zs`qF%wngPpOn7a;6UHqgxdX_7kDt?kUgw*eVMz3J+d+kkM zt8)@lyG;n|Hj9z1R%GbRM+Tj!(H1DnxP1i!w^y!lRay7JucfiO-%$s==k6xfwIKou zop_k~-qN1(rO05ZU;@O@_^wkgI9yohP?Rv(l7aV)qqEn|36{iGdLIF6k>!L@$s##w zk}#)WES;GM{4E4_>9K9`d+9!KZcCKprGcnL_Gllg>3Gj;QjtR4t~xt&-b<@&^8?l_ zd#uE}>(7i;R*>WptG3+$KLuHpo3Cy)i3BE=jX6`F90{pTw?BqTPPmyPwzycAf%W)X zGTM>sy;~l~9W9s}WSHHx%yLuohTk;mlN@$a#VHHunv%H8POHS5odn!(!@@B*AEI=V zYNoH$3MO6k-an_JE!2!3DQefj=rtdR$mZQ+g5(y-I>}@D2W5*G)pNCK>ATx^iToD< zUCM_zd1pxwF^e@~Q&Y3{Nd^vDUeM`ikwKlip2G`Wr|P;x9s4qHv?pyy5mLIu5BqXg zs?Hp)!YZ3}$Doc`64#&mD+UBbGFi2!wGyfJ<&Jh?2DyZ(rVzSpdI)xUZ>N@^U&(X( z#_yLYTAs0Kd`?4Erdh*gcpYU@qNFv&s--{(^t7ynmy(qlu02q5sm=}4=xM25r%{Uy z($}w@;!m6H8C05WjLy5O;EdLf?J=@d=Ek`dz(p94)F|iUkGnVV_*5|9y=Z@iNnlG7 zCC`uYGl$p>jc@=5vG{(+oWxDNToW}a{0J!7z)(auTrD0l>m`)&+w56oq@v%l@v&(~ z?r(D3nV1whEFy*JSjNY1mKS$$d%P=PRW%C#Wj&T;N#CYJW2#zxl(N&^OrA12PkQ*cZts{B(L_VG{|6yn%~=0uwP` z1FgsRwt}wV9(ekisQ05M=fyy}o}uz*pEK1`vO&qX@(d4#zjO$8T~u87v3i*vV-ekFXkHpmk{I}9-!)F4A{?G;};U%<=5Vf?gNT7A#kT^jLU{!jJ;C?LI|!j!De& z8>e#S>NI=l!OkNWcLcUklR?vA1`5LnIpB5;WU%qra3M`JaCTfVVJ73ydhuWw7{!Lc zbqB*c zbYFlClJS8%vY^N72^qc|s9h3+@U$IlH`W{lv9|LG{k=70fc7o1C^VbpNi%Bhs(#r> zx*x>NIL|mgXZ)Q752?zovOp+Ns#6VSem2l$8d&wf%mZ|T3 zi@NlU!`kENoKIRA}!WSiAw+82l?Dy&Ytd{otPX>|k^W^ugOLdV^K^tUe z+UnWRuLEzdf{o^uzlGlv58q43v%9py{Dz8h74iH|ykf5^3Q1)@2wK5<(*??~ROdM&$ z4iX(_qK!~+&;h)4-`v!$k7B=GezN>}(f|`H?P-v*={xBR@>7y6+i`mrt3trK1*I=m z0thuC*76{UJX2v%wsBpC89H(MTok(hRWH`1YSBg2@GBSid+mqY_Yi;NnO{Res17#k zlq?6s@Ie#V<3bPLQLq$=VOAMqxJ1J1u#m1c{-36xxFRfxj#@R!R z>IbKmLBw*_4;l28Pp74m6cJD*#5K!bzPBU1{*Y*G>4}Wmkbl<*H;0TNr8`#zszuYf zieS!AP5$12TC9xBe@J|fB9psOHRA{^00ERq6= z%(=gU1(2^9!FVb4$~)aSg%^xUM2@0c+M+o+j~sK6nJ-Yd?f}1NQRb&Hs8)}w%pr1Q z+uet%YOU;jjYft5`Q>YPW1ba20G-DwJ^L=rN_~$SO4+vLXci1c zX~ilFqB<*-G@7x0Wdhm&TU4?nc-hsyNpMtZ!D$;Tn(($EsxaohT9z8}!=tUO5G-=v z&(9hq8Jdk29P;44NUSO}zB2Z5VcT5@$X?rD;;c_8xA!Y?)-A<+HP#aQx%ZIVYE41N6+MWSM z5N;;n9^z}dKh}2P7NxbZfxI^wc1q?F!qz10wT?Z5 z2te8odNI_i+VlJ<<oFDaTi{+WRSob$FQ#-slr<0v@WU17b&?oRdO0O$(pXgC(>LmOC zb2IsEFs7VX71s`UKBPCrTjtz4l-XlPn#)M>nx2>%o2vJC+Q`PX=u>hLN@R^t_TvN^sr{ZEBXXlV-Pt~;BY}r8vWCU zN>X9komujb5Zw~SMzB6rCd_ycsrJsh)==ER)0HUD?8KfIO}DM)LPk#0|2h*YYpzFm z`NRg62FNaeEEroa$F57}OSixWw~;fpFVZ8f^#{c-*K#`RXH%;otXQb@;*$-gRQ@1X zT?D>gESVr&`eAS%R8;1xZR&y=6I^7gljYib#xQnk7P0m-4{Oc@Y~OL`ya&P9X`)!hl;#x zBCIenTh*b;^|;9(J)5{<$!lI&#cONe+^e+&eXJK;s`k@3#IzZ&XR(=(Gc|yU$|S3| zHbb8zs7>2PHV)T-(GH^=HRR;^F!3Lu>UvqzutzCyuY1EWA}pihO}Q>q^{-^xNFK*l zm8gqYWM|=B!MRUo@FM|HZ)Apm#_3Quix&9xz#CBWg>;GORHX+y61-v-0g6jA>t`JC zX{^&V#Lq;J_DI9Bljw{T7GNg0(cF*gsyX}Hdmtt_QGB_pjmNkw@?BNHP-xeMOgOy3 zRd_MWBHG?c-JkB4zH&S~3P1Hwf)jSdvA1B~^Xn`x1bf_o(V~QEZmQ~Lskj;EW+%P+{`2? z7kc0s!@)9}s#(c7A9}XxuO{3|=f*aKs^HfiHsDwbYWuY)i6JnM6l2+&+ z?lD~xs7|=f;a*o=u*qX?3_F?4JU{@Y292@h5H%V%7?aC(rPG-^l3dMxy5Mnuf>=2_ zZ=y8Nxtgm2_XJi}!$t2=-J1 zWKl|O%1YDd4<|gcObV@FuUjnK=Iho)XYogfr4)418Olgk01Sge!@t0w>yVJ{uzPzt zM(7!fN{yFv;LK0ZPj}I9U0)eA1`7PXQr1~PHfh|r&7BpF;|4~891MHqNs@!836RA| z-rIbt-qnHF#ApC7^aIH{msm0^LNL4=w*fX0$xi@fiT)bs^@>awU(iG*$;Rol#A-Ug zD&849;|OcY8FPT`xWXPS1g;$PVPw&#R5X^B28$7`0V@<1+A}z8xy1jq5D+}))H#^t zd-I+!at^p`3qV4))D_D&BWOMNj_}qL?u`kdjZLa{=KG zjK{Qtyg%pJ)R&I(AxMq)(YbmO4RnGzWg#*ulFPo2K@$)X&zsEJuJQrG7FRKFF*h-m z-U8aVx`2bp+iOF4!4H`c41R!rGBV8ZZM90lPvcvvvyMu!XMf@o55HCek?VyBLz^v>2$BUu)1(zRCGt*i4Y zd(aU5ZMF2w0e^K{ur-VVu=t}H7`PAXc^kCcup?6pK13jo+}T>^lP9r_;jRwEe}tD5 zv-8y>3qQw}E>FYK;W_WDi<^gJ^S?u!uEN^cgB6 z#&L{)Q3A<9@nM-fqXI5QcS-$dr~te=3)U(I?G0-+L1)3gci@Bn3;LW#%^mFXoDMb> z70dfTo66mn%06dfHmz+nkG=}6fL@|dGqzmL2x4}+Km-^^41C{x!b5hUvRyjlUeW1y zvCN_es@bQdPb!)L`f;>|!WYrrZB8G`z!KPt3dRiltk93Xba0`gRmi!LI8zqNrrBac zt2#xlC&BEJhX*Z&;PZw8o#@X1!ViiDkoR5!?mJ8$(-1Q(fMkN8U$s>4pZ8}8K<%ZI0t1AOs;j@!DRa_~hR^SDX_Ftx# zm#7*owqVn-Fki{=HZ8NXsyPz-!4zRhy>Yc9Pot-)V>U-sxWPa2e)XJZrw+L;v?pT z>(co)^&+wcIQkfpQSvF!y4(6sl)`e@`wE&x>SVt>%q zEcq2gB~-Y$*7{$LLW?|-F`+i!8znO-Fq^Sv?qeN{eRGJ@N$1mD9uh?mHK&IX|@j*ZrC zjv%XjBlF5xqxS6*l_h{HOCv6HXa#bfa{jv3etNA?aBlTVg?VM{Sdrmc(1u!`!FUlf zSDm&dNQgMZQ~YGIP7kW6axid8CG!BevfD&G1;?=im$r$j3^{&X;fZa-mC{L*I9>M8 znAX0T!k3^FSSMuD0tLF3n?0(DA}|LrW%-aNJdiLQq7vQ^0SAmp?h&2JQlo>XF$DSE zy-l7VJwmXKV~F=;NnnmAK-5`p*wd-W%O5V+)&~?yE(-qJf%9@b8vlAIV0pT5V-ecS z1M^PNt6a&m$4yh4>9+*MsC}U~Y_JKTMT=YBB^10S7NBmkGtEk!{+R0IJh~58lJePs z@BUo6zZI}O9L17|lD$_15G2I3DQv@PM6LlLG9Rw#85&$|@gtKrCF!Rbz49N|5Sw+) zB7My}76LDxz$(ge=DPxNyskHVXY`Zw+)qk4MJL>*DX}MXzkX22wdHZAh6q(0?5y6h zUrnS4kOz_c{t1F`=d2;YwXE%%96!q_p&l0=@sZxzA$YMMgtr)CNjAp45V3d zVGF{8^hb01$zER>(8K_O)RT)#H@~8Cwi(>}2{6cg!G|5V<-G*=zW&u&X^bZ+gHIG4 zm~A0;(4NdlR%SAFFL40PAO4CRWigkUg?m-Q&MDG3AJUn$R53f^367kYR+@=n zK;cv*o>~HK!`IxPib#27Iy)YCa2S3DE);E#=>DCg7EJi zON|z^imA>(cx+b{{sRpxIp-^VR?`QkKR5uQID)tKCS;ud$6R>#6um^*>Y&6u4q)-X|?qNe*0sW&O zWCi$q_wKpetGY?sKLGaG6Ne3zVLiKJ_bSXGJI9+*sZ>PF&$m8d4MHL zZ;7^AmU7J89PfLodrPdl4MnpJCT$t1AwLihpmhUmwY0(Nx^yJZS(M3sXXcR@#8p-~ zpI0x(0v25z!HK{;-T&9#d>h#{d5zg)%}y*)ti}zFZO6J2En|_uhLJkth<%OxYvZ zvL&04l}$#r?3wXBFZbPj*X90ve&0WSkH_!#2M>R^Uf26L&ttsL<9MCJ^JF$s1|7x$ zZ?nK_F){xc=jj?Ur$Bk`wP0w=T~`O6!K~3e+rOQpv1WW8d*^WhkvSsgt~_Iksut*7ENTnhuT8 zX1O-Y9Dd#vAmi#gkP)3N@a&7+6EE2G@^&7%Q$%F4JCW0KHYRO7?dakC_Rh%X#3Z5a zCOMBT$_}K`e#^Z7Wt@-iO%Z|79+l=`{kYQV3u`5)_={4?Z*9ZxwCQckq+SUQ9VChK zo3T2tL8;Gn_{DOU38u!6l0Jo&Q>pWl#-tg?dFdE`J;Q)Kx%5TbM^}@r?>S)-_MIIM zmEskRBm5X5Z@dWIkJ&V2ou zg-G|KwVa|DTG)EgwhvB>P5q&Ij*g(vOQPo8mpH)to$qp3-ftRC5FRM`29?&@Evs!T zZ`b1TefE&<@udg6rDmy24*UmSCl3pXsXKN%M3vqr!;@t613Ym^rd>t5`t%W^@2UqA z%JRQ{5E+T)+6tQQxz?Re#5cP<^J2s(OF2~O!nDG}{2kPsy8^-O+50<5Qgk;f1{CH) z0+}a1-V`C=nS1Z$!W7C>ni_(2SuTo5RC<9zi*BABAL8OAoLZ?wpWn`F$9a-c4YJ_CJT5hj5 zjg6<8u700n^WMf*VP`{n^SQ@-vr8~fC|Qz23a)WEbrgw~<~^%?kZZ-=A*e5j7?-9~e9mdT0$^D{u?BbBDky$J=~rD{|r0 zTgHS^(Zm?Nrb|Zz??T3vk~hEcw5BX%PC4eDNqwcf1Hxnb;L@^H9WX_C$s|*C9yHcT zlffp9Z5Wkb<8o(1>uo0oS$Jl^;}wW1!GXtTPn4(ZWFTkD@|M!->_^6s2fhWQ#Xgy zV7lOz%P4=emzmWo$*FgC+4y|wXR`|RZ<5lBr9_IHId8LBcP;U8x^wdY{blfiAy{*uC)}GWBCQ zuzm^#%Q!IL5qM+}ex9twu~I87TP$3TS}JaW($lctK6MPe#HD+- zICrIot)436Y5t1Cg|a!;avCe6z8Nl9o(&0-J7Fuc(S6Rp)fH!wK-qky2ogu9C2*Vj zY(hCD=y1@&O5Vw_rLqLkPk70>a9G5PgG=&lyy4mzUgFpc-!~6dF3&sS+`qs2jDujO zy_r0GOv>%y*%(WOb|)M?$?Z)ieCbRU415P0*_=j!j3 z1vng3=(GDopl+||5TxTrYBmasF3W8@S&wVzXWY2(ez=pZ8=qudBWfy0?1QqAQLDC0 zp=2k=M}7~mQx0W_h-)^Uog1vtYuPuJ_LwLW>pJJ$PG=ZHqt=3OLahU^xe zKVk&QUeq5Hb!F(1$3O5&33vokoD!Q`;`N{wj9%Y)8QpdGL8k6=8}nHNu8P4^ZZBwvU31rAWmBVcV=vhmOuju! zqG$eHJ1a=Yz0`v$T^OyB}WgE*iBomSSIoXF>{fJxHyI&z8HtprCyJeE7 z+8Grbb-6jw@%XZt#m8*&p8AP|qpqfxmia{ri=P%+?C20=jwdKPs1BP4-A;zA(LLH( zf|dD^y{&^6|FjG?#k1REsF+)R7hBRf{8CtmRn}qioxs|y-hAnO6v>aSgyFUE56>@# zl1hKWiSEgCObh$TPir-uTz?(j$nE?PJ338CQ7uQ~qbP3I&~%W@rptF+ZYE=?{!Q$1 z`cb(4_y^uP4R@x;wZvD(`8EWbu!Ex3(8E+Lt-o|BN#^=+VP= zDHtVv$lK{9vbM|xRr1f%Ch=Bty&_8wov$ywJ)0kTq~FomYR`Wowu8OWi`?je%6^lf za4~nly>x;ETD~sCVcJt&n0X!{!ZDJ9EwM2@Qu<6q*I3FNzplI=#H4YE^x$z|G4Wj1 z_cPs3{V0KdE~fLlcTt3Jo_hV}H&H53o^P%1coR+WE4}_6xp#(|fv}B&e(r|Lu0<}N z*w2~`&_2IczlnXJ7oOjJKh3f;Yn)~yK%!IJv}h7bOP4+*JM7@%du>}k*6?kQX{pF2 z%LndT%Y4@luxpB?*2oPHgHyx!IVFqyMBc31T&=p>Q`r@Ck!NbT3BhOE7hwJI;^rY= zvAQFUsvA~c^NfzR=nS`6?>p;pRcdlsiXL&+(4qS2qR-tNg7P{ZrWvoO6+UJA%BR^fPz#8urHnt#D20cJ&JaE2ziDqT^`^%uI*H;#n)5o+| zKDgtpT5#*RN{CFqi=Xx#&l?Wqui0eU`ezJQ1?L$q0(v zaH8viy=frORnFkB%S6O@w zc#IW`*gx$Yv;M0ep73;BrgI-gUpjD-ZyOs68W6UWawx??3r76xSQK5~ez@&tcdZ$? zAp3!DfKBR?lxMz#X+&&cg)G&|8$y!ek!p@RrqWn4wX85%mWC!|W+2{7t?-4TZR?u0 zXCvA7YA9xx?qg-OK zpcrqS7CI2VU^;{_BnDW;_e4H=($Xno$tCo7Fl0*RP!8X$_19i1P_R0S?Pf0+Qv?6_ zu{aVwvZG~3&hbjshTH>7{82(;*PGVGdxiXmG2+Aal(%loiOj9oywj4~xZyBIK+u8-(0OBDU(+Z;#CSBc-qVBs<|8$fe)#V3*vz zzI1<4yZWthRjRD6TNM)rt@5+9cSWyuLivQ3&Rc3kC$MesxISxodLz*X`%H7nSWQVO z$#CD&6DdCDejUQejYkxl*@=DoM{4A3k`8m@-8Z$p^SL;D(oOJPCY-4+muZU=o4!%*GxY@zXz_$FcB&Y8z8D3%7r?bs`qap^r7yH+wkiC*6ZC6jI9tiSqsrtSKw z$p^hcvo{r*F9bFpysY24m^GPinDLcfoK%0(BxQr}&C@t96x6ul-5vhVFRG|m@{PTp zEG-XCiIH&zF(IXHT(Pd-y6yT(IpHOA9V&p*A_oD0Jb{^ClYoo)O5 zW>r{1zrod`XYa1IJ$Uabz&Y^z!gLgk$WX`7y|*;b#cP zuiIDbKs7E86)(MNzi&e;m?F89^teAoO=t6z6uz#=cPBueNITD{kzzxnemhBE(nU+)nxOGEPjaHoI(H*}Nd7i-N4W zowSh4@5KvaQqJ*0ALG`O06N=WCyMOc(_6Z*8sJst+mns+UnXBl|f>BM05@wN6WbYDp-7Rn3>trlz-##4Y@-Pd&CgOlunY!iI2d$c)jUt|Uhgm@AEeXT zLg}#6@so)kVP}nOKOls>|IzDYc~GtUJTN>6Sx+JhDwqDs;Thz9_56jQ7;P3DOSjHx zhxSDtBEivH$%Y?NIwYHm12>NXiRx1ZP3&S~e0<%Cx)7hzw-K2y-Y8QMReD!xTc~Qp zJ$H#ND@cd5^gJpdk{i`vqPfJ;S1U(aHZ*Pu>3*_N6&O|g;O9Asp5j12dN?uq*;1%9OT*anqE~BozztdBTs_GwHGV5 zCd4Tlsgkh!jjX>dC!f8gca6gPE&p$Me57?XY%Kdp zu3h0#txLKzIqCG8I=;m$K-7HpT5R2HXTYST!!9xr2UY$osD_wi_>gb7+E!)DH1_+7 zK$ep+pCFxQ17i-pi*Vj{nQb?B-dFN_Bh}VyF0{m@r5#z`uEM$-5$ZFmwp3vogz>>-bld6yxXXCtA`Lgu& z3;CF2lTO*k9_2+{&Xs#53u8%Pri60R$k^cCykfy;^~I(3M5U}G>9VEgMdTX2TyGwM zTo!lJ46AQ{(+-9B&eTWT3G`%@G4<~Pf6tG$H5N3XtoFLFFFQ;k$Vz&KjZ`B4$83c4 zyfd-I#6SD`{5IDcfn$aI@YW@D2PT6_s5 z;%2_XXZ?v|jJ*8e8P_9Hd&b97luhJ3nIjaEUQ2h+&2MP8|7?y> zNTZJrFkK&sznOd{+0=sX&Q4mT2oy0AGC}7W33Y&XWYOxAg5>8z;nCw;zPSs{*|jr8 zvsavykyo)Nz_!m5dWd$v|9eC zhL~4xo^W@Ry<;S%F5~C<9;wA8XF2r-QA?-tCYW#2L)Z?52y{P3(M^zi*T@2{r3{-< zt~GmAy=?P>@2;L|W|A=PvcF1ipS9VM?0MqpOupO@yQ6WTc^*Eqt&cn}Nm4*eo)uh_ zT@qK{(ialGHfwj^im7#?jjr0_LtU(EWdRv$oMpQM#;4I3o!;}uc?-kV7zml~x@V`Y z&z|(;=oytq{27T)ABD1YN3@azoj%S)4Juh1!y^r;M-b zDBayKuVJ-zO2uV>IbKIT+oA|5fwKM)IUEn_L9c|Z<<$#WS=*Wnf!cL-u1LBap4)Vj zsgl(>^J35Oy=WIbxv#>f+hwu(>(oWV(imY>t)GQ6c?TW29xVk(cKYOASXWqAj)NYa z39XnFeD$tb_D3e8z8PzpT6>H{3xV_t%95mRf+4l-l1WjCIZ;Iqdu*07Z}*4W#=>BN ze6I?cWpy+QCPD_8s!ZkZ*}ZL@QNCx@yqS0&-}#!!|1hUHOgk(}3z7pLzd+s^PO<=< z-Wq;T_lE&v0jEP{4ib zRe6Q(aeE?x462UnuB3XjrmzsW=w@tVm{#hR53{$JILiz|eP~YV9;{UryT&jJWW};A zcX8Id-FL0V{195<;ri{m#PyGi?HqP-U&iFjDp@u+KW?Wja}EwO^5XPTPeGD1X&_nG zT+S(i>E_bzS$Y*Y$Kl(u9Qk zJy(a@GA%r%I`InUGV9_6pz}|QTf|x1^-16P%4(0tuyp6_@40ow&VMoCZ05SUE1A)=-`r)DuTu@m7iSZA0w+ zA7V;ApMDVUazb9GSDF=FRNG?0LXIl|PgJS)7n;^lz6fHaHxD6pBGSR!hHE&o@aL7pys6$&~x=STQBL z9O$!-`jece?7sO_+;6u*t@@IM&~@5N%Azg{d(V9qwCGCs(qd#A9s_8pdR8J_DmiVM ze#g2J5;fgI)}Wh?@=G~uE+WBswM8OkGPR5RZ$7__iAhcyOiA&8sLtB$fVDD(YGQzA zS<^1yjk!^UnfZQoq{BNo1G~o>x-2AXlqsZWHU}Zy;OWI$sV;oV-DJ0{9*iq^4?aUsg zB6#U;E~I%wd#zk!+bUIyow|vP*~#d6rIO?LXD(`p&c%l6&=Q+XXVxeVK=bWt*m z$TL-?q~F`&spptWr`xcoLfsr(ZDVlt#5{b7BMhH~CReh4e%|s`HGrsdUn6N{z3`jy zf_Duz<%;IZ!kK7lX#e+;m^zx7wvc4Dp)sGeO%P&-u3hpxaj>rlkA|W~pHv%I zpC#K5^BCY91F}(ggQY7_F>v5p3IPtTq{$meOKjG~X$b*r+j}Ov6gxsKj{4W^_2~w# zTpe*-ey#!`l}YGxz3*ZaK{@v2vUh4OX(6$=4INR5b|Ce^qTt0Ph`_}alSgH5Zqay2s65S)nS^R*8H~?E zX?$)U%*e8Hn~6hNI+~@S4#kB7f4U`#e>OO951u($&-|%G(E_&=*2h=LViZv+j?e;}~dFJw%6rJXH6;`>9x~;YJP;O<4Iep>G_iGN94)s5mXO~A9ByYZM zyZzm5Jc^J_#APc*ca|X7nl6Tmj=#U){rmB6TMMcYNMY3;3op=>*hh^|>9v05JzS;} zS@}w-Q18oIJLSwgCG`!)SkXPx{^{@=Co4OBgy`GESbnOD7WuCO(`~BE6IC{-<5pOV4^57@0lp=0JWPT*_1$1L?d{NB9otsJ zqLp&L%plIk-gvDHUxf#X5UyWt(Rmuanj{vaX`4tOjujB-$7Z(eW8Q)A=tJyIelEuL-qD}-2KjeW54YWn*YCB4NrwH%G?*Q%dM0+S zln{|dd-bY!kq#q@BgDHhJb1m*TF>MV7Ad_u&qNHvp-y3Of~Z8qb{MAGX>(tD$rXiD z@k2R1#@~0k={z%*~;_% zlZ{?so&o-y3*8&jm*<6E&m=ev;|E3EI&eroWcesS7$B|t%Cn85r`9&f$S~#7J({25 z*C+SdI$e^M52)jWgV}vI2pI|~f6OmNe*5%Qbpn;mX0#HBNE*faKucO{^LeQ(W|yt0 z(@J5vGdpffc;QWm34VO)pm>1(d3un4x0`3l+Iv6qyKQSL{kWF5Hijf{$L<+4dE4zj z-5yX(E0B3_u2^6pezM%c5*#j6OR3DKuDp?pLEh>dY z+0QrOVf#e4d*SUR?G?M9xfay)n%f<$qkMz#x&a%*=i7|ejB!V>#SVI)Luq%{sD5zq zxEkgb^ltjm4C7k_D!nAI`F!@pvf~23pQ+NrDs~b2htV^}ThM!ICG?zDsz+1Ns}={B zOMhHSNK|)t@Ia^{cT^;)dXs4*8H-t}-r`PEIg}c|#){-d8d2rO8xc2ms>+a^Ppq^W zd~>z+4(3c;28<0^38p4TEW#?jR%eSJ9#PQ37T*yI=Uu#$uIzSc7kRm9mn~&C!|^A{ zS2iMc&A^wBFR7wzwkq^CUg-IS^7HfOP@cQg$!P8AbY(Nku4bdc-0eI)<+aS&$kzMk zb|WKXk}WMc6&)Zu9x`#XFy`)czeeY{J|VqVfr;*fbG&NZsl)8pbct{r*a3%k@2wynW6U z{;N%-uL@ce%ol)ahilo>89)E&P!O#s79t# zNvh7CfEJmj_m}H0R%pN8dL2WuAofo3wWIikeVsE|L;214;y8-fDFRw#;!j1*O_AxK zq0rF<(D@`2ia0AuFVwY3BSYyg7VhD^ThSKx_Lu^ciVcqLv{W(QB5gP9LuBLK@~Xn` zZQpN~pl&ZQtCFB`)4J2C!yoCueT+pRGFq%oi}zo16z~6hKSf=+UoqEOA61vbUo0J8?-VOSXVY9Q5Ny;~ zOGV71s=gQoj;a(|d@jG);6Bu|!BkL9&^i$4rg?KXLbr+3)@_8yI;pWESel^g2alVE zX}Qi~Dr_d0AVs0pAY(a==hgvxNaHVFw>`c{u-}3$gu9g6uS}z|(&qlA2#`Bx8 z6ti4D+mBt^lNBU_Z^bNPdz4L7)0Xm>yWbrUNo;o|TSvu4;CP95AH4Q=&9C&>T|XO| z+{~!!W4Ahz?4rVe)oiTv9dR@b^7N5HnVM`Yc>UBrGRn~oZ%`mxTJG1Lpe+eraQAeg z3yss;^*ylDie@{Uu~j}tiHrXuq&NR(?&f3Flpwv%MO?nnToMebmaMISC1ZiYwaJswcw~oT>k!M#dhZ7sG5$dPdhneGi@7= zQ6p6SmgGDoX|sNF?_4Zf%35_K5Rcpj+GOLZUbPn2j^-I)i+mfPOVIg|;I?f(&(9QY z{BXfV-p0lb>6)*sy!bUPu|v~Gop^d>IQ@VjS7G+k3mpX6OPVlV+ZoS@>eW{cV=~%4 zu#my*7XHbD0T&z9_UnX_KO6EFD($E{vTe!=+;2J*+3Z}F=9Ko@$*E|%ZxXw_9ccS7 z)^{dH-rAtT&aJo1&-x0CdO=12>8x7q>g7FJAO>Fl^r}@{y{dB@o}iKU)qUVC%X;KN znlw#?vx~n%^NnTe5u9$6pm(s_M5=apFBX3;7SFd&H!eh6Q#phGR*#gZ8I|!wjOC+& zLQsC`nc?7}AO8VkIwq!|F)Cmr;x`!6F*oH{MnFO6V#j|U!&ClJ5pdMMG8&4ka0?a2fdk04mQ$73R;D7i{=#sziP4sXC>`(a4 zaba}h(N&N&vNmxv1)wr$7S-_#Aa*5win00n9f32ogTg^q3LE^71a8L#N9bQLp03GV8x-80B5UG1 z&!_9#9B!al+d!dLHxO>hXFHlYsSGcVVmAzU>?K#S0mD_0KGU@Q^xYE|-dm-hiBeOW z#pk!$Z1*aNRH%w6t8Im(zu;xpj7Q{nfLD7t@$wU2jT()m9lXe>u4|;dWS=BkC>UvJ zTOw`{M%c!#+->SqZuW5MQ2jjUjzqpiQD%3MR@>1{TrM3?<@~D-)=Jw7!7s62ujFM? z>bvE(BW+4;ul!fC{X%p>0KC&bNrfKEUmd9IW@`j=myNaKf76Tpw;Va97Xb(&bZKE> z8&`t+To3@o#0CBT9A3nGoDILji_priHvf|}e6kc=+FFJ)6ox+Pw;YFwL zqEmR$DZJ6kc=+FFJ)6ox+Pw;YFwLqEmR$DZJci;p+EeCA3{PP zf8vLZH;k_SpH=;DdJbkKkBK=@VEez2IrR6r0CW)-3=W}(K#_2I6da;Oz$4|TXK7|2 zWNl(;1hj%j$ict}=nNDD_#3?+^am~&`jd#Bt)!8eiK!z!uuUaLBddG#FhExOTjYX5 z;1D>$@i&sk-^l5?9yg610z&|S=xP8c8zTU0gT_ZGqFG75FhR%4uZI3Y=Ai!OK>dr% z`5Wc*mw-m*{7qu|OF$!Y{(|uUu&4hWnX{y5p+;sx@tzS+uksy%IWCQYCbqvJ9*NW? zndju0x2F=>b0Jc!&AJer@UsxccY#6l8lnnM#W?7jSn`91$t%8jT?VnMDfa|PDhT-p zDYOLK(cN^LKV0cJ95k8v37z3vc4_}vHPf$V=XZ@Cmy&o|H+>k(@vQm-9g-p9WSl!8 z^z{u57alX9eBWjYMk3FVoRz?#Cp#lVA!!1RBER~P_(kwTdf}E@<_FK;G2u+; zUORU-_u{3uxo5szdZ2j`=d~iG#16^LhmTVXwFH>4d_e-(t@sl8Ay+8mz6DBhp0}(_ z-!uN)QGvzJLQ1c2Bz*4dCkSPzKW+#)$=S1bIz%hFmwXjX-Hoc!NpPaV`>@3}9xHP` zZI!fpz;*p4!E;4iN)86e31NaZI;Pzk=J2C)8S=pnX^XW_A9UqVc~W;->_ED_;Z2X#+v!-`2$gq(T9r@-xfvR->i+sDnWIU z9pddva!V4u#m2khS@A{Y`wiP`;@`<)#mjaWC>WDxK<^&yM*Q3c9rp1h5%n!{OKos} ziJ%^o(+f6-?#t^`c(lVxCqI%)b+*C5&Y?F%BwCdnOtvVuIGjRTO0HVD%8_!IYzyz96cOiJM`6g_n4y<8IB)79!7&>6F->M#oKs_|pJz!@p;#*w>R zm!$RnbJDq2;rC7C7Rm~1YeW!~FCC4jc=S?QEPd4RV#Dahxwp9Zo^a)vky~fov1K;@ z&>e1LRgQ-*y6j@Vd}X%9cfaFX0U_=DsA)-c1fL0!*7j6n+?k(y#$Feq_q^AA9U2p1 z?Ju+)udjYx-EEMIvydUyYSN18ykp93k}}QRZM8YLYX5L6V^@~HlyUJott{n$`FhNm z&&BRu$rBs+%nV=Znv6GH8>d4wKQCy{jv6^fe&V`Rtgs#w&c)dO#;35)=FaLwNqoSF ze*Dmj2P(sSs$@eV)0CFcchjCpdm=xKsZHe_uBuMs!pE(odA6wvD+GMrimdnvZ{Ibn zjeilOJW1+|%Z@R?THE8X{qL_zYQ<@NG= zymO|e1V1kxaC8bT!d<y8Gc` zigQFSuaXE+OwZG}4^QW}9EX&TUMB6Y+6~bb6o*wBx44sVB@x7DbQ`H}TxSUlBgky>Ab@*~YBS{49EwFb9JtaXPJAxCawwY#O4Om5vX}_hxpWRV; zX*+lmwh?`Jo2hDJ)|#ceCur+mh~H<7c2&PNC~dEz)y6aGpBfbFWxA^qgL%WK?$=nU#4q)wFB6 zmAAL?uSd&I@&D|y-t2jo|3Yv~HVos?c`CW z@3r%*9OGNeqH=Lfi^hq2s{h>U!wlpM*}4ktn>b`KRUe(p?g!RR1}TlK<-pLX2brzBjNkhUX@d0 zKmHPhxuDVXVNX=e1ajQK5AOg<_Z{lCcZ3yAbP&4p@zqBX?#5)2D*rXUi5^L=|G*R; zy9%_`fPf%~e+>xQTA)>41o&U^ms148K=6OnUwFUYJSF14F^B(~rxcQxyrUuWKYPk! zUf^$@@?Q)1uc`bG2&R*zqnUxFjf0W>u~pLoT-NV6Of)m`{~CvhMDqUONB=5}VbdU> zzqy5fc`m@`{f{_IuuUyJiNA|?{j+A0hfqghNtH}V+CgQfpE#gv6p9yTpPoPZiS4A6 zQA=2{E#P{sdV|Mng=&XS461u>#*amFLi(IuUGw>`@ip$@+e+P^-;qt?(iXE!4xhgw zBz^9qAVI$2;I|da$-u_UktW7nP|f%P1ZJeBR5tmP!B1EEp_uA>kKQ@C4!nxDX`>Wl zGfT?p)pav3Nu-m69R(w03rm=-o;yZ8mtu&h(7s%&d!)_>D!b+OBjO!XUAV=rPFmt- zaHzB~3y0MptwyKD$Mc@=IO>(@EY}HrY;9#vX4+pJbDU`q*uUBH>#XMA@kATr|F-m) zIf4nn{Qrxi2M#3+NB@^{B2|u0lzx#^!SoQ&UuOdUKrkVoKRiDai1-KJdg|y;9sQ}J zKXvq{j{elqpE~+eNB_%GK|p9%aqP2xbM${%3$*&1qyNiZpvB)E{a+pft^VfdA)sI8 zpIz3>NW$L6$=2cezq|Z(4!{mv>7|!fqF18_gSe605c<1LdiIX)^a`TlB7m(ka&`Qz z&@b!9E^e=9Z9y+;WNE2qWdBkYmBj z##$7B<^u))W}M5}82%~97`eIF*c&5nxi7zRbZ<^cUeZ~d1B0{RSzp#cqqqHh!Y83zIZ*XJ=bpuaK70^0*4 zG0H-aU=X?)zi$r$ha=JE_74q$KtO8FS!Z-vI7U0rahT%^ z%yx*AWf5QqMmx}P|4|l+zGm`!+rTj3u)@eIpe*V{+kiOCJ^;!hFzXBj@xl<8?S&zE z;TU5Ml;s8PXkpX^$qPLZheRPT>j#HIf!kOZWr5=eqwm3RCI{qq1hWr-TdOe4eg@*uXXhAYfr%1BLjtc{!K^a^0S0E_Kg$Af!2Lr^4TafP5MJO| zz^n@}UjQRm_C)xq@3h>&PKidHm zJ&~upASC)SA^PXn90v3h0=+I`Xvh=&f&vEaWLeaSV-*DkG6rLNC@=(b4g+qSA~EMl z;Qb>o%(VxI113t$?IC$Fj|Jdr4-7N!f!sZrrzoHUG1?21h4NzL0ieM#*CPlF%!_sl zzxNejOpusu1Ii+y7}0381t9`oD8tUVeS{`XpDRT%0i$R$2p)OFy{zB zL!Qt8dw`j1fTx0D&bz?+1_EAK^k*Lc8s@xF7xw1zpBfQE!%*7-j?5<2cgAAn&f z%y}FFtkanD3tBt540!KOEI55ld!qH~|f8+-6o+dcPu@CqS z-V=2Ov=jLU_!7+Z9PL$3)CB?sj1I8=x4y^V6J5lIFP%TeT4)jPt0}z8s^#!r1MFC z0B9%Liv&)=FmniSS10n17lp(;e*^pm^2FQ;XeZ`Qz?VQUa~Jg=b2bVD*nW)h0OI~b z15DwcaeyyA5r@_={U6#tV~!hI!}LvnhQQ1NKm%L|#(n{th}ky4I|7M%G7i)GpySZ5 z&HFw701cR&PH0ffyhq2K=mRjA7jt}p^LP+uZlE;6Xv)9asN>l2r*Homejcw?GTs;0;6nGyZKX57rM;gOWz)x+}BXB|M_}U6kTQ~wqz``OXFHZ1(0H-uK2mk;8 literal 0 HcmV?d00001 diff --git a/doc/cholesky.lyx b/doc/cholesky.lyx new file mode 100644 index 000000000..99157fadc --- /dev/null +++ b/doc/cholesky.lyx @@ -0,0 +1,170 @@ +#LyX 1.6.7 created this file. For more info see http://www.lyx.org/ +\lyxformat 345 +\begin_document +\begin_header +\textclass article +\use_default_options true +\language english +\inputencoding auto +\font_roman default +\font_sans default +\font_typewriter default +\font_default_family default +\font_sc false +\font_osf false +\font_sf_scale 100 +\font_tt_scale 100 + +\graphics default +\paperfontsize default +\use_hyperref false +\papersize default +\use_geometry false +\use_amsmath 1 +\use_esint 1 +\cite_engine basic +\use_bibtopic false +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\defskip medskip +\quotes_language english +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\author "" +\author "" +\end_header + +\begin_body + +\begin_layout Section +Basic solving with Cholesky +\end_layout + +\begin_layout Standard +Solving a linear least-squares system: +\begin_inset Formula \[ +\arg\min_{x}\left\Vert Ax-b\right\Vert ^{2}\] + +\end_inset + +Set derivative equal to zero: +\begin_inset Formula \begin{align*} +0 & =2A^{T}\left(Ax-b\right)\\ +0 & =A^{T}Ax-A^{T}b\end{align*} + +\end_inset + +For comparison, with QR we do +\begin_inset Formula \begin{align*} +0 & =R^{T}Q^{T}QRx-R^{T}Qb\\ + & =R^{T}Rx-R^{T}Qb\\ +Rx & =Qb\\ +x & =R^{-1}Qb\end{align*} + +\end_inset + +But with Cholesky we do +\begin_inset Formula \begin{align*} +0 & =R^{T}RR^{T}Rx-R^{T}Rb\\ + & =R^{T}Rx-b\\ + & =Rx-R^{-T}b\\ +x & =R^{-1}R^{-T}b\end{align*} + +\end_inset + + +\end_layout + +\begin_layout Section +Frontal (rank-deficient) solving with Cholesky +\end_layout + +\begin_layout Standard +To do multi-frontal elimination, we decompose into rank-deficient conditionals. + +\begin_inset Formula \[ +\left[\begin{array}{cccccc} +\cdot & \cdot & \cdot & \cdot & \cdot & \cdot\\ +\cdot & \cdot & \cdot & \cdot & \cdot & \cdot\\ +\cdot & \cdot & \cdot & \cdot & \cdot & \cdot\end{array}\right]\to\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Formula \[ +\left[\begin{array}{cc} +R^{T} & 0\\ +S^{T} & C^{T}\end{array}\right]\left[\begin{array}{cc} +R & S\\ +0 & C\end{array}\right]=\left[\begin{array}{cc} +F^{T}F & F^{T}G\\ +G^{T}F & G^{T}G\end{array}\right]\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Formula \[ +R^{T}R=F^{T}F\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Formula \begin{align*} +R^{T}S & =F^{T}G\\ +S & =R^{-T}F^{T}G\end{align*} + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Formula \begin{align*} +S^{T}S+C^{T}C & =G^{T}G\\ +G^{T}FR^{-1}R^{-T}F^{T}G+C^{T}C & =G^{T}G\\ +G^{T}QRR^{-1}R^{-T}R^{T}Q^{T}G+C^{T}C & =G^{T}G\\ +\textbf{if }R\textbf{ is invertible, }G^{T}G+C^{T}C & =G^{T}G\\ +C^{T}C & =0\end{align*} + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/doc/images/circular.pdf b/doc/images/circular.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b0f43f64978d3bfd4ded1bb64c6ee9a64ea98ae8 GIT binary patch literal 62900 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 IQjx~`Uyb_&vH$=8 literal 0 HcmV?d00001 diff --git a/doc/images/circular.png b/doc/images/circular.png new file mode 100644 index 0000000000000000000000000000000000000000..71c346a8ec6458757638e023c5ce29431482a1b2 GIT binary patch literal 1493 zcmV;`1uFW9P)#6s{yOo z!plL9LGiyx<|X`3;S_}YP0Jy8$R9Hd(jzS50X;+EZ&)%P(-RavLg8Zo>JrX@WY$nk z<8Vc^PwG4li*Ju#r5s4+GhSAZ$Kf+pzKS?pI*ki55Ly_H6$bO$V8r}w^wjP)bio-4 z(@nudVTMM`15h_1F(_hjNEB)mW)QUNUXDR`w{=aV5`osAO&=N*S`>OZkOQVD%ur}i z=&qy-svvBfb%jQB_6rwuR?-Pm6dDw|<_kAWP`E&0jzY&Y;DHGWbp-xZ7jhK#E9rw0 zg((VGDD3q~AM91q3pEN?LD(4kjnS=xurYAbK5U*(U6hhA+?H>J;kJ^~Fx<}iA4FhX zNh>3;9$_X1>&|OL1lFB*<$&$EB&i~gW3Z~EVL`|*J{ey2xlqJvuFBR;-iCj)p{(Jp z2-NlKBmxZzHofQqqd(ix{-~ik?cc??>V3gidxT z|2zh1XG-!WU5IoA?_mU9Kc{2js|-6$Fef@UnGfZ+LT z&JdX8;(7nnj^8prR~OGHtp79|R8B~jfO2ps28Y}U)xU=qw@HIRGdRppsNFC@VLzfm zVS+-5LNPexVDoHmo!d}$p&1-zgF}r%H8_+g6oW$!!p2XzfuKQQhQb93Qxqx`N)!qd zG8A$UHkaDEP&Gdq0wZQ9T%b^+P@ynE;S7Z$3afVEV8qrMXb2hDsR49}I*s8zq z!}h_!Q@59r0})p!T%a&Tp+unwz*aNz0Bjze)lWZMp-`hxg=a8JN4Jbj(65&|Dw*&zhp z9lb&j9KHH!`S#jqb6h!`e0!rTRL}}~FxnpPZlj)kvR9R|5}LD7m4R5!uv3d8*7~pa zhF#ntFd}z9o$WVI2@e4HO?koE2jEcwPu)8KT2S6Dp?hCL3!d#3m%xX}P8TsPq1=>% zSx+c=>fT$>fnzF04FZdVbmYyRynJfSag<>|ofHnx>hy|R1Pzo>^$pivV z$MX7mriwvHa)LmmDB0sP2&yp`aVQHo2ZjR8cS-+>><%l^SiC?shsbiO2Vw5nJmdIL zfoxz|Lp?a8OTxbaL;x5VyfsC&0000ybVXQnLvL+uWo~o;AW3auXJsH~Wo~71VRU6= zAYyqSM^H>4M`&+zbaP{JX>fEPC}d@JX=7zQaBgjKVRtDC2Pe+(0000qbVXQnaAamW zNNG}Kb3$)*Ze(e0XF_jy05dT*E;%5@PE;ltao2<4} v0000KbVXQnaAamWR%LQ?X>V=-P((&8F)lL-h`nWL00000NkvXXu0mjfnPGIR literal 0 HcmV?d00001 diff --git a/doc/images/gtsam-structure.graffle b/doc/images/gtsam-structure.graffle new file mode 100644 index 000000000..22eb72dc3 --- /dev/null +++ b/doc/images/gtsam-structure.graffle @@ -0,0 +1,1302 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 138.14.0.129428 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559.29, 782.89}} + Class + SolidGraphic + ID + 2 + Style + + fill + + GradientColor + + w + 0.666667 + + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + CanvasOrigin + {0, 0} + CanvasSize + {559.29, 782.89} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2010-07-13 00:07:47 -0400 + Creator + Frank Dellaert + DisplayScale + 1 0/72 in = 1 0/72 in + FileType + flat + GraphDocumentVersion + 6 + GraphicsList + + + Class + LineGraphic + Head + + ID + 19 + + ID + 35 + Points + + {191.649, 522.933} + {191.649, 558.208} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 34 + + + + Bounds + {{156.649, 558.708}, {70, 27.449}} + Class + ShapedGraphic + ID + 19 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 tests} + + + + Class + Group + Graphics + + + Class + LineGraphic + Head + + ID + 30 + + ID + 22 + Points + + {220.827, 437.595} + {201.125, 473.266} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 25 + + + + Class + LineGraphic + Head + + ID + 28 + + ID + 23 + Points + + {198.977, 245.588} + {219.976, 281.282} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 33 + + + + Class + LineGraphic + Head + + ID + 25 + + ID + 24 + Points + + {234.015, 373.654} + {229.931, 409.211} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 27 + + + + Bounds + {{193.649, 409.708}, {70, 27.449}} + Class + ShapedGraphic + ID + 25 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 nonlinear} + + + + Class + LineGraphic + Head + + ID + 27 + + ID + 26 + Points + + {230.126, 309.655} + {233.82, 345.213} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 28 + + + + Bounds + {{200.649, 345.708}, {70, 27.449}} + Class + ShapedGraphic + ID + 27 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 linear} + + + + Bounds + {{193.649, 281.708}, {70, 27.449}} + Class + ShapedGraphic + ID + 28 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 inference} + + + + Class + LineGraphic + Head + + ID + 30 + + ID + 29 + Points + + {152.743, 373.628} + {188.492, 473.239} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 32 + + + + Bounds + {{158.649, 473.708}, {70, 27.449}} + Class + ShapedGraphic + ID + 30 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 slam} + + + + Class + LineGraphic + Head + + ID + 32 + + ID + 31 + Points + + {185.872, 245.631} + {152.363, 345.234} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 33 + + + + Bounds + {{112.649, 345.708}, {70, 27.449}} + Class + ShapedGraphic + ID + 32 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 geometry} + + + + Bounds + {{155.649, 217.708}, {70, 27.449}} + Class + ShapedGraphic + ID + 33 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 base} + + + + ID + 21 + + + Bounds + {{86.649, 196.433}, {210, 326}} + Class + ShapedGraphic + ID + 34 + Shape + Rectangle + Style + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs24 \cf0 gtsam} + + TextPlacement + 0 + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 3 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + AutoLayout + 2 + LineLength + 0.4643835723400116 + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2010-07-13 00:17:24 -0400 + Modifier + Frank Dellaert + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + OutlineStyle + Basic + PageBreaks + NO + PrintInfo + + NSBottomMargin + + float + 41 + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.29, 841.89} + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + QuickLookPreview + + JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls + dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlV8tuWzcQ3d+v4NJemCZn+NzWbYF6 + 1dQCuii6cAW5kSHZjeQW6N/3DHl5TclXUoNYSOQwnPeZM8Mv6pP6ogw+3mcVE6ndSv2q + XtTt3d6q5V7Z8tkv1Y3RXhnN2RjrglzXVCR0yhAantTtz6vdcvXX29+PG7VbQy0xFdXs + kopeB5dyVuS8dj6q5Vbd/rS16vvX4kKuV71R1jlczcoTaZusH+pNmrlpbLnJ2ZWbo865 + my6WmxTCJZ2Jyk3n0yWdKR9YP+PnqJPZXNKJ5EjsiHvGz9tfVpvHt/U/q7vXzetuvV29 + 7dZLSXUKkCrJDaYkl6xRTEGK+YQC3is7PNeS3j2Ukhj1cIcK2fKPG/lC7aWSSPakzeag + HbOq2rzO+JFSP6BiwAcJPowCNjpFNteaOOJW5u8Wytbq3uD7xhqDv1xUi+1w+6PVqLha + PKnf1NWf14IyUldv10AavveP7WR7rX5Xi3v1w6LaPsSm9TVtnqOOTF5Foyhqh5zEoeSg + 87APtQmShaBJB4KSvINIh+NITamV9/ZUpKyNNdEph1hVH+tw9UeLbApxvzofox2BafJX + xjgKMrD11TGOfXO6muRPxzjVE5HVwr62X7bTUav17t8+/Jl6SX/Z5HWKRIVFAluncIbi + ewtkMuM/vUlq0+pWUCLkVlBqPekcgHHHGRULaRDhpDkA484FbRJaZoMzZDoGj7MIzHtR + +LmcHkjD9BMU3+PP8zDjr7TSZJId2oHBh51J5qCTwKMzyezQhY6GA5OdtCDSlg/QKN4L + XRDo4hj3U+8PVj33HXqI/6rARb6MDXR6H6fNXI3nidCPOx15DDHHj/hHa2+uh4qJqQEO + evxMQqNjpxgeB8QtCQUowCdpcIF1JuNPAiBFAQgptmhZzqkIo8bRepxlnRNGGqoBKmRC + ERi0kH2gCoAZ6QkAJxM8Cg0uCkvAtvg7mnQBgDTRdiaVC05n5hFzzWQn/TD0ABhrUOon + xBcQBH7SRH8TDICZWRiUtmqlFBwJDc6qOSDDI9onGoEEjzHdRekRGAhTHf1Fc2BYN1p4 + ab88jRNg1VCymwhjurM8T5hkKj+7Rpgfgjo7Gpr4RJsfxPsBMcyMQgIfSXcekqfRxgAG + C3RvPxSRnYg1SSZFPxWvNuuX1ePuWi2e6+w70Rckq4VklxFt8NC0lfVLxxziIMTIwZ/s + C2LpJZCTEKMPkYswpgXYqZBgYicsRZR1soRGAzGSdaLwM8x8lL7YF01oEGpjotibFH+N + 98LFzWQh9xBLDJ3JTnq2L0rxvr0vCoS+qS8Y6/J7X8xjoHSIR4jH68LVy+vLBxyA1mWu + He1uhPlhrOfKj94J3xBjyQqgRc5Zc/RCZ2Mv1wE5jAOygMhFXMS2DhwIuRaFiF9xYm0j + VRwkzEpjy1nysfJjkx466f+BA+BWTDoTBQf5wCT8jTYGDEPhl2oSZ4ap8mMz2UvXAYmN + 9xzdJXB+AEliJfIpyRYBOIPq8S6hiK5xmcckEcaCsdg4vGGN+77cjdo76waPORKClZlB + 2LI44hZ40OaxM2Zkz2ZEaHMySFHeF2gyOasG4ZzVSIVMjNEgRacplpmHvmgGmyw2nAv5 + kC2FyOiEFnRYn30GPnBksO5bizPMo2AMowaiiQxpA5ooI5RSKPVCzNi8I86w0OAxJt5J + thJaWMZqdCC8QhWjNAYr4qjSZxNSvGsmZQgGwwWVzaTDg854EwUizaSsAdZhBvYmVSdd + UyJbVNmh5PGEJxceO8c7VB0Q5f00j6a641UFHsvYuf16bkS01xJeWEIPou5obMryHtF+ + PScM9bnUNudpMu7byf7CKl3cLg+1FAZ5Z2PjQNGrNxj/mB+ahe+OiKIwjuSsynogJ6CB + sD2JsDzbkx+EMcqZLFKyFUBPd4ZNekb6LArqiiLvSvHNh+rbu8ne38lkF8O7yaGTFhR8 + +g8FPYzxCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iagoxNDU4CmVuZG9iagozIDAgb2Jq + Cjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIgL1Jlc291cmNlcyA3IDAgUiAvQ29u + dGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNTU5LjI5IDc4Mi44OV0KPj4KZW5kb2Jq + CjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAv + SW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMSA4IDAgUgovQ3MyIDEzIDAgUiA+PiAv + Rm9udCA8PCAvRjEuMCAxNCAwIFIgPj4gL1hPYmplY3QgPDwgL0ltMSA5IDAgUiAvSW0y + IDExIDAgUgo+PiA+PgplbmRvYmoKOSAwIG9iago8PCAvTGVuZ3RoIDEwIDAgUiAvVHlw + ZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDQ2NCAvSGVpZ2h0IDY5NiAv + SW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAxNSAwIFIgL0ludGVudCAvUGVyY2Vw + dHVhbCAvU01hc2sgMTYgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxh + dGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCBAAAAAMOg+VNf4QCFUGHAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAwDswyVIAAQplbmRzdHJlYW0KZW5kb2Jq + CjEwIDAgb2JqCjQyNDgKZW5kb2JqCjExIDAgb2JqCjw8IC9MZW5ndGggMTIgMCBSIC9U + eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTg0IC9IZWlnaHQgMTAw + IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDE1IDAgUiAvSW50ZW50IC9QZXJj + ZXB0dWFsIC9TTWFzayAxOCAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9G + bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABA48DA9egAAEKZW5kc3RyZWFtCmVuZG9iagoxMiAw + IG9iagoyNjMKZW5kb2JqCjE2IDAgb2JqCjw8IC9MZW5ndGggMTcgMCBSIC9UeXBlIC9Y + T2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggNDY0IC9IZWlnaHQgNjk2IC9Db2xv + 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 + 5vWrF8uLT+Ye3J4YuzR4KmJ+YPmUp/nrskSnx5ezcj9X8fyXzj++wFvs+Zf/x8namDjz + 61vz66HyL+qav+48NmDu5693Zh49XVp++erN23/8z6ICZoG3b169XF56+mjmzq/mfg4c + 6/y6ue6LcvMLIvML3LgYebL9SyJPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5 + sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypP + NjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJ + Job7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZ + xHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSeb + GO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQT + w33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxi + uK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M + 95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonh + vvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHc + V554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7 + yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBf + eeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4r + T7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33l + ifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK88 + 8T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un + 3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE + +7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554 + H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPv + w5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ9 + 2FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wP + WypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdh + S+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5s + qTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3oct + lSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl + 8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZU + nmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bK + k00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5 + sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypP + NjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJ + Job7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZ + xHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSeb + GO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQT + w33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxi + uK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M + 95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonh + vvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHc + V554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7 + yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBf + eeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4r + T7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33l + ifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK88 + 8T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un + 3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE + +7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554 + H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPv + w5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ9 + 2FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wP + WypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdh + 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 + rTtamhvr67ZUhyqChfmG03p7xn/saT1wzQV1GtDM7LyCkvJNoepwTd22+obGpqamZh0b + LGAgGhvqt9XVhKtDm8pLCvKyMw2n01zPjx63a1YeuPHmiZtq3dC8QFFpeUVlqGrzl+Ga + WnPqdP7xBSyHmvCXm6tClRXlpUUB62HrSTVP29Wup/E0FzQh0bEC6s/NDxQWB8s2VlRW + hkKhL3RssYChqKys2FgWLC4M5Of6VzgdiQnmen74+jR/GWq+iAxokiPF5Vnvy/Tn5uUH + CoqKS0qDwbKych0bLFBWFgyWlhQXFQTy83L9mb71HleKw/ysEvvR15D1d9vmgsbExZsb + 6nS507y+DH92jjHN3xAo0LHNAoEN+cYyJ9uf4fOmuV1Oczutp+0q1/M9qHnkJpsr6k5b + b0gzs/xGNSdXxyYL5BhJf1amwVxvNFMcyeZh+ynONWtXbmhcfOKKaKrHY0y96ek+X4aO + TRbw+dLTvcbS40ld0TSfQiucH/zw+f7/SrQCGhtnrqgRdThTXK5Ut9ujY6sF3O5UlyvF + 6TB307qc5t25bu3qnOaJa26o9VVkvUYTk5INqsPpdKbo2GYBw2FQkpOTDKa5m5bmpzmt + j6J3oobUmBrUlZOkY5MF3oMkWJZxsX+rufKZa4mui4mJibVQdWy5gKGMsa4mvJvv36LW + JV0xtf55c8z/Usc2C7wzWflPw/S/ZP/JfzH/vI5NF/hP/PTPaAEtoAW0gBbQAlpAC2gB + /gX+B05tLvoKZW5kc3RyZWFtCmVuZG9iagoxNyAwIG9iago2NTUwCmVuZG9iagoxOCAw + IG9iago8PCAvTGVuZ3RoIDE5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h + Z2UgL1dpZHRoIDE4NCAvSGVpZ2h0IDEwMCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAv + SW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRl + RGVjb2RlID4+CnN0cmVhbQp4Ae2b+VeS6RvGrdxARBAERRQFXAAVUQrFUgwzUcxdcVwG + Qx1pMKqRkaPlkilFrpnjMu7jMuo4Wk46TXXmX/vezwuVC1Jzjt/HfuD6Jc/hxPvx6n5f + 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 + TS+So592fgU1op5G9NOgWuds1p2CDSMOM04064g+IAn1AYlGILTzcIu4NJn0VX1AdHMS + 5KgU6OP7uYDprEPi/gPql0T/kqiOnmq28wPUWdJFfddzL7wCwse665FU1fHP+s/oyPbD + wtkxPnxd+BmM/Brow78L+ivnqcMsnp89Dngc8DjgceCoA/8DzflMvgplbmRzdHJlYW0K + ZW5kb2JqCjE5IDAgb2JqCjI4MjgKZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEg + MCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl + ID4+CnN0cmVhbQp4AYVUz2sTQRT+Nm6p0CIIWmsOsniQIklZq2hF1Db9EWJrDNsftkWQ + ZDNJ1m426+4mtaWI5OLRKt5F7aEH/4AeevBkL0qFWkUo3qsoYqEXLfHNbky2perAzn7z + 3jfvfW923wANctI09YAE5A3HUqIRaWx8Qmr8iACOoglBNCVV2+xOJAZBg3P5e+fYeg+B + W1bDe/t3snetmtK2mgeE/UDgR5rZKrDvF3EKWRICiDzfoSnHdAjf49jy7I85Tnl4wbUP + Kz3EWSJ8QDUtzn9NuFPNJdNAg0g4lPVxUj6c14uU1x0HaW5mxsgQvU+QprvM7qtioZxO + 9g6QvZ30fk6z3j7CIcILGa0/RriNnvWM1T/iYeGk5sSGPRwYNfT4YBW3Gqn4NcIUXxBN + J6JUcdkuDfGYrv1W8kqCcJA4ymRhgHNaSE/XTG74uocFfSbXE6/id1ZR4XmPE2fe1N3v + RdoCrzAOHQwaDJoNSFAQRQRhmLBQQIY8GjE0snI/I6sGG5N7MnUkart0YkSxQXs23D23 + UaTdPP4oInGUQ7UIkvxB/iqvyU/lefnLXLDYVveUrZuauvLgO8XlmbkaHtfTyONzTV58 + ldR2k1dHlqx5erya7Bo/7FeXMeaCNY/Ec7D78S1flcyXKYwUxeNV8+pLhHVaMTffn2x/ + Oz3iLs8utdZzrYmLN1abl2f9akj77qq8k+ZV+U9e9fH8Z83EY+IpMSZ2iuchiZfFLvGS + 2EurC+JgbccInZWGKdJtkfok1WBgmrz1L10/W3i9Rn8M9VGUGczSVIn3f8IqZDSduQ5v + +o/bx/wX5PeK558oAi9s4MiZum1Tce8QoWWlbnOuAhe/0X3wtm5ro344/ARYPKsWrVI1 + nyC8ARx2h3oe6CmY05aWzTlShyyfk7rpymJSzFDbQ1JS1yXXZUsWs5lVYul22JnTHW4c + oTlC98SnSmWT+q/xEbD9sFL5+axS2X5OGtaBl/pvwLz9RQplbmRzdHJlYW0KZW5kb2Jq + CjIxIDAgb2JqCjczNwplbmRvYmoKOCAwIG9iagpbIC9JQ0NCYXNlZCAyMCAwIFIgXQpl + bmRvYmoKMjIgMCBvYmoKPDwgL0xlbmd0aCAyMyAwIFIgL04gMSAvQWx0ZXJuYXRlIC9E + ZXZpY2VHcmF5IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVST0gUURz+ + zTYShIhBhXiIdwoJlSmsrKDadnVZlW1bldKiGGffuqOzM9Ob2TXFkwRdojx1D6JjdOzQ + oZuXosCsS9cgqSAIPHXo+83s6iiEb3k73/v9/X7fe0RtnabvOylBVHNDlSulp25OTYuD + HylFHdROWKYV+OlicYyx67mSv7vX1mfS2LLex7V2+/Y9tZVlYCHqLba3EPohkWYAH5mf + KGWAs8Adlq/YPgE8WA6sGvAjogMPmrkw09GcdKWyLZFT5qIoKq9iO0mu+/m5xr6LtYmD + /lyPZtaOvbPqqtFM1LT3RKG8D65EGc9fVPZsNRSnDeOcSEMaKfKu1d8rTMcRkSsQSgZS + NWS5n2pOnXXgdRi7XbqT4/j2EKU+yWCoibXpspkdhX0AdirL7BDwBejxsmIP54F7Yf9b + UcOTwCdhP2SHedatH/YXrlPge4Q9NeDOFK7F8dqKH14tAUP3VCNojHNNxNPXOXOkiO8x + 1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67qJe57AnfT4zvRmzkLXKAcSXKxFdkU0DwJ + WBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtURG2ejUoFWeo1Xxk/jufHF+GVsGM+Afqx2 + 13t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL3f/HMoSP2Sc5psHToVlYa9h25A+azEyw + DCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktUbinU6j2DSqwcK9gAdnCSxCxaHLhTa7o5 + eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPNs0RmlLFbo+TdeNv9ZpERnzg6vue9ilrJ + /klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l5/VB/TwJPa2f0a/ooxG+DHRJz8JzUR+j + SfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0PQBn9ZgplbmRzdHJlYW0KZW5kb2JqCjIz + IDAgb2JqCjcwNAplbmRvYmoKMTMgMCBvYmoKWyAvSUNDQmFzZWQgMjIgMCBSIF0KZW5k + b2JqCjI0IDAgb2JqCjw8IC9MZW5ndGggMjUgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2 + aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AdWWd1gTSR/HZ3fT + Cy0QWoDQe+8gvQYQkCqISkgooYQQioDYkMMTPAsqImABPRBR8CyAnAURxcIhYK8X5BBQ + z8OCqKi5Dbx4/vHef+8/7+yzM5/9zm9/Mzsz+zxfACg9bIEgHZYBIIOfIwzz82Qujoll + 4h8AHGAAMpAFMmxOtsAjNDQI/Gt5fwdAks6bppJc/xr23ztkuYnZHACgULQ7gZvNyUD5 + JMpfOQJhDgCwhAdW5AhQRkpQlheiE0S5SsLJc3xEwglz3DUbExHmhcbcAoBAYbOFyQCQ + RajOzOMko3koKAILPpfHR9kCZVdOCpuLsgBlk4yMTAnXomyQ8F2e5O+YzU74lpPNTv7G + c9+CvokO7M3LFqSzC2Yf/pdVRnouul6zRQ6tKfz04CC0paP3OJftHTjPgvTZPZvVE/mR + 4fM6PyE4ZJ6ThL5h8yzI8fyOQyPm9cIUr+B5Tsz2+ZYnlR0g2bPZ/MLcsMh5zs4L95nn + wpSI6HnmJnp/05N4vqx5nZfD+jZWWmbgtzkAb+ADgtCLCayAxezlC9ARcxLz0T0EwCtT + UCDkJafkMD3QU5dowmTxOWYmTCsLS8mW/v8Uyf82N9u3N2b/I0hJcpT/o+UvAcBdGT3L + 0/9oUej53zsEgOKtfzQDTQA0FQBoT+DkCvPm8mEkDRaQgDSQB8pAHWgDA2CKrqYdcAbu + 6OoGgBAQAWLAMsABKSADCMEKUATWgVJQDraCnaAa7AMHwCFwFBwH7eAMuAAug+tgANwG + D4EIjIIXYBK8BzMQBOEhKkSDlCENSBcyhqwgB8gV8oGCoDAoBoqHkiE+lAsVQeuhcqgC + qobqoCboF+g0dAG6Cg1C96FhaAJ6A32CEZgCy8NqsB5sDjvAHnAgHAEvhZPhLLgQLoE3 + w1VwPXwEboMvwNfh27AIfgFPIQAhI3REEzFFHBAvJASJRZIQIbIaKUMqkXqkBelEepGb + iAh5iXzE4DA0DBNjinHG+GMiMRxMFmY1ZhOmGnMI04bpwdzEDGMmMV+xVCwDa4x1wrKw + i7HJ2BXYUmwltgF7CnsJexs7in2Pw+HoOH2cPc4fF4NLxa3EbcLtwbXiunCDuBHcFB6P + V8Yb413wIXg2Pgdfit+NP4I/jx/Cj+I/EMgEDYIVwZcQS+ATigmVhMOEc4QhwhhhhihD + 1CU6EUOIXGIBcQvxILGTeIM4SpwhyZL0SS6kCFIqaR2pitRCukR6RHpLJpO1yI7kRWQe + eS25inyMfIU8TP5IkaMYUbwocZRcymZKI6WLcp/ylkql6lHdqbHUHOpmahP1IvUJ9YMU + TcpMiiXFlVojVSPVJjUk9UqaKK0r7SG9TLpQulL6hPQN6ZcyRBk9GS8ZtsxqmRqZ0zJ3 + ZaZkabKWsiGyGbKbZA/LXpUdl8PL6cn5yHHlSuQOyF2UG6EhNG2aF41DW087SLtEG5XH + yevLs+RT5cvlj8r3y08qyCnYKEQp5CvUKJxVENERuh6dRU+nb6Efp9+hf1JUU/RQTFTc + qNiiOKQ4raSq5K6UqFSm1Kp0W+mTMlPZRzlNeZtyu/JjFYyKkcoilRUqe1UuqbxUlVd1 + VuWolqkeV33AgBlGjDDGSsYBRh9jSk1dzU9NoLZb7aLaS3W6urt6qvoO9XPqExo0DVcN + nsYOjfMaz5kKTA9mOrOK2cOc1GRo+mvmatZp9mvOaOlrRWoVa7VqPdYmaTtoJ2nv0O7W + ntTR0FmoU6TTrPNAl6jroJuiu0u3V3daT18vWm+DXrveuL6SPku/UL9Z/5EB1cDNIMug + 3uCWIc7QwTDNcI/hgBFsZGuUYlRjdMMYNrYz5hnvMR40wZo4mvBN6k3umlJMPUzzTJtN + h83oZkFmxWbtZq/MdcxjzbeZ95p/tbC1SLc4aPHQUs4ywLLYstPyjZWRFceqxuqWNdXa + 13qNdYf1axtjm0SbvTb3bGm2C2032HbbfrGztxPatdhN2OvYx9vX2t91kHcIddjkcMUR + 6+jpuMbxjONHJzunHKfjTn85mzqnOR92Hl+gvyBxwcEFIy5aLmyXOheRK9M13nW/q8hN + 043tVu/21F3bneve4D7mYeiR6nHE45WnhafQ85TntJeT1yqvLm/E28+7zLvfR84n0qfa + 54mvlm+yb7PvpJ+t30q/Ln+sf6D/Nv+7LDUWh9XEmgywD1gV0BNICQwPrA58GmQUJAzq + XAgvDFi4feGjYN1gfnB7CAhhhWwPeRyqH5oV+usi3KLQRTWLnoVZhhWF9YbTwpeHHw5/ + H+EZsSXiYaRBZG5kd5R0VFxUU9R0tHd0RbRosfniVYuvx6jE8GI6YvGxUbENsVNLfJbs + XDIaZxtXGndnqf7S/KVXl6ksS192drn0cvbyE/HY+Oj4w/Gf2SHsevZUAiuhNmGS48XZ + xXnBdefu4E4kuiRWJI4luSRVJI0nuyRvT55IcUupTHnJ8+JV816n+qfuS51OC0lrTBOn + R6e3ZhAy4jNO8+X4afyeTPXM/MxBgbGgVCDKcsramTUpDBQ2ZEPZS7M7cuRRY9OXa5D7 + Q+5wnmteTd6HFVErTuTL5vPz+wqMCjYWjBX6Fv68ErOSs7K7SLNoXdHwKo9Vdauh1Qmr + u9dorylZM7rWb+2hdaR1aet+K7Yorih+tz56fWeJWsnakpEf/H5oLpUqFZbe3eC8Yd+P + mB95P/ZvtN64e+PXMm7ZtXKL8sryz5s4m679ZPlT1U/izUmb+7fYbdm7FbeVv/XONrdt + hypkKworRrYv3N62g7mjbMe7nct3Xq20qdy3i7Qrd5eoKqiqY7fO7q27P1enVN+u8axp + rWXUbqyd3sPdM7TXfW/LPrV95fs+7eftv1fnV9dWr1dfeQB3IO/As4NRB3t/dvi5qUGl + obzhSyO/UXQo7FBPk31T02HG4S3NcHNu88SRuCMDR72PdrSYttS10lvLj4Fjucee/xL/ + y53jgce7TzicaDmpe7L2FO1UWRvUVtA22Z7SLuqI6Rg8HXC6u9O589SvZr82ntE8U3NW + 4eyWc6RzJefE5wvPT3UJul5eSL4w0r28++HFxRdv9Szq6b8UeOnKZd/LF3s9es9fcbly + 5qrT1dPXHK61X7e73tZn23fqN9vfTvXb9bfdsL/RMeA40Dm4YPDckNvQhZveNy/fYt26 + fjv49uCdyDv37sbdFd3j3hu/n37/9YO8BzMP1z7CPip7LPO48gnjSf3vhr+3iuxEZ4e9 + h/uehj99OMIZefFH9h+fR0ueUZ9VjmmMNY1bjZ+Z8J0YeL7k+egLwYuZl6V/yv5Z+8rg + 1cm/3P/qm1w8Ofpa+Fr8ZtNb5beN72zedU+FTj15n/F+Zrrsg/KHQx8dPvZ+iv40NrPi + M/5z1RfDL51fA78+EmeIxQK2kD3rBRC0hpOSAHjTCAA1BgDaAACkrjk/PBuBOvhh/3n6 + N57zzLNRdgDUuQMgsXdBXQDsQls99JmBthJbiFo6eO0/N6pISnaStdUsQBQV1Jp0icVv + xADg4wH40i8Wz1SJxV8qUa/zDoDzwXM+XBItg/r7/YiFjW9QZ6bb7OvfV38DJafpNwpl + bmRzdHJlYW0KZW5kb2JqCjI1IDAgb2JqCjI2NjMKZW5kb2JqCjE1IDAgb2JqClsgL0lD + Q0Jhc2VkIDI0IDAgUiBdCmVuZG9iago0IDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVk + aWFCb3ggWzAgMCA2MTIgNzkyXSAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gPj4KZW5k + b2JqCjI2IDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9PdXRsaW5lcyAyIDAgUiAvUGFn + ZXMgNCAwIFIgL1ZlcnNpb24gLzEuNCA+PgplbmRvYmoKMiAwIG9iago8PCAvTGFzdCAy + NyAwIFIgL0ZpcnN0IDI4IDAgUiA+PgplbmRvYmoKMjggMCBvYmoKPDwgL1BhcmVudCAy + OSAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzgyLjg5IDAgXSAvVGl0 + bGUgKENhbnZhcyAxKQo+PgplbmRvYmoKMjkgMCBvYmoKPDwgPj4KZW5kb2JqCjI3IDAg + b2JqCjw8IC9QYXJlbnQgMjkgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAw + IDc4Mi44OSAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjMwIDAgb2JqCjw8 + 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 + dCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9G + b250TmFtZSAvR0lTVklCK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAv + TWF4V2lkdGggMTUwMCAvWEhlaWdodCA2MzcgL0ZvbnRGaWxlMiAzMCAwIFIgPj4KZW5k + b2JqCjMzIDAgb2JqClsgNTU2IDU1NiA1MDAgMCA1NTYgMjc4IDU1NiAwIDIyMiAwIDAg + MjIyIDgzMyA1NTYgNTU2IDAgMCAzMzMgNTAwIDI3OCAwIDAKMCAwIDUwMCBdCmVuZG9i + agoxNCAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VG + b250IC9HSVNWSUIrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgozMiAwIFIgL1dpZHRo + cyAzMyAwIFIgL0ZpcnN0Q2hhciA5NyAvTGFzdENoYXIgMTIxIC9FbmNvZGluZyAvTWFj + Um9tYW5FbmNvZGluZwo+PgplbmRvYmoKMzQgMCBvYmoKKE1hYyBPUyBYIDEwLjYuNCBR + dWFydHogUERGQ29udGV4dCkKZW5kb2JqCjM1IDAgb2JqCihEOjIwMTAwNzEzMDQxODIy + WjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDM0IDAgUiAvQ3JlYXRp + b25EYXRlIDM1IDAgUiAvTW9kRGF0ZSAzNSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzNgow + MDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMjgyNzAgMDAwMDAgbiAKMDAwMDAyMTQwMiAw + MDAwMCBuIAowMDAwMDAxNTc0IDAwMDAwIG4gCjAwMDAwMjEyMzkgMDAwMDAgbiAKMDAw + MDAwMDAyMiAwMDAwMCBuIAowMDAwMDAxNTU0IDAwMDAwIG4gCjAwMDAwMDE2ODQgMDAw + MDAgbiAKMDAwMDAxNzUxNCAwMDAwMCBuIAowMDAwMDAxODU3IDAwMDAwIG4gCjAwMDAw + MDYzMjUgMDAwMDAgbiAKMDAwMDAwNjM0NiAwMDAwMCBuIAowMDAwMDA2ODMwIDAwMDAw + IG4gCjAwMDAwMTgzNzggMDAwMDAgbiAKMDAwMDAyODAwMSAwMDAwMCBuIAowMDAwMDIx + MjAyIDAwMDAwIG4gCjAwMDAwMDY4NTAgMDAwMDAgbiAKMDAwMDAxMzU5MiAwMDAwMCBu + IAowMDAwMDEzNjEzIDAwMDAwIG4gCjAwMDAwMTY2MzMgMDAwMDAgbiAKMDAwMDAxNjY1 + NCAwMDAwMCBuIAowMDAwMDE3NDk0IDAwMDAwIG4gCjAwMDAwMTc1NTAgMDAwMDAgbiAK + MDAwMDAxODM1OCAwMDAwMCBuIAowMDAwMDE4NDE1IDAwMDAwIG4gCjAwMDAwMjExODEg + MDAwMDAgbiAKMDAwMDAyMTMyMiAwMDAwMCBuIAowMDAwMDIxNTY4IDAwMDAwIG4gCjAw + MDAwMjE0NTAgMDAwMDAgbiAKMDAwMDAyMTU0NiAwMDAwMCBuIAowMDAwMDIxNjY0IDAw + MDAwIG4gCjAwMDAwMjc2NTUgMDAwMDAgbiAKMDAwMDAyNzY3NiAwMDAwMCBuIAowMDAw + MDI3OTAxIDAwMDAwIG4gCjAwMDAwMjgxNzYgMDAwMDAgbiAKMDAwMDAyODIyOCAwMDAw + MCBuIAp0cmFpbGVyCjw8IC9TaXplIDM2IC9Sb290IDI2IDAgUiAvSW5mbyAxIDAgUiAv + SUQgWyA8NjJjM2U5NGRkYzI0MzQ5YjFiNDQ0MjFmMDRiOTg4MzE+Cjw2MmMzZTk0ZGRj + MjQzNDliMWI0NDQyMWYwNGI5ODgzMT4gXSA+PgpzdGFydHhyZWYKMjgzNDUKJSVFT0YK + MSAwIG9iago8PC9BdXRob3IgKEZyYW5rIERlbGxhZXJ0KS9DcmVhdGlvbkRhdGUgKEQ6 + MjAxMDA3MTMwNDA3MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSA1LjIuMikvTW9kRGF0 + ZSAoRDoyMDEwMDcxMzA0MTcwMFopL1Byb2R1Y2VyIDM0IDAgUiA+PgplbmRvYmoKeHJl + ZgoxIDEKMDAwMDAyOTIyMyAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8NjJjM2U5NGRk + YzI0MzQ5YjFiNDQ0MjFmMDRiOTg4MzE+IDw2MmMzZTk0ZGRjMjQzNDliMWI0NDQyMWYw + NGI5ODgzMT5dIC9JbmZvIDEgMCBSIC9QcmV2IDI4MzQ1IC9Sb290IDI2IDAgUiAvU2l6 + ZSAzNj4+CnN0YXJ0eHJlZgoyOTM3MwolJUVPRgo= + + QuickLookThumbnail + + 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 + IAAAAAAAACghAAAhFQAAt2JjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAy + ADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0A + sgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+ + AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoC + AwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1 + AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAE + LQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWW + BaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0H + TwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6 + CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kL + gAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34 + DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ + 1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPl + FAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EX + ZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsU + GzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMf + Ph9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOU + I8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8o + cSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12 + Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz + DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjI + OQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/ + IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWa + Rd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJM + uk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2 + VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb + 5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2Pr + ZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFds + r20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWF + deF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/ + I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjO + iTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOT + TZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3S + nkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSp + N6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSc + tRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA + 7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01 + zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHa + dtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep + 6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD1 + 3vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAAC + ZmYAAPKnAAANWQAAE9AAAArAdmNndAAAAAAAAAABAADhSAAAAAAAAQAAAADhSAAAAAAA + AQAAAADhSAAAAAAAAQAAbmRpbgAAAAAAAAA2AAChQAAAVwAAAEzAAACXAAAAJkAAABwA + AABQAAAAVAAAAoAAAAKAAAACgAAAAAAAAAAAAHNmMzIAAAAAAAEMGgAABcD///L/AAAH + YAAA/c7///uY///9lgAAA/QAAL9ObW1vZAAAAAAAABCsAACgAzA0Rky6bz8AAAAAAAAA + AAAAAAAAAAAAAA== + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + FitInWindow + + Frame + {{470, 267}, {700, 891}} + ListView + + OutlineWidth + 142 + RightSidebar + + Sidebar + + SidebarWidth + 138 + VisibleRegion + {{1, 1}, {558, 782}} + Zoom + 1 + ZoomValues + + + Canvas 1 + 0.0 + 1 + + + + saveQuickLookFiles + YES + + diff --git a/doc/images/gtsam-structure.pdf b/doc/images/gtsam-structure.pdf new file mode 100644 index 0000000000000000000000000000000000000000..37c2ed3c126960bfdc9dfdb60a37dee28a2e289c GIT binary patch literal 29463 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 z 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 Fe*mor1#kcW literal 0 HcmV?d00001 diff --git a/doc/images/n-steps.png b/doc/images/n-steps.png new file mode 100644 index 0000000000000000000000000000000000000000..988fe5dfce89e48f42763c1d4398d6816f5b8f4c GIT binary patch literal 1427 zcmV;E1#J3>P)600002VoOIv0063u zBQgL0010qNS#tmY07w7;07w8v$!k6U000Sga6xAP00B<`008j-Kn&ja000DfNklGb&ajO3TYOW;f4gIfD`WHK(-pC4E88vHVT^(0NY57{MqL^#b6sK!sC7iC2 z_1dVp?hgF_sKIIJrT$~$^xR9yN6+xAFY&B1oF3uS;FNK?M%K%#m9C<#`FWUT2>n^O z-&2Ir6Zcy}RKqka;SQumbQ?odaEw+!)bl-()zsI=t$)piu0YB&RiB{|M}AseQX)5K zPPRErT?JfmrF7I(m$V&vPV<_&d!a1U!w{{9>Vf@9(uq5arkS5AN6XQ^yBP72JwT=C z<$}r%wY@Fm?b1F^MLI~y(L70i|HRUfrNscXaTas7%SR@*R8x>nZ4G|2t+AzPO&DFmS{<;=`pxG)y6?RY7FnAco07br2YYG4zVK23(}H2Da7s9pI8AXH z_nsI*Y8P2FKpRn>Y^E7T3l>5R(8fHiS&VaxDxQorMu{gCP7O#Co|G6hF`M%Oqlqcc zu&mV`GyWr7EZv~TRu|YM_|(0j0eac6=RRzZ5UocFM9UEeVnLVH@h%1YH2i56A^mq3}xs)=Y>t9#E1!f2vj6bhrM*4>pr)uC!ptK72^@Y0fVtrbL{ z+LgenzFz$Ko~6HJ5Z$%(86ng>vg?bd5~8;`)89eV?XqSad^gZEa<4bO0bpZDD6+AZKN6WpZJ3Wn>^?c_2qnOdv;SZ*z2W zV{&P5bRZ~XWp-&}Wj%0iZE|6EDGCQC&hP*L05o((Safh?W;#e|Qe|^OZ*^{DX>Mmi zZ+HMRGc_(SH!*lJG%zkXIWa3VG&e3eHaIIXGBPeWIXJyna+Cl702FjZSafh?W;#}7 ha&u{KZU9h3MlCTeGYW{kWoZBa002ovPDHLkV1mwvi){b^ literal 0 HcmV?d00001 diff --git a/doc/macros.lyx b/doc/macros.lyx new file mode 100644 index 000000000..1e57e1675 --- /dev/null +++ b/doc/macros.lyx @@ -0,0 +1,294 @@ +#LyX 1.6.5 created this file. For more info see http://www.lyx.org/ +\lyxformat 345 +\begin_document +\begin_header +\textclass article +\use_default_options true +\language english +\inputencoding auto +\font_roman default +\font_sans default +\font_typewriter default +\font_default_family default +\font_sc false +\font_osf false +\font_sf_scale 100 +\font_tt_scale 100 + +\graphics default +\paperfontsize default +\use_hyperref false +\papersize default +\use_geometry false +\use_amsmath 1 +\use_esint 1 +\cite_engine basic +\use_bibtopic false +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\defskip medskip +\quotes_language english +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\author "" +\author "" +\end_header + +\begin_body + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Derivatives +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\deriv}[2]{\frac{\partial#1}{\partial#2}} +{\frac{\partial#1}{\partial#2}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\at}[2]{#1\biggr\rvert_{#2}} +{#1\biggr\rvert_{#2}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Jac}[3]{ \at{\deriv{#1}{#2}} {#3} } +{\at{\deriv{#1}{#2}}{#3}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Lie Groups +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\xhat}{\hat{x}} +{\hat{x}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\yhat}{\hat{y}} +{\hat{y}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Ad}[1]{Ad_{#1}} +{Ad_{#1}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\define}{\stackrel{\Delta}{=}} +{\stackrel{\Delta}{=}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\gg}{\mathfrak{g}} +{\mathfrak{g}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Rn}{\mathbb{R}^{n}} +{\mathbb{R}^{n}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SO(2) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\Rtwo}{\mathfrak{\mathbb{R}^{2}}} +{\mathfrak{\mathbb{R}^{2}}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SOtwo}{SO(2)} +{SO(2)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sotwo}{\mathfrak{so(2)}} +{\mathfrak{so(2)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\that}{\hat{\theta}} +{\hat{\theta}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\skew}[1]{[#1]_{+}} +{[#1]_{+}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SE(2) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\SEtwo}{SE(2)} +{SE(2)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\setwo}{\mathfrak{se(2)}} +{\mathfrak{se(2)}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SO(3) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\Rthree}{\mathfrak{\mathbb{R}^{3}}} +{\mathfrak{\mathbb{R}^{3}}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SOthree}{SO(3)} +{SO(3)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sothree}{\mathfrak{so(3)}} +{\mathfrak{so(3)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\what}{\hat{\omega}} +{\hat{\omega}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Skew}[1]{[#1]_{\times}} +{[#1]_{\times}} +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SE(3) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\Rsix}{\mathfrak{\mathbb{R}^{6}}} +{\mathfrak{\mathbb{R}^{6}}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SEthree}{SE(3)} +{SE(3)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sethree}{\mathfrak{se(3)}} +{\mathfrak{se(3)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\xihat}{\hat{\xi}} +{\hat{\xi}} +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/doc/math.lyx b/doc/math.lyx new file mode 100644 index 000000000..878a7b167 --- /dev/null +++ b/doc/math.lyx @@ -0,0 +1,5746 @@ +#LyX 2.0 created this file. For more info see http://www.lyx.org/ +\lyxformat 413 +\begin_document +\begin_header +\textclass article +\use_default_options false +\begin_modules +eqs-within-sections +figs-within-sections +theorems-ams-bytype +\end_modules +\maintain_unincluded_children false +\language english +\language_package default +\inputencoding auto +\fontencoding global +\font_roman times +\font_sans default +\font_typewriter default +\font_default_family rmdefault +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 +\font_tt_scale 100 + +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize 12 +\spacing single +\use_hyperref false +\papersize default +\use_geometry true +\use_amsmath 1 +\use_esint 0 +\use_mhchem 1 +\use_mathdots 1 +\cite_engine basic +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\use_refstyle 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\leftmargin 1in +\topmargin 1in +\rightmargin 1in +\bottommargin 1in +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\quotes_language english +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Title +Derivatives and Differentials +\end_layout + +\begin_layout Author +Frank Dellaert +\end_layout + +\begin_layout Standard +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +use_makebox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +status collapsed + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\SqrMah}[3]{\Vert{#1}-{#2}\Vert_{#3}^{2}} +{\Vert{#1}-{#2}\Vert_{#3}^{2}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\SqrZMah}[2]{\Vert{#1}\Vert_{#2}^{2}} +{\Vert{#1}\Vert_{#2}^{2}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\Rone}{\mathbb{R}} +{\mathbb{R}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\Reals}[1]{\mathbb{R}^{#1}} +{\mathbb{R}^{#1}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\OneD}[1]{\Reals{#1}\rightarrow\Rone} +{\Reals{#1}\rightarrow\Rone} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\Multi}[2]{\Reals{#1}\rightarrow\Reals{#2}} +{\Reals{#1}\rightarrow\Reals{#2}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\Man}{\mathcal{M}} +{\mathcal{M}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Derivatives +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\deriv}[2]{\frac{\partial#1}{\partial#2}} +{\frac{\partial#1}{\partial#2}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\at}[2]{#1\biggr\rvert_{#2}} +{#1\biggr\rvert_{#2}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Jac}[3]{ \at{\deriv{#1}{#2}} {#3} } +{\at{\deriv{#1}{#2}}{#3}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Lie Groups +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\xhat}{\hat{x}} +{\hat{x}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\yhat}{\hat{y}} +{\hat{y}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Ad}[1]{Ad_{#1}} +{Ad_{#1}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\define}{\stackrel{\Delta}{=}} +{\stackrel{\Delta}{=}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\gg}{\mathfrak{g}} +{\mathfrak{g}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Rn}{\mathbb{R}^{n}} +{\mathbb{R}^{n}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SO(2) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\Rtwo}{\mathbb{R}^{2}} +{\mathbb{R}^{2}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SOtwo}{SO(2)} +{SO(2)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sotwo}{\mathfrak{so(2)}} +{\mathfrak{so(2)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\that}{\hat{\theta}} +{\hat{\theta}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\skew}[1]{[#1]_{+}} +{[#1]_{+}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SE(2) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\SEtwo}{SE(2)} +{SE(2)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\setwo}{\mathfrak{se(2)}} +{\mathfrak{se(2)}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SO(3) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\Rthree}{\mathbb{R}^{3}} +{\mathbb{R}^{3}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SOthree}{SO(3)} +{SO(3)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sothree}{\mathfrak{so(3)}} +{\mathfrak{so(3)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\what}{\hat{\omega}} +{\hat{\omega}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\Skew}[1]{[#1]_{\times}} +{[#1]_{\times}} +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +SE(3) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset FormulaMacro +\newcommand{\Rsix}{\mathbb{R}^{6}} +{\mathbb{R}^{6}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\SEthree}{SE(3)} +{SE(3)} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\sethree}{\mathfrak{se(3)}} +{\mathfrak{se(3)}} +\end_inset + + +\begin_inset FormulaMacro +\newcommand{\xihat}{\hat{\xi}} +{\hat{\xi}} +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Part +Theory +\end_layout + +\begin_layout Section +Optimization +\end_layout + +\begin_layout Standard +We will be concerned with minimizing a non-linear least squares objective + of the form +\begin_inset Formula +\begin{equation} +x^{*}=\arg\min_{x}\SqrMah{h(x)}z{\Sigma}\label{eq:objective} +\end{equation} + +\end_inset + +where +\begin_inset Formula $x\in\Man$ +\end_inset + + is a point on an +\begin_inset Formula $n$ +\end_inset + +-dimensional manifold (which could be +\begin_inset Formula $\Reals n$ +\end_inset + +, an n-dimensional Lie group +\begin_inset Formula $G$ +\end_inset + +, or a general manifold +\begin_inset Formula $\Man)$ +\end_inset + +, +\begin_inset Formula $z\in\Reals m$ +\end_inset + + is an observed measurement, +\begin_inset Formula $h:\Man\rightarrow\Reals m$ +\end_inset + + is a measurement function that predicts +\begin_inset Formula $z$ +\end_inset + + from +\begin_inset Formula $x$ +\end_inset + +, and +\begin_inset Formula $\SqrZMah e{\Sigma}\define e^{T}\Sigma^{-1}e$ +\end_inset + + is the squared Mahalanobis distance with covariance +\begin_inset Formula $\Sigma$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +To minimize +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:objective" + +\end_inset + + we need a notion of how the non-linear measurement function +\begin_inset Formula $h(x)$ +\end_inset + + behaves in the neighborhood of a linearization point +\begin_inset Formula $a$ +\end_inset + +. + Loosely speaking, we would like to define an +\begin_inset Formula $m\times n$ +\end_inset + + Jacobian matrix +\begin_inset Formula $H_{a}$ +\end_inset + + such that +\begin_inset Formula +\begin{equation} +h(a\oplus\xi)\approx h(a)+H_{a}\xi\label{eq:LocalBehavior} +\end{equation} + +\end_inset + +with +\begin_inset Formula $\xi\in\Reals n$ +\end_inset + +, and the operation +\begin_inset Formula $\oplus$ +\end_inset + + +\begin_inset Quotes eld +\end_inset + +increments +\begin_inset Quotes erd +\end_inset + + +\begin_inset Formula $a\in\Man$ +\end_inset + +. + Below we more formally develop this notion, first for functions from +\begin_inset Formula $\Multi nm$ +\end_inset + +, then for Lie groups, and finally for manifolds. +\end_layout + +\begin_layout Standard +Once equipped with the approximation +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:LocalBehavior" + +\end_inset + +, we can minimize the objective function +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:objective" + +\end_inset + + with respect to +\begin_inset Formula $\delta x$ +\end_inset + + instead: +\begin_inset Formula +\begin{equation} +\xi^{*}=\arg\min_{\xi}\SqrMah{h(a)+H_{a}\xi}z{\Sigma}\label{eq:ApproximateObjective} +\end{equation} + +\end_inset + +This can be done by setting the derivative of +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:ApproximateObjective" + +\end_inset + + to zero, +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout + +\begin_inset Formula +\[ +\frac{1}{2}H_{a}^{T}(h(a)+H_{a}\xi-z)=0 +\] + +\end_inset + + +\end_layout + +\end_inset + + yielding the +\series bold +normal equations +\series default +, +\begin_inset Formula +\[ +H_{a}^{T}H_{a}\xi=H_{a}^{T}\left(z-h(a)\right) +\] + +\end_inset + +which can be solved using Cholesky factorization. + Of course, we might have to iterate this multiple times, and use a trust-region + method to bound +\begin_inset Formula $\xi$ +\end_inset + + when the approximation +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:LocalBehavior" + +\end_inset + + is not good. +\end_layout + +\begin_layout Section +Multivariate Differentiation +\end_layout + +\begin_layout Subsection +Derivatives +\end_layout + +\begin_layout Standard +For a vector space +\begin_inset Formula $\Reals n$ +\end_inset + +, the notion of an increment is just done by vector addition +\begin_inset Formula +\[ +a\oplus\xi\define a+\xi +\] + +\end_inset + +and for the approximation +\begin_inset CommandInset ref +LatexCommand ref +reference "eq:LocalBehavior" + +\end_inset + + we will use a Taylor expansion using multivariate differentiation. + However, loosely following +\begin_inset CommandInset citation +LatexCommand cite +key "Spivak65book" + +\end_inset + +, we use a perhaps unfamiliar way to define derivatives: +\end_layout + +\begin_layout Definition +\begin_inset CommandInset label +LatexCommand label +name "def:differentiable" + +\end_inset + +We define a function +\begin_inset Formula $f:\Multi nm$ +\end_inset + + to be +\series bold +differentiable +\series default + at +\begin_inset Formula $a$ +\end_inset + + if there exists a matrix +\begin_inset Formula $f'(a)\in\Reals{m\times n}$ +\end_inset + + such that +\begin_inset Formula +\[ +\lim_{\delta x\rightarrow0}\frac{\left|f(a)+f'(a)\xi-f(a+\xi)\right|}{\left|\xi\right|}=0 +\] + +\end_inset + +where +\begin_inset Formula $\left|e\right|\define\sqrt{e^{T}e}$ +\end_inset + + is the usual norm. + If +\begin_inset Formula $f$ +\end_inset + + is differentiable, then the matrix +\begin_inset Formula $f'(a)$ +\end_inset + + is called the +\series bold +Jacobian matrix +\series default + of +\begin_inset Formula $f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +, and the linear map +\begin_inset Formula $Df_{a}:\xi\mapsto f'(a)\xi$ +\end_inset + + is called the +\series bold +derivative +\series default + of +\begin_inset Formula $f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +. + When no confusion is likely, we use the notation +\begin_inset Formula $F_{a}\define f'(a)$ +\end_inset + + to stress that +\begin_inset Formula $f'(a)$ +\end_inset + + is a matrix. +\end_layout + +\begin_layout Standard +The benefit of using this definition is that it generalizes the notion of + a scalar derivative +\begin_inset Formula $f'(a):\Rone\rightarrow\Rone$ +\end_inset + + to multivariate functions from +\begin_inset Formula $\Multi nm$ +\end_inset + +. + In particular, the derivative +\begin_inset Formula $Df_{a}$ +\end_inset + + maps vector increments +\begin_inset Formula $\xi$ +\end_inset + + on +\begin_inset Formula $a$ +\end_inset + + to increments +\begin_inset Formula $f'(a)\xi$ +\end_inset + + on +\begin_inset Formula $f(a)$ +\end_inset + +, such that this linear map locally approximates +\begin_inset Formula $f$ +\end_inset + +: +\begin_inset Formula +\[ +f(a+\xi)\approx f(a)+f'(a)\xi +\] + +\end_inset + + +\end_layout + +\begin_layout Example +\begin_inset CommandInset label +LatexCommand label +name "ex:projection" + +\end_inset + +The function +\begin_inset Formula $\pi:(x,y,z)\mapsto(x/z,y/z)$ +\end_inset + + projects a 3D point +\begin_inset Formula $(x,y,z)$ +\end_inset + + to the image plane, and has the Jacobian matrix +\begin_inset Formula +\[ +\pi'(x,y,z)=\frac{1}{z}\left[\begin{array}{ccc} +1 & 0 & -x/z\\ +0 & 1 & -y/z +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Properties of Derivatives +\end_layout + +\begin_layout Standard +This notion of a multivariate derivative obeys the usual rules: +\end_layout + +\begin_layout Theorem +(Chain rule) If +\begin_inset Formula $f:\Multi np$ +\end_inset + + is differentiable at +\begin_inset Formula $a$ +\end_inset + + and +\begin_inset Formula $g:\Multi pm$ +\end_inset + + is differentiable at +\begin_inset Formula $f(a)$ +\end_inset + +, +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none + then +\begin_inset Formula $D(g\circ f)_{a}=Dg_{f(a)}\circ Df_{a}$ +\end_inset + + and +\end_layout + +\end_inset + + then the Jacobian matrix +\begin_inset Formula $H_{a}$ +\end_inset + + of +\begin_inset Formula $h=g\circ f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + + is the +\begin_inset Formula $m\times n$ +\end_inset + + matrix product +\begin_inset Formula +\[ +H_{a}=G_{f(a)}F_{a} +\] + +\end_inset + + +\end_layout + +\begin_layout Proof +See +\begin_inset CommandInset citation +LatexCommand cite +key "Spivak65book" + +\end_inset + + +\end_layout + +\begin_layout Example +\begin_inset CommandInset label +LatexCommand label +name "ex:chain-rule" + +\end_inset + +If we follow the projection +\begin_inset Formula $\pi$ +\end_inset + + by a calibration step +\begin_inset Formula $\gamma:(x,y)\mapsto(u_{0}+fx,u_{0}+fy)$ +\end_inset + +, with +\begin_inset Formula +\[ +\gamma'(x,y)=\left[\begin{array}{cc} +f & 0\\ +0 & f +\end{array}\right] +\] + +\end_inset + +then the combined function +\begin_inset Formula $\gamma\circ\pi$ +\end_inset + + has the Jacobian matrix +\begin_inset Formula +\[ +(\gamma\circ\pi)'(x,y)=\frac{f}{z}\left[\begin{array}{ccc} +1 & 0 & -x/z\\ +0 & 1 & -y/z +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Theorem +(Inverse) If +\begin_inset Formula $f:\Multi nn$ +\end_inset + + is differentiable and has a differentiable inverse +\begin_inset Formula $g\define f^{-1}$ +\end_inset + +, then its Jacobian matrix +\begin_inset Formula $G_{a}$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + + is just the inverse of that of +\begin_inset Formula $f$ +\end_inset + +, evaluated at +\begin_inset Formula $g(a)$ +\end_inset + +: +\begin_inset Formula +\[ +G_{a}=\left[F_{g(a)}\right]^{-1} +\] + +\end_inset + + +\end_layout + +\begin_layout Proof +See +\begin_inset CommandInset citation +LatexCommand cite +key "Spivak65book" + +\end_inset + + +\end_layout + +\begin_layout Example +\begin_inset CommandInset label +LatexCommand label +name "ex:inverse" + +\end_inset + +The function +\begin_inset Formula $f:(x,y)\mapsto(x^{2},xy)$ +\end_inset + + has the Jacobian matrix +\end_layout + +\begin_layout Example +\begin_inset Formula +\[ +F_{(x,y)}=\left[\begin{array}{cc} +2x & 0\\ +y & x +\end{array}\right] +\] + +\end_inset + +and, for +\begin_inset Formula $x\geq0$ +\end_inset + +, its inverse is the function +\begin_inset Formula $g:(x,y)\mapsto(x^{1/2},x^{-1/2}y)$ +\end_inset + + with the Jacobian matrix +\begin_inset Formula +\[ +G_{(x,y)}=\frac{1}{2}\left[\begin{array}{cc} +x^{-1/2} & 0\\ +-x^{-3/2}y & 2x^{-1/2} +\end{array}\right] +\] + +\end_inset + +It is easily verified that +\begin_inset Formula +\[ +g'(a,b)f'(a^{1/2},a^{-1/2}b)=\frac{1}{2}\left[\begin{array}{cc} +a^{-1/2} & 0\\ +-a^{-3/2}b & 2a^{-1/2} +\end{array}\right]\left[\begin{array}{cc} +2a^{1/2} & 0\\ +a^{-1/2}b & a^{1/2} +\end{array}\right]=\left[\begin{array}{cc} +1 & 0\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Problem +Verify the above for +\begin_inset Formula $(a,b)=(4,6)$ +\end_inset + +. + Sketch the situation graphically to get insight. +\end_layout + +\begin_layout Subsection +Computing Multivariate Derivatives +\end_layout + +\begin_layout Standard +Computing derivatives is made easy by defining the concept of a partial + derivative: +\end_layout + +\begin_layout Definition +For +\begin_inset Formula $f:\OneD n$ +\end_inset + +, the +\series bold +partial derivative +\series default + of +\begin_inset Formula $f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +, +\series bold + +\series default + +\begin_inset Formula +\[ +D_{j}f(a)\define\lim_{h\rightarrow0}\frac{f\left(a^{1},\ldots,a^{j}+h,\ldots,a^{n}\right)-f\left(a^{1},\ldots,a^{n}\right)}{h} +\] + +\end_inset + +which is the ordinary derivative of the scalar function +\begin_inset Formula $g(x)\define f\left(a^{1},\ldots,x,\ldots,a^{n}\right)$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +Using this definition, one can show that the Jacobian matrix +\begin_inset Formula $F_{a}$ +\end_inset + + of a differentiable +\emph on +multivariate +\emph default + function +\begin_inset Formula $f:\Multi nm$ +\end_inset + + consists simply of the +\begin_inset Formula $m\times n$ +\end_inset + + partial derivatives +\begin_inset Formula $D_{j}f^{i}(a)$ +\end_inset + +, evaluated at +\begin_inset Formula $a\in\Reals n$ +\end_inset + +: +\begin_inset Formula +\[ +F_{a}=\left[\begin{array}{ccc} +D_{1}f^{1}(a) & \cdots & D_{n}f^{1}(a)\\ +\vdots & \ddots & \vdots\\ +D_{1}f^{m}(a) & \ldots & D_{n}f^{m}(a) +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Problem +Verify the derivatives in Examples +\begin_inset CommandInset ref +LatexCommand ref +reference "ex:projection" + +\end_inset + + to +\begin_inset CommandInset ref +LatexCommand ref +reference "ex:inverse" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +Multivariate Functions on Lie Groups +\end_layout + +\begin_layout Subsection +Lie Groups +\end_layout + +\begin_layout Standard +Lie groups are not as easy to treat as the vector space +\begin_inset Formula $\Reals n$ +\end_inset + + but nevertheless have a lot of structure. + To generalize the concept of the total derivative above we just need to + replace +\begin_inset Formula $a\oplus\xi$ +\end_inset + + in +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:ApproximateObjective" + +\end_inset + + with a suitable operation in the Lie group +\begin_inset Formula $G$ +\end_inset + +. + In particular, the notion of an exponential map allows us to define an + incremental transformation as tracing out a geodesic curve on the group + manifold along a certain +\series bold +tangent vector +\series default + +\begin_inset Formula $\xi$ +\end_inset + +, +\begin_inset Formula +\[ +a\oplus\xi\define a\exp\left(\hat{\xi}\right) +\] + +\end_inset + +with +\begin_inset Formula $\xi\in\Reals n$ +\end_inset + + for an +\begin_inset Formula $n$ +\end_inset + +-dimensional Lie group, +\begin_inset Formula $\hat{\xi}\in\mathfrak{g}$ +\end_inset + + the Lie algebra element corresponding to the vector +\begin_inset Formula $\xi$ +\end_inset + +, and +\begin_inset Formula $\exp\hat{\xi}$ +\end_inset + + the exponential map. + Note that if +\begin_inset Formula $G$ +\end_inset + + is equal to +\begin_inset Formula $\Reals n$ +\end_inset + + then composing with the exponential map +\begin_inset Formula $ae^{\xihat}$ +\end_inset + + is just vector addition +\begin_inset Formula $a+\xi$ +\end_inset + +. +\end_layout + +\begin_layout Example +For the Lie group +\begin_inset Formula $\SOthree$ +\end_inset + + of 3D rotations the vector +\begin_inset Formula $\xi$ +\end_inset + + is denoted as +\begin_inset Formula $\omega$ +\end_inset + + and represents an angular displacement. + The Lie algebra element +\begin_inset Formula $\xihat$ +\end_inset + + is a skew symmetric matrix denoted as +\begin_inset Formula $\Skew{\omega}\in\sothree$ +\end_inset + +, and is given by +\begin_inset Formula +\[ +\Skew{\omega}=\left[\begin{array}{ccc} +0 & -\omega_{z} & \omega_{y}\\ +\omega_{z} & 0 & -\omega_{x}\\ +-\omega_{y} & \omega_{x} & 0 +\end{array}\right] +\] + +\end_inset + +Finally, the increment +\begin_inset Formula $a\oplus\xi=ae^{\xihat}$ +\end_inset + + corresponds to an incremental rotation +\begin_inset Formula $R\oplus\omega=Re^{\Skew{\omega}}$ +\end_inset + +. +\end_layout + +\begin_layout Subsection +Derivatives +\end_layout + +\begin_layout Standard +We can generalize Definition +\begin_inset CommandInset ref +LatexCommand ref +reference "def:differentiable" + +\end_inset + + to map exponential coordinates +\begin_inset Formula $\xi$ +\end_inset + + to increments +\begin_inset Formula $f'(a)\xi$ +\end_inset + + on +\begin_inset Formula $f(a)$ +\end_inset + +, such that the linear map +\begin_inset Formula $Df_{a}$ +\end_inset + + locally approximates a function +\begin_inset Formula $f$ +\end_inset + + from +\begin_inset Formula $G$ +\end_inset + + to +\begin_inset Formula $\Reals m$ +\end_inset + +: +\begin_inset Formula +\[ +f(ae^{\xihat})\approx f(a)+f'(a)\xi +\] + +\end_inset + + +\end_layout + +\begin_layout Definition +We define a function +\begin_inset Formula $f:G\rightarrow\Reals m$ +\end_inset + + to be +\series bold +differentiable +\series default + at +\begin_inset Formula $a\in G$ +\end_inset + + if there exists a matrix +\begin_inset Formula $f'(a)\in\Reals{m\times n}$ +\end_inset + + such that +\begin_inset Formula +\[ +\lim_{\xi\rightarrow0}\frac{\left|f(a)+f'(a)\xi-f(ae^{\hat{\xi}})\right|}{\left|\xi\right|}=0 +\] + +\end_inset + +If +\begin_inset Formula $f$ +\end_inset + + is differentiable, then the matrix +\begin_inset Formula $f'(a)$ +\end_inset + + is called the +\series bold +Jacobian matrix +\series default + of +\begin_inset Formula $f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +, and the linear map +\begin_inset Formula $Df_{a}:\xi\mapsto f'(a)\xi$ +\end_inset + + is called the +\series bold +derivative +\series default + of +\begin_inset Formula $f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Note that the vectors +\begin_inset Formula $\xi$ +\end_inset + + can be viewed as lying in the tangent space to +\begin_inset Formula $G$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +, but defining this rigorously would take us on a longer tour of differential + geometry. + Informally, +\begin_inset Formula $\xi$ +\end_inset + + is simply the direction, in a local coordinate frame, that is locally tangent + at +\begin_inset Formula $a$ +\end_inset + + to a geodesic curve +\begin_inset Formula $\gamma:t\mapsto ae^{\widehat{t\xi}}$ +\end_inset + + traced out by the exponential map, with +\begin_inset Formula $\gamma(0)=a$ +\end_inset + +. +\end_layout + +\begin_layout Subsection +Derivative of an Action +\begin_inset CommandInset label +LatexCommand label +name "sec:Derivatives-of-Actions" + +\end_inset + + +\end_layout + +\begin_layout Standard +The (usual) action of an +\begin_inset Formula $n$ +\end_inset + +-dimensional matrix group +\begin_inset Formula $G$ +\end_inset + + is matrix-vector multiplication on +\begin_inset Formula $\mathbb{R}^{n}$ +\end_inset + +, i.e., +\begin_inset Formula $f:G\times\Reals n\rightarrow\Reals n$ +\end_inset + + with +\begin_inset Formula +\[ +f(T,p)=Tp +\] + +\end_inset + +Since this is a function defined on the product +\begin_inset Formula $G\times\Reals n$ +\end_inset + + the derivative is a linear transformation +\begin_inset Formula $Df:\Multi{2n}n$ +\end_inset + + with +\begin_inset Formula +\[ +Df_{(T,p)}\left(\xi,\delta p\right)=D_{1}f_{(T,p)}\left(\xi\right)+D_{2}f_{(T,p)}\left(\delta p\right) +\] + +\end_inset + + +\end_layout + +\begin_layout Theorem +\begin_inset CommandInset label +LatexCommand label +name "th:Action" + +\end_inset + +The Jacobian matrix of the group action +\begin_inset Formula $f(T,P)=Tp$ +\end_inset + + at +\begin_inset Formula $(T,p)$ +\end_inset + + is given by +\begin_inset Formula +\[ +F_{(T,p)}=\left[\begin{array}{cc} +TH(p) & T\end{array}\right]=T\left[\begin{array}{cc} +H(p) & I_{n}\end{array}\right] +\] + +\end_inset + +with +\begin_inset Formula $H:\Reals n\rightarrow\Reals{n\times n}$ +\end_inset + + a linear mapping that depends on +\begin_inset Formula $p$ +\end_inset + +, and +\begin_inset Formula $I_{n}$ +\end_inset + + the +\begin_inset Formula $n\times n$ +\end_inset + + identity matrix. +\end_layout + +\begin_layout Proof +First, the derivative +\begin_inset Formula $D_{2}f$ +\end_inset + + with respect to in +\begin_inset Formula $p$ +\end_inset + + is easy, as its matrix is simply T: +\begin_inset Formula +\[ +f(T,p+\delta p)=T(p+\delta p)=Tp+T\delta p=f(T,p)+D_{2}f(\delta p) +\] + +\end_inset + +For the derivative +\begin_inset Formula $D_{1}f$ +\end_inset + + with respect to a change in the first argument +\begin_inset Formula $T$ +\end_inset + +, we want +\end_layout + +\begin_layout Proof + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +\begin_inset Formula +\[ +f(Te^{\hat{\xi}},p)=Te^{\hat{\xi}}p\approx Tp+D_{1}f(\xi) +\] + +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\strikeout default +\uuline default +\uwave default +\noun default +\color inherit +Since the matrix exponential is given by the series +\begin_inset Formula $e^{A}=I+A+\frac{A^{2}}{2!}+\frac{A^{3}}{3!}+\ldots$ +\end_inset + + we have, to first order +\begin_inset Formula +\[ +Te^{\hat{\xi}}p\approx T(I+\hat{\xi})p=Tp+T\hat{\xi}p +\] + +\end_inset + + +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Note also that +\begin_inset Formula +\[ +T\hat{\xi}p=\left(T\hat{\xi}T^{-1}\right)Tp=\left(\Ad T\xihat\right)\left(Tp\right) +\] + +\end_inset + + +\end_layout + +\end_inset + +Hence, we need to show that +\begin_inset Formula +\begin{equation} +\xihat p=H(p)\xi\label{eq:Hp} +\end{equation} + +\end_inset + +with +\begin_inset Formula $H(p)$ +\end_inset + + an +\begin_inset Formula $n\times n$ +\end_inset + + matrix that depends on +\begin_inset Formula $p$ +\end_inset + +. + Expressing the map +\begin_inset Formula $\xi\rightarrow\hat{\xi}$ +\end_inset + + in terms of the Lie algebra generators +\begin_inset Formula $G^{i}$ +\end_inset + +, using tensors and Einstein summation, we have +\begin_inset Formula $\hat{\xi}_{j}^{i}=G_{jk}^{i}\xi^{k}$ +\end_inset + + allowing us to calculate +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none + +\begin_inset Formula $\hat{\xi}p$ +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit + as +\begin_inset Formula +\[ +\left(\hat{\xi}p\right)^{i}=\hat{\xi}_{j}^{i}p^{j}=G_{jk}^{i}\xi^{k}p^{j}=\left(G_{jk}^{i}p^{j}\right)\xi^{k}=H_{k}^{i}(p)\xi^{k} +\] + +\end_inset + + +\end_layout + +\begin_layout Example +For 3D rotations +\begin_inset Formula $R\in\SOthree$ +\end_inset + +, we have +\begin_inset Formula $\hat{\omega}=\Skew{\omega}$ +\end_inset + + and +\begin_inset Formula +\[ +G_{k=1}:\left(\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & -1\\ +0 & 1 & 0 +\end{array}\right)\mbox{}G_{k=2}:\left(\begin{array}{ccc} +0 & 0 & 1\\ +0 & 0 & 0\\ +-1 & 0 & 0 +\end{array}\right)\mbox{ }G_{k=3}:\left(\begin{array}{ccc} +0 & -1 & 0\\ +1 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right) +\] + +\end_inset + + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +The matrices +\begin_inset Formula $\left(G_{k}^{i}\right)_{j}$ +\end_inset + + are obtained by assembling the +\begin_inset Formula $j^{th}$ +\end_inset + + columns of the generators above, yielding +\begin_inset Formula $H(p)$ +\end_inset + + equal to: +\begin_inset Formula +\[ +\left(\begin{array}{ccc} +0 & 0 & 0\\ +0 & 0 & 1\\ +0 & -1 & 0 +\end{array}\right)p^{1}+\left(\begin{array}{ccc} +0 & 0 & -1\\ +0 & 0 & 0\\ +1 & 0 & 0 +\end{array}\right)p^{2}+\left(\begin{array}{ccc} +0 & 1 & 0\\ +-1 & 0 & 0\\ +0 & 0 & 0 +\end{array}\right)p^{3}=\left(\begin{array}{ccc} +0 & p^{3} & -p^{2}\\ +-p^{3} & 0 & p^{1}\\ +p^{2} & -p^{1} & 0 +\end{array}\right)=\Skew{-p} +\] + +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +\color inherit +Hence, the Jacobian matrix of +\begin_inset Formula $f(R,p)=Rp$ +\end_inset + + is given by +\begin_inset Formula +\[ +F_{(R,p)}=R\left(\begin{array}{cc} +\Skew{-p} & I_{3}\end{array}\right) +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Derivative of an Inverse Action +\end_layout + +\begin_layout Standard +Applying the action by the inverse of +\begin_inset Formula $T\in G$ +\end_inset + + yields a function +\begin_inset Formula $g:G\times\Reals n\rightarrow\Reals n$ +\end_inset + + defined by +\begin_inset Formula +\[ +g(T,p)=T^{-1}p +\] + +\end_inset + + +\end_layout + +\begin_layout Theorem +\begin_inset CommandInset label +LatexCommand label +name "Th:InverseAction" + +\end_inset + +The Jacobian matrix of the inverse group action +\begin_inset Formula $g(T,p)=T^{-1}p$ +\end_inset + + is given by +\begin_inset Formula +\[ +G_{(T,p)}=\left[\begin{array}{cc} +-H(T^{-1}p) & T^{-1}\end{array}\right] +\] + +\end_inset + +where +\begin_inset Formula $H:\Reals n\rightarrow\Reals{n\times n}$ +\end_inset + + is the same mapping as before. +\end_layout + +\begin_layout Proof +Again, the derivative +\begin_inset Formula $D_{2}g$ +\end_inset + + with respect to in +\begin_inset Formula $p$ +\end_inset + + is easy, the matrix of which is simply +\begin_inset Formula $T^{-1}$ +\end_inset + +: +\begin_inset Formula +\[ +g(T,p+\delta p)=T^{-1}(p+\delta p)=T^{-1}p+T^{-1}\delta p=g(T,p)+D_{2}g(\delta p) +\] + +\end_inset + +Conversely, a change in +\begin_inset Formula $T$ +\end_inset + + yields +\begin_inset Formula +\[ +g(Te^{\xihat},p)=\left(Te^{\xihat}\right)^{-1}p=e^{-\xihat}T^{-1}p +\] + +\end_inset + +Similar to before, if we expand the matrix exponential we get +\begin_inset Formula +\[ +e^{-A}=I-A+\frac{A^{2}}{2!}-\frac{A^{3}}{3!}+\ldots +\] + +\end_inset + +so +\begin_inset Formula +\[ +e^{-\xihat}T^{-1}p\approx(I-\xihat)T^{-1}p=g(T,p)-\xihat\left(T^{-1}p\right) +\] + +\end_inset + + +\end_layout + +\begin_layout Example +For 3D rotations +\begin_inset Formula $R\in\SOthree$ +\end_inset + + we have +\begin_inset Formula $R^{-1}=R^{T}$ +\end_inset + +, +\begin_inset Formula $H(p)=-\Skew p$ +\end_inset + +, and hence the Jacobian matrix of +\begin_inset Formula $g(R,p)=R^{T}p$ +\end_inset + + is given by +\begin_inset Formula +\[ +G_{(R,p)}=\left(\begin{array}{cc} +\Skew{R^{T}p} & R^{T}\end{array}\right) +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +My earlier attempt: because the wedge operator is linear, we have +\end_layout + +\begin_layout Plain Layout +\begin_inset Formula +\begin{eqnarray*} +f(\xi+x) & = & \exp\widehat{\left(\xi+x\right)}\\ + & = & \exp\left(\xihat+\hat{x}\right) +\end{eqnarray*} + +\end_inset + +However, except for commutative Lie groups, it is not true that +\begin_inset Formula $\exp\left(\xihat+\hat{x}\right)=\exp\xihat\exp\hat{x}$ +\end_inset + +. + However, if we expand the matrix exponential to second order and assume + +\begin_inset Formula $x\rightarrow0$ +\end_inset + + we do have +\begin_inset Formula +\[ +\exp\left(\xihat+\hat{x}\right)\approx I+\xihat+\hat{x}+\frac{1}{2}\xihat^{2}+\xhat\xihat +\] + +\end_inset + +Now, if we ask what +\begin_inset Formula $\hat{y}$ +\end_inset + + would effect the same change: +\begin_inset Formula +\begin{eqnarray*} +\exp\xihat\exp\yhat & = & I+\xihat+\hat{x}+\frac{1}{2}\xihat^{2}+\xhat\xihat\\ +\exp\xihat(I+\yhat) & = & I+\xihat+\hat{x}+\frac{1}{2}\xihat^{2}+\xhat\xihat\\ +\left(\exp\xihat\right)\yhat & = & \xhat+\xhat\xihat +\end{eqnarray*} + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Instantaneous Velocity +\end_layout + +\begin_layout Standard +For matrix Lie groups, if we have a matrix +\begin_inset Formula $T_{b}^{n}(t)$ +\end_inset + + that depends on a parameter +\begin_inset Formula $t$ +\end_inset + +, i.e., +\begin_inset Formula $T_{b}^{n}(t)$ +\end_inset + + follows a curve on the manifold, then it would be of interest to find the + velocity of a point +\begin_inset Formula $q^{n}(t)=T_{b}^{n}(t)p^{b}$ +\end_inset + + acted upon by +\begin_inset Formula $T_{b}^{n}(t)$ +\end_inset + +. + We can express the velocity of +\begin_inset Formula $q(t)$ +\end_inset + + in both the n-frame and b-frame: +\begin_inset Formula +\[ +\dot{q}^{n}=\dot{T}_{b}^{n}p^{b}=\dot{T}_{b}^{n}\left(T_{b}^{n}\right)^{-1}p^{n}\mbox{\,\,\,\,\ and\,\,\,\,}\dot{q}^{b}=\left(T_{b}^{n}\right)^{-1}\dot{q}^{n}=\left(T_{b}^{n}\right)^{-1}\dot{T}_{b}^{n}p^{b} +\] + +\end_inset + +Both the matrices +\begin_inset Formula $\xihat_{nb}^{n}\define\dot{T}_{b}^{n}\left(T_{b}^{n}\right)^{-1}$ +\end_inset + + and +\begin_inset Formula $\xihat_{nb}^{b}\define\left(T_{b}^{n}\right)^{-1}\dot{T}_{b}^{n}$ +\end_inset + + are skew-symmetric Lie algebra elements that describe the +\series bold +instantaneous velocity +\series default + +\begin_inset CommandInset citation +LatexCommand cite +after "page 51 for rotations, page 419 for SE(3)" +key "Murray94book" + +\end_inset + +. + We will revisit this for both rotations and rigid 3D transformations. +\end_layout + +\begin_layout Section +Differentials: Smooth Mapping between Lie Groups +\end_layout + +\begin_layout Subsection +Motivation and Definition +\end_layout + +\begin_layout Standard +The above shows how to compute the derivative of a function +\begin_inset Formula $f:G\rightarrow\Reals m$ +\end_inset + +. + However, what if the argument to +\begin_inset Formula $f$ +\end_inset + + is itself the result of a mapping between Lie groups? In other words, +\begin_inset Formula $f=g\circ\varphi$ +\end_inset + +, with +\begin_inset Formula $g:G\rightarrow\Reals m$ +\end_inset + + and where +\begin_inset Formula $\varphi:H\rightarrow G$ +\end_inset + + is a smooth mapping from the +\begin_inset Formula $n$ +\end_inset + +-dimensional Lie group +\begin_inset Formula $H$ +\end_inset + + to the +\begin_inset Formula $p$ +\end_inset + +-dimensional Lie group +\begin_inset Formula $G$ +\end_inset + +. + In this case, one would expect that we can arrive at +\begin_inset Formula $Df_{a}$ +\end_inset + + by composing linear maps, as follows: +\begin_inset Formula +\[ +f'(a)=(g\circ\varphi)'(a)=G_{\varphi(a)}\varphi'(a) +\] + +\end_inset + +where +\begin_inset Formula $\varphi'(a)$ +\end_inset + + is an +\begin_inset Formula $n\times p$ +\end_inset + + matrix that is the best linear approximation to the map +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none + +\begin_inset Formula $\varphi:H\rightarrow G$ +\end_inset + +. + The corresponding linear map +\begin_inset Formula $D\varphi_{a}$ +\end_inset + + is called the +\family default +\series bold +\shape default +\size default +\emph default +\bar default +\strikeout default +\uuline default +\uwave default +\noun default +\color inherit +differential +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\strikeout default +\uuline default +\uwave default +\noun default +\color inherit +or +\series bold +pushforward +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none + of +\begin_inset Formula $ $ +\end_inset + +the mapping +\begin_inset Formula $\varphi$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +. + +\end_layout + +\begin_layout Standard + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none +Because a rigorous definition will lead us too far astray, here we only + informally define the pushforward of +\begin_inset Formula $\varphi$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + + as the linear map +\begin_inset Formula $D\varphi_{a}:\Multi np$ +\end_inset + + such that +\begin_inset Formula $D\varphi_{a}\left(\xi\right)\define\varphi'(a)\xi$ +\end_inset + + and +\family default +\series default +\shape default +\size default +\emph default +\bar default +\strikeout default +\uuline default +\uwave default +\noun default +\color inherit + +\begin_inset Formula +\begin{equation} +\varphi\left(ae^{\xihat}\right)\approx\varphi\left(a\right)\exp\left(\widehat{\varphi'(a)\xi}\right)\label{eq:pushforward} +\end{equation} + +\end_inset + +with equality for +\begin_inset Formula $\xi\rightarrow0$ +\end_inset + +. + We call +\begin_inset Formula $\varphi'(a)$ +\end_inset + + the +\series bold +Jacobian matrix +\series default + of the map +\begin_inset Formula $\varphi$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +. + Below we show that even with this informal definition we can deduce the + pushforward in a number of useful cases. +\end_layout + +\begin_layout Subsection +Left Multiplication with a Constant +\end_layout + +\begin_layout Theorem +Suppose +\begin_inset Formula $G$ +\end_inset + + is an +\begin_inset Formula $n$ +\end_inset + +-dimensional Lie group, and +\begin_inset Formula $\varphi:G\rightarrow G$ +\end_inset + + is defined as +\begin_inset Formula $\varphi(g)=hg$ +\end_inset + +, with +\begin_inset Formula $h\in G$ +\end_inset + + a constant. + Then +\begin_inset Formula $D\varphi_{a}$ +\end_inset + + is the identity mapping and +\begin_inset Formula +\[ +\varphi'(a)=I_{n} +\] + +\end_inset + + +\end_layout + +\begin_layout Proof +Defining +\begin_inset Formula $y=D\varphi_{a}x$ +\end_inset + + as in +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:pushforward" + +\end_inset + +, we have +\begin_inset Formula +\begin{eqnarray*} +\varphi(a)e^{\yhat} & = & \varphi(ae^{\xhat})\\ +hae^{\yhat} & = & hae^{\xhat}\\ +y & = & x +\end{eqnarray*} + +\end_inset + + +\end_layout + +\begin_layout Subsection +Pushforward of the Inverse Mapping +\end_layout + +\begin_layout Standard +A well known property of Lie groups is the the fact that applying an incremental + change +\begin_inset Formula $\xihat$ +\end_inset + + in a different frame +\begin_inset Formula $g$ +\end_inset + + can be applied in a single step by applying the change +\begin_inset Formula $Ad_{g}\xihat$ +\end_inset + + in the original frame, +\begin_inset Formula +\begin{equation} +ge^{\xihat}g^{-1}=\exp\left(Ad_{g}\xihat\right)\label{eq:Adjoint2} +\end{equation} + +\end_inset + +where +\begin_inset Formula $Ad_{g}:\mathfrak{g}\rightarrow\mathfrak{g}$ +\end_inset + + is the +\series bold +adjoint representation +\series default +. + This comes in handy in the following: +\end_layout + +\begin_layout Theorem +Suppose that +\begin_inset Formula $\varphi:G\rightarrow G$ +\end_inset + + is defined as the mapping from an element +\begin_inset Formula $g$ +\end_inset + + to its +\series bold +inverse +\series default + +\begin_inset Formula $g^{-1}$ +\end_inset + +, i.e., +\begin_inset Formula $\varphi(g)=g^{-1}$ +\end_inset + +, then the pushforward +\begin_inset Formula $D\varphi_{a}$ +\end_inset + + satisfies +\begin_inset Formula +\begin{align} +\left(D\varphi_{a}x\right)\hat{} & =-Ad_{a}\xhat\label{eq:Dinverse} +\end{align} + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +noindent +\end_layout + +\end_inset + + In other words, and this is intuitive in hindsight, approximating the inverse + is accomplished by negation of +\begin_inset Formula $\xihat$ +\end_inset + +, along with an adjoint to make sure it is applied in the right frame. + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +noindent +\end_layout + +\end_inset + + Note, however, that +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:Dinverse" + +\end_inset + + does not immediately yield a useful expression for the Jacobian matrix + +\begin_inset Formula $\varphi'(a)$ +\end_inset + +, but in many important cases this will turn out to be easy. + +\end_layout + +\begin_layout Proof +Defining +\begin_inset Formula $y=D\varphi_{a}x$ +\end_inset + + as in +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:pushforward" + +\end_inset + +, we have +\begin_inset Formula +\begin{eqnarray*} +\varphi(a)e^{\yhat} & = & \varphi(ae^{\xhat})\\ +a^{-1}e^{\yhat} & = & \left(ae^{\xhat}\right)^{-1}\\ +e^{\yhat} & = & -ae^{\xhat}a^{-1}\\ +\yhat & = & -\Ad a\xhat +\end{eqnarray*} + +\end_inset + + +\end_layout + +\begin_layout Example +For 3D rotations +\begin_inset Formula $R\in\SOthree$ +\end_inset + + we have +\begin_inset Formula +\[ +Ad_{g}(\hat{\omega})=R\hat{\omega}R^{T}=\Skew{R\omega} +\] + +\end_inset + +and hence the pushforward for the inverse mapping +\begin_inset Formula $\varphi(R)=R^{T}$ +\end_inset + + has the matrix +\begin_inset Formula $\varphi'(R)=-R$ +\end_inset + +. +\end_layout + +\begin_layout Subsection +Right Multiplication with a Constant +\end_layout + +\begin_layout Theorem +Suppose +\begin_inset Formula $\varphi:G\rightarrow G$ +\end_inset + + is defined as +\begin_inset Formula $\varphi(g)=gh$ +\end_inset + +, with +\begin_inset Formula $h\in G$ +\end_inset + + a constant. + Then +\begin_inset Formula $D\varphi_{a}$ +\end_inset + + satisfies +\begin_inset Formula +\[ +\left(D\varphi_{a}x\right)\hat{}=\Ad{h^{-1}}\xhat +\] + +\end_inset + + +\end_layout + +\begin_layout Proof +Defining +\begin_inset Formula $y=D\varphi_{a}x$ +\end_inset + + as in +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:pushforward" + +\end_inset + +, we have +\begin_inset Formula +\begin{align*} +\varphi(a)e^{\yhat} & =\varphi(ae^{\xhat})\\ +ahe & =ae^{\xhat}h\\ +e^{\yhat} & =h^{-1}e^{\xhat}h=\exp\left(\Ad{h^{-1}}\xhat\right)\\ +\yhat & =\Ad{h^{-1}}\xhat +\end{align*} + +\end_inset + + +\end_layout + +\begin_layout Example +In the case of 3D rotations, right multiplication with a constant rotation + +\begin_inset Formula $R$ +\end_inset + + is done through the mapping +\begin_inset Formula $\varphi(A)=AR$ +\end_inset + +, and satisfies +\begin_inset Formula +\[ +\Skew{D\varphi_{A}x}=\Ad{R^{T}}\Skew x +\] + +\end_inset + +For 3D rotations +\begin_inset Formula $R\in\SOthree$ +\end_inset + + we have +\begin_inset Formula +\[ +Ad_{R^{T}}(\hat{\omega})=R^{T}\hat{\omega}R=\Skew{R^{T}\omega} +\] + +\end_inset + +and hence the Jacobian matrix of +\begin_inset Formula $\varphi$ +\end_inset + + at +\begin_inset Formula $A$ +\end_inset + + is +\begin_inset Formula $\varphi'(A)=R^{T}$ +\end_inset + +. +\end_layout + +\begin_layout Subsection +Pushforward of Compose +\end_layout + +\begin_layout Theorem +If we define the mapping +\begin_inset Formula $\varphi:G\times G\rightarrow G$ +\end_inset + + as the product of two group elements +\begin_inset Formula $g,h\in G$ +\end_inset + +, i.e., +\begin_inset Formula $\varphi(g,h)=gh$ +\end_inset + +, then the pushforward will satisfy +\begin_inset Formula +\[ +D\varphi_{(a,b)}(x,y)=D_{1}\varphi_{(a,b)}x+D_{2}\varphi_{(a,b)}y +\] + +\end_inset + +with +\begin_inset Formula +\[ +\left(D_{1}\varphi_{(a,b)}x\right)\hat{}=\Ad{b^{-1}}\xhat\mbox{\;\ and\;}D_{2}\varphi_{(a,b)}y=y +\] + +\end_inset + + +\end_layout + +\begin_layout Proof +Looking at the first argument, the proof is very similar to right multiplication + with a constant +\begin_inset Formula $b$ +\end_inset + +. + Indeed, defining +\begin_inset Formula $y=D\varphi_{a}x$ +\end_inset + + as in +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:pushforward" + +\end_inset + +, we have +\begin_inset Formula +\begin{align} +\varphi(a,b)e^{\yhat} & =\varphi(ae^{\xhat},b)\nonumber \\ +abe^{\yhat} & =ae^{\xhat}b\nonumber \\ +e^{\yhat} & =b^{-1}e^{\xhat}b=\exp\left(\Ad{b^{-1}}\xhat\right)\nonumber \\ +\yhat & =\Ad{b^{-1}}\xhat\label{eq:Dcompose1} +\end{align} + +\end_inset + +In other words, to apply an incremental change +\begin_inset Formula $\xhat$ +\end_inset + + to +\begin_inset Formula $a$ +\end_inset + + we first need to undo +\begin_inset Formula $b$ +\end_inset + +, then apply +\begin_inset Formula $\xhat$ +\end_inset + +, and then apply +\begin_inset Formula $b$ +\end_inset + + again. + Using +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:Adjoint2" + +\end_inset + + this can be done in one step by simply applying +\begin_inset Formula $\Ad{b^{-1}}\xhat$ +\end_inset + +. + +\end_layout + +\begin_layout Proof +The second argument is quite a bit easier and simply yields the identity + mapping: +\begin_inset Formula +\begin{align} +\varphi(a,b)e^{\yhat} & =\varphi(a,be^{\xhat})\nonumber \\ +abe^{\yhat} & =abe^{\xhat}\nonumber \\ +y & =x\label{eq:Dcompose2} +\end{align} + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +In summary, the Jacobian matrix of +\begin_inset Formula $\varphi(g,h)=gh$ +\end_inset + + at +\begin_inset Formula $(a,b)\in G\times G$ +\end_inset + + is given by +\begin_inset Formula +\[ +\varphi'(a,b)=? +\] + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Example +For 3D rotations +\begin_inset Formula $A,B\in\SOthree$ +\end_inset + + we have +\begin_inset Formula $\varphi(A,B)=AB$ +\end_inset + +, and +\begin_inset Formula $\Ad{B^{T}}\Skew{\omega}=\Skew{B^{T}\omega}$ +\end_inset + +, hence the Jacobian matrix +\begin_inset Formula $\varphi'(A,B)$ +\end_inset + + of composing two rotations is given by +\begin_inset Formula +\[ +\varphi'(A,B)=\left[\begin{array}{cc} +B^{T} & I_{3}\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Pushforward of Between +\end_layout + +\begin_layout Standard +Finally, let us find the pushforward of +\series bold +between +\series default +, defined as +\begin_inset Formula $\varphi(g,h)=g^{-1}h$ +\end_inset + +. + For the first argument we reason as: +\begin_inset Formula +\begin{align} +\varphi(g,h)e^{\yhat} & =\varphi(ge^{\xhat},h)\nonumber \\ +g^{-1}he^{\yhat} & =\left(ge^{\xhat}\right)^{-1}h=-e^{\xhat}g^{-1}h\nonumber \\ +e^{\yhat} & =-\left(h^{-1}g\right)e^{\xhat}\left(h^{-1}g\right)^{-1}=-\exp\Ad{\left(h^{-1}g\right)}\xhat\nonumber \\ +\yhat & =-\Ad{\left(h^{-1}g\right)}\xhat=-\Ad{\varphi\left(h,g\right)}\xhat\label{eq:Dbetween1} +\end{align} + +\end_inset + +The second argument yields the identity mapping. +\end_layout + +\begin_layout Example +For 3D rotations +\begin_inset Formula $A,B\in\SOthree$ +\end_inset + + we have +\begin_inset Formula $\varphi(A,B)=A^{T}B$ +\end_inset + +, and +\begin_inset Formula $\Ad{B^{T}A}\Skew{-\omega}=\Skew{-B^{T}A\omega}$ +\end_inset + +, hence the Jacobian matrix +\begin_inset Formula $\varphi'(A,B)$ +\end_inset + + of between is given by +\begin_inset Formula +\[ +\varphi'(A,B)=\left[\begin{array}{cc} +\left(-B^{T}A\right) & I_{3}\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Numerical PushForward +\end_layout + +\begin_layout Standard +Let's examine +\begin_inset Formula +\[ +f\left(g\right)e^{\yhat}=f\left(ge^{\xhat}\right) +\] + +\end_inset + +and multiply with +\begin_inset Formula $f(g)^{-1}$ +\end_inset + + on both sides: +\begin_inset Formula +\[ +e^{\yhat}=f\left(g\right)^{-1}f\left(ge^{\xhat}\right) +\] + +\end_inset + +We then take the log (which in our case returns +\begin_inset Formula $y$ +\end_inset + +, not +\begin_inset Formula $\yhat$ +\end_inset + +): +\begin_inset Formula +\[ +y(x)=\log\left[f\left(g\right)^{-1}f\left(ge^{\xhat}\right)\right] +\] + +\end_inset + +Let us look at +\begin_inset Formula $x=0$ +\end_inset + +, and perturb in direction +\begin_inset Formula $i$ +\end_inset + +, +\begin_inset Formula $e_{i}=[0,0,1,0,0]$ +\end_inset + +. + Then take derivative, +\begin_inset Formula +\[ +\deriv{y(d)}d\define\lim_{d\rightarrow0}\frac{y(d)-y(0)}{d}=\lim_{d\rightarrow0}\frac{1}{d}\log\left[f\left(g\right)^{-1}f\left(ge^{\widehat{de_{i}}}\right)\right] +\] + +\end_inset + +which is the basis for a numerical derivative scheme. +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Not understood yet: Let us also look at a chain rule. + If we know the behavior at the origin +\begin_inset Formula $I$ +\end_inset + +, we can extrapolate +\begin_inset Formula +\[ +f(ge^{\xhat})=f(ge^{\xhat}g^{-1}g)=f(e^{\Ad g\xhat}g) +\] + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Derivative of the Exponential and Logarithm Map +\end_layout + +\begin_layout Theorem +\begin_inset CommandInset label +LatexCommand label +name "D-exp" + +\end_inset + +The derivative of the function +\begin_inset Formula $f:\Reals n\rightarrow G$ +\end_inset + + that applies the wedge operator followed by the exponential map, i.e., +\begin_inset Formula $f(\xi)=\exp\xihat$ +\end_inset + +, is the identity map for +\begin_inset Formula $\xi=0$ +\end_inset + +. +\end_layout + +\begin_layout Proof +For +\begin_inset Formula $\xi=0$ +\end_inset + +, we have +\begin_inset Formula +\begin{eqnarray*} +f(\xi)e^{\yhat} & = & f(\xi+x)\\ +f(0)e^{\yhat} & = & f(0+x)\\ +e^{\yhat} & = & e^{\xhat} +\end{eqnarray*} + +\end_inset + + +\end_layout + +\begin_layout Corollary +The derivative of the inverse +\begin_inset Formula $f^{-1}$ +\end_inset + + is the identity as well, i.e., for +\begin_inset Formula $T=e$ +\end_inset + +, the identity element in +\begin_inset Formula $G$ +\end_inset + +. +\end_layout + +\begin_layout Standard +For +\begin_inset Formula $\xi\neq0$ +\end_inset + +, things are not simple, see . + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://deltaepsilons.wordpress.com/2009/11/06/helgasons-formula-for-the-differenti +al-of-the-exponential/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +General Manifolds +\end_layout + +\begin_layout Subsection +Retractions +\end_layout + +\begin_layout Standard +\begin_inset FormulaMacro +\newcommand{\retract}{\mathcal{R}} +{\mathcal{R}} +\end_inset + + +\end_layout + +\begin_layout Standard +General manifolds that are not Lie groups do not have an exponential map, + but can still be handled by defining a +\series bold +retraction +\series default + +\begin_inset Formula $\retract:\Man\times\Reals n\rightarrow\Man$ +\end_inset + +, such that +\begin_inset Formula +\[ +a\oplus\xi\define\retract_{a}\left(\xi\right) +\] + +\end_inset + +A retraction +\begin_inset CommandInset citation +LatexCommand cite +key "Absil07book" + +\end_inset + + is required to be tangent to geodesics on the manifold +\begin_inset Formula $\Man$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +. + We can define many retractions for a manifold +\begin_inset Formula $\Man$ +\end_inset + +, even for those with more structure. + For the vector space +\begin_inset Formula $\Reals n$ +\end_inset + + the retraction is just vector addition, and for Lie groups the obvious + retraction is simply the exponential map, i.e., +\begin_inset Formula $\retract_{a}(\xi)=a\cdot\exp\xihat$ +\end_inset + +. + However, one can choose other, possibly computationally attractive retractions, + as long as around a they agree with the geodesic induced by the exponential + map, i.e., +\begin_inset Formula +\[ +\lim_{\xi\rightarrow0}\frac{\left|a\cdot\exp\xihat-\retract_{a}\left(\xi\right)\right|}{\left|\xi\right|}=0 +\] + +\end_inset + + +\end_layout + +\begin_layout Example +For +\begin_inset Formula $\SEthree$ +\end_inset + +, instead of using the true exponential map it is computationally more efficient + to define the retraction, which uses a first order approximation of the + translation update +\begin_inset Formula +\[ +\retract_{T}\left(\left[\begin{array}{c} +\omega\\ +v +\end{array}\right]\right)=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +e^{\Skew{\omega}} & v\\ +0 & 1 +\end{array}\right]=\left[\begin{array}{cc} +Re^{\Skew{\omega}} & t+Rv\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Derivatives +\end_layout + +\begin_layout Standard +Equipped with a retraction, then, we can generalize the notion of a derivative + for functions +\begin_inset Formula $f$ +\end_inset + + from general a manifold +\begin_inset Formula $\Man$ +\end_inset + + to +\begin_inset Formula $\Reals m$ +\end_inset + +: +\end_layout + +\begin_layout Definition +We define a function +\begin_inset Formula $f:\Man\rightarrow\Reals m$ +\end_inset + + to be +\series bold +differentiable +\series default + at +\begin_inset Formula $a\in\Man$ +\end_inset + + if there exists a matrix +\begin_inset Formula $f'(a)$ +\end_inset + + such that +\begin_inset Formula +\[ +\lim_{\xi\rightarrow0}\frac{\left|f(a)+f'(a)\xi-f\left(\retract_{a}(\xi)\right)\right|}{\left|\xi\right|}=0 +\] + +\end_inset + +with +\begin_inset Formula $\xi\in\Reals n$ +\end_inset + + for an +\begin_inset Formula $n$ +\end_inset + +-dimensional manifold, and +\begin_inset Formula $\retract_{a}:\Reals n\rightarrow\Man$ +\end_inset + + a retraction +\begin_inset Formula $\retract$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +. + If +\begin_inset Formula $f$ +\end_inset + + is differentiable, then +\begin_inset Formula $f'(a)$ +\end_inset + + is called the +\series bold +Jacobian matrix +\series default + of +\begin_inset Formula $f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +, and the linear transformation +\begin_inset Formula $Df_{a}:\xi\mapsto f'(a)\xi$ +\end_inset + + is called the +\series bold +derivative +\series default + of +\begin_inset Formula $f$ +\end_inset + + at +\begin_inset Formula $a$ +\end_inset + +. +\end_layout + +\begin_layout Definition +For manifolds that are also Lie groups, the derivative of any function +\begin_inset Formula $f:G\rightarrow\Reals m$ +\end_inset + + will agree no matter what retraction +\begin_inset Formula $\retract$ +\end_inset + + is used. +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Part +Practice +\end_layout + +\begin_layout Standard +Below we apply the results derived in the theory part to the geometric objects + we use in GTSAM. + Above we preferred the modern notation +\begin_inset Formula $D_{1}f$ +\end_inset + + for the partial derivative. + Below (because this was written earlier) we use the more classical notation + +\begin_inset Formula +\[ +\deriv{f(x,y)}x +\] + +\end_inset + +In addition, for Lie groups we will abuse the notation and take +\begin_inset Formula +\[ +\at{\deriv{\varphi(g)}{\xi}}a +\] + +\end_inset + +to be the Jacobian matrix +\begin_inset Formula $\varphi'($ +\end_inset + +a) of the mapping +\begin_inset Formula $\varphi$ +\end_inset + + at +\begin_inset Formula $a\in G$ +\end_inset + +, associated with the pushforward +\begin_inset Formula $D\varphi_{a}$ +\end_inset + +. +\end_layout + +\begin_layout Section +SLAM Example +\end_layout + +\begin_layout Standard +Let us examine a visual SLAM example. + We have 2D measurements +\begin_inset Formula $z_{ij}$ +\end_inset + +, where each measurement is predicted by +\begin_inset Formula +\[ +z_{ij}=h(T_{i},p_{j})=\pi(T_{i}^{-1}p_{j}) +\] + +\end_inset + +where +\begin_inset Formula $T_{i}$ +\end_inset + + is the 3D pose of the +\begin_inset Formula $i^{th}$ +\end_inset + + camera, +\begin_inset Formula $p_{j}$ +\end_inset + + is the location of the +\begin_inset Formula $j^{th}$ +\end_inset + + point, and +\begin_inset Formula $\pi:(x,y,z)\mapsto(x/z,y/z)$ +\end_inset + + is the camera projection function from Example +\begin_inset CommandInset ref +LatexCommand ref +reference "ex:projection" + +\end_inset + +. +\end_layout + +\begin_layout Section +BetweenFactor +\end_layout + +\begin_layout Standard +BetweenFactor is often used to summarize +\end_layout + +\begin_layout Standard +Theorem +\begin_inset CommandInset ref +LatexCommand ref +reference "D-exp" + +\end_inset + + about the derivative of the exponential map +\begin_inset Formula $f:\xi\mapsto\exp\xihat$ +\end_inset + + being identity only at +\begin_inset Formula $\xi=0$ +\end_inset + + has implications for GTSAM. + Given two elements +\begin_inset Formula $T_{1}$ +\end_inset + + and +\begin_inset Formula $T_{2}$ +\end_inset + +, BetweenFactor evaluates +\begin_inset Formula +\[ +g(T_{1},T_{2};Z)=f^{-1}\left(\mathop{between}(Z,\mathop{between}(T_{1},T_{2})\right)=f^{-1}\left(Z^{-1}\left(T_{1}^{-1}T_{2}\right)\right) +\] + +\end_inset + +but because it is assumed that +\begin_inset Formula $Z\approx T_{1}^{-1}T_{2}$ +\end_inset + +, and hence we have +\begin_inset Formula $Z^{-1}T_{1}^{-1}T_{2}\approx e$ +\end_inset + + and the derivative should be good there. + Note that the derivative of +\emph on +between +\emph default + is identity in its second argument. +\end_layout + +\begin_layout Section +Point3 +\end_layout + +\begin_layout Standard +A cross product +\begin_inset Formula $a\times b$ +\end_inset + + can be written as a matrix multiplication +\begin_inset Formula +\[ +a\times b=\Skew ab +\] + +\end_inset + +where +\begin_inset Formula $\Skew a$ +\end_inset + + is a skew-symmetric matrix defined as +\begin_inset Formula +\[ +\Skew{x,y,z}=\left[\begin{array}{ccc} +0 & -z & y\\ +z & 0 & -x\\ +-y & x & 0 +\end{array}\right] +\] + +\end_inset + +We also have +\begin_inset Formula +\[ +a^{T}\Skew b=-(\Skew ba)^{T}=-(a\times b)^{T} +\] + +\end_inset + +The derivative of a cross product +\begin_inset Formula +\begin{equation} +\frac{\partial(a\times b)}{\partial a}=\Skew{-b}\label{eq:Dcross1} +\end{equation} + +\end_inset + + +\begin_inset Formula +\begin{equation} +\frac{\partial(a\times b)}{\partial b}=\Skew a\label{eq:Dcross2} +\end{equation} + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +2D Rotations +\end_layout + +\begin_layout Subsection +Rot2 in GTSAM +\end_layout + +\begin_layout Standard +A rotation is stored as +\begin_inset Formula $(\cos\theta,\sin\theta)$ +\end_inset + +. + An incremental rotation is applied using the trigonometric sum rule: +\begin_inset Formula +\[ +\cos\theta'=\cos\theta\cos\delta-\sin\theta\sin\delta +\] + +\end_inset + + +\begin_inset Formula +\[ +\sin\theta'=\sin\theta\cos\delta+\cos\theta\sin\delta +\] + +\end_inset + +where +\begin_inset Formula $\delta$ +\end_inset + + is an incremental rotation angle. +\end_layout + +\begin_layout Subsection +Derivatives of Actions +\end_layout + +\begin_layout Standard +In the case of +\begin_inset Formula $\SOtwo$ +\end_inset + + the vector space is +\begin_inset Formula $\Rtwo$ +\end_inset + +, and the group action +\begin_inset Formula $f(R,p)$ +\end_inset + + corresponds to rotating the 2D point +\begin_inset Formula $p$ +\end_inset + + +\begin_inset Formula +\[ +f(R,p)=Rp +\] + +\end_inset + +According to Theorem +\begin_inset CommandInset ref +LatexCommand ref +reference "th:Action" + +\end_inset + +, the Jacobian matrix of +\begin_inset Formula $f$ +\end_inset + + is given by +\begin_inset Formula +\[ +f'(R,p)=\left[\begin{array}{cc} +RH(p) & R\end{array}\right] +\] + +\end_inset + +with +\begin_inset Formula $H:\Reals 2\rightarrow\Reals{2\times2}$ +\end_inset + + a linear mapping that depends on +\begin_inset Formula $p$ +\end_inset + +. + In the case of +\begin_inset Formula $\SOtwo$ +\end_inset + +, we can find +\begin_inset Formula $H(p)$ +\end_inset + + by equating (as in Equation +\begin_inset CommandInset ref +LatexCommand ref +reference "eq:Hp" + +\end_inset + +): +\begin_inset Formula +\[ +\skew wp=\left[\begin{array}{cc} +0 & -\omega\\ +\omega & 0 +\end{array}\right]\left[\begin{array}{c} +x\\ +y +\end{array}\right]=\left[\begin{array}{c} +-y\\ +x +\end{array}\right]\omega=H(p)\omega +\] + +\end_inset + +Note that +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\strikeout off +\uuline off +\uwave off +\noun off +\color none + +\begin_inset Formula +\[ +H(p)=\left[\begin{array}{c} +-y\\ +x +\end{array}\right]=\left[\begin{array}{cc} +0 & -1\\ +1 & 0 +\end{array}\right]\left[\begin{array}{c} +x\\ +y +\end{array}\right]=R_{\pi/2}p +\] + +\end_inset + +and since 2D rotations commute, we also have, with +\begin_inset Formula $q=Rp$ +\end_inset + + +\family default +\series default +\shape default +\size default +\emph default +\bar default +\strikeout default +\uuline default +\uwave default +\noun default +\color inherit +: +\begin_inset Formula +\[ +f'(R,p)=\left[\begin{array}{cc} +R\left(R_{\pi/2}p\right) & R\end{array}\right]=\left[\begin{array}{cc} +R_{\pi/2}q & R\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Pushforwards of Mappings +\end_layout + +\begin_layout Standard +Since +\begin_inset Formula $\Ad R\skew{\omega}=\skew{\omega}$ +\end_inset + +, we have the derivative of +\series bold +inverse +\series default +, +\begin_inset Formula +\[ +\frac{\partial R^{T}}{\partial\omega}=-\Ad R=-1\mbox{ } +\] + +\end_inset + + +\series bold +compose, +\series default + +\begin_inset Formula +\[ +\frac{\partial\left(R_{1}R_{2}\right)}{\partial\omega_{1}}=\Ad{R_{2}^{T}}=1\mbox{ and }\frac{\partial\left(R_{1}R_{2}\right)}{\partial\omega_{2}}=1 +\] + +\end_inset + +and +\series bold +between: +\series default + +\begin_inset Formula +\[ +\frac{\partial\left(R_{1}^{T}R_{2}\right)}{\partial\omega_{1}}=-\Ad{R_{2}^{T}R_{1}}=-1\mbox{ and }\frac{\partial\left(R_{1}^{T}R_{2}\right)}{\partial\omega_{2}}=1 +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +2D Rigid Transformations +\end_layout + +\begin_layout Subsection +The derivatives of Actions +\end_layout + +\begin_layout Standard +The action of +\begin_inset Formula $\SEtwo$ +\end_inset + + on 2D points is done by embedding the points in +\begin_inset Formula $\mathbb{R}^{3}$ +\end_inset + + by using homogeneous coordinates +\begin_inset Formula +\[ +f(T,p)=\hat{q}=\left[\begin{array}{c} +q\\ +1 +\end{array}\right]=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=T\hat{p} +\] + +\end_inset + +To find the derivative, we write the quantity +\begin_inset Formula $\xihat\hat{p}$ +\end_inset + + as the product of the +\begin_inset Formula $3\times3$ +\end_inset + + matrix +\begin_inset Formula $H(p)$ +\end_inset + + with +\begin_inset Formula $\xi$ +\end_inset + +: +\begin_inset Formula +\begin{equation} +\xihat\hat{p}=\left[\begin{array}{cc} +\skew{\omega} & v\\ +0 & 0 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=\left[\begin{array}{c} +\skew{\omega}p+v\\ +0 +\end{array}\right]=\left[\begin{array}{cc} +I_{2} & R_{\pi/2}p\\ +0 & 0 +\end{array}\right]\left[\begin{array}{c} +v\\ +\omega +\end{array}\right]=H(p)\xi\label{eq:HpSE2} +\end{equation} + +\end_inset + +Hence, by Theorem +\begin_inset CommandInset ref +LatexCommand ref +reference "th:Action" + +\end_inset + + we have +\begin_inset Formula +\begin{equation} +\deriv{\left(T\hat{p}\right)}{\xi}=TH(p)=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +I_{2} & R_{\pi/2}p\\ +0 & 0 +\end{array}\right]=\left[\begin{array}{cc} +R & RR_{\pi/2}p\\ +0 & 0 +\end{array}\right]=\left[\begin{array}{cc} +R & R_{\pi/2}q\\ +0 & 0 +\end{array}\right]\label{eq:SE2Action} +\end{equation} + +\end_inset + +Note that, looking only at the top rows of +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:HpSE2" + +\end_inset + + and +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:SE2Action" + +\end_inset + +, we can recognize the quantity +\begin_inset Formula $\skew{\omega}p+v=v+\omega\left(R_{\pi/2}p\right)$ +\end_inset + + as the velocity of +\begin_inset Formula $p$ +\end_inset + + in +\begin_inset Formula $\Rtwo$ +\end_inset + +, and +\begin_inset Formula $\left[\begin{array}{cc} +R & R_{\pi/2}q\end{array}\right]$ +\end_inset + + is the derivative of the action on +\begin_inset Formula $\Rtwo$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +The derivative of the inverse action +\begin_inset Formula $g(T,p)=T^{-1}\hat{p}$ +\end_inset + + is given by Theorem +\begin_inset CommandInset ref +LatexCommand ref +reference "Th:InverseAction" + +\end_inset + + specialized to +\begin_inset Formula $\SEtwo$ +\end_inset + +: +\end_layout + +\begin_layout Standard +\begin_inset Formula +\[ +\deriv{\left(T^{-1}\hat{p}\right)}{\xi}=-H(T^{-1}p)=\left[\begin{array}{cc} +-I_{2} & -R_{\pi/2}\left(T^{-1}p\right)\\ +0 & 0 +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Pushforwards of Mappings +\end_layout + +\begin_layout Standard +We can just define all derivatives in terms of the adjoint map, which in + the case of +\begin_inset Formula $\SEtwo$ +\end_inset + +, in twist coordinates, is the linear mapping +\begin_inset Formula +\[ +\Ad T\xi=\left[\begin{array}{cc} +R & -R_{\pi/2}t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{c} +v\\ +\omega +\end{array}\right] +\] + +\end_inset + +and we have +\begin_inset Formula +\begin{eqnarray*} +\frac{\partial T^{^{-1}}}{\partial\xi} & = & -\Ad T +\end{eqnarray*} + +\end_inset + + +\begin_inset Formula +\begin{eqnarray*} +\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{1}} & = & \Ad{T_{2}^{^{-1}}}\mbox{ and }\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{2}}=I_{3} +\end{eqnarray*} + +\end_inset + + +\begin_inset Formula +\begin{eqnarray*} +\frac{\partial\left(T_{1}^{-1}T_{2}\right)}{\partial\xi_{1}} & = & -\Ad{T_{2}^{^{-1}}T_{1}}=-\Ad{between(T_{2},T_{1})}\mbox{ and }\frac{\partial\left(T_{1}^{-1}T_{2}\right)}{\partial\xi_{2}}=I_{3} +\end{eqnarray*} + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +3D Rotations +\end_layout + +\begin_layout Subsection +Derivatives of Actions +\end_layout + +\begin_layout Standard +In the case of +\begin_inset Formula $\SOthree$ +\end_inset + + the vector space is +\begin_inset Formula $\Rthree$ +\end_inset + +, and the group action +\begin_inset Formula $f(R,p)$ +\end_inset + + corresponds to rotating a point +\begin_inset Formula +\[ +q=f(R,p)=Rp +\] + +\end_inset + +To calculate +\begin_inset Formula $H(p)$ +\end_inset + + for use in Theorem +\begin_inset CommandInset ref +LatexCommand eqref +reference "th:Action" + +\end_inset + + we make use of +\begin_inset Formula +\[ +\Skew{\omega}p=\omega\times p=-p\times\omega=\Skew{-p}\omega +\] + +\end_inset + +so +\begin_inset Formula $H(p)\define\Skew{-p}$ +\end_inset + +. + Hence, the final derivative of an action in its first argument is +\begin_inset Formula +\[ +\deriv{\left(Rp\right)}{\omega}=RH(p)=-R\Skew p +\] + +\end_inset + +Likewise, according to Theorem +\begin_inset CommandInset ref +LatexCommand ref +reference "Th:InverseAction" + +\end_inset + +, the derivative of the inverse action is given by +\end_layout + +\begin_layout Standard +\begin_inset Formula +\[ +\deriv{\left(R^{T}p\right)}{\omega}=-H(R^{T}p)=\Skew{R^{T}p} +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +\begin_inset CommandInset label +LatexCommand label +name "sub:3DAngularVelocities" + +\end_inset + +Instantaneous Velocity +\end_layout + +\begin_layout Standard +For 3D rotations +\begin_inset Formula $R_{b}^{n}$ +\end_inset + + from a body frame +\begin_inset Formula $b$ +\end_inset + + to a navigation frame +\begin_inset Formula $n$ +\end_inset + + we have the spatial angular velocity +\begin_inset Formula $\omega_{nb}^{n}$ +\end_inset + + measured in the navigation frame, +\begin_inset Formula +\[ +\Skew{\omega_{nb}^{n}}\define\dot{R}_{b}^{n}\left(R_{b}^{n}\right)^{T}=\dot{R}_{b}^{n}R_{n}^{b} +\] + +\end_inset + +and the body angular velocity +\begin_inset Formula $\omega_{nb}^{b}$ +\end_inset + + measured in the body frame: +\begin_inset Formula +\[ +\Skew{\omega_{nb}^{b}}\define\left(R_{b}^{n}\right)^{T}\dot{R}_{b}^{n}=R_{n}^{b}\dot{R}_{b}^{n} +\] + +\end_inset + +These quantities can be used to derive the velocity of a point +\begin_inset Formula $p$ +\end_inset + +, and we choose between spatial or body angular velocity depending on the + frame in which we choose to represent +\begin_inset Formula $p$ +\end_inset + +: +\begin_inset Formula +\[ +v^{n}=\Skew{\omega_{nb}^{n}}p^{n}=\omega_{nb}^{n}\times p^{n} +\] + +\end_inset + + +\begin_inset Formula +\[ +v^{b}=\Skew{\omega_{nb}^{b}}p^{b}=\omega_{nb}^{b}\times p^{b} +\] + +\end_inset + +We can transform these skew-symmetric matrices from navigation to body frame + by conjugating, +\begin_inset Formula +\[ +\Skew{\omega_{nb}^{b}}=R_{n}^{b}\Skew{\omega_{nb}^{n}}R_{b}^{n} +\] + +\end_inset + +but because the adjoint representation satisfies +\begin_inset Formula +\[ +Ad_{R}\Skew{\omega}\define R\Skew{\omega}R^{T}=\Skew{R\omega} +\] + +\end_inset + +we can even more easily transform between spatial and body angular velocities + as 3-vectors: +\begin_inset Formula +\[ +\omega_{nb}^{b}=R_{n}^{b}\omega_{nb}^{n} +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Pushforwards of Mappings +\end_layout + +\begin_layout Standard +For +\begin_inset Formula $\SOthree$ +\end_inset + + we have +\begin_inset Formula $\Ad R\Skew{\omega}=\Skew{R\omega}$ +\end_inset + + and, in terms of angular velocities: +\begin_inset Formula $\Ad R\omega=R\omega$ +\end_inset + +. + Hence, the Jacobian matrix of the +\series bold +inverse +\series default + mapping is (see Equation +\begin_inset CommandInset ref +LatexCommand ref +reference "eq:Dinverse" + +\end_inset + +) +\begin_inset Formula +\[ +\frac{\partial R^{T}}{\partial\omega}=-\Ad R=-R +\] + +\end_inset + +for +\series bold +compose +\series default + we have (Equations +\begin_inset CommandInset ref +LatexCommand ref +reference "eq:Dcompose1" + +\end_inset + + and +\begin_inset CommandInset ref +LatexCommand ref +reference "eq:Dcompose2" + +\end_inset + +): +\begin_inset Formula +\[ +\frac{\partial\left(R_{1}R_{2}\right)}{\partial\omega_{1}}=R_{2}^{T}\mbox{ and }\frac{\partial\left(R_{1}R_{2}\right)}{\partial\omega_{2}}=I_{3} +\] + +\end_inset + +and +\series bold +between +\series default + (Equation +\begin_inset CommandInset ref +LatexCommand ref +reference "eq:Dbetween1" + +\end_inset + +): +\begin_inset Formula +\[ +\frac{\partial\left(R_{1}^{T}R_{2}\right)}{\partial\omega_{1}}=-R_{2}^{T}R_{1}=-between(R_{2},R_{1})\mbox{ and }\frac{\partial\left(R_{1}R_{2}\right)}{\partial\omega_{2}}=I_{3} +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Retractions +\end_layout + +\begin_layout Standard +Absil +\begin_inset CommandInset citation +LatexCommand cite +after "page 58" +key "Absil07book" + +\end_inset + + discusses two possible retractions for +\begin_inset Formula $\SOthree$ +\end_inset + + based on the QR decomposition or the polar decomposition of the matrix + +\begin_inset Formula $R\Skew{\omega}$ +\end_inset + +, but they are expensive. + Another retraction is based on the Cayley transform +\begin_inset Formula $\mathcal{C}:\sothree\rightarrow\SOthree$ +\end_inset + +, a mapping from the skew-symmetric matrices to rotation matrices: +\begin_inset Formula +\[ +Q=\mathcal{C}(\Omega)=(I-\Omega)(I+\Omega)^{-1} +\] + +\end_inset + +Interestingly, the inverse Cayley transform +\begin_inset Formula $\mathcal{C}^{-1}:\SOthree\rightarrow\sothree$ +\end_inset + + has the same form: +\begin_inset Formula +\[ +\Omega=\mathcal{C}^{-1}(Q)=(I-Q)(I+Q)^{-1} +\] + +\end_inset + +The retraction needs a factor +\begin_inset Formula $-\frac{1}{2}$ +\end_inset + + however, to make it locally align with a geodesic: +\begin_inset Formula +\[ +R'=\retract_{R}(\omega)=R\mathcal{C}(-\frac{1}{2}\Skew{\omega}) +\] + +\end_inset + +Note that given +\begin_inset Formula $\omega=(x,y,z)$ +\end_inset + + this has the closed-form expression below +\begin_inset Formula +\[ +\frac{1}{4+x^{2}+y^{2}+z^{2}}\left[\begin{array}{ccc} +4+x^{2}-y^{2}-z^{2} & 2xy-4z & 2xz+4y\\ +2xy+4z & 4-x^{2}+y^{2}-z^{2} & 2yz-4x\\ +2xz-4y & 2yz+4x & 4-x^{2}-y^{2}+z^{2} +\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +=\frac{1}{4+x^{2}+y^{2}+z^{2}}\left\{ 4(I+\Skew{\omega})+\left[\begin{array}{ccc} +x^{2}-y^{2}-z^{2} & 2xy & 2xz\\ +2xy & -x^{2}+y^{2}-z^{2} & 2yz\\ +2xz & 2yz & -x^{2}-y^{2}+z^{2} +\end{array}\right]\right\} +\] + +\end_inset + +so it can be seen to be a second-order correction on +\begin_inset Formula $(I+\Skew{\omega})$ +\end_inset + +. + The corresponding approximation to the logarithmic map is: +\begin_inset Formula +\[ +\Skew{\omega}=\retract_{R}^{-1}(R')=-2\mathcal{C}^{-1}\left(R^{T}R'\right) +\] + +\end_inset + + +\end_layout + +\begin_layout Section +3D Rigid Transformations +\end_layout + +\begin_layout Subsection +The derivatives of Actions +\end_layout + +\begin_layout Standard +The action of +\begin_inset Formula $\SEthree$ +\end_inset + + on 3D points is done by embedding the points in +\begin_inset Formula $\mathbb{R}^{4}$ +\end_inset + + by using homogeneous coordinates +\begin_inset Formula +\[ +\hat{q}=\left[\begin{array}{c} +q\\ +1 +\end{array}\right]=f(T,p)=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=T\hat{p} +\] + +\end_inset + +The quantity +\begin_inset Formula $\xihat\hat{p}$ +\end_inset + + corresponds to a velocity in +\begin_inset Formula $\mathbb{R}^{4}$ +\end_inset + + (in the local +\begin_inset Formula $T$ +\end_inset + + frame), and equating it to +\begin_inset Formula $H(p)\xi$ +\end_inset + + as in Equation +\begin_inset CommandInset ref +LatexCommand ref +reference "eq:Hp" + +\end_inset + + yields the +\begin_inset Formula $4\times6$ +\end_inset + + matrix +\begin_inset Formula $H(p)$ +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +\begin_inset Formula $H(p)$ +\end_inset + + can also be obtained by taking the +\begin_inset Formula $j^{th}$ +\end_inset + + column of each of the 6 generators to multiply with components of +\begin_inset Formula $\hat{p}$ +\end_inset + + +\end_layout + +\end_inset + +: +\begin_inset Formula +\[ +\xihat\hat{p}=\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right]\left[\begin{array}{c} +p\\ +1 +\end{array}\right]=\left[\begin{array}{c} +\omega\times p+v\\ +0 +\end{array}\right]=\left[\begin{array}{cc} +\Skew{-p} & I_{3}\\ +0 & 0 +\end{array}\right]\left[\begin{array}{c} +\omega\\ +v +\end{array}\right]=H(p)\xi +\] + +\end_inset + +Note how velocities are analogous to points at infinity in projective geometry: + they correspond to free vectors indicating a direction and magnitude of + change. + According to Theorem +\begin_inset CommandInset ref +LatexCommand ref +reference "th:Action" + +\end_inset + +, the derivative of the group action is then +\begin_inset Formula +\[ +\deriv{\left(T\hat{p}\right)}{\xi}=TH(p)=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +\Skew{-p} & I_{3}\\ +0 & 0 +\end{array}\right]=\left[\begin{array}{cc} +R\Skew{-p} & R\\ +0 & 0 +\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +\deriv{\left(T\hat{p}\right)}{\hat{p}}=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + +in homogenous coordinates. + In +\begin_inset Formula $\Rthree$ +\end_inset + + this becomes +\begin_inset Formula $R\left[\begin{array}{cc} +-\Skew p & I_{3}\end{array}\right]$ +\end_inset + +. +\end_layout + +\begin_layout Standard +The derivative of the inverse action +\begin_inset Formula $T^{-1}p$ +\end_inset + + is given by Theorem +\begin_inset CommandInset ref +LatexCommand ref +reference "Th:InverseAction" + +\end_inset + +: +\end_layout + +\begin_layout Standard + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +\begin_inset Formula +\[ +\deriv{\left(T^{-1}\hat{p}\right)}{\xi}=-H\left(T^{-1}\hat{p}\right)=\left[\begin{array}{cc} +\Skew{T^{-1}\hat{p}} & -I_{3}\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +\deriv{\left(T^{-1}\hat{p}\right)}{\hat{p}}=\left[\begin{array}{cc} +R^{T} & -R^{T}t\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Example +Let us examine a visual SLAM example. + We have 2D measurements +\begin_inset Formula $z_{ij}$ +\end_inset + +, where each measurement is predicted by +\begin_inset Formula +\[ +z_{ij}=h(T_{i},p_{j})=\pi(T_{i}^{-1}p_{j})=\pi(q) +\] + +\end_inset + +where +\begin_inset Formula $T_{i}$ +\end_inset + + is the 3D pose of the +\begin_inset Formula $i^{th}$ +\end_inset + + camera, +\begin_inset Formula $p_{j}$ +\end_inset + + is the location of the +\begin_inset Formula $j^{th}$ +\end_inset + + point, +\begin_inset Formula $q=(x',y',z')=T^{-1}p$ +\end_inset + + is the point in camera coordinates, and +\begin_inset Formula $\pi:(x,y,z)\mapsto(x/z,y/z)$ +\end_inset + + is the camera projection function from Example +\begin_inset CommandInset ref +LatexCommand ref +reference "ex:projection" + +\end_inset + +. + By the chain rule, we then have +\begin_inset Formula +\[ +\deriv{h(T,p)}{\xi}=\deriv{\pi(q)}q\deriv{(T^{-1}p)}{\xi}=\frac{1}{z'}\left[\begin{array}{ccc} +1 & 0 & -x'/z'\\ +0 & 1 & -y'/z' +\end{array}\right]\left[\begin{array}{cc} +\Skew q & -I_{3}\end{array}\right]=\left[\begin{array}{cc} +\pi'(q)\Skew q & -\pi'(q)\end{array}\right] +\] + +\end_inset + + +\begin_inset Formula +\[ +\deriv{h(T,p)}p=\pi'(q)R^{T} +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Instantaneous Velocity +\end_layout + +\begin_layout Standard +For rigid 3D transformations +\begin_inset Formula $T_{b}^{n}$ +\end_inset + + from a body frame +\begin_inset Formula $b$ +\end_inset + + to a navigation frame +\begin_inset Formula $n$ +\end_inset + + we have the instantaneous spatial twist +\begin_inset Formula $\xi_{nb}^{n}$ +\end_inset + + measured in the navigation frame, +\begin_inset Formula +\[ +\hat{\xi}_{nb}^{n}\define\dot{T}_{b}^{n}\left(T_{b}^{n}\right)^{-1} +\] + +\end_inset + +and the instantaneous body twist +\begin_inset Formula $\xi_{nb}^{b}$ +\end_inset + + measured in the body frame: +\begin_inset Formula +\[ +\hat{\xi}_{nb}^{b}\define\left(T_{b}^{n}\right)^{T}\dot{T}_{b}^{n} +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection +Pushforwards of Mappings +\end_layout + +\begin_layout Standard +As we can express the Adjoint representation in terms of twist coordinates, + we have +\begin_inset Formula +\[ +\left[\begin{array}{c} +\omega'\\ +v' +\end{array}\right]=\left[\begin{array}{cc} +R & 0\\ +\Skew tR & R +\end{array}\right]\left[\begin{array}{c} +\omega\\ +v +\end{array}\right] +\] + +\end_inset + +Hence, as with +\begin_inset Formula $\SOthree$ +\end_inset + +, we are now in a position to simply posit the derivative of +\series bold +inverse +\series default +, +\begin_inset Formula +\[ +\frac{\partial T^{-1}}{\partial\xi}=\Ad T=-\left[\begin{array}{cc} +R & 0\\ +\Skew tR & R +\end{array}\right] +\] + +\end_inset + + +\series bold +compose +\series default + in its first argument, +\begin_inset Formula +\[ +\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{1}}=\Ad{T_{2}^{-1}} +\] + +\end_inset + + in its second argument, +\begin_inset Formula +\[ +\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{2}}=I_{6} +\] + +\end_inset + + +\series bold +between +\series default + in its first argument, +\begin_inset Formula +\[ +\frac{\partial\left(T_{1}^{^{-1}}T_{2}\right)}{\partial\xi_{1}}=\Ad{T_{2}^{^{-1}}T_{1}} +\] + +\end_inset + +and in its second argument, +\begin_inset Formula +\begin{eqnarray*} +\frac{\partial\left(T_{1}^{^{-1}}T_{2}\right)}{\partial\xi_{1}} & = & I_{6} +\end{eqnarray*} + +\end_inset + + +\end_layout + +\begin_layout Subsection +Retractions +\end_layout + +\begin_layout Standard +For +\begin_inset Formula $\SEthree$ +\end_inset + +, instead of using the true exponential map it is computationally more efficient + to design other retractions. + A first-order approximation to the exponential map does not quite cut it, + as it yields a +\begin_inset Formula $4\times4$ +\end_inset + + matrix which is not in +\begin_inset Formula $\SEthree$ +\end_inset + +: +\begin_inset Formula +\begin{eqnarray*} +T\exp\xihat & \approx & T(I+\xihat)\\ + & = & T\left(I_{4}+\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right]\right)\\ + & = & \left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +I_{3}+\Skew{\omega} & v\\ +0 & 1 +\end{array}\right]\\ + & = & \left[\begin{array}{cc} +R\left(I_{3}+\Skew{\omega}\right) & t+Rv\\ +0 & 1 +\end{array}\right] +\end{eqnarray*} + +\end_inset + +However, we can make it into a retraction by using any retraction defined + for +\begin_inset Formula $\SOthree$ +\end_inset + +, including, as below, using the exponential map +\begin_inset Formula $Re^{\Skew{\omega}}$ +\end_inset + +: +\begin_inset Formula +\[ +\retract_{T}\left(\left[\begin{array}{c} +\omega\\ +v +\end{array}\right]\right)=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +e^{\Skew{\omega}} & v\\ +0 & 1 +\end{array}\right]=\left[\begin{array}{cc} +Re^{\Skew{\omega}} & t+Rv\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + +Similarly, for a second order approximation we have +\begin_inset Formula +\begin{eqnarray*} +T\exp\xihat & \approx & T(I+\xihat+\frac{\xihat^{2}}{2})\\ + & = & T\left(I_{4}+\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right]+\frac{1}{2}\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right]\left[\begin{array}{cc} +\Skew{\omega} & v\\ +0 & 0 +\end{array}\right]\right)\\ + & = & \left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left(\left[\begin{array}{cc} +I_{3}+\Skew{\omega}+\frac{1}{2}\Skew{\omega}^{2} & v+\frac{1}{2}\Skew{\omega}v\\ +0 & 1 +\end{array}\right]\right)\\ + & = & \left[\begin{array}{cc} +R\left(I_{3}+\Skew{\omega}+\frac{1}{2}\Skew{\omega}^{2}\right) & t+R\left[v+\left(\omega\times v\right)/2\right]\\ +0 & 1 +\end{array}\right] +\end{eqnarray*} + +\end_inset + +inspiring the retraction +\begin_inset Formula +\[ +\retract_{T}\left(\left[\begin{array}{c} +\omega\\ +v +\end{array}\right]\right)=\left[\begin{array}{cc} +R & t\\ +0 & 1 +\end{array}\right]\left[\begin{array}{cc} +e^{\Skew{\omega}} & v+\left(\omega\times v\right)/2\\ +0 & 1 +\end{array}\right]=\left[\begin{array}{cc} +Re^{\Skew{\omega}} & t+R\left[v+\left(\omega\times v\right)/2\right]\\ +0 & 1 +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Newpage pagebreak +\end_inset + + +\end_layout + +\begin_layout Section +2D Line Segments (Ocaml) +\end_layout + +\begin_layout Standard +The error between an infinite line +\begin_inset Formula $(a,b,c)$ +\end_inset + + and a 2D line segment +\begin_inset Formula $((x1,y1),(x2,y2))$ +\end_inset + + is defined in Line3.ml. +\end_layout + +\begin_layout Section +Line3vd (Ocaml) +\end_layout + +\begin_layout Standard +One representation of a line is through 2 vectors +\begin_inset Formula $(v,d)$ +\end_inset + +, where +\begin_inset Formula $v$ +\end_inset + + is the direction and the vector +\begin_inset Formula $d$ +\end_inset + + points from the orgin to the closest point on the line. +\end_layout + +\begin_layout Standard +In this representation, transforming a 3D line from a world coordinate frame + to a camera at +\begin_inset Formula $(R_{w}^{c},t^{w})$ +\end_inset + + is done by +\begin_inset Formula +\[ +v^{c}=R_{w}^{c}v^{w} +\] + +\end_inset + + +\begin_inset Formula +\[ +d^{c}=R_{w}^{c}\left(d^{w}+(t^{w}v^{w})v^{w}-t^{w}\right) +\] + +\end_inset + + +\end_layout + +\begin_layout Section +Line3 (Ocaml) +\end_layout + +\begin_layout Standard +For 3D lines, we use a parameterization due to C.J. + Taylor, using a rotation matrix +\begin_inset Formula $R$ +\end_inset + + and 2 scalars +\begin_inset Formula $a$ +\end_inset + + and +\begin_inset Formula $b$ +\end_inset + +. + The line direction +\begin_inset Formula $v$ +\end_inset + + is simply the Z-axis of the rotated frame, i.e., +\begin_inset Formula $v=R_{3}$ +\end_inset + +, while the vector +\begin_inset Formula $d$ +\end_inset + + is given by +\begin_inset Formula $d=aR_{1}+bR_{2}$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Now, we will +\emph on +not +\emph default + use the incremental rotation scheme we used for rotations: because the + matrix R translates from the line coordinate frame to the world frame, + we need to apply the incremental rotation on the right-side: +\begin_inset Formula +\[ +R'=R(I+\Omega) +\] + +\end_inset + +Projecting a line to 2D can be done easily, as both +\begin_inset Formula $v$ +\end_inset + + and +\begin_inset Formula $d$ +\end_inset + + are also the 2D homogenous coordinates of two points on the projected line, + and hence we have +\begin_inset Formula +\begin{eqnarray*} +l & = & v\times d\\ + & = & R_{3}\times\left(aR_{1}+bR_{2}\right)\\ + & = & a\left(R_{3}\times R_{1}\right)+b\left(R_{3}\times R_{2}\right)\\ + & = & aR_{2}-bR_{1} +\end{eqnarray*} + +\end_inset + +This can be written as a rotation of a point, +\begin_inset Formula +\[ +l=R\left(\begin{array}{c} +-b\\ +a\\ +0 +\end{array}\right) +\] + +\end_inset + +but because the incremental rotation is now done on the right, we need to + figure out the derivatives again: +\begin_inset Formula +\begin{equation} +\frac{\partial(R(I+\Omega)x)}{\partial\omega}=\frac{\partial(R\Omega x)}{\partial\omega}=R\frac{\partial(\Omega x)}{\partial\omega}=R\Skew{-x}\label{eq:rotateRight} +\end{equation} + +\end_inset + +and hence the derivative of the projection +\begin_inset Formula $l$ +\end_inset + + with respect to the rotation matrix +\begin_inset Formula $R$ +\end_inset + +of the 3D line is +\begin_inset Formula +\begin{equation} +\frac{\partial(l)}{\partial\omega}=R\Skew{\left(\begin{array}{c} +b\\ +-a\\ +0 +\end{array}\right)}=\left[\begin{array}{ccc} +aR_{3} & bR_{3} & -(aR_{1}+bR_{2})\end{array}\right] +\end{equation} + +\end_inset + +or the +\begin_inset Formula $a,b$ +\end_inset + + scalars: +\begin_inset Formula +\[ +\frac{\partial(l)}{\partial a}=R_{2} +\] + +\end_inset + + +\begin_inset Formula +\[ +\frac{\partial(l)}{\partial b}=-R_{1} +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +Transforming a 3D line +\begin_inset Formula $(R,(a,b))$ +\end_inset + + from a world coordinate frame to a camera frame +\begin_inset Formula $(R_{w}^{c},t^{w})$ +\end_inset + + is done by +\end_layout + +\begin_layout Standard +\begin_inset Formula +\[ +R'=R_{w}^{c}R +\] + +\end_inset + + +\begin_inset Formula +\[ +a'=a-R_{1}^{T}t^{w} +\] + +\end_inset + + +\begin_inset Formula +\[ +b'=b-R_{2}^{T}t^{w} +\] + +\end_inset + +Again, we need to redo the derivatives, as R is incremented from the right. + The first argument is incremented from the left, but the result is incremented + on the right: +\begin_inset Formula +\begin{eqnarray*} +R'(I+\Omega')=(AB)(I+\Omega') & = & (I+\Skew{S\omega})AB\\ +I+\Omega' & = & (AB)^{T}(I+\Skew{S\omega})(AB)\\ +\Omega' & = & R'^{T}\Skew{S\omega}R'\\ +\Omega' & = & \Skew{R'^{T}S\omega}\\ +\omega' & = & R'^{T}S\omega +\end{eqnarray*} + +\end_inset + +For the second argument +\begin_inset Formula $R$ +\end_inset + + we now simply have: +\begin_inset Formula +\begin{eqnarray*} +AB(I+\Omega') & = & AB(I+\Omega)\\ +\Omega' & = & \Omega\\ +\omega' & = & \omega +\end{eqnarray*} + +\end_inset + +The scalar derivatives can be found by realizing that +\begin_inset Formula +\[ +\left(\begin{array}{c} +a'\\ +b'\\ +... +\end{array}\right)=\left(\begin{array}{c} +a\\ +b\\ +0 +\end{array}\right)-R^{T}t^{w} +\] + +\end_inset + +where we don't care about the third row. + Hence +\begin_inset Formula +\[ +\frac{\partial(\left(R(I+\Omega_{2})\right)^{T}t^{w})}{\partial\omega}=-\frac{\partial(\Omega_{2}R^{T}t^{w})}{\partial\omega}=-\Skew{R^{T}t^{w}}=\left[\begin{array}{ccc} +0 & R_{3}^{T}t^{w} & -R_{2}^{T}t^{w}\\ +-R_{3}^{T}t^{w} & 0 & R_{1}^{T}t^{w}\\ +... & ... & 0 +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Section + +\series bold +Aligning 3D Scans +\end_layout + +\begin_layout Standard +Below is the explanaition underlying Pose3.align, i.e. + aligning two point clouds using SVD. + Inspired but modified from CVOnline... +\end_layout + +\begin_layout Standard + +\emph on +Our +\emph default + model is +\begin_inset Formula +\[ +p^{c}=R\left(p^{w}-t\right) +\] + +\end_inset + +i.e., +\begin_inset Formula $R$ +\end_inset + + is from camera to world, and +\begin_inset Formula $t$ +\end_inset + + is the camera location in world coordinates. + The objective function is +\begin_inset Formula +\begin{equation} +\frac{1}{2}\sum\left(p^{c}-R(p^{w}-t)\right)^{2}=\frac{1}{2}\sum\left(p^{c}-Rp^{w}+Rt\right)^{2}=\frac{1}{2}\sum\left(p^{c}-Rp^{w}-t'\right)^{2}\label{eq:J} +\end{equation} + +\end_inset + +where +\begin_inset Formula $t'=-Rt$ +\end_inset + + is the location of the origin in the camera frame. + Taking the derivative with respect to +\begin_inset Formula $t'$ +\end_inset + + and setting to zero we have +\begin_inset Formula +\[ +\sum\left(p^{c}-Rp^{w}-t'\right)=0 +\] + +\end_inset + +or +\begin_inset Formula +\begin{equation} +t'=\frac{1}{n}\sum\left(p^{c}-Rp^{w}\right)=\bar{p}^{c}-R\bar{p}^{w}\label{eq:t} +\end{equation} + +\end_inset + +here +\begin_inset Formula $\bar{p}^{c}$ +\end_inset + + and +\begin_inset Formula $\bar{p}^{w}$ +\end_inset + + are the point cloud centroids. + Substituting back into +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:J" + +\end_inset + +, we get +\begin_inset Formula +\[ +\frac{1}{2}\sum\left(p^{c}-R(p^{w}-t)\right)^{2}=\frac{1}{2}\sum\left(\left(p^{c}-\bar{p}^{c}\right)-R\left(p^{w}-\bar{p}^{w}\right)\right)^{2}=\frac{1}{2}\sum\left(\hat{p}^{c}-R\hat{p}^{w}\right)^{2} +\] + +\end_inset + +Now, to minimize the above it suffices to maximize (see CVOnline) +\begin_inset Formula +\[ +\mathop{trace}\left(R^{T}C\right) +\] + +\end_inset + +where +\begin_inset Formula $C=\sum\hat{p}^{c}\left(\hat{p}^{w}\right)^{T}$ +\end_inset + + is the correlation matrix. + Intuitively, the cloud of points is rotated to align with the principal + axes. + This can be achieved by SVD decomposition on +\begin_inset Formula $C$ +\end_inset + + +\begin_inset Formula +\[ +C=USV^{T} +\] + +\end_inset + +and setting +\begin_inset Formula +\[ +R=UV^{T} +\] + +\end_inset + +Clearly, from +\begin_inset CommandInset ref +LatexCommand eqref +reference "eq:t" + +\end_inset + + we then also recover the optimal +\begin_inset Formula $t$ +\end_inset + + as +\begin_inset Formula +\[ +t=\bar{p}^{w}-R^{T}\bar{p}^{c} +\] + +\end_inset + + +\end_layout + +\begin_layout Section* +Appendix +\end_layout + +\begin_layout Subsection* +Differentiation Rules +\end_layout + +\begin_layout Standard +Spivak +\begin_inset CommandInset citation +LatexCommand cite +key "Spivak65book" + +\end_inset + + also notes some multivariate derivative rules defined component-wise, but + they are not that useful in practice: +\end_layout + +\begin_layout Itemize +Since +\begin_inset Formula $f:\Multi nm$ +\end_inset + + is defined in terms of +\begin_inset Formula $m$ +\end_inset + + component functions +\begin_inset Formula $f^{i}$ +\end_inset + +, then +\begin_inset Formula $f$ +\end_inset + + is differentiable at +\begin_inset Formula $a$ +\end_inset + + iff each +\begin_inset Formula $f^{i}$ +\end_inset + + is, and the Jacobian matrix +\begin_inset Formula $F_{a}$ +\end_inset + + is the +\begin_inset Formula $m\times n$ +\end_inset + + matrix whose +\begin_inset Formula $i^{th}$ +\end_inset + + row is +\begin_inset Formula $\left(f^{i}\right)'(a)$ +\end_inset + +: +\begin_inset Formula +\[ +F_{a}\define f'(a)=\left[\begin{array}{c} +\left(f^{1}\right)'(a)\\ +\vdots\\ +\left(f^{m}\right)'(a) +\end{array}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Itemize +Scalar differentiation rules: if +\begin_inset Formula $f,g:\OneD n$ +\end_inset + + are differentiable at +\begin_inset Formula $a$ +\end_inset + +, then +\begin_inset Formula +\[ +(f+g)'(a)=F_{a}+G_{a} +\] + +\end_inset + + +\begin_inset Formula +\[ +(f\cdot g)'(a)=g(a)F_{a}+f(a)G_{a} +\] + +\end_inset + + +\begin_inset Formula +\[ +(f/g)'(a)=\frac{1}{g(a)^{2}}\left[g(a)F_{a}-f(a)G_{a}\right] +\] + +\end_inset + + +\end_layout + +\begin_layout Subsection* +Tangent Spaces and the Tangent Bundle +\end_layout + +\begin_layout Standard +The following is adapted from Appendix A in +\begin_inset CommandInset citation +LatexCommand cite +key "Murray94book" + +\end_inset + +. +\end_layout + +\begin_layout Standard +The +\series bold +tangent space +\series default + +\begin_inset Formula $T_{p}M$ +\end_inset + + of a manifold +\begin_inset Formula $M$ +\end_inset + + at a point +\begin_inset Formula $p\in M$ +\end_inset + + is the vector space of +\series bold +tangent vectors +\series default + at +\begin_inset Formula $p$ +\end_inset + +. + The +\series bold +tangent bundle +\series default + +\begin_inset Formula $TM$ +\end_inset + + is the set of all tangent vectors +\begin_inset Formula +\[ +TM\define\bigcup_{p\in M}T_{p}M +\] + +\end_inset + +A +\series bold +vector field +\series default + +\begin_inset Formula $X:M\rightarrow TM$ +\end_inset + + assigns a single tangent vector +\begin_inset Formula $x\in T_{p}M$ +\end_inset + + to each point +\begin_inset Formula $p$ +\end_inset + +. +\end_layout + +\begin_layout Standard +If +\begin_inset Formula $F:M\rightarrow N$ +\end_inset + + is a smooth map from a manifold +\begin_inset Formula $M$ +\end_inset + + to a manifold +\begin_inset Formula $N$ +\end_inset + +, then we can define the +\series bold + tangent map +\series default + of +\begin_inset Formula $F$ +\end_inset + + at +\begin_inset Formula $p$ +\end_inset + + as the linear map +\begin_inset Formula $F_{*p}:T_{p}M\rightarrow T_{F(p)}N$ +\end_inset + + that maps tangent vectors in +\begin_inset Formula $T_{p}M$ +\end_inset + + at +\begin_inset Formula $p$ +\end_inset + + to tangent vectors in +\begin_inset Formula $T_{F(p)}N$ +\end_inset + + at the image +\begin_inset Formula $F(p)$ +\end_inset + +. +\end_layout + +\begin_layout Subsection* +Homomorphisms +\end_layout + +\begin_layout Standard +The following +\emph on +might be +\emph default + relevant +\begin_inset CommandInset citation +LatexCommand cite +after "page 45" +key "Hall00book" + +\end_inset + +: suppose that +\begin_inset Formula $\Phi:G\rightarrow H$ +\end_inset + + is a mapping (Lie group homomorphism). + Then there exists a unique linear map +\begin_inset Formula $\phi:\gg\rightarrow\mathfrak{h}$ +\end_inset + + +\begin_inset Formula +\[ +\phi(\xhat)\define\lim_{t\rightarrow0}\frac{d}{dt}\Phi\left(e^{t\xhat}\right) +\] + +\end_inset + +such that +\end_layout + +\begin_layout Enumerate +\begin_inset Formula $\Phi\left(e^{\xhat}\right)=e^{\phi\left(\xhat\right)}$ +\end_inset + + +\end_layout + +\begin_layout Enumerate +\begin_inset Formula $\phi\left(T\xhat T^{-1}\right)=\Phi(T)\phi(\xhat)\Phi(T^{-1})$ +\end_inset + + +\end_layout + +\begin_layout Enumerate +\begin_inset Formula $\phi\left([\xhat,\yhat]\right)=\left[\phi(\xhat),\phi(\yhat)\right]$ +\end_inset + + +\end_layout + +\begin_layout Standard +In other words, the map +\begin_inset Formula $\phi$ +\end_inset + + is the derivative of +\begin_inset Formula $\Phi$ +\end_inset + + at the identity. + As an example, suppose +\begin_inset Formula $\Phi(g)=g^{-1}$ +\end_inset + +, then the corresponding derivative +\emph on +at the identity +\emph default +is +\begin_inset Formula +\[ +\phi(\xhat)\define\lim_{t\rightarrow0}\frac{d}{dt}\left(e^{t\xhat}\right)^{-1}=\lim_{t\rightarrow0}\frac{d}{dt}e^{-t\xhat}=-\xhat\lim_{t\rightarrow0}e^{-t\xhat}=-\xhat +\] + +\end_inset + +In general it suffices to compute +\begin_inset Formula $\phi$ +\end_inset + + for a basis of +\begin_inset Formula $\gg$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Undercooked: What if we want the derivative of +\begin_inset Formula $\Phi$ +\end_inset + + at some other element +\begin_inset Formula $g$ +\end_inset + +? In other words, if we apply +\begin_inset Formula $\Phi$ +\end_inset + + at +\begin_inset Formula $g$ +\end_inset + + incremented by some Lie algebra element +\begin_inset Formula $e^{\xhat}$ +\end_inset + +, then we are looking for a +\begin_inset Formula $\yhat\in\gg$ +\end_inset + + will yield the same result: +\begin_inset Formula +\[ +\Phi\left(g\right)\lim_{t\rightarrow0}\frac{d}{dt}e^{t\yhat}=\lim_{t\rightarrow0}\frac{d}{dt}\Phi\left(ge^{t\xhat}\right) +\] + +\end_inset + + +\begin_inset Formula +\[ +\lim_{t\rightarrow0}\frac{d}{dt}e^{t\yhat}=\Phi\left(g\right)^{-1}\lim_{t\rightarrow0}\frac{d}{dt}\Phi\left(ge^{t\xhat}\right) +\] + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Let us define two mappings +\begin_inset Formula +\[ +\Phi_{1}(A)=AB\mbox{ and }\Phi_{2}(B)=AB +\] + +\end_inset + +Then +\begin_inset Formula +\[ +\phi_{1}(\xhat)=\lim_{t\rightarrow0}\frac{d}{dt}\Phi_{1}\left(e^{t\xhat}B\right)= +\] + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset bibtex +LatexCommand bibtex +bibfiles "/Users/dellaert/papers/refs" +options "plain" + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/doc/math.pdf b/doc/math.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ee50857ce92a23fe32b13454bd579266748e6c90 GIT binary patch literal 118509 zcmbrlW0WOZ+oqegot2rDwryLLwr$(CZL89@Gb?S|wym!B^t<=2@0|C1-J|=*8u6?- zV?@jmKi0agc|SocDJyor{SvZP>PXpw* z(8Y$uxl(6=tfAyRyzfWIPiRamFDaj$_VI8z*emGIRKH2o2rdo*faT@+;l%ioI87A5 z%OnT$X*}`@AhXrq9kRcsbbEAV+Q$%o#HD71EJ3X27JrB-N1 z{DT`6dX8FwBwSd{W__aFJc8F++Tyf};%Vb{tNf{kSMn#G=6*}JeBdn6LA+`6hl`b( z&;8kiw@!Lf^O*dPa02l(5;bemF4{AN6`uCe+o<-sNQN)8Y*}H9r03*BbLo~J@-1Y| z@3@k&D348JpO;IafspyK@zg&FjX-CDvN~7Oz&4#)8OL`6#2nMmglnH|&&vfLFdgUS zy~99+;{}3=sYugTh`XtjYU%KT#?fLHys!3Kp9s&2wKJMnwDV$=x*c3X$_7;w9|D$I zGjv#;+N#YJnyg)IMkjG=-#}KONX#$43>Hl}PNa{LSv6cPTm~oBST1^V_+)aDJYww>dU!TN+a$aVTMDoDtI z>q#n0OEGb90`xz@Iq--~l8NViXt>ai?6@5GbZZDLLdQdYy(xHd!uC@!gn+B8z>LUT3L@CEyLjnT>8M12C8PLLj0in$rA`WF^GwITATa$lw(jFmkyCc zw?0hnk8~=N0EI8Eyo@J5`}y7iOcaV8=l~>^sKuH>!f|YlP@mc!3NiRhPh!IFDr*di z-;*>Lx+6gyEv@u)iRQncJ;p&$0EYPiSDTvcD%n;FSA2>0IM%s#ExWkTv|_V9hjW~# zezo4;#vXL@mitY_Bp*Exbj2t9xm|=;kgbye^Sb&DAtxjvkFFvPQS}ijd%#9%FOc;!b$34M(!Owp7~U0Te!+t$ ztD4UDMZuyc((7DIai2)RM3=>jFi=!>g_XYOh$!WVBd3!O`J3bG&`)_^p<@-!8_J|z zS+G#?LHgc3M5}0ktWe7`WY!w)1&fTh3x#gVkLOzE4D$^a`T?`BjHyn&%Ozl2t2L5j zinMP|Zz!N}JW-LE8m}lb^awf7Ox^L-QkI?A2QBe1_ojYJ#K2N~?4MUEoe={D5{Qzw zJ>Rzm=f^`6kLt=XlQ4uef*?IFb3J#ld39zHgD&Z%QVr)zk#6Zr=1e7W087I}AAFz`n6`x z^jktjw5CG+%{JLAzTW-i@PwniSyUR=$U!aELz*$w3(*3uaDG1}5G$Pg5h6mxnDLaM zv}!cgWeh`5k-9X>ZrUXTi&TNy9`-~p4eo(DAHTEpNuLN33J7msCMC^4{7dzhESX;t!ur`7_UUzM%lP%T=NKgrl_tj?lUUl)ug=9{=Pp z63WQ4O)o>pAU8M!QPy*x8Vrtty~ zbI8HHE@l^SqwD=jn+9#dr^)mvR{z0-#t zx(x7*PPNSPrg9}@K9tn^o|KoVvb*0{s#P>`up|nzo%QVy;~w=GL;AP;sTmWP!QtDp$N zroM~K7P+O7K&*_#%uACofudDVs3Md!yB7H9ZvJrQoF5A}rjSTnZYa)7ceNq@FdG0wV(3t2zj2{fGAs`Gg6{F1%{eR1NyO+GE|@>jB_;n}RgUzUtD#rbxHse4W-YglRm>N4qf%lg~Y5GrV@{G)8vDdo{s z!OtZOJrY0NLN}2a4Q=6?+7ITmuSY1aE>r{1KXh@VLdQFtj-MOoZ)LaffIdRfdfNU1B#$|9nK0f4hSN-+n{Mbhy@@2qE@CfM zd(=n##YX7K^I?~31#F$=Kw{X`rC8?=sta;?2KGJO7`f%!PV2`tmuJVoPIpzj51dZ_ z#{+yf;EA`pHk6UI;lKIjcl9qUqG$Y*k8G?R{~u1G$7A|EEdQIB82+vp@tFTT#`Jf^ z{P!#y9?QRH+3{HaUC}e)vHexD{yk66_Rk6b+=reHkNvN6+3|jV`}ghX@#yLQ8fX0b z6qdg$dgi}N28MsH>o>&F%G%o)C>S|v(Ei3jJX%E~S4TWraVtF&Bf)R^eu{~%UY#dslj|3w~{H~OWLX4UuLUsO6wt} z{Pb$;I^4YPXGN9uj-E7mZCP9T7nj~#I*T;p%aWa&s?^24%X8WVTD>4=Wm-)_bHv)3 zGi#CiY!&>qYpt4$Ppdn)AOnU10*xX@0&CzKK4jM7Vqg136;>Tq$41DLQIO{FFp_}~ z!_z0L0tHD1&Nywx$heO8kjceFFE?1z*LbEtMO75pX}$^z^0B5_ho;=i}8m0 z?Ag$5pYh!b0b-pvMtyn@*rF8T30ua%L6K1U&zAQmsad{!B&ZVdKnhrwNcBETB@Kzx z(kf+M8J=JK8QR8j%^2VeN(&+_l|ZM>aq2|K^R_Ar;iebM&t)|z9TAq35(Y$L&+qHs z3WBV+_$2f*J&4BKAjKXa1(N2uPMLtz8iP742ar-wC{Yy(5v~`bW1fuvy(t zHD6qMH^HuYYHscNX;UXhsL8H^dm^B`*4!+)y>*!_bHFf(Doj(;(V($!bcYS4!omO% zuVN)Od;b(>a~0|TfzqUkDPSg>{+0W#A(LqflwNt(APGi?YAj2_J+G$_4N}-o%lY2o4&-YNrC+k5cNTih#OYaW_))|2 z<~4g+Wie)vEt&@AqtZv{^@K)o5r>)XchK`0-4*UJ?ly1*J0#`-L)_5(QoTL_O-Pjt z?$f&JEVS-q5j)w(F)Im2zsL|6(ryWa&En83Nhi?N8j!PvXNQH@ySvJ~155-mP66}1 z!)t#?!;;3Ul!vnpD?I6{eJFk$D+F5V4#LnQO`%EUF)rY4i64pvtK1WFj#QdZOVys1 z3Q_NwN2zYap@hVl)`tWX z>M^Mr0Xr*sIIw-=m=idc3JIsqg1=@l%dp}ce~|613b?rCvS>#8eK^3{&;DqAN|W|xcd6Ag?BRf)46k{a=1Y`UAn8A z+8FUi>ku%rY>nkNj>r;xd%tNFCX^!`cs5K};-B%qGMnp40wA3D5%9AujP3?p4ymg? zjhi%^?!422=->nOX7NsNg4OCXCLa2TTLljF#YvgUT~0DQ2k;Qk4tcrFE0$`^=?+tqKcwONJDB z>Sh3W+QqJ+fvK{1bPYq9j#taHAe^ui^mxSGCJhq;`>n2szzu^XG2|TZxxnE}rQS%| zwk@2i05qN=OI3$~lqt#s^m_X2dJqBk({b?VM7|mH;G&0BpL+ATBrAEi8Q)5bcEMMq-G)FLMx1Z=d*U-m>2s7v{oVf3yM1%-5gxBz_80i8rUUU429*mLA6lDM5Xt8gq%4AVa4S6rQc-9aml>4(3;nPF&i47d7?_ zEncXJWHGl$6=|Tzvh^5UwAIlO8{R_6;|BqyoeLs^$|7{WIir>7{!n$r>Pk-O{16R$ z+JC4mm|ZY!YvAGa^f$e;8;imARHCwQ?AnisQU5e>vvzm4zSG=+9aXS%rrYQiz^Hpl z=e|S#T-0gK7H7`Y1uJm)Pt56X2gt6`!+Xz~_uy3;NhEPja zE*!~k2B=&a`LN^#fY>B<&6~LClLOBCwzS?S&B%n%B>SSUdO)BlsYxN<9SHg9fb}wB zDKvpWoy@B$2qHkzh0T|v>{l}ZZVcq+w_c_+kopVA{+UZ2PM3~KGy~R~xQ97TJUIka zL{Um)`h;7dO*7wbxwvUrZKt&Y_UIs;vc$`jM}FPGN)lb|5qd&$)PfolF|Cd@TZ5yo zl6$PeO->_qWGg?O@7UBTvOHZrBpZ5tCrX{7g8Eg2`w;8F+ZNV4!wUMus9nZ=?N^TJ zZUMeP=(c{X9t{BhK*y(Jw=953mDbnLp7(SXdYPzeJ130{E4q{E+~5;y)i!tbJz5&q zGrgA1#(vII{lKci9@V8~-^Wu8M|7ufkz@QLOD9Clu(v-iq%2>BBmY$FG^ugz&+rX| zqSH_j$Ksp;D+Vf@Gjlw_bEw_6D=7P|*2IW6IGhf)AwX6a;d{~%`N4f6ndN2 zgT=Dy0qd2p<#a9**+7bl2 zYQ8odchj6wih{Mh%Ea%KZ-Kt)CF4fMfF-*B>_v8mC@2+s34@pS*3@OY z&q3NT*dkaY1V_NHC9vmva~8gj6MII`K7Nb)F!2fACfT<_*M&~bZ@g6H2%xSRG~<)F zbiZMLf(tj8aJB1%_S$;Z^)YQmSFBKCIo>GscQRPF6Cd76v}$PbF+<`Q*8;1*V+0Uh zvgU@84V6qdHppY0YbC4TUbah=&PzBK5Bw3KREiWUZvJ5Ux5kDhzRXTD@Vy_;k z1T=ne;IpkFfsg3_SPA#Fm-a!L6)T@>%Z_yQ9%*`M++y1hi& z%cU{i+ZuMF;2fpip9f-5;kS)Yw^Jq=wbGUF36o-Ss!STuSW^(jEYmV$$uLqkk98Rt zhfZeD2D8BZuE${?>@W_+dA$DlAW9a}hu2&9BNSWu0%}rz9r{TZ1%|PTRR$8#FMt5U zfDXx|YV|F>r^aOW-G?5-_zPE8wTZ+^GpCUW2L+A!VCeG7xc|ZC3)tgZ@8*9{!GFox z-}3X93jU*g4F8n>cpt-`g7%N({iB0_=-waJ_J{5LBZ+?t9IeP768Vqd{WihBw3HR^ zxA^^A5t;Dl|8h?Tx_=wz|G5JGzQi9-;lB+GSegH8U@)Pf;jqSn_CFP{9zPrlk|3?a zal@6LcP9a7#LQr^x3F1^TOD#^)|YZjw;*{n>R4|+}=>ZW#fh57;aY^X`& z%<(U-F8~K98wnb565af?8?#4mMs)W_quPwK74I9fO)1ar%o6$9mD!1@_m^ zKCZwaUX%pf_u84&nVM6UthM#3XgjzFgZGQA*|FUb5^&h^fYnDxle+rBGR|BAEebF z1R)>1Y0U>4VKl!U^`g+4#k+NJb_h9auPCfyuxXVt(crGM_<|#6 zl5%@kRe`QD(c`>laeml>K%|hho2NOUF+fp^%Fyq`>JvSM?x$Z|F$_7();y}a*^MPH zwp}&buR&SQ$6A=gaS2Z^!!Sd%RH+-rKXM|{DSSKvDW*RvK6xISoVKojicmvvSlAtS z+?|3vceJb)m=|wHuv#!I$Q>`T?<-ZAlP5+Fo&`uP!Oxby_vyi!V&4Rs27E&h`hiM^ z?;`1~$(Hva_-PjMX`lU`Bun7?UL7{hG;&KsU9nx+zC}T(W}o0GqafFz zhg%rF5jelZG%MU@td>GD5`Usm5(9r>9UDw-vJL}%m&K^D3}lh86%+^c{9U^;Oz}V$n^?z{#-;kd9?A4~{TN z*GqE*>FTu%rh6_i?RP#TWG#g;)Nh0IV?Q7n)gsN5=xf{hZVI(%Wzq{49fVz947yE| zjcF{(gGa|rH~IwFa&J5&X2V0%8Kc;P0Zl36Np5T;k3dy3LtcL`Quqq&6qEkLR^2Xs z?t5N&+}eS;A>=O$9~TFd;bIn;{Y1l+p9Sbl^@yS(u=4bTTT6Nk-DFP-6M}c=T(%Ek z@|%OFEFHXtvC|}+#(nhQAl39NfXGEFys@nSHK_)_e+mrxy@GTW0u5SSCF<}<<)ui% zx_S`>zs?zN&1M}VeHKMuj_gm1yGwkWiD0xEPpdf&GV`p#8zjCp_k(r92@SaE*(0Sx z>^Y?Z@g}>_2Cx6%tjs0p$#LW~@4GO)Y{hw(SH$)B)Jj2W$;yn*UVV+%uzYRQ6Lzc6*nTx0J=lrbRFZ!XYpPGBetAuyZ_n;sG!1|FP3-kUQZlw}SZ zHpR=APv}dTMzng<6G)73Q-|=YOJp?QDhBE@865%O(#tDl?3&qEo2MVact|ybv6$RC zUz`6jJgi#w)-weItr{kgb(C_Ab(SU;V-XTG8-y5J4P;WNzZi%rrTDi0Yx=$XK)k>8 zYZB7{%!V2_Us2SpwowT=VraKPs)rxK=(`q`T#Jk+kGnn1!skgSq~k>2fN=*G+?Wv? z^GmHNO@IA_VK$VA3GNpwIE1E7RX+5x%7d0!g7o9jLsf^CQp$mJMB-Uxxi0l7OHgBV zm5P(cfo5u9WUO0)H6zPl;Q4h4KdLTT)JCD>WA(-BV^tN)(ga8M=EnTOI-gyvzn0Qs zbS@)8!lM(bZmlSs_=Go+MW4Bk6W-HkMIU1-%ooGivI(K#8{J70O*NX9=k}!M%`}bv zZh*9?{ZPZ$#i6~OM#urbie?A3i<8nO(^l|^YY=$`dz>Y^%b~MN3b3SuzsibrkBA(k zkyepsm zoRK`&JBUEh;1nKQw^Rt2u^pIB*prn0AzS@WvuSw^tV8wv*HIKj(|ho{pj>V$I6hAi z3Sj*91zrPm64>Aq@@G<#uLj!0iegP7ftP2%XNV6y*V^8yQ2{C5AA2p*27T=new3gi zifV>r1g*Z)J52s^Qcxm@kb`C~WyLRLh+V;I-~&?ZNU@~M)<&>1jnr%nv>g?KeAtl; z^&pH^nq7)Uc0R(^oVwUqI)GOdU=((18%mAjF7OJQ9dI>@Y(5k(D@A?=r29!5O}xKb(oW>W~A;%M2H});g_=TSEB31 zm^S{73(??O+sFF=_Al{X67ZX+Mft4rqBo7B0F4NZK4=iIF3LNtT(_b6#vUqRiFZ~u z;odLkJs`jt0x(T$;3EKlFDfuLr62@XiCKQuV1t43O{>;~LPVajv-q|oEpf90wQhtG zn?t;3ubbzt@7{eF!WII%K^Q=R0IMv~msvQ1qU9q-pL|a2UI>m;!Nprpbxe})2&uQ# z>xo`N**uI|anh4jq#yHVorj@{-v2U&RIyS(vq^A9$W=HY_S{Y~_i!Y>w7_52TYLwN zABKB#)!K>A6XrEqD=avUffXm{@AdB4PY~Dt`2p56vw5P1j>V1tDf}pMU@7MRYOw)R zPo}(x8zAiGG26$o(}$IULRd-WUm zN+-WfViGoRv_a(;%y}V4O#-HR55hH!DQvzdvSA)5%;!DOpkw|Dv5nSHo5z@D;c?wr zRX`TG`P@-@6PjAX&W+86&)vc2=ib+}xrO5Y*9U&1{U0R!mk;~_>Hk3f|I!Ekuz)|4 zo`2Z?58(fY@)`aU+S7{s0sp_r{~rjlj35IPnAHRv3{|Apbnv&ISZuPDl&M3@DU#pHT{7g-CyW6}1gg6G2EMF(pwlynrYxy$GVe6vP^m$Nw z@{aXYL?M%NTxIdzSUC!vds*=H;-f4;TQ0rSaPR3(#j3;>6)GDKX3eY{O!l#lAE>p@ zC*`u9iP_lG&lzg4tH?eV;RJ8jjWlq3e#4EIBkRrw|UNW zs^ziic+{kCebw0Dn*r)=QEWEWo1hTxrvB)mANN(&9aoJZwB&M+&sdp#15Z5~Mp7bX{qyb~r zYkT3cpYE(llRD*e=hX*EjM3Uc#$A`CN||a`Z;J6UCR4fS*a)DeQSB{yx6&=5UXp%m4WBuNBWn8wDp>VofX_#sKIc4x=KNf)b)mzt9 z=8HViRQ#x7n~c|IKKQ6P%6EyBkg^r!5_dtF42LynVjx^maMtYE%SYMoXIk}JuM3Z` z=f0xb^n#Lg!C2Glb#USE0t_{Ll*y7)0aaZ7mrjPDGrRE*t<+@#_JfSeC=>Zuhxt+*T@)pbS6TZ0DV1{bdjb z$(}Mm^ade7MpY;6nYMZ)e{g|lIs&CQ0R$xxzi5~QlU&chsIVgZ{*PlhfV5N`Z29Il zmY9M97nkuvUWP*))olca{SZ4!ppQ_D#9zAzZ47LzWphzi;)gD4CbJ)^mu6f-SAutL zpKYt`_~?o!C}fi{4{;GvB)XaWDrKRkn56FWc|qE-*uiIBn~kKqujwuy8u)h>={052 znstr3R=!gXrFI6)F@bTDM}AaP_KCHkOW!=Ux}-2obk%ka`+G(LGOB0cbuip%kT9SI+c(bu zo=J@*OKfc4lK$;&Vs3j`U1Uq=(3il__do%!2C1Kt*@8Tbk0jYgL9F#b*~p8Ka6AZk zciUufr=hl?auIgX08Gx-6)`j9lka|8+~itC700bGh#0XMKf&PdyEBzpj*ow z$sa-b6NzLH{Fc10tUza)$0E1$xTG(johKs~-P#(h{%l)3fWC$}5z*j%D|n3T-O7n4$h1fX z$MoX0!>HuL8-Qpp+0XAa@SltE^SS96(1k%AY(=15>r+rHSLBk%8}ayQ2vN5fjQkd| z-zct6I?bnJdSO~h-pJhS$ntuFW#gaKBQT3v@gS(^%{E)|CL^wxbVr78y`Ar%O4ReH zHg6sYU1x>{d4?2+@p;!$I3$-Fx_mFqV9>)EdDI&28ph1j%fN75+5ot#%!dpF_r;hU zk5sBUOLMBP`Z+g$t9yu7 zVVlXga(~N*ebA#djEJi%WD>C1WU|A|kg>}+3}dH&e?+Jbk(iG$V;EjHiGO5k1l)Wo zr75(-;Hrkf5?WLY^%*v~v$ zPL&i*Ihh7{u;@PnzqJtSc*$EC>HJ7}c2+tdyC(sbfR+^2t!yUJlgD1OG=O7H1tu<7 z43qwV@u|K+?6HBN?W@(pB+oCe7k+}b*^)0Ec^rG_4!#q=9;pBj5N)8S3F3?JQS>9! zt*}k1Mx>WoME(wXip78dYsX`*fGjj?z~pA9q$>n*X`LwCC}+PjN7o;$8vgi~l&eJL zHv;5e)-d1Kv&Yf-_{K~5Z!&!l0K{Z zQ?EBFx~i2njv3=-p(>Gg_qmr))~)rC)M92#@`5gH%*NhB8u!fi;`W zR;g73syHS_h__u?axx@zCD8rA1Ks&~i4DO7l47kcviR%qtpB;%uBfW8rk zVBUh4E3B)89)3wbEefo3-Lv!+@O?2G!9=VLPUixkygI=SJTUPwmWpz@{!n@cn(Emw z)6#8Rd{_~wg0aWF&LuBpQJvc*L=Wqcn^K;Z1=6%8XOBr|Zg=#dIZu$!icEw4_};AY zOow%?B;U=#Wsv%f)?{TVWQ0pnx791l zF5I6GSiU3jS{Mv45QpC<>6&|nO@g5^IFSPdodHYUJOZcU*O=$~?JN;rF?^;Q4ll=; z)4t9&hc^FkiDpRF1xKP&l2#UU!?!sti>QGV3@!@TgFU*@)1}+PY6a=oCfoG9N`72= zoYj3yxQt&WT16l$df_u;UsRJ@o7CRGOw6G-$oqKV9qhrO5&Z&a-xkJsuh4mEy$jtY z?G9oo)N&Jn;KRngI7U38k7s0zrKwa|XOWxOU^F5vp0OY3hmg!Q%O|Vm$y#ja{j3J$ zTgHL$yJegw7bf0waW76dO}G1qK!~=xJEjI^Gnl)Yxy`S&9`sa0M#obqn%qDKCQTlh z`fun7p+EYk%eq5lrI>VYfjOS+=hl}F==l>6D`At*-{8#sO%VXlo70F%cQe0NGjPu* zh;HCngghEe$>qSleJ4q+k|W5Pj48_C^C)`9pceFfb{D|yg)G=K86B4wg(#QRA+UW@ zvY!XB$Zr-}dhhj&-zE?bG8{qIjxs~z@ax=vI~7yE1vXkosNYT*=u2EK-TAq+{~2`D zF8`~A~QZr4$G~HLpVY4(J^+pPtXg zG;rxaq`^u0!)XX(@927`?Q7q}nUVJeJC74)G@UL*<|-rcR)W>lnX!FjAaMn;dBldW z-XPr6f9w9l)+h7Q0LPfjen~LuTtoo@47JNLYs~){den)GiCi@O7Y!Vw{?}9|4NYlmc76H_AiP2-TL@X`M>nre^mGn)BPv!`a_!kv;O`U(`Ci`ee3@jZv7E? z{n6?8k1YQkc>P}PKYf*q41Yyp{}(F!zuyYUO2_hFS|KkqB^}m8kh-p_b**(*dh|Da z6{=P(SKJnqt#*&m4*0}le+5>@DjI&hU1VbdFzN;X5RXpkjoCr?2Vma6on?QQ`OK^l zhx1wfW&2E;?4PW zTy@oS76RMoKU^>HLf%EF>`O`badoG~X7{?3I8xZQS>62k*sssKMRmAT@7wWO$qr4r zfCqhP^06&S$4JgcrYs;_d;oH=AlWK3I%hm=q59*_Fk5NG!hc**B6|dBpN6sY9J%>d zVUN|$)+sE#WY0yq5|zGj_RTDO%f5VU;gPLVroEk*TSFxOVMC#hFbyH&MD~DgLK2DU zfn8TODRaZP>&`O;VHX3Y9nBK60h0c=uIL z)sGflrdqx;&EX`#ZUJmE)TquDf@WZM<-)N?gaRZ3is}Qy2|it|Uk%(Y?Gx^pm?QMU zj5#vBp5=i?iX0*G*bBC%y88(bh(Uzpj5&0kDI6pk1v#ihrV0>Fn~KP)yJkV>T+p_Cv23;1Q4cKtO5QU#&{R~*Gi zh!0YCEW~)LcuiLaA!iI`;BH20zm4Nd%_!a|M3y0#&le`9%Qp(#0?+d>R2mC#yQFf* zp<|lsnk7kwdv-Ip;Y?xV|Gd6gT^}&bIRvGajLAp~UgBTklfTHC<_eX*D=xjAosNnW zM?(C}fHC8!RERt#oCtO>vhiL$I`(v$;6-$h8w*8^gpiN(My(9^zF=Y%ElQ)5pMcfNiFzGvsJ`M~gTAMBvFVM6Ds2EVA%)pH2UlC<^pt;m z%iQOX4EVE*GuxaV7Q2BWGQ9{?(hL8nST8o4%beE$U8MF*tYASM;@N=WT`R>B{s|~p* zhNvm<0!a9s?KuJM9W`LP`nXaV)e5I)4XWd?Y1OLCf_C>~wLUyv_IFEX6w=Lo)aC+W zb@~O5bfc6x@y#gX))k!I6I9B`MO>KC#|O}b8}LzwL$2E4B( zjQ3pNB_ZAvwXhpXP;hXR8|LnA&Sq%uLN&bi3&|<*dcoOINXr$god7w^_K|OK9l^R* zsmZ_tRkdT}dw>2s{#k?Ii)9tN3WLTB9ZW}gkUJM!5Uey&QUYVZT`g;ppXLz87nPgl zSnbdLW@WZ13&CVtow7dMn|VnUw|^qS);Dl6Lqh|8p@Y6pL6z>8ORvdWH(*(H;TIN*x_I)!x%yxn5Z=lQrVJ4PTCPfNi*0jDZ?A zyZjMI680Jl*GnMP;Ev>@HB=J@N?ZJ5ELG(q=WCtqQc^(Qy}hPfkBMOS4Oxdp#Y|B ze+y@@tw@i|d8Bpf5368-S~lanwv9$NVMwS3IHjvtxy}~=GSmu$S#Qq_abF#!8P_@{ zR+N$uhTxkUsT9&;5sJ@^woGIUWpmF!eT=YHeDAdQ`ARnI7dzO(&n|z{`&Gi8HZCPS zQ4t6QmnVxz&KPEfhYWNsl|}0OA+!Q=VA?cEm24nZW(e&X)3W@Xsib>_h+%zCXV!)j z^Gs*lIzB|ISfpGjOxSKIp}}_!vkwoA<1;g#Z9v4FD99{xbuH3jjSoeQD2_#hggcj=mpC{l4%kObh;`SG?AEfa@zz4H{MU z=wmC!5E%mVV0RKhi;I4NT?zM~U1P);U#J5R8r>WNq>xmnVz2!*$~+w7Z?z?m1VyAy?X%^GCbLs}j3)c4xYi zzG@hH(iel!%RUyHsA4R|ylKP@pXmz&J;DpiT3f(s#HWB1CLy7cOd~TZKrTPW$o6dN zDqOVs&IGdMTz2W)*<#|-ajjxD1hk|YJ1z|F8V~w4xwUu%IfUesZznqT)Wa;IC(e2c zs^%Dc#n>K%_%{pY7+4NtZ?@0D?mB0xh~A59Kh=@?SVR5f5iwmzf0%)5ymQ%*vy#xu zW)kohCt6_=nHDP|yLb@&EEWPE5=)>WOo&9}>R;r=y<#Oo1{nggTd`TBptNMr8I@}} z3Dru$X-~#!R}OHVxa<3NDt2f$O>0eX_%Q>nstz?ZRuZ6$fLdOR=Mp%xxvFQfV-^{U z=Y*{4%oVjAim^7OG`~q#Q}^i@WTfA5J=$jtgVc9+UUOp~=sikP2%Fpx+SETbe<()H zIMQepzJ7f(pa2A7_2T+~F41N>bC6355QYTJC!f@`iw8&v;IG-l8rV}7S`IL<7xjf{ zi8u)CNNMCy;KDUtEyT9D!G=+t_1b);um!O-grl^3<3>=5>AZqRyXBKf%?h1UPEi&G zh;5N&ETkc_oAtI{^@NrzH(jfHA(sn}GTxNM<#x4+mE3XqzL#QV9{&{&3YvyPq#nLW zi6|r9;D5w9@&Wkhc*J_)zv9naZ(Y6LX;j_2-%AX z3UMH+m=A%R`=^_;d_Ih5EP?b!l^SIhy?vzUt%% z%ZlS-+h7h&8)F7%sO)~2t>+?IB<8Sz3+yYS>Me|>{=yJk0(4|xVPbuQ*_EVTUX3{u z7jEM3#xCAF4oz!HW932BN^}|$1?J^-+yl3q8&+HL9XZ9TL{Il>rikC&JG5!PCzogW z^sYUko(szsJ6yRpiX6{e9%E*CrmI9?d3sQEnK#1&on+6`t^#?Z$fTjoEBWxW)E~Ij z=_H^#mV!`SqCS@-vIffo=Bg#B2tT&CbcDW0>s#C_3I2d#q zjj-@~3LhS@>rd6==b-m6nytOlV4gQ5lH2Z!RUI5=&W4A2C4V+Op>r|>B zSB=|?(Z2P@pbt?YFs+2FA%;<=%q`wY)j*JExdX$p>fsRI!UYJSsp zu_)m=)aT9ej5-A;gH@ut`CHZT{J`#^Ywx7O6$dd)Y{j4wn7vq=}t0l z^(wc&N=tAp<9F>3K3r{T?dxByB4#+)+81jpFMOC;(tbY`!$$%b)I0|ZNc?arx6sM^f54TndUzgv-?;pi)=9Q#;*s?mJC#C!oZ$&k1G z2gU!7Ev^4i?Ef+N|DTrDKg9lz7aRY~qW=i4|LQ}f75Ouv{*N01f2#jKV*iKjGt&LL z?e+g$=6_$}kFAdXHrJ-3XZSBNzkxMkzc&1kU7c&A8@0lJwejO%JM03py_f=1BMDoC zhYv+4Prx5LzOJHs>I{}I02Zl^Ej-~C2+8%>`{OYxVT;r?z8{w>4&?JN;RUMe1LO-W z0hgA<$6NFmgi$ChRdc;(19MQU|LAOsA$-}fxN&kbam~D}p7y$WIYj2bQ6zP8k@Zr2 z{_?deTOPhPT`pLasjYsjJud}}UffoJJ==vQ(>3xy43AcHfiiE zi`TdR<*@29KCiuwK#c6`kf63s!2flq8mZc$Pzk>Jv$yXoB~T7tz!oMyE#w7bF}9`_ ztd`RzUkvN zvy50Fowm?Kk>2gZwnz#^FhL&#fEogAM8rTnsv(8w%?IwB0}PZZ(Wo%Qi)cNezMV>X z0Pl1~Fo~XCN}$Mf6pw4C7DF9GOkL~#L6A`0%Rey37G1Ew*BUXzm66N7aRs|d=lrsG zr0PJctb(~ykKSg6?QkY~47QN-BG>4**vyX0BrN9ega-r1maG_H)UVJJ+Nmm5sF#|; zhalu%57wDz=B`nd-zgIR3Y>G%_EqIn#A4`_E2=ca=uoB|H0Zj zcvr%Ad!Dgv+qNpUZQHhO+qP}nsn``;6(-8FsRs(1S7o;!VKt@9t`WS{-nU;K7H zXfa@@nC+Z=W!=$46Bc;ru{rC$-^RVraSe(rkavi?w#Udq`-z#GEKn2|CX9}B(gw1c z)7;dmrwqv3vB~tSUUtLN*{$TRAf#~8GYoYIPPXg!f47+A%bo#y+vXp6&+k7bfUZMV z%0*TAXbhWdfs}>}13>s>E~xmh4jeFk7ezSm9bt#ub8>~oX2ggD9H2dy08WTq#)9mv zduod%+jMNBJn@SA*x0I0EXe2Aev;O*d%59YD5Y_QR~l$c#_uO zc;+9j{+>VQ13qlz={obhs+f&BJmY)JM31@v zLKac4+y;YcxY(SZw|D{m)I3B=|3baw6D(q)^+8?IgYrV>Zo|V;q1@+nd_M91t_LHFR0+kpoDO*T?%aKvB(W(LW)9Cqz0Tk;ubX*3Y33 z>6maQ#8X)s1YWtEi{vVffJEryflX?aHxUHkk-iec7`#J}vz^Q@tL}+the-5fQ5k?n zPA#@vIJAm1S3AvZOGU-TQu<)4h=AI7uh3MPGQ<|UV5_0@0a6UH-`K>;I``f}d3;R3 z_yJt=+hwjcvakh1O*82esT-)Z3c*xamOELh^yyBfsAYNg6as&=h(R%5QS%8y%& z9S)N}f5Uu+3)zTt+Vr{#84+KuB;fk<_G;wNEnb;y`4I0xgTO!%Mi`Gq^;a6ob!KDg*_A@^NnoBf4tWId1hg|$`~6nZDQN#sA33+CQCd2N3`wcvE2ne z6);VRpujI)2-qm*bx=2UxZRK_D=p)}7&s=|SpVS|A9wsCI&+V=7Im9cgfsmarUa^| zNSxcb1TXdxZY?`p7N3LK&BtB_ogQT_GFHWIJ*K!#`eb~Y%eSz+Qs$Ho9*e;Avzv#d zgt8boo*Y6_h&kTA=ipA-Qg!&WCJozW65bX(D8kWidAd53WjS}3{)9yj;(bJsV|0n+ z=*3NAQ_Y`uWzDmAT3HDmPD>n}z!9TirgdS^kUGUXiKbb*3FY3r##AjCP@8T8ti+TUSO4N%Kxm z8}~^rKjsy2$bV*&yq1w`vPa2|Rq`?o0^!ZKE{VBp-ImwBjXAICd^G5|aakbXTz1}% z3y`HuyZhSmaN#Yn%%M7F7Co?tovpXDsNIARkO9PuHp{UtqS{4T(ztV4UQDc==yQpI zC<^C>T~5Y5_td$)6^8a5y?%#2<}2fvZF20$ReK8y7~nxXC%uk-#|o3-u($&C{w$%| z3LA0tXrrP4v)M!8o|n6tS_ zK7@pW2Yz0JRN_s87zQa4S4SU{|s3HiKmlTO*$)}pWNPgSjon(%ONIH?~Vb_6rQHU`JG0H}sm?67Ny zAF(%>3)k(v5(46oe5JlQA$7U-@~*W(kxK${=S56MjmPCiWhlKVqmbBGuDPYhPzFZz zL2^HBLs{91MA-I`+Kwv0Ml0iqyuvt9l-RoIQ7Y(f4Ylzd3poI!UP-bi zsO4A0b3%=`2HsiXc&cm~?k+x|D(6Hf8`GTmu>=JF4c}~_pF$xRK!Vk3=94(oFxDcm znFc(R1#G7u!LZ&dy4Zj?yNDDPIGre=T!$yA{4wgAHo24`v8MJ;CTV;SjR8p6auR2a z4VmQkeB~m!$pcaOBp6gJyKUF6RzBAdhy&kNFZCKpqpKgpYCD1OBaRBXHqg%{+No8I z+i$PHj0f(OS_*C^_?bzUoj+#UQYvufaI}Ilf7Rqz`Z24GgmB#_eiU5kXMB(T7Fmib zpeH-itkg=0<|`Guwft^40>|GLW{Q2%5An8!X~nX_8ga{!I8e5jksW~ zbSqnvH1tE{wEc7A9d1MK>j7UB560qu#vvFHys{f$NcYN7d;r25|gq<^cy`QHK(6BF~l0n!NeX5(h-ZI2#d zp9C|S{|_>uUieWT{$MLtGzSY_pR@`J2Ri}Zkz|0$l9|%*=`OJolFwh(eTxXx;w=oM-UN^(#ly9>~0j`>OCLM-!aI$M$@Xd$6xG*H(Eu zcsbj;?9WWp6_HIQ)H-*emT;}4 zU*Pw#(s%sv%m6Hj&>z(gunjIhZ4Q4kTQA7QTwh}pZ%~m<*o8C98)z_T&8F2#VBMgs zJ?lqciH2)&9@2cD#*avS5(obhVXkD$wXwe;RY5Do0a0uisXCnlVl(R%F9eVZ)PYP0 zinFX;QmpXlvOdRkR6*&A-B)TvCw*SXdHpV$;+L^lZ#ROA$K?%|NrN>rxG+01=ls+V&Y5-Hy))!p^z*Iy3n2ih$b0K+qCo0)1zPS%X z6LxeF##9n2wPKyAN!p+5$}i^&t-z|DS(0=bEmk3ix;0!SoHk6WrAiUN5vK@Cp<&*(g>gL4SX>15Su z&3|lgc(qx&PpFRnX2HX5PK6j2vj@k=&S}3)IfB@00p( zLw2Kw4tx&Ir)y+B+-Jw)Dm#J%KS+IqIche809E63;({=&D^wid{!r2wB)8*ozA>j; z0TKg|k6i;byoj#SB_PvU_rtu9&_U_ORrhAx8QdzR)Y}i(@l80lnM4?xz><%|^c=L) zmNeSw5AMd4^YrwwmD7m#51`ra1IJy2o!Rlz=@+ehA26Hr@gV#V83pV=u}c9H2bdrs zIu-yqcHg5Ne~#}2J04>m5p{!!mC*Tw{hTn*!=XIInapUW!F?4BuL;W|a4%)pI1Oqe zKdTBbp484R?#n*cZ9Bv^&1Dj@m-Sl^BLTTOE z=K^#Jawz;h7bKgl<^V<2V!R=XujV^)kSTjUr#clZG>)Kjnp`23=3X#IW`n9Zksb`} z1WY$(ez+hy{r0Y$mIs0B2*Lpk(YcF3jvqPN2j#l5=f}OWT;_P)#QH4aa!b0lPZ^pC z!!&>)WYiGfOuzzs>h4Q2vaBxdEQ|*kTHX6I!sH}ErBZuTA{UYfRQ$@b*H~paUK^)s zsBT<)QzXmOH?8&h~kZ*S-{=FyeloVkG z)MghqTzn~soXh-~Fi4?L80}j#a3NnyB^-uR;+0kk=`N=e_mxI88%JllJC~B@`)TYf+a+uG1c*R zszpuTYPc@)%#<)0m1_ZtT(CEMd!aY2^#$;D>H{(QC2jJrOeY8Lr_a5`JE-sB%= zroq30>Ip`KT9)jHqZDY8`A>d~?Ju?fXbbL}TmkgP@VYOQ)c`0rTJuK^L`u=X(`cn% zmm+|Eqc%>~PT-I>6+qwf`nUpam{(GdSvQUTp`ZjmEgQP4{*+<={dBK?3u?V{lPxT~ zAsN_&RFgA0Dx!!eCd32tfNs_PE^G;68{=JX3~&MoFhAn~kywt*5f9Fld8l5yUARIn ziKADwFctPzg^}1m0oD^@N2r%2BhGRXF&Ej6gfN6<3vRbhlBKTewY#oNSi*R&_yPV0 zlcPB%qoHPJU?Ff|3biwsNq$f`iFGY|_s z>A43H4MxoJQ6AR}Zb5_sFU*F5=Of8wDT79j+uQ8xNo2I&woSVYf9Fe>P$*4*@B>Hl zTA4$LcweFLHE=(~kv=Op(sVrt)~{8frX@2bIVX1?6hOQwotH56j97 z4F0j8S>4K9J$ipH0e79t&e)QIOxoyzst ztBZ>aRrWh5EQ&R20oAirL^KEFvxVMmOfj6WVfUZFE)&JqT@vDQkux6XZ03=nF{}x! zsW}xm-y9AM)+qY(w2J`9H$4kbp5_?g5AH(MfiJvvC5ojp zju)9S0hTWTybIHrR;;8(W=4_$Q3YGupM)(+nVb%L!|@of;3$mqaQfviYp!TZOyaW= z78+qOzYjf?xUuVVBnmhUOc5A&!!vqH1|+c75E*un=-@r3u1xqij7~8XQDYM{=$?~9 zi&Kf9!@MSQaWFE$Wn4T^cjn ztX*LdZ5V7Un1DolPw8Dz@FG)`j#S;n>Vt_fJ)cH}i19HUg-;yn1}p&Rtz>LuwuMU* zNK`1WmMzKa%y}D96rZuTxJ-<`5&k7`a}F+tBS}KXx0K|Q$)>X1#X$xC6F#brt~br* z_>Nmoy5V_=lAm7Zk`ZXQu|`JBBRIhd(7)RVd)SXPJbg>yL4bgUNMe#&8J zIl`P(w7}^sBL-vZHV`Hyq5)~2TNsBls934C>o&}uKenoTgn%)FUvwvUn$!nOZ1u+@ z1t{vcn8M1|V;H5gMONR|3~wNeMEtL@jKD)sDbPvB;+x(#z(9j~kFNE%b$axh3_nfnJ~Fu1#xj*$sU+1mI?ch+>utKTe0sih4*`x3DD_p zpl5F2-L_$B6j7a&p>3=OZe*lv?G9zvgysNxkLvBNfYYB&`N{kIabulaXsn%9-h(*~ z#rmjZ&cLz9CHNK4YkBRwz}wsfdQN=6Fm7_+-@3^Aj6BqrL3O{Tctoqh-s?#@N7%HW zWSNqsxh8P>R!p^D zQA{eO4BJ+(Uw>V2xIe~=7OS3R+TX~(rg6f$iYz2R~{U^?V*!%`G9*yd6; z5!c;nq=>GkM&-_(AZ^t9apb6vErh!MkV*IY@YeIBW$+Ol0*&I~L_Br8*l8J8p-vSi z#6e9dbps-Gyoz*eX_+&dq z`gls`_@@pUZXYed4^jgBq8h)d$)LJz`I;kfp&(uT!(%@1%<^V8#zgY?*H9a^<=&e` zgw3E9Ek4+xkCgydbkG55q_b3@5>LnuRmsWRklll{r>~lugWqmfFv@_>e_+0Ui#Glj z-LC(K^!JC?{(`?hJuZI{-#;5;|7O3x9I#CPGRFQlK<~e7Yh_|*{P%?C^6z?=gH}}E z>pJ8R?PxZPDZ(O&R&P7cH~`%e`Qjtzrr*|K_|FlB zJ9f2ug=T%T<~6{+<}*xh=(D!!_RhV2eK|a>Zm#R`GO-mUt5ce_!P~QsK(lt~cuU%* ziL_)X<)B=6OfsiZFnt|8fxC}7<0%BnL&NVQ^YPiV{r*lYg_-z5JX8u@w+fXnFceKA z8D+ZF@{#t1k{{k8i_=m}Sf{;iuK7Zo7<}6a%d>cPOQ%GH_{8zZg)($$@;@m4@#diL z!vu2^1==s;+Da67?83W?mObus-+&#Rs3P$6E(SkJrGbv^_ir!-yo&pb0shla7m(2c zl0uWR?ePz?uMDLGlyC75XP-&~oQP1vB;oNt3&!|O&A>>?;w6!+OatxrAbzIjw^W-; z70ZAB>|wbh3$QAlA=;T%B5Nup0sR^4&0OdO2*02)iGs*8qlBo?V=U|%ah-VTi#5VK zisr=qwsU=4uaQc6Z3w0h`AxTso|8w!@zro505>3o!JtQE&-krbk5{?t#GCzuOT)br zo;cB@KLCw!{@gXJ#TZjw19BKFj#2R>0oLj;49RB8_xYvZ$AJRH6C-C3Xd+D7q3y&- zd#5PpBuRi;@gS1Lm_{KCX_lm9JErl(S-!y;sV#$cE11)Hx_i~pH_@gwq<-U`;VwWs zW09uNa7^fQqbt1~dP8d`5^-$RyK!06fQEuo>(&!aiUd|ZdPctL0mF+PGJ2iW6xtF}0nigT@~; zPe%uL@^#HyKP%H5VMWip>$IADN>Av#t|zXqs~%ldex`}6O`WKX$sgyG@nvJ%n<3!@ zi0^`;;>i;yoev;ZMjOLS0|;IuXot~gSQZW>V9H>)mA*KV?NZizu8@j~8F(btQ5~YN z-)ZBe`lg1}97X9>ArZsq>YEQZ-~!QSfrbtM&Pn6MA`*j|X$zXg_2MPNv>YPwG-v9@(B{Q~A}S zT^A*ifgibC)px6jRuz(W?CZXP4lhT|=Z1J{(nbB`RmRi}Zo4Gc?a+T1_TKxdeZ1#Z zpQrP}gx1`T7(l0(DS%esl{=oxMFc2@Oyp+CdQ2jY^N0vDWQ`3wnr*_1w<#-AdC!f9 zEtNFuWSLZ^*_&mb$SD%GJU@?h2rTIfJK)n(;~MrO13kFx%{#90j<5=*>BO-G>N(dH z`%627-jT8P?%-rFPNdf_hguw+hN_qD_lDwgHlwbWwy za)4OO_KeW?TO6bqlh|W~A6F1^p-80$Ns&m*xt$8YXI63VmSDaQ-ZKt}GUFh}U8>o_ z7qM6b0E#}}nY@+7vs|`gj%ec{IUnVaQG=pK?xKWI4^S8I3&Gg zD-whQ?+t&KZrlxM4(Spb!9{s{pfWos6N!sYC-bDWOPD>wE@Qix#5#}2I+KQ{KKiOl z!?xp!V)z8%Db8pE0jmVD_{IM|yef<=fxJ$hjKJWhv1bPzWNJMf=5-_i1SDKE80+Sw z)C$w*>PR&Pl|*3D%PbWy6#D`6cIAA4`KAUjsqK)w`Nt?IkO>$Y^U#IjKoh|>pD`%2->eSc#AO# z1_|>Tu8lsR5p#X*j_J7AgHG`h$%gNis$R)RKex6BqDciX6{^R)%qZo&TkXEH9XUAi zk{|Vvmo3|j^CgWwOqYXw%M^4;T<0AfGGd2}Vk(aS1dGVl##Ow41~WxroHhZNHA4=K zE+FcBz*{dY8efsA{y9AtrqgIJO2c)#7Aj-i7Z2vNOxzbSjz3wlBDXyXqMsAUl`wGo zPWfbM?{pr1B4FE0b_a9@tdsYwC!53TMqxJA2Z`r&F>OjR)GjFzj-TcKL>o2Z!w3K^ zD3f;$v?X)}fK`cn18lc~@u>4HB%~Go z#71NnwXCk?NPqv45KLb1J3tPTz(^@F2Vl!VHbFUS9D}P342O|OjEg{mn|SCR-52rN zu4&{FZ-~RghfbwGP|KG*sNbU%!0nu?X_b`aPae?zb=%C9ys6@$XJid0WJR#`XUZgPJv*H=#Z+kZ=t!QAdC}g-~cJ!n(dZ>Dh|a6c)~n1N?qH* z0M=dko?~x)2q&mP5)RMt-c5qaNuzii(R!ZqIalye`9ro2f50@-vl9_S83B(Q0_&c= zIzhc#_$Ytw^XRSb(!f)%9@*Kogm1JjUETIZctwnIypJ*bnja}G?*sIY9Cqdl;G}U| zUOc#i(9H}bQ3$3OsF9e^p2n8(uiw2|jPoqNAdt8&Dnx33tA5MS4VsQoHkb~IkWs`F zBKL?|j5ZxZ`%Z(^lqySago;6;6fPrC(-0_l_pI=1z+@~{_AVEFFU#lA^w*V~&=c9t zT9cKn7jNAGhTXxm`GZ%Wtir@KGI$oyv*nRz7VM8V#GuC#S{%lO!Fgg@oQ+odX?y6f z-iELu`m;TPU7y~tAsAm<_J$BA5v>m0FmP_!O8$GLZ`_4)exSxba)n0sSmT2u&v*#v za>C;3QLX?9i|2}ZBi!7%B9=t9a^__h2#7;({I)Z5u9%QHUj+PWwzDZ5G7@ z#jG(Y$fxTzG~9g-j!uT0+;|5`cJ$f`?Jv$HzmXA=n2-8-8=Y6bmmSA>4*n|p0_xlT z(fbd3{y$sZ{^%`#cKSbS`k#E;Un&nX8^Q0-|D8koYmfgU;{0WUWBgP7`1kVum(%X= zc-ns&+UP}@IseDI0RQJ3JUXMbwP*UC1nR zpzr1K9Ie*}{!3?eTX*{N6Ze3b3Ig5I^%l{0hJqBWHtqT(aa_c-Cg;n&Ps>M}fpfHnGq&dwjmB$r2zdBHH%z3Xm>rRfu=wJIdg_euI4!z$1DFH|{w;b#u&L6ZkM8ZSM0~g(|Ql`@wT+yi3@yj2V zKey~;Yy<7?!#&q+c0t#kNYOvbZ~geS*=4AA#mn1?ZZ6U+r*F^eF}81kl|A zKtuR6unrI=CGsi75!fsa?J0z>-Jq(_&I=%%Em@=4mk8Lr*b5Cpq!L1 z@M%Tja3>52jeVK+t@<1b&D-2b+9|%qtPe$^y3?eX6d68 zhM6HOxj`00`q;oaM%zyB5Zx$&aJyB?(-ML`y8`a_seZO>Un2|zMWf%L^E>d<;Y}&qxdgL{U@l^nv?UAn5E(CiYoFF>r$m!FfpK^Se zRO;kXJ|8R$_qHNgcxgJdO~xDK)OTP^K6F?^?FbrOW|E@7>eC-~za^T;)4xqN$L9Qo zIfCB3XGVty)T>qVaRMH0brvQvlZtN{*-eGEw33O(!{g{?t8kRFsLn4?LP(T~4^0_K zQr2vWRo0CIPYK7XN9LU?7zfZEMLs5&FKQp5jL$~%E3;*&8xQtJbd+c*(MB zQd9{{(H&(~3wR(vKt`Nx13A@IKK}P+5_1g%2zNCFZL(FPc!xphUmY65^Nm^VjWxujLcaA`BAy+0BtmRM zq1nyKi=e}GN**l$Flo&%&cBmXV9cy91MOPf6uK2&?F;15-EBQ4EC5ErM#cx}^W#-Z z%(!R7{gbmm)m&(6_6Tma&88rB)$=pK@g!{q_OG@vmlD(L`~YpAcLu*F)0HDQOn}k> z1>UFjkF724m9$5pbd|0h}zKOSdCQG3ybrGS8sP0K@}Kw!)avW zWM@^_esNoSP1=_cdMo{i&q|H;56=v5#9?ZiM7Q7|u4?BTFPJ$l01)BjXxx6nHJlbQ z28ycXal{~hA~y-SuYF;(0Jn_0DVEC_Fv?o=dVfnDLFdJuCfNPIe$86C z<+^D0m?N!qApwF2);G^n0=ODT1B*C%9&Jo>`NlZJ*TC>IXOi)5idT*S*mJR=0F zCNnUBa|pwu^a|J;*wsE zIWwa3C(c^8xe+HQ6PH_y&`QoLqv4;-b{~1PpH)+>s%XS4nVC`+h zUza?Kx_iCydQ}F*T}DlR-yuVKtQ@-jLKl2~|X*1hLW3CnN%G>LoS;JsU zIv&=>z`ZhRM*Yqtfrkmd%x_XurxG*~ElP+63O9#vf3)dmGUv$x)T&u?ndzt)7JJF2@fNV zr)`9jfaqKjRGUOANxTc+KYp)}`>|Zkp6(pQY_TH(XpvucEVKPOF1<3TU_KP{>1Ya8 zCAwaq-EwZ(=Id(4{#crTt;izjFtqCKHZnT(`rr3*J9pjv0D;XzEQJCH_A9G}VCdu< z9K!c34&XLp6cPPoCIZ>)>5p{tPU!AqFQ*Ww;~V{UN4}qXS-Lcj4Gza6rggyb%PRBh~2V{ z9@x|r;TpMb(gRk<)usN&i;q#9w?XnDLu<$|F%{dJ#7IjW|Jld@$sAlBm7*y7prM}pU z+A^QWF#27#HF9H&Zw8RcIfygv2WVsGU4LC+V!s-c;li7$v5L%e@kmg03stQw?i@ni zS>Vw;!CuzR;IY?)r$|UOAh4KB(q_`I$)ZuSWxheUig9Ezn0dU!k?oqlph61#!l!*e zPkhCn5>-hK3`;YE6Tv)l0$c%1$LFNu=%T2zV7`hot{IxLUFInXDlJ#%U-Mn6JzMcE zN=`S85khV|Ae0UFL0xBPz#+HwErRHYL;>Y#ts$ApUbOnGi&F;uch7Ct(nkCq$z-rI z#SxQ#?nw5IK$^ZBP>tFxjIxi9=i?K`=HrRL7Q^CIwvg|&o5Y%og1Gf#tPQ@!W0isY ziO}So$YA` z`CZ{k9*$9NqghU~6%T^Wg#dls64N~$HcA_HmvcP-Ao7S`LF>oBI>+WRGurO{w%o-{ z%I*3_6})~$QH~@NznbvDy#5krNH@&yEEZSVpcx0JrlF`LxGv9&jTSg(5ygECH%gt^s?9>s;~~#s&E#i3BHg!&DYqf zPqOrhw=?)mmXc!12DM{F=dbWH%*w8Y+ZN(I7h@(^eSHQ!7@}G>OTJP)E`d!7g_y|ApNKG^51~0|FS=hk&%t_ z-~4gQ>c5|`WkdK6*(8q&5OM0wJRz-6CZLc4%Q=8|*dyM}q%NK(QOD-${S8h;5s7_C zvq1+~1g=ivyS?czA1CW4N@C1VJ`yFA&wcBTkR9I;zqWO`sLMC@WRqaxQIpp8faOF4 z-n%Tf2x8JUr90t!!ri+aG^RrmJ5$N~8PA}*FPmK1p8y$sZZ<&S1tL1ZDVjH`@;Ijy z9&dfjCjvqaqJHV}?iVh4%m7Qn-p>+I&wOz$sL{n0-g2=qR9nM~a$wTdxxUkxQuS`T zMYC$#vfeTBakk4#Q&oh{v2=A-|BWnAs6sS7+dxKm-pJrBMX7bOO=N-vFN{KQ0`cgc zMHiKlC`FWjmOva#fk!5=Ar~CMn~!i797M>1geO5*`3=m?dKcMFmLzeQDYmmZV=^Wl zHNP6hOt;#fO#B6a{K!O>OHp^9go80CnTv>YfL`yDix>k5&R8a~yfjE+f|4d=bYlME zP^)al_iMnXazj~TE<8z!116MwK&<-27QgSVEjaVNfft~r&giKwQ>e!pyIdOpzlC(oDfybZC~-1;u0ilo&&ntB2X4E!6_yU|yb<`*WJKUa4b4qq6q z3PM0?ys_xueF};diAC$0CX+-)U?#pD#Bpk-QA8Qpy$YApB**PX<2Y}?vi8{}ow|(| zQL0SuzaVUQh%(EpgL)&SEy+A~tk}zp`j~z#Q!UMVwj-Q6 zsGC&rl5?TH5ZDivP3PF)g2tuR7Mw7~N_ev3FgxT9b@)@MWgn9Zf|Oas`jZ~U%Zv7# z;1B0{LU()n$w4RJzQo*DAgG99IAOpr6rfQNsIY`(&GvyoVhbwnYHUrG!b2j-rKuv4 z+&Tg=Sbjpi(1^(IlM3m<4Rd}3(miWw23R|G2n9m%xhr!Gn6S8Cc5j?)MR{4wMml&6 zVDyB)B?AWWr7h79oFWH4@;we0b~#7Mz5~r6)N6 zeBA1j3AQ-E;e76tY{IMNkO8Pl6Q_qE_4K~lDkJsZJ_&;=M?TlvG{?n|6~Byn?bS^z z7c!S3bu-}B(+gb~aL?|mKD-CMz8Cby`-0PdnD+mujQ@4I`g0xoGwlBw;eQS2zef1q zXRtq0`L7>=Ki9W^`Imo>>c6J?ze=3`|2dQW$0_e$ZCC$0hcgog%m3qD6HSSv&34q@ z6E%BVbgqT>@(Rh3jetI<9^ zc$+_WU&BGjk!)2ZodjI+JlIATc)pjKE%1%Kd9u`W+DRYGt+V$vKh5au;&ll*VQhMQ9za{CoY6jgTUS`AU1VteCgr)={<}v{r)hpu z*!3>ksi$F+4+fllCaf?&?8zRy&m(0eHfqU8g3?j8fY0?(O}GRZn3lDI+j78BMdREJ z5ezvsYQfhJ6PKVa`Qx+dt@a&oGFwXOCcyDHRoXifNHao3oOjbN-j8!pTGLjJi(-^eHF4Q{L5n-J*lcjCnJN-$C(1{` zPrM_<=3kf!{^h&m(Ii#&ZJ)v>-}$>^4~0A}x`0|I_BW5Fc*XTnIgbE8!c>HFGl+}x zgFGp})J>unoAYD@zkKC*Gey5~1kRSVf-5ccjeh5zmwmi`wFfW7^X<0klwoeR`WA@o z+1-|t%@@g-6G4=AnQaR6m18Qp96zVcRa8d|?5>(w$5deanwL_o*u{30TyKCYT_iT1 zu4pc|fe5*U&elLgB;uw_5f>BW(QxItSUz*`BR7KJKC!Mrl*ph1fhQWAm&O$5x~qV3 zCd{?F?cS}&hduhkf+zPC%vG+6$tNgi+J`m;)03wYeyBm0oiR*=6yov)PYMJN@W=jT zy*+H^84fp7mG||v6*X;i;zD3ap6rmh=3XZugAE()f>o1EW{|^0*29#O6uosWOZrLeVg~ZC z%X2B%$LdPJ^)xUlrf3_bn$IeGOhJpU$O+I>iqq?{n%7$P3I@wf*wi}N#+U|CcXMmM zj}`!B!GdWvN5RjHo<+{*gvR zu<2w#p6YmEqwNrG^exSoqNFOM^r`*L2r{*NY>bDGt7^lA6N=yVltcE5{)?c*>v7K$w58q@)sGZ>3jz@4jlR^g556)8lZlj?K|yVIs? z>=@Vt-}%^>>Os+XITEC@H1$ z4kr?$r&5erFoA9Ln-RaHtr_O80lI(}PQLPsj~TF1kt-I)JB?i@T-M`p z5irO~KaRXXLxO;kQc|I$gvNO*%wrt(Q)$=8eaZW9F&AP-IYb~`){5j?J-mWxg$vKIqIY z1iNTlN3&w9Fjy$*LGwt3dJJdkfm{qW?3C)?XL)ZA6uBYANiOODi0BFz7S_n0JF-XG zSx>}2CL{_Sy}T-@$tW5$lLlBCGDjiYut_%Rc>ZIobjy|yP|zE`sbf&R6cZ&I26*f&(K$q;8O% z2%wYmWxYt95PKjn_D}V9O2JY@Ve?Gsk|6u)_LcEdk`g1-C1o76X0k=#kz$JS+Mi$Y zQD!txNdAgP!G^yO)X>&;e^mN!3(2RB;YjJy^dt77NI=lcZoZoW9A~sMsemvhQm_{S zL|3wK?>QN<-g@sX%tdgKexLxV)I;nA5=`(Kgy=+gI6x{2AQ#OFDm%mb@)R1HxkJeZ ztU=+uWcW+|e#EvPS;OR3IHy4eXu`R02DO-4je=%TJylM&2r(slwRI{?IHh)n94Y7Q zHt=93Nc?^GUg2}^9aF#6;(5kk&OaP;p41_}-O)BSx{&;IB)g7h%zscC%$z(jjq&@$ zbr(#&S-UeP|MXx)=-cFTc&6CLdKQXFfEJfilHjyi_bp85QFr$%jGAQTrx$k6%cO?z zX1T14*u<6o{rdvQGN;6PdKOoFT1Pg_09V0mlToLdL~}5o*U!S^H+(E?V-TvQE!n(# zq0O8DI{Kx0PJplIQ_G&8wpu>Ma5;g_bm`It2rOHj>G|@6ry2q>i@Yhfy7K5}fHi}; zz+ExtqqRINE_QlEwGeotfpG~{bTHO|Z{&-01Xcl;cGylJI6~7NV);rFVzIjt__QuA zgu7L{YA@!~!aR;IN;oIGht>P3evOxsli5ua_=aU|?v+T2ZD^6Mnb-1{>BmFawcxgdPw)!J+C`*z5)O zooB~4eRHp0#d~pXuBF%5;8!-6y3vMlFPhJZ<;EBQ38TF=QVki~Fr#Oc%}8VpTb#3w z?nF=z?icZg-XjYk89rL+lVR7tx~KmFc8va~x*3*#Gnf7sJ+^<{k{CG&ezU;;Xny@e z0{@G+L4*vQ zSsL?>_q}1F9HflnFCpZaUAx?BH~VL(PaRVFw29fi`(Vq#a_Q8x`g8@!Xvx&9=QBO% zq*R-}@pOi>i`6LjDRu%nB(iY2W^}Vqln`XQDHpvuYI<^HZi!GM582}1VcRO3CVi%! zpr8_oYpUn2?v8cd_NmW}x)v3;uB&fuO%)qh&mUd+L^W)-4coJ={UVF6PPW-k?Hkj> zwUwr7k2XE7Z8PUaEpYTuSX-{k52SUe*ShZ#)jkl(1cK^Oy46@q6O>?up&iV-&oWv% zsy0^3AzIJA?Q5+1-+zbMvwANtOs@l|Mf)3Y^pkGbyl3ik{TGS>@F`I!!uRu`C~;a@ z97BmT$-yJ0!o8q~QvAkD7QeHIAY3?J*n;8r!^?Z#fNK~BRz)}od=lxXTr2=uz}I|> zgLkZI>NJLdAgusa)};Np(Rp3fW2CFny4h(-kM?tgh&s?s_=ZyZGIK?*rp;t^*{X{5 z$9Di#;zb*4gi3&d-~gch`Di8y4tvjM-X48P5dv7m5ezZ=v2Q@V%F&0U6D{Dsh+?wI z!;wB;di<)%H$B|nrw+RC_w7ztx_t~leYME)`mGD14s98*1(i`I=nN8(1>m7K4|VQV zN+OHK8L!+aC;~#9;t%{Gvo71?7?`0QqmgWB-LEthY}r^}A2PaJx>Gz}#jZH*m)Y9b zbF^TxJF41pk&Y|{jBvQ*Mifiqr61|>q#D}|16Xu z2?7fMt;{V{hXt;9(~J24(=QLV#703I;n;u3xWhy)vFhR`pJ#OJxs=l}*TcbHh zQtP@-)**wEo5nOadbEiQG%q~Ohvt)#i!84_6fH>;Bx0Dytl{IO{!67f8Ml?s$yJEd ze8pvb6Uo|%-;W3SHEZ)H7E*YP#1+|->Ifuq6O%U#Cn1c1!tN*wY(Hd$b)yMCFfER~ z!Yojgz+gj)dxXP9D&$c(iK7=n_?d`lbO0}$qK?wF7oOcr|6&MqDtfPXtIVp0`G%>} z|3%w7MOV6T+oG}Uq~eNg+qP}nM#ZSuPAX0+_Ka=YHY@h2|F*sVRqO6`cH8aTbDzH1 zzBZrc!yLW$(MRuq7*CX4ETzS-IrBl(bZOg;<{8uLl?9V5`8HL;V4*LGT;k$)3`AZx}1Y)_Dr(2VH=OjGn3nVuw7*3@TnbLeBjmt z<&1rH=VHTX@CMD_TC9{TYYG_W-YU{f*?uL*D-sz`#5s}2e(<449Qqc25IjPJW6T`e z(}u4Qa0u3x2+41Q#!(#;+B}8Knint@=UG6dFnn=tgMMi&Zi3>)%bDXPM*!wb8)8Pg zN(DRZS^R7MYn*0eFs7RVFwsY&xCsj;mMJyB;1~z()mw4DOup}+$y%pdCso7j4Gve@ z296OgU0bZYU;?6vQZ&Le+6U%Kz&W8a@rT+L(~(F}cNA~zY%qeT;r_-5=hsIedCY2< z7ZKZd;r!??{ksqo<-HVPDM#Nim9JLTZ(APW5*)5K73cdC6}(yC{i?t5fxJUo$QVT( z#eH|c?YS9~3Q4(p3QMt6zp`GRiMcqAHY&B{29Gh;mpz{$O3naTVO;suC%~WXj5vsn z%TL#x2dfK%!0fk^CCJ{a%7rSXv6Xcr3R<3Wn20w+*efpvqtR>hlaO~2Hm3@{;%ZUX za;K9Jq83f;8gwrfRb~hCn@q1UN)o~PRX({0|xoIA^sek>}V}z9QfqY11uY?Ll^HGd&uYe9OgnM zAmP7ieXM^oi~ZLL&GPS1fqxYJ{u-HojNHHG>>ujhpCk1TRq!t*@ZU<`|M_rbW%{2E zS0+}rze{=tT9VFtga4BB2-)j+j_*37tr4VFYWJwfYsH%55phwz)=H6(CPWT?ZeF<> zpFn&8%o~HpDUfQsK-vmLE2dAcZGYr|ePQ@65Uw;Ssyo}`ELi2x#qDUjkD%(9o z_0eP!%c8SWBQSH*W0E?F_GhPWb*VqwaCFqUY6^RwwSYUvKYvY1ONS;gM#Abe2PVJgYt|+V*Oyo`Q8h6Mo{sb$_)&ufl|OoLBAu=t%c zM=%=T;Mrb%8uk8S*Suj%)uQ2rAZ12kh`}dVL>2zo4xLl$?^n9%MO6$p!-F(ZCid<7 zPiiT0sP!Q(rx5V4#fVTE^56fzq+%XM8Oo)rfxf#gI}fInU&xDF}=CE<01WWfhnUsz;sDAISwQ8N)=UyW=l~jTHN zRyjo~TB_sm?mfW)PRhVpk)q%R_J9~0WlB5JMjN8h5V6bF(8IM}GfcAjb%z-p zbeTpwfjv&15;U{Qi>qVpDu2=Fm6+#cwkZv4r3*S6J=OB`l@eb+&mZ1JNpfe$4+jISA^H3J5 zkk|}#Gu$;|qJw(WTa?Q13)NH9+v&K#yp%_aZZApKqMyJ-d zQ}xbnVOp=oAPoCUYKnogU$X7c`b}*gmbL4?I`mdNt2B8~Z|lS(l+L*MRYyf-1k-~| z_%J)AfcvZpE*@)@w0!1`AJ#>ha;wUz6$+{B zs$^s*X1E$ZO;SRVAyLAKpu0l+`t*d8M91Gf$~nz$6qMnuQuJL1oTB?xP&~11`JPglnBxpi$S2ePir+KN)wspoi?D-V< z1n#wEg&fquHnKWFL!p!T)&;fW5gZ0k7$a{ha|-+`lJ0cs7Z;ZsX-CooN(KY0{B6#iLu+yt)oH*9*ZAi<)c)V(3gy ze-po3v0}(zh1-e3?@5iKe(gEbz^R;YVnT4)0zuLX<9oLU80$K}kR&0aJ9XNZ{B*zY zN6d>+HP@_pTFs#-@hHH9rNjFs-G%?@g>rBszoSR~RPu|s9_K928>x02P9VZL2a+*Z zYAN-dm5{6?AT1lps4OSUsEHOv)t-1|G82nfkuqy=2OC1_tntMqoRUMtKVV%uX4NOI*Xhj7 zi+5}?wvMyzt-}Ie8DsqJX_$a(voo*8Fbf)im=rsZ5(M&(QlZi>Kjm0&V+Fqca^}r+ zl$;y%iaJ;AVVt$qIvBE%VxaNs{c8Nv*6swZcOE1CS8k}1ol`dVQzh5BMPUS^XjAjvfu^A22yT&5%e4l=! z=+a&}%+|$#Q_hL~gB6%+jlP(JhJ>{%1QjbE6k&|Xp5!=A1f4|ri&2be@>MuGRN=fV zmCKYVnxIO7;?7%uW|L}Kx2GBAhJYY9jD+2`N#6^EuF$209?}Cq z3gP5vL*JzLUL}wk50yT5OFjl1cGDWjC^4Ga>NHG1F|1HG6X5h^dW4Ab2x(bO41UlB z3Uw<46evkA23upmIBM-O;kzZM99a0deBCN4GAH=+g zqc8iS%rGx(6*3Y#AV(y1y%*t=Du27=X z-gO8!=kNSz16IAFD&_cqOh$kD9bK^WbV2`g)bz5adLPC=21A3IS5eXYR0m6Z@#wS<)~rH{`xGh?%#(Dj!>4S zLIzLCndm42al7ix4`|aKWVBBKEUZuQZ4=-U^U^-v3|*`}J#V=3wN+U}v}sl&$wV=D z;m(h&5I4k5afqEC*4Yg*(bqEHdvR88oWIUPsVu@g61rI3d#R=AGX9voDqsmP+hlz| z3i*h+F+-nl3aY%hH3Y2UKHPXF^Vv6LHuSI)>>WA1n|V6dudWYPhlv4YZ)S>7$H~%? zoC+0==(9vY>Ljp}RZR>>CShp}@17R@JZ+M!FMfP=<8@!Ve{gHnwA&KjSWxM(JSy`E9D^iyO)=fDX(r(uI&S}mj91pdzcQ^IoYc) zN7^5}z2|G+TEG}A8s4>l=*Lw+o%vWj)ibClNIy1Zh`2DM<$8moj( zvvbK9Ayye`xz2E|m1NwV?(u*_B{-%RdcKCUYI^gvc}~OOyHpFiTXyq%^sD8pL?GzX z0+TTF4e^ioAd~5ohw*?@_@vN8VZi?8AY)j4U$H_@I#Y-hu{qXo&hjZDncr*k;#qqo zxo_Cq;py)?T%hw|4cat4L+dV6s^%$`a=&(}KPbq^aHZCj#GuGzvG^!Fvdt550at33 zFlVB{qg%;qw6b^Vz+NC0at6=9B>P=TI9yKiw%Qm<3D;k6aU0r-d^IkT3{gy>8$VNf zEdXBg43?%8@zDzI5>f!w>mqn+`gCE~k2kJtArHMC$?aMLm(3PSk~rkH{at>-={a6e zf{f^#bM(CeB>-HoS(YyeNP^-}6meP5nt6{DSyFa=-djWhTqg>9u@t9PJzXP z#L=&<7<@?JBv)vT!@l^q;C}7LJ*F)wD4;GMC?p~#KM4-31I>>b1GT=O3*)%iWRRRM ztpu|wGiTaFHZi6DY>%R~ij+NRGVjtRNc!ipY&9%vNd(u=E?OE?(=#t@1$HqGb?9BS zpw7ZLaWGO(i;k7AA#_x*irF4Gho(ju?64+0T+ZQ$UlE8J2~%Rc2Ja-?afOm_g>X=9 zbuD2^kk9Fv3EhqOb1{>KoY2=0M}rg*!JM6(mX#?$E&-0QC?72H8*ecP=0Es9YSwii zVZyV>O=49vTD0xl$6SSjx$ds*7$I}h_OQ;JgLgrUk`T2R4{_^=Di)?M7#S0NK)&(z zW_EU!Z|+Pcxh@#jGvDpIni5ikcdo0`R}dKUnol>;K5Nhx8pc6`b0*lJYbSl584u>P z1sb_e+6NV9HT``E{lp7gd%nM>OK{(BltW&mf?1ekM||TT$oo~WM-~dk%S%DvOOZgd z5ZZUUDRA(>+5KtDk0P;w<1l6uK%u_(1IhJ@wsE zTYf^vAqLKOCK5g}hmx{sPR;EcW@~=+?a1~{^e2E3-T?C^CI<&&+#m&k7!5QJf$C@g zQ92DHNEFZSyL5-N2;~oB=>v>w6;3@|3KVBnz?R)79#zYoAE5OUD;FcI*mTbH6^X!2 zo9dY7QaQHyrat1mmU$sKqq!xAWx*Kd)T>rfn6|pPIdj23rK6QgG%x2nD;n&pB(d*Krc?t+Nyw&)5&jeuy~!{!cEtk>;J|Icu02)axH{ll!`l4Vd6B3ovzNf` zRFSMgrghml^Uzh!HjsK+y!;ZEqBs465hiK7rR=<|FWsEc<3p8!g zROcAB!Pg<Iy#qHyj;6XubE+9%C~RnwlOXnNE)LFH40$#SfAjGb~gItB*(J4A1o z#huJt)%-@3P4kLs8i*Az;nEgy>UGQL*F?$Zt9WDlS<|jZd&&4~i)6w+>cG&GhtQX^ z`r`I??60#prsik$kP!)r$LI_xxbz&oDB2!LUf*`6)-Q~NV(?M=NwNM21$j`Tl9m}M z*jqEmg|-5r`d=4O(5eXCDLX!O2Uv+#xB-qp?BS?H{Kuhz`NTs3N^i(t_{xIS19GZ_ zY|&x5j?k^VV0aDbUAc#y(KYkZIw%>5+XuU*Fa&g#JfqN&*c}TL#dhNL;!S~OHg2Nv z!fW>@$WdTsigr*yXy=aHZhU|g>M+ar5-%4gnMnJPb4KJ$hKDja)F=H&i)famNBthw zTCLQi@v1-;PNs?1IZ#h9*7&!su4Zi;hXyW--3QLEqQW4@y~KZKsYlUqBQ-No+7^Z7 zZe1bXoS0$T2^2y^y}lmaBWMk?Rl&p~oQi(*Hy* zlH1mn0PRfxgQFQcDD7~7W~wq~*em)iXGhY{rtm~d2S2e*gz=}Wvz(xzE_8!wUGbd} zjN%NDw?23$&iRz zhId)9@WkE-8r*`!Dh4V9$sdzN2ViW@9em3Ehe56-d?hDesJ94=vj=9(C@> zW?@nS0mN#dlghw!OCLs$MWhc?vE08%fwJ?AWW+qt(o-KE= z<~n!=UcwFX+<4tK^wGRiKif2%wQ#<)YAhNob#h-P6oiDe(_|*;J3ozIaIDoWQ;!xj<#v@S3-cOpzoa$zUVx+$}o&-3si%_;reH?&#_RmInPT;vYE7-z={G zLk{y79r=UJ{BM}aAJpbglJXb#`M0S5_gLfqyubK+8_XZ<=noF_*V_O8266dY7{Gr^ zT$tJZUgA2TrER~*hT*rRpD+Fe%TZK`WPtKz+Nf!b4ugUV-i=_EZ#X8Q<%=}_NDkqr z-_(w1vqDOiOz{B84`~nX<}05tl{?A;MUYR6LaaBE88<}v&)_Y<@oUBL75{ZORc~o{ zmEDf14CM?{TU)E%j0xTxiKN!Ha$=6Zp3%1In{dA@J8l?^nt2}16N4afwMt%T)LBSCfb0LRm;Pt+Zk0ekofNX*MU= z3;(tV&Nizu^H!U8>P#V(u+W5%Rceb?ig0UfQ7|UXw@|PwshO%8jcmE z7)LE=$lM;97V5DwUvNp!Gsin!3}z8n9U(+rKgYGu-N01UJ--;+Qd=*D+vIO^d;NV3 z68&Jh27p=PB^3%BRTBD1pa)Q^t9BRh6(ZHZ6+l4J3vy~DhCwp+@9={AmOqB3B9UMg z^w0%(XcNYZ`9M{k@0@{`_7nhM@6^z29Wx+9o=_l=k&Xa)duSxkkVGtsz>(%^kguEW zW_RH$U{=vxopI-$M^2nEVpSoF;LS6!=! z9NCeBfI_%DH+P%1__IR`f?r;;3#XS2^iq$-2U>{+Uzx{i7{4LhZxbD8?yJm(npBV3 zSjDK~uz_)K<2_IER~5+DbgP)o7&i+{Kr7Gi8A*OyS?ux%_xtWwOXII3Mk*0HLIPYh zo5)xkJ(UN2Cm=qJ!aMm*5=l*4Xi4`0rUtT%hii-GOM~UBln^Y4h>&*y0E4H6>zWZc&97B8N6Z4y zrd5F$Q;bvV%DO`R98YV{hQR0pQ9SPl(}K*egXCAmLjD*?AWRu-3>1+ThNg!$iabF) zR1zr(qWGPC+l^AUv_B)z$ixIW!1PebOR*|kf@w5BnE4>y-vN2E%32G%=z>fG*Q8I_ zRb0$gsg!l*=lcpn9WV>poP{nw?6ps8U(euoIcSLD;_d zVaYL<3!JwaAOsO;@bQz4tLs_qSlUe{w=m`LmZ{Jixom7B*N z6l3B9E~UP=7Hc?%*E_U^p=btZmsG49t+l38ARPF1WTpR3yRJGu-JIO%#t364jAEYv zCKC-cNm1DpB-H`XLQjfmqvX!02-nNyi%CI?hwY$AHwfNOGbf9~#AB%+$`JJ%SyO9f zA^r4jq7G^^O{>&8yNGJ%TnJh7Sxx>?h@!yW$#&|8DN+wsE(44YJ3yqZhD<$NFdZZe zoorIyI~Sb}k4F~_xr}`>G)*q(m7<5g|1JgGkmlfl_UoGxkpUbAM7EZ$j44PbmMf;5HJbpyaw*VJ76c_t%2v=hu{H*oZl;iE6&k_gc?lQ|+< z>f;2Fb!)(-gQaFCX9j2IH-60>&DC!`B7pTxG9g`Ds~TAaVIEM>$%sg-dKUBfp3iK1PV-Pe|w&P6m=%-&o zUNSg+1HiKM@+d}Ref0B6kvA0=`|e>897DB+bF2-w{m_8IC2tvp6KGw!CQ{w`%3sO<=lo6-EBKY}Qe^Yv*GAK!K%zt^;4-Tu$l*`)1u0@!Z(r$i=0;r;F82YVEDJ%JjL?pJj)AtTH>$ zX8P?5)%x5;ZroOANrZm16Nu_gojfNy7F5ZP+gGE^W__cEO3JS1J_q63X_S1uWfq66 z?HS`4FzFmH>zp*oewnOWKxW)a>x!iZ-LLxZdrc!g3WA)V;3de5lx!L=~Jw%#^g};`&1#0e3T<%b&;RBdp_v&fuWuRS|<(!mN z7beLk*L6MDeTP@tbLVV&kxYytt^onG#{B_-q}^3Um?bR78zt2C>5;{^(Y?$O10b-L z9`f?ru#=cba-=!=R`r~rVfwuU4Ii_9m*-Xful$75w)6i0P5K$w5Q z%0I5n{sgiAHmUrd`%&2bb~gRrp-pB64)*_-O#WB4YN2EVio4OAuLQGX=J;J*X7)*+ z7lB236Kk@F`23=qpYIef6il8#d_uO_?8rWG0z_a?(3Q^-h{MBP^rX{M*d$Ak|Luws zsJnmQ=cSqd2gB=LbM#axp-$;an6^iTq7F)HPv9%VK@bP|9HCe=A z15CG8ODfQgoRy(rXM^$SXTA$e8w>4aRPN6cvAJXK<#wV8!R{(dP}f4p8aFba{E8L9 z)Ws@R=sf-Kss;TXQM>kp~Y;dqo zv84+rwG~!!e_?k5ONg|-PPyv38FB^~r&uKXDcN&W7~jXKnS%v_kw$-KF_etEX0n!{ z?w$%eKK%RbDuQVP(=duSaNO9ejh_kH=I0~BNDhZm+@`zAS?iFA5 z6rYDcygGSE0bl4BgEbHcVkPnz7;W=5|L@e%Q8-c|2J3_P@ zk}>GpAYJv>q4L#Y4<%fWU#G+D6^^IW0ZW2Ek%qM(k$)r>OpgL6f%Xl2b^Q|Wf!n$;Z1*a_Y{3KfZ_cX<9J{h zsK6bBSLPN6EYWZyl7OEsy2uzD%hQ2%e|N|dGVXR*KqlP#w^WAk$nKt>;KC1Y-q zwta<}K6~4}S|HdO;!F?Tm6p(9cSo4+=Q)GqBI7POc)0|Ubd>B!Fhp5T$vK9-2wMEa zfncFZ?02Akv4_BA0sT$-WZaEO&|xsb5R(B6Qb!7hvHx>*L{zmQTKLqA@bMc^@qw9) ztuF0_Z{t?7G-g9A+IVN1otm{onkL_;1d(>A=On=>0ES?um4>f1DpR%oZJkAR&+aic z?qu;2XEw^rwZm>}8C-Y`vU$V`cMg1HfLg@pcmHC|;YMN23PEoWZ&_T!G(4l3G(33HNtEME+e&7c@8V0v zHRCvP{1?KYFjuUfHw+Nze6g$gI;e9Rr6)MRhax#s)r>c9?fl0eO4H`<>X%v*zpGRc z7n(Hl2^=k{1nq^6^lhy@DpYTQgD?FK#tDrLXhK7y7OJ?E?G|p9=)m-Rbor_~a32r> zPHR9}?0Sl1LghW%gO;CXDjkuo3J<_v=i-MZdC6H^ohT{t3+&-!at-0j?P21nA+J4v z{d0+F11smTZ5VB8?v5HX0+UnLzlKpV(*JI%j{KdH3aDW3Sg`r{KET;OVZ6v=&ju8~ zFxwTmlnfbRz;-GU*HYuD53ul8zY1F3>PoI0kqY66Z-pdbZ<;`C z8Jkz>TB@fEvsd_{Jz%tRcPU+nW$p;k$Hzg+rLpKU)8Pl}suI~p#uwTV(yyII3a31I zN28#US5Kd!B-3+6M|ovmQm@9EfYt)@DcLX3=^irCCYecyLkug3jj%50La}%99jBu+ zf-VCOIX`pbCI3$*-e+RLa371N4PfWmBCzk^dnTATY zE@@@4zEr9QeMA13Z)~ZyjZ?%En#W6MD*3hgZYPBq+rr!3F*nqvmvVORT#huN?gd+^ky&Ae%olhlV2I~ziSaysg3O7?;Kd#rH0J*8_twAD7 zicFV6K{4RYAitzcGi{EaW z7B`tKENv)SOC+3dGB7{^4wfW+oakZS4HQ^K&jk@;ythk~G#-J_s0N2`0-m4LCrM;z z*q3W~Hb!p;&Ns7GF=y^a`y`<_L!M%PUW~Y5Z5@dQS224SnTC5|=Ox7~DGCa=v_7s6oJ+ zX5pMZX>kdA$+%<|NmdPx15w3HKgGZ`1w9Ly<7`@QpqRnS+gx{*W%IpzZ(Ki15+8hl z3RlwU2nAk}T1Uo8iOp!X?#PsKDVD-9tnCM7$FWg=%v02bL?>786hqPP6A2e?qYe@1 zZ%~0ZEBR~~Ay7=DI)g<*YGZ{xG?e4AUqu=@#~lzzXNl0NxDb9N!Cc4c>M5`FPw^Ma}i8}!lj z7aSQXjQo&1k5upsU@%}DiIyBKplE|0daY|#k@$5d)y6&N%_I|2A&?vETcoGQ@`8MY ztfxZYlJ4Votdx-rMK6Np$}>PnS}I`S!_OG;`|=(E;zf>+J4j)(C;Z&r4r9Vic+lFq zQY{E0AJMKs69QgC7td~96PMo`bRzcib)U!@?_q)Nw!s+199v8C(JzSRXhJVw)Sah; zWzLe|i5YS#@`tW8ULDUgS^KGQ1X~<?$oK0$kb|3`hj1m1=JN}t&N=5+s0 z`t*;Uq<_@&|4nY_#r}yM{dt1-2T}TGOVS@pfIsi`{wk;Vt@1My{)_J^{fpwzD>&I3 zE1SA#(<_LG5z?!edbkkMOWGQmn+pHOQ|LdQlDhx;zNwwbzfwBb{uWB|-*G7>4u-!g z_XFCRzvDWP{idp?f2hGbc+^Kmq8Rw^f}EOIAfdJ}M<{LE)2HjUh?{q$`Ejsv4S z{uQ15Yy7%*=J@sug6EaRm>K4CS;qM(zkUHD=L4ZDb7jlU%>P+*JdG^Nv_2E@+Gzx< z*2=BkkKNp+)+A}R^~tk#e|B;!CDRGM89RH6rXh{pv+=WLd!^m3$y0lA!S7~hg5N*_ z!B~p85XKlrN(3vRJ8yCIc|vywQWsP9clF@ZHLP(k!03v9k>KrqfeN25lPF$OobiZc z&(4Ft6!~_&@$r!%^vbNjP70MekNM%nx0dC0DIYmeky-<6N~q%Tw*NeV0=qM69tgX( z_^eCfjy>2-#buw%tj|?FRTc2~XxdVBMn!Y|P|=04wr12pSMlB7h8rTWgz|LKa$+;(Erg4qBP_D0wvHFPiu^?sC?f9EuW^f9`vI7H+Kz09-*5HIj^MK-VjMy(YS&;D|DQXabZI~wonwZC`i8D zrHXo|$@KRcu4uC9YO{l(KxbBv_kfrb2@Ng0vjJ<>vi!ezTP(N(xOJwR{q zQ~YO_qi9O_Cbo8$J8lUvZDdtj$Y9=c1!!wVAMHDd#Wj~IhtR^ zSB_-zN<+4UU%TYNnL|@tgrJuV>IgD?wA=OD1CVL6j}}%DbpuG&wwnyU+fGFXkLCwm z(!4Dt?P?LrzvQ0r3|pcnL?(>uRSHikJDV#`Ga)kcIpQcxSPy|?M(q3)sQgyll``_8lVXp#Zx7FLSXoO_Gy@f=PVNDAVoSm-w<{Wy1Z_(iFEk8C(a}2uBDsYRYonTZ`#12hP70$#F zSNlW85w0$+Pb2y(&BgcxRZ2=^@Z#?DdTED*D z=4(b5{O%g0;Y-xC>-=7C!#lQ8 z2eaADi`fHo3Rz=1FM_mltvM{7E@gqYBmb-KLnb{Hz9~YmuTD9e$3;4*pZuLzawz|{ zIr34EGSTQGPcC9#4b=s|1{!ZJk@)kc3g)jDDSY5azKL!mHwN@cR}?Jo;~pm$j1l1xG0q6bWVFZ;p2kYVdy4Qw_q4zt z6o*G#ON-!G5;uLl# z^h`eC#BgLpbGsjkJK(^;u8K&*gR?Y)2d@R;2{p$y93f?Q=(#`=5#U35$&0)d zI`dttG9>Yxdi-$sFm`?UVvxm&9nSS=H%Xy_87lYU@4fkn2rOSbNgeRTD9wnbXe|JC z2*ZN|_NI8X*%O>!G#2BdK7jt6Y$p9HOjjPD^2>4Ac{?;D)%K$8YhR;l7*#PO)u1;V z+)rm3uVV4KrJ(Z)q;8!^%NoMNhtoM|5*lr!uYGcg9rr8;A5PlUT`%0t5lJWs-6%-B zT%b^lKCWvvebcI)0XCn`t(pdwedZhFhlVU)epk(89oJq9Z#-kSwN$oclE0)9uHa8Zan*4G@%ry$zK>7;0lQyOUfn#Rg7%D@(M+!ug%y+Jmb{*_e7ek8Qz zdx%3VdS*Ffo2+JrlX6k)eOgS~n-hpbDMLwgGZxpHLG&{g$^v=2Buk>vOW=-po7Kk{1rokw?_?w~VL9 zRq=7V)}Ws1tRvs=3i~SV#n(Nr5oH5qVQS_|IX26@XKak?ya3r4s(R6uSObS>W@_`4 zyv||NbQ@_42xPSA_v8r$x^$Ti5E`oxgXTyzA&B!MAZ>%7`5tVJb*}jE=|smDJD9Rx z6}!vE-G<7lc!Atba;#)HpJ3@wN&7VvTTbOw$W8+Lk<269LS`eNFHjQMSR+M-?)!-g z#E!l!Af<|hyU<3j!A?Ho%@NtPH_IOX2Ax}kmpW93xZU?(it&_fh8g*5hZVjgcP@k-g9x6;(HJHh#j`_Qk8v@vOu|C$#5E->sXoag>EEA=r8F| zwJY-I-rdo&JI}J@{kp0Fb>y4YWMGbO*pUX#QGcGx9<3qLpJ&gs4~{=vn z<4E)WfinEfv;Uuz;jfDG|2cX1-F3I5_2f0%*(Sj7Bg_4#8F^Si_1UwB^$ zhF*+?`9B&let%>m{Fi^{|9Sh@IWo)t_sR^mzvYztx8#C}`R|9r7h2M>Ys3G#XSkLy z?33#v0Crji0<27sE^BVs5ST4)^W=6p05A_f4k2>RAmQLbiKS( zSgGeyt0_Lks)qIvX#I4*zC(QaG`@c{y-&?m9l&ywQXNCQuIqu+rDeB2)n9#Yd%rE% znO&$bZsD_)&&9Y(`3!b*o1cU-%42ML@ts+I(Vqz&iAPTCud%pqiow{cmM$=T(@o-1 z=r5{n*Uhqz?Ne*;v)a2xyfNFNZ7I*~tzPqOsp>t*=eCnyvm>C9*Y)sTzr?@n3U%Kk z{`g(v)MAOKeSQo3(a1I6O?JlCaK+aj@5F~g)tuBF#h`%|RyaMpaIv$DK}Ke9*q*ET zq#Mf{MJ@CD+;}L7NKO5FO>mS|E2zHXPgv^|gPsOrotQ5)KN>4&38XC+lpOz7%p)F5T8L1)9@NcPisds@3Ois#3_i8RsNX}cB z!S5CL(SguSOml51SP={LbtS(Ax;sAc+bQ{*rQxFnYeOL!WwC3ebe>EXvrBFn&LNU! z#qf;O=PMTg)8p`BoHtNLrz>~4#FW-BxPxCiXrw%`YT-D79{0KiUMJhV}WV4uCtB@e4}}E<%+5UW+u^wAAyWDYXhPM~dvv6aPq}T8r<)cLTy_SYG2Gol zSDd0GN9YlTpRuDm7yogI2R+kQi@)y~L5e!4PjZn~#J_npMSar~Ej#1K3d`)L|U9EWC$9@7@ zeFokN=UiZY)Fcm%iJ!Jmk8%MWFc#PXG@OR-x2zOm!3Kymo|b8)U*~>A&^b{pMN_Z@9o(8-t<5Q~T}mfWktcCM>^Ccyn;I(O-LL7zNa&#f zA*iEdV1<)qXCyrm9`?lS@L&$-g|J|4VhpvG5S9PD*2+xRbYYGG6kngaLT|DKvFCQL z1wQo(ijxw-l5B7<7_tz`!rs|=IezDHUi_Loq`4t5-*Uo^MXWM`%BsHoYYZq={klPl zhNo{11b3`6q!<{7hCJhD2>XzqIAp1Ax;mOmas>{Zb45FbYc0`t+L~Ja{73L1K$8HS z*^WX-6U1`QmC+0-^qTU(b^p`&+%#IW#EPGLU9?nx$#Hu!P_;{|rjWJLhz2$#7UwXm4RjA*t}0y)xbBG&Bv|>!qPR zw@=3P!CsJcT>L%VsDt36FgwI}fbK@vZ=FlH1sWZ?1-}nnIcsPR=DoQMF&Vbz5}~Xf zQ6s;5!@VQqW4F1@VWVN_VyGsWeHMjUSPP5A6jGR*2B*i?7b_*4hLA}8K6WRprGkCK zFwsUG5i#u26QCWk3e(v;^-Mj9Zm&0vr2m4wJ5g*MyJNSN-8*qKbV1pq%RlI@o!2NP zaTcYz6Os#!chscceDO|JXI%L@tdu}U^rcZafeywR)^K)=61(l2B!1IWt;&NX-~;V; z*tnc8+pB=?LQlB(!#6H@3wj0YxeG&V1xVAdH6ZhZth|mXTt+#<`s_OgsThzj7CzqC zaZ$DeY}ZdHLV0YJ0q5G%*(EQm7jv7>lrNrvLy<+e`nMSzUS$5yjq`el@1F|aVg*hC z1DHArB%KBHkr7xm6??7py^-vr0_Rz8+j>?)^4){>5Y%(jm;EjAr38 z!h$!_ipWx3kq!s({7$&Sh*!sISmws*mIn$Z zetXN{8DAFUC?U>)1aR2VqkbPNrDwzX-cV=C1v{>gU)EdNwssa)AyG3y zQ8hPp{8JGS!HFHYeATOcdPKGfwh)i6CIq?*-q_f`J&;;Bz=&k>hm1>F@?B#kD-Q!- zuMm^#mbks0ooYH@p`T8?M-2Wb0 zX80`!&VTa$sAy?^UodS#LD*`J{;!;DA;Q27_Slx&A`gK*3+qakPt!t~s4bcH#urO= z$iO5LKm??cxgR^rvE<#aFVE+?>aP^J2)40hV7B?+P1&7pQ(WEGU1_N{Ip~oBzz64V zq;2*4a!eb#T1mPoFBF?1@6NgDzME)-XeMt3abxh-o}uq_M= z+x458SomykX1-L?Og1+~5rpb}hB8VraW~7x zgo@*wP?%}!x%}->a?o8V$zVK~?ieqNF!SJoDYJb>+Z%{OB(H`Y&SFBxhvX=3BNU;0 zCNSH0AhQ~VYbSbkI!u8$0W$QXGQg_(v__C4C3mt)jF-tE=~STv!P{_(0-?E&}cgbt2&!#+--5z$~fF#QI^#6>N~U9wDGvOBih8G-b~P z=MGN5%Nj%%!6lxluZAb}!gLU`>tv6NNayk=jtbPN5s%8ytbZsK&|_?u6M`@H&Tp1_ z+j)iD2YDR%W@aoMM0dVh0QbzD#ZMVA$S5Mn89u!@b+fV?OpOC6II=viQm~%pqf^?k z>F)N{hrQspOTk;*Ny@0r9v8Fcmm|?vvizkDA`#ASB?to*BNed#@6^g4NTp z^h87UsC7kc&?cc#rBmWqfOkxuCB-=d`$R!s=WV~|Bc^Z$Td(Udc~6u#_OXxeoCEkd zc;&Z+NILVZjuYj%6)9?T}KWS6dlgK4S{B# z*618$NUihDW34WHn)AB7qSVgOu8Tny2KmEc2PJiW#d8A(;Pl%o*$8D57Q9(PIe@N< zShhXG*0Oq-ECns-Qqa$-7XspO9J8cva<`; zeyNm9Hd|#r@Cwm`P}&Whyp!k261vwBoZTy0D7a2v`}`1ADPMUBK;ROB3lbpVW=6bE z3#tYNDF{$;amww@L0sPfb~Z~X!xm((N1?LtLNW)MnezzI-m2!@^`)W1DSM~pF+!%fvhxwlx zw_nZJlVoAm8(zIku81YSP3U)4kK?Eiqon8Nc}u9h*4(B2pH9H_nf-Oh{OEqy&P%;9LiG z5wAY7LUL)}v)QG^Trd$R)(yKgHD0kdGB=o>5msGCo6jDyWj6#%EF3n?GC!Ybi_ew| zPN?om4D5|3$Rp_!U>1Pd6?!p=y{Vy9LdLz(Xe0;!G0_&AjPzT%E}-ypR6NaGRd~<7BO6 z8*BDBp+{u6{@%pG0(HXRx?Lxe8=kK-(-PJ>(hHCALlQrilPH>xH@@EOYc9mzi=S(| zq8s|c$Y^_=<2t*)|E#iurrx=Hdnf1lc8JB7ErP-e)e{VB(za5XU3z>q1P7AFrga8$ ztb(kuX8k~S97aExN*A#gKC!814tQKDVs3L4fX|;h(g$?zRK~xi!bu1W&UUmFP_rh( zCupyaqLc}n|K z==;Nwr4Ubjm{P@(lB#iick+z{B7x+fRUb!Y_Rel5U+L zfS(CG>*Clu8d2ap_xJcwW5H`j5h(pZ zq;PJ*kh+?HcreWJmX}{<)`XEnwY8;pT|v8o^)wV{2}CFwu0Xs_Qx616Y7Hq>PsvnY z8crigRpe_rCoNHN@h}Vei>MVx6^5?9g2@wvAYJOgZ12G=eT%uI=|D5c*C(pk1OLLw z$;%2p1@ihJ-zI7vCX9*js6@Z-o+;VWtX4d<9eHs z-E&QV9UG3HQq5<8Qi;%sI#1`8e8vVfz-Nr0&)3P@8l~UD2T)qW%8tc8<1iI;C7$fI z2LY!c#*W5=Vh;_QqnS0x$f+Y0p7bf9P1uiz!*48pN8E+bssK45N{pHar2jM_5{&EB zmQA`jI{SV<4;9M-uRQVzSy!<=0S)lMssF9e)b3#)-7b}uO$K4EruBn4g6fk~6dHbU zXU%@ySFVH^!#j*)PGz`TY5op9aOReYX*R0kWr!x1fk>Ou<=d|N5=pz>a>TX9t@Z&qo))MQUu% z)e&-P^KOAsX)qU%lWyLVQ3PmY@_~O|kAwX{TdjW$06#UWH-)ZUg47n!4?Tk@p``gN z@3{?|5*_!E2f{?5ilLvKtfX;n&lgf>Pf=fZ0XSFf(-i`fU{?_7RGHtj79FTE-Xv8V60)+z78Hf*|Daj$x2cea+9xf%^$1ymKgdxY^l}z37 zZjQXz%utrscd}{RD79SLGmcL-OD^?^AM;Os$E$yiQyLjvmp1D7*3>BFQ_Un7IXj)s z6w-mtL7wIHpchsAwhBRS6Q21Cnb>yK7fO}|!$d|*HBeKF=;hlW&w=qVsE%;q=uZ&c z>f7bie1bWpX=!!r!R*_h9UDjM>^OYV&t9UfK!A&IH-H{lg5Y>ucPH&#?Nas$f_pOg zx`ZzvM)wmn?)!eivY==EkSaDv$=3K~ARtYN)*>SGY1B`KiUM-g7R5e& z0`KPF-FRo&=-8rM{hq~{jC@E9Ux}%i!mgpvux?fgBBm(BA`n)KxMZQrkZKDCx|9wF z(B?i;+&=f$jiHu@TNs{;29!uD`9R+?c)XehgGF&8!E`Ullu~lvv%g~}Q6w?5vqthx zGlP*E3gRy5IR#8%njFW>J&O4xJrDv#h51=st*8i~TPk@X@fbc5F_h;>$&FW8I^O&t3{I>(~h`X$R0K>`qAp ztYK{_6@>~5-R!R~fPCR^6dQ*cVAwVttlk$u;!;UxGuGk+Q`1VwIDYj@Z=NY9)|f;F1Gj#1&SQOp6_FoXLFEn1UUr zq7mAbmrf+!Ewy6+hy(z^noT&X-&mgD%sS-Dic))#xb}tTMb|Qe_&X>2E5JLfD6_+; z7B`9)LV_eZmiGV@G|t44*Jlk?%tgqkQ4UvCOhxqOulr7K)=Vdp92?ZBZ?W$RhYnH$ zt+jeEu=lDlzhtoA*;O)|h52<+T-*aT&UW-4Cxb(5!5;xwq6w3pkaPUdDcL=3zu ztDF#Uio_qXn23r*sBr~goEKY!mnt*Oz4Erg+Tm%5d|>#p;kkiH-iCR#Stm!&ySTMb z0xT^MwY1lJkA8fwBnJT{dJdtJymjsncN2Z1f2I>psjeM~#I#b8_1eo}w4c~P1fC#D zgqnN5)l5^fy&*N)bDLA-;DqHO!DrkH5!E~#J$}B`y`Dx0pRV){enL1huB=^mx}t6G znNF*NJO@%<06*ei188t zuetzZ0zj=O6k&9t^D1yXVF%tijC#7fP{E&vNU!~nNV*2bm{^2A$}L+gZ%|7NDU@#^ zI}6mc0T>Ec^HSTPpS6l3Vvq2+6UDqWYBd^nD3c^GyH!vzyrrvmh$SeVmnLWhFtVEe z7>`g44qsT22~g?nfT$t2Frwb8Q^e_y^WF)|%Y5>YZM<_^mPIUXE}|I20nuz)l8bf$ z{WWPVSjcVE74NhouALQS8w%JLMD0yL=XKMIX_1%pHtbFKVr-xm{D+sT8*F0Ux=-o0 zGQLULL{&}lh}8#q);f{l&eLZdOleLBs>6^ONbQ;RYRntNm0PVYAXWSVQJyI*+a|rm zE1MI5)Eq$0J3oQ@Gw#hMoMa_g+b1KhV0kY23(e4Q&O~TAQl<#Q*l>LhzTGhSA!G#1 z$Wd$UBwT(pC|63Vk6acB&#Nw=$Vcm$ld(e2T%GKJ)!LA@66)fMph^gL1K~kZ`9~AT zuS_}{>`9iUEOKXHuoF{T3Qi!)oH~{$6vOtdULd@jh5I6beF1nu9)ys5Xlj!7u1BkB z5v$;&o1J5PVsRlcxE{UM6V_&(hj$Vb8)AZ?BDH{14!|4gS(#x4y0ekxJvajto^^Yo zsBm&dBbP&HIwG)uzJ==N5qWi>#n!h8C9R8?FKZ!sf$=+-F0AU$j+W^K`oqedUzl1^ zD&-{k-<&f`(##rIVsQxX<%6TSLD9^8Ex;v9#h-5{k6=QV6fm0<(TDzu`Zg#Mgm5JS zn6wxUHH`}an;<`p7Pv&j!4~~O+f|CLC{<@QyTm0$LsIY=KXQe?m39P{G(RkV@L&Sj z;AF61@L6-(Wf7Um9fW+JYQ%eu8$fB<@#AsFNQN+|h<9@xazVkHWKHP{v9xT)^hQp4 zH?Nd;2WJ;%>H+4V<@m)+>vyzqmuCAX*-T*z9V?eGhMpsAHs5~S-CrF`Aj8Rx-F7)S zc1f+gvaW%ZZAvF~aqbS7{h9)pMNvVI`57o~&HO8G^uorq<96!4!vD zX+&^^y-V~|Qrx|Ulb+%I24SxaMG=E^CEP>*oE>5dY~g+L{2 z#sGRo#`%SUL`{Hmr4n1w7sO~c_+i<~oh2yv0Nf@=NGI7a0JI#nB8_Cj%JS9uV2cc$hVWpCAHjp9&Y=bw}U5NtA2JW7$n2iFm{7WV`?Zg*yLIEuj9gjzKN`bDlXINkNJi2JM8aElmG^QXt<=` zhX<5Ia*#)VQic9-1k6#-LvP)e!@I^_kJLK0^KwlVR>}4;B6bO~lz2Y?x@@~oiHUv_Rh_l;D%)vazv&nti5=l9 zbP2m*5zK}Tn}#u;c>Jj+Q^SFBP&JYVBG*e5FjcZ`4TAOoR%tAD4NWghUEhUd0hhun zzmS}G75giWmblN-2B@rWk}`e7KWWw{mKnSd;k^f3`$RQ@VmThN2Fy$tfjOhEc`L+B z??^d72obO)A6{!@^1LSPgO*bWWaVYLO-3i^sx#vmNF~T&5I<#e1aS9jt&jL`_9siz zMU`-}LZ{95GTsl)dqYWT!C z{Pi8|U%boz`}7Eg-{#Z*M?aD3ZzGr{6ouom=wB`lm#PPdqdj-Tjkj`)upVB+5Biwh zKb9o(60uuWh?3F0XX5Lb)foUV!Q6z3tl;|TGYz(biKZnNLEsh;M*kI97+{YU3yHnu zeWgn~bmvN#yE_Urbr0~3Hb*E9K9npnh{>ch?g2UY&{f8p`pDYqA~QMo6$^o-jwqcK z*@&ryoz1h0GEmrYTJ|C?glNsCZU&u+B5>HSLVr!Pz9H7@hEdu+B;A$U=DuC!^NRez zQa?xOnh7FNsiynfZJ|KRu5R>8AMK2{1d6;E@%{W8r|mtmFX?ld%(NGhbS3HhLf*S< zb&tqlFTEPODhWM(7Y%@-sZ6u9ucKr-U~2Y`5el{mzO7`YcbAcnXS2q{HfM982WhY! zdq-%JfV(%4$fomI`$mB9x*yMO1Rk#c3w8bw081U6$+#3VL2`-MM7o63^4hF2a48AB zOg;-b-;9A^Vqf?H1pyrUkcS+yE>&eabj~hciX$?$w_0G>pv*h-_gex>Z#w#fha%Yw2bp#fsWDe7iqrj) zra*SBp<+<9!E8Xf<3lk$YiFyx% zXhVd}VjSi)w6OjMtXM-+SCSxAQkMI)icP6XgcZc;4)XC@zj{jR=m~i;BH%7{IGhf7 zl$I>FyG`cHH~#Q149qdQ)%jwi?6@K`<3kQ*&5>^OlM@=QH4yZO=_GL9@!?xIs|GTr zlT%@+N_V@cw;>*p0VJ*IMGRtv?6v#tt(Et(n|T6B-pEmL(I?=f?!m1Fq(H-G$fp{Z zm#djGjZm%?4+G?90;hiz!xiz0VS(#VDC)EZ)LO0T$LSdMrM}|NFg`YjSXQ-EpPL4I zX^Tdtrh*UZ+6jfMUuW+Cj+Ep6<+DTv6~Dy}r%$_a4_k_RALBmMExdz2q6i#QVJEO; zdVB^x3mD1~B)|#lB7s#oKv1wzCp#`e%r-UtC8w`FWf%N2_|b%BT|?1vQc3FGOSEHM z?>DTk_-MQ#2Ee|=KVOP5*`9gcCB3+|^xWru%b9^j->P`mVn8WPJA;k%^t$bUE7GO>}d-c4K`?1}uJ?(@gjT1x+R^yze)uAf{eN_^Fr~2$T#GkPw;oMm;8XD@js$JIzhxoP$v2FGxTdG?pMP zciuDu)tDD8{{Flr&P2vqU; zw+{eV$BCi~!|gjGL5i7ebVmhvR0@2W?K0bWS2p;e@&4jRz&r|;2}I1uON{_}ny3In z@YV?P{lH_--lG-v_O**bIWQtw?~yhTdXrw07HO=dRwW8&s@C7uS$8Vl>yFL zSK*do+Nn0JmbW{z%c964JDwY;cH=MgoP$IH9x05_Sp%?x0?0W2Tp2t`?o4&vL&D-p zJ6f{k{1V{{1w8!*xO_JiMa!x48_N+KspwA}yV*e;5=Xols%2tFbsyW(3>BkuAiqW# zNOngvlgCd|?(2y3qkDbKM#E@1rVUWhJ%e(-0pe{pN=)^lbv~Ycr6~^^NE}U&b9YnQ zv@I;JPve<^Zs@lKk9FL0Tf;UUTl<@$`;21Zok^$Zg>I*-LYFAu4UcreztZ?gjh zWrcA^a5+csGYtO$>NJU4ID1gU2tNv{3R(iAg<{jW8hZDTK{dO9a6)xjv>)$SjSd|~ zO&e@OquF{>eQJl`rOEzXE97!n0NOJJOjetaPYE?u!!_F{%~j8;3EHKX zn&$f1S(W3U<6O?SOx`(HRgkZ-mloYF88!Q6YPk>2W<{06jPdwn)Cini3|3_!+MC%{dn#F9+YGJZT9Vda<*uw>HnVoUMXzuF^l9% zvqM?TyT&Mzt8mR)24g5|7FZ~J2MJwTEI_T9>W35why6T(h$Ps8sRofI9=zl=1c7l@ z%~l+Ww-tDWeRsI8dH0tLZ7QoDa$4Qf7nYXD-CrhdA>qD<*R*k|#Vc4dmTd*8t8aFx zb`>RPa6hfW25nF>1iFA&Mx(4%*hwZ17B3*JgOtq_ZN_mb{jU-VaF%UuvxPq z2~jEY%A7yDu3vd$hC>?{jev;app$j(mq7Ln*5{iYL~PsBg*$jE8>T8}(lU2+ZMwGA zTZQMjTi*3uoDCkBDB0aj)v#mEUQ9zM$QsTbZX0QfSKxP!=F8|tLKe^(BJtagUZ*6N z^4pMf3k=xs%8ml$Pes!p+MX+MWOvkMwj;yb8V~s*z>!;3(!eh|2?h{-v%%e@9;Hl2(vJKLRh*fn4;AbIel;fg!2Q z9mO4^nm)L`4GUy)QUXe?r5QR7u?Rx$LjyM_++LJ78(6V6WHIm@q2DT5mMowmT>{VR zXXgfN!V0!bI>RH1a6x=Kjp!=|il9K$_SVi__;N#^bcF^}WTj~2!40&s&xe@Tq zC1j73A#5<0-%_a4B;r7S1<2zyR|m+Qw?G3ex2h_jse&9RLL8Ux&>R+NombiMS{#Qx zYcu*1K?F!1!BFhi7$wKD49x1hixr+BuR7?G7jx0OyFYa+ zx}%@M!oJ7#Y`O#5l+Q(9BGJ=sqX~5YnI<-nrbOOyV39~Dxi=!(LWO#p6F-emrw%&b z{QeM1tZzeVFKm4n&r3y}VVb`j{c6CN%qhUpkpO}P;#Dm1`JjwGeT%Pb`%o$iuTW~Y zQpgE?IUAEo7VHWChwJ<%Ps50YB!aMgp6#yzn`xi>alh>NrC(-lhR*88P2@7KV>EAy zDZt^j21`1{=B_BMfORe7+$Bz9(aISj8#^1d$RiKpFK)Dy$h8!a?#gaWG$4VnsIOvW zemK*qdEFXd=|Y)%YjtpttfV5h`|=U5ido+UfH|o^wuBH zvlr^QWTjo4iCT$R@h@r|s}1?OolP&W)B0P>iXoj@44=6iPA%+XVL6{??bEyZ(v#UL z9g2&#EH7x(o{2ZkA0{14>KN{w#kq`TpQM#eqhpi9uZOU}+P8!<5eiAK6oK+3w=?-u z?Y_c5hf)+2w9JI&L zaB>UzqGwNU;cyn_B-?})56Iy>o>svG^+0-FGRU%`ieQ;#uS)}}`Nom=vc8UKABIGD zek#6UC|dN}JZ-R0m&B?A?;UWp{mioHLZK7Gw3q2Q2@jdg{)%?{eGmG6v>0P(sXgVE2J zP&7#rvWz+gJir>uF_PTw;G*YllKBs}}@#d78m@)^0%^Y|8cBRE7+ zzj!M7%CZW4ASop_0m5t!2v$OGwVr8EEp;velHyqMc(!nkkHUz1g7FwD`(MFg(m-Y5 z+o5f@TV5m>&_qdy4ot%83#C3EcJn1<1Vvgm&&uJ%puRslnl`OhM_@G!n|$XD+zM9m9c#?viz$&kSyVT$UF6%%@w!t8yApz}#KjI>hH&Q(@9%y#a$iI1+-h~}qT@k?fD zKX7~Xf{Uk|xCkKaX4xmi!>kWLXyd1XnhMWAYe&^9?+1EkGiciOz?w{X%j}k2i-f*0 z8`rnfr4}l~1>g_iD)KrU5z3Mjxx4dhcF<*PZ#|8GT=q!4Z}9 zph=$eI&Q_4M3g zITFw75LL77%TMlg2{9Y-?fL3q23O*5_qs@GFSg_XWw&(k#^y%Q*ygrj*U>9 zZZre&DSG=nV}A(peZ^9qH5d9Ol6?2>n?*z77w90;jK&-uP_86<%v^pTmhWOmM-M*!6rqmq?m)aNRmm3Y9uP1Qzk*{*TQ#;*uNjFE4hrhy zED9%08qbBO=MzTOAjkrPC822T)hSCJ!L!QD6zxV2j-KPB{AQ^c@=pDRUe9HMY(5S z6GUE*LF+<8k+n5jIRq1ETlR#vHF2NHygv6_RbRK8RMy9rLN0FM!GzT|Z&iTMn1BWy zd>)2_^*h~V1GsZ*)*td{#r0(u;l#D{R^vocQ?lGcV>J4=~M=CgkCqa3IOc9gLrh%60~!N#j8Qh(Oi{YKBz`=xcsxG zBDUMXGYeBBbKVMIdo(L2>?>V6M%td+l7~D}Nnj3i^%x3#t-VzG-Th6-~978z|mrR!P8MwCQvzsWxRRl+W0hJeF8I z0~);p1X9${TzDXhT8TXp&SX8|JL2KFVrao&!O-#o3gNQ+zAuyX^xo>q23Q^#&-cW= zs8gW<4ogli?TS@oQz=|`q#B}pj&ub-5#lZ*ntbclM_t)UeYUBt(3Wjh`@X%du_+GX zo&A{gV8#J@>g*yPHugdgfrMa~Nod9=&_f1})I@?TGUql4&rtT;aa&tRO>wCxIbr^p($|uL+|dl zfu}!ucTak1e+s4lHi`JxK#PCrzWs`}Kba)_WH9cNxcblj-9uOJ*ZODFbT|)-r2RE_ z_~{7TU;V;gy~*D)7yVeO;Q!ED{B7d(f9fsLQ&Rty1lA|I-*OHI(f7gyGM4g%qz5O$ ze&2bv!9yC@*`drqZ4VQKv8~T|btYG*Y~azlgtja-1dPZqo2xxrESkhVusk4sW`UD* z14GMpVL8I5S1P{pTuf2=4q)BhR0Wn*^YhDfbu^)6KuNkL%$5zTe)<8vcKg5X+T;soji~)K=dXJ3;kxm$XOiG~3iHO{&Pho_1MZoKai-P;O^Z%`}d_ z83|NY=A4%Xj!UxXE+Bym))Q0NnsX6kmGF7D8-e@?b}7LkWgokZ93X&3#f~~uODNfm zHOy~^&-S*q#lx>w(@DfN~cenIgRgF4LGB*c%ymWS~)Ti2dwrtSzQSl@p`oI_4tJN z60?UQk5qnAIrNR@F;0+@2|kYR#H(LQMEg`^gG5FF4n5iY{LrDn5Z7MBlq^pL8?eht z@cmU9hTe%n>xr^?nXCn3jDH?0aoUGzUXTtR4vd|~UW1nxRAUp4YWof0%&MMO*tLNk zWmf0oe39!Usfim&B_=OQy^h|y`Mz(4izS_}_p3dcP5^@Gs0Z@ykicWgrKTP3T4q$q z92R#oKf2w4MJeNX{)Zy`+c2XaMfgXggo5v%CHQ|Y4^L|gDIF^_8%r%6E1ZWBRF9=o z#=%^NLgFDC*h8W)4NDzUYaGV!bN+cA$a*-oQlk16evx{b9PA-LM2Yh)OBgFFB*hcV z?@#^#^RIMd6u&UPeFOX*^XV70UziW|*1ysDcg%-+=5LscPceT|Wd->_hs^`0)c@dF z*g*S%-^Wx4I1lp){s#9@zx|2rhq~_HNc_7fAFA8GV?MQnCv5+#D48C){Kmp}^*mIc zf5&{v_AgADe--6FFdwD_{tff-mLDqruSNL~Gkn0oq5g*`AC2ta;pl&9=8-!{ibu^n z+APkaRv$ng%@XG?+Mik{&7ajo^C){ril4;)dp{e(f+%d{*L*Ow&U+=ddmAxPXA!>KY0F2u8$Us^GMKdg_8Cu+%L9i z|9eqBq!alYiL`$fCGB@b|0MdCdcIdxKh^V)m*nr5-}LaqoPNXdeyZsRca>{NLgJ&Eg+bj>GiV=20C|IFFS5rYE{@HuD4g3IE?E z_mlcxGX1W>pE9L;e8W?M>Av0a2h2y||FIZ-uLpl&KA!ju^P7_YfcYr={|@t?f_-XF zKRNxAp1$+^X!4KTN#W4_qg2v=vzdRA_?Q9oArsEe7yP>@AD1EcO+EBaP3f0<=)Vi> z518MD{8N;V={SGK{C3M9==}E@=^vQ?;GO9y=1;2rf1-TkP6~(q5&x;SnVwqEKjHqx za2WpDJW}=>IOBf?r>6bxCjI5X;$^0W**q;b=>(bBOb*0wb;*VZ+$ z$5AGxrlfp$ii%2^gyg}!vDDG9HZU`Nt6{A}{Fa%TlIr0fB^@;-9W5op8%jDNN=hP< zCuxPBTE(|shZW8vQ$MVXN5fjf*i7%~1C&1=QKETp%joF7Df@r_`-buTX-G<(Z%03V z-_BA$I1Jy8zilaT=qUfYAN7O6zWpd45Fb)$JUT}V58f&LLz=U1zsLQD;K?`IzwLkf zJ-+qPk)?mQ!uYWFuGZ!tRnEJ`M(#9V$jkZLJ;Rt8!LVcaJA2ja zz$MoErI>4204j#&g_R=X>OZ*O2;w>>IUKWxzTXGSc6nP+u&cMjlvcUUiD_ftd zZWDt0aNG!b7zpFZScrjohqMB-%9H8uRi&@M_&XVi*GUO_HvQ*UP|KuTe!=GZo&Hq;gN3n0vk*ZjNG;TChL9^lK05ip^-xpDyNZ2XQnD-d?SBotTE?O z>h3&22EH_?Qv?!8Of&<cs9srH%`Y!Ytb-_K0WUl_+Sq*&*!lQJD=?@O5#caQ)h7Vir>&T%GwgCx==&1^`4 z+#?Nsf@|ox**o@SNVGfwFX4C+aW$I%Cg!H{1|kVK$qa-7vcP8;D#iQxX2#~oog+dz(V5IO<@q%^<&p}8;WHJ7UOq0xDrUTkXSN){8BJQ5 zg~fY9M>fvl;0@NZE(*bDyoy^cUlnPRwLWDLo!WsUU{Nb`b%a($FKpi{lYdHB<^fgE z&-0j_zd#*HLUjNd;cBV!AINH5t_Ag>jGj`I(7@U=VS*8rcwY=v5=guK+C9HUW*pj{ z&LrFfcq)(c@XM=ufDT37hH&tdV|1sXKAw_ZLFZ(o_2~6z&zZa60un}i_M3FX=&nNH z+LwoKPJ2VhyQ4clsA7}^LqL@Vm>3im8yE!S!^Xkm?S-h>>+@6Go9)pbRiCfMtsq#D z=3Pig1XD9sy_+C-1FR*c5lV%O0~Vjj%~Jr)jp%Xx48_vcIW@-a7y>&5!w%8x93l+z zi;W_D6~Gsn*35&cd+L^@T-x*Un%ZbyxBcZXF*b=3zdpu9) z)Gtn7=#NsO-aKFEV7Q06Lv z{8J>)!K#Wwd+AR2E$ppjZPnAiV3e8QOp4zu#)h47-AVkB(AVUB^TW2GWH{fEONP0#;q|nKU)$0(XuLStiffE@O5EN+K zQZa%gJBXq=Zu9}Qx=>BzMESsC)O#1S{5x1mPJVvP&h2_gTRP=6IIW^dmf(991#rbY zVrgy*POwW!n8{FrU9Wx1@JaJD;Sz6LcjCQrz`l*w{s3w11-2Ac2~8Ch9@JPSqf9UBRJ>D*gVJDafzOFxh7GU%Iu zf8;zlA?{x)`T^251Ew+d<*hY#u?uM@3kTvVEv^vH5(Fb%{R|YWgZ_;cyJOt#+hA6o z_3*SLy}hr>k(x3++heQ#`D@$*9ano~y}o4Er#Az52I!~n&y3(PzucM1_ma(48Z^;j zA%v{ZWmNY?GOFXzejGV|L1m|-WnOqRzP++KfxL`0FZJB%p(t4vb`8r~SsEqECuykm zOcCEhvG3A13kLf*%1yi!7cnt!<8H0g;9Z^bQe|`1(<%Y*Qnf#R6Pc-?#NJgk0Q-3~ zc|AlQzJd$UvCyN9-@NqlV}7wcVXCF^a82!nn^$b#vbAK?gp|sn;yeUKhsm|-&BK6F5IG-W{hJuUe%g>Z`k9oL+I<+QdGi*c`Y=!h z#hZ@nlxOBC4pnEPKm$sZRtboUg@KngB(JV8qzkn=)WJ@=J1_;@bC&M6^hoAmvD#>w z)e$xV%&_yIyj=#I{9u}DN32eVr7p{K)lY$6)pJ;?H9FIpqYTkx^;~m&VBe}$fiw-| zF+DyNaSs*|Gt9=;Hc7O9qjp5m9T*X^tvqoSp?09cM*)!7kv<_jB16_a7Te;xsXnJ< z1V_LI_H6y|0=un{atW{nwJSYHUm5xcm82e#SHztjEB8a0bhsnO1FyRZnlC>zvEK^ zE<1B_Cs_oF&K|-@yOpWPDCdej+1`f0^8g0AkLhH?%Iau*(geMDdulQ-4T6C}*xnN5 zIBL_7%DffVhxmktMu!W^0Abt{#~o9U5AqS!1SG+oprTBScf2r&=!;tj9D<5Q|V1`etq^sZWf=3Df#-0 zG%osn{v+LO!<)KGCls+msi+fVO|&pin!PX{Gc4Dj0Hjz$-|4h#`?uP6j9rfY(h|uyV*38VLZN<$5}Wx@P5n)QFztrs z&~y9ECbiBG%OqvlI_n0t!iO#d_kiI5t|-knBvBG|GusR1{AG5&E|VQ>2d^~L06x=f zEtHPP(5g8C4t1Vknm|<(7c6QquHMhlwy^5>_!ISg1v%<0qf=<0N+HhYUZBl?(^8|x zw@~L*%s>E?c*ybH>8vi z+-6@W1ZZ+Lbz-9K3Npq#zU}Z+h7(@xXIZFlxc!KB22nMb5a5snPn)o1!1Uur5 zI|wpQXmVU2VtFNl)Wl5j5xSO0e2G4(`}pIwH0jk*C2h6NJ{{YhTSS)Fn*M7iA?R9R zVU9QWNmnwbubyd?`y?<5VGD%@MH;qBME^h1-U7OcCSUg^36K!t?(XjH?(XhN+}+)X zD{&$2?!;Y*ySuyI9o}Jvcg~#i-E+Ui>eXG+wW>G0EBjy1ubxsWKb0Vh!dpiu4!=5u z#ul93RyWz<#;-_xHl5s$KI$_GW05VBErR!pY$Rp@u9j~QRG%Z&?=o#LW#Xp5!C-r( z4;A?E8j6pMxG0(-p#HwjE8|?c)tUdxw*1Q-`%#}>S%j^`OxdHc!WU8;+4Es0X32c^ zv^6e<$dvvb(Jy81+=~69CM5^b;H<`Jq;qT;zS<3FFc8lCkcMdX7P^Nges6?p^KCTc zM`iWqTq`F5+h`RVt-5$uUd#zuY-4xYY8NWCs^G0b3Oxm>lB5mJksD_a|K_W-!^*%vM#O(>t zp?&y(DR%Zwn?(V2+Es^Tix^nttY-hw2VUZIO=N_%taUA>CLj9S#@B}g+w9=oW#hN32sNh zMuh%RQAB@KBE5*$0jz>T`}*CgBN{}^=?thnw1X)MJ}Y)=&}qc$82bd9O_ozkqBEZU z#&{G;8n9hsW!Llh2Sq&>Eq74?P%d9^!dVGQ!{Z1GNJS89;E%P-vLhFseIG}WM))Rd z5IvY{1wf_7#>FyPLN1*@pF0B$sQM~tUEOQM`BHx#7t89m`w`@UXGunRz)vp>O`YJY zoaU7|$V}E>K@w&cnomA6xbdP>ygWiIav5tv)f^=tm`1~2I7J92AT}&bp(k(*wBwyE z!y=J#@-;ZK;=LEkJM*9$T=Ycs3wq&$?Vbf+mS9~+*L%xoD$rd!t^NdAaCPginL;GC zqlIMj>fQ?8;YAF5#lp*p3&MKgFHh@Zbk19zh~k!QbO+o5YL9jxoXWXCm8?GuFfzKeeEkxydF0`AQSe5Zjd%-Ux!0 z0*S-{!VgE_i|?h@G?88KvM5W@xpc;lMJ1m6ySl050H(f3ZDN}v8D&D~xxt`L>~7_= zkO{sC!S-+;=LkHbFuK*IF=k#LM`oF!v8 zXZDlM$!53gcYot5ayi_OSNj8`W^w}?1kSjjGx6v|jS4AYtc>Cf0!2TL$sPz~FNL3o zuizXL*C-iE#t#z>VQ#fbvJ-dB2G_9o!O_%$H>h6ovUcp-IFS)JkBm7vZisB*h)<^a zdir_=9!-}-BICeRiEpfchXg1wqnN?b{Cn^PXF?Aab~bmSMCJrP5wCo^OXV5S%0K)X z>#ac7QsUXtkbax!=5GJ7oj{8eLbPZvE}}eBT{53(ANiW)3>#TC^X&GU$up-X=sao! za3A$X#~!i0n~UDpBW&_Lng}Kdu?L&y5B0K2a>hDnf&ku%wVUKmuOo8e9axi3!5?#2)W2nJx&*PwK46WKN&JEA6;wq+L8!i;h zXEcf<*q2F>VGsGNY0?YB%(A~YXNrAh8J>05em1dje!X#};pJd(z+37eP=pggH9P={ zPvg-;`cf5Q%XVbbPb_kQAjw;vz02%b&C>*`0kYYO3Z1$FuW5{xrWR#EyJ|dp01{+& zNK9!RhRASvaC$kfJWf|RR@Z^Dk!sk?#d|fjYw1aL2pn5RkV&H?m-}7f`^WsO{Gywu zI{0FPl{Hi^g7G2gN{|`ayPhC%m<${~Z5L&8eN9FEp&rqJF&@@O4fyi&PodbGIj7fp zHEZFSX;L`+&P0Xsg?U|cH~egzv&6I_?c@_&Ayk8;{&+e~Vb{V2&Zv}DVHDdZGkb(8 z-rAkjCuKbH2D@2(3pT# zkQ165H@pZO zQmOVvq`0%BJe(woY?JDpc`=!J^Ap<5prfC#L7Y{bwwcb2nvugEzPluty8VDUJqjb8 zs)%qtc|bEnQ{b1zLsSeKpjHb(>Yq7ZSA2=IrusS)=ai>f5%1I8ge5@vdDh{TE0e0Q$YB+>n* zh>XG(r?_at-(4CuGmSfJ(o#4t*1Cv%tQDH-AkBa0LD@Dp%}QYr5ZHZjHke7L&C+`m z26nN0=ylD$U%gn#YV16#bX zu^^U5)a!buttfQ@tCA$BP0}`D+$Km{AE0H3I**H3UF}xXLkLY_Z zI5>U&$2jAOxUk!Ca=HoW^iA|v@9kVnOv)BvefLckZ3%zk>Es)@(x@+Zk%1t|$?CBo zcWMAjX*-5Q2HkHr{mDX5&Q@ANmPVFFTKOK)Tx0L{CB#B;Rg2_uz{19xN~-WrU>m(z?r>XQEu zYqaz15H5WX(IBIeBA>ut)l@2AC&L6Q*yR~9liaL0t7@|Qv<1h~SF!r_5)^Lx;W*@` zZc|a9AaU$0Jsj8gq^n#{8#eVK)K=`%3j*oe=_wP01maGTh4L>r0n+z*jZBddw$45ufVTkytn-!U( z&F5B(%QmhzE{N^b3JaTDEmex6=a#LZ)~+(H^I30to`D4PP9!&q7i_y0`8u4KJsL|T zc|_h0pxB~qCc>M3z7%6IO%46ILYKz>{g5FYbxd!bUR(2{Cd5IeG*&sOIjB)C)sZG@ z!qi%c}05edNopXID}<9I-6v4@8bG@a6ZP4PJbs zE*elgZRYVPdhFUfA?IqH&p3L`8XVHU~S^o#v>)G^kHO>XA4+juV|Aa z+c<5ui4r4NTJS3AfC6Im^xXzdPEbNU@WiN%w2_c^QAF`a>`|_}op=ed?b(n)@Lefk z^QN--5D22|gYhpG*ZVJ=^fA-3qu} z^%B_(-IuMi8Mye*rQBRm`Q>te9>CR}EB7SrF*V_hGaG@w(U6l9QnIsy96@G|{Y0e64xP)M zbNAgjT;ix7)X`p?=;O-4jTyZQMFG=);zLZI)B&R}G}}0kH>*WXB4`;VU`W{7g)0;s z?a>)6B77+{p<^&o0JeMWnus#ACd>D*LeA%kBN_a8J>Gv+%LFM-%_DAoYzqZO3pt5PPfSi72D|Kx zoqSQU%1L2oj#1kf_q9xVc!*itqRtM+=4d=GCEBjOiv&FG_MqTDhbI zjHUewGdxvfk{5(C$siYy0XkOxz8e=@F`L{XWS|$|CH_5Isd(g%bpb(Y+5&Azx+vX= zL6GaJ{qh&6DN+kn7j+nJpS8;J)vLrH-gm~v>gRM#LJoXdaE?&SMiJS22cIO_n}C5g zDC zT(RiMJ5|!ssa4aS7?lvy>2BPg#aWSfeiVm&T2g#$BCqs84DxG&MZeS#aQ{c5pE4>0 zemD7L)yoi}g%7KkYbv%@?%HVv&g;-x4=*o)8_-(PIDQ9SPTp=^9QFyygD;9L*dERa zbrJPdSV~)#h+?yGqujUJQw4P#x6W$fvb-S^3?2_4`nsyR>sP2GRx@580+_F<|CR0j z6H@sFln4PxU2y8Zsnq~j#Y)lARNu}K>Xu+u^bbntnGlEm|>Dn2-HA^j`B%;bEOfF?=q32*HXJsK}#VSE5XK3sIxE)X~ zU}&drYiez81!#ljFZ2cglK)dpf6MtBtn&AJ0C4*-cQz?~PqIlE}c zE3e!}h@8mADQ#F}nZ>9fmnd17o7Y-86q1KFe?KDl`tB0}5U@YN(OMK|3Gb(vcY{R1 zz}ZNLGqUVdwQ9yq62~<^&5WDolI`}_J<@kIzSCc}oL(mHUb?)l#cZWLKE5QJTCoau zhhvQd3uGfZmd#f>BQ-Q3B z(3Jqq)#2oc+1<%g=G$tmO)+cJVlgeHN|ltA7QGVuO1unMT$G zxzRwp+BXiPtuPLa;t&~B1+@szvM0<|4u!HPdH>=)ad7sC!9FXuvuEev zl1<~R9VptXmMKntgIzd#-T!JR4DOtgc=%?XZdw z$0Y>4&$%AKut1=Gx_-KG3o7=`2O~K8c$bjmUI}9(8hTW1Bcw|@`c#*I!Q{SSV=Y51 zVK`)qyUFszW9EGxX?55#iX?$@4$%=+%=gh8>MSt7GSTj*M<-fQGe< zu&Whtc1iLh@0A#obKwz#u_9a@6yg^zEpaVRBeZDPtgoU@$ZpvxRWt^xz5qXhfb)2v zRl7;dCuQ`OVYm%RenkO4x>oriqNeQ*t%pi7z%E$W=+-zWA0 zc@okvk$_5#zpDyXpMq}}jisLU#UN`QYB@M#cytVGFbw!A8^x3Kq=H!y+w%Jt5Q6*d z?^Aj)ojxEgpcl3!_evF+d%gZ;Wkkw-J++tyarT5?q?LpMgHmsH+XL%9XcOG_z{FTC zXGj9slJbPqqDA6MyL+8U2JIm@I&~$2GFy9^S?CGOrCtJufWkoSG;6W9K1~;;pS9oR z7&$J|YU=B0AH~;zdKbJ)n0cCe;`J!6KKDB*ussta`yN8EURJ|6>-4SRbq(R>9S1Dd zUfas8=-Tnu6V=4%gx2r&`v-oJ4?l-L(4hu1SOhwX%T-W$inCk{I}&Wpww|@1$9xSl zzzmwWu5J%{+%r;nO?X$!#zR&J&4IRzPw68^Ldg^JHQSeuLy6ou`^?3uw+3OW^<#)yUYb*FA|wi7`M zuoW)c4Q6tP2hAu>*FHb2yta{rl?~o9s#De=d(otKhVwv-FE50as?4LpR-{M?DwQ7CLHa1_kW@Fgdcm}T#h_E3mIEY z^x#7=eRm`t8X6ufB4?_cX=F1LKe}_9g}e|RgkKD2p+>_~VIzFC!YQ7^HvmD0je7S1 zSZqP{rPo;N4kf)3IE+wRYXehb_H+U5<2y}GtTxe)hdJ3h-Ps5?pC#1?X%Svb37*p5kGz)mJhjZKBe#7#>X66R^n_{eZ?DNSuwF z#q=54d)c|o7x&N=?1(fKshIT1=&^h%hN3>|m>LkjBOHi&a{sb<$7ogkGSn|{ar5A! zzH& z>LgT~$jc?p0k4^PWY_$-(V_y&0vc+CijhY{@owVl%-n%9PxN`ycg@7?w%)L_B&gfjz?)0|ppuffW}X z#Q06)_Gj|EnY(x|96eJ8g00>Z_VZzCt}gmWycnrSyIFL{ud@Rx;zwG^Kr!T#hjI&( z+<`&Xc~^R>A*D6>4FC_1uGtMzJTA{ON=p+TmZZHU&5b7W(T7WK>xQHwY_^>j5sL4# zY%J%&%Jf*$Lb{P?xcFRieh&wl?oo?I3`v^~Xr-b+ohA>7=9TYU zT%2#-oWNT{dbBD zp_rg*u#F0nJbJVh-ot5Kc4p!9M>X(Wa`h%^Xt!aXEa+F^*zd4oSy-v3GkQA}OEz8C zK||cjZm*}_gkbIT(9Q6y$!A5>$$Y(@PfSRn&6$LwAbdMUm;zjcb{;lRC3XB|d=dq_Mvt6U5=rYlRwbv z>D=vE=6W8G(aEx4i!90>Zjbv~ZG0O%OceRtKmLa3WlWXC-u%(2o=q}T@+L_7wfyH28pc^$%MF%fB&E}q% zhZNBkwrn_V%mMoo&OyOYTVFT^C49k6s)KlMw-I?@adKpf%SnMk_SM~y81>p#rDJ0) z&aaiOP3MZ%?b@c0U`NTkpPVkKXeP$^0)}zk+0|Mibq_*olZgd$Z2jpu``Rr6EsRb5 z^P#SMkP(j^)iKi(PlzLARJQ$oQ2G{@ptOKrlRm4hu3Z`n<)9fO-^Zj-c(SK&k7TzK zgEdjZcy^*-pStJ=ATX#N!Kkn~R_9&sDsoOK&>U;Z{JbWmFwZzCbrGHOa@QWMSixop zEk+86_Rl1d`qoTqxC1w7@cQ6Iio!ME#EA~)%;z15zz~i+t9{I^6)+Q50&k~}PnnL3 zR6l*zm6}AK;4SL#2!!Y$fJ?Z{;u0grA`B%B*}URo%v~iJ7;_ zZQN|*->igDO(lw6_(|bJL=(y+r?N>n&`yQI7amseeU{LZMa!H(H*B;&DbHNDqhcbo z$T=TNj_m~AS~hA(XU}U!LBq>a0q_Z9Wv(5{?EB`|56VG78b>V~TVyOz)@YCNo&{Bb zz71#fY&LYT!h$33f%rF8RW;AkuYfe9Ohed8io=WN{nPZuI@$CWGo4bu!U>EE@iDCs4ky4KqynQ~>OH4#D*U>?-$ZWfj zf{nkgj%@uVZ4~5o>>sV z=vO~P(}YU2QV`$~G4q$wTOh`be3acGK0BEgwUgy%a_`TfHwJm?=jFb?Nh&3$|JtqH zw`$1grOByxKuvsa#4%=JP5a7h`8_V+*fc@cuid^`a17LRf;dnTTYD+kLMi@eEu8B+NEo zL(pjqEQg5j0(HLUev%(>Gf@e7I2d;EAFac`5NrpsnG8Pjpf)5a{p6gBq_%dJ<8_lg z%^Fj4^%52)58ru8pAln26nP-ItTLC=g+$ASx}+yQ9vk($axa#tZ?~-!C!-r&*C&|o zDu}RTQTcfzs7~{(N+(tj)@q!%uv)20gcV)Xjsn5}{oHn-wNnQ<5n^ZZ$_y^JxrKVR zu_#qjIK`|v3tD&PmTdkG;aN&5;*%0&PPv4%Hd({PqSt%aQ&T+~mitzAC`9oa2#c-u z-OQRfEd@0-S@jLzt4w->A_%4wylnVQc?H!WXc?i5oJfzXp1re!yztR{kPh{h=viA9 zri78uv0;fU7Yj;&z0g4GbL~VPc*;WTs+v%X!P!Fx(NX2GYt3y2|F?6%{LKlZ8qqR1 z5LHid!)Q%ioVp1AT5!X(A$j=+bcG$vQMS~{iDg|zaW|$*y1{cq4>d@k8ysM4mOjS(ZU+@_U!g6B{sf>P&y%Ym@ z!6ir0K(gP}mTFOPfVk1)}kW1TuJyIq?)tm#snpzZ88lhRdwUrTE)mA!=--rg{f)e-b=Z{ zOS4VmR&U&`IET365x1EAL~tK{)YjkAL!f%)tp}glWN5v=H6VQ$(2-wzF}2!f{w;ga zK29yzxM^La^Geh8yfFL%0!)}+x@eADiv`h<;+o=4CnHFDuT!w;h}I_d7{oA?4%hwkT~?rw0c*mz^*Jv}n)Gu#EU+zt5D3ClJMMxLH2f zZa!oZ9{b{m38E5rKFREg$7GFijy*fe9UqaBi`NM@tYS?#-8c(4!W+|-@&d!1%67g2E3 zfzn$Aw!8gyC0nrY8pV{51xC&k8r;Gki_9GSZYtVFmojPys5F3@agSs!7(rs(t(N1m zW_VE+T$KY_&o;QBpRUta3->1>H|k>tQ=*u#PZF*%_du0Ro4bT@`DSx~+j30p%p-a6_8C!ceM6laM!@oTh=ejv-ZW{HR z@An9rb?~WS7CvELvi9d$zyvlOqAMigH>B`4GJ0<)Q*X$wY8cW3^$m<&g@mg3I|=vF zT8Y`aX&V~L=J2hGOooD@^p$Xg3%} zY)HPVbY@NB!7)LnL6Jt|%+b_B)8RvmyOOqB#Su>CrejxvZcvcwh#1h2gcI`AT=)?c ztRprTOH1ug*)8@8nprK0e<`XIQ}(#p2Tm~LsBR;45{PEzUabgQOJ7MCl!7_mbXz|& z_g!X-N9$>Mi|WBCTzi#8uP(@it`|s7ywJ(w_pVR*Kajwt$({qEsY?U2$>N%lufRmZ zOlYx(U_(w7=#pEmOwc^B?4mMc0=B9%V5F2_x-^Rxc~|i4Nb8?sS8^nEud{r}fvZJL zJhJ7Z_(yi{E0GHko%Y48^t1;SyehN#D)dM)Txsd`u{kwca{D4ma_iEUHR3kB55d~| z(^pnaPVzYIuL`71;^Ru41%_(51<>^B@CI^!@IVa?nim&g2B8;0fuLDiW;r~nmcBA2 zqcK3{Q!$hT%b)%TTiq?FcdeEGu$o)8_$D{M8(!9PKLe(8_RH;xSE5Ok)=^Ig06OsYcT$ zz`j>k-Zx0lwM+l3(?)w2+VFh%9h1xS_(|O&J0H8^suJB(1RBcO6*$#maI}(#DHl0E z;X65GPtC@d_G!J$$3yA&FDSP7b*i8fBzR0*B26EGAK}{h)T;Uk%Sxyz$%Ei3ww1S- zR7X`)fjr!<2bt;aNV5BGw-)f#kZW@4jFb~=U{gwh;16TTVvjq2^!RM!Kbe=0>n@)W znyr#M7fQ9_PAQfxA;ht z?~};Z%Jmd6E%Y=ud_DKA2RlKNG>4PA;p;1tzPF;G?^VWV2MiJ}h(Mz$@) zUC_bp>73D~LoijD{vOXqC)Bwh3|xt$*{ehdLBY~Uz%;2JaoWi~U+IiUj)-XqGC5Os zcB(qu+rK{tauZB0u7LUSp$>S9K+v@gx16DzA*UkK%g6!+OL)|oIrJP@OKaA=x)$Mn zywFVGX3diKhM={9zMc*qLWh=IKOqT^4xX~;3f@IA#3{zoh>@RlS}D#RQFg$H(~YBk zjc55mF6UOQO2dmXhpU*XpjX&!XaW4EeQIfAlI7I?d~e#uQU3LulSxUvd^qu1F?V$F z38WrJREE}~X*FZQUHFm17d-E3{bs&P{ z)*T6uL^OcFA*Z@pQb=CUQPt8^%jRm}4hvjEQGVejbvvRlk2O+-Bl^9wd7RBbc+K%C zK_1B^sd^%K{gJ7m4yfDaK$(1ipkZCr1=|R(rm2u$(+@Bt01Vy-#$Fw;C2KH=z0E8sb1C8s)O1k|i(P&1(R!^-Q%3*KI;15I4hYmL)IS)BKs z3CNv+!NQ=S%)5XOf*%M!5Xyu{?qQM{YP8^0sC&pRKnWKe93G-$EMu;&t3HLTfJ!SV z)F6E7f~vVFmoaV)K(i9jj1pkGE0Qeg^{aIivX#$ue&y9d(4 zy11S>hnt}v=nP^zvkX#cYOsB{f5l+Vx1dOHt5HNsR7{9K59-6Jn8w$T7Iwf`u#(J}yZxBpIUqX(GE{H3-r(fpg*_G?A_ zA8Olw|B!z^%%3aK|HpN=^t7~p(|0tZCC$5NAOcTc5V;(~Vc8|8p!fjW#(*8=P*9>b zH`YylK?G&R)4C{qIF?8=++FHmrp zT+X&0(n5(*DF4wCf@N}Xt%)s_5fuTi_Nh3f(94Al^OmCke8Gf6>Z6Hk*r5e|1k{6C zJqRT@pXtT=VdSWkeVtMlDwd2}J@}UbYJ10`luQO?ea|e=V-kEr)Ior`7Y0JOkVple zwl_j}e9hdcII!BY+oq}nYyE|=ikv}meLm@s_*kPclQur}PV{cS_|+N0HOJ=%BL2vi zV_+9lhpXMg4#bB<3OfFsiE6&cmjhH6#OrUnl30(ToTo@WtkBqv4&mBA5SN&7%4Z(3 z{5b<`HVxPyZxvHIb(C1Vw8*0-|Lc2COY>$D@b)^Xzb)YhD1pCRIDV^)e?K$+vX6Po zV+KgCe=qx2is6@003#hOIKwZc5uiZ+l8k@XU}OL&lfUe^e&;Z;0Cd7%W;DNZ{+sjP zw8{Ub&VSpl|5*PYE&kQ#|5)RH*WN!C@Be#C%(V1>sGNUVMf|T+PC9z}zpI=PiY^-P zPDmN+Nl#{^N|Oz9_!3U)hdu}vny&M%xN~xua=9c}J`z8^#tsWm0r3i~5qgJ$27Q8q zR{}F;-LfvNLtJ$A`eIRfSf_M5by8HkSlccd^n4`srFohAHY0K1^l{~}?RMueRTz$! z_q}LLR7`vYKbn)oDwjG|XOlVw9S~8O4%* zR_&c|M#2`LYeI@$s(TI5NiVZB z7Bs6UGtpU-ItvKAPlG!fmZSX8m&W58Y3_H*7OPa@9LU^$r)xJGV?8iVH&U9%Z0aMd z(vL3awqae3Ri7EL>?FSkMU;^>^Fa(~K9LRkx*#L#8=Nd26g|KkiQ7twn~zIA~&wk^Y%E1wz;4>wRWTr*Wq z1DITQyBwrO? zX}^qKzj|YONI;K>`&oH)1%z~Ske^Kh99N}h9BVqKN{!PCEx{|t0f+^&J)TuTv-Ug) zXx$YZNKx;FpErk8(Ba%=kQciZVk`>Kg3+cm(GT4XkWl(h-zqC$Mn;396bIWwH6K4D z2)-kN^146{V%UAo?%9V=%iSf)|48FN596dnayFe{Weu}N48#pp`Sk77GyIio(h9pQN-I_}i z{y9z8yPXZZm7?+*g}%%f5W42R6@}S`f~oB%5a$lry?*<=#vCW=`A0ry#d#!6PqUT9 z#qf^oa3zmj@7*YEvaB52k}LWaUKLm@vZv)$ySZImPL_8=+)|u=yYBeyA?5+D0Vqo6 zOBgWNAI_8AvLU7rMYcwDqyh_O#b&o~JKFi3AAl*`gh;t>7gGEiVc*Hb5x0OpKPMl&ji5A+#D4UXMpNV<^hP zUNhxz+kcqQC5MIwhIxd zJ!G{vmTwN9w_(5ICL$GZV&3O>IBlAN^gfFlAPqH(Ci7TsXyPf~r2P7sO?e%6(=D%{ zh&Esax=P=6b^j)ZGN`4@&l;vhBP@&4VpXhJBwJ>6G6tV7FczaFXm@Sjd9;;Bw^Al| zkCI)+6~~HX=oy>?)GCf>%Us-LXh%aND9vYsyo{cmO&8lxnz?@A4Df3_AZXi?YC~Sr}Z=CpjRBVuyakmn&_ClvMk`pfkZDHGg><(2k-1%N@|-aomK>IDfN<1zEDr%qw)OpLTIk1#R;{ ziHeLlF`u(xJOf=lMGRVOfzq7=I?a2)vrqJi9o~0!r!EA*CUdLR#o5jE$GZG_7YK0PiMY&$;npPYB;((Zm{hZ zF@MzEi7@*!6r$74v=!+0ST6WBhYbacttpX3-A1cY;CeZgk3n|{$+z`gVV$vFIo9X7 zN+oIG5H|z4$C>9=L5ZF#P|74NP_Oa}P@liWUF2~}W4}7}gV21y>aLA?0!`vfhW@X= zcK`h0^?w)T{W81y1F3xb+50!760lFuzrs8^z*gS>3iDLdL}e6}$>r^JEe&*S4dh)c zB>roF2k^yyYw?em=vU7FWq=0=)&3FQ0j_=rcYw?P7}@zkGaV1WvN zM*lsqd;8Gd9vMJZ{=z8#(_{VF{og)YZ=SyYV@O8_Km!3c{u9~Ll#w*|r-5nRRUWnx zClx|=h0|3gukG<{oV1e=LjNurJn#3~Mik9?^>uw@Yh<%kbTHp6&i<>r$_TqXjTj*X z)q@%95ARq7f)O5(lN%}pE_(i$D#M+K5wL;V!(F>qTkSfF*vX(5xq>Jh>+rZCGnlGY zt0GHHjL`@*#w}JLkv68Do_Rzl;w;dX%W5a`aWTfuEb3;O{j%PtjqpJrLP6NA$-NMB zpDGuSR#cU3dHm`#~6&&^AboLE+CHe4IFMw(2ZjyAKcY3Z{QOdqKr#(-m^^a)R!w$tQ)hrCg@O#4K%JeZ7n~DL%A3 zJ=rixnq-i)6mnY44Y6an6GMKf(Y|w=uQ8>c^CXti*Y0shb{i1D!eXVqWPRXBvsLQV z(J7?{eh2X-{rNwowO`VCOOegFSC$o}h|zro;d0Qm3uDOP~(;O`-flJ+h2 z=O{)=%Rof~$oq>3X9i5C{WV9${Etrkg@gkvnPnT z{v5=9f5z&6G1UJa&;P%s0TlG#DDXEb`Y#UrKehN5S^ck)H*)*e@rM~8ApK7U{H^|9 z_IPjP^&5@-MtA=r#Q}HzKL4h(f2ZHf8{fw4KmGw`MSj%+@Z-P8?|+=%Mx)>PzelIH z^0(_hneN|pesSLb_8U^Ha)F9 zgpL^OHeZP6St_TPQmy36s!w&bPi~i$otsSpmxPz_2)_Yfvjj>#R_VcgvFB9LQrgu(rV9FfT&uTU=018&N+WSU!SsF^%FNv*CDR?3-(t%&GkF4+jv>FsYXsBp`rZwM z5G1zso`spE9m@I3VD~_IgjTcJbCS(w@7PFm@ntS*^F@!m(Qp#(N+HtgWr%aS0PaXX zQWOF62RPM84)K_8+_Eidc(A*tF~L)LbRo_sp<5AQ3DgKtS`F@{&RGQNF^PEa#N9NEKoDafjDY4&(MiO@n$caLY$-7DQ0yJXC2&qNEwoUL)4ey)%Y0f+2XG;eH&@^c*zN|Md5Cjr^ffBlV1W@wB?epXRGD$q+-do zst_0_#3N&NMIR+)$a3dV+s(15M`I0gxAF!ELSO7QzdxO1+(By<^l#HSyf(8w%e~G} zk0^^6?8AFSb-rpVU>Qay<;sfHB^ksx7qX;_RmE}GaD2-xe64>cXtM`2Z8CZXL|-@$ zlE~HOBL*v@fW-LKH4RMyGAmGSOpaQPT9#TK|9kW_i5UZ9AewkY4v`Feq3E=M8Td6g zW4vp;Yeb4rtJFv)z@@LyW!l{gsP?OCqM86@eu9j6q2aWx*@t+E(p)9k;zGu0H8afG zbbvEoE|Y9(;r@9pMu+GY#a080X4)-_HiWaKH*9Ba9j7&#m0GEYL4DAwuANPm()tj@+QfiF1WwTr@8G782OJf?a20s3Ww7}WBt zjUR%1XVHEz+SFMS2}^&jEV_{Xr|XAtHaD9PFn6qsF>Q=11iy?jS>ey%HD-oFZYQwo z%xCLfm;ysweAx6RaP`BdHK85r<3&5i9q{0*zV2+zYCkEC0weS7oN5TemyPNh(^#AB zK11*<9(lHd`5x~TKJVq}__bH%4yg|#2y^ge2QV+4*m-wZ*nW17-GXWqhho4QvT#wE z$22cJH4DLd*F^M%KBQyckrjifc<3V$8+FmVJa)tk_S{4ZUjy0g7un;uh)nHm zHG24<%yQR^C>toxB=7u<#;5QMNaeM1?~jZ*iBZ}9b<&HjWm>b!ba$vvcY%VW)Z0{y zRDMot#}}%#pUE5*2HB7%UO9jUxFt+_PcJ57gW2w1V7pD5lsrFJcDf8b3L-PkI$$nx zk=M|>87qzY%X+)WaaiQAxY;NTUJzcvaPM56USj}Y(7ltEndN!0cnz==?@Bd!)vbE( zPh0mF*UcL#<0<4AHP8WfEJ5lu46p-@{Nc2t8D1O4+uMUxhnFb}Xg4)AJ4^;4!4x9;ASO?ZSx4)%Z$UK_8P}-a9-h=`iyLY|2ArR>%H9;4NK)@KL_QiN*3~4RLLxbUi ztd~$!SmsoPv}$pYe0+I%E2;&Rm3g+yD)VvS(&yzX=u0WxHkd@y#>C@zq<)}p_+v#K z{ErFr2k}aaX7D4AFpU!qFN!RC!KzRu2lZWQX!6y_>$s$YgF?7*iP*)D6z&8v$XueA zR35(BPdpYbI^5$K4r0b(I`MjsPyq_H^K2jXa9d-ih37KZSZ2rdKeg&9{Wuj!h5y`u zR639k{28U?!;6Jsp^rpNlw1pvRga4^a5hZHkE_p5bLZrevuo@ujdcj}0RuGnlT9pGL2m`Hni(tp|`vF0~k-Eu*_s} zK0*4o*RQbNZjM}c`uQ-)`vtT zp+!r7NSIlVl)xB_a|9UNb2nj4jZbUsmPC@q*>i6{cxFVbJ&H6>)D4xL%$BJdR`%9b z_lPD=Fj$xj#VjphlJPbfWtk$47bE7m3CJkT$iL#aH{`a~m}eCK)P#EEl&qtRT|Hs+ z`^Z4ms)<@nKN~HjNs(++C+P?V@pXS?yDcy@iN`|qoHcVI&f@_QZ@k&TQZgcJUs~j* z&rzxz$1+KCsMUd|D3ve`-Q7< zUH{(0`5m_6Dyuz4sSe)m|6%Pdz^eL|{&A5;>Fx$;4(D)aP>}BKlvsZlt@V zkq!YtIs_%8q*L;L@O$+N_}=%u|L4c^?8kk^wbx#2@3m)U&3tBtVp%nG4WVS5CZ?gi z#K6==L@FIFn@N;QlWW2ZfcHisSf7w9SYQQ*K*rv9)vn|0U@kKC!>fre^vN;rEMG0b zJvg5!Ot$+V*4pfXrrgQdM1CI~j_KH^npcNVINZZxPK7t6ReKg_>bcw-upZj!gJ3;G zb12Gj7TMwTEtV&$io)=rAP|O++-8Tso-Hr50gteHL%F_FMd1f>WES2USm% z&)));)yeDEnvb>i+2I8``o3 zEY_C}ejXX?-d5L*@I%jT)zUn!-OO=yR_0y%=JSl##)d3wN*jxob-_dCo!&7cWXP6@Q` zHfB0*|NSCNqfjkITl;>=IGdUD>Y6=x|^7~xy`Gmg2I-!Gz zj8vDBFaQ z&=;rUl0g`)x-#hi-0ifpbA^fS#{%op+9{?s4+5R861_z*qIhkJS%sK`HDA6Ue9^dF zJU{gwTU=m5N!6m4;6Y37zgL;`BZbnD;X(ajCXq$0W#f^CC3C;%Pi(2d)p@s5+AEG zhjq`xa-iJ&MLvd~u`r@FLn%5p16-E;40+?z?*TP%QpL?4<*^fkrC+pLy1HBChp!c^ z(SJq-nAQ-3wLT>SoZ8fDhixm|WtD3)GlW#TigfBKZJBq=(oa$f4!<%{gQM7(@1^h8 z_DnZ~Urp`CEDGK=8bZrW2(4Y9AXpCV+O4n^4p4^X@Tvl$`C`;{01xQU*g}|3B&k+>= z+MK|uIID^3bIWTCVOw^ut2Z{e9u_6uiw7~jXQdB#GL&`S<_$a$ZwfvALEd#)_IiYe zbIvKTj_$cZ%pxdrI@8og(pz_{aH2%f6n9D-pCp9JjF-C^`n+ z+K3xezox_+;gmDX`YDlo&lvctC92)7q$^TXXtxjYW_GZEr<~19m zj3-Mcs?>=6>zTe{zwHCCP$bUl_cpA(rf(9QAlS;Uk!Pkb&kUeGdFB&H&11| zkeP|qnOyZD>gDy2^MB17@Au8@-aq7gG^7hst3j%{>YsXx7(z2$R2>8h_fGU4ur z=SZn9y9aqIPfK=aX1R9e;6Z~T(I@UL%}y&+>Q5P}eo#bU8~0RvauFXb#g0hG!_FNq zORLFf(?B6PglgDn_wzLDz6{{0wy9TWbeBd#co_SoMRntzdNK5sM)7|3*;1gtZu_ei z;>VI_sun05L$N`0*1*J1uF?G;zG5^~d+j?#t=4|mqb?sFA6Hf#bI#$g!m#!M8Fj@L zfyTy*><*}`J@)6-LrF%{oz57{1N{eU=7krTw=Ult&liOex9bi%`FyrO>?w4PlUR`a z@aCPkg^q5L6F&!+a`AoGRiS|O%;C`93l+E4YAb=a`p0t(EPf10sIN=sbz%u$O4L`B zkTV|m;CgID6t-#K2W`jMTsH$S?~4ka>02~|GLk&fcpBJZ|87zc>;&)le(wX zi?pS*WE>3;7TBEm*)*~acDjp-ZPDET+#)3ReJ7z6hNfY*_8Bw3Ai?VXj~T_6;K`6+ z*G>|fasjlxQ}U;5z^JrRc?Rd|6%y>Zz|eOM!%C+*EOB{|Y$S?&bY+S}N7xFg^;*^a zdZRDX?;%Z(T$-b9aD&c&A&;x=Mmk)DMSR7dk(EzL7(^Gv zsYUm`Pjc*6v^vD92dUJ(D16&v=BTb^47Y!(6r5)JI>QCEM!1H9v9u4Zim901GQiq2 zPr$xZ;2uEcI0Z&2C}3|uWY45Wif%L?5qZkjFTkhS-m8Cc|AbEm6y9_}iu6pys9-TB0;#W%+@afm0)Ftt|?z(vf34@*Fd zSjHzOQ4_r&ruWfFssDLMlX6xw&mKW`o1mOJcD-~04+qP8=ye;_)If7L-4{(twM5@o z68%KA$b@1>8m8sG#Ft>2ZbTEbsiYu;{fGv#vUmlIWX(VB=1bF?c zAgoumS<_Rqi2ra~@&e8T9U!TYVTDWbG9VGPWy2x zM{@u*e16tzOYZ~usz6<03I^rKD&rfU#`&GC zO4p@X`AYLJfY_SNHA{)cYWU4)gbGd*VS{pMsr_gqq61Z8(A-nSZR_m>T8)QEK-EFZ z%i!IZd$oMlrSF%;m!ywtq5K+om^o7Oq@JQ1G-C)a0H>to0%P%3Pp=y6oe^mkE@7>Z2*5KCJ*M$? z5Mk(;Ikk?-r^KgSlUdBIs(483-Nfj3O5y1!ol_j*uY0MX~VmoqPO7Tvv@4YoSnt9B0pNMdmbop(^&&X{eWlLRGfFATKN z(cf|3_p7>pZ;aG4L(dw_}4m?oO6{KQXE!q5K>Jg*6|0UKEv2TsjtVYN+#9M-SZW z=7R$Yhs574gN^B&PVbYOLI==WO%7dIxo=P;v)a@!Mwe&eTIL?SQ)=;^cxdQtrtinD}8ChiyQSp72S}DJaS*G#8x1&L?#$;@c!nCO8<1#L3JJu%)dl_$$bZLW{_W98=Gyu-WbfbF5v81h$pW zY~73guwz=%=-tfMtuGoCIbl#U(;slo=-Z385?NN=i){}-+uWG;N;G3{CndZ+i}-Pm zx;e``IPHuR7UB0*)J7hGCpNjjTuREj&x01oO{U{Y%yAd802HDg~BSoV|F~$Of^#~b< zZ+B)L7~r@p(t>W9E%LU%kjWCK3DuO7AoNky8aKi80s2(2=H7bcUNv_%nj`r$DP60F ziQ?J0IW6qSE$M=wx9(*G17zBtTAdn*zuc?jX|EYHblFG|wxfatTDTdEP`q zh+mM`kd>B$B<{bHEbQ80`xhVaKOmYv-K&4X{(lemfAA4Q>TUh@5#LN0b~}cF3Bb+_ z32XS5ix}e4{+o*!04b8k#0II^cnx*An>FlrwfSFgm;XH3KPUAIN&mkBUw{Dc4S%I} zq`XBND_ZybKHb(ZKqNX(IRk5&JA;)+9lNGGQA=B2T1bQR{K%qY!50;=rQ!T4Zi%^P z&&oOx%Exy@DHwY6)iBE0);d-jKFce8K_BZ;+t;S5Rz~U(n+%#tOoBV|L?H`j>@#r! zJ}oKXJm@}MZc#)wI8WvlJv8S|p=M@BiJziFBQ$q~Tzs)+m2`CJ!c9AKB+!1w%*ta# zZPZs-?KPQ+?_J56V{hOVy$(96QCOvSc!Fa`B2+cg`S8^XZp;t8_9bIB%W71ek75ic zpWzHNN$+u$A29xKTVlme*jN6>mEEWn-bm4e)!P#sKk1Gse(JdFD$_`-Zg+bnV!K81fJ z6n=R3Lje3NxBU}9^D|K853ly09`2v#Y(Gm_{*wXiKehYU|NTFUKDhRmU;D`aDfGws z(^LO{xc{B;|K*zhag5h_;ePt*f8G0Eyhy+PJiZ&>ccj15s-F^ zIj!`kj?(hza?gbmt8T>n6z~JY2D$fT1*ZC{Ax|S8zY$e8^Rjf6fK|T#;+{)#Qb3bT zY{*5qfC?n|r+$TJo@1q91;v1#9?ws14El_8y5(xPo;bkwH9Po?%Tdoe*1ck}66KyG z^}2eWE6V_@31#||M0coIq3pi;(V87?Gy5^OfG6XGeZ#h%Tyy2IA|jH$NX5@eL`?^# z*AF=^YFuaL0;RPba_2!@L^b@P$0LF6-@~m#$>L!{^)}1nzYmgV2KEk*={v{Q*Yijl zM^}p4I`UkZ0uG6`zB@Z6!Zy@Rm{mR)57((wUv-@(kAEb{IW1Z4+|WMWaz3p#U)F9+ zs-`kDu{Bv_)3`r~bK(48c^#yF2-im=*H__lnO?d>iovqy3rwgy{VvH6hV?a@rC zRo^+!P+1FCdPy*GFEHuN1V)yycw)~$R>-XMRvTfj#%yN$KueE}G6o;o7&dBiWT9KG zHwX4ElPgHquvG5y>C3k8CyxWG3y6|eH+)~<%FZd&r3<75VsbUF(`NDO3UwhpfZsM??Mh zsOyrV9u7(A`>dDGpb~4CYksR!qc5vCTE}LeqMH!wmE*lPP3HIbV8VLjd8aKN6*F4Q z!a3ekvY7K327>dGg_2qZj6rW_42t0nKTEAzSckMHG;w~On9Gsd`%r*XjU7+*? zJTzz%bEa08&}Pd6HfD=NpsL0PEH7V>iD!z1b>xxD>b>Q_3^{qSu^+6%Eg?@wy>Mh- zkWzK#(W;L(?lxkOC@V-6)vHGdHfLp$K3izzG_CAa5`piP>qz>Vx50w7M3{dt%%PUt z4!u4iDm$agors+~i}VM-h+=2HpGl;aa$4jnP!O1t<`nfeNA9iPau3EA;63;S9# zM_!LlP}5Ir8@gwcRbwbMd+R@JVTCEod}jWbjsjQNPKRhSSxipo92{kW2UqRO^^ud* zf6|mDc)~N=E^=I%vfzu{V6?9ZluUrbRe8M=Tv}4AiOG-$*Qd@{zY1wMg+Pm55(Bd8 ztnlyDa9X0~yCjzHt7}oVmrF0*v{E__pR<>A9cOXbs|bgVosf{~NEbwBrEWbUUV6s< zLpxE)pqiA!{-g*)_xx2FC`v-`*prAqHxoR7yE`MyeRARv8AF;iEnt1&LHT6hoz1A% z@ByDl+KV52vM7;mP9s~WEZT0{?H>hPy-XbT2UD2p?d_nvByC=4T?k03PE#FpE9ge( z_Luf6Ke){0#+L3Td$4FQimT~?xdPgHis19!wR3OEeW7(%-!(DJ97i@P=ut36Z8apt zZbps>8Rp7TT=4G76wxOpoS2eki%NBse9k*}abNR7| z+WZOKMVLGSWk&~r7!~yu5o^`_@m0CU#c(H!lXBBYwtH@jp_P=f*2P-l!c!yamUqhu zOfeG|gktQ{tas)5Up2=6q~HSn1=aoydi;fB{;l9buy}uHxSSAu@i*#GN=8mbMh${` zR8;>P>hWjv;tkODPs%S@_`hkif1n;A=*3@{N66_Nz#}Bw?@kWfn}|m?h&IawDQ*q` zKr~lKaoU?vxj#iT1o`E%ml2?46e1h% zk=M-^V*TiU*t_mx%s&|x(Ue-hy)o0|^!CGA`||9!k7Ty9k58gHdjzRULE5%<)N}nH6wt!?cJHycGIgED3r~ z25U5<0uys`>@rL96Sdvf{Y+1RK;ivBK$3S_h@Vgh0S`}s@I1$iM>+U=ba-@fS9Vt0 z%taX3j=o8t!QMXR?&<`v{YrtX3I18X{-#QGz1jF#1^pi~=QS|(SMp@GKk>5v748uL z;<$->=QL!9|ps0$3a+QgcXIusZjrA#JagwE1QAGc0KJoUv zwE|D^H6(#vgFS6N;aVx4l{Lyge%~6&7V?Ojb&xfTjGj^;e(KF(AYmV;$+x7s<5c&p zW6u?>3^FctGAtxu4UWxBrOk?jl4^$LzMFxGrbh|cr9?eh^J6?+PKIXI-c){u)Rg2( zJ>Yww81C0uf7sp@sX}8GECd)?9f>b*aWPNMW?{bVMX<3bMo?i{k0w1}H}@qPQ#K#{ zgruZMS)3oyXD;unMayRpwH3ATfgXgk#x`ZYmgwVC{b@lWq2eJV*-xI*hd2I-AEivQ z1@pa}FXa=YC_fiOsuF%Uuy<6Z@X}6o43(hvjC~uOX`hnJqLq5A74|q@>Cq(hqi=Lf zI7^6gXjC6D5MV3))D)(_yW)?yI-wt>A-Dr6zMrj^+C)!^9(N$WV1&^(Jq8lneLcQDR7@0n70o&%Ys9i zq*=ci8X>wO_i-IcNIDcjuZY)h9JPz<9<4^WC~bUst7(x}rssVFG_v#Bd9IT0{4hZ% zqu^1kXG7-F8o>3Zt@oUu90H@M#Kd4=sn&9-K++0SEq!o_>9$DZn+8!-`5l0rd<44t z_ig%LeSCezK;q|2XhjBrEeRBq6f1QHCZkjV$loUPq1p`E$K+nx9xUWhSvsr&S zamvFfOJ!bX#-XN#f%i@OobP64%f4Xax`);`ogz=_8!bAAJ8DcLkk0^!=wu_*XF0FX3=4FYag+|4HllDaIiJ z|CiSDQ!ZUA0Kc^!NY40wYdxG0Bj0bOM@&InUPX$*-oe=6uS(B97Q#PuhF?(<|A$Zy zj_d6H|7)xo696)xf9!YH8B_jdzk@`003o&$02}B!Z9T*s@n_EepThKdy1%SQ0twmm@L~=(?1o0@WT0P@J55s4LVoJ#xhhyOg z!^@YhCH$$OBh{${cKa7X%2_B@7+Qg@4NeBb?)42E_G)h~41P@y|j`Jq#hmIc^Z>PDm6Ejos zGpa<}(_dZQdt2*@_%{XUmx8YOE9&Dqb;T6*vEH}XxHKfy3tX;Y3_H7!4hW2p>#NXM%cqNhDg7eU z_G6>C6Dp-05|-obcS2&PpE@6Q1|Co|KWTbuxGb4oDo=*ar!>Cd@=msjX9WIZJL=%q zf~$4Q!e_d9;z{-33Cqdtq)`A7?i19qEHViPIY`B!GRP z$q%Z@J|JtxTKrJ22d$FeQt)+IKHHamS6K0B5%~zkk9*tE&);C1u2ox6k!jQ=G-J@a zMbvaJkf+1iOHH!gFIF#I@gZuh-)RYRYh21IriVcqUOjEiHt7no^YKw&XT%VeC9V)3 zg1!)dS-5%?&U_?xC0)xnB~m?BNU4*q<9s= zqFfPr2DUG8BH9|3=p*dOQgJ(kEVI5$5lML)Cd!D}y?~jGOEQyZ7(-TsE68w;)tHlS z=dSj&h=&>(%>r%mX3`$BUrAEf?ff7w*P;wy=x{zAL5N=nemaZzj5U?uMDaXT1q%D+ z_~#s4Gkzuy)`yF%#v!saIVboh<-3tsP2}}lZSP}y>${hVWDJsV4BHRr-# z>Oo49ddVnC{w<5aFh*LC9^<8HSZ<-?7+xsEEa8(CZHiCmo5v_b-+T2g5);Xe?m3h8 zU{=%80}ii8(?14C9uD%1=^k*qlo|BY?MD-HE18ozY&g@?C9uIpYx$GQ=5^3fCsbJZ zb2|ryi4yKr1r!`mhI8MaX)vOOTF@)LkX);$u5WzoW~}aJF?ho30<>AnpK7E_V)76= z6!hl`6ws_DU7-)ZfQ}O92&|F;OZF|9v_54>g|KOF_vv1`Bi&F?cvvYkJY_5lA3YyPj8 z3Ol5H&7bmvdhoNPq8%Rm&b&>MiAnwV17Zoz)D*G`RV(KVXH0r=1mEP8{vG4B{8z?( zHKU6jUS>Uu>fh|BNAjs_Lp$?_R@;~v>mLasUU`ds&nzTEdeQyD$I5xveV@oq zAJ#6E{N~ewhV`(9l24o5Y0~t_B>1qCXi@*(IjU)M=E2!bjvsqSS7jG-u}Ktto33XWKf6tXYVw!XYtT0Vo~3PJ)XXLVBlY@$lO29{fVV<{#4YE{5dq44U{fMIHp155n#V>os%E}YklAc3va z)zDU;UhsP=%m_yxFdHCmZrr-W|5N*JKs5u5XWEz z`Dee(;#Y%t@s1uk3C6J@i@#*tDo$MUc_FLhzCned{zZZ1S>XXYI1@6^NL|y^xmy)j z!!Z2l{o~6=Pjme6@>uitVs$8pmzg}35{Z<7@|Rdrg)%{?`4{vXtMM}>@kXn~wBy;c z*}R^!)*natGjberCaoz81FxVa3%8B$GK-&4od3JF_=`3CT>sa)(r?x9S{wW~Yk>Ut z%^H+dMdYM~7^D>irT@koAYr$+k{JA?+!@RN#2X-1uK!gv{LL2rhx~Nx>|{(Jh`oyq z2m(Ufy0=1qe}2B#ll`R_-ki~&Y~hzB=YMzOvfpy!MoC-vK1PG2qzmE8d6QYv^(g3z zD2(Q(*u=-BBHc=P8x@H{m!2ua!5Q$&Qxh)yv-m)!3PDFqpum`19BX+E<|`k&+5&<} zeC8BZ%fZBw)Y#}36Q0z_Kt83truCNz-3N!o{b?iZmoqgwGTpOBYS2vT;T(uzEGrZY zHj6NxV88f0B~KQ74|BPH zBlUPW$q$Dm;x#~ptR*FU2c5mtcQV?JdKHQONZ^8{vCEp`{-<1leVk`pD{3FwHDV$8 z8ydawF3O7&-U@u{IAJNTJbmVJNISSLJ3E$UN$R-$WWLxH<0{pp`FuIn?qMzKv1fj% z#DMRpX0|F!?i6AzODYkS$l40(#CXNXU)DVEm-$SS6XMOiKCb<_e>*rKk;s2Lt~vj& zYyXe}|BK%Ft0lzldNX+XI`sO6=NZJoMs|Jt^7j6^^8dlV|6zp*m%xHqqJHgIk z;ABB)p|y6mQP<$fWQc{6%jXp9vFY8GudnM@?k_Kc6Ow1I&gXwz9`pI_AALh0zXYIf zjN62JFc`GMYYO6s^Pn5x(KZWpDC;bkCvc8vQWs@7+U_c6JrKx2;HRBM=6^}Fa=7GV zwwXv@oYvT-!W_h;NFuZN?YW)b{__3Wx><}ZZEMPRDUwTJT2P{OZY3!j3xl?CbsMu* zTbf&d<0vU|D5@Yv%CCl$Q!+=9QVJ60;*@K&s68WZYC)b+Pg*8SrSLtZB&8<1Q>)GF zcFzvG$UDn+3M4Fu3JD^qVlKa^jYVXUW{%}5~K&7q+JIo5q^f@VbCwG&T7w(Ek_ zD6|uy!2=~lFJc~wjNBh^hx7eLx%RaF8>MGGKa*l9p?O2l5;PsYh-ad)5Zeb)jBfN7 zk@F3PJh?^#U!t7sKl2mOQ7(5#G5TRJl%wd% zG?AW2?W%ttc@)>X@`0moWcec&U5MBIZlnKI|NMo5ZOd1zB~(qsWVi&Wv5(X@*)hg-I6r~=F zMKwVZq#O~|FaH=k<$d$9IEy*vO0qO39Hq5b{~+xMz4kM$?~Ihv5#pYX=~lb@UT}mn zoEfRlBdq5v7>S}}m6Q3H#gvSdZ){6ZlkgRn7$WpznnE;URE1+%eIU6`&@fUp`Cd-G=wY0P*<2YMG2Ghd# zaIZCM!_Qgsdsl&G0Vb7E%+lSa9;CV-7^>9rf;lvpx|O8uS?_s4g8^x-04>1y9NKHL zkRm@9Q4b6_ZguY$ntG@NPrRiN&hJ-Y(d;ku+2!)-Bh}CPai62H!wN?U(;+$ucUPRg z@T6HaRNFA9k2gtIb=WEBWTtMKxzBxq26AFoFw4q&V6LD^`O(I!=uC4Q`qUe@y(>w# zH)`1h=hzz^w!h=ORbDn{g2~w;ql6-xML$B@Axlg`)f)|@$w%_2_gY_ur?(go^su6~ z$;}uRaBAt-s2AbDFB2??6oH)#Y^$~_kIFIQ#*H5HNcq3z zte#t56o{bIacRqv%(6_67hbWJb1OR0ajI8)NM8=4JhsVy$7pY#Ao@%TR$Xuj@0@Yk238Zl1ci!7+Grr=CcLzlTO8l;i@O@%?=^B z@$Vc2;+{Cxe0q|SfDhV;=yOnxlm@0SPfs&qgPmDF7BQXSgVzJ3ig0IJC6cmph9q3$ zW_7HJS3{Zb{5J-S9k`fQ9$1(b7rcyV$T<~o zNqt$5iXkJE{$MVrOseAC10J0;XKHlKBUGYUCTR982iqU{j)fk9QX=KQgZ)W~aXQdJdBFU(tA#W+qEL zx-w%*xlC9HcV?EX52)9rsd?~RPQ3Fyn!K;FEpwr?m&8nhu1!wen~$Wgemrff&a)`G z|DkNlqEVPnBBTVy!!P6c5pi;pfv{F`-Fa@$hVrZamK>T|R9r7C7kPjZlIyzBOZ6@6 z6WS)2?@erFKzYP)ozZf>p~Flee)QNbJ+u3^5~H2oLh)6E#DMhZGn48*^~Gv>H=1Lq zwUWI2m!F#ApF6Fa6Z&)Dzf8ve>rRV}o#TcIsV(=x+Lslr@r>apzM#PS zskD7r1U&{8irF-V8@zi)Y={-U!6SP`dPIG%H%>9RNL_EgOF2;Xg)@-oRRpwUVkSzo+xRK2=o=h`sFf$op{el; zoNKWeX3O4wIc6wTj1E3gSMKhw2(>@H&=6X+UWqqbN6I)8dSAln5q7d_hhIMOHn7K~ z)1s9A5;v`z5(P}S=n*g^cz>=a;-p8JVe?(v59sB6=eobFQQ$92AtYhd-;7y*Q~&=@ zwEwWhU}pv0O5_bm7X{g5{nIZ9^r!XgPgCK4wS9m9CvI*Zs3YB_6kV{ox2+0CU*&6B zGA2}9z8&Fn6k}TiaT{oj24&tC39DClfF&`1{3&kec%zC}lbNaN4gVVsm;ju>hZ65B zGX)LXsFKtT*p82J_6r-lEQ@()e^9MZ(azg6!*{DOKJ4Bdpp{ML)qSzGh-svYjq4Hn z87q6f`xDR3fs6=uTEg65-@M(!FUa-|OI7P>y%UMZJb;Jp2iCE@OzJc>#&s;vCp_tIc!V9~ zM?b)?6RFnU5YZ&J$BYmo2us(v+ft3`r{t#pli9Ha%bN*H$XYE=~bi1nCtxRh{ElySbiK^*5) zW-{PoyhT4oxiAyo^o+thaxGNcXk1|d6-IL;Y7E);5|lN=*@h4sCrHv^$?}A=Xv|1g zHE*7Jx?R1^9p!m;Jrl;ay@DDiAmU4GUH1Tq@r2I@&N3#8rlxWL!LW_J(p*eKz963DU%(VQofe7}#7;eVI=f){LvwN_Qcn~BAbMx`=gw?@>^ueKw=edU5`3$`(p)ztp{nr&K0pf?!s0Z&^4=fhfV=HPX z$^0t^E5A9^&=<-vRDcqY;T*uz0$zv`X=DdPUME=E>L!^&3WKLZ>!W>+2QlzpY5ZcG zR60tKwZ5d`CKsE{T6|udbI=5-aA3x+;su8w~t4R%r4nY*Wc6`}D|ljNc)grzuBb|O9xi;EMSi(RC5kI?9t zfN~J8gY15J$(*`@Oq^q*M_2VRhIz0Atg8rX?EvvpUC&%zF|UfyjUrpsTKY#m6wu}z zydr+{;(z8UgpIlpUP^w|TbN9-{0ETzNvE5D@{ zOHeA^2isF-Jh#2)MsE5YF!xEA@U&;D)zFfkK*PCsGS#%98Y(lTDPh&!GyQdq|8UIQ ztAoqt>o7boI4ik-a+e>Nula&H4ikGEWtFOBOLs^*{lz=}kyY_*NB*LEW#yPbroFvC}}V zNL<3WVtH$opl~={rI2I$Y+E%)Ef$LmgxUowiP&a)Ku7G3yIy-NjvTxK65EB;l6?px zo)w|JguLe>^r>$ayVO|Ka;}Dv*5rpa_sxQ#ztN_%zIa?UywEYm~k5OtUN&N zyCjJ*_D{H^p?jsFX$?)wnyW0&x}pRlwAB=#kj!FnEFV7FA7>qcfXGseh28LN?eFW6 zc--UZ=1zy>rOyl~HOGi)Mb z#^Nf4hyhCH3ux{wAW;dQRw7f|yAcM|UBLn7U6r?=q57=qM}W+ktFrdxyN+jKV6vfa z5dzgT%NjpB$o6rhi6zv4YV-mu=e&=qU(rV7nLXJMbJ7<*Q#&2imKf3fmtN9Vi>@@R zUa?7~ZmX!&k;ch&ujjs8HTC&oK{1JdaZJVU3qO7xH35A9dUEFF>O-bzdLM(4Jc6Hz zmM}>ADV@BGC3y|{gM%VGgn(M{(_R*29^}e33HANts23r#uhY6<1!%q!o~SDx!VOvo zjh@XdR;qw%OIs8#g_=Qo!~F^6U&S2*PM@zl4?be+|>fzTj=EflxnJiYFmiK)+4|AIjEsm(A~`WlsP*9lo|zYvI*2ukRB<-) zIKL06ua|K-xbWUiVDPaC7~je`fn9-b=Vw3?C8R{&&a3{$I?(yw+zlVDVKobca>u>>eR->rpl52SXNXYxBoS&t;3c zL);8R1B|-?W`idNwmBvQ#M#W_orO#?OXf@KTGlNmDn~>mY%QOwaEsV@I@z)&U&^x8Sch%2KA$srxBT3|5JBGaf{C0Vq$cof29tR+*WzFaaqB={ zxP7>UVyx`&=vrZm+*+Rj6~hlUd{uj?k9@YIfdhA`gP;qYSFX zLHyz7(tFt5CfZi%5ja)&Ew@9F=j;^a;4R+ztD|?s$f%-*Pdzz~dpT4xvJyUKW1%F_eXMlw!c23(M130gPPXiA5F>El!Nd{^M3VCWPf zQ5qM6gs=J`KlXeMx8&T&gYl9R%#Xgk9&~u*h>HKJmU7>QD?(c6t~7(#?*Gjz|4*CM z>o~MO5d%LN_KnRdBvA5(IQtVQuc{%dA})O^6!f~3)!#!wA+EXG;_Xj&+wTGYefJ8! zMg;s4Z(NY`>t;sQju1)pw@^?Bw&5Qj0e}r6?f!}-gG`rLx25QXHzA=Dgh*FqQ z54qR8cG9;Y=;yrs-=otZ(6VD7D*t94LA>k4#&{cOuK4~7f6Y>Ls^>F>u61?q2(t8_ z?9vQ05P8GX))Fnj49gdmZys(QdK6?L+hpt)jI`gw{m{gm)D3Ev+pu0T>*GXiW?co% z!0Rq=KKI96;J18$^K5sl&Xj0m_SKJ*Sn>1UOL#)Z2IzN<6!hV( z9?f%DcB_}9oW|m0qe}?MZvi`eEa9`%=!r;?0^bD*<3);m=WU^EJdQu9wZ}t^Es+e| z)ms}}6E1(!_}Vks$94f=X1_h)*(zzY(ZU^<`t(V_+mB-C2Ig%1CspJah%w1a;bM7P zevB5SVm%e)o#PB>XO{f@(jnugvjz25WMFo7i0#6d>>nBjfa@B_fBi>h{hP+g0a>m$Xkduz@HUN;703zk zm)&T`$pK=$-5(bhC#3S#jdlQ5HZTW7W%~1404tcC^%f11s~@snZ?^;eg~q`SiFLlw z-}R5{aPRBC-*aPS143{$H)+?2m2ZuYm5U8(ZAV`6UJgPjX>yFV}| z#8-d29T?&>yiMa`y*8uW=nu@r%6aSA0{{?k=$-z!*f=0M`;BV>Y@FBM_YE4D3jpyQ z-=qP6ke0V;kQ+l3;9J*Tqt0gTQ6EZohLj$P2!8Ei0G{%yIiUvvC0Kyh|V}8^@h@$;ElSH@Y!C zAY}h=`yN05$90Xk8|}bckd<|d282AU+wFjmQf;^U&xfXoqy+La4-C4WrY;1Sd8V4)KowdsjS@yTr0XvBE z8c}y+d>jxh;!Znu);nvB9n8*gXUq@|bNiXHgE{Zajhzc3>F?YZVqU*RW9I_0-5v`V z@~Pgv7I^2Gf&pB2uLS|_J}Us|8gq2x8Gu1R;O)6V-UjF0XT^SpKZ7|SNXOg#af0ux zKM2dYEk7XNH0aK^0AXPe^X;wiaY5<}-lB0pUfb>U2j=2{pi6FE3;71GO}{th3;B$$ ztt+=^?AK)&ZqYceZ38!H5LSHW9smf(y3>yR_O}W#xInn}?RIQ;WgZ6``yF1w3E@|_ z$HK{acfOnuNppL?5LMthqr{DQa6;hix7QUXC*Y25!O6*fhj(&8s=?fzFBfELx9)HqflxSa^FIJ9M5x^94|rX3_Evw8&*;ur*a3I1Wd~jtQ@S}8cJOT-1Y+XixUIiH zbS?-Zx_#~cH!}<1wIXQdVb&>z2Ijz&kFL(#0=@nPPHkY6LqIVz47UK6n4#wnppY>} z_yM;7qt|6Xbr$GlB2cR#MqC;Kvp#xQ83KbIJq!$il?qZAloTaq=A;&Jfd)^5Gpka; xjcWa%{QMFHV61`qm7aNN`3k^T1+sxXq~emqq7rcX8< Date: Mon, 4 Jun 2012 23:01:30 +0000 Subject: [PATCH 155/914] add exists in visualSLAMValues --- gtsam.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam.h b/gtsam.h index 5a6e58687..3c08931be 100644 --- a/gtsam.h +++ b/gtsam.h @@ -852,6 +852,7 @@ class Values { void print(string s) const; gtsam::Pose3 pose(size_t i); gtsam::Point3 point(size_t j); + bool exists(size_t key); }; class Graph { From f34ae951fca8056c3e29ba8ef8861bc03ad156d9 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 4 Jun 2012 23:04:25 +0000 Subject: [PATCH 156/914] oops, missed a file: add exists in visualSLAMValues --- gtsam/slam/visualSLAM.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index f71d0c4ca..7674ed1e3 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -72,6 +72,9 @@ namespace visualSLAM { /// get a point Point3 point(Key j) const { return at(j); } + /// check if value with specified key exists + bool exists(Key i) const { return gtsam::Values::exists(i); } + }; /** From 647b38c7584428ad82c152e53f324f1c120abd76 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 5 Jun 2012 00:02:55 +0000 Subject: [PATCH 157/914] small improvements to plotting coordinate frames --- examples/matlab/Pose3SLAMExample_circle.m | 4 ++-- examples/matlab/plot3DTrajectory.m | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/examples/matlab/Pose3SLAMExample_circle.m b/examples/matlab/Pose3SLAMExample_circle.m index d1676626c..1c8e481ee 100644 --- a/examples/matlab/Pose3SLAMExample_circle.m +++ b/examples/matlab/Pose3SLAMExample_circle.m @@ -39,11 +39,11 @@ initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); %% Plot Initial Estimate figure(1);clf -plot3(initial.xs(),initial.ys(),initial.zs(),'g-*'); axis equal +plot3(initial.xs(),initial.ys(),initial.zs(),'g-*'); %% optimize result = fg.optimize(initial); %% Show Result -hold on; plot3(result.xs(),result.ys(),result.zs(),'b-*') +hold on; plot3DTrajectory(result,'b-*', true, 0.3); axis equal; result.print(sprintf('\nFinal result:\n')); diff --git a/examples/matlab/plot3DTrajectory.m b/examples/matlab/plot3DTrajectory.m index f2c1d8f2f..524b41d33 100644 --- a/examples/matlab/plot3DTrajectory.m +++ b/examples/matlab/plot3DTrajectory.m @@ -1,15 +1,17 @@ -function plot3DTrajectory(values,style,frames) +function plot3DTrajectory(values,style,frames,scale) % plot3DTrajectory if nargin<3,frames=false;end +if nargin<4,scale=0;end plot3(values.xs(),values.ys(),values.zs(),style); hold on if frames + N=values.size; for i=0:N-1 pose = values.pose(i); t = pose.translation; R = pose.rotation.matrix; - quiver3(t.x,t.y,t.z,R(1,1),R(2,1),R(3,1),'r'); - quiver3(t.x,t.y,t.z,R(1,2),R(2,2),R(3,2),'g'); - quiver3(t.x,t.y,t.z,R(1,3),R(2,3),R(3,3),'b'); + quiver3(t.x,t.y,t.z,R(1,1),R(2,1),R(3,1),scale,'r'); + quiver3(t.x,t.y,t.z,R(1,2),R(2,2),R(3,2),scale,'g'); + quiver3(t.x,t.y,t.z,R(1,3),R(2,3),R(3,3),scale,'b'); end end \ No newline at end of file From 9a8e083697a35a452803763e87dc4d257caf35ac Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 00:17:37 +0000 Subject: [PATCH 158/914] Rotate covariance ellipses correctly (plotPose2 stolen from ASPN) --- examples/matlab/Pose2SLAMExample_graph.m | 2 +- examples/matlab/plotPose2.m | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 examples/matlab/plotPose2.m diff --git a/examples/matlab/Pose2SLAMExample_graph.m b/examples/matlab/Pose2SLAMExample_graph.m index 142c9b36d..5564ef30e 100644 --- a/examples/matlab/Pose2SLAMExample_graph.m +++ b/examples/matlab/Pose2SLAMExample_graph.m @@ -34,6 +34,6 @@ marginals = graph.marginals(result); for i=1:result.size()-1 pose_i = result.pose(i); P{i}=marginals.marginalCovariance(i); - covarianceEllipse([pose_i.x;pose_i.y],P{i},'b') + plotPose2(pose_i,'b',P{i}) end fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file diff --git a/examples/matlab/plotPose2.m b/examples/matlab/plotPose2.m new file mode 100644 index 000000000..7dbdebf5a --- /dev/null +++ b/examples/matlab/plotPose2.m @@ -0,0 +1,11 @@ +function plotPose2(p,color,P) +% plotPose2: show a Pose2, possibly with covariance matrix +plot(p.x,p.y,[color '.']); +c = cos(p.theta); +s = sin(p.theta); +quiver(p.x,p.y,c,s,0.1,color); +if nargin>2 + pPp = P(1:2,1:2); % covariance matrix in pose coordinate frame + gRp = [c -s;s c]; % rotation from pose to global + covarianceEllipse([p.x;p.y],gRp*pPp*gRp',color); +end \ No newline at end of file From 9560997bc73f3fbf31fdc2dc4141427a0da14d16 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 03:51:21 +0000 Subject: [PATCH 159/914] Plotting --- examples/matlab/LocalizationExample.m | 29 +++++++---------------- examples/matlab/Pose2SLAMExample.m | 13 ++++++++++ examples/matlab/covarianceEllipse.m | 34 +++++++++++++-------------- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/examples/matlab/LocalizationExample.m b/examples/matlab/LocalizationExample.m index ae66a131c..dacd6d972 100644 --- a/examples/matlab/LocalizationExample.m +++ b/examples/matlab/LocalizationExample.m @@ -43,26 +43,13 @@ initialEstimate.print(sprintf('\nInitial estimate:\n ')); result = graph.optimize(initialEstimate); result.print(sprintf('\nFinal result:\n ')); -%% Query the marginals -marginals = graph.marginals(result); -P{1}=marginals.marginalCovariance(1); -P{2}=marginals.marginalCovariance(2); -P{3}=marginals.marginalCovariance(3); - -%% Plot Trajectory -figure(1) -clf -X=[];Y=[]; -for i=1:3 - pose_i = result.pose(i); - X=[X;pose_i.x]; - Y=[Y;pose_i.y]; -end -plot(X,Y,'b*-'); - %% Plot Covariance Ellipses -hold on -for i=1:3 - pose_i = result.pose(i); - covarianceEllipse([pose_i.x;pose_i.y],P{i},'g') +figure(1);clf; +plot(result.xs(),result.ys(),'k*-'); hold on +marginals = graph.marginals(result); +for i=1:result.size() + pose_i = result.pose(i); + P{i}=marginals.marginalCovariance(i); + plotPose2(pose_i,'g',P{i}) end +axis equal diff --git a/examples/matlab/Pose2SLAMExample.m b/examples/matlab/Pose2SLAMExample.m index 5641d2ac3..a63c2fd80 100644 --- a/examples/matlab/Pose2SLAMExample.m +++ b/examples/matlab/Pose2SLAMExample.m @@ -54,3 +54,16 @@ initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate); result.print(sprintf('\nFinal result:\n')); + +%% Plot Covariance Ellipses +figure(1);clf; +plot(result.xs(),result.ys(),'k*-'); hold on +plot([result.pose(5).x;result.pose(2).x],[result.pose(5).y;result.pose(2).y],'r-'); +marginals = graph.marginals(result); +for i=1:result.size() + pose_i = result.pose(i); + P{i}=marginals.marginalCovariance(i); + fprintf(1,'%.5f %.5f %.5f\n',P{i}) + plotPose2(pose_i,'g',P{i}) +end +axis equal diff --git a/examples/matlab/covarianceEllipse.m b/examples/matlab/covarianceEllipse.m index 106a10d6e..491e099c3 100644 --- a/examples/matlab/covarianceEllipse.m +++ b/examples/matlab/covarianceEllipse.m @@ -2,7 +2,7 @@ function covarianceEllipse(x,P,color) % covarianceEllipse: plot a Gaussian as an uncertainty ellipse % Based on Maybeck Vol 1, page 366 % k=2.296 corresponds to 1 std, 68.26% of all probability -% k=11.82 corresponds to 3 std, 99.74% of all probability +% k=11.82 corresponds to 3 std, 99.74% of all probability % % covarianceEllipse(x,P,color) % it is assumed x and y are the first two components of state x @@ -14,21 +14,21 @@ k = 2.296; [ex,ey] = ellipse( sqrt(s1*k)*e(:,1), sqrt(s2*k)*e(:,2), x(1:2) ); line(ex,ey,'color',color); -function [x,y] = ellipse(a,b,c); -% ellipse: return the x and y coordinates for an ellipse -% [x,y] = ellipse(a,b,c); -% a, and b are the axes. c is the center - -global ellipse_x ellipse_y -if ~exist('elipse_x') - q =0:2*pi/25:2*pi; - ellipse_x = cos(q); - ellipse_y = sin(q); -end - -points = a*ellipse_x + b*ellipse_y; -x = c(1) + points(1,:); -y = c(2) + points(2,:); -end + function [x,y] = ellipse(a,b,c); + % ellipse: return the x and y coordinates for an ellipse + % [x,y] = ellipse(a,b,c); + % a, and b are the axes. c is the center + + global ellipse_x ellipse_y + if ~exist('elipse_x') + q =0:2*pi/25:2*pi; + ellipse_x = cos(q); + ellipse_y = sin(q); + end + + points = a*ellipse_x + b*ellipse_y; + x = c(1) + points(1,:); + y = c(2) + points(2,:); + end end \ No newline at end of file From fe1a9997cf37a574766d7d9822b2b664720f96ec Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 04:01:37 +0000 Subject: [PATCH 160/914] simplified, sync with manual --- examples/matlab/Pose3SLAMExample_graph.m | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/matlab/Pose3SLAMExample_graph.m b/examples/matlab/Pose3SLAMExample_graph.m index b1f0afb1a..115e4341c 100644 --- a/examples/matlab/Pose3SLAMExample_graph.m +++ b/examples/matlab/Pose3SLAMExample_graph.m @@ -16,18 +16,17 @@ N = 2500; filename = '../Data/sphere2500.txt'; %% Initialize graph, initial estimate, and odometry noise -model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); [graph,initial]=load3D(filename,model,true,N); -first = initial.pose(0); -graph.addHardConstraint(0, first); +model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); %% Plot Initial Estimate figure(1);clf +first = initial.pose(0); plot3(first.x(),first.y(),first.z(),'r*'); hold on plot3DTrajectory(initial,'g-',false); -%% Read again, now all constraints -[graph,discard]=load3D(filename,model,false,N); +%% Read again, now with all constraints, and optimize +graph = load3D(filename,model,false,N); graph.addHardConstraint(0, first); -result = graph.optimize(initial); % start from old result +result = graph.optimize(initial); plot3DTrajectory(result,'r-',false); axis equal; From 1312badda4105f31e99466b84220cc73d5af9e44 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 04:02:00 +0000 Subject: [PATCH 161/914] commented out shadowing functions --- gtsam.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/gtsam.h b/gtsam.h index 3c08931be..b84b53c26 100644 --- a/gtsam.h +++ b/gtsam.h @@ -252,7 +252,6 @@ class Rot3 { double pitch() const; double yaw() const; // Vector toQuaternion() const; // FIXME: Can't cast to Vector properly - Matrix matrix() const; }; class Pose2 { @@ -306,7 +305,7 @@ class Pose3 { Pose3(); Pose3(const gtsam::Pose3& pose); Pose3(const gtsam::Rot3& r, const gtsam::Point3& t); - Pose3(const gtsam::Pose2& pose2); // FIXME: shadows Pose3(Pose3 pose) + // Pose3(const gtsam::Pose2& pose2); // FIXME: shadows Pose3(Pose3 pose) Pose3(Matrix t); // Testable @@ -344,9 +343,9 @@ class Pose3 { double y() const; double z() const; Matrix matrix() const; - gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; // FIXME: shadows other transform_to() + // gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; // FIXME: shadows other transform_to() double range(const gtsam::Point3& point); - // double range(const gtsam::Pose3& pose); + // double range(const gtsam::Pose3& pose); // FIXME: shadows other range }; class Cal3_S2 { From c1d35ac48625e04bf956423e064f71a2ef29f832 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 5 Jun 2012 04:08:51 +0000 Subject: [PATCH 162/914] remove "const" for arguments with type double --- gtsam/geometry/PinholeCamera.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index 943409b4b..587312062 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -256,13 +256,13 @@ namespace gtsam { * backproject a 2-dimensional point to a 3-dimension point */ - inline Point3 backproject(const Point2& pi, const double scale) const { + inline Point3 backproject(const Point2& pi, double scale) const { const Point2 pn = k_.calibrate(pi); const Point3 pc(pn.x()*scale, pn.y()*scale, scale); return pose_.transform_from(pc); } - inline Point3 backproject_from_camera(const Point2& pi, const double scale) const { + inline Point3 backproject_from_camera(const Point2& pi, double scale) const { return backproject(pi, scale); } From 76a9e651cbaea567bd9d22aebb16c5f4d240643f Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 5 Jun 2012 04:10:13 +0000 Subject: [PATCH 163/914] minor variable renaming --- examples/VisualISAMExample.cpp | 4 ++-- examples/VisualSLAMData.h | 27 +++++++++++++-------------- examples/VisualSLAMExample.cpp | 9 +++++---- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/examples/VisualISAMExample.cpp b/examples/VisualISAMExample.cpp index 682ca1743..dca24dba5 100644 --- a/examples/VisualISAMExample.cpp +++ b/examples/VisualISAMExample.cpp @@ -72,8 +72,8 @@ int main(int argc, char* argv[]) { initials.insert(X(1), pose0Init*odoMeasurement); // Initial values for the landmarks, simulated with Gaussian noise - for (size_t j=0; jsample())); + for (size_t j=0; jsample())); // Update ISAM the first time and obtain the current estimate isam.update(newFactors, initials); diff --git a/examples/VisualSLAMData.h b/examples/VisualSLAMData.h index 1aa79324e..155a137d8 100644 --- a/examples/VisualSLAMData.h +++ b/examples/VisualSLAMData.h @@ -40,7 +40,7 @@ struct VisualSLAMExampleData { gtsam::shared_ptrK sK; // camera calibration parameters std::vector poses; // ground-truth camera poses gtsam::Pose3 odometry; // ground-truth odometry between 2 consecutive poses (simulated data for iSAM) - std::vector landmarks; // ground-truth landmarks + std::vector points; // ground-truth landmarks std::map > z; // 2D measurements of landmarks in each camera frame gtsam::SharedDiagonal noiseZ; // measurement noise (noiseModel::Isotropic::Sigma(2, 5.0f)); gtsam::SharedDiagonal noiseX; // noise for camera poses @@ -49,14 +49,14 @@ struct VisualSLAMExampleData { static const VisualSLAMExampleData generate() { VisualSLAMExampleData data; // Landmarks (ground truth) - data.landmarks.push_back(gtsam::Point3(10.0,10.0,10.0)); - data.landmarks.push_back(gtsam::Point3(-10.0,10.0,10.0)); - data.landmarks.push_back(gtsam::Point3(-10.0,-10.0,10.0)); - data.landmarks.push_back(gtsam::Point3(10.0,-10.0,10.0)); - data.landmarks.push_back(gtsam::Point3(10.0,10.0,-10.0)); - data.landmarks.push_back(gtsam::Point3(-10.0,10.0,-10.0)); - data.landmarks.push_back(gtsam::Point3(-10.0,-10.0,-10.0)); - data.landmarks.push_back(gtsam::Point3(10.0,-10.0,-10.0)); + data.points.push_back(gtsam::Point3(10.0,10.0,10.0)); + data.points.push_back(gtsam::Point3(-10.0,10.0,10.0)); + data.points.push_back(gtsam::Point3(-10.0,-10.0,10.0)); + data.points.push_back(gtsam::Point3(10.0,-10.0,10.0)); + data.points.push_back(gtsam::Point3(10.0,10.0,-10.0)); + data.points.push_back(gtsam::Point3(-10.0,10.0,-10.0)); + data.points.push_back(gtsam::Point3(-10.0,-10.0,-10.0)); + data.points.push_back(gtsam::Point3(10.0,-10.0,-10.0)); // Camera calibration parameters data.sK = gtsam::shared_ptrK(new gtsam::Cal3_S2(50.0, 50.0, 0.0, 50.0, 50.0)); @@ -65,8 +65,7 @@ struct VisualSLAMExampleData { int n = 8; double theta = 0.0; double r = 30.0; - for (int i=0; isample())); + data.z[i].push_back(camera.project(data.points[j]) + gtsam::Point2(data.noiseZ->sample())); } } - data.noiseX = gtsam::sharedSigmas(gtsam::Vector_(6, 0.01, 0.01, 0.01, 0.1, 0.1, 0.1)); + data.noiseX = gtsam::sharedSigmas(gtsam::Vector_(6, 0.001, 0.001, 0.001, 0.1, 0.1, 0.1)); data.noiseL = gtsam::sharedSigma(3, 0.1); return data; diff --git a/examples/VisualSLAMExample.cpp b/examples/VisualSLAMExample.cpp index 0dcd970e4..90391bf90 100644 --- a/examples/VisualSLAMExample.cpp +++ b/examples/VisualSLAMExample.cpp @@ -39,18 +39,19 @@ int main(int argc, char* argv[]) { /* 2. Add factors to the graph */ // 2a. Measurement factors for (size_t i=0; isample())); - for (size_t j=0; jsample())); + for (size_t j=0; jsample())); initial.print("Intial Estimates: "); /* 4. Optimize the graph and print results */ From 22e71e4374bdf417f8fee32feda73c4f686d9fbf Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 05:08:56 +0000 Subject: [PATCH 164/914] Doxygen comments --- gtsam/nonlinear/NonlinearFactor.h | 2 +- gtsam/nonlinear/NonlinearFactorGraph.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 73c150695..a5a838881 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -118,7 +118,7 @@ public: /** * Calculate the error of the factor - * This is typically equal to log-likelihood, e.g. 0.5(h(x)-z)^2/sigma^2 in case of Gaussian. + * This is typically equal to log-likelihood, e.g. \f$ 0.5(h(x)-z)^2/sigma^2 \f$ in case of Gaussian. * You can override this for systems with unusual noise models. */ virtual double error(const Values& c) const = 0; diff --git a/gtsam/nonlinear/NonlinearFactorGraph.h b/gtsam/nonlinear/NonlinearFactorGraph.h index 82b364ddf..429bf0102 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.h +++ b/gtsam/nonlinear/NonlinearFactorGraph.h @@ -49,7 +49,7 @@ namespace gtsam { /** return keys in some random order */ std::set keys() const; - /** unnormalized error */ + /** unnormalized error, \f$ 0.5 \sum_i (h_i(X_i)-z)^2/\sigma^2 \f$ in the most common case */ double error(const Values& c) const; /** Unnormalized probability. O(n) */ From 715d663e4f1da1f9060cda0d1c48f52e2e8e7bc3 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 5 Jun 2012 05:15:26 +0000 Subject: [PATCH 165/914] VisualSLAM matlab example --- examples/matlab/VisualSLAMExample.m | 119 ++++++++++++++++++++++++++ examples/matlab/covarianceEllipse3D.m | 25 ++++++ examples/matlab/plotCamera.m | 18 ++++ 3 files changed, 162 insertions(+) create mode 100644 examples/matlab/VisualSLAMExample.m create mode 100644 examples/matlab/covarianceEllipse3D.m create mode 100644 examples/matlab/plotCamera.m diff --git a/examples/matlab/VisualSLAMExample.m b/examples/matlab/VisualSLAMExample.m new file mode 100644 index 000000000..c5b0f7969 --- /dev/null +++ b/examples/matlab/VisualSLAMExample.m @@ -0,0 +1,119 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief A simple visual SLAM example for structure from motion +% @author Duy-Nguyen Ta +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - Landmarks as 8 vertices of a cube: (10,10,10) (-10,10,10) etc... +% - Cameras are on a circle around the cube, pointing at the world origin +% - Each camera sees all landmarks. +% - Visual measurements as 2D points are given, corrupted by Gaussian noise. + +%% Generate simulated data +% 3D landmarks as vertices of a cube +points = {gtsamPoint3([10 10 10]'),... + gtsamPoint3([-10 10 10]'),... + gtsamPoint3([-10 -10 10]'),... + gtsamPoint3([10 -10 10]'),... + gtsamPoint3([10 10 -10]'),... + gtsamPoint3([-10 10 -10]'),... + gtsamPoint3([-10 -10 -10]'),... + gtsamPoint3([10 -10 -10]')}; + +% Camera poses on a circle around the cube, pointing at the world origin +nCameras = 8; +r = 30; +poses = {}; +for i=1:nCameras + theta = i*2*pi/nCameras; + posei = gtsamPose3(... + gtsamRot3([-sin(theta) 0 -cos(theta); + cos(theta) 0 -sin(theta); + 0 -1 0]),... + gtsamPoint3([r*cos(theta), r*sin(theta), 0]')); + poses = [poses {posei}]; +end + +% 2D visual measurements, simulated with Gaussian noise +z = {}; +measurementNoiseSigmas = [0.5,0.5]'; +measurementNoiseSampler = gtsamSharedDiagonal(measurementNoiseSigmas); +K = gtsamCal3_S2(50,50,0,50,50); +for i=1:size(poses,2) + zi = {}; + camera = gtsamSimpleCamera(K,poses{i}); + for j=1:size(points,2) + zi = [zi {camera.project(points{j}).compose(gtsamPoint2(measurementNoiseSampler.sample()))}]; + end + z = [z; zi]; +end + +pointNoiseSigmas = [0.1,0.1,0.1]'; +pointNoiseSampler = gtsamSharedDiagonal(pointNoiseSigmas); + +poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; +poseNoiseSampler = gtsamSharedDiagonal(poseNoiseSigmas); + +hold off; + +%% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) +graph = visualSLAMGraph; + +%% Add factors for all measurements +measurementNoise = gtsamSharedNoiseModel_Sigmas(measurementNoiseSigmas); +for i=1:size(z,1) + for j=1:size(z,2) + graph.addMeasurement(z{i,j}, measurementNoise, symbol('x',i), symbol('l',j), K); + end +end + +%% Add Gaussian priors for a pose and a landmark to constraint the system +posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); +graph.addPosePrior(symbol('x',1), poses{1}, posePriorNoise); +pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); +graph.addPointPrior(symbol('l',1), points{1}, pointPriorNoise); + +%% Print the graph +graph.print(sprintf('\nFactor graph:\n')); + +%% Initialize to noisy poses and points +initialEstimate = visualSLAMValues; +for i=1:size(poses,2) + initialEstimate.insertPose(symbol('x',i), poses{i}.compose(gtsamPose3_Expmap(poseNoiseSampler.sample()))); +end +for j=1:size(points,2) + initialEstimate.insertPoint(symbol('l',j), points{j}.compose(gtsamPoint3(pointNoiseSampler.sample()))); +end +initialEstimate.print(sprintf('\nInitial estimate:\n ')); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); +result.print(sprintf('\nFinal result:\n ')); + +%% Query the marginals +marginals = graph.marginals(result); + +%% Plot results with covariance ellipses +hold on; +for j=1:size(points,2) + P = marginals.marginalCovariance(symbol('l',j)); + point_j = result.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); +end + +for i=1:size(poses,2) + P = marginals.marginalCovariance(symbol('x',i)); + posei = result.pose(symbol('x',i)) + plotCamera(posei,10); + posei_t = posei.translation() + covarianceEllipse3D([posei_t.x;posei_t.y;posei_t.z],P(4:6,4:6)); +end + diff --git a/examples/matlab/covarianceEllipse3D.m b/examples/matlab/covarianceEllipse3D.m new file mode 100644 index 000000000..0ff34c8c8 --- /dev/null +++ b/examples/matlab/covarianceEllipse3D.m @@ -0,0 +1,25 @@ +function covarianceEllipse3D(c,P) +% covarianceEllipse3D: plot a Gaussian as an uncertainty ellipse +% Based on Maybeck Vol 1, page 366 +% k=2.296 corresponds to 1 std, 68.26% of all probability +% k=11.82 corresponds to 3 std, 99.74% of all probability +% +% Modified from http://www.mathworks.com/matlabcentral/newsreader/view_thread/42966 + +[e,s] = eig(P); +k = 11.82; +radii = k*sqrt(diag(s)); + +% generate data for "unrotated" ellipsoid +[xc,yc,zc] = ellipsoid(0,0,0,radii(1),radii(2),radii(3)); + +% rotate data with orientation matrix U and center M +data = kron(e(:,1),xc) + kron(e(:,2),yc) + kron(e(:,3),zc); +n = size(data,2); +x = data(1:n,:)+c(1); y = data(n+1:2*n,:)+c(2); z = data(2*n+1:end,:)+c(3); + +% now plot the rotated ellipse +sc = mesh(x,y,z); +shading interp +alpha(0.5) +axis equal \ No newline at end of file diff --git a/examples/matlab/plotCamera.m b/examples/matlab/plotCamera.m new file mode 100644 index 000000000..ba352b757 --- /dev/null +++ b/examples/matlab/plotCamera.m @@ -0,0 +1,18 @@ +function plotCamera(pose, axisLength) + C = pose.translation().vector(); + R = pose.rotation().matrix(); + + xAxis = C+R(:,1)*axisLength; + L = [C xAxis]'; + line(L(:,1),L(:,2),L(:,3),'Color','r'); + + yAxis = C+R(:,2)*axisLength; + L = [C yAxis]'; + line(L(:,1),L(:,2),L(:,3),'Color','g'); + + zAxis = C+R(:,3)*axisLength; + L = [C zAxis]'; + line(L(:,1),L(:,2),L(:,3),'Color','b'); + + axis equal +end \ No newline at end of file From d9100aadb7c9a0f02a2c20785063d27df9866bc5 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 5 Jun 2012 05:15:56 +0000 Subject: [PATCH 166/914] wrap SimpleCamera, and support Point2 constructor from Vector --- gtsam.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/gtsam.h b/gtsam.h index b84b53c26..7ad901ae9 100644 --- a/gtsam.h +++ b/gtsam.h @@ -71,6 +71,7 @@ class Point2 { // Standard Constructors Point2(); Point2(double x, double y); + Point2(Vector v); // Testable void print(string s) const; @@ -428,6 +429,29 @@ class CalibratedCamera { double range(const gtsam::Point3& p) const; // TODO: Other overloaded range methods }; + +class SimpleCamera { + // Standard Constructors and Named Constructors + SimpleCamera(); + SimpleCamera(const gtsam::Pose3& pose, const gtsam::Cal3_S2& k); + SimpleCamera(const gtsam::Cal3_S2& k, const gtsam::Pose3& pose); + + // Testable + void print(string s) const; + bool equals(const gtsam::SimpleCamera& camera, double tol) const; + + // Action on Point3 + gtsam::Point2 project(const gtsam::Point3& point); + static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); + + // Backprojection + gtsam::Point3 backproject(const gtsam::Point2& pi, double scale) const; + gtsam::Point3 backproject_from_camera(const gtsam::Point2& pi, double scale) const; + + // Standard Interface + gtsam::Pose3 pose() const; +}; + //************************************************************************* // inference //************************************************************************* From 0d2873fd209682f5bed3b3281ef9d3155eee8b06 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 13:27:43 +0000 Subject: [PATCH 167/914] update --- gtsam.h | 6 ++++++ gtsam/slam/planarSLAM.h | 8 +++++++- gtsam/slam/pose2SLAM.h | 3 +++ gtsam/slam/pose3SLAM.h | 3 +++ gtsam/slam/visualSLAM.h | 6 ++++++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 7ad901ae9..e1e3e0e93 100644 --- a/gtsam.h +++ b/gtsam.h @@ -674,6 +674,7 @@ class Values { void print(string s) const; static pose2SLAM::Values Circle(size_t n, double R); void insertPose(size_t key, const gtsam::Pose2& pose); + void updatePose(size_t key, const gtsam::Pose2& pose); gtsam::Pose2 pose(size_t i); Vector xs() const; Vector ys() const; @@ -723,6 +724,7 @@ class Values { void print(string s) const; static pose3SLAM::Values Circle(size_t n, double R); void insertPose(size_t key, const gtsam::Pose3& pose); + void updatePose(size_t key, const gtsam::Pose3& pose); gtsam::Pose3 pose(size_t i); Vector xs() const; Vector ys() const; @@ -770,6 +772,8 @@ class Values { void print(string s) const; void insertPose(size_t key, const gtsam::Pose2& pose); void insertPoint(size_t key, const gtsam::Point2& point); + void updatePose(size_t key, const gtsam::Pose2& pose); + void updatePoint(size_t key, const gtsam::Point2& point); gtsam::Pose2 pose(size_t key) const; gtsam::Point2 point(size_t key) const; }; @@ -871,6 +875,8 @@ class Values { Values(); void insertPose(size_t key, const gtsam::Pose3& pose); void insertPoint(size_t key, const gtsam::Point3& pose); + void updatePose(size_t key, const gtsam::Pose3& pose); + void updatePoint(size_t key, const gtsam::Point3& pose); size_t size() const; void print(string s) const; gtsam::Pose3 pose(size_t i); diff --git a/gtsam/slam/planarSLAM.h b/gtsam/slam/planarSLAM.h index 5d03cd646..01a9df763 100644 --- a/gtsam/slam/planarSLAM.h +++ b/gtsam/slam/planarSLAM.h @@ -78,7 +78,13 @@ namespace planarSLAM { /// insert a point void insertPoint(Key j, const Point2& point) { insert(j, point); } - }; + + /// update a pose + void updatePose(Key i, const Pose2& pose) { update(i, pose); } + + /// update a point + void updatePoint(Key j, const Point2& point) { update(j, point); } +}; /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 71710f823..778d844f2 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -58,6 +58,9 @@ namespace pose2SLAM { /// insert a pose void insertPose(Key i, const Pose2& pose) { insert(i, pose); } + /// update a pose + void updatePose(Key i, const Pose2& pose) { update(i, pose); } + /// get a pose Pose2 pose(Key i) const { return at(i); } diff --git a/gtsam/slam/pose3SLAM.h b/gtsam/slam/pose3SLAM.h index 448914f0d..9be699fd8 100644 --- a/gtsam/slam/pose3SLAM.h +++ b/gtsam/slam/pose3SLAM.h @@ -57,6 +57,9 @@ namespace pose3SLAM { /// insert a pose void insertPose(Key i, const Pose3& pose) { insert(i, pose); } + /// update a pose + void updatePose(Key i, const Pose3& pose) { update(i, pose); } + /// get a pose Pose3 pose(Key i) const { return at(i); } diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 7674ed1e3..96a1e037c 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -66,6 +66,12 @@ namespace visualSLAM { /// insert a point void insertPoint(Key j, const Point3& point) { insert(j, point); } + /// update a pose + void updatePose(Key i, const Pose3& pose) { update(i, pose); } + + /// update a point + void updatePoint(Key j, const Point3& point) { update(j, point); } + /// get a pose Pose3 pose(Key i) const { return at(i); } From 10d6157d1d924f61a8dd0abd41c1cc7a79037501 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 13:29:04 +0000 Subject: [PATCH 168/914] formatting/naming only --- examples/PlanarSLAMExample_selfcontained.cpp | 8 ++++---- examples/matlab/Pose2SLAMExample.m | 1 - examples/matlab/Pose2SLAMExample_advanced.m | 2 +- tests/testMarginals.cpp | 8 ++++---- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/examples/PlanarSLAMExample_selfcontained.cpp b/examples/PlanarSLAMExample_selfcontained.cpp index 7e17c2a0e..6b1a5b772 100644 --- a/examples/PlanarSLAMExample_selfcontained.cpp +++ b/examples/PlanarSLAMExample_selfcontained.cpp @@ -77,7 +77,7 @@ int main(int argc, char** argv) { /* add measurements */ // general noisemodel for measurements - SharedDiagonal meas_model = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); + SharedDiagonal measurementNoise = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); // create the measurement values - indices are (pose id, landmark id) Rot2 bearing11 = Rot2::fromDegrees(45), @@ -88,9 +88,9 @@ int main(int argc, char** argv) { range32 = 2.0; // create bearing/range factors - BearingRangeFactor meas11(i1, j1, bearing11, range11, meas_model); - BearingRangeFactor meas21(i2, j1, bearing21, range21, meas_model); - BearingRangeFactor meas32(i3, j2, bearing32, range32, meas_model); + BearingRangeFactor meas11(i1, j1, bearing11, range11, measurementNoise); + BearingRangeFactor meas21(i2, j1, bearing21, range21, measurementNoise); + BearingRangeFactor meas32(i3, j2, bearing32, range32, measurementNoise); // add the factors graph.add(meas11); diff --git a/examples/matlab/Pose2SLAMExample.m b/examples/matlab/Pose2SLAMExample.m index a63c2fd80..1f63ffd60 100644 --- a/examples/matlab/Pose2SLAMExample.m +++ b/examples/matlab/Pose2SLAMExample.m @@ -63,7 +63,6 @@ marginals = graph.marginals(result); for i=1:result.size() pose_i = result.pose(i); P{i}=marginals.marginalCovariance(i); - fprintf(1,'%.5f %.5f %.5f\n',P{i}) plotPose2(pose_i,'g',P{i}) end axis equal diff --git a/examples/matlab/Pose2SLAMExample_advanced.m b/examples/matlab/Pose2SLAMExample_advanced.m index f2739803e..827cf5661 100644 --- a/examples/matlab/Pose2SLAMExample_advanced.m +++ b/examples/matlab/Pose2SLAMExample_advanced.m @@ -38,7 +38,7 @@ graph.addOdometry(2, 3, odometry, odometryNoise); %% Add measurements % general noisemodel for measurements -meas_model = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); +measurementNoise = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); % print graph.print('full graph'); diff --git a/tests/testMarginals.cpp b/tests/testMarginals.cpp index 76b1f7c82..9d97f6f69 100644 --- a/tests/testMarginals.cpp +++ b/tests/testMarginals.cpp @@ -65,7 +65,7 @@ TEST(Marginals, planarSLAMmarginals) { /* add measurements */ // general noisemodel for measurements - SharedDiagonal meas_model = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); + SharedDiagonal measurementNoise = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); // create the measurement values - indices are (pose id, landmark id) Rot2 bearing11 = Rot2::fromDegrees(45), @@ -76,9 +76,9 @@ TEST(Marginals, planarSLAMmarginals) { range32 = 2.0; // create bearing/range factors - graph.add(BearingRangeFactor(x1, l1, bearing11, range11, meas_model)); - graph.add(BearingRangeFactor(x2, l1, bearing21, range21, meas_model)); - graph.add(BearingRangeFactor(x3, l2, bearing32, range32, meas_model)); + graph.add(BearingRangeFactor(x1, l1, bearing11, range11, measurementNoise)); + graph.add(BearingRangeFactor(x2, l1, bearing21, range21, measurementNoise)); + graph.add(BearingRangeFactor(x3, l2, bearing32, range32, measurementNoise)); // linearization point for marginals Values soln; From 7b48e56d568dc8c305861b066e373c142e43b4c1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 5 Jun 2012 13:29:26 +0000 Subject: [PATCH 169/914] Plot marginals, sample --- examples/matlab/PlanarSLAMExample.m | 89 ++++++++++++-------- examples/matlab/PlanarSLAMExample_sampling.m | 79 +++++++++++++++++ examples/matlab/plotPoint2.m | 11 +++ examples/matlab/plotPose2.m | 2 +- 4 files changed, 145 insertions(+), 36 deletions(-) create mode 100644 examples/matlab/PlanarSLAMExample_sampling.m create mode 100644 examples/matlab/plotPoint2.m diff --git a/examples/matlab/PlanarSLAMExample.m b/examples/matlab/PlanarSLAMExample.m index 88a988755..4addd23dc 100644 --- a/examples/matlab/PlanarSLAMExample.m +++ b/examples/matlab/PlanarSLAMExample.m @@ -1,9 +1,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% GTSAM Copyright 2010, Georgia Tech Research Corporation, +% 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 % % @brief Simple robotics example using the pre-built planar SLAM domain @@ -20,56 +20,75 @@ % - Landmarks are 2 meters away from the robot trajectory %% Create keys for variables -x1 = symbol('x',1); x2 = symbol('x',2); x3 = symbol('x',3); -l1 = symbol('l',1); l2 = symbol('l',2); +i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); +j1 = symbol('l',1); j2 = symbol('l',2); %% Create graph container and add factors to it graph = planarSLAMGraph; %% Add prior -% gaussian for prior -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -graph.addPrior(x1, priorMean, priorNoise); % add directly to graph +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +graph.addPrior(i1, priorMean, priorNoise); % add directly to graph %% Add odometry -% general noisemodel for odometry +odometry = gtsamPose2(2.0, 0.0, 0.0); odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); -odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -graph.addOdometry(x1, x2, odometry, odometryNoise); -graph.addOdometry(x2, x3, odometry, odometryNoise); +graph.addOdometry(i1, i2, odometry, odometryNoise); +graph.addOdometry(i2, i3, odometry, odometryNoise); -%% Add measurements -% general noisemodel for measurements -meas_model = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); - -% create the measurement values - indices are (pose id, landmark id) +%% Add bearing/range measurement factors degrees = pi/180; -bearing11 = gtsamRot2(45*degrees); -bearing21 = gtsamRot2(90*degrees); -bearing32 = gtsamRot2(90*degrees); -range11 = sqrt(4+4); -range21 = 2.0; -range32 = 2.0; - -% % create bearing/range factors and add them -graph.addBearingRange(x1, l1, bearing11, range11, meas_model); -graph.addBearingRange(x2, l1, bearing21, range21, meas_model); -graph.addBearingRange(x3, l2, bearing32, range32, meas_model); +noiseModel = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); +if 1 + graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); + graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); +else + bearingModel = gtsamSharedNoiseModel_Sigmas(0.1); + graph.addBearing(i1, j1, gtsamRot2(45*degrees), bearingModel); + graph.addBearing(i2, j1, gtsamRot2(90*degrees), bearingModel); +end +graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); % print -graph.print('full graph'); +graph.print(sprintf('\nFull graph:\n')); %% Initialize to noisy points initialEstimate = planarSLAMValues; -initialEstimate.insertPose(x1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(x2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(x3, gtsamPose2(4.1, 0.1, 0.1)); -initialEstimate.insertPoint(l1, gtsamPoint2(1.8, 2.1)); -initialEstimate.insertPoint(l2, gtsamPoint2(4.1, 1.8)); +initialEstimate.insertPose(i1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(i2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(i3, gtsamPose2(4.1, 0.1, 0.1)); +initialEstimate.insertPoint(j1, gtsamPoint2(1.8, 2.1)); +initialEstimate.insertPoint(j2, gtsamPoint2(4.1, 1.8)); -initialEstimate.print('initial estimate'); +initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate); -result.print('final result'); +result.print(sprintf('\nFinal result:\n')); + +%% Plot Covariance Ellipses +figure(1);clf;hold on +marginals = graph.marginals(result); +for i=1:3 + key = symbol('x',i); + pose{i} = result.pose(key); + P{i}=marginals.marginalCovariance(key); + if i>1 + plot([pose{i-1}.x;pose{i}.x],[pose{i-1}.y;pose{i}.y],'r-'); + end +end +for i=1:3 + plotPose2(pose{i},'g',P{i}) +end +for j=1:2 + key = symbol('l',j); + point{j} = result.point(key); + Q{j}=marginals.marginalCovariance(key); + plotPoint2(point{j},'b',Q{j}) +end +plot([pose{1}.x;point{1}.x],[pose{1}.y;point{1}.y],'c-'); +plot([pose{2}.x;point{1}.x],[pose{2}.y;point{1}.y],'c-'); +plot([pose{3}.x;point{2}.x],[pose{3}.y;point{2}.y],'c-'); +axis equal + diff --git a/examples/matlab/PlanarSLAMExample_sampling.m b/examples/matlab/PlanarSLAMExample_sampling.m new file mode 100644 index 000000000..178e48a42 --- /dev/null +++ b/examples/matlab/PlanarSLAMExample_sampling.m @@ -0,0 +1,79 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Simple robotics example using the pre-built planar SLAM domain +% @author Alex Cunningham +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create the same factor graph as in PlanarSLAMExample +i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); +graph = planarSLAMGraph; +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +graph.addPrior(i1, priorMean, priorNoise); % add directly to graph +odometry = gtsamPose2(2.0, 0.0, 0.0); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +graph.addOdometry(i1, i2, odometry, odometryNoise); +graph.addOdometry(i2, i3, odometry, odometryNoise); + +%% Except, for measurements we offer a choice +j1 = symbol('l',1); j2 = symbol('l',2); +degrees = pi/180; +noiseModel = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); +if 1 + graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); + graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); +else + bearingModel = gtsamSharedNoiseModel_Sigmas(0.1); + graph.addBearing(i1, j1, gtsamRot2(45*degrees), bearingModel); + graph.addBearing(i2, j1, gtsamRot2(90*degrees), bearingModel); +end +graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); + +%% Initialize MCMC sampler with ground truth +sample = planarSLAMValues; +sample.insertPose(i1, gtsamPose2(0,0,0)); +sample.insertPose(i2, gtsamPose2(2,0,0)); +sample.insertPose(i3, gtsamPose2(4,0,0)); +sample.insertPoint(j1, gtsamPoint2(2,2)); +sample.insertPoint(j2, gtsamPoint2(4,2)); + +%% Calculate and plot Covariance Ellipses +figure(1);clf;hold on +marginals = graph.marginals(sample); +for i=1:3 + key = symbol('x',i); + pose{i} = sample.pose(key); + P{i}=marginals.marginalCovariance(key); + if i>1 + plot([pose{i-1}.x;pose{i}.x],[pose{i-1}.y;pose{i}.y],'r-'); + end +end +for i=1:3 + plotPose2(pose{i},'g',P{i}) +end +for j=1:2 + key = symbol('l',j); + point{j} = sample.point(key); + Q{j}=marginals.marginalCovariance(key); + S{j}=chol(Q{j}); % for sampling + plotPoint2(point{j},'b',Q{j}) +end +plot([pose{1}.x;point{1}.x],[pose{1}.y;point{1}.y],'c-'); +plot([pose{2}.x;point{1}.x],[pose{2}.y;point{1}.y],'c-'); +plot([pose{3}.x;point{2}.x],[pose{3}.y;point{2}.y],'c-'); +axis equal + +%% Do Sampling on point 2 +N=1000; +for s=1:N + delta = S{2}*randn(2,1); + proposedPoint = gtsamPoint2(point{2}.x+delta(1),point{2}.y+delta(2)); + plotPoint2(proposedPoint,'k.') +end \ No newline at end of file diff --git a/examples/matlab/plotPoint2.m b/examples/matlab/plotPoint2.m new file mode 100644 index 000000000..ae45455f6 --- /dev/null +++ b/examples/matlab/plotPoint2.m @@ -0,0 +1,11 @@ +function plotPoint2(p,color,P) +% plotPose2: show a Pose2, possibly with covariance matrix +if size(color,2)==1 + plot(p.x,p.y,[color '*']); +else + plot(p.x,p.y,color); +end +if nargin>2 + pPp = P(1:2,1:2); % covariance matrix in pose coordinate frame + covarianceEllipse([p.x;p.y],pPp,color(1)); +end \ No newline at end of file diff --git a/examples/matlab/plotPose2.m b/examples/matlab/plotPose2.m index 7dbdebf5a..17959ea59 100644 --- a/examples/matlab/plotPose2.m +++ b/examples/matlab/plotPose2.m @@ -1,6 +1,6 @@ function plotPose2(p,color,P) % plotPose2: show a Pose2, possibly with covariance matrix -plot(p.x,p.y,[color '.']); +plot(p.x,p.y,[color '*']); c = cos(p.theta); s = sin(p.theta); quiver(p.x,p.y,c,s,0.1,color); From fd592dd6893fd543433952b41a1704565aa64d51 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 15:18:44 +0000 Subject: [PATCH 170/914] Reverted using boost chrono because chrono is not available on boost <1.47 --- CMakeLists.txt | 2 +- gtsam/base/timing.cpp | 15 ++++++++------- gtsam/base/timing.h | 6 +----- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3eb4983b5..46e4a6f33 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,7 +100,7 @@ endif() if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.40 COMPONENTS serialization system chrono filesystem thread REQUIRED) +find_package(Boost 1.40 COMPONENTS serialization system filesystem thread REQUIRED) # General build settings include_directories( diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index 305f86a74..1388c2f18 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -152,13 +153,15 @@ const boost::shared_ptr& TimingOutline::child(size_t child, const void TimingOutline::tic() { assert(!timerActive_); timerActive_ = true; - t0_ = clock_t::now(); + gettimeofday(&t0_, NULL); } /* ************************************************************************* */ void TimingOutline::toc() { + struct timeval t; + gettimeofday(&t, NULL); assert(timerActive_); - add(boost::chrono::duration_cast(clock_t::now() - t0_).count()); + add(t.tv_sec*1000000 + t.tv_usec - (t0_.tv_sec*1000000 + t0_.tv_usec)); timerActive_ = false; } @@ -241,11 +244,9 @@ void Timing::print() { /* ************************************************************************* */ double _tic_() { - typedef boost::chrono::high_resolution_clock clock_t; - typedef boost::chrono::duration duration_t; - - clock_t::time_point t = clock_t::now(); - return boost::chrono::duration_cast< duration_t >(t.time_since_epoch()).count(); + struct timeval t; + gettimeofday(&t, NULL); + return ((double)t.tv_sec + ((double)t.tv_usec)/1000000.); } /* ************************************************************************* */ diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index 56ac1a762..94498c3b3 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -22,7 +22,6 @@ #include #include #include -#include class TimingOutline; extern boost::shared_ptr timingRoot; @@ -30,9 +29,6 @@ extern boost::weak_ptr timingCurrent; class TimingOutline { protected: - typedef boost::chrono::high_resolution_clock clock_t; - typedef boost::chrono::microseconds duration_t; - size_t t_; double t2_ ; /* cache the \sum t_i^2 */ size_t tIt_; @@ -43,7 +39,7 @@ protected: boost::weak_ptr parent_; std::vector > children_; - clock_t::time_point t0_; + struct timeval t0_; bool timerActive_; void add(size_t usecs); From f13b3049a84fef401cfd58e6cd18ee0548724d86 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 5 Jun 2012 15:49:15 +0000 Subject: [PATCH 171/914] added Matlab convenience functions --- gtsam/slam/visualSLAM.cpp | 30 ++++++++++++++++++++++++++++++ gtsam/slam/visualSLAM.h | 4 ++++ 2 files changed, 34 insertions(+) diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index f4cdb0af3..be5a1c1ca 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -20,6 +20,36 @@ namespace visualSLAM { + /* ************************************************************************* */ + Vector Values::xs() const { + size_t j=0; + ConstFiltered poses = filter(); + Vector result(poses.size()); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.x(); + return result; + } + + /* ************************************************************************* */ + Vector Values::ys() const { + size_t j=0; + ConstFiltered poses = filter(); + Vector result(poses.size()); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.y(); + return result; + } + + /* ************************************************************************* */ + Vector Values::zs() const { + size_t j=0; + ConstFiltered poses = filter(); + Vector result(poses.size()); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result(j++) = keyValue.value.z(); + return result; + } + /* ************************************************************************* */ void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrK K) { diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 96a1e037c..9f9224c9d 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -81,6 +81,10 @@ namespace visualSLAM { /// check if value with specified key exists bool exists(Key i) const { return gtsam::Values::exists(i); } + Vector xs() const; ///< get all x coordinates in a matrix + Vector ys() const; ///< get all y coordinates in a matrix + Vector zs() const; ///< get all z coordinates in a matrix + }; /** From e01a320efae44cd07b99821975e8af2d35382512 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 5 Jun 2012 16:24:04 +0000 Subject: [PATCH 172/914] Matlab convenience function for plotting points --- gtsam/slam/visualSLAM.cpp | 9 +++++++++ gtsam/slam/visualSLAM.h | 8 +++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index be5a1c1ca..b8721b875 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -50,6 +50,15 @@ namespace visualSLAM { return result; } + Matrix Values::points() const { + size_t j=0; + ConstFiltered points = filter(); + Matrix result(points.size(),3); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, points) + result.row(j++) = keyValue.value.vector(); + return result; + } + /* ************************************************************************* */ void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrK K) { diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 9f9224c9d..b0e034653 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -81,9 +81,11 @@ namespace visualSLAM { /// check if value with specified key exists bool exists(Key i) const { return gtsam::Values::exists(i); } - Vector xs() const; ///< get all x coordinates in a matrix - Vector ys() const; ///< get all y coordinates in a matrix - Vector zs() const; ///< get all z coordinates in a matrix + Vector xs() const; ///< get all pose x coordinates in a matrix + Vector ys() const; ///< get all pose y coordinates in a matrix + Vector zs() const; ///< get all pose z coordinates in a matrix + + Matrix points() const; ///< get all point coordinates in a matrix }; From cc79d3d5243fe57b3c830d1292b3483db17a914b Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 5 Jun 2012 17:20:18 +0000 Subject: [PATCH 173/914] Updated documentation for PartialPriorFactor - needs to have implementation switched to only requiring manifold/group operations, rather than Lie --- gtsam/slam/PartialPriorFactor.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/gtsam/slam/PartialPriorFactor.h b/gtsam/slam/PartialPriorFactor.h index 479fd3fa6..fb8e673cb 100644 --- a/gtsam/slam/PartialPriorFactor.h +++ b/gtsam/slam/PartialPriorFactor.h @@ -28,15 +28,12 @@ namespace gtsam { * * The prior vector used in this factor is stored in compressed form, such that * it only contains values for measurements that are to be compared, and they are in - * the same order as T::Logmap(). The mask will determine which components to extract + * the same order as VALUE::Logmap(). The mask will determine which components to extract * in the error function. * - * It takes two template parameters: - * Key (typically TypedSymbol) is used to look up T's in a Values - * Values where the T's are stored, typically Values or a TupleValues<...> - * * For practical use, it would be good to subclass this factor and have the class type * construct the mask. + * @tparam VALUE is the type of variable the prior effects */ template class PartialPriorFactor: public NoiseModelFactor1 { @@ -46,12 +43,15 @@ namespace gtsam { protected: + // Concept checks on the variable type - currently requires Lie + GTSAM_CONCEPT_LIE_TYPE(VALUE) + typedef NoiseModelFactor1 Base; typedef PartialPriorFactor This; - Vector prior_; ///< measurement on logmap parameters, in compressed form + Vector prior_; ///< measurement on tangent space parameters, in compressed form std::vector mask_; ///< indices of values to constrain in compressed prior vector - Matrix H_; ///< Constant jacobian - computed at creation + Matrix H_; ///< Constant Jacobian - computed at creation /** default constructor - only use for serialization */ PartialPriorFactor() {} @@ -111,6 +111,7 @@ namespace gtsam { if (H) (*H) = H_; // FIXME: this was originally the generic retraction - may not produce same results Vector full_logmap = T::Logmap(p); +// Vector full_logmap = T::identity().localCoordinates(p); // Alternate implementation Vector masked_logmap = zero(this->dim()); for (size_t i=0; i Date: Tue, 5 Jun 2012 17:20:19 +0000 Subject: [PATCH 174/914] Changed names of cmake flags to be more intuitive, fixed include/library path issues for building the mex binaries --- CMakeLists.txt | 39 ++++++++++++++++------------------- examples/CMakeLists.txt | 2 +- gtsam_unstable/CMakeLists.txt | 21 +++++++++++++++---- wrap/CMakeLists.txt | 21 ++++++++++++------- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 46e4a6f33..1ba6a05c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,10 @@ set (GTSAM_VERSION_PATCH 0) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +# Record the root dir for gtsam - needed during external builds, e.g., ROS +set(GTSAM_SOURCE_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +message(STATUS "GTSAM_SOURCE_ROOT_DIR: [${GTSAM_SOURCE_ROOT_DIR}]") + # Load build type flags and default to Debug mode include(GtsamBuildTypes) @@ -56,11 +60,13 @@ option(GTSAM_INSTALL_MATLAB_EXAMPLES "Enable/Disable installation of matlab option(GTSAM_INSTALL_MATLAB_TESTS "Enable/Disable installation of matlab tests" ON) option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility" ON) +set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTRING "Path to install matlab toolbox") + # TODO: Check for matlab mex binary before handling building of binaries # Flags for building/installing mex files -option(GTSAM_ENABLE_BUILD_MEX_BINARIES "Enable/Disable building of matlab mex files" OFF) -option(GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL "Enable/Disable adding building of mex files to ALL target" OFF) +option(GTSAM_BUILD_MEX_BIN "Enable/Disable building of matlab mex files" OFF) +option(GTSAM_INSTALL_MEX_BIN "Enable/Disable installing matlab mex binaries" OFF) set(GTSAM_BUILD_MEX_BINARY_FLAGS "-j2" CACHE STRING "Flags for running make on toolbox MEX files") set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)") @@ -79,15 +85,10 @@ if (GTSAM_USE_QUATERNIONS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTSAM_DEFAULT_QUATERNIONS") endif(GTSAM_USE_QUATERNIONS) -# Avoid building non-installed exes and unit tests when installing -# FIXME: breaks generation and install of matlab toolbox -# FIXME: can't add install dependencies, so libraries never get built -#set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY TRUE) - -# Alternative version to keep tests from building during make install -# Use the EXCLUDE_FROM_ALL property on test executables -option(GTSAM_ENABLE_INSTALL_TEST_FIX "Enable/Disable fix to remove dependency of tests on 'all' target" ON) -option(GTSAM_ENABLE_INSTALL_EXAMPLE_FIX "Enable/Disable fix to remove dependency of examples on 'all' target" OFF) +# Flags to determine whether tests and examples are build during 'make install' +# Note that these remove the targets from the 'all' +option(GTSAM_DISABLE_TESTS_ON_INSTALL "Disables building tests during install" ON) +option(GTSAM_DISABLE_EXAMPLES_ON_INSTALL "Disables buildint examples during install" OFF) # Pull in infrastructure if (GTSAM_BUILD_TESTS) @@ -100,7 +101,7 @@ endif() if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.40 COMPONENTS serialization system filesystem thread REQUIRED) +find_package(Boost 1.42 COMPONENTS serialization system filesystem thread REQUIRED) # General build settings include_directories( @@ -155,10 +156,6 @@ set(CPACK_SOURCE_IGNORE_FILES "/build;/\\\\.;/makedoc.sh$;/gtsam_unstable/") set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}") #set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-aspn${GTSAM_VERSION_PATCH}") # Used for creating ASPN tarballs -# Record the root dir for gtsam - needed during external builds, e.g., ROS -set(GTSAM_SOURCE_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -message(STATUS "GTSAM_SOURCE_ROOT_DIR: [${GTSAM_SOURCE_ROOT_DIR}]") - # print configuration variables message(STATUS "===============================================================") message(STATUS "================ Configuration Options ======================") @@ -171,10 +168,10 @@ print_config_flag(${GTSAM_BUILD_SHARED_LIBRARY} "Build shared GTSAM Libra print_config_flag(${GTSAM_BUILD_STATIC_LIBRARY} "Build static GTSAM Library ") print_config_flag(${GTSAM_BUILD_CONVENIENCE_LIBRARIES} "Build Convenience Libraries ") if(GTSAM_UNSTABLE_AVAILABLE) - print_config_flag(${GTSAM_BUILD_UNSTABLE} "Build libgtsam_unstable ") + print_config_flag(${GTSAM_BUILD_UNSTABLE} "Build libgtsam_unstable ") endif() -print_config_flag(${GTSAM_ENABLE_INSTALL_TEST_FIX} "Tests excluded from all target ") -print_config_flag(${GTSAM_ENABLE_INSTALL_EXAMPLE_FIX} "Examples excluded from all target ") +print_config_flag(${GTSAM_DISABLE_TESTS_ON_INSTALL} "Tests excluded from all/install target ") +print_config_flag(${GTSAM_DISABLE_EXAMPLES_ON_INSTALL} "Examples excluded from all/install target ") string(TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_toupper) message(STATUS " Build type : ${CMAKE_BUILD_TYPE}") message(STATUS " C compilation flags : ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${cmake_build_type_toupper}}") @@ -192,8 +189,8 @@ print_config_flag(${GTSAM_INSTALL_MATLAB_TOOLBOX} "Install matlab toolbox print_config_flag(${GTSAM_INSTALL_MATLAB_EXAMPLES} "Install matlab examples ") print_config_flag(${GTSAM_INSTALL_MATLAB_TESTS} "Install matlab tests ") print_config_flag(${GTSAM_INSTALL_WRAP} "Install wrap utility ") -print_config_flag(${GTSAM_ENABLE_BUILD_MEX_BINARIES} "Build MEX binaries ") -print_config_flag(${GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL} "Build MEX binaries on ALL target ") +print_config_flag(${GTSAM_BUILD_MEX_BIN} "Build MEX binaries ") +print_config_flag(${GTSAM_INSTALL_MEX_BIN} "Install MEX binaries ") message(STATUS "===============================================================") # Include CPack *after* all flags diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a54c8366c..9f799d294 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -14,7 +14,7 @@ foreach(example_src ${example_srcs} ) add_executable(${example_bin} ${example_src}) # Disable building during make all/install - if (GTSAM_ENABLE_INSTALL_EXAMPLE_FIX) + if (GTSAM_DISABLE_EXAMPLES_ON_INSTALL) set_target_properties(${example_bin} PROPERTIES EXCLUDE_FROM_ALL ON) endif() diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 54e95a599..179ffc6e6 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -80,7 +80,20 @@ if (GTSAM_BUILD_WRAP) # [mexFlags] : extra flags for the mex command # TODO: generate these includes programmatically - set(mexFlags "-I${Boost_INCLUDE_DIR} -I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/gtsam_unstable -I${CMAKE_INSTALL_PREFIX}/include/gtsam_unstable/dynamics -I${CMAKE_INSTALL_PREFIX}/include/gtsam_unstable/discrete -L${CMAKE_INSTALL_PREFIX}/lib -lgtsam -lgtsam_unstable") + # Choose include flags depending on build process + if (GTSAM_BUILD_MEX_BIN) + set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) + set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) + else() + set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) + set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) + endif() + + set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete -L${MEX_LIB_ROOT}/gtsam_unstable -L${MEX_LIB_ROOT}/gtsam -lgtsam -lgtsam_unstable") + if(MSVC OR CYGWIN OR WINGW) + set(mexFlags "${mexFlags} LINKFLAGS='$LINKFLAGS /LIBPATH:${Boost_LIBRARY_DIRS}'") + endif() + set(toolbox_path ${CMAKE_BINARY_DIR}/wrap/gtsam_unstable) set(moduleName gtsam_unstable) @@ -98,9 +111,9 @@ if (GTSAM_BUILD_WRAP) DEPENDS wrap) # Build command - if (GTSAM_ENABLE_BUILD_MEX_BINARIES) + if (GTSAM_BUILD_MEX_BIN) # Actually compile the mex files when building the library - if (GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL) + if (GTSAM_INSTALL_MEX_BIN) add_custom_target(wrap_gtsam_unstable_build ALL COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} WORKING_DIRECTORY ${toolbox_path} @@ -111,7 +124,7 @@ if (GTSAM_BUILD_WRAP) WORKING_DIRECTORY ${toolbox_path} DEPENDS wrap_gtsam_unstable) endif() - endif (GTSAM_ENABLE_BUILD_MEX_BINARIES) + endif () if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Primary toolbox files diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 8f44e24cf..9c0501af6 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -16,7 +16,7 @@ endif(GTSAM_INSTALL_WRAP) install(FILES matlab.h DESTINATION include/wrap) # Build tests -if (GTSAM_BUILD_TESTS) +if (GTSAM_BUILD_TESTS) add_definitions(-DTOPSRCDIR="${CMAKE_SOURCE_DIR}") set(wrap_local_libs wrap_lib) gtsam_add_subdir_tests("wrap" "${wrap_local_libs}" "${wrap_local_libs}" "") @@ -31,7 +31,16 @@ endif(GTSAM_BUILD_TESTS) # toolboxPath : the directory in which to generate the wrappers # [mexFlags] : extra flags for the mex command -set(mexFlags "-I${Boost_INCLUDE_DIR} -I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/gtsam -I${CMAKE_INSTALL_PREFIX}/include/gtsam/base -I${CMAKE_INSTALL_PREFIX}/include/gtsam/geometry -I${CMAKE_INSTALL_PREFIX}/include/gtsam/linear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/discrete -I${CMAKE_INSTALL_PREFIX}/include/gtsam/inference -I${CMAKE_INSTALL_PREFIX}/include/gtsam/nonlinear -I${CMAKE_INSTALL_PREFIX}/include/gtsam/slam -L${CMAKE_INSTALL_PREFIX}/lib -lgtsam") +# Choose include flags depending on build process +if (GTSAM_BUILD_MEX_BIN) + set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) + set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) +else() + set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) + set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) +endif() + +set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${MEX_LIB_ROOT}/gtsam -lgtsam") if(MSVC OR CYGWIN OR WINGW) set(mexFlags "${mexFlags} LINKFLAGS='$LINKFLAGS /LIBPATH:${Boost_LIBRARY_DIRS}'") endif() @@ -59,11 +68,11 @@ add_custom_target(wrap_gtsam ALL COMMAND DEPENDS wrap) # Build command -if (GTSAM_ENABLE_BUILD_MEX_BINARIES) +if (GTSAM_BUILD_MEX_BIN) # Actually compile the mex files when building the library # TODO: pass correct make flags from parent process message(STATUS "Building Matlab MEX binaries for toolbox with flags ${GTSAM_BUILD_MEX_BINARY_FLAGS}") - if (GTSAM_ENABLE_BUILD_MEX_BINARIES_ALL) + if (GTSAM_INSTALL_MEX_BIN) add_custom_target(wrap_gtsam_build ALL COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} WORKING_DIRECTORY ${toolbox_path} @@ -74,9 +83,7 @@ if (GTSAM_ENABLE_BUILD_MEX_BINARIES) WORKING_DIRECTORY ${toolbox_path} DEPENDS wrap_gtsam) endif() -endif (GTSAM_ENABLE_BUILD_MEX_BINARIES) - -set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTRING "Path to install matlab toolbox") +endif () if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Primary toolbox files From 7fdf3ef1bbafc505f1e5c56bcac1232ad32e608d Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 5 Jun 2012 17:27:40 +0000 Subject: [PATCH 175/914] wrapped visualSLAM helper functions --- gtsam.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gtsam.h b/gtsam.h index 926467722..9ea7a863c 100644 --- a/gtsam.h +++ b/gtsam.h @@ -883,6 +883,10 @@ class Values { gtsam::Pose3 pose(size_t i); gtsam::Point3 point(size_t j); bool exists(size_t key); + Vector xs() const; + Vector ys() const; + Vector zs() const; + Matrix points() const; }; class Graph { From 1241bf383af5add4e188ee425427b7629753a95d Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 5 Jun 2012 17:54:29 +0000 Subject: [PATCH 176/914] stereo VO Matlab example and data --- examples/Data/VO_calibration.txt | 1 + examples/Data/VO_camera_poses.txt | 26 + examples/Data/VO_stereo_factors.txt | 8189 +++++++++++++++++++++++++++ examples/matlab/VO_Example.m | 77 + 4 files changed, 8293 insertions(+) create mode 100644 examples/Data/VO_calibration.txt create mode 100644 examples/Data/VO_camera_poses.txt create mode 100644 examples/Data/VO_stereo_factors.txt create mode 100644 examples/matlab/VO_Example.m diff --git a/examples/Data/VO_calibration.txt b/examples/Data/VO_calibration.txt new file mode 100644 index 000000000..138eb3646 --- /dev/null +++ b/examples/Data/VO_calibration.txt @@ -0,0 +1 @@ +721.5377 721.5377 0.0 609.5593 172.854 0.537150588 \ No newline at end of file diff --git a/examples/Data/VO_camera_poses.txt b/examples/Data/VO_camera_poses.txt new file mode 100644 index 000000000..879d091b6 --- /dev/null +++ b/examples/Data/VO_camera_poses.txt @@ -0,0 +1,26 @@ +1 1 0 0 0 0 1 0 0 -0 0 1 0 0 0 0 1 +2 0.999997 -0.00240146 0.00061075 0.00314304 0.0024019 0.999997 -0.00071977 0.00414596 -0.00060902 0.000721235 1 0.95998 0 0 0 1 +3 0.999993 -0.00371801 0.000595621 0.00280572 0.00371612 0.999988 0.00314729 0.00981461 -0.000607315 -0.00314506 0.999995 1.91967 0 0 0 1 +4 0.999981 -0.00619252 -0.000161076 0.00419847 0.00619374 0.999939 0.00918605 0.0120306 0.000104181 -0.00918687 0.999958 2.87292 0 0 0 1 +5 0.999948 -0.0100179 -0.00177824 0.00741887 0.010034 0.999907 0.00925915 0.0175144 0.00168532 -0.00927651 0.999956 3.8158 0 0 0 1 +6 0.999913 -0.0128105 -0.00298253 0.00649213 0.0128298 0.999896 0.00655406 0.0221085 0.00289826 -0.00659176 0.999974 4.75923 0 0 0 1 +7 0.999901 -0.0135442 -0.00393541 0.00202365 0.0135567 0.999903 0.00315259 0.0274932 0.00389233 -0.00320563 0.999987 5.69454 0 0 0 1 +8 0.999901 -0.0131232 -0.00504356 -0.00337588 0.0131365 0.99991 0.00261558 0.0312754 0.00500879 -0.00268157 0.999984 6.62905 0 0 0 1 +9 0.999898 -0.0127525 -0.00649016 -0.00834529 0.0127815 0.999908 0.00443934 0.0363095 0.00643296 -0.00452184 0.999969 7.56509 0 0 0 1 +10 0.999891 -0.0126057 -0.0076649 -0.0140367 0.012663 0.999892 0.00747804 0.0406566 0.00756981 -0.00757428 0.999943 8.50119 0 0 0 1 +11 0.99988 -0.012916 -0.00853732 -0.0314704 0.0129905 0.999878 0.00872879 0.0502508 0.00842353 -0.00883865 0.999925 9.44031 0 0 0 1 +12 0.999851 -0.0144077 -0.00947329 -0.0383227 0.0144958 0.999852 0.00930193 0.0627772 0.00933787 -0.00943787 0.999912 10.3736 0 0 0 1 +13 0.999838 -0.0146038 -0.0105024 -0.0473225 0.0147016 0.999849 0.00930217 0.0696137 0.010365 -0.00945507 0.999902 11.2945 0 0 0 1 +14 0.999827 -0.0148804 -0.0111878 -0.0611688 0.0149688 0.999857 0.00785918 0.0760175 0.0110692 -0.00802528 0.999907 12.2087 0 0 0 1 +15 0.999804 -0.015194 -0.0126986 -0.0750261 0.0152691 0.999866 0.0058357 0.0827557 0.0126082 -0.00602846 0.999902 13.1154 0 0 0 1 +16 0.999759 -0.0166787 -0.0142956 -0.0893963 0.0167446 0.99985 0.00450347 0.0886196 0.0142183 -0.00474176 0.999888 14.0218 0 0 0 1 +17 0.999738 -0.0164046 -0.0159548 -0.110797 0.0164665 0.999857 0.00375294 0.0939735 0.0158909 -0.00401468 0.999866 14.9288 0 0 0 1 +18 0.999731 -0.0152362 -0.0175058 -0.134602 0.0152899 0.999879 0.00293826 0.0949048 0.0174589 -0.00320513 0.999842 15.8347 0 0 0 1 +19 0.999721 -0.013717 -0.0192196 -0.158411 0.0137759 0.999901 0.00293494 0.0977547 0.0191774 -0.00319889 0.999811 16.7344 0 0 0 1 +20 0.999683 -0.0142193 -0.0207555 -0.182009 0.0142987 0.999891 0.00368405 0.101695 0.0207008 -0.00397966 0.999778 17.6352 0 0 0 1 +21 0.999659 -0.0137778 -0.0221853 -0.207494 0.01389 0.999891 0.00491306 0.105966 0.0221152 -0.00521954 0.999742 18.5239 0 0 0 1 +22 0.999637 -0.013439 -0.0233607 -0.237562 0.0135682 0.999893 0.0053802 0.112022 0.023286 -0.00569521 0.999713 19.408 0 0 0 1 +23 0.999585 -0.0146657 -0.0247774 -0.266515 0.0147976 0.999877 0.00515018 0.116865 0.0246988 -0.00551469 0.99968 20.2912 0 0 0 1 +24 0.999541 -0.0147341 -0.0264658 -0.293414 0.0148605 0.999879 0.00458559 0.12245 0.0263951 -0.00497678 0.999639 21.1689 0 0 0 1 +25 0.999508 -0.0146117 -0.0277547 -0.320586 0.0147561 0.999879 0.00500356 0.126076 0.0276782 -0.00541065 0.999602 22.0409 0 0 0 1 +26 0.999474 -0.0145772 -0.0289811 -0.347714 0.0147851 0.999866 0.00697181 0.131533 0.0288756 -0.00739663 0.999556 22.9037 0 0 0 1 diff --git a/examples/Data/VO_stereo_factors.txt b/examples/Data/VO_stereo_factors.txt new file mode 100644 index 000000000..a2451cf75 --- /dev/null +++ b/examples/Data/VO_stereo_factors.txt @@ -0,0 +1,8189 @@ +1 3 209.979 185.87 61.5418 -8.90263 -2.48003 16.0758 +2 3 183.871 158.526 58.5288 -9.02175 -2.42293 15.2918 +3 3 154.533 127.498 45.2523 -9.04073 -2.53526 14.3359 +1 7 402.088 390.052 9.90739 -9.25908 -7.27203 32.201 +2 7 394.391 382.151 5.65911 -9.4424 -7.33715 31.6638 +1 8 363.621 350.3 19.013 -9.91743 -6.20361 29.0959 +2 8 354.573 340.708 15.0627 -9.87834 -6.11295 27.9529 +1 11 328.245 314.688 36.8183 -11.1456 -5.38969 28.5871 +2 11 317.629 303.492 33.1041 -11.0929 -5.31025 27.4172 +1 13 354.416 341.486 73.4162 -10.5993 -4.13089 29.9745 +2 13 345.335 332.443 71.2318 -11.0089 -4.23409 30.0629 +1 14 368.212 355.083 79.6458 -9.87405 -3.81336 29.5197 +2 14 359.443 346.409 77.3278 -10.308 -3.9369 29.7366 +1 19 408.795 393 106.946 -6.82736 -2.24133 24.5372 +2 19 401.89 386.918 105.831 -7.45048 -2.40457 25.8863 +3 19 393.846 380.541 101.098 -8.70882 -2.89695 29.1301 +4 19 386.237 372.998 94.8054 -9.06118 -3.16678 29.276 +5 19 379.773 365.851 93.1127 -8.86588 -3.07667 27.8392 +6 19 372.598 357.905 93.1789 -8.66334 -2.91293 26.3795 +7 19 364.788 347.748 92.7894 -7.716 -2.5239 22.7453 +8 19 354.593 338.217 89.9263 -8.36348 -2.72022 23.6681 +1 22 301.371 288.22 123.147 -12.5881 -2.0303 29.4716 +2 22 290.134 277.334 122.566 -13.4053 -2.1104 30.2806 +3 22 279.457 266.441 118.448 -13.6226 -2.24522 29.7763 +1 24 286.858 267.821 24.4042 -9.10534 -4.18865 20.3589 +2 24 270.266 249.809 17.1811 -8.90883 -4.08751 18.9454 +1 25 309.828 295.159 40.0603 -10.9759 -4.86279 26.4221 +2 25 297.643 283.051 37.0473 -11.4821 -4.99925 26.5609 +3 25 284.476 269.313 30.9841 -11.5164 -5.0259 25.5613 +4 25 271.874 255.971 22.6085 -11.4056 -5.07468 24.3706 +5 25 259.223 243.056 18.2877 -11.6401 -5.13554 23.9734 +6 25 245.695 229.056 15.8812 -11.7463 -5.0674 23.2927 +1 26 363.837 351.125 88.2117 -10.3829 -3.57654 30.4884 +2 26 355.143 341.918 86.1881 -10.3332 -3.51996 29.3055 +1 27 370.625 357.942 91.0858 -10.1195 -3.46309 30.5589 +2 27 362.093 348.932 89.118 -10.0997 -3.41747 29.4477 +3 27 353.648 339.913 83.786 -10.0087 -3.48344 28.2193 +4 27 344.918 330.558 76.9125 -9.89867 -3.58861 26.9885 +1 31 363.348 350.145 50.9786 -10.0172 -4.95853 29.356 +2 31 354.105 340.884 47.9673 -10.3787 -5.07395 29.315 +3 31 345.08 331.083 40.9019 -10.1498 -5.06386 27.6901 +1 34 320.828 308.065 68.3594 -12.1511 -4.3976 30.3656 +2 34 309.484 299.53 65.6399 -16.1932 -5.78567 38.9369 +3 34 300.833 288.357 60.6176 -13.2921 -4.83229 31.0655 +1 35 381.449 368.573 103.554 -9.51642 -2.8911 30.1014 +2 35 373.428 360.047 102.291 -9.47902 -2.83262 28.9646 +3 35 364.836 351.587 97.66 -9.92143 -3.04847 29.2522 +1 36 412.916 399.447 45.4646 -7.8421 -5.08028 28.7748 +2 36 405.446 391.636 42.1742 -7.93906 -5.08285 28.0645 +3 36 397.898 383.772 34.6847 -8.04846 -5.25392 27.4366 +4 36 390.21 375.548 25.8328 -8.03628 -5.3864 26.4349 +1 37 382.101 369.058 62.9139 -9.36758 -4.52773 29.7155 +2 37 373.575 360.402 60.3917 -9.62259 -4.58581 29.4217 +3 37 365.323 351.075 53.9171 -9.20802 -4.48407 27.2029 +4 37 356.369 341.205 45.643 -8.9685 -4.50607 25.5583 +5 37 347.182 331.951 41.7721 -9.2533 -4.62288 25.4465 +6 37 337.847 321.154 39.2487 -8.74323 -4.29919 23.2179 +1 38 368.271 355.646 103.567 -10.2656 -2.94784 30.6979 +2 38 359.673 346.474 102.328 -10.1689 -2.87003 29.3625 +3 38 351.187 337.872 97.0015 -10.4237 -3.06016 29.1094 +4 38 342.757 328.886 90.5172 -10.3321 -3.18854 27.942 +5 38 334.312 320.334 88.4566 -10.5774 -3.2433 27.7279 +6 38 325.334 311.295 87.9228 -10.8748 -3.24956 27.6068 +7 38 316.262 301.112 87.151 -10.3992 -3.03871 25.583 +8 38 306.084 290.382 83.6732 -10.3816 -3.0508 24.6832 +9 38 295.124 279.798 77.689 -11.0205 -3.33539 25.2888 +1 39 368.271 355.646 103.567 -10.2656 -2.94784 30.6979 +2 39 359.673 346.474 102.328 -10.1689 -2.87003 29.3625 +3 39 351.187 337.872 97.0015 -10.4237 -3.06016 29.1094 +4 39 342.757 328.886 90.5172 -10.3321 -3.18854 27.942 +5 39 334.312 320.334 88.4566 -10.5774 -3.2433 27.7279 +1 40 399.549 387.359 100.33 -9.25423 -3.19583 31.7949 +2 40 392.339 379.894 99.3608 -9.3758 -3.17216 31.1435 +3 40 385.548 371.692 93.9091 -8.68421 -3.06044 27.9717 +4 40 377.86 361.977 88.3166 -7.83547 -2.85884 24.4006 +5 40 369.704 353.079 86.7024 -7.7496 -2.78352 23.3125 +6 40 360.838 344.13 87.6479 -7.99653 -2.73942 23.1978 +1 41 314.778 303.477 61.5898 -14.0112 -5.28847 34.2952 +2 41 305.745 293.424 58.7429 -13.2453 -4.97487 31.4567 +3 41 295.126 280.156 52.0137 -11.2824 -4.33594 25.8899 +1 42 322.734 309.225 27.9559 -11.4054 -5.76176 28.6914 +2 42 311.74 297.908 23.4169 -11.5653 -5.80315 28.0198 +1 43 413.858 400.794 69.7088 -8.04664 -4.24101 29.6674 +2 43 406.585 392.833 66.8017 -7.92805 -4.14233 28.1828 +3 43 399.186 384.6 60.1878 -7.74727 -4.14907 26.5715 +4 43 391.12 376.876 52.5636 -8.23759 -4.53629 27.21 +5 43 383.947 369.869 49.2025 -8.60844 -4.71803 27.5309 +6 43 376.647 362.427 47.1554 -8.79808 -4.74816 27.2555 +7 43 369.289 354.616 44.9048 -8.79618 -4.68415 26.4151 +1 44 429.786 416.985 10.8113 -7.54372 -6.79969 30.2774 +2 44 422.927 409.032 6.22854 -7.21468 -6.44127 27.8926 +1 45 429.786 416.985 10.8113 -7.54372 -6.79969 30.2774 +2 45 422.927 409.032 6.22854 -7.21468 -6.44127 27.8926 +1 47 476.875 462.803 22.9268 -5.06458 -5.72276 27.5413 +2 47 471.267 456.98 18.7569 -5.19929 -5.79349 27.1272 +1 49 534.551 521.959 30.0889 -3.19959 -6.08989 30.7784 +2 49 531.222 518.03 26.2453 -3.18982 -5.96976 29.3803 +1 51 438.047 425.403 38.834 -7.28628 -5.69352 30.6528 +2 51 431.401 418.237 35.3691 -7.2697 -5.61002 29.4421 +1 52 536.646 523.91 44.453 -3.07516 -5.41537 30.4312 +2 52 533.182 520.347 41.0937 -3.1965 -5.51432 30.1972 +1 56 433.895 420.782 74.4585 -7.19587 -4.03064 29.5568 +2 56 427.255 413.599 72.1036 -7.17079 -3.96294 28.3811 +3 56 420.734 406.674 65.7893 -7.21386 -4.09028 27.5655 +4 56 413.867 399.322 57.9083 -7.2269 -4.24494 26.6464 +1 59 427.689 414.944 90.0841 -7.66535 -3.48853 30.4109 +2 59 421.003 407.495 88.2374 -7.49811 -3.36485 28.6925 +3 59 414.164 400.243 82.4393 -7.5395 -3.48873 27.8411 +1 61 476.203 463.728 119.273 -5.74205 -2.3071 31.068 +2 61 471.246 458.29 118.352 -5.73435 -2.2596 29.9143 +3 61 466.603 453.213 113.763 -5.73513 -2.3706 28.9466 +4 61 461.992 448.016 107.789 -5.6716 -2.5007 27.7315 +1 62 549.824 538.317 13.0527 -2.7883 -7.45917 33.6798 +2 62 547.191 535.348 8.33458 -2.8288 -7.46196 32.7262 +1 63 494.158 482.317 49.1257 -5.23515 -5.6129 32.7324 +2 63 490.361 477.694 46.2753 -5.05459 -5.36754 30.5967 +3 63 486.219 472.742 39.6488 -4.91601 -5.30919 28.7585 +4 63 482.93 468.924 31.7027 -4.8562 -5.41312 27.6708 +1 65 555.494 543.327 74.0345 -2.38699 -4.36286 31.8557 +2 65 552.415 540.886 71.3792 -2.66241 -4.72779 33.617 +3 65 550.653 538.6 65.114 -2.6252 -4.80152 32.1559 +1 66 456.271 443.352 85.912 -6.37377 -3.61506 30.0017 +2 66 450.683 437.004 83.9661 -6.239 -3.49059 28.3344 +1 67 480.016 466.663 91.5877 -5.21084 -3.26892 29.0237 +2 67 474.718 461.005 89.4507 -5.2816 -3.26684 28.262 +3 67 469.735 455.72 83.7122 -5.35873 -3.41635 27.6528 +1 68 495.411 483.037 98.2553 -4.95513 -3.2383 31.3217 +2 68 490.935 478.057 96.7302 -4.94811 -3.1753 30.097 +1 69 444.061 431.758 124.931 -7.22597 -2.09239 31.5037 +2 69 437.98 425.397 124.035 -7.32459 -2.08407 30.8019 +3 69 432.417 419.076 119.726 -7.1323 -2.13909 29.0514 +4 69 426.738 412.661 114.091 -6.97622 -2.24233 27.5329 +5 69 421.113 406.568 112.795 -6.95966 -2.2181 26.6477 +6 69 414.964 399.796 113.254 -6.89092 -2.11055 25.5508 +7 69 408.313 392.652 113.573 -6.90237 -2.03324 24.7474 +1 74 477.818 464.863 47.7721 -5.46253 -5.18639 29.9178 +2 74 472.705 459.099 44.6283 -5.40304 -5.06238 28.4865 +1 75 477.818 464.863 47.7721 -5.46253 -5.18639 29.9178 +2 75 472.705 459.099 44.6283 -5.40304 -5.06238 28.4865 +1 76 422.265 408.875 55.2521 -7.51344 -4.71768 28.945 +2 76 415.112 401.023 52.1342 -7.41364 -4.60265 27.5099 +3 76 408.035 393.207 45.1294 -7.30047 -4.62698 26.1386 +4 76 400.304 385.596 36.6259 -7.64224 -4.9752 26.3514 +1 79 451.106 438.208 77.5776 -6.59924 -3.96805 30.0504 +2 79 445.036 431.574 75.2566 -6.56457 -3.89418 28.7897 +1 80 461.33 448.183 77.9245 -6.05615 -3.8785 29.4796 +2 80 455.329 441.776 75.6553 -6.11249 -3.85221 28.5962 +3 80 449.704 435.837 69.5686 -6.19193 -4.00072 27.9485 +4 80 443.847 429.056 61.6947 -6.01783 -4.03675 26.2026 +5 80 438.513 423.674 58.3238 -6.1917 -4.14587 26.1189 +6 80 432.69 417.137 56.6184 -6.10855 -4.01443 24.9198 +7 80 426.329 410.32 54.916 -6.1478 -3.9571 24.2093 +8 80 419.855 403.607 50.4711 -6.27153 -4.04591 23.8536 +1 83 524.861 512.387 99.0037 -3.64712 -3.18001 31.0695 +2 83 521.387 508.737 97.3619 -3.74378 -3.2054 30.6365 +3 83 518.54 505.038 91.9327 -3.62084 -3.21914 28.7036 +1 86 451.632 438.453 41.5387 -6.43651 -5.35192 29.4072 +2 86 445.619 432.262 37.972 -6.59294 -5.42433 29.0169 +3 86 439.939 425.582 30.5923 -6.34627 -5.32265 26.996 +1 87 519.097 508.425 56.748 -4.55329 -5.84403 36.3176 +2 87 515.739 502.233 53.8001 -3.73134 -4.73491 28.6964 +3 87 512.106 497.923 47.0277 -3.69077 -4.76531 27.3262 +4 87 508.534 494.589 38.4066 -3.89132 -5.17871 27.7925 +5 87 505.435 491.51 34.0653 -4.0166 -5.35378 27.8333 +6 87 502.467 486.81 31.7197 -3.67409 -4.84199 24.7543 +1 88 534.071 522.238 63.8388 -3.42661 -4.94851 32.7527 +2 88 531.165 518.834 61.4406 -3.41475 -4.85304 31.4294 +1 89 534.071 522.238 63.8388 -3.42661 -4.94851 32.7527 +2 89 531.165 518.834 61.4406 -3.41475 -4.85304 31.4294 +1 92 435.312 422.269 78.4345 -7.1758 -3.88835 29.7142 +2 92 428.787 415.335 76.4018 -7.21856 -3.8515 28.8123 +3 92 422.68 408.458 70.1035 -7.05831 -3.88082 27.252 +1 93 450.491 437.056 88.6618 -6.35949 -3.36598 28.8469 +2 93 444.629 430.861 86.4587 -6.43476 -3.37071 28.1507 +3 93 438.781 424.649 80.6644 -6.49125 -3.50411 27.4255 +1 94 455.793 443.363 111.853 -6.64468 -2.63603 31.1797 +2 94 450 436.592 110.47 -6.39219 -2.4992 28.906 +3 94 444.45 431.11 105.548 -6.64812 -2.71008 29.0528 +4 94 439.122 425.417 99.4872 -6.68009 -2.87553 28.2799 +5 94 433.783 419.592 97.7756 -6.65366 -2.84194 27.3123 +1 96 516.839 504.605 114.884 -4.07104 -2.54525 31.6802 +2 96 513.501 500.595 113.958 -3.99767 -2.45111 30.0285 +1 97 545.632 534.021 117.895 -2.95751 -2.5426 33.3807 +2 97 543.43 531.117 117.068 -2.88466 -2.4335 31.4748 +1 98 455.088 441.992 55.321 -6.3357 -4.82066 29.5942 +2 98 448.718 435.522 52.1503 -6.54678 -4.91306 29.3691 +3 98 443.134 428.998 45.1421 -6.3241 -4.85301 27.4182 +4 98 437.065 422.379 36.5361 -6.30915 -4.98596 26.391 +5 98 431.182 415.996 32.1223 -6.30939 -4.97784 25.5216 +1 100 427.579 414.128 66.7824 -7.26719 -4.23585 28.8138 +2 100 420.199 406.208 64.0832 -7.26993 -4.17594 27.7013 +3 100 413.155 398.753 57.4381 -7.32551 -4.3048 26.912 +1 101 427.579 414.128 66.7824 -7.26719 -4.23585 28.8138 +2 101 420.199 406.208 64.0832 -7.26993 -4.17594 27.7013 +3 101 413.155 398.753 57.4381 -7.32551 -4.3048 26.912 +1 103 542.696 530.061 22.2283 -2.84256 -6.40353 30.6746 +2 103 539.496 526.632 18.0308 -2.92561 -6.46493 30.1291 +3 103 538.168 524.086 12.1824 -2.72324 -6.12886 27.5232 +1 104 535.956 523.649 89.7316 -3.21258 -3.62806 31.4931 +2 104 533.076 520.355 87.8891 -3.22957 -3.58772 30.4676 +3 104 530.458 517.095 82.3061 -3.17958 -3.6397 29.0032 +4 104 528.051 514.081 74.7953 -3.13395 -3.77029 27.7427 +1 105 535.956 523.649 89.7316 -3.21258 -3.62806 31.4931 +2 105 533.076 520.355 87.8891 -3.22957 -3.58772 30.4676 +3 105 530.458 517.095 82.3061 -3.17958 -3.6397 29.0032 +4 105 528.051 514.081 74.7953 -3.13395 -3.77029 27.7427 +5 105 526.05 511.39 72.3354 -3.05982 -3.68304 26.4374 +1 107 566.9 555.395 21.5232 -1.99174 -7.06559 33.6884 +2 107 564.716 552.833 17.392 -2.02712 -7.02754 32.6166 +1 112 658.214 646.669 88.116 2.26369 -3.9425 33.5701 +2 112 658.897 647.085 85.9733 2.24356 -3.95075 32.8107 +1 113 675.96 664.671 103.316 3.15958 -3.30888 34.3333 +2 113 677.522 665.531 101.535 3.04463 -3.195 32.324 +1 114 658.454 646.975 119.766 2.28803 -2.48428 33.7645 +2 114 659.332 647.379 118.527 2.23661 -2.44124 32.423 +3 114 660.767 648.4 113.81 2.22421 -2.56458 31.3399 +1 115 606.492 600.958 15.8831 -0.297771 -15.2365 70.0367 +2 115 605.534 599.882 14.2559 -0.382556 -15.0733 68.5755 +1 116 670.748 663.186 44.3523 4.34633 -9.12761 51.2516 +2 116 671.336 663.146 42.0262 4.05203 -8.58126 47.3271 +3 116 672.087 664.058 35.3488 4.18339 -9.1997 48.2741 +1 120 683.092 671.693 102.585 3.46491 -3.31111 33.9993 +2 120 684.634 672.737 100.791 3.38946 -3.25346 32.5757 +3 120 686.62 674.585 95.205 3.43928 -3.46554 32.2029 +1 123 661.897 656.37 19.4334 5.08714 -14.9123 70.1326 +2 123 661.865 656.089 16.9831 4.86425 -14.4954 67.1001 +3 123 662.228 656.907 12.0509 5.3169 -16.2332 72.8397 +1 125 559.802 547.566 36.2278 -2.18429 -5.9978 31.675 +2 125 557.384 544.657 32.6228 -2.20213 -5.9186 30.4532 +3 125 555.609 542.186 24.9967 -2.15891 -5.91676 28.8736 +1 128 617.818 606.749 109.389 0.400776 -3.07971 35.0133 +2 128 617.902 605.737 108.604 0.368359 -2.8369 31.8587 +1 129 653.913 642.678 111.773 2.1206 -2.92037 34.4978 +2 129 654.56 642.954 110.278 2.08274 -2.89618 33.3948 +3 129 655.858 643.64 105.386 2.03546 -2.96612 31.7211 +1 137 602.716 594.449 115.366 -0.444616 -3.73531 46.8819 +2 137 601.999 593.818 114.699 -0.496396 -3.81847 47.3762 +3 137 601.865 593.596 110.463 -0.499836 -4.05281 46.8702 +4 137 602.121 593.372 104.753 -0.456636 -4.18086 44.2967 +5 137 602.843 594.424 103.369 -0.428459 -4.43296 46.0323 +6 137 603.467 594.713 103.946 -0.373832 -4.22829 44.2745 +7 137 603.853 595.565 105.065 -0.369797 -4.39337 46.7625 +8 137 604.348 596.35 104.046 -0.349984 -4.62099 48.4572 +9 137 604.468 597.4 101.689 -0.386891 -5.40807 54.8323 +10 137 604.594 597.884 98.157 -0.397409 -5.97905 57.7547 +11 137 605.128 597.873 95.5003 -0.328109 -5.72721 53.4221 +12 137 605.24 597.958 93.2712 -0.318643 -5.87072 53.2269 +13 137 605.91 597.8 91.4634 -0.241676 -5.39044 47.7869 +14 137 606.321 597.561 90.6788 -0.198521 -5.0384 44.2396 +15 137 607.307 597.928 90.2342 -0.129002 -4.73185 41.3243 +16 137 608.425 598.542 89.0036 -0.0616454 -4.55718 39.2148 +17 137 609.738 598.96 87.3804 0.00892867 -4.25958 35.9579 +18 137 610.907 599.775 85.9568 0.065012 -4.19324 34.8179 +1 138 822.785 817.07 56.4723 20.0396 -10.9379 67.8124 +2 138 825.065 819.162 54.809 19.6106 -10.7418 65.6584 +3 138 828.256 822.273 49.8178 19.6342 -11.046 64.7783 +4 138 832.16 825.974 42.8032 19.3275 -11.2918 62.6482 +5 138 836.094 829.929 39.856 19.7394 -11.589 62.8721 +1 142 823.365 817.614 40.2749 19.9696 -12.383 67.3921 +2 142 825.659 819.737 38.3195 19.6034 -12.2042 65.454 +3 142 828.962 822.701 32.8848 18.8242 -12.009 61.9061 +4 142 832.943 826.714 25.6717 19.2645 -12.693 62.2252 +5 142 837.133 830.349 22.3407 18.0184 -11.9171 57.1286 +6 142 840.876 834.064 21.6241 18.24 -11.9249 56.8952 +1 144 815.798 810.929 59.8465 22.7486 -12.465 79.5871 +2 144 817.787 812.929 58.1828 23.0257 -12.6803 79.7871 +3 144 821.963 815.798 53.8181 18.5089 -10.3729 62.8752 +1 145 815.798 810.929 59.8465 22.7486 -12.465 79.5871 +2 145 817.787 812.929 58.1828 23.0257 -12.6803 79.7871 +1 146 777.011 765.364 70.4036 7.72293 -4.72504 33.2775 +2 146 781.246 769.121 67.4527 7.60553 -4.66916 31.9633 +3 146 786.571 774.015 60.9102 7.57279 -4.78911 30.8683 +1 148 764.595 753.222 100.942 7.32281 -3.39666 34.0805 +2 148 768.801 756.5 98.7651 6.95374 -3.2353 31.508 +1 151 769.692 758.18 119.424 7.47199 -2.4931 33.6678 +2 151 774.14 761.647 117.907 7.07619 -2.36246 31.0226 +1 152 769.692 758.18 119.424 7.47199 -2.4931 33.6678 +2 152 774.14 761.647 117.907 7.07619 -2.36246 31.0226 +1 153 769.692 758.18 119.424 7.47199 -2.4931 33.6678 +2 153 774.14 761.647 117.907 7.07619 -2.36246 31.0226 +3 153 779.344 766.681 112.851 7.2019 -2.54521 30.606 +4 153 785.385 772.087 106.408 7.10183 -2.68385 29.1438 +1 155 829.479 823.269 46.3632 19.0214 -10.9405 62.4074 +2 155 832.007 825.885 44.4532 19.5195 -11.267 63.314 +1 158 819.357 810.23 71.9845 12.3472 -5.93645 42.4645 +2 158 824.128 814.918 69.5689 12.5149 -6.02419 42.0843 +3 158 830.206 820.885 63.3726 12.7145 -6.30875 41.5779 +1 159 788.924 777.307 74.6425 8.29323 -4.54096 33.3615 +2 159 793.683 781.418 71.6578 8.0637 -4.43188 31.5997 +3 159 799.1 786.642 65.4656 8.17271 -4.63044 31.1117 +1 160 700.033 688.956 119.498 4.38707 -2.58723 34.9873 +2 160 702.16 690.617 117.977 4.30911 -2.55363 33.5761 +3 160 704.427 692.419 114.085 4.2437 -2.62889 32.2765 +4 160 707.853 695.704 106.898 4.34587 -2.9161 31.9013 +5 160 711.594 699.221 103.299 4.42958 -3.01954 31.3238 +1 170 863.862 853.773 32.7773 13.5388 -7.45754 38.414 +2 170 869.634 859.099 29.2066 13.2603 -7.32407 36.7887 +3 170 876.662 865.763 21.815 13.1645 -7.44417 35.562 +4 170 884.614 873.711 12.4026 13.5511 -7.90493 35.5478 +1 171 863.862 853.773 32.7773 13.5388 -7.45754 38.414 +2 171 869.634 859.099 29.2066 13.2603 -7.32407 36.7887 +3 171 876.662 865.763 21.815 13.1645 -7.44417 35.562 +1 179 1082.33 1035.83 56.9512 5.46202 -1.33906 8.33616 +2 179 1143.34 1090.25 40.9695 5.3999 -1.33418 7.29928 +3 179 1223.79 1163.7 16.1894 5.49146 -1.40065 6.45087 +1 180 1057.33 1012.89 113.1 5.41204 -0.722226 8.72091 +2 180 1112.37 1062.54 104.89 5.41996 -0.732605 7.77771 +1 186 1032 985.776 48.4555 4.90898 -1.44557 8.38463 +2 186 1085.42 1033.06 31.4657 4.88201 -1.45056 7.40254 +1 187 1051.8 1005.3 52.7114 5.10833 -1.38778 8.33454 +2 187 1108.05 1055.56 36.3784 5.10147 -1.39666 7.38407 +1 188 1034.71 988.427 55.8301 4.93464 -1.35829 8.37485 +2 188 1088.88 1036.23 39.7023 4.88985 -1.35836 7.36084 +3 188 1160.46 1100.97 15.2843 4.97444 -1.42279 6.51521 +1 190 1085.46 1039.22 62.8393 5.52829 -1.27798 8.38169 +2 190 1146.8 1094.21 47.6122 5.48765 -1.27929 7.3702 +3 190 1228.58 1168.42 24.1453 5.52629 -1.32759 6.44148 +1 200 988.3 953.944 70.9989 5.92163 -1.59251 11.2813 +2 200 1023.27 984.786 60.7993 5.77461 -1.56408 10.0713 +1 215 1121.65 1072.48 96.7775 5.59467 -0.83115 7.88293 +2 215 1190.71 1135.86 85.0304 5.69168 -0.860135 7.06666 +1 216 1114.65 1067.01 105.103 5.69499 -0.763898 8.1354 +2 216 1182.5 1128.17 94.7334 5.66503 -0.772428 7.13431 +1 237 210.085 185.84 137.162 -8.85046 -0.790769 15.9858 +2 237 183.701 157.797 136.103 -8.83093 -0.762093 14.9624 +3 237 154.206 126.701 131.097 -8.89254 -0.815468 14.0908 +4 237 120.892 91.407 124.845 -8.90252 -0.874626 13.1449 +5 237 83.6969 52.3843 122.984 -9.02091 -0.855497 12.3776 +6 237 40.457 6.88333 122.431 -9.10517 -0.806727 11.544 +1 240 233.309 211.384 152.123 -9.21776 -0.507897 17.677 +2 240 210.927 187.364 152.182 -9.08737 -0.471248 16.4484 +1 241 247.363 226.057 154.126 -9.13145 -0.472163 18.1909 +2 241 226.5 204.026 154.334 -9.15527 -0.442627 17.245 +3 241 203.845 180.072 150.647 -9.16719 -0.50176 16.3033 +4 241 178.941 153.663 146.228 -9.15062 -0.565794 15.3326 +5 241 151.895 125.153 146.121 -9.19282 -0.536973 14.4931 +6 241 121.048 92.3682 147.761 -9.14939 -0.469974 13.5138 +7 241 85.7016 55.22 149.113 -9.23148 -0.418372 12.715 +8 241 44.8783 12.1284 147.369 -9.26166 -0.417996 11.8344 +1 242 169.398 130.429 172.472 -6.06716 -0.00526316 9.94565 +2 242 121.259 78.4461 174.148 -6.1265 0.0162394 9.05283 +3 242 62.9069 15.062 170.919 -6.13722 -0.0217269 8.10065 +1 244 198.722 159.782 183.988 -5.66712 0.153588 9.95296 +2 244 153.949 110.823 185.737 -5.67482 0.160468 8.98706 +3 244 99.5174 52.2933 184.678 -5.80147 0.134492 8.20713 +1 248 153.264 112.671 215.892 -6.03788 0.569499 9.54767 +2 248 101.213 54.7982 222.337 -5.88293 0.572656 8.35014 +1 250 250.408 229.298 143.187 -9.13888 -0.754889 18.3601 +2 250 229.829 207.584 142.855 -9.16905 -0.724368 17.4224 +3 250 207.652 183.818 138.455 -9.05798 -0.775256 16.2616 +4 250 182.912 157.583 133.247 -9.04803 -0.839961 15.3018 +5 250 156.152 129.646 132.288 -9.18832 -0.82207 14.622 +1 251 237.073 199.188 213.088 -5.2813 0.57046 10.2303 +2 251 197.788 154.774 218.598 -5.14202 0.571228 9.01026 +3 251 149.919 103.382 220.938 -5.30536 0.55501 8.32829 +1 257 149.933 109.493 183.2 -6.10513 0.137418 9.58405 +2 257 97.4448 52.1235 186.248 -6.06961 0.158748 8.55171 +1 259 213.322 173.629 209.6 -5.36207 0.497268 9.7642 +2 259 169.407 125.269 214.78 -5.35649 0.510221 8.78085 +3 259 115.44 65.2534 217.94 -5.28857 0.482561 7.72264 +1 261 178.996 139.801 198.259 -5.90075 0.34817 9.88848 +2 261 132.041 86.9993 201.993 -5.69471 0.347504 8.6048 +1 262 333.213 323.106 130.685 -14.6866 -2.24109 38.3467 +2 262 325.173 314.327 131.089 -14.084 -2.0684 35.7336 +1 267 369.828 364.654 174.805 -24.8885 0.202538 74.9088 +2 267 365.959 360.729 175.687 -25.0161 0.290933 74.0972 +3 267 362.774 357.494 173.18 -25.1037 0.0331967 73.397 +4 267 360.036 353.975 169.42 -22.1126 -0.304293 63.9424 +1 268 369.828 364.654 174.805 -24.8885 0.202538 74.9088 +2 268 365.959 360.729 175.687 -25.0161 0.290933 74.0972 +1 271 294.822 278.521 151.287 -10.3709 -0.710667 23.7754 +2 271 280.927 264.104 151.174 -10.4929 -0.692219 23.038 +1 272 410.988 398.967 155.075 -8.87279 -0.794414 32.2406 +2 272 404.17 391.695 155.345 -8.8438 -0.753917 31.0685 +3 272 397.602 384.572 152.265 -8.73752 -0.84875 29.7439 +4 272 391.037 377.367 147.684 -8.5869 -0.98908 28.353 +1 277 369.935 343.004 202.032 -4.77944 0.581967 14.3915 +2 277 352.309 325.113 205.285 -5.08097 0.64055 14.2511 +1 278 387.725 362.06 208.921 -4.64288 0.754866 15.1014 +2 278 372.185 344.818 212.205 -4.65911 0.772375 14.1621 +3 278 355.163 325.756 212.535 -4.64686 0.724826 13.1798 +4 278 336.134 304.545 211.981 -4.64945 0.665325 12.2694 +1 279 400.396 388.152 144.735 -9.17646 -1.23364 31.6554 +2 279 393.192 379.931 144.938 -8.76416 -1.13078 29.2265 +3 279 385.587 372.293 140.736 -9.04968 -1.29773 29.154 +4 279 378.352 365.226 135.65 -9.46123 -1.52241 29.526 +5 279 371.587 357.672 135.333 -9.1861 -1.44838 27.8525 +6 279 364.083 349.746 136.725 -9.19725 -1.35366 27.0338 +7 279 356.183 341.436 138.169 -9.22888 -1.26334 26.281 +1 283 414.424 402.048 140.439 -8.46959 -1.40694 31.3174 +2 283 407.504 394.489 140.311 -8.3393 -1.34314 29.7796 +1 286 499.484 487.406 139.935 -4.89543 -1.46405 32.0894 +2 286 495.346 482.82 139.606 -4.8976 -1.42573 30.9404 +3 286 491.777 478.785 135.778 -4.86991 -1.53295 29.8332 +4 286 488.221 474.689 130.363 -4.81667 -1.68671 28.6422 +5 286 484.855 471.162 129.375 -4.89186 -1.70558 28.3042 +6 286 481.486 466.958 130.254 -4.7353 -1.57505 26.6777 +1 289 531.473 526.051 196.881 -7.73553 2.3802 71.4786 +2 289 529.822 524.184 197.884 -7.59719 2.38483 68.7462 +3 289 528.636 522.904 195.553 -7.58422 2.12739 67.6232 +4 289 528.016 522.032 191.722 -7.31916 1.69352 64.7637 +5 289 527.787 521.889 192.151 -7.44745 1.75748 65.7141 +1 291 479.204 465.176 214.205 -4.99177 1.58349 27.6302 +2 291 473.956 459.294 216.308 -4.96799 1.59197 26.4344 +3 291 469.048 453.819 214.869 -4.95603 1.48195 25.4497 +4 291 464.399 448.024 212.3 -4.76159 1.29392 23.6681 +5 291 459.723 442.514 214.256 -4.67682 1.29229 22.5213 +6 291 454.337 436.307 218.306 -4.62439 1.3541 21.4961 +1 292 522.943 511.09 132.329 -3.92529 -1.8365 32.6986 +2 292 519.637 507.412 131.797 -3.95098 -1.80394 31.7026 +3 292 516.822 503.931 127.713 -3.86421 -1.88095 30.0652 +1 296 531.061 525.918 176.772 -8.199 0.40921 75.3631 +2 296 529.451 524.016 177.291 -7.91708 0.438507 71.3093 +3 296 528.319 522.921 174.764 -8.08394 0.190106 71.7979 +4 296 527.636 522.104 170.883 -7.95483 -0.191421 70.0622 +5 296 527.479 521.966 171.135 -7.99646 -0.16751 70.2941 +1 301 507.029 494.856 133.434 -4.52437 -1.73951 31.8394 +2 301 503.049 490.236 132.817 -4.46482 -1.67833 30.2464 +3 301 499.402 486.37 128.686 -4.54046 -1.82052 29.7402 +1 302 485.752 473.968 155.378 -5.64344 -0.796582 32.8894 +2 302 481.313 469.276 155.829 -5.7229 -0.759738 32.1982 +3 302 477.287 464.805 152.36 -5.69238 -0.881947 31.0516 +1 304 428.273 408.13 198.088 -4.83443 0.672934 19.2415 +2 304 418.082 396.722 199.886 -4.81535 0.679817 18.1455 +1 305 496.602 484.583 151.777 -5.04838 -0.942 32.2476 +2 305 492.598 480.12 151.98 -5.03486 -0.898551 31.0603 +1 307 490.529 484.539 188.439 -10.6737 1.39753 64.702 +2 307 488.889 482.129 189.605 -9.5883 1.33103 57.3324 +3 307 486.189 480.876 186.564 -12.4715 1.38594 72.9401 +1 308 551.405 545.697 143.957 -5.47186 -2.71896 67.8914 +2 308 550.025 544.086 144.076 -5.38513 -2.60304 65.2656 +1 309 551.405 545.697 143.957 -5.47186 -2.71896 67.8914 +2 309 550.025 544.086 144.076 -5.38513 -2.60304 65.2656 +1 310 520.101 510.811 150.347 -5.17255 -1.30135 41.72 +2 310 516.955 508.282 150.336 -5.73496 -1.39453 44.6848 +3 310 514.055 506.669 146.515 -6.94508 -1.91539 52.4704 +4 310 513.008 504.775 140.898 -6.29942 -2.08492 47.0764 +5 310 511.394 501.728 140.078 -5.455 -1.82134 40.0957 +6 310 510.664 500.781 140.578 -5.375 -1.75424 39.2159 +7 310 508.202 499.604 142.502 -6.33206 -1.89619 45.0764 +1 311 464.267 450.582 217.603 -5.70264 1.75636 28.32 +2 311 458.952 443.719 219.95 -5.31048 1.66063 25.4418 +3 311 453.448 437.263 218.975 -5.1809 1.53065 23.9459 +4 311 446.795 429.168 217.075 -4.95973 1.34751 21.9866 +5 311 441.779 423.308 219.517 -4.87939 1.35705 20.9837 +6 311 435.01 416.48 224.158 -5.05993 1.48724 20.9163 +7 311 427.524 409.158 229.184 -5.32418 1.64755 21.1035 +1 312 515.702 509.891 192.267 -8.67551 1.79441 66.6938 +2 312 514 507.993 193.153 -8.54553 1.81528 64.5245 +3 312 512.406 507.133 190.606 -9.8982 1.80859 73.5118 +4 312 511.563 506.823 186.65 -11.1061 1.56353 81.7732 +1 318 686.818 675.925 139.14 3.80978 -1.66252 35.5803 +2 318 688.609 677.34 138.442 3.76817 -1.64036 34.3947 +3 318 690.674 679.138 134.251 3.77688 -1.79745 33.5964 +4 318 693.662 681.709 128.707 3.77949 -1.98391 32.4252 +5 318 697.195 685.214 126.825 3.9289 -2.06358 32.348 +1 319 610.566 605.699 179.775 0.111087 0.763803 79.6311 +2 319 610.018 604.999 180.363 0.0491049 0.803582 77.2208 +3 319 610.026 604.926 177.531 0.0491093 0.492557 75.9944 +1 320 635.977 625.928 187.016 1.41209 0.75696 38.5672 +2 320 636.043 625.551 187.688 1.35581 0.759406 36.9387 +1 322 692.634 678.588 213.728 3.17692 1.56309 27.5928 +2 322 694.818 680.64 215.184 3.23022 1.60376 27.3372 +3 322 698.073 683.155 213.718 3.18692 1.47129 25.9787 +4 322 701.94 686.672 210.75 3.25005 1.33321 25.3843 +5 322 706.61 690.806 211.915 3.29853 1.32758 24.5233 +6 322 711.207 694.607 215.188 3.2892 1.36989 23.3481 +7 322 716.102 698.764 219.41 3.30073 1.44231 22.3534 +8 322 721.375 703.401 221.79 3.34156 1.46244 21.5628 +9 322 727.242 708.538 222.734 3.37958 1.43245 20.7209 +10 322 733.374 713.158 222.938 3.28994 1.33082 19.1724 +11 322 739.791 719.25 223.952 3.40557 1.33621 18.8682 +12 322 747.23 725.347 225.967 3.37927 1.30371 17.7109 +13 322 755.387 731.279 229.23 3.24915 1.2561 16.0764 +1 323 688.137 666.354 243.3 1.93767 1.73714 17.7926 +2 323 692.151 669.119 247.446 1.92619 1.73962 16.8275 +3 323 697.552 672.808 249.132 1.91021 1.65589 15.6637 +1 324 589.594 586.133 147.343 -3.09841 -3.95915 111.977 +2 324 588.715 585.09 147.561 -3.08888 -3.74822 106.924 +3 324 588.403 584.702 144.434 -3.07079 -4.12513 104.729 +1 327 665.129 654.299 168.14 2.75618 -0.233815 35.7875 +2 327 665.902 654.698 168.083 2.70112 -0.228723 34.5912 +3 327 666.961 655.852 165.339 2.77556 -0.363362 34.8889 +1 330 665.864 651.899 197.081 2.16575 0.931873 27.7537 +2 330 667.357 652.809 198.601 2.13411 0.950695 26.642 +1 331 575.869 564.711 213.44 -1.62189 1.95388 34.7358 +2 331 574.557 562.881 215.065 -1.61031 1.94197 33.1951 +3 331 573.626 561.193 213.489 -1.55246 1.75559 31.1734 +4 331 573.046 560.657 210.633 -1.58307 1.63795 31.283 +5 331 573.087 560.279 212.033 -1.52968 1.64316 30.2615 +6 331 572.649 559.042 215.716 -1.45711 1.69205 28.4842 +7 331 571.991 558.163 219.794 -1.45933 1.82336 28.028 +8 331 571.673 556.853 221.651 -1.37319 1.76863 26.1521 +9 331 571.114 556.432 222.138 -1.40658 1.80311 26.3984 +1 332 570.084 565.184 135.206 -4.32726 -4.12691 79.0945 +2 332 568.958 563.923 135.318 -4.33144 -4.00442 76.9746 +3 332 568.316 563.209 131.985 -4.33776 -4.29836 75.8873 +4 332 568.134 562.859 127.131 -4.21806 -4.65573 73.4701 +1 334 626.108 618.472 141.066 1.1641 -2.23605 50.7547 +2 334 625.391 617.732 140.948 1.11042 -2.23792 50.6095 +1 335 662.586 651.19 145.552 2.4995 -1.28694 34.0112 +2 335 663.474 651.762 145.045 2.47269 -1.27537 33.0916 +3 335 665.034 652.988 141.195 2.47368 -1.41172 32.1743 +4 335 667.208 654.647 135.495 2.4652 -1.59758 30.8547 +5 335 669.95 656.936 134.031 2.49274 -1.60248 29.7829 +6 335 672.499 659.114 134.756 2.52589 -1.52893 28.9568 +7 335 675.255 661.561 136.302 2.57693 -1.43374 28.3023 +1 337 675.015 662.015 199.212 2.7046 1.08908 29.8137 +2 337 676.679 663.261 200.438 2.68685 1.10422 28.8835 +3 337 679.1 665.174 198.221 2.68239 0.97848 27.8319 +4 337 682.316 667.624 194.636 2.66007 0.796375 26.3804 +5 337 686.006 670.882 195.195 2.71507 0.793443 25.626 +6 337 689.921 673.886 198.03 2.69196 0.84334 24.1701 +7 337 693.83 677.261 201.577 2.73194 0.931153 23.3912 +8 337 698.16 680.72 203.146 2.72894 0.933013 22.2237 +9 337 702.737 684.638 203.214 2.76533 0.901027 21.4138 +10 337 708 688.326 202.443 2.6878 0.807903 19.7007 +11 337 712.416 692.845 203.665 2.82303 0.845643 19.8035 +12 337 718.127 697.887 204.78 2.88134 0.847311 19.1493 +13 337 725.87 703.27 205.51 2.76446 0.776159 17.1495 +1 338 640.55 630.438 204.686 1.64616 1.69087 38.3268 +2 338 640.85 630.438 205.961 1.61433 1.70802 37.2252 +3 338 641.751 630.781 203.785 1.57626 1.51451 35.3299 +1 339 632.275 625.475 149.404 1.7945 -1.85256 57.0009 +2 339 631.984 625.147 149.378 1.76174 -1.84433 56.6855 +3 339 632.144 625.364 146.023 1.78931 -2.12573 57.1657 +4 339 632.719 625.941 141.053 1.83546 -2.52028 57.1832 +5 339 633.645 627.001 140.514 1.9473 -2.61462 58.3352 +1 340 599.5 595.468 183.52 -1.34039 1.42123 96.1396 +2 340 599.173 595.017 184.163 -1.34244 1.46162 93.2578 +1 342 624.655 617.54 135.728 1.13968 -2.80284 54.4725 +2 342 624.395 616.767 135.312 1.0447 -2.64369 50.8107 +1 343 660.78 647.805 210.659 2.12043 1.56503 29.8701 +2 343 661.867 648.486 212.372 2.0997 1.58627 28.9633 +3 343 663.579 649.634 210.798 2.08085 1.46163 27.794 +1 344 642.72 629.748 218.493 1.37315 1.88988 29.8781 +2 344 643.347 629.94 220.463 1.35367 1.9074 28.9076 +3 344 644.416 630.59 218.991 1.35425 1.79253 28.0332 +4 344 646.288 631.717 216.326 1.35393 1.60251 26.5978 +5 344 648.142 633.297 217.246 1.39613 1.60638 26.1095 +1 345 579.806 576.717 159.441 -5.17454 -2.33273 125.485 +2 345 579.177 575.836 159.897 -4.88469 -2.08312 116.003 +3 345 578.875 575.557 156.674 -4.96669 -2.61906 116.793 +4 345 579.038 575.396 152.432 -4.50193 -3.01217 106.426 +5 345 579.537 576.041 152.303 -4.61274 -3.15752 110.861 +6 345 579.748 576.412 154.081 -4.79979 -3.02258 116.171 +7 345 580.251 576.763 156.558 -4.51327 -2.50947 111.113 +8 345 580.505 576.966 156.853 -4.41047 -2.42886 109.528 +9 345 581.114 578.167 155.212 -5.18347 -3.21492 131.484 +1 346 636.877 629.635 174.24 2.02613 0.102827 53.5153 +2 346 635.509 630.287 175.473 2.66926 0.269408 74.218 +1 347 774.783 762.768 136.097 7.38642 -1.64324 32.2567 +2 347 779.298 766.882 134.926 7.34377 -1.64099 31.2175 +1 350 810.057 763.39 202.609 2.30779 0.34249 8.30512 +2 350 835.394 782.873 205.824 2.30972 0.337204 7.37951 +1 353 798.626 786.985 149.078 8.72386 -1.09706 33.2929 +2 353 803.783 791.558 148.35 8.53417 -1.0767 31.7043 +3 353 810.225 797.41 144.147 8.41055 -1.20319 30.2419 +1 355 818.21 772.076 206.806 2.42935 0.395303 8.40095 +2 355 844.8 792.258 210.735 2.40492 0.387268 7.37644 +1 358 699.456 687.721 208.052 4.11504 1.6112 33.0286 +2 358 702.183 689.926 209.521 4.05906 1.60685 31.6201 +1 359 699.456 687.721 208.052 4.11504 1.6112 33.0286 +2 359 702.183 689.926 209.521 4.05906 1.60685 31.6201 +1 361 795.151 748.333 203.255 2.12933 0.348793 8.27834 +2 361 817.154 764.575 206.726 2.12079 0.34604 7.37122 +1 363 789.715 742.271 231.988 2.03971 0.66951 8.16922 +2 363 814.103 759.278 239.761 2.00402 0.65552 7.06928 +1 364 789.715 742.271 231.988 2.03971 0.66951 8.16922 +2 364 814.103 759.278 239.761 2.00402 0.65552 7.06928 +3 364 846.492 782.668 246.463 1.99403 0.619496 6.07248 +4 364 891.32 815.63 255.331 1.9996 0.585323 5.1206 +5 364 956.026 863.015 272.891 2.00089 0.577728 4.16697 +1 365 754.218 715.233 251.825 1.99316 1.08809 9.94163 +2 365 769.232 725.583 259.485 1.96494 1.06609 8.87927 +1 366 754.218 715.233 251.825 1.99316 1.08809 9.94163 +2 366 769.232 725.583 259.485 1.96494 1.06609 8.87927 +3 366 788.42 739.905 266.646 1.9803 1.03844 7.98868 +4 366 812.84 758.241 274.748 1.99989 1.00244 7.09852 +1 368 831.261 783.945 195.065 2.51685 0.25215 8.19121 +2 368 858.478 804.644 198.913 2.48369 0.260014 7.19943 +1 369 704.549 676.668 247.806 1.8301 1.44405 13.9014 +2 369 710.646 681.542 252.631 1.86572 1.47242 13.3172 +3 369 720.207 688.1 254.787 1.85114 1.37073 12.0713 +1 373 920.796 903.078 148.221 9.43584 -0.746804 21.875 +2 373 934.698 916.032 146.87 9.35656 -0.747756 20.7638 +1 374 905.585 887.988 149.178 9.03607 -0.722686 22.0247 +2 374 918.698 900.376 147.738 9.06321 -0.736337 21.1538 +1 376 964.801 947.282 159.213 10.8923 -0.418259 22.1236 +2 376 980.443 961.835 158.006 10.7063 -0.428609 20.8286 +3 376 998.791 979.231 153.994 10.6886 -0.517908 19.8139 +4 376 1020.64 998.959 148.41 10.1837 -0.605556 17.8745 +5 376 1044.97 1022.91 146.141 10.6016 -0.650414 17.5683 +6 376 1070.86 1047.46 144.359 10.5879 -0.65403 16.5609 +7 376 1099.2 1074.87 144.077 10.8101 -0.635332 15.9297 +1 379 890.799 844.616 204.389 3.27104 0.36678 8.39206 +2 379 927.285 874.597 207.56 3.23914 0.353816 7.35591 +1 380 884.037 840.656 212.428 3.39859 0.490001 8.93409 +2 380 917.344 868.115 216.494 3.35833 0.476174 7.87291 +3 380 960.447 904.561 219.076 3.37256 0.444262 6.93507 +1 381 939.435 890.978 218.888 3.65673 0.510297 7.99837 +2 381 985.252 928.717 223.784 3.56951 0.483896 6.85544 +1 382 943.491 895.035 224.425 3.70176 0.571685 7.99852 +2 382 988.819 933.219 230.536 3.66402 0.557259 6.97075 +3 382 1050.08 985.159 235.581 3.6448 0.518997 5.96989 +4 382 1134.12 1056.71 241.65 3.63991 0.477376 5.00675 +1 385 947.024 929.838 167.431 10.5476 -0.169509 22.552 +2 385 961.84 943.797 167.344 10.4878 -0.16405 21.481 +3 385 978.967 959.803 163.817 10.3543 -0.253307 20.2244 +4 385 998.49 978 158.645 10.1959 -0.372488 18.9153 +5 385 1020.27 999.019 156.865 10.38 -0.404102 18.2355 +6 385 1044.11 1021.55 157.299 10.3482 -0.370434 17.1826 +1 388 854.495 839.589 182.781 8.82635 0.35774 26.0009 +2 388 863.336 848.357 183.544 9.10046 0.383329 25.8744 +1 389 838.951 792.657 205.914 2.66166 0.383599 8.37209 +2 389 868.362 815.624 209.757 2.63596 0.375862 7.34901 +3 389 906.902 846.241 211.533 2.63296 0.342501 6.38919 +1 390 937.62 887.32 230.089 3.50337 0.611211 7.70532 +2 390 982.895 925.98 237.504 3.52342 0.610146 6.80963 +3 390 1043.88 977.275 244.352 3.50261 0.576599 5.81888 +4 390 1129.17 1049.92 253.511 3.5219 0.54669 4.89054 +1 392 876.7 828.867 205.525 2.9999 0.366886 8.10261 +2 392 910.441 857.951 209.218 3.07902 0.372121 7.38373 +1 395 937.46 919.194 170.868 9.64259 -0.0584029 21.2183 +2 395 952.242 933.45 170.48 9.79553 -0.0678654 20.625 +1 398 976.273 959.787 156.597 11.9486 -0.529704 23.5099 +2 398 993.132 974.366 155.107 10.9797 -0.507994 20.654 +3 398 1011.57 992.634 151.087 11.405 -0.61753 20.4701 +4 398 1033.2 1012.75 144.713 11.1239 -0.738906 18.9458 +1 400 1083.21 1039.09 127.876 5.76605 -0.547544 8.78375 +2 400 1140.39 1091.38 121.309 5.8176 -0.564906 7.90761 +3 400 1216.25 1159.9 110.525 5.78323 -0.594145 6.87796 +1 415 259.007 217.185 256.709 -4.50242 1.07702 9.26727 +2 415 218.215 171.349 267.747 -4.48529 1.08759 8.26973 +3 415 167.602 114.581 277.26 -4.47746 1.05774 7.30988 +1 416 201.382 152.1 270.963 -4.44895 1.06934 7.86443 +2 416 144.271 88.767 285.992 -4.50287 1.09491 6.98276 +1 417 205.004 156.896 285.391 -4.51706 1.25653 8.05633 +2 417 149.529 95.1647 301.613 -4.54538 1.27222 7.12924 +1 421 195.091 144.94 334.27 -4.43922 1.72886 7.72813 +2 421 136.285 79.4364 357.923 -4.4719 1.74869 6.8177 +1 425 229.586 182.448 269.579 -4.32993 1.10221 8.22218 +2 425 178.462 126.304 284.068 -4.43966 1.14533 7.43076 +1 436 332.346 285.831 322.802 -3.20126 1.7316 8.33232 +2 436 296.323 243.699 343.111 -3.19729 1.73786 7.36495 +1 446 425.861 378.733 322.767 -2.09374 1.70866 8.22387 +2 446 401.545 349.215 342.963 -2.13521 1.74612 7.40637 +1 447 480.992 431.698 330.818 -1.40099 1.72132 7.86256 +2 447 463.194 407.066 353.247 -1.40074 1.72639 6.90521 +1 452 455.002 405.959 331.829 -1.69284 1.74121 7.90284 +2 452 431.732 376.06 354.407 -1.71574 1.75169 6.96166 +1 455 546.492 504.783 304.327 -0.812196 1.69316 9.29219 +2 455 539.346 492.75 319.582 -0.809405 1.69146 8.31777 +3 455 529.688 477.461 334.664 -0.82146 1.66419 7.42091 +1 456 490.233 442.106 320.836 -1.33182 1.65165 8.0532 +2 456 473.383 419.909 342.152 -1.36787 1.70058 7.24778 +1 462 605.072 576.669 264.484 -0.0848646 1.73289 13.6455 +2 462 604.607 575.037 271.669 -0.0899541 1.79498 13.1067 +1 463 571.496 540.856 270.315 -0.667285 1.70859 12.6493 +2 463 568.135 535.384 278.22 -0.679415 1.72813 11.8341 +3 463 564.973 529.698 284.29 -0.678935 1.69689 10.9873 +1 465 581.276 540.074 304.322 -0.368739 1.71397 9.40678 +2 465 578.339 531.903 319.333 -0.361141 1.6944 8.34638 +1 468 568.133 527.905 301.686 -0.553147 1.72025 9.63445 +2 468 563.476 518.61 316.11 -0.551724 1.71511 8.63853 +1 474 592.642 550.446 307.936 -0.215356 1.71957 9.18508 +2 474 590.395 542.902 324.398 -0.216749 1.71397 8.16059 +3 474 588.127 534.956 339.543 -0.216514 1.68395 7.28924 +1 475 687.419 661.468 258.422 1.6116 1.77113 14.9348 +2 475 692.101 664.494 264.165 1.60602 1.77663 14.039 +3 475 698.282 668.884 267.943 1.62112 1.73744 13.1837 +4 475 705.865 673.63 270.362 1.60478 1.62482 12.0233 +5 475 715.686 680.388 279.64 1.61498 1.62501 10.9799 +6 475 726.454 688.129 291.175 1.63834 1.65833 10.1127 +1 477 650.58 623.285 263.076 0.807267 1.77553 14.1996 +2 477 652.949 623.479 269.856 0.790871 1.76806 13.1514 +1 478 650.58 623.285 263.076 0.807267 1.77553 14.1996 +2 478 652.949 623.479 269.856 0.790871 1.76806 13.1514 +3 478 656.491 625.074 274.467 0.802405 1.73732 12.3364 +4 478 661.997 627.335 279.702 0.812625 1.65582 11.1816 +1 481 787.377 734.589 341.862 1.8094 1.71975 7.34205 +2 481 815.002 753.067 367.098 1.78177 1.68465 6.25777 +1 484 747.544 710.125 268.737 1.9808 1.37643 10.3579 +2 484 761.439 720.004 276.5 1.96895 1.34365 9.35396 +3 484 778.08 732.05 281.906 1.96656 1.27258 8.41999 +4 484 799.174 749.14 287.597 2.03563 1.23184 7.74617 +1 485 762.908 723.442 278.149 2.08714 1.43311 9.82042 +2 485 779.121 735.129 289.005 2.07035 1.4182 8.80995 +1 486 732.386 697.336 282.934 1.88233 1.68698 11.0576 +2 486 743.835 705.467 293.342 1.87987 1.68684 10.1016 +3 486 758.118 715.439 302.367 1.86975 1.63004 9.08121 +1 487 763.391 720.389 307.654 1.92156 1.68383 9.01297 +2 487 781.565 733.123 323.485 1.90729 1.67027 8.00076 +3 487 805.402 750.122 340.307 1.903 1.62714 7.0112 +1 488 823.527 768.191 308.848 2.07699 1.32009 7.00396 +2 488 857.331 792.801 329.47 2.06246 1.30367 6.0061 +3 488 904.079 827.318 354.042 2.06095 1.26789 5.04907 +1 492 826.313 770.574 319.292 2.08882 1.4112 6.95335 +2 492 860.264 795.613 341.055 2.08297 1.3975 5.99488 +1 493 809.863 756.939 279.357 2.03297 1.08095 7.3232 +2 493 839.559 778.515 294.995 2.02386 1.07477 6.3491 +3 493 880.283 808.335 312.462 2.02117 1.04229 5.38686 +4 493 938.537 850.934 337.143 2.01718 1.00736 4.42423 +1 494 742.197 706.391 280.364 1.98976 1.61281 10.8241 +2 494 754.669 715.839 289.956 2.0074 1.61995 9.98153 +3 494 771.974 728.172 298.808 1.99169 1.54457 8.84818 +4 494 791.375 744.547 307.541 2.08556 1.54496 8.2766 +1 495 759.986 719.86 287.221 2.01369 1.53097 9.65888 +2 495 774.963 731.453 298.07 2.04197 1.54584 8.90764 +1 496 837.499 781.55 265.122 2.1884 0.885843 6.92733 +2 496 873.77 808.434 279.271 2.17215 0.874881 5.93196 +1 498 914.864 854.941 305.794 2.73679 1.19169 6.46796 +2 498 967.992 897.175 328.029 2.71873 1.17701 5.47289 +1 501 837.177 780.387 273.327 2.15292 0.950318 6.82465 +2 501 874.003 807.727 289.103 2.14325 0.94217 5.84787 +1 502 931.895 872.647 276.328 2.92236 0.938121 6.54161 +2 502 986.831 917.346 293.085 2.91649 0.929447 5.57783 +1 509 846.36 789.952 264.856 2.25497 0.876105 6.87095 +2 509 884.421 818.551 279.337 2.24141 0.86833 5.8839 +3 509 938.303 859.458 295.827 2.23965 0.837786 4.91566 +1 510 858.053 800.764 268.743 2.32991 0.899066 6.76524 +2 510 898.951 831.732 284.076 2.31256 0.888784 5.76589 +3 510 956.533 876.112 301.865 2.31751 0.861693 4.8193 +1 511 962.419 902.44 309.239 3.16011 1.22143 6.46188 +2 511 1023.6 952.881 331.871 3.14496 1.20787 5.48067 +1 513 965.564 907.144 281.252 3.27333 0.996675 6.63427 +2 513 1025.47 957.304 298.674 3.27731 0.991434 5.68557 +3 513 1108.51 1026.8 320.106 3.27989 0.967973 4.74308 +1 514 876.357 819.829 283.773 2.53519 1.05398 6.85627 +2 514 920.262 852.613 301.399 2.46708 1.02069 5.72925 +1 518 988.984 930.435 280.229 3.48094 0.985089 6.61957 +2 518 1052.12 983.753 296.977 3.47697 0.97516 5.6687 +3 518 1140.76 1059.53 317.381 3.51257 0.95569 4.7712 +1 525 978.788 920.953 263.944 3.42925 0.846003 6.70135 +2 525 1039.6 972.177 277.002 3.42606 0.829724 5.74836 +1 527 996.271 939.064 320.413 3.63111 1.38554 6.77503 +2 527 1059.82 993.085 344.44 3.62392 1.381 5.80723 +1 532 1000.42 944.463 270.368 3.75215 0.936118 6.92661 +2 532 1064.46 998.474 285.329 3.70313 0.915609 5.87372 +3 532 1155.65 1075.58 303.864 3.66384 0.878984 4.84099 +1 533 987.143 929.75 270.161 3.53388 0.910719 6.75301 +2 533 1048.79 981.895 286.378 3.52684 0.911549 5.79363 +1 534 988.933 929.916 308.319 3.45291 1.23295 6.56715 +2 534 1052.04 983.524 331.223 3.46894 1.24157 5.65667 +2 557 853.073 845.388 40.7428 17.0212 -9.23434 50.4342 +3 557 857.109 849.004 35.3553 16.4058 -9.1124 47.8182 +4 557 861.475 853.331 28.6391 16.6156 -9.51194 47.5903 +5 557 866.399 858.393 25.5112 17.2302 -9.88456 48.4047 +6 557 871.264 863.019 24.6064 17.0506 -9.65864 47.0097 +7 557 876.727 868.196 23.716 16.8216 -9.39013 45.43 +2 560 201.363 175.335 161.388 -8.42435 -0.236643 14.8911 +3 560 173.382 148.648 160.342 -9.47263 -0.271733 15.6699 +4 560 145.681 117.274 156.715 -8.77173 -0.305177 13.644 +2 562 293.429 256.308 232.221 -4.57452 0.859058 10.4409 +3 562 261.858 221.022 235.582 -4.57354 0.825109 9.49087 +4 562 224.079 178.421 239.628 -4.53506 0.78558 8.48868 +2 563 297.584 263.907 211.344 -4.97604 0.613916 11.5086 +3 563 269.501 232.823 211.173 -4.98012 0.561179 10.5668 +2 566 893.452 875.89 131.337 8.68313 -1.26985 22.0689 +3 566 906.713 888.303 126.217 8.66994 -1.36069 21.052 +4 566 921.874 902.317 119.093 8.57805 -1.47661 19.8178 +5 566 938.639 918.144 115.369 8.62473 -1.5066 18.9105 +6 566 956.889 935.125 113.714 8.57237 -1.45962 17.8081 +7 566 976.911 954.009 112.723 8.61617 -1.41035 16.9235 +8 566 999.513 975.237 110.048 8.6286 -1.38972 15.9657 +9 566 1025.19 999.509 104.801 8.6928 -1.42331 15.0907 +10 566 1053.98 1026.68 98.3738 8.74192 -1.46504 14.1928 +11 566 1086.59 1057.6 91.908 8.83746 -1.49959 13.3671 +12 566 1124.19 1092.4 84.4277 8.69407 -1.49385 12.1894 +2 570 445.209 401.894 317.991 -2.0381 1.79985 8.94777 +3 570 426.761 376.16 332.678 -1.94046 1.69659 7.65935 +2 577 276.951 257.663 35.0199 -9.26244 -3.8384 20.0933 +3 577 260.036 239.234 25.8438 -9.02546 -3.79612 18.6317 +2 578 184.424 158.869 65.6354 -8.93616 -2.25369 15.1664 +3 578 154.929 128.715 55.8539 -9.31594 -2.39748 14.7852 +2 589 414.999 401.329 38.6684 -7.64509 -5.27273 28.3523 +3 589 408.193 394.207 31.2295 -7.73353 -5.43914 27.7109 +2 591 326.081 312.959 82.5963 -11.6048 -3.69489 29.5377 +3 591 316.211 302.332 76.7242 -11.3534 -3.72049 27.9255 +4 591 306.196 291.902 69.4215 -11.4002 -3.88691 27.1148 +2 595 413.166 399.779 119.131 -7.88002 -2.15558 28.9508 +3 595 405.803 392.737 114.96 -8.37632 -2.38 29.6621 +4 595 399.07 385.12 109.113 -8.10509 -2.45442 27.7835 +5 595 392.359 377.71 107.956 -7.96393 -2.37958 26.4562 +6 595 385.94 369.396 107.917 -7.2607 -2.10844 23.4276 +2 597 348.214 334.007 40.6692 -9.88118 -4.99776 27.2805 +3 597 338.569 324.256 34.1953 -10.1698 -5.20364 27.0782 +2 600 381.732 367.766 109.08 -8.76268 -2.45289 27.7518 +3 600 373.224 360.325 104.48 -9.84175 -2.84731 30.0471 +4 600 365.416 352.331 98.2845 -10.0224 -3.06117 29.62 +2 601 381.732 367.766 109.08 -8.76268 -2.45289 27.7518 +3 601 373.224 360.325 104.48 -9.84175 -2.84731 30.0471 +4 601 365.416 352.331 98.2845 -10.0224 -3.06117 29.62 +2 610 412.68 399.123 98.6219 -7.80095 -2.94129 28.5895 +3 610 405.039 391.339 93.7471 -8.0189 -3.10165 28.2903 +2 614 540.23 527.944 54.5704 -3.03121 -5.17157 31.5469 +3 614 537.724 524.725 47.944 -2.96827 -5.16136 29.8144 +2 617 489.205 476.099 89.3296 -4.93269 -3.42323 29.5721 +3 617 485.142 471.521 83.7163 -4.9064 -3.51515 28.4539 +2 619 543.89 531.016 94.0029 -2.74 -3.28998 30.1054 +3 619 541.544 528.4 88.1693 -2.77954 -3.46075 29.4866 +2 620 418.691 404.85 102.766 -7.40726 -2.72001 28.0017 +3 620 411.587 398.106 97.7433 -7.88822 -2.9928 28.7498 +2 621 513.819 501.12 107.994 -4.04941 -2.74331 30.5182 +3 621 510.753 497.045 102.818 -3.87168 -2.74431 28.2731 +2 622 468.92 455.647 109.274 -5.69158 -2.57305 29.2003 +3 622 464.191 450.399 104.418 -5.66159 -2.66535 28.1015 +4 622 459.384 445.33 98.053 -5.73948 -2.85879 27.5762 +5 622 454.748 440.398 95.9516 -5.79493 -2.87862 27.0087 +6 622 450.401 436.079 95.905 -5.96905 -2.88589 27.0605 +2 623 449.085 435.923 123.968 -6.54934 -1.99517 29.4477 +3 623 443.481 429.69 119.514 -6.46898 -2.07766 28.1048 +4 623 438.012 423.774 113.759 -6.47169 -2.22937 27.2203 +5 623 432.558 418.006 112.176 -6.53335 -2.23972 26.6329 +6 623 426.998 411.543 112.751 -6.34467 -2.0888 25.0761 +7 623 420.708 404.467 113.307 -6.24593 -1.9694 23.8636 +8 623 413.912 397.312 111.393 -6.33056 -1.98869 23.3468 +2 627 549.52 536.564 77.1756 -2.48916 -3.96671 29.9141 +3 627 547.177 533.98 71.0587 -2.53918 -4.14343 29.3691 +4 627 545.017 531.313 63.2481 -2.52967 -4.29592 28.2801 +5 627 543.347 528.952 59.5195 -2.47066 -4.22901 26.9237 +6 627 541.362 526.314 58.0262 -2.43438 -4.09891 25.7561 +7 627 539.511 523.864 56.1633 -2.40474 -4.00593 24.77 +8 627 537.665 521.454 52.1534 -2.38209 -3.99923 23.907 +9 627 535.742 518.904 45.9403 -2.35481 -4.04863 23.0175 +10 627 533.148 515.772 38.2928 -2.36207 -4.15964 22.3046 +2 630 433.119 419.682 97.7795 -7.05355 -3.00125 28.8448 +3 630 426.918 413.274 92.3757 -7.19082 -3.16852 28.4078 +4 630 420.823 405.841 85.7855 -6.76689 -3.12173 25.8698 +5 630 414.37 399.391 83.1189 -6.99978 -3.21803 25.8754 +2 631 433.119 419.682 97.7795 -7.05355 -3.00125 28.8448 +3 631 426.918 413.274 92.3757 -7.19082 -3.16852 28.4078 +4 631 420.823 405.841 85.7855 -6.76689 -3.12173 25.8698 +5 631 414.37 399.391 83.1189 -6.99978 -3.21803 25.8754 +2 632 459.855 446.381 100.785 -5.96806 -2.87309 28.7646 +3 632 454.281 440.683 95.476 -6.13378 -3.05657 28.5021 +4 632 449.548 434.715 88.5968 -5.79431 -3.05112 26.1283 +5 632 444.181 429.185 86.3221 -5.92381 -3.09955 25.8453 +2 633 509.746 496.623 67.0067 -4.08527 -4.33225 29.532 +3 633 506.206 492.601 60.4153 -4.08072 -4.43944 28.4886 +4 633 502.693 488.657 52.5717 -4.08986 -4.6033 27.6138 +5 633 499.561 485.351 49.0013 -4.15781 -4.6815 27.2734 +6 633 496.376 481.238 46.851 -4.01617 -4.47105 25.6028 +2 636 547.677 534.804 86.0468 -2.58225 -3.62231 30.1084 +3 636 545.065 532.193 80.2105 -2.69134 -3.86603 30.1099 +2 638 524.435 513.736 121.373 -4.27386 -2.58469 36.2262 +3 638 521.934 510.719 117.308 -4.19698 -2.66046 34.5594 +2 639 499.493 486.588 105.175 -4.58116 -2.81695 30.0318 +3 639 495.843 482.128 99.9568 -4.45374 -2.85504 28.2592 +2 641 533.076 520.355 87.8891 -3.22957 -3.58772 30.4676 +3 641 530.458 517.095 82.3061 -3.17958 -3.6397 29.0032 +2 642 492.483 479.306 73.1739 -4.77253 -4.06339 29.413 +3 642 488.345 475.242 67.1691 -4.96897 -4.33237 29.5782 +4 642 484.344 470.38 59.5055 -4.81669 -4.36021 27.7556 +5 642 480.578 466.297 56.2752 -4.85112 -4.38467 27.1379 +6 642 476.732 462.422 54.8662 -4.98591 -4.42888 27.0842 +7 642 472.991 457.777 53.6322 -4.82162 -4.2092 25.4744 +8 642 469.476 453.417 50.1251 -4.68556 -4.10508 24.1342 +9 642 465.42 448.75 44.4298 -4.64457 -4.13817 23.2499 +10 642 459.408 440.079 36.6007 -4.17274 -3.78652 20.0517 +2 643 588.959 575.923 34.9086 -0.848802 -5.68385 29.7299 +3 643 588.152 575.029 27.7365 -0.87627 -5.94012 29.5348 +4 643 588.415 574.54 19.4264 -0.818598 -5.93989 27.934 +2 648 658.897 647.085 85.9733 2.24356 -3.95075 32.8107 +3 648 660.457 648.002 80.2344 2.19515 -3.99459 31.1192 +4 648 662.435 649.622 72.9155 2.2167 -4.18972 30.249 +5 648 664.5 651.613 69.2991 2.2901 -4.31651 30.0761 +6 648 666.512 653.477 67.7207 2.34694 -4.33238 29.7334 +7 648 668.924 655.428 66.3572 2.36268 -4.23849 28.7166 +2 649 611.561 599.385 101.845 0.088307 -3.13246 31.8298 +3 649 610.385 599.381 95.9327 0.0403276 -3.7546 35.219 +2 650 659.332 647.379 118.527 2.23661 -2.44124 32.423 +3 650 660.767 648.4 113.81 2.22421 -2.56458 31.3399 +2 656 781.246 769.121 67.4527 7.60553 -4.66916 31.9633 +3 656 786.571 774.015 60.9102 7.57279 -4.78911 30.8683 +2 657 772.785 760.858 69.2424 7.35098 -4.66621 32.4949 +3 657 777.78 765.388 63.4073 7.29173 -4.7441 31.276 +2 669 852.066 842.2 72.964 13.2031 -5.43846 39.2837 +3 669 858.362 848.268 66.8993 13.2396 -5.6382 38.3954 +2 674 1097.55 1045.33 40.1344 5.01974 -1.36524 7.4222 +3 674 1170.31 1110.47 16.0142 5.03386 -1.40795 6.47725 +2 677 1097.14 1047.69 112.492 5.29668 -0.655724 7.83817 +3 677 1166.51 1109.2 99.2657 5.22018 -0.689732 6.76286 +2 697 120.23 75.0816 225.546 -5.82177 0.626903 8.58446 +3 697 57.463 7.26515 229.922 -5.9078 0.61067 7.72094 +2 711 215.121 168.221 232.783 -4.5176 0.686387 8.26396 +3 711 163.985 111.682 237.982 -4.57603 0.668865 7.41016 +4 711 98.7715 38.863 244.469 -4.57981 0.642114 6.46943 +2 712 245.762 202.547 233.438 -4.52189 0.753048 8.9685 +3 712 202.525 154.757 237.775 -4.57706 0.730029 8.11364 +4 712 148.866 93.7082 243.031 -4.48639 0.683407 7.02659 +2 738 549.296 543.925 135.768 -6.02671 -3.70888 72.1585 +3 738 548.39 542.982 132.309 -6.07585 -4.02726 71.669 +4 738 547.847 542.206 127.507 -5.87707 -4.31849 68.7142 +5 738 547.694 542.129 127.104 -5.97144 -4.41591 69.645 +6 738 547.571 541.669 128.585 -5.64146 -4.02889 65.6665 +7 738 547.165 541.417 130.23 -5.83049 -3.98302 67.425 +8 738 546.995 541 130.05 -5.60597 -3.83531 64.6516 +9 738 546.839 540.879 127.838 -5.65281 -4.05716 65.0297 +2 739 455.646 442.42 128.903 -6.25055 -1.7849 29.3023 +3 739 450.39 436.72 124.68 -6.25433 -1.89292 28.3518 +4 739 445.096 430.981 119.054 -6.2587 -2.04738 27.4583 +5 739 440.187 425.604 117.828 -6.23863 -2.02681 26.577 +6 739 434.623 419.484 118.443 -6.20716 -1.93062 25.6019 +2 740 459.603 446.679 137.403 -6.23285 -1.47351 29.9903 +3 740 454.654 441.448 133.398 -6.30043 -1.60478 29.347 +2 741 459.603 446.679 137.403 -6.23285 -1.47351 29.9903 +3 741 454.654 441.448 133.398 -6.30043 -1.60478 29.347 +4 741 449.841 435.902 128.064 -6.15475 -1.72599 27.8046 +5 741 445.061 430.787 127.248 -6.1904 -1.71622 27.1528 +2 745 567.571 564.461 171.803 -7.25179 -0.181515 124.618 +3 745 567.271 564.086 169.124 -7.13128 -0.629027 121.676 +4 745 567.334 564.082 164.978 -6.97645 -1.30124 119.211 +5 745 567.949 564.587 165.171 -6.64975 -1.22778 115.308 +6 745 568.372 564.886 167.122 -6.34678 -0.883316 111.185 +7 745 568.525 565.172 169.608 -6.57437 -0.519998 115.602 +2 746 610.018 604.999 180.363 0.0491049 0.803582 77.2208 +3 746 610.026 604.926 177.531 0.0491093 0.492557 75.9944 +2 749 678.375 666.394 152.668 3.08513 -0.904954 32.3477 +3 749 680.106 667.88 149.015 3.09967 -1.04744 31.703 +4 749 682.483 669.848 143.687 3.10015 -1.23996 30.6743 +5 749 685.378 672.663 141.959 3.20302 -1.30516 30.4817 +6 749 688.216 674.933 141.759 3.18078 -1.25745 29.1783 +2 751 656.495 642.32 215.489 1.77866 1.61571 27.3434 +3 751 658.555 644.374 213.719 1.85589 1.54792 27.3308 +2 752 557.587 537.695 238.293 -1.40341 1.76706 19.4839 +3 752 554.424 534.317 239.285 -1.47296 1.77473 19.276 +4 752 552.718 531.836 238.377 -1.46217 1.6855 18.5606 +2 757 801.227 751.989 231.713 2.09095 0.642105 7.87143 +3 757 829.397 775.704 236.347 2.19926 0.635186 7.21828 +2 762 711.096 692.739 195.144 2.97115 0.652242 21.1135 +3 762 711.511 697.525 191.974 3.91557 0.734335 27.7113 +4 762 712.395 704.669 188.143 7.14949 1.06298 50.1637 +5 762 715.713 710.331 188.524 10.5951 1.56405 72.0161 +2 765 928.983 880.21 222.143 3.51789 0.542831 7.94648 +3 765 974.324 917.451 225.997 3.44514 0.501926 6.81479 +2 769 903.53 885.506 137.066 8.76103 -1.06658 21.5035 +3 769 917.841 898.746 131.823 8.67187 -1.1542 20.2966 +4 769 934.025 913.833 124.528 8.63168 -1.28562 19.1949 +5 769 952.037 930.773 120.798 8.65104 -1.31495 18.2261 +6 769 971.655 949.164 119.056 8.64799 -1.28487 17.2326 +7 769 993.462 969.653 118.198 8.66116 -1.23308 16.2785 +8 769 1017.98 992.572 115.153 8.63322 -1.21967 15.2517 +9 769 1045.98 1019.21 110.001 8.7584 -1.26138 14.4804 +2 771 880.082 861.388 158.478 7.77351 -0.413107 20.7335 +3 771 891.831 874.219 154.611 8.60919 -0.556418 22.0067 +2 772 965.528 947.473 176.201 10.59 0.0995581 21.4657 +3 772 982.844 963.797 172.858 10.5273 0.000115867 20.3486 +2 773 927.285 874.597 207.56 3.23914 0.353816 7.35591 +3 773 974.559 913.839 208.891 3.22889 0.318794 6.38292 +4 773 1038.05 968.067 210.248 3.28881 0.287008 5.53802 +5 773 1127.83 1043.38 216.7 3.29676 0.27891 4.58979 +2 774 949.824 935.35 155.428 12.6272 -0.646688 26.7762 +3 774 966.027 947.254 150.703 10.1995 -0.633796 20.6452 +4 774 984.732 964.551 144.268 9.98584 -0.760858 19.2049 +2 775 888.144 870.955 155.939 8.70537 -0.528553 22.547 +3 775 901.2 882.864 152.01 8.54364 -0.61063 21.1375 +2 776 888.144 870.955 155.939 8.70537 -0.528553 22.547 +3 776 901.2 882.864 152.01 8.54364 -0.61063 21.1375 +2 777 972.39 954.481 170.607 10.8829 -0.0673897 21.6422 +3 777 989.557 970.846 166.796 10.9086 -0.173904 20.7132 +2 786 998.94 942.951 238.717 3.7357 0.631889 6.9224 +3 786 1061.3 996.57 244.331 3.74883 0.593165 5.98781 +2 788 982.895 925.98 237.504 3.52342 0.610146 6.80963 +3 788 1043.88 977.275 244.352 3.50261 0.576599 5.81888 +4 788 1129.17 1049.92 253.511 3.5219 0.54669 4.89054 +2 819 259.035 216.895 262.189 -4.46803 1.13873 9.19725 +3 819 218.638 172.339 269.71 -4.53545 1.12372 8.37124 +2 825 222.648 176.292 323.001 -4.48334 1.73983 8.36082 +3 825 173.564 120.758 340.036 -4.43506 1.70062 7.33968 +2 836 294.264 258 255.512 -4.67027 1.22435 10.6877 +3 836 263.599 220.853 260.58 -4.34738 1.10238 9.06693 +2 837 338.247 296.021 311.438 -3.45134 1.76292 9.17862 +3 837 307.99 259.383 323.935 -3.33262 1.66958 7.97365 +4 837 268.877 214.728 339.179 -3.37951 1.64991 7.15753 +2 849 562.287 527.651 283.497 -0.733126 1.71591 11.19 +3 849 558.142 520.437 290.01 -0.732494 1.66902 10.2791 +2 850 569.067 533.169 288.956 -0.605885 1.73725 10.7965 +3 850 565.873 526.247 297.307 -0.592188 1.68702 9.78074 +4 850 561.837 518.492 306.186 -0.591398 1.65233 8.94167 +5 850 558.022 509.486 321.721 -0.570365 1.64752 7.98527 +2 852 568.287 542.409 255.051 -0.856682 1.70615 14.9768 +3 852 565.698 538.202 257.917 -0.85688 1.6618 14.096 +2 856 601.725 555.517 318.299 -0.091076 1.69077 8.38774 +3 856 600.609 549.155 333.365 -0.0934329 1.67564 7.53246 +4 856 600.922 541.632 351.917 -0.0782462 1.62224 6.53685 +2 859 593.355 550.797 308.012 -0.204515 1.70589 9.10682 +3 859 591.318 544.534 321.476 -0.209437 1.7064 8.2843 +2 861 706.918 678.631 263.691 1.84878 1.72494 13.7015 +3 861 714.774 683.844 267.265 1.82725 1.63962 12.5309 +2 869 873.77 808.434 279.271 2.17215 0.874881 5.93196 +3 869 924.215 846.466 295.506 2.17388 0.847372 4.98492 +4 869 999.007 902.584 319.262 2.16952 0.8156 4.0195 +2 870 873.77 808.434 279.271 2.17215 0.874881 5.93196 +3 870 924.215 846.466 295.506 2.17388 0.847372 4.98492 +4 870 999.007 902.584 319.262 2.16952 0.8156 4.0195 +2 873 920.075 851.828 287.073 2.44396 0.898976 5.67897 +3 873 983.192 901.033 305.745 2.44278 0.868833 4.71737 +2 874 950.711 889.643 298.077 3.00075 1.10146 6.3466 +3 874 1012.37 939.095 319.366 2.95298 1.07408 5.28962 +2 877 885.799 819.035 292.56 2.22248 0.963087 5.80511 +3 877 940.354 860.76 311.748 2.23243 0.937355 4.86944 +4 877 1021.58 922.113 340.781 2.22512 0.906899 3.89671 +2 879 938.986 867.633 323.096 2.47994 1.13102 5.43177 +3 879 1010.09 923.177 348.951 2.47535 1.0883 4.4592 +2 883 1012.25 940.889 326.173 3.03126 1.15412 5.43142 +3 883 1096.97 1011.11 353.831 3.04934 1.13224 4.51412 +2 890 995.6 925.071 318.595 2.94008 1.10996 5.49523 +3 890 1075.91 990.741 344.84 2.94132 1.08474 4.55084 +3 899 445.478 431.317 60.1668 -6.22417 -4.27461 27.3704 +4 899 439.667 424.754 52.3866 -6.11948 -4.33921 25.9896 +3 920 797.764 747.801 292.132 2.02338 1.28235 7.75722 +4 920 824.706 767.696 303.568 2.02712 1.23159 6.79834 +5 920 861.037 794.546 323.696 2.03157 1.21858 5.82895 +3 938 184.488 159.608 61.5349 -9.17722 -2.40336 15.5779 +4 938 156.275 129.879 52.3439 -9.22397 -2.45229 14.6827 +3 941 381.341 366.953 37.9663 -8.52041 -5.03595 26.9382 +4 941 373.204 357.631 29.2037 -8.15252 -4.95488 24.8877 +5 941 364.706 348.493 24.6857 -8.11228 -4.90899 23.9054 +3 943 397.687 384.241 121.804 -8.46393 -2.03935 28.8242 +4 943 390.908 376.878 116.264 -8.37156 -2.16668 27.6257 +5 943 384.021 369.871 115.314 -8.56161 -2.18428 27.3902 +6 943 376.838 361.953 116.312 -8.39805 -2.04039 26.0376 +7 943 369.082 354.103 117.014 -8.62367 -2.00245 25.8748 +8 943 360.868 343.886 115.24 -7.86623 -1.82235 22.8226 +9 943 352.075 334.221 111.444 -7.74648 -1.84753 21.7076 +10 943 341.228 324.177 107.235 -8.45318 -2.06719 22.7304 +11 943 331.071 312.899 103.5 -8.23178 -2.05003 21.3278 +12 943 318.121 301.914 100.718 -9.65973 -2.39096 23.9154 +13 943 307.212 285.567 96.9564 -7.50325 -1.88352 17.9061 +3 947 334.727 320.95 51.6793 -10.7148 -4.72422 28.1305 +4 947 325.356 310.394 43.4164 -10.2034 -4.64705 25.9045 +5 947 315.69 300.219 39.72 -10.2028 -4.62225 25.0509 +6 947 305.227 289.406 37.9446 -10.332 -4.58014 24.496 +3 949 364.218 350.891 83.1032 -9.88794 -3.61722 29.08 +4 949 355.653 341.842 76.0564 -9.87563 -3.76492 28.064 +3 950 375.122 361.315 113.609 -9.1209 -2.30497 28.0718 +4 950 367.023 353.042 107.869 -9.31787 -2.49663 27.7204 +5 950 359.332 345.122 106.501 -9.45897 -2.50823 27.2752 +6 950 351.319 336.146 107.109 -9.14225 -2.32751 25.5439 +7 950 342.471 327.113 107.264 -9.34136 -2.294 25.2356 +3 951 311.621 296.465 37.9967 -10.5598 -4.77971 25.5733 +4 951 301.167 286.633 29.5782 -11.3977 -5.29526 26.667 +3 954 414.474 400.893 108.175 -7.71589 -2.55813 28.5378 +4 954 407.945 393.716 102.064 -7.61105 -2.67236 27.2385 +5 954 401.677 387.24 100.424 -7.73465 -2.69491 26.8461 +3 955 346.373 332.188 56.3857 -9.9661 -4.41032 27.3225 +4 955 336.943 322.715 48.7021 -10.2918 -4.68698 27.2395 +5 955 327.685 313.47 45.5398 -10.6516 -4.81099 27.2657 +6 955 318.593 303.398 43.8276 -10.286 -4.56123 25.5072 +7 955 308.955 292.299 41.2054 -9.69433 -4.2456 23.2692 +3 957 342.847 332.282 110.607 -13.5596 -3.16465 36.6829 +4 957 335.941 324.871 103.712 -13.2766 -3.35492 35.0107 +5 957 329.299 316.874 103.238 -12.1152 -3.0094 31.1911 +3 958 548.237 534.762 20.8996 -2.44459 -6.05755 28.7636 +4 958 546.071 532.415 11.3436 -2.49739 -6.35317 28.3824 +5 958 544.663 529.911 6.24662 -2.36306 -6.06666 26.2733 +3 959 449.512 435.291 27.9061 -6.04531 -5.47496 27.2539 +4 959 443.932 429.844 18.7764 -6.31509 -5.87473 27.5111 +3 963 436.37 422.283 59.5516 -6.60395 -4.32038 27.5133 +4 963 430.262 415.466 51.5451 -6.50894 -4.40383 26.1937 +5 963 424.241 409.173 47.8614 -6.60655 -4.45595 25.7226 +3 964 436.37 422.283 59.5516 -6.60395 -4.32038 27.5133 +4 964 430.262 415.466 51.5451 -6.50894 -4.40383 26.1937 +5 964 424.241 409.173 47.8614 -6.60655 -4.45595 25.7226 +6 964 418.142 402.058 45.8219 -6.39281 -4.24251 24.0973 +7 964 411.222 394.64 43.722 -6.42452 -4.18284 23.372 +8 964 403.904 386.581 38.7822 -6.37703 -4.15735 22.3737 +9 964 395.926 377.967 31.5157 -6.38985 -4.22748 21.5815 +10 964 387.016 368.327 23.052 -6.39649 -4.3057 20.7389 +11 964 377.577 357.702 15.1993 -6.2698 -4.26094 19.501 +3 973 468.123 454.933 95.8098 -5.76021 -3.13774 29.3857 +4 973 463.838 449.735 88.7635 -5.54997 -3.2027 27.4807 +3 975 468.123 454.933 95.8098 -5.76021 -3.13774 29.3857 +4 975 463.838 449.735 88.7635 -5.54997 -3.2027 27.4807 +3 979 513.853 499.988 23.8379 -3.70804 -5.77344 27.9551 +4 979 510.436 496.242 14.2882 -3.75108 -6.00053 27.3048 +3 980 506.206 492.601 60.4153 -4.08072 -4.43944 28.4886 +4 980 502.693 488.657 52.5717 -4.08986 -4.6033 27.6138 +3 981 422.68 408.458 70.1035 -7.05831 -3.88082 27.252 +4 981 416.15 401.223 62.6082 -6.95962 -3.96708 25.9638 +3 983 505.368 492.961 72.8901 -4.51101 -4.32798 31.2393 +4 983 502.421 489.218 65.3477 -4.35909 -4.37405 29.3568 +5 983 499.299 486.041 62.1634 -4.46735 -4.48477 29.234 +6 983 496.322 482.609 60.7704 -4.4356 -4.39041 28.2633 +7 983 493.018 478.687 59.4166 -4.36819 -4.25184 27.0445 +8 983 489.756 474.203 55.4086 -4.13782 -4.05637 24.9207 +9 983 486.035 469.596 49.1526 -4.03614 -4.04193 23.5762 +3 986 466.881 452.561 62.8512 -5.35194 -4.12628 27.0654 +4 986 461.639 447.123 54.8235 -5.47354 -4.36752 26.6993 +5 986 456.744 441.822 51.0415 -5.50071 -4.38475 25.9724 +6 986 451.966 436.213 49.2805 -5.37352 -4.21353 24.6026 +3 989 662.089 649.392 70.0208 2.2223 -4.35038 30.5248 +4 989 663.844 650.793 62.1679 2.23427 -4.55565 29.6973 +5 989 666.305 652.757 58.226 2.24985 -4.54477 28.6076 +3 992 584.023 575.209 113.681 -1.55643 -3.60653 43.9767 +4 992 583.74 575.345 107.892 -1.65219 -4.15692 46.1709 +3 995 686.399 676.13 27.7165 4.01956 -7.59232 37.7445 +4 995 688.007 677.484 19.1442 4.0046 -7.84658 36.8331 +3 996 643.775 631.715 118.594 1.52398 -2.41675 32.1375 +4 996 645.522 632.609 112.464 1.49603 -2.51223 30.0161 +5 996 647.54 634.021 110.724 1.50905 -2.46853 28.6679 +3 998 752.259 723.561 36.8507 2.67094 -2.5456 13.5052 +4 998 763.276 732.417 21.7422 2.67571 -2.63037 12.5596 +5 998 776.253 742.443 9.02526 2.64834 -2.60282 11.4634 +3 999 745.194 715.49 55.0278 2.45272 -2.13068 13.0477 +4 999 755.974 725.128 40.7615 2.54964 -2.30024 12.5647 +3 1007 699.07 687.434 43.8215 4.13208 -5.95654 33.3084 +4 1007 702.321 689.839 35.1557 3.99204 -5.92591 31.0517 +3 1010 747.867 719.289 32.1223 2.59957 -2.64513 13.5617 +4 1010 758.636 727.771 16.7944 2.59446 -2.71599 12.5573 +3 1012 714.013 701.819 113.976 4.60104 -2.59349 31.7827 +4 1012 717.412 705.671 107.405 4.93428 -2.99431 33.0104 +5 1012 721.185 709.425 105.216 5.09858 -3.0894 32.9568 +6 1012 725.213 712.747 105.003 4.98345 -2.92364 31.0905 +7 1012 729.864 716.532 105.592 4.84725 -2.7101 29.0719 +3 1017 949.158 929.626 112.754 9.33933 -1.65282 19.8431 +4 1017 967.501 946.61 104.64 9.20359 -1.75396 18.5526 +5 1017 987.965 966.129 99.6801 9.30872 -1.80007 17.7497 +6 1017 1010.06 986.923 96.9815 9.29888 -1.76163 16.7529 +3 1021 848.201 841.99 35.2174 20.6394 -11.9038 62.4038 +4 1021 852.488 846.074 27.9442 20.3448 -12.1359 60.4275 +5 1021 856.942 850.582 24.8217 20.8908 -12.5009 60.9319 +6 1021 861.246 854.578 23.8695 20.2751 -12.0017 58.1248 +3 1022 848.201 841.99 35.2174 20.6394 -11.9038 62.4038 +4 1022 852.488 846.074 27.9442 20.3448 -12.1359 60.4275 +3 1062 134.947 86.5898 222.667 -5.27197 0.553323 8.01481 +4 1062 70.6845 15.0658 226.94 -5.20431 0.522345 6.96842 +3 1071 265.903 252.246 161.042 -13.5167 -0.464597 28.3795 +4 1071 254.332 240.708 157.412 -14.0063 -0.608844 28.4495 +5 1071 242.989 228.919 158.415 -13.9952 -0.551273 27.5474 +3 1072 182.405 132.976 230.072 -4.64194 0.621797 7.84103 +4 1072 124.878 68.1168 235.204 -4.58674 0.590041 6.82821 +3 1077 176.819 151.281 184.028 -9.10202 0.235028 15.1764 +4 1077 148.365 121.241 181.416 -9.13347 0.169557 14.2893 +3 1078 225.687 180.301 232.976 -4.5432 0.711551 8.53953 +4 1078 178.251 127.429 237.938 -4.55867 0.687896 7.62621 +5 1078 119.148 61.934 249.406 -4.60421 0.718704 6.77413 +3 1080 317.013 306.984 127.253 -15.6685 -2.44234 38.6449 +4 1080 309.803 299.618 121.822 -15.8088 -2.69137 38.0532 +3 1081 413.033 399.157 128.947 -7.60813 -1.69975 27.9329 +4 1081 406.542 392.388 123.699 -7.70467 -1.86545 27.3829 +5 1081 400.624 385.96 122.794 -7.65365 -1.83379 26.4311 +3 1082 413.033 399.157 128.947 -7.60813 -1.69975 27.9329 +4 1082 406.542 392.388 123.699 -7.70467 -1.86545 27.3829 +5 1082 400.624 386.224 122.794 -7.79388 -1.86739 26.9154 +6 1082 393.486 378.395 123.306 -7.6909 -1.76361 25.6824 +3 1083 384.865 372.169 158.806 -9.50629 -0.594356 30.5266 +4 1083 378.566 365.088 154.424 -9.20601 -0.734514 28.7562 +5 1083 371.422 358.599 155.172 -9.97548 -0.740675 30.2249 +6 1083 364.915 350.51 156.882 -9.12252 -0.595565 26.9053 +7 1083 356.955 342.697 159.057 -9.5166 -0.519799 27.1831 +8 1083 348.448 332.926 159.007 -9.03627 -0.479191 24.9702 +9 1083 339.944 324.025 157.024 -9.09759 -0.534157 24.3467 +10 1083 329.671 314.275 154.062 -9.76512 -0.655647 25.174 +11 1083 320.052 303.269 152.276 -9.26596 -0.658622 23.0935 +3 1101 492.324 488.13 179.33 -15.0149 0.829406 92.411 +4 1101 491.408 487.083 175.423 -14.673 0.31909 89.6066 +5 1101 491.132 487.082 175.858 -15.7091 0.398474 95.7099 +6 1101 490.707 486.305 178.201 -14.5017 0.652361 88.0382 +7 1101 489.997 485.677 180.844 -14.8651 0.993452 89.7085 +3 1102 499.181 492.411 195.056 -8.75832 1.7617 57.2525 +4 1102 498.317 491.409 191.091 -8.64911 1.41797 56.0998 +5 1102 497.156 490.319 192.103 -8.83145 1.51237 56.6905 +3 1103 528.245 516.024 213.816 -3.5741 1.80043 31.7146 +4 1103 526.582 513.762 210.799 -3.47646 1.58976 30.2301 +5 1103 524.564 510.849 212.459 -3.32876 1.5511 28.2584 +6 1103 522.193 508.047 216.114 -3.31768 1.64275 27.3998 +7 1103 519.793 505.644 220.108 -3.40782 1.79393 27.392 +3 1105 496.149 486.608 162.613 -6.38432 -0.576502 40.6184 +4 1105 493.036 483.734 158.277 -6.729 -0.841803 41.6675 +5 1105 491.332 481.185 157.729 -6.25856 -0.800675 38.1958 +3 1110 682.87 677.512 154.334 7.34946 -1.8566 72.3344 +4 1110 684.533 678.989 149.337 7.2651 -2.2789 69.9187 +3 1111 615.692 609.584 161.866 0.539311 -0.966286 63.4507 +4 1111 616.322 610.113 157.237 0.585035 -1.35108 62.4228 +3 1115 646.931 637.023 184.872 2.02598 0.651513 39.1153 +4 1115 648.247 637.663 180.713 1.96338 0.398843 36.6173 +5 1115 650.093 639.671 180.829 2.08923 0.411081 37.1905 +6 1115 652.095 641.188 182.991 2.09481 0.499244 35.5343 +3 1117 683.813 671.84 129.977 3.33128 -1.92362 32.3706 +4 1117 684.83 673.708 124.37 3.63511 -2.3415 34.8458 +5 1117 689.174 676.183 122.329 3.2919 -2.08908 29.8339 +6 1117 691.624 679.256 122.767 3.56417 -2.17535 31.3372 +3 1119 560.345 555.261 183.443 -5.19987 1.11879 76.2362 +4 1119 560.161 555.01 179.427 -5.15096 0.685418 75.2381 +5 1119 560.494 555.278 179.708 -5.05252 0.705807 74.3005 +6 1119 560.579 555.196 181.982 -4.88681 0.910729 71.9892 +7 1119 560.589 554.957 184.694 -4.67047 1.12924 68.8162 +8 1119 560.471 554.819 185.295 -4.6647 1.18223 68.5658 +9 1119 560.534 554.986 184.117 -4.74657 1.09043 69.858 +10 1119 560.349 554.781 182.184 -4.74711 0.900043 69.6037 +3 1121 578.875 575.557 156.674 -4.96669 -2.61906 116.793 +4 1121 579.038 575.396 152.432 -4.50193 -3.01217 106.426 +5 1121 579.537 576.041 152.303 -4.61274 -3.15752 110.861 +3 1136 757.311 730.269 224.897 2.93486 1.03375 14.3322 +4 1136 768.794 741.31 223.852 3.11216 0.996742 14.1021 +5 1136 783.084 750.819 227.056 2.88886 0.902363 12.0123 +3 1142 951.843 931.935 130.115 9.23562 -1.1532 19.4688 +4 1142 970.447 949.351 122.638 9.18884 -1.27859 18.3716 +5 1142 991.158 969.135 118.582 9.3074 -1.32372 17.5987 +3 1148 868.844 855.402 143.788 10.3611 -1.16149 28.8328 +4 1148 878.222 864.408 137.688 10.4468 -1.36741 28.0566 +5 1148 888.997 874.72 135.445 10.5134 -1.40746 27.1467 +6 1148 900.161 885.128 135.336 10.3834 -1.34054 25.781 +3 1149 933.819 914.377 132.591 8.95898 -1.11244 19.9354 +4 1149 950.809 930.375 125.434 8.97035 -1.24651 18.9669 +5 1149 970.217 948.657 121.606 8.98551 -1.27682 17.9766 +6 1149 991.355 968.207 119.854 8.85938 -1.22985 16.7429 +7 1149 1014.99 990.332 118.819 8.83225 -1.17715 15.7186 +8 1149 1041.57 1015.51 115.886 8.90479 -1.17423 14.8725 +9 1149 1071.59 1044.46 110.88 9.14892 -1.22719 14.2876 +10 1149 1106.25 1076.84 104.181 9.07286 -1.25444 13.1801 +11 1149 1145.91 1114.19 97.6875 9.08347 -1.27301 12.2198 +3 1152 968.746 949.506 165.762 10.0278 -0.198007 20.1439 +4 1152 987.742 967.556 159.535 10.0635 -0.354428 19.2003 +3 1155 927.41 864.445 231.18 2.71158 0.497581 6.15543 +4 1155 986.515 911.209 236.911 2.68879 0.456913 5.14665 +3 1183 183.949 133.272 269.913 -4.51119 1.02876 7.64783 +4 1183 124.397 66.6161 280.922 -4.51022 1.00463 6.70764 +3 1184 183.949 133.272 269.913 -4.51119 1.02876 7.64783 +4 1184 124.397 66.6161 280.922 -4.51022 1.00463 6.70764 +3 1185 211.938 164.315 272.531 -4.48479 1.12426 8.13827 +4 1185 160.94 107.173 282.525 -4.4819 1.09566 7.20847 +5 1185 95.1345 33.5235 300.895 -4.48497 1.11631 6.29067 +3 1203 416.102 374.778 307.151 -2.51466 1.74566 9.37894 +4 1203 395.18 347.133 318.223 -2.39666 1.62516 8.06646 +3 1204 398.67 349.985 327.288 -2.3268 1.70391 7.96092 +4 1204 371.527 317.991 343.569 -2.38829 1.71287 7.23954 +3 1211 426.761 376.16 332.678 -1.94046 1.69659 7.65935 +4 1211 402.571 345.037 350.99 -1.93249 1.66311 6.73643 +3 1216 595.253 570.739 252.114 -0.313475 1.73674 15.8103 +4 1216 593.97 568.266 252.142 -0.325779 1.6569 15.0782 +5 1216 594.393 566.459 258.346 -0.291649 1.64396 13.8748 +6 1216 595.211 564.038 267.989 -0.24724 1.63929 12.4329 +7 1216 593.906 561.679 275.928 -0.260904 1.71801 12.0264 +3 1218 574.996 522.624 334.345 -0.354496 1.65631 7.40039 +4 1218 570.559 511.208 353.498 -0.352976 1.63492 6.53027 +3 1225 699.719 673.039 256.025 1.81519 1.6745 14.5268 +4 1225 706.662 678.174 257.216 1.83087 1.59064 13.6045 +5 1225 715.152 684.614 263.241 1.85728 1.58983 12.6912 +3 1227 727.899 693.655 279.055 1.85628 1.66587 11.3181 +4 1227 738.468 701.603 283.345 1.87831 1.60995 10.5134 +5 1227 752.314 712.618 293.744 1.9317 1.63584 9.76355 +6 1227 769.66 724.199 308.793 1.89172 1.60623 8.52556 +7 1227 788.753 738.407 327.071 1.91185 1.64536 7.69818 +3 1230 807.493 755.119 293.232 2.03003 1.23461 7.40018 +4 1230 836.405 777.064 305.514 2.05339 1.20083 6.5313 +5 1230 875.752 806.322 327.097 2.05941 1.19331 5.58222 +3 1235 860.228 795.502 255.48 2.08026 0.685703 5.98793 +4 1235 908.975 831.676 266.045 2.08064 0.647582 5.01395 +5 1235 974.737 884.69 287.811 2.17835 0.685741 4.3041 +4 1264 182.877 157.484 65.35 -9.02565 -2.27404 15.2628 +5 1264 155.892 129.263 60.1074 -9.151 -2.27423 14.5543 +6 1264 125.522 97.1212 55.5513 -9.15488 -2.21861 13.6468 +7 1264 91.1756 60.6842 49.693 -9.13207 -2.16966 12.7109 +8 1264 51.0493 18.3713 39.8911 -9.1806 -2.1856 11.8604 +4 1270 839.905 833.095 32.5549 18.1697 -11.0668 56.9151 +5 1270 844.218 837.435 29.6839 18.5839 -11.3384 57.1425 +6 1270 848.132 841.119 27.0998 18.2735 -11.164 55.2661 +4 1289 385.877 349.211 286.86 -3.2769 1.67017 10.5704 +5 1289 365.454 325.234 299.016 -3.26007 1.68492 9.63626 +4 1294 713.601 682.341 262.787 1.78781 1.54538 12.3987 +5 1294 723.575 689.808 269.942 1.81373 1.54445 11.478 +6 1294 734.804 697.78 280.251 1.81705 1.55812 10.4681 +7 1294 747.957 707.57 293.089 1.84071 1.59913 9.59651 +8 1294 763.701 718.865 306.225 1.84665 1.59781 8.64417 +9 1294 783.127 733.222 320.538 1.86819 1.5896 7.76626 +10 1294 807.536 750.452 338.359 1.86292 1.55737 6.7895 +4 1312 259.97 246.586 114.883 -14.0309 -2.32667 28.9592 +5 1312 249.448 236.31 113.971 -14.7227 -2.40738 29.4992 +4 1322 341.525 327.014 58.9578 -9.92209 -4.2162 26.7098 +5 1322 333.288 318.204 56.2269 -9.83859 -4.15333 25.6954 +4 1329 337.085 322.981 73.7054 -10.3773 -3.77612 27.4801 +5 1329 328.16 313.786 71.0786 -10.5157 -3.80327 26.9633 +6 1329 318.82 303.547 70.0138 -10.2256 -3.61698 25.3771 +7 1329 308.733 293.086 68.9814 -10.3274 -3.56595 24.7704 +4 1331 359.297 346.219 105.078 -10.2792 -2.78382 29.6363 +5 1331 351.789 338.495 103.44 -10.4151 -2.80463 29.1534 +6 1331 344.145 329.18 102.892 -9.52652 -2.51114 25.8981 +4 1337 370.658 354.815 16.7176 -8.09976 -5.29369 24.4632 +5 1337 361.564 346.418 11.4744 -8.79557 -5.72359 25.5905 +4 1342 472.274 456.906 23.2156 -4.79833 -5.23011 25.219 +5 1342 467.42 451.522 18.1563 -4.80253 -5.22684 24.3789 +6 1342 462.412 446.149 14.7885 -4.86009 -5.22072 23.8315 +4 1346 486.831 473.484 124.76 -4.93932 -1.9356 29.0389 +5 1346 483.51 469.708 123.618 -4.90573 -1.91623 28.0816 +6 1346 479.931 465.451 124.368 -4.80889 -1.79871 26.7672 +7 1346 475.979 461.01 125.332 -4.79353 -1.70533 25.8924 +8 1346 471.856 456.39 123.932 -4.78261 -1.69912 25.0599 +9 1346 467.427 451.666 120.613 -4.844 -1.78041 24.5906 +4 1348 439.433 423.927 71.0036 -5.89342 -3.52825 24.9952 +5 1348 433.025 417.863 67.4245 -6.25409 -3.73506 25.562 +6 1348 426.906 411.233 66.135 -6.26006 -3.65757 24.7292 +7 1348 420.167 404.358 64.6403 -6.43525 -3.67693 24.5167 +4 1349 483.129 468.76 84.1126 -4.72655 -3.31756 26.9744 +5 1349 479.657 464.162 81.1447 -4.50332 -3.17928 25.0135 +6 1349 475.555 459.648 80.1565 -4.52517 -3.13029 24.3655 +7 1349 470.688 455.436 79.4999 -4.89057 -3.28762 25.4101 +8 1349 465.764 450.884 76.1377 -5.19061 -3.4912 26.0456 +4 1350 449.548 434.715 88.5968 -5.79431 -3.05112 26.1283 +5 1350 444.181 429.185 86.3221 -5.92381 -3.09955 25.8453 +4 1353 526.63 512.952 47.5809 -3.25658 -4.91941 28.3344 +5 1353 524.218 509.911 43.6821 -3.20421 -4.84986 27.0907 +4 1355 420.93 406.178 52.2388 -6.86828 -4.39178 26.2723 +5 1355 414.6 399.655 48.8784 -7.00717 -4.4559 25.9333 +6 1355 407.999 391.638 46.9964 -6.61719 -4.13189 23.688 +7 1355 401.156 383.586 45.0378 -6.37128 -3.90759 22.0588 +8 1355 393.535 375.18 40.1255 -6.32201 -3.88433 21.1159 +9 1355 384.543 366.008 32.4742 -6.52101 -4.06824 20.9103 +10 1355 375.238 356.223 24.6263 -6.61934 -4.18727 20.3827 +4 1356 433.52 418.692 61.3856 -6.37724 -4.03807 26.1385 +5 1356 427.709 412.434 58.0977 -6.39501 -4.03555 25.3738 +6 1356 421.459 405.459 56.4312 -6.31511 -3.90867 24.2242 +7 1356 414.795 398.228 54.678 -6.31487 -3.83164 23.3945 +8 1356 407.47 390.552 50.2229 -6.41638 -3.89357 22.909 +9 1356 400.117 382.253 43.5698 -6.29738 -3.88724 21.6948 +10 1356 391.345 373.518 35.6975 -6.57481 -4.13254 21.74 +11 1356 382.27 363.671 28.336 -6.5645 -4.17392 20.8392 +12 1356 372.442 352.595 21.2322 -6.41751 -4.1036 19.5282 +13 1356 362.632 340.15 14.2982 -5.8996 -3.78823 17.239 +4 1358 663.844 650.793 62.1679 2.23427 -4.55565 29.6973 +5 1358 666.305 652.757 58.226 2.24985 -4.54477 28.6076 +4 1363 566.659 561.228 104.697 -4.24335 -6.74148 71.3686 +5 1363 566.829 561.601 103.973 -4.38994 -7.07652 74.1279 +4 1364 566.659 561.228 104.697 -4.24335 -6.74148 71.3686 +5 1364 566.829 561.601 103.973 -4.38994 -7.07652 74.1279 +6 1364 566.826 561.384 104.959 -4.2175 -6.7009 71.2117 +4 1365 678.241 669.681 16.872 4.30974 -9.78772 45.2758 +5 1365 680.025 671.435 13.325 4.40618 -9.97523 45.1172 +6 1365 681.82 672.868 11.996 4.33624 -9.65286 43.2984 +7 1365 683.789 674.766 11.0718 4.4191 -9.63135 42.9552 +8 1365 686.125 676.818 7.97833 4.41872 -9.51518 41.6408 +4 1367 614.695 602.195 68.0845 0.220701 -4.50214 31.0058 +5 1367 615.443 602.166 64.9201 0.238039 -4.36663 29.1909 +6 1367 616.073 601.904 64.3107 0.246942 -4.11498 27.3541 +4 1368 587.964 584.344 99.6874 -3.20426 -10.8562 107.059 +5 1368 588.303 584.635 98.8302 -3.1128 -10.8399 105.661 +4 1369 664.859 652.114 117.908 2.33073 -2.31585 30.4109 +5 1369 667.437 654.325 116.187 2.37115 -2.32156 29.5603 +6 1369 669.992 656.292 116.198 2.36948 -2.22143 28.2906 +7 1369 672.609 658.511 116.901 2.40232 -2.13194 27.4922 +4 1371 638.891 627.56 86.2246 1.39054 -4.10688 34.2063 +5 1371 641.188 628.908 84.1821 1.38352 -3.87871 31.5617 +6 1371 642.623 630.568 83.711 1.47327 -3.97211 32.1509 +4 1379 695.067 683.177 116.574 3.863 -2.5426 32.5971 +5 1379 698.357 686.125 114.58 3.89931 -2.55894 31.6842 +6 1379 701.414 688.812 114.583 3.91542 -2.48387 30.7565 +7 1379 704.79 691.805 113.827 3.93916 -2.4416 29.8458 +4 1381 698.702 688.35 123.612 4.62554 -2.55512 37.4398 +5 1381 702.099 691.468 122.263 4.67559 -2.55614 36.4558 +6 1381 706.067 694.264 123.014 4.39201 -2.26819 32.8368 +4 1387 904.163 892.22 21.3687 13.2493 -6.81278 32.4499 +5 1387 913.773 901.626 15.4111 13.4523 -6.96213 31.9064 +4 1388 971.663 956.01 62.7587 12.4255 -3.77788 24.7593 +5 1388 987.273 970.573 56.7972 12.1497 -3.73312 23.2092 +4 1391 951.304 930.826 109.817 8.96395 -1.65346 18.9259 +5 1391 970.439 948.971 105.12 9.02961 -1.69479 18.0537 +4 1392 914.962 896.086 115.108 8.69082 -1.64327 20.5327 +5 1392 930.797 910.888 111.18 8.6667 -1.66392 19.4664 +4 1395 873.948 864.367 29.8495 14.8232 -8.01769 40.4537 +5 1395 882.581 871.879 22.8676 13.7032 -7.52791 36.2144 +6 1395 890.545 879.175 19.5899 13.2746 -7.24067 34.0877 +4 1400 869.11 856.88 49.4908 11.3998 -5.41827 31.6908 +5 1400 878.448 863.993 45.125 9.99256 -4.74673 26.8141 +4 1401 983.166 966.615 29.5373 12.1252 -4.65128 23.4172 +5 1401 999.535 982.371 20.6076 12.2043 -4.76456 22.5806 +4 1408 991.653 970.639 109.128 9.76656 -1.62888 18.443 +5 1408 1013.62 991.577 104.149 9.84809 -1.67455 17.5861 +6 1408 1037.77 1014.34 101.091 9.81542 -1.64495 16.539 +7 1408 1064.18 1039.67 98.9347 9.96037 -1.6195 15.8082 +8 1408 1094.28 1068.23 94.644 9.99389 -1.61253 14.8766 +4 1415 1027.62 998.908 81.3012 7.82131 -1.71282 13.499 +5 1415 1060.87 1029.59 72.9485 7.74961 -1.7155 12.3897 +6 1415 1098.48 1064.92 65.4033 7.82456 -1.71961 11.5473 +4 1446 137.795 93.7093 203.969 -5.74802 0.379108 8.79129 +5 1446 82.3853 34.1208 210.237 -5.86708 0.416049 8.03022 +4 1458 193.027 142.707 226.679 -4.44632 0.574566 7.70213 +5 1458 138.444 83.6562 235.782 -4.61889 0.616955 7.07408 +4 1459 270.918 257.885 129.738 -13.958 -1.77713 29.74 +5 1459 261.033 251.484 129.877 -19.6072 -2.41779 40.5919 +4 1463 259.651 246.746 143.761 -14.564 -1.21094 30.032 +5 1463 249.286 236.004 144.187 -14.5707 -1.15939 29.1814 +6 1463 238.204 224.303 146.576 -14.3491 -1.01537 27.8801 +4 1466 160.221 133.474 190.698 -9.02412 0.358371 14.4907 +5 1466 130.109 102.127 193.937 -9.20348 0.404703 13.8506 +4 1471 173.357 119.425 220.026 -4.34443 0.469814 7.18628 +5 1471 109.872 53.2002 229.942 -4.73616 0.541098 6.83891 +4 1474 320.685 314.416 174.53 -24.7494 0.143634 61.8181 +5 1474 317.289 311.287 176.116 -26.1587 0.291941 64.579 +6 1474 313.908 307.311 179.086 -24.0705 0.507343 58.7443 +7 1474 309.992 303.2 181.843 -23.6902 0.710892 57.0604 +4 1477 353.912 324.603 214.38 -4.6853 0.76106 13.2238 +5 1477 335.783 303.986 218.721 -4.62491 0.774835 12.1889 +6 1477 314.116 279.373 225.58 -4.56775 0.815174 11.1554 +7 1477 288.18 250.776 233.04 -4.61524 0.86432 10.3618 +8 1477 257.704 216.725 239.49 -4.61216 0.873472 9.45799 +9 1477 220.923 175.473 245.025 -4.59308 0.852949 8.52747 +4 1480 334.221 303.808 200.723 -4.86294 0.492208 12.7436 +5 1480 313.786 279.297 204.262 -4.60656 0.489176 11.2377 +6 1480 287.623 251.683 209.595 -4.81158 0.549127 10.7839 +4 1486 429.768 410.128 203.086 -4.9172 0.826821 19.7337 +5 1486 422.229 401.153 205.682 -4.7745 0.836685 18.3898 +4 1487 523.031 513.286 127.837 -4.76984 -2.48153 39.7744 +5 1487 521.638 511.762 127.918 -4.78246 -2.44429 39.2477 +6 1487 520.168 509.821 129.381 -4.64075 -2.25691 37.4587 +7 1487 517.999 508.097 130.224 -4.96671 -2.31249 39.1399 +4 1491 428.56 407.997 201.977 -4.72809 0.760757 18.8482 +5 1491 420.178 398.645 204.206 -4.72431 0.782109 17.9995 +6 1491 410.363 387.768 208.389 -4.7356 0.844802 17.1535 +7 1491 400.048 375.936 213.181 -4.66736 0.898379 16.074 +8 1491 387.936 363.15 215.975 -4.803 0.934514 15.6371 +4 1493 452.269 439.836 190.543 -6.79512 0.764187 31.1713 +5 1493 449.669 434.888 191.828 -5.81046 0.689533 26.2209 +6 1493 444.673 431.437 195.156 -6.69131 0.905041 29.281 +4 1494 548.425 542.072 136.297 -5.16928 -3.09108 61.0104 +5 1494 548.248 541.889 136.394 -5.17908 -3.07981 60.9495 +4 1500 693.662 681.709 128.707 3.77949 -1.98391 32.4252 +5 1500 697.195 685.214 126.825 3.9289 -2.06358 32.348 +6 1500 700.311 688.2 126.973 4.02489 -2.03484 32.0005 +7 1500 704.033 690.921 128.193 3.87011 -1.82955 29.5577 +8 1500 708.193 694.163 127.365 3.7762 -1.74155 27.624 +9 1500 712.556 698.159 124.644 3.84277 -1.79869 26.9203 +10 1500 717.128 702.121 121.009 3.8504 -1.85578 25.8274 +11 1500 721.807 706.258 117.995 3.87761 -1.89511 24.9256 +12 1500 726.66 710.316 115.661 3.84858 -1.87968 23.7137 +13 1500 732.501 715.346 113.379 3.84949 -1.86226 22.5924 +4 1504 557.659 553.751 166.094 -7.13398 -0.92923 99.1788 +5 1504 557.891 554.052 166.136 -7.23024 -0.940049 100.969 +6 1504 558.015 554.362 168.231 -7.57911 -0.679701 106.095 +4 1505 661.012 644.983 218.753 1.72428 1.53816 24.18 +5 1505 664 647.276 220.355 1.74856 1.52567 23.1747 +6 1505 667.286 649.492 224.278 1.74257 1.55232 21.7807 +7 1505 671.059 652.238 229.115 1.75523 1.6057 20.593 +8 1505 674.433 655.333 231.961 1.82443 1.66225 20.2915 +9 1505 678.002 658.323 233.245 1.86816 1.64838 19.6945 +4 1506 687.033 666.433 231.05 2.0201 1.51744 18.8138 +5 1506 692.237 670.428 234.133 2.0363 1.50927 17.771 +6 1506 698.19 675.076 239.285 2.05966 1.54375 16.7675 +7 1506 704.239 679.821 245.722 2.08279 1.60297 15.8725 +8 1506 711.495 685.337 250.628 2.09323 1.59706 14.8166 +9 1506 719.31 691.266 254.591 2.10212 1.56555 13.82 +4 1509 616.543 611.004 177.916 0.677267 0.490902 69.9781 +5 1509 617.733 612.144 178.023 0.785559 0.496785 69.3438 +6 1509 618.165 612.935 180.642 0.883935 0.800032 74.1167 +7 1509 619.125 613.322 182.805 0.885419 0.921146 66.7882 +8 1509 619.839 613.905 183.532 0.930433 0.966462 65.3046 +9 1509 620.803 615.114 182.091 1.06165 0.872163 68.1259 +10 1509 621.393 615.74 180.204 1.12446 0.698432 68.5614 +11 1509 622.275 616.151 179.272 1.11528 0.562961 63.2857 +12 1509 622.911 616.961 178.836 1.20534 0.540052 65.1384 +13 1509 623.772 617.77 178.901 1.27185 0.54113 64.5662 +4 1510 662.567 650.24 152.422 2.30984 -0.890362 31.4417 +5 1510 665.098 652.758 151.64 2.41756 -0.923436 31.4081 +6 1510 667.452 654.707 152.959 2.4399 -0.838477 30.4093 +7 1510 669.864 656.824 154.779 2.48413 -0.74455 29.7223 +4 1524 709.607 695.341 204.379 3.76716 1.18705 27.1686 +5 1524 714.444 699.695 205.183 3.81989 1.17743 26.2783 +6 1524 719.962 703.927 208.251 3.69834 1.18576 24.1705 +7 1524 725.052 708.406 212.088 3.72676 1.26603 23.2828 +8 1524 730.557 713.179 214.037 3.73986 1.2729 22.3016 +9 1524 736.682 718.73 214.396 3.80366 1.24298 21.5892 +10 1524 743.402 724.598 214.177 3.82331 1.1804 20.6112 +4 1528 926.558 906.217 141.308 8.37085 -0.833033 19.0533 +5 1528 944.101 923.195 138.512 8.59595 -0.882406 18.5397 +6 1528 963.018 940.9 137.985 8.58409 -0.846826 17.5232 +4 1530 845.45 830.866 150.377 8.68796 -0.827824 26.5746 +5 1530 855.267 840.217 148.524 8.76947 -0.868359 25.7522 +4 1531 869.758 855.055 158.013 9.50637 -0.542233 26.3614 +5 1531 880.526 865.563 156.431 9.72721 -0.589538 25.9018 +6 1531 892.02 876.29 157.066 9.64535 -0.539117 24.6387 +7 1531 904.195 887.847 158.736 9.6807 -0.463859 23.7072 +8 1531 917.488 900.229 158.599 9.58402 -0.443668 22.4573 +9 1531 932.171 914.201 156.672 9.64348 -0.483699 21.5681 +10 1531 947.942 929.116 153.865 9.65487 -0.541808 20.5872 +4 1535 915.709 844.116 207.359 2.29697 0.25888 5.41351 +5 1535 982.216 894.669 213.627 2.28647 0.250165 4.42706 +4 1536 943.155 864.817 242.716 2.28741 0.479034 4.94747 +5 1536 1022.96 925.974 257.851 2.28952 0.47073 3.99602 +4 1538 927.661 907.428 132.254 8.44501 -1.07784 19.1555 +5 1538 945.619 924.154 128.675 8.4098 -1.10557 18.0563 +6 1538 964.575 942.033 127.846 8.45961 -1.07249 17.1934 +7 1538 986.131 962.233 127.445 8.46389 -1.02062 16.2174 +8 1538 1010.63 985.158 125.077 8.45777 -1.00753 15.2158 +4 1540 928.895 857.362 214.585 2.39795 0.313366 5.41817 +5 1540 997.485 909.82 221.973 2.37694 0.300967 4.42108 +4 1543 907.306 889.285 134.185 8.87494 -1.1526 21.5069 +5 1543 923.519 904.048 130.788 8.66103 -1.16044 19.9046 +4 1546 1022.92 1001.92 141.888 10.5755 -0.792249 18.4601 +5 1546 1046.8 1024.86 138.654 10.7033 -0.837187 17.6625 +6 1546 1072.8 1049.67 137.511 10.7547 -0.820525 16.7513 +4 1547 1022.92 1001.92 141.888 10.5755 -0.792249 18.4601 +5 1547 1046.8 1024.86 138.654 10.7033 -0.837187 17.6625 +6 1547 1072.8 1049.67 137.511 10.7547 -0.820525 16.7513 +4 1549 1033.2 1012.75 144.713 11.1239 -0.738906 18.9458 +5 1549 1057.34 1035.88 141.681 11.2099 -0.780397 18.0633 +6 1549 1083.72 1060.97 140.869 11.1954 -0.755208 17.0362 +7 1549 1113.01 1089.14 141.112 11.3294 -0.714312 16.2371 +8 1549 1146.4 1121 139.768 11.3563 -0.699907 15.2634 +4 1589 385.877 349.211 286.86 -3.2769 1.67017 10.5704 +5 1589 365.454 325.234 299.016 -3.26007 1.68492 9.63626 +4 1599 479.17 445.01 276.098 -2.05031 1.62346 11.3458 +5 1599 468.667 433.305 285.87 -2.14012 1.71669 10.96 +4 1602 553.902 512.682 297.551 -0.725289 1.62497 9.4026 +5 1602 548.885 503.381 311.991 -0.716245 1.64247 8.51751 +4 1610 570.709 534.624 281.714 -0.578314 1.62045 10.7406 +5 1610 568.388 528.996 292.253 -0.561418 1.62814 9.83895 +4 1619 818.656 763.088 317.578 2.02123 1.39897 6.97472 +5 1619 853.043 788.726 339.877 2.03349 1.39492 6.02603 +4 1622 941.294 860.982 260.357 2.21873 0.585243 4.82584 +5 1622 1022.15 922.783 279.219 2.23036 0.574982 3.90046 +5 1637 392.927 377.696 17.4474 -7.63972 -5.48055 25.4457 +6 1637 385.447 368.913 14.1677 -7.28082 -5.1553 23.4409 +5 1652 699.869 684.711 208.129 3.2002 1.24999 25.5683 +6 1652 704.452 688.599 211.446 3.21532 1.30765 24.4484 +5 1654 1042.54 1020.63 133.069 10.6171 -0.975559 17.6929 +6 1654 1068.18 1044.92 131.828 10.5918 -0.947503 16.6639 +7 1654 1096.74 1072.14 131.68 10.6343 -0.898743 15.7498 +8 1654 1129.13 1103.32 129.6 10.8129 -0.900167 15.0159 +9 1654 1166.62 1139.37 125.395 10.9831 -0.935711 14.226 +10 1654 1208.93 1179.77 119.94 11.0417 -0.974781 13.2922 +5 1658 307.811 271.79 286.816 -4.49974 1.69943 10.7597 +6 1658 280.015 240.392 300.835 -4.46746 1.73497 9.78152 +5 1662 787.466 734.519 331.217 1.80486 1.60659 7.31996 +6 1662 814.937 754.044 356.106 1.81169 1.61651 6.36487 +5 1669 114.006 83.5661 33.2752 -8.74476 -2.46307 12.7326 +6 1669 74.6704 45.9895 27.4996 -10.0177 -2.72227 13.5133 +5 1671 251.787 236.819 74.1286 -12.8385 -3.54271 25.892 +6 1671 239.395 222.356 73.4267 -11.6692 -3.13437 22.746 +7 1671 224.214 207.772 71.9841 -12.5888 -3.29531 23.5718 +5 1678 237.942 222 93.0028 -12.5215 -2.69055 24.3119 +6 1678 224.01 207.477 93.6769 -12.5259 -2.57235 23.4417 +5 1683 344.039 329.41 70.8441 -9.74946 -3.74563 26.4936 +6 1683 335.113 319.5 69.9166 -9.4424 -3.54159 24.8247 +5 1687 400.87 385.392 72.7718 -7.24237 -3.47327 25.0403 +6 1687 393.693 377.366 71.818 -7.10196 -3.32407 23.7385 +7 1687 385.312 369.948 70.2496 -7.83961 -3.58702 25.2248 +8 1687 377.897 361.634 66.8088 -7.65176 -3.50265 23.8322 +9 1687 369.163 352.03 60.7893 -7.53676 -3.51339 22.6212 +5 1689 396.04 380.661 94.8594 -7.45774 -2.72417 25.2017 +6 1689 388.452 372.602 94.3301 -7.49323 -2.66114 24.4526 +5 1690 412.603 397.066 100.968 -6.80961 -2.4854 24.9465 +6 1690 405.561 389.628 100.819 -6.87726 -2.42846 24.3248 +5 1692 357.759 343.012 76.6405 -9.17193 -3.50462 26.2823 +6 1692 349.221 333.952 76.0135 -9.15842 -3.40675 25.383 +7 1692 340.28 324.492 74.9487 -9.16152 -3.33097 24.5484 +5 1700 494.273 480.354 35.7987 -4.44892 -5.28899 27.8443 +6 1700 491.699 476.885 33.5842 -4.27354 -5.04985 26.1626 +7 1700 488.134 472.122 31.2903 -4.07331 -4.74887 24.2046 +8 1700 484.066 467.747 26.2403 -4.1307 -4.82589 23.7499 +9 1700 479.472 463.454 18.9708 -4.36217 -5.16012 24.1951 +10 1700 474.635 458.139 10.3666 -4.3935 -5.29104 23.4953 +5 1707 522.23 507.95 101.157 -3.28479 -2.6968 27.1399 +6 1707 519.682 504.7 100.957 -3.22234 -2.57771 25.869 +7 1707 516.956 501.634 100.864 -3.24649 -2.52381 25.2956 +8 1707 514.085 498.263 98.4742 -3.24126 -2.52513 24.4956 +9 1707 511.158 494.833 94.1553 -3.23779 -2.5895 23.7415 +10 1707 507.793 490.68 88.658 -3.19432 -2.64281 22.6482 +11 1707 504.231 486.416 83.9314 -3.17581 -2.68116 21.7555 +12 1707 499.945 481.166 79.465 -3.13533 -2.67124 20.6384 +13 1707 495.566 475.902 75.2113 -3.11383 -2.66721 19.7096 +5 1708 526.069 512.767 20.0401 -3.37141 -6.17075 29.1363 +6 1708 523.806 510.982 17.1477 -3.59175 -6.52172 30.2214 +7 1708 521.462 507.04 14.2692 -3.28126 -5.9066 26.8742 +5 1710 451.289 436.571 36.4342 -5.77665 -4.97913 26.3351 +6 1710 446.197 430.636 33.8231 -5.63905 -4.79917 24.9066 +7 1710 441.002 425.456 31.2411 -5.82397 -4.893 24.9305 +5 1711 548.341 534.803 53.5746 -2.42909 -4.73288 28.6299 +6 1711 547.02 532.754 51.8198 -2.35476 -4.55722 27.1676 +7 1711 545.775 531.158 50.0561 -2.34391 -4.51251 26.5146 +8 1711 544.02 528.839 45.7643 -2.31889 -4.49667 25.5294 +5 1712 481.524 468.998 65.3079 -5.4906 -4.61195 30.942 +6 1712 478.405 464.791 64.2432 -5.17507 -4.28554 28.4703 +7 1712 474.146 459.934 63.4202 -5.11834 -4.13636 27.2726 +8 1712 469.703 455.226 60.3073 -5.18916 -4.17589 26.7716 +5 1713 494.237 479.548 73.05 -4.21714 -3.64966 26.3854 +6 1713 490.522 475.323 71.9644 -4.20685 -3.56549 25.4995 +5 1716 550.253 535.964 25.8492 -2.22928 -5.52583 27.1222 +6 1716 549.218 534.224 24.0934 -2.16165 -5.32914 25.8481 +7 1716 547.915 532.035 21.4713 -2.08504 -5.12035 24.4052 +5 1717 513.2 498.395 49.2194 -3.49611 -4.48569 26.1787 +6 1717 510.956 495.574 47.2326 -3.44338 -4.38689 25.1972 +5 1718 541.498 528.061 69.6389 -2.72084 -4.12613 28.8442 +6 1718 539.408 525.336 68.4207 -2.67779 -3.98639 27.5423 +5 1719 499.299 486.041 62.1634 -4.46735 -4.48477 29.234 +6 1719 496.322 482.609 60.7704 -4.4356 -4.39041 28.2633 +5 1720 504.281 490.126 101.473 -3.99533 -2.7089 27.3823 +6 1720 501.074 486.322 101.142 -3.95009 -2.61112 26.2722 +7 1720 497.902 482.606 101.209 -3.92114 -2.516 25.3387 +8 1720 494.375 478.624 98.9496 -3.92829 -2.52045 24.6075 +9 1720 490.715 474.574 94.5828 -3.95499 -2.60477 24.0119 +10 1720 486.945 469.712 89.5215 -3.82187 -2.59747 22.4903 +11 1720 482.536 464.857 85.1864 -3.85935 -2.66362 21.9226 +12 1720 477.302 459.105 80.8643 -3.90418 -2.71549 21.2994 +5 1722 488.292 473.582 90.7628 -4.42833 -2.99773 26.3484 +6 1722 484.515 469.295 90.2094 -4.41319 -2.91677 25.4652 +7 1722 480.434 464.821 89.7117 -4.44244 -2.86043 24.8238 +5 1726 676.983 664.213 98.7511 2.83613 -3.1171 30.3511 +6 1726 679.665 666.522 98.1673 2.86521 -3.05242 29.489 +5 1729 589.952 582.634 111.74 -1.43938 -4.48633 52.9676 +6 1729 589.908 582.643 112.643 -1.45294 -4.45167 53.3467 +7 1729 590.68 582.645 112.99 -1.26207 -4.00187 48.2345 +8 1729 590.736 582.792 112.478 -1.2727 -4.0822 48.7855 +5 1735 563.82 553.255 85.7068 -2.32546 -4.4307 36.6841 +6 1735 564.059 555.613 83.6463 -2.89363 -5.67326 45.8869 +7 1735 565.724 555.128 81.1001 -2.22209 -4.65121 36.5763 +5 1736 770.793 736.64 39.6448 2.53585 -2.09508 11.3482 +6 1736 785.372 747.97 29.5178 2.52493 -2.05852 10.3623 +7 1736 803.003 761.762 18.1731 2.51953 -2.01466 9.39777 +5 1738 701.638 688.465 62.2708 3.75446 -4.50895 29.4202 +6 1738 705.168 691.673 60.4286 3.80566 -4.47503 28.7204 +7 1738 708.926 695.252 59.0137 3.90347 -4.47206 28.3446 +8 1738 713.237 698.737 55.7625 3.84056 -4.33744 26.728 +9 1738 718.295 702.99 50.3678 3.81635 -4.29897 25.3242 +5 1739 732.098 719.261 68.0609 5.12735 -4.38482 30.191 +6 1739 736.221 722.951 66.0504 5.12733 -4.32347 29.2082 +5 1741 728.5 721.213 78.2405 8.76741 -6.97419 53.1863 +6 1741 732.858 725.571 77.1863 9.08835 -7.05166 53.1845 +5 1742 824.905 811.378 83.8949 8.5509 -3.53237 28.6507 +6 1742 833.077 818.795 82.2573 8.4062 -3.40722 27.136 +5 1747 728.344 715.536 27.7976 4.98171 -6.08351 30.2605 +6 1747 732.415 721.702 24.2503 6.16032 -7.45142 36.18 +5 1760 899.65 887.992 17.8237 13.3651 -7.14256 33.2427 +6 1760 908.513 896.276 14.7111 13.1228 -6.94181 31.6725 +7 1760 918.089 905.504 11.9901 13.1686 -6.86595 30.7965 +5 1761 958.728 937.035 125.27 8.6457 -1.17822 17.8658 +6 1761 978.932 955.978 123.769 8.64389 -1.14867 16.8851 +7 1761 1001.4 977.189 123.112 8.69412 -1.10368 16.0095 +5 1764 851.888 841.565 105.08 12.61 -3.52673 37.5465 +6 1764 859.557 847.959 104.583 11.5787 -3.162 33.4182 +7 1764 867.809 855.395 104.789 11.1749 -2.94532 31.2223 +5 1766 951.188 937.337 54.1353 13.2488 -4.60407 27.9822 +6 1766 964.383 949.308 50.7745 12.6431 -4.34994 25.7098 +5 1767 992.156 975.121 12.9975 12.0637 -5.04047 22.751 +6 1767 1009.06 991.111 6.88293 11.9565 -4.96731 21.5947 +5 1768 974.095 958.498 54.1005 12.5542 -4.08975 24.849 +6 1768 989.352 972.937 50.1266 12.4285 -4.0162 23.612 +5 1771 1033.3 1011.35 102.242 10.3695 -1.72799 17.6571 +6 1771 1058.38 1035.09 99.1157 10.3532 -1.70097 16.6442 +7 1771 1086.13 1061.79 96.8715 10.5139 -1.67629 15.9182 +8 1771 1117.51 1091.77 92.5275 10.599 -1.67611 15.0557 +5 1772 1033.3 1011.35 102.242 10.3695 -1.72799 17.6571 +6 1772 1058.38 1035.09 99.1157 10.3532 -1.70097 16.6442 +7 1772 1086.13 1061.79 96.8715 10.5139 -1.67629 15.9182 +8 1772 1117.51 1091.77 92.5275 10.599 -1.67611 15.0557 +9 1772 1153.33 1126.22 85.86 10.7732 -1.72352 14.2951 +10 1772 1194.31 1165.06 77.4078 10.7356 -1.7523 13.2468 +5 1773 1058.54 1040.85 28.2019 13.6363 -4.39336 21.9145 +6 1773 1079.81 1061.16 21.8404 13.5468 -4.35037 20.7859 +7 1773 1102.92 1083.63 16.818 13.7357 -4.34421 20.0884 +8 1773 1128.91 1108.71 9.30908 13.8111 -4.34912 19.1877 +5 1774 1065.19 1047.52 31.674 13.849 -4.29122 21.9314 +6 1774 1087.25 1068.31 25.6272 13.5506 -4.17637 20.4678 +5 1775 1079.76 1051.54 65.9494 8.94787 -2.03437 13.7307 +6 1775 1117.33 1085.14 58.1104 8.47242 -1.91454 12.0391 +5 1776 1057.58 1026.21 80.6419 7.67275 -1.57923 12.3571 +6 1776 1095.19 1061.62 73.8964 7.77172 -1.58366 11.547 +7 1776 1139.12 1103.1 67.2889 7.89799 -1.57443 10.7612 +5 1777 1057.58 1026.21 80.6419 7.67275 -1.57923 12.3571 +6 1777 1095.19 1061.62 73.8964 7.77172 -1.58366 11.547 +7 1777 1139.12 1103.1 67.2889 7.89799 -1.57443 10.7612 +5 1778 1090.82 1059.43 96.5786 8.23475 -1.30513 12.3461 +6 1778 1132.22 1097.85 90.5545 8.16753 -1.28608 11.2753 +5 1780 1020.11 997.952 116.873 9.95316 -1.35718 17.4926 +6 1780 1044.42 1021.13 114.565 10.0293 -1.34435 16.6411 +7 1780 1071.64 1046.99 113.32 10.0686 -1.29722 15.7221 +8 1780 1102.47 1076.36 110.014 10.1427 -1.29308 14.8473 +9 1780 1137.98 1110.36 104.185 10.2784 -1.3357 14.0347 +10 1780 1178.25 1148.64 97.0598 10.3149 -1.37475 13.0872 +5 1781 1070 1038.95 70.834 7.96602 -1.76505 12.4833 +6 1781 1108.36 1074.87 64.2635 8.0005 -1.74174 11.5731 +7 1781 1153.33 1117.22 57.4653 8.09035 -1.71679 10.7353 +5 1806 187.932 138.551 235.126 -4.58635 0.677373 7.84869 +6 1806 131.831 75.7331 246.976 -4.57438 0.709741 6.90891 +5 1809 239.846 226.062 150.685 -14.4074 -0.863897 28.1177 +6 1809 227.922 213.416 153.242 -14.1322 -0.726226 26.7188 +7 1809 214.927 199.785 155.236 -13.9994 -0.624992 25.5962 +5 1819 370.837 357.282 148.825 -9.45989 -0.952197 28.5925 +6 1819 363.489 349.293 150.687 -9.3114 -0.838819 27.3032 +7 1819 355.641 341.203 152.679 -9.44658 -0.750573 26.8435 +5 1821 292.593 255.469 220.954 -4.58629 0.695981 10.4402 +6 1821 262.562 221.254 228.697 -4.51214 0.726148 9.38243 +5 1823 404.517 381.366 204.431 -4.7573 0.732645 16.7408 +6 1823 393.507 368.191 210.56 -4.58419 0.800047 15.3096 +7 1823 380.538 352.938 215.228 -4.45708 0.824661 14.0422 +8 1823 365.702 336.542 218.671 -4.49203 0.843974 13.2912 +9 1823 348.553 317.143 220.222 -4.46353 0.810052 12.3392 +10 1823 329.537 295.432 222.597 -4.41029 0.783444 11.3641 +5 1827 471.789 458.02 131.699 -5.37484 -1.60556 28.1493 +6 1827 467.835 453.419 132.636 -5.28084 -1.49858 26.8855 +7 1827 463.457 448.591 133.906 -5.2794 -1.40737 26.0726 +5 1829 439.246 421.204 191.875 -5.07069 0.5663 21.4821 +6 1829 432.383 413.066 195.31 -4.92664 0.624429 20.0634 +7 1829 424.415 403.795 199.344 -4.823 0.690053 18.796 +5 1832 470.123 456.096 148.007 -5.33937 -0.951446 27.6296 +6 1832 465.774 451.505 149.511 -5.41263 -0.878726 27.1616 +5 1834 514.47 508.512 184.066 -8.57353 1.01087 65.0557 +6 1834 512.466 508.278 187.402 -12.4549 1.86614 92.5571 +5 1836 609.859 601.686 127.048 0.0197242 -3.01026 47.4176 +6 1836 610.696 601.854 128.045 0.0690378 -2.72211 43.8328 +7 1836 611.202 602.609 129.598 0.102679 -2.70404 45.105 +8 1836 612.123 602.931 129.036 0.149811 -2.56052 42.1637 +9 1836 612.682 603.769 126.73 0.188182 -2.77985 43.4867 +10 1836 613.516 603.972 123.432 0.22268 -2.7815 40.6089 +11 1836 614.165 604.767 121.331 0.26326 -2.94495 41.2414 +5 1837 561.732 556.025 129.916 -4.5012 -4.04104 67.9067 +6 1837 561.73 555.849 131.435 -4.36844 -3.78297 65.901 +7 1837 561.655 555.784 133.584 -4.38332 -3.59327 66.0216 +8 1837 561.655 555.686 133.282 -4.31148 -3.5615 64.9392 +9 1837 561.732 555.671 131.303 -4.239 -3.68273 63.9504 +10 1837 561.666 555.642 128.594 -4.27122 -3.94714 64.3476 +5 1839 666.623 654.399 175.783 2.50763 0.128702 31.7076 +6 1839 669.283 656.399 177.771 2.49002 0.204982 30.0828 +7 1839 671.792 658.591 180.622 2.5322 0.316074 29.3588 +5 1840 639.833 628.641 180.589 1.45291 0.371229 34.6278 +6 1840 641.288 630.505 182.65 1.58058 0.488017 35.944 +5 1841 589.13 585.286 139.668 -2.85473 -4.6374 100.828 +6 1841 589.648 585.612 141.579 -2.65044 -4.16303 96.0436 +7 1841 590.082 586.06 143.841 -2.60124 -3.87483 96.3643 +8 1841 590.391 586.311 144.051 -2.52295 -3.79119 94.972 +9 1841 591.054 587.063 142.452 -2.49077 -4.09202 97.1159 +10 1841 591.292 587.318 139.99 -2.46921 -4.44223 97.5291 +11 1841 591.857 587.515 138.679 -2.18992 -4.22768 89.2596 +12 1841 592.021 587.831 138.012 -2.2489 -4.46764 92.5187 +13 1841 592.311 588.029 137.85 -2.1638 -4.39118 90.5154 +14 1841 592.681 588.388 138.568 -2.11137 -4.28907 90.262 +15 1841 593.73 589.077 139.715 -1.8273 -3.82549 83.2931 +16 1841 594.726 589.978 140.356 -1.67844 -3.67714 81.6418 +17 1841 595.634 590.922 140.394 -1.58717 -3.69982 82.2413 +18 1841 596.837 591.931 140.715 -1.39307 -3.5191 79.0049 +19 1841 597.93 593.063 140.315 -1.28373 -3.59173 79.646 +20 1841 598.857 593.585 139.413 -1.09055 -3.40743 73.5203 +21 1841 599.806 594.5 138.023 -0.987431 -3.52631 73.0492 +22 1841 600.621 595.281 137.242 -0.899131 -3.58228 72.5799 +23 1841 601.682 596.038 136.836 -0.74959 -3.42755 68.663 +24 1841 602.884 597.203 136.751 -0.631095 -3.41337 68.2189 +5 1845 676.016 659.668 193.247 2.18356 0.670064 23.7075 +6 1845 679.584 662.388 195.938 2.18744 0.721109 22.5396 +7 1845 683.279 665.405 199.366 2.21538 0.796711 21.6832 +8 1845 687.226 668.52 201.148 2.23018 0.812452 20.7187 +9 1845 691.647 672.213 201.364 2.26887 0.788005 19.943 +10 1845 696.308 676.08 200.053 2.30354 0.722232 19.1597 +5 1847 645.165 633.726 200.783 1.67191 1.31145 33.8805 +6 1847 647.013 635.152 203.46 1.69615 1.38608 32.6765 +7 1847 648.664 636.664 206.8 1.75049 1.51956 32.2993 +8 1847 650.721 637.845 208.109 1.71719 1.47077 30.1012 +9 1847 652.59 639.64 207.824 1.78488 1.45052 29.9289 +10 1847 654.614 641.176 206.817 1.80092 1.35756 28.841 +5 1848 664.815 648.592 211.49 1.8295 1.27922 23.8897 +6 1848 667.864 650.628 215.007 1.81696 1.3136 22.4852 +5 1849 669.537 654.561 208.686 2.15127 1.28522 25.8799 +6 1849 672.688 656.874 211.964 2.14429 1.32845 24.5084 +7 1849 675.799 659.417 216.04 2.1719 1.41599 23.6582 +8 1849 678.919 661.559 218.754 2.14618 1.42027 22.3264 +9 1849 682.253 665.399 219.259 2.31688 1.47902 22.9967 +10 1849 686.757 668.158 219.026 2.22957 1.3335 20.839 +11 1849 691.149 671.707 220.213 2.25414 1.30841 19.9344 +12 1849 695.398 674.894 222.483 2.24871 1.30013 18.902 +13 1849 700.536 678.813 225.001 2.24954 1.2894 17.8411 +14 1849 706.516 682.027 228.773 2.1267 1.22655 15.8266 +15 1849 713.047 688.551 233.973 2.26925 1.3402 15.8216 +16 1849 720.557 694.598 238.64 2.2968 1.36126 14.9303 +17 1849 729.335 702.675 242.158 2.41325 1.39633 14.5376 +18 1849 738.704 709.966 248.234 2.41391 1.40897 13.4866 +19 1849 749.463 718.281 254.94 2.41007 1.41406 12.4297 +5 1852 831.855 816.27 171.759 7.66147 -0.0377382 24.8679 +6 1852 841.764 825.377 173.084 7.61165 0.00753939 23.652 +5 1854 803.11 769.852 183.973 3.12605 0.179577 11.6536 +6 1854 821.299 785.298 186.699 3.15925 0.206581 10.7657 +5 1860 699.104 682.832 192.422 2.95598 0.645967 23.8189 +6 1860 703.732 686.758 195.118 2.98005 0.704522 22.8326 +5 1867 962.3 941.342 168.654 9.04092 -0.107656 18.4934 +6 1867 982.1 960.154 169.852 9.11832 -0.0734668 17.6604 +7 1867 1004 980.753 171.887 9.11373 -0.022341 16.6714 +8 1867 1028.91 1003.95 171.686 9.02438 -0.0251254 15.5275 +9 1867 1056.86 1030.64 170.718 9.16475 -0.0437579 14.7836 +10 1867 1088.25 1060.31 168.091 9.20441 -0.0915883 13.8741 +11 1867 1123.48 1094.47 166.821 9.51659 -0.111725 13.3611 +12 1867 1164.69 1132.81 164.56 9.35277 -0.139731 12.1564 +13 1867 1212.49 1178.34 164.22 9.48215 -0.135791 11.3474 +5 1869 970.862 949.156 133.039 8.94089 -0.985281 17.8553 +6 1869 992.381 969.117 132.042 8.83913 -0.942331 16.6599 +7 1869 1015.89 991.642 131.858 8.99981 -0.908014 15.9812 +8 1869 1042.64 1016.58 129.734 8.92511 -0.888623 14.8696 +9 1869 1073.18 1045.61 125.573 9.03399 -0.921317 14.0598 +10 1869 1107.78 1078.36 120.014 9.09596 -0.964694 13.1729 +11 1869 1147.79 1116.38 114.701 9.20588 -0.994659 12.3412 +12 1869 1193.84 1159.88 108.379 9.24185 -1.01984 11.413 +5 1870 899.915 885.543 138.383 10.8515 -1.28827 26.966 +6 1870 911.709 896.649 139.127 10.7765 -1.20289 25.7344 +5 1872 900.012 883.057 151.838 9.20181 -0.665805 22.859 +6 1872 915.79 895.08 151.04 7.94252 -0.565769 18.7141 +7 1872 930.164 911.065 152.895 9.01673 -0.561341 20.2926 +5 1874 918.559 901.164 146.314 9.54151 -0.819534 22.2801 +6 1874 934.997 914.988 146.48 8.73643 -0.708005 19.3698 +5 1879 998.596 976.805 142.539 9.58998 -0.747294 17.7863 +6 1879 1021.55 998.427 141.858 9.57155 -0.720113 16.7632 +7 1879 1046.71 1022.48 142.274 9.69311 -0.678068 15.999 +8 1879 1075.39 1049.65 140.885 9.72115 -0.667148 15.0573 +5 1880 992.39 971.215 167.295 9.71138 -0.141025 18.3035 +6 1880 1014.76 991.783 168.06 9.47198 -0.112072 16.8666 +7 1880 1039.36 1015.23 170.018 9.56692 -0.0631239 16.0605 +8 1880 1067.98 1042.04 170.703 9.49195 -0.0445359 14.94 +9 1880 1098.93 1071.93 169.008 9.73755 -0.0765257 14.3573 +5 1882 989.735 967.903 131 9.35356 -1.02973 17.7522 +6 1882 1012.09 988.946 129.706 9.34413 -1.00162 16.7496 +7 1882 1037.06 1012.56 129.5 9.37374 -0.950626 15.8212 +8 1882 1065.25 1039.26 127.173 9.41813 -0.944109 14.9124 +5 1887 1054.2 1033.62 131.393 11.607 -1.08231 18.8354 +6 1887 1080.39 1058.44 129.9 11.5217 -1.05113 17.6568 +7 1887 1109.31 1085.46 129.523 11.2524 -0.97564 16.2461 +5 1888 1054.2 1033.62 131.393 11.607 -1.08231 18.8354 +6 1888 1080.39 1058.44 129.9 11.5217 -1.05113 17.6568 +7 1888 1109.31 1085.46 129.523 11.2524 -0.97564 16.2461 +5 1890 983.973 962.989 151.623 9.58411 -0.54346 18.4697 +6 1890 1004.51 983.166 151.523 9.93848 -0.536773 18.1566 +7 1890 1027.68 1004.62 152.642 9.74353 -0.471013 16.8143 +8 1890 1054.26 1029.21 152.323 9.53553 -0.440247 15.4716 +5 1894 1023.93 1002.39 145.984 10.3319 -0.669982 17.9908 +6 1894 1047.49 1025.2 145.294 10.5559 -0.664322 17.3922 +7 1894 1072.67 1049.91 144.754 10.9291 -0.663142 17.0276 +5 1916 179.961 128.39 306.289 -4.47461 1.38983 7.51538 +6 1916 120.666 64.0623 328.474 -4.63944 1.47678 6.84716 +5 1917 241.346 195.5 317.66 -4.31414 1.69661 8.45383 +6 1917 197.335 145.683 339.27 -4.28693 1.73065 7.50363 +7 1917 140.195 80.2428 365.806 -4.20536 1.72879 6.46476 +5 1947 629.004 588.391 293.483 0.257175 1.59546 9.54315 +6 1947 632.232 587.914 309.398 0.2748 1.65499 8.74544 +5 1950 813.808 773.088 283.537 2.69429 1.46004 9.51797 +6 1950 837.336 791.955 297.303 2.69606 1.47303 8.54042 +7 1950 866.492 815.279 315.245 2.69485 1.49348 7.5679 +8 1950 903.775 844.908 336.006 2.68466 1.48873 6.58389 +5 1951 771.425 724.374 311.055 1.8479 1.57774 8.23728 +6 1951 793.363 740.116 330.44 1.85419 1.58971 7.27879 +7 1951 821.602 760.245 356.09 1.85632 1.60414 6.3167 +6 1976 390.034 373.181 65.5509 -6.99669 -3.41996 22.9968 +7 1976 382.648 365.711 64.0793 -7.19667 -3.44987 22.8841 +8 1976 374.081 357.683 60.1814 -7.71353 -3.6908 23.6353 +9 1976 365.916 349.681 54.0038 -8.06107 -3.93222 23.8724 +10 1976 356.878 340.791 46.7583 -8.43726 -4.21045 24.0928 +6 1979 478.15 463.917 144.577 -4.95958 -1.06721 27.2319 +7 1979 474.288 459.541 146.173 -4.9271 -0.971818 26.2812 +6 1980 692.421 688.3 158.603 10.8009 -1.85756 94.0521 +7 1980 693.932 689.688 160.892 10.6784 -1.51397 91.3199 +8 1980 695.417 691.19 161.269 10.9091 -1.47203 91.6785 +9 1980 697.198 692.849 159.834 10.8251 -1.60828 89.1243 +6 1986 198.032 149.404 314.142 -4.54581 1.56069 7.97024 +7 1986 145.352 87.7801 335.41 -4.33107 1.51665 6.73198 +6 1990 483.359 435.758 327.917 -1.42413 1.74983 8.14228 +7 1990 468.868 413.732 351.145 -1.37066 1.73697 7.02945 +6 1998 91.3479 61.3802 39.2567 -9.28857 -2.39464 12.933 +7 1998 51.7405 19.4721 31.6723 -9.28565 -2.35016 12.011 +6 2008 255.119 240.962 47.0085 -13.4483 -4.7749 27.377 +7 2008 243.871 230.548 47.0951 -14.7432 -5.07013 29.0897 +6 2015 248.967 235.332 53.1655 -14.205 -4.71496 28.424 +7 2015 237.692 224.262 53.3465 -14.8724 -4.77956 28.8571 +6 2022 375.621 360.153 28.6846 -8.12366 -5.00638 25.0559 +7 2022 367.785 351.637 26.2115 -8.04237 -4.87791 24.0012 +8 2022 359.204 341.888 20.6338 -7.76635 -4.72206 22.383 +9 2022 349.676 331.678 12.7411 -7.75649 -4.77873 21.535 +6 2026 312.958 299.362 96.0535 -11.7178 -3.03416 28.5058 +7 2026 303.885 289.778 96.2216 -11.6388 -2.91785 27.4732 +6 2028 291.797 278.239 113.168 -12.5894 -2.36471 28.5866 +7 2028 282.123 272.317 114.275 -17.9366 -3.20887 39.5249 +6 2029 353.994 339.315 114.403 -9.35234 -2.13898 26.4044 +7 2029 345.414 330.024 114.948 -9.21919 -2.02105 25.1831 +8 2029 336.182 319.996 113.097 -9.07219 -1.98306 23.9447 +9 2029 325.984 309.842 109.139 -9.43675 -2.1203 24.0111 +6 2035 303.049 290.531 45.5233 -13.1523 -5.46372 30.961 +7 2035 293.677 278.665 43.6084 -11.3029 -4.62468 25.8181 +8 2035 283.223 268.122 39.2179 -11.6083 -4.75365 25.6662 +6 2042 405.561 389.628 100.819 -6.87726 -2.42846 24.3248 +7 2042 398.319 381.948 100.642 -6.93112 -2.36937 23.6747 +6 2043 396.249 381.068 103.502 -7.54794 -2.45399 25.5314 +7 2043 389.058 373.302 103.624 -7.51702 -2.36009 24.5977 +6 2045 350.412 335.304 96.4251 -9.21373 -2.71736 25.6536 +7 2045 341.697 326.176 96.2581 -9.27061 -2.65095 24.9721 +8 2045 332.09 316.363 93.8092 -9.47688 -2.69975 24.6439 +6 2046 337.847 321.154 39.2487 -8.74323 -4.29919 23.2179 +7 2046 327.267 310.681 37.3673 -9.14249 -4.38795 23.3681 +8 2046 317.36 300.306 31.3714 -9.2035 -4.45633 22.7265 +9 2046 303.338 284.154 24.5407 -8.57431 -4.15283 20.2033 +10 2046 287.519 268.958 17.2158 -9.31965 -4.50408 20.8809 +11 2046 272.038 253.956 10.1072 -10.0265 -4.83462 21.4343 +6 2047 402.79 386.902 58.4488 -6.99023 -3.86769 24.393 +7 2047 395.674 378.994 56.4471 -6.88772 -3.74864 23.2356 +8 2047 387.888 370.792 52.0791 -6.96477 -3.79467 22.6703 +6 2048 340.438 325.458 88.9231 -9.65044 -3.00968 25.8737 +7 2048 331.19 315.859 88.4885 -9.75306 -2.95587 25.2801 +6 2049 375.187 359.027 18.259 -7.79019 -5.13851 23.9829 +7 2049 366.673 350.408 15.1086 -8.0214 -5.2096 23.829 +6 2051 391.303 375.856 43.8927 -7.58939 -4.48435 25.0899 +7 2051 383.823 367.202 41.769 -7.29513 -4.23628 23.318 +8 2051 375.237 358.24 36.6604 -7.40494 -4.30393 22.8017 +6 2054 513.139 498.333 11.4877 -3.49817 -5.85444 26.1777 +7 2054 510.598 494.296 8.85451 -3.26069 -5.40365 23.7741 +6 2058 475.505 461.094 26.0955 -4.99651 -5.47003 26.8934 +7 2058 471.181 456.445 23.9549 -5.04387 -5.42737 26.3 +8 2058 467.089 451.762 19.9383 -4.99284 -5.3589 25.2861 +6 2059 479.514 465.98 36.4002 -5.16124 -5.41558 28.6364 +7 2059 475.808 461.797 34.3797 -5.12737 -5.30844 27.6603 +6 2060 512.662 497.746 79.9801 -3.4896 -3.34469 25.9849 +7 2060 509.787 494.38 79.15 -3.47844 -3.26687 25.1555 +6 2063 429.293 414.475 39.1107 -6.53456 -4.84812 26.1553 +7 2063 423.449 408.159 37.1539 -6.53855 -4.7675 25.3495 +8 2063 417.256 400.795 32.0456 -6.2751 -4.59476 23.5447 +9 2063 410.459 393.115 24.7107 -6.16613 -4.588 22.346 +10 2063 402.798 383.779 16.2075 -5.83972 -4.42429 20.3789 +11 2063 394.317 374.074 8.19564 -5.71148 -4.36922 19.1461 +6 2064 427.849 411.914 46.3855 -6.12503 -4.26297 24.3214 +7 2064 421.402 404.888 44.1088 -6.12035 -4.1878 23.47 +8 2064 414.665 397.426 39.1905 -6.07273 -4.16484 22.4825 +9 2064 407.374 389.454 32.0309 -6.06069 -4.2213 21.6288 +6 2067 473.023 457.262 72.4456 -4.6533 -3.42202 24.5907 +7 2067 468.035 452.117 70.9058 -4.77557 -3.44013 24.3475 +8 2067 463.028 447.02 66.8419 -4.9168 -3.5572 24.2109 +6 2069 538.074 523.345 20.8788 -2.60692 -5.54225 26.3131 +7 2069 536.577 520.763 17.8969 -2.47898 -5.2634 24.5084 +6 2073 454.699 439.755 86.2852 -5.56658 -3.11177 25.9362 +7 2073 449.834 434.238 85.9411 -5.50112 -2.99338 24.8506 +6 2076 510.207 495.3 58.653 -3.58011 -4.11516 26.0002 +7 2076 507.184 491.841 57.0741 -3.58396 -4.05324 25.2597 +6 2078 536.267 522.393 105.962 -2.83774 -2.58991 27.9365 +7 2078 533.997 520.358 106.53 -2.97603 -2.61219 28.4178 +8 2078 532.278 517.74 104.837 -2.85527 -2.51301 26.6583 +6 2079 489.454 474.843 122.61 -4.41557 -1.84716 26.5267 +7 2079 485.907 470.636 123.229 -4.34943 -1.74555 25.3799 +8 2079 482.099 466.584 121.77 -4.41302 -1.76868 24.9815 +9 2079 478.114 462.048 118.301 -4.39468 -1.82391 24.1236 +6 2080 419.932 404.725 13.2286 -6.69794 -5.63822 25.4859 +7 2080 413.502 397.6 9.92688 -6.62237 -5.50331 24.3719 +6 2084 467.541 452.54 101.329 -5.08526 -2.56112 25.8362 +7 2084 463.237 447.867 101.391 -5.11351 -2.49742 25.2155 +8 2084 458.53 443.329 99.0937 -5.33691 -2.60646 25.4969 +9 2084 453.749 437.78 94.7034 -5.24089 -2.6287 24.2699 +6 2090 666.126 652.438 89.8262 2.21984 -3.25828 28.3154 +7 2090 668.716 654.464 89.4 2.22957 -3.14529 27.194 +8 2090 671.576 656.759 86.7025 2.24828 -3.12321 26.1576 +9 2090 674.867 659.603 82.0994 2.2982 -3.19368 25.3911 +10 2090 678.179 662.121 76.2454 2.29532 -3.23154 24.1353 +11 2090 681.584 664.996 71.5825 2.33227 -3.27933 23.3646 +12 2090 685.4 667.826 66.2498 2.31805 -3.25831 22.0535 +13 2090 689.514 671.156 61.3688 2.33941 -3.26196 21.1116 +14 2090 693.781 674.404 57.4242 2.33472 -3.19985 20.0019 +15 2090 698.951 678.662 53.2746 2.36657 -3.16576 19.1021 +16 2090 704.495 683.086 48.2533 2.38187 -3.12614 18.1028 +17 2090 711.076 688.513 42.3819 2.41684 -3.1062 17.1779 +18 2090 718.205 694.346 36.0791 2.44606 -3.07937 16.2448 +6 2092 657.485 643.168 42.8839 1.79806 -4.87612 27.0701 +7 2092 660.12 644.878 40.5299 1.78186 -4.66333 25.4283 +6 2096 666.141 656.479 17.2601 3.14566 -8.65028 40.1141 +7 2096 667.815 657.844 16.5925 3.13848 -8.41852 38.8725 +8 2096 669.725 659.499 12.597 3.16023 -8.4175 37.8988 +9 2096 671.92 662.026 6.88308 3.38571 -9.011 39.1742 +6 2101 691.715 677.821 70.9974 3.17626 -3.93795 27.8959 +7 2101 695.049 680.952 69.4912 3.2576 -3.93868 27.4945 +8 2101 698.871 684.058 66.0577 3.23862 -3.87266 26.1645 +9 2101 703.247 687.877 60.6209 3.2742 -3.92234 25.2164 +10 2101 707.159 691.82 54.4319 3.41794 -4.14716 25.2684 +6 2102 662.281 648.482 95.5104 2.05226 -3.01071 28.0869 +7 2102 664.557 650.501 95.3702 2.10176 -2.96105 27.5737 +8 2102 667.193 652.528 92.9465 2.11103 -2.92686 26.4286 +9 2102 670.143 655.156 88.5538 2.17145 -3.02151 25.8615 +6 2109 725.93 713.253 98.9409 4.93081 -3.1318 30.5726 +7 2109 730.323 717.166 98.7499 4.93046 -3.02548 29.4585 +8 2109 735.195 721.217 96.4874 4.82809 -2.93472 27.7283 +6 2110 721.969 709.315 108.024 4.77169 -2.75195 30.6285 +7 2110 726.348 713.643 108.477 4.93759 -2.72173 30.5052 +6 2112 709.133 695.995 27.8974 4.07098 -5.92639 29.4993 +7 2112 713.044 699.371 25.362 4.06537 -5.79418 28.3454 +6 2115 723.112 710.791 50.5712 4.95054 -5.33114 31.4568 +7 2115 727.255 714.023 48.5725 4.77761 -5.04493 29.2892 +8 2115 731.946 717.997 44.5132 4.71275 -4.94203 27.7843 +9 2115 737.301 722.6 37.846 4.66722 -4.93269 26.3623 +10 2115 742.45 727.699 29.8792 4.83897 -5.20615 26.2734 +11 2115 748.437 732.679 23.0123 4.73409 -5.10785 24.596 +12 2115 753.953 737.874 15.4455 4.82352 -5.25827 24.1031 +13 2115 761.574 744.197 10.0749 4.69878 -5.03149 22.3027 +6 2119 773.446 737.356 35.8799 2.43927 -2.03871 10.7393 +7 2119 789.662 749.892 25.6815 2.43255 -1.98778 9.74541 +6 2122 900.37 888.794 69.8403 13.4937 -4.77986 33.4795 +7 2122 909.439 897.482 69.2137 13.4717 -4.65592 32.4143 +8 2122 919.29 906.991 66.5722 13.5277 -4.64192 31.5136 +9 2122 929.953 917.339 61.8504 13.6445 -4.72728 30.7279 +10 2122 941.154 927.966 56.1176 13.5061 -4.75477 29.3888 +6 2123 887.868 876.718 91.8122 13.407 -3.90404 34.7588 +7 2123 896.304 884.865 91.6761 13.4651 -3.81199 33.8823 +8 2123 905.486 893.745 89.8416 13.5376 -3.79751 33.0077 +6 2132 975.779 953.16 112.177 8.69707 -1.44097 17.1353 +7 2132 997.97 973.921 110.941 8.67518 -1.38283 16.1156 +8 2132 1023.09 997.506 107.414 8.68155 -1.37382 15.1477 +9 2132 1051.97 1024.85 101.906 8.76145 -1.40505 14.2893 +10 2132 1084.55 1055.29 94.8234 8.71832 -1.43223 13.2436 +11 2132 1121.88 1090.55 87.8273 8.78349 -1.45773 12.3703 +12 2132 1164.54 1131.11 79.399 8.9182 -1.50177 11.5947 +6 2133 1093.99 1059.79 80.1701 7.60818 -1.45565 11.3321 +7 2133 1138.56 1101.64 73.9184 7.69461 -1.43906 10.4951 +6 2136 995.349 979.131 55.1485 12.7781 -3.89862 23.8987 +7 2136 1012.1 994.825 52.6518 12.5194 -3.73844 22.4408 +8 2136 1030.6 1012.7 47.8807 12.6362 -3.75071 21.6548 +6 2145 1113.48 1079.75 80.804 8.02543 -1.466 11.4913 +7 2145 1159.23 1122.86 74.7814 8.11736 -1.4483 10.6554 +6 2150 129.994 101.261 206.034 -8.96513 0.620268 13.4886 +7 2150 95.2696 64.9797 211.426 -9.12024 0.684024 12.7955 +8 2150 55.2378 22.9293 215.039 -9.21597 0.701361 11.996 +6 2154 223.695 177.957 233.783 -4.53168 0.715558 8.4739 +7 2154 177.234 126.478 243.791 -4.57526 0.750721 7.63597 +6 2155 161.288 109.213 233.733 -4.62389 0.627959 7.44261 +7 2155 98.2502 39.2727 245.356 -4.65686 0.660329 6.57157 +6 2156 193.195 143.825 235.685 -4.53017 0.683616 7.85054 +7 2156 137.699 81.8722 246.828 -4.54007 0.711752 6.94238 +6 2159 254.266 241.675 131.339 -15.1573 -1.77109 30.7817 +7 2159 244.366 230.198 133.506 -13.8456 -1.49182 27.3558 +6 2164 376.402 363.022 188.849 -9.36052 0.642144 28.9674 +7 2164 369.542 355.655 192.131 -9.28378 0.745622 27.9089 +6 2165 377.474 363.077 149.646 -8.65886 -0.865856 26.9198 +7 2165 369.887 354.976 151.346 -8.63385 -0.774806 25.9924 +8 2165 361.944 346.18 150.799 -8.43741 -0.751504 24.5861 +9 2165 353.096 337.209 148.376 -8.67085 -0.827598 24.3947 +10 2165 343.61 326.877 145.291 -8.53774 -0.884838 23.1634 +11 2165 333.54 316.168 143.166 -8.53462 -0.917963 22.3102 +6 2169 398.098 373.894 199.807 -4.69289 0.598148 16.0128 +7 2169 386.432 360.839 203.978 -4.68305 0.653234 15.1438 +8 2169 372.261 345.394 206.224 -4.74433 0.667161 14.4258 +9 2169 357.759 330.106 206.882 -4.89115 0.660988 14.0157 +10 2169 339.551 310.992 207.039 -5.07838 0.642954 13.5709 +11 2169 322.138 289.831 208.35 -4.77873 0.590163 11.9964 +6 2174 380.577 365.655 132.075 -8.24294 -1.46797 25.9741 +7 2174 372.699 357.326 133.034 -8.27621 -1.39135 25.2115 +8 2174 364.501 348.565 131.765 -8.26038 -1.38502 24.3214 +9 2174 355.706 339.253 128.553 -8.28761 -1.44632 23.5562 +10 2174 345.822 328.959 124.337 -8.40121 -1.54548 22.9842 +11 2174 335.648 317.784 121.06 -8.23607 -1.55736 21.6955 +6 2175 555.113 549.179 127.683 -4.92903 -4.08929 65.3207 +7 2175 554.742 549.106 129.779 -5.22465 -4.10546 68.77 +6 2177 485.932 471.724 135.2 -4.67409 -1.42362 27.2798 +7 2177 482.179 467.527 136.459 -4.67007 -1.33434 26.4532 +6 2178 485.932 471.724 135.2 -4.67409 -1.42362 27.2798 +7 2178 482.179 467.527 136.459 -4.67007 -1.33434 26.4532 +8 2178 478.19 462.956 135.496 -4.63197 -1.31723 25.4409 +9 2178 474.3 458.421 132.746 -4.57526 -1.35669 24.4067 +10 2178 469.739 453.169 128.953 -4.53246 -1.4231 23.3896 +11 2178 464.87 447.595 126.241 -4.49899 -1.4494 22.4356 +12 2178 459.025 441.184 123.951 -4.5321 -1.4723 21.7232 +13 2178 453.275 434.33 121.676 -4.4312 -1.45107 20.4581 +14 2178 446.693 426.939 120.673 -4.42871 -1.41891 19.6202 +6 2180 520.093 516.041 156.722 -11.8586 -2.13827 95.6386 +7 2180 519.896 515.856 159.134 -11.92 -1.82394 95.9232 +6 2182 453.089 437.552 200.35 -5.40962 0.95062 24.9455 +7 2182 448.227 432.024 204.685 -5.34843 1.05525 23.9201 +6 2183 452.202 435.027 226.76 -4.92127 1.6859 22.5657 +7 2183 445.871 428.354 231.516 -5.01947 1.79886 22.1258 +6 2184 548.876 528.118 240.202 -1.57029 1.74275 18.6711 +7 2184 546.417 524.262 246.717 -1.53089 1.79081 17.4937 +8 2184 543.652 519.988 251.288 -1.49599 1.78034 16.3778 +9 2184 540.859 515.914 254.726 -1.47937 1.76299 15.5373 +6 2188 478.15 463.917 144.577 -4.95958 -1.06721 27.2319 +7 2188 474.288 459.541 146.173 -4.9271 -0.971818 26.2812 +6 2190 452.929 445.482 162.551 -11.2987 -0.743204 52.0487 +7 2190 448.971 443.3 164.716 -15.2095 -0.770715 68.3378 +6 2191 693.774 680.61 138.262 3.43638 -1.41152 29.4423 +7 2191 696.943 683.512 139.528 3.49481 -1.33285 28.857 +6 2193 612.249 606.879 175.354 0.269066 0.25008 72.1724 +7 2193 612.864 607.463 177.862 0.328648 0.498026 71.7557 +6 2194 567.865 551.004 224.507 -1.32828 1.64553 22.9863 +7 2194 566.681 549.449 229.112 -1.33666 1.75373 22.4926 +6 2195 556.191 551.056 151.822 -5.58316 -2.20029 75.484 +7 2195 556.207 550.95 154.163 -5.45152 -1.9098 73.726 +8 2195 556.361 551.141 154.253 -5.47495 -1.91437 74.2571 +9 2195 556.35 551.078 152.558 -5.42143 -2.06788 73.516 +10 2195 556.293 550.476 150.018 -4.91864 -2.10873 66.627 +6 2196 629.382 620.345 132.151 1.17822 -2.41926 42.8861 +7 2196 630.406 621.548 133.77 1.26421 -2.37019 43.7567 +8 2196 632.526 622.298 133.202 1.20613 -2.08239 37.8927 +6 2198 655.119 641.156 127.899 1.75266 -1.72938 27.757 +7 2198 656.668 642.087 128.774 1.73545 -1.62389 26.581 +8 2198 659.225 643.579 127.632 1.70504 -1.55247 24.7704 +6 2199 602.863 597.382 141.459 -0.656162 -3.07647 70.7042 +7 2199 603.442 597.648 143.484 -0.567232 -2.72319 66.9008 +8 2199 604.154 598.042 143.307 -0.475118 -2.59703 63.4184 +9 2199 604.491 598.661 140.839 -0.46697 -2.94958 66.4763 +10 2199 604.831 599.091 137.743 -0.442485 -3.28581 67.5239 +11 2199 605.672 599.634 136.304 -0.345775 -3.25129 64.1837 +6 2202 736.66 722.695 203.648 4.88867 1.18441 27.7524 +7 2202 741.732 727.711 207.191 5.06356 1.31545 27.6423 +8 2202 747.566 732.716 209.083 4.99189 1.31047 26.099 +9 2202 753.526 738.164 209.287 5.03395 1.27391 25.2293 +6 2204 819.131 783.245 211.257 3.13692 0.574829 10.8001 +7 2204 839.894 800.653 217.398 3.15289 0.609734 9.8766 +6 2207 732.641 701.161 246.951 2.10017 1.26433 12.3118 +7 2207 743.342 710.559 254.384 2.19208 1.3359 11.8227 +8 2207 754.588 720.938 260.751 2.31506 1.40308 11.5177 +9 2207 766.369 731.802 265.883 2.43678 1.44565 11.2125 +10 2207 779.744 743.104 271.32 2.49492 1.44351 10.5778 +11 2207 795.713 757.219 279.099 2.59763 1.48257 10.0685 +12 2207 814.604 773.16 288.564 2.65758 1.49972 9.35184 +6 2208 698.504 672.182 251.147 1.81512 1.59775 14.7246 +7 2208 705.416 677.126 258.962 1.82004 1.63494 13.6999 +6 2216 710.672 706.428 153.907 12.798 -2.39813 91.3264 +7 2216 712.456 707.905 156.36 12.143 -1.94645 85.1494 +6 2219 701.519 684.351 186.626 2.87725 0.430897 22.5756 +7 2219 705.7 688.793 189.286 3.05445 0.522055 22.9238 +8 2219 710.226 692.843 189.959 3.11058 0.528541 22.2953 +6 2221 860.834 844.925 162.191 8.484 -0.360038 24.3619 +7 2221 871.739 855.152 164.155 8.49041 -0.281705 23.3663 +8 2221 883.633 866.345 164.232 8.51567 -0.267879 22.4187 +6 2224 918.28 840.415 250.204 2.1297 0.533595 4.9775 +7 2224 988.614 894.735 271.097 2.16885 0.562123 4.12846 +6 2228 1083.72 1060.97 140.869 11.1954 -0.755208 17.0362 +7 2228 1113.01 1089.14 141.112 11.3294 -0.714312 16.2371 +6 2229 1048.35 1025.91 166.854 10.5047 -0.143641 17.2738 +7 2229 1074.8 1051.32 168.894 10.6438 -0.0905984 16.5075 +8 2229 1104.57 1079.74 169.258 10.7077 -0.0777888 15.6078 +9 2229 1138.24 1112.39 167.725 10.9878 -0.106602 14.9961 +6 2260 180.334 129.964 275.35 -4.57734 1.09303 7.69461 +7 2260 120.919 62.8745 292.711 -4.52197 1.10918 6.67725 +6 2262 225.138 178.825 283.781 -4.45866 1.28657 8.36865 +7 2262 178.159 126.354 300.323 -4.47304 1.32168 7.48137 +8 2262 118.237 59.2508 318.462 -4.4742 1.32597 6.57064 +6 2265 192.237 142.664 316.124 -4.52197 1.55243 7.81835 +7 2265 136.55 80.0387 338.376 -4.49604 1.57332 6.85835 +6 2266 181.404 131.843 320.181 -4.64039 1.59675 7.8201 +7 2266 124.051 67.74 342.875 -4.63123 1.62182 6.88271 +6 2271 184.303 133.646 261.37 -4.50928 0.938598 7.65094 +7 2271 126.433 69.1076 276.17 -4.527 0.968097 6.76097 +6 2286 294.289 257.574 272.019 -4.61255 1.45083 10.5564 +7 2286 264.591 225.301 284.195 -4.71624 1.52221 9.86451 +6 2291 514.381 478.379 284.518 -1.42007 1.66603 10.7654 +7 2291 506.691 467.219 297.734 -1.39984 1.69939 9.81879 +8 2291 496.209 452.807 311.609 -1.40284 1.71725 8.92985 +6 2299 579.021 552.404 254.91 -0.616265 1.65591 14.5609 +7 2299 577.931 548.828 263.215 -0.583761 1.66777 13.3173 +8 2299 576.217 545.348 270.066 -0.580187 1.69158 12.5554 +9 2299 574.424 541.123 276.116 -0.566733 1.66563 11.6384 +10 2299 571.805 536.092 282.686 -0.567862 1.65197 10.8526 +11 2299 569.398 530.131 291.621 -0.549379 1.62466 9.87016 +12 2299 566.096 522.695 303.488 -0.537931 1.61681 8.93021 +13 2299 562.35 514.254 318.563 -0.527247 1.62732 8.05832 +14 2299 556.763 503.07 337.935 -0.52817 1.65147 7.21827 +6 2300 571.298 537.447 277.435 -0.607124 1.65948 11.4493 +7 2300 568.571 531.557 289.393 -0.594835 1.69123 10.4711 +8 2300 565.796 524.591 303.428 -0.570496 1.70217 9.40599 +6 2301 561.825 535.499 258.585 -0.973974 1.74927 14.7223 +7 2301 559.785 530.762 266.475 -0.921231 1.73274 13.3542 +8 2301 556.774 525.681 274.139 -0.911885 1.74974 12.4649 +9 2301 553.885 520.097 280.11 -0.885093 1.70512 11.4708 +10 2301 549.485 513.686 287.598 -0.901406 1.72171 10.8265 +11 2301 544.063 504.634 297.939 -0.892291 1.7041 9.82985 +6 2303 672.766 626.493 315.554 0.733723 1.65652 8.3759 +7 2303 681.71 629.301 336.302 0.739495 1.67524 7.39529 +6 2316 826.288 782.277 286.102 2.64513 1.38218 8.80624 +7 2316 853.258 803.686 301.963 2.64065 1.39899 7.81839 +6 2319 723.747 690.921 256.236 1.86855 1.36445 11.8072 +7 2319 733.893 698.378 265.767 1.8805 1.40526 10.913 +8 2319 746.568 707.161 275.059 1.86754 1.39314 9.83514 +9 2319 761.746 718.347 284.083 1.88362 1.37668 8.93047 +10 2319 780.016 732.033 294.288 1.90821 1.35941 8.07739 +6 2320 829.264 785.813 279.014 2.71602 1.31237 8.91976 +7 2320 856.102 807.133 294.273 2.70441 1.3319 7.91482 +8 2320 889.418 834.413 311.567 2.73293 1.35459 7.04609 +9 2320 932.674 869.663 332.006 2.75445 1.35672 6.15089 +6 2321 812.519 776.224 257.326 3.00369 1.25015 10.6784 +7 2321 834.176 794.055 267.988 3.00718 1.27365 9.65997 +7 2345 737.716 723.591 76.5932 4.8737 -3.66072 27.4395 +8 2345 742.823 728.242 73.8079 4.90951 -3.64892 26.5819 +9 2345 748.464 733.469 68.9689 4.97576 -3.7213 25.8464 +7 2348 200.571 185.158 164.427 -14.2537 -0.293703 25.1464 +8 2348 185.651 169.675 164.387 -14.2526 -0.284663 24.2595 +7 2352 473.952 458.957 143.206 -4.8579 -1.06208 25.8478 +8 2352 469.898 454.199 142.44 -4.77882 -1.04068 24.6889 +9 2352 465.247 449.252 139.962 -4.84612 -1.10452 24.2298 +7 2353 479.16 464.811 219.132 -4.88161 1.73243 27.0113 +8 2353 474.831 460.318 221.01 -4.98642 1.7823 26.7048 +9 2353 470.832 455.695 221.247 -4.92306 1.71733 25.6054 +10 2353 466.454 450.801 220.834 -4.91109 1.64658 24.7617 +11 2353 461.684 445.259 221.586 -4.83602 1.5937 23.5967 +12 2353 456.274 439.48 223.051 -4.90266 1.60551 23.0776 +7 2354 458.556 452.625 187.505 -13.6761 1.32696 65.3482 +8 2354 457.425 450.601 187.387 -11.9764 1.14409 56.8011 +7 2373 189.23 171.362 65.4947 -12.6359 -3.22744 21.6909 +8 2373 171.664 154.662 61.0097 -13.8346 -3.53353 22.7958 +9 2373 154.185 136.305 54.8355 -13.6801 -3.54544 21.676 +7 2375 204.974 188.577 105.035 -13.254 -2.22172 23.6371 +8 2375 190.122 172.834 102.714 -13.0326 -2.17937 22.4194 +7 2376 226.959 213.432 114.281 -15.1928 -2.32587 28.6517 +8 2376 214.765 200.617 112.135 -14.9891 -2.30532 27.3946 +9 2376 202.047 187.438 108.043 -14.9835 -2.38299 26.5296 +10 2376 187.768 170.605 102.928 -13.2008 -2.18847 22.582 +11 2376 170.903 153.454 99.3511 -13.5041 -2.2628 22.2126 +7 2380 196.294 180.781 34.3775 -14.3098 -4.7949 24.984 +8 2380 181.532 164.708 28.9245 -13.6655 -4.59518 23.0363 +7 2385 227.686 211.771 22.7174 -12.8883 -5.06713 24.352 +8 2385 214.651 198.502 18.6998 -13.1356 -5.12753 24 +7 2387 243.125 229.758 72.3502 -14.7255 -4.03885 28.9957 +8 2387 232.464 219.68 66.6107 -15.8449 -4.46416 30.3178 +7 2389 346.029 328.781 18.4135 -8.20724 -4.8098 22.4711 +8 2389 335.933 317.806 12.264 -8.10823 -4.75869 21.381 +7 2391 404.772 388.135 31.6923 -6.61171 -4.55752 23.2954 +8 2391 397.218 379.855 26.2419 -6.56938 -4.53586 22.3228 +9 2391 389.103 371.018 18.6022 -6.54782 -4.58147 21.4306 +10 2391 379.909 361.099 9.47332 -6.55818 -4.6657 20.6051 +7 2392 300.114 284.16 57.8377 -10.4189 -3.87255 24.2939 +8 2392 289.006 272.29 53.7301 -10.3006 -3.82792 23.1858 +9 2392 277.214 259.242 47.3994 -9.9334 -3.74969 21.5659 +10 2392 263.163 245.012 39.6095 -10.251 -3.94315 21.3527 +11 2392 248.915 229.996 32.8746 -10.2393 -3.97424 20.4856 +12 2392 233.01 212.79 26.5037 -10.0031 -3.8878 19.1677 +13 2392 215.363 194.805 19.6471 -10.2997 -4.00305 18.8526 +14 2392 197.388 175.319 13.7408 -10.032 -3.8727 17.5617 +15 2392 177.587 154.309 7.08925 -9.96781 -3.82504 16.6496 +7 2393 299.891 284.034 71.3477 -10.4901 -3.43854 24.4422 +8 2393 289.057 271.923 66.2443 -10.0472 -3.34204 22.6191 +9 2393 276.845 259.527 61.2144 -10.3199 -3.46275 22.3801 +10 2393 262.898 244.975 54.6881 -10.3891 -3.54132 21.6238 +11 2393 248.269 229.735 48.6017 -10.4706 -3.60097 20.9109 +7 2396 341.786 326.969 39.8496 -9.70755 -4.82179 26.1578 +8 2396 333.735 318.305 36.2983 -9.60234 -4.75394 25.119 +7 2399 341.697 326.176 96.2581 -9.27061 -2.65095 24.9721 +8 2399 332.09 316.363 93.8092 -9.47688 -2.69975 24.6439 +7 2400 372.05 355.839 98.4407 -7.86979 -2.46566 23.9079 +8 2400 363.45 346.778 95.9434 -7.92907 -2.47788 23.2463 +9 2400 353.724 336.848 90.7656 -8.14344 -2.61293 22.9671 +10 2400 343.609 326.484 84.74 -8.34208 -2.76388 22.6325 +11 2400 333.069 315.136 79.563 -8.28193 -2.79441 21.6127 +12 2400 321.334 302.101 75.7761 -8.04969 -2.71124 20.1515 +13 2400 308.561 288.311 71.6365 -7.98405 -2.68482 19.139 +14 2400 294.231 273.153 67.729 -8.03587 -2.67902 18.3878 +15 2400 279.314 256.843 63.7476 -7.89396 -2.60801 17.2472 +16 2400 262.505 238.975 59.6325 -7.92277 -2.58469 16.4717 +17 2400 244.351 219.643 53.9833 -7.93948 -2.58421 15.686 +7 2401 372.05 355.839 98.4407 -7.86979 -2.46566 23.9079 +8 2401 363.45 346.778 95.9434 -7.92907 -2.47788 23.2463 +7 2402 316.262 301.112 87.151 -10.3992 -3.03871 25.583 +8 2402 306.084 290.382 83.6732 -10.3816 -3.0508 24.6832 +7 2403 331.19 315.859 88.4885 -9.75306 -2.95587 25.2801 +8 2403 321.464 305.409 85.4978 -9.6388 -2.92267 24.1404 +9 2403 310.979 294.47 80.6148 -9.71483 -3.00117 23.4765 +10 2403 299.393 282.067 74.3987 -9.61554 -3.05224 22.3686 +7 2407 525.288 510.077 52.8609 -2.97588 -4.23732 25.4797 +8 2407 522.661 507.292 49.0978 -3.03715 -4.32533 25.2181 +7 2411 525.279 510.634 86.9426 -3.09134 -3.15115 26.4654 +8 2411 522.905 507.538 83.9799 -3.02911 -3.10669 25.2221 +9 2411 520.551 504.697 79.0079 -3.0157 -3.1796 24.4464 +7 2412 477.829 462.197 88.0338 -4.52626 -2.91444 24.7922 +8 2412 473.815 457.298 84.953 -4.41474 -2.85875 23.4661 +9 2412 469.004 452.049 80.0816 -4.45273 -2.939 22.8581 +10 2412 463.69 445.977 74.0752 -4.42364 -2.99556 21.8813 +11 2412 457.791 439.328 68.9725 -4.41537 -3.0222 20.9916 +7 2417 490.804 475.097 90.3469 -4.06122 -2.82159 24.6753 +8 2417 487.068 470.768 87.5672 -4.03662 -2.81057 23.7778 +9 2417 482.894 466.203 82.6486 -4.07621 -2.9029 23.2198 +10 2417 478.265 461.015 76.6534 -4.08837 -2.99559 22.4679 +11 2417 473.826 455.613 71.6251 -4.00311 -2.98549 21.2799 +7 2419 539.564 526.943 34.2628 -2.9792 -5.89881 30.7105 +8 2419 538.947 525.179 28.5442 -2.75492 -5.63019 28.1505 +9 2419 537.86 523.479 21.5735 -2.67807 -5.65055 26.9505 +10 2419 536.104 521.475 13.9937 -2.69711 -5.83301 26.4933 +7 2420 450.126 434.276 70.3935 -5.40294 -3.47223 24.4518 +8 2420 444.856 427.947 66.4348 -5.23199 -3.38054 22.9205 +9 2420 438.871 421.436 60.5732 -5.25879 -3.45929 22.2301 +7 2423 507.62 492.244 80.5246 -3.56113 -3.22543 25.2061 +8 2423 504.384 488.324 77.4386 -3.51788 -3.19143 24.1338 +9 2423 501.353 484.61 72.0816 -3.47162 -3.23311 23.1493 +10 2423 497.471 479.99 65.7818 -3.44418 -3.29005 22.171 +11 2423 493.312 475.411 60.2387 -3.48831 -3.37931 21.6516 +7 2424 432.751 416.142 84.8063 -5.71826 -2.8476 23.3357 +8 2424 426.619 408.556 81.5232 -5.44018 -2.71595 21.4567 +7 2425 418.429 402.218 26.5005 -6.3329 -4.84928 23.9074 +8 2425 411.714 394.847 20.9372 -6.30043 -4.83783 22.9776 +7 2430 562.223 547.395 35.6788 -1.71484 -4.96939 26.1389 +8 2430 561.574 545.753 30.6156 -1.62917 -4.82921 24.4973 +7 2431 558.321 542.941 63.2431 -1.78946 -3.82808 25.1992 +8 2431 557.108 541.166 59.4752 -1.76728 -3.82019 24.3115 +9 2431 556.042 539.36 53.4668 -1.72332 -3.84438 23.2342 +7 2436 670.295 656.075 105.169 2.29423 -2.55674 27.2553 +8 2436 673.077 658.457 103.179 2.33372 -2.55997 26.5103 +9 2436 676.292 661.163 99.1996 2.36939 -2.61516 25.6188 +10 2436 679.418 663.753 94.4252 2.39548 -2.68936 24.7418 +11 2436 682.937 666.583 90.5187 2.41005 -2.70425 23.6984 +7 2437 670.295 656.075 105.169 2.29423 -2.55674 27.2553 +8 2437 673.077 658.457 103.179 2.33372 -2.55997 26.5103 +9 2437 676.292 661.163 99.1996 2.36939 -2.61516 25.6188 +7 2440 651.4 636.897 111.183 1.54963 -2.28405 26.7231 +8 2440 653.785 638.602 109.51 1.56456 -2.24087 25.5254 +9 2440 656.482 641.668 106.009 1.70136 -2.42369 26.1618 +7 2443 807.201 767.448 27.5698 2.67061 -1.96314 9.7497 +8 2443 829.081 785.001 12.8959 2.67504 -1.94921 8.79249 +7 2444 737.294 723.607 43.8264 5.01311 -5.06386 28.3177 +8 2444 742.347 728.046 39.786 4.98742 -4.99794 27.1005 +9 2444 748.094 732.95 33.5938 4.91364 -4.93936 25.5919 +10 2444 754.166 738.209 25.9352 4.86791 -4.94574 24.2892 +11 2444 760.542 744.01 19.0734 4.90571 -4.99662 23.4441 +7 2445 713.943 699.492 74.3513 3.87976 -3.66116 26.8182 +8 2445 718.156 703.444 71.0328 3.96485 -3.71747 26.3432 +7 2448 716.671 702.567 95.3216 4.07946 -2.95291 27.4806 +8 2448 721.074 706.478 92.9739 4.10395 -2.93975 26.554 +9 2448 725.99 711.201 88.7028 4.22889 -3.05648 26.2072 +7 2449 716.671 702.567 95.3216 4.07946 -2.95291 27.4806 +8 2449 721.074 706.478 92.9739 4.10395 -2.93975 26.554 +9 2449 725.99 711.201 88.7028 4.22889 -3.05648 26.2072 +10 2449 730.118 715.676 83.4813 4.4839 -3.324 26.8358 +11 2449 736.064 720.418 78.9572 4.34305 -3.22358 24.7712 +12 2449 741.596 725.045 74.3629 4.28516 -3.19646 23.417 +13 2449 747.515 729.993 70.0984 4.2292 -3.1501 22.1196 +14 2449 753.991 735.83 66.6572 4.27179 -3.14093 21.3406 +15 2449 760.951 742.077 62.9975 4.30855 -3.12647 20.5347 +7 2452 732.755 718.701 57.1309 4.70862 -4.42302 27.5777 +8 2452 737.969 723.06 53.5086 4.62627 -4.29969 25.9951 +9 2452 743.643 728.367 47.6578 4.7147 -4.40219 25.371 +10 2452 749.562 733.67 40.7496 4.73196 -4.46499 24.3872 +11 2452 755.969 739.307 34.5283 4.71986 -4.45924 23.2604 +12 2452 762.262 744.573 28.2165 4.63703 -4.39212 21.9105 +13 2452 769.753 751.58 21.7542 4.73498 -4.46619 21.3271 +14 2452 777.564 758.793 15.6273 4.80758 -4.49915 20.6473 +7 2455 706.69 693.374 52.3447 3.91811 -4.86115 29.1057 +8 2455 711.013 697.569 50.0104 4.05356 -4.90821 28.829 +7 2459 901.66 889.835 24.3414 13.2684 -6.74604 32.7751 +8 2459 911.037 898.93 20.6083 13.376 -6.75488 32.0134 +7 2464 1006.69 989.561 60.1087 12.4542 -3.53574 22.6277 +8 2464 1024.86 1007.16 55.8747 12.6034 -3.55001 21.8968 +9 2464 1045.25 1026.68 49.198 12.5977 -3.57539 20.8626 +10 2464 1067.04 1047.81 41.4239 12.7767 -3.6706 20.1512 +11 2464 1091.06 1070.71 33.7748 12.7075 -3.67049 19.0424 +12 2464 1116.7 1095.77 25.3878 13.0145 -3.78434 18.5164 +7 2467 1102.82 1078.33 108.705 10.8184 -1.40694 15.8251 +8 2467 1136.04 1110.16 105.019 10.9299 -1.40829 14.9794 +9 2467 1174.02 1146.58 99.049 11.0528 -1.4452 14.1287 +10 2467 1217.57 1188.24 91.3797 11.1367 -1.49234 13.2162 +7 2472 1092.57 1068.77 107.222 10.9007 -1.48117 16.2837 +8 2472 1124.93 1099.04 103.403 10.6921 -1.44085 14.9693 +7 2473 1090.75 1065.84 124.782 10.3741 -1.03639 15.5557 +8 2473 1123.01 1097 121.835 10.6044 -1.0537 14.902 +7 2474 1102.92 1083.63 16.818 13.7357 -4.34421 20.0884 +8 2474 1128.91 1108.71 9.30908 13.8111 -4.34912 19.1877 +7 2475 1110.61 1086.26 96.3278 11.0548 -1.68843 15.9195 +8 2475 1144.17 1118.36 92.0628 11.1262 -1.68142 15.0166 +7 2476 1039.39 1014.32 115.512 9.21184 -1.22892 15.4636 +8 2476 1068.14 1041.64 112.409 9.29504 -1.22517 14.625 +9 2476 1100.93 1072.92 107.031 9.42353 -1.26234 13.8376 +7 2478 976.079 960.706 65.3416 12.8068 -3.75667 25.2118 +8 2478 991.984 975.555 61.2477 12.503 -3.64885 23.5899 +9 2478 1009.29 992.438 55.1905 12.7433 -3.7511 23.0026 +10 2478 1027.05 1009.02 46.631 12.4386 -3.76064 21.4972 +7 2493 208.006 192.5 170.432 -13.9099 -0.0838986 24.9943 +8 2493 193.207 177.678 170.832 -14.4022 -0.0699357 24.9589 +9 2493 178.203 162.291 169.117 -14.5614 -0.126139 24.3572 +10 2493 161.771 144.986 166.458 -14.3304 -0.20469 23.0911 +7 2498 141.925 86.924 241.027 -4.56705 0.665793 7.04674 +8 2498 72.2684 8.32949 251.673 -4.51378 0.662155 6.06164 +7 2499 232.976 216.607 130.051 -12.3576 -1.40459 23.6773 +8 2499 218.721 202.691 128.439 -13.097 -1.48837 24.1788 +9 2499 204.077 188.104 125.024 -13.6354 -1.60841 24.2635 +10 2499 188.718 174.65 121.107 -16.0688 -1.97583 27.5501 +7 2501 264.078 228.97 209.013 -5.28578 0.553219 11.0394 +8 2501 233.448 191.297 211.931 -4.79303 0.497983 9.19501 +7 2503 238.597 194.914 230.826 -4.56156 0.712862 8.87245 +8 2503 196.213 147.611 237.712 -4.56841 0.716822 7.97461 +9 2503 143.279 88.452 244.552 -4.56828 0.702442 7.0691 +7 2506 190.11 173.138 153.695 -13.2755 -0.606387 22.8365 +8 2506 173.017 158.91 152.533 -16.6222 -0.773775 27.474 +9 2506 158.75 142.444 150.627 -14.851 -0.732232 23.7696 +7 2512 369.542 355.655 192.131 -9.28378 0.745622 27.9089 +8 2512 361.976 347.934 192.845 -9.47074 0.764709 27.6008 +9 2512 354.478 340.049 192.172 -9.49562 0.719142 26.8599 +7 2514 365.238 336.847 212.66 -4.62253 0.75313 13.6514 +8 2514 348.308 318.11 215.998 -4.64703 0.76743 12.8344 +9 2514 329.199 296.763 217.8 -4.6429 0.744323 11.949 +10 2514 306.432 271.16 219.46 -4.61631 0.709759 10.9882 +11 2514 280.333 240.327 222.561 -4.42042 0.667407 9.68787 +7 2517 278.803 245.009 206.851 -5.25733 0.540381 11.4687 +8 2517 250.813 214.823 209.765 -5.35438 0.550901 10.7691 +7 2528 526.753 520.731 197.668 -7.38637 2.21344 64.3613 +8 2528 526.08 520.061 198.334 -7.45019 2.27402 64.394 +9 2528 525.777 519.539 197.404 -7.21434 2.11394 62.1302 +10 2528 525.076 518.747 195.695 -7.16951 1.9384 61.2322 +11 2528 524.528 518.073 194.953 -7.0758 1.839 60.0424 +12 2528 523.627 517.037 194.876 -7.00423 1.79502 58.8117 +13 2528 522.887 516.262 195.304 -7.0272 1.82021 58.5007 +14 2528 522.204 515.263 196.684 -6.76018 1.8441 55.8376 +15 2528 521.674 514.897 198.507 -6.96598 2.03331 57.1904 +7 2533 547.457 541.01 140.317 -5.17399 -2.71079 60.1145 +8 2533 547.129 540.545 140.111 -5.09279 -2.67104 58.8602 +7 2534 514.821 507.701 188.546 -7.14681 1.18378 54.4311 +8 2534 514.514 507.292 189.001 -7.06906 1.20095 53.665 +7 2536 514.821 507.701 188.546 -7.14681 1.18378 54.4311 +8 2536 514.514 507.292 189.001 -7.06906 1.20095 53.665 +9 2536 513.643 507.241 187.78 -8.04692 1.2522 60.5337 +7 2537 468.9 449.425 237.356 -3.87959 1.77905 19.901 +8 2537 464.463 443.648 240.177 -3.74439 1.73735 18.6201 +9 2537 458.742 437.613 241.639 -3.83413 1.74867 18.3432 +10 2537 453.282 430.62 242.219 -3.7042 1.64413 17.1024 +11 2537 445.045 423.264 244.646 -4.05717 1.7705 17.7942 +7 2540 619.227 612.189 160.982 0.737863 -0.906033 55.0672 +8 2540 620.262 613.36 161.285 0.832914 -0.900299 56.1516 +9 2540 620.935 615.971 159.25 1.23102 -1.47219 78.0839 +10 2540 621.606 614.755 156.809 0.944578 -1.25805 56.5749 +11 2540 622.405 615.443 155.029 0.991072 -1.37521 55.6677 +12 2540 623.163 616.119 154.127 1.03736 -1.42808 55.0228 +7 2541 619.227 612.189 160.982 0.737863 -0.906033 55.0672 +8 2541 620.262 613.36 161.285 0.832914 -0.900299 56.1516 +9 2541 620.935 614.37 159.25 0.930768 -1.11311 59.0386 +10 2541 621.606 614.755 156.809 0.944578 -1.25805 56.5749 +11 2541 622.405 615.443 155.029 0.991072 -1.37521 55.6677 +12 2541 623.163 616.119 154.127 1.03736 -1.42808 55.0228 +7 2542 605.695 597.091 183.754 -0.241272 0.680534 45.0481 +8 2542 605.815 597.421 183.956 -0.239585 0.710466 46.1732 +9 2542 606.47 598.122 182.865 -0.19881 0.644233 46.4308 +7 2547 628.484 620.079 127.59 1.20946 -2.89277 46.1129 +8 2547 629.462 620.754 127.009 1.22764 -2.82781 44.5056 +9 2547 630.496 621.654 124.636 1.27192 -2.92922 43.8331 +10 2547 631.721 622.692 121.68 1.31854 -3.04471 42.9296 +11 2547 632.711 623.708 119.059 1.38129 -3.2096 43.0495 +12 2547 633.9 624.426 117.601 1.38011 -3.13286 40.9111 +13 2547 635.095 624.856 115.594 1.33958 -3.00375 37.8507 +7 2548 652.444 636.367 225.663 1.43287 1.76445 24.1081 +8 2548 655.347 638.462 228.494 1.45658 1.77001 22.9534 +9 2548 657.477 639.775 229.433 1.45401 1.71682 21.8941 +10 2548 661.415 641.601 230.584 1.40577 1.56503 19.5604 +7 2549 641.966 636.84 171.641 3.39589 -0.12715 75.609 +8 2549 643.53 637.859 172.203 3.2173 -0.0616831 68.3349 +7 2555 741.732 727.711 207.191 5.06356 1.31545 27.6423 +8 2555 747.566 732.716 209.083 4.99189 1.31047 26.099 +7 2557 704.033 690.921 128.193 3.87011 -1.82955 29.5577 +8 2557 708.193 694.163 127.365 3.7762 -1.74155 27.624 +7 2563 742.426 719.007 231.355 3.04746 1.3418 16.5493 +8 2563 747.532 726.82 233.371 3.57821 1.56947 18.7125 +7 2564 938.865 925.741 130.587 13.4782 -1.72997 29.532 +8 2564 950.753 937.244 129.647 13.5666 -1.71802 28.6899 +9 2564 963.43 949.575 127.126 13.7191 -1.77281 27.9732 +7 2570 870.724 853.714 156.515 8.24738 -0.515984 22.7857 +8 2570 882.555 865.452 156.295 8.57361 -0.520041 22.6603 +7 2572 909.486 880.174 194.39 5.49638 0.39466 13.2227 +8 2572 933.78 901.405 196.139 5.37926 0.386323 11.9713 +7 2574 937.587 915.526 168.31 7.987 -0.110646 17.5684 +8 2574 956.383 934.404 169.303 8.47621 -0.0867961 17.634 +9 2574 973.724 953.808 167.882 9.82222 -0.134104 19.4613 +7 2575 912.062 891.67 180.323 7.9681 0.196726 19.0057 +8 2575 928.327 907.54 181.752 8.23721 0.22994 18.6451 +7 2578 1093.21 1068.94 139.04 10.7026 -0.748256 15.9668 +8 2578 1125.22 1099.65 137.567 10.8344 -0.741411 15.16 +9 2578 1161.93 1134.93 134.046 10.9917 -0.772248 14.358 +10 2578 1203.66 1174.76 129.263 11.0444 -0.810366 13.4135 +7 2581 1057.97 1034.2 156.437 10.132 -0.370957 16.3034 +8 2581 1087.97 1062.63 156.361 10.142 -0.349653 15.2962 +9 2581 1121.75 1094.94 154.125 10.2639 -0.375309 14.4591 +10 2581 1160.03 1131.4 150.762 10.3284 -0.414517 13.5381 +7 2582 990.348 967.021 177.816 8.7684 0.114262 16.6148 +8 2582 1014.22 989.569 178.82 8.81704 0.129986 15.7213 +9 2582 1040.81 1015.02 177.818 8.97938 0.103367 15.0235 +10 2582 1070.45 1043.21 176.049 9.08971 0.0630043 14.2302 +7 2618 213.368 165.958 263.394 -4.48885 1.02582 8.17503 +8 2618 164.045 111.068 275.194 -4.51721 1.03766 7.31591 +9 2618 100.82 40.3329 288.321 -4.51781 1.0254 6.40755 +7 2620 196.14 147.081 279.109 -4.52662 1.16341 7.90027 +8 2620 142.232 87.0182 292.75 -4.54639 1.16641 7.01947 +7 2626 199.125 149.624 335.078 -4.45372 1.76033 7.82957 +8 2626 145.491 89.5544 356.947 -4.45634 1.7678 6.92876 +7 2627 228.303 177.865 338.246 -4.06026 1.76137 7.68416 +8 2627 176.78 119.066 361.025 -4.02793 1.75133 6.71544 +7 2631 145.953 90.9391 256.83 -4.52662 0.819936 7.04504 +8 2631 76.9287 13.3546 269.886 -4.5003 0.819846 6.09642 +7 2633 222.504 177.349 261.178 -4.6043 1.05068 8.5832 +8 2633 176.345 126.09 272.454 -4.63045 1.06459 7.71222 +7 2659 600.748 564.848 286.271 -0.131835 1.69699 10.7959 +8 2659 601.425 561.169 297.324 -0.108531 1.66083 9.62762 +9 2659 601.012 557.318 308.374 -0.105072 1.66602 8.87022 +7 2662 681.71 629.301 336.302 0.739495 1.67524 7.39529 +8 2662 693.123 632.329 359.802 0.73833 1.65179 6.37516 +7 2663 666.481 625.118 302.009 0.739192 1.67722 9.36998 +8 2663 674.134 627.628 317.219 0.745851 1.66745 8.33395 +9 2663 682.259 630.369 333.406 0.752569 1.66199 7.46914 +10 2663 693.076 634.039 353.907 0.759881 1.64732 6.56496 +7 2671 751.332 711.885 287.809 1.93051 1.56533 9.82516 +8 2671 766.997 723.34 300.049 1.93709 1.56499 8.87768 +9 2671 785.88 737.509 313.037 1.95801 1.55671 8.01254 +10 2671 809.622 754.532 329.144 1.95068 1.52388 7.03523 +7 2672 830.666 781.071 294.9 2.39472 1.32183 7.8147 +8 2672 861.374 805.349 311.551 2.4143 1.32977 6.91782 +7 2676 792.766 739.415 334.165 1.84455 1.6241 7.26454 +8 2676 820.869 759.306 358.119 1.84374 1.61649 6.29562 +7 2677 781.857 733.554 310.961 1.91603 1.53582 8.02386 +8 2677 806.01 750.73 329.693 1.90889 1.52399 7.01112 +9 2677 837.115 773.947 352.039 1.93502 1.5237 6.13559 +7 2680 750.695 714.062 267.396 2.06951 1.3863 10.5801 +8 2680 765.182 725.373 276.728 2.09985 1.40159 9.73581 +7 2682 771.632 731.163 283.529 2.15118 1.46898 9.57688 +8 2682 789.708 743.773 294.335 2.10658 1.42054 8.43732 +7 2684 871.374 821.019 289.485 2.79281 1.24412 7.69673 +8 2684 908.553 850.918 305.78 2.78661 1.23886 6.72471 +7 2686 892.993 841.299 292.819 2.94518 1.24657 7.49756 +8 2686 934.21 875.154 310.055 2.95292 1.24794 6.56288 +9 2686 988.625 919.897 331.209 2.96261 1.23763 5.63922 +10 2686 1063.7 981.423 359.945 2.96498 1.22148 4.71079 +8 2705 526.228 518.639 118.091 -5.89835 -3.87622 51.0719 +9 2705 525.393 517.984 115.35 -6.10212 -4.16909 52.3118 +8 2711 403.779 388.385 168.783 -7.18045 -0.142046 25.1771 +9 2711 396.681 381.299 167.398 -7.43372 -0.19051 25.1961 +10 2711 389.237 374.769 164.974 -8.18001 -0.292554 26.7889 +8 2719 484.303 437.315 323.05 -1.43188 1.71697 8.2483 +9 2719 470.036 416.8 340.367 -1.4078 1.69022 7.28036 +10 2719 451.226 389.921 362.336 -1.3873 1.66022 6.32203 +8 2722 844.003 787.552 325.072 2.23082 1.44841 6.8657 +9 2722 881.388 816.395 346.746 2.2466 1.43717 5.96333 +8 2731 233.898 219.871 50.7938 -14.3862 -4.67438 27.6318 +9 2731 222.079 207.42 44.3823 -14.198 -4.70746 26.4386 +8 2742 166.227 149.63 113.107 -14.3485 -1.93371 23.3527 +9 2742 148.879 131.905 109.049 -14.5782 -2.0191 22.833 +10 2742 129.897 112.023 104.165 -14.4149 -2.06426 21.6838 +11 2742 109.32 90.6973 99.8983 -14.4288 -2.10432 20.8119 +12 2742 86.377 66.6449 96.7544 -14.2421 -2.07159 19.6418 +13 2742 61.5518 41.3502 92.9106 -14.5712 -2.12565 19.1853 +8 2746 169.002 152.89 38.7737 -14.6874 -4.47001 24.0549 +9 2746 152.722 136.227 31.9312 -14.8765 -4.58901 23.4962 +10 2746 134.141 120.02 24.1187 -18.0844 -5.65774 27.4466 +8 2752 259.739 242.506 34.4545 -10.9037 -4.31382 22.4899 +9 2752 246.024 228.527 26.7544 -11.1602 -4.48514 22.1506 +10 2752 230.589 212.296 18.2403 -11.1278 -4.53997 21.1868 +8 2754 274.864 258.764 29.4761 -11.1669 -4.78372 24.0737 +9 2754 262.735 246.905 22.0774 -11.7684 -5.11613 24.4831 +8 2759 323.804 305.673 13.6857 -8.46604 -4.71566 21.3769 +9 2759 311.867 293.073 5.15347 -8.50876 -4.79327 20.6232 +8 2760 323.804 305.673 13.6857 -8.46604 -4.71566 21.3769 +9 2760 311.867 293.073 5.15347 -8.50876 -4.79327 20.6232 +8 2761 334.766 316.446 17.8184 -8.05707 -4.54572 21.1558 +9 2761 323.039 304.137 8.96567 -8.14234 -4.65737 20.5046 +8 2762 285 268.593 23.6877 -10.626 -4.88367 23.623 +9 2762 272.702 254.695 16.0934 -10.0482 -4.67606 21.523 +8 2765 385.255 367.777 46.5672 -6.89328 -3.88102 22.1742 +9 2765 376.402 358.723 39.5457 -7.08435 -4.05049 21.9235 +8 2766 285.101 267.772 47.523 -10.0576 -3.88503 22.3663 +9 2766 272.508 254.328 40.8355 -9.95857 -3.90064 21.3187 +8 2767 311.333 294.064 60.5025 -9.27632 -3.49469 22.4434 +9 2767 300.388 281.346 54.5457 -8.72105 -3.33722 20.353 +8 2771 379.226 362.91 109.879 -7.58291 -2.07324 23.7541 +9 2771 370.801 354.174 105.899 -7.71342 -2.16307 23.3102 +10 2771 361.434 344.1 100.778 -7.68929 -2.23358 22.3601 +11 2771 351.793 333.402 96.8926 -7.52845 -2.21857 21.0736 +8 2776 354.002 338.217 89.9434 -8.69692 -2.82154 24.5548 +9 2776 344.305 328.254 85.0143 -8.8768 -2.93958 24.1464 +10 2776 333.727 317.93 79.1998 -9.37918 -3.18454 24.5345 +11 2776 323.638 305.411 74.0651 -8.42576 -2.91119 21.2629 +8 2777 369.139 351.821 21.1346 -7.45744 -4.70608 22.3809 +9 2777 360.109 342.112 13.1938 -7.44516 -4.76526 21.5352 +8 2783 497.805 481.582 61.7483 -3.70023 -3.67875 23.8903 +9 2783 494.21 477.426 56.0019 -3.69158 -3.73968 23.0918 +10 2783 490.039 472.499 48.9954 -3.66023 -3.79309 22.0966 +8 2792 546.915 534.266 101.205 -2.66016 -3.04256 30.6397 +9 2792 545.957 532.473 97.2767 -2.53359 -3.01061 28.7424 +8 2793 442.165 426.049 104.01 -5.57929 -2.29458 24.049 +9 2793 436.38 419.715 99.6435 -5.58216 -2.35982 23.2576 +8 2794 442.165 426.049 104.01 -5.57929 -2.29458 24.049 +9 2794 436.38 419.715 99.6435 -5.58216 -2.35982 23.2576 +8 2795 444.856 427.947 66.4348 -5.23199 -3.38054 22.9205 +9 2795 438.871 421.436 60.5732 -5.25879 -3.45929 22.2301 +8 2798 536.134 520.746 63.3993 -2.56294 -3.82058 25.1857 +9 2798 534.187 517.991 57.7239 -2.49987 -3.8185 23.9311 +10 2798 531.804 514.874 50.8846 -2.46703 -3.86984 22.8929 +11 2798 529.267 511.564 44.8181 -2.43613 -3.88473 21.8922 +12 2798 526.3 507.509 38.683 -2.37996 -3.83527 20.6251 +13 2798 523.209 503.553 32.6603 -2.3597 -3.83109 19.7176 +14 2798 519.984 499.409 27.2465 -2.33852 -3.80133 18.837 +8 2799 516.439 500.946 34.7371 -3.22836 -4.78836 25.0149 +9 2799 513.75 497.787 27.8829 -3.22411 -4.87846 24.2806 +10 2799 510.84 494.309 19.9813 -3.20774 -4.96739 23.4454 +8 2800 516.439 500.946 34.7371 -3.22836 -4.78836 25.0149 +9 2800 513.75 497.787 27.8829 -3.22411 -4.87846 24.2806 +10 2800 510.84 494.309 19.9813 -3.20774 -4.96739 23.4454 +8 2801 440.624 423.602 42.3363 -5.33082 -4.11854 22.7684 +9 2801 434.56 416.484 35.5702 -5.20018 -4.07945 21.4408 +10 2801 427.476 408.846 27.4708 -5.25014 -4.19193 20.8046 +11 2801 420.274 400.976 20.2799 -5.26867 -4.24683 20.0837 +8 2807 594.316 579.164 43.4487 -0.540404 -4.58764 25.5797 +9 2807 594.078 578.888 36.5022 -0.547482 -4.8219 25.5162 +8 2816 639.745 623.713 13.8883 1.01139 -5.32622 24.1754 +9 2816 641.024 625.037 6.73975 1.05723 -5.58163 24.2445 +8 2817 632.73 618.7 33.5968 0.887115 -5.33155 27.6245 +9 2817 634.613 620.228 28.3807 0.935517 -5.39471 26.9426 +8 2822 724.273 709.948 75.0106 4.30162 -3.66901 27.0568 +9 2822 728.654 714.749 69.7932 4.60076 -3.98136 27.8738 +10 2822 733.636 719.066 63.6602 4.57416 -4.02548 26.5998 +11 2822 739.245 724.271 58.113 4.6519 -4.11581 25.8819 +8 2826 738.458 723.283 29.6115 4.5627 -5.07043 25.5407 +9 2826 744.295 728.517 22.897 4.58676 -5.10492 24.563 +8 2827 713.237 698.737 55.7625 3.84056 -4.33744 26.728 +9 2827 718.295 702.99 50.3678 3.81635 -4.29897 25.3242 +8 2829 703.559 688.752 80.8335 3.40998 -3.33819 26.175 +9 2829 707.883 692.553 76.0806 3.44517 -3.39084 25.282 +10 2829 712.444 696.682 70.12 3.50629 -3.50116 24.5899 +8 2830 703.559 688.752 80.8335 3.40998 -3.33819 26.175 +9 2830 707.883 692.553 76.0806 3.44517 -3.39084 25.282 +10 2830 712.444 696.682 70.12 3.50629 -3.50116 24.5899 +8 2832 708.434 695.244 114.528 4.02649 -2.37519 29.3831 +9 2832 713.691 698.992 110.47 3.80527 -2.27968 26.367 +10 2832 718.134 702.871 106.265 3.82107 -2.34344 25.393 +8 2835 737.969 723.06 53.5086 4.62627 -4.29969 25.9951 +9 2835 743.643 728.367 47.6578 4.7147 -4.40219 25.371 +8 2836 737.969 723.06 53.5086 4.62627 -4.29969 25.9951 +9 2836 743.643 728.367 47.6578 4.7147 -4.40219 25.371 +8 2849 1062.7 1036.34 114.012 9.23392 -1.19905 14.7032 +9 2849 1094.82 1067.44 108.601 9.52094 -1.26068 14.1569 +10 2849 1131.42 1101.9 101.531 9.49596 -1.29783 13.1294 +11 2849 1174.07 1142.29 94.4264 9.54141 -1.32559 12.1955 +12 2849 1223.27 1188.75 86.045 9.54822 -1.35059 11.2258 +8 2850 1067.58 1041.81 119.742 9.54666 -1.10702 15.0392 +9 2850 1100.17 1072.83 114.774 9.64097 -1.14133 14.179 +8 2851 1067.58 1041.81 119.742 9.54666 -1.10702 15.0392 +9 2851 1100.17 1072.83 114.774 9.64097 -1.14133 14.179 +10 2851 1136.64 1107.67 108.4 9.77345 -1.19514 13.3792 +11 2851 1179.12 1147.99 101.967 9.82707 -1.22307 12.4492 +12 2851 1227.94 1193.95 94.2436 9.77262 -1.24232 11.4028 +8 2852 1024.18 1006.28 42.0685 12.4399 -3.92391 21.648 +9 2852 1044.35 1025.77 34.9142 12.576 -3.98986 20.8702 +10 2852 1066.14 1046.74 25.181 12.6429 -4.0891 19.9795 +11 2852 1090.02 1069.86 16.926 12.8023 -4.15485 19.2261 +8 2853 1041.35 1015.16 96.3803 8.85674 -1.5686 14.7999 +9 2853 1071.06 1043.98 89.7487 9.15486 -1.64857 14.3133 +10 2853 1105.62 1076.5 81.74 9.14813 -1.68027 13.3062 +8 2854 1041.35 1015.16 96.3803 8.85674 -1.5686 14.7999 +9 2854 1071.06 1043.98 89.7487 9.15486 -1.64857 14.3133 +10 2854 1105.62 1076.5 81.74 9.14813 -1.68027 13.3062 +8 2855 1040.15 1014.34 103.792 8.96309 -1.43759 15.0195 +9 2855 1070.65 1043.17 97.9712 9.01229 -1.46362 14.1028 +10 2855 1105 1075.73 90.4506 9.09309 -1.51239 13.2427 +8 2856 987.974 964.696 105.009 8.7321 -1.56555 16.6498 +9 2856 1011.87 987.239 99.7961 8.7729 -1.59311 15.734 +8 2865 1116.07 1089.75 124.232 10.3378 -0.992368 14.7265 +9 2865 1153.04 1125.09 119.606 10.4446 -1.02331 13.8664 +8 2874 1135.55 1110.9 89.2804 11.4585 -1.8206 15.7183 +9 2874 1172.73 1145.55 82.1042 11.13 -1.79348 14.2597 +10 2874 1214.34 1186.41 73.0455 11.6347 -1.92012 13.881 +8 2885 206.829 191.198 169.775 -13.839 -0.105801 24.7943 +9 2885 192.632 176.614 168.124 -13.9807 -0.158596 24.1952 +10 2885 176.292 159.481 165.92 -13.8441 -0.22157 23.0551 +8 2889 271.342 232.038 231.265 -4.62228 0.798284 9.86097 +9 2889 237.348 194.494 235.842 -4.66546 0.789517 9.04407 +8 2896 179.956 129.294 244.497 -4.55494 0.759612 7.65023 +9 2896 122.35 64.9472 252.334 -4.55906 0.743739 6.75179 +8 2899 207.522 191.776 166.001 -13.715 -0.233784 24.6143 +9 2899 192.737 176.421 163.744 -13.7233 -0.299925 23.7555 +10 2899 176.613 159.675 160.895 -13.7298 -0.379241 22.8818 +11 2899 159.254 141.482 159.426 -13.6103 -0.405871 21.8082 +12 2899 139.732 121.774 158.731 -14.0531 -0.42245 21.5821 +13 2899 119.34 100.518 159.04 -13.9905 -0.394243 20.5921 +14 2899 96.8592 77.2008 159.933 -14.0092 -0.353064 19.7155 +15 2899 73.2873 52.5437 161.054 -13.8867 -0.305558 18.6841 +8 2902 361.976 347.934 192.845 -9.47074 0.764709 27.6008 +9 2902 354.478 340.049 192.172 -9.49562 0.719142 26.8599 +10 2902 346.092 331.091 190.721 -9.4339 0.639774 25.8359 +8 2910 310.855 297.923 165.189 -12.4069 -0.318389 29.9697 +9 2910 302.631 291.423 165.264 -14.7095 -0.363744 34.5795 +10 2910 296.207 283.982 164.063 -13.7682 -0.386276 31.7033 +11 2910 288.676 276.52 165.031 -14.1799 -0.345719 31.8849 +12 2910 281.348 270.067 165.747 -15.6281 -0.338421 34.3566 +8 2911 488.227 473.175 137.624 -4.33011 -1.25728 25.7502 +9 2911 484.625 468.914 135.162 -4.27119 -1.28859 24.6676 +10 2911 480.497 464.141 131.573 -4.23831 -1.35564 23.6949 +11 2911 476.11 458.782 128.974 -4.13666 -1.36021 22.3663 +8 2912 454.517 447.52 193.295 -11.901 1.56907 55.3852 +9 2912 452.686 445.652 192.3 -11.9805 1.48512 55.104 +8 2913 473.451 457.934 130.323 -4.71173 -1.47232 24.9778 +9 2913 469.136 453.083 127.227 -4.69851 -1.52668 24.1424 +10 2913 464.285 447.67 123.147 -4.6966 -1.60699 23.3267 +11 2913 459.092 441.771 120.142 -4.6661 -1.63465 22.3755 +8 2914 458.842 443.546 132.711 -5.29297 -1.40974 25.3393 +9 2914 454.072 438.301 129.989 -5.29577 -1.45996 24.5749 +10 2914 448.667 432.262 126.521 -5.2682 -1.51712 23.6258 +11 2914 442.959 425.956 123.671 -5.26302 -1.55373 22.7939 +12 2914 436.397 418.773 121.412 -5.27752 -1.56783 21.9906 +8 2919 507.198 495.877 140.877 -4.85698 -1.5173 34.2363 +9 2919 505.121 492.863 138.134 -4.57655 -1.52145 31.6183 +8 2921 613.547 608 178.411 0.386165 0.538116 69.8656 +9 2921 614.345 608.826 177.07 0.465774 0.410327 70.2187 +10 2921 614.95 609.302 174.935 0.512695 0.197892 68.6281 +11 2921 615.702 609.996 174.047 0.578297 0.112361 67.9321 +12 2921 616.203 610.415 173.597 0.616601 0.0689624 66.9621 +8 2923 644.326 633.529 185.834 1.72967 0.645773 35.8971 +9 2923 646.151 635.096 184.687 1.77796 0.574962 35.0588 +10 2923 647.984 637.22 182.672 1.91739 0.489933 36.0044 +11 2923 650.055 638.788 181.736 1.93059 0.423423 34.3981 +12 2923 652.046 640.171 181.17 1.92188 0.376197 32.6389 +13 2923 654.23 641.898 181.264 1.94569 0.366324 31.4276 +14 2923 656.31 643.236 182.394 1.92081 0.391966 29.6454 +15 2923 659.089 645.616 183.957 1.97474 0.442677 28.7675 +16 2923 661.854 647.754 184.973 1.99216 0.461665 27.4868 +17 2923 664.733 650.553 185.628 2.09002 0.483887 27.3322 +18 2923 668.153 653.382 186.503 2.13079 0.49635 26.239 +19 2923 672.053 656.595 186.795 2.17149 0.484402 25.0713 +20 2923 676.056 659.868 186.348 2.2065 0.447755 23.942 +21 2923 680.736 663.153 185.566 2.17439 0.388343 22.0423 +22 2923 685.508 666.809 185.076 2.18171 0.351097 20.727 +8 2924 659.806 645.061 216.89 1.83052 1.60427 26.2862 +9 2924 662.469 647.309 216.969 1.87473 1.5631 25.5658 +8 2925 655.916 644.075 186.426 2.10281 0.615637 32.7299 +9 2925 658.039 645.758 185.468 2.12053 0.551761 31.5607 +8 2926 655.916 644.075 186.426 2.10281 0.615637 32.7299 +9 2926 658.039 645.758 185.468 2.12053 0.551761 31.5607 +8 2934 814.586 770.035 167.03 2.472 -0.0702146 8.69957 +9 2934 839.943 791.166 165.031 2.53706 -0.0861457 7.9458 +8 2936 725.766 715.111 181.038 5.85813 0.412574 36.3735 +9 2936 729.686 718.775 179.884 5.91353 0.346066 35.5194 +8 2939 698.16 680.72 203.146 2.72894 0.933013 22.2237 +9 2939 702.737 684.638 203.214 2.76533 0.901027 21.4138 +10 2939 708 688.326 202.443 2.6878 0.807903 19.7007 +11 2939 712.416 692.845 203.665 2.82303 0.845643 19.8035 +12 2939 718.127 697.887 204.78 2.88134 0.847311 19.1493 +13 2939 725.87 703.27 205.51 2.76446 0.776159 17.1495 +8 2940 730.557 713.179 214.037 3.73986 1.2729 22.3016 +9 2940 736.682 718.73 214.396 3.80366 1.24298 21.5892 +8 2946 944.542 925.636 180.134 9.51723 0.206838 20.4997 +9 2946 963.101 943.221 179.031 9.55267 0.166897 19.4959 +8 2953 939.655 915.594 185.399 7.36937 0.280067 16.1083 +9 2953 958.206 937.816 185.347 9.18452 0.329104 19.0077 +10 2953 980.379 955.253 184.231 7.92748 0.243215 15.4252 +8 2955 1025.32 999.68 135.099 8.71043 -0.790995 15.1167 +9 2955 1053.82 1026.79 131.551 8.82974 -0.82092 14.3408 +10 2955 1086.14 1057.25 126.499 8.86041 -0.861805 13.4144 +8 2956 1066.03 1040.29 139.314 9.52515 -0.699872 15.0562 +9 2956 1098.5 1070.96 135.929 9.53699 -0.720244 14.0739 +10 2956 1135 1105.84 131.253 9.677 -0.766149 13.2884 +8 2958 1014.44 989.07 143.794 8.57108 -0.615171 15.2744 +9 2958 1042.62 1015.49 140.748 8.57531 -0.635747 14.2876 +8 2960 1060.13 1035.35 173.967 9.76658 0.0241194 15.6399 +9 2960 1090.28 1063.91 173.034 9.78985 0.00366094 14.694 +8 2962 1008.25 983.099 136.522 8.51601 -0.77606 15.4121 +9 2962 1035.33 1008.83 133.017 8.62876 -0.807338 14.6228 +10 2962 1065.98 1037.33 128.087 8.55672 -0.83925 13.5269 +11 2962 1101.14 1070.26 123.6 8.5526 -0.856927 12.5535 +12 2962 1140.63 1108.62 118.445 8.91215 -0.913054 12.1084 +8 2966 995.823 972.149 177.229 8.76405 0.0992695 16.3712 +9 2966 1020.79 995.421 176.745 8.70588 0.0823752 15.275 +8 2970 1134.06 1108.58 136.102 11.0584 -0.774873 15.2128 +9 2970 1171.77 1144.58 132.413 11.1102 -0.799191 14.2589 +10 2970 1214.66 1185.57 127.456 11.1708 -0.838082 13.3202 +8 2971 1112.99 1087.43 134.539 10.5804 -0.805252 15.1642 +9 2971 1148.49 1121.02 130.671 10.5384 -0.824861 14.1091 +10 2971 1189.94 1159.69 125.776 10.304 -0.835826 12.8101 +8 2987 164.045 111.068 275.194 -4.51721 1.03766 7.31591 +9 2987 100.82 40.3329 288.321 -4.51781 1.0254 6.40755 +8 2990 190.967 140.592 337.166 -4.46348 1.75207 7.69381 +9 2990 135.021 78.075 358.244 -4.47617 1.74872 6.80603 +8 2993 288.592 250.864 299.331 -4.56971 1.8007 10.2728 +9 2993 258.237 215.744 310.385 -4.44095 1.73849 9.12074 +10 2993 220.186 172.959 323.221 -4.42867 1.71025 8.20666 +8 3002 508.711 469.835 300.081 -1.39343 1.7579 9.96952 +9 3002 499.219 456.528 310.776 -1.38835 1.73539 9.07868 +10 3002 488.098 440.736 324.394 -1.37755 1.71868 8.18327 +8 3006 626.911 587.275 298.629 0.235156 1.7045 9.77824 +9 3006 629.992 585.728 310.415 0.247954 1.66929 8.75582 +10 3006 633.374 583.368 324.321 0.255813 1.627 7.75048 +11 3006 637.78 582.055 343.025 0.272029 1.64034 6.95515 +8 3007 653.44 607.102 316.917 0.508666 1.67 8.36418 +9 3007 659.325 607.789 332.298 0.518695 1.66184 7.52037 +8 3011 630.014 598.138 275.416 0.344691 1.72835 12.1591 +9 3011 632.632 597.844 283.263 0.356258 1.70482 11.1412 +8 3014 726.193 692.234 277.072 1.84484 1.64845 11.4128 +9 3014 737.852 699.999 284.901 1.82052 1.58998 10.2389 +8 3017 774.344 730.256 292.995 2.00767 1.46374 8.7909 +9 3017 794.648 745.398 305.685 2.01867 1.44872 7.86945 +8 3018 804.029 751.202 321.355 1.97739 1.50997 7.33666 +9 3018 833.286 772.785 341.318 1.98635 1.4957 6.40616 +8 3020 812.206 756.929 327.095 1.96923 1.49885 7.01161 +9 3020 844.342 780.55 348.925 1.97694 1.48258 6.07557 +8 3024 786.652 750.235 263.906 2.61212 1.34302 10.6427 +9 3024 806.324 765.712 272.604 2.60247 1.31933 9.54328 +10 3024 829.993 781.878 281.394 2.46089 1.21173 8.05517 +8 3025 712.935 676.401 280.136 1.51991 1.57736 10.6086 +9 3025 723.861 684.598 288.737 1.56371 1.58535 9.87102 +10 3025 734.677 692.625 297.753 1.59817 1.59536 9.21639 +8 3027 799.172 747.821 334.753 1.98341 1.69351 7.54751 +9 3027 828.633 765.799 357.63 1.87279 1.5796 6.1682 +8 3034 925.841 866.752 330.883 2.87517 1.43657 6.55916 +9 3034 979.08 910.157 355.291 2.87988 1.42183 5.62334 +8 3041 928.007 869.34 313.897 2.91567 1.29137 6.60632 +9 3041 981.171 912.865 335.695 2.92231 1.28056 5.67408 +9 3064 405.983 381.599 201.355 -4.48466 0.627868 15.895 +10 3064 395.221 370.005 200.512 -4.56584 0.589179 15.3702 +11 3064 381.189 355.364 201.508 -4.75008 0.596003 15.0079 +12 3064 368.169 340.705 202.446 -4.72124 0.578783 14.1122 +13 3064 351.766 323.079 204.341 -4.82714 0.589596 13.5107 +9 3066 681.797 666.939 132.673 2.61155 -1.45264 26.0852 +10 3066 685.088 669.666 128.722 2.63065 -1.53712 25.131 +11 3066 688.78 672.828 126.148 2.66748 -1.57266 24.2951 +12 3066 692.389 675.667 123.634 2.66062 -1.58103 23.1769 +13 3066 696.522 679.285 121.872 2.70996 -1.58871 22.4848 +14 3066 700.805 682.846 120.427 2.72915 -1.56808 21.581 +15 3066 706.146 687.226 119.513 2.74226 -1.51446 20.4857 +9 3067 687.996 672.872 148.049 2.7859 -0.881039 25.6275 +10 3067 691.522 676.113 145.271 2.85722 -0.961544 25.1527 +11 3067 695.433 679.523 142.972 2.8992 -1.00887 24.36 +12 3067 699.219 682.79 141.602 2.93154 -1.02182 23.5916 +13 3067 703.648 686.583 139.865 2.96146 -1.03832 22.7104 +9 3069 770.379 760.836 157.275 9.05198 -0.876914 40.6128 +10 3069 775.234 764.762 154.695 8.49789 -0.93141 37.0095 +9 3075 316.317 266.243 337.205 -3.14566 1.76302 7.74006 +10 3075 278.012 220.939 357.058 -3.1204 1.73366 6.79085 +9 3079 796.436 743.812 331.03 1.90752 1.61456 7.36499 +10 3079 823.747 763.385 351.323 1.90602 1.58816 6.42083 +9 3102 184.688 168.122 107.051 -13.7763 -2.13365 23.3956 +10 3102 167.37 149.963 101.882 -13.6456 -2.19015 22.266 +11 3102 149.298 131.257 97.2804 -13.704 -2.25015 21.4833 +12 3102 128.495 111.704 93.8931 -15.3891 -2.52594 23.0818 +13 3102 110.176 91.8278 90.6876 -14.6197 -2.40546 21.1234 +9 3103 193.296 178.621 109.061 -15.2369 -2.33508 26.4112 +10 3103 178.817 162.756 105.322 -14.4056 -2.2585 24.1308 +9 3106 160.173 143.356 81.0696 -14.3534 -2.93159 23.0459 +10 3106 141.562 123.938 72.0242 -14.264 -3.07317 21.9916 +9 3108 302.504 285.003 35.5425 -9.42463 -4.21458 22.1466 +10 3108 289.945 270.858 27.1964 -8.99503 -4.09929 20.3065 +9 3113 387.915 371.155 103.817 -7.10366 -2.21261 23.1251 +10 3113 378.925 361.498 98.6353 -7.10892 -2.28767 22.2402 +11 3113 370.323 351.476 94.9318 -6.8183 -2.2208 20.564 +9 3114 387.915 371.155 103.817 -7.10366 -2.21261 23.1251 +10 3114 378.925 361.498 98.6353 -7.10892 -2.28767 22.2402 +11 3114 370.323 351.476 94.9318 -6.8183 -2.2208 20.564 +9 3115 379.406 362.466 110.49 -7.29781 -1.97748 22.8789 +10 3115 370.408 352.954 105.871 -7.36005 -2.06146 22.2059 +11 3115 361.043 342.967 102.228 -7.3849 -2.09872 21.4412 +12 3115 350.39 331.588 98.7995 -7.40399 -2.1156 20.613 +9 3116 379.406 362.466 110.49 -7.29781 -1.97748 22.8789 +10 3116 370.408 352.954 105.871 -7.36005 -2.06146 22.2059 +11 3116 361.043 342.967 102.228 -7.3849 -2.09872 21.4412 +12 3116 350.39 331.588 98.7995 -7.40399 -2.1156 20.613 +9 3118 335.478 319.08 117.058 -8.97833 -1.82776 23.636 +10 3118 325.424 307.953 112.83 -8.73564 -1.84542 22.1834 +11 3118 313.384 296.375 109.091 -9.35311 -2.01361 22.7859 +12 3118 301.555 282.69 106.246 -8.76982 -1.89653 20.5444 +9 3122 343.208 327.118 61.2091 -8.89188 -3.72716 24.0879 +10 3122 333.909 315.639 53.7966 -8.10433 -3.50038 21.2138 +9 3124 370.799 353.597 119.45 -7.45547 -1.66759 22.5306 +10 3124 361.667 343.126 115.01 -7.18159 -1.67576 20.9034 +9 3128 286.649 269.75 59.0498 -10.2639 -3.61733 22.9345 +10 3128 273.937 256.685 51.5133 -10.4496 -3.77796 22.4652 +11 3128 259.581 242.312 45.4093 -10.8857 -3.96405 22.4428 +9 3134 415.813 398.907 113.505 -6.15614 -1.88577 22.9262 +10 3134 408.253 390.587 108.825 -6.1206 -1.94676 21.938 +11 3134 400.269 381.879 105.056 -6.11293 -1.98023 21.0746 +12 3134 391.182 371.943 101.62 -6.09694 -1.98881 20.1448 +9 3138 331.058 314.702 79.7257 -9.14616 -3.0584 23.6958 +10 3138 320.329 303.156 74.0261 -9.04667 -3.09118 22.5685 +11 3138 308.679 290.768 68.8982 -9.02342 -3.11764 21.639 +9 3140 476.48 460.011 30.2943 -4.34044 -4.64964 23.5332 +10 3140 471.828 454.644 22.2875 -4.30524 -4.70644 22.554 +11 3140 466.84 448.84 15.0808 -4.25907 -4.7083 21.5323 +9 3141 445.109 427.998 36.467 -5.16259 -4.28159 22.6512 +10 3141 438.766 421.061 28.5771 -5.18165 -4.37718 21.8905 +9 3144 536.537 519.719 62.511 -2.33225 -3.52424 23.0451 +10 3144 534.053 516.728 55.9623 -2.34107 -3.62423 22.3713 +9 3146 529.022 513.269 67.9489 -2.7461 -3.57698 24.6025 +10 3146 526.668 509.986 60.9519 -2.66903 -3.60316 23.233 +11 3146 524.216 506.502 55.4181 -2.58795 -3.56113 21.8799 +12 3146 520.895 501.917 50.0926 -2.50952 -3.4746 20.4222 +13 3146 517.239 497.713 44.6574 -2.53966 -3.52661 19.8491 +14 3146 513.494 493.122 39.6393 -2.53292 -3.51244 19.0246 +15 3146 509.607 488.702 33.9441 -2.56832 -3.56935 18.5402 +16 3146 505.701 483.413 27.983 -2.503 -3.49142 17.3892 +17 3146 501.61 477.661 20.4609 -2.42125 -3.41809 16.1837 +9 3147 521 504.788 73.235 -2.93436 -3.3008 23.9076 +10 3147 518.421 501.029 66.8705 -2.81486 -3.27337 22.2851 +9 3149 508.329 491.743 82.0862 -3.27828 -2.93947 23.3666 +10 3149 504.994 487.533 76.1483 -3.21687 -2.97507 22.1975 +11 3149 501.025 482.964 70.8665 -3.22786 -3.03316 21.4589 +12 3149 496.545 477.728 65.7562 -3.22616 -3.05726 20.5973 +13 3149 491.928 472.379 60.8856 -3.23214 -3.07656 19.8257 +9 3152 464.4 451.442 55.4143 -6.01759 -4.86845 29.9113 +10 3152 459.845 446.468 48.7544 -6.01186 -4.98328 28.9737 +11 3152 456.304 441.583 42.7007 -5.59211 -4.74916 26.3281 +9 3153 482.894 466.203 82.6486 -4.07621 -2.9029 23.2198 +10 3153 478.265 461.015 76.6534 -4.08837 -2.99559 22.4679 +9 3155 535.742 518.904 45.9403 -2.35481 -4.04863 23.0175 +10 3155 533.148 515.772 38.2928 -2.36207 -4.15964 22.3046 +9 3156 517.91 502.374 80.3729 -3.16877 -3.19752 24.947 +10 3156 514.588 500.831 74.3943 -3.70817 -3.84437 28.1725 +9 3160 479.052 462.027 61.7532 -4.11745 -3.50518 22.7642 +10 3160 474.273 456.689 54.8573 -4.13281 -3.60462 22.0419 +9 3161 419.562 400.366 76.1348 -5.31665 -2.70647 20.1906 +10 3161 411.638 391.407 69.7631 -5.25523 -2.73727 19.1583 +11 3161 402.364 382.385 64.3559 -5.57084 -2.91717 19.3999 +9 3163 422.561 406.264 124.102 -6.1633 -1.60682 23.7812 +10 3163 415.714 398.455 119.652 -6.0329 -1.65576 22.4559 +9 3164 484.996 468.095 33.6627 -3.95871 -4.42361 22.931 +10 3164 480.218 462.951 25.6518 -4.02363 -4.57925 22.446 +11 3164 475.478 457.572 18.1307 -4.02241 -4.64165 21.6459 +9 3168 515.024 498.605 60.6111 -3.09279 -3.67209 23.6055 +10 3168 512.134 495.366 54.168 -3.1209 -3.80195 23.1135 +11 3168 508.426 491.056 48.1135 -3.12737 -3.85738 22.3123 +9 3177 677.633 662.174 44.8928 2.36546 -4.44649 25.0725 +10 3177 681.067 664.834 37.6217 2.36624 -4.47495 23.8763 +11 3177 684.635 668.051 31.0175 2.43167 -4.59403 23.3703 +9 3181 678.795 663.769 111.796 2.47515 -2.1828 25.7948 +10 3181 682.128 666.401 107.327 2.47855 -2.23803 24.6437 +11 3181 685.684 669.346 103.739 2.50278 -2.27231 23.7222 +12 3181 689.197 672.17 100.213 2.51223 -2.29151 22.7613 +9 3186 741.159 724.982 52.7121 4.36995 -3.98949 23.9597 +10 3186 746.826 730.955 46.0189 4.6458 -4.29273 24.4204 +9 3189 787.792 772.862 121.48 6.41227 -1.84829 25.9587 +10 3189 795.208 779.694 117.342 6.42805 -1.92209 24.9832 +11 3189 803.365 787.121 114.09 6.40841 -1.9431 23.8584 +9 3191 781.467 766.579 60.5613 6.20255 -4.05161 26.0336 +10 3191 788.636 773.117 54.1768 6.1983 -4.10773 24.9743 +11 3191 796.266 780.236 48.6011 6.25613 -4.16344 24.1771 +12 3191 804.15 787.412 42.6735 6.24478 -4.17775 23.1556 +13 3191 812.914 795.48 37.2077 6.26533 -4.17924 22.2305 +14 3191 822.211 803.952 32.5519 6.256 -4.12755 21.2269 +15 3191 832.852 813.747 27.4173 6.27783 -4.08892 20.2859 +16 3191 844.325 824.228 21.2783 6.27484 -4.05134 19.2854 +17 3191 857.295 836.319 14.7039 6.34389 -4.04982 18.4768 +9 3194 788.717 774.016 65.3318 6.54621 -3.92874 26.3642 +10 3194 796.243 780.522 59.2692 6.37831 -3.88078 24.6523 +11 3194 804.338 788.03 54.0317 6.41528 -3.91355 23.7647 +12 3194 812.601 795.589 48.5075 6.41098 -3.9262 22.7823 +13 3194 821.846 804.125 43.6009 6.4346 -3.91778 21.8704 +14 3194 831.844 813.197 38.6014 6.4032 -3.86732 20.7848 +15 3194 843.293 823.654 34.9931 6.39282 -3.77061 19.7347 +16 3194 855.578 834.838 29.0336 6.37157 -3.72476 18.6869 +9 3219 975.178 960.327 74.6218 13.2239 -3.55292 26.097 +10 3219 989.602 974.411 68.9648 13.4384 -3.67355 25.5138 +9 3223 1051.13 1024.25 96.0029 8.82308 -1.53556 14.4171 +10 3223 1083.33 1054.3 88.6157 8.7676 -1.55893 13.3529 +11 3223 1120.45 1089.35 80.874 8.82437 -1.58872 12.4627 +12 3223 1162.65 1129.16 71.9209 8.87199 -1.61904 11.574 +13 3223 1213.13 1176.49 62.8435 8.84989 -1.61305 10.5797 +9 3224 1039.48 1013.01 97.1345 8.72259 -1.53625 14.6391 +10 3224 1069.86 1041.89 89.8544 8.83834 -1.59368 13.8543 +11 3224 1104.6 1074.57 82.7642 8.85367 -1.61122 12.9044 +12 3224 1144.18 1111.84 74.3603 8.87854 -1.6357 11.9827 +13 3224 1190.31 1155.7 66.1625 9.0128 -1.65576 11.1976 +9 3226 1076.92 1049.01 118.253 8.99367 -1.05072 13.8849 +10 3226 1111.15 1082.59 112.172 9.43306 -1.14121 13.5695 +11 3226 1151.1 1120.73 106.305 9.57674 -1.17686 12.7598 +12 3226 1197.58 1163.75 99.21 9.33744 -1.16943 11.4577 +9 3234 1011.87 987.239 99.7961 8.7729 -1.59311 15.734 +10 3234 1038.49 1012.34 93.2403 8.81065 -1.63535 14.8212 +9 3239 1145.1 1117.59 109.072 10.4582 -1.24556 14.0904 +10 3239 1185.94 1156.68 102.567 10.5803 -1.29023 13.2449 +9 3242 1131.27 1103.45 125.325 10.0753 -0.917886 13.9345 +10 3242 1171.6 1141.91 119.843 10.1689 -0.959126 13.0547 +11 3242 1217.8 1186.01 114.311 10.2784 -0.989293 12.193 +9 3244 1114.14 1086.37 80.1687 9.76095 -1.79298 13.958 +10 3244 1152.09 1122.69 70.9961 9.91153 -1.86085 13.1818 +11 3244 1196.28 1164.72 61.7647 9.98542 -1.89063 12.2799 +9 3247 1181.77 1154.41 122.475 11.2361 -0.98927 14.1684 +10 3247 1225.69 1196.48 116.471 11.3326 -1.03707 13.2714 +9 3250 134.947 119.699 166.78 -16.7191 -0.213971 25.4175 +10 3250 117.395 102.85 163.992 -18.1754 -0.327273 26.6461 +11 3250 99.5289 82.9929 162.389 -16.5677 -0.339946 23.4383 +12 3250 78.8398 62.1117 161.876 -17.0418 -0.352526 23.1691 +13 3250 57.055 42.0837 161.198 -19.8231 -0.418194 25.8878 +9 3252 136.61 121.01 158.822 -16.2842 -0.483144 24.8434 +10 3252 118.947 102.424 156.076 -15.9492 -0.545442 23.4564 +11 3252 99.62 82.7844 154.547 -16.2699 -0.584084 23.0211 +12 3252 78.7966 61.4526 153.987 -16.4379 -0.584318 22.3463 +13 3252 56.3122 37.7781 153.273 -16.0341 -0.567486 20.9114 +14 3252 31.7153 12.8216 153.585 -16.4282 -0.547808 20.5134 +9 3270 269.852 229.849 235.675 -4.56155 0.843551 9.68871 +10 3270 234.797 189.749 240.305 -4.4686 0.804273 8.6035 +11 3270 191.297 141.496 247.238 -4.51138 0.802308 7.78251 +12 3270 136.449 80.2957 257.092 -4.5257 0.80581 6.90211 +9 3273 258.73 249.839 151.748 -21.1947 -1.27508 43.5904 +10 3273 251.788 241.014 148.394 -17.8371 -1.2195 35.9732 +9 3274 185.953 170.599 152.597 -14.8194 -0.708681 25.2423 +10 3274 169.573 152.467 149.434 -13.8166 -0.735444 22.6579 +9 3275 198.839 182.331 155.853 -13.364 -0.553193 23.4774 +10 3275 182.867 165.877 152.966 -13.49 -0.628773 22.8116 +11 3275 165.625 147.761 151.342 -13.3484 -0.646832 21.6954 +12 3275 146.352 127.785 150.408 -13.4012 -0.649383 20.875 +13 3275 125.855 106.009 149.474 -13.0914 -0.632766 19.5284 +14 3275 102.538 82.2427 149.686 -13.4193 -0.613175 19.0968 +9 3276 218.797 177.886 212.729 -5.13067 0.523554 9.47371 +10 3276 177.544 134.655 213.947 -5.41062 0.514651 9.03664 +11 3276 128.704 78.2727 218.859 -5.12166 0.490009 7.68521 +9 3278 188.547 172.139 161.19 -13.7827 -0.381838 23.6209 +10 3278 172 155.071 158.441 -13.8836 -0.457332 22.8941 +9 3282 221.237 205.239 148.997 -13.0384 -0.80102 24.2265 +10 3282 206.645 191.696 145.803 -14.4771 -0.971979 25.9255 +9 3284 189.567 141.46 224.271 -4.68954 0.574114 8.05654 +10 3284 136.054 81.5469 228.628 -4.66626 0.549636 7.11055 +9 3287 182.807 166.121 138.542 -13.7381 -1.10458 23.2279 +10 3287 166.567 150.609 135.036 -14.9113 -1.27297 24.2872 +11 3287 149.938 132.857 133.32 -14.4543 -1.24328 22.6911 +12 3287 130.707 112.795 131.735 -14.3596 -1.23305 21.6371 +13 3287 110.798 92.6621 131.179 -14.7719 -1.23431 21.3699 +14 3287 88.9329 70.1206 130.087 -14.8655 -1.22113 20.6022 +15 3287 66.1277 46.1193 130.431 -14.5892 -1.13891 19.3707 +9 3288 338.71 323.182 150.069 -9.36949 -0.788196 24.9601 +10 3288 328.897 312.755 146.933 -9.33949 -0.862554 24.0103 +11 3288 318.308 301.85 145 -9.50595 -0.909094 23.5498 +12 3288 307.035 289.415 143.664 -9.22294 -0.889913 21.9972 +9 3289 328.851 321.571 176.832 -20.7109 0.293526 53.2356 +10 3289 324.542 316.266 174.735 -18.4977 0.122071 46.828 +9 3295 338.681 322.62 134.278 -9.05946 -1.29018 24.1317 +10 3295 328.168 311.675 130.152 -9.16464 -1.39076 23.4997 +11 3295 317.856 299.262 127.578 -8.42702 -1.30798 20.8445 +9 3296 390.806 384.235 190.607 -17.8822 1.4512 58.9827 +10 3296 389.855 379.477 187.706 -11.3711 0.768669 37.3443 +9 3297 324.2 311.137 159.614 -11.7339 -0.544415 29.6696 +10 3297 316.279 303.45 157.564 -12.2797 -0.640188 30.2109 +11 3297 307.62 295.573 156.781 -13.463 -0.716655 32.1723 +12 3297 299.824 285.411 157.26 -11.543 -0.581131 26.8897 +9 3298 410.889 391.218 233.553 -5.42507 1.65749 19.703 +10 3298 402.568 381.783 234.19 -5.34912 1.58506 18.6462 +11 3298 393.14 372.401 236.108 -5.60528 1.63828 18.6879 +12 3298 383.365 361.261 238.913 -5.49686 1.60532 17.5344 +9 3300 554.845 548.558 127.296 -4.67452 -3.89222 61.6447 +10 3300 554.488 548.066 124.628 -4.60629 -4.03374 60.3511 +11 3300 554.2 547.879 122.995 -4.704 -4.23661 61.3108 +12 3300 553.741 547.248 121.775 -4.61785 -4.22571 59.6924 +13 3300 553.612 546.93 121.005 -4.49807 -4.16855 58.0101 +9 3307 435.99 420.481 206.312 -6.01152 1.1588 24.9903 +10 3307 430.045 414.263 205.649 -6.10982 1.11617 24.5577 +9 3311 431.749 413.573 235.577 -5.2548 1.85365 21.3235 +10 3311 423.756 404.822 236.245 -5.2712 1.79838 20.4699 +11 3311 415.946 395.485 238.181 -5.08278 1.71498 18.942 +12 3311 405.926 385.032 241.196 -5.23509 1.75697 18.5496 +13 3311 395.859 373.318 244.741 -5.09247 1.71307 17.1942 +14 3311 384.485 360.579 249.794 -5.0573 1.72881 16.2126 +15 3311 371.904 346.54 255.757 -5.03312 1.75574 15.2809 +16 3311 358.212 331.423 261.844 -5.03996 1.78441 14.4681 +17 3311 342.583 314.273 267.799 -5.06557 1.80148 13.6903 +18 3311 325.279 295.202 274.126 -5.07711 1.80867 12.8863 +9 3313 513.903 503.591 126.063 -4.98242 -2.43722 37.5826 +10 3313 511.927 501.469 122.834 -5.01446 -2.56909 37.0588 +9 3318 614.345 608.826 177.07 0.465774 0.410327 70.2187 +10 3318 614.95 609.302 174.935 0.512695 0.197892 68.6281 +9 3325 675.394 661.833 152.712 2.60761 -0.797805 28.5788 +10 3325 678.107 663.892 150.034 2.59029 -0.862309 27.2656 +11 3325 681.296 666.866 148.13 2.67041 -0.920348 26.8593 +12 3325 683.932 669.392 146.803 2.74756 -0.962417 26.6559 +13 3325 687.384 672.317 145.797 2.77442 -0.964568 25.7224 +9 3326 563.959 552.427 210.593 -2.12382 1.75769 33.6058 +10 3326 563.268 551.679 209.432 -2.14563 1.69539 33.4435 +9 3327 704.727 690.151 136.095 3.50692 -1.35456 26.5885 +10 3327 708.867 693.799 132.545 3.54022 -1.43698 25.722 +11 3327 713.377 697.709 130.033 3.5593 -1.46809 24.7374 +9 3328 704.727 690.151 136.095 3.50692 -1.35456 26.5885 +10 3328 708.867 693.799 132.545 3.54022 -1.43698 25.722 +11 3328 713.377 697.709 130.033 3.5593 -1.46809 24.7374 +9 3333 770.045 758.98 179.069 7.79096 0.301732 35.0278 +10 3333 774.847 764.482 177.022 8.56579 0.215987 37.3926 +9 3335 719.2 699.995 199.967 3.0665 0.758303 20.1804 +10 3335 725.147 705.266 199.036 3.12302 0.707398 19.4949 +11 3335 731.825 710.762 198.97 3.11792 0.665987 18.4 +12 3335 738.773 716.668 199.865 3.13982 0.656344 17.533 +13 3335 746.625 723.411 201.395 3.17153 0.660412 16.6955 +14 3335 755.512 730.746 204.135 3.1656 0.678458 15.6496 +9 3345 860.951 812.736 135.364 2.8007 -0.417666 8.0385 +10 3345 894.907 840.219 128.279 2.80272 -0.437823 7.08701 +9 3347 862.558 814.355 146.957 2.81932 -0.28859 8.04052 +10 3347 896.833 842.076 141.454 2.81804 -0.308019 7.07799 +9 3348 945.771 923.661 169.343 8.16796 -0.0852857 17.5291 +10 3348 965.156 941.778 166.941 8.17041 -0.135856 16.5785 +9 3362 896.071 847.42 227.035 3.16332 0.598206 7.96637 +10 3362 934.892 879.677 232.483 3.16491 0.580089 7.01928 +9 3367 962.932 927.39 195.014 5.34049 0.334909 10.9045 +10 3367 995.77 957.697 195.814 5.44895 0.323943 10.18 +9 3369 964.432 948.329 130.622 11.8378 -1.40878 24.0691 +10 3369 977.528 963.634 125.751 14.2258 -1.82103 27.895 +9 3370 1098.5 1070.96 135.929 9.53699 -0.720244 14.0739 +10 3370 1135 1105.84 131.253 9.677 -0.766149 13.2884 +11 3370 1178.1 1146.48 126.723 9.65897 -0.783724 12.2583 +12 3370 1227.28 1193.07 121.605 9.69953 -0.804721 11.3298 +9 3372 1013.8 974.456 186.511 5.51946 0.186469 9.85189 +10 3372 1056.35 1013.3 185.729 5.57585 0.160683 9.00473 +9 3375 1161.93 1134.93 134.046 10.9917 -0.772248 14.358 +10 3375 1203.66 1174.76 129.263 11.0444 -0.810366 13.4135 +9 3380 1121.75 1094.94 154.125 10.2639 -0.375309 14.4591 +10 3380 1160.03 1131.4 150.762 10.3284 -0.414517 13.5381 +9 3383 1124.03 1096.93 160.622 10.1967 -0.242436 14.3008 +10 3383 1161.47 1133 156.913 10.4142 -0.300792 13.615 +11 3383 1205.06 1174.88 153.584 10.5986 -0.342959 12.8417 +9 3405 299.522 263.068 287.802 -4.56841 1.69376 10.6319 +10 3405 271.116 231.66 296.668 -4.60762 1.68562 9.82312 +11 3405 237.222 193.371 307.927 -4.56096 1.65458 8.8385 +12 3405 194.769 146.429 323.636 -4.60908 1.67547 8.01761 +9 3409 530.108 492.323 292.181 -1.12951 1.69639 10.2576 +10 3409 522.46 481.748 301.183 -1.14915 1.69312 9.51972 +11 3409 514.811 468.724 314.214 -1.10431 1.64757 8.40965 +9 3410 439.937 391.733 324.714 -1.89016 1.69222 8.04034 +10 3410 419.452 365.275 342.28 -1.88488 1.67983 7.15391 +9 3413 495.544 459.92 285.23 -1.71917 1.69444 10.8796 +10 3413 485.433 446.4 294.514 -1.70819 1.67425 9.92958 +11 3413 474.337 431.836 305.434 -1.709 1.67561 9.11912 +9 3418 484.312 449.361 290.512 -1.92487 1.80824 11.089 +10 3418 475.383 433.684 298.54 -1.7284 1.61903 9.29454 +11 3418 462.455 420.472 311.526 -1.88208 1.77421 9.23152 +9 3420 545.307 499.278 310.467 -0.749802 1.60591 8.42016 +10 3420 538.869 486.918 323.528 -0.730898 1.55789 7.46032 +11 3420 529.71 472.057 342.76 -0.743964 1.58302 6.72261 +9 3421 659.849 618.116 301.801 0.647283 1.65969 9.28701 +10 3421 666.196 620.222 313.747 0.661739 1.64619 8.43045 +9 3423 622.602 567.955 341.636 0.128201 1.65903 7.09229 +10 3423 625.307 562.645 364.236 0.134992 1.64056 6.18514 +9 3424 622.602 567.955 341.636 0.128201 1.65903 7.09229 +10 3424 625.307 562.645 364.236 0.134992 1.64056 6.18514 +9 3431 618.368 591.94 255.065 0.179037 1.67091 14.665 +10 3431 619.518 591.779 258.298 0.192842 1.65455 13.972 +11 3431 621.261 591.12 263.292 0.208532 1.61172 12.8588 +9 3439 722.381 689.616 271.343 1.84961 1.61463 11.8289 +10 3439 733.032 697.396 277.661 1.86111 1.57976 10.8758 +9 3452 900.888 835.983 338.744 2.41104 1.3729 5.97146 +10 3452 955.186 878.098 366.641 2.40832 1.35031 5.02767 +9 3460 948.307 882.028 335.609 2.74536 1.31904 5.84767 +10 3460 1012.32 933.668 363.557 2.75051 1.30233 4.92743 +9 3463 965.364 899.157 330.038 2.88672 1.27527 5.85398 +10 3463 1031.93 952.811 360.637 2.86759 1.27492 4.89875 +10 3500 569.225 565.909 166.413 -6.53279 -1.04328 116.866 +11 3500 569.677 566.248 165.442 -6.2469 -1.161 113.018 +12 3500 569.784 566.299 164.877 -6.13214 -1.22981 111.238 +10 3517 480.714 453.526 260 -2.54559 1.72175 14.2554 +11 3517 472.726 443.287 265.084 -2.4967 1.68287 13.1654 +10 3527 134.849 118.237 92.1629 -15.3494 -2.60909 23.3304 +11 3527 116.082 97.6229 89.0649 -14.3601 -2.43824 20.9966 +10 3530 104.44 85.803 103.4 -14.558 -2.00173 20.7954 +11 3530 81.7424 62.9943 99.0752 -15.1224 -2.11383 20.6727 +10 3531 104.44 85.803 103.4 -14.558 -2.00173 20.7954 +11 3531 81.7424 62.9943 99.0752 -15.1224 -2.11383 20.6727 +10 3533 192.496 173.569 14.8661 -11.8361 -4.48363 20.4769 +11 3533 173.411 154.114 6.33775 -12.1404 -4.63505 20.0843 +10 3534 239.85 221.45 15.7714 -10.7928 -4.58567 21.0636 +11 3534 223.52 204.192 7.58224 -10.7284 -4.59307 20.0523 +10 3537 141.236 122.154 31.874 -13.1824 -3.96833 20.31 +11 3537 119.848 100.12 24.3159 -13.3342 -4.04448 19.6464 +10 3538 267.353 250.234 34.5862 -10.7374 -4.33843 22.6397 +11 3538 253.657 235.151 27.838 -10.3301 -4.20912 20.9428 +10 3550 255.692 238.11 14.9481 -10.811 -4.82418 22.0437 +11 3550 240.536 223.021 7.63947 -11.3175 -5.06695 22.1288 +10 3554 205.593 189.77 67.4364 -13.7135 -3.57862 24.4941 +11 3554 190.959 174.272 62.5257 -13.4747 -3.55144 23.2261 +12 3554 173.558 154.832 57.7661 -12.5062 -3.30118 20.6966 +10 3555 271.676 254.452 21.7926 -10.5373 -4.71101 22.5019 +11 3555 259.289 239.712 15.0128 -9.61072 -4.33084 19.7975 +10 3560 370.077 352.594 64.7868 -7.35778 -3.32023 22.1683 +11 3560 360.719 343.037 59.1371 -7.55968 -3.45467 21.92 +12 3560 350.071 329.981 54.0001 -6.93802 -3.17784 19.292 +13 3560 337.217 317.752 48.0922 -7.51541 -3.44286 19.9112 +14 3560 325.141 302.87 43.568 -6.85972 -3.11817 17.4023 +15 3560 311.261 288.797 38.6988 -7.1326 -3.20778 17.2527 +10 3565 333.727 317.93 79.1998 -9.37918 -3.18454 24.5345 +11 3565 323.638 305.411 74.0651 -8.42576 -2.91119 21.2629 +10 3568 364.094 346.662 92.0524 -7.56379 -2.48983 22.2335 +11 3568 354.189 336.103 87.822 -7.58413 -2.52533 21.4287 +10 3569 364.094 346.662 92.0524 -7.56379 -2.48983 22.2335 +11 3569 354.189 336.103 87.822 -7.58413 -2.52533 21.4287 +12 3569 343.184 323.718 84.0287 -7.35028 -2.45102 19.9099 +10 3571 343.609 326.484 84.74 -8.34208 -2.76388 22.6325 +11 3571 333.069 315.136 79.563 -8.28193 -2.79441 21.6127 +10 3572 343.609 326.484 84.74 -8.34208 -2.76388 22.6325 +11 3572 333.069 315.136 79.563 -8.28193 -2.79441 21.6127 +10 3573 312.572 295.606 95.7186 -9.40254 -2.44209 22.8437 +11 3573 300.946 283.271 91.3762 -9.37871 -2.4761 21.9274 +12 3573 287.923 269.72 87.6688 -9.49129 -2.51376 21.2921 +10 3574 349.987 333.581 98.8266 -8.49891 -2.4238 23.6245 +11 3574 339.78 322.364 94.515 -8.3202 -2.41604 22.2528 +12 3574 328.785 309.346 90.328 -7.75883 -2.28049 19.9387 +13 3574 315.597 292.948 88.5102 -6.97183 -2.00036 17.1125 +10 3576 405.423 387.331 35.823 -6.06078 -4.06843 21.4223 +11 3576 397.191 378.24 28.5656 -6.01965 -4.0899 20.4522 +12 3576 387.73 367.647 21.5206 -5.93302 -4.04755 19.2982 +13 3576 377.551 356.185 14.5721 -5.833 -3.97941 18.1404 +10 3579 345.822 328.959 124.337 -8.40121 -1.54548 22.9842 +11 3579 335.648 317.784 121.06 -8.23607 -1.55736 21.6955 +10 3580 497.225 479.788 32.6122 -3.46038 -4.32006 22.2265 +11 3580 493.189 474.993 25.6619 -3.43536 -4.34524 21.3004 +12 3580 488.298 469.144 18.9507 -3.40066 -4.31607 20.2348 +10 3581 497.225 479.788 32.6122 -3.46038 -4.32006 22.2265 +11 3581 493.189 474.993 25.6619 -3.43536 -4.34524 21.3004 +10 3583 448.22 430.644 64.2423 -4.93073 -3.31932 22.0512 +11 3583 441.975 423.924 58.5405 -4.98672 -3.40158 21.4705 +12 3583 434.551 415.642 52.7982 -4.97146 -3.41042 20.4967 +13 3583 426.679 407.011 46.9823 -4.99448 -3.43757 19.7053 +10 3589 477.16 459.709 25.862 -4.07521 -4.52437 22.2087 +11 3589 472.246 454.243 18.3238 -4.09676 -4.61044 21.5272 +12 3589 466.587 447.681 10.7274 -4.06204 -4.60626 20.5 +10 3590 520.682 503.747 41.4032 -2.8191 -4.16948 22.8864 +11 3590 517.904 499.853 34.8431 -2.72748 -4.10693 21.4715 +12 3590 514.228 495.176 28.5426 -2.68772 -4.06866 20.3427 +10 3591 440.862 421.936 52.6958 -4.78791 -3.41029 20.4784 +11 3591 433.572 414.796 46.6236 -5.0346 -3.61117 20.6416 +12 3591 426.006 405.974 41.1819 -4.92214 -3.53089 19.3486 +13 3591 418.135 396.702 35.5079 -4.7976 -3.44225 18.0836 +10 3593 426.573 410.317 112.039 -6.04655 -2.00957 23.8423 +11 3593 420.195 402.963 108.31 -5.90296 -2.012 22.4921 +10 3598 452.757 434.635 54.5159 -4.64782 -3.50769 21.3873 +11 3598 446.567 428.455 48.0203 -4.83397 -3.70227 21.3991 +12 3598 439.088 421.091 41.8377 -5.08816 -3.91052 21.5361 +10 3599 456.264 439.866 63.9101 -5.02174 -3.56884 23.6365 +11 3599 451.188 432.563 58.0813 -4.56734 -3.30998 20.8088 +12 3599 443.884 423.792 53.2229 -4.42924 -3.19827 19.2899 +13 3599 437.482 415.399 47.3433 -4.18572 -3.053 17.5511 +14 3599 428.107 406.545 43.1937 -4.52042 -3.23015 17.9753 +15 3599 419.428 397.04 38.1181 -4.56172 -3.23265 17.3115 +16 3599 410.905 386.198 32.6052 -4.3188 -3.04905 15.6865 +10 3601 503.872 486.963 106.559 -3.35738 -2.10599 22.9212 +11 3601 500.334 482.831 103.045 -3.35202 -2.14236 22.1433 +12 3601 495.973 477.652 99.7222 -3.33028 -2.14418 21.1551 +13 3601 491.633 472.602 96.0312 -3.3284 -2.16828 20.365 +14 3601 486.806 466.815 93.8868 -3.29831 -2.12181 19.3873 +15 3601 482.106 461.283 91.6219 -3.28772 -2.09542 18.6125 +16 3601 476.736 454.912 88.7018 -3.26919 -2.07124 17.7593 +10 3602 496.01 479.406 112.538 -3.67344 -1.9513 23.3425 +11 3602 492.379 475.006 109.139 -3.62291 -1.96992 22.3081 +10 3605 555.86 549.574 123.524 -4.58863 -4.21529 61.6561 +11 3605 555.673 549.395 121.721 -4.6105 -4.37497 61.7352 +10 3606 515.769 498.329 61.3783 -2.88881 -3.43353 22.2239 +11 3606 512.155 494.548 56.2163 -2.97155 -3.55832 22.0123 +12 3606 507.891 489.936 51.0971 -3.04153 -3.6425 21.5856 +13 3606 504.063 484.863 45.5445 -2.95146 -3.56171 20.1863 +14 3606 499.887 479.186 40.0487 -2.84588 -3.44615 18.7231 +15 3606 495.616 473.633 34.8052 -2.78421 -3.37322 17.6308 +16 3606 490.425 467.174 28.5776 -2.75222 -3.33305 16.6689 +17 3606 485.502 459.918 21.2054 -2.60472 -3.18401 15.1494 +10 3607 502.536 485.118 77.6897 -3.30036 -2.93466 22.2507 +11 3607 498.559 480.455 72.3687 -3.29352 -2.98152 21.4089 +10 3608 502.536 485.118 77.6897 -3.30036 -2.93466 22.2507 +11 3608 498.559 480.455 72.3687 -3.29352 -2.98152 21.4089 +10 3613 662.393 646.627 59.6078 1.80005 -3.85828 24.5827 +11 3613 665.206 648.945 54.6228 1.83817 -3.90551 23.8344 +12 3613 667.737 651.001 49.144 1.86727 -3.97057 23.1583 +13 3613 670.74 652.87 43.9213 1.83897 -3.87544 21.6879 +14 3613 674.031 655.003 39.562 1.81995 -3.76263 20.3679 +15 3613 678.002 659.025 34.4541 1.93732 -3.9175 20.4236 +10 3619 614.478 601.71 73.2471 0.206934 -4.19037 30.3544 +11 3619 616.319 603.626 68.8681 0.286061 -4.40076 30.536 +10 3623 693.4 678.091 88.0048 2.94157 -2.97694 25.3152 +11 3623 697.669 681.658 84.0087 2.95601 -2.98069 24.2071 +10 3628 728.274 712.475 59.3246 4.03619 -3.8599 24.5317 +11 3628 733.802 717.449 53.9311 4.08104 -3.90629 23.7006 +10 3632 746.034 731.152 87.1081 4.92585 -3.09487 26.0428 +11 3632 751.699 736.653 82.7134 5.07473 -3.21825 25.7607 +10 3633 829.665 813.18 99.5 7.17196 -2.39018 23.5107 +11 3633 839.881 822.459 95.259 7.1015 -2.39249 22.2472 +10 3634 829.665 813.18 99.5 7.17196 -2.39018 23.5107 +11 3634 839.881 822.459 95.259 7.1015 -2.39249 22.2472 +10 3637 709.09 694.017 31.9448 3.547 -5.02161 25.7136 +11 3637 713.634 698.486 25.3804 3.69063 -5.22962 25.5868 +12 3637 717.258 702.597 18.4066 3.94591 -5.65872 26.4361 +13 3637 722.176 705.092 11.859 3.54073 -5.06175 22.6854 +10 3639 815.901 799.78 57.1214 6.87544 -3.8563 24.0422 +11 3639 825.159 808.253 51.3333 6.85051 -3.86123 22.9263 +12 3639 834.585 816.997 45.1937 6.87239 -3.89881 22.0361 +13 3639 844.956 826.822 39.6296 6.97301 -3.94643 21.3737 +10 3642 795.601 780.774 124.912 6.74014 -1.73689 26.1408 +11 3642 804.059 787.776 121.935 6.41616 -1.67973 23.8021 +10 3644 739.321 723.974 49.3417 4.54163 -4.32289 25.2536 +11 3644 745.14 729.167 43.679 4.55949 -4.34408 24.2649 +12 3644 751.098 733.89 37.85 4.41809 -4.21411 22.5226 +13 3644 757.823 739.743 32.3886 4.40473 -4.17305 21.436 +14 3644 764.865 746.027 27.2239 4.42833 -4.15243 20.5736 +15 3644 772.943 753.485 21.9899 4.51028 -4.16467 19.9184 +10 3645 794.716 779.289 70.7632 6.44681 -3.5546 25.1225 +11 3645 802.65 786.706 65.5316 6.50517 -3.61567 24.3084 +12 3645 810.759 794.136 60.4306 6.5013 -3.6327 23.3148 +10 3648 697.179 682.251 102.221 3.15287 -2.54162 25.9635 +11 3648 701.237 685.672 98.2074 3.16389 -2.57614 24.9011 +10 3649 825.782 806.906 66.4444 6.15308 -3.02812 20.5329 +11 3649 835.633 818.542 60.6567 7.10525 -3.52624 22.6772 +12 3649 845.724 828.067 54.5668 7.18432 -3.59839 21.9498 +13 3649 856.072 838.675 50.1955 7.61134 -3.78722 22.2783 +10 3650 708.52 693.223 114.26 3.47508 -2.05759 25.3374 +11 3650 713.107 696.346 110.993 3.31846 -1.98251 23.1237 +12 3650 717.478 700.257 107.689 3.36625 -2.03267 22.5065 +10 3653 842.659 825.719 83.873 7.3915 -2.82156 22.8797 +11 3653 853.43 835.605 78.8434 7.34864 -2.83285 21.7423 +12 3653 864.599 846.237 73.7673 7.46075 -2.89861 21.1073 +13 3653 877.279 857.897 69.0828 7.41951 -2.87588 19.9965 +14 3653 891.036 870.606 64.9773 7.40081 -2.83638 18.9713 +15 3653 906.961 884.993 60.9525 7.27191 -2.73616 17.6427 +16 3653 924.455 901.333 55.5287 7.31522 -2.72553 16.7617 +17 3653 944.001 920.018 49.1208 7.49068 -2.77132 16.1607 +18 3653 965.921 940.236 42.8493 7.45246 -2.71874 15.0892 +10 3662 1032.14 1015.76 51.6636 13.8594 -3.97469 23.6643 +11 3662 1051.17 1033.93 42.9553 13.7641 -4.04869 22.4889 +10 3664 1091.75 1062.54 93.8699 8.86595 -1.45225 13.2667 +11 3664 1129.9 1098.76 86.5448 8.97426 -1.48857 12.4443 +12 3664 1173.68 1139.97 77.915 8.98815 -1.51265 11.4962 +13 3664 1225.37 1189.02 69.2863 9.10058 -1.53055 10.6631 +10 3666 1088.44 1059.33 103.387 8.83454 -1.28154 13.3111 +11 3666 1125.6 1094.82 96.9443 9.00579 -1.32475 12.592 +10 3672 1094.48 1065.83 75.3141 9.09378 -1.82919 13.5312 +11 3672 1132.06 1101.56 67.1564 9.20092 -1.86126 12.7058 +10 3673 1074.35 1055.13 31.8116 12.9871 -3.94098 20.1611 +11 3673 1098.62 1078.35 23.4891 12.9614 -3.95861 19.1229 +10 3679 1158.41 1128.86 115.14 9.97743 -1.04917 13.1167 +11 3679 1203.07 1171.34 109.544 10.0477 -1.07178 12.215 +10 3683 1137.97 1108.21 100.006 9.53716 -1.3148 13.0227 +11 3683 1181.56 1149.24 93.2614 9.50569 -1.32269 11.9907 +10 3688 127.483 111.615 166.111 -16.3188 -0.228258 24.4249 +11 3688 105.904 88.0879 165.671 -15.1852 -0.21658 21.7543 +10 3689 116.478 99.7881 137.504 -15.869 -1.13767 23.2215 +11 3689 96.6262 79.0644 134.324 -15.6887 -1.17849 22.0691 +12 3689 73.901 56.3821 132.519 -16.4239 -1.23673 22.1232 +10 3694 260.594 255.163 177.983 -34.5143 0.507238 71.3634 +11 3694 256.839 251.303 177.325 -34.2193 0.433714 70.0004 +10 3695 255.022 251.639 190.669 -56.2877 2.82837 114.554 +11 3695 252.98 249.098 189.356 -49.3361 2.28324 99.8317 +12 3695 250.14 246.43 189.458 -52.0344 2.40385 104.46 +13 3695 247.656 244.07 189.846 -54.2095 2.54529 108.079 +10 3699 169.917 153.459 150.757 -14.3486 -0.721177 23.5488 +11 3699 152.187 134.326 148.827 -13.7551 -0.722603 21.6996 +10 3700 191.793 175.29 166.262 -13.5983 -0.21457 23.4861 +11 3700 175.459 159.762 165.124 -14.855 -0.264518 24.6912 +10 3702 227.08 181.997 233.436 -4.55715 0.721815 8.59694 +11 3702 182.581 132.105 240.192 -4.54385 0.716599 7.67851 +12 3702 125.589 68.47 249.721 -4.55125 0.722853 6.78533 +10 3708 148.973 95.0959 239.592 -4.59204 0.665377 7.19372 +11 3708 82.7518 21.4261 247.85 -4.61429 0.656885 6.31993 +10 3712 318.685 285.088 214.347 -4.65042 0.663385 11.5358 +11 3712 294.611 258.169 216.894 -4.64225 0.649132 10.6353 +12 3712 265.635 225.853 220.997 -4.64386 0.650048 9.74261 +13 3712 231.005 187.584 226.221 -4.68306 0.660199 8.92608 +10 3714 343.61 326.877 145.291 -8.53774 -0.884838 23.1634 +11 3714 333.54 316.168 143.166 -8.53462 -0.917963 22.3102 +10 3718 359.943 331.861 217.919 -4.77469 0.862007 13.8016 +11 3718 343.307 313.373 220.177 -4.77775 0.849184 12.9476 +10 3723 489.314 482.35 166.944 -9.27515 -0.455868 55.6558 +11 3723 488.22 481.139 165.837 -9.20401 -0.532244 54.7314 +12 3723 486.636 479.522 165.286 -9.28145 -0.571462 54.4806 +13 3723 485.129 478.065 165.179 -9.46183 -0.583648 54.8666 +10 3726 430.045 414.263 205.649 -6.10982 1.11617 24.5577 +11 3726 423.889 407.763 206.023 -6.18437 1.10482 24.0333 +12 3726 417.078 400.39 207.064 -6.19536 1.10112 23.224 +13 3726 409.861 392.944 208.504 -6.34082 1.13196 22.9103 +14 3726 402.255 384.444 211.098 -6.25187 1.15337 21.7601 +15 3726 394.672 375.879 214.3 -6.14171 1.18456 20.6224 +16 3726 386.246 366.408 217.368 -6.04667 1.20531 19.5371 +10 3727 524.853 518.578 172.879 -7.25016 0.00213962 61.758 +11 3727 524.192 517.978 171.854 -7.37961 -0.0864333 62.3737 +10 3728 417.794 396.057 222.669 -4.73875 1.23099 17.8301 +11 3728 408.008 385.434 223.93 -4.79582 1.21532 17.1687 +12 3728 397.446 375.806 225.917 -5.26506 1.31713 17.9099 +10 3733 453.916 446.296 183.46 -10.9719 0.74763 50.864 +11 3733 451.628 444.258 182.686 -11.5106 0.716618 52.5884 +10 3734 641.415 631.655 133.476 1.75313 -2.16707 39.7082 +11 3734 642.749 632.908 131.429 1.81153 -2.26098 39.3819 +12 3734 644.032 634.019 129.932 1.84936 -2.30265 38.7083 +10 3737 682.441 667.303 146.189 2.58606 -0.946152 25.6023 +11 3737 685.972 670.309 144.137 2.6204 -0.984768 24.7434 +12 3737 689.532 673.271 142.3 2.64173 -1.00928 23.8344 +13 3737 693.742 676.822 140.746 2.67258 -1.01936 22.907 +10 3740 635.377 624.606 127.498 1.28754 -2.26193 35.9838 +11 3740 637.245 625.974 125.338 1.31946 -2.26459 34.3878 +12 3740 637.645 626.7 123.662 1.37831 -2.41406 35.4091 +10 3743 639.066 631.367 138.458 2.05858 -2.39969 50.3386 +11 3743 639.991 632.192 136.602 2.09603 -2.4969 49.6969 +12 3743 640.889 632.821 135.246 2.08569 -2.50363 48.0338 +13 3743 643.034 633.557 134.223 1.89736 -2.18963 40.8969 +10 3747 733.712 729.581 144.185 16.1428 -3.7277 93.8172 +11 3747 735.695 731.735 142.832 17.1105 -4.0726 97.8778 +12 3747 737.7 733.533 141.766 16.5169 -4.00713 93.0038 +10 3749 711.957 702.004 181.139 5.52585 0.447092 38.9373 +11 3749 715.159 705.211 180.545 5.702 0.415287 38.9605 +12 3749 718.974 707.298 180.387 5.03364 0.346539 33.1944 +10 3750 713.853 694.919 206.222 2.95885 0.946655 20.4703 +11 3750 719.408 700.086 206.951 3.05375 0.947872 20.0584 +10 3751 756.082 734.264 235.399 3.60724 1.53979 17.7635 +11 3751 765.423 741.71 238.058 3.53075 1.47705 16.3449 +12 3751 775.313 750.487 241.216 3.58638 1.47913 15.6118 +10 3753 807.875 788.652 219.875 5.54152 1.31391 20.1619 +11 3753 818.776 798.147 221.518 5.44771 1.26715 18.7879 +12 3753 830.043 808.66 222.927 5.5386 1.25785 18.1252 +13 3753 842.875 820.053 225.661 5.49131 1.24287 16.9821 +10 3782 984.451 962.353 160.644 9.11254 -0.296783 17.5385 +11 3782 1007.32 983.901 159.265 9.124 -0.311712 16.551 +10 3787 986.065 964.398 146.819 9.33397 -0.645447 17.8877 +11 3787 1008.94 984.902 145.086 8.92482 -0.620519 16.124 +10 3793 1169.98 1142.33 154.289 10.8876 -0.360676 14.0176 +11 3793 1214.93 1184.53 151.892 10.6963 -0.370368 12.7488 +10 3798 1140.87 1112.12 151.103 9.92842 -0.406452 13.4832 +11 3798 1182.98 1152.13 148.094 9.98282 -0.431045 12.5614 +10 3799 1126.45 1097.11 128.83 9.46339 -0.806003 13.2102 +11 3799 1167.82 1136.65 124.423 9.62189 -0.834733 12.436 +12 3799 1215.85 1182.15 118.844 9.66344 -0.860844 11.5002 +10 3800 1163.56 1135.72 133.335 10.6893 -0.762506 13.9219 +11 3800 1206.73 1176.11 128.189 10.4777 -0.783667 12.6598 +10 3802 1122.46 1091.94 145.553 9.02458 -0.48037 12.6955 +11 3802 1161.44 1132.33 142.087 10.1832 -0.567704 13.3137 +12 3802 1206.3 1174.54 137.557 10.0943 -0.597077 12.2054 +10 3809 301.303 254.872 322.766 -3.56617 1.7343 8.34735 +11 3809 264.303 211.869 340.165 -3.53697 1.71401 7.39176 +10 3815 500.076 459.688 296.93 -1.4561 1.65018 9.5963 +11 3815 488.867 444.754 309.529 -1.46961 1.66422 8.78583 +12 3815 476.41 425.914 324.88 -1.41636 1.61715 7.67527 +13 3815 459.863 403.015 345.409 -1.41448 1.63047 6.81781 +10 3816 510.958 469.375 307.583 -1.2737 1.74038 9.32058 +11 3816 504.22 458.365 321.292 -1.23398 1.73885 8.45228 +10 3822 553.935 510.958 305.589 -0.695237 1.65902 9.01828 +11 3822 548.943 501.135 319.162 -0.681073 1.64388 8.10701 +10 3831 576.079 545.618 265.914 -0.590402 1.64103 12.7237 +11 3831 574.272 541.631 272.073 -0.580709 1.6328 11.874 +10 3833 576.103 540.316 285.463 -0.502158 1.6902 10.8299 +11 3833 571.737 534.828 295.265 -0.550431 1.78148 10.5007 +10 3835 751.692 720.096 264.54 2.41633 1.5587 12.2665 +11 3835 765.035 730.289 271.483 2.40354 1.52473 11.1544 +12 3835 779.705 741.602 279.392 2.39858 1.50189 10.1717 +13 3835 798.214 755.784 290.605 2.38828 1.49067 9.13431 +14 3835 820.765 772.88 305.651 2.36919 1.48964 8.09378 +15 3835 848.651 794.933 323.635 2.39081 1.50774 7.21505 +16 3835 884.066 823.522 345.675 2.43542 1.53327 6.40148 +10 3836 721.862 688.442 269.793 1.80497 1.55804 11.5968 +11 3836 732.74 695.85 277.279 1.79363 1.52053 10.5063 +10 3837 752.681 717.564 273.97 2.1892 1.54668 11.0367 +11 3837 766.348 728.035 282.378 2.19821 1.53555 10.1162 +12 3837 782.97 740.522 292.338 2.1944 1.51199 9.1306 +13 3837 803.438 755.9 306.084 2.19069 1.5054 8.15285 +14 3837 828.873 775.547 323.869 2.20913 1.52116 7.268 +10 3840 802.197 752.927 306.569 2.10017 1.45779 7.86635 +11 3840 829.48 773.31 323.31 2.10311 1.43881 6.90009 +10 3843 739.093 705.787 269.268 2.08908 1.55494 11.6368 +11 3843 750.737 714.792 276.519 2.1097 1.54914 10.7824 +11 3899 833.794 816.71 96.9383 7.05002 -2.38681 22.6854 +12 3899 843.898 826.086 92.6202 7.06701 -2.41963 21.7596 +11 3900 829.469 812.275 28.9878 6.87019 -4.49452 22.5415 +12 3900 839.137 821.259 21.838 6.89788 -4.53742 21.6793 +11 3901 823.696 806.657 37.9844 6.75033 -4.25155 22.7453 +12 3901 833.135 815.336 31.4131 6.7474 -4.26862 21.7756 +13 3901 843.811 825.104 25.2523 6.72603 -4.23806 20.7174 +11 3905 1139.96 1108.32 109.759 9.00389 -1.07106 12.2485 +12 3905 1185.04 1150.92 102.874 9.05943 -1.10165 11.3588 +11 3906 123.184 105.383 145.494 -14.6759 -0.825552 21.7718 +12 3906 101.401 83.0309 144.306 -14.8591 -0.834769 21.0985 +13 3906 78.5281 58.6793 143.276 -14.3708 -0.800456 19.5264 +11 3911 603.208 597.988 178.463 -0.653617 0.577178 74.2484 +12 3911 603.447 598.323 178.069 -0.64075 0.546691 75.6396 +13 3911 603.974 599.296 178.264 -0.641281 0.621205 82.8476 +14 3911 604.946 599.623 179.306 -0.465627 0.651104 72.8188 +15 3911 605.676 600.199 181.097 -0.380878 0.808466 70.7641 +16 3911 607.097 601.774 181.967 -0.248534 0.919712 72.8213 +17 3911 608.293 603.188 182.81 -0.133265 1.04767 75.9254 +18 3911 609.632 604.074 183.45 0.00702769 1.02405 69.7306 +11 3926 394.194 358.281 283.946 -3.22128 1.66163 10.7922 +12 3926 375.15 335.932 294.04 -3.21054 1.6598 9.8824 +11 3929 786.552 738.511 309.625 1.979 1.52927 8.0677 +12 3929 810.161 755.445 326.359 1.96932 1.50697 7.08339 +13 3929 840.316 777.386 348.783 1.96966 1.50167 6.15881 +11 3933 838.416 783.608 312.916 2.24294 1.37269 7.0715 +12 3933 871.674 810.149 333.662 2.28843 1.40396 6.29948 +13 3933 917.742 845.338 361.864 2.28635 1.40223 5.35295 +11 3937 859.489 804.304 294.156 2.43273 1.18071 7.02319 +12 3937 895.916 834.386 309.949 2.49988 1.19683 6.29899 +11 3952 138.362 120.799 30.5354 -14.4112 -4.3527 22.0677 +12 3952 117.698 97.4998 24.327 -13.0807 -3.94996 19.1888 +11 3953 133.349 114.819 87.9623 -13.8042 -2.46081 20.9157 +12 3953 111.118 92.5374 83.7537 -14.4096 -2.57582 20.8591 +13 3953 88.5485 69.4539 80.1797 -14.6566 -2.60703 20.2977 +14 3953 66.0451 43.4818 76.3262 -12.9391 -2.29797 17.1772 +11 3956 101.681 80.848 77.66 -13.0951 -2.45447 18.604 +12 3956 75.2855 55.0515 71.7488 -14.1833 -2.68402 19.1546 +11 3966 268.844 250.217 49.8914 -9.82512 -3.54584 20.8068 +12 3966 253.476 234.39 44.1809 -10.0212 -3.62124 20.3062 +13 3966 237.711 217.595 38.0933 -9.92923 -3.59843 19.2668 +14 3966 220.07 198.883 32.5813 -9.87455 -3.55627 18.2928 +15 3966 201.804 179.4 27.616 -9.77617 -3.48216 17.2993 +16 3966 181.082 158.125 21.9222 -10.0259 -3.53162 16.8831 +11 3983 286.737 269.61 30.3627 -10.1241 -4.46871 22.6284 +12 3983 272.258 253.796 23.3093 -9.81373 -4.35098 20.993 +11 3984 285.382 267.646 55.6797 -9.81821 -3.5488 21.8529 +12 3984 271.389 253.988 50.3571 -10.4391 -3.78141 22.2735 +11 3987 312.418 294.789 90.7152 -9.05425 -2.50286 21.9861 +12 3987 300.007 281.23 87.0328 -8.8552 -2.45504 20.6406 +13 3987 286.383 267.058 83.1637 -8.98298 -2.49302 20.0558 +14 3987 272.128 250.766 80.3685 -8.48453 -2.3255 18.1427 +15 3987 255.565 235.806 76.8879 -9.62318 -2.6088 19.6147 +11 3989 345.403 327.042 102.016 -7.7278 -2.07234 21.1083 +12 3989 333.853 314.681 98.6169 -7.72483 -2.08 20.2163 +13 3989 321.638 301.375 95.2983 -7.63224 -2.05585 19.1266 +14 3989 308.094 286.879 92.7315 -7.63288 -2.02864 18.2688 +15 3989 294.089 271.647 90.1114 -7.55068 -1.98042 17.2698 +16 3989 278.212 255.117 87.1084 -7.70643 -1.99426 16.7814 +17 3989 261.033 236.84 82.7633 -7.73825 -2.00026 16.0201 +18 3989 242.657 216.29 77.5577 -7.47469 -1.94142 14.6995 +19 3989 221.102 193.695 71.2107 -7.61342 -1.99212 14.1415 +20 3989 196.255 166.954 64.0518 -7.57676 -1.99458 13.2273 +11 3996 375.102 356.084 96.7721 -6.62219 -2.14891 20.3796 +12 3996 364.565 345.541 92.6671 -6.91758 -2.26413 20.3731 +11 3997 390.565 371.932 98.1655 -6.3131 -2.15309 20.8002 +12 3997 381.036 362.058 94.496 -6.46813 -2.21785 20.4224 +11 3998 389.362 369.706 40.2149 -6.01729 -3.62461 19.7174 +12 3998 379.387 358.506 33.6587 -5.92097 -3.58067 18.5609 +11 4000 333.069 315.136 79.563 -8.28193 -2.79441 21.6127 +12 4000 321.334 302.101 75.7761 -8.04969 -2.71124 20.1515 +11 4001 411.681 393.72 93.9714 -5.91791 -2.35913 21.5789 +12 4001 403.371 384.604 90.3097 -5.90166 -2.36264 20.6523 +13 4001 394.522 375.37 86.6393 -6.0311 -2.41804 20.2368 +14 4001 385.086 364.601 83.8742 -5.88604 -2.33319 18.9199 +11 4002 299.294 280.889 78.2958 -9.05521 -2.75972 21.0583 +12 4002 285.622 266.66 74.2361 -9.17635 -2.7936 20.4394 +13 4002 271.763 252.074 69.6883 -9.21567 -2.81454 19.6848 +14 4002 256.15 236.834 66.2447 -9.82794 -2.96469 20.0652 +15 4002 241.351 220.137 61.4528 -9.3232 -2.82073 18.2697 +11 4008 501.025 482.964 70.8665 -3.22786 -3.03316 21.4589 +12 4008 496.545 477.728 65.7562 -3.22616 -3.05726 20.5973 +13 4008 491.928 472.379 60.8856 -3.23214 -3.07656 19.8257 +11 4010 502.031 485.12 115.415 -3.41536 -1.82441 22.9179 +12 4010 498.041 480.476 112.705 -3.4102 -1.83933 22.0645 +11 4013 505.208 486.993 42.4583 -3.0772 -3.84522 21.2773 +12 4013 500.792 481.591 36.2334 -3.04272 -3.82192 20.1848 +13 4013 496.603 476.967 30.2996 -3.08993 -3.89959 19.7377 +11 4014 457.277 439.857 113.003 -4.69558 -1.84549 22.2485 +12 4014 451.204 432.8 110.015 -4.6218 -1.83404 21.059 +13 4014 444.819 425.557 107.364 -4.59418 -1.82634 20.1218 +11 4017 528.969 511.312 65.2652 -2.45167 -3.27299 21.9501 +12 4017 525.773 507.285 60.508 -2.43429 -3.26407 20.9634 +13 4017 523.644 503.251 55.3674 -2.263 -3.09457 19.0051 +11 4021 424.726 405.373 46.3211 -5.13033 -3.51211 20.0273 +12 4021 416.354 396.105 39.7743 -5.12508 -3.53015 19.1399 +11 4024 492.949 475.071 32.3236 -3.50349 -4.22216 21.6782 +12 4024 487.979 469.396 25.6882 -3.51435 -4.2539 20.8564 +13 4024 483.34 463.481 18.7822 -3.41401 -4.16736 19.5163 +11 4025 477.15 457.331 35.1047 -3.58859 -3.73332 19.5553 +12 4025 470.926 451.293 28.4181 -3.79295 -3.95169 19.7409 +13 4025 464.66 445.178 21.5451 -3.99517 -4.17189 19.8943 +14 4025 458.286 437.561 17.0649 -3.92078 -4.03782 18.7012 +11 4026 423.99 405.401 69.5969 -5.36229 -2.98376 20.8499 +12 4026 415.652 396.713 65.9639 -5.49941 -3.03151 20.4636 +13 4026 407.312 387.606 61.9357 -5.51298 -3.02348 19.6681 +11 4035 616.784 606.642 111.87 0.382647 -3.23016 38.2179 +12 4035 617.327 607.297 109.786 0.41601 -3.3776 38.6416 +11 4036 637.8 627.984 116.684 1.54543 -3.07382 39.4853 +12 4036 638.887 628.853 114.734 1.57005 -3.11143 38.6273 +13 4036 640.309 629.9 113.321 1.58689 -3.07231 37.2365 +14 4036 641.605 630.911 112.948 1.60962 -3.00899 36.2419 +15 4036 643.591 632.554 112.799 1.65628 -2.92281 35.1167 +16 4036 645.534 634.223 112.179 1.70846 -2.88151 34.2665 +17 4036 647.928 636.231 110.936 1.76203 -2.84352 33.1358 +18 4036 650.278 638.379 110.071 1.83812 -2.83416 32.5715 +11 4041 566.981 561.003 98.2957 -3.82623 -6.69999 64.8391 +12 4041 566.647 560.788 96.65 -3.93404 -6.98612 66.1481 +13 4041 566.685 560.812 95.5812 -3.92126 -7.06739 65.992 +11 4048 661.788 646.092 97.758 1.78744 -2.57006 24.6936 +12 4048 664.729 648.525 94.4715 1.82882 -2.59828 23.918 +13 4048 668.406 651.338 92.0664 1.85194 -2.54245 22.7073 +11 4049 565.668 552.929 63.6593 -1.85063 -4.6041 30.423 +12 4049 565.115 552.666 59.933 -1.91774 -4.87246 31.1338 +11 4052 722.38 705.394 71.8962 3.56769 -3.19255 22.8169 +12 4052 727.585 710.057 66.99 3.61693 -3.24423 22.1117 +13 4052 733.267 715.174 62.3431 3.67282 -3.28102 21.4222 +14 4052 739.399 720.256 58.4845 3.64327 -3.20918 20.2461 +11 4054 727.267 710.814 85.3289 3.84274 -2.85738 23.5556 +12 4054 732.494 715.551 80.9006 3.89732 -2.91513 22.8744 +13 4054 738.583 720.612 76.8027 3.85652 -2.87098 21.5668 +14 4054 744.977 725.968 73.5708 3.82647 -2.80542 20.3883 +15 4054 752.086 732.658 70.6118 3.94071 -2.8269 19.9498 +11 4059 796.266 780.236 48.6011 6.25613 -4.16344 24.1771 +12 4059 804.15 787.412 42.6735 6.24478 -4.17775 23.1556 +13 4059 812.914 795.48 37.2077 6.26533 -4.17924 22.2305 +14 4059 822.211 803.952 32.5519 6.256 -4.12755 21.2269 +11 4060 733.802 717.449 53.9311 4.08104 -3.90629 23.7006 +12 4060 738.751 722.05 47.9131 4.15519 -4.01847 23.2068 +11 4061 833.794 816.71 96.9383 7.05002 -2.38681 22.6854 +12 4061 843.898 826.086 92.6202 7.06701 -2.41963 21.7596 +11 4064 728.446 712 37.7668 3.88313 -4.41228 23.5672 +12 4064 733.33 716.74 31.1429 4.00732 -4.58818 23.3612 +13 4064 739.111 721.799 25.1489 4.0197 -4.58294 22.3876 +11 4066 814.745 798.372 55.3832 6.73157 -3.85389 23.6717 +12 4066 823.633 806.472 49.775 6.70052 -3.85238 22.5842 +13 4066 833.432 815.533 44.7203 6.71845 -3.84531 21.6534 +11 4068 731.755 716.86 95.3044 4.4066 -2.79657 26.0199 +12 4068 736.54 720.328 91.5733 4.20719 -2.69303 23.9063 +11 4075 847.052 829.116 97.5068 7.11242 -2.25649 21.6086 +12 4075 858.009 839.344 93.4958 7.15018 -2.28386 20.7653 +13 4075 870.293 850.889 90.0375 7.21775 -2.29257 19.974 +14 4075 883.411 863.325 87.0663 7.32361 -2.29422 19.2961 +15 4075 898.303 877.387 84.0604 7.41517 -2.28029 18.5297 +11 4077 937.401 873.809 103.971 2.76924 -0.581851 6.09475 +12 4077 996.3 921.151 90.6933 2.76435 -0.587269 5.15741 +11 4078 835.278 818.431 106.119 7.19696 -2.12781 23.006 +12 4078 845.294 827.951 102.401 7.30116 -2.18206 22.3474 +13 4078 857.101 838.327 99.5574 7.08237 -2.09707 20.6438 +11 4079 945.366 882.115 116.287 2.85182 -0.480394 6.12763 +12 4079 1005.15 930.804 103.916 2.85808 -0.498063 5.21297 +13 4079 1091.17 1000.94 88.2987 2.86734 -0.503416 4.29581 +11 4092 1107.38 1077 75.9197 8.8027 -1.71405 12.7586 +12 4092 1147.8 1115.27 66.9227 8.88825 -1.74929 11.9151 +11 4095 1126.91 1096.26 78.0709 9.06686 -1.66112 12.6453 +12 4095 1169.77 1136.97 69.0498 9.17445 -1.69998 11.8165 +11 4097 1174.52 1142.05 86.7969 9.34685 -1.42376 11.9374 +12 4097 1223.87 1188.71 77.2516 9.38578 -1.46067 11.0241 +11 4103 1156.28 1124.75 114.298 9.3127 -0.997418 12.2904 +12 4103 1203.56 1169.37 107.942 9.33334 -1.01994 11.3373 +11 4105 1138.78 1107.31 114.721 9.03341 -0.992289 12.3162 +12 4105 1184.25 1150.43 108.4 9.12863 -1.02383 11.4613 +11 4108 1179.12 1147.99 101.967 9.82707 -1.22307 12.4492 +12 4108 1227.94 1193.95 94.2436 9.77262 -1.24232 11.4028 +11 4116 1176.76 1145.07 111.18 9.61233 -1.04517 12.2278 +12 4116 1226.37 1191.8 104.366 9.58616 -1.06441 11.2138 +11 4117 1113.68 1083.12 96.7737 8.85962 -1.33707 12.6806 +12 4117 1154.77 1122.32 88.9148 9.02624 -1.38966 11.9454 +13 4117 1203.8 1168.24 81.1679 8.97421 -1.38463 10.8966 +11 4118 1118.97 1097.21 41.2677 12.5749 -3.24822 17.8112 +12 4118 1148 1124.94 31.1852 12.545 -3.30072 16.811 +11 4138 164.92 147.326 145.72 -13.5751 -0.828425 22.029 +12 4138 145.763 127.602 143.928 -13.7172 -0.855509 21.3402 +13 4138 125.842 106.59 142.699 -13.4968 -0.841387 20.1325 +11 4140 201.249 153.189 230.723 -4.56353 0.646785 8.06435 +12 4140 149.705 95.656 238.331 -4.57014 0.650729 7.17081 +13 4140 83.8802 21.918 248.272 -4.55711 0.653803 6.25501 +11 4148 259.431 248.647 200.797 -17.4397 1.39181 35.9395 +12 4148 250.362 239.352 201.643 -17.5242 1.40456 35.2018 +11 4157 416.501 399.973 210.968 -6.27401 1.23864 23.4486 +12 4157 408.772 392.502 212.778 -6.62889 1.31808 23.8212 +13 4157 401.661 384.57 214.27 -6.53426 1.3017 22.678 +14 4157 393.795 375.848 217.045 -6.45801 1.32266 21.5962 +15 4157 385.612 366.961 220.441 -6.44972 1.3705 20.7804 +16 4157 376.886 357.28 223.83 -6.37452 1.39659 19.7679 +11 4159 302.115 265.966 222.787 -4.56841 0.741967 10.7215 +12 4159 274.051 234.789 226.909 -4.59017 0.739539 9.87153 +11 4160 454.92 437.787 133.946 -4.84799 -1.21979 22.6205 +12 4160 448.603 430.706 132.057 -4.83088 -1.22446 21.656 +13 4160 442.237 423.719 130.284 -4.85355 -1.23483 20.9298 +11 4162 431.238 415.588 218.421 -6.12052 1.56399 24.7653 +12 4162 425.08 409.074 219.876 -6.19103 1.57804 24.2144 +13 4162 418.532 401.999 221.844 -6.2066 1.59171 23.4432 +11 4166 446.864 437.834 205.238 -9.6783 1.92641 42.9222 +12 4166 443.521 434.377 205.648 -9.75378 1.92649 42.3862 +11 4167 417.284 394.979 227.901 -4.63041 1.32565 17.3762 +12 4167 408.257 383.466 229.453 -4.36172 1.22635 15.6339 +11 4170 508.368 491.749 222.796 -3.2708 1.61426 23.3222 +12 4170 503.811 487.74 224.657 -3.53462 1.7315 24.1172 +13 4170 500.829 483.479 226.524 -3.36625 1.6616 22.3386 +14 4170 496.504 479.325 229.904 -3.53493 1.78379 22.5605 +15 4170 492.581 475.252 233.95 -3.62589 1.89374 22.365 +16 4170 488.934 470.359 237.469 -3.48813 1.86849 20.8649 +17 4170 485.166 465.169 240.544 -3.34152 1.81833 19.3823 +18 4170 480.346 459.846 244.256 -3.3858 1.87096 18.9066 +11 4172 455.259 437.938 137.421 -4.78515 -1.09886 22.3762 +12 4172 449.125 431.132 135.63 -4.78962 -1.11128 21.5408 +13 4172 442.476 423.823 133.933 -4.81162 -1.12084 20.7786 +11 4174 511.984 506.75 184.965 -10.0144 1.24294 74.0531 +12 4174 511.379 505.208 184.775 -8.54559 1.03763 62.8028 +13 4174 510.969 504.683 185.17 -8.425 1.05247 61.6585 +14 4174 510.618 507.232 186.718 -15.6947 2.19913 114.455 +15 4174 510.802 503.919 188.663 -7.70728 1.23381 56.3107 +16 4174 510.913 504.181 190.406 -7.87013 1.40029 57.5655 +17 4174 510.863 503.955 191.274 -7.67522 1.43248 56.1109 +18 4174 510.763 503.626 192.312 -7.43623 1.46455 54.3087 +19 4174 510.647 503.434 192.693 -7.36666 1.47751 53.7377 +20 4174 510.501 503.1 192.852 -7.18949 1.45144 52.3681 +21 4174 510.318 502.9 192.506 -7.18582 1.42296 52.2448 +22 4174 510.092 502.383 192.688 -6.93069 1.38197 50.2753 +11 4177 664.866 645.109 230.699 1.50366 1.57267 19.6169 +12 4177 668.268 647.83 232.953 1.54294 1.57948 18.9628 +13 4177 672.278 650.559 236.174 1.55113 1.56602 17.8448 +14 4177 676.306 653.275 240.65 1.55674 1.58121 16.8286 +11 4178 690.349 674.079 158.738 2.66731 -0.46605 23.8219 +12 4178 693.238 676.971 157.146 2.76312 -0.518703 23.8258 +11 4180 774.161 759.394 144.946 5.98737 -1.01514 26.2458 +12 4180 784.557 764.219 143.202 4.62181 -0.783125 19.0563 +11 4182 766.501 749.607 209.026 4.99011 1.15014 22.942 +12 4182 773.508 756.623 209.748 5.21573 1.17373 22.9544 +11 4194 731.489 711.662 219.636 3.30325 1.26738 19.5475 +12 4194 738.363 717.75 221.473 3.35641 1.26693 18.802 +13 4194 745.826 724.203 224.004 3.38509 1.27065 17.9241 +14 4194 754.57 731.101 228.174 3.31885 1.2661 16.5138 +15 4194 764.495 739.662 232.996 3.35143 1.30095 15.6077 +16 4194 775.796 749.774 237.888 3.43155 1.34246 14.8944 +11 4196 836.594 819.773 132.042 7.25016 -1.3033 23.0417 +12 4196 846.916 829.067 129.371 7.14309 -1.30859 21.7142 +13 4196 858.259 839.773 127.458 7.22671 -1.31913 20.9664 +11 4210 1109.79 1078.76 132.66 8.66102 -0.69592 12.4928 +12 4210 1150.75 1117.37 128.016 8.70917 -0.721566 11.6114 +13 4210 1199.18 1163.46 124.003 8.86708 -0.734648 10.8509 +11 4219 1081.17 1051.34 174.576 8.49053 0.0309996 12.99 +12 4219 1117.18 1086.46 173.465 8.87557 0.0106772 12.6159 +11 4228 1159.44 1131.16 170.163 10.447 -0.0511269 13.7083 +12 4228 1203.3 1172.21 168.337 10.2611 -0.078063 12.4698 +11 4230 1144.91 1115.05 177.161 9.62802 0.0774572 12.9764 +12 4230 1188.1 1155.82 176.112 9.62634 0.0542135 12.0057 +11 4249 175.857 124.448 255.291 -4.53159 0.861353 7.53907 +12 4249 116.605 58.6296 267.024 -4.5673 0.872501 6.68516 +11 4257 280.098 234.829 316.181 -3.90933 1.70069 8.56163 +12 4257 240.929 190.93 332.971 -3.96021 1.72015 7.75152 +11 4260 335.767 293.744 308.681 -3.4997 1.73618 9.22292 +12 4260 305.979 259.759 323.743 -3.52807 1.75357 8.3854 +13 4260 269.012 216.794 342.741 -3.50312 1.74758 7.42226 +11 4264 512.65 459.519 333.21 -0.979735 1.62118 7.29462 +12 4264 499.79 438.642 355.065 -0.964281 1.60065 6.3384 +11 4273 649.636 617.733 266.556 0.674779 1.57769 12.1488 +12 4273 653.847 618.986 273.197 0.682405 1.54614 11.1178 +13 4273 657.97 621.159 281.826 0.706413 1.59013 10.5288 +11 4283 823.534 791.458 259.719 3.58325 1.45465 12.083 +12 4283 842 807.358 266.003 3.60419 1.44435 11.1881 +11 4285 818.065 763.012 302.167 2.03439 1.26171 7.04005 +12 4285 849.186 787.869 319.83 2.0992 1.28755 6.32087 +11 4286 812.152 757.696 322.058 1.99837 1.47173 7.1172 +12 4286 842.788 780.154 342.906 2.00017 1.45837 6.1879 +11 4287 786.779 733.752 330.878 1.7952 1.60075 7.30902 +12 4287 812.978 752.301 352.378 1.80077 1.58924 6.38743 +11 4288 789.53 753.682 271.665 2.69672 1.4806 10.8117 +12 4288 807.008 767.739 279.985 2.70082 1.4654 9.8696 +13 4288 828.307 784.958 290.985 2.71057 1.46379 8.94078 +14 4288 855.118 806.266 306.758 2.7 1.47232 7.93356 +11 4289 768.191 721.781 306.164 1.836 1.54293 8.35105 +12 4289 788.109 736.23 321.503 1.8487 1.53911 7.47079 +13 4289 814.019 755.014 341.903 1.8613 1.53895 6.56853 +11 4290 810.686 755.943 327.744 1.97351 1.51983 7.07993 +12 4290 840.865 778.056 349.282 1.97816 1.50884 6.17069 +11 4292 712.261 679.09 274.125 1.66306 1.63988 11.6839 +12 4292 722.047 685.559 282.218 1.65595 1.60995 10.6218 +12 4330 261.839 242.365 29.5601 -9.59124 -3.9525 19.9023 +13 4330 245.581 226.473 22.9134 -10.2321 -4.21511 20.2838 +12 4331 158.746 140.872 118.476 -13.5477 -1.63413 21.6834 +13 4331 139.901 121.671 115.293 -13.8388 -1.69608 21.2606 +14 4331 120.192 101.506 112.362 -14.0669 -1.73886 20.7406 +15 4331 98.5492 79.6049 110.923 -14.4893 -1.756 20.4586 +12 4333 550.832 531.274 33.5594 -1.61298 -3.82579 19.8174 +13 4333 548.728 528.768 27.2253 -1.63707 -3.91911 19.4178 +14 4333 546.697 525.885 21.2823 -1.62242 -3.91194 18.6223 +12 4344 1137.73 1105.42 95.7311 8.78105 -1.28219 11.9958 +13 4344 1184.12 1149.31 89.0563 8.86681 -1.2932 11.1351 +12 4345 1186.21 1162.57 39.3407 13.1018 -3.03348 16.3937 +13 4345 1223.9 1197.7 31.3715 12.5976 -2.90122 14.7958 +12 4351 700.699 691.652 176.848 5.41103 0.237129 42.8381 +13 4351 703.933 694.25 177.121 5.23517 0.236709 40.0256 +14 4351 707.92 696.991 178.316 4.83429 0.268448 35.4627 +15 4351 712.978 700.464 179.974 4.43891 0.305605 30.9695 +16 4351 718.439 703.935 181.092 4.03227 0.305077 26.7216 +12 4362 717.352 686.382 262.922 1.86959 1.56217 12.5146 +13 4362 726.685 693.097 270.235 1.87309 1.55732 11.5389 +14 4362 737.781 701.197 279.727 1.88262 1.56917 10.594 +15 4362 751.477 711.463 291.106 1.90508 1.5874 9.68581 +16 4362 767.93 723.577 303.866 1.918 1.58667 8.73843 +12 4363 728.381 694.211 272.189 1.86785 1.56153 11.3424 +13 4363 740.012 702.361 281.157 1.86112 1.54511 10.2939 +12 4368 57.8547 39.1904 122.285 -15.8778 -1.45536 20.7655 +13 4368 32.0247 12.094 119.888 -15.5652 -1.42748 19.4462 +12 4370 131.781 110.565 25.9885 -12.0964 -3.71835 18.2679 +13 4370 107.806 87.7895 18.3491 -13.4649 -4.14625 19.363 +14 4370 84.1094 61.172 11.4516 -12.305 -3.77974 16.897 +12 4372 78.4212 58.894 62.1167 -14.6104 -3.04613 19.8478 +13 4372 52.8208 32.2871 56.6816 -14.5639 -3.039 18.875 +14 4372 25.1003 4.96211 51.9464 -15.5894 -3.22499 19.2457 +12 4377 94.8039 76.5811 119.068 -15.1734 -1.58546 21.2687 +13 4377 71.5775 53.1588 116.534 -15.6894 -1.64249 21.0425 +12 4383 230.676 219.483 107.792 -18.1827 -3.12231 34.6267 +13 4383 220.913 207.883 105.47 -16.0219 -2.77789 29.7454 +12 4386 237.782 218.339 21.0681 -10.2712 -4.19342 19.9341 +13 4386 220.8 200.972 13.9525 -10.5319 -4.3048 19.5472 +12 4392 213.429 196.077 92.0532 -12.2627 -2.50129 22.3361 +13 4392 197.598 180.105 89.3251 -12.6495 -2.56481 22.1553 +12 4403 178.866 161.924 42.3284 -13.6555 -4.13843 22.877 +13 4403 162.059 144.62 37.0944 -13.7832 -4.18146 22.2237 +12 4409 282.149 262.975 58.1773 -9.17263 -3.21274 20.2144 +13 4409 267.152 246.961 52.8602 -9.10922 -3.19225 19.1954 +14 4409 250.996 229.829 48.1005 -9.09917 -3.16584 18.3103 +15 4409 234.49 212.175 43.1817 -9.02832 -3.12135 17.3682 +12 4410 313.567 294.09 62.2025 -8.16334 -3.05172 19.8997 +13 4410 300.097 278.999 56.7924 -7.87847 -2.95477 18.3694 +12 4411 318.26 299.648 91.5584 -8.40705 -2.34623 20.8239 +13 4411 305.65 286.229 87.9973 -8.40566 -2.34701 19.9566 +14 4411 291.893 271.525 85.1707 -8.37767 -2.31243 19.0288 +15 4411 277.347 255.827 82.6615 -8.29225 -2.25127 18.0101 +16 4411 261.6 238.751 79.2437 -8.1799 -2.20061 16.9621 +17 4411 243.926 220.199 74.6554 -8.27749 -2.22309 16.3347 +12 4413 335.13 314.316 19.7784 -7.08252 -3.95059 18.6215 +13 4413 322.123 300.638 12.4373 -7.18656 -4.01078 18.0401 +14 4413 307.73 285.107 5.56056 -7.16663 -3.97221 17.1322 +12 4414 290.821 272.018 97.2674 -9.10569 -2.15935 20.6128 +13 4414 276.883 257.808 93.9602 -9.36816 -2.22165 20.3185 +12 4418 329.782 311.357 69.0086 -8.15683 -3.02758 21.0362 +13 4418 318.357 296.383 65.2109 -7.11845 -2.63134 17.638 +12 4419 414.788 395.727 86.2072 -5.4887 -2.44173 20.3331 +13 4419 406.412 386.506 82.2736 -5.48187 -2.44428 19.4704 +12 4422 339.329 320.424 108.407 -7.67803 -1.83112 20.501 +13 4422 327.82 307.844 105.56 -7.57597 -1.80955 19.4021 +12 4424 355.814 336.078 54.0973 -6.906 -3.23212 19.6376 +13 4424 344.619 323.662 48.2248 -6.79079 -3.19442 18.494 +14 4424 331.751 309.477 42.5598 -6.69952 -3.14213 17.4003 +12 4431 510.698 492.854 23.5225 -2.97584 -4.49507 21.7192 +13 4431 507.153 488.038 16.7812 -2.87771 -4.38578 20.2758 +12 4432 438.649 420.445 98.8559 -5.04291 -2.1834 21.2899 +13 4432 431.79 412.692 95.9746 -4.99993 -2.16231 20.2939 +14 4432 424.057 404.129 92.9819 -5.00017 -2.15293 19.4489 +12 4433 482.005 464.043 105.921 -3.81447 -2.00161 21.5774 +13 4433 477.136 458.449 103.014 -3.80645 -2.00752 20.7404 +14 4433 471.81 452.174 100.987 -3.76824 -1.96598 19.7382 +15 4433 466.414 445.845 99.0759 -3.73834 -1.92676 18.8434 +12 4435 553.741 547.248 121.775 -4.61785 -4.22571 59.6924 +13 4435 553.612 546.93 121.005 -4.49807 -4.16855 58.0101 +12 4439 511.048 492.576 62.8981 -2.86454 -3.19733 20.9811 +13 4439 507.653 488.109 57.7875 -2.80083 -3.16253 19.831 +12 4442 481.274 461.771 15.1198 -3.53333 -4.34443 19.8731 +13 4442 476.208 456.115 8.33937 -3.56491 -4.398 19.289 +12 4447 462.275 444.653 106.935 -4.48948 -2.00931 21.9937 +13 4447 456.591 438.694 103.854 -4.59121 -2.07096 21.6563 +14 4447 450.19 431.384 101.636 -4.55196 -2.03414 20.6088 +15 4447 444.48 423.525 100.015 -4.2316 -1.86712 18.4957 +16 4447 437.488 414.769 97.7549 -4.06816 -1.77552 17.0588 +17 4447 429.727 406.06 94.2141 -4.08158 -1.78485 16.3764 +12 4450 454.631 435.314 65.1717 -4.3081 -2.99433 20.0639 +13 4450 447.826 428.296 60.2374 -4.44832 -3.09741 19.8452 +12 4456 678.094 661.294 114.101 2.19128 -1.87852 23.07 +13 4456 681.604 664.199 111.71 2.22345 -1.88703 22.2681 +14 4456 685.285 667.091 110.237 2.23572 -1.8487 21.3027 +15 4456 689.781 670.632 108.896 2.25036 -1.79413 20.2405 +12 4457 561.2 554.852 125.591 -4.09182 -3.99906 61.0514 +13 4457 561.16 554.825 124.913 -4.10403 -4.06512 61.1826 +14 4457 560.831 554.515 125.362 -4.1445 -4.0393 61.3688 +12 4460 645.238 634.73 123.167 1.82394 -2.5401 36.8863 +13 4460 646.836 636.237 121.961 1.88925 -2.57936 36.5692 +14 4460 648.28 637.59 121.78 1.94567 -2.56642 36.2568 +15 4460 650.488 639.591 121.951 2.0175 -2.50918 35.567 +12 4462 680.008 662.618 73.7201 2.17608 -3.06215 22.2876 +13 4462 683.602 665.236 69.554 2.16557 -3.02129 21.1033 +14 4462 687.514 668.182 66.0559 2.16604 -2.96747 20.0485 +15 4462 692.244 672.033 62.8202 2.19753 -2.92438 19.1764 +12 4463 767.124 749.752 11.9946 4.87213 -4.97402 22.3111 +13 4463 774.361 756.555 5.0992 4.97158 -5.06067 21.7667 +12 4465 804.671 787.948 47.9059 6.26713 -4.01343 23.1764 +13 4465 813.439 796.088 42.8883 6.31149 -4.02333 22.3366 +14 4465 822.798 804.619 38.2457 6.30056 -3.97726 21.3192 +15 4465 833.428 814.425 33.7947 6.32784 -3.93063 20.3949 +16 4465 845.027 824.937 27.9113 6.29571 -3.87533 19.2918 +12 4466 826.828 809.253 48.5975 6.64063 -3.7978 22.0532 +13 4466 836.86 818.778 43.3052 6.75255 -3.84859 21.4352 +14 4466 847.575 828.773 38.3692 6.79981 -3.84207 20.6135 +15 4466 859.591 840.121 33.5217 6.89791 -3.84392 19.9059 +12 4468 719.716 702.59 76.3149 3.45503 -3.02792 22.6308 +13 4468 724.795 707.656 72.4563 3.61169 -3.14664 22.6143 +12 4470 720.482 702.853 88.91 3.37972 -2.5577 21.9846 +13 4470 725.877 707.573 85.3441 3.41354 -2.56813 21.1748 +14 4470 731.806 712.879 82.5359 3.46946 -2.5633 20.4779 +15 4470 738.793 718.992 79.6799 3.50576 -2.52756 19.5733 +16 4470 746.284 725.398 75.8531 3.51624 -2.49464 18.5563 +12 4472 709.36 692.085 102.897 3.10327 -2.1753 22.436 +13 4472 714.284 696.368 100.08 3.13979 -2.18188 21.6328 +14 4472 719.517 700.667 98.082 3.1334 -2.13073 20.5612 +15 4472 725.835 706.162 96.0359 3.17482 -2.09745 19.701 +16 4472 732.624 711.961 92.9937 3.19916 -2.07602 18.7568 +17 4472 740.288 718.56 89.2125 3.23177 -2.06772 17.8373 +18 4472 748.669 726.018 86.1601 3.29893 -2.05592 17.111 +19 4472 758.131 734.247 81.3395 3.34141 -2.05819 16.2276 +12 4475 775.838 758.383 54.8278 5.11692 -3.63204 22.204 +13 4475 783.302 765.228 49.9075 5.16361 -3.65395 21.444 +14 4475 791.301 772.375 46.2124 5.15808 -3.59427 20.4783 +15 4475 800.407 780.78 42.1098 5.22314 -3.57822 19.7471 +16 4475 810.473 789.982 37.3056 5.26689 -3.55336 18.9149 +17 4475 821.972 800.393 30.8521 5.28726 -3.53462 17.9601 +12 4482 870.689 852.892 43.7951 7.8818 -3.89545 21.7786 +13 4482 883.206 864.347 38.0364 7.79411 -3.83992 20.5511 +14 4482 896.637 876.653 32.878 7.7161 -3.76228 19.3935 +12 4484 870.806 852.761 51.4338 7.77651 -3.6143 21.4779 +13 4484 883.38 864.583 45.9045 7.82491 -3.62781 20.6192 +14 4484 896.928 877.224 40.84 7.83418 -3.59894 19.6704 +12 4487 887.752 868.207 93.4122 7.64565 -2.18332 19.8302 +13 4487 899.311 881.07 89.9029 8.5326 -2.44274 21.2478 +14 4487 914.554 893.123 86.8444 7.64433 -2.15573 18.0845 +12 4496 852.934 835.109 81.0619 7.33394 -2.76609 21.7431 +13 4496 864.769 845.822 76.3774 7.23512 -2.73508 20.4554 +12 4501 852.098 830.984 114.89 6.17051 -1.47468 18.3569 +13 4501 865.245 843.441 112.402 6.2988 -1.48922 17.775 +12 4503 838.591 827.124 85.4548 10.7286 -4.09406 33.7992 +13 4503 847.217 831.484 82.6425 8.11407 -3.07999 24.6346 +12 4507 998.44 923.747 64.9275 2.79663 -0.776152 5.18893 +13 4507 1082.21 991.558 41.6165 2.80066 -0.777637 4.27542 +12 4520 1032.9 958.132 113.326 3.04124 -0.427638 5.18341 +13 4520 1125.41 1034.14 101.746 3.03604 -0.418509 4.24663 +12 4535 1169.42 1136.13 96.408 9.0329 -1.2334 11.6415 +13 4535 1220.61 1184.7 89.4106 9.14063 -1.24822 10.7934 +12 4536 1165.87 1132.48 116.228 8.95007 -0.911014 11.6083 +13 4536 1215.86 1179.99 111.194 9.07825 -0.92325 10.8037 +12 4538 54.681 36.9698 138.124 -16.8285 -1.05329 21.883 +13 4538 30.1915 12.0261 136.456 -17.1319 -1.07628 21.3359 +12 4548 69.8808 53.1552 137.391 -17.332 -1.13892 23.1725 +13 4548 47.0956 30.9697 135.471 -18.7355 -1.24523 24.0343 +12 4554 85.8913 67.9809 130.097 -15.7054 -1.28233 21.6397 +13 4554 63.0169 46.6701 128.121 -17.9592 -1.46991 23.7095 +12 4561 152.823 101.938 225.539 -4.82142 0.556154 7.61673 +13 4561 91.9423 34.2316 233.45 -4.81779 0.564009 6.71581 +12 4564 173.782 156.662 146.385 -13.6722 -0.830448 22.6377 +13 4564 155.852 139.561 145.345 -14.9593 -0.906995 23.79 +12 4565 139.797 121.808 164.387 -14.0269 -0.252835 21.5449 +13 4565 119.863 100.995 164.177 -13.9411 -0.24702 20.5413 +14 4565 96.7864 76.9634 164.979 -13.8947 -0.213388 19.5517 +12 4570 215.379 204.825 175.727 -20.0631 0.146241 36.7249 +13 4570 205.834 197.47 175.525 -25.9279 0.171512 46.3384 +12 4571 231.975 222.123 145.707 -20.5849 -1.48001 39.3363 +13 4571 223.668 213.753 144.406 -20.9066 -1.54124 39.091 +14 4571 215.57 205.141 145.278 -20.2916 -1.42024 37.1613 +12 4573 158.867 141.64 164.872 -14.053 -0.248879 22.4981 +13 4573 140.37 122.018 164.182 -13.7324 -0.25382 21.1183 +14 4573 119.406 99.8783 165.918 -13.4829 -0.190781 19.8477 +12 4576 208.247 197.428 144.837 -19.9254 -1.39105 35.8248 +13 4576 198.438 191.098 145.339 -30.086 -2.01357 52.8024 +12 4578 139.732 121.774 158.731 -14.0531 -0.42245 21.5821 +13 4578 119.34 100.518 159.04 -13.9905 -0.394243 20.5921 +14 4578 96.8592 77.2008 159.933 -14.0092 -0.353064 19.7155 +12 4581 415.312 398.825 189.518 -6.32833 0.542877 23.5068 +13 4581 407.982 391.029 190.467 -6.38706 0.55808 22.8622 +14 4581 400.577 382.437 191.978 -6.18831 0.566283 21.3659 +12 4582 297.594 261.422 221.601 -4.63261 0.723883 10.7147 +13 4582 269.599 230.014 226.399 -4.61308 0.726574 9.79089 +12 4584 315.456 298.062 154.693 -9.08251 -0.560861 22.2825 +13 4584 303.243 285.234 154.551 -9.1365 -0.545928 21.5213 +12 4585 315.456 298.062 154.693 -9.08251 -0.560861 22.2825 +13 4585 303.243 285.234 154.551 -9.1365 -0.545928 21.5213 +12 4592 524.852 519.145 150.653 -7.97208 -2.08939 67.9067 +13 4592 524.464 518.64 150.358 -7.84867 -2.07485 66.5502 +14 4592 523.802 517.732 150.968 -7.58855 -1.93671 63.8482 +15 4592 523.753 517.592 152.191 -7.48192 -1.80168 62.9145 +16 4592 523.612 517.457 152.839 -7.5001 -1.74656 62.9644 +17 4592 523.522 517.576 152.967 -7.77231 -1.79653 65.1812 +18 4592 523.47 517.554 153.23 -7.81672 -1.78178 65.5141 +12 4594 448.788 431.878 165.815 -5.10699 -0.223585 22.92 +13 4594 442.988 425.106 165.737 -5.00374 -0.213788 21.6747 +14 4594 436.39 417.796 166.398 -5.00234 -0.186486 20.8431 +15 4594 429.919 410.478 167.742 -4.96361 -0.141257 19.9367 +16 4594 422.677 402.383 168.606 -4.94654 -0.112434 19.0982 +12 4596 446.395 439.14 189.599 -12.0806 1.23976 53.4223 +13 4596 444.169 436.919 189.977 -12.2539 1.26868 53.459 +14 4596 441.876 434.358 191.329 -11.9812 1.3201 51.5549 +15 4596 440.039 432.293 193.235 -11.7548 1.41322 50.0327 +16 4596 438.098 430.307 194.852 -11.8218 1.51671 49.7479 +17 4596 436.189 428.463 195.744 -12.0535 1.59142 50.1647 +18 4596 434.222 426.131 196.568 -11.6395 1.57421 47.8981 +19 4596 432.197 423.982 196.674 -11.5962 1.55738 47.1752 +20 4596 429.996 421.568 196.681 -11.4452 1.51873 45.9901 +12 4603 424.042 402.994 235.257 -4.73425 1.59247 18.4131 +13 4603 415.227 393.292 238.467 -4.75894 1.60677 17.6695 +12 4604 433.691 415.798 143.445 -5.27975 -0.88289 21.6613 +13 4604 426.697 407.705 141.225 -5.17171 -0.894533 20.4066 +14 4604 419.246 399.088 140.767 -5.07124 -0.855028 19.2267 +12 4605 545.204 539.136 132.528 -5.6962 -3.56932 63.8649 +13 4605 544.895 538.757 131.997 -5.65828 -3.57513 63.1365 +14 4605 544.435 537.925 132.639 -5.37322 -3.31806 59.5324 +12 4607 558.967 554.277 166.161 -5.79382 -0.766464 82.6309 +13 4607 559.057 554.09 166.138 -5.46246 -0.726443 78.0427 +12 4609 660.704 647.15 196.608 2.02692 0.941401 28.5953 +13 4609 663.145 649.052 197.518 2.04249 0.940121 27.5025 +14 4609 665.52 651.127 199.584 2.08848 0.99756 26.9281 +15 4609 668.931 653.696 201.666 2.09334 1.01586 25.4401 +16 4609 672.212 656.582 203.671 2.15316 1.05907 24.7967 +17 4609 675.899 659.674 205.554 2.19625 1.08257 23.8873 +18 4609 679.848 662.847 207.364 2.22088 1.09042 22.7982 +19 4609 684.088 666.339 208.894 2.25558 1.09072 21.8371 +20 4609 688.597 669.993 209.884 2.28197 1.06913 20.832 +21 4609 693.196 673.949 210.68 2.33422 1.0557 20.1375 +22 4609 698.217 678.067 212.087 2.36342 1.04588 19.2347 +23 4609 703.789 682.64 214.143 2.39327 1.04866 18.3257 +24 4609 710.049 687.725 216.687 2.41789 1.05467 17.361 +12 4614 562.069 558.558 139.796 -7.26669 -5.05834 110.404 +13 4614 562.127 559.107 139.556 -8.43772 -5.92341 128.353 +14 4614 561.923 559.318 140.162 -9.82387 -6.74202 148.8 +15 4614 562.356 561.488 141.219 -29.2408 -19.5964 446.964 +12 4618 664.592 651.42 182.642 2.24429 0.399159 29.4249 +13 4618 667.299 653.508 182.979 2.24889 0.394372 28.1029 +14 4618 669.693 655.472 184.263 2.2714 0.430937 27.2545 +12 4619 561.593 549.469 209.902 -2.12513 1.64141 31.9678 +13 4619 560.682 548.452 211.083 -2.14679 1.67909 31.6913 +14 4619 560.069 547.121 213.211 -2.05306 1.67417 29.9324 +15 4619 559.602 545.982 215.914 -1.97028 1.69825 28.4567 +16 4619 559.213 545.686 218.163 -1.99922 1.79918 28.6517 +17 4619 559.055 545.126 219.988 -1.94764 1.81767 27.8251 +12 4620 560.086 554.519 181.075 -4.77371 0.793251 69.6221 +13 4620 561.059 555.414 180.069 -4.61462 0.686456 68.6518 +14 4620 559.971 554.038 182.492 -4.48928 0.872504 65.3213 +15 4620 560.47 554.517 183.962 -4.42879 1.00213 65.097 +16 4620 561.607 555.814 184.276 -4.4463 1.05909 66.9036 +12 4621 581.385 577.34 151.5 -3.74092 -2.83533 95.806 +13 4621 581.782 577.579 151.21 -3.55 -2.76619 92.2137 +14 4621 582.319 577.644 152.079 -3.12993 -2.38711 82.906 +15 4621 582.885 578.71 153.074 -3.43155 -2.54463 92.8243 +16 4621 583.561 579.237 153.76 -3.22929 -2.3717 89.625 +17 4621 584.387 580.02 153.533 -3.09611 -2.37646 88.7469 +18 4621 584.982 580.477 153.89 -2.93079 -2.26137 86.0413 +12 4623 739.373 735.117 134.209 16.3844 -4.87753 91.0684 +13 4623 741.397 737.174 133.739 16.7714 -4.97588 91.7885 +14 4623 743.435 739.067 134.378 16.4635 -4.7316 88.732 +15 4623 746.033 741.564 135.376 16.405 -4.50504 86.7335 +16 4623 748.812 744.122 135.419 15.9496 -4.28764 82.6427 +12 4625 746.606 724.282 199.218 3.29757 0.634361 17.3614 +13 4625 755.109 731.628 200.93 3.32949 0.642255 16.5053 +14 4625 764.531 739.497 203.635 3.32516 0.660454 15.4817 +12 4627 821.777 804.604 130.78 6.63805 -1.31606 22.5693 +13 4627 831.592 812.643 129.079 6.29403 -1.2409 20.4536 +12 4628 707.777 688.454 182.608 2.73029 0.271157 20.0575 +13 4628 712.714 693.427 182.899 2.87287 0.279768 20.095 +14 4628 717.533 697.966 184.215 2.96406 0.311888 19.8075 +12 4630 722.396 717.153 151.393 11.5594 -2.19856 73.9165 +13 4630 724.182 719.205 151.145 12.3694 -2.3427 77.8637 +14 4630 726.286 721.153 152.393 12.2156 -2.14133 75.5101 +12 4631 722.396 717.153 151.393 11.5594 -2.19856 73.9165 +13 4631 724.182 719.205 151.145 12.3694 -2.3427 77.8637 +12 4634 706.912 684.462 201.838 2.32931 0.693487 17.2638 +13 4634 713.293 689.501 203.84 2.34201 0.699566 16.2903 +12 4635 758.674 737.598 216.566 3.80035 1.11405 18.3892 +13 4635 767.436 745.129 218.857 3.80165 1.10775 17.3746 +14 4635 777.055 753.644 222.43 3.8431 1.1375 16.5553 +15 4635 788.408 763.648 226.717 3.87998 1.16851 15.6532 +16 4635 801.293 774.705 230.938 3.87349 1.17343 14.5768 +12 4639 846.916 829.067 129.371 7.14309 -1.30859 21.7142 +13 4639 858.259 839.773 127.458 7.22671 -1.31913 20.9664 +12 4640 951.958 880.994 141.197 2.59173 -0.239622 5.46156 +13 4640 1021.93 936.117 135.083 2.58116 -0.236419 4.51631 +12 4644 871.346 848.822 134.501 6.2432 -0.914649 17.2076 +13 4644 887.666 862.849 131.651 6.01941 -0.891818 15.6171 +14 4644 903.931 880.435 130.695 6.72983 -0.963823 16.4956 +15 4644 923.496 897.795 129.849 6.56132 -0.898806 15.0802 +16 4644 946.959 917.719 125.576 6.19822 -0.868517 13.2551 +12 4662 1025.06 951.773 183.623 3.04535 0.0789273 5.28839 +13 4662 1116.15 1023.83 186.922 2.94735 0.0818474 4.19791 +12 4664 1052.75 977.737 250.971 3.17352 0.559366 5.16664 +13 4664 1149.33 1058.2 268.458 3.18158 0.563524 4.25298 +12 4670 1156.58 1124.86 156.989 9.26401 -0.268683 12.2196 +13 4670 1204.37 1170.29 155.6 9.375 -0.271948 11.3725 +12 4676 1143.44 1112.78 174.136 9.35241 0.022452 12.6398 +13 4676 1187.44 1154.72 174.476 9.4848 0.0266223 11.8426 +12 4684 176.521 125.655 252.365 -4.57292 0.839646 7.6195 +13 4684 118.224 60.2915 263.237 -4.55562 0.838021 6.69005 +12 4694 587.788 559.711 257.628 -0.416496 1.62181 13.8037 +13 4694 587.721 556.099 264.038 -0.370968 1.54893 12.2567 +14 4694 585.934 553.126 271.903 -0.386799 1.62166 11.8132 +15 4694 585.67 550.162 281.048 -0.361394 1.63672 10.9152 +12 4696 557.433 523.104 273.165 -0.815616 1.56958 11.2899 +13 4696 553.45 516.996 282.227 -0.826774 1.61161 10.6318 +14 4696 547.841 507.922 293.556 -0.830483 1.62417 9.709 +12 4699 583.794 539.806 307.053 -0.31462 1.63872 8.81077 +13 4699 582.18 532.708 322.145 -0.29727 1.62093 7.83414 +14 4699 579.827 523.83 342.852 -0.2852 1.63068 6.92127 +12 4703 557.279 508.159 324.58 -0.571712 1.6592 7.89037 +13 4703 551.529 495.201 344.681 -0.553389 1.63857 6.8807 +12 4705 642.576 595.73 316.478 0.378578 1.64682 8.27327 +13 4705 648.309 596.2 334.215 0.399435 1.66335 7.43776 +12 4707 824.413 790.825 259.369 3.43599 1.38357 11.539 +13 4707 842.533 807.376 266.873 3.55956 1.4365 11.0242 +14 4707 864.857 826.83 276.602 3.60617 1.46547 10.1919 +15 4707 892.089 849.325 288.404 3.54883 1.45141 9.06316 +16 4707 924.917 877.68 301.594 3.58606 1.46396 8.20488 +17 4707 964.619 912.629 317.243 3.66842 1.4918 7.45481 +12 4708 800.196 760.468 283.414 2.57759 1.49488 9.75589 +13 4708 820.785 776.935 294.865 2.58746 1.49459 8.83863 +14 4708 846.018 796.895 309.922 2.58563 1.49881 7.88988 +15 4708 878.289 822.595 329.032 2.59179 1.50628 6.95895 +12 4710 793.824 739.912 329.569 1.83593 1.56143 7.18907 +13 4710 822.002 759.952 352.428 1.83905 1.55452 6.24612 +12 4712 777.125 728.235 313.14 1.84104 1.54132 7.92749 +13 4712 800.072 744.706 332.894 1.84834 1.5527 7.00034 +14 4712 830.157 765.714 358.544 1.83874 1.54778 6.01423 +12 4713 794.17 755.193 283.649 2.54417 1.52689 9.9437 +13 4713 814.097 771.11 295.193 2.55587 1.52873 9.01624 +12 4715 760.179 716.865 296.625 1.86789 1.53494 8.94806 +13 4715 778.629 730.039 311.12 1.86905 1.52852 7.97655 +14 4715 801.516 746.376 329.693 1.86997 1.52786 7.02894 +12 4723 918.004 855.978 314.8 2.67117 1.22927 6.24861 +13 4723 971.526 898.639 338.897 2.66755 1.22367 5.31744 +12 4724 849.186 787.869 319.83 2.0992 1.28755 6.32087 +13 4724 890.81 819.073 344.511 2.10595 1.28533 5.40273 +12 4732 890.13 831.874 300.887 2.58699 1.18052 6.65291 +13 4732 936.833 867.963 321.544 2.55257 1.15971 5.62763 +12 4736 1015.42 941.748 329.972 2.95904 1.1455 5.2605 +13 4736 1104.14 1011.98 363.585 2.88273 1.11171 4.2056 +13 4758 243.323 229.112 81.7998 -13.8427 -3.44159 27.2721 +14 4758 230.549 215.211 79.9411 -13.2729 -3.25381 25.2683 +13 4771 300.59 265.105 228.024 -4.677 0.835125 10.9222 +14 4771 273.593 234.205 234.448 -4.58165 0.839968 9.83977 +15 4771 241.719 199.198 242.634 -4.64681 0.881506 9.11495 +16 4771 202.755 155.639 251.871 -4.63787 0.900847 8.22606 +17 4771 154.537 102.56 261.873 -4.70238 0.919962 7.45666 +18 4771 93.1198 35.9179 276.847 -4.84959 0.976537 6.77555 +13 4776 748.003 737.171 161.053 6.86548 -0.585231 35.7814 +14 4776 752.216 741.712 162.558 7.29552 -0.526523 36.8998 +15 4776 757.053 746.458 163.977 7.47788 -0.450074 36.5818 +13 4777 920.065 896.236 174.793 6.99958 0.0437096 16.2653 +14 4777 938.637 914.155 175.696 7.22019 0.0623548 15.831 +13 4793 65.4851 44.7231 101.805 -14.0762 -1.83818 18.6675 +14 4793 37.9485 16.7876 99.3509 -14.5098 -1.86581 18.3156 +13 4800 111.337 91.0086 56.1106 -13.165 -3.08482 19.0658 +14 4800 86.885 66.012 51.0061 -13.4506 -3.13566 18.5682 +13 4805 68.1838 48.6669 81.9877 -14.8999 -2.50085 19.8584 +14 4805 41.6699 20.7337 78.5334 -14.57 -2.41993 18.5121 +13 4806 57.3718 38.9636 108.205 -16.1128 -1.88646 21.0545 +14 4806 32.1575 14.5594 106.946 -17.6241 -2.01173 22.0236 +13 4808 237.711 217.595 38.0933 -9.92923 -3.59843 19.2668 +14 4808 220.07 198.883 32.5813 -9.87455 -3.55627 18.2928 +15 4808 201.804 179.4 27.616 -9.77617 -3.48216 17.2993 +16 4808 181.082 158.125 21.9222 -10.0259 -3.53162 16.8831 +13 4810 265.796 246.245 59.6494 -9.44446 -3.11015 19.8233 +14 4810 250.156 229.263 55.1379 -9.24005 -3.02641 18.5503 +15 4810 233.53 211.532 50.7872 -9.18216 -2.98071 17.619 +13 4818 232.513 211.921 29.6689 -9.83506 -3.73491 18.8209 +14 4818 214.501 193.616 24.22 -10.1605 -3.82271 18.5572 +13 4822 231.659 217.105 103.834 -13.9476 -2.54739 26.6307 +14 4822 219.689 204.245 101.837 -13.5591 -2.46987 25.094 +13 4828 228.351 208.266 31.6998 -10.1949 -3.77496 19.2965 +14 4828 210.16 188.567 26.351 -9.93525 -3.64434 17.9486 +15 4828 190.279 168.144 21.4386 -10.1744 -3.6743 17.5091 +13 4830 236.651 220.251 55.9964 -12.2144 -3.82759 23.6335 +14 4830 223.475 202.15 51.421 -9.72506 -3.05877 18.1748 +15 4830 204.701 182.095 47.6358 -9.61979 -2.9753 17.1444 +13 4834 302.583 282.693 83.2794 -8.29019 -2.41905 19.4858 +14 4834 288.206 268.151 80.4465 -8.6073 -2.47509 19.326 +15 4834 273.697 253.069 77.6029 -8.74577 -2.48032 18.7887 +16 4834 257.891 235.239 73.7719 -8.33929 -2.34958 17.1102 +17 4834 240.754 216.272 68.3168 -8.09189 -2.29363 15.8311 +18 4834 220.814 195.466 62.6605 -8.23767 -2.33505 15.2897 +19 4834 198.706 173.102 55.5934 -8.61932 -2.46002 15.1372 +20 4834 174.002 145.67 47.2609 -8.25785 -2.38115 13.6798 +21 4834 145.943 116.089 37.4492 -8.3417 -2.4363 12.9824 +13 4835 305.65 286.229 87.9973 -8.40566 -2.34701 19.9566 +14 4835 291.893 271.525 85.1707 -8.37767 -2.31243 19.0288 +13 4836 405.332 383.731 88.5833 -5.07869 -2.09562 17.943 +14 4836 395.489 373.921 86.1037 -5.33133 -2.16048 17.9696 +15 4836 386.01 364.163 83.2508 -5.49628 -2.20302 17.74 +13 4839 328.086 308.855 125.445 -7.86186 -1.32419 20.1534 +14 4839 315.145 295.178 124.398 -7.92011 -1.30353 19.4103 +15 4839 302.435 281.11 123.519 -7.73609 -1.24268 18.1746 +13 4842 349.814 329.18 87.8448 -6.76164 -2.21295 18.783 +14 4842 337.056 316.137 84.5748 -6.997 -2.26673 18.5268 +15 4842 325.453 302.87 81.8253 -6.75745 -2.16511 17.1617 +13 4843 349.814 329.18 87.8448 -6.76164 -2.21295 18.783 +14 4843 337.056 316.137 84.5748 -6.997 -2.26673 18.5268 +15 4843 325.453 302.87 81.8253 -6.75745 -2.16511 17.1617 +16 4843 312.41 288.3 78.4824 -6.62003 -2.10246 16.0748 +17 4843 297.274 272.546 73.1769 -6.78349 -2.16519 15.6733 +18 4843 279.498 253.716 66.8422 -6.87653 -2.20866 15.0326 +13 4844 328.724 308.737 89.6559 -7.54748 -2.23596 19.3914 +14 4844 315.657 294.627 86.8423 -7.50687 -2.19692 18.4296 +15 4844 302.116 279.788 84.0514 -7.39636 -2.13638 17.3585 +16 4844 286.702 263.057 80.5353 -7.33464 -2.09728 16.3918 +17 4844 269.856 244.879 75.6698 -7.30559 -2.09002 15.5172 +18 4844 250.898 224.642 69.8297 -7.33765 -2.10772 14.7615 +19 4844 229.85 201.943 62.6561 -7.30866 -2.12109 13.8882 +20 4844 205.394 176.033 54.6479 -7.39408 -2.16255 13.2003 +21 4844 178.113 146.94 45.4008 -7.4345 -2.19622 12.4332 +22 4844 146.749 113.305 35.3246 -7.43324 -2.20887 11.5887 +23 4844 109.885 73.3703 25.2043 -7.3504 -2.17198 10.6141 +24 4844 66.0897 26.4219 12.5674 -7.35925 -2.17048 9.77051 +13 4849 282.136 263.06 70.1023 -9.2197 -2.89332 20.3173 +14 4849 267.372 247.59 66.4116 -9.29144 -2.89024 19.592 +15 4849 252.535 231.284 62.9378 -9.02416 -2.77825 18.2376 +13 4850 406.412 386.506 82.2736 -5.48187 -2.44428 19.4704 +14 4850 397.383 376.416 79.1158 -5.43576 -2.40149 18.4851 +13 4851 404.405 385.688 102.332 -5.88762 -2.02389 20.707 +14 4851 395.625 375.697 100.087 -5.76653 -1.96141 19.4488 +15 4851 386.682 365.731 98.0687 -5.71422 -1.91738 18.4991 +13 4852 308.561 288.311 71.6365 -7.98405 -2.68482 19.139 +14 4852 294.231 273.153 67.729 -8.03587 -2.67902 18.3878 +15 4852 279.314 256.843 63.7476 -7.89396 -2.60801 17.2472 +16 4852 262.505 238.975 59.6325 -7.92277 -2.58469 16.4717 +13 4853 382.395 360.769 53.3887 -5.64243 -2.96734 17.9219 +14 4853 371.164 348.179 48.2975 -5.57122 -2.91084 16.8621 +13 4856 391.507 372.177 110.504 -6.0594 -1.73263 20.0506 +14 4856 382.097 361.036 108.39 -5.80125 -1.64409 18.4023 +13 4857 291.293 272.606 121.396 -9.14864 -1.47917 20.7407 +14 4857 278.021 259.176 120.917 -9.44992 -1.48038 20.5662 +15 4857 264.742 244.972 121.034 -9.36882 -1.40797 19.6045 +16 4857 250.25 228.568 121.634 -8.90158 -1.26893 17.8755 +17 4857 233.716 211.433 120.04 -9.05984 -1.2731 17.3929 +18 4857 215.155 189.346 117.587 -8.20847 -1.15023 15.0169 +13 4864 548.187 541.213 111.341 -4.72684 -4.73771 55.5723 +14 4864 547.868 541.027 111.587 -4.84353 -4.81023 56.6501 +15 4864 547.861 541.01 112.015 -4.8374 -4.77 56.5713 +16 4864 547.83 540.967 111.982 -4.83098 -4.76394 56.4682 +13 4866 471.444 452.566 117.168 -3.92987 -1.58445 20.5303 +14 4866 466.124 446.748 115.977 -3.97654 -1.57684 20.0036 +15 4866 460.34 441.63 114.543 -4.284 -1.67407 20.715 +13 4868 475.266 455.428 30.4165 -3.63611 -3.85664 19.5364 +14 4868 469.626 448.642 25.0096 -3.58198 -3.78449 18.4698 +15 4868 463.848 441.972 19.2204 -3.57777 -3.77229 17.7165 +16 4868 457.58 434.303 12.3843 -3.50705 -3.70298 16.6501 +13 4871 444.423 424.523 58.8595 -4.45731 -3.07691 19.4756 +14 4871 437.343 416.083 54.4218 -4.35125 -2.99233 18.2305 +15 4871 429.837 407.459 49.9882 -4.31386 -2.94914 17.319 +16 4871 421.156 397.778 44.5932 -4.32888 -2.94702 16.5786 +13 4872 522.214 506.992 72.9821 -3.08219 -3.52423 25.4613 +14 4872 520.654 502.111 71.1348 -2.57541 -2.9466 20.9015 +13 4875 496.603 476.967 30.2996 -3.08993 -3.89959 19.7377 +14 4875 491.998 471.175 24.7215 -3.03267 -3.8213 18.6131 +15 4875 487.322 465.668 18.4338 -3.0322 -3.83054 17.8984 +13 4876 462.427 442.08 62.2272 -3.88408 -2.92039 19.0476 +14 4876 455.845 434.753 58.0961 -3.91473 -2.9226 18.3758 +15 4876 449.411 427.238 53.8304 -3.87953 -2.88331 17.479 +16 4876 442.212 418.581 48.6211 -3.80393 -2.8239 16.4011 +17 4876 434.502 409.613 42.0016 -3.77805 -2.82403 15.5721 +18 4876 426.209 398.912 34.7462 -3.60794 -2.71767 14.1983 +19 4876 416.204 386.302 25.8485 -3.47343 -2.6408 12.9617 +13 4877 462.427 442.08 62.2272 -3.88408 -2.92039 19.0476 +14 4877 455.845 434.753 58.0961 -3.91473 -2.9226 18.3758 +15 4877 449.411 427.238 53.8304 -3.87953 -2.88331 17.479 +16 4877 442.212 418.581 48.6211 -3.80393 -2.8239 16.4011 +13 4878 446.752 427.782 115.074 -4.61002 -1.63609 20.4309 +14 4878 439.882 419.781 113.611 -4.53429 -1.58314 19.2816 +15 4878 432.828 411.974 112.167 -4.55226 -1.56318 18.5854 +16 4878 425.195 403.171 110.037 -4.49648 -1.53204 17.5976 +17 4878 416.471 393.609 107.42 -4.53668 -1.53739 16.9528 +18 4878 407.429 383.129 104.315 -4.46799 -1.51502 15.9493 +19 4878 397.394 371.613 100.026 -4.42046 -1.51737 15.0333 +20 4878 385.319 357.889 94.8995 -4.39132 -1.52659 14.1299 +21 4878 372.076 343.336 88.5785 -4.43852 -1.5751 13.4854 +22 4878 356.746 325.507 82.082 -4.34714 -1.56083 12.4069 +23 4878 338.947 305.692 75.3819 -4.37108 -1.57442 11.6547 +24 4878 319.379 282.303 66.4926 -4.20405 -1.54093 10.4534 +25 4878 294.328 255.022 58.5471 -4.30794 -1.56211 9.86049 +26 4878 264.906 221.545 47.0699 -4.26954 -1.5582 8.93835 +13 4879 545.303 539.105 121.5 -5.56904 -4.45075 62.5347 +14 4879 544.913 538.47 121.913 -5.3897 -4.24704 60.1561 +15 4879 545.027 538.433 122.852 -5.25672 -4.07313 58.7758 +16 4879 544.998 538.351 122.911 -5.21703 -4.03575 58.3057 +17 4879 545.221 538.599 122.431 -5.21947 -4.09053 58.5347 +18 4879 545.503 538.781 122.141 -5.11828 -4.05213 57.653 +19 4879 545.777 539.033 121.127 -5.08 -4.11983 57.4678 +20 4879 545.843 539.001 119.839 -5.00232 -4.16215 56.647 +13 4880 545.303 539.105 121.5 -5.56904 -4.45075 62.5347 +14 4880 544.913 538.47 121.913 -5.3897 -4.24704 60.1561 +15 4880 545.027 538.433 122.852 -5.25672 -4.07313 58.7758 +16 4880 544.998 538.351 122.911 -5.21703 -4.03575 58.3057 +17 4880 545.221 538.599 122.431 -5.21947 -4.09053 58.5347 +18 4880 545.503 538.781 122.141 -5.11828 -4.05213 57.653 +19 4880 545.777 539.033 121.127 -5.08 -4.11983 57.4678 +20 4880 545.843 539.001 119.839 -5.00232 -4.16215 56.647 +13 4882 464.471 444.987 51.837 -3.99987 -3.33626 19.8917 +14 4882 458.158 437.843 47.3776 -4.0033 -3.31781 19.0787 +13 4885 484.066 464.228 49.1145 -3.39781 -3.35034 19.5362 +14 4885 478.889 458.008 44.3222 -3.36133 -3.30633 18.5607 +15 4885 473.438 451.534 39.4799 -3.33814 -3.27077 17.6945 +16 4885 467.224 444.64 33.7274 -3.38535 -3.30903 17.1613 +17 4885 461.382 437.299 25.8962 -3.30504 -3.27784 16.0936 +18 4885 454.392 428.665 18.2165 -3.23972 -3.22866 15.0649 +13 4891 584.957 580.124 76.7259 -2.73484 -10.6856 80.2064 +14 4891 585.382 580.304 75.9198 -2.55733 -10.2531 76.3196 +15 4891 587.267 580.75 74.9848 -1.83748 -8.06686 59.4727 +13 4894 611.795 602.257 106.398 0.125923 -3.74248 40.6334 +14 4894 611.991 602.355 105.809 0.135557 -3.73716 40.2193 +13 4896 690.015 672.616 119.175 2.48388 -1.6572 22.2757 +14 4896 694.027 675.988 117.812 2.51519 -1.63898 21.4852 +15 4896 699.163 679.991 117.005 2.51039 -1.56471 20.215 +16 4896 704.497 684.29 114.802 2.5237 -1.54319 19.1805 +17 4896 710.337 689.7 112.387 2.62314 -1.5739 18.7809 +18 4896 717.19 695.057 110.464 2.61219 -1.51421 17.5117 +13 4898 682.902 664.087 46.5169 2.09383 -3.60675 20.5989 +14 4898 685.576 666.673 42.251 2.16007 -3.71116 20.5029 +15 4898 689.535 670.145 38.9819 2.21546 -3.70848 19.9878 +16 4898 693.973 673.298 34.0292 2.19318 -3.60686 18.7466 +13 4900 596.088 590.081 79.4258 -1.20439 -8.35312 64.5104 +14 4900 595.978 590.444 79.0064 -1.31811 -9.1085 70.0298 +13 4902 564.547 559.41 83.0262 -4.70668 -9.3928 75.4473 +14 4902 564.527 559.667 82.2181 -4.97717 -10.0174 79.7471 +15 4902 564.993 559.72 81.5441 -4.53989 -9.30155 73.5015 +13 4903 690.208 672.393 82.9303 2.43173 -2.71139 21.7559 +14 4903 694.579 675.757 79.7012 2.42635 -2.65845 20.5917 +13 4908 663.287 647.817 62.1696 1.86547 -3.84305 25.0523 +14 4908 666.451 647.785 58.2572 1.63721 -3.29785 20.7643 +15 4908 670.647 650.244 54.8822 1.6083 -3.10595 18.9966 +13 4910 673.904 657.453 112.429 2.10103 -1.97307 23.5603 +14 4910 676.769 660.563 111.01 2.22766 -2.04981 23.9151 +15 4910 680.671 663.851 109.638 2.271 -2.01886 23.043 +16 4910 685.512 667.154 107.573 2.22236 -1.91012 21.1121 +13 4913 738.188 720.779 71.2976 3.96897 -3.13363 22.2638 +14 4913 744.557 726.094 67.8028 3.92742 -3.0562 20.9913 +13 4914 764.284 747.335 74.5733 4.90367 -3.1148 22.8676 +14 4914 771.272 753.71 71.5155 4.94602 -3.09946 22.0684 +13 4918 714.385 696.29 19.8664 3.11183 -4.54155 21.4194 +14 4918 719.456 700.662 13.9098 3.141 -4.54285 20.6226 +13 4920 752.807 735.169 47.592 4.36246 -3.81471 21.9736 +14 4920 759.657 741.381 43.0733 4.41148 -3.81435 21.2065 +15 4920 768.297 748.362 38.2433 4.27714 -3.62705 19.4416 +16 4920 776.767 756.259 31.9203 4.37955 -3.69138 18.8988 +13 4925 733.359 715.7 95.758 3.76567 -2.34506 21.9473 +14 4925 739.046 721.129 93.6443 3.88199 -2.37469 21.6315 +15 4925 744.727 727.591 92.4172 4.23707 -2.52144 22.6179 +13 4929 710.302 693.418 91.0378 3.20505 -2.60292 22.9552 +14 4929 714.862 696.602 88.4263 3.09755 -2.48348 21.2244 +15 4929 720.736 702.16 85.6573 3.21477 -2.52137 20.8639 +16 4929 727.143 707.468 82.3726 3.2103 -2.47036 19.6997 +17 4929 735.112 713.334 78.741 3.09677 -2.32131 17.7968 +13 4930 758.639 739.896 57.2851 4.27231 -3.31195 20.6777 +14 4930 766.775 746.641 52.3554 4.19432 -3.21476 19.2498 +15 4930 775.421 754.51 48.0821 4.26053 -3.20504 18.5343 +16 4930 784.677 763.14 42.7507 4.36768 -3.24496 17.9962 +17 4930 794.472 772.706 37.2738 4.5632 -3.34578 17.8058 +13 4935 883.38 864.583 45.9045 7.82491 -3.62781 20.6192 +14 4935 896.928 877.224 40.84 7.83418 -3.59894 19.6704 +13 4940 910.235 891.447 77.7172 8.59633 -2.71997 20.6288 +14 4940 925.281 905.383 74.1399 8.52315 -2.66486 19.4785 +15 4940 942.093 921.284 70.6161 8.58383 -2.63911 18.6254 +16 4940 960.726 938.716 65.2546 8.56991 -2.62587 17.6085 +13 4945 838.976 820.11 112.4 6.53214 -1.7213 20.5442 +14 4945 850.418 830.178 111.278 6.39219 -1.63418 19.149 +15 4945 863.136 842.633 110.025 6.64329 -1.64601 18.9031 +16 4945 876.748 856.368 106.584 7.0421 -1.74663 19.017 +17 4945 891.531 870.45 103.207 7.18476 -1.77464 18.3851 +18 4945 907.523 885.584 99.6998 7.2955 -1.79115 17.6665 +13 4946 859.196 840.352 35.252 7.11598 -3.92239 20.5677 +14 4946 871.664 851.769 29.481 7.0766 -3.87095 19.4809 +15 4946 885.68 864.762 23.7903 7.0907 -3.82792 18.5289 +16 4946 898.294 878.699 16.6569 7.91482 -4.28169 19.7788 +13 4956 973.246 958.86 61.7683 13.579 -4.14761 26.9401 +14 4956 987.084 972.164 58.695 13.5916 -4.10995 25.9768 +13 4963 978.822 957.695 104.665 9.38828 -1.73367 18.3447 +14 4963 997.68 976.898 102.066 10.0313 -1.82956 18.6487 +15 4963 1019.04 996.898 99.1132 9.93343 -1.78885 17.5035 +16 4963 1043.38 1019.83 95.1448 9.89162 -1.77184 16.4518 +13 4996 119.863 100.995 164.177 -13.9411 -0.24702 20.5413 +14 4996 96.7864 76.9634 164.979 -13.8947 -0.213388 19.5517 +13 5007 217.896 208.564 154.912 -22.5423 -1.03269 41.5284 +14 5007 209.575 199.453 156.107 -21.2264 -0.888717 38.2906 +13 5012 147.176 93.9158 244.833 -4.66336 0.725946 7.27705 +14 5012 81.8867 20.5293 256.354 -4.61948 0.730997 6.31666 +13 5014 268.573 228.521 245.082 -4.5731 0.968681 9.67682 +14 5014 234.06 190.213 253.897 -4.60007 0.992822 8.83922 +13 5016 177.999 169.943 193.041 -28.7771 1.34609 48.1132 +14 5016 169.965 161.834 194.626 -29.0394 1.43822 47.6645 +15 5016 162.742 154.324 196.888 -28.5112 1.53358 46.0411 +16 5016 155.007 146.49 198.936 -28.6685 1.64498 45.5071 +17 5016 147.282 138.474 199.775 -28.1926 1.64179 44.0039 +13 5017 161.419 112.039 226.827 -4.87483 0.587109 7.84882 +14 5017 103.462 48.6648 235.857 -4.96106 0.617586 7.07292 +13 5020 163.376 155.81 198.273 -31.6781 1.80469 51.2277 +14 5020 156.053 147.594 200.107 -28.7997 1.7307 45.821 +13 5024 300.577 282.678 138.593 -9.2726 -1.02819 21.6535 +14 5024 287.49 269.239 138.187 -9.47868 -1.02027 21.2353 +15 5024 274.281 254.113 138.053 -8.9298 -0.92688 19.2174 +16 5024 258.577 239.44 138.176 -9.85145 -0.973349 20.2523 +13 5025 325.954 306.656 139.559 -7.89415 -0.926753 20.084 +14 5025 313.098 292.922 138.899 -7.893 -0.904019 19.2102 +13 5026 360.695 332.694 201.817 -4.774 0.555593 13.8414 +14 5026 343.921 313.381 204.953 -4.67222 0.564571 12.6909 +13 5027 279.533 241.223 222.333 -4.62737 0.693759 10.1168 +14 5027 247.761 205.693 228.27 -4.61968 0.707586 9.21306 +15 5027 209.988 163.419 236.256 -4.60887 0.731315 8.32262 +16 5027 162.891 110.763 245.56 -4.60273 0.749202 7.43513 +13 5029 296.766 277.745 150.08 -8.83327 -0.643133 20.3762 +14 5029 283.107 265.167 150.541 -9.77427 -0.668073 21.6035 +15 5029 269.974 247.647 151.34 -8.1697 -0.517582 17.3587 +13 5033 405.924 388.33 197.579 -6.21695 0.754852 22.0284 +14 5033 397.754 379.764 199.858 -6.32426 0.806295 21.5443 +13 5036 444.846 436.935 200.915 -11.1839 1.9053 48.992 +14 5036 442.573 434.018 202.447 -10.4847 1.85808 45.3036 +13 5037 496.087 475.182 239.391 -2.91566 1.70965 18.5398 +14 5037 491.83 469.975 243.984 -2.89355 1.74824 17.734 +15 5037 486.494 463.314 249.45 -2.8517 1.77491 16.7197 +16 5037 481.177 456.718 254.948 -2.81954 1.80296 15.8464 +17 5037 474.569 448.519 260.552 -2.78349 1.80833 14.8781 +18 5037 467.455 439.521 266.566 -2.73265 1.80206 13.8751 +19 5037 459.414 429.164 272.791 -2.66614 1.77458 12.8124 +20 5037 449.824 417.083 279.658 -2.6206 1.75222 11.8375 +21 5037 438.46 403.767 287.249 -2.64909 1.77115 11.1714 +13 5038 538.976 514.567 246.594 -1.5533 1.62275 15.8785 +14 5038 535.486 509.577 252.095 -1.53566 1.6428 14.9587 +15 5038 532.182 504.541 258.411 -1.50367 1.66263 14.0216 +16 5038 528.372 498.926 265.113 -1.48103 1.683 13.1623 +13 5041 485.593 480.89 176.305 -14.1607 0.3942 82.4212 +14 5041 484.827 480.043 177.228 -14.0051 0.491158 81.0153 +13 5044 522.811 516.216 171.526 -7.06593 -0.108183 58.7714 +14 5044 521.985 515.254 172.55 -6.98843 -0.0242407 57.5788 +15 5044 521.687 514.988 174.141 -7.04657 0.103173 57.8605 +16 5044 521.318 514.654 175.161 -7.11313 0.186007 58.1631 +17 5044 521.226 514.495 175.671 -7.04974 0.2248 57.5845 +18 5044 521.035 514.116 176.28 -6.87254 0.265966 56.0164 +19 5044 520.83 513.813 176.244 -6.79234 0.259521 55.2344 +20 5044 520.567 513.061 175.728 -6.36849 0.205649 51.635 +21 5044 520.144 512.13 174.797 -5.99298 0.130212 48.3605 +22 5044 519.698 511.466 174.315 -5.86293 0.0953105 47.0764 +13 5046 496.629 489.81 164.992 -8.89641 -0.619385 56.8412 +14 5046 495.237 488.442 165.537 -9.03735 -0.578422 57.0388 +15 5046 494.167 487.71 166.308 -9.59823 -0.544528 60.0171 +16 5046 493.59 487.289 167.15 -9.88609 -0.486267 61.5091 +17 5046 493.168 486.564 167.405 -9.46676 -0.44318 58.6867 +18 5046 492.467 485.879 167.623 -9.5478 -0.42657 58.8346 +19 5046 491.827 485.07 167.268 -9.35878 -0.444016 57.3567 +20 5046 491.28 484.401 166.508 -9.23639 -0.495557 56.3444 +21 5046 490.117 483.232 165.506 -9.31969 -0.573375 56.299 +22 5046 489.297 482.037 164.653 -8.89791 -0.606784 53.3846 +23 5046 488.375 480.884 164.922 -8.6891 -0.568706 51.7355 +24 5046 487.614 479.85 164.907 -8.43658 -0.549816 49.9184 +25 5046 486.332 478.587 164.241 -8.5466 -0.597368 50.0431 +13 5048 559.691 555.109 133.028 -5.84625 -4.66898 84.5891 +14 5048 559.718 555.441 133.635 -6.25968 -4.92563 90.6201 +13 5051 661.376 646.66 208.362 1.89137 1.2961 26.3369 +14 5051 663.857 648.631 210.59 1.91548 1.33123 25.4538 +15 5051 667.022 651.302 213.355 1.96351 1.3839 24.6549 +16 5051 670.476 654.129 215.605 2.00177 1.40483 23.7105 +17 5051 673.771 657.364 217.712 2.10223 1.4686 23.6226 +18 5051 677.388 660.624 219.923 2.17337 1.5082 23.1196 +19 5051 680.765 663.624 222.118 2.23141 1.54381 22.6111 +20 5051 684.709 667.008 223.343 2.28046 1.53212 21.8956 +21 5051 688.429 670.647 224.493 2.38238 1.55982 21.7951 +22 5051 692.613 674.481 226.551 2.46044 1.59076 21.3754 +23 5051 697.441 678.563 229.088 2.50055 1.60005 20.5304 +24 5051 702.933 682.584 232.134 2.46475 1.56479 19.0461 +25 5051 708.177 686.391 235.03 2.43159 1.53305 17.7908 +26 5051 714.431 691.174 236.705 2.42209 1.47467 16.6644 +13 5052 560.682 548.452 211.083 -2.14679 1.67909 31.6913 +14 5052 560.069 547.121 213.211 -2.05306 1.67417 29.9324 +15 5052 559.602 545.982 215.914 -1.97028 1.69825 28.4567 +16 5052 559.213 545.686 218.163 -1.99922 1.79918 28.6517 +17 5052 559.055 545.126 219.988 -1.94764 1.81767 27.8251 +13 5053 567.927 551.247 226.894 -1.34064 1.74021 23.2351 +14 5053 566.514 549.308 230.698 -1.34381 1.80582 22.5254 +13 5056 737.922 714.319 204.312 2.92123 0.715917 16.4205 +14 5056 746.272 721.525 207.224 2.96744 0.746027 15.6615 +15 5056 755.996 729.269 210.721 2.94307 0.761046 14.5014 +16 5056 767.46 739.031 213.907 2.98338 0.77565 13.6327 +17 5056 780.13 749.676 217.414 3.00852 0.785956 12.7265 +13 5058 780.681 762.931 210.924 5.17833 1.15202 21.8345 +14 5058 788.954 770.742 213.726 5.29116 1.20548 21.2814 +15 5058 798.702 778.716 217.157 5.0834 1.19069 19.3921 +16 5058 808.787 788.971 219.665 5.40046 1.2689 19.5587 +13 5060 815.565 796.606 204.069 5.83647 0.88436 20.4423 +14 5060 825.685 806.19 206.584 5.95489 0.929353 19.8805 +15 5060 837.296 816.963 209.457 6.01628 0.966963 19.0613 +16 5060 850.449 830.737 212.742 6.56436 1.08698 19.6622 +17 5060 867.241 844.382 214.788 6.05505 0.985372 16.9548 +18 5060 887.874 859.005 218.145 5.17848 0.842712 13.4253 +19 5060 908.968 880.29 221.784 5.60802 0.916474 13.5146 +13 5062 857.668 838.967 173.772 7.12635 0.026379 20.7245 +14 5062 870.013 850.545 174.872 7.18618 0.0556747 19.908 +15 5062 883.99 863.742 176.372 7.28049 0.0933419 19.142 +13 5063 892.203 865.635 182.056 5.71436 0.18604 14.5877 +14 5063 912.965 883.946 183.943 5.61619 0.205258 13.356 +13 5064 860.844 837.737 183.83 5.84128 0.255154 16.7726 +14 5064 875.567 851.75 184.985 5.99944 0.2736 16.2733 +15 5064 892.798 867.828 186.827 6.09315 0.300595 15.522 +16 5064 912.489 885.648 188.097 6.06223 0.305052 14.4394 +13 5065 920.119 897.491 147.387 7.37222 -0.604555 17.1282 +14 5065 939.34 914.971 146.935 7.26909 -0.571321 15.9043 +13 5067 922.178 892.247 182.534 5.6105 0.173723 12.9493 +14 5067 947.63 914.891 184.833 5.54681 0.196548 11.8385 +13 5071 841.978 819.476 224.052 5.54816 1.22218 17.2241 +14 5071 856.213 832.257 228.128 5.53058 1.23939 16.1787 +15 5071 872.216 847.532 231.915 5.71567 1.28523 15.7014 +16 5071 891.291 863.907 237.296 5.52625 1.26405 14.1531 +17 5071 911.801 883.101 241.366 5.65687 1.2823 13.5046 +18 5071 935.703 904.21 247.53 5.56271 1.27368 12.3065 +19 5071 962.468 927.102 252.005 5.36001 1.20216 10.9588 +20 5071 994.953 958.102 259.293 5.61752 1.25994 10.5172 +21 5071 1032.28 992.049 266.474 5.64471 1.25014 9.63501 +22 5071 1076.37 1032.36 275.691 5.69711 1.25504 8.8058 +13 5100 188.255 137.39 334.373 -4.44906 1.70567 7.61959 +14 5100 132.71 74.0978 357.97 -4.37009 1.6965 6.61254 +13 5112 389.425 353.044 286.436 -3.25026 1.67702 10.6534 +14 5112 369.835 330.451 298.111 -3.26951 1.70834 9.84079 +15 5112 347.097 302.982 312.29 -3.1958 1.6978 8.78561 +13 5113 345.631 301.065 316.228 -3.18109 1.72807 8.69661 +14 5113 315.919 266.068 334.175 -3.164 1.73824 7.77464 +13 5132 676.63 636.997 294.101 0.90902 1.64327 9.77911 +14 5132 684.234 640.782 308.13 0.92313 1.67228 8.91966 +13 5134 792.703 747.573 300.934 2.17983 1.52445 8.58797 +14 5134 815.067 764.855 317.379 2.19842 1.54605 7.71862 +15 5134 844.103 786.998 338.114 2.20621 1.5545 6.78707 +13 5137 760.63 706.907 333.762 1.51047 1.60882 7.21425 +14 5137 783.748 722.369 358.339 1.52438 1.62323 6.31439 +13 5144 849.033 800.673 307.643 2.65993 1.49716 8.01443 +14 5144 881.013 825.9 326.266 2.64567 1.4952 7.03233 +15 5144 922.669 859.335 350.407 2.65559 1.50589 6.1196 +14 5204 436.749 415.034 56.4678 -4.27465 -2.87893 17.848 +15 5204 428.484 405.913 52.1401 -4.30913 -2.87269 17.1708 +16 5204 419.457 395.797 47.075 -4.31584 -2.85552 16.3808 +14 5205 501.041 486.478 114.963 -4.00262 -2.13528 26.6135 +15 5205 498.504 481.391 114.344 -3.48598 -1.83661 22.6488 +14 5211 275.865 267.6 174.148 -21.6869 0.0840685 46.893 +15 5211 270.802 262.821 175.982 -22.798 0.210482 48.5589 +14 5214 375.651 349.814 235.09 -4.86303 1.29391 15.001 +15 5214 362.294 334.832 239.85 -4.83644 1.31043 14.1131 +14 5215 281.332 262.864 142.346 -9.54666 -0.887353 20.9863 +15 5215 268.121 247.759 142.558 -9.00724 -0.799226 19.0343 +16 5215 252.187 231.769 142.474 -9.40132 -0.799208 18.9814 +17 5215 236.136 215.021 141.281 -9.49963 -0.803195 18.3554 +18 5215 218.58 195.765 139.788 -9.2054 -0.778526 16.9882 +19 5215 198.219 174.124 137.236 -9.16971 -0.794015 16.0847 +14 5217 445.806 435.318 208.678 -8.38677 1.83475 36.9542 +15 5217 442.825 432.858 210.935 -8.98574 2.05228 38.8856 +16 5217 439.894 429.621 212.93 -8.87135 2.09548 37.7273 +14 5218 530.158 513.533 225.957 -2.56548 1.71578 23.313 +15 5218 528.441 510.094 229.618 -2.37497 1.66191 21.125 +14 5221 860.335 841.088 172.302 6.99857 -0.0154186 20.1364 +15 5221 874.681 853.639 173.902 6.76811 0.026766 18.4197 +16 5221 889.387 867.498 174.435 6.86681 0.0387942 17.7061 +14 5229 79.6227 57.1281 70.723 -12.6544 -2.43879 17.2296 +15 5229 51.3508 27.8906 66.7517 -12.7809 -2.42934 16.5205 +14 5242 93.1045 71.1722 74.1878 -12.6487 -2.41647 17.6714 +15 5242 66.7638 48.4419 70.9492 -15.9134 -2.98759 21.1536 +14 5243 102.847 84.9798 90.0558 -15.2338 -2.48925 21.6923 +15 5243 81.5123 61.535 87.177 -14.1981 -2.30368 19.4007 +14 5252 180.17 161.648 87.837 -12.4528 -2.46559 20.9254 +15 5252 162.432 142.995 85.8746 -12.3563 -2.40366 19.9396 +14 5264 240.63 220.689 57.6191 -9.93816 -3.10418 19.4366 +15 5264 224.218 202.675 52.8477 -9.60807 -2.99223 17.9908 +16 5264 205.6 182.475 46.9065 -9.38304 -2.92547 16.7597 +17 5264 184.64 160.665 40.7682 -9.51995 -2.95927 16.1654 +14 5265 266.749 245.882 54.1812 -8.8246 -3.05487 18.5738 +15 5265 250.297 228.224 51.5769 -8.74304 -2.95141 17.5594 +14 5268 315.339 295.873 40.4545 -8.11847 -3.65333 19.9095 +15 5268 303.24 282.175 35.1913 -7.81094 -3.51031 18.3987 +14 5269 357.972 335.622 52.0228 -6.04653 -2.90401 17.3411 +15 5269 345.687 321.984 47.2718 -5.97961 -2.84582 16.3508 +16 5269 331.643 306.802 41.6538 -6.00964 -2.83706 15.6025 +17 5269 316.306 290.177 34.2118 -6.02848 -2.8501 14.8328 +18 5269 299.609 272.687 26.0499 -6.18408 -2.92902 14.396 +19 5269 281.252 251.254 15.7515 -5.87884 -2.81316 12.9202 +14 5272 299.032 278.789 84.1171 -8.23983 -2.35463 19.146 +15 5272 285.134 263.971 81.4742 -8.23449 -2.31938 18.3139 +14 5275 404.203 383.966 114.993 -5.45089 -1.53583 19.1522 +15 5275 395.313 374.075 113.79 -5.41855 -1.4938 18.2486 +16 5275 385.333 363.108 111.873 -5.41936 -1.47387 17.439 +17 5275 374.843 351.242 109.275 -5.34215 -1.44705 16.4222 +18 5275 363.147 337.85 106.117 -5.23223 -1.41708 15.3209 +19 5275 349.907 322.852 101.721 -5.15504 -1.41226 14.3252 +14 5276 404.203 383.966 114.993 -5.45089 -1.53583 19.1522 +15 5276 395.313 374.075 113.79 -5.41855 -1.4938 18.2486 +16 5276 385.333 363.108 111.873 -5.41936 -1.47387 17.439 +14 5283 312.021 289.859 20.7471 -7.21176 -3.68677 17.4887 +15 5283 298.112 274.02 13.0345 -6.94413 -3.56339 16.0876 +14 5285 414.275 392.699 53.8524 -4.86158 -2.96254 17.9626 +15 5285 405.372 382.631 49.2847 -4.823 -2.91877 17.0431 +16 5285 395.155 371.237 43.5043 -4.81501 -2.90489 16.2041 +17 5285 384.528 359.191 36.2391 -4.77073 -2.89628 15.2968 +18 5285 372.415 346.001 28.83 -4.82247 -2.92882 14.6729 +19 5285 359.125 330.863 19.1119 -4.75972 -2.922 13.7134 +14 5290 356.729 334.238 20.6882 -6.03847 -3.63425 17.2328 +15 5290 344.555 320.493 13.8735 -5.91594 -3.54907 16.1076 +14 5292 315.616 294.648 65.4904 -7.5304 -2.75049 18.4847 +15 5292 301.627 279.532 61.5383 -7.48644 -2.7063 17.542 +16 5292 286.699 263.055 56.3113 -7.33491 -2.64768 16.3923 +14 5294 371.287 350.017 95.8929 -6.01736 -1.94358 18.2218 +15 5294 360.328 338.002 93.5804 -5.99612 -1.9072 17.3591 +14 5306 472.555 452.925 106.638 -3.74883 -1.81188 19.7434 +15 5306 467.169 446.96 105.047 -3.78462 -1.80227 19.1779 +16 5306 461.393 439.906 102.691 -3.70405 -1.75402 18.0379 +17 5306 455.198 432.376 99.6024 -3.63307 -1.72406 16.9822 +18 5306 448.222 424.029 95.9486 -3.58207 -1.70749 16.0199 +14 5311 447.174 426.358 29.5062 -4.19027 -3.69902 18.6189 +15 5311 440.363 418.483 23.8974 -4.15369 -3.65681 17.7134 +16 5311 433.018 409.894 17.1562 -4.10101 -3.61681 16.7611 +17 5311 424.735 400.835 9.19604 -4.1539 -3.6782 16.2165 +14 5317 424.828 406.151 30.33 -5.31286 -4.09898 20.7514 +15 5317 418.251 400.538 24.6777 -5.80134 -4.49339 21.8804 +14 5320 551.814 546.09 85.7146 -5.41878 -8.17706 67.7083 +15 5320 552.204 546.16 86.1488 -5.09775 -7.70632 64.1299 +16 5320 552.799 546.305 86.2614 -4.69551 -7.16335 59.689 +14 5323 534.102 520.871 66.6706 -3.06347 -4.3109 29.2934 +15 5323 533.272 518.667 63.7359 -2.80577 -4.01323 26.5373 +16 5323 531.688 515.136 59.7963 -2.52705 -3.66893 23.4152 +17 5323 528.926 513.003 54.5144 -2.72 -3.99195 24.3396 +18 5323 526.164 511.245 48.7346 -3.00249 -4.46869 25.9777 +19 5323 523.746 508.334 42.513 -2.99074 -4.54261 25.1468 +14 5324 466.385 446.49 73.4241 -3.86565 -2.68457 19.4812 +15 5324 461.284 440.394 70.7227 -3.81262 -2.62612 18.553 +16 5324 455.05 432.904 67.0586 -3.74755 -2.56602 17.5006 +14 5325 485.28 464.855 83.7797 -3.26839 -2.34254 18.9755 +15 5325 480.105 458.538 80.0101 -3.22425 -2.31241 17.9709 +16 5325 474.337 451.686 76.2478 -3.20664 -2.29091 17.1105 +17 5325 468.13 444.486 70.7915 -3.21302 -2.31867 16.392 +14 5330 675.11 657.046 77.4731 1.94919 -2.83619 21.4552 +15 5330 679.134 660.374 74.6081 1.99219 -2.81318 20.6605 +14 5331 638.397 627.283 97.1118 1.39376 -3.66073 34.873 +15 5331 640.29 628.908 96.6658 1.45021 -3.59537 34.0498 +14 5344 621.417 608.363 73.1854 0.487919 -4.10098 29.6885 +15 5344 624.583 610.789 72.0739 0.585017 -3.92427 28.0959 +14 5346 675.828 657.479 92.1444 1.9399 -2.36262 21.1217 +15 5346 680.298 661.695 90.0874 2.04255 -2.38986 20.8341 +16 5346 685.485 665.625 87.5184 2.05358 -2.30808 19.5155 +17 5346 690.787 669.751 83.9599 2.0741 -2.26985 18.424 +14 5349 779.424 761.196 26.5316 5.00555 -4.3118 21.2621 +15 5349 788.04 768.979 21.4681 5.02971 -4.26617 20.3335 +16 5349 797.323 777.396 15.0537 5.06121 -4.25353 19.4492 +17 5349 807.952 787.057 7.87232 5.1001 -4.2412 18.5486 +14 5353 819.451 800.889 63.2103 6.07403 -3.17297 20.8805 +15 5353 830.062 810.595 59.671 6.08427 -3.12303 19.9092 +16 5353 841.797 821.131 55.1123 6.03631 -3.06034 18.7542 +14 5354 819.451 800.889 63.2103 6.07403 -3.17297 20.8805 +15 5354 830.062 810.595 59.671 6.08427 -3.12303 19.9092 +14 5355 708.846 690.42 103.888 2.89433 -2.01043 21.0337 +15 5355 714.454 695.112 102.244 2.91316 -1.961 20.0387 +16 5355 720.616 700.305 99.4362 2.93711 -1.94168 19.0825 +14 5363 727.41 708.419 32.2304 3.33337 -3.97748 20.4084 +15 5363 734.012 713.978 27.0723 3.3367 -3.90854 19.3451 +14 5366 876.999 857.021 33.2836 7.19088 -3.75275 19.4006 +15 5366 891.809 870.428 27.578 7.09099 -3.64978 18.1273 +14 5369 874.162 854.244 64.7879 7.13585 -2.91434 19.4585 +15 5369 888.607 867.508 60.7563 7.10396 -2.85377 18.3688 +16 5369 904.38 882.123 55.3181 7.11523 -2.83662 17.4137 +14 5374 910.413 891.554 39.8122 8.56904 -3.78936 20.5512 +15 5374 926.642 905.891 34.3744 8.20775 -3.58457 18.6771 +14 5381 1039.45 1022.44 20.9277 13.5773 -4.79829 22.7883 +15 5381 1058.69 1041.37 16.3787 13.9283 -4.85259 22.3762 +14 5382 1049.79 1032.89 26.1112 13.9906 -4.66354 22.9307 +15 5382 1070.22 1052.43 22.3309 13.9088 -4.54476 21.7854 +14 5384 1049.75 1032.73 36.9841 13.8957 -4.28909 22.7772 +15 5384 1070.01 1052.46 33.2031 14.0913 -4.27373 22.0812 +14 5386 977.106 962.461 41.4155 13.4815 -4.82113 26.4658 +15 5386 991.764 976.592 37.8643 13.5314 -4.77911 25.545 +16 5386 1007.31 991.681 32.9421 13.6702 -4.8086 24.7984 +14 5387 991.247 976.27 53.3341 13.6896 -4.28669 25.8786 +15 5387 1006.81 991.109 50.0507 13.5923 -4.20186 24.6883 +16 5387 1023.3 1007.06 45.8759 13.6815 -4.19884 23.8594 +17 5387 1041.32 1024.77 41.6088 14.0127 -4.25949 23.4171 +18 5387 1061.12 1043.78 37.3955 13.9867 -4.19574 22.3491 +14 5392 978.691 963.982 60.7853 13.4805 -4.09269 26.3502 +15 5392 993.35 978.172 58.0115 13.5821 -4.06419 25.5347 +16 5392 1008.99 993.215 53.7619 13.5985 -4.05442 24.5643 +14 5393 1010.13 988.083 104.086 9.75765 -1.67513 17.576 +15 5393 1033.87 1011.08 101.818 9.99923 -1.67403 17.0037 +14 5412 87.9632 67.9257 143.603 -13.9825 -0.784133 19.3424 +15 5412 63.3912 42.552 143.783 -14.078 -0.749331 18.5984 +14 5417 272.828 234.304 228.347 -4.69522 0.773771 10.0608 +15 5417 241.184 198.831 235.846 -4.67206 0.798916 9.15117 +16 5417 202.356 155.671 244.162 -4.68522 0.820455 8.3019 +17 5417 154.966 101.806 253.078 -4.59339 0.810614 7.2907 +18 5417 93.7007 34.2783 263.723 -4.66312 0.821412 6.52236 +14 5418 230.91 187.165 234.576 -4.64955 0.757908 8.85998 +15 5418 189.15 139.712 243.352 -4.56776 0.765963 7.83952 +16 5418 136.207 80.9079 253.924 -4.59789 0.78747 7.00864 +14 5440 403.533 385.831 220.381 -6.25187 1.44222 21.895 +15 5440 395.902 377.32 223.965 -6.17613 1.47746 20.8573 +16 5440 387.707 368.248 227.484 -6.12415 1.50804 19.9178 +14 5441 399.858 381.974 224.935 -6.29861 1.56431 21.6722 +15 5441 392.21 373.326 228.774 -6.1825 1.59066 20.5241 +16 5441 383.695 364.011 232.576 -6.16347 1.62972 19.6896 +17 5441 374.412 354.108 235.669 -6.2209 1.66178 19.0885 +18 5441 364.116 342.732 239.054 -6.16554 1.66293 18.125 +19 5441 352.908 330.471 242.099 -6.14423 1.65774 17.2736 +20 5441 340.282 316.556 245.219 -6.09652 1.63837 16.3358 +14 5442 324.58 291.202 228.205 -4.58627 0.890774 11.6119 +15 5442 302.056 265.589 234.583 -4.52934 0.90923 10.6278 +16 5442 275.252 235.795 241.302 -4.55111 0.931813 9.82267 +17 5442 243.34 199.897 248.231 -4.5281 0.931992 8.92142 +18 5442 204.405 156.273 256.973 -4.52146 0.938753 8.05226 +19 5442 156.226 102.304 266.005 -4.51592 0.927928 7.18766 +20 5442 93.785 32.4363 278.221 -4.51596 0.922561 6.31757 +14 5445 309.95 275.976 210.477 -4.73705 0.594842 11.4081 +15 5445 284.58 248.124 216.04 -4.78832 0.636314 10.6313 +14 5450 510.1 502.569 199.017 -7.09396 1.86608 51.4638 +15 5450 509.365 501.914 201.055 -7.22339 2.03313 52.0182 +16 5450 508.8 501.243 202.723 -7.16282 2.12336 51.2928 +14 5451 433.163 424.675 203.785 -11.1629 1.95739 45.6609 +15 5451 430.807 422.158 205.97 -11.1017 2.05674 44.812 +16 5451 428.462 419.571 207.826 -10.9417 2.11296 43.5945 +17 5451 425.942 417.082 208.934 -11.1329 2.18756 43.7475 +18 5451 423.231 414.239 210.047 -11.1307 2.22181 43.1026 +14 5452 506.54 490.359 224.886 -3.41994 1.72731 23.9529 +15 5452 503.865 486.708 229.175 -3.30907 1.76328 22.5898 +16 5452 500.58 483.023 232.16 -3.33424 1.81449 22.0756 +17 5452 497.317 479.084 235.05 -3.30676 1.83234 21.2571 +18 5452 493.619 474.44 238.955 -3.24721 1.85133 20.2085 +14 5454 517.781 514.19 154.906 -13.728 -2.68464 107.926 +15 5454 518.025 514.753 156.354 -15.0244 -2.70834 118.433 +16 5454 518.308 515.478 157.422 -17.32 -2.92914 136.951 +17 5454 518.796 516.277 157.875 -19.3616 -3.19526 153.917 +18 5454 519.271 516.976 158.413 -21.1346 -3.38026 168.897 +19 5454 519.901 517.855 158.344 -23.5419 -3.81003 189.457 +14 5459 617.661 611.697 174.47 0.729693 0.145585 64.9864 +15 5459 618.818 612.783 176.213 0.824073 0.298972 64.2181 +16 5459 620.146 613.958 177.067 0.919012 0.365749 62.6383 +17 5459 621.503 615.35 177.557 1.04275 0.410603 62.9956 +18 5459 622.898 616.55 178.353 1.12866 0.465307 61.0544 +19 5459 624.4 617.918 178.471 1.22986 0.465495 59.7953 +20 5459 625.671 619.072 177.881 1.31151 0.409207 58.7345 +21 5459 627.031 620.373 176.893 1.40951 0.325845 58.209 +22 5459 628.324 621.626 176.633 1.50484 0.30303 57.8653 +23 5459 629.795 622.948 176.667 1.58756 0.299166 56.6066 +24 5459 631.341 624.381 177.14 1.68106 0.330811 55.6858 +25 5459 632.6 625.549 176.796 1.75533 0.300342 54.9695 +26 5459 633.748 626.531 175.561 1.80031 0.201485 53.7022 +14 5461 618.415 608.114 202.655 0.461795 1.55398 37.6248 +15 5461 619.366 609.121 204.934 0.514148 1.68187 37.8284 +14 5462 570.27 555.342 219.357 -1.41373 1.6733 25.9627 +15 5462 570.394 554.77 222.634 -1.34646 1.71141 24.806 +16 5462 570.118 553.988 225.474 -1.3135 1.75238 24.0291 +17 5462 569.952 553.538 227.888 -1.29615 1.80096 23.6122 +14 5463 669.083 646.515 242.232 1.41676 1.6513 17.1737 +15 5463 673.887 649.048 247.708 1.39114 1.61879 15.6039 +16 5463 678.72 652.71 253.011 1.42832 1.65543 14.9015 +14 5469 618.309 612.491 186.755 0.807762 1.28325 66.6095 +15 5469 619.558 613.93 188.379 0.95438 1.48181 68.8707 +14 5471 667.969 648.655 231.586 1.62442 1.63338 20.0664 +15 5471 670.856 651.482 234.376 1.69946 1.70569 20.0047 +16 5471 674.14 654.324 237.932 1.75057 1.76406 19.5585 +14 5477 746.272 721.525 207.224 2.96744 0.746027 15.6615 +15 5477 755.996 729.269 210.721 2.94307 0.761046 14.5014 +16 5477 767.46 739.031 213.907 2.98338 0.77565 13.6327 +14 5480 741.607 737.448 141.999 17.0554 -3.98532 93.1949 +15 5480 744.087 739.737 143.043 16.6101 -3.68079 89.0881 +14 5482 753.022 748.569 142.342 17.3087 -3.68129 87.0533 +15 5482 755.81 751.288 143.529 17.3729 -3.48341 85.7103 +16 5482 758.512 754.017 143.825 17.8029 -3.46957 86.2388 +17 5482 761.596 757.091 144.08 18.1277 -3.43079 86.0308 +18 5482 764.635 760.001 144.604 17.9736 -3.27418 83.6277 +19 5482 767.953 763.037 144.688 17.3078 -3.07777 78.843 +20 5482 770.891 766.023 143.684 17.8021 -3.21875 79.6181 +21 5482 773.914 769.235 142.902 18.8701 -3.43892 82.8422 +14 5483 827.645 815.72 166.119 9.82383 -0.303403 32.5022 +15 5483 833.627 822.784 166.095 11.0998 -0.334816 35.7433 +16 5483 840.701 830.816 167.021 12.5607 -0.316988 39.2097 +14 5487 752.062 739.706 175.901 6.19498 0.132451 31.3673 +15 5487 756.674 744.736 177.284 6.61947 0.199349 32.4658 +16 5487 761.918 750.49 177.395 7.16117 0.21345 33.9138 +14 5489 739.722 716.492 218.144 3.00978 1.04725 16.6843 +15 5489 748.655 724.014 222.048 3.03218 1.07239 15.729 +16 5489 759.015 732.663 226.344 3.04647 1.09032 14.7077 +17 5489 770.244 742.255 230.729 3.08385 1.11073 13.8477 +18 5489 782.841 752.843 236.024 3.1028 1.13112 12.9199 +19 5489 798.079 765.362 242.056 3.09519 1.13619 11.8465 +14 5492 843.032 823.791 128.846 6.51788 -1.22857 20.1433 +15 5492 854.763 835.923 127.977 6.991 -1.27949 20.5717 +16 5492 868.673 847.571 126.902 6.59561 -1.16969 18.3664 +17 5492 882.824 861.243 124.841 6.8016 -1.19506 17.9592 +18 5492 897.654 876.566 122.377 7.33823 -1.28572 18.3787 +19 5492 917.082 893.72 120.854 7.07078 -1.19563 16.5901 +20 5492 937.801 911.822 117.548 6.78675 -1.14351 14.9186 +14 5493 872.721 853.097 132.218 7.20357 -1.11233 19.7508 +15 5493 886.82 866.361 131.554 7.27959 -1.08434 18.9443 +16 5493 902.213 880.831 129.902 7.35211 -1.07906 18.1266 +14 5498 875.567 851.75 184.985 5.99944 0.2736 16.2733 +15 5498 892.798 867.828 186.827 6.09315 0.300595 15.522 +14 5499 953.965 920.976 190.1 5.6079 0.280818 11.7487 +15 5499 984.713 948.621 192.864 5.58342 0.297808 10.7387 +16 5499 1021.22 981.409 194.987 5.55391 0.298609 9.73453 +14 5500 873.851 848.188 234.131 5.53197 1.2826 15.1027 +15 5500 891.986 864.942 239.597 5.60955 1.32565 14.3312 +16 5500 912.982 884.114 244.501 5.64576 1.33313 13.4256 +17 5500 937.814 906.714 249.975 5.66957 1.33202 12.4623 +14 5503 896.563 869.306 238.596 5.65596 1.29558 14.2193 +15 5503 918.686 889.552 244.19 5.69942 1.31523 13.3031 +16 5503 944.491 911.558 249.666 5.46276 1.25281 11.7683 +14 5507 993.566 970.3 155.556 8.86589 -0.399378 16.6588 +15 5507 1017.92 993.093 155.756 8.83504 -0.369917 15.6107 +14 5513 1012.67 989.282 133.021 9.25662 -0.914672 16.5685 +15 5513 1037.74 1013.39 132.144 9.44632 -0.898125 15.9183 +16 5513 1066 1039.91 130.063 9.39655 -0.880909 14.8538 +14 5520 981.571 958.636 145.293 8.71252 -0.645488 16.8984 +15 5520 1005.87 981.39 144.982 8.69466 -0.611485 15.8297 +16 5520 1031.35 1005.51 143.563 8.76556 -0.608712 14.9947 +17 5520 1061.01 1033.28 142.209 8.74528 -0.593639 13.9773 +18 5520 1092.42 1064.68 141.213 9.35121 -0.612765 13.9736 +14 5521 976.731 941.536 194.236 5.60385 0.32633 11.0123 +15 5521 1012.91 973.65 197.69 5.51898 0.339823 9.87274 +14 5531 175.387 123.639 256.641 -4.50675 0.869718 7.48963 +15 5531 117.608 58.661 269.737 -4.48286 0.882841 6.57494 +14 5535 390.941 354.975 286.467 -3.26503 1.69679 10.776 +15 5535 372.022 332.67 298.584 -3.24229 1.71617 9.84872 +14 5536 374.903 337.281 295.042 -3.35027 1.74451 10.3016 +15 5536 353.796 312.161 308.338 -3.29968 1.74792 9.30878 +16 5536 328.005 281.421 324.039 -3.24657 1.7433 8.31994 +17 5536 295.875 243.241 342.412 -3.20126 1.7304 7.36355 +14 5537 365.205 323.991 306.747 -3.18471 1.74504 9.40392 +15 5537 341.045 296.199 322.178 -3.21619 1.78856 8.64237 +16 5537 311.448 260.932 340.738 -3.16988 1.78515 7.67226 +14 5538 349.602 306.184 309.865 -3.21609 1.69504 8.92658 +15 5538 321.785 273.584 326.694 -3.20699 1.71441 8.04088 +16 5538 287.672 233.7 346.993 -3.20352 1.73308 7.18097 +14 5543 340.714 296.154 313.88 -3.24083 1.70001 8.69786 +15 5543 311.314 262.063 331.752 -3.25274 1.73298 7.86928 +14 5544 324.403 276.824 322.973 -3.2193 1.69478 8.14588 +15 5544 290.216 236.985 343.79 -3.2225 1.72492 7.28104 +14 5548 443.17 411.967 273.135 -2.86434 1.72632 12.4211 +15 5548 431.803 397.612 282.445 -2.7926 1.72171 11.3356 +14 5549 497.271 455.433 302.36 -1.44167 1.66272 9.2638 +15 5549 486.718 440.826 317.4 -1.43785 1.6919 8.4455 +16 5549 473.936 422.173 336.046 -1.40737 1.69345 7.48744 +14 5550 497.271 455.433 302.36 -1.44167 1.66272 9.2638 +15 5550 486.718 440.826 317.4 -1.43785 1.6919 8.4455 +16 5550 473.936 422.173 336.046 -1.40737 1.69345 7.48744 +17 5550 457.368 399.012 358.047 -1.40087 1.70465 6.64152 +14 5569 673.85 640.698 272.552 1.0417 1.6154 11.6911 +15 5569 679.111 645.999 282.675 1.12827 1.78151 11.7047 +14 5574 698.833 670.528 260.286 1.69418 1.65923 13.6929 +15 5574 706.471 674.924 268.068 1.65009 1.62117 12.2854 +14 5575 933.536 900.834 252.702 5.32154 1.31156 11.8518 +15 5575 962.613 927.206 260.815 5.35607 1.33443 10.9462 +14 5578 914.947 860.835 319.985 3.03148 1.46052 7.16245 +15 5578 959.922 899.585 342.769 3.11911 1.51267 6.4235 +14 5579 896.992 837.533 337.781 2.59665 1.48994 6.51834 +15 5579 945.191 875.872 365.691 2.6008 1.49429 5.59116 +14 5580 896.992 837.533 337.781 2.59665 1.48994 6.51834 +15 5580 945.191 875.872 365.691 2.6008 1.49429 5.59116 +14 5583 857.089 820.15 274.174 3.59947 1.47336 10.4923 +15 5583 882.823 841.615 285.4 3.56201 1.46704 9.40526 +14 5585 923.75 867.501 321.717 3.00034 1.42155 6.89027 +15 5585 971.439 908.206 345.217 3.07408 1.46418 6.12928 +14 5594 866.303 814.542 317.634 2.66437 1.50246 7.4878 +15 5594 902.976 843.994 338.613 2.67214 1.50957 6.57104 +15 5618 1065.53 1047.82 48.333 13.8278 -3.7762 21.8812 +16 5618 1087.25 1063.4 43.0985 10.7601 -2.92278 16.2528 +15 5626 1001.18 976.202 161.965 8.421 -0.23414 15.5151 +16 5626 1027.72 1000.87 161.798 8.36604 -0.221185 14.4356 +15 5631 348.896 304.654 317.955 -3.16475 1.7617 8.7603 +16 5631 320.642 271.052 335.851 -3.12952 1.76556 7.81561 +15 5634 691.838 662.906 257.15 1.52758 1.56502 13.3959 +16 5634 698.641 668.817 263.699 1.60441 1.63617 12.9952 +17 5634 706.707 673.899 271.378 1.59057 1.61312 11.8136 +18 5634 715.27 682.795 279.582 1.74851 1.76533 11.9346 +15 5635 738.93 701.892 281.634 1.87624 1.57763 10.4644 +16 5635 752.791 712.117 292.542 1.89158 1.58065 9.52895 +15 5641 69.6957 48.4648 81.1265 -13.6588 -2.32074 18.2552 +16 5641 42.5446 20.5991 78.1842 -13.8785 -2.31719 17.6607 +15 5642 116.559 95.5042 50.721 -12.5773 -3.11583 18.4077 +16 5642 92.5264 70.1825 45.8576 -12.4295 -3.05301 17.3459 +15 5644 65.6935 44.3525 62.3233 -13.689 -2.78205 18.161 +16 5644 38.0778 16.1492 58.2482 -13.9987 -2.80732 17.6744 +15 5645 65.6935 44.3525 62.3233 -13.689 -2.78205 18.161 +16 5645 38.0778 16.1492 58.2482 -13.9987 -2.80732 17.6744 +15 5665 246.309 224.325 89.301 -8.87566 -2.04153 17.63 +16 5665 228.072 206.752 86.1354 -9.61139 -2.18484 18.1788 +17 5665 210.363 185.251 81.9438 -8.53895 -1.9446 15.434 +18 5665 187.18 162.861 77.0498 -9.32959 -2.11614 15.9374 +15 5670 243.861 223.013 78.0814 -9.42227 -2.44183 18.5905 +16 5670 226.438 204.149 74.3578 -9.23308 -2.37372 17.3888 +17 5670 207.024 184.394 69.4138 -9.55458 -2.45526 17.1264 +18 5670 186.368 161.851 63.6817 -9.27199 -2.39193 15.8087 +19 5670 163.099 135.334 55.8815 -8.63743 -2.263 13.9592 +20 5670 133.957 106.694 48.2952 -9.37051 -2.45411 14.216 +21 5670 103.2 74.0267 38.8575 -9.32321 -2.46718 13.2851 +15 5671 235.999 219.155 114.051 -11.913 -1.87524 23.0101 +16 5671 221.638 202.858 113.066 -11.0954 -1.71005 20.6375 +15 5676 250.297 228.224 51.5769 -8.74304 -2.95141 17.5594 +16 5676 229.873 207.439 50.6965 -9.09125 -2.92495 17.2766 +17 5676 208.685 186.587 47.0724 -9.74414 -3.05741 17.5386 +18 5676 186.985 160.972 40.3958 -8.72591 -2.73518 14.8993 +19 5676 160.498 134.937 31.9058 -9.43676 -2.96195 15.1627 +20 5676 132.824 105.909 23.3777 -9.51432 -2.98314 14.3999 +15 5678 391.286 367.943 15.5854 -5.0228 -3.61899 16.6037 +16 5678 380.216 355.173 7.9064 -4.9191 -3.53791 15.476 +15 5680 291.626 268.883 30.1775 -7.50897 -3.36974 17.0413 +16 5680 275.157 251.79 22.9443 -7.68707 -3.44605 16.5864 +15 5685 302.433 280.407 90.8458 -7.48995 -1.99995 17.5963 +16 5685 287.235 264.116 87.9056 -7.48862 -1.97362 16.7636 +17 5685 270.884 246.37 83.5366 -7.42092 -1.95709 15.8101 +15 5687 313.948 290.198 25.221 -6.6859 -3.33905 16.3192 +16 5687 298.528 272.551 17.916 -6.4316 -3.20385 14.9202 +15 5688 399.356 376.208 24.7022 -4.87783 -3.43791 16.7435 +16 5688 388.931 364.296 18.1602 -4.81072 -3.37304 15.7329 +15 5693 278.013 257.58 93.3493 -8.71587 -2.09007 18.9682 +16 5693 262.755 240.513 90.4716 -8.37536 -1.98954 17.4252 +17 5693 245.973 221.328 86.2402 -7.92451 -1.88778 15.7262 +18 5693 226.328 201.892 81.8256 -8.42414 -2.00098 15.8608 +19 5693 206.083 179.213 75.5186 -8.06578 -1.94581 14.4241 +20 5693 180.659 153.067 69.2555 -8.34975 -2.01684 14.0468 +21 5693 153.855 120.159 61.713 -7.26444 -1.77171 11.5021 +15 5694 289.976 268.452 79.6051 -7.9755 -2.32711 18.0067 +16 5694 274.179 252.044 77.4515 -8.13853 -2.31509 17.5093 +17 5694 257.732 234.172 71.3484 -8.02132 -2.31423 16.4503 +18 5694 239.181 213.894 65.5658 -7.86764 -2.27903 15.327 +19 5694 218.273 190.355 58.6046 -7.52846 -2.19819 13.8826 +15 5696 318.664 295.787 64.4825 -6.83019 -2.54455 16.9417 +16 5696 303.826 279.059 59.7793 -6.63056 -2.4523 15.6483 +15 5697 284.386 262.69 112.421 -8.05064 -1.4962 17.8639 +16 5697 268.254 245.779 109.928 -8.15721 -1.50393 17.2448 +17 5697 251.368 227.267 106.078 -7.98326 -1.48828 16.0814 +15 5700 421.498 398.687 48.5137 -4.42847 -2.92796 16.9908 +16 5700 412.217 388.061 43.0197 -4.3882 -2.88706 16.0445 +17 5700 402.155 376.94 35.9481 -4.41836 -2.91653 15.371 +18 5700 391.585 364.397 28.2961 -4.30652 -2.85603 14.2554 +15 5705 482 459.996 52.192 -3.11401 -2.94563 17.6143 +16 5705 476.335 453.172 46.8779 -3.08935 -2.92128 16.7319 +15 5706 482 459.996 52.192 -3.11401 -2.94563 17.6143 +16 5706 476.335 453.172 46.8779 -3.08935 -2.92128 16.7319 +15 5709 511.677 504.04 100.256 -6.8842 -5.10595 50.747 +16 5709 510.878 502.585 99.5165 -6.39187 -4.75027 46.736 +15 5712 486.199 464.055 68.7739 -2.99237 -2.52468 17.5024 +16 5712 480.876 457.782 64.1747 -2.99314 -2.52785 16.7828 +15 5713 430.555 409.323 103.957 -4.52877 -1.74307 18.2547 +16 5713 422.37 400.392 101.572 -4.575 -1.74217 17.6347 +17 5713 413.913 390.899 98.1193 -4.56631 -1.74428 16.8404 +18 5713 404.642 379.952 94.3869 -4.4581 -1.7071 15.6975 +19 5713 394.057 372.646 89.391 -5.40634 -2.09385 18.1014 +15 5722 681.757 662.487 54.8505 2.01256 -3.28945 20.1135 +16 5722 686.456 666.206 49.9449 2.03975 -3.26026 19.1394 +17 5722 691.827 670.295 44.1131 2.05236 -3.21176 18.0006 +15 5725 679.349 660.522 106.481 1.99109 -1.89361 20.5852 +16 5725 683.744 663.921 104.241 2.01026 -1.85928 19.5523 +15 5726 604.155 593.055 109.916 -0.261554 -3.04586 34.9184 +16 5726 605.071 595.102 109.228 -0.241818 -3.42825 38.877 +17 5726 606.174 595.572 108.138 -0.171526 -3.27892 36.5576 +18 5726 607.342 596.57 107.089 -0.11054 -3.27932 35.9787 +19 5726 608.798 597.221 105.072 -0.0353414 -3.14499 33.4782 +20 5726 609.723 597.821 102.74 0.00739993 -3.16428 32.5635 +15 5728 683.047 664.019 114.305 2.07446 -1.65274 20.3679 +16 5728 687.732 667.695 112.439 2.09564 -1.61961 19.3429 +15 5729 683.047 664.019 114.305 2.07446 -1.65274 20.3679 +16 5729 687.732 667.695 112.439 2.09564 -1.61961 19.3429 +15 5736 567.382 549.6 30.9659 -1.27414 -4.28629 21.7969 +16 5736 566.208 547.033 25.9546 -1.21443 -4.11517 20.2128 +17 5736 566.059 546.296 20.5186 -1.18231 -4.14038 19.6109 +18 5736 565.706 546.07 14.2559 -1.19958 -4.33841 19.7375 +15 5739 617.541 606.994 118.082 0.406489 -2.78951 36.7478 +16 5739 618.981 608.033 117.677 0.462249 -2.70716 35.4008 +17 5739 620.292 609.344 116.792 0.526575 -2.75046 35.3996 +18 5739 621.742 610.576 116.01 0.586068 -2.73466 34.7119 +15 5741 566.996 560.839 95.8217 -3.71367 -6.72109 62.9544 +16 5741 567.826 561.167 95.8785 -3.36612 -6.20875 58.1983 +17 5741 568.609 561.747 95.3737 -3.20511 -6.06433 56.4742 +15 5742 569.469 563.6 123.893 -3.66919 -4.48108 66.038 +16 5742 569.922 563.903 124.256 -3.53782 -4.33756 64.3999 +17 5742 570.844 564.505 124.67 -3.28064 -4.08305 61.1419 +18 5742 571.605 564.934 124.947 -3.05608 -3.85755 58.0987 +19 5742 572.258 565.779 124.28 -3.09257 -4.02721 59.8212 +20 5742 572.742 566.214 123.157 -3.02987 -4.08978 59.3782 +21 5742 573.324 566.746 122.049 -2.95912 -4.1489 58.923 +22 5742 573.971 567.003 121.3 -2.7433 -3.97408 55.62 +23 5742 574.556 567.423 121.105 -2.63614 -3.89723 54.3392 +15 5745 671.114 652.957 104.08 1.82101 -2.03458 21.3457 +16 5745 675.47 656.737 101.337 1.88993 -2.05068 20.6896 +17 5745 679.737 660.555 99.7567 1.96517 -2.04694 20.2052 +18 5745 683.946 664.686 97.2873 2.07458 -2.1075 20.1231 +15 5748 750.389 730.824 56.677 3.86646 -3.18963 19.8098 +16 5748 758.148 737.799 51.4853 3.9223 -3.20377 19.0464 +15 5751 738.793 718.992 79.6799 3.50576 -2.52756 19.5733 +16 5751 746.284 725.398 75.8531 3.51624 -2.49464 18.5563 +15 5752 729.912 710.38 80.698 3.30982 -2.53437 19.8429 +16 5752 736.498 716.327 76.9871 3.38039 -2.55295 19.2146 +15 5754 719.213 699.67 109.339 3.0139 -1.74575 19.832 +16 5754 725.319 705.224 107.142 3.09434 -1.75654 19.2872 +15 5755 719.213 699.67 109.339 3.0139 -1.74575 19.832 +16 5755 725.319 705.224 107.142 3.09434 -1.75654 19.2872 +15 5756 759.239 739.566 33.125 4.08683 -3.81515 19.7008 +16 5756 767.716 746.925 27.1075 4.08615 -3.76553 18.6418 +17 5756 777.19 755.775 20.4794 4.20469 -3.82202 18.0984 +18 5756 788.452 765.176 12.7404 4.12844 -3.69506 16.6515 +15 5757 781.532 762.651 46.4065 4.89233 -3.5972 20.5264 +16 5757 791.115 771.065 41.233 4.86396 -3.52618 19.3303 +17 5757 802.071 780.547 35.0807 4.8044 -3.43834 18.007 +18 5757 814.075 791.025 28.5295 4.76592 -3.36326 16.8143 +15 5759 737.378 718.619 65.3728 3.65997 -3.07763 20.6606 +16 5759 744.836 724.564 60.6324 3.58449 -2.9736 19.119 +15 5763 715.804 696.636 68.0548 2.97729 -2.93678 20.2196 +16 5763 722.299 701.562 64.7998 2.92036 -2.79899 18.6904 +17 5763 729.727 708.285 60.6906 3.01037 -2.80986 18.0756 +18 5763 736.332 714.161 55.0451 3.07149 -2.85432 17.4817 +19 5763 745.068 721.463 48.7031 3.08372 -2.82526 16.4198 +20 5763 754.678 729.366 41.6169 3.07954 -2.78496 15.3116 +21 5763 766.489 738.458 31.4125 3.00716 -2.71037 13.8265 +15 5771 732.563 715.377 101.988 3.84457 -2.21497 22.5522 +16 5771 739.088 721.173 99.5983 3.88365 -2.19641 21.6337 +17 5771 747.363 728.255 96.2015 3.87386 -2.15481 20.2835 +18 5771 756.038 735.456 92.8427 3.82286 -2.08816 18.8309 +19 5771 765.637 743.016 88.391 3.70615 -2.00563 17.1334 +15 5774 896.819 875.732 36.9613 7.31756 -3.46169 18.3802 +16 5774 913.059 890.732 30.3605 7.30169 -3.42815 17.359 +17 5774 931.425 907.728 22.7813 7.29587 -3.40176 16.3554 +18 5774 951.848 926.906 15.2182 7.37151 -3.39483 15.539 +15 5775 896.672 875.633 46.9565 7.3303 -3.21429 18.4216 +16 5775 912.888 890.6 40.9482 7.3103 -3.17897 17.3893 +17 5775 931.423 907.874 34.2596 7.34163 -3.16131 16.4581 +18 5775 951.807 926.941 27.3002 7.39299 -3.14414 15.5861 +19 5775 974.812 948.431 18.7052 7.43694 -3.13864 14.6913 +20 5775 1000.37 972.028 7.73523 7.40616 -3.12911 13.6736 +15 5776 888.161 867.288 55.3501 7.16979 -3.02395 18.5687 +16 5776 903.843 881.779 49.7346 7.16422 -2.99729 17.5656 +15 5777 903.445 881.992 72.6787 7.35859 -2.50829 18.0666 +16 5777 920.371 897.496 67.9237 7.29847 -2.46397 16.9431 +17 5777 939.708 915.503 62.8177 7.32665 -2.44192 16.0124 +15 5780 868.032 852.966 26.0314 9.21487 -5.2344 25.7237 +16 5780 882.954 862.499 20.8568 7.17926 -3.9914 18.9474 +15 5782 842.676 823.21 104.398 6.43247 -1.88894 19.9096 +16 5782 855.106 834.634 101.752 6.44285 -1.86564 18.9323 +17 5782 869.142 847.597 98.739 6.4718 -1.84781 17.9891 +18 5782 884.424 861.802 95.7274 6.52654 -1.83133 17.1326 +19 5782 901.903 877.757 91.7145 6.50356 -1.80505 16.0515 +20 5782 920.857 895.103 85.9515 6.49259 -1.81248 15.0488 +21 5782 942.164 914.725 79.5698 6.5111 -1.82614 14.1249 +15 5784 884.778 864.175 125.399 7.1754 -1.23723 18.8116 +16 5784 900.04 878.408 123.401 7.21303 -1.22798 17.9168 +17 5784 917.194 894.574 121.287 7.30518 -1.22452 17.1338 +15 5785 883.314 862.804 94.7981 7.16942 -2.04422 18.8965 +16 5785 898.873 876.99 91.414 7.10184 -1.99913 17.7118 +15 5789 839.706 821.677 46.5238 6.85695 -3.76386 21.4974 +16 5789 852.086 832.625 41.82 6.69385 -3.61659 19.9148 +15 5790 859.507 839.195 80.9191 6.60997 -2.43126 19.0814 +16 5790 873.084 851.485 76.2961 6.55354 -2.40128 17.9438 +15 5795 970.065 950.144 67.194 9.72053 -2.84897 19.4553 +16 5795 988.193 968.299 62.3086 10.2234 -2.9848 19.482 +15 5796 894.347 872.076 108.849 6.86876 -1.54374 17.4027 +16 5796 910.805 888.088 105.938 7.12287 -1.5822 17.0605 +15 5797 880.762 862.52 40.5201 7.98561 -3.89659 21.2458 +16 5797 897.064 876.06 33.0676 7.35272 -3.57494 18.4528 +15 5799 1006.81 991.109 50.0507 13.5923 -4.20186 24.6883 +16 5799 1023.3 1007.06 45.8759 13.6815 -4.19884 23.8594 +17 5799 1041.32 1024.77 41.6088 14.0127 -4.25949 23.4171 +18 5799 1061.12 1043.78 37.3955 13.9867 -4.19574 22.3491 +19 5799 1083.06 1065.02 31.5672 14.0998 -4.20719 21.4857 +15 5802 1021.34 998.479 108.056 9.67484 -1.52244 16.9526 +16 5802 1046.41 1022.31 104.756 9.7373 -1.51789 16.083 +17 5802 1074.79 1049.4 101.316 9.84189 -1.51338 15.264 +18 5802 1106.75 1079.87 98.1856 9.9331 -1.49175 14.4152 +19 5802 1143.29 1114.59 93.7929 9.9904 -1.47986 13.5057 +20 5802 1184.97 1154.1 87.2413 10.0103 -1.48937 12.5523 +15 5805 1046.74 1022.33 112.847 9.61904 -1.3203 15.8756 +16 5805 1073 1048.34 109.584 10.0928 -1.37789 15.7137 +15 5807 1089.47 1071.67 112.292 14.4793 -1.82723 21.7695 +16 5807 1115.7 1093.9 108.573 12.4739 -1.58423 17.7826 +17 5807 1148.01 1124.65 105.346 12.3817 -1.55234 16.5917 +15 5811 1144.3 1123.66 18.9503 13.915 -4.00485 18.7757 +16 5811 1174.11 1152.61 10.6861 14.1052 -4.05172 18.0274 +15 5818 82.0981 61.1021 156.361 -13.4943 -0.421961 18.4595 +16 5818 55.9075 34.2491 157.126 -13.7311 -0.390065 17.8949 +15 5824 66.6216 46.6723 182.05 -14.6191 0.247612 19.428 +16 5824 41.0387 18.9615 184.15 -13.8324 0.274834 17.5554 +15 5839 172.569 164.493 178.915 -29.0639 0.403134 47.989 +16 5839 165.406 156.59 180.806 -27.0627 0.484495 43.9639 +17 5839 157.804 149.176 181.457 -28.1222 0.535571 44.9165 +18 5839 149.796 140.571 181.71 -26.7719 0.515682 42.015 +19 5839 141.068 131.807 181.115 -27.1709 0.479122 41.8468 +20 5839 132.227 122.479 180.968 -26.3013 0.447105 39.7571 +21 5839 122.381 112.034 179.854 -25.29 0.363398 37.4559 +15 5842 152.075 98.0911 244.912 -4.5521 0.716998 7.1795 +16 5842 88.6067 27.9801 256.99 -4.61563 0.745439 6.39281 +15 5844 189.391 179.508 141.041 -22.8359 -1.729 39.2151 +16 5844 180.872 170.13 142.099 -21.4353 -1.53784 36.0784 +17 5844 171.723 160.506 141.812 -20.9668 -1.48652 34.5525 +18 5844 161.629 149.963 140.764 -20.6248 -1.47755 33.2229 +19 5844 150.885 139.809 139.631 -22.246 -1.61133 34.995 +15 5845 162.742 154.324 196.888 -28.5112 1.53358 46.0411 +16 5845 155.007 146.49 198.936 -28.6685 1.64498 45.5071 +15 5846 277.372 257.692 155.598 -9.06666 -0.470982 19.6935 +16 5846 262.696 241.739 156.088 -8.89073 -0.42974 18.4943 +15 5847 277.372 257.692 155.598 -9.06666 -0.470982 19.6935 +16 5847 262.696 241.739 156.088 -8.89073 -0.42974 18.4943 +17 5847 246.497 224.948 155.401 -9.05024 -0.435055 17.9861 +18 5847 229.075 206.453 154.748 -9.03427 -0.42992 17.1323 +15 5848 162.935 154.197 188.937 -27.4553 0.988668 44.355 +16 5848 155.07 146.49 190.712 -28.4525 1.11795 45.1706 +17 5848 147.056 138.844 191.386 -30.2519 1.21218 47.1951 +18 5848 139.222 130.264 192.012 -28.2019 1.14872 43.2641 +19 5848 130.821 121.87 191.68 -28.7292 1.12978 43.2997 +20 5848 121.852 112.874 191.882 -29.1818 1.13851 43.173 +21 5848 112.835 103.358 191.319 -28.1541 1.0466 40.8964 +22 5848 103.085 93.2502 191.189 -27.661 1.00139 39.4066 +23 5848 92.6968 81.9551 192.29 -25.8463 0.971933 36.0813 +15 5860 391.784 373.442 234.101 -6.37763 1.79363 21.1305 +16 5860 383.363 363.319 238.336 -6.06164 1.7548 19.3359 +15 5861 320.693 286.366 239.398 -4.5202 1.04128 11.2907 +16 5861 297.07 259.752 246.502 -4.49798 1.0601 10.3858 +17 5861 269.426 228.658 253.561 -4.4815 1.06338 9.50678 +15 5864 404.319 386.241 228.803 -6.09839 1.66244 21.4393 +16 5864 396.769 377.848 232.541 -6.04077 1.69441 20.4833 +17 5864 388.366 368.629 235.718 -6.01973 1.71084 19.6365 +15 5865 325.426 292.591 208.337 -4.64822 0.580473 11.8039 +16 5865 303.041 268.229 212.237 -4.72971 0.607691 11.1336 +17 5865 279.236 240.059 216.024 -4.52896 0.591888 9.89279 +18 5865 248.111 204.448 220.332 -4.44659 0.584082 8.87646 +19 5865 210.142 163.983 225.896 -4.64794 0.617235 8.3964 +15 5874 432.631 411.663 138.442 -4.53235 -0.881542 18.4836 +16 5874 424.756 402.753 137.901 -4.51151 -0.853284 17.6146 +17 5874 416.241 393.322 136.548 -4.53074 -0.850903 16.9105 +15 5877 424.157 405.376 230.258 -5.30273 1.64181 20.6368 +16 5877 417.095 398.142 233.988 -5.45459 1.73259 20.4489 +15 5878 428.373 408.11 128.801 -4.80297 -1.16778 19.1269 +16 5878 420.627 399.31 127.791 -4.76062 -1.13548 18.181 +15 5879 492.534 485.371 156.096 -8.77515 -1.25658 54.1046 +16 5879 491.831 483.965 156.89 -8.03954 -1.09018 49.2729 +17 5879 491.598 482.995 157.191 -7.36518 -0.977929 45.0508 +18 5879 489.469 481.772 157.456 -8.38033 -1.07453 50.3516 +19 5879 488.821 481.322 156.879 -8.64746 -1.14413 51.6778 +20 5879 487.384 480.217 156.107 -9.15723 -1.25517 54.0802 +21 5879 486.288 478.584 154.915 -8.59522 -1.25085 50.3099 +15 5881 510.213 501.986 142.175 -6.48655 -2.00311 47.111 +16 5881 509.304 500.779 142.414 -6.31644 -1.91786 45.4596 +17 5881 508.581 500.16 141.832 -6.44129 -1.97889 46.0261 +18 5881 507.751 498.958 140.801 -6.21944 -1.95811 44.0784 +19 5881 506.931 498.088 139.946 -6.23342 -1.99876 43.8248 +20 5881 505.803 496.871 138.411 -6.23926 -2.07119 43.389 +21 5881 504.329 496.038 137.585 -6.81774 -2.28507 46.7475 +22 5881 503.219 495.098 137.055 -7.03379 -2.36792 47.7253 +23 5881 502.219 494.204 136.901 -7.19318 -2.40932 48.3524 +24 5881 501.127 492.471 137.834 -6.72828 -2.17299 44.7719 +25 5881 499.904 491.588 136.704 -7.08248 -2.33491 46.6032 +26 5881 498.642 489.561 135.146 -6.56121 -2.2306 42.6817 +15 5884 559.825 554.617 168.705 -5.12875 -0.42782 74.4076 +16 5884 559.806 555.051 169.384 -5.62058 -0.392032 81.5108 +15 5885 675.971 658.517 222.013 2.04379 1.51285 22.205 +16 5885 679.885 661.844 224.737 2.09394 1.54481 21.4838 +17 5885 684.385 665.831 227.369 2.16631 1.5783 20.8896 +15 5887 618.818 612.783 176.213 0.824073 0.298972 64.2181 +16 5887 620.146 613.958 177.067 0.919012 0.365749 62.6383 +15 5888 625.883 619.556 181.62 1.38583 0.744223 61.257 +16 5888 627.295 620.933 182.672 1.4973 0.828823 60.9132 +17 5888 629.061 622.396 183.002 1.57179 0.817869 58.1541 +18 5888 630.431 623.816 183.864 1.69491 0.894124 58.5941 +19 5888 632.074 625.261 184.034 1.7751 0.881422 56.8866 +20 5888 633.393 626.472 183.748 1.84977 0.845461 55.9991 +21 5888 635.062 628.192 182.9 1.99397 0.785434 56.414 +22 5888 636.329 629.519 182.782 2.1115 0.783096 56.9115 +23 5888 638.072 631.036 182.966 2.17698 0.77207 55.0911 +24 5888 639.653 632.615 183.514 2.29671 0.813575 55.0662 +25 5888 641.146 633.848 183.321 2.32485 0.770365 53.1071 +26 5888 642.399 635.03 182.138 2.39362 0.67666 52.5912 +15 5891 582.885 578.71 153.074 -3.43155 -2.54463 92.8243 +16 5891 583.561 579.237 153.76 -3.22929 -2.3717 89.625 +15 5892 704.266 685.561 127.673 2.71962 -1.29742 20.7199 +16 5892 709.879 690.058 126.31 2.71864 -1.26133 19.5535 +17 5892 715.991 695.483 124.673 2.78778 -1.26201 18.8994 +18 5892 723.214 701.221 122.862 2.77585 -1.22097 17.6225 +15 5893 758.788 754.519 133.377 18.7806 -4.96826 90.8067 +16 5893 761.826 756.972 133.756 16.8499 -4.32658 79.8453 +15 5894 746.628 734.382 171.663 6.01257 -0.0522266 31.6506 +16 5894 751.967 739.298 172.214 6.03782 -0.02715 30.5917 +17 5894 757.685 744.672 172.753 6.11419 -0.00418763 29.7829 +15 5895 720.038 714.726 172.728 11.1725 -0.0127564 72.9678 +16 5895 722.569 717.028 173.577 10.9566 0.0700904 69.9549 +15 5899 706.909 687.623 157.808 2.7114 -0.419068 20.0965 +16 5899 712.372 693.18 157.857 2.87763 -0.419749 20.1952 +17 5899 718.806 697.577 158.297 2.76431 -0.368345 18.2574 +18 5899 724.737 707.274 158.026 3.54272 -0.456089 22.1936 +15 5901 818.597 799.139 179.424 5.7707 0.181369 19.9188 +16 5901 830.289 809.709 180.017 5.76107 0.186961 18.8322 +15 5906 788.408 763.648 226.717 3.87998 1.16851 15.6532 +16 5906 801.293 774.705 230.938 3.87349 1.17343 14.5768 +17 5906 816.11 787.55 235.678 3.8848 1.18159 13.5707 +18 5906 833.943 802.058 241.193 3.78003 1.15126 12.1552 +19 5906 854.192 820.275 246.324 3.87432 1.16356 11.4272 +20 5906 876.952 840.906 251.673 3.9846 1.17454 10.7521 +15 5910 875.892 855.727 141.643 7.09423 -0.831352 19.2194 +16 5910 890.594 869.443 140.598 7.137 -0.819156 18.3237 +17 5910 907.311 884.838 139.477 7.11705 -0.797803 17.2467 +15 5911 891.408 871.31 170.47 7.5326 -0.0637266 19.2836 +16 5911 907.05 885.76 170.859 7.5058 -0.0503289 18.2047 +17 5911 924.692 902.142 171.307 7.50676 -0.0368494 17.1877 +18 5911 943.932 920.249 172.461 7.58402 -0.00890272 16.3654 +19 5911 965.572 940.608 172.819 7.66031 -0.000751119 15.5253 +20 5911 989.807 962.709 172.007 7.53764 -0.0167945 14.303 +21 5911 1016.81 988.102 171.168 7.62003 -0.0315437 13.5006 +15 5913 877.494 847.262 248.984 4.76067 1.35268 12.8203 +16 5913 899.711 866.901 255.402 4.75014 1.3514 11.8125 +17 5913 926.245 890.326 262.879 4.73589 1.34629 10.7903 +18 5913 956.407 917.509 272.015 4.78976 1.36935 9.964 +15 5914 851.954 832.595 134.346 6.72588 -1.0685 20.021 +16 5914 865.344 844.392 132.991 6.55769 -1.022 18.4985 +15 5920 1015.6 991.046 140.698 8.88212 -0.703409 15.7835 +16 5920 1042.32 1016.19 139.034 8.89732 -0.695334 14.8345 +15 5921 1079.03 1053.78 153.896 9.98542 -0.403222 15.3467 +16 5921 1110.89 1084.32 153.007 10.1366 -0.401301 14.5891 +15 5923 1068.92 1043.59 163.836 9.74337 -0.191276 15.3044 +16 5923 1100.22 1073.28 163.6 9.784 -0.184525 14.3878 +15 5926 1059.97 1034.71 155.403 9.58082 -0.371204 15.3481 +16 5926 1090.61 1064.15 154.383 9.7655 -0.374974 14.6476 +15 5929 1005.87 981.39 144.982 8.69466 -0.611485 15.8297 +16 5929 1031.35 1005.51 143.563 8.76556 -0.608712 14.9947 +17 5929 1061.01 1033.28 142.209 8.74528 -0.593639 13.9773 +18 5929 1092.42 1064.68 141.213 9.35121 -0.612765 13.9736 +15 5933 1027.81 1000.35 132.599 8.18022 -0.787314 14.1118 +16 5933 1053.53 1029.8 131.044 10.0492 -0.946364 16.3318 +17 5933 1081.23 1057.89 130.098 10.853 -0.983789 16.6022 +18 5933 1110.56 1088.95 130.276 12.4535 -1.05838 17.9356 +15 5939 1143.6 1110.5 175.888 8.66637 0.0492297 11.7091 +16 5939 1189.96 1153.38 178.35 8.52253 0.0806986 10.595 +15 5956 347.098 315.465 274.556 -4.45669 1.72693 12.252 +16 5956 328.03 293.783 283.876 -4.41574 1.74136 11.3172 +15 5961 333.386 286.817 319.672 -3.18545 1.69344 8.32241 +16 5961 301.48 250.089 338.761 -3.2201 1.73409 7.54165 +15 5973 719.739 688.298 266.112 1.88236 1.59325 12.327 +16 5973 729.478 695.932 273.875 1.92021 1.61762 11.5537 +15 5974 807.066 752.673 331.458 1.95046 1.56628 7.12549 +16 5974 837.245 775.104 355.24 1.96812 1.57655 6.23699 +15 5976 831.223 784.044 307.528 2.52375 1.53333 8.21505 +16 5976 860.574 807.266 324.945 2.5293 1.53251 7.27042 +17 5976 898.38 837.198 347.339 2.53571 1.5319 6.33477 +15 5979 807.424 754.56 325.368 2.01052 1.54971 7.33162 +16 5979 837.303 776.658 347.079 2.01717 1.54315 6.3908 +15 5980 807.424 754.56 325.368 2.01052 1.54971 7.33162 +16 5980 837.303 776.658 347.079 2.01717 1.54315 6.3908 +15 5984 922.517 867.924 325.27 3.07926 1.49966 7.09936 +16 5984 970.421 907.269 348.163 3.06936 1.49111 6.13713 +15 5985 895.361 838.66 331.313 2.70755 1.50117 6.83551 +16 5985 940.873 875.122 355.659 2.70665 1.49342 5.89457 +15 5988 922.818 875.724 300.147 3.57297 1.45188 8.22972 +16 5988 964.798 910.436 317.009 3.51014 1.42441 7.12958 +15 5990 850.373 793.927 332.098 2.29165 1.51541 6.86634 +16 5990 888.884 823.784 356.546 2.30475 1.51567 5.95353 +15 5995 1014.99 960.476 314.884 3.99487 1.39948 7.1096 +16 5995 1075.58 1013.8 335.608 4.05163 1.41499 6.27309 +16 6015 776.575 757.637 75.7055 4.73717 -2.75549 20.4654 +17 6015 785.824 766.701 70.9885 4.95094 -2.8612 20.2666 +16 6017 256.975 234.793 150.189 -8.53805 -0.54885 17.4725 +17 6017 238.71 216.364 149.984 -8.91442 -0.549747 17.3442 +16 6020 384.196 364.882 197.013 -6.26767 0.671904 20.067 +17 6020 374.846 354.886 198.167 -6.31654 0.681208 19.4178 +18 6020 365.137 343.476 199.648 -6.06113 0.664437 17.8925 +19 6020 353.739 332.385 200.606 -6.43499 0.698073 18.1498 +20 6020 341.261 317.471 201.549 -6.05777 0.64788 16.2912 +16 6021 290.596 251.981 217.414 -4.43687 0.619837 10.0368 +17 6021 260.941 219.591 222.261 -4.52858 0.641797 9.37285 +18 6021 226.369 182.385 227.747 -4.67966 0.670376 8.81168 +16 6023 777.631 749.316 210.414 3.18837 0.712531 13.6878 +17 6023 791.295 761.094 213.684 3.23232 0.726192 12.8332 +18 6023 807.339 774.076 217.429 3.19383 0.719821 11.6517 +19 6023 824.536 789.305 221.419 3.27769 0.740456 11.0011 +20 6023 845.611 807.049 225.094 3.28809 0.727679 10.0507 +16 6025 964.13 931.25 187.386 5.79255 0.237404 11.7876 +17 6025 994.86 960.196 188.916 5.97052 0.248892 11.1808 +16 6026 964.13 931.25 187.386 5.79255 0.237404 11.7876 +17 6026 994.86 960.196 188.916 5.97052 0.248892 11.1808 +18 6026 1031.44 992.441 191.066 5.81108 0.25086 9.93866 +19 6026 1076.63 1032.63 193.795 5.70238 0.255671 8.80919 +16 6053 276.021 253.343 102.273 -7.90016 -1.67179 17.0903 +17 6053 259.347 234.925 98.8011 -7.70284 -1.62878 15.87 +16 6055 261.6 238.751 79.2437 -8.1799 -2.20061 16.9621 +17 6055 243.926 220.199 74.6554 -8.27749 -2.22309 16.3347 +18 6055 224.736 199.337 69.2253 -8.13848 -2.1916 15.2595 +19 6055 203.099 176.365 62.415 -8.16684 -2.21901 14.4976 +20 6055 178.07 149.521 54.9103 -8.11851 -2.21912 13.5758 +21 6055 149.693 119.327 45.8087 -8.1349 -2.24739 12.7638 +22 6055 117.375 84.6576 35.7576 -8.08072 -2.25086 11.8463 +16 6063 352.662 327.932 24.4348 -5.57997 -3.22376 15.6722 +17 6063 338.767 313.033 15.9395 -5.6521 -3.27519 15.0603 +16 6064 352.662 327.932 24.4348 -5.57997 -3.22376 15.6722 +17 6064 338.767 313.033 15.9395 -5.6521 -3.27519 15.0603 +18 6064 323.774 296.606 6.63145 -5.65029 -3.2864 14.2656 +16 6066 346.996 321.291 45.4541 -5.48656 -2.66217 15.0774 +17 6066 331.988 304.933 38.4212 -5.51081 -2.66898 14.3252 +18 6066 315.774 287.436 30.274 -5.56868 -2.70259 13.6767 +19 6066 297.589 267.853 20.4187 -5.6355 -2.75362 13.034 +20 6066 275.967 244.09 9.22061 -5.62128 -2.75734 12.1584 +16 6070 369.675 346.461 87.4806 -5.55059 -1.97542 16.6954 +17 6070 357.811 333.049 82.8835 -5.46111 -1.9517 15.6521 +16 6071 390.188 367.915 90.7809 -5.29045 -1.97931 17.4009 +17 6071 379.844 356.303 86.8322 -5.24161 -1.96283 16.4639 +18 6071 368.153 343.524 82.0347 -5.26491 -1.98071 15.7363 +16 6076 312.015 288.011 51.0694 -6.65823 -2.72521 16.1461 +17 6076 296.955 269.538 44.571 -6.12437 -2.51325 14.136 +18 6076 277.256 250.636 35.7127 -6.70549 -2.76735 14.5598 +19 6076 257.363 230.203 26.1481 -6.96548 -2.90144 14.2701 +20 6076 235.021 207.017 15.5217 -7.18413 -3.01784 13.84 +16 6078 407.537 385.728 87.5978 -4.97566 -2.0998 17.771 +17 6078 398.451 375.696 83.5794 -4.98326 -2.10735 17.0321 +16 6080 373.305 351.196 55.6686 -5.73973 -2.84699 17.5296 +17 6080 362.598 339.405 49.6832 -5.71973 -2.85269 16.7111 +18 6080 350.221 325.515 43.1641 -5.63856 -2.81972 15.6877 +16 6081 377.022 353.85 71.5642 -5.39063 -2.34807 16.7265 +17 6081 365.607 341.008 66.6206 -5.327 -2.31974 15.7557 +18 6081 352.819 326.973 60.7383 -5.33563 -2.33002 14.9952 +16 6082 377.022 353.85 71.5642 -5.39063 -2.34807 16.7265 +17 6082 365.607 341.008 66.6206 -5.327 -2.31974 15.7557 +16 6083 300.558 277.437 90.3883 -7.17892 -1.9159 16.7632 +17 6083 284.886 260.803 85.9945 -7.24167 -1.93736 16.0935 +18 6083 267.895 242.158 82.3888 -7.131 -1.88813 15.0595 +16 6085 383.611 361.316 41.4004 -5.44371 -3.16708 17.3838 +17 6085 373.473 349.107 33.0803 -5.20445 -3.08127 15.9061 +18 6085 361.155 335.977 25.7422 -5.29943 -3.13847 15.3932 +16 6086 364.196 341.218 77.8266 -5.73577 -2.22142 16.8671 +17 6086 352.327 328.142 72.9596 -5.71326 -2.2187 16.0257 +16 6087 331.188 308.968 83.7944 -6.72925 -2.1529 17.4422 +17 6087 316.387 293.096 78.8176 -6.76106 -2.16865 16.6399 +18 6087 301.936 273.667 72.6932 -5.84532 -1.90321 13.7103 +19 6087 284.597 251.639 65.7517 -5.29639 -1.7456 11.7599 +16 6088 347.959 324.717 90.4136 -6.04611 -1.90536 16.6761 +17 6088 334.853 310.284 86.2575 -6.00596 -1.89327 15.7751 +18 6088 320.089 294.203 81.0297 -6.00666 -1.9054 14.9723 +19 6088 304.057 275.943 74.9112 -5.83688 -1.87128 13.7856 +20 6088 284.44 254.198 67.6593 -5.77476 -1.86846 12.8159 +16 6089 346.05 320.988 36.9158 -5.64766 -2.9135 15.4644 +17 6089 331.794 305.495 29.4369 -5.67327 -2.92925 14.7372 +18 6089 316.013 287.864 19.8856 -5.60155 -2.919 13.7687 +16 6090 323.872 300.07 48.491 -6.44728 -2.80658 16.2834 +17 6090 309.586 283.212 42.9203 -6.10954 -2.64635 14.6955 +18 6090 292.975 265.473 36.0442 -6.18315 -2.67201 14.0922 +16 6092 337.329 314.184 59.6313 -6.31783 -2.62764 16.7452 +17 6092 324.167 299.931 54.2476 -6.32549 -2.62881 15.9923 +16 6097 530.696 508.579 15.5546 -1.91534 -3.82032 17.5239 +17 6097 528.284 504.28 7.40231 -1.81877 -3.70246 16.1465 +16 6098 449.077 426.843 26.1405 -3.87709 -3.54445 17.4316 +17 6098 441.893 418.708 19.0978 -3.88461 -3.56233 16.7171 +16 6101 428.948 405.777 33.7056 -4.18685 -3.22568 16.7264 +17 6101 420.399 395.976 26.3639 -4.16026 -3.2218 15.869 +16 6104 485.862 462.913 48.1971 -2.89527 -2.91773 16.8884 +17 6104 481.178 456.746 42.2691 -2.82248 -2.87094 15.8632 +18 6104 475.676 449.77 35.6432 -2.77599 -2.845 14.9607 +16 6105 465.001 444.053 69.0287 -3.70669 -2.66225 18.5014 +17 6105 459.245 437.217 64.101 -3.66537 -2.65191 17.5945 +16 6109 554.329 536.814 58.2271 -1.69375 -3.51528 22.1275 +17 6109 553.281 535.196 50.6988 -1.67156 -3.6282 21.4308 +16 6112 511.459 502.546 114.421 -5.91223 -3.52158 43.4849 +17 6112 510.577 501.84 113.703 -6.08564 -3.6367 44.3615 +18 6112 509.824 500.981 112.992 -6.05875 -3.63652 43.8321 +19 6112 508.928 500.034 111.203 -6.0781 -3.72369 43.5806 +20 6112 507.92 499.141 109.418 -6.21876 -3.88129 44.147 +21 6112 507.008 497.91 107.115 -6.05462 -3.8812 42.5994 +16 6115 418.36 396.429 120.328 -4.68309 -1.28653 17.6728 +17 6115 409.297 386.455 117.781 -4.70943 -1.29512 16.9679 +16 6116 445.472 423.558 37.4807 -4.02211 -3.31827 17.6864 +17 6116 438.555 414.812 31.3485 -3.86869 -3.20134 16.3236 +16 6117 520.365 513.333 117.163 -6.81387 -4.25445 55.1207 +17 6117 520.249 513.084 117.042 -6.69592 -4.18444 54.0961 +18 6117 520.092 512.71 116.746 -6.51032 -4.08288 52.5047 +19 6117 519.956 512.376 115.874 -6.35017 -4.03815 51.1352 +20 6117 519.526 511.835 114.655 -6.28815 -4.06475 50.3938 +16 6119 531.688 515.136 59.7963 -2.52705 -3.66893 23.4152 +17 6119 528.926 513.003 54.5144 -2.72 -3.99195 24.3396 +18 6119 526.164 511.245 48.7346 -3.00249 -4.46869 25.9777 +19 6119 523.746 508.334 42.513 -2.99074 -4.54261 25.1468 +16 6122 642.185 630.739 95.5728 1.53113 -3.62686 33.8623 +17 6122 644.364 632.92 94.0077 1.63371 -3.70104 33.8689 +18 6122 646.831 634.889 92.5857 1.67648 -3.61042 32.4544 +19 6122 649.317 636.987 90.3854 1.73195 -3.59252 31.4318 +16 6124 597.147 590.861 120.063 -1.06079 -4.51149 61.6626 +17 6124 597.997 591.88 119.284 -1.01519 -4.70374 63.3551 +18 6124 598.965 592.549 119.37 -0.886993 -4.4779 60.4102 +19 6124 599.822 593.674 118.651 -0.850828 -4.73611 63.0456 +20 6124 600.7 594.08 117.237 -0.718918 -4.51302 58.5493 +16 6137 598.38 591.888 78.6895 -0.92483 -7.79025 59.693 +17 6137 599.422 592.811 77.8321 -0.823759 -7.72131 58.6309 +18 6137 600.518 593.228 77.0166 -0.666288 -7.06234 53.1707 +19 6137 601.795 593.808 75.3343 -0.52213 -6.55825 48.5238 +20 6137 602.51 594.029 72.9793 -0.446469 -6.32549 45.6981 +16 6145 759.851 739.325 60.0111 3.93299 -2.95298 18.8819 +17 6145 768.753 747.399 55.0087 4.00445 -2.96435 18.15 +18 6145 778.995 756.113 49.8749 3.97747 -2.8869 16.9379 +19 6145 789.813 765.856 43.7704 4.04155 -2.89425 16.1779 +20 6145 801.228 776.028 35.8778 4.08559 -2.91977 15.3802 +16 6146 708.518 688.375 96.9889 2.63897 -2.02313 19.2415 +17 6146 714.981 693.83 93.7064 2.67726 -2.01001 18.324 +18 6146 721.962 699.563 90.4039 2.6955 -1.97721 17.303 +16 6147 711.965 691.705 105.105 2.7151 -1.79624 19.1303 +17 6147 718.399 697.088 102.315 2.74327 -1.77793 18.1861 +18 6147 725.873 703.222 99.1723 2.75828 -1.74729 17.1106 +19 6147 734.13 710.057 95.1979 2.77953 -1.73273 16.0996 +20 6147 742.368 716.897 90.1069 2.80073 -1.74501 15.2161 +21 6147 751.997 725.335 84.0806 2.86968 -1.78851 14.5368 +16 6151 790.029 769.723 15.8251 4.77396 -4.15388 19.0868 +17 6151 800.456 779.197 8.4398 4.82356 -4.15441 18.2318 +16 6152 740.329 720.123 39.5198 3.4764 -3.54458 19.1815 +17 6152 748.349 727.032 33.0776 3.49729 -3.52215 18.1816 +16 6153 740.329 720.123 39.5198 3.4764 -3.54458 19.1815 +17 6153 748.349 727.032 33.0776 3.49729 -3.52215 18.1816 +16 6155 705.327 684.34 73.2912 2.45111 -2.54823 18.4672 +17 6155 711.458 689.97 69.0627 2.54726 -2.59458 18.037 +18 6155 717.528 695.664 64.4828 2.65262 -2.66251 17.727 +16 6156 801.661 781.677 29.7351 5.16344 -3.84685 19.394 +17 6156 812.355 791.67 23.4456 5.26637 -3.87997 18.7375 +18 6156 823.551 802.908 16.8024 5.5684 -4.06071 18.7755 +16 6160 869.491 848.445 20.3182 6.63412 -3.8931 18.4155 +17 6160 884.423 862.219 12.934 6.64933 -3.86868 17.455 +16 6168 854.216 834.188 73.3688 6.56164 -2.66817 19.3515 +17 6168 867.96 846.945 68.3057 6.60496 -2.67235 18.4432 +16 6170 903.948 882.017 117.996 7.21039 -1.34362 17.6724 +17 6170 921.705 898.573 115.771 7.24847 -1.32555 16.7552 +18 6170 941.227 916.822 113.884 7.29986 -1.29789 15.8807 +19 6170 963.271 937.409 110.973 7.34677 -1.2853 14.9867 +20 6170 987.704 959.982 106.534 7.32715 -1.28506 13.9809 +21 6170 1015.33 985.817 101.608 7.38626 -1.2969 13.1343 +22 6170 1046.48 1015.19 96.1025 7.50006 -1.31749 12.3857 +23 6170 1081.98 1048.44 89.6836 7.56466 -1.33176 11.5536 +24 6170 1123.45 1086.89 83.0919 7.54989 -1.31875 10.6005 +25 6170 1171.12 1132.13 74.6581 7.73663 -1.35285 9.94067 +16 6171 884.922 863.747 121.465 6.98515 -1.30358 18.3033 +17 6171 901.125 878.793 119.472 7.01286 -1.28396 17.3547 +18 6171 918.916 895.289 117.558 7.03312 -1.25714 16.4039 +19 6171 938.665 913.794 115.07 7.10772 -1.24796 15.5831 +20 6171 960.836 934.022 110.792 7.03705 -1.24327 14.4544 +21 6171 985.458 957.07 106.126 7.11267 -1.26261 13.6528 +22 6171 1013.26 982.873 101.01 7.13706 -1.27014 12.7562 +16 6172 879.587 858.774 125.589 6.96905 -1.21984 18.6219 +17 6172 895.426 873.346 123.7 6.95471 -1.19584 17.554 +16 6174 888.944 867.28 75.4452 6.92703 -2.41514 17.8897 +17 6174 905.687 882.878 70.3048 6.9739 -2.41507 16.9925 +18 6174 924.343 899.933 64.647 6.92691 -2.38112 15.8776 +19 6174 945.077 919.327 58.6996 6.999 -2.3813 15.0515 +20 6174 967.936 940.468 50.3673 7.00816 -2.39526 14.1099 +21 6174 993.896 964.737 41.2801 7.08017 -2.42383 13.292 +16 6175 905.128 882.943 76.728 7.15624 -2.32738 17.4697 +17 6175 923.082 899.677 71.8664 7.19531 -2.31765 16.5592 +16 6176 896.169 874.585 78.2408 7.13271 -2.35459 17.9565 +17 6176 913.296 890.315 74.0878 7.09938 -2.30851 16.8648 +16 6179 844.325 824.228 21.2783 6.27484 -4.05134 19.2854 +17 6179 857.295 836.319 14.7039 6.34389 -4.04982 18.4768 +16 6182 839.568 819.317 44.9764 6.10101 -3.39197 19.1389 +17 6182 852.432 831.367 38.5536 6.19325 -3.42466 18.3992 +18 6182 866.268 844.268 31.7065 6.26787 -3.4463 17.6173 +19 6182 879.91 859.067 25.1637 6.96744 -3.80625 18.5954 +16 6183 981.772 960.723 15.8279 9.49836 -4.00709 18.4126 +17 6183 1003.11 980.734 8.86004 9.44632 -3.93629 17.3188 +16 6185 1059.79 1035.64 106.719 10.0146 -1.47105 16.0493 +17 6185 1089.29 1063.61 103.318 10.0363 -1.45476 15.0952 +16 6190 1086.88 1064.1 106.94 11.2562 -1.55439 17.0153 +17 6190 1118.95 1093.13 102.856 10.5935 -1.45569 15.0053 +16 6191 1101.42 1081.96 39.0446 13.5769 -3.69357 19.9168 +17 6191 1126.55 1106.54 33.3084 13.8725 -3.74442 19.361 +18 6191 1153.92 1134.13 27.6816 14.7766 -3.94065 19.5859 +16 6193 1023.22 999.57 94.7153 9.39438 -1.77455 16.3863 +17 6193 1049.9 1024.76 90.5768 9.40792 -1.75785 15.4157 +16 6194 1060.22 1036.12 98.5301 10.0417 -1.65609 16.0774 +17 6194 1089.23 1064 94.7633 10.2151 -1.66303 15.366 +16 6209 60.2373 38.4433 177.958 -13.539 0.125795 17.7835 +17 6209 31.9519 9.57724 178.239 -13.8667 0.129277 17.322 +16 6215 73.6055 52.7692 168.872 -13.8166 -0.102654 18.6009 +17 6215 47.3906 25.576 168.778 -13.8426 -0.100358 17.7668 +16 6221 225.71 221.291 196.099 -46.6585 2.82553 87.7059 +17 6221 223.221 218.784 196.536 -46.7734 2.86711 87.3554 +16 6224 194.385 145.267 242.931 -4.54028 0.766347 7.89062 +17 6224 142.795 86.6024 251.978 -4.46185 0.756357 6.89725 +16 6229 159.72 149.136 152.322 -22.8302 -1.04206 36.6195 +17 6229 150 142.084 151.71 -31.1806 -1.43462 48.9556 +16 6231 213.995 167.669 244.852 -4.58659 0.834818 8.36627 +17 6231 168.423 116.933 253.809 -4.60205 0.844544 7.52727 +18 6231 110.386 52.5819 265.071 -4.63858 0.856927 6.70492 +16 6233 192.969 183.386 148.151 -23.3499 -1.38462 40.4423 +17 6233 184.669 173.52 148.077 -20.4711 -1.19376 34.7634 +16 6234 164.66 153.842 161.119 -22.0895 -0.582658 35.8248 +17 6234 154.59 144.226 161.494 -23.5804 -0.588761 37.3962 +16 6238 140.365 131.748 204.022 -29.2483 1.94295 44.9787 +17 6238 132.481 123.658 205.241 -29.044 1.97166 43.9264 +16 6239 160.996 150.204 137.746 -22.326 -1.74741 35.9126 +17 6239 150.981 140.54 136.634 -23.5927 -1.86342 37.1213 +18 6239 141.146 131.137 136.56 -25.1382 -1.9478 38.7226 +19 6239 131.545 121.154 135.266 -24.7083 -1.94292 37.2959 +16 6241 173.093 163.594 206.287 -24.6805 1.8905 40.8002 +17 6241 165.284 153.914 207.758 -20.9887 1.64897 34.0873 +18 6241 154.486 141.029 209.218 -18.1642 1.45146 28.8001 +16 6243 412.383 389.978 141.067 -4.72729 -0.762098 17.2988 +17 6243 402.9 380.018 139.995 -4.85121 -0.771335 16.9377 +16 6249 394.794 374.424 238.186 -5.66322 1.72275 19.0265 +17 6249 385.686 364.427 241.681 -5.65655 1.73903 18.2309 +16 6250 324.961 291.21 244.688 -4.52936 1.14323 11.4832 +17 6250 302.531 265.909 251.075 -4.50332 1.1473 10.5831 +16 6251 324.961 291.21 244.688 -4.52936 1.14323 11.4832 +17 6251 302.531 265.909 251.075 -4.50332 1.1473 10.5831 +16 6254 401.994 379.564 140.259 -4.97056 -0.780551 17.2787 +17 6254 392.039 369.234 139.118 -5.12365 -0.794634 16.9957 +18 6254 381.566 357.898 137.422 -5.17439 -0.804136 16.3755 +16 6255 325.386 294.675 215.779 -4.97029 0.750765 12.62 +17 6255 304.594 268.044 219.056 -4.48187 0.679007 10.604 +16 6257 438.185 429.164 206.393 -10.2042 1.99704 42.9626 +17 6257 435.995 426.848 207.381 -10.1927 2.02765 42.3729 +16 6258 429.892 418.306 213.342 -8.33042 1.87727 33.4546 +17 6258 425.938 414.535 214.765 -8.64935 1.97419 33.9875 +16 6259 519.466 512.957 140.842 -7.43586 -2.6421 59.5519 +17 6259 519.407 512.797 140.817 -7.32626 -2.60345 58.6358 +18 6259 519.22 512.53 140.811 -7.25353 -2.57282 57.9339 +19 6259 519.224 512.235 140.003 -6.94283 -2.52482 55.4548 +20 6259 518.779 511.671 139.007 -6.86077 -2.55799 54.5305 +16 6261 471.557 466.577 168.741 -14.8845 -0.443605 77.8227 +17 6261 471.66 466.06 169.404 -13.226 -0.330893 69.2032 +16 6267 510.913 504.181 190.406 -7.87013 1.40029 57.5655 +17 6267 510.863 503.955 191.274 -7.67522 1.43248 56.1109 +16 6268 645.701 634.379 205.98 1.71468 1.57161 34.2321 +17 6268 648.149 636.511 207.357 1.7811 1.59247 33.3021 +18 6268 650.391 638.369 208.98 1.82442 1.61414 32.2392 +16 6269 561.156 553.891 134.885 -3.57878 -2.80732 53.3481 +17 6269 561.892 554.329 134.615 -3.38529 -2.71574 51.2433 +16 6270 691.764 671.035 211.222 2.1302 0.994245 18.6976 +17 6270 698.489 675.5 214.036 2.07788 0.962249 16.8591 +16 6273 565.017 545.492 239.366 -1.22535 1.82973 19.8495 +17 6273 564.865 544.159 242.927 -1.15944 1.81781 18.7179 +18 6273 563.526 541.662 247.888 -1.13091 1.84339 17.7263 +16 6276 731.724 727.22 158.934 14.5713 -1.66032 86.0623 +17 6276 734.305 729.698 159.241 14.5434 -1.58702 84.1196 +18 6276 737.074 732.566 160.023 15.194 -1.52886 85.9749 +16 6278 729.199 700.867 204.948 2.26825 0.608479 13.6796 +17 6278 738.824 709.395 207.82 2.35937 0.638213 13.1696 +18 6278 750.26 718.142 211.165 2.35312 0.64072 12.0672 +16 6281 820.662 800.178 221.621 5.53583 1.27883 18.9212 +17 6281 832.438 811.134 224.66 5.61963 1.30624 18.1928 +18 6281 846.131 823.207 228.332 5.54338 1.29997 16.9072 +19 6281 860.836 836.898 231.772 5.63846 1.32207 16.1908 +20 6281 876.858 851.342 234.549 5.62706 1.29877 15.1895 +16 6282 768.931 764.372 131.953 18.7784 -4.81929 85.0172 +17 6282 772.117 767.369 131.997 18.3912 -4.62247 81.6324 +18 6282 775.138 770.488 132.532 19.1272 -4.65792 83.35 +16 6284 809.505 788.971 220.205 5.23042 1.23866 18.8748 +17 6284 821.13 799.696 223.217 5.30205 1.26211 18.082 +18 6284 834.592 811.541 227.453 5.24385 1.27231 16.8138 +16 6285 698.97 675.844 229.638 2.07669 1.31888 16.7586 +17 6285 705.374 680.922 233.25 2.10481 1.32675 15.8504 +16 6286 708.174 688.815 140.141 2.73629 -0.907683 20.0207 +17 6286 714.203 694.093 139.052 2.79517 -0.90291 19.2733 +16 6287 735.481 723.74 185.932 5.76098 0.598332 33.0106 +17 6287 740.374 729.088 186.774 6.22584 0.662513 34.34 +16 6290 699.726 675.914 239.117 2.03395 1.49474 16.2762 +17 6290 706.304 680.915 243.264 2.04676 1.48961 15.265 +18 6290 713.334 686.58 247.813 2.08358 1.50503 14.487 +19 6290 721.457 692.842 252.517 2.10051 1.49542 13.5445 +20 6290 730.189 700.194 256.658 2.16019 1.50072 12.921 +21 6290 740.068 708.068 261.341 2.19069 1.48532 12.1116 +22 6290 751.199 716.981 267.22 2.22345 1.48135 11.3267 +23 6290 764.162 727.301 274.35 2.25293 1.47904 10.5145 +24 6290 779.012 739.146 282.954 2.28317 1.48346 9.72188 +25 6290 796.456 752.332 292.563 2.2752 1.45729 8.7837 +26 6290 816.194 768.642 302.38 2.33416 1.46314 8.15055 +16 6292 881.069 860.04 136.313 6.93515 -0.933369 18.4302 +17 6292 896.845 874.837 135.102 7.01191 -0.921433 17.6109 +16 6293 883.167 862.444 159.493 7.09184 -0.346312 18.702 +17 6293 898.817 877.231 159.39 7.19797 -0.335037 17.9549 +18 6293 916.209 893.317 159.736 7.19519 -0.307803 16.93 +16 6302 924.14 900.213 175.595 7.06201 0.061537 16.1977 +17 6302 944.123 918.846 175.304 7.10954 0.0520707 15.3328 +16 6308 1082.69 1055.59 134.318 9.37849 -0.763877 14.3026 +17 6308 1116.53 1088.34 131.813 9.662 -0.782171 13.7514 +18 6308 1154.62 1125.66 129.821 10.1109 -0.798255 13.3845 +16 6310 1098.05 1071.5 165.88 9.88041 -0.141051 14.594 +17 6310 1133.85 1105.11 166.49 9.79842 -0.118934 13.4848 +16 6311 1098.05 1071.5 165.88 9.88041 -0.141051 14.594 +17 6311 1133.85 1105.11 166.49 9.79842 -0.118934 13.4848 +16 6343 140.228 85.0972 278.327 -4.57278 1.02765 7.03008 +17 6343 73.2623 9.85353 293.931 -4.5431 1.02567 6.11231 +16 6361 495.048 448.077 317.26 -1.30953 1.6514 8.25139 +17 6361 484.178 432.106 335.272 -1.29338 1.67543 7.44304 +16 6363 587.878 559.613 259.15 -0.412046 1.64001 13.7125 +17 6363 588.237 558.12 265.736 -0.380296 1.65659 12.8689 +18 6363 587.973 555.742 273.07 -0.359739 1.67013 12.0247 +16 6366 598.211 561.218 282.395 -0.164777 1.59057 10.477 +17 6366 597.516 558.369 292.237 -0.165247 1.6381 9.90045 +18 6366 598.305 556.027 304.559 -0.142992 1.67334 9.16729 +16 6373 819.441 792.37 254.647 4.16447 1.62294 14.3167 +17 6373 835.846 805.578 261.712 4.01578 1.57691 12.8047 +18 6373 854.96 822.448 271.535 4.0545 1.6304 11.9212 +19 6373 876.4 841.759 280.852 4.13774 1.67466 11.1885 +16 6388 860.574 807.266 324.945 2.5293 1.53251 7.27042 +17 6388 898.38 837.198 347.339 2.53571 1.5319 6.33477 +16 6394 903.014 869.004 259.642 4.63469 1.37069 11.3956 +17 6394 929.361 893.203 268.479 4.75091 1.42058 10.719 +18 6394 961.473 922.733 279.255 4.87947 1.4753 10.0045 +17 6407 598.365 591.531 57.4439 -0.879929 -9.07147 56.7143 +18 6407 599.562 592.536 56.2437 -0.764318 -8.91499 55.1624 +19 6407 600.661 593.662 54.2505 -0.682942 -9.10248 55.376 +20 6407 601.557 594.198 51.6822 -0.584053 -8.84394 52.6627 +17 6423 940.531 896.673 289.208 4.05351 1.42502 8.83689 +18 6423 980.119 931.049 303.696 4.05637 1.43227 7.89838 +19 6423 1029.62 973.785 320.935 4.04098 1.42453 6.94113 +17 6441 232.308 207.195 35.0494 -8.06897 -2.94749 15.4329 +18 6441 211.126 185.269 26.9045 -8.2771 -3.03197 14.9893 +17 6442 269.864 244.681 40.7347 -7.24558 -2.81806 15.3901 +18 6442 249.86 223.4 32.4343 -7.30191 -2.85053 14.6473 +17 6443 247.221 222.417 57.5981 -7.84668 -2.49594 15.6254 +18 6443 227.086 200.282 50.9165 -7.66467 -2.4436 14.4594 +19 6443 203.984 174.491 42.4089 -7.38669 -2.37578 13.1413 +20 6443 176.468 146.607 32.7879 -7.7905 -2.51953 12.9791 +17 6446 244.01 220.028 98.0273 -8.1877 -1.67599 16.1612 +18 6446 224.486 201.848 94.223 -9.13716 -1.86578 17.1209 +17 6460 274.745 252.145 65.7347 -7.95797 -2.54604 17.1497 +18 6460 258.015 233.437 59.2172 -7.68287 -2.48349 15.7689 +19 6460 239.296 208.536 50.3955 -6.46587 -2.13848 12.6001 +20 6460 212.363 182.204 42.2103 -7.0744 -2.32687 12.8512 +21 6460 184.554 151.61 31.8468 -6.92982 -2.29916 11.7649 +22 6460 151.143 117.79 20.2753 -7.38286 -2.4573 11.6205 +17 6462 270.264 246.197 95.407 -7.57288 -1.72857 16.1043 +18 6462 252.474 227.124 91.2142 -7.56665 -1.72995 15.2894 +19 6462 232.448 205.365 85.5404 -7.47944 -1.73174 14.3106 +17 6467 282.537 256.647 61.0464 -6.78494 -2.31974 14.9702 +18 6467 263.07 235.931 55.0766 -6.8579 -2.33111 14.2811 +17 6473 364.176 340.13 74.945 -5.48155 -2.18716 16.1182 +18 6473 350.874 324.593 70.1498 -5.28714 -2.09913 14.7472 +17 6477 380.769 357.159 113.937 -5.20513 -1.34041 16.4155 +18 6477 369.013 345.413 110.702 -5.47504 -1.41462 16.4228 +17 6480 499.744 475.775 13.4103 -2.46099 -3.57318 16.1699 +18 6480 494.85 468.794 4.84907 -2.36474 -3.46345 14.8746 +17 6486 506.952 487.75 108.052 -2.87037 -1.8128 20.1845 +18 6486 505.66 485.345 106.994 -2.74721 -1.74141 19.0783 +17 6487 553.918 546.976 121.994 -4.30535 -3.9354 55.8307 +18 6487 554.047 547.083 121.948 -4.28172 -3.92646 55.6531 +17 6488 553.918 546.976 121.994 -4.30535 -3.9354 55.8307 +18 6488 554.047 547.083 121.948 -4.28172 -3.92646 55.6531 +17 6490 419.669 397.944 81.1415 -4.69495 -2.26755 17.8397 +18 6490 411.331 387.525 76.3901 -4.4728 -2.1766 16.2807 +17 6491 454.059 431.491 92.9571 -3.70116 -1.90167 17.1737 +18 6491 447.09 423.295 88.98 -3.66767 -1.89341 16.2884 +19 6491 439.313 414.108 83.9472 -3.62812 -1.8947 15.3767 +20 6491 430.216 403.414 77.9547 -3.59428 -1.90191 14.4606 +17 6493 445.773 423.574 69.0385 -3.96315 -2.51203 17.4591 +18 6493 438.652 414.641 63.9323 -3.82331 -2.43665 16.1413 +19 6493 430.707 405.311 57.4089 -3.78294 -2.4418 15.2614 +20 6493 421.187 394.036 50.135 -3.7268 -2.4279 14.275 +17 6495 425.008 402.328 115.769 -4.37098 -1.35201 17.0891 +18 6495 416.584 392.542 113.026 -4.31154 -1.3367 16.1209 +17 6496 485.404 460.507 37.7111 -2.6787 -2.91575 15.5674 +18 6496 480.947 454.502 30.4236 -2.61234 -2.89301 14.6557 +17 6505 581.177 575.01 91.9551 -2.47232 -7.04692 62.8516 +18 6505 582.039 575.773 91.3358 -2.35922 -6.98833 61.8555 +19 6505 582.935 576.607 90.178 -2.26006 -7.018 61.2481 +20 6505 583.756 577.013 88.551 -2.05542 -6.71533 57.4756 +21 6505 584.404 577.534 86.0189 -1.96691 -6.78958 56.4165 +17 6506 631.321 619.939 98.0276 1.02703 -3.53141 34.0527 +18 6506 633.333 621.312 96.6251 1.06226 -3.40605 32.2397 +19 6506 635.485 623.32 94.5549 1.1448 -3.45746 31.861 +20 6506 637.354 624.766 91.8047 1.18605 -3.45857 30.7898 +17 6510 572.024 565.326 111.117 -3.01007 -4.95086 57.8621 +18 6510 572.649 566.138 110.673 -3.04514 -5.13001 59.5273 +17 6518 566.12 559.744 80.3825 -3.65977 -7.79073 60.7896 +18 6518 566.738 560.011 79.5627 -3.41909 -7.44891 57.6117 +19 6518 567.483 560.52 77.4744 -3.24593 -7.35797 55.6624 +20 6518 567.926 560.765 75.229 -3.12279 -7.32264 54.121 +21 6518 568.405 561.232 72.675 -3.08186 -7.50194 54.0326 +22 6518 568.845 561.46 70.6109 -2.9615 -7.43692 52.483 +17 6521 718.944 696.563 33.2818 2.62534 -3.34988 17.3177 +18 6521 726.928 702.813 26.2169 2.61433 -3.26628 16.0719 +17 6522 773.675 752.359 33.2736 4.13569 -3.51741 18.1827 +18 6522 783.844 761.37 26.4529 4.16549 -3.49906 17.2451 +17 6523 773.675 752.359 33.2736 4.13569 -3.51741 18.1827 +18 6523 783.844 761.37 26.4529 4.16549 -3.49906 17.2451 +17 6524 725.33 703.578 44.8272 2.85882 -3.16148 17.8176 +18 6524 732.485 710.155 38.6782 2.95697 -3.22758 17.3565 +19 6524 741 716.73 31.1917 2.90909 -3.13532 15.9693 +20 6524 750.718 723.833 21.9219 2.82024 -3.01551 14.4158 +21 6524 761.005 731.355 11.3591 2.74366 -2.92571 13.0717 +17 6525 718.445 696.153 58.046 2.62368 -2.76637 17.3859 +18 6525 725.937 702.45 52.623 2.66153 -2.74966 16.5014 +19 6525 734.165 709.526 45.7797 2.71647 -2.77027 15.7298 +17 6529 765.362 749.667 98.4819 5.3324 -2.54541 24.6949 +18 6529 775.263 755.717 95.8536 4.55386 -2.11613 19.8293 +19 6529 785.22 764.357 92.438 4.52274 -2.07047 18.5775 +17 6534 695.65 674.124 53.7391 2.14827 -2.97234 18.0049 +18 6534 701.718 678.754 49.9682 2.15569 -2.87442 16.8775 +17 6536 751.265 728.926 84.1796 3.4073 -2.13216 17.3493 +18 6536 760.598 737.469 80.1551 3.50773 -2.15285 16.7571 +17 6537 700.453 679.29 103.726 2.30704 -1.7546 18.314 +18 6537 706.427 684.269 100.934 2.34823 -1.74347 17.4912 +19 6537 713.381 690.091 97.1892 2.39458 -1.74517 16.6419 +17 6538 749.821 729.619 120.758 3.72934 -1.38515 19.1845 +18 6538 758.305 736.88 119.147 3.72915 -1.34647 18.0894 +19 6538 767.764 744.942 116.413 3.72361 -1.32844 16.9827 +20 6538 778.06 753.952 112.672 3.75439 -1.34094 16.0767 +17 6540 815.922 794.827 39.1622 5.25484 -3.40434 18.3733 +18 6540 828.527 805.853 33.091 5.18736 -3.31099 17.0932 +17 6541 763.321 741.089 43.754 3.71502 -3.11916 17.4329 +18 6541 773.17 750.31 37.7582 3.84453 -3.1745 16.9548 +19 6541 785.054 759.661 30.3538 3.71246 -3.01449 15.2636 +20 6541 797.455 770.28 21.1885 3.71412 -2.99797 14.2626 +17 6544 718.011 697.391 114.874 2.82517 -1.51037 18.796 +18 6544 725.165 703.345 113.526 2.84592 -1.46051 17.7624 +19 6544 732.755 709.972 110.172 2.90454 -1.47784 17.0114 +20 6544 741.131 716.86 105.71 2.91185 -1.48599 15.9685 +21 6544 749.867 724.363 100.369 2.95516 -1.52668 15.197 +22 6544 760.407 733.278 96.6348 2.98673 -1.50911 14.2862 +23 6544 772.134 742.606 91.4806 2.95743 -1.48028 13.1257 +24 6544 784.938 753.206 84.7331 2.96875 -1.49168 12.214 +25 6544 799.327 765.24 77.1367 2.99043 -1.50835 11.3703 +17 6546 937.052 913.119 32.014 7.34999 -3.1609 16.1936 +18 6546 958.048 932.826 24.9324 7.42149 -3.15017 15.366 +17 6552 886.95 864.9 48.6798 6.75765 -3.02507 17.5778 +18 6552 903.972 880.728 43.0698 6.80363 -2.9992 16.6741 +19 6552 922.995 898.152 35.9657 6.77711 -2.9598 15.6011 +20 6552 944.633 917.466 27.2336 6.62511 -2.87922 14.2663 +21 6552 968.39 938.702 17.0113 6.49234 -2.81967 13.0548 +17 6559 869.836 846.269 108.209 5.93238 -1.47342 16.4457 +18 6559 884.364 862.961 106.443 6.89677 -1.66672 18.1084 +19 6559 900.755 878.314 103.882 6.97016 -1.65093 17.271 +17 6562 933.187 909.862 75.3572 7.45284 -2.24526 16.6163 +18 6562 953.54 928.779 70.3602 7.4622 -2.22347 15.6528 +17 6564 926.179 902.82 59.8129 7.28072 -2.5994 16.5919 +18 6564 946.31 921.494 54.4023 7.28906 -2.56392 15.6179 +19 6564 969.007 942.604 47.6101 7.31275 -2.54801 14.6792 +20 6564 993.833 965.757 38.5725 7.35186 -2.56905 13.8043 +21 6564 1022.1 992.443 28.5534 7.47226 -2.61369 13.0691 +22 6564 1054.46 1022.03 17.058 7.36736 -2.57989 11.9483 +17 6566 973.935 950.756 53.9734 8.44428 -2.75502 16.7214 +18 6566 996.801 972.089 48.2888 8.41717 -2.70757 15.6835 +19 6566 1022.31 996.091 41.4733 8.45526 -2.69134 14.7807 +17 6569 1096.16 1069.31 112.917 9.73413 -1.19899 14.4338 +18 6569 1131.63 1102.95 110.244 9.77869 -1.17274 13.5149 +19 6569 1172.18 1141.98 106.354 10.0041 -1.18245 12.8297 +17 6574 1074.79 1049.4 101.316 9.84189 -1.51338 15.264 +18 6574 1106.75 1079.87 98.1856 9.9331 -1.49175 14.4152 +17 6576 999.422 977.594 32.6908 9.5942 -3.44931 17.7565 +18 6576 1022.54 999.241 25.7811 9.52087 -3.39062 16.6343 +19 6576 1048.67 1023.86 17.1712 9.50683 -3.3706 15.6216 +17 6578 1071.87 1046.3 91.919 9.71118 -1.7001 15.1564 +18 6578 1102.94 1076.57 88.1249 10.0513 -1.72614 14.6995 +19 6578 1138.6 1110.35 83.309 10.059 -1.70258 13.7191 +20 6578 1178.89 1148.75 76.003 10.1472 -1.72618 12.86 +17 6581 1132.88 1113.35 32.8054 14.3945 -3.85221 19.8468 +18 6581 1162.16 1141.86 26.7672 14.6208 -3.86519 19.0906 +17 6604 192.972 182.155 152.266 -20.6869 -1.02238 35.8301 +18 6604 183.667 174.178 151.259 -24.1082 -1.22242 40.8437 +17 6607 262.71 222.206 227.148 -4.59978 0.720031 9.56875 +18 6607 228.611 184.552 233.012 -4.64434 0.733415 8.79664 +19 6607 187.167 138.087 239.079 -4.62281 0.724792 7.89677 +20 6607 134.897 79.2655 247.093 -4.58312 0.716814 6.96683 +17 6609 165.133 114.154 247.674 -4.68282 0.788361 7.60268 +18 6609 107.29 49.3547 257.733 -4.65678 0.786952 6.68973 +17 6610 198.91 150.059 249.1 -4.51534 0.838371 7.93376 +18 6610 148.544 93.7982 258.645 -4.52337 0.841755 7.07954 +19 6610 84.089 22.0452 270.168 -4.54931 0.842505 6.24679 +17 6613 244.176 222.199 135.602 -8.93055 -0.910491 17.6355 +18 6613 225.953 203.587 133.771 -9.21261 -0.938616 17.3283 +17 6614 269.163 245.614 137.645 -7.76463 -0.803145 16.4587 +18 6614 251.328 226.413 135.666 -7.72319 -0.801756 15.5558 +19 6614 230.893 204.87 132.221 -7.81622 -0.838714 14.8936 +17 6623 291.892 254.209 236.223 -4.52819 0.903299 10.2852 +18 6623 263.478 222.388 242.55 -4.52407 0.911086 9.43216 +19 6623 229.359 184.246 249.141 -4.52698 0.908341 8.59122 +20 6623 187.117 136.617 257.437 -4.49341 0.899683 7.67481 +17 6627 409.31 386.463 144.135 -4.70816 -0.675231 16.9644 +18 6627 399.74 375.63 142.985 -4.67462 -0.665468 16.0753 +19 6627 389.246 362.989 141.035 -4.50702 -0.650939 14.7608 +17 6628 408.935 387.981 163.62 -5.14293 -0.236714 18.4964 +18 6628 399.82 377.639 163.567 -5.07918 -0.224902 17.4732 +17 6629 324.28 302.681 172.213 -7.0949 -0.0159436 17.9446 +18 6629 310.849 287.909 172.316 -6.99437 -0.0126022 16.895 +17 6633 340.215 309.504 250.606 -4.71094 1.35992 12.62 +18 6633 321 290.457 255.709 -5.07475 1.45713 12.6893 +17 6635 480.519 473.168 168.815 -9.42893 -0.295093 52.7224 +18 6635 479.513 471.925 169.149 -9.20512 -0.262221 51.0731 +19 6635 478.47 470.465 168.894 -8.79543 -0.265681 48.4117 +20 6635 477.203 468.921 168.138 -8.58423 -0.30584 46.7966 +21 6635 475.963 467.578 167.102 -8.55804 -0.368479 46.2209 +17 6638 521.027 502.359 232.926 -2.54743 1.72852 20.7615 +18 6638 518.239 498.733 235.99 -2.51477 1.73862 19.8696 +19 6638 515.711 494.671 238.812 -2.39604 1.68396 18.4215 +20 6638 511.833 490.192 241.265 -2.42569 1.69804 17.9094 +21 6638 509.29 485.834 244.17 -2.29617 1.63316 16.5233 +22 6638 504.353 481.495 247.049 -2.47224 1.7435 16.9554 +17 6639 484.659 475.228 144.749 -7.11378 -1.60076 41.0957 +18 6639 483.004 473.58 144.507 -7.21378 -1.6158 41.1283 +19 6639 481.437 472.158 143.951 -7.41642 -1.67309 41.7667 +20 6639 479.629 469.961 142.555 -7.21871 -1.68336 40.0874 +21 6639 477.879 468.212 140.874 -7.31638 -1.77685 40.0899 +22 6639 476.161 466.107 139.389 -7.12706 -1.78795 38.5494 +23 6639 474.244 463.95 138.747 -7.06112 -1.77981 37.6517 +24 6639 472.401 461.814 138.171 -6.95894 -1.75972 36.6084 +25 6639 469.938 459.359 137.026 -7.08908 -1.81912 36.6352 +26 6639 467.344 456.141 134.767 -6.81875 -1.82614 34.5953 +17 6642 521.383 514.232 200.836 -6.62264 2.10163 54.1926 +18 6642 521.03 513.83 201.912 -6.60511 2.168 53.8333 +19 6642 520.817 513.385 202.225 -6.41366 2.12276 52.1476 +20 6642 520.386 512.782 202.231 -6.29911 2.07515 50.9686 +21 6642 519.82 512.309 201.794 -6.41763 2.06962 51.6002 +22 6642 519.322 511.539 201.781 -6.22719 1.99625 49.7927 +23 6642 518.473 510.594 202.266 -6.20981 2.00513 49.1906 +17 6643 524.358 504.754 235.927 -2.33449 1.72818 19.7699 +18 6643 521.987 502.154 238.822 -2.37176 1.78663 19.5417 +19 6643 519.675 499.285 242.024 -2.36781 1.82215 19.0075 +20 6643 516.626 495.472 244.33 -2.35981 1.81495 18.3216 +17 6647 688.9 673.776 182.946 2.81777 0.358401 25.6252 +18 6647 693.154 678.434 184.179 3.05046 0.413246 26.3295 +17 6648 561.837 555.255 126.278 -3.89474 -3.80119 58.8864 +18 6648 562.35 555.657 126.176 -3.78906 -3.74645 57.9112 +19 6648 562.91 556.105 125.337 -3.68254 -3.75103 56.9585 +20 6648 563.276 556.22 124.023 -3.52372 -3.71764 54.9329 +21 6648 563.579 556.482 122.144 -3.47991 -3.83789 54.6078 +22 6648 563.881 556.727 120.918 -3.4294 -3.89924 54.1713 +23 6648 564.256 556.866 120.239 -3.29288 -3.82433 52.4453 +24 6648 564.669 557.158 119.776 -3.21069 -3.79625 51.606 +25 6648 564.71 557.179 118.437 -3.1987 -3.88109 51.4613 +26 6648 564.817 556.986 116.044 -3.06875 -3.89645 49.4885 +17 6649 675.899 659.674 205.554 2.19625 1.08257 23.8873 +18 6649 679.848 662.847 207.364 2.22088 1.09042 22.7982 +17 6650 630.112 622.259 156.665 1.40578 -1.10727 49.3512 +18 6650 631.23 623.69 156.232 1.54388 -1.18424 51.4047 +17 6653 680.042 664.521 188.49 2.43916 0.541094 24.9697 +18 6653 684.191 667.849 189.756 2.45302 0.555542 23.7158 +19 6653 688.474 671.504 190.519 2.49793 0.559154 22.8392 +17 6654 711.785 691.283 126.316 2.6783 -1.21928 18.9041 +18 6654 718.102 696.776 124.73 2.73392 -1.21213 18.1738 +17 6655 738.481 718.06 132.502 3.39116 -1.06141 18.9794 +18 6655 746.377 724.868 131.085 3.41693 -1.04315 18.02 +19 6655 755.032 732.404 128.995 3.45327 -1.04114 17.1281 +20 6655 764.425 740.846 125.957 3.52797 -1.06834 16.4372 +17 6656 709.732 689.906 148.938 2.7139 -0.64794 19.548 +18 6656 716.024 695.269 148.536 2.75538 -0.62937 18.6739 +19 6656 722.992 701.091 147.337 2.78205 -0.62582 17.6964 +17 6658 750.547 717.586 217.678 2.29757 0.730456 11.7583 +18 6658 762.063 727.51 222 2.37078 0.764009 11.2168 +19 6658 776.806 741.072 226.146 2.51405 0.801083 10.8461 +17 6660 780.458 767.054 161.291 6.84867 -0.463377 28.9152 +18 6660 786.641 773.556 161.445 7.26911 -0.468345 29.6187 +19 6660 793.317 780.251 161.507 7.55434 -0.466495 29.6626 +20 6660 802.048 787.588 161.324 7.15043 -0.428311 26.8032 +21 6660 810.016 794.003 160.314 6.72411 -0.420626 24.2032 +17 6661 766.845 756.342 177.574 8.04356 0.241386 36.8992 +18 6661 772.838 762.145 178.241 8.20186 0.270584 36.2444 +19 6661 780.357 767.881 178.725 7.35333 0.252762 31.0642 +20 6661 787.303 773.538 178.164 6.93605 0.207192 28.1564 +17 6663 791.295 761.094 213.684 3.23232 0.726192 12.8332 +18 6663 807.339 774.076 217.429 3.19383 0.719821 11.6517 +17 6671 932.894 909.418 128.243 7.39806 -1.02073 16.5091 +18 6671 952.782 928.997 126.858 7.75115 -1.03875 16.2948 +19 6671 975.003 949.4 124.678 7.66705 -1.01073 15.1379 +20 6671 999.876 972.707 120.681 7.71694 -1.03152 14.2655 +17 6676 916.919 893.967 178.196 7.19307 0.125025 16.886 +18 6676 935.883 911.902 179.449 7.30961 0.147727 16.1624 +19 6676 956.901 931.742 180.431 7.41597 0.161769 15.4053 +17 6679 847.732 839.714 148.646 15.9549 -1.62163 48.3347 +18 6679 853.429 845.66 148.884 16.8614 -1.65734 49.8878 +17 6684 1045.01 1004.02 189.186 5.70753 0.214063 9.45743 +18 6684 1092.58 1047.99 191.981 5.81834 0.230394 8.69144 +17 6693 1116.73 1088.69 180.23 9.71352 0.14127 13.8191 +18 6693 1155.73 1125.7 182.355 9.76952 0.169949 12.9063 +19 6693 1200.89 1169.09 183.881 9.98958 0.186279 12.1893 +17 6701 1120.8 1071.53 200.436 5.57359 0.300703 7.86627 +18 6701 1189.69 1134.76 205.815 5.67335 0.322341 7.05628 +17 6702 1115.1 1087.66 153.852 9.89559 -0.371944 14.1236 +18 6702 1154.41 1124.12 153.785 9.66225 -0.338165 12.7956 +19 6702 1199.5 1167.45 152.706 9.88701 -0.337669 12.0925 +17 6712 344.12 298.796 323.165 -3.1458 1.78139 8.55117 +18 6712 315.016 259.447 340.87 -2.84718 1.62411 6.97467 +17 6715 323.107 274.831 328.091 -3.18731 1.7273 8.02844 +18 6715 288.778 234.891 347.709 -3.19759 1.74298 7.19237 +17 6717 333.716 287.879 322.397 -3.23252 1.75245 8.45548 +18 6717 302.497 250.705 340.61 -3.18462 1.73984 7.48325 +17 6725 530.774 499.18 278.686 -1.33948 1.7993 12.2673 +18 6725 526.149 491.992 287.748 -1.31171 1.80683 11.3469 +19 6725 520.014 482.189 298.263 -1.27163 1.78092 10.2465 +20 6725 514.843 473.386 308.408 -1.22722 1.75634 9.34881 +21 6725 505.977 459.877 321.945 -1.20693 1.73719 8.40725 +17 6731 576.966 552.608 252.973 -0.718751 1.76682 15.9116 +18 6731 576.298 549.5 258.765 -0.666704 1.72203 14.4629 +17 6732 692.582 665.968 255.952 1.67567 1.6772 14.5631 +18 6732 699.886 671.243 262.501 1.69395 1.68121 13.5315 +17 6738 606.988 576.394 270.701 -0.0451467 1.71794 12.6683 +18 6738 611.087 574.952 280.58 0.0227081 1.60136 10.7257 +17 6739 584.415 541.378 303.719 -0.313835 1.63335 9.00568 +18 6739 583.077 536.046 318.31 -0.30245 1.66125 8.2407 +17 6750 867.766 830.067 277.6 3.6791 1.49249 10.281 +18 6750 893.876 852.408 288.932 3.68283 1.50359 9.34628 +19 6750 927.447 878.842 301.996 3.51313 1.42721 7.97407 +17 6757 1008.91 955.415 313.241 4.01004 1.40969 7.24527 +18 6757 1067.02 1006.55 334.167 4.06376 1.433 6.40969 +17 6758 1034.73 975.258 329.265 3.83988 1.41259 6.51641 +18 6758 1104.45 1035.15 356.114 3.83613 1.42055 5.59303 +18 6783 248.114 219.648 42.2626 -6.82032 -2.46421 13.6151 +19 6783 224.372 195.346 32.4497 -7.12847 -2.59839 13.3531 +18 6792 1130.03 1110.21 27.5287 14.1095 -3.93965 19.5603 +19 6792 1158.51 1138.28 21.8483 14.577 -4.00985 19.1599 +18 6800 1147.69 1117.53 138.167 9.58284 -0.617695 12.8488 +19 6800 1192.48 1160.05 136.226 9.65469 -0.606652 11.9506 +18 6825 191.945 166.744 66.7691 -8.90108 -2.26111 15.3789 +19 6825 168.707 141.886 59.7077 -8.82906 -2.26601 14.4504 +18 6843 229.624 203.358 34.8441 -7.76997 -2.82241 14.756 +19 6843 207.925 179.23 25.3222 -7.51828 -2.76168 13.5066 +18 6845 228.988 203.642 120.621 -8.06543 -1.10698 15.2915 +19 6845 207.26 180.742 116.608 -8.14893 -1.13931 14.6154 +18 6846 333.956 307.924 43.9796 -5.68676 -2.65918 14.8881 +19 6846 318.776 291.053 35.3133 -5.63395 -2.66486 13.9799 +20 6846 300.912 271.504 25.7334 -5.63763 -2.68725 13.1793 +18 6849 321.172 294.835 72.1082 -5.8817 -2.05473 14.7159 +19 6849 304.511 276.957 65.3241 -5.94676 -2.09624 14.066 +20 6849 285.388 255.887 57.5123 -5.90241 -2.10011 13.1375 +21 6849 263.177 231.553 48.3238 -5.88343 -2.11519 12.2556 +22 6849 237.946 204.249 38.0578 -5.92365 -2.1487 11.5016 +23 6849 208.936 171.869 27.4885 -5.80566 -2.10657 10.4562 +18 6853 338.468 312.312 48.9832 -5.56719 -2.54383 14.8176 +19 6853 323.134 295.443 40.8461 -5.55623 -2.56076 13.9968 +18 6854 338.468 312.312 48.9832 -5.56719 -2.54383 14.8176 +19 6854 323.134 295.443 40.8461 -5.55623 -2.56076 13.9968 +18 6864 398.109 376.099 59.6011 -5.16054 -2.76398 17.6094 +19 6864 387.708 365.677 52.6858 -5.40903 -2.92986 17.5921 +18 6865 308.025 281.563 48.0701 -6.12081 -2.53298 14.6464 +19 6865 291.868 263.454 39.5509 -6.00589 -2.52007 13.6405 +18 6867 437.334 412.384 32.0171 -3.70782 -3.03207 15.5339 +19 6867 428.824 402.084 22.974 -3.63053 -3.01073 14.494 +18 6871 513.675 505.171 123.113 -6.05679 -3.14203 45.5778 +19 6871 512.86 504.418 121.887 -6.15319 -3.24313 45.9128 +20 6871 511.986 503.415 120.523 -6.1147 -3.27945 45.2171 +18 6875 421.795 398.636 55.6933 -4.35507 -2.71746 16.7356 +19 6875 413.823 389.345 48.8461 -4.29535 -2.7213 15.8338 +18 6876 477.997 453.532 82.8026 -2.88849 -1.97711 15.8416 +19 6876 471.855 445.918 76.9093 -2.85179 -1.98697 14.9427 +18 6878 463.518 437.647 32.9036 -3.03224 -2.90577 14.9812 +19 6878 456.284 428.771 23.7363 -2.99248 -2.9113 14.087 +20 6878 447.388 418.087 13.1068 -2.97295 -2.92851 13.2273 +18 6881 464.906 440.951 80.2305 -3.24361 -2.07692 16.1792 +19 6881 458.216 432.488 74.5548 -3.1598 -2.05233 15.0645 +20 6881 450.171 422.749 68.0342 -3.12207 -2.05319 14.1334 +21 6881 441.056 411.78 60.1435 -3.09164 -2.06797 13.2385 +22 6881 430.654 399.447 51.7219 -3.07944 -2.08501 12.4196 +23 6881 418.645 385.057 42.7564 -3.05311 -2.08053 11.5389 +24 6881 405.052 369.454 32.832 -3.08585 -2.11283 10.8875 +25 6881 388.82 350.866 20.4292 -3.12398 -2.15717 10.2115 +18 6883 507.834 497.366 123.767 -5.22024 -2.51899 37.027 +19 6883 505.89 496.076 121.857 -5.67413 -2.79121 39.492 +18 6885 441.591 416.442 57.1645 -3.58758 -2.47097 15.4111 +19 6885 433.435 407.878 50.0929 -3.70168 -2.58012 15.1649 +18 6896 607.234 600.012 45.5688 -0.172907 -9.46631 53.6614 +19 6896 608.756 601.417 43.5972 -0.0588108 -9.46072 52.8116 +20 6896 609.856 602.395 40.7039 0.0213691 -9.5133 51.9425 +21 6896 611.035 603.565 37.6573 0.106106 -9.72109 51.8809 +22 6896 612.303 604.804 34.9467 0.196499 -9.8783 51.6837 +23 6896 613.391 605.95 32.6672 0.276614 -10.1202 52.0886 +18 6897 600.217 593.684 47.5741 -0.768198 -10.301 59.3277 +19 6897 601.68 594.868 45.0541 -0.621289 -10.0772 56.8942 +18 6899 590.416 583.366 73.9271 -1.45876 -7.53826 54.9814 +19 6899 591.064 584.191 71.5975 -1.44548 -7.91359 56.391 +20 6899 591.85 584.704 69.0258 -1.33107 -7.80403 54.2329 +18 6903 666.174 645.206 73.6862 1.45033 -2.54041 18.4839 +19 6903 671.378 648.133 69.3105 1.42851 -2.39271 16.6735 +18 6904 666.174 645.206 73.6862 1.45033 -2.54041 18.4839 +19 6904 671.378 648.133 69.3105 1.42851 -2.39271 16.6735 +18 6906 657.983 645.411 119.574 2.06892 -2.2764 30.8277 +19 6906 660.07 647.701 117.939 2.19349 -2.38475 31.3337 +18 6910 697.004 672.402 59.9808 1.9092 -2.46438 15.7535 +19 6910 703.184 677.364 54.1264 1.9477 -2.46992 15.0103 +20 6910 709.916 681.989 46.768 1.93027 -2.42513 13.878 +18 6915 746.911 724.912 114.176 3.35376 -1.43277 17.618 +19 6915 755.941 732.964 111.074 3.42211 -1.44429 16.8682 +20 6915 765.616 740.996 106.842 3.40482 -1.44025 15.7424 +21 6915 776.275 750.215 101.91 3.43643 -1.46233 14.8727 +22 6915 788.367 760.675 96.9246 3.46828 -1.47278 13.9954 +23 6915 801.631 772.178 91.638 3.50283 -1.48114 13.1587 +18 6916 825.76 804.969 43.4646 5.58566 -3.34284 18.6413 +19 6916 839.022 815.912 37.4925 5.33335 -3.14617 16.7705 +18 6920 735.281 712.802 93.2174 3.00415 -1.90293 17.2413 +19 6920 743.821 720.212 88.8728 3.05468 -1.91071 16.4162 +20 6920 752.907 727.869 83.2889 3.07526 -1.92145 15.4792 +18 6923 797.34 774.742 17.8986 4.46367 -3.6834 17.1515 +19 6923 810.371 785.987 10.311 4.42364 -3.58063 15.8946 +18 6929 937.442 912.542 47.9906 7.0733 -2.69364 15.5655 +19 6929 959.613 933.168 41.0222 7.11023 -2.67774 14.6557 +20 6929 984.137 955.596 31.9544 7.0498 -2.65183 13.5798 +18 6933 919.029 895.282 108.791 7.00007 -1.44908 16.3209 +19 6933 939.063 913.867 105.216 7.02441 -1.44191 15.3818 +20 6933 960.755 934.43 99.9813 7.16606 -1.48695 14.7228 +18 6937 942.245 917.185 43.2873 7.13073 -2.77711 15.4653 +19 6937 964.831 938.167 35.6919 7.15699 -2.76315 14.5355 +20 6937 989.632 961.09 25.7552 7.15301 -2.76842 13.5794 +18 6938 959.431 934.448 82.9769 7.52226 -1.93236 15.5131 +19 6938 982.661 956.377 77.8673 7.62482 -1.94118 14.7456 +18 6939 933.09 909.685 97.545 7.42501 -1.72834 16.5592 +19 6939 954.197 929.111 93.4113 7.37952 -1.70106 15.4498 +18 6940 969.117 942.664 108.872 7.30097 -1.29919 14.6511 +19 6940 992.336 966.647 105.776 8.00399 -1.40262 15.0876 +20 6940 1018.29 990.392 100.902 7.86971 -1.38536 13.8925 +21 6940 1048.12 1018.33 95.2068 7.90544 -1.39964 13.0062 +18 6942 913.03 886.479 46.2145 6.13946 -2.56202 14.5973 +19 6942 933.368 907.623 38.6606 6.75597 -2.79982 15.0542 +20 6942 954.851 927.65 29.8056 6.81867 -2.82486 14.2486 +18 6945 935.345 911.122 83.522 7.22428 -1.98093 16 +19 6945 956.511 930.735 78.4445 7.23027 -1.96744 15.0364 +18 6950 946.31 921.494 54.4023 7.28906 -2.56392 15.6179 +19 6950 969.007 942.604 47.6101 7.31275 -2.54801 14.6792 +20 6950 993.833 965.757 38.5725 7.35186 -2.56905 13.8043 +18 6951 938.206 913.559 70.8037 7.16264 -2.22412 15.7255 +19 6951 960.815 933.871 65.4661 7.00255 -2.14086 14.3844 +18 6952 948.637 924.023 99.482 7.39993 -1.60125 15.7466 +19 6952 972.098 945.358 95.5142 7.28266 -1.5536 14.4942 +18 6955 978.816 953.346 37.6979 7.78753 -2.85041 15.2171 +19 6955 1004.36 976.967 30.0494 7.7408 -2.79993 14.147 +20 6955 1032.55 1003.44 18.8448 7.80729 -2.84263 13.3178 +18 6956 985.529 960.895 48.0121 8.19816 -2.72222 15.7334 +19 6956 1010.86 984.349 40.4664 8.13143 -2.68254 14.6204 +18 6958 1103.25 1074.04 122.86 9.07671 -0.919148 13.2657 +19 6958 1142.04 1110.91 119.875 9.18597 -0.913946 12.4474 +18 6969 1137.9 1118.42 32.1704 14.5684 -3.87916 19.8954 +19 6969 1167.53 1146.65 25.616 14.3553 -3.7881 18.5635 +20 6969 1199.59 1177.83 15.8378 14.5623 -3.87522 17.8078 +18 6970 1134.14 1105.11 125.859 9.70384 -0.869315 13.3471 +19 6970 1176.22 1144.79 123.156 9.68575 -0.849467 12.3331 +20 6970 1224.84 1190.84 118.225 9.72066 -0.863063 11.3994 +18 6973 135.77 124.975 161.091 -23.5753 -0.585329 35.903 +19 6973 125.142 114.304 160.159 -24.0084 -0.629169 35.7604 +18 6975 138.947 129.867 200.334 -27.8397 1.62564 42.6836 +19 6975 130.119 121.329 200.057 -29.297 1.66231 44.0907 +18 6976 137.055 126.097 126.344 -23.1617 -2.27989 35.369 +19 6976 126.64 114.411 124.202 -21.2126 -2.13707 31.6941 +18 6978 112.023 100.917 176.249 -24.0652 0.164214 34.8998 +19 6978 100.208 89.5995 175.9 -25.791 0.154255 36.5351 +18 6980 127.666 116.4 140.724 -22.9748 -1.53186 34.4002 +19 6980 116.323 104.944 140.575 -23.2826 -1.52367 34.0593 +20 6980 104.309 92.7278 141.408 -23.4347 -1.45855 33.4666 +21 6980 91.6745 80.177 139.808 -24.195 -1.54388 33.7094 +18 6988 249.254 207.196 228.596 -4.60165 0.711907 9.21514 +19 6988 212.637 166.153 233.905 -4.58663 0.705473 8.33772 +20 6988 167.063 115.017 240.864 -4.56695 0.701917 7.44689 +21 6988 109.167 50.7131 248.917 -4.59828 0.698971 6.63045 +18 6993 239.445 216.691 144.215 -8.73747 -0.676085 17.0337 +19 6993 220.608 196.21 141.736 -8.56304 -0.685094 15.8852 +18 7006 368.835 347.503 233.538 -6.06134 1.52801 18.1681 +19 7006 357.924 335.538 236.132 -6.03813 1.51839 17.3137 +20 7006 345.793 322.167 238.927 -5.99678 1.50218 16.4043 +18 7008 409.587 385.32 141.8 -4.42642 -0.687374 15.9714 +19 7008 399.517 373.758 139.594 -4.38012 -0.69359 15.0466 +20 7008 388.173 360.827 137.995 -4.3486 -0.684723 14.1729 +21 7008 374.901 345.659 134.695 -4.31045 -0.700947 13.254 +22 7008 360.07 328.083 132.146 -4.18963 -0.683597 12.1166 +23 7008 342.164 308.347 128.962 -4.24727 -0.697179 11.4608 +24 7008 321.362 286.419 124.51 -4.43023 -0.743147 11.0916 +18 7011 285.619 248.576 219.751 -4.69728 0.680026 10.4626 +19 7011 256.982 214.996 223.497 -4.51072 0.647898 9.23103 +20 7011 220.568 174.84 227.932 -4.56927 0.646973 8.47552 +18 7014 361.185 339.312 209.057 -6.09938 0.889053 17.719 +19 7014 349.52 326.27 210.617 -6.00792 0.872482 16.6703 +20 7014 336.442 312.306 212.175 -6.07834 0.875114 16.0581 +21 7014 321.669 296.978 213.427 -6.26301 0.882665 15.6969 +22 7014 306.11 278.772 215.14 -5.96242 0.830876 14.1773 +23 7014 287.653 258.996 218.518 -6.03388 0.855932 13.5246 +24 7014 267.158 236.822 221.708 -6.06281 0.865046 12.7761 +25 7014 243.729 212.972 225.301 -6.38899 0.915951 12.6012 +18 7018 507.52 499.788 204.782 -7.08889 2.21807 50.1267 +19 7018 507.053 498.99 204.957 -6.82884 2.13869 48.0678 +20 7018 506.312 497.891 204.968 -6.58564 2.04841 46.0233 +21 7018 505.295 497.102 204.734 -6.83539 2.08998 47.303 +18 7019 531.943 527.924 129.081 -10.3751 -5.85118 96.4491 +19 7019 532.344 528.252 128.04 -10.1347 -5.88194 94.7043 +20 7019 532.464 528.554 126.626 -10.5918 -6.35113 99.1292 +21 7019 532.401 529.123 124.901 -12.6466 -7.85977 118.263 +18 7020 434.865 429.252 169.674 -16.7174 -0.304336 69.0475 +19 7020 434.28 425.471 171.559 -10.6882 -0.0789841 43.9981 +18 7021 574.661 572.184 149.316 -7.56653 -5.1034 156.443 +19 7021 575.765 573.179 149.08 -7.01824 -4.93738 149.846 +20 7021 576.705 574.084 148.352 -6.73161 -5.02042 147.84 +18 7024 581.648 569.896 214.273 -1.27579 1.89318 32.9803 +19 7024 582.028 569.631 215.349 -1.19287 1.84122 31.2629 +20 7024 582.518 569.787 216.062 -1.14089 1.823 30.4426 +21 7024 582.85 569.734 216.378 -1.09391 1.78253 29.5509 +18 7025 677.677 658.646 230.501 1.92257 1.62704 20.3648 +19 7025 682.168 662.045 233.16 1.93816 1.60976 19.2601 +20 7025 686.921 665.914 235.349 1.9781 1.59795 18.4493 +21 7025 691.945 670.038 237.409 2.02008 1.58287 17.692 +18 7027 558.028 551.663 150.794 -4.34873 -1.86162 60.891 +19 7027 558.412 552.077 150.33 -4.33628 -1.90959 61.1726 +20 7027 558.766 552.191 149.621 -4.14966 -1.89809 58.9477 +21 7027 559.018 552.496 148.389 -4.16267 -2.01501 59.4271 +22 7027 558.894 552.22 147.75 -4.07744 -2.02028 58.0679 +23 7027 559.583 552.235 147.613 -3.65386 -1.84542 52.7524 +24 7027 560.028 552.173 147.573 -3.38706 -1.72875 49.3401 +18 7029 770.663 756.914 173.834 6.29413 0.0382737 28.1896 +19 7029 777.107 763.1 173.997 6.42561 0.0438519 27.6717 +20 7029 784.161 769.487 173.403 6.39113 0.0201085 26.4112 +21 7029 791.563 776.413 172.636 6.45293 -0.00772477 25.582 +18 7030 716.716 696.1 180.167 2.79198 0.190546 18.7997 +19 7030 723.668 701.85 180.216 2.80927 0.181241 17.7637 +20 7030 730.995 707.914 180.436 2.82604 0.176444 16.7916 +21 7030 739.031 714.784 179.553 2.86819 0.148409 15.9843 +22 7030 747.961 722.274 179.415 2.8941 0.137204 15.0879 +23 7030 757.968 730.567 179.991 2.90932 0.139902 14.1447 +18 7032 769.745 740.269 213.087 2.91914 0.733185 13.149 +19 7032 783.079 751.481 216.705 2.94977 0.745445 12.2659 +18 7034 705.1 680.555 246.367 2.09086 1.60879 15.7905 +19 7034 712.295 686.265 250.757 2.12007 1.60762 14.8898 +20 7034 720.272 692.351 254.887 2.12988 1.57815 13.8809 +21 7034 729.012 699.57 259.387 2.17929 1.5787 13.1636 +22 7034 739.058 707.481 265.054 2.20291 1.56842 12.2741 +18 7037 705.312 680.933 239.83 2.10972 1.47569 15.8977 +19 7037 712.534 686.994 243.73 2.16571 1.49062 15.175 +20 7037 720.233 692.8 246.923 2.16704 1.45032 14.1281 +21 7037 728.985 699.931 250.554 2.20798 1.43655 13.34 +18 7042 780.503 775.214 148.377 17.3628 -2.48614 73.2869 +19 7042 782.599 779.367 148.395 28.7535 -4.06428 119.895 +20 7042 784.868 783.22 147.943 57.1336 -8.11845 235.151 +21 7042 789.493 785.562 146.572 24.5815 -3.5905 98.5722 +22 7042 793.536 785.53 145.79 12.343 -1.81573 48.408 +23 7042 796.722 790.77 145.308 16.8918 -2.4861 65.1204 +18 7045 712.801 692.761 144.229 2.76732 -0.767278 19.3403 +19 7045 719.746 698.48 142.792 2.78316 -0.759325 18.2251 +20 7045 727.635 703.98 140.13 2.6812 -0.743089 16.3843 +18 7048 863.516 851.758 171.894 11.6014 -0.0438371 32.9616 +19 7048 872.251 860.296 172.025 11.8033 -0.0372709 32.4202 +18 7049 960.073 928.989 192.026 6.05713 0.331303 12.4687 +19 7049 989.185 955.878 193.979 6.12245 0.340691 11.6367 +18 7051 939.13 914.771 126.641 7.26741 -1.01906 15.9107 +19 7051 960.87 935.102 124.305 7.32324 -1.01202 15.0408 +20 7051 984.802 957.285 120.433 7.32512 -1.02331 14.0852 +21 7051 1011.94 982.41 115.987 7.31966 -1.03447 13.1255 +18 7056 917.948 893.872 185.642 6.8805 0.285312 16.0983 +19 7056 939.973 912.041 186.899 6.35409 0.270099 13.8757 +18 7057 934.201 910.079 153.308 7.22911 -0.435255 16.0672 +19 7057 954.986 929.737 152.089 7.34856 -0.441759 15.3499 +20 7057 978.871 951.684 150.531 7.29661 -0.441051 14.2556 +21 7057 1005.5 976.31 148.482 7.28577 -0.448466 13.2771 +22 7057 1036.07 1004.23 146.694 7.19568 -0.441343 12.173 +23 7057 1070.69 1037.31 144.607 7.4213 -0.454593 11.6122 +18 7058 923.978 899.647 175.723 6.94135 0.0633274 15.9292 +19 7058 943.772 918.674 175.977 7.1529 0.0668356 15.4425 +20 7058 966.29 940.183 175.321 7.33955 0.0507601 14.8453 +21 7058 991.553 963.495 174.834 7.31305 0.0379133 13.8134 +22 7058 1020.01 989.125 175.19 7.13757 0.0406198 12.5471 +23 7058 1053.54 1019.96 175.26 7.10159 0.0384814 11.5413 +24 7058 1091.77 1055.98 175.597 7.23674 0.0411716 10.8285 +18 7063 1106.2 1058.87 200.38 5.63698 0.31243 8.18962 +19 7063 1168.4 1116.92 205.772 5.83068 0.343455 7.52818 +18 7064 1106.73 1077.38 136.331 9.09934 -0.66845 13.2059 +19 7064 1146.54 1114.99 134.286 9.14206 -0.656614 12.2841 +20 7064 1191.79 1157.94 130.118 9.23781 -0.678053 11.448 +18 7068 1095.91 1065.96 154.964 8.72313 -0.320873 12.9414 +19 7068 1135.12 1103.12 154.329 8.82269 -0.31098 12.1126 +20 7068 1181.37 1145.95 151.667 8.67289 -0.321351 10.9439 +18 7072 1163.82 1134.01 131.995 9.98836 -0.736313 13.0028 +19 7072 1209.07 1177.08 129.595 10.0681 -0.726483 12.1174 +18 7073 1119.01 1089.41 139.628 9.24517 -0.602966 13.094 +19 7073 1160 1128.26 137.747 9.31633 -0.594192 12.2122 +20 7073 1207.34 1173.18 133.803 9.40107 -0.614141 11.3474 +18 7075 1161.18 1131.8 145.227 10.0868 -0.505179 13.194 +19 7075 1205.78 1174.02 143.957 10.0849 -0.488782 12.2047 +18 7090 169.796 117.509 252.928 -4.51776 0.822612 7.41247 +19 7090 111.581 52.1476 263.355 -4.50065 0.817934 6.52114 +18 7094 389.932 352.596 292.861 -3.15976 1.72654 10.3807 +19 7094 371.321 330.682 303.267 -3.14896 1.72376 9.53704 +18 7097 365.85 324.306 306.646 -3.15112 1.7299 9.32935 +19 7097 341.544 296.068 320.319 -3.16574 1.74182 8.52265 +18 7100 279.748 239.928 305.16 -4.44893 1.78471 9.73306 +19 7100 248.075 204.311 318.095 -4.43681 1.78267 8.85605 +18 7102 546.474 517.311 267.558 -1.16198 1.74436 13.2901 +19 7102 543.268 512.526 274.341 -1.15828 1.77325 12.6072 +20 7102 539.485 506.046 281.896 -1.12562 1.75158 11.5903 +21 7102 535.345 499.387 290.154 -1.10865 1.75227 10.7787 +18 7103 419.346 382.719 295.269 -2.78958 1.79528 10.5817 +19 7103 403.96 362.625 306.285 -2.67178 1.73395 9.37644 +18 7109 690.228 661.236 265.349 1.4946 1.7137 13.3683 +19 7109 695.98 665.388 272.165 1.51745 1.7438 12.6694 +18 7114 737.276 704.575 269.959 2.09792 1.59508 11.8523 +19 7114 749.164 713.976 277.8 2.13105 1.60198 11.0141 +20 7114 763.168 724.525 286.313 2.13522 1.57712 10.0296 +21 7114 779.151 737.182 296.122 2.17054 1.57766 9.23469 +18 7117 755.265 714.88 294.237 1.938 1.61449 9.59704 +19 7117 771.12 727.156 306.26 1.97391 1.62992 8.81555 +18 7118 789.006 739.271 321.374 1.93806 1.60405 7.79277 +19 7118 814.094 757.919 340.505 1.95581 1.60312 6.89952 +18 7121 882.075 846.453 268.765 4.10941 1.44629 10.8805 +19 7121 908.039 869.877 277.787 4.20129 1.477 10.1561 +18 7122 899.77 860.147 280.22 3.93419 1.45549 9.78139 +19 7122 930.091 886.857 291.162 3.98235 1.46988 8.96453 +20 7122 967.943 919.249 303.561 3.95342 1.44187 7.95948 +21 7122 1014.07 959.811 319.051 4.00489 1.44746 7.14373 +22 7122 1073.23 1011.16 339.434 4.01251 1.44155 6.24403 +18 7123 945.045 900.605 291.921 4.05508 1.43919 8.72138 +19 7123 985.689 935.881 305.877 4.05635 1.43458 7.78139 +18 7124 963.156 913.511 309.257 3.82587 1.47586 7.80694 +19 7124 1010.75 954.616 327.441 3.83877 1.47915 6.90393 +18 7126 936.034 886.837 306.197 3.56455 1.45587 7.87796 +19 7126 978.083 922.743 323.986 3.577 1.46693 7.00346 +18 7128 1013.41 973.301 274.219 5.40799 1.35737 9.66207 +19 7128 1056.52 1012.56 285.246 5.46142 1.37332 8.81646 +18 7131 1041.62 998.729 280.874 5.41107 1.35283 9.03647 +19 7131 1090.94 1043.27 293.528 5.42469 1.35988 8.13102 +18 7139 1052.86 1006.27 276.506 5.11158 1.19519 8.31991 +19 7139 1103.79 1056.29 288.254 5.58924 1.30506 8.15988 +18 7140 1014.89 972.085 283.751 5.0867 1.39171 9.05501 +19 7140 1061.74 1014.14 296.464 5.10272 1.39489 8.14225 +20 7140 1120.02 1066.01 311.082 5.07732 1.3749 7.17685 +19 7153 1031.24 1004.08 48.4559 8.33941 -2.46015 14.2694 +20 7153 1061.17 1032.76 38.4323 8.53735 -2.54114 13.6401 +19 7155 1195.06 1173.4 19.2287 14.5226 -3.81049 17.8969 +20 7155 1231.61 1207.84 9.01888 14.0572 -3.70241 16.3056 +19 7159 344.971 322.392 232.229 -6.2946 1.41255 17.1655 +20 7159 332.066 308.214 234.828 -6.24924 1.39568 16.2493 +21 7159 317.74 292.489 237.203 -6.20785 1.3689 15.3492 +19 7162 985.054 957.555 149.175 7.33484 -0.462545 14.0944 +20 7162 1010.41 983.19 146.858 7.91078 -0.51303 14.2396 +21 7162 1039.46 1010.1 144.406 7.86553 -0.520487 13.2015 +22 7162 1072.48 1040.96 142.135 7.88967 -0.52356 12.2974 +19 7164 415.315 379.492 291.074 -2.91261 1.77266 10.8192 +20 7164 399.62 360.771 300.953 -2.90278 1.7712 9.97653 +21 7164 380.988 338.199 312.115 -2.86933 1.7482 9.05771 +19 7166 873.258 834.917 280.216 3.69437 1.50412 10.1086 +20 7166 900.578 858.056 290.079 3.67628 1.48084 9.11482 +19 7167 937.363 894.137 286.367 4.07348 1.41057 8.96624 +20 7167 974.447 926.778 297.589 4.11172 1.40557 8.13061 +21 7167 1020.17 967.653 311.163 4.19999 1.41473 7.38041 +19 7180 106.144 94.9636 121.758 -24.1859 -2.45485 34.6653 +20 7180 94.0145 82.9294 119.584 -24.9818 -2.58134 34.9637 +19 7183 273.322 245.336 41.8409 -6.45359 -2.51461 13.8489 +20 7183 252.272 222.877 31.8816 -6.5289 -2.57606 13.185 +21 7183 227.928 196.276 19.9747 -6.47652 -2.59446 12.2449 +19 7184 241.993 213.954 60.0703 -7.04134 -2.16056 13.8223 +20 7184 218.234 188.495 52.0166 -7.06818 -2.18259 13.0325 +19 7186 230.602 203.617 106.667 -7.5434 -1.31749 14.3627 +20 7186 207.058 178.866 101.839 -7.6689 -1.35305 13.7476 +21 7186 180.761 150.426 95.8826 -7.59306 -1.36299 12.7768 +22 7186 150.469 117.693 89.5618 -7.52385 -1.36504 11.825 +23 7186 115.128 80.2422 83.4225 -7.61299 -1.37702 11.1099 +24 7186 74.9029 36.2825 76.3923 -7.43626 -1.34164 10.0355 +19 7197 231.902 204.068 72.0599 -7.28807 -1.94514 13.9243 +20 7197 207.698 178.289 64.9022 -7.34001 -1.97174 13.1789 +19 7199 218.998 192.034 88.9964 -7.78046 -1.67055 14.3739 +20 7199 194.741 165.934 83.3459 -7.73495 -1.66902 13.4542 +21 7199 167.361 136.857 76.1065 -7.78686 -1.70367 12.7059 +22 7199 136.08 101.828 68.3268 -7.42546 -1.63927 11.3157 +19 7206 243.736 216.777 67.5829 -7.28878 -2.09746 14.3762 +20 7206 221.223 191.531 59.8616 -7.02526 -2.04411 13.0531 +19 7207 202.493 175.034 39.6107 -7.96279 -2.60643 14.1143 +20 7207 176.676 144.416 30.4536 -7.20797 -2.37112 12.0144 +19 7213 395.705 370.858 113.633 -4.62308 -1.28022 15.5981 +20 7213 383.977 357.444 109.647 -4.56688 -1.27962 14.6074 +21 7213 370.606 343.185 104.464 -4.68086 -1.3397 14.1342 +22 7213 355.844 325.159 99.0966 -4.44136 -1.29114 12.6307 +23 7213 338.768 305.805 94.1687 -4.41268 -1.28222 11.7578 +24 7213 318.386 283.197 88.3486 -4.4447 -1.28996 11.0141 +25 7213 295.345 257.159 80.9537 -4.41991 -1.29272 10.1495 +26 7213 268.316 226.579 71.1533 -4.39176 -1.30888 9.28611 +19 7221 377.029 351.839 106.723 -4.95838 -1.41016 15.3858 +20 7221 364.14 337.011 102.26 -4.85939 -1.39778 14.2867 +19 7229 478.027 451.566 63.5405 -2.67008 -2.21903 14.647 +20 7229 470.949 442.778 56.0103 -2.6429 -2.22788 13.7577 +21 7229 463.107 433.169 47.0767 -2.62765 -2.2567 12.9458 +19 7231 548.751 541.775 109.876 -4.68216 -4.84924 55.5572 +20 7231 548.896 541.661 108.274 -4.50325 -4.79407 53.5627 +21 7231 549.166 541.819 106.325 -4.41511 -4.86366 52.7489 +19 7234 429.896 404.764 29.928 -3.83982 -3.05467 15.421 +20 7234 420.246 393.92 19.8848 -3.86275 -3.12118 14.7222 +19 7239 554.455 549.579 61.9117 -6.0707 -12.2222 79.4895 +20 7239 554.331 549.076 59.4894 -5.64524 -11.5878 73.7534 +21 7239 555.975 548.754 57.6703 -3.98592 -8.56805 53.6723 +22 7239 556.133 548.744 55.0716 -3.88402 -8.56255 52.4544 +23 7239 556.302 549.091 53.4393 -3.96739 -8.89571 53.7504 +24 7239 556.757 549.382 51.9826 -3.84592 -8.80384 52.5542 +25 7239 556.846 549.414 49.8591 -3.80971 -8.88913 52.1472 +19 7242 422.811 397.299 109.997 -3.93188 -1.32341 15.1916 +20 7242 412.627 385.414 106.386 -3.8872 -1.312 14.2423 +21 7242 400.965 372.324 101.461 -3.91207 -1.33894 13.5321 +19 7253 685.471 663.897 96.0908 1.89004 -1.91123 17.9646 +20 7253 690.745 667.148 91.3236 1.84807 -1.85593 16.4248 +21 7253 696.925 672.435 85.5701 1.91625 -1.91447 15.8261 +19 7254 566.628 559.869 99.3583 -3.41197 -5.84108 57.3443 +20 7254 567.053 560.2 97.646 -3.33192 -5.89529 56.5587 +19 7256 676.32 663.555 125.579 2.80915 -1.98923 30.3606 +20 7256 679.544 666.8 123.328 2.9498 -2.08747 30.4121 +21 7256 682.612 671.006 120.882 3.38106 -2.40539 33.3944 +22 7256 686.002 673.573 118.887 3.30357 -2.33222 31.182 +23 7256 689.223 676.633 117.283 3.39868 -2.37081 30.7827 +24 7256 692.704 679.438 115.998 3.36639 -2.302 29.2138 +25 7256 695.78 682.128 113.624 3.39243 -2.33044 28.3895 +19 7260 569.557 562.882 93.0881 -3.21885 -6.41858 58.0605 +20 7260 570.106 563.35 91.324 -3.13669 -6.48195 57.365 +21 7260 570.69 563.68 89.1834 -2.97822 -6.41097 55.2853 +22 7260 571.144 563.958 87.3544 -2.87122 -6.39043 53.9293 +23 7260 571.687 564.594 86.1915 -2.86803 -6.56285 54.6412 +24 7260 572.202 565.083 84.9815 -2.8188 -6.63035 54.443 +25 7260 572.623 565.643 83.4267 -2.84246 -6.88196 55.5266 +26 7260 572.82 565.634 80.4724 -2.74635 -6.90569 53.9362 +19 7266 819.81 795.905 18.822 4.72432 -3.46108 16.2129 +20 7266 833.116 807.654 8.96318 4.71624 -3.45751 15.2219 +19 7270 701.29 677.785 87.0446 2.09627 -1.96095 16.4889 +20 7270 707.708 682.994 81.2803 2.1332 -1.9903 15.6822 +19 7272 700.365 677.267 108.775 2.11178 -1.49022 16.7802 +20 7272 706.662 682.053 104.382 2.11954 -1.49459 15.7496 +21 7272 713.884 687.555 99.3489 2.12836 -1.4996 14.7203 +22 7272 721.998 694.318 94.3371 2.18198 -1.52369 14.0021 +23 7272 730.868 701.467 88.9829 2.21624 -1.53227 13.182 +24 7272 740.76 709.321 83.1721 2.24164 -1.53227 12.3279 +25 7272 752.203 718.117 76.0522 2.24788 -1.52548 11.3705 +26 7272 764.859 727.847 66.4678 2.25385 -1.54398 10.4716 +19 7279 700.509 677.527 94.6244 2.12576 -1.82845 16.8644 +20 7279 707.572 682.505 88.9186 2.10031 -1.79866 15.4619 +19 7280 705.175 681.866 104.058 2.20346 -1.5854 16.6277 +20 7280 711.892 687.041 99.4343 2.21193 -1.58697 15.5961 +21 7280 719.404 693.177 94.094 2.24972 -1.61308 14.7778 +19 7281 705.175 681.866 104.058 2.20346 -1.5854 16.6277 +20 7281 711.892 687.041 99.4343 2.21193 -1.58697 15.5961 +19 7282 724.726 702.153 58.7723 2.74051 -2.71468 17.1697 +20 7282 732.693 708.668 51.2971 2.75294 -2.71767 16.1316 +19 7283 807.357 802.847 120.789 23.558 -6.20099 85.9365 +20 7283 811.034 806.041 119.512 21.6725 -5.73798 77.6153 +21 7283 814.415 809.781 117.98 23.7429 -6.35996 83.6266 +22 7283 818.062 813.214 116.707 23.1019 -6.22103 79.9459 +19 7285 729.603 705.587 78.174 2.68503 -2.11772 16.1388 +20 7285 737.874 712.54 72.332 2.72059 -2.13131 15.2984 +19 7287 716.569 692.235 40.587 2.3621 -2.91961 15.927 +20 7287 724.83 698.233 31.9687 2.32805 -2.84538 14.5725 +19 7288 716.569 692.235 40.587 2.3621 -2.91961 15.927 +20 7288 724.83 698.233 31.9687 2.32805 -2.84538 14.5725 +21 7288 732.398 705.685 21.5034 2.47003 -3.04334 14.5086 +19 7291 752.226 728.118 68.5242 3.17879 -2.3246 16.0768 +20 7291 762.256 735.903 61.0335 3.11248 -2.27929 14.7075 +19 7294 962.211 936.75 17.6346 7.43986 -3.27465 15.2222 +20 7294 984.526 959.609 7.20031 8.0834 -3.5711 15.5547 +19 7296 844.872 818.344 23.918 4.76469 -3.01571 14.6099 +20 7296 859.994 834.713 14.4493 5.32104 -3.36566 15.3307 +19 7297 948.611 922.021 36.3626 6.84937 -2.75734 14.5762 +20 7297 972.298 943.96 26.5077 6.87569 -2.77398 13.6767 +19 7298 926.251 900.948 47.8095 6.72308 -2.65458 15.3176 +20 7298 946.884 920.444 39.1321 6.8532 -2.71674 14.659 +21 7298 970.076 942.235 29.3506 6.95579 -2.76875 13.9213 +22 7298 996.69 966.483 18.9421 6.88408 -2.73691 12.8306 +19 7300 959.407 933.203 56.5697 7.1713 -2.38363 14.7903 +20 7300 983.564 955.536 48.1719 7.16774 -2.38951 13.8281 +21 7300 1011.12 981.344 38.7902 7.24348 -2.41827 13.0152 +19 7306 950.863 925.431 122.592 7.2087 -1.06159 15.2397 +20 7306 974.116 946.614 117.978 7.12021 -1.0718 14.0925 +19 7309 964.831 938.167 35.6919 7.15699 -2.76315 14.5355 +20 7309 989.632 961.09 25.7552 7.15301 -2.76842 13.5794 +19 7311 965.234 939.135 60.9877 7.32042 -2.30241 14.8505 +20 7311 990.061 961.995 52.5535 7.28247 -2.30245 13.8096 +19 7313 957.919 932.123 116.687 7.25384 -1.16957 15.0245 +20 7313 981.634 954.159 112.15 7.27434 -1.18682 14.1066 +21 7313 1008.37 979.317 107.257 7.37382 -1.21286 13.3409 +19 7315 954.018 927.938 64.0614 7.09472 -2.24077 14.8613 +20 7315 977.869 949.979 56.2243 7.09347 -2.24623 13.8965 +19 7318 1022.31 996.091 41.4733 8.45526 -2.69134 14.7807 +20 7318 1050.82 1022.56 31.9861 8.38766 -2.67768 13.7153 +19 7321 981.921 955.349 66.9613 7.52728 -2.14061 14.5858 +20 7321 1007.81 979.579 58.9885 7.57841 -2.16679 13.7304 +21 7321 1037.12 1007.28 50.3751 7.69764 -2.20506 12.9903 +22 7321 1069.9 1038.32 40.7492 7.8303 -2.24707 12.2732 +19 7330 975.003 949.4 124.678 7.66705 -1.01073 15.1379 +20 7330 999.876 972.707 120.681 7.71694 -1.03152 14.2655 +21 7330 1028.3 998.988 116.249 7.67362 -1.03731 13.2225 +19 7331 1106.1 1077.58 71.6067 9.35351 -1.90724 13.5919 +20 7331 1142.83 1113.33 63.9065 9.71074 -1.9839 13.139 +19 7332 978.39 952.716 103.901 7.71675 -1.44265 15.0962 +20 7332 1004.29 976.14 99.051 7.53222 -1.4083 13.7683 +19 7336 1158.28 1130.23 88.8856 10.5071 -1.60785 13.8162 +20 7336 1201.17 1170.42 81.77 10.334 -1.59102 12.6035 +19 7337 1158.28 1130.23 88.8856 10.5071 -1.60785 13.8162 +20 7337 1201.17 1170.42 81.77 10.334 -1.59102 12.6035 +19 7338 1151.76 1123.12 95.8508 10.167 -1.44391 13.5298 +20 7338 1194.17 1163.32 88.8773 10.1793 -1.46221 12.5634 +19 7339 1151.76 1123.12 95.8508 10.167 -1.44391 13.5298 +20 7339 1194.17 1163.32 88.8773 10.1793 -1.46221 12.5634 +19 7340 1151.76 1123.12 95.8508 10.167 -1.44391 13.5298 +20 7340 1194.17 1163.32 88.8773 10.1793 -1.46221 12.5634 +19 7344 1195.06 1173.4 19.2287 14.5226 -3.81049 17.8969 +20 7344 1231.61 1207.84 9.01888 14.0572 -3.70241 16.3056 +19 7348 1113.43 1085.08 81.234 9.54621 -1.7358 13.67 +20 7348 1152.08 1121.51 73.5166 9.53475 -1.74585 12.681 +19 7349 112.129 101.028 126.823 -24.0699 -2.22737 34.9141 +20 7349 99.8934 86.8388 125.243 -20.971 -1.95902 29.6888 +19 7350 112.129 101.028 126.823 -24.0699 -2.22737 34.9141 +20 7350 99.8934 86.8388 125.243 -20.971 -1.95902 29.6888 +19 7352 89.7224 78.1184 176.794 -24.0632 0.182392 33.3999 +20 7352 76.3186 64.4969 176.64 -24.2292 0.172026 32.785 +21 7352 62.6386 50.5449 175.62 -24.292 0.122847 32.0477 +19 7357 133.506 124.195 149.533 -27.4652 -1.34546 41.628 +20 7357 124.027 114.725 148.476 -28.0362 -1.40765 41.6639 +19 7358 129.426 119.29 171.546 -25.4448 -0.0693198 38.238 +20 7358 119.212 110.048 171.31 -28.7397 -0.0904703 42.29 +19 7360 134.117 123.029 160.351 -23.0313 -0.605693 34.9527 +20 7360 122.77 111.607 159.495 -23.4247 -0.642861 34.721 +21 7360 110.882 99.3852 157.783 -23.2996 -0.704172 33.7122 +22 7360 98.374 86.5797 156.719 -23.281 -0.734839 32.8612 +19 7363 131.545 121.154 135.266 -24.7083 -1.94292 37.2959 +20 7363 120.992 109.53 133.639 -22.8959 -1.83776 33.8137 +21 7363 109.083 97.7407 131.354 -23.7007 -1.9653 34.1693 +19 7367 237.337 211.182 127.849 -7.6442 -0.924252 14.818 +20 7367 215.189 186.725 124.7 -7.44211 -0.908714 13.6161 +19 7371 244.775 201.062 245.425 -4.48254 0.891766 8.86639 +20 7371 206.084 157.387 253.162 -4.45058 0.885845 7.95899 +21 7371 157.39 103.163 262.363 -4.47902 0.886644 7.14728 +19 7372 180.072 129.23 248.584 -4.53756 0.800089 7.6231 +20 7372 125.03 67.6987 258.453 -4.53967 0.801994 6.76025 +19 7375 182.915 134.326 233.525 -4.71648 0.670712 7.97649 +20 7375 130.987 75.778 240.787 -4.65626 0.66095 7.02018 +19 7382 147.232 136.017 163.102 -22.1453 -0.467122 34.5613 +20 7382 136.371 126.04 162.431 -24.6034 -0.541942 37.5164 +19 7386 387.974 362.964 133.997 -4.75912 -0.834549 15.4969 +20 7386 375.87 347.217 131.115 -4.38097 -0.782476 13.5267 +19 7388 368.96 346.722 234.676 -5.8115 1.49327 17.4282 +20 7388 357.534 333.922 237.573 -5.73331 1.4723 16.4142 +19 7389 368.96 346.722 234.676 -5.8115 1.49327 17.4282 +20 7389 357.534 333.922 237.573 -5.73331 1.4723 16.4142 +19 7390 368.96 346.722 234.676 -5.8115 1.49327 17.4282 +20 7390 357.534 333.922 237.573 -5.73331 1.4723 16.4142 +19 7391 381.933 357.27 245.635 -4.95761 1.58514 15.7148 +20 7391 369.261 344.409 249.523 -5.19381 1.65713 15.5953 +21 7391 355.966 330.721 252.823 -5.39569 1.70149 15.3521 +22 7391 342.025 315.564 256.831 -5.43081 1.70469 14.6469 +23 7391 326.623 298.638 262.271 -5.43075 1.71629 13.8494 +24 7391 309.295 278.694 268.483 -5.27074 1.67864 12.6656 +25 7391 289.146 254.92 274.866 -5.02869 1.60102 11.3241 +19 7392 364.425 341.058 248.974 -5.63503 1.7498 16.5864 +20 7392 351.95 327.176 252.785 -5.58544 1.73305 15.6443 +21 7392 337.689 311.801 256.546 -5.64103 1.73654 14.9712 +22 7392 321.982 293.356 261.381 -5.3963 1.66118 13.5394 +23 7392 303.299 272.911 267.783 -5.41356 1.67799 12.7541 +19 7394 279.205 240.406 234.893 -4.57366 0.858909 9.98948 +20 7394 248.549 205.759 240.525 -4.53183 0.849486 9.05758 +21 7394 211.252 164.327 246.494 -4.55939 0.842952 8.25939 +19 7395 369.338 347.707 241.927 -5.96551 1.71533 17.9182 +20 7395 358.459 335.787 245.044 -5.94921 1.71037 17.0951 +21 7395 346.234 322.52 247.943 -5.96453 1.70083 16.3434 +22 7395 332.673 307.261 251.792 -5.85268 1.66856 15.2515 +23 7395 317.489 290.647 257.033 -5.84479 1.68456 14.4391 +24 7395 300.263 271.463 262.785 -5.76862 1.67729 13.4573 +25 7395 280.576 250.023 268.518 -5.78388 1.68188 12.6854 +26 7395 257.932 225.247 273.951 -5.77885 1.66148 11.8582 +19 7396 370.943 345.606 127.768 -5.05872 -0.955825 15.2968 +20 7396 357.709 330.747 124.398 -5.01757 -0.965372 14.375 +21 7396 342.577 314.18 120.409 -5.05008 -0.992019 13.6482 +22 7396 325.575 294.752 116.189 -4.94901 -0.987498 12.5743 +23 7396 305.637 272.346 112.276 -4.90376 -0.977427 11.6419 +24 7396 282.865 247.831 107.24 -5.0089 -1.00599 11.0627 +19 7397 355.997 333.129 224.604 -5.95607 1.21558 16.9486 +20 7397 343.534 319.938 226.847 -6.0561 1.22916 16.4259 +21 7397 329.896 304.36 228.847 -5.88282 1.17783 15.1778 +19 7398 355.997 333.129 224.604 -5.95607 1.21558 16.9486 +20 7398 343.534 319.938 226.847 -6.0561 1.22916 16.4259 +21 7398 329.896 304.36 228.847 -5.88282 1.17783 15.1778 +22 7398 314.178 287.812 231.728 -6.0179 1.19945 14.7001 +23 7398 296.67 267.988 235.986 -5.85986 1.18235 13.5131 +24 7398 276.7 246.176 240.54 -5.85744 1.1911 12.6972 +19 7404 551.258 532.894 234.958 -1.70528 1.8165 21.1046 +20 7404 550.057 530.329 236.965 -1.62018 1.74565 19.6465 +21 7404 548.365 528.449 239.202 -1.65049 1.78948 19.4607 +19 7407 481.105 472.434 195.838 -7.95761 1.42381 44.6985 +20 7407 479.786 471.334 195.699 -8.24813 1.45201 45.8594 +21 7407 478.539 469.002 195.353 -7.37932 1.26716 40.6384 +19 7408 432.445 423.19 212.283 -10.2802 2.28853 41.8799 +20 7408 431.563 420.281 212.245 -8.47509 1.87556 34.3552 +19 7409 432.445 423.19 212.283 -10.2802 2.28853 41.8799 +20 7409 431.563 420.281 212.245 -8.47509 1.87556 34.3552 +19 7410 685.706 679.871 152.319 7.00986 -1.89036 66.4228 +20 7410 687.892 681.827 151.454 6.93783 -1.89542 63.906 +21 7410 690.455 683.973 149.88 6.70371 -1.90386 59.793 +22 7410 692.891 686.408 148.995 6.90431 -1.97681 59.7818 +19 7413 583.367 566.93 224.891 -0.855911 1.70049 23.5787 +20 7413 583.425 566.523 226.232 -0.830556 1.69637 22.9308 +19 7417 694.149 673.161 232.95 2.16497 1.53808 18.4669 +20 7417 699.169 677.378 234.708 2.20891 1.52472 17.7861 +19 7419 569.982 551.971 233.975 -1.18036 1.82288 21.5191 +20 7419 569.572 550.304 235.987 -1.11478 1.76004 20.1152 +21 7419 568.765 549.828 237.401 -1.15717 1.83092 20.467 +22 7419 569.458 549.024 242.214 -1.05417 1.8233 18.9675 +23 7419 569.408 547.549 248.47 -0.98662 1.85809 17.7302 +24 7419 568.423 545.101 256.512 -0.947453 1.92681 16.6185 +19 7422 586.584 582.209 153.821 -2.82052 -2.3365 88.5785 +20 7422 587.143 582.242 152.779 -2.45698 -2.20036 79.0846 +19 7427 805.075 800.2 137.374 21.5399 -3.9088 79.4915 +20 7427 808.473 803.636 136.276 22.0904 -4.0622 80.1305 +21 7427 811.904 807.215 134.83 23.1772 -4.35537 82.647 +22 7427 815.486 810.774 134.046 23.4726 -4.42351 82.2445 +23 7427 819.259 814.3 133.496 22.7152 -4.26334 78.1589 +24 7427 823.155 818.183 133.274 23.0742 -4.27575 77.9459 +25 7427 826.523 821.721 132.309 24.2668 -4.53483 80.7018 +19 7430 770.165 756.361 173.415 6.24958 0.0218481 28.0769 +20 7430 776.971 762.563 172.829 6.24125 -0.000916859 26.8996 +21 7430 784.121 769.221 172.057 6.29303 -0.0287413 26.0118 +22 7430 791.628 776.065 171.695 6.284 -0.0400099 24.9035 +23 7430 799.654 783.654 171.318 6.38203 -0.0515821 24.2241 +24 7430 808.402 791.608 171.562 6.36003 -0.0413397 23.0786 +25 7430 817.053 799.883 171.365 6.49112 -0.0465775 22.5721 +19 7431 813.607 800.216 179.478 8.18499 0.265723 28.9432 +20 7431 821.516 807.723 179.407 8.25449 0.255203 28.0998 +21 7431 830.145 815.493 179.017 8.08704 0.225933 26.4528 +19 7434 780.592 748.62 247.658 2.87352 1.25679 12.1226 +20 7434 795.727 760.131 253.725 2.80925 1.22034 10.8879 +19 7437 741.851 719.023 133.656 3.11283 -0.922341 16.9778 +20 7437 750.883 726.473 130.871 3.10987 -0.923861 15.8777 +19 7439 784.907 771.12 168.66 6.83175 -0.163396 28.112 +20 7439 791.427 777.435 168.128 6.9817 -0.181417 27.699 +21 7439 798.915 784.804 167.366 7.20763 -0.208877 27.4645 +22 7439 805.416 792.008 166.45 7.84667 -0.256572 28.9072 +19 7441 933.709 909.233 132.429 7.11376 -0.88716 15.8348 +20 7441 955.219 928.9 129.04 7.05473 -0.894226 14.7262 +21 7441 979.37 951.299 125.649 7.07653 -0.903292 13.807 +22 7441 1006.96 976.654 121.918 7.04296 -0.902709 12.7874 +23 7441 1037.95 1005.55 117.689 7.10333 -0.91473 11.9643 +24 7441 1073.64 1038.9 113.274 7.17591 -0.921275 11.157 +19 7444 938.295 913.67 140.45 7.17065 -0.706829 15.7387 +20 7444 959.921 933.414 137.631 7.0999 -0.713777 14.6216 +21 7444 984.326 956.214 134.53 7.16107 -0.732298 13.7872 +22 7444 1011.76 981.739 131.694 7.19703 -0.736533 12.9114 +23 7444 1043.2 1010.84 128.343 7.19966 -0.739018 11.9796 +19 7448 946.078 920.815 136.94 7.15504 -0.7636 15.3413 +20 7448 968.756 941.794 133.837 7.15596 -0.777304 14.3746 +19 7449 959.803 934.114 142.371 7.32361 -0.637399 15.0874 +20 7449 983.574 956.393 139.5 7.39109 -0.659116 14.2587 +21 7449 1010.38 981.14 136.511 7.36323 -0.667631 13.2549 +22 7449 1041.47 1009.71 133.638 7.30368 -0.663143 12.2013 +19 7450 878.973 873.663 145.582 27.255 -2.75897 72.9938 +20 7450 884.146 878.526 144.373 26.2443 -2.72215 68.9627 +19 7453 915.137 890.454 128.385 6.64989 -0.967723 15.7019 +20 7453 935.514 909.149 124.886 6.6407 -0.977264 14.6999 +19 7454 915.137 890.454 128.385 6.64989 -0.967723 15.7019 +20 7454 935.514 909.149 124.886 6.6407 -0.977264 14.6999 +21 7454 958.333 930.386 121.133 6.70353 -0.994099 13.8682 +22 7454 984.095 954.181 117.345 6.72531 -0.996743 12.9562 +23 7454 1013.07 980.818 112.934 6.72069 -0.997997 12.0176 +19 7456 966.085 940.698 156.361 7.54358 -0.348976 15.2667 +20 7456 990.407 963.068 154.455 7.48277 -0.361502 14.1765 +19 7457 971.505 938.197 192.49 5.83693 0.316658 11.6359 +20 7457 1003.2 967.319 193.197 5.89305 0.304555 10.8019 +21 7457 1040.25 1001.12 194.37 5.91259 0.295379 9.90534 +22 7457 1084.34 1041.62 196.378 5.96902 0.295748 9.0712 +23 7457 1137.8 1090.73 198.544 6.02821 0.293176 8.23407 +24 7457 1203.91 1151.2 202.023 6.05655 0.297242 7.35264 +19 7459 954.986 929.737 152.089 7.34856 -0.441759 15.3499 +20 7459 978.871 951.684 150.531 7.29661 -0.441051 14.2556 +21 7459 1005.5 976.31 148.482 7.28577 -0.448466 13.2771 +22 7459 1036.07 1004.23 146.694 7.19568 -0.441343 12.173 +23 7459 1070.69 1037.31 144.607 7.4213 -0.454593 11.6122 +24 7459 1111.26 1074.74 142.636 7.37938 -0.444471 10.613 +25 7459 1157.95 1118.88 139.922 7.54037 -0.452817 9.92119 +19 7466 1108.6 1073.98 142.366 7.74117 -0.472928 11.1925 +20 7466 1155.22 1117.44 138.562 7.75739 -0.487505 10.2577 +21 7466 1211.34 1169.65 134.236 7.75326 -0.497551 9.29616 +19 7468 984.806 959.551 138.929 7.981 -0.721532 15.3461 +20 7468 1010.86 982.704 135.884 7.65642 -0.705348 13.7663 +19 7473 976.389 950.114 179.976 7.49939 0.145608 14.751 +20 7473 1001.8 974.322 179.431 7.66857 0.128595 14.1067 +19 7481 1152.21 1120.22 164.897 9.11426 -0.133643 12.1189 +20 7481 1200.46 1164.99 163.946 8.9485 -0.134898 10.9268 +19 7493 215.419 168.022 261.924 -4.46678 1.00943 8.17717 +20 7493 169.161 115.912 272.292 -4.44255 1.00309 7.27856 +19 7495 202.103 151.438 334.633 -4.31986 1.71518 7.64975 +20 7495 150.775 94.012 355.182 -4.34148 1.72537 6.82793 +19 7496 182.306 131.25 262.519 -4.49514 0.943368 7.5913 +20 7496 127.111 69.4099 274.399 -4.49122 0.945309 6.71695 +19 7497 194.806 145.266 271.798 -4.49712 1.07283 7.82355 +20 7497 143.102 87.2124 284.101 -4.48311 1.06919 6.93468 +19 7498 242.815 198.077 309.75 -4.40336 1.64366 8.66321 +20 7498 202.471 152.731 325 -4.39619 1.64304 7.79196 +19 7499 336.137 312.26 252.082 -6.1512 1.78239 16.2325 +20 7499 322.055 296.531 255.914 -6.05051 1.74798 15.1847 +21 7499 305.518 279.601 260.355 -6.30172 1.81359 14.9549 +19 7501 380.664 342.08 298.649 -3.18659 1.75126 10.045 +20 7501 359.596 316.74 310.735 -3.13298 1.72816 9.04358 +21 7501 334.22 286.73 324.461 -3.11435 1.71482 8.16128 +22 7501 302.639 249.357 342.52 -3.09417 1.71046 7.27407 +19 7503 353.563 320.981 277.174 -4.22032 1.71981 11.8952 +20 7503 334.791 299.104 284.998 -4.13571 1.68795 10.8603 +19 7505 300.882 267.967 260.017 -5.03738 1.42244 11.775 +20 7505 277.732 239.767 265.026 -4.69484 1.30409 10.2086 +21 7505 248.994 205.172 270.149 -4.41971 1.19262 8.84439 +19 7519 656.673 611.933 313.538 0.56565 1.68904 8.66276 +20 7519 664.285 613.854 329.563 0.582897 1.66916 7.68531 +19 7521 617.546 570.593 316.78 0.0913689 1.64655 8.25459 +20 7521 619.578 567.476 332.263 0.103288 1.64343 7.43869 +19 7526 906.328 866.103 282.838 3.96297 1.46869 9.63521 +20 7526 938.728 893.814 293.411 3.93676 1.44183 8.62938 +21 7526 978.221 928.242 306.528 3.96221 1.43666 7.75475 +22 7526 1027.72 970.752 323.751 3.94256 1.42269 6.80281 +19 7527 961.572 915.468 297.84 4.10124 1.45618 8.4065 +20 7527 1005.48 953.788 311.497 4.11395 1.4406 7.49733 +21 7527 1060.68 1002.06 329.809 4.13327 1.43805 6.61085 +22 7527 1133.16 1064.11 354.578 4.07318 1.41367 5.61299 +19 7528 947.173 898.731 307.978 3.74358 1.4983 8.00066 +20 7528 991.579 936.909 324.056 3.75341 1.48558 7.08923 +21 7528 1047.97 985.465 345.257 3.76771 1.48165 6.20094 +19 7533 1013.85 975.364 270.117 5.64221 1.35737 10.0696 +20 7533 1055.14 1012.72 278.644 5.64283 1.33973 9.13756 +20 7556 381.83 354.418 83.7719 -4.46239 -1.74558 14.1386 +21 7556 368.646 339.238 76.9924 -4.40042 -1.75097 13.1793 +22 7556 354.499 321.099 69.8481 -4.10195 -1.65657 11.604 +23 7556 334.084 300.064 62.513 -4.34954 -1.7422 11.3925 +24 7556 313.8 275.462 54.0058 -4.14381 -1.66515 10.1093 +20 7557 321.736 292.223 44.8631 -5.2386 -2.32953 13.1325 +21 7557 302.723 271.36 34.4332 -5.25513 -2.37071 12.3576 +20 7558 400.618 372.635 78.8263 -4.01075 -1.80492 13.8504 +21 7558 387.816 357.925 71.0552 -3.98481 -1.82936 12.9663 +20 7562 612.654 601.496 81.3525 0.148977 -4.40474 34.7337 +21 7562 614.027 602.56 77.9354 0.209272 -4.44653 33.801 +22 7562 613.979 603.615 75.8533 0.229062 -5.02736 37.3959 +20 7564 721.703 697.026 79.7795 2.44102 -2.02594 15.7056 +21 7564 730.202 703.461 73.3718 2.42338 -1.99832 14.4937 +20 7569 310.42 287.256 243.548 -6.93684 1.63934 16.732 +21 7569 295.242 271.541 246.238 -7.12346 1.66311 16.3524 +22 7569 278.247 252.569 249.663 -6.93059 1.60673 15.0936 +20 7577 342.7 314.064 268.205 -5.00561 1.78855 13.5342 +21 7577 325.637 295.522 273.173 -5.0643 1.78939 12.87 +22 7577 306.83 273.807 279.293 -4.92423 1.73136 11.7366 +23 7577 284.736 249.788 287.982 -4.99257 1.76952 11.0901 +24 7577 259.244 221.192 297.956 -4.94516 1.76598 10.1855 +20 7584 940.726 894.273 299.747 3.82934 1.46729 8.34327 +21 7584 981.765 929.627 314.171 3.83465 1.45591 7.43364 +20 7586 1026.43 967.007 337.079 3.76822 1.48448 6.52219 +21 7586 1091.44 1024.41 361.925 3.86148 1.51508 5.7819 +20 7604 240.022 212.839 58.5846 -7.30217 -2.258 14.2578 +21 7604 215.332 187.181 49.3073 -7.52221 -2.35738 13.7676 +20 7605 198.521 170.044 70.3861 -7.75324 -1.93281 13.6101 +21 7605 171.888 140.951 62.5621 -7.59912 -1.91496 12.5278 +20 7608 188.028 159.642 106.028 -7.97648 -1.26453 13.6534 +21 7608 160.603 130.578 100.134 -8.03183 -1.30096 12.9083 +22 7608 129.675 98.2036 94.5783 -8.19054 -1.33599 12.315 +23 7608 94.6928 61.3039 89.6351 -8.28302 -1.3388 11.6079 +20 7620 225.628 196.283 70.1424 -7.02773 -1.8801 13.2075 +21 7620 199.771 169.056 62.1837 -7.16661 -1.93546 12.6187 +22 7620 170.62 137.423 53.477 -7.10226 -1.93158 11.6749 +23 7620 136.521 101.988 44.9852 -7.35782 -1.98892 11.2231 +24 7620 97.8975 60.5016 33.9361 -7.34946 -1.9954 10.3641 +20 7628 284.168 253.832 72.2818 -5.76148 -1.78077 12.7758 +21 7628 261.68 229.543 64.0086 -5.81465 -1.8193 12.0602 +20 7632 365.01 337.786 123.07 -4.82511 -0.982268 14.2364 +21 7632 350.404 321.25 118.716 -4.7748 -0.997471 13.2939 +20 7634 326.84 299.62 76.6356 -5.57909 -1.89874 14.2386 +21 7634 309.761 281.841 69.0374 -5.76776 -1.99731 13.8815 +22 7634 290.31 261.347 60.5422 -5.92086 -2.08295 13.3818 +20 7635 390.486 364.044 63.9502 -4.45044 -2.21236 14.6579 +21 7635 377.492 349.58 56.0214 -4.46587 -2.24832 13.8852 +20 7636 395.54 368.882 105.222 -4.31232 -1.36273 14.5384 +21 7636 383.314 354.115 99.823 -4.16208 -1.3435 13.2736 +20 7637 377.352 350.007 107.12 -4.5613 -1.29123 14.1733 +21 7637 363.11 334.504 101.612 -4.62777 -1.33776 13.5488 +20 7638 321.736 292.223 44.8631 -5.2386 -2.32953 13.1325 +21 7638 302.723 271.36 34.4332 -5.25513 -2.37071 12.3576 +20 7646 422.964 395.826 79.8119 -3.69337 -1.84163 14.2818 +21 7646 412.123 383.514 72.6569 -3.707 -1.88127 13.5474 +20 7647 543.999 536.798 89.1359 -4.89007 -6.24445 53.8187 +21 7647 543.986 536.897 87.118 -4.96877 -6.4966 54.6741 +20 7648 543.999 536.798 89.1359 -4.89007 -6.24445 53.8187 +21 7648 543.986 536.609 87.118 -4.77461 -6.24274 52.5377 +22 7648 543.794 536.403 86.4524 -4.77947 -6.2792 52.4375 +20 7653 431.716 404.554 85.5915 -3.51709 -1.72573 14.2694 +21 7653 421.457 392.509 79.1381 -3.49043 -1.73899 13.3889 +22 7653 409.751 378.879 72.2077 -3.47648 -1.75116 12.5541 +23 7653 396.199 363.349 65.129 -3.4888 -1.76149 11.7984 +24 7653 380.534 345.603 57.2085 -3.52186 -1.77835 11.0955 +20 7654 555.045 547.56 119.051 -3.91201 -3.86099 51.7786 +21 7654 554.664 547.648 117.854 -4.20266 -4.21068 55.2397 +22 7654 555.179 547.609 116.067 -3.8582 -4.02901 51.1925 +23 7654 555.016 547.812 115.706 -4.06689 -4.26111 53.8 +24 7654 555.291 548.081 115.027 -4.04257 -4.30768 53.7495 +25 7654 555.638 547.902 113.195 -3.74396 -4.14234 50.0992 +20 7658 545.165 526.95 44.6792 -1.89905 -3.77998 21.2787 +21 7658 543.589 524.453 37.6161 -1.85188 -3.7963 20.2545 +20 7659 546.125 539.771 68.9981 -5.36213 -8.77903 60.9922 +21 7659 546.173 539.868 66.0236 -5.39955 -9.10039 61.4645 +22 7659 546.358 539.925 63.5169 -5.2778 -9.13046 60.2537 +23 7659 546.649 539.978 62.2137 -5.06564 -8.90892 58.0993 +24 7659 547.159 540.169 61.2685 -4.79517 -8.57486 55.4471 +25 7659 547.069 540.068 59.3104 -4.79476 -8.71195 55.362 +26 7659 546.959 539.76 56.096 -4.67059 -8.7113 53.8338 +20 7662 445.029 417.495 49.8694 -3.2098 -2.39929 14.0764 +21 7662 434.89 406.657 40.4688 -3.32316 -2.51868 13.7276 +22 7662 424.15 394.214 31.8652 -3.32683 -2.52979 12.9467 +20 7667 636.121 624.147 99.3365 1.19158 -3.29803 32.3685 +21 7667 637.978 625.471 96.2393 1.22057 -3.29057 30.9898 +20 7668 636.121 624.147 99.3365 1.19158 -3.29803 32.3685 +21 7668 637.978 625.471 96.2393 1.22057 -3.29057 30.9898 +22 7668 640.672 627.259 93.2119 1.24594 -3.18937 28.8949 +23 7668 642.353 628.573 91.0285 1.2783 -3.18956 28.1256 +24 7668 644.384 630.698 88.8038 1.36682 -3.29887 28.3195 +25 7668 647.042 632.059 85.5059 1.34374 -3.13138 25.8667 +26 7668 649.334 633.854 80.9133 1.38018 -3.19038 25.0376 +20 7669 655.338 642.559 105.743 1.92431 -2.82103 30.3299 +21 7669 657.833 644.859 102.781 1.99862 -2.90116 29.873 +22 7669 660.477 647.111 100.197 2.04623 -2.91986 28.9963 +23 7669 663.265 649.438 98.0715 2.08634 -2.90513 28.0301 +24 7669 666.298 651.986 96.1086 2.12944 -2.88031 27.0798 +25 7669 669.039 654.337 93.2218 2.1731 -2.90937 26.3614 +26 7669 671.885 656.635 89.1667 2.19528 -2.9477 25.4146 +20 7670 573.822 568.206 107.9 -3.41823 -6.21275 69.0137 +21 7670 574.436 567.198 105.936 -2.60633 -4.96568 53.5424 +20 7672 593.056 584.445 57.0093 -1.02954 -7.22668 45.0113 +21 7672 595.654 584.962 52.0848 -0.698624 -6.06747 36.2502 +20 7673 591.85 584.704 69.0258 -1.33107 -7.80403 54.2329 +21 7673 592.805 585.612 66.3752 -1.25122 -7.95171 53.8836 +22 7673 593.658 586.281 64.0999 -1.15776 -7.91844 52.5355 +23 7673 594.407 586.784 62.2756 -1.06777 -7.79217 50.8449 +24 7673 595.499 587.601 60.6055 -0.956149 -7.63353 49.0686 +25 7673 596.038 588.068 58.3858 -0.911161 -7.71391 48.6238 +20 7674 679.253 655.905 79.54 1.60345 -2.1469 16.6006 +21 7674 684.428 660.201 73.4657 1.65995 -2.20358 15.9975 +22 7674 691.245 664.494 67.8129 1.64026 -2.10925 14.4886 +20 7677 610.92 601.604 49.1464 0.0784727 -7.13249 41.601 +21 7677 612.418 602.914 46.0887 0.161576 -7.16496 40.7824 +20 7678 625.061 613.144 112.088 0.698731 -2.73898 32.523 +21 7678 626.55 614.409 109.482 0.751744 -2.80386 31.9239 +22 7678 628.148 615.808 107.07 0.809165 -2.86357 31.4087 +23 7678 629.525 616.997 105.366 0.856064 -2.89371 30.9375 +20 7682 584.039 579.073 81.1241 -2.76046 -9.92202 78.0455 +21 7682 584.668 580.433 78.9111 -3.15711 -11.9152 91.516 +22 7682 586.185 580.527 76.7072 -2.21905 -9.12771 68.4993 +23 7682 586.824 580.099 75.3327 -1.81595 -7.78927 57.631 +24 7682 588.47 580.5 73.8935 -1.42138 -6.66967 48.6297 +25 7682 588.785 579.817 72.1049 -1.24439 -6.03482 43.2198 +20 7684 580.207 573.475 53.9662 -2.34222 -9.48675 57.5757 +21 7684 581.498 574.312 50.5791 -2.09749 -9.13964 53.9326 +20 7686 649.273 636.536 110.311 1.67481 -2.63763 30.4292 +21 7686 651.562 638.629 107.343 1.74449 -2.72081 29.9672 +22 7686 654.028 641.006 105.119 1.83427 -2.79398 29.7624 +20 7689 784.901 759.139 62.2492 3.6559 -2.30612 15.0442 +21 7689 797.653 770.161 54.4059 3.6751 -2.31432 14.0979 +22 7689 811.752 782.376 46.1009 3.69723 -2.31777 13.1938 +23 7689 827.409 795.872 36.8845 3.71055 -2.31592 12.2897 +24 7689 845.476 811.451 26.9107 3.72442 -2.30401 11.3909 +20 7693 760.188 735.212 99.3153 3.23948 -1.58155 15.5177 +21 7693 770.581 744.213 93.9452 3.28018 -1.60745 14.6985 +22 7693 782.013 754.369 88.6638 3.35098 -1.63591 14.0203 +20 7695 785.35 759.419 20.4874 3.64138 -3.15616 14.9461 +21 7695 797.67 770.659 10.1074 3.74088 -3.23648 14.3489 +20 7701 758.054 733.362 93.1594 3.23032 -1.73366 15.6962 +21 7701 768.28 741.992 87.5767 3.24318 -1.74249 14.7433 +22 7701 779.946 751.926 81.5822 3.26629 -1.74966 13.8318 +23 7701 792.06 763.205 75.4021 3.39728 -1.81408 13.4315 +24 7701 807.096 775.461 68.5254 3.35407 -1.77144 12.2513 +25 7701 823.751 789.186 60.8165 3.32863 -1.74111 11.213 +20 7702 770.147 746.373 101.136 3.62843 -1.62044 16.303 +21 7702 780.915 755.307 96.0248 3.59441 -1.6116 15.1352 +20 7709 828.754 807.323 63.6423 5.49391 -2.73729 18.0847 +21 7709 841.79 819.36 56.7962 5.56155 -2.7794 17.2797 +20 7711 738.871 714.405 116.857 2.83902 -1.22939 15.8412 +21 7711 747.742 722.141 112.847 2.89934 -1.25906 15.1393 +22 7711 757.582 730.276 108.919 2.91189 -1.25774 14.194 +23 7711 768.903 739.291 104.122 2.89046 -1.24679 13.0885 +24 7711 781.051 749.56 100.291 2.92519 -1.23773 12.3075 +20 7713 786.615 762.075 72.7817 3.87554 -2.19047 15.7936 +21 7713 798.395 771.876 66.3545 3.82497 -2.15721 14.6151 +22 7713 810.354 783.047 58.6194 3.94983 -2.24711 14.1934 +20 7715 701.274 676.374 63.6424 1.97853 -2.356 15.5656 +21 7715 706.506 682.09 55.5533 2.1328 -2.58057 15.8736 +22 7715 714.241 688.216 47.4206 2.16058 -2.58888 14.8922 +23 7715 722.04 695.725 39.1165 2.29593 -2.72981 14.7278 +20 7717 910.171 884.329 66.3411 6.24853 -2.21399 14.9979 +21 7717 930.734 903.362 58.6897 6.30279 -2.24038 14.1596 +20 7727 914.834 889.194 39.2289 6.39524 -2.79933 15.1156 +21 7727 935.192 908.658 30.2808 6.59213 -2.88627 14.6069 +22 7727 957.338 929.529 20.7923 6.71744 -2.93711 13.9367 +23 7727 982.659 952.642 9.8666 6.67668 -2.91669 12.9121 +20 7731 967.502 939.84 20.0822 6.95058 -2.96654 14.0109 +21 7731 994.108 964.041 8.47215 6.86996 -2.93668 12.8903 +20 7733 965.852 937.784 32.6642 6.81846 -2.68284 13.8082 +21 7733 991.943 962.134 22.24 6.89032 -2.71397 13.0017 +20 7741 924.801 900.357 64.4572 6.92744 -2.38202 15.8558 +21 7741 946.103 918.731 56.0941 6.60457 -2.29138 14.16 +20 7750 989.912 962.121 65.8509 7.35138 -2.06813 13.9457 +21 7750 1017.82 988.058 57.7464 7.36862 -2.07756 13.023 +22 7750 1049.25 1017.54 49.0259 7.44664 -2.09715 12.2199 +23 7750 1085.49 1051.32 38.9328 7.48235 -2.10544 11.3437 +24 7750 1127.79 1090.7 27.7186 7.50584 -2.10209 10.4505 +25 7750 1177.14 1136.89 13.793 7.57369 -2.12247 9.62804 +20 7752 1021.71 992.332 86.4128 7.53588 -1.58051 13.1928 +21 7752 1052.52 1021.78 79.3304 7.73861 -1.63386 12.6053 +22 7752 1086.3 1054.85 72.6681 8.14264 -1.71116 12.3238 +20 7757 1083.76 1045.82 87.2784 6.7136 -1.21154 10.2152 +21 7757 1130.87 1090.58 78.79 6.95118 -1.25426 9.62107 +20 7762 980.454 952.78 71.4941 7.19903 -1.96739 14.005 +21 7762 1007.41 978.06 63.6067 7.28018 -1.99907 13.2031 +22 7762 1038.04 1006.6 55.072 7.32098 -2.01242 12.3282 +23 7762 1073.15 1039.36 45.5398 7.37134 -2.02438 11.4729 +20 7765 1011.65 983.743 117.915 7.73985 -1.05753 13.889 +21 7765 1040.62 1011.62 114.104 7.98414 -1.08818 13.3644 +22 7765 1073.72 1042.4 110.087 7.96086 -1.07653 12.3752 +23 7765 1111.62 1077.97 105.735 8.0131 -1.07123 11.516 +20 7766 1001.75 973.79 56.7803 7.53381 -2.22971 13.8603 +21 7766 1030.42 1000.55 47.6953 7.56899 -2.25092 12.9765 +20 7776 107.04 95.4188 157.368 -23.2275 -0.715811 33.351 +21 7776 94.5872 82.7393 156.077 -23.3474 -0.760641 32.7125 +22 7776 81.3239 68.7486 154.858 -22.5633 -0.768679 30.8201 +23 7776 66.7935 53.9287 154.816 -22.6624 -0.753152 30.1268 +20 7777 132.227 122.479 180.968 -26.3013 0.447105 39.7571 +21 7777 122.381 112.034 179.854 -25.29 0.363398 37.4559 +22 7777 111.895 99.7651 179.323 -22.0378 0.286449 31.9515 +20 7782 68.1822 55.0439 131.222 -22.1338 -1.70211 29.4996 +21 7782 52.6267 41.7868 128.836 -27.5977 -2.18123 35.7544 +22 7782 37.8892 26.5263 127.247 -27.024 -2.15596 34.1086 +20 7785 77.927 65.8609 151.786 -23.667 -0.937878 32.1211 +21 7785 63.922 51.8751 149.768 -24.3289 -1.02936 32.172 +22 7785 49.0635 37.0712 148.289 -25.1053 -1.1003 32.3186 +20 7789 74.1594 58.2743 151.997 -18.1044 -0.705283 24.3986 +21 7789 54.8979 41.7472 150.251 -22.6556 -0.923253 29.4717 +20 7790 74.1594 58.2743 151.997 -18.1044 -0.705283 24.3986 +21 7790 54.8979 41.7472 150.251 -22.6556 -0.923253 29.4717 +20 7794 209.057 162.301 231.219 -4.60108 0.670516 8.28923 +21 7794 163.068 110.961 237.187 -4.60262 0.663172 7.43792 +20 7796 274.446 247.958 163.069 -6.79579 -0.19844 14.6321 +21 7796 254.194 225.175 162.944 -6.57784 -0.183437 13.3557 +20 7797 139.359 128.394 199.95 -23.0349 1.32743 35.3478 +21 7797 127.969 116.7 200.261 -22.9564 1.30642 34.3942 +20 7800 154.453 100.574 251.761 -4.53719 0.786666 7.19339 +21 7800 91.9192 29.8875 261.532 -4.4824 0.767887 6.24801 +20 7805 369.495 341.934 133.478 -4.67879 -0.767429 14.0626 +21 7805 354.84 325.764 129.625 -4.70568 -0.798613 13.3297 +22 7805 338.185 307.252 126.073 -4.7123 -0.812337 12.5292 +23 7805 319.499 285.978 122.679 -4.64791 -0.803995 11.5619 +20 7806 279.244 254.187 171.641 -7.08083 -0.0260103 15.4673 +21 7806 260.62 234.015 170.443 -7.04495 -0.0486742 14.5676 +20 7809 313.637 289.696 227.68 -6.63944 1.23011 16.1887 +21 7809 297.661 273.693 229.923 -6.98988 1.27897 16.1702 +20 7814 523.357 517.415 151.95 -7.79234 -1.88961 65.2241 +21 7814 523.174 517.306 150.64 -7.90762 -2.03343 66.049 +22 7814 523.104 517.129 149.787 -7.77235 -2.07368 64.8663 +23 7814 523.003 516.898 149.546 -7.61518 -2.05067 63.4805 +20 7816 533.742 514.752 234.956 -2.14457 1.75662 20.4094 +21 7816 531.452 511.792 236.731 -2.13409 1.74527 19.7142 +22 7816 528.853 508.273 239.255 -2.10651 1.73312 18.8327 +23 7816 526.2 504.449 242.689 -2.05854 1.72457 17.8182 +24 7816 523.34 500.641 246.51 -2.04027 1.74297 17.0743 +25 7816 519.542 495.345 250.085 -1.99832 1.71446 16.0176 +26 7816 515.555 489.424 252.841 -1.93243 1.64427 14.8325 +20 7819 467.683 446.59 242.743 -3.61296 1.77977 18.3744 +21 7819 461.885 440.272 245.147 -3.67032 1.79678 17.9332 +22 7819 455.564 432.77 248.411 -3.629 1.78053 17.0035 +20 7820 510.501 503.1 192.852 -7.18949 1.45144 52.3681 +21 7820 510.318 502.9 192.506 -7.18582 1.42296 52.2448 +22 7820 510.092 502.383 192.688 -6.93069 1.38197 50.2753 +23 7820 507.21 502.094 192.373 -10.7459 2.0493 75.756 +24 7820 506.911 499.557 193.27 -7.49789 1.4913 52.7043 +20 7823 659.747 645.665 215.364 1.91446 1.62159 27.5241 +21 7823 662.651 648.057 215.913 1.95417 1.58489 26.558 +22 7823 665.403 650.554 216.891 2.02001 1.5929 26.0997 +23 7823 668.895 653.154 218.511 2.02477 1.55801 24.6217 +24 7823 672.303 656.249 220.435 2.09939 1.59205 24.1425 +25 7823 675.64 658.906 221.995 2.12115 1.5774 23.161 +20 7826 679.922 673.302 146.124 5.70894 -2.16872 58.5422 +21 7826 682.496 675.3 144.867 5.44395 -2.08892 53.8548 +22 7826 684.705 677.347 143.933 5.48589 -2.11133 52.6745 +20 7827 562.598 557.101 169.609 -4.58919 -0.317066 70.5103 +21 7827 562.901 557.591 168.539 -4.71907 -0.436439 72.9778 +22 7827 563.457 557.914 168.031 -4.46725 -0.46739 69.9164 +23 7827 563.926 558.267 168.038 -4.33139 -0.457133 68.4867 +24 7827 564.585 558.927 168.298 -4.2697 -0.432546 68.5007 +25 7827 564.741 559.259 167.861 -4.39083 -0.489198 70.6893 +26 7827 565.225 559.55 166.419 -4.19701 -0.609148 68.3055 +20 7828 655.801 642.594 210.401 1.88073 1.52711 29.3463 +21 7828 658.241 645.047 210.618 1.98186 1.53737 29.374 +22 7828 660.938 647.148 211.345 2.00136 1.49934 28.1061 +23 7828 663.921 649.841 212.581 2.07386 1.51556 27.5261 +20 7830 563.829 557.239 185.524 -3.7277 1.03277 58.8155 +21 7830 564.182 557.441 184.739 -3.61609 0.947128 57.4985 +22 7830 564.448 557.584 184.565 -3.5305 0.916557 56.4687 +23 7830 564.917 557.966 185.012 -3.44987 0.939516 55.7591 +24 7830 565.021 558.069 186.028 -3.4413 1.01793 55.7508 +25 7830 565.59 558.883 185.84 -3.5215 1.04008 57.7879 +20 7835 695.993 693.224 163.131 16.7617 -1.88549 139.924 +21 7835 698.353 696.621 161.991 27.5409 -3.36939 223.797 +20 7836 732.823 709.81 168.996 2.87707 -0.0900457 16.8412 +21 7836 741.111 716.733 168.053 2.89867 -0.10578 15.8987 +22 7836 750.272 724.433 167.379 2.9252 -0.113823 14.9996 +23 7836 760.196 732.677 167.153 2.94036 -0.111284 14.0841 +20 7841 826.639 821.875 129.584 24.4772 -4.87904 81.3583 +21 7841 830.37 825.744 128.333 25.6347 -5.16853 83.7656 +22 7841 834.067 829.404 127.45 25.8629 -5.23047 83.1198 +23 7841 837.781 833.34 126.715 27.6011 -5.58002 87.2627 +24 7841 841.911 837.105 126.511 25.9645 -5.17863 80.629 +25 7841 845.634 840.772 125.529 26.0853 -5.22922 79.727 +20 7842 762.909 743.627 177.947 4.27197 0.14189 20.1003 +21 7842 768.715 747.259 177.23 3.9844 0.109542 18.0634 +20 7844 798.247 763.946 219.98 2.95484 0.737998 11.2993 +21 7844 815.727 778.588 223.926 2.98181 0.738659 10.4356 +20 7848 735.752 712.34 134.083 2.89519 -0.889502 16.5539 +21 7848 744.504 719.581 130.792 2.90841 -0.906548 15.5511 +22 7848 754.077 727.584 128.19 2.93009 -0.905552 14.6292 +20 7856 952.304 926.195 147.315 7.05134 -0.525427 14.8443 +21 7856 976.008 948.19 144.789 7.076 -0.541934 13.9327 +22 7856 1002.84 973.027 142.349 7.08503 -0.549543 12.9985 +23 7856 1033.44 1001.31 139.735 7.08611 -0.553664 12.0621 +20 7858 960.635 934.413 148.06 7.19167 -0.507905 14.7804 +21 7858 985.035 957.678 145.483 7.37219 -0.537405 14.1668 +22 7858 1012.65 982.759 143.166 7.24435 -0.533556 12.9676 +23 7858 1044.63 1011.78 140.45 7.11296 -0.52976 11.7963 +24 7858 1081.63 1046.23 137.935 7.16285 -0.52983 10.948 +25 7858 1125.63 1086.36 133.973 7.05838 -0.531785 9.86858 +20 7860 957.039 930.783 157.861 7.10874 -0.306729 14.7612 +21 7860 981.131 953.262 156.193 7.16189 -0.321134 13.9074 +22 7860 1008.55 978.078 155.042 7.03257 -0.313948 12.7176 +20 7861 951.95 924.905 179.746 6.80041 0.136883 14.3309 +21 7861 977.028 947.469 179.181 6.67756 0.114977 13.1116 +20 7863 863.334 835.695 190.686 4.93194 0.346551 14.0226 +21 7863 879.939 851.83 191.205 5.16688 0.350677 13.7884 +20 7873 985.388 949.283 199.184 5.59136 0.391727 10.7346 +21 7873 1021.06 981.934 201.062 5.64966 0.387276 9.90635 +20 7879 996.838 959.35 201.377 5.54914 0.408696 10.3386 +21 7879 1034.28 993.784 202.931 5.63383 0.398969 9.57109 +20 7889 1134.97 1094.9 138.818 7.04332 -0.456271 9.67251 +21 7889 1188.66 1146.96 135.128 7.45871 -0.485906 9.29319 +20 7898 275.988 235.029 305.173 -4.37458 1.73528 9.46251 +21 7898 243.772 198.629 317.328 -4.35242 1.71907 8.58541 +22 7898 203.835 153.949 333.708 -4.36862 1.73199 7.76913 +20 7899 192.16 141.386 320.5 -4.41582 1.562 7.63341 +21 7899 139.708 82.6526 338.549 -4.42347 1.55995 6.793 +20 7900 234.667 188.355 321.422 -4.34813 1.72314 8.36864 +21 7900 193.048 141.632 337.292 -4.35132 1.71789 7.53795 +22 7900 140.696 83.2872 358.03 -4.38699 1.73263 6.75117 +20 7922 418.538 383.608 289.384 -2.9375 1.79197 11.0957 +21 7922 403.551 365.701 298.182 -2.92356 1.77859 10.2397 +22 7922 385.981 344.367 309.329 -2.88591 1.7616 9.3135 +23 7922 364.689 319.351 323.602 -2.90116 1.78602 8.54859 +20 7927 693.817 662.742 271.98 1.45645 1.71346 12.4722 +21 7927 702.471 667.813 279.135 1.44001 1.6472 11.1828 +20 7933 616.4 573.078 300.943 0.0848188 1.58818 8.94633 +21 7933 618.915 572.945 310.773 0.109323 1.61153 8.43089 +20 7934 711.371 683.297 255.965 1.94802 1.59022 13.8056 +21 7934 719.782 690.073 260.304 1.99287 1.58112 13.0456 +20 7939 773.172 735.034 286.034 2.3044 1.59408 10.1625 +21 7939 789.867 748.26 295.963 2.32781 1.58937 9.31521 +22 7939 810.444 764.411 308.291 2.34406 1.58037 8.41936 +20 7942 716.602 683.961 275.631 1.76154 1.69135 11.874 +21 7942 726.134 690.658 282.601 1.76509 1.66172 10.925 +20 7950 839.409 802.747 261.292 3.36762 1.29575 10.5715 +21 7950 861.397 822.224 269.666 3.45328 1.32752 9.89399 +20 7953 1081.08 1036.4 253.712 5.66818 0.971997 8.67363 +21 7953 1136.9 1087.53 261.941 5.73842 0.969433 7.85169 +22 7953 1206.26 1151.04 273.402 5.8035 0.97792 7.0176 +20 7955 1076.85 1025.01 307.198 4.8418 1.39199 7.4761 +21 7955 1143.14 1083.04 325.095 4.76921 1.36075 6.44918 +20 7960 1037.08 996.349 271.886 5.63852 1.30614 9.51636 +21 7960 1083.28 1038.09 281.02 5.63096 1.28573 8.57668 +21 7980 610.223 593.904 224.554 0.0218327 1.70172 23.7498 +22 7980 611.181 594.392 226.257 0.0518846 1.7086 23.0853 +21 7992 1111.43 1064.54 259.663 5.74947 0.99449 8.26602 +22 7992 1174.82 1121.93 270.292 5.74127 0.989664 7.32856 +21 7997 111.383 79.6231 42.367 -8.42561 -2.20691 12.2033 +22 7997 76.6353 42.7882 32.2301 -8.45745 -2.23169 11.4507 +21 8011 133.144 103.675 80.9338 -8.68395 -1.67549 13.152 +22 8011 100.547 69.0151 73.8323 -8.67099 -1.68683 12.2914 +23 8011 62.6024 29.1796 67.1442 -8.79035 -1.6989 11.5961 +21 8028 182.71 152.712 125.436 -7.6432 -0.849076 12.9199 +22 8028 152.873 121.536 121.496 -7.82818 -0.880334 12.3681 +21 8029 164.775 133.939 43.2001 -7.74791 -2.2585 12.5688 +22 8029 133.526 99.2209 32.8046 -7.45383 -2.19292 11.298 +23 8029 95.5464 58.5469 23.101 -7.46232 -2.17408 10.4751 +21 8032 181.443 152.077 71.6878 -7.83094 -1.85049 13.1981 +22 8032 152.045 120.976 63.4732 -7.90977 -1.89104 12.4744 +21 8035 396.138 365.551 65.9448 -3.74807 -1.87752 12.6715 +22 8035 381.887 349.298 57.7997 -3.75256 -1.89636 11.8926 +21 8040 350.217 321.061 124.048 -4.77801 -0.899181 13.2933 +22 8040 333.361 307.061 120.172 -5.64103 -1.07598 14.7366 +21 8046 323.659 293.557 61.6795 -5.1017 -1.98384 12.8754 +22 8046 304.112 271.915 53.0942 -5.09575 -1.99795 12.0374 +21 8047 292.224 261.452 44.5097 -5.53929 -2.24033 12.5949 +22 8047 270.334 242.933 34.4135 -6.64992 -2.71389 14.1445 +21 8048 350.138 320.317 56.632 -4.6728 -2.09344 12.9966 +22 8048 334.071 302.445 47.8267 -4.67893 -2.12348 12.2547 +23 8048 313.521 279.67 39.4025 -4.69757 -2.11762 11.4494 +24 8048 291.917 256.677 28.5836 -4.8416 -2.19901 10.9979 +21 8049 366.262 337.185 112.169 -4.49456 -1.12107 13.3294 +22 8049 350.902 319.657 107.25 -4.44667 -1.12783 12.4042 +23 8049 333.259 299.354 102.814 -4.37742 -1.10964 11.4313 +24 8049 311.91 276.148 97.9829 -4.47072 -1.12457 10.8376 +25 8049 287.767 250.048 90.9123 -4.58267 -1.16694 10.2755 +26 8049 259.522 218.628 81.4718 -4.59779 -1.20032 9.47751 +21 8051 346.825 318.75 89.8423 -5.02668 -1.5882 13.8046 +22 8051 329.846 298.485 83.0733 -4.79093 -1.53776 12.3585 +23 8051 310.422 277.296 76.1488 -4.85057 -1.56809 11.6999 +21 8056 550.136 542.847 48.435 -4.37878 -9.16824 53.1689 +22 8056 549.504 542.989 44.0445 -4.9512 -10.6196 59.4866 +21 8060 417.969 389.527 87.1726 -3.61835 -1.61817 13.6269 +22 8060 406.488 376.484 80.7727 -3.63551 -1.6485 12.9174 +21 8065 483.015 472.206 68.1986 -6.28838 -5.20067 35.8556 +22 8065 480.908 470.096 65.5557 -6.39148 -5.33066 35.8465 +21 8067 426.95 398.879 90.056 -3.49425 -1.58435 13.8067 +22 8067 416.394 386.169 83.9295 -3.43293 -1.58036 12.8231 +21 8069 553.98 547.975 78.2941 -4.97176 -8.45869 64.5439 +22 8069 554.215 548.14 76.34 -4.89349 -8.53374 63.7981 +23 8069 554.413 548.29 74.99 -4.83796 -8.58557 63.3002 +24 8069 554.864 548.618 73.7123 -4.70334 -8.52539 62.0464 +25 8069 554.876 548.589 71.9697 -4.6721 -8.6194 61.6471 +26 8069 554.93 548.451 68.7078 -4.52848 -8.63324 59.8122 +21 8070 547.569 524.099 23.6789 -1.41873 -3.41409 16.5135 +22 8070 544.76 519.135 13.8719 -1.35833 -3.3326 15.125 +21 8077 693.38 668.023 45.721 1.77567 -2.69321 15.2852 +22 8077 699.184 672.701 37.025 1.81783 -2.75498 14.6348 +23 8077 707.142 676.758 28.9165 1.72513 -2.54462 12.7558 +21 8078 672.568 646.839 49.068 1.31545 -2.58431 15.0637 +22 8078 677.823 650.734 40.6246 1.35359 -2.62195 14.3072 +21 8083 603.487 596.313 39.8228 -0.454657 -9.96056 54.0243 +22 8083 604.341 597.143 37.545 -0.38942 -10.0971 53.8429 +21 8085 568.327 560.294 60.5429 -2.75737 -7.51062 48.2517 +22 8085 568.708 561.478 58.2283 -3.03484 -8.51553 53.6029 +23 8085 568.963 561.811 56.4005 -3.04942 -8.74738 54.1982 +24 8085 569.702 562.265 54.7058 -2.8788 -8.53359 52.1151 +25 8085 569.926 562.336 52.3256 -2.80493 -8.53007 51.0649 +21 8087 630.196 617.189 96.3919 0.852258 -3.1578 29.7987 +22 8087 631.884 618.02 93.6229 0.864978 -3.06981 27.956 +23 8087 633.711 619.314 91.2861 0.901075 -3.04317 26.9194 +24 8087 635.618 620.764 88.8717 0.9423 -3.03683 26.0911 +21 8092 651.562 638.629 107.343 1.74449 -2.72081 29.9672 +22 8092 654.028 641.006 105.119 1.83427 -2.79398 29.7624 +21 8099 697.887 673.169 72.6857 1.91942 -2.17672 15.6794 +22 8099 704.404 678.306 66.3355 1.95209 -2.19235 14.8506 +21 8101 770.581 744.213 93.9452 3.28018 -1.60745 14.6985 +22 8101 782.013 754.369 88.6638 3.35098 -1.63591 14.0203 +23 8101 794.985 765.161 82.9167 3.33964 -1.61983 12.9954 +21 8102 729.097 702.976 105.812 2.45813 -1.37864 14.8375 +22 8102 738.037 710.335 101.093 2.49127 -1.39149 13.9911 +21 8108 723.699 698.251 75.9068 2.4092 -2.04631 15.2298 +22 8108 732.651 705.319 69.8734 2.41905 -2.02381 14.1799 +21 8113 797.672 770.518 45.2149 3.72129 -2.525 14.2737 +22 8113 811.394 782.541 36.3054 3.75754 -2.54212 13.4328 +21 8114 728.873 702.518 86.4484 2.43174 -1.76103 14.7057 +22 8114 738.296 709.738 81.0624 2.42137 -1.72648 13.5711 +23 8114 749.435 718.174 75.3271 2.40345 -1.67578 12.398 +21 8115 741.466 715.153 97.5453 2.69277 -1.53737 14.7296 +22 8115 750.909 723.848 92.1269 2.8057 -1.60238 14.322 +23 8115 762.246 732.961 86.9089 2.80066 -1.57646 13.2349 +24 8115 774.573 742.469 81.1149 2.76096 -1.53495 12.0726 +25 8115 788.337 753.726 74.1028 2.77454 -1.53257 11.1979 +26 8115 804.744 766.757 64.454 2.76003 -1.53284 10.203 +21 8122 788.826 762.39 75.9324 3.64251 -1.96935 14.6609 +22 8122 799.942 774.453 69.6028 4.01217 -2.17595 15.2059 +23 8122 813.348 785.973 62.2229 3.99884 -2.17086 14.1584 +21 8123 788.826 762.39 75.9324 3.64251 -1.96935 14.6609 +22 8123 799.942 774.453 69.6028 4.01217 -2.17595 15.2059 +23 8123 813.348 785.973 62.2229 3.99884 -2.17086 14.1584 +21 8135 934.352 907.076 65.0924 6.39626 -2.12219 14.2095 +22 8135 957.902 928.714 57.624 6.41052 -2.12057 13.2784 +21 8136 965.869 938.176 43.6231 6.91106 -2.50659 13.9951 +22 8136 991.455 961.345 34.082 6.81269 -2.47557 12.8716 +23 8136 1021.19 988.686 23.6746 6.80179 -2.46502 11.9226 +24 8136 1054.95 1020.46 12.4817 6.93686 -2.49778 11.2379 +21 8140 974.94 946.293 23.4122 6.85129 -2.8022 13.5296 +22 8140 1002.14 971.242 12.8064 6.82393 -2.78196 12.5418 +21 8141 1019.9 990.146 33.9133 7.40912 -2.50874 13.0282 +22 8141 1051.43 1019.58 23.5773 7.45185 -2.51747 12.1683 +23 8141 1087.39 1053.11 11.6714 7.48829 -2.52598 11.3076 +21 8143 1041.4 1010.67 31.2524 7.54882 -2.47527 12.6128 +22 8143 1076.2 1043.01 20.1706 7.55104 -2.47066 11.6756 +21 8146 1004.43 974.639 81.031 7.11898 -1.65543 13.0082 +22 8146 1033.61 1003.58 73.7192 7.58633 -1.77355 12.9085 +23 8146 1066.63 1033.73 65.6379 7.46115 -1.75017 11.7782 +24 8146 1107.22 1070.42 56.7792 7.26467 -1.69443 10.5328 +25 8146 1153 1113.58 45.787 7.40487 -1.73139 9.83155 +26 8146 1206.09 1164.63 31.4748 7.72782 -1.8315 9.3472 +21 8153 1024.08 995.289 83.2518 7.73483 -1.67197 13.4638 +22 8153 1056.08 1024.76 76.5029 7.65975 -1.65285 12.3776 +23 8153 1093.44 1059.59 68.7413 7.67906 -1.65224 11.4506 +24 8153 1137.41 1099.82 59.6822 7.54329 -1.6173 10.3113 +25 8153 1186.94 1147.21 49.2404 7.80526 -1.67104 9.75395 +21 8169 127.9 115.816 186.645 -21.4104 0.61303 32.0733 +22 8169 115.618 103.927 186.901 -22.6953 0.64541 33.1528 +21 8172 105.199 95.6545 173.734 -28.3856 0.0495495 40.6083 +22 8172 94.9025 86.2225 173.317 -31.8486 0.0286804 44.6511 +21 8173 123.545 111.455 196.582 -21.5918 1.05414 32.0553 +22 8173 110.486 99.3416 199.481 -24.0541 1.28337 34.7764 +21 8180 260.62 234.015 170.443 -7.04495 -0.0486742 14.5676 +22 8180 239.705 211.107 169.673 -6.94672 -0.059746 13.5522 +21 8189 366.527 340.733 250.552 -5.06099 1.618 15.0256 +22 8189 352.268 326.01 254.433 -5.26326 1.66882 14.7601 +21 8192 329.38 303.904 200.405 -5.90744 0.580904 15.2133 +22 8192 312.408 285.1 202.191 -5.84502 0.577066 14.1928 +23 8192 296.274 266.237 203.907 -5.60241 0.555314 12.9031 +24 8192 274.89 245.303 208.036 -6.07585 0.638724 13.0994 +25 8192 252.039 219.997 210.242 -5.99335 0.626753 12.0956 +26 8192 225.827 191.506 211.442 -6.00572 0.603926 11.2926 +21 8195 374.415 363.283 221.803 -11.347 2.36208 34.8182 +22 8195 368.081 362.036 222.966 -21.455 4.45238 64.1076 +23 8195 363.724 358.44 226.043 -24.9882 5.4065 73.3415 +24 8195 363.763 353.256 230.76 -12.5651 2.96014 36.8849 +21 8199 525.679 505.085 241.897 -2.18781 1.80082 18.8196 +22 8199 523.068 501.048 244.859 -2.10981 1.75645 17.6007 +23 8199 520.091 497.029 248.927 -2.08379 1.77181 16.8052 +24 8199 516.343 492.312 253.249 -2.08357 1.79698 16.1279 +21 8203 576.044 572.242 167.539 -4.73594 -0.750976 101.958 +22 8203 576.687 572.939 166.806 -4.71102 -0.866782 103.405 +23 8203 577.5 573.742 166.996 -4.58227 -0.837253 103.13 +21 8205 616.594 607.05 205.443 0.395923 1.83431 40.6121 +22 8205 617.658 608.152 205.845 0.457649 1.86426 40.7732 +23 8205 619.031 609.228 206.811 0.519002 1.86068 39.5369 +24 8205 620.592 610.77 207.942 0.603345 1.9188 39.4573 +21 8206 564.627 551.925 217.246 -1.90023 1.87736 30.5143 +22 8206 564.729 551.036 218.166 -1.75859 1.77749 28.3042 +23 8206 564.534 550.839 219.78 -1.76591 1.84047 28.2992 +21 8208 627.031 620.373 176.893 1.40951 0.325845 58.209 +22 8208 628.324 621.626 176.633 1.50484 0.30303 57.8653 +23 8208 629.795 622.948 176.667 1.58756 0.299166 56.6066 +24 8208 631.341 624.381 177.14 1.68106 0.330811 55.6858 +21 8209 613.549 607.539 182.429 0.356604 0.855903 64.4967 +22 8209 611.523 605.554 182.402 0.17673 0.859144 64.9226 +21 8210 627.868 621.275 190.95 1.49161 1.4743 58.7845 +22 8210 629.244 622.295 190.799 1.52171 1.38725 55.7792 +21 8217 738.409 714.074 142.906 2.84405 -0.661026 15.9262 +22 8217 747.451 721.565 140.759 2.86135 -0.665989 14.9724 +23 8217 757.428 729.837 138.56 2.87875 -0.667651 14.0471 +24 8217 768.586 739.388 136.774 2.92553 -0.663743 13.2737 +21 8218 793.933 778.954 181.261 6.61151 0.301485 25.8738 +22 8218 801.933 786.301 181.434 6.61038 0.294818 24.7936 +23 8218 810.544 794.322 182.154 6.65533 0.307951 23.8927 +24 8218 819.941 802.765 182.607 6.57928 0.305013 22.5647 +25 8218 830.021 811.707 182.765 6.46607 0.290696 21.1624 +26 8218 840.705 821.209 181.664 6.36864 0.242745 19.8802 +21 8227 707.273 683.575 227.821 2.21482 1.24591 16.3547 +22 8227 713.995 689.518 229.826 2.2919 1.25028 15.8346 +23 8227 721.417 695.628 232.739 2.32987 1.24733 15.0288 +21 8228 723.454 696.841 233.005 2.29881 1.21406 14.5633 +22 8228 732.536 703.823 236.529 2.30059 1.19121 13.4982 +21 8229 768.939 730.407 236.354 2.22177 0.885196 10.0583 +22 8229 786.113 744.157 241.485 2.26038 0.87867 9.23769 +21 8230 839.108 834.195 130.096 25.0986 -4.67512 78.892 +22 8230 843.082 838.194 129.23 25.6593 -4.79333 79.2821 +21 8231 839.108 834.195 130.096 25.0986 -4.67512 78.892 +22 8231 843.082 838.194 129.23 25.6593 -4.79333 79.2821 +23 8231 847.045 842.402 128.73 27.4726 -5.10432 83.4683 +24 8231 851.154 846.455 128.418 27.6173 -5.07955 82.4806 +21 8235 874.289 845.33 181.264 4.91026 0.155986 13.3832 +22 8235 892.346 866.614 181.364 5.90307 0.177652 15.0618 +21 8242 939.165 907.863 194.266 5.65606 0.367432 12.3816 +22 8242 966.06 932.304 195.878 5.67297 0.366378 11.4818 +21 8246 977.569 949.472 139.165 7.0354 -0.644042 13.7939 +22 8246 1004.65 974.77 136.409 7.10195 -0.655121 12.9699 +23 8246 1034.99 1003.49 132.837 7.25445 -0.682373 12.3037 +21 8247 1040.32 1002.19 187.215 6.06698 0.202258 10.1623 +22 8247 1082.59 1041.64 188.29 6.20484 0.202475 9.46459 +23 8247 1134.38 1088.59 188.963 6.15539 0.18893 8.46252 +21 8251 1046.43 1017.2 151.461 8.02824 -0.393137 13.2595 +22 8251 1079.73 1048.48 149.801 8.08036 -0.396191 12.4003 +21 8253 1007.28 978.127 128.85 7.32897 -0.810884 13.2962 +22 8253 1037.24 1006.17 125.056 7.39379 -0.826332 12.474 +23 8253 1071.81 1038.42 120.81 7.43704 -0.837333 11.6087 +21 8254 1049.77 1020.48 127.993 8.07495 -0.822912 13.2355 +22 8254 1083.41 1052.58 124.514 8.25647 -0.842277 12.5722 +23 8254 1121.61 1088.16 120.117 8.22051 -0.846638 11.5835 +24 8254 1166.54 1130.6 115.957 8.32454 -0.850374 10.7839 +25 8254 1219.38 1180.11 111.13 8.34201 -0.844345 9.87021 +21 8269 189.203 138.985 252.272 -4.49632 0.849487 7.71789 +22 8269 136.783 80.1281 261.809 -4.48244 0.843392 6.84097 +21 8273 248.994 205.172 270.149 -4.41971 1.19262 8.84439 +22 8273 211.764 167.005 278.372 -4.77384 1.26629 8.65899 +21 8274 324.643 300.099 255.141 -6.23552 1.8009 15.7912 +22 8274 308.868 281.882 259.835 -5.98524 1.73136 14.3622 +23 8274 290.789 262.022 265.981 -5.95234 1.73894 13.4731 +21 8275 411.02 376.275 282.157 -3.06941 1.68982 11.1549 +22 8275 395.243 358.146 291.144 -3.10324 1.71281 10.4477 +23 8275 377.336 336.71 302.322 -3.07048 1.71184 9.54024 +24 8275 356.037 311.226 315.397 -3.039 1.70867 8.64914 +25 8275 329.9 281.197 330.417 -3.0844 1.73778 7.95795 +21 8279 394.495 356.227 297.179 -3.01879 1.74512 10.128 +22 8279 375.4 333.793 308.631 -3.02302 1.7529 9.31512 +23 8279 352.805 306.759 323.13 -2.9952 1.75306 8.41718 +24 8279 325.06 273.771 340.761 -2.97954 1.75847 7.55661 +21 8283 345.626 299.672 324.441 -3.08514 1.77191 8.4341 +22 8283 316.289 264.714 341.899 -3.05437 1.76058 7.51471 +21 8289 427.877 392.801 284.924 -2.78226 1.71623 11.0495 +22 8289 413.47 375.907 294.229 -2.80408 1.73567 10.318 +21 8293 554.724 516.593 290.71 -0.77246 1.66022 10.1642 +22 8293 551.363 509.68 301.338 -0.749953 1.65573 9.29819 +21 8294 554.724 516.593 290.71 -0.77246 1.66022 10.1642 +22 8294 551.363 509.68 301.338 -0.749953 1.65573 9.29819 +23 8294 547.154 499.713 315.09 -0.706584 1.61048 8.16963 +21 8295 463.816 439.222 253.549 -3.18314 1.76244 15.7589 +22 8295 456.543 431.559 257.678 -3.28983 1.8237 15.513 +21 8297 649.631 614.883 279.087 0.619455 1.64221 11.1539 +22 8297 654.337 616.757 287.843 0.640039 1.64362 10.3135 +23 8297 661.43 621.069 298.539 0.690329 1.67269 9.60263 +24 8297 667.421 622.368 311.397 0.689856 1.65176 8.60246 +25 8297 675.569 625.892 326.637 0.713756 1.66285 7.80195 +21 8298 636.118 590.322 314.036 0.311514 1.65598 8.46322 +22 8298 640.213 589.715 329.406 0.326065 1.66527 7.67513 +21 8299 616.09 589.454 255.711 0.1317 1.67096 14.551 +22 8299 617.223 587.825 260.938 0.140033 1.60944 13.1837 +23 8299 619.871 590.662 266.935 0.189636 1.73016 13.2691 +21 8304 784.629 741.986 303.335 2.20527 1.64362 9.08889 +22 8304 802.735 757.171 315.825 2.27734 1.68547 8.50618 +21 8305 700.979 673.519 259.299 1.78829 1.69098 14.1142 +22 8305 708.98 679.073 264.731 1.78568 1.65019 12.9594 +23 8305 717.457 685.407 272.336 1.80832 1.66726 12.0926 +24 8305 727.5 692.806 281.091 1.82603 1.67579 11.1713 +25 8305 738.003 699.853 291.826 1.80851 1.67515 10.1594 +21 8308 890.616 850.818 275.065 3.79342 1.37954 9.73861 +22 8308 920.545 876.452 285.03 3.78852 1.36656 8.78999 +21 8311 892.902 851.071 252.425 3.63841 1.02177 9.26529 +22 8311 924.897 878.047 260.518 3.61543 1.00508 8.27261 +23 8311 964.18 911.994 270.869 3.65014 1.00887 7.42685 +24 8311 1014.12 954.561 284.351 3.64862 1.00556 6.50735 +25 8311 1078.78 1009.75 300.177 3.65098 0.99069 5.61421 +21 8313 881.312 839.125 292.36 3.46012 1.52162 9.18707 +22 8313 911.557 865.138 304.695 3.49461 1.52562 8.34939 +21 8314 904.731 864.294 257.241 3.92102 1.12099 9.58483 +22 8314 937.288 892.364 264.81 3.91867 1.09953 8.62749 +21 8315 904.731 864.294 257.241 3.92102 1.12099 9.58483 +22 8315 937.288 892.364 264.81 3.91867 1.09953 8.62749 +21 8316 1099.88 1054.07 259.577 5.74896 1.01681 8.45988 +22 8316 1160.26 1108.87 268.119 5.75648 0.995807 7.54229 +21 8317 1100 1053.88 281.804 5.71313 1.26917 8.40526 +22 8317 1160.16 1108.94 294.043 5.77463 1.27102 7.56744 +21 8318 1004.86 953.09 309.892 4.10144 1.42183 7.4863 +22 8318 1059.72 1000.73 327.913 4.09864 1.41178 6.56946 +21 8321 976.444 929.181 299.045 4.16969 1.43418 8.20036 +22 8321 1022.88 969.42 314.064 4.15299 1.41886 7.24991 +23 8321 1081.43 1021.78 333.375 4.24862 1.44528 6.4965 +21 8322 976.211 923.949 317.896 3.76849 1.49076 7.41605 +22 8322 1028.34 968.238 337.131 3.74263 1.46813 6.44832 +23 8322 1096.71 1026.93 362.371 3.75003 1.45888 5.55433 +22 8336 510.325 501.361 116.997 -5.94621 -3.34698 43.2352 +23 8336 509.282 500.247 116.189 -5.9622 -3.36913 42.9005 +22 8343 509.883 485.821 250.236 -2.22513 1.72744 16.1073 +23 8343 506.913 481.754 255.932 -2.19152 1.77373 15.405 +24 8343 501.482 475.943 260.327 -2.27322 1.83984 15.1763 +25 8343 496.102 468.275 264.427 -2.19003 1.76762 13.9276 +22 8346 912.028 884.132 178.467 5.82408 0.108085 13.8933 +23 8346 935.293 904.118 177.463 5.61231 0.0794055 12.4319 +22 8361 96.593 65.6225 39.0154 -8.89686 -2.32129 12.5143 +23 8361 59.5675 26.2641 30.0413 -8.87081 -2.30342 11.6377 +22 8366 74.8142 45.763 64.4625 -9.88735 -2.00414 13.3411 +23 8366 37.4603 5.73587 56.6805 -9.68666 -1.96703 12.2169 +22 8368 117.375 84.6576 35.7576 -8.08072 -2.25086 11.8463 +23 8368 79.9366 44.9309 25.8696 -8.12688 -2.25543 11.0718 +22 8370 135.746 101.375 44.7853 -7.40477 -2.00146 11.2762 +23 8370 96.6992 60.6263 34.7567 -7.63683 -2.05636 10.7442 +24 8370 52.9994 14.5462 23.0676 -7.77456 -2.09236 10.0791 +22 8383 229.194 194.91 52.3158 -5.95946 -1.88856 11.3049 +23 8383 198.862 161.869 42.8708 -5.96346 -1.8874 10.477 +24 8383 163.539 123.079 31.2062 -5.92136 -1.88052 9.57913 +25 8383 120.387 76.3998 16.6639 -5.97358 -1.90733 8.81114 +22 8385 142.616 110.091 62.8959 -7.71144 -1.81593 11.916 +23 8385 107.26 73.0681 54.9378 -7.8911 -1.85246 11.3353 +22 8393 163.142 129.663 39.1275 -7.16239 -2.14553 11.5765 +23 8393 127.762 89.2263 28.1049 -6.71578 -2.01766 10.0575 +22 8399 309.781 277.861 43.3644 -5.04461 -2.17903 12.1419 +23 8399 287.988 253.659 33.9288 -5.03161 -2.17376 11.2899 +24 8399 263.093 225.939 22.9368 -5.00888 -2.16736 10.4313 +25 8399 233.419 192.833 9.08467 -4.97825 -2.1675 9.5496 +22 8401 396.844 366.251 50.2175 -3.73484 -2.15325 12.6687 +23 8401 382.772 349.725 42.7261 -3.68625 -2.11513 11.728 +24 8401 366.411 330.545 31.8822 -3.64156 -2.11129 10.8063 +22 8403 298.021 265.275 62.8201 -5.11031 -1.80494 11.8357 +23 8403 274.504 240.029 54.7923 -5.22058 -1.83955 11.2424 +24 8403 248.048 211.043 45.4633 -5.24758 -1.84916 10.4736 +25 8403 217.164 176.771 33.3014 -5.21803 -1.85575 9.59493 +26 8403 179.679 134.488 17.9261 -5.10966 -1.84151 8.57637 +22 8404 384.018 352.096 63.0336 -3.79521 -1.84796 12.1414 +23 8404 368.046 333.467 55.0886 -3.75166 -1.82936 11.2083 +24 8404 349.613 312.309 45.6498 -3.74302 -1.83164 10.3896 +22 8405 280.527 248.402 78.1821 -5.50164 -1.58297 12.0646 +23 8405 256.39 221.063 71.3096 -5.37011 -1.54403 10.9713 +24 8405 227.702 189.211 63.2835 -5.32889 -1.52908 10.0692 +25 8405 192.735 151.685 52.7247 -5.45422 -1.57191 9.44144 +22 8407 385.785 355.292 100.053 -3.94196 -1.28244 12.7104 +23 8407 370.659 338.181 95.2349 -3.95112 -1.28372 11.9333 +24 8407 354.159 318.959 89.9922 -3.89746 -1.26448 11.0108 +25 8407 332.957 294.966 83.0562 -3.91083 -1.26964 10.2017 +22 8408 375.67 346.728 110.047 -4.34075 -1.16563 13.391 +23 8408 360.075 329.793 105.928 -4.42549 -1.18717 12.799 +22 8409 375.67 346.728 110.047 -4.34075 -1.16563 13.391 +23 8409 360.075 329.793 105.928 -4.42549 -1.18717 12.799 +22 8413 316.143 284.138 56.7624 -4.92447 -1.94839 12.1097 +23 8413 294.815 260.303 48.1282 -4.89879 -1.94128 11.2303 +24 8413 270.165 232.788 38.0762 -4.87741 -1.93688 10.3692 +25 8413 240.763 199.804 25.1938 -4.83662 -1.9365 9.46267 +22 8416 408.435 377.932 63.2807 -3.54183 -1.9296 12.7064 +23 8416 394.912 362.087 55.6222 -3.51248 -1.91838 11.8072 +24 8416 379.67 344.344 46.779 -3.49566 -1.91707 10.9716 +25 8416 361.368 323.23 35.7454 -3.49554 -1.93105 10.1622 +26 8416 339.679 298.27 21.7539 -3.50085 -1.96005 9.35967 +22 8417 295.961 263.783 82.3343 -5.23493 -1.51106 12.0447 +23 8417 272.903 238.211 76.0914 -5.21255 -1.49821 11.1718 +22 8420 399.734 368.491 32.49 -3.60739 -2.41319 12.4049 +23 8420 385.62 353.82 22.7112 -3.78259 -2.53608 12.1876 +22 8427 479.953 469.138 73.2114 -6.4374 -4.94914 35.838 +23 8427 477.692 466.955 70.9219 -6.59706 -5.09948 36.0972 +24 8427 475.753 464.693 69.0118 -6.49862 -5.04333 35.0431 +25 8427 473.307 461.915 66.1795 -6.42491 -5.03017 34.0236 +26 8427 470.571 458.951 61.7887 -6.42496 -5.13416 33.3542 +22 8428 424.392 393.637 74.3647 -3.23401 -1.72015 12.6019 +23 8428 411.66 378.618 67.3358 -3.21718 -1.71537 11.7298 +24 8428 397.697 361.847 59.4154 -3.17442 -1.69969 10.8111 +25 8428 380.547 342.379 49.4538 -3.22294 -1.73664 10.1544 +26 8428 360.099 317.981 36.8369 -3.18144 -1.73467 9.20199 +22 8434 505.993 497.621 88.1378 -6.64446 -5.4351 46.2914 +23 8434 505.087 496.589 86.5993 -6.60366 -5.45212 45.6081 +24 8434 504.279 495.719 84.8615 -6.6065 -5.52166 45.2776 +22 8437 528.542 518.472 59.4001 -4.32155 -6.05174 38.4875 +23 8437 528 518.347 55.7046 -4.53865 -6.51917 40.1524 +22 8443 653.458 640.544 63.0843 1.82599 -4.56598 30.0131 +23 8443 655.783 642.544 59.6679 1.87552 -4.59255 29.2765 +24 8443 658.701 644.963 56.2251 1.92151 -4.56038 28.2133 +25 8443 661.455 647.085 52.1539 1.93989 -4.51183 26.9714 +26 8443 663.758 649.48 46.7374 2.03891 -4.74436 27.1434 +22 8444 641.514 628.244 85.5024 1.29349 -3.5359 29.207 +23 8444 643.657 629.984 82.7904 1.33952 -3.53809 28.3451 +24 8444 646.084 631.829 80.1892 1.37635 -3.49187 27.1896 +25 8444 648.221 633.603 76.9298 1.42063 -3.52472 26.5128 +26 8444 650.445 635.216 72.1965 1.44212 -3.55036 25.4499 +22 8445 612.04 599.352 97.1997 0.105033 -3.20276 30.5457 +23 8445 613.24 600.092 94.8226 0.15037 -3.18777 29.4766 +24 8445 614.798 600.856 92.6361 0.201837 -3.09058 27.7989 +25 8445 615.889 601.426 89.824 0.235074 -3.08366 26.7973 +26 8445 616.922 601.714 85.6815 0.260039 -3.07895 25.4849 +22 8447 603.22 595.859 46.1224 -0.462577 -9.24744 52.6496 +23 8447 604.227 596.708 44.143 -0.380896 -9.19458 51.5436 +22 8449 628.289 617.074 57.6759 0.897038 -5.51634 34.5574 +23 8449 630.385 617.915 54.8202 0.897115 -5.08467 31.0824 +22 8452 620.612 606.493 90.8842 0.42049 -3.11847 27.4503 +23 8452 622.408 607.539 88.404 0.464172 -3.05091 26.0669 +22 8460 767.459 739.814 32.208 3.068 -2.73276 14.0195 +23 8460 779.551 749.833 22.1151 3.07256 -2.72457 13.0416 +22 8461 797.58 769.206 38.0056 3.55938 -2.55279 13.6593 +23 8461 811.281 781.811 28.4607 3.67684 -2.6319 13.1517 +22 8465 775.314 746.579 61.3783 3.09846 -2.08382 13.4877 +23 8465 788.253 757.292 53.7821 3.10012 -2.06575 12.5178 +22 8470 757.925 729.683 65.7749 2.82187 -2.03662 13.7235 +23 8470 769.52 739.188 58.4732 2.83269 -2.02553 12.7774 +22 8473 734.337 705.629 31.4497 2.33465 -2.64573 13.5003 +23 8473 744.561 713.182 21.9233 2.31096 -2.58363 12.3513 +22 8478 959.876 930.732 33.9973 6.45657 -2.55922 13.2984 +23 8478 986.286 954.683 23.0952 6.40328 -2.54548 12.2641 +22 8482 965.183 940.632 107.399 7.78066 -1.43209 15.7864 +23 8482 992.032 962.067 102.438 6.85628 -1.26228 12.9344 +22 8500 1080.03 1047.25 41.5047 7.70982 -2.15249 11.8242 +23 8500 1119.77 1084.79 30.7886 7.83495 -2.18159 11.0801 +24 8500 1166.82 1128.61 18.8358 7.8333 -2.16499 10.1424 +22 8504 1070.96 1039.18 98.1242 7.80011 -1.26334 12.1979 +23 8504 1109.33 1075.12 91.9221 7.848 -1.27089 11.3305 +24 8504 1154.57 1117.1 85.8273 7.81208 -1.24742 10.3424 +25 8504 1207.36 1166.75 77.6295 7.90567 -1.2593 9.54198 +22 8507 1051.43 1019.58 23.5773 7.45185 -2.51747 12.1683 +23 8507 1087.39 1053.11 11.6714 7.48829 -2.52598 11.3076 +22 8508 983.432 953.926 28.1576 6.80617 -2.63413 13.1352 +23 8508 1011.7 979.586 16.8903 6.72598 -2.60855 12.068 +22 8518 984.095 954.181 117.345 6.72531 -0.996743 12.9562 +23 8518 1013.07 980.818 112.934 6.72069 -0.997997 12.0176 +22 8521 1049.85 1017.87 33.5587 7.39551 -2.33973 12.1196 +23 8521 1086.21 1051.7 22.3478 7.41923 -2.34266 11.2309 +22 8538 125.93 114.193 175.711 -22.1345 0.130749 33.023 +23 8538 113.728 101.283 177.264 -21.3996 0.190343 31.1409 +22 8542 49.2692 36.9311 127.193 -24.3928 -1.98788 31.4129 +23 8542 33.7275 21.3997 126.736 -25.0904 -2.00947 31.4392 +22 8553 241.366 212.692 152.402 -6.89754 -0.383141 13.5169 +23 8553 217.33 186.623 151.565 -6.86108 -0.372396 12.6215 +22 8562 338.185 307.252 126.073 -4.7123 -0.812337 12.5292 +23 8562 319.499 285.978 122.679 -4.64791 -0.803995 11.5619 +22 8566 330.278 304.265 243.609 -5.76706 1.46107 14.8995 +23 8566 314.581 286.838 249.027 -5.71122 1.47482 13.97 +22 8568 317.052 290.79 245.132 -5.98291 1.47836 14.7582 +23 8568 300.112 272.188 250.142 -5.95256 1.48672 13.8796 +24 8568 281.093 251.326 255.538 -5.92714 1.49203 13.0201 +25 8568 259.122 227.258 260.688 -5.90754 1.48067 12.1634 +22 8569 534.26 527.953 141.419 -6.41305 -2.67723 61.4514 +23 8569 534.182 527.813 141.204 -6.35763 -2.66949 60.8572 +22 8573 480.014 470.89 205.807 -7.62713 1.94012 42.4813 +23 8573 478.455 469.24 206.902 -7.64231 1.9847 42.0598 +22 8576 474.548 450.846 250.617 -3.05971 1.76231 16.3519 +23 8576 468.603 443.659 255.522 -3.03539 1.78019 15.5378 +24 8576 461.762 435.138 260.634 -2.98195 1.77104 14.5577 +25 8576 453.357 425.005 265.971 -2.95929 1.76414 13.6698 +26 8576 444.304 413.526 270.527 -2.88415 1.70466 12.5928 +22 8577 480.58 470.466 127.223 -6.85034 -2.42353 38.3223 +23 8577 478.647 468.175 126.296 -6.71495 -2.38814 37.0103 +24 8577 476.995 465.956 125.914 -6.45047 -2.28408 35.1094 +25 8577 474.757 463.408 124.594 -6.37988 -2.28404 34.1488 +26 8577 472.186 460.553 121.836 -6.34351 -2.35585 33.3185 +22 8578 578.249 575.709 146.623 -6.62064 -5.54664 152.571 +23 8578 579.156 576.72 146.571 -6.70516 -5.79647 159.128 +24 8578 580.26 577.821 146.738 -6.45433 -5.75302 158.945 +22 8581 593.98 576.818 226.206 -0.487605 1.66987 22.5834 +23 8581 594.698 577.035 228.44 -0.451939 1.69041 21.9424 +22 8583 562.868 556.394 129.58 -3.87396 -3.59046 59.8657 +23 8583 563.275 557.08 128.984 -4.01344 -3.80405 62.5661 +24 8583 563.459 557.925 128.699 -4.4751 -4.28624 70.0414 +22 8586 583.463 565.729 229.153 -0.790487 1.70533 21.8559 +23 8586 583.91 565.264 231.663 -0.738877 1.69413 20.7855 +24 8586 583.999 564.57 234.523 -0.70664 1.7049 19.9478 +22 8587 637.776 630.123 152.393 1.98038 -1.43607 50.6409 +23 8587 639.095 631.562 151.672 2.10605 -1.51042 51.4501 +24 8587 640.791 632.781 151.522 2.09421 -1.43038 48.3815 +25 8587 642.124 634.249 150.281 2.22127 -1.53969 49.2166 +26 8587 643.361 635.353 147.949 2.26732 -1.67056 48.3988 +22 8590 810.604 805.82 138.238 22.5754 -3.88708 81.022 +23 8590 814.317 809.361 137.665 22.1914 -3.81373 78.1993 +22 8596 698.217 678.067 212.087 2.36342 1.04588 19.2347 +23 8596 703.789 682.64 214.143 2.39327 1.04866 18.3257 +24 8596 710.049 687.725 216.687 2.41789 1.05467 17.361 +25 8596 716.216 693.113 218.451 2.47976 1.06012 16.7757 +26 8596 722.856 698.5 220.021 2.49861 1.04021 15.9126 +22 8600 718.259 697.51 214.963 2.81394 1.09008 18.6786 +23 8600 725.098 703.201 217.164 2.8343 1.08698 17.7002 +24 8600 732.701 709.633 219.787 2.86746 1.09287 16.8017 +25 8600 740.428 716.023 222.08 2.88043 1.08347 15.8811 +26 8600 748.6 723.194 223.468 2.9397 1.07011 15.2553 +22 8608 802.419 786.763 177.345 6.61723 0.154102 24.7568 +23 8608 811.246 794.603 177.264 6.50925 0.142327 23.2869 +22 8610 744.117 715.878 134.974 2.55943 -0.720516 13.7244 +23 8610 751.926 727.577 132.726 3.1407 -0.885253 15.9176 +22 8621 913.315 884.705 190.634 5.70289 0.333807 13.5466 +23 8621 936.386 905.63 191.908 5.70788 0.332778 12.6013 +24 8621 962.668 929.303 193.45 5.68472 0.331574 11.6161 +25 8621 992.198 956.309 194.511 5.72692 0.324131 10.7992 +22 8629 948.843 935.834 172.272 14.0092 -0.0240359 29.7926 +23 8629 961.3 948.192 171.459 14.4136 -0.0571521 29.567 +22 8632 1081.12 1049.8 133.041 8.08805 -0.682858 12.3756 +23 8632 1119.42 1085.96 129.436 8.18614 -0.697113 11.5848 +24 8632 1164.61 1128.06 126.16 8.15616 -0.686141 10.6026 +22 8633 1030.1 999.068 138.353 7.28047 -0.597299 12.4915 +23 8633 1063.29 1030.42 135.257 7.41478 -0.614393 11.7912 +24 8633 1101.59 1066.65 132.16 7.56374 -0.62556 11.0917 +25 8633 1145.98 1108.36 128.044 7.66064 -0.639943 10.3044 +26 8633 1199.28 1157.01 121.8 7.49416 -0.648792 9.16931 +22 8634 1072.95 1031.05 192.239 5.93964 0.248476 9.24842 +23 8634 1123.73 1077.91 193.81 6.02706 0.245645 8.45776 +22 8635 990.079 955.053 193.86 5.83565 0.322154 11.0655 +23 8635 1025.09 986.769 194.877 5.825 0.308722 10.1147 +22 8639 1003.3 968.16 186.315 6.01868 0.205758 11.0293 +23 8639 1038.69 1001.12 187.065 6.13442 0.203144 10.3143 +24 8639 1080.29 1039.61 188.954 6.2157 0.212592 9.5275 +25 8639 1129.58 1084.58 189.95 6.20778 0.204088 8.61342 +22 8642 1037.09 1005.89 180.182 7.35998 0.126158 12.4214 +23 8642 1071.92 1038.12 180.325 7.34845 0.118744 11.4676 +24 8642 1110.67 1076.04 180.781 7.77295 0.122952 11.1921 +25 8642 1158.18 1118.15 182.339 7.36158 0.12727 9.68183 +26 8642 1212.64 1171.17 181.406 7.8116 0.110767 9.34599 +22 8643 1048.32 1017.51 150.743 7.64964 -0.385495 12.5798 +23 8643 1083.28 1050.14 148.689 7.67862 -0.391688 11.6954 +22 8645 1059.46 1028.48 149.296 7.80012 -0.408438 12.5095 +23 8645 1096.03 1063.11 147.377 7.93878 -0.415762 11.7749 +24 8645 1138.93 1102.68 145.652 7.84321 -0.403027 10.6903 +25 8645 1187.49 1149.32 143.067 8.13278 -0.419167 10.1537 +22 8669 329.806 298.281 273.514 -4.76668 1.71513 12.2942 +23 8669 310.238 276.045 281.636 -4.70219 1.70892 11.335 +24 8669 287.23 250.648 290.717 -4.73297 1.73067 10.5948 +25 8669 260.008 220.599 300.725 -4.76433 1.74286 9.83446 +22 8673 365.903 323.259 313.034 -3.06915 1.76574 9.08865 +23 8673 341.738 294.656 328.319 -3.05552 1.77367 8.23188 +24 8673 311.792 259.302 347.128 -3.04716 1.7834 7.38376 +22 8674 355.14 310.916 313.999 -3.09022 1.71438 8.76392 +23 8674 328.703 280.245 329.817 -3.11329 1.73993 7.99824 +22 8678 310.536 284.074 252.234 -6.06978 1.61132 14.6463 +23 8678 292.988 264.866 257.779 -6.04686 1.62217 13.7822 +24 8678 273.363 243.266 263.819 -6.00024 1.62349 12.8776 +25 8678 250.365 218.297 269.901 -6.01665 1.62557 12.086 +26 8678 224.043 189.378 275.835 -5.97373 1.59572 11.1805 +22 8681 510.091 465.805 312.427 -1.20649 1.69293 8.75177 +23 8681 500.829 451.127 328.267 -1.17509 1.67961 7.79793 +24 8681 489.14 433.242 347.981 -1.15718 1.6829 6.93368 +22 8685 481.612 433.271 322.81 -1.42173 1.66628 8.01758 +23 8685 467.646 413.7 341.666 -1.41306 1.6809 7.1845 +24 8685 450.003 388.429 365.389 -1.39192 1.67961 6.29446 +22 8691 624.463 580.103 308.296 0.180471 1.64004 8.73696 +23 8691 627.806 579.727 323.242 0.203856 1.68016 8.06117 +22 8692 660.14 609.74 327.482 0.539075 1.64797 7.68989 +23 8692 667.62 611.314 347.236 0.553893 1.66357 6.88334 +22 8700 774.964 732.871 255.204 2.11072 1.05086 9.20749 +23 8700 793.875 747.368 263.81 2.12882 1.05053 8.33366 +24 8700 816.931 764.965 275.067 2.14353 1.05654 7.45827 +22 8701 722.805 683.403 298.093 1.54381 1.7073 9.83625 +23 8701 735.045 691.367 310.943 1.54323 1.69823 8.8735 +22 8709 1094.09 1048.91 278.671 5.76075 1.25809 8.57853 +23 8709 1151.84 1101.82 289.592 5.82366 1.25368 7.74876 +24 8709 1224.39 1167.96 305.162 5.85202 1.25932 6.86766 +22 8719 1109.11 1062.59 274.073 5.76867 1.16885 8.33213 +23 8719 1171.38 1120.16 285.693 5.89155 1.18328 7.56641 +22 8732 1120.99 1073.42 276.796 5.77532 1.17377 8.14799 +23 8732 1185.94 1132.66 289.131 5.81141 1.17238 7.27499 +23 8736 332.007 298.97 81.0159 -4.51281 -1.49322 11.7317 +24 8736 311.831 275.971 73.6207 -4.45961 -1.4864 10.8078 +25 8736 287.337 248.493 64.8704 -4.45584 -1.49325 9.97776 +26 8736 258.102 215.208 52.9831 -4.40124 -1.50112 9.03568 +23 8740 575.573 568.104 103.618 -2.44418 -4.97927 51.8911 +24 8740 576.074 568.628 102.412 -2.41571 -5.08184 52.0536 +25 8740 576.505 568.849 101.042 -2.31924 -5.03863 50.6264 +26 8740 576.817 569.187 98.5612 -2.30487 -5.22986 50.7928 +23 8751 366.231 324.113 308.996 -3.10326 1.73628 9.20205 +24 8751 342.037 295.801 323.81 -3.10792 1.75372 8.38242 +23 8758 139 103.907 30.0152 -7.20259 -2.18635 11.0442 +24 8758 99.0178 63.4794 18.3116 -7.71666 -2.33585 10.9058 +23 8765 119.926 86.2234 90.4503 -7.80376 -1.31335 11.4998 +24 8765 81.3864 42.8228 84.3087 -7.35689 -1.23334 10.0503 +23 8767 113.609 78.933 36.7234 -7.68254 -2.10874 11.177 +24 8767 73.6673 34.9215 24.7109 -7.42932 -2.05378 10.003 +23 8768 100.612 65.9033 70.0185 -7.87636 -1.59146 11.1664 +24 8768 59.3967 22.2207 61.3988 -7.94921 -1.6104 10.4254 +23 8772 97.5793 62.4202 59.3199 -7.8219 -1.73454 11.0235 +24 8772 55.1546 17.7405 49.7601 -7.95953 -1.76725 10.359 +23 8773 97.5793 62.4202 59.3199 -7.8219 -1.73454 11.0235 +24 8773 55.1546 17.7405 49.7601 -7.95953 -1.76725 10.359 +23 8781 205.474 167.915 46.0077 -5.77902 -1.81409 10.3191 +24 8781 170.351 130.089 34.9251 -5.85953 -1.84013 9.62613 +25 8781 128.742 84.024 20.2212 -5.77558 -1.83343 8.66712 +23 8783 200.444 163.153 34.0581 -5.893 -1.99925 10.3932 +24 8783 164.977 124.262 21.997 -5.86538 -1.99026 9.51925 +25 8783 121.464 77.0857 6.56448 -5.90793 -2.01277 8.73352 +23 8785 248.652 212.929 82.1541 -5.42686 -1.36383 10.8495 +24 8785 219.313 180.909 74.7861 -5.45836 -1.37167 10.0921 +25 8785 184.253 142.81 65.112 -5.51239 -1.39644 9.35185 +26 8785 142.176 95.7072 52.2726 -5.4027 -1.39385 8.34058 +23 8788 206.46 169.062 39.4343 -5.78978 -1.91633 10.3636 +24 8788 171.449 131.118 27.3828 -5.835 -1.93747 9.60985 +23 8790 398.33 365.845 33.6245 -3.49284 -2.30227 11.9312 +24 8790 382.992 352.796 23.1377 -4.0304 -2.6633 12.8354 +23 8791 280.984 246.245 34.6332 -5.08072 -2.13729 11.157 +24 8791 254.742 217.428 23.3171 -5.1077 -2.15263 10.3868 +23 8792 382.772 349.725 42.7261 -3.68625 -2.11513 11.728 +24 8792 366.411 330.545 31.8822 -3.64156 -2.11129 10.8063 +23 8793 389.971 357.294 49.7582 -3.60956 -2.02344 11.8606 +24 8793 374.2 339.147 40.5397 -3.60661 -2.02757 11.0568 +25 8793 355.928 317.757 28.7458 -3.56915 -2.02792 10.1536 +26 8793 333.765 292.072 14.0131 -3.55316 -2.0464 9.29583 +23 8794 372.897 339.278 51.789 -3.78133 -1.93434 11.5285 +24 8794 355.201 318.91 42.1756 -3.7649 -1.93424 10.6799 +25 8794 334.281 294.219 30.6993 -3.69095 -1.90602 9.67441 +23 8796 366.551 331.751 60.7469 -3.75092 -1.73041 11.1372 +24 8796 347.832 310.437 51.9002 -3.75945 -1.73738 10.3642 +25 8796 325.57 285.316 40.7348 -3.7896 -1.76302 9.62831 +26 8796 299.134 257.111 26.122 -3.968 -1.87559 9.22302 +23 8798 413.042 379.966 73.6972 -3.19142 -1.6103 11.7177 +24 8798 399.014 363.128 66.2675 -3.15147 -1.5954 10.8001 +25 8798 381.98 343.544 56.835 -3.18053 -1.62142 10.0838 +26 8798 362.045 319.406 44.5861 -3.11806 -1.61586 9.08958 +23 8802 309.687 276.855 92.4811 -4.90606 -1.31494 11.8047 +24 8802 288.119 253.14 86.5741 -4.93619 -1.32495 11.0803 +25 8802 262.101 224.725 78.6047 -4.99341 -1.35448 10.3694 +26 8802 231.977 190.98 68.0783 -4.94724 -1.37281 9.45388 +23 8803 318.824 285.849 114.638 -4.73598 -0.948321 11.7536 +24 8803 297.236 261.168 110.077 -4.65136 -0.934925 10.7457 +23 8808 329.645 296.438 90.9464 -4.5278 -1.32491 11.6713 +24 8808 308.439 272.65 84.9223 -4.51947 -1.31975 10.8294 +23 8812 356.825 321.711 54.8936 -3.86613 -1.80447 11.0375 +24 8812 336.266 299.31 45.3344 -3.9722 -1.85344 10.4872 +23 8814 417.571 383.67 48.8877 -3.04201 -1.96422 11.4326 +24 8814 404.075 367.187 39.7824 -2.9922 -1.93775 10.5068 +23 8817 526.032 518.743 116.613 -6.15552 -4.14466 53.1734 +24 8817 525.912 518.466 116.001 -6.03445 -4.10143 52.0527 +25 8817 525.377 517.807 114.804 -5.97331 -4.11905 51.1983 +26 8817 524.858 517.07 112.405 -5.84226 -4.16945 49.7678 +23 8819 487.77 476.896 65.0954 -6.01653 -5.32337 35.6446 +24 8819 486.303 475.339 63.1593 -6.03868 -5.37424 35.3501 +23 8823 499.502 490.333 63.989 -6.44725 -6.37741 42.2684 +24 8823 498.164 488.635 62.2482 -6.27926 -6.23477 40.6725 +25 8823 496.471 487.706 59.397 -6.9307 -6.95331 44.22 +26 8823 495.577 486.008 55.8239 -6.3986 -6.56967 40.5047 +23 8827 517.919 509.882 110.784 -6.12443 -4.14823 48.2215 +24 8827 517.461 509.081 110.031 -5.904 -4.02728 46.2543 +23 8830 618.915 605.113 84.2025 0.364103 -3.45011 28.0805 +24 8830 620.567 606.23 81.6706 0.412407 -3.41611 27.0318 +25 8830 621.899 607.078 78.4168 0.447221 -3.42262 26.1502 +26 8830 623.13 607.954 73.8188 0.48034 -3.50528 25.5383 +23 8833 612.856 605.612 13.8579 0.244447 -11.7911 53.509 +24 8833 614.307 606.907 11.4278 0.344597 -11.7174 52.3739 +25 8833 615.334 607.875 8.35151 0.415855 -11.8459 51.9582 +23 8837 563.318 556.137 49.8958 -3.45905 -9.19775 53.9738 +24 8837 563.618 556.196 47.2119 -3.32495 -9.09314 52.2201 +25 8837 563.994 556.195 43.4754 -3.13852 -8.91148 49.6988 +26 8837 564.114 557.957 39.5602 -3.96462 -11.6284 62.9463 +23 8839 659.336 645.058 77.7919 1.87267 -3.57636 27.1452 +24 8839 662.381 647.244 75.0053 1.87439 -3.47218 25.6039 +25 8839 665.322 649.564 71.4236 1.90086 -3.4576 24.5961 +23 8841 604.281 595.977 113.219 -0.341406 -3.85755 46.6731 +24 8841 605.568 596.622 112.291 -0.239681 -3.63661 43.3262 +25 8841 606.311 597.43 111.163 -0.196437 -3.73099 43.6379 +23 8847 594.194 586.446 49.7486 -1.0651 -8.53375 50.0175 +24 8847 595.255 587.418 47.8392 -0.980462 -8.56892 49.4565 +25 8847 595.74 587.943 45.5279 -0.952053 -8.77202 49.7097 +26 8847 596.017 588.193 41.9758 -0.929661 -8.98488 49.5341 +23 8851 797.187 766.528 28.3181 3.28726 -2.53229 12.6415 +24 8851 812.297 779.532 18.4169 3.32368 -2.53185 11.8289 +23 8856 734.359 705.471 95.2715 2.32055 -1.44258 13.4164 +24 8856 744.628 713.7 89.9628 2.34578 -1.43959 12.5311 +25 8856 755.958 722.602 83.3107 2.35756 -1.44198 11.6194 +23 8857 740.307 711.024 100.074 2.39836 -1.33504 13.2355 +24 8857 750.888 719.437 94.9315 2.41377 -1.33085 12.3232 +25 8857 762.856 729.103 88.9383 2.43959 -1.33545 11.4827 +23 8862 788.053 758.033 45.4533 3.19377 -2.27957 12.9104 +24 8862 803.306 770.042 36.4166 3.12867 -2.20323 11.6516 +25 8862 818.578 784.419 25.0559 3.28686 -2.32416 11.3464 +23 8865 749.182 718.922 58.8431 2.47841 -2.02378 12.8078 +24 8865 760.932 728.325 50.6868 2.49363 -2.01251 11.8862 +25 8865 774.017 738.772 40.8912 2.50644 -2.0112 10.9967 +23 8870 737.169 707.599 82.9748 2.31807 -1.63269 13.107 +24 8870 747.616 715.823 76.6398 2.33249 -1.62555 12.1904 +25 8870 759.451 725.183 68.99 2.34954 -1.62806 11.3101 +26 8870 772.865 735.976 58.8782 2.37791 -1.65961 10.5064 +23 8871 737.169 707.599 82.9748 2.31807 -1.63269 13.107 +24 8871 747.616 715.823 76.6398 2.33249 -1.62555 12.1904 +23 8880 803.5 775.056 104.599 3.66249 -1.28897 13.6259 +24 8880 818.654 787.903 100.439 3.65241 -1.26493 12.6036 +25 8880 834.262 802.336 95.0053 3.78058 -1.30979 12.1397 +23 8881 798.113 768.549 36.3075 3.42583 -2.48091 13.1096 +24 8881 815.142 780.351 25.8364 3.17408 -2.26987 11.1401 +23 8882 743.356 714.82 123.19 2.51857 -0.934862 13.5821 +24 8882 754.529 725.196 120.236 2.6547 -0.963548 13.2129 +23 8889 870.641 864.364 87.9806 22.3422 -7.26308 61.746 +24 8889 875.947 869.569 86.8664 22.4318 -7.24079 60.7588 +23 8899 840.641 815.101 49.5028 4.85999 -2.59425 15.175 +24 8899 856.499 829.3 41.9999 4.87683 -2.58424 14.2497 +23 8902 879.159 873.879 65.6525 27.427 -10.9059 73.4038 +24 8902 883.891 878.049 64.2763 25.2239 -9.98336 66.343 +23 8909 1062.48 1028 22.8323 7.05516 -2.33688 11.2394 +24 8909 1102.18 1064.84 10.1258 7.08639 -2.34087 10.3794 +23 8910 1088.16 1054.98 78.3888 7.74776 -1.52923 11.6805 +24 8910 1130.57 1093.79 70.4607 7.60888 -1.49535 10.5373 +25 8910 1178.15 1139.15 61.0376 7.8321 -1.54023 9.93889 +23 8911 1064.81 1031.74 80.1722 7.39452 -1.50539 11.7197 +24 8911 1103.97 1068.44 72.6641 7.47551 -1.51487 10.9097 +25 8911 1148.52 1110.4 63.2581 7.59365 -1.54413 10.166 +23 8912 1029.83 997.735 97.6453 7.03471 -1.2589 12.0776 +24 8912 1064.89 1030.13 92.1808 7.03757 -1.24689 11.1522 +25 8912 1105.19 1067.69 85.012 7.09888 -1.25815 10.3345 +23 8913 1029.83 997.735 97.6453 7.03471 -1.2589 12.0776 +24 8913 1064.89 1030.13 92.1808 7.03757 -1.24689 11.1522 +25 8913 1105.19 1067.69 85.012 7.09888 -1.25815 10.3345 +26 8913 1154.22 1111.9 74.5844 6.91265 -1.2472 9.15746 +23 8917 987.718 956.406 112.938 6.48733 -1.02786 12.378 +24 8917 1018.54 984.873 108.652 6.5245 -1.0242 11.5106 +25 8917 1053.47 1017.17 102.874 6.56815 -1.03542 10.6759 +23 8918 1076.35 1042.86 113.762 7.48645 -0.947723 11.5721 +24 8918 1117.26 1080.69 109.119 7.45738 -0.936162 10.5982 +25 8918 1164.81 1124.96 103.131 7.4852 -0.939928 9.72691 +23 8919 1022.08 990.041 121.933 6.91618 -0.853728 12.097 +24 8919 1056.56 1022.24 118.046 6.99482 -0.857645 11.2907 +25 8919 1094.63 1058.65 113.64 7.24172 -0.884017 10.772 +23 8922 1005 972.698 22.1672 6.5748 -2.50537 11.9965 +24 8922 1038.09 1003.04 10.6711 6.56831 -2.48587 11.0594 +23 8925 980.413 948.375 41.4097 6.21768 -2.20378 12.0972 +24 8925 1010.62 976.296 31.5462 6.27566 -2.21111 11.2902 +23 8928 995.121 963.819 111.793 6.61642 -1.04783 12.3819 +24 8928 1026.65 992.697 107.742 6.59771 -1.02995 11.4134 +23 8929 995.121 963.819 111.793 6.61642 -1.04783 12.3819 +24 8929 1026.65 992.697 107.742 6.59771 -1.02995 11.4134 +23 8931 1078.04 1044.15 106.483 7.42625 -1.0521 11.4376 +24 8931 1119.04 1082.63 101.188 7.51492 -1.05707 10.6427 +25 8931 1166.69 1127.06 94.3015 7.55151 -1.06472 9.77988 +26 8931 1224.45 1180.49 85.0143 7.51281 -1.07323 8.8158 +23 8932 1056.22 1023.1 123.354 7.24406 -0.802805 11.7021 +24 8932 1094.46 1058.76 119.54 7.29596 -0.802172 10.8564 +25 8932 1137.93 1100.03 114.603 7.4876 -0.825481 10.2249 +26 8932 1190.23 1146.71 107.141 7.16827 -0.811216 8.90731 +23 8933 992.767 961.469 65.4686 6.57682 -1.84301 12.3834 +24 8933 1023.73 989.931 57.4664 6.58247 -1.83388 11.4675 +23 8935 1099.55 1066.49 27.1798 7.96214 -2.36714 11.7247 +24 8935 1144.95 1106.76 13.3215 7.52892 -2.24341 10.1466 +23 8942 1116.65 1081.69 87.1883 7.79132 -1.31624 11.0863 +24 8942 1162.89 1125.28 80.2008 7.90338 -1.3234 10.306 +25 8942 1217.28 1176.1 71.2618 7.92712 -1.32517 9.41176 +23 8943 1135.03 1100.53 88.873 8.18053 -1.30741 11.2329 +24 8943 1182.73 1145.14 81.8574 8.19054 -1.30032 10.3106 +23 8953 1121.68 1087.24 81.3728 7.9877 -1.42686 11.254 +24 8953 1167.44 1130.82 73.3666 8.18308 -1.45929 10.5835 +23 8957 72.7436 62.9926 190.952 -29.5715 0.996964 39.7472 +24 8957 61.9262 51.7761 191.762 -28.9811 1.00062 38.1842 +25 8957 49.7189 39.4233 191.982 -29.2085 0.997971 37.6447 +23 8970 161.865 135.956 229.046 -9.28167 1.16498 14.959 +24 8970 135.766 108.079 233.085 -9.19214 1.16854 13.9987 +25 8970 105.935 76.4923 236.5 -9.18797 1.16114 13.1635 +26 8970 71.9046 40.5884 239.321 -9.22209 1.14008 12.3761 +23 8972 175.691 149.145 242.26 -8.77936 1.40443 14.6004 +24 8972 149.17 122.044 248.188 -9.11659 1.49176 14.2878 +23 8975 153.594 128.083 220.209 -9.60054 0.99708 15.1923 +24 8975 127.646 100.107 223.112 -9.39961 0.980272 14.0734 +25 8975 97.657 69.7349 224.96 -9.84772 1.00239 13.8806 +26 8975 64.3161 32.1031 226.657 -9.09189 0.897166 12.0316 +23 8976 155.15 127.055 241.593 -8.68789 1.31422 13.7951 +24 8976 127.072 99.9403 246.579 -9.55218 1.45959 14.2849 +25 8976 96.635 67.1583 250.453 -9.34696 1.41407 13.1485 +26 8976 61.3971 30.5051 254.135 -9.53143 1.41332 12.5461 +23 8980 306.735 279.133 242.917 -5.89318 1.36347 14.0416 +24 8980 288.444 258.882 247.322 -5.83483 1.35312 13.1107 +23 8983 298.67 264.48 129.928 -4.88429 -0.6744 11.3358 +24 8983 274.668 238.721 126.585 -5.00413 -0.691385 10.7816 +25 8983 245.102 206.352 125.355 -5.05205 -0.658427 10.0018 +23 8984 472.808 463.918 166.35 -8.26249 -0.392946 43.5953 +24 8984 471.633 462.623 166.587 -8.2228 -0.373648 43.0161 +25 8984 469.769 460.444 165.883 -8.0525 -0.40153 41.5636 +26 8984 467.293 458 163.884 -8.22298 -0.518467 41.7048 +23 8985 458.805 449.684 197.852 -8.87742 1.47206 42.4891 +24 8985 456.937 447.82 198.714 -8.99201 1.5236 42.5106 +25 8985 454.695 445.355 199.004 -8.90712 1.50403 41.4996 +26 8985 452.332 442.589 198.165 -8.66837 1.39546 39.7802 +23 8986 419.594 409.815 210.681 -10.4349 2.07786 39.6345 +24 8986 416.729 406.183 211.851 -9.82213 1.98638 36.7527 +23 8989 517.588 510.15 136.037 -6.64184 -2.65876 52.1068 +24 8989 517.268 509.698 135.662 -6.54844 -2.63891 51.196 +23 8990 484.822 475.736 154.552 -7.37445 -1.08202 42.6572 +24 8990 483.568 473.699 154.628 -6.85745 -0.992017 39.2718 +25 8990 481.892 471.08 154.062 -6.34226 -0.933571 35.8446 +26 8990 478.168 467.04 151.65 -6.34254 -1.02356 34.8301 +23 8994 503.486 495.033 205.754 -6.74078 2.09073 45.8525 +24 8994 502.733 494.002 206.707 -6.5725 2.08282 44.3927 +25 8994 501.539 492.523 206.928 -6.43505 2.02991 42.984 +26 8994 500.109 490.98 206.253 -6.44004 1.96523 42.4553 +23 8997 546.064 540.219 130.298 -5.83481 -3.91066 66.3049 +24 8997 546.539 540.81 130.169 -5.90834 -4.00182 67.6462 +25 8997 547.116 540.689 129.335 -5.2188 -3.6372 60.3041 +26 8997 546.813 540.411 127.259 -5.2645 -3.82548 60.5381 +23 8999 554.957 539.153 229.586 -1.8559 1.92827 24.5245 +24 8999 554.057 538.389 232.201 -1.90286 2.03466 24.7374 +23 9000 674.71 660.651 211.569 2.48919 1.47918 27.5675 +24 9000 678.286 663.64 213.202 2.52055 1.47976 26.4623 +25 9000 681.544 666.533 214.356 2.57592 1.48515 25.8199 +26 9000 684.95 669.356 214.371 2.59682 1.43003 24.8531 +23 9001 618.084 601.197 224.352 0.27117 1.63809 22.9511 +24 9001 620.17 602.265 226.76 0.318318 1.6172 21.6462 +23 9003 672.784 660.065 205.05 2.67 1.35963 30.4706 +24 9003 676.174 662.915 206.372 2.69862 1.35784 29.2299 +25 9003 679.066 665.256 206.9 2.70347 1.32424 28.0644 +26 9003 681.875 667.932 206.335 2.78603 1.28987 27.7979 +23 9004 583.419 569.547 218.817 -1.01217 1.77976 27.9389 +24 9004 583.719 569.349 220.639 -0.96596 1.78625 26.972 +25 9004 583.91 568.89 221.962 -0.917249 1.7562 25.8034 +26 9004 583.766 568.583 222.123 -0.912524 1.74306 25.5271 +23 9005 619.546 609.772 183.55 0.548825 0.587824 39.6537 +24 9005 621.206 611.242 184.047 0.627843 0.603353 38.8956 +23 9009 802.405 787.554 154.347 6.97517 -0.669389 26.0978 +24 9009 810.189 794.981 154.019 7.08619 -0.665247 25.4845 +23 9010 697.541 692.488 155.78 9.35253 -1.81495 76.7003 +24 9010 699.829 694.599 155.794 9.27185 -1.75229 74.1115 +23 9019 703.728 679.304 243.999 2.07097 1.56464 15.8681 +24 9019 710.246 684.763 248.193 2.12236 1.58808 15.2093 +23 9023 746.242 717.642 228.922 2.56706 1.05302 13.5513 +24 9023 757.218 727.024 232.556 2.62685 1.0621 12.8361 +23 9026 739.962 716.546 185.643 2.99138 0.293384 16.5518 +24 9026 747.592 723.986 187.381 3.14089 0.330556 16.4184 +23 9030 885.913 877.115 138.163 16.8718 -2.1179 44.0509 +24 9030 893.237 884.26 137.701 16.974 -2.10337 43.1736 +23 9032 867.65 853.867 166.462 10.0588 -0.249141 28.1212 +24 9032 877.63 863.311 166.47 10.0561 -0.239475 27.067 +25 9032 887.775 873.007 166.001 10.1193 -0.249259 26.2438 +23 9033 867.65 853.867 166.462 10.0588 -0.249141 28.1212 +24 9033 877.63 863.311 166.47 10.0561 -0.239475 27.067 +25 9033 887.775 873.007 166.001 10.1193 -0.249259 26.2438 +26 9033 898.98 883.148 164.547 9.81905 -0.281839 24.4793 +23 9035 888.565 842.253 213.256 3.23603 0.468602 8.36869 +24 9035 922.626 869.839 218.149 3.18569 0.460908 7.34219 +23 9039 863.983 850.408 178.94 10.0673 0.240823 28.5506 +24 9039 873.839 859.238 179.674 9.72228 0.250894 26.5438 +25 9039 883.707 869.062 179.822 10.0555 0.255593 26.4655 +26 9039 895.109 879.175 178.722 9.62637 0.197823 24.3243 +23 9040 867.369 860.762 127.714 20.9592 -3.66977 58.6591 +24 9040 872.6 866.181 127.054 22.0128 -3.83286 60.3826 +23 9044 861.816 816.035 236.033 2.95971 0.741269 8.46574 +24 9044 893.274 840.989 245.006 2.91478 0.741259 7.41282 +25 9044 933.31 872.55 256.064 2.86217 0.735633 6.37887 +26 9044 986.625 914.164 269.59 2.7952 0.717104 5.34878 +23 9045 858.463 854.785 135.481 36.3494 -5.4578 105.372 +24 9045 863.889 857.448 135.198 21.2112 -3.14049 60.1766 +25 9045 867.429 860.39 134.004 19.6775 -2.96458 55.0591 +23 9047 954.973 902.099 242.405 3.50912 0.706586 7.33023 +24 9047 1003.51 943.371 252.228 3.51893 0.709012 6.44514 +25 9047 1065.47 996.626 264.215 3.55726 0.712851 5.62984 +23 9049 871.532 849.23 160.463 6.30979 -0.298456 17.3787 +24 9049 887.61 864.945 160.723 6.58969 -0.287494 17.1001 +25 9049 904.17 880.465 161.1 6.67557 -0.266322 16.3493 +23 9050 1049.97 1017.36 145.766 7.25449 -0.446204 11.8853 +24 9050 1087.37 1052.13 143.798 7.28314 -0.442893 10.9982 +25 9050 1130.56 1092.49 140.706 7.35114 -0.453595 10.1806 +26 9050 1181.7 1140.06 136.09 7.38036 -0.474246 9.30758 +23 9051 1066.25 1033.21 152.913 7.42405 -0.324157 11.7294 +24 9051 1105.08 1069.88 151.177 7.56107 -0.33076 11.0098 +25 9051 1150.23 1112.05 148.977 7.60579 -0.335891 10.1501 +23 9052 1084.4 1050.94 178.204 7.62222 0.0858714 11.5822 +24 9052 1125.29 1089.39 178.917 7.71705 0.0907169 10.7967 +25 9052 1173.2 1134.18 179.247 7.75967 0.0880147 9.93348 +26 9052 1230.55 1187.24 178.315 7.70218 0.0677378 8.94931 +23 9054 1093.13 1048.04 192.953 5.76081 0.239444 8.59579 +24 9054 1148.89 1099.99 195.904 5.92525 0.253236 7.92708 +25 9054 1218.58 1163.38 198.603 5.92693 0.250587 7.02198 +23 9055 1106.49 1059.74 199.675 5.70973 0.308176 8.2904 +24 9055 1167.16 1115.45 203.132 5.79233 0.314526 7.49527 +23 9057 1036.7 1005.36 152.165 7.32099 -0.354588 12.3667 +24 9057 1071.74 1037.58 150.58 7.26734 -0.350235 11.3456 +25 9057 1112.08 1075.03 148.258 7.28518 -0.356566 10.4602 +23 9059 1082.66 1049.56 170.398 7.67665 -0.0398466 11.7078 +24 9059 1123.81 1088.01 170.642 7.71575 -0.0331875 10.8259 +23 9060 1050.91 1018.21 158.092 7.25048 -0.242509 11.8534 +24 9060 1088.37 1052.92 157.261 7.25501 -0.236269 10.9327 +23 9061 998.322 961.215 197.118 5.62769 0.351242 10.4449 +24 9061 1036.01 995.315 199.538 5.62824 0.352167 9.52265 +25 9061 1079.74 1035.49 202.1 5.70739 0.355005 8.7586 +26 9061 1133.38 1084.04 203.425 5.70235 0.332795 7.8547 +23 9062 1116.36 1083.28 134.88 8.22969 -0.616635 11.7167 +24 9062 1160.64 1124.95 131.878 8.29529 -0.616807 10.8612 +25 9062 1212.99 1173.66 127.964 8.24135 -0.613082 9.85437 +23 9063 1154.6 1106.99 196.39 6.15017 0.265582 8.1418 +24 9063 1223.56 1170.41 199.699 6.20454 0.271268 7.29116 +23 9070 1123.92 1075.76 205.293 5.73711 0.361821 8.0479 +24 9070 1189.38 1135.52 209.608 5.78207 0.366511 7.19524 +23 9071 1132.8 1083.89 207.343 5.74662 0.378788 7.92449 +24 9071 1200.56 1145.77 212.065 5.79474 0.384465 7.07468 +23 9072 1148.59 1097.57 237.95 5.67433 0.685261 7.59553 +24 9072 1221.58 1164.57 247.13 5.76569 0.699735 6.79738 +23 9073 1115.43 1067.68 206.928 5.69092 0.383323 8.11707 +24 9073 1179.32 1125.37 211.673 5.67232 0.386464 7.1833 +23 9075 1126.35 1085.15 170.957 6.73742 -0.0247363 9.40674 +24 9075 1178.02 1135.54 168.932 7.18757 -0.0495884 9.12307 +23 9076 240.21 212.503 266.448 -7.16056 1.8145 13.9884 +24 9076 217.789 188.087 272.965 -7.08517 1.81051 13.049 +25 9076 191.547 160.064 279.605 -7.13198 1.82135 12.3106 +26 9076 161.729 128.211 285.802 -7.1769 1.81009 11.5633 +23 9078 264.272 233.034 274.104 -5.93732 1.74103 12.4071 +24 9078 240.095 205.745 282.326 -5.77746 1.71186 11.283 +23 9087 184.116 155.989 257.184 -8.12475 1.61046 13.7793 +24 9087 157.525 128.379 262.998 -8.33086 1.66132 13.2977 +25 9087 128.335 98.6406 268.776 -8.70502 1.73516 13.0521 +23 9088 184.116 155.989 257.184 -8.12475 1.61046 13.7793 +24 9088 157.525 128.379 262.998 -8.33086 1.66132 13.2977 +25 9088 128.335 98.6406 268.776 -8.70502 1.73516 13.0521 +26 9088 95.282 62.354 274.17 -8.38936 1.65275 11.7704 +23 9091 332.358 306.115 254.835 -5.6739 1.67803 14.7688 +24 9091 316.4 288.325 260.736 -5.60895 1.68143 13.805 +25 9091 298.019 268.109 266.617 -5.59476 1.68384 12.9577 +26 9091 277.086 245.164 271.889 -5.59454 1.66646 12.1413 +23 9096 345.95 302.118 312.201 -3.23043 1.70765 8.84218 +24 9096 318.849 270.979 327.677 -3.26203 1.73725 8.09631 +25 9096 286.216 232.142 345.525 -3.21194 1.71524 7.16743 +23 9098 371.892 326.94 320.191 -2.84004 1.76061 8.6221 +24 9098 347.122 297.193 336.872 -2.82335 1.76454 7.76247 +25 9098 316.242 259.768 356.804 -2.78986 1.74963 6.86284 +23 9101 370.339 323.45 329.062 -2.74042 1.78946 8.26568 +24 9101 344.062 291.053 348.117 -2.69033 1.77597 7.31148 +23 9104 530.571 496.218 283.815 -1.23508 1.73502 11.2821 +24 9104 525.869 488.071 293.241 -1.18932 1.71083 10.2538 +25 9104 519.794 479.214 304.187 -1.1882 1.73843 9.55087 +26 9104 511.427 465.817 316.19 -1.1557 1.68806 8.49753 +23 9111 645.413 617.556 260.493 0.691348 1.68988 13.9128 +24 9111 649.693 619.369 266.44 0.710914 1.65775 12.7811 +25 9111 653.463 621.005 273.25 0.726556 1.66143 11.9405 +23 9114 665.036 620.612 309.954 0.670799 1.65775 8.72451 +24 9114 672.78 623.038 325.757 0.682704 1.65116 7.79173 +25 9114 681.551 626.513 344.421 0.702606 1.67441 7.04186 +23 9115 659.717 610.903 322.72 0.551941 1.64914 7.93988 +24 9115 667.18 612.474 341.337 0.565768 1.65431 7.08466 +23 9118 637.797 610.252 263.268 0.550656 1.76315 14.0706 +24 9118 640.955 609.525 270.129 0.536556 1.66247 12.3314 +23 9121 746.817 709.005 288.08 1.94985 1.63687 10.25 +24 9121 761.296 719.873 299.296 1.96764 1.63964 9.35655 +25 9121 777.971 732.389 311.917 1.98462 1.63877 8.50283 +23 9124 740.198 705.773 273.603 2.03845 1.57205 11.2587 +24 9124 752.774 715.453 282.224 2.06126 1.57414 10.3849 +25 9124 767.165 726.452 291.641 2.07937 1.56721 9.5196 +23 9125 806.717 758.053 287.201 2.17623 1.26217 7.96435 +24 9125 832.591 777.706 301.595 2.18278 1.25997 7.06161 +23 9126 824.281 772.422 268.283 2.22409 0.988462 7.47372 +24 9126 856.09 794.956 281.287 2.16613 0.952737 6.33975 +23 9129 860.347 813.796 263.186 2.89383 1.04234 8.32579 +24 9129 891.703 839.169 276.09 2.88485 1.05556 7.37753 +23 9131 1078.78 1033.61 286.418 5.58025 1.35058 8.58101 +24 9131 1134.08 1083.95 299.985 5.6204 1.36224 7.73144 +25 9131 1203.71 1146.98 316.429 5.62538 1.35935 6.83146 +23 9141 1159.3 1108.42 295.086 5.80461 1.29063 7.61863 +24 9141 1233.67 1176.09 310.81 5.82247 1.28701 6.73136 +24 9149 694.436 679.79 97.6685 3.11294 -2.75752 26.4633 +25 9149 698.43 683.236 94.8587 3.14185 -2.75738 25.5086 +26 9149 702.248 686.504 90.6377 3.16226 -2.80496 24.6166 +24 9152 813.742 782.878 111.083 3.55355 -1.07505 12.5575 +25 9152 829.895 797.238 107.604 3.62416 -1.07325 11.8681 +24 9159 226.986 198.786 255.037 -7.28728 1.56543 13.7439 +25 9159 200.961 169.358 260.351 -6.94502 1.4872 12.2641 +26 9159 171.901 138.284 264.564 -6.9931 1.46538 11.529 +24 9162 391.535 345.629 322.994 -2.55116 1.75682 8.4429 +25 9162 367.812 316.455 340.298 -2.5285 1.75134 7.54674 +24 9164 622.253 580.32 301.792 0.1626 1.6517 9.24288 +25 9164 625.058 578.433 314.906 0.178557 1.63654 8.31262 +26 9164 627.635 577.68 329.213 0.194366 1.68128 7.75847 +24 9168 959.791 899.609 259.936 3.12595 0.777238 6.43999 +25 9168 1016.02 946.144 273.298 3.1244 0.772094 5.54629 +26 9168 1092.61 1009.47 290.12 3.121 0.757664 4.6619 +24 9186 155.915 114.979 31.8958 -5.95252 -1.84959 9.4677 +25 9186 111.738 67.4923 17.3333 -6.04359 -1.88803 8.75953 +24 9194 277.283 240.678 28.0587 -4.87591 -2.12477 10.588 +25 9194 249.026 208.906 14.2394 -4.82704 -2.12363 9.6604 +24 9195 193.065 153.489 30.74 -5.65292 -1.92886 9.79316 +25 9195 154.048 108.552 15.8365 -5.37802 -1.85383 8.51887 +24 9197 322.293 285.012 60.3647 -4.13896 -1.62076 10.396 +25 9197 297.25 257.404 49.3824 -4.21011 -1.66447 9.72675 +26 9197 268.128 224.134 36.2179 -4.16877 -1.66828 8.80974 +24 9198 311.831 275.971 73.6207 -4.45961 -1.4864 10.8078 +25 9198 287.337 248.493 64.8704 -4.45584 -1.49325 9.97776 +24 9203 346.351 309.122 39.3172 -3.7977 -1.92674 10.4107 +25 9203 324.125 281.511 27.226 -3.5979 -1.83564 9.09497 +24 9205 323.69 289.892 119.288 -4.54326 -0.851314 11.4673 +25 9205 300.81 266.699 114.945 -4.86192 -0.911901 11.3621 +26 9205 277.031 236.295 108.566 -4.38478 -0.847709 9.51433 +24 9212 507.559 497.562 62.7201 -5.48097 -5.918 38.7715 +25 9212 506.128 496.387 60.924 -5.7039 -6.17256 39.7903 +26 9212 504.132 494.858 58.0436 -6.10696 -6.65045 41.7954 +24 9213 507.559 497.562 62.7201 -5.48097 -5.918 38.7715 +25 9213 506.128 496.387 60.924 -5.7039 -6.17256 39.7903 +26 9213 504.132 494.858 58.0436 -6.10696 -6.65045 41.7954 +24 9218 482.561 472.656 74.0724 -6.88714 -5.35694 39.1291 +25 9218 481.469 470.195 71.8171 -6.10286 -4.8139 34.3777 +26 9218 479.155 467.609 67.912 -6.06652 -4.88201 33.5666 +24 9219 549.598 542.01 103.06 -4.24506 -4.94112 51.0821 +25 9219 549.359 541.726 101.481 -4.23665 -5.0229 50.7786 +26 9219 549.184 541.393 98.8415 -4.16302 -5.1033 49.7514 +24 9221 498.517 488.798 112.629 -6.13757 -3.32875 39.8809 +25 9221 496.749 487.134 111.708 -6.30231 -3.41602 40.3098 +26 9221 495.226 485.77 108.881 -6.49431 -3.63378 40.9845 +24 9223 625.261 616.816 14.7882 0.998692 -10.0535 45.8923 +25 9223 626.55 617.017 11.7271 0.957336 -9.07885 40.6557 +24 9224 570.128 562.76 41.3882 -2.87451 -9.58375 52.5995 +25 9224 570.392 562.6 39.0327 -2.7002 -9.22557 49.7424 +24 9226 628.959 615.077 94.1538 0.750662 -3.04532 27.92 +25 9226 630.59 616.18 91.2432 0.783954 -3.04217 26.8965 +26 9226 632.216 617.355 87.1303 0.818932 -3.09848 26.0799 +24 9227 692.704 679.438 115.998 3.36639 -2.302 29.2138 +25 9227 695.78 682.128 113.624 3.39243 -2.33044 28.3895 +24 9229 606.674 599.12 32.4244 -0.205124 -9.98485 51.3029 +25 9229 607.374 599.915 30.0985 -0.157375 -10.2807 51.9624 +26 9229 608.607 600.461 25.3029 -0.0627917 -9.729 47.5757 +24 9232 690.84 676.103 106.581 2.96256 -2.41556 26.2989 +25 9232 694.572 679.36 103.916 3.002 -2.43436 25.4794 +26 9232 698.487 682.744 100.219 3.0343 -2.47838 24.6196 +24 9236 761.449 728.734 31.3702 2.49392 -2.32307 11.8472 +25 9236 774.584 738.98 19.8785 2.48975 -2.30797 10.886 +24 9239 798.872 766.305 59.9149 3.12248 -1.86279 11.9009 +25 9239 814.439 779.491 51.0772 3.14898 -1.8717 11.09 +26 9239 833.273 795.338 39.6683 3.16768 -1.88584 10.2166 +24 9244 802.109 771.331 124.83 3.36045 -0.838127 12.5925 +25 9244 817.785 784.584 121.375 3.36879 -0.832858 11.6734 +24 9248 760.932 728.325 50.6868 2.49363 -2.01251 11.8862 +25 9248 774.017 738.772 40.8912 2.50644 -2.0112 10.9967 +24 9249 787.995 755.001 64.2377 2.90496 -1.76829 11.7467 +25 9249 803.246 767.817 55.4929 2.93653 -1.77934 10.9394 +24 9250 787.995 755.001 64.2377 2.90496 -1.76829 11.7467 +25 9250 803.246 767.817 55.4929 2.93653 -1.77934 10.9394 +26 9250 821.547 782.714 43.3743 2.93227 -1.791 9.98051 +24 9251 828.105 797.977 96.8149 3.89639 -1.35568 12.8641 +25 9251 845.251 812.8 91.0448 3.90133 -1.35416 11.9434 +24 9252 770.324 737.816 48.8306 2.65645 -2.04934 11.9226 +25 9252 783.684 748.956 38.6429 2.69325 -2.0759 11.1603 +26 9252 799.93 762.2 26.5052 2.71026 -2.08353 10.2724 +24 9254 718.684 689.312 67.6851 1.99566 -1.92332 13.1954 +25 9254 727.277 695.89 59.9467 2.01459 -1.93226 12.3482 +24 9255 773.846 742.982 101.97 2.85921 -1.23366 12.5575 +25 9255 787.695 754.213 96.4002 2.85785 -1.22655 11.5757 +26 9255 802.81 766.869 88.765 2.88818 -1.25673 10.7836 +24 9259 737.019 707.062 93.0607 2.28541 -1.43073 12.9375 +25 9259 746.881 714.585 87.0922 2.28394 -1.42639 12.0006 +26 9259 758.363 723.176 78.831 2.27159 -1.43532 11.0147 +24 9260 776.571 746.377 121.936 2.97118 -0.905849 12.8363 +25 9260 789.935 757.577 117.812 2.99431 -0.913725 11.9778 +26 9260 805.642 770.263 111.555 2.97714 -0.930711 10.9552 +24 9266 842.005 812.489 91.0631 4.23029 -1.48852 13.1313 +25 9266 859.78 828.114 84.8872 4.24447 -1.49217 12.2394 +26 9266 880.222 845.871 76.5551 4.23233 -1.50582 11.2826 +24 9279 1019.05 985.236 47.4614 6.50553 -1.99211 11.4631 +25 9279 1054.19 1017.69 36.7717 6.542 -2.00221 10.6162 +26 9279 1095.24 1055.48 23.1559 6.56237 -2.02268 9.74922 +24 9281 1037.35 1003.26 58.3623 6.74065 -1.80402 11.3691 +25 9281 1073.58 1037.19 48.8004 6.85001 -1.83132 10.6516 +24 9287 1017.15 985.222 93.7542 6.85676 -1.33066 12.1381 +25 9287 1050.17 1015.75 86.3012 6.87647 -1.35079 11.2608 +26 9287 1088.35 1051.35 76.6606 6.95089 -1.39649 10.4749 +24 9294 1015.98 982.398 101.085 6.50019 -1.14784 11.54 +25 9294 1050.5 1014.21 94.8967 6.5275 -1.15405 10.6813 +24 9295 1015.98 982.398 101.085 6.50019 -1.14784 11.54 +25 9295 1050.5 1014.21 94.8967 6.5275 -1.15405 10.6813 +24 9296 1079.4 1044.57 124.995 7.24579 -0.738072 11.1273 +25 9296 1121.68 1083.49 120.477 7.20406 -0.736791 10.15 +24 9301 1039.62 1007.18 94.5803 7.12084 -1.29603 11.947 +25 9301 1076 1040.32 87.9308 7.02285 -1.27863 10.8637 +24 9309 1127.9 1091.55 105.618 7.65975 -0.993588 10.6626 +25 9309 1175.78 1136.52 98.5927 7.7485 -1.01624 9.87402 +24 9311 1151.9 1116.02 113.076 8.11942 -0.894941 10.8022 +25 9311 1202.95 1163.74 107.547 8.12867 -0.894621 9.88413 +24 9312 1123.27 1086.96 114.032 7.59955 -0.870189 10.6741 +25 9312 1171.31 1132.04 108.418 7.6844 -0.881445 9.87021 +24 9319 1154.57 1117.1 85.8273 7.81208 -1.24742 10.3424 +25 9319 1207.36 1166.75 77.6295 7.90567 -1.2593 9.54198 +24 9328 99.2054 86.9231 164.711 -22.3196 -0.356122 31.5554 +25 9328 84.3119 71.1675 164.267 -21.4643 -0.350921 29.4858 +24 9351 267.158 236.822 221.708 -6.06281 0.865046 12.7761 +25 9351 243.729 212.972 225.301 -6.38899 0.915951 12.6012 +24 9352 189.072 159.47 242.349 -7.63007 1.26104 13.0929 +25 9352 160.229 130.872 247.126 -8.22136 1.35895 13.2019 +24 9355 326.318 319.696 186.79 -22.9782 1.13058 58.5352 +25 9355 323.243 315.746 185.899 -20.5143 0.934693 51.6976 +24 9356 405.326 394.935 213.507 -10.5585 2.10168 37.3021 +25 9356 401.442 390.933 214.114 -10.6374 2.1089 36.8797 +26 9356 397.382 386.575 213.629 -10.5462 2.02673 35.8639 +24 9359 489.8 479.851 145.109 -6.46582 -1.49797 38.956 +25 9359 487.94 477.958 144.216 -6.54485 -1.54114 38.8289 +26 9359 485.948 475.644 142.075 -6.44396 -1.60452 37.6144 +24 9360 476.865 467.413 208.709 -7.54094 2.03764 41.0046 +25 9360 474.92 465.14 208.75 -7.39438 1.97139 39.6268 +24 9363 531.421 517.928 220.221 -3.11064 1.88563 28.7239 +25 9363 529.818 516.312 221.14 -3.17134 1.92036 28.696 +26 9363 528.11 514.087 221.409 -3.11999 1.85994 27.6391 +24 9364 545.596 538.921 196.296 -5.14735 1.88644 58.0647 +25 9364 545.49 538.775 196.278 -5.12538 1.87388 57.7211 +26 9364 545.2 538.134 195.332 -4.89248 1.70878 54.8503 +24 9365 518.677 510.18 175.049 -5.74507 0.138758 45.6116 +25 9365 517.614 509.379 174.706 -5.99735 0.120802 47.0642 +26 9365 516.309 507.981 173.11 -6.01432 0.0164836 46.5367 +24 9367 506.911 499.557 193.27 -7.49789 1.4913 52.7043 +25 9367 505.897 500.366 193.422 -10.0669 1.99744 70.0707 +24 9370 593.653 578.709 221.701 -0.571768 1.75583 25.9361 +25 9370 593.947 578.61 223.094 -0.546831 1.75964 25.2716 +24 9372 613.979 595.836 231.186 0.130844 1.72705 21.3626 +25 9372 615.135 596.201 233.435 0.15817 1.71867 20.4697 +24 9373 694.77 674.596 185.387 2.2688 0.333692 19.2115 +25 9373 699.394 679.219 185.046 2.39187 0.324603 19.2111 +26 9373 705.516 683.357 183.237 2.32602 0.251698 17.4902 +24 9375 588.53 583.174 149.916 -2.10895 -2.30038 72.3616 +25 9375 589.099 583.335 149.163 -1.90663 -2.20768 67.2379 +26 9375 589.783 584.015 147.539 -1.8416 -2.35741 67.191 +24 9376 588.53 583.174 149.916 -2.10895 -2.30038 72.3616 +25 9376 589.099 583.335 149.163 -1.90663 -2.20768 67.2379 +26 9376 589.783 584.015 147.539 -1.8416 -2.35741 67.191 +24 9378 817.016 800.065 172.437 6.57414 -0.0132111 22.865 +25 9378 825.805 808.729 172.021 6.80223 -0.0261886 22.6967 +24 9381 719.838 692.18 246.249 2.14175 1.42543 14.0132 +25 9381 727.667 698.902 250.176 2.20554 1.4439 13.4739 +24 9386 780.017 752.035 148.812 3.27209 -0.461499 13.8505 +25 9386 791.724 762.234 145.75 3.31804 -0.493694 13.1425 +24 9390 713.776 693.259 192.261 2.72844 0.50808 18.8903 +25 9390 720.051 697.116 192.834 2.58778 0.467944 16.8989 +24 9391 906.987 900.311 140.297 23.9301 -2.61946 58.0525 +25 9391 912.554 906.106 139.718 25.241 -2.7604 60.1077 +24 9397 851.154 846.455 128.418 27.6173 -5.07955 82.4806 +25 9397 854.837 850.254 127.662 28.7451 -5.29618 84.5598 +26 9397 858.65 854.045 125.704 29.0561 -5.49995 84.1664 +24 9400 836.54 819.52 168.008 7.16351 -0.152943 22.7718 +25 9400 847.161 829.531 167.479 7.23932 -0.163773 21.984 +26 9400 858.157 839.304 165.82 7.08291 -0.200412 20.5577 +24 9402 896.481 852.779 199.517 3.5266 0.32772 8.86853 +25 9402 928.406 880.586 202.55 3.58155 0.333567 8.10491 +26 9402 969.865 913.525 205.868 3.43516 0.314752 6.87916 +24 9403 898.136 848.98 211.149 3.15341 0.418472 7.88457 +25 9403 934.159 880.292 215.28 3.23683 0.423057 7.19499 +26 9403 977.839 917.281 218.944 3.26665 0.408819 6.40006 +24 9404 878.756 827.244 219.632 2.80711 0.487785 7.52402 +25 9404 915.055 855.316 225.165 2.74692 0.470364 6.48785 +26 9404 961.461 893.097 230.91 2.76495 0.456153 5.66924 +24 9413 1088.12 1052.65 154.129 7.24672 -0.283546 10.926 +25 9413 1131.57 1093.03 152.12 7.27483 -0.28895 10.0555 +24 9415 1008.79 949.565 246.23 3.62064 0.665445 6.54358 +25 9415 1071.27 1002.95 256.136 3.63027 0.654823 5.67325 +24 9423 1162.98 1127.14 146.108 8.29334 -0.400804 10.8126 +25 9423 1213.74 1175.67 144.405 8.52509 -0.401423 10.181 +24 9425 1154.68 1118.22 137.145 8.02935 -0.525974 10.6278 +25 9425 1206.02 1166.47 133.927 8.10082 -0.528693 9.79956 +24 9426 1138.93 1102.68 145.652 7.84321 -0.403027 10.6903 +25 9426 1187.49 1149.32 143.067 8.13278 -0.419167 10.1537 +24 9431 1141.11 1105.89 179.345 8.107 0.0990045 11.0046 +25 9431 1186.11 1149.89 178.524 8.55234 0.0841123 10.7031 +24 9432 113.037 84.2076 255.569 -9.25106 1.54112 13.4435 +25 9432 80.0081 49.5585 260.929 -9.34161 1.55369 12.7284 +26 9432 42.6837 10.2502 265.695 -9.38836 1.53759 11.9498 +24 9438 272.311 242.179 259.622 -6.01196 1.54677 12.8625 +25 9438 249.279 217.166 265.733 -6.02645 1.55359 12.0692 +24 9439 251.717 221.353 271.296 -6.33025 1.74144 12.7641 +25 9439 226.978 194.479 277.982 -6.32337 1.73758 11.9257 +24 9440 251.717 221.353 271.296 -6.33025 1.74144 12.7641 +25 9440 226.978 194.479 277.982 -6.32337 1.73758 11.9257 +24 9441 208.747 177.623 278.923 -6.91725 1.83055 12.4524 +25 9441 180.301 146.416 286.544 -6.80466 1.80224 11.4379 +24 9442 231.128 194.389 295.049 -5.53296 1.78659 10.5494 +25 9442 198.73 158.999 305.572 -5.55417 1.79427 9.75477 +24 9450 295.231 258.025 295.361 -4.53809 1.76868 10.4171 +25 9450 268.066 227.746 305.951 -4.54943 1.77314 9.61246 +26 9450 236.186 191.911 317.069 -4.52979 1.74963 8.75374 +24 9451 381.693 337.817 316.194 -2.78968 1.75485 8.83349 +25 9451 358.181 309.577 331.154 -2.77811 1.74945 7.97409 +24 9456 376.264 330.356 319.857 -2.72974 1.72004 8.44256 +25 9456 350.954 300.397 336.189 -2.74759 1.73538 7.66608 +24 9464 733.39 704.18 255.992 2.27712 1.52883 13.2683 +25 9464 743.426 711.84 261.458 2.27648 1.50677 12.2701 +24 9468 748.592 710.933 287.86 1.98309 1.6404 10.2917 +25 9468 762.441 721.315 298.053 1.99682 1.63525 9.42416 +24 9471 763.654 724.772 290.915 2.1288 1.631 9.96798 +25 9471 778.876 736.796 301.363 2.16134 1.64043 9.21049 +26 9471 797.38 750.773 313.005 2.16464 1.61524 8.31573 +24 9474 824.378 771.704 306.051 2.19067 1.35831 7.35807 +25 9474 854.163 794.667 323.276 2.20835 1.35805 6.51426 +24 9476 943.983 883.279 256.882 2.95924 0.743543 6.38474 +25 9476 997.52 927.496 269.836 2.97602 0.743939 5.53486 +26 9476 1069.59 986.734 286.296 2.98247 0.735472 4.67791 +24 9480 882.139 823.005 343.337 2.476 1.54859 6.55413 +25 9480 924.487 856.638 369.15 2.49322 1.55403 5.71228 +24 9481 857.26 797.889 255.9 2.24105 0.751351 6.52805 +25 9481 897.241 827.698 268.934 2.22207 0.742127 5.57322 +24 9485 959.791 899.609 259.936 3.12595 0.777238 6.43999 +25 9485 1016.02 946.144 273.298 3.1244 0.772094 5.54629 +26 9485 1092.61 1009.47 290.12 3.121 0.757664 4.6619 +24 9490 1093.55 1046.88 289.668 5.5698 1.3443 8.30348 +25 9490 1152.36 1100.72 303.296 5.64643 1.35692 7.50577 +24 9496 1006.28 947.854 303.281 3.64749 1.19917 6.63395 +25 9496 1067.78 1000.62 324.006 3.66495 1.20895 5.77104 +25 9514 605.801 597.97 39.5034 -0.257756 -9.14612 49.4881 +26 9514 606.641 598.241 35.7882 -0.186577 -8.76434 46.137 +25 9518 361.8 343.561 236.798 -7.29666 1.88317 21.2497 +26 9518 354.087 334.607 239.888 -7.04414 1.84834 19.895 +25 9521 1137.72 1099.18 145.11 7.36291 -0.386778 10.0588 +26 9521 1189.66 1147.79 141.002 7.4421 -0.408629 9.25656 +25 9523 385.661 346.389 299.758 -3.06238 1.73574 9.86887 +26 9523 365.564 322.596 310.185 -3.0502 1.71679 9.02 +25 9527 431.97 404.448 262.136 -3.46611 1.74256 14.0826 +26 9527 421.788 392.871 266.194 -3.48799 1.73385 13.4031 +25 9528 615.586 589.223 258.417 0.122792 1.74341 14.7018 +26 9528 617.163 588.737 263.065 0.143682 1.70467 13.6344 +25 9532 908.289 840.145 305.686 2.35478 1.04707 5.68762 +26 9532 964.2 882.829 327.959 2.34107 1.02388 4.76305 +25 9548 265.969 226.675 99.3738 -4.69686 -1.00447 9.86337 +26 9548 234.726 190.969 90.9633 -4.60126 -1.00525 8.85724 +25 9552 209.873 169.305 100.157 -5.2921 -0.962556 9.55361 +26 9552 171.743 128.059 92.0125 -5.38349 -0.994046 8.87219 +25 9554 155.767 115.451 73.7156 -6.04608 -1.32087 9.61338 +26 9554 113.411 70.0676 63.5948 -6.14879 -1.35405 8.94204 +25 9555 232.076 191.97 41.7339 -5.05576 -1.75613 9.66379 +26 9555 196.811 151.446 26.7146 -4.88722 -1.73039 8.5435 +25 9558 362.984 324.508 42.7963 -3.44236 -1.81569 10.0732 +26 9558 341.621 299.478 29.2055 -3.41506 -1.8309 9.1965 +25 9559 304.217 265.292 74.537 -4.21366 -1.35675 9.95707 +26 9559 276.035 234.042 64.1938 -4.26617 -1.38989 9.22933 +25 9560 337.04 299.062 84.7901 -3.8544 -1.24554 10.2051 +26 9560 313.432 272.92 75.3974 -3.92632 -1.29217 9.56679 +25 9563 295.773 257.82 89.1942 -4.44107 -1.18405 10.212 +26 9563 267.988 226.188 79.8266 -4.38937 -1.19545 9.27214 +25 9564 332.081 293.723 89.8222 -3.88568 -1.16274 10.1041 +26 9564 307.818 265.876 80.0158 -3.86442 -1.18898 9.24077 +25 9566 293.992 255.518 98.8299 -4.40569 -1.03347 10.0735 +26 9566 266.139 223.729 90.34 -4.34963 -1.04509 9.13871 +25 9567 350.048 311.611 38.6236 -3.62665 -1.87585 10.0834 +26 9567 327.719 281.89 25.0815 -3.30341 -1.73202 8.45704 +25 9572 291.011 251.956 117.739 -4.38125 -0.758043 9.92389 +26 9572 261.948 220.372 111.805 -4.491 -0.788729 9.32199 +25 9579 504.66 495.789 50.2082 -6.35172 -7.42631 43.6897 +26 9579 503.088 494.256 46.5506 -6.47481 -7.68089 43.8789 +25 9580 505.303 496.6 55.3746 -6.43471 -7.25082 44.5333 +26 9580 503.825 494.845 51.8175 -6.32441 -7.23971 43.1582 +25 9586 523.28 515.062 98.881 -5.63986 -4.83543 47.165 +26 9586 522.33 514.187 96.2475 -5.75408 -5.05336 47.5963 +25 9587 452.92 441.863 118.874 -7.60899 -2.62216 35.0499 +26 9587 449.766 438.558 115.552 -7.6579 -2.74612 34.5789 +25 9588 549.359 541.726 101.481 -4.23665 -5.0229 50.7786 +26 9588 549.184 541.393 98.8415 -4.16302 -5.1033 49.7514 +25 9589 507.196 497.665 114.207 -5.76926 -3.30535 40.6661 +26 9589 505.986 494.862 111.55 -5.00119 -2.96015 34.8404 +25 9592 603.232 595.698 20.4713 -0.451157 -10.8649 51.4455 +26 9592 603.887 596.165 16.2026 -0.394557 -10.8969 50.1914 +25 9594 598.064 590.258 26.4085 -0.791107 -10.078 49.6545 +26 9594 598.343 590.669 22.1217 -0.785146 -10.5512 50.5072 +25 9595 615.858 608.099 27.3764 0.436028 -10.071 49.9502 +26 9595 616.784 608.923 23.3014 0.493665 -10.2192 49.3041 +25 9596 655.82 640.658 26.6337 1.63884 -5.18 25.5612 +26 9596 658.265 643.321 20.3206 1.75066 -5.48264 25.9349 +25 9598 633.163 619.355 46.5832 0.918201 -4.91209 28.0687 +26 9598 635.168 620.618 41.8698 0.945451 -4.83589 26.6389 +25 9600 583.763 575.751 40.7319 -1.72958 -8.85834 48.3767 +26 9600 583.914 576.219 36.7215 -1.79004 -9.50206 50.3634 +25 9601 625.855 609.327 82.6791 0.529616 -2.93071 23.4501 +26 9601 626.948 609.843 77.8986 0.546072 -2.98198 22.6591 +25 9602 569.955 562.309 65.1523 -2.78243 -7.56668 50.6923 +26 9602 570.129 562.37 62.096 -2.73005 -7.66851 49.9569 +25 9604 677.964 662.99 104.231 2.45391 -2.46176 25.8842 +26 9604 681.041 665.102 100.467 2.40902 -2.43952 24.3167 +25 9606 662.674 652.793 123.43 2.8875 -2.68683 39.2253 +26 9606 664.526 654.289 120.407 2.88406 -2.75182 37.8584 +25 9608 621.657 607.436 64.5543 0.456958 -4.09089 27.2552 +26 9608 622.49 607.634 59.3606 0.467525 -4.10334 26.0871 +25 9613 814.439 779.491 51.0772 3.14898 -1.8717 11.09 +26 9613 833.273 795.338 39.6683 3.16768 -1.88584 10.2166 +25 9614 799.033 763.962 59.5681 2.90195 -1.73506 11.0509 +26 9614 816.135 778.11 48.4308 2.91813 -1.75763 10.1926 +25 9615 832.785 798.59 70.9513 3.50654 -1.60074 11.3343 +26 9615 852.329 815.459 61.1208 3.53686 -1.62782 10.5119 +25 9618 774.35 741.528 109.159 2.69688 -1.04239 11.8083 +26 9618 788.413 752.842 102.72 2.70081 -1.05906 10.8957 +25 9620 800.74 766.577 121.972 3.00596 -0.800025 11.3448 +26 9620 816.38 781.403 116.316 3.17621 -0.86827 11.0809 +25 9622 728.896 697.449 43.2024 2.03838 -2.21456 12.3245 +26 9622 739.42 704.378 31.7928 1.99059 -2.16227 11.0601 +25 9624 771.847 737.571 84.4219 2.54325 -1.38584 11.3074 +26 9624 786.237 748.993 75.526 2.54812 -1.4037 10.4063 +25 9626 820.049 783.79 34.8822 3.1182 -2.04391 10.6888 +26 9626 839.459 800.069 21.7591 3.13511 -2.06046 9.83951 +25 9630 818.247 782.466 46.1956 3.1329 -1.90144 10.832 +26 9630 837.845 798.435 32.4013 3.11153 -1.91437 9.83456 +25 9632 725.68 694.472 79.2089 1.99871 -1.61186 12.4194 +26 9632 733.746 701.894 70.3136 2.09425 -1.72921 12.1678 +25 9639 696.112 671.738 65.1298 1.90743 -2.37401 15.9012 +26 9639 700.961 680.596 59.3206 2.41082 -2.99458 19.0314 +25 9652 926.016 916.861 93.5372 18.5673 -4.6537 42.3343 +26 9652 932.37 922.898 88.5975 18.3058 -4.77798 40.9167 +25 9673 1087.19 1048.38 103.507 6.61203 -0.960005 9.98864 +26 9673 1136.18 1090.89 96.0759 6.24651 -0.910707 8.55855 +25 9681 1131.2 1093.06 87.6072 7.34729 -1.2007 10.1629 +26 9681 1182.2 1140.75 78.1433 7.42087 -1.22736 9.35042 +25 9690 1162.68 1124.2 122.173 7.72253 -0.707595 10.074 +26 9690 1218.32 1175.53 115.58 7.64225 -0.719011 9.05808 +25 9699 96.8181 66.7475 245.652 -9.15909 1.3004 12.8888 +26 9699 62.0669 29.7548 248.979 -9.10141 1.26549 11.9947 +25 9708 168.818 134.174 159.266 -6.83353 -0.210672 11.1872 +26 9708 133.357 95.4471 156.629 -6.74727 -0.229884 10.2234 +25 9711 259.346 226.975 227.13 -5.8114 0.900645 11.9731 +26 9711 233.261 198.281 229.877 -5.77841 0.875635 11.0799 +25 9712 238.874 206.437 244.621 -6.13863 1.18848 11.9488 +26 9712 211.521 176.727 248.646 -6.14502 1.1701 11.1393 +25 9726 285.534 269.971 243.007 -11.1839 2.42134 24.9041 +26 9726 275.477 258.12 244.169 -10.339 2.20702 22.3297 +25 9728 431.314 422.373 198.194 -10.7084 1.52237 43.3475 +26 9728 428.489 419.324 197.314 -10.6119 1.43354 42.2867 +25 9731 448.721 437.906 135.88 -7.98848 -1.83641 35.8371 +26 9731 445.556 434.418 133.379 -7.90924 -1.90373 34.7969 +25 9732 580.863 575.269 127.849 -2.75539 -4.32138 69.2818 +26 9732 581.576 575.431 125.608 -2.44614 -4.12996 63.0719 +25 9734 579.007 575.196 166.919 -4.30584 -0.836488 101.69 +26 9734 579.449 575.431 165.327 -4.02534 -1.00627 96.4594 +25 9735 572.032 558.365 221.246 -1.47494 1.90193 28.3586 +26 9735 571.82 557.41 221.359 -1.40672 1.80802 26.8955 +25 9737 641.108 621.46 230.556 0.862508 1.57753 19.7263 +26 9737 643.312 623.141 231.589 0.898845 1.56415 19.2149 +25 9743 615.762 609.846 183.061 0.563154 0.926759 65.51 +26 9743 617.468 613.042 181.588 0.959683 1.05982 87.5502 +25 9749 713.062 690.425 250.812 2.45592 1.84978 17.1207 +26 9749 720.13 693.046 254.026 2.19291 1.60985 14.3099 +25 9760 758.197 733.225 205.292 3.19728 0.697755 15.5207 +26 9760 767.387 741.758 205.785 3.30779 0.690168 15.1221 +25 9762 738.727 710.22 239.02 2.43391 1.24677 13.596 +26 9762 748.517 718.031 241.204 2.44836 1.20429 12.7131 +25 9763 754.705 732.121 188.609 3.45235 0.374743 17.1621 +26 9763 761.982 740.926 186.912 3.88852 0.35864 18.4075 +25 9765 882.36 868.164 141.565 10.3219 -1.18389 27.3006 +26 9765 892.332 877.646 139.123 10.3423 -1.23369 26.3898 +25 9767 835.926 818.799 162.684 7.09947 -0.318973 22.6293 +26 9767 846.203 828.358 160.85 7.12312 -0.36134 21.7187 +25 9791 1019.42 981.512 187.77 5.80828 0.211386 10.2253 +26 9791 1058.71 1017.44 187.782 5.84678 0.194321 9.39263 +25 9800 1146.57 1108.47 155.845 7.57165 -0.239826 10.1735 +26 9800 1199.89 1157.99 152.836 7.56896 -0.256661 9.2513 +25 9801 1176.39 1137.96 162.48 7.92279 -0.145007 10.0853 +26 9801 1234.02 1191.06 160.1 7.80823 -0.159472 9.02204 +25 9802 1154.19 1115.66 171.278 7.59383 -0.0219808 10.0605 +26 9802 1208.64 1166.48 169.428 7.63334 -0.0436528 9.19371 +25 9813 1171.14 1132.47 144.377 7.801 -0.395582 10.0229 +26 9813 1227.57 1185.3 140.186 7.85473 -0.415204 9.17058 +25 9821 104.814 74.1446 270.95 -8.84023 1.71807 12.6372 +26 9821 69.7365 37.2654 276.47 -8.92997 1.71405 11.936 +25 9826 176.456 135.716 312.375 -5.71048 1.83959 9.51349 +26 9826 134.774 90.3549 324.379 -5.74154 1.83238 8.72549 +25 9829 194.997 143.189 341.327 -4.29822 1.74674 7.48098 +26 9829 143.36 85.0604 361.472 -4.29536 1.73784 6.64794 +25 9833 275.817 244.233 259.628 -5.67596 1.47577 12.2712 +26 9833 251.75 218.293 264.311 -5.74461 1.46834 11.5842 +25 9835 141.494 108.961 287.503 -7.72823 1.89297 11.9133 +26 9835 106.14 70.7041 294.45 -7.63098 1.84319 10.9373 +25 9838 238.044 205.953 256.259 -6.21848 1.39605 12.0772 +26 9838 210.894 176.03 261.12 -6.14219 1.3599 11.1166 +25 9841 330.17 301.096 261.811 -5.16177 1.64349 13.3305 +26 9841 312.076 280.97 266.726 -5.13697 1.62099 12.4596 +25 9842 336.181 306.039 266.139 -4.87174 1.66239 12.8582 +26 9842 317.813 285.247 271.154 -4.81213 1.62138 11.9012 +25 9843 278.378 240.427 293.05 -4.68748 1.70123 10.2125 +26 9843 249.596 208.165 302.194 -4.66693 1.67689 9.35475 +25 9844 279.932 240.166 298.634 -4.4526 1.69903 9.74652 +26 9844 249.392 206.355 309.042 -4.49533 1.69979 9.00567 +25 9845 385.661 346.389 299.758 -3.06238 1.73574 9.86887 +26 9845 365.564 322.596 310.185 -3.0502 1.71679 9.02 +25 9847 325.886 275.149 339.284 -3.00327 1.76201 7.63897 +26 9847 292.086 234.85 358.303 -2.97945 1.74042 6.77155 +25 9854 345.638 315.592 269.366 -4.71835 1.72542 12.8995 +26 9854 327.311 295.274 274.298 -4.73242 1.7009 12.0979 +25 9859 540.4 515.563 253.729 -1.49572 1.74909 15.6048 +26 9859 537.412 510.903 256.795 -1.4619 1.70088 14.6203 +25 9862 632.417 587.793 309.791 0.275147 1.64833 8.68528 +26 9862 636.051 586.186 322.877 0.28537 1.61605 7.77241 +25 9866 602.745 552.242 330.347 -0.0724834 1.67512 7.67441 +26 9866 603.558 546.102 348.864 -0.0561072 1.64551 6.74563 +25 9883 840.323 782.748 280.133 2.15291 1.00086 6.73158 +26 9883 875.803 809.235 294.44 2.14837 0.981103 5.82224 +25 9884 840.323 782.748 280.133 2.15291 1.00086 6.73158 +26 9884 875.803 809.235 294.44 2.14837 0.981103 5.82224 +25 9889 910.731 841.986 281.457 2.35324 0.848585 5.63782 +26 9889 966.193 884.935 299.069 2.35749 0.834331 4.76965 +25 9897 1027.81 957.746 273.305 3.20645 0.770086 5.53152 +26 9897 1105.84 1022.96 289.994 3.21647 0.759204 4.67639 diff --git a/examples/matlab/VO_Example.m b/examples/matlab/VO_Example.m new file mode 100644 index 000000000..e95893898 --- /dev/null +++ b/examples/matlab/VO_Example.m @@ -0,0 +1,77 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read Stereo Visual Odometry from file and optimize +% @author Chris Beall +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Load calibration +% format: fx fy skew cx cy baseline +calib = dlmread('../Data/VO_calibration.txt'); +K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); +stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]); + +%% create empty graph and values +graph = visualSLAMGraph; +initial = visualSLAMValues; + + +%% load the initial poses from VO +% row format: camera_id 4x4 pose (row, major) +c = dlmread('../Data/VO_camera_poses.txt'); + +for i=1:size(c,1) + pose = gtsamPose3(reshape(c(i,2:17),4,4)'); + initial.insertPose(symbol('x',c(i,1)),pose); +end + +%% load stereo measurements and initialize landmarks +% camera_id landmark_id uL uR v X Y Z +m = dlmread('../Data/VO_stereo_factors.txt'); + +for i=1:size(m,1) + sf = m(i,:); + graph.addStereoMeasurement(gtsamStereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... + symbol('x', sf(1)), symbol('l', sf(2)), K); + + if ~initial.exists(symbol('l',sf(2))) + % 3D landmarks are stored in camera coordinates: transform + % to world coordinates using the respective initial pose + pose = initial.pose(symbol('x', sf(1))); + world_point = pose.transform_from(gtsamPoint3(sf(6),sf(7),sf(8))); + initial.insertPoint(symbol('l',sf(2)), world_point); + end +end + +%% add a constraint on the starting pose +key = symbol('x',1); +first_pose = initial.pose(key); +graph.addPoseConstraint(symbol('x',1), first_pose); + +%% optimize +result = graph.optimize(initial); + +%% visualize initial trajectory, final trajectory, and final points +figure(1); clf; + +% initial trajectory in red +plot3(initial.xs(),initial.ys(),initial.zs(), '-*r','LineWidth',2); +hold on; + +% final trajectory in green +plot3(result.xs(),result.ys(),result.zs(), '-*g','LineWidth',2); +xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); + +% switch to XZ view +view([0 0]); + +% optimized 3D points +points = result.points(); +plot3(points(:,1),points(:,2),points(:,3),'.'); + +axis([-30 30 -30 30 0 60]); From ad3b431c4d60b078e411219c2973766ddd457e4e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 5 Jun 2012 18:05:00 +0000 Subject: [PATCH 177/914] Moved building of wrap libraries to a cmake macro and moved install for matlab components to the appropriate folder --- CMakeLists.txt | 10 ++-- examples/CMakeLists.txt | 18 +++++++ gtsam/CMakeLists.txt | 21 ++++++++ gtsam_unstable/CMakeLists.txt | 55 ++------------------- tests/CMakeLists.txt | 12 +++++ wrap/CMakeLists.txt | 92 ----------------------------------- 6 files changed, 60 insertions(+), 148 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ba6a05c2..c72a6f295 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,17 +115,17 @@ link_directories(${Boost_LIBRARY_DIRS}) # Build CppUnitLite add_subdirectory(CppUnitLite) +# Build wrap +if (GTSAM_BUILD_WRAP) + add_subdirectory(wrap) +endif(GTSAM_BUILD_WRAP) + # Build GTSAM library add_subdirectory(gtsam) # Build Tests add_subdirectory(tests) -# Build wrap -if (GTSAM_BUILD_WRAP) - add_subdirectory(wrap) -endif(GTSAM_BUILD_WRAP) - # Build examples if (GTSAM_BUILD_EXAMPLES) add_subdirectory(examples) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 9f799d294..c9b3e4d8b 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -30,3 +30,21 @@ foreach(example_src ${example_srcs} ) endforeach(example_src) +# Install matlab components +if (GTSAM_BUILD_WRAP) + if (GTSAM_INSTALL_MATLAB_TOOLBOX) + # Examples + if (GTSAM_INSTALL_MATLAB_EXAMPLES) + message(STATUS "Installing Matlab Toolbox Examples") + file(GLOB matlab_examples "${GTSAM_SOURCE_ROOT_DIR}/examples/matlab/*.m") + install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) + + message(STATUS "Installing Matlab Toolbox Examples (Data)") + # Data files: *.graph and *.txt + file(GLOB matlab_examples_data_graph "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.graph") + file(GLOB matlab_examples_data_txt "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.txt") + set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) + install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) + endif (GTSAM_INSTALL_MATLAB_EXAMPLES) + endif (GTSAM_INSTALL_MATLAB_TOOLBOX) +endif () \ No newline at end of file diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 80c57c15c..45d14263d 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -114,3 +114,24 @@ if (GTSAM_BUILD_SHARED_LIBRARY) install(TARGETS gtsam-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) endif(GTSAM_BUILD_SHARED_LIBRARY) +# Create the matlab toolbox for the gtsam library +if (GTSAM_BUILD_WRAP) + # Set up codegen + include(GtsamMatlabWrap) + + # TODO: generate these includes programmatically + # Choose include flags depending on build process + if (GTSAM_BUILD_MEX_BIN) + set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) + set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) + else() + set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) + set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) + endif() + + # Generate, build and install toolbox + set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${MEX_LIB_ROOT}/gtsam -lgtsam") + + # Macro to handle details of setting up targets + wrap_library(gtsam "${mexFlags}" "../") +endif () diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 179ffc6e6..8c3b220c6 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -70,15 +70,6 @@ if (GTSAM_BUILD_WRAP) # Set up codegen include(GtsamMatlabWrap) - # Wrap codegen - #usage: wrap mexExecutable mexExtension interfacePath moduleName toolboxPath [mexFlags] - # mexExecutable : command to execute mex if on path, use 'mex' - # mexExtension : OS/CPU-dependent extension for MEX binaries - # interfacePath : *absolute* path to directory of module interface file - # moduleName : the name of the module, interface file must be called moduleName.h - # toolboxPath : the directory in which to generate the wrappers - # [mexFlags] : extra flags for the mex command - # TODO: generate these includes programmatically # Choose include flags depending on build process if (GTSAM_BUILD_MEX_BIN) @@ -89,48 +80,10 @@ if (GTSAM_BUILD_WRAP) set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) endif() + # Generate, build and install toolbox set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete -L${MEX_LIB_ROOT}/gtsam_unstable -L${MEX_LIB_ROOT}/gtsam -lgtsam -lgtsam_unstable") - if(MSVC OR CYGWIN OR WINGW) - set(mexFlags "${mexFlags} LINKFLAGS='$LINKFLAGS /LIBPATH:${Boost_LIBRARY_DIRS}'") - endif() - set(toolbox_path ${CMAKE_BINARY_DIR}/wrap/gtsam_unstable) - set(moduleName gtsam_unstable) - - find_mexextension() - - # Code generation command - add_custom_target(wrap_gtsam_unstable ALL COMMAND - ${CMAKE_BINARY_DIR}/wrap/wrap - ${MEX_COMMAND} - ${GTSAM_MEX_BIN_EXTENSION} - ${CMAKE_CURRENT_SOURCE_DIR} - ${moduleName} - ${toolbox_path} - "${mexFlags}" - DEPENDS wrap) - - # Build command - if (GTSAM_BUILD_MEX_BIN) - # Actually compile the mex files when building the library - if (GTSAM_INSTALL_MEX_BIN) - add_custom_target(wrap_gtsam_unstable_build ALL - COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} - WORKING_DIRECTORY ${toolbox_path} - DEPENDS wrap_gtsam_unstable) - else() - add_custom_target(wrap_gtsam_unstable_build - COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} - WORKING_DIRECTORY ${toolbox_path} - DEPENDS wrap_gtsam_unstable) - endif() - endif () - - if (GTSAM_INSTALL_MATLAB_TOOLBOX) - # Primary toolbox files - message(STATUS "Installing Matlab Toolbox to ${GTSAM_TOOLBOX_INSTALL_PATH}") - install(DIRECTORY DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}) # make an empty folder - # exploit need for trailing slash to specify a full folder, rather than just its contents to copy - install(DIRECTORY ${toolbox_path} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}) - endif (GTSAM_INSTALL_MATLAB_TOOLBOX) + # Macro to handle details of setting up targets + wrap_library(gtsam_unstable "${mexFlags}" "./") + endif(GTSAM_BUILD_WRAP) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4d29dd557..ef9660c90 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,3 +40,15 @@ if (GTSAM_BUILD_TIMING) "${tests_local_libs}" "gtsam-static;CppUnitLite" "${tests_exclude}" # Pass in linking and exclusion lists ${is_test}) endif (GTSAM_BUILD_TIMING) + +# Install matlab components +if (GTSAM_BUILD_WRAP) + if (GTSAM_INSTALL_MATLAB_TOOLBOX) + # Tests + if (GTSAM_INSTALL_MATLAB_TESTS) + message(STATUS "Installing Matlab Toolbox Tests") + file(GLOB matlab_tests "${GTSAM_SOURCE_ROOT_DIR}/tests/matlab/*.m") + install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/tests) + endif () + endif () +endif () \ No newline at end of file diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 9c0501af6..4972e1ee2 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -22,96 +22,4 @@ if (GTSAM_BUILD_TESTS) gtsam_add_subdir_tests("wrap" "${wrap_local_libs}" "${wrap_local_libs}" "") endif(GTSAM_BUILD_TESTS) -# Wrap codegen -#usage: wrap mexExecutable mexExtension interfacePath moduleName toolboxPath [mexFlags] -# mexExecutable : command to execute mex if on path, use 'mex' -# mexExtension : OS/CPU-dependent extension for MEX binaries -# interfacePath : *absolute* path to directory of module interface file -# moduleName : the name of the module, interface file must be called moduleName.h -# toolboxPath : the directory in which to generate the wrappers -# [mexFlags] : extra flags for the mex command -# Choose include flags depending on build process -if (GTSAM_BUILD_MEX_BIN) - set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) - set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) -else() - set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) - set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) -endif() - -set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${MEX_LIB_ROOT}/gtsam -lgtsam") -if(MSVC OR CYGWIN OR WINGW) - set(mexFlags "${mexFlags} LINKFLAGS='$LINKFLAGS /LIBPATH:${Boost_LIBRARY_DIRS}'") -endif() -set(toolbox_path ${CMAKE_BINARY_DIR}/wrap/gtsam) -set(moduleName gtsam) - -include(GtsamMatlabWrap) -find_mexextension() - -# get binary path for wrap executable to allow for different build configurations (e.g., ROS) -if (NOT EXECUTABLE_OUTPUT_PATH) - set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}) -endif() - -# Code generation command -get_property(WRAP_EXE TARGET wrap PROPERTY LOCATION) -add_custom_target(wrap_gtsam ALL COMMAND - ${WRAP_EXE} - ${MEX_COMMAND} - ${GTSAM_MEX_BIN_EXTENSION} - ${CMAKE_CURRENT_SOURCE_DIR}/../ - ${moduleName} - ${toolbox_path} - "${mexFlags}" - DEPENDS wrap) - -# Build command -if (GTSAM_BUILD_MEX_BIN) - # Actually compile the mex files when building the library - # TODO: pass correct make flags from parent process - message(STATUS "Building Matlab MEX binaries for toolbox with flags ${GTSAM_BUILD_MEX_BINARY_FLAGS}") - if (GTSAM_INSTALL_MEX_BIN) - add_custom_target(wrap_gtsam_build ALL - COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} - WORKING_DIRECTORY ${toolbox_path} - DEPENDS wrap_gtsam) - else() - add_custom_target(wrap_gtsam_build - COMMAND make ${GTSAM_BUILD_MEX_BINARY_FLAGS} - WORKING_DIRECTORY ${toolbox_path} - DEPENDS wrap_gtsam) - endif() -endif () - -if (GTSAM_INSTALL_MATLAB_TOOLBOX) - # Primary toolbox files - # Note that we copy the entire contents of the folder blindly - this is because - # the generated files won't exist at configuration time - message(STATUS "Installing Matlab Toolbox to ${GTSAM_TOOLBOX_INSTALL_PATH}") - install(DIRECTORY DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}) # make an empty folder - # exploit need for trailing slash to specify a full folder, rather than just its contents to copy - install(DIRECTORY ${toolbox_path} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}) - - # Examples - if (GTSAM_INSTALL_MATLAB_EXAMPLES) - message(STATUS "Installing Matlab Toolbox Examples") - file(GLOB matlab_examples "${CMAKE_SOURCE_DIR}/examples/matlab/*.m") - install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) - - message(STATUS "Installing Matlab Toolbox Examples (Data)") - # Data files: *.graph and *.txt - file(GLOB matlab_examples_data_graph "${CMAKE_SOURCE_DIR}/examples/Data/*.graph") - file(GLOB matlab_examples_data_txt "${CMAKE_SOURCE_DIR}/examples/Data/*.txt") - set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) - install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) - endif (GTSAM_INSTALL_MATLAB_EXAMPLES) - - # Tests - if (GTSAM_INSTALL_MATLAB_TESTS) - message(STATUS "Installing Matlab Toolbox Tests") - file(GLOB matlab_tests "${CMAKE_SOURCE_DIR}/tests/matlab/*.m") - install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/tests) - endif (GTSAM_INSTALL_MATLAB_TESTS) -endif (GTSAM_INSTALL_MATLAB_TOOLBOX) From 575fcb999b6381f595c3195bc3528b5b802f884b Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 5 Jun 2012 18:15:53 +0000 Subject: [PATCH 178/914] Fixed missing include --- gtsam/slam/PartialPriorFactor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam/slam/PartialPriorFactor.h b/gtsam/slam/PartialPriorFactor.h index fb8e673cb..215f87ef7 100644 --- a/gtsam/slam/PartialPriorFactor.h +++ b/gtsam/slam/PartialPriorFactor.h @@ -18,6 +18,7 @@ #pragma once #include +#include namespace gtsam { From 00b6f177d226aa4e91cc7c535f1051dd26fda713 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 5 Jun 2012 19:25:31 +0000 Subject: [PATCH 179/914] Removing unnecessary boost dependencies - may need more fixing --- CMakeLists.txt | 2 +- wrap/CMakeLists.txt | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c72a6f295..25ca8d9e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,7 @@ endif() if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.42 COMPONENTS serialization system filesystem thread REQUIRED) +find_package(Boost 1.42 COMPONENTS serialization REQUIRED) # General build settings include_directories( diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 4972e1ee2..16dfbb8e5 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -1,5 +1,7 @@ # Build/install Wrap +find_package(Boost 1.42 COMPONENTS system filesystem thread REQUIRED) + # Build the executable itself file(GLOB wrap_srcs "*.cpp") list(REMOVE_ITEM wrap_srcs wrap.cpp) @@ -18,7 +20,7 @@ install(FILES matlab.h DESTINATION include/wrap) # Build tests if (GTSAM_BUILD_TESTS) add_definitions(-DTOPSRCDIR="${CMAKE_SOURCE_DIR}") - set(wrap_local_libs wrap_lib) + set(wrap_local_libs wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) gtsam_add_subdir_tests("wrap" "${wrap_local_libs}" "${wrap_local_libs}" "") endif(GTSAM_BUILD_TESTS) From 5bcb0de5888651d1a085e42ae5b4e2c80ad7123e Mon Sep 17 00:00:00 2001 From: Summit Patel Date: Tue, 5 Jun 2012 19:54:14 +0000 Subject: [PATCH 180/914] Fixed doxygen warnings. --- gtsam/inference/ClusterTree.h | 4 ++-- gtsam/linear/NoiseModel.h | 7 +++---- gtsam/mainpage.dox | 4 ++-- gtsam/nonlinear/NonlinearFactor.h | 7 +++---- gtsam/nonlinear/Values.h | 8 ++++---- gtsam/nonlinear/WhiteNoiseFactor.h | 2 +- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/gtsam/inference/ClusterTree.h b/gtsam/inference/ClusterTree.h index c5301f030..92919b936 100644 --- a/gtsam/inference/ClusterTree.h +++ b/gtsam/inference/ClusterTree.h @@ -32,8 +32,8 @@ namespace gtsam { /** * A cluster-tree is associated with a factor graph and is defined as in Koller-Friedman: - * each node k represents a subset C_k \sub X, and the tree is family preserving, in that - * each factor f_i is associated with a single cluster and scope(f_i) \sub C_k. + * each node k represents a subset \f$ C_k \sub X \f$, and the tree is family preserving, in that + * each factor \f$ f_i \f$ is associated with a single cluster and \f$ scope(f_i) \sub C_k \f$. * \nosubgrouping */ template diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index 87391be0a..f7a1c351a 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -146,7 +146,6 @@ namespace gtsam { /** * A Gaussian noise model created by specifying a square root information matrix. - * @param smart, check if can be simplified to derived class */ static shared_ptr SqrtInformation(const Matrix& R) { return shared_ptr(new Gaussian(R.rows(),R)); @@ -154,7 +153,7 @@ namespace gtsam { /** * A Gaussian noise model created by specifying a covariance matrix. - * @param smart, check if can be simplified to derived class + * @param smart check if can be simplified to derived class */ static shared_ptr Covariance(const Matrix& covariance, bool smart=false); @@ -267,7 +266,7 @@ namespace gtsam { /** * A diagonal noise model created by specifying a Vector of variances, i.e. * i.e. the diagonal of the covariance matrix. - * @param smart, check if can be simplified to derived class + * @param smart check if can be simplified to derived class */ static shared_ptr Variances(const Vector& variances, bool smart = false); @@ -503,7 +502,7 @@ namespace gtsam { /** * An isotropic noise model created by specifying a variance = sigma^2. - * @param smart, check if can be simplified to derived class + * @param smart check if can be simplified to derived class */ static shared_ptr Variance(size_t dim, double variance, bool smart = false); diff --git a/gtsam/mainpage.dox b/gtsam/mainpage.dox index e81fc1f65..db42b1277 100644 --- a/gtsam/mainpage.dox +++ b/gtsam/mainpage.dox @@ -9,9 +9,9 @@ namespace gtsam { \section new_factor_variable_types Creating new factor and variable types GTSAM comes with a set of variable and factor types typically used in SFM and -SLAM. Geometry variables such as points and poses are in the \ref geometry +SLAM. Geometry variables such as points and poses are in the geometry subdirectory and module. Factors such as BetweenFactor and BearingFactor are in -the \ref gtsam/slam directory. +the gtsam/slam directory. To use GTSAM to solve your own problems, you will often have to create new factor types, which derive either from NonlinearFactor or NoiseModelFactor, or one of their derived types. Here is an outline of the options: diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index a5a838881..1d4d580b9 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -228,7 +228,6 @@ public: /** * Constructor - * @param keys The variables involved in this factor */ template NoiseModelFactor(const SharedNoiseModel& noiseModel, ITERATOR beginKeys, ITERATOR endKeys) @@ -379,14 +378,14 @@ public: /** * Constructor - * @param z measurement - * @param key by which to look up X value in Values + * @param key1 by which to look up X value in Values */ NoiseModelFactor1(const SharedNoiseModel& noiseModel, Key key1) : Base(noiseModel, key1) {} /** Calls the 1-key specific version of evaluateError, which is pure virtual - * so must be implemented in the derived class. */ + * so must be implemented in the derived class. + */ virtual Vector unwhitenedError(const Values& x, boost::optional&> H = boost::none) const { if(this->active(x)) { const X& x1 = x.at(keys_[0]); diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 4a03ab05e..37708d9d9 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -402,7 +402,7 @@ namespace gtsam { * When iterating over the filtered view, only the key-value pairs * with a key causing \c filterFcn to return \c true are visited. Because * the object Filtered returned from filter() is only a - * view the original Values object must not be deallocated or + * view the original Values object must not be deallocated or * go out of scope as long as the view is needed. * @param filterFcn The function that determines which key-value pairs are * included in the filtered view, for which this function returns \c true @@ -421,7 +421,7 @@ namespace gtsam { * template argument \c ValueType and whose key causes the function argument * \c filterFcn to return true are visited when iterating over the filtered * view. Because the object Filtered returned from filter() is only - * a view the original Values object must not be deallocated or + * a view the original Values object must not be deallocated or * go out of scope as long as the view is needed. * @tparam ValueType The type that the value in a key-value pair must match * to be included in the filtered view. Currently, base classes are not @@ -445,7 +445,7 @@ namespace gtsam { * When iterating over the filtered view, only the key-value pairs * with a key causing \c filterFcn to return \c true are visited. Because * the object Filtered returned from filter() is only a - * view the original Values object must not be deallocated or + * view the original Values object must not be deallocated or * go out of scope as long as the view is needed. * @param filterFcn The function that determines which key-value pairs are * included in the filtered view, for which this function returns \c true @@ -464,7 +464,7 @@ namespace gtsam { * template argument \c ValueType and whose key causes the function argument * \c filterFcn to return true are visited when iterating over the filtered * view. Because the object Filtered returned from filter() is only - * a view the original Values object must not be deallocated or + * a view the original Values object must not be deallocated or * go out of scope as long as the view is needed. * @tparam ValueType The type that the value in a key-value pair must match * to be included in the filtered view. Currently, base classes are not diff --git a/gtsam/nonlinear/WhiteNoiseFactor.h b/gtsam/nonlinear/WhiteNoiseFactor.h index 354a1bcbc..f37debd54 100644 --- a/gtsam/nonlinear/WhiteNoiseFactor.h +++ b/gtsam/nonlinear/WhiteNoiseFactor.h @@ -51,7 +51,7 @@ namespace gtsam { public: - /** @brief negative log likelihood as a function of mean \mu and precision \tau + /** @brief negative log likelihood as a function of mean \f$ \mu \f$ and precision \f$ \tau \f$ * @f[ * f(z, \tau, \mu) * = -\log \left( \frac{\sqrt{\tau}}{\sqrt{2\pi}} \exp(-0.5\tau(z-\mu)^2) \right) From 1b5b4d494e3890c8a375394a2f87aad8b44596fb Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 20:03:27 +0000 Subject: [PATCH 181/914] Simplified Values code by moving internal implementation to inline header file --- gtsam/nonlinear/Values-inl.h | 164 +++++++++++++++++++++++++++++++++ gtsam/nonlinear/Values.h | 172 ++++------------------------------- 2 files changed, 180 insertions(+), 156 deletions(-) diff --git a/gtsam/nonlinear/Values-inl.h b/gtsam/nonlinear/Values-inl.h index 40e95188e..4cab86714 100644 --- a/gtsam/nonlinear/Values-inl.h +++ b/gtsam/nonlinear/Values-inl.h @@ -40,6 +40,170 @@ namespace gtsam { ValueCloneAllocator() {} }; + /* ************************************************************************* */ + template + struct _ValuesKeyValuePair { + const Key key; ///< The key + ValueType& value; ///< The value + + _ValuesKeyValuePair(Key _key, ValueType& _value) : key(_key), value(_value) {} + }; + + /* ************************************************************************* */ + template + struct _ValuesConstKeyValuePair { + const Key key; ///< The key + const ValueType& value; ///< The value + + _ValuesConstKeyValuePair(Key _key, const ValueType& _value) : key(_key), value(_value) {} + _ValuesConstKeyValuePair(const _ValuesKeyValuePair& rhs) : key(rhs.key), value(rhs.value) {} + }; + + /* ************************************************************************* */ + template + class Values::Filtered { + public: + /** A key-value pair, with the value a specific derived Value type. */ + typedef _ValuesKeyValuePair KeyValuePair; + typedef _ValuesConstKeyValuePair ConstKeyValuePair; + typedef KeyValuePair value_type; + + typedef + boost::transform_iterator< + KeyValuePair(*)(Values::KeyValuePair), + boost::filter_iterator< + boost::function, + Values::iterator> > + iterator; + + typedef iterator const_iterator; + + typedef + boost::transform_iterator< + ConstKeyValuePair(*)(Values::ConstKeyValuePair), + boost::filter_iterator< + boost::function, + Values::const_iterator> > + const_const_iterator; + + iterator begin() { return begin_; } + iterator end() { return end_; } + const_iterator begin() const { return begin_; } + const_iterator end() const { return end_; } + const_const_iterator beginConst() const { return constBegin_; } + const_const_iterator endConst() const { return constEnd_; } + + /** Returns the number of values in this view */ + size_t size() const { + size_t i = 0; + for (const_const_iterator it = beginConst(); it != endConst(); ++it) + ++i; + return i; + } + + private: + Filtered(const boost::function& filter, Values& values) : + begin_(boost::make_transform_iterator( + boost::make_filter_iterator( + filter, values.begin(), values.end()), + &castHelper)), + end_(boost::make_transform_iterator( + boost::make_filter_iterator( + filter, values.end(), values.end()), + &castHelper)), + constBegin_(boost::make_transform_iterator( + boost::make_filter_iterator( + filter, ((const Values&)values).begin(), ((const Values&)values).end()), + &castHelper)), + constEnd_(boost::make_transform_iterator( + boost::make_filter_iterator( + filter, ((const Values&)values).end(), ((const Values&)values).end()), + &castHelper)) {} + + friend class Values; + iterator begin_; + iterator end_; + const_const_iterator constBegin_; + const_const_iterator constEnd_; + }; + + /* ************************************************************************* */ + template + class Values::ConstFiltered { + public: + /** A const key-value pair, with the value a specific derived Value type. */ + typedef _ValuesConstKeyValuePair KeyValuePair; + typedef KeyValuePair value_type; + + typedef typename Filtered::const_const_iterator iterator; + typedef typename Filtered::const_const_iterator const_iterator; + + /** Conversion from Filtered to ConstFiltered */ + ConstFiltered(const Filtered& rhs) : + begin_(rhs.beginConst()), + end_(rhs.endConst()) {} + + iterator begin() { return begin_; } + iterator end() { return end_; } + const_iterator begin() const { return begin_; } + const_iterator end() const { return end_; } + + /** Returns the number of values in this view */ + size_t size() const { + size_t i = 0; + for (const_iterator it = begin(); it != end(); ++it) + ++i; + return i; + } + + private: + friend class Values; + const_iterator begin_; + const_iterator end_; + ConstFiltered(const boost::function& filter, const Values& values) { + // We remove the const from values to create a non-const Filtered + // view, then pull the const_iterators out of it. + const Filtered filtered(filter, const_cast(values)); + begin_ = filtered.beginConst(); + end_ = filtered.endConst(); + } + }; + + /* ************************************************************************* */ + template + Values::Values(const Values::ConstFiltered& view) { + BOOST_FOREACH(const typename ConstFiltered::KeyValuePair& key_value, view) { + Key key = key_value.key; + insert(key, key_value.value); + } + } + + /* ************************************************************************* */ + Values::Filtered + inline Values::filter(const boost::function& filterFcn) { + return filter(filterFcn); + } + + /* ************************************************************************* */ + template + Values::Filtered + Values::filter(const boost::function& filterFcn) { + return Filtered(boost::bind(&filterHelper, filterFcn, _1), *this); + } + + /* ************************************************************************* */ + Values::ConstFiltered + inline Values::filter(const boost::function& filterFcn) const { + return filter(filterFcn); + } + + /* ************************************************************************* */ + template + Values::ConstFiltered + Values::filter(const boost::function& filterFcn) const { + return ConstFiltered(boost::bind(&filterHelper, filterFcn, _1), *this); + } + /* ************************************************************************* */ template const ValueType& Values::at(Key j) const { diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 37708d9d9..d9778bb0f 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -122,133 +122,15 @@ namespace gtsam { typedef KeyValuePair value_type; - private: - template - struct _KeyValuePair { - const Key key; ///< The key - ValueType& value; ///< The value - - _KeyValuePair(Key _key, ValueType& _value) : key(_key), value(_value) {} - }; - - template - struct _ConstKeyValuePair { - const Key key; ///< The key - const ValueType& value; ///< The value - - _ConstKeyValuePair(Key _key, const ValueType& _value) : key(_key), value(_value) {} - _ConstKeyValuePair(const _KeyValuePair& rhs) : key(rhs.key), value(rhs.value) {} - }; - public: + /** A filtered view of a Values, returned from Values::filter. */ template - class Filtered { - public: - /** A key-value pair, with the value a specific derived Value type. */ - typedef _KeyValuePair KeyValuePair; - typedef _ConstKeyValuePair ConstKeyValuePair; - typedef KeyValuePair value_type; - - typedef - boost::transform_iterator< - KeyValuePair(*)(Values::KeyValuePair), - boost::filter_iterator< - boost::function, - Values::iterator> > - iterator; - - typedef iterator const_iterator; - - typedef - boost::transform_iterator< - ConstKeyValuePair(*)(Values::ConstKeyValuePair), - boost::filter_iterator< - boost::function, - Values::const_iterator> > - const_const_iterator; - - iterator begin() { return begin_; } - iterator end() { return end_; } - const_iterator begin() const { return begin_; } - const_iterator end() const { return end_; } - const_const_iterator beginConst() const { return constBegin_; } - const_const_iterator endConst() const { return constEnd_; } - - /** Returns the number of values in this view */ - size_t size() const { - size_t i = 0; - for (const_const_iterator it = beginConst(); it != endConst(); ++it) - ++i; - return i; - } - - private: - Filtered(const boost::function& filter, Values& values) : - begin_(boost::make_transform_iterator( - boost::make_filter_iterator( - filter, values.begin(), values.end()), - &castHelper)), - end_(boost::make_transform_iterator( - boost::make_filter_iterator( - filter, values.end(), values.end()), - &castHelper)), - constBegin_(boost::make_transform_iterator( - boost::make_filter_iterator( - filter, ((const Values&)values).begin(), ((const Values&)values).end()), - &castHelper)), - constEnd_(boost::make_transform_iterator( - boost::make_filter_iterator( - filter, ((const Values&)values).end(), ((const Values&)values).end()), - &castHelper)) {} - - friend class Values; - iterator begin_; - iterator end_; - const_const_iterator constBegin_; - const_const_iterator constEnd_; - }; + class Filtered; + /** A filtered view of a const Values, returned from Values::filter. */ template - class ConstFiltered { - public: - /** A const key-value pair, with the value a specific derived Value type. */ - typedef _ConstKeyValuePair KeyValuePair; - typedef KeyValuePair value_type; - - typedef typename Filtered::const_const_iterator iterator; - typedef typename Filtered::const_const_iterator const_iterator; - - /** Conversion from Filtered to ConstFiltered */ - ConstFiltered(const Filtered& rhs) : - begin_(rhs.beginConst()), - end_(rhs.endConst()) {} - - iterator begin() { return begin_; } - iterator end() { return end_; } - const_iterator begin() const { return begin_; } - const_iterator end() const { return end_; } - - /** Returns the number of values in this view */ - size_t size() const { - size_t i = 0; - for (const_iterator it = begin(); it != end(); ++it) - ++i; - return i; - } - - private: - friend class Values; - const_iterator begin_; - const_iterator end_; - ConstFiltered(const boost::function& filter, const Values& values) { - // We remove the const from values to create a non-const Filtered - // view, then pull the const_iterators out of it. - const Filtered filtered(filter, const_cast(values)); - begin_ = filtered.beginConst(); - end_ = filtered.endConst(); - } - }; + class ConstFiltered; /** Default constructor creates an empty Values class */ Values() {} @@ -256,23 +138,9 @@ namespace gtsam { /** Copy constructor duplicates all keys and values */ Values(const Values& other); - /** Constructor from a Filtered view copies out all values */ + /** Constructor from a Filtered or ConstFiltered view */ template - Values(const Filtered& view) { - BOOST_FOREACH(const typename Filtered::KeyValuePair& key_value, view) { - Key key = key_value.key; - insert(key, key_value.value); - } - } - - /** Constructor from Const Filtered view */ - template - Values(const ConstFiltered& view) { - BOOST_FOREACH(const typename ConstFiltered::KeyValuePair& key_value, view) { - Key key = key_value.key; - insert(key, key_value.value); - } - } + Values(const ConstFiltered& view); /// @name Testable /// @{ @@ -323,12 +191,6 @@ namespace gtsam { /** Get a zero VectorValues of the correct structure */ VectorValues zeroVectors(const Ordering& ordering) const; - private: - static ConstKeyValuePair make_const_deref_pair(const KeyValueMap::const_iterator::value_type& key_value) { - return ConstKeyValuePair(key_value.first, *key_value.second); } - static KeyValuePair make_deref_pair(const KeyValueMap::iterator::value_type& key_value) { - return KeyValuePair(key_value.first, *key_value.second); } - public: const_iterator begin() const { return boost::make_transform_iterator(values_.begin(), &make_const_deref_pair); } const_iterator end() const { return boost::make_transform_iterator(values_.end(), &make_const_deref_pair); } @@ -411,9 +273,7 @@ namespace gtsam { * the original Values class. */ Filtered - filter(const boost::function& filterFcn) { - return filter(filterFcn); - } + filter(const boost::function& filterFcn); /** * Return a filtered view of this Values class, without copying any data. @@ -436,9 +296,7 @@ namespace gtsam { */ template Filtered - filter(const boost::function& filterFcn = (boost::lambda::_1, true)) { - return Filtered(boost::bind(&filterHelper, filterFcn, _1), *this); - } + filter(const boost::function& filterFcn = (boost::lambda::_1, true)); /** * Return a filtered view of this Values class, without copying any data. @@ -454,9 +312,7 @@ namespace gtsam { * the original Values class. */ ConstFiltered - filter(const boost::function& filterFcn) const { - return filter(filterFcn); - } + filter(const boost::function& filterFcn) const; /** * Return a filtered view of this Values class, without copying any data. @@ -478,9 +334,7 @@ namespace gtsam { */ template ConstFiltered - filter(const boost::function& filterFcn = (boost::lambda::_1, true)) const { - return ConstFiltered(boost::bind(&filterHelper, filterFcn, _1), *this); - } + filter(const boost::function& filterFcn = (boost::lambda::_1, true)) const; private: // Filters based on ValueType (if not Value) and also based on the user- @@ -505,6 +359,12 @@ namespace gtsam { ar & BOOST_SERIALIZATION_NVP(values_); } + static ConstKeyValuePair make_const_deref_pair(const KeyValueMap::const_iterator::value_type& key_value) { + return ConstKeyValuePair(key_value.first, *key_value.second); } + + static KeyValuePair make_deref_pair(const KeyValueMap::iterator::value_type& key_value) { + return KeyValuePair(key_value.first, *key_value.second); } + }; /* ************************************************************************* */ From dacff98f9f614272118aa631f6dda8e63fda029b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 20:03:31 +0000 Subject: [PATCH 182/914] Using boost timer instead of chrono to support older boost versions --- gtsam/base/timing.cpp | 20 +- gtsam/base/timing.h | 406 ++++++++++++++++++------------------ gtsam/linear/NoiseModel.cpp | 6 - 3 files changed, 214 insertions(+), 218 deletions(-) diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index 1388c2f18..f5b5319d0 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -48,7 +47,7 @@ void TimingOutline::add(size_t usecs) { /* ************************************************************************* */ TimingOutline::TimingOutline(const std::string& label) : - t_(0), t2_(0.0), tIt_(0), tMax_(0), tMin_(0), n_(0), label_(label), timerActive_(false) {} + t_(0), t2_(0.0), tIt_(0), tMax_(0), tMin_(0), n_(0), label_(label) {} /* ************************************************************************* */ size_t TimingOutline::time() const { @@ -151,18 +150,15 @@ const boost::shared_ptr& TimingOutline::child(size_t child, const /* ************************************************************************* */ void TimingOutline::tic() { - assert(!timerActive_); - timerActive_ = true; - gettimeofday(&t0_, NULL); + assert(timer_.is_stopped()); + timer_.start(); } /* ************************************************************************* */ void TimingOutline::toc() { - struct timeval t; - gettimeofday(&t, NULL); - assert(timerActive_); - add(t.tv_sec*1000000 + t.tv_usec - (t0_.tv_sec*1000000 + t0_.tv_usec)); - timerActive_ = false; + assert(!timer_.is_stopped()); + timer_.stop(); + add((timer_.elapsed().user + timer_.elapsed().system) / 1000); } /* ************************************************************************* */ @@ -231,6 +227,8 @@ void toc_(size_t id, const std::string& label) { toc_(id); } +#ifdef ENABLE_OLD_TIMING + /* ************************************************************************* */ // Timing class implementation void Timing::print() { @@ -260,3 +258,5 @@ void ticPop_(const std::string& prefix, const std::string& id) { else timingPrefix.resize(timingPrefix.size() - prefix.size() - 1); } + +#endif \ No newline at end of file diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index 94498c3b3..e09e3bb14 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -1,202 +1,204 @@ -/* ---------------------------------------------------------------------------- - - * 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 timing.h - * @brief Timing utilities - * @author Richard Roberts, Michael Kaess - * @date Oct 5, 2010 - */ -#pragma once - -#include -#include -#include -#include -#include - -class TimingOutline; -extern boost::shared_ptr timingRoot; -extern boost::weak_ptr timingCurrent; - -class TimingOutline { -protected: - size_t t_; - double t2_ ; /* cache the \sum t_i^2 */ - size_t tIt_; - size_t tMax_; - size_t tMin_; - size_t n_; - std::string label_; - - boost::weak_ptr parent_; - std::vector > children_; - struct timeval t0_; - bool timerActive_; - - void add(size_t usecs); - -public: - - TimingOutline(const std::string& label); - - size_t time() const; - - void print(const std::string& outline = "") const; - - void print2(const std::string& outline = "", const double parentTotal = -1.0) const; - - const boost::shared_ptr& child(size_t child, const std::string& label, const boost::weak_ptr& thisPtr); - - void tic(); - - void toc(); - - void finishedIteration(); - - friend class AutoTimer; - friend void toc_(size_t id); - friend void toc_(size_t id, const std::string& label); -}; // \TimingOutline - -void tic_(size_t id, const std::string& label); - -void toc_(size_t id); - -void toc_(size_t id, const std::string& label); - -inline void tictoc_finishedIteration_() { - timingRoot->finishedIteration(); -} - -#ifdef ENABLE_TIMING -inline void tic(size_t id, const std::string& label) { tic_(id, label); } -inline void toc(size_t id) { toc_(id); } -inline void toc(size_t id, const std::string& label) { toc_(id, label); } -inline void tictoc_finishedIteration() { tictoc_finishedIteration_(); } -#else -inline void tic(size_t, const char*) {} -inline void toc(size_t) {} -inline void toc(size_t, const char*) {} -inline void tictoc_finishedIteration() {} -#endif - -// simple class for accumulating execution timing information by name -class Timing; -extern Timing timing; -extern std::string timingPrefix; - -double _tic(); -double _toc(double t); -double tic(const std::string& id); -double toc(const std::string& id); -void ticPush(const std::string& id); -void ticPop(const std::string& id); -void tictoc_print(); -void tictoc_finishedIteration(); - -/** These underscore versions work evening when ENABLE_TIMING is not defined */ -double _tic_(); -double _toc_(double t); -double tic_(const std::string& id); -double toc_(const std::string& id); -void ticPush_(const std::string& id); -void ticPop_(const std::string& id); -void tictoc_print_(); -void tictoc_finishedIteration_(); - - - -// simple class for accumulating execution timing information by name -class Timing { - class Stats { - public: - std::string label; - double t0; - double t; - double t_max; - double t_min; - int n; - }; - std::map stats; -public: - void add_t0(const std::string& id, double t0) { - stats[id].t0 = t0; - } - double get_t0(const std::string& id) { - return stats[id].t0; - } - void add_dt(const std::string& id, double dt) { - Stats& s = stats[id]; - s.t += dt; - s.n++; - if (s.n==1 || s.t_max < dt) s.t_max = dt; - if (s.n==1 || s.t_min > dt) s.t_min = dt; - } - void print(); - - double time(const std::string& id) { - Stats& s = stats[id]; - return s.t; - } -}; - -double _tic_(); -inline double _toc_(double t) { - double s = _tic_(); - return (std::max(0., s-t)); -} -inline double tic_(const std::string& id) { - double t0 = _tic_(); - timing.add_t0(timingPrefix + " " + id, t0); - return t0; -} -inline double toc_(const std::string& id) { - std::string comb(timingPrefix + " " + id); - double dt = _toc_(timing.get_t0(comb)); - timing.add_dt(comb, dt); - return dt; -} -inline void ticPush_(const std::string& prefix, const std::string& id) { - if(timingPrefix.size() > 0) - timingPrefix += "."; - timingPrefix += prefix; - tic_(id); -} -void ticPop_(const std::string& prefix, const std::string& id); - -inline void tictoc_print_() { - timing.print(); - timingRoot->print(); -} - -/* print mean and standard deviation */ -inline void tictoc_print2_() { - timingRoot->print2(); -} - -#ifdef ENABLE_TIMING -inline double _tic() { return _tic_(); } -inline double _toc(double t) { return _toc_(t); } -inline double tic(const std::string& id) { return tic_(id); } -inline double toc(const std::string& id) { return toc_(id); } -inline void ticPush(const std::string& prefix, const std::string& id) { ticPush_(prefix, id); } -inline void ticPop(const std::string& prefix, const std::string& id) { ticPop_(prefix, id); } -inline void tictoc_print() { tictoc_print_(); } -#else -inline double _tic() {return 0.;} -inline double _toc(double) {return 0.;} -inline double tic(const std::string&) {return 0.;} -inline double toc(const std::string&) {return 0.;} -inline void ticPush(const std::string&, const std::string&) {} -inline void ticPop(const std::string&, const std::string&) {} -inline void tictoc_print() {} -#endif +/* ---------------------------------------------------------------------------- + + * 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 timing.h + * @brief Timing utilities + * @author Richard Roberts, Michael Kaess + * @date Oct 5, 2010 + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +class TimingOutline; +extern boost::shared_ptr timingRoot; +extern boost::weak_ptr timingCurrent; + +class TimingOutline { +protected: + size_t t_; + double t2_ ; /* cache the \sum t_i^2 */ + size_t tIt_; + size_t tMax_; + size_t tMin_; + size_t n_; + std::string label_; + + boost::weak_ptr parent_; + std::vector > children_; + boost::timer::cpu_timer timer_; + + void add(size_t usecs); + +public: + + TimingOutline(const std::string& label); + + size_t time() const; + + void print(const std::string& outline = "") const; + + void print2(const std::string& outline = "", const double parentTotal = -1.0) const; + + const boost::shared_ptr& child(size_t child, const std::string& label, const boost::weak_ptr& thisPtr); + + void tic(); + + void toc(); + + void finishedIteration(); + + friend class AutoTimer; + friend void toc_(size_t id); + friend void toc_(size_t id, const std::string& label); +}; // \TimingOutline + +void tic_(size_t id, const std::string& label); + +void toc_(size_t id); + +void toc_(size_t id, const std::string& label); + +inline void tictoc_finishedIteration_() { + timingRoot->finishedIteration(); +} + +#ifdef ENABLE_TIMING +inline void tic(size_t id, const std::string& label) { tic_(id, label); } +inline void toc(size_t id) { toc_(id); } +inline void toc(size_t id, const std::string& label) { toc_(id, label); } +inline void tictoc_finishedIteration() { tictoc_finishedIteration_(); } +#else +inline void tic(size_t, const char*) {} +inline void toc(size_t) {} +inline void toc(size_t, const char*) {} +inline void tictoc_finishedIteration() {} +#endif + + +inline void tictoc_print_() { + timingRoot->print(); +} + +/* print mean and standard deviation */ +inline void tictoc_print2_() { + timingRoot->print2(); +} + +#ifdef ENABLE_OLD_TIMING + +// simple class for accumulating execution timing information by name +class Timing; +extern Timing timing; +extern std::string timingPrefix; + +double _tic(); +double _toc(double t); +double tic(const std::string& id); +double toc(const std::string& id); +void ticPush(const std::string& id); +void ticPop(const std::string& id); +void tictoc_finishedIteration(); + +/** These underscore versions work evening when ENABLE_TIMING is not defined */ +double _tic_(); +double _toc_(double t); +double tic_(const std::string& id); +double toc_(const std::string& id); +void ticPush_(const std::string& id); +void ticPop_(const std::string& id); +void tictoc_finishedIteration_(); + + + +// simple class for accumulating execution timing information by name +class Timing { + class Stats { + public: + std::string label; + double t0; + double t; + double t_max; + double t_min; + int n; + }; + std::map stats; +public: + void add_t0(const std::string& id, double t0) { + stats[id].t0 = t0; + } + double get_t0(const std::string& id) { + return stats[id].t0; + } + void add_dt(const std::string& id, double dt) { + Stats& s = stats[id]; + s.t += dt; + s.n++; + if (s.n==1 || s.t_max < dt) s.t_max = dt; + if (s.n==1 || s.t_min > dt) s.t_min = dt; + } + void print(); + + double time(const std::string& id) { + Stats& s = stats[id]; + return s.t; + } +}; + +double _tic_(); +inline double _toc_(double t) { + double s = _tic_(); + return (std::max(0., s-t)); +} +inline double tic_(const std::string& id) { + double t0 = _tic_(); + timing.add_t0(timingPrefix + " " + id, t0); + return t0; +} +inline double toc_(const std::string& id) { + std::string comb(timingPrefix + " " + id); + double dt = _toc_(timing.get_t0(comb)); + timing.add_dt(comb, dt); + return dt; +} +inline void ticPush_(const std::string& prefix, const std::string& id) { + if(timingPrefix.size() > 0) + timingPrefix += "."; + timingPrefix += prefix; + tic_(id); +} +void ticPop_(const std::string& prefix, const std::string& id); + +#ifdef ENABLE_TIMING +inline double _tic() { return _tic_(); } +inline double _toc(double t) { return _toc_(t); } +inline double tic(const std::string& id) { return tic_(id); } +inline double toc(const std::string& id) { return toc_(id); } +inline void ticPush(const std::string& prefix, const std::string& id) { ticPush_(prefix, id); } +inline void ticPop(const std::string& prefix, const std::string& id) { ticPop_(prefix, id); } +inline void tictoc_print() { tictoc_print_(); } +#else +inline double _tic() {return 0.;} +inline double _toc(double) {return 0.;} +inline double tic(const std::string&) {return 0.;} +inline double toc(const std::string&) {return 0.;} +inline void ticPush(const std::string&, const std::string&) {} +inline void ticPop(const std::string&, const std::string&) {} +inline void tictoc_print() {} +#endif + +#endif \ No newline at end of file diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index 073097ee2..a0901c58b 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -140,19 +140,13 @@ SharedDiagonal Gaussian::Cholesky(Matrix& Ab, size_t nFrontals) const { // TODO: really no rank problems ? // pre-whiten everything (cheaply if possible) - tic("Cholesky: 1 whiten"); WhitenInPlace(Ab); - toc("Cholesky: 1 whiten"); // Form A'*A (todo: this is probably less efficient than possible) - tic("Cholesky: 2 A' * A"); Ab = Ab.transpose() * Ab; - toc("Cholesky: 2 A' * A"); // Use Cholesky to factor Ab - tic("Cholesky: 3 careful"); size_t maxrank = choleskyCareful(Ab).first; - toc("Cholesky: 3 careful"); // Due to numerical error the rank could appear to be more than the number // of variables. The important part is that it does not includes the From 3cc739cc07083257fa1f73804df59dcaa18490c9 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 20:03:33 +0000 Subject: [PATCH 183/914] Fixed link path in make_gtsam --- gtsam/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 45d14263d..32cc7a766 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -130,7 +130,7 @@ if (GTSAM_BUILD_WRAP) endif() # Generate, build and install toolbox - set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${MEX_LIB_ROOT}/gtsam -lgtsam") + set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${MEX_LIB_ROOT} -lgtsam") # Macro to handle details of setting up targets wrap_library(gtsam "${mexFlags}" "../") From c5a406578aeede7c85bdedf72746c84c1bdad8ba Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 20:04:41 +0000 Subject: [PATCH 184/914] Typo --- gtsam/base/timing.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index f5b5319d0..edb436822 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -30,7 +30,7 @@ boost::shared_ptr timingRoot(new TimingOutline("Total")); boost::weak_ptr timingCurrent(timingRoot); -Timing timing; +//Timing timing; std::string timingPrefix; /* ************************************************************************* */ @@ -259,4 +259,4 @@ void ticPop_(const std::string& prefix, const std::string& id) { timingPrefix.resize(timingPrefix.size() - prefix.size() - 1); } -#endif \ No newline at end of file +#endif From ecbe2ee12e01b048c430154b5e8e63d3d5f1bcee Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 20:05:44 +0000 Subject: [PATCH 185/914] Fixed gtsam linking with unnecessary boost libraries that caused undefined symbol in matlab --- gtsam/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 32cc7a766..ec0d7847d 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -85,7 +85,7 @@ message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") if (GTSAM_BUILD_STATIC_LIBRARY) message(STATUS "Building GTSAM - static") add_library(gtsam-static STATIC ${gtsam_srcs}) - target_link_libraries(gtsam-static ${Boost_LIBRARIES}) + target_link_libraries(gtsam-static ${Boost_SERIALIZATION_LIBRARY}) set_target_properties(gtsam-static PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 @@ -101,7 +101,7 @@ endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) message(STATUS "Building GTSAM - shared") add_library(gtsam-shared SHARED ${gtsam_srcs}) - target_link_libraries(gtsam-shared ${Boost_LIBRARIES}) + target_link_libraries(gtsam-shared ${Boost_SERIALIZATION_LIBRARY}) set_target_properties(gtsam-shared PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 From 8d2c99b2cf3952aa1fbf6640ba383a1d319a5fce Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 20:11:21 +0000 Subject: [PATCH 186/914] Fixed gtsam linking with unnecessary boost libraries that caused undefined symbol in matlab (reverse-merged from commit b8cea352c107b3528e7a9313690c4fe006128a4b) --- gtsam/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index ec0d7847d..32cc7a766 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -85,7 +85,7 @@ message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") if (GTSAM_BUILD_STATIC_LIBRARY) message(STATUS "Building GTSAM - static") add_library(gtsam-static STATIC ${gtsam_srcs}) - target_link_libraries(gtsam-static ${Boost_SERIALIZATION_LIBRARY}) + target_link_libraries(gtsam-static ${Boost_LIBRARIES}) set_target_properties(gtsam-static PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 @@ -101,7 +101,7 @@ endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) message(STATUS "Building GTSAM - shared") add_library(gtsam-shared SHARED ${gtsam_srcs}) - target_link_libraries(gtsam-shared ${Boost_SERIALIZATION_LIBRARY}) + target_link_libraries(gtsam-shared ${Boost_LIBRARIES}) set_target_properties(gtsam-shared PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 From 5fc823c3af2a8fe7580b6f2e81b57040ef3bb0f3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 21:30:38 +0000 Subject: [PATCH 187/914] Fixed gtsam linking with unnecessary boost libraries that caused undefined symbol in matlab --- gtsam/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 32cc7a766..ec0d7847d 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -85,7 +85,7 @@ message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") if (GTSAM_BUILD_STATIC_LIBRARY) message(STATUS "Building GTSAM - static") add_library(gtsam-static STATIC ${gtsam_srcs}) - target_link_libraries(gtsam-static ${Boost_LIBRARIES}) + target_link_libraries(gtsam-static ${Boost_SERIALIZATION_LIBRARY}) set_target_properties(gtsam-static PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 @@ -101,7 +101,7 @@ endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) message(STATUS "Building GTSAM - shared") add_library(gtsam-shared SHARED ${gtsam_srcs}) - target_link_libraries(gtsam-shared ${Boost_LIBRARIES}) + target_link_libraries(gtsam-shared ${Boost_SERIALIZATION_LIBRARY}) set_target_properties(gtsam-shared PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 From c2fe87fdc493d62924946bee5144f703158a7d98 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 21:30:42 +0000 Subject: [PATCH 188/914] Fallback on old boost timers --- gtsam/base/timing.cpp | 16 +++++++++++++++- gtsam/base/timing.h | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index edb436822..ba784ffab 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -30,7 +30,9 @@ boost::shared_ptr timingRoot(new TimingOutline("Total")); boost::weak_ptr timingCurrent(timingRoot); -//Timing timing; +#ifdef ENABLE_OLD_TIMING +Timing timing; +#endif std::string timingPrefix; /* ************************************************************************* */ @@ -150,15 +152,27 @@ const boost::shared_ptr& TimingOutline::child(size_t child, const /* ************************************************************************* */ void TimingOutline::tic() { +#ifdef GTSAM_USING_NEW_BOOST_TIMERS assert(timer_.is_stopped()); timer_.start(); +#else + assert(!timerActive_); + timer_.restart(); + *timerActive_ = true; +#endif } /* ************************************************************************* */ void TimingOutline::toc() { +#ifdef GTSAM_USING_NEW_BOOST_TIMERS assert(!timer_.is_stopped()); timer_.stop(); add((timer_.elapsed().user + timer_.elapsed().system) / 1000); +#else + assert(timerActive_); + double elapsed = timer_.elapsed(); + add(size_t(elapsed * 1000000.0)); +#endif } /* ************************************************************************* */ diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index e09e3bb14..09d0a0da0 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -22,7 +22,17 @@ #include #include #include +#include + +#if BOOST_VERSION >= 104800 +#define GTSAM_USING_NEW_BOOST_TIMERS +#endif + +#ifdef GTSAM_USING_NEW_BOOST_TIMERS #include +#else +#include +#endif class TimingOutline; extern boost::shared_ptr timingRoot; @@ -40,7 +50,12 @@ protected: boost::weak_ptr parent_; std::vector > children_; +#ifdef GTSAM_USING_NEW_BOOST_TIMERS boost::timer::cpu_timer timer_; +#else + boost::timer timer_; + gtsam::ValueWithDefault timerActive_; +#endif void add(size_t usecs); From d83c4c390cb91576983e62652aaeafb4cd0d558f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 21:31:27 +0000 Subject: [PATCH 189/914] Added non-const constructor from filtered --- gtsam/nonlinear/Values-inl.h | 10 ++++++++++ gtsam/nonlinear/Values.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/gtsam/nonlinear/Values-inl.h b/gtsam/nonlinear/Values-inl.h index 4cab86714..c38f14177 100644 --- a/gtsam/nonlinear/Values-inl.h +++ b/gtsam/nonlinear/Values-inl.h @@ -169,6 +169,16 @@ namespace gtsam { } }; + /* ************************************************************************* */ + /** Constructor from a Filtered view copies out all values */ + template + Values::Values(const Values::Filtered& view) { + BOOST_FOREACH(const typename Filtered::KeyValuePair& key_value, view) { + Key key = key_value.key; + insert(key, key_value.value); + } + } + /* ************************************************************************* */ template Values::Values(const Values::ConstFiltered& view) { diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index d9778bb0f..4bc5f0f7e 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -138,6 +138,10 @@ namespace gtsam { /** Copy constructor duplicates all keys and values */ Values(const Values& other); + /** Constructor from a Filtered view copies out all values */ + template + Values(const Filtered& view); + /** Constructor from a Filtered or ConstFiltered view */ template Values(const ConstFiltered& view); From 82e3d2323029efee6a02ee5d3ab498726d4a3808 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 21:50:49 +0000 Subject: [PATCH 190/914] Always using old boost timers to avoid boost system dependency --- gtsam/base/timing.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index 09d0a0da0..4dc3411ce 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -24,9 +24,11 @@ #include #include +#if 0 #if BOOST_VERSION >= 104800 #define GTSAM_USING_NEW_BOOST_TIMERS #endif +#endif #ifdef GTSAM_USING_NEW_BOOST_TIMERS #include @@ -216,4 +218,4 @@ inline void ticPop(const std::string&, const std::string&) {} inline void tictoc_print() {} #endif -#endif \ No newline at end of file +#endif From 5d8f287e6ef31364d2dc0bc0f7ab2404dfaa703c Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 5 Jun 2012 21:56:19 +0000 Subject: [PATCH 191/914] Added comment explaining disabled new boost timers --- gtsam/base/timing.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index 4dc3411ce..66823effc 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -24,6 +24,9 @@ #include #include +// Enabling the new Boost timers introduces dependencies on other Boost +// libraries so this is disabled for now until we modify the build scripts +// to link each component or MATLAB wrapper with only the libraries it needs. #if 0 #if BOOST_VERSION >= 104800 #define GTSAM_USING_NEW_BOOST_TIMERS From e6a0663540e28ec3f92b3d1d7783ea7a200d1019 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 5 Jun 2012 23:51:12 +0000 Subject: [PATCH 192/914] rotate and color 3D covariance ellipses for visual SLAM example with Frank --- examples/matlab/VisualSLAMExample.m | 32 +++++++++++++++------------ examples/matlab/covarianceEllipse3D.m | 8 ++++--- examples/matlab/plotPose3.m | 29 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 examples/matlab/plotPose3.m diff --git a/examples/matlab/VisualSLAMExample.m b/examples/matlab/VisualSLAMExample.m index c5b0f7969..93ede149a 100644 --- a/examples/matlab/VisualSLAMExample.m +++ b/examples/matlab/VisualSLAMExample.m @@ -28,17 +28,17 @@ points = {gtsamPoint3([10 10 10]'),... gtsamPoint3([10 -10 -10]')}; % Camera poses on a circle around the cube, pointing at the world origin -nCameras = 8; +nCameras = 4; r = 30; poses = {}; for i=1:nCameras - theta = i*2*pi/nCameras; - posei = gtsamPose3(... + theta = (i-1)*2*pi/nCameras; + pose_i = gtsamPose3(... gtsamRot3([-sin(theta) 0 -cos(theta); cos(theta) 0 -sin(theta); 0 -1 0]),... gtsamPoint3([r*cos(theta), r*sin(theta), 0]')); - poses = [poses {posei}]; + poses = [poses {pose_i}]; end % 2D visual measurements, simulated with Gaussian noise @@ -61,8 +61,6 @@ pointNoiseSampler = gtsamSharedDiagonal(pointNoiseSigmas); poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; poseNoiseSampler = gtsamSharedDiagonal(poseNoiseSigmas); -hold off; - %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) graph = visualSLAMGraph; @@ -74,11 +72,17 @@ for i=1:size(z,1) end end -%% Add Gaussian priors for a pose and a landmark to constraint the system -posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); -graph.addPosePrior(symbol('x',1), poses{1}, posePriorNoise); +%% Add Gaussian priors for a pose and a landmark to constrain the system +% posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); +% graph.addPosePrior(symbol('x',1), poses{1}, posePriorNoise); pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); graph.addPointPrior(symbol('l',1), points{1}, pointPriorNoise); +pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); +graph.addPointPrior(symbol('l',8), points{8}, pointPriorNoise); +pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); +graph.addPointPrior(symbol('l',5), points{5}, pointPriorNoise); +pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); +graph.addPointPrior(symbol('l',4), points{4}, pointPriorNoise); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); @@ -101,6 +105,7 @@ result.print(sprintf('\nFinal result:\n ')); marginals = graph.marginals(result); %% Plot results with covariance ellipses +figure(1);clf hold on; for j=1:size(points,2) P = marginals.marginalCovariance(symbol('l',j)); @@ -110,10 +115,9 @@ for j=1:size(points,2) end for i=1:size(poses,2) - P = marginals.marginalCovariance(symbol('x',i)); - posei = result.pose(symbol('x',i)) - plotCamera(posei,10); - posei_t = posei.translation() - covarianceEllipse3D([posei_t.x;posei_t.y;posei_t.z],P(4:6,4:6)); + P = marginals.marginalCovariance(symbol('x',i)) + pose_i = result.pose(symbol('x',i)) + plotPose3(pose_i,P,10); end +axis equal diff --git a/examples/matlab/covarianceEllipse3D.m b/examples/matlab/covarianceEllipse3D.m index 0ff34c8c8..8799415a6 100644 --- a/examples/matlab/covarianceEllipse3D.m +++ b/examples/matlab/covarianceEllipse3D.m @@ -6,7 +6,7 @@ function covarianceEllipse3D(c,P) % % Modified from http://www.mathworks.com/matlabcentral/newsreader/view_thread/42966 -[e,s] = eig(P); +[e,s] = svd(P); k = 11.82; radii = k*sqrt(diag(s)); @@ -16,10 +16,12 @@ radii = k*sqrt(diag(s)); % rotate data with orientation matrix U and center M data = kron(e(:,1),xc) + kron(e(:,2),yc) + kron(e(:,3),zc); n = size(data,2); -x = data(1:n,:)+c(1); y = data(n+1:2*n,:)+c(2); z = data(2*n+1:end,:)+c(3); +x = data(1:n,:)+c(1); +y = data(n+1:2*n,:)+c(2); +z = data(2*n+1:end,:)+c(3); % now plot the rotated ellipse -sc = mesh(x,y,z); +sc = mesh(x,y,z,abs(xc)); shading interp alpha(0.5) axis equal \ No newline at end of file diff --git a/examples/matlab/plotPose3.m b/examples/matlab/plotPose3.m new file mode 100644 index 000000000..d55b7323a --- /dev/null +++ b/examples/matlab/plotPose3.m @@ -0,0 +1,29 @@ +function plotPose3(pose, P, axisLength) +% plotPose3: show a Pose, possibly with covariance matrix +if nargin<3,axisLength=0.1;end + +% get rotation and translation (center) +gRp = pose.rotation().matrix(); % rotation from pose to global +C = pose.translation().vector(); + +% draw the camera axes +xAxis = C+gRp(:,1)*axisLength; +L = [C xAxis]'; +line(L(:,1),L(:,2),L(:,3),'Color','r'); + +yAxis = C+gRp(:,2)*axisLength; +L = [C yAxis]'; +line(L(:,1),L(:,2),L(:,3),'Color','g'); + +zAxis = C+gRp(:,3)*axisLength; +L = [C zAxis]'; +line(L(:,1),L(:,2),L(:,3),'Color','b'); + +% plot the covariance +if nargin>2 + pPp = P(4:6,4:6); % covariance matrix in pose coordinate frame + gPp = gRp*pPp*gRp'; % convert the covariance matrix to global coordinate frame + covarianceEllipse3D(C,gPp); +end + +end From c31ef559f8f5871bf72949c24647032a3d1f43ef Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Wed, 6 Jun 2012 03:10:13 +0000 Subject: [PATCH 193/914] Merging all Discrete changes --- gtsam/discrete/DecisionTreeFactor.h | 5 + gtsam/discrete/DiscreteConditional.cpp | 49 +++++++-- gtsam/discrete/DiscreteFactor.h | 8 ++ gtsam/discrete/DiscreteFactorGraph.cpp | 108 ++++++++++---------- gtsam/discrete/DiscreteFactorGraph.h | 1 - gtsam/discrete/DiscreteMarginals.h | 54 ++++++---- gtsam/discrete/DiscreteSequentialSolver.cpp | 18 ++++ gtsam/discrete/DiscreteSequentialSolver.h | 9 +- gtsam/discrete/Potentials.cpp | 23 +++++ gtsam/discrete/Potentials.h | 8 ++ 10 files changed, 203 insertions(+), 80 deletions(-) diff --git a/gtsam/discrete/DecisionTreeFactor.h b/gtsam/discrete/DecisionTreeFactor.h index 537bb3e60..a29a5683a 100644 --- a/gtsam/discrete/DecisionTreeFactor.h +++ b/gtsam/discrete/DecisionTreeFactor.h @@ -127,6 +127,11 @@ namespace gtsam { */ shared_ptr combine(size_t nrFrontals, ADT::Binary op) const; + void permuteWithInverse(const Permutation& inversePermutation){ + DiscreteFactor::permuteWithInverse(inversePermutation); + Potentials::permute(inversePermutation); + } + /// @} }; // DecisionTreeFactor diff --git a/gtsam/discrete/DiscreteConditional.cpp b/gtsam/discrete/DiscreteConditional.cpp index 73649dce6..ca8f13ca3 100644 --- a/gtsam/discrete/DiscreteConditional.cpp +++ b/gtsam/discrete/DiscreteConditional.cpp @@ -46,9 +46,9 @@ namespace gtsam { const DecisionTreeFactor& marginal) : IndexConditional(joint.keys(), joint.size() - marginal.size()), Potentials( ISDEBUG("DiscreteConditional::COUNT") ? joint : joint / marginal) { - assert(nrFrontals() == 1); +// assert(nrFrontals() == 1); if (ISDEBUG("DiscreteConditional::DiscreteConditional")) cout - << (firstFrontalKey()) << endl; + << (firstFrontalKey()) << endl; //TODO Print all keys } /* ******************************************************************************** */ @@ -75,10 +75,47 @@ namespace gtsam { /* ******************************************************************************** */ void DiscreteConditional::solveInPlace(Values& values) const { - assert(nrFrontals() == 1); - Index j = (firstFrontalKey()); - size_t mpe = solve(values); // Solve for variable - values[j] = mpe; // store result in partial solution +// assert(nrFrontals() == 1); +// Index j = (firstFrontalKey()); +// size_t mpe = solve(values); // Solve for variable +// values[j] = mpe; // store result in partial solution + + // TODO: is this really the fastest way? I think it is. + ADT pFS = choose(values); // P(F|S=parentsValues) + + // Initialize + Values mpe; + Values frontalVals; + BOOST_FOREACH(Index j, frontals()) { + frontalVals[j] = 0; + } + double maxP = 0; + + while (1) { + double pValueS = pFS(frontalVals); // P(F=value|S=parentsValues) + // Update MPE solution if better + if (pValueS > maxP) { + maxP = pValueS; + mpe = frontalVals; + } + + size_t j = 0; + for (j = 0; j < nrFrontals(); j++) { + Index idx = frontals()[j]; + frontalVals[idx]++; + if (frontalVals[idx] < cardinality(idx)) + break; + //Wrap condition + frontalVals[idx] = 0; + } + if (j == nrFrontals()) + break; + } + + //set values (inPlace) to mpe + BOOST_FOREACH(Index j, frontals()) { + values[j] = mpe[j]; + } } /* ******************************************************************************** */ diff --git a/gtsam/discrete/DiscreteFactor.h b/gtsam/discrete/DiscreteFactor.h index 3789389e4..32e79568c 100644 --- a/gtsam/discrete/DiscreteFactor.h +++ b/gtsam/discrete/DiscreteFactor.h @@ -98,6 +98,14 @@ namespace gtsam { virtual operator DecisionTreeFactor() const = 0; + /** + * Permutes the factor, but for efficiency requires the permutation + * to already be inverted. + */ + virtual void permuteWithInverse(const Permutation& inversePermutation){ + IndexFactor::permuteWithInverse(inversePermutation); + } + /// @} }; // DiscreteFactor diff --git a/gtsam/discrete/DiscreteFactorGraph.cpp b/gtsam/discrete/DiscreteFactorGraph.cpp index f5fc7533d..0d5e01c29 100644 --- a/gtsam/discrete/DiscreteFactorGraph.cpp +++ b/gtsam/discrete/DiscreteFactorGraph.cpp @@ -24,69 +24,71 @@ namespace gtsam { -// Explicitly instantiate so we don't have to include everywhere -template class FactorGraph ; -template class EliminationTree ; + // Explicitly instantiate so we don't have to include everywhere + template class FactorGraph ; + template class EliminationTree ; -/* ************************************************************************* */ -DiscreteFactorGraph::DiscreteFactorGraph() { -} + /* ************************************************************************* */ + DiscreteFactorGraph::DiscreteFactorGraph() { + } -/* ************************************************************************* */ -DiscreteFactorGraph::DiscreteFactorGraph( - const BayesNet& bayesNet) : - FactorGraph(bayesNet) { -} + /* ************************************************************************* */ + DiscreteFactorGraph::DiscreteFactorGraph( + const BayesNet& bayesNet) : + FactorGraph(bayesNet) { + } -/* ************************************************************************* */ -FastSet DiscreteFactorGraph::keys() const { - FastSet keys; - BOOST_FOREACH(const sharedFactor& factor, *this) - if (factor) keys.insert(factor->begin(), factor->end()); - return keys; -} + /* ************************************************************************* */ + FastSet DiscreteFactorGraph::keys() const { + FastSet keys; + BOOST_FOREACH(const sharedFactor& factor, *this) + if (factor) keys.insert(factor->begin(), factor->end()); + return keys; + } -/* ************************************************************************* */ -DecisionTreeFactor DiscreteFactorGraph::product() const { - DecisionTreeFactor result; - BOOST_FOREACH(const sharedFactor& factor, *this) - if (factor) result = (*factor) * result; - return result; -} + /* ************************************************************************* */ + DecisionTreeFactor DiscreteFactorGraph::product() const { + DecisionTreeFactor result; + BOOST_FOREACH(const sharedFactor& factor, *this) + if (factor) result = (*factor) * result; + return result; + } -/* ************************************************************************* */ -double DiscreteFactorGraph::operator()( - const DiscreteFactor::Values &values) const { - double product = 1.0; - BOOST_FOREACH( const sharedFactor& factor, factors_ ) - product *= (*factor)(values); - return product; -} + /* ************************************************************************* */ + double DiscreteFactorGraph::operator()( + const DiscreteFactor::Values &values) const { + double product = 1.0; + BOOST_FOREACH( const sharedFactor& factor, factors_ ) + product *= (*factor)(values); + return product; + } -/* ************************************************************************* */ -pair // -EliminateDiscrete(const FactorGraph& factors, size_t num) { + /* ************************************************************************* */ + pair // + EliminateDiscrete(const FactorGraph& factors, size_t num) { - // PRODUCT: multiply all factors - tic(1, "product"); - DecisionTreeFactor product; - BOOST_FOREACH(const DiscreteFactor::shared_ptr& factor, factors) - product = (*factor) * product; - toc(1, "product"); + // PRODUCT: multiply all factors + tic(1, "product"); + DecisionTreeFactor product; + BOOST_FOREACH(const DiscreteFactor::shared_ptr& factor, factors){ + product = (*factor) * product; + } - // sum out frontals, this is the factor on the separator - tic(2, "sum"); - DecisionTreeFactor::shared_ptr sum = product.sum(num); - toc(2, "sum"); + toc(1, "product"); - // now divide product/sum to get conditional - tic(3, "divide"); - DiscreteConditional::shared_ptr cond(new DiscreteConditional(product, *sum)); - toc(3, "divide"); - tictoc_finishedIteration(); + // sum out frontals, this is the factor on the separator + tic(2, "sum"); + DecisionTreeFactor::shared_ptr sum = product.sum(num); + toc(2, "sum"); - return make_pair(cond, sum); -} + // now divide product/sum to get conditional + tic(3, "divide"); + DiscreteConditional::shared_ptr cond(new DiscreteConditional(product, *sum)); + toc(3, "divide"); + tictoc_finishedIteration(); + + return make_pair(cond, sum); + } /* ************************************************************************* */ } // namespace diff --git a/gtsam/discrete/DiscreteFactorGraph.h b/gtsam/discrete/DiscreteFactorGraph.h index eefdfaf1d..d96a3049a 100644 --- a/gtsam/discrete/DiscreteFactorGraph.h +++ b/gtsam/discrete/DiscreteFactorGraph.h @@ -86,7 +86,6 @@ public: if (factors_[i] != NULL) factors_[i]->print(ss.str()); } } - }; // DiscreteFactorGraph diff --git a/gtsam/discrete/DiscreteMarginals.h b/gtsam/discrete/DiscreteMarginals.h index f877a0128..99176e58c 100644 --- a/gtsam/discrete/DiscreteMarginals.h +++ b/gtsam/discrete/DiscreteMarginals.h @@ -21,6 +21,8 @@ #pragma once #include +#include +#include namespace gtsam { @@ -35,27 +37,43 @@ namespace gtsam { public: - /** Construct a marginals class. - * @param graph The factor graph defining the full joint density on all variables. - */ - DiscreteMarginals(const DiscreteFactorGraph& graph) { - } + /** Construct a marginals class. + * @param graph The factor graph defining the full joint density on all variables. + */ + DiscreteMarginals(const DiscreteFactorGraph& graph) { + typedef JunctionTree DiscreteJT; + GenericMultifrontalSolver solver(graph); + bayesTree_ = *solver.eliminate(&EliminateDiscrete); + //bayesTree_.print(); + cout << "Discrete Marginal Constructor Finished" << endl; + } - /** print */ - void print(const std::string& str = "DiscreteMarginals: ") const { - } + /** Compute the marginal of a single variable */ + DiscreteFactor::shared_ptr operator()(Index variable) const { + // Compute marginal + DiscreteFactor::shared_ptr marginalFactor; + marginalFactor = bayesTree_.marginalFactor(variable, &EliminateDiscrete); + return marginalFactor; + } - /** Compute the marginal of a single variable */ - DiscreteFactor::shared_ptr operator()(Index variable) const { - DiscreteFactor::shared_ptr p; - return p; - } + /** Compute the marginal of a single variable + * @param KEY DiscreteKey of the Variable + * @return Vector of marginal probabilities + */ + Vector marginalProbabilities(const DiscreteKey& key) const { + // Compute marginal + DiscreteFactor::shared_ptr marginalFactor; + marginalFactor = bayesTree_.marginalFactor(key.first, &EliminateDiscrete); - /** Compute the marginal of a single variable */ - Vector marginalProbabilities(Index variable) const { - Vector v; - return v; - } + //Create result + Vector vResult(key.second); + for (size_t state = 0; state < key.second ; ++ state) { + DiscreteFactor::Values values; + values[key.first] = state; + vResult(state) = (*marginalFactor)(values); + } + return vResult; + } }; diff --git a/gtsam/discrete/DiscreteSequentialSolver.cpp b/gtsam/discrete/DiscreteSequentialSolver.cpp index 1ca00875a..e4bc502c8 100644 --- a/gtsam/discrete/DiscreteSequentialSolver.cpp +++ b/gtsam/discrete/DiscreteSequentialSolver.cpp @@ -52,6 +52,24 @@ namespace gtsam { return solution; } + + /* ************************************************************************* */ + Vector DiscreteSequentialSolver::marginalProbabilities( + const DiscreteKey& key) const { + // Compute marginal + DiscreteFactor::shared_ptr marginalFactor; + marginalFactor = Base::marginalFactor(key.first, &EliminateDiscrete); + + //Create result + Vector vResult(key.second); + for (size_t state = 0; state < key.second; ++state) { + DiscreteFactor::Values values; + values[key.first] = state; + vResult(state) = (*marginalFactor)(values); + } + return vResult; + } + /* ************************************************************************* */ } diff --git a/gtsam/discrete/DiscreteSequentialSolver.h b/gtsam/discrete/DiscreteSequentialSolver.h index c453f5b96..6adb32ef6 100644 --- a/gtsam/discrete/DiscreteSequentialSolver.h +++ b/gtsam/discrete/DiscreteSequentialSolver.h @@ -74,7 +74,6 @@ namespace gtsam { return Base::eliminate(&EliminateDiscrete); } -#ifdef BROKEN /** * Compute the marginal joint over a set of variables, by integrating out * all of the other variables. This function returns the result as a factor @@ -94,7 +93,13 @@ namespace gtsam { DiscreteFactor::shared_ptr marginalFactor(Index j) const { return Base::marginalFactor(j, &EliminateDiscrete); } -#endif + + /** + * Compute the marginal density over a variable, by integrating out + * all of the other variables. This function returns the result as a + * Vector of the probability values. + */ + Vector marginalProbabilities(const DiscreteKey& key) const; /** * Compute the MPE solution of the DiscreteFactorGraph. This diff --git a/gtsam/discrete/Potentials.cpp b/gtsam/discrete/Potentials.cpp index ac6ecde10..e6f07ccac 100644 --- a/gtsam/discrete/Potentials.cpp +++ b/gtsam/discrete/Potentials.cpp @@ -60,5 +60,28 @@ namespace gtsam { } /* ************************************************************************* */ + void Potentials::permute(const Permutation& permutation) { + // Permute the _cardinalities (TODO: Inefficient Consider Improving) + DiscreteKeys keys; + map ordering; + + // Get the orginal keys from cardinalities_ + BOOST_FOREACH(const DiscreteKey& key, cardinalities_) + keys & key; + + // Perform Permutation + BOOST_FOREACH(DiscreteKey& key, keys) { + ordering[key.first] = permutation[key.first]; + //cout << key.first << " -> " << ordering[key.first] << endl; + key.first = ordering[key.first]; + } + + // Change *this + AlgebraicDecisionTree permuted((*this), ordering); + *this = permuted; + cardinalities_ = keys.cardinalities(); + } + + /* ************************************************************************* */ } // namespace gtsam diff --git a/gtsam/discrete/Potentials.h b/gtsam/discrete/Potentials.h index 8a8c2e3bc..d8c5d9c3b 100644 --- a/gtsam/discrete/Potentials.h +++ b/gtsam/discrete/Potentials.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -68,6 +69,13 @@ namespace gtsam { size_t cardinality(Index j) const { return cardinalities_.at(j);} + /* + * @brief Permutes the keys in Potentials + * + * This permutes the Indices and performs necessary re-ordering of ADD. + */ + void permute(const Permutation& perm); + }; // Potentials } // namespace gtsam From 3768efd7d31e6d63a49bda81d2fa0108c8d4e311 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Wed, 6 Jun 2012 03:14:30 +0000 Subject: [PATCH 194/914] Adding DiscreteMarginals test --- gtsam/discrete/tests/testDiscreteMarginals.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gtsam/discrete/tests/testDiscreteMarginals.cpp b/gtsam/discrete/tests/testDiscreteMarginals.cpp index 391a5f692..1b5963864 100644 --- a/gtsam/discrete/tests/testDiscreteMarginals.cpp +++ b/gtsam/discrete/tests/testDiscreteMarginals.cpp @@ -25,7 +25,7 @@ using namespace gtsam; /* ************************************************************************* */ -TEST( DiscreteMarginals, UGM_small ) { +TEST_UNSAFE( DiscreteMarginals, UGM_small ) { size_t nrStates = 2; DiscreteKey Cathy(1, nrStates), Heather(2, nrStates), Mark(3, nrStates), Allison(4, nrStates); @@ -43,14 +43,14 @@ TEST( DiscreteMarginals, UGM_small ) { graph.add(Mark & Allison, "2 1 1 2"); DiscreteMarginals marginals(graph); - DiscreteFactor::shared_ptr actualC = marginals(Cathy.first); DiscreteFactor::Values values; - values[Cathy.first] = 0; - EXPECT_DOUBLES_EQUAL( 1.944, (*actualC)(values), 1e-9); - Vector actualCvector = marginals.marginalProbabilities(Cathy.first); - EXPECT(assert_equal(Vector_(2,0.7,0.3), actualCvector, 1e-9)); + values[Cathy.first] = 0; + EXPECT_DOUBLES_EQUAL( 0.359631, (*actualC)(values), 1e-6); + + Vector actualCvector = marginals.marginalProbabilities(Cathy); + EXPECT(assert_equal(Vector_(2, 0.359631, 0.640369), actualCvector, 1e-6)); } /* ************************************************************************* */ From 59960a8d145bf6279313b14c263cfa0b713adba7 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Wed, 6 Jun 2012 03:25:56 +0000 Subject: [PATCH 195/914] Changes to Discrete Examples --- examples/DiscreteBayesNet_FG.cpp | 119 +++++++++++++++++++++++++++++++ examples/UGM_chain.cpp | 91 +++++++++++++++++++++++ examples/UGM_small.cpp | 16 +++++ 3 files changed, 226 insertions(+) create mode 100644 examples/DiscreteBayesNet_FG.cpp create mode 100644 examples/UGM_chain.cpp diff --git a/examples/DiscreteBayesNet_FG.cpp b/examples/DiscreteBayesNet_FG.cpp new file mode 100644 index 000000000..136346543 --- /dev/null +++ b/examples/DiscreteBayesNet_FG.cpp @@ -0,0 +1,119 @@ +/* ---------------------------------------------------------------------------- + + * 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 DiscreteBayesNet_FG.cpp + * @brief Discrete Bayes Net example using Factor Graphs + * @author Abhijit + * @date Jun 4, 2012 + * + * We use the famous Rain/Cloudy/Sprinkler Example of [Russell & Norvig, 2009, p529] + * You may be familiar with other graphical model packages like BNT (available + * at http://bnt.googlecode.com/svn/trunk/docs/usage.html) where this is used as an + * example. The following demo is same as that in the above link, except that + * everything is using GTSAM. + */ + +#include +#include +#include + +using namespace std; +using namespace gtsam; + +int main(int argc, char **argv) { + + // We assume binary state variables + // we have 0 == "False" and 1 == "True" + const size_t nrStates = 2; + + // define variables + DiscreteKey Cloudy(1, nrStates), Sprinkler(2, nrStates), Rain(3, nrStates), + WetGrass(4, nrStates); + + // create Factor Graph of the bayes net + DiscreteFactorGraph graph; + + // add factors + graph.add(Cloudy, "0.5 0.5"); //P(Cloudy) + graph.add(Cloudy & Sprinkler, "0.5 0.5 0.9 0.1"); //P(Sprinkler | Cloudy) + graph.add(Cloudy & Rain, "0.8 0.2 0.2 0.8"); //P(Rain | Cloudy) + graph.add(Sprinkler & Rain & WetGrass, + "1 0 0.1 0.9 0.1 0.9 0.001 0.99"); //P(WetGrass | Sprinkler, Rain) + + // Alternatively we can also create a DiscreteBayesNet, add DiscreteConditional + // factors and create a FactorGraph from it. (See testDiscreteBayesNet.cpp) + + // Since this is a relatively small distribution, we can as well print + // the whole distribution.. + cout << "Distribution of Example: " << endl; + cout << setw(11) << "Cloudy(C)" << setw(14) << "Sprinkler(S)" << setw(10) + << "Rain(R)" << setw(14) << "WetGrass(W)" << setw(15) << "P(C,S,R,W)" + << endl; + for (size_t a = 0; a < nrStates; a++) + for (size_t m = 0; m < nrStates; m++) + for (size_t h = 0; h < nrStates; h++) + for (size_t c = 0; c < nrStates; c++) { + DiscreteFactor::Values values; + values[Cloudy.first] = c; + values[Sprinkler.first] = h; + values[Rain.first] = m; + values[WetGrass.first] = a; + double prodPot = graph(values); + cout << boolalpha << setw(8) << (bool) c << setw(14) + << (bool) h << setw(12) << (bool) m << setw(13) + << (bool) a << setw(16) << prodPot << endl; + } + + + // "Most Probable Explanation", i.e., configuration with largest value + DiscreteSequentialSolver solver(graph); + DiscreteFactor::sharedValues optimalDecoding = solver.optimize(); + cout <<"\nMost Probable Explanation (MPE):" << endl; + cout << boolalpha << "Cloudy = " << (bool)(*optimalDecoding)[Cloudy.first] + << " Sprinkler = " << (bool)(*optimalDecoding)[Sprinkler.first] + << " Rain = " << boolalpha << (bool)(*optimalDecoding)[Rain.first] + << " WetGrass = " << (bool)(*optimalDecoding)[WetGrass.first]<< endl; + + + // "Inference" We show an inference query like: probability that the Sprinkler was on; + // given that the grass is wet i.e. P( S | W=1) =? + cout << "\nInference Query: Probability of Sprinkler being on given Grass is Wet" << endl; + + // Method 1: we can compute the joint marginal P(S,W) and from that we can compute + // P(S | W=1) = P(S,W=1)/P(W=1) We do this in following three steps.. + + //Step1: Compute P(S,W) + DiscreteFactorGraph jointFG; + jointFG = *solver.jointFactorGraph(DiscreteKeys(Sprinkler & WetGrass).indices()); + DecisionTreeFactor probSW = jointFG.product(); + + //Step2: Compute P(W) + DecisionTreeFactor probW = *solver.marginalFactor(WetGrass.first); + + //Step3: Computer P(S | W=1) = P(S,W=1)/P(W=1) + DiscreteFactor::Values values; + values[WetGrass.first] = 1; + + //print P(S=0|W=1) + values[Sprinkler.first] = 0; + cout << "P(S=0|W=1) = " << probSW(values)/probW(values) << endl; + + //print P(S=1|W=1) + values[Sprinkler.first] = 1; + cout << "P(S=1|W=1) = " << probSW(values)/probW(values) << endl; + + // TODO: Method 2 : One way is to modify the factor graph to + // incorporate the evidence node and compute the marginal + // TODO: graph.addEvidence(Cloudy,0); + + return 0; +} diff --git a/examples/UGM_chain.cpp b/examples/UGM_chain.cpp new file mode 100644 index 000000000..61eb0d3a0 --- /dev/null +++ b/examples/UGM_chain.cpp @@ -0,0 +1,91 @@ +/* ---------------------------------------------------------------------------- + + * 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 small.cpp + * @brief UGM (undirected graphical model) examples: chain + * @author Frank Dellaert + * @author Abhijit + * + * See http://www.di.ens.fr/~mschmidt/Software/UGM/chain.html + * for more explanation. This code demos the same example using GTSAM. + */ + +#include +#include + +#include + +using namespace std; +using namespace gtsam; + +int main(int argc, char** argv) { + + // Set Number of Nodes in the Graph + const int nrNodes = 50; + + // Each node takes 1 of 7 possible states denoted by 0-6 in following order: + // ["VideoGames" "Industry" "GradSchool" "VideoGames(with PhD)" + // "Industry(with PhD)" "Academia" "Deceased"] + const size_t nrStates = 7; + + // define variables + vector nodes; + for (int i = 0; i < nrNodes; i++){ + DiscreteKey dk(i, nrStates); + nodes.push_back(dk); + } + + // create graph + DiscreteFactorGraph graph; + + // add node potentials + graph.add(nodes[0], ".3 .6 .1 0 0 0 0"); + for (int i = 1; i < nrNodes; i++) + graph.add(nodes[i], "1 1 1 1 1 1 1"); + + const std::string edgePotential = ".08 .9 .01 0 0 0 .01 " + ".03 .95 .01 0 0 0 .01 " + ".06 .06 .75 .05 .05 .02 .01 " + "0 0 0 .3 .6 .09 .01 " + "0 0 0 .02 .95 .02 .01 " + "0 0 0 .01 .01 .97 .01 " + "0 0 0 0 0 0 1"; + + // add edge potentials + for (int i = 0; i < nrNodes - 1; i++) + graph.add(nodes[i] & nodes[i + 1], edgePotential); + + cout << "Created Factor Graph with " << nrNodes << " variable nodes and " + << graph.size() << " factors (Unary+Edge)."; + + // "Decoding", i.e., configuration with largest value + // We use sequential variable elimination + DiscreteSequentialSolver solver(graph); + DiscreteFactor::sharedValues optimalDecoding = solver.optimize(); + optimalDecoding->print("\nMost Probable Explanation (optimalDecoding)\n"); + + // "Inference" Computing marginals for each node + cout << "\nComputing Node Marginals .." << endl; + for (vector::iterator itr = nodes.begin(); itr != nodes.end(); + ++itr) { + //Compute the marginal + Vector margProbs = solver.marginalProbabilities(*itr); + + //Print the marginals + cout << "Node#" << setw(4) << itr->first << " : "; + print(margProbs); + cout << endl; + } + + return 0; +} + diff --git a/examples/UGM_small.cpp b/examples/UGM_small.cpp index a4655d2ad..3c0e77e67 100644 --- a/examples/UGM_small.cpp +++ b/examples/UGM_small.cpp @@ -69,6 +69,22 @@ int main(int argc, char** argv) { DiscreteFactor::sharedValues optimalDecoding = solver.optimize(); optimalDecoding->print("\noptimalDecoding"); + // "Inference" Computing marginals + cout << "\nComputing Node Marginals .." << endl; + Vector margProbs; + + margProbs = solver.marginalProbabilities(Cathy); + print(margProbs, "Cathy's Node Marginal:"); + + margProbs = solver.marginalProbabilities(Heather); + print(margProbs, "Heather's Node Marginal"); + + margProbs = solver.marginalProbabilities(Mark); + print(margProbs, "Mark's Node Marginal"); + + margProbs = solver.marginalProbabilities(Allison); + print(margProbs, "Allison's Node Marginal"); + return 0; } From cdd5ba251740107fc5be320e61b6d8e1f359fba9 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 6 Jun 2012 04:28:13 +0000 Subject: [PATCH 196/914] removed duplicate method --- gtsam.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 9ea7a863c..df55b1c2a 100644 --- a/gtsam.h +++ b/gtsam.h @@ -253,7 +253,6 @@ class Rot3 { double pitch() const; double yaw() const; // Vector toQuaternion() const; // FIXME: Can't cast to Vector properly - Matrix matrix() const; }; class Pose2 { From 76a1ae0102bd53c3eb9278e7d5f59dfc439d2ac5 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 6 Jun 2012 04:28:50 +0000 Subject: [PATCH 197/914] Fixed emit of comment string --- wrap/FileWriter.h | 2 +- wrap/Method.cpp | 2 +- wrap/StaticMethod.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wrap/FileWriter.h b/wrap/FileWriter.h index f081b86ed..ecafc0c35 100644 --- a/wrap/FileWriter.h +++ b/wrap/FileWriter.h @@ -25,7 +25,7 @@ public: std::ostringstream oss; ///< Primary stream for operating on the file /** Create a writer with a filename and delimiter for the header comment */ - FileWriter(const std::string& filename, bool verbose, const std::string& comment_str=""); + FileWriter(const std::string& filename, bool verbose, const std::string& comment_str); /** Writes the contents of the stringstream to the file, checking if actually new */ void emit(bool add_header, bool force=false) const; diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 7261c88a0..aeddca2e1 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -30,7 +30,7 @@ void Method::matlab_mfile(const string& classPath) const { // open destination m-file string wrapperFile = classPath + "/" + name + ".m"; - FileWriter file(wrapperFile, verbose_); + FileWriter file(wrapperFile, verbose_, "%"); // generate code string returnType = returnVal.matlab_returnType(); diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 3dd9e7c8b..7bdba650b 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -31,7 +31,7 @@ void StaticMethod::matlab_mfile(const string& toolboxPath, const string& classNa // open destination m-file string full_name = className + "_" + name; string wrapperFile = toolboxPath + "/" + full_name + ".m"; - FileWriter file(wrapperFile, verbose); + FileWriter file(wrapperFile, verbose, "%"); // generate code string returnType = returnVal.matlab_returnType(); From 0f079b70f28df9e2c6ff995464716c742d138d6f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 6 Jun 2012 04:29:14 +0000 Subject: [PATCH 198/914] Disabled two examples until timing fixed --- gtsam_unstable/discrete/CMakeLists.txt | 4 ++-- gtsam_unstable/discrete/examples/schedulingExample.cpp | 1 + gtsam_unstable/discrete/examples/schedulingQuals12.cpp | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index edec85416..d40d4e48f 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -27,8 +27,8 @@ add_dependencies(check.unstable check.discrete_unstable) # List examples to build - comment out here to exclude from compilation set(discrete_unstable_examples -schedulingExample -schedulingQuals12 +#schedulingExample +#schedulingQuals12 ) if (GTSAM_BUILD_EXAMPLES) diff --git a/gtsam_unstable/discrete/examples/schedulingExample.cpp b/gtsam_unstable/discrete/examples/schedulingExample.cpp index 485f0ea1c..14e4367f5 100644 --- a/gtsam_unstable/discrete/examples/schedulingExample.cpp +++ b/gtsam_unstable/discrete/examples/schedulingExample.cpp @@ -8,6 +8,7 @@ //#define ENABLE_TIMING #define ADD_NO_CACHING #define ADD_NO_PRUNING +#define ENABLE_OLD_TIMING #include #include #include diff --git a/gtsam_unstable/discrete/examples/schedulingQuals12.cpp b/gtsam_unstable/discrete/examples/schedulingQuals12.cpp index d0fa041c9..19357fdcf 100644 --- a/gtsam_unstable/discrete/examples/schedulingQuals12.cpp +++ b/gtsam_unstable/discrete/examples/schedulingQuals12.cpp @@ -8,6 +8,7 @@ #define ENABLE_TIMING #define ADD_NO_CACHING #define ADD_NO_PRUNING +#define ENABLE_OLD_TIMING #include #include #include From 0e4f2b414c6784a37d896bffe7b917a656dcf38d Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 6 Jun 2012 05:17:39 +0000 Subject: [PATCH 199/914] fix iterative parameters --- .../linear/IterativeOptimizationParameters.h | 156 +++--------------- gtsam/linear/IterativeSolver.h | 16 +- gtsam/linear/SimpleSPCGSolver.cpp | 2 +- gtsam/linear/SimpleSPCGSolver.h | 4 +- 4 files changed, 31 insertions(+), 147 deletions(-) diff --git a/gtsam/linear/IterativeOptimizationParameters.h b/gtsam/linear/IterativeOptimizationParameters.h index 88303fa40..b4599ecfd 100644 --- a/gtsam/linear/IterativeOptimizationParameters.h +++ b/gtsam/linear/IterativeOptimizationParameters.h @@ -17,125 +17,29 @@ #pragma once -#include -#include #include +#include +#include namespace gtsam { -/* parameters for combinatorial preconditioner */ -struct CombinatorialParameters { - - enum Group { /* group of variables */ - BLOCK = 0, /* utilize the inherent block structure */ - SCALAR /* break the block variables into scalars */ - } group_; - - enum Type { /* subgraph specification */ - JACOBI = 0, /* block diagonal */ - SPTREE, /* spanning tree */ - GSP, /* gspn, n = 0: all factors, n = 1: all unary factors, n = 2: spanning tree, etc .. */ - KOUTIS, /* implement Koutis2011Focs */ - } type_; - - enum Weight { /* how to weigh the graph edges */ - EQUAL = 0, /* 0: every block edge has equal weight */ - RHS_2NORM, /* 1: use the 2-norm of the rhs */ - LHS_FNORM, /* 2: use the frobenius norm of the lhs */ - RAW, /* 3: use raw scalar weight for the scalar case */ - } weight_ ; - - int complexity_;/* a parameter for the subgraph complexity */ - int hessian_; /* 0: do nothing, 1: use whole block hessian */ - - CombinatorialParameters(): group_(BLOCK), type_(JACOBI), weight_(EQUAL), complexity_(0), hessian_(1) {} - CombinatorialParameters(Group group, Type type, Weight weight, int complexity, int hessian) - : group_(group), type_(type), weight_(weight), complexity_(complexity), hessian_(hessian) {} - - inline Group group() const { return group_; } - inline Type type() const { return type_; } - inline Weight weight() const { return weight_; } - inline int complexity() const { return complexity_; } - inline int hessian() const { return hessian_; } - - inline bool isScalar() const { return group_ == SCALAR; } - inline bool isBlock() const { return group_ == BLOCK; } - inline bool isStatic() const { return (type_ == JACOBI || weight_ == EQUAL) ? true : false;} - inline bool isDynamic() const { return !isStatic(); } - - inline void print() const { - - const std::string groupStr[2] = {"block", "scalar"}; - const std::string typeStr[4] = {"jacobi", "sptree", "gsp", "koutis"}; - const std::string weightStr[4] = {"equal", "rhs-2norm", "lhs-form", "raw"}; - - std::cout << "CombinatorialParameters: " - << "group = " << groupStr[group_] - << ", type = " << typeStr[type_] - << ", weight = " << weightStr[weight_] - << ", complexity = " << complexity_ - << ", hessian = " << hessian_ << std::endl; - } -}; - -/* parameters for the preconditioner */ -struct PreconditionerParameters { - - typedef boost::shared_ptr shared_ptr; - - enum Kernel { /* Preconditioner Kernel */ - GTSAM = 0, /* Jacobian Factor Graph of GTSAM */ - CHOLMOD /* Cholmod Sparse */ - } kernel_ ; - - enum Type { /* preconditioner type */ - Combinatorial = 0 /* combinatorial preconditioner */ - } type_; - - CombinatorialParameters combinatorial_; - - enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ - - PreconditionerParameters(): kernel_(GTSAM), type_(Combinatorial), verbosity_(SILENT) {} - PreconditionerParameters(Kernel kernel, const CombinatorialParameters &combinatorial, Verbosity verbosity) - : kernel_(kernel), type_(Combinatorial), combinatorial_(combinatorial), verbosity_(verbosity) {} - - /* general interface */ - inline Kernel kernel() const { return kernel_; } - inline Type type() const { return type_; } - inline const CombinatorialParameters & combinatorial() const { return combinatorial_; } - inline Verbosity verbosity() const { return verbosity_; } - - - void print() const { - const std::string kernelStr[2] = {"gtsam", "cholmod"}; - const std::string typeStr[1] = {"combinatorial"}; - - std::cout << "PreconditionerParameters: " - << "kernel = " << kernelStr[kernel_] - << ", type = " << typeStr[type_] - << ", verbosity = " << verbosity_ - << std::endl; - combinatorial_.print(); - } -}; - /* parameters for the conjugate gradient method */ struct ConjugateGradientParameters { - size_t minIterations_; /* minimum number of cg iterations */ - size_t maxIterations_; /* maximum number of cg iterations */ - size_t reset_; /* number of iterations before reset */ - double epsilon_rel_; /* threshold for relative error decrease */ - double epsilon_abs_; /* threshold for absolute error decrease */ + size_t minIterations_; ///< minimum number of cg iterations + size_t maxIterations_; ///< maximum number of cg iterations + size_t reset_; ///< number of iterations before reset + double epsilon_rel_; ///< threshold for relative error decrease + double epsilon_abs_; ///< threshold for absolute error decrease - enum BLASKernel { /* Matrix Operation Kernel */ - GTSAM = 0, /* Jacobian Factor Graph of GTSAM */ - SBM, /* Sparse Block Matrix */ - SBM_MT /* Sparse Block Matrix Multithreaded */ + /* Matrix Operation Kernel */ + enum BLASKernel { + GTSAM = 0, ///< Jacobian Factor Graph of GTSAM + SBM, ///< Sparse Block Matrix + SBM_MT ///< Sparse Block Matrix Multithreaded } blas_kernel_; - size_t degree_; /* the maximum degree of the vertices to be eliminated before doing cg */ + size_t degree_; ///< the maximum degree of the vertices to be eliminated before doing cg enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ @@ -160,7 +64,7 @@ struct ConjugateGradientParameters { inline Verbosity verbosity() const { return verbosity_; } void print() const { - const std::string blasStr[4] = {"gtsam", "sbm", "sbm-mt"}; + const std::string blasStr[3] = {"gtsam", "sbm", "sbm-mt"}; std::cout << "ConjugateGradientParameters: " << "blas = " << blasStr[blas_kernel_] << ", minIter = " << minIterations_ @@ -175,42 +79,34 @@ struct ConjugateGradientParameters { }; /* parameters for iterative linear solvers */ -struct IterativeOptimizationParameters { +class IterativeOptimizationParameters { public: typedef boost::shared_ptr shared_ptr; - PreconditionerParameters preconditioner_; - ConjugateGradientParameters cg_; + ConjugateGradientParameters cg_; ///< Parameters for the Conjugate Gradient Method enum Kernel { PCG = 0, LSPCG = 1 } kernel_ ; ///< Iterative Method Kernel enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; ///< Verbosity public: - IterativeOptimizationParameters() - : preconditioner_(), cg_(), kernel_(LSPCG), verbosity_(SILENT) {} + IterativeOptimizationParameters() : cg_(), kernel_(LSPCG), verbosity_(SILENT) {} - IterativeOptimizationParameters(const IterativeOptimizationParameters &p) : - preconditioner_(p.preconditioner_), cg_(p.cg_), kernel_(p.kernel_), verbosity_(p.verbosity_) {} + IterativeOptimizationParameters(const IterativeOptimizationParameters &p) + : cg_(p.cg_), kernel_(p.kernel_), verbosity_(p.verbosity_) {} - IterativeOptimizationParameters( - const PreconditionerParameters &p, const ConjugateGradientParameters &c, Kernel kernel = PCG, Verbosity verbosity = SILENT) - : preconditioner_(p), cg_(c), kernel_(kernel), verbosity_(verbosity) {} + IterativeOptimizationParameters(const ConjugateGradientParameters &c, Kernel kernel = LSPCG, Verbosity verbosity = SILENT) + : cg_(c), kernel_(kernel), verbosity_(verbosity) {} + + virtual ~IterativeOptimizationParameters() {} /* general interface */ inline Kernel kernel() const { return kernel_; } inline Verbosity verbosity() const { return verbosity_; } - /* utility */ - inline const PreconditionerParameters& preconditioner() const { return preconditioner_; } - inline const ConjugateGradientParameters& cg() const { return cg_; } - - /* interface to preconditioner parameters */ - inline PreconditionerParameters::Kernel preconditioner_kernel() const { return preconditioner_.kernel(); } - inline PreconditionerParameters::Type type() const { return preconditioner_.type(); } - /* interface to cg parameters */ + inline const ConjugateGradientParameters& cg() const { return cg_; } inline size_t minIterations() const { return cg_.minIterations(); } inline size_t maxIterations() const { return cg_.maxIterations(); } inline size_t reset() const { return cg_.reset(); } @@ -220,15 +116,13 @@ public: inline size_t degree() const { return cg_.degree(); } inline ConjugateGradientParameters::BLASKernel blas_kernel() const { return cg_.blas_kernel(); } - void print(const std::string &s="") const { + virtual void print(const std::string &s="") const { const std::string kernelStr[2] = {"pcg", "lspcg"}; std::cout << s << std::endl << "IterativeOptimizationParameters: " << "kernel = " << kernelStr[kernel_] << ", verbosity = " << verbosity_ << std::endl; cg_.print(); - preconditioner_.print(); - } }; diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 58e83d595..edaa09943 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -20,23 +20,11 @@ class IterativeSolver { public: - typedef IterativeOptimizationParameters Parameters; - -protected: - - Parameters parameters_ ; - -public: - - IterativeSolver(): parameters_() {} - IterativeSolver(const IterativeSolver &solver) : parameters_(solver.parameters_) {} - IterativeSolver(const Parameters ¶meters) : parameters_(parameters) {} - + IterativeSolver(){} virtual ~IterativeSolver() {} virtual VectorValues::shared_ptr optimize () = 0; - - inline const Parameters& parameters() const { return parameters_ ; } + virtual const IterativeOptimizationParameters& _params() const = 0; }; } diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index ae7c9581c..86cf3d1ca 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -43,7 +43,7 @@ std::vector extractColSpec_(const FactorGraph& gfg, cons } SimpleSPCGSolver::SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters) - : Base(parameters) + : Base(), parameters_(parameters) { std::vector colSpec = extractColSpec_(gfg, VariableIndex(gfg)); diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h index 570169e7b..d2768f581 100644 --- a/gtsam/linear/SimpleSPCGSolver.h +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -39,6 +39,7 @@ class SimpleSPCGSolver : public IterativeSolver { public: typedef IterativeSolver Base; + typedef IterativeOptimizationParameters Parameters; typedef boost::shared_ptr shared_ptr; protected: @@ -52,12 +53,14 @@ protected: VectorValues::shared_ptr by_; ///< \f$ [\bar{b_y} ; 0 ] \f$ VectorValues::shared_ptr tmpY_; ///< buffer for the column vectors VectorValues::shared_ptr tmpB_; ///< buffer for the row vectors + Parameters parameters_; ///< Parameters for iterative method public: SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); virtual ~SimpleSPCGSolver() {} virtual VectorValues::shared_ptr optimize () {return optimize(*y0_);} + virtual const IterativeOptimizationParameters& _params() const { return parameters_; } protected: @@ -85,7 +88,6 @@ protected: * Note: This function has to be refined for your graph/application */ boost::tuple::shared_ptr> splitGraph(const GaussianFactorGraph &gfg); - }; } From 5256130afde3cfa8b1bd142e1af43ae4ff0854eb Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:31:18 +0000 Subject: [PATCH 200/914] support adding odometry factor to visualSLAM graph and add NonlinearISAM to visualSLAM namespace for uses in MATLAB --- gtsam/slam/visualSLAM.cpp | 6 +++++- gtsam/slam/visualSLAM.h | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index b8721b875..1331ef20f 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -16,7 +16,7 @@ */ #include -#include +#include namespace visualSLAM { @@ -103,5 +103,9 @@ namespace visualSLAM { } /* ************************************************************************* */ + void Graph::addOdometry(Key x1, Key x2, const Pose3& odometry, const SharedNoiseModel& model) { + push_back(boost::shared_ptr >(new BetweenFactor(x1, x2, odometry, model))); + } + /* ************************************************************************* */ } diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index b0e034653..22e56b8a0 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -27,9 +27,9 @@ #include #include #include +#include #include - namespace visualSLAM { using namespace gtsam; @@ -173,6 +173,15 @@ namespace visualSLAM { */ void addRangeFactor(Key poseKey, Key pointKey, double range, const SharedNoiseModel& model = noiseModel::Unit::Create(1)); + /** + * Add an odometry between two poses + * @param x1 variable key of the first camera pose + * @param x2 variable key of the second camera pose + * @param odometry measurement from x1 to x2 (x1.between(x2)) + * @param model uncertainty model of this measurement + */ + void addOdometry(Key x1, Key x2, const Pose3& odometry, const SharedNoiseModel& model); + /** * Optimize the graph * @param initialEstimate initial estimate of all variables in the graph @@ -191,4 +200,9 @@ namespace visualSLAM { }; // Graph + /** + * Non-linear ISAM for vanilla incremental visual SLAM inference + */ + typedef gtsam::NonlinearISAM ISAM; + } // namespaces From 092093444c8f687b82d05d6f14d594b3190d1ae5 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:33:03 +0000 Subject: [PATCH 201/914] lookat: a convenient function to set up camera pose --- gtsam/geometry/PinholeCamera.h | 32 ++++++++++++++++++----- gtsam/geometry/tests/testSimpleCamera.cpp | 13 +++++++++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index 587312062..acc27ae1c 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -149,16 +149,34 @@ namespace gtsam { * (theta 0 = looking in direction of positive X axis) */ static PinholeCamera level(const Pose2& pose2, double height) { - return PinholeCamera::level(Calibration(), pose2, height); + return PinholeCamera::level(Calibration(), pose2, height); } static PinholeCamera level(const Calibration &K, const Pose2& pose2, double height) { - const double st = sin(pose2.theta()), ct = cos(pose2.theta()); - const Point3 x(st, -ct, 0), y(0, 0, -1), z(ct, st, 0); - const Rot3 wRc(x, y, z); - const Point3 t(pose2.x(), pose2.y(), height); - const Pose3 pose3(wRc, t); - return PinholeCamera(pose3, K); + const double st = sin(pose2.theta()), ct = cos(pose2.theta()); + const Point3 x(st, -ct, 0), y(0, 0, -1), z(ct, st, 0); + const Rot3 wRc(x, y, z); + const Point3 t(pose2.x(), pose2.y(), height); + const Pose3 pose3(wRc, t); + return PinholeCamera(pose3, K); + } + + /** + * Create a camera at the given eye position looking at a target point in the scene + * with the specified up direction vector. + * @param eye specifies the camera position + * @param target the point to look at + * @param upVector specifies the camera up direction vector, + * doesn't need to be on the image plane nor orthogonal to the viewing axis + * @param K optional calibration parameter + */ + static PinholeCamera lookat(const Point3& eye, const Point3& target, const Point3& upVector, const Calibration& K = Calibration()) { + Point3 zc = target-eye; + zc = zc/zc.norm(); + Point3 xc = (-upVector).cross(zc); // minus upVector since yc is pointing down + Point3 yc = zc.cross(xc); + Pose3 pose3(Rot3(xc,yc,zc), eye); + return PinholeCamera(pose3, K); } /// @} diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index 1990ad00a..e918606a1 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -63,6 +63,19 @@ TEST( SimpleCamera, level2) CHECK(assert_equal( camera.pose(), expected)); } +/* ************************************************************************* */ +TEST( SimpleCamera, lookat) +{ + // Create a level camera, looking in Y-direction + Point3 C(10.0,0.0,0.0); + SimpleCamera camera = SimpleCamera::lookat(C, Point3(), Point3(0.0,0.0,1.0)); + + // expected + Point3 xc(0,1,0),yc(0,0,-1),zc(-1,0,0); + Pose3 expected(Rot3(xc,yc,zc),C); + CHECK(assert_equal( camera.pose(), expected)); +} + /* ************************************************************************* */ TEST( SimpleCamera, project) { From 8037c44b173189d32f7b500e24c20ecfa52af59c Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:35:19 +0000 Subject: [PATCH 202/914] fix CMakeLists to generate correct paths to gtsam lib for MEX, both in command line and make_gtsam.m --- gtsam/CMakeLists.txt | 4 +++- gtsam_unstable/CMakeLists.txt | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index ec0d7847d..5ab49b632 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -124,13 +124,15 @@ if (GTSAM_BUILD_WRAP) if (GTSAM_BUILD_MEX_BIN) set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) + set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}/gtsam) else() set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) + set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}) endif() # Generate, build and install toolbox - set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${MEX_LIB_ROOT} -lgtsam") + set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${GTSAM_LIB_DIR} -lgtsam") # Macro to handle details of setting up targets wrap_library(gtsam "${mexFlags}" "../") diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 8c3b220c6..7637f6ea8 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -75,13 +75,17 @@ if (GTSAM_BUILD_WRAP) if (GTSAM_BUILD_MEX_BIN) set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) + set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}/gtsam) + set(GTSAM_UNSTABLE_LIB_DIR ${MEX_LIB_ROOT}/gtsam_unstable) else() set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) + set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}) + set(GTSAM_UNSTABLE_LIB_DIR ${MEX_LIB_ROOT}) endif() # Generate, build and install toolbox - set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete -L${MEX_LIB_ROOT}/gtsam_unstable -L${MEX_LIB_ROOT}/gtsam -lgtsam -lgtsam_unstable") + set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete -L${GTSAM_UNSTABLE_LIB_DIR} -L${GTSAM_LIB_DIR} -lgtsam -lgtsam_unstable") # Macro to handle details of setting up targets wrap_library(gtsam_unstable "${mexFlags}" "./") From a8ffa407ae508250de07d9f57f2b7ec6376ce0f5 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:36:10 +0000 Subject: [PATCH 203/914] remove noise sampler in visualSLAM examples --- examples/VisualISAMExample.cpp | 22 +++++++++------------- examples/VisualSLAMData.h | 13 ++++++------- examples/VisualSLAMExample.cpp | 4 ++-- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/examples/VisualISAMExample.cpp b/examples/VisualISAMExample.cpp index dca24dba5..38fe1dd35 100644 --- a/examples/VisualISAMExample.cpp +++ b/examples/VisualISAMExample.cpp @@ -53,10 +53,8 @@ int main(int argc, char* argv[]) { // First pose with prior factor newFactors.addPosePrior(X(0), data.poses[0], data.noiseX); - // Second pose with odometry measurement, simulated by adding Gaussian noise to the ground-truth. - Pose3 odoMeasurement = data.odometry*Pose3::Expmap(data.noiseX->sample()); - newFactors.push_back( boost::shared_ptr >( - new BetweenFactor(X(0), X(1), odoMeasurement, data.noiseX))); + // Second pose with odometry measurement + newFactors.addOdometry(X(0), X(1), data.odometry, data.noiseX); // Visual measurements at both poses for (size_t i=0; i<2; ++i) { @@ -67,13 +65,12 @@ int main(int argc, char* argv[]) { // Initial values for the first two poses, simulated with Gaussian noise Values initials; - Pose3 pose0Init = data.poses[0]*Pose3::Expmap(data.noiseX->sample()); - initials.insert(X(0), pose0Init); - initials.insert(X(1), pose0Init*odoMeasurement); + initials.insert(X(0), data.poses[0]); + initials.insert(X(1), data.poses[0]*data.odometry); - // Initial values for the landmarks, simulated with Gaussian noise + // Initial values for the landmarks for (size_t j=0; jsample())); + initials.insert(L(j), data.points[j]); // Update ISAM the first time and obtain the current estimate isam.update(newFactors, initials); @@ -87,9 +84,8 @@ int main(int argc, char* argv[]) { for (size_t i=2; isample()); - newFactors.push_back( boost::shared_ptr >( - new BetweenFactor(X(i-1), X(i), odoMeasurement, data.noiseX))); + Pose3 odoMeasurement = data.odometry; + newFactors.addOdometry(X(i-1), X(i), data.odometry, data.noiseX); // Factors for visual measurements for (size_t j=0; j(X(i-1))*odoMeasurement); + initials.insert(X(i), currentEstimate.at(X(i-1))*data.odometry); // update ISAM isam.update(newFactors, initials); diff --git a/examples/VisualSLAMData.h b/examples/VisualSLAMData.h index 155a137d8..88fb576fe 100644 --- a/examples/VisualSLAMData.h +++ b/examples/VisualSLAMData.h @@ -66,20 +66,19 @@ struct VisualSLAMExampleData { double theta = 0.0; double r = 30.0; for (int i=0; isample())); + data.z[i].push_back(camera.project(data.points[j]) + /*+ gtsam::Point2(data.noiseZ->sample()))*/); // you can add noise as desired } } data.noiseX = gtsam::sharedSigmas(gtsam::Vector_(6, 0.001, 0.001, 0.001, 0.1, 0.1, 0.1)); diff --git a/examples/VisualSLAMExample.cpp b/examples/VisualSLAMExample.cpp index 90391bf90..1fc343203 100644 --- a/examples/VisualSLAMExample.cpp +++ b/examples/VisualSLAMExample.cpp @@ -49,9 +49,9 @@ int main(int argc, char* argv[]) { /* 3. Initial estimates for variable nodes, simulated by Gaussian noises */ Values initial; for (size_t i=0; isample())); + initial.insert(X(i), data.poses[i]/* *Pose3::Expmap(data.noiseX->sample())*/); // you can add noise if you want for (size_t j=0; jsample())); + initial.insert(L(j), data.points[j] /*+ Point3(data.noiseL->sample())*/); // you can add noise if you want initial.print("Intial Estimates: "); /* 4. Optimize the graph and print results */ From 3a28baf3c81cb82dcca6b7bf83984fddeffee01d Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:39:55 +0000 Subject: [PATCH 204/914] simplify VisualSLAMExample code in MATLAB --- examples/matlab/VisualSLAMExample.m | 63 +++++--------- examples/matlab/VisualSLAMExample_triangle.m | 88 ++++++++++++++++++++ 2 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 examples/matlab/VisualSLAMExample_triangle.m diff --git a/examples/matlab/VisualSLAMExample.m b/examples/matlab/VisualSLAMExample.m index 93ede149a..99d1a39a7 100644 --- a/examples/matlab/VisualSLAMExample.m +++ b/examples/matlab/VisualSLAMExample.m @@ -28,61 +28,40 @@ points = {gtsamPoint3([10 10 10]'),... gtsamPoint3([10 -10 -10]')}; % Camera poses on a circle around the cube, pointing at the world origin -nCameras = 4; +nCameras = 6; +height = 0; r = 30; poses = {}; for i=1:nCameras theta = (i-1)*2*pi/nCameras; - pose_i = gtsamPose3(... - gtsamRot3([-sin(theta) 0 -cos(theta); - cos(theta) 0 -sin(theta); - 0 -1 0]),... - gtsamPoint3([r*cos(theta), r*sin(theta), 0]')); - poses = [poses {pose_i}]; + t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); + camera = gtsamSimpleCamera_lookat(t, gtsamPoint3(), gtsamPoint3([0,0,1]'), gtsamCal3_S2()) + poses{i} = camera.pose(); end -% 2D visual measurements, simulated with Gaussian noise -z = {}; -measurementNoiseSigmas = [0.5,0.5]'; -measurementNoiseSampler = gtsamSharedDiagonal(measurementNoiseSigmas); -K = gtsamCal3_S2(50,50,0,50,50); -for i=1:size(poses,2) - zi = {}; - camera = gtsamSimpleCamera(K,poses{i}); - for j=1:size(points,2) - zi = [zi {camera.project(points{j}).compose(gtsamPoint2(measurementNoiseSampler.sample()))}]; - end - z = [z; zi]; -end - -pointNoiseSigmas = [0.1,0.1,0.1]'; -pointNoiseSampler = gtsamSharedDiagonal(pointNoiseSigmas); - +measurementNoiseSigma = 1.0; +pointNoiseSigma = 0.1; poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; -poseNoiseSampler = gtsamSharedDiagonal(poseNoiseSigmas); %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) graph = visualSLAMGraph; %% Add factors for all measurements -measurementNoise = gtsamSharedNoiseModel_Sigmas(measurementNoiseSigmas); -for i=1:size(z,1) - for j=1:size(z,2) - graph.addMeasurement(z{i,j}, measurementNoise, symbol('x',i), symbol('l',j), K); +measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); +K = gtsamCal3_S2(500,500,0,640/2,480/2); +for i=1:nCameras + camera = gtsamSimpleCamera(K,poses{i}); + for j=1:size(points,2) + zij = camera.project(points{j}); % you can add noise here if desired + graph.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); end end %% Add Gaussian priors for a pose and a landmark to constrain the system -% posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); -% graph.addPosePrior(symbol('x',1), poses{1}, posePriorNoise); -pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); +posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); +graph.addPosePrior(symbol('x',1), poses{1}, posePriorNoise); +pointPriorNoise = gtsamSharedNoiseModel_Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('l',1), points{1}, pointPriorNoise); -pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); -graph.addPointPrior(symbol('l',8), points{8}, pointPriorNoise); -pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); -graph.addPointPrior(symbol('l',5), points{5}, pointPriorNoise); -pointPriorNoise = gtsamSharedNoiseModel_Sigmas(pointNoiseSigmas); -graph.addPointPrior(symbol('l',4), points{4}, pointPriorNoise); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); @@ -90,10 +69,10 @@ graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy poses and points initialEstimate = visualSLAMValues; for i=1:size(poses,2) - initialEstimate.insertPose(symbol('x',i), poses{i}.compose(gtsamPose3_Expmap(poseNoiseSampler.sample()))); + initialEstimate.insertPose(symbol('x',i), poses{i}); end for j=1:size(points,2) - initialEstimate.insertPoint(symbol('l',j), points{j}.compose(gtsamPoint3(pointNoiseSampler.sample()))); + initialEstimate.insertPoint(symbol('l',j), points{j}); end initialEstimate.print(sprintf('\nInitial estimate:\n ')); @@ -101,10 +80,8 @@ initialEstimate.print(sprintf('\nInitial estimate:\n ')); result = graph.optimize(initialEstimate); result.print(sprintf('\nFinal result:\n ')); -%% Query the marginals -marginals = graph.marginals(result); - %% Plot results with covariance ellipses +marginals = graph.marginals(result); figure(1);clf hold on; for j=1:size(points,2) diff --git a/examples/matlab/VisualSLAMExample_triangle.m b/examples/matlab/VisualSLAMExample_triangle.m new file mode 100644 index 000000000..4fc1db320 --- /dev/null +++ b/examples/matlab/VisualSLAMExample_triangle.m @@ -0,0 +1,88 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief A simple visual SLAM example for structure from motion +% @author Duy-Nguyen Ta +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create a triangle target, just 3 points on a plane +r = 10; +points = {}; +for j=1:3 + theta = (j-1)*2*pi/3; + points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); +end + +%% Create camera poses on a circle around the triangle +nCameras = 6; +height = 10; +r = 30; +poses = {}; +for i=1:nCameras + theta = (i-1)*2*pi/nCameras; + t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); + camera = gtsamSimpleCamera_lookat(t, gtsamPoint3(), gtsamPoint3([0,0,1]'), gtsamCal3_S2()) + poses{i} = camera.pose(); +end + +%% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) +graph = visualSLAMGraph; + +%% Add factors for all measurements +K = gtsamCal3_S2(500,500,0,640/2,480/2); +measurementNoiseSigma=1; % in pixels +measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); +for i=1:nCameras + camera = gtsamSimpleCamera(K,poses{i}); + for j=1:3 + zij = camera.project(points{j}); % you can add noise here if desired + graph.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); + end +end + +%% Add Gaussian priors for 3 points to constrain the system +pointPriorNoise = gtsamSharedNoiseModel_Sigma(3,0.1); +for j=1:3 + graph.addPointPrior(symbol('l',j), points{j}, pointPriorNoise); +end + +%% Print the graph +graph.print(sprintf('\nFactor graph:\n')); + +%% Initialize to noisy poses and points +initialEstimate = visualSLAMValues; +for i=1:size(poses,2) + initialEstimate.insertPose(symbol('x',i), poses{i}); +end +for j=1:size(points,2) + initialEstimate.insertPoint(symbol('l',j), points{j}); +end +initialEstimate.print(sprintf('\nInitial estimate:\n ')); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); +result.print(sprintf('\nFinal result:\n ')); + +%% Plot results with covariance ellipses +marginals = graph.marginals(result); +figure(1);clf +hold on; +for j=1:size(points,2) + P = marginals.marginalCovariance(symbol('l',j)); + point_j = result.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); +end + +for i=1:size(poses,2) + P = marginals.marginalCovariance(symbol('x',i)) + pose_i = result.pose(symbol('x',i)) + plotPose3(pose_i,P,10); +end +axis equal + From bb89cdda76a056e3dc86143a3c91c89da8cb58ff Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:40:24 +0000 Subject: [PATCH 205/914] axisLength for plotting Pose2 in MATLAB --- examples/matlab/plotPose2.m | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/examples/matlab/plotPose2.m b/examples/matlab/plotPose2.m index 17959ea59..54b1e68f0 100644 --- a/examples/matlab/plotPose2.m +++ b/examples/matlab/plotPose2.m @@ -1,11 +1,13 @@ -function plotPose2(p,color,P) +function plotPose2(pose,color,P,axisLength) % plotPose2: show a Pose2, possibly with covariance matrix -plot(p.x,p.y,[color '*']); -c = cos(p.theta); -s = sin(p.theta); -quiver(p.x,p.y,c,s,0.1,color); +if nargin<4,axisLength=0.1;end + +plot(pose.x,pose.y,[color '*']); +c = cos(pose.theta); +s = sin(pose.theta); +quiver(pose.x,pose.y,c,s,axisLength,color); if nargin>2 pPp = P(1:2,1:2); % covariance matrix in pose coordinate frame gRp = [c -s;s c]; % rotation from pose to global - covarianceEllipse([p.x;p.y],gRp*pPp*gRp',color); + covarianceEllipse([pose.x;pose.y],gRp*pPp*gRp',color); end \ No newline at end of file From 3e36890fd1f16c0b261773bf18e9b224d5fabe6b Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:41:06 +0000 Subject: [PATCH 206/914] VisualISAMExample in MATLAB. Doesn't look quite right... --- examples/matlab/VisualISAMExample.m | 106 ++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 examples/matlab/VisualISAMExample.m diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m new file mode 100644 index 000000000..86465690f --- /dev/null +++ b/examples/matlab/VisualISAMExample.m @@ -0,0 +1,106 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief A simple visual SLAM example for structure from motion +% @author Duy-Nguyen Ta +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create a triangle target, just 3 points on a plane +nPoints = 3; +r = 10; +points = {}; +for j=1:nPoints + theta = (j-1)*2*pi/nPoints; + points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); +end + +%% Create camera poses on a circle around the triangle +nCameras = 30; +height = 10; +r = 30; +poses = {}; +for i=1:nCameras + theta = (i-1)*2*pi/nCameras; + t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); + camera = gtsamSimpleCamera_lookat(t, gtsamPoint3(), gtsamPoint3([0,0,1]'), gtsamCal3_S2()) + poses{i} = camera.pose(); +end +odometry = poses{1}.between(poses{2}); + +poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); +measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); +K = gtsamCal3_S2(50,50,0,50,50); + +%% Create an ISAM object for inference +isam = visualSLAMISAM; + +%% Update ISAM +newFactors = visualSLAMGraph; +initialEstimates = visualSLAMValues; +for i=1:nCameras + + % Prior for the first pose or odometry for subsequent poses + if (i==1) + newFactors.addPosePrior(symbol('x',1), poses{1}, poseNoise); + else + newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, poseNoise); + end + + % Visual measurement factors + for j=1:nPoints + camera = gtsamSimpleCamera(K,poses{i}); + zij = camera.project(points{j}); + newFactors.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); + end + + % Initial estimates for the new pose. Also initialize points while in + % the first frame. + if (i==1) + initialEstimates.insertPose(symbol('x',i), poses{i}); + for j=1:size(points,2) + initialEstimates.insertPoint(symbol('l',j), points{j}); + end + else + %TODO: this might not be suboptimal since "result" is not the fully + %optimized result + prevPose = result.pose(symbol('x',i-1)); + initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); + end + + % Update ISAM, only update for the second frame onward + % Update the first frame will cause error, since it's under constrained + if (i>=2) + isam.update(newFactors, initialEstimates); + emptyFactors = visualSLAMGraph; + emptyEstimates = visualSLAMValues; + result = isam.estimate(); + + % Plot first result + figure(1);clf + hold on; + for j=1:size(points,2) + P = isam.marginalCovariance(symbol('l',j)); + point_j = result.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + end + + for ii=1:i + P = isam.marginalCovariance(symbol('x',ii)); + pose_ii = result.pose(symbol('x',ii)); + plotPose3(pose_ii,P,10); + end + axis([-50 50 -50 50 -50 50]) + + % Reset newFactors and initialEstimates to prepare for the next + % update + newFactors = visualSLAMGraph; + initialEstimates = visualSLAMValues; + end +end \ No newline at end of file From 64beba42e42e40ff4298040452dcd1c38dd41b77 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 09:42:27 +0000 Subject: [PATCH 207/914] wrapping SimpleCamera::lookat and visualSLAM's ISAM to MATLAB --- gtsam.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index df55b1c2a..a5a072bca 100644 --- a/gtsam.h +++ b/gtsam.h @@ -450,6 +450,11 @@ class SimpleCamera { // Standard Interface gtsam::Pose3 pose() const; + + // Convenient generators + static gtsam::SimpleCamera lookat(const gtsam::Point3& eye, + const gtsam::Point3& target, const gtsam::Point3& upVector, + const gtsam::Cal3_S2& k); }; //************************************************************************* @@ -457,7 +462,6 @@ class SimpleCamera { //************************************************************************* - //************************************************************************* // linear //************************************************************************* @@ -912,9 +916,19 @@ class Graph { void addPosePrior(size_t poseKey, const gtsam::Pose3& p, const gtsam::SharedNoiseModel& model); void addPointPrior(size_t pointKey, const gtsam::Point3& p, const gtsam::SharedNoiseModel& model); void addRangeFactor(size_t poseKey, size_t pointKey, double range, const gtsam::SharedNoiseModel& model); + void addOdometry(size_t poseKey1, size_t poseKey2, const gtsam::Pose3& odometry, const gtsam::SharedNoiseModel& model); visualSLAM::Values optimize(const visualSLAM::Values& initialEstimate) const; gtsam::Marginals marginals(const visualSLAM::Values& solution) const; }; +class ISAM { + ISAM(); + ISAM(int reorderInterval); + void print(string s) const; + visualSLAM::Values estimate() const; + Matrix marginalCovariance(size_t key) const; + void update(const visualSLAM::Graph& newFactors, const visualSLAM::Values& initialValues); +}; + }///\namespace visualSLAM From 3a9b647b8fcc23273d8a265a66c1d3326ec53204 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 6 Jun 2012 12:03:49 +0000 Subject: [PATCH 208/914] Updated expected wrap values --- .cproject | 328 +++++++++--------- wrap/tests/expected/@Point2/argChar.m | 2 +- wrap/tests/expected/@Point2/argUChar.m | 2 +- wrap/tests/expected/@Point2/dim.m | 2 +- wrap/tests/expected/@Point2/returnChar.m | 2 +- wrap/tests/expected/@Point2/vectorConfusion.m | 2 +- wrap/tests/expected/@Point2/x.m | 2 +- wrap/tests/expected/@Point2/y.m | 2 +- wrap/tests/expected/@Point3/norm.m | 2 +- wrap/tests/expected/@Test/arg_EigenConstRef.m | 2 +- wrap/tests/expected/@Test/create_MixedPtrs.m | 2 +- wrap/tests/expected/@Test/create_ptrs.m | 2 +- wrap/tests/expected/@Test/print.m | 2 +- wrap/tests/expected/@Test/return_Point2Ptr.m | 2 +- wrap/tests/expected/@Test/return_Test.m | 2 +- wrap/tests/expected/@Test/return_TestPtr.m | 2 +- wrap/tests/expected/@Test/return_bool.m | 2 +- wrap/tests/expected/@Test/return_double.m | 2 +- wrap/tests/expected/@Test/return_field.m | 2 +- wrap/tests/expected/@Test/return_int.m | 2 +- wrap/tests/expected/@Test/return_matrix1.m | 2 +- wrap/tests/expected/@Test/return_matrix2.m | 2 +- wrap/tests/expected/@Test/return_pair.m | 2 +- wrap/tests/expected/@Test/return_ptrs.m | 2 +- wrap/tests/expected/@Test/return_size_t.m | 2 +- wrap/tests/expected/@Test/return_string.m | 2 +- wrap/tests/expected/@Test/return_vector1.m | 2 +- wrap/tests/expected/@Test/return_vector2.m | 2 +- .../tests/expected/Point3_StaticFunctionRet.m | 2 +- wrap/tests/expected/Point3_staticFunction.m | 2 +- .../@ns2ClassA/memberFunction.m | 2 +- .../expected_namespaces/@ns2ClassA/nsArg.m | 2 +- .../expected_namespaces/@ns2ClassA/nsReturn.m | 2 +- .../expected_namespaces/ns2ClassA_afunction.m | 2 +- 34 files changed, 202 insertions(+), 192 deletions(-) diff --git a/.cproject b/.cproject index c53d6aaaf..ad66abfa1 100644 --- a/.cproject +++ b/.cproject @@ -311,14 +311,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -345,6 +337,7 @@ make + tests/testBayesTree.run true false @@ -352,6 +345,7 @@ make + testBinaryBayesNet.run true false @@ -399,6 +393,7 @@ make + testSymbolicBayesNet.run true false @@ -406,6 +401,7 @@ make + tests/testSymbolicFactor.run true false @@ -413,6 +409,7 @@ make + testSymbolicFactorGraph.run true false @@ -428,11 +425,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -505,22 +511,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -537,6 +527,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -561,18 +567,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -657,26 +671,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -923,6 +929,7 @@ make + testGraph.run true false @@ -930,6 +937,7 @@ make + testJunctionTree.run true false @@ -937,6 +945,7 @@ make + testSymbolicBayesNetB.run true false @@ -1048,6 +1057,7 @@ make + testErrors.run true false @@ -1503,7 +1513,6 @@ make - testSimulated2DOriented.run true false @@ -1543,7 +1552,6 @@ make - testSimulated2D.run true false @@ -1551,7 +1559,6 @@ make - testSimulated3D.run true false @@ -1767,7 +1774,6 @@ make - tests/testGaussianISAM2 true false @@ -1789,102 +1795,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -2086,6 +1996,7 @@ cpack + -G DEB true false @@ -2093,6 +2004,7 @@ cpack + -G RPM true false @@ -2100,6 +2012,7 @@ cpack + -G TGZ true false @@ -2107,6 +2020,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2192,42 +2106,98 @@ true true - + make - -j5 - wrap.testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - wrap.testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap_gtsam + -j2 + timeRot3.run true true true - + make - -j5 - wrap + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2271,6 +2241,46 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/wrap/tests/expected/@Point2/argChar.m b/wrap/tests/expected/@Point2/argChar.m index 3eccf4b76..93880c5b1 100644 --- a/wrap/tests/expected/@Point2/argChar.m +++ b/wrap/tests/expected/@Point2/argChar.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = argChar(obj,a) % usage: obj.argChar(a) error('need to compile argChar.cpp'); diff --git a/wrap/tests/expected/@Point2/argUChar.m b/wrap/tests/expected/@Point2/argUChar.m index eedb50df0..bb524b3f0 100644 --- a/wrap/tests/expected/@Point2/argUChar.m +++ b/wrap/tests/expected/@Point2/argUChar.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = argUChar(obj,a) % usage: obj.argUChar(a) error('need to compile argUChar.cpp'); diff --git a/wrap/tests/expected/@Point2/dim.m b/wrap/tests/expected/@Point2/dim.m index 011eb28a7..84c368193 100644 --- a/wrap/tests/expected/@Point2/dim.m +++ b/wrap/tests/expected/@Point2/dim.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = dim(obj) % usage: obj.dim() error('need to compile dim.cpp'); diff --git a/wrap/tests/expected/@Point2/returnChar.m b/wrap/tests/expected/@Point2/returnChar.m index c9334a503..a33718047 100644 --- a/wrap/tests/expected/@Point2/returnChar.m +++ b/wrap/tests/expected/@Point2/returnChar.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = returnChar(obj) % usage: obj.returnChar() error('need to compile returnChar.cpp'); diff --git a/wrap/tests/expected/@Point2/vectorConfusion.m b/wrap/tests/expected/@Point2/vectorConfusion.m index 0db1db291..cc47b0dc7 100644 --- a/wrap/tests/expected/@Point2/vectorConfusion.m +++ b/wrap/tests/expected/@Point2/vectorConfusion.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = vectorConfusion(obj) % usage: obj.vectorConfusion() error('need to compile vectorConfusion.cpp'); diff --git a/wrap/tests/expected/@Point2/x.m b/wrap/tests/expected/@Point2/x.m index 0a6e99d16..e1ebbd450 100644 --- a/wrap/tests/expected/@Point2/x.m +++ b/wrap/tests/expected/@Point2/x.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = x(obj) % usage: obj.x() error('need to compile x.cpp'); diff --git a/wrap/tests/expected/@Point2/y.m b/wrap/tests/expected/@Point2/y.m index ee5a55e1d..d27fc8bf2 100644 --- a/wrap/tests/expected/@Point2/y.m +++ b/wrap/tests/expected/@Point2/y.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = y(obj) % usage: obj.y() error('need to compile y.cpp'); diff --git a/wrap/tests/expected/@Point3/norm.m b/wrap/tests/expected/@Point3/norm.m index bb6482df4..4269347e8 100644 --- a/wrap/tests/expected/@Point3/norm.m +++ b/wrap/tests/expected/@Point3/norm.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = norm(obj) % usage: obj.norm() error('need to compile norm.cpp'); diff --git a/wrap/tests/expected/@Test/arg_EigenConstRef.m b/wrap/tests/expected/@Test/arg_EigenConstRef.m index 76f190d99..9e6c04c5a 100644 --- a/wrap/tests/expected/@Test/arg_EigenConstRef.m +++ b/wrap/tests/expected/@Test/arg_EigenConstRef.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = arg_EigenConstRef(obj,value) % usage: obj.arg_EigenConstRef(value) error('need to compile arg_EigenConstRef.cpp'); diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.m b/wrap/tests/expected/@Test/create_MixedPtrs.m index 764ce822c..bd1927fba 100644 --- a/wrap/tests/expected/@Test/create_MixedPtrs.m +++ b/wrap/tests/expected/@Test/create_MixedPtrs.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function [first,second] = create_MixedPtrs(obj) % usage: obj.create_MixedPtrs() error('need to compile create_MixedPtrs.cpp'); diff --git a/wrap/tests/expected/@Test/create_ptrs.m b/wrap/tests/expected/@Test/create_ptrs.m index b1623b5bc..e380f1829 100644 --- a/wrap/tests/expected/@Test/create_ptrs.m +++ b/wrap/tests/expected/@Test/create_ptrs.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function [first,second] = create_ptrs(obj) % usage: obj.create_ptrs() error('need to compile create_ptrs.cpp'); diff --git a/wrap/tests/expected/@Test/print.m b/wrap/tests/expected/@Test/print.m index 2adca017d..a39033a1e 100644 --- a/wrap/tests/expected/@Test/print.m +++ b/wrap/tests/expected/@Test/print.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = print(obj) % usage: obj.print() error('need to compile print.cpp'); diff --git a/wrap/tests/expected/@Test/return_Point2Ptr.m b/wrap/tests/expected/@Test/return_Point2Ptr.m index 410081dcb..26fd146a2 100644 --- a/wrap/tests/expected/@Test/return_Point2Ptr.m +++ b/wrap/tests/expected/@Test/return_Point2Ptr.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_Point2Ptr(obj,value) % usage: obj.return_Point2Ptr(value) error('need to compile return_Point2Ptr.cpp'); diff --git a/wrap/tests/expected/@Test/return_Test.m b/wrap/tests/expected/@Test/return_Test.m index 2faa73be3..f31dc3192 100644 --- a/wrap/tests/expected/@Test/return_Test.m +++ b/wrap/tests/expected/@Test/return_Test.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_Test(obj,value) % usage: obj.return_Test(value) error('need to compile return_Test.cpp'); diff --git a/wrap/tests/expected/@Test/return_TestPtr.m b/wrap/tests/expected/@Test/return_TestPtr.m index 7c40e76c6..e69149551 100644 --- a/wrap/tests/expected/@Test/return_TestPtr.m +++ b/wrap/tests/expected/@Test/return_TestPtr.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_TestPtr(obj,value) % usage: obj.return_TestPtr(value) error('need to compile return_TestPtr.cpp'); diff --git a/wrap/tests/expected/@Test/return_bool.m b/wrap/tests/expected/@Test/return_bool.m index 76fc4363b..a0c5a0b17 100644 --- a/wrap/tests/expected/@Test/return_bool.m +++ b/wrap/tests/expected/@Test/return_bool.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_bool(obj,value) % usage: obj.return_bool(value) error('need to compile return_bool.cpp'); diff --git a/wrap/tests/expected/@Test/return_double.m b/wrap/tests/expected/@Test/return_double.m index daed1d34b..dd181ff0b 100644 --- a/wrap/tests/expected/@Test/return_double.m +++ b/wrap/tests/expected/@Test/return_double.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_double(obj,value) % usage: obj.return_double(value) error('need to compile return_double.cpp'); diff --git a/wrap/tests/expected/@Test/return_field.m b/wrap/tests/expected/@Test/return_field.m index 11b5ebe07..bc4223671 100644 --- a/wrap/tests/expected/@Test/return_field.m +++ b/wrap/tests/expected/@Test/return_field.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_field(obj,t) % usage: obj.return_field(t) error('need to compile return_field.cpp'); diff --git a/wrap/tests/expected/@Test/return_int.m b/wrap/tests/expected/@Test/return_int.m index a6783acdf..4984557e6 100644 --- a/wrap/tests/expected/@Test/return_int.m +++ b/wrap/tests/expected/@Test/return_int.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_int(obj,value) % usage: obj.return_int(value) error('need to compile return_int.cpp'); diff --git a/wrap/tests/expected/@Test/return_matrix1.m b/wrap/tests/expected/@Test/return_matrix1.m index 302f15372..66dd1886f 100644 --- a/wrap/tests/expected/@Test/return_matrix1.m +++ b/wrap/tests/expected/@Test/return_matrix1.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_matrix1(obj,value) % usage: obj.return_matrix1(value) error('need to compile return_matrix1.cpp'); diff --git a/wrap/tests/expected/@Test/return_matrix2.m b/wrap/tests/expected/@Test/return_matrix2.m index 3ed4d0ec7..5a0359862 100644 --- a/wrap/tests/expected/@Test/return_matrix2.m +++ b/wrap/tests/expected/@Test/return_matrix2.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_matrix2(obj,value) % usage: obj.return_matrix2(value) error('need to compile return_matrix2.cpp'); diff --git a/wrap/tests/expected/@Test/return_pair.m b/wrap/tests/expected/@Test/return_pair.m index abb97336c..611dd3434 100644 --- a/wrap/tests/expected/@Test/return_pair.m +++ b/wrap/tests/expected/@Test/return_pair.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function [first,second] = return_pair(obj,v,A) % usage: obj.return_pair(v,A) error('need to compile return_pair.cpp'); diff --git a/wrap/tests/expected/@Test/return_ptrs.m b/wrap/tests/expected/@Test/return_ptrs.m index bed198563..18d69ac92 100644 --- a/wrap/tests/expected/@Test/return_ptrs.m +++ b/wrap/tests/expected/@Test/return_ptrs.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function [first,second] = return_ptrs(obj,p1,p2) % usage: obj.return_ptrs(p1,p2) error('need to compile return_ptrs.cpp'); diff --git a/wrap/tests/expected/@Test/return_size_t.m b/wrap/tests/expected/@Test/return_size_t.m index 7cb2c6f0f..143f04d24 100644 --- a/wrap/tests/expected/@Test/return_size_t.m +++ b/wrap/tests/expected/@Test/return_size_t.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_size_t(obj,value) % usage: obj.return_size_t(value) error('need to compile return_size_t.cpp'); diff --git a/wrap/tests/expected/@Test/return_string.m b/wrap/tests/expected/@Test/return_string.m index 5661df443..f1eab8661 100644 --- a/wrap/tests/expected/@Test/return_string.m +++ b/wrap/tests/expected/@Test/return_string.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_string(obj,value) % usage: obj.return_string(value) error('need to compile return_string.cpp'); diff --git a/wrap/tests/expected/@Test/return_vector1.m b/wrap/tests/expected/@Test/return_vector1.m index 3746c4c20..316ca4cf2 100644 --- a/wrap/tests/expected/@Test/return_vector1.m +++ b/wrap/tests/expected/@Test/return_vector1.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_vector1(obj,value) % usage: obj.return_vector1(value) error('need to compile return_vector1.cpp'); diff --git a/wrap/tests/expected/@Test/return_vector2.m b/wrap/tests/expected/@Test/return_vector2.m index 426c63457..6426e0ce9 100644 --- a/wrap/tests/expected/@Test/return_vector2.m +++ b/wrap/tests/expected/@Test/return_vector2.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = return_vector2(obj,value) % usage: obj.return_vector2(value) error('need to compile return_vector2.cpp'); diff --git a/wrap/tests/expected/Point3_StaticFunctionRet.m b/wrap/tests/expected/Point3_StaticFunctionRet.m index 433d3c00d..bdfd32b4b 100644 --- a/wrap/tests/expected/Point3_StaticFunctionRet.m +++ b/wrap/tests/expected/Point3_StaticFunctionRet.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = Point3_StaticFunctionRet(z) % usage: x = Point3_StaticFunctionRet(z) error('need to compile Point3_StaticFunctionRet.cpp'); diff --git a/wrap/tests/expected/Point3_staticFunction.m b/wrap/tests/expected/Point3_staticFunction.m index ccf9b85bd..23885f71e 100644 --- a/wrap/tests/expected/Point3_staticFunction.m +++ b/wrap/tests/expected/Point3_staticFunction.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = Point3_staticFunction() % usage: x = Point3_staticFunction() error('need to compile Point3_staticFunction.cpp'); diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m index 4523cba56..90a9ed918 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m +++ b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = memberFunction(obj) % usage: obj.memberFunction() error('need to compile memberFunction.cpp'); diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m index 4893ece7f..e57701feb 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = nsArg(obj,arg) % usage: obj.nsArg(arg) error('need to compile nsArg.cpp'); diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m index 2c900bc30..c16b1c33f 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = nsReturn(obj,q) % usage: obj.nsReturn(q) error('need to compile nsReturn.cpp'); diff --git a/wrap/tests/expected_namespaces/ns2ClassA_afunction.m b/wrap/tests/expected_namespaces/ns2ClassA_afunction.m index 3a1101918..f41203ba1 100644 --- a/wrap/tests/expected_namespaces/ns2ClassA_afunction.m +++ b/wrap/tests/expected_namespaces/ns2ClassA_afunction.m @@ -1,4 +1,4 @@ - automatically generated by wrap +% automatically generated by wrap function result = ns2ClassA_afunction() % usage: x = ns2ClassA_afunction() error('need to compile ns2ClassA_afunction.cpp'); From 3729b322fdd31a2e181008fdc339b944de009504 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 6 Jun 2012 12:30:30 +0000 Subject: [PATCH 209/914] retractCayley not on quaternion branch --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index a5a072bca..0ca70d389 100644 --- a/gtsam.h +++ b/gtsam.h @@ -232,7 +232,7 @@ class Rot3 { // Manifold static size_t Dim(); size_t dim() const; - gtsam::Rot3 retractCayley(Vector v) const; + // gtsam::Rot3 retractCayley(Vector v) const; // not in Quaternion branch gtsam::Rot3 retract(Vector v) const; Vector localCoordinates(const gtsam::Rot3& p) const; From 74138787e843aa7fcf169aee9e2072114b34b3f5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 6 Jun 2012 12:44:06 +0000 Subject: [PATCH 210/914] testPoseRTV no longer fails when using quaternions - still should add full analytical derivatives, however. --- .cproject | 8 ++++++++ gtsam_unstable/dynamics/PoseRTV.cpp | 2 +- gtsam_unstable/dynamics/tests/testPoseRTV.cpp | 8 ++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.cproject b/.cproject index ad66abfa1..abe692394 100644 --- a/.cproject +++ b/.cproject @@ -439,6 +439,14 @@ true true + + make + -j5 + testPoseRTV.run + true + true + true + make -j5 diff --git a/gtsam_unstable/dynamics/PoseRTV.cpp b/gtsam_unstable/dynamics/PoseRTV.cpp index 4ab4bcf1d..e78f5a62d 100644 --- a/gtsam_unstable/dynamics/PoseRTV.cpp +++ b/gtsam_unstable/dynamics/PoseRTV.cpp @@ -258,7 +258,7 @@ PoseRTV PoseRTV::transformed_from(const Pose3& trans, } if (Dtrans) { - *Dtrans = numericalDerivative22(transformed_from_, *this, trans, 1e-6); + *Dtrans = numericalDerivative22(transformed_from_, *this, trans, 1e-8); // // *Dtrans = zeros(9,6); // // directly affecting the pose diff --git a/gtsam_unstable/dynamics/tests/testPoseRTV.cpp b/gtsam_unstable/dynamics/tests/testPoseRTV.cpp index 381971502..c833ea116 100644 --- a/gtsam_unstable/dynamics/tests/testPoseRTV.cpp +++ b/gtsam_unstable/dynamics/tests/testPoseRTV.cpp @@ -232,8 +232,8 @@ TEST( testPoseRTV, transformed_from_1 ) { PoseRTV expected(transform.compose(start.pose()), transform.rotation().rotate(V)); EXPECT(assert_equal(expected, actual, tol)); - Matrix numDGlobal = numericalDerivative21(transformed_from_proxy, start, transform, 1e-8); - Matrix numDTrans = numericalDerivative22(transformed_from_proxy, start, transform, 1e-8); + Matrix numDGlobal = numericalDerivative21(transformed_from_proxy, start, transform, 1e-5); // At 1e-8, fails + Matrix numDTrans = numericalDerivative22(transformed_from_proxy, start, transform, 1e-8); // Sensitive to step size EXPECT(assert_equal(numDGlobal, actDGlobal, tol)); EXPECT(assert_equal(numDTrans, actDTrans, tol)); // FIXME: still needs analytic derivative } @@ -251,8 +251,8 @@ TEST( testPoseRTV, transformed_from_2 ) { PoseRTV expected(transform.compose(start.pose()), transform.rotation().rotate(V)); EXPECT(assert_equal(expected, actual, tol)); - Matrix numDGlobal = numericalDerivative21(transformed_from_proxy, start, transform, 1e-8); - Matrix numDTrans = numericalDerivative22(transformed_from_proxy, start, transform, 1e-8); + Matrix numDGlobal = numericalDerivative21(transformed_from_proxy, start, transform, 1e-5); // At 1e-8, fails + Matrix numDTrans = numericalDerivative22(transformed_from_proxy, start, transform, 1e-8); // Sensitive to step size EXPECT(assert_equal(numDGlobal, actDGlobal, tol)); EXPECT(assert_equal(numDTrans, actDTrans, tol)); // FIXME: still needs analytic derivative } From 19796465bfde502fb8fdae8dd22da954c19c93d0 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 6 Jun 2012 12:51:21 +0000 Subject: [PATCH 211/914] Moved back missing tictoc_print --- gtsam/base/timing.h | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index 66823effc..8eb99f577 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -97,19 +97,6 @@ inline void tictoc_finishedIteration_() { timingRoot->finishedIteration(); } -#ifdef ENABLE_TIMING -inline void tic(size_t id, const std::string& label) { tic_(id, label); } -inline void toc(size_t id) { toc_(id); } -inline void toc(size_t id, const std::string& label) { toc_(id, label); } -inline void tictoc_finishedIteration() { tictoc_finishedIteration_(); } -#else -inline void tic(size_t, const char*) {} -inline void toc(size_t) {} -inline void toc(size_t, const char*) {} -inline void tictoc_finishedIteration() {} -#endif - - inline void tictoc_print_() { timingRoot->print(); } @@ -119,6 +106,21 @@ inline void tictoc_print2_() { timingRoot->print2(); } +#ifdef ENABLE_TIMING +inline void tic(size_t id, const std::string& label) { tic_(id, label); } +inline void toc(size_t id) { toc_(id); } +inline void toc(size_t id, const std::string& label) { toc_(id, label); } +inline void tictoc_finishedIteration() { tictoc_finishedIteration_(); } +inline void tictoc_print() { tictoc_print_(); } +#else +inline void tic(size_t, const char*) {} +inline void toc(size_t) {} +inline void toc(size_t, const char*) {} +inline void tictoc_finishedIteration() {} +inline void tictoc_print() {} +#endif + + #ifdef ENABLE_OLD_TIMING // simple class for accumulating execution timing information by name @@ -210,7 +212,6 @@ inline double tic(const std::string& id) { return tic_(id); } inline double toc(const std::string& id) { return toc_(id); } inline void ticPush(const std::string& prefix, const std::string& id) { ticPush_(prefix, id); } inline void ticPop(const std::string& prefix, const std::string& id) { ticPop_(prefix, id); } -inline void tictoc_print() { tictoc_print_(); } #else inline double _tic() {return 0.;} inline double _toc(double) {return 0.;} @@ -218,7 +219,6 @@ inline double tic(const std::string&) {return 0.;} inline double toc(const std::string&) {return 0.;} inline void ticPush(const std::string&, const std::string&) {} inline void ticPop(const std::string&, const std::string&) {} -inline void tictoc_print() {} #endif #endif From 55ff10a1c2d7cc302fd5b09e9a89f91920eee8fe Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 6 Jun 2012 12:51:44 +0000 Subject: [PATCH 212/914] Updated old timing statements in discrete examples and reenabled the examples --- gtsam_unstable/discrete/CMakeLists.txt | 4 ++-- gtsam_unstable/discrete/examples/schedulingExample.cpp | 5 ++--- gtsam_unstable/discrete/examples/schedulingQuals12.cpp | 5 ++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index d40d4e48f..edec85416 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -27,8 +27,8 @@ add_dependencies(check.unstable check.discrete_unstable) # List examples to build - comment out here to exclude from compilation set(discrete_unstable_examples -#schedulingExample -#schedulingQuals12 +schedulingExample +schedulingQuals12 ) if (GTSAM_BUILD_EXAMPLES) diff --git a/gtsam_unstable/discrete/examples/schedulingExample.cpp b/gtsam_unstable/discrete/examples/schedulingExample.cpp index 14e4367f5..0f9854007 100644 --- a/gtsam_unstable/discrete/examples/schedulingExample.cpp +++ b/gtsam_unstable/discrete/examples/schedulingExample.cpp @@ -8,7 +8,6 @@ //#define ENABLE_TIMING #define ADD_NO_CACHING #define ADD_NO_PRUNING -#define ENABLE_OLD_TIMING #include #include #include @@ -152,9 +151,9 @@ void solveStaged(size_t addMutex = 2) { scheduler.buildGraph(addMutex); // Do EXACT INFERENCE - tic_("eliminate"); + tic_(3,"eliminate"); DiscreteBayesNet::shared_ptr chordal = scheduler.eliminate(); - toc_("eliminate"); + toc_(3,"eliminate"); // find root node DiscreteConditional::shared_ptr root = *(chordal->rbegin()); diff --git a/gtsam_unstable/discrete/examples/schedulingQuals12.cpp b/gtsam_unstable/discrete/examples/schedulingQuals12.cpp index 19357fdcf..4221eb755 100644 --- a/gtsam_unstable/discrete/examples/schedulingQuals12.cpp +++ b/gtsam_unstable/discrete/examples/schedulingQuals12.cpp @@ -8,7 +8,6 @@ #define ENABLE_TIMING #define ADD_NO_CACHING #define ADD_NO_PRUNING -#define ENABLE_OLD_TIMING #include #include #include @@ -179,9 +178,9 @@ void solveStaged(size_t addMutex = 2) { scheduler.buildGraph(addMutex); // Do EXACT INFERENCE - tic_("eliminate"); + tic_(3,"eliminate"); DiscreteBayesNet::shared_ptr chordal = scheduler.eliminate(); - toc_("eliminate"); + toc_(3,"eliminate"); // find root node DiscreteConditional::shared_ptr root = *(chordal->rbegin()); From 87a705468d19b29eb4cfbeb8da774a24c9dc79d8 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 6 Jun 2012 13:04:47 +0000 Subject: [PATCH 213/914] Removed unnecessary tests/examples, consolidated utility functions --- gtsam_unstable/dynamics/PoseRTV.cpp | 38 ++- gtsam_unstable/dynamics/PoseRTV.h | 14 + gtsam_unstable/dynamics/imu_examples.h | 273 ------------------ gtsam_unstable/dynamics/inertialUtils.cpp | 51 ---- gtsam_unstable/dynamics/inertialUtils.h | 32 -- .../dynamics/tests/testIMUSystem.cpp | 34 --- .../dynamics/tests/testInertialUtils.cpp | 34 --- gtsam_unstable/dynamics/tests/testPoseRTV.cpp | 215 +------------- 8 files changed, 61 insertions(+), 630 deletions(-) delete mode 100644 gtsam_unstable/dynamics/imu_examples.h delete mode 100644 gtsam_unstable/dynamics/inertialUtils.cpp delete mode 100644 gtsam_unstable/dynamics/inertialUtils.h delete mode 100644 gtsam_unstable/dynamics/tests/testInertialUtils.cpp diff --git a/gtsam_unstable/dynamics/PoseRTV.cpp b/gtsam_unstable/dynamics/PoseRTV.cpp index e78f5a62d..c10885fc0 100644 --- a/gtsam_unstable/dynamics/PoseRTV.cpp +++ b/gtsam_unstable/dynamics/PoseRTV.cpp @@ -10,7 +10,6 @@ #include #include -#include #include namespace gtsam { @@ -201,7 +200,7 @@ Vector PoseRTV::imuPrediction(const PoseRTV& x2, double dt) const { // rotation rates // just using euler angles based on matlab code // FIXME: this is silly - we shouldn't use differences in Euler angles - Matrix Enb = dynamics::RRTMnb(r1); + Matrix Enb = RRTMnb(r1); Vector euler1 = r1.xyz(), euler2 = r2.xyz(); Vector dR = euler2 - euler1; @@ -276,4 +275,39 @@ PoseRTV PoseRTV::transformed_from(const Pose3& trans, return PoseRTV(newpose, newvel); } +/* ************************************************************************* */ +Matrix PoseRTV::RRTMbn(const Vector& euler) { + assert(euler.size() == 3); + const double s1 = sin(euler(1-1)), c1 = cos(euler(1-1)); + const double t2 = tan(euler(2-1)), c2 = cos(euler(2-1)); + Matrix Ebn(3,3); + Ebn << 1.0, s1 * t2, c1 * t2, + 0.0, c1, -s1, + 0.0, s1 / c2, c1 / c2; + return Ebn; +} + +/* ************************************************************************* */ +Matrix PoseRTV::RRTMbn(const Rot3& att) { + return PoseRTV::RRTMbn(att.rpy()); +} + +/* ************************************************************************* */ +Matrix PoseRTV::RRTMnb(const Vector& euler) { + assert(euler.size() == 3); + Matrix Enb(3,3); + const double s1 = sin(euler(1-1)), c1 = cos(euler(1-1)); + const double s2 = sin(euler(2-1)), c2 = cos(euler(2-1)); + Enb << 1.0, 0.0, -s2, + 0.0, c1, s1*c2, + 0.0, -s1, c1*c2; + return Enb; +} + +/* ************************************************************************* */ +Matrix PoseRTV::RRTMnb(const Rot3& att) { + return PoseRTV::RRTMnb(att.rpy()); +} + +/* ************************************************************************* */ } // \namespace gtsam diff --git a/gtsam_unstable/dynamics/PoseRTV.h b/gtsam_unstable/dynamics/PoseRTV.h index b2e325f53..077756f56 100644 --- a/gtsam_unstable/dynamics/PoseRTV.h +++ b/gtsam_unstable/dynamics/PoseRTV.h @@ -153,6 +153,20 @@ public: boost::optional Dglobal=boost::none, boost::optional Dtrans=boost::none) const; + // Utility functions + + /// RRTMbn - Function computes the rotation rate transformation matrix from + /// body axis rates to euler angle (global) rates + static Matrix RRTMbn(const Vector& euler); + + static Matrix RRTMbn(const Rot3& att); + + /// RRTMnb - Function computes the rotation rate transformation matrix from + /// euler angle rates to body axis rates + static Matrix RRTMnb(const Vector& euler); + + static Matrix RRTMnb(const Rot3& att); + private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam_unstable/dynamics/imu_examples.h b/gtsam_unstable/dynamics/imu_examples.h deleted file mode 100644 index 90bbc9d8b..000000000 --- a/gtsam_unstable/dynamics/imu_examples.h +++ /dev/null @@ -1,273 +0,0 @@ -/** - * @file imu_examples.h - * @brief Example measurements from ACFR matlab simulation - * @author Alex Cunningham - */ - -#pragma once - -#include -#include - -namespace gtsam { -namespace examples { - -// examples pulled from simulated dataset - -// case pulled from dataset (frame 5000, no noise, flying robot) -namespace frame5000 { -double dt=0.010000; - -// previous frame -gtsam::Point3 posInit( - -34.959663877411039, - -36.312388041359441, - -9.929634578582256); -gtsam::Vector velInit = gtsam::Vector_(3, - -2.325950469365050, - -5.545469040035986, - 0.026939998635121); -gtsam::Vector attInit = gtsam::Vector_(3, - -0.005702574137157, - -0.029956547314287, - 1.625011216344428); - -// IMU measurement (accel (0-2), gyro (3-5)) - from current frame -gtsam::Vector accel = gtsam::Vector_(3, - 1.188806676070333, - -0.183885870345845, - -9.870747316422888); -gtsam::Vector gyro = gtsam::Vector_(3, - 0.0, - 0.026142019158168, - -2.617993877991494); - -// resulting frame -gtsam::Point3 posFinal( - -34.982904302954310, - -36.367693859767584, - -9.929367164045985); -gtsam::Vector velFinal = gtsam::Vector_(3, - -2.324042554327658, - -5.530581840815272, - 0.026741453627181); -gtsam::Vector attFinal = gtsam::Vector_(3, - -0.004918046965288, - -0.029844423605949, - 1.598818460739227); - -PoseRTV init (posInit, gtsam::Rot3::RzRyRx(attInit), velInit); -PoseRTV final(posFinal, gtsam::Rot3::RzRyRx(attFinal), velFinal); -} - -// case pulled from dataset (frame 10000, no noise, flying robot) -namespace frame10000 { -double dt=0.010000; - -// previous frame -gtsam::Point3 posInit( - -30.320731549352189, - -1.988742283760434, - -9.946212692656349); -gtsam::Vector velInit = gtsam::Vector_(3, - -0.094887047280235, - -5.200243574047883, - -0.006106911050672); -gtsam::Vector attInit = gtsam::Vector_(3, - -0.049884854704728, - -0.004630595995732, - -1.952691683647753); - -// IMU measurement (accel (0-2), gyro (3-5)) - from current frame -gtsam::Vector accel = gtsam::Vector_(3, - 0.127512027192321, - 0.508566822495083, - -9.987963604829643); -gtsam::Vector gyro = gtsam::Vector_(3, - 0.0, - 0.004040957322961, - 2.617993877991494); - -// resulting frame -gtsam::Point3 posFinal( - -30.321685191305157, - -2.040760054006146, - -9.946292804391417); -gtsam::Vector velFinal = gtsam::Vector_(3, - -0.095364195297074, - -5.201777024575911, - -0.008011173506779); -gtsam::Vector attFinal = gtsam::Vector_(3, - -0.050005924151669, - -0.003284795837998, - -1.926546047162884); - -PoseRTV init (posInit, gtsam::Rot3::RzRyRx(attInit), velInit); -PoseRTV final(posFinal, gtsam::Rot3::RzRyRx(attFinal), velFinal); -} - -// case pulled from dataset (frame at time 4.00, no noise, flying robot, poses from 3.99 to 4.0) -namespace flying400 { -double dt=0.010000; - -// start pose -// time 3.9900000e+00 -// pos (x,y,z) 1.8226188e+01 -6.7168156e+01 -9.8236334e+00 -// vel (dx,dy,dz) -5.2887267e+00 1.6117880e-01 -2.2665072e-02 -// att (r, p, y) 1.0928413e-02 -2.0811771e-02 2.7206011e+00 - -// previous frame -gtsam::Point3 posInit( - 1.8226188e+01, -6.7168156e+01, -9.8236334e+00); -gtsam::Vector velInit = gtsam::Vector_(3,-5.2887267e+00, 1.6117880e-01, -2.2665072e-02); -gtsam::Vector attInit = gtsam::Vector_(3, 1.0928413e-02, -2.0811771e-02, 2.7206011e+00); - -// time 4.0000000e+00 -// accel 3.4021509e-01 -3.4413998e-01 -9.8822495e+00 -// gyro 0.0000000e+00 1.8161697e-02 -2.6179939e+00 - -// IMU measurement (accel (0-2), gyro (3-5)) - ax, ay, az, r, p, y -gtsam::Vector accel = gtsam::Vector_(3, - 3.4021509e-01, -3.4413998e-01, -9.8822495e+00); -gtsam::Vector gyro = gtsam::Vector_(3, - 0.0000000e+00, 1.8161697e-02, -2.6179939e+00); // original version (possibly r, p, y) - -// final pose -// time 4.0000000e+00 -// pos (x,y,z) 1.8173262e+01 -6.7166500e+01 -9.8238667e+00 -// vel (vx,vy,vz) -5.2926092e+00 1.6559974e-01 -2.3330881e-02 -// att (r, p, y) 1.1473269e-02 -2.0344066e-02 2.6944191e+00 - -// resulting frame -gtsam::Point3 posFinal(1.8173262e+01, -6.7166500e+01, -9.8238667e+00); -gtsam::Vector velFinal = gtsam::Vector_(3,-5.2926092e+00, 1.6559974e-01, -2.3330881e-02); -gtsam::Vector attFinal = gtsam::Vector_(3, 1.1473269e-02, -2.0344066e-02, 2.6944191e+00); - -// full states -PoseRTV init (posInit, gtsam::Rot3::ypr( attInit(2), attInit(1), attInit(0)), velInit); -PoseRTV final(posFinal, gtsam::Rot3::ypr(attFinal(2), attFinal(1), attFinal(0)), velFinal); - -} // \namespace flying400 - -namespace flying650 { -double dt=0.010000; - -// from time 6.49 to 6.50 in robot F2 - - -// frame (6.49) -// 6.4900000e+00 -3.8065039e+01 -6.4788024e+01 -9.8947445e+00 -5.0099274e+00 1.5999675e-01 -1.7762191e-02 -5.7708025e-03 -1.0109000e-02 -3.0465662e+00 -gtsam::Point3 posInit( - -3.8065039e+01, -6.4788024e+01, -9.8947445e+00); -gtsam::Vector velInit = gtsam::Vector_(3,-5.0099274e+00, 1.5999675e-01, -1.7762191e-02); -gtsam::Vector attInit = gtsam::Vector_(3,-5.7708025e-03, -1.0109000e-02, -3.0465662e+00); - -// IMU measurement (accel (0-2), gyro (3-5)) - ax, ay, az, r, p, y -// 6.5000000e+00 -9.2017256e-02 8.6770069e-02 -9.8213017e+00 0.0000000e+00 1.0728860e-02 -2.6179939e+00 -gtsam::Vector accel = gtsam::Vector_(3, - -9.2017256e-02, 8.6770069e-02, -9.8213017e+00); -gtsam::Vector gyro = gtsam::Vector_(3, - 0.0000000e+00, 1.0728860e-02, -2.6179939e+00); // in r,p,y - -// resulting frame (6.50) -// 6.5000000e+00 -3.8115139e+01 -6.4786428e+01 -9.8949233e+00 -5.0099817e+00 1.5966531e-01 -1.7882777e-02 -5.5061386e-03 -1.0152792e-02 -3.0727477e+00 -gtsam::Point3 posFinal(-3.8115139e+01, -6.4786428e+01, -9.8949233e+00); -gtsam::Vector velFinal = gtsam::Vector_(3,-5.0099817e+00, 1.5966531e-01, -1.7882777e-02); -gtsam::Vector attFinal = gtsam::Vector_(3,-5.5061386e-03, -1.0152792e-02, -3.0727477e+00); - -// full states -PoseRTV init (posInit, gtsam::Rot3::ypr( attInit(2), attInit(1), attInit(0)), velInit); -PoseRTV final(posFinal, gtsam::Rot3::ypr(attFinal(2), attFinal(1), attFinal(0)), velFinal); - -} // \namespace flying650 - - -namespace flying39 { -double dt=0.010000; - -// from time 0.38 to 0.39 in robot F1 - -// frame (0.38) -// 3.8000000e-01 3.4204706e+01 -6.7413834e+01 -9.9996055e+00 -2.2484370e-02 -1.3603911e-03 1.5267496e-02 7.9033358e-04 -1.4946656e-02 -3.1174147e+00 -gtsam::Point3 posInit( 3.4204706e+01, -6.7413834e+01, -9.9996055e+00); -gtsam::Vector velInit = gtsam::Vector_(3,-2.2484370e-02, -1.3603911e-03, 1.5267496e-02); -gtsam::Vector attInit = gtsam::Vector_(3, 7.9033358e-04, -1.4946656e-02, -3.1174147e+00); - -// IMU measurement (accel (0-2), gyro (3-5)) - ax, ay, az, r, p, y -// 3.9000000e-01 7.2229967e-01 -9.5790214e-03 -9.3943087e+00 0.0000000e+00 -2.9157400e-01 -2.6179939e+00 -gtsam::Vector accel = gtsam::Vector_(3, 7.2229967e-01, -9.5790214e-03, -9.3943087e+00); -gtsam::Vector gyro = gtsam::Vector_(3, 0.0000000e+00, -2.9157400e-01, -2.6179939e+00); // in r,p,y - -// resulting frame (0.39) -// 3.9000000e-01 3.4204392e+01 -6.7413848e+01 -9.9994098e+00 -3.1382246e-02 -1.3577532e-03 1.9568177e-02 1.1816996e-03 -1.7841704e-02 3.1395854e+00 -gtsam::Point3 posFinal(3.4204392e+01, -6.7413848e+01, -9.9994098e+00); -gtsam::Vector velFinal = gtsam::Vector_(3,-3.1382246e-02, -1.3577532e-03, 1.9568177e-02); -gtsam::Vector attFinal = gtsam::Vector_(3, 1.1816996e-03, -1.7841704e-02, 3.1395854e+00); - -// full states -PoseRTV init (posInit, gtsam::Rot3::ypr( attInit(2), attInit(1), attInit(0)), velInit); -PoseRTV final(posFinal, gtsam::Rot3::ypr(attFinal(2), attFinal(1), attFinal(0)), velFinal); - -} // \namespace flying39 - -namespace ground200 { -double dt=0.010000; - -// from time 2.00 to 2.01 in robot G1 - -// frame (2.00) -// 2.0000000e+00 3.6863524e+01 -8.4874053e+01 0.0000000e+00 -7.9650687e-01 1.8345508e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.9804083e+00 -gtsam::Point3 posInit(3.6863524e+01, -8.4874053e+01, 0.0000000e+00); -gtsam::Vector velInit = gtsam::Vector_(3,-7.9650687e-01, 1.8345508e+00, 0.0000000e+00); -gtsam::Vector attInit = gtsam::Vector_(3, 0.0000000e+00, 0.0000000e+00, 1.9804083e+00); - -// IMU measurement (accel (0-2), gyro (3-5)) - ax, ay, az, r, p, y -// 2.0100000e+00 1.0000000e+00 8.2156504e-15 -9.8100000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 -gtsam::Vector accel = gtsam::Vector_(3, - 1.0000000e+00, 8.2156504e-15, -9.8100000e+00); -gtsam::Vector gyro = gtsam::Vector_(3, - 0.0000000e+00, 0.0000000e+00, 0.0000000e+00); // in r,p,y - -// resulting frame (2.01) -// 2.0100000e+00 3.6855519e+01 -8.4855615e+01 0.0000000e+00 -8.0048940e-01 1.8437236e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.9804083e+00 -gtsam::Point3 posFinal(3.6855519e+01, -8.4855615e+01, 0.0000000e+00); -gtsam::Vector velFinal = gtsam::Vector_(3,-8.0048940e-01, 1.8437236e+00, 0.0000000e+00); -gtsam::Vector attFinal = gtsam::Vector_(3, 0.0000000e+00, 0.0000000e+00, 1.9804083e+00); - -// full states -PoseRTV init (posInit, gtsam::Rot3::ypr( attInit(2), attInit(1), attInit(0)), velInit); -PoseRTV final(posFinal, gtsam::Rot3::ypr(attFinal(2), attFinal(1), attFinal(0)), velFinal); - -} // \namespace ground200 - -namespace ground600 { -double dt=0.010000; - -// from time 6.00 to 6.01 in robot G1 - -// frame (6.00) -// 6.0000000e+00 3.0320057e+01 -7.0883904e+01 0.0000000e+00 -4.0020377e+00 2.9972811e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 2.4987711e+00 -gtsam::Point3 posInit(3.0320057e+01, -7.0883904e+01, 0.0000000e+00); -gtsam::Vector velInit = gtsam::Vector_(3,-4.0020377e+00, 2.9972811e+00, 0.0000000e+00); -gtsam::Vector attInit = gtsam::Vector_(3, 0.0000000e+00, 0.0000000e+00, 2.4987711e+00); - -// IMU measurement (accel (0-2), gyro (3-5)) - ax, ay, az, r, p, y -// 6.0100000e+00 6.1683759e-02 7.8536587e+00 -9.8100000e+00 0.0000000e+00 0.0000000e+00 1.5707963e+00 -gtsam::Vector accel = gtsam::Vector_(3, - 6.1683759e-02, 7.8536587e+00, -9.8100000e+00); -gtsam::Vector gyro = gtsam::Vector_(3, - 0.0000000e+00, 0.0000000e+00, 1.5707963e+00); // in r,p,y - -// resulting frame (6.01) -// 6.0100000e+00 3.0279571e+01 -7.0854564e+01 0.0000000e+00 -4.0486232e+00 2.9340501e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 2.5144791e+00 -gtsam::Point3 posFinal(3.0279571e+01, -7.0854564e+01, 0.0000000e+00); -gtsam::Vector velFinal = gtsam::Vector_(3,-4.0486232e+00, 2.9340501e+00, 0.0000000e+00); -gtsam::Vector attFinal = gtsam::Vector_(3, 0.0000000e+00, 0.0000000e+00, 2.5144791e+00); - -// full states -PoseRTV init (posInit, gtsam::Rot3::ypr( attInit(2), attInit(1), attInit(0)), velInit); -PoseRTV final(posFinal, gtsam::Rot3::ypr(attFinal(2), attFinal(1), attFinal(0)), velFinal); - -} // \namespace ground600 - -} // \namespace examples -} // \namespace gtsam diff --git a/gtsam_unstable/dynamics/inertialUtils.cpp b/gtsam_unstable/dynamics/inertialUtils.cpp deleted file mode 100644 index 94d99f690..000000000 --- a/gtsam_unstable/dynamics/inertialUtils.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file inertialUtils.cpp - * - * @date Nov 28, 2011 - * @author Alex Cunningham - */ - -#include - -namespace gtsam { -namespace dynamics { - -/* ************************************************************************* */ -Matrix RRTMbn(const Vector& euler) { - assert(euler.size() == 3); - const double s1 = sin(euler(1-1)), c1 = cos(euler(1-1)); - const double t2 = tan(euler(2-1)), c2 = cos(euler(2-1)); - Matrix Ebn(3,3); - Ebn << 1.0, s1 * t2, c1 * t2, - 0.0, c1, -s1, - 0.0, s1 / c2, c1 / c2; - return Ebn; -} - -/* ************************************************************************* */ -Matrix RRTMbn(const Rot3& att) { - return RRTMbn(att.rpy()); -} - -/* ************************************************************************* */ -Matrix RRTMnb(const Vector& euler) { - assert(euler.size() == 3); - Matrix Enb(3,3); - const double s1 = sin(euler(1-1)), c1 = cos(euler(1-1)); - const double s2 = sin(euler(2-1)), c2 = cos(euler(2-1)); - Enb << 1.0, 0.0, -s2, - 0.0, c1, s1*c2, - 0.0, -s1, c1*c2; - return Enb; -} - -/* ************************************************************************* */ -Matrix RRTMnb(const Rot3& att) { - return RRTMnb(att.rpy()); -} - -} // \namespace dynamics -} // \namespace gtsam - - - diff --git a/gtsam_unstable/dynamics/inertialUtils.h b/gtsam_unstable/dynamics/inertialUtils.h deleted file mode 100644 index 250ed3abe..000000000 --- a/gtsam_unstable/dynamics/inertialUtils.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @file inertialUtils.h - * - * @brief Utility functions for working with dynamic systems - derived from Mitch's matlab code - * This is mostly just syntactic sugar for working with dynamic systems that use - * Euler angles to specify the orientation of a robot. - * - * @date Nov 28, 2011 - * @author Alex Cunningham - */ - -#pragma once - -#include - -namespace gtsam { -namespace dynamics { - -/// RRTMbn - Function computes the rotation rate transformation matrix from -/// body axis rates to euler angle (global) rates -Matrix RRTMbn(const Vector& euler); - -Matrix RRTMbn(const Rot3& att); - -/// RRTMnb - Function computes the rotation rate transformation matrix from -/// euler angle rates to body axis rates -Matrix RRTMnb(const Vector& euler); - -Matrix RRTMnb(const Rot3& att); - -} // \namespace dynamics -} // \namespace gtsam diff --git a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp index ad66b2b60..1749ded1a 100644 --- a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp +++ b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp @@ -6,7 +6,6 @@ #include #include -#include using namespace gtsam; using namespace imu; @@ -135,38 +134,6 @@ TEST( testIMUSystem, optimize_chain_fullfactor ) { // EXPECT(assert_equal(true_values, actual, tol)); // FAIL } -///* ************************************************************************* */ -//TEST( testIMUSystem, imu_factor_basics ) { -// using namespace examples; -// PoseKey x1(1), x2(2); -// SharedDiagonal model = noiseModel::Diagonal::Sigmas(Vector_(6, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6)); -// IMUMeasurement factor(frame5000::accel, frame5000::gyro, frame5000::dt, x1, x2, model); -// -// EXPECT(assert_equal(x1, factor.key1())); -// EXPECT(assert_equal(x2, factor.key2())); -// EXPECT(assert_equal(frame5000::accel, factor.accel(), tol)); -// EXPECT(assert_equal(frame5000::gyro, factor.gyro(), tol)); -// Vector full_meas = concatVectors(2, &frame5000::accel, &frame5000::gyro); -// EXPECT(assert_equal(full_meas, factor.z(), tol)); -//} -// -///* ************************************************************************* */ -//TEST( testIMUSystem, imu_factor_predict_function ) { -// using namespace examples; -// PoseKey x1(1), x2(2); -// SharedDiagonal model = noiseModel::Diagonal::Sigmas(Vector_(6, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6)); -// IMUMeasurement factor(frame5000::accel, frame5000::gyro, frame5000::dt, x1, x2, model); -// -// // verify zero error -// Vector actZeroError = factor.evaluateError(frame5000::init, frame5000::final); -// EXPECT(assert_equal(zero(6), actZeroError, tol)); -// -// // verify nonzero error - z-h(x) -// Vector actError = factor.evaluateError(frame10000::init, frame10000::final); -// Vector meas10k = concatVectors(2, &frame10000::accel, &frame10000::gyro); -// EXPECT(assert_equal(factor.z() - meas10k, actError, tol)); -//} - /* ************************************************************************* */ TEST( testIMUSystem, linear_trajectory) { // create a linear trajectory of poses @@ -195,7 +162,6 @@ TEST( testIMUSystem, linear_trajectory) { init_traj.insert(xB, PoseRTV()); } // EXPECT_DOUBLES_EQUAL(0, graph.error(true_traj), 1e-5); // FAIL - } /* ************************************************************************* */ diff --git a/gtsam_unstable/dynamics/tests/testInertialUtils.cpp b/gtsam_unstable/dynamics/tests/testInertialUtils.cpp deleted file mode 100644 index 5360aaae8..000000000 --- a/gtsam_unstable/dynamics/tests/testInertialUtils.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @file testInertialUtils.cpp - * - * @brief Conversions for the utility functions from the matlab implementation - * - * @date Nov 28, 2011 - * @author Alex Cunningham - */ - -#include - -#include - -using namespace gtsam; - -static const double tol = 1e-5; - -/* ************************************************************************* */ -TEST(testInertialUtils, RRTMbn) { - EXPECT(assert_equal(Matrix::Identity(3,3), dynamics::RRTMbn(zero(3)), tol)); - EXPECT(assert_equal(Matrix::Identity(3,3), dynamics::RRTMbn(Rot3()), tol)); - EXPECT(assert_equal(dynamics::RRTMbn(Vector_(3, 0.3, 0.2, 0.1)), dynamics::RRTMbn(Rot3::ypr(0.1, 0.2, 0.3)), tol)); -} - -/* ************************************************************************* */ -TEST(testInertialUtils, RRTMnb) { - EXPECT(assert_equal(Matrix::Identity(3,3), dynamics::RRTMnb(zero(3)), tol)); - EXPECT(assert_equal(Matrix::Identity(3,3), dynamics::RRTMnb(Rot3()), tol)); - EXPECT(assert_equal(dynamics::RRTMnb(Vector_(3, 0.3, 0.2, 0.1)), dynamics::RRTMnb(Rot3::ypr(0.1, 0.2, 0.3)), tol)); -} - -/* ************************************************************************* */ -int main() { TestResult tr; return TestRegistry::runAllTests(tr); } -/* ************************************************************************* */ diff --git a/gtsam_unstable/dynamics/tests/testPoseRTV.cpp b/gtsam_unstable/dynamics/tests/testPoseRTV.cpp index c833ea116..1444f69fc 100644 --- a/gtsam_unstable/dynamics/tests/testPoseRTV.cpp +++ b/gtsam_unstable/dynamics/tests/testPoseRTV.cpp @@ -9,7 +9,6 @@ #include #include -#include using namespace gtsam; @@ -119,85 +118,6 @@ TEST( testPoseRTV, dynamics_identities ) { // EXPECT(assert_equal(x4.translation(), x3.imuPrediction(x4, dt).second, tol)); } -///* ************************************************************************* */ -//TEST( testPoseRTV, constant_velocity ) { -// double dt = 1.0; -// PoseRTV init(Rot3(), Point3(1.0, 2.0, 3.0), Vector_(3, 0.5, 0.0, 0.0)); -// PoseRTV final(Rot3(), Point3(1.5, 2.0, 3.0), Vector_(3, 0.5, 0.0, 0.0)); -// -// // constant velocity, so gyro is zero, but accel includes gravity -// Vector accel = delta(3, 2, -9.81), gyro = zero(3); -// -// // perform integration -// PoseRTV actFinal = init.integrate(accel, gyro, dt); -// EXPECT(assert_equal(final, actFinal, tol)); -// -// // perform prediction -// Vector actAccel, actGyro; -// boost::tie(actAccel, actGyro) = init.predict(final, dt); -// EXPECT(assert_equal(accel, actAccel, tol)); -// EXPECT(assert_equal(gyro, actGyro, tol)); -//} -// -///* ************************************************************************* */ -//TEST( testPoseRTV, frame10000_imu ) { -// using namespace examples; -// -// // perform integration -// PoseRTV actFinal = frame10000::init.integrate(frame10000::accel, frame10000::gyro, frame10000::dt); -// EXPECT(assert_equal(frame10000::final, actFinal, tol)); -// -// // perform prediction -// Vector actAccel, actGyro; -// boost::tie(actAccel, actGyro) = frame10000::init.predict(frame10000::final, frame10000::dt); -// EXPECT(assert_equal(frame10000::accel, actAccel, tol)); -// EXPECT(assert_equal(frame10000::gyro, actGyro, tol)); -//} -// -///* ************************************************************************* */ -//TEST( testPoseRTV, frame5000_imu ) { -// using namespace examples; -// -// // perform integration -// PoseRTV actFinal = frame5000::init.integrate(frame5000::accel, frame5000::gyro, frame5000::dt); -// EXPECT(assert_equal(frame5000::final, actFinal, tol)); -// -// // perform prediction -// Vector actAccel, actGyro; -// boost::tie(actAccel, actGyro) = frame5000::init.predict(frame5000::final, frame5000::dt); -// EXPECT(assert_equal(frame5000::accel, actAccel, tol)); -// EXPECT(assert_equal(frame5000::gyro, actGyro, tol)); -//} -// -///* ************************************************************************* */ -//TEST( testPoseRTV, time4_imu ) { -// using namespace examples::flying400; -// -// // perform integration -// PoseRTV actFinal = init.integrate(accel, gyro, dt); -// EXPECT(assert_equal(final, actFinal, tol)); -// -// // perform prediction -// Vector actAccel, actGyro; -// boost::tie(actAccel, actGyro) = init.predict(final, dt); -// EXPECT(assert_equal(accel, actAccel, tol)); -// EXPECT(assert_equal(gyro, actGyro, tol)); -//} -// -///* ************************************************************************* */ -//TEST( testPoseRTV, time65_imu ) { -// using namespace examples::flying650; -// -// // perform integration -// PoseRTV actFinal = init.integrate(accel, gyro, dt); -// EXPECT(assert_equal(final, actFinal, tol)); -// -// // perform prediction -// Vector actAccel, actGyro; -// boost::tie(actAccel, actGyro) = init.predict(final, dt); -// EXPECT(assert_equal(accel, actAccel, tol)); -// EXPECT(assert_equal(gyro, actGyro, tol)); -//} /* ************************************************************************* */ double range_proxy(const PoseRTV& A, const PoseRTV& B) { return A.range(B); } @@ -258,131 +178,18 @@ TEST( testPoseRTV, transformed_from_2 ) { } /* ************************************************************************* */ -// ground robot maximums -//const static double ground_max_accel = 1.0; // m/s^2 -//const static double ground_mag_vel = 5.0; // m/s - fixed in simulator +TEST(testPoseRTV, RRTMbn) { + EXPECT(assert_equal(Matrix::Identity(3,3), PoseRTV::RRTMbn(zero(3)), tol)); + EXPECT(assert_equal(Matrix::Identity(3,3), PoseRTV::RRTMbn(Rot3()), tol)); + EXPECT(assert_equal(PoseRTV::RRTMbn(Vector_(3, 0.3, 0.2, 0.1)), PoseRTV::RRTMbn(Rot3::ypr(0.1, 0.2, 0.3)), tol)); +} -///* ************************************************************************* */ -//TEST(testPoseRTV, flying_integration650) { -// using namespace examples; -// const PoseRTV &x1 = flying650::init, &x2 = flying650::final; -// Vector accel = flying650::accel, gyro = flying650::gyro; -// double dt = flying650::dt; -// -// // control inputs -// double pitch_rate = gyro(1), -// heading_rate = gyro(2), -// lift_control = 0.0; /// FIXME: need to find this value -// -// PoseRTV actual_x2; -// actual_x2 = x1.flyingDynamics(pitch_rate, heading_rate, lift_control, dt); -// -// // FIXME: enable remaining components when there the lift control value is known -// EXPECT(assert_equal(x2.R(), actual_x2.R(), tol)); -//// EXPECT(assert_equal(x2.t(), actual_x2.t(), tol)); -//// EXPECT(assert_equal(x2.v(), actual_x2.v(), tol)); -//} - -///* ************************************************************************* */ -//TEST(testPoseRTV, imu_prediction650) { -// using namespace examples; -// const PoseRTV &x1 = flying650::init, &x2 = flying650::final; -// Vector accel = flying650::accel, gyro = flying650::gyro; -// double dt = flying650::dt; -// -// // given states, predict the imu measurement and t2 (velocity constraint) -// Vector actual_imu; -// Point3 actual_t2; -// boost::tie(actual_imu, actual_t2) = x1.imuPrediction(x2, dt); -// -// EXPECT(assert_equal(x2.t(), actual_t2, tol)); -// EXPECT(assert_equal(accel, actual_imu.head(3), tol)); -// EXPECT(assert_equal(gyro, actual_imu.tail(3), tol)); -//} -// -///* ************************************************************************* */ -//TEST(testPoseRTV, imu_prediction39) { -// // This case was a known failure case for gyro prediction, returning [9.39091; 0.204952; 625.63] using -// // the general approach for reverse-engineering the gyro updates -// using namespace examples; -// const PoseRTV &x1 = flying39::init, &x2 = flying39::final; -// Vector accel = flying39::accel, gyro = flying39::gyro; -// double dt = flying39::dt; -// -// // given states, predict the imu measurement and t2 (velocity constraint) -// Vector actual_imu; -// Point3 actual_t2; -// boost::tie(actual_imu, actual_t2) = x1.imuPrediction(x2, dt); -// -// EXPECT(assert_equal(x2.t(), actual_t2, tol)); -// EXPECT(assert_equal(accel, actual_imu.head(3), tol)); -// EXPECT(assert_equal(gyro, actual_imu.tail(3), tol)); -//} -// -///* ************************************************************************* */ -//TEST(testPoseRTV, ground_integration200) { -// using namespace examples; -// const PoseRTV &x1 = ground200::init, &x2 = ground200::final; -// Vector accel = ground200::accel, gyro = ground200::gyro; -// double dt = ground200::dt; -// -// // integrates from one pose to the next with known measurements -// // No heading change in this example -// // Hits maximum accel bound in this example -// -// PoseRTV actual_x2; -// actual_x2 = x1.planarDynamics(ground_mag_vel, gyro(2), ground_max_accel, dt); -// -// EXPECT(assert_equal(x2, actual_x2, tol)); -//} -// -///* ************************************************************************* */ -//TEST(testPoseRTV, ground_prediction200) { -// using namespace examples; -// const PoseRTV &x1 = ground200::init, &x2 = ground200::final; -// Vector accel = ground200::accel, gyro = ground200::gyro; -// double dt = ground200::dt; -// -// // given states, predict the imu measurement and t2 (velocity constraint) -// Vector actual_imu; -// Point3 actual_t2; -// boost::tie(actual_imu, actual_t2) = x1.imuPrediction(x2, dt); -// -// EXPECT(assert_equal(x2.t(), actual_t2, tol)); -// EXPECT(assert_equal(accel, actual_imu.head(3), tol)); -// EXPECT(assert_equal(gyro, actual_imu.tail(3), tol)); -//} -// -///* ************************************************************************* */ -//TEST(testPoseRTV, ground_integration600) { -// using namespace examples; -// const PoseRTV &x1 = ground600::init, &x2 = ground600::final; -// Vector accel = ground600::accel, gyro = ground600::gyro; -// double dt = ground600::dt; -// -// // integrates from one pose to the next with known measurements -// PoseRTV actual_x2; -// actual_x2 = x1.planarDynamics(ground_mag_vel, gyro(2), ground_max_accel, dt); -// -// EXPECT(assert_equal(x2, actual_x2, tol)); -//} -// -///* ************************************************************************* */ -//TEST(testPoseRTV, ground_prediction600) { -// using namespace examples; -// const PoseRTV &x1 = ground600::init, &x2 = ground600::final; -// Vector accel = ground600::accel, gyro = ground600::gyro; -// double dt = ground600::dt; -// -// // given states, predict the imu measurement and t2 (velocity constraint) -// Vector actual_imu; -// Point3 actual_t2; -// boost::tie(actual_imu, actual_t2) = x1.imuPrediction(x2, dt); -// -// EXPECT(assert_equal(x2.t(), actual_t2, tol)); -// EXPECT(assert_equal(accel, actual_imu.head(3), tol)); -// EXPECT(assert_equal(gyro, actual_imu.tail(3), tol)); -//} +/* ************************************************************************* */ +TEST(testPoseRTV, RRTMnb) { + EXPECT(assert_equal(Matrix::Identity(3,3), PoseRTV::RRTMnb(zero(3)), tol)); + EXPECT(assert_equal(Matrix::Identity(3,3), PoseRTV::RRTMnb(Rot3()), tol)); + EXPECT(assert_equal(PoseRTV::RRTMnb(Vector_(3, 0.3, 0.2, 0.1)), PoseRTV::RRTMnb(Rot3::ypr(0.1, 0.2, 0.3)), tol)); +} /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } From 31d88649f7ed2a7f3dbdf824f875f348af41ffeb Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 18:08:30 +0000 Subject: [PATCH 214/914] fix bug in VisualISAM matlab example --- examples/matlab/VisualISAMExample.m | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index 86465690f..d7f347cc3 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -20,7 +20,7 @@ for j=1:nPoints end %% Create camera poses on a circle around the triangle -nCameras = 30; +nCameras = 10; height = 10; r = 30; poses = {}; @@ -48,6 +48,9 @@ for i=1:nCameras % Prior for the first pose or odometry for subsequent poses if (i==1) newFactors.addPosePrior(symbol('x',1), poses{1}, poseNoise); +% for j=1:nPoints +% newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); +% end else newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, poseNoise); end @@ -67,9 +70,10 @@ for i=1:nCameras initialEstimates.insertPoint(symbol('l',j), points{j}); end else - %TODO: this might not be suboptimal since "result" is not the fully + %TODO: this might be suboptimal since "result" is not the fully %optimized result - prevPose = result.pose(symbol('x',i-1)); + if (i==2), prevPose = poses{1}; + else, prevPose = result.pose(symbol('x',i-1)); end initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); end @@ -82,7 +86,7 @@ for i=1:nCameras result = isam.estimate(); % Plot first result - figure(1);clf + h=figure(1);clf hold on; for j=1:size(points,2) P = isam.marginalCovariance(symbol('l',j)); @@ -97,6 +101,8 @@ for i=1:nCameras plotPose3(pose_ii,P,10); end axis([-50 50 -50 50 -50 50]) + colormap('hot') + print(h,'-dpng',sprintf('VisualISAM_%03d.png',i)); % Reset newFactors and initialEstimates to prepare for the next % update From c5183813730590405f038e67c0519a5a0431a2c9 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Wed, 6 Jun 2012 21:21:49 +0000 Subject: [PATCH 215/914] VisualISAMExample in MATLAB: try to enable point priors. Disable logging images. --- examples/matlab/VisualISAMExample.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index d7f347cc3..e16ffee6a 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -48,9 +48,9 @@ for i=1:nCameras % Prior for the first pose or odometry for subsequent poses if (i==1) newFactors.addPosePrior(symbol('x',1), poses{1}, poseNoise); -% for j=1:nPoints -% newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); -% end + for j=1:nPoints + newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); + end else newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, poseNoise); end @@ -102,7 +102,7 @@ for i=1:nCameras end axis([-50 50 -50 50 -50 50]) colormap('hot') - print(h,'-dpng',sprintf('VisualISAM_%03d.png',i)); + %print(h,'-dpng',sprintf('VisualISAM_%03d.png',i)); % Reset newFactors and initialEstimates to prepare for the next % update From a9c36fc172ecdd9e7254e584cb905c86567a6e4a Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Thu, 7 Jun 2012 01:24:19 +0000 Subject: [PATCH 216/914] move linear algebra functions for jacobian factor graph to a new file --- gtsam/linear/GaussianBayesNet.cpp | 2 +- gtsam/linear/GaussianBayesTree.cpp | 2 +- gtsam/linear/JacobianFactor.cpp | 94 ----------------------- gtsam/linear/JacobianFactor.h | 40 ---------- gtsam/linear/JacobianFactorGraph.cpp | 108 +++++++++++++++++++++++++++ gtsam/linear/JacobianFactorGraph.h | 70 +++++++++++++++++ gtsam/linear/SimpleSPCGSolver.cpp | 2 +- gtsam/nonlinear/ISAM2.cpp | 1 + tests/testGaussianFactorGraphB.cpp | 1 + tests/testGaussianISAM2.cpp | 1 + 10 files changed, 184 insertions(+), 137 deletions(-) create mode 100644 gtsam/linear/JacobianFactorGraph.cpp create mode 100644 gtsam/linear/JacobianFactorGraph.h diff --git a/gtsam/linear/GaussianBayesNet.cpp b/gtsam/linear/GaussianBayesNet.cpp index 5721a4760..056bda67e 100644 --- a/gtsam/linear/GaussianBayesNet.cpp +++ b/gtsam/linear/GaussianBayesNet.cpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include diff --git a/gtsam/linear/GaussianBayesTree.cpp b/gtsam/linear/GaussianBayesTree.cpp index ae76d958e..4a0e4b355 100644 --- a/gtsam/linear/GaussianBayesTree.cpp +++ b/gtsam/linear/GaussianBayesTree.cpp @@ -18,7 +18,7 @@ */ #include -#include +#include namespace gtsam { diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 2b884e1bd..b4d7016aa 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -536,98 +536,4 @@ namespace gtsam { model_ = noiseModel::Diagonal::Sigmas(sigmas); } - /* ************************************************************************* */ - Errors operator*(const FactorGraph& fg, const VectorValues& x) { - Errors e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { - e.push_back((*Ai)*x); - } - return e; - } - - /* ************************************************************************* */ - void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, Errors& e) { - multiplyInPlace(fg,x,e.begin()); - } - - /* ************************************************************************* */ - void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, const Errors::iterator& e) { - Errors::iterator ei = e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { - *ei = (*Ai)*x; - ei++; - } - } - - - /* ************************************************************************* */ - // x += alpha*A'*e - void transposeMultiplyAdd(const FactorGraph& fg, double alpha, const Errors& e, VectorValues& x) { - // For each factor add the gradient contribution - Errors::const_iterator ei = e.begin(); - BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { - Ai->transposeMultiplyAdd(alpha,*(ei++),x); - } - } - - /* ************************************************************************* */ - VectorValues gradient(const FactorGraph& fg, const VectorValues& x0) { - // It is crucial for performance to make a zero-valued clone of x - VectorValues g = VectorValues::Zero(x0); - Errors e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - e.push_back(factor->error_vector(x0)); - } - transposeMultiplyAdd(fg, 1.0, e, g); - return g; - } - - /* ************************************************************************* */ - void gradientAtZero(const FactorGraph& fg, VectorValues& g) { - // Zero-out the gradient - g.setZero(); - Errors e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - e.push_back(-factor->getb()); - } - transposeMultiplyAdd(fg, 1.0, e, g); - } - - /* ************************************************************************* */ - void residual(const FactorGraph& fg, const VectorValues &x, VectorValues &r) { - Index i = 0 ; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - r[i] = factor->getb(); - i++; - } - VectorValues Ax = VectorValues::SameStructure(r); - multiply(fg,x,Ax); - axpy(-1.0,Ax,r); - } - - /* ************************************************************************* */ - void multiply(const FactorGraph& fg, const VectorValues &x, VectorValues &r) { - r.vector() = Vector::Zero(r.dim()); - Index i = 0; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - SubVector &y = r[i]; - for(JacobianFactor::const_iterator j = factor->begin(); j != factor->end(); ++j) { - y += factor->getA(j) * x[*j]; - } - ++i; - } - } - - /* ************************************************************************* */ - void transposeMultiply(const FactorGraph& fg, const VectorValues &r, VectorValues &x) { - x.vector() = Vector::Zero(x.dim()); - Index i = 0; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - for(JacobianFactor::const_iterator j = factor->begin(); j != factor->end(); ++j) { - x[*j] += factor->getA(j).transpose() * r[i]; - } - ++i; - } - } - } diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 30e8e19bb..d45873c3b 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -318,45 +318,5 @@ namespace gtsam { } }; // JacobianFactor - - /** return A*x */ - Errors operator*(const FactorGraph& fg, const VectorValues& x); - - /* In-place version e <- A*x that overwrites e. */ - void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, Errors& e); - - /* In-place version e <- A*x that takes an iterator. */ - void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, const Errors::iterator& e); - - /** x += alpha*A'*e */ - void transposeMultiplyAdd(const FactorGraph& fg, double alpha, const Errors& e, VectorValues& x); - - /** - * Compute the gradient of the energy function, - * \f$ \nabla_{x=x_0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, - * centered around \f$ x = x_0 \f$. - * The gradient is \f$ A^T(Ax-b) \f$. - * @param fg The Jacobian factor graph $(A,b)$ - * @param x0 The center about which to compute the gradient - * @return The gradient as a VectorValues - */ - VectorValues gradient(const FactorGraph& fg, const VectorValues& x0); - - /** - * Compute the gradient of the energy function, - * \f$ \nabla_{x=0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, - * centered around zero. - * The gradient is \f$ A^T(Ax-b) \f$. - * @param fg The Jacobian factor graph $(A,b)$ - * @param [output] g A VectorValues to store the gradient, which must be preallocated, see allocateVectorValues - * @return The gradient as a VectorValues - */ - void gradientAtZero(const FactorGraph& fg, VectorValues& g); - - // matrix-vector operations - void residual(const FactorGraph& fg, const VectorValues &x, VectorValues &r); - void multiply(const FactorGraph& fg, const VectorValues &x, VectorValues &r); - void transposeMultiply(const FactorGraph& fg, const VectorValues &r, VectorValues &x); - } // gtsam diff --git a/gtsam/linear/JacobianFactorGraph.cpp b/gtsam/linear/JacobianFactorGraph.cpp new file mode 100644 index 000000000..4a77c17c4 --- /dev/null +++ b/gtsam/linear/JacobianFactorGraph.cpp @@ -0,0 +1,108 @@ +/* + * JacobianFactorGraph.cpp + * + * Created on: Jun 6, 2012 + * Author: ydjian + */ + +#include +#include + +namespace gtsam { + +/* ************************************************************************* */ +Errors operator*(const FactorGraph& fg, const VectorValues& x) { + Errors e; + BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { + e.push_back((*Ai)*x); + } + return e; +} + +/* ************************************************************************* */ +void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, Errors& e) { + multiplyInPlace(fg,x,e.begin()); +} + +/* ************************************************************************* */ +void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, const Errors::iterator& e) { + Errors::iterator ei = e; + BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { + *ei = (*Ai)*x; + ei++; + } +} + + +/* ************************************************************************* */ +// x += alpha*A'*e +void transposeMultiplyAdd(const FactorGraph& fg, double alpha, const Errors& e, VectorValues& x) { + // For each factor add the gradient contribution + Errors::const_iterator ei = e.begin(); + BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { + Ai->transposeMultiplyAdd(alpha,*(ei++),x); + } +} + +/* ************************************************************************* */ +VectorValues gradient(const FactorGraph& fg, const VectorValues& x0) { + // It is crucial for performance to make a zero-valued clone of x + VectorValues g = VectorValues::Zero(x0); + Errors e; + BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { + e.push_back(factor->error_vector(x0)); + } + transposeMultiplyAdd(fg, 1.0, e, g); + return g; +} + +/* ************************************************************************* */ +void gradientAtZero(const FactorGraph& fg, VectorValues& g) { + // Zero-out the gradient + g.setZero(); + Errors e; + BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { + e.push_back(-factor->getb()); + } + transposeMultiplyAdd(fg, 1.0, e, g); +} + +/* ************************************************************************* */ +void residual(const FactorGraph& fg, const VectorValues &x, VectorValues &r) { + Index i = 0 ; + BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { + r[i] = factor->getb(); + i++; + } + VectorValues Ax = VectorValues::SameStructure(r); + multiply(fg,x,Ax); + axpy(-1.0,Ax,r); +} + +/* ************************************************************************* */ +void multiply(const FactorGraph& fg, const VectorValues &x, VectorValues &r) { + r.vector() = Vector::Zero(r.dim()); + Index i = 0; + BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { + SubVector &y = r[i]; + for(JacobianFactor::const_iterator j = factor->begin(); j != factor->end(); ++j) { + y += factor->getA(j) * x[*j]; + } + ++i; + } +} + +/* ************************************************************************* */ +void transposeMultiply(const FactorGraph& fg, const VectorValues &r, VectorValues &x) { + x.vector() = Vector::Zero(x.dim()); + Index i = 0; + BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { + for(JacobianFactor::const_iterator j = factor->begin(); j != factor->end(); ++j) { + x[*j] += factor->getA(j).transpose() * r[i]; + } + ++i; + } +} +} + + diff --git a/gtsam/linear/JacobianFactorGraph.h b/gtsam/linear/JacobianFactorGraph.h new file mode 100644 index 000000000..e91dee311 --- /dev/null +++ b/gtsam/linear/JacobianFactorGraph.h @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + + * 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 + + * -------------------------------------------------------------------------- */ + +/* + * JacobianFactorGraph.cpp + * + * Created on: Jun 6, 2012 + * Author: ydjian + */ +#pragma once + +#include +#include +#include +#include + +namespace gtsam { + + /** + * Linear Algebra Operations for the JacobianFactorGraph + */ + + /** return A*x */ + Errors operator*(const FactorGraph& fg, const VectorValues& x); + + /** In-place version e <- A*x that overwrites e. */ + void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, Errors& e); + + /** In-place version e <- A*x that takes an iterator. */ + void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, const Errors::iterator& e); + + /** x += alpha*A'*e */ + void transposeMultiplyAdd(const FactorGraph& fg, double alpha, const Errors& e, VectorValues& x); + + /** + * Compute the gradient of the energy function, + * \f$ \nabla_{x=x_0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, + * centered around \f$ x = x_0 \f$. + * The gradient is \f$ A^T(Ax-b) \f$. + * @param fg The Jacobian factor graph $(A,b)$ + * @param x0 The center about which to compute the gradient + * @return The gradient as a VectorValues + */ + VectorValues gradient(const FactorGraph& fg, const VectorValues& x0); + + /** + * Compute the gradient of the energy function, + * \f$ \nabla_{x=0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, + * centered around zero. + * The gradient is \f$ A^T(Ax-b) \f$. + * @param fg The Jacobian factor graph $(A,b)$ + * @param [output] g A VectorValues to store the gradient, which must be preallocated, see allocateVectorValues + * @return The gradient as a VectorValues + */ + void gradientAtZero(const FactorGraph& fg, VectorValues& g); + + /* matrix-vector operations */ + void residual(const FactorGraph& fg, const VectorValues &x, VectorValues &r); + void multiply(const FactorGraph& fg, const VectorValues &x, VectorValues &r); + void transposeMultiply(const FactorGraph& fg, const VectorValues &r, VectorValues &x); + +} diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index 86cf3d1ca..8f59b9058 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index d785657a3..e2ab825b3 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -26,6 +26,7 @@ using namespace boost::assign; #include #include #include +#include #include #include diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 58709328d..0f76af4f6 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index cf2842af9..c74dbe276 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include From cd54e80c8c8fe91fb03906f54a255a2bd9c58229 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 02:10:58 +0000 Subject: [PATCH 217/914] Doxygen comments --- gtsam/linear/JacobianFactorGraph.cpp | 9 ++++----- gtsam/linear/JacobianFactorGraph.h | 14 +++++--------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/gtsam/linear/JacobianFactorGraph.cpp b/gtsam/linear/JacobianFactorGraph.cpp index 4a77c17c4..835783d4a 100644 --- a/gtsam/linear/JacobianFactorGraph.cpp +++ b/gtsam/linear/JacobianFactorGraph.cpp @@ -1,8 +1,7 @@ -/* - * JacobianFactorGraph.cpp - * - * Created on: Jun 6, 2012 - * Author: ydjian +/** + * @file JacobianFactorGraph.h + * @date Jun 6, 2012 + * @Author Yong Dian Jian */ #include diff --git a/gtsam/linear/JacobianFactorGraph.h b/gtsam/linear/JacobianFactorGraph.h index e91dee311..f5e78810a 100644 --- a/gtsam/linear/JacobianFactorGraph.h +++ b/gtsam/linear/JacobianFactorGraph.h @@ -9,11 +9,11 @@ * -------------------------------------------------------------------------- */ -/* - * JacobianFactorGraph.cpp - * - * Created on: Jun 6, 2012 - * Author: ydjian +/** + * @file JacobianFactorGraph.cpp + * @date Jun 6, 2012 + * @brief Linear Algebra Operations for a JacobianFactorGraph + * @Author Yong Dian Jian */ #pragma once @@ -24,10 +24,6 @@ namespace gtsam { - /** - * Linear Algebra Operations for the JacobianFactorGraph - */ - /** return A*x */ Errors operator*(const FactorGraph& fg, const VectorValues& x); From 81b577eb596a876e34387ca9c741e7a5632a30f9 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 02:11:16 +0000 Subject: [PATCH 218/914] Fixed compile error in gtsam_unstable --- gtsam_unstable/linear/iterative.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam_unstable/linear/iterative.cpp b/gtsam_unstable/linear/iterative.cpp index 35b11f16d..c7b670843 100644 --- a/gtsam_unstable/linear/iterative.cpp +++ b/gtsam_unstable/linear/iterative.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include From 78bbcde7cd2fc2ddb367d42307e313a870aaa620 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 02:16:58 +0000 Subject: [PATCH 219/914] printing --- gtsam/nonlinear/Ordering.cpp | 10 +++------- gtsam/nonlinear/Ordering.h | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/gtsam/nonlinear/Ordering.cpp b/gtsam/nonlinear/Ordering.cpp index 14be537d3..2c20d82dd 100644 --- a/gtsam/nonlinear/Ordering.cpp +++ b/gtsam/nonlinear/Ordering.cpp @@ -41,13 +41,9 @@ void Ordering::permuteWithInverse(const Permutation& inversePermutation) { /* ************************************************************************* */ void Ordering::print(const string& str, const KeyFormatter& keyFormatter) const { - cout << str << " "; - BOOST_FOREACH(const Ordering::value_type& key_order, *this) { - if(key_order != *begin()) - cout << ", "; - cout << keyFormatter(key_order.first) << ":" << key_order.second; - } - cout << endl; + cout << str; + BOOST_FOREACH(const Ordering::value_type& key_order, *this) + cout << keyFormatter(key_order.first) << ":" << key_order.second << endl; } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/Ordering.h b/gtsam/nonlinear/Ordering.h index f775f168b..1f2b8646e 100644 --- a/gtsam/nonlinear/Ordering.h +++ b/gtsam/nonlinear/Ordering.h @@ -217,7 +217,7 @@ public: /// @{ /** print (from Testable) for testing and debugging */ - void print(const std::string& str = "Ordering:", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; + void print(const std::string& str = "Ordering:\n", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; /** equals (from Testable) for testing and debugging */ bool equals(const Ordering& rhs, double tol = 0.0) const; From 89a24e240b75f4cc6363816d234263a338a6457e Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 02:17:55 +0000 Subject: [PATCH 220/914] doxygen --- gtsam/linear/IterativeOptimizationParameters.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gtsam/linear/IterativeOptimizationParameters.h b/gtsam/linear/IterativeOptimizationParameters.h index b4599ecfd..459f07b3e 100644 --- a/gtsam/linear/IterativeOptimizationParameters.h +++ b/gtsam/linear/IterativeOptimizationParameters.h @@ -23,7 +23,9 @@ namespace gtsam { -/* parameters for the conjugate gradient method */ +/** + * parameters for the conjugate gradient method + */ struct ConjugateGradientParameters { size_t minIterations_; ///< minimum number of cg iterations @@ -78,7 +80,9 @@ struct ConjugateGradientParameters { } }; -/* parameters for iterative linear solvers */ +/** + * parameters for iterative linear solvers + */ class IterativeOptimizationParameters { public: From e986311566e9a96896eaadbb526571a8b46ed21c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 02:18:24 +0000 Subject: [PATCH 221/914] small details --- examples/matlab/PlanarSLAMExample.m | 10 ++-------- examples/matlab/PlanarSLAMExample_sampling.m | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/examples/matlab/PlanarSLAMExample.m b/examples/matlab/PlanarSLAMExample.m index 4addd23dc..c5cc2d5d3 100644 --- a/examples/matlab/PlanarSLAMExample.m +++ b/examples/matlab/PlanarSLAMExample.m @@ -40,14 +40,8 @@ graph.addOdometry(i2, i3, odometry, odometryNoise); %% Add bearing/range measurement factors degrees = pi/180; noiseModel = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); -if 1 - graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); - graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); -else - bearingModel = gtsamSharedNoiseModel_Sigmas(0.1); - graph.addBearing(i1, j1, gtsamRot2(45*degrees), bearingModel); - graph.addBearing(i2, j1, gtsamRot2(90*degrees), bearingModel); -end +graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); +graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); % print diff --git a/examples/matlab/PlanarSLAMExample_sampling.m b/examples/matlab/PlanarSLAMExample_sampling.m index 178e48a42..f4124e003 100644 --- a/examples/matlab/PlanarSLAMExample_sampling.m +++ b/examples/matlab/PlanarSLAMExample_sampling.m @@ -34,7 +34,7 @@ else graph.addBearing(i1, j1, gtsamRot2(45*degrees), bearingModel); graph.addBearing(i2, j1, gtsamRot2(90*degrees), bearingModel); end -graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); +graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); %% Initialize MCMC sampler with ground truth sample = planarSLAMValues; From 9211a314a8fb78cf5c3e2107718a6f0c0c9d466a Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 02:19:12 +0000 Subject: [PATCH 222/914] comment --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 0ca70d389..71a14703e 100644 --- a/gtsam.h +++ b/gtsam.h @@ -232,7 +232,7 @@ class Rot3 { // Manifold static size_t Dim(); size_t dim() const; - // gtsam::Rot3 retractCayley(Vector v) const; // not in Quaternion branch + // gtsam::Rot3 retractCayley(Vector v) const; // FIXME, does not exist in both Matrix and Quaternion options gtsam::Rot3 retract(Vector v) const; Vector localCoordinates(const gtsam::Rot3& p) const; From fd3b1d1cb5cd07b4a0e279b982367ddd99b114a2 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 02:19:26 +0000 Subject: [PATCH 223/914] comments --- gtsam_unstable/linear/iterative-inl.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtsam_unstable/linear/iterative-inl.h b/gtsam_unstable/linear/iterative-inl.h index 73b1e9497..ee43abc77 100644 --- a/gtsam_unstable/linear/iterative-inl.h +++ b/gtsam_unstable/linear/iterative-inl.h @@ -34,10 +34,10 @@ namespace gtsam { typedef IterativeOptimizationParameters Parameters; const Parameters ¶meters_; - int k; - bool steepest; - V g, d; - double gamma, threshold; + int k; ///< iteration + bool steepest; ///< flag to indicate we are doing steepest descent + V g, d; ///< gradient g and search direction d for CG + double gamma, threshold; ///< gamma (squared L2 norm of g) and convergence threshold E Ad; /* ************************************************************************* */ From 2414bfc3c9bbf209ebe19bd3c0876b1a7b105bf5 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 03:35:06 +0000 Subject: [PATCH 224/914] Use correct calibration matrix K in camera creation --- examples/matlab/VisualISAMExample.m | 4 ++-- examples/matlab/VisualSLAMExample.m | 4 ++-- examples/matlab/VisualSLAMExample_triangle.m | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index e16ffee6a..bbe67bd6b 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -24,10 +24,11 @@ nCameras = 10; height = 10; r = 30; poses = {}; +K = gtsamCal3_S2(500,500,0,640/2,480/2); for i=1:nCameras theta = (i-1)*2*pi/nCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - camera = gtsamSimpleCamera_lookat(t, gtsamPoint3(), gtsamPoint3([0,0,1]'), gtsamCal3_S2()) + camera = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) poses{i} = camera.pose(); end odometry = poses{1}.between(poses{2}); @@ -35,7 +36,6 @@ odometry = poses{1}.between(poses{2}); poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); -K = gtsamCal3_S2(50,50,0,50,50); %% Create an ISAM object for inference isam = visualSLAMISAM; diff --git a/examples/matlab/VisualSLAMExample.m b/examples/matlab/VisualSLAMExample.m index 99d1a39a7..54ccd2b14 100644 --- a/examples/matlab/VisualSLAMExample.m +++ b/examples/matlab/VisualSLAMExample.m @@ -32,10 +32,11 @@ nCameras = 6; height = 0; r = 30; poses = {}; +K = gtsamCal3_S2(500,500,0,640/2,480/2); for i=1:nCameras theta = (i-1)*2*pi/nCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - camera = gtsamSimpleCamera_lookat(t, gtsamPoint3(), gtsamPoint3([0,0,1]'), gtsamCal3_S2()) + camera = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) poses{i} = camera.pose(); end @@ -48,7 +49,6 @@ graph = visualSLAMGraph; %% Add factors for all measurements measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); -K = gtsamCal3_S2(500,500,0,640/2,480/2); for i=1:nCameras camera = gtsamSimpleCamera(K,poses{i}); for j=1:size(points,2) diff --git a/examples/matlab/VisualSLAMExample_triangle.m b/examples/matlab/VisualSLAMExample_triangle.m index 4fc1db320..dc9d8364c 100644 --- a/examples/matlab/VisualSLAMExample_triangle.m +++ b/examples/matlab/VisualSLAMExample_triangle.m @@ -23,10 +23,11 @@ nCameras = 6; height = 10; r = 30; poses = {}; +K = gtsamCal3_S2(500,500,0,640/2,480/2); for i=1:nCameras theta = (i-1)*2*pi/nCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - camera = gtsamSimpleCamera_lookat(t, gtsamPoint3(), gtsamPoint3([0,0,1]'), gtsamCal3_S2()) + camera = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) poses{i} = camera.pose(); end @@ -34,7 +35,6 @@ end graph = visualSLAMGraph; %% Add factors for all measurements -K = gtsamCal3_S2(500,500,0,640/2,480/2); measurementNoiseSigma=1; % in pixels measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); for i=1:nCameras From 903580abb4d07df3af6d362a4f07fb1f089567c8 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 03:54:48 +0000 Subject: [PATCH 225/914] Rotated display so Z is up, made axis square --- examples/matlab/VO_Example.m | 47 ++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/examples/matlab/VO_Example.m b/examples/matlab/VO_Example.m index e95893898..fa1512e00 100644 --- a/examples/matlab/VO_Example.m +++ b/examples/matlab/VO_Example.m @@ -23,55 +23,60 @@ initial = visualSLAMValues; %% load the initial poses from VO % row format: camera_id 4x4 pose (row, major) -c = dlmread('../Data/VO_camera_poses.txt'); - -for i=1:size(c,1) - pose = gtsamPose3(reshape(c(i,2:17),4,4)'); - initial.insertPose(symbol('x',c(i,1)),pose); +fprintf(1,'Reading data\n'); +cameras = dlmread('../Data/VO_camera_poses.txt'); +for i=1:size(cameras,1) + pose = gtsamPose3(reshape(cameras(i,2:17),4,4)'); + initial.insertPose(symbol('x',cameras(i,1)),pose); end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z -m = dlmread('../Data/VO_stereo_factors.txt'); +measurements = dlmread('../Data/VO_stereo_factors.txt'); -for i=1:size(m,1) - sf = m(i,:); +fprintf(1,'Creating Graph\n'); tic +for i=1:size(measurements,1) + sf = measurements(i,:); graph.addStereoMeasurement(gtsamStereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... - symbol('x', sf(1)), symbol('l', sf(2)), K); - + symbol('x', sf(1)), symbol('l', sf(2)), K); + if ~initial.exists(symbol('l',sf(2))) - % 3D landmarks are stored in camera coordinates: transform + % 3D landmarks are stored in camera coordinates: transform % to world coordinates using the respective initial pose pose = initial.pose(symbol('x', sf(1))); world_point = pose.transform_from(gtsamPoint3(sf(6),sf(7),sf(8))); initial.insertPoint(symbol('l',sf(2)), world_point); end end +toc %% add a constraint on the starting pose key = symbol('x',1); first_pose = initial.pose(key); -graph.addPoseConstraint(symbol('x',1), first_pose); +graph.addPoseConstraint(key, first_pose); %% optimize +fprintf(1,'Optimizing\n'); tic result = graph.optimize(initial); +toc %% visualize initial trajectory, final trajectory, and final points -figure(1); clf; +figure(1); clf; hold on; -% initial trajectory in red -plot3(initial.xs(),initial.ys(),initial.zs(), '-*r','LineWidth',2); -hold on; +% initial trajectory in red (rotated so Z is up) +plot3(initial.zs(),-initial.xs(),-initial.ys(), '-*r','LineWidth',2); -% final trajectory in green -plot3(result.xs(),result.ys(),result.zs(), '-*g','LineWidth',2); +% final trajectory in green (rotated so Z is up) +plot3(result.zs(),-result.xs(),-result.ys(), '-*g','LineWidth',2); xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); % switch to XZ view view([0 0]); -% optimized 3D points +% optimized 3D points (rotated so Z is up) points = result.points(); -plot3(points(:,1),points(:,2),points(:,3),'.'); +plot3(points(:,3),-points(:,1),-points(:,2),'.'); -axis([-30 30 -30 30 0 60]); +axis([0 100 -20 20 -5 20]); +axis equal +view(3) From c78e649042935e46bb3882cb03d2b30299f6201e Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 04:09:22 +0000 Subject: [PATCH 226/914] create and use cameras, not poses --- examples/matlab/VisualISAMExample.m | 20 ++++++++--------- examples/matlab/VisualSLAMExample.m | 23 ++++++++++---------- examples/matlab/VisualSLAMExample_triangle.m | 21 +++++++++--------- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index bbe67bd6b..c1c4aefeb 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -19,19 +19,18 @@ for j=1:nPoints points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); end -%% Create camera poses on a circle around the triangle +%% Create camera cameras on a circle around the triangle nCameras = 10; height = 10; r = 30; -poses = {}; +cameras = {}; K = gtsamCal3_S2(500,500,0,640/2,480/2); for i=1:nCameras theta = (i-1)*2*pi/nCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - camera = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) - poses{i} = camera.pose(); + cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); end -odometry = poses{1}.between(poses{2}); +odometry = cameras{1}.pose.between(cameras{2}.pose); poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); @@ -45,9 +44,9 @@ newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; for i=1:nCameras - % Prior for the first pose or odometry for subsequent poses + % Prior for the first pose or odometry for subsequent cameras if (i==1) - newFactors.addPosePrior(symbol('x',1), poses{1}, poseNoise); + newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, poseNoise); for j=1:nPoints newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); end @@ -57,22 +56,21 @@ for i=1:nCameras % Visual measurement factors for j=1:nPoints - camera = gtsamSimpleCamera(K,poses{i}); - zij = camera.project(points{j}); + zij = cameras{i}.project(points{j}); newFactors.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); end % Initial estimates for the new pose. Also initialize points while in % the first frame. if (i==1) - initialEstimates.insertPose(symbol('x',i), poses{i}); + initialEstimates.insertPose(symbol('x',i), cameras{i}.pose); for j=1:size(points,2) initialEstimates.insertPoint(symbol('l',j), points{j}); end else %TODO: this might be suboptimal since "result" is not the fully %optimized result - if (i==2), prevPose = poses{1}; + if (i==2), prevPose = cameras{1}.pose; else, prevPose = result.pose(symbol('x',i-1)); end initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); end diff --git a/examples/matlab/VisualSLAMExample.m b/examples/matlab/VisualSLAMExample.m index 54ccd2b14..f6ef2063b 100644 --- a/examples/matlab/VisualSLAMExample.m +++ b/examples/matlab/VisualSLAMExample.m @@ -27,17 +27,16 @@ points = {gtsamPoint3([10 10 10]'),... gtsamPoint3([-10 -10 -10]'),... gtsamPoint3([10 -10 -10]')}; -% Camera poses on a circle around the cube, pointing at the world origin +% Camera cameras on a circle around the cube, pointing at the world origin nCameras = 6; height = 0; r = 30; -poses = {}; +cameras = {}; K = gtsamCal3_S2(500,500,0,640/2,480/2); for i=1:nCameras theta = (i-1)*2*pi/nCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - camera = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) - poses{i} = camera.pose(); + cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); end measurementNoiseSigma = 1.0; @@ -50,26 +49,25 @@ graph = visualSLAMGraph; %% Add factors for all measurements measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); for i=1:nCameras - camera = gtsamSimpleCamera(K,poses{i}); for j=1:size(points,2) - zij = camera.project(points{j}); % you can add noise here if desired + zij = cameras{i}.project(points{j}); % you can add noise here if desired graph.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); end end %% Add Gaussian priors for a pose and a landmark to constrain the system posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); -graph.addPosePrior(symbol('x',1), poses{1}, posePriorNoise); +graph.addPosePrior(symbol('x',1), cameras{1}.pose, posePriorNoise); pointPriorNoise = gtsamSharedNoiseModel_Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('l',1), points{1}, pointPriorNoise); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); -%% Initialize to noisy poses and points +%% Initialize to noisy cameras and points initialEstimate = visualSLAMValues; -for i=1:size(poses,2) - initialEstimate.insertPose(symbol('x',i), poses{i}); +for i=1:size(cameras,2) + initialEstimate.insertPose(symbol('x',i), cameras{i}.pose); end for j=1:size(points,2) initialEstimate.insertPoint(symbol('l',j), points{j}); @@ -91,10 +89,11 @@ for j=1:size(points,2) covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); end -for i=1:size(poses,2) +for i=1:size(cameras,2) P = marginals.marginalCovariance(symbol('x',i)) pose_i = result.pose(symbol('x',i)) plotPose3(pose_i,P,10); end +axis([-35 35 -35 35 -15 15]); axis equal - +view(-37,40) diff --git a/examples/matlab/VisualSLAMExample_triangle.m b/examples/matlab/VisualSLAMExample_triangle.m index dc9d8364c..92d885a86 100644 --- a/examples/matlab/VisualSLAMExample_triangle.m +++ b/examples/matlab/VisualSLAMExample_triangle.m @@ -18,17 +18,16 @@ for j=1:3 points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); end -%% Create camera poses on a circle around the triangle +%% Create camera cameras on a circle around the triangle nCameras = 6; height = 10; r = 30; -poses = {}; +cameras = {}; K = gtsamCal3_S2(500,500,0,640/2,480/2); for i=1:nCameras theta = (i-1)*2*pi/nCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - camera = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) - poses{i} = camera.pose(); + cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) end %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) @@ -38,9 +37,8 @@ graph = visualSLAMGraph; measurementNoiseSigma=1; % in pixels measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); for i=1:nCameras - camera = gtsamSimpleCamera(K,poses{i}); for j=1:3 - zij = camera.project(points{j}); % you can add noise here if desired + zij = cameras{i}.project(points{j}); % you can add noise here if desired graph.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); end end @@ -54,10 +52,10 @@ end %% Print the graph graph.print(sprintf('\nFactor graph:\n')); -%% Initialize to noisy poses and points +%% Initialize to noisy cameras and points initialEstimate = visualSLAMValues; -for i=1:size(poses,2) - initialEstimate.insertPose(symbol('x',i), poses{i}); +for i=1:size(cameras,2) + initialEstimate.insertPose(symbol('x',i), cameras{i}.pose); end for j=1:size(points,2) initialEstimate.insertPoint(symbol('l',j), points{j}); @@ -79,10 +77,11 @@ for j=1:size(points,2) covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); end -for i=1:size(poses,2) +for i=1:size(cameras,2) P = marginals.marginalCovariance(symbol('x',i)) pose_i = result.pose(symbol('x',i)) plotPose3(pose_i,P,10); end +axis([-20 20 -20 20 -1 15]); axis equal - +view(-37,40) From 19542c27d590a9136e00f2e52f191abfb381b5c7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 7 Jun 2012 04:53:52 +0000 Subject: [PATCH 227/914] gtsam_unstable build script tweaks for windows --- gtsam_unstable/CMakeLists.txt | 2 +- gtsam_unstable/discrete/CMakeLists.txt | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 7637f6ea8..f5cbf9ac6 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -62,7 +62,7 @@ if (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) VERSION ${gtsam_unstable_version} SOVERSION ${gtsam_unstable_soversion}) target_link_libraries(gtsam_unstable-shared gtsam-shared) - install(TARGETS gtsam_unstable-shared LIBRARY DESTINATION lib ) + install(TARGETS gtsam_unstable-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) endif(GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) # Wrap version for gtsam_unstable diff --git a/gtsam_unstable/discrete/CMakeLists.txt b/gtsam_unstable/discrete/CMakeLists.txt index edec85416..ae84426a8 100644 --- a/gtsam_unstable/discrete/CMakeLists.txt +++ b/gtsam_unstable/discrete/CMakeLists.txt @@ -40,10 +40,12 @@ if (GTSAM_BUILD_EXAMPLES) set_target_properties(${example} PROPERTIES EXCLUDE_FROM_ALL ON) endif() - add_dependencies(examples ${example}) + if(NOT MSVC) + add_dependencies(examples ${example}) + add_custom_target(${example}.run ${EXECUTABLE_OUTPUT_PATH}${example} ${ARGN}) + endif() add_dependencies(${example} gtsam-static gtsam_unstable-static) target_link_libraries(${example} gtsam-static gtsam_unstable-static) - add_custom_target(${example}.run ${EXECUTABLE_OUTPUT_PATH}${example} ${ARGN}) endforeach(example) endif (GTSAM_BUILD_EXAMPLES) From ecd5862a903b903b7c1ca7c2a0daef28b6185203 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 7 Jun 2012 04:54:06 +0000 Subject: [PATCH 228/914] Fixed build problems on windows --- gtsam_unstable/discrete/CSP.cpp | 4 ++-- gtsam_unstable/discrete/tests/testSudoku.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gtsam_unstable/discrete/CSP.cpp b/gtsam_unstable/discrete/CSP.cpp index 10c27d2bb..bfbdf28cf 100644 --- a/gtsam_unstable/discrete/CSP.cpp +++ b/gtsam_unstable/discrete/CSP.cpp @@ -60,8 +60,8 @@ namespace gtsam { // TODO: Sudoku specific hack if (print) { if (cardinality == 9 && n == 81) { - for (size_t i = 0, v = 0; i < sqrt(n); i++) { - for (size_t j = 0; j < sqrt(n); j++, v++) { + for (size_t i = 0, v = 0; i < (size_t)sqrt(double(n)); i++) { + for (size_t j = 0; j < (size_t)sqrt(double(n)); j++, v++) { if (changed[v]) cout << "*"; domains[v].print(); cout << "\t"; diff --git a/gtsam_unstable/discrete/tests/testSudoku.cpp b/gtsam_unstable/discrete/tests/testSudoku.cpp index 583364ade..a32ca2645 100644 --- a/gtsam_unstable/discrete/tests/testSudoku.cpp +++ b/gtsam_unstable/discrete/tests/testSudoku.cpp @@ -75,7 +75,7 @@ public: } // add box constraints - size_t N = sqrt(n), i0 = 0; + size_t N = (size_t)sqrt(double(n)), i0 = 0; for (size_t I = 0; I < N; I++) { size_t j0 = 0; for (size_t J = 0; J < N; J++) { From 8e39e6b6561b4279d4ac43b52c0f891a66df90dc Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 7 Jun 2012 04:54:40 +0000 Subject: [PATCH 229/914] Fixed doxygen warnings --- gtsam/base/FastList.h | 2 +- gtsam/base/FastMap.h | 2 +- gtsam/base/FastSet.h | 2 +- gtsam/base/FastVector.h | 2 +- gtsam/base/Testable.h | 2 +- gtsam/base/blockMatrices.h | 4 ++-- gtsam/base/types.h | 2 +- gtsam/geometry/Cal3Bundler.h | 2 +- gtsam/geometry/Cal3DS2.h | 2 +- gtsam/geometry/Cal3_S2.h | 4 ++-- gtsam/geometry/Cal3_S2Stereo.h | 2 +- gtsam/geometry/CalibratedCamera.h | 2 +- gtsam/geometry/PinholeCamera.h | 2 +- gtsam/geometry/Point2.h | 2 +- gtsam/geometry/Point3.h | 2 +- gtsam/geometry/Pose2.h | 2 +- gtsam/geometry/Pose3.h | 2 +- gtsam/geometry/Rot2.h | 2 +- gtsam/geometry/Rot3.h | 2 +- gtsam/geometry/StereoCamera.h | 2 +- gtsam/geometry/StereoPoint2.h | 2 +- gtsam/geometry/Tensor1.h | 2 +- gtsam/geometry/Tensor1Expression.h | 2 +- gtsam/geometry/Tensor2.h | 2 +- gtsam/geometry/Tensor2Expression.h | 2 +- gtsam/geometry/Tensor3.h | 2 +- gtsam/geometry/Tensor3Expression.h | 2 +- gtsam/geometry/Tensor4.h | 2 +- gtsam/geometry/Tensor5.h | 2 +- gtsam/geometry/Tensor5Expression.h | 2 +- gtsam/geometry/projectiveGeometry.h | 20 +++++++++---------- gtsam/geometry/tensors.h | 2 +- gtsam/inference/BayesTree-inl.h | 10 ++++------ gtsam/inference/BayesTree.h | 2 +- .../inference/GenericMultifrontalSolver-inl.h | 5 ++--- gtsam/inference/GenericSequentialSolver-inl.h | 2 +- gtsam/inference/JunctionTree-inl.h | 2 +- gtsam/inference/JunctionTree.h | 2 +- gtsam/linear/GaussianBayesTree.cpp | 12 +++++------ gtsam/linear/GaussianBayesTree.h | 7 ++++--- gtsam/linear/GaussianFactorGraph.h | 10 +++++----- gtsam/linear/GaussianJunctionTree.h | 2 +- gtsam/nonlinear/ISAM2.h | 14 +++++-------- gtsam/slam/planarSLAM.h | 8 ++------ gtsam/slam/pose2SLAM.h | 4 ++-- gtsam/slam/pose3SLAM.h | 4 ++-- gtsam_unstable/base/BTree.h | 2 +- gtsam_unstable/base/DSF.h | 2 +- gtsam_unstable/base/DSFVector.h | 2 +- 49 files changed, 83 insertions(+), 93 deletions(-) diff --git a/gtsam/base/FastList.h b/gtsam/base/FastList.h index 60452357f..1b84adfed 100644 --- a/gtsam/base/FastList.h +++ b/gtsam/base/FastList.h @@ -31,7 +31,7 @@ namespace gtsam { * convenience to avoid having lengthy types in the code. Through timing, * we've seen that the fast_pool_allocator can lead to speedups of several * percent. - * @ingroup base + * @addtogroup base */ template class FastList: public std::list > { diff --git a/gtsam/base/FastMap.h b/gtsam/base/FastMap.h index c9fe30646..ab448de07 100644 --- a/gtsam/base/FastMap.h +++ b/gtsam/base/FastMap.h @@ -31,7 +31,7 @@ namespace gtsam { * convenience to avoid having lengthy types in the code. Through timing, * we've seen that the fast_pool_allocator can lead to speedups of several * percent. - * @ingroup base + * @addtogroup base */ template class FastMap : public std::map, boost::fast_pool_allocator > > { diff --git a/gtsam/base/FastSet.h b/gtsam/base/FastSet.h index 6abd7efb8..4c6e31d4e 100644 --- a/gtsam/base/FastSet.h +++ b/gtsam/base/FastSet.h @@ -42,7 +42,7 @@ struct FastSetTestableHelper; * fast_pool_allocator instead of the default STL allocator. This is just a * convenience to avoid having lengthy types in the code. Through timing, * we've seen that the fast_pool_allocator can lead to speedups of several %. - * @ingroup base + * @addtogroup base */ template class FastSet: public std::set, boost::fast_pool_allocator > { diff --git a/gtsam/base/FastVector.h b/gtsam/base/FastVector.h index 18af63006..ee7258ba8 100644 --- a/gtsam/base/FastVector.h +++ b/gtsam/base/FastVector.h @@ -30,7 +30,7 @@ namespace gtsam { * pool_allocator instead of the default STL allocator. This is just a * convenience to avoid having lengthy types in the code. Through timing, * we've seen that the pool_allocator can lead to speedups of several % - * @ingroup base + * @addtogroup base */ template class FastVector: public std::vector > { diff --git a/gtsam/base/Testable.h b/gtsam/base/Testable.h index bcc6c8957..009d286db 100644 --- a/gtsam/base/Testable.h +++ b/gtsam/base/Testable.h @@ -46,7 +46,7 @@ namespace gtsam { * tests and in generic algorithms. * * See macros for details on using this structure - * @ingroup base + * @addtogroup base * @tparam T is the type this constrains to be testable - assumes print() and equals() */ template diff --git a/gtsam/base/blockMatrices.h b/gtsam/base/blockMatrices.h index a1baecd76..c0bc95a50 100644 --- a/gtsam/base/blockMatrices.h +++ b/gtsam/base/blockMatrices.h @@ -40,7 +40,7 @@ template class SymmetricBlockView; * all rows, rowEnd() should be set to the number of rows in the matrix (i.e. * one after the last true row index). * - * @ingroup base + * @addtogroup base */ template class VerticalBlockView { @@ -330,7 +330,7 @@ private: * change the apparent matrix view. firstBlock() determines the block that * appears to have index 0 for all operations (except re-setting firstBlock()). * - * @ingroup base + * @addtogroup base */ template class SymmetricBlockView { diff --git a/gtsam/base/types.h b/gtsam/base/types.h index 2490a0cde..7973e3d34 100644 --- a/gtsam/base/types.h +++ b/gtsam/base/types.h @@ -14,7 +14,7 @@ * @brief Typedefs for easier changing of types * @author Richard Roberts * @date Aug 21, 2010 - * @defgroup base + * @addtogroup base */ #pragma once diff --git a/gtsam/geometry/Cal3Bundler.h b/gtsam/geometry/Cal3Bundler.h index 259a07c9b..7825e677e 100644 --- a/gtsam/geometry/Cal3Bundler.h +++ b/gtsam/geometry/Cal3Bundler.h @@ -25,7 +25,7 @@ namespace gtsam { /** * @brief Calibration used by Bundler - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Cal3Bundler : public DerivedValue { diff --git a/gtsam/geometry/Cal3DS2.h b/gtsam/geometry/Cal3DS2.h index 9b94eccb5..fc6bce9db 100644 --- a/gtsam/geometry/Cal3DS2.h +++ b/gtsam/geometry/Cal3DS2.h @@ -25,7 +25,7 @@ namespace gtsam { /** * @brief Calibration of a camera with radial distortion - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Cal3DS2 : public DerivedValue { diff --git a/gtsam/geometry/Cal3_S2.h b/gtsam/geometry/Cal3_S2.h index 021b1e366..12838b667 100644 --- a/gtsam/geometry/Cal3_S2.h +++ b/gtsam/geometry/Cal3_S2.h @@ -16,7 +16,7 @@ */ /** - * @defgroup geometry + * @addtogroup geometry */ #pragma once @@ -28,7 +28,7 @@ namespace gtsam { /** * @brief The most common 5DOF 3D->2D calibration - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Cal3_S2 : public DerivedValue { diff --git a/gtsam/geometry/Cal3_S2Stereo.h b/gtsam/geometry/Cal3_S2Stereo.h index 8282800c1..f32b2a922 100644 --- a/gtsam/geometry/Cal3_S2Stereo.h +++ b/gtsam/geometry/Cal3_S2Stereo.h @@ -23,7 +23,7 @@ namespace gtsam { /** * @brief The most common 5DOF 3D->2D calibration, stereo version - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Cal3_S2Stereo { diff --git a/gtsam/geometry/CalibratedCamera.h b/gtsam/geometry/CalibratedCamera.h index 04296eba1..c767a7e15 100644 --- a/gtsam/geometry/CalibratedCamera.h +++ b/gtsam/geometry/CalibratedCamera.h @@ -33,7 +33,7 @@ namespace gtsam { * A Calibrated camera class [R|-R't], calibration K=I. * If calibration is known, it is more computationally efficient * to calibrate the measurements rather than try to predict in pixels. - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class CalibratedCamera : public DerivedValue { diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index acc27ae1c..f3b14f3c4 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -33,7 +33,7 @@ namespace gtsam { /** * A pinhole camera class that has a Pose3 and a Calibration. - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ template diff --git a/gtsam/geometry/Point2.h b/gtsam/geometry/Point2.h index fe7792733..a99da460b 100644 --- a/gtsam/geometry/Point2.h +++ b/gtsam/geometry/Point2.h @@ -29,7 +29,7 @@ namespace gtsam { * A 2D point * Complies with the Testable Concept * Functional, so no set functions: once created, a point is constant. - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Point2 : public DerivedValue { diff --git a/gtsam/geometry/Point3.h b/gtsam/geometry/Point3.h index 7f7845dfb..4d15b65f5 100644 --- a/gtsam/geometry/Point3.h +++ b/gtsam/geometry/Point3.h @@ -32,7 +32,7 @@ namespace gtsam { /** * A 3D point - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Point3 : public DerivedValue { diff --git a/gtsam/geometry/Pose2.h b/gtsam/geometry/Pose2.h index 55fe0a9d4..d15ba045c 100644 --- a/gtsam/geometry/Pose2.h +++ b/gtsam/geometry/Pose2.h @@ -30,7 +30,7 @@ namespace gtsam { /** * A 2D pose (Point2,Rot2) - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Pose2 : public DerivedValue { diff --git a/gtsam/geometry/Pose3.h b/gtsam/geometry/Pose3.h index 9cfe7ba37..4d32a5608 100644 --- a/gtsam/geometry/Pose3.h +++ b/gtsam/geometry/Pose3.h @@ -32,7 +32,7 @@ namespace gtsam { /** * A 3D pose (R,t) : (Rot3,Point3) - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Pose3 : public DerivedValue { diff --git a/gtsam/geometry/Rot2.h b/gtsam/geometry/Rot2.h index 8e33794e4..9528934a0 100644 --- a/gtsam/geometry/Rot2.h +++ b/gtsam/geometry/Rot2.h @@ -28,7 +28,7 @@ namespace gtsam { /** * Rotation matrix * NOTE: the angle theta is in radians unless explicitly stated - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Rot2 : public DerivedValue { diff --git a/gtsam/geometry/Rot3.h b/gtsam/geometry/Rot3.h index 93e276de7..0c6b31a81 100644 --- a/gtsam/geometry/Rot3.h +++ b/gtsam/geometry/Rot3.h @@ -48,7 +48,7 @@ namespace gtsam { * @brief A 3D rotation represented as a rotation matrix if the preprocessor * symbol GTSAM_DEFAULT_QUATERNIONS is not defined, or as a quaternion if it * is defined. - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class Rot3 : public DerivedValue { diff --git a/gtsam/geometry/StereoCamera.h b/gtsam/geometry/StereoCamera.h index 4c278fab9..aa22c18c6 100644 --- a/gtsam/geometry/StereoCamera.h +++ b/gtsam/geometry/StereoCamera.h @@ -28,7 +28,7 @@ namespace gtsam { /** * A stereo camera class, parameterize by left camera pose and stereo calibration - * @ingroup geometry + * @addtogroup geometry */ class StereoCamera { diff --git a/gtsam/geometry/StereoPoint2.h b/gtsam/geometry/StereoPoint2.h index 022296c21..6bfdefe26 100644 --- a/gtsam/geometry/StereoPoint2.h +++ b/gtsam/geometry/StereoPoint2.h @@ -25,7 +25,7 @@ namespace gtsam { /** * A 2D stereo point, v will be same for rectified images - * @ingroup geometry + * @addtogroup geometry * \nosubgrouping */ class StereoPoint2 : public DerivedValue { diff --git a/gtsam/geometry/Tensor1.h b/gtsam/geometry/Tensor1.h index 685166b53..e7dc6bfb3 100644 --- a/gtsam/geometry/Tensor1.h +++ b/gtsam/geometry/Tensor1.h @@ -23,7 +23,7 @@ namespace tensors { /** * A rank 1 tensor. Actually stores data. - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template diff --git a/gtsam/geometry/Tensor1Expression.h b/gtsam/geometry/Tensor1Expression.h index 4e43fff58..37b5809c8 100644 --- a/gtsam/geometry/Tensor1Expression.h +++ b/gtsam/geometry/Tensor1Expression.h @@ -29,7 +29,7 @@ namespace tensors { * Templated class to provide a rank 1 tensor interface to a class. * This class does not store any data but the result of an expression. * It is associated with an index. - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template class Tensor1Expression { diff --git a/gtsam/geometry/Tensor2.h b/gtsam/geometry/Tensor2.h index 12fd1509f..825b57b3e 100644 --- a/gtsam/geometry/Tensor2.h +++ b/gtsam/geometry/Tensor2.h @@ -23,7 +23,7 @@ namespace tensors { /** * Rank 2 Tensor - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template diff --git a/gtsam/geometry/Tensor2Expression.h b/gtsam/geometry/Tensor2Expression.h index 6c953a5aa..f9e56054f 100644 --- a/gtsam/geometry/Tensor2Expression.h +++ b/gtsam/geometry/Tensor2Expression.h @@ -26,7 +26,7 @@ namespace tensors { /** * Templated class to hold a rank 2 tensor expression. - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template class Tensor2Expression { diff --git a/gtsam/geometry/Tensor3.h b/gtsam/geometry/Tensor3.h index 78cdcb9f2..cfd96f7f6 100644 --- a/gtsam/geometry/Tensor3.h +++ b/gtsam/geometry/Tensor3.h @@ -23,7 +23,7 @@ namespace tensors { /** * Rank 3 Tensor - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template diff --git a/gtsam/geometry/Tensor3Expression.h b/gtsam/geometry/Tensor3Expression.h index 0356caa6f..b7474bdfb 100644 --- a/gtsam/geometry/Tensor3Expression.h +++ b/gtsam/geometry/Tensor3Expression.h @@ -25,7 +25,7 @@ namespace tensors { /** * templated class to interface to an object A as a rank 3 tensor - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template class Tensor3Expression { diff --git a/gtsam/geometry/Tensor4.h b/gtsam/geometry/Tensor4.h index 26a52750c..e8bfb0186 100644 --- a/gtsam/geometry/Tensor4.h +++ b/gtsam/geometry/Tensor4.h @@ -23,7 +23,7 @@ namespace tensors { /** * Rank 4 Tensor - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template diff --git a/gtsam/geometry/Tensor5.h b/gtsam/geometry/Tensor5.h index e12f7d2fb..a19784d84 100644 --- a/gtsam/geometry/Tensor5.h +++ b/gtsam/geometry/Tensor5.h @@ -23,7 +23,7 @@ namespace tensors { /** * Rank 5 Tensor - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template diff --git a/gtsam/geometry/Tensor5Expression.h b/gtsam/geometry/Tensor5Expression.h index e9f0e852a..6a6018e22 100644 --- a/gtsam/geometry/Tensor5Expression.h +++ b/gtsam/geometry/Tensor5Expression.h @@ -25,7 +25,7 @@ namespace tensors { /** * templated class to interface to an object A as a rank 5 tensor - * @ingroup tensors + * @addtogroup tensors * \nosubgrouping */ template class Tensor5Expression { diff --git a/gtsam/geometry/projectiveGeometry.h b/gtsam/geometry/projectiveGeometry.h index cfad515ac..2be02a349 100644 --- a/gtsam/geometry/projectiveGeometry.h +++ b/gtsam/geometry/projectiveGeometry.h @@ -25,21 +25,21 @@ namespace gtsam { /** * 2D Point in homogeneous coordinates - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor1<3> Point2h; Point2h point2h(double x, double y, double w); ///< create Point2h /** * 2D Line in homogeneous coordinates - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor1<3> Line2h; Line2h line2h(double a, double b, double c); ///< create Line2h /** * 2D (homegeneous) Point correspondence - * @ingroup geometry + * @addtogroup geometry */ struct Correspondence { Point2h first; ///< First point @@ -63,19 +63,19 @@ namespace gtsam { /** * 2D-2D Homography - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor2<3, 3> Homography2; /** * Fundamental Matrix - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor2<3, 3> FundamentalMatrix; /** * Triplet of (homogeneous) 2D points - * @ingroup geometry + * @addtogroup geometry */ struct Triplet { Point2h first; ///< First point @@ -97,27 +97,27 @@ namespace gtsam { /** * Trifocal Tensor - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor3<3, 3, 3> TrifocalTensor; /** * 3D Point in homogeneous coordinates - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor1<4> Point3h; Point3h point3h(double X, double Y, double Z, double W); ///< create Point3h /** * 3D Plane in homogeneous coordinates - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor1<4> Plane3h; Plane3h plane3h(double a, double b, double c, double d); ///< create Plane3h /** * 3D to 2D projective camera - * @ingroup geometry + * @addtogroup geometry */ typedef tensors::Tensor2<3, 4> ProjectiveCamera; diff --git a/gtsam/geometry/tensors.h b/gtsam/geometry/tensors.h index 1441a7823..a7125775a 100644 --- a/gtsam/geometry/tensors.h +++ b/gtsam/geometry/tensors.h @@ -14,7 +14,7 @@ * @brief Tensor expression templates based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf * @date Feb 10, 2010 * @author Frank Dellaert - * @defgroup tensors + * @addtogroup tensors */ #pragma once diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 2c3ce4035..9a6b1478e 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -51,9 +51,9 @@ namespace gtsam { return data; } + /* ************************************************************************* */ template - void BayesTree::getCliqueData(CliqueData& data, - typename BayesTree::sharedClique clique) const { + void BayesTree::getCliqueData(CliqueData& data, sharedClique clique) const { data.conditionalSizes.push_back((*clique)->nrFrontals()); data.separatorSizes.push_back((*clique)->nrParents()); BOOST_FOREACH(sharedClique c, clique->children_) { @@ -64,7 +64,7 @@ namespace gtsam { /* ************************************************************************* */ template void BayesTree::saveGraph(const std::string &s) const { - if (!root_.get()) throw invalid_argument("the root of bayes tree has not been initialized!"); + if (!root_.get()) throw invalid_argument("the root of Bayes tree has not been initialized!"); ofstream of(s.c_str()); of<< "digraph G{\n"; saveGraph(of, root_); @@ -73,9 +73,7 @@ namespace gtsam { } template - void BayesTree::saveGraph(ostream &s, - typename BayesTree::sharedClique clique, - int parentnum) const { + void BayesTree::saveGraph(ostream &s, sharedClique clique, int parentnum) const { static int num = 0; bool first = true; std::stringstream out; diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index a4cdbaafe..de9a84640 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -46,7 +46,7 @@ namespace gtsam { * @tparam CLIQUE The type of the clique data structure, defaults to BayesTreeClique, normally do not change this * as it is only used when developing special versions of BayesTree, e.g. for ISAM2. * - * \ingroup Multifrontal + * \addtogroup Multifrontal * \nosubgrouping */ template > diff --git a/gtsam/inference/GenericMultifrontalSolver-inl.h b/gtsam/inference/GenericMultifrontalSolver-inl.h index b24db8484..84ca937fa 100644 --- a/gtsam/inference/GenericMultifrontalSolver-inl.h +++ b/gtsam/inference/GenericMultifrontalSolver-inl.h @@ -36,15 +36,14 @@ namespace gtsam { /* ************************************************************************* */ template GenericMultifrontalSolver::GenericMultifrontalSolver( - const typename FactorGraph::shared_ptr& graph, + const sharedGraph& graph, const VariableIndex::shared_ptr& variableIndex) : structure_(variableIndex), junctionTree_(new JT(*graph, *structure_)) { } /* ************************************************************************* */ template - void GenericMultifrontalSolver::replaceFactors( - const typename FactorGraph::shared_ptr& graph) { + void GenericMultifrontalSolver::replaceFactors(const sharedGraph& graph) { junctionTree_.reset(new JT(*graph, *structure_)); } diff --git a/gtsam/inference/GenericSequentialSolver-inl.h b/gtsam/inference/GenericSequentialSolver-inl.h index b2629566b..5b3e0dd28 100644 --- a/gtsam/inference/GenericSequentialSolver-inl.h +++ b/gtsam/inference/GenericSequentialSolver-inl.h @@ -41,7 +41,7 @@ namespace gtsam { template GenericSequentialSolver::GenericSequentialSolver( const sharedFactorGraph& factorGraph, - const VariableIndex::shared_ptr& variableIndex) : + const boost::shared_ptr& variableIndex) : factors_(factorGraph), structure_(variableIndex), eliminationTree_(EliminationTree::Create(*factors_, *structure_)) { } diff --git a/gtsam/inference/JunctionTree-inl.h b/gtsam/inference/JunctionTree-inl.h index ad8b389ab..bf1c17890 100644 --- a/gtsam/inference/JunctionTree-inl.h +++ b/gtsam/inference/JunctionTree-inl.h @@ -72,7 +72,7 @@ namespace gtsam { /* ************************************************************************* */ template typename JunctionTree::sharedClique JunctionTree::distributeFactors( - const FG& fg, const typename SymbolicBayesTree::sharedClique& bayesClique) { + const FG& fg, const SymbolicBayesTree::sharedClique& bayesClique) { // Build "target" index. This is an index for each variable of the factors // that involve this variable as their *lowest-ordered* variable. For each diff --git a/gtsam/inference/JunctionTree.h b/gtsam/inference/JunctionTree.h index 33a9aa5e4..e8aceafe9 100644 --- a/gtsam/inference/JunctionTree.h +++ b/gtsam/inference/JunctionTree.h @@ -47,7 +47,7 @@ namespace gtsam { * except that in the JunctionTree, at each node multiple variables are eliminated at a time. * * - * \ingroup Multifrontal + * \addtogroup Multifrontal * \nosubgrouping */ template::Clique> diff --git a/gtsam/linear/GaussianBayesTree.cpp b/gtsam/linear/GaussianBayesTree.cpp index 4a0e4b355..f9ea3fdc8 100644 --- a/gtsam/linear/GaussianBayesTree.cpp +++ b/gtsam/linear/GaussianBayesTree.cpp @@ -35,27 +35,27 @@ void optimizeInPlace(const GaussianBayesTree& bayesTree, VectorValues& result) { } /* ************************************************************************* */ -VectorValues optimizeGradientSearch(const GaussianBayesTree& Rd) { +VectorValues optimizeGradientSearch(const GaussianBayesTree& bayesTree) { tic(0, "Allocate VectorValues"); - VectorValues grad = *allocateVectorValues(Rd); + VectorValues grad = *allocateVectorValues(bayesTree); toc(0, "Allocate VectorValues"); - optimizeGradientSearchInPlace(Rd, grad); + optimizeGradientSearchInPlace(bayesTree, grad); return grad; } /* ************************************************************************* */ -void optimizeGradientSearchInPlace(const GaussianBayesTree& Rd, VectorValues& grad) { +void optimizeGradientSearchInPlace(const GaussianBayesTree& bayesTree, VectorValues& grad) { tic(1, "Compute Gradient"); // Compute gradient (call gradientAtZero function, which is defined for various linear systems) - gradientAtZero(Rd, grad); + gradientAtZero(bayesTree, grad); double gradientSqNorm = grad.dot(grad); toc(1, "Compute Gradient"); tic(2, "Compute R*g"); // Compute R * g - FactorGraph Rd_jfg(Rd); + FactorGraph Rd_jfg(bayesTree); Errors Rg = Rd_jfg * grad; toc(2, "Compute R*g"); diff --git a/gtsam/linear/GaussianBayesTree.h b/gtsam/linear/GaussianBayesTree.h index 8b581351c..91480d43a 100644 --- a/gtsam/linear/GaussianBayesTree.h +++ b/gtsam/linear/GaussianBayesTree.h @@ -25,13 +25,14 @@ namespace gtsam { +/// A Bayes Tree representing a Gaussian density typedef BayesTree GaussianBayesTree; /// optimize the BayesTree, starting from the root VectorValues optimize(const GaussianBayesTree& bayesTree); /// recursively optimize this conditional and all subtrees -void optimizeInPlace(const GaussianBayesTree& clique, VectorValues& result); +void optimizeInPlace(const GaussianBayesTree& bayesTree, VectorValues& result); namespace internal { template @@ -63,10 +64,10 @@ void optimizeInPlace(const typename BAYESTREE::sharedClique& clique, VectorValue * * \f[ \delta x = \hat\alpha g = \frac{-g^T g}{(R g)^T(R g)} \f] */ -VectorValues optimizeGradientSearch(const GaussianBayesTree& bn); +VectorValues optimizeGradientSearch(const GaussianBayesTree& bayesTree); /** In-place version of optimizeGradientSearch requiring pre-allocated VectorValues \c x */ -void optimizeGradientSearchInPlace(const GaussianBayesTree& bn, VectorValues& grad); +void optimizeGradientSearchInPlace(const GaussianBayesTree& bayesTree, VectorValues& grad); /** * Compute the gradient of the energy function, diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 1f66b5b4c..8a5fe47e7 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -202,7 +202,7 @@ namespace gtsam { /** * Combine and eliminate several factors. - * \ingroup LinearSolving + * \addtogroup LinearSolving */ JacobianFactor::shared_ptr CombineJacobians( const FactorGraph& factors, @@ -223,7 +223,7 @@ namespace gtsam { * @param nrFrontals Number of frontal variables to eliminate. * @return The conditional and remaining factor - * \ingroup LinearSolving + * \addtogroup LinearSolving */ GaussianFactorGraph::EliminationResult EliminateJacobians(const FactorGraph< JacobianFactor>& factors, size_t nrFrontals = 1); @@ -238,7 +238,7 @@ namespace gtsam { * @param nrFrontals Number of frontal variables to eliminate. * @return The conditional and remaining factor - * \ingroup LinearSolving + * \addtogroup LinearSolving */ GaussianFactorGraph::EliminationResult EliminateQR(const FactorGraph< GaussianFactor>& factors, size_t nrFrontals = 1); @@ -260,7 +260,7 @@ namespace gtsam { * @param nrFrontals Number of frontal variables to eliminate. * @return The conditional and remaining factor - * \ingroup LinearSolving + * \addtogroup LinearSolving */ GaussianFactorGraph::EliminationResult EliminatePreferCholesky(const FactorGraph< GaussianFactor>& factors, size_t nrFrontals = 1); @@ -281,7 +281,7 @@ namespace gtsam { * @param nrFrontals Number of frontal variables to eliminate. * @return The conditional and remaining factor - * \ingroup LinearSolving + * \addtogroup LinearSolving */ GaussianFactorGraph::EliminationResult EliminateCholesky(const FactorGraph< GaussianFactor>& factors, size_t nrFrontals = 1); diff --git a/gtsam/linear/GaussianJunctionTree.h b/gtsam/linear/GaussianJunctionTree.h index 3d4227b93..b97998a12 100644 --- a/gtsam/linear/GaussianJunctionTree.h +++ b/gtsam/linear/GaussianJunctionTree.h @@ -35,7 +35,7 @@ namespace gtsam { * create a BayesTree. In both cases, you need to provide a basic * GaussianFactorGraph::Eliminate function that will be used to * - * \ingroup Multifrontal + * \addtogroup Multifrontal */ class GaussianJunctionTree: public JunctionTree { diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 0d5724865..2211122d8 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -28,11 +28,7 @@ namespace gtsam { /** - * @defgroup ISAM2 - */ - -/** - * @ingroup ISAM2 + * @addtogroup ISAM2 * Parameters for ISAM2 using Gauss-Newton optimization. Either this class or * ISAM2DoglegParams should be specified as the optimizationParams in * ISAM2Params, which should in turn be passed to ISAM2(const ISAM2Params&). @@ -47,7 +43,7 @@ struct ISAM2GaussNewtonParams { }; /** - * @ingroup ISAM2 + * @addtogroup ISAM2 * Parameters for ISAM2 using Dogleg optimization. Either this class or * ISAM2GaussNewtonParams should be specified as the optimizationParams in * ISAM2Params, which should in turn be passed to ISAM2(const ISAM2Params&). @@ -69,7 +65,7 @@ struct ISAM2DoglegParams { }; /** - * @ingroup ISAM2 + * @addtogroup ISAM2 * Parameters for the ISAM2 algorithm. Default parameter values are listed below. */ struct ISAM2Params { @@ -147,7 +143,7 @@ struct ISAM2Params { }; /** - * @ingroup ISAM2 + * @addtogroup ISAM2 * This struct is returned from ISAM2::update() and contains information about * the update that is useful for determining whether the solution is * converging, and about how much work was required for the update. See member @@ -315,7 +311,7 @@ private: }; /** - * @ingroup ISAM2 + * @addtogroup ISAM2 * Implementation of the full ISAM2 algorithm for incremental nonlinear optimization. * * The typical cycle of using this class to create an instance by providing ISAM2Params diff --git a/gtsam/slam/planarSLAM.h b/gtsam/slam/planarSLAM.h index 01a9df763..aecd22b75 100644 --- a/gtsam/slam/planarSLAM.h +++ b/gtsam/slam/planarSLAM.h @@ -27,10 +27,6 @@ #include #include -/** - * @defgroup SLAM - */ - // Use planarSLAM namespace for specific SLAM instance namespace planarSLAM { @@ -55,7 +51,7 @@ namespace planarSLAM { /* * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - * @ingroup SLAM + * @addtogroup SLAM */ struct Values: public gtsam::Values { @@ -88,7 +84,7 @@ namespace planarSLAM { /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper - * @ingroup SLAM + * @addtogroup SLAM */ struct Graph: public NonlinearFactorGraph { diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 778d844f2..062893a9c 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -32,7 +32,7 @@ namespace pose2SLAM { /* * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - * @ingroup SLAM + * @addtogroup SLAM */ struct Values: public gtsam::Values { @@ -82,7 +82,7 @@ namespace pose2SLAM { /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper - * @ingroup SLAM + * @addtogroup SLAM */ struct Graph: public NonlinearFactorGraph { diff --git a/gtsam/slam/pose3SLAM.h b/gtsam/slam/pose3SLAM.h index 9be699fd8..41d301e08 100644 --- a/gtsam/slam/pose3SLAM.h +++ b/gtsam/slam/pose3SLAM.h @@ -32,7 +32,7 @@ namespace pose3SLAM { /* * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - * @ingroup SLAM + * @addtogroup SLAM */ struct Values: public gtsam::Values { @@ -77,7 +77,7 @@ namespace pose3SLAM { /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper - * @ingroup SLAM + * @addtogroup SLAM */ struct Graph: public NonlinearFactorGraph { diff --git a/gtsam_unstable/base/BTree.h b/gtsam_unstable/base/BTree.h index 2a40465a3..379725a7a 100644 --- a/gtsam_unstable/base/BTree.h +++ b/gtsam_unstable/base/BTree.h @@ -26,7 +26,7 @@ namespace gtsam { /** * @brief Binary tree - * @ingroup base + * @addtogroup base */ template class BTree { diff --git a/gtsam_unstable/base/DSF.h b/gtsam_unstable/base/DSF.h index 5276779b0..0c7cc7399 100644 --- a/gtsam_unstable/base/DSF.h +++ b/gtsam_unstable/base/DSF.h @@ -34,7 +34,7 @@ namespace gtsam { * S = {S_1,S_2,...} of disjoint dynamic sets. Each set is identified by * a representative, which is some member of the set. * - * @ingroup base + * @addtogroup base */ template class DSF : protected BTree { diff --git a/gtsam_unstable/base/DSFVector.h b/gtsam_unstable/base/DSFVector.h index 17e897032..3940723c4 100644 --- a/gtsam_unstable/base/DSFVector.h +++ b/gtsam_unstable/base/DSFVector.h @@ -27,7 +27,7 @@ namespace gtsam { /** * A fast implementation of disjoint set forests that uses vector as underly data structure. - * @ingroup base + * @addtogroup base */ class DSFVector { From 9ef891198b99aabd7a11ab7fffd9595a84629e32 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 05:19:43 +0000 Subject: [PATCH 230/914] Re-factored iSAM MATLAB example and wrapped more ISAM functions --- examples/matlab/VisualISAMExample.m | 156 +++++++++++++++------------- gtsam.h | 19 +++- 2 files changed, 102 insertions(+), 73 deletions(-) diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index c1c4aefeb..7eacbf04a 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -1,27 +1,41 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% GTSAM Copyright 2010, Georgia Tech Research Corporation, +% 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 % % @brief A simple visual SLAM example for structure from motion % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create a triangle target, just 3 points on a plane -nPoints = 3; -r = 10; -points = {}; -for j=1:nPoints - theta = (j-1)*2*pi/nPoints; - points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); +if 0 + %% Create a triangle target, just 3 points on a plane + nPoints = 3; + r = 10; + points = {}; + for j=1:nPoints + theta = (j-1)*2*pi/nPoints; + points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); + end +else + %% Generate simulated data + % 3D landmarks as vertices of a cube + nPoints = 8; + points = {gtsamPoint3([10 10 10]'),... + gtsamPoint3([-10 10 10]'),... + gtsamPoint3([-10 -10 10]'),... + gtsamPoint3([10 -10 10]'),... + gtsamPoint3([10 10 -10]'),... + gtsamPoint3([-10 10 -10]'),... + gtsamPoint3([-10 -10 -10]'),... + gtsamPoint3([10 -10 -10]')}; end %% Create camera cameras on a circle around the triangle nCameras = 10; -height = 10; +height = 0; r = 30; cameras = {}; K = gtsamCal3_S2(500,500,0,640/2,480/2); @@ -33,78 +47,80 @@ end odometry = cameras{1}.pose.between(cameras{2}.pose); poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); -%% Create an ISAM object for inference -isam = visualSLAMISAM; - -%% Update ISAM +%% Initialize iSAM +isam = visualSLAMISAM(2); newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; -for i=1:nCameras - - % Prior for the first pose or odometry for subsequent cameras - if (i==1) - newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, poseNoise); - for j=1:nPoints - newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); - end - else - newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, poseNoise); +if 1 % add hard constraint + newFactors.addPoseConstraint(symbol('x',1),cameras{1}.pose); +else + newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, poseNoise); +end +initialEstimates.insertPose(symbol('x',1), cameras{1}.pose); +% Add visual measurement factors from first pose +for j=1:nPoints + if 0 % add point priors + newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); end + zij = cameras{i}.project(points{j}); + newFactors.addMeasurement(zij, measurementNoise, symbol('x',1), symbol('l',j), K); + initialEstimates.insertPoint(symbol('l',j), points{j}); +end - % Visual measurement factors +%% Run iSAM Loop +for i=2:nCameras + + %% Add odometry + newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, odometryNoise); + + %% Add visual measurement factors for j=1:nPoints zij = cameras{i}.project(points{j}); newFactors.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); end - % Initial estimates for the new pose. Also initialize points while in - % the first frame. - if (i==1) - initialEstimates.insertPose(symbol('x',i), cameras{i}.pose); - for j=1:size(points,2) - initialEstimates.insertPoint(symbol('l',j), points{j}); - end - else - %TODO: this might be suboptimal since "result" is not the fully - %optimized result - if (i==2), prevPose = cameras{1}.pose; - else, prevPose = result.pose(symbol('x',i-1)); end - initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); + %% Initial estimates for the new pose. Also initialize points while in the first frame. + %TODO: this might be suboptimal since "result" is not the fully optimized result + if (i==2), prevPose = cameras{1}.pose; + else, prevPose = result.pose(symbol('x',i-1)); end + initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); + + %% Update ISAM + isam.update(newFactors, initialEstimates); + result = isam.estimate(); + if 0 % re-linearize + isam.reorder_relinearize(); end - - % Update ISAM, only update for the second frame onward - % Update the first frame will cause error, since it's under constrained - if (i>=2) - isam.update(newFactors, initialEstimates); - emptyFactors = visualSLAMGraph; - emptyEstimates = visualSLAMValues; - result = isam.estimate(); - - % Plot first result - h=figure(1);clf - hold on; - for j=1:size(points,2) - P = isam.marginalCovariance(symbol('l',j)); - point_j = result.point(symbol('l',j)); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); - end - - for ii=1:i - P = isam.marginalCovariance(symbol('x',ii)); - pose_ii = result.pose(symbol('x',ii)); - plotPose3(pose_ii,P,10); - end - axis([-50 50 -50 50 -50 50]) - colormap('hot') - %print(h,'-dpng',sprintf('VisualISAM_%03d.png',i)); - - % Reset newFactors and initialEstimates to prepare for the next - % update - newFactors = visualSLAMGraph; - initialEstimates = visualSLAMValues; + + %% Plot results + P1 = isam.marginalCovariance(symbol('x',1)); + sqrt(diag(P1)) + h=figure(1);clf + hold on; + for j=1:size(points,2) + P = isam.marginalCovariance(symbol('l',j)); + point_j = result.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); end + for ii=1:i + P = isam.marginalCovariance(symbol('x',ii)); + pose_ii = result.pose(symbol('x',ii)); + plotPose3(pose_ii,P,10); + if 1 % show ground truth + plotPose3(cameras{ii}.pose,0.001*eye(6),10); + end + end + axis([-40 40 -40 40 -10 20]);axis equal + view(2) + colormap('hot') + %print(h,'-dpng',sprintf('VisualISAM_%03d.png',i)); + + %% Reset newFactors and initialEstimates to prepare for the next update + newFactors = visualSLAMGraph; + initialEstimates = visualSLAMValues; end \ No newline at end of file diff --git a/gtsam.h b/gtsam.h index 71a14703e..9cfdab742 100644 --- a/gtsam.h +++ b/gtsam.h @@ -600,6 +600,14 @@ class GaussianFactorGraph { Matrix denseHessian() const; }; +class GaussianISAM { + GaussianISAM(); + gtsam::GaussianFactor* marginalFactor(size_t j) const; + gtsam::GaussianBayesNet* marginalBayesNet(size_t key) const; + Matrix marginalCovariance(size_t key) const; + gtsam::GaussianBayesNet* jointBayesNet(size_t key1, size_t key2) const; +}; + class GaussianSequentialSolver { GaussianSequentialSolver(const gtsam::GaussianFactorGraph& graph, bool useQR); @@ -925,10 +933,15 @@ class Graph { class ISAM { ISAM(); ISAM(int reorderInterval); - void print(string s) const; visualSLAM::Values estimate() const; - Matrix marginalCovariance(size_t key) const; - void update(const visualSLAM::Graph& newFactors, const visualSLAM::Values& initialValues); + Matrix marginalCovariance(size_t key) const; + int reorderInterval() const; + int reorderCounter() const; + void print(string s) const; + void update(const visualSLAM::Graph& newFactors, const visualSLAM::Values& initialValues); + void reorder_relinearize(); + void addKey(size_t key); + void setOrdering(const gtsam::Ordering& new_ordering); }; }///\namespace visualSLAM From b10f4d09e3743c21599ec1da2daf0871a3a15c96 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 06:14:47 +0000 Subject: [PATCH 231/914] iSAM with options --- examples/matlab/VisualISAMExample.m | 79 +++++++++++++++++++---------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index 7eacbf04a..89947cd40 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -10,18 +10,27 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -if 0 - %% Create a triangle target, just 3 points on a plane +clear + +%% Set Options here +TRIANGLE = false; +NCAMERAS = 10; +SHOW_IMAGES = false; +HARD_CONSTRAINT = false; +POINT_PRIORS = false; +BATCH_INIT = true; +ALWAYS_RELINEARIZE = false; +DRAW_TRUE_POSES = true; + +%% Generate simulated data +if TRIANGLE % Create a triangle target, just 3 points on a plane nPoints = 3; r = 10; - points = {}; for j=1:nPoints theta = (j-1)*2*pi/nPoints; points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); end -else - %% Generate simulated data - % 3D landmarks as vertices of a cube +else % 3D landmarks as vertices of a cube nPoints = 8; points = {gtsamPoint3([10 10 10]'),... gtsamPoint3([-10 10 10]'),... @@ -34,45 +43,56 @@ else end %% Create camera cameras on a circle around the triangle -nCameras = 10; -height = 0; -r = 30; -cameras = {}; +height = 10; r = 40; K = gtsamCal3_S2(500,500,0,640/2,480/2); -for i=1:nCameras - theta = (i-1)*2*pi/nCameras; +for i=1:NCAMERAS + theta = (i-1)*2*pi/NCAMERAS; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); + if SHOW_IMAGES % show images + figure(i);clf;hold on + for j=1:nPoints + zij = cameras{i}.project(points{j}); + plot(zij.x,zij.y,'*'); + axis([1 640 1 480]); + end + end end odometry = cameras{1}.pose.between(cameras{2}.pose); + +%% Set Noise parameters poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); %% Initialize iSAM -isam = visualSLAMISAM(2); +isam = visualSLAMISAM; newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; -if 1 % add hard constraint - newFactors.addPoseConstraint(symbol('x',1),cameras{1}.pose); +i1 = symbol('x',1); +camera1 = cameras{1}; +pose1 = camera1.pose; +if HARD_CONSTRAINT % add hard constraint + newFactors.addPoseConstraint(i1,pose1); else - newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, poseNoise); + newFactors.addPosePrior(i1,pose1, poseNoise); end -initialEstimates.insertPose(symbol('x',1), cameras{1}.pose); +initialEstimates.insertPose(i1,pose1); % Add visual measurement factors from first pose for j=1:nPoints - if 0 % add point priors - newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); + jj = symbol('l',j); + if POINT_PRIORS % add point priors + newFactors.addPointPrior(jj, points{j}, pointNoise); end - zij = cameras{i}.project(points{j}); - newFactors.addMeasurement(zij, measurementNoise, symbol('x',1), symbol('l',j), K); - initialEstimates.insertPoint(symbol('l',j), points{j}); + zij = camera1.project(points{j}); + newFactors.addMeasurement(zij, measurementNoise, i1, jj, K); + initialEstimates.insertPoint(jj, points{j}); end %% Run iSAM Loop -for i=2:nCameras +for i=2:NCAMERAS %% Add odometry newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, odometryNoise); @@ -90,16 +110,19 @@ for i=2:nCameras initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); %% Update ISAM + if BATCH_INIT & (i==2) % Do a full optimize for first two poses + initialEstimates + fullyOptimized = newFactors.optimize(initialEstimates) + initialEstimates = fullyOptimized; + end isam.update(newFactors, initialEstimates); result = isam.estimate(); - if 0 % re-linearize + if ALWAYS_RELINEARIZE % re-linearize isam.reorder_relinearize(); end %% Plot results - P1 = isam.marginalCovariance(symbol('x',1)); - sqrt(diag(P1)) - h=figure(1);clf + figure(NCAMERAS+1);clf hold on; for j=1:size(points,2) P = isam.marginalCovariance(symbol('l',j)); @@ -111,7 +134,7 @@ for i=2:nCameras P = isam.marginalCovariance(symbol('x',ii)); pose_ii = result.pose(symbol('x',ii)); plotPose3(pose_ii,P,10); - if 1 % show ground truth + if DRAW_TRUE_POSES % show ground truth plotPose3(cameras{ii}.pose,0.001*eye(6),10); end end From 43fb6b76e98728fbdd0fb125a8c4dd9e52197093 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Thu, 7 Jun 2012 06:53:03 +0000 Subject: [PATCH 232/914] fix a bad bug in PinholeCamera::lookat: normalize the result vector of cross product!!! --- gtsam/geometry/PinholeCamera.h | 1 + gtsam/geometry/tests/testSimpleCamera.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index f3b14f3c4..7dec508e0 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -174,6 +174,7 @@ namespace gtsam { Point3 zc = target-eye; zc = zc/zc.norm(); Point3 xc = (-upVector).cross(zc); // minus upVector since yc is pointing down + xc = xc/xc.norm(); Point3 yc = zc.cross(xc); Pose3 pose3(Rot3(xc,yc,zc), eye); return PinholeCamera(pose3, K); diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index e918606a1..d0f961bfa 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -74,6 +74,16 @@ TEST( SimpleCamera, lookat) Point3 xc(0,1,0),yc(0,0,-1),zc(-1,0,0); Pose3 expected(Rot3(xc,yc,zc),C); CHECK(assert_equal( camera.pose(), expected)); + + + Point3 C2(30.0,0.0,10.0); + SimpleCamera camera2 = SimpleCamera::lookat(C2, Point3(), Point3(0.0,0.0,1.0)); + + Matrix R = camera2.pose().rotation().matrix(); + Matrix I = trans(R)*R; + gtsam::print(I,"I="); + CHECK(assert_equal(I, eye(3))); + } /* ************************************************************************* */ From 61e95f4acef180997ae25fcff1034f690b5fedc2 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Thu, 7 Jun 2012 07:06:54 +0000 Subject: [PATCH 233/914] temporarily revive the old VisualISAMExample --- examples/matlab/VisualISAMExample_Duy.m | 110 ++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 examples/matlab/VisualISAMExample_Duy.m diff --git a/examples/matlab/VisualISAMExample_Duy.m b/examples/matlab/VisualISAMExample_Duy.m new file mode 100644 index 000000000..bb3a97979 --- /dev/null +++ b/examples/matlab/VisualISAMExample_Duy.m @@ -0,0 +1,110 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% GTSAM Copyright 3510, 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 +% +% @brief A simple visual SLAM example for structure from motion +% @author Duy-Nguyen Ta +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create a triangle target, just 3 points on a plane +nPoints = 3; +r = 10; +points = {}; +for j=1:nPoints + theta = (j-1)*2*pi/nPoints; + points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); +end + +%% Create camera cameras on a circle around the triangle +nCameras = 30; +height = 10; +r = 30; +cameras = {}; +K = gtsamCal3_S2(500,500,0,640/2,480/2); +for i=1:nCameras + theta = (i-1)*2*pi/nCameras; + t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); + cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); +end +odometry = cameras{1}.pose.between(cameras{2}.pose); + +poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.5 0.5 0.5]'); +pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); +measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); + +%% Create an ISAM object for inference +isam = visualSLAMISAM(5); + +%% Update ISAM +newFactors = visualSLAMGraph; +initialEstimates = visualSLAMValues; +figure(1); clf; +for i=1:nCameras + + % Prior for the first pose or odometry for subsequent cameras + if (i==1) + newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, poseNoise); + for j=1:nPoints + newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); + end + else + newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, poseNoise); + end + + % Visual measurement factors + for j=1:nPoints + zij = cameras{i}.project(points{j}); + newFactors.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); + end + + % Initial estimates for the new pose. Also initialize points while in + % the first frame. + if (i==1) + initialEstimates.insertPose(symbol('x',i), cameras{i}.pose); + for j=1:size(points,2) + initialEstimates.insertPoint(symbol('l',j), points{j}); + end + else + %TODO: this might be suboptimal since "result" is not the fully + %optimized result + if (i==2), prevPose = cameras{1}.pose; + else, prevPose = result.pose(symbol('x',i-1)); end + initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); + end + + % Update ISAM, only update for the second frame onward + % Update the first frame will cause error, since it's under constrained + if (i>=2) + isam.update(newFactors, initialEstimates); + result = isam.estimate(); + + % Plot results + h=figure(1); + hold on; + for j=1:size(points,2) + P = isam.marginalCovariance(symbol('l',j)); + point_j = result.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + end + + for ii=i-1:i + P = isam.marginalCovariance(symbol('x',ii)); + pose_ii = result.pose(symbol('x',ii)); + plotPose3(pose_ii,P,10); + end + axis([-35 35 -35 35 -35 35]) + view([36 34]) + colormap('hot') +% print(h,'-dpng',sprintf('vISAM_%03d.png',i)); + + % Reset newFactors and initialEstimates to prepare for the next + % update + newFactors = visualSLAMGraph; + initialEstimates = visualSLAMValues; + end +end \ No newline at end of file From 2a633b75c83369347b5f66afaadf109faffcb457 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Thu, 7 Jun 2012 07:43:22 +0000 Subject: [PATCH 234/914] use surf instead of mesh for covarianceEllipse3D --- examples/matlab/covarianceEllipse3D.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/matlab/covarianceEllipse3D.m b/examples/matlab/covarianceEllipse3D.m index 8799415a6..6d6ed9127 100644 --- a/examples/matlab/covarianceEllipse3D.m +++ b/examples/matlab/covarianceEllipse3D.m @@ -21,7 +21,7 @@ y = data(n+1:2*n,:)+c(2); z = data(2*n+1:end,:)+c(3); % now plot the rotated ellipse -sc = mesh(x,y,z,abs(xc)); +sc = surf(x,y,z,abs(xc)); shading interp alpha(0.5) axis equal \ No newline at end of file From ce71979c8c933581d1a642c8ff795eaea071c6ae Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Thu, 7 Jun 2012 07:43:56 +0000 Subject: [PATCH 235/914] VisualISAMExample_triangle --- ...ple_Duy.m => VisualISAMExample_triangle.m} | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) rename examples/matlab/{VisualISAMExample_Duy.m => VisualISAMExample_triangle.m} (87%) diff --git a/examples/matlab/VisualISAMExample_Duy.m b/examples/matlab/VisualISAMExample_triangle.m similarity index 87% rename from examples/matlab/VisualISAMExample_Duy.m rename to examples/matlab/VisualISAMExample_triangle.m index bb3a97979..c0dabec72 100644 --- a/examples/matlab/VisualISAMExample_Duy.m +++ b/examples/matlab/VisualISAMExample_triangle.m @@ -20,7 +20,7 @@ for j=1:nPoints end %% Create camera cameras on a circle around the triangle -nCameras = 30; +nCameras = 10; height = 10; r = 30; cameras = {}; @@ -32,12 +32,13 @@ for i=1:nCameras end odometry = cameras{1}.pose.between(cameras{2}.pose); -poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.5 0.5 0.5]'); +posepriorNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 5.0 5.0 5.0]'); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 2.0 2.0 2.0]'); pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); %% Create an ISAM object for inference -isam = visualSLAMISAM(5); +isam = visualSLAMISAM(2); %% Update ISAM newFactors = visualSLAMGraph; @@ -47,12 +48,10 @@ for i=1:nCameras % Prior for the first pose or odometry for subsequent cameras if (i==1) - newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, poseNoise); - for j=1:nPoints - newFactors.addPointPrior(symbol('l',j), points{j}, pointNoise); - end + newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, posepriorNoise); + newFactors.addPointPrior(symbol('l',1), points{1}, pointNoise); else - newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, poseNoise); + newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, odometryNoise); end % Visual measurement factors @@ -65,14 +64,14 @@ for i=1:nCameras % the first frame. if (i==1) initialEstimates.insertPose(symbol('x',i), cameras{i}.pose); - for j=1:size(points,2) + for j=1:nPoints initialEstimates.insertPoint(symbol('l',j), points{j}); end else %TODO: this might be suboptimal since "result" is not the fully %optimized result if (i==2), prevPose = cameras{1}.pose; - else, prevPose = result.pose(symbol('x',i-1)); end + else prevPose = result.pose(symbol('x',i-1)); end initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); end @@ -83,16 +82,16 @@ for i=1:nCameras result = isam.estimate(); % Plot results - h=figure(1); - hold on; - for j=1:size(points,2) + h=figure(1); clf; + hold on; + for j=1:nPoints P = isam.marginalCovariance(symbol('l',j)); point_j = result.point(symbol('l',j)); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); end - for ii=i-1:i + for ii=1:i P = isam.marginalCovariance(symbol('x',ii)); pose_ii = result.pose(symbol('x',ii)); plotPose3(pose_ii,P,10); From 8644f81dc8cb4ce7175bde27a1b69f628f4cf797 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 13:16:28 +0000 Subject: [PATCH 236/914] VisualiSAM, going crazy. MATLAB is amazing! --- examples/matlab/VisualISAMExample.m | 77 +++++++++---- examples/matlab/iSAMgui.fig | Bin 0 -> 5766 bytes examples/matlab/iSAMgui.m | 171 ++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+), 23 deletions(-) create mode 100644 examples/matlab/iSAMgui.fig create mode 100644 examples/matlab/iSAMgui.m diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index 89947cd40..e1116552d 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -12,15 +12,25 @@ clear -%% Set Options here +%% Data Options TRIANGLE = false; -NCAMERAS = 10; +NCAMERAS = 20; SHOW_IMAGES = false; + +%% iSAM Options HARD_CONSTRAINT = false; POINT_PRIORS = false; BATCH_INIT = true; +REORDER_INTERVAL=10; ALWAYS_RELINEARIZE = false; -DRAW_TRUE_POSES = true; + +%% Display Options +SAVE_GRAPH = false; +DRAW_INTERVAL = 20; +CAMERA_INTERVAL = 1; +DRAW_TRUE_POSES = false; +SAVE_FIGURES = false; +SAVE_GRAPHS = false; %% Generate simulated data if TRIANGLE % Create a triangle target, just 3 points on a plane @@ -50,7 +60,8 @@ for i=1:NCAMERAS t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); if SHOW_IMAGES % show images - figure(i);clf;hold on + figure(2+i);clf;hold on + set(2+i,'NumberTitle','off','Name',sprintf('Camera %d',i)); for j=1:nPoints zij = cameras{i}.project(points{j}); plot(zij.x,zij.y,'*'); @@ -68,7 +79,7 @@ pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); %% Initialize iSAM -isam = visualSLAMISAM; +isam = visualSLAMISAM(REORDER_INTERVAL); newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; i1 = symbol('x',1); @@ -92,6 +103,8 @@ for j=1:nPoints end %% Run iSAM Loop +figure(1);clf;hold on; +set(1,'NumberTitle','off','Name','iSAM timing'); for i=2:NCAMERAS %% Add odometry @@ -115,33 +128,51 @@ for i=2:NCAMERAS fullyOptimized = newFactors.optimize(initialEstimates) initialEstimates = fullyOptimized; end + figure(1);tic; isam.update(newFactors, initialEstimates); + t=toc; plot(i,t,'r.'); tic result = isam.estimate(); + t=toc; plot(i,t,'g.'); if ALWAYS_RELINEARIZE % re-linearize isam.reorder_relinearize(); end - %% Plot results - figure(NCAMERAS+1);clf - hold on; - for j=1:size(points,2) - P = isam.marginalCovariance(symbol('l',j)); - point_j = result.point(symbol('l',j)); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + if SAVE_GRAPH + isam.saveGraph(sprintf('VisualiSAM.dot',i)); end - for ii=1:i - P = isam.marginalCovariance(symbol('x',ii)); - pose_ii = result.pose(symbol('x',ii)); - plotPose3(pose_ii,P,10); - if DRAW_TRUE_POSES % show ground truth - plotPose3(cameras{ii}.pose,0.001*eye(6),10); + if mod(i,DRAW_INTERVAL)==0 + %% Plot results + tic + h=figure(2);clf + set(1,'NumberTitle','off','Name','Visual iSAM'); + hold on; + for j=1:size(points,2) + P = isam.marginalCovariance(symbol('l',j)); + point_j = result.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + end + for ii=1:CAMERA_INTERVAL:i + P = isam.marginalCovariance(symbol('x',ii)); + pose_ii = result.pose(symbol('x',ii)); + plotPose3(pose_ii,P,10); + if DRAW_TRUE_POSES % show ground truth + plotPose3(cameras{ii}.pose,0.001*eye(6),10); + end + end + axis([-40 40 -40 40 -10 20]);axis equal + view(3) + colormap('hot') + figure(2); + t=toc; + if DRAW_INTERVAL~=NCAMERAS, plot(i,t,'b.'); end + if SAVE_FIGURES + print(h,'-dpng',sprintf('VisualiSAM%03d.png',i)); + end + if SAVE_GRAPHS + isam.saveGraph(sprintf('VisualiSAM%03d.dot',i)); end end - axis([-40 40 -40 40 -10 20]);axis equal - view(2) - colormap('hot') - %print(h,'-dpng',sprintf('VisualISAM_%03d.png',i)); %% Reset newFactors and initialEstimates to prepare for the next update newFactors = visualSLAMGraph; diff --git a/examples/matlab/iSAMgui.fig b/examples/matlab/iSAMgui.fig new file mode 100644 index 0000000000000000000000000000000000000000..5f6154b49e54aa88b51c014d3ee2c3fa8d17f47f GIT binary patch literal 5766 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 S#A7^nFj4xPMleAk<-Y)|5uDBd literal 0 HcmV?d00001 diff --git a/examples/matlab/iSAMgui.m b/examples/matlab/iSAMgui.m new file mode 100644 index 000000000..71cd53855 --- /dev/null +++ b/examples/matlab/iSAMgui.m @@ -0,0 +1,171 @@ +function varargout = iSAMgui(varargin) +% ISAMGUI MATLAB code for iSAMgui.fig +% ISAMGUI, by itself, creates a new ISAMGUI or raises the existing +% singleton*. +% +% H = ISAMGUI returns the handle to a new ISAMGUI or the handle to +% the existing singleton*. +% +% ISAMGUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in ISAMGUI.M with the given input arguments. +% +% ISAMGUI('Property','Value',...) creates a new ISAMGUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before iSAMgui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to iSAMgui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help iSAMgui + +% Last Modified by GUIDE v2.5 07-Jun-2012 01:55:37 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @iSAMgui_OpeningFcn, ... + 'gui_OutputFcn', @iSAMgui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + +% --- Executes just before iSAMgui is made visible. +function iSAMgui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to iSAMgui (see VARARGIN) + +% Choose default command line output for iSAMgui +handles.output = hObject; + +% Update handles structure +guidata(hObject, handles); + +% This sets up the initial plot - only do when we are invisible +% so window can get raised using iSAMgui. +if strcmp(get(hObject,'Visible'),'off') + plot(rand(5)); +end + +% UIWAIT makes iSAMgui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = iSAMgui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + +% --- Executes on button press in pushbutton1. +function pushbutton1_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +axes(handles.axes1); +cla; + +popup_sel_index = get(handles.popupmenu1, 'Value'); +switch popup_sel_index + case 1 + plot(rand(5)); + case 2 + plot(sin(1:0.01:25.99)); + case 3 + bar(1:.5:10); + case 4 + plot(membrane); + case 5 + surf(peaks); +end + + +% -------------------------------------------------------------------- +function FileMenu_Callback(hObject, eventdata, handles) +% hObject handle to FileMenu (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% -------------------------------------------------------------------- +function OpenMenuItem_Callback(hObject, eventdata, handles) +% hObject handle to OpenMenuItem (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +file = uigetfile('*.fig'); +if ~isequal(file, 0) + open(file); +end + +% -------------------------------------------------------------------- +function PrintMenuItem_Callback(hObject, eventdata, handles) +% hObject handle to PrintMenuItem (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +printdlg(handles.figure1) + +% -------------------------------------------------------------------- +function CloseMenuItem_Callback(hObject, eventdata, handles) +% hObject handle to CloseMenuItem (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],... + ['Close ' get(handles.figure1,'Name') '...'],... + 'Yes','No','Yes'); +if strcmp(selection,'No') + return; +end + +delete(handles.figure1) + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: contents = get(hObject,'String') returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +set(hObject, 'String', {'plot(rand(5))', 'plot(sin(1:0.01:25))', 'bar(1:.5:10)', 'plot(membrane)', 'surf(peaks)'}); + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) From b01ab6e64271172f31b5039d19ea3b46277f3993 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 13:16:49 +0000 Subject: [PATCH 237/914] Fixed compile error in saveGraph --- gtsam/inference/BayesTree-inl.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 9a6b1478e..0aefeaa19 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -81,9 +81,9 @@ namespace gtsam { string parent = out.str(); parent += "[label=\""; - BOOST_FOREACH(boost::shared_ptr c, clique->conditionals_) { + BOOST_FOREACH(Index index, clique->conditional_->frontals()) { if(!first) parent += ","; first = false; - parent += (string(c->key())).c_str(); + parent += (boost::format("%1%")%index).str();; } if( clique != root_){ @@ -92,7 +92,7 @@ namespace gtsam { } first = true; - BOOST_FOREACH(Index sep, clique->separator_) { + BOOST_FOREACH(Index sep, clique->conditional_->parents()) { if(!first) parent += ","; first = false; parent += (boost::format("%1%")%sep).str(); } From f8ce3a9c110a3d4be2d38fe9f40c1ee1fc45ee60 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 13:17:46 +0000 Subject: [PATCH 238/914] saveGraph --- gtsam.h | 4 +++- gtsam/nonlinear/NonlinearISAM-inl.h | 6 ++++++ gtsam/nonlinear/NonlinearISAM.h | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 9cfdab742..447b9f7ca 100644 --- a/gtsam.h +++ b/gtsam.h @@ -602,6 +602,7 @@ class GaussianFactorGraph { class GaussianISAM { GaussianISAM(); + void saveGraph(string s) const; gtsam::GaussianFactor* marginalFactor(size_t j) const; gtsam::GaussianBayesNet* marginalBayesNet(size_t key) const; Matrix marginalCovariance(size_t key) const; @@ -933,11 +934,12 @@ class Graph { class ISAM { ISAM(); ISAM(int reorderInterval); + void print(string s) const; + void saveGraph(string s) const; visualSLAM::Values estimate() const; Matrix marginalCovariance(size_t key) const; int reorderInterval() const; int reorderCounter() const; - void print(string s) const; void update(const visualSLAM::Graph& newFactors, const visualSLAM::Values& initialValues); void reorder_relinearize(); void addKey(size_t key); diff --git a/gtsam/nonlinear/NonlinearISAM-inl.h b/gtsam/nonlinear/NonlinearISAM-inl.h index e054ecacb..55181731c 100644 --- a/gtsam/nonlinear/NonlinearISAM-inl.h +++ b/gtsam/nonlinear/NonlinearISAM-inl.h @@ -28,6 +28,12 @@ using namespace std; using namespace gtsam; +/* ************************************************************************* */ +template +void NonlinearISAM::saveGraph(const std::string& s) const { + isam_.saveGraph(s); +} + /* ************************************************************************* */ template void NonlinearISAM::update(const Factors& newFactors, diff --git a/gtsam/nonlinear/NonlinearISAM.h b/gtsam/nonlinear/NonlinearISAM.h index 16547770b..54dc92a23 100644 --- a/gtsam/nonlinear/NonlinearISAM.h +++ b/gtsam/nonlinear/NonlinearISAM.h @@ -93,6 +93,9 @@ public: /** prints out all contents of the system */ void print(const std::string& s="") const; + /** saves the Tree to a text file in GraphViz format */ + void saveGraph(const std::string& s) const; + /// @} /// @name Advanced Interface /// @{ From 39aec060aefe087818dcea73f6da63972d98c600 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 13:18:17 +0000 Subject: [PATCH 239/914] removed bind.h include --- gtsam/base/cholesky.cpp | 6 ++---- gtsam/linear/Errors.cpp | 2 -- gtsam/nonlinear/ISAM2-inl.h | 2 -- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/gtsam/base/cholesky.cpp b/gtsam/base/cholesky.cpp index 84c03f78b..2f93fc0fa 100644 --- a/gtsam/base/cholesky.cpp +++ b/gtsam/base/cholesky.cpp @@ -16,10 +16,6 @@ * @date Nov 5, 2010 */ -#include -#include -#include - #include #include #include @@ -27,6 +23,8 @@ #include #include +#include + using namespace std; namespace gtsam { diff --git a/gtsam/linear/Errors.cpp b/gtsam/linear/Errors.cpp index 71d0cc003..d3007350f 100644 --- a/gtsam/linear/Errors.cpp +++ b/gtsam/linear/Errors.cpp @@ -17,7 +17,6 @@ * @author Christian Potthast */ -#include #include #include @@ -56,7 +55,6 @@ struct equalsVector : public std::binary_function #include -#include - namespace gtsam { using namespace std; From bf21239e414e305a4f63c5dc25c5bf333f0f6194 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 14:29:18 +0000 Subject: [PATCH 240/914] printStats --- examples/matlab/VisualISAMExample.m | 4 ++++ gtsam.h | 1 + gtsam/nonlinear/NonlinearISAM-inl.h | 33 +++++++++++++++++++++-------- gtsam/nonlinear/NonlinearISAM.h | 3 +++ 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/examples/matlab/VisualISAMExample.m b/examples/matlab/VisualISAMExample.m index e1116552d..0e338340c 100644 --- a/examples/matlab/VisualISAMExample.m +++ b/examples/matlab/VisualISAMExample.m @@ -26,6 +26,7 @@ ALWAYS_RELINEARIZE = false; %% Display Options SAVE_GRAPH = false; +PRINT_STATS = true; DRAW_INTERVAL = 20; CAMERA_INTERVAL = 1; DRAW_TRUE_POSES = false; @@ -140,6 +141,9 @@ for i=2:NCAMERAS if SAVE_GRAPH isam.saveGraph(sprintf('VisualiSAM.dot',i)); end + if PRINT_STATS + isam.printStats(); + end if mod(i,DRAW_INTERVAL)==0 %% Plot results tic diff --git a/gtsam.h b/gtsam.h index 447b9f7ca..0e2367cc6 100644 --- a/gtsam.h +++ b/gtsam.h @@ -935,6 +935,7 @@ class ISAM { ISAM(); ISAM(int reorderInterval); void print(string s) const; + void printStats() const; void saveGraph(string s) const; visualSLAM::Values estimate() const; Matrix marginalCovariance(size_t key) const; diff --git a/gtsam/nonlinear/NonlinearISAM-inl.h b/gtsam/nonlinear/NonlinearISAM-inl.h index 55181731c..ea62f1713 100644 --- a/gtsam/nonlinear/NonlinearISAM-inl.h +++ b/gtsam/nonlinear/NonlinearISAM-inl.h @@ -17,16 +17,15 @@ #pragma once -#include - -#include - #include #include #include -using namespace std; -using namespace gtsam; +#include + +#include + +namespace gtsam { /* ************************************************************************* */ template @@ -71,7 +70,7 @@ void NonlinearISAM::update(const Factors& newFactors, template void NonlinearISAM::reorder_relinearize() { -// cout << "Reordering, relinearizing..." << endl; +// std::cout << "Reordering, relinearizing..." << std::endl; if(factors_.size() > 0) { // Obtain the new linearization point @@ -112,10 +111,26 @@ Matrix NonlinearISAM::marginalCovariance(Key key) const { /* ************************************************************************* */ template void NonlinearISAM::print(const std::string& s) const { - cout << "ISAM - " << s << ":" << endl; - cout << " ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << endl; + std::cout << "ISAM - " << s << ":" << std::endl; + std::cout << " ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << std::endl; isam_.print("GaussianISAM"); linPoint_.print("Linearization Point"); ordering_.print("System Ordering"); factors_.print("Nonlinear Graph"); } + +/* ************************************************************************* */ +template +void NonlinearISAM::printStats() const { + gtsam::GaussianISAM::CliqueData data = isam_.getCliqueData(); + gtsam::GaussianISAM::CliqueStats stats = data.getStats(); + std::cout << "\navg Conditional Size: " << stats.avgConditionalSize; + std::cout << "\nmax Conditional Size: " << stats.maxConditionalSize; + std::cout << "\navg Separator Size: " << stats.avgSeparatorSize; + std::cout << "\nmax Separator Size: " << stats.maxSeparatorSize; + std::cout << std::endl; +} + +/* ************************************************************************* */ + +}///\ namespace gtsam diff --git a/gtsam/nonlinear/NonlinearISAM.h b/gtsam/nonlinear/NonlinearISAM.h index 54dc92a23..145af7c17 100644 --- a/gtsam/nonlinear/NonlinearISAM.h +++ b/gtsam/nonlinear/NonlinearISAM.h @@ -93,6 +93,9 @@ public: /** prints out all contents of the system */ void print(const std::string& s="") const; + /** prints out clique statistics */ + void printStats() const; + /** saves the Tree to a text file in GraphViz format */ void saveGraph(const std::string& s) const; From e0686484b68e112b6b8cde0fa7e03b5642e49850 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Thu, 7 Jun 2012 14:53:39 +0000 Subject: [PATCH 241/914] fixed compile errors --- examples/VisualSLAMData.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/VisualSLAMData.h b/examples/VisualSLAMData.h index 88fb576fe..1a55e1a26 100644 --- a/examples/VisualSLAMData.h +++ b/examples/VisualSLAMData.h @@ -66,8 +66,8 @@ struct VisualSLAMExampleData { double theta = 0.0; double r = 30.0; for (int i=0; i Date: Thu, 7 Jun 2012 15:45:29 +0000 Subject: [PATCH 242/914] Now installs matlab *.fig files with examples --- examples/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index c9b3e4d8b..9dada79bc 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -36,7 +36,10 @@ if (GTSAM_BUILD_WRAP) # Examples if (GTSAM_INSTALL_MATLAB_EXAMPLES) message(STATUS "Installing Matlab Toolbox Examples") - file(GLOB matlab_examples "${GTSAM_SOURCE_ROOT_DIR}/examples/matlab/*.m") + # Matlab files: *.m and *.fig + file(GLOB matlab_examples_m "${GTSAM_SOURCE_ROOT_DIR}/examples/matlab/*.m") + file(GLOB matlab_examples_fig "${GTSAM_SOURCE_ROOT_DIR}/examples/matlab/*.fig") + set(matlab_examples ${matlab_examples_m} ${matlab_examples_fig}) install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) message(STATUS "Installing Matlab Toolbox Examples (Data)") From 674d8d51b3db1b62f731444b12c63e6c00222af2 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 15:46:23 +0000 Subject: [PATCH 243/914] prototype to get Kyel started on Active Matching a la Chli --- gtsam/slam/tests/testVisualSLAM.cpp | 54 +++++++++++++++++------------ 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp index f09d5117a..d01d402ee 100644 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -81,7 +81,7 @@ visualSLAM::Graph testGraph() { } /* ************************************************************************* */ -TEST( Graph, optimizeLM) +TEST( VisualSLAM, optimizeLM) { // build a graph visualSLAM::Graph graph(testGraph()); @@ -119,7 +119,7 @@ TEST( Graph, optimizeLM) /* ************************************************************************* */ -TEST( Graph, optimizeLM2) +TEST( VisualSLAM, optimizeLM2) { // build a graph visualSLAM::Graph graph(testGraph()); @@ -156,7 +156,7 @@ TEST( Graph, optimizeLM2) /* ************************************************************************* */ -TEST( Graph, CHECK_ORDERING) +TEST( VisualSLAM, CHECK_ORDERING) { // build a graph visualSLAM::Graph graph = testGraph(); @@ -188,28 +188,38 @@ TEST( Graph, CHECK_ORDERING) } /* ************************************************************************* */ -TEST( Values, update_with_large_delta) { - // this test ensures that if the update for delta is larger than - // the size of the config, it only updates existing variables - Values init; - init.insert(X(1), Pose3()); - init.insert(L(1), Point3(1.0, 2.0, 3.0)); +TEST( VisualSLAM, update_with_large_delta) { + // this test ensures that if the update for delta is larger than + // the size of the config, it only updates existing variables + Values init; + init.insert(X(1), Pose3()); + init.insert(L(1), Point3(1.0, 2.0, 3.0)); - Values expected; - expected.insert(X(1), Pose3(Rot3(), Point3(0.1, 0.1, 0.1))); - expected.insert(L(1), Point3(1.1, 2.1, 3.1)); + Values expected; + expected.insert(X(1), Pose3(Rot3(), Point3(0.1, 0.1, 0.1))); + expected.insert(L(1), Point3(1.1, 2.1, 3.1)); - Ordering largeOrdering; - Values largeValues = init; - largeValues.insert(X(2), Pose3()); - largeOrdering += X(1),L(1),X(2); - VectorValues delta(largeValues.dims(largeOrdering)); - delta[largeOrdering[X(1)]] = Vector_(6, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1); - delta[largeOrdering[L(1)]] = Vector_(3, 0.1, 0.1, 0.1); - delta[largeOrdering[X(2)]] = Vector_(6, 0.0, 0.0, 0.0, 100.1, 4.1, 9.1); - Values actual = init.retract(delta, largeOrdering); + Ordering largeOrdering; + Values largeValues = init; + largeValues.insert(X(2), Pose3()); + largeOrdering += X(1),L(1),X(2); + VectorValues delta(largeValues.dims(largeOrdering)); + delta[largeOrdering[X(1)]] = Vector_(6, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1); + delta[largeOrdering[L(1)]] = Vector_(3, 0.1, 0.1, 0.1); + delta[largeOrdering[X(2)]] = Vector_(6, 0.0, 0.0, 0.0, 100.1, 4.1, 9.1); + Values actual = init.retract(delta, largeOrdering); - CHECK(assert_equal(expected,actual)); + CHECK(assert_equal(expected,actual)); +} + +/* ************************************************************************* */ +TEST( VisualSLAM, dataAssociation) { + visualSLAM::ISAM isam; + // add two landmarks + // add two cameras and constraint and odometry +// std::pair actualJoint = isam.jointPrediction(); // 4*4 + // std::pair actualMarginals = isam.individualPredictions(); // 2 times 2*2 + // std::pair actualChowLiu = isam.chowLiuPredictions(); // 2 times 2*2 } /* ************************************************************************* */ From 288858d5f2dd37050bf3a93f439040737a09d86a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 7 Jun 2012 16:12:41 +0000 Subject: [PATCH 244/914] Removed unnecessary extra compile flags --- gtsam/CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 5ab49b632..eaf00d8d2 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -91,10 +91,6 @@ if (GTSAM_BUILD_STATIC_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) - if(MSVC) - set_target_properties(gtsam-static PROPERTIES - COMPILE_FLAGS "/MP") - endif() install(TARGETS gtsam-static ARCHIVE DESTINATION lib) endif (GTSAM_BUILD_STATIC_LIBRARY) @@ -107,10 +103,6 @@ if (GTSAM_BUILD_SHARED_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) - if(MSVC) - set_target_properties(gtsam-shared PROPERTIES - COMPILE_FLAGS "/MP") - endif() install(TARGETS gtsam-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) endif(GTSAM_BUILD_SHARED_LIBRARY) From 97f52c564311c6a933ec73341c3fe11f6791273d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 7 Jun 2012 16:12:55 +0000 Subject: [PATCH 245/914] Cleaned up boost bind dependency --- gtsam/inference/FactorGraph-inl.h | 12 +++++++----- gtsam/linear/JacobianFactor.cpp | 12 ++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index ea92cb791..3451b6ed4 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -27,14 +27,12 @@ #include #include #include -#include #include #include #include #include #include -#include using namespace std; @@ -103,11 +101,15 @@ namespace gtsam { /* ************************************************************************* */ template typename DERIVED::shared_ptr Combine(const FactorGraph& factors, - const FastMap >& variableSlots) { + const FastMap >& variableSlots) { + typedef const pair > KeySlotPair; + // Local functional for getting keys out of key-value pairs + struct Local { static KEY FirstOf(const KeySlotPair& pr) { return pr.first; } }; + return typename DERIVED::shared_ptr(new DERIVED( - boost::make_transform_iterator(variableSlots.begin(), boost::bind(&KeySlotPair::first, _1)), - boost::make_transform_iterator(variableSlots.end(), boost::bind(&KeySlotPair::first, _1)))); + boost::make_transform_iterator(variableSlots.begin(), &Local::FirstOf), + boost::make_transform_iterator(variableSlots.end(), &Local::FirstOf))); } /* ************************************************************************* */ diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index b4d7016aa..677900b01 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -29,15 +29,16 @@ #include #include #include -#include -#include +#include +//#include +//#include #include #include #include using namespace std; -using namespace boost::lambda; +//using namespace boost::lambda; namespace gtsam { @@ -163,7 +164,7 @@ namespace gtsam { size_t maxrank; try { maxrank = choleskyCareful(matrix_).first; - } catch(const CarefulCholeskyNegativeMatrixException& e) { + } catch(const CarefulCholeskyNegativeMatrixException&) { cout << "Attempting to convert a HessianFactor to a JacobianFactor, but for this\n" "HessianFactor it is not possible because either the Hessian is negative or\n" @@ -494,8 +495,7 @@ namespace gtsam { size_t>& varDims, size_t m) { keys_.resize(variableSlots.size()); std::transform(variableSlots.begin(), variableSlots.end(), begin(), - boost::bind(&VariableSlots::const_iterator::value_type::first, - boost::lambda::_1)); + boost::bind(&VariableSlots::const_iterator::value_type::first, _1)); varDims.push_back(1); Ab_.copyStructureFrom(BlockAb(matrix_, varDims.begin(), varDims.end(), m)); firstNonzeroBlocks_.resize(m); From 8ba08135b2a853659781fd83e0c984401ed4f091 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 7 Jun 2012 16:12:57 +0000 Subject: [PATCH 246/914] Disambiguated sqrt function --- gtsam_unstable/discrete/CSP.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/discrete/CSP.cpp b/gtsam_unstable/discrete/CSP.cpp index bfbdf28cf..4a041c9b2 100644 --- a/gtsam_unstable/discrete/CSP.cpp +++ b/gtsam_unstable/discrete/CSP.cpp @@ -60,8 +60,8 @@ namespace gtsam { // TODO: Sudoku specific hack if (print) { if (cardinality == 9 && n == 81) { - for (size_t i = 0, v = 0; i < (size_t)sqrt(double(n)); i++) { - for (size_t j = 0; j < (size_t)sqrt(double(n)); j++, v++) { + for (size_t i = 0, v = 0; i < (size_t)std::sqrt((double)n); i++) { + for (size_t j = 0; j < (size_t)std::sqrt((double)n); j++, v++) { if (changed[v]) cout << "*"; domains[v].print(); cout << "\t"; From 8bfe8571bcd00d62c20cd5fc6d9a918c513e90dd Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 7 Jun 2012 17:45:05 +0000 Subject: [PATCH 247/914] Removed template argument from NonlinearISAM, now just uses NonlinearFactorGraph --- ...{NonlinearISAM-inl.h => NonlinearISAM.cpp} | 29 +++++++------------ gtsam/nonlinear/NonlinearISAM.h | 12 ++------ gtsam/slam/visualSLAM.h | 2 +- tests/testNonlinearISAM.cpp | 2 +- 4 files changed, 16 insertions(+), 29 deletions(-) rename gtsam/nonlinear/{NonlinearISAM-inl.h => NonlinearISAM.cpp} (80%) diff --git a/gtsam/nonlinear/NonlinearISAM-inl.h b/gtsam/nonlinear/NonlinearISAM.cpp similarity index 80% rename from gtsam/nonlinear/NonlinearISAM-inl.h rename to gtsam/nonlinear/NonlinearISAM.cpp index ea62f1713..8c4424f05 100644 --- a/gtsam/nonlinear/NonlinearISAM-inl.h +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -15,7 +15,7 @@ * @author Viorela Ila and Richard Roberts */ -#pragma once +#include #include #include @@ -28,14 +28,12 @@ namespace gtsam { /* ************************************************************************* */ -template -void NonlinearISAM::saveGraph(const std::string& s) const { +void NonlinearISAM::saveGraph(const std::string& s) const { isam_.saveGraph(s); } /* ************************************************************************* */ -template -void NonlinearISAM::update(const Factors& newFactors, +void NonlinearISAM::update(const NonlinearFactorGraph& newFactors, const Values& initialValues) { if(newFactors.size() > 0) { @@ -54,12 +52,12 @@ void NonlinearISAM::update(const Factors& newFactors, // Augment ordering // FIXME: should just loop over new values - BOOST_FOREACH(const typename Factors::sharedFactor& factor, newFactors) + BOOST_FOREACH(const NonlinearFactorGraph::sharedFactor& factor, newFactors) BOOST_FOREACH(Key key, factor->keys()) ordering_.tryInsert(key, ordering_.nVars()); // will do nothing if already present boost::shared_ptr linearizedNewFactors( - newFactors.linearize(linPoint_, ordering_)->template dynamicCastFactors()); + newFactors.linearize(linPoint_, ordering_)->dynamicCastFactors()); // Update ISAM isam_.update(*linearizedNewFactors); @@ -67,8 +65,7 @@ void NonlinearISAM::update(const Factors& newFactors, } /* ************************************************************************* */ -template -void NonlinearISAM::reorder_relinearize() { +void NonlinearISAM::reorder_relinearize() { // std::cout << "Reordering, relinearizing..." << std::endl; @@ -83,7 +80,7 @@ void NonlinearISAM::reorder_relinearize() { // Create a linear factor graph at the new linearization point boost::shared_ptr gfg( - factors_.linearize(newLinPoint, ordering_)->template dynamicCastFactors()); + factors_.linearize(newLinPoint, ordering_)->dynamicCastFactors()); // Just recreate the whole BayesTree isam_.update(*gfg); @@ -94,8 +91,7 @@ void NonlinearISAM::reorder_relinearize() { } /* ************************************************************************* */ -template -Values NonlinearISAM::estimate() const { +Values NonlinearISAM::estimate() const { if(isam_.size() > 0) return linPoint_.retract(optimize(isam_), ordering_); else @@ -103,14 +99,12 @@ Values NonlinearISAM::estimate() const { } /* ************************************************************************* */ -template -Matrix NonlinearISAM::marginalCovariance(Key key) const { +Matrix NonlinearISAM::marginalCovariance(Key key) const { return isam_.marginalCovariance(ordering_[key]); } /* ************************************************************************* */ -template -void NonlinearISAM::print(const std::string& s) const { +void NonlinearISAM::print(const std::string& s) const { std::cout << "ISAM - " << s << ":" << std::endl; std::cout << " ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << std::endl; isam_.print("GaussianISAM"); @@ -120,8 +114,7 @@ void NonlinearISAM::print(const std::string& s) const { } /* ************************************************************************* */ -template -void NonlinearISAM::printStats() const { +void NonlinearISAM::printStats() const { gtsam::GaussianISAM::CliqueData data = isam_.getCliqueData(); gtsam::GaussianISAM::CliqueStats stats = data.getStats(); std::cout << "\navg Conditional Size: " << stats.avgConditionalSize; diff --git a/gtsam/nonlinear/NonlinearISAM.h b/gtsam/nonlinear/NonlinearISAM.h index 145af7c17..d2ca75c42 100644 --- a/gtsam/nonlinear/NonlinearISAM.h +++ b/gtsam/nonlinear/NonlinearISAM.h @@ -24,12 +24,7 @@ namespace gtsam { /** * Wrapper class to manage ISAM in a nonlinear context */ -template class NonlinearISAM { -public: - - typedef GRAPH Factors; - protected: /** The internal iSAM object */ @@ -42,7 +37,7 @@ protected: gtsam::Ordering ordering_; /** The original factors, used when relinearizing */ - Factors factors_; + NonlinearFactorGraph factors_; /** The reordering interval and counter */ int reorderInterval_; @@ -84,7 +79,7 @@ public: const gtsam::Ordering& getOrdering() const { return ordering_; } /** get underlying nonlinear graph */ - const Factors& getFactorsUnsafe() const { return factors_; } + const NonlinearFactorGraph& getFactorsUnsafe() const { return factors_; } /** get counters */ int reorderInterval() const { return reorderInterval_; } /// diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 22e56b8a0..f1f5c3850 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -203,6 +203,6 @@ namespace visualSLAM { /** * Non-linear ISAM for vanilla incremental visual SLAM inference */ - typedef gtsam::NonlinearISAM ISAM; + typedef gtsam::NonlinearISAM ISAM; } // namespaces diff --git a/tests/testNonlinearISAM.cpp b/tests/testNonlinearISAM.cpp index 28926ff5d..f063f9c7d 100644 --- a/tests/testNonlinearISAM.cpp +++ b/tests/testNonlinearISAM.cpp @@ -13,7 +13,7 @@ using namespace gtsam; using namespace planarSLAM; -typedef NonlinearISAM<> PlanarISAM; +typedef NonlinearISAM PlanarISAM; const double tol=1e-5; From 2288a6bc1ff4a6d0eefc4f316b39c9a40fe1ba7e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 7 Jun 2012 17:47:19 +0000 Subject: [PATCH 248/914] fixed compile error due to NonlinearISAM change --- examples/VisualISAMExample.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/VisualISAMExample.cpp b/examples/VisualISAMExample.cpp index 38fe1dd35..c2f6f5d5b 100644 --- a/examples/VisualISAMExample.cpp +++ b/examples/VisualISAMExample.cpp @@ -35,7 +35,7 @@ int main(int argc, char* argv[]) { /* 1. Create a NonlinearISAM which will be relinearized and reordered after every "relinearizeInterval" updates */ int relinearizeInterval = 3; - NonlinearISAM<> isam(relinearizeInterval); + NonlinearISAM isam(relinearizeInterval); /* 2. At each frame (poseId) with new camera pose and set of associated measurements, * create a graph of new factors and update ISAM */ From 111ef8a0f001787f55292b8011da912dd061bff3 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 7 Jun 2012 18:16:37 +0000 Subject: [PATCH 249/914] Moved LinearizedFactor from MastSLAM, started on a test for LinearContainerFactor --- .cproject | 8 + gtsam_unstable/CMakeLists.txt | 1 + gtsam_unstable/nonlinear/CMakeLists.txt | 25 +++ gtsam_unstable/nonlinear/LinearizedFactor.cpp | 147 ++++++++++++++++++ gtsam_unstable/nonlinear/LinearizedFactor.h | 122 +++++++++++++++ .../tests/testLinearContainerFactors.cpp | 22 +++ .../nonlinear/tests/testLinearizedFactor.cpp | 68 ++++++++ 7 files changed, 393 insertions(+) create mode 100644 gtsam_unstable/nonlinear/CMakeLists.txt create mode 100644 gtsam_unstable/nonlinear/LinearizedFactor.cpp create mode 100644 gtsam_unstable/nonlinear/LinearizedFactor.h create mode 100644 gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp create mode 100644 gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp diff --git a/.cproject b/.cproject index abe692394..36e736354 100644 --- a/.cproject +++ b/.cproject @@ -2114,6 +2114,14 @@ true true + + make + -j5 + check.nonlinear_unstable + true + true + true + make -j2 diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index f5cbf9ac6..679551dbe 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -5,6 +5,7 @@ set (gtsam_unstable_subdirs discrete dynamics linear + nonlinear slam ) diff --git a/gtsam_unstable/nonlinear/CMakeLists.txt b/gtsam_unstable/nonlinear/CMakeLists.txt new file mode 100644 index 000000000..a815e956d --- /dev/null +++ b/gtsam_unstable/nonlinear/CMakeLists.txt @@ -0,0 +1,25 @@ +# Install headers +file(GLOB nonlinear_headers "*.h") +install(FILES ${nonlinear_headers} DESTINATION include/gtsam_unstable/nonlinear) + +# Components to link tests in this subfolder against +set(nonlinear_local_libs + nonlinear_unstable + nonlinear + linear + inference + geometry + base + ccolamd +) + +set (nonlinear_full_libs + gtsam-static + gtsam_unstable-static) + +# Exclude tests that don't work +set (nonlinear_excluded_tests "") + +# Add all tests +gtsam_add_subdir_tests(nonlinear_unstable "${nonlinear_local_libs}" "${nonlinear_full_libs}" "${nonlinear_excluded_tests}") +add_dependencies(check.unstable check.nonlinear_unstable) diff --git a/gtsam_unstable/nonlinear/LinearizedFactor.cpp b/gtsam_unstable/nonlinear/LinearizedFactor.cpp new file mode 100644 index 000000000..82e5c9eef --- /dev/null +++ b/gtsam_unstable/nonlinear/LinearizedFactor.cpp @@ -0,0 +1,147 @@ +/* ---------------------------------------------------------------------------- + + * 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 LinearizedFactor.cpp + * @brief A dummy factor that allows a linear factor to act as a nonlinear factor + * @author Alex Cunningham + */ + +#include +#include + +#include + +namespace gtsam { + +using namespace std; + +/* ************************************************************************* */ +LinearizedFactor::LinearizedFactor(JacobianFactor::shared_ptr lin_factor, + const KeyLookup& decoder, const Values& lin_points) +: Base(lin_factor->get_model()), b_(lin_factor->getb()), model_(lin_factor->get_model()) { + BOOST_FOREACH(const Index& idx, *lin_factor) { + // find full symbol + KeyLookup::const_iterator decode_it = decoder.find(idx); + if (decode_it == decoder.end()) + throw runtime_error("LinearizedFactor: could not find index in decoder!"); + Key key(decode_it->second); + + // extract linearization point + assert(lin_points.exists(key)); + this->lin_points_.insert(key, lin_points.at(key)); // NOTE: will not overwrite + + // extract Jacobian + Matrix A = lin_factor->getA(lin_factor->find(idx)); + this->matrices_.insert(std::make_pair(key, A)); + + // store keys + this->keys_.push_back(key); + } +} + +/* ************************************************************************* */ +LinearizedFactor::LinearizedFactor(JacobianFactor::shared_ptr lin_factor, + const Ordering& ordering, const Values& lin_points) +: Base(lin_factor->get_model()), b_(lin_factor->getb()), model_(lin_factor->get_model()) { + const KeyLookup decoder = ordering.invert(); + BOOST_FOREACH(const Index& idx, *lin_factor) { + // find full symbol + KeyLookup::const_iterator decode_it = decoder.find(idx); + if (decode_it == decoder.end()) + throw runtime_error("LinearizedFactor: could not find index in decoder!"); + Key key(decode_it->second); + + // extract linearization point + assert(lin_points.exists(key)); + this->lin_points_.insert(key, lin_points.at(key)); // NOTE: will not overwrite + + // extract Jacobian + Matrix A = lin_factor->getA(lin_factor->find(idx)); + this->matrices_.insert(std::make_pair(key, A)); + + // store keys + this->keys_.push_back(key); + } +} + +/* ************************************************************************* */ +Vector LinearizedFactor::unwhitenedError(const Values& c, + boost::optional&> H) const { + // extract the points in the new values + Vector ret = - b_; + + if (H) H->resize(this->size()); + size_t i=0; + BOOST_FOREACH(Key key, this->keys()) { + const Value& newPt = c.at(key); + const Value& linPt = lin_points_.at(key); + Vector d = linPt.localCoordinates_(newPt); + const Matrix& A = matrices_.at(key); + ret += A * d; + if (H) (*H)[i++] = A; + } + + return ret; +} + +/* ************************************************************************* */ +boost::shared_ptr +LinearizedFactor::linearize(const Values& c, const Ordering& ordering) const { + + // sort by varid - only known at linearization time + typedef std::map VarMatrixMap; + VarMatrixMap sorting_terms; + BOOST_FOREACH(const KeyMatrixMap::value_type& p, matrices_) + sorting_terms.insert(std::make_pair(ordering[p.first], p.second)); + + // move into terms + std::vector > terms; + BOOST_FOREACH(const VarMatrixMap::value_type& p, sorting_terms) + terms.push_back(p); + + // compute rhs: adjust current by whitened update + Vector b = unwhitenedError(c) + b_; // remove original b + this->noiseModel_->whitenInPlace(b); + + return boost::shared_ptr(new JacobianFactor(terms, b - b_, model_)); +} + +/* ************************************************************************* */ +void LinearizedFactor::print(const std::string& s, const KeyFormatter& keyFormatter) const { + this->noiseModel_->print(s + std::string(" model")); + BOOST_FOREACH(const KeyMatrixMap::value_type& p, matrices_) { + gtsam::print(p.second, keyFormatter(p.first)); + } + gtsam::print(b_, std::string("b")); + std::cout << " nonlinear keys: "; + BOOST_FOREACH(const Key& key, this->keys()) + cout << keyFormatter(key) << " "; + lin_points_.print("Linearization Point"); +} + +/* ************************************************************************* */ +bool LinearizedFactor::equals(const LinearizedFactor& other, double tol) const { + if (!Base::equals(other, tol) + || !lin_points_.equals(other.lin_points_, tol) + || !equal_with_abs_tol(b_, other.b_, tol) + || !model_->equals(*other.model_, tol) + || matrices_.size() != other.matrices_.size()) + return false; + + KeyMatrixMap::const_iterator map1 = matrices_.begin(), map2 = other.matrices_.begin(); + for (; map1 != matrices_.end(), map2 != other.matrices_.end(); ++map1, ++map2) + if ((map1->first != map2->first) || !equal_with_abs_tol(map1->second, map2->second, tol)) + return false; + return true; +} + +} // \namespace gtsam diff --git a/gtsam_unstable/nonlinear/LinearizedFactor.h b/gtsam_unstable/nonlinear/LinearizedFactor.h new file mode 100644 index 000000000..3fa46701d --- /dev/null +++ b/gtsam_unstable/nonlinear/LinearizedFactor.h @@ -0,0 +1,122 @@ +/* ---------------------------------------------------------------------------- + + * 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 LinearizedFactor.h + * @brief A dummy factor that allows a linear factor to act as a nonlinear factor + * @author Alex Cunningham + */ + +#pragma once + +#include +#include +#include + +namespace gtsam { + +/** + * A dummy factor that takes a linearized factor and inserts it into + * a nonlinear graph. + */ +class LinearizedFactor : public gtsam::NoiseModelFactor { + +public: + /** base type */ + typedef gtsam::NoiseModelFactor Base; + typedef LinearizedFactor This; + + /** shared pointer for convenience */ + typedef boost::shared_ptr shared_ptr; + + + /** decoder for keys - avoids the use of a full ordering */ + typedef gtsam::Ordering::InvertedMap KeyLookup; + +protected: + /** hold onto the factor itself */ + // store components of a jacobian factor + typedef std::map KeyMatrixMap; + KeyMatrixMap matrices_; + gtsam::Vector b_; + gtsam::SharedDiagonal model_; /// separate from the noisemodel in NonlinearFactor due to Diagonal/Gaussian + + /** linearization points for error calculation */ + gtsam::Values lin_points_; + + /** default constructor for serialization */ + LinearizedFactor() {} + +public: + + virtual ~LinearizedFactor() {} + + ADD_CLONE_NONLINEAR_FACTOR(This); + + /** + * Use this constructor with pre-constructed decoders + * @param lin_factor is a gaussian factor with linear keys (no labels baked in) + * @param decoder is a structure to look up the correct keys + * @param values is assumed to have the correct key structure with labels + */ + LinearizedFactor(gtsam::JacobianFactor::shared_ptr lin_factor, + const KeyLookup& decoder, const gtsam::Values& lin_points); + + /** + * Use this constructor with the ordering used to linearize the graph + * @param lin_factor is a gaussian factor with linear keys (no labels baked in) + * @param ordering is the full ordering used to linearize the graph + * @param values is assumed to have the correct key structure with labels + */ + LinearizedFactor(gtsam::JacobianFactor::shared_ptr lin_factor, + const gtsam::Ordering& ordering, const gtsam::Values& lin_points); + + /** Vector of errors, unwhitened, with optional derivatives (ordered by key) */ + virtual gtsam::Vector unwhitenedError(const gtsam::Values& c, + boost::optional&> H = boost::none) const; + + /** + * linearize to a GaussianFactor + * Reimplemented from NoiseModelFactor to directly copy out the + * matrices and only update the RHS b with an updated residual + */ + virtual boost::shared_ptr linearize( + const gtsam::Values& c, const gtsam::Ordering& ordering) const; + + // Testable + + /** print function */ + virtual void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; + + /** equals function with optional tolerance */ + virtual bool equals(const LinearizedFactor& other, double tol = 1e-9) const; + + // access functions + + const gtsam::Vector& b() const { return b_; } + inline const gtsam::Values& linearizationPoint() const { return lin_points_; } + +private: + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("NonlinearFactor", + boost::serialization::base_object(*this)); + ar & BOOST_SERIALIZATION_NVP(matrices_); + ar & BOOST_SERIALIZATION_NVP(b_); + ar & BOOST_SERIALIZATION_NVP(model_); + ar & BOOST_SERIALIZATION_NVP(lin_points_); + } +}; + +} // \namespace gtsam + diff --git a/gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp b/gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp new file mode 100644 index 000000000..05fabc66a --- /dev/null +++ b/gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp @@ -0,0 +1,22 @@ +/** + * @file testLinearContainerFactors.cpp + * + * @brief Tests the use of nonlinear containers for simple integration of linear factors into nonlinear graphs + * + * @date Jun 7, 2012 + * @author Alex Cunningham + */ + +#include + + +/* ************************************************************************* */ +TEST( testLinearContainerFactors, jacobian_factor ) { + +// LinearContainerFactor actualLinFactor(); + +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ diff --git a/gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp b/gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp new file mode 100644 index 000000000..d15bcd150 --- /dev/null +++ b/gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp @@ -0,0 +1,68 @@ +/** + * @file testLinearizedFactor + * @author Alex Cunningham + */ + +#include +#include +#include +#include + +#include + +using namespace std; +using namespace boost::assign; +using namespace gtsam; + +static const double tol = 1e-5; + +/* ************************************************************************* */ +TEST( testLinearizedFactor, creation ) { + // Create a set of local keys (No robot label) + Key l1 = 11, l2 = 12, + l3 = 13, l4 = 14, + l5 = 15, l6 = 16, + l7 = 17, l8 = 18; + + // creating an ordering to decode the linearized factor + Ordering ordering; + ordering += l1,l2,l3,l4,l5,l6,l7,l8; + + // create a decoder for only the relevant variables + LinearizedFactor::KeyLookup decoder; + decoder[2] = l3; + decoder[4] = l5; + + // create a linear factor + SharedDiagonal model = noiseModel::Unit::Create(2); + JacobianFactor::shared_ptr linear_factor(new JacobianFactor( + ordering[l3], eye(2,2), ordering[l5], 2.0 * eye(2,2), zero(2), model)); + + // create a set of values - build with full set of values + gtsam::Values full_values, exp_values; + full_values.insert(l3, Point2(1.0, 2.0)); + full_values.insert(l5, Point2(4.0, 3.0)); + exp_values = full_values; + full_values.insert(l1, Point2(3.0, 7.0)); + + // create the test LinearizedFactor + // This is called in the constructor of DDFSlot for each linear factor + LinearizedFactor actual1(linear_factor, decoder, full_values); + LinearizedFactor actual2(linear_factor, ordering, full_values); + + EXPECT(assert_equal(actual1, actual2, tol)); + + // Verify the keys + vector expKeys; + expKeys += l3, l5; + EXPECT(assert_container_equality(expKeys, actual1.keys())); + EXPECT(assert_container_equality(expKeys, actual2.keys())); + + // Verify subset of linearization points + EXPECT(assert_equal(exp_values, actual1.linearizationPoint(), tol)); + EXPECT(assert_equal(exp_values, actual2.linearizationPoint(), tol)); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From 61c7e8760bc722d361fcbddfc7bda349e6dc86ee Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 7 Jun 2012 18:48:40 +0000 Subject: [PATCH 250/914] Fixed linking problem with gtsam_unstable/nonlinear --- gtsam_unstable/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 679551dbe..70333099e 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -32,6 +32,7 @@ set(gtsam_unstable_srcs ${discrete_srcs} ${dynamics_srcs} ${linear_srcs} + ${nonlinear_srcs} ${slam_srcs} ) From d70622abe0e6849dc6a5bb110e0ae8bf2949b0a2 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 7 Jun 2012 20:09:54 +0000 Subject: [PATCH 251/914] Rearranged matlab folders to avoid calling utility functions "examples" --- CMakeLists.txt | 3 ++ examples/CMakeLists.txt | 21 ---------- matlab/CMakeLists.txt | 37 ++++++++++++++++++ .../matlab => matlab}/covarianceEllipse.m | 0 .../matlab => matlab}/covarianceEllipse3D.m | 0 .../examples}/LocalizationExample.m | 0 .../examples}/PlanarSLAMExample.m | 0 .../examples}/PlanarSLAMExample_sampling.m | 0 .../examples}/Pose2SLAMExample.m | 0 .../examples}/Pose2SLAMExample_advanced.m | 0 .../examples}/Pose2SLAMExample_circle.m | 0 .../examples}/Pose2SLAMExample_graph.m | 0 .../examples}/Pose2SLAMwSPCG.m | 0 .../examples}/Pose3SLAMExample_circle.m | 0 .../examples}/Pose3SLAMExample_graph.m | 0 .../matlab => matlab/examples}/VO_Example.m | 0 .../examples}/VisualISAMExample.m | 0 .../examples}/VisualISAMExample_triangle.m | 0 .../examples}/VisualSLAMExample.m | 0 .../examples}/VisualSLAMExample_triangle.m | 0 {examples/matlab => matlab}/iSAMgui.fig | Bin {examples/matlab => matlab}/iSAMgui.m | 0 {examples/matlab => matlab}/load2D.m | 0 {examples/matlab => matlab}/load3D.m | 0 .../matlab => matlab}/plot3DTrajectory.m | 0 {examples/matlab => matlab}/plotCamera.m | 0 {examples/matlab => matlab}/plotPoint2.m | 0 {examples/matlab => matlab}/plotPose2.m | 0 {examples/matlab => matlab}/plotPose3.m | 0 {examples/matlab => matlab}/symbol.m | 0 {tests/matlab => matlab/tests}/CHECK.m | 0 {tests/matlab => matlab/tests}/EQUALITY.m | 0 .../tests}/testJacobianFactor.m | 0 .../tests}/testKalmanFilter.m | 0 {tests/matlab => matlab/tests}/test_gtsam.m | 0 tests/CMakeLists.txt | 12 ------ 36 files changed, 40 insertions(+), 33 deletions(-) create mode 100644 matlab/CMakeLists.txt rename {examples/matlab => matlab}/covarianceEllipse.m (100%) rename {examples/matlab => matlab}/covarianceEllipse3D.m (100%) rename {examples/matlab => matlab/examples}/LocalizationExample.m (100%) rename {examples/matlab => matlab/examples}/PlanarSLAMExample.m (100%) rename {examples/matlab => matlab/examples}/PlanarSLAMExample_sampling.m (100%) rename {examples/matlab => matlab/examples}/Pose2SLAMExample.m (100%) rename {examples/matlab => matlab/examples}/Pose2SLAMExample_advanced.m (100%) rename {examples/matlab => matlab/examples}/Pose2SLAMExample_circle.m (100%) rename {examples/matlab => matlab/examples}/Pose2SLAMExample_graph.m (100%) rename {examples/matlab => matlab/examples}/Pose2SLAMwSPCG.m (100%) rename {examples/matlab => matlab/examples}/Pose3SLAMExample_circle.m (100%) rename {examples/matlab => matlab/examples}/Pose3SLAMExample_graph.m (100%) rename {examples/matlab => matlab/examples}/VO_Example.m (100%) rename {examples/matlab => matlab/examples}/VisualISAMExample.m (100%) rename {examples/matlab => matlab/examples}/VisualISAMExample_triangle.m (100%) rename {examples/matlab => matlab/examples}/VisualSLAMExample.m (100%) rename {examples/matlab => matlab/examples}/VisualSLAMExample_triangle.m (100%) rename {examples/matlab => matlab}/iSAMgui.fig (100%) rename {examples/matlab => matlab}/iSAMgui.m (100%) rename {examples/matlab => matlab}/load2D.m (100%) rename {examples/matlab => matlab}/load3D.m (100%) rename {examples/matlab => matlab}/plot3DTrajectory.m (100%) rename {examples/matlab => matlab}/plotCamera.m (100%) rename {examples/matlab => matlab}/plotPoint2.m (100%) rename {examples/matlab => matlab}/plotPose2.m (100%) rename {examples/matlab => matlab}/plotPose3.m (100%) rename {examples/matlab => matlab}/symbol.m (100%) rename {tests/matlab => matlab/tests}/CHECK.m (100%) rename {tests/matlab => matlab/tests}/EQUALITY.m (100%) rename {tests/matlab => matlab/tests}/testJacobianFactor.m (100%) rename {tests/matlab => matlab/tests}/testKalmanFilter.m (100%) rename {tests/matlab => matlab/tests}/test_gtsam.m (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25ca8d9e2..72270c712 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,6 +131,9 @@ if (GTSAM_BUILD_EXAMPLES) add_subdirectory(examples) endif(GTSAM_BUILD_EXAMPLES) +# Matlab toolbox +add_subdirectory(matlab) + # Build gtsam_unstable if (GTSAM_BUILD_UNSTABLE) add_subdirectory(gtsam_unstable) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 9dada79bc..9f799d294 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -30,24 +30,3 @@ foreach(example_src ${example_srcs} ) endforeach(example_src) -# Install matlab components -if (GTSAM_BUILD_WRAP) - if (GTSAM_INSTALL_MATLAB_TOOLBOX) - # Examples - if (GTSAM_INSTALL_MATLAB_EXAMPLES) - message(STATUS "Installing Matlab Toolbox Examples") - # Matlab files: *.m and *.fig - file(GLOB matlab_examples_m "${GTSAM_SOURCE_ROOT_DIR}/examples/matlab/*.m") - file(GLOB matlab_examples_fig "${GTSAM_SOURCE_ROOT_DIR}/examples/matlab/*.fig") - set(matlab_examples ${matlab_examples_m} ${matlab_examples_fig}) - install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) - - message(STATUS "Installing Matlab Toolbox Examples (Data)") - # Data files: *.graph and *.txt - file(GLOB matlab_examples_data_graph "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.graph") - file(GLOB matlab_examples_data_txt "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.txt") - set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) - install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) - endif (GTSAM_INSTALL_MATLAB_EXAMPLES) - endif (GTSAM_INSTALL_MATLAB_TOOLBOX) -endif () \ No newline at end of file diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt new file mode 100644 index 000000000..9d48a949f --- /dev/null +++ b/matlab/CMakeLists.txt @@ -0,0 +1,37 @@ +# Install matlab components +if (GTSAM_BUILD_WRAP) + if (GTSAM_INSTALL_MATLAB_TOOLBOX) + # Utility functions + message(STATUS "Installing Matlab Utility Functions") + # Matlab files: *.m and *.fig + file(GLOB matlab_utils_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.m") + file(GLOB matlab_utils_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.fig") + set(matlab_utils ${matlab_utils_m} ${matlab_utils_fig}) + install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam) + + # Tests + if (GTSAM_INSTALL_MATLAB_TESTS) + message(STATUS "Installing Matlab Toolbox Tests") + file(GLOB matlab_tests "${GTSAM_SOURCE_ROOT_DIR}/matlab/tests/*.m") + install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/tests) + endif () + + # Examples + if (GTSAM_INSTALL_MATLAB_EXAMPLES) + message(STATUS "Installing Matlab Toolbox Examples") + # Matlab files: *.m and *.fig + file(GLOB matlab_examples_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.m") + file(GLOB matlab_examples_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.fig") + set(matlab_examples ${matlab_examples_m} ${matlab_examples_fig}) + install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) + + message(STATUS "Installing Matlab Toolbox Examples (Data)") + # Data files: *.graph and *.txt + file(GLOB matlab_examples_data_graph "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.graph") + file(GLOB matlab_examples_data_txt "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.txt") + set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) + install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) + endif () + endif () +endif () + diff --git a/examples/matlab/covarianceEllipse.m b/matlab/covarianceEllipse.m similarity index 100% rename from examples/matlab/covarianceEllipse.m rename to matlab/covarianceEllipse.m diff --git a/examples/matlab/covarianceEllipse3D.m b/matlab/covarianceEllipse3D.m similarity index 100% rename from examples/matlab/covarianceEllipse3D.m rename to matlab/covarianceEllipse3D.m diff --git a/examples/matlab/LocalizationExample.m b/matlab/examples/LocalizationExample.m similarity index 100% rename from examples/matlab/LocalizationExample.m rename to matlab/examples/LocalizationExample.m diff --git a/examples/matlab/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m similarity index 100% rename from examples/matlab/PlanarSLAMExample.m rename to matlab/examples/PlanarSLAMExample.m diff --git a/examples/matlab/PlanarSLAMExample_sampling.m b/matlab/examples/PlanarSLAMExample_sampling.m similarity index 100% rename from examples/matlab/PlanarSLAMExample_sampling.m rename to matlab/examples/PlanarSLAMExample_sampling.m diff --git a/examples/matlab/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m similarity index 100% rename from examples/matlab/Pose2SLAMExample.m rename to matlab/examples/Pose2SLAMExample.m diff --git a/examples/matlab/Pose2SLAMExample_advanced.m b/matlab/examples/Pose2SLAMExample_advanced.m similarity index 100% rename from examples/matlab/Pose2SLAMExample_advanced.m rename to matlab/examples/Pose2SLAMExample_advanced.m diff --git a/examples/matlab/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m similarity index 100% rename from examples/matlab/Pose2SLAMExample_circle.m rename to matlab/examples/Pose2SLAMExample_circle.m diff --git a/examples/matlab/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m similarity index 100% rename from examples/matlab/Pose2SLAMExample_graph.m rename to matlab/examples/Pose2SLAMExample_graph.m diff --git a/examples/matlab/Pose2SLAMwSPCG.m b/matlab/examples/Pose2SLAMwSPCG.m similarity index 100% rename from examples/matlab/Pose2SLAMwSPCG.m rename to matlab/examples/Pose2SLAMwSPCG.m diff --git a/examples/matlab/Pose3SLAMExample_circle.m b/matlab/examples/Pose3SLAMExample_circle.m similarity index 100% rename from examples/matlab/Pose3SLAMExample_circle.m rename to matlab/examples/Pose3SLAMExample_circle.m diff --git a/examples/matlab/Pose3SLAMExample_graph.m b/matlab/examples/Pose3SLAMExample_graph.m similarity index 100% rename from examples/matlab/Pose3SLAMExample_graph.m rename to matlab/examples/Pose3SLAMExample_graph.m diff --git a/examples/matlab/VO_Example.m b/matlab/examples/VO_Example.m similarity index 100% rename from examples/matlab/VO_Example.m rename to matlab/examples/VO_Example.m diff --git a/examples/matlab/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m similarity index 100% rename from examples/matlab/VisualISAMExample.m rename to matlab/examples/VisualISAMExample.m diff --git a/examples/matlab/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m similarity index 100% rename from examples/matlab/VisualISAMExample_triangle.m rename to matlab/examples/VisualISAMExample_triangle.m diff --git a/examples/matlab/VisualSLAMExample.m b/matlab/examples/VisualSLAMExample.m similarity index 100% rename from examples/matlab/VisualSLAMExample.m rename to matlab/examples/VisualSLAMExample.m diff --git a/examples/matlab/VisualSLAMExample_triangle.m b/matlab/examples/VisualSLAMExample_triangle.m similarity index 100% rename from examples/matlab/VisualSLAMExample_triangle.m rename to matlab/examples/VisualSLAMExample_triangle.m diff --git a/examples/matlab/iSAMgui.fig b/matlab/iSAMgui.fig similarity index 100% rename from examples/matlab/iSAMgui.fig rename to matlab/iSAMgui.fig diff --git a/examples/matlab/iSAMgui.m b/matlab/iSAMgui.m similarity index 100% rename from examples/matlab/iSAMgui.m rename to matlab/iSAMgui.m diff --git a/examples/matlab/load2D.m b/matlab/load2D.m similarity index 100% rename from examples/matlab/load2D.m rename to matlab/load2D.m diff --git a/examples/matlab/load3D.m b/matlab/load3D.m similarity index 100% rename from examples/matlab/load3D.m rename to matlab/load3D.m diff --git a/examples/matlab/plot3DTrajectory.m b/matlab/plot3DTrajectory.m similarity index 100% rename from examples/matlab/plot3DTrajectory.m rename to matlab/plot3DTrajectory.m diff --git a/examples/matlab/plotCamera.m b/matlab/plotCamera.m similarity index 100% rename from examples/matlab/plotCamera.m rename to matlab/plotCamera.m diff --git a/examples/matlab/plotPoint2.m b/matlab/plotPoint2.m similarity index 100% rename from examples/matlab/plotPoint2.m rename to matlab/plotPoint2.m diff --git a/examples/matlab/plotPose2.m b/matlab/plotPose2.m similarity index 100% rename from examples/matlab/plotPose2.m rename to matlab/plotPose2.m diff --git a/examples/matlab/plotPose3.m b/matlab/plotPose3.m similarity index 100% rename from examples/matlab/plotPose3.m rename to matlab/plotPose3.m diff --git a/examples/matlab/symbol.m b/matlab/symbol.m similarity index 100% rename from examples/matlab/symbol.m rename to matlab/symbol.m diff --git a/tests/matlab/CHECK.m b/matlab/tests/CHECK.m similarity index 100% rename from tests/matlab/CHECK.m rename to matlab/tests/CHECK.m diff --git a/tests/matlab/EQUALITY.m b/matlab/tests/EQUALITY.m similarity index 100% rename from tests/matlab/EQUALITY.m rename to matlab/tests/EQUALITY.m diff --git a/tests/matlab/testJacobianFactor.m b/matlab/tests/testJacobianFactor.m similarity index 100% rename from tests/matlab/testJacobianFactor.m rename to matlab/tests/testJacobianFactor.m diff --git a/tests/matlab/testKalmanFilter.m b/matlab/tests/testKalmanFilter.m similarity index 100% rename from tests/matlab/testKalmanFilter.m rename to matlab/tests/testKalmanFilter.m diff --git a/tests/matlab/test_gtsam.m b/matlab/tests/test_gtsam.m similarity index 100% rename from tests/matlab/test_gtsam.m rename to matlab/tests/test_gtsam.m diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ef9660c90..4d29dd557 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,15 +40,3 @@ if (GTSAM_BUILD_TIMING) "${tests_local_libs}" "gtsam-static;CppUnitLite" "${tests_exclude}" # Pass in linking and exclusion lists ${is_test}) endif (GTSAM_BUILD_TIMING) - -# Install matlab components -if (GTSAM_BUILD_WRAP) - if (GTSAM_INSTALL_MATLAB_TOOLBOX) - # Tests - if (GTSAM_INSTALL_MATLAB_TESTS) - message(STATUS "Installing Matlab Toolbox Tests") - file(GLOB matlab_tests "${GTSAM_SOURCE_ROOT_DIR}/tests/matlab/*.m") - install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/tests) - endif () - endif () -endif () \ No newline at end of file From 1a2be371fe33589effba1c173167fc3ad651fb73 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 7 Jun 2012 20:30:19 +0000 Subject: [PATCH 252/914] Removed empty folders From 14c38918c05835035dff2321211ecb3d4d45fa0c Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 7 Jun 2012 20:42:13 +0000 Subject: [PATCH 253/914] Store flags for the library targets --- gtsam/CMakeLists.txt | 4 ++++ gtsam_unstable/CMakeLists.txt | 1 + 2 files changed, 5 insertions(+) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index eaf00d8d2..ac4cd8fe2 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -92,6 +92,7 @@ if (GTSAM_BUILD_STATIC_LIBRARY) VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) install(TARGETS gtsam-static ARCHIVE DESTINATION lib) + set(gtsam-lib "gtsam-static") endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) @@ -104,6 +105,9 @@ if (GTSAM_BUILD_SHARED_LIBRARY) VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) install(TARGETS gtsam-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) + if (NOT GTSAM_BUILD_STATIC_LIBRARY) + set(gtsam-lib "gtsam-shared") + endif() endif(GTSAM_BUILD_SHARED_LIBRARY) # Create the matlab toolbox for the gtsam library diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 70333099e..7a7af3232 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -53,6 +53,7 @@ set_target_properties(gtsam_unstable-static PROPERTIES VERSION ${gtsam_unstable_version} SOVERSION ${gtsam_unstable_soversion}) target_link_libraries(gtsam_unstable-static gtsam-static) +set(gtsam_unstable-lib "gtsam_unstable-static") install(TARGETS gtsam_unstable-static ARCHIVE DESTINATION lib) if (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) From 922822d0b97525ec92b8faf99194692ca3a4f315 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 21:52:15 +0000 Subject: [PATCH 254/914] updated paths --- matlab/examples/Pose2SLAMExample_graph.m | 2 +- matlab/examples/Pose3SLAMExample_graph.m | 8 ++++---- matlab/examples/VO_Example.m | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index 5564ef30e..7a8644432 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -12,7 +12,7 @@ %% Initialize graph, initial estimate, and odometry noise model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 5*pi/180]); -[graph,initial]=load2D('../Data/w100-odom.graph',model); +[graph,initial]=load2D('../../examples/Data/w100-odom.graph',model); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 diff --git a/matlab/examples/Pose3SLAMExample_graph.m b/matlab/examples/Pose3SLAMExample_graph.m index 115e4341c..acaf2c920 100644 --- a/matlab/examples/Pose3SLAMExample_graph.m +++ b/matlab/examples/Pose3SLAMExample_graph.m @@ -11,13 +11,13 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N = 2500; -% filename = '../Data/sphere_smallnoise.graph'; -% filename = '../Data/sphere2500_groundtruth.txt'; -filename = '../Data/sphere2500.txt'; +% filename = '../../examples/Data/sphere_smallnoise.graph'; +% filename = '../../examples/Data/sphere2500_groundtruth.txt'; +filename = '../../examples/Data/sphere2500.txt'; %% Initialize graph, initial estimate, and odometry noise -[graph,initial]=load3D(filename,model,true,N); model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +[graph,initial]=load3D(filename,model,true,N); %% Plot Initial Estimate figure(1);clf diff --git a/matlab/examples/VO_Example.m b/matlab/examples/VO_Example.m index fa1512e00..1b2db3bf3 100644 --- a/matlab/examples/VO_Example.m +++ b/matlab/examples/VO_Example.m @@ -12,7 +12,7 @@ %% Load calibration % format: fx fy skew cx cy baseline -calib = dlmread('../Data/VO_calibration.txt'); +calib = dlmread('../../examples/Data/VO_calibration.txt'); K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]); @@ -24,7 +24,7 @@ initial = visualSLAMValues; %% load the initial poses from VO % row format: camera_id 4x4 pose (row, major) fprintf(1,'Reading data\n'); -cameras = dlmread('../Data/VO_camera_poses.txt'); +cameras = dlmread('../../examples/Data/VO_camera_poses.txt'); for i=1:size(cameras,1) pose = gtsamPose3(reshape(cameras(i,2:17),4,4)'); initial.insertPose(symbol('x',cameras(i,1)),pose); @@ -32,7 +32,7 @@ end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z -measurements = dlmread('../Data/VO_stereo_factors.txt'); +measurements = dlmread('../../examples/Data/VO_stereo_factors.txt'); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) From b55e2919c32294dd28edec53f6672909153480bb Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 7 Jun 2012 21:52:37 +0000 Subject: [PATCH 255/914] formatting/comments only --- gtsam/geometry/Cal3_S2.cpp | 8 ++++-- gtsam/geometry/Cal3_S2.h | 4 +-- gtsam/geometry/PinholeCamera.h | 52 +++++++++++++++++----------------- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/gtsam/geometry/Cal3_S2.cpp b/gtsam/geometry/Cal3_S2.cpp index 709e03493..88115929a 100644 --- a/gtsam/geometry/Cal3_S2.cpp +++ b/gtsam/geometry/Cal3_S2.cpp @@ -15,12 +15,12 @@ * @author Frank Dellaert */ +#include + #include #include #include -#include - namespace gtsam { using namespace std; @@ -51,7 +51,11 @@ namespace gtsam { } /* ************************************************************************* */ + void Cal3_S2::print(const std::string& s) const { + gtsam::print(matrix(), s); + } + /* ************************************************************************* */ bool Cal3_S2::equals(const Cal3_S2& K, double tol) const { if (fabs(fx_ - K.fx_) > tol) return false; if (fabs(fy_ - K.fy_) > tol) return false; diff --git a/gtsam/geometry/Cal3_S2.h b/gtsam/geometry/Cal3_S2.h index 12838b667..9d6cb4fbf 100644 --- a/gtsam/geometry/Cal3_S2.h +++ b/gtsam/geometry/Cal3_S2.h @@ -75,9 +75,7 @@ namespace gtsam { /// @{ /// print with optional string - void print(const std::string& s = "") const { - gtsam::print(matrix(), s); - } + void print(const std::string& s = "Cal3_S2") const; /// Check if equal up to specified tolerance bool equals(const Cal3_S2& K, double tol = 10e-9) const; diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index 7dec508e0..a267a20b0 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -40,7 +40,7 @@ namespace gtsam { class PinholeCamera : public DerivedValue > { private: Pose3 pose_; - Calibration k_; + Calibration K_; public: @@ -54,10 +54,10 @@ namespace gtsam { explicit PinholeCamera(const Pose3& pose):pose_(pose){} /** constructor with pose and calibration */ - PinholeCamera(const Pose3& pose, const Calibration& k):pose_(pose),k_(k) {} + PinholeCamera(const Pose3& pose, const Calibration& k):pose_(pose),K_(k) {} /** alternative constructor with pose and calibration */ - PinholeCamera(const Calibration& k, const Pose3& pose):pose_(pose),k_(k) {} + PinholeCamera(const Calibration& k, const Pose3& pose):pose_(pose),K_(k) {} /// @} /// @name Advanced Constructors @@ -66,11 +66,11 @@ namespace gtsam { explicit PinholeCamera(const Vector &v){ pose_ = Pose3::Expmap(v.head(Pose3::Dim())); if ( v.size() > Pose3::Dim()) { - k_ = Calibration(v.tail(Calibration::Dim())); + K_ = Calibration(v.tail(Calibration::Dim())); } } - PinholeCamera(const Vector &v, const Vector &k) : pose_(Pose3::Expmap(v)),k_(k){} + PinholeCamera(const Vector &v, const Vector &k) : pose_(Pose3::Expmap(v)),K_(k){} /// @} /// @name Standard Interface @@ -85,19 +85,19 @@ namespace gtsam { inline const Pose3& pose() const { return pose_; } /// return calibration - inline Calibration& calibration() { return k_; } + inline Calibration& calibration() { return K_; } /// return calibration - inline const Calibration& calibration() const { return k_; } + inline const Calibration& calibration() const { return K_; } /// compose two cameras inline const PinholeCamera compose(const Pose3 &c) const { - return PinholeCamera( pose_ * c, k_ ) ; + return PinholeCamera( pose_ * c, K_ ) ; } /// inverse inline const PinholeCamera inverse() const { - return PinholeCamera( pose_.inverse(), k_ ) ; + return PinholeCamera( pose_.inverse(), K_ ) ; } /// @} @@ -107,13 +107,13 @@ namespace gtsam { /// assert equality up to a tolerance bool equals (const PinholeCamera &camera, double tol = 1e-9) const { return pose_.equals(camera.pose(), tol) && - k_.equals(camera.calibration(), tol) ; + K_.equals(camera.calibration(), tol) ; } /// print - void print(const std::string& s = "") const { - pose_.print("pose3"); - k_.print("calibration"); + void print(const std::string& s = "PinholeCamera") const { + pose_.print(s+".pose"); + K_.print(s+".calibration"); } /// @} @@ -138,7 +138,7 @@ namespace gtsam { } /// Lie group dimensionality - inline size_t dim() const { return pose_.dim() + k_.dim(); } + inline size_t dim() const { return pose_.dim() + K_.dim(); } /// Lie group dimensionality inline static size_t Dim() { return Pose3::Dim() + Calibration::Dim(); } @@ -202,7 +202,7 @@ namespace gtsam { inline std::pair projectSafe(const Point3& pw) const { const Point3 pc = pose_.transform_to(pw) ; const Point2 pn = project_to_camera(pc) ; - return std::make_pair(k_.uncalibrate(pn), pc.z()>0); + return std::make_pair(K_.uncalibrate(pn), pc.z()>0); } /** project a point from world coordinate to the image @@ -220,7 +220,7 @@ namespace gtsam { const Point3 pc = pose_.transform_to(pw) ; if ( pc.z() <= 0 ) throw CheiralityException(); const Point2 pn = project_to_camera(pc) ; - return k_.uncalibrate(pn); + return K_.uncalibrate(pn); } // world to camera coordinate @@ -234,7 +234,7 @@ namespace gtsam { // uncalibration Matrix Hk, Hi; // 2*2 - const Point2 pi = k_.uncalibrate(pn, Hk, Hi); + const Point2 pi = K_.uncalibrate(pn, Hk, Hi); // chain the jacobian matrices const Matrix tmp = Hi*Hn ; @@ -257,7 +257,7 @@ namespace gtsam { const Point3 pc = pose_.transform_to(pw) ; if ( pc.z() <= 0 ) throw CheiralityException(); const Point2 pn = project_to_camera(pc) ; - return k_.uncalibrate(pn); + return K_.uncalibrate(pn); } Matrix Htmp1, Htmp2, Htmp3; @@ -276,7 +276,7 @@ namespace gtsam { */ inline Point3 backproject(const Point2& pi, double scale) const { - const Point2 pn = k_.calibrate(pi); + const Point2 pn = K_.calibrate(pi); const Point3 pc(pn.x()*scale, pn.y()*scale, scale); return pose_.transform_from(pc); } @@ -297,8 +297,8 @@ namespace gtsam { if(H1) { // Add columns of zeros to Jacobian for calibration Matrix& H1r(*H1); - H1r.conservativeResize(Eigen::NoChange, pose_.dim() + k_.dim()); - H1r.block(0, pose_.dim(), 1, k_.dim()) = Matrix::Zero(1, k_.dim()); + H1r.conservativeResize(Eigen::NoChange, pose_.dim() + K_.dim()); + H1r.block(0, pose_.dim(), 1, K_.dim()) = Matrix::Zero(1, K_.dim()); } return result; } @@ -315,8 +315,8 @@ namespace gtsam { if(H1) { // Add columns of zeros to Jacobian for calibration Matrix& H1r(*H1); - H1r.conservativeResize(Eigen::NoChange, pose_.dim() + k_.dim()); - H1r.block(0, pose_.dim(), 1, k_.dim()) = Matrix::Zero(1, k_.dim()); + H1r.conservativeResize(Eigen::NoChange, pose_.dim() + K_.dim()); + H1r.block(0, pose_.dim(), 1, K_.dim()) = Matrix::Zero(1, K_.dim()); } return result; } @@ -334,8 +334,8 @@ namespace gtsam { if(H1) { // Add columns of zeros to Jacobian for calibration Matrix& H1r(*H1); - H1r.conservativeResize(Eigen::NoChange, pose_.dim() + k_.dim()); - H1r.block(0, pose_.dim(), 1, k_.dim()) = Matrix::Zero(1, k_.dim()); + H1r.conservativeResize(Eigen::NoChange, pose_.dim() + K_.dim()); + H1r.block(0, pose_.dim(), 1, K_.dim()) = Matrix::Zero(1, K_.dim()); } if(H2) { // Add columns of zeros to Jacobian for calibration @@ -368,7 +368,7 @@ private: void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Value); ar & BOOST_SERIALIZATION_NVP(pose_); - ar & BOOST_SERIALIZATION_NVP(k_); + ar & BOOST_SERIALIZATION_NVP(K_); } /// @} }; From 9771f0ccc9c2402d00c66dc109a526e55807a7a9 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Thu, 7 Jun 2012 22:10:52 +0000 Subject: [PATCH 256/914] Minor Documentation Fix --- gtsam/discrete/Potentials.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/discrete/Potentials.h b/gtsam/discrete/Potentials.h index d8c5d9c3b..fe22288f4 100644 --- a/gtsam/discrete/Potentials.h +++ b/gtsam/discrete/Potentials.h @@ -69,7 +69,7 @@ namespace gtsam { size_t cardinality(Index j) const { return cardinalities_.at(j);} - /* + /** * @brief Permutes the keys in Potentials * * This permutes the Indices and performs necessary re-ordering of ADD. From b2f2db4fdd992cb4f510d6c10ee0c6f9bc712a90 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Thu, 7 Jun 2012 22:13:51 +0000 Subject: [PATCH 257/914] j2 not supported by mex in GTSAM_BUILD_MEX_BINARY_FLAGS --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 72270c712..8daa00fce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,7 @@ set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTR # Flags for building/installing mex files option(GTSAM_BUILD_MEX_BIN "Enable/Disable building of matlab mex files" OFF) option(GTSAM_INSTALL_MEX_BIN "Enable/Disable installing matlab mex binaries" OFF) -set(GTSAM_BUILD_MEX_BINARY_FLAGS "-j2" CACHE STRING "Flags for running make on toolbox MEX files") +set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Flags for running make on toolbox MEX files") set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)") # Flags for choosing default packaging tools From 22b1002703d928f110b7c07a70bc1d444ea771d9 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Thu, 7 Jun 2012 22:14:03 +0000 Subject: [PATCH 258/914] New test for DiscreteMarginals --- gtsam/discrete/Assignment.h | 4 +- gtsam/discrete/DiscreteMarginals.h | 2 - .../discrete/tests/testDiscreteMarginals.cpp | 43 +++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/gtsam/discrete/Assignment.h b/gtsam/discrete/Assignment.h index 06e2ac137..2e84485dd 100644 --- a/gtsam/discrete/Assignment.h +++ b/gtsam/discrete/Assignment.h @@ -29,7 +29,7 @@ namespace gtsam { * Assigns to each label a value. Implemented as a simple map. * A discrete factor takes an Assignment and returns a value. */ - template + template class Assignment: public std::map { public: void print(const std::string& s = "Assignment: ") const { @@ -42,6 +42,6 @@ namespace gtsam { bool equals(const Assignment& other, double tol = 1e-9) const { return (*this == other); } - }; + }; //Assignment } // namespace gtsam diff --git a/gtsam/discrete/DiscreteMarginals.h b/gtsam/discrete/DiscreteMarginals.h index 99176e58c..fdc3398da 100644 --- a/gtsam/discrete/DiscreteMarginals.h +++ b/gtsam/discrete/DiscreteMarginals.h @@ -44,8 +44,6 @@ namespace gtsam { typedef JunctionTree DiscreteJT; GenericMultifrontalSolver solver(graph); bayesTree_ = *solver.eliminate(&EliminateDiscrete); - //bayesTree_.print(); - cout << "Discrete Marginal Constructor Finished" << endl; } /** Compute the marginal of a single variable */ diff --git a/gtsam/discrete/tests/testDiscreteMarginals.cpp b/gtsam/discrete/tests/testDiscreteMarginals.cpp index 1b5963864..ad35e131e 100644 --- a/gtsam/discrete/tests/testDiscreteMarginals.cpp +++ b/gtsam/discrete/tests/testDiscreteMarginals.cpp @@ -51,6 +51,49 @@ TEST_UNSAFE( DiscreteMarginals, UGM_small ) { Vector actualCvector = marginals.marginalProbabilities(Cathy); EXPECT(assert_equal(Vector_(2, 0.359631, 0.640369), actualCvector, 1e-6)); + + actualCvector = marginals.marginalProbabilities(Mark); + EXPECT(assert_equal(Vector_(2, 0.48628, 0.51372), actualCvector, 1e-6)); +} + +TEST_UNSAFE( DiscreteMarginals, UGM_chain ) { + + const int nrNodes = 10; + const size_t nrStates = 7; + + // define variables + vector nodes; + for (int i = 0; i < nrNodes; i++) { + DiscreteKey dk(i, nrStates); + nodes.push_back(dk); + } + + // create graph + DiscreteFactorGraph graph; + + // add node potentials + graph.add(nodes[0], ".3 .6 .1 0 0 0 0"); + for (int i = 1; i < nrNodes; i++) + graph.add(nodes[i], "1 1 1 1 1 1 1"); + + const std::string edgePotential = ".08 .9 .01 0 0 0 .01 " + ".03 .95 .01 0 0 0 .01 " + ".06 .06 .75 .05 .05 .02 .01 " + "0 0 0 .3 .6 .09 .01 " + "0 0 0 .02 .95 .02 .01 " + "0 0 0 .01 .01 .97 .01 " + "0 0 0 0 0 0 1"; + + // add edge potentials + for (int i = 0; i < nrNodes - 1; i++) + graph.add(nodes[i] & nodes[i + 1], edgePotential); + + DiscreteMarginals marginals(graph); + DiscreteFactor::shared_ptr actualC = marginals(nodes[2].first); + DiscreteFactor::Values values; + + values[nodes[2].first] = 0; + EXPECT_DOUBLES_EQUAL( 0.03426, (*actualC)(values), 1e-4); } /* ************************************************************************* */ From 4213c5d4fd8098a2c1117b030f5a1258d1d5f8d4 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Thu, 7 Jun 2012 22:15:13 +0000 Subject: [PATCH 259/914] GTSAM_BUILD_MEX_BINARY_FLAGS now included in mexFlags for wrap. useful for debug flags --- gtsam/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index ac4cd8fe2..d81cee87d 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -128,7 +128,7 @@ if (GTSAM_BUILD_WRAP) endif() # Generate, build and install toolbox - set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${GTSAM_LIB_DIR} -lgtsam") + set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${GTSAM_LIB_DIR} -lgtsam") # Macro to handle details of setting up targets wrap_library(gtsam "${mexFlags}" "../") From b5ea7e1ba04f979b041ad7ffe9df4d142b38b4c2 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Thu, 7 Jun 2012 22:54:47 +0000 Subject: [PATCH 260/914] Fixes to DiscreteConditional --- gtsam/discrete/DiscreteConditional.cpp | 9 ++++++++- gtsam/discrete/DiscreteConditional.h | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gtsam/discrete/DiscreteConditional.cpp b/gtsam/discrete/DiscreteConditional.cpp index ca8f13ca3..f9d3823d6 100644 --- a/gtsam/discrete/DiscreteConditional.cpp +++ b/gtsam/discrete/DiscreteConditional.cpp @@ -192,7 +192,14 @@ namespace gtsam { return sampled; return 0; - } + } + + /* ******************************************************************************** */ + void DiscreteConditional::permuteWithInverse(const Permutation& inversePermutation){ + IndexConditional::permuteWithInverse(inversePermutation); + Potentials::permute(inversePermutation); + } + /* ******************************************************************************** */ diff --git a/gtsam/discrete/DiscreteConditional.h b/gtsam/discrete/DiscreteConditional.h index f6603c195..6c724bf7f 100644 --- a/gtsam/discrete/DiscreteConditional.h +++ b/gtsam/discrete/DiscreteConditional.h @@ -111,6 +111,11 @@ namespace gtsam { /// sample in place, stores result in partial solution void sampleInPlace(Values& parentsValues) const; + /** + * Permutes both IndexConditional and Potentials. + */ + void permuteWithInverse(const Permutation& inversePermutation); + /// @} }; From b9927a1b7ee99fa25e048cb5d99db5246478e76e Mon Sep 17 00:00:00 2001 From: Summit Patel Date: Thu, 7 Jun 2012 23:08:43 +0000 Subject: [PATCH 261/914] Fixed Doxygen warnings. --- gtsam/base/LieScalar.h | 2 +- gtsam/base/LieVector.h | 2 +- gtsam/base/Matrix.h | 10 +++--- gtsam/base/TestableAssertions.h | 2 +- gtsam/base/Vector.h | 32 +++++++++---------- gtsam/discrete/DiscreteConditional.h | 4 +-- gtsam/discrete/DiscreteMarginals.h | 2 +- gtsam/geometry/Rot2.h | 2 +- gtsam/geometry/Rot3.h | 2 +- gtsam/inference/EliminationTree.h | 2 +- gtsam/inference/Factor.h | 2 +- gtsam/inference/FactorGraph.h | 4 +-- gtsam/linear/GaussianFactorGraph.h | 6 ++-- gtsam/linear/GaussianMultifrontalSolver.h | 2 +- gtsam/linear/GaussianSequentialSolver.h | 2 +- gtsam/linear/HessianFactor.h | 4 +-- gtsam/linear/JacobianFactorGraph.cpp | 2 +- gtsam/linear/JacobianFactorGraph.h | 2 +- gtsam/linear/VectorValues.h | 6 ++-- gtsam/nonlinear/DoglegOptimizer.cpp | 2 +- gtsam/nonlinear/DoglegOptimizer.h | 2 +- gtsam/nonlinear/DoglegOptimizerImpl.h | 12 +++---- gtsam/nonlinear/GaussNewtonOptimizer.cpp | 2 +- gtsam/nonlinear/GaussNewtonOptimizer.h | 2 +- .../nonlinear/LevenbergMarquardtOptimizer.cpp | 2 +- gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 2 +- gtsam/nonlinear/NonlinearOptimizer.h | 2 +- 27 files changed, 58 insertions(+), 58 deletions(-) diff --git a/gtsam/base/LieScalar.h b/gtsam/base/LieScalar.h index 505f06921..3b9c7037a 100644 --- a/gtsam/base/LieScalar.h +++ b/gtsam/base/LieScalar.h @@ -36,7 +36,7 @@ namespace gtsam { /** access the underlying value */ double value() const { return d_; } - /** print @param s optional string naming the object */ + /** print @param name optional string naming the object */ inline void print(const std::string& name="") const { std::cout << name << ": " << d_ << std::endl; } diff --git a/gtsam/base/LieVector.h b/gtsam/base/LieVector.h index 82455e173..ef31e93cc 100644 --- a/gtsam/base/LieVector.h +++ b/gtsam/base/LieVector.h @@ -52,7 +52,7 @@ struct LieVector : public Vector, public DerivedValue { return static_cast(*this); } - /** print @param s optional string naming the object */ + /** print @param name optional string naming the object */ inline void print(const std::string& name="") const { gtsam::print(vector(), name); } diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index 553fb5b89..adb4ee36b 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -217,8 +217,8 @@ void insertSub(Matrix& fullMatrix, const Matrix& subMatrix, size_t i, size_t j); /** * Extracts a column view from a matrix that avoids a copy - * @param matrix to extract column from - * @param index of the column + * @param A matrix to extract column from + * @param j index of the column * @return a const view of the matrix */ template @@ -228,8 +228,8 @@ const typename MATRIX::ConstColXpr column(const MATRIX& A, size_t j) { /** * Extracts a row view from a matrix that avoids a copy - * @param matrix to extract row from - * @param index of the row + * @param A matrix to extract row from + * @param j index of the row * @return a const view of the matrix */ template @@ -362,7 +362,7 @@ Vector backSubstituteUpper(const Vector& b, const Matrix& U, bool unit=false); * @param unit, set true if unit triangular * @return the solution x of L*x=b */ -Vector backSubstituteLower(const Matrix& L, const Vector& d, bool unit=false); +Vector backSubstituteLower(const Matrix& L, const Vector& b, bool unit=false); /** * create a matrix by stacking other matrices diff --git a/gtsam/base/TestableAssertions.h b/gtsam/base/TestableAssertions.h index dad1c6d20..10daafbb4 100644 --- a/gtsam/base/TestableAssertions.h +++ b/gtsam/base/TestableAssertions.h @@ -81,7 +81,7 @@ bool assert_equal(const V& expected, const boost::optional& actual, do /** * Version of assert_equals to work with vectors - * @DEPRECIATED: use container equals instead + * \deprecated: use container equals instead */ template bool assert_equal(const std::vector& expected, const std::vector& actual, double tol = 1e-9) { diff --git a/gtsam/base/Vector.h b/gtsam/base/Vector.h index 6019bbd33..0de7f519a 100644 --- a/gtsam/base/Vector.h +++ b/gtsam/base/Vector.h @@ -73,8 +73,8 @@ Vector Vector_(const std::vector& data); /** * Create vector initialized to a constant value - * @param size - * @param constant value + * @param n is the size of the vector + * @param value is a constant value to insert into the vector */ Vector repeat(size_t n, double value); @@ -82,7 +82,7 @@ Vector repeat(size_t n, double value); * Create basis vector of dimension n, * with a constant in spot i * @param n is the size of the vector - * @param index of the one + * @param i index of the one * @param value is the value to insert into the vector * @return delta vector */ @@ -92,20 +92,20 @@ Vector delta(size_t n, size_t i, double value); * Create basis vector of dimension n, * with one in spot i * @param n is the size of the vector - * @param index of the one + * @param i index of the one * @return basis vector */ inline Vector basis(size_t n, size_t i) { return delta(n, i, 1.0); } /** * Create zero vector - * @param size + * @param n size */ inline Vector zero(size_t n) { return Vector::Zero(n);} /** * Create vector initialized to ones - * @param size + * @param n size */ inline Vector ones(size_t n) { return Vector::Ones(n); } @@ -249,35 +249,35 @@ double sum(const Vector &a); /** * Calculates L2 norm for a vector * modeled after boost.ublas for compatibility - * @param vector + * @param v vector * @return the L2 norm */ double norm_2(const Vector& v); /** - * elementwise reciprocal of vector elements + * Elementwise reciprocal of vector elements * @param a vector * @return [1/a(i)] */ Vector reciprocal(const Vector &a); /** - * elementwise sqrt of vector elements - * @param a vector + * Elementwise sqrt of vector elements + * @param v is a vector * @return [sqrt(a(i))] */ Vector esqrt(const Vector& v); /** - * absolut values of vector elements - * @param a vector + * Absolute values of vector elements + * @param v is a vector * @return [abs(a(i))] */ Vector abs(const Vector& v); /** - * return the max element of a vector - * @param a vector + * Return the max element of a vector + * @param a is a vector * @return max(a) */ double max(const Vector &a); @@ -300,13 +300,13 @@ inline double inner_prod(const V1 &a, const V2& b) { /** * BLAS Level 1 scal: x <- alpha*x - * @DEPRECIATED: use operators instead + * \deprecated: use operators instead */ inline void scal(double alpha, Vector& x) { x *= alpha; } /** * BLAS Level 1 axpy: y <- alpha*x + y - * @DEPRECIATED: use operators instead + * \deprecated: use operators instead */ template inline void axpy(double alpha, const V1& x, V2& y) { diff --git a/gtsam/discrete/DiscreteConditional.h b/gtsam/discrete/DiscreteConditional.h index 6c724bf7f..c95cc36d6 100644 --- a/gtsam/discrete/DiscreteConditional.h +++ b/gtsam/discrete/DiscreteConditional.h @@ -89,14 +89,14 @@ namespace gtsam { /** * solve a conditional - * @param parentsAssignment Known values of the parents + * @param parentsValues Known values of the parents * @return MPE value of the child (1 frontal variable). */ size_t solve(const Values& parentsValues) const; /** * sample - * @param parentsAssignment Known values of the parents + * @param parentsValues Known values of the parents * @return sample from conditional */ size_t sample(const Values& parentsValues) const; diff --git a/gtsam/discrete/DiscreteMarginals.h b/gtsam/discrete/DiscreteMarginals.h index fdc3398da..1e89286a8 100644 --- a/gtsam/discrete/DiscreteMarginals.h +++ b/gtsam/discrete/DiscreteMarginals.h @@ -55,7 +55,7 @@ namespace gtsam { } /** Compute the marginal of a single variable - * @param KEY DiscreteKey of the Variable + * @param key DiscreteKey of the Variable * @return Vector of marginal probabilities */ Vector marginalProbabilities(const DiscreteKey& key) const { diff --git a/gtsam/geometry/Rot2.h b/gtsam/geometry/Rot2.h index 9528934a0..d0f3e4c14 100644 --- a/gtsam/geometry/Rot2.h +++ b/gtsam/geometry/Rot2.h @@ -83,7 +83,7 @@ namespace gtsam { /** * Named constructor with derivative * Calculate relative bearing to a landmark in local coordinate frame - * @param point 2D location of landmark + * @param d 2D location of landmark * @param H optional reference for Jacobian * @return 2D rotation \in SO(2) */ diff --git a/gtsam/geometry/Rot3.h b/gtsam/geometry/Rot3.h index 0c6b31a81..c0fbfc999 100644 --- a/gtsam/geometry/Rot3.h +++ b/gtsam/geometry/Rot3.h @@ -394,7 +394,7 @@ namespace gtsam { * such that A = R*Q = R*Qz'*Qy'*Qx'. When A is a rotation matrix, R will * be the identity and Q is a yaw-pitch-roll decomposition of A. * The implementation uses Givens rotations and is based on Hartley-Zisserman. - * @param a 3 by 3 matrix A=RQ + * @param A 3 by 3 matrix A=RQ * @return an upper triangular matrix R * @return a vector [thetax, thetay, thetaz] in radians. */ diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index 0b01f0586..eb45deaf0 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -157,7 +157,7 @@ public: * disconnected graphs, a workaround is to create zero-information factors to * bridge the disconnects. To do this, create any factor type (e.g. * BetweenFactor or RangeFactor) with the noise model - * \ref sharedPrecision(dim, 0.0), where \c dim is the appropriate + * sharedPrecision(dim, 0.0), where \c dim is the appropriate * dimensionality for that factor. */ struct DisconnectedGraphException : public std::exception { diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index 87c1f3860..b73eff9d0 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -45,7 +45,7 @@ template class Conditional; * typedefs to refer to the associated conditional and shared_ptr types of the * derived class. See IndexFactor, JacobianFactor, etc. for examples. * - * This class is \bold{not} virtual for performance reasons - derived symbolic classes, + * This class is \b not virtual for performance reasons - derived symbolic classes, * IndexFactor and IndexConditional, need to be created and destroyed quickly * during symbolic elimination. GaussianFactor and NonlinearFactor are virtual. * \nosubgrouping diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 33cdd02a1..90e9e8a1f 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -245,8 +245,8 @@ template class BayesTree; /** * static function that combines two factor graphs - * @param const &fg1 Linear factor graph - * @param const &fg2 Linear factor graph + * @param fg1 Linear factor graph + * @param fg2 Linear factor graph * @return a new combined factor graph */ template diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 8a5fe47e7..07c2e94ad 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -151,9 +151,9 @@ namespace gtsam { } /** - * static function that combines two factor graphs - * @param const &lfg1 Linear factor graph - * @param const &lfg2 Linear factor graph + * Static function that combines two factor graphs. + * @param lfg1 Linear factor graph + * @param lfg2 Linear factor graph * @return a new combined factor graph */ static GaussianFactorGraph combine2(const GaussianFactorGraph& lfg1, diff --git a/gtsam/linear/GaussianMultifrontalSolver.h b/gtsam/linear/GaussianMultifrontalSolver.h index 6adde1aa5..a38bb3161 100644 --- a/gtsam/linear/GaussianMultifrontalSolver.h +++ b/gtsam/linear/GaussianMultifrontalSolver.h @@ -116,7 +116,7 @@ public: * all of the other variables. This function returns the result as a mean * vector and covariance matrix. Compared to marginalCanonical, which * returns a GaussianConditional, this function back-substitutes the R factor - * to obtain the mean, then computes \Sigma = (R^T * R)^-1. + * to obtain the mean, then computes \f$ \Sigma = (R^T * R)^{-1} \f$. */ Matrix marginalCovariance(Index j) const; diff --git a/gtsam/linear/GaussianSequentialSolver.h b/gtsam/linear/GaussianSequentialSolver.h index 36e93bcf4..8fd8e2dbb 100644 --- a/gtsam/linear/GaussianSequentialSolver.h +++ b/gtsam/linear/GaussianSequentialSolver.h @@ -115,7 +115,7 @@ public: * all of the other variables. This function returns the result as a mean * vector and covariance matrix. Compared to marginalCanonical, which * returns a GaussianConditional, this function back-substitutes the R factor - * to obtain the mean, then computes \Sigma = (R^T * R)^-1. + * to obtain the mean, then computes \f$ \Sigma = (R^T * R)^{-1} \f$. */ Matrix marginalCovariance(Index j) const; diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index d9da6e472..5bbee3708 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -237,7 +237,7 @@ namespace gtsam { /** Return the number of columns and rows of the Hessian matrix */ size_t rows() const { return info_.rows(); } - /** Return a view of the block at (j1,j2) of the upper-triangular part of the + /** Return a view of the block at (j1,j2) of the upper-triangular part of the * information matrix \f$ H \f$, no data is copied. See HessianFactor class documentation * above to explain that only the upper-triangular part of the information matrix is stored * and returned by this function. @@ -249,7 +249,7 @@ namespace gtsam { */ constBlock info(const_iterator j1, const_iterator j2) const { return info_(j1-begin(), j2-begin()); } - /** Return the upper-triangular part of the full *augmented* information matrix, + /** Return the upper-triangular part of the full *augmented* information matrix, * as described above. See HessianFactor class documentation above to explain that only the * upper-triangular part of the information matrix is stored and returned by this function. */ diff --git a/gtsam/linear/JacobianFactorGraph.cpp b/gtsam/linear/JacobianFactorGraph.cpp index 835783d4a..b02375a79 100644 --- a/gtsam/linear/JacobianFactorGraph.cpp +++ b/gtsam/linear/JacobianFactorGraph.cpp @@ -1,7 +1,7 @@ /** * @file JacobianFactorGraph.h * @date Jun 6, 2012 - * @Author Yong Dian Jian + * @author Yong Dian Jian */ #include diff --git a/gtsam/linear/JacobianFactorGraph.h b/gtsam/linear/JacobianFactorGraph.h index f5e78810a..8d240c00e 100644 --- a/gtsam/linear/JacobianFactorGraph.h +++ b/gtsam/linear/JacobianFactorGraph.h @@ -13,7 +13,7 @@ * @file JacobianFactorGraph.cpp * @date Jun 6, 2012 * @brief Linear Algebra Operations for a JacobianFactorGraph - * @Author Yong Dian Jian + * @author Yong Dian Jian */ #pragma once diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 7939b486d..f3ef57418 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -147,7 +147,7 @@ namespace gtsam { /** Insert a vector \c value with index \c j. * Causes reallocation. Can be used to insert values in any order, but - * throws an invalid_argument exception if the index \j is already used. + * throws an invalid_argument exception if the index \c j is already used. * @param value The vector to be inserted. * @param j The index with which the value will be associated. */ @@ -171,10 +171,10 @@ namespace gtsam { /** equals required by Testable for unit testing */ bool equals(const VectorValues& x, double tol = 1e-9) const; - /// @} + /// @{ /// \anchor AdvancedConstructors /// @name Advanced Constructors - /// @{ + /// @} /** Construct from a container of variable dimensions (in variable order), without initializing any values. */ template diff --git a/gtsam/nonlinear/DoglegOptimizer.cpp b/gtsam/nonlinear/DoglegOptimizer.cpp index 3edb35a76..b0ee9f460 100644 --- a/gtsam/nonlinear/DoglegOptimizer.cpp +++ b/gtsam/nonlinear/DoglegOptimizer.cpp @@ -13,7 +13,7 @@ * @file DoglegOptimizer.cpp * @brief * @author Richard Roberts - * @created Feb 26, 2012 + * @date Feb 26, 2012 */ #include diff --git a/gtsam/nonlinear/DoglegOptimizer.h b/gtsam/nonlinear/DoglegOptimizer.h index 7edb43ca9..c8ac636cf 100644 --- a/gtsam/nonlinear/DoglegOptimizer.h +++ b/gtsam/nonlinear/DoglegOptimizer.h @@ -13,7 +13,7 @@ * @file DoglegOptimizer.h * @brief * @author Richard Roberts - * @created Feb 26, 2012 + * @date Feb 26, 2012 */ #pragma once diff --git a/gtsam/nonlinear/DoglegOptimizerImpl.h b/gtsam/nonlinear/DoglegOptimizerImpl.h index 03951babf..737aa2f66 100644 --- a/gtsam/nonlinear/DoglegOptimizerImpl.h +++ b/gtsam/nonlinear/DoglegOptimizerImpl.h @@ -72,7 +72,7 @@ struct DoglegOptimizerImpl { * * The update is computed using a quadratic approximation \f$ M(\delta x) \f$ * of an original nonlinear error function (a NonlinearFactorGraph) \f$ f(x) \f$. - * The quadratic approximation is represented as a GaussianBayesNet \bayesNet, which is + * The quadratic approximation is represented as a GaussianBayesNet \f$ \bayesNet \f$, which is * obtained by eliminating a GaussianFactorGraph resulting from linearizing * the nonlinear factor graph \f$ f(x) \f$. Thus, \f$ M(\delta x) \f$ is * \f[ @@ -93,8 +93,8 @@ struct DoglegOptimizerImpl { * @param Rd The Bayes' net or tree as described above. * @param f The original nonlinear factor graph with which to evaluate the * accuracy of \f$ M(\delta x) \f$ to adjust \f$ \Delta \f$. - * @param x0 The linearization point about which \bayesNet was created - * @param ordering The variable ordering used to create \bayesNet + * @param x0 The linearization point about which \f$ \bayesNet \f$ was created + * @param ordering The variable ordering used to create\f$ \bayesNet \f$ * @param f_error The result of f.error(x0). * @return A DoglegIterationResult containing the new \c Delta, the linear * update \c dx_d, and the resulting nonlinear error \c f_error. @@ -111,7 +111,7 @@ struct DoglegOptimizerImpl { * * The update is computed using a quadratic approximation \f$ M(\delta x) \f$ * of an original nonlinear error function (a NonlinearFactorGraph) \f$ f(x) \f$. - * The quadratic approximation is represented as a GaussianBayesNet \bayesNet, which is + * The quadratic approximation is represented as a GaussianBayesNet \f$ \bayesNet \f$, which is * obtained by eliminating a GaussianFactorGraph resulting from linearizing * the nonlinear factor graph \f$ f(x) \f$. Thus, \f$ M(\delta x) \f$ is * \f[ @@ -134,8 +134,8 @@ struct DoglegOptimizerImpl { * \f$ \| (1-\tau)\delta x_u + \tau\delta x_n \| = \Delta \f$, where \f$ \Delta \f$ * is the trust region radius. * @param Delta Trust region radius - * @param xu Steepest descent minimizer - * @param xn Newton's method minimizer + * @param x_u Steepest descent minimizer + * @param x_n Newton's method minimizer */ static VectorValues ComputeBlend(double Delta, const VectorValues& x_u, const VectorValues& x_n, const bool verbose=false); }; diff --git a/gtsam/nonlinear/GaussNewtonOptimizer.cpp b/gtsam/nonlinear/GaussNewtonOptimizer.cpp index c81369299..c447a39e3 100644 --- a/gtsam/nonlinear/GaussNewtonOptimizer.cpp +++ b/gtsam/nonlinear/GaussNewtonOptimizer.cpp @@ -13,7 +13,7 @@ * @file GaussNewtonOptimizer.cpp * @brief * @author Richard Roberts - * @created Feb 26, 2012 + * @date Feb 26, 2012 */ #include diff --git a/gtsam/nonlinear/GaussNewtonOptimizer.h b/gtsam/nonlinear/GaussNewtonOptimizer.h index 39b64b667..217b6e618 100644 --- a/gtsam/nonlinear/GaussNewtonOptimizer.h +++ b/gtsam/nonlinear/GaussNewtonOptimizer.h @@ -13,7 +13,7 @@ * @file GaussNewtonOptimizer.h * @brief * @author Richard Roberts - * @created Feb 26, 2012 + * @date Feb 26, 2012 */ #pragma once diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index af44eee93..9a5897b41 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -13,7 +13,7 @@ * @file LevenbergMarquardtOptimizer.cpp * @brief * @author Richard Roberts - * @created Feb 26, 2012 + * @date Feb 26, 2012 */ #include diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index c1fe55c26..aae8e45cc 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -13,7 +13,7 @@ * @file LevenbergMarquardtOptimizer.h * @brief * @author Richard Roberts - * @created Feb 26, 2012 + * @date Feb 26, 2012 */ #pragma once diff --git a/gtsam/nonlinear/NonlinearOptimizer.h b/gtsam/nonlinear/NonlinearOptimizer.h index 388058ac0..2483aa800 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.h +++ b/gtsam/nonlinear/NonlinearOptimizer.h @@ -229,7 +229,7 @@ protected: }; /** Check whether the relative error decrease is less than relativeErrorTreshold, - * the absolute error decrease is less than absoluteErrorTreshold, or + * the absolute error decrease is less than absoluteErrorTreshold, or * the error itself is less than errorThreshold. */ bool checkConvergence(double relativeErrorTreshold, From bd8a3b8e9a82ce5dd8c93e8042aa31a8b7f70740 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Thu, 7 Jun 2012 23:20:40 +0000 Subject: [PATCH 262/914] UGM_chain now uses DiscreteMarginals instead of DiscreteSequentialSolver --- examples/UGM_chain.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/UGM_chain.cpp b/examples/UGM_chain.cpp index 61eb0d3a0..5d8e5a841 100644 --- a/examples/UGM_chain.cpp +++ b/examples/UGM_chain.cpp @@ -21,6 +21,7 @@ #include #include +#include #include @@ -74,11 +75,15 @@ int main(int argc, char** argv) { optimalDecoding->print("\nMost Probable Explanation (optimalDecoding)\n"); // "Inference" Computing marginals for each node + // Here we'll make use of DiscreteMarginals class, which makes use of + // bayes-tree based shortcut evaluation of marginals + DiscreteMarginals marginals(graph); + cout << "\nComputing Node Marginals .." << endl; for (vector::iterator itr = nodes.begin(); itr != nodes.end(); ++itr) { //Compute the marginal - Vector margProbs = solver.marginalProbabilities(*itr); + Vector margProbs = marginals.marginalProbabilities(*itr); //Print the marginals cout << "Node#" << setw(4) << itr->first << " : "; From 6fe2b77a25b3358bba657c70bb0e102a9d8f8a84 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Fri, 8 Jun 2012 00:18:32 +0000 Subject: [PATCH 263/914] In the middle of evaluating performance of DiscreteSequentialSolver vs DiscreteMarginals --- examples/UGM_chain.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/examples/UGM_chain.cpp b/examples/UGM_chain.cpp index 5d8e5a841..e7f408cb0 100644 --- a/examples/UGM_chain.cpp +++ b/examples/UGM_chain.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -31,7 +32,7 @@ using namespace gtsam; int main(int argc, char** argv) { // Set Number of Nodes in the Graph - const int nrNodes = 50; + const int nrNodes = 60; // Each node takes 1 of 7 possible states denoted by 0-6 in following order: // ["VideoGames" "Industry" "GradSchool" "VideoGames(with PhD)" @@ -75,11 +76,27 @@ int main(int argc, char** argv) { optimalDecoding->print("\nMost Probable Explanation (optimalDecoding)\n"); // "Inference" Computing marginals for each node + + + cout << "\nComputing Node Marginals ..(Sequential Elimination)" << endl; + tic_(1, "Sequential"); + for (vector::iterator itr = nodes.begin(); itr != nodes.end(); + ++itr) { + //Compute the marginal + Vector margProbs = solver.marginalProbabilities(*itr); + + //Print the marginals + cout << "Node#" << setw(4) << itr->first << " : "; + print(margProbs); + } + toc_(1, "Sequential"); + // Here we'll make use of DiscreteMarginals class, which makes use of // bayes-tree based shortcut evaluation of marginals DiscreteMarginals marginals(graph); - cout << "\nComputing Node Marginals .." << endl; + cout << "\nComputing Node Marginals ..(BayesTree based)" << endl; + tic_(2, "Multifrontal"); for (vector::iterator itr = nodes.begin(); itr != nodes.end(); ++itr) { //Compute the marginal @@ -88,9 +105,10 @@ int main(int argc, char** argv) { //Print the marginals cout << "Node#" << setw(4) << itr->first << " : "; print(margProbs); - cout << endl; } + toc_(2, "Multifrontal"); + tictoc_print_(); return 0; } From be0346ab87ea8ea0bb59950641c0657592986c3d Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Fri, 8 Jun 2012 03:02:04 +0000 Subject: [PATCH 264/914] resurrect deleted spcg files --- gtsam/linear/SubgraphPreconditioner.cpp | 150 ++++++++++++++++++++++++ gtsam/linear/SubgraphPreconditioner.h | 116 ++++++++++++++++++ gtsam/linear/SubgraphSolver-inl.h | 82 +++++++++++++ gtsam/linear/SubgraphSolver.cpp | 50 ++++++++ gtsam/linear/SubgraphSolver.h | 100 ++++++++++++++++ 5 files changed, 498 insertions(+) create mode 100644 gtsam/linear/SubgraphPreconditioner.cpp create mode 100644 gtsam/linear/SubgraphPreconditioner.h create mode 100644 gtsam/linear/SubgraphSolver-inl.h create mode 100644 gtsam/linear/SubgraphSolver.cpp create mode 100644 gtsam/linear/SubgraphSolver.h diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp new file mode 100644 index 000000000..cce8eea9d --- /dev/null +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -0,0 +1,150 @@ +///* ---------------------------------------------------------------------------- +// +// * 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 SubgraphPreconditioner.cpp +// * @date Dec 31, 2009 +// * @author: Frank Dellaert +// */ +// +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//namespace gtsam { +// +// /* ************************************************************************* */ +// SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, +// const sharedBayesNet& Rc1, const sharedValues& xbar) : +// Ab1_(Ab1), Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(gaussianErrors_(*Ab2_,*xbar)) { +// } +// +// /* ************************************************************************* */ +// // x = xbar + inv(R1)*y +// VectorValues SubgraphPreconditioner::x(const VectorValues& y) const { +//#ifdef VECTORBTREE +// if (!y.cloned(*xbar_)) throw +// invalid_argument("SubgraphPreconditioner::x: y needs to be cloned from xbar"); +//#endif +// VectorValues x = y; +// backSubstituteInPlace(*Rc1_,x); +// x += *xbar_; +// return x; +// } +// +//// SubgraphPreconditioner SubgraphPreconditioner::add_priors(double sigma) const { +//// SubgraphPreconditioner result = *this ; +//// result.Ab2_ = sharedFG(new GaussianFactorGraph(Ab2_->add_priors(sigma))) ; +//// return result ; +//// } +// +// /* ************************************************************************* */ +// double error(const SubgraphPreconditioner& sp, const VectorValues& y) { +// +// Errors e(y); +// VectorValues x = sp.x(y); +// Errors e2 = gaussianErrors(*sp.Ab2(),x); +// return 0.5 * (dot(e, e) + dot(e2,e2)); +// } +// +// /* ************************************************************************* */ +// // gradient is y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar), +// VectorValues gradient(const SubgraphPreconditioner& sp, const VectorValues& y) { +// VectorValues x = sp.x(y); // x = inv(R1)*y +// Errors e2 = gaussianErrors(*sp.Ab2(),x); +// VectorValues gx2 = VectorValues::Zero(y); +// gtsam::transposeMultiplyAdd(*sp.Ab2(),1.0,e2,gx2); // A2'*e2; +// VectorValues gy2 = gtsam::backSubstituteTranspose(*sp.Rc1(), gx2); // inv(R1')*gx2 +// return y + gy2; +// } +// +// /* ************************************************************************* */ +// // Apply operator A, A*y = [I;A2*inv(R1)]*y = [y; A2*inv(R1)*y] +// Errors operator*(const SubgraphPreconditioner& sp, const VectorValues& y) { +// +// Errors e(y); +// +// // Add A2 contribution +// VectorValues x = y; // TODO avoid ? +// gtsam::backSubstituteInPlace(*sp.Rc1(), x); // x=inv(R1)*y +// Errors e2 = *sp.Ab2() * x; // A2*x +// e.splice(e.end(), e2); +// +// return e; +// } +// +// /* ************************************************************************* */ +// // In-place version that overwrites e +// void multiplyInPlace(const SubgraphPreconditioner& sp, const VectorValues& y, Errors& e) { +// +// +// Errors::iterator ei = e.begin(); +// for ( Index i = 0 ; i < y.size() ; ++i, ++ei ) { +// *ei = y[i]; +// } +// +// // Add A2 contribution +// VectorValues x = y; // TODO avoid ? +// gtsam::backSubstituteInPlace(*sp.Rc1(), x); // x=inv(R1)*y +// gtsam::multiplyInPlace(*sp.Ab2(),x,ei); // use iterator version +// } +// +// /* ************************************************************************* */ +// // Apply operator A', A'*e = [I inv(R1')*A2']*e = e1 + inv(R1')*A2'*e2 +// VectorValues operator^(const SubgraphPreconditioner& sp, const Errors& e) { +// +// Errors::const_iterator it = e.begin(); +// VectorValues y = sp.zero(); +// for ( Index i = 0 ; i < y.size() ; ++i, ++it ) +// y[i] = *it ; +// sp.transposeMultiplyAdd2(1.0,it,e.end(),y); +// return y; +// } +// +// /* ************************************************************************* */ +// // y += alpha*A'*e +// void transposeMultiplyAdd +// (const SubgraphPreconditioner& sp, double alpha, const Errors& e, VectorValues& y) { +// +// +// Errors::const_iterator it = e.begin(); +// for ( Index i = 0 ; i < y.size() ; ++i, ++it ) { +// const Vector& ei = *it; +// axpy(alpha,ei,y[i]); +// } +// sp.transposeMultiplyAdd2(alpha,it,e.end(),y); +// } +// +// /* ************************************************************************* */ +// // y += alpha*inv(R1')*A2'*e2 +// void SubgraphPreconditioner::transposeMultiplyAdd2 (double alpha, +// Errors::const_iterator it, Errors::const_iterator end, VectorValues& y) const { +// +// // create e2 with what's left of e +// // TODO can we avoid creating e2 by passing iterator to transposeMultiplyAdd ? +// Errors e2; +// while (it != end) +// e2.push_back(*(it++)); +// +// VectorValues x = VectorValues::Zero(y); // x = 0 +// gtsam::transposeMultiplyAdd(*Ab2_,1.0,e2,x); // x += A2'*e2 +// axpy(alpha, gtsam::backSubstituteTranspose(*Rc1_, x), y); // y += alpha*inv(R1')*x +// } +// +// /* ************************************************************************* */ +// void SubgraphPreconditioner::print(const std::string& s) const { +// cout << s << endl; +// Ab2_->print(); +// } +//} // nsamespace gtsam diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h new file mode 100644 index 000000000..2cc760bfa --- /dev/null +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -0,0 +1,116 @@ +///* ---------------------------------------------------------------------------- +// +// * 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 SubgraphPreconditioner.h +// * @date Dec 31, 2009 +// * @author Frank Dellaert +// */ +// +//#pragma once +// +//#include +//#include +//#include // FIXME shouldn't have nonlinear things in linear +// +//namespace gtsam { +// +// /** +// * Subgraph conditioner class, as explained in the RSS 2010 submission. +// * Starting with a graph A*x=b, we split it in two systems A1*x=b1 and A2*x=b2 +// * We solve R1*x=c1, and make the substitution y=R1*x-c1. +// * To use the class, give the Bayes Net R1*x=c1 and Graph A2*x=b2. +// * Then solve for yhat using CG, and solve for xhat = system.x(yhat). +// */ +// class SubgraphPreconditioner { +// +// public: +// typedef boost::shared_ptr sharedBayesNet; +// typedef boost::shared_ptr > sharedFG; +// typedef boost::shared_ptr sharedValues; +// typedef boost::shared_ptr sharedErrors; +// +// private: +// sharedFG Ab1_, Ab2_; +// sharedBayesNet Rc1_; +// sharedValues xbar_; +// sharedErrors b2bar_; /** b2 - A2*xbar */ +// +// public: +// +// SubgraphPreconditioner(); +// /** +// * Constructor +// * @param Ab1: the Graph A1*x=b1 +// * @param Ab2: the Graph A2*x=b2 +// * @param Rc1: the Bayes Net R1*x=c1 +// * @param xbar: the solution to R1*x=c1 +// */ +// SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar); +// +// /** Access Ab1 */ +// const sharedFG& Ab1() const { return Ab1_; } +// +// /** Access Ab2 */ +// const sharedFG& Ab2() const { return Ab2_; } +// +// /** Access Rc1 */ +// const sharedBayesNet& Rc1() const { return Rc1_; } +// +// /** +// * Add zero-mean i.i.d. Gaussian prior terms to each variable +// * @param sigma Standard deviation of Gaussian +// */ +//// SubgraphPreconditioner add_priors(double sigma) const; +// +// /* x = xbar + inv(R1)*y */ +// VectorValues x(const VectorValues& y) const; +// +// /* A zero VectorValues with the structure of xbar */ +// VectorValues zero() const { +// VectorValues V(VectorValues::Zero(*xbar_)) ; +// return V ; +// } +// +// /** +// * Add constraint part of the error only, used in both calls above +// * y += alpha*inv(R1')*A2'*e2 +// * Takes a range indicating e2 !!!! +// */ +// void transposeMultiplyAdd2(double alpha, Errors::const_iterator begin, +// Errors::const_iterator end, VectorValues& y) const; +// +// /** print the object */ +// void print(const std::string& s = "SubgraphPreconditioner") const; +// }; +// +// /* error, given y */ +// double error(const SubgraphPreconditioner& sp, const VectorValues& y); +// +// /** gradient = y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar) */ +// VectorValues gradient(const SubgraphPreconditioner& sp, const VectorValues& y); +// +// /** Apply operator A */ +// Errors operator*(const SubgraphPreconditioner& sp, const VectorValues& y); +// +// /** Apply operator A in place: needs e allocated already */ +// void multiplyInPlace(const SubgraphPreconditioner& sp, const VectorValues& y, Errors& e); +// +// /** Apply operator A' */ +// VectorValues operator^(const SubgraphPreconditioner& sp, const Errors& e); +// +// /** +// * Add A'*e to y +// * y += alpha*A'*[e1;e2] = [alpha*e1; alpha*inv(R1')*A2'*e2] +// */ +// void transposeMultiplyAdd(const SubgraphPreconditioner& sp, double alpha, const Errors& e, VectorValues& y); +// +//} // namespace gtsam diff --git a/gtsam/linear/SubgraphSolver-inl.h b/gtsam/linear/SubgraphSolver-inl.h new file mode 100644 index 000000000..d2dc7cee2 --- /dev/null +++ b/gtsam/linear/SubgraphSolver-inl.h @@ -0,0 +1,82 @@ +/* ---------------------------------------------------------------------------- + + * 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 + + * -------------------------------------------------------------------------- */ + +#pragma once + +#include + +#include +#include +#include + +using namespace std; + +namespace gtsam { + +template +void SubgraphSolver::replaceFactors(const typename LINEAR::shared_ptr &graph) { + + GaussianFactorGraph::shared_ptr Ab1 = boost::make_shared(); + GaussianFactorGraph::shared_ptr Ab2 = boost::make_shared(); + + if (parameters_->verbosity()) cout << "split the graph ..."; + split(pairs_, *graph, *Ab1, *Ab2) ; + if (parameters_->verbosity()) cout << ",with " << Ab1->size() << " and " << Ab2->size() << " factors" << endl; + + // // Add a HardConstraint to the root, otherwise the root will be singular + // Key root = keys.back(); + // T_.addHardConstraint(root, theta0[root]); + // + // // compose the approximate solution + // theta_bar_ = composePoses (T_, tree, theta0[root]); + + LINEAR sacrificialAb1 = *Ab1; // duplicate !!!!! + SubgraphPreconditioner::sharedBayesNet Rc1 = + EliminationTree::Create(sacrificialAb1)->eliminate(&EliminateQR); + SubgraphPreconditioner::sharedValues xbar = gtsam::optimize_(*Rc1); + + pc_ = boost::make_shared( + Ab1->dynamicCastFactors >(), Ab2->dynamicCastFactors >(),Rc1,xbar); +} + +template +VectorValues::shared_ptr SubgraphSolver::optimize() const { + + // preconditioned conjugate gradient + VectorValues zeros = pc_->zero(); + VectorValues ybar = conjugateGradients + (*pc_, zeros, *parameters_); + + boost::shared_ptr xbar = boost::make_shared() ; + *xbar = pc_->x(ybar); + return xbar; +} + +template +void SubgraphSolver::initialize(const GRAPH& G, const Values& theta0) { + // generate spanning tree + PredecessorMap tree_ = gtsam::findMinimumSpanningTree(G); + + // make the ordering + list keys = predecessorMap2Keys(tree_); + ordering_ = boost::make_shared(list(keys.begin(), keys.end())); + + // build factor pairs + pairs_.clear(); + typedef pair EG ; + BOOST_FOREACH( const EG &eg, tree_ ) { + Key key1 = Key(eg.first), + key2 = Key(eg.second) ; + pairs_.insert(pair((*ordering_)[key1], (*ordering_)[key2])) ; + } +} + +} // \namespace gtsam diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp new file mode 100644 index 000000000..609b427f2 --- /dev/null +++ b/gtsam/linear/SubgraphSolver.cpp @@ -0,0 +1,50 @@ +///* ---------------------------------------------------------------------------- +// +// * 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 +// +// * -------------------------------------------------------------------------- */ +// +//#include +// +//using namespace std; +// +//namespace gtsam { +// +///* split the gaussian factor graph Ab into Ab1 and Ab2 according to the map */ +//bool split(const std::map &M, +// const GaussianFactorGraph &Ab, +// GaussianFactorGraph &Ab1, +// GaussianFactorGraph &Ab2) { +// +// Ab1 = GaussianFactorGraph(); +// Ab2 = GaussianFactorGraph(); +// +// for ( size_t i = 0 ; i < Ab.size() ; ++i ) { +// +// boost::shared_ptr factor = Ab[i] ; +// +// if (factor->keys().size() > 2) +// throw(invalid_argument("split: only support factors with at most two keys")); +// if (factor->keys().size() == 1) { +// Ab1.push_back(factor); +// Ab2.push_back(factor); +// continue; +// } +// Index key1 = factor->keys()[0]; +// Index key2 = factor->keys()[1]; +// +// if ((M.find(key1) != M.end() && M.find(key1)->second == key2) || +// (M.find(key2) != M.end() && M.find(key2)->second == key1)) +// Ab1.push_back(factor); +// else +// Ab2.push_back(factor); +// } +// return true ; +//} +// +//} // \namespace gtsam diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h new file mode 100644 index 000000000..f4fa34427 --- /dev/null +++ b/gtsam/linear/SubgraphSolver.h @@ -0,0 +1,100 @@ +///* ---------------------------------------------------------------------------- +// +// * 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 +// +// * -------------------------------------------------------------------------- */ +// +//#pragma once +// +//#include +// +//#include +//#include +//#include +// +//namespace gtsam { +// +///* split the gaussian factor graph Ab into Ab1 and Ab2 according to the map */ +//bool split(const std::map &M, +// const GaussianFactorGraph &Ab, +// GaussianFactorGraph &Ab1, +// GaussianFactorGraph &Ab2); +// +///** +// * A nonlinear system solver using subgraph preconditioning conjugate gradient +// * Concept NonLinearSolver implements +// * linearize: G * T -> L +// * solve : L -> VectorValues +// */ +//template +//class SubgraphSolver : public IterativeSolver { +// +//private: +// typedef typename VALUES::Key Key; +// typedef typename GRAPH::Pose Pose; +// typedef typename GRAPH::Constraint Constraint; +// +// typedef boost::shared_ptr shared_ptr ; +// typedef boost::shared_ptr shared_ordering ; +// typedef boost::shared_ptr shared_graph ; +// typedef boost::shared_ptr shared_linear ; +// typedef boost::shared_ptr shared_values ; +// typedef boost::shared_ptr shared_preconditioner ; +// typedef std::map mapPairIndex ; +// +// /* the ordering derived from the spanning tree */ +// shared_ordering ordering_; +// +// /* the indice of two vertices in the gaussian factor graph */ +// mapPairIndex pairs_; +// +// /* preconditioner */ +// shared_preconditioner pc_; +// +// /* flag for direct solver - either QR or LDL */ +// bool useQR_; +// +//public: +// +// SubgraphSolver(const GRAPH& G, const VALUES& theta0, const Parameters ¶meters = Parameters(), bool useQR = false): +// IterativeSolver(parameters), useQR_(useQR) { initialize(G,theta0); } +// +// SubgraphSolver(const LINEAR& GFG) { +// std::cout << "[SubgraphSolver] Unexpected usage.." << std::endl; +// throw std::runtime_error("SubgraphSolver: gaussian factor graph initialization not supported"); +// } +// +// SubgraphSolver(const shared_linear& GFG, const boost::shared_ptr& structure, bool useQR = false) { +// std::cout << "[SubgraphSolver] Unexpected usage.." << std::endl; +// throw std::runtime_error("SubgraphSolver: gaussian factor graph and variable index initialization not supported"); +// } +// +// SubgraphSolver(const SubgraphSolver& solver) : +// IterativeSolver(solver), ordering_(solver.ordering_), pairs_(solver.pairs_), pc_(solver.pc_), useQR_(solver.useQR_) {} +// +// SubgraphSolver(shared_ordering ordering, +// mapPairIndex pairs, +// shared_preconditioner pc, +// sharedParameters parameters = boost::make_shared(), +// bool useQR = true) : +// IterativeSolver(parameters), ordering_(ordering), pairs_(pairs), pc_(pc), useQR_(useQR) {} +// +// void replaceFactors(const typename LINEAR::shared_ptr &graph); +// VectorValues::shared_ptr optimize() ; +// shared_ordering ordering() const { return ordering_; } +// +//protected: +// void initialize(const GRAPH& G, const VALUES& theta0); +// +//private: +// SubgraphSolver():IterativeSolver(){} +//}; +// +//} // namespace gtsam +// +//#include From 70974bd55e6a36f0cc14a4fe08c0e6661aee6ea5 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 03:53:32 +0000 Subject: [PATCH 265/914] remove printing in unittest --- gtsam/geometry/tests/testSimpleCamera.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index d0f961bfa..71f36998c 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -75,15 +75,12 @@ TEST( SimpleCamera, lookat) Pose3 expected(Rot3(xc,yc,zc),C); CHECK(assert_equal( camera.pose(), expected)); - Point3 C2(30.0,0.0,10.0); SimpleCamera camera2 = SimpleCamera::lookat(C2, Point3(), Point3(0.0,0.0,1.0)); Matrix R = camera2.pose().rotation().matrix(); Matrix I = trans(R)*R; - gtsam::print(I,"I="); CHECK(assert_equal(I, eye(3))); - } /* ************************************************************************* */ From 2ebd7a8974205794849724f87e06cc164ccf6e80 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 03:54:27 +0000 Subject: [PATCH 266/914] early prototype for visualISAM_gui. No drawing yet. --- matlab/examples/VisualISAMData_triangle.m | 32 ++++ matlab/examples/VisualISAMExample_triangle2.m | 16 ++ matlab/examples/VisualISAMInitialize.m | 33 ++++ matlab/examples/VisualISAMStep.m | 24 +++ matlab/examples/VisualISAM_gui.fig | Bin 0 -> 6094 bytes matlab/examples/VisualISAM_gui.m | 176 ++++++++++++++++++ 6 files changed, 281 insertions(+) create mode 100644 matlab/examples/VisualISAMData_triangle.m create mode 100644 matlab/examples/VisualISAMExample_triangle2.m create mode 100644 matlab/examples/VisualISAMInitialize.m create mode 100644 matlab/examples/VisualISAMStep.m create mode 100644 matlab/examples/VisualISAM_gui.fig create mode 100644 matlab/examples/VisualISAM_gui.m diff --git a/matlab/examples/VisualISAMData_triangle.m b/matlab/examples/VisualISAMData_triangle.m new file mode 100644 index 000000000..b5c4c0e11 --- /dev/null +++ b/matlab/examples/VisualISAMData_triangle.m @@ -0,0 +1,32 @@ +function [ data ] = VisualISAMData_triangle() +%VISUALISAMDATA_TRIANGLE Generate data for visual ISAM triangle example. +% Landmarks include 3 points around the world's origin on the z=0 plane. +% Cameras are on a circle at a certain height, looking at the origin. +%% Create a triangle target, just 3 points on a plane +nPoints = 3; +r = 10; +data.points = {}; +for j=1:nPoints + theta = (j-1)*2*pi/nPoints; + data.points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); +end + +%% Create camera cameras on a circle around the triangle +nCameras = 10; +height = 10; +r = 30; +data.cameras = {}; +data.K = gtsamCal3_S2(500,500,0,640/2,480/2); +for i=1:nCameras + theta = (i-1)*2*pi/nCameras; + t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); + data.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), data.K); +end + +data.posePriorNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 5.0 5.0 5.0]'); +data.odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 2.0 2.0 2.0]'); +data.pointPriorNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); +data.measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); + +end + diff --git a/matlab/examples/VisualISAMExample_triangle2.m b/matlab/examples/VisualISAMExample_triangle2.m new file mode 100644 index 000000000..b636ba542 --- /dev/null +++ b/matlab/examples/VisualISAMExample_triangle2.m @@ -0,0 +1,16 @@ +%% data +data = VisualISAMData_triangle(); + +%% init +[isam results] = VisualISAMInitialize(data); +sprintf('Frame 1,2:') +results + +%% Next frame index +frame_i=3; +%% All steps +while (frame_i=GI&2OsxRKnfM$L#_CV;|>WcfY{b zD*rfL!-w(@_;mx_oP*t5`TcxV_@8=)@Ee8r^7AY5%gU+9%c;o9^2&_ThTOR<8Zfb#vnUfX&-c$MBVR|}%<+Vd|!jo#YtoN}fhz08XRkWe} zI&G5d^iRj%pLLk8NNJRX=$9Cd=5@B;Io@Kb-!G zgpqf;{pj0m41VUtt*HaKr&JQtKMcD(DMco}qE>h;nvD8+#@Nq2x#)J=qV$!~-JyW( zcGEDLvLcc1wFwkKjqW45W4zFAq#BpH_Z#!;o`jqS} z0J$p`?znco(e(*pX-q8$3C4q97NG9RM>v9Naj#!4_X+z*YO6=c4-O_34C=S(D4!^y zY&(seXox6cCq6=Kuo0glG})p{FN@x5TH&RJibM(c=;5L}U=4+R#9(%1A*LbtP4sd- z7_p$_=^$^$shCnWY_(Gx!1qP+Zx+7xucm5jgbN=}bkUmrA&!2R%%PKTrb6a<0={riUp4P>jKsi0D5*X?9WNiFxpcDjJRkR}2^&{hx9S{F@N=!}iR4 zap<@fG166?0tAb4gS!aX&r2imVjI(WN2OUGT%7ThSi<(YsLI_*=pOL{g}~#T zfP?X*kt%>gimUp$PZEo`n5s15_#sr$0^}6qV4#;@+tA*H>^nEwJL?=88aiU&rpUP% zH5fai7Ay9_jn6h^t_Rm?a);!rX8jb((VnYf+}D5Qqs{Pqc)iNY|(h1gEfIqg=6kQyYNd|@BU*@H+pGaytg~{ z50Y$YxXym)qVAn>Tad7_Q#Vmd3bMM}HwNfw@8bK0k6qQbq*Tqnz&VsGa zY*j=|Stg>INt>D$&rh2>m^|n*$T^oZU?Rx*BIKXop$hIez3AYZdl0d^f(q4C{OV9g zoaCX0ncCjuyY&hVd=Fl^&+W0geDS&-M>lwTY(~SzG#U*gG#=f}l&H5=@TUY`c74sk zURM^_pqFj3QZR38w<}qv0Z!aen)epWE{Ys@){nNr+LR~f z5Q!(Yras&XY!|+bcNq++OFzdBn(J8!ebUL`*So1R=JQa3%fMjtt0;f@tm^SeN62v5 z9j4R$Svt#9^@~NWByw1xQo!bIUuv2vf1Ry<21fn{j}xA>u=Hyy5WhJmaD%JYZ(VH# z-VL;W$s1Z-tPNZcT1=pS;z21(-C7))F{9M`0L*~!&USihS(p)-;3OExCVv;$c|+Y( zZWk*vIq>GThXAEW*;W!(;WfB*2+!T-qjTQBuKtVqK}2TbK~I{4FLN31Htf8-_s+id{h@fN)crM(p59-Z`hAklNy|H@*zZGxY;uy~=IZlAkN%+grtkP#^ z5e}Y0(?L&`Ch_0qgY=PfB(-M(hvFu?^_{bwJDpRhcyvR2)UUr;o7Zc`bn_;!%Obg! zd>Er9vnu*ATPF`M$PKKGvFL(VF&!(C=Y1#=_ab6)j5B?UJc}7J5(|<$3T(8UGxAuDW6OVqJZaen(B{Am#)$TMfXJ+ z*V>v*k+LF9kCq7XK(=r{?{HmF!Zc#i5F19M?eNTj37JMuO%-h~EZk+VRn+OYKjI~x zi^f>CAw1^#0tW^OAQBZ-DwlK)!8aN!`{C?&_*Z@$D-THaap55KN@J1=x9m3^rTr=S zUg(P=q^Ka=WH#!YkYe2R%|E~VA)1V;A7D}j1bgt>=5f_zak=-bbHy-OVsrc*?NM8I z9rEAGX;0p~STMb(?_Y4G^gfb7>~8-KO|@RYBUXeLCHQg8LGEb`gQZvDB2;bpx611L zq?fqrFoWta7hG8gzb82F1K^x&cq4d8()qD+?NLcI$yEezL`$U=n8)CNiKL@*<*7(B z7e*krvGfvSEzkSifDr4p?6NIp2^otv*Yyi;ZVHLCKDUW+v?8$u(gdm>38XpiBFSS6 zhjh1ZUr9Csr@Yk`$VBRG>@=7feh(x7thN@OICMh$@u&rZu#h9cDei@*&&$H)e&tw< z*20Wy3zK5-A1G9u{xZ8dXTLv?KPFP~%oE!tkBB|9#EiRi)kcNy z=Gk45XD78N%^KXyG5B*vM@n>BL@lmNMN)NGgOM=3}-SOxuwCZsUz85Dp^-pu1?`o>$J=-eD ze%dOcQ`R;JQwYfg=7E=*K_Q z_kXJI_6??#dlpzT-+%lkDcQ&(>0uY``#sUu9~6wDnvdf6meVzSZ{W&pQC>~ox(NWM zV|*Ph1^~DJ6#OjJd)l+xB?l(UU_;d4fMld7f*Z?+%dp~_AAEb}QBiC21p3>rMa+*w zU6r#&U3Gf#;j!y-q8HJWsb!j9((!)AqlhU8aW@+)T#qur?-Z6D_*bn2;mp%QcE_FY zgy|g{$F|s_TB(u6Z&r9WB3=>xyfIXl({l-6XfLI0u3K+)ol8E76bZj6$5BBbJ@6|$ zoGXNHsIT+3eCbfXKB5Z&)!peB0UeR=InrX5`ocX3no?Nk4NIh1_8k+fEb%Y9Ib{qABGHH9Sj+L5(dyPU;8kzLA+ob#odGU>T)HdD$ zD&&ujwxT2x@0t70ZLw35d*cWCPMm0#OdXsROj{Yd#pY*Z3{3yL$dL6Mn*iq&TP4Dz z7IaO<$5vkEEp>#fVzx8|#8Gvu80Z8zx0qe;qo_S29<**|_k>>YVg0XwJFF8&CG

*sRdZ-#{{=j-0mNuM-q+kqJCR6TN}81}eeZ$Xo%52^ZpO=cpvlv1-AE&i zv|YKoMS17#C5V7iRn8!J4GDE8Gdn~f+h1YXt~Y#v{dx|Pk~{Q1>w1iS6PxW(^-Akg z6OrTd9@!o_SJJ#8G7=mdBC$?-t5`BZ`H&5m{NN#VySQ1E{kn?sF9#8-wLe|ReWwIC zDeEg-e#Mzt0=zg;8OZTFj3uYH^KH8vBzC5b^?~!DFVeu1QMfA;0uR)* z_h3Tv(MZL))geFLA$Pp43o>DLY7v^L;~&mmId$7J-!vIzyi^#594Jbhj=T+E zn)2LPpYH)l>GIpB3a?ng>ZTum3&7}ehw0;v)=;ib9&LZzb~Hx)NjUPehrJI&bj?hb zB=>A&=D;m*4}ioZ)5|8t$;ZEDb_%BVp#+dR-*;(cv}~=00$9D@{j#()3L3SR z`Jkm`m-A4s8mG{h(PHje-*@ZMqjmS+SpkTlEbnQgEPmkv&4Ab-8<*szk)o*2!X^ov`kJ{2BTzSr?2T zmM42Kd7SZ0MiLQHN81)aUPf_seBRYl5aiFmXWqK-1#KqSn)eu?mKQv=Fc9&NLP=Mn z8XAq5oWAoCDE~Ji&$RvieT2OA1>e5Uiaj!55cx=Z?-QBfmewb+xzw4L$=TKc={oVd zsbM1*Q;3O1)s^i+rNEOZ3dN^oE$U_?7fybJlF(;f>CxA+!|u^0||U zLd^c}JVn0^4?4CtXlnq7k9^s_JvHK%By!@O%hCSEw78Ub{66Yl-D9PvJK0>Y&3(l7gj2i zdXVZ9RY5z$Zly@6d!R2R9_u5@Tho+7<3HZ1(bIrq@@XqR=%(ITix6qV(VMtq{#63# zLT-i}H47fs$yZ}>Lvf){amUnJlyQ{94-A6;w4<2?I%V7HMKljMYJ7@6RI0Zc@Hv4>YKfZBS;%*2` zBj$SRGxq1|!jxb{)6=c#8FzwX1vm~@3lKv}mo=Cg}%ff^YmP3AxY zF^VuRr)KXLbWh|h?@<^oNu2yG6!zAtPZqshk~cA8w?yk@KL>a|zsvh|&0?*?hy6KI zJVRNj`tInN4bp5-gSq?0nk(ioMD?K^ntAvBme6Z~Sd%6FO(wC6Z;A>AJh2xIX)D<; zG^pK@AgU8X7dTJp{6s9{dCTUIM#P)(fQZ}mU!N&DlnTEzEe#*ppvyKPSDm7cDSple z%=@VO+&bX7z)OA!#%S7Zp|WjH8iR`H=s%I+GwRdlI~!RtMD;OMk4N9t)f|`eJ++u^r4qSH7(s~R(PX#FSWQg3vDi$((Zi!;Z^wgYL9#MDz` zung$B?+-W`w)fpb^ZM@L%cU+6uPY&4B0J(F0TrsuDODX%#r<1FDb9PiZ^rbKpgV7B z2Hb;P3P2XsBf=>SVDIljON}lV_%35v|GUCYt!wOd0=Y!QOuwBz{SngX zZ{MM#aIe}lIPasDnD5bdcUzVrNog}~3!+{?m>I$UI<`Jpy=zjln^k7B3&Fxk)XN1?^`P^p)SCI8$=yvu!Y*MP_eIXk+pJ7(Erp~!- zwA9Ruilu;$WlJqc{+e5KHWPZ;B1XuPCzhNpR*Fo1yswmn)s|!jj8$E0(d{*J|m6$cCu>EPZNp_kCzuTBPF;%J$j=sd2G7;JaAwU zv(Q-VCV2VR`^kd%m>)8?TX|y_A#kQZhS-j__?vI{af;k?tLOfQnZaoZQ@%-Y1l^zE z>BD=g#0{7=KKzoq>C9mswtdmUsNV8XAo_EZ+hPiT<7xdDX7` z`}+M0JUFtg0pK|rLM_(L8`|Y{_1KqQgz7#B(7p=z=*ufyMdy%(&fF!1I06;N=JA)n zo{taU;RPlUJ+sJ$!@C9+1s*E(WIIehkpNce+@|g>;9fv zYn%0Jv0ckGS0u>?z|vhHiZUVE4v?wmuZwR8h?>qNDgM3B-8UXil_go=?7oYgc}X2G zgx`hzj);ohx8To-OZpO3YT#Vk0r;vj9)HyA_c*ILe{jzLsfRxDl#}Axf6k@;Op|q9 zPNlaa6t~)^Au=xomVOqY!1t{u`*(7lN_}JrClZzsF%toB09 zRqbWhc=&4i%HFnjUocG)h>96a!i;8SMpHARCHaqJ_>a^Rh!!-Psx3rcglY(Z4NtzG zmhFUm(uCiPpy}MWb9zDC14e?2HeeWR6k%YZcUgw$1iSfK({BT-nC;gAUypUNOT|2o QB;r=XLZZk8Z>k#q2SW^4#sB~S literal 0 HcmV?d00001 diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m new file mode 100644 index 000000000..a3efe088e --- /dev/null +++ b/matlab/examples/VisualISAM_gui.m @@ -0,0 +1,176 @@ +function varargout = VisualISAM_gui(varargin) +% VISUALISAM_GUI MATLAB code for VisualISAM_gui.fig +% VISUALISAM_GUI, by itself, creates a new VISUALISAM_GUI or raises the existing +% singleton*. +% +% H = VISUALISAM_GUI returns the handle to a new VISUALISAM_GUI or the handle to +% the existing singleton*. +% +% VISUALISAM_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in VISUALISAM_GUI.M with the given input arguments. +% +% VISUALISAM_GUI('Property','Value',...) creates a new VISUALISAM_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before VisualISAM_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to VisualISAM_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help VisualISAM_gui + +% Last Modified by GUIDE v2.5 07-Jun-2012 23:43:22 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @VisualISAM_gui_OpeningFcn, ... + 'gui_OutputFcn', @VisualISAM_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before VisualISAM_gui is made visible. +function VisualISAM_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to VisualISAM_gui (see VARARGIN) + +% handles.data = VisualISAMData_triangle(); +% handles.frame_i = 3; +% handles.isam = visualSLAMISAM; +% handles.results = visualSLAMValues; + +% Choose default command line output for VisualISAM_gui +handles.output = hObject; + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes VisualISAM_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = VisualISAM_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + +% --- Executes on button press in generateButton. +function generateButton_Callback(hObject, eventdata, handles) +% hObject handle to generateButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + handles.data = VisualISAMData_triangle(); + guidata(hObject,handles) + + +% --- Executes on button press in intializeButton. +function intializeButton_Callback(hObject, eventdata, handles) +% hObject handle to intializeButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + [handles.isam handles.results] = VisualISAMInitialize(handles.data); + handles.frame_i=3; + sprintf('Frame 1,2:') + handles.results + guidata(hObject,handles) + + +% --- Executes on button press in stepButton. +function stepButton_Callback(hObject, eventdata, handles) +% hObject handle to stepButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + handles.frame_i + handles.results + if (handles.frame_i Date: Fri, 8 Jun 2012 04:52:38 +0000 Subject: [PATCH 267/914] Frank says: NEVER use "using namespace xxx" in a header file. Got rid of lambda.h header where not needed. --- gtsam/inference/BayesNet-inl.h | 147 ++++++++++++++------------ gtsam/inference/BayesTree-inl.h | 46 ++++---- gtsam/inference/EliminationTree-inl.h | 24 ++--- gtsam/inference/JunctionTree-inl.h | 6 +- 4 files changed, 109 insertions(+), 114 deletions(-) diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 53e0ec18d..88b386b72 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -19,57 +19,61 @@ #include -#include -#include #include #include #include -#include -#include #include // for += using namespace boost::assign; -using namespace std; +#include +#include namespace gtsam { - /* ************************************************************************* */ - template - void BayesNet::print(const string& s) const { - cout << s; - BOOST_REVERSE_FOREACH(sharedConditional conditional,conditionals_) - conditional->print(); - } - - /* ************************************************************************* */ - template - bool BayesNet::equals(const BayesNet& cbn, double tol) const { - if(size() != cbn.size()) return false; - return equal(conditionals_.begin(),conditionals_.end(),cbn.conditionals_.begin(),equals_star(tol)); - } - /* ************************************************************************* */ - template - typename BayesNet::const_iterator BayesNet::find(Index key) const { - for(const_iterator it = begin(); it != end(); ++it) - if(std::find((*it)->beginFrontals(), (*it)->endFrontals(), key) != (*it)->endFrontals()) - return it; - return end(); - } + template + void BayesNet::print(const std::string& s) const { + std::cout << s; + BOOST_REVERSE_FOREACH(sharedConditional conditional,conditionals_) + conditional->print(); + } /* ************************************************************************* */ template - typename BayesNet::iterator BayesNet::find(Index key) { - for(iterator it = begin(); it != end(); ++it) - if(std::find((*it)->beginFrontals(), (*it)->endFrontals(), key) != (*it)->endFrontals()) + bool BayesNet::equals(const BayesNet& cbn, double tol) const { + if (size() != cbn.size()) + return false; + return equal(conditionals_.begin(), conditionals_.end(), + cbn.conditionals_.begin(), equals_star(tol)); + } + + /* ************************************************************************* */ + template + typename BayesNet::const_iterator BayesNet::find( + Index key) const { + for (const_iterator it = begin(); it != end(); ++it) + if (std::find((*it)->beginFrontals(), (*it)->endFrontals(), key) + != (*it)->endFrontals()) return it; return end(); } /* ************************************************************************* */ template - void BayesNet::permuteWithInverse(const Permutation& inversePermutation) { + typename BayesNet::iterator BayesNet::find( + Index key) { + for (iterator it = begin(); it != end(); ++it) + if (std::find((*it)->beginFrontals(), (*it)->endFrontals(), key) + != (*it)->endFrontals()) + return it; + return end(); + } + + /* ************************************************************************* */ + template + void BayesNet::permuteWithInverse( + const Permutation& inversePermutation) { BOOST_FOREACH(sharedConditional conditional, conditionals_) { conditional->permuteWithInverse(inversePermutation); } @@ -77,52 +81,54 @@ namespace gtsam { /* ************************************************************************* */ template - bool BayesNet::permuteSeparatorWithInverse(const Permutation& inversePermutation) { + bool BayesNet::permuteSeparatorWithInverse( + const Permutation& inversePermutation) { bool separatorChanged = false; BOOST_FOREACH(sharedConditional conditional, conditionals_) { - if(conditional->permuteSeparatorWithInverse(inversePermutation)) + if (conditional->permuteSeparatorWithInverse(inversePermutation)) separatorChanged = true; } return separatorChanged; } - /* ************************************************************************* */ - template - void BayesNet::push_back(const BayesNet bn) { - BOOST_FOREACH(sharedConditional conditional,bn.conditionals_) - push_back(conditional); - } - - /* ************************************************************************* */ - template - void BayesNet::push_front(const BayesNet bn) { - BOOST_FOREACH(sharedConditional conditional,bn.conditionals_) - push_front(conditional); - } + /* ************************************************************************* */ + template + void BayesNet::push_back(const BayesNet bn) { + BOOST_FOREACH(sharedConditional conditional,bn.conditionals_) + push_back(conditional); + } /* ************************************************************************* */ template - void BayesNet::popLeaf(iterator conditional) { + void BayesNet::push_front(const BayesNet bn) { + BOOST_FOREACH(sharedConditional conditional,bn.conditionals_) + push_front(conditional); + } + + /* ************************************************************************* */ + template + void BayesNet::popLeaf(iterator conditional) { #ifndef NDEBUG BOOST_FOREACH(typename CONDITIONAL::shared_ptr checkConditional, conditionals_) { BOOST_FOREACH(Index key, (*conditional)->frontals()) { if(std::find(checkConditional->beginParents(), checkConditional->endParents(), key) != checkConditional->endParents()) - throw std::invalid_argument( - "Debug mode exception: in BayesNet::popLeaf, the requested conditional is not a leaf."); + throw std::invalid_argument( + "Debug mode exception: in BayesNet::popLeaf, the requested conditional is not a leaf."); } } #endif conditionals_.erase(conditional); - } + } - /* ************************************************************************* */ - template - FastList BayesNet::ordering() const { - FastList ord; - BOOST_FOREACH(sharedConditional conditional,conditionals_) - ord.insert(ord.begin(), conditional->beginFrontals(), conditional->endFrontals()); - return ord; - } + /* ************************************************************************* */ + template + FastList BayesNet::ordering() const { + FastList ord; + BOOST_FOREACH(sharedConditional conditional,conditionals_) + ord.insert(ord.begin(), conditional->beginFrontals(), + conditional->endFrontals()); + return ord; + } // /* ************************************************************************* */ // template @@ -139,21 +145,22 @@ namespace gtsam { // of.close(); // } // - /* ************************************************************************* */ + /* ************************************************************************* */ - template - typename BayesNet::sharedConditional - BayesNet::operator[](Index key) const { - BOOST_FOREACH(typename CONDITIONAL::shared_ptr conditional, conditionals_) { - typename CONDITIONAL::const_iterator it = std::find(conditional->beginFrontals(), conditional->endFrontals(), key); - if (it!=conditional->endFrontals()) { + template + typename BayesNet::sharedConditional BayesNet::operator[]( + Index key) const { + BOOST_FOREACH(typename CONDITIONAL::shared_ptr conditional, conditionals_) { + typename CONDITIONAL::const_iterator it = std::find( + conditional->beginFrontals(), conditional->endFrontals(), key); + if (it != conditional->endFrontals()) { return conditional; } - } - throw(invalid_argument((boost::format( - "BayesNet::operator['%1%']: not found") % key).str())); - } + } + throw(std::invalid_argument( + (boost::format("BayesNet::operator['%1%']: not found") % key).str())); + } - /* ************************************************************************* */ +/* ************************************************************************* */ } // namespace gtsam diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 0aefeaa19..0100bdd73 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -26,22 +26,16 @@ #include #include -#include -#include - #include #include // for operator += #include -#include -#include + #include -using namespace boost::assign; -namespace lam = boost::lambda; +#include +#include namespace gtsam { - using namespace std; - /* ************************************************************************* */ template typename BayesTree::CliqueData @@ -64,8 +58,8 @@ namespace gtsam { /* ************************************************************************* */ template void BayesTree::saveGraph(const std::string &s) const { - if (!root_.get()) throw invalid_argument("the root of Bayes tree has not been initialized!"); - ofstream of(s.c_str()); + if (!root_.get()) throw std::invalid_argument("the root of Bayes tree has not been initialized!"); + std::ofstream of(s.c_str()); of<< "digraph G{\n"; saveGraph(of, root_); of<<"}"; @@ -73,12 +67,12 @@ namespace gtsam { } template - void BayesTree::saveGraph(ostream &s, sharedClique clique, int parentnum) const { + void BayesTree::saveGraph(std::ostream &s, sharedClique clique, int parentnum) const { static int num = 0; bool first = true; std::stringstream out; out << num; - string parent = out.str(); + std::string parent = out.str(); parent += "[label=\""; BOOST_FOREACH(Index index, clique->conditional_->frontals()) { @@ -136,7 +130,7 @@ namespace gtsam { /* ************************************************************************* */ template void BayesTree::Cliques::print(const std::string& s) const { - cout << s << ":\n"; + std::cout << s << ":\n"; BOOST_FOREACH(sharedClique clique, *this) clique->printTree(); } @@ -175,7 +169,7 @@ namespace gtsam { /* ************************************************************************* */ template typename BayesTree::sharedClique BayesTree::addClique( - const sharedConditional& conditional, list& child_cliques) { + const sharedConditional& conditional, std::list& child_cliques) { sharedClique new_clique(new Clique(conditional)); nodes_.resize(std::max(conditional->lastFrontalKey()+1, nodes_.size())); BOOST_FOREACH(Index key, conditional->frontals()) @@ -290,10 +284,10 @@ namespace gtsam { template BayesTree::BayesTree(const BayesNet& bayesNet, std::list > subtrees) { if (bayesNet.size() == 0) - throw invalid_argument("BayesTree::insert: empty bayes net!"); + throw std::invalid_argument("BayesTree::insert: empty bayes net!"); // get the roots of child subtrees and merge their nodes_ - list childRoots; + std::list childRoots; typedef BayesTree Tree; BOOST_FOREACH(const Tree& subtree, subtrees) { nodes_.insert(subtree.nodes_.begin(), subtree.nodes_.end()); @@ -329,12 +323,12 @@ namespace gtsam { /* ************************************************************************* */ template - void BayesTree::print(const string& s) const { + void BayesTree::print(const std::string& s) const { if (root_.use_count() == 0) { printf("WARNING: BayesTree.print encountered a forest...\n"); return; } - cout << s << ": clique size == " << size() << ", node size == " << nodes_.size() << endl; + std::cout << s << ": clique size == " << size() << ", node size == " << nodes_.size() << std::endl; if (nodes_.empty()) return; root_->printTree(""); } @@ -379,7 +373,7 @@ namespace gtsam { // if no parents, start a new root clique if (parents.empty()) { - if(debug) cout << "No parents so making root" << endl; + if(debug) std::cout << "No parents so making root" << std::endl; bayesTree.root_ = bayesTree.addClique(conditional); return; } @@ -387,13 +381,13 @@ namespace gtsam { // otherwise, find the parent clique by using the index data structure // to find the lowest-ordered parent Index parentRepresentative = bayesTree.findParentClique(parents); - if(debug) cout << "First-eliminated parent is " << parentRepresentative << ", have " << bayesTree.nodes_.size() << " nodes." << endl; + if(debug) std::cout << "First-eliminated parent is " << parentRepresentative << ", have " << bayesTree.nodes_.size() << " nodes." << std::endl; sharedClique parent_clique = bayesTree[parentRepresentative]; if(debug) parent_clique->print("Parent clique is "); // if the parents and parent clique have the same size, add to parent clique if ((*parent_clique)->size() == size_t(parents.size())) { - if(debug) cout << "Adding to parent clique" << endl; + if(debug) std::cout << "Adding to parent clique" << std::endl; #ifndef NDEBUG // Debug check that the parent keys of the new conditional match the keys // currently in the clique. @@ -408,7 +402,7 @@ namespace gtsam { #endif addToCliqueFront(bayesTree, conditional, parent_clique); } else { - if(debug) cout << "Starting new clique" << endl; + if(debug) std::cout << "Starting new clique" << std::endl; // otherwise, start a new clique and add it to the tree bayesTree.addClique(conditional,parent_clique); } @@ -418,10 +412,10 @@ namespace gtsam { //TODO: remove this function after removing TSAM.cpp template typename BayesTree::sharedClique BayesTree::insert( - const sharedConditional& clique, list& children, bool isRootClique) { + const sharedConditional& clique, std::list& children, bool isRootClique) { if (clique->nrFrontals() == 0) - throw invalid_argument("BayesTree::insert: empty clique!"); + throw std::invalid_argument("BayesTree::insert: empty clique!"); // create a new clique and add all the conditionals to the clique sharedClique new_clique = addClique(clique, children); @@ -512,7 +506,7 @@ namespace gtsam { FactorGraph p_C1C2(C1->joint(C2, root_, function)); // eliminate remaining factor graph to get requested joint - vector key12(2); key12[0] = key1; key12[1] = key2; + std::vector key12(2); key12[0] = key1; key12[1] = key2; GenericSequentialSolver solver(p_C1C2); return solver.jointFactorGraph(key12,function); } diff --git a/gtsam/inference/EliminationTree-inl.h b/gtsam/inference/EliminationTree-inl.h index e5f50a867..2f62f79af 100644 --- a/gtsam/inference/EliminationTree-inl.h +++ b/gtsam/inference/EliminationTree-inl.h @@ -24,14 +24,12 @@ #include #include -#include #include + #include #include #include -using namespace std; - namespace gtsam { /* ************************************************************************* */ @@ -41,7 +39,7 @@ typename EliminationTree::sharedFactor EliminationTree::eliminat static const bool debug = false; - if(debug) cout << "ETree: eliminating " << this->key_ << endl; + if(debug) std::cout << "ETree: eliminating " << this->key_ << std::endl; // Create the list of factors to be eliminated, initially empty, and reserve space FactorGraph factors; @@ -60,7 +58,7 @@ typename EliminationTree::sharedFactor EliminationTree::eliminat eliminated(function(factors, 1)); conditionals[this->key_] = eliminated.first; - if(debug) cout << "Eliminated " << this->key_ << " to get:\n"; + if(debug) std::cout << "Eliminated " << this->key_ << " to get:\n"; if(debug) eliminated.first->print("Conditional: "); if(debug) eliminated.second->print("Factor: "); @@ -69,17 +67,17 @@ typename EliminationTree::sharedFactor EliminationTree::eliminat /* ************************************************************************* */ template -vector EliminationTree::ComputeParents(const VariableIndex& structure) { +std::vector EliminationTree::ComputeParents(const VariableIndex& structure) { // Number of factors and variables const size_t m = structure.nFactors(); const size_t n = structure.size(); - static const Index none = numeric_limits::max(); + static const Index none = std::numeric_limits::max(); // Allocate result parent vector and vector of last factor columns - vector parents(n, none); - vector prevCol(m, none); + std::vector parents(n, none); + std::vector prevCol(m, none); // for column j \in 1 to n do for (Index j = 0; j < n; j++) { @@ -111,17 +109,17 @@ typename EliminationTree::shared_ptr EliminationTree::Create( tic(1, "ET ComputeParents"); // Compute the tree structure - vector parents(ComputeParents(structure)); + std::vector parents(ComputeParents(structure)); toc(1, "ET ComputeParents"); // Number of variables const size_t n = structure.size(); - static const Index none = numeric_limits::max(); + static const Index none = std::numeric_limits::max(); // Create tree structure tic(2, "assemble tree"); - vector trees(n); + std::vector trees(n); for (Index k = 1; k <= n; k++) { Index j = n - k; // Start at the last variable and loop down to 0 trees[j].reset(new EliminationTree(j)); // Create a new node on this variable @@ -169,7 +167,7 @@ EliminationTree::Create(const FactorGraph& factorGraph) { /* ************************************************************************* */ template void EliminationTree::print(const std::string& name) const { - cout << name << " (" << key_ << ")" << endl; + std::cout << name << " (" << key_ << ")" << std::endl; BOOST_FOREACH(const sharedFactor& factor, factors_) { factor->print(name + " "); } BOOST_FOREACH(const shared_ptr& child, subTrees_) { diff --git a/gtsam/inference/JunctionTree-inl.h b/gtsam/inference/JunctionTree-inl.h index bf1c17890..c1add38bf 100644 --- a/gtsam/inference/JunctionTree-inl.h +++ b/gtsam/inference/JunctionTree-inl.h @@ -19,19 +19,15 @@ #pragma once -#include #include #include #include +#include #include -#include -#include namespace gtsam { - using namespace std; - /* ************************************************************************* */ template void JunctionTree::construct(const FG& fg, const VariableIndex& variableIndex) { From 050cab36d4bba3012182f316428c011e7a608e48 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 08:30:55 +0000 Subject: [PATCH 268/914] remove obsolete iSAMgui --- matlab/iSAMgui.fig | Bin 5766 -> 0 bytes matlab/iSAMgui.m | 171 --------------------------------------------- 2 files changed, 171 deletions(-) delete mode 100644 matlab/iSAMgui.fig delete mode 100644 matlab/iSAMgui.m diff --git a/matlab/iSAMgui.fig b/matlab/iSAMgui.fig deleted file mode 100644 index 5f6154b49e54aa88b51c014d3ee2c3fa8d17f47f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5766 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 S#A7^nFj4xPMleAk<-Y)|5uDBd diff --git a/matlab/iSAMgui.m b/matlab/iSAMgui.m deleted file mode 100644 index 71cd53855..000000000 --- a/matlab/iSAMgui.m +++ /dev/null @@ -1,171 +0,0 @@ -function varargout = iSAMgui(varargin) -% ISAMGUI MATLAB code for iSAMgui.fig -% ISAMGUI, by itself, creates a new ISAMGUI or raises the existing -% singleton*. -% -% H = ISAMGUI returns the handle to a new ISAMGUI or the handle to -% the existing singleton*. -% -% ISAMGUI('CALLBACK',hObject,eventData,handles,...) calls the local -% function named CALLBACK in ISAMGUI.M with the given input arguments. -% -% ISAMGUI('Property','Value',...) creates a new ISAMGUI or raises the -% existing singleton*. Starting from the left, property value pairs are -% applied to the GUI before iSAMgui_OpeningFcn gets called. An -% unrecognized property name or invalid value makes property application -% stop. All inputs are passed to iSAMgui_OpeningFcn via varargin. -% -% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one -% instance to run (singleton)". -% -% See also: GUIDE, GUIDATA, GUIHANDLES - -% Edit the above text to modify the response to help iSAMgui - -% Last Modified by GUIDE v2.5 07-Jun-2012 01:55:37 - -% Begin initialization code - DO NOT EDIT -gui_Singleton = 1; -gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @iSAMgui_OpeningFcn, ... - 'gui_OutputFcn', @iSAMgui_OutputFcn, ... - 'gui_LayoutFcn', [] , ... - 'gui_Callback', []); -if nargin && ischar(varargin{1}) - gui_State.gui_Callback = str2func(varargin{1}); -end - -if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); -else - gui_mainfcn(gui_State, varargin{:}); -end -% End initialization code - DO NOT EDIT - -% --- Executes just before iSAMgui is made visible. -function iSAMgui_OpeningFcn(hObject, eventdata, handles, varargin) -% This function has no output args, see OutputFcn. -% hObject handle to figure -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -% varargin command line arguments to iSAMgui (see VARARGIN) - -% Choose default command line output for iSAMgui -handles.output = hObject; - -% Update handles structure -guidata(hObject, handles); - -% This sets up the initial plot - only do when we are invisible -% so window can get raised using iSAMgui. -if strcmp(get(hObject,'Visible'),'off') - plot(rand(5)); -end - -% UIWAIT makes iSAMgui wait for user response (see UIRESUME) -% uiwait(handles.figure1); - - -% --- Outputs from this function are returned to the command line. -function varargout = iSAMgui_OutputFcn(hObject, eventdata, handles) -% varargout cell array for returning output args (see VARARGOUT); -% hObject handle to figure -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Get default command line output from handles structure -varargout{1} = handles.output; - -% --- Executes on button press in pushbutton1. -function pushbutton1_Callback(hObject, eventdata, handles) -% hObject handle to pushbutton1 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -axes(handles.axes1); -cla; - -popup_sel_index = get(handles.popupmenu1, 'Value'); -switch popup_sel_index - case 1 - plot(rand(5)); - case 2 - plot(sin(1:0.01:25.99)); - case 3 - bar(1:.5:10); - case 4 - plot(membrane); - case 5 - surf(peaks); -end - - -% -------------------------------------------------------------------- -function FileMenu_Callback(hObject, eventdata, handles) -% hObject handle to FileMenu (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - - -% -------------------------------------------------------------------- -function OpenMenuItem_Callback(hObject, eventdata, handles) -% hObject handle to OpenMenuItem (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -file = uigetfile('*.fig'); -if ~isequal(file, 0) - open(file); -end - -% -------------------------------------------------------------------- -function PrintMenuItem_Callback(hObject, eventdata, handles) -% hObject handle to PrintMenuItem (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -printdlg(handles.figure1) - -% -------------------------------------------------------------------- -function CloseMenuItem_Callback(hObject, eventdata, handles) -% hObject handle to CloseMenuItem (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],... - ['Close ' get(handles.figure1,'Name') '...'],... - 'Yes','No','Yes'); -if strcmp(selection,'No') - return; -end - -delete(handles.figure1) - - -% --- Executes on selection change in popupmenu1. -function popupmenu1_Callback(hObject, eventdata, handles) -% hObject handle to popupmenu1 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: contents = get(hObject,'String') returns popupmenu1 contents as cell array -% contents{get(hObject,'Value')} returns selected item from popupmenu1 - - -% --- Executes during object creation, after setting all properties. -function popupmenu1_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu1 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: popupmenu controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -set(hObject, 'String', {'plot(rand(5))', 'plot(sin(1:0.01:25))', 'bar(1:.5:10)', 'plot(membrane)', 'surf(peaks)'}); - - -% --- Executes on button press in pushbutton4. -function pushbutton4_Callback(hObject, eventdata, handles) -% hObject handle to pushbutton4 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) From cafac0b7a1b5a73c7b2cd95288a3b3362e1fbb09 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 08:32:07 +0000 Subject: [PATCH 269/914] VisualISAMgui with figure for 2 datasets. --- matlab/examples/VisualISAMData_cube.m | 34 ++++ matlab/examples/VisualISAMInitialize.m | 10 +- matlab/examples/VisualISAMPlot.m | 22 +++ matlab/examples/VisualISAMStep.m | 13 +- matlab/examples/VisualISAM_gui.fig | Bin 6094 -> 8272 bytes matlab/examples/VisualISAM_gui.m | 264 +++++++++++++++++++++++-- 6 files changed, 318 insertions(+), 25 deletions(-) create mode 100644 matlab/examples/VisualISAMData_cube.m create mode 100644 matlab/examples/VisualISAMPlot.m diff --git a/matlab/examples/VisualISAMData_cube.m b/matlab/examples/VisualISAMData_cube.m new file mode 100644 index 000000000..3f4f015cf --- /dev/null +++ b/matlab/examples/VisualISAMData_cube.m @@ -0,0 +1,34 @@ +function [ data ] = VisualISAMData_cube() +%VISUALISAMDATA_TRIANGLE Generate data for visual ISAM triangle example. +% Landmarks include 3 points around the world's origin on the z=0 plane. +% Cameras are on a circle at a certain height, looking at the origin. +%% Create a triangle target, just 3 points on a plane +nPoints = 8; +data.points = {gtsamPoint3([10 10 10]'),... + gtsamPoint3([-10 10 10]'),... + gtsamPoint3([-10 -10 10]'),... + gtsamPoint3([10 -10 10]'),... + gtsamPoint3([10 10 -10]'),... + gtsamPoint3([-10 10 -10]'),... + gtsamPoint3([-10 -10 -10]'),... + gtsamPoint3([10 -10 -10]')}; + +%% Create camera cameras on a circle around the triangle +nCameras = 10; +height = 0; +r = 30; +data.cameras = {}; +data.K = gtsamCal3_S2(500,500,0,640/2,480/2); +for i=1:nCameras + theta = (i-1)*2*pi/nCameras; + t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); + data.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), data.K); +end + +data.posePriorNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 5.0 5.0 5.0]'); +data.odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 2.0 2.0 2.0]'); +data.pointPriorNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); +data.measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); + +end + diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index 4ccab5f5c..da0bb735f 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -28,6 +28,14 @@ function [ isam, results ] = VisualISAMInitialize( data, reorderInterval ) %% Update ISAM isam.update(newFactors, initials); - results = isam.estimate(); + results.frame_i = 2; + results.estimates = isam.estimate(); + for i=1:2 + results.Pposes{i} = isam.marginalCovariance(symbol('x',i)); + end + + for j=1:size(data.points,2) + results.Ppoints{j} = isam.marginalCovariance(symbol('l',j)); + end end diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m new file mode 100644 index 000000000..0459ee201 --- /dev/null +++ b/matlab/examples/VisualISAMPlot.m @@ -0,0 +1,22 @@ +function VisualISAMPlot( results, data ) +%VISUALISAMPLOT Plot results of a step in visual ISAM + hold on; + + for i=1:results.frame_i + pose_ii = results.estimates.pose(symbol('x',i)); + plotPose3(pose_ii,results.Pposes{i},10); + end + + for j=1:size(data.points,2) + point_j = results.estimates.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],results.Ppoints{j}); + end + + axis([-35 35 -35 35 -35 35]) + view([36 34]) + colormap('hot') + + hold off; +end + diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index 3a0aafb0b..fefc795dd 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -14,11 +14,18 @@ function [ isam, results ] = VisualISAMStep( frame_i, isam, data, prevResults ) %% Initial estimates for new variables initials = visualSLAMValues; - prevPose = prevResults.pose(symbol('x',frame_i-1)); + prevPose = prevResults.estimates.pose(symbol('x',frame_i-1)); initials.insertPose(symbol('x',frame_i), prevPose.compose(odometry)); isam.update(newFactors, initials); - results = isam.estimate(); - + results.frame_i = frame_i; + results.estimates = isam.estimate(); + for i=1:frame_i + results.Pposes{i} = isam.marginalCovariance(symbol('x',i)); + end + + for j=1:size(data.points,2) + results.Ppoints{j} = isam.marginalCovariance(symbol('l',j)); + end end diff --git a/matlab/examples/VisualISAM_gui.fig b/matlab/examples/VisualISAM_gui.fig index 4fb6f6bde9066a3c8c118e14c1764fe498286463..7cb8a50e801fa00d342d1c1d64113c773361e537 100644 GIT binary patch literal 8272 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 p6!Lls?};R7lJC31Vy#OC0tN9Nt-4TAyFMy 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 size(handles.results,2)) + [handles.isam handles.results{handles.frame_i}] = ... + VisualISAMStep(handles.frame_i, handles.isam, ... + handles.data, handles.results{handles.frame_i-1}); + end + handles.results{handles.frame_i}.estimates + cla(handles.resultAxes); + VisualISAMPlot(handles.results{handles.frame_i}, handles.data) guidata(hObject,handles) else + sprintf('Frame %d:', handles.frame_i) sprintf('No more frame!') end -% --- Executes on button press in clearButton. -function clearButton_Callback(hObject, eventdata, handles) -% hObject handle to clearButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - clear; - - function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB @@ -154,7 +168,11 @@ function popupmenu1_Callback(hObject, eventdata, handles) % Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array % contents{get(hObject,'Value')} returns selected item from popupmenu1 - + str = cellstr(get(hObject,'String')); + sel = get(hObject,'Value'); + handles.selectedDataset = str{sel} + handles=initialize(handles) + guidata(hObject, handles); % --- Executes during object creation, after setting all properties. function popupmenu1_CreateFcn(hObject, eventdata, handles) @@ -170,7 +188,211 @@ end % --- Executes during object creation, after setting all properties. -function figure1_CreateFcn(hObject, eventdata, handles) -% hObject handle to figure1 (see GCBO) +function Dataset_CreateFcn(hObject, eventdata, handles) +% hObject handle to Dataset (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called + + +% --- Executes on button press in backButton. +function backButton_Callback(hObject, eventdata, handles) +% hObject handle to backButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + if (handles.frame_i>2) + handles.frame_i = handles.frame_i-1; + sprintf('Frame %d:', handles.frame_i) + handles.results{handles.frame_i}.estimates + cla(handles.resultAxes); + VisualISAMPlot(handles.results{handles.frame_i}, handles.data) + guidata(hObject,handles) + else + sprintf('No more frame!'); + end + +% --- Executes on button press in runButton. +function runButton_Callback(hObject, eventdata, handles) +% hObject handle to runButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + for i=handles.frame_i+1:size(handles.data.cameras,2) + if (i > size(handles.results,2)) + [handles.isam handles.results{i}] = ... + VisualISAMStep(i, handles.isam, ... + handles.data, handles.results{i-1}); + end + handles.results{i}.estimates + cla(handles.resultAxes); + VisualISAMPlot(handles.results{i}, handles.data) + end + handles.frame_i = size(handles.data.cameras,2); + sprintf('Frame %d:', handles.frame_i) + guidata(hObject,handles) + + +% --- Executes on button press in stopButton. +function stopButton_Callback(hObject, eventdata, handles) +% hObject handle to stopButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + sprintf('Not yet implemented') + + +function edit8_Callback(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit8 as text +% str2double(get(hObject,'String')) returns contents of edit8 as a double + + +% --- Executes during object creation, after setting all properties. +function edit8_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function odoTrans_Callback(hObject, eventdata, handles) +% hObject handle to odoTrans (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of odoTrans as text +% str2double(get(hObject,'String')) returns contents of odoTrans as a double + + +% --- Executes during object creation, after setting all properties. +function odoTrans_CreateFcn(hObject, eventdata, handles) +% hObject handle to odoTrans (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function measNoise_Callback(hObject, eventdata, handles) +% hObject handle to measNoise (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of measNoise as text +% str2double(get(hObject,'String')) returns contents of measNoise as a double + + +% --- Executes during object creation, after setting all properties. +function measNoise_CreateFcn(hObject, eventdata, handles) +% hObject handle to measNoise (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function posePriorRot_Callback(hObject, eventdata, handles) +% hObject handle to posePriorRot (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of posePriorRot as text +% str2double(get(hObject,'String')) returns contents of posePriorRot as a double + + +% --- Executes during object creation, after setting all properties. +function posePriorRot_CreateFcn(hObject, eventdata, handles) +% hObject handle to posePriorRot (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function posePriorTrans_Callback(hObject, eventdata, handles) +% hObject handle to posePriorTrans (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of posePriorTrans as text +% str2double(get(hObject,'String')) returns contents of posePriorTrans as a double + + +% --- Executes during object creation, after setting all properties. +function posePriorTrans_CreateFcn(hObject, eventdata, handles) +% hObject handle to posePriorTrans (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function pointPrior_Callback(hObject, eventdata, handles) +% hObject handle to pointPrior (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of pointPrior as text +% str2double(get(hObject,'String')) returns contents of pointPrior as a double + + +% --- Executes during object creation, after setting all properties. +function pointPrior_CreateFcn(hObject, eventdata, handles) +% hObject handle to pointPrior (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function odoRot_Callback(hObject, eventdata, handles) +% hObject handle to odoRot (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of odoRot as text +% str2double(get(hObject,'String')) returns contents of odoRot as a double + + +% --- Executes during object creation, after setting all properties. +function odoRot_CreateFcn(hObject, eventdata, handles) +% hObject handle to odoRot (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end From 8740da8fb779a184f7b2d74f153eb77f8a886068 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 8 Jun 2012 11:02:15 +0000 Subject: [PATCH 270/914] Small gui change --- matlab/examples/VisualISAMPlot.m | 4 +--- matlab/examples/VisualISAM_gui.m | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index 0459ee201..c68ce5519 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -13,9 +13,7 @@ function VisualISAMPlot( results, data ) covarianceEllipse3D([point_j.x;point_j.y;point_j.z],results.Ppoints{j}); end - axis([-35 35 -35 35 -35 35]) - view([36 34]) - colormap('hot') + axis([-35 35 -35 35 -15 15]) hold off; end diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index e7f44c920..d2127fa70 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -105,6 +105,9 @@ function handles=initialize(handles) handles.results{2}.estimates cla(handles.resultAxes); VisualISAMPlot(handles.results{handles.frame_i}, handles.data) + view([36 34]) + colormap('hot') + % --- Executes on button press in intializeButton. function intializeButton_Callback(hObject, eventdata, handles) From 4f7b29dbfdedc76f4bffee56423c99b455c3ae4b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 13:30:49 +0000 Subject: [PATCH 271/914] Correct BOOST version in CMakeLists.txt (2nd attempt) --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8daa00fce..649622911 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,7 @@ endif() if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.42 COMPONENTS serialization REQUIRED) +find_package(Boost 1.43 COMPONENTS serialization REQUIRED) # General build settings include_directories( @@ -155,7 +155,8 @@ set(CPACK_PACKAGE_VERSION_MINOR ${GTSAM_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${GTSAM_VERSION_PATCH}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") set(CPACK_INSTALLED_DIRECTORIES "doc;.") # Include doc directory -set(CPACK_SOURCE_IGNORE_FILES "/build;/\\\\.;/makedoc.sh$;/gtsam_unstable/") +set(CPACK_SOURCE_IGNORE_FILES "/build;/\\\\.;/makedoc.sh$") +set(CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/gtsam_unstable/") set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}") #set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-aspn${GTSAM_VERSION_PATCH}") # Used for creating ASPN tarballs From 30fd9d2a955a9edea9db622d775be47a8ba2552f Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 8 Jun 2012 14:28:00 +0000 Subject: [PATCH 272/914] Added back a flag for toolbox make commands --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 649622911..50c1d12c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,8 @@ set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTR # Flags for building/installing mex files option(GTSAM_BUILD_MEX_BIN "Enable/Disable building of matlab mex files" OFF) option(GTSAM_INSTALL_MEX_BIN "Enable/Disable installing matlab mex binaries" OFF) -set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Flags for running make on toolbox MEX files") +set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Flags for running Matlab MEX compilation") +set(GTSAM_BUILD_MEX_MAKE_FLAGS "-j2" CACHE STRING "Flags for running make on toolbox MEX files") set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)") # Flags for choosing default packaging tools From a23127a315da6e9885d22a0068b36718809687b4 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 14:33:36 +0000 Subject: [PATCH 273/914] Removed using namespace in header files --- gtsam/discrete/DecisionTree-inl.h | 3 +-- gtsam/discrete/DiscreteConditional.cpp | 2 +- gtsam/discrete/DiscreteFactorGraph.cpp | 4 ++-- gtsam/inference/BayesNet-inl.h | 16 +++++++-------- gtsam/inference/BayesTree-inl.h | 13 +++++++----- gtsam/inference/ClusterTree-inl.h | 20 +++++++++---------- gtsam/inference/FactorGraph-inl.h | 14 ++++++------- .../inference/GenericMultifrontalSolver-inl.h | 4 +--- gtsam/inference/ISAM-inl.h | 3 --- gtsam/inference/JunctionTree-inl.h | 18 ++++++++--------- gtsam/inference/graph-inl.h | 6 ++---- gtsam/nonlinear/ISAM2-impl.cpp | 2 ++ gtsam/nonlinear/ISAM2-impl.h | 6 ++---- gtsam/nonlinear/ISAM2-inl.h | 10 ++++------ gtsam/nonlinear/ISAM2.h | 6 +++--- gtsam/nonlinear/NonlinearFactor.h | 2 +- .../SuccessiveLinearizationOptimizer.h | 2 +- gtsam/slam/ProjectionFactor.h | 4 ++-- gtsam_unstable/linear/iterative-inl.h | 2 -- 19 files changed, 62 insertions(+), 75 deletions(-) diff --git a/gtsam/discrete/DecisionTree-inl.h b/gtsam/discrete/DecisionTree-inl.h index a9953d506..057f014bf 100644 --- a/gtsam/discrete/DecisionTree-inl.h +++ b/gtsam/discrete/DecisionTree-inl.h @@ -27,6 +27,7 @@ #include #include #include +using boost::assign::operator+=; #include #include @@ -37,8 +38,6 @@ namespace gtsam { - using namespace boost::assign; - /*********************************************************************************/ // Node /*********************************************************************************/ diff --git a/gtsam/discrete/DiscreteConditional.cpp b/gtsam/discrete/DiscreteConditional.cpp index f9d3823d6..34cf016ec 100644 --- a/gtsam/discrete/DiscreteConditional.cpp +++ b/gtsam/discrete/DiscreteConditional.cpp @@ -66,7 +66,7 @@ namespace gtsam { Index j = (key); size_t value = parentsValues.at(j); pFS = pFS.choose(j, value); - } catch (exception& e) { + } catch (exception&) { throw runtime_error( "DiscreteConditional::choose: parent value missing"); }; diff --git a/gtsam/discrete/DiscreteFactorGraph.cpp b/gtsam/discrete/DiscreteFactorGraph.cpp index 0d5e01c29..4726c752f 100644 --- a/gtsam/discrete/DiscreteFactorGraph.cpp +++ b/gtsam/discrete/DiscreteFactorGraph.cpp @@ -64,7 +64,7 @@ namespace gtsam { } /* ************************************************************************* */ - pair // + std::pair // EliminateDiscrete(const FactorGraph& factors, size_t num) { // PRODUCT: multiply all factors @@ -87,7 +87,7 @@ namespace gtsam { toc(3, "divide"); tictoc_finishedIteration(); - return make_pair(cond, sum); + return std::make_pair(cond, sum); } /* ************************************************************************* */ diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 88b386b72..b668a7741 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -24,20 +24,20 @@ #include #include // for += -using namespace boost::assign; +using boost::assign::operator+=; #include #include namespace gtsam { - /* ************************************************************************* */ - template - void BayesNet::print(const std::string& s) const { - std::cout << s; - BOOST_REVERSE_FOREACH(sharedConditional conditional,conditionals_) - conditional->print(); - } + /* ************************************************************************* */ + template + void BayesNet::print(const std::string& s) const { + std::cout << s; + BOOST_REVERSE_FOREACH(sharedConditional conditional, conditionals_) + conditional->print(); + } /* ************************************************************************* */ template diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 0100bdd73..28f5e10cc 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -26,14 +26,17 @@ #include #include -#include -#include // for operator += -#include - #include #include #include +#include +#include // for operator += +using boost::assign::operator+=; +#include + +namespace lam = boost::lambda; + namespace gtsam { /* ************************************************************************* */ @@ -328,7 +331,7 @@ namespace gtsam { printf("WARNING: BayesTree.print encountered a forest...\n"); return; } - std::cout << s << ": clique size == " << size() << ", node size == " << nodes_.size() << std::endl; + std::cout << s << ": clique size == " << size() << ", node size == " << nodes_.size() << std::endl; if (nodes_.empty()) return; root_->printTree(""); } diff --git a/gtsam/inference/ClusterTree-inl.h b/gtsam/inference/ClusterTree-inl.h index 0a0b9e64e..267602eea 100644 --- a/gtsam/inference/ClusterTree-inl.h +++ b/gtsam/inference/ClusterTree-inl.h @@ -26,8 +26,6 @@ namespace gtsam { - using namespace std; - /* ************************************************************************* * * Cluster * ************************************************************************* */ @@ -73,19 +71,19 @@ namespace gtsam { /* ************************************************************************* */ template - void ClusterTree::Cluster::print(const string& indent) const { - cout << indent; + void ClusterTree::Cluster::print(const std::string& indent) const { + std::cout << indent; BOOST_FOREACH(const Index key, frontal) - cout << key << " "; - cout << ": "; + std::cout << key << " "; + std::cout << ": "; BOOST_FOREACH(const Index key, separator) - cout << key << " "; - cout << endl; + std::cout << key << " "; + std::cout << std::endl; } /* ************************************************************************* */ template - void ClusterTree::Cluster::printTree(const string& indent) const { + void ClusterTree::Cluster::printTree(const std::string& indent) const { print(indent); BOOST_FOREACH(const shared_ptr& child, children_) child->printTree(indent + " "); @@ -95,8 +93,8 @@ namespace gtsam { * ClusterTree * ************************************************************************* */ template - void ClusterTree::print(const string& str) const { - cout << str << endl; + void ClusterTree::print(const std::string& str) const { + std::cout << str << std::endl; if (root_) root_->printTree(""); } diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 3451b6ed4..b7c3f81a5 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -34,17 +34,15 @@ #include #include -using namespace std; - namespace gtsam { /* ************************************************************************* */ template - void FactorGraph::print(const string& s) const { - cout << s << endl; - cout << "size: " << size() << endl; + void FactorGraph::print(const std::string& s) const { + std::cout << s << std::endl; + std::cout << "size: " << size() << std::endl; for (size_t i = 0; i < factors_.size(); i++) { - stringstream ss; + std::stringstream ss; ss << "factor " << i << ": "; if (factors_[i] != NULL) factors_[i]->print(ss.str()); } @@ -79,7 +77,7 @@ namespace gtsam { /* ************************************************************************* */ template void FactorGraph::replace(size_t index, sharedFactor factor) { - if (index >= factors_.size()) throw invalid_argument(boost::str( + if (index >= factors_.size()) throw std::invalid_argument(boost::str( boost::format("Factor graph does not contain a factor with index %d.") % index)); // Replace the factor @@ -115,7 +113,7 @@ namespace gtsam { /* ************************************************************************* */ template void _FactorGraph_BayesTree_adder( - vector::sharedFactor>& factors, + std::vector::sharedFactor>& factors, const typename BayesTree::sharedClique& clique) { if(clique) { diff --git a/gtsam/inference/GenericMultifrontalSolver-inl.h b/gtsam/inference/GenericMultifrontalSolver-inl.h index 84ca937fa..40a70bfd7 100644 --- a/gtsam/inference/GenericMultifrontalSolver-inl.h +++ b/gtsam/inference/GenericMultifrontalSolver-inl.h @@ -21,8 +21,6 @@ #include #include -using namespace std; - namespace gtsam { /* ************************************************************************* */ @@ -69,7 +67,7 @@ namespace gtsam { // We currently have code written only for computing the - if (js.size() != 2) throw domain_error( + if (js.size() != 2) throw std::domain_error( "*MultifrontalSolver::joint(js) currently can only compute joint marginals\n" "for exactly two variables. You can call marginal to compute the\n" "marginal for one variable. *SequentialSolver::joint(js) can compute the\n" diff --git a/gtsam/inference/ISAM-inl.h b/gtsam/inference/ISAM-inl.h index 5d72f396c..c1252f1b0 100644 --- a/gtsam/inference/ISAM-inl.h +++ b/gtsam/inference/ISAM-inl.h @@ -19,7 +19,6 @@ #include #include // for operator += -using namespace boost::assign; #include #include @@ -27,8 +26,6 @@ using namespace boost::assign; namespace gtsam { - using namespace std; - /* ************************************************************************* */ template ISAM::ISAM() : BayesTree() {} diff --git a/gtsam/inference/JunctionTree-inl.h b/gtsam/inference/JunctionTree-inl.h index c1add38bf..1d647ef88 100644 --- a/gtsam/inference/JunctionTree-inl.h +++ b/gtsam/inference/JunctionTree-inl.h @@ -79,7 +79,7 @@ namespace gtsam { // Two stages - first build an array of the lowest-ordered variable in each // factor and find the last variable to be eliminated. - vector lowestOrdered(fg.size(), numeric_limits::max()); + std::vector lowestOrdered(fg.size(), std::numeric_limits::max()); Index maxVar = 0; for(size_t i=0; i > targets(maxVar+1); + std::vector > targets(maxVar+1); for(size_t i=0; i::max()) + if(lowestOrdered[i] != std::numeric_limits::max()) targets[lowestOrdered[i]].push_back(i); // Now call the recursive distributeFactors @@ -141,7 +141,7 @@ namespace gtsam { /* ************************************************************************* */ template - pair::BTClique::shared_ptr, + std::pair::BTClique::shared_ptr, typename FG::sharedFactor> JunctionTree::eliminateOneClique( typename FG::Eliminate function, const boost::shared_ptr& current) const { @@ -151,9 +151,9 @@ namespace gtsam { fg.push_back(*current); // add the local factors // receive the factors from the child and its clique point - list children; + std::list children; BOOST_FOREACH(const boost::shared_ptr& child, current->children()) { - pair tree_factor( + std::pair tree_factor( eliminateOneClique(function, child)); children.push_back(tree_factor.first); fg.push_back(tree_factor.second); @@ -181,7 +181,7 @@ namespace gtsam { } toc(3, "Update tree"); - return make_pair(new_clique, eliminated.second); + return std::make_pair(new_clique, eliminated.second); } /* ************************************************************************* */ @@ -190,9 +190,9 @@ namespace gtsam { typename FG::Eliminate function) const { if (this->root()) { tic(2, "JT eliminate"); - pair ret = + std::pair ret = this->eliminateOneClique(function, this->root()); - if (ret.second->size() != 0) throw runtime_error( + if (ret.second->size() != 0) throw std::runtime_error( "JuntionTree::eliminate: elimination failed because of factors left over!"); toc(2, "JT eliminate"); return ret.first; diff --git a/gtsam/inference/graph-inl.h b/gtsam/inference/graph-inl.h index c4485cf5c..b086fd2fb 100644 --- a/gtsam/inference/graph-inl.h +++ b/gtsam/inference/graph-inl.h @@ -24,8 +24,6 @@ #include -using namespace std; - #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL) namespace gtsam { @@ -66,7 +64,7 @@ SDGraph toBoostGraph(const G& graph) { // convert the factor graph to boost graph SDGraph g; typedef typename boost::graph_traits >::vertex_descriptor BoostVertex; - map key2vertex; + std::map key2vertex; BoostVertex v1, v2; typename G::const_iterator itFactor; @@ -108,7 +106,7 @@ boost::tuple > predecessorMap2Graph(const PredecessorMap& p_map) { G g; - map key2vertex; + std::map key2vertex; V v1, v2, root; KEY child, parent; bool foundRoot = false; diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 05f42ad78..509143b0b 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -23,6 +23,8 @@ #include #include +using namespace std; + namespace gtsam { /* ************************************************************************* */ diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index 34573f0c5..51b613b86 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -22,8 +22,6 @@ namespace gtsam { -using namespace std; - struct ISAM2::Impl { struct PartialSolveResult { @@ -49,7 +47,7 @@ struct ISAM2::Impl { * @param keyFormatter Formatter for printing nonlinear keys during debugging */ static void AddVariables(const Values& newTheta, Values& theta, Permuted& delta, - Permuted& deltaNewton, Permuted& deltaGradSearch, vector& replacedKeys, + Permuted& deltaNewton, Permuted& deltaGradSearch, std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** @@ -88,7 +86,7 @@ struct ISAM2::Impl { * * Alternatively could we trace up towards the root for each variable here? */ - static void FindAll(ISAM2Clique::shared_ptr clique, FastSet& keys, const vector& markedMask); + static void FindAll(ISAM2Clique::shared_ptr clique, FastSet& keys, const std::vector& markedMask); /** * Apply expmap to the given values, but only for indices appearing in diff --git a/gtsam/nonlinear/ISAM2-inl.h b/gtsam/nonlinear/ISAM2-inl.h index 3ca82051d..3520ffb84 100644 --- a/gtsam/nonlinear/ISAM2-inl.h +++ b/gtsam/nonlinear/ISAM2-inl.h @@ -25,8 +25,6 @@ namespace gtsam { -using namespace std; - /* ************************************************************************* */ template VALUE ISAM2::calculateEstimate(Key key) const { @@ -39,7 +37,7 @@ VALUE ISAM2::calculateEstimate(Key key) const { namespace internal { template void optimizeWildfire(const boost::shared_ptr& clique, double threshold, - vector& changed, const vector& replaced, Permuted& delta, int& count) { + std::vector& changed, const std::vector& replaced, Permuted& delta, int& count) { // if none of the variables in this clique (frontal and separator!) changed // significantly, then by the running intersection property, none of the // cliques in the children need to be processed @@ -68,7 +66,7 @@ void optimizeWildfire(const boost::shared_ptr& clique, double threshold, if(recalculate) { // Temporary copy of the original values, to check how much they change - vector originalValues((*clique)->nrFrontals()); + std::vector originalValues((*clique)->nrFrontals()); GaussianConditional::const_iterator it; for(it = (*clique)->beginFrontals(); it!=(*clique)->endFrontals(); it++) { originalValues[it - (*clique)->beginFrontals()] = delta[*it]; @@ -116,8 +114,8 @@ void optimizeWildfire(const boost::shared_ptr& clique, double threshold, /* ************************************************************************* */ template -int optimizeWildfire(const boost::shared_ptr& root, double threshold, const vector& keys, Permuted& delta) { - vector changed(keys.size(), false); +int optimizeWildfire(const boost::shared_ptr& root, double threshold, const std::vector& keys, Permuted& delta) { + std::vector changed(keys.size(), false); int count = 0; // starting from the root, call optimize on each conditional if(root) diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 2211122d8..a2ef3793b 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -246,7 +246,7 @@ struct ISAM2Clique : public BayesTreeCliqueBase >& result) : @@ -260,7 +260,7 @@ struct ISAM2Clique : public BayesTreeCliqueBaseclone() : Base::FactorType::shared_ptr()))); copy->gradientContribution_ = gradientContribution_; @@ -283,7 +283,7 @@ struct ISAM2Clique : public BayesTreeCliqueBaseprint(s + "Cached: "); else - cout << s << "Cached empty" << endl; + std::cout << s << "Cached empty" << std::endl; if(gradientContribution_.rows() != 0) gtsam::print(gradientContribution_, "Gradient contribution: "); } diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 1d4d580b9..8251bff59 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -100,7 +100,7 @@ public: virtual void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { std::cout << s << "keys = { "; BOOST_FOREACH(Key key, this->keys()) { std::cout << keyFormatter(key) << " "; } - std::cout << "}" << endl; + std::cout << "}" << std::endl; } /** Check if two factors are equal */ diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index 156440f06..b4a7c3c21 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -104,7 +104,7 @@ public: return EliminateQR; default: - throw runtime_error("Nonlinear optimization parameter \"factorization\" is invalid"); + throw std::runtime_error("Nonlinear optimization parameter \"factorization\" is invalid"); break; } } diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index 179362a42..c6529a34f 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -97,8 +97,8 @@ namespace gtsam { } catch( CheiralityException& e) { if (H1) *H1 = zeros(2,6); if (H2) *H2 = zeros(2,3); - cout << e.what() << ": Landmark "<< DefaultKeyFormatter(this->key2()) << - " moved behind camera " << DefaultKeyFormatter(this->key1()) << endl; + std::cout << e.what() << ": Landmark "<< DefaultKeyFormatter(this->key2()) << + " moved behind camera " << DefaultKeyFormatter(this->key1()) << std::endl; return ones(2) * 2.0 * K_->fx(); } } diff --git a/gtsam_unstable/linear/iterative-inl.h b/gtsam_unstable/linear/iterative-inl.h index ee43abc77..c91e6f68a 100644 --- a/gtsam_unstable/linear/iterative-inl.h +++ b/gtsam_unstable/linear/iterative-inl.h @@ -22,8 +22,6 @@ #include #include -using namespace std; - namespace gtsam { /* ************************************************************************* */ From dd79bacfabc5b090d9c367e77e7a1f033986e401 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 14:33:53 +0000 Subject: [PATCH 274/914] Removed using namespace in header files --- gtsam/inference/BayesNet-inl.h | 2 +- gtsam/inference/BayesTree-inl.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index b668a7741..57cef4634 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -44,7 +44,7 @@ namespace gtsam { bool BayesNet::equals(const BayesNet& cbn, double tol) const { if (size() != cbn.size()) return false; - return equal(conditionals_.begin(), conditionals_.end(), + return std::equal(conditionals_.begin(), conditionals_.end(), cbn.conditionals_.begin(), equals_star(tol)); } diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 28f5e10cc..9fb8080ce 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -35,8 +35,6 @@ using boost::assign::operator+=; #include -namespace lam = boost::lambda; - namespace gtsam { /* ************************************************************************* */ From d188ed2e1a78ccc8492d130ec8b82950aa897436 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 14:33:59 +0000 Subject: [PATCH 275/914] Removed using namespace in header files --- examples/VisualSLAMData.h | 2 +- gtsam/inference/ClusterTree-inl.h | 4 ++-- gtsam/inference/graph-inl.h | 4 ++-- gtsam/inference/tests/testBayesTree.cpp | 1 + gtsam/inference/tests/testVariableIndex.cpp | 1 + gtsam/linear/SimpleSPCGSolver.cpp | 8 ++++---- gtsam/nonlinear/DoglegOptimizerImpl.cpp | 2 ++ gtsam/nonlinear/Marginals.cpp | 2 ++ gtsam_unstable/discrete/CSP.cpp | 2 ++ gtsam_unstable/discrete/tests/testCSP.cpp | 2 ++ gtsam_unstable/discrete/tests/testSudoku.cpp | 2 ++ gtsam_unstable/dynamics/tests/testIMUSystem.cpp | 1 + 12 files changed, 22 insertions(+), 9 deletions(-) diff --git a/examples/VisualSLAMData.h b/examples/VisualSLAMData.h index 1a55e1a26..b96c24295 100644 --- a/examples/VisualSLAMData.h +++ b/examples/VisualSLAMData.h @@ -41,7 +41,7 @@ struct VisualSLAMExampleData { std::vector poses; // ground-truth camera poses gtsam::Pose3 odometry; // ground-truth odometry between 2 consecutive poses (simulated data for iSAM) std::vector points; // ground-truth landmarks - std::map > z; // 2D measurements of landmarks in each camera frame + std::map > z; // 2D measurements of landmarks in each camera frame gtsam::SharedDiagonal noiseZ; // measurement noise (noiseModel::Isotropic::Sigma(2, 5.0f)); gtsam::SharedDiagonal noiseX; // noise for camera poses gtsam::SharedDiagonal noiseL; // noise for landmarks diff --git a/gtsam/inference/ClusterTree-inl.h b/gtsam/inference/ClusterTree-inl.h index 267602eea..548a55cf4 100644 --- a/gtsam/inference/ClusterTree-inl.h +++ b/gtsam/inference/ClusterTree-inl.h @@ -61,8 +61,8 @@ namespace gtsam { if (separator != other.separator) return false; if (children_.size() != other.children_.size()) return false; - typename list::const_iterator it1 = children_.begin(); - typename list::const_iterator it2 = other.children_.begin(); + typename std::list::const_iterator it1 = children_.begin(); + typename std::list::const_iterator it2 = other.children_.begin(); for (; it1 != children_.end(); it1++, it2++) if (!(*it1)->equals(**it2)) return false; diff --git a/gtsam/inference/graph-inl.h b/gtsam/inference/graph-inl.h index b086fd2fb..195e18d73 100644 --- a/gtsam/inference/graph-inl.h +++ b/gtsam/inference/graph-inl.h @@ -42,7 +42,7 @@ public: /* ************************************************************************* */ template -list predecessorMap2Keys(const PredecessorMap& p_map) { +std::list predecessorMap2Keys(const PredecessorMap& p_map) { typedef typename SGraph::Vertex SVertex; @@ -102,7 +102,7 @@ SDGraph toBoostGraph(const G& graph) { /* ************************************************************************* */ template -boost::tuple > +boost::tuple > predecessorMap2Graph(const PredecessorMap& p_map) { G g; diff --git a/gtsam/inference/tests/testBayesTree.cpp b/gtsam/inference/tests/testBayesTree.cpp index 71021ef70..2f85e1454 100644 --- a/gtsam/inference/tests/testBayesTree.cpp +++ b/gtsam/inference/tests/testBayesTree.cpp @@ -30,6 +30,7 @@ using namespace boost::assign; #include #include +using namespace std; using namespace gtsam; typedef BayesTree SymbolicBayesTree; diff --git a/gtsam/inference/tests/testVariableIndex.cpp b/gtsam/inference/tests/testVariableIndex.cpp index a990a5a87..7c8e6fa9e 100644 --- a/gtsam/inference/tests/testVariableIndex.cpp +++ b/gtsam/inference/tests/testVariableIndex.cpp @@ -22,6 +22,7 @@ #include #include +using namespace std; using namespace gtsam; /* ************************************************************************* */ diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index 8f59b9058..b08cc0c36 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -97,13 +97,13 @@ VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial double gamma = s.vector().squaredNorm(), new_gamma = 0.0, alpha = 0.0, beta = 0.0 ; const double threshold = - ::max(parameters_.epsilon_abs(), + std::max(parameters_.epsilon_abs(), parameters_.epsilon() * parameters_.epsilon() * gamma); const size_t iMaxIterations = parameters_.maxIterations(); const ConjugateGradientParameters::Verbosity verbosity = parameters_.cg_.verbosity(); if ( verbosity >= ConjugateGradientParameters::ERROR ) - cout << "[SimpleSPCGSolver] epsilon = " << parameters_.epsilon() + std::cout << "[SimpleSPCGSolver] epsilon = " << parameters_.epsilon() << ", max = " << parameters_.maxIterations() << ", ||r0|| = " << std::sqrt(gamma) << ", threshold = " << threshold << std::endl; @@ -122,14 +122,14 @@ VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial gamma = new_gamma ; if ( verbosity >= ConjugateGradientParameters::ERROR) { - cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << endl; + std::cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << std::endl; } if ( gamma < threshold ) break ; } // k if ( verbosity >= ConjugateGradientParameters::ERROR ) - cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << endl; + std::cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << std::endl; /* transform y back to x */ return this->transform(*x); diff --git a/gtsam/nonlinear/DoglegOptimizerImpl.cpp b/gtsam/nonlinear/DoglegOptimizerImpl.cpp index ccfdf781a..b46fc6a3f 100644 --- a/gtsam/nonlinear/DoglegOptimizerImpl.cpp +++ b/gtsam/nonlinear/DoglegOptimizerImpl.cpp @@ -18,6 +18,8 @@ #include #include +using namespace std; + namespace gtsam { /* ************************************************************************* */ VectorValues DoglegOptimizerImpl::ComputeDoglegPoint( diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index 936cfb806..da3632570 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -21,6 +21,8 @@ #include #include +using namespace std; + namespace gtsam { /* ************************************************************************* */ diff --git a/gtsam_unstable/discrete/CSP.cpp b/gtsam_unstable/discrete/CSP.cpp index 4a041c9b2..20c0e7617 100644 --- a/gtsam_unstable/discrete/CSP.cpp +++ b/gtsam_unstable/discrete/CSP.cpp @@ -11,6 +11,8 @@ #include #include +using namespace std; + namespace gtsam { /// Find the best total assignment - can be expensive diff --git a/gtsam_unstable/discrete/tests/testCSP.cpp b/gtsam_unstable/discrete/tests/testCSP.cpp index c92cbe1f9..4ab5cd361 100644 --- a/gtsam_unstable/discrete/tests/testCSP.cpp +++ b/gtsam_unstable/discrete/tests/testCSP.cpp @@ -7,6 +7,8 @@ #include #include +#include +using boost::assign::insert; #include #include #include diff --git a/gtsam_unstable/discrete/tests/testSudoku.cpp b/gtsam_unstable/discrete/tests/testSudoku.cpp index a32ca2645..1e4026e7f 100644 --- a/gtsam_unstable/discrete/tests/testSudoku.cpp +++ b/gtsam_unstable/discrete/tests/testSudoku.cpp @@ -7,6 +7,8 @@ #include #include +#include +using boost::assign::insert; #include #include #include diff --git a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp index 1749ded1a..916d07559 100644 --- a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp +++ b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp @@ -7,6 +7,7 @@ #include +using namespace std; using namespace gtsam; using namespace imu; From 1913640d2c92d9e0d2dabc2f06f3843f15643b0e Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 14:34:03 +0000 Subject: [PATCH 276/914] Qualified more namespaces after removing using namespace from headers --- gtsam/inference/FactorGraph-inl.h | 2 +- gtsam/inference/SymbolicFactorGraph.cpp | 3 +-- gtsam/inference/graph-inl.h | 16 ++++++++-------- gtsam/nonlinear/DoglegOptimizerImpl.h | 10 +++++----- gtsam_unstable/linear/iterative-inl.h | 16 ++++++++-------- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index b7c3f81a5..8da4465d5 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -101,7 +101,7 @@ namespace gtsam { typename DERIVED::shared_ptr Combine(const FactorGraph& factors, const FastMap >& variableSlots) { - typedef const pair > KeySlotPair; + typedef const std::pair > KeySlotPair; // Local functional for getting keys out of key-value pairs struct Local { static KEY FirstOf(const KeySlotPair& pr) { return pr.first; } }; diff --git a/gtsam/inference/SymbolicFactorGraph.cpp b/gtsam/inference/SymbolicFactorGraph.cpp index 2d5190f45..2ae0b483a 100644 --- a/gtsam/inference/SymbolicFactorGraph.cpp +++ b/gtsam/inference/SymbolicFactorGraph.cpp @@ -67,8 +67,7 @@ namespace gtsam { IndexFactor::shared_ptr CombineSymbolic( const FactorGraph& factors, const FastMap >& variableSlots) { - IndexFactor::shared_ptr combined(Combine (factors, - variableSlots)); + IndexFactor::shared_ptr combined(Combine (factors, variableSlots)); // combined->assertInvariants(); return combined; } diff --git a/gtsam/inference/graph-inl.h b/gtsam/inference/graph-inl.h index 195e18d73..73980797a 100644 --- a/gtsam/inference/graph-inl.h +++ b/gtsam/inference/graph-inl.h @@ -70,7 +70,7 @@ SDGraph toBoostGraph(const G& graph) { for(itFactor=graph.begin(); itFactor!=graph.end(); itFactor++) { if ((*itFactor)->keys().size() > 2) - throw(invalid_argument("toBoostGraph: only support factors with at most two keys")); + throw(std::invalid_argument("toBoostGraph: only support factors with at most two keys")); if ((*itFactor)->keys().size() == 1) continue; @@ -131,7 +131,7 @@ predecessorMap2Graph(const PredecessorMap& p_map) { } if (!foundRoot) - throw invalid_argument("predecessorMap2Graph: invalid predecessor map!"); + throw std::invalid_argument("predecessorMap2Graph: invalid predecessor map!"); else return boost::tuple >(g, root, key2vertex); } @@ -171,7 +171,7 @@ boost::shared_ptr composePoses(const G& graph, const PredecessorMap PoseGraph g; PoseVertex root; - map key2vertex; + std::map key2vertex; boost::tie(g, root, key2vertex) = predecessorMap2Graph(tree); @@ -181,7 +181,7 @@ boost::shared_ptr composePoses(const G& graph, const PredecessorMap BOOST_FOREACH(typename G::sharedFactor nl_factor, graph) { if (nl_factor->keys().size() > 2) - throw invalid_argument("composePoses: only support factors with at most two keys"); + throw std::invalid_argument("composePoses: only support factors with at most two keys"); // e.g. in pose2graph, nonlinear factor needs to be converted to pose2factor boost::shared_ptr factor = boost::dynamic_pointer_cast(nl_factor); @@ -196,7 +196,7 @@ boost::shared_ptr composePoses(const G& graph, const PredecessorMap POSE l1Xl2 = factor->measured(); boost::tie(edge12, found1) = boost::edge(v1, v2, g); boost::tie(edge21, found2) = boost::edge(v2, v1, g); - if (found1 && found2) throw invalid_argument ("composePoses: invalid spanning tree"); + if (found1 && found2) throw std::invalid_argument ("composePoses: invalid spanning tree"); if (!found1 && !found2) continue; if (found1) boost::put(boost::edge_weight, g, edge12, l1Xl2); @@ -223,13 +223,13 @@ PredecessorMap findMinimumSpanningTree(const G& fg) { SDGraph g = gtsam::toBoostGraph(fg); // find minimum spanning tree - vector::Vertex> p_map(boost::num_vertices(g)); + std::vector::Vertex> p_map(boost::num_vertices(g)); prim_minimum_spanning_tree(g, &p_map[0]); // convert edge to string pairs PredecessorMap tree; typename SDGraph::vertex_iterator itVertex = boost::vertices(g).first; - typename vector::Vertex>::iterator vi; + typename std::vector::Vertex>::iterator vi; for (vi = p_map.begin(); vi != p_map.end(); itVertex++, vi++) { KEY key = boost::get(boost::vertex_name, g, *itVertex); KEY parent = boost::get(boost::vertex_name, g, *vi); @@ -248,7 +248,7 @@ void split(const G& g, const PredecessorMap& tree, G& Ab1, G& Ab2) { BOOST_FOREACH(const F& factor, g) { if (factor->keys().size() > 2) - throw(invalid_argument("split: only support factors with at most two keys")); + throw(std::invalid_argument("split: only support factors with at most two keys")); if (factor->keys().size() == 1) { Ab1.push_back(factor); diff --git a/gtsam/nonlinear/DoglegOptimizerImpl.h b/gtsam/nonlinear/DoglegOptimizerImpl.h index 737aa2f66..27a8d47ec 100644 --- a/gtsam/nonlinear/DoglegOptimizerImpl.h +++ b/gtsam/nonlinear/DoglegOptimizerImpl.h @@ -176,7 +176,7 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( result.dx_d = ComputeDoglegPoint(Delta, dx_u, dx_n, verbose); toc(3, "Dog leg point"); - if(verbose) cout << "Delta = " << Delta << ", dx_d_norm = " << result.dx_d.vector().norm() << endl; + if(verbose) std::cout << "Delta = " << Delta << ", dx_d_norm = " << result.dx_d.vector().norm() << std::endl; tic(4, "retract"); // Compute expmapped solution @@ -193,8 +193,8 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( const double new_M_error = jfg.error(result.dx_d); toc(6, "decrease in M"); - if(verbose) cout << setprecision(15) << "f error: " << f_error << " -> " << result.f_error << endl; - if(verbose) cout << setprecision(15) << "M error: " << M_error << " -> " << new_M_error << endl; + if(verbose) std::cout << std::setprecision(15) << "f error: " << f_error << " -> " << result.f_error << std::endl; + if(verbose) std::cout << std::setprecision(15) << "M error: " << M_error << " -> " << new_M_error << std::endl; tic(7, "adjust Delta"); // Compute gain ratio. Here we take advantage of the invariant that the @@ -203,7 +203,7 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( 0.5 : (f_error - result.f_error) / (M_error - new_M_error); - if(verbose) cout << setprecision(15) << "rho = " << rho << endl; + if(verbose) std::cout << std::setprecision(15) << "rho = " << rho << std::endl; if(rho >= 0.75) { // M agrees very well with f, so try to increase lambda @@ -253,7 +253,7 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( stay = true; lastAction = DECREASED_DELTA; } else { - if(verbose) cout << "Warning: Dog leg stopping because cannot decrease error with minimum Delta" << endl; + if(verbose) std::cout << "Warning: Dog leg stopping because cannot decrease error with minimum Delta" << std::endl; stay = false; } } diff --git a/gtsam_unstable/linear/iterative-inl.h b/gtsam_unstable/linear/iterative-inl.h index c91e6f68a..aa7eb076b 100644 --- a/gtsam_unstable/linear/iterative-inl.h +++ b/gtsam_unstable/linear/iterative-inl.h @@ -50,7 +50,7 @@ namespace gtsam { // init gamma and calculate threshold gamma = dot(g,g) ; - threshold = ::max(parameters_.epsilon_abs(), parameters_.epsilon() * parameters_.epsilon() * gamma); + threshold = std::max(parameters_.epsilon_abs(), parameters_.epsilon() * parameters_.epsilon() * gamma); // Allocate and calculate A*d for first iteration if (gamma > parameters_.epsilon_abs()) Ad = Ab * d; @@ -59,10 +59,10 @@ namespace gtsam { /* ************************************************************************* */ // print void print(const V& x) { - cout << "iteration = " << k << endl; + std::cout << "iteration = " << k << std::endl; gtsam::print(x,"x"); gtsam::print(g, "g"); - cout << "dotg = " << gamma << endl; + std::cout << "dotg = " << gamma << std::endl; gtsam::print(d, "d"); gtsam::print(Ad, "Ad"); } @@ -92,8 +92,8 @@ namespace gtsam { // check for convergence double new_gamma = dot(g, g); if (parameters_.verbosity() != IterativeOptimizationParameters::SILENT) - cout << "iteration " << k << ": alpha = " << alpha - << ", dotg = " << new_gamma << endl; + std::cout << "iteration " << k << ": alpha = " << alpha + << ", dotg = " << new_gamma << std::endl; if (new_gamma < threshold) return true; // calculate new search direction @@ -126,14 +126,14 @@ namespace gtsam { CGState state(Ab, x, parameters, steepest); if (parameters.verbosity() != IterativeOptimizationParameters::SILENT) - cout << "CG: epsilon = " << parameters.epsilon() + std::cout << "CG: epsilon = " << parameters.epsilon() << ", maxIterations = " << parameters.maxIterations() << ", ||g0||^2 = " << state.gamma - << ", threshold = " << state.threshold << endl; + << ", threshold = " << state.threshold << std::endl; if ( state.gamma < state.threshold ) { if (parameters.verbosity() != IterativeOptimizationParameters::SILENT) - cout << "||g0||^2 < threshold, exiting immediately !" << endl; + std::cout << "||g0||^2 < threshold, exiting immediately !" << std::endl; return x; } From 2f2f1875d994a40e54c7db95e127f38944b58a71 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 16:40:30 +0000 Subject: [PATCH 277/914] new prototype for VisualISAM_gui from Frank's example with many options --- .../VisualISAMData_cube.m | 0 .../VisualISAMData_triangle.m | 0 .../VisualISAMExample_triangle2.m | 12 +- .../VisualISAMInitialize.m | 0 .../{ => VisualISAM_gui}/VisualISAMPlot.m | 0 .../{ => VisualISAM_gui}/VisualISAMStep.m | 0 .../{ => VisualISAM_gui}/VisualISAM_gui.fig | Bin .../{ => VisualISAM_gui}/VisualISAM_gui.m | 0 .../VisualISAM_gui2/VisualISAM_gui.fig | Bin 0 -> 5442 bytes .../examples/VisualISAM_gui2/VisualISAM_gui.m | 175 ++++++++++++++++++ matlab/examples/VisualISAM_gui2/vData.m | 51 +++++ matlab/examples/VisualISAM_gui2/vInit.m | 31 ++++ matlab/examples/VisualISAM_gui2/vStep.m | 85 +++++++++ 13 files changed, 351 insertions(+), 3 deletions(-) rename matlab/examples/{ => VisualISAM_gui}/VisualISAMData_cube.m (100%) rename matlab/examples/{ => VisualISAM_gui}/VisualISAMData_triangle.m (100%) rename matlab/examples/{ => VisualISAM_gui}/VisualISAMExample_triangle2.m (54%) rename matlab/examples/{ => VisualISAM_gui}/VisualISAMInitialize.m (100%) rename matlab/examples/{ => VisualISAM_gui}/VisualISAMPlot.m (100%) rename matlab/examples/{ => VisualISAM_gui}/VisualISAMStep.m (100%) rename matlab/examples/{ => VisualISAM_gui}/VisualISAM_gui.fig (100%) rename matlab/examples/{ => VisualISAM_gui}/VisualISAM_gui.m (100%) create mode 100644 matlab/examples/VisualISAM_gui2/VisualISAM_gui.fig create mode 100644 matlab/examples/VisualISAM_gui2/VisualISAM_gui.m create mode 100644 matlab/examples/VisualISAM_gui2/vData.m create mode 100644 matlab/examples/VisualISAM_gui2/vInit.m create mode 100644 matlab/examples/VisualISAM_gui2/vStep.m diff --git a/matlab/examples/VisualISAMData_cube.m b/matlab/examples/VisualISAM_gui/VisualISAMData_cube.m similarity index 100% rename from matlab/examples/VisualISAMData_cube.m rename to matlab/examples/VisualISAM_gui/VisualISAMData_cube.m diff --git a/matlab/examples/VisualISAMData_triangle.m b/matlab/examples/VisualISAM_gui/VisualISAMData_triangle.m similarity index 100% rename from matlab/examples/VisualISAMData_triangle.m rename to matlab/examples/VisualISAM_gui/VisualISAMData_triangle.m diff --git a/matlab/examples/VisualISAMExample_triangle2.m b/matlab/examples/VisualISAM_gui/VisualISAMExample_triangle2.m similarity index 54% rename from matlab/examples/VisualISAMExample_triangle2.m rename to matlab/examples/VisualISAM_gui/VisualISAMExample_triangle2.m index b636ba542..4f9df958e 100644 --- a/matlab/examples/VisualISAMExample_triangle2.m +++ b/matlab/examples/VisualISAM_gui/VisualISAMExample_triangle2.m @@ -1,16 +1,22 @@ %% data -data = VisualISAMData_triangle(); +%data = VisualISAMData_triangle(); +data = VisualISAMData_cube(); %% init [isam results] = VisualISAMInitialize(data); sprintf('Frame 1,2:') results +figure(1); clf; +VisualISAMPlot(results, data); %% Next frame index -frame_i=3; +frame_i=2; %% All steps while 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 literal 0 HcmV?d00001 diff --git a/matlab/examples/VisualISAM_gui2/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui2/VisualISAM_gui.m new file mode 100644 index 000000000..e73d6f7cf --- /dev/null +++ b/matlab/examples/VisualISAM_gui2/VisualISAM_gui.m @@ -0,0 +1,175 @@ +function varargout = VisualISAM_gui(varargin) +% VISUALISAM_GUI MATLAB code for VisualISAM_gui.fig +% VISUALISAM_GUI, by itself, creates a new VISUALISAM_GUI or raises the existing +% singleton*. +% +% H = VISUALISAM_GUI returns the handle to a new VISUALISAM_GUI or the handle to +% the existing singleton*. +% +% VISUALISAM_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in VISUALISAM_GUI.M with the given input arguments. +% +% VISUALISAM_GUI('Property','Value',...) creates a new VISUALISAM_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before VisualISAM_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to VisualISAM_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help VisualISAM_gui + +% Last Modified by GUIDE v2.5 08-Jun-2012 12:35:14 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @VisualISAM_gui_OpeningFcn, ... + 'gui_OutputFcn', @VisualISAM_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before VisualISAM_gui is made visible. +function VisualISAM_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to VisualISAM_gui (see VARARGIN) + +% Choose default command line output for VisualISAM_gui +%% Data Options +handles.TRIANGLE = true; +handles.NCAMERAS = 20; +handles.SHOW_IMAGES = false; + +%% iSAM Options +handles.HARD_CONSTRAINT = false; +handles.POINT_PRIORS = false; +handles.BATCH_INIT = true; +handles.REORDER_INTERVAL=10; +handles.ALWAYS_RELINEARIZE = false; + +%% Display Options +handles.SAVE_GRAPH = false; +handles.PRINT_STATS = true; +handles.DRAW_INTERVAL = 1; +handles.CAMERA_INTERVAL = 1; +handles.DRAW_TRUE_POSES = false; +handles.SAVE_FIGURES = false; +handles.SAVE_GRAPHS = false; + +handles = vData(handles); +handles = vInit(handles); +handles.output = hObject; + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes VisualISAM_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = VisualISAM_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + +function handles = initialize(handles) + handles=vData(handles); + handles=vInit(handles); + handles.result = {}; + cla; + handles + +% --- Executes on button press in intializeButton. +function intializeButton_Callback(hObject, eventdata, handles) +% hObject handle to intializeButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + handles=initialize(handles) + guidata(hObject,handles) + +% --- Executes on button press in stepButton. +function stepButton_Callback(hObject, eventdata, handles) +% hObject handle to stepButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + if (handles.frame_i Date: Fri, 8 Jun 2012 16:45:16 +0000 Subject: [PATCH 278/914] in the middle of resurrecting spcg --- examples/Pose2SLAMwSPCG.cpp | 1 - gtsam/linear/ConjugateGradientSolver.h | 89 ++++++ .../linear/IterativeOptimizationParameters.h | 134 -------- gtsam/linear/IterativeSolver.h | 45 ++- gtsam/linear/SimpleSPCGSolver.cpp | 6 +- gtsam/linear/SimpleSPCGSolver.h | 6 +- gtsam/linear/SubgraphPreconditioner.cpp | 296 +++++++++--------- gtsam/linear/SubgraphPreconditioner.h | 233 +++++++------- gtsam/linear/SubgraphSolver-inl.h | 162 +++++----- gtsam/linear/SubgraphSolver.cpp | 158 +++++++--- gtsam/linear/SubgraphSolver.h | 152 +++------ .../nonlinear/LevenbergMarquardtOptimizer.cpp | 10 +- .../SuccessiveLinearizationOptimizer.h | 2 +- gtsam_unstable/linear/iterative-inl.h | 12 +- gtsam_unstable/linear/iterative.cpp | 14 +- gtsam_unstable/linear/iterative.h | 14 +- 16 files changed, 665 insertions(+), 669 deletions(-) create mode 100644 gtsam/linear/ConjugateGradientSolver.h delete mode 100644 gtsam/linear/IterativeOptimizationParameters.h diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index cec4301dc..984701734 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -16,7 +16,6 @@ * @date June 2, 2012 */ -#include #include #include diff --git a/gtsam/linear/ConjugateGradientSolver.h b/gtsam/linear/ConjugateGradientSolver.h new file mode 100644 index 000000000..2cfd1279f --- /dev/null +++ b/gtsam/linear/ConjugateGradientSolver.h @@ -0,0 +1,89 @@ +/* ---------------------------------------------------------------------------- + + * 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 + + * -------------------------------------------------------------------------- */ + +#pragma once + +#include + +namespace gtsam { + +/** + * parameters for the conjugate gradient method + */ +struct ConjugateGradientParameters : public IterativeOptimizationParameters { + + typedef IterativeOptimizationParameters Base; + typedef boost::shared_ptr shared_ptr; + + size_t minIterations_; ///< minimum number of cg iterations + size_t maxIterations_; ///< maximum number of cg iterations + size_t reset_; ///< number of iterations before reset + double epsilon_rel_; ///< threshold for relative error decrease + double epsilon_abs_; ///< threshold for absolute error decrease + + /* Matrix Operation Kernel */ + enum BLASKernel { + GTSAM = 0, ///< Jacobian Factor Graph of GTSAM + SBM, ///< Sparse Block Matrix + SBM_MT ///< Sparse Block Matrix Multithreaded + } blas_kernel_; + + enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ + + ConjugateGradientParameters() + : minIterations_(1), maxIterations_(500), reset_(501), epsilon_rel_(1e-3), epsilon_abs_(1e-3), + blas_kernel_(GTSAM), verbosity_(SILENT) {} + + ConjugateGradientParameters(size_t minIterations, size_t maxIterations, size_t reset, + double epsilon_rel, double epsilon_abs, BLASKernel blas = GTSAM, Verbosity verbosity = SILENT) + : minIterations_(minIterations), maxIterations_(maxIterations), reset_(reset), + epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs), blas_kernel_(blas), verbosity_(verbosity) {} + + /* general interface */ + inline size_t minIterations() const { return minIterations_; } + inline size_t maxIterations() const { return maxIterations_; } + inline size_t reset() const { return reset_; } + inline double epsilon() const { return epsilon_rel_; } + inline double epsilon_rel() const { return epsilon_rel_; } + inline double epsilon_abs() const { return epsilon_abs_; } + inline BLASKernel blas_kernel() const { return blas_kernel_; } + inline Verbosity verbosity() const { return verbosity_; } + + void print() const { + const std::string blasStr[3] = {"gtsam", "sbm", "sbm-mt"}; + Base::print(); + std::cout << "ConjugateGradientParameters: " + << "blas = " << blasStr[blas_kernel_] + << ", minIter = " << minIterations_ + << ", maxIter = " << maxIterations_ + << ", resetIter = " << reset_ + << ", eps_rel = " << epsilon_rel_ + << ", eps_abs = " << epsilon_abs_ + << ", verbosity = " << verbosity_ + << std::endl; + } +}; + +//class ConjugateGradientSolver : public IterativeSolver { +// +//public: +// +// typedef ConjugateGradientParameters Parameters; +// +// Parameters parameters_; +// +// ConjugateGradientSolver(const ConjugateGradientParameters ¶meters) : parameters_(parameters) {} +// virtual VectorValues::shared_ptr optimize () = 0; +// virtual const IterativeOptimizationParameters& _params() const = 0; +//}; + + +} diff --git a/gtsam/linear/IterativeOptimizationParameters.h b/gtsam/linear/IterativeOptimizationParameters.h deleted file mode 100644 index 459f07b3e..000000000 --- a/gtsam/linear/IterativeOptimizationParameters.h +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 IterativeOptimizationParameters.h - * @date Oct 22, 2010 - * @author Yong-Dian Jian - */ - -#pragma once - -#include -#include -#include - -namespace gtsam { - -/** - * parameters for the conjugate gradient method - */ -struct ConjugateGradientParameters { - - size_t minIterations_; ///< minimum number of cg iterations - size_t maxIterations_; ///< maximum number of cg iterations - size_t reset_; ///< number of iterations before reset - double epsilon_rel_; ///< threshold for relative error decrease - double epsilon_abs_; ///< threshold for absolute error decrease - - /* Matrix Operation Kernel */ - enum BLASKernel { - GTSAM = 0, ///< Jacobian Factor Graph of GTSAM - SBM, ///< Sparse Block Matrix - SBM_MT ///< Sparse Block Matrix Multithreaded - } blas_kernel_; - - size_t degree_; ///< the maximum degree of the vertices to be eliminated before doing cg - - enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ - - ConjugateGradientParameters() - : minIterations_(1), maxIterations_(500), reset_(501), epsilon_rel_(1e-3), epsilon_abs_(1e-3), - blas_kernel_(GTSAM), degree_(0), verbosity_(SILENT) {} - - ConjugateGradientParameters(size_t minIterations, size_t maxIterations, size_t reset, - double epsilon_rel, double epsilon_abs, BLASKernel blas = GTSAM, size_t degree = 0, Verbosity verbosity = SILENT) - : minIterations_(minIterations), maxIterations_(maxIterations), reset_(reset), - epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs), blas_kernel_(blas), degree_(degree), verbosity_(verbosity) {} - - /* general interface */ - inline size_t minIterations() const { return minIterations_; } - inline size_t maxIterations() const { return maxIterations_; } - inline size_t reset() const { return reset_; } - inline double epsilon() const { return epsilon_rel_; } - inline double epsilon_rel() const { return epsilon_rel_; } - inline double epsilon_abs() const { return epsilon_abs_; } - inline BLASKernel blas_kernel() const { return blas_kernel_; } - inline size_t degree() const { return degree_; } - inline Verbosity verbosity() const { return verbosity_; } - - void print() const { - const std::string blasStr[3] = {"gtsam", "sbm", "sbm-mt"}; - std::cout << "ConjugateGradientParameters: " - << "blas = " << blasStr[blas_kernel_] - << ", minIter = " << minIterations_ - << ", maxIter = " << maxIterations_ - << ", resetIter = " << reset_ - << ", eps_rel = " << epsilon_rel_ - << ", eps_abs = " << epsilon_abs_ - << ", degree = " << degree_ - << ", verbosity = " << verbosity_ - << std::endl; - } -}; - -/** - * parameters for iterative linear solvers - */ -class IterativeOptimizationParameters { - -public: - - typedef boost::shared_ptr shared_ptr; - - ConjugateGradientParameters cg_; ///< Parameters for the Conjugate Gradient Method - enum Kernel { PCG = 0, LSPCG = 1 } kernel_ ; ///< Iterative Method Kernel - enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; ///< Verbosity - -public: - - IterativeOptimizationParameters() : cg_(), kernel_(LSPCG), verbosity_(SILENT) {} - - IterativeOptimizationParameters(const IterativeOptimizationParameters &p) - : cg_(p.cg_), kernel_(p.kernel_), verbosity_(p.verbosity_) {} - - IterativeOptimizationParameters(const ConjugateGradientParameters &c, Kernel kernel = LSPCG, Verbosity verbosity = SILENT) - : cg_(c), kernel_(kernel), verbosity_(verbosity) {} - - virtual ~IterativeOptimizationParameters() {} - - /* general interface */ - inline Kernel kernel() const { return kernel_; } - inline Verbosity verbosity() const { return verbosity_; } - - /* interface to cg parameters */ - inline const ConjugateGradientParameters& cg() const { return cg_; } - inline size_t minIterations() const { return cg_.minIterations(); } - inline size_t maxIterations() const { return cg_.maxIterations(); } - inline size_t reset() const { return cg_.reset(); } - inline double epsilon() const { return cg_.epsilon_rel(); } - inline double epsilon_rel() const { return cg_.epsilon_rel(); } - inline double epsilon_abs() const { return cg_.epsilon_abs(); } - inline size_t degree() const { return cg_.degree(); } - inline ConjugateGradientParameters::BLASKernel blas_kernel() const { return cg_.blas_kernel(); } - - virtual void print(const std::string &s="") const { - const std::string kernelStr[2] = {"pcg", "lspcg"}; - std::cout << s << std::endl - << "IterativeOptimizationParameters: " - << "kernel = " << kernelStr[kernel_] - << ", verbosity = " << verbosity_ << std::endl; - cg_.print(); - } - -}; - -} diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index edaa09943..de1c564ef 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -11,20 +11,49 @@ #pragma once -#include #include namespace gtsam { -class IterativeSolver { + /** + * parameters for iterative linear solvers + */ + class IterativeOptimizationParameters { -public: + public: - IterativeSolver(){} - virtual ~IterativeSolver() {} + typedef boost::shared_ptr shared_ptr; - virtual VectorValues::shared_ptr optimize () = 0; - virtual const IterativeOptimizationParameters& _params() const = 0; -}; + enum Kernel { PCG = 0, LSPCG = 1 } kernel_ ; ///< Iterative Method Kernel + enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; ///< Verbosity + + public: + + IterativeOptimizationParameters(const IterativeOptimizationParameters &p) + : kernel_(p.kernel_), verbosity_(p.verbosity_) {} + + IterativeOptimizationParameters(Kernel kernel = LSPCG, Verbosity verbosity = SILENT) + : kernel_(kernel), verbosity_(verbosity) {} + + virtual ~IterativeOptimizationParameters() {} + + /* general interface */ + inline Kernel kernel() const { return kernel_; } + inline Verbosity verbosity() const { return verbosity_; } + + void print() const { + const std::string kernelStr[2] = {"pcg", "lspcg"}; + std::cout << "IterativeOptimizationParameters: " + << "kernel = " << kernelStr[kernel_] + << ", verbosity = " << verbosity_ << std::endl; + } + }; + + class IterativeSolver { + public: + IterativeSolver(){} + virtual ~IterativeSolver() {} + virtual VectorValues::shared_ptr optimize () = 0; + }; } diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index b08cc0c36..03401cc7f 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -9,11 +9,11 @@ * -------------------------------------------------------------------------- */ -#include +#include #include #include -#include #include +#include #include #include #include @@ -100,7 +100,7 @@ VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial std::max(parameters_.epsilon_abs(), parameters_.epsilon() * parameters_.epsilon() * gamma); const size_t iMaxIterations = parameters_.maxIterations(); - const ConjugateGradientParameters::Verbosity verbosity = parameters_.cg_.verbosity(); + const Parameters::Verbosity verbosity = parameters_.verbosity(); if ( verbosity >= ConjugateGradientParameters::ERROR ) std::cout << "[SimpleSPCGSolver] epsilon = " << parameters_.epsilon() diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h index d2768f581..406232d3c 100644 --- a/gtsam/linear/SimpleSPCGSolver.h +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -11,9 +11,10 @@ #pragma once -#include +#include #include #include +#include #include namespace gtsam { @@ -39,7 +40,7 @@ class SimpleSPCGSolver : public IterativeSolver { public: typedef IterativeSolver Base; - typedef IterativeOptimizationParameters Parameters; + typedef ConjugateGradientParameters Parameters; typedef boost::shared_ptr shared_ptr; protected: @@ -60,7 +61,6 @@ public: SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); virtual ~SimpleSPCGSolver() {} virtual VectorValues::shared_ptr optimize () {return optimize(*y0_);} - virtual const IterativeOptimizationParameters& _params() const { return parameters_; } protected: diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp index cce8eea9d..59a72dd8b 100644 --- a/gtsam/linear/SubgraphPreconditioner.cpp +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -1,150 +1,146 @@ -///* ---------------------------------------------------------------------------- -// -// * 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 SubgraphPreconditioner.cpp -// * @date Dec 31, 2009 -// * @author: Frank Dellaert -// */ -// -//#include -//#include -//#include -//#include -// -//using namespace std; -// -//namespace gtsam { -// -// /* ************************************************************************* */ -// SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, -// const sharedBayesNet& Rc1, const sharedValues& xbar) : -// Ab1_(Ab1), Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(gaussianErrors_(*Ab2_,*xbar)) { -// } -// -// /* ************************************************************************* */ -// // x = xbar + inv(R1)*y -// VectorValues SubgraphPreconditioner::x(const VectorValues& y) const { -//#ifdef VECTORBTREE -// if (!y.cloned(*xbar_)) throw -// invalid_argument("SubgraphPreconditioner::x: y needs to be cloned from xbar"); -//#endif -// VectorValues x = y; -// backSubstituteInPlace(*Rc1_,x); -// x += *xbar_; -// return x; -// } -// -//// SubgraphPreconditioner SubgraphPreconditioner::add_priors(double sigma) const { -//// SubgraphPreconditioner result = *this ; -//// result.Ab2_ = sharedFG(new GaussianFactorGraph(Ab2_->add_priors(sigma))) ; -//// return result ; -//// } -// -// /* ************************************************************************* */ -// double error(const SubgraphPreconditioner& sp, const VectorValues& y) { -// -// Errors e(y); -// VectorValues x = sp.x(y); -// Errors e2 = gaussianErrors(*sp.Ab2(),x); -// return 0.5 * (dot(e, e) + dot(e2,e2)); -// } -// -// /* ************************************************************************* */ -// // gradient is y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar), -// VectorValues gradient(const SubgraphPreconditioner& sp, const VectorValues& y) { -// VectorValues x = sp.x(y); // x = inv(R1)*y -// Errors e2 = gaussianErrors(*sp.Ab2(),x); -// VectorValues gx2 = VectorValues::Zero(y); -// gtsam::transposeMultiplyAdd(*sp.Ab2(),1.0,e2,gx2); // A2'*e2; -// VectorValues gy2 = gtsam::backSubstituteTranspose(*sp.Rc1(), gx2); // inv(R1')*gx2 -// return y + gy2; -// } -// -// /* ************************************************************************* */ -// // Apply operator A, A*y = [I;A2*inv(R1)]*y = [y; A2*inv(R1)*y] -// Errors operator*(const SubgraphPreconditioner& sp, const VectorValues& y) { -// -// Errors e(y); -// -// // Add A2 contribution -// VectorValues x = y; // TODO avoid ? -// gtsam::backSubstituteInPlace(*sp.Rc1(), x); // x=inv(R1)*y -// Errors e2 = *sp.Ab2() * x; // A2*x -// e.splice(e.end(), e2); -// -// return e; -// } -// -// /* ************************************************************************* */ -// // In-place version that overwrites e -// void multiplyInPlace(const SubgraphPreconditioner& sp, const VectorValues& y, Errors& e) { -// -// -// Errors::iterator ei = e.begin(); -// for ( Index i = 0 ; i < y.size() ; ++i, ++ei ) { -// *ei = y[i]; -// } -// -// // Add A2 contribution -// VectorValues x = y; // TODO avoid ? -// gtsam::backSubstituteInPlace(*sp.Rc1(), x); // x=inv(R1)*y -// gtsam::multiplyInPlace(*sp.Ab2(),x,ei); // use iterator version -// } -// -// /* ************************************************************************* */ -// // Apply operator A', A'*e = [I inv(R1')*A2']*e = e1 + inv(R1')*A2'*e2 -// VectorValues operator^(const SubgraphPreconditioner& sp, const Errors& e) { -// -// Errors::const_iterator it = e.begin(); -// VectorValues y = sp.zero(); -// for ( Index i = 0 ; i < y.size() ; ++i, ++it ) -// y[i] = *it ; -// sp.transposeMultiplyAdd2(1.0,it,e.end(),y); -// return y; -// } -// -// /* ************************************************************************* */ -// // y += alpha*A'*e -// void transposeMultiplyAdd -// (const SubgraphPreconditioner& sp, double alpha, const Errors& e, VectorValues& y) { -// -// -// Errors::const_iterator it = e.begin(); -// for ( Index i = 0 ; i < y.size() ; ++i, ++it ) { -// const Vector& ei = *it; -// axpy(alpha,ei,y[i]); -// } -// sp.transposeMultiplyAdd2(alpha,it,e.end(),y); -// } -// -// /* ************************************************************************* */ -// // y += alpha*inv(R1')*A2'*e2 -// void SubgraphPreconditioner::transposeMultiplyAdd2 (double alpha, -// Errors::const_iterator it, Errors::const_iterator end, VectorValues& y) const { -// -// // create e2 with what's left of e -// // TODO can we avoid creating e2 by passing iterator to transposeMultiplyAdd ? -// Errors e2; -// while (it != end) -// e2.push_back(*(it++)); -// -// VectorValues x = VectorValues::Zero(y); // x = 0 -// gtsam::transposeMultiplyAdd(*Ab2_,1.0,e2,x); // x += A2'*e2 -// axpy(alpha, gtsam::backSubstituteTranspose(*Rc1_, x), y); // y += alpha*inv(R1')*x -// } -// -// /* ************************************************************************* */ -// void SubgraphPreconditioner::print(const std::string& s) const { -// cout << s << endl; -// Ab2_->print(); -// } -//} // nsamespace gtsam +/* ---------------------------------------------------------------------------- + + * 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 SubgraphPreconditioner.cpp + * @date Dec 31, 2009 + * @author: Frank Dellaert + */ + +#include +#include +#include + +#include + +using namespace std; + +namespace gtsam { + + /* ************************************************************************* */ + SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, + const sharedBayesNet& Rc1, const sharedValues& xbar) : + Ab1_(Ab1), Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(gaussianErrors_(*Ab2_,*xbar)) { + } + + /* ************************************************************************* */ + // x = xbar + inv(R1)*y + VectorValues SubgraphPreconditioner::x(const VectorValues& y) const { + VectorValues x = y; + optimizeInPlace(*Rc1_,x); + x += *xbar_; + return x; + } + +// SubgraphPreconditioner SubgraphPreconditioner::add_priors(double sigma) const { +// SubgraphPreconditioner result = *this ; +// result.Ab2_ = sharedFG(new GaussianFactorGraph(Ab2_->add_priors(sigma))) ; +// return result ; +// } + + /* ************************************************************************* */ + double error(const SubgraphPreconditioner& sp, const VectorValues& y) { + + Errors e(y); + VectorValues x = sp.x(y); + Errors e2 = gaussianErrors(*sp.Ab2(),x); + return 0.5 * (dot(e, e) + dot(e2,e2)); + } + + /* ************************************************************************* */ + // gradient is y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar), + VectorValues gradient(const SubgraphPreconditioner& sp, const VectorValues& y) { + VectorValues x = sp.x(y); // x = inv(R1)*y + Errors e2 = gaussianErrors(*sp.Ab2(),x); + VectorValues gx2 = VectorValues::Zero(y); + gtsam::transposeMultiplyAdd(*sp.Ab2(),1.0,e2,gx2); // A2'*e2; + VectorValues gy2 = gtsam::backSubstituteTranspose(*sp.Rc1(), gx2); // inv(R1')*gx2 + return y + gy2; + } + + /* ************************************************************************* */ + // Apply operator A, A*y = [I;A2*inv(R1)]*y = [y; A2*inv(R1)*y] + Errors operator*(const SubgraphPreconditioner& sp, const VectorValues& y) { + + Errors e(y); + + // Add A2 contribution + VectorValues x = y; // TODO avoid ? + gtsam::optimizeInPlace(*sp.Rc1(), x); // x=inv(R1)*y + Errors e2 = *sp.Ab2() * x; // A2*x + e.splice(e.end(), e2); + + return e; + } + + /* ************************************************************************* */ + // In-place version that overwrites e + void multiplyInPlace(const SubgraphPreconditioner& sp, const VectorValues& y, Errors& e) { + + + Errors::iterator ei = e.begin(); + for ( Index i = 0 ; i < y.size() ; ++i, ++ei ) { + *ei = y[i]; + } + + // Add A2 contribution + VectorValues x = y; // TODO avoid ? + gtsam::optimizeInPlace(*sp.Rc1(), x); // x=inv(R1)*y + gtsam::multiplyInPlace(*sp.Ab2(),x,ei); // use iterator version + } + + /* ************************************************************************* */ + // Apply operator A', A'*e = [I inv(R1')*A2']*e = e1 + inv(R1')*A2'*e2 + VectorValues operator^(const SubgraphPreconditioner& sp, const Errors& e) { + + Errors::const_iterator it = e.begin(); + VectorValues y = sp.zero(); + for ( Index i = 0 ; i < y.size() ; ++i, ++it ) + y[i] = *it ; + sp.transposeMultiplyAdd2(1.0,it,e.end(),y); + return y; + } + + /* ************************************************************************* */ + // y += alpha*A'*e + void transposeMultiplyAdd + (const SubgraphPreconditioner& sp, double alpha, const Errors& e, VectorValues& y) { + + + Errors::const_iterator it = e.begin(); + for ( Index i = 0 ; i < y.size() ; ++i, ++it ) { + const Vector& ei = *it; + axpy(alpha,ei,y[i]); + } + sp.transposeMultiplyAdd2(alpha,it,e.end(),y); + } + + /* ************************************************************************* */ + // y += alpha*inv(R1')*A2'*e2 + void SubgraphPreconditioner::transposeMultiplyAdd2 (double alpha, + Errors::const_iterator it, Errors::const_iterator end, VectorValues& y) const { + + // create e2 with what's left of e + // TODO can we avoid creating e2 by passing iterator to transposeMultiplyAdd ? + Errors e2; + while (it != end) e2.push_back(*(it++)); + + VectorValues x = VectorValues::Zero(y); // x = 0 + gtsam::transposeMultiplyAdd(*Ab2_,1.0,e2,x); // x += A2'*e2 + axpy(alpha, gtsam::backSubstituteTranspose(*Rc1_, x), y); // y += alpha*inv(R1')*x + } + + /* ************************************************************************* */ + void SubgraphPreconditioner::print(const std::string& s) const { + cout << s << endl; + Ab2_->print(); + } +} // nsamespace gtsam diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h index 2cc760bfa..460f28e5a 100644 --- a/gtsam/linear/SubgraphPreconditioner.h +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -1,116 +1,117 @@ -///* ---------------------------------------------------------------------------- -// -// * 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 SubgraphPreconditioner.h -// * @date Dec 31, 2009 -// * @author Frank Dellaert -// */ -// -//#pragma once -// -//#include -//#include -//#include // FIXME shouldn't have nonlinear things in linear -// -//namespace gtsam { -// -// /** -// * Subgraph conditioner class, as explained in the RSS 2010 submission. -// * Starting with a graph A*x=b, we split it in two systems A1*x=b1 and A2*x=b2 -// * We solve R1*x=c1, and make the substitution y=R1*x-c1. -// * To use the class, give the Bayes Net R1*x=c1 and Graph A2*x=b2. -// * Then solve for yhat using CG, and solve for xhat = system.x(yhat). -// */ -// class SubgraphPreconditioner { -// -// public: -// typedef boost::shared_ptr sharedBayesNet; -// typedef boost::shared_ptr > sharedFG; -// typedef boost::shared_ptr sharedValues; -// typedef boost::shared_ptr sharedErrors; -// -// private: -// sharedFG Ab1_, Ab2_; -// sharedBayesNet Rc1_; -// sharedValues xbar_; -// sharedErrors b2bar_; /** b2 - A2*xbar */ -// -// public: -// -// SubgraphPreconditioner(); -// /** -// * Constructor -// * @param Ab1: the Graph A1*x=b1 -// * @param Ab2: the Graph A2*x=b2 -// * @param Rc1: the Bayes Net R1*x=c1 -// * @param xbar: the solution to R1*x=c1 -// */ -// SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar); -// -// /** Access Ab1 */ -// const sharedFG& Ab1() const { return Ab1_; } -// -// /** Access Ab2 */ -// const sharedFG& Ab2() const { return Ab2_; } -// -// /** Access Rc1 */ -// const sharedBayesNet& Rc1() const { return Rc1_; } -// -// /** -// * Add zero-mean i.i.d. Gaussian prior terms to each variable -// * @param sigma Standard deviation of Gaussian -// */ -//// SubgraphPreconditioner add_priors(double sigma) const; -// -// /* x = xbar + inv(R1)*y */ -// VectorValues x(const VectorValues& y) const; -// -// /* A zero VectorValues with the structure of xbar */ -// VectorValues zero() const { -// VectorValues V(VectorValues::Zero(*xbar_)) ; -// return V ; -// } -// -// /** -// * Add constraint part of the error only, used in both calls above -// * y += alpha*inv(R1')*A2'*e2 -// * Takes a range indicating e2 !!!! -// */ -// void transposeMultiplyAdd2(double alpha, Errors::const_iterator begin, -// Errors::const_iterator end, VectorValues& y) const; -// -// /** print the object */ -// void print(const std::string& s = "SubgraphPreconditioner") const; -// }; -// -// /* error, given y */ -// double error(const SubgraphPreconditioner& sp, const VectorValues& y); -// -// /** gradient = y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar) */ -// VectorValues gradient(const SubgraphPreconditioner& sp, const VectorValues& y); -// -// /** Apply operator A */ -// Errors operator*(const SubgraphPreconditioner& sp, const VectorValues& y); -// -// /** Apply operator A in place: needs e allocated already */ -// void multiplyInPlace(const SubgraphPreconditioner& sp, const VectorValues& y, Errors& e); -// -// /** Apply operator A' */ -// VectorValues operator^(const SubgraphPreconditioner& sp, const Errors& e); -// -// /** -// * Add A'*e to y -// * y += alpha*A'*[e1;e2] = [alpha*e1; alpha*inv(R1')*A2'*e2] -// */ -// void transposeMultiplyAdd(const SubgraphPreconditioner& sp, double alpha, const Errors& e, VectorValues& y); -// -//} // namespace gtsam +/* ---------------------------------------------------------------------------- + + * 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 SubgraphPreconditioner.h + * @date Dec 31, 2009 + * @author Frank Dellaert + */ + +#pragma once + +#include +#include + +namespace gtsam { + + /** + * Subgraph conditioner class, as explained in the RSS 2010 submission. + * Starting with a graph A*x=b, we split it in two systems A1*x=b1 and A2*x=b2 + * We solve R1*x=c1, and make the substitution y=R1*x-c1. + * To use the class, give the Bayes Net R1*x=c1 and Graph A2*x=b2. + * Then solve for yhat using CG, and solve for xhat = system.x(yhat). + */ + class SubgraphPreconditioner { + + public: + + typedef boost::shared_ptr shared_ptr; + typedef boost::shared_ptr sharedBayesNet; + typedef boost::shared_ptr > sharedFG; + typedef boost::shared_ptr sharedValues; + typedef boost::shared_ptr sharedErrors; + + private: + sharedFG Ab1_, Ab2_; + sharedBayesNet Rc1_; + sharedValues xbar_; + sharedErrors b2bar_; /** b2 - A2*xbar */ + + public: + + SubgraphPreconditioner(); + /** + * Constructor + * @param Ab1: the Graph A1*x=b1 + * @param Ab2: the Graph A2*x=b2 + * @param Rc1: the Bayes Net R1*x=c1 + * @param xbar: the solution to R1*x=c1 + */ + SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar); + + /** Access Ab1 */ + const sharedFG& Ab1() const { return Ab1_; } + + /** Access Ab2 */ + const sharedFG& Ab2() const { return Ab2_; } + + /** Access Rc1 */ + const sharedBayesNet& Rc1() const { return Rc1_; } + + /** + * Add zero-mean i.i.d. Gaussian prior terms to each variable + * @param sigma Standard deviation of Gaussian + */ +// SubgraphPreconditioner add_priors(double sigma) const; + + /* x = xbar + inv(R1)*y */ + VectorValues x(const VectorValues& y) const; + + /* A zero VectorValues with the structure of xbar */ + VectorValues zero() const { + VectorValues V(VectorValues::Zero(*xbar_)) ; + return V ; + } + + /** + * Add constraint part of the error only, used in both calls above + * y += alpha*inv(R1')*A2'*e2 + * Takes a range indicating e2 !!!! + */ + void transposeMultiplyAdd2(double alpha, Errors::const_iterator begin, + Errors::const_iterator end, VectorValues& y) const; + + /** print the object */ + void print(const std::string& s = "SubgraphPreconditioner") const; + }; + + /* error, given y */ + double error(const SubgraphPreconditioner& sp, const VectorValues& y); + + /** gradient = y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar) */ + VectorValues gradient(const SubgraphPreconditioner& sp, const VectorValues& y); + + /** Apply operator A */ + Errors operator*(const SubgraphPreconditioner& sp, const VectorValues& y); + + /** Apply operator A in place: needs e allocated already */ + void multiplyInPlace(const SubgraphPreconditioner& sp, const VectorValues& y, Errors& e); + + /** Apply operator A' */ + VectorValues operator^(const SubgraphPreconditioner& sp, const Errors& e); + + /** + * Add A'*e to y + * y += alpha*A'*[e1;e2] = [alpha*e1; alpha*inv(R1')*A2'*e2] + */ + void transposeMultiplyAdd(const SubgraphPreconditioner& sp, double alpha, const Errors& e, VectorValues& y); + +} // namespace gtsam diff --git a/gtsam/linear/SubgraphSolver-inl.h b/gtsam/linear/SubgraphSolver-inl.h index d2dc7cee2..28b2caaac 100644 --- a/gtsam/linear/SubgraphSolver-inl.h +++ b/gtsam/linear/SubgraphSolver-inl.h @@ -1,82 +1,80 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -#pragma once - -#include - -#include -#include -#include - -using namespace std; - -namespace gtsam { - -template -void SubgraphSolver::replaceFactors(const typename LINEAR::shared_ptr &graph) { - - GaussianFactorGraph::shared_ptr Ab1 = boost::make_shared(); - GaussianFactorGraph::shared_ptr Ab2 = boost::make_shared(); - - if (parameters_->verbosity()) cout << "split the graph ..."; - split(pairs_, *graph, *Ab1, *Ab2) ; - if (parameters_->verbosity()) cout << ",with " << Ab1->size() << " and " << Ab2->size() << " factors" << endl; - - // // Add a HardConstraint to the root, otherwise the root will be singular - // Key root = keys.back(); - // T_.addHardConstraint(root, theta0[root]); - // - // // compose the approximate solution - // theta_bar_ = composePoses (T_, tree, theta0[root]); - - LINEAR sacrificialAb1 = *Ab1; // duplicate !!!!! - SubgraphPreconditioner::sharedBayesNet Rc1 = - EliminationTree::Create(sacrificialAb1)->eliminate(&EliminateQR); - SubgraphPreconditioner::sharedValues xbar = gtsam::optimize_(*Rc1); - - pc_ = boost::make_shared( - Ab1->dynamicCastFactors >(), Ab2->dynamicCastFactors >(),Rc1,xbar); -} - -template -VectorValues::shared_ptr SubgraphSolver::optimize() const { - - // preconditioned conjugate gradient - VectorValues zeros = pc_->zero(); - VectorValues ybar = conjugateGradients - (*pc_, zeros, *parameters_); - - boost::shared_ptr xbar = boost::make_shared() ; - *xbar = pc_->x(ybar); - return xbar; -} - -template -void SubgraphSolver::initialize(const GRAPH& G, const Values& theta0) { - // generate spanning tree - PredecessorMap tree_ = gtsam::findMinimumSpanningTree(G); - - // make the ordering - list keys = predecessorMap2Keys(tree_); - ordering_ = boost::make_shared(list(keys.begin(), keys.end())); - - // build factor pairs - pairs_.clear(); - typedef pair EG ; - BOOST_FOREACH( const EG &eg, tree_ ) { - Key key1 = Key(eg.first), - key2 = Key(eg.second) ; - pairs_.insert(pair((*ordering_)[key1], (*ordering_)[key2])) ; - } -} - -} // \namespace gtsam +///* ---------------------------------------------------------------------------- +// +// * 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 +// +// * -------------------------------------------------------------------------- */ +// +//#pragma once +// +//#include +// +//#include +//#include +//#include +// +//namespace gtsam { +// +//template +//void SubgraphSolver::replaceFactors(const typename LINEAR::shared_ptr &graph) { +// +// GaussianFactorGraph::shared_ptr Ab1 = boost::make_shared(); +// GaussianFactorGraph::shared_ptr Ab2 = boost::make_shared(); +// +// if (parameters_->verbosity()) cout << "split the graph ..."; +// split(pairs_, *graph, *Ab1, *Ab2) ; +// if (parameters_->verbosity()) cout << ",with " << Ab1->size() << " and " << Ab2->size() << " factors" << endl; +// +// // // Add a HardConstraint to the root, otherwise the root will be singular +// // Key root = keys.back(); +// // T_.addHardConstraint(root, theta0[root]); +// // +// // // compose the approximate solution +// // theta_bar_ = composePoses (T_, tree, theta0[root]); +// +// LINEAR sacrificialAb1 = *Ab1; // duplicate !!!!! +// SubgraphPreconditioner::sharedBayesNet Rc1 = +// EliminationTree::Create(sacrificialAb1)->eliminate(&EliminateQR); +// SubgraphPreconditioner::sharedValues xbar = gtsam::optimize_(*Rc1); +// +// pc_ = boost::make_shared( +// Ab1->dynamicCastFactors >(), Ab2->dynamicCastFactors >(),Rc1,xbar); +//} +// +//template +//VectorValues::shared_ptr SubgraphSolver::optimize() const { +// +// // preconditioned conjugate gradient +// VectorValues zeros = pc_->zero(); +// VectorValues ybar = conjugateGradients +// (*pc_, zeros, *parameters_); +// +// boost::shared_ptr xbar = boost::make_shared() ; +// *xbar = pc_->x(ybar); +// return xbar; +//} +// +//template +//void SubgraphSolver::initialize(const GRAPH& G, const Values& theta0) { +// // generate spanning tree +// PredecessorMap tree_ = gtsam::findMinimumSpanningTree(G); +// +// // make the ordering +// list keys = predecessorMap2Keys(tree_); +// ordering_ = boost::make_shared(list(keys.begin(), keys.end())); +// +// // build factor pairs +// pairs_.clear(); +// typedef pair EG ; +// BOOST_FOREACH( const EG &eg, tree_ ) { +// Key key1 = Key(eg.first), +// key2 = Key(eg.second) ; +// pairs_.insert(pair((*ordering_)[key1], (*ordering_)[key2])) ; +// } +//} +// +//} // \namespace gtsam diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 609b427f2..5d6237d9c 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -1,50 +1,108 @@ -///* ---------------------------------------------------------------------------- -// -// * 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 -// -// * -------------------------------------------------------------------------- */ -// -//#include -// -//using namespace std; -// -//namespace gtsam { -// -///* split the gaussian factor graph Ab into Ab1 and Ab2 according to the map */ -//bool split(const std::map &M, -// const GaussianFactorGraph &Ab, -// GaussianFactorGraph &Ab1, -// GaussianFactorGraph &Ab2) { -// -// Ab1 = GaussianFactorGraph(); -// Ab2 = GaussianFactorGraph(); -// -// for ( size_t i = 0 ; i < Ab.size() ; ++i ) { -// -// boost::shared_ptr factor = Ab[i] ; -// -// if (factor->keys().size() > 2) -// throw(invalid_argument("split: only support factors with at most two keys")); -// if (factor->keys().size() == 1) { -// Ab1.push_back(factor); -// Ab2.push_back(factor); -// continue; -// } -// Index key1 = factor->keys()[0]; -// Index key2 = factor->keys()[1]; -// -// if ((M.find(key1) != M.end() && M.find(key1)->second == key2) || -// (M.find(key2) != M.end() && M.find(key2)->second == key1)) -// Ab1.push_back(factor); -// else -// Ab2.push_back(factor); -// } -// return true ; -//} -// -//} // \namespace gtsam +/* ---------------------------------------------------------------------------- + + * 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 + + * -------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + +using namespace std; + +namespace gtsam { + +SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters) + : parameters_(parameters) +{ + + + GaussianFactorGraph::shared_ptr Ab1 = boost::make_shared(); + GaussianFactorGraph::shared_ptr Ab2 = boost::make_shared(); + + boost::tie(Ab1, Ab2) = splitGraph(gfg) ; + + if (parameters_.verbosity()) + cout << ",with " << Ab1->size() << " and " << Ab2->size() << " factors" << endl; + + // // Add a HardConstraint to the root, otherwise the root will be singular + // Key root = keys.back(); + // T_.addHardConstraint(root, theta0[root]); + // + // // compose the approximate solution + // theta_bar_ = composePoses (T_, tree, theta0[root]); + + GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(*Ab1)->eliminate(&EliminateQR); + VectorValues::shared_ptr xbar(new VectorValues(gtsam::optimize(*Rc1))); + + pc_ = boost::make_shared( + Ab1->dynamicCastFactors >(), + Ab2->dynamicCastFactors >(), + Rc1, xbar); +} + +VectorValues::shared_ptr SubgraphSolver::optimize() { + + // preconditioned conjugate gradient + VectorValues zeros = pc_->zero(); + VectorValues ybar = conjugateGradients (*pc_, zeros, parameters_); + + boost::shared_ptr xbar = boost::make_shared() ; + *xbar = pc_->x(ybar); + return xbar; +} + +boost::tuple +SubgraphSolver::splitGraph(const GaussianFactorGraph &gfg) { + + VariableIndex index(gfg); + size_t n = index.size(); + std::vector connected(n, false); + + GaussianFactorGraph::shared_ptr At(new GaussianFactorGraph()); + GaussianFactorGraph::shared_ptr Ac( new GaussianFactorGraph()); + + BOOST_FOREACH ( const GaussianFactor::shared_ptr &gf, gfg ) { + + bool augment = false ; + + /* check whether this factor should be augmented to the "tree" graph */ + if ( gf->keys().size() == 1 ) augment = true; + else { + BOOST_FOREACH ( const Index key, *gf ) { + if ( connected[key] == false ) { + augment = true ; + connected[key] = true; + } + } + } + + if ( augment ) At->push_back(gf); + else Ac->push_back(gf); + } + + return boost::tie(At, Ac); +} + + + + +} // \namespace gtsam diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index f4fa34427..111f85cad 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -1,100 +1,52 @@ -///* ---------------------------------------------------------------------------- -// -// * 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 -// -// * -------------------------------------------------------------------------- */ -// -//#pragma once -// -//#include -// -//#include -//#include -//#include -// -//namespace gtsam { -// -///* split the gaussian factor graph Ab into Ab1 and Ab2 according to the map */ -//bool split(const std::map &M, -// const GaussianFactorGraph &Ab, -// GaussianFactorGraph &Ab1, -// GaussianFactorGraph &Ab2); -// -///** -// * A nonlinear system solver using subgraph preconditioning conjugate gradient -// * Concept NonLinearSolver implements -// * linearize: G * T -> L -// * solve : L -> VectorValues -// */ -//template -//class SubgraphSolver : public IterativeSolver { -// -//private: -// typedef typename VALUES::Key Key; -// typedef typename GRAPH::Pose Pose; -// typedef typename GRAPH::Constraint Constraint; -// -// typedef boost::shared_ptr shared_ptr ; -// typedef boost::shared_ptr shared_ordering ; -// typedef boost::shared_ptr shared_graph ; -// typedef boost::shared_ptr shared_linear ; -// typedef boost::shared_ptr shared_values ; -// typedef boost::shared_ptr shared_preconditioner ; -// typedef std::map mapPairIndex ; -// -// /* the ordering derived from the spanning tree */ -// shared_ordering ordering_; -// -// /* the indice of two vertices in the gaussian factor graph */ -// mapPairIndex pairs_; -// -// /* preconditioner */ -// shared_preconditioner pc_; -// -// /* flag for direct solver - either QR or LDL */ -// bool useQR_; -// -//public: -// -// SubgraphSolver(const GRAPH& G, const VALUES& theta0, const Parameters ¶meters = Parameters(), bool useQR = false): -// IterativeSolver(parameters), useQR_(useQR) { initialize(G,theta0); } -// -// SubgraphSolver(const LINEAR& GFG) { -// std::cout << "[SubgraphSolver] Unexpected usage.." << std::endl; -// throw std::runtime_error("SubgraphSolver: gaussian factor graph initialization not supported"); -// } -// -// SubgraphSolver(const shared_linear& GFG, const boost::shared_ptr& structure, bool useQR = false) { -// std::cout << "[SubgraphSolver] Unexpected usage.." << std::endl; -// throw std::runtime_error("SubgraphSolver: gaussian factor graph and variable index initialization not supported"); -// } -// -// SubgraphSolver(const SubgraphSolver& solver) : -// IterativeSolver(solver), ordering_(solver.ordering_), pairs_(solver.pairs_), pc_(solver.pc_), useQR_(solver.useQR_) {} -// -// SubgraphSolver(shared_ordering ordering, -// mapPairIndex pairs, -// shared_preconditioner pc, -// sharedParameters parameters = boost::make_shared(), -// bool useQR = true) : -// IterativeSolver(parameters), ordering_(ordering), pairs_(pairs), pc_(pc), useQR_(useQR) {} -// -// void replaceFactors(const typename LINEAR::shared_ptr &graph); -// VectorValues::shared_ptr optimize() ; -// shared_ordering ordering() const { return ordering_; } -// -//protected: -// void initialize(const GRAPH& G, const VALUES& theta0); -// -//private: -// SubgraphSolver():IterativeSolver(){} -//}; -// -//} // namespace gtsam -// -//#include +/* ---------------------------------------------------------------------------- + + * 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 + + * -------------------------------------------------------------------------- */ + +#pragma once + +#include +#include +#include + +#include + +namespace gtsam { + +/** + * A linear system solver using subgraph preconditioning conjugate gradient + */ + +class SubgraphSolver : public IterativeSolver { + +public: + + typedef ConjugateGradientParameters Parameters; + + Parameters parameters_; + + SubgraphPreconditioner::shared_ptr pc_; ///< preconditioner object + +public: + + SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); + + virtual ~SubgraphSolver() {} + + virtual VectorValues::shared_ptr optimize () ; + +protected: + + boost::tuple + splitGraph(const GaussianFactorGraph &gfg) ; +}; + +} // namespace gtsam + + diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 9a5897b41..8fbedc614 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -24,6 +24,7 @@ #include #include #include +#include using namespace std; @@ -74,8 +75,15 @@ void LevenbergMarquardtOptimizer::iterate() { delta = gtsam::optimize(*EliminationTree::Create(dampedSystem)->eliminate(params_.getEliminationFunction())); } else if ( params_.isCG() ) { - IterativeOptimizationParameters::shared_ptr params(!params_.iterativeParams ? boost::make_shared() : params_.iterativeParams); + + ConjugateGradientParameters::shared_ptr params (!params_.iterativeParams ? + boost::make_shared() : + boost::dynamic_pointer_cast(params_.iterativeParams)); + + if ( !params ) throw runtime_error("LMSolver: spcg parameter dynamic casting failed"); + SimpleSPCGSolver solver(dampedSystem, *params); + //SubgraphSolver solver(dampedSystem, *params); delta = *solver.optimize(); } else { diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index b4a7c3c21..393e4bacc 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -19,7 +19,7 @@ #pragma once #include -#include +#include namespace gtsam { diff --git a/gtsam_unstable/linear/iterative-inl.h b/gtsam_unstable/linear/iterative-inl.h index aa7eb076b..5641cb7ae 100644 --- a/gtsam_unstable/linear/iterative-inl.h +++ b/gtsam_unstable/linear/iterative-inl.h @@ -19,7 +19,7 @@ #pragma once #include -#include +#include #include namespace gtsam { @@ -29,7 +29,7 @@ namespace gtsam { template struct CGState { - typedef IterativeOptimizationParameters Parameters; + typedef ConjugateGradientParameters Parameters; const Parameters ¶meters_; int k; ///< iteration @@ -91,7 +91,7 @@ namespace gtsam { // check for convergence double new_gamma = dot(g, g); - if (parameters_.verbosity() != IterativeOptimizationParameters::SILENT) + if (parameters_.verbosity() != ConjugateGradientParameters::SILENT) std::cout << "iteration " << k << ": alpha = " << alpha << ", dotg = " << new_gamma << std::endl; if (new_gamma < threshold) return true; @@ -121,18 +121,18 @@ namespace gtsam { V conjugateGradients( const S& Ab, V x, - const IterativeOptimizationParameters ¶meters, + const ConjugateGradientParameters ¶meters, bool steepest = false) { CGState state(Ab, x, parameters, steepest); - if (parameters.verbosity() != IterativeOptimizationParameters::SILENT) + if (parameters.verbosity() != ConjugateGradientParameters::SILENT) std::cout << "CG: epsilon = " << parameters.epsilon() << ", maxIterations = " << parameters.maxIterations() << ", ||g0||^2 = " << state.gamma << ", threshold = " << state.threshold << std::endl; if ( state.gamma < state.threshold ) { - if (parameters.verbosity() != IterativeOptimizationParameters::SILENT) + if (parameters.verbosity() != ConjugateGradientParameters::SILENT) std::cout << "||g0||^2 < threshold, exiting immediately !" << std::endl; return x; diff --git a/gtsam_unstable/linear/iterative.cpp b/gtsam_unstable/linear/iterative.cpp index c7b670843..eb1d898dd 100644 --- a/gtsam_unstable/linear/iterative.cpp +++ b/gtsam_unstable/linear/iterative.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include @@ -38,31 +38,31 @@ namespace gtsam { /* ************************************************************************* */ - Vector steepestDescent(const System& Ab, const Vector& x, const IterativeOptimizationParameters & parameters) { + Vector steepestDescent(const System& Ab, const Vector& x, const ConjugateGradientParameters & parameters) { return conjugateGradients (Ab, x, parameters, true); } - Vector conjugateGradientDescent(const System& Ab, const Vector& x, const IterativeOptimizationParameters & parameters) { + Vector conjugateGradientDescent(const System& Ab, const Vector& x, const ConjugateGradientParameters & parameters) { return conjugateGradients (Ab, x, parameters); } /* ************************************************************************* */ - Vector steepestDescent(const Matrix& A, const Vector& b, const Vector& x, const IterativeOptimizationParameters & parameters) { + Vector steepestDescent(const Matrix& A, const Vector& b, const Vector& x, const ConjugateGradientParameters & parameters) { System Ab(A, b); return conjugateGradients (Ab, x, parameters, true); } - Vector conjugateGradientDescent(const Matrix& A, const Vector& b, const Vector& x, const IterativeOptimizationParameters & parameters) { + Vector conjugateGradientDescent(const Matrix& A, const Vector& b, const Vector& x, const ConjugateGradientParameters & parameters) { System Ab(A, b); return conjugateGradients (Ab, x, parameters); } /* ************************************************************************* */ - VectorValues steepestDescent(const FactorGraph& fg, const VectorValues& x, const IterativeOptimizationParameters & parameters) { + VectorValues steepestDescent(const FactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters) { return conjugateGradients, VectorValues, Errors> (fg, x, parameters, true); } - VectorValues conjugateGradientDescent(const FactorGraph& fg, const VectorValues& x, const IterativeOptimizationParameters & parameters) { + VectorValues conjugateGradientDescent(const FactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters) { return conjugateGradients, VectorValues, Errors> (fg, x, parameters); } diff --git a/gtsam_unstable/linear/iterative.h b/gtsam_unstable/linear/iterative.h index 2e6f77f10..f578391d0 100644 --- a/gtsam_unstable/linear/iterative.h +++ b/gtsam_unstable/linear/iterative.h @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- - * GTSAM Copyright 2010, Georgia Tech Research Corporation, + * 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) @@ -20,7 +20,7 @@ #include #include -#include +#include namespace gtsam { @@ -105,7 +105,7 @@ namespace gtsam { Vector conjugateGradientDescent( const System& Ab, const Vector& x, - const IterativeOptimizationParameters & parameters); + const ConjugateGradientParameters & parameters); /** convenience calls using matrices, will create System class internally: */ @@ -116,7 +116,7 @@ namespace gtsam { const Matrix& A, const Vector& b, const Vector& x, - const IterativeOptimizationParameters & parameters); + const ConjugateGradientParameters & parameters); /** * Method of conjugate gradients (CG), Matrix version @@ -125,7 +125,7 @@ namespace gtsam { const Matrix& A, const Vector& b, const Vector& x, - const IterativeOptimizationParameters & parameters); + const ConjugateGradientParameters & parameters); class GaussianFactorGraph; @@ -135,7 +135,7 @@ namespace gtsam { VectorValues steepestDescent( const GaussianFactorGraph& fg, const VectorValues& x, - const IterativeOptimizationParameters & parameters); + const ConjugateGradientParameters & parameters); /** * Method of conjugate gradients (CG), Gaussian Factor Graph version @@ -143,7 +143,7 @@ namespace gtsam { VectorValues conjugateGradientDescent( const GaussianFactorGraph& fg, const VectorValues& x, - const IterativeOptimizationParameters & parameters); + const ConjugateGradientParameters & parameters); } // namespace gtsam From a5f3f75d1d6f17e282f72d0509a80830f37e7c90 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 8 Jun 2012 17:12:08 +0000 Subject: [PATCH 279/914] Removed mex make flag --- .cproject | 336 ++++++++++++++++++++++++------------------------- CMakeLists.txt | 1 - 2 files changed, 167 insertions(+), 170 deletions(-) diff --git a/.cproject b/.cproject index 36e736354..5689b0b48 100644 --- a/.cproject +++ b/.cproject @@ -311,6 +311,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -337,7 +345,6 @@ make - tests/testBayesTree.run true false @@ -345,7 +352,6 @@ make - testBinaryBayesNet.run true false @@ -393,7 +399,6 @@ make - testSymbolicBayesNet.run true false @@ -401,7 +406,6 @@ make - tests/testSymbolicFactor.run true false @@ -409,7 +413,6 @@ make - testSymbolicFactorGraph.run true false @@ -425,20 +428,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -519,22 +513,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -551,6 +529,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -575,26 +569,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -679,18 +665,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -937,7 +931,6 @@ make - testGraph.run true false @@ -945,7 +938,6 @@ make - testJunctionTree.run true false @@ -953,7 +945,6 @@ make - testSymbolicBayesNetB.run true false @@ -975,6 +966,14 @@ true true + + make + -j5 + clean + true + true + true + make -j2 @@ -1065,7 +1064,6 @@ make - testErrors.run true false @@ -1521,6 +1519,7 @@ make + testSimulated2DOriented.run true false @@ -1560,6 +1559,7 @@ make + testSimulated2D.run true false @@ -1567,6 +1567,7 @@ make + testSimulated3D.run true false @@ -1782,6 +1783,7 @@ make + tests/testGaussianISAM2 true false @@ -1803,6 +1805,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -2004,7 +2102,6 @@ cpack - -G DEB true false @@ -2012,7 +2109,6 @@ cpack - -G RPM true false @@ -2020,7 +2116,6 @@ cpack - -G TGZ true false @@ -2028,7 +2123,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2122,98 +2216,42 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run + -j5 + wrap_gtsam true true true - + make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2257,46 +2295,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/CMakeLists.txt b/CMakeLists.txt index 50c1d12c7..c843030e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,6 @@ set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTR option(GTSAM_BUILD_MEX_BIN "Enable/Disable building of matlab mex files" OFF) option(GTSAM_INSTALL_MEX_BIN "Enable/Disable installing matlab mex binaries" OFF) set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Flags for running Matlab MEX compilation") -set(GTSAM_BUILD_MEX_MAKE_FLAGS "-j2" CACHE STRING "Flags for running make on toolbox MEX files") set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)") # Flags for choosing default packaging tools From a70a1bab588bd330aec2afc7fd63deca0d48f2cf Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 17:18:46 +0000 Subject: [PATCH 280/914] Removed use of lambda from Values --- gtsam/nonlinear/Values.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 4bc5f0f7e..03bafaf3e 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -37,16 +37,16 @@ #include #include #include -#include #include #include namespace gtsam { - // Forward declarations + // Forward declarations / utilities class ValueCloneAllocator; class ValueAutomaticCasting; + template static bool _truePredicate(const T&) { return true; } /** * A non-templated config holding any types of Manifold-group elements. A @@ -300,7 +300,7 @@ namespace gtsam { */ template Filtered - filter(const boost::function& filterFcn = (boost::lambda::_1, true)); + filter(const boost::function& filterFcn = &_truePredicate); /** * Return a filtered view of this Values class, without copying any data. @@ -338,7 +338,7 @@ namespace gtsam { */ template ConstFiltered - filter(const boost::function& filterFcn = (boost::lambda::_1, true)) const; + filter(const boost::function& filterFcn = _truePredicate()) const; private: // Filters based on ValueType (if not Value) and also based on the user- @@ -380,13 +380,13 @@ namespace gtsam { mutable std::string message_; public: - /// Construct with the key-value pair attemped to be added + /// Construct with the key-value pair attempted to be added ValuesKeyAlreadyExists(Key key) throw() : key_(key) {} virtual ~ValuesKeyAlreadyExists() throw() {} - /// The duplicate key that was attemped to be added + /// The duplicate key that was attempted to be added Key key() const throw() { return key_; } /// The message to be displayed to the user From 498fb85360ab529f4212aa06513ffe8a5da248b7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 17:32:08 +0000 Subject: [PATCH 281/914] Fixed typo --- gtsam/nonlinear/Values.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 03bafaf3e..4a6ec092b 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -338,7 +338,7 @@ namespace gtsam { */ template ConstFiltered - filter(const boost::function& filterFcn = _truePredicate()) const; + filter(const boost::function& filterFcn = _truePredicate) const; private: // Filters based on ValueType (if not Value) and also based on the user- From 370be58adbb07f4fc8bb1af7425f29cb25fa538d Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 8 Jun 2012 17:46:04 +0000 Subject: [PATCH 282/914] Fixed compile problem in Values --- gtsam/nonlinear/Values.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 4a6ec092b..8b8fbc71c 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -300,7 +300,7 @@ namespace gtsam { */ template Filtered - filter(const boost::function& filterFcn = &_truePredicate); + filter(const boost::function& filterFcn = &_truePredicate); /** * Return a filtered view of this Values class, without copying any data. @@ -338,7 +338,7 @@ namespace gtsam { */ template ConstFiltered - filter(const boost::function& filterFcn = _truePredicate) const; + filter(const boost::function& filterFcn = &_truePredicate) const; private: // Filters based on ValueType (if not Value) and also based on the user- From c2c27b08d8e82e3ba8faeb0dab7541564b413565 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 18:05:58 +0000 Subject: [PATCH 283/914] VisualISAM_gui2: add 2 options and take plot out of step --- .../VisualISAM_gui2/VisualISAM_gui.fig | Bin 5442 -> 6507 bytes .../examples/VisualISAM_gui2/VisualISAM_gui.m | 66 +++++++++++++++++- matlab/examples/VisualISAM_gui2/vInit.m | 2 +- matlab/examples/VisualISAM_gui2/vPlot.m | 45 ++++++++++++ matlab/examples/VisualISAM_gui2/vStep.m | 35 +--------- 5 files changed, 110 insertions(+), 38 deletions(-) create mode 100644 matlab/examples/VisualISAM_gui2/vPlot.m diff --git a/matlab/examples/VisualISAM_gui2/VisualISAM_gui.fig b/matlab/examples/VisualISAM_gui2/VisualISAM_gui.fig index 5de0dc86dd9f6644df9e817870f5f13fba04ced8..24f5b2f01deaf3b175661bdc9819c1c7c559f70f 100644 GIT binary patch delta 6467 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 diff --git a/matlab/examples/VisualISAM_gui2/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui2/VisualISAM_gui.m index e73d6f7cf..d00d1cdc7 100644 --- a/matlab/examples/VisualISAM_gui2/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui2/VisualISAM_gui.m @@ -22,7 +22,7 @@ function varargout = VisualISAM_gui(varargin) % Edit the above text to modify the response to help VisualISAM_gui -% Last Modified by GUIDE v2.5 08-Jun-2012 12:35:14 +% Last Modified by GUIDE v2.5 08-Jun-2012 14:00:55 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -68,7 +68,7 @@ handles.ALWAYS_RELINEARIZE = false; %% Display Options handles.SAVE_GRAPH = false; handles.PRINT_STATS = true; -handles.DRAW_INTERVAL = 1; +handles.DRAW_INTERVAL = 4; handles.CAMERA_INTERVAL = 1; handles.DRAW_TRUE_POSES = false; handles.SAVE_FIGURES = false; @@ -107,7 +107,9 @@ function intializeButton_Callback(hObject, eventdata, handles) % hObject handle to intializeButton (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) - handles=initialize(handles) + handles.DRAW_INTERVAL = str2num(get(handles.drawInterval,'String')) ; + handles.NCAMERAS = str2num(get(handles.numCamEdit,'String')) ; + handles = initialize(handles) guidata(hObject,handles) % --- Executes on button press in stepButton. @@ -116,6 +118,7 @@ function stepButton_Callback(hObject, eventdata, handles) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) if (handles.frame_i Date: Fri, 8 Jun 2012 19:05:13 +0000 Subject: [PATCH 284/914] Fixed Doxygen warnings. --- gtsam/geometry/Pose2.h | 4 ++-- gtsam/geometry/Rot2.h | 2 +- gtsam/inference/BayesTreeCliqueBase.h | 2 +- gtsam/inference/JunctionTree.h | 2 +- gtsam/nonlinear/ISAM2-impl.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gtsam/geometry/Pose2.h b/gtsam/geometry/Pose2.h index d15ba045c..60c74e7cb 100644 --- a/gtsam/geometry/Pose2.h +++ b/gtsam/geometry/Pose2.h @@ -226,7 +226,7 @@ public: /** * Calculate bearing to a landmark * @param point 2D location of landmark - * @return 2D rotation \in SO(2) + * @return 2D rotation \f$ \in SO(2) \f$ */ Rot2 bearing(const Point2& point, boost::optional H1=boost::none, @@ -235,7 +235,7 @@ public: /** * Calculate bearing to another pose * @param point SO(2) location of other pose - * @return 2D rotation \in SO(2) + * @return 2D rotation \f$ \in SO(2) \f$ */ Rot2 bearing(const Pose2& point, boost::optional H1=boost::none, diff --git a/gtsam/geometry/Rot2.h b/gtsam/geometry/Rot2.h index d0f3e4c14..9e5e6fddc 100644 --- a/gtsam/geometry/Rot2.h +++ b/gtsam/geometry/Rot2.h @@ -85,7 +85,7 @@ namespace gtsam { * Calculate relative bearing to a landmark in local coordinate frame * @param d 2D location of landmark * @param H optional reference for Jacobian - * @return 2D rotation \in SO(2) + * @return 2D rotation \f$ \in SO(2) \f$ */ static Rot2 relativeBearing(const Point2& d, boost::optional H = boost::none); diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index 7ae2c15f9..e09454e86 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -130,7 +130,7 @@ namespace gtsam { /** Construct shared_ptr from a FactorGraph::EliminationResult. In this class * the conditional part is kept and the factor part is ignored, but in derived clique * types, such as ISAM2Clique, the factor part is kept as a cached factor. - * @param An elimination result, which is a pair + * @param result An elimination result, which is a pair */ static derived_ptr Create(const std::pair >& result) { return boost::make_shared(result); } diff --git a/gtsam/inference/JunctionTree.h b/gtsam/inference/JunctionTree.h index e8aceafe9..4ff55d19b 100644 --- a/gtsam/inference/JunctionTree.h +++ b/gtsam/inference/JunctionTree.h @@ -108,7 +108,7 @@ namespace gtsam { JunctionTree(const FG& factorGraph); /** Construct from a factor graph and pre-computed variable index. - * @param factorGraph The factor graph for which to build the junction tree + * @param fg The factor graph for which to build the junction tree * @param structure The set of factors involving each variable. If this is not * precomputed, you can call the JunctionTree(const FG&) * constructor instead. diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index 51b613b86..f2f03fb3a 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -91,7 +91,7 @@ struct ISAM2::Impl { /** * Apply expmap to the given values, but only for indices appearing in * \c markedRelinMask. Values are expmapped in-place. - * \param [in][out] values The value to expmap in-place + * \param [in, out] values The value to expmap in-place * \param delta The linear delta with which to expmap * \param ordering The ordering * \param mask Mask on linear indices, only \c true entries are expmapped From 9b710806255af6de343bb45ab888aaa1fc34eaec Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 20:08:53 +0000 Subject: [PATCH 285/914] Visual ISAM gui with global vars --- matlab/examples/VisualISAMGenerateData.m | 50 +++ matlab/examples/VisualISAMGlobalVars.m | 7 + matlab/examples/VisualISAMInitOptions.m | 22 ++ matlab/examples/VisualISAMInitialize.m | 28 ++ matlab/examples/VisualISAMPlot.m | 42 +++ matlab/examples/VisualISAMStep.m | 46 +++ matlab/examples/VisualISAM_gui.fig | Bin 0 -> 9609 bytes matlab/examples/VisualISAM_gui.m | 393 +++++++++++++++++++++++ 8 files changed, 588 insertions(+) create mode 100644 matlab/examples/VisualISAMGenerateData.m create mode 100644 matlab/examples/VisualISAMGlobalVars.m create mode 100644 matlab/examples/VisualISAMInitOptions.m create mode 100644 matlab/examples/VisualISAMInitialize.m create mode 100644 matlab/examples/VisualISAMPlot.m create mode 100644 matlab/examples/VisualISAMStep.m create mode 100644 matlab/examples/VisualISAM_gui.fig create mode 100644 matlab/examples/VisualISAM_gui.m diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m new file mode 100644 index 000000000..7ab135168 --- /dev/null +++ b/matlab/examples/VisualISAMGenerateData.m @@ -0,0 +1,50 @@ +VisualISAMGlobalVars +sprintf('vData...') + +%% Generate simulated data +points = {}; +if TRIANGLE % Create a triangle target, just 3 points on a plane + nPoints = 3; + r = 10; + for j=1:nPoints + theta = (j-1)*2*pi/nPoints; + points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); + end +else % 3D landmarks as vertices of a cube + nPoints = 8; + points = {gtsamPoint3([10 10 10]'),... + gtsamPoint3([-10 10 10]'),... + gtsamPoint3([-10 -10 10]'),... + gtsamPoint3([10 -10 10]'),... + gtsamPoint3([10 10 -10]'),... + gtsamPoint3([-10 10 -10]'),... + gtsamPoint3([-10 -10 -10]'),... + gtsamPoint3([10 -10 -10]')}; +end + +%% Create camera cameras on a circle around the triangle +height = 10; r = 40; +K = gtsamCal3_S2(500,500,0,640/2,480/2); +cameras = {}; +for i=1:NCAMERAS + theta = (i-1)*2*pi/NCAMERAS; + t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); + cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); + if SHOW_IMAGES % show images + figure(2+i);clf;hold on + set(2+i,'NumberTitle','off','Name',sprintf('Camera %d',i)); + for j=1:nPoints + zij = cameras{i}.project(points{j}); + plot(zij.x,zij.y,'*'); + axis([1 640 1 480]); + end + end +end +odometry = cameras{1}.pose.between(cameras{2}.pose); + + +%% Set Noise parameters +poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); +measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); \ No newline at end of file diff --git a/matlab/examples/VisualISAMGlobalVars.m b/matlab/examples/VisualISAMGlobalVars.m new file mode 100644 index 000000000..2438a9ea0 --- /dev/null +++ b/matlab/examples/VisualISAMGlobalVars.m @@ -0,0 +1,7 @@ +global TRIANGLE NCAMERAS SHOW_IMAGES +global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE +global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES +global SAVE_FIGURES SAVE_GRAPHS +global nPoints points K cameras odometry +global poseNoise pointNoise odometryNoise measurementNoise +global frame_i isam newFactors initialEstimates result diff --git a/matlab/examples/VisualISAMInitOptions.m b/matlab/examples/VisualISAMInitOptions.m new file mode 100644 index 000000000..a9ef09bb5 --- /dev/null +++ b/matlab/examples/VisualISAMInitOptions.m @@ -0,0 +1,22 @@ +VisualISAMGlobalVars + +%% Data Options +TRIANGLE = true; +NCAMERAS = 20; +SHOW_IMAGES = false; + +%% iSAM Options +HARD_CONSTRAINT = false; +POINT_PRIORS = false; +BATCH_INIT = true; +REORDER_INTERVAL=10; +ALWAYS_RELINEARIZE = false; + +%% Display Options +SAVE_GRAPH = false; +PRINT_STATS = true; +DRAW_INTERVAL = 4; +CAMERA_INTERVAL = 1; +DRAW_TRUE_POSES = false; +SAVE_FIGURES = false; +SAVE_GRAPHS = false; \ No newline at end of file diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m new file mode 100644 index 000000000..ae48f3531 --- /dev/null +++ b/matlab/examples/VisualISAMInitialize.m @@ -0,0 +1,28 @@ +VisualISAMGlobalVars + +%% Initialize iSAM +isam = visualSLAMISAM(REORDER_INTERVAL); +newFactors = visualSLAMGraph; +initialEstimates = visualSLAMValues; +i1 = symbol('x',1); +camera1 = cameras{1}; +pose1 = camera1.pose; +if HARD_CONSTRAINT % add hard constraint + newFactors.addPoseConstraint(i1,pose1); +else + newFactors.addPosePrior(i1,pose1, poseNoise); +end +initialEstimates.insertPose(i1,pose1); +% Add visual measurement factors from first pose +for j=1:nPoints + jj = symbol('l',j); + if POINT_PRIORS % add point priors + newFactors.addPointPrior(jj, points{j}, pointNoise); + end + zij = camera1.project(points{j}); + newFactors.addMeasurement(zij, measurementNoise, i1, jj, K); + initialEstimates.insertPoint(jj, points{j}); +end + +frame_i = 1 +cla; \ No newline at end of file diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m new file mode 100644 index 000000000..549c3ac37 --- /dev/null +++ b/matlab/examples/VisualISAMPlot.m @@ -0,0 +1,42 @@ +VisualISAMGlobalVars + +if (frame_i<2) + sprintf('Cannot plot the first frame') + return +end + +%% Plot results +tic +% h=figure(2);clf +% set(1,'NumberTitle','off','Name','Visual iSAM'); +cla; +hold on; +sprintf('Computing marginals and plotting. Please wait...') +for j=1:size(points,2) + P = isam.marginalCovariance(symbol('l',j)); + point_j = result.point(symbol('l',j)); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); +end +for ii=1:CAMERA_INTERVAL:frame_i + P = isam.marginalCovariance(symbol('x',ii)); + pose_ii = result.pose(symbol('x',ii)); + plotPose3(pose_ii,P,10); + if DRAW_TRUE_POSES % show ground truth + plotPose3(cameras{ii}.pose,0.001*eye(6),10); + end +end +axis([-40 40 -40 40 -10 20]);axis equal +view(3) +colormap('hot') +sprintf('Done!') + +% figure(2); +t=toc; +if DRAW_INTERVAL~=NCAMERAS, plot(frame_i,t,'b.'); end +if SAVE_FIGURES + print(h,'-dpng',sprintf('VisualiSAM%03d.png',frame_i)); +end +if SAVE_GRAPHS + isam.saveGraph(sprintf('VisualiSAM%03d.dot',frame_i)); +end diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m new file mode 100644 index 000000000..7c86e3ce1 --- /dev/null +++ b/matlab/examples/VisualISAMStep.m @@ -0,0 +1,46 @@ +VisualISAMGlobalVars + +%% Add odometry +newFactors.addOdometry(symbol('x',frame_i-1), symbol('x',frame_i), odometry, odometryNoise); + +%% Add visual measurement factors +for j=1:nPoints + zij = cameras{frame_i}.project(points{j}); + newFactors.addMeasurement(zij, measurementNoise, symbol('x',frame_i), symbol('l',j), K); +end + +%% Initial estimates for the new pose. Also initialize points while in the first frame. +%TODO: this might be suboptimal since "result" is not the fully optimized result +if (frame_i==2), prevPose = cameras{1}.pose; +else, prevPose = result.pose(symbol('x',frame_i-1)); end +initialEstimates.insertPose(symbol('x',frame_i), prevPose.compose(odometry)); + +%% Update ISAM +if BATCH_INIT & (frame_i==2) % Do a full optimize for first two poses + initialEstimates + fullyOptimized = newFactors.optimize(initialEstimates) + initialEstimates = fullyOptimized; +end +% figure(1);tic; +isam.update(newFactors, initialEstimates); +% t=toc; plot(frame_i,t,'r.'); tic +result = isam.estimate(); +% t=toc; plot(frame_i,t,'g.'); +if ALWAYS_RELINEARIZE % re-linearize + isam.reorder_relinearize(); +end + + +if SAVE_GRAPH + isam.saveGraph(sprintf('VisualiSAM.dot',frame_i)); +end +if PRINT_STATS + isam.printStats(); +end +if mod(frame_i,DRAW_INTERVAL)==0 + VisualISAMPlot +end + +%% Reset newFactors and initialEstimates to prepare for the next update +newFactors = visualSLAMGraph; +initialEstimates = visualSLAMValues; \ No newline at end of file diff --git a/matlab/examples/VisualISAM_gui.fig b/matlab/examples/VisualISAM_gui.fig new file mode 100644 index 0000000000000000000000000000000000000000..e01fc121404c65aa02fc01446d26a9da945f4241 GIT binary patch literal 9609 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 Date: Fri, 8 Jun 2012 20:09:13 +0000 Subject: [PATCH 286/914] remove visualISAM_gui folders From 017b591f2cd08ee40e346a26a4445151a8e79fad Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 20:09:30 +0000 Subject: [PATCH 287/914] remove visualISAM_gui folders --- .../VisualISAM_gui/VisualISAMData_cube.m | 34 -- .../VisualISAM_gui/VisualISAMData_triangle.m | 32 -- .../VisualISAMExample_triangle2.m | 22 - .../VisualISAM_gui/VisualISAMInitialize.m | 41 -- .../examples/VisualISAM_gui/VisualISAMPlot.m | 20 - .../examples/VisualISAM_gui/VisualISAMStep.m | 31 -- .../VisualISAM_gui/VisualISAM_gui.fig | Bin 8272 -> 0 bytes .../examples/VisualISAM_gui/VisualISAM_gui.m | 401 ------------------ .../VisualISAM_gui2/VisualISAM_gui.fig | Bin 6507 -> 0 bytes .../examples/VisualISAM_gui2/VisualISAM_gui.m | 235 ---------- matlab/examples/VisualISAM_gui2/vData.m | 51 --- matlab/examples/VisualISAM_gui2/vInit.m | 31 -- matlab/examples/VisualISAM_gui2/vPlot.m | 45 -- matlab/examples/VisualISAM_gui2/vStep.m | 52 --- 14 files changed, 995 deletions(-) delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAMData_cube.m delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAMData_triangle.m delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAMExample_triangle2.m delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAMInitialize.m delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAMPlot.m delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAMStep.m delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAM_gui.fig delete mode 100644 matlab/examples/VisualISAM_gui/VisualISAM_gui.m delete mode 100644 matlab/examples/VisualISAM_gui2/VisualISAM_gui.fig delete mode 100644 matlab/examples/VisualISAM_gui2/VisualISAM_gui.m delete mode 100644 matlab/examples/VisualISAM_gui2/vData.m delete mode 100644 matlab/examples/VisualISAM_gui2/vInit.m delete mode 100644 matlab/examples/VisualISAM_gui2/vPlot.m delete mode 100644 matlab/examples/VisualISAM_gui2/vStep.m diff --git a/matlab/examples/VisualISAM_gui/VisualISAMData_cube.m b/matlab/examples/VisualISAM_gui/VisualISAMData_cube.m deleted file mode 100644 index 3f4f015cf..000000000 --- a/matlab/examples/VisualISAM_gui/VisualISAMData_cube.m +++ /dev/null @@ -1,34 +0,0 @@ -function [ data ] = VisualISAMData_cube() -%VISUALISAMDATA_TRIANGLE Generate data for visual ISAM triangle example. -% Landmarks include 3 points around the world's origin on the z=0 plane. -% Cameras are on a circle at a certain height, looking at the origin. -%% Create a triangle target, just 3 points on a plane -nPoints = 8; -data.points = {gtsamPoint3([10 10 10]'),... - gtsamPoint3([-10 10 10]'),... - gtsamPoint3([-10 -10 10]'),... - gtsamPoint3([10 -10 10]'),... - gtsamPoint3([10 10 -10]'),... - gtsamPoint3([-10 10 -10]'),... - gtsamPoint3([-10 -10 -10]'),... - gtsamPoint3([10 -10 -10]')}; - -%% Create camera cameras on a circle around the triangle -nCameras = 10; -height = 0; -r = 30; -data.cameras = {}; -data.K = gtsamCal3_S2(500,500,0,640/2,480/2); -for i=1:nCameras - theta = (i-1)*2*pi/nCameras; - t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - data.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), data.K); -end - -data.posePriorNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 5.0 5.0 5.0]'); -data.odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 2.0 2.0 2.0]'); -data.pointPriorNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); -data.measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); - -end - diff --git a/matlab/examples/VisualISAM_gui/VisualISAMData_triangle.m b/matlab/examples/VisualISAM_gui/VisualISAMData_triangle.m deleted file mode 100644 index b5c4c0e11..000000000 --- a/matlab/examples/VisualISAM_gui/VisualISAMData_triangle.m +++ /dev/null @@ -1,32 +0,0 @@ -function [ data ] = VisualISAMData_triangle() -%VISUALISAMDATA_TRIANGLE Generate data for visual ISAM triangle example. -% Landmarks include 3 points around the world's origin on the z=0 plane. -% Cameras are on a circle at a certain height, looking at the origin. -%% Create a triangle target, just 3 points on a plane -nPoints = 3; -r = 10; -data.points = {}; -for j=1:nPoints - theta = (j-1)*2*pi/nPoints; - data.points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); -end - -%% Create camera cameras on a circle around the triangle -nCameras = 10; -height = 10; -r = 30; -data.cameras = {}; -data.K = gtsamCal3_S2(500,500,0,640/2,480/2); -for i=1:nCameras - theta = (i-1)*2*pi/nCameras; - t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - data.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), data.K); -end - -data.posePriorNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 5.0 5.0 5.0]'); -data.odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 2.0 2.0 2.0]'); -data.pointPriorNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); -data.measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); - -end - diff --git a/matlab/examples/VisualISAM_gui/VisualISAMExample_triangle2.m b/matlab/examples/VisualISAM_gui/VisualISAMExample_triangle2.m deleted file mode 100644 index 4f9df958e..000000000 --- a/matlab/examples/VisualISAM_gui/VisualISAMExample_triangle2.m +++ /dev/null @@ -1,22 +0,0 @@ -%% data -%data = VisualISAMData_triangle(); -data = VisualISAMData_cube(); - -%% init -[isam results] = VisualISAMInitialize(data); -sprintf('Frame 1,2:') -results -figure(1); clf; -VisualISAMPlot(results, data); - -%% Next frame index -frame_i=2; -%% All steps -while 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 p6!Lls?};R size(handles.results,2)) - [handles.isam handles.results{handles.frame_i}] = ... - VisualISAMStep(handles.frame_i, handles.isam, ... - handles.data, handles.results{handles.frame_i-1}); - end - handles.results{handles.frame_i}.estimates - cla(handles.resultAxes); - VisualISAMPlot(handles.results{handles.frame_i}, handles.data) - guidata(hObject,handles) - else - sprintf('Frame %d:', handles.frame_i) - sprintf('No more frame!') - end - - -function edit1_Callback(hObject, eventdata, handles) -% hObject handle to edit1 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of edit1 as text -% str2double(get(hObject,'String')) returns contents of edit1 as a double - - -% --- Executes during object creation, after setting all properties. -function edit1_CreateFcn(hObject, eventdata, handles) -% hObject handle to edit1 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -% --- Executes on selection change in popupmenu1. -function popupmenu1_Callback(hObject, eventdata, handles) -% hObject handle to popupmenu1 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array -% contents{get(hObject,'Value')} returns selected item from popupmenu1 - str = cellstr(get(hObject,'String')); - sel = get(hObject,'Value'); - handles.selectedDataset = str{sel} - handles=initialize(handles) - guidata(hObject, handles); - -% --- Executes during object creation, after setting all properties. -function popupmenu1_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu1 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: popupmenu controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -% --- Executes during object creation, after setting all properties. -function Dataset_CreateFcn(hObject, eventdata, handles) -% hObject handle to Dataset (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - - -% --- Executes on button press in backButton. -function backButton_Callback(hObject, eventdata, handles) -% hObject handle to backButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - if (handles.frame_i>2) - handles.frame_i = handles.frame_i-1; - sprintf('Frame %d:', handles.frame_i) - handles.results{handles.frame_i}.estimates - cla(handles.resultAxes); - VisualISAMPlot(handles.results{handles.frame_i}, handles.data) - guidata(hObject,handles) - else - sprintf('No more frame!'); - end - -% --- Executes on button press in runButton. -function runButton_Callback(hObject, eventdata, handles) -% hObject handle to runButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - for i=handles.frame_i+1:size(handles.data.cameras,2) - if (i > size(handles.results,2)) - [handles.isam handles.results{i}] = ... - VisualISAMStep(i, handles.isam, ... - handles.data, handles.results{i-1}); - end - handles.results{i}.estimates - cla(handles.resultAxes); - VisualISAMPlot(handles.results{i}, handles.data) - end - handles.frame_i = size(handles.data.cameras,2); - sprintf('Frame %d:', handles.frame_i) - guidata(hObject,handles) - - -% --- Executes on button press in stopButton. -function stopButton_Callback(hObject, eventdata, handles) -% hObject handle to stopButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - sprintf('Not yet implemented') - - -function edit8_Callback(hObject, eventdata, handles) -% hObject handle to edit8 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of edit8 as text -% str2double(get(hObject,'String')) returns contents of edit8 as a double - - -% --- Executes during object creation, after setting all properties. -function edit8_CreateFcn(hObject, eventdata, handles) -% hObject handle to edit8 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function odoTrans_Callback(hObject, eventdata, handles) -% hObject handle to odoTrans (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of odoTrans as text -% str2double(get(hObject,'String')) returns contents of odoTrans as a double - - -% --- Executes during object creation, after setting all properties. -function odoTrans_CreateFcn(hObject, eventdata, handles) -% hObject handle to odoTrans (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function measNoise_Callback(hObject, eventdata, handles) -% hObject handle to measNoise (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of measNoise as text -% str2double(get(hObject,'String')) returns contents of measNoise as a double - - -% --- Executes during object creation, after setting all properties. -function measNoise_CreateFcn(hObject, eventdata, handles) -% hObject handle to measNoise (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function posePriorRot_Callback(hObject, eventdata, handles) -% hObject handle to posePriorRot (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of posePriorRot as text -% str2double(get(hObject,'String')) returns contents of posePriorRot as a double - - -% --- Executes during object creation, after setting all properties. -function posePriorRot_CreateFcn(hObject, eventdata, handles) -% hObject handle to posePriorRot (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function posePriorTrans_Callback(hObject, eventdata, handles) -% hObject handle to posePriorTrans (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of posePriorTrans as text -% str2double(get(hObject,'String')) returns contents of posePriorTrans as a double - - -% --- Executes during object creation, after setting all properties. -function posePriorTrans_CreateFcn(hObject, eventdata, handles) -% hObject handle to posePriorTrans (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function pointPrior_Callback(hObject, eventdata, handles) -% hObject handle to pointPrior (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of pointPrior as text -% str2double(get(hObject,'String')) returns contents of pointPrior as a double - - -% --- Executes during object creation, after setting all properties. -function pointPrior_CreateFcn(hObject, eventdata, handles) -% hObject handle to pointPrior (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function odoRot_Callback(hObject, eventdata, handles) -% hObject handle to odoRot (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of odoRot as text -% str2double(get(hObject,'String')) returns contents of odoRot as a double - - -% --- Executes during object creation, after setting all properties. -function odoRot_CreateFcn(hObject, eventdata, handles) -% hObject handle to odoRot (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end diff --git a/matlab/examples/VisualISAM_gui2/VisualISAM_gui.fig b/matlab/examples/VisualISAM_gui2/VisualISAM_gui.fig deleted file mode 100644 index 24f5b2f01deaf3b175661bdc9819c1c7c559f70f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6507 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%0Aqvt`{LuTTn0I-ZVGnqO5X>V#TZ+7bq^`(0 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 qQ# Date: Fri, 8 Jun 2012 22:20:26 +0000 Subject: [PATCH 288/914] Fixed extra CXXFLAGS not being passed to mex - caused matlab wrappers to not be compiled in quaternion mode, causing errors in quaternion mode. --- gtsam/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index d81cee87d..7e86e4bb8 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -128,7 +128,7 @@ if (GTSAM_BUILD_WRAP) endif() # Generate, build and install toolbox - set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${GTSAM_LIB_DIR} -lgtsam") + set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} ${CMAKE_CXX_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${GTSAM_LIB_DIR} -lgtsam") # Macro to handle details of setting up targets wrap_library(gtsam "${mexFlags}" "../") From 2dbbd9f989a599520c09f593b94782e786edbfe0 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 8 Jun 2012 22:20:28 +0000 Subject: [PATCH 289/914] Fixed mex flags once and for all for today :-) --- gtsam/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 7e86e4bb8..495c3f39f 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -129,7 +129,9 @@ if (GTSAM_BUILD_WRAP) # Generate, build and install toolbox set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} ${CMAKE_CXX_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${GTSAM_LIB_DIR} -lgtsam") - + string(TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_toupper) + set(mexFlags "${mexFlags} -g COMPFLAGS='/c /DMATLAB_MEX_FILE ${CMAKE_CXX_FLAGS_${cmake_build_type_toupper}}'") + # Macro to handle details of setting up targets wrap_library(gtsam "${mexFlags}" "../") endif () From 3bad1346d6ee276f8e89ea5ef06ad708c1d710b7 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 22:34:03 +0000 Subject: [PATCH 290/914] matlab plotPose3: don't draw covariance if it's empty --- matlab/plotPose3.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/plotPose3.m b/matlab/plotPose3.m index d55b7323a..262d1dfc1 100644 --- a/matlab/plotPose3.m +++ b/matlab/plotPose3.m @@ -20,7 +20,7 @@ L = [C zAxis]'; line(L(:,1),L(:,2),L(:,3),'Color','b'); % plot the covariance -if nargin>2 +if (nargin>2) && (~isempty(P)) pPp = P(4:6,4:6); % covariance matrix in pose coordinate frame gPp = gRp*pPp*gRp'; % convert the covariance matrix to global coordinate frame covarianceEllipse3D(C,gPp); From f3b9bccfd539f026a716021912409c325461f7d4 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 8 Jun 2012 22:36:34 +0000 Subject: [PATCH 291/914] -VisualISAMExample now uses only 5 scripts. -Generate data in Initialize callback -Plot points and first camera without covariance when initialize -Add VisualISAMDemo script, which calls global, and the gui --- matlab/examples/VisualISAMDemo.m | 2 + matlab/examples/VisualISAMExample.m | 178 ++----------------------- matlab/examples/VisualISAMInitialize.m | 1 + matlab/examples/VisualISAMPlot.m | 24 ++-- matlab/examples/VisualISAMStep.m | 3 - matlab/examples/VisualISAM_gui.fig | Bin 9609 -> 9614 bytes matlab/examples/VisualISAM_gui.m | 32 +++-- 7 files changed, 41 insertions(+), 199 deletions(-) create mode 100644 matlab/examples/VisualISAMDemo.m diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m new file mode 100644 index 000000000..a3a89404f --- /dev/null +++ b/matlab/examples/VisualISAMDemo.m @@ -0,0 +1,2 @@ +VisualISAMInitOptions +VisualISAM_gui \ No newline at end of file diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index 0e338340c..9bbe8b9f2 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -11,174 +11,14 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear - -%% Data Options -TRIANGLE = false; -NCAMERAS = 20; -SHOW_IMAGES = false; - -%% iSAM Options -HARD_CONSTRAINT = false; -POINT_PRIORS = false; -BATCH_INIT = true; -REORDER_INTERVAL=10; -ALWAYS_RELINEARIZE = false; - -%% Display Options -SAVE_GRAPH = false; -PRINT_STATS = true; -DRAW_INTERVAL = 20; -CAMERA_INTERVAL = 1; -DRAW_TRUE_POSES = false; -SAVE_FIGURES = false; -SAVE_GRAPHS = false; - -%% Generate simulated data -if TRIANGLE % Create a triangle target, just 3 points on a plane - nPoints = 3; - r = 10; - for j=1:nPoints - theta = (j-1)*2*pi/nPoints; - points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); +figure(1); +VisualISAMInitOptions +VisualISAMGenerateData +VisualISAMInitialize +VisualISAMPlot +for frame_i=2:NCAMERAS + VisualISAMStep + if mod(frame_i,DRAW_INTERVAL)==0 + VisualISAMPlot end -else % 3D landmarks as vertices of a cube - nPoints = 8; - points = {gtsamPoint3([10 10 10]'),... - gtsamPoint3([-10 10 10]'),... - gtsamPoint3([-10 -10 10]'),... - gtsamPoint3([10 -10 10]'),... - gtsamPoint3([10 10 -10]'),... - gtsamPoint3([-10 10 -10]'),... - gtsamPoint3([-10 -10 -10]'),... - gtsamPoint3([10 -10 -10]')}; -end - -%% Create camera cameras on a circle around the triangle -height = 10; r = 40; -K = gtsamCal3_S2(500,500,0,640/2,480/2); -for i=1:NCAMERAS - theta = (i-1)*2*pi/NCAMERAS; - t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); - if SHOW_IMAGES % show images - figure(2+i);clf;hold on - set(2+i,'NumberTitle','off','Name',sprintf('Camera %d',i)); - for j=1:nPoints - zij = cameras{i}.project(points{j}); - plot(zij.x,zij.y,'*'); - axis([1 640 1 480]); - end - end -end -odometry = cameras{1}.pose.between(cameras{2}.pose); - - -%% Set Noise parameters -poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); -measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); - -%% Initialize iSAM -isam = visualSLAMISAM(REORDER_INTERVAL); -newFactors = visualSLAMGraph; -initialEstimates = visualSLAMValues; -i1 = symbol('x',1); -camera1 = cameras{1}; -pose1 = camera1.pose; -if HARD_CONSTRAINT % add hard constraint - newFactors.addPoseConstraint(i1,pose1); -else - newFactors.addPosePrior(i1,pose1, poseNoise); -end -initialEstimates.insertPose(i1,pose1); -% Add visual measurement factors from first pose -for j=1:nPoints - jj = symbol('l',j); - if POINT_PRIORS % add point priors - newFactors.addPointPrior(jj, points{j}, pointNoise); - end - zij = camera1.project(points{j}); - newFactors.addMeasurement(zij, measurementNoise, i1, jj, K); - initialEstimates.insertPoint(jj, points{j}); -end - -%% Run iSAM Loop -figure(1);clf;hold on; -set(1,'NumberTitle','off','Name','iSAM timing'); -for i=2:NCAMERAS - - %% Add odometry - newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, odometryNoise); - - %% Add visual measurement factors - for j=1:nPoints - zij = cameras{i}.project(points{j}); - newFactors.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); - end - - %% Initial estimates for the new pose. Also initialize points while in the first frame. - %TODO: this might be suboptimal since "result" is not the fully optimized result - if (i==2), prevPose = cameras{1}.pose; - else, prevPose = result.pose(symbol('x',i-1)); end - initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); - - %% Update ISAM - if BATCH_INIT & (i==2) % Do a full optimize for first two poses - initialEstimates - fullyOptimized = newFactors.optimize(initialEstimates) - initialEstimates = fullyOptimized; - end - figure(1);tic; - isam.update(newFactors, initialEstimates); - t=toc; plot(i,t,'r.'); tic - result = isam.estimate(); - t=toc; plot(i,t,'g.'); - if ALWAYS_RELINEARIZE % re-linearize - isam.reorder_relinearize(); - end - - if SAVE_GRAPH - isam.saveGraph(sprintf('VisualiSAM.dot',i)); - end - if PRINT_STATS - isam.printStats(); - end - if mod(i,DRAW_INTERVAL)==0 - %% Plot results - tic - h=figure(2);clf - set(1,'NumberTitle','off','Name','Visual iSAM'); - hold on; - for j=1:size(points,2) - P = isam.marginalCovariance(symbol('l',j)); - point_j = result.point(symbol('l',j)); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); - end - for ii=1:CAMERA_INTERVAL:i - P = isam.marginalCovariance(symbol('x',ii)); - pose_ii = result.pose(symbol('x',ii)); - plotPose3(pose_ii,P,10); - if DRAW_TRUE_POSES % show ground truth - plotPose3(cameras{ii}.pose,0.001*eye(6),10); - end - end - axis([-40 40 -40 40 -10 20]);axis equal - view(3) - colormap('hot') - figure(2); - t=toc; - if DRAW_INTERVAL~=NCAMERAS, plot(i,t,'b.'); end - if SAVE_FIGURES - print(h,'-dpng',sprintf('VisualiSAM%03d.png',i)); - end - if SAVE_GRAPHS - isam.saveGraph(sprintf('VisualiSAM%03d.dot',i)); - end - end - - %% Reset newFactors and initialEstimates to prepare for the next update - newFactors = visualSLAMGraph; - initialEstimates = visualSLAMValues; end \ No newline at end of file diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index ae48f3531..c8f341096 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -25,4 +25,5 @@ for j=1:nPoints end frame_i = 1 +result = initialEstimates; cla; \ No newline at end of file diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index 549c3ac37..59d4014a3 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -1,26 +1,28 @@ VisualISAMGlobalVars -if (frame_i<2) - sprintf('Cannot plot the first frame') - return -end - %% Plot results tic % h=figure(2);clf % set(1,'NumberTitle','off','Name','Visual iSAM'); -cla; +h=gca; +cla(h); hold on; sprintf('Computing marginals and plotting. Please wait...') for j=1:size(points,2) - P = isam.marginalCovariance(symbol('l',j)); point_j = result.point(symbol('l',j)); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + if (frame_i>1) + P = isam.marginalCovariance(symbol('l',j)); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + end end for ii=1:CAMERA_INTERVAL:frame_i - P = isam.marginalCovariance(symbol('x',ii)); pose_ii = result.pose(symbol('x',ii)); + if (frame_i>1) + P = isam.marginalCovariance(symbol('x',ii)); + else + P = [] + end plotPose3(pose_ii,P,10); if DRAW_TRUE_POSES % show ground truth plotPose3(cameras{ii}.pose,0.001*eye(6),10); @@ -33,10 +35,12 @@ sprintf('Done!') % figure(2); t=toc; -if DRAW_INTERVAL~=NCAMERAS, plot(frame_i,t,'b.'); end +% if DRAW_INTERVAL~=NCAMERAS, plot(frame_i,t,'b.'); end if SAVE_FIGURES print(h,'-dpng',sprintf('VisualiSAM%03d.png',frame_i)); end if SAVE_GRAPHS isam.saveGraph(sprintf('VisualiSAM%03d.dot',frame_i)); end + +drawnow \ No newline at end of file diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index 7c86e3ce1..f5e1a96b6 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -37,9 +37,6 @@ end if PRINT_STATS isam.printStats(); end -if mod(frame_i,DRAW_INTERVAL)==0 - VisualISAMPlot -end %% Reset newFactors and initialEstimates to prepare for the next update newFactors = visualSLAMGraph; diff --git a/matlab/examples/VisualISAM_gui.fig b/matlab/examples/VisualISAM_gui.fig index e01fc121404c65aa02fc01446d26a9da945f4241..0597b776a14d7d85fb38bf043ab03dca6e68d91c 100644 GIT binary patch literal 9614 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 Date: Fri, 8 Jun 2012 23:28:22 +0000 Subject: [PATCH 292/914] Minor Improvements --- examples/UGM_chain.cpp | 2 +- examples/UGM_small.cpp | 24 +++++------ gtsam/discrete/Assignment.h | 42 ++++++++++++++++++- gtsam/discrete/DecisionTreeFactor.h | 9 +++- gtsam/discrete/DiscreteConditional.cpp | 33 +++++++-------- gtsam/discrete/Potentials.cpp | 3 +- gtsam/discrete/Potentials.h | 4 +- .../discrete/tests/testDiscreteMarginals.cpp | 4 +- 8 files changed, 81 insertions(+), 40 deletions(-) diff --git a/examples/UGM_chain.cpp b/examples/UGM_chain.cpp index e7f408cb0..56dbd4726 100644 --- a/examples/UGM_chain.cpp +++ b/examples/UGM_chain.cpp @@ -13,7 +13,7 @@ * @file small.cpp * @brief UGM (undirected graphical model) examples: chain * @author Frank Dellaert - * @author Abhijit + * @author Abhijit Kundu * * See http://www.di.ens.fr/~mschmidt/Software/UGM/chain.html * for more explanation. This code demos the same example using GTSAM. diff --git a/examples/UGM_small.cpp b/examples/UGM_small.cpp index 3c0e77e67..e9424d369 100644 --- a/examples/UGM_small.cpp +++ b/examples/UGM_small.cpp @@ -49,21 +49,17 @@ int main(int argc, char** argv) { // Print the UGM distribution cout << "\nUGM distribution:" << endl; - for (size_t a = 0; a < nrStates; a++) - for (size_t m = 0; m < nrStates; m++) - for (size_t h = 0; h < nrStates; h++) - for (size_t c = 0; c < nrStates; c++) { - DiscreteFactor::Values values; - values[1] = c; - values[2] = h; - values[3] = m; - values[4] = a; - double prodPot = graph(values); - cout << c << " " << h << " " << m << " " << a << " :\t" - << prodPot << "\t" << prodPot/3790 << endl; - } + vector allPosbValues = cartesianProduct( + Cathy & Heather & Mark & Allison); + for (size_t i = 0; i < allPosbValues.size(); ++i) { + DiscreteFactor::Values values = allPosbValues[i]; + double prodPot = graph(values); + cout << values[Cathy.first] << " " << values[Heather.first] << " " + << values[Mark.first] << " " << values[Allison.first] << " :\t" + << prodPot << "\t" << prodPot / 3790 << endl; + } - // "Decoding", i.e., configuration with largest value + // "Decoding", i.e., configuration with largest value (MPE) // We use sequential variable elimination DiscreteSequentialSolver solver(graph); DiscreteFactor::sharedValues optimalDecoding = solver.optimize(); diff --git a/gtsam/discrete/Assignment.h b/gtsam/discrete/Assignment.h index 2e84485dd..f6decc359 100644 --- a/gtsam/discrete/Assignment.h +++ b/gtsam/discrete/Assignment.h @@ -20,8 +20,10 @@ #include #include +#include #include + namespace gtsam { /** @@ -42,6 +44,44 @@ namespace gtsam { bool equals(const Assignment& other, double tol = 1e-9) const { return (*this == other); } - }; //Assignment + }; //Assignment + + + /** + * @brief Get Cartesian product consisting all possible configurations + * @param vector list of keys (label,cardinality) pairs. + * @return vector list of all possible value assignments + * + * This function returns a vector of Assignment values for all possible + * (Cartesian product) configurations of set of Keys which are nothing + * but (Label,cardinality) pairs. This function should NOT be called for + * more than a small number of variables and cardinalities. E.g. For 6 + * variables with each having cardinalities 4, we get 4096 possible + * configurations!! + */ + template + std::vector > cartesianProduct( + const std::vector >& keys) { + std::vector > allPossValues; + Assignment values; + typedef std::pair DiscreteKey; + BOOST_FOREACH(const DiscreteKey& key, keys) + values[key.first] = 0; //Initialize from 0 + while (1) { + allPossValues.push_back(values); + size_t j = 0; + for (j = 0; j < keys.size(); j++) { + L idx = keys[j].first; + values[idx]++; + if (values[idx] < keys[j].second) + break; + //Wrap condition + values[idx] = 0; + } + if (j == keys.size()) + break; + } + return allPossValues; + } } // namespace gtsam diff --git a/gtsam/discrete/DecisionTreeFactor.h b/gtsam/discrete/DecisionTreeFactor.h index a29a5683a..27c31fbb9 100644 --- a/gtsam/discrete/DecisionTreeFactor.h +++ b/gtsam/discrete/DecisionTreeFactor.h @@ -127,9 +127,16 @@ namespace gtsam { */ shared_ptr combine(size_t nrFrontals, ADT::Binary op) const; + /** + * @brief Permutes the keys in Potentials and DiscreteFactor + * + * This re-implements the permuteWithInverse() in both Potentials + * and DiscreteFactor by doing both of them together. + */ + void permuteWithInverse(const Permutation& inversePermutation){ DiscreteFactor::permuteWithInverse(inversePermutation); - Potentials::permute(inversePermutation); + Potentials::permuteWithInverse(inversePermutation); } /// @} diff --git a/gtsam/discrete/DiscreteConditional.cpp b/gtsam/discrete/DiscreteConditional.cpp index 34cf016ec..029873d2c 100644 --- a/gtsam/discrete/DiscreteConditional.cpp +++ b/gtsam/discrete/DiscreteConditional.cpp @@ -75,41 +75,38 @@ namespace gtsam { /* ******************************************************************************** */ void DiscreteConditional::solveInPlace(Values& values) const { +// OLD // assert(nrFrontals() == 1); // Index j = (firstFrontalKey()); // size_t mpe = solve(values); // Solve for variable // values[j] = mpe; // store result in partial solution +// OLD // TODO: is this really the fastest way? I think it is. + + //The following is to make make adjustment for nFrontals \neq 1 ADT pFS = choose(values); // P(F|S=parentsValues) // Initialize Values mpe; - Values frontalVals; - BOOST_FOREACH(Index j, frontals()) { - frontalVals[j] = 0; - } double maxP = 0; - while (1) { + DiscreteKeys keys; + BOOST_FOREACH(Index idx, frontals()) { + DiscreteKey dk(idx,cardinality(idx)); + keys & dk; + } + // Get all Possible Configurations + vector allPosbValues = cartesianProduct(keys); + + // Find the MPE + BOOST_FOREACH(Values& frontalVals, allPosbValues) { double pValueS = pFS(frontalVals); // P(F=value|S=parentsValues) // Update MPE solution if better if (pValueS > maxP) { maxP = pValueS; mpe = frontalVals; } - - size_t j = 0; - for (j = 0; j < nrFrontals(); j++) { - Index idx = frontals()[j]; - frontalVals[idx]++; - if (frontalVals[idx] < cardinality(idx)) - break; - //Wrap condition - frontalVals[idx] = 0; - } - if (j == nrFrontals()) - break; } //set values (inPlace) to mpe @@ -197,7 +194,7 @@ namespace gtsam { /* ******************************************************************************** */ void DiscreteConditional::permuteWithInverse(const Permutation& inversePermutation){ IndexConditional::permuteWithInverse(inversePermutation); - Potentials::permute(inversePermutation); + Potentials::permuteWithInverse(inversePermutation); } diff --git a/gtsam/discrete/Potentials.cpp b/gtsam/discrete/Potentials.cpp index e6f07ccac..b9a87dea9 100644 --- a/gtsam/discrete/Potentials.cpp +++ b/gtsam/discrete/Potentials.cpp @@ -60,7 +60,7 @@ namespace gtsam { } /* ************************************************************************* */ - void Potentials::permute(const Permutation& permutation) { + void Potentials::permuteWithInverse(const Permutation& permutation) { // Permute the _cardinalities (TODO: Inefficient Consider Improving) DiscreteKeys keys; map ordering; @@ -72,7 +72,6 @@ namespace gtsam { // Perform Permutation BOOST_FOREACH(DiscreteKey& key, keys) { ordering[key.first] = permutation[key.first]; - //cout << key.first << " -> " << ordering[key.first] << endl; key.first = ordering[key.first]; } diff --git a/gtsam/discrete/Potentials.h b/gtsam/discrete/Potentials.h index fe22288f4..367a323c2 100644 --- a/gtsam/discrete/Potentials.h +++ b/gtsam/discrete/Potentials.h @@ -73,8 +73,10 @@ namespace gtsam { * @brief Permutes the keys in Potentials * * This permutes the Indices and performs necessary re-ordering of ADD. + * This is virtual so that derived types e.g. DecisionTreeFactor can + * re-implement it. */ - void permute(const Permutation& perm); + virtual void permuteWithInverse(const Permutation& inversePermutation); }; // Potentials diff --git a/gtsam/discrete/tests/testDiscreteMarginals.cpp b/gtsam/discrete/tests/testDiscreteMarginals.cpp index ad35e131e..7f2b7b1b1 100644 --- a/gtsam/discrete/tests/testDiscreteMarginals.cpp +++ b/gtsam/discrete/tests/testDiscreteMarginals.cpp @@ -10,8 +10,8 @@ * -------------------------------------------------------------------------- */ /* - * @ file testDiscreteMarginals.cpp - * @date Feb 14, 2011 + * @file testDiscreteMarginals.cpp + * @date Jun 7, 2012 * @author Abhijit Kundu * @author Richard Roberts * @author Frank Dellaert From 734a18b02e09ad4988953959f560c7ab3cadc4f6 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sat, 9 Jun 2012 02:42:45 +0000 Subject: [PATCH 293/914] old spcg solver fixed --- examples/Pose2SLAMwSPCG.cpp | 26 +++++++++-- gtsam/linear/ConjugateGradientSolver.h | 10 ++--- gtsam/linear/Errors.cpp | 10 +++++ gtsam/linear/Errors.h | 2 + gtsam/linear/GaussianBayesNet.cpp | 18 ++++++++ gtsam/linear/GaussianBayesNet.h | 6 +++ gtsam/linear/IterativeSolver.h | 7 ++- gtsam/linear/SimpleSPCGSolver.cpp | 8 +--- gtsam/linear/SimpleSPCGSolver.h | 7 ++- gtsam/linear/SubgraphPreconditioner.cpp | 44 ++++++------------- gtsam/linear/SubgraphPreconditioner.h | 7 ++- gtsam/linear/SubgraphSolver.cpp | 4 +- gtsam/linear/SubgraphSolver.h | 12 +++-- .../nonlinear/LevenbergMarquardtOptimizer.cpp | 20 +++++---- gtsam_unstable/linear/iterative-inl.h | 7 +-- gtsam_unstable/linear/iterative.h | 1 + 16 files changed, 113 insertions(+), 76 deletions(-) diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index 984701734..ddf0a7ad0 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -16,6 +16,8 @@ * @date June 2, 2012 */ +#include +#include #include #include @@ -61,10 +63,26 @@ int main(void) { cout << "initial error = " << graph.error(initialEstimate) << endl ; // 4. Single Step Optimization using Levenberg-Marquardt - // Note: Although there are many options in IterativeOptimizationParameters, - Values result = graph.optimizeSPCG(initialEstimate); - result.print("\nFinal result:\n"); - cout << "final error = " << graph.error(result) << endl; + LevenbergMarquardtParams param; + param.verbosity = NonlinearOptimizerParams::ERROR; + param.verbosityLM = LevenbergMarquardtParams::LAMBDA; + param.linearSolverType = SuccessiveLinearizationParams::CG; + + { + param.iterativeParams = boost::make_shared(); + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, param); + Values result = optimizer.optimize(); + result.print("\nFinal result:\n"); + cout << "simple spcg solver final error = " << graph.error(result) << endl; + } + + { + param.iterativeParams = boost::make_shared(); + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, param); + Values result = optimizer.optimize(); + result.print("\nFinal result:\n"); + cout << "subgraph solver final error = " << graph.error(result) << endl; + } return 0 ; } diff --git a/gtsam/linear/ConjugateGradientSolver.h b/gtsam/linear/ConjugateGradientSolver.h index 2cfd1279f..f7f1ad5dc 100644 --- a/gtsam/linear/ConjugateGradientSolver.h +++ b/gtsam/linear/ConjugateGradientSolver.h @@ -36,16 +36,14 @@ struct ConjugateGradientParameters : public IterativeOptimizationParameters { SBM_MT ///< Sparse Block Matrix Multithreaded } blas_kernel_; - enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; /* Verbosity */ - ConjugateGradientParameters() : minIterations_(1), maxIterations_(500), reset_(501), epsilon_rel_(1e-3), epsilon_abs_(1e-3), - blas_kernel_(GTSAM), verbosity_(SILENT) {} + blas_kernel_(GTSAM) {} ConjugateGradientParameters(size_t minIterations, size_t maxIterations, size_t reset, - double epsilon_rel, double epsilon_abs, BLASKernel blas = GTSAM, Verbosity verbosity = SILENT) + double epsilon_rel, double epsilon_abs, BLASKernel blas = GTSAM) : minIterations_(minIterations), maxIterations_(maxIterations), reset_(reset), - epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs), blas_kernel_(blas), verbosity_(verbosity) {} + epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs), blas_kernel_(blas) {} /* general interface */ inline size_t minIterations() const { return minIterations_; } @@ -55,7 +53,6 @@ struct ConjugateGradientParameters : public IterativeOptimizationParameters { inline double epsilon_rel() const { return epsilon_rel_; } inline double epsilon_abs() const { return epsilon_abs_; } inline BLASKernel blas_kernel() const { return blas_kernel_; } - inline Verbosity verbosity() const { return verbosity_; } void print() const { const std::string blasStr[3] = {"gtsam", "sbm", "sbm-mt"}; @@ -67,7 +64,6 @@ struct ConjugateGradientParameters : public IterativeOptimizationParameters { << ", resetIter = " << reset_ << ", eps_rel = " << epsilon_rel_ << ", eps_abs = " << epsilon_abs_ - << ", verbosity = " << verbosity_ << std::endl; } }; diff --git a/gtsam/linear/Errors.cpp b/gtsam/linear/Errors.cpp index d3007350f..65a52cce1 100644 --- a/gtsam/linear/Errors.cpp +++ b/gtsam/linear/Errors.cpp @@ -86,6 +86,16 @@ Errors Errors::operator-(const Errors& b) const { return result; } +/* ************************************************************************* */ +Errors Errors::operator-() const { + Errors result; + BOOST_FOREACH(const Vector& ai, *this) + result.push_back(-ai); + return result; +} + + + /* ************************************************************************* */ double dot(const Errors& a, const Errors& b) { #ifndef NDEBUG diff --git a/gtsam/linear/Errors.h b/gtsam/linear/Errors.h index b51bf606d..8e39e40ff 100644 --- a/gtsam/linear/Errors.h +++ b/gtsam/linear/Errors.h @@ -45,6 +45,8 @@ namespace gtsam { /** subtraction */ Errors operator-(const Errors& b) const; + /** negation */ + Errors operator-() const ; }; // Errors diff --git a/gtsam/linear/GaussianBayesNet.cpp b/gtsam/linear/GaussianBayesNet.cpp index 056bda67e..62b63bb27 100644 --- a/gtsam/linear/GaussianBayesNet.cpp +++ b/gtsam/linear/GaussianBayesNet.cpp @@ -99,6 +99,24 @@ void optimizeInPlace(const GaussianBayesNet& bn, VectorValues& x) { } } +/* ************************************************************************* */ +VectorValues backSubstitute(const GaussianBayesNet& bn, const VectorValues& input) { + VectorValues output = input; + BOOST_REVERSE_FOREACH(const boost::shared_ptr cg, bn) { + const Index key = *(cg->beginFrontals()); + Vector xS = internal::extractVectorValuesSlices(output, cg->beginParents(), cg->endParents()); + xS = input[key] - cg->get_S() * xS; + output[key] = cg->get_R().triangularView().solve(xS); + } + + BOOST_FOREACH(const boost::shared_ptr cg, bn) { + cg->scaleFrontalsBySigma(output); + } + + return output; +} + + /* ************************************************************************* */ // gy=inv(L)*gx by solving L*gy=gx. // gy=inv(R'*inv(Sigma))*gx diff --git a/gtsam/linear/GaussianBayesNet.h b/gtsam/linear/GaussianBayesNet.h index 8c6e72357..fb179da92 100644 --- a/gtsam/linear/GaussianBayesNet.h +++ b/gtsam/linear/GaussianBayesNet.h @@ -106,6 +106,12 @@ namespace gtsam { * */ void optimizeGradientSearchInPlace(const GaussianBayesNet& bn, VectorValues& grad); + /** + * Backsubstitute + * gy=inv(R*inv(Sigma))*gx + */ + VectorValues backSubstitute(const GaussianBayesNet& bn, const VectorValues& gx); + /** * Transpose Backsubstitute * gy=inv(L)*gx by solving L*gy=gx. diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index de1c564ef..fb19e6d58 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -23,8 +23,7 @@ namespace gtsam { public: typedef boost::shared_ptr shared_ptr; - - enum Kernel { PCG = 0, LSPCG = 1 } kernel_ ; ///< Iterative Method Kernel + enum Kernel { CG = 0 } kernel_ ; ///< Iterative Method Kernel enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; ///< Verbosity public: @@ -32,7 +31,7 @@ namespace gtsam { IterativeOptimizationParameters(const IterativeOptimizationParameters &p) : kernel_(p.kernel_), verbosity_(p.verbosity_) {} - IterativeOptimizationParameters(Kernel kernel = LSPCG, Verbosity verbosity = SILENT) + IterativeOptimizationParameters(Kernel kernel = CG, Verbosity verbosity = SILENT) : kernel_(kernel), verbosity_(verbosity) {} virtual ~IterativeOptimizationParameters() {} @@ -42,7 +41,7 @@ namespace gtsam { inline Verbosity verbosity() const { return verbosity_; } void print() const { - const std::string kernelStr[2] = {"pcg", "lspcg"}; + const std::string kernelStr[1] = {"cg"}; std::cout << "IterativeOptimizationParameters: " << "kernel = " << kernelStr[kernel_] << ", verbosity = " << verbosity_ << std::endl; diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index 03401cc7f..addbc74dd 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -96,9 +96,7 @@ VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial double gamma = s.vector().squaredNorm(), new_gamma = 0.0, alpha = 0.0, beta = 0.0 ; - const double threshold = - std::max(parameters_.epsilon_abs(), - parameters_.epsilon() * parameters_.epsilon() * gamma); + const double threshold = std::max(parameters_.epsilon_abs(), parameters_.epsilon() * parameters_.epsilon() * gamma); const size_t iMaxIterations = parameters_.maxIterations(); const Parameters::Verbosity verbosity = parameters_.verbosity(); @@ -217,10 +215,6 @@ SimpleSPCGSolver::splitGraph(const GaussianFactorGraph &gfg) { else Ac->push_back(boost::dynamic_pointer_cast(gf)); } -// gfg.print("gfg"); -// At->print("At"); -// Ac->print("Ac"); - return boost::tie(At, Ac); } diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h index 406232d3c..097022c22 100644 --- a/gtsam/linear/SimpleSPCGSolver.h +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -19,6 +19,11 @@ namespace gtsam { +struct SimpleSPCGSolverParameters : public ConjugateGradientParameters { + typedef ConjugateGradientParameters Base; + SimpleSPCGSolverParameters() : Base() {} +}; + /** * This class gives a simple implementation to the SPCG solver presented in Dellaert et al in IROS'10. * @@ -40,7 +45,7 @@ class SimpleSPCGSolver : public IterativeSolver { public: typedef IterativeSolver Base; - typedef ConjugateGradientParameters Parameters; + typedef SimpleSPCGSolverParameters Parameters; typedef boost::shared_ptr shared_ptr; protected: diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp index 59a72dd8b..91a98a263 100644 --- a/gtsam/linear/SubgraphPreconditioner.cpp +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -28,27 +28,17 @@ namespace gtsam { /* ************************************************************************* */ SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar) : - Ab1_(Ab1), Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(gaussianErrors_(*Ab2_,*xbar)) { + Ab1_(Ab1), Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(new Errors(-gaussianErrors(*Ab2_,*xbar))) { } /* ************************************************************************* */ // x = xbar + inv(R1)*y VectorValues SubgraphPreconditioner::x(const VectorValues& y) const { - VectorValues x = y; - optimizeInPlace(*Rc1_,x); - x += *xbar_; - return x; + return *xbar_ + gtsam::backSubstitute(*Rc1_, y); } -// SubgraphPreconditioner SubgraphPreconditioner::add_priors(double sigma) const { -// SubgraphPreconditioner result = *this ; -// result.Ab2_ = sharedFG(new GaussianFactorGraph(Ab2_->add_priors(sigma))) ; -// return result ; -// } - /* ************************************************************************* */ double error(const SubgraphPreconditioner& sp, const VectorValues& y) { - Errors e(y); VectorValues x = sp.x(y); Errors e2 = gaussianErrors(*sp.Ab2(),x); @@ -58,12 +48,11 @@ namespace gtsam { /* ************************************************************************* */ // gradient is y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar), VectorValues gradient(const SubgraphPreconditioner& sp, const VectorValues& y) { - VectorValues x = sp.x(y); // x = inv(R1)*y - Errors e2 = gaussianErrors(*sp.Ab2(),x); - VectorValues gx2 = VectorValues::Zero(y); - gtsam::transposeMultiplyAdd(*sp.Ab2(),1.0,e2,gx2); // A2'*e2; - VectorValues gy2 = gtsam::backSubstituteTranspose(*sp.Rc1(), gx2); // inv(R1')*gx2 - return y + gy2; + VectorValues x = gtsam::backSubstitute(*sp.Rc1(), y); /* inv(R1)*y */ + Errors e = (*sp.Ab2()*x - *sp.b2bar()); /* (A2*inv(R1)*y-b2bar) */ + VectorValues v = VectorValues::Zero(x); + transposeMultiplyAdd(*sp.Ab2(), 1.0, e, v); /* A2'*(A2*inv(R1)*y-b2bar) */ + return y + gtsam::backSubstituteTranspose(*sp.Rc1(), v); } /* ************************************************************************* */ @@ -71,13 +60,9 @@ namespace gtsam { Errors operator*(const SubgraphPreconditioner& sp, const VectorValues& y) { Errors e(y); - - // Add A2 contribution - VectorValues x = y; // TODO avoid ? - gtsam::optimizeInPlace(*sp.Rc1(), x); // x=inv(R1)*y - Errors e2 = *sp.Ab2() * x; // A2*x + VectorValues x = gtsam::backSubstitute(*sp.Rc1(), y); /* x=inv(R1)*y */ + Errors e2 = *sp.Ab2() * x; /* A2*x */ e.splice(e.end(), e2); - return e; } @@ -85,16 +70,14 @@ namespace gtsam { // In-place version that overwrites e void multiplyInPlace(const SubgraphPreconditioner& sp, const VectorValues& y, Errors& e) { - Errors::iterator ei = e.begin(); for ( Index i = 0 ; i < y.size() ; ++i, ++ei ) { *ei = y[i]; } // Add A2 contribution - VectorValues x = y; // TODO avoid ? - gtsam::optimizeInPlace(*sp.Rc1(), x); // x=inv(R1)*y - gtsam::multiplyInPlace(*sp.Ab2(),x,ei); // use iterator version + VectorValues x = gtsam::backSubstitute(*sp.Rc1(), y); // x=inv(R1)*y + gtsam::multiplyInPlace(*sp.Ab2(), x, ei); // use iterator version } /* ************************************************************************* */ @@ -114,13 +97,12 @@ namespace gtsam { void transposeMultiplyAdd (const SubgraphPreconditioner& sp, double alpha, const Errors& e, VectorValues& y) { - Errors::const_iterator it = e.begin(); for ( Index i = 0 ; i < y.size() ; ++i, ++it ) { const Vector& ei = *it; - axpy(alpha,ei,y[i]); + axpy(alpha, ei, y[i]); } - sp.transposeMultiplyAdd2(alpha,it,e.end(),y); + sp.transposeMultiplyAdd2(alpha, it, e.end(), y); } /* ************************************************************************* */ diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h index 460f28e5a..7b59735d9 100644 --- a/gtsam/linear/SubgraphPreconditioner.h +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -42,8 +42,8 @@ namespace gtsam { private: sharedFG Ab1_, Ab2_; sharedBayesNet Rc1_; - sharedValues xbar_; - sharedErrors b2bar_; /** b2 - A2*xbar */ + sharedValues xbar_; ///< A1 \ b1 + sharedErrors b2bar_; ///< A2*xbar - b2 public: @@ -66,6 +66,9 @@ namespace gtsam { /** Access Rc1 */ const sharedBayesNet& Rc1() const { return Rc1_; } + /** Access b2bar */ + const sharedErrors b2bar() const { return b2bar_; } + /** * Add zero-mean i.i.d. Gaussian prior terms to each variable * @param sigma Standard deviation of Gaussian diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 5d6237d9c..c91365f19 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -61,9 +61,7 @@ SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters VectorValues::shared_ptr SubgraphSolver::optimize() { - // preconditioned conjugate gradient - VectorValues zeros = pc_->zero(); - VectorValues ybar = conjugateGradients (*pc_, zeros, parameters_); + VectorValues ybar = conjugateGradients(*pc_, pc_->zero(), parameters_); boost::shared_ptr xbar = boost::make_shared() ; *xbar = pc_->x(ybar); diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index 111f85cad..ec9a5f19a 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -19,6 +19,11 @@ namespace gtsam { +struct SubgraphSolverParameters : public ConjugateGradientParameters { + typedef ConjugateGradientParameters Base; + SubgraphSolverParameters() : Base() {} +}; + /** * A linear system solver using subgraph preconditioning conjugate gradient */ @@ -27,18 +32,17 @@ class SubgraphSolver : public IterativeSolver { public: - typedef ConjugateGradientParameters Parameters; + typedef SubgraphSolverParameters Parameters; + +protected: Parameters parameters_; - SubgraphPreconditioner::shared_ptr pc_; ///< preconditioner object public: SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); - virtual ~SubgraphSolver() {} - virtual VectorValues::shared_ptr optimize () ; protected: diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 8fbedc614..ddebdb498 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -76,15 +76,19 @@ void LevenbergMarquardtOptimizer::iterate() { } else if ( params_.isCG() ) { - ConjugateGradientParameters::shared_ptr params (!params_.iterativeParams ? - boost::make_shared() : - boost::dynamic_pointer_cast(params_.iterativeParams)); + if ( !params_.iterativeParams ) throw runtime_error("LMSolver: cg parameter has to be assigned ..."); - if ( !params ) throw runtime_error("LMSolver: spcg parameter dynamic casting failed"); - - SimpleSPCGSolver solver(dampedSystem, *params); - //SubgraphSolver solver(dampedSystem, *params); - delta = *solver.optimize(); + if ( boost::dynamic_pointer_cast(params_.iterativeParams)) { + SimpleSPCGSolver solver (dampedSystem, *boost::dynamic_pointer_cast(params_.iterativeParams)); + delta = *solver.optimize(); + } + else if ( boost::dynamic_pointer_cast(params_.iterativeParams) ) { + SubgraphSolver solver (dampedSystem, *boost::dynamic_pointer_cast(params_.iterativeParams)); + delta = *solver.optimize(); + } + else { + throw runtime_error("LMSolver: special cg parameter type is not handled in LM solver ..."); + } } else { throw runtime_error("Optimization parameter is invalid: LevenbergMarquardtParams::elimination"); diff --git a/gtsam_unstable/linear/iterative-inl.h b/gtsam_unstable/linear/iterative-inl.h index 5641cb7ae..f384b7504 100644 --- a/gtsam_unstable/linear/iterative-inl.h +++ b/gtsam_unstable/linear/iterative-inl.h @@ -118,13 +118,10 @@ namespace gtsam { // conjugate gradient method. // S: linear system, V: step vector, E: errors template - V conjugateGradients( - const S& Ab, - V x, - const ConjugateGradientParameters ¶meters, - bool steepest = false) { + V conjugateGradients(const S& Ab, V x, const ConjugateGradientParameters ¶meters, bool steepest = false) { CGState state(Ab, x, parameters, steepest); + if (parameters.verbosity() != ConjugateGradientParameters::SILENT) std::cout << "CG: epsilon = " << parameters.epsilon() << ", maxIterations = " << parameters.maxIterations() diff --git a/gtsam_unstable/linear/iterative.h b/gtsam_unstable/linear/iterative.h index f578391d0..6765ac22a 100644 --- a/gtsam_unstable/linear/iterative.h +++ b/gtsam_unstable/linear/iterative.h @@ -44,6 +44,7 @@ namespace gtsam { * Needed to run Conjugate Gradients on matrices * */ class System { + private: const Matrix& A_; const Vector& b_; From 6c18af309e3d02fe55c257e5f36c32491b7c1719 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Sat, 9 Jun 2012 04:01:37 +0000 Subject: [PATCH 294/914] VisualISAMExample in MATLAB with all options enabled. --- matlab/examples/VisualISAMExample.m | 30 ++- matlab/examples/VisualISAMGenerateData.m | 1 - matlab/examples/VisualISAMInitOptions.m | 22 --- matlab/examples/VisualISAMPlot.m | 8 +- matlab/examples/VisualISAM_gui.fig | Bin 9614 -> 9781 bytes matlab/examples/VisualISAM_gui.m | 224 +++++++++++------------ 6 files changed, 141 insertions(+), 144 deletions(-) delete mode 100644 matlab/examples/VisualISAMInitOptions.m diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index 9bbe8b9f2..633c20cb5 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -11,11 +11,37 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear -figure(1); -VisualISAMInitOptions +%% Global variables used in VisualISAMExample +VisualISAMGlobalVars + +%% Setting data options +TRIANGLE = true; +NCAMERAS = 20; +SHOW_IMAGES = false; + +%% iSAM Options +HARD_CONSTRAINT = false; +POINT_PRIORS = false; +BATCH_INIT = true; +REORDER_INTERVAL = 10; +ALWAYS_RELINEARIZE = false; + +%% Display Options +SAVE_GRAPH = false; +PRINT_STATS = true; +DRAW_INTERVAL = 4; +CAMERA_INTERVAL = 1; +DRAW_TRUE_POSES = false; +SAVE_FIGURES = false; +SAVE_GRAPHS = false; + +%% Generate data and initialize iSAM with the first pose and points VisualISAMGenerateData VisualISAMInitialize +figure; VisualISAMPlot + +%% Main loop for iSAM: stepping through all poses for frame_i=2:NCAMERAS VisualISAMStep if mod(frame_i,DRAW_INTERVAL)==0 diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m index 7ab135168..fd87c5434 100644 --- a/matlab/examples/VisualISAMGenerateData.m +++ b/matlab/examples/VisualISAMGenerateData.m @@ -1,5 +1,4 @@ VisualISAMGlobalVars -sprintf('vData...') %% Generate simulated data points = {}; diff --git a/matlab/examples/VisualISAMInitOptions.m b/matlab/examples/VisualISAMInitOptions.m deleted file mode 100644 index a9ef09bb5..000000000 --- a/matlab/examples/VisualISAMInitOptions.m +++ /dev/null @@ -1,22 +0,0 @@ -VisualISAMGlobalVars - -%% Data Options -TRIANGLE = true; -NCAMERAS = 20; -SHOW_IMAGES = false; - -%% iSAM Options -HARD_CONSTRAINT = false; -POINT_PRIORS = false; -BATCH_INIT = true; -REORDER_INTERVAL=10; -ALWAYS_RELINEARIZE = false; - -%% Display Options -SAVE_GRAPH = false; -PRINT_STATS = true; -DRAW_INTERVAL = 4; -CAMERA_INTERVAL = 1; -DRAW_TRUE_POSES = false; -SAVE_FIGURES = false; -SAVE_GRAPHS = false; \ No newline at end of file diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index 59d4014a3..d7f5c55b0 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -37,9 +37,13 @@ sprintf('Done!') t=toc; % if DRAW_INTERVAL~=NCAMERAS, plot(frame_i,t,'b.'); end if SAVE_FIGURES - print(h,'-dpng',sprintf('VisualiSAM%03d.png',frame_i)); + fig2 = figure('visible','off'); + newax = copyobj(h,fig2); + colormap(fig2,'hot'); + set(newax, 'units', 'normalized', 'position', [0.13 0.11 0.775 0.815]); + print(fig2,'-dpng',sprintf('VisualiSAM%03d.png',frame_i)); end -if SAVE_GRAPHS +if SAVE_GRAPHS && (frame_i>1) isam.saveGraph(sprintf('VisualiSAM%03d.dot',frame_i)); end diff --git a/matlab/examples/VisualISAM_gui.fig b/matlab/examples/VisualISAM_gui.fig index 0597b776a14d7d85fb38bf043ab03dca6e68d91c..07d1b793d90768cdf86718f3c85800a930e7b52a 100644 GIT binary patch delta 9326 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 delta 9158 zcmXwdcQD*h+cwcsbb{!;M2qNkkwg~~L3BZs=-n#&ixNxp7Tt;x2}1O~OZ2)#kFxq= zv3gy+d7kI{&L3yanRDizYv!JNu2QEHubrqwCMGQ>At@&=!T$7#*wds}TuIi%z&ID) z{}#TcF2%o-_P={T&dwuUcV@|n*&@v?^)B^KkGb{nIU3u)m9P^Itd%W1Bom(H)_q*G zlzT8@dJwN(&o{g=@!<9Cy(of}h{lhBJ7OB_hEdOyzn7YR4^(09$gA>qXic#L{h`o@ zt%Y1Ip3fqYtcZk1BzP`Bn+%~EkJ4i^d~T2DC`t{nZPn~60I-eKCWI~6uA^U z;#7RjLd>cel{iKz7D`3p#zK?uRoM$1WlpL&Z);xf|6V*Wc5PFvv?|O&(xMa6rC);E zRKn=*$8HE_w1zVC0BG=N8p}{KZ2Y+F&_T96ESz@ewW(ce@H#aVx&n)$sjQ?&q-58xq1mQu!F@lPFec7n=UR>*6lecD!vW}38md* z`Mv5e#1xPtY8zl+i;TVirRAthfipaP@^G)TEyqN-i|#LwnPC-zKGI5g)+Yx!mp7bW z6@9Zx-o<%=-EM5Y-_a+(yJkZ~y;E1HFL`q^w%8+$K46-)+liJQ3seL@&QAzuoDBI9 z`{&WA&)s24mBj3TtoLEgo6S)T1)FMQDSq>=LKy&IBQuGTiYj!gwcjF5i5nZ7rtkku zNpEe!M$m%>{1_G`aKbkl-N6nX3zF9GfZ_?NA~83-p=}l-A?V z1f+pKCCr-!dv@{Wq7ckG6to`RLw{qnj<+e|mQ}Y?y4kV%O>O!Jw9~ko?=5LRT)DZX zq!`41X!fZM1Nlar;$KN&ipHEMzKOTZzg%>CjcV~Lk_MfIeY+)=J!#8P%~JUK2lF%o zocLZ?{}HcGDzUHUKIf5sHV{u-kSsi8kq@L6dbKAxRvF2Ym|^TJw(QnvH|0JDEO}sj zLwZruN*>4jn!yUUPGN=M5|o_votB@t6F1L8C{0YI??Zq89Hhpm+g?X4E0HD{84vty zO3BMs_7cE94I?p93h5m{`In5PJdL6AeJX=81`n+Zl~HEtBLZPd7wMhSXjYiF4$<$ill8Jh_~|f z%*$f(XRvH6_GiNEAYTXeJGUJ>g5bk}Y>U!j_O+hVWy-QSf+mPK8^mR+3mfC#|7#o) z55xD)fD%fHqvAFc*=9q~nM1%kTlchN3jwp7=jl#qrKSp3op0i$W5DTDrx;g%Vy)C= z*M6v7mNh6b`YRs2$H&J7nVHWHL~QjY3|fi$>`e14+~ZS-W8Nrd8&j31y<*Zwt-kF` z)BvwP^c|Y7_4{+`$t$m3NsKlZ-xPYLpD*>(n!G=Dab@^*M#=Ix$A5hCpxZ#U(+n5Yw=;%T3KkryB4!O>6UoW5O&bZs5+k6 znyNs2>48w~f{9F%!DWm7<>8I}Z{7h}md`_DbB~pVshK0E+*VFZHm8ytU{J^&k)B91 zO3qBfGv9Jv<#4QXA7l@}0en2X+uI#uJv|x~T3CH*6iGqkb8=Q4g=`P8&FC+5E?f+% zU%!iqb?#yOR($Liat#OjW0GpvI zxa%}3)oFbfqJ_oL-Bz4%KdKz!uC~f$sbVYUPAoQ}e8Bo`-yZlGFyNrD`7TRXB%Tlv z)tE+mlhbVsA=osd?CRi~aP?CK5f#D;f}1PA=wZ+U6h1GzjM>72dl38uSfc;mvk?yO zMV6m-Ka5}Xx)$wg8O^`o+WQl(XNJPER0=8W8L@s{)d91oS~euTH?b-vtc)ORMJkM3 zncrR1hQa*c-2lzuHBD%zX11C-O{0YaN$@ZXpt~LwOCd~MG&NZmDX6k+EfoNB2 zL3hoxt%<#l*;T2lit-a4k|m=@t9Ks!HVFdHV5zbyP-cIPcZmbq=Xo*TLyUbttOd!u zM@ZLI{{7Zzk{hAaef?$AKv@lO`$q=d8iUTQrLZ`@_y!EQl(aeYAF1b{Tdm-8KlpE; z7h6;PVW(CD6pQblNANpga_%u%b&oiUE>U?q=Nwvp?AEK=l02h5>(M6v*~B`7tss(# z(A^8`ca;{l%g{~((+UYuDccG+DbCKYQdSDuly?w#v3u&2r3RGqRXRI{KhbcZ{zF@@ zZayaYOBY}ci1-@edXUI4H`QK$a^q+tOhviD)1>Qbcuc@x&QMp!q2FM|C2w-2u_*aA z7h#JT`95xn_f~mFu#A9+$t>2vz zMeUH68K#Zsv23R^KW~^2dFxdcFxDhfpMzM!o^ z(?Dm*1mARL6YI!{$4JXS;CZdL?yS{hXWCa*rJ)m#3h1i}Xxe(9%zwVXgB5X1{~eaM zdhSdwXxZFzqKrOZj5IWPDAOplIEj+IoMgM>Q>bGy)I5__i6mDSsub-MYIa8I8&^iT zdRc?kY}q|G`IhkfpTqH}HJFpE?E(L(7Ww+wlOBAn>!Qh>pv5zX#i3R(NE8pxl1h(? zP@?iYEP!r;|3^^(&8v83Jdv0)G9IQ9D~(P1_Br;^7M5`{jj@*eHT+z+ZOHgB*?~Pj zqD3IkI}62gpfDS-+l#FTKEj=m@S!STH?2*_kOmySr_yU^hCxDta%z zP!xKY>ziv9>pjJET81=8m}a2Cg1)9pA;GSB$+y3su`(`8YeP(0LMkv$+{dKto44ws z&X&BUx2i=Bj)9lp9C|9@$CmMAYt|b3wswa6@0q=ZHV=Nb?+IiK?MZeIdQ$jO)_tfQ z&dGC^puuadm?WWe`=PC`$P{OG&k`v_UMP+*KkZWF~j zcaOF9_(_$^26=LySGgwq6+!0X+$us3|8i)g@G$e6JWJ)X@S|7;UZ$&8TWl=#s*-Dd zS|Z<#_9NSQ_nG>IYGUd_CmpuO&Ue%23DLd34kGbs!Z7kTA+dvu^BuJ*6F>Wn#{3dd zPaeyuk@wmw$R!2o9W(l5D;D?(F(T}6TmH?GJTOF&#H4M>P_sJA+(3Ns;VuFmW0B-cy(Zr(YJL1jCc^X%Axl%= zY$S8f`-gM9oFso%miR!X$@5HXyUUhwSzR%^nF;EBdkKk#>V1#7>^_4i(`mgXZ{aZ_k?N9PBbvm;Lb+xkcZQsbw~_` zeC?f;z!)M))fLuyA(L+ojRBD{|J{!EZt35H;2MGBUEP2`LX#01<9qck;bHC| zCqILCcPkK*4DBXHlXHpPHXWR#;8|fsb^I2!J~wncfmf)in%>cdw#J+J;__G3SeUjl z9&0a(d;q7k&VC}7AgcG~l1FZE$`@1ltsH$p`J)flHG2d|#EiFM$Y* zmEYm_cfKcbO}I>~nLX(!#{!`Di|&p`UvPm!UxB^AHm^qG*$=F(EuKgA7#7F5rprm+ z#7d;FU>j499hh|5o97EXUI5Cdr8KTn?lwx6uYzot-3s}7<(Vm*8(WY1%U|h(tyiK? z1jrO=2RWCwOWV<`+;wWji#q`U?@jVYmn=zdS{);=AYfMwe_j4QvD)V5`-iLC{O#`$ zKyT~*P;N0S3XLv3wNQCmYK)cQ23SaUd+k%V`Yc;VEdQ+B4cZ!ouce1g!$=d&&+hbD zO|#+zwuY-AmTFt{lGjY(E@=bmN*2beUb2a|RhbPp6VG!=rF2p&ORTHCJv0xzxJTD} zf9Dn7xBJpq;pnMpIoE4YN7Iug2|t1ZSiJKAE5w}WR>+x8SI8OtKMVLDHL&n^k{{%Vfke82%Q`48z*p$9vMLrp9PaHzPBQuTP1svAM3eHUQWuKC4d8 zG=8M*{N`#h0bm&j|0bGB-StV~9B)@8a-E(Ks2)-y$r5%6K!FI`uxM!TZRYWH!RT~p zgmuxg`1SH#yf0#CW6 zixRH-Rw1Nz#~Z4=a5in&2VA^-2zV|yA%vWZM^uj5zK$EN5cv*C_%Ld{3en315K#T6WhryjRU_aN z$4%0KefQ;}o`|T#NginpQt(vUCHSDI=;A0WBPI)h*%;=($Rnyo)L47dkghHBUnq(C zDA{g~(nP(&+|47pnNl4QBe`51IkALaVl-F2do%3)!uch+Wlq%pilE`4h^R^@Vfy5F zlJ(2eg_Ch!Qlx{20yt*z`zv=zYfj+dDBD-54WIZCH&m0?_9n8yLaBCQ%r4!(r%O2Y8tPtXJlC)qn9qFyzWLW6cen74QU*}UU@W% ztXM6d!c?lyc=o`*_d+U=N+jieK_4r7F_lM<>x)zKAxr^lTAPe-ss9z<68S8MA_7is zH$_-bv!v=0!yxq{vXlD3@)y^ALf@#bT$>HtDZp5z$mR96dF|CO#^cZRhg`p_ZIxju zc1geE_9ea3e~R<8CimX9!~aw1CjV3EssgId$HK?Dx_SWNGz~G{KwE7pjwEIN0M~DG zq47d3*$VLO^=vk) z8OK+U1UpC!AD9oM z%!|-l4en0*=*}JH9;=nN)~GZ6a(ZIc0*_r?>JYhO9S+FV<|s}_${j+`&JhsdZcEY@ zdA(B8rkcgek3LUh$P+dHCIao5XEVF1wso(}ocH`Zn9pxI=e0%FH<;Bn3?pkAoc!8+2<(8XXHm*PZE6gcprpd;4s}cYq_psZLb?HKN z##L0*5>gP?ZQyJu=`LU4h*D@SbPYOo=7>fi2(P=f;ZRWueI^=gt{MS+i&E+0Z02Ib zvGqJ_Bf}z)jhdjId64twOr-iNLG(IasBW09-Cb<~2>zQE2k?h|g<`=|8yS;4FG_Al z6X`3xHzs-akp`>meSm?LvH~b`C1aP^r$5MX>6C7McY1O9p}d$7!uzk+grb&P2FRz% zEwihNRP$vrZg1>7L=*ueJc4l|XMJ3=Gw!17YIW+Im-K$?wnwhpfFL0sC`qzgIxdK1 zpC)#R7FY5xzW4}23!KSJ;(q z=;D=F>+|cMQ3O!!*L?RbHz)g%>-X7Q$(9G3tp1xt>Dr?NX+!%E(*PLn9%S}t z?VB+ljJ#U`08@+W&6?zC@#v+A^6TY3--JF45>wE~`wTL)_g+UGrZv`-S}|Uims@4D zxeNN)obLodQPO1K?TQzDpj*hT}=f*DEL0)XpQVKjssbo6-IqMc{`U zL&pEX>*9Gfa|BCKt!|VjMuQyey^HmXo2;0=Gy&9)Pi-1ekl{}xn?DJ5UxtYFBLr%c z$Rf_1R(^_>y}bFKJI+Mv{o})43y9Azd|RmI+&j}cr$U#9p!z|#B3dzCvQUj>(q)=*e@>ik*gTLS+;7H9vpRxr>?#uzl~0nUFP&g$Po^=li<t4ChzeNnHJC4s!9fX<$V&65;gpkW&U;FgXviypR zciNH6MK0ay9l{V?b_Dz}~S zO}=6?jD@nZ>IeF5a(vF2jn-n%1sWKQhgyAD0!(*AvE%bf_91h;6Y8F2?*>2E*y_!c z37O^wi+yU_I**|4rK^9bXwzT|1}-g264q&ex1AJMY4?^4Ksr zq`h+E0^pBm`Oeux;)6Zg56j=sG7^`I(iU`-z6#tf+0=8igRy=Db04`S^~<3V78kv4BB4$f6xa zkU21Oez4WmPGC(8jPhVSuFnCb%y5XfpBH*}GCl!AGr1#gE7ftKM;X|)8RG>YC3%Pu|7 z9+U*AP>=5)s4d{OZ2#s9eQe*f>nfUiJC0;0FXV|eOT>*N#K;S>@vlt(Nre|MciqN| zKf>u!2F@c-i{Yxwh=iEL zf{yXBi{Ma-l+qFg8rbe0OD2 z_J`Zlm?yE7qxDV^lxfVp+;WkL(it{gbNjyomp!$X4@$wH!AP)|m_qvzFuY^ks?ye* zk=3~ISBh*eD6;c@L46EiJ^wobuG3jZ6S+kFb&GE!&nDn(0$0SXLR8zr?rEosX;Wn_ zW!-6Mf4z5PzNcRd`K%A;zaLRYcrqpoCLH$`${@qKVicmuI88UZ{1OyMF!)vuVkeTc zaJ-ueBQRKu{(oSxu zfnz=U)wVvW>?4*01jK5b?Rmf=SSbqF;4gO^8r>AgaW#hVK-=CrFu#}Y2FG{*1?h*9 ziT|qD)_n#lon_;=d7x#4UOi2Fws6w^8qMCXP*7osVS+;{iY_y^9ZF#eR=Ud%JSs1@ zW?Y8+&23t)o%vLMKrD-4Hui3j5T!LpmFRWs<;%rTNdFa?_fPB^@B{YhDjChbrBIqM zDDQG@j*)nMt#bm1PwM4S2nOTt8G@WMwug14NW=U8)#o<_IgAaDBA2$?LXX9_uWQJ! zlcACKE-q2W-i*G}1aGqlQhit_d)HZ-A$cU1;Job;Sjl(^MD7QKw*dADQ3T7)xQzNu zzhrqrlg-z-yUWNcFR@b{sposlX+zZ$*Ch&VIHKOdxU* zl9JBIx3=3H_!wqO9mv>#Xwg#q$hC2YOc1tRmx0sV#IXI(B%1tpW+B2vQ~+TiwStLl ztaViFhcIcnGGgj`J)C^HnQkRds&`)cIT$K{kNc7e9d0>Ad2s}+3K;=na^tz4C7sE@ z?w32Pe#yiCg8#PMvyC=v+bkWPvV~2~`t*04LIbK^9c6=m)h?Tor&&A*|T8kqI_! zb5XM2w}Mz>_DC`giNug3pDfhOclhP!zB)hPlaNZ9TVbU^0(mxPzMXEN4w6vfn!yKU zNIF(Y%lWc5Wy38|f8zf|8H=jvi+6^!0K2rBqIo;9Y_>_rOD71vwfr06*V(}L#6a|g z8U72uwaSImleVWg9*l`5%n^}1pO8PCHLX4NPzBmi| zhE{fj%D8l~#-9j(xD;W)Fo*%C221^$s|^Ky*y@~5aA+1hiSU;DU}1$#%+1t3kGnse z^x`Q39_3kL)3y_fJz~MVS6x9JwRHti`2h4^O}B*gv@E=MD67(r3`X=S$$)z~X|Olo z-L!l!h}K4lAm!0GUmqPCJvUuV_?`Ml=0C}CasB?9H>{yk*jtSK zB`b_VG9amBxM`ygfsmqBA$9P@3B!?B+OLXM@uQ)k&a7wrlTW9IFykYGEW)DWQ=W@& zq3yr>4)5>Qs%v62{)m6rqaB( z+X6~iqW#T>?VmlW3eRf3Nyj5);&tJhB^6$m&-Wt3ueNG-e??!#RRRa)Kdk`BUnSZL zzB(Z25!hE8Ku?D5f4GPUFhnO5op5wo-8t(lGeL#muVE47tJC+QE(|MU!eu~37xF*Y zV$Njiz4Zf!WOcDsXX}_(R+jy@y~9@?g_by?|HMYS#>09O%Cu}>-V^ZKH}RYMkcla) z&c7FB6y2@XV#ntY@~|jbm|f69{CP>F;CZ|`#zha%bl$FxMSxWFEOA**B|d)Noz9+( z{@0@JwoXgCFHQ@I3R3)YpJsR;sUOKc?dk6e``E+4x=dWG0Dhd@M6Z;2Fl@&O*SUjY zNK)wEzw<~J`KHP~6K~0uiO4xCYb1|c7~Nj?^)v3aRd*Eo0t&(R%cjseR1MMwN55%} z04zCZq}d~5uCg#HA#FypD?^(%bZ^0gcw2L@Z0Mv~W2SN3v9zndD~&*`VpUQJ2l{tR^za4L$wY z)W?1I(3%H2`{x3kAuXNukFjEWqV%?GfaM}#5aJ-^Pmaz-1I>BO9UwGTQHxFc5GthAvRipjeFL#UzAWOm^@P(I;5 zP>dPU`y@D^7tGwVMM4zxYF-=SMcL(OC~3gMe~NgQ_Zev*&OTre9HP0(XFxh`0u@<= zHc!ob`dNFLN0{qZAR~u%goP(_jc9tU;yT9P40gpAdwT`;V^djkYjHTp;``u8@CdIh za>8RXJJl%KPjc6Hlh=CAtBxIj5R|@C7dIQbWK^1>>O~e;mT<@8$&WnPK2eyE(nLH~ zi=TrnOkI}8;OA;%uLJMCRTLWNxN=WsF!sF4raM(X@J8w<8vM#4ddS!p>U8wNysc}q zuQJ`e-Fh{t!9R!9_BWjWTXQN&7e%`j9Z;fz%iRc!LC|=}-u&K>?YaeCE0AB++_r!W z2!meb)Pua|rk0!W&H8>;`1psD-bn8tSFUPIMp24~KFTLve2w~AN(us1S8Egk!%Yj6 zJG!26=h_?|84rSZCeuAt$h$u<{UG`5>%(%5(N$sld?CY7n}ZtGJiPT`A@T=lcPiD( zw}h~0m~WWeUcR`$aYfJDI2~Z>t8sN%^kiBO6*%e1kZzUb!zM{uMZcb|(jT1-;O9G1 Lv(*H0x8VODxWA2J diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index 890ecd009..ab48a4cc1 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -22,7 +22,7 @@ function varargout = VisualISAM_gui(varargin) % Edit the above text to modify the response to help VisualISAM_gui -% Last Modified by GUIDE v2.5 08-Jun-2012 16:03:16 +% Last Modified by GUIDE v2.5 08-Jun-2012 23:53:47 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -53,8 +53,8 @@ function VisualISAM_gui_OpeningFcn(hObject, eventdata, handles, varargin) % varargin command line arguments to VisualISAM_gui (see VARARGIN) % Choose default command line output for VisualISAM_gui +initOptions(handles) handles.output = hObject; -VisualISAMInitOptions % Update handles structure guidata(hObject, handles); @@ -62,11 +62,51 @@ guidata(hObject, handles); % UIWAIT makes VisualISAM_gui wait for user response (see UIRESUME) % uiwait(handles.figure1); - function showFramei(hObject, handles) VisualISAMGlobalVars set(handles.frameStatus, 'String', sprintf('Frame: %d',frame_i)); + drawnow guidata(hObject, handles); + +function showWaiting(handles, status) + set(handles.waitingStatus,'String', status); + drawnow + guidata(handles.waitingStatus, handles); + +function triangle = chooseDataset(handles) + str = cellstr(get(handles.dataset,'String')); + sel = get(handles.dataset,'Value'); + switch str{sel} + case 'triangle' + triangle = true; + case 'cube' + triangle = false; + end + +function initOptions(handles) + VisualISAMGlobalVars + %% Setting data options + TRIANGLE = chooseDataset(handles) + NCAMERAS = str2num(get(handles.numCamEdit,'String')) + SHOW_IMAGES = get(handles.showImagesCB,'Value') + + %% iSAM Options + HARD_CONSTRAINT = get(handles.hardConstraintCB,'Value') + POINT_PRIORS = get(handles.pointPriorsCB,'Value') + set(handles.batchInitCB,'Value',1); + drawnow + BATCH_INIT = get(handles.batchInitCB,'Value') + REORDER_INTERVAL = str2num(get(handles.numCamEdit,'String')) + ALWAYS_RELINEARIZE = get(handles.alwaysRelinearizeCB,'Value') + + %% Display Options + SAVE_GRAPH = get(handles.saveGraphCB,'Value') + PRINT_STATS = get(handles.printStatsCB,'Value') + DRAW_INTERVAL = str2num(get(handles.drawInterval,'String')) + CAMERA_INTERVAL = str2num(get(handles.cameraIntervalEdit,'String')) + DRAW_TRUE_POSES = get(handles.drawTruePosesCB,'Value') + SAVE_FIGURES = get(handles.saveFiguresCB,'Value') + SAVE_GRAPHS = get(handles.saveGraphsCB,'Value') % --- Outputs from this function are returned to the command line. function varargout = VisualISAM_gui_OutputFcn(hObject, eventdata, handles) @@ -84,13 +124,13 @@ function intializeButton_Callback(hObject, eventdata, handles) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) VisualISAMGlobalVars - DRAW_INTERVAL = str2num(get(handles.drawInterval,'String')) ; - NCAMERAS = str2num(get(handles.numCamEdit,'String')) ; + initOptions(handles) VisualISAMGenerateData VisualISAMInitialize VisualISAMPlot showFramei(hObject, handles) + % --- Executes on button press in stepButton. function stepButton_Callback(hObject, eventdata, handles) % hObject handle to stepButton (see GCBO) @@ -102,32 +142,25 @@ function stepButton_Callback(hObject, eventdata, handles) showFramei(hObject, handles) VisualISAMStep if mod(frame_i,DRAW_INTERVAL)==0 + showWaiting(handles, 'Computing marginals...'); VisualISAMPlot + showWaiting(handles, ''); end end -% --- Executes on selection change in popupmenu1. -function popupmenu1_Callback(hObject, eventdata, handles) -% hObject handle to popupmenu1 (see GCBO) +% --- Executes on selection change in dataset. +function dataset_Callback(hObject, eventdata, handles) +% hObject handle to dataset (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) -% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array -% contents{get(hObject,'Value')} returns selected item from popupmenu1 - global TRIANGLE - str = cellstr(get(hObject,'String')); - sel = get(hObject,'Value'); - switch str{sel} - case 'triangle' - TRIANGLE = true - case 'cube' - TRIANGLE = false - end +% Hints: contents = cellstr(get(hObject,'String')) returns dataset contents as cell array +% contents{get(hObject,'Value')} returns selected item from dataset % --- Executes during object creation, after setting all properties. -function popupmenu1_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu1 (see GCBO) +function dataset_CreateFcn(hObject, eventdata, handles) +% hObject handle to dataset (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called @@ -143,16 +176,17 @@ function runButton_Callback(hObject, eventdata, handles) % hObject handle to runButton (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) - sprintf('Not yet implemented') - - -% --- Executes on button press in stopButton. -function stopButton_Callback(hObject, eventdata, handles) -% hObject handle to stopButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - sprintf('Not yet implemented') - + VisualISAMGlobalVars + while (frame_i Date: Sat, 9 Jun 2012 04:58:20 +0000 Subject: [PATCH 295/914] Removed all those comments --- matlab/examples/VisualISAM_gui.m | 150 +++++++------------------------ 1 file changed, 30 insertions(+), 120 deletions(-) diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index ab48a4cc1..015c7ef6d 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -6,7 +6,7 @@ function varargout = VisualISAM_gui(varargin) % H = VISUALISAM_GUI returns the handle to a new VISUALISAM_GUI or the handle to % the existing singleton*. % -% VISUALISAM_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% VISUALISAM_GUI('CALLBACK',hObject,~,handles,...) calls the local % function named CALLBACK in VISUALISAM_GUI.M with the given input arguments. % % VISUALISAM_GUI('Property','Value',...) creates a new VISUALISAM_GUI or raises the @@ -45,11 +45,8 @@ end % --- Executes just before VisualISAM_gui is made visible. -function VisualISAM_gui_OpeningFcn(hObject, eventdata, handles, varargin) +function VisualISAM_gui_OpeningFcn(hObject, ~, handles, varargin) % This function has no output args, see OutputFcn. -% hObject handle to figure -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) % varargin command line arguments to VisualISAM_gui (see VARARGIN) % Choose default command line output for VisualISAM_gui @@ -109,20 +106,14 @@ function initOptions(handles) SAVE_GRAPHS = get(handles.saveGraphsCB,'Value') % --- Outputs from this function are returned to the command line. -function varargout = VisualISAM_gui_OutputFcn(hObject, eventdata, handles) +function varargout = VisualISAM_gui_OutputFcn(hObject, ~, handles) % varargout cell array for returning output args (see VARARGOUT); -% hObject handle to figure -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes on button press in intializeButton. -function intializeButton_Callback(hObject, eventdata, handles) -% hObject handle to intializeButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) +function intializeButton_Callback(hObject, ~, handles) + VisualISAMGlobalVars initOptions(handles) VisualISAMGenerateData @@ -132,10 +123,8 @@ function intializeButton_Callback(hObject, eventdata, handles) % --- Executes on button press in stepButton. -function stepButton_Callback(hObject, eventdata, handles) -% hObject handle to stepButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) +function stepButton_Callback(hObject, ~, handles) + VisualISAMGlobalVars if (frame_i Date: Sat, 9 Jun 2012 05:29:34 +0000 Subject: [PATCH 296/914] fix some small bugs in VisualISAM_gui. Arrange callback functions. --- matlab/examples/VisualISAMDemo.m | 2 +- matlab/examples/VisualISAMGenerateData.m | 2 + matlab/examples/VisualISAM_gui.fig | Bin 9781 -> 9838 bytes matlab/examples/VisualISAM_gui.m | 219 ++++++++++++----------- 4 files changed, 113 insertions(+), 110 deletions(-) diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m index a3a89404f..626b3a944 100644 --- a/matlab/examples/VisualISAMDemo.m +++ b/matlab/examples/VisualISAMDemo.m @@ -1,2 +1,2 @@ -VisualISAMInitOptions +VisualISAMGlobalVars VisualISAM_gui \ No newline at end of file diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m index fd87c5434..03222f3cf 100644 --- a/matlab/examples/VisualISAMGenerateData.m +++ b/matlab/examples/VisualISAMGenerateData.m @@ -25,6 +25,7 @@ end height = 10; r = 40; K = gtsamCal3_S2(500,500,0,640/2,480/2); cameras = {}; +gui = gcf; for i=1:NCAMERAS theta = (i-1)*2*pi/NCAMERAS; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); @@ -39,6 +40,7 @@ for i=1:NCAMERAS end end end +figure(gui); odometry = cameras{1}.pose.between(cameras{2}.pose); diff --git a/matlab/examples/VisualISAM_gui.fig b/matlab/examples/VisualISAM_gui.fig index 07d1b793d90768cdf86718f3c85800a930e7b52a..748b722619838e18e40bfff4eaf010e9bcaf2ea1 100644 GIT binary patch delta 5854 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 delta 5796 zcmV;V7F+4=OtnmqGZ;p4X&_2v-tQD_4@_5>8PPriEpMW?ZPKXPr#~yzO2#~*(FK?qHX|Q1qDB?*MJ%-C!4)Vie}#ouU`As`>VFIi zD8%dOQ5G2^nOPEzmT`!ym|)QaOCjPjP{3A?sURTOg=*Y{zX*Mh2g=S4*ngjog6uvk z+O0zlU4eMm9;XEMf8Xz6klpXovVHfhf|pF->}2d_>}c$2>}>2lC_J@)f*+UtA0H^cu?F_{XR{#df6o+MR4z0uin!<%+QV8NJef1P)1QVet*KUlcKYW9&Ei=!2a<IAF<>W?LtDT&|S6l&a($dVH0O7xwpo9 zi@#53`X$*eEtO|xF9#|B4FQ3nScU|9?I=`@zd6?1_~tx*Et`xz@lCW+Po4_sV_IXn zFOyL^$DR(MIU)##CZ6V*;2OFv3R_WhqlQU4?lu-oe*)YPQ=cHA!}PEjx+;B0-uWtF z?y7vA$f?Cv;7#PId?KdQAF30BLGq%L8#FoJh2HFD^1*AMeXi8v*O1AOf+(z4BcYZT zupkN=GOqyud06NU0fd-#TCd+pYX{w|MUR;|s5K6?b=>&q%Ot?!mMk1xXDJ z4aIi3yN}#>j{cv6z2JeBPw!ay`M-=V^WNV2n7w=w{EkXO2J$7t zi>TMW>T~=In89H{U^DaGXx8(Q-FKGDe;hXURw>!#vc*YsnNq2$#j`(5<#@B0cNJm3 z-gal8#5i7;d`PAU_Nhz^1(?GWRYWs0hvHquo~WmI^N`E5JiFc;Ck+;ufHtopcq^ke zpuWfPfFqIe%FF7QxoPdB?c+>#hTWnUT{Gx3M^KV6G0fAQmCMycrej}v58TNHWcuH z@j^=pVj_W1;Mz>L({^Opo$Stnc=G7ciwQ^0{vQ)A{s*sK)cJO2=ytkf+fsrgJIQ4F zw)?$)`{tW@vrQp{REIVp`nc%pf1y1s-W8v>M9;|U8F}BB#1J>C#b-s|^;@bKjE{@o z{eSjSj(?Vcw;19bjo`f#;+>Xw%b^y}RygLae;s&U$MB46Jb;ZBG4^ZrM~MF#iXVxH z59>1~eql;t7)|W*J#5nY4sNP^;+|_#%Lg!n=kgz`yfSPaeT?Is(0BoR)UYk?*k*_) ztb0^lMAa3vU+B4CSErf&bf1>^v*^1Pm46iwv@$l$8aDP7UK80?=qIA^mhDnbZA;+_ z7eY1L@fCh-k~Tyo#!PBp2wBA(BRRe2trs0{YdQipTG+t`Cyv|ZIZ3y9rekz~`&;S3 zbc1{kFgJ0{v27lF?-C{w;B!8$| z*eLD1FRfI!7v~oiYIB$|pLafnH`T$LLItTuzi~wwmmTR(M>U_hkS+-EVgU6w^`{bvV06T@Rb@Dy5BT)1$eWx`U5) z9FK_lCSu7~)jF8Tcg5yK0E~)tc7GNPz8_%AwvG>MPp!eYc~C9PqvFE)+}G|)38szm zW(Dvg)K!nww$g3B^$_2bmPbaLSHKU0k3UC3-zo1Ibe|iRf1dh&`9S*UtG@j6o~Ae8 zRZ%ZlD448YF*njbqn=A!2SepidG(s#)%#~I@z2CR6aSQahNc(bUj5U>hks;^Ha%w` z_e}irBL7tHCfDts!PUuu{4?tPsv_zoD+@;Hb<_NF3U%fKxMLj*nFpc&%|Blx{+ak^ z;-8YQrs)N^AOC#oVAdMUJ`?{$(f+CS*6a4qZGZf|Jcxfr{eSEGXHYQbdfhbtj5-&D z*TJxPE*j%>yQT31_9(-!y?_(&OJkaa@ z7VK+d!F$2CH*#NF3huzzOT+DeH#$z=L%_k2C`%{lXtFo_VFLcvJzb)K(tY@V~3=I<>i z?tFfAz*we}8?s%JI)N;LS_CsSw^f zir#=Xuv5>JEYqb9CMLbIzc8LDg$JEBTNlkb1aMc-@Cfa5~7xa z1U4x#b#ct!tpaNY*=va@pScCe;;}LOLt1|NXxD4FCZD|Lj@KPZL2DA6h^_Atm^MCu@uW3=vQh zys@=PAdx^Qa?>*1PRqb{cd|Q+;)$b2j(;9Gd-BimV#2@R!L!cn%(ByAaobWp5_gix z?62&5`{unj@AoFm%~hU4LcjAc z`k3Y+i6_~t`L;>1V*^0<2@>zruqB^9I_|DVpoxO-93|Md(`28(UhVO$F}b~3*?&PM zokn}erd3Gc)F$?PXf2ltE9JV6CnsFwxK-pX+Z4Hb(0WtFv|Mx%q-fE!C#Fv+m}XLZ z4OLG~iSKedjRZRfH9I+mwqx%%9Nzq_`@m^NU|@vu18Vw9+h?RxZniSAoSkv}b>zx&MOEV~F+l!na^Nk@(j_EBniV z=Kb-xF7hysWg@mx*L$1v^a6@L(V*UDBe`6Roaz_;KFM~LPkf&ZNG(`#9Y-7+;32{S zMI9G}*rwPR%m_S}u&c&yo9`L}AHqUKX{|HFt(+y0U_)_OX zoiB?PCPZOeosX{*e-CkV`T0 zSYlzT>LQ+?9ziCCg6gkDznmB6`*^6c^L+$PpYI~HtO_)DLww%;ndP2;UHa+6Hv7h{ zv~TQ6-#C6redA$*eShyYe{tMu-^hRT5bG7?`DnFOO#8(6KJgBS`oyca=ZbN>Al6aI zD=!RzGlqT-iSjebW4&HXWgnz4%pzp%_Z$tFovmN%| z{9Ijh|DE>RAx?SWvUy=k^B2dh@`CL*im)O6-Pumdo$^9FFWduH({KL;00960?N`rF z6G0Syt)&4J12HjhvW6JI5L<``VM4cYVg% z$$7tdTD(cu6zI&-IY?&)+%dp$iq15bY>ZMgPZi?mWxDh-fa?ljdWYA1z0nZ8R6vid zZw1z;Bi0Yl?~HOR(b+~sMKx2`iTk^S4P+vso8V!MD1RDOIfRC-$wbk$Y71#~6+7Qw zi-_}1SDY@+mkdKyWW;P)`IXYfv(iF!eZDX^S9^dABUb)WU3OEDhj@7x^(3yBOZS$? zVUDK*c>y5%2Ijd^RQ|N9o7hHf?2kO0(N#)P71UsaiHMB6v~Ore@FR&CZ#E9KP+!xM0(9;<$)eS1p*dn1A$S?JzZhR5B< zPwBvK<6JU(Z=kn28R3{o6noqvSx%XRk;Wzm5L1^$2Xdoj+wT^I7raD~=O z&MlZuzM}4zLBS5gatq7bHGS`I^shGre;5w(AZa_ll2P_A{T@B)_p!a^?Q0g^~K zpbr250J8xA0C=43nafVXKp2ImLtC!pevbJIK zU2N%8jwb~}*pYvdKd0a6Khr}e8GjZnDy3FkrQAR>L1k4m9K%*ny>6u8(1w+D-4D4K z)Vi~suM_6S75Vn&o@ILamp8ZZIuEc;#q?XhYHxZ&_JX>a&c=7kq3@5EgMpcU4)eFq zi};Lkg#9aL_wVjGfBUuZbbKAu#N6=hU@bekACKYuLp{CCN3YYxd@vc#AAe`#!TVzQ z{NfKsW0gE~g2(UA+Ebc1MQjs0#4d4~nD;YFoFmQ?7l=LLB5{ehOk5$Z64!|9#0}ym zaf`T}us^s@d~K1hLD5fvqHlwu?|`E3f})=WMLz?Ieijt{94PvEQ1lC+=zE~(7eUc4 zfudgqMZW@yeian`8Yud8P<8Yhpy)S2(QkpG-v&j$Lwbq>_xeliKDY5qi~D=f?@_-? z{UMw8{LO2{XU>H>?Ej1NNPfvL`6a*Pm;91n@=JcnFZm_EF#mtg iQ)>V7j-CGr^OL^!+(W-MjNg0k{U7taCmcU~dTbEUd&$rM diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index 015c7ef6d..d13e45e3f 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -22,7 +22,7 @@ function varargout = VisualISAM_gui(varargin) % Edit the above text to modify the response to help VisualISAM_gui -% Last Modified by GUIDE v2.5 08-Jun-2012 23:53:47 +% Last Modified by GUIDE v2.5 09-Jun-2012 00:56:47 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -50,7 +50,6 @@ function VisualISAM_gui_OpeningFcn(hObject, ~, handles, varargin) % varargin command line arguments to VisualISAM_gui (see VARARGIN) % Choose default command line output for VisualISAM_gui -initOptions(handles) handles.output = hObject; % Update handles structure @@ -59,6 +58,16 @@ guidata(hObject, handles); % UIWAIT makes VisualISAM_gui wait for user response (see UIRESUME) % uiwait(handles.figure1); +% --- Outputs from this function are returned to the command line. +function varargout = VisualISAM_gui_OutputFcn(hObject, ~, handles) +% varargout cell array for returning output args (see VARARGOUT); +% Get default command line output from handles structure +varargout{1} = handles.output; + + +%---------------------------------------------------------- +% Convenient functions +%---------------------------------------------------------- function showFramei(hObject, handles) VisualISAMGlobalVars set(handles.frameStatus, 'String', sprintf('Frame: %d',frame_i)); @@ -82,21 +91,19 @@ function triangle = chooseDataset(handles) function initOptions(handles) VisualISAMGlobalVars - %% Setting data options + % Setting data options TRIANGLE = chooseDataset(handles) NCAMERAS = str2num(get(handles.numCamEdit,'String')) SHOW_IMAGES = get(handles.showImagesCB,'Value') - %% iSAM Options + % iSAM Options HARD_CONSTRAINT = get(handles.hardConstraintCB,'Value') POINT_PRIORS = get(handles.pointPriorsCB,'Value') - set(handles.batchInitCB,'Value',1); - drawnow BATCH_INIT = get(handles.batchInitCB,'Value') REORDER_INTERVAL = str2num(get(handles.numCamEdit,'String')) ALWAYS_RELINEARIZE = get(handles.alwaysRelinearizeCB,'Value') - %% Display Options + % Display Options SAVE_GRAPH = get(handles.saveGraphCB,'Value') PRINT_STATS = get(handles.printStatsCB,'Value') DRAW_INTERVAL = str2num(get(handles.drawInterval,'String')) @@ -104,44 +111,11 @@ function initOptions(handles) DRAW_TRUE_POSES = get(handles.drawTruePosesCB,'Value') SAVE_FIGURES = get(handles.saveFiguresCB,'Value') SAVE_GRAPHS = get(handles.saveGraphsCB,'Value') - -% --- Outputs from this function are returned to the command line. -function varargout = VisualISAM_gui_OutputFcn(hObject, ~, handles) -% varargout cell array for returning output args (see VARARGOUT); -% Get default command line output from handles structure -varargout{1} = handles.output; - -% --- Executes on button press in intializeButton. -function intializeButton_Callback(hObject, ~, handles) - - VisualISAMGlobalVars - initOptions(handles) - VisualISAMGenerateData - VisualISAMInitialize - VisualISAMPlot - showFramei(hObject, handles) - -% --- Executes on button press in stepButton. -function stepButton_Callback(hObject, ~, handles) - VisualISAMGlobalVars - if (frame_i Date: Sat, 9 Jun 2012 14:13:32 +0000 Subject: [PATCH 297/914] fix missing field --- gtsam/linear/ConjugateGradientSolver.h | 7 +++++-- gtsam/linear/IterativeSolver.h | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gtsam/linear/ConjugateGradientSolver.h b/gtsam/linear/ConjugateGradientSolver.h index f7f1ad5dc..c31507f9b 100644 --- a/gtsam/linear/ConjugateGradientSolver.h +++ b/gtsam/linear/ConjugateGradientSolver.h @@ -37,14 +37,17 @@ struct ConjugateGradientParameters : public IterativeOptimizationParameters { } blas_kernel_; ConjugateGradientParameters() - : minIterations_(1), maxIterations_(500), reset_(501), epsilon_rel_(1e-3), epsilon_abs_(1e-3), - blas_kernel_(GTSAM) {} + : minIterations_(1), maxIterations_(500), reset_(501), epsilon_rel_(1e-3), epsilon_abs_(1e-3), blas_kernel_(GTSAM) {} ConjugateGradientParameters(size_t minIterations, size_t maxIterations, size_t reset, double epsilon_rel, double epsilon_abs, BLASKernel blas = GTSAM) : minIterations_(minIterations), maxIterations_(maxIterations), reset_(reset), epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs), blas_kernel_(blas) {} + ConjugateGradientParameters(const ConjugateGradientParameters &p) + : minIterations_(p.minIterations_), maxIterations_(p.maxIterations_), reset_(p.reset_), + epsilon_rel_(p.epsilon_rel_), epsilon_abs_(p.epsilon_abs_), blas_kernel_(p.blas_kernel_) {} + /* general interface */ inline size_t minIterations() const { return minIterations_; } inline size_t maxIterations() const { return maxIterations_; } diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index fb19e6d58..6f002bda4 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -23,15 +23,15 @@ namespace gtsam { public: typedef boost::shared_ptr shared_ptr; - enum Kernel { CG = 0 } kernel_ ; ///< Iterative Method Kernel - enum Verbosity { SILENT = 0, COMPLEXITY = 1, ERROR = 2} verbosity_ ; ///< Verbosity + enum Kernel { CG = 0 } kernel_ ; ///< Iterative Method Kernel + enum Verbosity { SILENT, ERROR } verbosity_; public: IterativeOptimizationParameters(const IterativeOptimizationParameters &p) : kernel_(p.kernel_), verbosity_(p.verbosity_) {} - IterativeOptimizationParameters(Kernel kernel = CG, Verbosity verbosity = SILENT) + IterativeOptimizationParameters(const Kernel kernel = CG, const Verbosity verbosity = SILENT) : kernel_(kernel), verbosity_(verbosity) {} virtual ~IterativeOptimizationParameters() {} From 1de8d6ecf3aeb6e5a854f48b1867ea81d0ac99b7 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 18:17:13 +0000 Subject: [PATCH 298/914] Fixed compile error because "using namespace std" disappeared. --- gtsam/inference/graph-inl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/inference/graph-inl.h b/gtsam/inference/graph-inl.h index 73980797a..ff65147cc 100644 --- a/gtsam/inference/graph-inl.h +++ b/gtsam/inference/graph-inl.h @@ -113,13 +113,13 @@ predecessorMap2Graph(const PredecessorMap& p_map) { FOREACH_PAIR(child, parent, p_map) { if (key2vertex.find(child) == key2vertex.end()) { v1 = add_vertex(child, g); - key2vertex.insert(make_pair(child, v1)); + key2vertex.insert(std::make_pair(child, v1)); } else v1 = key2vertex[child]; if (key2vertex.find(parent) == key2vertex.end()) { v2 = add_vertex(parent, g); - key2vertex.insert(make_pair(parent, v2)); + key2vertex.insert(std::make_pair(parent, v2)); } else v2 = key2vertex[parent]; From aeb2474d55331685329ed2e74b77929e1a5137c9 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 18:19:45 +0000 Subject: [PATCH 299/914] Made a cpp file that makes the header cleaner, and avoids superheavy includes. --- gtsam/nonlinear/Symbol.cpp | 73 ++++++++++++++++++++++++++++++++++++++ gtsam/nonlinear/Symbol.h | 62 ++++++++++---------------------- 2 files changed, 91 insertions(+), 44 deletions(-) create mode 100644 gtsam/nonlinear/Symbol.cpp diff --git a/gtsam/nonlinear/Symbol.cpp b/gtsam/nonlinear/Symbol.cpp new file mode 100644 index 000000000..a161e2fd7 --- /dev/null +++ b/gtsam/nonlinear/Symbol.cpp @@ -0,0 +1,73 @@ +/* ---------------------------------------------------------------------------- + + * 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 Symbol.cpp + * @date June 9, 2012 + * @author: Frank Dellaert + * @author: Richard Roberts + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace gtsam { + + static const size_t keyBits = sizeof(Key) * 8; + static const size_t chrBits = sizeof(unsigned char) * 8; + static const size_t indexBits = keyBits - chrBits; + static const Key chrMask = Key(std::numeric_limits::max()) + << indexBits; + static const Key indexMask = ~chrMask; + + Symbol::Symbol(Key key) { + c_ = (unsigned char) ((key & chrMask) >> indexBits); + j_ = key & indexMask; + } + + Key Symbol::key() const { + if (j_ > indexMask) + throw std::invalid_argument("Symbol index is too large"); + Key key = (Key(c_) << indexBits) | j_; + return key; + } + + void Symbol::print(const std::string& s) const { + std::cout << s << (std::string) (*this) << std::endl; + } + + bool Symbol::equals(const Symbol& expected, double tol) const { + return (*this) == expected; + } + + Symbol::operator std::string() const { + return str(boost::format("%c%d") % c_ % j_); + } + + boost::function Symbol::ChrTest(unsigned char c) { + namespace bl = boost::lambda; + return bl::bind(&Symbol::chr, bl::bind(bl::constructor(), bl::_1)) + == c; + } + +} // namespace gtsam + diff --git a/gtsam/nonlinear/Symbol.h b/gtsam/nonlinear/Symbol.h index 03fd4aa1f..b4bda4f1a 100644 --- a/gtsam/nonlinear/Symbol.h +++ b/gtsam/nonlinear/Symbol.h @@ -19,17 +19,7 @@ #pragma once #include - -#include -#include #include -#include -#include -#include -#include - -#include -#include namespace gtsam { @@ -45,6 +35,7 @@ protected: size_t j_; public: + /** Default constructor */ Symbol() : c_(0), j_(0) { @@ -61,39 +52,19 @@ public: } /** Constructor that decodes an integer Key */ - Symbol(Key key) { - const size_t keyBits = sizeof(Key) * 8; - const size_t chrBits = sizeof(unsigned char) * 8; - const size_t indexBits = keyBits - chrBits; - const Key chrMask = Key(std::numeric_limits::max()) << indexBits; - const Key indexMask = ~chrMask; - c_ = (unsigned char)((key & chrMask) >> indexBits); - j_ = key & indexMask; - } + Symbol(Key key); /** return Key (integer) representation */ - Key key() const { - const size_t keyBits = sizeof(Key) * 8; - const size_t chrBits = sizeof(unsigned char) * 8; - const size_t indexBits = keyBits - chrBits; - const Key chrMask = Key(std::numeric_limits::max()) << indexBits; - const Key indexMask = ~chrMask; - if(j_ > indexMask) - throw std::invalid_argument("Symbol index is too large"); - Key key = (Key(c_) << indexBits) | j_; - return key; - } + Key key() const; /** Cast to integer */ operator Key() const { return key(); } - // Testable Requirements - void print(const std::string& s = "") const { - std::cout << s << (std::string) (*this) << std::endl; - } - bool equals(const Symbol& expected, double tol = 0.0) const { - return (*this) == expected; - } + /// Print + void print(const std::string& s = "") const; + + /// Check equality + bool equals(const Symbol& expected, double tol = 0.0) const; /** Retrieve key character */ unsigned char chr() const { @@ -106,23 +77,29 @@ public: } /** Create a string from the key */ - operator std::string() const { - return str(boost::format("%c%d") % c_ % j_); - } + operator std::string() const; /** Comparison for use in maps */ bool operator<(const Symbol& comp) const { return c_ < comp.c_ || (comp.c_ == c_ && j_ < comp.j_); } + + /** Comparison for use in maps */ bool operator==(const Symbol& comp) const { return comp.c_ == c_ && comp.j_ == j_; } + + /** Comparison for use in maps */ bool operator==(Key comp) const { return comp == (Key)(*this); } + + /** Comparison for use in maps */ bool operator!=(const Symbol& comp) const { return comp.c_ != c_ || comp.j_ != j_; } + + /** Comparison for use in maps */ bool operator!=(Key comp) const { return comp != (Key)(*this); } @@ -132,10 +109,7 @@ public: * Values::filter() function to retrieve all key-value pairs with the * requested character. */ - static boost::function ChrTest(unsigned char c) { - namespace bl = boost::lambda; - return bl::bind(&Symbol::chr, bl::bind(bl::constructor(), bl::_1)) == c; - } + static boost::function ChrTest(unsigned char c); private: From 5b08dde1f3aab686aee5a2317f875131649072fe Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 18:50:29 +0000 Subject: [PATCH 300/914] Include -inl.h as is now custom --- gtsam_unstable/linear/iterative.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam_unstable/linear/iterative.h b/gtsam_unstable/linear/iterative.h index 6765ac22a..29233ae27 100644 --- a/gtsam_unstable/linear/iterative.h +++ b/gtsam_unstable/linear/iterative.h @@ -148,3 +148,6 @@ namespace gtsam { } // namespace gtsam + +#include + From 03465500e95b1001553606bc97680cd07fcf7e54 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 18:51:43 +0000 Subject: [PATCH 301/914] typedef - though this double inheritance chain is a mess. Should GaussianFactorGraph be a typedef as well? --- gtsam/linear/JacobianFactorGraph.cpp | 20 ++++++++++---------- gtsam/linear/JacobianFactorGraph.h | 20 +++++++++++--------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/gtsam/linear/JacobianFactorGraph.cpp b/gtsam/linear/JacobianFactorGraph.cpp index b02375a79..632a55e02 100644 --- a/gtsam/linear/JacobianFactorGraph.cpp +++ b/gtsam/linear/JacobianFactorGraph.cpp @@ -10,7 +10,7 @@ namespace gtsam { /* ************************************************************************* */ -Errors operator*(const FactorGraph& fg, const VectorValues& x) { +Errors operator*(const JacobianFactorGraph& fg, const VectorValues& x) { Errors e; BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { e.push_back((*Ai)*x); @@ -19,12 +19,12 @@ Errors operator*(const FactorGraph& fg, const VectorValues& x) { } /* ************************************************************************* */ -void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, Errors& e) { +void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, Errors& e) { multiplyInPlace(fg,x,e.begin()); } /* ************************************************************************* */ -void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, const Errors::iterator& e) { +void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, const Errors::iterator& e) { Errors::iterator ei = e; BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { *ei = (*Ai)*x; @@ -35,7 +35,7 @@ void multiplyInPlace(const FactorGraph& fg, const VectorValues& /* ************************************************************************* */ // x += alpha*A'*e -void transposeMultiplyAdd(const FactorGraph& fg, double alpha, const Errors& e, VectorValues& x) { +void transposeMultiplyAdd(const JacobianFactorGraph& fg, double alpha, const Errors& e, VectorValues& x) { // For each factor add the gradient contribution Errors::const_iterator ei = e.begin(); BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { @@ -44,7 +44,7 @@ void transposeMultiplyAdd(const FactorGraph& fg, double alpha, c } /* ************************************************************************* */ -VectorValues gradient(const FactorGraph& fg, const VectorValues& x0) { +VectorValues gradient(const JacobianFactorGraph& fg, const VectorValues& x0) { // It is crucial for performance to make a zero-valued clone of x VectorValues g = VectorValues::Zero(x0); Errors e; @@ -56,7 +56,7 @@ VectorValues gradient(const FactorGraph& fg, const VectorValues& } /* ************************************************************************* */ -void gradientAtZero(const FactorGraph& fg, VectorValues& g) { +void gradientAtZero(const JacobianFactorGraph& fg, VectorValues& g) { // Zero-out the gradient g.setZero(); Errors e; @@ -67,7 +67,7 @@ void gradientAtZero(const FactorGraph& fg, VectorValues& g) { } /* ************************************************************************* */ -void residual(const FactorGraph& fg, const VectorValues &x, VectorValues &r) { +void residual(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r) { Index i = 0 ; BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { r[i] = factor->getb(); @@ -79,7 +79,7 @@ void residual(const FactorGraph& fg, const VectorValues &x, Vect } /* ************************************************************************* */ -void multiply(const FactorGraph& fg, const VectorValues &x, VectorValues &r) { +void multiply(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r) { r.vector() = Vector::Zero(r.dim()); Index i = 0; BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { @@ -92,7 +92,7 @@ void multiply(const FactorGraph& fg, const VectorValues &x, Vect } /* ************************************************************************* */ -void transposeMultiply(const FactorGraph& fg, const VectorValues &r, VectorValues &x) { +void transposeMultiply(const JacobianFactorGraph& fg, const VectorValues &r, VectorValues &x) { x.vector() = Vector::Zero(x.dim()); Index i = 0; BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { @@ -102,6 +102,6 @@ void transposeMultiply(const FactorGraph& fg, const VectorValues ++i; } } -} +} // namespace diff --git a/gtsam/linear/JacobianFactorGraph.h b/gtsam/linear/JacobianFactorGraph.h index 8d240c00e..598c69677 100644 --- a/gtsam/linear/JacobianFactorGraph.h +++ b/gtsam/linear/JacobianFactorGraph.h @@ -24,17 +24,19 @@ namespace gtsam { + typedef FactorGraph JacobianFactorGraph; + /** return A*x */ - Errors operator*(const FactorGraph& fg, const VectorValues& x); + Errors operator*(const JacobianFactorGraph& fg, const VectorValues& x); /** In-place version e <- A*x that overwrites e. */ - void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, Errors& e); + void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, Errors& e); /** In-place version e <- A*x that takes an iterator. */ - void multiplyInPlace(const FactorGraph& fg, const VectorValues& x, const Errors::iterator& e); + void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, const Errors::iterator& e); /** x += alpha*A'*e */ - void transposeMultiplyAdd(const FactorGraph& fg, double alpha, const Errors& e, VectorValues& x); + void transposeMultiplyAdd(const JacobianFactorGraph& fg, double alpha, const Errors& e, VectorValues& x); /** * Compute the gradient of the energy function, @@ -45,7 +47,7 @@ namespace gtsam { * @param x0 The center about which to compute the gradient * @return The gradient as a VectorValues */ - VectorValues gradient(const FactorGraph& fg, const VectorValues& x0); + VectorValues gradient(const JacobianFactorGraph& fg, const VectorValues& x0); /** * Compute the gradient of the energy function, @@ -56,11 +58,11 @@ namespace gtsam { * @param [output] g A VectorValues to store the gradient, which must be preallocated, see allocateVectorValues * @return The gradient as a VectorValues */ - void gradientAtZero(const FactorGraph& fg, VectorValues& g); + void gradientAtZero(const JacobianFactorGraph& fg, VectorValues& g); /* matrix-vector operations */ - void residual(const FactorGraph& fg, const VectorValues &x, VectorValues &r); - void multiply(const FactorGraph& fg, const VectorValues &x, VectorValues &r); - void transposeMultiply(const FactorGraph& fg, const VectorValues &r, VectorValues &x); + void residual(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r); + void multiply(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r); + void transposeMultiply(const JacobianFactorGraph& fg, const VectorValues &r, VectorValues &x); } From 54bfe722ad10888292b629c109181421a6fad926 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 18:52:22 +0000 Subject: [PATCH 302/914] Returning ordering from planarGraph is obsolete since Index change --- gtsam/slam/smallExample.cpp | 26 +++++++++++++------------- gtsam/slam/smallExample.h | 19 ++++++++++--------- tests/timeGaussianFactorGraph.cpp | 8 ++------ 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/gtsam/slam/smallExample.cpp b/gtsam/slam/smallExample.cpp index 5b0ee90dd..9937847ae 100644 --- a/gtsam/slam/smallExample.cpp +++ b/gtsam/slam/smallExample.cpp @@ -135,7 +135,7 @@ namespace example { } /* ************************************************************************* */ - FactorGraph createGaussianFactorGraph(const Ordering& ordering) { + JacobianFactorGraph createGaussianFactorGraph(const Ordering& ordering) { // Create empty graph GaussianFactorGraph fg; @@ -153,7 +153,7 @@ namespace example { // measurement between x2 and l1: l1-x2=[-0.2;0.3] fg.add(ordering[X(2)], -5*eye(2), ordering[L(1)], 5*eye(2), Vector_(2, -1.0, 1.5), unit2); - return *fg.dynamicCastFactors >(); + return *fg.dynamicCastFactors(); } /* ************************************************************************* */ @@ -272,7 +272,7 @@ namespace example { } /* ************************************************************************* */ - FactorGraph createSimpleConstraintGraph() { + JacobianFactorGraph createSimpleConstraintGraph() { // create unary factor // prior on _x_, mean = [1,-1], sigma=0.1 Matrix Ax = eye(2); @@ -292,7 +292,7 @@ namespace example { constraintModel)); // construct the graph - FactorGraph fg; + JacobianFactorGraph fg; fg.push_back(f1); fg.push_back(f2); @@ -309,7 +309,7 @@ namespace example { } /* ************************************************************************* */ - FactorGraph createSingleConstraintGraph() { + JacobianFactorGraph createSingleConstraintGraph() { // create unary factor // prior on _x_, mean = [1,-1], sigma=0.1 Matrix Ax = eye(2); @@ -334,7 +334,7 @@ namespace example { constraintModel)); // construct the graph - FactorGraph fg; + JacobianFactorGraph fg; fg.push_back(f1); fg.push_back(f2); @@ -350,7 +350,7 @@ namespace example { } /* ************************************************************************* */ - FactorGraph createMultiConstraintGraph() { + JacobianFactorGraph createMultiConstraintGraph() { // unary factor 1 Matrix A = eye(2); Vector b = Vector_(2, -2.0, 2.0); @@ -395,7 +395,7 @@ namespace example { constraintModel)); // construct the graph - FactorGraph fg; + JacobianFactorGraph fg; fg.push_back(lf1); fg.push_back(lc1); fg.push_back(lc2); @@ -420,7 +420,7 @@ namespace example { } /* ************************************************************************* */ - boost::tuple, Ordering, VectorValues> planarGraph(size_t N) { + boost::tuple planarGraph(size_t N) { // create empty graph NonlinearFactorGraph nlfg; @@ -457,7 +457,7 @@ namespace example { xtrue[ordering[key(x, y)]] = Point2(x,y).vector(); // linearize around zero - return boost::make_tuple(*nlfg.linearize(zeros, ordering), ordering, xtrue); + return boost::make_tuple(*nlfg.linearize(zeros, ordering), xtrue); } /* ************************************************************************* */ @@ -470,9 +470,9 @@ namespace example { } /* ************************************************************************* */ - pair, FactorGraph > splitOffPlanarTree(size_t N, - const FactorGraph& original) { - FactorGraph T, C; + pair splitOffPlanarTree(size_t N, + const JacobianFactorGraph& original) { + JacobianFactorGraph T, C; // Add the x11 constraint to the tree T.push_back(original[0]); diff --git a/gtsam/slam/smallExample.h b/gtsam/slam/smallExample.h index 96dcbaf09..3b3b200b8 100644 --- a/gtsam/slam/smallExample.h +++ b/gtsam/slam/smallExample.h @@ -21,9 +21,10 @@ #pragma once -#include -#include #include +#include +#include +#include namespace gtsam { namespace example { @@ -65,7 +66,7 @@ namespace gtsam { * create a linear factor graph * The non-linear graph above evaluated at NoisyValues */ - FactorGraph createGaussianFactorGraph(const Ordering& ordering); + JacobianFactorGraph createGaussianFactorGraph(const Ordering& ordering); /** * create small Chordal Bayes Net x <- y @@ -99,21 +100,21 @@ namespace gtsam { * Creates a simple constrained graph with one linear factor and * one binary equality constraint that sets x = y */ - FactorGraph createSimpleConstraintGraph(); + JacobianFactorGraph createSimpleConstraintGraph(); VectorValues createSimpleConstraintValues(); /** * Creates a simple constrained graph with one linear factor and * one binary constraint. */ - FactorGraph createSingleConstraintGraph(); + JacobianFactorGraph createSingleConstraintGraph(); VectorValues createSingleConstraintValues(); /** * Creates a constrained graph with a linear factor and two * binary constraints that share a node */ - FactorGraph createMultiConstraintGraph(); + JacobianFactorGraph createMultiConstraintGraph(); VectorValues createMultiConstraintValues(); /* ******************************************************* */ @@ -129,7 +130,7 @@ namespace gtsam { * -x11-x21-x31 * with x11 clamped at (1,1), and others related by 2D odometry. */ - boost::tuple, Ordering, VectorValues> planarGraph(size_t N); + boost::tuple planarGraph(size_t N); /* * Create canonical ordering for planar graph that also works for tree @@ -146,8 +147,8 @@ namespace gtsam { * | * -x11-x21-x31 */ - std::pair, FactorGraph > splitOffPlanarTree( - size_t N, const FactorGraph& original); + std::pair splitOffPlanarTree( + size_t N, const JacobianFactorGraph& original); } // example } // gtsam diff --git a/tests/timeGaussianFactorGraph.cpp b/tests/timeGaussianFactorGraph.cpp index 3c9d83b3d..aff3ff150 100644 --- a/tests/timeGaussianFactorGraph.cpp +++ b/tests/timeGaussianFactorGraph.cpp @@ -43,10 +43,8 @@ double timeKalmanSmoother(int T) { // Create a planar factor graph and optimize // todo: use COLAMD ordering again (removed when linear baked-in ordering added) double timePlanarSmoother(int N, bool old = true) { - boost::tuple pg = planarGraph(N); + boost::tuple pg = planarGraph(N); GaussianFactorGraph& fg(pg.get<0>()); -// Ordering& ordering(pg.get<1>()); -// VectorValues& config(pg.get<2>()); clock_t start = clock(); GaussianSequentialSolver(fg).optimize(); clock_t end = clock (); @@ -58,10 +56,8 @@ double timePlanarSmoother(int N, bool old = true) { // Create a planar factor graph and eliminate // todo: use COLAMD ordering again (removed when linear baked-in ordering added) double timePlanarSmootherEliminate(int N, bool old = true) { - boost::tuple pg = planarGraph(N); + boost::tuple pg = planarGraph(N); GaussianFactorGraph& fg(pg.get<0>()); -// Ordering& ordering(pg.get<1>()); -// VectorValues& config(pg.get<2>()); clock_t start = clock(); GaussianSequentialSolver(fg).eliminate(); clock_t end = clock (); From dc879fe280b6a7d8f225412a0a31684f59f7370c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 18:54:47 +0000 Subject: [PATCH 303/914] Moved testSubgraphPreconditioner from experimental back to linear/tests, though most of it is commented out, mostly because of JacobianFactorGraph - GaussianFactorGraph distinction --- tests/testSubgraphPreconditioner.cpp | 213 +++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 tests/testSubgraphPreconditioner.cpp diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp new file mode 100644 index 000000000..747e35914 --- /dev/null +++ b/tests/testSubgraphPreconditioner.cpp @@ -0,0 +1,213 @@ +/* ---------------------------------------------------------------------------- + + * 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 testSubgraphConditioner.cpp + * @brief Unit tests for SubgraphPreconditioner + * @author Frank Dellaert + **/ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +using namespace boost::assign; + +using namespace std; +using namespace gtsam; +using namespace example; + +// define keys +Key i3003 = 3003, i2003 = 2003, i1003 = 1003; +Key i3002 = 3002, i2002 = 2002, i1002 = 1002; +Key i3001 = 3001, i2001 = 2001, i1001 = 1001; + +// TODO fix Ordering::equals, because the ordering *is* correct ! +/* ************************************************************************* * +TEST( SubgraphPreconditioner, planarOrdering ) +{ + // Check canonical ordering + Ordering expected, ordering = planarOrdering(3); + expected += i3003, i2003, i1003, i3002, i2002, i1002, i3001, i2001, i1001; + CHECK(assert_equal(expected,ordering)); +} + +/* ************************************************************************* */ +TEST( SubgraphPreconditioner, planarGraph ) + { + // Check planar graph construction + GaussianFactorGraph A; + VectorValues xtrue; + boost::tie(A, xtrue) = planarGraph(3); + LONGS_EQUAL(13,A.size()); + LONGS_EQUAL(9,xtrue.size()); + DOUBLES_EQUAL(0,A.error(xtrue),1e-9); // check zero error for xtrue + + // Check that xtrue is optimal + GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(A).eliminate(); + VectorValues actual = optimize(*R1); + CHECK(assert_equal(xtrue,actual)); +} + +/* ************************************************************************* * +TEST( SubgraphPreconditioner, splitOffPlanarTree ) +{ + // Build a planar graph + GaussianFactorGraph A; + VectorValues xtrue; + boost::tie(A, xtrue) = planarGraph(3); + + // Get the spanning tree and constraints, and check their sizes + JacobianFactorGraph T, C; + // TODO big mess: GFG and JFG mess !!! + boost::tie(T, C) = splitOffPlanarTree(3, A); + LONGS_EQUAL(9,T.size()); + LONGS_EQUAL(4,C.size()); + + // Check that the tree can be solved to give the ground xtrue + GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(T).eliminate(); + VectorValues xbar = optimize(*R1); + CHECK(assert_equal(xtrue,xbar)); +} + +/* ************************************************************************* * +TEST( SubgraphPreconditioner, system ) +{ + // Build a planar graph + JacobianFactorGraph Ab; + VectorValues xtrue; + size_t N = 3; + boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + + // Get the spanning tree and corresponding ordering + GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); + SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); + SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); + + // Eliminate the spanning tree to build a prior + SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 + VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 + + // Create Subgraph-preconditioned system + VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible + SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); + + // Create zero config + VectorValues zeros = VectorValues::Zero(xbar); + + // Set up y0 as all zeros + VectorValues y0 = zeros; + + // y1 = perturbed y0 + VectorValues y1 = zeros; + y1[i2003] = Vector_(2, 1.0, -1.0); + + // Check corresponding x values + VectorValues expected_x1 = xtrue, x1 = system.x(y1); + expected_x1[i2003] = Vector_(2, 2.01, 2.99); + expected_x1[i3003] = Vector_(2, 3.01, 2.99); + CHECK(assert_equal(xtrue, system.x(y0))); + CHECK(assert_equal(expected_x1,system.x(y1))); + + // Check errors +// DOUBLES_EQUAL(0,error(Ab,xtrue),1e-9); // TODO ! +// DOUBLES_EQUAL(3,error(Ab,x1),1e-9); // TODO ! + DOUBLES_EQUAL(0,error(system,y0),1e-9); + DOUBLES_EQUAL(3,error(system,y1),1e-9); + + // Test gradient in x + VectorValues expected_gx0 = zeros; + VectorValues expected_gx1 = zeros; + CHECK(assert_equal(expected_gx0,gradient(Ab,xtrue))); + expected_gx1[i1003] = Vector_(2, -100., 100.); + expected_gx1[i2002] = Vector_(2, -100., 100.); + expected_gx1[i2003] = Vector_(2, 200., -200.); + expected_gx1[i3002] = Vector_(2, -100., 100.); + expected_gx1[i3003] = Vector_(2, 100., -100.); + CHECK(assert_equal(expected_gx1,gradient(Ab,x1))); + + // Test gradient in y + VectorValues expected_gy0 = zeros; + VectorValues expected_gy1 = zeros; + expected_gy1[i1003] = Vector_(2, 2., -2.); + expected_gy1[i2002] = Vector_(2, -2., 2.); + expected_gy1[i2003] = Vector_(2, 3., -3.); + expected_gy1[i3002] = Vector_(2, -1., 1.); + expected_gy1[i3003] = Vector_(2, 1., -1.); + CHECK(assert_equal(expected_gy0,gradient(system,y0))); + CHECK(assert_equal(expected_gy1,gradient(system,y1))); + + // Check it numerically for good measure + // TODO use boost::bind(&SubgraphPreconditioner::error,&system,_1) + // Vector numerical_g1 = numericalGradient (error, y1, 0.001); + // Vector expected_g1 = Vector_(18, 0., 0., 0., 0., 2., -2., 0., 0., -2., 2., + // 3., -3., 0., 0., -1., 1., 1., -1.); + // CHECK(assert_equal(expected_g1,numerical_g1)); +} + +/* ************************************************************************* * +TEST( SubgraphPreconditioner, conjugateGradients ) +{ + // Build a planar graph + GaussianFactorGraph Ab; + VectorValues xtrue; + size_t N = 3; + boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + + // Get the spanning tree and corresponding ordering + GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); + SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); + SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); + + // Eliminate the spanning tree to build a prior + Ordering ordering = planarOrdering(N); + SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 + VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 + + // Create Subgraph-preconditioned system + VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible + SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); + + // Create zero config y0 and perturbed config y1 + VectorValues y0 = VectorValues::Zero(xbar); + + VectorValues y1 = y0; + y1[i2003] = Vector_(2, 1.0, -1.0); + VectorValues x1 = system.x(y1); + + // Solve for the remaining constraints using PCG + ConjugateGradientParameters parameters; +// VectorValues actual = gtsam::conjugateGradients(system, y1, verbose, epsilon, epsilon, maxIterations); +// CHECK(assert_equal(y0,actual)); + + // Compare with non preconditioned version: + VectorValues actual2 = conjugateGradientDescent(Ab, x1, parameters); + CHECK(assert_equal(xtrue,actual2,1e-4)); +} + +/* ************************************************************************* */ +int main() { + TestResult tr; + return TestRegistry::runAllTests(tr); +} +/* ************************************************************************* */ From f45c23658558511bb6a16d1cf900988820104859 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 9 Jun 2012 19:17:15 +0000 Subject: [PATCH 304/914] Isolated exception case for use of Symbol.key(), removed use of Symbol in several tests. Removed "using namespace xxx" in header --- .cproject | 336 +++++++++--------- gtsam/nonlinear/tests/testKey.cpp | 2 + gtsam_unstable/dynamics/imuSystem.cpp | 16 +- gtsam_unstable/dynamics/imuSystem.h | 46 +-- .../dynamics/tests/testIMUSystem.cpp | 13 +- .../dynamics/tests/testVelocityConstraint.cpp | 2 +- tests/testBoundingConstraint.cpp | 15 +- tests/testGaussianFactor.cpp | 8 +- 8 files changed, 227 insertions(+), 211 deletions(-) diff --git a/.cproject b/.cproject index 5689b0b48..af740032b 100644 --- a/.cproject +++ b/.cproject @@ -311,14 +311,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -345,6 +337,7 @@ make + tests/testBayesTree.run true false @@ -352,6 +345,7 @@ make + testBinaryBayesNet.run true false @@ -399,6 +393,7 @@ make + testSymbolicBayesNet.run true false @@ -406,6 +401,7 @@ make + tests/testSymbolicFactor.run true false @@ -413,6 +409,7 @@ make + testSymbolicFactorGraph.run true false @@ -428,11 +425,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -441,6 +447,14 @@ true true + + make + -j5 + testIMUSystem.run + true + true + true + make -j5 @@ -513,22 +527,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -545,6 +543,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -569,18 +583,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -665,26 +687,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -931,6 +945,7 @@ make + testGraph.run true false @@ -938,6 +953,7 @@ make + testJunctionTree.run true false @@ -945,6 +961,7 @@ make + testSymbolicBayesNetB.run true false @@ -1064,6 +1081,7 @@ make + testErrors.run true false @@ -1519,7 +1537,6 @@ make - testSimulated2DOriented.run true false @@ -1559,7 +1576,6 @@ make - testSimulated2D.run true false @@ -1567,7 +1583,6 @@ make - testSimulated3D.run true false @@ -1783,7 +1798,6 @@ make - tests/testGaussianISAM2 true false @@ -1805,102 +1819,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -2102,6 +2020,7 @@ cpack + -G DEB true false @@ -2109,6 +2028,7 @@ cpack + -G RPM true false @@ -2116,6 +2036,7 @@ cpack + -G TGZ true false @@ -2123,6 +2044,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2216,42 +2138,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap_gtsam + -j2 + timeRot3.run true true true - + make - -j5 - wrap + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2295,6 +2273,46 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam/nonlinear/tests/testKey.cpp b/gtsam/nonlinear/tests/testKey.cpp index dedb45332..601176935 100644 --- a/gtsam/nonlinear/tests/testKey.cpp +++ b/gtsam/nonlinear/tests/testKey.cpp @@ -25,6 +25,8 @@ using namespace boost::assign; using namespace std; using namespace gtsam; +Key aKey = gtsam::symbol_shorthand::X(4); // FIXME: throws index too large exception in Symbol.key() + /* ************************************************************************* */ TEST(Key, KeySymbolConversion) { Symbol original('j', 4); diff --git a/gtsam_unstable/dynamics/imuSystem.cpp b/gtsam_unstable/dynamics/imuSystem.cpp index 209615bcc..376868583 100644 --- a/gtsam_unstable/dynamics/imuSystem.cpp +++ b/gtsam_unstable/dynamics/imuSystem.cpp @@ -13,44 +13,44 @@ using namespace gtsam; /* ************************************************************************* */ void Graph::addPrior(Key key, const PoseRTV& pose, const SharedNoiseModel& noiseModel) { - add(Prior(PoseKey(key), pose, noiseModel)); + add(Prior(key, pose, noiseModel)); } /* ************************************************************************* */ void Graph::addConstraint(Key key, const PoseRTV& pose) { - add(Constraint(PoseKey(key), pose)); + add(Constraint(key, pose)); } /* ************************************************************************* */ void Graph::addHeightPrior(Key key, double z, const SharedNoiseModel& noiseModel) { - add(DHeightPrior(PoseKey(key), z, noiseModel)); + add(DHeightPrior(key, z, noiseModel)); } /* ************************************************************************* */ void Graph::addFullIMUMeasurement(Key key1, Key key2, const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel) { - add(FullIMUMeasurement(accel, gyro, dt, PoseKey(key1), PoseKey(key2), noiseModel)); + add(FullIMUMeasurement(accel, gyro, dt, key1, key2, noiseModel)); } /* ************************************************************************* */ void Graph::addIMUMeasurement(Key key1, Key key2, const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel) { - add(IMUMeasurement(accel, gyro, dt, PoseKey(key1), PoseKey(key2), noiseModel)); + add(IMUMeasurement(accel, gyro, dt, key1, key2, noiseModel)); } /* ************************************************************************* */ void Graph::addVelocityConstraint(Key key1, Key key2, double dt, const SharedNoiseModel& noiseModel) { - add(VelocityConstraint(PoseKey(key1), PoseKey(key2), dt, noiseModel)); + add(VelocityConstraint(key1, key2, dt, noiseModel)); } /* ************************************************************************* */ void Graph::addBetween(Key key1, Key key2, const PoseRTV& z, const SharedNoiseModel& noiseModel) { - add(Between(PoseKey(key1), PoseKey(key2), z, noiseModel)); + add(Between(key1, key2, z, noiseModel)); } /* ************************************************************************* */ void Graph::addRange(Key key1, Key key2, double z, const SharedNoiseModel& noiseModel) { - add(Range(PoseKey(key1), PoseKey(key2), z, noiseModel)); + add(Range(key1, key2, z, noiseModel)); } /* ************************************************************************* */ diff --git a/gtsam_unstable/dynamics/imuSystem.h b/gtsam_unstable/dynamics/imuSystem.h index b0bee8873..ef5437fdf 100644 --- a/gtsam_unstable/dynamics/imuSystem.h +++ b/gtsam_unstable/dynamics/imuSystem.h @@ -6,11 +6,6 @@ #pragma once -#include - -#include -#include -#include #include #include #include @@ -34,11 +29,6 @@ */ namespace imu { -using namespace gtsam; - -// Values: just poses -inline Symbol PoseKey(Index j) { return Symbol('x', j); } - struct Values : public gtsam::Values { typedef gtsam::Values Base; @@ -46,39 +36,39 @@ struct Values : public gtsam::Values { Values(const Values& values) : Base(values) {} Values(const Base& values) : Base(values) {} - void insertPose(Index key, const PoseRTV& pose) { insert(PoseKey(key), pose); } - PoseRTV pose(Index key) const { return at(PoseKey(key)); } + void insertPose(gtsam::Key key, const gtsam::PoseRTV& pose) { insert(key, pose); } + gtsam::PoseRTV pose(gtsam::Key key) const { return at(key); } }; // factors -typedef IMUFactor IMUMeasurement; // IMU between measurements -typedef FullIMUFactor FullIMUMeasurement; // Full-state IMU between measurements -typedef BetweenFactor Between; // full odometry (including velocity) -typedef NonlinearEquality Constraint; -typedef PriorFactor Prior; -typedef RangeFactor Range; +typedef gtsam::IMUFactor IMUMeasurement; // IMU between measurements +typedef gtsam::FullIMUFactor FullIMUMeasurement; // Full-state IMU between measurements +typedef gtsam::BetweenFactor Between; // full odometry (including velocity) +typedef gtsam::NonlinearEquality Constraint; +typedef gtsam::PriorFactor Prior; +typedef gtsam::RangeFactor Range; // graph components -struct Graph : public NonlinearFactorGraph { - typedef NonlinearFactorGraph Base; +struct Graph : public gtsam::NonlinearFactorGraph { + typedef gtsam::NonlinearFactorGraph Base; Graph() {} Graph(const Base& graph) : Base(graph) {} Graph(const Graph& graph) : Base(graph) {} // prior factors - void addPrior(size_t key, const PoseRTV& pose, const SharedNoiseModel& noiseModel); - void addConstraint(size_t key, const PoseRTV& pose); - void addHeightPrior(size_t key, double z, const SharedNoiseModel& noiseModel); + void addPrior(size_t key, const gtsam::PoseRTV& pose, const gtsam::SharedNoiseModel& noiseModel); + void addConstraint(size_t key, const gtsam::PoseRTV& pose); + void addHeightPrior(size_t key, double z, const gtsam::SharedNoiseModel& noiseModel); // inertial factors - void addFullIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel); - void addIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel); - void addVelocityConstraint(size_t key1, size_t key2, double dt, const SharedNoiseModel& noiseModel); + void addFullIMUMeasurement(size_t key1, size_t key2, const gtsam::Vector& accel, const gtsam::Vector& gyro, double dt, const gtsam::SharedNoiseModel& noiseModel); + void addIMUMeasurement(size_t key1, size_t key2, const gtsam::Vector& accel, const gtsam::Vector& gyro, double dt, const gtsam::SharedNoiseModel& noiseModel); + void addVelocityConstraint(size_t key1, size_t key2, double dt, const gtsam::SharedNoiseModel& noiseModel); // other measurements - void addBetween(size_t key1, size_t key2, const PoseRTV& z, const SharedNoiseModel& noiseModel); - void addRange(size_t key1, size_t key2, double z, const SharedNoiseModel& noiseModel); + void addBetween(size_t key1, size_t key2, const gtsam::PoseRTV& z, const gtsam::SharedNoiseModel& noiseModel); + void addRange(size_t key1, size_t key2, double z, const gtsam::SharedNoiseModel& noiseModel); // optimization Values optimize(const Values& init) const; diff --git a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp index 916d07559..783c420d4 100644 --- a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp +++ b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp @@ -3,6 +3,8 @@ * @author Alex Cunningham */ +#include + #include #include @@ -13,10 +15,9 @@ using namespace imu; const double tol=1e-5; +static const Key x0 = 0, x1 = 1, x2 = 2, x3 = 3, x4 = 4; static const Vector g = delta(3, 2, -9.81); -Key x1 = PoseKey(1), x2 = PoseKey(2), x3 = PoseKey(3), x4 = PoseKey(4); - /* ************************************************************************* */ TEST(testIMUSystem, instantiations) { // just checking for compilation @@ -149,14 +150,14 @@ TEST( testIMUSystem, linear_trajectory) { imu::Values true_traj, init_traj; Graph graph; - graph.add(Constraint(PoseKey(0), start)); - true_traj.insert(PoseKey(0), start); - init_traj.insert(PoseKey(0), start); + graph.add(Constraint(x0, start)); + true_traj.insert(x0, start); + init_traj.insert(x0, start); size_t nrPoses = 10; PoseRTV cur_pose = start; for (size_t i=1; i fg = example::createGaussianFactorGraph(ordering); @@ -275,6 +279,7 @@ TEST( GaussianFactor, matrix ) /* ************************************************************************* */ TEST( GaussianFactor, matrix_aug ) { + const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; FactorGraph fg = example::createGaussianFactorGraph(ordering); @@ -387,6 +392,7 @@ void print(const list& i) { TEST( GaussianFactor, size ) { // create a linear factor graph + const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); Ordering ordering; ordering += kx1,kx2,kl1; GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); From 9e26b32daa00f4181167f50ba7fa2180a01870f2 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 9 Jun 2012 19:43:14 +0000 Subject: [PATCH 305/914] Fixed Symbol problem - related to using std::numeric_limits::max() statically on keys created outside of functions --- .cproject | 8 ++++ gtsam/nonlinear/Symbol.cpp | 65 ++++++++++++++++--------------- gtsam/nonlinear/tests/testKey.cpp | 4 +- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/.cproject b/.cproject index af740032b..24c4afa85 100644 --- a/.cproject +++ b/.cproject @@ -703,6 +703,14 @@ true true + + make + -j5 + testKey.run + true + true + true + make -j5 diff --git a/gtsam/nonlinear/Symbol.cpp b/gtsam/nonlinear/Symbol.cpp index a161e2fd7..19cf78eb5 100644 --- a/gtsam/nonlinear/Symbol.cpp +++ b/gtsam/nonlinear/Symbol.cpp @@ -16,8 +16,6 @@ * @author: Richard Roberts */ -#pragma once - #include #include @@ -27,47 +25,50 @@ #include #include +#include #include #include namespace gtsam { - static const size_t keyBits = sizeof(Key) * 8; - static const size_t chrBits = sizeof(unsigned char) * 8; - static const size_t indexBits = keyBits - chrBits; - static const Key chrMask = Key(std::numeric_limits::max()) - << indexBits; - static const Key indexMask = ~chrMask; +static const size_t keyBits = sizeof(Key) * 8; +static const size_t chrBits = sizeof(unsigned char) * 8; +static const size_t indexBits = keyBits - chrBits; +static const Key chrMask = Key(UCHAR_MAX) << indexBits; // For some reason, std::numeric_limits::max() fails +static const Key indexMask = ~chrMask; - Symbol::Symbol(Key key) { - c_ = (unsigned char) ((key & chrMask) >> indexBits); - j_ = key & indexMask; - } +Symbol::Symbol(Key key) { + c_ = (unsigned char) ((key & chrMask) >> indexBits); + j_ = key & indexMask; +} - Key Symbol::key() const { - if (j_ > indexMask) - throw std::invalid_argument("Symbol index is too large"); - Key key = (Key(c_) << indexBits) | j_; - return key; - } +Key Symbol::key() const { + if (j_ > indexMask) { + boost::format msg("Symbol index is too large, j=%d, indexMask=%d"); + msg % j_ % indexMask; + throw std::invalid_argument(msg.str()); + } + Key key = (Key(c_) << indexBits) | j_; + return key; +} - void Symbol::print(const std::string& s) const { - std::cout << s << (std::string) (*this) << std::endl; - } +void Symbol::print(const std::string& s) const { + std::cout << s << (std::string) (*this) << std::endl; +} - bool Symbol::equals(const Symbol& expected, double tol) const { - return (*this) == expected; - } +bool Symbol::equals(const Symbol& expected, double tol) const { + return (*this) == expected; +} - Symbol::operator std::string() const { - return str(boost::format("%c%d") % c_ % j_); - } +Symbol::operator std::string() const { + return str(boost::format("%c%d") % c_ % j_); +} - boost::function Symbol::ChrTest(unsigned char c) { - namespace bl = boost::lambda; - return bl::bind(&Symbol::chr, bl::bind(bl::constructor(), bl::_1)) - == c; - } +boost::function Symbol::ChrTest(unsigned char c) { + namespace bl = boost::lambda; + return bl::bind(&Symbol::chr, bl::bind(bl::constructor(), bl::_1)) + == c; +} } // namespace gtsam diff --git a/gtsam/nonlinear/tests/testKey.cpp b/gtsam/nonlinear/tests/testKey.cpp index 601176935..ee9734af5 100644 --- a/gtsam/nonlinear/tests/testKey.cpp +++ b/gtsam/nonlinear/tests/testKey.cpp @@ -21,11 +21,11 @@ using namespace boost::assign; #include #include #include - + using namespace std; using namespace gtsam; -Key aKey = gtsam::symbol_shorthand::X(4); // FIXME: throws index too large exception in Symbol.key() +Key aKey = gtsam::symbol_shorthand::X(4); /* ************************************************************************* */ TEST(Key, KeySymbolConversion) { From 3d2c3aff05412c5e22593e6699a52b3d3eb55d63 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 9 Jun 2012 20:15:44 +0000 Subject: [PATCH 306/914] Moved all Simulated* example domains and smallExample to the tests folder so they are no longer installed --- gtsam.h | 4 +-- gtsam_unstable/CMakeLists.txt | 2 -- gtsam_unstable/slam/CMakeLists.txt | 26 ------------------- tests/CMakeLists.txt | 14 ++++++++-- {gtsam/slam => tests}/simulated2D.cpp | 2 +- {gtsam/slam => tests}/simulated2D.h | 0 .../slam => tests}/simulated2DConstraints.h | 2 +- {gtsam/slam => tests}/simulated2DOriented.cpp | 2 +- {gtsam/slam => tests}/simulated2DOriented.h | 0 .../slam => tests}/simulated3D.cpp | 2 +- {gtsam_unstable/slam => tests}/simulated3D.h | 0 {gtsam/slam => tests}/smallExample.cpp | 3 ++- {gtsam/slam => tests}/smallExample.h | 2 +- tests/testBoundingConstraint.cpp | 2 +- tests/testDoglegOptimizer.cpp | 2 +- tests/testGaussianBayesNet.cpp | 2 +- tests/testGaussianFactor.cpp | 2 +- tests/testGaussianFactorGraphB.cpp | 2 +- tests/testGaussianISAM.cpp | 2 +- tests/testGaussianISAM2.cpp | 2 +- tests/testGaussianJunctionTreeB.cpp | 2 +- tests/testInferenceB.cpp | 3 ++- tests/testNonlinearEquality.cpp | 3 ++- tests/testNonlinearFactor.cpp | 4 +-- tests/testNonlinearFactorGraph.cpp | 2 +- tests/testNonlinearOptimizer.cpp | 2 +- .../tests => tests}/testSerializationSLAM.cpp | 3 ++- .../slam/tests => tests}/testSimulated2D.cpp | 2 +- .../testSimulated2DOriented.cpp | 4 +-- .../slam/tests => tests}/testSimulated3D.cpp | 2 +- tests/testSubgraphPreconditioner.cpp | 2 +- tests/testSymbolicBayesNetB.cpp | 2 +- tests/testSymbolicFactorGraphB.cpp | 2 +- tests/timeGaussianFactorGraph.cpp | 2 +- 34 files changed, 47 insertions(+), 61 deletions(-) delete mode 100644 gtsam_unstable/slam/CMakeLists.txt rename {gtsam/slam => tests}/simulated2D.cpp (97%) rename {gtsam/slam => tests}/simulated2D.h (100%) rename {gtsam/slam => tests}/simulated2DConstraints.h (99%) rename {gtsam/slam => tests}/simulated2DOriented.cpp (96%) rename {gtsam/slam => tests}/simulated2DOriented.h (100%) rename {gtsam_unstable/slam => tests}/simulated3D.cpp (95%) rename {gtsam_unstable/slam => tests}/simulated3D.h (100%) rename {gtsam/slam => tests}/smallExample.cpp (99%) rename {gtsam/slam => tests}/smallExample.h (99%) rename {gtsam/slam/tests => tests}/testSerializationSLAM.cpp (99%) rename {gtsam/slam/tests => tests}/testSimulated2D.cpp (98%) rename {gtsam/slam/tests => tests}/testSimulated2DOriented.cpp (96%) rename {gtsam_unstable/slam/tests => tests}/testSimulated3D.cpp (97%) diff --git a/gtsam.h b/gtsam.h index 0e2367cc6..315071f65 100644 --- a/gtsam.h +++ b/gtsam.h @@ -834,7 +834,7 @@ class Odometry { // Simulated2D //************************************************************************* -#include +#include namespace simulated2D { class Values { @@ -856,7 +856,7 @@ class Graph { }///\namespace simulated2D // Simulated2DOriented Example Domain -#include +#include namespace simulated2DOriented { class Values { diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 7a7af3232..2d9f597bd 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -6,7 +6,6 @@ set (gtsam_unstable_subdirs dynamics linear nonlinear - slam ) add_custom_target(check.unstable COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) @@ -33,7 +32,6 @@ set(gtsam_unstable_srcs ${dynamics_srcs} ${linear_srcs} ${nonlinear_srcs} - ${slam_srcs} ) option (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam_unstable" ON) diff --git a/gtsam_unstable/slam/CMakeLists.txt b/gtsam_unstable/slam/CMakeLists.txt deleted file mode 100644 index afe453279..000000000 --- a/gtsam_unstable/slam/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -# Install headers -file(GLOB slam_headers "*.h") -install(FILES ${slam_headers} DESTINATION include/gtsam_unstable/slam) - -# Components to link tests in this subfolder against -set(slam_local_libs - slam_unstable - slam - nonlinear - linear - inference - geometry - base - ccolamd -) - -set (slam_full_libs - gtsam-static - gtsam_unstable-static) - -# Exclude tests that don't work -set (slam_excluded_tests "") - -# Add all tests -gtsam_add_subdir_tests(slam_unstable "${slam_local_libs}" "${slam_full_libs}" "${slam_excluded_tests}") -add_dependencies(check.unstable check.slam_unstable) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4d29dd557..9e4c501d4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,14 @@ +# Build a library of example domains, just for tests +file(GLOB test_lib_srcs "*.cpp") +file(GLOB test_srcs "test*.cpp") +file(GLOB time_srcs "time*.cpp") +list(REMOVE_ITEM test_lib_srcs ${test_srcs}) +list(REMOVE_ITEM test_lib_srcs ${time_srcs}) +add_library(test_lib STATIC ${test_lib_srcs}) + +# Assemble local libraries set(tests_local_libs + test_lib slam nonlinear linear @@ -24,7 +34,7 @@ if (GTSAM_BUILD_TESTS) # Build grouped tests gtsam_add_grouped_scripts("tests" # Use subdirectory as group label "test*.cpp" check "Test" # Standard for all tests - "${tests_local_libs}" "gtsam-static;CppUnitLite" "${tests_exclude}" # Pass in linking and exclusion lists + "${tests_local_libs}" "gtsam-static;CppUnitLite;test_lib" "${tests_exclude}" # Pass in linking and exclusion lists ${is_test}) # Set all as tests endif (GTSAM_BUILD_TESTS) @@ -37,6 +47,6 @@ if (GTSAM_BUILD_TIMING) # Build grouped benchmarks gtsam_add_grouped_scripts("tests" # Use subdirectory as group label "time*.cpp" timing "Timing Benchmark" # Standard for all timing scripts - "${tests_local_libs}" "gtsam-static;CppUnitLite" "${tests_exclude}" # Pass in linking and exclusion lists + "${tests_local_libs}" "gtsam-static;CppUnitLite;test_lib" "${tests_exclude}" # Pass in linking and exclusion lists ${is_test}) endif (GTSAM_BUILD_TIMING) diff --git a/gtsam/slam/simulated2D.cpp b/tests/simulated2D.cpp similarity index 97% rename from gtsam/slam/simulated2D.cpp rename to tests/simulated2D.cpp index 95dfef0e5..199a6756b 100644 --- a/gtsam/slam/simulated2D.cpp +++ b/tests/simulated2D.cpp @@ -15,7 +15,7 @@ * @author Frank Dellaert */ -#include +#include namespace simulated2D { diff --git a/gtsam/slam/simulated2D.h b/tests/simulated2D.h similarity index 100% rename from gtsam/slam/simulated2D.h rename to tests/simulated2D.h diff --git a/gtsam/slam/simulated2DConstraints.h b/tests/simulated2DConstraints.h similarity index 99% rename from gtsam/slam/simulated2DConstraints.h rename to tests/simulated2DConstraints.h index 4594a8e1f..cf0266d86 100644 --- a/gtsam/slam/simulated2DConstraints.h +++ b/tests/simulated2DConstraints.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include // \namespace diff --git a/gtsam/slam/simulated2DOriented.cpp b/tests/simulated2DOriented.cpp similarity index 96% rename from gtsam/slam/simulated2DOriented.cpp rename to tests/simulated2DOriented.cpp index 947aaddc5..c7d1d8469 100644 --- a/gtsam/slam/simulated2DOriented.cpp +++ b/tests/simulated2DOriented.cpp @@ -15,7 +15,7 @@ * @author Frank Dellaert */ -#include +#include namespace simulated2DOriented { diff --git a/gtsam/slam/simulated2DOriented.h b/tests/simulated2DOriented.h similarity index 100% rename from gtsam/slam/simulated2DOriented.h rename to tests/simulated2DOriented.h diff --git a/gtsam_unstable/slam/simulated3D.cpp b/tests/simulated3D.cpp similarity index 95% rename from gtsam_unstable/slam/simulated3D.cpp rename to tests/simulated3D.cpp index 933d1f194..980b6cabd 100644 --- a/gtsam_unstable/slam/simulated3D.cpp +++ b/tests/simulated3D.cpp @@ -15,7 +15,7 @@ * @author Alex Cunningham **/ -#include +#include namespace gtsam { diff --git a/gtsam_unstable/slam/simulated3D.h b/tests/simulated3D.h similarity index 100% rename from gtsam_unstable/slam/simulated3D.h rename to tests/simulated3D.h diff --git a/gtsam/slam/smallExample.cpp b/tests/smallExample.cpp similarity index 99% rename from gtsam/slam/smallExample.cpp rename to tests/smallExample.cpp index 9937847ae..b518bebe5 100644 --- a/gtsam/slam/smallExample.cpp +++ b/tests/smallExample.cpp @@ -17,7 +17,6 @@ * @author Frank dellaert */ -#include #include #include #include @@ -25,6 +24,8 @@ #include #include +#include + #include #include diff --git a/gtsam/slam/smallExample.h b/tests/smallExample.h similarity index 99% rename from gtsam/slam/smallExample.h rename to tests/smallExample.h index 3b3b200b8..161c45da8 100644 --- a/gtsam/slam/smallExample.h +++ b/tests/smallExample.h @@ -21,7 +21,7 @@ #pragma once -#include +#include #include #include #include diff --git a/tests/testBoundingConstraint.cpp b/tests/testBoundingConstraint.cpp index 3956b2934..128251a23 100644 --- a/tests/testBoundingConstraint.cpp +++ b/tests/testBoundingConstraint.cpp @@ -15,7 +15,7 @@ * @author Alex Cunningham */ -#include +#include #include #include #include diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index 529b1b2f1..9a4f6bf25 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -16,7 +16,7 @@ */ #include -#include +#include #include #include #include diff --git a/tests/testGaussianBayesNet.cpp b/tests/testGaussianBayesNet.cpp index 8444dacc3..60af529ec 100644 --- a/tests/testGaussianBayesNet.cpp +++ b/tests/testGaussianBayesNet.cpp @@ -29,7 +29,7 @@ using namespace boost::assign; #include #include #include -#include +#include using namespace std; using namespace gtsam; diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index 077dc44be..bc0040f37 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -16,7 +16,7 @@ * @author Frank Dellaert **/ -#include +#include #include #include #include diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 0f76af4f6..718dbc302 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -15,7 +15,7 @@ * @author Christian Potthast **/ -#include +#include #include #include #include diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index 03a747196..a6eccd70f 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -15,7 +15,7 @@ * @author Michael Kaess */ -#include +#include #include #include #include diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index c74dbe276..c79e4e8fc 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 03e2d27d3..5b7555d37 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -15,7 +15,7 @@ * @author nikai */ -#include +#include #include #include #include diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index c054b9b6a..81b24a1e7 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -20,9 +20,10 @@ #include #include #include -#include #include +#include + using namespace std; using namespace gtsam; diff --git a/tests/testNonlinearEquality.cpp b/tests/testNonlinearEquality.cpp index 2b35e9f60..9a139e581 100644 --- a/tests/testNonlinearEquality.cpp +++ b/tests/testNonlinearEquality.cpp @@ -14,8 +14,9 @@ * @author Alex Cunningham */ +#include + #include -#include #include #include #include diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index e203bcf94..00fa217c6 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -28,8 +28,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include diff --git a/tests/testNonlinearFactorGraph.cpp b/tests/testNonlinearFactorGraph.cpp index d1d240a67..7d9160c1d 100644 --- a/tests/testNonlinearFactorGraph.cpp +++ b/tests/testNonlinearFactorGraph.cpp @@ -29,7 +29,7 @@ using namespace boost::assign; #include #include -#include +#include #include #include #include diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index 7cb8bb045..ee681db3e 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -15,7 +15,7 @@ * @author Frank Dellaert */ -#include +#include #include #include #include diff --git a/gtsam/slam/tests/testSerializationSLAM.cpp b/tests/testSerializationSLAM.cpp similarity index 99% rename from gtsam/slam/tests/testSerializationSLAM.cpp rename to tests/testSerializationSLAM.cpp index 275abe1b8..7650925d1 100644 --- a/gtsam/slam/tests/testSerializationSLAM.cpp +++ b/tests/testSerializationSLAM.cpp @@ -16,7 +16,8 @@ * @date Feb 7, 2012 */ -#include +#include + #include #include #include diff --git a/gtsam/slam/tests/testSimulated2D.cpp b/tests/testSimulated2D.cpp similarity index 98% rename from gtsam/slam/tests/testSimulated2D.cpp rename to tests/testSimulated2D.cpp index b72a8f4c0..165177a56 100644 --- a/gtsam/slam/tests/testSimulated2D.cpp +++ b/tests/testSimulated2D.cpp @@ -21,7 +21,7 @@ #include #include -#include +#include using namespace std; using namespace gtsam; diff --git a/gtsam/slam/tests/testSimulated2DOriented.cpp b/tests/testSimulated2DOriented.cpp similarity index 96% rename from gtsam/slam/tests/testSimulated2DOriented.cpp rename to tests/testSimulated2DOriented.cpp index d017512ce..24fe6ec4e 100644 --- a/gtsam/slam/tests/testSimulated2DOriented.cpp +++ b/tests/testSimulated2DOriented.cpp @@ -16,8 +16,8 @@ * @brief unit tests for simulated2DOriented */ -#include -#include +#include +#include #include #include #include diff --git a/gtsam_unstable/slam/tests/testSimulated3D.cpp b/tests/testSimulated3D.cpp similarity index 97% rename from gtsam_unstable/slam/tests/testSimulated3D.cpp rename to tests/testSimulated3D.cpp index 7283544a1..be9548a8e 100644 --- a/gtsam_unstable/slam/tests/testSimulated3D.cpp +++ b/tests/testSimulated3D.cpp @@ -15,7 +15,7 @@ * @author Alex Cunningham **/ -#include +#include #include #include #include diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index 747e35914..0f18924da 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -16,7 +16,7 @@ **/ #include -#include +#include #include #include #include diff --git a/tests/testSymbolicBayesNetB.cpp b/tests/testSymbolicBayesNetB.cpp index 4f0d04595..f2e9772ec 100644 --- a/tests/testSymbolicBayesNetB.cpp +++ b/tests/testSymbolicBayesNetB.cpp @@ -22,7 +22,7 @@ using namespace boost::assign; #include #include -#include +#include #include #include #include diff --git a/tests/testSymbolicFactorGraphB.cpp b/tests/testSymbolicFactorGraphB.cpp index 8fde094ed..7d657c9bf 100644 --- a/tests/testSymbolicFactorGraphB.cpp +++ b/tests/testSymbolicFactorGraphB.cpp @@ -15,7 +15,7 @@ * @author Frank Dellaert */ -#include +#include #include #include #include diff --git a/tests/timeGaussianFactorGraph.cpp b/tests/timeGaussianFactorGraph.cpp index aff3ff150..f8d76c1dd 100644 --- a/tests/timeGaussianFactorGraph.cpp +++ b/tests/timeGaussianFactorGraph.cpp @@ -19,7 +19,7 @@ #include #include // for operator += in Ordering #include -#include +#include #include using namespace std; From b602e75a995a41a3e1eab75334e3dbd9f8174a9d Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 9 Jun 2012 21:06:06 +0000 Subject: [PATCH 307/914] Removed the use of the ADD_CLONE_NONLINEAR_FACTOR macro, documented instances of clone() in factors --- examples/LocalizationExample2.cpp | 2 -- gtsam/nonlinear/NonlinearEquality.h | 15 +++++++-- gtsam/nonlinear/NonlinearFactor.h | 3 +- gtsam/nonlinear/WhiteNoiseFactor.h | 5 ++- gtsam/slam/AntiFactor.h | 5 ++- gtsam/slam/BearingFactor.h | 5 ++- gtsam/slam/BearingRangeFactor.h | 5 ++- gtsam/slam/BetweenFactor.h | 5 ++- gtsam/slam/GeneralSFMFactor.h | 5 ++- gtsam/slam/PartialPriorFactor.h | 5 ++- gtsam/slam/PriorFactor.h | 5 ++- gtsam/slam/ProjectionFactor.h | 5 ++- gtsam/slam/RangeFactor.h | 5 ++- gtsam/slam/StereoFactor.h | 5 ++- gtsam_unstable/dynamics/FullIMUFactor.h | 7 ++-- gtsam_unstable/dynamics/IMUFactor.h | 7 ++-- gtsam_unstable/dynamics/VelocityConstraint.h | 5 ++- gtsam_unstable/nonlinear/LinearizedFactor.h | 5 ++- tests/simulated2D.h | 15 +++++++-- tests/simulated2DConstraints.h | 35 ++++++++++++-------- tests/simulated2DOriented.h | 5 ++- tests/smallExample.cpp | 2 -- tests/testExtendedKalmanFilter.cpp | 4 --- tests/testNonlinearFactor.cpp | 7 ++-- 24 files changed, 117 insertions(+), 50 deletions(-) diff --git a/examples/LocalizationExample2.cpp b/examples/LocalizationExample2.cpp index 9a4330181..ea651008c 100644 --- a/examples/LocalizationExample2.cpp +++ b/examples/LocalizationExample2.cpp @@ -47,8 +47,6 @@ public: if (H) (*H) = Matrix_(2,3, 1.0,0.0,0.0, 0.0,1.0,0.0); return Vector_(2, q.x() - mx_, q.y() - my_); } - - ADD_CLONE_NONLINEAR_FACTOR(UnaryFactor) }; /** diff --git a/gtsam/nonlinear/NonlinearEquality.h b/gtsam/nonlinear/NonlinearEquality.h index e9710c780..e5f419ff4 100644 --- a/gtsam/nonlinear/NonlinearEquality.h +++ b/gtsam/nonlinear/NonlinearEquality.h @@ -161,7 +161,10 @@ namespace gtsam { return GaussianFactor::shared_ptr(new JacobianFactor(ordering[this->key()], A, b, model)); } - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /// @} @@ -212,7 +215,10 @@ namespace gtsam { virtual ~NonlinearEquality1() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** g(x) with optional derivative */ Vector evaluateError(const X& x1, boost::optional H = boost::none) const { @@ -269,7 +275,10 @@ namespace gtsam { : Base(noiseModel::Constrained::All(X::Dim(), fabs(mu)), key1, key2) {} virtual ~NonlinearEquality2() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** g(x) with optional derivative2 */ Vector evaluateError(const X& x1, const X& x2, diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 8251bff59..a01cead24 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -36,9 +36,10 @@ /** * Macro to add a standard clone function to a derived factor + * @DEPRECIATED: will go away shortly - just add the clone function directly */ #define ADD_CLONE_NONLINEAR_FACTOR(Derived) \ - virtual gtsam::NonlinearFactor::shared_ptr clone() const { \ + virtual gtsam::NonlinearFactor::shared_ptr clone() const { \ return boost::static_pointer_cast( \ gtsam::NonlinearFactor::shared_ptr(new Derived(*this))); } diff --git a/gtsam/nonlinear/WhiteNoiseFactor.h b/gtsam/nonlinear/WhiteNoiseFactor.h index f37debd54..163633115 100644 --- a/gtsam/nonlinear/WhiteNoiseFactor.h +++ b/gtsam/nonlinear/WhiteNoiseFactor.h @@ -163,7 +163,10 @@ namespace gtsam { return linearize(z_, u, p, j1, j2); } - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /// @} diff --git a/gtsam/slam/AntiFactor.h b/gtsam/slam/AntiFactor.h index 47e0fd40c..1e0d64db7 100644 --- a/gtsam/slam/AntiFactor.h +++ b/gtsam/slam/AntiFactor.h @@ -50,7 +50,10 @@ namespace gtsam { virtual ~AntiFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** implement functions needed for Testable */ diff --git a/gtsam/slam/BearingFactor.h b/gtsam/slam/BearingFactor.h index edd484e36..251e37a37 100644 --- a/gtsam/slam/BearingFactor.h +++ b/gtsam/slam/BearingFactor.h @@ -55,7 +55,10 @@ namespace gtsam { virtual ~BearingFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** h(x)-z -> between(z,h(x)) for Rot2 manifold */ Vector evaluateError(const Pose& pose, const Point& point, diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index 0bfa86540..3ce671292 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -57,7 +57,10 @@ namespace gtsam { virtual ~BearingRangeFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** Print */ virtual void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { diff --git a/gtsam/slam/BetweenFactor.h b/gtsam/slam/BetweenFactor.h index 62f66cc48..1779bf286 100644 --- a/gtsam/slam/BetweenFactor.h +++ b/gtsam/slam/BetweenFactor.h @@ -62,7 +62,10 @@ namespace gtsam { virtual ~BetweenFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** implement functions needed for Testable */ diff --git a/gtsam/slam/GeneralSFMFactor.h b/gtsam/slam/GeneralSFMFactor.h index d64585b7d..f4615c334 100644 --- a/gtsam/slam/GeneralSFMFactor.h +++ b/gtsam/slam/GeneralSFMFactor.h @@ -62,7 +62,10 @@ namespace gtsam { virtual ~GeneralSFMFactor() {} ///< destructor - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** * print diff --git a/gtsam/slam/PartialPriorFactor.h b/gtsam/slam/PartialPriorFactor.h index 215f87ef7..bea3f3f46 100644 --- a/gtsam/slam/PartialPriorFactor.h +++ b/gtsam/slam/PartialPriorFactor.h @@ -87,7 +87,10 @@ namespace gtsam { this->fillH(); } - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** implement functions needed for Testable */ diff --git a/gtsam/slam/PriorFactor.h b/gtsam/slam/PriorFactor.h index 608e717dd..094065336 100644 --- a/gtsam/slam/PriorFactor.h +++ b/gtsam/slam/PriorFactor.h @@ -56,7 +56,10 @@ namespace gtsam { Base(model, key), prior_(prior) { } - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** implement functions needed for Testable */ diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index c6529a34f..5a871d96f 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -70,7 +70,10 @@ namespace gtsam { /** Virtual destructor */ virtual ~GenericProjectionFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** * print diff --git a/gtsam/slam/RangeFactor.h b/gtsam/slam/RangeFactor.h index ee3dc0b8e..dcc94476a 100644 --- a/gtsam/slam/RangeFactor.h +++ b/gtsam/slam/RangeFactor.h @@ -51,7 +51,10 @@ namespace gtsam { virtual ~RangeFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** h(x)-z */ Vector evaluateError(const Pose& pose, const Point& point, boost::optional H1, boost::optional H2) const { diff --git a/gtsam/slam/StereoFactor.h b/gtsam/slam/StereoFactor.h index 500009ab4..d0c0bda6a 100644 --- a/gtsam/slam/StereoFactor.h +++ b/gtsam/slam/StereoFactor.h @@ -57,7 +57,10 @@ public: virtual ~GenericStereoFactor() {} ///< Virtual destructor - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** * print diff --git a/gtsam_unstable/dynamics/FullIMUFactor.h b/gtsam_unstable/dynamics/FullIMUFactor.h index 306ec5191..c9a75ec23 100644 --- a/gtsam_unstable/dynamics/FullIMUFactor.h +++ b/gtsam_unstable/dynamics/FullIMUFactor.h @@ -51,11 +51,14 @@ public: virtual ~FullIMUFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** Check if two factors are equal */ virtual bool equals(const NonlinearFactor& e, double tol = 1e-9) const { - const This* const f = dynamic_cast(&e); + const This* const f = dynamic_cast(&e); return f && Base::equals(e) && equal_with_abs_tol(accel_, f->accel_, tol) && equal_with_abs_tol(gyro_, f->gyro_, tol) && diff --git a/gtsam_unstable/dynamics/IMUFactor.h b/gtsam_unstable/dynamics/IMUFactor.h index b1ccdb3bc..adcf772e3 100644 --- a/gtsam_unstable/dynamics/IMUFactor.h +++ b/gtsam_unstable/dynamics/IMUFactor.h @@ -44,11 +44,14 @@ public: virtual ~IMUFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** Check if two factors are equal */ virtual bool equals(const NonlinearFactor& e, double tol = 1e-9) const { - const This* const f = dynamic_cast(&e); + const This* const f = dynamic_cast(&e); return f && Base::equals(e) && equal_with_abs_tol(accel_, f->accel_, tol) && equal_with_abs_tol(gyro_, f->gyro_, tol) && diff --git a/gtsam_unstable/dynamics/VelocityConstraint.h b/gtsam_unstable/dynamics/VelocityConstraint.h index 7646b7486..801bf12cd 100644 --- a/gtsam_unstable/dynamics/VelocityConstraint.h +++ b/gtsam_unstable/dynamics/VelocityConstraint.h @@ -72,7 +72,10 @@ public: virtual ~VelocityConstraint() {} - ADD_CLONE_NONLINEAR_FACTOR(VelocityConstraint) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new VelocityConstraint(*this))); } /** * Calculates the error for trapezoidal model given diff --git a/gtsam_unstable/nonlinear/LinearizedFactor.h b/gtsam_unstable/nonlinear/LinearizedFactor.h index 3fa46701d..8f9461d02 100644 --- a/gtsam_unstable/nonlinear/LinearizedFactor.h +++ b/gtsam_unstable/nonlinear/LinearizedFactor.h @@ -59,7 +59,10 @@ public: virtual ~LinearizedFactor() {} - ADD_CLONE_NONLINEAR_FACTOR(This); + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** * Use this constructor with pre-constructed decoders diff --git a/tests/simulated2D.h b/tests/simulated2D.h index 403fac109..c5a62bba9 100644 --- a/tests/simulated2D.h +++ b/tests/simulated2D.h @@ -135,7 +135,10 @@ namespace simulated2D { virtual ~GenericPrior() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } private: @@ -178,7 +181,10 @@ namespace simulated2D { virtual ~GenericOdometry() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } private: @@ -222,7 +228,10 @@ namespace simulated2D { virtual ~GenericMeasurement() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } private: diff --git a/tests/simulated2DConstraints.h b/tests/simulated2DConstraints.h index cf0266d86..b9f2edcb5 100644 --- a/tests/simulated2DConstraints.h +++ b/tests/simulated2DConstraints.h @@ -59,7 +59,10 @@ namespace simulated2D { virtual ~ScalarCoordConstraint1() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** * Constructor for constraint @@ -69,8 +72,8 @@ namespace simulated2D { * @param mu is the penalty function gain */ ScalarCoordConstraint1(Key key, double c, - bool isGreaterThan, double mu = 1000.0) : - Base(key, c, isGreaterThan, mu) { + bool isGreaterThan, double mu = 1000.0) : + Base(key, c, isGreaterThan, mu) { } /** @@ -124,7 +127,10 @@ namespace simulated2D { virtual ~MaxDistanceConstraint() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } /** * Primary constructor for factor @@ -163,18 +169,21 @@ namespace simulated2D { */ template struct MinDistanceConstraint : public BoundingConstraint2 { - typedef BoundingConstraint2 Base; ///< Base class for factor - typedef MinDistanceConstraint This; ///< This class for factor - typedef POSE Pose; ///< Type of pose variable constrained - typedef POINT Point; ///< Type of point variable constrained + typedef BoundingConstraint2 Base; ///< Base class for factor + typedef MinDistanceConstraint This; ///< This class for factor + typedef POSE Pose; ///< Type of pose variable constrained + typedef POINT Point; ///< Type of point variable constrained - virtual ~MinDistanceConstraint() {} + virtual ~MinDistanceConstraint() {} - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } - /** - * Primary constructor for factor - * @param key1 is the first variable key + /** + * Primary constructor for factor + * @param key1 is the first variable key * @param key2 is the second variable key * @param range_bound is the minimum range allowed between the variables * @param mu is the gain for the penalty function diff --git a/tests/simulated2DOriented.h b/tests/simulated2DOriented.h index ed0d8ba1a..ef8378fc5 100644 --- a/tests/simulated2DOriented.h +++ b/tests/simulated2DOriented.h @@ -118,7 +118,10 @@ namespace simulated2DOriented { return measured_.localCoordinates(odo(x1, x2, H1, H2)); } - ADD_CLONE_NONLINEAR_FACTOR(This) + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } }; diff --git a/tests/smallExample.cpp b/tests/smallExample.cpp index b518bebe5..3dd0324dc 100644 --- a/tests/smallExample.cpp +++ b/tests/smallExample.cpp @@ -210,8 +210,6 @@ namespace example { return (h(x) - z_).vector(); } - ADD_CLONE_NONLINEAR_FACTOR(UnaryFactor) - }; } diff --git a/tests/testExtendedKalmanFilter.cpp b/tests/testExtendedKalmanFilter.cpp index 440119e66..c19bcd4c9 100644 --- a/tests/testExtendedKalmanFilter.cpp +++ b/tests/testExtendedKalmanFilter.cpp @@ -125,8 +125,6 @@ public: virtual ~NonlinearMotionModel() {} - ADD_CLONE_NONLINEAR_FACTOR(This) - // Calculate the next state prediction using the nonlinear function f() T f(const T& x_t0) const { @@ -269,8 +267,6 @@ public: virtual ~NonlinearMeasurementModel() {} - ADD_CLONE_NONLINEAR_FACTOR(This) - // Calculate the predicted measurement using the nonlinear function h() // Byproduct: updates Jacobian H, and noiseModel (R) Vector h(const T& x_t1) const { diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index 00fa217c6..0a9c59f8b 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -257,7 +257,9 @@ public: return (Vector(1) << x1 + x2 + x3 + x4).finished(); } - ADD_CLONE_NONLINEAR_FACTOR(TestFactor4) + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new TestFactor4(*this))); } }; /* ************************************ */ @@ -305,8 +307,6 @@ public: } return (Vector(1) << x1 + x2 + x3 + x4 + x5).finished(); } - - ADD_CLONE_NONLINEAR_FACTOR(TestFactor5) }; /* ************************************ */ @@ -360,7 +360,6 @@ public: return (Vector(1) << x1 + x2 + x3 + x4 + x5 + x6).finished(); } - ADD_CLONE_NONLINEAR_FACTOR(TestFactor6) }; /* ************************************ */ From f9db53fdb8936a8d1d4d0347060ed3750f7068f4 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 21:31:22 +0000 Subject: [PATCH 308/914] cleaned up code a bit --- gtsam/discrete/DecisionTreeFactor.cpp | 4 +-- gtsam/inference/SymbolicFactorGraph.cpp | 27 ++++++++------------ gtsam/linear/GaussianBayesNet.cpp | 33 +++++++++++++------------ gtsam/slam/visualSLAM.cpp | 25 +++++++++---------- 4 files changed, 40 insertions(+), 49 deletions(-) diff --git a/gtsam/discrete/DecisionTreeFactor.cpp b/gtsam/discrete/DecisionTreeFactor.cpp index 105ff3a38..7f566a115 100644 --- a/gtsam/discrete/DecisionTreeFactor.cpp +++ b/gtsam/discrete/DecisionTreeFactor.cpp @@ -22,6 +22,7 @@ #include #include +#include using namespace std; @@ -94,8 +95,7 @@ namespace gtsam { Index j = keys()[i]; dkeys.push_back(DiscreteKey(j,cardinality(j))); } - shared_ptr f(new DecisionTreeFactor(dkeys, result)); - return f; + return boost::make_shared(dkeys, result); } /* ************************************************************************* */ diff --git a/gtsam/inference/SymbolicFactorGraph.cpp b/gtsam/inference/SymbolicFactorGraph.cpp index 2ae0b483a..514ba156b 100644 --- a/gtsam/inference/SymbolicFactorGraph.cpp +++ b/gtsam/inference/SymbolicFactorGraph.cpp @@ -15,13 +15,13 @@ * @author Frank Dellaert */ -#include - #include #include #include #include +#include + namespace gtsam { using namespace std; @@ -32,26 +32,22 @@ namespace gtsam { /* ************************************************************************* */ void SymbolicFactorGraph::push_factor(Index key) { - boost::shared_ptr factor(new IndexFactor(key)); - push_back(factor); + push_back(boost::make_shared(key)); } /** Push back binary factor */ void SymbolicFactorGraph::push_factor(Index key1, Index key2) { - boost::shared_ptr factor(new IndexFactor(key1,key2)); - push_back(factor); + push_back(boost::make_shared(key1,key2)); } /** Push back ternary factor */ void SymbolicFactorGraph::push_factor(Index key1, Index key2, Index key3) { - boost::shared_ptr factor(new IndexFactor(key1,key2,key3)); - push_back(factor); + push_back(boost::make_shared(key1,key2,key3)); } /** Push back 4-way factor */ void SymbolicFactorGraph::push_factor(Index key1, Index key2, Index key3, Index key4) { - boost::shared_ptr factor(new IndexFactor(key1,key2,key3,key4)); - push_back(factor); + push_back(boost::make_shared(key1,key2,key3,key4)); } /* ************************************************************************* */ @@ -66,7 +62,7 @@ namespace gtsam { /* ************************************************************************* */ IndexFactor::shared_ptr CombineSymbolic( const FactorGraph& factors, const FastMap >& variableSlots) { + vector >& variableSlots) { IndexFactor::shared_ptr combined(Combine (factors, variableSlots)); // combined->assertInvariants(); return combined; @@ -84,12 +80,9 @@ namespace gtsam { if (keys.size() < 1) throw invalid_argument( "IndexFactor::CombineAndEliminate called on factors with no variables."); - pair result; - std::vector newKeys(keys.begin(),keys.end()); - result.first.reset(new IndexConditional(newKeys, nrFrontals)); - result.second.reset(new IndexFactor(newKeys.begin()+nrFrontals, newKeys.end())); - - return result; + vector newKeys(keys.begin(), keys.end()); + return make_pair(new IndexConditional(newKeys, nrFrontals), + new IndexFactor(newKeys.begin() + nrFrontals, newKeys.end())); } /* ************************************************************************* */ diff --git a/gtsam/linear/GaussianBayesNet.cpp b/gtsam/linear/GaussianBayesNet.cpp index 62b63bb27..d1f0d8f8d 100644 --- a/gtsam/linear/GaussianBayesNet.cpp +++ b/gtsam/linear/GaussianBayesNet.cpp @@ -15,19 +15,20 @@ * @author Frank Dellaert */ -#include +#include +#include +#include +#include + #include +#include #include -#include -#include -#include - -#include +#include using namespace std; using namespace gtsam; - +using boost::shared_ptr; // trick from some reading group #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL) @@ -72,13 +73,13 @@ void push_front(GaussianBayesNet& bn, Index key, Vector d, Matrix R, } /* ************************************************************************* */ -boost::shared_ptr allocateVectorValues(const GaussianBayesNet& bn) { +shared_ptr allocateVectorValues(const GaussianBayesNet& bn) { vector dimensions(bn.size()); Index var = 0; - BOOST_FOREACH(const boost::shared_ptr conditional, bn) { + BOOST_FOREACH(const shared_ptr conditional, bn) { dimensions[var++] = conditional->dim(); } - return boost::shared_ptr(new VectorValues(dimensions)); + return shared_ptr(new VectorValues(dimensions)); } /* ************************************************************************* */ @@ -92,7 +93,7 @@ VectorValues optimize(const GaussianBayesNet& bn) { // (R*x)./sigmas = y by solving x=inv(R)*(y.*sigmas) void optimizeInPlace(const GaussianBayesNet& bn, VectorValues& x) { /** solve each node in turn in topological sort order (parents first)*/ - BOOST_REVERSE_FOREACH(const boost::shared_ptr cg, bn) { + BOOST_REVERSE_FOREACH(const shared_ptr cg, bn) { // i^th part of R*x=y, x=inv(R)*y // (Rii*xi + R_i*x(i+1:))./si = yi <-> xi = inv(Rii)*(yi.*si - R_i*x(i+1:)) cg->solveInPlace(x); @@ -102,14 +103,14 @@ void optimizeInPlace(const GaussianBayesNet& bn, VectorValues& x) { /* ************************************************************************* */ VectorValues backSubstitute(const GaussianBayesNet& bn, const VectorValues& input) { VectorValues output = input; - BOOST_REVERSE_FOREACH(const boost::shared_ptr cg, bn) { + BOOST_REVERSE_FOREACH(const shared_ptr cg, bn) { const Index key = *(cg->beginFrontals()); Vector xS = internal::extractVectorValuesSlices(output, cg->beginParents(), cg->endParents()); xS = input[key] - cg->get_S() * xS; output[key] = cg->get_R().triangularView().solve(xS); } - BOOST_FOREACH(const boost::shared_ptr cg, bn) { + BOOST_FOREACH(const shared_ptr cg, bn) { cg->scaleFrontalsBySigma(output); } @@ -130,7 +131,7 @@ VectorValues backSubstituteTranspose(const GaussianBayesNet& bn, // we loop from first-eliminated to last-eliminated // i^th part of L*gy=gx is done block-column by block-column of L - BOOST_FOREACH(const boost::shared_ptr cg, bn) + BOOST_FOREACH(const shared_ptr cg, bn) cg->solveTransposeInPlace(gy); // Scale gy @@ -196,7 +197,7 @@ pair matrix(const GaussianBayesNet& bn) { Index key; size_t I; FOREACH_PAIR(key,I,mapping) { // find corresponding conditional - boost::shared_ptr cg = bn[key]; + shared_ptr cg = bn[key]; // get sigmas Vector sigmas = cg->get_sigmas(); @@ -233,7 +234,7 @@ pair matrix(const GaussianBayesNet& bn) { double determinant(const GaussianBayesNet& bayesNet) { double logDet = 0.0; - BOOST_FOREACH(boost::shared_ptr cg, bayesNet){ + BOOST_FOREACH(shared_ptr cg, bayesNet){ logDet += cg->get_R().diagonal().unaryExpr(ptr_fun(log)).sum(); } diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 1331ef20f..bb3cd19d1 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -17,6 +17,9 @@ #include #include +#include + +using boost::make_shared; namespace visualSLAM { @@ -62,49 +65,43 @@ namespace visualSLAM { /* ************************************************************************* */ void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrK K) { - boost::shared_ptr factor(new ProjectionFactor(measured, model, poseKey, pointKey, K)); - push_back(factor); + push_back(make_shared(measured, model, poseKey, pointKey, K)); } /* ************************************************************************* */ void Graph::addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrKStereo K) { - boost::shared_ptr factor(new StereoFactor(measured, model, poseKey, pointKey, K)); - push_back(factor); + push_back(make_shared(measured, model, poseKey, pointKey, K)); } /* ************************************************************************* */ void Graph::addPoseConstraint(Key poseKey, const Pose3& p) { - boost::shared_ptr factor(new PoseConstraint(poseKey, p)); - push_back(factor); + push_back(make_shared(poseKey, p)); } /* ************************************************************************* */ void Graph::addPointConstraint(Key pointKey, const Point3& p) { - boost::shared_ptr factor(new PointConstraint(pointKey, p)); - push_back(factor); + push_back(make_shared(pointKey, p)); } /* ************************************************************************* */ void Graph::addPosePrior(Key poseKey, const Pose3& p, const SharedNoiseModel& model) { - boost::shared_ptr factor(new PosePrior(poseKey, p, model)); - push_back(factor); + push_back(make_shared(poseKey, p, model)); } /* ************************************************************************* */ void Graph::addPointPrior(Key pointKey, const Point3& p, const SharedNoiseModel& model) { - boost::shared_ptr factor(new PointPrior(pointKey, p, model)); - push_back(factor); + push_back(make_shared(pointKey, p, model)); } /* ************************************************************************* */ void Graph::addRangeFactor(Key poseKey, Key pointKey, double range, const SharedNoiseModel& model) { - push_back(boost::shared_ptr(new RangeFactor(poseKey, pointKey, range, model))); + push_back(make_shared(poseKey, pointKey, range, model)); } /* ************************************************************************* */ void Graph::addOdometry(Key x1, Key x2, const Pose3& odometry, const SharedNoiseModel& model) { - push_back(boost::shared_ptr >(new BetweenFactor(x1, x2, odometry, model))); + push_back(make_shared >(x1, x2, odometry, model)); } /* ************************************************************************* */ From 80e2179a8db6e4582fb142d67f7bfeab784f55b7 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 9 Jun 2012 21:33:10 +0000 Subject: [PATCH 309/914] Cleaned up typedefs in FactorGraph.h (and removed FactorizationResult), and also made sure ::shared_ptr was never assumed to exist for a FACTOR template argument. Should it exist, ever? --- gtsam/inference/EliminationTree-inl.h | 2 +- gtsam/inference/EliminationTree.h | 2 +- gtsam/inference/FactorGraph-inl.h | 22 +++-- gtsam/inference/FactorGraph.h | 81 +++++++---------- .../inference/GenericMultifrontalSolver-inl.h | 2 +- gtsam/inference/GenericMultifrontalSolver.h | 2 +- gtsam/inference/GenericSequentialSolver-inl.h | 8 +- gtsam/inference/GenericSequentialSolver.h | 2 +- gtsam/inference/inference-inl.h | 25 +++--- gtsam/inference/inference.h | 88 ++++++++++--------- gtsam/linear/GaussianFactorGraph.h | 2 +- tests/testGaussianFactorGraphB.cpp | 12 +-- 12 files changed, 126 insertions(+), 122 deletions(-) diff --git a/gtsam/inference/EliminationTree-inl.h b/gtsam/inference/EliminationTree-inl.h index 2f62f79af..c4cb9d4cf 100644 --- a/gtsam/inference/EliminationTree-inl.h +++ b/gtsam/inference/EliminationTree-inl.h @@ -132,7 +132,7 @@ typename EliminationTree::shared_ptr EliminationTree::Create( // Hang factors in right places tic(3, "hang factors"); - BOOST_FOREACH(const typename DERIVEDFACTOR::shared_ptr& derivedFactor, factorGraph) { + BOOST_FOREACH(const typename boost::shared_ptr& derivedFactor, factorGraph) { // Here we upwards-cast to the factor type of this EliminationTree. This // allows performing symbolic elimination on, for example, GaussianFactors. if(derivedFactor) { diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index eb45deaf0..6ab7dcf49 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -52,7 +52,7 @@ public: typedef EliminationTree This; ///< This class typedef boost::shared_ptr shared_ptr; ///< Shared pointer to this class - typedef typename FACTOR::shared_ptr sharedFactor; ///< Shared pointer to a factor + typedef typename boost::shared_ptr sharedFactor; ///< Shared pointer to a factor typedef gtsam::BayesNet BayesNet; ///< The BayesNet corresponding to FACTOR /** Typedef for an eliminate subroutine */ diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 8da4465d5..90212f39f 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -36,6 +36,16 @@ namespace gtsam { + /* ************************************************************************* */ + template + template + FactorGraph::FactorGraph(const BayesNet& bayesNet) { + factors_.reserve(bayesNet.size()); + BOOST_FOREACH(const typename CONDITIONAL::shared_ptr& cond, bayesNet) { + this->push_back(cond->toFactor()); + } + } + /* ************************************************************************* */ template void FactorGraph::print(const std::string& s) const { @@ -50,7 +60,7 @@ namespace gtsam { /* ************************************************************************* */ template - bool FactorGraph::equals(const FactorGraph& fg, double tol) const { + bool FactorGraph::equals(const This& fg, double tol) const { /** check whether the two factor graphs have the same number of factors_ */ if (factors_.size() != fg.size()) return false; @@ -111,20 +121,20 @@ namespace gtsam { } /* ************************************************************************* */ + // Recursive function to add factors in cliques to vector of factors_io template void _FactorGraph_BayesTree_adder( - std::vector::sharedFactor>& factors, + std::vector >& factors_io, const typename BayesTree::sharedClique& clique) { if(clique) { // Add factor from this clique - factors.push_back((*clique)->toFactor()); + factors_io.push_back((*clique)->toFactor()); // Traverse children typedef typename BayesTree::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& child, clique->children()) { - _FactorGraph_BayesTree_adder(factors, child); - } + BOOST_FOREACH(const sharedClique& child, clique->children()) + _FactorGraph_BayesTree_adder(factors_io, child); } } diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 90e9e8a1f..621c18b9f 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -21,14 +21,13 @@ #pragma once -#include -#include -#include - #include #include #include +#include +#include + namespace gtsam { // Forward declarations @@ -41,30 +40,28 @@ template class BayesTree; */ template class FactorGraph { + public: - typedef FACTOR FactorType; - typedef typename FACTOR::KeyType KeyType; - typedef boost::shared_ptr > shared_ptr; - typedef typename boost::shared_ptr sharedFactor; + + typedef FACTOR FactorType; ///< factor type + typedef typename FACTOR::KeyType KeyType; ///< type of Keys we use to index factors with + typedef boost::shared_ptr sharedFactor; ///< Shared pointer to a factor + typedef boost::shared_ptr sharedConditional; ///< Shared pointer to a conditional + + typedef FactorGraph This; ///< Typedef for this class + typedef boost::shared_ptr shared_ptr; ///< Shared pointer for this class typedef typename std::vector::iterator iterator; typedef typename std::vector::const_iterator const_iterator; - /** typedef for elimination result */ - typedef std::pair< - boost::shared_ptr, - typename FACTOR::shared_ptr> EliminationResult; + /** typedef for elimination result */ + typedef std::pair EliminationResult; - /** typedef for an eliminate subroutine */ - typedef boost::function&, size_t)> Eliminate; - - /** Typedef for the result of factorization */ - typedef std::pair< - boost::shared_ptr, - FactorGraph > FactorizationResult; + /** typedef for an eliminate subroutine */ + typedef boost::function Eliminate; protected: - /** concept check */ + /** concept check, makes sure FACTOR defines print and equals */ GTSAM_CONCEPT_TESTABLE_TYPE(FACTOR) /** Collection of factors */ @@ -82,7 +79,11 @@ template class BayesTree; /// @name Advanced Constructors /// @{ - /** convert from Bayes net */ + /** + * @brief Constructor from a Bayes net + * @param bayesNet the Bayes net to convert, type CONDITIONAL must yield compatible factor + * @return a factor graph with all the conditionals, as factors + */ template FactorGraph(const BayesNet& bayesNet); @@ -113,7 +114,7 @@ template class BayesTree; } /** push back many factors */ - void push_back(const FactorGraph& factors) { + void push_back(const This& factors) { factors_.insert(end(), factors.begin(), factors.end()); } @@ -123,9 +124,14 @@ template class BayesTree; factors_.insert(end(), firstFactor, lastFactor); } - /** push back many factors stored in a vector*/ + /** + * @brief Add a vector of derived factors + * @param factors to add + */ template - void push_back(const std::vector >& factors); + void push_back(const std::vector >& factors) { + factors_.insert(end(), factors.begin(), factors.end()); + } /// @} /// @name Testable @@ -135,7 +141,7 @@ template class BayesTree; void print(const std::string& s = "FactorGraph") const; /** Check equality */ - bool equals(const FactorGraph& fg, double tol = 1e-9) const; + bool equals(const This& fg, double tol = 1e-9) const; /// @} /// @name Standard Interface @@ -252,31 +258,6 @@ template class BayesTree; template FACTORGRAPH combine(const FACTORGRAPH& fg1, const FACTORGRAPH& fg2); - /* - * These functions are defined here because they are templated on an - * additional parameter. Putting them in the -inl.h file would mean these - * would have to be explicitly instantiated for any possible derived factor - * type. - */ - - /* ************************************************************************* */ - template - template - FactorGraph::FactorGraph(const BayesNet& bayesNet) { - factors_.reserve(bayesNet.size()); - BOOST_FOREACH(const typename CONDITIONAL::shared_ptr& cond, bayesNet) { - this->push_back(cond->toFactor()); - } - } - - /* ************************************************************************* */ - template - template - void FactorGraph::push_back(const std::vector >& factors) { - BOOST_FOREACH(const boost::shared_ptr& factor, factors) - this->push_back(factor); - } - } // namespace gtsam #include diff --git a/gtsam/inference/GenericMultifrontalSolver-inl.h b/gtsam/inference/GenericMultifrontalSolver-inl.h index 40a70bfd7..192436959 100644 --- a/gtsam/inference/GenericMultifrontalSolver-inl.h +++ b/gtsam/inference/GenericMultifrontalSolver-inl.h @@ -78,7 +78,7 @@ namespace gtsam { /* ************************************************************************* */ template - typename F::shared_ptr GenericMultifrontalSolver::marginalFactor( + typename boost::shared_ptr GenericMultifrontalSolver::marginalFactor( Index j, Eliminate function) const { return eliminate(function)->marginalFactor(j, function); } diff --git a/gtsam/inference/GenericMultifrontalSolver.h b/gtsam/inference/GenericMultifrontalSolver.h index 5d6cc74ef..a64df38e9 100644 --- a/gtsam/inference/GenericMultifrontalSolver.h +++ b/gtsam/inference/GenericMultifrontalSolver.h @@ -102,7 +102,7 @@ namespace gtsam { * Compute the marginal density over a variable, by integrating out * all of the other variables. This function returns the result as a factor. */ - typename FACTOR::shared_ptr marginalFactor(Index j, + typename boost::shared_ptr marginalFactor(Index j, Eliminate function) const; /// @} diff --git a/gtsam/inference/GenericSequentialSolver-inl.h b/gtsam/inference/GenericSequentialSolver-inl.h index 5b3e0dd28..cc7e6146c 100644 --- a/gtsam/inference/GenericSequentialSolver-inl.h +++ b/gtsam/inference/GenericSequentialSolver-inl.h @@ -95,7 +95,7 @@ namespace gtsam { // Permute the factors - NOTE that this permutes the original factors, not // copies. Other parts of the code may hold shared_ptr's to these factors so // we must undo the permutation before returning. - BOOST_FOREACH(const typename FACTOR::shared_ptr& factor, *factors_) + BOOST_FOREACH(const typename boost::shared_ptr& factor, *factors_) if (factor) factor->permuteWithInverse(*permutationInverse); // Eliminate all variables @@ -103,7 +103,7 @@ namespace gtsam { bayesNet(EliminationTree::Create(*factors_)->eliminate(function)); // Undo the permuation on the original factors and on the structure. - BOOST_FOREACH(const typename FACTOR::shared_ptr& factor, *factors_) + BOOST_FOREACH(const typename boost::shared_ptr& factor, *factors_) if (factor) factor->permuteWithInverse(*permutation); // Take the joint marginal from the Bayes net. @@ -116,7 +116,7 @@ namespace gtsam { joint->push_back((*(conditional++))->toFactor()); // Undo the permutation on the eliminated joint marginal factors - BOOST_FOREACH(const typename FACTOR::shared_ptr& factor, *joint) + BOOST_FOREACH(const typename boost::shared_ptr& factor, *joint) factor->permuteWithInverse(*permutation); return joint; @@ -124,7 +124,7 @@ namespace gtsam { /* ************************************************************************* */ template - typename FACTOR::shared_ptr // + typename boost::shared_ptr // GenericSequentialSolver::marginalFactor(Index j, Eliminate function) const { // Create a container for the one variable index std::vector js(1); diff --git a/gtsam/inference/GenericSequentialSolver.h b/gtsam/inference/GenericSequentialSolver.h index 5486b3280..5b4d4b41e 100644 --- a/gtsam/inference/GenericSequentialSolver.h +++ b/gtsam/inference/GenericSequentialSolver.h @@ -130,7 +130,7 @@ namespace gtsam { * Compute the marginal Gaussian density over a variable, by integrating out * all of the other variables. This function returns the result as a factor. */ - typename FACTOR::shared_ptr marginalFactor(Index j, Eliminate function) const; + typename boost::shared_ptr marginalFactor(Index j, Eliminate function) const; /// @} diff --git a/gtsam/inference/inference-inl.h b/gtsam/inference/inference-inl.h index 02e78e8e9..b24c2d6d2 100644 --- a/gtsam/inference/inference-inl.h +++ b/gtsam/inference/inference-inl.h @@ -31,7 +31,8 @@ namespace inference { /* ************************************************************************* */ template -Permutation::shared_ptr PermutationCOLAMD(const VariableIndex& variableIndex, const CONSTRAINED& constrainLast) { +Permutation::shared_ptr PermutationCOLAMD( + const VariableIndex& variableIndex, const CONSTRAINED& constrainLast) { std::vector cmember(variableIndex.size(), 0); @@ -55,10 +56,14 @@ inline Permutation::shared_ptr PermutationCOLAMD(const VariableIndex& variableIn /* ************************************************************************* */ template -typename Graph::FactorizationResult eliminate(const Graph& factorGraph, const std::vector& variables, - const typename Graph::Eliminate& eliminateFcn, boost::optional variableIndex_) { +std::pair eliminate( + const Graph& factorGraph, + const std::vector& variables, + const typename Graph::Eliminate& eliminateFcn, + boost::optional variableIndex_) { - const VariableIndex& variableIndex = variableIndex_ ? *variableIndex_ : VariableIndex(factorGraph); + const VariableIndex& variableIndex = + variableIndex_ ? *variableIndex_ : VariableIndex(factorGraph); // First find the involved factors Graph involvedFactors; @@ -108,13 +113,11 @@ typename Graph::FactorizationResult eliminate(const Graph& factorGraph, const st if(remainingFactor->size() != 0) remainingGraph.push_back(remainingFactor); - return typename Graph::FactorizationResult(conditional, remainingGraph); + return std::make_pair(conditional, remainingGraph); -} - - -} - -} +} // eliminate + +} // namespace inference +} // namespace gtsam diff --git a/gtsam/inference/inference.h b/gtsam/inference/inference.h index 38f896a0f..15373e62a 100644 --- a/gtsam/inference/inference.h +++ b/gtsam/inference/inference.h @@ -29,52 +29,60 @@ namespace gtsam { -namespace inference { + namespace inference { -/** - * Compute a permutation (variable ordering) using colamd - */ -Permutation::shared_ptr PermutationCOLAMD(const VariableIndex& variableIndex); + /** + * Compute a permutation (variable ordering) using colamd + */ + Permutation::shared_ptr PermutationCOLAMD( + const VariableIndex& variableIndex); -/** - * Compute a permutation (variable ordering) using constrained colamd - */ -template -Permutation::shared_ptr PermutationCOLAMD(const VariableIndex& variableIndex, const CONSTRAINED& constrainLast); + /** + * Compute a permutation (variable ordering) using constrained colamd + */ + template + Permutation::shared_ptr PermutationCOLAMD( + const VariableIndex& variableIndex, const CONSTRAINED& constrainLast); -/** - * Compute a CCOLAMD permutation using the constraint groups in cmember. - */ -Permutation::shared_ptr PermutationCOLAMD_(const VariableIndex& variableIndex, std::vector& cmember); + /** + * Compute a CCOLAMD permutation using the constraint groups in cmember. + */ + Permutation::shared_ptr PermutationCOLAMD_( + const VariableIndex& variableIndex, std::vector& cmember); -/** Factor the factor graph into a conditional and a remaining factor graph. - * Given the factor graph \f$ f(X) \f$, and \c variables to factorize out - * \f$ V \f$, this function factorizes into \f$ f(X) = f(V;Y)f(Y) \f$, where - * \f$ Y := X\V \f$ are the remaining variables. If \f$ f(X) = p(X) \f$ is - * a probability density or likelihood, the factorization produces a - * conditional probability density and a marginal \f$ p(X) = p(V|Y)p(Y) \f$. - * - * For efficiency, this function treats the variables to eliminate - * \c variables as fully-connected, so produces a dense (fully-connected) - * conditional on all of the variables in \c variables, instead of a sparse - * BayesNet. If the variables are not fully-connected, it is more efficient - * to sequentially factorize multiple times. - */ -template -typename Graph::FactorizationResult eliminate(const Graph& factorGraph, const std::vector& variables, - const typename Graph::Eliminate& eliminateFcn, boost::optional variableIndex = boost::none); + /** Factor the factor graph into a conditional and a remaining factor graph. + * Given the factor graph \f$ f(X) \f$, and \c variables to factorize out + * \f$ V \f$, this function factorizes into \f$ f(X) = f(V;Y)f(Y) \f$, where + * \f$ Y := X\V \f$ are the remaining variables. If \f$ f(X) = p(X) \f$ is + * a probability density or likelihood, the factorization produces a + * conditional probability density and a marginal \f$ p(X) = p(V|Y)p(Y) \f$. + * + * For efficiency, this function treats the variables to eliminate + * \c variables as fully-connected, so produces a dense (fully-connected) + * conditional on all of the variables in \c variables, instead of a sparse + * BayesNet. If the variables are not fully-connected, it is more efficient + * to sequentially factorize multiple times. + */ + template + std::pair eliminate( + const Graph& factorGraph, + const std::vector& variables, + const typename Graph::Eliminate& eliminateFcn, + boost::optional variableIndex = boost::none); -/** Eliminate a single variable, by calling - * eliminate(const Graph&, const std::vector&, const typename Graph::Eliminate&, boost::optional) - */ -template -typename Graph::FactorizationResult eliminateOne(const Graph& factorGraph, typename Graph::KeyType variable, - const typename Graph::Eliminate& eliminateFcn, boost::optional variableIndex = boost::none) { - std::vector variables(1, variable); - return eliminate(factorGraph, variables, eliminateFcn, variableIndex); -} + /** Eliminate a single variable, by calling + * eliminate(const Graph&, const std::vector&, const typename Graph::Eliminate&, boost::optional) + */ + template + std::pair eliminateOne( + const Graph& factorGraph, typename Graph::KeyType variable, + const typename Graph::Eliminate& eliminateFcn, + boost::optional variableIndex = boost::none) { + std::vector variables(1, variable); + return eliminate(factorGraph, variables, eliminateFcn, variableIndex); + } -} + } // namespace inference } // namespace gtsam diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 07c2e94ad..07d0c8774 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -45,7 +45,7 @@ namespace gtsam { template boost::shared_ptr gaussianErrors_(const FactorGraph& fg, const VectorValues& x) { boost::shared_ptr e(new Errors); - BOOST_FOREACH(const typename FACTOR::shared_ptr& factor, fg) { + BOOST_FOREACH(const typename boost::shared_ptr& factor, fg) { e->push_back(factor->error_vector(x)); } return e; diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 718dbc302..9b3f9eb0d 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -200,14 +200,16 @@ TEST( GaussianFactorGraph, eliminateOne_x1 ) Ordering ordering; ordering += X(1),L(1),X(2); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); - GaussianFactorGraph::FactorizationResult result = inference::eliminateOne(fg, 0, EliminateQR); + GaussianConditional::shared_ptr conditional; + GaussianFactorGraph remaining; + boost::tie(conditional,remaining) = inference::eliminateOne(fg, 0, EliminateQR); // create expected Conditional Gaussian Matrix I = 15*eye(2), R11 = I, S12 = -0.111111*I, S13 = -0.444444*I; Vector d = Vector_(2, -0.133333, -0.0222222), sigma = ones(2); GaussianConditional expected(ordering[X(1)],15*d,R11,ordering[L(1)],S12,ordering[X(2)],S13,sigma); - EXPECT(assert_equal(expected,*result.first,tol)); + EXPECT(assert_equal(expected,*conditional,tol)); } /* ************************************************************************* */ @@ -247,9 +249,9 @@ TEST( GaussianFactorGraph, eliminateOne_x1_fast ) { Ordering ordering; ordering += X(1),L(1),X(2); GaussianFactorGraph fg = createGaussianFactorGraph(ordering); - GaussianFactorGraph::FactorizationResult result = inference::eliminateOne(fg, ordering[X(1)], EliminateQR); - GaussianConditional::shared_ptr conditional = result.first; - GaussianFactorGraph remaining = result.second; + GaussianConditional::shared_ptr conditional; + GaussianFactorGraph remaining; + boost::tie(conditional,remaining) = inference::eliminateOne(fg, ordering[X(1)], EliminateQR); // create expected Conditional Gaussian Matrix I = 15*eye(2), R11 = I, S12 = -0.111111*I, S13 = -0.444444*I; From 44530b2291fe0fdbf248dc20aeb8647e9d2d2c50 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 10 Jun 2012 03:31:09 +0000 Subject: [PATCH 310/914] I got rid of GlobalVars, added comments, and made "step" plot every time --- matlab/examples/VisualISAMDemo.m | 15 +- matlab/examples/VisualISAMExample.m | 12 +- matlab/examples/VisualISAMExample_triangle.m | 123 ++++-------- matlab/examples/VisualISAMGenerateData.m | 10 +- matlab/examples/VisualISAMGlobalVars.m | 7 - matlab/examples/VisualISAMInitialize.m | 17 +- matlab/examples/VisualISAMPlot.m | 16 +- matlab/examples/VisualISAMStep.m | 38 +++- matlab/examples/VisualISAM_gui.m | 196 +++++++++---------- 9 files changed, 203 insertions(+), 231 deletions(-) delete mode 100644 matlab/examples/VisualISAMGlobalVars.m diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m index 626b3a944..df83ab32c 100644 --- a/matlab/examples/VisualISAMDemo.m +++ b/matlab/examples/VisualISAMDemo.m @@ -1,2 +1,15 @@ -VisualISAMGlobalVars +% VisualISAMDemo: runs VisualSLAM iSAM demo in a GUI +% Authors: Duy Nguyen Ta + +% Make sure global variables are visible on command prompt +% so you can examine how they change as you step through +global TRIANGLE NCAMERAS SHOW_IMAGES +global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE +global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES +global SAVE_FIGURES SAVE_GRAPHS SHOW_TIMING +global points K cameras odometry +global poseNoise pointNoise odometryNoise measurementNoise +global frame_i isam newFactors initialEstimates result + +% Start GUI VisualISAM_gui \ No newline at end of file diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index 633c20cb5..136adb3ed 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -10,12 +10,14 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -clear %% Global variables used in VisualISAMExample -VisualISAMGlobalVars +global TRIANGLE NCAMERAS SHOW_IMAGES +global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE +global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES +global SAVE_FIGURES SAVE_GRAPHS %% Setting data options -TRIANGLE = true; +TRIANGLE = false; NCAMERAS = 20; SHOW_IMAGES = false; @@ -28,8 +30,8 @@ ALWAYS_RELINEARIZE = false; %% Display Options SAVE_GRAPH = false; -PRINT_STATS = true; -DRAW_INTERVAL = 4; +PRINT_STATS = false; +DRAW_INTERVAL = 5; CAMERA_INTERVAL = 1; DRAW_TRUE_POSES = false; SAVE_FIGURES = false; diff --git a/matlab/examples/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m index c0dabec72..f6b030d1d 100644 --- a/matlab/examples/VisualISAMExample_triangle.m +++ b/matlab/examples/VisualISAMExample_triangle.m @@ -10,100 +10,43 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create a triangle target, just 3 points on a plane -nPoints = 3; -r = 10; -points = {}; -for j=1:nPoints - theta = (j-1)*2*pi/nPoints; - points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); -end +%% Global variables used in VisualISAMExample +global TRIANGLE NCAMERAS SHOW_IMAGES +global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE +global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES +global SAVE_FIGURES SAVE_GRAPHS -%% Create camera cameras on a circle around the triangle -nCameras = 10; -height = 10; -r = 30; -cameras = {}; -K = gtsamCal3_S2(500,500,0,640/2,480/2); -for i=1:nCameras - theta = (i-1)*2*pi/nCameras; - t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); -end -odometry = cameras{1}.pose.between(cameras{2}.pose); +%% Setting data options +TRIANGLE = true; +NCAMERAS = 10; +SHOW_IMAGES = false; -posepriorNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 5.0 5.0 5.0]'); -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 2.0 2.0 2.0]'); -pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); -measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); +%% iSAM Options +HARD_CONSTRAINT = false; +POINT_PRIORS = false; +BATCH_INIT = true; +REORDER_INTERVAL = 10; +ALWAYS_RELINEARIZE = false; -%% Create an ISAM object for inference -isam = visualSLAMISAM(2); +%% Display Options +SAVE_GRAPH = false; +PRINT_STATS = false; +DRAW_INTERVAL = 5; +CAMERA_INTERVAL = 1; +DRAW_TRUE_POSES = false; +SAVE_FIGURES = false; +SAVE_GRAPHS = false; -%% Update ISAM -newFactors = visualSLAMGraph; -initialEstimates = visualSLAMValues; -figure(1); clf; -for i=1:nCameras - - % Prior for the first pose or odometry for subsequent cameras - if (i==1) - newFactors.addPosePrior(symbol('x',1), cameras{1}.pose, posepriorNoise); - newFactors.addPointPrior(symbol('l',1), points{1}, pointNoise); - else - newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, odometryNoise); - end +%% Generate data and initialize iSAM with the first pose and points +VisualISAMGenerateData +VisualISAMInitialize +figure; +VisualISAMPlot - % Visual measurement factors - for j=1:nPoints - zij = cameras{i}.project(points{j}); - newFactors.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); - end - - % Initial estimates for the new pose. Also initialize points while in - % the first frame. - if (i==1) - initialEstimates.insertPose(symbol('x',i), cameras{i}.pose); - for j=1:nPoints - initialEstimates.insertPoint(symbol('l',j), points{j}); - end - else - %TODO: this might be suboptimal since "result" is not the fully - %optimized result - if (i==2), prevPose = cameras{1}.pose; - else prevPose = result.pose(symbol('x',i-1)); end - initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); - end - - % Update ISAM, only update for the second frame onward - % Update the first frame will cause error, since it's under constrained - if (i>=2) - isam.update(newFactors, initialEstimates); - result = isam.estimate(); - - % Plot results - h=figure(1); clf; - hold on; - for j=1:nPoints - P = isam.marginalCovariance(symbol('l',j)); - point_j = result.point(symbol('l',j)); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); - end - - for ii=1:i - P = isam.marginalCovariance(symbol('x',ii)); - pose_ii = result.pose(symbol('x',ii)); - plotPose3(pose_ii,P,10); - end - axis([-35 35 -35 35 -35 35]) - view([36 34]) - colormap('hot') -% print(h,'-dpng',sprintf('vISAM_%03d.png',i)); - - % Reset newFactors and initialEstimates to prepare for the next - % update - newFactors = visualSLAMGraph; - initialEstimates = visualSLAMValues; +%% Main loop for iSAM: stepping through all poses +for frame_i=2:NCAMERAS + VisualISAMStep + if mod(frame_i,DRAW_INTERVAL)==0 + VisualISAMPlot end end \ No newline at end of file diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m index 03222f3cf..638bdd90b 100644 --- a/matlab/examples/VisualISAMGenerateData.m +++ b/matlab/examples/VisualISAMGenerateData.m @@ -1,4 +1,12 @@ -VisualISAMGlobalVars +% VisualISAMGenerateData: create data for viusalSLAM::iSAM examples +% Authors: Duy Nguyen Ta and Frank Dellaert + +% options +global TRIANGLE NCAMERAS SHOW_IMAGES + +% global outputs +global points cameras K odometry +global poseNoise odometryNoise pointNoise measurementNoise % data ? %% Generate simulated data points = {}; diff --git a/matlab/examples/VisualISAMGlobalVars.m b/matlab/examples/VisualISAMGlobalVars.m deleted file mode 100644 index 2438a9ea0..000000000 --- a/matlab/examples/VisualISAMGlobalVars.m +++ /dev/null @@ -1,7 +0,0 @@ -global TRIANGLE NCAMERAS SHOW_IMAGES -global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE -global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES -global SAVE_FIGURES SAVE_GRAPHS -global nPoints points K cameras odometry -global poseNoise pointNoise odometryNoise measurementNoise -global frame_i isam newFactors initialEstimates result diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index c8f341096..8fd23aeaa 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -1,4 +1,15 @@ -VisualISAMGlobalVars +function VisualISAMStep +% VisualISAMStep: execute one update step of visualSLAM::iSAM object +% Authors: Duy Nguyen Ta and Frank Dellaert + +% global variables, input +global cameras points pointNoise poseNoise measurementNoise K + +% global variables, output +global isam newFactors initialEstimates frame_i result + +% options +global REORDER_INTERVAL HARD_CONSTRAINT POINT_PRIORS %% Initialize iSAM isam = visualSLAMISAM(REORDER_INTERVAL); @@ -14,7 +25,7 @@ else end initialEstimates.insertPose(i1,pose1); % Add visual measurement factors from first pose -for j=1:nPoints +for j=1:size(points,2) jj = symbol('l',j); if POINT_PRIORS % add point priors newFactors.addPointPrior(jj, points{j}, pointNoise); @@ -24,6 +35,6 @@ for j=1:nPoints initialEstimates.insertPoint(jj, points{j}); end -frame_i = 1 +frame_i = 1; result = initialEstimates; cla; \ No newline at end of file diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index d7f5c55b0..4e7ef07da 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -1,13 +1,17 @@ -VisualISAMGlobalVars +% VisualISAMPlot: plot current state of visualSLAM::iSAM object +% Authors: Duy Nguyen Ta and Frank Dellaert + +% global variables, input +global points cameras frame_i isam result + +% options +global CAMERA_INTERVAL DRAW_TRUE_POSES SAVE_FIGURES SAVE_GRAPHS %% Plot results tic -% h=figure(2);clf -% set(1,'NumberTitle','off','Name','Visual iSAM'); h=gca; cla(h); hold on; -sprintf('Computing marginals and plotting. Please wait...') for j=1:size(points,2) point_j = result.point(symbol('l',j)); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); @@ -21,7 +25,7 @@ for ii=1:CAMERA_INTERVAL:frame_i if (frame_i>1) P = isam.marginalCovariance(symbol('x',ii)); else - P = [] + P = []; end plotPose3(pose_ii,P,10); if DRAW_TRUE_POSES % show ground truth @@ -31,9 +35,7 @@ end axis([-40 40 -40 40 -10 20]);axis equal view(3) colormap('hot') -sprintf('Done!') -% figure(2); t=toc; % if DRAW_INTERVAL~=NCAMERAS, plot(frame_i,t,'b.'); end if SAVE_FIGURES diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index f5e1a96b6..ab417d3d2 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -1,24 +1,46 @@ -VisualISAMGlobalVars +function VisualISAMStep +% VisualISAMStep: execute one update step of visualSLAM::iSAM object +% Authors: Duy Nguyen Ta and Frank Dellaert + +% global variables, input +global frame_i odometry odometryNoise newFactors initialEstimates +global points cameras measurementNoise K + +% global variables, input/output +global isam + +% global variables, output +global result + +% options +global BATCH_INIT SHOW_TIMING ALWAYS_RELINEARIZE +global SAVE_GRAPH PRINT_STATS + +% iSAM expects us to give it a new set of factors +% along with initial estimates for any new variables introduced. +% We do not clear in frame 2 so we add to the factors added in Initialize +if frame_i > 2 + newFactors = visualSLAMGraph; + initialEstimates = visualSLAMValues; +end %% Add odometry newFactors.addOdometry(symbol('x',frame_i-1), symbol('x',frame_i), odometry, odometryNoise); %% Add visual measurement factors -for j=1:nPoints +for j=1:size(points,2) zij = cameras{frame_i}.project(points{j}); newFactors.addMeasurement(zij, measurementNoise, symbol('x',frame_i), symbol('l',j), K); end %% Initial estimates for the new pose. Also initialize points while in the first frame. -%TODO: this might be suboptimal since "result" is not the fully optimized result if (frame_i==2), prevPose = cameras{1}.pose; else, prevPose = result.pose(symbol('x',frame_i-1)); end initialEstimates.insertPose(symbol('x',frame_i), prevPose.compose(odometry)); %% Update ISAM if BATCH_INIT & (frame_i==2) % Do a full optimize for first two poses - initialEstimates - fullyOptimized = newFactors.optimize(initialEstimates) + fullyOptimized = newFactors.optimize(initialEstimates); initialEstimates = fullyOptimized; end % figure(1);tic; @@ -30,14 +52,10 @@ if ALWAYS_RELINEARIZE % re-linearize isam.reorder_relinearize(); end - if SAVE_GRAPH isam.saveGraph(sprintf('VisualiSAM.dot',frame_i)); end + if PRINT_STATS isam.printStats(); end - -%% Reset newFactors and initialEstimates to prepare for the next update -newFactors = visualSLAMGraph; -initialEstimates = visualSLAMValues; \ No newline at end of file diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index d13e45e3f..e1de7701e 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -1,37 +1,20 @@ function varargout = VisualISAM_gui(varargin) -% VISUALISAM_GUI MATLAB code for VisualISAM_gui.fig -% VISUALISAM_GUI, by itself, creates a new VISUALISAM_GUI or raises the existing -% singleton*. -% -% H = VISUALISAM_GUI returns the handle to a new VISUALISAM_GUI or the handle to -% the existing singleton*. -% -% VISUALISAM_GUI('CALLBACK',hObject,~,handles,...) calls the local -% function named CALLBACK in VISUALISAM_GUI.M with the given input arguments. -% -% VISUALISAM_GUI('Property','Value',...) creates a new VISUALISAM_GUI or raises the -% existing singleton*. Starting from the left, property value pairs are -% applied to the GUI before VisualISAM_gui_OpeningFcn gets called. An -% unrecognized property name or invalid value makes property application -% stop. All inputs are passed to VisualISAM_gui_OpeningFcn via varargin. -% -% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one -% instance to run (singleton)". -% -% See also: GUIDE, GUIDATA, GUIHANDLES - -% Edit the above text to modify the response to help VisualISAM_gui +% VisualISAM_gui: runs VisualSLAM iSAM demo in GUI +% Interface is defined by VisualISAM_gui.fig +% You can run this file directly, but won't have access to globals +% By running ViusalISAMDemo, you see all variables in command prompt +% Authors: Duy Nguyen Ta % Last Modified by GUIDE v2.5 09-Jun-2012 00:56:47 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @VisualISAM_gui_OpeningFcn, ... - 'gui_OutputFcn', @VisualISAM_gui_OutputFcn, ... - 'gui_LayoutFcn', [] , ... - 'gui_Callback', []); + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @VisualISAM_gui_OpeningFcn, ... + 'gui_OutputFcn', @VisualISAM_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end @@ -55,11 +38,8 @@ handles.output = hObject; % Update handles structure guidata(hObject, handles); -% UIWAIT makes VisualISAM_gui wait for user response (see UIRESUME) -% uiwait(handles.figure1); - % --- Outputs from this function are returned to the command line. -function varargout = VisualISAM_gui_OutputFcn(hObject, ~, handles) +function varargout = VisualISAM_gui_OutputFcn(hObject, ~, handles) % varargout cell array for returning output args (see VARARGOUT); % Get default command line output from handles structure varargout{1} = handles.output; @@ -69,49 +49,54 @@ varargout{1} = handles.output; % Convenient functions %---------------------------------------------------------- function showFramei(hObject, handles) - VisualISAMGlobalVars - set(handles.frameStatus, 'String', sprintf('Frame: %d',frame_i)); - drawnow - guidata(hObject, handles); - +global frame_i +set(handles.frameStatus, 'String', sprintf('Frame: %d',frame_i)); +drawnow +guidata(hObject, handles); + function showWaiting(handles, status) - set(handles.waitingStatus,'String', status); - drawnow - guidata(handles.waitingStatus, handles); - +set(handles.waitingStatus,'String', status); +drawnow +guidata(handles.waitingStatus, handles); + function triangle = chooseDataset(handles) - str = cellstr(get(handles.dataset,'String')); - sel = get(handles.dataset,'Value'); - switch str{sel} - case 'triangle' - triangle = true; - case 'cube' - triangle = false; - end - +str = cellstr(get(handles.dataset,'String')); +sel = get(handles.dataset,'Value'); +switch str{sel} + case 'triangle' + triangle = true; + case 'cube' + triangle = false; +end + function initOptions(handles) - VisualISAMGlobalVars - % Setting data options - TRIANGLE = chooseDataset(handles) - NCAMERAS = str2num(get(handles.numCamEdit,'String')) - SHOW_IMAGES = get(handles.showImagesCB,'Value') - % iSAM Options - HARD_CONSTRAINT = get(handles.hardConstraintCB,'Value') - POINT_PRIORS = get(handles.pointPriorsCB,'Value') - BATCH_INIT = get(handles.batchInitCB,'Value') - REORDER_INTERVAL = str2num(get(handles.numCamEdit,'String')) - ALWAYS_RELINEARIZE = get(handles.alwaysRelinearizeCB,'Value') +global TRIANGLE NCAMERAS SHOW_IMAGES +global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE +global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES +global SAVE_FIGURES SAVE_GRAPHS + +% Setting data options +TRIANGLE = chooseDataset(handles); +NCAMERAS = str2num(get(handles.numCamEdit,'String')); +SHOW_IMAGES = get(handles.showImagesCB,'Value'); + +% iSAM Options +HARD_CONSTRAINT = get(handles.hardConstraintCB,'Value'); +POINT_PRIORS = get(handles.pointPriorsCB,'Value'); +BATCH_INIT = get(handles.batchInitCB,'Value'); +REORDER_INTERVAL = str2num(get(handles.numCamEdit,'String')); +ALWAYS_RELINEARIZE = get(handles.alwaysRelinearizeCB,'Value'); + +% Display Options +SAVE_GRAPH = get(handles.saveGraphCB,'Value'); +PRINT_STATS = get(handles.printStatsCB,'Value'); +DRAW_INTERVAL = str2num(get(handles.drawInterval,'String')); +CAMERA_INTERVAL = str2num(get(handles.cameraIntervalEdit,'String')); +DRAW_TRUE_POSES = get(handles.drawTruePosesCB,'Value'); +SAVE_FIGURES = get(handles.saveFiguresCB,'Value'); +SAVE_GRAPHS = get(handles.saveGraphsCB,'Value'); - % Display Options - SAVE_GRAPH = get(handles.saveGraphCB,'Value') - PRINT_STATS = get(handles.printStatsCB,'Value') - DRAW_INTERVAL = str2num(get(handles.drawInterval,'String')) - CAMERA_INTERVAL = str2num(get(handles.cameraIntervalEdit,'String')) - DRAW_TRUE_POSES = get(handles.drawTruePosesCB,'Value') - SAVE_FIGURES = get(handles.saveFiguresCB,'Value') - SAVE_GRAPHS = get(handles.saveGraphsCB,'Value') - %---------------------------------------------------------- % Callback functions for GUI elements @@ -130,7 +115,7 @@ end function dataset_Callback(hObject, ~, handles) % Hints: contents = cellstr(get(hObject,'String')) returns dataset contents as cell array % contents{get(hObject,'Value')} returns selected item from dataset - + % --- Executes during object creation, after setting all properties. function numCamEdit_CreateFcn(hObject, ~, handles) @@ -161,13 +146,13 @@ function pointPriorsCB_Callback(hObject, ~, handles) % --- Executes during object creation, after setting all properties. function batchInitCB_CreateFcn(hObject, eventdata, handles) - set(hObject,'Value',1); - +set(hObject,'Value',1); + % --- Executes on button press in batchInitCB. function batchInitCB_Callback(hObject, ~, handles) % Hint: get(hObject,'Value') returns toggle state of batchInitCB - + % --- Executes on button press in alwaysRelinearizeCB. function alwaysRelinearizeCB_Callback(hObject, ~, handles) % Hint: get(hObject,'Value') returns toggle state of alwaysRelinearizeCB @@ -242,48 +227,45 @@ function saveGraphsCB_Callback(hObject, ~, handles) % --- Executes on button press in intializeButton. function intializeButton_Callback(hObject, ~, handles) - VisualISAMGlobalVars - initOptions(handles) - VisualISAMGenerateData - VisualISAMInitialize - VisualISAMPlot - showFramei(hObject, handles) - - +initOptions(handles) +VisualISAMGenerateData +VisualISAMInitialize +VisualISAMPlot +showFramei(hObject, handles) + + % --- Executes on button press in runButton. function runButton_Callback(hObject, ~, handles) - VisualISAMGlobalVars - while (frame_i Date: Sun, 10 Jun 2012 04:24:12 +0000 Subject: [PATCH 311/914] fixed printing --- gtsam/nonlinear/NonlinearISAM.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index 8c4424f05..810c9037c 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -25,10 +25,12 @@ #include +using namespace std; + namespace gtsam { /* ************************************************************************* */ -void NonlinearISAM::saveGraph(const std::string& s) const { +void NonlinearISAM::saveGraph(const string& s) const { isam_.saveGraph(s); } @@ -67,7 +69,7 @@ void NonlinearISAM::update(const NonlinearFactorGraph& newFactors, /* ************************************************************************* */ void NonlinearISAM::reorder_relinearize() { -// std::cout << "Reordering, relinearizing..." << std::endl; +// cout << "Reordering, relinearizing..." << endl; if(factors_.size() > 0) { // Obtain the new linearization point @@ -104,24 +106,23 @@ Matrix NonlinearISAM::marginalCovariance(Key key) const { } /* ************************************************************************* */ -void NonlinearISAM::print(const std::string& s) const { - std::cout << "ISAM - " << s << ":" << std::endl; - std::cout << " ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << std::endl; - isam_.print("GaussianISAM"); - linPoint_.print("Linearization Point"); - ordering_.print("System Ordering"); - factors_.print("Nonlinear Graph"); +void NonlinearISAM::print(const string& s) const { + cout s << "ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << endl; + isam_.print("GaussianISAM:\n"); + linPoint_.print("Linearization Point:\n"); + ordering_.print("System Ordering:\n"); + factors_.print("Nonlinear Graph:\n"); } /* ************************************************************************* */ void NonlinearISAM::printStats() const { gtsam::GaussianISAM::CliqueData data = isam_.getCliqueData(); gtsam::GaussianISAM::CliqueStats stats = data.getStats(); - std::cout << "\navg Conditional Size: " << stats.avgConditionalSize; - std::cout << "\nmax Conditional Size: " << stats.maxConditionalSize; - std::cout << "\navg Separator Size: " << stats.avgSeparatorSize; - std::cout << "\nmax Separator Size: " << stats.maxSeparatorSize; - std::cout << std::endl; + cout << "\navg Conditional Size: " << stats.avgConditionalSize; + cout << "\nmax Conditional Size: " << stats.maxConditionalSize; + cout << "\navg Separator Size: " << stats.avgSeparatorSize; + cout << "\nmax Separator Size: " << stats.maxSeparatorSize; + cout << endl; } /* ************************************************************************* */ From 7eb449c2051c844f589693a41e817f4b281ec383 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 10 Jun 2012 04:25:05 +0000 Subject: [PATCH 312/914] GenerateData is now a function, no globals --- matlab/examples/VisualISAMDemo.m | 3 +- matlab/examples/VisualISAMExample.m | 18 ++++---- matlab/examples/VisualISAMExample_triangle.m | 18 ++++---- matlab/examples/VisualISAMGenerateData.m | 48 +++++++++----------- matlab/examples/VisualISAMInitialize.m | 28 ++++++++---- matlab/examples/VisualISAMPlot.m | 9 ++-- matlab/examples/VisualISAMStep.m | 18 ++++---- matlab/examples/VisualISAM_gui.m | 33 ++++++++------ 8 files changed, 90 insertions(+), 85 deletions(-) diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m index df83ab32c..cb56a8208 100644 --- a/matlab/examples/VisualISAMDemo.m +++ b/matlab/examples/VisualISAMDemo.m @@ -3,11 +3,10 @@ % Make sure global variables are visible on command prompt % so you can examine how they change as you step through -global TRIANGLE NCAMERAS SHOW_IMAGES global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES global SAVE_FIGURES SAVE_GRAPHS SHOW_TIMING -global points K cameras odometry +global data global poseNoise pointNoise odometryNoise measurementNoise global frame_i isam newFactors initialEstimates result diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index 136adb3ed..c6563aa6e 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -11,16 +11,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Global variables used in VisualISAMExample -global TRIANGLE NCAMERAS SHOW_IMAGES +global data global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES global SAVE_FIGURES SAVE_GRAPHS -%% Setting data options -TRIANGLE = false; -NCAMERAS = 20; -SHOW_IMAGES = false; - %% iSAM Options HARD_CONSTRAINT = false; POINT_PRIORS = false; @@ -37,14 +32,19 @@ DRAW_TRUE_POSES = false; SAVE_FIGURES = false; SAVE_GRAPHS = false; -%% Generate data and initialize iSAM with the first pose and points -VisualISAMGenerateData +%% Generate data +options.triangle = false; +options.nrCameras = 20; +showImages = false; +data = VisualISAMGenerateData(options,showImages); + +%% Initialize iSAM with the first pose and points VisualISAMInitialize figure; VisualISAMPlot %% Main loop for iSAM: stepping through all poses -for frame_i=2:NCAMERAS +for frame_i=2:options.nrCameras VisualISAMStep if mod(frame_i,DRAW_INTERVAL)==0 VisualISAMPlot diff --git a/matlab/examples/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m index f6b030d1d..8629ae79f 100644 --- a/matlab/examples/VisualISAMExample_triangle.m +++ b/matlab/examples/VisualISAMExample_triangle.m @@ -11,16 +11,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Global variables used in VisualISAMExample -global TRIANGLE NCAMERAS SHOW_IMAGES +global data global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES global SAVE_FIGURES SAVE_GRAPHS -%% Setting data options -TRIANGLE = true; -NCAMERAS = 10; -SHOW_IMAGES = false; - %% iSAM Options HARD_CONSTRAINT = false; POINT_PRIORS = false; @@ -37,14 +32,19 @@ DRAW_TRUE_POSES = false; SAVE_FIGURES = false; SAVE_GRAPHS = false; -%% Generate data and initialize iSAM with the first pose and points -VisualISAMGenerateData +%% Generate data +options.triangle = true; +options.nrCameras = 10; +showImages = false; +data = VisualISAMGenerateData(options,showImages); + +%% Initialize iSAM with the first pose and points VisualISAMInitialize figure; VisualISAMPlot %% Main loop for iSAM: stepping through all poses -for frame_i=2:NCAMERAS +for frame_i=2:options.nrCameras VisualISAMStep if mod(frame_i,DRAW_INTERVAL)==0 VisualISAMPlot diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m index 638bdd90b..0eb504d57 100644 --- a/matlab/examples/VisualISAMGenerateData.m +++ b/matlab/examples/VisualISAMGenerateData.m @@ -1,25 +1,20 @@ +function data = VisualISAMGenerateData(options, showImages) % VisualISAMGenerateData: create data for viusalSLAM::iSAM examples % Authors: Duy Nguyen Ta and Frank Dellaert - -% options -global TRIANGLE NCAMERAS SHOW_IMAGES - -% global outputs -global points cameras K odometry -global poseNoise odometryNoise pointNoise measurementNoise % data ? +if nargin<2, showImages=false; end %% Generate simulated data -points = {}; -if TRIANGLE % Create a triangle target, just 3 points on a plane +data.points = {}; +if options.triangle % Create a triangle target, just 3 points on a plane nPoints = 3; r = 10; for j=1:nPoints theta = (j-1)*2*pi/nPoints; - points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); + data.points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); end else % 3D landmarks as vertices of a cube nPoints = 8; - points = {gtsamPoint3([10 10 10]'),... + data.points = {gtsamPoint3([10 10 10]'),... gtsamPoint3([-10 10 10]'),... gtsamPoint3([-10 -10 10]'),... gtsamPoint3([10 -10 10]'),... @@ -31,29 +26,28 @@ end %% Create camera cameras on a circle around the triangle height = 10; r = 40; -K = gtsamCal3_S2(500,500,0,640/2,480/2); -cameras = {}; -gui = gcf; -for i=1:NCAMERAS - theta = (i-1)*2*pi/NCAMERAS; +data.K = gtsamCal3_S2(500,500,0,640/2,480/2); +data.cameras = {}; +for i=1:options.nrCameras + theta = (i-1)*2*pi/options.nrCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); - if SHOW_IMAGES % show images + data.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), data.K); +end + +%% show images if asked +if showImages + gui = gcf; + for i=1:options.nrCameras figure(2+i);clf;hold on set(2+i,'NumberTitle','off','Name',sprintf('Camera %d',i)); for j=1:nPoints - zij = cameras{i}.project(points{j}); + zij = data.cameras{i}.project(data.points{j}); plot(zij.x,zij.y,'*'); axis([1 640 1 480]); end end + figure(gui); end -figure(gui); -odometry = cameras{1}.pose.between(cameras{2}.pose); - -%% Set Noise parameters -poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); -measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); \ No newline at end of file +%% Calculate odometry between cameras +data.odometry = data.cameras{1}.pose.between(data.cameras{2}.pose); diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index 8fd23aeaa..eeba8cbf6 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -3,36 +3,46 @@ function VisualISAMStep % Authors: Duy Nguyen Ta and Frank Dellaert % global variables, input -global cameras points pointNoise poseNoise measurementNoise K +global data pointNoise poseNoise measurementNoise % global variables, output global isam newFactors initialEstimates frame_i result +global poseNoise odometryNoise pointNoise measurementNoise % options global REORDER_INTERVAL HARD_CONSTRAINT POINT_PRIORS %% Initialize iSAM isam = visualSLAMISAM(REORDER_INTERVAL); + +%% Set Noise parameters +poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); +measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); + +%% Add constraints/priors newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; i1 = symbol('x',1); -camera1 = cameras{1}; +camera1 = data.cameras{1}; pose1 = camera1.pose; if HARD_CONSTRAINT % add hard constraint newFactors.addPoseConstraint(i1,pose1); else newFactors.addPosePrior(i1,pose1, poseNoise); end -initialEstimates.insertPose(i1,pose1); -% Add visual measurement factors from first pose -for j=1:size(points,2) +initialEstimates.insertPose(i1,pose1); % TODO: should not be from ground truth! + +%% Add visual measurement factors from first pose +for j=1:size(data.points,2) jj = symbol('l',j); if POINT_PRIORS % add point priors - newFactors.addPointPrior(jj, points{j}, pointNoise); + newFactors.addPointPrior(jj, data.points{j}, pointNoise); end - zij = camera1.project(points{j}); - newFactors.addMeasurement(zij, measurementNoise, i1, jj, K); - initialEstimates.insertPoint(jj, points{j}); + zij = camera1.project(data.points{j}); + newFactors.addMeasurement(zij, measurementNoise, i1, jj, data.K); + initialEstimates.insertPoint(jj, data.points{j}); % TODO: should not be from ground truth! end frame_i = 1; diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index 4e7ef07da..52eb030b5 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -2,17 +2,16 @@ % Authors: Duy Nguyen Ta and Frank Dellaert % global variables, input -global points cameras frame_i isam result +global data frame_i isam result % options global CAMERA_INTERVAL DRAW_TRUE_POSES SAVE_FIGURES SAVE_GRAPHS %% Plot results -tic h=gca; cla(h); hold on; -for j=1:size(points,2) +for j=1:size(data.points,2) point_j = result.point(symbol('l',j)); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); if (frame_i>1) @@ -29,15 +28,13 @@ for ii=1:CAMERA_INTERVAL:frame_i end plotPose3(pose_ii,P,10); if DRAW_TRUE_POSES % show ground truth - plotPose3(cameras{ii}.pose,0.001*eye(6),10); + plotPose3(data.cameras{ii}.pose,0.001*eye(6),10); end end axis([-40 40 -40 40 -10 20]);axis equal view(3) colormap('hot') -t=toc; -% if DRAW_INTERVAL~=NCAMERAS, plot(frame_i,t,'b.'); end if SAVE_FIGURES fig2 = figure('visible','off'); newax = copyobj(h,fig2); diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index ab417d3d2..833618a6f 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -3,8 +3,8 @@ function VisualISAMStep % Authors: Duy Nguyen Ta and Frank Dellaert % global variables, input -global frame_i odometry odometryNoise newFactors initialEstimates -global points cameras measurementNoise K +global frame_i odometryNoise measurementNoise newFactors initialEstimates +global data % global variables, input/output global isam @@ -25,18 +25,18 @@ if frame_i > 2 end %% Add odometry -newFactors.addOdometry(symbol('x',frame_i-1), symbol('x',frame_i), odometry, odometryNoise); +newFactors.addOdometry(symbol('x',frame_i-1), symbol('x',frame_i), data.odometry, odometryNoise); %% Add visual measurement factors -for j=1:size(points,2) - zij = cameras{frame_i}.project(points{j}); - newFactors.addMeasurement(zij, measurementNoise, symbol('x',frame_i), symbol('l',j), K); +for j=1:size(data.points,2) + zij = data.cameras{frame_i}.project(data.points{j}); + newFactors.addMeasurement(zij, measurementNoise, symbol('x',frame_i), symbol('l',j), data.K); end -%% Initial estimates for the new pose. Also initialize points while in the first frame. -if (frame_i==2), prevPose = cameras{1}.pose; +%% Initial estimates for the new pose. Also initialize data.points while in the first frame. +if (frame_i==2), prevPose = data.cameras{1}.pose; else, prevPose = result.pose(symbol('x',frame_i-1)); end -initialEstimates.insertPose(symbol('x',frame_i), prevPose.compose(odometry)); +initialEstimates.insertPose(symbol('x',frame_i), prevPose.compose(data.odometry)); %% Update ISAM if BATCH_INIT & (frame_i==2) % Do a full optimize for first two poses diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index e1de7701e..a1f9a8a54 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -71,21 +71,15 @@ end function initOptions(handles) -global TRIANGLE NCAMERAS SHOW_IMAGES global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES -global SAVE_FIGURES SAVE_GRAPHS - -% Setting data options -TRIANGLE = chooseDataset(handles); -NCAMERAS = str2num(get(handles.numCamEdit,'String')); -SHOW_IMAGES = get(handles.showImagesCB,'Value'); +global SAVE_FIGURES SAVE_GRAPHS SHOW_TIMING % iSAM Options HARD_CONSTRAINT = get(handles.hardConstraintCB,'Value'); POINT_PRIORS = get(handles.pointPriorsCB,'Value'); BATCH_INIT = get(handles.batchInitCB,'Value'); -REORDER_INTERVAL = str2num(get(handles.numCamEdit,'String')); +REORDER_INTERVAL = str2num(get(handles.reorderIntervalEdit,'String')); ALWAYS_RELINEARIZE = get(handles.alwaysRelinearizeCB,'Value'); % Display Options @@ -96,7 +90,7 @@ CAMERA_INTERVAL = str2num(get(handles.cameraIntervalEdit,'String')); DRAW_TRUE_POSES = get(handles.drawTruePosesCB,'Value'); SAVE_FIGURES = get(handles.saveFiguresCB,'Value'); SAVE_GRAPHS = get(handles.saveGraphsCB,'Value'); - +SHOW_TIMING = false; %---------------------------------------------------------- % Callback functions for GUI elements @@ -227,8 +221,19 @@ function saveGraphsCB_Callback(hObject, ~, handles) % --- Executes on button press in intializeButton. function intializeButton_Callback(hObject, ~, handles) + +global data + +% initialize global options initOptions(handles) -VisualISAMGenerateData + +% Generate Data +options.triangle = chooseDataset(handles); +options.nrCameras = str2num(get(handles.numCamEdit,'String')); +showImages = get(handles.showImagesCB,'Value'); +data = VisualISAMGenerateData(options, showImages); + +% Initialize and plot VisualISAMInitialize VisualISAMPlot showFramei(hObject, handles) @@ -236,8 +241,8 @@ showFramei(hObject, handles) % --- Executes on button press in runButton. function runButton_Callback(hObject, ~, handles) -global frame_i NCAMERAS DRAW_INTERVAL -while (frame_i Date: Sun, 10 Jun 2012 05:00:42 +0000 Subject: [PATCH 313/914] Initialize now initailizes first two cameras, makes so much more sense! --- matlab/examples/VisualISAMDemo.m | 2 +- matlab/examples/VisualISAMExample.m | 5 +- matlab/examples/VisualISAMExample_triangle.m | 5 +- matlab/examples/VisualISAMInitialize.m | 63 +++++++++++++------- matlab/examples/VisualISAMPlot.m | 9 +++ matlab/examples/VisualISAMStep.m | 30 +++------- 6 files changed, 66 insertions(+), 48 deletions(-) diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m index cb56a8208..a6850fb7d 100644 --- a/matlab/examples/VisualISAMDemo.m +++ b/matlab/examples/VisualISAMDemo.m @@ -8,7 +8,7 @@ global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES global SAVE_FIGURES SAVE_GRAPHS SHOW_TIMING global data global poseNoise pointNoise odometryNoise measurementNoise -global frame_i isam newFactors initialEstimates result +global frame_i isam result % Start GUI VisualISAM_gui \ No newline at end of file diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index c6563aa6e..f84ee89c7 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -11,7 +11,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Global variables used in VisualISAMExample -global data +global data isam frame_i result +global poseNoise odometryNoise pointNoise measurementNoise global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES global SAVE_FIGURES SAVE_GRAPHS @@ -44,7 +45,7 @@ figure; VisualISAMPlot %% Main loop for iSAM: stepping through all poses -for frame_i=2:options.nrCameras +for frame_i=3:options.nrCameras VisualISAMStep if mod(frame_i,DRAW_INTERVAL)==0 VisualISAMPlot diff --git a/matlab/examples/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m index 8629ae79f..536dbf9c1 100644 --- a/matlab/examples/VisualISAMExample_triangle.m +++ b/matlab/examples/VisualISAMExample_triangle.m @@ -11,7 +11,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Global variables used in VisualISAMExample -global data +global data isam frame_i result +global poseNoise odometryNoise pointNoise measurementNoise global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES global SAVE_FIGURES SAVE_GRAPHS @@ -44,7 +45,7 @@ figure; VisualISAMPlot %% Main loop for iSAM: stepping through all poses -for frame_i=2:options.nrCameras +for frame_i=3:options.nrCameras VisualISAMStep if mod(frame_i,DRAW_INTERVAL)==0 VisualISAMPlot diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index eeba8cbf6..73d512d3d 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -1,17 +1,17 @@ -function VisualISAMStep -% VisualISAMStep: execute one update step of visualSLAM::iSAM object +function VisualInitialize +% VisualInitialize: initialize visualSLAM::iSAM object and noise parameters % Authors: Duy Nguyen Ta and Frank Dellaert +% options +global REORDER_INTERVAL HARD_CONSTRAINT POINT_PRIORS BATCH_INIT ALWAYS_RELINEARIZE + % global variables, input -global data pointNoise poseNoise measurementNoise +global data % global variables, output -global isam newFactors initialEstimates frame_i result +global isam frame_i result global poseNoise odometryNoise pointNoise measurementNoise -% options -global REORDER_INTERVAL HARD_CONSTRAINT POINT_PRIORS - %% Initialize iSAM isam = visualSLAMISAM(REORDER_INTERVAL); @@ -24,27 +24,50 @@ measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); %% Add constraints/priors newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; -i1 = symbol('x',1); -camera1 = data.cameras{1}; -pose1 = camera1.pose; -if HARD_CONSTRAINT % add hard constraint - newFactors.addPoseConstraint(i1,pose1); -else - newFactors.addPosePrior(i1,pose1, poseNoise); +for frame_i=1:2 + ii = symbol('x',frame_i); + if frame_i==1 & HARD_CONSTRAINT % add hard constraint + newFactors.addPoseConstraint(ii,data.cameras{1}.pose); + else + newFactors.addPosePrior(ii,data.cameras{frame_i}.pose, poseNoise); + end + % TODO: init should not be from ground truth! + initialEstimates.insertPose(ii,data.cameras{frame_i}.pose); end -initialEstimates.insertPose(i1,pose1); % TODO: should not be from ground truth! -%% Add visual measurement factors from first pose +%% Add visual measurement factors from two first poses +for frame_i=1:2 + ii = symbol('x',frame_i); + for j=1:size(data.points,2) + jj = symbol('l',j); + zij = data.cameras{frame_i}.project(data.points{j}); + newFactors.addMeasurement(zij, measurementNoise, ii, jj, data.K); + end +end + +%% Initialize points, possibly add priors on them for j=1:size(data.points,2) jj = symbol('l',j); if POINT_PRIORS % add point priors newFactors.addPointPrior(jj, data.points{j}, pointNoise); end - zij = camera1.project(data.points{j}); - newFactors.addMeasurement(zij, measurementNoise, i1, jj, data.K); initialEstimates.insertPoint(jj, data.points{j}); % TODO: should not be from ground truth! end -frame_i = 1; -result = initialEstimates; +%% Update ISAM +if BATCH_INIT % Do a full optimize for first two poses + fullyOptimized = newFactors.optimize(initialEstimates); + isam.update(newFactors, fullyOptimized); +else + isam.update(newFactors, initialEstimates); +end +% figure(1);tic; +% t=toc; plot(frame_i,t,'r.'); tic +result = isam.estimate(); +% t=toc; plot(frame_i,t,'g.'); + +if ALWAYS_RELINEARIZE % re-linearize + isam.reorder_relinearize(); +end + cla; \ No newline at end of file diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index 52eb030b5..fc4436332 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -6,6 +6,7 @@ global data frame_i isam result % options global CAMERA_INTERVAL DRAW_TRUE_POSES SAVE_FIGURES SAVE_GRAPHS +global SAVE_GRAPH PRINT_STATS %% Plot results h=gca; @@ -46,4 +47,12 @@ if SAVE_GRAPHS && (frame_i>1) isam.saveGraph(sprintf('VisualiSAM%03d.dot',frame_i)); end +if SAVE_GRAPH + isam.saveGraph(sprintf('VisualiSAM.dot',frame_i)); +end + +if PRINT_STATS + isam.printStats(); +end + drawnow \ No newline at end of file diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index 833618a6f..9bf8f93ac 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -3,7 +3,7 @@ function VisualISAMStep % Authors: Duy Nguyen Ta and Frank Dellaert % global variables, input -global frame_i odometryNoise measurementNoise newFactors initialEstimates +global frame_i odometryNoise measurementNoise global data % global variables, input/output @@ -13,16 +13,12 @@ global isam global result % options -global BATCH_INIT SHOW_TIMING ALWAYS_RELINEARIZE -global SAVE_GRAPH PRINT_STATS +global SHOW_TIMING ALWAYS_RELINEARIZE % iSAM expects us to give it a new set of factors % along with initial estimates for any new variables introduced. -% We do not clear in frame 2 so we add to the factors added in Initialize -if frame_i > 2 - newFactors = visualSLAMGraph; - initialEstimates = visualSLAMValues; -end +newFactors = visualSLAMGraph; +initialEstimates = visualSLAMValues; %% Add odometry newFactors.addOdometry(symbol('x',frame_i-1), symbol('x',frame_i), data.odometry, odometryNoise); @@ -33,29 +29,17 @@ for j=1:size(data.points,2) newFactors.addMeasurement(zij, measurementNoise, symbol('x',frame_i), symbol('l',j), data.K); end -%% Initial estimates for the new pose. Also initialize data.points while in the first frame. -if (frame_i==2), prevPose = data.cameras{1}.pose; -else, prevPose = result.pose(symbol('x',frame_i-1)); end +%% Initial estimates for the new pose. +prevPose = result.pose(symbol('x',frame_i-1)); initialEstimates.insertPose(symbol('x',frame_i), prevPose.compose(data.odometry)); %% Update ISAM -if BATCH_INIT & (frame_i==2) % Do a full optimize for first two poses - fullyOptimized = newFactors.optimize(initialEstimates); - initialEstimates = fullyOptimized; -end % figure(1);tic; isam.update(newFactors, initialEstimates); % t=toc; plot(frame_i,t,'r.'); tic result = isam.estimate(); % t=toc; plot(frame_i,t,'g.'); + if ALWAYS_RELINEARIZE % re-linearize isam.reorder_relinearize(); end - -if SAVE_GRAPH - isam.saveGraph(sprintf('VisualiSAM.dot',frame_i)); -end - -if PRINT_STATS - isam.printStats(); -end From b50c69b7aacc2a0b9f1bf7fda80de01ac0055a59 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 10 Jun 2012 05:37:14 +0000 Subject: [PATCH 314/914] Fixed compile error. Sorry! --- gtsam/nonlinear/NonlinearISAM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index 810c9037c..5f95a0609 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -107,7 +107,7 @@ Matrix NonlinearISAM::marginalCovariance(Key key) const { /* ************************************************************************* */ void NonlinearISAM::print(const string& s) const { - cout s << "ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << endl; + cout << s << "ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << endl; isam_.print("GaussianISAM:\n"); linPoint_.print("Linearization Point:\n"); ordering_.print("System Ordering:\n"); From 4107167633d95da08bfbb3cf22d1de82d0b0cebf Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 10 Jun 2012 15:20:51 +0000 Subject: [PATCH 315/914] nrPoses, nrPoints --- gtsam.h | 2 ++ gtsam/slam/visualSLAM.cpp | 15 +++++++++++++++ gtsam/slam/visualSLAM.h | 6 ++++++ 3 files changed, 23 insertions(+) diff --git a/gtsam.h b/gtsam.h index 315071f65..ff9bb2022 100644 --- a/gtsam.h +++ b/gtsam.h @@ -891,6 +891,8 @@ class Values { void updatePose(size_t key, const gtsam::Pose3& pose); void updatePoint(size_t key, const gtsam::Point3& pose); size_t size() const; + size_t nrPoses() const; + size_t nrPoints() const; void print(string s) const; gtsam::Pose3 pose(size_t i); gtsam::Point3 point(size_t j); diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index bb3cd19d1..26123dda6 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -23,6 +23,20 @@ using boost::make_shared; namespace visualSLAM { + /* ************************************************************************* */ + size_t Values::nrPoses() const { + // TODO, is there a better way? + ConstFiltered poses = filter(); + return poses.size(); + } + + /* ************************************************************************* */ + size_t Values::nrPoints() const { + // TODO, is there a better way? + ConstFiltered points = filter(); + return points.size(); + } + /* ************************************************************************* */ Vector Values::xs() const { size_t j=0; @@ -53,6 +67,7 @@ namespace visualSLAM { return result; } + /* ************************************************************************* */ Matrix Values::points() const { size_t j=0; ConstFiltered points = filter(); diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index f1f5c3850..5f2d70905 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -72,6 +72,12 @@ namespace visualSLAM { /// update a point void updatePoint(Key j, const Point3& point) { update(j, point); } + /// get number of poses + size_t nrPoses() const; + + /// get number of points + size_t nrPoints() const; + /// get a pose Pose3 pose(Key i) const { return at(i); } From 6b23258b9739f916790093c9cd85944e6594ff96 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 10 Jun 2012 15:26:59 +0000 Subject: [PATCH 316/914] options structure all the way --- matlab/examples/VisualISAMDemo.m | 3 - matlab/examples/VisualISAMExample.m | 55 ++++++++------- matlab/examples/VisualISAMExample_triangle.m | 55 ++++++++------- matlab/examples/VisualISAMGenerateData.m | 5 +- matlab/examples/VisualISAMInitialize.m | 15 ++-- matlab/examples/VisualISAMPlot.m | 72 +++++++++++--------- matlab/examples/VisualISAMStep.m | 8 +-- matlab/examples/VisualISAM_gui.m | 56 +++++++-------- 8 files changed, 130 insertions(+), 139 deletions(-) diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m index a6850fb7d..f4b975ad5 100644 --- a/matlab/examples/VisualISAMDemo.m +++ b/matlab/examples/VisualISAMDemo.m @@ -3,9 +3,6 @@ % Make sure global variables are visible on command prompt % so you can examine how they change as you step through -global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE -global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES -global SAVE_FIGURES SAVE_GRAPHS SHOW_TIMING global data global poseNoise pointNoise odometryNoise measurementNoise global frame_i isam result diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index f84ee89c7..f7114b652 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -11,43 +11,42 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Global variables used in VisualISAMExample -global data isam frame_i result +global options data isam result frame_i global poseNoise odometryNoise pointNoise measurementNoise -global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE -global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES -global SAVE_FIGURES SAVE_GRAPHS -%% iSAM Options -HARD_CONSTRAINT = false; -POINT_PRIORS = false; -BATCH_INIT = true; -REORDER_INTERVAL = 10; -ALWAYS_RELINEARIZE = false; - -%% Display Options -SAVE_GRAPH = false; -PRINT_STATS = false; -DRAW_INTERVAL = 5; -CAMERA_INTERVAL = 1; -DRAW_TRUE_POSES = false; -SAVE_FIGURES = false; -SAVE_GRAPHS = false; - -%% Generate data +% Data Options options.triangle = false; options.nrCameras = 20; -showImages = false; -data = VisualISAMGenerateData(options,showImages); +options.showImages = false; + +% iSAM Options +options.hardConstraint = false; +options.pointPriors = false; +options.batchInitialization = true; +options.reorderInterval = 10; +options.alwaysRelinearize = false; + +% Display Options +options.saveDotFile = false; +options.printStats = false; +options.drawInterval = 5; +options.cameraInterval = 1; +options.drawTruePoses = false; +options.saveFigures = false; +options.saveDotFiles = false; + +%% Generate data +data = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -VisualISAMInitialize -figure; -VisualISAMPlot +VisualISAMInitialize(options) +figure(1); +VisualISAMPlot(data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras VisualISAMStep - if mod(frame_i,DRAW_INTERVAL)==0 - VisualISAMPlot + if mod(frame_i,options.drawInterval)==0 + VisualISAMPlot(data, isam, result, options) end end \ No newline at end of file diff --git a/matlab/examples/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m index 536dbf9c1..2fdb35599 100644 --- a/matlab/examples/VisualISAMExample_triangle.m +++ b/matlab/examples/VisualISAMExample_triangle.m @@ -11,43 +11,42 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Global variables used in VisualISAMExample -global data isam frame_i result +global options data isam result frame_i global poseNoise odometryNoise pointNoise measurementNoise -global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE -global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES -global SAVE_FIGURES SAVE_GRAPHS -%% iSAM Options -HARD_CONSTRAINT = false; -POINT_PRIORS = false; -BATCH_INIT = true; -REORDER_INTERVAL = 10; -ALWAYS_RELINEARIZE = false; - -%% Display Options -SAVE_GRAPH = false; -PRINT_STATS = false; -DRAW_INTERVAL = 5; -CAMERA_INTERVAL = 1; -DRAW_TRUE_POSES = false; -SAVE_FIGURES = false; -SAVE_GRAPHS = false; - -%% Generate data +% Data Options options.triangle = true; options.nrCameras = 10; -showImages = false; -data = VisualISAMGenerateData(options,showImages); +options.showImages = false; + +% iSAM Options +options.hardConstraint = false; +options.pointPriors = false; +options.batchInitialization = true; +options.reorderInterval = 10; +options.alwaysRelinearize = false; + +% Display Options +options.saveDotFile = false; +options.printStats = false; +options.drawInterval = 5; +options.cameraInterval = 1; +options.drawTruePoses = false; +options.saveFigures = false; +options.saveDotFiles = false; + +%% Generate data +data = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -VisualISAMInitialize -figure; -VisualISAMPlot +VisualISAMInitialize(options) +figure(1); +VisualISAMPlot(data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras VisualISAMStep - if mod(frame_i,DRAW_INTERVAL)==0 - VisualISAMPlot + if mod(frame_i,options.drawInterval)==0 + VisualISAMPlot(data, isam, result, options) end end \ No newline at end of file diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m index 0eb504d57..adb0b9243 100644 --- a/matlab/examples/VisualISAMGenerateData.m +++ b/matlab/examples/VisualISAMGenerateData.m @@ -1,7 +1,6 @@ -function data = VisualISAMGenerateData(options, showImages) +function data = VisualISAMGenerateData(options) % VisualISAMGenerateData: create data for viusalSLAM::iSAM examples % Authors: Duy Nguyen Ta and Frank Dellaert -if nargin<2, showImages=false; end %% Generate simulated data data.points = {}; @@ -35,7 +34,7 @@ for i=1:options.nrCameras end %% show images if asked -if showImages +if options.showImages gui = gcf; for i=1:options.nrCameras figure(2+i);clf;hold on diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index 73d512d3d..d7489eb67 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -1,10 +1,7 @@ -function VisualInitialize +function VisualInitialize(options) % VisualInitialize: initialize visualSLAM::iSAM object and noise parameters % Authors: Duy Nguyen Ta and Frank Dellaert -% options -global REORDER_INTERVAL HARD_CONSTRAINT POINT_PRIORS BATCH_INIT ALWAYS_RELINEARIZE - % global variables, input global data @@ -13,7 +10,7 @@ global isam frame_i result global poseNoise odometryNoise pointNoise measurementNoise %% Initialize iSAM -isam = visualSLAMISAM(REORDER_INTERVAL); +isam = visualSLAMISAM(options.reorderInterval); %% Set Noise parameters poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); @@ -26,7 +23,7 @@ newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; for frame_i=1:2 ii = symbol('x',frame_i); - if frame_i==1 & HARD_CONSTRAINT % add hard constraint + if frame_i==1 & options.hardConstraint % add hard constraint newFactors.addPoseConstraint(ii,data.cameras{1}.pose); else newFactors.addPosePrior(ii,data.cameras{frame_i}.pose, poseNoise); @@ -48,14 +45,14 @@ end %% Initialize points, possibly add priors on them for j=1:size(data.points,2) jj = symbol('l',j); - if POINT_PRIORS % add point priors + if options.pointPriors % add point priors newFactors.addPointPrior(jj, data.points{j}, pointNoise); end initialEstimates.insertPoint(jj, data.points{j}); % TODO: should not be from ground truth! end %% Update ISAM -if BATCH_INIT % Do a full optimize for first two poses +if options.batchInitialization % Do a full optimize for first two poses fullyOptimized = newFactors.optimize(initialEstimates); isam.update(newFactors, fullyOptimized); else @@ -66,7 +63,7 @@ end result = isam.estimate(); % t=toc; plot(frame_i,t,'g.'); -if ALWAYS_RELINEARIZE % re-linearize +if options.alwaysRelinearize % re-linearize isam.reorder_relinearize(); end diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index fc4436332..42407ec82 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -1,58 +1,62 @@ +function VisualISAMPlot(data, isam, result, options) % VisualISAMPlot: plot current state of visualSLAM::iSAM object % Authors: Duy Nguyen Ta and Frank Dellaert -% global variables, input -global data frame_i isam result +M = double(result.nrPoses); +N = double(result.nrPoints); -% options -global CAMERA_INTERVAL DRAW_TRUE_POSES SAVE_FIGURES SAVE_GRAPHS -global SAVE_GRAPH PRINT_STATS - -%% Plot results h=gca; cla(h); hold on; -for j=1:size(data.points,2) - point_j = result.point(symbol('l',j)); + +%% Plot points +for j=1:N + jj = symbol('l',j); + point_j = result.point(jj); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - if (frame_i>1) - P = isam.marginalCovariance(symbol('l',j)); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); - end -end -for ii=1:CAMERA_INTERVAL:frame_i - pose_ii = result.pose(symbol('x',ii)); - if (frame_i>1) - P = isam.marginalCovariance(symbol('x',ii)); - else - P = []; - end - plotPose3(pose_ii,P,10); - if DRAW_TRUE_POSES % show ground truth - plotPose3(data.cameras{ii}.pose,0.001*eye(6),10); + P = isam.marginalCovariance(jj); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); +end + +%% Plot cameras +for i=1:options.cameraInterval:M + ii = symbol('x',i); + pose_i = result.pose(ii); + if options.hardConstraint & (i==1) + plotPose3(pose_i,[],10); + else + P = isam.marginalCovariance(ii); + plotPose3(pose_i,P,10); + end + if options.drawTruePoses % show ground truth + plotPose3(data.cameras{i}.pose,[],10); end end + +%% draw axis([-40 40 -40 40 -10 20]);axis equal view(3) colormap('hot') +drawnow -if SAVE_FIGURES +%% do various optional things + +if options.saveFigures fig2 = figure('visible','off'); newax = copyobj(h,fig2); colormap(fig2,'hot'); set(newax, 'units', 'normalized', 'position', [0.13 0.11 0.775 0.815]); - print(fig2,'-dpng',sprintf('VisualiSAM%03d.png',frame_i)); -end -if SAVE_GRAPHS && (frame_i>1) - isam.saveGraph(sprintf('VisualiSAM%03d.dot',frame_i)); + print(fig2,'-dpng',sprintf('VisualiSAM%03d.png',M)); end -if SAVE_GRAPH - isam.saveGraph(sprintf('VisualiSAM.dot',frame_i)); +if options.saveDotFiles + isam.saveGraph(sprintf('VisualiSAM%03d.dot',M)); end -if PRINT_STATS +if options.saveDotFile + isam.saveGraph(sprintf('VisualiSAM.dot')); +end + +if options.printStats isam.printStats(); end - -drawnow \ No newline at end of file diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index 9bf8f93ac..30b0dfcce 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -3,8 +3,7 @@ function VisualISAMStep % Authors: Duy Nguyen Ta and Frank Dellaert % global variables, input -global frame_i odometryNoise measurementNoise -global data +global options data odometryNoise measurementNoise frame_i % global variables, input/output global isam @@ -12,9 +11,6 @@ global isam % global variables, output global result -% options -global SHOW_TIMING ALWAYS_RELINEARIZE - % iSAM expects us to give it a new set of factors % along with initial estimates for any new variables introduced. newFactors = visualSLAMGraph; @@ -40,6 +36,6 @@ isam.update(newFactors, initialEstimates); result = isam.estimate(); % t=toc; plot(frame_i,t,'g.'); -if ALWAYS_RELINEARIZE % re-linearize +if options.alwaysRelinearize % re-linearize isam.reorder_relinearize(); end diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index a1f9a8a54..3adeb4b1c 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -71,26 +71,28 @@ end function initOptions(handles) -global HARD_CONSTRAINT POINT_PRIORS BATCH_INIT REORDER_INTERVAL ALWAYS_RELINEARIZE -global SAVE_GRAPH PRINT_STATS DRAW_INTERVAL CAMERA_INTERVAL DRAW_TRUE_POSES -global SAVE_FIGURES SAVE_GRAPHS SHOW_TIMING +global options + +% Data options +options.triangle = chooseDataset(handles); +options.nrCameras = str2num(get(handles.numCamEdit,'String')); +options.showImages = get(handles.showImagesCB,'Value'); % iSAM Options -HARD_CONSTRAINT = get(handles.hardConstraintCB,'Value'); -POINT_PRIORS = get(handles.pointPriorsCB,'Value'); -BATCH_INIT = get(handles.batchInitCB,'Value'); -REORDER_INTERVAL = str2num(get(handles.reorderIntervalEdit,'String')); -ALWAYS_RELINEARIZE = get(handles.alwaysRelinearizeCB,'Value'); +options.hardConstraint = get(handles.hardConstraintCB,'Value'); +options.pointPriors = get(handles.pointPriorsCB,'Value'); +options.batchInitialization = get(handles.batchInitCB,'Value'); +options.reorderInterval = str2num(get(handles.reorderIntervalEdit,'String')); +options.alwaysRelinearize = get(handles.alwaysRelinearizeCB,'Value'); % Display Options -SAVE_GRAPH = get(handles.saveGraphCB,'Value'); -PRINT_STATS = get(handles.printStatsCB,'Value'); -DRAW_INTERVAL = str2num(get(handles.drawInterval,'String')); -CAMERA_INTERVAL = str2num(get(handles.cameraIntervalEdit,'String')); -DRAW_TRUE_POSES = get(handles.drawTruePosesCB,'Value'); -SAVE_FIGURES = get(handles.saveFiguresCB,'Value'); -SAVE_GRAPHS = get(handles.saveGraphsCB,'Value'); -SHOW_TIMING = false; +options.saveDotFile = get(handles.saveGraphCB,'Value'); +options.printStats = get(handles.printStatsCB,'Value'); +options.drawInterval = str2num(get(handles.drawInterval,'String')); +options.cameraInterval = str2num(get(handles.cameraIntervalEdit,'String')); +options.drawTruePoses = get(handles.drawTruePosesCB,'Value'); +options.saveFigures = get(handles.saveFiguresCB,'Value'); +options.saveDotFiles = get(handles.saveGraphsCB,'Value'); %---------------------------------------------------------- % Callback functions for GUI elements @@ -222,33 +224,31 @@ function saveGraphsCB_Callback(hObject, ~, handles) % --- Executes on button press in intializeButton. function intializeButton_Callback(hObject, ~, handles) -global data +global options data isam result % initialize global options +global options initOptions(handles) % Generate Data -options.triangle = chooseDataset(handles); -options.nrCameras = str2num(get(handles.numCamEdit,'String')); -showImages = get(handles.showImagesCB,'Value'); -data = VisualISAMGenerateData(options, showImages); +data = VisualISAMGenerateData(options); % Initialize and plot -VisualISAMInitialize -VisualISAMPlot +VisualISAMInitialize(options) +VisualISAMPlot(data, isam, result, options) showFramei(hObject, handles) % --- Executes on button press in runButton. function runButton_Callback(hObject, ~, handles) -global frame_i data DRAW_INTERVAL +global options data frame_i isam result while (frame_i Date: Sun, 10 Jun 2012 16:06:37 +0000 Subject: [PATCH 317/914] Fixed Doxygen warning. --- gtsam/nonlinear/NonlinearFactor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index a01cead24..19c9c6988 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -36,7 +36,7 @@ /** * Macro to add a standard clone function to a derived factor - * @DEPRECIATED: will go away shortly - just add the clone function directly + * @DEPRECATED: will go away shortly - just add the clone function directly */ #define ADD_CLONE_NONLINEAR_FACTOR(Derived) \ virtual gtsam::NonlinearFactor::shared_ptr clone() const { \ From 653d4ef131aec6553692e8b42844f8212e3b0c09 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 10 Jun 2012 18:46:56 +0000 Subject: [PATCH 318/914] No more globals (except in gui and demo) --- matlab/examples/VisualISAMDemo.m | 4 +--- matlab/examples/VisualISAMExample.m | 10 +++------ matlab/examples/VisualISAMExample_triangle.m | 10 +++------ matlab/examples/VisualISAMInitialize.m | 23 +++++++------------- matlab/examples/VisualISAMStep.m | 22 ++++++------------- matlab/examples/VisualISAM_gui.m | 17 ++++++++------- 6 files changed, 31 insertions(+), 55 deletions(-) diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m index f4b975ad5..00518293a 100644 --- a/matlab/examples/VisualISAMDemo.m +++ b/matlab/examples/VisualISAMDemo.m @@ -3,9 +3,7 @@ % Make sure global variables are visible on command prompt % so you can examine how they change as you step through -global data -global poseNoise pointNoise odometryNoise measurementNoise -global frame_i isam result +global frame_i data noiseModels isam result options % Start GUI VisualISAM_gui \ No newline at end of file diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index f7114b652..eadca5d2f 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -10,10 +10,6 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Global variables used in VisualISAMExample -global options data isam result frame_i -global poseNoise odometryNoise pointNoise measurementNoise - % Data Options options.triangle = false; options.nrCameras = 20; @@ -39,14 +35,14 @@ options.saveDotFiles = false; data = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -VisualISAMInitialize(options) +[noiseModels,isam,result] = VisualISAMInitialize(data,options); figure(1); VisualISAMPlot(data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras - VisualISAMStep + [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); if mod(frame_i,options.drawInterval)==0 VisualISAMPlot(data, isam, result, options) end -end \ No newline at end of file +end diff --git a/matlab/examples/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m index 2fdb35599..c9c416cb2 100644 --- a/matlab/examples/VisualISAMExample_triangle.m +++ b/matlab/examples/VisualISAMExample_triangle.m @@ -10,10 +10,6 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Global variables used in VisualISAMExample -global options data isam result frame_i -global poseNoise odometryNoise pointNoise measurementNoise - % Data Options options.triangle = true; options.nrCameras = 10; @@ -39,14 +35,14 @@ options.saveDotFiles = false; data = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -VisualISAMInitialize(options) +[noiseModels,isam,result] = VisualISAMInitialize(data,options); figure(1); VisualISAMPlot(data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras - VisualISAMStep + [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); if mod(frame_i,options.drawInterval)==0 VisualISAMPlot(data, isam, result, options) end -end \ No newline at end of file +end diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index d7489eb67..f79a30a93 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -1,22 +1,15 @@ -function VisualInitialize(options) +function [noiseModels,isam,result] = VisualInitialize(data,options) % VisualInitialize: initialize visualSLAM::iSAM object and noise parameters % Authors: Duy Nguyen Ta and Frank Dellaert -% global variables, input -global data - -% global variables, output -global isam frame_i result -global poseNoise odometryNoise pointNoise measurementNoise - %% Initialize iSAM isam = visualSLAMISAM(options.reorderInterval); %% Set Noise parameters -poseNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -pointNoise = gtsamSharedNoiseModel_Sigma(3, 0.1); -measurementNoise = gtsamSharedNoiseModel_Sigma(2, 1.0); +noiseModels.pose = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.odometry = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.point = gtsamSharedNoiseModel_Sigma(3, 0.1); +noiseModels.measurement = gtsamSharedNoiseModel_Sigma(2, 1.0); %% Add constraints/priors newFactors = visualSLAMGraph; @@ -26,7 +19,7 @@ for frame_i=1:2 if frame_i==1 & options.hardConstraint % add hard constraint newFactors.addPoseConstraint(ii,data.cameras{1}.pose); else - newFactors.addPosePrior(ii,data.cameras{frame_i}.pose, poseNoise); + newFactors.addPosePrior(ii,data.cameras{frame_i}.pose, noiseModels.pose); end % TODO: init should not be from ground truth! initialEstimates.insertPose(ii,data.cameras{frame_i}.pose); @@ -38,7 +31,7 @@ for frame_i=1:2 for j=1:size(data.points,2) jj = symbol('l',j); zij = data.cameras{frame_i}.project(data.points{j}); - newFactors.addMeasurement(zij, measurementNoise, ii, jj, data.K); + newFactors.addMeasurement(zij, noiseModels.measurement, ii, jj, data.K); end end @@ -46,7 +39,7 @@ end for j=1:size(data.points,2) jj = symbol('l',j); if options.pointPriors % add point priors - newFactors.addPointPrior(jj, data.points{j}, pointNoise); + newFactors.addPointPrior(jj, data.points{j}, noiseModels.point); end initialEstimates.insertPoint(jj, data.points{j}); % TODO: should not be from ground truth! end diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index 30b0dfcce..ca951e5e5 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -1,33 +1,25 @@ -function VisualISAMStep +function [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); % VisualISAMStep: execute one update step of visualSLAM::iSAM object % Authors: Duy Nguyen Ta and Frank Dellaert -% global variables, input -global options data odometryNoise measurementNoise frame_i - -% global variables, input/output -global isam - -% global variables, output -global result - % iSAM expects us to give it a new set of factors % along with initial estimates for any new variables introduced. newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; %% Add odometry -newFactors.addOdometry(symbol('x',frame_i-1), symbol('x',frame_i), data.odometry, odometryNoise); +i = double(result.nrPoses)+1; +newFactors.addOdometry(symbol('x',i-1), symbol('x',i), data.odometry, noiseModels.odometry); %% Add visual measurement factors for j=1:size(data.points,2) - zij = data.cameras{frame_i}.project(data.points{j}); - newFactors.addMeasurement(zij, measurementNoise, symbol('x',frame_i), symbol('l',j), data.K); + zij = data.cameras{i}.project(data.points{j}); + newFactors.addMeasurement(zij, noiseModels.measurement, symbol('x',i), symbol('l',j), data.K); end %% Initial estimates for the new pose. -prevPose = result.pose(symbol('x',frame_i-1)); -initialEstimates.insertPose(symbol('x',frame_i), prevPose.compose(data.odometry)); +prevPose = result.pose(symbol('x',i-1)); +initialEstimates.insertPose(symbol('x',i), prevPose.compose(data.odometry)); %% Update ISAM % figure(1);tic; diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index 3adeb4b1c..49b73ab65 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -224,28 +224,28 @@ function saveGraphsCB_Callback(hObject, ~, handles) % --- Executes on button press in intializeButton. function intializeButton_Callback(hObject, ~, handles) -global options data isam result +global frame_i data noiseModels isam result options % initialize global options -global options initOptions(handles) % Generate Data data = VisualISAMGenerateData(options); % Initialize and plot -VisualISAMInitialize(options) +[noiseModels,isam,result] = VisualISAMInitialize(data,options); VisualISAMPlot(data, isam, result, options) +frame_i = 2; showFramei(hObject, handles) % --- Executes on button press in runButton. function runButton_Callback(hObject, ~, handles) -global options data frame_i isam result +global frame_i data noiseModels isam result options while (frame_i Date: Sun, 10 Jun 2012 19:55:01 +0000 Subject: [PATCH 319/914] Fixed factor equals --- gtsam_unstable/nonlinear/LinearizedFactor.cpp | 17 +++++++++-------- gtsam_unstable/nonlinear/LinearizedFactor.h | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/gtsam_unstable/nonlinear/LinearizedFactor.cpp b/gtsam_unstable/nonlinear/LinearizedFactor.cpp index 82e5c9eef..2d3d1af72 100644 --- a/gtsam_unstable/nonlinear/LinearizedFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearizedFactor.cpp @@ -129,16 +129,17 @@ void LinearizedFactor::print(const std::string& s, const KeyFormatter& keyFormat } /* ************************************************************************* */ -bool LinearizedFactor::equals(const LinearizedFactor& other, double tol) const { - if (!Base::equals(other, tol) - || !lin_points_.equals(other.lin_points_, tol) - || !equal_with_abs_tol(b_, other.b_, tol) - || !model_->equals(*other.model_, tol) - || matrices_.size() != other.matrices_.size()) +bool LinearizedFactor::equals(const NonlinearFactor& other, double tol) const { + const LinearizedFactor* e = dynamic_cast(&other); + if (!e || !Base::equals(other, tol) + || !lin_points_.equals(e->lin_points_, tol) + || !equal_with_abs_tol(b_, e->b_, tol) + || !model_->equals(*e->model_, tol) + || matrices_.size() != e->matrices_.size()) return false; - KeyMatrixMap::const_iterator map1 = matrices_.begin(), map2 = other.matrices_.begin(); - for (; map1 != matrices_.end(), map2 != other.matrices_.end(); ++map1, ++map2) + KeyMatrixMap::const_iterator map1 = matrices_.begin(), map2 = e->matrices_.begin(); + for (; map1 != matrices_.end(), map2 != e->matrices_.end(); ++map1, ++map2) if ((map1->first != map2->first) || !equal_with_abs_tol(map1->second, map2->second, tol)) return false; return true; diff --git a/gtsam_unstable/nonlinear/LinearizedFactor.h b/gtsam_unstable/nonlinear/LinearizedFactor.h index 8f9461d02..28102d8fd 100644 --- a/gtsam_unstable/nonlinear/LinearizedFactor.h +++ b/gtsam_unstable/nonlinear/LinearizedFactor.h @@ -100,7 +100,7 @@ public: virtual void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; /** equals function with optional tolerance */ - virtual bool equals(const LinearizedFactor& other, double tol = 1e-9) const; + virtual bool equals(const NonlinearFactor& other, double tol = 1e-9) const; // access functions From f90ae6feca92449e3597bb58a72350a81ec6d026 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 10 Jun 2012 22:32:24 +0000 Subject: [PATCH 320/914] Made generateData create ground truth and measurements, and now step only uses the latter. --- matlab/examples/VisualISAMExample.m | 8 ++--- matlab/examples/VisualISAMExample_triangle.m | 8 ++--- matlab/examples/VisualISAMGenerateData.m | 34 ++++++++++++-------- matlab/examples/VisualISAMInitialize.m | 32 +++++++++--------- matlab/examples/VisualISAMPlot.m | 4 +-- matlab/examples/VisualISAMStep.m | 10 +++--- matlab/examples/VisualISAM_gui.m | 24 +++++++------- 7 files changed, 63 insertions(+), 57 deletions(-) diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index eadca5d2f..2dfde60bb 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -32,17 +32,17 @@ options.saveFigures = false; options.saveDotFiles = false; %% Generate data -data = VisualISAMGenerateData(options); +[data,truth] = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -[noiseModels,isam,result] = VisualISAMInitialize(data,options); +[noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); figure(1); -VisualISAMPlot(data, isam, result, options) +VisualISAMPlot(truth, data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); if mod(frame_i,options.drawInterval)==0 - VisualISAMPlot(data, isam, result, options) + VisualISAMPlot(truth, data, isam, result, options) end end diff --git a/matlab/examples/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m index c9c416cb2..c5cdf288d 100644 --- a/matlab/examples/VisualISAMExample_triangle.m +++ b/matlab/examples/VisualISAMExample_triangle.m @@ -32,17 +32,17 @@ options.saveFigures = false; options.saveDotFiles = false; %% Generate data -data = VisualISAMGenerateData(options); +[data,truth] = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -[noiseModels,isam,result] = VisualISAMInitialize(data,options); +[noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); figure(1); -VisualISAMPlot(data, isam, result, options) +VisualISAMPlot(truth, data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); if mod(frame_i,options.drawInterval)==0 - VisualISAMPlot(data, isam, result, options) + VisualISAMPlot(truth, data, isam, result, options) end end diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m index adb0b9243..fab8185f9 100644 --- a/matlab/examples/VisualISAMGenerateData.m +++ b/matlab/examples/VisualISAMGenerateData.m @@ -1,19 +1,18 @@ -function data = VisualISAMGenerateData(options) +function [data,truth] = VisualISAMGenerateData(options) % VisualISAMGenerateData: create data for viusalSLAM::iSAM examples % Authors: Duy Nguyen Ta and Frank Dellaert %% Generate simulated data -data.points = {}; if options.triangle % Create a triangle target, just 3 points on a plane - nPoints = 3; + nrPoints = 3; r = 10; - for j=1:nPoints - theta = (j-1)*2*pi/nPoints; - data.points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); + for j=1:nrPoints + theta = (j-1)*2*pi/nrPoints; + truth.points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); end else % 3D landmarks as vertices of a cube - nPoints = 8; - data.points = {gtsamPoint3([10 10 10]'),... + nrPoints = 8; + truth.points = {gtsamPoint3([10 10 10]'),... gtsamPoint3([-10 10 10]'),... gtsamPoint3([-10 -10 10]'),... gtsamPoint3([10 -10 10]'),... @@ -25,12 +24,16 @@ end %% Create camera cameras on a circle around the triangle height = 10; r = 40; -data.K = gtsamCal3_S2(500,500,0,640/2,480/2); -data.cameras = {}; +truth.K = gtsamCal3_S2(500,500,0,640/2,480/2); +data.K = truth.K; for i=1:options.nrCameras theta = (i-1)*2*pi/options.nrCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - data.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), data.K); + truth.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), truth.K); + % Create measurements + for j=1:nrPoints + data.z{i,j} = truth.cameras{i}.project(truth.points{j}); + end end %% show images if asked @@ -39,8 +42,8 @@ if options.showImages for i=1:options.nrCameras figure(2+i);clf;hold on set(2+i,'NumberTitle','off','Name',sprintf('Camera %d',i)); - for j=1:nPoints - zij = data.cameras{i}.project(data.points{j}); + for j=1:nrPoints + zij = truth.cameras{i}.project(truth.points{j}); plot(zij.x,zij.y,'*'); axis([1 640 1 480]); end @@ -49,4 +52,7 @@ if options.showImages end %% Calculate odometry between cameras -data.odometry = data.cameras{1}.pose.between(data.cameras{2}.pose); +odometry = truth.cameras{1}.pose.between(truth.cameras{2}.pose); +for i=1:options.nrCameras-1 + data.odometry{i}=odometry; +end \ No newline at end of file diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/examples/VisualISAMInitialize.m index f79a30a93..13a4258c9 100644 --- a/matlab/examples/VisualISAMInitialize.m +++ b/matlab/examples/VisualISAMInitialize.m @@ -1,4 +1,4 @@ -function [noiseModels,isam,result] = VisualInitialize(data,options) +function [noiseModels,isam,result] = VisualInitialize(data,truth,options) % VisualInitialize: initialize visualSLAM::iSAM object and noise parameters % Authors: Duy Nguyen Ta and Frank Dellaert @@ -12,36 +12,36 @@ noiseModels.point = gtsamSharedNoiseModel_Sigma(3, 0.1); noiseModels.measurement = gtsamSharedNoiseModel_Sigma(2, 1.0); %% Add constraints/priors +% TODO: should not be from ground truth! newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; -for frame_i=1:2 - ii = symbol('x',frame_i); - if frame_i==1 & options.hardConstraint % add hard constraint - newFactors.addPoseConstraint(ii,data.cameras{1}.pose); +for i=1:2 + ii = symbol('x',i); + if i==1 & options.hardConstraint % add hard constraint + newFactors.addPoseConstraint(ii,truth.cameras{1}.pose); else - newFactors.addPosePrior(ii,data.cameras{frame_i}.pose, noiseModels.pose); + newFactors.addPosePrior(ii,truth.cameras{i}.pose, noiseModels.pose); end - % TODO: init should not be from ground truth! - initialEstimates.insertPose(ii,data.cameras{frame_i}.pose); + initialEstimates.insertPose(ii,truth.cameras{i}.pose); end %% Add visual measurement factors from two first poses -for frame_i=1:2 - ii = symbol('x',frame_i); - for j=1:size(data.points,2) +for i=1:2 + ii = symbol('x',i); + for j=1:size(data.z,2) jj = symbol('l',j); - zij = data.cameras{frame_i}.project(data.points{j}); - newFactors.addMeasurement(zij, noiseModels.measurement, ii, jj, data.K); + newFactors.addMeasurement(data.z{i,j}, noiseModels.measurement, ii, jj, data.K); end end %% Initialize points, possibly add priors on them -for j=1:size(data.points,2) +% TODO: should not be from ground truth! +for j=1:size(data.z,2) jj = symbol('l',j); if options.pointPriors % add point priors - newFactors.addPointPrior(jj, data.points{j}, noiseModels.point); + newFactors.addPointPrior(jj, truth.points{j}, noiseModels.point); end - initialEstimates.insertPoint(jj, data.points{j}); % TODO: should not be from ground truth! + initialEstimates.insertPoint(jj, truth.points{j}); end %% Update ISAM diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/examples/VisualISAMPlot.m index 42407ec82..8e8dce6f1 100644 --- a/matlab/examples/VisualISAMPlot.m +++ b/matlab/examples/VisualISAMPlot.m @@ -1,4 +1,4 @@ -function VisualISAMPlot(data, isam, result, options) +function VisualISAMPlot(truth, data, isam, result, options) % VisualISAMPlot: plot current state of visualSLAM::iSAM object % Authors: Duy Nguyen Ta and Frank Dellaert @@ -29,7 +29,7 @@ for i=1:options.cameraInterval:M plotPose3(pose_i,P,10); end if options.drawTruePoses % show ground truth - plotPose3(data.cameras{i}.pose,[],10); + plotPose3(truth.cameras{i}.pose,[],10); end end diff --git a/matlab/examples/VisualISAMStep.m b/matlab/examples/VisualISAMStep.m index ca951e5e5..491fd9bac 100644 --- a/matlab/examples/VisualISAMStep.m +++ b/matlab/examples/VisualISAMStep.m @@ -9,17 +9,17 @@ initialEstimates = visualSLAMValues; %% Add odometry i = double(result.nrPoses)+1; -newFactors.addOdometry(symbol('x',i-1), symbol('x',i), data.odometry, noiseModels.odometry); +odometry = data.odometry{i-1}; +newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, noiseModels.odometry); %% Add visual measurement factors -for j=1:size(data.points,2) - zij = data.cameras{i}.project(data.points{j}); - newFactors.addMeasurement(zij, noiseModels.measurement, symbol('x',i), symbol('l',j), data.K); +for j=1:size(data.z,2) + newFactors.addMeasurement(data.z{i,j}, noiseModels.measurement, symbol('x',i), symbol('l',j), data.K); end %% Initial estimates for the new pose. prevPose = result.pose(symbol('x',i-1)); -initialEstimates.insertPose(symbol('x',i), prevPose.compose(data.odometry)); +initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); %% Update ISAM % figure(1);tic; diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m index 49b73ab65..97405a318 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -224,31 +224,31 @@ function saveGraphsCB_Callback(hObject, ~, handles) % --- Executes on button press in intializeButton. function intializeButton_Callback(hObject, ~, handles) -global frame_i data noiseModels isam result options +global frame_i truth data noiseModels isam result options % initialize global options initOptions(handles) % Generate Data -data = VisualISAMGenerateData(options); +[data,truth] = VisualISAMGenerateData(options); % Initialize and plot -[noiseModels,isam,result] = VisualISAMInitialize(data,options); -VisualISAMPlot(data, isam, result, options) +[noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); +VisualISAMPlot(truth, data, isam, result, options) frame_i = 2; showFramei(hObject, handles) % --- Executes on button press in runButton. function runButton_Callback(hObject, ~, handles) -global frame_i data noiseModels isam result options -while (frame_i Date: Mon, 11 Jun 2012 13:12:02 +0000 Subject: [PATCH 321/914] add an enum field --- gtsam/linear/ConjugateGradientSolver.h | 3 ++- gtsam/linear/IterativeSolver.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gtsam/linear/ConjugateGradientSolver.h b/gtsam/linear/ConjugateGradientSolver.h index c31507f9b..06b2aa178 100644 --- a/gtsam/linear/ConjugateGradientSolver.h +++ b/gtsam/linear/ConjugateGradientSolver.h @@ -18,6 +18,7 @@ namespace gtsam { /** * parameters for the conjugate gradient method */ + struct ConjugateGradientParameters : public IterativeOptimizationParameters { typedef IterativeOptimizationParameters Base; @@ -45,7 +46,7 @@ struct ConjugateGradientParameters : public IterativeOptimizationParameters { epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs), blas_kernel_(blas) {} ConjugateGradientParameters(const ConjugateGradientParameters &p) - : minIterations_(p.minIterations_), maxIterations_(p.maxIterations_), reset_(p.reset_), + : Base(p), minIterations_(p.minIterations_), maxIterations_(p.maxIterations_), reset_(p.reset_), epsilon_rel_(p.epsilon_rel_), epsilon_abs_(p.epsilon_abs_), blas_kernel_(p.blas_kernel_) {} /* general interface */ diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 6f002bda4..77146d1e4 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -24,7 +24,7 @@ namespace gtsam { typedef boost::shared_ptr shared_ptr; enum Kernel { CG = 0 } kernel_ ; ///< Iterative Method Kernel - enum Verbosity { SILENT, ERROR } verbosity_; + enum Verbosity { SILENT = 0, COMPLEXITY, ERROR } verbosity_; public: From ffd210b11ed4e2313a0b2f3924611347b5d6b907 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 11 Jun 2012 14:31:32 +0000 Subject: [PATCH 322/914] Command line for generating svn stats, needs statsvn from statsvn.org --- makestats.sh | 1 + 1 file changed, 1 insertion(+) create mode 100644 makestats.sh diff --git a/makestats.sh b/makestats.sh new file mode 100644 index 000000000..f1201ddd0 --- /dev/null +++ b/makestats.sh @@ -0,0 +1 @@ +java -jar ~/src/statsvn-0.7.0/statsvn.jar -output-dir stats -exclude "examples/Data/**/*;gtsam/3rdparty/**/*" logfile.log . From f602049484d6fa1e31454255b0f8d3b2a9f932ca Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 11 Jun 2012 14:48:26 +0000 Subject: [PATCH 323/914] Wrapped SimpleCamera::projectSafe() --- gtsam.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam.h b/gtsam.h index ff9bb2022..e728de125 100644 --- a/gtsam.h +++ b/gtsam.h @@ -442,6 +442,7 @@ class SimpleCamera { // Action on Point3 gtsam::Point2 project(const gtsam::Point3& point); + pair projectSafe(const gtsam::Point3& pw) const; static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); // Backprojection From 3be4be9039ba6aa264e36f530fecc01faff53d37 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 11 Jun 2012 14:50:22 +0000 Subject: [PATCH 324/914] Moved "bigobj" MSVC compile flag to affect testSerializationSLAM --- gtsam/slam/CMakeLists.txt | 4 ---- tests/CMakeLists.txt | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gtsam/slam/CMakeLists.txt b/gtsam/slam/CMakeLists.txt index 768ab2307..c25e32bd4 100644 --- a/gtsam/slam/CMakeLists.txt +++ b/gtsam/slam/CMakeLists.txt @@ -24,10 +24,6 @@ if (GTSAM_BUILD_TESTS) gtsam_add_subdir_tests(slam "${slam_local_libs}" "gtsam-static" "${slam_excluded_files}") endif(GTSAM_BUILD_TESTS) -if(MSVC) - add_definitions("/bigobj") -endif() - # Build timing scripts if (GTSAM_BUILD_TIMING) gtsam_add_subdir_timing(slam "${slam_local_libs}" "gtsam-static" "${slam_excluded_files}") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9e4c501d4..213d2f5e9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -25,6 +25,10 @@ set (tests_exclude #"${CMAKE_CURRENT_SOURCE_DIR}/testOccupancyGrid.cpp" ) +if(MSVC) + add_definitions("/bigobj") # testSerializationSLAM needs this +endif() + # Build tests if (GTSAM_BUILD_TESTS) # Subdirectory target for tests From 22c8c483a9d3a2c5c2bd51869b80dd2dd1821ff1 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 11 Jun 2012 14:52:05 +0000 Subject: [PATCH 325/914] Added headers files to show up in MSVC --- CppUnitLite/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CppUnitLite/CMakeLists.txt b/CppUnitLite/CMakeLists.txt index 286a39258..534a802d4 100644 --- a/CppUnitLite/CMakeLists.txt +++ b/CppUnitLite/CMakeLists.txt @@ -3,7 +3,7 @@ file(GLOB cppunitlite_headers "*.h") file(GLOB cppunitlite_src "*.cpp") -add_library(CppUnitLite STATIC ${cppunitlite_src}) +add_library(CppUnitLite STATIC ${cppunitlite_src} ${cppunitlite_headers}) gtsam_assign_source_folders("${cppunitlite_headers};${cppunitlite_src}") # MSVC project structure From e53aecf97017b60af20da74725e079a12475eb6a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 11 Jun 2012 14:53:13 +0000 Subject: [PATCH 326/914] Qualified boost::shared_ptr --- gtsam/linear/GaussianBayesNet.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/gtsam/linear/GaussianBayesNet.cpp b/gtsam/linear/GaussianBayesNet.cpp index d1f0d8f8d..0ddc4a7b3 100644 --- a/gtsam/linear/GaussianBayesNet.cpp +++ b/gtsam/linear/GaussianBayesNet.cpp @@ -28,7 +28,6 @@ using namespace std; using namespace gtsam; -using boost::shared_ptr; // trick from some reading group #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL) @@ -73,13 +72,13 @@ void push_front(GaussianBayesNet& bn, Index key, Vector d, Matrix R, } /* ************************************************************************* */ -shared_ptr allocateVectorValues(const GaussianBayesNet& bn) { +boost::shared_ptr allocateVectorValues(const GaussianBayesNet& bn) { vector dimensions(bn.size()); Index var = 0; - BOOST_FOREACH(const shared_ptr conditional, bn) { + BOOST_FOREACH(const boost::shared_ptr conditional, bn) { dimensions[var++] = conditional->dim(); } - return shared_ptr(new VectorValues(dimensions)); + return boost::shared_ptr(new VectorValues(dimensions)); } /* ************************************************************************* */ @@ -93,7 +92,7 @@ VectorValues optimize(const GaussianBayesNet& bn) { // (R*x)./sigmas = y by solving x=inv(R)*(y.*sigmas) void optimizeInPlace(const GaussianBayesNet& bn, VectorValues& x) { /** solve each node in turn in topological sort order (parents first)*/ - BOOST_REVERSE_FOREACH(const shared_ptr cg, bn) { + BOOST_REVERSE_FOREACH(const boost::shared_ptr cg, bn) { // i^th part of R*x=y, x=inv(R)*y // (Rii*xi + R_i*x(i+1:))./si = yi <-> xi = inv(Rii)*(yi.*si - R_i*x(i+1:)) cg->solveInPlace(x); @@ -103,14 +102,14 @@ void optimizeInPlace(const GaussianBayesNet& bn, VectorValues& x) { /* ************************************************************************* */ VectorValues backSubstitute(const GaussianBayesNet& bn, const VectorValues& input) { VectorValues output = input; - BOOST_REVERSE_FOREACH(const shared_ptr cg, bn) { + BOOST_REVERSE_FOREACH(const boost::shared_ptr cg, bn) { const Index key = *(cg->beginFrontals()); Vector xS = internal::extractVectorValuesSlices(output, cg->beginParents(), cg->endParents()); xS = input[key] - cg->get_S() * xS; output[key] = cg->get_R().triangularView().solve(xS); } - BOOST_FOREACH(const shared_ptr cg, bn) { + BOOST_FOREACH(const boost::shared_ptr cg, bn) { cg->scaleFrontalsBySigma(output); } @@ -131,7 +130,7 @@ VectorValues backSubstituteTranspose(const GaussianBayesNet& bn, // we loop from first-eliminated to last-eliminated // i^th part of L*gy=gx is done block-column by block-column of L - BOOST_FOREACH(const shared_ptr cg, bn) + BOOST_FOREACH(const boost::shared_ptr cg, bn) cg->solveTransposeInPlace(gy); // Scale gy @@ -197,7 +196,7 @@ pair matrix(const GaussianBayesNet& bn) { Index key; size_t I; FOREACH_PAIR(key,I,mapping) { // find corresponding conditional - shared_ptr cg = bn[key]; + boost::shared_ptr cg = bn[key]; // get sigmas Vector sigmas = cg->get_sigmas(); @@ -234,7 +233,7 @@ pair matrix(const GaussianBayesNet& bn) { double determinant(const GaussianBayesNet& bayesNet) { double logDet = 0.0; - BOOST_FOREACH(shared_ptr cg, bayesNet){ + BOOST_FOREACH(boost::shared_ptr cg, bayesNet){ logDet += cg->get_R().diagonal().unaryExpr(ptr_fun(log)).sum(); } From 83dc580220ab31a1c51de04365101219191d5890 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Mon, 11 Jun 2012 22:10:23 +0000 Subject: [PATCH 327/914] add a nonlinear gradient-descent optimizer, and a unit test. todo: 1. test wolfe condition or armijo rule, 2. use iterative.h --- gtsam/nonlinear/GradientDescentOptimizer.cpp | 120 +++++++++++++++++++ gtsam/nonlinear/GradientDescentOptimizer.h | 74 ++++++++++++ tests/testGradientDescentOptimizer.cpp | 66 ++++++++++ 3 files changed, 260 insertions(+) create mode 100644 gtsam/nonlinear/GradientDescentOptimizer.cpp create mode 100644 gtsam/nonlinear/GradientDescentOptimizer.h create mode 100644 tests/testGradientDescentOptimizer.cpp diff --git a/gtsam/nonlinear/GradientDescentOptimizer.cpp b/gtsam/nonlinear/GradientDescentOptimizer.cpp new file mode 100644 index 000000000..9416b4f6c --- /dev/null +++ b/gtsam/nonlinear/GradientDescentOptimizer.cpp @@ -0,0 +1,120 @@ +/** + * @file GradientDescentOptimizer.cpp + * @brief + * @author ydjian + * @date Jun 11, 2012 + */ + +#include + +#include +#include +#include +#include +#include + +#include + +using namespace std; + +namespace gtsam { + +/** + * Return the gradient vector of a nonlinear factor given a linearization point and a variable ordering + * Can be moved to NonlinearFactorGraph.h if desired + */ +void gradientInPlace(const NonlinearFactorGraph &nfg, const Values &values, const Ordering &ordering, VectorValues &g) { + + // Linearize graph + GaussianFactorGraph::shared_ptr linear = nfg.linearize(values, ordering); + const FactorGraph::shared_ptr jfg = linear->dynamicCastFactors >(); + + // compute the gradient direction + gtsam::gradientAtZero(*jfg, g); +} + + +/* ************************************************************************* */ +void GradientDescentOptimizer::iterate() { + + + // Pull out parameters we'll use + const NonlinearOptimizerParams::Verbosity nloVerbosity = params_.verbosity; + + // compute the gradient vector + gradientInPlace(graph_, state_.values, *ordering_, *gradient_); + + /* normalize it such that it becomes a unit vector */ + const double g = gradient_->vector().norm(); + gradient_->vector() /= g; + + // perform the golden section search algorithm to decide the the optimal step size + // detail refer to http://en.wikipedia.org/wiki/Golden_section_search + VectorValues step = VectorValues::SameStructure(*gradient_); + const double phi = 0.5*(1.0+std::sqrt(5.0)), resphi = 2.0 - phi, tau = 1e-5; + double minStep = -1.0, maxStep = 0, + newStep = minStep + (maxStep-minStep) / (phi+1.0) ; + + step.vector() = newStep * gradient_->vector(); + Values newValues = state_.values.retract(step, *ordering_); + double newError = graph_.error(newValues); + + if ( nloVerbosity ) { + std::cout << "minStep = " << minStep << ", maxStep = " << maxStep << ", newStep = " << newStep << ", newError = " << newError << std::endl; + } + + while (true) { + const bool flag = (maxStep - newStep > newStep - minStep) ? true : false ; + const double testStep = flag ? + newStep + resphi * (maxStep - newStep) : newStep - resphi * (newStep - minStep); + + if ( (maxStep- minStep) < tau * (std::fabs(testStep) + std::fabs(newStep)) ) { + newStep = 0.5*(minStep+maxStep); + step.vector() = newStep * gradient_->vector(); + newValues = state_.values.retract(step, *ordering_); + newError = graph_.error(newValues); + + if ( newError < state_.error ) { + state_.values = state_.values.retract(step, *ordering_); + state_.error = graph_.error(state_.values); + } + + break; + } + + step.vector() = testStep * gradient_->vector(); + const Values testValues = state_.values.retract(step, *ordering_); + const double testError = graph_.error(testValues); + + // update the working range + if ( testError < newError ) { + if ( flag ) { + minStep = newStep; + newStep = testStep; + newError = testError; + } + else { + maxStep = newStep; + newStep = testStep; + newError = testError; + } + } + else { + if ( flag ) { + maxStep = testStep; + } + else { + minStep = testStep; + } + } + + if ( nloVerbosity ) { + std::cout << "minStep = " << minStep << ", maxStep = " << maxStep << ", newStep = " << newStep << ", newError = " << newError << std::endl; + } + } + + // Increment the iteration counter + ++state_.iterations; +} + +} /* namespace gtsam */ diff --git a/gtsam/nonlinear/GradientDescentOptimizer.h b/gtsam/nonlinear/GradientDescentOptimizer.h new file mode 100644 index 000000000..03e1c018b --- /dev/null +++ b/gtsam/nonlinear/GradientDescentOptimizer.h @@ -0,0 +1,74 @@ +/** + * @file GradientDescentOptimizer.cpp + * @brief + * @author ydjian + * @date Jun 11, 2012 + */ + +#pragma once + +#include + +namespace gtsam { + +class GradientDescentOptimizer; + +class GradientDescentParams : public NonlinearOptimizerParams { + +public: + typedef NonlinearOptimizerParams Base; + + GradientDescentParams():Base() {} + virtual void print(const std::string& str = "") const { + Base::print(str); + } + + virtual ~GradientDescentParams() {} +}; + +class GradientDescentState : public NonlinearOptimizerState { + +public: + + typedef NonlinearOptimizerState Base; + + GradientDescentState(const NonlinearFactorGraph& graph, const Values& values) + : Base(graph, values) {} +}; + +class GradientDescentOptimizer : public NonlinearOptimizer { + +public: + + typedef boost::shared_ptr shared_ptr; + typedef NonlinearOptimizer Base; + typedef GradientDescentState States; + typedef GradientDescentParams Parameters; + +protected: + + Parameters params_; + States state_; + Ordering::shared_ptr ordering_; + VectorValues::shared_ptr gradient_; + +public: + + GradientDescentOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, const Parameters& params = Parameters()) + : Base(graph), params_(params), state_(graph, initialValues), + ordering_(initialValues.orderingArbitrary()), + gradient_(new VectorValues(initialValues.zeroVectors(*ordering_))) {} + + virtual ~GradientDescentOptimizer() {} + + virtual void iterate(); + +protected: + + virtual const NonlinearOptimizerState& _state() const { return state_; } + virtual const NonlinearOptimizerParams& _params() const { return params_; } +}; + + + +} diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp new file mode 100644 index 000000000..de4de4a6f --- /dev/null +++ b/tests/testGradientDescentOptimizer.cpp @@ -0,0 +1,66 @@ +/** + * @file testGradientDescentOptimizer.cpp + * @brief + * @author ydjian + * @date Jun 11, 2012 + */ + +#include +#include + +#include + +#include +#include + +using namespace std; +using namespace gtsam; + +/* ************************************************************************* */ +TEST(optimize, GradientDescentOptimizer) { + + // 1. Create graph container and add factors to it + pose2SLAM::Graph graph ; + + // 2a. Add Gaussian prior + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin + SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); + graph.addPrior(1, priorMean, priorNoise); + + // 2b. Add odometry factors + SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); + graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); + graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + + // 2c. Add pose constraint + SharedDiagonal constraintUncertainty(Vector_(3, 0.2, 0.2, 0.1)); + graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + + // 3. Create the data structure to hold the initialEstimate estinmate to the solution + pose2SLAM::Values initialEstimate; + Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); + Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); + Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); + Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); + Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); + // cout << "initial error = " << graph.error(initialEstimate) << endl ; + + // 4. Single Step Optimization using Levenberg-Marquardt + GradientDescentParams param; + param.maxIterations = 500; /* requires a larger number of iterations to converge */ + param.verbosity = NonlinearOptimizerParams::SILENT; + + GradientDescentOptimizer optimizer(graph, initialEstimate, param); + Values result = optimizer.optimize(); + // cout << "solver final error = " << graph.error(result) << endl; + + /* the optimality of the solution is not comparable to the */ + DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); +} + + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From f1c5b9f5dc846648df3ba6dad0b1bb6ac11081d7 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 12 Jun 2012 04:38:05 +0000 Subject: [PATCH 328/914] Renamed some examples --- matlab/examples/{LocalizationExample.m => OdometryExample.m} | 2 +- matlab/examples/PlanarSLAMExample.m | 2 +- matlab/examples/Pose2SLAMExample.m | 2 +- .../examples/{Pose3SLAMExample_circle.m => Pose3SLAMExample.m} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename matlab/examples/{LocalizationExample.m => OdometryExample.m} (99%) rename matlab/examples/{Pose3SLAMExample_circle.m => Pose3SLAMExample.m} (99%) diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/OdometryExample.m similarity index 99% rename from matlab/examples/LocalizationExample.m rename to matlab/examples/OdometryExample.m index dacd6d972..bb9d06c70 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/OdometryExample.m @@ -44,7 +44,7 @@ result = graph.optimize(initialEstimate); result.print(sprintf('\nFinal result:\n ')); %% Plot Covariance Ellipses -figure(1);clf; +cla; plot(result.xs(),result.ys(),'k*-'); hold on marginals = graph.marginals(result); for i=1:result.size() diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index c5cc2d5d3..7d4973883 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -62,7 +62,7 @@ result = graph.optimize(initialEstimate); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses -figure(1);clf;hold on +cla;hold on marginals = graph.marginals(result); for i=1:3 key = symbol('x',i); diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m index 1f63ffd60..e15cab3bf 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/examples/Pose2SLAMExample.m @@ -56,7 +56,7 @@ result = graph.optimize(initialEstimate); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses -figure(1);clf; +cla; plot(result.xs(),result.ys(),'k*-'); hold on plot([result.pose(5).x;result.pose(2).x],[result.pose(5).y;result.pose(2).y],'r-'); marginals = graph.marginals(result); diff --git a/matlab/examples/Pose3SLAMExample_circle.m b/matlab/examples/Pose3SLAMExample.m similarity index 99% rename from matlab/examples/Pose3SLAMExample_circle.m rename to matlab/examples/Pose3SLAMExample.m index 1c8e481ee..285701cff 100644 --- a/matlab/examples/Pose3SLAMExample_circle.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -38,7 +38,7 @@ initial.insertPose(4, hexagon.pose(4).retract(s*randn(6,1))); initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); %% Plot Initial Estimate -figure(1);clf +cla plot3(initial.xs(),initial.ys(),initial.zs(),'g-*'); %% optimize From 990eca29db0b1e1f4008199152bb08075b79705f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 12 Jun 2012 04:46:51 +0000 Subject: [PATCH 329/914] Added an example selector. Try it using gtsamExamples :-) --- .../{VO_Example.m => StereoVOExample_large.m} | 0 matlab/examples/VisualISAMExample.m | 2 +- matlab/examples/VisualSLAMExample.m | 2 +- matlab/examples/gtsamExamples.fig | Bin 0 -> 7342 bytes matlab/examples/gtsamExamples.m | 142 ++++++++++++++++++ 5 files changed, 144 insertions(+), 2 deletions(-) rename matlab/examples/{VO_Example.m => StereoVOExample_large.m} (100%) create mode 100644 matlab/examples/gtsamExamples.fig create mode 100644 matlab/examples/gtsamExamples.m diff --git a/matlab/examples/VO_Example.m b/matlab/examples/StereoVOExample_large.m similarity index 100% rename from matlab/examples/VO_Example.m rename to matlab/examples/StereoVOExample_large.m diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index 2dfde60bb..f8423a057 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -36,7 +36,7 @@ options.saveDotFiles = false; %% Initialize iSAM with the first pose and points [noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); -figure(1); +cla; VisualISAMPlot(truth, data, isam, result, options) %% Main loop for iSAM: stepping through all poses diff --git a/matlab/examples/VisualSLAMExample.m b/matlab/examples/VisualSLAMExample.m index f6ef2063b..c2b045dab 100644 --- a/matlab/examples/VisualSLAMExample.m +++ b/matlab/examples/VisualSLAMExample.m @@ -80,7 +80,7 @@ result.print(sprintf('\nFinal result:\n ')); %% Plot results with covariance ellipses marginals = graph.marginals(result); -figure(1);clf +cla hold on; for j=1:size(points,2) P = marginals.marginalCovariance(symbol('l',j)); diff --git a/matlab/examples/gtsamExamples.fig b/matlab/examples/gtsamExamples.fig new file mode 100644 index 0000000000000000000000000000000000000000..39370f3df54fab4ef92d744742611a8679b409bd GIT binary patch literal 7342 zcma)BRa+a1vcm^2*B+^n2jz~cYrko z%uPfbMt!g`nJ%CJqIS{J>#p*pa?iiPrIIDgyBfo32)@uu?I!s~`*+0WCYFArQQR%& zPli#N`a>!A-gl^9LlM*+d^}Z0WGkBcW&;(4qTdspYOGdDICrh@Zi2Q8vIY>3taf>@ zrg$!r;WOMJ+P;bW9xRf`+P?->0p@==j6JtLTTM+ws@u?{KCco}u}#)r_k?kFXS^rrK9+yc5AzJFZj3ikcn1l&S?qUD#Zw?C9Xu zXdda{RY)Wmc;c-pvL=0zVo$~I#nIm(dfkF0S|wM1c_+ptHCU1bnArgB$5AGFSeTgL z2+ekIy&yOG@%w9ZQInVYVT(D#){X3ix^N8Sp5a>(kBs>EU}kTfU9aTy!pSZv+pj;} zuXM8*Nr2_Pot#w@BuyetC*Bb+#Pq)5dq(yh@;N+vGJ%K9Nb^7uXe=y&Itv4^f;#r} zSGAtxvsNsHy9#dRDs`@Zn*X%<6WvqH6vBvoPVnl@zf`ci!2CR(Rjhzb_!AnQNpSX4 z8a(DQ#)^}lZwG0Y|cP<+wL$6F=|T3vAMbQtbsbBGj|ewr{&k}1zs;} zz;>H(ZEv)WI*S!m54l!%X@@nB#J$pep?R9E>j3`+Nk3v1`PlBaw@0E4jwj$`QIxRX>2-v4>d>ugOz)#^cO}b*ln;LFS4GZ{DsBp5I=~6EA@}(M9u) zCm-za-d^ez7I9yXxRiOlGg2T32~W^&Ag!*-ir2Sor2A9^hSJq#6C2MSzt4#%UZ`Db zeE%wBt6K3>T%u1}yy4`!+-z-qZCl)Zo3lAkXPaQ)HW8lWn!#8W_Ud6UwO~d1B7WSn zx+58v)RbSb5Bp8Rt0%5!O+3^cN@a4lDvO_?cWyqjO;b;$JiY=?EXTwPC9AXmk|kOL zYdzPL(Rl)6)9p=H}iZ z+AD@kQZC-q4p*~vq{(-t{V)>G)&Yr(%Xvvz!1}N5rT-m;Pfy4CWA>D?RJny4)BnJ1 zh;fMvz_pi0Y+i%Knwly$e3d!B)e^yN9`*I7YQIm0LQFvf-eggEBBTZQHzjY$B@ z&L&k zr4-3tXJ^1ljk7l)%}1jK{M(XuV_mj$uX1|q%!CQuLBy_64{|T5!uO)+8O3%s^CW-` z>V!4ba&>XTlQR7-nAG6SzYYzgut?D_>O1hj%P-%UijtD(-k<`XKZ+jlo&3$FK5u1{ zFpx!ed}>)~zkfk}DpXsmaYvWZTgp0Cn)Fyw0JQ=#9u(KK(8C9-PIQ#Mfi zo*6wJpi1CbGFa>S@Fikp^+}|jGaAVt5{+aV=XC#CZkAOYkmZDDoJIOwmutH9*RjJ# zT$o0?O}amoMs=CcV~QBgA_&?&!Cf=-;@cTKPJt`@nFF&?SE-OX%>KI=)I7hkQS|Qn zC7oQ)y~CuiZ0s&9^t+-|q#FfzS2EG9E@)vqe(vjU>eG3qq9xI&l;VVg;m?Eft2f(? z&p0A=m4yTv?IPn{))SDQ*kQ;UCBx_;ygH&@kj^YDoHa*UdOcG{?CkP>SKU7YhT1oT zxj9rkSe`ZApvU(S68Ik=0|Diuak@SCda3t|YkBvt`Z=ZVxIg%6w*0vlO;^IDHXP9| z>F4FSg)8J7?YN_}U8jssr5pNp2Lfy)3bgpEe*rCZFIp~V?D2My*9lcmzTW$Nnc)cQ zgDat%9iMwH@7(5 zdm`Y=(}P*2P17C!SZK%f0tI}rctS~&4g#V}9U zR-i`ENqc;9hO5ig@$1XMQ}LkAfIz8y>oQCJ)K$01|CpUNq5dzk2by-9f=g*bf7K%J ze<*(o#{b#hNEIW^L`M9AC&jkyNAgiss75V#C4 z^HdjbvoB=4M&Q`3Z75~zedsY;(vrvu>I5btP@OB-MaL!IkNvAtzMbaEdzLg2-L
^P;1yAB@S`9dr1AkO?j?aAj5)&j1K^>4exLv@uD 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 DOG?XA literal 0 HcmV?d00001 diff --git a/matlab/examples/gtsamExamples.m b/matlab/examples/gtsamExamples.m new file mode 100644 index 000000000..4f6cb525c --- /dev/null +++ b/matlab/examples/gtsamExamples.m @@ -0,0 +1,142 @@ +function varargout = gtsamExamples(varargin) +% GTSAMEXAMPLES MATLAB code for gtsamExamples.fig +% GTSAMEXAMPLES, by itself, creates a new GTSAMEXAMPLES or raises the existing +% singleton*. +% +% H = GTSAMEXAMPLES returns the handle to a new GTSAMEXAMPLES or the handle to +% the existing singleton*. +% +% GTSAMEXAMPLES('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in GTSAMEXAMPLES.M with the given input arguments. +% +% GTSAMEXAMPLES('Property','Value',...) creates a new GTSAMEXAMPLES or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before gtsamExamples_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to gtsamExamples_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help gtsamExamples + +% Last Modified by GUIDE v2.5 12-Jun-2012 00:27:03 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @gtsamExamples_OpeningFcn, ... + 'gui_OutputFcn', @gtsamExamples_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + +% --- Executes just before gtsamExamples is made visible. +function gtsamExamples_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to gtsamExamples (see VARARGIN) + +% Choose default command line output for gtsamExamples +handles.output = hObject; + +% Update handles structure +guidata(hObject, handles); + +% This sets up the initial plot - only do when we are invisible +% so window can get raised using gtsamExamples. +if strcmp(get(hObject,'Visible'),'off') + plot(rand(5)); +end + +% --- Outputs from this function are returned to the command line. +function varargout = gtsamExamples_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + +% -------------------------------------------------------------------- +function CloseMenuItem_Callback(hObject, eventdata, handles) +% hObject handle to CloseMenuItem (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],... + ['Close ' get(handles.figure1,'Name') '...'],... + 'Yes','No','Yes'); +if strcmp(selection,'No') + return; +end + +delete(handles.figure1) + +% --- Executes on button press in Odometry. +function Odometry_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +OdometryExample; +echo off + +% --- Executes on button press in Localization. +function Localization_Callback(hObject, eventdata, handles) +fprintf(1,'LocalizationExample not implemented yet\n'); + +% --- Executes on button press in Pose2SLAM. +function Pose2SLAM_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +Pose2SLAMExample +echo off + +% --- Executes on button press in Pose3SLAM. +function Pose3SLAM_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +Pose3SLAMExample +echo off + +% --- Executes on button press in PlanarSLAM. +function PlanarSLAM_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +PlanarSLAMExample +echo off + +% --- Executes on button press in VisualSLAM. +function VisualSLAM_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +VisualSLAMExample +echo off + +% --- Executes on button press in VisualISAM. +function VisualISAM_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +VisualISAMExample +echo off + +% --- Executes on button press in StereoVO. +function StereoVO_Callback(hObject, eventdata, handles) +fprintf(1,'StereoVOExample not implemented yet\n'); + +% --- Executes on button press in Future. +function Future_Callback(hObject, eventdata, handles) +fprintf(1,'Future demo not implemented yet :-)\n'); From 7638da41929f0bb46879db19b6cb5a6633c98d03 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 12 Jun 2012 04:56:44 +0000 Subject: [PATCH 330/914] Rename --- examples/{LocalizationExample.cpp => OdometryExample.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{LocalizationExample.cpp => OdometryExample.cpp} (100%) diff --git a/examples/LocalizationExample.cpp b/examples/OdometryExample.cpp similarity index 100% rename from examples/LocalizationExample.cpp rename to examples/OdometryExample.cpp From c8cb0d00c8d17d996c80bebff31fa77cd88eccd5 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 12 Jun 2012 04:57:07 +0000 Subject: [PATCH 331/914] Rename --- examples/{LocalizationExample2.cpp => LocalizationExample.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{LocalizationExample2.cpp => LocalizationExample.cpp} (100%) diff --git a/examples/LocalizationExample2.cpp b/examples/LocalizationExample.cpp similarity index 100% rename from examples/LocalizationExample2.cpp rename to examples/LocalizationExample.cpp From aeeb47d4708c903c71edc8c30fb8e78b3e65d3f1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 12 Jun 2012 05:01:12 +0000 Subject: [PATCH 332/914] Fixed up comments --- examples/LocalizationExample.cpp | 2 +- examples/OdometryExample.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index ea651008c..caa87e48f 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -11,7 +11,7 @@ /** * @file LocalizationExample.cpp - * @brief Simple robot localization example + * @brief Simple robot localization example, with three "GPS-like" measurements * @author Frank Dellaert */ diff --git a/examples/OdometryExample.cpp b/examples/OdometryExample.cpp index 578f33558..3c00aca81 100644 --- a/examples/OdometryExample.cpp +++ b/examples/OdometryExample.cpp @@ -10,8 +10,8 @@ * -------------------------------------------------------------------------- */ /** - * @file LocalizationExample.cpp - * @brief Simple robot localization example + * @file OdometryExample.cpp + * @brief Simple robot motion example, with prior and two odometry measurements * @author Frank Dellaert */ From 03a6317a0cfa2c340c0392c36d44210d2355681a Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 12 Jun 2012 05:29:25 +0000 Subject: [PATCH 333/914] Added LocalizationExample --- matlab/examples/LocalizationExample.m | 58 ++++++++++++++++++++++++++ matlab/examples/OdometryExample.m | 1 + matlab/examples/gtsamExamples.fig | Bin 7342 -> 9239 bytes matlab/examples/gtsamExamples.m | 10 ++--- 4 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 matlab/examples/LocalizationExample.m diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m new file mode 100644 index 000000000..0e801e4c0 --- /dev/null +++ b/matlab/examples/LocalizationExample.m @@ -0,0 +1,58 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Example of a simple 2D localization example +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - Robot poses are facing along the X axis (horizontal, to the right in 2D) +% - The robot moves 2 meters each step +% - The robot is on a grid, moving 2 meters each step + +%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) +graph = pose2SLAMGraph; + +%% Add two odometry factors +odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +graph.addOdometry(1, 2, odometry, odometryNoise); +graph.addOdometry(2, 3, odometry, odometryNoise); + +%% Add three "GPS" measurements +% We use Pose2 Priors here with high variance on theta +noiseModel = gtsamSharedNoiseModel_Sigmas([0.1; 0.1; 10]); +graph.addPrior(1, gtsamPose2(0.0, 0.0, 0.0), noiseModel); +graph.addPrior(2, gtsamPose2(2.0, 0.0, 0.0), noiseModel); +graph.addPrior(3, gtsamPose2(4.0, 0.0, 0.0), noiseModel); + +%% print +graph.print(sprintf('\nFactor graph:\n')); + +%% Initialize to noisy points +initialEstimate = pose2SLAMValues; +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); +initialEstimate.print(sprintf('\nInitial estimate:\n ')); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); +result.print(sprintf('\nFinal result:\n ')); + +%% Plot Covariance Ellipses +cla; +plot(result.xs(),result.ys(),'k*-'); hold on +marginals = graph.marginals(result); +for i=1:result.size() + pose_i = result.pose(i); + P{i}=marginals.marginalCovariance(i); + plotPose2(pose_i,'g',P{i}) +end +axis([-0.6 4.8 -1 1]) +axis equal diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index bb9d06c70..68bdf0380 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -52,4 +52,5 @@ for i=1:result.size() P{i}=marginals.marginalCovariance(i); plotPose2(pose_i,'g',P{i}) end +axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/examples/gtsamExamples.fig b/matlab/examples/gtsamExamples.fig index 39370f3df54fab4ef92d744742611a8679b409bd..e29163e28733672598de3319389497c87053bf2c 100644 GIT binary patch delta 8860 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 Date: Tue, 12 Jun 2012 14:19:01 +0000 Subject: [PATCH 334/914] move iterative.* back to stable. add a template-style nonlinear iterative solver --- gtsam/linear/ConjugateGradientSolver.h | 4 +- gtsam/linear/SubgraphSolver.cpp | 3 +- gtsam/linear/SubgraphSolver.h | 3 +- gtsam/linear/VectorValues.h | 5 + .../linear/iterative-inl.h | 2 +- .../linear/iterative.cpp | 2 +- {gtsam_unstable => gtsam}/linear/iterative.h | 2 +- gtsam/nonlinear/GradientDescentOptimizer.cpp | 26 ++- gtsam/nonlinear/GradientDescentOptimizer.h | 148 +++++++++++++++++- gtsam_unstable/CMakeLists.txt | 1 - tests/testGradientDescentOptimizer.cpp | 48 +++++- tests/testSubgraphPreconditioner.cpp | 2 +- 12 files changed, 226 insertions(+), 20 deletions(-) rename {gtsam_unstable => gtsam}/linear/iterative-inl.h (99%) rename {gtsam_unstable => gtsam}/linear/iterative.cpp (98%) rename {gtsam_unstable => gtsam}/linear/iterative.h (98%) diff --git a/gtsam/linear/ConjugateGradientSolver.h b/gtsam/linear/ConjugateGradientSolver.h index 06b2aa178..3a42b8842 100644 --- a/gtsam/linear/ConjugateGradientSolver.h +++ b/gtsam/linear/ConjugateGradientSolver.h @@ -19,7 +19,9 @@ namespace gtsam { * parameters for the conjugate gradient method */ -struct ConjugateGradientParameters : public IterativeOptimizationParameters { +class ConjugateGradientParameters : public IterativeOptimizationParameters { + +public: typedef IterativeOptimizationParameters Base; typedef boost::shared_ptr shared_ptr; diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index c91365f19..891585ee5 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -13,14 +13,13 @@ #include #include #include +#include #include #include #include #include #include -#include - #include #include diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index ec9a5f19a..debb373f2 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -19,7 +19,8 @@ namespace gtsam { -struct SubgraphSolverParameters : public ConjugateGradientParameters { +class SubgraphSolverParameters : public ConjugateGradientParameters { +public: typedef ConjugateGradientParameters Base; SubgraphSolverParameters() : Base() {} }; diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index f3ef57418..3531989c9 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -262,6 +262,11 @@ namespace gtsam { return gtsam::dot(this->values_, V.values_); } + /** Vector L2 norm */ + inline double norm() const { + return this->vector().norm(); + } + /** * + operator does element-wise addition. Both VectorValues must have the * same structure (checked when NDEBUG is not defined). diff --git a/gtsam_unstable/linear/iterative-inl.h b/gtsam/linear/iterative-inl.h similarity index 99% rename from gtsam_unstable/linear/iterative-inl.h rename to gtsam/linear/iterative-inl.h index f384b7504..3c9cffc7b 100644 --- a/gtsam_unstable/linear/iterative-inl.h +++ b/gtsam/linear/iterative-inl.h @@ -18,7 +18,7 @@ #pragma once -#include +#include #include #include diff --git a/gtsam_unstable/linear/iterative.cpp b/gtsam/linear/iterative.cpp similarity index 98% rename from gtsam_unstable/linear/iterative.cpp rename to gtsam/linear/iterative.cpp index eb1d898dd..6dadb2d72 100644 --- a/gtsam_unstable/linear/iterative.cpp +++ b/gtsam/linear/iterative.cpp @@ -16,7 +16,7 @@ * @date Dec 28, 2009 */ -#include +#include #include #include #include diff --git a/gtsam_unstable/linear/iterative.h b/gtsam/linear/iterative.h similarity index 98% rename from gtsam_unstable/linear/iterative.h rename to gtsam/linear/iterative.h index 29233ae27..4237f2632 100644 --- a/gtsam_unstable/linear/iterative.h +++ b/gtsam/linear/iterative.h @@ -149,5 +149,5 @@ namespace gtsam { } // namespace gtsam -#include +#include diff --git a/gtsam/nonlinear/GradientDescentOptimizer.cpp b/gtsam/nonlinear/GradientDescentOptimizer.cpp index 9416b4f6c..9a4b6b37b 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.cpp +++ b/gtsam/nonlinear/GradientDescentOptimizer.cpp @@ -5,15 +5,13 @@ * @date Jun 11, 2012 */ -#include - #include #include #include #include #include -#include +#include using namespace std; @@ -30,7 +28,7 @@ void gradientInPlace(const NonlinearFactorGraph &nfg, const Values &values, cons const FactorGraph::shared_ptr jfg = linear->dynamicCastFactors >(); // compute the gradient direction - gtsam::gradientAtZero(*jfg, g); + gradientAtZero(*jfg, g); } @@ -112,9 +110,27 @@ void GradientDescentOptimizer::iterate() { std::cout << "minStep = " << minStep << ", maxStep = " << maxStep << ", newStep = " << newStep << ", newError = " << newError << std::endl; } } - // Increment the iteration counter ++state_.iterations; } +double GradientDescentOptimizer2::System::error(const State &state) const { + return graph_.error(state); +} + +GradientDescentOptimizer2::System::Gradient GradientDescentOptimizer2::System::gradient(const State &state) const { + Gradient result = state.zeroVectors(ordering_); + gradientInPlace(graph_, state, ordering_, result); + return result; +} +GradientDescentOptimizer2::System::State GradientDescentOptimizer2::System::advance(const State ¤t, const double alpha, const Gradient &g) const { + Gradient step = g; + step.vector() *= alpha; + return current.retract(step, ordering_); +} + +Values GradientDescentOptimizer2::optimize() { + return gradientDescent(System(graph_, *ordering_), initialEstimate_, params_); +} + } /* namespace gtsam */ diff --git a/gtsam/nonlinear/GradientDescentOptimizer.h b/gtsam/nonlinear/GradientDescentOptimizer.h index 03e1c018b..1a78416de 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.h +++ b/gtsam/nonlinear/GradientDescentOptimizer.h @@ -11,7 +11,7 @@ namespace gtsam { -class GradientDescentOptimizer; +/* an implementation of gradient-descent method using the NLO interface */ class GradientDescentParams : public NonlinearOptimizerParams { @@ -70,5 +70,151 @@ protected: }; +#include + +/* Yet another implementation of the gradient-descent method using the iterative.h interface */ +class GradientDescentParams2 : public NonlinearOptimizerParams { +public: + GradientDescentParams2(){} +}; + +class GradientDescentOptimizer2 { + + class System { + + public: + + typedef Values State; + typedef VectorValues Gradient; + + protected: + + NonlinearFactorGraph graph_; + Ordering ordering_; + + public: + + System(const NonlinearFactorGraph &graph, const Ordering &ordering): graph_(graph), ordering_(ordering) {} + double error(const State &state) const ; + Gradient gradient(const State &state) const ; + State advance(const State ¤t, const double alpha, const Gradient &g) const ; + }; + +public: + + typedef GradientDescentParams2 Parameters; + typedef boost::shared_ptr shared_ptr; + +protected: + + NonlinearFactorGraph graph_; + Values initialEstimate_; + Parameters params_; + Ordering::shared_ptr ordering_; + VectorValues::shared_ptr gradient_; + +public: + + GradientDescentOptimizer2(const NonlinearFactorGraph& graph, const Values& initialValues, const Parameters& params = Parameters()) + : graph_(graph), initialEstimate_(initialValues), params_(params), + ordering_(initialValues.orderingArbitrary()), + gradient_(new VectorValues(initialValues.zeroVectors(*ordering_))) {} + + virtual ~GradientDescentOptimizer2() {} + + virtual Values optimize () ; +}; + + +template +double lineSearch(const S &system, const V currentValues, const W &gradient) { + + /* normalize it such that it becomes a unit vector */ + const double g = gradient.norm(); + + // perform the golden section search algorithm to decide the the optimal step size + // detail refer to http://en.wikipedia.org/wiki/Golden_section_search + const double phi = 0.5*(1.0+std::sqrt(5.0)), resphi = 2.0 - phi, tau = 1e-5; + double minStep = -1.0/g, maxStep = 0, + newStep = minStep + (maxStep-minStep) / (phi+1.0) ; + + V newValues = system.advance(currentValues, newStep, gradient); + double newError = system.error(newValues); + + while (true) { + const bool flag = (maxStep - newStep > newStep - minStep) ? true : false ; + const double testStep = flag ? + newStep + resphi * (maxStep - newStep) : newStep - resphi * (newStep - minStep); + + if ( (maxStep- minStep) < tau * (std::fabs(testStep) + std::fabs(newStep)) ) { + return 0.5*(minStep+maxStep); + } + + const V testValues = system.advance(currentValues, testStep, gradient); + const double testError = system.error(testValues); + + // update the working range + if ( testError >= newError ) { + if ( flag ) maxStep = testStep; + else minStep = testStep; + } + else { + if ( flag ) { + minStep = newStep; + newStep = testStep; + newError = testError; + } + else { + maxStep = newStep; + newStep = testStep; + newError = testError; + } + } + } + + return 0.0; +} + +template +V gradientDescent(const S &system, const V &initial, const NonlinearOptimizerParams ¶ms) { + + V currentValues = initial, prevValues; + double currentError = system.error(currentValues), prevError; + Index iteration = 0; + + // check if we're already close enough + if(currentError <= params.errorTol) { + if (params.verbosity >= NonlinearOptimizerParams::ERROR) + std::cout << "Exiting, as error = " << currentError << " < " << params.errorTol << std::endl; + return currentValues; + } + + // Maybe show output + if (params.verbosity >= NonlinearOptimizerParams::ERROR) std::cout << "Initial error: " << currentError << std::endl; + + // Iterative loop + do { + // Do next iteration + const typename S::Gradient gradient = system.gradient(currentValues); + const double alpha = lineSearch(system, currentValues, gradient); + + prevValues = currentValues; + prevError = currentError; + + currentValues = system.advance(prevValues, alpha, gradient); + currentError = system.error(currentValues); + + // Maybe show output + if(params.verbosity >= NonlinearOptimizerParams::ERROR) std::cout << "currentError: " << currentError << std::endl; + } while( ++iteration < params.maxIterations && + !checkConvergence(params.relativeErrorTol, params.absoluteErrorTol, + params.errorTol, prevError, currentError, params.verbosity)); + + // Printing if verbose + if (params.verbosity >= NonlinearOptimizerParams::ERROR && iteration >= params.maxIterations) + std::cout << "Terminating because reached maximum iterations" << std::endl; + + return currentValues; +} } diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 2d9f597bd..b03dc3d73 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -4,7 +4,6 @@ set (gtsam_unstable_subdirs base discrete dynamics - linear nonlinear ) diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index de4de4a6f..fac025c77 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -5,19 +5,21 @@ * @date Jun 11, 2012 */ -#include #include +#include #include -#include #include +#include +#include + using namespace std; using namespace gtsam; -/* ************************************************************************* */ -TEST(optimize, GradientDescentOptimizer) { + +boost::tuple generateProblem() { // 1. Create graph container and add factors to it pose2SLAM::Graph graph ; @@ -45,9 +47,21 @@ TEST(optimize, GradientDescentOptimizer) { Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); + + return boost::tie(graph, initialEstimate); +} + + +/* ************************************************************************* */ +TEST(optimize, GradientDescentOptimizer) { + + pose2SLAM::Graph graph ; + pose2SLAM::Values initialEstimate; + + boost::tie(graph, initialEstimate) = generateProblem(); // cout << "initial error = " << graph.error(initialEstimate) << endl ; - // 4. Single Step Optimization using Levenberg-Marquardt + // Single Step Optimization using Levenberg-Marquardt GradientDescentParams param; param.maxIterations = 500; /* requires a larger number of iterations to converge */ param.verbosity = NonlinearOptimizerParams::SILENT; @@ -58,8 +72,32 @@ TEST(optimize, GradientDescentOptimizer) { /* the optimality of the solution is not comparable to the */ DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); + + CHECK(1); } +/* ************************************************************************* */ +TEST(optimize, GradientDescentOptimizer2) { + + pose2SLAM::Graph graph ; + pose2SLAM::Values initialEstimate; + + boost::tie(graph, initialEstimate) = generateProblem(); +// cout << "initial error = " << graph.error(initialEstimate) << endl ; + + // Single Step Optimization using Levenberg-Marquardt + GradientDescentParams2 param; + param.maxIterations = 500; /* requires a larger number of iterations to converge */ + param.verbosity = NonlinearOptimizerParams::ERROR; + + + GradientDescentOptimizer2 optimizer(graph, initialEstimate, param); + Values result = optimizer.optimize(); +// cout << "solver final error = " << graph.error(result) << endl; + + /* the optimality of the solution is not comparable to the */ + DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); +} /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index 0f18924da..382ac4cc7 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -15,9 +15,9 @@ * @author Frank Dellaert **/ -#include #include #include +#include #include #include #include From 8687e1293c98160fd57c766b5f50a3e03a6fa24b Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 12 Jun 2012 14:20:08 +0000 Subject: [PATCH 335/914] disable error msg --- tests/testGradientDescentOptimizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index fac025c77..cfd7db3d7 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -88,7 +88,7 @@ TEST(optimize, GradientDescentOptimizer2) { // Single Step Optimization using Levenberg-Marquardt GradientDescentParams2 param; param.maxIterations = 500; /* requires a larger number of iterations to converge */ - param.verbosity = NonlinearOptimizerParams::ERROR; + param.verbosity = NonlinearOptimizerParams::SILENT; GradientDescentOptimizer2 optimizer(graph, initialEstimate, param); From eb40447a5be2a47e392275e9ad4ba2bd00370b55 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 12 Jun 2012 16:04:23 +0000 Subject: [PATCH 336/914] Moved VisualISAM gui components out to core matlab utilities - now usable for building other examples --- matlab/{examples => }/VisualISAMDemo.m | 0 matlab/{examples => }/VisualISAMGenerateData.m | 0 matlab/{examples => }/VisualISAMInitialize.m | 0 matlab/{examples => }/VisualISAMPlot.m | 0 matlab/{examples => }/VisualISAMStep.m | 0 matlab/{examples => }/VisualISAM_gui.fig | Bin matlab/{examples => }/VisualISAM_gui.m | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename matlab/{examples => }/VisualISAMDemo.m (100%) rename matlab/{examples => }/VisualISAMGenerateData.m (100%) rename matlab/{examples => }/VisualISAMInitialize.m (100%) rename matlab/{examples => }/VisualISAMPlot.m (100%) rename matlab/{examples => }/VisualISAMStep.m (100%) rename matlab/{examples => }/VisualISAM_gui.fig (100%) rename matlab/{examples => }/VisualISAM_gui.m (100%) diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/VisualISAMDemo.m similarity index 100% rename from matlab/examples/VisualISAMDemo.m rename to matlab/VisualISAMDemo.m diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/VisualISAMGenerateData.m similarity index 100% rename from matlab/examples/VisualISAMGenerateData.m rename to matlab/VisualISAMGenerateData.m diff --git a/matlab/examples/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m similarity index 100% rename from matlab/examples/VisualISAMInitialize.m rename to matlab/VisualISAMInitialize.m diff --git a/matlab/examples/VisualISAMPlot.m b/matlab/VisualISAMPlot.m similarity index 100% rename from matlab/examples/VisualISAMPlot.m rename to matlab/VisualISAMPlot.m diff --git a/matlab/examples/VisualISAMStep.m b/matlab/VisualISAMStep.m similarity index 100% rename from matlab/examples/VisualISAMStep.m rename to matlab/VisualISAMStep.m diff --git a/matlab/examples/VisualISAM_gui.fig b/matlab/VisualISAM_gui.fig similarity index 100% rename from matlab/examples/VisualISAM_gui.fig rename to matlab/VisualISAM_gui.fig diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/VisualISAM_gui.m similarity index 100% rename from matlab/examples/VisualISAM_gui.m rename to matlab/VisualISAM_gui.m From b8ca742d3dd32d1e40b1cae34f44eb6164151643 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 12 Jun 2012 18:21:50 +0000 Subject: [PATCH 337/914] Moved demo code back to examples --- matlab/{ => examples}/VisualISAMDemo.m | 0 matlab/{ => examples}/VisualISAMGenerateData.m | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename matlab/{ => examples}/VisualISAMDemo.m (100%) rename matlab/{ => examples}/VisualISAMGenerateData.m (100%) diff --git a/matlab/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m similarity index 100% rename from matlab/VisualISAMDemo.m rename to matlab/examples/VisualISAMDemo.m diff --git a/matlab/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m similarity index 100% rename from matlab/VisualISAMGenerateData.m rename to matlab/examples/VisualISAMGenerateData.m From cee80c1938bb0fe469e9614bac4b19efd8ee7256 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 13 Jun 2012 01:21:10 +0000 Subject: [PATCH 338/914] add a generic nonlinear cg solver --- gtsam/linear/VectorValues.cpp | 8 ++ gtsam/linear/VectorValues.h | 16 +++ gtsam/nonlinear/GradientDescentOptimizer.cpp | 24 ++--- gtsam/nonlinear/GradientDescentOptimizer.h | 100 +++++++++++-------- tests/testGradientDescentOptimizer.cpp | 36 ++++++- 5 files changed, 124 insertions(+), 60 deletions(-) diff --git a/gtsam/linear/VectorValues.cpp b/gtsam/linear/VectorValues.cpp index a0af31c70..5868d8452 100644 --- a/gtsam/linear/VectorValues.cpp +++ b/gtsam/linear/VectorValues.cpp @@ -151,6 +151,14 @@ VectorValues VectorValues::operator+(const VectorValues& c) const { return result; } +/* ************************************************************************* */ +VectorValues VectorValues::operator-(const VectorValues& c) const { + assert(this->hasSameStructure(c)); + VectorValues result(SameStructure(c)); + result.values_ = this->values_ - c.values_; + return result; +} + /* ************************************************************************* */ void VectorValues::operator+=(const VectorValues& c) { assert(this->hasSameStructure(c)); diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 3531989c9..0a32e6812 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -273,6 +273,12 @@ namespace gtsam { */ VectorValues operator+(const VectorValues& c) const; + /** + * + operator does element-wise subtraction. Both VectorValues must have the + * same structure (checked when NDEBUG is not defined). + */ + VectorValues operator-(const VectorValues& c) const; + /** * += operator does element-wise addition. Both VectorValues must have the * same structure (checked when NDEBUG is not defined). @@ -301,6 +307,16 @@ namespace gtsam { void copyStructureFrom(const VectorValues& other); public: + + /** + * scale a vector by a scalar + */ + friend VectorValues operator*(const double a, const VectorValues &V) { + VectorValues result(VectorValues::SameStructure(V)); + result.values_ = a * V.values_; + return result; + } + /// TODO: linear algebra interface seems to have been added for SPCG. friend size_t dim(const VectorValues& V) { return V.dim(); diff --git a/gtsam/nonlinear/GradientDescentOptimizer.cpp b/gtsam/nonlinear/GradientDescentOptimizer.cpp index 9a4b6b37b..2243577c7 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.cpp +++ b/gtsam/nonlinear/GradientDescentOptimizer.cpp @@ -85,7 +85,11 @@ void GradientDescentOptimizer::iterate() { const double testError = graph_.error(testValues); // update the working range - if ( testError < newError ) { + if ( testError >= newError ) { + if ( flag ) maxStep = testStep; + else minStep = testStep; + } + else { if ( flag ) { minStep = newStep; newStep = testStep; @@ -97,14 +101,6 @@ void GradientDescentOptimizer::iterate() { newError = testError; } } - else { - if ( flag ) { - maxStep = testStep; - } - else { - minStep = testStep; - } - } if ( nloVerbosity ) { std::cout << "minStep = " << minStep << ", maxStep = " << maxStep << ", newStep = " << newStep << ", newError = " << newError << std::endl; @@ -114,23 +110,23 @@ void GradientDescentOptimizer::iterate() { ++state_.iterations; } -double GradientDescentOptimizer2::System::error(const State &state) const { +double ConjugateGradientOptimizer::System::error(const State &state) const { return graph_.error(state); } -GradientDescentOptimizer2::System::Gradient GradientDescentOptimizer2::System::gradient(const State &state) const { +ConjugateGradientOptimizer::System::Gradient ConjugateGradientOptimizer::System::gradient(const State &state) const { Gradient result = state.zeroVectors(ordering_); gradientInPlace(graph_, state, ordering_, result); return result; } -GradientDescentOptimizer2::System::State GradientDescentOptimizer2::System::advance(const State ¤t, const double alpha, const Gradient &g) const { +ConjugateGradientOptimizer::System::State ConjugateGradientOptimizer::System::advance(const State ¤t, const double alpha, const Gradient &g) const { Gradient step = g; step.vector() *= alpha; return current.retract(step, ordering_); } -Values GradientDescentOptimizer2::optimize() { - return gradientDescent(System(graph_, *ordering_), initialEstimate_, params_); +Values ConjugateGradientOptimizer::optimize() { + return conjugateGradient(System(graph_, *ordering_), initialEstimate_, params_, !cg_); } } /* namespace gtsam */ diff --git a/gtsam/nonlinear/GradientDescentOptimizer.h b/gtsam/nonlinear/GradientDescentOptimizer.h index 1a78416de..6f79b4779 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.h +++ b/gtsam/nonlinear/GradientDescentOptimizer.h @@ -13,19 +13,6 @@ namespace gtsam { /* an implementation of gradient-descent method using the NLO interface */ -class GradientDescentParams : public NonlinearOptimizerParams { - -public: - typedef NonlinearOptimizerParams Base; - - GradientDescentParams():Base() {} - virtual void print(const std::string& str = "") const { - Base::print(str); - } - - virtual ~GradientDescentParams() {} -}; - class GradientDescentState : public NonlinearOptimizerState { public: @@ -43,7 +30,7 @@ public: typedef boost::shared_ptr shared_ptr; typedef NonlinearOptimizer Base; typedef GradientDescentState States; - typedef GradientDescentParams Parameters; + typedef NonlinearOptimizerParams Parameters; protected: @@ -70,15 +57,11 @@ protected: }; -#include +/** + * An implementation of the nonlinear cg method using the template below + */ -/* Yet another implementation of the gradient-descent method using the iterative.h interface */ -class GradientDescentParams2 : public NonlinearOptimizerParams { -public: - GradientDescentParams2(){} -}; - -class GradientDescentOptimizer2 { +class ConjugateGradientOptimizer { class System { @@ -102,8 +85,8 @@ class GradientDescentOptimizer2 { public: - typedef GradientDescentParams2 Parameters; - typedef boost::shared_ptr shared_ptr; + typedef NonlinearOptimizerParams Parameters; + typedef boost::shared_ptr shared_ptr; protected: @@ -112,20 +95,25 @@ protected: Parameters params_; Ordering::shared_ptr ordering_; VectorValues::shared_ptr gradient_; + bool cg_; public: - GradientDescentOptimizer2(const NonlinearFactorGraph& graph, const Values& initialValues, const Parameters& params = Parameters()) + ConjugateGradientOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, + const Parameters& params = Parameters(), const bool cg = true) : graph_(graph), initialEstimate_(initialValues), params_(params), ordering_(initialValues.orderingArbitrary()), - gradient_(new VectorValues(initialValues.zeroVectors(*ordering_))) {} + gradient_(new VectorValues(initialValues.zeroVectors(*ordering_))), + cg_(cg) {} - virtual ~GradientDescentOptimizer2() {} + virtual ~ConjugateGradientOptimizer() {} virtual Values optimize () ; }; - +/** + * Implement the golden-section line search algorithm + */ template double lineSearch(const S &system, const V currentValues, const W &gradient) { @@ -171,37 +159,62 @@ double lineSearch(const S &system, const V currentValues, const W &gradient) { } } } - return 0.0; } -template -V gradientDescent(const S &system, const V &initial, const NonlinearOptimizerParams ¶ms) { +/** + * Implement the nonlinear conjugate gradient method using the Polak-Ribieve formula suggested in + * http://en.wikipedia.org/wiki/Nonlinear_conjugate_gradient_method. + * + * The S (system) class requires three member functions: error(state), gradient(state) and + * advance(state, step-size, direction). The V class denotes the state or the solution. + * + * The last parameter is a switch between gradient-descent and conjugate gradient + */ - V currentValues = initial, prevValues; - double currentError = system.error(currentValues), prevError; - Index iteration = 0; +template +V conjugateGradient(const S &system, const V &initial, const NonlinearOptimizerParams ¶ms, const bool gradientDescent) { // check if we're already close enough + double currentError = system.error(initial); if(currentError <= params.errorTol) { if (params.verbosity >= NonlinearOptimizerParams::ERROR) std::cout << "Exiting, as error = " << currentError << " < " << params.errorTol << std::endl; - return currentValues; + return initial; } + V currentValues = initial; + typename S::Gradient currentGradient = system.gradient(currentValues), prevGradient, + direction = currentGradient; + + /* do one step of gradient descent */ + V prevValues = currentValues; double prevError = currentError; + double alpha = lineSearch(system, currentValues, direction); + currentValues = system.advance(prevValues, alpha, direction); + currentError = system.error(currentValues); + Index iteration = 0; + // Maybe show output if (params.verbosity >= NonlinearOptimizerParams::ERROR) std::cout << "Initial error: " << currentError << std::endl; // Iterative loop do { - // Do next iteration - const typename S::Gradient gradient = system.gradient(currentValues); - const double alpha = lineSearch(system, currentValues, gradient); - prevValues = currentValues; - prevError = currentError; + if ( gradientDescent == true) { + direction = system.gradient(currentValues); + } + else { + prevGradient = currentGradient; + currentGradient = system.gradient(currentValues); + const double beta = std::max(0.0, currentGradient.dot(currentGradient-prevGradient)/currentGradient.dot(currentGradient)); + direction = currentGradient + (beta*direction); + } - currentValues = system.advance(prevValues, alpha, gradient); + alpha = lineSearch(system, currentValues, direction); + + prevValues = currentValues; prevError = currentError; + + currentValues = system.advance(prevValues, alpha, direction); currentError = system.error(currentValues); // Maybe show output @@ -217,4 +230,9 @@ V gradientDescent(const S &system, const V &initial, const NonlinearOptimizerPar return currentValues; } + + + + + } diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index cfd7db3d7..54130b664 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -62,13 +62,13 @@ TEST(optimize, GradientDescentOptimizer) { // cout << "initial error = " << graph.error(initialEstimate) << endl ; // Single Step Optimization using Levenberg-Marquardt - GradientDescentParams param; + NonlinearOptimizerParams param; param.maxIterations = 500; /* requires a larger number of iterations to converge */ param.verbosity = NonlinearOptimizerParams::SILENT; GradientDescentOptimizer optimizer(graph, initialEstimate, param); Values result = optimizer.optimize(); - // cout << "solver final error = " << graph.error(result) << endl; +// cout << "gd1 solver final error = " << graph.error(result) << endl; /* the optimality of the solution is not comparable to the */ DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); @@ -76,6 +76,29 @@ TEST(optimize, GradientDescentOptimizer) { CHECK(1); } +/* ************************************************************************* */ +TEST(optimize, ConjugateGradientOptimizer) { + + pose2SLAM::Graph graph ; + pose2SLAM::Values initialEstimate; + + boost::tie(graph, initialEstimate) = generateProblem(); +// cout << "initial error = " << graph.error(initialEstimate) << endl ; + + // Single Step Optimization using Levenberg-Marquardt + NonlinearOptimizerParams param; + param.maxIterations = 500; /* requires a larger number of iterations to converge */ + param.verbosity = NonlinearOptimizerParams::SILENT; + + + ConjugateGradientOptimizer optimizer(graph, initialEstimate, param, true); + Values result = optimizer.optimize(); +// cout << "cg final error = " << graph.error(result) << endl; + + /* the optimality of the solution is not comparable to the */ + DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); +} + /* ************************************************************************* */ TEST(optimize, GradientDescentOptimizer2) { @@ -86,19 +109,22 @@ TEST(optimize, GradientDescentOptimizer2) { // cout << "initial error = " << graph.error(initialEstimate) << endl ; // Single Step Optimization using Levenberg-Marquardt - GradientDescentParams2 param; + NonlinearOptimizerParams param; param.maxIterations = 500; /* requires a larger number of iterations to converge */ param.verbosity = NonlinearOptimizerParams::SILENT; - GradientDescentOptimizer2 optimizer(graph, initialEstimate, param); + ConjugateGradientOptimizer optimizer(graph, initialEstimate, param, false); Values result = optimizer.optimize(); -// cout << "solver final error = " << graph.error(result) << endl; +// cout << "gd2 solver final error = " << graph.error(result) << endl; /* the optimality of the solution is not comparable to the */ DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); } + + + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From 5b47ab512c44125a39a6b96ad83e7335d0b1b355 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 13 Jun 2012 02:31:32 +0000 Subject: [PATCH 339/914] Added checking in VisualISAM to only add measurements/priors/initializations for observed landmarks --- matlab/VisualISAMInitialize.m | 26 +++++++++++++------------- matlab/VisualISAMPlot.m | 11 +++++++---- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index 13a4258c9..2227aa0f3 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -1,6 +1,6 @@ function [noiseModels,isam,result] = VisualInitialize(data,truth,options) % VisualInitialize: initialize visualSLAM::iSAM object and noise parameters -% Authors: Duy Nguyen Ta and Frank Dellaert +% Authors: Duy Nguyen Ta, Frank Dellaert and Alex Cunningham %% Initialize iSAM isam = visualSLAMISAM(options.reorderInterval); @@ -25,25 +25,25 @@ for i=1:2 initialEstimates.insertPose(ii,truth.cameras{i}.pose); end -%% Add visual measurement factors from two first poses +%% Add visual measurement factors from two first poses and initialize observed landmarks for i=1:2 ii = symbol('x',i); for j=1:size(data.z,2) jj = symbol('l',j); - newFactors.addMeasurement(data.z{i,j}, noiseModels.measurement, ii, jj, data.K); + % Must check whether a landmark was actually observed + if ~isempty(data.z{i,j}) + newFactors.addMeasurement(data.z{i,j}, noiseModels.measurement, ii, jj, data.K); + % TODO: initial estimates should not be from ground truth! + if ~initialEstimates.exists(jj) + initialEstimates.insertPoint(jj, truth.points{j}); + end + if options.pointPriors % add point priors + newFactors.addPointPrior(jj, truth.points{j}, noiseModels.point); + end + end end end -%% Initialize points, possibly add priors on them -% TODO: should not be from ground truth! -for j=1:size(data.z,2) - jj = symbol('l',j); - if options.pointPriors % add point priors - newFactors.addPointPrior(jj, truth.points{j}, noiseModels.point); - end - initialEstimates.insertPoint(jj, truth.points{j}); -end - %% Update ISAM if options.batchInitialization % Do a full optimize for first two poses fullyOptimized = newFactors.optimize(initialEstimates); diff --git a/matlab/VisualISAMPlot.m b/matlab/VisualISAMPlot.m index 8e8dce6f1..6d3dde225 100644 --- a/matlab/VisualISAMPlot.m +++ b/matlab/VisualISAMPlot.m @@ -11,11 +11,14 @@ hold on; %% Plot points for j=1:N + %% TODO: use the actual set of keys present jj = symbol('l',j); - point_j = result.point(jj); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - P = isam.marginalCovariance(jj); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + if result.exists(jj) + point_j = result.point(jj); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + P = isam.marginalCovariance(jj); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); + end end %% Plot cameras From 0b04e0273e9f2751d4e4ee10420fca84667da952 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 10:50:56 +0000 Subject: [PATCH 340/914] Some targets --- .cproject | 358 ++++++++++++++++++++++++------------------------------ 1 file changed, 162 insertions(+), 196 deletions(-) diff --git a/.cproject b/.cproject index 24c4afa85..1a5a51c19 100644 --- a/.cproject +++ b/.cproject @@ -311,6 +311,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -337,7 +345,6 @@ make - tests/testBayesTree.run true false @@ -345,7 +352,6 @@ make - testBinaryBayesNet.run true false @@ -393,7 +399,6 @@ make - testSymbolicBayesNet.run true false @@ -401,7 +406,6 @@ make - tests/testSymbolicFactor.run true false @@ -409,7 +413,6 @@ make - testSymbolicFactorGraph.run true false @@ -425,20 +428,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -447,14 +441,6 @@ true true - - make - -j5 - testIMUSystem.run - true - true - true - make -j5 @@ -527,22 +513,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -559,6 +529,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -583,26 +569,18 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check - true - true - true - - - make - -j2 - clean + -j5 + testOrdering.run true true true @@ -687,26 +665,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -943,17 +921,16 @@ true true - + make -j5 - testGaussianJunctionTreeB.run + testSubgraphPreconditioner.run true true true make - testGraph.run true false @@ -961,7 +938,6 @@ make - testJunctionTree.run true false @@ -969,7 +945,6 @@ make - testSymbolicBayesNetB.run true false @@ -991,14 +966,6 @@ true true - - make - -j5 - clean - true - true - true - make -j2 @@ -1089,7 +1056,6 @@ make - testErrors.run true false @@ -1545,6 +1511,7 @@ make + testSimulated2DOriented.run true false @@ -1584,6 +1551,7 @@ make + testSimulated2D.run true false @@ -1591,6 +1559,7 @@ make + testSimulated3D.run true false @@ -1780,10 +1749,10 @@ true true - + make -j5 - LocalizationExample2.run + OdometryExample.run true true true @@ -1806,6 +1775,7 @@ make + tests/testGaussianISAM2 true false @@ -1827,14 +1797,110 @@ true true - + make -j2 - install + testRot3.run true true true + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + + + make + -j3 + install + true + false + true + make -j2 @@ -1845,10 +1911,10 @@ make - -j5 + -j3 check true - true + false true @@ -2028,7 +2094,6 @@ cpack - -G DEB true false @@ -2036,7 +2101,6 @@ cpack - -G RPM true false @@ -2044,7 +2108,6 @@ cpack - -G TGZ true false @@ -2052,7 +2115,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2146,98 +2208,42 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run + -j5 + wrap_gtsam true true true - + make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2281,46 +2287,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - From d13db7a9977d03e368abf43279b1a2160c5ba01d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 12:03:33 +0000 Subject: [PATCH 341/914] Fixed wrap problem where a double could not be passed to a method taking a size_t. Also, if a method takes a bool, you now *have* to pass a logical in matlab (i.e., true or false) --- wrap/Argument.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index af9097ea4..f51b86864 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -32,8 +32,12 @@ string Argument::matlabClass(const string& delim) const { result += ns + delim; if (type=="string" || type=="unsigned char" || type=="char") return result + "char"; - if (type=="bool" || type=="int" || type=="size_t" || type=="Vector" || type=="Matrix") - return result + "double"; + if (type=="Vector" || type=="Matrix") + return result + "double"; + if (type=="int" || type=="size_t") + return result + "numeric"; + if (type=="bool") + return result + "logical"; return result + type; } From 991d8f3c5fddc5ea2cb708084d212174359e1442 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 12:05:39 +0000 Subject: [PATCH 342/914] No more need to convert to double after wrap fix --- matlab/VisualISAMPlot.m | 4 ++-- matlab/VisualISAMStep.m | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/matlab/VisualISAMPlot.m b/matlab/VisualISAMPlot.m index 6d3dde225..b23b3a475 100644 --- a/matlab/VisualISAMPlot.m +++ b/matlab/VisualISAMPlot.m @@ -2,8 +2,8 @@ function VisualISAMPlot(truth, data, isam, result, options) % VisualISAMPlot: plot current state of visualSLAM::iSAM object % Authors: Duy Nguyen Ta and Frank Dellaert -M = double(result.nrPoses); -N = double(result.nrPoints); +M = result.nrPoses; +N = result.nrPoints; h=gca; cla(h); diff --git a/matlab/VisualISAMStep.m b/matlab/VisualISAMStep.m index 491fd9bac..4c044fdda 100644 --- a/matlab/VisualISAMStep.m +++ b/matlab/VisualISAMStep.m @@ -8,7 +8,7 @@ newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; %% Add odometry -i = double(result.nrPoses)+1; +i = result.nrPoses+1; odometry = data.odometry{i-1}; newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, noiseModels.odometry); From 25b4a15e94f97c85622c3e65170e8465d5567718 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 12:06:02 +0000 Subject: [PATCH 343/914] Got rid of redundant examples (clutter!) --- matlab/examples/VisualISAMExample_triangle.m | 48 ----------- matlab/examples/VisualSLAMExample_triangle.m | 87 -------------------- 2 files changed, 135 deletions(-) delete mode 100644 matlab/examples/VisualISAMExample_triangle.m delete mode 100644 matlab/examples/VisualSLAMExample_triangle.m diff --git a/matlab/examples/VisualISAMExample_triangle.m b/matlab/examples/VisualISAMExample_triangle.m deleted file mode 100644 index c5cdf288d..000000000 --- a/matlab/examples/VisualISAMExample_triangle.m +++ /dev/null @@ -1,48 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% GTSAM Copyright 3510, 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 -% -% @brief A simple visual SLAM example for structure from motion -% @author Duy-Nguyen Ta -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Data Options -options.triangle = true; -options.nrCameras = 10; -options.showImages = false; - -% iSAM Options -options.hardConstraint = false; -options.pointPriors = false; -options.batchInitialization = true; -options.reorderInterval = 10; -options.alwaysRelinearize = false; - -% Display Options -options.saveDotFile = false; -options.printStats = false; -options.drawInterval = 5; -options.cameraInterval = 1; -options.drawTruePoses = false; -options.saveFigures = false; -options.saveDotFiles = false; - -%% Generate data -[data,truth] = VisualISAMGenerateData(options); - -%% Initialize iSAM with the first pose and points -[noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); -figure(1); -VisualISAMPlot(truth, data, isam, result, options) - -%% Main loop for iSAM: stepping through all poses -for frame_i=3:options.nrCameras - [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); - if mod(frame_i,options.drawInterval)==0 - VisualISAMPlot(truth, data, isam, result, options) - end -end diff --git a/matlab/examples/VisualSLAMExample_triangle.m b/matlab/examples/VisualSLAMExample_triangle.m deleted file mode 100644 index 92d885a86..000000000 --- a/matlab/examples/VisualSLAMExample_triangle.m +++ /dev/null @@ -1,87 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 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 -% -% @brief A simple visual SLAM example for structure from motion -% @author Duy-Nguyen Ta -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Create a triangle target, just 3 points on a plane -r = 10; -points = {}; -for j=1:3 - theta = (j-1)*2*pi/3; - points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); -end - -%% Create camera cameras on a circle around the triangle -nCameras = 6; -height = 10; -r = 30; -cameras = {}; -K = gtsamCal3_S2(500,500,0,640/2,480/2); -for i=1:nCameras - theta = (i-1)*2*pi/nCameras; - t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K) -end - -%% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) -graph = visualSLAMGraph; - -%% Add factors for all measurements -measurementNoiseSigma=1; % in pixels -measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); -for i=1:nCameras - for j=1:3 - zij = cameras{i}.project(points{j}); % you can add noise here if desired - graph.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); - end -end - -%% Add Gaussian priors for 3 points to constrain the system -pointPriorNoise = gtsamSharedNoiseModel_Sigma(3,0.1); -for j=1:3 - graph.addPointPrior(symbol('l',j), points{j}, pointPriorNoise); -end - -%% Print the graph -graph.print(sprintf('\nFactor graph:\n')); - -%% Initialize to noisy cameras and points -initialEstimate = visualSLAMValues; -for i=1:size(cameras,2) - initialEstimate.insertPose(symbol('x',i), cameras{i}.pose); -end -for j=1:size(points,2) - initialEstimate.insertPoint(symbol('l',j), points{j}); -end -initialEstimate.print(sprintf('\nInitial estimate:\n ')); - -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); -result.print(sprintf('\nFinal result:\n ')); - -%% Plot results with covariance ellipses -marginals = graph.marginals(result); -figure(1);clf -hold on; -for j=1:size(points,2) - P = marginals.marginalCovariance(symbol('l',j)); - point_j = result.point(symbol('l',j)); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); -end - -for i=1:size(cameras,2) - P = marginals.marginalCovariance(symbol('x',i)) - pose_i = result.pose(symbol('x',i)) - plotPose3(pose_i,P,10); -end -axis([-20 20 -20 20 -1 15]); -axis equal -view(-37,40) From 0724bd73f37cb3bb7de21a8570336e4493e1f918 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 12:07:02 +0000 Subject: [PATCH 344/914] Use GenerateData --- matlab/examples/VisualSLAMExample.m | 57 +++++++++++------------------ 1 file changed, 21 insertions(+), 36 deletions(-) diff --git a/matlab/examples/VisualSLAMExample.m b/matlab/examples/VisualSLAMExample.m index c2b045dab..9beb0e1ba 100644 --- a/matlab/examples/VisualSLAMExample.m +++ b/matlab/examples/VisualSLAMExample.m @@ -16,28 +16,13 @@ % - Each camera sees all landmarks. % - Visual measurements as 2D points are given, corrupted by Gaussian noise. -%% Generate simulated data -% 3D landmarks as vertices of a cube -points = {gtsamPoint3([10 10 10]'),... - gtsamPoint3([-10 10 10]'),... - gtsamPoint3([-10 -10 10]'),... - gtsamPoint3([10 -10 10]'),... - gtsamPoint3([10 10 -10]'),... - gtsamPoint3([-10 10 -10]'),... - gtsamPoint3([-10 -10 -10]'),... - gtsamPoint3([10 -10 -10]')}; +% Data Options +options.triangle = false; +options.nrCameras = 10; +options.showImages = false; -% Camera cameras on a circle around the cube, pointing at the world origin -nCameras = 6; -height = 0; -r = 30; -cameras = {}; -K = gtsamCal3_S2(500,500,0,640/2,480/2); -for i=1:nCameras - theta = (i-1)*2*pi/nCameras; - t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), K); -end +%% Generate data +[data,truth] = VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; @@ -48,29 +33,28 @@ graph = visualSLAMGraph; %% Add factors for all measurements measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); -for i=1:nCameras - for j=1:size(points,2) - zij = cameras{i}.project(points{j}); % you can add noise here if desired - graph.addMeasurement(zij, measurementNoise, symbol('x',i), symbol('l',j), K); +for i=1:size(data.z,1) + for j=1:size(data.z,2) + graph.addMeasurement(data.z{i,j}, measurementNoise, symbol('x',i), symbol('l',j), data.K); end end %% Add Gaussian priors for a pose and a landmark to constrain the system posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); -graph.addPosePrior(symbol('x',1), cameras{1}.pose, posePriorNoise); +graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); pointPriorNoise = gtsamSharedNoiseModel_Sigma(3,pointNoiseSigma); -graph.addPointPrior(symbol('l',1), points{1}, pointPriorNoise); +graph.addPointPrior(symbol('l',1), truth.points{1}, pointPriorNoise); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); -%% Initialize to noisy cameras and points +%% Initialize cameras and points to ground truth in this example initialEstimate = visualSLAMValues; -for i=1:size(cameras,2) - initialEstimate.insertPose(symbol('x',i), cameras{i}.pose); +for i=1:size(truth.cameras,2) + initialEstimate.insertPose(symbol('x',i), truth.cameras{i}.pose); end -for j=1:size(points,2) - initialEstimate.insertPoint(symbol('l',j), points{j}); +for j=1:size(truth.points,2) + initialEstimate.insertPoint(symbol('l',j), truth.points{j}); end initialEstimate.print(sprintf('\nInitial estimate:\n ')); @@ -82,18 +66,19 @@ result.print(sprintf('\nFinal result:\n ')); marginals = graph.marginals(result); cla hold on; -for j=1:size(points,2) +for j=1:result.nrPoints P = marginals.marginalCovariance(symbol('l',j)); point_j = result.point(symbol('l',j)); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); end -for i=1:size(cameras,2) - P = marginals.marginalCovariance(symbol('x',i)) - pose_i = result.pose(symbol('x',i)) +for i=1:result.nrPoses + P = marginals.marginalCovariance(symbol('x',i)); + pose_i = result.pose(symbol('x',i)); plotPose3(pose_i,P,10); end axis([-35 35 -35 35 -15 15]); axis equal view(-37,40) +colormap hot From 89d5f2c4ec4eb669dc8ab8d092ec4db33e22451d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 12:14:50 +0000 Subject: [PATCH 345/914] Renamed VisualSLAM to SFM example (as no dometry, and to sync with manual) --- .../{VisualSLAMExample.m => SFMExample.m} | 2 +- matlab/examples/gtsamExamples.fig | Bin 9239 -> 9258 bytes matlab/examples/gtsamExamples.m | 8 ++++---- 3 files changed, 5 insertions(+), 5 deletions(-) rename matlab/examples/{VisualSLAMExample.m => SFMExample.m} (97%) diff --git a/matlab/examples/VisualSLAMExample.m b/matlab/examples/SFMExample.m similarity index 97% rename from matlab/examples/VisualSLAMExample.m rename to matlab/examples/SFMExample.m index 9beb0e1ba..187c36749 100644 --- a/matlab/examples/VisualSLAMExample.m +++ b/matlab/examples/SFMExample.m @@ -6,7 +6,7 @@ % % See LICENSE for the license information % -% @brief A simple visual SLAM example for structure from motion +% @brief A structure from motion example % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/matlab/examples/gtsamExamples.fig b/matlab/examples/gtsamExamples.fig index e29163e28733672598de3319389497c87053bf2c..a70f76bcb6ca11028eca7ff70fc7ce47cb12e533 100644 GIT binary patch delta 8884 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 CLK%(# delta 8874 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 diff --git a/matlab/examples/gtsamExamples.m b/matlab/examples/gtsamExamples.m index 6cab86732..049350d54 100644 --- a/matlab/examples/gtsamExamples.m +++ b/matlab/examples/gtsamExamples.m @@ -22,7 +22,7 @@ function varargout = gtsamExamples(varargin) % Edit the above text to modify the response to help gtsamExamples -% Last Modified by GUIDE v2.5 12-Jun-2012 00:27:03 +% Last Modified by GUIDE v2.5 13-Jun-2012 08:13:23 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -117,11 +117,11 @@ echo on PlanarSLAMExample echo off -% --- Executes on button press in VisualSLAM. -function VisualSLAM_Callback(hObject, eventdata, handles) +% --- Executes on button press in SFM. +function SFM_Callback(hObject, eventdata, handles) axes(handles.axes3); echo on -VisualSLAMExample +SFMExample echo off % --- Executes on button press in VisualISAM. From 2678be064655b669bb3511659a84c6a7b926abee Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 12:22:31 +0000 Subject: [PATCH 346/914] Fixed up display options in gtsamExamples --- matlab/examples/LocalizationExample.m | 2 ++ matlab/examples/OdometryExample.m | 2 ++ matlab/examples/PlanarSLAMExample.m | 2 ++ matlab/examples/Pose2SLAMExample.m | 3 +++ matlab/examples/Pose3SLAMExample.m | 6 +++++- matlab/examples/SFMExample.m | 7 +++---- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m index 0e801e4c0..d9c374e39 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/LocalizationExample.m @@ -49,6 +49,7 @@ result.print(sprintf('\nFinal result:\n ')); cla; plot(result.xs(),result.ys(),'k*-'); hold on marginals = graph.marginals(result); +P={}; for i=1:result.size() pose_i = result.pose(i); P{i}=marginals.marginalCovariance(i); @@ -56,3 +57,4 @@ for i=1:result.size() end axis([-0.6 4.8 -1 1]) axis equal +view(2) diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index 68bdf0380..d6dae314d 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -47,6 +47,7 @@ result.print(sprintf('\nFinal result:\n ')); cla; plot(result.xs(),result.ys(),'k*-'); hold on marginals = graph.marginals(result); +P={}; for i=1:result.size() pose_i = result.pose(i); P{i}=marginals.marginalCovariance(i); @@ -54,3 +55,4 @@ for i=1:result.size() end axis([-0.6 4.8 -1 1]) axis equal +view(2) \ No newline at end of file diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index 7d4973883..2bf27d11c 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -84,5 +84,7 @@ end plot([pose{1}.x;point{1}.x],[pose{1}.y;point{1}.y],'c-'); plot([pose{2}.x;point{1}.x],[pose{2}.y;point{1}.y],'c-'); plot([pose{3}.x;point{2}.x],[pose{3}.y;point{2}.y],'c-'); +axis([-0.6 4.8 -1 1]) axis equal +view(2) diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m index e15cab3bf..f60154fa3 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/examples/Pose2SLAMExample.m @@ -60,9 +60,12 @@ cla; plot(result.xs(),result.ys(),'k*-'); hold on plot([result.pose(5).x;result.pose(2).x],[result.pose(5).y;result.pose(2).y],'r-'); marginals = graph.marginals(result); +P={}; for i=1:result.size() pose_i = result.pose(i); P{i}=marginals.marginalCovariance(i); plotPose2(pose_i,'g',P{i}) end +axis([-0.6 4.8 -1 1]) axis equal +view(2) diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/examples/Pose3SLAMExample.m index 285701cff..e8f5c7c32 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -45,5 +45,9 @@ plot3(initial.xs(),initial.ys(),initial.zs(),'g-*'); result = fg.optimize(initial); %% Show Result -hold on; plot3DTrajectory(result,'b-*', true, 0.3); axis equal; +hold on; plot3DTrajectory(result,'b-*', true, 0.3); +axis([-2 2 -2 2 -1 1]); +axis equal +view(-37,40) +colormap hot result.print(sprintf('\nFinal result:\n')); diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 187c36749..5d454f081 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -78,7 +78,6 @@ for i=1:result.nrPoses pose_i = result.pose(symbol('x',i)); plotPose3(pose_i,P,10); end -axis([-35 35 -35 35 -15 15]); -axis equal -view(-37,40) -colormap hot +axis([-40 40 -40 40 -10 20]);axis equal +view(3) +colormap('hot') From e21696b4737064b5ca424b3c9d4065d0a417b8e0 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 13 Jun 2012 13:48:55 +0000 Subject: [PATCH 347/914] Adding filtering interfaces for Values to isoloate points and poses --- gtsam.h | 2 ++ gtsam/slam/tests/testVisualSLAM.cpp | 15 +++++++++++++++ gtsam/slam/visualSLAM.h | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/gtsam.h b/gtsam.h index e728de125..ee7f5dd01 100644 --- a/gtsam.h +++ b/gtsam.h @@ -897,6 +897,8 @@ class Values { void print(string s) const; gtsam::Pose3 pose(size_t i); gtsam::Point3 point(size_t j); + visualSLAM::Values allPoses() const; + visualSLAM::Values allPoints() const; bool exists(size_t key); Vector xs() const; Vector ys() const; diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp index d01d402ee..d9abc67ed 100644 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -222,6 +222,21 @@ TEST( VisualSLAM, dataAssociation) { // std::pair actualChowLiu = isam.chowLiuPredictions(); // 2 times 2*2 } +/* ************************************************************************* */ +TEST( VisualSLAM, filteredValues) { + visualSLAM::Values full; + full.insert(X(1), Pose3(Pose2(1.0, 2.0, 0.3))); + full.insert(L(1), Point3(1.0, 2.0, 3.0)); + + visualSLAM::Values actPoses(full.allPoses()); + visualSLAM::Values expPoses; expPoses.insert(X(1), Pose3(Pose2(1.0, 2.0, 0.3))); + EXPECT(assert_equal(expPoses, actPoses)); + + visualSLAM::Values actPoints(full.allPoints()); + visualSLAM::Values expPoints; expPoints.insert(L(1), Point3(1.0, 2.0, 3.0)); + EXPECT(assert_equal(expPoints, actPoints)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 5f2d70905..d577ee527 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -51,6 +51,8 @@ namespace visualSLAM { struct Values: public gtsam::Values { typedef boost::shared_ptr shared_ptr; + typedef gtsam::Values::ConstFiltered PoseFiltered; + typedef gtsam::Values::ConstFiltered PointFiltered; /// Default constructor Values() {} @@ -60,6 +62,16 @@ namespace visualSLAM { gtsam::Values(values) { } + /// Constructor from filtered values view of poses + Values(const PoseFiltered& view) : + gtsam::Values(view) { + } + + /// Constructor from filtered values view of points + Values(const PointFiltered& view) : + gtsam::Values(view) { + } + /// insert a pose void insertPose(Key i, const Pose3& pose) { insert(i, pose); } @@ -84,6 +96,12 @@ namespace visualSLAM { /// get a point Point3 point(Key j) const { return at(j); } + /// get a const view containing only poses + PoseFiltered allPoses() const { return this->filter(); } + + /// get a const view containing only points + PointFiltered allPoints() const { return this->filter(); } + /// check if value with specified key exists bool exists(Key i) const { return gtsam::Values::exists(i); } From 1cbc827512dde1f92e792c492bbce9c499734696 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 13 Jun 2012 14:58:15 +0000 Subject: [PATCH 348/914] Changed the data interface for the VisualISAM demos --- matlab/VisualISAMInitialize.m | 26 +++++++++++------------- matlab/VisualISAMStep.m | 16 +++++++++++---- matlab/examples/SFMExample.m | 7 ++++--- matlab/examples/VisualISAMExample.m | 2 +- matlab/examples/VisualISAMGenerateData.m | 4 +++- 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index 2227aa0f3..8873e3c4d 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -1,4 +1,4 @@ -function [noiseModels,isam,result] = VisualInitialize(data,truth,options) +function [noiseModels,isam,result] = VisualISAMInitialize(data,truth,options) % VisualInitialize: initialize visualSLAM::iSAM object and noise parameters % Authors: Duy Nguyen Ta, Frank Dellaert and Alex Cunningham @@ -17,7 +17,7 @@ newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; for i=1:2 ii = symbol('x',i); - if i==1 & options.hardConstraint % add hard constraint + if i==1 && options.hardConstraint % add hard constraint newFactors.addPoseConstraint(ii,truth.cameras{1}.pose); else newFactors.addPosePrior(ii,truth.cameras{i}.pose, noiseModels.pose); @@ -28,18 +28,16 @@ end %% Add visual measurement factors from two first poses and initialize observed landmarks for i=1:2 ii = symbol('x',i); - for j=1:size(data.z,2) - jj = symbol('l',j); - % Must check whether a landmark was actually observed - if ~isempty(data.z{i,j}) - newFactors.addMeasurement(data.z{i,j}, noiseModels.measurement, ii, jj, data.K); - % TODO: initial estimates should not be from ground truth! - if ~initialEstimates.exists(jj) - initialEstimates.insertPoint(jj, truth.points{j}); - end - if options.pointPriors % add point priors - newFactors.addPointPrior(jj, truth.points{j}, noiseModels.point); - end + for k=1:length(data.Z{i}) + j = data.J{i}{k}; + jj = symbol('l',data.J{i}{k}); + newFactors.addMeasurement(data.Z{i}{k}, noiseModels.measurement, ii, jj, data.K); + % TODO: initial estimates should not be from ground truth! + if ~initialEstimates.exists(jj) + initialEstimates.insertPoint(jj, truth.points{j}); + end + if options.pointPriors % add point priors + newFactors.addPointPrior(jj, truth.points{j}, noiseModels.point); end end end diff --git a/matlab/VisualISAMStep.m b/matlab/VisualISAMStep.m index 4c044fdda..0f87a66f0 100644 --- a/matlab/VisualISAMStep.m +++ b/matlab/VisualISAMStep.m @@ -1,4 +1,4 @@ -function [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); +function [isam,result] = VisualISAMStep(data,noiseModels,isam,result,truth, options) % VisualISAMStep: execute one update step of visualSLAM::iSAM object % Authors: Duy Nguyen Ta and Frank Dellaert @@ -12,9 +12,17 @@ i = result.nrPoses+1; odometry = data.odometry{i-1}; newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, noiseModels.odometry); -%% Add visual measurement factors -for j=1:size(data.z,2) - newFactors.addMeasurement(data.z{i,j}, noiseModels.measurement, symbol('x',i), symbol('l',j), data.K); +%% Add visual measurement factors and initializations as necessary +for k=1:length(data.Z{i}) + zij = data.Z{i}{k}; + j = data.J{i}{k}; + jj = symbol('l', j); + newFactors.addMeasurement(zij, noiseModels.measurement, symbol('x',i), jj, data.K); + % TODO: initialize with something other than truth + if ~result.exists(jj) && ~initialEstimates.exists(jj) + lmInit = truth.points{j}; + initialEstimates.insertPoint(jj, lmInit); + end end %% Initial estimates for the new pose. diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 5d454f081..9821b1478 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -33,9 +33,10 @@ graph = visualSLAMGraph; %% Add factors for all measurements measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); -for i=1:size(data.z,1) - for j=1:size(data.z,2) - graph.addMeasurement(data.z{i,j}, measurementNoise, symbol('x',i), symbol('l',j), data.K); +for i=1:length(data.Z) + for k=1:length(data.Z{i}) + j = data.J{i}{k}; + graph.addMeasurement(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('l',j), data.K); end end diff --git a/matlab/examples/VisualISAMExample.m b/matlab/examples/VisualISAMExample.m index f8423a057..dc6a95ae2 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/examples/VisualISAMExample.m @@ -41,7 +41,7 @@ VisualISAMPlot(truth, data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras - [isam,result] = VisualISAMStep(data,noiseModels,isam,result,options); + [isam,result] = VisualISAMStep(data,noiseModels,isam,result,truth,options); if mod(frame_i,options.drawInterval)==0 VisualISAMPlot(truth, data, isam, result, options) end diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/examples/VisualISAMGenerateData.m index fab8185f9..3c55417d9 100644 --- a/matlab/examples/VisualISAMGenerateData.m +++ b/matlab/examples/VisualISAMGenerateData.m @@ -32,7 +32,9 @@ for i=1:options.nrCameras truth.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), truth.K); % Create measurements for j=1:nrPoints - data.z{i,j} = truth.cameras{i}.project(truth.points{j}); + % All landmarks seen in every frame + data.Z{i}{j} = truth.cameras{i}.project(truth.points{j}); + data.J{i}{j} = j; end end From 63b3b4eceabddacb36d2313c0e6cb27828c94fa2 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 13 Jun 2012 16:38:51 +0000 Subject: [PATCH 349/914] Added matlab interface to get indices out of Values structures. Added more matlab symbol functions. --- gtsam.h | 25 +++++++++++++++++++++++++ gtsam/base/FastVector.h | 10 +++++++++- gtsam/nonlinear/Values.h | 9 +++++++-- matlab/VisualISAMPlot.m | 16 +++++++--------- matlab/symbolChr.m | 4 ++++ matlab/symbolIndex.m | 4 ++++ 6 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 matlab/symbolChr.m create mode 100644 matlab/symbolIndex.m diff --git a/gtsam.h b/gtsam.h index ee7f5dd01..f1720c466 100644 --- a/gtsam.h +++ b/gtsam.h @@ -643,8 +643,11 @@ class KalmanFilter { class Symbol { Symbol(char c, size_t j); + Symbol(size_t k); void print(string s) const; size_t key() const; + size_t index() const; + char chr() const; }; class Ordering { @@ -665,6 +668,27 @@ class Values { bool exists(size_t j) const; }; +// Actually a FastList +#include +class KeyList { + KeyList(); + KeyList(const gtsam::KeyList& other); + + // Note: no print function + size_t size() const; +}; + +// Actually a KeyVector +#include +class KeyVector { + KeyVector(); + KeyVector(const gtsam::KeyVector& other); + + // Note: no print function + size_t size() const; + size_t at(size_t i) const; +}; + class Marginals { Marginals(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& solution); @@ -899,6 +923,7 @@ class Values { gtsam::Point3 point(size_t j); visualSLAM::Values allPoses() const; visualSLAM::Values allPoints() const; + gtsam::KeyVector keys() const; // Note the switch to KeyVector, rather than KeyList bool exists(size_t key); Vector xs() const; Vector ys() const; diff --git a/gtsam/base/FastVector.h b/gtsam/base/FastVector.h index ee7258ba8..e91bd1813 100644 --- a/gtsam/base/FastVector.h +++ b/gtsam/base/FastVector.h @@ -23,6 +23,8 @@ #include #include +#include + namespace gtsam { /** @@ -58,9 +60,15 @@ public: Base::assign(first, last); } - /** Copy constructor from another FastSet */ + /** Copy constructor from another FastVector */ FastVector(const FastVector& x) : Base(x) {} + /** Copy constructor from a FastList */ + FastVector(const FastList& x) { + if(x.size() > 0) + Base::assign(x.begin(), x.end()); + } + /** Copy constructor from the base class */ FastVector(const Base& x) : Base(x) {} diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 8b8fbc71c..8ade8ff06 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -43,12 +44,16 @@ namespace gtsam { + // Useful typedefs for operations with Values - allow for matlab interfaces + typedef FastList KeyList; + typedef FastVector KeyVector; + // Forward declarations / utilities class ValueCloneAllocator; class ValueAutomaticCasting; template static bool _truePredicate(const T&) { return true; } -/** + /** * A non-templated config holding any types of Manifold-group elements. A * values structure is a map from keys to values. It is used to specify the * value of a bunch of variables in a factor graph. A Values is a values @@ -238,7 +243,7 @@ namespace gtsam { * Returns a set of keys in the config * Note: by construction, the list is ordered */ - FastList keys() const; + KeyList keys() const; /** Replace all keys and variables */ Values& operator=(const Values& rhs); diff --git a/matlab/VisualISAMPlot.m b/matlab/VisualISAMPlot.m index b23b3a475..90c542662 100644 --- a/matlab/VisualISAMPlot.m +++ b/matlab/VisualISAMPlot.m @@ -10,15 +10,13 @@ cla(h); hold on; %% Plot points -for j=1:N - %% TODO: use the actual set of keys present - jj = symbol('l',j); - if result.exists(jj) - point_j = result.point(jj); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - P = isam.marginalCovariance(jj); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); - end +pointKeys = result.allPoints().keys(); +for j=0:N-1 % NOTE: uses indexing directly from a C++ vector, so zero-indexed + jj = pointKeys.at(j); + point_j = result.point(jj); + plot3(point_j.x, point_j.y, point_j.z,'marker','o'); + P = isam.marginalCovariance(jj); + covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); end %% Plot cameras diff --git a/matlab/symbolChr.m b/matlab/symbolChr.m new file mode 100644 index 000000000..39c92ec85 --- /dev/null +++ b/matlab/symbolChr.m @@ -0,0 +1,4 @@ +function c = symbolChr(key) +% generate the chr from a key +s = gtsamSymbol(key); +c = s.chr(); \ No newline at end of file diff --git a/matlab/symbolIndex.m b/matlab/symbolIndex.m new file mode 100644 index 000000000..3046cf229 --- /dev/null +++ b/matlab/symbolIndex.m @@ -0,0 +1,4 @@ +function i = symbolIndex(key) +% generate the index from a key +s = gtsamSymbol(key); +i = s.index(); \ No newline at end of file From 9d0c88c1ddac522600b46559ec43f068e79d577c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 17:40:20 +0000 Subject: [PATCH 350/914] Exposed truth --- matlab/examples/VisualISAMDemo.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/examples/VisualISAMDemo.m index 00518293a..813d6d2e1 100644 --- a/matlab/examples/VisualISAMDemo.m +++ b/matlab/examples/VisualISAMDemo.m @@ -3,7 +3,7 @@ % Make sure global variables are visible on command prompt % so you can examine how they change as you step through -global frame_i data noiseModels isam result options +global options truth data noiseModels isam result frame_i % Start GUI VisualISAM_gui \ No newline at end of file From 87fe727838cd7a29d0a6f2dbfe6ffc5a7925ce34 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 17:42:06 +0000 Subject: [PATCH 351/914] Fixed logic error, added odometry --- matlab/VisualISAMInitialize.m | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index 8873e3c4d..4d0b13931 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -17,10 +17,12 @@ newFactors = visualSLAMGraph; initialEstimates = visualSLAMValues; for i=1:2 ii = symbol('x',i); - if i==1 && options.hardConstraint % add hard constraint - newFactors.addPoseConstraint(ii,truth.cameras{1}.pose); - else - newFactors.addPosePrior(ii,truth.cameras{i}.pose, noiseModels.pose); + if i==1 + if options.hardConstraint % add hard constraint + newFactors.addPoseConstraint(ii,truth.cameras{1}.pose); + else + newFactors.addPosePrior(ii,truth.cameras{i}.pose, noiseModels.pose); + end end initialEstimates.insertPose(ii,truth.cameras{i}.pose); end @@ -42,6 +44,9 @@ for i=1:2 end end +%% Add odometry between frames 1 and 2 +newFactors.addOdometry(symbol('x',1), symbol('x',2), data.odometry{1}, noiseModels.odometry); + %% Update ISAM if options.batchInitialization % Do a full optimize for first two poses fullyOptimized = newFactors.optimize(initialEstimates); From 4bbe66f1064bac2a89f419865e3911ea4ba2444f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 17:45:27 +0000 Subject: [PATCH 352/914] Wrapped some more iSAM methods. Note that wrap cannot handle returning a reference, so the 4 methods we (Yong-Dian and I) added make a copy, just by declaring it a non-reference in gtsam.h. Works, but be mindful of cost. --- gtsam.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gtsam.h b/gtsam.h index f1720c466..6628d2424 100644 --- a/gtsam.h +++ b/gtsam.h @@ -659,6 +659,7 @@ class Ordering { class NonlinearFactorGraph { NonlinearFactorGraph(); + void print(string s) const; }; class Values { @@ -975,6 +976,12 @@ class ISAM { void reorder_relinearize(); void addKey(size_t key); void setOrdering(const gtsam::Ordering& new_ordering); + + // These might be expensive as instead of a reference the wrapper will make a copy + gtsam::GaussianISAM bayesTree() const; + visualSLAM::Values getLinearizationPoint() const; + gtsam::Ordering getOrdering() const; + gtsam::NonlinearFactorGraph getFactorsUnsafe() const; }; }///\namespace visualSLAM From 4c78ce32d4e1fe19c23ad852c01809598bfbbc6f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 13 Jun 2012 18:04:33 +0000 Subject: [PATCH 353/914] V should be manifold, and then we can just use retract instead of advance --- gtsam/nonlinear/GradientDescentOptimizer.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam/nonlinear/GradientDescentOptimizer.h b/gtsam/nonlinear/GradientDescentOptimizer.h index 6f79b4779..659aff68c 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.h +++ b/gtsam/nonlinear/GradientDescentOptimizer.h @@ -7,6 +7,7 @@ #pragma once +#include #include namespace gtsam { @@ -175,6 +176,8 @@ double lineSearch(const S &system, const V currentValues, const W &gradient) { template V conjugateGradient(const S &system, const V &initial, const NonlinearOptimizerParams ¶ms, const bool gradientDescent) { + GTSAM_CONCEPT_MANIFOLD_TYPE(V); + // check if we're already close enough double currentError = system.error(initial); if(currentError <= params.errorTol) { From 9739c9effc8d8e5fab3b9dacd179bcccaf1cbc84 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 13 Jun 2012 20:21:23 +0000 Subject: [PATCH 354/914] Fixing include path error due to case-insensitive macs --- gtsam/nonlinear/GradientDescentOptimizer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/GradientDescentOptimizer.h b/gtsam/nonlinear/GradientDescentOptimizer.h index 659aff68c..5caef0957 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.h +++ b/gtsam/nonlinear/GradientDescentOptimizer.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include namespace gtsam { From dd0574ebeb84a2ea11c10678eddcbe8ace72b57c Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 13 Jun 2012 20:41:54 +0000 Subject: [PATCH 355/914] Fixed broken GUI interface - still uses truth for initialization --- matlab/VisualISAM_gui.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matlab/VisualISAM_gui.m b/matlab/VisualISAM_gui.m index 97405a318..0f345e0fa 100644 --- a/matlab/VisualISAM_gui.m +++ b/matlab/VisualISAM_gui.m @@ -245,7 +245,7 @@ global frame_i truth data noiseModels isam result options while (frame_i Date: Thu, 14 Jun 2012 03:14:53 +0000 Subject: [PATCH 356/914] Fixed Remaining problems with GUI --- gtsam/nonlinear/Values.cpp | 4 +--- matlab/VisualISAMPlot.m | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/gtsam/nonlinear/Values.cpp b/gtsam/nonlinear/Values.cpp index a6804c1a6..bb66943eb 100644 --- a/gtsam/nonlinear/Values.cpp +++ b/gtsam/nonlinear/Values.cpp @@ -165,10 +165,8 @@ namespace gtsam { /* ************************************************************************* */ FastList Values::keys() const { FastList result; - for(const_iterator key_value = begin(); key_value != end(); ++key_value) { + for(const_iterator key_value = begin(); key_value != end(); ++key_value) result.push_back(key_value->key); - cout << result.back() << endl; - } return result; } diff --git a/matlab/VisualISAMPlot.m b/matlab/VisualISAMPlot.m index 90c542662..a2950b5dc 100644 --- a/matlab/VisualISAMPlot.m +++ b/matlab/VisualISAMPlot.m @@ -10,9 +10,9 @@ cla(h); hold on; %% Plot points -pointKeys = result.allPoints().keys(); -for j=0:N-1 % NOTE: uses indexing directly from a C++ vector, so zero-indexed - jj = pointKeys.at(j); +for k=1:length(data.J{M}) + j = data.J{M}{k}; + jj = symbol('l', j); point_j = result.point(jj); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); P = isam.marginalCovariance(jj); From 7d3db1c9620b484fd15db1dd142f0b87626548e8 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 14 Jun 2012 03:20:28 +0000 Subject: [PATCH 357/914] Got rid of "Plot" button (as every time you step, you plot) --- matlab/VisualISAM_gui.fig | Bin 9838 -> 9761 bytes matlab/VisualISAM_gui.m | 15 +-------------- matlab/examples/gtsamExamples.fig | Bin 9258 -> 9270 bytes matlab/examples/gtsamExamples.m | 1 + 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/matlab/VisualISAM_gui.fig b/matlab/VisualISAM_gui.fig index 748b722619838e18e40bfff4eaf010e9bcaf2ea1..7140cbf7333b38b5712208c676d6da9caadbbf26 100644 GIT binary patch literal 9761 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 diff --git a/matlab/VisualISAM_gui.m b/matlab/VisualISAM_gui.m index 0f345e0fa..5fd0cd1d9 100644 --- a/matlab/VisualISAM_gui.m +++ b/matlab/VisualISAM_gui.m @@ -5,7 +5,7 @@ function varargout = VisualISAM_gui(varargin) % By running ViusalISAMDemo, you see all variables in command prompt % Authors: Duy Nguyen Ta -% Last Modified by GUIDE v2.5 09-Jun-2012 00:56:47 +% Last Modified by GUIDE v2.5 13-Jun-2012 23:15:43 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -265,16 +265,3 @@ if (frame_idu^u)RC&_o?VH{A=6#Ik{dO`9 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 f^^eD|*7=Y5S_7f~vo4muB8C8xFT`^X@H$Q delta 8638 zcmV;vAwk}@NUBJXK?*T5Ix;jMGB7bRkx?U&U%@<5;gs2oetRPJY9!jGLT4UrVww5PfKx#Ozdez7%q2<-mQ)X^k=} z_R$U}(Fzv0^TbjZGU{S5qvp49Gvh|P9u7LWo>x$|o*=s|9AQ_Gh$nVd(aCikMcIG4 z&dBlYH$Z>gv^m(Tl#aLObg|cY=#{50Zz}$s=09luqvk(p{zUU%G=Hl3Z<_zE`7_P` z(EPdPe`@|h^S}RN{DtM`b1RN#R-7j8Vd*0OS-<+tzsZBii^-G8o5`cetI4y;`>=G8 zf5p!$|K~^0H=uQ&)XzRd*?tCc8G3&wFV_iUSoZRAEr^=srr_8sdsr}BE0c%V3mM^R z_O_N5B(O2-R(h;Enpt-g1&u~7y+TH>fB+NZ(JN;3ipURqlBeHKSor}t6ZDYrZlaTM zLfUWW>$Av^d2fr3;+Ar1rRAq9&M(BnAmcN!mVn(`0 zsx5U_;3oAOfqpiSC_18b4RIsF2<8UwMj7ynU6=3`;qPM$bfOaDtZXz!y6x1c?Ef3yy2nT>%J_U)9XEY%~}^^wU2)-o{IkL_s8$2 z<5r!{``jz0YF8fO-0Sh!V|DH|(`VnE(y}ARvi=|I+vpCi5rz`74~FcMBUt}nG+BSD z$NKR6gVDkLRWD-{1VY{CB*YOGoufKVd_nyrghuSU;A~Y_)y9L}>h%uF)(hlvDsWz2 zU)sL2bgO#r{mSBEZ2^CWVXpmmBx833l~KNZ+tzcm-b|stJeu>mxl~@#Z+-%oJ`18< z9%5JJ>!62!pIG?Fs+#Z17UA{2NN!F?xq7y=m(?KskTw%NtuDzlDyxht(v* ziM{kW>4fEn*+YzdkZ088uLYE?celQk2M<6o2E_xWkf8rL>hHZYxE8qmX>l6GIsxRC)=e}^*XJ2St^o3LD3$tg`7t;G*H~+AeFOYNgg^iH-@b_I4#Ou2^ zAav0mj_VKRdeDD;6$&%Eu&|IPzvGtvxYjp?HF2f!#cA}5)AGya=eD1Jq4sm9%YObZ z00030|Lj@4PZU8Ee|K;Q2FRHhg=iv)Q6Lh&Die#lQD<`dyLkcw|>3P`X{*c z>Lp#hj%al}9(3g{ju!wjr%NtZvf@77#m0=Oqk_ZNQhZijXLIPNj+;a%eJS_C^9 zp!{5^+~z!fj&kqn+_6@E?1Sm(?d|343c_g-a9S7+J75>*5me{5EgZgrOmYn=a?uS; z+i8Cn2;K7w3cGRZQ3ymF^+Wi^>(|$KfJYC1T7~of^Zu=${u^t`qm=ch7lyng7%pm!JKm?PRi& zb$R`$`y}2=KfQV=U$?{R%C8qkU%z{jc$r;ULeGCB-s6v{2kk3~uh;Lb{{HqhQAvHk z^AUGt=9pXIaS^J!pFw$jtNYlhKC^#=jmZGK9j*i5*o12P+hSM;?1?%c{7&BA-^obe zi^>(&0U2DN-f7cX%V%;}4}gC?z~=3CJ@EKH*8{J9-v0AxX4SVINW$iR(hTM2OJ&|c znSHhLx!d3SmF{P|aKtePcc<%w!wXKGun^V>d!kMVe=peIzZcvT_@Z*9|2GT8rZkw# zq_P_o3ICIG2`PVF%F6D}W_OFgMGhw7!GwbbPsY1Ojp1NCX^h4bcMk*;5)J$TUOeaw z-J#QAW5s5{AI=I!kJ_PsZ6-h5dBny@vIlmt9BPYlFvigB~01%Q13fFSNwxYyub z0aC5flFM+fwMNpsmJC&-&L}8pSkDPg`)_b)V{xe7BSwF3Klff4M(Pg_M2Oso`*>1~ zn-Wr^6HpaoF?tK>lZFQ4B7@h<;MH?>R9V;*pU4fV>57M0tF}houPU4Pu=aWwJI*@j zv3As2&*y)Vc08EPcUgUpH6wb14tf>bcYP$TW7p3tD-Qxoi-%*ub6*3m(Yw&S#!rE@ zYj@Uve0zTt$RUP)zp#9;N+8sq#byoZ06xyb#8I@TJlTWhgHd> zHG;G*7@th&D5(lzBqJS!p)AMnGrAt`#s!LbzXyMN6Om@=@dka8VaCw(5YkdIj-y2C z0bP%nx}+x3`oo5(vydT8lchK$Dw~h3bl7Uy#C;FQj60E4q$@bRW5!`30YxR-;> zxRW|0oL?Qdzqk=tKk2V|c4Q-Pxz2Oy?!ooV^S4l*#`D_XvHL*YA1lvq--!PTG-Vjm z5i);M>xQU79h!K@sH~cjD$+FL>+-fbWEaO{TpWqq#%z$$)*l+`3w1@WcC`EbvC~k~ z9Pb(4FE5_80q6V4PA_QbHF$E1Bh8OyCN2P&Gn$pf1?2~CU4G#5gVegq4@%DuqFlU)oGm|)p$hdp z2!hKG?D+xpx!C+*s?`4v-mi>Ye7>3&KiCU0_m{}2#N46>e-%Hly9d$-Ep1n!aQJ`G z33tc&!Iu<2=ymzQuHXmrIr4*1mmd^_A9#zz59S^08|C6f0#haz2A5A%4b_%;B>CoI_Jd_PR2iq-yF#8JUa1!LfD^+9{nyI zgAO=5e$NBd{SRQ{ulpb1|GMXQ^M8{T4R?R+E$-fD440>iuOgG}MW+#A7G!Xw#5`Cz zxCASXjlAJK1?*L!oy%vY=CjbYi_ko^XK$0%-cl8dF|;=_0=5DG41V?TYa_pUKtR2c z@8Va#90d(Z9ui7w6HsqA!K@Vof6SS2RIl+1sZ zA+c;Ue}=lJJO`Rcu{WXE+YIu) zruz5f!q2&_cH(0zySjZ@#U>@prM6-xNgfK?K1BRHbT)Jr_d&^D za%q)VS!z=kgw-m1o;|?plk)x{{xx}gHr(D|5__yjmu9IG@JFbJMLh_g=b3+tNvWZK z%tNkfGUGTlHla}Q#WEf0lyp4_bt^o*&LXQ}N3BD;xOanS+(jL-p1n5x?t3fg>yM0W z{Otaf^x=Wjqi@}J-QR!byBqcfHTKkX5brN^CtEl1{T0Y;Sad06!E+Be(1nbzSjZEG z2@2CJUYDEdkS>l7#^NaWQDuLDywR!5>||zqe&&gNV`Ig~q2sjdGx6^lb$`<7 z8B%X&sOI{ChbTFTs25;e$LwE~16$4$(pKI&`<= zg8{HU_+Vz8@xe;=bM#gJH;M3pE>D8Q94bsJaY-7_bD*<*+6o`2>!W}B9@U>g$%h;5 zcIbzG=;ETY*AubV1K<+!*3|!vp#Q(#+gV)ik^Envx&MRamdz;(E69bB2T{=!wGapp zLxgV;JdPMRO;YNi9PtpVi{_e*ooE)FY!<}<18Bw+f|BA0v&`G9$&)|^E$Mze zCg_4;1kxVk6G4aP0)Bsa+(?Q~0$NUo*y6Vlam(tZ1n(jSuK&4)ksJyTg2 zGah*J_oJ6y*>3FqdhU;R(1`Kfx10w0+v+><^%ArmdadejFNlBcKf#Nd`6O7Me$vXH zE6=U&Pq>zv(d8^vUi34njLoB6Wi2$#x@b_OP>i_da7v@+#C- zdHpFSc&zOp-g)F=an6U0*L0Ae>A!;@9ZvAQwWGN)H;F4bV%k+DXHIBjCpEIHMwZdY zBtL@)$4+vcvNm>{*lJ>aVl>OhiswU;x*!gh?bN|O5UqoPcPJ)e<0hGxA4Spa>OY;F zTa)^kBtCz^|EGlK1c}4eI4EA70+PmcIPa!qJPvH_|(wFB?yDe7lza5qD~Tbw~8N1ujXv z&PB?5Ri$-)#{E_QPyE+? z{@>QQQ@wuy00960>{rch(?Ag3q)n4$6H|W(jmnmiE$#J6&P$CmgvRCbb=gL|al_vK zng5746yOaZzPjr2iay>*1aC~XN!fN?*~)%?yL|uC<(=&0?fTR$w38k8#`*gwzlH;T z4I=?BgyP+d@GFIaevNw16YFeB@z=+@{B#6ABkf-F^hffA7Z?#X3d$^JB8*RC?TLS3 zafj)7PPye`-KVY;h;35byo(#q!De&=!eeJFY{MMa!OyLgLP*P(95X0{uz&#%tB|$7 zutgw7U39S`x5%2rG0jn8um&)J%7j5hGy^siwn%hQ_hEC`G6)O4?>%l4L3jY2=K_bZ zim(VXg4_}lV3`)k-wsv-OAyWPos56IBLrs!{+!Kf?Md?%U;$lSNdYK?v1!L{=Cq(U zMa*;xHDZ$$LWyX)7*MmyO`_d_W@j7`Rj_@*Yx`_DrXVYwcvYlb*F;gqnzrIy0gGTt z)^K+is^U-pq%7EA6|lg5EN7Zj#z4*3`OEc|2KUB;GHH~UMjhXtdDsJ6>VbdddtkX9 zn5WMJ)4}rADNl)MhE|h2&SR|(dU!v?ITv*K(&2NV7jGoMYw0E@Onta<>@vw`zuXOo+J_B_!{3C8r_eNSio$+`F z^*;_@1Lhuc`-yuhz)zuTJ^X*}=bl7pI~ylnY0qw)yy5J(^2eV)wzA9bDlfnMdcWz< z8~XJFp`-o2!ugWSOJeafY)0PRO@(J^7A;n z{l=xQ^-uMeH(&B})wlB-&~uD=`CjctYu;_t-@Fr^uKF???#{V zUhs6)mo%A7wQ}=7s(aGbIpLk`dU&sUP02v(;Ww>%cq6HYlX@5>^{|qp9!~1vq#jP{ z;X&8KJFl<&zWVCJW|i-r`}%z=dysl~2@R$mjf(fV ze7wV~i}$+UlpI!F{0Dyk0RR8o7;S76MRa;C2v|%h1lmx6#2}z3lo*w0GIw0TR$D=O z6cM#<@21z0?e4le3vGWJ!9){4K#4(r_)~u%3SuIlKTOmR!j~uk6rp^SsA=LKgdaF> zZ)b0B?#{j2mKc05+v$6|?_=J)nR)NVB80~AXDrIV7?-Z_Jpg~>T|PkV*IM)*K5n`v zBM1CQfczL#g{HXli3>$~ zB_3~SDox~Xmzs)2+Vm9h%XYL#oQy9qEv*uXmt(-?wbOw--fBYAJuJ&>)=fIV`HC7- zXX^qK31p*i0V{yU_so@sd2y ze1EPda55B$ThP4`;r~r=Wk<=m49oyTF~6>;r0 z2gv#N1K6$O&krB%nz`xnkB7cZbUo0xeHhn0)f0bRjD|z`fl7#*fH3>3GDofwG13=0 zPkL!81;=#IJY|1H-SS_^g~{jFY+{oFc1ww`-rap$*E5nM7eR0v{a@rtjZ0bUUr}ED zJk6zH6mOT*ZblPfBd(7DQc|jzN|tOk;+*lM-@S&1?r$9TNy9b#bamvxjZ=r5yxLru z)mKwMpMM?T`&TN%tsBgrAG)g2W$L=y{#wLPOoe&BVOYF1ry3DyhPrLdX@NU?oaWlG zzak)xGo?5Jy}-9X)`GTJqBXXpbLFCijg4IoD~1uOeqMmW)!k87t}aqu97TT2^~HY$ zA=YoWS=>#YDd_a+9R* zD!8V$`0{q3>rq}Fc4i}-)#u-r6D5B?L`^UB16`N-_guvHZlXJu($Dz)Emn7zdM-EL z0=O?al0IrhfSkYY2fMTQW4$$aW8=*o_{rTL4_|s?Ki;o@6MM7%JA85V>q9rM?7?CC zrA%UuERN;YgJSJqR27SL@Pj+$UIe2tkCDm?Kg1Xf&{wz)V7kuty6Mvsx(!ekR(;qtla?rt0n)dUH{W*mB1{7p3wO-E0aG9r-#cQIIrS7Th@`3S1!tR zVuJh0sNt1=rQ}=CKJ}kFH7GJ(?5f=(V*Kf(=;x&Ln z_>lzQApYQGz+doRwSX6~{QbbrevU)<%l!aX@r`=GYkA+vsT@z? zdI!GG8^1WUkK^S$y?qW`#ryUGT*99n-^1|&wzn~kgGK!i`erzA1aE&`33wb&IXRi* z3A`-k@gfH<;9V~Pp2H0eoW&xpvb>1vq+>N4kK)NEYB?VF?C)Fy zcsekiV%*@s75x5Mz%%&XT@4%$7u6%;KJ&vF9FO2F&jB98@3aG+zAIE(j!7Vm#IuK+yi(x>rM2Tpl@ZrKcQG|x|wUqa6m2To#{-*9$1$1|S1 z$WP|Lpcl`*p92hf>-~2f;E?B^_+ID{>n_JZ&i7*bOX$te!`}Rb{lyLp;R9a*{O;!4 z;iBtY%>MfAHpffB_D|Pw{2A})0L+iS$hRQ-A|C}^EYFJB7xRBTcmUuJeCQy+pGD`t zbqm0;JbQxv2LJ&7|E*VBZ&Xzjo*FRtAl6=JP0N%QUwkkk5(`9@37Y5|Dn&tq8R^(G zOqgD#7fpm$A6pD9Lk#sN&^s84&n8L=?aZ`N+nMQfW(sX7w^AaCdu`5lM%HnAW)iNM`QglWJn`LRT|gn(I1SPGa9{`CrG zmR{2M*_Ni~?Wfxm7aV?c?Prc#>!zvaATvteeZ-s~%*%aYD=z2{i#V%isuZu=^IJ83 zrP1h!V%niEU)eu?UNP>7PwL%uh`C6m6D5k*s9NI}@@juvp}Qr_c~?J>PZ@7bpI7k; z4fHb-Mm_MOOk>jFH~guHZBdNc(zG73Nh4lx9N8XP-)Jn;UX2xc>}B3E#*e<1 z_N0G5a-Us)>pYFkTvA+e*f-T5b&~ZrJ(qRp`L&fX5i3=Ix2l2kM2Rh%{IfgOCW^q*(MY5NDvg#A7)w2yy~ z4_Qa_74nbg$TQ|K#ytGH^CB~8*9rb&9`V8t^cVD?&hk0xB>NM6gnaJ#lzEdLRWX<7 z&uZo}t-ipFJNgcFmwAx=ZaQCx3uDBO|3mTKKcTVWh+o#(WFOx(ZuZefGXID_U;EI5 zv8m5Y_D`NWp{U;be=%0*q{c0y{nvl?Gvf|>(jU1`)_?C2<_i6EnUVYMFx4M@B@7;?rKuZ^$*U!>0C&Oe9Cx#=wr;e z-ed3s_k;8s{-BQ`P3s|X&lH+J?2~=#CgGRqJVS0)f8SQWXVq_$`fYeJ;n{y^jf>Rp zIZHB%t?`G!kT2xlw&NY^c|Llc7kYTy)))#lGz9#iU@)-V($iIx)AP)~=qdV#o{h@V zW^4S4`mvtIdTY|N&ld=M;X8Wl{o{45eow&H8an7x(+7MFSiyVWbMd=G_|4;YJDUQ* z7GJ0_c>L8Txyb4J)>D}O#nvg9<-S1U(PRF4IIi{8y7;%r^R$0Fe!1TNrLQdz`akR9 Q`49OwD4nIlv&15D0YTrZd;kCd diff --git a/matlab/examples/gtsamExamples.m b/matlab/examples/gtsamExamples.m index 049350d54..67d4f1c27 100644 --- a/matlab/examples/gtsamExamples.m +++ b/matlab/examples/gtsamExamples.m @@ -57,6 +57,7 @@ handles.output = hObject; % Update handles structure guidata(hObject, handles); +OdometryExample; % --- Outputs from this function are returned to the command line. function varargout = gtsamExamples_OutputFcn(hObject, eventdata, handles) From 984032e29e12245aaa4ec913d0f2a235bb40c36c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 14 Jun 2012 03:55:01 +0000 Subject: [PATCH 358/914] Put back Alex's change that I foolishly undid. --- matlab/VisualISAMPlot.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/matlab/VisualISAMPlot.m b/matlab/VisualISAMPlot.m index a2950b5dc..e140686d9 100644 --- a/matlab/VisualISAMPlot.m +++ b/matlab/VisualISAMPlot.m @@ -10,9 +10,10 @@ cla(h); hold on; %% Plot points -for k=1:length(data.J{M}) - j = data.J{M}{k}; - jj = symbol('l', j); +% Can't use data because current frame might not see all points +pointKeys = result.allPoints().keys(); +for j=0:N-1 % NOTE: uses indexing directly from a C++ vector, so zero-indexed + jj = pointKeys.at(j); point_j = result.point(jj); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); P = isam.marginalCovariance(jj); From 642e180ff72523a69c1efb1ca8bbd7a61c9677fa Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Thu, 14 Jun 2012 04:51:42 +0000 Subject: [PATCH 359/914] renamed StereoVO data files --- .../Data/{VO_camera_poses.txt => VO_camera_poses_large.txt} | 0 .../{VO_stereo_factors.txt => VO_stereo_factors_large.txt} | 0 matlab/examples/StereoVOExample_large.m | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename examples/Data/{VO_camera_poses.txt => VO_camera_poses_large.txt} (100%) rename examples/Data/{VO_stereo_factors.txt => VO_stereo_factors_large.txt} (100%) diff --git a/examples/Data/VO_camera_poses.txt b/examples/Data/VO_camera_poses_large.txt similarity index 100% rename from examples/Data/VO_camera_poses.txt rename to examples/Data/VO_camera_poses_large.txt diff --git a/examples/Data/VO_stereo_factors.txt b/examples/Data/VO_stereo_factors_large.txt similarity index 100% rename from examples/Data/VO_stereo_factors.txt rename to examples/Data/VO_stereo_factors_large.txt diff --git a/matlab/examples/StereoVOExample_large.m b/matlab/examples/StereoVOExample_large.m index 1b2db3bf3..171836cf8 100644 --- a/matlab/examples/StereoVOExample_large.m +++ b/matlab/examples/StereoVOExample_large.m @@ -24,7 +24,7 @@ initial = visualSLAMValues; %% load the initial poses from VO % row format: camera_id 4x4 pose (row, major) fprintf(1,'Reading data\n'); -cameras = dlmread('../../examples/Data/VO_camera_poses.txt'); +cameras = dlmread('../../examples/Data/VO_camera_poses_large.txt'); for i=1:size(cameras,1) pose = gtsamPose3(reshape(cameras(i,2:17),4,4)'); initial.insertPose(symbol('x',cameras(i,1)),pose); @@ -32,7 +32,7 @@ end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z -measurements = dlmread('../../examples/Data/VO_stereo_factors.txt'); +measurements = dlmread('../../examples/Data/VO_stereo_factors_large.txt'); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) From c3901f678428784c930d315c887a6bec8f714a21 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 14 Jun 2012 05:04:52 +0000 Subject: [PATCH 360/914] CALIBRATION template parameter --- gtsam/slam/ProjectionFactor.h | 15 +++++++-------- gtsam/slam/tests/testProjectionFactor.cpp | 9 ++++++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index 5a871d96f..e1ea38b27 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -29,13 +29,13 @@ namespace gtsam { * Non-linear factor for a constraint derived from a 2D measurement. The calibration is known here. * i.e. the main building block for visual SLAM. */ - template + template class GenericProjectionFactor: public NoiseModelFactor2 { protected: // Keep a copy of measurement and calibration for I/O - Point2 measured_; ///< 2D measurement - boost::shared_ptr K_; ///< shared pointer to calibration object + Point2 measured_; ///< 2D measurement + boost::shared_ptr K_; ///< shared pointer to calibration object public: @@ -43,14 +43,13 @@ namespace gtsam { typedef NoiseModelFactor2 Base; /// shorthand for this class - typedef GenericProjectionFactor This; + typedef GenericProjectionFactor This; /// shorthand for a smart pointer to a factor typedef boost::shared_ptr shared_ptr; /// Default constructor - GenericProjectionFactor() : - K_(new Cal3_S2(444, 555, 666, 777, 888)) { + GenericProjectionFactor() { } /** @@ -94,7 +93,7 @@ namespace gtsam { Vector evaluateError(const Pose3& pose, const Point3& point, boost::optional H1 = boost::none, boost::optional H2 = boost::none) const { try { - SimpleCamera camera(*K_, pose); + PinholeCamera camera(*K_, pose); Point2 reprojectionError(camera.project(point, H1, H2) - measured_); return reprojectionError.vector(); } catch( CheiralityException& e) { @@ -112,7 +111,7 @@ namespace gtsam { } /** return the calibration object */ - inline const Cal3_S2::shared_ptr calibration() const { + inline const boost::shared_ptr calibration() const { return K_; } diff --git a/gtsam/slam/tests/testProjectionFactor.cpp b/gtsam/slam/tests/testProjectionFactor.cpp index 0cd357c70..f344f98c9 100644 --- a/gtsam/slam/tests/testProjectionFactor.cpp +++ b/gtsam/slam/tests/testProjectionFactor.cpp @@ -18,6 +18,7 @@ #include #include +#include #include using namespace std; @@ -41,8 +42,14 @@ using symbol_shorthand::X; using symbol_shorthand::L; /* ************************************************************************* */ -TEST( ProjectionFactor, error ) +TEST( ProjectionFactor, nonStandard ) { + GenericProjectionFactor f; +} + +/* ************************************************************************* */ +TEST( ProjectionFactor, error ) + { // Create the factor with a measurement that is 3 pixels off in x Point2 z(323.,240.); int i=1, j=1; From 5a5d246b3097af04a3743f461d8ea67701628f34 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 14 Jun 2012 05:05:15 +0000 Subject: [PATCH 361/914] Added comments, some more methods --- gtsam/geometry/Cal3DS2.h | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/gtsam/geometry/Cal3DS2.h b/gtsam/geometry/Cal3DS2.h index fc6bce9db..d26b9a19d 100644 --- a/gtsam/geometry/Cal3DS2.h +++ b/gtsam/geometry/Cal3DS2.h @@ -34,7 +34,7 @@ private: double fx_, fy_, s_, u0_, v0_ ; // focal length, skew and principal point double k1_, k2_ ; // radial 2nd-order and 4th-order - double k3_, k4_ ; // tagential distortion + double k3_, k4_ ; // tangential distortion // K = [ fx s u0 ; 0 fy v0 ; 0 0 1 ] // r = Pn.x^2 + Pn.y^2 @@ -76,31 +76,46 @@ public: /// @name Standard Interface /// @{ - ///TODO: comment + /// focal length x + inline double fx() const { return fx_;} + + /// focal length x + inline double fy() const { return fy_;} + + /// skew + inline double skew() const { return s_;} + + /// image center in x + inline double px() const { return u0_;} + + /// image center in y + inline double py() const { return v0_;} + + /// Convert ideal point p (in intrinsic coordinates) into pixel coordinates Point2 uncalibrate(const Point2& p, boost::optional H1 = boost::none, boost::optional H2 = boost::none) const ; - ///TODO: comment + /// Derivative of uncalibrate wrpt intrinsic coordinates Matrix D2d_intrinsic(const Point2& p) const ; - ///TODO: comment + /// Derivative of uncalibrate wrpt the calibration parameters Matrix D2d_calibration(const Point2& p) const ; /// @} /// @name Manifold /// @{ - ///TODO: comment + /// Given delta vector, update calibration Cal3DS2 retract(const Vector& d) const ; - ///TODO: comment + /// Given a different calibration, calculate update to obtain it Vector localCoordinates(const Cal3DS2& T2) const ; - ///TODO: comment + /// Return dimensions of calibration manifold object virtual size_t dim() const { return 9 ; } //TODO: make a final dimension variable (also, usually size_t in other classes e.g. Pose2) - ///TODO: comment + /// Return dimensions of calibration manifold object static size_t Dim() { return 9; } //TODO: make a final dimension variable private: From 2524c632dff55937ebd451aea722da20f6e2b408 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 14 Jun 2012 05:05:41 +0000 Subject: [PATCH 362/914] Use p instead of l for points --- matlab/examples/SFMExample.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 9821b1478..3f8733fc3 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -36,7 +36,7 @@ measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; - graph.addMeasurement(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('l',j), data.K); + graph.addMeasurement(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('p',j), data.K); end end @@ -44,7 +44,7 @@ end posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); pointPriorNoise = gtsamSharedNoiseModel_Sigma(3,pointNoiseSigma); -graph.addPointPrior(symbol('l',1), truth.points{1}, pointPriorNoise); +graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); @@ -55,7 +55,7 @@ for i=1:size(truth.cameras,2) initialEstimate.insertPose(symbol('x',i), truth.cameras{i}.pose); end for j=1:size(truth.points,2) - initialEstimate.insertPoint(symbol('l',j), truth.points{j}); + initialEstimate.insertPoint(symbol('p',j), truth.points{j}); end initialEstimate.print(sprintf('\nInitial estimate:\n ')); @@ -68,8 +68,8 @@ marginals = graph.marginals(result); cla hold on; for j=1:result.nrPoints - P = marginals.marginalCovariance(symbol('l',j)); - point_j = result.point(symbol('l',j)); + P = marginals.marginalCovariance(symbol('p',j)); + point_j = result.point(symbol('p',j)); plot3(point_j.x, point_j.y, point_j.z,'marker','o'); covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); end From a6ea70da7bceda485460b05eba104fba051423b5 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Thu, 14 Jun 2012 05:10:12 +0000 Subject: [PATCH 363/914] small three pose VO example --- examples/Data/VO_camera_poses_small.txt | 3 + examples/Data/VO_stereo_factors_small.txt | 244 ++++++++++++++++++++++ matlab/examples/StereoVOExample_small.m | 79 +++++++ 3 files changed, 326 insertions(+) create mode 100644 examples/Data/VO_camera_poses_small.txt create mode 100644 examples/Data/VO_stereo_factors_small.txt create mode 100644 matlab/examples/StereoVOExample_small.m diff --git a/examples/Data/VO_camera_poses_small.txt b/examples/Data/VO_camera_poses_small.txt new file mode 100644 index 000000000..c0de67ee6 --- /dev/null +++ b/examples/Data/VO_camera_poses_small.txt @@ -0,0 +1,3 @@ +1 1 0 0 0 0 1 0 0 -0 0 1 0 0 0 0 1 +2 0.999997 -0.00240146 0.00061075 0.00314304 0.0024019 0.999997 -0.00071977 0.00414596 -0.00060902 0.000721235 1 0.95998 0 0 0 1 +3 0.999993 -0.00371801 0.000595621 0.00280572 0.00371612 0.999988 0.00314729 0.00981461 -0.000607315 -0.00314506 0.999995 1.91967 0 0 0 1 diff --git a/examples/Data/VO_stereo_factors_small.txt b/examples/Data/VO_stereo_factors_small.txt new file mode 100644 index 000000000..8c7e977a3 --- /dev/null +++ b/examples/Data/VO_stereo_factors_small.txt @@ -0,0 +1,244 @@ +1 3 209.979 185.87 61.5418 -8.90263 -2.48003 16.0758 +2 3 183.871 158.526 58.5288 -9.02175 -2.42293 15.2918 +3 3 154.533 127.498 45.2523 -9.04073 -2.53526 14.3359 +1 7 402.088 390.052 9.90739 -9.25908 -7.27203 32.201 +2 7 394.391 382.151 5.65911 -9.4424 -7.33715 31.6638 +1 8 363.621 350.3 19.013 -9.91743 -6.20361 29.0959 +2 8 354.573 340.708 15.0627 -9.87834 -6.11295 27.9529 +1 11 328.245 314.688 36.8183 -11.1456 -5.38969 28.5871 +2 11 317.629 303.492 33.1041 -11.0929 -5.31025 27.4172 +1 13 354.416 341.486 73.4162 -10.5993 -4.13089 29.9745 +2 13 345.335 332.443 71.2318 -11.0089 -4.23409 30.0629 +1 14 368.212 355.083 79.6458 -9.87405 -3.81336 29.5197 +2 14 359.443 346.409 77.3278 -10.308 -3.9369 29.7366 +1 19 408.795 393 106.946 -6.82736 -2.24133 24.5372 +2 19 401.89 386.918 105.831 -7.45048 -2.40457 25.8863 +3 19 393.846 380.541 101.098 -8.70882 -2.89695 29.1301 +1 22 301.371 288.22 123.147 -12.5881 -2.0303 29.4716 +2 22 290.134 277.334 122.566 -13.4053 -2.1104 30.2806 +3 22 279.457 266.441 118.448 -13.6226 -2.24522 29.7763 +1 24 286.858 267.821 24.4042 -9.10534 -4.18865 20.3589 +2 24 270.266 249.809 17.1811 -8.90883 -4.08751 18.9454 +1 25 309.828 295.159 40.0603 -10.9759 -4.86279 26.4221 +2 25 297.643 283.051 37.0473 -11.4821 -4.99925 26.5609 +3 25 284.476 269.313 30.9841 -11.5164 -5.0259 25.5613 +1 26 363.837 351.125 88.2117 -10.3829 -3.57654 30.4884 +2 26 355.143 341.918 86.1881 -10.3332 -3.51996 29.3055 +1 27 370.625 357.942 91.0858 -10.1195 -3.46309 30.5589 +2 27 362.093 348.932 89.118 -10.0997 -3.41747 29.4477 +3 27 353.648 339.913 83.786 -10.0087 -3.48344 28.2193 +1 31 363.348 350.145 50.9786 -10.0172 -4.95853 29.356 +2 31 354.105 340.884 47.9673 -10.3787 -5.07395 29.315 +3 31 345.08 331.083 40.9019 -10.1498 -5.06386 27.6901 +1 34 320.828 308.065 68.3594 -12.1511 -4.3976 30.3656 +2 34 309.484 299.53 65.6399 -16.1932 -5.78567 38.9369 +3 34 300.833 288.357 60.6176 -13.2921 -4.83229 31.0655 +1 35 381.449 368.573 103.554 -9.51642 -2.8911 30.1014 +2 35 373.428 360.047 102.291 -9.47902 -2.83262 28.9646 +3 35 364.836 351.587 97.66 -9.92143 -3.04847 29.2522 +1 36 412.916 399.447 45.4646 -7.8421 -5.08028 28.7748 +2 36 405.446 391.636 42.1742 -7.93906 -5.08285 28.0645 +3 36 397.898 383.772 34.6847 -8.04846 -5.25392 27.4366 +1 37 382.101 369.058 62.9139 -9.36758 -4.52773 29.7155 +2 37 373.575 360.402 60.3917 -9.62259 -4.58581 29.4217 +3 37 365.323 351.075 53.9171 -9.20802 -4.48407 27.2029 +1 38 368.271 355.646 103.567 -10.2656 -2.94784 30.6979 +2 38 359.673 346.474 102.328 -10.1689 -2.87003 29.3625 +3 38 351.187 337.872 97.0015 -10.4237 -3.06016 29.1094 +1 39 368.271 355.646 103.567 -10.2656 -2.94784 30.6979 +2 39 359.673 346.474 102.328 -10.1689 -2.87003 29.3625 +3 39 351.187 337.872 97.0015 -10.4237 -3.06016 29.1094 +1 40 399.549 387.359 100.33 -9.25423 -3.19583 31.7949 +2 40 392.339 379.894 99.3608 -9.3758 -3.17216 31.1435 +3 40 385.548 371.692 93.9091 -8.68421 -3.06044 27.9717 +1 41 314.778 303.477 61.5898 -14.0112 -5.28847 34.2952 +2 41 305.745 293.424 58.7429 -13.2453 -4.97487 31.4567 +3 41 295.126 280.156 52.0137 -11.2824 -4.33594 25.8899 +1 42 322.734 309.225 27.9559 -11.4054 -5.76176 28.6914 +2 42 311.74 297.908 23.4169 -11.5653 -5.80315 28.0198 +1 43 413.858 400.794 69.7088 -8.04664 -4.24101 29.6674 +2 43 406.585 392.833 66.8017 -7.92805 -4.14233 28.1828 +3 43 399.186 384.6 60.1878 -7.74727 -4.14907 26.5715 +1 44 429.786 416.985 10.8113 -7.54372 -6.79969 30.2774 +2 44 422.927 409.032 6.22854 -7.21468 -6.44127 27.8926 +1 45 429.786 416.985 10.8113 -7.54372 -6.79969 30.2774 +2 45 422.927 409.032 6.22854 -7.21468 -6.44127 27.8926 +1 47 476.875 462.803 22.9268 -5.06458 -5.72276 27.5413 +2 47 471.267 456.98 18.7569 -5.19929 -5.79349 27.1272 +1 49 534.551 521.959 30.0889 -3.19959 -6.08989 30.7784 +2 49 531.222 518.03 26.2453 -3.18982 -5.96976 29.3803 +1 51 438.047 425.403 38.834 -7.28628 -5.69352 30.6528 +2 51 431.401 418.237 35.3691 -7.2697 -5.61002 29.4421 +1 52 536.646 523.91 44.453 -3.07516 -5.41537 30.4312 +2 52 533.182 520.347 41.0937 -3.1965 -5.51432 30.1972 +1 56 433.895 420.782 74.4585 -7.19587 -4.03064 29.5568 +2 56 427.255 413.599 72.1036 -7.17079 -3.96294 28.3811 +3 56 420.734 406.674 65.7893 -7.21386 -4.09028 27.5655 +1 59 427.689 414.944 90.0841 -7.66535 -3.48853 30.4109 +2 59 421.003 407.495 88.2374 -7.49811 -3.36485 28.6925 +3 59 414.164 400.243 82.4393 -7.5395 -3.48873 27.8411 +1 61 476.203 463.728 119.273 -5.74205 -2.3071 31.068 +2 61 471.246 458.29 118.352 -5.73435 -2.2596 29.9143 +3 61 466.603 453.213 113.763 -5.73513 -2.3706 28.9466 +1 62 549.824 538.317 13.0527 -2.7883 -7.45917 33.6798 +2 62 547.191 535.348 8.33458 -2.8288 -7.46196 32.7262 +1 63 494.158 482.317 49.1257 -5.23515 -5.6129 32.7324 +2 63 490.361 477.694 46.2753 -5.05459 -5.36754 30.5967 +3 63 486.219 472.742 39.6488 -4.91601 -5.30919 28.7585 +1 65 555.494 543.327 74.0345 -2.38699 -4.36286 31.8557 +2 65 552.415 540.886 71.3792 -2.66241 -4.72779 33.617 +3 65 550.653 538.6 65.114 -2.6252 -4.80152 32.1559 +1 66 456.271 443.352 85.912 -6.37377 -3.61506 30.0017 +2 66 450.683 437.004 83.9661 -6.239 -3.49059 28.3344 +1 67 480.016 466.663 91.5877 -5.21084 -3.26892 29.0237 +2 67 474.718 461.005 89.4507 -5.2816 -3.26684 28.262 +3 67 469.735 455.72 83.7122 -5.35873 -3.41635 27.6528 +1 68 495.411 483.037 98.2553 -4.95513 -3.2383 31.3217 +2 68 490.935 478.057 96.7302 -4.94811 -3.1753 30.097 +1 69 444.061 431.758 124.931 -7.22597 -2.09239 31.5037 +2 69 437.98 425.397 124.035 -7.32459 -2.08407 30.8019 +3 69 432.417 419.076 119.726 -7.1323 -2.13909 29.0514 +1 74 477.818 464.863 47.7721 -5.46253 -5.18639 29.9178 +2 74 472.705 459.099 44.6283 -5.40304 -5.06238 28.4865 +1 75 477.818 464.863 47.7721 -5.46253 -5.18639 29.9178 +2 75 472.705 459.099 44.6283 -5.40304 -5.06238 28.4865 +1 76 422.265 408.875 55.2521 -7.51344 -4.71768 28.945 +2 76 415.112 401.023 52.1342 -7.41364 -4.60265 27.5099 +3 76 408.035 393.207 45.1294 -7.30047 -4.62698 26.1386 +1 79 451.106 438.208 77.5776 -6.59924 -3.96805 30.0504 +2 79 445.036 431.574 75.2566 -6.56457 -3.89418 28.7897 +1 80 461.33 448.183 77.9245 -6.05615 -3.8785 29.4796 +2 80 455.329 441.776 75.6553 -6.11249 -3.85221 28.5962 +3 80 449.704 435.837 69.5686 -6.19193 -4.00072 27.9485 +1 83 524.861 512.387 99.0037 -3.64712 -3.18001 31.0695 +2 83 521.387 508.737 97.3619 -3.74378 -3.2054 30.6365 +3 83 518.54 505.038 91.9327 -3.62084 -3.21914 28.7036 +1 86 451.632 438.453 41.5387 -6.43651 -5.35192 29.4072 +2 86 445.619 432.262 37.972 -6.59294 -5.42433 29.0169 +3 86 439.939 425.582 30.5923 -6.34627 -5.32265 26.996 +1 87 519.097 508.425 56.748 -4.55329 -5.84403 36.3176 +2 87 515.739 502.233 53.8001 -3.73134 -4.73491 28.6964 +3 87 512.106 497.923 47.0277 -3.69077 -4.76531 27.3262 +1 88 534.071 522.238 63.8388 -3.42661 -4.94851 32.7527 +2 88 531.165 518.834 61.4406 -3.41475 -4.85304 31.4294 +1 89 534.071 522.238 63.8388 -3.42661 -4.94851 32.7527 +2 89 531.165 518.834 61.4406 -3.41475 -4.85304 31.4294 +1 92 435.312 422.269 78.4345 -7.1758 -3.88835 29.7142 +2 92 428.787 415.335 76.4018 -7.21856 -3.8515 28.8123 +3 92 422.68 408.458 70.1035 -7.05831 -3.88082 27.252 +1 93 450.491 437.056 88.6618 -6.35949 -3.36598 28.8469 +2 93 444.629 430.861 86.4587 -6.43476 -3.37071 28.1507 +3 93 438.781 424.649 80.6644 -6.49125 -3.50411 27.4255 +1 94 455.793 443.363 111.853 -6.64468 -2.63603 31.1797 +2 94 450 436.592 110.47 -6.39219 -2.4992 28.906 +3 94 444.45 431.11 105.548 -6.64812 -2.71008 29.0528 +1 96 516.839 504.605 114.884 -4.07104 -2.54525 31.6802 +2 96 513.501 500.595 113.958 -3.99767 -2.45111 30.0285 +1 97 545.632 534.021 117.895 -2.95751 -2.5426 33.3807 +2 97 543.43 531.117 117.068 -2.88466 -2.4335 31.4748 +1 98 455.088 441.992 55.321 -6.3357 -4.82066 29.5942 +2 98 448.718 435.522 52.1503 -6.54678 -4.91306 29.3691 +3 98 443.134 428.998 45.1421 -6.3241 -4.85301 27.4182 +1 100 427.579 414.128 66.7824 -7.26719 -4.23585 28.8138 +2 100 420.199 406.208 64.0832 -7.26993 -4.17594 27.7013 +3 100 413.155 398.753 57.4381 -7.32551 -4.3048 26.912 +1 101 427.579 414.128 66.7824 -7.26719 -4.23585 28.8138 +2 101 420.199 406.208 64.0832 -7.26993 -4.17594 27.7013 +3 101 413.155 398.753 57.4381 -7.32551 -4.3048 26.912 +1 103 542.696 530.061 22.2283 -2.84256 -6.40353 30.6746 +2 103 539.496 526.632 18.0308 -2.92561 -6.46493 30.1291 +3 103 538.168 524.086 12.1824 -2.72324 -6.12886 27.5232 +1 104 535.956 523.649 89.7316 -3.21258 -3.62806 31.4931 +2 104 533.076 520.355 87.8891 -3.22957 -3.58772 30.4676 +3 104 530.458 517.095 82.3061 -3.17958 -3.6397 29.0032 +1 105 535.956 523.649 89.7316 -3.21258 -3.62806 31.4931 +2 105 533.076 520.355 87.8891 -3.22957 -3.58772 30.4676 +3 105 530.458 517.095 82.3061 -3.17958 -3.6397 29.0032 +1 107 566.9 555.395 21.5232 -1.99174 -7.06559 33.6884 +2 107 564.716 552.833 17.392 -2.02712 -7.02754 32.6166 +1 112 658.214 646.669 88.116 2.26369 -3.9425 33.5701 +2 112 658.897 647.085 85.9733 2.24356 -3.95075 32.8107 +1 113 675.96 664.671 103.316 3.15958 -3.30888 34.3333 +2 113 677.522 665.531 101.535 3.04463 -3.195 32.324 +1 114 658.454 646.975 119.766 2.28803 -2.48428 33.7645 +2 114 659.332 647.379 118.527 2.23661 -2.44124 32.423 +3 114 660.767 648.4 113.81 2.22421 -2.56458 31.3399 +1 115 606.492 600.958 15.8831 -0.297771 -15.2365 70.0367 +2 115 605.534 599.882 14.2559 -0.382556 -15.0733 68.5755 +1 116 670.748 663.186 44.3523 4.34633 -9.12761 51.2516 +2 116 671.336 663.146 42.0262 4.05203 -8.58126 47.3271 +3 116 672.087 664.058 35.3488 4.18339 -9.1997 48.2741 +1 120 683.092 671.693 102.585 3.46491 -3.31111 33.9993 +2 120 684.634 672.737 100.791 3.38946 -3.25346 32.5757 +3 120 686.62 674.585 95.205 3.43928 -3.46554 32.2029 +1 123 661.897 656.37 19.4334 5.08714 -14.9123 70.1326 +2 123 661.865 656.089 16.9831 4.86425 -14.4954 67.1001 +3 123 662.228 656.907 12.0509 5.3169 -16.2332 72.8397 +1 125 559.802 547.566 36.2278 -2.18429 -5.9978 31.675 +2 125 557.384 544.657 32.6228 -2.20213 -5.9186 30.4532 +3 125 555.609 542.186 24.9967 -2.15891 -5.91676 28.8736 +1 128 617.818 606.749 109.389 0.400776 -3.07971 35.0133 +2 128 617.902 605.737 108.604 0.368359 -2.8369 31.8587 +1 129 653.913 642.678 111.773 2.1206 -2.92037 34.4978 +2 129 654.56 642.954 110.278 2.08274 -2.89618 33.3948 +3 129 655.858 643.64 105.386 2.03546 -2.96612 31.7211 +1 137 602.716 594.449 115.366 -0.444616 -3.73531 46.8819 +2 137 601.999 593.818 114.699 -0.496396 -3.81847 47.3762 +3 137 601.865 593.596 110.463 -0.499836 -4.05281 46.8702 +1 138 822.785 817.07 56.4723 20.0396 -10.9379 67.8124 +2 138 825.065 819.162 54.809 19.6106 -10.7418 65.6584 +3 138 828.256 822.273 49.8178 19.6342 -11.046 64.7783 +1 142 823.365 817.614 40.2749 19.9696 -12.383 67.3921 +2 142 825.659 819.737 38.3195 19.6034 -12.2042 65.454 +3 142 828.962 822.701 32.8848 18.8242 -12.009 61.9061 +1 144 815.798 810.929 59.8465 22.7486 -12.465 79.5871 +2 144 817.787 812.929 58.1828 23.0257 -12.6803 79.7871 +3 144 821.963 815.798 53.8181 18.5089 -10.3729 62.8752 +1 145 815.798 810.929 59.8465 22.7486 -12.465 79.5871 +2 145 817.787 812.929 58.1828 23.0257 -12.6803 79.7871 +1 146 777.011 765.364 70.4036 7.72293 -4.72504 33.2775 +2 146 781.246 769.121 67.4527 7.60553 -4.66916 31.9633 +3 146 786.571 774.015 60.9102 7.57279 -4.78911 30.8683 +1 148 764.595 753.222 100.942 7.32281 -3.39666 34.0805 +2 148 768.801 756.5 98.7651 6.95374 -3.2353 31.508 +1 151 769.692 758.18 119.424 7.47199 -2.4931 33.6678 +2 151 774.14 761.647 117.907 7.07619 -2.36246 31.0226 +1 152 769.692 758.18 119.424 7.47199 -2.4931 33.6678 +2 152 774.14 761.647 117.907 7.07619 -2.36246 31.0226 +1 153 769.692 758.18 119.424 7.47199 -2.4931 33.6678 +2 153 774.14 761.647 117.907 7.07619 -2.36246 31.0226 +3 153 779.344 766.681 112.851 7.2019 -2.54521 30.606 +1 155 829.479 823.269 46.3632 19.0214 -10.9405 62.4074 +2 155 832.007 825.885 44.4532 19.5195 -11.267 63.314 +1 158 819.357 810.23 71.9845 12.3472 -5.93645 42.4645 +2 158 824.128 814.918 69.5689 12.5149 -6.02419 42.0843 +3 158 830.206 820.885 63.3726 12.7145 -6.30875 41.5779 +1 159 788.924 777.307 74.6425 8.29323 -4.54096 33.3615 +2 159 793.683 781.418 71.6578 8.0637 -4.43188 31.5997 +3 159 799.1 786.642 65.4656 8.17271 -4.63044 31.1117 +1 160 700.033 688.956 119.498 4.38707 -2.58723 34.9873 +2 160 702.16 690.617 117.977 4.30911 -2.55363 33.5761 +3 160 704.427 692.419 114.085 4.2437 -2.62889 32.2765 +1 170 863.862 853.773 32.7773 13.5388 -7.45754 38.414 +2 170 869.634 859.099 29.2066 13.2603 -7.32407 36.7887 +3 170 876.662 865.763 21.815 13.1645 -7.44417 35.562 +1 171 863.862 853.773 32.7773 13.5388 -7.45754 38.414 +2 171 869.634 859.099 29.2066 13.2603 -7.32407 36.7887 +3 171 876.662 865.763 21.815 13.1645 -7.44417 35.562 +1 179 1082.33 1035.83 56.9512 5.46202 -1.33906 8.33616 +2 179 1143.34 1090.25 40.9695 5.3999 -1.33418 7.29928 +3 179 1223.79 1163.7 16.1894 5.49146 -1.40065 6.45087 +1 180 1057.33 1012.89 113.1 5.41204 -0.722226 8.72091 +2 180 1112.37 1062.54 104.89 5.41996 -0.732605 7.77771 +1 186 1032 985.776 48.4555 4.90898 -1.44557 8.38463 +2 186 1085.42 1033.06 31.4657 4.88201 -1.45056 7.40254 +1 187 1051.8 1005.3 52.7114 5.10833 -1.38778 8.33454 +2 187 1108.05 1055.56 36.3784 5.10147 -1.39666 7.38407 +1 188 1034.71 988.427 55.8301 4.93464 -1.35829 8.37485 +2 188 1088.88 1036.23 39.7023 4.88985 -1.35836 7.36084 +3 188 1160.46 1100.97 15.2843 4.97444 -1.42279 6.51521 +1 190 1085.46 1039.22 62.8393 5.52829 -1.27798 8.38169 +2 190 1146.8 1094.21 47.6122 5.48765 -1.27929 7.3702 +3 190 1228.58 1168.42 24.1453 5.52629 -1.32759 6.44148 +1 200 988.3 953.944 70.9989 5.92163 -1.59251 11.2813 +2 200 1023.27 984.786 60.7993 5.77461 -1.56408 10.0713 \ No newline at end of file diff --git a/matlab/examples/StereoVOExample_small.m b/matlab/examples/StereoVOExample_small.m new file mode 100644 index 000000000..95926ee0d --- /dev/null +++ b/matlab/examples/StereoVOExample_small.m @@ -0,0 +1,79 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read Stereo Visual Odometry from file and optimize +% @author Chris Beall +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Load calibration +% format: fx fy skew cx cy baseline +calib = dlmread('../../examples/Data/VO_calibration.txt'); +K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); +stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]); + +%% create empty graph and values +graph = visualSLAMGraph; +initial = visualSLAMValues; + + +%% load the initial poses from VO +% row format: camera_id 4x4 pose (row, major) +fprintf(1,'Reading data\n'); +cameras = dlmread('../../examples/Data/VO_camera_poses_small.txt'); +for i=1:size(cameras,1) + pose = gtsamPose3(reshape(cameras(i,2:17),4,4)'); + initial.insertPose(symbol('x',cameras(i,1)),pose); +end + +%% load stereo measurements and initialize landmarks +% camera_id landmark_id uL uR v X Y Z +measurements = dlmread('../../examples/Data/VO_stereo_factors_small.txt'); + +fprintf(1,'Creating Graph\n'); tic +for i=1:size(measurements,1) + sf = measurements(i,:); + graph.addStereoMeasurement(gtsamStereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... + symbol('x', sf(1)), symbol('l', sf(2)), K); + + if ~initial.exists(symbol('l',sf(2))) + % 3D landmarks are stored in camera coordinates: transform + % to world coordinates using the respective initial pose + pose = initial.pose(symbol('x', sf(1))); + world_point = pose.transform_from(gtsamPoint3(sf(6),sf(7),sf(8))); + initial.insertPoint(symbol('l',sf(2)), world_point); + end +end +toc + +%% add a constraint on the starting pose +key = symbol('x',1); +first_pose = initial.pose(key); +graph.addPoseConstraint(key, first_pose); + +%% optimize +fprintf(1,'Optimizing\n'); tic +result = graph.optimize(initial); +toc + +%% visualize initial trajectory, final trajectory, and final points +figure(1); clf; hold on; + +% initial trajectory in red (rotated so Z is up) +plot3(initial.zs(),-initial.xs(),-initial.ys(), '-*r','LineWidth',2); + +% final trajectory in green (rotated so Z is up) +plot3(result.zs(),-result.xs(),-result.ys(), '-*g','LineWidth',2); +xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); + + +% optimized 3D points (rotated so Z is up) +points = result.points(); +plot3(points(:,3),-points(:,1),-points(:,2),'.'); + +axis equal +view(3) From c9a89587e04ad79bd30d1672f8442365a1bde997 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 14 Jun 2012 14:50:54 +0000 Subject: [PATCH 364/914] Removed empty folder From b2debfbc3a6b0595e51af45caef5e8d91fa977fc Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 14 Jun 2012 16:03:55 +0000 Subject: [PATCH 365/914] Fixed comment --- gtsam/nonlinear/NonlinearFactorGraph.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/NonlinearFactorGraph.h b/gtsam/nonlinear/NonlinearFactorGraph.h index 429bf0102..29aa9ede1 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.h +++ b/gtsam/nonlinear/NonlinearFactorGraph.h @@ -46,7 +46,7 @@ namespace gtsam { /** print just calls base class */ void print(const std::string& str = "NonlinearFactorGraph: ", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; - /** return keys in some random order */ + /** return keys as an ordered set - ordering is by key value */ std::set keys() const; /** unnormalized error, \f$ 0.5 \sum_i (h_i(X_i)-z)^2/\sigma^2 \f$ in the most common case */ From cbc5ee6c1899fad9ddb75aafb30403bef181f07e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 14 Jun 2012 16:03:57 +0000 Subject: [PATCH 366/914] Added wrapping for NonlinearFactor to allow for access to keys from an individual key --- gtsam.h | 24 +++++++++++++++++++++++- gtsam/inference/FactorGraph.h | 6 ++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/gtsam.h b/gtsam.h index 6628d2424..c32488093 100644 --- a/gtsam.h +++ b/gtsam.h @@ -662,6 +662,15 @@ class NonlinearFactorGraph { void print(string s) const; }; +class NonlinearFactor { +// NonlinearFactor(); // FIXME: don't use this - creates an abstract class + void print(string s) const; + void equals(const gtsam::NonlinearFactor& other, double tol) const; + gtsam::KeyVector keys() const; + size_t size() const; + size_t dim() const; +}; + class Values { Values(); size_t size() const; @@ -730,6 +739,7 @@ class Graph { bool empty() const; void remove(size_t i); size_t nrFactors() const; + gtsam::NonlinearFactor* at(size_t i) const; // NonlinearFactorGraph double error(const pose2SLAM::Values& values) const; @@ -780,6 +790,7 @@ class Graph { bool empty() const; void remove(size_t i); size_t nrFactors() const; + gtsam::NonlinearFactor* at(size_t i) const; // NonlinearFactorGraph double error(const pose3SLAM::Values& values) const; @@ -827,6 +838,7 @@ class Graph { bool empty() const; void remove(size_t i); size_t nrFactors() const; + gtsam::NonlinearFactor* at(size_t i) const; // NonlinearFactorGraph double error(const planarSLAM::Values& values) const; @@ -860,6 +872,9 @@ class Odometry { // Simulated2D //************************************************************************* +// FIXME: Simulated* domains are not actually installed, so this should be removed +// from the toolbox + #include namespace simulated2D { @@ -935,7 +950,14 @@ class Values { class Graph { Graph(); - void print(string s) const; + // FactorGraph + void print(string s) const; + bool equals(const visualSLAM::Graph& fg, double tol) const; + size_t size() const; + bool empty() const; + void remove(size_t i); + size_t nrFactors() const; + gtsam::NonlinearFactor* at(size_t i) const; double error(const visualSLAM::Values& values) const; gtsam::Ordering* orderingCOLAMD(const visualSLAM::Values& values) const; diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 621c18b9f..a1a14b01c 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -157,8 +157,10 @@ template class BayesTree; operator const std::vector&() const { return factors_; } /** Get a specific factor by index */ - const sharedFactor operator[](size_t i) const { assert(i Date: Thu, 14 Jun 2012 16:10:46 +0000 Subject: [PATCH 367/914] Removed simulated2D from wrapped example domains, as it isn't actually installed anymore --- gtsam.h | 50 -------------------------------------------------- 1 file changed, 50 deletions(-) diff --git a/gtsam.h b/gtsam.h index c32488093..1b9689a77 100644 --- a/gtsam.h +++ b/gtsam.h @@ -868,56 +868,6 @@ class Odometry { }///\namespace planarSLAM -//************************************************************************* -// Simulated2D -//************************************************************************* - -// FIXME: Simulated* domains are not actually installed, so this should be removed -// from the toolbox - -#include -namespace simulated2D { - -class Values { - Values(); - void insertPose(size_t i, const gtsam::Point2& p); - void insertPoint(size_t j, const gtsam::Point2& p); - size_t nrPoses() const; - size_t nrPoints() const; - gtsam::Point2 pose(size_t i); - gtsam::Point2 point(size_t j); -}; - -class Graph { - Graph(); -}; - -// TODO: add factors, etc. - -}///\namespace simulated2D - -// Simulated2DOriented Example Domain -#include -namespace simulated2DOriented { - -class Values { - Values(); - void insertPose(size_t i, const gtsam::Pose2& p); - void insertPoint(size_t j, const gtsam::Point2& p); - size_t nrPoses() const; - size_t nrPoints() const; - gtsam::Pose2 pose(size_t i); - gtsam::Point2 point(size_t j); -}; - -class Graph { - Graph(); -}; - -// TODO: add factors, etc. - -}///\namespace simulated2DOriented - //************************************************************************* // VisualSLAM //************************************************************************* From 562ec1b6304eeeb961f1155b26d7d54500d6f0bb Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Thu, 14 Jun 2012 17:33:58 +0000 Subject: [PATCH 368/914] simplified basic StereoVOExample to use only 3 artificial landmarks and 2 poses --- examples/Data/VO_camera_poses_small.txt | 3 - examples/Data/VO_stereo_factors_small.txt | 244 ---------------------- matlab/examples/StereoVOExample.m | 77 +++++++ matlab/examples/StereoVOExample_small.m | 79 ------- 4 files changed, 77 insertions(+), 326 deletions(-) delete mode 100644 examples/Data/VO_camera_poses_small.txt delete mode 100644 examples/Data/VO_stereo_factors_small.txt create mode 100644 matlab/examples/StereoVOExample.m delete mode 100644 matlab/examples/StereoVOExample_small.m diff --git a/examples/Data/VO_camera_poses_small.txt b/examples/Data/VO_camera_poses_small.txt deleted file mode 100644 index c0de67ee6..000000000 --- a/examples/Data/VO_camera_poses_small.txt +++ /dev/null @@ -1,3 +0,0 @@ -1 1 0 0 0 0 1 0 0 -0 0 1 0 0 0 0 1 -2 0.999997 -0.00240146 0.00061075 0.00314304 0.0024019 0.999997 -0.00071977 0.00414596 -0.00060902 0.000721235 1 0.95998 0 0 0 1 -3 0.999993 -0.00371801 0.000595621 0.00280572 0.00371612 0.999988 0.00314729 0.00981461 -0.000607315 -0.00314506 0.999995 1.91967 0 0 0 1 diff --git a/examples/Data/VO_stereo_factors_small.txt b/examples/Data/VO_stereo_factors_small.txt deleted file mode 100644 index 8c7e977a3..000000000 --- a/examples/Data/VO_stereo_factors_small.txt +++ /dev/null @@ -1,244 +0,0 @@ -1 3 209.979 185.87 61.5418 -8.90263 -2.48003 16.0758 -2 3 183.871 158.526 58.5288 -9.02175 -2.42293 15.2918 -3 3 154.533 127.498 45.2523 -9.04073 -2.53526 14.3359 -1 7 402.088 390.052 9.90739 -9.25908 -7.27203 32.201 -2 7 394.391 382.151 5.65911 -9.4424 -7.33715 31.6638 -1 8 363.621 350.3 19.013 -9.91743 -6.20361 29.0959 -2 8 354.573 340.708 15.0627 -9.87834 -6.11295 27.9529 -1 11 328.245 314.688 36.8183 -11.1456 -5.38969 28.5871 -2 11 317.629 303.492 33.1041 -11.0929 -5.31025 27.4172 -1 13 354.416 341.486 73.4162 -10.5993 -4.13089 29.9745 -2 13 345.335 332.443 71.2318 -11.0089 -4.23409 30.0629 -1 14 368.212 355.083 79.6458 -9.87405 -3.81336 29.5197 -2 14 359.443 346.409 77.3278 -10.308 -3.9369 29.7366 -1 19 408.795 393 106.946 -6.82736 -2.24133 24.5372 -2 19 401.89 386.918 105.831 -7.45048 -2.40457 25.8863 -3 19 393.846 380.541 101.098 -8.70882 -2.89695 29.1301 -1 22 301.371 288.22 123.147 -12.5881 -2.0303 29.4716 -2 22 290.134 277.334 122.566 -13.4053 -2.1104 30.2806 -3 22 279.457 266.441 118.448 -13.6226 -2.24522 29.7763 -1 24 286.858 267.821 24.4042 -9.10534 -4.18865 20.3589 -2 24 270.266 249.809 17.1811 -8.90883 -4.08751 18.9454 -1 25 309.828 295.159 40.0603 -10.9759 -4.86279 26.4221 -2 25 297.643 283.051 37.0473 -11.4821 -4.99925 26.5609 -3 25 284.476 269.313 30.9841 -11.5164 -5.0259 25.5613 -1 26 363.837 351.125 88.2117 -10.3829 -3.57654 30.4884 -2 26 355.143 341.918 86.1881 -10.3332 -3.51996 29.3055 -1 27 370.625 357.942 91.0858 -10.1195 -3.46309 30.5589 -2 27 362.093 348.932 89.118 -10.0997 -3.41747 29.4477 -3 27 353.648 339.913 83.786 -10.0087 -3.48344 28.2193 -1 31 363.348 350.145 50.9786 -10.0172 -4.95853 29.356 -2 31 354.105 340.884 47.9673 -10.3787 -5.07395 29.315 -3 31 345.08 331.083 40.9019 -10.1498 -5.06386 27.6901 -1 34 320.828 308.065 68.3594 -12.1511 -4.3976 30.3656 -2 34 309.484 299.53 65.6399 -16.1932 -5.78567 38.9369 -3 34 300.833 288.357 60.6176 -13.2921 -4.83229 31.0655 -1 35 381.449 368.573 103.554 -9.51642 -2.8911 30.1014 -2 35 373.428 360.047 102.291 -9.47902 -2.83262 28.9646 -3 35 364.836 351.587 97.66 -9.92143 -3.04847 29.2522 -1 36 412.916 399.447 45.4646 -7.8421 -5.08028 28.7748 -2 36 405.446 391.636 42.1742 -7.93906 -5.08285 28.0645 -3 36 397.898 383.772 34.6847 -8.04846 -5.25392 27.4366 -1 37 382.101 369.058 62.9139 -9.36758 -4.52773 29.7155 -2 37 373.575 360.402 60.3917 -9.62259 -4.58581 29.4217 -3 37 365.323 351.075 53.9171 -9.20802 -4.48407 27.2029 -1 38 368.271 355.646 103.567 -10.2656 -2.94784 30.6979 -2 38 359.673 346.474 102.328 -10.1689 -2.87003 29.3625 -3 38 351.187 337.872 97.0015 -10.4237 -3.06016 29.1094 -1 39 368.271 355.646 103.567 -10.2656 -2.94784 30.6979 -2 39 359.673 346.474 102.328 -10.1689 -2.87003 29.3625 -3 39 351.187 337.872 97.0015 -10.4237 -3.06016 29.1094 -1 40 399.549 387.359 100.33 -9.25423 -3.19583 31.7949 -2 40 392.339 379.894 99.3608 -9.3758 -3.17216 31.1435 -3 40 385.548 371.692 93.9091 -8.68421 -3.06044 27.9717 -1 41 314.778 303.477 61.5898 -14.0112 -5.28847 34.2952 -2 41 305.745 293.424 58.7429 -13.2453 -4.97487 31.4567 -3 41 295.126 280.156 52.0137 -11.2824 -4.33594 25.8899 -1 42 322.734 309.225 27.9559 -11.4054 -5.76176 28.6914 -2 42 311.74 297.908 23.4169 -11.5653 -5.80315 28.0198 -1 43 413.858 400.794 69.7088 -8.04664 -4.24101 29.6674 -2 43 406.585 392.833 66.8017 -7.92805 -4.14233 28.1828 -3 43 399.186 384.6 60.1878 -7.74727 -4.14907 26.5715 -1 44 429.786 416.985 10.8113 -7.54372 -6.79969 30.2774 -2 44 422.927 409.032 6.22854 -7.21468 -6.44127 27.8926 -1 45 429.786 416.985 10.8113 -7.54372 -6.79969 30.2774 -2 45 422.927 409.032 6.22854 -7.21468 -6.44127 27.8926 -1 47 476.875 462.803 22.9268 -5.06458 -5.72276 27.5413 -2 47 471.267 456.98 18.7569 -5.19929 -5.79349 27.1272 -1 49 534.551 521.959 30.0889 -3.19959 -6.08989 30.7784 -2 49 531.222 518.03 26.2453 -3.18982 -5.96976 29.3803 -1 51 438.047 425.403 38.834 -7.28628 -5.69352 30.6528 -2 51 431.401 418.237 35.3691 -7.2697 -5.61002 29.4421 -1 52 536.646 523.91 44.453 -3.07516 -5.41537 30.4312 -2 52 533.182 520.347 41.0937 -3.1965 -5.51432 30.1972 -1 56 433.895 420.782 74.4585 -7.19587 -4.03064 29.5568 -2 56 427.255 413.599 72.1036 -7.17079 -3.96294 28.3811 -3 56 420.734 406.674 65.7893 -7.21386 -4.09028 27.5655 -1 59 427.689 414.944 90.0841 -7.66535 -3.48853 30.4109 -2 59 421.003 407.495 88.2374 -7.49811 -3.36485 28.6925 -3 59 414.164 400.243 82.4393 -7.5395 -3.48873 27.8411 -1 61 476.203 463.728 119.273 -5.74205 -2.3071 31.068 -2 61 471.246 458.29 118.352 -5.73435 -2.2596 29.9143 -3 61 466.603 453.213 113.763 -5.73513 -2.3706 28.9466 -1 62 549.824 538.317 13.0527 -2.7883 -7.45917 33.6798 -2 62 547.191 535.348 8.33458 -2.8288 -7.46196 32.7262 -1 63 494.158 482.317 49.1257 -5.23515 -5.6129 32.7324 -2 63 490.361 477.694 46.2753 -5.05459 -5.36754 30.5967 -3 63 486.219 472.742 39.6488 -4.91601 -5.30919 28.7585 -1 65 555.494 543.327 74.0345 -2.38699 -4.36286 31.8557 -2 65 552.415 540.886 71.3792 -2.66241 -4.72779 33.617 -3 65 550.653 538.6 65.114 -2.6252 -4.80152 32.1559 -1 66 456.271 443.352 85.912 -6.37377 -3.61506 30.0017 -2 66 450.683 437.004 83.9661 -6.239 -3.49059 28.3344 -1 67 480.016 466.663 91.5877 -5.21084 -3.26892 29.0237 -2 67 474.718 461.005 89.4507 -5.2816 -3.26684 28.262 -3 67 469.735 455.72 83.7122 -5.35873 -3.41635 27.6528 -1 68 495.411 483.037 98.2553 -4.95513 -3.2383 31.3217 -2 68 490.935 478.057 96.7302 -4.94811 -3.1753 30.097 -1 69 444.061 431.758 124.931 -7.22597 -2.09239 31.5037 -2 69 437.98 425.397 124.035 -7.32459 -2.08407 30.8019 -3 69 432.417 419.076 119.726 -7.1323 -2.13909 29.0514 -1 74 477.818 464.863 47.7721 -5.46253 -5.18639 29.9178 -2 74 472.705 459.099 44.6283 -5.40304 -5.06238 28.4865 -1 75 477.818 464.863 47.7721 -5.46253 -5.18639 29.9178 -2 75 472.705 459.099 44.6283 -5.40304 -5.06238 28.4865 -1 76 422.265 408.875 55.2521 -7.51344 -4.71768 28.945 -2 76 415.112 401.023 52.1342 -7.41364 -4.60265 27.5099 -3 76 408.035 393.207 45.1294 -7.30047 -4.62698 26.1386 -1 79 451.106 438.208 77.5776 -6.59924 -3.96805 30.0504 -2 79 445.036 431.574 75.2566 -6.56457 -3.89418 28.7897 -1 80 461.33 448.183 77.9245 -6.05615 -3.8785 29.4796 -2 80 455.329 441.776 75.6553 -6.11249 -3.85221 28.5962 -3 80 449.704 435.837 69.5686 -6.19193 -4.00072 27.9485 -1 83 524.861 512.387 99.0037 -3.64712 -3.18001 31.0695 -2 83 521.387 508.737 97.3619 -3.74378 -3.2054 30.6365 -3 83 518.54 505.038 91.9327 -3.62084 -3.21914 28.7036 -1 86 451.632 438.453 41.5387 -6.43651 -5.35192 29.4072 -2 86 445.619 432.262 37.972 -6.59294 -5.42433 29.0169 -3 86 439.939 425.582 30.5923 -6.34627 -5.32265 26.996 -1 87 519.097 508.425 56.748 -4.55329 -5.84403 36.3176 -2 87 515.739 502.233 53.8001 -3.73134 -4.73491 28.6964 -3 87 512.106 497.923 47.0277 -3.69077 -4.76531 27.3262 -1 88 534.071 522.238 63.8388 -3.42661 -4.94851 32.7527 -2 88 531.165 518.834 61.4406 -3.41475 -4.85304 31.4294 -1 89 534.071 522.238 63.8388 -3.42661 -4.94851 32.7527 -2 89 531.165 518.834 61.4406 -3.41475 -4.85304 31.4294 -1 92 435.312 422.269 78.4345 -7.1758 -3.88835 29.7142 -2 92 428.787 415.335 76.4018 -7.21856 -3.8515 28.8123 -3 92 422.68 408.458 70.1035 -7.05831 -3.88082 27.252 -1 93 450.491 437.056 88.6618 -6.35949 -3.36598 28.8469 -2 93 444.629 430.861 86.4587 -6.43476 -3.37071 28.1507 -3 93 438.781 424.649 80.6644 -6.49125 -3.50411 27.4255 -1 94 455.793 443.363 111.853 -6.64468 -2.63603 31.1797 -2 94 450 436.592 110.47 -6.39219 -2.4992 28.906 -3 94 444.45 431.11 105.548 -6.64812 -2.71008 29.0528 -1 96 516.839 504.605 114.884 -4.07104 -2.54525 31.6802 -2 96 513.501 500.595 113.958 -3.99767 -2.45111 30.0285 -1 97 545.632 534.021 117.895 -2.95751 -2.5426 33.3807 -2 97 543.43 531.117 117.068 -2.88466 -2.4335 31.4748 -1 98 455.088 441.992 55.321 -6.3357 -4.82066 29.5942 -2 98 448.718 435.522 52.1503 -6.54678 -4.91306 29.3691 -3 98 443.134 428.998 45.1421 -6.3241 -4.85301 27.4182 -1 100 427.579 414.128 66.7824 -7.26719 -4.23585 28.8138 -2 100 420.199 406.208 64.0832 -7.26993 -4.17594 27.7013 -3 100 413.155 398.753 57.4381 -7.32551 -4.3048 26.912 -1 101 427.579 414.128 66.7824 -7.26719 -4.23585 28.8138 -2 101 420.199 406.208 64.0832 -7.26993 -4.17594 27.7013 -3 101 413.155 398.753 57.4381 -7.32551 -4.3048 26.912 -1 103 542.696 530.061 22.2283 -2.84256 -6.40353 30.6746 -2 103 539.496 526.632 18.0308 -2.92561 -6.46493 30.1291 -3 103 538.168 524.086 12.1824 -2.72324 -6.12886 27.5232 -1 104 535.956 523.649 89.7316 -3.21258 -3.62806 31.4931 -2 104 533.076 520.355 87.8891 -3.22957 -3.58772 30.4676 -3 104 530.458 517.095 82.3061 -3.17958 -3.6397 29.0032 -1 105 535.956 523.649 89.7316 -3.21258 -3.62806 31.4931 -2 105 533.076 520.355 87.8891 -3.22957 -3.58772 30.4676 -3 105 530.458 517.095 82.3061 -3.17958 -3.6397 29.0032 -1 107 566.9 555.395 21.5232 -1.99174 -7.06559 33.6884 -2 107 564.716 552.833 17.392 -2.02712 -7.02754 32.6166 -1 112 658.214 646.669 88.116 2.26369 -3.9425 33.5701 -2 112 658.897 647.085 85.9733 2.24356 -3.95075 32.8107 -1 113 675.96 664.671 103.316 3.15958 -3.30888 34.3333 -2 113 677.522 665.531 101.535 3.04463 -3.195 32.324 -1 114 658.454 646.975 119.766 2.28803 -2.48428 33.7645 -2 114 659.332 647.379 118.527 2.23661 -2.44124 32.423 -3 114 660.767 648.4 113.81 2.22421 -2.56458 31.3399 -1 115 606.492 600.958 15.8831 -0.297771 -15.2365 70.0367 -2 115 605.534 599.882 14.2559 -0.382556 -15.0733 68.5755 -1 116 670.748 663.186 44.3523 4.34633 -9.12761 51.2516 -2 116 671.336 663.146 42.0262 4.05203 -8.58126 47.3271 -3 116 672.087 664.058 35.3488 4.18339 -9.1997 48.2741 -1 120 683.092 671.693 102.585 3.46491 -3.31111 33.9993 -2 120 684.634 672.737 100.791 3.38946 -3.25346 32.5757 -3 120 686.62 674.585 95.205 3.43928 -3.46554 32.2029 -1 123 661.897 656.37 19.4334 5.08714 -14.9123 70.1326 -2 123 661.865 656.089 16.9831 4.86425 -14.4954 67.1001 -3 123 662.228 656.907 12.0509 5.3169 -16.2332 72.8397 -1 125 559.802 547.566 36.2278 -2.18429 -5.9978 31.675 -2 125 557.384 544.657 32.6228 -2.20213 -5.9186 30.4532 -3 125 555.609 542.186 24.9967 -2.15891 -5.91676 28.8736 -1 128 617.818 606.749 109.389 0.400776 -3.07971 35.0133 -2 128 617.902 605.737 108.604 0.368359 -2.8369 31.8587 -1 129 653.913 642.678 111.773 2.1206 -2.92037 34.4978 -2 129 654.56 642.954 110.278 2.08274 -2.89618 33.3948 -3 129 655.858 643.64 105.386 2.03546 -2.96612 31.7211 -1 137 602.716 594.449 115.366 -0.444616 -3.73531 46.8819 -2 137 601.999 593.818 114.699 -0.496396 -3.81847 47.3762 -3 137 601.865 593.596 110.463 -0.499836 -4.05281 46.8702 -1 138 822.785 817.07 56.4723 20.0396 -10.9379 67.8124 -2 138 825.065 819.162 54.809 19.6106 -10.7418 65.6584 -3 138 828.256 822.273 49.8178 19.6342 -11.046 64.7783 -1 142 823.365 817.614 40.2749 19.9696 -12.383 67.3921 -2 142 825.659 819.737 38.3195 19.6034 -12.2042 65.454 -3 142 828.962 822.701 32.8848 18.8242 -12.009 61.9061 -1 144 815.798 810.929 59.8465 22.7486 -12.465 79.5871 -2 144 817.787 812.929 58.1828 23.0257 -12.6803 79.7871 -3 144 821.963 815.798 53.8181 18.5089 -10.3729 62.8752 -1 145 815.798 810.929 59.8465 22.7486 -12.465 79.5871 -2 145 817.787 812.929 58.1828 23.0257 -12.6803 79.7871 -1 146 777.011 765.364 70.4036 7.72293 -4.72504 33.2775 -2 146 781.246 769.121 67.4527 7.60553 -4.66916 31.9633 -3 146 786.571 774.015 60.9102 7.57279 -4.78911 30.8683 -1 148 764.595 753.222 100.942 7.32281 -3.39666 34.0805 -2 148 768.801 756.5 98.7651 6.95374 -3.2353 31.508 -1 151 769.692 758.18 119.424 7.47199 -2.4931 33.6678 -2 151 774.14 761.647 117.907 7.07619 -2.36246 31.0226 -1 152 769.692 758.18 119.424 7.47199 -2.4931 33.6678 -2 152 774.14 761.647 117.907 7.07619 -2.36246 31.0226 -1 153 769.692 758.18 119.424 7.47199 -2.4931 33.6678 -2 153 774.14 761.647 117.907 7.07619 -2.36246 31.0226 -3 153 779.344 766.681 112.851 7.2019 -2.54521 30.606 -1 155 829.479 823.269 46.3632 19.0214 -10.9405 62.4074 -2 155 832.007 825.885 44.4532 19.5195 -11.267 63.314 -1 158 819.357 810.23 71.9845 12.3472 -5.93645 42.4645 -2 158 824.128 814.918 69.5689 12.5149 -6.02419 42.0843 -3 158 830.206 820.885 63.3726 12.7145 -6.30875 41.5779 -1 159 788.924 777.307 74.6425 8.29323 -4.54096 33.3615 -2 159 793.683 781.418 71.6578 8.0637 -4.43188 31.5997 -3 159 799.1 786.642 65.4656 8.17271 -4.63044 31.1117 -1 160 700.033 688.956 119.498 4.38707 -2.58723 34.9873 -2 160 702.16 690.617 117.977 4.30911 -2.55363 33.5761 -3 160 704.427 692.419 114.085 4.2437 -2.62889 32.2765 -1 170 863.862 853.773 32.7773 13.5388 -7.45754 38.414 -2 170 869.634 859.099 29.2066 13.2603 -7.32407 36.7887 -3 170 876.662 865.763 21.815 13.1645 -7.44417 35.562 -1 171 863.862 853.773 32.7773 13.5388 -7.45754 38.414 -2 171 869.634 859.099 29.2066 13.2603 -7.32407 36.7887 -3 171 876.662 865.763 21.815 13.1645 -7.44417 35.562 -1 179 1082.33 1035.83 56.9512 5.46202 -1.33906 8.33616 -2 179 1143.34 1090.25 40.9695 5.3999 -1.33418 7.29928 -3 179 1223.79 1163.7 16.1894 5.49146 -1.40065 6.45087 -1 180 1057.33 1012.89 113.1 5.41204 -0.722226 8.72091 -2 180 1112.37 1062.54 104.89 5.41996 -0.732605 7.77771 -1 186 1032 985.776 48.4555 4.90898 -1.44557 8.38463 -2 186 1085.42 1033.06 31.4657 4.88201 -1.45056 7.40254 -1 187 1051.8 1005.3 52.7114 5.10833 -1.38778 8.33454 -2 187 1108.05 1055.56 36.3784 5.10147 -1.39666 7.38407 -1 188 1034.71 988.427 55.8301 4.93464 -1.35829 8.37485 -2 188 1088.88 1036.23 39.7023 4.88985 -1.35836 7.36084 -3 188 1160.46 1100.97 15.2843 4.97444 -1.42279 6.51521 -1 190 1085.46 1039.22 62.8393 5.52829 -1.27798 8.38169 -2 190 1146.8 1094.21 47.6122 5.48765 -1.27929 7.3702 -3 190 1228.58 1168.42 24.1453 5.52629 -1.32759 6.44148 -1 200 988.3 953.944 70.9989 5.92163 -1.59251 11.2813 -2 200 1023.27 984.786 60.7993 5.77461 -1.56408 10.0713 \ No newline at end of file diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m new file mode 100644 index 000000000..b3c834a93 --- /dev/null +++ b/matlab/examples/StereoVOExample.m @@ -0,0 +1,77 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Basic VO Example with 3 landmarks and two cameras +% @author Chris Beall +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - For simplicity this example is in the camera's coordinate frame +% - X: right, Y: down, Z: forward +% - Pose x1 is at the origin, Pose 2 is 1 meter forward (along Z-axis) +% - x1 is fixed with a constraint, x2 is initialized with noisy values +% - No noise on measurements + +%% Create keys for variables +x1 = symbol('x',1); x2 = symbol('x',2); +l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); + +%% Create graph container and add factors to it +graph = visualSLAMGraph; + +%% add a constraint on the starting pose +first_pose = gtsamPose3(); +graph.addPoseConstraint(x1, first_pose); + +%% Create realistic calibration and measurement noise model +% format: fx fy skew cx cy baseline +K = gtsamCal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); +stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]); + +%% Add measurements +% pose 1 +graph.addStereoMeasurement(gtsamStereoPoint2(520, 480, 440), stereo_model, x1, l1, K); +graph.addStereoMeasurement(gtsamStereoPoint2(120, 80, 440), stereo_model, x1, l2, K); +graph.addStereoMeasurement(gtsamStereoPoint2(320, 280, 140), stereo_model, x1, l3, K); + +%pose 2 +graph.addStereoMeasurement(gtsamStereoPoint2(570, 520, 490), stereo_model, x2, l1, K); +graph.addStereoMeasurement(gtsamStereoPoint2( 70, 20, 490), stereo_model, x2, l2, K); +graph.addStereoMeasurement(gtsamStereoPoint2(320, 270, 115), stereo_model, x2, l3, K); + + +%% Create initial estimate for camera poses and landmarks +initialEstimate = visualSLAMValues; +initialEstimate.insertPose(x1, first_pose); +% noisy estimate for pose 2 +initialEstimate.insertPose(x2, gtsamPose3(gtsamRot3(), gtsamPoint3(0.1,-.1,1.1))); +initialEstimate.insertPoint(l1, gtsamPoint3( 1, 1, 5)); +initialEstimate.insertPoint(l2, gtsamPoint3(-1, 1, 5)); +initialEstimate.insertPoint(l3, gtsamPoint3( 0,-.5, 5)); + +%% optimize +fprintf(1,'Optimizing\n'); tic +result = graph.optimize(initialEstimate); +toc + +%% visualize initial trajectory, final trajectory, and final points +figure(1); clf; hold on; + +% initial trajectory in red (rotated so Z is up) +plot3(initialEstimate.zs(),-initialEstimate.xs(),-initialEstimate.ys(), '-*r','LineWidth',2); + +% final trajectory in green (rotated so Z is up) +plot3(result.zs(),-result.xs(),-result.ys(), '-*g','LineWidth',2); +xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); + +% optimized 3D points (rotated so Z is up) +points = result.points(); +plot3(points(:,3),-points(:,1),-points(:,2),'.'); + +axis equal +view(3) diff --git a/matlab/examples/StereoVOExample_small.m b/matlab/examples/StereoVOExample_small.m deleted file mode 100644 index 95926ee0d..000000000 --- a/matlab/examples/StereoVOExample_small.m +++ /dev/null @@ -1,79 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 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 -% -% @brief Read Stereo Visual Odometry from file and optimize -% @author Chris Beall -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Load calibration -% format: fx fy skew cx cy baseline -calib = dlmread('../../examples/Data/VO_calibration.txt'); -K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); -stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]); - -%% create empty graph and values -graph = visualSLAMGraph; -initial = visualSLAMValues; - - -%% load the initial poses from VO -% row format: camera_id 4x4 pose (row, major) -fprintf(1,'Reading data\n'); -cameras = dlmread('../../examples/Data/VO_camera_poses_small.txt'); -for i=1:size(cameras,1) - pose = gtsamPose3(reshape(cameras(i,2:17),4,4)'); - initial.insertPose(symbol('x',cameras(i,1)),pose); -end - -%% load stereo measurements and initialize landmarks -% camera_id landmark_id uL uR v X Y Z -measurements = dlmread('../../examples/Data/VO_stereo_factors_small.txt'); - -fprintf(1,'Creating Graph\n'); tic -for i=1:size(measurements,1) - sf = measurements(i,:); - graph.addStereoMeasurement(gtsamStereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... - symbol('x', sf(1)), symbol('l', sf(2)), K); - - if ~initial.exists(symbol('l',sf(2))) - % 3D landmarks are stored in camera coordinates: transform - % to world coordinates using the respective initial pose - pose = initial.pose(symbol('x', sf(1))); - world_point = pose.transform_from(gtsamPoint3(sf(6),sf(7),sf(8))); - initial.insertPoint(symbol('l',sf(2)), world_point); - end -end -toc - -%% add a constraint on the starting pose -key = symbol('x',1); -first_pose = initial.pose(key); -graph.addPoseConstraint(key, first_pose); - -%% optimize -fprintf(1,'Optimizing\n'); tic -result = graph.optimize(initial); -toc - -%% visualize initial trajectory, final trajectory, and final points -figure(1); clf; hold on; - -% initial trajectory in red (rotated so Z is up) -plot3(initial.zs(),-initial.xs(),-initial.ys(), '-*r','LineWidth',2); - -% final trajectory in green (rotated so Z is up) -plot3(result.zs(),-result.xs(),-result.ys(), '-*g','LineWidth',2); -xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); - - -% optimized 3D points (rotated so Z is up) -points = result.points(); -plot3(points(:,3),-points(:,1),-points(:,2),'.'); - -axis equal -view(3) From 13057e7548b98e84d349cfeedc30eae95984fa51 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Thu, 14 Jun 2012 18:49:53 +0000 Subject: [PATCH 369/914] added StereoVOExample to GUI --- matlab/examples/StereoVOExample.m | 3 ++- matlab/examples/gtsamExamples.m | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index b3c834a93..661b9aee8 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -60,7 +60,7 @@ result = graph.optimize(initialEstimate); toc %% visualize initial trajectory, final trajectory, and final points -figure(1); clf; hold on; +cla; hold on; % initial trajectory in red (rotated so Z is up) plot3(initialEstimate.zs(),-initialEstimate.xs(),-initialEstimate.ys(), '-*r','LineWidth',2); @@ -73,5 +73,6 @@ xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); points = result.points(); plot3(points(:,3),-points(:,1),-points(:,2),'.'); +axis([-4 4 -4 4 -4 4]); axis equal view(3) diff --git a/matlab/examples/gtsamExamples.m b/matlab/examples/gtsamExamples.m index 67d4f1c27..b3862088a 100644 --- a/matlab/examples/gtsamExamples.m +++ b/matlab/examples/gtsamExamples.m @@ -134,7 +134,10 @@ echo off % --- Executes on button press in StereoVO. function StereoVO_Callback(hObject, eventdata, handles) -fprintf(1,'StereoVOExample not implemented yet\n'); +axes(handles.axes3); +echo on +StereoVOExample +echo off % --- Executes on button press in Future. function Future_Callback(hObject, eventdata, handles) From d36b8b63e72fea808d1f19cd9cc195f1a52c4ec9 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 14 Jun 2012 20:00:51 +0000 Subject: [PATCH 370/914] Added versions of partial priors for parts of poses - useful for GPS or inertial priors. Added interval interface to Pose2 and Pose3. --- gtsam/geometry/Pose2.h | 18 ++++- gtsam/geometry/Pose3.h | 14 ++++ gtsam/geometry/concepts.h | 8 +++ gtsam/slam/PartialPriorFactor.h | 3 - gtsam_unstable/CMakeLists.txt | 9 ++- gtsam_unstable/slam/CMakeLists.txt | 26 +++++++ gtsam_unstable/slam/PoseRotationPrior.h | 64 +++++++++++++++++ gtsam_unstable/slam/PoseTranslationPrior.h | 64 +++++++++++++++++ gtsam_unstable/slam/tests/testPosePriors.cpp | 76 ++++++++++++++++++++ 9 files changed, 274 insertions(+), 8 deletions(-) create mode 100644 gtsam_unstable/slam/CMakeLists.txt create mode 100644 gtsam_unstable/slam/PoseRotationPrior.h create mode 100644 gtsam_unstable/slam/PoseTranslationPrior.h create mode 100644 gtsam_unstable/slam/tests/testPosePriors.cpp diff --git a/gtsam/geometry/Pose2.h b/gtsam/geometry/Pose2.h index 60c74e7cb..d091ddac8 100644 --- a/gtsam/geometry/Pose2.h +++ b/gtsam/geometry/Pose2.h @@ -259,12 +259,26 @@ public: boost::optional H1=boost::none, boost::optional H2=boost::none) const; -private: - /// @} /// @name Advanced Interface /// @{ + /** + * Return the start and end indices (inclusive) of the translation component of the + * exponential map parameterization + * @return a pair of [start, end] indices into the tangent space vector + */ + inline static std::pair translationInterval() { return std::make_pair(0, 1); } + + /** + * Return the start and end indices (inclusive) of the rotation component of the + * exponential map parameterization + * @return a pair of [start, end] indices into the tangent space vector + */ + static std::pair rotationInterval() { return std::make_pair(2, 2); } + +private: + // Serialization function friend class boost::serialization::access; template diff --git a/gtsam/geometry/Pose3.h b/gtsam/geometry/Pose3.h index 4d32a5608..dfae2d7a2 100644 --- a/gtsam/geometry/Pose3.h +++ b/gtsam/geometry/Pose3.h @@ -228,6 +228,20 @@ namespace gtsam { /// @name Advanced Interface /// @{ + /** + * Return the start and end indices (inclusive) of the translation component of the + * exponential map parameterization + * @return a pair of [start, end] indices into the tangent space vector + */ + inline static std::pair translationInterval() { return std::make_pair(3, 5); } + + /** + * Return the start and end indices (inclusive) of the rotation component of the + * exponential map parameterization + * @return a pair of [start, end] indices into the tangent space vector + */ + static std::pair rotationInterval() { return std::make_pair(0, 2); } + private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam/geometry/concepts.h b/gtsam/geometry/concepts.h index 3000530e5..bde16ee6e 100644 --- a/gtsam/geometry/concepts.h +++ b/gtsam/geometry/concepts.h @@ -49,6 +49,14 @@ private: static Translation checkTranslationMemberAccess(const POSE& p) { return p.translation(); } + + static std::pair checkTranslationInterval() { + return POSE::translationInterval(); + } + + static std::pair checkRotationInterval() { + return POSE::rotationInterval(); + } }; /** diff --git a/gtsam/slam/PartialPriorFactor.h b/gtsam/slam/PartialPriorFactor.h index bea3f3f46..f096ed9bc 100644 --- a/gtsam/slam/PartialPriorFactor.h +++ b/gtsam/slam/PartialPriorFactor.h @@ -66,9 +66,6 @@ namespace gtsam { public: - // shorthand for a smart pointer to a factor - typedef typename boost::shared_ptr shared_ptr; - virtual ~PartialPriorFactor() {} /** Single Element Constructor: acts on a single parameter specified by idx */ diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index b03dc3d73..1c781453a 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -2,9 +2,11 @@ # and also build tests set (gtsam_unstable_subdirs base - discrete + discrete +# linear dynamics nonlinear + slam ) add_custom_target(check.unstable COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) @@ -14,7 +16,7 @@ foreach(subdir ${gtsam_unstable_subdirs}) # Build convenience libraries file(GLOB subdir_srcs "${subdir}/*.cpp") set(${subdir}_srcs ${subdir_srcs}) - if (GTSAM_BUILD_CONVENIENCE_LIBRARIES) + if (subdir_srcs AND GTSAM_BUILD_CONVENIENCE_LIBRARIES) message(STATUS "Building Convenience Library: ${subdir}_unstable") add_library("${subdir}_unstable" STATIC ${subdir_srcs}) endif() @@ -29,8 +31,9 @@ set(gtsam_unstable_srcs ${base_srcs} ${discrete_srcs} ${dynamics_srcs} - ${linear_srcs} + #${linear_srcs} ${nonlinear_srcs} + ${slam_srcs} ) option (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam_unstable" ON) diff --git a/gtsam_unstable/slam/CMakeLists.txt b/gtsam_unstable/slam/CMakeLists.txt new file mode 100644 index 000000000..88dd60edd --- /dev/null +++ b/gtsam_unstable/slam/CMakeLists.txt @@ -0,0 +1,26 @@ +# Install headers +file(GLOB slam_headers "*.h") +install(FILES ${slam_headers} DESTINATION include/gtsam_unstable/slam) + +# Components to link tests in this subfolder against +set(slam_local_libs + #slam_unstable # No sources currently, so no convenience lib + slam + nonlinear + linear + inference + geometry + base + ccolamd +) + +set (slam_full_libs + gtsam-static + gtsam_unstable-static) + +# Exclude tests that don't work +set (slam_excluded_tests "") + +# Add all tests +gtsam_add_subdir_tests(slam_unstable "${slam_local_libs}" "${slam_full_libs}" "${slam_excluded_tests}") +add_dependencies(check.unstable check.slam_unstable) diff --git a/gtsam_unstable/slam/PoseRotationPrior.h b/gtsam_unstable/slam/PoseRotationPrior.h new file mode 100644 index 000000000..c5f039f7f --- /dev/null +++ b/gtsam_unstable/slam/PoseRotationPrior.h @@ -0,0 +1,64 @@ +/** + * @file PoseRotationPrior.h + * + * @brief Implements a prior on the rotation component of a pose + * + * @date Jun 14, 2012 + * @author Alex Cunningham + */ + +#pragma once + +#include +#include + +namespace gtsam { + +template +class PoseRotationPrior : public PartialPriorFactor { +public: + + typedef PoseRotationPrior This; + typedef PartialPriorFactor Base; + typedef POSE Pose; + typedef typename POSE::Rotation Rotation; + + GTSAM_CONCEPT_POSE_TYPE(Pose) + GTSAM_CONCEPT_GROUP_TYPE(Pose) + GTSAM_CONCEPT_LIE_TYPE(Rotation) + + /** standard constructor */ + PoseRotationPrior(Key key, const Rotation& rot_z, const SharedNoiseModel& model) + : Base(key, model) + { + assert(rot_z.dim() == model->dim()); + + // Calculate the prior applied + this->prior_ = Rotation::Logmap(rot_z); + + // Create the mask for partial prior + size_t pose_dim = Pose::identity().dim(); + size_t rot_dim = rot_z.dim(); + + // get the interval of the lie coordinates corresponding to rotation + std::pair interval = Pose::rotationInterval(); + + std::vector mask; + for (size_t i=interval.first; i<=interval.second; ++i) + mask.push_back(i); + this->mask_ = mask; + + this->H_ = zeros(rot_dim, pose_dim); + this->fillH(); + } + + /** get the rotation used to create the measurement */ + Rotation priorRotation() const { return Rotation::Expmap(this->prior_); } + +}; + +} // \namespace gtsam + + + + diff --git a/gtsam_unstable/slam/PoseTranslationPrior.h b/gtsam_unstable/slam/PoseTranslationPrior.h new file mode 100644 index 000000000..0e4d34b8b --- /dev/null +++ b/gtsam_unstable/slam/PoseTranslationPrior.h @@ -0,0 +1,64 @@ +/** + * @file PoseTranslationPrior.h + * + * @brief Implements a prior on the translation component of a pose + * + * @date Jun 14, 2012 + * @author Alex Cunningham + */ + +#pragma once + +#include +#include + +namespace gtsam { + +template +class PoseTranslationPrior : public PartialPriorFactor { +public: + + typedef PoseTranslationPrior This; + typedef PartialPriorFactor Base; + typedef POSE Pose; + typedef typename POSE::Translation Translation; + + GTSAM_CONCEPT_POSE_TYPE(Pose) + GTSAM_CONCEPT_GROUP_TYPE(Pose) + GTSAM_CONCEPT_LIE_TYPE(Translation) + + /** standard constructor */ + PoseTranslationPrior(Key key, const Translation& rot_z, const SharedNoiseModel& model) + : Base(key, model) + { + assert(rot_z.dim() == model->dim()); + + // Calculate the prior applied + this->prior_ = Translation::Logmap(rot_z); + + // Create the mask for partial prior + size_t pose_dim = Pose::identity().dim(); + size_t rot_dim = rot_z.dim(); + + // get the interval of the lie coordinates corresponding to rotation + std::pair interval = Pose::translationInterval(); + + std::vector mask; + for (size_t i=interval.first; i<=interval.second; ++i) + mask.push_back(i); + this->mask_ = mask; + + this->H_ = zeros(rot_dim, pose_dim); + this->fillH(); + } + + /** get the rotation used to create the measurement */ + Translation priorTranslation() const { return Translation::Expmap(this->prior_); } + +}; + +} // \namespace gtsam + + + + diff --git a/gtsam_unstable/slam/tests/testPosePriors.cpp b/gtsam_unstable/slam/tests/testPosePriors.cpp new file mode 100644 index 000000000..4aa835266 --- /dev/null +++ b/gtsam_unstable/slam/tests/testPosePriors.cpp @@ -0,0 +1,76 @@ +/** + * @file testPosePriors.cpp + * + * @brief Tests partial priors on poses + * + * @date Jun 14, 2012 + * @author Alex Cunningham + */ + +#include + +#include +#include + +#include +#include + +#include + +using namespace gtsam; + +Key x1 = symbol_shorthand::X(1); + +const SharedNoiseModel model1 = noiseModel::Diagonal::Sigmas(Vector_(1, 0.1)); +const SharedNoiseModel model2 = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); +const SharedNoiseModel model3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); + +/* ************************************************************************* */ +TEST( testPoseTranslationPrior, planar) { + + typedef PoseTranslationPrior PlanarTPrior; + PlanarTPrior actTprior(x1, Point2(2.0, 3.0), model2); + EXPECT(assert_equal(Point2(2.0, 3.0), actTprior.priorTranslation())); + Matrix expH(2,3); expH << eye(2,2), zeros(2,1); + EXPECT(assert_equal(eye(2,3), actTprior.H())); +} + +/* ************************************************************************* */ +TEST( testPoseTranslationPrior, visual) { + + typedef PoseTranslationPrior VisualTPrior; + VisualTPrior actPose3Tprior(x1, Point3(2.0, 3.0, 4.0), model3); + EXPECT(assert_equal(Point3(2.0, 3.0, 4.0), actPose3Tprior.priorTranslation())); + Matrix expH(3,6); expH << zeros(3,3), eye(3,3); + EXPECT(assert_equal(expH, actPose3Tprior.H())); + +// typedef PoseTranslationPrior CamTPrior; +// CamTPrior actCamTprior(x1, Point3(2.0, 3.0, 4.0), model3); +} + +/* ************************************************************************* */ +TEST( testPoseRotationPrior, planar) { + + typedef PoseRotationPrior PlanarRPrior; + PlanarRPrior actRprior(x1, Rot2::fromDegrees(30.0), model1); + EXPECT(assert_equal(Rot2::fromDegrees(30.0), actRprior.priorRotation())); + Matrix expH(1,3); expH << 0.0, 0.0, 1.0; + EXPECT(assert_equal(expH, actRprior.H())); +} + +/* ************************************************************************* */ +TEST( testPoseRotationPrior, visual) { + + typedef PoseRotationPrior VisualRPrior; + VisualRPrior actPose3Rprior(x1, Rot3::RzRyRx(0.1, 0.2, 0.3), model3); + EXPECT(assert_equal(Rot3::RzRyRx(0.1, 0.2, 0.3), actPose3Rprior.priorRotation())); + Matrix expH(3,6); expH << eye(3,3), zeros(3,3); + EXPECT(assert_equal(expH, actPose3Rprior.H())); + +// typedef testPoseRotationPrior CamRPrior; +// CamRPrior actCamRprior(x1, Rot3::RzRyRx(0.1, 0.2, 0.3), model3); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From 8bdef8a392df13a928a3a8ce2fdac1675f70e26b Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Thu, 14 Jun 2012 22:07:17 +0000 Subject: [PATCH 371/914] 1. return a copy instead of shared ptr 2. arrange the code a bit --- gtsam/linear/IterativeSolver.h | 2 +- gtsam/linear/SimpleSPCGSolver.cpp | 10 +++++----- gtsam/linear/SimpleSPCGSolver.h | 6 +++--- gtsam/linear/SubgraphSolver.cpp | 7 ++----- gtsam/linear/SubgraphSolver.h | 2 +- gtsam/linear/iterative-inl.h | 13 +++++++++---- gtsam/linear/iterative.h | 3 +-- gtsam/nonlinear/GradientDescentOptimizer.h | 4 +--- gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp | 4 ++-- 9 files changed, 25 insertions(+), 26 deletions(-) diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 77146d1e4..6030f7be6 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -52,7 +52,7 @@ namespace gtsam { public: IterativeSolver(){} virtual ~IterativeSolver() {} - virtual VectorValues::shared_ptr optimize () = 0; + virtual VectorValues optimize () = 0; }; } diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp index addbc74dd..fa0fee82f 100644 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ b/gtsam/linear/SimpleSPCGSolver.cpp @@ -82,7 +82,7 @@ SimpleSPCGSolver::SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Paramet } /* implements the CGLS method in Section 7.4 of Bjork's book */ -VectorValues::shared_ptr SimpleSPCGSolver::optimize (const VectorValues &initial) { +VectorValues SimpleSPCGSolver::optimize (const VectorValues &initial) { VectorValues::shared_ptr x(new VectorValues(initial)); VectorValues r = VectorValues::Zero(*by_), @@ -180,10 +180,10 @@ void SimpleSPCGSolver::transposeBackSubstitute(const VectorValues &input, Vector } } -VectorValues::shared_ptr SimpleSPCGSolver::transform(const VectorValues &y) { - VectorValues::shared_ptr x = boost::make_shared(VectorValues::Zero(y)); - this->backSubstitute(y, *x); - axpy(1.0, *xt_, *x); +VectorValues SimpleSPCGSolver::transform(const VectorValues &y) { + VectorValues x = VectorValues::Zero(y); + this->backSubstitute(y, x); + axpy(1.0, *xt_, x); return x; } diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h index 097022c22..994815fa4 100644 --- a/gtsam/linear/SimpleSPCGSolver.h +++ b/gtsam/linear/SimpleSPCGSolver.h @@ -65,11 +65,11 @@ public: SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); virtual ~SimpleSPCGSolver() {} - virtual VectorValues::shared_ptr optimize () {return optimize(*y0_);} + virtual VectorValues optimize () {return optimize(*y0_);} protected: - VectorValues::shared_ptr optimize (const VectorValues &initial); + VectorValues optimize (const VectorValues &initial); /** output = \f$ [\bar{b_y} ; 0 ] - [A_c R_t^{-1} ; I] \f$ input */ void residual(const VectorValues &input, VectorValues &output); @@ -87,7 +87,7 @@ protected: void transposeBackSubstitute(const VectorValues &rhs, VectorValues &sol) ; /** return \f$ R_t^{-1} y + x_t \f$ */ - VectorValues::shared_ptr transform(const VectorValues &y); + VectorValues transform(const VectorValues &y); /** naively split a gaussian factor graph into tree and constraint parts * Note: This function has to be refined for your graph/application */ diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 891585ee5..d2af81a6c 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -58,13 +58,10 @@ SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters Rc1, xbar); } -VectorValues::shared_ptr SubgraphSolver::optimize() { +VectorValues SubgraphSolver::optimize() { VectorValues ybar = conjugateGradients(*pc_, pc_->zero(), parameters_); - - boost::shared_ptr xbar = boost::make_shared() ; - *xbar = pc_->x(ybar); - return xbar; + return pc_->x(ybar); } boost::tuple diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index debb373f2..60104bbe0 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -44,7 +44,7 @@ public: SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); virtual ~SubgraphSolver() {} - virtual VectorValues::shared_ptr optimize () ; + virtual VectorValues optimize () ; protected: diff --git a/gtsam/linear/iterative-inl.h b/gtsam/linear/iterative-inl.h index 3c9cffc7b..8a052a66f 100644 --- a/gtsam/linear/iterative-inl.h +++ b/gtsam/linear/iterative-inl.h @@ -79,6 +79,7 @@ namespace gtsam { /* ************************************************************************* */ // take a step, return true if converged bool step(const S& Ab, V& x) { + if ((++k) >= ((int)parameters_.maxIterations())) return true; //----------------------------------> @@ -91,9 +92,12 @@ namespace gtsam { // check for convergence double new_gamma = dot(g, g); + if (parameters_.verbosity() != ConjugateGradientParameters::SILENT) std::cout << "iteration " << k << ": alpha = " << alpha - << ", dotg = " << new_gamma << std::endl; + << ", dotg = " << new_gamma + << std::endl; + if (new_gamma < threshold) return true; // calculate new search direction @@ -124,9 +128,10 @@ namespace gtsam { if (parameters.verbosity() != ConjugateGradientParameters::SILENT) std::cout << "CG: epsilon = " << parameters.epsilon() - << ", maxIterations = " << parameters.maxIterations() - << ", ||g0||^2 = " << state.gamma - << ", threshold = " << state.threshold << std::endl; + << ", maxIterations = " << parameters.maxIterations() + << ", ||g0||^2 = " << state.gamma + << ", threshold = " << state.threshold + << std::endl; if ( state.gamma < state.threshold ) { if (parameters.verbosity() != ConjugateGradientParameters::SILENT) diff --git a/gtsam/linear/iterative.h b/gtsam/linear/iterative.h index 4237f2632..5ffb366c2 100644 --- a/gtsam/linear/iterative.h +++ b/gtsam/linear/iterative.h @@ -36,8 +36,7 @@ namespace gtsam { * @param steepest flag, if true does steepest descent, not CG * */ template - V conjugateGradients(const S& Ab, V x, bool verbose, double epsilon, - size_t maxIterations, bool steepest = false); + V conjugateGradients(const S& Ab, V x, bool verbose, double epsilon, size_t maxIterations, bool steepest = false); /** * Helper class encapsulating the combined system |Ax-b_|^2 diff --git a/gtsam/nonlinear/GradientDescentOptimizer.h b/gtsam/nonlinear/GradientDescentOptimizer.h index 5caef0957..2407ee39f 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.h +++ b/gtsam/nonlinear/GradientDescentOptimizer.h @@ -108,7 +108,6 @@ public: cg_(cg) {} virtual ~ConjugateGradientOptimizer() {} - virtual Values optimize () ; }; @@ -223,8 +222,7 @@ V conjugateGradient(const S &system, const V &initial, const NonlinearOptimizerP // Maybe show output if(params.verbosity >= NonlinearOptimizerParams::ERROR) std::cout << "currentError: " << currentError << std::endl; } while( ++iteration < params.maxIterations && - !checkConvergence(params.relativeErrorTol, params.absoluteErrorTol, - params.errorTol, prevError, currentError, params.verbosity)); + !checkConvergence(params.relativeErrorTol, params.absoluteErrorTol, params.errorTol, prevError, currentError, params.verbosity)); // Printing if verbose if (params.verbosity >= NonlinearOptimizerParams::ERROR && iteration >= params.maxIterations) diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index ddebdb498..5847986be 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -80,11 +80,11 @@ void LevenbergMarquardtOptimizer::iterate() { if ( boost::dynamic_pointer_cast(params_.iterativeParams)) { SimpleSPCGSolver solver (dampedSystem, *boost::dynamic_pointer_cast(params_.iterativeParams)); - delta = *solver.optimize(); + delta = solver.optimize(); } else if ( boost::dynamic_pointer_cast(params_.iterativeParams) ) { SubgraphSolver solver (dampedSystem, *boost::dynamic_pointer_cast(params_.iterativeParams)); - delta = *solver.optimize(); + delta = solver.optimize(); } else { throw runtime_error("LMSolver: special cg parameter type is not handled in LM solver ..."); From 7832b586e6adeac2b5de7f1f59b8dfb9f8fb1905 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 15 Jun 2012 01:00:50 +0000 Subject: [PATCH 372/914] Small detail in constructors --- wrap/matlab.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/wrap/matlab.h b/wrap/matlab.h index 483326720..365e11f39 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -321,20 +321,21 @@ public: // Constructor for free-store allocated objects. // Creates shared pointer, will delete if is last one to hold pointer ObjectHandle(T* ptr) : - type(&typeid(T)), t(boost::shared_ptr (ptr)) { + type(&typeid(T)), t(ptr) { signature = this; } // Constructor for shared pointers // Creates shared pointer, will delete if is last one to hold pointer - ObjectHandle(boost::shared_ptr ptr) : - /*type(&typeid(T)),*/ t(ptr) { + ObjectHandle(boost::shared_ptr shared_ptr) : + /*type(&typeid(T)),*/ t(shared_ptr) { signature = this; } ~ObjectHandle() { // object is in shared_ptr, will be automatically deleted signature = 0; // destroy signature + // std::cout << "ObjectHandle destructor" << std::endl; } // Get the actual object contained by handle From 9d3bb30bc2e279423df7211458505284c2e50c30 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 15 Jun 2012 01:01:25 +0000 Subject: [PATCH 373/914] Dummy object for Andrew to play with --- gtsam_unstable/base/Dummy.h | 40 +++++++++++++++++++++++++++++++++ gtsam_unstable/gtsam_unstable.h | 6 +++++ 2 files changed, 46 insertions(+) create mode 100644 gtsam_unstable/base/Dummy.h diff --git a/gtsam_unstable/base/Dummy.h b/gtsam_unstable/base/Dummy.h new file mode 100644 index 000000000..6189662dc --- /dev/null +++ b/gtsam_unstable/base/Dummy.h @@ -0,0 +1,40 @@ +/* ---------------------------------------------------------------------------- + + * 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 Dummy.h + * @brief Dummy class for testing MATLAB memory allocation + * @author Andrew Melim + * @author Frank Dellaert + * @date June 14, 2012 + */ + +namespace gtsam { + + static size_t gDummyCount; + + struct Dummy { + size_t id; + Dummy():id(++gDummyCount) { + std::cout << "Dummy constructor " << id << std::endl; + } + ~Dummy() { + std::cout << "Dummy destructor " << id << std::endl; + gDummyCount--; + } + void print(const std::string& s="") const { + std::cout << s << "Dummy " << id << std::endl; + } + + }; + +} // namespace gtsam + diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index 91377da8c..fda6ff8c4 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -10,6 +10,12 @@ class gtsam::SharedNoiseModel; namespace gtsam { +#include +class Dummy { + Dummy(); + void print(string s) const; +}; + #include class PoseRTV { PoseRTV(); From 06ed5370910adb8abd2fd7912104dd713ba48653 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 15 Jun 2012 01:01:39 +0000 Subject: [PATCH 374/914] Made display better --- matlab/examples/StereoVOExample.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index 661b9aee8..4553a1f0d 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -61,6 +61,10 @@ toc %% visualize initial trajectory, final trajectory, and final points cla; hold on; +axis normal +axis([-1 6 -2 2 -1.5 1.5]); +axis equal +view(-38,12) % initial trajectory in red (rotated so Z is up) plot3(initialEstimate.zs(),-initialEstimate.xs(),-initialEstimate.ys(), '-*r','LineWidth',2); @@ -71,8 +75,5 @@ xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); % optimized 3D points (rotated so Z is up) points = result.points(); -plot3(points(:,3),-points(:,1),-points(:,2),'.'); +plot3(points(:,3),-points(:,1),-points(:,2),'*'); -axis([-4 4 -4 4 -4 4]); -axis equal -view(3) From 82482e61fc87b16fba1455428477eccd5d6950c7 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 15 Jun 2012 03:52:50 +0000 Subject: [PATCH 375/914] Make unique IDs --- gtsam_unstable/base/Dummy.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam_unstable/base/Dummy.h b/gtsam_unstable/base/Dummy.h index 6189662dc..ccf23af5d 100644 --- a/gtsam_unstable/base/Dummy.h +++ b/gtsam_unstable/base/Dummy.h @@ -28,7 +28,6 @@ namespace gtsam { } ~Dummy() { std::cout << "Dummy destructor " << id << std::endl; - gDummyCount--; } void print(const std::string& s="") const { std::cout << s << "Dummy " << id << std::endl; From 22017065e45b4b98d1ffb6c98dda9247fbf82f23 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Fri, 15 Jun 2012 21:49:01 +0000 Subject: [PATCH 376/914] take out the blas kernel parameter --- gtsam/linear/ConjugateGradientSolver.h | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/gtsam/linear/ConjugateGradientSolver.h b/gtsam/linear/ConjugateGradientSolver.h index 3a42b8842..cf1d31d85 100644 --- a/gtsam/linear/ConjugateGradientSolver.h +++ b/gtsam/linear/ConjugateGradientSolver.h @@ -32,24 +32,14 @@ public: double epsilon_rel_; ///< threshold for relative error decrease double epsilon_abs_; ///< threshold for absolute error decrease - /* Matrix Operation Kernel */ - enum BLASKernel { - GTSAM = 0, ///< Jacobian Factor Graph of GTSAM - SBM, ///< Sparse Block Matrix - SBM_MT ///< Sparse Block Matrix Multithreaded - } blas_kernel_; - ConjugateGradientParameters() - : minIterations_(1), maxIterations_(500), reset_(501), epsilon_rel_(1e-3), epsilon_abs_(1e-3), blas_kernel_(GTSAM) {} + : minIterations_(1), maxIterations_(500), reset_(501), epsilon_rel_(1e-3), epsilon_abs_(1e-3){} - ConjugateGradientParameters(size_t minIterations, size_t maxIterations, size_t reset, - double epsilon_rel, double epsilon_abs, BLASKernel blas = GTSAM) - : minIterations_(minIterations), maxIterations_(maxIterations), reset_(reset), - epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs), blas_kernel_(blas) {} + ConjugateGradientParameters(size_t minIterations, size_t maxIterations, size_t reset, double epsilon_rel, double epsilon_abs) + : minIterations_(minIterations), maxIterations_(maxIterations), reset_(reset), epsilon_rel_(epsilon_rel), epsilon_abs_(epsilon_abs){} ConjugateGradientParameters(const ConjugateGradientParameters &p) - : Base(p), minIterations_(p.minIterations_), maxIterations_(p.maxIterations_), reset_(p.reset_), - epsilon_rel_(p.epsilon_rel_), epsilon_abs_(p.epsilon_abs_), blas_kernel_(p.blas_kernel_) {} + : Base(p), minIterations_(p.minIterations_), maxIterations_(p.maxIterations_), reset_(p.reset_), epsilon_rel_(p.epsilon_rel_), epsilon_abs_(p.epsilon_abs_) {} /* general interface */ inline size_t minIterations() const { return minIterations_; } @@ -58,14 +48,11 @@ public: inline double epsilon() const { return epsilon_rel_; } inline double epsilon_rel() const { return epsilon_rel_; } inline double epsilon_abs() const { return epsilon_abs_; } - inline BLASKernel blas_kernel() const { return blas_kernel_; } void print() const { - const std::string blasStr[3] = {"gtsam", "sbm", "sbm-mt"}; Base::print(); std::cout << "ConjugateGradientParameters: " - << "blas = " << blasStr[blas_kernel_] - << ", minIter = " << minIterations_ + << "minIter = " << minIterations_ << ", maxIter = " << maxIterations_ << ", resetIter = " << reset_ << ", eps_rel = " << epsilon_rel_ From 1e190f7c902b3b37c771e87505f11f7ca75b7c5d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 16 Jun 2012 00:05:30 +0000 Subject: [PATCH 377/914] Moved CHECK and EQUALITY to top of gtsam --- matlab/{tests => }/CHECK.m | 0 matlab/{tests => }/EQUALITY.m | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename matlab/{tests => }/CHECK.m (100%) rename matlab/{tests => }/EQUALITY.m (100%) diff --git a/matlab/tests/CHECK.m b/matlab/CHECK.m similarity index 100% rename from matlab/tests/CHECK.m rename to matlab/CHECK.m diff --git a/matlab/tests/EQUALITY.m b/matlab/EQUALITY.m similarity index 100% rename from matlab/tests/EQUALITY.m rename to matlab/EQUALITY.m From f15d242a78c1deb7cac44f67f6aafbfb13335c63 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 16 Jun 2012 03:23:38 +0000 Subject: [PATCH 378/914] There was no unit test for DLT. Guess what, it never survived the switch to Eigen. Fixed now. --- gtsam/base/Matrix.cpp | 28 +++++---------- gtsam/base/tests/testMatrix.cpp | 63 ++++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index 2d32ccc04..e96d5a329 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -671,31 +671,21 @@ void svd(const Matrix& A, Matrix& U, Vector& S, Matrix& V) { boost::tuple DLT(const Matrix& A, double rank_tol) { // Check size of A - int m = A.rows(), n = A.cols(); - if (m < n) throw invalid_argument( - "DLT: m svd(A, Eigen::ComputeFullV); + Vector s = svd.singularValues(); + Matrix V = svd.matrixV(); // Find rank int rank = 0; - for (int j = 0; j < n; j++) - if (S(j) > rank_tol) rank++; - // Find minimum singular value and corresponding column index - int min_j = n - 1; - double min_S = S(min_j); - for (int j = 0; j < n - 1; j++) - if (S(j) < min_S) { - min_j = j; - min_S = S(j); - } + for (int j = 0; j < m; j++) + if (s(j) > rank_tol) rank++; - // Return rank, minimum singular value, and corresponding column of V - return boost::tuple(rank, min_S, Vector(column(V, min_j))); + // Return rank, error, and corresponding column of V + double error = m

-+`rH$(AHhD>C`ZFg+v7Dj#ZGIieBIl<0GdspU- z?~AQ9BszV@>+5%)Y!{Z286j83e6?eO4tkT44?$kH;2T{(!*f~RSiS6*3a5OL&9xUJ z_?3^%*S&Vp$JfK!b>!ccpYRTy;|G*3QN7srQ1ZpASMDW$;k)buj5NM zjdWWpi6J_Wxs<-`k;H!v59`f*XRCON#CO_6Po`a)>xP_ddyBS2i9fxx3_dx^`wUgr zk|k*T&2g^gk-ySpokEET9EDZK0O#|r41W?=O*%eeL9{y(`_%9 zTEpg{b}}(=02u9zkN*H&B>w;rMai!_M(tJGHm)p`C zXk8#!$Q!1S$N^X1pHIf7(|m1fr(9|4f1&DA%W-aI6K)M1xd4)`%ExaYDGUG^>t8vD z;tcAfd81S0lKofeDwwKpdmlo{@gnC_zk6#PD)@bw4&+#HFnjJQG6hLz;z?t%pHtN! zlHO@C9G1^?vyyoV`%^rUc^I!D)4X}6>UTo++fdV^j6@8kE4Ch6w>ue|3f(vW6ZlqD z--<4D`>Fh`FYPK9a@<5DcXub{R0F9w{_yqs;fCT|?ll^6`_jM5Z`9{_u5C|E)%;1S z4O4t>mh!P^;_~hBfY`_YV{UK;PaJ*~^FNOMF1LsLRGL&U>Ke7|@jO9V*&A$x;18Ri zUZ4(5TZ_l5bFINPt6RPCk`f~&W6td0j4{SWbJI4iEp&}kh%RsET`-rD z;=*ec47eeN&H)6n=Naqkj8|?I)Kcfg^H1jg088j|M!z!`!}|N(=&L>KHxZ;#7^j+5 zXt3b@)&vctbo$n*cb%k~D3&qiVOlAJ?;VauAp3Q%J)S*E!^F~EN#iT4%L}|qrL1EY&gR+WSt7EP_U38fA1aZIji=Wj=e`YTDm7*AQ-7c9W6-6D zzLG~rs%m%k8g0$hit8G@;Z>xyj&fv?bBr$IjDgNG&1c=}f9SU9J=hOA7Po?A`N

(rank, error, Vector(column(V, p-1))); } /* ************************************************************************* */ diff --git a/gtsam/base/tests/testMatrix.cpp b/gtsam/base/tests/testMatrix.cpp index ad6742613..abd71bacc 100644 --- a/gtsam/base/tests/testMatrix.cpp +++ b/gtsam/base/tests/testMatrix.cpp @@ -1052,32 +1052,55 @@ TEST( matrix, svd3 ) /* ************************************************************************* */ TEST( matrix, svd4 ) { - Matrix U, V; - Vector s; + Matrix U, V; + Vector s; - Matrix A = Matrix_(3,2, - 0.8147, 0.9134, - 0.9058, 0.6324, - 0.1270, 0.0975); + Matrix A = Matrix_(3,2, + 0.8147, 0.9134, + 0.9058, 0.6324, + 0.1270, 0.0975); - Matrix expectedU = Matrix_(3,2, - 0.7397, 0.6724, - 0.6659, -0.7370, - 0.0970, -0.0689); + Matrix expectedU = Matrix_(3,2, + 0.7397, 0.6724, + 0.6659, -0.7370, + 0.0970, -0.0689); - Vector expected_s = Vector_(2, 1.6455, 0.1910); + Vector expected_s = Vector_(2, 1.6455, 0.1910); - Matrix expectedV = Matrix_(2,2, - 0.7403, -0.6723, - 0.6723, 0.7403); + Matrix expectedV = Matrix_(2,2, + 0.7403, -0.6723, + 0.6723, 0.7403); - svd(A, U, s, V); - Matrix reconstructed = U * diag(s) * trans(V); + svd(A, U, s, V); + Matrix reconstructed = U * diag(s) * trans(V); - EXPECT(assert_equal(A, reconstructed, 1e-4)); - EXPECT(assert_equal(expectedU,U, 1e-3)); - EXPECT(assert_equal(expected_s,s, 1e-4)); - EXPECT(assert_equal(expectedV,V, 1e-4)); + EXPECT(assert_equal(A, reconstructed, 1e-4)); + EXPECT(assert_equal(expectedU,U, 1e-3)); + EXPECT(assert_equal(expected_s,s, 1e-4)); + EXPECT(assert_equal(expectedV,V, 1e-4)); +} + +/* ************************************************************************* */ +TEST( matrix, DLT ) +{ + Matrix A = Matrix_(8,9, + 0.21, -0.42, -10.71, 0.18, -0.36, -9.18, -0.61, 1.22, 31.11, + 0.44, -0.66, -15.84, 0.34, -0.51, -12.24, -1.64, 2.46, 59.04, + 0.69, -8.28, -12.19, -0.48, 5.76, 8.48, -1.89, 22.68, 33.39, + 0.96, -8.4, -17.76, -0.6, 5.25, 11.1, -3.36, 29.4, 62.16, + 1.25, 0.3, 2.75, -3.5, -0.84, -7.7, 16.25, 3.9, 35.75, + 1.56, 0.42, 4.56, -3.38, -0.91, -9.88, 22.36, 6.02, 65.36, + 1.89, 2.24, 3.99, 3.24, 3.84, 6.84, 18.09, 21.44, 38.19, + 2.24, 2.48, 6.24, 3.08, 3.41, 8.58, 24.64, 27.28, 68.64 + ); + int rank; + double error; + Vector actual; + boost::tie(rank,error,actual) = DLT(A); + Vector expected = Vector_(9, -0.0, 0.2357, 0.4714, -0.2357, 0.0, - 0.4714,-0.4714, 0.4714, 0.0); + EXPECT_LONGS_EQUAL(8,rank); + EXPECT_DOUBLES_EQUAL(0,error,1e-8); + EXPECT(assert_equal(expected, actual, 1e-4)); } /* ************************************************************************* */ From 8cf867bdbd82bce00f7dab8493b728d7e9af8e64 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 16 Jun 2012 03:59:12 +0000 Subject: [PATCH 379/914] Better EQUALITY --- matlab/EQUALITY.m | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/matlab/EQUALITY.m b/matlab/EQUALITY.m index 4f310175d..114867ac0 100644 --- a/matlab/EQUALITY.m +++ b/matlab/EQUALITY.m @@ -1,12 +1,14 @@ -function EQUALITY(name,A,B,tol) +function EQUALITY(name,expected,actual,tol) % test equality of two vectors/matrices up to tolerance if nargin<4,tol=1e-9;end -assertion = size(A)==size(B); +assertion = size(expected)==size(actual); if assertion - assertion = all(abs(A-B) Date: Sun, 17 Jun 2012 15:14:22 +0000 Subject: [PATCH 380/914] Added matrix and calibration --- gtsam/geometry/Cal3_S2Stereo.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gtsam/geometry/Cal3_S2Stereo.h b/gtsam/geometry/Cal3_S2Stereo.h index f32b2a922..3a945e8cd 100644 --- a/gtsam/geometry/Cal3_S2Stereo.h +++ b/gtsam/geometry/Cal3_S2Stereo.h @@ -68,6 +68,12 @@ namespace gtsam { /// @name Standard Interface /// @{ + /// return calibration, same for left and right + const Cal3_S2& calibration() const { return K_;} + + /// return calibration matrix K, same for left and right + Matrix matrix() const { return K_.matrix();} + /// focal length x inline double fx() const { return K_.fx();} @@ -84,9 +90,7 @@ namespace gtsam { inline double py() const { return K_.py();} /// return the principal point - Point2 principalPoint() const { - return K_.principalPoint(); - } + Point2 principalPoint() const { return K_.principalPoint();} /// return baseline inline double baseline() const { return b_; } From 1edcc8a53b0889eb4d399a7395ab13914cafb7a6 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Mon, 18 Jun 2012 04:31:11 +0000 Subject: [PATCH 381/914] adapt old implementations to the latest function templates reorg partial elimination + pcg solvers a new unit test for pcg solvers use python.psutil to inspect peak memory usage --- gtsam/linear/IterativeSolver.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 6030f7be6..8292b3831 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -11,6 +11,7 @@ #pragma once +#include #include namespace gtsam { @@ -50,8 +51,12 @@ namespace gtsam { class IterativeSolver { public: + typedef boost::shared_ptr shared_ptr; IterativeSolver(){} virtual ~IterativeSolver() {} + + /* update interface to the nonlinear optimizer */ + virtual void replaceFactors(const GaussianFactorGraph::shared_ptr &factorGraph, const double lambda) {} virtual VectorValues optimize () = 0; }; From fdb94319bdabc9b00a911d25d0a792fe7331bea6 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 18 Jun 2012 14:03:43 +0000 Subject: [PATCH 382/914] comments --- gtsam/geometry/Rot3.h | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/gtsam/geometry/Rot3.h b/gtsam/geometry/Rot3.h index c0fbfc999..e3aaa6d32 100644 --- a/gtsam/geometry/Rot3.h +++ b/gtsam/geometry/Rot3.h @@ -104,10 +104,10 @@ namespace gtsam { /// Rotation around X axis as in http://en.wikipedia.org/wiki/Rotation_matrix, counterclockwise when looking from unchanging axis. static Rot3 Rx(double t); - /// Rotation around X axis as in http://en.wikipedia.org/wiki/Rotation_matrix, counterclockwise when looking from unchanging axis. + /// Rotation around Y axis as in http://en.wikipedia.org/wiki/Rotation_matrix, counterclockwise when looking from unchanging axis. static Rot3 Ry(double t); - /// Rotation around X axis as in http://en.wikipedia.org/wiki/Rotation_matrix, counterclockwise when looking from unchanging axis. + /// Rotation around Z axis as in http://en.wikipedia.org/wiki/Rotation_matrix, counterclockwise when looking from unchanging axis. static Rot3 Rz(double t); /// Rotations around Z, Y, then X axes as in http://en.wikipedia.org/wiki/Rotation_matrix, counterclockwise when looking from unchanging axis. @@ -119,31 +119,17 @@ namespace gtsam { return RzRyRx(xyz(0), xyz(1), xyz(2)); } - /** - * Positive yaw is to right (as in aircraft heading). - * Tait-Bryan system from Spatial Reference Model (SRM) (x,y,z) = (roll,pitch,yaw) - * as described in http://www.sedris.org/wg8home/Documents/WG80462.pdf. - * Assumes vehicle coordinate frame X forward, Y right, Z down. - */ + /// Positive yaw is to right (as in aircraft heading). See ypr static Rot3 yaw (double t) { return Rz(t); } - /** - * Positive pitch is up (increasing aircraft altitude). - * Tait-Bryan system from Spatial Reference Model (SRM) (x,y,z) = (roll,pitch,yaw) - * as described in http://www.sedris.org/wg8home/Documents/WG80462.pdf. - * Assumes vehicle coordinate frame X forward, Y right, Z down. - */ + /// Positive pitch is up (increasing aircraft altitude).See ypr static Rot3 pitch(double t) { return Ry(t); } - /** - * Positive roll is to right (increasing yaw in aircraft). - * Tait-Bryan system from Spatial Reference Model (SRM) (x,y,z) = (roll,pitch,yaw) - * as described in http://www.sedris.org/wg8home/Documents/WG80462.pdf. - * Assumes vehicle coordinate frame X forward, Y right, Z down. - */ + //// Positive roll is to right (increasing yaw in aircraft). static Rot3 roll (double t) { return Rx(t); } - /** Returns rotation nRb from body to nav frame. + /** + * Returns rotation nRb from body to nav frame. * Positive yaw is to right (as in aircraft heading). * Positive pitch is up (increasing aircraft altitude). * Positive roll is to right (increasing yaw in aircraft). From c77e8176c749176871e3c663c828c9761d4bffd1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 18 Jun 2012 14:04:20 +0000 Subject: [PATCH 383/914] Balbianello images for larger SFM example --- .../Data/Balbianello/BalbianelloMedium-1.jpg | Bin 0 -> 102899 bytes .../Data/Balbianello/BalbianelloMedium-2.jpg | Bin 0 -> 93154 bytes .../Data/Balbianello/BalbianelloMedium-3.jpg | Bin 0 -> 102182 bytes .../Data/Balbianello/BalbianelloMedium-4.jpg | Bin 0 -> 96414 bytes .../Data/Balbianello/BalbianelloMedium-5.jpg | Bin 0 -> 85882 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/Data/Balbianello/BalbianelloMedium-1.jpg create mode 100644 examples/Data/Balbianello/BalbianelloMedium-2.jpg create mode 100644 examples/Data/Balbianello/BalbianelloMedium-3.jpg create mode 100644 examples/Data/Balbianello/BalbianelloMedium-4.jpg create mode 100644 examples/Data/Balbianello/BalbianelloMedium-5.jpg diff --git a/examples/Data/Balbianello/BalbianelloMedium-1.jpg b/examples/Data/Balbianello/BalbianelloMedium-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e75c8725c3ac976eca50a3ccd3011fb3832e9e9 GIT binary patch literal 102899 zcmeFYbyQrga@k3jhv|?yeegk0H8x`Vf?U00BS)kO6K0Ftc!TR@Ri& z0^mhKMjGMkVpZy`JjXIFOs0I9*bc`dEnEa3Px96$GR zcfO||z%ik@{XIrNyvMF^1>u%39_i%v1@i`n5I#`*x0RSTAJ>A{P!WNFX;26_YOG6rt#Q*>m z)8=2W`M+RyD{r`-03hw;?Bfcxv2}+$v|xsC3kwTDf`oj_|3p;kyj#XaiqvM@y(X)X5P7b^NbZ_@m>v>+B9uAcW8{!H9okN|W52OtE<0BV39cnGiqJb)k|3OoX207XC*&;s-T zW55Ei1sniZzzgsPUI1@_P#_A31CoF=APdL`N`UV`6;Kbf0G&WDFbIqRGr%IS25bWd zz$tJAKgdu(SReur8Hfh-0K^L70SSR5Kr*1GAPtZn$P{D)as+vR{6Vikp`aL05-1&% z5BdhG0kwd-K|`P^&=P19bO^dc03%=`5F$_^Fd}dw2q8!zC?RMe7$MjoxFGlLgqVj|iP(-fg1CfufOw09g+z(O ziX?)hfTW9LgXD$u7AYPn2dM(718EFt4e1ma8JQTF30V+X9$63B4%rVm3^@h46uB9B z2zdqh1O)|!422a%97Pqy48*a zM$}={4b&?%T(k#hB50~;mS{d`k!V?HwP*uqYiL*Kc<4;%;^Iv4nAfiI2&GDUE4}>46!6nTy$sIfZ$Ig@wh4^$1HJ z%N;8MD<7*3YaZ(yn*f^wTLIe=I|%zTb|v;O_8txz&I24N9Ag|`oOqlvoB^C2Tr^xp zTxnc0+(6vVxHY&FxF>i7c-(lZcn)}Bcm;Ufc)##b@EP%C@GbFQ<7eWx;ja*Y3Frx= z2`mU+5o8f`5Udd*6EYDh5ZV!j5*8Eo6CM!Z6Y&vg6L}MTCTbvBBnA^R5-SitCypfk zPCQP0NkT;;MPfzrfuw|FnBV0p4NjlowlF$ijIly8Qn{|Qo1>M zbb29rYx>h}oVwg?W$#frX#NmgO_c04oBk04tO=g>{GxiA|Wzku8I5 zf*q4xirtgFkbQ}RnBytOOO7gzJx&Hrea>jkF3wvney-E4|!O4 zEOd$TrYefA|T=}@?B(KlwH(bv_SNi7?YTlSeDp|IGwnec)Iwa1VqAA z;)}$hB(0>GWQOGOBl<^{k8&PuNHI&fOPW{@DsTwAy4{c z@MWIKB+1On(#hJ$7RnyT@yq$iHOnK(E6GR8Pbg3+SSaKx94HDZ1}L^GVJc}VB`GaG zWqIoQv{o5GSy4Gwc~<3tila)EDxj*M8ml^|#-!$=R;P}vuBQH3eO-fF!(XFIlR(o% zvq1Ay>#)g#w~>Q(Eb=xgie=${zK z7{nQ@8S)#xH5@l$GV(U+HYPWIZroskV`64fW{PC0V_IN(ZKi6LVRmA!V4iG#U?FXh zV6koa$nvA*rj@u=jMav*?x$A7JjY%wEi#rmja{$(gQ((=7Ft2 z^g*wK)`I1N^Io98uz%6_lIvy6%i~u%uWDaYy$*i8@<#4W;alvtu5TyaiM~sFkN6(? zzW)R7hr|!JA(kOMpzKQkr;*p5 zFPNWSKv@u3h*0QJxLIUaG+6wkxVnVBB)yclH1sR*)#K~dH`8z9-<7_%mI;-Wls_m> zt{|ugsRUK}R322>RxMWRRS(rD*0k1&)>hPU)aBOG)_-mwYKUw^Z+zW&*W}xD((K&4 z(_+)I(rVH=)27=t+OFQ--=Wm;qf@rCtxKw_>4*4_`fic#njWE^s$PNK%Afo{EBg5R zD*6TbD+dGzst1J!Ylp;!8iyr^TSlIYbdD;F_KvBH4UIn=pPVq9Se&$+{5AD_3O4OI zeKiw2i!>WDhdUQPPdT5lz`RhpD6rVD^knJhvgY#4ip9$Is@v-I+Us?!_4o~%jr?Cc zzv?$-HwU*2w$`?tx36~I?&9qx?>*cr-+#3K^Fa4t4dx2FI}AG_JIX!gJ8nHuJDERq zIK4UxIVU^MyAZnQy41PcxbnJ2x&Cy+d{cX?bUS1ce)bp;JVN@d1%gHl!k_W=V-Ww)&0~=M(CuPS{+&nKLIh2Nx$G<}Kpw;Ot=KZU*soc<$&X;w?`1n@t3c@5!8Wkl!rs z_TqH9%4+aT!PN@F$HB+JMJIs{fk4DuEv-c~p2+?!4sVIm{Yy^e#mnL3YQqW7F@-s~ zcsO}@*x?-PZa$9gX5Q?MZuEZ*@{e(zz!Pj&sPpecie@^*Z z?x~fdo5b&D7$PIft_k55V&~^~aDZ5I@^bLA^K%G56g2-DdAlg>0ZudDEe5E*q{}TO2-+vN*ZsultpR~jEG`sho1Q#dw-y;91 z>+gxhIPZP@FFyZkL4Q->D=L95#`$M=NT36EGk`RJa9=>buLuZWFft+-UQm#b5Rp+) zP*LwI8afsR8X6`#Dk=sJ1|}9Zyr5y=;^AQ9-Q)W~?#1C!$cTu@*l4I|_Z1+EhYoS_1K%!9yS1Vk`g zUqpCs0K6YS#6!ZT<(5JwP&Y%Nb0Oq;5uJ`o|M*)Ak;c#g1FyO3OEh$15>hhq2aHS) znOXSw1q6kJMWmm|$jZqpC~9gw)7F8fs}`14);6|KJ2!U^PcLsD-&e2SynXlnLr6^Q z$GG@}Pl-txnOWI6xq0~o-^@OioQNEw8Mut#AC= z+=3k*9iN<@onKtu+XX*6{xa*2W&go0Jh)v5h=^cBlzY2C2wwMw;~^r^awFqQsiT;= z5YX|wKqY(}o&K!_jhk)10I#M@sz%;51coA&?*ow=%-IF=7PnF++N zO*7|hvavEaewS@y>2XCpLC&+&uT0C*!w8q%WY1uD!+@_Ftk4X^HZz8bPI45x$%bU- z+6jnMMq}NkxKYg|*Bq{?gui-q8B$YC48fJ(;+0kw{xoBk!Qr0lz${oNbZYBu=*SiwGm0nzmGcY|)0SrOWqv z`TQF!vNIuwa)14H#NOy}s|h1>QPiXHI@M}DL*cqq5HHTTQ& zF9$+kZ`QLd*t{-3j>OXcAYV7X!Z0lZRCwfz8w+KV&gQ1NHK~VdwNJ#&ox%eJ>(28F zbnQ&={PmOg5{hEGZJc`;!W6onY4|rH%g$c9^Y@+icAcWA3|$K@T{sn&i}Q))m8rh1 zsSauqUZk1?`7q_e-+@(5&?>n`=f)CnKln;D3+twNqd97=EGw+eP}NJT?nVplVX&kr z@$<+l4$s^9=%W*u8>e09yOVfo)7mtB7zDl+4#M2>HJqp8R!EW1sdbvA-3ses0>?;H zmyj$6?dmK$Q7`Duv^}4u)DFHdnd&ic6OfAi+3zfiJi8KdA+^Iev~%0V-V(jG(ibD3 z_dl6k<)3>dHS-b58KN4aOc*%=O+a#-0()T za@Oc;h|STZ#X1enq%=~;O>@KOo`#;{PDL2%U_^nc@V-9JtllF=B@DeCc{PR)yGjE4 z`y^de#ZVm{6{w8S8HOxNuf;L_)0?mRkek%q<30tB&t1_aZFw@}7x)ms$ze*gUsY-p z{iGBK9KQpwIgUlC1ly-OvmFY)Th7nwr?FU!FgeY3?}qtJtS)cq$7O#KRG*e-Q0|v+ z15Gyi5V1`sk0>K@70PB1Ke35IeB^fKhc~dTro^qZE~XcBL8C>^4yuca9@xZHSzhIf^$`!ROs`J+i^MV z3Z9Z<(}wpbh;CszBaNV&f_jG~nh)9}jpDb1V|<&LP&&Om?8!{Ga9BYyuD}Y`{(Qps z*K1a}X{z+P>qNASStXH^b}JQ4?4Fpz0&E_ z?Ud(WEr0n?+%y5yVdm5KumgcpD%TXWkr+*r5K%kxk(@QWR@1+*nZkBBQPl^4hFXj@mh?XvXkYvEqQgPH4y zw;>OU`kVjl2WonCO;trDw8SQ4o_1{2IrF4M@vJMAsv`Wgj`iuYTU4FPWc2w6;tHER znKJU~5cgYV22Z_$goIO1;!gYCPY#1#p4-P%+nxNXAN0e1cAG~{wp}y$?*&n(W&7-& z*7$h156>F*vK5bIF{F(*zCvpw+OT`J!p60V4WRz0cK?4v&>N&Q1~4$dfw& z6-u|eyYFrlHva`d08eo+jL$O03qc4%?JUDjWIx+CZWK9!&U)0Pc%BbS>ktu-$XqnR zTky`gQsL&Gc=zs|a@AhKTJ#sIttQ+ zH|p(s>&~8;x1z2XzNW<2ML_@EZ!5!$(_oTarO?7H>HH=v-SvMawRKjWY46~D7MjgEAZem}W`E^p@_^E~xQOM#TfNCAmHS16 ztE%JJrX1nwNaMx_5&o}7A8jc3e60rFiJ7Edi;jpX_*gxNNGPauFt(aGd~t1}hDN$; z><~~m)xBH;Nu~ARj9w?bF8$w=3EawWh}(Bn)lY6%<@9;|%ib)zjO8^F+Zx(^ zaNp%`|7j*e@$`E?9n`#u0_Iiz*0n40ZQ-(kZjNvaC8{ zk=Bed`h$v`Fl5zn<)k2C92(@nSJq)+j~P@SZEO_gYsuA2>5G6Olow~G@Nh<2Mw>%G zezq3o5fzRoc&N(e!c={(Is&x|Q|zw{x`J#{h9RHwU&uY;4ukchWD_45 zn#{71e4UeaU0{7W1S9R5Z`mMQ;p;6V<6EV5(o+{``g9mafO&%GzMi7E+s)Yjp+z~% z#>jAUf@G*NQ+$UGuX3ynxy#jOvmePrhkQ3Oth~^>bluXPR4i1%T#Dpl@WCelyJkDa z)u+Vn@JRVXTe-FUc3$&rmu+M&i%ZzC@L55O9WRvl>$DP~Z;S|XKwla!Q>LkDfL%dN zwVps7&XnRMZ{sR#azYTdjp1@2{7q&vRdGM$ob+%fJd|v2{kx+yFZ8@O@aaNH>f(hPrubL zz;H$hw`R_awv#m46yK@sjp0G*?$pvysd!|BdsfApm*qP81{ZZaptgMRvVIZwjsUAA zr*KJ3F^i?OF+LO0UwyXi;S)L-j;`F*Ws0P(5lxsJC!et-0z|G<6HQ0yA)o47Yc5C+ zdL8%qD$+M2gq6PjVaB%;NnG0`o(-+hUACF4h&w>==1};CB^~WP6-!j%)`|Ttz>J2T z{V5peW~%VEu7RbF3$MMCDkJ!U7*MdWhImTryRsc}=-{+0`GMa+fwpdRjkuo+){H1G z*C=x9aV(@l(y3h*vu5mf(-rxCzZ2pM2S&WWhoy+I&yWs68TVd+(@ORG1D?fwcAov>>}5GI zX?kvhB<0tecowww?Z~_6is0E*X`D|`;+9S$d+OmYCH}R!(V{@Flrxtd5uDaa^f<@c`R( z1Re_0H8V%Wd-mDP_?X2AwIH1F>Y%FHc_#${F0nhHY*+6r0snK%ho~9ZwMUPfG-FlN z!?L2{4Cuc*5iqdqu+v!&^cZe{=WF^@4N~_s_6is@hXQ}mtmsKqF8=h|mGpiUecYiQ z@6KaIf>j3sezBO5GSAT}7Ohbj-l)Tu3#NJU=-)`IO)`7}cy7K9;0t=3{b0>YFzXzg$TUj=9SmZQuU9!iI-`V$;QSJ_(F&%skQb z*sDhuIu=Xe=JN`)k$tE(NRPQ&evn=J4tvg41R7AC5UNXoWUN#RrBTAz_^jV<=GIol zTSc2Q^5cC(ar0zyZr;}~2h?Q<0d;v);T9Ca`-U?OzQHn`KYvZ^Qj&L|2`-0fTtQ}> zdl#K}QFV}V7a{USUlYlWPKUARm}SGn2@NV^VgSaJQOsMUM34*{4;rQ}Y&%%0$OO-u zb0whZrN^%6`DL47l`g&?S-nh-{zaqbo<2~}gNuN^q;^{RNlbagDV)SNIhAaD=UNb< zzkdQxHN8G^U3N>}f~|cIscaxy%>w3nJ49OzGunFc9-rZzY6ZdrFu-hS4qQ%9bcsNV zZ|{IZab2t90=*vX3zHMMV(-G%I{+(?Zgb?krNGJFBLqqw(H_*w(i?3)`?I-+4MM0pQ9GBBj zR_Lr-;>wZgt%S1Ej6e2>dFPD1{MVqD)BLxOtG8B?V>OBvW}8@3+_PV2KX_<1Y~Qf3 z?$x_o`i@*80eTuqa;`uo9N}KCgHj`e^nT-OftMty1jS>^6#mnC;Z?m&9sGTX0&QNs zD1Z90NU;AG(4c^1oPEbZ*;6eO9szSdUIN3^2`qbI$%Z>1dh*EbtoEe|=Q$&08re0G zgKL6kCAHA#dh}yF>W`b>WL?_dAeq^xQ6Q&h&gw(wQD6j#vcqTi2JNW*ZjqwGr7G{1 za>A)4hv=AYX2T;Lc>M|=(ik#4bvvIRDe-PH8il0pnY?Mj#^@k3d(iG?CIc}%%!JRoO|Porb|9RMzPw3bUG&!@h`|6^3z?)p&#v=A zJE>P+V8%JUY*pR4Q8pTV*u|v=@`bnLLz>}6<@1VznJaKtt}zKMrq)kl3SfR?)|Ej4$+{C_(_Pj zFgTg=P`t1P78IPYRMj!V8tV6{WGPlL zN%C!=*s#BzRo>ir%(@ig$FG$ZVZ^3@nl4WXQ36VuO5E{j*|Ov-3C@Y}4ZU;aWf}tU z;&M-0OAE(zf|M+u56uH)R6?bSl^opA;@VU~o)22P^a>*u zYlP-eRbAXlrfl0uyh&woET2Rbg=bVrumOa>KUz!D&TKVCT23 z>71xj&B?7ku|`YRqOHgZK|(8ZhB|90vP#6T^bY!gYIO_{vF;os}>4ZakukToop&k zA$R%p@-bsQ#i&!BlI8wM+PF@+rw60vKC2%szCNoP+|OuIVwYgO>g{^lJ&K5oNo;tm z#+@o2Nz~t-L^U4k$C&Nm>QJ)EJ@a6mf!&(~S=hn4+D6 z2yOjb@PShYFI4LgXH2AR30oLbB5QvHeU7#{x z^Ejg-uF&&KRctQLIk~Na=*e=e26) zGk_O1`=F^T|+Q z_>f&yS#PUGL~p%DiWPPYx#i!uw0VDA?awk~6goNAW|jU7J~zTTV(*M2+K-qBD?%)2{h;nn-jHk4F@N>! zIpY~<(i4r|BBV*{=_ja#5pKI(^t0MO=f&&FzdlP^-cZ*9@8X5Jvn0D-Be?9yxIOk5 zD=FPhXQ|)ZWxBYv*(J`udOYP_riyn?qgF;9(9B5jF;)=!%VKg6ie$J?-`sJPm*(uO z(T@oZFJ9$3H-g#JoF*PVoDZpNLt;|7TY=<_e)85I;^k%XCb>t6x`ZhYMRg_`QO;w% zmhS*edb^TS-yY6BoOpu1I{-=|4$xQWUrEsPK@|$PLtZ!Ww)`y6PH585F?lKO3jORJ ze)`%OWv&Id6}RVJGnWNNkH+;QsT<_atKU|KEmf{CZKr-LbT2uNp5!TYX%@d2P;G5& z+a{u`@H!Ur%;+YUyO@8xh`A)+9|Y=WiJT_nZhpc#_6XV5W1FTcn*C z`j^h{@${k#qywc8o#%G4GqZhFlZ{mcGoiJ$aX(nN7H;eYZU-ZnrL5VoJ@>mIS1_&I zxF?S=KDEC#We&6pvr2GP7EFPd_Gle~Zas!n2!|bR+Iyal*v}1TkRS?@D)*g7$YL>g zev@{c;E9I@z4-Zw#!$<4*RlR>RAl0_M<|E8CwXhob@M~y@)tgH1PDLH1*y~G%rr@t zJV>l={9C#A^S1M06+J$y0VE;;2ms=uzHKy5ah90+`f;D>y zdnggth#20hA?*FG@v3a0O)s09AbqTbZ&z3{ggVPi+kbs?CCGH}g_?OX)jmo-QZ_4E4x_&5urrK(7hccmuBf2QJo zy?nDW9Z0?HYTtR5EYJ=knz+eM`+U51i3;ts7s_NS zGHmtBMI_3K-h3x{)97bwm?j{j-b?l3qXp&H^+w6@#)o#y2Uju&V|!H|9%k8-T~JVT z8AGG~n=B*81L9u$;mBe|~vQwKRjs4|*hlA6Vs$x@x zYmyfEhg8eNWFb!)7hyIb;f;}y(*VEIFEFJ3rF3Ymbpo0sTPzL#rEfCMaO0CEnBoG7 z6<$7Y0i`!nSU~~D1Z*d!X}yIe+^}f5)TT_pN~5Y`G0BH41(09XGzJpeVkHX0qI-V0e~-kmo#Jij zEvez5+rnJ)Bfyx)hFVi zDHROgU>_>`y;OsfZa>ACUrhv?W)a@LP=)};TK|U|XAg0njvJ>JoIAl=Yhkz5Q|6Ft8)~Wq{#mPJTLk-7@8atJugytYK9IJ8j(^@Uq-r z;H|wIOVwNFnYU{27z@!N){s=JB*oCLt^3#KYaD5U@HjELqWF@o>KT8Tb9W3BN99R4h|el2bjZ{UGs0=NgD~Wm{hoM}p7Dd*d`5#u>aP#_N!k zlaRx{JTK!te3A9>!dc6GVPd*|K<3Wap`N>M!+dF{7gA?1^;>p2jIw3iq;5YHz`WVr=A4Caj&RodyrG)27SGw1# z=h3jBR(;1pk~hWfg>$Y-6xGk4KaL4TXyWDNk`%N%OAEaN5b70RC@a}#ACAM#2b3a$ zu=TuGn7$JDq(NkWdc^=omcO)@&?g{^)K{_QdtEsF+;vImV zpEtEhgDXLzw^b>BsAosq>gT#yaS$M9j%|0=_73BqSB4E0gRme7#pQ-Ib|gW4@D8v{ zLy_%wpL;x_UiQ`@JdAdfh|GKEM|)6n{qyeQCOX1f1^)M41*Nncu*WQyw@ zP!T(GZgJ{1Rxd+TTz{5oK9kW$z1sFwo59yKwcdtk_L}t>HE1}_*!oCJGFQ=m6QfZd zTUM0;`&B8RBfyfi5$t#+nV3V2E>vEZSsK}P%6(k*-p`@1FngK_gV28S4N)RI^da-M zXg0=IcI&7u@|B1`!*GnLcf87e9;Ze~5c}#v2UKu7D2Y`bO3_{AouGEb#>p1yl+AOU ze->d_`c&uDyIz=XT%QVi=45eby3AqURBA~)SD_7XOZ37fxBU*Fa4eo@;8M-XSwy+g zz)|)6wx~*Gdk5e(;zK2P2Q%v5DUE_ZY3w5O)EPzX0nuZszVY^XeEXr@0j}Djy6!gd z+88lJq%poWFOp_Jidx?|@U=bd4|qGY!hX4RJE31Fm^pSY30%lAcX${(979X0R@kZ!pY9-o+IPtK$sl#QdMW&Hf+(m{FXC zezi8)NwC|KTP3F=d1r^%hpSxZcMlsnDSr+=W?5O?s6)RVJnucIbg(%+9xq>bmn55B z)RH%2u)x~BMB#ONhxA#*Y?W$n{?VrsU zJTiX!!ezMrc@Xguv`$^csaNLg4rmtBu1iZzB|f)VZX#6qK56SawwJsW*dI0X^??$$ z9xUSBMABaI9bhvM0;QNKeQo|ipDKH;@m24<0wuz=Df|`7jMpvisH4M=s+uyq#T~Ww zho?-G*mD;p)XLd=NSuwFnR64V>&LD#;1z$GRHWpB z;r0@FZAHx2vm``JHB6bMeC4n+@(r60<=M5JD3+AQ^?r=5 zzI-Ih>fTB)iqzokvrFjm{*>PmNu>Kl)(~CwfowLtlUa^PMdMDu3W2-f;v&(m3I4V0 zIS2+`diP%Y(hqUsnip?+x&a<@+lbXhCP|2U54f4AC%}+#a4$G}IR;c~cCbIs*|~U< zhYd}MjfhR)y(nibQM{zo@i7a?+3YS>s_=1mBDp_Sa$D+eL-frHAc-v4x#QsJ@P+U_N=4LXZ5l$SDC&?SC1)w`50WcpO-d2XHMNQ^dW z8Z=5Sb_cDSeipl8lJ@JU1}mtTe{32^XWvbU5pM^K-bulaTK&U9jc{gW_UIIS=hz90 zUjg(h%46%nwW$Rh7NZcgf+)v5C>pe_95gW$4XYSM_fl-z#|IX{og&XDs`uGEo*3yb&nOY#GzA}7NgXAjQa?9CT%UB&x zc*wqz@a95awN?_x(05`ZV~h7!APdRq1X;BL=t`zyN|QX5>=A=!m-t0#&NU8w<=$Hfpt9|7_t&gGbQ8O(X_Uu=`pcmd>&t zJ)f%-so@ia>6PBD#MF~qtiqWmnLl-Gnt_$omhF=g17#TTi~OghW_eP4%`YewuiW;e zI&AAhUAT@`ntY@a zIOoKX@?B`p>^Qoa>{|4OH7se5!bdMKFwiK(6_sXVxFB?e;Ud;GIx2lM_F~+%cTJsH zpeNi|GdJo#znnz(0=;;)2ZX06XZ0{^8RFGZKuAot5>ecchcOvEpnYSne?2%k<^B2D=<3&Tq+b4Z?WRpBJqvUn^bnHNU`jWW@|S96 zI+(9p>(}OV8RV4od+^JF7%oI8-n*5S)Fld_1OVD%{D^A$3rV49wMf7!2B zPP=G}3cb}=3{nZuPST&kH>~vsH`!wmu|(Oc`7T_a)`rD1V^fhdVG@ykZZIa9v0;Yz zaT*rEmNw=i-t!3i0j*@HP>?}tLiu_@?#*+*j?@aycY#E6TWY_iQ>(tOg|?U$SYo`0 zZ^Mh?o?)79bhrcFyz+As8?agGUB^y?#2C88_<&q4C+ZE(>oPxit@%sZGa^e z5AFbR@6S&U1Yb{R)>hOuLah#$-wF$?t}w)SBh+zopSsgC?gpq}QpxDxX|NjDO3}O* zvv*y3UM|n>x>ny!Sf!cl8kFrGNC{gUxz@>TD=nI)>)_^9%uW*M#cp<_B-rAf&pDVo zNqg^4mT4bfIe^u0Q~UG7LyA$FC7}VxMuV9hdFQ(#Z~M+POXR%(5TjC7Dy4(Ftgx)O ztXA03k4;0af}-po>EV3DOoo-pjj(I~^CJHJP%m?;$Am*Ws?k;zFJ^grR~lCaMu-kM z(w7rA#tFFIxYT^_diiA$d`F^NjA4&^E2Uh(IqRUU?~g!QXFk9=`=edS(2WF&ft7{FsLe)Q|GiRi5+` zeY-pe`C4{-N8k=<70|NO#e)%6-Xo0$j3A~knaj8 z?C0VNC>+UD;fpy9hpzi-xnAy#zc{l2bf5nQ5b4W&65W z{8DOhDWSoe{zyKsaKCWjl zev|L{Jw=f!C5&<8_S26y#skR?8sXVDO3N2p;`nKm1k7+cDT*a&?q0mu*|FYm9GOv% z9~I0F>`bF8p}k63YF1j^qSBx!9%b*Qo!(OWTe_P_cX6AJ+U)V-Vg)Z(ruqhpbuRp< z8U}EfGi&Dgkdxms&Qw{uFXubm1$!@J`HGj*rX{N?uNPNA!8pDblNyl|0m)h8m99<8 zeogh>fwrxe4i-aiV>1orI=HJoTuBX z;TmIcfpF%$OS!S4p|Rnmk`>lQSwUu@D;kyjzKNp2R+7gM0>uxqh(|i26!fJi$eH}P zD&bzFjUIDl&#B0dvipRD8ppXyu8kIZ#jUpn)L_W3Z1M~&c5w~oTVpz+qid8bT?Y8m za<8QiBuZCemr@AYlLYcheUO8`&dh!xpa+0u%}9#yLSLA8hiB)c>0xXs@c>G ze7Ig0gaIAgq&d(DHSp7wuM9#J>=&`jaoL=1$hSNuMwu}%HaHP8*=0%7KQ;E0*o^G+ zKD3a(0V~y0)()(WH!kVRK#`?eUxSUXm$(plf0 zJ>RP8A2HTUeyy1|p9W6&%IF!SUT0A?yO7@jhNIop0h8GukK65I)eXPt#xaH$p9!_Z zjkygxwc*cZVp4$rDp2Bme}wyH122+NQeQBrZ!JYH9)TWq z7>MfHL?@lv=t*gOtZ$O;{Ya6#Tt9$yQ+T4(r@7Sh-e1x=x;wiAinS<>^Ru7H5H@RZ zu&9&iPZ~9F(9|01W6dl1nr{kQ2jz`Nm#W=?#lb>X=!dLnd|U zCj8cq-zFrLe9q4wq8T&1kRNwt*&ehMZjtsd2M14I!pLn}>c+m=Uo)>gkXG{D{4O!Z zKAN$>FrnZl4ee)!*mAw8K_Zty%d?j#9g?r`yp1x((#unCF)BaKyd-C^MxjuEY>Z;Z z!SS1)Sd1zw z(8$;3%_+^e-V1QLg3R8Oo}wKr>{DwZoy;11&Tr3xN0g@y)`SV2`4~)sRX!ceG6}|r4mM$M)w>cN%LsdRS#R7mEQb96+SLCN^AGkYUCZ}$D?mb z$n7u7jb>T=`XLxG7?8+1BU)b0O8+!k804iB6ut0RQHZotpZ}6~z0a{r9|qrtx75F! z*IQ>~zQ5eKlIO6H@0DHS9&J>wJl#l*8=v3K&oy|O1dW)j1M{~*iOj} ziZom)`!6$_A~uQCpP{%RxUPbb&G`N8^9fexz(Kt=_&*3l8L9qwMHxGJx*Kv{KSBws z$YynIshc^m`8n!8e3dZEv(lcRV{B1qsDzJzh6r#4KF6-1d8fb3G`{CSgG*uix=lHf z(Z2linKVsHr;>!Qxi^^d$jD&xupeJkk4#(suy_qw#yB|G8MV9n%Yz5`)oCfG8NLtDDDdgU9K!7)kfgHw%qWGWASv*ZEIwI{_QC~S-kL* zcZI}{WcRRn;J=RIFSU0bF>GP;j8^zKYZV@5hxgIKHT8l4TUAxRCU5g}+9B33kss}O z2K-yzM2X=%b)lar{e!$wfY1PAOs~dZu>)-Yufo@w@VDlPSx}z;1-C#*zqsR)-!KQb zC#MykwdSYJwHLV*Xsi&dL9OGD&x{gDR*-;l7%mSP>ySnbcREJ5Dq6;Z2<5dSW1^|r z!vi6da4bIgb~2okSGnTf7ykffO((?~yLivxwXK!DwELvL@a@i48`kPt9FP`HF|gnqaf8?M z!(D=5cX1u^PhlmbuN}k^5(+Ys3We-*>*-&zHadhiHs%;7c#52Y#IZbZz?0kPE9QUN z6XC9be(UiHEh1aXg2LZgwzeWQa!Cnvc7w@0G460{>-cX!oN7jeS9t83-FbQ%#rs6x zQ{}A}`!?Ue8f3EHSZS87$>-aRHKuoNe)BQsw6#krx0Vpz-dcu_<`*y% z<{qFYP65wa`^Z(NH^1xo8FH>vQq*qr$>ok~w$v}~5r1bvjlrBKL^u^AiNobDOm9th&Rs`~Qj;kaRas_L*uk3KmfbWxsw zoaB#R&Z$Rhtz1cKax|&!5;3tp&ncH;=jANCkPp|9UREP7rx^1qC%x@&@;IteQQ4l0 zJ-n-CG^wm(hj!!smyF7Uanpc%@N-zYHkz7NnKgpmYDFcOG_M~406jV61JgCKkEuuD zyI6J0U6HrVYdBI%HtrXWfb+&ZD!avJZ>U9gF0-gx%C14TY@$e{94mVtXSx1D4}4AWG*R3~E&QoFL>44jiUc|5 zhRDdrPkQs&S?w%s&YyRB)~z-t5|9G(*Kjz;;ha?S$ERwOMW|_-jjfgBk_DLDCiP|= z2m_(W>(aZh^!=5jx9`;))o8DVNc&&GUL&;eb&3mn^tHZ?2c9NY3`reEdXLJz7EK3B zfmN=xd+WD2+yW{Q$F4~{*XPEQ;_HnMQhO0LrDLc?Fb#Mk2^@?%fCvDNMsu3_f5ZO( z5g^vI)P{CXIUxo~gJBDI7|wC;Uu~7~W-Hq&c$uih=%r=&v&F>a(5DN+H~Y^_D{B#C zj7@NX$y~qBk3xIXjAX9&ZzO?*P6$!y$9l%KyNp_irItd4zEK$jH~#=yrCXR-lzW?5 zFn1MTNdR=t4St0gbH|!8y6&~Vr$fWGx~m_xd;RDw?@(rvzZ&H~PUb9b_os;%cdEHG zyN)S10+Db?eX2nq_pJTKo+RVFL#A4&X$c3dFPOffv$qrL_*Qk^v87lXUusqsjhtd> z)lPjdO-iG2yhke4oe7lyB(MN=B-9s|_O>=ZX}XX_0A*6=qU7Tw_8zCTd^7t(d~^}Z z2ZDShscLp#Ya6E5EL4;mbG|ifaKpIGb2?YX{Ts#q0137K0EJrqt#hjCGTObYT8l}t zR+OB@l{p}Q2Yj3w;GQy!aS@{4{d!;5_1PILY@8=3tJ`lo9?|g=_NegR!@r7Jj+J?1 zE~Td0>4|b?ws3sS&R24<$RG{~>z_{gz8Co2ta$S4ShLXdxOB;;@X*!tZ?xdba_oUw zNy7qHIUE3M;9X-yhQi_WZBjeEOlsa2ds~^MK`q6m(yxy!bs^(oI%E#~*H}IvOYr_L z4tTRnlG{p6N5jcvx{kp<=uB%$ zQTVTW+vm;y008=H!k@JwN#O6bYjy`xk{wbz38b~c5hQ?>k8e4DmADwMYPk5R_FZ?y zGf88O2Sl`t&pS8{*G{Fr&Ie3@7eDV;=6;*w?Ndb4EpUNmq4)w4AJh~SZx53JDTOMTQ;dd&kyc2tge;Y+4o+W6*tc}8EU(JDD~Y7!2UD% zd-2xW#2Ox@;eB`$Ayn1_MI_Dli;{ySw=p~(Kf;;BFKd$^w;yn`2O0;-n)Fq2eEp*dE<~(x(KIs@3?sL;L-8aVf z`hwYiX=u^Ucoi-kZ2EbbBgta9B#?(35srtwe55n}CXAP~ifL(kb?xC5`{T3#6aqP!!ocsA2ox@Xeu?(Rf3 zt22P|Gd2`su)!ZOz%}{dqs-6l zJT)!7-HbX7ot&^pQ8yMwR}JQ%0N?~8Cj-59QR2MO)r@&>XUguZuXktPv5&A#`u+#% zUyFV-cvnmDrjOv^ESJ~%=y)wfco&b%;SzGZ0AL&_80xpo8j%xUS zn4W9UyE~Bt(!=(~hjt{}k`8cd%l;&3*7~-crC8lYCAW8Sz>jKoiFNC%FNhbh!+$lh z#~SgmT~{inJqaC8Bv&Cmy(RXbrsq+f^?~_Q%nB49zcPRTt_*f*OG;@yH0l0lr<3r; zDf3oxNlD#rx7>RVge>E*_;umS7=aPPWg4g-O#c8{^CJ{?pA0@RTyYazL3BwSSg@3K zZSj}k2AddbpNXCXjv_EX)KXPaKAAcE>kJkmwJK^6jqT)XjL35N)aR6~ zqFb(sF5XAwwXf_k@yAtmmi_!Kqp9JI&GzO1AL8=Sx$oE5*RuFC_5<-gk*lrtz40r< z%M_?L!DnM5^Sdf{7En58HTFcGv~R)}y_PL6#Co@gF1E2)^z9<%c5SPi1G8=pJCHq1 zaq<4t{t>vf6KQ@3@zwm!er(%YL7&IXAF9`D#O4!^!)57X5A6Jso{mZU@A)4~+FL%H zw|+uFXt!<*Qb`{Dq(-O;^i%h9$>%t!p*o6ONR#SPUX7q^7O{>`Oa%iRXV$)0oA!~{ zZ!K2ePWVHsyk1~$^qq1z$pfIwaj_J`@yp`;q@5?>mVu`3`_FZ$+)m6r4%pBi$2H9y z4k@SZ@4m**AC$r9_VR4{msPU2*KuX4iFGSj;B_&SRZ@~Cmg&%a z1%{QQY4+AoE+d5@03gRexap2K12ytZx5a;tdY_1Hw7VTE!8%;9Dm(dhQ%cx<*!$BD z?vY!D=k}A-W7>RKW2ULc7Fs2`kOyqG@+zf(#HH^^EBTci?=FM)BHyB4@DHpcyS1}| z7~n`?iBK_8p<8x->VOF+r+z53lH|;0SZ=o#DmKZM$6NwQ{+03+{ss8ys|Nnj_@Uy! zugfjGkw86vf+0?e;IG6xmR7#_kK_A*1~A?rxgVf)srrmo^-}qX@gzD@Z`AtLgNUTL zyH~bjCe~nnS091NtX*HkJ`sY_);)K`9v!y%in86^MxjRT`^W%#fz5o(pR*mk+}>uZ zf2is%PIp~iOEDz%KRcS*vi+C*B?O?hpJ%v#7m%6%0MKcDTMWJ`zk!6a`pqR8KZ)sD zufz|6+H{lZGx+PlR+m^*c8^wyNhVz9AR%mH91I%eN5{{E+BTw^g};fk&k$XdE9Tqj z7gF3J{{VDJ97G?`e=5+k_yOT-P`I>-K=f1nFDIsnW!vSC zQhNcP(2rX1eFwyTIrsu*@YcDf-uTPmjHW^5sNa332N-6JkNW8SQNCf=*M2UH77|n` ztx@CQtGQy8TAC(T{i(H!_&zy!dJ7$9^4`kh!nb6>Z*=I6>RgAyoMdCKTKMzB*R#d( z%fg0B`=%?dSx5|$yOLOgjGXr-zT>(0N8$efj9N#AJYC?;dd@ux+S2aL#jxDlrd%9? zepUdCt6+?Ds&>D!4UM0Pw5?q{O@AfDox~FCk~G@JEMup0is{QUOeG8wr&3muPU_nA zIdi<56;m>Eqwhn#^k>&z03rM_Fee~uH@~dzf311mi^dc(6Pv0d=B;K9t8&9OVwg=k1Jie2OjUA>t8lq_-gmUKe4xrv|Uw5kvvlb z;nz4S_du=*9fK`%K}K{T7uT2cI%{)6teWX_%040Z#%~Y)(_T8&^sQpfD+%sxZzH;R z+Tz@xwvTHRQ}cnA;ClUQhtobdY760Vk!s!pf*9`1V$A5XDL8zYh9n1R2RPv8j2iLJ z7i!Vj_zvhxB*e{bk-D%uM(|f~ZlLbl$3x9{Wv%3bZ!da-g4?t6KetNc!qc57O7TrM zrO%X>KD;W)#o0G=^a3xBIJJ_a6$(U#&O9awRG>=Bg9&k zqj6)ZNAR;tkd@s$xAU=P2LVF^fxzq2^RLh0sBaDSwsQH(m0X@Z>Skc}$tWyPbCNjE zZar&dTFc&o1)AbJpQQuibg!bkGG6>LoyzYC4y`J-RD-l|K_>&(Kb=Qo@hblS#UBcz z)UR~7v@4B5_3dq9j^(B@#DnK?l^7fl4^H{wz6J0Xh34^>#A|Ier#9A5t6XYVD~v-5 z@^<<$;X(C2)%DCeovyRt>j%)1(i>Rq#8xi&*#t}Souqy9fKEH`PkQn5itv;aIa0p% z{<@u*e0Cze(|QZ7>UVc~zMtXiE1$9IH{qqaxPU2=(g?uG1cC#SRYpe}vyR8Jx6ySA z%@r0)#%q0rp^{k)d(<3f3)MpLxc45X73TgJ_;sZCZ{wD^;`Ea4JDoz_C7R9Lw06sa zOpTnMG4L=mfyq6EdS0cjPSPB{72Om|v@YSivJ<6zvw(j+O0F z&qr7-&ix*C)BvZ()gJv$2AHWwk5j zNWd!`u0C9X0X&>>#%dia#?b3}1h;Dv+o8Fd6?mJ=X#z-4Hzy!vfBkir)#dS9`g;+} z7ppouNx!kYU#i`f`(d~cs(F&Km^`rAPzvGsVs`_MaoVT3@idZ1?E=IGFdkOx^dMw^ zo|WZVzO|1M+S!TOBAO|rnEA&p!^;CBCpZTu>6*&bHDPOG=A+q(i>m;{_T7*`Ac4kn zocfBom^oCleL{TuEssIgbqgI+OqR<~YmY8P%NQphG04Cx+;BKK2cKHEHm_$Uk!g0t z5=KBKQ65As(5S)bo`=&F@|TQ$IB9+qwYp<{9;6-(&}pjTKRBEM%D^^xApHDb9A>#l zziE35U3*NlT^z8Q7W+)r?8YP*81lFQxePOoqw8Lt8zsd1G?XsCuH;4%>V13m;r3-z zor)D8JSs`t52ktyj-KMPHGdb}XnGaSsr{LIel132j@mUW0PB`JS0ic2X3c!-ZSl)N zZ8GX_w%&cFNlt8Jw<^tmK1>ou@Cx=PBO<)Y_x6U?waaZoM1mQiiezYf_ME`*j2vZv zCvZJ`5IR?9_APlz${Ka(HBLQGxO^+)s||ZVvGFFKsHoE}h(31AFU`-ES2+itZhdRq zw2S>STC)<{yf>O{^h^o|AiCoWKwW8#Uh!SU~o|0SYA3#kkx@<$|(q$3|0}bI%8*c}%*s-OPSgs>1G5 z8;e&C%J7!wAQQ(qB-hnnv@~Y_0KhsIi)?L{X{_%bP1I)t=R`SpTPLXDhJ6UHmnMBC zEkee4@5RmZz)6R7A;|;<8%F?oo|W~vCL*0|JSOAsZTA}0j8v0a6?B^`b_VlNX&M+N z*ukU@@_L-(Bei-ioZ4y9Vn{5fdkcVksacDRllOSW4#ND8-`-;gb4tYxM^b>! zi?ZGXc*;W7g~|GLAlIPyQ^bPPO#3yJls2f?^R6Tch1hi5SOUhp>Pu}$PP7*Ky}U)4 zx8_o)Vn6L3-kI-IEfZGNHF)eaTTiscTg#Hk$YgcvoS(bjn)C5gV^WiY+s*88;$zVF zRq-{G-TjvG;?m+L!!Qh?A{~gwQa!4kr=w}QmZNWLBsMp2T%cGk8T`g(9Y#OC2RR`CXOtKp`Cok7|sk?$T-g;xBmd)EwR&KwubUaqUa-vJ;)FbQHt84eK>HYPLKQYdAH(3@YAPTqWFt7S}T&EG1qF zV3Uw>kH)j~nfyVf!m}HAo>=%1z|wDpdS#GcF#1=#O?#)?UYiHgAZYWt1W3pO2l!4g zip`%$Tbbm4Dr-ovWDOoNq#T|_VnDxSTn2#xQUJ9eJ<6;SMBtD&EF&{oK6%7vJaB=aHCU zIhVAK=kLANuccW^67N#7w~(n|vQDZ<9Zx2?EmPuOg|zD@c&^(~m~rJ>sXY6hmGV%O z?d6?@I0WZ3^$tQ8+z@mO4r}e`@MQ?J>Qry=6!?a$z6hoGpG*G$!q&Aivkf)8lB!fR z;5WTsU;J6s4bc`h7B=w~8$8loi0_lYuM2m5paQ^?p1%J8%AvW`;J8lz+VJzZPTttBR`mV&BO3L-A`@EEHK<2J*-xA;E86yjCU0#2*#R z6(iORP8)$8ylM~Q>0Sx1__S$EY%OHnt6W;kJ+PHOcK%q&T#j-^YJ&K|Z!UDiw74_Q zS{SdbPn&p^EvZqdioRhZ7&RxClU!O~zRN;)T6x{5+dVG%O z#$OjNv`-T0RvMbv*v z-`1sqr4DQO+P`<5Rj z)+Dq}HwMWheeB~LamOrerfGas{{U)vWz-5qZf_*=Qgi@FTyMYx7UXB3=yRIjrzIIF z(~gf;6u=+@_r6}; zE9fwJPu5&3)R(<0y*AUjR$qbT;&G~jloWJ^oAiCJbBypcoy~`Z?d(ndpY{veS)tS} zSZ)hARpvl)8z%>h9x>3G$G_5BMAt5CL^lm_sb8eF?`q^og_q}5E^renTR0fq?_B1G z;!P%h30Y01>DtZiiG1q;x{}~RlFp}c4VgY!3x+Hg2c8Fh*2Q&cd~0zhi>&P)akNDV zn4&y*04q!L1uCTR-x((-74q21-s_~BR<*UatJkM}FMFP~pF5u2{{XM+LVKNZ-c3(I z)-+u?Z7i&9o(tHl%c{x_;zWl$mLrqFJq3B?F%`cH^Um9yA+y5#-SaqlO@E_+1wzG5X`$>_hTS$Q-uWbNXJp< znndfU!*4#9p=tA4%cQ-`KWm>e+%s)a5M7IfW0H9!fu6PFVyGt=##OHRdfR`Q*7C7}=yQprWxRZRTbdrs&ki&uiCm;YaE7Nt26U1H&)oriS z!V4yaJZlQvtdX!+P}}4&0vs{iLgbPL54CyB8pgGtd`QzgMK!gBps{k7^CE|PSlg0= z0Q|fVK_HxP4Sgl5_}jpmw}SK=Ipfu}TfIfZwvt*WlB()~)rR%wCnpN6?}5{!E`}B^ zqOT_!uVG9UJ;oDQ--xYW+eK`~6)*U?dxonZTEx7@3Fh&R`G%N&L)+x8% z#>+OZYbuQ;*|qr|U*n&H8oj@Q8tQM0KNWQglXYzhB)ZE+qs*NnJRn}oaqn7J-?Oj7 z8(lhUpAza`F4bU#OGx^+h;AE^)R0^Zb?aN6F24AQXR2x1KDpv8A6d1!)~uFD?KIVd z1{21?nfPY=pkskuU&UCby6~j%%Obof1k>zg8)Y%ZSSbUxK(5%~;dGKq?l|h=sx;iB z-_4#6;je|ivp%unnKa!W!`g1Gc&sG<07>4(fa|w-!(*=m*U(xw!cT{~OiJ2+gFH6@ zQ~S3|B~r`AImafyH$P|VopL|hLTld;>zcIC`Lo3FJ;5=v1T3T>;04-n7Z@CLufL=C z@8B5p?dY21(8fxTBT!o$W0RWl^9<645_YRQU)S^|5{D|3p67kyEiS`J@LkllHfw1v z5hGZUR2|F*rg4K@7leKl=%NO8if|pv?MEsGPJ3dw&42cX@V>95$!l+;>VY?_{PLhB z5yLSHoaYL9^!%%}_+9bmz}_8K6@bWkVrS%EuosJu8)G7)thy zIo7MJ3m2-eHVk0rpUS$i z83j66c~s_iM>P!ERVzjux-<0bMlsU7XU3l%ejE4)#=5VE{6llDe`;ygUu?RL&rULd z7SP!Ta0K9vE8Ca?xbI(?{{S13&inTK@phdwGD#%5G)U}Z$`vrjk+&Y5^Y~Ylm0;=O zD>%<w>QD5JVPdxrfGgT)Gt!p&Q+{pg?5a0X)~TjYWl0ez9h8q zm%}|5#TFLxTH5M1;&|blg7Nj>UB&Y%2c%pr4d_h|l{sc=A2Fw|IW|06YHxqrH6b`zT&rKZW&u7E9}^jXv8z(ync7rIfNjWETQL zfS;FfQJi`T%M(iSoYS*b{7R)#$}ww4bCmH9!v6pm{4nvg$Blj!U;Tph&g=a)RWD_! zApQxX9Z#dK99OV>FZku*ABj>=qRYF&-aoTL_WuA5UdT6{zj^K7q|x`t`GD#Ld!58~ zZ+CBJb0x5Ql2#aGa2jk3kf8F|9GrBo$^8>SwbuUtXw7QZTk~(VO*_UjHJ#>9n-LPW z&T5f96rwPYNHX76@Pd*=jH>gS@>V$OOFP89r)YgEjrpARB7HMmhRdHkeIGgOY4ETS$i@S zAdb8qYq}Iv@bHu+ds@wH(GTmi>Qr)$(!c6_Tk$&4;P95aYikqSuA3^O>{3`NP5>wB zKb3f`wv(w`=~G-TopCCo?h>Hf3Z8m)uT$~=0F16}zAD&i8dKfHr`>AvG>IC9eWl3} zzIg7#6`SG9$nCuA%ZcT;f);5^Vp0$zvA`;rBa_EIf{0YAsi;Y9*YiG7tQ4mE9&aF* z?W}}OT^MZ)2*Et`u8e6nN#VPFSM8RfJBi*1kb)a}s+I&}AH=_y>0QHKU0&(2UfEjc zdb5WI&XHOkGv9VfxX8iJV_p8Ep+R@>hfcB7Q%}CUI;^f_lI>O8v=IQ&xBxdnlaE1K zrsWA)d@AqnOZ60JMKqh-o8bPJ1N?h8nr%N&OEv?g%NEyjuz=z2Prh3Y~)!PHmX8EClb*Ofkq_{m&Kh^(r~n zoK$(Qx35FGj5#S-_WS)>-Am65;Ko>x1fhd-_sIvYc*nJPr-(dSZZzp;x4BJ6Pk_jL z#FHjx10Y5K`TL9$f!4lm@h8SV5lO3RHx?I8bZfFrwY<^!g-%ItPUPe^dsm(5J|fh0 zUlChaY8RL74fWh($%Tq541s_b(0}@?rw5T#gn8yFm6UGYr=seA88zs2JwDG#j_pn5 z<15ZCJlVrLHUyvBK`+gYb^=D?2e0^7b{d5>9TL;X z+Ai@es(GF!S)2YQ(WI&lGqzSe7n~du#eEH>_!bHLA->W{H9cbLBn-_SHalh z0Arx_t}4#|087@qN#LIgcvDBVfvxo=mG3TIKrS4d0P4Jeyq&|IO?|ELhxUH)&w(NE zo%z+YJ4m(5D9yx)16-^(x%uIQ2KiHI7&3Bj+z!)=oRky2m-S&Z+p>Dv=g69@g6jIl z4Np#u4VW=qU(ThHVY>j5-GCU+QY)3y{3odDULe)3^!sf^bXG6AOE+YWSV23a#xi5T z{A=x<3&C0~y6GC1#CY}Z9QcOHR!u(8#~NBev=X307~0wY0H&Lcaa|st;{N~$&*N=& z2sE8{Pt&hpfhJ39Wdhz$oH=CU$0dU*}!f+E(eUhd0K5=^KaRsp&w zmu@n}j(1?5-;H`SaXisn-9+T$q>rXP9DG8X#ecF_jP%__qrBB&gKTc7SzN0qUBL7! zfs>z7JJ*`oX>fUlX0Xy?4)`Z&W4q927z3UUL(Xf1@VuY!ifNZoT0WyJcOU4_CB$y9 zf>;8;ukkhjG` zpf$-(kt9+Gd74oec0-JDjx*beit_Wscm8A+H^Nw1OtYwwSjJTFtgC_!eR^lLWur-B zqRJkF9mv z-qZZbidWWFCKh^Y&Te%bMq_dpA|#DQ6CW$Sa;Kd4>5ACUJVU7In#8c_+OCfk^!W=S z+lMN=oUk0{p4@k@H`Xsjw!Qv?Ewt9Hkp;3bVIM()I+Ml;C)TRlYPRz`E~9G|nU9x9 zV>_7pkN&^mT1uC+j=G{M!96!U>AXp2e+%0#qYcih5(wp(**t42j2yG|Z*F_^uC=Ao z^_?Qp%UIHd`>TQ#8IZFAIY-V{=twWStN+JcJ5Q`#^#DepSWzZ^V}qx0;t$*0ygEXGH^X zB>FdR$MCMJNb!6B0Bo+EJhr-}sFmk>025*^_u&h#%H4?s_WWwK#qFJ(8ikzJ z))#hDut`;I&hwn@-NqXpqOmTt9}C>r#FuzQWaYRILQap*AK4PYPx=t2+}{ZW4gJRt<29LCkOaJ z19v@ode;7*C6247?9jD1A7d7{ie1dgqrUFDyJEU)VQ&J#wkyQ*7&{1)Z=3J_Bd@J` zG%*vQ()Q>^sQn;|Pz3y|^JAfZ=~;Tei*%h2M!CJcnWYiB#__`0WMV)Zb{veFxE|It z+!19Y;IpsjaoW85#a<56^}DN`Pfmi)EqVwYq_f88uho#Rmm+Q$ED2EK1ZTZ}KyeNy z8|+urDkwLl<*R;C*MD1|F@lXQf8MLFFW1Q5(EM#{;-41lIzF9mcNN~7k2iY^&75Ok z9Y!(FPHV|Lb>ax5_<*pj)x>tT(jVS!IgVu@h#gNoS9b1k^fl*po-@7hZmT@jaq3zQ zwvfqc*BC=A5fB6^KJGvSDxCH8BNgb@3uof#ZeoYTIwjV-d!~7sjfzPek387N&cKqn z!Z#fTM-};O-Y+qs96frDbA+$&TV9sww@>&7*T)M-4=-&^d$#HM_38MRFE6ik{cFIo z$hM~LYou?om)#6Z72Wr;p6Woyd~~b&#-(-Pe;n!><>DlXaIuSN3pU3&{{U4H3!H+W zkWV9ln)45}c&hJF@ZOm=lddEhJ<_hPab+}eT%Cvlv@7?%Z{ipygMply(A0cE;hlfu zCD(^-bv;K*dzj>&-EM8>jze;&r+cHIJ4jX-7|*YI?5dq8r4{dAcHWNOmi4)DqiH0T zmU?Ni)ay4o8(q)hE4@ZtLf+=v6S6k>LO7SM4tJ!I?UCA%{4ZJUJw%XyPAa2+R zKQ<2MJRRMt9}-|hYE}L;{+)R zFvGVM<{A#kwbN@Q%#i4p9wL?#44F%h?D}Rpo}G zkniLMlE6mUD6P5jvI29)?2b6EKKQ{tu_uY%`r_|Pw3|%R*hOaVyj|{X&e6Jnci;{W zUB30|W{(9b3Z*A)wC~eii_Ygh2CaBi8;hTxzwoBb>yb5^uC{;PMwce)LzH? zYHzV#N1|AtJ6K&PT9YDf$&7Q#kDDC0qQfqyZD5TL`ZGodbDx=x&=rR`;=21U z3Tb*?pJ}7(`lal*`gQTR@ZP0=E6Jx_KKX zz1OY&{aCA4r%sez?S7lz)A0L_Cili#Z;I_aHLBcO-dNnhZzhZ^^vyuY6{-=kGjSZ7 zccWt=_YC8Zaw?n`+6Ir{spM;^wK?Tin|4*ru>b|wS+V6X$OnvZo^VbNiZmE>oflNw zr$?sWY8U=gOK&`{3ZhN(N0kE$f*DwhZ6mm@Z(G%Lzw8|;ye`^ytKvCrr7>-o+gd=N ze(y4t0J7%=0Lj441$njbv-Z)0*tpzPnjrPjkYm>3*-QDcm(4(uc5R*3F-P~lcV^K?^;E+g7t1~woS4!;T>8vUrq)9 zImm7?UoYtTgjU`v(l5MOW20VbNhlW=6T|j}v6?^$2*aq{K>2$1BdvWUXX1Yf=z2}A zk1neP^9!bQvzgRPNoM=@>I-dL9)uB$p1f;-!_tjPzSaueF0b!CseTXgCosd*ZAv{_ z`;MXu%Y7=tTbAAjzkOC?cWD)}3_}t!0L*dQ%-nZ&V72Ft*#|`V`wycirJ)07x)#fq`B1uIbsXyI#q? zTe7~Fe{qHuoFmMZt^WYPx7=_14YIPe{j&8GvAmAz5ui_e7sBM#t>j}f~)#h z+8hO{rzGV+U(p`)Va} z+ocjd?(R?FUo?D5y?^*cZWR~JZ!vyN>bd9CkSkl6$oUWBZ-#W=80wbL>dLH^dSr5| zk(N+plOSLdlYlEr!@m+dLEx{3_P!VJ>)UAhC5^Eb=(eG*8FyzTq{zlwp&VrJMM2_S zb${V}M`tKRL!!X0*aQrjxxpV!PfGLsS~F?=r7*nIq=r@|AF~iaJ9d!7k)J|&>%ii? z4j{}i5X4i38S?w9@%b}`GL$)z>e<#`e$dwkU+}tX_BRvW!>bF4rG$;nv6VYOG)EdjX7NoOiCAzZ-~niZPt; zd*Ax8DqPTaJgedA!)yCe+e5>d+VWWx43Y#B5HLHDT)S#_j{3{)ScEqaQ*$i?xCoBa+f7r46^tRb7B_gPf8u02n77J;iq) zvmUpj_n+dtR}1k+!P0p5;C8*?G@tB-{v=;Cu5q>1 z{{UUMuDx6SF87JP@!O`@E(dR#=>Gs()nc2vIjUvl{R|!R}&w@2C z*%J4}pA9r`4{93p+I7982$FrBQQ69wyOYxr`gIlS9|(VED}RMvKeE>Cb*8&ZeK=YO zLr)A>?<>*woE3=T0E^yJi6%<&arC`zKU{<{vA0*of6qV9z`E84t! zUHC8IPZ0cCy77(dPyMTL2bDV#NO80$VhG?4hP{aAI0}RHpceH}^jh<<^7b<3jZ1o8 z{EphO_OY~~f4lt8pTFUmz7ao+^-mGY;d?jn1^H&X)D&WA3uAXV<2dbJ&EfqIPVnD` zEc9I}18t|Z z#m#30){SvBjk4*A@8+wI-){2{%A3GHPNSO3EvGsYPA}bitvY&r=ko5-@%OGPw)F<@8^nNK()*mbOk=hX@->9)33cHcaAR(6;2 zFuC2y^EdO)pzqCl1fR1utE_xMyG=XA=$2P<{kJcqBkYaX?PuFAPDnT^FmQ3wv>*0y zzR+*ADQ`SwKA8=yLgw=C`yv8N1&H$k`MZ@y2+0GH-oB3bc{{dm^-9V75AZmPtrNvs zXM|$apZgs&k1scReZ1xFrG(%rmvzB84Tb|44Uj5@*V*j9X6svhCMzq%x7Ym0+U*3> zLbAgA?gw#i-GPvDFmYdec(36%gkk-TVbiYlpA*LhnP!v8tpc*oByr`i@VD;vV;?Gk zfH*m?ooqe{S$K!S7v2q<#P_zgme)2~gX-{UiduA$C)_=;I|4;A=@wA)yX z+g`~8FoO~nC73xS23KxecO7fcek=aZUIp=Y#5;{%#_z!o{U~{pV`H)N$2X$Ho!(zrxlo(_8p{{(QIt0wU4ON6g;%IKk+B zJ6A#A9}DXL01>r&o9i87J8ux8n3mU0)8h#m5uY*6&+Sq`LviU+TU2Yju25D+BZ<_qwbu7H+SN?AK7ETc781JPPsMZjCb;-ua^u)F#iB9 z8Ra-V_5sgq8vPc3gZ>i!b^9Pr=4&m3zv-U-ljB3>~7n*CnlITvcTn;Di_Mlz8$gDE_E*lrkwV+H;~1BEKM5AZql*ZQHce{6@gK^ z9A~wCwfjYn8s7Xb_-Wy`w|CdAH5H!H>1|RpkO){g3;`+`$jcn(cQ~yd31~9-Les>W zCx^5@49c3mu(z6xk+Bm;G=SvEnI2888Do$(bI1a{bHsW=c$?vFtD|3BNU*h$Xj(SM zkm^HjUJg2Xat&hfO=10-mEQM#{{2zaPXSUga(27AUqARAKNIsKUcI~UkB-uR5=pIE zUD`j-ZE2gB13YZ%#m3Mus`wn70(ceRo*?n3i7&n`CGF%AwT!L)iJM}nEN7tvekZ;< zSKIpU!Tm!>)ciB5_(E+=eV$ntP?W!wAtV(?{p-4I^4Z5Y$0KRYd4I&s3OyIbk!hC} z_iq0HXG@hyE*s60c5?AD0EBRR4Y(r%6~RI)4Ai9_Yv}&~;jOpM=bu{(D6OsB`NPCl zlfR6fT}o(L)JTRmw{{Y;a7f2HPf!QFUbkBd74j_-^5XL5(j}VSNpNChk%Fnn8+rrH zR*S)Ht9*6v{l%`ab9blR>QKid7itW#uHl>!^1lPP71#V{(JeeJ`%P*V-X6J{*4E=s zfXNAmVhLQ5%mF-S?;rM=vBiB2Df>z>aWI3E=1ZZ(u8pSM>#zpC)-2GEHcL}_9uoQK z$OEq~MldpN<2#&?mH7{);j$@i>HR_5B@QFvmWYlzT;GdutVd}Wjs>^KJ< z#Z=cWZZsQ+ZEfTq+7rT}UBe?7By)Eyt3{cNZWw8xtmo5b5;2k# zk~U;a_9q}I`d2G)s##uH?zpkjFI+L)XF`u6oE(NdPebcmh4zY;5F6byOqrpULFGqr za%4yt=O+!$eLB~CC@HUdNAfe29hJ}8d!0RPp;#m+mu$O$j|>Wt&RBFkIIb&D@Pb|V zjvZ@Cx?Ly565Biw-TB0#f%inK_ejs^O?LW??Dz5sCvhx_xCeMb*(99fspqXlrRnz9 zcef3zT{H<1R*hl#N$2MJ@r-j{xJpp1N&9PAefRP{aYZVt+5Z5RhYNguA{(2%9?!#i zWcRk}iG8c;5r3gdN@YYy31|7cX9I(t)#Vpo1GUR<6JP4Ky556#s9Z6Y?$Y;7@*;*} zcQAqBA>&;3I8Uu4v%yEndv#rnDN-@uJxaZdT)$14FgrTv$vA!+VbuR<7rk&qrq$;-M0<6b~)hJ z-CCB5W8!Eobd6F0sA(>s&jfLSh{3@*?0Nhvh}J$7d^3jZ&!+fWPqczKJb=@G%S_`X zc7e~zFi#@~73aPhm0F3$rIw9vqdO_*jZ@~U3$^(lD||KhhjZb`?rkR5BfpHNmkVx= zVij|=D#}yKKA}kj_7&*9EAh>biS)~OZfx~yZEARhi_ZnAcxR2y{v#oV{s$=Dy|}B^ zb{3u(@y@g03%?9r`1UiruOqqzJmBpB40o<-*={P8Ia8-n?`ExU$5rR#cE=xvuGFUlmX>!{ z^tO+>XP3HoX7bkiNwTu>T$+u#Dbt?&Q<5A=TQV<}hZw;na5*Cxtltypmlv|xU)xTH9Xo-@ ztd9|{lY079_k-;VY9bjYUm!GS&f}06;GBS`IUP?u>&HAds%kS>Ne7dp-04zWw81VR zM?m0_kRPeq2i-V6_4L1htZY0-qufN&X<9_~C8N#6n;^Ijg9R0c>BuC}4st$)p2(+~UFyvcjVOX0nDQSpAguBNm7oF}u=43~0RK4ags^#h(b85zL?J!`1& z4zy(W34du0yJ_RSYSQ3AAij0B46=RI{vyhwsmD0&TvvrO%}PHIc(&5ZT=2YZ@iv_A zb0TykF)7Hvz{cU8xU4@3%com--pYT-kpEpyB<5^>%{Okh#SP0Lso~w*S8)ZU?k(5HV3({&xy4O*H=b?O1lJb zq-{`Bq2sSg`dKQ9QoGmhOzNRD;~4ZmM^;ADuk|f2SCZ=Q$&_2qJd7lg;G!UQ2cCK3 zHS8C^3NJic`zbc5@Veu}dcLV8)a`w0k(gz-hC*1!^Ar2rfrbDA4hAd4d?N8{ciQf! zBnVCJnWx@`D}aTS$;Ns1IP|Ztegs;_;Y0Bj-s0{ErL&GHFPkiaom7pET${2Ruumd|JGH5=HShiM%Yf_qw!KkTiB0 zbaNc*ew(rtHZR95WyzfY|Mknz`|p z;%A6_JLA8LNi3H-9hZ(~u$mvV{{W*&GF#gSTXxfthRFk=$ox4k8O?oX@K;C>WL(;4 z@Cjy+{K45(Sd-8;Pbb#6an)fLQZ#-Qx1VNnVH1xu+SM<)pJ#r^x?^e6_^7q2#P4kp zY0H**iIK8cAG`N@4lC`f;Sa5TZhyf&Q&7Ls{xEB@`GZXRb(NGz(v}M{q>m;u&M?W( zeAnpnld$!yFdXWe=icY52+2}~_p#3Sk@jdATnxW&p|6tuCA^m!NQOB?OlML_UBKYv ziu$X?Y*WM0f`5$k`d7)GIF#&>lp`{n<@zrNn)Fn*GM4AcTGhppe%J10zmV#G*b1;& zm>bDt5xFe#2EgiYHj`RY#d$V|dR7~qLrsdsBe=PR*;q-rm<^}#>D_vIa9ZrI7wv5K zj`O66qaP$g5O#CqZ~!ECJU#d6Z}2x-z0#vB>1nd+JH_(8%$UPS`N?c#j02I^ z74jMO5!B6LWZscpoBse_dmMbp!M{_+{v=1Fw~0I{HI%W;k7BKK88FPvkXINy06X*j zKD+oMr`yZ$BgJ-_!$E6dGx--@NMs0}Rv7chz&(2LU!V3`-L|u==`&ht4XgvamX!HE zQxZ!j%z7T9r!CsQM1N<2zu?}g9uonRQdU^Zf$)qJD99vm20oatUk?sUbr|-)-)GRq zA8XL{SiC>*qeO?qcODtI)US0YEaX@j=DB2L@=oGQe50xB_*cV3LQ-$BN^=n#gqRAT zXCPqUlh?WRuhWl+5~M!`{v^s?AgKWau;6~-Mh-r|t$tYnY;It)R)H^1%#flxw%$9F z-}J72F@kfZmz&Xg9BzEumd)j^nWHmb6K)G26JUKNsORV){U0B4pJqiXE`0291s56q}+)qTHo z#Qy*~^AFk^VEv1JA$hyZU)kxoP~eg0N6_}Koy_T};weS!{{YPQaFcMMIWC8qc%$~y z_%-1Rn@fFS)5frn8VHnydP=27;SEOY+qpU%FL{e~3d_#=Y(oLR*XI^xurx$Hdx<~ElxDf7z1!J@9s!57=h8 z2hN^HZIPBy$sI@oIIp|D5_sbK;xE8mAH}+jm7Rs%>&UGIsc$Vpu~Ci0p4Iq2rQclK z{?H$3)1YYtc9$^1Hf{_S7hK@yIqTBDX@6zkwEqCZ8Tf1M$`a@8H#^tM36I_%;Q#^0 zwR^eV0)-kdoFiv+d0AdEwOW#l<$W3SosSmfd++O?rDfP z$8`xlSg!XyHKh57ATs8@71sPmZ>9dyvqcw!_1#-gx7Y4shWg$ZiYm)+ONC}|M;P2d zJuzP2;GYxflYY`4v=*1C>UVcqR)?!u9Xbi5%37qBo7^UP0!DFP9&4WwY_5N3gQ-|* zHd5O*zVB{gkh8K$Ajt!v$Q8p{aEo;7-btml`q-)B9T=*V^mqJ^O#c9czV^#e)NJPX zdE*)GMa0`@jyoZ=Z(<5&P%t^hM{lh|W8-}y%T%+o{{V$uAA$A#D_)xCP=@JB zhfpmfBh9tK;gp{FZsX})*eX~W(ov1#`!mm;V^&_M<}ZFGL*Z@SAiVf<DsI@I7$5PPZgHb@nSb&g+7(9@02PASuetl{m1^g)A7Ve)>@p?hwhLPGh;eeaD z85;&X0fjgm9At{D!!C^}rl)1+Z}K^6=2(cW8SfMR*xm)b)8^8yd=alTvqiO{xVnfe zir>OO2RR&L80MYfPmSIjx{q7eyd&_(UYAirWnl3~d>`$E`GEqBn?PN?dUM;q%U&h; zUE%A07M(Xr@r}z^l~N+SMKYHD>f@j|I6U+{>)k#LTIpU6)4WAB&fQAJ&MQf+Pn&>@ zC14zS^1$cRSDA*)Dbkast2;|cTV}WIuG<`MHLW^{Nv77?Ei^rFc-vppd`mt2-vxEs zi>I~-vD|9$vcZ5=nj|fR$otqIHU>e!t~Xr$pkn(~?vvtA0GTfgOp{u!pb|@OzNL_; zR!1t$f~}F9176jp{6*4rEmXz!$So}r5X@bM=Pt@daCq)N>uSH<5B*TovFdfC!7 zX=7zJ&mE$$MLqW%lh0pHYreG{6rmYY#9Quvfwc1q_R^>1d1w4IggT#xj+QLB*M=Qp&takX2;K}6VmSccV z)9cVzWjvA&9MY)e>1F<7rHjQ~e)CU6d42DRel2S-hm+wygdkZJx2@Krynt5+XlFOml3 zf4X{u&m8?LHhp(X)1JiYT9uqKOKPAQCCJWuk-!`p>Unk!5nS?VdC0%4Vn3a;&0kpf z>-I&tmqz$`Zy_Lg0be|K%8Y(IRI*9&`Q>}5ZT=Zes7V+O$!^NQ6rGBGQdk1VxE!82 zuJcmy4~N|O5^5ImhTWM2gowD|x)6B-gHgYYbSQ1&jvY!X%j^M_D!BxAJqJFYm2x+f zMYQWL{15&J-AeCyGl81dZqmQtn_`A4yk4?rH4nrq{WYhv z@n?oYPb98B+oB^~#htwFjew9G@;2@qaaP{L!d^Sjv@Jr(^u1`FQ} zG38u>2nU|E!!_rfcy8u5l3Ls_c+yz*7@HZ|SDn~7_UqQUU2Z=Q$2Fz@0Eytaf!K(A z+o_t}!yZ>;sCO$2cJ{9hdCpTQ^3$l(^p(FOT3NN-pS(JMfLkWhia3)Ewb z)K-_iIDfp8D%?IaB-f5S7G4qgPu6J{foXK_!8Q~PP6fi)}k(BvHM(ZFJp|x{$Ax{hZ{1X zusz0W+H5{J=@4B`bxj81Hn}8=h~?k0hCnJAa0WYc;<{fBd}sJuC&U|VR_j%|v6cra z(6zYW6)402K{?MS9fm8_hAp(xTbaY^t)`{1`FRI`{AqRK{{ZaEuL^5cnuIp9Nh@93 zOKi@lxnQhD4;kYhjdWfK@Dlj@#8X*Z>PcmL1YpG5!iC2?o(VnA2d#dpjcdVD+%3dD zCxYJ1B{D{1Egse2S^L&q`9;-sezV`lK%jPx%q{ECatA-zWYXvjQ94l$rOe^gpq_p5#pdPN zbH+eD`q#_y>eu@tFi#{xIZu}nBreVh{v)5vRnv;7xsm2#si@SK^|{zsUrBXy8d^zk zZj=zB6Sauz$G06S7E5D)E&Yqz+1|!Z*jY{+ryY9cxu~VQx4B(T+(q+eZuShm>yPQ_ zT~3GMEjLTNwbu15Cd*Z~Nk^S-PSB*DyH5mQ@z(~fX~$Hqakty4?D}50E~nuY(tJy& zwanXpc#|plG0}!QbjQ79>ee92bjX_K6cMYehj3*--RJLf_}6cHap7%e!m(>wO|7EH z@T|)s>Ick#D9fQkz`y|Ddi`sk)#bLEO4CF-l#Lb2A1YHI%C}|R{3o6cJ9IVk@u_Lw zme>5ur5MNJJk2lSg5oQC%l`o0hbYm*7FQX@Knska?hIDsQyTf6zj+ylOS4FBJ)O;@l09|i|mCT9*5LggU^UpwYSa&~XOJO9f z1-x;LmuJ9GJx@SCO7U+Wd`32!9m(*@#(bH7(k{Ny<*bBo0yc5T&JS~6J)Uu98!d;m zsV{l$9moyjHH}5N2Yv5)h#WxzYD&T;qMNt)(BQho5@-$h9m&W2;dHclahN= zyg}oC0@(P4BZ=-V;g&qyNvFf+CA;p%!^rtZQh!SP{P>&kCs*+=iLR_P?N;|ripJ3- z)iontj!rAA()?FFo~xQ^{=1&ajAIFF0meqVQ=8;M3v``)5%*?Gmr)& zWH@5Olfb|oYrrlg@hq2LY4I?)nj+xJk1p=tmTO8mMDf*DBDGZgH~by0XBj?gsaw$f z4fs|2Na=bU+VtKmw9%x{9oR?ZLmN9N8Npvu>C+~v$EtiM@pp{wHSIp@#2yeDZ*1;k2gtZdhSy*)Pdu<7_vea_!m@bYeRA48 zHu~{rGjSEvY84k4<(q(@f1WGV{>gNxHA1HPZ9hc@VAOS z5Ven=;vW!cMrfWnp}LItJTi-=?x>C*+)$k*UHyD zx;1bUjoyr>;Gcq)`cH)P@cKW9ETfxBTR7sAR{KMFTeqV#3vdH~ahz}o71KfR*F{f^ zad?V*Zx&lUgS?X)O;Iun3>7kM4oMvc-oQN8j+gQK!LexiHj{5>t;p8PvNbmm%OfBo zu2-B6IUw}OCz^b}8N3H~Z#B*0Yxdh!hxUclswrh+8{`4LW61#H<>wvhYjF+|aB0uC zNB&0i>tNKml$M@m---SVcsE+{mbtHLSK5ukNu&Lm7Y+ zREE-d)+t?z?g%$-|{sKlmrTnp*zH-Y>aHQg5|*pc3oPD{BbH)MuLe zgUXxxeXdKBZ}w1uOMf2nNypP1*U$d|4NigZ+eN?dzLVj5eG5ss)a1L7w7A>L^Vt`F z?wO7T6ksPDaHE>-u0AVxdryKptx`MNEiO!m^$=r{*@*rf%H)Rs0A+wa)!z(VI7PPl zvnsUOQE#$efztTZ_GmVs05a@FmmUb@qJIlNh5BW0~X>~c~9rEW08>L1aoh=^9*Yl-~ut6@(xE@@cnO4u(0qZx2NgX zF$+O$IZ*4o<&cKSVaD^0M_@fG=>Gs2>KbObplWs+PPu6gqcKR~hUzIJ5w<}9RCG@&O9$+0#6Z$&2G@ixNK5gm~uLQ4mm$e^IxI=00q2h;qMLnJ-gGjT|r~Gmh~o6 z1YU0S8*okt^d2b9+w2LZ`#DWIySGXjPUf8ckvejpmSs=F0nUc>HSAma$%0%lLtWSl7guYPfNtbMpO%l2|^dO88UQS_BojgT3&F%hYeijm)8OAGf@B`!QI+e}$ zfgrK4xOM*kgnlQ?aS{RZW*c#iITiI^>^lyv2ga=)8|!%?w@(f}!10AUzFw!V=U=5? z@UQ$7Zal-`jT><3i*NuQfDQoqR^FT8{S!%I+Fp^TY46ay7V3^`mh|lo#DNYuC z^0z~pj!{|@gs!xAHhr6mF6DPvJj=o-DQT zUA)oh4Gf|gP&l6?7LAt}2PEcy~sU-VW)vHsDSw>FRNQhILf@`76c<%dB_;2H1 zjb0+Vh2*#Kh1Qt5Rvh_^v01coyJxNl2ZQ`WIIo87{vP;l%f&iguV<@jcX#IY23u)v ze)F?sR1Q90ezogg9zH5Xs{CZuv|qI9Q9g-q`gOEXP35sjiC>hGM&|BulYlW_CuyEH z)-8N%X{zcmqMNIjZQ_dQiA~DHZowmI&$b6ait>G(TGdrZ&dX~qy|+h~jdGm%dA-&7 z^*UdOn*7lI)4ny+?zCyN+o<)6kfKQ0T0!PHRvci0JJs(D{9)9*H{!@|Ea#Yj6p&)V zkWV0vtT;Vuz5Sr|Yb{&EJ}>ayyV_n{Y5J|?a+`oaSMzfo9CEB1a9>=JlgO`*E8IvgGbb6%DnjAt9T+TYdtm{feSXY19!k090l8Tfa_ zRu->uXMYOKB#E@VUnwjL5)Rz@SH%AS67>ywPa8*ibs2m;r-{U}D#D^kz+>}Dz~FGb zdisv_(EK&={+2!w>7E(9xEeI}5;Q9n>x5?w{0yXq3!LTgj-AbXk>h_D-gwW({w1>0 z;lRT2@TF6ph5KP-bfyj1p0M14a zUi|^CuV2?S%{#)L5x72dPd1Amn&Lk>%XzYmyHtVLeA&f$6q?PncIy$igr>rvvEcOS zkK{cotnn_PbN>Je_u<{uw8MP5OyQ+@K2lQdQPhs$j+~>v*ACELUED0Imf*7yf&pIZvm+lha!W3w zD85>bDLZYa-`~+Qj#Z@fx%I8azAv;R8{8O6k19x?_jt!>!BEWI`1~uH@eTKdHJbyV z>el*Rv*c~M5L^c{L$?RaBaNFuCwA`j;T{%!dq&Xbx7GY^{vg)ly8AVy{giDq7HFtS z#u1bSCk^|}#CGaA+n-p}FEne*U2jU1BY?Lu+{D;aD}$B{7IIGj00`h>xv1qY4^!Ng z?DtxH`Y}37M(^Ez-wK4YK8yBmAE4NBQo z_8ZM6?t5+DXT67J;h($*Ps2Z6mFG8lE}JjH`!5%GHs@5BrP{%%XwxjV(Z#eDNnkt{ z+!qY2NY5h~txY?`34aatn{y7OZo&M_U0}p`$SCIlvNOkGI@hy}%jFMwzk5f1wtD{n z!~SO2Ou}(`?85&5!eRxvds8kNPc`j>W;O(J!zAtX`FJ(NYuYJmJCSb{z2hM*2v;IV zQH|+S=n*L1TD8wSC!=7GMqm9E@k4*dwT|WxLXD5Iv2>wxN2c zM7v`iT!8zj``HI0j)J{R4P195r5$+==_t=skDv6f6>B<74>g>(8ilbTB7pI+&rU$f zk5im;#w*#h-x6qEA+myPQpU>iU5cV-w*pAtoT+dD>M@c>AbvhKccq8a?&Y{uidopI zLFO3Ii!u3gkWgUYWS_5E%hL6Gy*E*|wbS6ZxzeI};MIKgUGcJk&PfFADnZ708Ror8 z?v5>Xn(MdXVb0UjbbS`E>Y98hHizPEb3~MoVvFt4j02niRFRLs)a~Q1jGA?vOaA}~ z4eqIG&E>1ILwDa9z*2p&UUa&x+g;jSX#ncBzDDToVU!p-ImU7_JK$GarfV`u zdvl{|Hm2I?f!hgPk8zwF_8YODMl)P+#bW8l;=hyrulb!(#!mOWj|cea;!RJ+68K+U z@dfA_g}8eQlW79NOl!)diZ~=?uyLFc39p{-q_tStEewGUIG1bp``G?szUT2*!|M+j z_)w+Fe`8$vpu?yj6K^0N^@@2Qf=6A$+*ix~H~3TH-v`((vvpw>qohM7#=Nvo-L7$h z!>9+>rF;2yWkzvOl-D=s<^KQ!e*-#@ zp!_%R#;<3kUffMH-NwROxbRvQC!7`S+y4O7UJM=!i&T<$Bhc4IV;YVNl3c9f#B=D;^aZA~;SFC$)I2{l zI#R1avEa7b81qL*1P;5fLF?P672@{yI-Q2MYvJpg3t@L`zi4S%)VeP?3@|dMw|;o4 zD`Rsmov2>HdkMMS=EpUxp^oLr0!2JwyL;6=Q^k`>X=F9H?rrtERn4`{vjh_ym~lxq~jONpWyqLIZk>#Pgt8y)3u9twYz3ZM3E))ZKn~uZU|zfSZAD`mGhRh zt=!uDN!8xo`q}Oxzhq{Ma8f_rZ-{qotrcQ*4}8#BPwN#hpTP`W2a;I zRlgDZF1GPMiS*5Q#F}ly>9@=S$JaAfuN71LeXcwscFc~zwHiQLYOxZ@ms?wtC1)_uLVhcydD zMf+W|Zeo}O7ykf(bDaHqSLu%#9!tqddN24Vi!2nOJ6$*GV?2>VBJGw(lN>3=2R#N2 zG=yh&X=HQMuHF+J{3f*k`aDXEfG2oho%}Z%PM>KMHsNEEOXg6Z zj7F-eFspZ;VET z2C09ecs>Ko-N6Flc}`9VQI=!KPzM6OXAP4=g)eC+^2sgrfAH_f_n||%uW{oWe-CN* zx)zsyw|91NuoBs!Skx9I{N(N=91P=}bgj64FLc4h3*AyU z^s6`1bfsS{AwpYfWMq;_`MUF6^l-R5UXg>9o!e^H^8S&krx&HZ^J4SFJ}vPth-S^g z$R~9&;n`wPdmL~x$*#F-JC_S-*G&gWE0chCcMz<`o#CQF=(+v29Cs9 z#3W@x&EIebp1pc|*ID6Yk50IsOuvru?m3xu$LAsHSz$ zBW0o3+G#g7ejdANZ6`9L0&R<{F2)^IbN7b^xxEI;;kEU9duzM9gqVKw&Lvys&I#jh z7#w=nwd)qTX!u5MCxPU-35XfoFBrzwVVvjJ)K?SmjdknTE-kd=u#Un#R6Mds_>hvg z!i;Wg0nE9z}9xS>6v18&ytR%c8x% z3;t!{XGulITb?Q6Z-?F|@CDn--ZB>&SD3Qh$#{(;F5I8J!}Gwx`qwcG`pjC&9baC* z)HIug^J1RN7q^NcFaTh4yPp35(!F!V+UAAh4;aC!&2Y0xa)qF{GXCb<37k5DH*=Cl zdT7PdQWEk;rXs*A4xFjusLgvXz|Yzz;!v<29n>JP z@wS6xRLHvR(N}^paH1(dE+4K3PC2d%RsR5lJ5u;pqPDK)!%TbWbq3SmbY1MqqslFu zoDhA;J*yz-Hd;oxqWIUtwmNo^X&WO;r?u`y%td!8kQU*whTEP&sK(|vdU5s?o99Z( zRpd#A6KoyQziN;O|2(@XVVK8NYwhyEb=GWy7Bk^QemxQKaoI(DqMb|)>mIe;l5 z?IZ@{h8gD=i^9jl`qrU-nkKiWeW<}2&lS`8&2%>4i8o+LyBOp!`EojuUzNK50K~5r zc-HIw5$z5wlO&5Jq}FmYPCy_svMDM?c^K!XUPXGZ!N`6hd^hoB<<_@7mb-6u737Cn zmpl{qR#11Onddkok;QUhYU8gLi>XeV-rG0ltdjf@>|wKMIi*&~eE$I8{-@S@@53z@ zRq#2JB2{5>TS0M1h075sqBN0Id2wxAFsh87oeCvC8f05`*4MK4DR{g)=U46&F z&G6Ft)5J)cKZ%TKD|tj-T3^K=n}ESb*}(g`JDWbky>z}W_%toAwC@mjPfYONi!Bn& zNq=W=YcpNEnI+sqF)YcP{K_+d%8oPi+g<3t+OpoqtoVB0Qg&l;YhkV181ByERU~3} z4V`i^yCe~gYL2m?%cUy<(ml1gTdOo6{O@h|vUxsY?@j;*1CI`-51L=Q znv-5pZ~FXvk0!nntsPprU03S5eqLs0i=mqT0K-#XX#Nzuxwc+ozOjgz6^07}h@)@= z`PZ3S!Ky!oqnhI0{@xiTF-DWyxMpB+-Euk+&T*4nwu`REr07vwT=;-Pe(v98j@mJk z$ifqXNg40o^y{PX#-V4YLw65~nky8KV(>RB6326{;&YBMj=1BT(MuUloOxRz(UOxvnUvmfCY1m;DONNrGBe?4AXR*AKCu^!VpH6x_=wO?{)I{88}FhJFso zWu&}P>UI_h1(>&`uqpYo&(gkZ{giyEzh)V31FVZKt2-=#i4DjdPtv}WI8_P=&TAaYo069^ zySAsfmFrI9gLOH@JRW*{Aq+4<^y961t(DVV*etS$x08eA^y0h=#aQDb9y5eutP1c>M@(1Ht7#pmF~JdzFvO~y=k>3r$I*(w!ZD@qXxr_k zx9jG3_*#wPB;54uKYmHTrB)_Ez{Y(lJ;$DLPEvfpGlB14IZeJ~deYgJp*dMI&&~ZR zlZ3WQnffZDG5P_Ty9nX%+2*;=7Tx`W;m?S!&M^*|Je={IMooLUojLQlrJ_jlFq26r zwth8uhg#G1zlmNY)aB4LBYStLOLlH9KxVis?YkSZx2GLB1cU3w!{E&)T4j^_O4h|Z z&)!dUNZf4hx|1!P$oNYIXlaLzr&c)k7oyjmk@nJ@^hN) zzB_m;#BKXR`0DpbxxBVFPA{ykBEdouHD^aq0Sb6I$>-@_e`R~(m-ulOsj6FOrqKgdEwY`clexVjfup>v$C4&r( zoZ$7YQ&0G7qiIt|e46FfkA3G#lFM-l%Ns@yKPbo`o{iI`~Oktzvjl2*SBdN#u)nckuhr0!P z?`=+OMC6sCWm@=Sz?YF*=}qDbJFP}_E`fmyb0;J=z&8QT4?jU)KzuFHm&1M%_=jmE z9v(A~3EW76JD|xb31DKbPdsh=*dLg$lDtWA;r{^aIPI*w%eV@%+Fn{*tbSiP^3<+D zP&()4J@H|U9RCHMv#XQ2?t@fj^NjuTMb@tZ<)2N z)BQF%sZx`iUHYAE)E*Pp8bHxf$>j!(UBX{+Mj zw%l9IsA;o8g-Lm$Xo7>uKuG6rOrE*t73bo!dXkfBE0?ow=8qLC=#Lk(@c#gb_1jyC zt?VVajSES-8*-4OWMnFwe(}A>{{UF`J|NLNK%cX(!^XMOuC9%;-^C+i3Wx0_kiOo7 z4e8pwKK}qz(@llEx1J@3PPlLaxtw`&Z8_M!++gH>HQLXv*x!6H@XYc}CG4MSxrL;+ z8&K`?%VcDa;vMr-9O|U0OZR#&UhA!m>Efi*R_K0u-^HjHX1rOgpq!!eP0BV-Kf1kv z?UP;Os zlIK`T$;Pa?Thh-@$75PGVDEmWE!T;>Y2qCgd*gQ%){3qg;>%NY+c?N#8cx_C0J#Kb zt#w`)7n+^iJ~h>RQzfvrwj#$ywqqJZz(YoyxP z`BGe@X!EbmIb>EUg@7YHvIl-@wvX`U8w+hJNxVU+TwmyM%E=qJNTBmK5a(#i$VXCe zF@Q7Hy?2z>Nif1}9ux7SRzrKZA>n8N@* zcKgLJLHZH5KC!0T_(#M3W~plg)=(|JvE>&Q8{K3i6%0r`a1VTR@_lyd?hR8_ z@qMPfso%?Hfo<&!v577MHa>iO&w_AQCxON>ir>+EWv*(PeWTmy5O_jcL(}{@X>q1W z;A@QpUJ0X<%V{nQk`2N@dohhd{{VTp;8&FCzAMn;`$Trr-p3`2IiApBNaAEF88F1- zB)4EX;Mb}67h1ov{fl*tbH*MUI**Crg6?EGZMiX6+lL4aBl%00UEpINbH#j<;?EK3 z(|B7*T@p(xtDQpWndG;Bv!dVv+p;(%h$VB$9@X#WSZL4L#Y0|Ichm3kIweg?oIkC< z&vV=Eb=^8`FIB$q^zla8ZO@)^gJ z&f%QojQaZAklT-i`lf@g+uOl4tWyahl?XwwG5JBp;7~CPr=ZPz)8ZJT*8B;jK`qg_ z(QG7*V7j=N7x{r6SlR&$pbk&Bekt8fn&!Vrx zJ9`PWC6d`+{SXPk+T-R`BxIK9)SUWLv|ktn^6rDAR`I^#V{x$#KZQvAG3rfvbHOUK z^;c_VDBnw??+ZOwPPx$})hy=`qsk$?x0DuW;Bef8sqBCYsh*eEmaBgztM?9$GPsyl2<2&TGkZPZDc7&%?Wy(C^mbNMjKH0A$3N zk;mN&l5vnZ1EqZtCa7d%fexVu_y_` ze4w4A6WgIZd)KQeeXCkY{{U7nsT7|wGqep;N0vD4ZbZ6j6e<(XV5D_91e`GK-n|n| z)%3kSDda5k(f~(IM&T~~{iu&?dWb&BXXOkf~L7zcTn4q?`Wu9oDVsI278Tu36zh-hy z&9vWZU;NLGY3_}CtzPH*5n-C{OZ8!}B00`G0iH)Wu6|d&QY0yPZe$}7?;Bkr~ zyoPz2%HB7(B<(EG?<%9*cPFJIS=+}s4|i~7#zSt&Q}jIzZHK1{Nv>O8%lbq=X+2XQ z)+fJD3ThX38iLr)ke@1NDq0{qp120TIes(vhgO@z024v%zBl(*?zc-N%B7S=_qKT( zMsir=2Y0S*G+4wWMdaUHQ-%beb#Pj`7MTn5};Xon!=wg)7R*{-)uhe^BDwb;elY1Y6SWPk7uq&X>Fm}yq;B*Pcyz^Z~1A0c*qCeoY$d)%q15Za^L*T)0MV4 zLE+e=xYI1fwVH@yGTp|pH_T6dPh4P+L)yIyL-5V^qo+rErV9yeC%jlAj_TYro0JSb zNXZ1`dwwx~P+bIsuo13>fMX&QVn z&vbPQH7zod#aTk*Jpzs1_3P22Dwl+{b}F1+w>%f(EylCq{{Rl$>9?1*^Fwf^7h6sO z9P&DIpHt5jH^XgP!?qs-yvxhWO*-yfMqw?;fz81rC>S`}gKvIw=~ccsh*MEiu!-8w zAVn;smXLBo6PyG11H~tWd`sic8hk&~v{+Y2mMaDjM?CgG2+>pIEpmyf%xQmPui9#96T4c+YhpaWt&pLc19kx&y5}Oj z1HziU$BH~TZ*i+x*j%JCD$6F(=B^K3m>B0E9Qz9K4I9JX@R4c)eOJYh*h;p?&(mx} zd9xkZ-TmEzoSgjyYWRcuM^Et9l@Epm?T?4;5Dz#KuXy2!V(z#HImQQS^6O>sQiU~T zH1u}0zIrCbIHfOn>U|6174Wj?*04g`qmY$Y?UT&Q9F7zU;w|)V7HB%0`m|TJI&409 z+YQ^~%9+O@HymT2?V8B6_^oZGcxO(tR<^L6V`sfESnZU2qYA9WwvNGp&wN%#g6_00 z9C(LY*KhUz01;X0R;`57V~J!|40vtCV>tkA10;i7c(<8UQr2$9-1FkzK&n)9^3DR`M%o#MaTKp4zO4ZYP8HHZVXDo;Dy7@*Y^6XB}{O&3JD&jU?wrin~@)P2F3` zr*-`{DpQTRT=1UfRwS+@|{7B))CG zyF)%y?XIVzd??p0b-&shM9}plNpxGOExfyFAI*)np(T!boPc^)+WN1C{57Yi+vl*f zw1(Mak)um>2tXZA9^6;vmxMkm+Fp2#wY%%@5BPFuA=_m%EfAIu_Eo=yKvUblY}e8r z68O)g>sl4oovHY?#`@k^e{{DuLP^<}41hStTo8J8ue{6nixCONjv|APM=R)`&+*js zIp;NQT~X#fCHUQ^&*GmDLv7&=9>+|#e=ROrIMz~ka#WmdeYqenb_wm8)r!i?!@4%HHjQT{qQZG3npqwxNoQ<;H?o29 z?&CePl6b6d52eg{9;2wkr)atwUrfz!Bsz3ya=RSvQUYPJLY#m=&r{aEHy>72YtB_A zDLA`bO|M-RsdZK|qYANi+vfiOLQDSuit)p!-C1b&8k{fYnVvhDUU<=zoNYU?liNPM zYtp_Sd~DKuO*QgZ+Q&Amnp)c1J-osb6wwzk1`G2k`PoCM%7A#UB7?!c8`k_)s%yHf z?1l@tQYW;9zRs@2M)Ko#%t;vmNXI$PZCe>M4L&_i)52aF(fmDSGx;X|(8iP8gi=d# zH%ZmAkU7si>&}{^hH`jR)6;i#=W_Mp!#)!DiFM*%?P>I(s>L*h zEpJJ+RJ;j{gE$`~`*K4w`EUN&>s~Re{3h14Y1dTn>{=g+benjKOMRq3#%PsrOG|F# zl;}?3xk*2GY=ZdS*&;&8w1B&V5`>YQ;{=X+n&Kt+iQ^p; zUW)Ta)4V}|7q?9%ZKd+(yT7;dJjmD%RRQ^&w@h$5=DytU4ymsEQt*rt_=-cRPhuAqdZnGQ zSet0b2g-IF_vGb*J|Vufae1dfda!+#T{2d-c4EJHZQ3!6 z;JyI_ahw{OM}oWs;+xg+2D5!Nx(jAE8hl48vo|}kSYdjSnLB&*uh308&r(l?H@X|@ z@#?x1))MWqIvh}2Oq=r9g;ZoWBX0zpk%NO?1+Dxkv(|0y2Zya9&~H_I*zGS#Z9Y=# zmBT0R;?7Cf;eqEY0IvT4tJZ}$%MYab?W**(zb{g8S#0U@xclAz0It8*hTnlcEBJTd z$HIFb3R`LVrl$wmWNTk067n*T4geWGzPxkqU3~ulwV#E~oGxwjeO(n~DhsH~vbGs8 zM_+O1eJkY6PeIqbA*l;pc`kfCi>5X++oC0<=-d9PCK*z^;|ke0JqX2l_lRWCHTmuC zbbUf=3;Sn%!c+p@S#rdpF5-UiKQ=hWe1Tk*aafx5lxsz=G@s?>amO*mQ%ytiKTkdo zd|%VPA!yh47Z-6`-z~!*vAz((xgaRdEz>8{HMQ}3;_jR9%fWFqzma?53%1#7Zscu1 zPB*Z~-PeWgeFc6_cuQFE9fq|9zL>Z2UztOB5kk(x=G@E*_BaPU06f>xJ}uQQJZ0iP zhLURc(4Q0D>XAeC8REp^H7WCLJ$_t2y?gmq0;M{#jFpqwopf_)R;9}&tatN0?i~Zg z9xeDAulS2l@h+jLc#BZBm&uyuVG_Uq`4Tmc0xhh(FgY3PUz~pnziV%fp9wxF$EWz4 zUDZ5o;pi@mI;MxL&Tbwst+m8cHeNRvIOM4#kVSr=Lu02$@bR>(o52J&@GqBh1+#2& zdyp7mv)K1M*X19_jSkxL_R{ff${@G5x?t`Cg;!t#?>fSMwDYMTIykj z#LiNB?tbuiQ^gt|j(!*DUNZ3I%U$T2wW{1&y9_V~f~-3_uqsDl4Q{Rh=Z<|V0MQ^R&MGBMmRI)xf{{U&2{x$V_hu%2jJ?rDM95ap~I4#ei!d6a|q|SfG z9wz?)ghSwui~LO+Mkmws$tHlw_k7%Kk3aAxTKN9};n$D+Ppk|z$EyQpjt>9~%7SJdAV?2}UX5#l=uHwfogRl)QVA^w%~z5bJBqyEfa z67dqOPvKjXbwCDJZ#C~?X{l3}q2^Pan)N>}yfAIXkoPHl1Z(Dg?&HdG2N?Qi41BbDs3a&100_D;Bkui^Io;k>^vDh zpQfR=)7}g+OytNw!7R_p&37uOD!yRy zVgYavC&<DsUmr! z$6@-`_1B26HM`3zd*;)1NTgL%vbJr{o2N7I&Ie?VJ_{Rav46%^`D;m{b5~Kf}gyJJQ|wg*A;TNUoCpM#zmKXhKaJ z;Gf=YVgTbjkJi37(|ldxPX=kS+iN!Zt=^jnZGuGxSfXyk@t;hePSxnPo+a?i7W!|9 zZMApOZDdHq){SZd5wwySLj}S0L>y#~zz=b8)9?V#ZxO z$Ym>aawBVOVB{jOa*fD7{NVMkO4YneXQY0{{vOoy3DVz2kHmU}6By)nl4IoC?L=$? zoagTYz&SlD=ezHUKMgh8!7i>0w##&UsLXz2wm8EPw|Wi;8SFU4Wccd-PZEE@Hf-*# zwW%&GQ{t`SEQGY5yK4xDLGpuuLB|5U95!1jv1+Pn_TO#S;&ov#?alLPqx_4L{9^F_ zsTA-}t?Emv!k;Wt#$i~P3^5HD;O;s3$>1E|U>>)@-xr%qw~G5+wbtU(1coNLFejD? zY>m$!PNO*h9QUu!i@QS=%av&)P;=&N!Ebu*^dB8+T0WC&Z>Q_JyIuKAlUqq?8{6$9 z<#{=7Fmh|x#BlZ=RQY1B{d#C!Toi5YpR9Urv8VXAN=t~|&gRZX1hg}u-f`69qYg$n z>06pthI}r3S*L0?(>{l5r(G@dmovzc89clg;v!NNut98|2N}p1ugtwK;x4PGMw+tt zvrq8<0NKeyXABOk!{#A!sz4n;JaX8tWbjAEFB@I>lKF1L*FGQn5c{d1Op*=RYEW^7Da_UoUun#l9=nK0fJQ13nqiueDuAR2C95NWiq4v7N;2 zAxI}Z2(PZ~ek$ARKMx1*SUS|6wp;J_J&wFxD7ZOkf6M&N z$42-+sQ5GCq*_#7C)8~xnj>z{9l}C`%s+GiYE^*F06EVY>TB~u#=o8TjoD0>@%F#zlxy< z(v;?`mA33e9Hq-nF8=`6`5&KO4ZZ<*uSD_S@b!(PSAIB>#7}h?WG!lpp@>Fa5MYe4 zZ1wl9)(;L}>HZ|V({*^SZFMELSA^V3LZsO*7S{s=5DMgEbH`lQ-`@#*E28VZ6*|_L zs9sB;UU{=#YBJmel5kKVhCBe+04lVPgTV?pBz)uX=irUM!|w!H_`AWH&g~;nx@%c& zHMySQi#vYoTc}V;7(X#TC|vg@youms+-q9@06zO1)i7#p+gJWy*U0k?8(8q>ryJT_ z#SQ+TBQCJZaH;{>^8onI0f-&24;CtQ3;1953Ga1%4%xt!LLxMPjEP9f z{G@S?p!!oZ&2?kYWqm8g7uwyVT7s7o%!uR$A%~Xd=gxnJj-4x>@!!L58(nBOnw-~` z@L5~ky4%~NptHxhKqDMul5w2ibmqJ&Ju>nwQqssxc$YGjDwrxCCpr3)+ZCQ3jSO0K z9Fr=SB}lf<(|apBNo=(Et+aI1EHEXNBDxmATLS|jNa^kERgZ)rx6oxUX~lH8Au867 zB2IviRP`7q2Lv84Gmb0FygA}qzYO>@PqC6~`yE0h5X|z*&k0_N+d=1yqG8bponscCm;gO@T>fWgzbP zatUuyiuMl&_`_Sb)^$r=PVy;VOqxh;TFy4|NKuXId#-Q}Ivx#Y-Ct>UGs*T_sbpC4 zRRpYj=O>qb;0)&+8uH;^9YU+6TU&M4`uU^Jt0tekwLX5h_)DtX>ha&{_o!O(W_g!T zbDMLG-#ma|6Oac|PqjJx7pdNOBL4tY)`GzXpZlGUCzEw6_1hjeU;*#PzH8fOj>lTR z`yjehbc`0bSs4{QNH{y&>(>Ap>#ih*3nn$*NW(`X6OIw$2QI*w| z$3c$%)#e&)gjSY!5F)`e2&G|#gDA(T8OD7*>LFn~_n|H0n(A2BZX)~1pKkU0l?qX% zSKYc-->KqMs-+vsH@efv^*uDfb!TevOAV|qAde9ON{r)i0AzvfUO(cGioOuid`qn8 zR@d|Dx}~U*6UdKl_FRBQRc}w01O;pbw3b%Zqe>u$~CluPqnhJwTvp;D2x;# zRJUGPj!7pcn))Ng^Z2Uc;G+1yL%6q_!mh50#s2_!p$iNF?T_bQHQnl0T8Hf0VX9wS zyWDCTgy=-1vY63=2EhLSXda`nugUSys;m8B^=U6pGwbtMQ==!zuB+y8T21xtsqpsB zE7)(YtQPb~_GEHiWmO6h0Od)>cMx%m;=6wm6`SG}z0?To)|VR?8L*+_hZs2O5MZ9< z(s&nMTb)+xO|UWUu!dH?y?DaNxk8{Q86anGIT=0cH^xl*a_AP)un@dz3wa}%Np=t;%z)fD^}m}JlZbRF3|hEcGJT%YZ@%@OpB`9#T}!h;4-wh+|85MracF} zdDo70C%x4t(Hi#R^G>v75Jlx=2LJ$|kFpQMm{e4Z`l25rmh3&)M z>kg4DPaUFrd`onsz$wnkhsYN zabHc9;HS+hk3`mkf^m!Qq4@jphs0NhSiA7;`cC&2(idrqgTJ>y&t2P=hhrBd(e+^q%UOeL5U1~`Rh|+k~92iyD0LmC1-1D9*vUgfs@|1G`(BEUkJV-YSx0@b-%s{_gB%j7Sse{JcZ@{oK8$yORlEp$0a;>%4o`4O+j+;jruQS&)eGcO89WKnx zb#RF7HQn1VEg`_bXCE>3#~h0B@tIw0Wm!tB+NRa4pI__#2`-GAyLR$4{{Z1>-)nv| zjCf+-Q`Bb{8`$2SOk4oQL(uNV5m!FuqwzPyKN4wDYMNE$_KB%#b6)PbkyYKTm2tHf z?&L3~IXTI%Uhvd1LE>BK zJ|x{3wR`J54o1ttai}^1I8s1T2JG{&h}orRNrx&rkR!ZNgGYMgIT@co$5+(MIbzEh3q- z63;mgaQOo)F_67^8R~1K@Lz@Fw)mkd-uP0|=`F6LNfPD%0Cf`#`EJ~T$__g971j7N zPO-aNjaBtYhlcF#fPLV{^8gQ(=9F!L!eg%kCkLf$Ya0Imi*Gy`s9)IlM&5IEY-iKr zNP|YaI zTb~cFHG7*KQ&6?jY_z>{-r=q9CBD1}CAi$O6-e7ZI*vmeb>g%q@sEl8Q{woc(Bp8? z#zocLwv*=1YzZe0!0%K($C~-7IDcZfBM79Ht!V!JZGTIP+320ldhf^5#F}-Ng!JQW zr!B**(9H;VWe4wNq)p_p$RrR(NGGLvPN`^g{{Rqan%j+Q!@eE3y4eDomssIb)fKY9 z<0Rnv*VEUH;9UbihVR6_Dvw^fmO_m!%wM~=nY!T$7TOOPIqU6QrnRDYKUcVt-Y*kb z+(mLk(OSm|@&O6}d~gWM9+*9N;=1yzeHS+u2BPk-XRGse{8~nS`g-hh7rH*A+R|zI zHIB7^rOgt>J<1lA339_O9AQ^!0|PnvduFygTc&(Y@SlYeX4|Lf){Er9_Irrl7^4F@ zVV(&m13Z(TL0u%CJ-hIwrH!<4=ogxj$smNm31?I|0HEg`+dciNzlS_wuK2d<`E|Q_ zwH-26ZIWHU#y3;)l))Q<B9y#Haxl3Ap4sbP6YAd# zHS2#EYAvT&tdK_{$pC}*o0YxKTydQC=DvsUXY9e^{Y%2I>Q|m3(KPsEW98c`G|Ub% z4;UQ%O?&ui3lSCdSMs{*Qp|A?f>3&T9?fI>V)$x(bs^V0E3au**DvKY>{@`5SV#B5 zo_OPcdK&s?!X6~>hl=f=Q}F%PmE$W0jeN-9kQ=BEOuSBa4i9cKoLA2FKeO+EJU4ye zYYlSJ_g~c{c|Lige<5YsU(8@WP`DTX_1n{}dmfkY>%q3sCZnL}ap)S45wx0e3we>( z_`|2vW3dOlcf%*Bw3PMq{a5)l8Tp+&z8$vIb=$>*e3~`eENx>o zn#l~TnO5@=@}%Qw$r(A|=Dc6Te+hgCf8ygNpQopWHH&NfzmXib8g!*TQY4LX@i7hu zJHWu`1$xT(%f!AMxQ^e(R+e5R)1eNHso8CU`aj`0i198#IU^irBDM7WL&Kgh*Q0$e zQhiF{CXzw0~SpBZ%%`RewCl;3xg?M69w0Uv1<`~F183b{_>0cW7W5G9ff3~g0u@#NfdIpEB zNpmgw+p9`j^1{QtKC~kDA{%P)hB8J)<~ET*={~ydhy!6 zWw7{${uua?;%hxC!+sdGy?sTN_J6WSOOcg3OS$s%+%F#0>d>hyONzF!cYo8j+}rvi`eY?>*t7()7(9LnYC;fg{YZz55;N4sprGc;de~e`swQDL-j#PWMhf=#d55 zkxCyM$&-d090vpH4Shp>@x#Q|kX`BGEeLrCWK=fFn}E+uu*v7Ocu$FMv=0(^w&PON z?aOL&Mp|#PT@;E&0Rn(OhlTws=rK}tqiCxy>&)Q8!`ZvGebf6IIX|%Fw$cj!0K!Fm z+y1$ZovZ1%H7~Sl*Lr{0wJ4t5cN>Xqio*RqM}=ct$2p3 z`%HMRQPVE8vYI9JvqOuCqq2Beg8bP7en&&dBN-LvbNqktp0TFh>9Od#JX&?sA{iOs zXKyc(-0#QDfDds`>XqBKC*}TRy3~^RzcbG~DPiIN01f;Rg{4MqO6J^uh4*Df;yi>oar(p@(ER;DUYwuf)= z`&l->9kmO4H0r3xpyj5Z0JqN^oBl4{DooXpxN@x@o zl*T}8?E9yafO?-=_CFPPr%3URq`o4)@ZFfym2Kde<%I2#6+}^F@5jiX0fC;GJ!(B? z#x1LOOGeSA(X@H&G*y%AHu6LOi+gT%QJfs({5>m%j}KLa=Jk{Qx|r7Y<$I&#{clPE zSXm{m=Ezo(;1^aI$pCci*WSDnSQoO*C8NPKl0?~)3!S}lU!c-jctcguEhUdaiYa6a zCR7lxAPxZxt$+_WKD}zDnc=SpO=f1FN7B5MA1F3(MmguQ6O4A}`d7VA1z9B9OqVvc zKRK-JP0afce-?T4^slP_0A+hGvwqzEAF|4Amr2!NAROm@n{mZ`52I-w3DY%XkvtpW zr&$5S^68eZvpv9Q&m+|5*jH_)>Y9F$;!9m;OVc#F9Y!U8vs^`|+AA<+DA+MusZ+GD z?U2~-T2BipMaQ{usb-r$IW!pU)5Fuv1^zDfl#(NDxPgw$d;5yLrue5>@OG|m^o6ur z$zt2*x^89X(BuR7SKCwH_;qzOw9~vd;oBHhJo6knZMyuV>BVx>c!Nl~@gv_~c!22=NSj*EO0p$TcM3rRIO=_keR~IpqK;^s=z2x0 zAP|x+ooXa=jx+nS(DwtH>vYXx!&cLL$u#RYX0>#U(CN0|$PXM756$a?jC0L%!z!l_ z;m4QK!}d^1O%I0dJVo%L-@~zK`hJ_@Ip-;|=6NR;{$V-G5E;Se9C5}g)h;hI_&?y2 z+LgzL+Vw5%{wqVX?JT}zW=%D+GN%N5zSZ@vr>%_}QE2qNJ43LK$p%RmO|%XdsU?bJ zvw9w$l}$WRbE|3B0`u*b_AMgF_QGE-2a^POijkFF!x+yz8WvvpT1~xrzR&&vr4imY9|SdhTgCEfQ0rIFtd@~(YgSJw!v-q+OOwGEBN@Q& zT#Q%x?xUz#!+)#l_o|Yz$q~AdK2~lNWbx_OKSN%vuIRe0{)slBqUpDGI#IY-+S)zR zeBUY9-!a|D-NEOtTJEQXpCk8G-ktvdLmHBUlDqvsQ_Z|MHLVBYcCu{zAE;hwGBe9> zbz@>=mgz7+1Sns^ovV%d8JU&0L2w~I8y$+3i!U)#xupC#bFFu zZPd(yB)E7-m{XI2N#~sOHPPL8n^Dp3zT2fUX}YJE5{op{fjkIqyEFUU+|VgsoP#ds$Dh4n>~Yxhe9$6f__n)o;~Wf$NvC` zHaf4s2s}{enqP#iuT7?s;nQ`)tLAnj~)9<||mFT;Ne$E?1g4z;V_TEelAwy-cz$EYuX zmFK7(1$xY0N^DDb*etRtTHIeQ=yDsEWy^8?(*Q{wb6zepGK8d>clAdj#YdXx#_-;X zECW5ShP1Ej_*^SZ0T79|3>H>DIb}UZPPi589v<0!rq0JwR9mZ%miBj&FvI5pJ-@^W z$0r9E@6ADLtm!5d)9&u{yStbq3cN;Re4cRF`B$$z)n~iVPnIp?0{|Sd zjGnzQ!SCr_ORs-uUu$yfaOirK&E#auZ!PRfo?W;HcGe08;7I9{$@CT1_*>$g#-p## zW#SSdnX>SfIRoE<6oZaNPCENnr$?xD z(|%v@#nP|r=W8B1bvw(5>{?+3p6bvFDi&S2FTmV<2`w=f7SG@7h3R!qor9`YT>SsH#Rvr z#(Q99zH`((KjJ0T?^fT!w>EcRLkxD4+$_r&WAez)z|KGlG2fp``+T1tLlD}6Y5b2` z7?@AtJuAYVD!0G2h^#l0MI0*y{HYI_EYduOepN6qK;^pR6OqMrn#$=BXtF|Xk!@#P zuutR*cD6k6AR{CaI)j?={byUT@C(`aV&71^v7Q(L$*9>#98WVgWl4A$DV%YG)aMwi zckz4P=#W`oYL}8Ma}~TLaD`7H#z6zq-#)d?o#1CGv6Nnm`s{LIskvHA)>*ZCZEEJ( z?(L>XBQhe|%JReza9y9bZ1wBSXv5>JR>=K|`%k-`ATtBoOiXTvp1Aq3&V4#n4L(gf zQY$8vai-e~cHa~~Y*?LeI=Cu0$j%09U&G!YNjyOb= zYsj2#n{mC44qmMvv}3{7vPZcz*$){xBiHq$kHS|nGnLb~?NV^L$@Ue{9|h_jP?dF! zIz|WP5=cXF?oJI5_%h*B_qT|zHgmR6Rx$MN`Pc3aK1Yk}HQ41(g>Fk{`zGz&95CA4 zSLTn!Z-`obr^dV6I~dYv*8XL>Ns+#7rvM*8oQ^u+SL(&rf$mpKyq+Hr{LtIEOlM$x z90n@=jeaodzX*OICyF&&?Nh^-<~6uxlJFt&-{(I%4!F-fGmdM@%~YHsqK{W6jA_K;7jbU9oYm*>j<2J5Yf;sn!%>Rq1d?0EQRGKla6*tj-Yk1?0qb5D z;(ME`=rkQeU)87n){e-m_LnGl`BHIU-hT)9hgqIc9jZFn*)lKs!W(>t=m1fldh_1{#ba;a?ONjg z;!9Y>i5Z$AGmH{R&wiNg$4dH6Epx)l;Li)`52aq;>G~wTZOnH603dXB$S$Ouo_Wg* z`*f|UVdSLwdYw-LDP5+uKIi?Ld?N;x@DoO7ffh;SdzJuoEXN0)_!U3KZy)LUEW*Zj zmO*P9%PdjbV~&&M58U%6|G;cqj`Z*Bvu(#XJ;Vg_&rZfoDX4dOj!!}g5vPOGR{&wp=uYSGN_ zCVtF73ZNh0<7gyy8Sh(uHTco+{{TU`xbVk?^a(6%bl4g%w^~GyK+Z@y}E1Zu0g1nwewQnWV>zBBcS3~t%$G#8o zUbFC5#9k-T^fuD3Q?oqt^cCTH_w7sLop0e?--WcPwGBq@d&QsoOYDnpJhAN?;yYUe z;B3eM1p>H_6a0794~L*WB)-;TvW-?5wCyiY*isU|bw)VG0OyRHo`SmSVdGXQJMCw! zza@K|RVYcyUjB~Tf0^t4I`C)2SoBNn6GPUc(VpH$TbL|w5VVqjS&^J!4g#;sySeIX z3&9=-ihqMARPjvK?|B@%;}^qklvtJy;1Wh~I2g`H2E32P-?fMQB|Z|d@ZW>9J3j~L zwpK|6oOe#QR}t+ynciZG&R?8@PbRpncjHBn@c5o7HJiO^avkm#)nK;WkKxG9I2}6r z;<1hmLYjnK(qGlz>O!K_Y~9iJCb4DV?+W}FySmiuQ&HEvLA%MnFzhV6@ACKMih=;^ z&>zF(U19u9f8sULEa17-G^5Mutueuo^Rwpb>fb?%!tn>kC-G&Lp9ZU`>eu>&WA~HD zcErE|wN(e*#xb8xD&C3lYemq!IpRHJ$szGX;wUunv>26ecS(W|%mxSJ^{&dasnn+! zG*_{S?%oveE~()UhFZp+TT71j#3B=U07yTiP)U>LdkiI3s>`kMAt`01l-ejmH? zVq3`8b~b4#WpoTP$j=N3I6R8Y(5EOmbv0cF>?1AGXK$+b!^F0lmA8epWYgo(rn6C} zX||zES24)k$j6r5l{qIHa5@Uf@y4O!EpJCv(R9au3<>`L(VcDsx9-RTV}J^%DnT6Q z9c#=jJ}+p}c-K{HjX7=q0MP_7TugVRyk)_1GstWX6m`$OD=S<0jjm}I@#>x*@#T)K zr5RYoVHe31DszPLTPGOj@va)VMjo?Ln!AqI>F8*co~-k?J|(#EF0pZ}YDENBUTxtl z-ekm`rLsM7jGt`RS7)jCuSC$L)BGK8sc6x$GDucs`$XlBQ6N7$oS&CH`qj%TnEXYg zMLqaSjaFrnS486_+c<1?2Lo@Va{8ss<%I67B)03pKRYNTa6aiL2e;CS_!TworDf6V zXUgLDD0rL1y5nllT0Wi>eOi0lw76+zniNyK3AZ*!1E}p;)|#Y~>GGmpEs`nSx zVuEPe=(ICUa#2e$KYs%_>Co|9*zCTaFEk*ZPfyT^Qs#RfN@%_p)HLrDLpO|kYxX&( ziM+cQr`)m~zbldmWe1J|`*g*9ulqh+>w0g(>7el_3v6ynSuEEcca{eLWrst6LY{DI z^S43PUd~~CtN#GP4K|A<%7?s;^gNMF>$m5~XU-28;B6V?iuH^C0NN|V{v5QAP0@8V zzFQcvaMq|~R!{)hf&uxkGDjSq_2*=C<4+aOQtnAAn`Bc5W>zC>0z$6h1_;MLUW>w>C9;FzTI(8BtLiUpY|ylE#O6s6NL2Y; zD;Y3G7d+&0Gn)Ln*1j-B;y(~at6AMoZkG|S`XuwP^0?SkuLC$a&N$CrweLD#?Gxd@ z3HWOF!}=zHdv#|LWv7neRqy5Cmv*!J%bc+*$$j)JQ- z#lDR-v_571ps;udWy#vIlI)qv{{RaTGsXu$F6rJj*0jGH*si&x-^9P#3lv(Ok8;jo zUHIOmPVji>SDrW(=bkV4`K&HE|CxKhBCQaQAf5cbw{R};la^}9iS|6%j5csF!chO1J zEN(nu;q{Jf+RTA$?~xU-0LUAT25`eU9c$(v66$a_#IF(RQA2Y)7njmp!t+P5!n1Ax zlyRO%j~QcS_K!&m>C9==-vLKp6U9R(6pd zqZPZR*L0Q0Q##>6=OLJmJ*&$!zlqZuf;AZK_PTPho+J7x;Qs(R%DMQLbsF5;>F+XH zmpI!i6u86Y=r?n^B zthGpC@~xHvs;>Z$9rz=jy?fDfa3r0~v!V|*z>YS<0iH9DU-7RRgW`#Mp>;l#cajSq zFyRh*uYdE_sLk;iqeq0`}iwM`<3LIN5_CmlUH;=E?Z$2Z~ON$s7WR?LPx{oL{FI(4aZ{Z`?=BTcA4 z<4aj4MtK#EBj<(~{-0XPbsBdqN1^N50IPm>qDvC-QUX7#~kPPZ5i6k8#wFDSG?CPZ!M&_g30Y<+(04Of*$L% zagP0KKWd%(l;C$3@ZU*sX)U-BI*`C)VgvQ`{A<&E5p!*AuiPC$t?urpwU#?rHxzHQ zV<-pBm-QWqAal~bbf3lY+1c8|1*NkX{hg+n9n!)C zGQj~JL-0cbyRZ1u_SRbq+25(|H(Jf@&Xl6;kvhoW#8hMJmhJdf%yUUKgb-OR%#wf| zjBuAE?FWE5a(erU@u>bL>eikZI%NJHwbpKB0!O-->~S&RoR8u5JQ_6Li~c6FxVT$A zHqy$)VhtjM8;cqG{hIG&cCo*Z$W-kFlY%>n@x5c>UZ<`2k{v?G{{Ur9gLBUtkKQ*aE1U4|#Gi@!C8ni5jju;zX$vkJ1U_?-w>c#G z_UE3pq_Iz(c3;=^xtFl_Z`AsC;^Bu+_>&!!Fqk5a;7AxOgrgJziDC!?-vHN=o2PsE zibH8FzwX_nmLS>edUiP+A4+bw@z=+C$NF1cHKw8?Se8j`!z8jcH#tmgCyq1v*UwUT z>%|&(h_xB5rL~IYX&g%Nz^YglB#pfY^c|~ec%`7HMV^;(!8}K4dAif+@=vZILRC-PpA{@tdVSMOBl~>BpDr_yx#SG@ z;=E5s_;c|STGFrlN1%8=#2U7Umx9`Rt1Cv85>^|69Cybx#ZoSEvR7!@>M_;W_HPb+ zMV8mX!%S<5(XG=Gv{)OI007AA$RA4UEc``v;s_!|xYH~rxn&SWRa47CF_R%Ab|j2v zoaZ(36X?43n|Cx?j*qL@ws2#X-PE726%e}BEiM_>8_l5zj67Wrax-2{e6kJQD?dY? zR3R;osqS>k9Xe?5BWvs19fB!@S24N*5AP%-9OJ1Ram99)R~{VIJUf4&So!yQw2BRf zp0YG>uij1UqvXl&gP#5C;|pzP#Bgd0dueSyo{@;um`erg&p8=9*S2V%5jD23pHR8* z{r$bd3zb=od z-P@ws>l&=~?}V1p>eVE*I3LEdHaGxh1GhZ|X@<+OH0pCgX)vb;2X!QPTsp0%h+5_- ztYy@k%M|dv)Y5NNOsO4l^JD^hcCC24IX6&qCpDIl<`gbfs@)?fJrZb!a zk@T*n!@~9p;|VowRcOLO4Ydfo(-z=<( ztvrh)NOuy0<-<1}J6F@qDMcx6Yg)3g;&#(DrShA-GsAZ>S+Nk9U&m}i{K3%b>Nrw52y!1=$6+j6hTKM`HrWPi~*0vysDUba(W|y&Mf`4 zJ}0}D>f-7-A-0vVEmfB3nTOG#H&#hL%$jfJY zpbawwDoFQ+WzTG?9zMM)jrN(V`HM7D#_`1Yjboix80ro%N9t?!Hh5gqOGBraOD(jr zLE;-(E+vROk=l%Zt~8UA4VW7v|tWGRJ8xi$xX37$B>&XB>~aj%!-w zt*vxhi|e?gHjE5XH}<@W!yx^{bO-SKtIV}+TTS~#w#l`;B4J+NQMZOdayfMf3G3gJ z&TA^IB-ynpjY(MYZ-|~g@idx6^|hv-qTO0FB_22OL&k7&3X}v8F~B_jmHC_TQS}W& z$BibYvH9Uf@{xrLpImhMSKXfxHH+AE4M<<>I_KH$E(~&uJH=gzyY9-kUU81(8u+8) z7NdPP05Cz%zKN!lyhUrRJ1W5)$YQe34ltpkVaD8JuS{aT12L@URVOWvLCL#msph(V zjcD)}a2fNTn02f@V@QfymkAioa6PNiZLB6bbH>*idaNTPHOy<1-)SeGz|$=}Ijrk8 z^UtPfTAk;XMhrGjB4a$3W#D7=uPzdow7N8>QKs8xnb}$Wn@cdJO1aCa zHH>QjNr3`myngowjl(?S-m))j+SgIJw-YHbu|~oazeg6l|50b#7#8M2i0u6Ek36`wWgSCtsG}!w5qG^gVL+`JK4PClm;aCAQN7d@cITC!o91s(ni_a=9O&s`9VEBaa?@% z*yvSc+23p457RUc3Z%BWh4Nn`nADlohCjMj(!7UO_#n0RK-Ok>?eqp*F1j5;qtTPuFQ(xDDxAA_v>4hzYG@2Z?!I^D>}c* zVjIT=Ky|{dMGab$r?0j&Y%G0a&zm~73`Xqhn(KVKeHfs zw{pfafPS^1r2IJ5_35OKMA0rU-Xt=wub8AoO9>f1Xex9;C^f$)6%OARmxuRam30? zMto6o@KeOgs2E=TC6%yCpO-xJ#dLPRv!9O+lGiD(+uK6FGA`!H1bcL^u||z8-lhJS zmg?I{RfuuHZEk*Z%kXQ)dTv>+cM^Db z+Z>&_~mHiEVmD_1CLLMlgU7LFjr2Q+;bw32@x0>|QOo=Y?50vo$>U~Z}Pu8`e zi;Ui-)KZGj{P=~gkjIq~I6MS|g0!m*={sVD%R6N4jE~2P`-fNX9*D9CWzo&G`8$Fn zGJN3lz&Xx-l}5|J`e?tfAK8{-^5B++4=3h3PfWLed{=ywV;*MN#<3G_$s^-c(=}48 zKoTH7E+c%Oeg#^KOw^>jOFy!ND%sp(eEm4>U!)TF2TuD#E~TVt@GLy6(p%@)slnj= zaa~Ma3$V3C{?F3EeS>S;*|25x8@A+r1lK$&b2~;Yn@V#_R*%d%^qojc8m^j?vtf56 zZP<1g9D3A4Le}F`n-Cx@3p+x}EA+B|2tgjEW;#{VLh$VA0`y zJ_~i2ke*%4AfCK1By*2i+IEk{qwHd7Cty)C0VBbqx%&}9AWHq((@RsNr$4Qe&B)E4R;*_KJ6 zDpc{t+zx$fB~cRb6&C35fuibBT_jULWmZgO6f*(`Y&JhSvu~x|25~;0bkIUK%yy!Y z*?BqZpZ>jlA9bPV@mdlYQb`aHiE5w{dHG8mo;!{WGR_ELx3+yM>sf*T{#27kW)N=2 z%!6!?lhcEbpst8Y52>87RTo3UUre;Tx3&qTYc|F>m+f=J$s)1oyeT7YayyY!b=@CL zw`dKa@kPbI8J6nOBso5tSc6{CE}^Hx;zI=XFp|%;rM<-A| ziX#{p>7CinsKsb$ejeBFu2yLDT~AVNxmn_!Hz5B2YiQ%~7#w=nu331Z5#lz~w7nZa zver=qkfJF>CmB)Vc z??TPV{z6!)x69ecisKWh~0@fddSm zlmRACVEgCwrs?{GcG|3R+S@>=56p%FM1wixF>GylSgO6xI!^)X!qQJR zDP79uAsyOnVcVXq$E8wV4EU1FiJso-#B^D(!*+dhz|DJhm8fY)PrYqNPB#|H+mRx; z@}Hi8a*QxKo|QJItLPK>cI~wN8haTZXa;+cAdifEpvE(w_qd`}Y4YCREk_(pTkd!~ z{uS3-V_h6ssRv~EP&3YU@J&Ga1G#A7lr}j-2IHQ7xfR)JGD7knC(bc+A&Tcc_y_f> z_Oif|?2NHd^D?t=58!Hjta}5*)!yeZY2nh7d8Y1UbCA0?ZXaGnb+#TFlp`6nE2d{V zUN#2|GCH04Ju2O`w&_ui?)^h@39hC%VoOMwNhGJt$2)RA3KZjgh4q@Y+~9RD2*7m- zSNl=YR_8La0fGL}WBOMwW#GYgsZVPZmRByz@|I2Pr`Tsdje5qlU?jLn0+zz(%Poz+ zoP!#sCJ-)1_@0!?7;CR<}9({{V+~P|mQQu!f7}Z?mdoHaa(a z{&n2=W8pTDabo(7?x7ALK+K;m-Q7U^gLTIvy?SVZ-d!HfXkZdZz;2e=Az=~6LUYsb zsqeJ7Mv}5ieg^o;xDlMUpxP^L`=&)UAzCBz$K4x~#ir*8@c zZU`*rlh4q1^sM{84Bx@wOY5U7&|7KpjNAQ|N8p@qS4A;nJY=x^YYrbKNYqH6o!=ur z$_GBb(yy)5Hu`nRyt0<{nGAOC1>>oNA3@6Fu0}cbsHZ4sniP6AYv_Iz@g3)f*HO_t zIpU2@+7&N6(CMyi;^UF#C^#f{^zT_3u(^{^jsg9bcP#9z$fFGj92l97++cO}$6B?b zc$37^TzNJgAh*&i#lMsxxSfnFy}{mF1ohy3E2x6P*70V)@fM}vonugpV9TiA>IzEZ zfD93+ZaC$S(!DG_I!@fXl?QM5W6GieJDC8xW_a?b!FG}9gOh>UwIrVE>fR!L(>Q}A z!mf6V{{VZF`TEseLVYrC6Ure?D^0L1wPdhMi4c2%GjIIsUOR10+9cHUyS+|CVX{f! zv)i}S5160Erx6KB+kZnkvSuWjjL&lM%PDA#rPxR}md-tf4;aYBZfcsP)}?K0JKo>i z`EiJWA-t#n97d$%fCp^UTDG*0r`X#^f3DqKBL4I3q-|6Fz#M_~tf6rZ(gm=Rg_P|U}&MfB+@*}kuQH^HSdP^T4_+;&e-zew7+oifN)p?F97=TE6?>0 z4ryy8)%LQVZI&anERf6%u0a7^iNPICaC%p3HQQO-!p7TC)1)%yDQuoNV+)LY#|yjZ zn&UiE4yR?On~1M(mhwj~(PTVw`fkDJ@imor`>myM#ie8B4QIm^+P{jdv2UQ>XiIR> z-CSI}W#f$F4p>N!>&X@7ekJ%(FWaB~75BsIt!nS(X)Z1yg6h<-C0a7+#&S9H4r|uD zW8qt$5o$@PH-~j0tN;(4qv^8lJdS=+xH#{Y=D0hr1-*o_U)*Z{01`j3AbM?(ZL+?fI<^_|6W>=bOXuPvW|V%!5y{ z+48R?l>=knE1P;Q}D(7P3L`|T!T;! z*zFoft@GvNgTiM=ez9gE~6|%hF0bf2KW`a@F zoxo&q*QP4{mx1*yLTf9MniZY71eCkf(j_A~1(lpJ1Rvq-I~w#)4SYQDpNi}P-S~m5 zG-wVj<<##Q+7uHQfH!0b(4w)iopFT`7mPZI08LPQayGq$N6(mMYD3zv!2fgSP> z(z2yRy=|wdf7ZuG;4$Ir?E?40`nQJs69&6vGX|*!vbOU=NDLSkc@jW4JAodA8s_|1 z*HS@yqpWgjQ<+35a|A}^vJV0`kL7&lx6lgopNIbd34AxJ>r&mOxTf38WQOY2co&e{ zL3Wx|;EbFA$KIm&q2R4IM7%%Qnw+u+VH}sP>ZUAU9IQ%Jf#(byla57t4N23#V0u}# zYn}_I{3P)W``lc`K9{AK7c)ny>hM}f_$MV**dEx%Gh13Wgmp_TVraq{=8SxeWpf<) z2c8PJCywK#YiZvMJW=8;K6~33wQm&LSu3o<@@P;(qr4%mm9ywJ^XXKDyJ>guJQ8YF zGqBsT{YjO&f^Zp$ABe6h(6m!=vAkNo=CEr^x%BaT*HI$OQt^aYLI+RX5{Ev&KQ%4f zx-;Eg#bf=Uaca%`lW$<7dGu}0#YbL7Pu99CJ8d3)9w~0L?MCY2T$YiqQC&xUk+UfW z@XkGrRnhJIC_F_xej?O0y*|&(!hMrZjpR|-9Lh8AjP$JbwxuU`xApg#7OSYn){(>E zjV2|4lKPGPq^3Tf^3dd>;~?h)txzy|+J)Apx`v2vVPNscZ#;feb|C>DG0$xDuW7l^ zeicin{gnJeyp~4v%aWj_DWwhwZDi4p={DQb)M1Tl}33XR3Dc-a1UC?pFz{L4-|_? zWRpa*hba}tsHO*(X(uOYxCgd9#d@EId^sF?V4F(0@aC&6u^GIIT#IavTs9Zh7wob<;-r?jq>yq%o0XffF79LWLivIwK6OxYledm)lhiUz!nehdz zU`vh{%#$aa{G&U1bJyCn?{quu8p0sfS2~nINlS}wGhqbhm1s{V{F?40k5i82wJRMu z;s{8C_mS(Gm}#Tm_I)z*VlY0%*k|cj$_YKcPxJhZ zDeJTSf5_%E%?2BbdkO9In}Ix$k3DCRVO$P)1Q1*5R<*S~E_f1Xd1weF_l0Fqj+x2F z`R2QQ3&DOR(?k+l-)lx`K~}N6^BXM2+Y9@0u_I9>5GabikvMRCx@183zcw~5YqO+LE%XxX*UW|0`FLvts zHlB=IHwACZd)Mo`IrkMy#J08{@QWnY`WBm`LRg69hgthX(k?j47i?hv02T&ofx+GD zv4plf((%608mY31HFXNoLW-NQ+~D$mT3dIz-c}ncDV3K2yxqj-*f(EePqRs7oTFP^ z-wfe*FjWBc#ax=oxB!1e(sNdlri=z3H`t zJ|vbXo2Nf3xF-kGCcT%!>Jv=1vcK^)y`07O2u7Uju=UD?-ZRb)cq7uhzrvUHIxmRe z)Me9j-DKzFfJV?OXN)(L=*Jy?@cLKNka+XKq9b*4@Y2&ydx43sZNA!B8yx~Oy06m} z*N66BKS%l<6rkTi_u{s2T({Ef>sMCZ!|m-t#vb6=!4j_xxC5N`&p(Z6HJy#(NB)W@ ze#SYA1wWQQI<58xlnH**VQ;WyS;C#bdXtm*3cq4>ajeKSQ+GI$AKjZKNYJqNWo-Q` z&aC;JuVwT7E_c$7nxcwX;zK37$Wq-4%@ioOBcLN7=lAEN`CNN9#Nb?=? z51`_^Pd7@MJBQO?)*9%1p(QBMpQ#&p9>D!873~s9T3eZ>Ta^XnQ!rIy(0sdjKGjs5 zVzD3MRhnZg3m5k%xkHa;PX0^DyiaDk8Aq|+30c?)B zJBA0)8r_>uzB+uOJMfJo?eYm=6k|ChM;@50TN_Itllm8srFi@*ID4D7h-SZ>{q zKmo5-r@a)S@A;e&_gim6zR@C*{DzL+O+GE(yjBQIiR;I2PBUFSrkfOT%WpQJ2$`hF zc;p5`Jvrz-g>jZT7m00jP_XG5j-S2vt;6Y(#Kl1SpEqBAD`QKx)grr)-J9UD5#}oJ z2chKwA3p*-ouF$47seuc<*I!!laxzhrh?GRktLN8`Z%064A=eKzH- znMd|b;+4piZy2t7o)Ww3yK5-Cq(_k4NB78IF`GZ%2dCkR%e$LPw$dYmP}6O%gSjE6 zRxH1YvYb}_(wqMPhW`M9jQM5#KlpRzzlatKrD@N4t>IhAopB}-;hje~9A`gVk8xfx zq}^Rz>W^zR*+iLv@`Pl^x2`=+eJ$hbTT5vt)TK`ePXn&VZQ|G2UA~A(0fu=QuLB=y z(>14>#{Sh%x!febNj#-L!mJ5DkgH3T**pB#`LoZipEd1om;3}X#CFEUSa2+%j(GAS zEbA(;?!%0KBbw%P>2Bk^4Q+nbQi4d5M<^A&asmEXuFq6WMsF_Uq!%*@feCePuf{S8 z<#JY?ajEJ$t%UY%W#LJ%RFAV*!3>~|*}|N2+P8#~R+i>3d&JDUvWjmG-Cy5${?ctq zF^Dw#n64y}Ur?{*kiC22yz<*Y@h-Ek`C2xSeXdQnf0t)&)4BoN?F4~drDJEVX*!si z+ryp{)m4xg2BQRXtVH+Bhhn$6uEOWxPm26Wa&>F%f8mFR?OiZq{{V!F)&YUoEwCd$ zfv&oAl-8e`iu>FB4C+a}cl1raxh46ZGsy+-+aK*w!e-uMkst3X4#xw7+nVdNO;1z* z0EB&X{Tf*zjsxagthY%T$l1UnC;`St2Q}*{@VmoM=$eu*#4m)pgpfpKoj>Aa%@6|^ z4;m^t&pq>8mxi=!4JXBR_FDe4rLCi;_@vX!cg=&)>=Li!#1Y0tV^WhzE3cDJ@@$@2 zEo|4xugx6g)QJ~}B1!S(C|^9vyIy1bT#Vp)9CXJNYZ`=FwxJAGcG^|FltB3>$%Z$_ z0}SelT>Ft-4~lN|74Zev_BGw@^{_yzE~{uDkw`xGYqPSu ziFA2lk`$8sxc%vne2eY~=j+(lgahO+pN;q~OUo;I|O#>z%%FKx7Yr-UBj-k<6@Mtj-)&-1awLuVzuui8pa=kLNSv1EQ+*I}jFeZBtA zWe7{D8wN?_NaKu={qjPu{0P;n?+N&iL$Zrn@jMrn7S49WXJ0W}jxn*0Yc?3;YnEu$ zcF3Tr$q7*7w%l>}n$2D^_lVTf@fL%qX!bEnsT&_UQ?@0wytkjs817A8H`OWyivAP%E}M?2P$g*p{na1AitjMSqHcg6p5{@ zqkt9X53(FCe+q+5z3|<=obl>+J}A?5$YI|*`Ow7+WB60dLU(&simGdUJjRpwRQQNS@mX(Y4=u#%y`THi|5wFvI*F0RF!=Xt)nMUyAG>;ZpD^c^Dl-o z_luJwuOHlu{RMMD>uZ%5yT9xF&O65NXmTZ_T4Z`ucUdho_O{Z&#y;U!kxm)9?}fP3WitZP}zU+eKIYR=!+5#hdzP6(0@E;w(hauG-1+$f-5B6O?`rRKObXcQ2AEqlA9!5x-Ic=?!C=a{mke=s|Pd}A%)pPG*Hq+Bj z>&)owJUe-54xf9g#x(0I_g^l5BuLIb*-YS{sUKQReoa@y{x(@8n^n?bjFz-`0>tiw zV>m`TbB^q5U%}e;r{V7#EV@K`cA(Q^bXV38O}q~O0KSdFpP=Tu4;g$y@h#<+CeVBh zqlG+3nhl9&{8HUX`qfhQ9GAPg`I*~Bc(m6KuWHLYarlo=)hGSgl1U4PZiBDQ`q!dc zctS4*i+y8VvbVm6%ihsmU1{P~K7t8mc5nORHRcj)S2r5^>Q}Q{T+JJ2$cs*iU?bfC z3P;pa^`9BqYOuoz({xJ-A^X2z)9vl^>$_s}T~unpy>%m%UhL|%+dIz?U&*doX;vCm zkmv%rdpl6TciA4mPrlsMIP5$=x>wqdhzyr%oLViDkmu9Q+&~`qt{yA6Ww-sS$k13Av+%ZX&$v`-XpHgc(k1L|>_q_M=320d35p1to$&!vuMuf?kw_9Fz8uO5^Izb>X*8o+JE5|@V($~k#4W0@*Low;dxg- zp{zMPOXG{pLK~}@d`YQk(jSxTvOH&RfAwJh0FS+DUFtd_!qVSCtjES#HBow0`r&~b z*Xhm0b^g5$2Pn(0;J>fHl3QDg&GxtO{5R6eXDEob2N~gjiDV#;cC0OHLl)Xn4-ekH zp)_%9WzyxliCCVch>IP2exk88Zy0!H%EjQY@Ro-&IR;jmOP39f{{SiGKWB`hZ*)2y7R_vXh_2iEN@qdecBzQg~yVHD2ai&iL85+*x zU)cG{%AvrK3D3XMyynlv9~ZoNuFGYiBqhoyYJHZqLc>DvDQ@D8dKrnGId)ir+x>-xT!mhgCE#@AQ5G0QjnByj%xoaYN9 zZp=FLY*z_o;4dBNx{Mk{$AdMi4L(vs+v=L^_Q=E4OhG`&=c5XnNcab=>dkL+qWnSd z-kBtTJZmi1v2VcS?GY9S-o1j)!5gUp*P~DLJ0Z=wzuf--ufX|Z;xC1*{5^VLwR=4RMk~I@`*v%Y9lzLig+EuWXGXBS zlU36nS@GTMc#(t=+T5GTBgh>}F<_^rJ7T@B#vcK`Hfk`(;tgxUS2p)?T%FgtU8vMy z#(T+Z(t@k#Mr*zJd7*q+@a~^2zLD{7;d9&=gEpD0X5M>XdBO9oNCU6SoK`w%4otwIR?nj~3`nZEpIvhh?;u6`mWNcf*$Oyo%rR&E67Noc-+NXQyhR z;yqKsIzGN%#Qr4lJ8PEdjnv$90I&o zY^>ny_Vjl1)M@_m&K=dQblOKatH5^nd?EYhV zHPht3&+#+-Po{W-M%7bL)+5t}q{<9e7J>{o1FpqpEA%6p*U)@#;V-j`pAh&)U2|22 zWP59f9w@EkLBlMuCwtV53kXzi*pgg16~cL8KRrYZcy$NU6VhLfiF zvq|yg<1^rJO|<88Ei&ldRB%xZoq()1ldSoX~`$$cu?lgj7IF3sPQkzSL3@b69VUWR77_@&^z zX7Wc?D4GV@U31CI_I+{w*w4Ln(^c-;o{!CbMs3E{algy;vB~K^Irx8}!*M2|XLS|R z2J-FW^5bP=gS`2$xCcJUNOA3Tn2#S8Uq(ZvOy6as2A1H)}TRyP8X5 z&UIzh^>m2IrfK%-Br&M9i)fL!`En2W&0F#s!$!EU*WuB~F!^6$wlT-3Te0LbhlHGa zgOU$g*@wmYRn@MgrD`ob^^lKsk|GvWlhw1^>5r{q+exU)sOhf{g|zKp$M>vKDW&^B zCpg$7&g^hD;Xpf9Ht*F3pK(tnk|H>ccVuTR47^gMr6 z(yp1U&5gt@DR8R{PR%Qxz$1QKRy?|np%G0#P_?#PmKGT&NxnF z?HOOmT*h-r>omPv{{SPH(yu%_bFNyv`cL*$QA!{E7DFtJjzIn4+DGeOMc({Iw(%aF z9+RQzT59ZFw=!!{T0yvW5xh|b&*NV_=-x7mPMm$K!~PJ}rrt`XrE2ns!R!c?3CF#A z4UVg?YgX3FrT9zXqzpcDHHL=_k^nmcBRL-Y)#0i*rn#E$Xs^$iGp0LeqW=5++^rpD zv>N5ZuKRs9-ZaYY`*gCNNAQi9!Syxh+BTozdGt$obq!})wwwS-i%yDVjk|&KD-oXT zGf?@2|4n6Aa`skM4IEr?))AZ}5j7fQKV{;tV z(kbAPfN$o#9E)h%>b zE!H`2F22-_xn-~s+#x^jmKgj6dAO=ma!s{oxAnQ(MWnP^{{UYj8VTe{qjPTwDo*%* z(!mJqPB6+xu{Bcud!@WtA%+EtSpq7;fy8gyEZ;WXIXu&>=9d0hAc|LlQ5kY3gUmAX z=m+!SlH7;5G2YF8=Az&u*pDyQki8G%SjE{}{v6g>Yndb*9!+!1Dvb8(U~z$yIec-^Zf@-uGE{eDNGXt(b1qeH7)U9nIkTZv_Geg0xV ztAE)|bA2?a2%C8(SCdc?xjukML0~gP&26{VIEl zDb-z~)HG#?42S!CAfU&;PpPhgUx&J=jyPhmlTS_D{hd&c{CFIGb(O04TTr%vLDRJ- zL?d&FQZ^)d^vL>GbD=23-Y@Qdp~=q{_xw@w?~65iZ7Csr+M-L2J(I<=P84Dz86D>ia=gaaR1`iEBVY`!wH`#zsOptn#k^9`UJ<0JQ( z82o=K^6h8g4yWPxF7<2uQb?>&e8Atv>;UWX2OVoVaGO`QpV#%d$z6NaN1HaOJ=Lhx zwe{6*brxm&EzR}hk}O~zxnt9=D;oa)08STcvS?AyEhVf0TOGh*D9v$JT; zPri#DMFxCF^8PCec>9i~N5*zT?uodwt-ke0e?Gy6(HA;}yC+j8G8wgDB+ zw~Tc?KS_oi3d-k6^3$0kvb7FRbGvDLeOo^Dz_p@X>unu?p4v8VlwB$Vk6iWrGh2FH z+?ox^yh}YYdzB_NOPFJn=ceM18CD*~xFsp6UiS30s|L;!vjdfw9D>89r2%)Yb_w0UywRX^_i@5BsOBj&z@Ud;51pA-B-e+ZzPT+}W! z=Zni|;JE`U(`gIEaMm}IeUkdl1(~OrHbRlO1>11rI2?glEgbP(JaQqokd7I$qo<)6 zuKxhQpAmJR470&!qIgpD#^9~qucJYCC?w;Cln^j8jt5Gpr6+l}_g(%i8ac_e%KrQQ zi1Hm~DXeulAi1$7@mmdxgfa&7DhKOXsTQj3BR!mIigF%VGlT9x>t9s(o8wQ!JxXI0 zwTFRUOhP=CJ{Z&FXwE+HVF3W2PSxXj?~Qy@<1J*`>N=;NYM=vXkqDrV9*DaXege9E znsL!L>X+!)n~H5YFYE3&D?907zfZMG2bf6<36+?BIPLjYd!^_)&Z}>GbzyH|G%yX# z5xGdqanS>~E%;`+**rI{*y?OF%UkI!7B;_-f`uPv>CwbJIY`SSNkYRT9zl1UV9 z=lE+s#G0PFsCbX;ejwJh+xy!-VR>(U*%W@IUvntWsLgujz3|h;+6}{MdMAi)C-DRk zh?dh$(selI$M<~00xfY`zLVmO4%*V=U(miFcvD!^BO+}=;wz6cP+o*>l~*hDBvj7{ zIDAWPzwp4TMJsb}`Fa#=Y#^7)x|2=RrwQ{3Z5A&qp1l3s*Ga7Sms-~RCc0hal&PdN zm7B{i|x%;J?Ig z5NMM@;ok>%qgvCUE9Rz{&`SxB3}uWGxGnFT*Gi*VE>yMtyoVZ*<>p&={+Z?<+i~hQ zl4+W~{=62?5$Tb|Z3YR(GRcKvKU(xSH4lhd2Y}2Pbe=BKba>;;lU!(qI6yu3Y&c(i z*skZo{{RO5K6q+br_g*A<9`cW00}mFGnwQ)K1nwGpZDEMu6!>2q;*X(q}MFIBVOCd zAri-{UP{1^U9w~k)~o8+pR);F`G3H7Dix`%T+;l1Rd2bUEnLR|y|}rO;=8*g%fW?!}#P`q$JD{1NfR<&W8?_*3H-LVzjJZf&zE z?p(=?pP)78UMcu}2Z5|4kHr4~4*oIte(F^rXS(uM1N1&oABbwst^%|dG~(B)f8-@z z5_&ZLYy8h2({!yW=f-iQ+WZ<`n=b5LT-!+P81!_BSmgfzvzqm2z8LsQ=*M{{#{U2d z+1nC4#%(WDZG-*av*4e`xLqq)@Nf1aY1jV%4>c`TSV{f$w}>9u*n5vHlpmtkL2u(v zg!V879|tviiO3-h=fnveGyddu%6~IhQ>PWJ;{AEQLhXHB{`LO=1oRj9Z}3tt4$FMs z8ueX3pOBkR2gulN*bQ)wKBYx@t^Tj3Xpv9@`7I${C$&cb-E>AzD zahKZutt(zVrLC5Uqt7nrbm-Nj*u96C-!qSPC+SXuQhS?uVwXr=M3_lribf28b#REw zoO|R|x~rSriuKf&4K)7%KhOM&y625NOQ|%7C(_}xVTQJ{vxZbb{`2pA`|hkg9$R~x z-?Hi=+A$&8E+&XZBR-@e79;30Q)${X+Mb~$wS%+~V1DZA+cUO%0IEqpO7y5c49j<+ zz1_UtH#Z2Ij7i};_Kb1RFo=)Fwv9T|_m|>wN~Js5y-JDUPY6e0E9!p|JR>34c0i+2 zLWlnV0SGnb@ZSFbVEB+vrC$j=nR6BGq%3&{h8|+6{J^O$^m!~bAF|v{brh=jDR~1z zSKNjGitRLy0}WE$ZesD*!;LyY$CIe);wewiG8O%5Dk_iNj5S?{?I9&->-~BiSNtw7 z8fxAejeJK1-;FII`-585Z&gU_Hb-!XN6=L}?}&D{8bk|a@ZaH{k8zXcJ6N^cjrhwe zALm>KuZAn@;`629ZSTCV;s{BSHrf*GKiYxy`bZ;CzJSN>0HEr5WIO6>dR?+tX|uk zgtxo8Gl>Wtw&0(_tV!_~$C{d$Y_uIKRfrq~io@-JIO~j&`d6N6y03_B?phBJTiobr zJAKvBQZcvvk%c^Z3j4XqDO&#k*Uaxz+S%PZa7F`f`xLE#dIWOw0cO z1C;ah2DoT7&xY1fO>e3AQ(y66!7Fubs->wv_Qi%2{{X;^Skfo>cQ1z{PZI0?B+=*I zSI$j6WQlRp2PBM+-D@|*7Jma5N`0RfQr6{Ex0S5ub4LWd_L%~%0rknQJVi*Qx<-+w zQcnD;U)QO@YCbghPp9k8d!&sz8;BQR(7bh~TwJRj`(%kcw)~GyqP*)_x$vH>A5x$8 zUeomymA6HxcxnwoYiC^K5~4)>h6t|S-^9NItu+RYAA}P4-G2LC_ ze3P#D<4q7G5d0+8v|Tb&bO+=VHTs}p9EQ+C63MPTHKk%Q%I(@N< z@8EaAs|%Nm6D0aju_cdj<;uM0-nrv~oTdK&+S~k!=GRug75F622-1EYcqdNq9Mft4 z02VxHVQ(oWR*y%r48x`w7U|sc{?1Kj&+s?Gx`S9rs(fa9tvYFe-G8B6DS!5UNq}4o z^dFUa_lkdKuM+r)XPV>ScY>$6iAzBwD|kt6<1yd!`B%$+CHNWfMEJJW3(tgl2Av6Z zi6VBLUl;&4@1~Fe=~Y(`DCz9)_m%aCJsbRA>W^#JKV;7W%X4q4cxU7Hg)}Qu81r7~ zBvnK0A>@4vSDX0z_H?=Mu8|I>bNfK}8^pGNgBsoHH!U&lJg_?P+jlinMEEiBn$A~) zK=@nY`x#^0XP(kwvSj0hbyZyP$6D2&;m?hJvrqx7E=(1YR z7avhs%7c=#qxehw!BwMeDmCjU{;KB_p!lQ2ejc?K+8@Q=1W99Vg<`Y1@Wj*L_d6xG zVoCJ`)s_9DzB05eYaY9yUTK7slrM+kwulV%2+=NoELYV20P&ZKG`%tOJvRRU;eMHL zvF=%XK=-;V`RTW8z=D2+{xzqs_}}6zI#WTY{7vv`O)41#dQOui@}M1s%p2Dq???Dk zR39yrn)H98k*j-2HE%Wg^8TmFR@b*4Jc{NCd<*dBR@GSXs5Y>=ZNeY#1ro-D{{X;o zS}pLl{{T(!=$BpaSBSM6fB9=JgW|ghOhEMg*hxwJ>VFmdSk>oqU@k3ENfh~$Yu*^L zWyej?%wh8gJ&9GU?+^Gl#`?r*sp(!g@KG$GS?v5))^bIY^6psU+>nfcj% zcl?cFw9$RZzx^iPnTD1+j)|zsnih-kCrZ;LZIVwRo(J9N#Q;Y9g>?FNjU9%N~>QFF^2Z-kajF;m;B2<`RbD*T%EV#N(qOm}R^D z%JGQXSkb&pw+Z2$2gOpB0^EnYnd5H50!1YL1X7(2OGzf5%kZ_Y@+aEKK3;7+)R*UT z55#wxr;BwcFYol*ooi6J$wbrdOFLxowmj#K!vnt+(CMEJz9L1at?jpf{7a!}SW_hW zrk^Gsj{AdtV-k-Dm#*w<~$++ z(nQPC8F*M{+lumd^}SVYE^aP$?N?L1xW+DZ4brg#I0b_N`c=DM6KjyS@ARugjP;T` zz(M!gc@&|DanU9C{{WxpcB)W%-KX;Z04MpKdGRlZ?X;<$JzmNIHmKdn~O{7GvayU%~2*xiyh2Dc=?)a7e| z)cj0tksCb*1!J#G6g@|iU^S9vt08(cNN$dXr2k~E_-+21nKj9U968hia7478l zd3F=%+BKR>yQeM{SxNN(^Itz+{4eo`g#1OMO!{Yq^@O@RRspT3+HsPvwbhjVnXQd~ z;zp+WZI+!5hv8d!t)n7)$-Fsla?=d)mXQe>Av8H4xbSCywRz?0_gWNXzu-G| z&^hp#t?Jb$L!MW(-k{5vL`ViCh;+D*Qq z2e6c*K7Zg<#dy9C5!rZRTirw9ME(^nzq{2flTf!r_c61WhvWrt8b^#gMWgDI-e`9+ zcy>_4?9$|t+$Z}xLu8LZUde6oC*wx3;W#DIyj|m+O5Q~)GbB*PWFUe&_3Q6m-QdsK z6XM^7Ev0QY#ZhV~;X|gWDYye2l~{~@Dm_=iT9&I}d9CXHDDeAV$U(W&!n9Xv!>IDa zN};_*MS0`+NlveC{h=YTw2{F3M6<^mDD^w=znyZ=3sRhujK3Ye=b@cC)ghu!UY6hQ z-1-97_NDlSZfCmj9+9PLOvf?J2Zi+L_8)T4KJoa9oBkRTRPiy1b(;?ixsA6Xr-bZd zKAl8Z&%P_eV7byXFA&S6#|6H>r-BEZ*AYtOpYH4=9(@gZ*N1!^;k`m@dxz2WOKDsU zkZqCHCmC*?fiUT0)-FVjGW!zKj^2rp+!`G3KnjB#bCv^P(0LsYg zr_D5)*ZS{r`0)IfPR*ux$HQ>Nx8;s$rilFsbsx^W{{T~yRnza})Aba!m07Tp>CYVT z5$;s~06N_^b~4EeEG#bEkOX%wq4Vq;ZDDHu4!ldVs6=j{kw!v&z7d~pA9wSwKCF4< z*C)*<{%szFebk>b`L+H@ky`nd(nj`%IaEeNxltHF-<%$Os=ej?>^A!%^L9BT$X)jT z041u@X_vBJTRUGz9L~W|O>`H7*Ks_4B#*+n>yL-J;^?h+ZL8=GhYjS(tJ?){Yzc^{ zr$M)S4pnTdu6g6$>VIfaG^-7aoZKY7B{sS*H z>B9>&({XKobzk*49a#SWGG4CVq2$+c>b4qzuuW##YgEBWqPclvW$vJ0*1!hnG16EJK6eZtBm!({)HSxr(oc?OYIM)8O77Bi%q?%%uHm*!10d!B+YdLT`sN z+fU_zJd5H9n6qP+8ADuAjVVp1K3|vlTYoas(xSHUj6NpP^&r2zHrMe@5Bvl&1J9wWbYafarkCIPEB)yaDzzMa#jnfr zZr^e8PO;)?^o?3*P1dzNh$NR9!JBFH+mnn`mOd`<-Tsw5zN35Mhj->PZK;^z>Bi`a z;GcZguy}(>_zQh>kl5;;I+9|*n|HFdWWoOccnp39u+e@EB$7dV5!^`&#DGe;h+`Bw+c`%_a2SU$MoxAC4p4Ae8?f*OVlYy{;s(voo)f9T!68RWi=HWUsq#iR=p@#Ff2{#Mzv^_sr(( zePW^N4R7Pgfe+QyFcK6ERm?yV=cN(`4)|!0Xrel|!B@y)32T-3$Lsyq z#QeR~DTPD*g}K(UvAPv0dS!7N7jDI(Uq{F9nfq6y@+7?t2-=_e@29?4^<{G0LTKfxBi5}_9Tf=aHt zNvh~)$KE<>Om#ndXZ9`HbgQMNL98R>i0y@*mIv*3#?obshONxz)U=aQbb6v5^FfoH z%Y|pVf1i9r8EH6ej_A&y18^&E75USq&%v_&)2)C8jiQimKk!niZB&0{W+o^(N_(kB z;m1qVd#P7SlAly8m%!|DIjAhT^KINCgR8_%1vN0wn7&E+4zI>o-SO{|-E2DSK%m!_ zxj0K)xv{>xZzubzRLv(foZN@%w(gxkT;XT(y>)ufxHlR!rlKqz$r1$6ME*`m34eyHv3RiBio|d~$xz!h} zbN#T$Zor6tOVz&J8-AA$w{_|IZVo8{@0{wa)iCB+?<8H#ExwcSzM3a^!h)`8&84Tz7t=P%W|MJWox! z3&taFBVALO&`9qCgNy3j{YT>&O9^=ah;>uXe-_0FqVVhy_oULwv`;kU0kNso$$PL8 zszptPq@M}oDr{M>Q||l7EIh{Krh0veiQrrLA~dG&Xhqsv3@p26L*f5jUeRR|C+;Mw z#>i<`5yBILY;evnU^eyQr6QAygu-U!;MNGdIoJsqGg0fhMv7m0&53}CAKm7nzGhsr z@$eu*JI3ckYR1JVCQAb2f+%L_eR7`|Zcn=}0rbSYL1s*aA#bW2!9hZ1IR?9%)nmuJ z=)0~Ry*O9^6-*?V%dJ#Y^Oz=0h5Z&H@Ax2E-%X4Tso1WPqfQ&tI9-zTayl5i_FrP;nE$L{(fkBU`Xi2>SGUoYKH!+j~r zd_2E*+5)7-^y!(T>WwVAvI+0?yc_Ux&(;Ali-K>>$A}~(mMqrp_}|0Vy4tVZ`bSeV zysaRkki)C}=%~+g$c;WhJP5oX!)|0?)i-;FCFP*1BCTS)Y&t%y6^OH2vF|hjJE%SC1oyhnt>fF$L9E-00!j* zZHjXbsskBW)9N$caF5v0%Ani)>bhK7PBG!e*`n=ht%@rj&J-f*?D8y?rzj@%gv06I zznyAkw3>d3 z*OTdeh+I2MSMa={G?6~kJEFb3ldc-~`b4~4-{79R{mE_aSJxEjML}{6!C;I{-KYdb z2T!leYuQTgd4Z1iIPd<~$EtpFfB(^V*T=Lhp8WUgw|1Zg`5DQ+Q=W67V(5swbYx17 zwS!9{00Bc}sd8iIGXT5sBixlOwOi$XVkz*fsm*=>w`sA<%-6bZU!1PV`$zNfq1<-L zLlUIOAW7bTEwq8PjjnsH3zmnSUL$|6Nk%Q>EHG~fNymtqx+h*_ZJ2v|huAzJbnb3P z#qJe<$8$gzZ{G(|4-J4%8AB>6`)`!N^f){Yy=e)on{PHuBZj4ra#VYUZi^3<`=bZ0 zdfFuOn>p|z91If9&h?*5GB6KsSh3QcAH2t$jw!0$g;kj5-%KVOP+oVg?`0X}RULs{ zgbs`5!@)PHoD{`T3>NtX$#IBg*}N6l=33sD`Vg3#@kc^a)ynW_Fq<619gUoM(kJTe z{hf-kh{yAUEB}obxW%6wBJ^?HZ#~?-%WNti4cy*3N$CieaENb5+#|Yspmykw;>8+r zJxVDuuO7lueB#&iN-SGMetfMk*gK8bJW{>11d7`2-CJY~oBB3DFs zg$0N9fYhf;i%HSXMAU3Oa&&*3t$e$VFJ2R#6Yc@jwyXUx9Vng>v(>03M6iipm@JZm zbFF*B-ZQ4HQRE{H(dlaDY5NSG7IqVj;-V&@XVZACXvvbXKauP$WUwT7w@(U`=4<+E z5zOq1IMbFBH5I|Chevr#8c}TCj`H|BGmnMJUa=cXf2Z7=T**67yMRKOO755qQ4FxpRIcC z7a!Yku9&};g?=gCxZG)IW8>jp;&UEQbB(aL8vQ2wEgNuDpdl-sCu@RPS@(0mHvzBw z*7>rPAJeM~5{8Fjv{><+51C^MHl>bY2^}4&etOAFMy}yZTmPANwSDLp zx7d)ZrCunApUlHSNS-ir68&OObNxg}!%b3{zWkD?xl>MG*Iw-!ZA z(a;2rp5eBSF!O&cAOTCNrsuY&4&ie3MtIJSx+nefjrgifBiDdZ3T`2dr!E|3x8Ze) z7A6%gCUx|wTl=Y8B19v&Ej1x=8%wk|TgqHgmj6Ru$7NBToo7=nWkdpO4X$;A)u8kK zaM9tcnd6~oRs8A1*c7tyf?alMD(DJ@Z~$)&BqIGo3e|vS0FQYWU_j8 zX?#Z`)(UlYb0&RSCH98&sB{ZSU_LcPU#(W=mMq_?EfbUbm#nwsCt5g{F1K^59F-Uo zBmt5pB3&3;Upd|&u|CH*&T`4_JUcH-3NjPiWehZA7Wk?+rU1sBbjvi`V^@Mg8~qGg znyf(-kbWAy&QYy+tXSxSWK!W~t2m~LoyTBg^H@N#L8U$)=bgSvt2Pzg)o+{aIy0Xp z2%8ohe)vbzRrHUBv3EmP_T}z=co`5AOf0seKA>2Xjb%k|85mM- z+drC%vL%*cv!a`ulVS^9WmR+H)j zz|3JUr2ASDxZJ0e^GG=otgJWwHum>;%5Eym&y|C^S@sD+x#lqUbC@c&k>rEAGSLVL zRl7I(->m3{p?>aj#pOTKofr5>MQNf-knr+ZepkUplK;`ye>9ouv>{^lpKosJw_1++ z^Psbh;+GuS0+6@#V737cIaXCS3gHlc4-zePnX9|N>lQe0&&g_{dDrg^^OLn@>S zWec@BGgx|~-;f_!&Xv*Fa6{QQ1!Yyk4Ige;*;f{JWt$g?E{Ni;Z{EJWD&pj!&vmoy za>%@@QoJ$D?4+hGDhbDgoxD7N{xjf^{a1H#Q%CyS+D4yFu``0VZfHSY#&}FFAkv2; znj&ro6TWkhj1O7}IIws$2f9s8Iz{BTeW>3~0x$zDL2=#H3(4**KP8^l5t&<+=A+^G zVxYc}%G)hESts<%cc4WcWs9%nwR~Q!MR%pTwgUSj7+^p%%b)L|P5N9(m++v7#W?+^ zbh44IoOkh)yXC3LO+36q{Y2ct2dCrYpaK%EO=0JaYpxF4PB+|3)R$W*j!jZF1gc-8 zHT-8elLb?FiqNut@bbed`~Z+pJ8=W^ge7inc0(!ap|+a&>K~mhBK{NmR{viVI97HOrYNLoWbwyY)S9A+&P4uD38sbb~4;#PpV*# zRy_4*=k)LF~^eu|-o&MF=k13{^qX_0e*vRhNcncDec$3?X z-0CxlJl{oR=(JUcj@r*_ zUthXAA(%(%-oQPw94$~`MrQj-21LFdYMmS1{@vrQLM~kj=b(xz2NB#nA8j_3|J>lf ziGMns1TFKVY<;Q;UU2)BH=`r|kERVm|4c_}dInZ8ks-AX?Ttc{SJSjdv+7Up|D$o! z0pli1daFi_NpI2TIJSm0g;TzPBGOVLmukxszXj4^;m*f6W$-0fX*XJj?SubG+iO_5 z0?^NZWDO}|yqZ!{H8ZzKESmNJy7zX}CQJBmqYXEwXe$WAq?%Qt`|`Yv(~!n(wDGO~ zzN%Itob+l$!?Ehmvw=WOZJAd=ka^({$7h0Rl z2c$eo}iGmVkv5Jlfc&5?bS&xD4{W z+|w#bH%)K8O#i5rTs6V7@$yIgL~aS?c80WJ^v=0|vIVqtkI536lgb`;mnp1$u!Z{z z^7}0j+5qz2?XG+s!T7wc2SPqm?;M~d1E}HLYLX6qkHJD}G*Ht0@{9PDK4({v_TZV* z&j>BPu^xf=)3$fG@YgCz*@G~e&2Pr4Y<$ow(QtDA-V&l;xH+(i9#Hwp#o#i(R?VT0L; z{(m$f!wO!BRps^nIX7^|NqtO=WBshSSKEgYA{6hnq(DOqeppORKX3hl=<$iJzQ?mu z!i#=h7Nk3ThS$N;M=kOSd{_w5eLbP$`twO%kCaTJfk*Na5|I;B z?tKaA=y~Z{YCXil^8mrID{k{K2e8#jEpWo(B#{Qa_{6qiK z>3=kF_HL2|BS4b?C45;;fPhHI)ykI(4YN6(r>ZVmh7T*EUehLjBpsCqV~3CQtR({a zY@4`DqE7{A6Mb!GNpY6o@RB00SBvow2HFV9CCQUl&M)#HjjMGPd(EyTHgzZSw;MRJ zi^TW@^mXj)UI%>rJ}{m?{4G5WO5#DD-b=(N2YuNGfSfoZ9UsSp9D{to4r7bE9{s0E zo#Wpt0f%Cb&aUHET{YXUN;{spmS@KdNZq=-6P#G$Nc`YLpRaW_<0cV)LGb`&moa#-^N+ejlN6c&b zuUyq+o$})JWX6?r`g%DDex&!M9|5bi`o`@_aucBmM~t7-FGcLRsf{_f`{kCNn8dum zeU%#(3aJx%Q?M!JbX-}cv|woiQz&ico;Y{W?N$9P+6zkl6Mb-gCITRP{W zn~WDMsRM~~*UO>I>*<%#FQ#q)UT~}NV28O!cc;Ktv!DKWca(y{;7oDSlHwR7?hvvM zY%2_je31nx5y%B!_2;$g60&>PHuP}?r!F;NppWr0vTV(AR$D#)=+z?jLzXvZ7hpR) zL+mxr(_m|N|=vu)U=i_lsp|#VI=eDxJ4I`GTZ!*$cqkD zWya1tsCg&W8;VDQ<@rygeG(igv-4EFK2l=7iN9vTIcw5V4+(VHZRF`w@m0OB|5g(D zbHOp9M#A<|sM0=`5w=e4NH>bXRkdWfW68)s8L~h}?hLGfHx(Zgin-SL&M_O>3OS#6ja*%&EwG#P<>xvA(E={VD~U;x;%OMf=0BRW&Zsz8 zB?)`_YG@2kxLS7LYqZwxQo4c~7N)iDD!N$Ovg;7hl(HOXznsm1TT>wo(i4)nv z7yD$MRz^1S364=7+ds9loK@J)XF60&YoZi>EKSm>2*;0?uO;qidQbMYq))nLBO&ee z=(agF!oWw083Q^zP?%`ncE1N{?=(Js=F+!|Ds2Hy3@BRNIS(-~ST5~^WI#v^ygz^8 z8!>%30Qu_^tozdkSb2jHpe)v{b?QP$0e_(6p|?K9!WPeUJ@>;-lUcQv${i}5zEGKk zjSXOKb#mF42JiJ-7zKG}TmVYf!-X1yoS(*wj{vlEd##Yhc`trn2t7{wS+J}(A=0`o>={w0D;tlyUISLwjS{FQn~+( zB%pc}{wDvW3Po&sUK95cm)66P^f9ujyN|IbT|fGu_f4A4AoKbmEaUa*mYnrL^#Yn3 zmA5zPL=?!Sr*}}~_3`_KeXh*Y4APQnPZi1;mqo~HpyBE%M7EGbZq+*aI`t8NfL+a6 z=57+bf4y;UwrX;_6Y*w~?w;J3BdF|ThaH};6$B2E-D26qlx$hJN6XA)?aPk{o}QGnFtI*hLj*ULFmG}(gQF2*6k5V46J_{WO?{r1+IMUu zy1#B#jh!ML0pTYf2a|%}TwY|sZi!BM2oa{J1ED#lK1JP4&|K0FmPhsDobuET)bZZ7G2BxBN7Qc#i zOHwWnP5lIMqk-%N8^;}Sg_%0emu;t4E@;?G#1S{Bo~9Nt+1_;=u2|Oit$qI6XXEg{ zxp4b5pCHrx zj%$gx@eUD^lr&_=6g97^3-CYZyh5EHE}MB|AqIfpL@!|z&pk$SXLS|%q~gEbU>$u= z87d&h<7ERqq=*rP0Y}rrZc8dju-4k;9a}NXAGgm^FyIWhR{RcT-a6FUp(N!%dGu)`cerQe59wU zV{A1<71~Jb+5hv8=B*V&18E7I_Tg!oNL<}m{X3i`PlAJ?5Axn|M$h6v1pmzgM>K=Y z+exV4*nb_r=5K?>Yv^R7btj%PIU(sOyv1MD-sH|ai$N|hw*%9bk7WxLddA%$lpq;a zOs8B|NtA15%)Lys>TO^mSjU5pzl6&9{a~gG#UHPr@Gl(>N@`M~%ANNNq4DxBN7*9J z$dU1|8fAV((iMUI5|Mm{*gIq>#PB%&p=w3n57TE$ zi>C3n=d68&+K!#-ZS;i0C{dq5t!A;L%62G&oVDW8;2Kda{ljD5a_6TP&SI-T?b*XA zki_|kUNoG`=}dBKIp7(HsYpd5qlG<^%Ie#{zvC-^KyoqoOr{kAr9JV<@^yGo=^PDS zC~2MLv*`mqW-E4}>eVg_B4NKBy`*nzaNz367^bGU%5TK)D&8FX7bI2@q{v^z>w`z5 z4%6K3<4ChawsyMP%FhR-jQ6Uv&dkJ}!bPzpNvihywk8}2bY6NKg}7EWiph>RXaRwW zmV_8s*TRI7-`OnDyHomrwker~lF+f7al~cPlF8c-BQuU4Y@*0J2{?<>o+m{1$T~=7 z0v1?A?y*?(Q2&U|bHV&yx%t0Io?&dR|Dr*tj4r{jIuQF3zePxgG>DzXWX`%S7@m#$ ztU?)ql?dZ$Dz>jM5($8(^WopTvNW6s?Y+ir7PVR z>``Lc@)ve_Aw(k~f zp3FM|9bV8cZ~oCpobltf1adNTGf2YJ2gy&F#(^tB*~(593S{K{RjN>s@-e4y%hNGolR3|JesoV(~{zy_ha#w7T30yevwKW1_%dBkmzyt)-V;(yD>J%wTxce&$HE< z&T{zV8*ErsJs@uU(p(FDua|m{|26V=E726XSQ1I))i}>zL{AAd`Ph#zYdN1|m1-Xz ze(`QU8b?Ro5dy@bn3;=|QtI{?@HkOG1H#KaL+2tNFG~xmR|JO>y{t z7_wX~5F+W!9E0e5YZrWuRlMgIhUE%bG^Uz+7SC!yCj(z6!O_lhuL4Dge5L^!p|&S; zTaANFLg$C$fk97-eGvd8V{Xd<4kzFBYg&@Dt)c>#{ZT(sh!9@HAXj>+kE^qn5Ajm- z{p=oI+O`V+2uX6)l>2s{^*q!t^bdLBR8Vp89;I;QAI-F^zhEvQ_t-WY_wnE+CtMGu&I^6d+)d=>Kj9cxt7&ag@$;X?$`xFPx}@zj-9Dgs1>Od(h4yZ`g6(j@O7(wJTJWwrM>7#L$Q`nBTFbh8DP^l< z5ckf}Q~#Y);#6odp8gHr-(OWJtF!NT{|u=iZ;kEO|D$PPyt0vkpCbhV+IXetMt%iS8JS3Ql(e4MwF78^psU4@IiWu4E5`e^#)-0+G-X?YmA_C>-`}$mex4# z`4FGV_ioDRJ*GbJR^1}xJ)4l+mNySSS?+E^VW~PDt=w3nk(kDL#dGpV^shs|Vq3Em zC{o;?T1k*ux}@2nrNmceSN?;8+CN{^aVXc)LAZqXTAACz(KT^-`c#j<4GZ4B=7MT3 zJu8+zUY;MG|4&7eS5&ZJ4cWSXZn?yQ;2w5eB{>%aY7o2&9_Db?S)^cM4Jmi|?zBv& zw0}7+B^_!_z9tGME+59qIzC4yHj7S_fbD>60PFB~BQD?4f5~A1uf$s=EaP_RQV_qp zYRSjI`}nX5CLjQUkx5Axkk;Nhy~X3t?3A0ZWSxfDaHL*uhe(+Xou4GFd85+z8Xh7> z)ueP@*Hn>W@p?1}yV8*?rjo^5RtP!VPiH9C&Wk?DFKQ1izm{T2vM6Wd_NVS3pW|z| z_x{6`n|*=5s~(d5N5cY>Vpo1M6ll))Epw!Y@kfB!o1Y|FJcM#j!3TNkXfHCwLxgoI zMIa?^X_RAy#&$d--PmZO`!hOi7kBvOG_j1+@*F>Bs&|k=LER(bqSd64&C195-1yaC zIM-YIfOCzEx5|mJG|>JA*qDlC-uxcQsCs;NVmiJuI@5buwDi)pcG|M_;;g0 zkeC!Merd^W=UYWF`Hl@`{>)p)o0iDAz#28bx&?)+x?oGa`f0(uSHCHp7VC$@~!dmUi`bcqZyY3l&=b2F2A zoBR>B=v+&$Xm?+IV>j->p@h!-QJas^tB!ym+2eR83)h+d;5VMSsa|~o-Le{wzucmU z{WDtkqtNB2~~&l}1yg{W?z6EIEgM~_{8Kic!!I6tJqKs2QsXu^XM7&W7J{x5x9 z__6J6fx*o7Dt$}A3|BIB@eX%q&J--5TDfpJ8;OanJzi{?p6L0wzTb=!A9dhf{>2#i zB(W=&;A$G;(Tyul@EU_&T?=&+F(tgMPE7RA<{!{Txjrg3uy8Isy-(HBO)yA2t)x2E zdR-Y?%7iJ1opxH9M6n@%3ZOd;vnZ;>_S%9DR$OS^3&DQB;brXs%C(=Y0M$b{uj3N% za0Kcf;YG?H+~gt;&4gySV}k*($~xwRU?L@yv{bZDH`(yfceni{#XagFGuz(-h4?=T zynlrrD-0%kixO)oH=JJ<&232P=ujhx4w0lUO-Lq+vge(#LtbxsD)3ANApz5Fp z=&6n|xpS3$0tcsrTJ&+3)op_c<|13);csRb0Nb)eEk@+5bZ-iS^$cDlxug-JPwa~~mw)e`g zshn_(D_Fp|e;P%h2Mt%~T3f@u%9pybe!O>+zxGAe`ArYXmeQ-UNDX*OBxS5Gor}Q< zO?{3Nj4i_lfIlaiwd*q)5{rwi4j7Ml-o*dyw1cczwZ@TNZ}fX28Mm7Ea<)hrQ$d7c z9Z>WKoh-{&Ta_tg6`6c9#mC=1ydL$4Z~uvJtV3G8pMRceBNXgC&V{hskXn~2=}5Ls`tJD|a)@WDzi zGPyWYN0YXS7JhyZam*DDWf;%6NZ_Xf?^ zUNlbLy6G_(|A2!+P3WU*KVGHcWRwVT(Wl6g&h{!oahABvOCYgQwfc@ajYj9;i^oDU z*Ly1oeap<-HRIjD{!t+oew(53kepL6XKmdu%QiK~ef~Jl(=W$%m1*>1o#&BLYjmBC zo#)8(M*OrNQYB6_^Skzm&`0YRtIozT2JEJ)lDZ^rqGX%28(|f7T+RFOS={kuZwlXY zYQj_-S%5lRrhXTQ;Inw;eqy9=F`7@gk#Mk`E>FC_o6TbE>~pj8ebLhpP=r^Ze_}13 zUQVlyhzfJ5%(1oPeCG)^!~tpI*X4xoI~eRypoE)##`^P9a{JI#AK)IgT}xJG5EbxAe6%#*cePqajXu!0qC9a4O2{c>Ew>fiDPH)-bZA_~nB&|f2|ucx{$o#M z`{mDxTPYfr0)4c#z9C;THum|2LRfCftREA-!vXk4)VP;}{#F;98~~^lq*fxlSK-UJ z-gPsBQ5U_v=~+%Y;w#k9iA zbiX!utw$ibWB56$yHM~;Uh-X>LQ!_R&l@wo)|*J(WzStKrN=cW{wMY~@k*V(w4>1l z&>SrDE#v5o>v>{ceqQ&}cl%%6O~Cn7@cyb#8qbIu8oJbju}A{@Q5H|%dk=8k&t?DdEEJI)K&HS*6EuH?~lV9$-Yu`j8zD|l+bR!aj@`8(snU;%8B8T*!8GnP?Cn)#doP;c;^Vr8fZIwIN5zQKs#|xHFv}_ZUOyXbixH`iwyPQYPCoT zQM=n#GSe)x+?Q*<`QkQp)Nuj0w|VgtyJoF$AJ@RoPE!sh-q+;ptQO%)VozmjoUCVA zL*|SOUiMu7cp8DbTI3?A=PTz|v}agaDiC{B>%;&^i~;^NKf-*g4Ufj3vdBg2;X55k z;HEK=dDCcI!aK%L8{x4WJ1F2VEITK-HNacQTk8L4f<)bI;umZ7qfhU{flc!)`5A#4#FG$;`c2Ft#tm4> zHH5j6%|};#O#0s|T%f79S6ncWFUW-m4kLxnxXHZp5=)d0CZ-@4)ha z5gsT;1W>a=Xy#m#k^b#gsku0a%d_qIZ2LLi0HZ9San~}XjGd~}T76c!E9!+Vq zQ77D9&@)e`M_&d~0CxL)A(L{`9S*+~1@}*g>tz7tsCppyGOd#p?F&LbqOEQxz}l7(P0lshd#tlgRePZPcU< z^iG~;plIhK=77mz5D?Tjs`MnNle|B1+)RQx6`rS&C4CtoUt|eD$shaxn8p$jVJ@DQ!G8IUFMR)uC4uZ4{4iewR@qI@oeMzB zG08${3wswylFcWUj}I&dMmsMJD{tJ70==&;%>6#*Y!M!aTVVUfRu>+abShIv6xsn1 z)uG-sMv?J1P|aBtq;sOBuJRX@WbrF>jq6|ymEk5>Bzerke=PnK z*(712h(UH*D;SYF@-{;|8mCTLr;n(ju4-rdE&;q4%2v^+1XX$C>=pDjg&jM=s>yX= z0gRP>w70kaW}plaw?rH9lgT^~UPdsA;c)V=nF5+C#H%?d&Vyzx$Z~ij2K5)|h`jDx zQKaVe1%D^na+uVi78xIM=Y=wwn%37V0=dJV2`{MLt; zpVJeZ*Fj(SgwHdIifvPy_DP$~UB7+gFl~L+AWcnL0%jUD8IK=ZY0*)Lq+Aj2`BC@B z_pg-gR;MhHtP(=$B@@G-wGWH^*_#aMTI=PFUsB?=^7InO{LI{i_ZB6Ni#KmYcxgZq`i+wqg!!^ZOhHDfS2T*Erjj zK8#-MN2fh1>3HE4H@s0IbHuGbRu`1H;q1;iSj-<~X9t9;JrB|mPZ=&FRTCv&O23+N zl7C~i;*~gj&5X7JN;B~dV&{Cd_-+J?_CCVUW}a};l+HQ!4!XlDpCCTK-;a;GYjT%&Ad5K!Ahf-#wGc#X$)0f&=bO86;_U(6m90Z*!f;!Pbi($ z3S}sQ$2}=hW2VRr9?!tk=m(4Jrz-=!Dfr4I0{V*pzm9CAf+soq+YghGMt!GK*L7Uy zMwF$cWEF){a~|$OF>^oON`=#s?swj}iISV0DL`PL?vq!fGm~p3%O3?bI#3BG5L0Z=u2M&`W9xfpXQ)_NhaT@ivYBd9K_DzNDJi zFjehwS)iHe8qb?6f#$@@B~UA%(Q-yEPAcsCziv%9M2D)-k`*bB1~GyY zBhCIHWj}=rHdDl=vsJ^rVh2I484Xt^s1kwNMARoQ4Wd>gR{w)6r}l2eAK@eVD6^yu z?aG?nkH>X0;;oy4W&(v#hxf95iS19BPwo^`q4_DlATP&`Hm50j@YZvis!^QXxe;-E zz6E_f*DX>-iSYZasz)jC>T#_#BCleN`f{zErc`Xd0?y-UGs8ojtn)`DUuDw_;MW2T zs>=t(4)rWyETJ*3{8P*C--E~7|5AkKE10E1?w1$;` zf`Lxf3Y8V!@Q>!#hH=kSbI@C+^1z%C@;9^9AY(rw87H3y|rH|Gcs zma@8JBmN$rf(lAe(ShMEy8wB1|o^YI7}1kM3ihmh;1xffbCBwZZ|s1EN)YcZO~@0bDX9N zG=o$;ksRFZdpmXEM(B)4*Db@4&qvWCTlr^{f6pYQu-P;V-}3)iB4`Z*CjW!bcx^@$^)aiQQ! z$BN>&S-`M^g0vdrtHgOTxr$^B*oARXSo`In+KU zyC1S{djx8dHqThhWGF`G$!@$EJwX30j34wK@O^*6$=8_`I#rr=2 z#CN4`F-2){j<2KKQZ8| z#YGZwFXIg)pvRP9%KWO**uBfuITKlcP?uY>^IW!;WK7Ii9kWG7QQ648F5vhlLvHe)5kw; z)SX>x6twfoCB|KF(bDE2iAc14JSe~=6q!BzG)i((Og!@*k!b|YG?=ZR->h@03rz#o zkb@|OQB3GrtCJ9DPg9bxat`qw6C_cm0%5B?bGc(rRsj(rtXsRO42liH#QOa)wC57_xb1lr*Zc- z(T+eZSuCUlW+AFs2^|%7B{LFmQI-Xmo)y)C__kh<)RrFCjN3tYB*QT1enHyd#md;b z22B}XKT#9TVl!t3f)>MsY7=r|8^s_rfTMXZwFz-+{Ls(RjL`5gU#(f)>aXTnZa(Yg zNKd|LCf8^VK7B%mN}Form1mkD+@^y$awb}!f54Yi!B2?U*;w3X&pjSr^YDW?BxA=L zU)t9g?j4GDaRG#lI>6qvG}^#RN^S9h_sE(NLyfn3TmI2JDUl%+zHtD!9F8tn#^V}0 z+*H=7c$dw&TKa5ZrvzL=Qv9A}wc6l~?a!URVpL_u>y${nCY)Wuvo=#%0Nsh~J%kzl zG8ApGgnHvx#;A@b)&W%3D{1AGHtgdnI>$d{j)R^K&n+_M=xS#%26Fw%<>lXN3ME)R zO={(7yP3xEoD5Dr!#8+yX(nWoV!H7y24&c)#1)ej?a+Nj8-G-Dy-;IPrBAFA%*S1> zyT!AMBev4ja608cighMQS%-oliQnvgISLXPS)IopiOE;uMRo3_w$x0MEVjG_5=Vdt zJJo6oHf=~w?zyDi%1FaeOEzz%hwUWO!OR$dYxyG($h=!2TQ&1(4C+sN#;bJlgbgb z@pRv$8>)?W3oAzI6tXP-=E0W5%=jOdbS%b6nU(Vj>D3a((E%Pge<9vOqMYeh#0-?y zSRG!)V#MD$yT-Cw72k3Jgr_!SywbF$i-xj4@_Ig4#8(vcfsOnDg`hsX*x(i872 zzt!UxlwI(9f3@P(3ECES?=UZry~xQTH!7~1x{+JabShs!{dvhuP1K?(7xp4jRtiq* zF7}G*AYg_|Anb~QKBx0bh)8*l)o$!N63cEZF$TA3F$$b!Ps96UJ_3d^yq`lN^$IDn zVEXH;KDI9~e#W3SP3K;$FFZ`Xo!lnh8~w$yPh!$cwQ*{JG20&=s$zowJe{kBhu>;* zXb#I9&3Qpv$`A{6pvaMQ2xRk8Ydy0;%a;vF3}Pq#A+1Ggqq|>M>s4?e1xpWfG4dH1 z+q-)w_ph9$Yucv2Az*(Q=yV%TYmq7yPC5mvICG6sCV-8K4t!WMhJ};g}q^xK}yZr+oAc zEuD``!6aW5{&&uAjdZ=jtu#}-X1}d`z_%coHsmulwVQ;*2t!Zw4PPXL<~4^b=^Lt5 z!ujda^Wh_U`%2u1?DSv8tBN~J6M(VWoPiaDS3Z+GkOm?p;_DM?tpT|o_=ils`P5H6 zQPIOY%kiAg(N-7TNhV~yQ@1P~i9J?2#rcO4EeE_{E^3GX2~7BNz-$F%!~BSQxPmLQ zr9HUVU`Glk1T2Q+hR=5rG(TPSSK)4?aHQ-X@W_er82^~IiKGlbBzsC9b*J}V7e1>+ zZirF7C-1nGZza27#f^M_z31GqoxkC?5eMNcFmy^JT718Ywx~k=HbH@6o|MeNZv@hj z6#mg%lTZ7A;PO>mOPPHhbLJ%Ff^vuQQ%9hTb&S89E%Y107gcGsLzY{_(^52IfyML1 z-|eqqLq7`+D*MhyamFH#T=aG0B6U9O?J1l|4pRCv7 zs!Z=R!)e4@MeRfUGGo5e3FxXXq~)xneM?`E+A=Vb*5LST{{cASHyDFRB`F`!^Wn>HW#rUZkLDl2WqmUlQzUx-OH-I}RHu&R<5YPe*{evhtXV zh3O=C54;Zsxu~d;AIV7j2ID7M%?z8cBXzu&In+{nF{WOE=c$3k`gY)c_yKkh}KGg*pqO%0U(lH`?b*;$~Q8ju?1{*NY5TXY#qVkZ>|9T5JS-NtIO+N@PF~i1D zwOii{6G$Q1uqoOdP8d+4(ZTw)-f+1uc{J*fUw@LX9cMx14ZJ}DcHhBVHkp_}X@be@ z;crouo@|ZVw_|X3SeHBKOy$x*F#B4Yd4N3o)nwLc`*46se-1q7PlX(S1YtHsdam%*-pSFKJhgjO&b9F&J&^ z(=7)MbM2NSzRlE29>vZ1$(3mvxiMQFV{z&Oug}ZDj@A#=?cjNinqw?t0p+6h8itJ^ zF{J&RIAwU42nuot}i`{iYEjt9CTjwv06VdE~UKtHt~a^GUn#0V(fHT$!@r_QE49b+gg}% zUz3%rOdu~nn{XU~0z+8HEs6}mdWAA5swZY)!P+M6kop;_eK7Z3U&RXvPaW8kB@!`>KE>szrf8;!|~^q(sjFt z-GA?_ujyQluYdbCU0X5Jt$r$L*BIhCZeqAk%R2@ySoPo!QCx{-~oa=gaCno3^vH%BqWgFPJ#z_g1bAxJ-8EGf(QAA z?EPlH_nh;|{hs^WzfSQ~_pes1s#;RrvsQO=H+{DR;3>%|$^jq{2vC6k0e34{dWteK zrq4Ch~|03deGP8#x0==Agr=uig%1OOdC0eAqw%pB^VqA8~Z zz>A`+3>_5CbdUcjXOjSYCIA@YP6s)zhP%f7+g*Okg<1gcLG~kJJUTfXQAT}5fP?SuylKE>Fmt$+|1n8%*ldI#vbBe zX6Ft7f9ZTb3Lv<*Egjs*f;=LEf*ib@aP$8u|I5xlT>oou@7upPeyacW8Hl9+AKE`- z|DoBZ1Ay=;+%^&a&|ZE9fa>=EKsNIajWG=XaNhwy)zH7`Lvp`gteu@5M7g-!+}t?9 zmgb!I2K`h1w+w$c|L5S}*5kZi?~m>1o?5;#b9wDdcW+d4``7j^PIOQQGjmHij{mrc z|E~xBn^^xQ2fK#lD@!L!JNQyM@LdMBvx2+Z&I0TVwzs1L+x^cx{C_#@-(KMHW`QMO9oPX5 zfivJ2{6>Zf!Uhq7$U(FqCJ-Bl7bFal1j&M)fiyt+pcf!3kR8YcA&Vj_BI_YrA-f?5AjctRBUd7KB2OT%BcGw5ppc+2qX?lWpy;F6pm?H$pd_P| zptPWjpsb>tqN1Xbqq3n&psJyop*o`mpngUzL~TYLMO{a|K*L0%MdL-2Lo-0LLwk!B zhnA1lgf@z{iS`Q}51k2J6kQG70^J=w96b}g4t)rH9sL&uJ_a*}1cnxd4aOUcPZ-4* zofvZ%KQS>e=`lqx)iJ@Cewd#yzhd@aE@NI|5n!=m$zT~_xnPB1f z`!Tiwwlj7Zb{=*+_5$_=4j~RFjv|f)jxSCkP8H55&OR(u?dxT304Ua z2^k1w2+axo2{Q>h3D=2Gh?t2KiEN01iHe8@i4KVgi1~?ih+)Ku#EryDB#0yrNfb$5 zlZ2C$kxY_Yky4XNlUkB~BrPT#B|RsjBzsI|Nfty_LN-BmMNUU9OKwXZNnTApPk}_i zN}*2SMv+3%NwG^wL@7pTP8md5Mma-;K*dU>LFGx6LDf%nN=-v8PwhbcnYx{NmxhGq zF^vsP3{4Zw7A+yIBrTXWhPIh@n~s=Hn(j5-C%O*0!v|Ck6dt%d`0`-z!7qAddTsi* z^dXZ;46hhs7}^*P8EF|+7`+$^7-yK!nS`0Fnc|tcna&?FKh%8~_^|rn4`woE zMP?7?0_M3#*pH+hIX+5%G|qy;BFtjTlFTy9iohzsYR#I+I>d&+CddY6OJ*BkM`jmc zw_{IdpW?vckmhjZDBxJ;B;kC<`IfVqbDxWm%YZAAtDEbVTY&pDcP95N4*`!7&s&~4 zo?~8CUUS|=-f=!`J~=*Lz8bzGel~tf{uKUc0YU*4fk1&afg3>~K_|gt!7U+1p%+3) zLQ}#-!q0_6gnLAgMV^TGiZqB^iVBK4iQ$_vPQ%C{&WD<~^ODoiO-E1E0jDIO{bDS0b(C}SyW zDkmtfJY#+4^sG(=K}AU=T4hd^N!3oZS`AQBREt)df6n~e@p-*Eiu!Z)MD+~~9t|&z zZcRc>Q_XzMGp#3D;aaoWkF;I1+jMYsjCAsJ&UK&aM(Hl;ap`&MebcAV2kX}upc?2H zWE-3s${NNRt{Vv$1sF{lGaJKEFN3LSZrBJSVmcHzLIzq_3DR}gjKZFmbH|1ob@hP2AlvsvQe-}wK=y{ zv(2%+d#(Gr1cC;60jaeku(P%6u&1$y*^fA|IRrQ?If^>QIvzSHJ7q&bP-AF~GZ8$P z>UVkM^4?|HRnj%l^}0A z=cP}ZFN5zp-*rEEzuY$%Z*1QTyyboy_4dSH*T3!^^*g_JtMBFC7X;u0I0Z}viUp>A zK>7gwF!+)0N#`ebX$EC(&#Jj{VeR}q(<}>5xh|kvv)(I1dPZCR#sFFS= zohMr)kET3MDNdzM4NkpE1E)=Yk^fSa{xCf*10};XVklHjkvSC_Bbr7ub+%aqI7%7x2| zE0`*hDhVrtsz6olRfpBq)k`({H6yi3wQY4`b(Qs;^*Id>8WJ0c8^fD0n%*_tHG4Fl zwm7uxwpz8Wwwbogw(GTzcc^y^b}D!FbjfwKcT0CS_ek_K^osV@_6he@e-r#x)i2Or zIUq1lIVd<-H6%1tGb}P(HzGdLG%7XPI`(v|Yg}>s+l1=G$fWk<^pw%m(zM0&kMFO) zAI-SV{F?QfL!Jwo$D5B^pjt>@WLYd(5?pFre!AShqPa4=YQDO&23@;ef470X5w}UZ znfHVDN5huf*6_CB_WF*)&ad5oJ^a0-{YU#12agZ>5A_b$kDQL~jzfNu|I9hzKWRIC ze!6f5Is0`UbU}WRdntU`eWiP~`OEDZ_4?Bd%T3*_^6lImx|3Lq@ENJiqg86R@&mtlK02Mwf z5;rd|PXyw>WJF+%K>C9vBSC-h+^-%5f=5Wdr9jY#LijVkK@`#-`pYQfKXjWY)W6q) zTPOOA8n%FdE!OzS9k^~F<%n#QH^xFyus_-Tp-S0HG zbOIvC`&9aI!1LI0ag6pru7T=aCmS)6Sp z==D^d!!rdZOFDi|eok(BNentVI&mk9SE3qE<^CQHZ%NSqTTbQ1$7%0m#RbnXMYy6B{;jc;lHP2Icg6#x$_??K{&ujM5-o;shp8kHJKjkku&0OG; z{#UA5!Y}mSy1_ZP{!9-aEe8T<)3J1d-sfa+PjQO;HS}M7|7q}RGpO}_(hir??B0Ho+*~|=5BX1B ze=jV~b#LQ;v-w{R{Y`~?R1!m+>(B0x!~pJQ0T}?{zJPuo5fBg&QIHVf1r-??2?Y%m z4eh?7V_;*Vqhn#9p<&`;VqxRJ3pyqqJ}wUaJ-(mhemHy-3K9|u4muk8J;(pMa@PXj zqk#$#{18F(00KS;5g&Bd0noy)3uJf_1}}eI74S9!A`&tRDqJQ^I721;HV;BXL_k7> z%Zmi>^@jHYNchME4|t?e2-VF{=^cr9-$Z^vV|Y^9N~|$*$jJB7=`A`22`L#l1=B<3 zM=Y%T0)j%qBBC-+W#!}*6qPi!v~_gh>8iPf@T(cX!alU!iVdHfP{pIgnF+R2*K@MaeO4?2RtYQ((0&Y zj)e5QZ_tRIM1Co4MQ7mCI3#}QG=f3G$iK{Vbg$ZP&Hm36d;5Q-*&oIJ(Q5|4LWJJ{ z@e%O>Dd6ThJ?Ihe-}S$3@ZWpjzxTlZeh=jN`dVfEi12wvB0EmYy?7^Pyj&R|S! z^WzvXePnt&ZHo0JYI|0B>{`3fh9%M-%T?*4W0)e2Ax4^$vN=M-R2OY!cMv~qAPrSr zc-xhB^@oz=eY>LM@9AN)uG16B+#CB{&(H{?FthMN*GG>waEcH|JD7~4df&3SE%YgU7RIzEi zmlZ-K6U}+TGx+6LW5rE zwVM%Q$2iCkakgNS<8t~GUS2~RpSTfI1TV&$$_f>?Wyp?~qOBC>MLJs2%mGrj$7LIR z`Y~l}&ye^^wGXw=v=7cWt$OqdN;5d)pqAxTq`_Cc_>n`h%|+psy@bzZnK|E_udc4p z&9^EN$4*Wq7t$LvHdh1RcL$&RlHmVVuq7mz=OCc0Q3TRODjwA%9HYX?AuBN~onWuT zR1;mWo^~@{ifj@0^X`0_JHS?9PbDj&)SE!0$>7K+-9kreupw@~YKnb<*~U?Pk)y7{ zr-DP+Z^^EVrvTu1>Zqv<6uW5YhQSb5m5 z0mq688DkeFcG#y~(a3P6S==YuR(&DcFL7V z^z97)P!78TRu)QD+^s%+Oma8On90va2w~|pS`{8}9%~aG9Q!UtbwEtsJ@0WVzZ2M@ z7A)w&^}d3v;el`Vw#Q`M_9P!#$_5#S-#pW|e3z#t84M*=Z0n{Ur7E%`^RH#8(D6TVGc=k-g=15DhuT z5e@n|Z`h$*epAH3(N2cL^f^b1C2}g|WK$#dQB9}uxfSCPbfodRO3ZSc3vz8xH#aph zvrroG24iXcm^_>e$$uDN`*8HCG4F#_Q^LXCb9uBd0oR9*`C1T5kWPwC)Cj&Iun!wW z(MB;m?l|lHp-45^mFSLCS~M4x)eh+o5bm*a2PxwbU9AeNu59ZDYvk_NQ@M=qCsm64 zGWI##vUT4SHEqW4Fh%0ZQ-%Hz&TYtDRfp#PxcXQVd8@1F6 z=+nsBjPzDqw`o^p`Zx#0_R9F>uX)#c_ctTbCTO(7I+Z!XPmVrTCNZS*c!^|hA2@nk zy$`Jr++p6&s;$9`kZK?$?^c=-)ozNGnCPpWFwsWcL(s-YoWf|7_kkwpWmS~MvQMc- zU5i}0peO5zQF$+^0%ue~vAfO}&;0bZ4tosO%@}xbp(*~;x?Gbv>OXD2-MIVbc}KGD zkd!@5KUe-*V-O+c~~;r4-V3^$cvylmHy%2wPCaB@cw{F zb1W$s=O*30>q~C;LFkq#{ep^p{#+;6Jy#J)XY&RseLj5$RNzV#xh_ymyPh$Q-nbuf?O9qCUO%dxTnb~GRpF(p z{>FX0_U0@!FEYXj+S}zgQ+o%@u>NfKIA~kMhJ9OM+9-9*GJbSBSUsHR(x9($OrY>! z&fHGO&%qnpM_k&ID^TFuCqk_#>%}-}2QA_4`f)0nZmKEUJTHTzl&mF8dz@{Phm!~V zVy|Rq5(P$hun45Jx=5ouKvPAoTF%>T+hX4nN0JpJb@t&m13wR|02gWyzki-!w8tLW zgG}YFay=^~i1YWT`FbwXFD3OpWVhd&r<=&DMkMLKdsVp}wt{`?tLGvfLv~?Ugs7Vq8%tdcR?mnfBaWXe9sA$eeVpv?;~P7O85K!rWTT4 zYcD4no2W>xc2KYj9mNtDN^GNRx~cRg`9a5nz(QXWm7yL%t*M=olvTgDYo?rY4OY}R zkvwCu**sV`nGcJ~8EqM@N9o)KJK1@s$%Ri>0!gYLCz$_850b%nRBYZU$)JV}7If2) z*+kzTokLJq4@V5!tVC4WRFi$Nc#$eSdeUoOiEXG_`Styo8kDIIZN+!LbO@!%>?Y%u zcLq$0>b&ENcu_XsVz?7=2iS}q1e|=7Q=o(2s~bXp5>p#FsjAs*R+f-Ad3nm-kK>uQ*C z^ScG0Gl?^n9)&yEO8Vk$Rh_F3IXa@GI`{s3nzkW53pns~Kg=4(jvf4BPhJ&;TK^<_ zL!mbudtXEYx}~cD4JqCq)XVF-id~v`yAurC;8H%br9RsY20J=(RFJ7Lp&+JgN+=vm6`8f>AtlL83PPWKEVYPL z!V&dq4zxQR*t2}N5!ooLdfjP#61=CZifQIXfDU3TbAL_xMMNBbYe=9?GQN1rM2N!6 zn(KpF49bk5L=SU#k&D6FRcBMGz+@y*LQ3j2CS!A*%q}iRn2(7XeYux}@B}~Q{Hx3C z(x&GRs&PNP3lw?aILOzGxk)rCw&}C7(AwmkIEiS$ivRZ@DyMl5j5}FX*>27p|WapuDWtrUx?}G&RvkTuTsv-P^a^&mSype zLQz#QGQ`9-RH_b}(uRn{LDyr(R`r>H$VDo`aZeo=o@mvBTe2Bwg2_>QHn_-g1#ilr zd|N56@kN-R6i;7L-VYE%LWN6gX(Ox{?^)tm8S``KrT>n~M5VGC=Jy$nOFr>)28YTy znGouA3ucD=BV8A7!#4a`gM}e5$M>d)SPixPmZi9stwGdPea((qd9C?hdd}`eRcl+& z+{Ia*F-GOQ_zeX_1aoS>K{Z-~k6bQVFb!W;PdBp2cc@9HbMgW&`-~AL!31sYML7;l z8uBDsoTz=xonhCf`Jy3p&IYN8g$oSN$_e702k4_SNU45WjZ_lQ%6Zj{twJm-lp8ez zb|Wp9ro4=QDR}(ykpa+M1sx;SSh)UC6~MM5rq4N#sj{A*Uo*(l{j=EH4m=zEbWEBpvQf`kiBwX~(jI$GjU8K@ z2OF@@G0JLZO|-SGCLltMzWpJ5@a8~|hN z0%BeiP%|9mhjCdnM1h?Llom9q>1S|Wk#E;75#Va@%D$e1IocI6)xrJYX}v7}5$#(u z`KuvHHB*CyEDuFvW7Fbn7Y0b!94v5GqaDi)-4{{0-wFR$^b}jtl502dN2jyusp_d? z8CyOPCbwEnU@z%t5zrON22bgVe%p(X2tjWs8fb$?aU0?Iq*UCP3_|#14TIOp$IRo; zBb4o)W~9ii2&?Zt7T2Z7c~yA&Kn`MUJhE$-PGGu2FE@tf2q9yR?~(W_|LkWMpU%l5 zsXXe(kmvI@>b4q2_}0V1+Oo7A1F0oysySKatt&s4M`@wb&SR{1KxWNSP0t#wdiScK zV$RG{)uOWpHb2vI;`x;;5TJfM<5yD<)|8ukc^xqFK!()QJHXO+7C{Q_hiFysk$>md zP=;)&^QX?Fc!DeSSwkHjkn2Yx5}7B#W2AFWB6M9pm{|| z9#c4w%*w@i6|NL6vQVME(Iz@?LRoY%6Bc3Bl0)jVZAFxG){d4^JPd=u$a z+z-_>kB;=4CO2vH#9mZ}eh9;#e#Bgow{5%7cU-%&v6pW+3#EExFBig@JiB#k^&^}p z5nN$$H5G3@T(d9VNGtGAt%#goKm3!M!2h!9`7n*! zIj4fQ>q3+8=S^hn2JEq-E?>(3D5yszmpHW5nACL4HdLJzQY5II{!SHg=oy3x!Gs4C z2>&sdz>7dpM2KrxT=BjpNdZ+?$F1xyC>KmeVv#J^?Fw!nS(y7Nh-@Q!AQzUZWzDLg zzY0)@&0t4k#E*;s8=G_r*BfON?zG zh(mIw+Z~r_QPuK)P{gJSgk@0G+tEisUzzY_Hkd^2I3H*N*&~lC_rjl6gifL_gcKi&)fPNxq9!#Us@B*R)U<`a+Gt z6ov}OqsK$|xYqF?b5}A}Wl7Eb(^%v@tLi}+gQIrnLFl>vYiks0VLuCe~zMz^k?(UibL+*fbarFE_ZHFPx+)lji zvh1Hmwjvz@mdHPCk0taE&kWH8cLW>a)r{5ZD%8R;7U(9Ub<1mOs!bp1N!ufV>2D4@ zdn0aEKs5fj1G*I#d!BayX5I1Z^Ra#t3JPmaPhoA7HRbwvP6Z_VuEiXILxyYRi;wQ? z?aGJE0nVT1k3$x`+uzJGqP0rc3Y184+8At}`R}CnEoCpBsE81O?f?k+9T01I+Mo%p zitkMnr%}WFRp#M#?LnI#w@5Bd&D&*lJ6Xnc2S~jB2D%cI0RAiF5jGXKeH`ibZkFMkp{ytTJ7mE4BJqyLb;0p^F@ol9o+Kp?#vEnX-Htnd5-e( z1*XS(7#pr(*eK-IdD7;f){KXiJMO&uiDc#20?e~><~*45S}0B5WZs4(vX?=>&(q5G7(COjRdFBkH1= zs`P79`_QU&h{Q|u!XCV8`k@RgbR`+~)=-a$x2JeJWF+>*tO5fSsO?P{YXdDV{8z3> zkm(MPyGUFGGc4;cMUkbVmZJI7To$f}zq89}9PC*q%#9A4G)x8NP3BuZW*a^;VMczZ zUiytkqI^I;ZO(LHbvBuEn{ukA<{iDA+&rZ-A{jHa{Hke=C~Z&^^@YJ{u{io6%1qz6 zHKupoTsPw;HE&0Kc+2GYB5~8h`9=2`p?Bic>C`m@m~tsbz75*8Z?nNfXJg|B0dh$$ z$*I|?pO1$^o2VD%e__KIj8z`0aDzQUhP#;Axr>aXONpKfbTOUAI>eK@Zb4y!+&q~hC-C|cBe%|1Gr?s%yJzC0fCV3FcV$@yTg6K6s@8W0U0nA@lI95m;n!cCNT)9o?PG`?3-{4!Bz ztgy4+abqIxIT>N=WgsJs$K?CwR#QsjPS1kYJcF z!fd9y+3gVO_@i>g96Vm!c)AJv(0m(0unR%9r72&oe-|uQ-Ow;jaJ;P^td|^kCH~^Y zrj%#Sa;L3wrVR~iieZ7mhPyiM_u|aQI_!8xA$X!z2o3M)Q@kb6k~(sq#54FTaVs!X z`+96Oh~=8e=r?R~7e>f%tuLFh(>T_uuZs+NLrDq_ zbBtOFaa_o$E1OuxH@0yji96#PTE~PXKRd>Y!*3$0H<&2nmnBn&ESVBBiic_ojc_0pvI z#7b3pQ*#u1iGfs?dt0X}9l)FSv;%})_CI;$xL8X)83JT)& zJZo0j68YGK-MCrPuvc4luM&HFPl9z=wcZQ2bPLZKx#qYrE>J}p_oAiob@{0K@AaM( zYjciom2!Qq#48Jrfu_KJ6jEXfAIY}IejZ?99BTHm5)8Cm_T?NL9N#7#VNa9A$QbY| z!%*PIQOeJk@*&F=Zd92gh1~=w2?W-Q2bw-l$(1m#KqpkhaJ6{lmD7Ty$xaQbm z7Lsf~NbH|cm_|JebEnD3a+nl4F6(9M+4U1_QCvN|)$R;v^%MZxnis$_@>11HZ@(oF zS4@#CEMb+;?_qo=S10e?7EA4`DCR0zKTJBCoSLG@8gx>Y4J}PUSR(8>-Ptm-pm2aS zS5!hYTok8yel$!alT9HAUxKx)y!{B-e*$r4uNZOMHLkL3v zGgZoxr>0?tLDpoI3kxUyQWptdWt8+7O(3;xG3k-5f$O*0B7JBLiHXnWt?nk8N_95Jq1u5t{Una0CDTvkYGewx<5GVztN}x#i~v zrdh&x9u(}POxM;!;$ysyiqR<*g;X8i&ohT4Y}ixVLK1XnE10u#W5a9=;tC?PJGxI$&$WqyJO=U9)@gMdfrwZ_oSI+I}jxM-!WJK)ae1b|KZV*rF@|hv3BbtyvhHT#= zy?j2rhWfShp{%@T>~EiX3omhDsL61E0^iY<7b&iVoTY2=T6i~!B)kj=w_1jYiP zcg`F7j4?%Z8RDU}AJyL~?mLMNi-Dm!L66d;Wgp5HsgJv;h$)O_HjN)Zb|DPEj{ARU z`JUe72}acuM#)}n+BfJgH;Q#u-O@HpIR_j2Y;d2|d3Vlqv$rI15*<6qp`aQZ(GuT| z`Vfzbe}iC5dfWVrC=)sULURW!FdWhvT*P6af9l_%zUC8nPzMVK})`B8N`8O+~uvrJ*=Y-cgDejpC znxO^`KBp%qm$Wi*1FFdjagyNM_KV~^!vl@eXnOL~^?^n@fH;=4psvAsYwmOS!vFT7=dljY4X z>LfdnxvC$yn;}zXki%$|P`NvRC-94T(BjxF|FzJB4?CC!Ys{{)_q0(C{KZct^Ba=c z%FrkD2o@xBYSF2$?wIvtw6T^!DV!linsPS?F89oIsx7&l7H#@m{)=z9@m(op?Ow=~L3DC}$RwVE7A@?ngzfM($5C__4ckqq z1ml1&AqAGZ&(m?t>YbbdZed*0$} zv5-Bv7GnJ6wsMO-C51%EF&d(@=r1Bw!K!Oi#G!o$5P7@gf*nj|AW_^)X@m05f-Zws zXj^;s?V@!?o>hq^mtV$}&r(M{xy_w#9ABe2y#r`$MYE%i5|?&$DBe}Y85Eat#C-vz zIQm~WG)D zG^O%>(GV|c6oKR&skOORO5xm2Ud3((yKIR|KnwK+f=uc3(&}Q*fG|CLLc8ZJG-M%& zgKX<+B;e=^-<9~F3R>}n-t6tNmeD#SoZbhNerrzB!X@KFR9=Fkr#FIY5``)co)pEP zI-Jm*5?{Kn{y3qUorZ^nCr|_%F6)wYL>FhAnj@MNlGI@OZ@syY*vwEtT2K(66Yf&wVQQCl^pgmb>OMJ#FsfFZ59*&7GUPNmFJK)72Kqek5-dHke_#BtVTAMhB>Jm& z9UU3Ouk+TNu-zvP$#UgWG7XHse^(=x(^wCQ?Z2VudUVUT!%gLe6y1iDj^!hgQCbq0B&sQbN-B9Z-b- zlPNQyad|Ro}p?!SJIldo1uv zdlIql?NXn!XDZuyqPUd^YFkkmXg-~mj6&p%hKsz^9+prST0M8@k1FW_?f`4tc)AxB zAuF}mnq3qXA6chm%mLSLkK+4ude`DG+_ycWFE(my9gP??PFRFS51xAMvo^4@aa_?R zQ{?Op96@z#Ey@nHswUg9(l@Tih)RdZtdOvNS*6+x1)mvTESjey*`tG@${SKi9}8#k z_(EK~TyJa-f>Vi}mCJp5P-{U~5k^Vn0f>6DR$nvf8pLSU@ke~<)hBhAJME!6=~m^1 zE$OJQBn>KU^HgWt0eo*1X;ZEOTh)Rns8gd?e35PIjF1hU)>Ks!cA!xq9FdSSATn+= zY-9Gs!FFkt>#N)%H4NV~i=dLVZiTJVH|wA5xhm_wtO?X@sD=i7XQ=q_m?})M`?&{V zC)n1*x80tiYXnyC~oWr32M;>ze8kHm2QiJ zbf~T*4&79m-reanTqvot|TZfePh49Bm6mhh#6a5TjLUC zyZP}WD-Ky#VhydSdZ*#rt9570o-c}_X)m;-u-_wDgly(452)8!ygtHbf)UL>2;wsNm*6Lr~3_JYc=Wy}hpBy|~lP7M_8@x%gb7hRI`ih-sU}&Ve;Hk*N23m0X z@_4R$%>NQ2Z;8X>+tcxAjixGZb&d@=h1D1~67nuB|H!c{my4<+`!G9~-eP+@doC^m z{gXBlCc75Gmgl^pF1^H^oG_jExm-X3Rk+7bCRq)Q)tHnBwPF zqIejZRdP*FIwhJZ81((P{Tl;G$cYqlUJu=`DJJB~E89cFtl$@9>q$J?UBXoBjba!( z8{=b|<;Eh1g+YCTqYxMKnl?7%h}JW2{uCBoZ!iutfq*C{`|a9`SMgc={$X8y^Lf+3_1j`Dl)0@# zHb$PK!_6>*`?m$XSZ^0(2r~MJc6DAOcp|vBlzi}EfF-U740U==Q?}Q+Mss}CI~VBd zrSxhLt=;B^hBh1g3TTqL_?9pD(Q&2GrfYIxQ~l$FnLg>;*~h)z!esdyN}N9wg&5r> zQsP$|H4Wb%G$_Rli+{-sn)v+Y4rqey87EeUIA3tec*h&QeTrd(`}r~15ShqTwB`lw z^9dJw#4X*ry@;{X0M6>?ANr6jUrKJRSpbd)>Wi?^mD#hPuZPbPumVOmMl6jLYLUwA zx<*2XkzJ#3ps7mhE=#NZlYy@v_3^H6d!rvFc6=+icxg*ADxggHAvBDtw!hxk?&ix|8}Z)e(3+*BaJ8WMCXvgiTJ5`03*4jvm714!Rw%qBrty5;Nu@sB$~8GQUqq(MLLHm62?J0) zS_&^;uOUl_rJUN!UPQmB4u+b0LF~*wkfqhDyi1W2xl|)tBGmJAUbD+plri7MFq6C> ze*eYBY1;(9yeUb3qc5{mt9Q6U{EGq$b8j`#B5i8& zuItAa?=vnC+YyehFVD*n*!S?RMVuqIui}B|1Gh)UmrQRi(ISzIv-#%T>3xyz8bQY;t>|RDJ1zYHuj?<88gEM62W8f^Aqx|ftM!pz1}(YK`JB7 z^KNgHQF_-1ge6xRt~pJ?oGxiGiMBF(zJ6}saxZLGwDOPpBf)+7yNakE>#Vl)o2bi! zO)q|~dSdI?hRUmz4HwQV4Cr)|`-cdz}BmW|JR1D9QQ?f5~1SMX|52(jS%LVC=Vcx}#~65Eh>e zbN#6~X`!sbI?BhG_#pw|2)s~aM)d*Z2gdRsu7_lre&!z(B6LdGcZ z>;xW9Q%fnuK`^HDCbAmpLqS^l795m>)7;{^)8v?fD`FcpiYj94+`gJWZ(buD9pC_Q+o8iurerGrNT1uI-S;-MU&PW=+1{6#81IX5@q zUqM1A#fbJ)X;4;;^~Xoq9jTAG6mN!NOpk`~q@TY!nlD|)9I^hz}ho*=u$K>;8WPdZ| z7<|p|5LEfa2cF}8o@@pxh!3eGX&M^qYs)Bnr&D>&k_GdlTgaHLPY+B|(_yr-!%bL* zFaos9#K%DcMb9(^mAk&rpgb!-%1+IrmqxgSz4pF@qvt}Sg!m5Suq zB#I!a4V(nALNIBrj-SC&@1(E`Eh?Q42Ll-=N8Fz)ax^$85}5A?(0#pTz5SfICCc1s zOy4bEU0GHks=YAHu{x7>84*2fE+X)wr$!s&i~I{@$8&en5EEMS@tK93+mBMCRbO-y z8thrbBujcfYvtHzlqsuzn3=rhGh4ydY@3>TEU*yh6+db2PDx7%?auAl^fyxLs{dkp zSTB==3Z_4L75@lBjAPEMS*}D|Tc0Dtyd8NtQ2kx zkzT~Uc0fnn8f|8~6}a#qJWABEh7`uF%|0g4L^&rQBjk89zIMJ3H8qBDb?2-Kwc8U^ zB`(h!DvrP8?&D;tvJ806EKf=1r-tDqru)Y0#jwkO`6_bfX^h;eBCMejRx*iBoGxj2 zs345wB2Fqwl7fk1UWAaUCu^WQgHRdCeP@tR zUGb&ZgMS6)XP@F3Mw@%C6xX@{EqL zPFj&~wa)j9rMi&cui_tmOx@g+n=}>gBYE(R-IM?e~o9(7VYv2 z13W@5-c>otxx!3#OSkw-z)OF{7j&&MSt*4yV3q!jGd4@#pkuVt8)YK;^-JlFqzJ9> zwx;+C!aD$+xn1h}H=V<-dYc5u&1AK}IL~F@?gQ2!9HJx(|4xrNwV*62q(xr4E4IrN z9F&}i9XTh}UZ23>6z(IHqSOxwt19-q$7JH48F7!7k|$PX0)y>1O*E{$-=x|oQetj%@G#r_9-Hj?aacLxR z37v5BeJck`C@)bTG=7F(tWvnR@N`rKVhQSa@2B-@DLM1F#VR_)$`6)f*b81Cu!$~H zq$GLP=hQvMyv^pTIs9&c#FkQcZx;!(ZXlyZn%xq_DhE1e7I%V`&>WJ4u8PgSJic00 zYz!kLiwTZFi>k-dp2)lmO0p8}=~j)MLK{o66t0NkbzUV(4wuuGVaViRSIEG8cr4z3 zCQRMP8uiTVh(L~^8k6 z7S2fASM>Yrw7eLD_qv4l3`y(4B1!!{TPJB4}El~BHDkJ2#a>8 zVD{I*GDQ+$%&x*~@YK4%weEf6xR}0pEd!Hd(%A$oCO%dIkZr@F%FgvBjy+suQ*s+6)`z)`{Fd0g#;# z*Mr5;X1%c7$vWe`$gx%UcZVno%H$&Ygzz834)5h8oX-cQ$%~}7l+|y2=ojW^XVl!6 zC7#)pMkxgCv8tN6Qe!xdy{(~dIuHEmK7KP`aOp0ajPM?|4xiN36cKk7H`yp9WfeB5f;c7_@TD|U6y4DQsF{mDH? z?gowaQ?=cryP_J(7i&f_n3>xtGcZn1J_7=bOrN-OhZ_VMHZkl4-55^yr%`69g2Hdzn?dU{#Og{D|siEGO5>3g%)e{Fr zIzwtTq0?PC=fU)nkJTd(sGR!UUYv;Q2#CZK6OGl2U^f2`0LVZ$zYfHF-^g#;d2BeLn5{E^jOq zf92t~MJw(k@&G3w<0R*d=Br#<{i5P~eIUMpY@{#}PSPx(la&NyjC%XhRh$*&q0;Q0 zr!QyWi%4x(F{Ib5HvGqTBc@3n-FsAxcXOuQEHT~b){;7mNF?)4(bR$msK*@FNnxSc zLuWnA+KtS&20&&O&T#zw-^*BgSC%A&*2)NBRmc!Y9AkJV1QXY%Vhv^Wn95cn z@j0pQuBW+%Jx@@VQCS;wDI2&CgN@n1Cmxxn!>L_Et&3~x3!7gv1OYH@-u&c_p1o>R z){K6)O**uAEs|uAI7Lbe;!1d<6 zSHogCG$nmj815n<1oP$vUuo!3#yfSc_CFMe?3oSE_H~3oL&os`0IL}3#{_$d@oVDe z2=c-=ea7K4x}!b4RznqB6nkiK%!koGj9Vg*#*X$ul) z_Gnz@h?Fqo(}Qur2D1Y7l~Y_dH0}w{dd(7mN6a(WW~UPs z>sdN&8pf}3?G;em53MupY37v3-UdqNoO@qfj?+7sd>gq|tT6iead`y7Q3K({}?XD#M!`Iv#_s9)j1^{Jg|6d@^A zl8%peZ=dzl#(0a)DjTMo^gnvM6XMGs9egU#{9UHoURr7TrLefSitPf(5cJ3dj(YHG z<)4gm+p_DcG_gb`)C#Wh2JB>Dde=kyF?>kSHLrwg;F~QMS@6BjhhT*xveg%9c-?cD z&gR?$hsXr&1$uM~t-}rXi*6>kjV46AmB3})$t*vuV+xR~N18HCKC4r;O?zK=)O>fA zSNg%Z)2E8!&4}47eIE)2N8&oy9j_!8KeU&Gi8iZsnpbh|jU8N{Dznl;$dV{Qv$?-A;GuSxLsucq60GR_J03n*nkccaV! zT(LZi*B|i$_SWoJy{*g_Dv(M`MIc}^k4o;A9&w?})|NcT;uFPkr_}JB4j%{VSDJ)6 zEZSxC_A&_WmK5A$W1M81`W||4Ygbg#{6BH4+UeKFPF+goHfwlGh^CcSsZcuO>0GbF z9RkNmO=kYk$>!fG8--)Svb?=N0xK)xBsUQJWzhAzGZNov`cZ3lmn?z2$Kb#u0B_K7a7%)ZYyJGp6`&!Q$%9T|~`vTg;AIlF_al{nQ^QJaxu> z>zw_eyl8wY`z-jDYipH@QM-s*z!d!WbMp{C-3?iz#u}BDi({upEw!E^1*aGRv&rR; z9e5pU=MRoj>OLs&9-U>OG1V^x`D>^WMJHy)+QgIn{B=A7UamhEPL={vi}#w-=6rPM z;;|UHLJ)6TXq)PM1>z47M-HHE)yLWr6Z1+&2P1PZJx@G!?Oq|R_`br@8Kjz2k_AF{ zC(2*13!IK{4o^@%mG0Wl?6vW0##)ud!`^s*!|+VOiMhJ-7!D8IMLGGGB~|;Xzk&a5CED| zc;MuK0L^ZByQXdk{peBuEG-zb|Lffo@ z$#)2XkO|&Salk!!uc?~i*%$2+q8qULRK8mrb?$T9txgTh+ozfr5sWqrm;eL!j($<~ z!TQp}XA`A3%at~-`Sv|oaIGmp#m%MV{WHXV3ivZy@Gr)%i~6Rerps-h>zDA$p`;{X zqfPnw3uZC%4j6-8lkraaEmQVx@y3^Imn*7V=`y9YtdNl;uaUxbf54p5YJM*8wv@hZ zzv6EXX}2H{=6y~O6m|zJ4^DAhWzWZNgV9|`r^ebv_>6@STO_v%*y?t~uiw!3tYuoY zY**G)HM)Cgr}f<3<(N7+e`4ovRn=ZO7qqf(4 zM)&%1$01@OC9nwN2LxB3crW7j!>=D*EuMqoC?eLe^XU4Ln@i+Ao>Snr)prki^u|K6 zV2z|6K^2ZWIKDPBMhIO}z<#kcX3JD;4@n0N#Q-&!&YAAIm;nX54s@tTdcnU^Z zFrXA}j4(4_W9m!hX?mo6OWVr7nwqT26qX*G;nnI^8a1PcojQuvNv}qHfvbMk{vWi^ zEcG2f!P@4b71VxYYd)(TxeK|IB~@F1SJ%CFKMFo94~tLX?+|}uE`-r)H}-x)+?lcj zD#42o4o*EQ^N4tF#QL{`G<34iHCwrU!#WkWwPFDmEI{CO$7=fj0QOnaHLVxI`dzlS zWp$_A{{X^EbQU?|*xOps@yFp`Q;fjj=~0A|*6XSAm@IZGt|oAo!)MdT`rpPs68tmp z^7F!W{w90tYkhX+OIv%WVe=9h5C-|c`GTF@KsfKkZR+-RI`@avKa+Q7JZmg$Mpe~@ zLHZCyeA)X{M>A-j3FV62XA9zYjzU*HSa`9YZbm;E+4zg%&k*=)_FDK=u6S=zI(_rc zr$Z@aS4kslY%)5x3=TSa*OiOG!lx@+%2xcWdQ|JUIVZALFg`GRO7Smp?8i$M$469k?2>oa^a~;Gkogn)cNZ9rC8!5;qbd?``G)>NBEJaSjzC9 z2WnRrshB6an_0EDBjo`7-km_;V<6VXq4CDf)>|m<{u^sE3sjG6w%VPmqXkyMX%u5| z$u;@Rnxw%(NDt4A+l~s4uV3-23wOPmG`cRVa!@vT>zsGs*8K5L;QU4XwO#Z-QS^U` zuYcl8TgZF|Z3HtN#J7lHW{3sLG1|Mb22S6?xStkyj`r_W3u+=d&Z%(gY$jsJfk9`H zfH^9vF~?JZ-oAJEC*iwj^!v{fY93^lcWERVeX^+x$&e&*p5);G{{VWub3yRVxBmbO z^7F;ozO?sx8Pdd7+D*qI2@4N1Y2yfXfsRWMPuJ$NiP5cDD_KQ8`m?GynziX(XLoO= z>iUJHv~wu8waD|D6&qWUax=;4j-2MVZudmuH2|O-j1tUyj}ry5nr*YZ zD5D8(rHuM$XLW|}zCFaZe^xIKOFI`;Z=SQ>TKnHIOHOXl1&UPi9Z zJ9&@27aKu5>?_VW`Lm2>yjxfC%z8ebG_&8qVKfiCNKm;koScxyVF!br%Wa7R?(?4jtUl0o$Ys)M9 z8Ii!7?1OSB1#og$U}v1?oOG*ld}O%R_1P_SKkayJY@z!_-Sk$EaM8ke5fqH@&crAr zg#_|X73;j7x=C``jZ?d^?4CIIqkZ6gPfcxOPm&D_P?=$C#GOQuvjWF*g(GOj3Ei9? z2U_Z^ymz44T3TygZ-)BLXxc~~)^%vyAQ@K40FjSxO!UvgJ~Z)t_ltEYBQ_CVSy)cS zIWANS^oxQFsN8qQ0Q36tzAn`R+v#S>BDT`_7O*6|V`7H+6p^`#f?EKdGv2$X?^yzZY*j8K}H>msTza^4AKHxZJF)K+aTy+;fWZT}`(5jyWV545K7)atR-e zeee5Q_m6ry1Wm7CnPCjj{BuxD);w>23&*Mv2uXISY$eJc; z6U->e6^|g~4^9n!gOlSPBMlk7`udnxf{d=VXxH%7mZNjy3wzsJTZy4n8}4IL6mij; z7_WMLLfcoen%SqjxQY}cfiM^#g2$8iW1QD7F1cw2oR*#(@Z6STX!79*M%6zz%%t@` zrlGO9*ABmGA-FJ2AvgvFWKexLIRhg;{p+$*((ghkK3!SRwzDKqOQKrdK^4BxqwNYd ztebJ1V4UFb`O~!6Ww@Cn)ox*$H6>LtcT33b2g{sN*w|fIYx3KTLf249llRjtnzP}7 z<0mVg*w50ntThcT4N7xw1?gSMrHWfioutTFH+4No+Cj&yXeWpiS-qZ(r9m7> z3r+>Mn$B~BliwXWaaniEuFZWUmm3n$bctnDnUwTWFgIXuN403)mbtZQ-Du7OQqo}l z*Oubm@>Pyz-R8P*PjSEifA#BoK+t2fo#Zba<~Dj)WoG8R&q`$$5wK8 zuagmOA{J21af*; zNe_%QT})4J;w=u|(%j`(z~H*{&PP6;oYwxA<9lsqUwarV?UD%B%Xuzl1It18Km+AC z7|7e#^RF_sY)X&26s_||HzbwcL;6o0Y2ydILA+<0cH!$^Y|*l4v5}6nZWUX1G;Zgu zE<(A>1k-9T-t|rOO+G0?NquULP5?3vwQ+==iCl*`t=XYSP7Ow~qpsz2aq6cu{oGWA z!zUE&$27v(6x5L%kdiBr)F}rPSe|9vl(Eew^GzfwmL~vp&3U)Q4~l*p_)Fjzd`aSz z)EiEg>21NZgUn#flaewxz%-qbZIe2RI<|G%--^6F;mItQUDfO~w!D|iwigowGPW~; zp0)G0$M22M_$R~yWxzpMx%Pr-;<;h1M#hmm9)3~pg{vr62R`F+yJVy!E zv`-w}Y1eS-{vC#UX)RpYN;b-omK#Khq;A1E#~kEWEq&r2_(+>bv$?;$i^E!d;Qq?9 z)OODWy}HG;D-Z()5=MlmBlNE-SjkkBp-pJjle+yM`8`QcoZ)w+pW*&@_3C@4g8nmj z=f!^wz8!16Al75kwQWztmvJK65Ru0W3gMx+QP0l7aNKPNCb+*I`0vJ6-xF8HnthCx z8hz8)%?-piB6PQ!WM4H^LCbk(C4l>+9Q3aowHmd?zZR#X*{oU~nQo5)+aR}?IhQg@ zk&}iQljSUPw{AlYE6ZlT@kRHFq|)y$bt9+PYo^}rQ5!6=OC!j9)I~c}0ful0X2}_^ zD;tNYR}1XiTY6gUr**FTyK0W8@;Rpms(1XC>0%Je|` zRJ$g=muzvxBL?H;%#X(z1M5&){B-djhyD*~7ISJAz9Q5g!sctcnXXjbL3xjwHVAXO zCkjuX&3tL8SXp>~;-prZeAk+mmZEv*nmN(_)Xf@&h=%6@gAPsxF~F@GPYo@v#8@?5 zOHjPFw0mZlS3rI4gx{J=3{SduUl;|Hd4s9G# z>woZ>Y8q7L818)OWRr5n&y1X(yPW%H(zqWB*y+|@2i2#7>e>k}BakJ8QJlv4D#lkB zWB>Ej38>_qx*VW=LMyxm3u&RYSq~ zlpJ;DyyH~Vu4mEh?=`;@jUFizWQ>vdEZKGP$wQr_4Z|GqTn(tu;PGywq}b|BW>)Pc zmRY0PTYllU01&RD<P7CtbU_1`Cw(S;3Yj&L3$`a=~_-VY%mw*N2M8 z@fEAOl`2M0t9`m@)ABW^4|d4(n@<$q==w&7ABXkZnS@%bR`*g%F;MD+mT#DnLGF8F zrGAS>7}~MD{MX=PRwp#|&-J*23NMl&?N+}uTvO0Gliv2&j zw^{AX5*Jv(TXTlpWTkn|yh^^aH(KSLYe3 z5e5!P!1;YE%swmpLDhT#;Hz8R3&R(FD%9?-1SxNCDkqhYes^B~)JEfOCNP-=G;ai*JZZ)h1J zeVex`WM>C~T;cdv@UvF&+jxIg_>JR_73z#|)^~m;nXp0R6$}A5?djUN9!ZFjYNbzI z+28)NV5vzuG%WgTzs&kx>t67-oIcU3_=m$QKamM`8;Oe!THqKCAKj;P#8B z%{(4Au+f+9873BU~t5rvQ7NwX8BaZ{nMF{=Cd8acyt2O)K|p{{WH4 z-Tu>l23(CB!rnO7iN@B4PfK+_MwQf$rVV6I`$hPtQMq|^e}nqGgsDVp{b^%er~Atk zZ=Zf^*ZeW?qr=v^9B*?R+Yxf)%uoP3ow%%hJH(#`rTFD*@cKyfmGKS8&9$Z7>a_B4 zkbI_M+>Ssz}!0+exsrlHXso zV9?vDoD$Kn$Q{F)>u!#lrD&I0h5Xjm8hx}zS?86uq)0g|PhcxNT^bm8Ckkn|+=^MA zI=gCBTJ+QMJ~Nx)PsSZ|6R!MH@uceb-4r+G-9H70CMsyZW|=Qk{{U@xgJ0Fdeerv$ zPcUz&cVKJWb-$1Q00TTVZw$J}#Ek|4JVsbn6qa)$1}nG-(XuiK ez~2%)5%C!6 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%0D^>kExLk33SHkzXLAs2 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 literal 0 HcmV?d00001 diff --git a/examples/Data/Balbianello/BalbianelloMedium-3.jpg b/examples/Data/Balbianello/BalbianelloMedium-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..641d3e286141678c1377fb9d2407215959559148 GIT binary patch literal 102182 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 TAf$=O|4yQ@4h2+w|7QOOlM=0l literal 0 HcmV?d00001 diff --git a/examples/Data/Balbianello/BalbianelloMedium-4.jpg b/examples/Data/Balbianello/BalbianelloMedium-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..259929b65109867b0183a1272e3d959588b6650c GIT binary patch literal 96414 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≫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 Z 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%0AVl8*vHL*$mv;A%3)4! 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ΜnMo{qSJQK3u0v`g>L~ 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≤9 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 literal 0 HcmV?d00001 diff --git a/examples/Data/Balbianello/BalbianelloMedium-5.jpg b/examples/Data/Balbianello/BalbianelloMedium-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f4dd16c8b1c58e39b700aaec6259ec7b5fca72a GIT binary patch literal 85882 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 H>VN;)!Y(O( literal 0 HcmV?d00001 From 4ec1cc9e5a7cdbcfec37e10c6233c995c5059075 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 18 Jun 2012 14:04:50 +0000 Subject: [PATCH 384/914] ignore .mat files, more targets --- .cproject | 362 +++++++++++++++++++++++++++++------------------------- 1 file changed, 198 insertions(+), 164 deletions(-) diff --git a/.cproject b/.cproject index 1a5a51c19..b0ad23ee6 100644 --- a/.cproject +++ b/.cproject @@ -311,14 +311,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -345,6 +337,7 @@ make + tests/testBayesTree.run true false @@ -352,6 +345,7 @@ make + testBinaryBayesNet.run true false @@ -399,6 +393,7 @@ make + testSymbolicBayesNet.run true false @@ -406,6 +401,7 @@ make + tests/testSymbolicFactor.run true false @@ -413,6 +409,7 @@ make + testSymbolicFactorGraph.run true false @@ -428,11 +425,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -441,6 +447,14 @@ true true + + make + -j5 + testIMUSystem.run + true + true + true + make -j5 @@ -513,22 +527,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -545,6 +543,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -569,18 +583,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check + true + true + true + + + make + -j2 + clean true true true @@ -665,26 +687,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -841,10 +863,10 @@ true true - + make - -j2 - testNonlinearFactorGraph.run + -j5 + testGradientDescentOptimizer.run true true true @@ -921,16 +943,17 @@ true true - + make -j5 - testSubgraphPreconditioner.run + testGaussianJunctionTreeB.run true true true make + testGraph.run true false @@ -938,6 +961,7 @@ make + testJunctionTree.run true false @@ -945,6 +969,7 @@ make + testSymbolicBayesNetB.run true false @@ -966,6 +991,14 @@ true true + + make + -j5 + clean + true + true + true + make -j2 @@ -1056,6 +1089,7 @@ make + testErrors.run true false @@ -1511,7 +1545,6 @@ make - testSimulated2DOriented.run true false @@ -1551,7 +1584,6 @@ make - testSimulated2D.run true false @@ -1559,7 +1591,6 @@ make - testSimulated3D.run true false @@ -1749,10 +1780,10 @@ true true - + make -j5 - OdometryExample.run + LocalizationExample2.run true true true @@ -1775,7 +1806,6 @@ make - tests/testGaussianISAM2 true false @@ -1797,108 +1827,12 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make - -j3 + -j2 install true - false + true true @@ -1911,7 +1845,7 @@ make - -j3 + -j2 check true false @@ -2094,6 +2028,7 @@ cpack + -G DEB true false @@ -2101,6 +2036,7 @@ cpack + -G RPM true false @@ -2108,6 +2044,7 @@ cpack + -G TGZ true false @@ -2115,6 +2052,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2208,42 +2146,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap_gtsam + -j2 + timeRot3.run true true true - + make - -j5 - wrap + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2287,6 +2281,46 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + From d57fc32e742ebc5181611c567a896d69fff4681a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 18 Jun 2012 14:55:30 +0000 Subject: [PATCH 385/914] To simplify FactorGraph, removed convertCastFactors and dynamicCastFactors from FactorGraph - replaced their calls with in-place code to do the needed conversions --- gtsam/inference/FactorGraph.h | 33 ------------------- gtsam/inference/tests/testFactorGraph.cpp | 6 ---- gtsam/linear/GaussianConditional.h | 2 +- gtsam/linear/GaussianFactorGraph.cpp | 13 ++++++-- gtsam/linear/HessianFactor.h | 4 +-- gtsam/linear/JacobianFactor.cpp | 12 +++++++ gtsam/linear/JacobianFactor.h | 3 ++ gtsam/linear/SubgraphSolver.cpp | 27 ++++++++++++--- .../linear/tests/testGaussianFactorGraph.cpp | 28 ++++++++++------ gtsam/linear/tests/testHessianFactor.cpp | 18 +++++++--- gtsam/nonlinear/GradientDescentOptimizer.cpp | 10 ++++-- gtsam/nonlinear/NonlinearISAM.cpp | 6 ++-- gtsam/slam/tests/testPlanarSLAM.cpp | 10 +++--- tests/smallExample.cpp | 12 +++---- 14 files changed, 104 insertions(+), 80 deletions(-) diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index a1a14b01c..89662ffc4 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -200,39 +200,6 @@ template class BayesTree; /** return the number valid factors */ size_t nrFactors() const; - /** dynamic_cast the factor pointers down or up the class hierarchy */ - template - typename RELATED::shared_ptr dynamicCastFactors() const { - typename RELATED::shared_ptr ret(new RELATED); - ret->reserve(this->size()); - BOOST_FOREACH(const sharedFactor& factor, *this) { - typename RELATED::FactorType::shared_ptr castedFactor(boost::dynamic_pointer_cast(factor)); - if(castedFactor) - ret->push_back(castedFactor); - else - throw std::invalid_argument("In FactorGraph::dynamic_factor_cast(), dynamic_cast failed, meaning an invalid cast was requested."); - } - return ret; - } - - /** - * dynamic_cast factor pointers if possible, otherwise convert with a - * constructor of the target type. - */ - template - typename TARGET::shared_ptr convertCastFactors() const { - typename TARGET::shared_ptr ret(new TARGET); - ret->reserve(this->size()); - BOOST_FOREACH(const sharedFactor& factor, *this) { - typename TARGET::FactorType::shared_ptr castedFactor(boost::dynamic_pointer_cast(factor)); - if(castedFactor) - ret->push_back(castedFactor); - else - ret->push_back(typename TARGET::FactorType::shared_ptr(new typename TARGET::FactorType(*factor))); - } - return ret; - } - private: /** Serialization function */ diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index 8669329bb..4743d1102 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -91,12 +91,6 @@ typedef boost::shared_ptr shared; // CHECK(singletonGraph_excepted.equals(singletonGraph)); //} -/* ************************************************************************* */ -TEST(FactorGraph, dynamic_factor_cast) { - FactorGraph fg; - fg.dynamicCastFactors >(); -} - /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/linear/GaussianConditional.h b/gtsam/linear/GaussianConditional.h index 2f91a6115..0dc8d771a 100644 --- a/gtsam/linear/GaussianConditional.h +++ b/gtsam/linear/GaussianConditional.h @@ -80,7 +80,7 @@ public: GaussianConditional(); /** constructor */ - GaussianConditional(Index key); + explicit GaussianConditional(Index key); /** constructor with no parents * |Rx-d| diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index 853cf26ba..cd436a0b2 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -160,9 +160,18 @@ namespace gtsam { /* ************************************************************************* */ Matrix GaussianFactorGraph::denseJacobian() const { + // Convert to Jacobians + FactorGraph jfg; + jfg.reserve(this->size()); + BOOST_FOREACH(const sharedFactor& factor, *this) { + if(boost::shared_ptr jf = + boost::dynamic_pointer_cast(factor)) + jfg.push_back(jf); + else + jfg.push_back(boost::make_shared(*factor)); + } // combine all factors - JacobianFactor combined(*CombineJacobians(*convertCastFactors > (), VariableSlots(*this))); + JacobianFactor combined(*CombineJacobians(jfg, VariableSlots(*this))); return combined.matrix_augmented(); } diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 5bbee3708..4be0b950c 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -197,10 +197,10 @@ namespace gtsam { const std::vector& gs, double f); /** Construct from Conditional Gaussian */ - HessianFactor(const GaussianConditional& cg); + explicit HessianFactor(const GaussianConditional& cg); /** Convert from a JacobianFactor (computes A^T * A) or HessianFactor */ - HessianFactor(const GaussianFactor& factor); + explicit HessianFactor(const GaussianFactor& factor); /** Special constructor used in EliminateCholesky which combines the given factors */ HessianFactor(const FactorGraph& factors, diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 677900b01..bdb51701e 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -66,6 +66,18 @@ namespace gtsam { assertInvariants(); } + /* ************************************************************************* */ + JacobianFactor::JacobianFactor(const GaussianFactor& gf) : Ab_(matrix_) { + // Copy the matrix data depending on what type of factor we're copying from + if(const JacobianFactor* rhs = dynamic_cast(&gf)) + *this = JacobianFactor(*rhs); + else if(const HessianFactor* rhs = dynamic_cast(&gf)) + *this = JacobianFactor(*rhs); + else + throw std::invalid_argument("In JacobianFactor(const GaussianFactor& rhs), rhs is neither a JacobianFactor nor a HessianFactor"); + assertInvariants(); + } + /* ************************************************************************* */ JacobianFactor::JacobianFactor() : Ab_(matrix_) { assertInvariants(); } diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index d45873c3b..276d11f27 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -102,6 +102,9 @@ namespace gtsam { /** Copy constructor */ JacobianFactor(const JacobianFactor& gf); + /** Convert from other GaussianFactor */ + JacobianFactor(const GaussianFactor& gf); + /** default constructor for I/O */ JacobianFactor(); diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index d2af81a6c..9b37d9a4b 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -52,10 +52,29 @@ SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(*Ab1)->eliminate(&EliminateQR); VectorValues::shared_ptr xbar(new VectorValues(gtsam::optimize(*Rc1))); - pc_ = boost::make_shared( - Ab1->dynamicCastFactors >(), - Ab2->dynamicCastFactors >(), - Rc1, xbar); + // Convert or cast Ab1 to JacobianFactors + boost::shared_ptr > Ab1Jacobians = boost::make_shared >(); + Ab1Jacobians->reserve(Ab1->size()); + BOOST_FOREACH(const boost::shared_ptr& factor, *Ab1) { + if(boost::shared_ptr jf = + boost::dynamic_pointer_cast(factor)) + Ab1Jacobians->push_back(jf); + else + Ab1Jacobians->push_back(boost::make_shared(*factor)); + } + + // Convert or cast Ab2 to JacobianFactors + boost::shared_ptr > Ab2Jacobians = boost::make_shared >(); + Ab1Jacobians->reserve(Ab2->size()); + BOOST_FOREACH(const boost::shared_ptr& factor, *Ab2) { + if(boost::shared_ptr jf = + boost::dynamic_pointer_cast(factor)) + Ab2Jacobians->push_back(jf); + else + Ab2Jacobians->push_back(boost::make_shared(*factor)); + } + + pc_ = boost::make_shared(Ab1Jacobians, Ab2Jacobians, Rc1, xbar); } VectorValues SubgraphSolver::optimize() { diff --git a/gtsam/linear/tests/testGaussianFactorGraph.cpp b/gtsam/linear/tests/testGaussianFactorGraph.cpp index 34009f856..6bb4a6348 100644 --- a/gtsam/linear/tests/testGaussianFactorGraph.cpp +++ b/gtsam/linear/tests/testGaussianFactorGraph.cpp @@ -50,10 +50,8 @@ TEST(GaussianFactorGraph, initialization) { fg.add(0, -5*eye(2), 2, 5*eye(2), Vector_(2, 0.0, 1.0), unit2); fg.add(1, -5*eye(2), 2, 5*eye(2), Vector_(2, -1.0, 1.5), unit2); - FactorGraph graph = *fg.dynamicCastFactors >(); - - EXPECT_LONGS_EQUAL(4, graph.size()); - JacobianFactor factor = *graph[0]; + EXPECT_LONGS_EQUAL(4, fg.size()); + JacobianFactor factor = *boost::dynamic_pointer_cast(fg[0]); // Test sparse, which takes a vector and returns a matrix, used in MATLAB // Note that this the augmented vector and the RHS is in column 7 @@ -155,8 +153,14 @@ TEST(GaussianFactorGraph, Combine2) gfg.add(0, A10, 1, A11, b1, noiseModel::Diagonal::Sigmas(s1, true)); gfg.add(1, A21, b2, noiseModel::Diagonal::Sigmas(s2, true)); - JacobianFactor actual = *CombineJacobians(*gfg.dynamicCastFactors > (), VariableSlots(gfg)); + // Convert to Jacobians, inefficient copy of all factors instead of selectively converting only Hessians + FactorGraph jacobians; + BOOST_FOREACH(const GaussianFactorGraph::sharedFactor& factor, gfg) { + jacobians.push_back(boost::make_shared(*factor)); + } + + // Combine Jacobians into a single dense factor + JacobianFactor actual = *CombineJacobians(jacobians, VariableSlots(gfg)); Matrix zero3x3 = zeros(3,3); Matrix A0 = gtsam::stack(3, &A10, &zero3x3, &zero3x3); @@ -213,8 +217,7 @@ TEST(GaussianFactor, CombineAndEliminate) GaussianConditional::shared_ptr actualBN; GaussianFactor::shared_ptr actualFactor; - boost::tie(actualBN, actualFactor) = // - EliminateQR(*gfg.dynamicCastFactors > (), 1); + boost::tie(actualBN, actualFactor) = EliminateQR(gfg, 1); JacobianFactor::shared_ptr actualJacobian = boost::dynamic_pointer_cast< JacobianFactor>(actualFactor); @@ -410,9 +413,14 @@ TEST(GaussianFactor, eliminateFrontals) Matrix actualDense = factors.denseJacobian(); EXPECT(assert_equal(2.0 * Ab, actualDense)); + // Convert to Jacobians, inefficient copy of all factors instead of selectively converting only Hessians + FactorGraph jacobians; + BOOST_FOREACH(const GaussianFactorGraph::sharedFactor& factor, factors) { + jacobians.push_back(boost::make_shared(*factor)); + } + // Create combined factor - JacobianFactor combined(*CombineJacobians(*factors.dynamicCastFactors > (), VariableSlots(factors))); + JacobianFactor combined(*CombineJacobians(jacobians, VariableSlots(factors))); // Copies factors as they will be eliminated in place JacobianFactor actualFactor_QR = combined; diff --git a/gtsam/linear/tests/testHessianFactor.cpp b/gtsam/linear/tests/testHessianFactor.cpp index 59873862a..bd76fd1d0 100644 --- a/gtsam/linear/tests/testHessianFactor.cpp +++ b/gtsam/linear/tests/testHessianFactor.cpp @@ -414,10 +414,20 @@ TEST_UNSAFE(HessianFactor, CombineAndEliminate) // create expected Hessian after elimination HessianFactor expectedCholeskyFactor(expectedFactor); - GaussianFactorGraph::EliminationResult actualCholesky = EliminateCholesky( - *gfg.convertCastFactors > (), 1); - HessianFactor::shared_ptr actualFactor = boost::dynamic_pointer_cast< - HessianFactor>(actualCholesky.second); + // Convert all factors to hessians + FactorGraph hessians; + BOOST_FOREACH(const GaussianFactorGraph::sharedFactor& factor, gfg) { + if(boost::shared_ptr hf = boost::dynamic_pointer_cast(factor)) + hessians.push_back(hf); + else if(boost::shared_ptr jf = boost::dynamic_pointer_cast(factor)) + hessians.push_back(boost::make_shared(*jf)); + else + CHECK(false); + } + + // Eliminate + GaussianFactorGraph::EliminationResult actualCholesky = EliminateCholesky(gfg, 1); + HessianFactor::shared_ptr actualFactor = boost::dynamic_pointer_cast(actualCholesky.second); EXPECT(assert_equal(*expectedBN, *actualCholesky.first, 1e-6)); EXPECT(assert_equal(expectedCholeskyFactor, *actualFactor, 1e-6)); diff --git a/gtsam/nonlinear/GradientDescentOptimizer.cpp b/gtsam/nonlinear/GradientDescentOptimizer.cpp index 2243577c7..4a471de4d 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.cpp +++ b/gtsam/nonlinear/GradientDescentOptimizer.cpp @@ -25,10 +25,16 @@ void gradientInPlace(const NonlinearFactorGraph &nfg, const Values &values, cons // Linearize graph GaussianFactorGraph::shared_ptr linear = nfg.linearize(values, ordering); - const FactorGraph::shared_ptr jfg = linear->dynamicCastFactors >(); + FactorGraph jfg; jfg.reserve(linear->size()); + BOOST_FOREACH(const GaussianFactorGraph::sharedFactor& factor, *linear) { + if(boost::shared_ptr jf = boost::dynamic_pointer_cast(factor)) + jfg.push_back((jf)); + else + jfg.push_back(boost::make_shared(*factor)); + } // compute the gradient direction - gradientAtZero(*jfg, g); + gradientAtZero(jfg, g); } diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index 5f95a0609..a1700beca 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -58,8 +58,7 @@ void NonlinearISAM::update(const NonlinearFactorGraph& newFactors, BOOST_FOREACH(Key key, factor->keys()) ordering_.tryInsert(key, ordering_.nVars()); // will do nothing if already present - boost::shared_ptr linearizedNewFactors( - newFactors.linearize(linPoint_, ordering_)->dynamicCastFactors()); + boost::shared_ptr linearizedNewFactors = newFactors.linearize(linPoint_, ordering_); // Update ISAM isam_.update(*linearizedNewFactors); @@ -81,8 +80,7 @@ void NonlinearISAM::reorder_relinearize() { ordering_ = *factors_.orderingCOLAMD(newLinPoint); // Create a linear factor graph at the new linearization point - boost::shared_ptr gfg( - factors_.linearize(newLinPoint, ordering_)->dynamicCastFactors()); + boost::shared_ptr gfg = factors_.linearize(newLinPoint, ordering_); // Just recreate the whole BayesTree isam_.update(*gfg); diff --git a/gtsam/slam/tests/testPlanarSLAM.cpp b/gtsam/slam/tests/testPlanarSLAM.cpp index c5d77faa3..81a15290c 100644 --- a/gtsam/slam/tests/testPlanarSLAM.cpp +++ b/gtsam/slam/tests/testPlanarSLAM.cpp @@ -174,12 +174,10 @@ TEST( planarSLAM, constructor ) Vector expected2 = Vector_(1, -0.1); Vector expected3 = Vector_(1, 0.22); // Get NoiseModelFactors - FactorGraph GNM = - *G.dynamicCastFactors >(); - EXPECT(assert_equal(expected0, GNM[0]->unwhitenedError(c))); - EXPECT(assert_equal(expected1, GNM[1]->unwhitenedError(c))); - EXPECT(assert_equal(expected2, GNM[2]->unwhitenedError(c))); - EXPECT(assert_equal(expected3, GNM[3]->unwhitenedError(c))); + EXPECT(assert_equal(expected0, boost::dynamic_pointer_cast(G[0])->unwhitenedError(c))); + EXPECT(assert_equal(expected1, boost::dynamic_pointer_cast(G[1])->unwhitenedError(c))); + EXPECT(assert_equal(expected2, boost::dynamic_pointer_cast(G[2])->unwhitenedError(c))); + EXPECT(assert_equal(expected3, boost::dynamic_pointer_cast(G[3])->unwhitenedError(c))); } /* ************************************************************************* */ diff --git a/tests/smallExample.cpp b/tests/smallExample.cpp index 3dd0324dc..b0af6c723 100644 --- a/tests/smallExample.cpp +++ b/tests/smallExample.cpp @@ -138,23 +138,23 @@ namespace example { /* ************************************************************************* */ JacobianFactorGraph createGaussianFactorGraph(const Ordering& ordering) { // Create empty graph - GaussianFactorGraph fg; + JacobianFactorGraph fg; SharedDiagonal unit2 = noiseModel::Unit::Create(2); // linearized prior on x1: c[_x1_]+x1=0 i.e. x1=-c[_x1_] - fg.add(ordering[X(1)], 10*eye(2), -1.0*ones(2), unit2); + fg.push_back(boost::make_shared(ordering[X(1)], 10*eye(2), -1.0*ones(2), unit2)); // odometry between x1 and x2: x2-x1=[0.2;-0.1] - fg.add(ordering[X(1)], -10*eye(2),ordering[X(2)], 10*eye(2), Vector_(2, 2.0, -1.0), unit2); + fg.push_back(boost::make_shared(ordering[X(1)], -10*eye(2),ordering[X(2)], 10*eye(2), Vector_(2, 2.0, -1.0), unit2)); // measurement between x1 and l1: l1-x1=[0.0;0.2] - fg.add(ordering[X(1)], -5*eye(2), ordering[L(1)], 5*eye(2), Vector_(2, 0.0, 1.0), unit2); + fg.push_back(boost::make_shared(ordering[X(1)], -5*eye(2), ordering[L(1)], 5*eye(2), Vector_(2, 0.0, 1.0), unit2)); // measurement between x2 and l1: l1-x2=[-0.2;0.3] - fg.add(ordering[X(2)], -5*eye(2), ordering[L(1)], 5*eye(2), Vector_(2, -1.0, 1.5), unit2); + fg.push_back(boost::make_shared(ordering[X(2)], -5*eye(2), ordering[L(1)], 5*eye(2), Vector_(2, -1.0, 1.5), unit2)); - return *fg.dynamicCastFactors(); + return fg; } /* ************************************************************************* */ From 509c2b4c67cc6b406cd366dcec6eac4059c6ebc0 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Mon, 18 Jun 2012 18:12:19 +0000 Subject: [PATCH 386/914] wrap LieVector --- gtsam.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/gtsam.h b/gtsam.h index 1b9689a77..20f0e7a57 100644 --- a/gtsam.h +++ b/gtsam.h @@ -63,6 +63,34 @@ namespace gtsam { // base //************************************************************************* +class LieVector { + // Standard constructors + LieVector(); + LieVector(Vector v); + + // Standard interface + Vector vector() const; + + // Testable + void print(string s) const; + bool equals(const gtsam::LieVector& expected, double tol) const; + + // Group + static gtsam::LieVector identity(); + gtsam::LieVector inverse() const; + gtsam::LieVector compose(const gtsam::LieVector& p) const; + gtsam::LieVector between(const gtsam::LieVector& l2) const; + + // Manifold + size_t dim() const; + gtsam::LieVector retract(Vector v) const; + Vector localCoordinates(const gtsam::LieVector& t2) const; + + // Lie group + static gtsam::LieVector Expmap(Vector v); + static Vector Logmap(const gtsam::LieVector& p); +}; + //************************************************************************* // geometry //************************************************************************* From 73c87d1b1087d8ba27c4fc430a5ff381395514bf Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 18 Jun 2012 19:33:45 +0000 Subject: [PATCH 387/914] Added keyformatter arguments --- gtsam/nonlinear/NonlinearISAM.cpp | 8 ++++---- gtsam/nonlinear/NonlinearISAM.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index a1700beca..6820b3e05 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -104,12 +104,12 @@ Matrix NonlinearISAM::marginalCovariance(Key key) const { } /* ************************************************************************* */ -void NonlinearISAM::print(const string& s) const { +void NonlinearISAM::print(const string& s, const KeyFormatter& keyFormatter) const { cout << s << "ReorderInterval: " << reorderInterval_ << " Current Count: " << reorderCounter_ << endl; isam_.print("GaussianISAM:\n"); - linPoint_.print("Linearization Point:\n"); - ordering_.print("System Ordering:\n"); - factors_.print("Nonlinear Graph:\n"); + linPoint_.print("Linearization Point:\n", keyFormatter); + ordering_.print("System Ordering:\n", keyFormatter); + factors_.print("Nonlinear Graph:\n", keyFormatter); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/NonlinearISAM.h b/gtsam/nonlinear/NonlinearISAM.h index d2ca75c42..7a7b9cd2c 100644 --- a/gtsam/nonlinear/NonlinearISAM.h +++ b/gtsam/nonlinear/NonlinearISAM.h @@ -86,7 +86,7 @@ public: int reorderCounter() const { return reorderCounter_; } /// Date: Mon, 18 Jun 2012 23:31:57 +0000 Subject: [PATCH 388/914] Cleaned up header and wrapped most functions (why not clean up stuff and be comprehensive when you wrap a function in class Foo, all? Takes a few minutes extra, but you're right there!) --- gtsam.h | 40 ++++---- gtsam/geometry/PinholeCamera.h | 164 +++++++++++++++++---------------- 2 files changed, 111 insertions(+), 93 deletions(-) diff --git a/gtsam.h b/gtsam.h index 20f0e7a57..12d299b85 100644 --- a/gtsam.h +++ b/gtsam.h @@ -461,29 +461,37 @@ class CalibratedCamera { class SimpleCamera { // Standard Constructors and Named Constructors SimpleCamera(); - SimpleCamera(const gtsam::Pose3& pose, const gtsam::Cal3_S2& k); - SimpleCamera(const gtsam::Cal3_S2& k, const gtsam::Pose3& pose); + SimpleCamera(const gtsam::Pose3& pose); + SimpleCamera(const gtsam::Pose3& pose, const gtsam::Cal3_S2& K); + static gtsam::SimpleCamera level(const gtsam::Cal3_S2& K, + const gtsam::Pose2& pose, double height); + static gtsam::SimpleCamera level(const gtsam::Pose2& pose, double height); + static gtsam::SimpleCamera lookat(const gtsam::Point3& eye, + const gtsam::Point3& target, const gtsam::Point3& upVector, + const gtsam::Cal3_S2& K); // Testable void print(string s) const; bool equals(const gtsam::SimpleCamera& camera, double tol) const; - // Action on Point3 - gtsam::Point2 project(const gtsam::Point3& point); - pair projectSafe(const gtsam::Point3& pw) const; - static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); - - // Backprojection - gtsam::Point3 backproject(const gtsam::Point2& pi, double scale) const; - gtsam::Point3 backproject_from_camera(const gtsam::Point2& pi, double scale) const; - // Standard Interface - gtsam::Pose3 pose() const; + gtsam::Pose3 pose() const; + gtsam::Cal3_S2 calibration(); - // Convenient generators - static gtsam::SimpleCamera lookat(const gtsam::Point3& eye, - const gtsam::Point3& target, const gtsam::Point3& upVector, - const gtsam::Cal3_S2& k); + // Manifold + gtsam::SimpleCamera retract(const Vector& d) const; + Vector localCoordinates(const gtsam::SimpleCamera& T2) const; + size_t dim() const; + static size_t Dim(); + + // Transformations and measurement functions + static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); + pair projectSafe(const gtsam::Point3& pw) const; + gtsam::Point2 project(const gtsam::Point3& point); + gtsam::Point3 backproject(const gtsam::Point2& p, double depth) const; + gtsam::Point3 backproject_from_camera(const gtsam::Point2& p, double depth) const; + double range(const gtsam::Point3& point); + // double range(const gtsam::Pose3& point); // FIXME, overload }; //************************************************************************* diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index a267a20b0..139523802 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -54,23 +54,84 @@ namespace gtsam { explicit PinholeCamera(const Pose3& pose):pose_(pose){} /** constructor with pose and calibration */ - PinholeCamera(const Pose3& pose, const Calibration& k):pose_(pose),K_(k) {} + PinholeCamera(const Pose3& pose, const Calibration& K):pose_(pose),K_(K) {} /** alternative constructor with pose and calibration */ - PinholeCamera(const Calibration& k, const Pose3& pose):pose_(pose),K_(k) {} + PinholeCamera(const Calibration& K, const Pose3& pose):pose_(pose),K_(K) {} + + /// @} + /// @name Named Constructors + /// @{ + + /** + * Create a level camera at the given 2D pose and height + * @param pose2 specifies the location and viewing direction + * (theta 0 = looking in direction of positive X axis) + * @param height camera height + */ + static PinholeCamera level(const Calibration &K, const Pose2& pose2, double height) { + const double st = sin(pose2.theta()), ct = cos(pose2.theta()); + const Point3 x(st, -ct, 0), y(0, 0, -1), z(ct, st, 0); + const Rot3 wRc(x, y, z); + const Point3 t(pose2.x(), pose2.y(), height); + const Pose3 pose3(wRc, t); + return PinholeCamera(pose3, K); + } + + /// PinholeCamera::level with default calibration + static PinholeCamera level(const Pose2& pose2, double height) { + return PinholeCamera::level(Calibration(), pose2, height); + } + + /** + * Create a camera at the given eye position looking at a target point in the scene + * with the specified up direction vector. + * @param eye specifies the camera position + * @param target the point to look at + * @param upVector specifies the camera up direction vector, + * doesn't need to be on the image plane nor orthogonal to the viewing axis + * @param K optional calibration parameter + */ + static PinholeCamera lookat(const Point3& eye, const Point3& target, const Point3& upVector, const Calibration& K = Calibration()) { + Point3 zc = target-eye; + zc = zc/zc.norm(); + Point3 xc = (-upVector).cross(zc); // minus upVector since yc is pointing down + xc = xc/xc.norm(); + Point3 yc = zc.cross(xc); + Pose3 pose3(Rot3(xc,yc,zc), eye); + return PinholeCamera(pose3, K); + } /// @} /// @name Advanced Constructors /// @{ - explicit PinholeCamera(const Vector &v){ + explicit PinholeCamera(const Vector &v) { pose_ = Pose3::Expmap(v.head(Pose3::Dim())); - if ( v.size() > Pose3::Dim()) { + if (v.size() > Pose3::Dim()) { K_ = Calibration(v.tail(Calibration::Dim())); } } - PinholeCamera(const Vector &v, const Vector &k) : pose_(Pose3::Expmap(v)),K_(k){} + PinholeCamera(const Vector &v, const Vector &K) : + pose_(Pose3::Expmap(v)), K_(K) { + } + + /// @} + /// @name Testable + /// @{ + + /// assert equality up to a tolerance + bool equals (const PinholeCamera &camera, double tol = 1e-9) const { + return pose_.equals(camera.pose(), tol) && + K_.equals(camera.calibration(), tol) ; + } + + /// print + void print(const std::string& s = "PinholeCamera") const { + pose_.print(s+".pose"); + K_.print(s+".calibration"); + } /// @} /// @name Standard Interface @@ -90,30 +151,18 @@ namespace gtsam { /// return calibration inline const Calibration& calibration() const { return K_; } - /// compose two cameras + /// @} + /// @name Group ?? Frank says this might not make sense + /// @{ + + /// compose two cameras: TODO Frank says this might not make sense inline const PinholeCamera compose(const Pose3 &c) const { - return PinholeCamera( pose_ * c, K_ ) ; + return PinholeCamera( pose_ * c, K_ ) ; } - /// inverse + /// compose two cameras: TODO Frank says this might not make sense inline const PinholeCamera inverse() const { - return PinholeCamera( pose_.inverse(), K_ ) ; - } - - /// @} - /// @name Testable - /// @{ - - /// assert equality up to a tolerance - bool equals (const PinholeCamera &camera, double tol = 1e-9) const { - return pose_.equals(camera.pose(), tol) && - K_.equals(camera.calibration(), tol) ; - } - - /// print - void print(const std::string& s = "PinholeCamera") const { - pose_.print(s+".pose"); - K_.print(s+".calibration"); + return PinholeCamera( pose_.inverse(), K_ ) ; } /// @} @@ -137,58 +186,21 @@ namespace gtsam { return d; } - /// Lie group dimensionality + /// Manifold dimension inline size_t dim() const { return pose_.dim() + K_.dim(); } - /// Lie group dimensionality + /// Manifold dimension inline static size_t Dim() { return Pose3::Dim() + Calibration::Dim(); } - /** - * Create a level camera at the given 2D pose and height - * @param pose2 specifies the location and viewing direction - * (theta 0 = looking in direction of positive X axis) - */ - static PinholeCamera level(const Pose2& pose2, double height) { - return PinholeCamera::level(Calibration(), pose2, height); - } - - static PinholeCamera level(const Calibration &K, const Pose2& pose2, double height) { - const double st = sin(pose2.theta()), ct = cos(pose2.theta()); - const Point3 x(st, -ct, 0), y(0, 0, -1), z(ct, st, 0); - const Rot3 wRc(x, y, z); - const Point3 t(pose2.x(), pose2.y(), height); - const Pose3 pose3(wRc, t); - return PinholeCamera(pose3, K); - } - - /** - * Create a camera at the given eye position looking at a target point in the scene - * with the specified up direction vector. - * @param eye specifies the camera position - * @param target the point to look at - * @param upVector specifies the camera up direction vector, - * doesn't need to be on the image plane nor orthogonal to the viewing axis - * @param K optional calibration parameter - */ - static PinholeCamera lookat(const Point3& eye, const Point3& target, const Point3& upVector, const Calibration& K = Calibration()) { - Point3 zc = target-eye; - zc = zc/zc.norm(); - Point3 xc = (-upVector).cross(zc); // minus upVector since yc is pointing down - xc = xc/xc.norm(); - Point3 yc = zc.cross(xc); - Pose3 pose3(Rot3(xc,yc,zc), eye); - return PinholeCamera(pose3, K); - } - /// @} /// @name Transformations and measurement functions /// @{ /** - * projects a 3-dimensional point in camera coordinates into the - * camera and returns a 2-dimensional point, no calibration applied - * With optional 2by3 derivative - */ + * projects a 3-dimensional point in camera coordinates into the + * camera and returns a 2-dimensional point, no calibration applied + * With optional 2by3 derivative + */ inline static Point2 project_to_camera(const Point3& P, boost::optional H1 = boost::none){ if (H1) { @@ -271,18 +283,16 @@ namespace gtsam { return pi; } - /** - * backproject a 2-dimensional point to a 3-dimension point - */ - - inline Point3 backproject(const Point2& pi, double scale) const { - const Point2 pn = K_.calibrate(pi); - const Point3 pc(pn.x()*scale, pn.y()*scale, scale); + /// backproject a 2-dimensional point to a 3-dimensional point at given depth + inline Point3 backproject(const Point2& p, double depth) const { + const Point2 pn = K_.calibrate(p); + const Point3 pc(pn.x()*depth, pn.y()*depth, depth); return pose_.transform_from(pc); } - inline Point3 backproject_from_camera(const Point2& pi, double scale) const { - return backproject(pi, scale); + /// backproject a 2-dimensional point to a 3-dimensional point at given depth + inline Point3 backproject_from_camera(const Point2& p, double depth) const { + return backproject(p, depth); } /** From 06f4de3981fc1a1b8648a661b12d1ad1e177475c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 19 Jun 2012 00:22:07 +0000 Subject: [PATCH 389/914] level is shadowed --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 12d299b85..5ec897fe1 100644 --- a/gtsam.h +++ b/gtsam.h @@ -465,7 +465,7 @@ class SimpleCamera { SimpleCamera(const gtsam::Pose3& pose, const gtsam::Cal3_S2& K); static gtsam::SimpleCamera level(const gtsam::Cal3_S2& K, const gtsam::Pose2& pose, double height); - static gtsam::SimpleCamera level(const gtsam::Pose2& pose, double height); + // static gtsam::SimpleCamera level(const gtsam::Pose2& pose, double height); // FIXME overload static gtsam::SimpleCamera lookat(const gtsam::Point3& eye, const gtsam::Point3& target, const gtsam::Point3& upVector, const gtsam::Cal3_S2& K); From 0a3d9975f39f0e6c2c105ab73bc39f86b709c450 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 19 Jun 2012 06:04:31 +0000 Subject: [PATCH 390/914] adding smart flags for several static noise model creation function --- gtsam/linear/NoiseModel.cpp | 6 ++++++ gtsam/linear/NoiseModel.h | 14 +++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index a0901c58b..51f732db0 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -422,6 +422,12 @@ SharedDiagonal Constrained::QR(Matrix& Ab) const { /* ************************************************************************* */ // Isotropic +/* ************************************************************************* */ +Isotropic::shared_ptr Isotropic::Sigma(size_t dim, double sigma, bool smart) { + if (smart && fabs(sigma-1.0)<1e-9) return Unit::Create(dim); + return shared_ptr(new Isotropic(dim, sigma)); +} + /* ************************************************************************* */ Isotropic::shared_ptr Isotropic::Variance(size_t dim, double variance, bool smart) { if (smart && fabs(variance-1.0)<1e-9) return Unit::Create(dim); diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index f7a1c351a..b1e65feff 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -112,6 +112,8 @@ namespace gtsam { * as indeed * |y|^2 = y'*y = x'*R'*R*x * Various derived classes are available that are more efficient. + * The named constructors return a shared_ptr because, when the smart flag is true, + * the underlying object might be a derived class such as Diagonal. */ class Gaussian: public Base { @@ -274,8 +276,8 @@ namespace gtsam { * A diagonal noise model created by specifying a Vector of precisions, i.e. * i.e. the diagonal of the information matrix, i.e., weights */ - static shared_ptr Precisions(const Vector& precisions) { - return Variances(reciprocal(precisions)); + static shared_ptr Precisions(const Vector& precisions, bool smart = false) { + return Variances(reciprocal(precisions), smart); } virtual void print(const std::string& name) const; @@ -496,9 +498,7 @@ namespace gtsam { /** * An isotropic noise model created by specifying a standard devation sigma */ - static shared_ptr Sigma(size_t dim, double sigma) { - return shared_ptr(new Isotropic(dim, sigma)); - } + static shared_ptr Sigma(size_t dim, double sigma, bool smart = false); /** * An isotropic noise model created by specifying a variance = sigma^2. @@ -509,8 +509,8 @@ namespace gtsam { /** * An isotropic noise model created by specifying a precision */ - static shared_ptr Precision(size_t dim, double precision) { - return Variance(dim, 1.0/precision); + static shared_ptr Precision(size_t dim, double precision, bool smart = false) { + return Variance(dim, 1.0/precision, smart); } virtual void print(const std::string& name) const; From 350e761ec667492ecbd162f6371cbe2a7f3b5d43 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 19 Jun 2012 06:05:32 +0000 Subject: [PATCH 391/914] adding comments with Frank --- gtsam/linear/SharedDiagonal.h | 16 ++++++-- gtsam/linear/SharedNoiseModel.h | 73 +++++++++++++++++++++++---------- 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/gtsam/linear/SharedDiagonal.h b/gtsam/linear/SharedDiagonal.h index 8a7e101a2..193a30215 100644 --- a/gtsam/linear/SharedDiagonal.h +++ b/gtsam/linear/SharedDiagonal.h @@ -22,11 +22,17 @@ namespace gtsam { // note, deliberately not in noiseModel namespace - // A useful convenience class to refer to a shared Diagonal model - // There are (somewhat dangerous) constructors from Vector and pair - // that call Sigmas and Sigma, respectively. + /** + * A useful convenience class to refer to a shared Diagonal model + * There are (somewhat dangerous) constructors from Vector and pair + * that call Sigmas and Sigma, respectively. + */ class SharedDiagonal: public noiseModel::Diagonal::shared_ptr { public: + + /// @name Standard Constructors + /// @{ + SharedDiagonal() { } SharedDiagonal(const noiseModel::Diagonal::shared_ptr& p) : @@ -45,6 +51,10 @@ namespace gtsam { // note, deliberately not in noiseModel namespace noiseModel::Diagonal::shared_ptr(noiseModel::Diagonal::Sigmas(sigmas)) { } + /// @} + /// @name Print + /// @{ + /// Print inline void print(const std::string &s) const { (*this)->print(s); } diff --git a/gtsam/linear/SharedNoiseModel.h b/gtsam/linear/SharedNoiseModel.h index 1d66e3495..bc90fee49 100644 --- a/gtsam/linear/SharedNoiseModel.h +++ b/gtsam/linear/SharedNoiseModel.h @@ -15,10 +15,16 @@ namespace gtsam { // note, deliberately not in noiseModel namespace + /** + * Just a convenient class to generate shared pointers to a noise model + */ struct SharedNoiseModel: public noiseModel::Base::shared_ptr { typedef noiseModel::Base::shared_ptr Base; + /// @name Standard Constructors + /// @{ + SharedNoiseModel() {} SharedNoiseModel(const noiseModel::Robust::shared_ptr& p): Base(p) {} SharedNoiseModel(const noiseModel::Gaussian::shared_ptr& p): Base(p) {} @@ -27,6 +33,10 @@ namespace gtsam { // note, deliberately not in noiseModel namespace SharedNoiseModel(const noiseModel::Isotropic::shared_ptr& p): Base(p) {} SharedNoiseModel(const noiseModel::Unit::shared_ptr& p): Base(p) {} + /// @} + /// @name Dangerous constructors + /// @{ + #ifdef GTSAM_MAGIC_GAUSSIAN SharedNoiseModel(const Matrix& covariance) : Base(boost::static_pointer_cast( @@ -45,30 +55,16 @@ namespace gtsam { // note, deliberately not in noiseModel namespace noiseModel::Isotropic::Sigma(GTSAM_DANGEROUS_GAUSSIAN, s))) {} #endif + /// @} + /// @name Print + /// @{ + /// Print inline void print(const std::string &s) const { (*this)->print(s); } - // Static syntactic sugar functions to create noisemodels directly - // These should only be used with the Matlab interface - static inline SharedNoiseModel Sigmas(const Vector& sigmas, bool smart=false) { - return noiseModel::Diagonal::Sigmas(sigmas, smart); - } - - static inline SharedNoiseModel Sigma(size_t dim, double sigma) { - return noiseModel::Isotropic::Sigma(dim, sigma); - } - - static inline SharedNoiseModel Precisions(const Vector& precisions) { - return noiseModel::Diagonal::Precisions(precisions); - } - - static inline SharedNoiseModel Precision(size_t dim, double precision) { - return noiseModel::Isotropic::Precision(dim, precision); - } - - static inline SharedNoiseModel Unit(size_t dim) { - return noiseModel::Unit::Create(dim); - } + /// @} + /// @name Static syntactic sugar (should only be used with the MATLAB interface) + /// @{ static inline SharedNoiseModel SqrtInformation(const Matrix& R) { return noiseModel::Gaussian::SqrtInformation(R); @@ -78,6 +74,38 @@ namespace gtsam { // note, deliberately not in noiseModel namespace return noiseModel::Gaussian::Covariance(covariance, smart); } + static inline SharedNoiseModel Sigmas(const Vector& sigmas, bool smart=false) { + return noiseModel::Diagonal::Sigmas(sigmas, smart); + } + + static inline SharedNoiseModel Variances(const Vector& variances, bool smart=false) { + return noiseModel::Diagonal::Variances(variances, smart); + } + + static inline SharedNoiseModel Precisions(const Vector& precisions, bool smart=false) { + return noiseModel::Diagonal::Precisions(precisions, smart); + } + + static inline SharedNoiseModel Sigma(size_t dim, double sigma, bool smart=false) { + return noiseModel::Isotropic::Sigma(dim, sigma, smart); + } + + static inline SharedNoiseModel Variance(size_t dim, double variance, bool smart=false) { + return noiseModel::Isotropic::Variance(dim, variance, smart); + } + + static inline SharedNoiseModel Precision(size_t dim, double precision, bool smart=false) { + return noiseModel::Isotropic::Precision(dim, precision, smart); + } + + static inline SharedNoiseModel Unit(size_t dim) { + return noiseModel::Unit::Create(dim); + } + + /// @} + /// @name Serialization + /// @{ + /** Serialization function */ friend class boost::serialization::access; template @@ -85,5 +113,8 @@ namespace gtsam { // note, deliberately not in noiseModel namespace ar & boost::serialization::make_nvp("SharedNoiseModel", boost::serialization::base_object(*this)); } + + /// @} + }; } From f9a8d69a75999deb6392b851055c8a321e6b06d5 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 19 Jun 2012 06:06:26 +0000 Subject: [PATCH 392/914] specialized templates to support noise model class inheritance --- wrap/matlab.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/wrap/matlab.h b/wrap/matlab.h index 365e11f39..4d98ede30 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -21,9 +21,14 @@ #include #include +#include using gtsam::Vector; using gtsam::Matrix; +using gtsam::noiseModel::Gaussian; +using gtsam::noiseModel::Diagonal; +using gtsam::noiseModel::Isotropic; +using gtsam::noiseModel::Unit; extern "C" { #include @@ -453,8 +458,9 @@ mxArray* wrap_shared_ptr(boost::shared_ptr< Class > shared_ptr, const char *clas */ template boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { - //Why is this here? -#ifndef UNSAFE_WRAP + #ifndef UNSAFE_WRAP + // Useful code to check argument type + // Problem, does not support inheritance bool isClass = mxIsClass(obj, className.c_str()); if (!isClass) { mexPrintf("Expected %s, got %s\n", className.c_str(), mxGetClassName(obj)); @@ -467,6 +473,65 @@ boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& cla return handle->get_object(); } +/* + * Specialized template for noise model. Checking their derived types properly + */ +// Isotropic +template <> +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { +#ifndef UNSAFE_WRAP + bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); + bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); + if (!isIsotropic && !isUnit) { + mexPrintf("Expected Isotropic or derived classes, got %s\n", mxGetClassName(obj)); + error("Argument has wrong type."); + } +#endif + mxArray* mxh = mxGetProperty(obj,0,"self"); + if (mxh==NULL) error("unwrap_reference: invalid wrap object"); + ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); + return handle->get_object(); +} + +// Diagonal +template <> +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { +#ifndef UNSAFE_WRAP + bool isDiagonal = mxIsClass(obj, "gtsamnoiseModelDiagonal"); + bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); + bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); + if (!isDiagonal && !isIsotropic && !isUnit ) { + mexPrintf("Expected Diagonal or derived classes, got %s\n", mxGetClassName(obj)); + error("Argument has wrong type."); + } +#endif + mxArray* mxh = mxGetProperty(obj,0,"self"); + if (mxh==NULL) error("unwrap_reference: invalid wrap object"); + ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); + return handle->get_object(); +} + +// Gaussian +template <> +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { +#ifndef UNSAFE_WRAP + bool isGaussian = mxIsClass(obj, "gtsamnoiseModelGaussian"); + bool isDiagonal = mxIsClass(obj, "gtsamnoiseModelDiagonal"); + bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); + bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); + if (!isGaussian && !isDiagonal && !isIsotropic && !isUnit) { + mexPrintf("Expected Gaussian or derived classes, got %s\n", mxGetClassName(obj)); + error("Argument has wrong type."); + } +#endif + mxArray* mxh = mxGetProperty(obj,0,"self"); + if (mxh==NULL) error("unwrap_reference: invalid wrap object"); + ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); + return handle->get_object(); +} + +//end specialized templates + template void delete_shared_ptr(const mxArray* obj, const string& className) { //Why is this here? From 584c5c11c43b8e1aa9eb88f1ad41415e8ef7bd5a Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 19 Jun 2012 06:08:55 +0000 Subject: [PATCH 393/914] wrap noiseModel classes. Inheritance works nicely in Matlab. Probably we don't need shared noise model classes anymore. --- gtsam.h | 61 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/gtsam.h b/gtsam.h index 5ec897fe1..b02156544 100644 --- a/gtsam.h +++ b/gtsam.h @@ -16,6 +16,8 @@ * Limitations on methods * - Parsing does not support overloading * - There can only be one method (static or otherwise) with a given name + * Methods must start with a lowercase letter + * Static methods must start with a letter (upper or lowercase) and use the "static" keyword * Arguments to functions any of * - Eigen types: Matrix, Vector * - Eigen types and classes as an optionally const reference @@ -35,8 +37,6 @@ * Using namespace * - To use a namespace (e.g., generate a "using namespace x" line in cpp files), add "using namespace x;" * - This declaration applies to all classes *after* the declaration, regardless of brackets - * Methods must start with a lowercase letter - * Static methods must start with a letter (upper or lowercase) and use the "static" keyword * Includes in C++ wrappers * - By default, the include will be <[classname].h> * - All namespaces must have angle brackets: @@ -503,6 +503,52 @@ class SimpleCamera { // linear //************************************************************************* +#include +namespace noiseModel { +class Gaussian { + static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); + static gtsam::noiseModel::Gaussian* Covariance(Matrix R); +// Matrix R() const; // FIXME: cannot parse!!! + void print(string s) const; +}; + +class Diagonal { + static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas); + static gtsam::noiseModel::Diagonal* Variances(Vector variances); + static gtsam::noiseModel::Diagonal* Precisions(Vector precisions); + Vector sample() const; +// Matrix R() const; // FIXME: cannot parse!!! + void print(string s) const; +}; + +class Isotropic { + static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); + static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); + static gtsam::noiseModel::Isotropic* Precision(size_t dim, double precision); + Vector sample() const; + void print(string s) const; +}; + +class Unit { + static gtsam::noiseModel::Unit* Create(size_t dim); + void print(string s) const; +}; +}///\namespace noiseModel + +// TODO: smart flag not supported. Default argument is not wrapped properly yet +class SharedNoiseModel { + static gtsam::SharedNoiseModel SqrtInformation(Matrix R); + static gtsam::SharedNoiseModel Covariance(Matrix covariance); + static gtsam::SharedNoiseModel Sigmas(Vector sigmas); + static gtsam::SharedNoiseModel Variances(Vector variances); + static gtsam::SharedNoiseModel Precisions(Vector precisions); + static gtsam::SharedNoiseModel Sigma(size_t dim, double sigma); + static gtsam::SharedNoiseModel Variance(size_t dim, double variance); + static gtsam::SharedNoiseModel Precision(size_t dim, double precision); + static gtsam::SharedNoiseModel Unit(size_t dim); + void print(string s) const; +}; + class SharedGaussian { SharedGaussian(Matrix covariance); void print(string s) const; @@ -514,17 +560,6 @@ class SharedDiagonal { Vector sample() const; }; -class SharedNoiseModel { - static gtsam::SharedNoiseModel Sigmas(Vector sigmas); - static gtsam::SharedNoiseModel Sigma(size_t dim, double sigma); - static gtsam::SharedNoiseModel Precisions(Vector precisions); - static gtsam::SharedNoiseModel Precision(size_t dim, double precision); - static gtsam::SharedNoiseModel Unit(size_t dim); - static gtsam::SharedNoiseModel SqrtInformation(Matrix R); - static gtsam::SharedNoiseModel Covariance(Matrix covariance); - void print(string s) const; -}; - class VectorValues { VectorValues(); VectorValues(size_t nVars, size_t varDim); From 615cfee44c0c9561491c23236a2c0ae0e1f48a74 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 19 Jun 2012 15:00:41 +0000 Subject: [PATCH 394/914] Added verbosity flag in optimize. Really, we should have more sophisticated optimize. --- gtsam/slam/visualSLAM.cpp | 8 ++++++++ gtsam/slam/visualSLAM.h | 16 ++++++++-------- matlab/VisualISAMInitialize.m | 2 +- matlab/examples/SFMExample.m | 10 ++++++---- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 26123dda6..f8aef8bb9 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -17,6 +17,7 @@ #include #include +#include #include using boost::make_shared; @@ -120,4 +121,11 @@ namespace visualSLAM { } /* ************************************************************************* */ + Values Graph::optimize(const Values& initialEstimate, size_t verbosity) const { + LevenbergMarquardtParams params; + params.verbosity = (NonlinearOptimizerParams::Verbosity)verbosity; + LevenbergMarquardtOptimizer optimizer(*this, initialEstimate,params); + return optimizer.optimize(); + } + /* ************************************************************************* */ } diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index d577ee527..6e5109041 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -20,14 +20,16 @@ #pragma once #include -#include -#include #include -#include -#include -#include +#include +#include + #include #include +#include +#include +#include + #include namespace visualSLAM { @@ -213,9 +215,7 @@ namespace visualSLAM { * @param range approximate range to landmark * @param model uncertainty model of this prior */ - Values optimize(const Values& initialEstimate) { - return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); - } + Values optimize(const Values& initialEstimate, size_t verbosity) const; /// Return a Marginals object Marginals marginals(const Values& solution) const { diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index 4d0b13931..43e8162dd 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -49,7 +49,7 @@ newFactors.addOdometry(symbol('x',1), symbol('x',2), data.odometry{1}, noiseMode %% Update ISAM if options.batchInitialization % Do a full optimize for first two poses - fullyOptimized = newFactors.optimize(initialEstimates); + fullyOptimized = newFactors.optimize(initialEstimates,0); isam.update(newFactors, fullyOptimized); else isam.update(newFactors, initialEstimates); diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 3f8733fc3..ac25a4328 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -49,18 +49,20 @@ graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); -%% Initialize cameras and points to ground truth in this example +%% Initialize cameras and points close to ground truth in this example initialEstimate = visualSLAMValues; for i=1:size(truth.cameras,2) - initialEstimate.insertPose(symbol('x',i), truth.cameras{i}.pose); + pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); + initialEstimate.insertPose(symbol('x',i), pose_i); end for j=1:size(truth.points,2) - initialEstimate.insertPoint(symbol('p',j), truth.points{j}); + point_j = truth.points{j}.retract(0.1*randn(3,1)); + initialEstimate.insertPoint(symbol('p',j), point_j); end initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n ')); %% Plot results with covariance ellipses From 9cb903fe0814706c95a278bd33d27e53b654c2ff Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 19 Jun 2012 15:28:22 +0000 Subject: [PATCH 395/914] 1. remove a redundant constructor of PinholeCamera 2. remove a "backproject_from_camera" function from PinholeCamera, please use "backproject" directly --- examples/CameraResectioning.cpp | 2 +- gtsam/geometry/PinholeCamera.h | 8 -------- gtsam/geometry/tests/testSimpleCamera.cpp | 6 +++--- gtsam/slam/ProjectionFactor.h | 2 +- tests/testNonlinearEquality.cpp | 4 ++-- 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/examples/CameraResectioning.cpp b/examples/CameraResectioning.cpp index 3f586a67f..277c78ee0 100644 --- a/examples/CameraResectioning.cpp +++ b/examples/CameraResectioning.cpp @@ -46,7 +46,7 @@ public: /// evaluate the error virtual Vector evaluateError(const Pose3& pose, boost::optional H = boost::none) const { - SimpleCamera camera(*K_, pose); + SimpleCamera camera(pose, *K_); Point2 reprojectionError(camera.project(P_, H) - p_); return reprojectionError.vector(); } diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index 139523802..2754bf7ef 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -56,9 +56,6 @@ namespace gtsam { /** constructor with pose and calibration */ PinholeCamera(const Pose3& pose, const Calibration& K):pose_(pose),K_(K) {} - /** alternative constructor with pose and calibration */ - PinholeCamera(const Calibration& K, const Pose3& pose):pose_(pose),K_(K) {} - /// @} /// @name Named Constructors /// @{ @@ -290,11 +287,6 @@ namespace gtsam { return pose_.transform_from(pc); } - /// backproject a 2-dimensional point to a 3-dimensional point at given depth - inline Point3 backproject_from_camera(const Point2& p, double depth) const { - return backproject(p, depth); - } - /** * Calculate range to a landmark * @param point 3D location of landmark diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index 71f36998c..e46a247a0 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -35,7 +35,7 @@ const Pose3 pose1(Matrix_(3,3, ), Point3(0,0,0.5)); -const SimpleCamera camera(K, pose1); +const SimpleCamera camera(pose1, K); const Point3 point1(-0.08,-0.08, 0.0); const Point3 point2(-0.08, 0.08, 0.0); @@ -106,7 +106,7 @@ TEST( SimpleCamera, backproject2) { Point3 origin; Rot3 rot(1., 0., 0., 0., 0., 1., 0., -1., 0.); // a camera looking down - SimpleCamera camera(K, Pose3(rot, origin)); + SimpleCamera camera(Pose3(rot, origin), K); Point3 actual = camera.backproject(Point2(), 1.); Point3 expected(0., 1., 0.); @@ -119,7 +119,7 @@ TEST( SimpleCamera, backproject2) /* ************************************************************************* */ Point2 project2(const Pose3& pose, const Point3& point) { - return SimpleCamera(K,pose).project(point); + return SimpleCamera(pose,K).project(point); } TEST( SimpleCamera, Dproject_point_pose) diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index e1ea38b27..1b1aeb57b 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -93,7 +93,7 @@ namespace gtsam { Vector evaluateError(const Pose3& pose, const Point3& point, boost::optional H1 = boost::none, boost::optional H2 = boost::none) const { try { - PinholeCamera camera(*K_, pose); + PinholeCamera camera(pose, *K_); Point2 reprojectionError(camera.project(point, H1, H2) - measured_); return reprojectionError.vector(); } catch( CheiralityException& e) { diff --git a/tests/testNonlinearEquality.cpp b/tests/testNonlinearEquality.cpp index 9a139e581..4679dd740 100644 --- a/tests/testNonlinearEquality.cpp +++ b/tests/testNonlinearEquality.cpp @@ -524,9 +524,9 @@ TEST (testNonlinearEqualityConstraint, stereo_constrained ) { 0.0, 0.0, 1.0, 0.0, -1.0, 0.0)); Pose3 pose1(faceDownY, Point3()); // origin, left camera - SimpleCamera camera1(K, pose1); + SimpleCamera camera1(pose1, K); Pose3 pose2(faceDownY, Point3(2.0, 0.0, 0.0)); // 2 units to the left - SimpleCamera camera2(K, pose2); + SimpleCamera camera2(pose2, K); Point3 landmark(1.0, 5.0, 0.0); //centered between the cameras, 5 units away // keys From 9fe0b66be5e2c86a69ef8b5441350a7f669e29c4 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 19 Jun 2012 15:29:10 +0000 Subject: [PATCH 396/914] add a function that dynamically casts gaussian factor graph into jacobian factor graph --- gtsam/linear/JacobianFactorGraph.cpp | 15 +++++++++++++++ gtsam/linear/JacobianFactorGraph.h | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/gtsam/linear/JacobianFactorGraph.cpp b/gtsam/linear/JacobianFactorGraph.cpp index 632a55e02..0ca3b8667 100644 --- a/gtsam/linear/JacobianFactorGraph.cpp +++ b/gtsam/linear/JacobianFactorGraph.cpp @@ -102,6 +102,21 @@ void transposeMultiply(const JacobianFactorGraph& fg, const VectorValues &r, Vec ++i; } } + +/* ************************************************************************* */ +JacobianFactorGraph::shared_ptr dynamicCastFactors(const GaussianFactorGraph &gfg) { + JacobianFactorGraph::shared_ptr jfg(new JacobianFactorGraph()); + jfg->reserve(gfg.size()); + BOOST_FOREACH(const GaussianFactor::shared_ptr& factor, gfg) { + JacobianFactor::shared_ptr castedFactor(boost::dynamic_pointer_cast(factor)); + if(castedFactor) jfg->push_back(castedFactor); + else throw std::invalid_argument("dynamicCastFactors(), dynamic_cast failed, meaning an invalid cast was requested."); + } + return jfg; +} + + + } // namespace diff --git a/gtsam/linear/JacobianFactorGraph.h b/gtsam/linear/JacobianFactorGraph.h index 598c69677..cb27b507a 100644 --- a/gtsam/linear/JacobianFactorGraph.h +++ b/gtsam/linear/JacobianFactorGraph.h @@ -19,8 +19,10 @@ #include #include +#include #include #include +#include namespace gtsam { @@ -65,4 +67,7 @@ namespace gtsam { void multiply(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r); void transposeMultiply(const JacobianFactorGraph& fg, const VectorValues &r, VectorValues &x); + /** dynamic_cast the gaussian factors down to jacobian factors */ + JacobianFactorGraph::shared_ptr dynamicCastFactors(const GaussianFactorGraph &gfg); + } From a0851f0eb41b3c76f0eb83dc88d67ce81dc613d0 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 19 Jun 2012 18:03:01 +0000 Subject: [PATCH 397/914] reshape matrix to tensor --- gtsam/geometry/tensorInterface.h | 12 ++++++++++++ gtsam/geometry/tests/testTensors.cpp | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/gtsam/geometry/tensorInterface.h b/gtsam/geometry/tensorInterface.h index 61212e2c9..7a2c144d7 100644 --- a/gtsam/geometry/tensorInterface.h +++ b/gtsam/geometry/tensorInterface.h @@ -60,6 +60,18 @@ namespace gtsam { return tensors::Tensor2(data); } + /** Reshape Matrix into rank 2 tensor */ + template + tensors::Tensor2 reshape2matrix(const Matrix& m) { + if (m.rows() * m.cols() != N1 * N2) throw std::invalid_argument( + "reshape2: incompatible dimensions"); + double data[N2][N1]; + for (int j = 0; j < N2; j++) + for (int i = 0; i < N1; i++) + data[j][i] = m(j,i); + return tensors::Tensor2(data); + } + /** Reshape rank 3 tensor into Matrix */ template Matrix reshape(const tensors::Tensor3Expression& T, int m, int n) { diff --git a/gtsam/geometry/tests/testTensors.cpp b/gtsam/geometry/tests/testTensors.cpp index 85437b850..0e1c381cf 100644 --- a/gtsam/geometry/tests/testTensors.cpp +++ b/gtsam/geometry/tests/testTensors.cpp @@ -188,6 +188,10 @@ TEST( Tensor2, reshape2 ) { Tensor2<3,4> actual = reshape2<3,4>(camera::vector); CHECK(assert_equality(camera::M(a,A),actual(a,A))); + + // reshape Matrix to rank 2 tensor + Tensor2<3,4> actual_m = reshape2matrix<3,4>(camera::matrix); + CHECK(assert_equality(camera::M(a,A), actual_m(a,A))); } /* ************************************************************************* */ From 882b4d4e7e634f7326f42c97b704b27e6a84ff93 Mon Sep 17 00:00:00 2001 From: Summit Patel Date: Tue, 19 Jun 2012 18:31:22 +0000 Subject: [PATCH 398/914] Fixed Doxygen warnings. --- gtsam/nonlinear/DoglegOptimizer.h | 1 - gtsam/nonlinear/GaussNewtonOptimizer.h | 1 - gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 1 - gtsam/nonlinear/NonlinearFactor.h | 2 +- 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/gtsam/nonlinear/DoglegOptimizer.h b/gtsam/nonlinear/DoglegOptimizer.h index c8ac636cf..065d0b34d 100644 --- a/gtsam/nonlinear/DoglegOptimizer.h +++ b/gtsam/nonlinear/DoglegOptimizer.h @@ -101,7 +101,6 @@ public: * copies the objects. * @param graph The nonlinear factor graph to optimize * @param initialValues The initial variable assignments - * @param params The optimization parameters */ DoglegOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, const Ordering& ordering) : NonlinearOptimizer(graph) { diff --git a/gtsam/nonlinear/GaussNewtonOptimizer.h b/gtsam/nonlinear/GaussNewtonOptimizer.h index 217b6e618..1a1984ffb 100644 --- a/gtsam/nonlinear/GaussNewtonOptimizer.h +++ b/gtsam/nonlinear/GaussNewtonOptimizer.h @@ -66,7 +66,6 @@ public: * copies the objects. * @param graph The nonlinear factor graph to optimize * @param initialValues The initial variable assignments - * @param params The optimization parameters */ GaussNewtonOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, const Ordering& ordering) : NonlinearOptimizer(graph), state_(graph, initialValues) { diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index aae8e45cc..0858b72b9 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -110,7 +110,6 @@ public: * copies the objects. * @param graph The nonlinear factor graph to optimize * @param initialValues The initial variable assignments - * @param params The optimization parameters */ LevenbergMarquardtOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, const Ordering& ordering) : NonlinearOptimizer(graph), dimensions_(initialValues.dims(ordering)) { diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 19c9c6988..e1cfb2bc3 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -36,7 +36,7 @@ /** * Macro to add a standard clone function to a derived factor - * @DEPRECATED: will go away shortly - just add the clone function directly + * @deprecated: will go away shortly - just add the clone function directly */ #define ADD_CLONE_NONLINEAR_FACTOR(Derived) \ virtual gtsam::NonlinearFactor::shared_ptr clone() const { \ From 006d3fcde23d99114d2a8436ad7a02879d307b2f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 19 Jun 2012 19:06:32 +0000 Subject: [PATCH 399/914] Added verbosity flag --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index b02156544..a220f5fe3 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1001,7 +1001,7 @@ class Graph { void addRangeFactor(size_t poseKey, size_t pointKey, double range, const gtsam::SharedNoiseModel& model); void addOdometry(size_t poseKey1, size_t poseKey2, const gtsam::Pose3& odometry, const gtsam::SharedNoiseModel& model); - visualSLAM::Values optimize(const visualSLAM::Values& initialEstimate) const; + visualSLAM::Values optimize(const visualSLAM::Values& initialEstimate, size_t verbosity) const; gtsam::Marginals marginals(const visualSLAM::Values& solution) const; }; From d5fbfcb7b7da0d4c384245ae115bdb1ab737c85a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 19 Jun 2012 22:06:40 +0000 Subject: [PATCH 400/914] Create and load CMake exports and config files --- CMakeLists.txt | 8 ++++---- CppUnitLite/CMakeLists.txt | 4 +++- gtsam/CMakeLists.txt | 8 ++++++-- gtsam_unstable/CMakeLists.txt | 8 ++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c843030e4..fb25d2dd8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ set (GTSAM_VERSION_PATCH 0) #set (CMAKE_INSTALL_PREFIX ${HOME} CACHE PATH "Install prefix for library") set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(GtsamMakeConfigFile) # Record the root dir for gtsam - needed during external builds, e.g., ROS set(GTSAM_SOURCE_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) @@ -139,10 +140,9 @@ if (GTSAM_BUILD_UNSTABLE) add_subdirectory(gtsam_unstable) endif(GTSAM_BUILD_UNSTABLE) -# Make config files -include(GtsamMakeConfigFile) -GtsamMakeConfigFile(GTSAM gtsam-static) -GtsamMakeConfigFile(CppUnitLite CppUnitLite) +# Install config and export files +GtsamMakeConfigFile(GTSAM) +export(TARGETS ${GTSAM_EXPORTED_TARGETS} FILE GTSAM-exports.cmake) # Set up CPack set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM") diff --git a/CppUnitLite/CMakeLists.txt b/CppUnitLite/CMakeLists.txt index 534a802d4..35ecd71f8 100644 --- a/CppUnitLite/CMakeLists.txt +++ b/CppUnitLite/CMakeLists.txt @@ -4,11 +4,13 @@ file(GLOB cppunitlite_headers "*.h") file(GLOB cppunitlite_src "*.cpp") add_library(CppUnitLite STATIC ${cppunitlite_src} ${cppunitlite_headers}) +list(APPEND GTSAM_EXPORTED_TARGETS CppUnitLite) +set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) gtsam_assign_source_folders("${cppunitlite_headers};${cppunitlite_src}") # MSVC project structure option(GTSAM_INSTALL_CPPUNITLITE "Enable/Disable installation of CppUnitLite library" ON) if (GTSAM_INSTALL_CPPUNITLITE) install(FILES ${cppunitlite_headers} DESTINATION include/CppUnitLite) - install(TARGETS CppUnitLite ARCHIVE DESTINATION lib) + install(TARGETS CppUnitLite EXPORT GTSAM-exports ARCHIVE DESTINATION lib) endif(GTSAM_INSTALL_CPPUNITLITE) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 495c3f39f..b4fae3475 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -91,7 +91,9 @@ if (GTSAM_BUILD_STATIC_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) - install(TARGETS gtsam-static ARCHIVE DESTINATION lib) + install(TARGETS gtsam-static EXPORT GTSAM-exports ARCHIVE DESTINATION lib) + list(APPEND GTSAM_EXPORTED_TARGETS gtsam-static) + set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) set(gtsam-lib "gtsam-static") endif (GTSAM_BUILD_STATIC_LIBRARY) @@ -104,7 +106,9 @@ if (GTSAM_BUILD_SHARED_LIBRARY) CLEAN_DIRECT_OUTPUT 1 VERSION ${gtsam_version} SOVERSION ${gtsam_soversion}) - install(TARGETS gtsam-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) + install(TARGETS gtsam-shared EXPORT GTSAM-exports LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) + list(APPEND GTSAM_EXPORTED_TARGETS gtsam-shared) + set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) if (NOT GTSAM_BUILD_STATIC_LIBRARY) set(gtsam-lib "gtsam-shared") endif() diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 1c781453a..acd36ddc2 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -54,7 +54,9 @@ set_target_properties(gtsam_unstable-static PROPERTIES SOVERSION ${gtsam_unstable_soversion}) target_link_libraries(gtsam_unstable-static gtsam-static) set(gtsam_unstable-lib "gtsam_unstable-static") -install(TARGETS gtsam_unstable-static ARCHIVE DESTINATION lib) +install(TARGETS gtsam_unstable-static EXPORT GTSAM-exports ARCHIVE DESTINATION lib) +list(APPEND GTSAM_EXPORTED_TARGETS gtsam_unstable-static) +set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) if (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) message(STATUS "Building GTSAM_UNSTABLE - shared") @@ -65,7 +67,9 @@ if (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) VERSION ${gtsam_unstable_version} SOVERSION ${gtsam_unstable_soversion}) target_link_libraries(gtsam_unstable-shared gtsam-shared) - install(TARGETS gtsam_unstable-shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) + install(TARGETS gtsam_unstable-shared EXPORT GTSAM-exports LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) + list(APPEND GTSAM_EXPORTED_TARGETS gtsam_unstable-shared) + set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) endif(GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) # Wrap version for gtsam_unstable From 7c475d83c338f533467af54f2510f625efb11a70 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 20 Jun 2012 00:01:49 +0000 Subject: [PATCH 401/914] Comments and additional test regarding permutations and orderings --- .cproject | 332 +++++++++--------- gtsam/inference/Permutation.h | 4 + gtsam/inference/inference.cpp | 8 +- gtsam/inference/inference.h | 17 +- gtsam/inference/tests/testInference.cpp | 48 ++- gtsam/nonlinear/ISAM2.h | 19 +- .../SuccessiveLinearizationOptimizer.h | 1 + 7 files changed, 247 insertions(+), 182 deletions(-) diff --git a/.cproject b/.cproject index b0ad23ee6..ca640b7b1 100644 --- a/.cproject +++ b/.cproject @@ -311,6 +311,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -337,7 +345,6 @@ make - tests/testBayesTree.run true false @@ -345,7 +352,6 @@ make - testBinaryBayesNet.run true false @@ -393,7 +399,6 @@ make - testSymbolicBayesNet.run true false @@ -401,7 +406,6 @@ make - tests/testSymbolicFactor.run true false @@ -409,7 +413,6 @@ make - testSymbolicFactorGraph.run true false @@ -425,20 +428,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -527,22 +521,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -559,6 +537,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -583,26 +577,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -687,26 +681,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -799,6 +793,14 @@ true true + + make + -j5 + testInference.run + true + true + true + make -j2 @@ -953,7 +955,6 @@ make - testGraph.run true false @@ -961,7 +962,6 @@ make - testJunctionTree.run true false @@ -969,7 +969,6 @@ make - testSymbolicBayesNetB.run true false @@ -1089,7 +1088,6 @@ make - testErrors.run true false @@ -1545,6 +1543,7 @@ make + testSimulated2DOriented.run true false @@ -1584,6 +1583,7 @@ make + testSimulated2D.run true false @@ -1591,6 +1591,7 @@ make + testSimulated3D.run true false @@ -1806,6 +1807,7 @@ make + tests/testGaussianISAM2 true false @@ -1827,6 +1829,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -2028,7 +2126,6 @@ cpack - -G DEB true false @@ -2036,7 +2133,6 @@ cpack - -G RPM true false @@ -2044,7 +2140,6 @@ cpack - -G TGZ true false @@ -2052,7 +2147,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2146,98 +2240,42 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run + -j5 + wrap_gtsam true true true - + make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2281,46 +2319,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/gtsam/inference/Permutation.h b/gtsam/inference/Permutation.h index dc3aa669a..5454dafec 100644 --- a/gtsam/inference/Permutation.h +++ b/gtsam/inference/Permutation.h @@ -40,6 +40,10 @@ namespace gtsam { * arguments supplied through the square-bracket [] operator through the * permutation. Note that this helper class stores a reference to the original * container. + * + * Permutations can be considered to a 1-1 mapping from an original set of indices + * to a different set of indices. Permutations can be composed and inverted + * in order to create new indexing for a structure. * \nosubgrouping */ class Permutation { diff --git a/gtsam/inference/inference.cpp b/gtsam/inference/inference.cpp index 7afad8330..3cddc4cfc 100644 --- a/gtsam/inference/inference.cpp +++ b/gtsam/inference/inference.cpp @@ -29,9 +29,9 @@ using namespace std; namespace gtsam { - namespace inference { +/* ************************************************************************* */ Permutation::shared_ptr PermutationCOLAMD_(const VariableIndex& variableIndex, std::vector& cmember) { size_t nEntries = variableIndex.nEntries(), nFactors = variableIndex.nFactors(), nVars = variableIndex.size(); // Convert to compressed column major format colamd wants it in (== MATLAB format!) @@ -93,6 +93,6 @@ Permutation::shared_ptr PermutationCOLAMD_(const VariableIndex& variableIndex, s return permutation; } -} - -} +/* ************************************************************************* */ +} // \namespace inference +} // \namespace gtsam diff --git a/gtsam/inference/inference.h b/gtsam/inference/inference.h index 15373e62a..6ee278c68 100644 --- a/gtsam/inference/inference.h +++ b/gtsam/inference/inference.h @@ -38,7 +38,11 @@ namespace gtsam { const VariableIndex& variableIndex); /** - * Compute a permutation (variable ordering) using constrained colamd + * Compute a permutation (variable ordering) using constrained colamd to move + * a set of variables to the end of the ordering + * @param variableIndex is the variable index lookup from a graph + * @param constrainlast is a vector of keys that should be constrained + * @tparam constrainLast is a std::vector (or similar structure) */ template Permutation::shared_ptr PermutationCOLAMD( @@ -46,6 +50,13 @@ namespace gtsam { /** * Compute a CCOLAMD permutation using the constraint groups in cmember. + * + * @param variableIndex is the variable structure from a graph + * @param cmember is the constraint group list for each variable, where + * 0 is the default, unconstrained group, and higher numbers move further to + * the back of the list + * + * AGC: does cmember change? */ Permutation::shared_ptr PermutationCOLAMD_( const VariableIndex& variableIndex, std::vector& cmember); @@ -82,8 +93,8 @@ namespace gtsam { return eliminate(factorGraph, variables, eliminateFcn, variableIndex); } - } // namespace inference + } // \namespace inference -} // namespace gtsam +} // \namespace gtsam #include diff --git a/gtsam/inference/tests/testInference.cpp b/gtsam/inference/tests/testInference.cpp index 41c33a456..2523eb32b 100644 --- a/gtsam/inference/tests/testInference.cpp +++ b/gtsam/inference/tests/testInference.cpp @@ -11,8 +11,8 @@ /** * @file testInference.cpp - * @brief * @author Richard Roberts + * @author Alex Cunningham * @date Dec 6, 2010 */ @@ -35,8 +35,52 @@ TEST(inference, UnobservedVariables) { VariableIndex variableIndex(sfg); - Permutation::shared_ptr colamd(inference::PermutationCOLAMD(variableIndex)); + // Computes a permutation with known variables first, skipped variables last + // Actual 0 1 3 5 2 4 + Permutation::shared_ptr actual(inference::PermutationCOLAMD(variableIndex)); + Permutation expected(6); + expected[0] = 0; + expected[1] = 1; + expected[2] = 3; + expected[3] = 5; + expected[4] = 2; + expected[5] = 4; + EXPECT(assert_equal(expected, *actual)); +} + +/* ************************************************************************* */ +TEST(inference, constrained_ordering) { + SymbolicFactorGraph sfg; + + // create graph with wanted variable set = 2, 4 + sfg.push_factor(0,1); + sfg.push_factor(1,2); + sfg.push_factor(2,3); + sfg.push_factor(3,4); + sfg.push_factor(4,5); + + VariableIndex variableIndex(sfg); + + // unconstrained version + Permutation::shared_ptr actUnconstrained(inference::PermutationCOLAMD(variableIndex)); + Permutation expUnconstrained = Permutation::Identity(6); + EXPECT(assert_equal(expUnconstrained, *actUnconstrained)); + + // constrained version - push one set to the end + std::vector constrainLast; + constrainLast.push_back(2); + constrainLast.push_back(4); + Permutation::shared_ptr actConstrained(inference::PermutationCOLAMD(variableIndex, constrainLast)); + Permutation expConstrained(6); + expConstrained[0] = 0; + expConstrained[1] = 1; + expConstrained[2] = 5; + expConstrained[3] = 3; + expConstrained[4] = 4; + expConstrained[5] = 2; + EXPECT(assert_equal(expConstrained, *actConstrained)); } /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index a2ef3793b..984284ebd 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -232,8 +232,12 @@ struct ISAM2Result { boost::optional detail; }; -struct ISAM2Clique : public BayesTreeCliqueBase { - +/** + * Specialized Clique structure for ISAM2, incorporating caching and gradient contribution + * TODO: more documentation + */ +class ISAM2Clique : public BayesTreeCliqueBase { +public: typedef ISAM2Clique This; typedef BayesTreeCliqueBase Base; typedef boost::shared_ptr shared_ptr; @@ -268,7 +272,7 @@ struct ISAM2Clique : public BayesTreeCliqueBase @@ -308,7 +313,7 @@ private: ar & BOOST_SERIALIZATION_NVP(cachedFactor_); ar & BOOST_SERIALIZATION_NVP(gradientContribution_); } -}; +}; // \struct ISAM2Clique /** * @addtogroup ISAM2 @@ -442,6 +447,8 @@ public: * @param force_relinearize Relinearize any variables whose delta magnitude is sufficiently * large (Params::relinearizeThreshold), regardless of the relinearization interval * (Params::relinearizeSkip). + * @param constrainedKeys is an optional map of keys to group labels, such that a variable can + * be constrained to a particular grouping in the BayesTree * @return An ISAM2Result struct containing information about the update */ ISAM2Result update(const NonlinearFactorGraph& newFactors = NonlinearFactorGraph(), const Values& newTheta = Values(), @@ -450,7 +457,7 @@ public: bool force_relinearize = false); /** Access the current linearization point */ - const Values& getLinearizationPoint() const {return theta_;} + const Values& getLinearizationPoint() const { return theta_; } /** Compute an estimate from the incomplete linear delta computed during the last update. * This delta is incomplete because it was not updated below wildfire_threshold. If only @@ -496,7 +503,7 @@ public: mutable size_t lastBacksubVariableCount; size_t lastNnzTop; - ISAM2Params params() const { return params_; } + const ISAM2Params& params() const { return params_; } //@} diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index 393e4bacc..7033613ac 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -105,6 +105,7 @@ public: default: throw std::runtime_error("Nonlinear optimization parameter \"factorization\" is invalid"); + return EliminateQR; break; } } From 8789201822e8e3431112493fe0033f1114bbc764 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 20 Jun 2012 01:35:42 +0000 Subject: [PATCH 402/914] Added mechanism to create a constrained ordering directly from a NonlinearFactorGraph --- .cproject | 8 ++++++ gtsam/inference/inference-inl.h | 16 ++++++++++++ gtsam/inference/inference.h | 13 ++++++++++ gtsam/inference/tests/testInference.cpp | 32 ++++++++++++++++++++++++ gtsam/nonlinear/NonlinearFactorGraph.cpp | 29 +++++++++++++++++++-- gtsam/nonlinear/NonlinearFactorGraph.h | 15 ++++++++--- tests/testNonlinearFactorGraph.cpp | 14 +++++++---- 7 files changed, 117 insertions(+), 10 deletions(-) diff --git a/.cproject b/.cproject index ca640b7b1..cb05ca49e 100644 --- a/.cproject +++ b/.cproject @@ -990,6 +990,14 @@ true true + + make + -j5 + testNonlinearFactorGraph.run + true + true + true + make -j5 diff --git a/gtsam/inference/inference-inl.h b/gtsam/inference/inference-inl.h index b24c2d6d2..c17f947d1 100644 --- a/gtsam/inference/inference-inl.h +++ b/gtsam/inference/inference-inl.h @@ -48,6 +48,22 @@ Permutation::shared_ptr PermutationCOLAMD( return PermutationCOLAMD_(variableIndex, cmember); } +/* ************************************************************************* */ +template +Permutation::shared_ptr PermutationCOLAMDGrouped( + const VariableIndex& variableIndex, const CONSTRAINED_MAP& constraints) { + std::vector cmember(variableIndex.size(), 0); + + typedef typename CONSTRAINED_MAP::value_type constraint_pair; + BOOST_FOREACH(const constraint_pair& p, constraints) { + assert(p.first < variableIndex.size()); + // FIXME: check that no groups are skipped + cmember[p.first] = p.second; + } + + return PermutationCOLAMD_(variableIndex, cmember); +} + /* ************************************************************************* */ inline Permutation::shared_ptr PermutationCOLAMD(const VariableIndex& variableIndex) { std::vector cmember(variableIndex.size(), 0); diff --git a/gtsam/inference/inference.h b/gtsam/inference/inference.h index 6ee278c68..7ba268789 100644 --- a/gtsam/inference/inference.h +++ b/gtsam/inference/inference.h @@ -48,8 +48,21 @@ namespace gtsam { Permutation::shared_ptr PermutationCOLAMD( const VariableIndex& variableIndex, const CONSTRAINED& constrainLast); + /** + * Compute a permutation of variable ordering using constrained colamd to + * move variables to the end in groups (0 = unconstrained, higher numbers at + * the end). + * @param variableIndex is the variable index lookup from a graph + * @param constraintMap is a map from variable index -> group number for constrained variables + * @tparam CONSTRAINED_MAP is an associative structure (like std::map), from size_t->int + */ + template + Permutation::shared_ptr PermutationCOLAMDGrouped( + const VariableIndex& variableIndex, const CONSTRAINED_MAP& constraints); + /** * Compute a CCOLAMD permutation using the constraint groups in cmember. + * The format for cmember is a part of ccolamd. * * @param variableIndex is the variable structure from a graph * @param cmember is the constraint group list for each variable, where diff --git a/gtsam/inference/tests/testInference.cpp b/gtsam/inference/tests/testInference.cpp index 2523eb32b..b25703cb6 100644 --- a/gtsam/inference/tests/testInference.cpp +++ b/gtsam/inference/tests/testInference.cpp @@ -81,6 +81,38 @@ TEST(inference, constrained_ordering) { EXPECT(assert_equal(expConstrained, *actConstrained)); } +/* ************************************************************************* */ +TEST(inference, grouped_constrained_ordering) { + SymbolicFactorGraph sfg; + + // create graph with constrained groups: + // 1: 2, 4 + // 2: 5 + sfg.push_factor(0,1); + sfg.push_factor(1,2); + sfg.push_factor(2,3); + sfg.push_factor(3,4); + sfg.push_factor(4,5); + + VariableIndex variableIndex(sfg); + + // constrained version - push one set to the end + FastMap constraints; + constraints[2] = 1; + constraints[4] = 1; + constraints[5] = 2; + + Permutation::shared_ptr actConstrained(inference::PermutationCOLAMDGrouped(variableIndex, constraints)); + Permutation expConstrained(6); + expConstrained[0] = 0; + expConstrained[1] = 1; + expConstrained[2] = 3; + expConstrained[3] = 2; + expConstrained[4] = 4; + expConstrained[5] = 5; + EXPECT(assert_equal(expConstrained, *actConstrained)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/NonlinearFactorGraph.cpp b/gtsam/nonlinear/NonlinearFactorGraph.cpp index d29e7282d..8c4076c56 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.cpp +++ b/gtsam/nonlinear/NonlinearFactorGraph.cpp @@ -83,9 +83,34 @@ Ordering::shared_ptr NonlinearFactorGraph::orderingCOLAMD( // Permute the Ordering with the COLAMD ordering ordering->permuteWithInverse(*colamdPerm->inverse()); + return ordering; +} - // Return the Ordering and VariableIndex to be re-used during linearization - // and elimination +/* ************************************************************************* */ +Ordering::shared_ptr NonlinearFactorGraph::orderingCOLAMDConstrained(const Values& config, + const std::map& constraints) const { + // Create symbolic graph and initial (iterator) ordering + SymbolicFactorGraph::shared_ptr symbolic; + Ordering::shared_ptr ordering; + boost::tie(symbolic, ordering) = this->symbolic(config); + + // Compute the VariableIndex (column-wise index) + VariableIndex variableIndex(*symbolic, ordering->size()); + if (config.size() != variableIndex.size()) throw std::runtime_error( + "orderingCOLAMD: some variables in the graph are not constrained!"); + + // Create a constraint list with correct indices + typedef std::map::value_type constraint_type; + std::map index_constraints; + BOOST_FOREACH(const constraint_type& p, constraints) + index_constraints[ordering->at(p.first)] = p.second; + + // Compute a constrained fill-reducing ordering with COLAMD + Permutation::shared_ptr colamdPerm(inference::PermutationCOLAMDGrouped( + variableIndex, index_constraints)); + + // Permute the Ordering with the COLAMD ordering + ordering->permuteWithInverse(*colamdPerm->inverse()); return ordering; } diff --git a/gtsam/nonlinear/NonlinearFactorGraph.h b/gtsam/nonlinear/NonlinearFactorGraph.h index 29aa9ede1..1742c7b78 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.h +++ b/gtsam/nonlinear/NonlinearFactorGraph.h @@ -75,12 +75,21 @@ namespace gtsam { symbolic(const Values& config) const; /** - * Compute a fill-reducing ordering using COLAMD. This returns the - * ordering and a VariableIndex, which can later be re-used to save - * computation. + * Compute a fill-reducing ordering using COLAMD. */ Ordering::shared_ptr orderingCOLAMD(const Values& config) const; + /** + * Compute a fill-reducing ordering with constraints using CCOLAMD + * + * @param constraints is a map of Key->group, where 0 is unconstrained, and higher + * group numbers are further back in the ordering. Only keys with nonzero group + * indices need to appear in the constraints, unconstrained is assumed for all + * other variables + */ + Ordering::shared_ptr orderingCOLAMDConstrained(const Values& config, + const std::map& constraints) const; + /** * linearize a nonlinear factor graph */ diff --git a/tests/testNonlinearFactorGraph.cpp b/tests/testNonlinearFactorGraph.cpp index 7d9160c1d..f44113f93 100644 --- a/tests/testNonlinearFactorGraph.cpp +++ b/tests/testNonlinearFactorGraph.cpp @@ -83,7 +83,14 @@ TEST( Graph, GET_ORDERING) Ordering::shared_ptr ordering; boost::tie(symbolic, ordering) = nlfg.symbolic(createNoisyValues()); Ordering actual = *nlfg.orderingCOLAMD(createNoisyValues()); - CHECK(assert_equal(expected,actual)); + EXPECT(assert_equal(expected,actual)); + + // Constrained ordering - put x2 at the end + std::map constraints; + constraints[X(2)] = 1; + Ordering actualConstrained = *nlfg.orderingCOLAMDConstrained(createNoisyValues(), constraints); + Ordering expectedConstrained; expectedConstrained += L(1), X(1), X(2); + EXPECT(assert_equal(expectedConstrained, actualConstrained)); } /* ************************************************************************* */ @@ -146,8 +153,5 @@ TEST( Graph, rekey ) } /* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From e50aecb75c6a1317cfb1b016d89ce064620b3d36 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 20 Jun 2012 14:26:46 +0000 Subject: [PATCH 403/914] StereoCamera is now a Value --- gtsam/base/DerivedValue.h | 7 ++- gtsam/geometry/StereoCamera.h | 89 +++++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 39 deletions(-) diff --git a/gtsam/base/DerivedValue.h b/gtsam/base/DerivedValue.h index 83ecea510..6c10a29f5 100644 --- a/gtsam/base/DerivedValue.h +++ b/gtsam/base/DerivedValue.h @@ -10,10 +10,9 @@ * -------------------------------------------------------------------------- */ /* - * DerivedValue.h - * - * Created on: Jan 26, 2012 - * Author: thduynguyen + * @file DerivedValue.h + * @date Jan 26, 2012 + * @author Duy Nguyen Ta */ #pragma once diff --git a/gtsam/geometry/StereoCamera.h b/gtsam/geometry/StereoCamera.h index aa22c18c6..867844fbb 100644 --- a/gtsam/geometry/StereoCamera.h +++ b/gtsam/geometry/StereoCamera.h @@ -30,13 +30,17 @@ namespace gtsam { * A stereo camera class, parameterize by left camera pose and stereo calibration * @addtogroup geometry */ -class StereoCamera { +class StereoCamera : public DerivedValue { private: Pose3 leftCamPose_; Cal3_S2Stereo::shared_ptr K_; public: + + /// @name Standard Constructors + /// @{ + StereoCamera() { } @@ -46,6 +50,54 @@ public: return K_; } + /// @} + /// @name Testable + /// @{ + + void print(const std::string& s = "") const { + leftCamPose_.print(s + ".camera."); + K_->print(s + ".calibration."); + } + + bool equals(const StereoCamera &camera, double tol = 1e-9) const { + return leftCamPose_.equals(camera.leftCamPose_, tol) && K_->equals( + *camera.K_, tol); + } + + /// @} + /// @name Manifold + /// @{ + + /** Dimensionality of the tangent space */ + inline size_t dim() const { + return 6; + } + + /** Dimensionality of the tangent space */ + static inline size_t Dim() { + return 6; + } + + /// Updates a with tangent space delta + inline StereoCamera retract(const Vector& v) const { + return StereoCamera(pose().retract(v), K_); + } + + /// Local coordinates of manifold neighborhood around current value + inline Vector localCoordinates(const StereoCamera& t2) const { + return Vector(leftCamPose_.localCoordinates(t2.leftCamPose_)); + } + + Pose3 between(const StereoCamera &camera, + boost::optional H1=boost::none, + boost::optional H2=boost::none) const { + return leftCamPose_.between(camera.pose(), H1, H2); + } + + /// @} + /// @name Standard Interface + /// @{ + const Pose3& pose() const { return leftCamPose_; } @@ -80,40 +132,7 @@ public: return world_point; } - /** Dimensionality of the tangent space */ - inline size_t dim() const { - return 6; - } - - /** Dimensionality of the tangent space */ - static inline size_t Dim() { - return 6; - } - - bool equals(const StereoCamera &camera, double tol = 1e-9) const { - return leftCamPose_.equals(camera.leftCamPose_, tol) && K_->equals( - *camera.K_, tol); - } - - // Manifold requirements - use existing expmap/logmap - inline StereoCamera retract(const Vector& v) const { - return StereoCamera(pose().retract(v), K_); - } - - inline Vector localCoordinates(const StereoCamera& t2) const { - return Vector(leftCamPose_.localCoordinates(t2.leftCamPose_)); - } - - Pose3 between(const StereoCamera &camera, - boost::optional H1=boost::none, - boost::optional H2=boost::none) const { - return leftCamPose_.between(camera.pose(), H1, H2); - } - - void print(const std::string& s = "") const { - leftCamPose_.print(s + ".camera."); - K_->print(s + ".calibration."); - } + /// @} private: /** utility functions */ From 56c9107775621f6eef2d9af6464538f671ce0738 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Wed, 20 Jun 2012 17:10:55 +0000 Subject: [PATCH 404/914] typo in assertion --- gtsam/geometry/Tensor2Expression.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/geometry/Tensor2Expression.h b/gtsam/geometry/Tensor2Expression.h index f9e56054f..5b07bad37 100644 --- a/gtsam/geometry/Tensor2Expression.h +++ b/gtsam/geometry/Tensor2Expression.h @@ -299,7 +299,7 @@ namespace tensors { const Tensor2Expression& actual, double tol = 1e-9) { if (actual.equivalent(expected, tol)) return true; - std::cout << "Not equal:\n"; + std::cout << "Not equivalent:\n"; expected.print("expected:\n"); actual.print("actual:\n"); return false; From 30525529c93523b345eca19fa5d7ffc342d88e99 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 20 Jun 2012 20:56:06 +0000 Subject: [PATCH 405/914] update according to the pinholecamera change --- gtsam.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index a220f5fe3..bafc15790 100644 --- a/gtsam.h +++ b/gtsam.h @@ -489,7 +489,6 @@ class SimpleCamera { pair projectSafe(const gtsam::Point3& pw) const; gtsam::Point2 project(const gtsam::Point3& point); gtsam::Point3 backproject(const gtsam::Point2& p, double depth) const; - gtsam::Point3 backproject_from_camera(const gtsam::Point2& p, double depth) const; double range(const gtsam::Point3& point); // double range(const gtsam::Pose3& point); // FIXME, overload }; From d0c193e403b493336e5f09d38a8b0500a855c903 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 21 Jun 2012 01:20:04 +0000 Subject: [PATCH 406/914] Made global variables and functions in unit tests static to avoid duplicate symbols when linking all tests together --- gtsam/base/TestableAssertions.h | 4 +-- gtsam/geometry/tests/testCal3Bundler.cpp | 4 +-- gtsam/geometry/tests/testCal3DS2.cpp | 4 +-- gtsam/geometry/tests/testCalibratedCamera.cpp | 14 +++++----- gtsam/geometry/tests/testFundamental.cpp | 8 +++--- gtsam/geometry/tests/testHomography2.cpp | 6 ++--- gtsam/geometry/tests/testPoint3.cpp | 2 +- gtsam/geometry/tests/testPose2.cpp | 6 ++--- gtsam/geometry/tests/testRot3M.cpp | 6 ++--- gtsam/geometry/tests/testRot3Q.cpp | 6 ++--- gtsam/geometry/tests/testSimpleCamera.cpp | 16 ++++++------ gtsam/inference/tests/testBayesTree.cpp | 6 ++--- .../inference/tests/testSymbolicBayesNet.cpp | 2 +- gtsam/slam/tests/testGeneralSFMFactor.cpp | 12 ++++----- .../testGeneralSFMFactor_Cal3Bundler.cpp | 26 +++++++++---------- 15 files changed, 61 insertions(+), 61 deletions(-) diff --git a/gtsam/base/TestableAssertions.h b/gtsam/base/TestableAssertions.h index 10daafbb4..e79d6b764 100644 --- a/gtsam/base/TestableAssertions.h +++ b/gtsam/base/TestableAssertions.h @@ -30,7 +30,7 @@ namespace gtsam { /** * Equals testing for basic types */ -bool assert_equal(const Index& expected, const Index& actual, double tol = 0.0) { +static bool assert_equal(const Index& expected, const Index& actual, double tol = 0.0) { if(expected != actual) { std::cout << "Not equal:\nexpected: " << expected << "\nactual: " << actual << std::endl; return false; @@ -327,7 +327,7 @@ bool assert_container_equality(const V& expected, const V& actual) { /** * Compare strings for unit tests */ -bool assert_equal(const std::string& expected, const std::string& actual) { +static bool assert_equal(const std::string& expected, const std::string& actual) { if (expected == actual) return true; printf("Not equal:\n"); diff --git a/gtsam/geometry/tests/testCal3Bundler.cpp b/gtsam/geometry/tests/testCal3Bundler.cpp index bb1bd861d..e354796fa 100644 --- a/gtsam/geometry/tests/testCal3Bundler.cpp +++ b/gtsam/geometry/tests/testCal3Bundler.cpp @@ -25,8 +25,8 @@ using namespace gtsam; GTSAM_CONCEPT_TESTABLE_INST(Cal3Bundler) GTSAM_CONCEPT_MANIFOLD_INST(Cal3Bundler) -Cal3Bundler K(500, 1e-3, 1e-3); -Point2 p(2,3); +static Cal3Bundler K(500, 1e-3, 1e-3); +static Point2 p(2,3); /* ************************************************************************* */ TEST( Cal3Bundler, calibrate) diff --git a/gtsam/geometry/tests/testCal3DS2.cpp b/gtsam/geometry/tests/testCal3DS2.cpp index 4c79a447b..9f8777e49 100644 --- a/gtsam/geometry/tests/testCal3DS2.cpp +++ b/gtsam/geometry/tests/testCal3DS2.cpp @@ -25,8 +25,8 @@ using namespace gtsam; GTSAM_CONCEPT_TESTABLE_INST(Cal3DS2) GTSAM_CONCEPT_MANIFOLD_INST(Cal3DS2) -Cal3DS2 K(500, 100, 0.1, 320, 240, 1e-3, 2.0*1e-3, 3.0*1e-3, 4.0*1e-3); -Point2 p(2,3); +static Cal3DS2 K(500, 100, 0.1, 320, 240, 1e-3, 2.0*1e-3, 3.0*1e-3, 4.0*1e-3); +static Point2 p(2,3); /* ************************************************************************* */ TEST( Cal3DS2, calibrate) diff --git a/gtsam/geometry/tests/testCalibratedCamera.cpp b/gtsam/geometry/tests/testCalibratedCamera.cpp index 7fe88bce0..f8750ec24 100644 --- a/gtsam/geometry/tests/testCalibratedCamera.cpp +++ b/gtsam/geometry/tests/testCalibratedCamera.cpp @@ -27,19 +27,19 @@ using namespace gtsam; GTSAM_CONCEPT_MANIFOLD_INST(CalibratedCamera) -const Pose3 pose1(Matrix_(3,3, +static const Pose3 pose1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,0.5)); -const CalibratedCamera camera(pose1); +static const CalibratedCamera camera(pose1); -const Point3 point1(-0.08,-0.08, 0.0); -const Point3 point2(-0.08, 0.08, 0.0); -const Point3 point3( 0.08, 0.08, 0.0); -const Point3 point4( 0.08,-0.08, 0.0); +static const Point3 point1(-0.08,-0.08, 0.0); +static const Point3 point2(-0.08, 0.08, 0.0); +static const Point3 point3( 0.08, 0.08, 0.0); +static const Point3 point4( 0.08,-0.08, 0.0); /* ************************************************************************* */ TEST( CalibratedCamera, constructor) @@ -95,7 +95,7 @@ TEST( CalibratedCamera, Dproject_to_camera1) { } /* ************************************************************************* */ -Point2 project2(const Pose3& pose, const Point3& point) { +static Point2 project2(const Pose3& pose, const Point3& point) { return CalibratedCamera(pose).project(point); } diff --git a/gtsam/geometry/tests/testFundamental.cpp b/gtsam/geometry/tests/testFundamental.cpp index 46a051609..c233cbfd0 100644 --- a/gtsam/geometry/tests/testFundamental.cpp +++ b/gtsam/geometry/tests/testFundamental.cpp @@ -34,11 +34,11 @@ using namespace tensors; /* ************************************************************************* */ // Indices -tensors::Index<3, 'a'> a; -tensors::Index<3, 'b'> b; +static tensors::Index<3, 'a'> a; +static tensors::Index<3, 'b'> b; -tensors::Index<4, 'A'> A; -tensors::Index<4, 'B'> B; +static tensors::Index<4, 'A'> A; +static tensors::Index<4, 'B'> B; /* ************************************************************************* */ TEST( Tensors, FundamentalMatrix) diff --git a/gtsam/geometry/tests/testHomography2.cpp b/gtsam/geometry/tests/testHomography2.cpp index 062de9d1d..85681baa4 100644 --- a/gtsam/geometry/tests/testHomography2.cpp +++ b/gtsam/geometry/tests/testHomography2.cpp @@ -36,9 +36,9 @@ using namespace tensors; /* ************************************************************************* */ // Indices -tensors::Index<3, 'a'> a, _a; -tensors::Index<3, 'b'> b, _b; -tensors::Index<3, 'c'> c, _c; +static tensors::Index<3, 'a'> a, _a; +static tensors::Index<3, 'b'> b, _b; +static tensors::Index<3, 'c'> c, _c; /* ************************************************************************* */ TEST( Homography2, RealImages) diff --git a/gtsam/geometry/tests/testPoint3.cpp b/gtsam/geometry/tests/testPoint3.cpp index c7e25f7a9..492d65e42 100644 --- a/gtsam/geometry/tests/testPoint3.cpp +++ b/gtsam/geometry/tests/testPoint3.cpp @@ -23,7 +23,7 @@ using namespace gtsam; GTSAM_CONCEPT_TESTABLE_INST(Point3) GTSAM_CONCEPT_LIE_INST(Point3) -Point3 P(0.2,0.7,-2); +static Point3 P(0.2,0.7,-2); /* ************************************************************************* */ TEST(Point3, Lie) { diff --git a/gtsam/geometry/tests/testPose2.cpp b/gtsam/geometry/tests/testPose2.cpp index 2a0f9ebec..a79371e63 100644 --- a/gtsam/geometry/tests/testPose2.cpp +++ b/gtsam/geometry/tests/testPose2.cpp @@ -156,7 +156,7 @@ TEST(Pose3, expmap_c) #endif /* ************************************************************************* */ -TEST(Pose3, expmap_c_full) +TEST(Pose2, expmap_c_full) { double w=0.3; Vector xi = Vector_(3, 0.0, w, w); @@ -191,7 +191,7 @@ TEST(Pose2, logmap_full) { } /* ************************************************************************* */ -Point2 transform_to_proxy(const Pose2& pose, const Point2& point) { +static Point2 transform_to_proxy(const Pose2& pose, const Point2& point) { return pose.transform_to(point); } @@ -220,7 +220,7 @@ TEST( Pose2, transform_to ) } /* ************************************************************************* */ -Point2 transform_from_proxy(const Pose2& pose, const Point2& point) { +static Point2 transform_from_proxy(const Pose2& pose, const Point2& point) { return pose.transform_from(point); } diff --git a/gtsam/geometry/tests/testRot3M.cpp b/gtsam/geometry/tests/testRot3M.cpp index 7c8bd04bd..449ed9cd7 100644 --- a/gtsam/geometry/tests/testRot3M.cpp +++ b/gtsam/geometry/tests/testRot3M.cpp @@ -31,9 +31,9 @@ using namespace std; using namespace gtsam; -Rot3 R = Rot3::rodriguez(0.1, 0.4, 0.2); -Point3 P(0.2, 0.7, -2.0); -double error = 1e-9, epsilon = 0.001; +static Rot3 R = Rot3::rodriguez(0.1, 0.4, 0.2); +static Point3 P(0.2, 0.7, -2.0); +static double error = 1e-9, epsilon = 0.001; static const Matrix I3 = eye(3); /* ************************************************************************* */ diff --git a/gtsam/geometry/tests/testRot3Q.cpp b/gtsam/geometry/tests/testRot3Q.cpp index 02056eb2d..7268eed55 100644 --- a/gtsam/geometry/tests/testRot3Q.cpp +++ b/gtsam/geometry/tests/testRot3Q.cpp @@ -27,9 +27,9 @@ using namespace gtsam; -Rot3 R = Rot3::rodriguez(0.1, 0.4, 0.2); -Point3 P(0.2, 0.7, -2.0); -double error = 1e-9, epsilon = 0.001; +static Rot3 R = Rot3::rodriguez(0.1, 0.4, 0.2); +static Point3 P(0.2, 0.7, -2.0); +static double error = 1e-9, epsilon = 0.001; /* ************************************************************************* */ TEST( Rot3, constructor) diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index e46a247a0..6cc00de8a 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -26,21 +26,21 @@ using namespace std; using namespace gtsam; -const Cal3_S2 K(625, 625, 0, 0, 0); +static const Cal3_S2 K(625, 625, 0, 0, 0); -const Pose3 pose1(Matrix_(3,3, +static const Pose3 pose1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,0.5)); -const SimpleCamera camera(pose1, K); +static const SimpleCamera camera(pose1, K); -const Point3 point1(-0.08,-0.08, 0.0); -const Point3 point2(-0.08, 0.08, 0.0); -const Point3 point3( 0.08, 0.08, 0.0); -const Point3 point4( 0.08,-0.08, 0.0); +static const Point3 point1(-0.08,-0.08, 0.0); +static const Point3 point2(-0.08, 0.08, 0.0); +static const Point3 point3( 0.08, 0.08, 0.0); +static const Point3 point4( 0.08,-0.08, 0.0); /* ************************************************************************* */ TEST( SimpleCamera, constructor) @@ -118,7 +118,7 @@ TEST( SimpleCamera, backproject2) } /* ************************************************************************* */ -Point2 project2(const Pose3& pose, const Point3& point) { +static Point2 project2(const Pose3& pose, const Point3& point) { return SimpleCamera(pose,K).project(point); } diff --git a/gtsam/inference/tests/testBayesTree.cpp b/gtsam/inference/tests/testBayesTree.cpp index 2f85e1454..a5601b8eb 100644 --- a/gtsam/inference/tests/testBayesTree.cpp +++ b/gtsam/inference/tests/testBayesTree.cpp @@ -62,7 +62,7 @@ static const Index _x3_=0, _x2_=1; /* ************************************************************************* */ // Conditionals for ASIA example from the tutorial with A and D evidence static const Index _X_=0, _T_=1, _S_=2, _E_=3, _L_=4, _B_=5; -IndexConditional::shared_ptr +static IndexConditional::shared_ptr B(new IndexConditional(_B_)), L(new IndexConditional(_L_, _B_)), E(new IndexConditional(_E_, _L_, _B_)), @@ -71,11 +71,11 @@ IndexConditional::shared_ptr X(new IndexConditional(_X_, _E_)); // Cliques -IndexConditional::shared_ptr +static IndexConditional::shared_ptr ELB(IndexConditional::FromKeys(cref_list_of<3>(_E_)(_L_)(_B_), 3)); // Bayes Tree for Asia example -SymbolicBayesTree createAsiaSymbolicBayesTree() { +static SymbolicBayesTree createAsiaSymbolicBayesTree() { SymbolicBayesTree bayesTree; // Ordering asiaOrdering; asiaOrdering += _X_, _T_, _S_, _E_, _L_, _B_; SymbolicBayesTree::insert(bayesTree, B); diff --git a/gtsam/inference/tests/testSymbolicBayesNet.cpp b/gtsam/inference/tests/testSymbolicBayesNet.cpp index 20abb6a71..06b1bded9 100644 --- a/gtsam/inference/tests/testSymbolicBayesNet.cpp +++ b/gtsam/inference/tests/testSymbolicBayesNet.cpp @@ -35,7 +35,7 @@ static const Index _C_ = 3; static const Index _D_ = 4; static const Index _E_ = 5; -IndexConditional::shared_ptr +static IndexConditional::shared_ptr B(new IndexConditional(_B_)), L(new IndexConditional(_L_, _B_)); diff --git a/gtsam/slam/tests/testGeneralSFMFactor.cpp b/gtsam/slam/tests/testGeneralSFMFactor.cpp index 1306f5148..d6fcb5c5a 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor.cpp @@ -65,7 +65,7 @@ public: }; -double getGaussian() +static double getGaussian() { double S,V1,V2; // Use Box-Muller method to create gauss noise from uniform noise @@ -80,7 +80,7 @@ double getGaussian() return sqrt(-2.0f * (double)log(S) / S) * V1; } -const SharedNoiseModel sigma1(noiseModel::Unit::Create(1)); +static const SharedNoiseModel sigma1(noiseModel::Unit::Create(1)); /* ************************************************************************* */ TEST( GeneralSFMFactor, equals ) @@ -116,7 +116,7 @@ TEST( GeneralSFMFactor, error ) { static const double baseline = 5.0 ; /* ************************************************************************* */ -vector genPoint3() { +static vector genPoint3() { const double z = 5; vector landmarks ; landmarks.push_back(Point3 (-1.0,-1.0, z)); @@ -134,14 +134,14 @@ vector genPoint3() { return landmarks ; } -vector genCameraDefaultCalibration() { +static vector genCameraDefaultCalibration() { vector X ; X.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)))); X.push_back(GeneralCamera(Pose3(eye(3),Point3( baseline/2.0, 0.0, 0.0)))); return X ; } -vector genCameraVariableCalibration() { +static vector genCameraVariableCalibration() { const Cal3_S2 K(640,480,0.01,320,240); vector X ; X.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)), K)); @@ -149,7 +149,7 @@ vector genCameraVariableCalibration() { return X ; } -boost::shared_ptr getOrdering(const vector& cameras, const vector& landmarks) { +static boost::shared_ptr getOrdering(const vector& cameras, const vector& landmarks) { boost::shared_ptr ordering(new Ordering); for ( size_t i = 0 ; i < landmarks.size() ; ++i ) ordering->push_back(L(i)) ; for ( size_t i = 0 ; i < cameras.size() ; ++i ) ordering->push_back(X(i)) ; diff --git a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp index 142c27e7e..9afd8eff1 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp @@ -66,7 +66,7 @@ public: }; -double getGaussian() +static double getGaussian() { double S,V1,V2; // Use Box-Muller method to create gauss noise from uniform noise @@ -81,10 +81,10 @@ double getGaussian() return sqrt(-2.0f * (double)log(S) / S) * V1; } -const SharedNoiseModel sigma1(noiseModel::Unit::Create(1)); +static const SharedNoiseModel sigma1(noiseModel::Unit::Create(1)); /* ************************************************************************* */ -TEST( GeneralSFMFactor, equals ) +TEST( GeneralSFMFactor_Cal3Bundler, equals ) { // Create two identical factors and make sure they're equal Vector z = Vector_(2,323.,240.); @@ -100,7 +100,7 @@ TEST( GeneralSFMFactor, equals ) } /* ************************************************************************* */ -TEST( GeneralSFMFactor, error ) { +TEST( GeneralSFMFactor_Cal3Bundler, error ) { Point2 z(3.,0.); const SharedNoiseModel sigma(noiseModel::Unit::Create(1)); boost::shared_ptr @@ -119,7 +119,7 @@ TEST( GeneralSFMFactor, error ) { static const double baseline = 5.0 ; /* ************************************************************************* */ -vector genPoint3() { +static vector genPoint3() { const double z = 5; vector landmarks ; landmarks.push_back(Point3 (-1.0,-1.0, z)); @@ -137,14 +137,14 @@ vector genPoint3() { return landmarks ; } -vector genCameraDefaultCalibration() { +static vector genCameraDefaultCalibration() { vector cameras ; cameras.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)))); cameras.push_back(GeneralCamera(Pose3(eye(3),Point3( baseline/2.0, 0.0, 0.0)))); return cameras ; } -vector genCameraVariableCalibration() { +static vector genCameraVariableCalibration() { const Cal3Bundler K(500,1e-3,1e-3); vector cameras ; cameras.push_back(GeneralCamera(Pose3(eye(3),Point3(-baseline/2.0, 0.0, 0.0)), K)); @@ -152,7 +152,7 @@ vector genCameraVariableCalibration() { return cameras ; } -boost::shared_ptr getOrdering(const std::vector& cameras, const std::vector& landmarks) { +static boost::shared_ptr getOrdering(const std::vector& cameras, const std::vector& landmarks) { boost::shared_ptr ordering(new Ordering); for ( size_t i = 0 ; i < landmarks.size() ; ++i ) ordering->push_back(L(i)) ; for ( size_t i = 0 ; i < cameras.size() ; ++i ) ordering->push_back(X(i)) ; @@ -160,7 +160,7 @@ boost::shared_ptr getOrdering(const std::vector& camera } /* ************************************************************************* */ -TEST( GeneralSFMFactor, optimize_defaultK ) { +TEST( GeneralSFMFactor_Cal3Bundler, optimize_defaultK ) { vector landmarks = genPoint3(); vector cameras = genCameraDefaultCalibration(); @@ -199,7 +199,7 @@ TEST( GeneralSFMFactor, optimize_defaultK ) { } /* ************************************************************************* */ -TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) { +TEST( GeneralSFMFactor_Cal3Bundler, optimize_varK_SingleMeasurementError ) { vector landmarks = genPoint3(); vector cameras = genCameraVariableCalibration(); // add measurement with noise @@ -242,7 +242,7 @@ TEST( GeneralSFMFactor, optimize_varK_SingleMeasurementError ) { } /* ************************************************************************* */ -TEST( GeneralSFMFactor, optimize_varK_FixCameras ) { +TEST( GeneralSFMFactor_Cal3Bundler, optimize_varK_FixCameras ) { vector landmarks = genPoint3(); vector cameras = genCameraVariableCalibration(); @@ -283,7 +283,7 @@ TEST( GeneralSFMFactor, optimize_varK_FixCameras ) { } /* ************************************************************************* */ -TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { +TEST( GeneralSFMFactor_Cal3Bundler, optimize_varK_FixLandmarks ) { vector landmarks = genPoint3(); vector cameras = genCameraVariableCalibration(); @@ -336,7 +336,7 @@ TEST( GeneralSFMFactor, optimize_varK_FixLandmarks ) { } /* ************************************************************************* */ -TEST( GeneralSFMFactor, optimize_varK_BA ) { +TEST( GeneralSFMFactor_Cal3Bundler, optimize_varK_BA ) { vector landmarks = genPoint3(); vector cameras = genCameraVariableCalibration(); From a9945f2265f2c42be550efd8167d5fc08e966004 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 21 Jun 2012 01:20:14 +0000 Subject: [PATCH 407/914] Moved dim() from NonlinearFactor to NoiseModelFactor - for NonlinearFactors that linearize to HessianFactors, dimension is not defined. --- gtsam/nonlinear/NonlinearFactor.h | 3 --- gtsam/slam/AntiFactor.h | 3 --- 2 files changed, 6 deletions(-) diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index e1cfb2bc3..f6869140c 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -124,9 +124,6 @@ public: */ virtual double error(const Values& c) const = 0; - /** get the dimension of the factor (number of rows on linearization) */ - virtual size_t dim() const = 0; - /** * Checks whether a factor should be used based on a set of values. * This is primarily used to implment inequality constraints that diff --git a/gtsam/slam/AntiFactor.h b/gtsam/slam/AntiFactor.h index 1e0d64db7..890e5beee 100644 --- a/gtsam/slam/AntiFactor.h +++ b/gtsam/slam/AntiFactor.h @@ -78,9 +78,6 @@ namespace gtsam { */ double error(const Values& c) const { return -factor_->error(c); } - /** get the dimension of the factor (same as the original factor) */ - size_t dim() const { return factor_->dim(); } - /** * Checks whether this factor should be used based on a set of values. * The AntiFactor will have the same 'active' profile as the original factor. From a0fc13fce8eda2ac5800af364ba13ce253c1e9c9 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 21 Jun 2012 01:20:25 +0000 Subject: [PATCH 408/914] Added LieMatrix to allow optimizing for matrices (treated as manifold objects) in gtsam --- gtsam/base/LieMatrix.cpp | 36 ++++++++ gtsam/base/LieMatrix.h | 139 +++++++++++++++++++++++++++++ gtsam/base/tests/testLieMatrix.cpp | 71 +++++++++++++++ 3 files changed, 246 insertions(+) create mode 100644 gtsam/base/LieMatrix.cpp create mode 100644 gtsam/base/LieMatrix.h create mode 100644 gtsam/base/tests/testLieMatrix.cpp diff --git a/gtsam/base/LieMatrix.cpp b/gtsam/base/LieMatrix.cpp new file mode 100644 index 000000000..332401689 --- /dev/null +++ b/gtsam/base/LieMatrix.cpp @@ -0,0 +1,36 @@ +/* ---------------------------------------------------------------------------- + + * 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 LieMatrix.cpp + * @brief A wrapper around Matrix providing Lie compatibility + * @author Richard Roberts and Alex Cunningham + */ + +#include + +namespace gtsam { + + /* ************************************************************************* */ + LieMatrix::LieMatrix(size_t m, size_t n, ...) + : Matrix(m,n) { + va_list ap; + va_start(ap, n); + for(size_t i = 0; i < m; ++i) { + for(size_t j = 0; j < n; ++j) { + double value = va_arg(ap, double); + (*this)(i,j) = value; + } + } + va_end(ap); + } + +} \ No newline at end of file diff --git a/gtsam/base/LieMatrix.h b/gtsam/base/LieMatrix.h new file mode 100644 index 000000000..2ab15a054 --- /dev/null +++ b/gtsam/base/LieMatrix.h @@ -0,0 +1,139 @@ +/* ---------------------------------------------------------------------------- + + * 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 LieMatrix.h + * @brief A wrapper around Matrix providing Lie compatibility + * @author Richard Roberts and Alex Cunningham + */ + +#pragma once + +#include + +#include +#include +#include + +namespace gtsam { + +/** + * LieVector is a wrapper around vector to allow it to be a Lie type + */ +struct LieMatrix : public Matrix, public DerivedValue { + + /** default constructor - should be unnecessary */ + LieMatrix() {} + + /** initialize from a normal matrix */ + LieMatrix(const Matrix& v) : Matrix(v) {} + + /** initialize from a fixed size normal vector */ + template + LieMatrix(const Eigen::Matrix& v) : Matrix(v) {} + + /** constructor with size and initial data, row order ! */ + LieMatrix(size_t m, size_t n, const double* const data) : + Matrix(Eigen::Map(data, m, n)) {} + + /** Specify arguments directly, as in Matrix_() - always force these to be doubles */ + LieMatrix(size_t m, size_t n, ...); + + /** get the underlying vector */ + inline Matrix matrix() const { + return static_cast(*this); + } + + /** print @param s optional string naming the object */ + inline void print(const std::string& name="") const { + gtsam::print(matrix(), name); + } + + /** equality up to tolerance */ + inline bool equals(const LieMatrix& expected, double tol=1e-5) const { + return gtsam::equal_with_abs_tol(matrix(), expected.matrix(), tol); + } + + // Manifold requirements + + /** Returns dimensionality of the tangent space */ + inline size_t dim() const { return this->size(); } + + /** Update the LieMatrix with a tangent space update. The elements of the + * tangent space vector correspond to the matrix entries arranged in + * *row-major* order. */ + inline LieMatrix retract(const Vector& v) const { + if(v.size() != this->rows() * this->cols()) + throw std::invalid_argument("LieMatrix::retract called with Vector of incorrect size"); + return LieMatrix(*this + Eigen::Map(&v(0), this->cols(), this->rows()).transpose()); + } + + /** @return the local coordinates of another object. The elements of the + * tangent space vector correspond to the matrix entries arranged in + * *row-major* order. */ + inline Vector localCoordinates(const LieMatrix& t2) const { + Vector result(this->rows() * this->cols()); + Eigen::Map(&result(0), this->cols(), this->rows()).transpose() = + (t2 - *this); + return result; + } + + // Group requirements + + /** identity - NOTE: no known size at compile time - so zero length */ + inline static LieMatrix identity() { + throw std::runtime_error("LieMatrix::identity(): Don't use this function"); + return LieMatrix(); + } + + // Note: Manually specifying the 'gtsam' namespace for the optional Matrix arguments + // This is a work-around for linux g++ 4.6.1 that incorrectly selects the Eigen::Matrix class + // instead of the gtsam::Matrix class. This is related to deriving this class from an Eigen Vector + // as the other geometry objects (Point3, Rot3, etc.) have this problem + /** compose with another object */ + inline LieMatrix compose(const LieMatrix& p, + boost::optional H1=boost::none, + boost::optional H2=boost::none) const { + if(H1) *H1 = eye(dim()); + if(H2) *H2 = eye(p.dim()); + + return LieMatrix(*this + p); + } + + /** between operation */ + inline LieMatrix between(const LieMatrix& l2, + boost::optional H1=boost::none, + boost::optional H2=boost::none) const { + if(H1) *H1 = -eye(dim()); + if(H2) *H2 = eye(l2.dim()); + return LieMatrix(l2 - *this); + } + + /** invert the object and yield a new one */ + inline LieMatrix inverse(boost::optional H=boost::none) const { + if(H) *H = -eye(dim()); + + return LieMatrix(-(*this)); + } + + // Lie functions + + /** Expmap around identity */ + static inline LieMatrix Expmap(const Vector& v) { + throw std::runtime_error("LieMatrix::Expmap(): Don't use this function"); + return LieMatrix(v); } + + /** Logmap around identity - just returns with default cast back */ + static inline Vector Logmap(const LieMatrix& p) { + return Eigen::Map(&p(0,0), p.dim()); } + +}; +} // \namespace gtsam diff --git a/gtsam/base/tests/testLieMatrix.cpp b/gtsam/base/tests/testLieMatrix.cpp new file mode 100644 index 000000000..e4070d338 --- /dev/null +++ b/gtsam/base/tests/testLieMatrix.cpp @@ -0,0 +1,71 @@ +/* ---------------------------------------------------------------------------- + + * 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 testLieMatrix.cpp + * @author Richard Roberts + */ + +#include + +#include +#include +#include + +using namespace gtsam; + +GTSAM_CONCEPT_TESTABLE_INST(LieMatrix) +GTSAM_CONCEPT_LIE_INST(LieMatrix) + +/* ************************************************************************* */ +TEST( LieMatrix, construction ) { + Matrix m = Matrix_(2,2, 1.0, 2.0, 3.0, 4.0); + LieMatrix lie1(m), lie2(m); + + EXPECT(lie1.dim() == 4); + EXPECT(assert_equal(m, lie1.matrix())); + EXPECT(assert_equal(lie1, lie2)); +} + +/* ************************************************************************* */ +TEST( LieMatrix, other_constructors ) { + Matrix init = Matrix_(2,2, 10.0, 20.0, 30.0, 40.0); + LieMatrix exp(init); + LieMatrix a(2,2,10.0,20.0,30.0,40.0); + double data[] = {10,30,20,40}; + LieMatrix b(2,2,data); + EXPECT(assert_equal(exp, a)); + EXPECT(assert_equal(exp, b)); + EXPECT(assert_equal(b, a)); +} + +/* ************************************************************************* */ +TEST(LieMatrix, retract) { + LieMatrix init(2,2, 1.0,2.0,3.0,4.0); + init.print("init: "); + Vector update = Vector_(4, 3.0, 4.0, 6.0, 7.0); + + LieMatrix expected(2,2, 4.0, 6.0, 9.0, 11.0); + LieMatrix actual = init.retract(update); + + EXPECT(assert_equal(expected, actual)); + + LieMatrix expectedUpdate = update; + LieMatrix actualUpdate = init.localCoordinates(actual); + + EXPECT(assert_equal(expectedUpdate, actualUpdate)); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ + + From 120b3c26726c509d1cfb5e507e16dc68c74ddc22 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 21 Jun 2012 14:01:34 +0000 Subject: [PATCH 409/914] Comments only --- gtsam/inference/Factor.h | 2 +- gtsam/linear/GaussianMultifrontalSolver.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index b73eff9d0..6ed9c809b 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -36,7 +36,7 @@ template class Conditional; * which will be the type used to label variables. Key types currently in use * in gtsam are Index with symbolic (IndexFactor, SymbolicFactorGraph) and * Gaussian factors (GaussianFactor, JacobianFactor, HessianFactor, GaussianFactorGraph), - * and Symbol with nonlinear factors (NonlinearFactor, NonlinearFactorGraph). + * and Key with nonlinear factors (NonlinearFactor, NonlinearFactorGraph). * though currently only IndexFactor and IndexConditional derive from this * class, using Index keys. This class does not store any data other than its * keys. Derived classes store data such as matrices and probability tables. diff --git a/gtsam/linear/GaussianMultifrontalSolver.h b/gtsam/linear/GaussianMultifrontalSolver.h index a38bb3161..322aacfc6 100644 --- a/gtsam/linear/GaussianMultifrontalSolver.h +++ b/gtsam/linear/GaussianMultifrontalSolver.h @@ -100,6 +100,8 @@ public: * Compute the marginal joint over a set of variables, by integrating out * all of the other variables. This function returns the result as a factor * graph. + * + * NOTE: This function is limited to computing a joint on 2 variables */ GaussianFactorGraph::shared_ptr jointFactorGraph(const std::vector& js) const; From 3366c673d76a1b22273578f9a180da2637f0f03f Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Thu, 21 Jun 2012 14:28:08 +0000 Subject: [PATCH 410/914] (With Duy) add a matlab wrapper for the LM optimizer and parameters in visualSLAM, have an example in SFMExample.m --- gtsam.h | 17 ++++++++++ gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 6 +++- gtsam/slam/tests/testVisualSLAM.cpp | 32 +++++++++++++++++++ gtsam/slam/visualSLAM.h | 11 +++++++ matlab/examples/SFMExample.m | 14 ++++++-- 5 files changed, 77 insertions(+), 3 deletions(-) diff --git a/gtsam.h b/gtsam.h index bafc15790..b1c3b8d02 100644 --- a/gtsam.h +++ b/gtsam.h @@ -777,6 +777,13 @@ class Marginals { Matrix marginalInformation(size_t variable) const; }; +#include +class LevenbergMarquardtParams { + LevenbergMarquardtParams(); + LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose); + void print(string s) const; +}; + }///\namespace gtsam //************************************************************************* @@ -1002,6 +1009,7 @@ class Graph { visualSLAM::Values optimize(const visualSLAM::Values& initialEstimate, size_t verbosity) const; gtsam::Marginals marginals(const visualSLAM::Values& solution) const; + visualSLAM::LevenbergMarquardtOptimizer optimizer(const visualSLAM::Values& initialEstimate, const gtsam::LevenbergMarquardtParams& parameters) const; }; class ISAM { @@ -1026,4 +1034,13 @@ class ISAM { gtsam::NonlinearFactorGraph getFactorsUnsafe() const; }; +class LevenbergMarquardtOptimizer { + double lambda() const; + void iterate(); + visualSLAM::Values optimize(); + double error() const; + size_t iterations() const; + visualSLAM::Values values() const; +}; + }///\namespace visualSLAM diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index 0858b72b9..231df9f4e 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -33,7 +33,7 @@ class LevenbergMarquardtParams : public SuccessiveLinearizationParams { public: /** See LevenbergMarquardtParams::lmVerbosity */ enum VerbosityLM { - SILENT, + SILENT = 0, LAMBDA, TRYLAMBDA, TRYCONFIG, @@ -49,6 +49,9 @@ public: LevenbergMarquardtParams() : lambdaInitial(1e-5), lambdaFactor(10.0), lambdaUpperBound(1e5), verbosityLM(SILENT) {} + LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose) : + lambdaInitial(initial), lambdaFactor(factor), lambdaUpperBound(bound), verbosityLM(VerbosityLM(verbose)) {} + virtual ~LevenbergMarquardtParams() {} virtual void print(const std::string& str = "") const { @@ -56,6 +59,7 @@ public: std::cout << " lambdaInitial: " << lambdaInitial << "\n"; std::cout << " lambdaFactor: " << lambdaFactor << "\n"; std::cout << " lambdaUpperBound: " << lambdaUpperBound << "\n"; + std::cout << " verbosityLM: " << verbosityLM << "\n"; std::cout.flush(); } }; diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp index d9abc67ed..081142038 100644 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -154,6 +154,38 @@ TEST( VisualSLAM, optimizeLM2) CHECK(assert_equal(initialEstimate, optimizer.values())); } +/* ************************************************************************* */ +TEST( VisualSLAM, LMoptimizer) +{ + // build a graph + visualSLAM::Graph graph(testGraph()); + // add 2 camera constraints + graph.addPoseConstraint(X(1), camera1); + graph.addPoseConstraint(X(2), camera2); + + // Create an initial values structure corresponding to the ground truth + Values initialEstimate; + initialEstimate.insert(X(1), camera1); + initialEstimate.insert(X(2), camera2); + initialEstimate.insert(L(1), landmark1); + initialEstimate.insert(L(2), landmark2); + initialEstimate.insert(L(3), landmark3); + initialEstimate.insert(L(4), landmark4); + + // Create an optimizer and check its error + // We expect the initial to be zero because config is the ground truth + LevenbergMarquardtOptimizer optimizer = graph.optimizer(initialEstimate); + DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); + + // Iterate once, and the config should not have changed because we started + // with the ground truth + optimizer.iterate(); + DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); + + // check if correct + CHECK(assert_equal(initialEstimate, optimizer.values())); +} + /* ************************************************************************* */ TEST( VisualSLAM, CHECK_ORDERING) diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 6e5109041..3fb213ee7 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -217,6 +218,16 @@ namespace visualSLAM { */ Values optimize(const Values& initialEstimate, size_t verbosity) const; + /** + * Setup and return a LevenbargMarquardtOptimizer + * @param initialEstimate initial estimate of all variables in the graph + * @param parameters optimizer's parameters + * @return a LevenbergMarquardtOptimizer object, which you can use to control the optimization process + */ + LevenbergMarquardtOptimizer optimizer(const Values& initialEstimate, const LevenbergMarquardtParams& parameters = LevenbergMarquardtParams()) const { + return LevenbergMarquardtOptimizer((*this), initialEstimate, parameters); + } + /// Return a Marginals object Marginals marginals(const Values& solution) const { return Marginals(*this,solution); diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index ac25a4328..8e56c00b7 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -61,8 +61,18 @@ for j=1:size(truth.points,2) end initialEstimate.print(sprintf('\nInitial estimate:\n ')); -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,1); +%% One-shot Optimize using Levenberg-Marquardt optimization with an ordering from colamd +%result = graph.optimize(initialEstimate,1); +%result.print(sprintf('\nFinal result:\n ')); + +%% Fine grain optimization, allowing user to iterate step by step + +parameters = gtsamLevenbergMarquardtParams(1e-5, 1e-5, 0, 2); +optimizer = graph.optimizer(initialEstimate, parameters); +for i=1:5 + optimizer.iterate(); +end +result = optimizer.values(); result.print(sprintf('\nFinal result:\n ')); %% Plot results with covariance ellipses From 2c1e30db51742ba78addf8ae64f9744cf20d28b0 Mon Sep 17 00:00:00 2001 From: Florian Hauer Date: Thu, 21 Jun 2012 15:14:13 +0000 Subject: [PATCH 411/914] Fix of the StereoVOExample.m in the matlab examples folder The optimize method at line 65 was missing the second argument --- matlab/examples/StereoVOExample.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index 4553a1f0d..99717fda5 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -56,7 +56,7 @@ initialEstimate.insertPoint(l3, gtsamPoint3( 0,-.5, 5)); %% optimize fprintf(1,'Optimizing\n'); tic -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,1); toc %% visualize initial trajectory, final trajectory, and final points From fcde937b62b2712d458bb218bba9641ac3ed14ab Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 21 Jun 2012 15:29:09 +0000 Subject: [PATCH 412/914] Some ignores only From 282dc6d78811e6f5f2a79fab8ee3d30842b4a844 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 21 Jun 2012 15:46:39 +0000 Subject: [PATCH 413/914] comments and formatting --- gtsam/inference/GenericMultifrontalSolver-inl.h | 12 ++++++++---- gtsam/inference/GenericSequentialSolver-inl.h | 8 ++++---- gtsam/inference/IndexFactor.cpp | 2 +- gtsam/linear/GaussianFactor.h | 4 +++- gtsam/nonlinear/NonlinearISAM.cpp | 3 +++ 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/gtsam/inference/GenericMultifrontalSolver-inl.h b/gtsam/inference/GenericMultifrontalSolver-inl.h index 192436959..db18f2093 100644 --- a/gtsam/inference/GenericMultifrontalSolver-inl.h +++ b/gtsam/inference/GenericMultifrontalSolver-inl.h @@ -47,13 +47,16 @@ namespace gtsam { /* ************************************************************************* */ template - typename BayesTree::shared_ptr GenericMultifrontalSolver::eliminate(Eliminate function) const { + typename BayesTree::shared_ptr + GenericMultifrontalSolver::eliminate(Eliminate function) const { // eliminate junction tree, returns pointer to root - typename BayesTree::sharedClique root = junctionTree_->eliminate(function); + typename BayesTree::sharedClique + root = junctionTree_->eliminate(function); // create an empty Bayes tree and insert root clique - typename BayesTree::shared_ptr bayesTree(new BayesTree); + typename BayesTree::shared_ptr + bayesTree(new BayesTree); bayesTree->insert(root); // return the Bayes tree @@ -65,7 +68,8 @@ namespace gtsam { typename FactorGraph::shared_ptr GenericMultifrontalSolver::jointFactorGraph( const std::vector& js, Eliminate function) const { - // We currently have code written only for computing the + // FIXME: joint for arbitrary sets of variables not present + // TODO: develop and implement theory for shortcuts of more than two variables if (js.size() != 2) throw std::domain_error( "*MultifrontalSolver::joint(js) currently can only compute joint marginals\n" diff --git a/gtsam/inference/GenericSequentialSolver-inl.h b/gtsam/inference/GenericSequentialSolver-inl.h index cc7e6146c..53dee3dcd 100644 --- a/gtsam/inference/GenericSequentialSolver-inl.h +++ b/gtsam/inference/GenericSequentialSolver-inl.h @@ -96,7 +96,7 @@ namespace gtsam { // copies. Other parts of the code may hold shared_ptr's to these factors so // we must undo the permutation before returning. BOOST_FOREACH(const typename boost::shared_ptr& factor, *factors_) - if (factor) factor->permuteWithInverse(*permutationInverse); + if (factor) factor->permuteWithInverse(*permutationInverse); // Eliminate all variables typename BayesNet::shared_ptr @@ -104,20 +104,20 @@ namespace gtsam { // Undo the permuation on the original factors and on the structure. BOOST_FOREACH(const typename boost::shared_ptr& factor, *factors_) - if (factor) factor->permuteWithInverse(*permutation); + if (factor) factor->permuteWithInverse(*permutation); // Take the joint marginal from the Bayes net. sharedFactorGraph joint(new FactorGraph ); joint->reserve(js.size()); typename BayesNet::const_reverse_iterator - conditional = bayesNet->rbegin(); + conditional = bayesNet->rbegin(); for (size_t i = 0; i < js.size(); ++i) joint->push_back((*(conditional++))->toFactor()); // Undo the permutation on the eliminated joint marginal factors BOOST_FOREACH(const typename boost::shared_ptr& factor, *joint) - factor->permuteWithInverse(*permutation); + factor->permuteWithInverse(*permutation); return joint; } diff --git a/gtsam/inference/IndexFactor.cpp b/gtsam/inference/IndexFactor.cpp index f74aa4ff5..b04338d5b 100644 --- a/gtsam/inference/IndexFactor.cpp +++ b/gtsam/inference/IndexFactor.cpp @@ -58,7 +58,7 @@ namespace gtsam { /* ************************************************************************* */ void IndexFactor::permuteWithInverse(const Permutation& inversePermutation) { BOOST_FOREACH(Index& key, keys()) - key = inversePermutation[key]; + key = inversePermutation[key]; assertInvariants(); } /* ************************************************************************* */ diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index e2537b7b4..b1fd9338e 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -107,7 +107,9 @@ namespace gtsam { * to already be inverted. This acts just as a change-of-name for each * variable. The order of the variables within the factor is not changed. */ - virtual void permuteWithInverse(const Permutation& inversePermutation) { IndexFactor::permuteWithInverse(inversePermutation); } + virtual void permuteWithInverse(const Permutation& inversePermutation) { + IndexFactor::permuteWithInverse(inversePermutation); + } private: /** Serialization function */ diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index 6820b3e05..17fba2432 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -53,6 +53,7 @@ void NonlinearISAM::update(const NonlinearFactorGraph& newFactors, linPoint_.insert(initialValues); // Augment ordering + // TODO: allow for ordering constraints within the new variables // FIXME: should just loop over new values BOOST_FOREACH(const NonlinearFactorGraph::sharedFactor& factor, newFactors) BOOST_FOREACH(Key key, factor->keys()) @@ -77,9 +78,11 @@ void NonlinearISAM::reorder_relinearize() { isam_.clear(); // Compute an ordering + // TODO: allow for constrained ordering here ordering_ = *factors_.orderingCOLAMD(newLinPoint); // Create a linear factor graph at the new linearization point + // TODO: decouple relinearization and reordering to avoid boost::shared_ptr gfg = factors_.linearize(newLinPoint, ordering_); // Just recreate the whole BayesTree From 2db389b8cb711be9a16c6836b1c3ae7237255992 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 21 Jun 2012 15:56:22 +0000 Subject: [PATCH 414/914] Fixed EQUALITY to deal with incorrect size --- matlab/EQUALITY.m | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/matlab/EQUALITY.m b/matlab/EQUALITY.m index 114867ac0..a387e1154 100644 --- a/matlab/EQUALITY.m +++ b/matlab/EQUALITY.m @@ -3,12 +3,17 @@ function EQUALITY(name,expected,actual,tol) if nargin<4,tol=1e-9;end -assertion = size(expected)==size(actual); -if assertion - assertion = all(abs(expected-actual) Date: Thu, 21 Jun 2012 17:22:05 +0000 Subject: [PATCH 415/914] moved tensors to ransac library. run cmake! --- gtsam/geometry/Tensor1.h | 85 ------- gtsam/geometry/Tensor1Expression.h | 181 ------------- gtsam/geometry/Tensor2.h | 84 ------ gtsam/geometry/Tensor2Expression.h | 310 ----------------------- gtsam/geometry/Tensor3.h | 106 -------- gtsam/geometry/Tensor3Expression.h | 194 -------------- gtsam/geometry/Tensor4.h | 58 ----- gtsam/geometry/Tensor5.h | 75 ------ gtsam/geometry/Tensor5Expression.h | 135 ---------- gtsam/geometry/projectiveGeometry.cpp | 71 ------ gtsam/geometry/projectiveGeometry.h | 124 --------- gtsam/geometry/tensorInterface.h | 120 --------- gtsam/geometry/tensors.h | 45 ---- gtsam/geometry/tests/testFundamental.cpp | 73 ------ gtsam/geometry/tests/testHomography2.cpp | 188 -------------- gtsam/geometry/tests/testTensors.cpp | 244 ------------------ 16 files changed, 2093 deletions(-) delete mode 100644 gtsam/geometry/Tensor1.h delete mode 100644 gtsam/geometry/Tensor1Expression.h delete mode 100644 gtsam/geometry/Tensor2.h delete mode 100644 gtsam/geometry/Tensor2Expression.h delete mode 100644 gtsam/geometry/Tensor3.h delete mode 100644 gtsam/geometry/Tensor3Expression.h delete mode 100644 gtsam/geometry/Tensor4.h delete mode 100644 gtsam/geometry/Tensor5.h delete mode 100644 gtsam/geometry/Tensor5Expression.h delete mode 100644 gtsam/geometry/projectiveGeometry.cpp delete mode 100644 gtsam/geometry/projectiveGeometry.h delete mode 100644 gtsam/geometry/tensorInterface.h delete mode 100644 gtsam/geometry/tensors.h delete mode 100644 gtsam/geometry/tests/testFundamental.cpp delete mode 100644 gtsam/geometry/tests/testHomography2.cpp delete mode 100644 gtsam/geometry/tests/testTensors.cpp diff --git a/gtsam/geometry/Tensor1.h b/gtsam/geometry/Tensor1.h deleted file mode 100644 index e7dc6bfb3..000000000 --- a/gtsam/geometry/Tensor1.h +++ /dev/null @@ -1,85 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor1.h - * @brief Rank 1 tensors based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author Frank Dellaert - */ - -#pragma once -#include - -namespace tensors { - - /** - * A rank 1 tensor. Actually stores data. - * @addtogroup tensors - * \nosubgrouping - */ - template - class Tensor1 { - double T[N]; ///< Storage - - public: - - /// @name Standard Constructors - /// @{ - - /** default constructor */ - Tensor1() { - } - - /** construct from data */ - Tensor1(const double* data) { - for (int i = 0; i < N; i++) - T[i] = data[i]; - } - - /** construct from expression */ - template - Tensor1(const Tensor1Expression >& a) { - for (int i = 0; i < N; i++) - T[i] = a(i); - } - - /// @} - /// @name Standard Interface - /// @{ - - /** return data */ - inline int dim() const { - return N; - } - - /** return data */ - inline const double& operator()(int i) const { - return T[i]; - } - - /** return data */ - inline double& operator()(int i) { - return T[i]; - } - - /// return an expression associated with an index - template Tensor1Expression > operator()( - Index index) const { - return Tensor1Expression >(*this); - } - - /// @} - - }; -// Tensor1 - -}// namespace tensors diff --git a/gtsam/geometry/Tensor1Expression.h b/gtsam/geometry/Tensor1Expression.h deleted file mode 100644 index 37b5809c8..000000000 --- a/gtsam/geometry/Tensor1Expression.h +++ /dev/null @@ -1,181 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor1Expression.h - * @brief Tensor expression templates based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author Frank Dellaert - */ - -#pragma once - -#include -#include -#include -#include - -namespace tensors { - - /** - * Templated class to provide a rank 1 tensor interface to a class. - * This class does not store any data but the result of an expression. - * It is associated with an index. - * @addtogroup tensors - * \nosubgrouping - */ - template class Tensor1Expression { - - private: - - A iter; - - typedef Tensor1Expression This; - - /** Helper class for multiplying with a double */ - class TimesDouble_ { - A iter; - const double s; - public: - /// Constructor - TimesDouble_(const A &a, double s_) : - iter(a), s(s_) { - } - /// Element access - inline double operator()(int i) const { - return iter(i) * s; - } - }; - - public: - - /// @name Standard Constructors - /// @{ - - /** constructor */ - Tensor1Expression(const A &a) : - iter(a) { - } - - /// @} - /// @name Testable - /// @{ - - /** Print */ - void print(const std::string s = "") const { - std::cout << s << "{"; - std::cout << (*this)(0); - for (int i = 1; i < I::dim; i++) - std::cout << ", "<< (*this)(i); - std::cout << "}" << std::endl; - } - - /// equality - template - bool equals(const Tensor1Expression & q, double tol) const { - for (int i = 0; i < I::dim; i++) - if (fabs((*this)(i) - q(i)) > tol) return false; - return true; - } - - /// @} - /// @name Standard Interface - /// @{ - - /** norm */ - double norm() const { - double sumsqr = 0.0; - for (int i = 0; i < I::dim; i++) - sumsqr += iter(i) * iter(i); - return sqrt(sumsqr); - } - - /// test equivalence - template - bool equivalent(const Tensor1Expression & q, double tol = 1e-9) const { - return ((*this) * (1.0 / norm())).equals(q * (1.0 / q.norm()), tol) - || ((*this) * (-1.0 / norm())).equals(q * (1.0 / q.norm()), tol); - } - - /** Check if two expressions are equal */ - template - bool operator==(const Tensor1Expression& e) const { - for (int i = 0; i < I::dim; i++) - if (iter(i) != e(i)) return false; - return true; - } - - /** element access */ - double operator()(int i) const { - return iter(i); - } - - /** mutliply with a double. */ - inline Tensor1Expression operator*(double s) const { - return TimesDouble_(iter, s); - } - - /** Class for contracting two rank 1 tensor expressions, yielding a double. */ - template - inline double operator*(const Tensor1Expression &b) const { - double sum = 0.0; - for (int i = 0; i < I::dim; i++) - sum += (*this)(i) * b(i); - return sum; - } - - }; // Tensor1Expression - - /// @} - /// @name Advanced Interface - /// @{ - - /** Print a rank 1 expression */ - template - void print(const Tensor1Expression& T, const std::string s = "") { - T.print(s); - } - - /** norm */ - template - double norm(const Tensor1Expression& T) { - return T.norm(); - } - - /** - * This template works for any two expressions - */ - template - bool assert_equality(const Tensor1Expression& expected, - const Tensor1Expression& actual, double tol = 1e-9) { - if (actual.equals(expected, tol)) return true; - std::cout << "Not equal:\n"; - expected.print("expected:\n"); - actual.print("actual:\n"); - return false; - } - - /** - * This template works for any two expressions - */ - template - bool assert_equivalent(const Tensor1Expression& expected, - const Tensor1Expression& actual, double tol = 1e-9) { - if (actual.equivalent(expected, tol)) return true; - std::cout << "Not equal:\n"; - expected.print("expected:\n"); - actual.print("actual:\n"); - return false; - } - - /// @} - -} // namespace tensors diff --git a/gtsam/geometry/Tensor2.h b/gtsam/geometry/Tensor2.h deleted file mode 100644 index 825b57b3e..000000000 --- a/gtsam/geometry/Tensor2.h +++ /dev/null @@ -1,84 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor2.h - * @brief Rank 2 Tensor based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author Frank Dellaert - */ - -#pragma once -#include - -namespace tensors { - -/** - * Rank 2 Tensor - * @addtogroup tensors - * \nosubgrouping - */ -template -class Tensor2 { -protected: - Tensor1 T[N2]; ///< Storage - -public: - - /// @name Standard Constructors - /// @{ - - /** default constructor */ - Tensor2() { - } - - /// construct from data - expressed in row major form - Tensor2(const double data[N2][N1]) { - for (int j = 0; j < N2; j++) - T[j] = Tensor1 (data[j]); - } - - /** construct from expression */ - template - Tensor2(const Tensor2Expression , Index >& a) { - for (int j = 0; j < N2; j++) - T[j] = a(j); - } - - /// @} - /// @name Standard Interface - /// @{ - - /** dimension - TODO: is this right for anything other than 3x3? */ - size_t dim() const {return N1 * N2;} - - /// const element access - const double & operator()(int i, int j) const { - return T[j](i); - } - - /// element access - double & operator()(int i, int j) { - return T[j](i); - } - - /** convert to expression */ - template Tensor2Expression , Index< - N2, J> > operator()(Index i, Index j) const { - return Tensor2Expression , Index > (*this); - } - - /// @} - -}; - -} // namespace tensors - diff --git a/gtsam/geometry/Tensor2Expression.h b/gtsam/geometry/Tensor2Expression.h deleted file mode 100644 index 5b07bad37..000000000 --- a/gtsam/geometry/Tensor2Expression.h +++ /dev/null @@ -1,310 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor2Expression.h - * @brief Tensor expression templates based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author Frank Dellaert - */ - -#pragma once - -#include -#include -#include - -namespace tensors { - - /** - * Templated class to hold a rank 2 tensor expression. - * @addtogroup tensors - * \nosubgrouping - */ - template class Tensor2Expression { - - private: - - A iter; - - typedef Tensor2Expression This; - - /** Helper class for instantiating one index */ - class FixJ_ { - const int j; - const A iter; - public: - FixJ_(int j_, const A &a) : - j(j_), iter(a) { - } - double operator()(int i) const { - return iter(i, j); - } - }; - - /** Helper class for swapping indices */ - class Swap_ { - const A iter; - public: - /// Constructor - Swap_(const A &a) : - iter(a) { - } - /// Element access - double operator()(int j, int i) const { - return iter(i, j); - } - }; - - /** Helper class for multiplying with a double */ - class TimesDouble_ { - A iter; - const double s; - public: - /// Constructor - TimesDouble_(const A &a, double s_) : - iter(a), s(s_) { - } - /// Element access - inline double operator()(int i, int j) const { - return iter(i, j) * s; - } - }; - - /** Helper class for contracting index I with rank 1 tensor */ - template class ITimesRank1_ { - const This a; - const Tensor1Expression b; - public: - /// Constructor - ITimesRank1_(const This &a_, const Tensor1Expression &b_) : - a(a_), b(b_) { - } - /// Element access - double operator()(int j) const { - double sum = 0.0; - for (int i = 0; i < I::dim; i++) - sum += a(i, j) * b(i); - return sum; - } - }; - - /** Helper class for contracting index J with rank 1 tensor */ - template class JTimesRank1_ { - const This a; - const Tensor1Expression b; - public: - /// Constructor - JTimesRank1_(const This &a_, const Tensor1Expression &b_) : - a(a_), b(b_) { - } - /// Element access - double operator()(int i) const { - double sum = 0.0; - for (int j = 0; j < J::dim; j++) - sum += a(i, j) * b(j); - return sum; - } - }; - - /** Helper class for contracting index I with rank 2 tensor */ - template class ITimesRank2_ { - const This a; - const Tensor2Expression b; - public: - /// Constructor - ITimesRank2_(const This &a_, const Tensor2Expression &b_) : - a(a_), b(b_) { - } - /// Element access - double operator()(int j, int k) const { - double sum = 0.0; - for (int i = 0; i < I::dim; i++) - sum += a(i, j) * b(i, k); - return sum; - } - }; - - public: - - /// @name Standard Constructors - /// @{ - - /** constructor */ - Tensor2Expression(const A &a) : - iter(a) { - } - - /// @} - /// @name Testable - /// @{ - - /** Print */ - void print(const std::string& s = "Tensor2:") const { - std::cout << s << "{"; - (*this)(0).print(); - for (int j = 1; j < J::dim; j++) { - std::cout << ","; - (*this)(j).print(""); - } - std::cout << "}" << std::endl; - } - - /// test equality - template - bool equals(const Tensor2Expression & q, double tol) const { - for (int j = 0; j < J::dim; j++) - if (!(*this)(j).equals(q(j), tol)) - return false; - return true; - } - - /// @} - /// @name Standard Interface - /// @{ - - /** norm */ - double norm() const { - double sumsqr = 0.0; - for (int i = 0; i < I::dim; i++) - for (int j = 0; j < J::dim; j++) - sumsqr += iter(i, j) * iter(i, j); - return sqrt(sumsqr); - } - - /// test equivalence - template - bool equivalent(const Tensor2Expression & q, double tol) const { - return ((*this) * (1.0 / norm())).equals(q * (1.0 / q.norm()), tol) - || ((*this) * (-1.0 / norm())).equals(q * (1.0 / q.norm()), tol); - } - - /** element access */ - double operator()(int i, int j) const { - return iter(i, j); - } - - /** swap indices */ - typedef Tensor2Expression Swapped; - /// Return Swap_ helper class - Swapped swap() { - return Swap_(iter); - } - - /** mutliply with a double. */ - inline Tensor2Expression operator*(double s) const { - return TimesDouble_(iter, s); - } - - /** Fix a single index */ - Tensor1Expression operator()(int j) const { - return FixJ_(j, iter); - } - - /** Check if two expressions are equal */ - template - bool operator==(const Tensor2Expression& T) const { - for (int i = 0; i < I::dim; i++) - for (int j = 0; j < J::dim; j++) - if (iter(i, j) != T(i, j)) - return false; - return true; - } - - /// @} - /// @name Advanced Interface - /// @{ - - /** c(j) = a(i,j)*b(i) */ - template - inline Tensor1Expression, J> operator*( - const Tensor1Expression& p) { - return ITimesRank1_(*this, p); - } - - /** c(i) = a(i,j)*b(j) */ - template - inline Tensor1Expression, I> operator*( - const Tensor1Expression &p) { - return JTimesRank1_(*this, p); - } - - /** c(j,k) = a(i,j)*T(i,k) */ - template - inline Tensor2Expression , J, K> operator*( - const Tensor2Expression& p) { - return ITimesRank2_(*this, p); - } - - }; - // Tensor2Expression - - /** Print */ - template - void print(const Tensor2Expression& T, const std::string& s = - "Tensor2:") { - T.print(s); - } - - /** Helper class for multiplying two covariant tensors */ - template class Rank1Rank1_ { - const Tensor1Expression iterA; - const Tensor1Expression iterB; - public: - /// Constructor - Rank1Rank1_(const Tensor1Expression &a, - const Tensor1Expression &b) : - iterA(a), iterB(b) { - } - /// element access - double operator()(int i, int j) const { - return iterA(i) * iterB(j); - } - }; - - /** Multiplying two different indices yields an outer product */ - template - inline Tensor2Expression , I, J> operator*( - const Tensor1Expression &a, const Tensor1Expression &b) { - return Rank1Rank1_(a, b); - } - - /** - * This template works for any two expressions - */ - template - bool assert_equality(const Tensor2Expression& expected, - const Tensor2Expression& actual, double tol = 1e-9) { - if (actual.equals(expected, tol)) - return true; - std::cout << "Not equal:\n"; - expected.print("expected:\n"); - actual.print("actual:\n"); - return false; - } - - /** - * This template works for any two expressions - */ - template - bool assert_equivalent(const Tensor2Expression& expected, - const Tensor2Expression& actual, double tol = 1e-9) { - if (actual.equivalent(expected, tol)) - return true; - std::cout << "Not equivalent:\n"; - expected.print("expected:\n"); - actual.print("actual:\n"); - return false; - } - - /// @} - -} // namespace tensors diff --git a/gtsam/geometry/Tensor3.h b/gtsam/geometry/Tensor3.h deleted file mode 100644 index cfd96f7f6..000000000 --- a/gtsam/geometry/Tensor3.h +++ /dev/null @@ -1,106 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor3.h - * @brief Rank 3 tensors based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author: Frank Dellaert - */ - -#pragma once -#include - -namespace tensors { - - /** - * Rank 3 Tensor - * @addtogroup tensors - * \nosubgrouping - */ - template - class Tensor3 { - Tensor2 T[N3]; ///< Storage - - public: - - /// @name Standard Constructors - /// @{ - - /** default constructor */ - Tensor3() { - } - - /** construct from data */ - Tensor3(const double data[N3][N2][N1]) { - for (int k = 0; k < N3; k++) - T[k] = data[k]; - } - - /// @} - /// @name Advanced Constructors - /// @{ - - /** construct from expression */ - template - Tensor3(const Tensor3Expression , Index , Index >& a) { - for (int k = 0; k < N3; k++) - T[k] = a(k); - } - - /// @} - /// @name Standard Interface - /// @{ - - /// element access - double operator()(int i, int j, int k) const { - return T[k](i, j); - } - - /** convert to expression */ - template Tensor3Expression , - Index , Index > operator()(const Index& i, - const Index& j, const Index& k) { - return Tensor3Expression , Index , Index > (*this); - } - - /** convert to expression */ - template Tensor3Expression , - Index , Index > operator()(const Index& i, - const Index& j, const Index& k) const { - return Tensor3Expression , Index , Index > (*this); - } - }; // Tensor3 - - /** Rank 3 permutation tensor */ - struct Eta3 { - - /** calculate value. TODO: wasteful to actually use this */ - double operator()(int i, int j, int k) const { - return ((j - i) * (k - i) * (k - j)) / 2; - } - - /** create expression */ - template Tensor3Expression , - Index<3, J> , Index<3, K> > operator()(const Index<3, I>& i, - const Index<3, J>& j, const Index<3, K>& k) const { - return Tensor3Expression , Index<3, J> , Index<3, K> > ( - *this); - } - - }; // Eta - - /// @} - -} // namespace tensors diff --git a/gtsam/geometry/Tensor3Expression.h b/gtsam/geometry/Tensor3Expression.h deleted file mode 100644 index b7474bdfb..000000000 --- a/gtsam/geometry/Tensor3Expression.h +++ /dev/null @@ -1,194 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor3Expression.h - * @brief Tensor expression templates based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author Frank Dellaert - */ - -#pragma once - -#include -#include - -namespace tensors { - - /** - * templated class to interface to an object A as a rank 3 tensor - * @addtogroup tensors - * \nosubgrouping - */ - template class Tensor3Expression { - A iter; - - typedef Tensor3Expression This; - - /** Helper class for instantiating one index */ - class FixK_ { - const int k; - const A iter; - public: - FixK_(int k_, const A &a) : - k(k_), iter(a) { - } - double operator()(int i, int j) const { - return iter(i, j, k); - } - }; - - /** Helper class for contracting rank3 and rank1 tensor */ - template class TimesRank1_ { - typedef Tensor1Expression Rank1; - const This T; - const Rank1 t; - public: - TimesRank1_(const This &a, const Rank1 &b) : - T(a), t(b) { - } - double operator()(int j, int k) const { - double sum = 0.0; - for (int i = 0; i < I::dim; i++) - sum += T(i, j, k) * t(i); - return sum; - } - }; - - public: - - /// @name Standard Constructors - /// @{ - - /** constructor */ - Tensor3Expression(const A &a) : - iter(a) { - } - - /// @} - /// @name Standard Interface - /// @{ - - /** Print */ - void print(const std::string& s = "Tensor3:") const { - std::cout << s << "{"; - (*this)(0).print(""); - for (int k = 1; k < K::dim; k++) { - std::cout << ","; - (*this)(k).print(""); - } - std::cout << "}" << std::endl; - } - - /// test equality - template - bool equals(const Tensor3Expression & q, double tol) const { - for (int k = 0; k < K::dim; k++) - if (!(*this)(k).equals(q(k), tol)) return false; - return true; - } - - /** element access */ - double operator()(int i, int j, int k) const { - return iter(i, j, k); - } - - /** Fix a single index */ - Tensor2Expression operator()(int k) const { - return FixK_(k, iter); - } - - /** Contracting with rank1 tensor */ - template - inline Tensor2Expression , J, K> operator*( - const Tensor1Expression &b) const { - return TimesRank1_ (*this, b); - } - - }; // Tensor3Expression - - /// @} - /// @name Advanced Interface - /// @{ - - /** Print */ - template - void print(const Tensor3Expression& T, const std::string& s = - "Tensor3:") { - T.print(s); - } - - /** Helper class for outer product of rank2 and rank1 tensor */ - template - class Rank2Rank1_ { - typedef Tensor2Expression Rank2; - typedef Tensor1Expression Rank1; - const Rank2 iterA; - const Rank1 iterB; - public: - /// Constructor - Rank2Rank1_(const Rank2 &a, const Rank1 &b) : - iterA(a), iterB(b) { - } - /// Element access - double operator()(int i, int j, int k) const { - return iterA(i, j) * iterB(k); - } - }; - - /** outer product of rank2 and rank1 tensor */ - template - inline Tensor3Expression , I, J, K> operator*( - const Tensor2Expression& a, const Tensor1Expression &b) { - return Rank2Rank1_ (a, b); - } - - /** Helper class for outer product of rank1 and rank2 tensor */ - template - class Rank1Rank2_ { - typedef Tensor1Expression Rank1; - typedef Tensor2Expression Rank2; - const Rank1 iterA; - const Rank2 iterB; - public: - /// Constructor - Rank1Rank2_(const Rank1 &a, const Rank2 &b) : - iterA(a), iterB(b) { - } - /// Element access - double operator()(int i, int j, int k) const { - return iterA(i) * iterB(j, k); - } - }; - - /** outer product of rank2 and rank1 tensor */ - template - inline Tensor3Expression , I, J, K> operator*( - const Tensor1Expression& a, const Tensor2Expression &b) { - return Rank1Rank2_ (a, b); - } - - /** - * This template works for any two expressions - */ - template - bool assert_equality(const Tensor3Expression& expected, - const Tensor3Expression& actual, double tol = 1e-9) { - if (actual.equals(expected, tol)) return true; - std::cout << "Not equal:\n"; - expected.print("expected:\n"); - actual.print("actual:\n"); - return false; - } - - /// @} - -} // namespace tensors diff --git a/gtsam/geometry/Tensor4.h b/gtsam/geometry/Tensor4.h deleted file mode 100644 index e8bfb0186..000000000 --- a/gtsam/geometry/Tensor4.h +++ /dev/null @@ -1,58 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor4.h - * @brief Rank 4 tensors based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 12, 2010 - * @author Frank Dellaert - */ - -#pragma once -#include - -namespace tensors { - - /** - * Rank 4 Tensor - * @addtogroup tensors - * \nosubgrouping - */ - template - class Tensor4 { - - private: - - Tensor3 T[N4]; ///< Storage - - public: - - /// @name Standard Constructors - /// @{ - - /** default constructor */ - Tensor4() { - } - - /// @} - /// @name Standard Interface - /// @{ - - /// element access - double operator()(int i, int j, int k, int l) const { - return T[l](i, j, k); - } - - /// @} - - }; // Tensor4 - -} // namespace tensors diff --git a/gtsam/geometry/Tensor5.h b/gtsam/geometry/Tensor5.h deleted file mode 100644 index a19784d84..000000000 --- a/gtsam/geometry/Tensor5.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor5.h - * @brief Rank 5 tensors based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 12, 2010 - * @author Frank Dellaert - */ - -#pragma once -#include - -namespace tensors { - - /** - * Rank 5 Tensor - * @addtogroup tensors - * \nosubgrouping - */ - template - class Tensor5 { - - private: - - Tensor4 T[N5]; ///< Storage - - public: - - /// @name Standard Constructors - /// @{ - - /** default constructor */ - Tensor5() { - } - - /// @} - /// @name Standard Interface - /// @{ - - /** construct from expression */ - template - Tensor5(const Tensor5Expression , Index , Index , Index , Index >& a) { - for (int m = 0; m < N5; m++) - T[m] = a(m); - } - - /// element access - double operator()(int i, int j, int k, int l, int m) const { - return T[m](i, j, k, l); - } - - /** convert to expression */ - template Tensor5Expression , Index , Index , Index , - Index > operator()(Index i, Index j, - Index k, Index l, Index m) { - return Tensor5Expression , Index , Index , Index , Index > (*this); - } - - /// @} - - }; // Tensor5 - -} // namespace tensors diff --git a/gtsam/geometry/Tensor5Expression.h b/gtsam/geometry/Tensor5Expression.h deleted file mode 100644 index 6a6018e22..000000000 --- a/gtsam/geometry/Tensor5Expression.h +++ /dev/null @@ -1,135 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Tensor5Expression.h - * @brief Tensor expression templates based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author Frank Dellaert - */ - -#pragma once - -#include -#include - -namespace tensors { - - /** - * templated class to interface to an object A as a rank 5 tensor - * @addtogroup tensors - * \nosubgrouping - */ - template class Tensor5Expression { - A iter; - - typedef Tensor5Expression This; - - /** Helper class for swapping indices 3 and 4 :-) */ - class Swap34_ { - const A iter; - public: - /// Constructor - Swap34_(const A &a) : - iter(a) { - } - /// swapping element access - double operator()(int i, int j, int k, int l, int m) const { - return iter(i, j, l, k, m); - } - }; - - public: - - /// @name Standard Constructors - /// @{ - - /** constructor */ - Tensor5Expression(const A &a) : - iter(a) { - } - - /// @} - /// @name Standard Interface - /// @{ - - /** Print */ - void print(const std::string& s = "Tensor5:") const { - std::cout << s << std::endl; - for (int m = 0; m < M::dim; m++) - for (int l = 0; l < L::dim; l++) - for (int k = 0; k < K::dim; k++) { - std::cout << "(m,l,k) = (" << m << "," << l << "," << k << ")" - << std::endl; - for (int j = 0; j < J::dim; j++) { - for (int i = 0; i < I::dim; i++) - std::cout << " " << (*this)(i, j, k, l, m); - std::cout << std::endl; - } - } - std::cout << std::endl; - } - - /** swap indices */ - typedef Tensor5Expression Swapped; - /// create Swap34_ helper class - Swapped swap34() { - return Swap34_(iter); - } - - /** element access */ - double operator()(int i, int j, int k, int l, int m) const { - return iter(i, j, k, l, m); - } - - }; - // Tensor5Expression - - /// @} - /// @name Advanced Interface - /// @{ - - /** Print */ - template - void print(const Tensor5Expression& T, - const std::string& s = "Tensor5:") { - T.print(s); - } - - /** Helper class for outer product of rank3 and rank2 tensor */ - template - class Rank3Rank2_ { - typedef Tensor3Expression Rank3; - typedef Tensor2Expression Rank2; - const Rank3 iterA; - const Rank2 iterB; - public: - /// Constructor - Rank3Rank2_(const Rank3 &a, const Rank2 &b) : - iterA(a), iterB(b) { - } - /// Element access - double operator()(int i, int j, int k, int l, int m) const { - return iterA(i, j, k) * iterB(l, m); - } - }; - - /** outer product of rank2 and rank1 tensor */ - template - inline Tensor5Expression , I, J, K, L, M> operator*( - const Tensor3Expression& a, - const Tensor2Expression &b) { - return Rank3Rank2_(a, b); - } - - /// @} - -} // namespace tensors diff --git a/gtsam/geometry/projectiveGeometry.cpp b/gtsam/geometry/projectiveGeometry.cpp deleted file mode 100644 index 31c975c43..000000000 --- a/gtsam/geometry/projectiveGeometry.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 projectiveGeometry.cpp - * @brief Projective geometry, implemented using tensor library - * @date Feb 12, 2010 - * @author: Frank Dellaert - */ - -#include -#include - -#include -#include - -namespace gtsam { - - using namespace std; - using namespace tensors; - - /* ************************************************************************* */ - Point2h point2h(double x, double y, double w) { - double data[3]; - data[0] = x; - data[1] = y; - data[2] = w; - return data; - } - - /* ************************************************************************* */ - Line2h line2h(double a, double b, double c) { - double data[3]; - data[0] = a; - data[1] = b; - data[2] = c; - return data; - } - - /* ************************************************************************* */ - Point3h point3h(double X, double Y, double Z, double W) { - double data[4]; - data[0] = X; - data[1] = Y; - data[2] = Z; - data[3] = W; - return data; - } - - /* ************************************************************************* */ - Plane3h plane3h(double a, double b, double c, double d) { - double data[4]; - data[0] = a; - data[1] = b; - data[2] = c; - data[3] = d; - return data; - } - - - /* ************************************************************************* */ - -} // namespace gtsam diff --git a/gtsam/geometry/projectiveGeometry.h b/gtsam/geometry/projectiveGeometry.h deleted file mode 100644 index 2be02a349..000000000 --- a/gtsam/geometry/projectiveGeometry.h +++ /dev/null @@ -1,124 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 projectiveGeometry.h - * @brief Projective geometry, implemented using tensor library - * @date Feb 12, 2010 - * @author Frank Dellaert - */ - -#pragma once - -#include -#include - -namespace gtsam { - - /** - * 2D Point in homogeneous coordinates - * @addtogroup geometry - */ - typedef tensors::Tensor1<3> Point2h; - Point2h point2h(double x, double y, double w); ///< create Point2h - - /** - * 2D Line in homogeneous coordinates - * @addtogroup geometry - */ - typedef tensors::Tensor1<3> Line2h; - Line2h line2h(double a, double b, double c); ///< create Line2h - - /** - * 2D (homegeneous) Point correspondence - * @addtogroup geometry - */ - struct Correspondence { - Point2h first; ///< First point - Point2h second; ///< Second point - - /// Create a correspondence pair - Correspondence(const Point2h &p1, const Point2h &p2) : - first(p1), second(p2) { - } - /// Swap points - Correspondence swap() const { - return Correspondence(second, first); - } - /// print - void print() { - tensors::Index<3, 'i'> i; - tensors::print(first(i), "first :"); - tensors::print(second(i), "second:"); - } - }; - - /** - * 2D-2D Homography - * @addtogroup geometry - */ - typedef tensors::Tensor2<3, 3> Homography2; - - /** - * Fundamental Matrix - * @addtogroup geometry - */ - typedef tensors::Tensor2<3, 3> FundamentalMatrix; - - /** - * Triplet of (homogeneous) 2D points - * @addtogroup geometry - */ - struct Triplet { - Point2h first; ///< First point - Point2h second; ///< Second point - Point2h third; ///< Third point - - /// Create a Triplet correspondence - Triplet(const Point2h &p1, const Point2h &p2, const Point2h &p3) : - first(p1), second(p2), third(p3) { - } - /// print - void print() { - tensors::Index<3, 'i'> i; - tensors::print(first(i), "first :"); - tensors::print(second(i), "second:"); - tensors::print(third(i), "third :"); - } - }; - - /** - * Trifocal Tensor - * @addtogroup geometry - */ - typedef tensors::Tensor3<3, 3, 3> TrifocalTensor; - - /** - * 3D Point in homogeneous coordinates - * @addtogroup geometry - */ - typedef tensors::Tensor1<4> Point3h; - Point3h point3h(double X, double Y, double Z, double W); ///< create Point3h - - /** - * 3D Plane in homogeneous coordinates - * @addtogroup geometry - */ - typedef tensors::Tensor1<4> Plane3h; - Plane3h plane3h(double a, double b, double c, double d); ///< create Plane3h - - /** - * 3D to 2D projective camera - * @addtogroup geometry - */ - typedef tensors::Tensor2<3, 4> ProjectiveCamera; - -} // namespace gtsam diff --git a/gtsam/geometry/tensorInterface.h b/gtsam/geometry/tensorInterface.h deleted file mode 100644 index 7a2c144d7..000000000 --- a/gtsam/geometry/tensorInterface.h +++ /dev/null @@ -1,120 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 tensorInterface.h - * @brief Interfacing tensors template library and gtsam - * @date Feb 12, 2010 - * @author Frank Dellaert - */ - -#pragma once - -#include -#include - -namespace gtsam { - - /** Reshape rank 2 tensor into Matrix */ - template - Matrix reshape(const tensors::Tensor2Expression& T, int m, int n) { - if (m * n != I::dim * J::dim) throw std::invalid_argument( - "reshape: incompatible dimensions"); - MatrixRowMajor M(m, n); - size_t t = 0; - for (int j = 0; j < J::dim; j++) - for (int i = 0; i < I::dim; i++) - M.data()[t++] = T(i, j); - return Matrix(M); - } - - /** Reshape rank 2 tensor into Vector */ - template - Vector toVector(const tensors::Tensor2Expression& T) { - Vector v(I::dim * J::dim); - size_t t = 0; - for (int j = 0; j < J::dim; j++) - for (int i = 0; i < I::dim; i++) - v(t++) = T(i, j); - return v; - } - - /** Reshape Vector into rank 2 tensor */ - template - tensors::Tensor2 reshape2(const Vector& v) { - if (v.size() != N1 * N2) throw std::invalid_argument( - "reshape2: incompatible dimensions"); - double data[N2][N1]; - int t = 0; - for (int j = 0; j < N2; j++) - for (int i = 0; i < N1; i++) - data[j][i] = v(t++); - return tensors::Tensor2(data); - } - - /** Reshape Matrix into rank 2 tensor */ - template - tensors::Tensor2 reshape2matrix(const Matrix& m) { - if (m.rows() * m.cols() != N1 * N2) throw std::invalid_argument( - "reshape2: incompatible dimensions"); - double data[N2][N1]; - for (int j = 0; j < N2; j++) - for (int i = 0; i < N1; i++) - data[j][i] = m(j,i); - return tensors::Tensor2(data); - } - - /** Reshape rank 3 tensor into Matrix */ - template - Matrix reshape(const tensors::Tensor3Expression& T, int m, int n) { - if (m * n != I::dim * J::dim * K::dim) throw std::invalid_argument( - "reshape: incompatible dimensions"); - Matrix M(m, n); - int t = 0; - for (int k = 0; k < K::dim; k++) - for (int i = 0; i < I::dim; i++) - for (int j = 0; j < J::dim; j++) - M.data()[t++] = T(i, j, k); - return M; - } - - /** Reshape Vector into rank 3 tensor */ - template - tensors::Tensor3 reshape3(const Vector& v) { - if (v.size() != N1 * N2 * N3) throw std::invalid_argument( - "reshape3: incompatible dimensions"); - double data[N3][N2][N1]; - int t = 0; - for (int k = 0; k < N3; k++) - for (int j = 0; j < N2; j++) - for (int i = 0; i < N1; i++) - data[k][j][i] = v(t++); - return tensors::Tensor3(data); - } - - /** Reshape rank 5 tensor into Matrix */ - template - Matrix reshape(const tensors::Tensor5Expression& T, int m, - int n) { - if (m * n != I::dim * J::dim * K::dim * L::dim * M::dim) throw std::invalid_argument( - "reshape: incompatible dimensions"); - Matrix R(m, n); - int t = 0; - for (int m = 0; m < M::dim; m++) - for (int l = 0; l < L::dim; l++) - for (int k = 0; k < K::dim; k++) - for (int i = 0; i < I::dim; i++) - for (int j = 0; j < J::dim; j++) - R.data()[t++] = T(i, j, k, l, m); - return R; - } - -} // namespace gtsam diff --git a/gtsam/geometry/tensors.h b/gtsam/geometry/tensors.h deleted file mode 100644 index a7125775a..000000000 --- a/gtsam/geometry/tensors.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 tensors.h - * @brief Tensor expression templates based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 10, 2010 - * @author Frank Dellaert - * @addtogroup tensors - */ - -#pragma once - -namespace tensors { - - /** index */ - template struct Index { - static const int dim = Dim; ///< dimension - }; - -} // namespace tensors - -// Expression templates -#include -#include -#include -// Tensor4 not needed so far -#include - -// Actual tensor classes -#include -#include -#include -#include -#include - - diff --git a/gtsam/geometry/tests/testFundamental.cpp b/gtsam/geometry/tests/testFundamental.cpp deleted file mode 100644 index c233cbfd0..000000000 --- a/gtsam/geometry/tests/testFundamental.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testFundamental.cpp - * @brief try tensor expressions based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 13, 2010 - * @author: Frank Dellaert - */ - -#include -#include -#include // for operator += -using namespace boost::assign; - -#include - -#include -#include -#include - -using namespace std; -using namespace gtsam; -using namespace tensors; - -/* ************************************************************************* */ -// Indices - -static tensors::Index<3, 'a'> a; -static tensors::Index<3, 'b'> b; - -static tensors::Index<4, 'A'> A; -static tensors::Index<4, 'B'> B; - -/* ************************************************************************* */ -TEST( Tensors, FundamentalMatrix) -{ - double f[3][3] = { { 1, 0, 0 }, { 1, 2, 3 }, { 1, 2, 3 } }; - FundamentalMatrix F(f); - - Point2h p = point2h(1, 2, 3); // point p in view one - Point2h q = point2h(14, -1, 0); // point q in view two - - // points p and q are in correspondence - CHECK(F(a,b)*p(a)*q(b) == 0) - - // in detail, l1(b)*q(b)==0 - Line2h l1 = line2h(1, 14, 14); - CHECK(F(a,b)*p(a) == l1(b)) - CHECK(l1(b)*q(b) == 0); // q is on line l1 - - // and l2(a)*p(a)==0 - Line2h l2 = line2h(13, -2, -3); - CHECK(F(a,b)*q(b) == l2(a)) - CHECK(l2(a)*p(a) == 0); // p is on line l2 -} - - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ - diff --git a/gtsam/geometry/tests/testHomography2.cpp b/gtsam/geometry/tests/testHomography2.cpp deleted file mode 100644 index 85681baa4..000000000 --- a/gtsam/geometry/tests/testHomography2.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testHomography2.cpp - * @brief Test and estimate 2D homographies - * @date Feb 13, 2010 - * @author Frank Dellaert - */ - -#include -#include -#include // for operator += -using namespace boost::assign; - -#include - -#include -#include -#include -#include -#include - -using namespace std; -using namespace gtsam; -using namespace tensors; - -/* ************************************************************************* */ -// Indices - -static tensors::Index<3, 'a'> a, _a; -static tensors::Index<3, 'b'> b, _b; -static tensors::Index<3, 'c'> c, _c; - -/* ************************************************************************* */ -TEST( Homography2, RealImages) -{ - // 4 point correspondences MATLAB from the floor of bt001.png and bt002.png - Correspondence p1(point2h(216.841, 443.220, 1), point2h(213.528, 414.671, 1)); - Correspondence p2(point2h(252.119, 363.481, 1), point2h(244.614, 348.842, 1)); - Correspondence p3(point2h(316.614, 414.768, 1), point2h(303.128, 390.000, 1)); - Correspondence p4(point2h(324.165, 465.463, 1), point2h(308.614, 431.129, 1)); - - // Homography obtained using MATLAB code - double h[3][3] = { { 0.9075, 0.0031, -0 }, { -0.1165, 0.8288, -0.0004 }, { - 30.8472, 16.0449, 1 } }; - Homography2 H(h); - - // CHECK whether they are equivalent - CHECK(assert_equivalent(p1.second(b),H(b,a)*p1.first(a),0.05)) - CHECK(assert_equivalent(p2.second(b),H(b,a)*p2.first(a),0.05)) - CHECK(assert_equivalent(p3.second(b),H(b,a)*p3.first(a),0.05)) - CHECK(assert_equivalent(p4.second(b),H(b,a)*p4.first(a),0.05)) -} - -/* ************************************************************************* */ -// Homography test case -// 4 trivial correspondences of a translating square -Correspondence p1(point2h(0, 0, 1), point2h(4, 5, 1)); -Correspondence p2(point2h(1, 0, 1), point2h(5, 5, 1)); -Correspondence p3(point2h(1, 1, 1), point2h(5, 6, 1)); -Correspondence p4(point2h(0, 1, 1), point2h(4, 6, 1)); - -double h[3][3] = { { 1, 0, 4 }, { 0, 1, 5 }, { 0, 0, 1 } }; -Homography2 H(h); - -/* ************************************************************************* */ -TEST( Homography2, TestCase) -{ - // Check homography - list correspondences; - correspondences += p1, p2, p3, p4; - BOOST_FOREACH(const Correspondence& p, correspondences) - CHECK(assert_equality(p.second(b),H(_a,b) * p.first(a))) - - // Check a line - Line2h l1 = line2h(1, 0, -1); // in a - Line2h l2 = line2h(1, 0, -5); // x==5 in b - CHECK(assert_equality(l1(a), H(a,b)*l2(b))) -} - -/* ************************************************************************* */ -/** - * Computes the homography H(I,_T) from template to image - * given the pose tEc of the camera in the template coordinate frame. - * Assumption is Z is normal to the template, template texture in X-Y plane. - */ -Homography2 patchH(const Pose3& tEc) { - Pose3 cEt = tEc.inverse(); - Rot3 cRt = cEt.rotation(); - Point3 r1 = cRt.r1(), r2 = cRt.r2(), t = cEt.translation(); - - // TODO cleanup !!!! - // column 1 - double H11 = r1.x(); - double H21 = r1.y(); - double H31 = r1.z(); - // column 2 - double H12 = r2.x(); - double H22 = r2.y(); - double H32 = r2.z(); - // column 3 - double H13 = t.x(); - double H23 = t.y(); - double H33 = t.z(); - double data2[3][3] = { { H11, H21, H31 }, { H12, H22, H32 }, - { H13, H23, H33 } }; - return Homography2(data2); -} - -/* ************************************************************************* */ -namespace gtsam { -// size_t dim(const tensors::Tensor2<3, 3>& H) {return 9;} - Vector toVector(const tensors::Tensor2<3, 3>& H) { - tensors::Index<3, 'T'> _T; // covariant 2D template - tensors::Index<3, 'C'> I; // contravariant 2D camera - return toVector(H(I,_T)); - } - Vector localCoordinates(const tensors::Tensor2<3, 3>& A, const tensors::Tensor2<3, 3>& B) { - return toVector(A)-toVector(B); // TODO correct order ? - } -} - -#include - -/* ************************************************************************* */ -TEST( Homography2, patchH) -{ - tensors::Index<3, 'T'> _T; // covariant 2D template - tensors::Index<3, 'C'> I; // contravariant 2D camera - - // data[_T][I] - double data1[3][3] = {{1,0,0},{0,-1,0},{0,0,10}}; - Homography2 expected(data1); - - // camera rotation, looking in negative Z - Rot3 gRc(Point3(1,0,0),Point3(0,-1,0),Point3(0,0,-1)); - Point3 gTc(0,0,10); // Camera location, out on the Z axis - Pose3 gEc(gRc,gTc); // Camera pose - - Homography2 actual = patchH(gEc); - -// GTSAM_PRINT(expected(I,_T)); -// GTSAM_PRINT(actual(I,_T)); - CHECK(assert_equality(expected(I,_T),actual(I,_T))); - - // FIXME: this doesn't appear to be tested, and requires that Tensor2 be a Lie object -// Matrix D = numericalDerivative11(patchH, gEc); -// print(D,"D"); -} - -/* ************************************************************************* */ -TEST( Homography2, patchH2) -{ - tensors::Index<3, 'T'> _T; // covariant 2D template - tensors::Index<3, 'C'> I; // contravariant 2D camera - - // data[_T][I] - double data1[3][3] = {{1,0,0},{0,-1,0},{0,0,10}}; - Homography2 expected(data1); - - // camera rotation, looking in negative Z - Rot3 gRc(Point3(1,0,0),Point3(0,-1,0),Point3(0,0,-1)); - Point3 gTc(0,0,10); // Camera location, out on the Z axis - Pose3 gEc(gRc,gTc); // Camera pose - - Homography2 actual = patchH(gEc); - -// GTSAM_PRINT(expected(I,_T)); -// GTSAM_PRINT(actual(I,_T)); - CHECK(assert_equality(expected(I,_T),actual(I,_T))); -} - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ - diff --git a/gtsam/geometry/tests/testTensors.cpp b/gtsam/geometry/tests/testTensors.cpp deleted file mode 100644 index 0e1c381cf..000000000 --- a/gtsam/geometry/tests/testTensors.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testTensors.cpp - * @brief try tensor expressions based on http://www.gps.caltech.edu/~walter/FTensor/FTensor.pdf - * @date Feb 9, 2010 - * @author Frank Dellaert - */ - -#include -#include -#include // for operator += -using namespace boost::assign; - -#include - -#include -#include -#include - -using namespace std; -using namespace gtsam; -using namespace tensors; - -/* ************************************************************************* */ -// Indices - -tensors::Index<3, 'a'> a, _a; -tensors::Index<3, 'b'> b, _b; -tensors::Index<3, 'c'> c, _c; - -tensors::Index<4, 'A'> A; -tensors::Index<4, 'B'> B; - -/* ************************************************************************* */ -// Tensor1 -/* ************************************************************************* */ -TEST(Tensor1, Basics) -{ - // you can create 1-tensors corresponding to 2D homogeneous points - // using the function point2h in projectiveGeometry.* - Point2h p = point2h(1, 2, 3), q = point2h(2, 4, 6); - - // equality tests always take tensor expressions, not tensors themselves - // the difference is that a tensor expression has indices - CHECK(p(a)==p(a)) - CHECK(assert_equality(p(a),p(a))) - CHECK(assert_equality(p(a)*2,q(a))) - CHECK(assert_equivalent(p(a),q(a))) // projectively equivalent - - // and you can take a norm, typically for normalization to the sphere - DOUBLES_EQUAL(sqrt(14.0),norm(p(a)),1e-9) -} - -/* ************************************************************************* */ -TEST( Tensor1, Incidence2D) -{ - // 2D lines are created with line2h - Line2h l = line2h(-13, 5, 1); - Point2h p = point2h(1, 2, 3), q = point2h(2, 5, 1); - - // Incidence between a line and a point is checked with simple contraction - // It does not matter which index you use, but it has to be of dimension 3 - DOUBLES_EQUAL(l(a)*p(a),0,1e-9) - DOUBLES_EQUAL(l(b)*q(b),0,1e-9) - DOUBLES_EQUAL(p(a)*l(a),0,1e-9) - DOUBLES_EQUAL(q(a)*l(a),0,1e-9) -} - -/* ************************************************************************* */ -TEST( Tensor1, Incidence3D) -{ - // similar constructs exist for 3D points and planes - Plane3h pi = plane3h(0, 1, 0, -2); - Point3h P = point3h(0, 2, 0, 1), Q = point3h(1, 2, 0, 1); - - // Incidence is checked similarly - DOUBLES_EQUAL(pi(A)*P(A),0,1e-9) - DOUBLES_EQUAL(pi(A)*Q(A),0,1e-9) - DOUBLES_EQUAL(P(A)*pi(A),0,1e-9) - DOUBLES_EQUAL(Q(A)*pi(A),0,1e-9) -} - -/* ************************************************************************* */ -// Tensor2 -/* ************************************************************************* */ -TEST( Tensor2, Outer33) -{ - Line2h l1 = line2h(1, 2, 3), l2 = line2h(1, 3, 5); - - // We can also create tensors directly from data - double data[3][3] = { { 1, 2, 3 }, { 3, 6, 9 }, {5, 10, 15} }; - Tensor2<3, 3> expected(data); - // in this case expected(0) == {1,2,3} - Line2h l0 = expected(a,b)(0); - CHECK(l0(a) == l1(a)) - - // And we create rank 2 tensors from the outer product of two rank 1 tensors - CHECK(expected(a,b) == l1(a) * l2(b)) - - // swap just swaps how you access a tensor, but note the data is the same - CHECK(assert_equality(expected(a,b).swap(), l2(b) * l1(a))); -} - -/* ************************************************************************* */ -TEST( Tensor2, AnotherOuter33) -{ - // first cube point from testFundamental, projected in left and right -// Point2h p = point2h(0, -1, 2), q = point2h(-2, -1, 2); -// print(p(a)*q(b)); -// print(p(b)*q(a)); -// print(q(a)*p(b)); -// print(q(b)*p(a)); -} - -/* ************************************************************************* */ -TEST( Tensor2, Outer34) -{ - Line2h l = line2h(1, 2, 3); - Plane3h pi = plane3h(1, 3, 5, 7); - double - data[4][3] = { { 1, 2, 3 }, { 3, 6, 9 }, { 5, 10, 15 }, { 7, 14, 21 } }; - Tensor2<3, 4> expected(data); - CHECK(assert_equality(expected(a,B),l(a) * pi(B))) - CHECK(assert_equality(expected(a,B).swap(),pi(B) * l(a))) -} - -/* ************************************************************************* */ -TEST( Tensor2, SpecialContract) -{ - double data[3][3] = { { 1, 2, 3 }, { 2, 4, 6 }, { 3, 6, 9 } }; - Tensor2<3, 3> S(data), T(data); - //print(S(a, b) * T(a, c)); // contract a -> b,c - // S(a,0)*T(a,0) = [1 2 3] . [1 2 3] = 14 - // S(a,0)*T(a,2) = [1 2 3] . [3 6 9] = 3+12+27 = 42 - double data2[3][3] = { { 14, 28, 42 }, { 28, 56, 84 }, { 42, 84, 126 } }; - Tensor2<3, 3> expected(data2); - CHECK(assert_equality(expected(b,c), S(a, b) * T(a, c))); -} - -/* ************************************************************************* */ -TEST( Tensor2, ProjectiveCamera) -{ - Point2h p = point2h(1 + 2, 2, 5); - Point3h P = point3h(1, 2, 5, 1); - double data[4][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { 2, 0, 0 } }; - ProjectiveCamera M(data); - CHECK(assert_equality(p(a),M(a,A)*P(A))) -} - -/* ************************************************************************* */ -namespace camera { - // to specify the tensor M(a,A), we need to give four 2D points - double data[4][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }; - ProjectiveCamera M(data); - Matrix matrix = Matrix_(4,3,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.); - Vector vector = Vector_( 12,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.); -} - -/* ************************************************************************* */ -TEST( Tensor2, reshape ) -{ - // it is annoying that a camera can only be reshaped to a 4*3 -// print(camera::M(a,A)); - Matrix actual = reshape(camera::M(a,A),4,3); - EQUALITY(camera::matrix,actual); -} - -/* ************************************************************************* */ -TEST( Tensor2, toVector ) -{ - // Vectors are created with the leftmost indices iterating the fastest - Vector actual = toVector(camera::M(a,A)); - CHECK(assert_equal(camera::vector,actual)); -} - -/* ************************************************************************* */ -TEST( Tensor2, reshape2 ) -{ - Tensor2<3,4> actual = reshape2<3,4>(camera::vector); - CHECK(assert_equality(camera::M(a,A),actual(a,A))); - - // reshape Matrix to rank 2 tensor - Tensor2<3,4> actual_m = reshape2matrix<3,4>(camera::matrix); - CHECK(assert_equality(camera::M(a,A), actual_m(a,A))); -} - -/* ************************************************************************* */ -TEST( Tensor2, reshape_33_to_9 ) -{ - double data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; - FundamentalMatrix F(data); - Matrix matrix = Matrix_(1,9,1.,2.,3.,4.,5.,6.,7.,8.,9.); - Matrix actual = reshape(F(a,b),1,9); - EQUALITY(matrix,actual); - Vector v = Vector_( 9,1.,2.,3.,4.,5.,6.,7.,8.,9.); - CHECK(assert_equality(F(a,b),reshape2<3, 3> (v)(a,b))); -} - -/* ************************************************************************* */ -// Tensor3 -/* ************************************************************************* */ -TEST( Tensor3, Join) -{ - Line2h l = line2h(-13, 5, 1); - Point2h p = point2h(1, 2, 3), q = point2h(2, 5, 1); - - // join points into line - Eta3 e; - CHECK(assert_equality(e(a, b, c) * p(a) * q(b), l(c))) -} - -/* ************************************************************************* */ -TEST( Tensor5, Outer32) -{ - double t[3][3][3] = { { { 0, 0, 3 }, { 0, 8, -125 }, { -3, 125, 1 } }, { { 0, - 0, 3 }, { 0, 8, -125 }, { -3, 125, 1 } }, { { 0, 0, 3 }, { 0, 8, -125 }, - { -3, 125, 1 } } }; - TrifocalTensor T(t); - - double data[3][3] = { { 0, 0, 3 }, { 0, 8, -125 }, { -3, 125, 1 } }; - FundamentalMatrix F(data); - - //Index<3, 'd'> d, _d; - //Index<3, 'e'> e, _e; - //print(T(_a,b,c)*F(_d,_e)); -} - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ - From c8a623a1acba2bdb547f9ccf3ea9d5e0c5653ab1 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 21 Jun 2012 17:44:18 +0000 Subject: [PATCH 416/914] Improved interface for Sampler to allow alternate usage with noiseModels, removed references to SharedDiagonal --- gtsam/linear/Sampler.cpp | 33 ++++++++++++++++++++++++------ gtsam/linear/Sampler.h | 33 ++++++++++++++++++++++++------ gtsam/linear/tests/testSampler.cpp | 2 +- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/gtsam/linear/Sampler.cpp b/gtsam/linear/Sampler.cpp index 058533104..f69cfdae6 100644 --- a/gtsam/linear/Sampler.cpp +++ b/gtsam/linear/Sampler.cpp @@ -22,23 +22,29 @@ namespace gtsam { /* ************************************************************************* */ -Sampler::Sampler(const SharedDiagonal& model, int32_t seed) - : sigmas_(model->sigmas()), generator_(static_cast(seed)) +Sampler::Sampler(const noiseModel::Diagonal::shared_ptr& model, int32_t seed) + : model_(model), generator_(static_cast(seed)) { } /* ************************************************************************* */ Sampler::Sampler(const Vector& sigmas, int32_t seed) - : sigmas_(sigmas), generator_(static_cast(seed)) +: model_(noiseModel::Diagonal::Sigmas(sigmas, true)), generator_(static_cast(seed)) { } /* ************************************************************************* */ -Vector Sampler::sample() { - size_t d = dim(); +Sampler::Sampler(int32_t seed) +: generator_(static_cast(seed)) +{ +} + +/* ************************************************************************* */ +Vector Sampler::sampleDiagonal(const Vector& sigmas) { + size_t d = sigmas.size(); Vector result(d); for (size_t i = 0; i < d; i++) { - double sigma = sigmas_(i); + double sigma = sigmas(i); // handle constrained case separately if (sigma == 0.0) { @@ -53,4 +59,19 @@ Vector Sampler::sample() { return result; } +/* ************************************************************************* */ +Vector Sampler::sample() { + assert(model_.get()); + const Vector& sigmas = model_->sigmas(); + return sampleDiagonal(sigmas); +} + +/* ************************************************************************* */ +Vector Sampler::sample(const noiseModel::Diagonal::shared_ptr& model) { + assert(model.get()); + const Vector& sigmas = model->sigmas(); + return sampleDiagonal(sigmas); +} +/* ************************************************************************* */ + } // \namespace gtsam diff --git a/gtsam/linear/Sampler.h b/gtsam/linear/Sampler.h index 53b59a9ea..1150f5d55 100644 --- a/gtsam/linear/Sampler.h +++ b/gtsam/linear/Sampler.h @@ -18,7 +18,7 @@ #pragma once -#include +#include namespace gtsam { @@ -31,8 +31,8 @@ namespace gtsam { */ class Sampler { protected: - /** sigmas from the noise model */ - Vector sigmas_; + /** noiseModel created at generation */ + noiseModel::Diagonal::shared_ptr model_; /** generator */ boost::minstd_rand generator_; @@ -46,7 +46,7 @@ public: * * NOTE: do not use zero as a seed, it will break the generator */ - Sampler(const SharedDiagonal& model, int32_t seed = 42u); + Sampler(const noiseModel::Diagonal::shared_ptr& model, int32_t seed = 42u); /** * Create a sampler for a distribution specified by a vector of sigmas directly @@ -55,9 +55,17 @@ public: */ Sampler(const Vector& sigmas, int32_t seed = 42u); + /** + * Create a sampler without a given noisemodel - pass in to sample + * + * NOTE: do not use zero as a seed, it will break the generator + */ + Sampler(int32_t seed = 42u); + /** access functions */ - size_t dim() const { return sigmas_.size(); } - Vector sigmas() const { return sigmas_; } + size_t dim() const { assert(model_.get()); return model_->dim(); } + Vector sigmas() const { assert(model_.get()); return model_->sigmas(); } + const noiseModel::Diagonal::shared_ptr& model() const { return model_; } /** * sample from distribution @@ -65,6 +73,19 @@ public: */ Vector sample(); + /** + * Sample from noisemodel passed in as an argument, + * can be used without having initialized a model for the system. + * + * NOTE: not const due to need to update the underlying generator + */ + Vector sample(const noiseModel::Diagonal::shared_ptr& model); + +protected: + + /** given sigmas for a diagonal model, returns a sample */ + Vector sampleDiagonal(const Vector& sigmas); + }; } diff --git a/gtsam/linear/tests/testSampler.cpp b/gtsam/linear/tests/testSampler.cpp index e01788b65..ffb546e40 100644 --- a/gtsam/linear/tests/testSampler.cpp +++ b/gtsam/linear/tests/testSampler.cpp @@ -25,7 +25,7 @@ const double tol = 1e-5; /* ************************************************************************* */ TEST(testSampler, basic) { Vector sigmas = Vector_(3, 1.0, 0.1, 0.0); - SharedDiagonal model = noiseModel::Diagonal::Sigmas(sigmas); + noiseModel::Diagonal::shared_ptr model = noiseModel::Diagonal::Sigmas(sigmas); char seed = 'A'; Sampler sampler1(model, seed), sampler2(model, 1), sampler3(model, 1); EXPECT(assert_equal(sigmas, sampler1.sigmas())); From 0393f656292a92bec8eb9cefe0254d782d6e6e6b Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 21 Jun 2012 17:44:20 +0000 Subject: [PATCH 417/914] Small formatting --- gtsam/linear/Sampler.cpp | 1 - gtsam/linear/Sampler.h | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/gtsam/linear/Sampler.cpp b/gtsam/linear/Sampler.cpp index f69cfdae6..ea2c04106 100644 --- a/gtsam/linear/Sampler.cpp +++ b/gtsam/linear/Sampler.cpp @@ -18,7 +18,6 @@ #include #include - namespace gtsam { /* ************************************************************************* */ diff --git a/gtsam/linear/Sampler.h b/gtsam/linear/Sampler.h index 1150f5d55..71abdfc07 100644 --- a/gtsam/linear/Sampler.h +++ b/gtsam/linear/Sampler.h @@ -10,8 +10,8 @@ * -------------------------------------------------------------------------- */ /** - * @file Sampler.h * @brief sampling that can be parameterized using a NoiseModel to generate samples from + * @file Sampler.h * the given distribution * @author Alex Cunningham */ @@ -88,4 +88,4 @@ protected: }; -} +} // \namespace gtsam From 2123938b1bea71b050358fb7f9add50265484917 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 21 Jun 2012 17:45:43 +0000 Subject: [PATCH 418/914] FIXMEs for wrapping library components --- gtsam/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index b4fae3475..7467ad0cf 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -137,5 +137,7 @@ if (GTSAM_BUILD_WRAP) set(mexFlags "${mexFlags} -g COMPFLAGS='/c /DMATLAB_MEX_FILE ${CMAKE_CXX_FLAGS_${cmake_build_type_toupper}}'") # Macro to handle details of setting up targets + # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 + # FIXME: rework install commands to specify only certain filetypes/folders to avoid installing temp files wrap_library(gtsam "${mexFlags}" "../") endif () From f5cd87129d0f63585d557dae4f60f1d58b2a3aac Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 21 Jun 2012 17:53:45 +0000 Subject: [PATCH 419/914] Added at(Index) synonym for the operator[]. This allows easier matlab wrapping. --- gtsam/inference/Permutation.h | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/gtsam/inference/Permutation.h b/gtsam/inference/Permutation.h index 5454dafec..0aa322e87 100644 --- a/gtsam/inference/Permutation.h +++ b/gtsam/inference/Permutation.h @@ -86,11 +86,25 @@ public: /// @{ /** - * Permute the given variable, i.e. determine it's new index after the - * permutation. + * Return the new index of the supplied variable after the permutation */ Index operator[](Index variable) const { check(variable); return rangeIndices_[variable]; } + /** + * Return the new index of the supplied variable after the permutation. This version allows modification. + */ + Index& operator[](Index variable) { check(variable); return rangeIndices_[variable]; } + + /** + * Return the new index of the supplied variable after the permutation. Synonym for operator[](Index). + */ + Index at(Index variable) const { return operator[](variable); } + + /** + * Return the new index of the supplied variable after the permutation. This version allows modification. Synonym for operator[](Index). + */ + Index& at(Index variable) { return operator[](variable); } + /** * The number of variables in the range of this permutation, i.e. the output * space. @@ -145,10 +159,6 @@ public: /// @name Advanced Interface /// @{ - /** - * TODO: comment - */ - Index& operator[](Index variable) { check(variable); return rangeIndices_[variable]; } /** * A partial permutation, reorders the variables selected by selector through From eab2496f6efe9884d4eee97aa06a2d0140e36073 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 21 Jun 2012 19:29:01 +0000 Subject: [PATCH 420/914] Added 5-Way and 6-Way key constructors supported by the base class --- gtsam/inference/IndexFactor.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gtsam/inference/IndexFactor.h b/gtsam/inference/IndexFactor.h index 9b2d39727..8ab5a880a 100644 --- a/gtsam/inference/IndexFactor.h +++ b/gtsam/inference/IndexFactor.h @@ -98,6 +98,18 @@ namespace gtsam { assertInvariants(); } + /** Construct 5-way factor */ + IndexFactor(Index j1, Index j2, Index j3, Index j4, Index j5) : + Base(j1, j2, j3, j4, j5) { + assertInvariants(); + } + + /** Construct 6-way factor */ + IndexFactor(Index j1, Index j2, Index j3, Index j4, Index j5, Index j6) : + Base(j1, j2, j3, j4, j5, j6) { + assertInvariants(); + } + /// @} /// @name Advanced Constructors /// @{ From 48b33c44d3e361e3a065b9a3a753b62bd88a4b57 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 21 Jun 2012 20:26:30 +0000 Subject: [PATCH 421/914] Added constructors from a BayesTree to the SymbolicFactorGraph --- gtsam/inference/SymbolicFactorGraph.cpp | 8 ++++++-- gtsam/inference/SymbolicFactorGraph.h | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/gtsam/inference/SymbolicFactorGraph.cpp b/gtsam/inference/SymbolicFactorGraph.cpp index 514ba156b..b58a69b6d 100644 --- a/gtsam/inference/SymbolicFactorGraph.cpp +++ b/gtsam/inference/SymbolicFactorGraph.cpp @@ -27,10 +27,14 @@ namespace gtsam { using namespace std; /* ************************************************************************* */ - SymbolicFactorGraph::SymbolicFactorGraph(const BayesNet& bayesNet) : + SymbolicFactorGraph::SymbolicFactorGraph(const SymbolicBayesNet& bayesNet) : FactorGraph(bayesNet) {} - /* ************************************************************************* */ + /* ************************************************************************* */ + SymbolicFactorGraph::SymbolicFactorGraph(const SymbolicBayesTree& bayesTree) : + FactorGraph(bayesTree) {} + + /* ************************************************************************* */ void SymbolicFactorGraph::push_factor(Index key) { push_back(boost::make_shared(key)); } diff --git a/gtsam/inference/SymbolicFactorGraph.h b/gtsam/inference/SymbolicFactorGraph.h index 4da2baf13..d5d808f17 100644 --- a/gtsam/inference/SymbolicFactorGraph.h +++ b/gtsam/inference/SymbolicFactorGraph.h @@ -23,12 +23,14 @@ namespace gtsam { template class EliminationTree; } namespace gtsam { template class BayesNet; } +namespace gtsam { template class BayesTree; } namespace gtsam { class IndexConditional; } namespace gtsam { + typedef EliminationTree SymbolicEliminationTree; typedef BayesNet SymbolicBayesNet; - typedef EliminationTree SymbolicEliminationTree; + typedef BayesTree SymbolicBayesTree; /** Symbolic IndexFactor Graph * \nosubgrouping @@ -45,7 +47,10 @@ namespace gtsam { } /** Construct from a BayesNet */ - SymbolicFactorGraph(const BayesNet& bayesNet); + SymbolicFactorGraph(const SymbolicBayesNet& bayesNet); + + /** Construct from a BayesTree */ + SymbolicFactorGraph(const SymbolicBayesTree& bayesTree); /** * Construct from a factor graph of any type From 94a769a4473a6181e8cf72f8876cf80ec30fb8a5 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 21 Jun 2012 22:31:41 +0000 Subject: [PATCH 422/914] Created derived classes for SymbolicSequentialSolver and SymbolicMultifrontalSolver. This simplifies calling eliminate, mimics the Gaussian versions, and makes matlab wrapping possible. --- gtsam/inference/SymbolicMultifrontalSolver.h | 41 +++++++++++++++- gtsam/inference/SymbolicSequentialSolver.h | 47 ++++++++++++++++++- gtsam/inference/tests/testEliminationTree.cpp | 3 +- gtsam/inference/tests/testJunctionTree.cpp | 3 +- tests/testSymbolicBayesNetB.cpp | 3 +- tests/testSymbolicFactorGraphB.cpp | 2 +- 6 files changed, 88 insertions(+), 11 deletions(-) diff --git a/gtsam/inference/SymbolicMultifrontalSolver.h b/gtsam/inference/SymbolicMultifrontalSolver.h index 35b253c31..454be1d00 100644 --- a/gtsam/inference/SymbolicMultifrontalSolver.h +++ b/gtsam/inference/SymbolicMultifrontalSolver.h @@ -22,7 +22,44 @@ namespace gtsam { -// The base class provides all of the needed functionality -typedef GenericMultifrontalSolver > > SymbolicMultifrontalSolver; + class SymbolicMultifrontalSolver : GenericMultifrontalSolver > > { + + protected: + typedef GenericMultifrontalSolver > > Base; + + public: + /** + * Construct the solver for a factor graph. This builds the junction + * tree, which does the symbolic elimination, identifies the cliques, + * and distributes all the factors to the right cliques. + */ + SymbolicMultifrontalSolver(const SymbolicFactorGraph& factorGraph) : Base(factorGraph) {}; + + /** + * Construct the solver with a shared pointer to a factor graph and to a + * VariableIndex. The solver will store these pointers, so this constructor + * is the fastest. + */ + SymbolicMultifrontalSolver(const SymbolicFactorGraph::shared_ptr& factorGraph, + const VariableIndex::shared_ptr& variableIndex) : Base(factorGraph, variableIndex) {}; + + /** + * Eliminate the factor graph sequentially. Uses a column elimination tree + * to recursively eliminate. + */ + SymbolicBayesTree::shared_ptr eliminate() const { return Base::eliminate(&EliminateSymbolic); }; + + /** + * Compute the marginal joint over a set of variables, by integrating out + * all of the other variables. Returns the result as a factor graph. + */ + SymbolicFactorGraph::shared_ptr jointFactorGraph(const std::vector& js) const { return Base::jointFactorGraph(js, &EliminateSymbolic); }; + + /** + * Compute the marginal Gaussian density over a variable, by integrating out + * all of the other variables. This function returns the result as a factor. + */ + IndexFactor::shared_ptr marginalFactor(Index j) const { return Base::marginalFactor(j, &EliminateSymbolic); }; + }; } diff --git a/gtsam/inference/SymbolicSequentialSolver.h b/gtsam/inference/SymbolicSequentialSolver.h index d6e21e88e..c114261f0 100644 --- a/gtsam/inference/SymbolicSequentialSolver.h +++ b/gtsam/inference/SymbolicSequentialSolver.h @@ -21,8 +21,51 @@ namespace gtsam { -// The base class provides all of the needed functionality -typedef GenericSequentialSolver SymbolicSequentialSolver; + class SymbolicSequentialSolver : GenericSequentialSolver { + + protected: + typedef GenericSequentialSolver Base; + + public: + /** + * Construct the solver for a factor graph. This builds the junction + * tree, which does the symbolic elimination, identifies the cliques, + * and distributes all the factors to the right cliques. + */ + SymbolicSequentialSolver(const SymbolicFactorGraph& factorGraph) : Base(factorGraph) {}; + + /** + * Construct the solver with a shared pointer to a factor graph and to a + * VariableIndex. The solver will store these pointers, so this constructor + * is the fastest. + */ + SymbolicSequentialSolver(const SymbolicFactorGraph::shared_ptr& factorGraph, + const VariableIndex::shared_ptr& variableIndex) : Base(factorGraph, variableIndex) {}; + + /** Print to cout */ + void print(const std::string& name = "SymbolicSequentialSolver: ") const { Base::print(name); }; + + /** Test whether is equal to another */ + bool equals(const SymbolicSequentialSolver& other, double tol = 1e-9) const { return Base::equals(other, tol); }; + + /** + * Eliminate the factor graph sequentially. Uses a column elimination tree + * to recursively eliminate. + */ + SymbolicBayesNet::shared_ptr eliminate() const { return Base::eliminate(&EliminateSymbolic); }; + + /** + * Compute the marginal joint over a set of variables, by integrating out + * all of the other variables. Returns the result as a factor graph. + */ + SymbolicFactorGraph::shared_ptr jointFactorGraph(const std::vector& js) const { return Base::jointFactorGraph(js, &EliminateSymbolic); }; + + /** + * Compute the marginal Gaussian density over a variable, by integrating out + * all of the other variables. This function returns the result as a factor. + */ + IndexFactor::shared_ptr marginalFactor(Index j) const { return Base::marginalFactor(j, &EliminateSymbolic); }; + }; } diff --git a/gtsam/inference/tests/testEliminationTree.cpp b/gtsam/inference/tests/testEliminationTree.cpp index 0ec8b2266..c1df6e98e 100644 --- a/gtsam/inference/tests/testEliminationTree.cpp +++ b/gtsam/inference/tests/testEliminationTree.cpp @@ -101,8 +101,7 @@ TEST(EliminationTree, eliminate ) fg.push_factor(3, 4); // eliminate - SymbolicBayesNet actual = *SymbolicSequentialSolver(fg).eliminate( - &EliminateSymbolic); + SymbolicBayesNet actual = *SymbolicSequentialSolver(fg).eliminate(); CHECK(assert_equal(expected,actual)); } diff --git a/gtsam/inference/tests/testJunctionTree.cpp b/gtsam/inference/tests/testJunctionTree.cpp index 16309abda..a2765a201 100644 --- a/gtsam/inference/tests/testJunctionTree.cpp +++ b/gtsam/inference/tests/testJunctionTree.cpp @@ -83,8 +83,7 @@ TEST( JunctionTree, eliminate) SymbolicJunctionTree jt(fg); SymbolicBayesTree::sharedClique actual = jt.eliminate(&EliminateSymbolic); - BayesNet bn(*SymbolicSequentialSolver(fg).eliminate( - &EliminateSymbolic)); + BayesNet bn(*SymbolicSequentialSolver(fg).eliminate()); SymbolicBayesTree expected(bn); // cout << "BT from JT:\n"; diff --git a/tests/testSymbolicBayesNetB.cpp b/tests/testSymbolicBayesNetB.cpp index f2e9772ec..58ba3060b 100644 --- a/tests/testSymbolicBayesNetB.cpp +++ b/tests/testSymbolicBayesNetB.cpp @@ -54,8 +54,7 @@ TEST( SymbolicBayesNet, constructor ) SymbolicFactorGraph fg(factorGraph); // eliminate it - SymbolicBayesNet actual = *SymbolicSequentialSolver(fg).eliminate( - &EliminateSymbolic); + SymbolicBayesNet actual = *SymbolicSequentialSolver(fg).eliminate(); CHECK(assert_equal(expected, actual)); } diff --git a/tests/testSymbolicFactorGraphB.cpp b/tests/testSymbolicFactorGraphB.cpp index 7d657c9bf..ddb53b13c 100644 --- a/tests/testSymbolicFactorGraphB.cpp +++ b/tests/testSymbolicFactorGraphB.cpp @@ -143,7 +143,7 @@ TEST( SymbolicFactorGraph, eliminate ) SymbolicFactorGraph fg(factorGraph); // eliminate it - SymbolicBayesNet actual = *SymbolicSequentialSolver(fg).eliminate(&EliminateSymbolic); + SymbolicBayesNet actual = *SymbolicSequentialSolver(fg).eliminate(); CHECK(assert_equal(expected,actual)); } From 835d1d6b50d2428ab30b81b2cfe73dee53ea07e5 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Thu, 21 Jun 2012 22:32:28 +0000 Subject: [PATCH 423/914] First Iteration of Shortcut Cache changes and misc const fixes --- gtsam/inference/BayesTree-inl.h | 21 ++- gtsam/inference/BayesTree.h | 6 + gtsam/inference/BayesTreeCliqueBase-inl.h | 178 ++++++++++++---------- gtsam/inference/BayesTreeCliqueBase.h | 13 +- 4 files changed, 128 insertions(+), 90 deletions(-) diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 9fb8080ce..dfefd721e 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -557,10 +557,27 @@ namespace gtsam { /* ************************************************************************* */ template - template - void BayesTree::removeTop(const CONTAINER& keys, + void BayesTree::deleteCachedShorcuts(const sharedClique& subtree) { + // Check if subtree exists + if (subtree) { + //Delete CachedShortcut for this clique + subtree->resetCachedShortcut(); + // Recursive call over all child cliques + BOOST_FOREACH(sharedClique& childClique, subtree->children()) { + deleteCachedShorcuts(childClique); + } + } + } + + /* ************************************************************************* */ + template + template + void BayesTree::removeTop(const CONTAINER& keys, BayesNet& bn, typename BayesTree::Cliques& orphans) { + //TODO: Improve this + deleteCachedShorcuts(this->root_); + // process each key of the new factor BOOST_FOREACH(const Index& key, keys) { diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index de9a84640..14b01ab03 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -280,6 +280,12 @@ namespace gtsam { sharedClique insert(const sharedConditional& clique, std::list& children, bool isRootClique = false); + /** + * This deletes the cached shortcuts of all cliques in a subtree. This is + * performed when the bayes tree is modified. + */ + void deleteCachedShorcuts(const sharedClique& subtree); + private: /** deep copy to another tree */ diff --git a/gtsam/inference/BayesTreeCliqueBase-inl.h b/gtsam/inference/BayesTreeCliqueBase-inl.h index c57d6ed50..272747126 100644 --- a/gtsam/inference/BayesTreeCliqueBase-inl.h +++ b/gtsam/inference/BayesTreeCliqueBase-inl.h @@ -102,103 +102,113 @@ namespace gtsam { return changed; } - /* ************************************************************************* */ - // The shortcut density is a conditional P(S|R) of the separator of this - // clique on the root. We can compute it recursively from the parent shortcut - // P(Sp|R) as \int P(Fp|Sp) P(Sp|R), where Fp are the frontal nodes in p - /* ************************************************************************* */ - template - BayesNet BayesTreeCliqueBase::shortcut(derived_ptr R, Eliminate function) { + /* ************************************************************************* */ + // The shortcut density is a conditional P(S|R) of the separator of this + // clique on the root. We can compute it recursively from the parent shortcut + // P(Sp|R) as \int P(Fp|Sp) P(Sp|R), where Fp are the frontal nodes in p + /* ************************************************************************* */ + template + BayesNet BayesTreeCliqueBase::shortcut( + derived_ptr R, Eliminate function) const{ - static const bool debug = false; + static const bool debug = false; - // A first base case is when this clique or its parent is the root, - // in which case we return an empty Bayes net. + BayesNet p_S_R; //shortcut P(S|R) - derived_ptr parent(parent_.lock()); + //Check if the ShortCut already exists + if(!cachedShortcut_){ - if (R.get()==this || parent==R) { - BayesNet empty; - return empty; - } + // A first base case is when this clique or its parent is the root, + // in which case we return an empty Bayes net. - // The root conditional - FactorGraph p_R(BayesNet(R->conditional())); + derived_ptr parent(parent_.lock()); - // The parent clique has a ConditionalType for each frontal node in Fp - // so we can obtain P(Fp|Sp) in factor graph form - FactorGraph p_Fp_Sp(BayesNet(parent->conditional())); + if (R.get() == this || parent == R) { + BayesNet empty; + return empty; + } - // If not the base case, obtain the parent shortcut P(Sp|R) as factors - FactorGraph p_Sp_R(parent->shortcut(R, function)); + // The root conditional + FactorGraph p_R(BayesNet(R->conditional())); - // now combine P(Cp|R) = P(Fp|Sp) * P(Sp|R) - FactorGraph p_Cp_R; - p_Cp_R.push_back(p_R); - p_Cp_R.push_back(p_Fp_Sp); - p_Cp_R.push_back(p_Sp_R); + // The parent clique has a ConditionalType for each frontal node in Fp + // so we can obtain P(Fp|Sp) in factor graph form + FactorGraph p_Fp_Sp(BayesNet(parent->conditional())); - // Eliminate into a Bayes net with ordering designed to integrate out - // any variables not in *our* separator. Variables to integrate out must be - // eliminated first hence the desired ordering is [Cp\S S]. - // However, an added wrinkle is that Cp might overlap with the root. - // Keys corresponding to the root should not be added to the ordering at all. + // If not the base case, obtain the parent shortcut P(Sp|R) as factors + FactorGraph p_Sp_R(parent->shortcut(R, function)); - if(debug) { - p_R.print("p_R: "); - p_Fp_Sp.print("p_Fp_Sp: "); - p_Sp_R.print("p_Sp_R: "); - } + // now combine P(Cp|R) = P(Fp|Sp) * P(Sp|R) + FactorGraph p_Cp_R; + p_Cp_R.push_back(p_R); + p_Cp_R.push_back(p_Fp_Sp); + p_Cp_R.push_back(p_Sp_R); - // We want to factor into a conditional of the clique variables given the - // root and the marginal on the root, integrating out all other variables. - // The integrands include any parents of this clique and the variables of - // the parent clique. - FastSet variablesAtBack; - FastSet separator; - size_t uniqueRootVariables = 0; - BOOST_FOREACH(const Index separatorIndex, this->conditional()->parents()) { - variablesAtBack.insert(separatorIndex); - separator.insert(separatorIndex); - if(debug) std::cout << "At back (this): " << separatorIndex << std::endl; - } - BOOST_FOREACH(const Index key, R->conditional()->keys()) { - if(variablesAtBack.insert(key).second) - ++ uniqueRootVariables; - if(debug) std::cout << "At back (root): " << key << std::endl; - } + // Eliminate into a Bayes net with ordering designed to integrate out + // any variables not in *our* separator. Variables to integrate out must be + // eliminated first hence the desired ordering is [Cp\S S]. + // However, an added wrinkle is that Cp might overlap with the root. + // Keys corresponding to the root should not be added to the ordering at all. - Permutation toBack = Permutation::PushToBack( - std::vector(variablesAtBack.begin(), variablesAtBack.end()), - R->conditional()->lastFrontalKey() + 1); - Permutation::shared_ptr toBackInverse(toBack.inverse()); - BOOST_FOREACH(const typename FactorType::shared_ptr& factor, p_Cp_R) { - factor->permuteWithInverse(*toBackInverse); } - typename BayesNet::shared_ptr eliminated(EliminationTree< - FactorType>::Create(p_Cp_R)->eliminate(function)); + if(debug) { + p_R.print("p_R: "); + p_Fp_Sp.print("p_Fp_Sp: "); + p_Sp_R.print("p_Sp_R: "); + } - // Take only the conditionals for p(S|R). We check for each variable being - // in the separator set because if some separator variables overlap with - // root variables, we cannot rely on the number of root variables, and also - // want to include those variables in the conditional. - BayesNet p_S_R; - BOOST_REVERSE_FOREACH(typename ConditionalType::shared_ptr conditional, *eliminated) { - assert(conditional->nrFrontals() == 1); - if(separator.find(toBack[conditional->firstFrontalKey()]) != separator.end()) { - if(debug) - conditional->print("Taking C|R conditional: "); - p_S_R.push_front(conditional); - } - if(p_S_R.size() == separator.size()) - break; - } + // We want to factor into a conditional of the clique variables given the + // root and the marginal on the root, integrating out all other variables. + // The integrands include any parents of this clique and the variables of + // the parent clique. + FastSet variablesAtBack; + FastSet separator; + size_t uniqueRootVariables = 0; + BOOST_FOREACH(const Index separatorIndex, this->conditional()->parents()) { + variablesAtBack.insert(separatorIndex); + separator.insert(separatorIndex); + if(debug) std::cout << "At back (this): " << separatorIndex << std::endl; + } + BOOST_FOREACH(const Index key, R->conditional()->keys()) { + if(variablesAtBack.insert(key).second) + ++ uniqueRootVariables; + if(debug) std::cout << "At back (root): " << key << std::endl; + } - // Undo the permutation - if(debug) toBack.print("toBack: "); - p_S_R.permuteWithInverse(toBack); + Permutation toBack = Permutation::PushToBack( + std::vector(variablesAtBack.begin(), variablesAtBack.end()), + R->conditional()->lastFrontalKey() + 1); + Permutation::shared_ptr toBackInverse(toBack.inverse()); + BOOST_FOREACH(const typename FactorType::shared_ptr& factor, p_Cp_R) { + factor->permuteWithInverse(*toBackInverse); } + typename BayesNet::shared_ptr eliminated(EliminationTree< + FactorType>::Create(p_Cp_R)->eliminate(function)); - // return the parent shortcut P(Sp|R) - assertInvariants(); + // Take only the conditionals for p(S|R). We check for each variable being + // in the separator set because if some separator variables overlap with + // root variables, we cannot rely on the number of root variables, and also + // want to include those variables in the conditional. + BOOST_REVERSE_FOREACH(typename ConditionalType::shared_ptr conditional, *eliminated) { + assert(conditional->nrFrontals() == 1); + if(separator.find(toBack[conditional->firstFrontalKey()]) != separator.end()) { + if(debug) + conditional->print("Taking C|R conditional: "); + p_S_R.push_front(conditional); + } + if(p_S_R.size() == separator.size()) + break; + } + + // Undo the permutation + if(debug) toBack.print("toBack: "); + p_S_R.permuteWithInverse(toBack); + + assertInvariants(); + cachedShortcut_ = p_S_R; + } + else + p_S_R = *cachedShortcut_; + + // return the shortcut P(S|R) return p_S_R; } @@ -210,7 +220,7 @@ namespace gtsam { /* ************************************************************************* */ template FactorGraph::FactorType> BayesTreeCliqueBase::marginal( - derived_ptr R, Eliminate function) { + derived_ptr R, Eliminate function) const{ // If we are the root, just return this root // NOTE: immediately cast to a factor graph BayesNet bn(R->conditional()); @@ -231,7 +241,7 @@ namespace gtsam { /* ************************************************************************* */ template FactorGraph::FactorType> BayesTreeCliqueBase::joint( - derived_ptr C2, derived_ptr R, Eliminate function) { + derived_ptr C2, derived_ptr R, Eliminate function) const { // For now, assume neither is the root // Combine P(F1|S1), P(S1|R), P(F2|S2), P(S2|R), and P(R) diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index e09454e86..fa0992fbd 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -80,6 +80,9 @@ namespace gtsam { derived_weak_ptr parent_; std::list children_; + /// This stores the Cached Shortcut value + mutable boost::optional > cachedShortcut_; + /// @name Testable /// @{ @@ -150,14 +153,13 @@ namespace gtsam { bool permuteSeparatorWithInverse(const Permutation& inversePermutation); /** return the conditional P(S|Root) on the separator given the root */ - // TODO: create a cached version - BayesNet shortcut(derived_ptr root, Eliminate function); + BayesNet shortcut(derived_ptr root, Eliminate function) const; /** return the marginal P(C) of the clique */ - FactorGraph marginal(derived_ptr root, Eliminate function); + FactorGraph marginal(derived_ptr root, Eliminate function) const; /** return the joint P(C1,C2), where C1==this. TODO: not a method? */ - FactorGraph joint(derived_ptr C2, derived_ptr root, Eliminate function); + FactorGraph joint(derived_ptr C2, derived_ptr root, Eliminate function) const; friend class BayesTree; @@ -166,6 +168,9 @@ namespace gtsam { ///TODO: comment void assertInvariants() const; + /// Reset the computed shortcut of this clique. Used by friend BayesTree + void resetCachedShortcut() { cachedShortcut_ = boost::none; } + private: /** Cliques cannot be copied except by the clone() method, which does not From 6f58726a210b946143b07e576ff6e2ec6790be54 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 21 Jun 2012 23:46:24 +0000 Subject: [PATCH 424/914] Added testable functions to GenericMultifrontalSolver and SymbolicMultifrontalSolver --- gtsam/inference/GenericMultifrontalSolver-inl.h | 16 ++++++++++++++++ gtsam/inference/GenericMultifrontalSolver.h | 12 +++++++++++- gtsam/inference/SymbolicMultifrontalSolver.h | 6 ++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/gtsam/inference/GenericMultifrontalSolver-inl.h b/gtsam/inference/GenericMultifrontalSolver-inl.h index db18f2093..39cda6771 100644 --- a/gtsam/inference/GenericMultifrontalSolver-inl.h +++ b/gtsam/inference/GenericMultifrontalSolver-inl.h @@ -39,6 +39,22 @@ namespace gtsam { structure_(variableIndex), junctionTree_(new JT(*graph, *structure_)) { } + /* ************************************************************************* */ + template + void GenericMultifrontalSolver::print(const std::string& s) const { + this->structure_->print(s + " structure:\n"); + this->junctionTree_->print(s + " jtree:"); + } + + /* ************************************************************************* */ + template + bool GenericMultifrontalSolver::equals( + const GenericMultifrontalSolver& expected, double tol) const { + if (!this->structure_->equals(*expected.structure_, tol)) return false; + if (!this->junctionTree_->equals(*expected.junctionTree_, tol)) return false; + return true; + } + /* ************************************************************************* */ template void GenericMultifrontalSolver::replaceFactors(const sharedGraph& graph) { diff --git a/gtsam/inference/GenericMultifrontalSolver.h b/gtsam/inference/GenericMultifrontalSolver.h index a64df38e9..2d50b2ec1 100644 --- a/gtsam/inference/GenericMultifrontalSolver.h +++ b/gtsam/inference/GenericMultifrontalSolver.h @@ -72,7 +72,17 @@ namespace gtsam { GenericMultifrontalSolver(const sharedGraph& factorGraph, const VariableIndex::shared_ptr& variableIndex); - /// @} + /// @} + /// @name Testable + /// @{ + + /** Print to cout */ + void print(const std::string& name = "GenericMultifrontalSolver: ") const; + + /** Test whether is equal to another */ + bool equals(const GenericMultifrontalSolver& other, double tol = 1e-9) const; + + /// @} /// @name Standard Interface /// @{ diff --git a/gtsam/inference/SymbolicMultifrontalSolver.h b/gtsam/inference/SymbolicMultifrontalSolver.h index 454be1d00..802b10d72 100644 --- a/gtsam/inference/SymbolicMultifrontalSolver.h +++ b/gtsam/inference/SymbolicMultifrontalSolver.h @@ -43,6 +43,12 @@ namespace gtsam { SymbolicMultifrontalSolver(const SymbolicFactorGraph::shared_ptr& factorGraph, const VariableIndex::shared_ptr& variableIndex) : Base(factorGraph, variableIndex) {}; + /** Print to cout */ + void print(const std::string& name = "SymbolicMultifrontalSolver: ") const { Base::print(name); }; + + /** Test whether is equal to another */ + bool equals(const SymbolicMultifrontalSolver& other, double tol = 1e-9) const { return Base::equals(other, tol); }; + /** * Eliminate the factor graph sequentially. Uses a column elimination tree * to recursively eliminate. From 700dba5e8e85e12c89fb2bee5110190e7582ada1 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 21 Jun 2012 23:53:49 +0000 Subject: [PATCH 425/914] Added several inference-level classes to the matlab wrapper --- gtsam.h | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 192 insertions(+), 3 deletions(-) diff --git a/gtsam.h b/gtsam.h index b1c3b8d02..f18694b32 100644 --- a/gtsam.h +++ b/gtsam.h @@ -496,7 +496,182 @@ class SimpleCamera { //************************************************************************* // inference //************************************************************************* +class Permutation { + // Standard Constructors and Named Constructors + Permutation(); + Permutation(size_t nVars); + static gtsam::Permutation Identity(size_t nVars); + // FIXME: Cannot currently wrap std::vector + //static gtsam::Permutation PullToFront(const vector& toFront, size_t size, bool filterDuplicates); + //static gtsam::Permutation PushToBack(const vector& toBack, size_t size, bool filterDuplicates = false); + // Testable + void print(string s) const; + bool equals(const gtsam::Permutation& rhs, double tol) const; + + // Standard interface + size_t at(size_t variable) const; + size_t size() const; + bool empty() const; + void resize(size_t newSize); + gtsam::Permutation* permute(const gtsam::Permutation& permutation) const; + gtsam::Permutation* inverse() const; +}; + +class IndexFactor { + // Standard Constructors and Named Constructors + IndexFactor(); + IndexFactor(size_t j); + IndexFactor(size_t j1, size_t j2); + IndexFactor(size_t j1, size_t j2, size_t j3); + IndexFactor(size_t j1, size_t j2, size_t j3, size_t j4); + IndexFactor(size_t j1, size_t j2, size_t j3, size_t j4, size_t j5); + IndexFactor(size_t j1, size_t j2, size_t j3, size_t j4, size_t j5, size_t j6); + // FIXME: Must wrap std::set for this to work + //IndexFactor(const std::set& js); + + // From Factor + size_t size() const; + void print(string s) const; + bool equals(const gtsam::IndexFactor& other, double tol) const; + // FIXME: Need to wrap std::vector + //std::vector& keys(); +}; + +class IndexConditional { + // Standard Constructors and Named Constructors + IndexConditional(); + IndexConditional(size_t key); + IndexConditional(size_t key, size_t parent); + IndexConditional(size_t key, size_t parent1, size_t parent2); + IndexConditional(size_t key, size_t parent1, size_t parent2, size_t parent3); + // FIXME: Must wrap std::vector for this to work + //IndexFactor(size_t key, const std::vector& parents); + //IndexConditional(const std::vector& keys, size_t nrFrontals); + //template static shared_ptr FromKeys(const KEYS& keys, size_t nrFrontals); + + // Testable + void print(string s) const; + bool equals(const gtsam::IndexConditional& other, double tol) const; + + // Standard interface + size_t nrFrontals() const; + size_t nrParents() const; + gtsam::IndexFactor* toFactor() const; +}; + +#include +class SymbolicBayesNet { + // Standard Constructors and Named Constructors + SymbolicBayesNet(); + SymbolicBayesNet(const gtsam::SymbolicBayesNet& bn); + SymbolicBayesNet(const gtsam::IndexConditional* conditional); + + // Testable + void print(string s) const; + bool equals(const gtsam::SymbolicBayesNet& other, double tol) const; + + // Standard interface + size_t size() const; + void push_back(const gtsam::IndexConditional* conditional); + // FIXME: cannot overload functions + //void push_back(const SymbolicBayesNet bn); + void push_front(const gtsam::IndexConditional* conditional); + // FIXME: cannot overload functions + //void push_front(const SymbolicBayesNet bn); + void pop_front(); + void permuteWithInverse(const gtsam::Permutation& inversePermutation); + bool permuteSeparatorWithInverse(const gtsam::Permutation& inversePermutation); +}; + +#include +class SymbolicBayesTree { + // Standard Constructors and Named Constructors + SymbolicBayesTree(); + SymbolicBayesTree(const gtsam::SymbolicBayesNet& bn); + SymbolicBayesTree(const gtsam::SymbolicBayesTree& other); + // FIXME: wrap needs to understand std::list + //SymbolicBayesTree(const gtsam::SymbolicBayesNet& bayesNet, std::list subtrees); + + // Testable + void print(string s) const; + bool equals(const gtsam::SymbolicBayesTree& other, double tol) const; + + // Standard interface + size_t size() const; + void saveGraph(string s) const; + void clear(); + // TODO: There are many other BayesTree member functions which might be of use +}; + +class SymbolicFactorGraph { + // Standard Constructors and Named Constructors + SymbolicFactorGraph(); + SymbolicFactorGraph(const gtsam::SymbolicBayesNet& bayesNet); + SymbolicFactorGraph(const gtsam::SymbolicBayesTree& bayesTree); + + // From FactorGraph + void push_back(gtsam::IndexFactor* factor); + void print(string s) const; + bool equals(const gtsam::SymbolicFactorGraph& rhs, double tol) const; + size_t size() const; + + // Standard interface + // FIXME: Must wrap FastSet for this to work + //FastSet keys() const; +}; + +class SymbolicSequentialSolver { + // Standard Constructors and Named Constructors + SymbolicSequentialSolver(const gtsam::SymbolicFactorGraph& factorGraph); + SymbolicSequentialSolver(const gtsam::SymbolicFactorGraph* factorGraph, const gtsam::VariableIndex* variableIndex); + + // Testable + void print(string s) const; + bool equals(const gtsam::SymbolicSequentialSolver& rhs, double tol) const; + + // Standard interface + gtsam::SymbolicBayesNet* eliminate() const; +}; + +class SymbolicMultifrontalSolver { + // Standard Constructors and Named Constructors + SymbolicMultifrontalSolver(const gtsam::SymbolicFactorGraph& factorGraph); + SymbolicMultifrontalSolver(const gtsam::SymbolicFactorGraph* factorGraph, const gtsam::VariableIndex* variableIndex); + + // Testable + void print(string s) const; + bool equals(const gtsam::SymbolicMultifrontalSolver& rhs, double tol) const; + + // Standard interface + gtsam::SymbolicBayesTree* eliminate() const; +}; + +#include +class VariableIndex { + // Standard Constructors and Named Constructors + VariableIndex(); + // FIXME: Handle templates somehow + //template VariableIndex(const FactorGraph& factorGraph, size_t nVariables); + //template VariableIndex(const FactorGraph& factorGraph); + VariableIndex(const gtsam::SymbolicFactorGraph& factorGraph); + VariableIndex(const gtsam::SymbolicFactorGraph& factorGraph, size_t nVariables); +// VariableIndex(const gtsam::GaussianFactorGraph& factorGraph); +// VariableIndex(const gtsam::GaussianFactorGraph& factorGraph, size_t nVariables); +// VariableIndex(const gtsam::NonlinearFactorGraph& factorGraph); +// VariableIndex(const gtsam::NonlinearFactorGraph& factorGraph, size_t nVariables); + VariableIndex(const gtsam::VariableIndex& other); + + // Testable + bool equals(const gtsam::VariableIndex& other, double tol) const; + void print(string s) const; + + // Standard interface + size_t size() const; + size_t nFactors() const; + size_t nEntries() const; + void permute(const gtsam::Permutation& permutation); +}; //************************************************************************* // linear @@ -721,10 +896,23 @@ class Symbol { }; class Ordering { - Ordering(); + // Standard Constructors and Named Constructors + Ordering(); + + // Testable void print(string s) const; bool equals(const gtsam::Ordering& ord, double tol) const; - void push_back(size_t key); + + // Standard interface + size_t nVars() const; + size_t size() const; + size_t at(size_t key) const; + bool exists(size_t key) const; + void insert(size_t key, size_t order); + void push_back(size_t key); + void permuteWithInverse(const gtsam::Permutation& inversePermutation); + // FIXME: Wrap InvertedMap as well + //InvertedMap invert() const; }; class NonlinearFactorGraph { @@ -738,7 +926,8 @@ class NonlinearFactor { void equals(const gtsam::NonlinearFactor& other, double tol) const; gtsam::KeyVector keys() const; size_t size() const; - size_t dim() const; + // FIXME: NonlinearFactor does not have a dim() member function + //size_t dim() const; }; class Values { From c95cd18ec4c4b731e5a636288aa97360a28ee8ff Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 15:24:49 +0000 Subject: [PATCH 426/914] Fixed namespace of isfinite, etc - in std --- gtsam/base/types.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gtsam/base/types.h b/gtsam/base/types.h index 7973e3d34..2d593409c 100644 --- a/gtsam/base/types.h +++ b/gtsam/base/types.h @@ -73,10 +73,14 @@ namespace gtsam { #ifdef _MSC_VER +// Define some common g++ functions and macros that MSVC does not have + #include -using boost::math::isfinite; -using boost::math::isnan; -using boost::math::isinf; +namespace std { + using boost::math::isfinite; + using boost::math::isnan; + using boost::math::isinf; +} #include #ifndef M_PI From 5e2980fc4dd89a6da746a358c48290b978049f5b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 15:24:53 +0000 Subject: [PATCH 427/914] Removed extra typedefs --- gtsam/inference/tests/testBayesTree.cpp | 2 -- gtsam/inference/tests/testJunctionTree.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/gtsam/inference/tests/testBayesTree.cpp b/gtsam/inference/tests/testBayesTree.cpp index a5601b8eb..f64e56df6 100644 --- a/gtsam/inference/tests/testBayesTree.cpp +++ b/gtsam/inference/tests/testBayesTree.cpp @@ -33,8 +33,6 @@ using namespace boost::assign; using namespace std; using namespace gtsam; -typedef BayesTree SymbolicBayesTree; - ///* ************************************************************************* */ //// SLAM example from RSS sqrtSAM paper static const Index _x3_=0, _x2_=1; diff --git a/gtsam/inference/tests/testJunctionTree.cpp b/gtsam/inference/tests/testJunctionTree.cpp index a2765a201..e9694eda3 100644 --- a/gtsam/inference/tests/testJunctionTree.cpp +++ b/gtsam/inference/tests/testJunctionTree.cpp @@ -35,7 +35,6 @@ using namespace gtsam; using namespace std; typedef JunctionTree SymbolicJunctionTree; -typedef BayesTree SymbolicBayesTree; /* ************************************************************************* * * x1 - x2 - x3 - x4 From 685d4d7da289c105a05814b699c12f453d3f0909 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 15:24:57 +0000 Subject: [PATCH 428/914] Added check and exception for incompatible noise model dimension in JacobianFactor --- gtsam/linear/JacobianFactor.cpp | 34 +++++++++++++++++++++++++++++++++ gtsam/linear/JacobianFactor.h | 18 +++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index bdb51701e..e2a582d9b 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -86,6 +86,7 @@ namespace gtsam { size_t dims[] = { 1 }; Ab_.copyStructureFrom(BlockAb(matrix_, dims, dims+1, b_in.size())); getb() = b_in; + model_ = noiseModel::Unit::Create(this->rows()); assertInvariants(); } @@ -93,6 +94,10 @@ namespace gtsam { JacobianFactor::JacobianFactor(Index i1, const Matrix& A1, const Vector& b, const SharedDiagonal& model) : GaussianFactor(i1), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { + + if(model->dim() != b.size()) + throw InvalidNoiseModel(b.size(), model->dim()); + size_t dims[] = { A1.cols(), 1}; Ab_.copyStructureFrom(BlockAb(matrix_, dims, dims+2, b.size())); Ab_(0) = A1; @@ -104,6 +109,10 @@ namespace gtsam { JacobianFactor::JacobianFactor(Index i1, const Matrix& A1, Index i2, const Matrix& A2, const Vector& b, const SharedDiagonal& model) : GaussianFactor(i1,i2), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { + + if(model->dim() != b.size()) + throw InvalidNoiseModel(b.size(), model->dim()); + size_t dims[] = { A1.cols(), A2.cols(), 1}; Ab_.copyStructureFrom(BlockAb(matrix_, dims, dims+3, b.size())); Ab_(0) = A1; @@ -116,6 +125,10 @@ namespace gtsam { JacobianFactor::JacobianFactor(Index i1, const Matrix& A1, Index i2, const Matrix& A2, Index i3, const Matrix& A3, const Vector& b, const SharedDiagonal& model) : GaussianFactor(i1,i2,i3), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { + + if(model->dim() != b.size()) + throw InvalidNoiseModel(b.size(), model->dim()); + size_t dims[] = { A1.cols(), A2.cols(), A3.cols(), 1}; Ab_.copyStructureFrom(BlockAb(matrix_, dims, dims+4, b.size())); Ab_(0) = A1; @@ -131,6 +144,10 @@ namespace gtsam { GaussianFactor(GetKeys(terms.size(), terms.begin(), terms.end())), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { + + if(model->dim() != b.size()) + throw InvalidNoiseModel(b.size(), model->dim()); + size_t* dims = (size_t*)alloca(sizeof(size_t)*(terms.size()+1)); // FIXME: alloca is bad, just ask Google. for(size_t j=0; jdim() != b.size()) + throw InvalidNoiseModel(b.size(), model->dim()); + size_t* dims=(size_t*)alloca(sizeof(size_t)*(terms.size()+1)); // FIXME: alloca is bad, just ask Google. size_t j=0; std::list >::const_iterator term=terms.begin(); @@ -542,10 +563,23 @@ namespace gtsam { /* ************************************************************************* */ void JacobianFactor::setModel(bool anyConstrained, const Vector& sigmas) { + if(sigmas.size() != this->rows()) + throw InvalidNoiseModel(this->rows(), sigmas.size()); if (anyConstrained) model_ = noiseModel::Constrained::MixedSigmas(sigmas); else model_ = noiseModel::Diagonal::Sigmas(sigmas); } + /* ************************************************************************* */ + const char* JacobianFactor::InvalidNoiseModel::what() throw() { + if(description_.empty()) + description_ = (boost::format( + "A JacobianFactor was attempted to be constructed or modified to use a\n" + "noise model of incompatible dimension. The JacobianFactor has\n" + "dimensionality (i.e. length of error vector) %d but the provided noise\n" + "model has dimensionality %d.") % factorDims % noiseModelDims).str(); + return description_.c_str(); + } + } diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 276d11f27..f5c8bf29b 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -299,6 +299,23 @@ namespace gtsam { /** Assert invariants after elimination */ void assertInvariants() const; + /** An exception indicating that the noise model dimension passed into the + * JacobianFactor has a different dimensionality than the factor. */ + class InvalidNoiseModel : std::exception { + public: + const size_t factorDims; ///< The dimensionality of the factor + const size_t noiseModelDims; ///< The dimensionality of the noise model + + InvalidNoiseModel(size_t factorDims, size_t noiseModelDims) : + factorDims(factorDims), noiseModelDims(noiseModelDims) {} + virtual ~InvalidNoiseModel() throw() {} + + virtual const char* what() throw(); + + private: + mutable std::string description_; + }; + private: // Friend HessianFactor to facilitate conversion constructors @@ -321,5 +338,6 @@ namespace gtsam { } }; // JacobianFactor + } // gtsam From d8703b1c93c476fe344da8f2dd48a4b84bddf63b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 15:25:02 +0000 Subject: [PATCH 429/914] Reverting - Moved dim() from NonlinearFactor to NoiseModelFactor - for NonlinearFactors that linearize to HessianFactors, dimension is not defined. (reverse-merged from commit e9b6a7949524d4d8d4069abaee16d213792a3507) --- gtsam/nonlinear/NonlinearFactor.h | 3 +++ gtsam/slam/AntiFactor.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index f6869140c..e1cfb2bc3 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -124,6 +124,9 @@ public: */ virtual double error(const Values& c) const = 0; + /** get the dimension of the factor (number of rows on linearization) */ + virtual size_t dim() const = 0; + /** * Checks whether a factor should be used based on a set of values. * This is primarily used to implment inequality constraints that diff --git a/gtsam/slam/AntiFactor.h b/gtsam/slam/AntiFactor.h index 890e5beee..1e0d64db7 100644 --- a/gtsam/slam/AntiFactor.h +++ b/gtsam/slam/AntiFactor.h @@ -78,6 +78,9 @@ namespace gtsam { */ double error(const Values& c) const { return -factor_->error(c); } + /** get the dimension of the factor (same as the original factor) */ + size_t dim() const { return factor_->dim(); } + /** * Checks whether this factor should be used based on a set of values. * The AntiFactor will have the same 'active' profile as the original factor. From c0819adb8f3d0830c277a0d9ced61d34589f2fe4 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 15:43:33 +0000 Subject: [PATCH 430/914] Changed static to inline in TestableAssertions.h to avoid warnings --- gtsam/base/TestableAssertions.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/base/TestableAssertions.h b/gtsam/base/TestableAssertions.h index e79d6b764..00ab79d30 100644 --- a/gtsam/base/TestableAssertions.h +++ b/gtsam/base/TestableAssertions.h @@ -30,7 +30,7 @@ namespace gtsam { /** * Equals testing for basic types */ -static bool assert_equal(const Index& expected, const Index& actual, double tol = 0.0) { +inline bool assert_equal(const Index& expected, const Index& actual, double tol = 0.0) { if(expected != actual) { std::cout << "Not equal:\nexpected: " << expected << "\nactual: " << actual << std::endl; return false; @@ -327,7 +327,7 @@ bool assert_container_equality(const V& expected, const V& actual) { /** * Compare strings for unit tests */ -static bool assert_equal(const std::string& expected, const std::string& actual) { +inline bool assert_equal(const std::string& expected, const std::string& actual) { if (expected == actual) return true; printf("Not equal:\n"); From ae9088efdc8e3729d9862cb0c4caf155fdd00523 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 22 Jun 2012 15:57:56 +0000 Subject: [PATCH 431/914] Added back dim() for NonlinearFactor --- gtsam.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gtsam.h b/gtsam.h index f18694b32..d06bd0b4f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -926,8 +926,7 @@ class NonlinearFactor { void equals(const gtsam::NonlinearFactor& other, double tol) const; gtsam::KeyVector keys() const; size_t size() const; - // FIXME: NonlinearFactor does not have a dim() member function - //size_t dim() const; + size_t dim() const; }; class Values { From 18ba9bcb3d800b220ae2e339c8e99b78254d3761 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 22 Jun 2012 16:38:01 +0000 Subject: [PATCH 432/914] Removed sample() functions and global random number generator --- gtsam.h | 18 +- gtsam/base/Vector.cpp | 19 +- gtsam/base/Vector.h | 26 +- gtsam/base/tests/testVector.cpp | 21 -- gtsam/linear/NoiseModel.cpp | 24 -- gtsam/linear/NoiseModel.h | 10 - gtsam/linear/Sampler.cpp | 2 +- gtsam/linear/Sampler.h | 4 +- gtsam/linear/SharedDiagonal.h | 3 - gtsam/linear/VectorValues.h | 1 + gtsam/linear/tests/testNoiseModel.cpp | 14 +- gtsam/slam/dataset.cpp | 427 +++++++++++++------------- 12 files changed, 238 insertions(+), 331 deletions(-) diff --git a/gtsam.h b/gtsam.h index d06bd0b4f..21ee927db 100644 --- a/gtsam.h +++ b/gtsam.h @@ -690,7 +690,6 @@ class Diagonal { static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas); static gtsam::noiseModel::Diagonal* Variances(Vector variances); static gtsam::noiseModel::Diagonal* Precisions(Vector precisions); - Vector sample() const; // Matrix R() const; // FIXME: cannot parse!!! void print(string s) const; }; @@ -699,7 +698,6 @@ class Isotropic { static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); static gtsam::noiseModel::Isotropic* Precision(size_t dim, double precision); - Vector sample() const; void print(string s) const; }; @@ -731,7 +729,19 @@ class SharedGaussian { class SharedDiagonal { SharedDiagonal(Vector sigmas); void print(string s) const; - Vector sample() const; +}; + +class Sampler { + Sampler(gtsam::noiseModel::Diagonal* model, int seed); + Sampler(Vector sigmas, int seed); + Sampler(int seed); + + size_t dim() const; + Vector sigmas() const; + gtsam::noiseModel::Diagonal* model() const; + + Vector sample(); + Vector sampleNewModel(gtsam::noiseModel::Diagonal* model); }; class VectorValues { @@ -926,7 +936,7 @@ class NonlinearFactor { void equals(const gtsam::NonlinearFactor& other, double tol) const; gtsam::KeyVector keys() const; size_t size() const; - size_t dim() const; +// size_t dim() const; // FIXME: Doesn't link }; class Values { diff --git a/gtsam/base/Vector.cpp b/gtsam/base/Vector.cpp index 19546016f..a7e8f2769 100644 --- a/gtsam/base/Vector.cpp +++ b/gtsam/base/Vector.cpp @@ -23,13 +23,11 @@ #include #include #include +#include #include #include #include -#include -#include - #include #include @@ -39,8 +37,6 @@ using namespace std; -boost::minstd_rand generator(42u); - namespace gtsam { /* ************************************************************************* */ @@ -432,19 +428,6 @@ Vector concatVectors(size_t nrVectors, ...) return concatVectors(vs); } -/* ************************************************************************* */ -Vector rand_vector_norm(size_t dim, double mean, double sigma) -{ - boost::normal_distribution norm_dist(mean, sigma); - boost::variate_generator > norm(generator, norm_dist); - - Vector v(dim); - for(int i = 0; i #include +#include #include #include -#include - -/** - * Static random number generator - needs to maintain a state - * over time, hence the static generator. Be careful in - * cases where multiple processes (as is frequently the case with - * multi-robot scenarios) are using the sample() facilities - * in NoiseModel, as they will each have the same seed. - */ -// FIXME: make this go away - use the Sampler class instead -extern boost::minstd_rand generator; namespace gtsam { @@ -358,20 +348,6 @@ Vector concatVectors(const std::list& vs); */ Vector concatVectors(size_t nrVectors, ...); -/** - * random vector - */ -Vector rand_vector_norm(size_t dim, double mean = 0, double sigma = 1); - -/** - * Sets the generator to use a different seed value. - * Default argument resets the RNG - * @param seed is the new seed - */ -inline void seedRNG(unsigned int seed = 42u) { - generator.seed(seed); -} - } // namespace gtsam #include diff --git a/gtsam/base/tests/testVector.cpp b/gtsam/base/tests/testVector.cpp index 6657d41f9..b8bb0333b 100644 --- a/gtsam/base/tests/testVector.cpp +++ b/gtsam/base/tests/testVector.cpp @@ -297,27 +297,6 @@ TEST( TestVector, linear_dependent3 ) EXPECT(!linear_dependent(v1, v2)); } -/* ************************************************************************* */ -TEST( TestVector, random ) -{ - // Assumes seed not previously reset during this test - seedRNG(); - Vector v1_42 = rand_vector_norm(5); - - // verify that resetting the RNG produces the same value - seedRNG(); - Vector v2_42 = rand_vector_norm(5); - - EXPECT(assert_equal(v1_42, v2_42, 1e-6)); - - // verify that different seed produces a different value - seedRNG(41u); - - Vector v3_41 = rand_vector_norm(5); - - EXPECT(assert_inequal(v1_42, v3_41, 1e-6)); -} - /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index 51f732db0..f212118c9 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -255,18 +255,6 @@ void Diagonal::WhitenInPlace(Matrix& H) const { vector_scale_inplace(invsigmas(), H); } -/* ************************************************************************* */ -Vector Diagonal::sample() const { - Vector result(dim_); - for (size_t i = 0; i < dim_; i++) { - typedef boost::normal_distribution Normal; - Normal dist(0.0, this->sigmas_(i)); - boost::variate_generator norm(generator, dist); - result(i) = norm(); - } - return result; -} - /* ************************************************************************* */ // Constrained /* ************************************************************************* */ @@ -464,18 +452,6 @@ void Isotropic::WhitenInPlace(Matrix& H) const { H *= invsigma_; } -/* ************************************************************************* */ -// faster version -Vector Isotropic::sample() const { - typedef boost::normal_distribution Normal; - Normal dist(0.0, this->sigma_); - boost::variate_generator norm(generator, dist); - Vector result(dim_); - for (size_t i = 0; i < dim_; i++) - result(i) = norm(); - return result; -} - /* ************************************************************************* */ // Unit /* ************************************************************************* */ diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index b1e65feff..50e59a85d 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -298,11 +298,6 @@ namespace gtsam { Vector invsigmas() const; double invsigma(size_t i) const; - /** - * generate random variate - */ - virtual Vector sample() const; - /** * Return R itself, but note that Whiten(H) is cheaper than R*H */ @@ -525,11 +520,6 @@ namespace gtsam { */ inline double sigma() const { return sigma_; } - /** - * generate random variate - */ - virtual Vector sample() const; - private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam/linear/Sampler.cpp b/gtsam/linear/Sampler.cpp index ea2c04106..6031440bd 100644 --- a/gtsam/linear/Sampler.cpp +++ b/gtsam/linear/Sampler.cpp @@ -66,7 +66,7 @@ Vector Sampler::sample() { } /* ************************************************************************* */ -Vector Sampler::sample(const noiseModel::Diagonal::shared_ptr& model) { +Vector Sampler::sampleNewModel(const noiseModel::Diagonal::shared_ptr& model) { assert(model.get()); const Vector& sigmas = model->sigmas(); return sampleDiagonal(sigmas); diff --git a/gtsam/linear/Sampler.h b/gtsam/linear/Sampler.h index 71abdfc07..3f6fee7ca 100644 --- a/gtsam/linear/Sampler.h +++ b/gtsam/linear/Sampler.h @@ -20,6 +20,8 @@ #include +#include + namespace gtsam { /** @@ -79,7 +81,7 @@ public: * * NOTE: not const due to need to update the underlying generator */ - Vector sample(const noiseModel::Diagonal::shared_ptr& model); + Vector sampleNewModel(const noiseModel::Diagonal::shared_ptr& model); protected: diff --git a/gtsam/linear/SharedDiagonal.h b/gtsam/linear/SharedDiagonal.h index 193a30215..f57d6d726 100644 --- a/gtsam/linear/SharedDiagonal.h +++ b/gtsam/linear/SharedDiagonal.h @@ -58,9 +58,6 @@ namespace gtsam { // note, deliberately not in noiseModel namespace /// Print inline void print(const std::string &s) const { (*this)->print(s); } - /// Generate a sample - inline Vector sample() const { return (*this)->sample(); } - /** Serialization function */ friend class boost::serialization::access; template diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 0a32e6812..f3d82511e 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -24,6 +24,7 @@ #include #include #include +#include namespace gtsam { diff --git a/gtsam/linear/tests/testNoiseModel.cpp b/gtsam/linear/tests/testNoiseModel.cpp index 6ca0ccd81..94a174543 100644 --- a/gtsam/linear/tests/testNoiseModel.cpp +++ b/gtsam/linear/tests/testNoiseModel.cpp @@ -131,15 +131,6 @@ TEST(NoiseModel, equals) EXPECT(assert_inequal(*i1,*i2)); } -/* ************************************************************************* */ -TEST(NoiseModel, sample) -{ - Vector s = Vector_(3,1.0,2.0,3.0); - SharedDiagonal model = sharedSigmas(s); - Vector v = model->sample(); - // no check as no way yet to set random seed -} - // TODO enable test once a mechanism for smart constraints exists ///* ************************************************************************* */ //TEST(NoiseModel, ConstrainedSmart ) @@ -346,8 +337,5 @@ TEST(NoiseModel, robustNoise) } /* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index d4be33f31..c2af9af36 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -20,226 +20,231 @@ #include #include +#include #include using namespace std; -using namespace gtsam; #define LINESIZE 81920 namespace gtsam { - /* ************************************************************************* */ - pair > dataset(const string& dataset, - const string& user_path) { - string path = user_path, set = dataset; - boost::optional null_model; - boost::optional identity(noiseModel::Unit::Create(3)); - boost::optional small( - noiseModel::Diagonal::Variances( - gtsam::Vector_(3, 0.0001, 0.0001, 0.0003))); +/* ************************************************************************* */ +pair > dataset(const string& dataset, + const string& user_path) { + string path = user_path, set = dataset; + boost::optional null_model; + boost::optional identity(noiseModel::Unit::Create(3)); + boost::optional small( + noiseModel::Diagonal::Variances( + gtsam::Vector_(3, 0.0001, 0.0001, 0.0003))); - if (path.empty()) - path = string(getenv("HOME")) + "/data"; - if (set.empty()) - set = string(getenv("DATASET")); + if (path.empty()) + path = string(getenv("HOME")) + "/data"; + if (set.empty()) + set = string(getenv("DATASET")); - if (set == "intel") - return make_pair(path + "/Intel/intel.graph", null_model); - if (set == "intel-gfs") - return make_pair(path + "/Intel/intel.gfs.graph", null_model); - if (set == "Killian-gfs") - return make_pair(path + "/Killian/Killian.gfs.graph", null_model); - if (set == "Killian") - return make_pair(path + "/Killian/Killian.graph", small); - if (set == "Killian-noised") - return make_pair(path + "/Killian/Killian-noised.graph", null_model); - if (set == "3") - return make_pair(path + "/TORO/w3-odom.graph", identity); - if (set == "100") - return make_pair(path + "/TORO/w100-odom.graph", identity); - if (set == "10K") - return make_pair(path + "/TORO/w10000-odom.graph", identity); - if (set == "10K2") - return make_pair(path + "/hogman/data/2D/w10000.graph", - noiseModel::Diagonal::Variances(gtsam::Vector_(3, 0.1, 0.1, 0.05))); - if (set == "Eiffel100") - return make_pair(path + "/TORO/w100-Eiffel.graph", identity); - if (set == "Eiffel10K") - return make_pair(path + "/TORO/w10000-Eiffel.graph", identity); - if (set == "olson") - return make_pair(path + "/Olson/olson06icra.graph", null_model); - if (set == "victoria") - return make_pair(path + "/VictoriaPark/victoria_park.graph", null_model); - if (set == "beijing") - return make_pair(path + "/Beijing/beijingData_trips.graph", null_model); + if (set == "intel") + return make_pair(path + "/Intel/intel.graph", null_model); + if (set == "intel-gfs") + return make_pair(path + "/Intel/intel.gfs.graph", null_model); + if (set == "Killian-gfs") + return make_pair(path + "/Killian/Killian.gfs.graph", null_model); + if (set == "Killian") + return make_pair(path + "/Killian/Killian.graph", small); + if (set == "Killian-noised") + return make_pair(path + "/Killian/Killian-noised.graph", null_model); + if (set == "3") + return make_pair(path + "/TORO/w3-odom.graph", identity); + if (set == "100") + return make_pair(path + "/TORO/w100-odom.graph", identity); + if (set == "10K") + return make_pair(path + "/TORO/w10000-odom.graph", identity); + if (set == "10K2") + return make_pair(path + "/hogman/data/2D/w10000.graph", + noiseModel::Diagonal::Variances(gtsam::Vector_(3, 0.1, 0.1, 0.05))); + if (set == "Eiffel100") + return make_pair(path + "/TORO/w100-Eiffel.graph", identity); + if (set == "Eiffel10K") + return make_pair(path + "/TORO/w10000-Eiffel.graph", identity); + if (set == "olson") + return make_pair(path + "/Olson/olson06icra.graph", null_model); + if (set == "victoria") + return make_pair(path + "/VictoriaPark/victoria_park.graph", null_model); + if (set == "beijing") + return make_pair(path + "/Beijing/beijingData_trips.graph", null_model); - return make_pair("unknown", null_model); - } - - /* ************************************************************************* */ - - pair load2D( - pair > dataset, - int maxID, bool addNoise, bool smart) { - return load2D(dataset.first, dataset.second, maxID, addNoise, smart); - } - - pair load2D( - const string& filename, boost::optional model, int maxID, - bool addNoise, bool smart) { - cout << "Will try to read " << filename << endl; - ifstream is(filename.c_str()); - if (!is) { - cout << "load2D: can not find the file!"; - exit(-1); - } - - pose2SLAM::Values::shared_ptr poses(new pose2SLAM::Values); - pose2SLAM::Graph::shared_ptr graph(new pose2SLAM::Graph); - - string tag; - - // load the poses - while (is) { - is >> tag; - - if ((tag == "VERTEX2") || (tag == "VERTEX")) { - int id; - double x, y, yaw; - is >> id >> x >> y >> yaw; - // optional filter - if (maxID && id >= maxID) - continue; - poses->insert(id, Pose2(x, y, yaw)); - } - is.ignore(LINESIZE, '\n'); - } - is.clear(); /* clears the end-of-file and error flags */ - is.seekg(0, ios::beg); - - // load the factors - while (is) { - is >> tag; - - if ((tag == "EDGE2") || (tag == "EDGE") || (tag == "ODOMETRY")) { - int id1, id2; - double x, y, yaw; - - is >> id1 >> id2 >> x >> y >> yaw; - Matrix m = eye(3); - is >> m(0, 0) >> m(0, 1) >> m(1, 1) >> m(2, 2) >> m(0, 2) >> m(1, 2); - m(2, 0) = m(0, 2); - m(2, 1) = m(1, 2); - m(1, 0) = m(0, 1); - - // optional filter - if (maxID && (id1 >= maxID || id2 >= maxID)) - continue; - - Pose2 l1Xl2(x, y, yaw); - - // SharedNoiseModel noise = noiseModel::Gaussian::Covariance(m, smart); - if (!model) { - Vector variances = Vector_(3, m(0, 0), m(1, 1), m(2, 2)); - model = noiseModel::Diagonal::Variances(variances, smart); - } - - if (addNoise) - l1Xl2 = l1Xl2.retract((*model)->sample()); - - // Insert vertices if pure odometry file - if (!poses->exists(id1)) - poses->insert(id1, Pose2()); - if (!poses->exists(id2)) - poses->insert(id2, poses->at(id1) * l1Xl2); - - pose2SLAM::Graph::sharedFactor factor( - new pose2SLAM::Odometry(id1, id2, l1Xl2, *model)); - graph->push_back(factor); - } - is.ignore(LINESIZE, '\n'); - } - - cout << "load2D read a graph file with " << poses->size() - << " vertices and " << graph->nrFactors() << " factors" << endl; - - return make_pair(graph, poses); - } - - /* ************************************************************************* */ - void save2D(const pose2SLAM::Graph& graph, const Values& config, - const SharedDiagonal model, const string& filename) { - - fstream stream(filename.c_str(), fstream::out); - - // save poses - BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, config) - { - const Pose2& pose = dynamic_cast(key_value.value); - stream << "VERTEX2 " << key_value.key << " " << pose.x() << " " - << pose.y() << " " << pose.theta() << endl; - } - - // save edges - Matrix R = model->R(); - Matrix RR = trans(R) * R; //prod(trans(R),R); - BOOST_FOREACH(boost::shared_ptr factor_, graph) - { - boost::shared_ptr factor = - boost::dynamic_pointer_cast(factor_); - if (!factor) - continue; - - Pose2 pose = factor->measured().inverse(); - stream << "EDGE2 " << factor->key2() << " " << factor->key1() << " " - << pose.x() << " " << pose.y() << " " << pose.theta() << " " - << RR(0, 0) << " " << RR(0, 1) << " " << RR(1, 1) << " " - << RR(2, 2) << " " << RR(0, 2) << " " << RR(1, 2) << endl; - } - - stream.close(); - } - - /* ************************************************************************* */ - bool load3D(const string& filename) { - ifstream is(filename.c_str()); - if (!is) - return false; - - while (is) { - char buf[LINESIZE]; - is.getline(buf, LINESIZE); - istringstream ls(buf); - string tag; - ls >> tag; - - if (tag == "VERTEX3") { - int id; - double x, y, z, roll, pitch, yaw; - ls >> id >> x >> y >> z >> roll >> pitch >> yaw; - } - } - is.clear(); /* clears the end-of-file and error flags */ - is.seekg(0, ios::beg); - - while (is) { - char buf[LINESIZE]; - is.getline(buf, LINESIZE); - istringstream ls(buf); - string tag; - ls >> tag; - - if (tag == "EDGE3") { - int id1, id2; - double x, y, z, roll, pitch, yaw; - ls >> id1 >> id2 >> x >> y >> z >> roll >> pitch >> yaw; - Matrix m = eye(6); - for (int i = 0; i < 6; i++) - for (int j = i; j < 6; j++) - ls >> m(i, j); - } - } - return true; - } + return make_pair("unknown", null_model); } + +/* ************************************************************************* */ +pair load2D( + pair > dataset, + int maxID, bool addNoise, bool smart) { + return load2D(dataset.first, dataset.second, maxID, addNoise, smart); +} + +/* ************************************************************************* */ +pair load2D( + const string& filename, boost::optional model, int maxID, + bool addNoise, bool smart) { + cout << "Will try to read " << filename << endl; + ifstream is(filename.c_str()); + if (!is) { + cout << "load2D: can not find the file!"; + exit(-1); + } + + pose2SLAM::Values::shared_ptr poses(new pose2SLAM::Values); + pose2SLAM::Graph::shared_ptr graph(new pose2SLAM::Graph); + + string tag; + + // load the poses + while (is) { + is >> tag; + + if ((tag == "VERTEX2") || (tag == "VERTEX")) { + int id; + double x, y, yaw; + is >> id >> x >> y >> yaw; + // optional filter + if (maxID && id >= maxID) + continue; + poses->insert(id, Pose2(x, y, yaw)); + } + is.ignore(LINESIZE, '\n'); + } + is.clear(); /* clears the end-of-file and error flags */ + is.seekg(0, ios::beg); + + // Create a sampler with random number generator + Sampler sampler(42u); + + // load the factors + while (is) { + is >> tag; + + if ((tag == "EDGE2") || (tag == "EDGE") || (tag == "ODOMETRY")) { + int id1, id2; + double x, y, yaw; + + is >> id1 >> id2 >> x >> y >> yaw; + Matrix m = eye(3); + is >> m(0, 0) >> m(0, 1) >> m(1, 1) >> m(2, 2) >> m(0, 2) >> m(1, 2); + m(2, 0) = m(0, 2); + m(2, 1) = m(1, 2); + m(1, 0) = m(0, 1); + + // optional filter + if (maxID && (id1 >= maxID || id2 >= maxID)) + continue; + + Pose2 l1Xl2(x, y, yaw); + + // SharedNoiseModel noise = noiseModel::Gaussian::Covariance(m, smart); + if (!model) { + Vector variances = Vector_(3, m(0, 0), m(1, 1), m(2, 2)); + model = noiseModel::Diagonal::Variances(variances, smart); + } + + if (addNoise) + l1Xl2 = l1Xl2.retract(sampler.sampleNewModel(*model)); + + // Insert vertices if pure odometry file + if (!poses->exists(id1)) + poses->insert(id1, Pose2()); + if (!poses->exists(id2)) + poses->insert(id2, poses->at(id1) * l1Xl2); + + pose2SLAM::Graph::sharedFactor factor( + new pose2SLAM::Odometry(id1, id2, l1Xl2, *model)); + graph->push_back(factor); + } + is.ignore(LINESIZE, '\n'); + } + + cout << "load2D read a graph file with " << poses->size() + << " vertices and " << graph->nrFactors() << " factors" << endl; + + return make_pair(graph, poses); +} + +/* ************************************************************************* */ +void save2D(const pose2SLAM::Graph& graph, const Values& config, + const SharedDiagonal model, const string& filename) { + + fstream stream(filename.c_str(), fstream::out); + + // save poses + BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, config) + { + const Pose2& pose = dynamic_cast(key_value.value); + stream << "VERTEX2 " << key_value.key << " " << pose.x() << " " + << pose.y() << " " << pose.theta() << endl; + } + + // save edges + Matrix R = model->R(); + Matrix RR = trans(R) * R; //prod(trans(R),R); + BOOST_FOREACH(boost::shared_ptr factor_, graph) + { + boost::shared_ptr factor = + boost::dynamic_pointer_cast(factor_); + if (!factor) + continue; + + Pose2 pose = factor->measured().inverse(); + stream << "EDGE2 " << factor->key2() << " " << factor->key1() << " " + << pose.x() << " " << pose.y() << " " << pose.theta() << " " + << RR(0, 0) << " " << RR(0, 1) << " " << RR(1, 1) << " " + << RR(2, 2) << " " << RR(0, 2) << " " << RR(1, 2) << endl; + } + + stream.close(); +} + +/* ************************************************************************* */ +bool load3D(const string& filename) { + ifstream is(filename.c_str()); + if (!is) + return false; + + while (is) { + char buf[LINESIZE]; + is.getline(buf, LINESIZE); + istringstream ls(buf); + string tag; + ls >> tag; + + if (tag == "VERTEX3") { + int id; + double x, y, z, roll, pitch, yaw; + ls >> id >> x >> y >> z >> roll >> pitch >> yaw; + } + } + is.clear(); /* clears the end-of-file and error flags */ + is.seekg(0, ios::beg); + + while (is) { + char buf[LINESIZE]; + is.getline(buf, LINESIZE); + istringstream ls(buf); + string tag; + ls >> tag; + + if (tag == "EDGE3") { + int id1, id2; + double x, y, z, roll, pitch, yaw; + ls >> id1 >> id2 >> x >> y >> z >> roll >> pitch >> yaw; + Matrix m = eye(6); + for (int i = 0; i < 6; i++) + for (int j = i; j < 6; j++) + ls >> m(i, j); + } + } + return true; +} +/* ************************************************************************* */ + +} // \namespace gtsam From 4de506a446f89bae1c83ce88bb760c52745fe139 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 22 Jun 2012 17:50:36 +0000 Subject: [PATCH 433/914] Added constructor from base model type --- gtsam/linear/SharedNoiseModel.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam/linear/SharedNoiseModel.h b/gtsam/linear/SharedNoiseModel.h index bc90fee49..c9b2de6d4 100644 --- a/gtsam/linear/SharedNoiseModel.h +++ b/gtsam/linear/SharedNoiseModel.h @@ -26,6 +26,7 @@ namespace gtsam { // note, deliberately not in noiseModel namespace /// @{ SharedNoiseModel() {} + SharedNoiseModel(const noiseModel::Base::shared_ptr& p): Base(p) {} SharedNoiseModel(const noiseModel::Robust::shared_ptr& p): Base(p) {} SharedNoiseModel(const noiseModel::Gaussian::shared_ptr& p): Base(p) {} SharedNoiseModel(const noiseModel::Diagonal::shared_ptr& p): Base(p) {} From 7a48a03b25d6c25a40d25b70034ca79904088d03 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 22 Jun 2012 18:26:05 +0000 Subject: [PATCH 434/914] targets, ignore --- .cproject | 328 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 169 insertions(+), 159 deletions(-) diff --git a/.cproject b/.cproject index cb05ca49e..0b06e9601 100644 --- a/.cproject +++ b/.cproject @@ -311,14 +311,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -345,6 +337,7 @@ make + tests/testBayesTree.run true false @@ -352,6 +345,7 @@ make + testBinaryBayesNet.run true false @@ -399,6 +393,7 @@ make + testSymbolicBayesNet.run true false @@ -406,6 +401,7 @@ make + tests/testSymbolicFactor.run true false @@ -413,6 +409,7 @@ make + testSymbolicFactorGraph.run true false @@ -428,11 +425,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -521,22 +527,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -553,6 +543,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -577,26 +583,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -681,26 +687,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -955,6 +961,7 @@ make + testGraph.run true false @@ -962,6 +969,7 @@ make + testJunctionTree.run true false @@ -969,6 +977,7 @@ make + testSymbolicBayesNetB.run true false @@ -1096,6 +1105,7 @@ make + testErrors.run true false @@ -1551,7 +1561,6 @@ make - testSimulated2DOriented.run true false @@ -1591,7 +1600,6 @@ make - testSimulated2D.run true false @@ -1599,7 +1607,6 @@ make - testSimulated3D.run true false @@ -1815,7 +1822,6 @@ make - tests/testGaussianISAM2 true false @@ -1837,102 +1843,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -1951,10 +1861,10 @@ make - -j2 + -j5 check true - false + true true @@ -2134,6 +2044,7 @@ cpack + -G DEB true false @@ -2141,6 +2052,7 @@ cpack + -G RPM true false @@ -2148,6 +2060,7 @@ cpack + -G TGZ true false @@ -2155,6 +2068,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2248,42 +2162,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap_gtsam + -j2 + timeRot3.run true true true - + make - -j5 - wrap + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2327,6 +2297,46 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + From 6f1ea87a00f8a8ace1a5aecec1b9794ee5c20438 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 22 Jun 2012 19:36:49 +0000 Subject: [PATCH 435/914] clean up noise model: Remove Shared[NoiseModel] classes and headers, typedef for backward compatibility in NoiseModel.h. Fix all tests and examples to create shared noise models through static functions in noise model classes. Fix MATLAB wrapper and examples as well. Add tests for MATLAB examples --- examples/CameraResectioning.cpp | 3 +- examples/LocalizationExample.cpp | 5 +- examples/OdometryExample.cpp | 5 +- examples/PlanarSLAMExample.cpp | 7 +- examples/Pose2SLAMExample.cpp | 7 +- examples/Pose2SLAMExample_advanced.cpp | 5 +- examples/Pose2SLAMExample_graph.cpp | 5 +- examples/Pose2SLAMwSPCG.cpp | 7 +- examples/VisualSLAMData.h | 6 +- gtsam.h | 72 ++++------- gtsam/linear/GaussianFactorGraph.h | 2 - gtsam/linear/HessianFactor.h | 1 - gtsam/linear/JacobianFactor.h | 2 +- gtsam/linear/KalmanFilter.cpp | 1 - gtsam/linear/KalmanFilter.h | 4 +- gtsam/linear/NoiseModel.cpp | 1 - gtsam/linear/NoiseModel.h | 36 +++--- gtsam/linear/SharedDiagonal.h | 88 ------------- gtsam/linear/SharedGaussian.h | 70 ---------- gtsam/linear/SharedNoiseModel.h | 121 ------------------ .../linear/tests/testGaussianFactorGraph.cpp | 28 ++-- .../linear/tests/testGaussianJunctionTree.cpp | 2 +- gtsam/linear/tests/testHessianFactor.cpp | 6 +- gtsam/linear/tests/testJacobianFactor.cpp | 14 +- gtsam/linear/tests/testKalmanFilter.cpp | 3 +- gtsam/linear/tests/testNoiseModel.cpp | 8 +- .../linear/tests/testSerializationLinear.cpp | 3 - gtsam/linear/tests/timeFactorOverhead.cpp | 6 +- gtsam/linear/tests/timeGaussianFactor.cpp | 2 +- gtsam/linear/tests/timeSLAMlike.cpp | 2 +- gtsam/nonlinear/NonlinearFactor.h | 2 +- gtsam/slam/tests/testGeneralSFMFactor.cpp | 12 +- .../testGeneralSFMFactor_Cal3Bundler.cpp | 2 +- gtsam/slam/tests/testPose2SLAM.cpp | 2 +- matlab/VisualISAMInitialize.m | 10 +- matlab/VisualISAM_gui.m | 1 + matlab/examples/LocalizationExample.m | 4 +- matlab/examples/OdometryExample.m | 4 +- matlab/examples/PlanarSLAMExample.m | 7 +- matlab/examples/PlanarSLAMExample_sampling.m | 8 +- matlab/examples/Pose2SLAMExample.m | 12 +- matlab/examples/Pose2SLAMExample_advanced.m | 6 +- matlab/examples/Pose2SLAMExample_circle.m | 2 +- matlab/examples/Pose2SLAMExample_graph.m | 5 +- matlab/examples/Pose2SLAMwSPCG.m | 6 +- matlab/examples/Pose3SLAMExample.m | 2 +- matlab/examples/Pose3SLAMExample_graph.m | 2 +- matlab/examples/SFMExample.m | 6 +- matlab/examples/StereoVOExample.m | 2 +- matlab/examples/StereoVOExample_large.m | 4 +- matlab/tests/testJacobianFactor.m | 4 +- matlab/tests/testKalmanFilter.m | 4 +- matlab/tests/testLocalizationExample.m | 49 +++++++ matlab/tests/testOdometryExample.m | 40 ++++++ matlab/tests/testPlanarSLAMExample.m | 68 ++++++++++ matlab/tests/testPose2SLAMExample.m | 60 +++++++++ matlab/tests/testPose3SLAMExample.m | 46 +++++++ matlab/tests/testSFMExample.m | 72 +++++++++++ matlab/tests/testStereoVOExample.m | 66 ++++++++++ matlab/tests/testVisualISAMExample.m | 53 ++++++++ matlab/tests/test_gtsam.m | 24 ++++ tests/smallExample.cpp | 8 +- tests/testGaussianFactor.cpp | 2 +- tests/testGaussianFactorGraphB.cpp | 10 +- tests/testGaussianISAM.cpp | 6 +- tests/testGaussianISAM2.cpp | 10 +- tests/testGaussianJunctionTreeB.cpp | 8 +- tests/testGradientDescentOptimizer.cpp | 6 +- tests/testGraph.cpp | 2 +- tests/testInferenceB.cpp | 4 +- tests/testNonlinearFactor.cpp | 6 +- tests/testNonlinearOptimizer.cpp | 6 +- tests/testRot3Optimization.cpp | 4 +- tests/testSimulated2DOriented.cpp | 2 +- tests/timeMultifrontalOnDataset.cpp | 2 +- tests/timeSequentialOnDataset.cpp | 2 +- wrap/matlab.h | 27 +++- 77 files changed, 708 insertions(+), 504 deletions(-) delete mode 100644 gtsam/linear/SharedDiagonal.h delete mode 100644 gtsam/linear/SharedGaussian.h delete mode 100644 gtsam/linear/SharedNoiseModel.h create mode 100644 matlab/tests/testLocalizationExample.m create mode 100644 matlab/tests/testOdometryExample.m create mode 100644 matlab/tests/testPlanarSLAMExample.m create mode 100644 matlab/tests/testPose2SLAMExample.m create mode 100644 matlab/tests/testPose3SLAMExample.m create mode 100644 matlab/tests/testSFMExample.m create mode 100644 matlab/tests/testStereoVOExample.m create mode 100644 matlab/tests/testVisualISAMExample.m diff --git a/examples/CameraResectioning.cpp b/examples/CameraResectioning.cpp index 277c78ee0..4133d1e1e 100644 --- a/examples/CameraResectioning.cpp +++ b/examples/CameraResectioning.cpp @@ -22,6 +22,7 @@ #include using namespace gtsam; +using namespace gtsam::noiseModel; using symbol_shorthand::X; /** @@ -69,7 +70,7 @@ int main(int argc, char* argv[]) { /* 2. add factors to the graph */ // add measurement factors - SharedDiagonal measurementNoise = sharedSigmas(Vector_(2, 0.5, 0.5)); + SharedDiagonal measurementNoise = Diagonal::Sigmas(Vector_(2, 0.5, 0.5)); boost::shared_ptr factor; graph.push_back( boost::make_shared(measurementNoise, X(1), calib, diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index caa87e48f..39f8de8a6 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -27,6 +27,7 @@ using namespace std; using namespace gtsam; +using namespace gtsam::noiseModel; /** * UnaryFactor @@ -63,12 +64,12 @@ int main(int argc, char** argv) { // add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta graph.addOdometry(1, 2, odometry, odometryNoise); graph.addOdometry(2, 3, odometry, odometryNoise); // add unary measurement factors, like GPS, on all three poses - SharedDiagonal noiseModel(Vector_(2, 0.1, 0.1)); // 10cm std on x,y + SharedDiagonal noiseModel = Diagonal::Sigmas(Vector_(2, 0.1, 0.1)); // 10cm std on x,y graph.push_back(boost::make_shared(1, 0, 0, noiseModel)); graph.push_back(boost::make_shared(2, 2, 0, noiseModel)); graph.push_back(boost::make_shared(3, 4, 0, noiseModel)); diff --git a/examples/OdometryExample.cpp b/examples/OdometryExample.cpp index 3c00aca81..87844dfbc 100644 --- a/examples/OdometryExample.cpp +++ b/examples/OdometryExample.cpp @@ -26,6 +26,7 @@ using namespace std; using namespace gtsam; +using namespace gtsam::noiseModel; /** * Example of a simple 2D localization example @@ -40,12 +41,12 @@ int main(int argc, char** argv) { // add a Gaussian prior on pose x_1 Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin - SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta + SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta graph.addPrior(1, priorMean, priorNoise); // add directly to graph // add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta graph.addOdometry(1, 2, odometry, odometryNoise); graph.addOdometry(2, 3, odometry, odometryNoise); diff --git a/examples/PlanarSLAMExample.cpp b/examples/PlanarSLAMExample.cpp index d58c8eb3e..2d739416a 100644 --- a/examples/PlanarSLAMExample.cpp +++ b/examples/PlanarSLAMExample.cpp @@ -23,6 +23,7 @@ using namespace std; using namespace gtsam; +using namespace gtsam::noiseModel; /** * Example of a simple 2D planar slam example with landmarls @@ -44,17 +45,17 @@ int main(int argc, char** argv) { // add a Gaussian prior on pose x_1 Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin - SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta + SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta graph.addPrior(i1, priorMean, priorNoise); // add directly to graph // add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta graph.addOdometry(i1, i2, odometry, odometryNoise); graph.addOdometry(i2, i3, odometry, odometryNoise); // create a noise model for the landmark measurements - SharedDiagonal measurementNoise(Vector_(2, 0.1, 0.2)); // 0.1 rad std on bearing, 20cm on range + SharedDiagonal measurementNoise = Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); // 0.1 rad std on bearing, 20cm on range // create the measurement values - indices are (pose id, landmark id) Rot2 bearing11 = Rot2::fromDegrees(45), diff --git a/examples/Pose2SLAMExample.cpp b/examples/Pose2SLAMExample.cpp index 8118004af..61bdb1bda 100644 --- a/examples/Pose2SLAMExample.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -22,6 +22,7 @@ using namespace std; using namespace gtsam; +using namespace gtsam::noiseModel; int main(int argc, char** argv) { @@ -30,18 +31,18 @@ int main(int argc, char** argv) { // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); + SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); graph.addPrior(1, priorMean, priorNoise); // 2b. Add odometry factors - SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); + SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0), odometryNoise); graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); // 2c. Add pose constraint - SharedDiagonal model(Vector_(3, 0.2, 0.2, 0.1)); + SharedDiagonal model = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), model); // print diff --git a/examples/Pose2SLAMExample_advanced.cpp b/examples/Pose2SLAMExample_advanced.cpp index 083585c73..f727e27e2 100644 --- a/examples/Pose2SLAMExample_advanced.cpp +++ b/examples/Pose2SLAMExample_advanced.cpp @@ -29,6 +29,7 @@ using namespace std; using namespace gtsam; +using namespace gtsam::noiseModel; int main(int argc, char** argv) { /* 1. create graph container and add factors to it */ @@ -36,11 +37,11 @@ int main(int argc, char** argv) { /* 2.a add prior */ Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta + SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta graph.addPrior(1, priorMean, priorNoise); // add directly to graph /* 2.b add odometry */ - SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) graph.addOdometry(1, 2, odometry, odometryNoise); graph.addOdometry(2, 3, odometry, odometryNoise); diff --git a/examples/Pose2SLAMExample_graph.cpp b/examples/Pose2SLAMExample_graph.cpp index 6abeceb55..4dcdbea08 100644 --- a/examples/Pose2SLAMExample_graph.cpp +++ b/examples/Pose2SLAMExample_graph.cpp @@ -24,6 +24,7 @@ using namespace std; using namespace gtsam; +using namespace gtsam::noiseModel; int main(int argc, char** argv) { @@ -31,13 +32,13 @@ int main(int argc, char** argv) { // we are in build/examples, data is in examples/Data pose2SLAM::Graph::shared_ptr graph ; pose2SLAM::Values::shared_ptr initial; - SharedDiagonal model(Vector_(3, 0.05, 0.05, 5.0*M_PI/180.0)); + SharedDiagonal model = Diagonal::Sigmas(Vector_(3, 0.05, 0.05, 5.0*M_PI/180.0)); boost::tie(graph,initial) = load2D("../../examples/Data/w100-odom.graph",model); initial->print("Initial estimate:\n"); // Add a Gaussian prior on first poses Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise(Vector_(3, 0.01, 0.01, 0.01)); + SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.01, 0.01, 0.01)); graph->addPrior(0, priorMean, priorNoise); // Single Step Optimization using Levenberg-Marquardt diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index ddf0a7ad0..53566e7e8 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -26,6 +26,7 @@ using namespace std; using namespace gtsam; +using namespace gtsam::noiseModel; /* ************************************************************************* */ int main(void) { @@ -35,18 +36,18 @@ int main(void) { // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); + SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); graph.addPrior(1, priorMean, priorNoise); // 2b. Add odometry factors - SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); + SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); // 2c. Add pose constraint - SharedDiagonal constraintUncertainty(Vector_(3, 0.2, 0.2, 0.1)); + SharedDiagonal constraintUncertainty = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); // print diff --git a/examples/VisualSLAMData.h b/examples/VisualSLAMData.h index b96c24295..5416b3d43 100644 --- a/examples/VisualSLAMData.h +++ b/examples/VisualSLAMData.h @@ -73,7 +73,7 @@ struct VisualSLAMExampleData { data.odometry = data.poses[0].between(data.poses[1]); // Simulated measurements, possibly with Gaussian noise - data.noiseZ = gtsam::sharedSigma(2, 1.0); + data.noiseZ = gtsam::noiseModel::Isotropic::Sigma(2, 1.0); for (size_t i=0; isample()))*/); // you can add noise as desired } } - data.noiseX = gtsam::sharedSigmas(gtsam::Vector_(6, 0.001, 0.001, 0.001, 0.1, 0.1, 0.1)); - data.noiseL = gtsam::sharedSigma(3, 0.1); + data.noiseX = gtsam::noiseModel::Diagonal::Sigmas(gtsam::Vector_(6, 0.001, 0.001, 0.001, 0.1, 0.1, 0.1)); + data.noiseL = gtsam::noiseModel::Isotropic::Sigma(3, 0.1); return data; } diff --git a/gtsam.h b/gtsam.h index 21ee927db..78607651b 100644 --- a/gtsam.h +++ b/gtsam.h @@ -679,6 +679,9 @@ class VariableIndex { #include namespace noiseModel { +class Base { +}; + class Gaussian { static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); static gtsam::noiseModel::Gaussian* Covariance(Matrix R); @@ -707,29 +710,6 @@ class Unit { }; }///\namespace noiseModel -// TODO: smart flag not supported. Default argument is not wrapped properly yet -class SharedNoiseModel { - static gtsam::SharedNoiseModel SqrtInformation(Matrix R); - static gtsam::SharedNoiseModel Covariance(Matrix covariance); - static gtsam::SharedNoiseModel Sigmas(Vector sigmas); - static gtsam::SharedNoiseModel Variances(Vector variances); - static gtsam::SharedNoiseModel Precisions(Vector precisions); - static gtsam::SharedNoiseModel Sigma(size_t dim, double sigma); - static gtsam::SharedNoiseModel Variance(size_t dim, double variance); - static gtsam::SharedNoiseModel Precision(size_t dim, double precision); - static gtsam::SharedNoiseModel Unit(size_t dim); - void print(string s) const; -}; - -class SharedGaussian { - SharedGaussian(Matrix covariance); - void print(string s) const; -}; - -class SharedDiagonal { - SharedDiagonal(Vector sigmas); - void print(string s) const; -}; class Sampler { Sampler(gtsam::noiseModel::Diagonal* model, int seed); @@ -789,11 +769,11 @@ class JacobianFactor { JacobianFactor(); JacobianFactor(Vector b_in); JacobianFactor(size_t i1, Matrix A1, Vector b, - const gtsam::SharedDiagonal& model); + const gtsam::noiseModel::Diagonal* model); JacobianFactor(size_t i1, Matrix A1, size_t i2, Matrix A2, Vector b, - const gtsam::SharedDiagonal& model); + const gtsam::noiseModel::Diagonal* model); JacobianFactor(size_t i1, Matrix A1, size_t i2, Matrix A2, size_t i3, Matrix A3, - Vector b, const gtsam::SharedDiagonal& model); + Vector b, const gtsam::noiseModel::Diagonal* model); void print(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; bool empty() const; @@ -881,13 +861,13 @@ class KalmanFilter { void print(string s) const; static size_t step(gtsam::GaussianDensity* p); gtsam::GaussianDensity* predict(gtsam::GaussianDensity* p, Matrix F, - Matrix B, Vector u, const gtsam::SharedDiagonal& modelQ); + Matrix B, Vector u, const gtsam::noiseModel::Diagonal* modelQ); gtsam::GaussianDensity* predictQ(gtsam::GaussianDensity* p, Matrix F, Matrix B, Vector u, Matrix Q); gtsam::GaussianDensity* predict2(gtsam::GaussianDensity* p, Matrix A0, - Matrix A1, Vector b, const gtsam::SharedDiagonal& model); + Matrix A1, Vector b, const gtsam::noiseModel::Diagonal* model); gtsam::GaussianDensity* update(gtsam::GaussianDensity* p, Matrix H, - Vector z, const gtsam::SharedDiagonal& model); + Vector z, const gtsam::noiseModel::Diagonal* model); gtsam::GaussianDensity* updateQ(gtsam::GaussianDensity* p, Matrix H, Vector z, Matrix Q); }; @@ -1024,10 +1004,10 @@ class Graph { const gtsam::Ordering& ordering) const; // pose2SLAM-specific - void addPrior(size_t key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); + void addPrior(size_t key, const gtsam::Pose2& pose, const gtsam::noiseModel::Base* noiseModel); void addPoseConstraint(size_t key, const gtsam::Pose2& pose); - void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); - void addConstraint(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); + void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::noiseModel::Base* noiseModel); + void addConstraint(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::noiseModel::Base* noiseModel); pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate) const; pose2SLAM::Values optimizeSPCG(const pose2SLAM::Values& initialEstimate) const; gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; @@ -1075,8 +1055,8 @@ class Graph { const gtsam::Ordering& ordering) const; // pose3SLAM-specific - void addPrior(size_t key, const gtsam::Pose3& p, const gtsam::SharedNoiseModel& model); - void addConstraint(size_t key1, size_t key2, const gtsam::Pose3& z, const gtsam::SharedNoiseModel& model); + void addPrior(size_t key, const gtsam::Pose3& p, const gtsam::noiseModel::Base* model); + void addConstraint(size_t key1, size_t key2, const gtsam::Pose3& z, const gtsam::noiseModel::Base* model); void addHardConstraint(size_t i, const gtsam::Pose3& p); pose3SLAM::Values optimize(const pose3SLAM::Values& initialEstimate) const; gtsam::Marginals marginals(const pose3SLAM::Values& solution) const; @@ -1123,19 +1103,19 @@ class Graph { const gtsam::Ordering& ordering) const; // planarSLAM-specific - void addPrior(size_t key, const gtsam::Pose2& pose, const gtsam::SharedNoiseModel& noiseModel); + void addPrior(size_t key, const gtsam::Pose2& pose, const gtsam::noiseModel::Base* noiseModel); void addPoseConstraint(size_t key, const gtsam::Pose2& pose); - void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::SharedNoiseModel& noiseModel); - void addBearing(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, const gtsam::SharedNoiseModel& noiseModel); - void addRange(size_t poseKey, size_t pointKey, double range, const gtsam::SharedNoiseModel& noiseModel); - void addBearingRange(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing,double range, const gtsam::SharedNoiseModel& noiseModel); + void addOdometry(size_t key1, size_t key2, const gtsam::Pose2& odometry, const gtsam::noiseModel::Base* noiseModel); + void addBearing(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, const gtsam::noiseModel::Base* noiseModel); + void addRange(size_t poseKey, size_t pointKey, double range, const gtsam::noiseModel::Base* noiseModel); + void addBearingRange(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing,double range, const gtsam::noiseModel::Base* noiseModel); planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate); gtsam::Marginals marginals(const planarSLAM::Values& solution) const; }; class Odometry { Odometry(size_t key1, size_t key2, const gtsam::Pose2& measured, - const gtsam::SharedNoiseModel& model); + const gtsam::noiseModel::Base* model); void print(string s) const; gtsam::GaussianFactor* linearize(const planarSLAM::Values& center, const gtsam::Ordering& ordering) const; @@ -1190,9 +1170,9 @@ class Graph { const gtsam::Ordering& ordering) const; // Measurements - void addMeasurement(const gtsam::Point2& measured, const gtsam::SharedNoiseModel& model, + void addMeasurement(const gtsam::Point2& measured, const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, const gtsam::Cal3_S2* K); - void addStereoMeasurement(const gtsam::StereoPoint2& measured, const gtsam::SharedNoiseModel& model, + void addStereoMeasurement(const gtsam::StereoPoint2& measured, const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, const gtsam::Cal3_S2Stereo* K); // Constraints @@ -1200,10 +1180,10 @@ class Graph { void addPointConstraint(size_t pointKey, const gtsam::Point3& p); // Priors - void addPosePrior(size_t poseKey, const gtsam::Pose3& p, const gtsam::SharedNoiseModel& model); - void addPointPrior(size_t pointKey, const gtsam::Point3& p, const gtsam::SharedNoiseModel& model); - void addRangeFactor(size_t poseKey, size_t pointKey, double range, const gtsam::SharedNoiseModel& model); - void addOdometry(size_t poseKey1, size_t poseKey2, const gtsam::Pose3& odometry, const gtsam::SharedNoiseModel& model); + void addPosePrior(size_t poseKey, const gtsam::Pose3& p, const gtsam::noiseModel::Base* model); + void addPointPrior(size_t pointKey, const gtsam::Point3& p, const gtsam::noiseModel::Base* model); + void addRangeFactor(size_t poseKey, size_t pointKey, double range, const gtsam::noiseModel::Base* model); + void addOdometry(size_t poseKey1, size_t poseKey2, const gtsam::Pose3& odometry, const gtsam::noiseModel::Base* model); visualSLAM::Values optimize(const visualSLAM::Values& initialEstimate, size_t verbosity) const; gtsam::Marginals marginals(const visualSLAM::Values& solution) const; diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 07d0c8774..b4878565e 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -31,8 +31,6 @@ namespace gtsam { - class SharedDiagonal; - /** return A*x-b * \todo Make this a member function - affects SubgraphPreconditioner */ template diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 4be0b950c..46955d45a 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -33,7 +33,6 @@ namespace gtsam { // Forward declarations class JacobianFactor; - class SharedDiagonal; class GaussianConditional; template class BayesNet; diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index f5c8bf29b..7e1381f38 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/gtsam/linear/KalmanFilter.cpp b/gtsam/linear/KalmanFilter.cpp index 0df9d99ce..987191254 100644 --- a/gtsam/linear/KalmanFilter.cpp +++ b/gtsam/linear/KalmanFilter.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include diff --git a/gtsam/linear/KalmanFilter.h b/gtsam/linear/KalmanFilter.h index 6df029b61..aeec47a39 100644 --- a/gtsam/linear/KalmanFilter.h +++ b/gtsam/linear/KalmanFilter.h @@ -18,6 +18,7 @@ */ #include +#include #ifndef KALMANFILTER_DEFAULT_FACTORIZATION #define KALMANFILTER_DEFAULT_FACTORIZATION QR @@ -25,9 +26,6 @@ namespace gtsam { - class SharedDiagonal; - class SharedGaussian; - /** * Kalman Filter class * diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index f212118c9..6d231748e 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -29,7 +29,6 @@ #include #include #include -#include static double inf = std::numeric_limits::infinity(); using namespace std; diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index 50e59a85d..c67828822 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -24,11 +24,10 @@ namespace gtsam { - class SharedDiagonal; // forward declare - /// All noise models live in the noiseModel namespace namespace noiseModel { + // Forward declaration class Gaussian; class Diagonal; class Constrained; @@ -157,7 +156,7 @@ namespace gtsam { * A Gaussian noise model created by specifying a covariance matrix. * @param smart check if can be simplified to derived class */ - static shared_ptr Covariance(const Matrix& covariance, bool smart=false); + static shared_ptr Covariance(const Matrix& covariance, bool smart = true); virtual void print(const std::string& name) const; virtual bool equals(const Base& expected, double tol=1e-9) const; @@ -199,13 +198,13 @@ namespace gtsam { * @param Ab is the m*(n+1) augmented system matrix [A b] * @return in-place QR factorization [R d]. Below-diagonal is undefined !!!!! */ - virtual SharedDiagonal QR(Matrix& Ab) const; + virtual boost::shared_ptr QR(Matrix& Ab) const; /** * Cholesky factorization * FIXME: this is never used anywhere */ - virtual SharedDiagonal Cholesky(Matrix& Ab, size_t nFrontals) const; + virtual boost::shared_ptr Cholesky(Matrix& Ab, size_t nFrontals) const; /** * Return R itself, but note that Whiten(H) is cheaper than R*H @@ -263,20 +262,20 @@ namespace gtsam { * A diagonal noise model created by specifying a Vector of sigmas, i.e. * standard devations, the diagonal of the square root covariance matrix. */ - static shared_ptr Sigmas(const Vector& sigmas, bool smart=false); + static shared_ptr Sigmas(const Vector& sigmas, bool smart = true); /** * A diagonal noise model created by specifying a Vector of variances, i.e. * i.e. the diagonal of the covariance matrix. * @param smart check if can be simplified to derived class */ - static shared_ptr Variances(const Vector& variances, bool smart = false); + static shared_ptr Variances(const Vector& variances, bool smart = true); /** * A diagonal noise model created by specifying a Vector of precisions, i.e. * i.e. the diagonal of the information matrix, i.e., weights */ - static shared_ptr Precisions(const Vector& precisions, bool smart = false) { + static shared_ptr Precisions(const Vector& precisions, bool smart = true) { return Variances(reciprocal(precisions), smart); } @@ -365,13 +364,13 @@ namespace gtsam { * standard devations, some of which might be zero */ static shared_ptr MixedSigmas(const Vector& mu, const Vector& sigmas, - bool smart = false); + bool smart = true); /** * A diagonal noise model created by specifying a Vector of * standard devations, some of which might be zero */ - static shared_ptr MixedSigmas(const Vector& sigmas, bool smart = false) { + static shared_ptr MixedSigmas(const Vector& sigmas, bool smart = true) { return MixedSigmas(repeat(sigmas.size(), 1000.0), sigmas, smart); } @@ -380,7 +379,7 @@ namespace gtsam { * standard devations, some of which might be zero */ static shared_ptr MixedSigmas(double m, const Vector& sigmas, - bool smart = false) { + bool smart = true) { return MixedSigmas(repeat(sigmas.size(), m), sigmas, smart); } @@ -442,7 +441,7 @@ namespace gtsam { /** * Apply QR factorization to the system [A b], taking into account constraints */ - virtual SharedDiagonal QR(Matrix& Ab) const; + virtual Diagonal::shared_ptr QR(Matrix& Ab) const; /** * Check constrained is always true @@ -493,18 +492,18 @@ namespace gtsam { /** * An isotropic noise model created by specifying a standard devation sigma */ - static shared_ptr Sigma(size_t dim, double sigma, bool smart = false); + static shared_ptr Sigma(size_t dim, double sigma, bool smart = true); /** * An isotropic noise model created by specifying a variance = sigma^2. * @param smart check if can be simplified to derived class */ - static shared_ptr Variance(size_t dim, double variance, bool smart = false); + static shared_ptr Variance(size_t dim, double variance, bool smart = true); /** * An isotropic noise model created by specifying a precision */ - static shared_ptr Precision(size_t dim, double precision, bool smart = false) { + static shared_ptr Precision(size_t dim, double precision, bool smart = true) { return Variance(dim, 1.0/precision, smart); } @@ -718,6 +717,13 @@ namespace gtsam { } // namespace noiseModel + /** Note, deliberately not in noiseModel namespace. + * Deprecated. Only for compatibility with previous version. + */ + typedef noiseModel::Base::shared_ptr SharedNoiseModel; + typedef noiseModel::Gaussian::shared_ptr SharedGaussian; + typedef noiseModel::Diagonal::shared_ptr SharedDiagonal; + } // namespace gtsam diff --git a/gtsam/linear/SharedDiagonal.h b/gtsam/linear/SharedDiagonal.h deleted file mode 100644 index f57d6d726..000000000 --- a/gtsam/linear/SharedDiagonal.h +++ /dev/null @@ -1,88 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 SharedDiagonal.h - * @brief Class that wraps a shared noise model with diagonal covariance - * @author Frank Dellaert - * @date Jan 22, 2010 - */ - -#pragma once - -#include - -namespace gtsam { // note, deliberately not in noiseModel namespace - - /** - * A useful convenience class to refer to a shared Diagonal model - * There are (somewhat dangerous) constructors from Vector and pair - * that call Sigmas and Sigma, respectively. - */ - class SharedDiagonal: public noiseModel::Diagonal::shared_ptr { - public: - - /// @name Standard Constructors - /// @{ - - SharedDiagonal() { - } - SharedDiagonal(const noiseModel::Diagonal::shared_ptr& p) : - noiseModel::Diagonal::shared_ptr(p) { - } - SharedDiagonal(const noiseModel::Constrained::shared_ptr& p) : - noiseModel::Diagonal::shared_ptr(p) { - } - SharedDiagonal(const noiseModel::Isotropic::shared_ptr& p) : - noiseModel::Diagonal::shared_ptr(p) { - } - SharedDiagonal(const noiseModel::Unit::shared_ptr& p) : - noiseModel::Diagonal::shared_ptr(p) { - } - SharedDiagonal(const Vector& sigmas) : - noiseModel::Diagonal::shared_ptr(noiseModel::Diagonal::Sigmas(sigmas)) { - } - - /// @} - /// @name Print - /// @{ - - /// Print - inline void print(const std::string &s) const { (*this)->print(s); } - - /** Serialization function */ - friend class boost::serialization::access; - template - void serialize(ARCHIVE & ar, const unsigned int version) { - ar & boost::serialization::make_nvp("SharedDiagonal", - boost::serialization::base_object(*this)); - } - }; - - // TODO: make these the ones really used in unit tests - inline SharedDiagonal sharedSigmas(const Vector& sigmas) { - return noiseModel::Diagonal::Sigmas(sigmas); - } - inline SharedDiagonal sharedSigma(size_t dim, double sigma) { - return noiseModel::Isotropic::Sigma(dim, sigma); - } - inline SharedDiagonal sharedPrecisions(const Vector& precisions) { - return noiseModel::Diagonal::Precisions(precisions); - } - inline SharedDiagonal sharedPrecision(size_t dim, double precision) { - return noiseModel::Isotropic::Precision(dim, precision); - } - inline SharedDiagonal sharedUnit(size_t dim) { - return noiseModel::Unit::Create(dim); - } - -} - diff --git a/gtsam/linear/SharedGaussian.h b/gtsam/linear/SharedGaussian.h deleted file mode 100644 index a3154bac1..000000000 --- a/gtsam/linear/SharedGaussian.h +++ /dev/null @@ -1,70 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 SharedGaussian.h - * @brief Class that wraps a shared Gaussian noise model - * @author Frank Dellaert - * @date Jan 22, 2010 - */ - -#pragma once - -#include -#include - -namespace gtsam { // note, deliberately not in noiseModel namespace - - /** - * A useful convenience class to refer to a shared Gaussian model - * Also needed to make noise models in matlab - */ - class SharedGaussian: public SharedNoiseModel { - public: - - typedef SharedNoiseModel Base; - - SharedGaussian() {} - SharedGaussian(const noiseModel::Gaussian::shared_ptr& p) : Base(p) {} - SharedGaussian(const noiseModel::Diagonal::shared_ptr& p) : Base(p) {} - SharedGaussian(const noiseModel::Constrained::shared_ptr& p) : Base(p) {} - SharedGaussian(const noiseModel::Isotropic::shared_ptr& p) : Base(p) {} - SharedGaussian(const noiseModel::Unit::shared_ptr& p) : Base(p) {} - - // Define GTSAM_MAGIC_GAUSSIAN to have access to slightly - // dangerous and non-shared (inefficient, wasteful) noise models. - // Intended to be used only in tests (if you must) and the MATLAB wrapper -#ifdef GTSAM_MAGIC_GAUSSIAN - SharedGaussian(const Matrix& covariance) - : Base(noiseModel::Gaussian::Covariance(covariance)) {} - SharedGaussian(const Vector& sigmas) - : Base(noiseModel::Diagonal::Sigmas(sigmas)) {} -#endif - -// Define GTSAM_DANGEROUS_GAUSSIAN to have access to bug-prone fixed dimension Gaussians -// Not intended for human use, only for backwards compatibility of old unit tests -#ifdef GTSAM_DANGEROUS_GAUSSIAN - SharedGaussian(const double& s) : - Base(noiseModel::Isotropic::Sigma(GTSAM_DANGEROUS_GAUSSIAN, s)) {} -#endif - - /// Print - inline void print(const std::string &s) const { (*this)->print(s); } - - /** Serialization function */ - friend class boost::serialization::access; - template - void serialize(ARCHIVE & ar, const unsigned int version) { - ar & boost::serialization::make_nvp("SharedGaussian", - boost::serialization::base_object(*this)); - } - }; -} diff --git a/gtsam/linear/SharedNoiseModel.h b/gtsam/linear/SharedNoiseModel.h deleted file mode 100644 index c9b2de6d4..000000000 --- a/gtsam/linear/SharedNoiseModel.h +++ /dev/null @@ -1,121 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -#pragma once - -#include - -namespace gtsam { // note, deliberately not in noiseModel namespace - - /** - * Just a convenient class to generate shared pointers to a noise model - */ - struct SharedNoiseModel: public noiseModel::Base::shared_ptr { - - typedef noiseModel::Base::shared_ptr Base; - - /// @name Standard Constructors - /// @{ - - SharedNoiseModel() {} - SharedNoiseModel(const noiseModel::Base::shared_ptr& p): Base(p) {} - SharedNoiseModel(const noiseModel::Robust::shared_ptr& p): Base(p) {} - SharedNoiseModel(const noiseModel::Gaussian::shared_ptr& p): Base(p) {} - SharedNoiseModel(const noiseModel::Diagonal::shared_ptr& p): Base(p) {} - SharedNoiseModel(const noiseModel::Constrained::shared_ptr& p): Base(p) {} - SharedNoiseModel(const noiseModel::Isotropic::shared_ptr& p): Base(p) {} - SharedNoiseModel(const noiseModel::Unit::shared_ptr& p): Base(p) {} - - /// @} - /// @name Dangerous constructors - /// @{ - - #ifdef GTSAM_MAGIC_GAUSSIAN - SharedNoiseModel(const Matrix& covariance) : - Base(boost::static_pointer_cast( - noiseModel::Gaussian::Covariance(covariance))) {} - - SharedNoiseModel(const Vector& sigmas) : - Base(boost::static_pointer_cast( - noiseModel::Diagonal::Sigmas(sigmas))) {} - #endif - - // Define GTSAM_DANGEROUS_GAUSSIAN to have access to bug-prone fixed dimension Gaussians - // Not intended for human use, only for backwards compatibility of old unit tests - #ifdef GTSAM_DANGEROUS_GAUSSIAN - SharedNoiseModel(const double& s) : - Base(boost::static_pointer_cast( - noiseModel::Isotropic::Sigma(GTSAM_DANGEROUS_GAUSSIAN, s))) {} - #endif - - /// @} - /// @name Print - /// @{ - - /// Print - inline void print(const std::string &s) const { (*this)->print(s); } - - /// @} - /// @name Static syntactic sugar (should only be used with the MATLAB interface) - /// @{ - - static inline SharedNoiseModel SqrtInformation(const Matrix& R) { - return noiseModel::Gaussian::SqrtInformation(R); - } - - static inline SharedNoiseModel Covariance(const Matrix& covariance, bool smart=false) { - return noiseModel::Gaussian::Covariance(covariance, smart); - } - - static inline SharedNoiseModel Sigmas(const Vector& sigmas, bool smart=false) { - return noiseModel::Diagonal::Sigmas(sigmas, smart); - } - - static inline SharedNoiseModel Variances(const Vector& variances, bool smart=false) { - return noiseModel::Diagonal::Variances(variances, smart); - } - - static inline SharedNoiseModel Precisions(const Vector& precisions, bool smart=false) { - return noiseModel::Diagonal::Precisions(precisions, smart); - } - - static inline SharedNoiseModel Sigma(size_t dim, double sigma, bool smart=false) { - return noiseModel::Isotropic::Sigma(dim, sigma, smart); - } - - static inline SharedNoiseModel Variance(size_t dim, double variance, bool smart=false) { - return noiseModel::Isotropic::Variance(dim, variance, smart); - } - - static inline SharedNoiseModel Precision(size_t dim, double precision, bool smart=false) { - return noiseModel::Isotropic::Precision(dim, precision, smart); - } - - static inline SharedNoiseModel Unit(size_t dim) { - return noiseModel::Unit::Create(dim); - } - - /// @} - /// @name Serialization - /// @{ - - /** Serialization function */ - friend class boost::serialization::access; - template - void serialize(ARCHIVE & ar, const unsigned int version) { - ar & boost::serialization::make_nvp("SharedNoiseModel", - boost::serialization::base_object(*this)); - } - - /// @} - - }; -} diff --git a/gtsam/linear/tests/testGaussianFactorGraph.cpp b/gtsam/linear/tests/testGaussianFactorGraph.cpp index 6bb4a6348..37aa440ff 100644 --- a/gtsam/linear/tests/testGaussianFactorGraph.cpp +++ b/gtsam/linear/tests/testGaussianFactorGraph.cpp @@ -36,7 +36,7 @@ static const Index _x0_=0, _x1_=1, _x2_=2, _x3_=3, _x4_=4, _x_=5, _y_=6, _l1_=7, #endif static SharedDiagonal - sigma0_1 = sharedSigma(2,0.1), sigma_02 = sharedSigma(2,0.2), + sigma0_1 = noiseModel::Isotropic::Sigma(2,0.1), sigma_02 = noiseModel::Isotropic::Sigma(2,0.2), constraintModel = noiseModel::Constrained::All(2); /* ************************************************************************* */ @@ -234,26 +234,26 @@ TEST( NonlinearFactorGraph, combine2){ A11(1,0) = 0; A11(1,1) = 1; Vector b(2); b(0) = 2; b(1) = -1; - JacobianFactor::shared_ptr f1(new JacobianFactor(_x1_, A11, b*sigma1, sharedSigma(2,sigma1))); + JacobianFactor::shared_ptr f1(new JacobianFactor(_x1_, A11, b*sigma1, noiseModel::Isotropic::Sigma(2,sigma1))); double sigma2 = 0.5; A11(0,0) = 1; A11(0,1) = 0; A11(1,0) = 0; A11(1,1) = -1; b(0) = 4 ; b(1) = -5; - JacobianFactor::shared_ptr f2(new JacobianFactor(_x1_, A11, b*sigma2, sharedSigma(2,sigma2))); + JacobianFactor::shared_ptr f2(new JacobianFactor(_x1_, A11, b*sigma2, noiseModel::Isotropic::Sigma(2,sigma2))); double sigma3 = 0.25; A11(0,0) = 1; A11(0,1) = 0; A11(1,0) = 0; A11(1,1) = -1; b(0) = 3 ; b(1) = -88; - JacobianFactor::shared_ptr f3(new JacobianFactor(_x1_, A11, b*sigma3, sharedSigma(2,sigma3))); + JacobianFactor::shared_ptr f3(new JacobianFactor(_x1_, A11, b*sigma3, noiseModel::Isotropic::Sigma(2,sigma3))); // TODO: find a real sigma value for this example double sigma4 = 0.1; A11(0,0) = 6; A11(0,1) = 0; A11(1,0) = 0; A11(1,1) = 7; b(0) = 5 ; b(1) = -6; - JacobianFactor::shared_ptr f4(new JacobianFactor(_x1_, A11*sigma4, b*sigma4, sharedSigma(2,sigma4))); + JacobianFactor::shared_ptr f4(new JacobianFactor(_x1_, A11*sigma4, b*sigma4, noiseModel::Isotropic::Sigma(2,sigma4))); vector lfg; lfg.push_back(f1); @@ -286,7 +286,7 @@ TEST( NonlinearFactorGraph, combine2){ TEST(GaussianFactor, linearFactorN){ Matrix I = eye(2); vector f; - SharedDiagonal model = sharedSigma(2,1.0); + SharedDiagonal model = noiseModel::Isotropic::Sigma(2,1.0); f.push_back(JacobianFactor::shared_ptr(new JacobianFactor(_x1_, I, Vector_(2, 10.0, 5.0), model))); f.push_back(JacobianFactor::shared_ptr(new JacobianFactor(_x1_, -10 * I, @@ -374,7 +374,7 @@ TEST(GaussianFactor, eliminateFrontals) make_pair( 9, Matrix(Ab.block(0, 6, 4, 2))), make_pair(11, Matrix(Ab.block(0, 8, 4, 2))); Vector b1 = Ab.col(10).segment(0, 4); - JacobianFactor::shared_ptr factor1(new JacobianFactor(terms1, b1, sharedSigma(4, 0.5))); + JacobianFactor::shared_ptr factor1(new JacobianFactor(terms1, b1, noiseModel::Isotropic::Sigma(4, 0.5))); // Create second factor list > terms2; @@ -384,7 +384,7 @@ TEST(GaussianFactor, eliminateFrontals) make_pair(9, Matrix(Ab.block(4, 6, 4, 2))), make_pair(11,Matrix(Ab.block(4, 8, 4, 2))); Vector b2 = Ab.col(10).segment(4, 4); - JacobianFactor::shared_ptr factor2(new JacobianFactor(terms2, b2, sharedSigma(4, 0.5))); + JacobianFactor::shared_ptr factor2(new JacobianFactor(terms2, b2, noiseModel::Isotropic::Sigma(4, 0.5))); // Create third factor list > terms3; @@ -393,14 +393,14 @@ TEST(GaussianFactor, eliminateFrontals) make_pair(9, Matrix(Ab.block(8, 6, 4, 2))), make_pair(11,Matrix(Ab.block(8, 8, 4, 2))); Vector b3 = Ab.col(10).segment(8, 4); - JacobianFactor::shared_ptr factor3(new JacobianFactor(terms3, b3, sharedSigma(4, 0.5))); + JacobianFactor::shared_ptr factor3(new JacobianFactor(terms3, b3, noiseModel::Isotropic::Sigma(4, 0.5))); // Create fourth factor list > terms4; terms4 += make_pair(11, Matrix(Ab.block(12, 8, 2, 2))); Vector b4 = Ab.col(10).segment(12, 2); - JacobianFactor::shared_ptr factor4(new JacobianFactor(terms4, b4, sharedSigma(2, 0.5))); + JacobianFactor::shared_ptr factor4(new JacobianFactor(terms4, b4, noiseModel::Isotropic::Sigma(2, 0.5))); // Create factor graph GaussianFactorGraph factors; @@ -554,13 +554,13 @@ TEST(GaussianFactor, permuteWithInverse) inversePermutation[4] = 1; inversePermutation[5] = 0; - JacobianFactor actual(1, A1, 3, A2, 5, A3, b, sharedSigma(2, 1.0)); + JacobianFactor actual(1, A1, 3, A2, 5, A3, b, noiseModel::Isotropic::Sigma(2, 1.0)); GaussianFactorGraph actualFG; actualFG.push_back(JacobianFactor::shared_ptr(new JacobianFactor(actual))); VariableIndex actualIndex(actualFG); actual.permuteWithInverse(inversePermutation); // actualIndex.permute(*inversePermutation.inverse()); - JacobianFactor expected(4, A1, 2, A2, 0, A3, b, sharedSigma(2, 1.0)); + JacobianFactor expected(4, A1, 2, A2, 0, A3, b, noiseModel::Isotropic::Sigma(2, 1.0)); GaussianFactorGraph expectedFG; expectedFG.push_back(JacobianFactor::shared_ptr(new JacobianFactor(expected))); // GaussianVariableIndex expectedIndex(expectedFG); @@ -609,7 +609,7 @@ TEST(GaussianFactorGraph, sparseJacobian) { 4., 6.,32.).transpose(); GaussianFactorGraph gfg; - SharedDiagonal model = sharedSigma(2, 0.5); + SharedDiagonal model = noiseModel::Isotropic::Sigma(2, 0.5); gfg.add(0, Matrix_(2,3, 1., 2., 3., 5., 6., 7.), Vector_(2, 4., 8.), model); gfg.add(0, Matrix_(2,3, 9.,10., 0., 0., 0., 0.), 1, Matrix_(2,2, 11., 12., 14., 15.), Vector_(2, 13.,16.), model); @@ -628,7 +628,7 @@ TEST(GaussianFactorGraph, denseHessian) { // 0 0 0 14 15 16 GaussianFactorGraph gfg; - SharedDiagonal model = sharedUnit(2); + SharedDiagonal model = noiseModel::Unit::Create(2); gfg.add(0, Matrix_(2,3, 1., 2., 3., 5., 6., 7.), Vector_(2, 4., 8.), model); gfg.add(0, Matrix_(2,3, 9.,10., 0., 0., 0., 0.), 1, Matrix_(2,2, 11., 12., 14., 15.), Vector_(2, 13.,16.), model); diff --git a/gtsam/linear/tests/testGaussianJunctionTree.cpp b/gtsam/linear/tests/testGaussianJunctionTree.cpp index a10f80a4d..b49d7fff0 100644 --- a/gtsam/linear/tests/testGaussianJunctionTree.cpp +++ b/gtsam/linear/tests/testGaussianJunctionTree.cpp @@ -38,7 +38,7 @@ static const Index x2=0, x1=1, x3=2, x4=3; GaussianFactorGraph createChain() { typedef GaussianFactorGraph::sharedFactor Factor; - SharedDiagonal model(Vector_(1, 0.5)); + SharedDiagonal model = noiseModel::Isotropic::Sigma(1, 0.5); Factor factor1(new JacobianFactor(x2, Matrix_(1,1,1.), x1, Matrix_(1,1,1.), Vector_(1,1.), model)); Factor factor2(new JacobianFactor(x2, Matrix_(1,1,1.), x3, Matrix_(1,1,1.), Vector_(1,1.), model)); Factor factor3(new JacobianFactor(x3, Matrix_(1,1,1.), x4, Matrix_(1,1,1.), Vector_(1,1.), model)); diff --git a/gtsam/linear/tests/testHessianFactor.cpp b/gtsam/linear/tests/testHessianFactor.cpp index bd76fd1d0..9c2adcffa 100644 --- a/gtsam/linear/tests/testHessianFactor.cpp +++ b/gtsam/linear/tests/testHessianFactor.cpp @@ -93,7 +93,7 @@ TEST(HessianFactor, ConversionConstructor) { vector > meas; meas.push_back(make_pair(0, Ax2)); meas.push_back(make_pair(1, Al1x1)); - JacobianFactor combined(meas, b2, sigmas); + JacobianFactor combined(meas, b2, noiseModel::Diagonal::Sigmas(sigmas)); HessianFactor actual(combined); @@ -468,7 +468,7 @@ TEST(HessianFactor, eliminate2 ) vector > meas; meas.push_back(make_pair(0, Ax2)); meas.push_back(make_pair(1, Al1x1)); - JacobianFactor combined(meas, b2, sigmas); + JacobianFactor combined(meas, b2, noiseModel::Diagonal::Sigmas(sigmas)); // eliminate the combined factor HessianFactor::shared_ptr combinedLF_Chol(new HessianFactor(combined)); @@ -502,7 +502,7 @@ TEST(HessianFactor, eliminate2 ) 0.00, 1.00, +0.00, -1.00 )/sigma; Vector b1 = Vector_(2,0.0,0.894427); - JacobianFactor expectedLF(1, Bl1x1, b1, repeat(2,1.0)); + JacobianFactor expectedLF(1, Bl1x1, b1, noiseModel::Isotropic::Sigma(2,1.0)); EXPECT(assert_equal(HessianFactor(expectedLF), *actualFactor, 1.5e-3)); } diff --git a/gtsam/linear/tests/testJacobianFactor.cpp b/gtsam/linear/tests/testJacobianFactor.cpp index 0d46807b6..af1d02d1f 100644 --- a/gtsam/linear/tests/testJacobianFactor.cpp +++ b/gtsam/linear/tests/testJacobianFactor.cpp @@ -29,7 +29,7 @@ using namespace gtsam; static const Index _x0_=0, _x1_=1, _x2_=2, _x3_=3, _x4_=4, _x_=5, _y_=6, _l1_=7, _l11_=8; static SharedDiagonal - sigma0_1 = sharedSigma(2,0.1), sigma_02 = sharedSigma(2,0.2), + sigma0_1 = noiseModel::Isotropic::Sigma(2,0.1), sigma_02 = noiseModel::Isotropic::Sigma(2,0.2), constraintModel = noiseModel::Constrained::All(2); /* ************************************************************************* */ @@ -76,7 +76,7 @@ TEST(JacobianFactor, constructor2) JacobianFactor construct() { Matrix A = Matrix_(2,2, 1.,2.,3.,4.); Vector b = Vector_(2, 1.0, 2.0); - SharedDiagonal s = sharedSigmas(Vector_(2, 3.0, 4.0)); + SharedDiagonal s = noiseModel::Diagonal::Sigmas(Vector_(2, 3.0, 4.0)); JacobianFactor::shared_ptr shared( new JacobianFactor(0, A, b, s)); return *shared; @@ -86,7 +86,7 @@ TEST(JacobianFactor, return_value) { Matrix A = Matrix_(2,2, 1.,2.,3.,4.); Vector b = Vector_(2, 1.0, 2.0); - SharedDiagonal s = sharedSigmas(Vector_(2, 3.0, 4.0)); + SharedDiagonal s = noiseModel::Diagonal::Sigmas(Vector_(2, 3.0, 4.0)); JacobianFactor copied = construct(); EXPECT(assert_equal(b, copied.getb())); EXPECT(assert_equal(*s, *copied.get_model())); @@ -107,7 +107,7 @@ TEST(JabobianFactor, Hessian_conversion) { 1.2530, 2.1508, -0.8779, -1.8755, 0, 2.5858, 0.4789, -2.3943).finished(), (Vector(2) << -6.2929, -5.7941).finished(), - sharedUnit(2)); + noiseModel::Unit::Create(2)); JacobianFactor actual(hessian); @@ -202,7 +202,7 @@ TEST(JacobianFactor, eliminate2 ) vector > meas; meas.push_back(make_pair(_x2_, Ax2)); meas.push_back(make_pair(_l11_, Al1x1)); - JacobianFactor combined(meas, b2, sigmas); + JacobianFactor combined(meas, b2, noiseModel::Diagonal::Sigmas(sigmas)); // eliminate the combined factor GaussianConditional::shared_ptr actualCG_QR; @@ -236,7 +236,7 @@ TEST(JacobianFactor, eliminate2 ) 0.00, 1.00, +0.00, -1.00 )/sigma; Vector b1 = Vector_(2,0.0,0.894427); - JacobianFactor expectedLF(_l11_, Bl1x1, b1, repeat(2,1.0)); + JacobianFactor expectedLF(_l11_, Bl1x1, b1, noiseModel::Isotropic::Sigma(2,1.0)); EXPECT(assert_equal(expectedLF,*actualLF_QR,1e-3)); } @@ -304,7 +304,7 @@ TEST(JacobianFactor, CONSTRUCTOR_GaussianConditional ) // Call the constructor we are testing ! JacobianFactor actualLF(*CG); - JacobianFactor expectedLF(_x2_,R11,_l11_,S12,d, sigmas); + JacobianFactor expectedLF(_x2_,R11,_l11_,S12,d, noiseModel::Diagonal::Sigmas(sigmas)); EXPECT(assert_equal(expectedLF,actualLF,1e-5)); } diff --git a/gtsam/linear/tests/testKalmanFilter.cpp b/gtsam/linear/tests/testKalmanFilter.cpp index ca50c12e9..b45ac6a7b 100644 --- a/gtsam/linear/tests/testKalmanFilter.cpp +++ b/gtsam/linear/tests/testKalmanFilter.cpp @@ -18,8 +18,7 @@ */ #include -#include -#include +#include #include #include diff --git a/gtsam/linear/tests/testNoiseModel.cpp b/gtsam/linear/tests/testNoiseModel.cpp index 94a174543..9b53a3be1 100644 --- a/gtsam/linear/tests/testNoiseModel.cpp +++ b/gtsam/linear/tests/testNoiseModel.cpp @@ -25,8 +25,6 @@ using namespace boost::assign; #include #include #include -#include -#include using namespace std; using namespace gtsam; @@ -279,8 +277,8 @@ TEST(NoiseModel, QRNan ) TEST(NoiseModel, SmartCovariance ) { bool smart = true; - SharedGaussian expected = Unit::Create(3); - SharedGaussian actual = Gaussian::Covariance(eye(3), smart); + gtsam::SharedGaussian expected = Unit::Create(3); + gtsam::SharedGaussian actual = Gaussian::Covariance(eye(3), smart); EXPECT(assert_equal(*expected,*actual)); } @@ -297,7 +295,7 @@ TEST(NoiseModel, ScalarOrVector ) TEST(NoiseModel, WhitenInPlace) { Vector sigmas = Vector_(3, 0.1, 0.1, 0.1); - SharedDiagonal model(sigmas); + SharedDiagonal model = Diagonal::Sigmas(sigmas); Matrix A = eye(3); model->WhitenInPlace(A); Matrix expected = eye(3) * 10; diff --git a/gtsam/linear/tests/testSerializationLinear.cpp b/gtsam/linear/tests/testSerializationLinear.cpp index 8082d3626..a646773f2 100644 --- a/gtsam/linear/tests/testSerializationLinear.cpp +++ b/gtsam/linear/tests/testSerializationLinear.cpp @@ -22,9 +22,6 @@ #include #include #include -#include -#include -#include #include #include diff --git a/gtsam/linear/tests/timeFactorOverhead.cpp b/gtsam/linear/tests/timeFactorOverhead.cpp index a843efd84..5ca4ceb59 100644 --- a/gtsam/linear/tests/timeFactorOverhead.cpp +++ b/gtsam/linear/tests/timeFactorOverhead.cpp @@ -60,7 +60,7 @@ int main(int argc, char *argv[]) { blockGfgs.reserve(nTrials); for(size_t trial=0; trial combGfgs; for(size_t trial=0; trial > terms; terms.reserve(varsPerBlock); diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index e1cfb2bc3..21e3d17d7 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include diff --git a/gtsam/slam/tests/testGeneralSFMFactor.cpp b/gtsam/slam/tests/testGeneralSFMFactor.cpp index d6fcb5c5a..58f06c8d4 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor.cpp @@ -371,7 +371,7 @@ TEST( GeneralSFMFactor, optimize_varK_BA ) { graph.addCameraConstraint(0, cameras[0]); // Constrain the scale of the problem with a soft range factor of 1m between the cameras - graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 10.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, noiseModel::Isotropic::Sigma(1, 10.0))); const double reproj_error = 1e-5 ; @@ -386,8 +386,8 @@ TEST(GeneralSFMFactor, GeneralCameraPoseRange) { // Tests range factor between a GeneralCamera and a Pose3 Graph graph; graph.addCameraConstraint(0, GeneralCamera()); - graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 1.0))); - graph.add(PriorFactor(X(1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), sharedSigma(6, 1.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, noiseModel::Isotropic::Sigma(1, 1.0))); + graph.add(PriorFactor(X(1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), noiseModel::Isotropic::Sigma(6, 1.0))); Values init; init.insert(X(0), GeneralCamera()); @@ -410,9 +410,9 @@ TEST(GeneralSFMFactor, GeneralCameraPoseRange) { TEST(GeneralSFMFactor, CalibratedCameraPoseRange) { // Tests range factor between a CalibratedCamera and a Pose3 NonlinearFactorGraph graph; - graph.add(PriorFactor(X(0), CalibratedCamera(), sharedSigma(6, 1.0))); - graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 1.0))); - graph.add(PriorFactor(X(1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), sharedSigma(6, 1.0))); + graph.add(PriorFactor(X(0), CalibratedCamera(), noiseModel::Isotropic::Sigma(6, 1.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, noiseModel::Isotropic::Sigma(1, 1.0))); + graph.add(PriorFactor(X(1), Pose3(Rot3(), Point3(1.0, 0.0, 0.0)), noiseModel::Isotropic::Sigma(6, 1.0))); Values init; init.insert(X(0), CalibratedCamera()); diff --git a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp index 9afd8eff1..1b1ae5390 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp @@ -369,7 +369,7 @@ TEST( GeneralSFMFactor_Cal3Bundler, optimize_varK_BA ) { graph.addCameraConstraint(X(0), cameras[0]); // Constrain the scale of the problem with a soft range factor of 1m between the cameras - graph.add(RangeFactor(X(0), X(1), 2.0, sharedSigma(1, 10.0))); + graph.add(RangeFactor(X(0), X(1), 2.0, noiseModel::Isotropic::Sigma(1, 10.0))); const double reproj_error = 1e-5 ; diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 55558b106..96f5dad03 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -393,7 +393,7 @@ TEST_UNSAFE(Pose2SLAM, expmap ) } // Common measurement covariance -static SharedNoiseModel sigmas = sharedSigmas(Vector_(3,sx,sy,st)); +static SharedNoiseModel sigmas = noiseModel::Diagonal::Sigmas(Vector_(3,sx,sy,st)); /* ************************************************************************* */ // Very simple test establishing Ax-b \approx z-h(x) diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index 43e8162dd..01fdfe79c 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -6,10 +6,10 @@ function [noiseModels,isam,result] = VisualISAMInitialize(data,truth,options) isam = visualSLAMISAM(options.reorderInterval); %% Set Noise parameters -noiseModels.pose = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -noiseModels.odometry = gtsamSharedNoiseModel_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -noiseModels.point = gtsamSharedNoiseModel_Sigma(3, 0.1); -noiseModels.measurement = gtsamSharedNoiseModel_Sigma(2, 1.0); +noiseModels.pose = gtsamnoiseModelDiagonal_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.odometry = gtsamnoiseModelDiagonal_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.point = gtsamnoiseModelIsotropic_Sigma(3, 0.1); +noiseModels.measurement = gtsamnoiseModelIsotropic_Sigma(2, 1.0); %% Add constraints/priors % TODO: should not be from ground truth! @@ -62,5 +62,3 @@ result = isam.estimate(); if options.alwaysRelinearize % re-linearize isam.reorder_relinearize(); end - -cla; \ No newline at end of file diff --git a/matlab/VisualISAM_gui.m b/matlab/VisualISAM_gui.m index 5fd0cd1d9..cdb2ddbaf 100644 --- a/matlab/VisualISAM_gui.m +++ b/matlab/VisualISAM_gui.m @@ -234,6 +234,7 @@ initOptions(handles) % Initialize and plot [noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); +cla VisualISAMPlot(truth, data, isam, result, options) frame_i = 2; showFramei(hObject, handles) diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m index d9c374e39..a523c312d 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/LocalizationExample.m @@ -20,13 +20,13 @@ graph = pose2SLAMGraph; %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addOdometry(1, 2, odometry, odometryNoise); graph.addOdometry(2, 3, odometry, odometryNoise); %% Add three "GPS" measurements % We use Pose2 Priors here with high variance on theta -noiseModel = gtsamSharedNoiseModel_Sigmas([0.1; 0.1; 10]); +noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.1; 10]); graph.addPrior(1, gtsamPose2(0.0, 0.0, 0.0), noiseModel); graph.addPrior(2, gtsamPose2(2.0, 0.0, 0.0), noiseModel); graph.addPrior(3, gtsamPose2(4.0, 0.0, 0.0), noiseModel); diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index d6dae314d..e712e4e21 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -20,12 +20,12 @@ graph = pose2SLAMGraph; %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addOdometry(1, 2, odometry, odometryNoise); graph.addOdometry(2, 3, odometry, odometryNoise); diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index 2bf27d11c..27dc97a08 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -28,18 +28,18 @@ graph = planarSLAMGraph; %% Add prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); graph.addPrior(i1, priorMean, priorNoise); % add directly to graph %% Add odometry odometry = gtsamPose2(2.0, 0.0, 0.0); -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); graph.addOdometry(i1, i2, odometry, odometryNoise); graph.addOdometry(i2, i3, odometry, odometryNoise); %% Add bearing/range measurement factors degrees = pi/180; -noiseModel = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); +noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.2]); graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); @@ -75,6 +75,7 @@ end for i=1:3 plotPose2(pose{i},'g',P{i}) end +point = {}; for j=1:2 key = symbol('l',j); point{j} = result.point(key); diff --git a/matlab/examples/PlanarSLAMExample_sampling.m b/matlab/examples/PlanarSLAMExample_sampling.m index f4124e003..99429900f 100644 --- a/matlab/examples/PlanarSLAMExample_sampling.m +++ b/matlab/examples/PlanarSLAMExample_sampling.m @@ -15,22 +15,22 @@ i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); graph = planarSLAMGraph; priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); graph.addPrior(i1, priorMean, priorNoise); % add directly to graph odometry = gtsamPose2(2.0, 0.0, 0.0); -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); graph.addOdometry(i1, i2, odometry, odometryNoise); graph.addOdometry(i2, i3, odometry, odometryNoise); %% Except, for measurements we offer a choice j1 = symbol('l',1); j2 = symbol('l',2); degrees = pi/180; -noiseModel = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); +noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.2]); if 1 graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); else - bearingModel = gtsamSharedNoiseModel_Sigmas(0.1); + bearingModel = gtsamnoiseModelDiagonal_Sigmas(0.1); graph.addBearing(i1, j1, gtsamRot2(45*degrees), bearingModel); graph.addBearing(i2, j1, gtsamRot2(90*degrees), bearingModel); end diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m index f60154fa3..29133031e 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/examples/Pose2SLAMExample.m @@ -24,19 +24,19 @@ graph = pose2SLAMGraph; %% Add prior % gaussian for prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -model = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); % print @@ -60,11 +60,11 @@ cla; plot(result.xs(),result.ys(),'k*-'); hold on plot([result.pose(5).x;result.pose(2).x],[result.pose(5).y;result.pose(2).y],'r-'); marginals = graph.marginals(result); -P={}; + for i=1:result.size() pose_i = result.pose(i); - P{i}=marginals.marginalCovariance(i); - plotPose2(pose_i,'g',P{i}) + P = marginals.marginalCovariance(i) + plotPose2(pose_i,'g',P); end axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/examples/Pose2SLAMExample_advanced.m b/matlab/examples/Pose2SLAMExample_advanced.m index 827cf5661..fbffe9911 100644 --- a/matlab/examples/Pose2SLAMExample_advanced.m +++ b/matlab/examples/Pose2SLAMExample_advanced.m @@ -25,20 +25,20 @@ graph = pose2SLAMGraph; %% Add prior % gaussian for prior -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) graph.addOdometry(1, 2, odometry, odometryNoise); graph.addOdometry(2, 3, odometry, odometryNoise); %% Add measurements % general noisemodel for measurements -measurementNoise = gtsamSharedNoiseModel_Sigmas([0.1; 0.2]); +measurementNoise = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.2]); % print graph.print('full graph'); diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m index 7e7ab6694..828b6f5f6 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/examples/Pose2SLAMExample_circle.m @@ -19,7 +19,7 @@ p1 = hexagon.pose(1); fg = pose2SLAMGraph; fg.addPoseConstraint(0, p0); delta = p0.between(p1); -covariance = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 5*pi/180]); +covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 5*pi/180]); fg.addOdometry(0,1, delta, covariance); fg.addOdometry(1,2, delta, covariance); fg.addOdometry(2,3, delta, covariance); diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index 7a8644432..06a16ac55 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -11,13 +11,13 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Initialize graph, initial estimate, and odometry noise -model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 5*pi/180]); +model = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 5*pi/180]); [graph,initial]=load2D('../../examples/Data/w100-odom.graph',model); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamSharedNoiseModel_Sigmas([0.01; 0.01; 0.01]); +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.01; 0.01; 0.01]); graph.addPrior(0, priorMean, priorNoise); % add directly to graph %% Plot Initial Estimate @@ -31,6 +31,7 @@ result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses marginals = graph.marginals(result); +P={}; for i=1:result.size()-1 pose_i = result.pose(i); P{i}=marginals.marginalCovariance(i); diff --git a/matlab/examples/Pose2SLAMwSPCG.m b/matlab/examples/Pose2SLAMwSPCG.m index f9c0537be..3f8f8adf1 100644 --- a/matlab/examples/Pose2SLAMwSPCG.m +++ b/matlab/examples/Pose2SLAMwSPCG.m @@ -22,19 +22,19 @@ graph = pose2SLAMGraph; %% Add prior % gaussian for prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamSharedNoiseModel_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odometryNoise = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -model = gtsamSharedNoiseModel_Sigmas([0.2; 0.2; 0.1]); +model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); % print diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/examples/Pose3SLAMExample.m index e8f5c7c32..4cc41a4de 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -19,7 +19,7 @@ p1 = hexagon.pose(1); fg = pose3SLAMGraph; fg.addHardConstraint(0, p0); delta = p0.between(p1); -covariance = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); fg.addConstraint(0,1, delta, covariance); fg.addConstraint(1,2, delta, covariance); fg.addConstraint(2,3, delta, covariance); diff --git a/matlab/examples/Pose3SLAMExample_graph.m b/matlab/examples/Pose3SLAMExample_graph.m index acaf2c920..f2c411d08 100644 --- a/matlab/examples/Pose3SLAMExample_graph.m +++ b/matlab/examples/Pose3SLAMExample_graph.m @@ -16,7 +16,7 @@ N = 2500; filename = '../../examples/Data/sphere2500.txt'; %% Initialize graph, initial estimate, and odometry noise -model = gtsamSharedNoiseModel_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +model = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); [graph,initial]=load3D(filename,model,true,N); %% Plot Initial Estimate diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 8e56c00b7..8aa0105b2 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -32,7 +32,7 @@ poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; graph = visualSLAMGraph; %% Add factors for all measurements -measurementNoise = gtsamSharedNoiseModel_Sigma(2,measurementNoiseSigma); +measurementNoise = gtsamnoiseModelIsotropic_Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; @@ -41,9 +41,9 @@ for i=1:length(data.Z) end %% Add Gaussian priors for a pose and a landmark to constrain the system -posePriorNoise = gtsamSharedNoiseModel_Sigmas(poseNoiseSigmas); +posePriorNoise = gtsamnoiseModelDiagonal_Sigmas(poseNoiseSigmas); graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); -pointPriorNoise = gtsamSharedNoiseModel_Sigma(3,pointNoiseSigma); +pointPriorNoise = gtsamnoiseModelIsotropic_Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Print the graph diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index 99717fda5..980a3c5a1 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -31,7 +31,7 @@ graph.addPoseConstraint(x1, first_pose); %% Create realistic calibration and measurement noise model % format: fx fy skew cx cy baseline K = gtsamCal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); -stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]); +stereo_model = gtsamnoiseModelDiagonal_Sigmas([1.0; 1.0; 1.0]); %% Add measurements % pose 1 diff --git a/matlab/examples/StereoVOExample_large.m b/matlab/examples/StereoVOExample_large.m index 171836cf8..ef1211e2a 100644 --- a/matlab/examples/StereoVOExample_large.m +++ b/matlab/examples/StereoVOExample_large.m @@ -14,7 +14,7 @@ % format: fx fy skew cx cy baseline calib = dlmread('../../examples/Data/VO_calibration.txt'); K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); -stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]); +stereo_model = gtsamnoiseModelDiagonal_Sigmas([1.0; 1.0; 1.0]); %% create empty graph and values graph = visualSLAMGraph; @@ -57,7 +57,7 @@ graph.addPoseConstraint(key, first_pose); %% optimize fprintf(1,'Optimizing\n'); tic -result = graph.optimize(initial); +result = graph.optimize(initial,1); toc %% visualize initial trajectory, final trajectory, and final points diff --git a/matlab/tests/testJacobianFactor.m b/matlab/tests/testJacobianFactor.m index 2209b36a6..321f7c4ab 100644 --- a/matlab/tests/testJacobianFactor.m +++ b/matlab/tests/testJacobianFactor.m @@ -30,7 +30,7 @@ x1 = 3; % the RHS b2=[-1;1.5;2;-1]; sigmas = [1;1;1;1]; -model4 = gtsamSharedDiagonal(sigmas); +model4 = gtsamnoiseModelDiagonal_Sigmas(sigmas); combined = gtsamJacobianFactor(x2, Ax2, l1, Al1, x1, Ax1, b2, model4); % eliminate the first variable (x2) in the combined factor, destructive ! @@ -69,7 +69,7 @@ Bx1 = [ % the RHS b1= [0.0;0.894427]; -model2 = gtsamSharedDiagonal([1;1]); +model2 = gtsamnoiseModelDiagonal_Sigmas([1;1]); expectedLF = gtsamJacobianFactor(l1, Bl1, x1, Bx1, b1, model2); % check if the result matches the combined (reduced) factor diff --git a/matlab/tests/testKalmanFilter.m b/matlab/tests/testKalmanFilter.m index e9c1b7149..a181c68a1 100644 --- a/matlab/tests/testKalmanFilter.m +++ b/matlab/tests/testKalmanFilter.m @@ -22,13 +22,13 @@ F = eye(2,2); B = eye(2,2); u = [1.0; 0.0]; -modelQ = gtsamSharedDiagonal([0.1;0.1]); +modelQ = gtsamnoiseModelDiagonal_Sigmas([0.1;0.1]); Q = 0.01*eye(2,2); H = eye(2,2); z1 = [1.0, 0.0]'; z2 = [2.0, 0.0]'; z3 = [3.0, 0.0]'; -modelR = gtsamSharedDiagonal([0.1;0.1]); +modelR = gtsamnoiseModelDiagonal_Sigmas([0.1;0.1]); R = 0.01*eye(2,2); %% Create the set of expected output TestValues diff --git a/matlab/tests/testLocalizationExample.m b/matlab/tests/testLocalizationExample.m new file mode 100644 index 000000000..07b47257b --- /dev/null +++ b/matlab/tests/testLocalizationExample.m @@ -0,0 +1,49 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Example of a simple 2D localization example +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) +graph = pose2SLAMGraph; + +%% Add two odometry factors +odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +graph.addOdometry(1, 2, odometry, odometryNoise); +graph.addOdometry(2, 3, odometry, odometryNoise); + +%% Add three "GPS" measurements +% We use Pose2 Priors here with high variance on theta +groundTruth = pose2SLAMValues; +groundTruth.insertPose(1, gtsamPose2(0.0, 0.0, 0.0)); +groundTruth.insertPose(2, gtsamPose2(2.0, 0.0, 0.0)); +groundTruth.insertPose(3, gtsamPose2(4.0, 0.0, 0.0)); +noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.1; 10]); +for i=1:3 + graph.addPrior(i, groundTruth.pose(i), noiseModel); +end + +%% Initialize to noisy points +initialEstimate = pose2SLAMValues; +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); + +%% Plot Covariance Ellipses +marginals = graph.marginals(result); +P={}; +for i=1:result.size() + pose_i = result.pose(i); + CHECK('pose_i.equals(groundTruth.pose(i)',pose_i.equals(groundTruth.pose(i),1e-4)); + P{i}=marginals.marginalCovariance(i); +end diff --git a/matlab/tests/testOdometryExample.m b/matlab/tests/testOdometryExample.m new file mode 100644 index 000000000..e83d0ec0a --- /dev/null +++ b/matlab/tests/testOdometryExample.m @@ -0,0 +1,40 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Example of a simple 2D localization example +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) +graph = pose2SLAMGraph; + +%% Add a Gaussian prior on pose x_1 +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +graph.addPrior(1, priorMean, priorNoise); % add directly to graph + +%% Add two odometry factors +odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +graph.addOdometry(1, 2, odometry, odometryNoise); +graph.addOdometry(2, 3, odometry, odometryNoise); + +%% Initialize to noisy points +initialEstimate = pose2SLAMValues; +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); +marginals = graph.marginals(result); +marginals.marginalCovariance(i); + +%% Check first pose equality +pose_i = result.pose(1); +CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); \ No newline at end of file diff --git a/matlab/tests/testPlanarSLAMExample.m b/matlab/tests/testPlanarSLAMExample.m new file mode 100644 index 000000000..6446da790 --- /dev/null +++ b/matlab/tests/testPlanarSLAMExample.m @@ -0,0 +1,68 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Simple robotics example using the pre-built planar SLAM domain +% @author Alex Cunningham +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - All values are axis aligned +% - Robot poses are facing along the X axis (horizontal, to the right in images) +% - We have bearing and range information for measurements +% - We have full odometry for measurements +% - The robot and landmarks are on a grid, moving 2 meters each step +% - Landmarks are 2 meters away from the robot trajectory + +%% Create keys for variables +i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); +j1 = symbol('l',1); j2 = symbol('l',2); + +%% Create graph container and add factors to it +graph = planarSLAMGraph; + +%% Add prior +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); +graph.addPrior(i1, priorMean, priorNoise); % add directly to graph + +%% Add odometry +odometry = gtsamPose2(2.0, 0.0, 0.0); +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +graph.addOdometry(i1, i2, odometry, odometryNoise); +graph.addOdometry(i2, i3, odometry, odometryNoise); + +%% Add bearing/range measurement factors +degrees = pi/180; +noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.2]); +graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); +graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); +graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); + +%% Initialize to noisy points +initialEstimate = planarSLAMValues; +initialEstimate.insertPose(i1, gtsamPose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(i2, gtsamPose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(i3, gtsamPose2(4.1, 0.1, 0.1)); +initialEstimate.insertPoint(j1, gtsamPoint2(1.8, 2.1)); +initialEstimate.insertPoint(j2, gtsamPoint2(4.1, 1.8)); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); +marginals = graph.marginals(result); + +%% Check first pose and point equality +pose_1 = result.pose(symbol('x',1)); +marginals.marginalCovariance(symbol('x',1)); +CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); + +point_1 = result.point(symbol('l',1)); +marginals.marginalCovariance(symbol('l',1)); +CHECK('point_1.equals(gtsamPoint2(2,2),1e-4)',point_1.equals(gtsamPoint2(2,2),1e-4)); + + diff --git a/matlab/tests/testPose2SLAMExample.m b/matlab/tests/testPose2SLAMExample.m new file mode 100644 index 000000000..bf4f261e7 --- /dev/null +++ b/matlab/tests/testPose2SLAMExample.m @@ -0,0 +1,60 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Simple robotics example using the pre-built planar SLAM domain +% @author Alex Cunningham +% @author Frank Dellaert +% @author Chris Beall +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - All values are axis aligned +% - Robot poses are facing along the X axis (horizontal, to the right in images) +% - We have full odometry for measurements +% - The robot is on a grid, moving 2 meters each step + +%% Create graph container and add factors to it +graph = pose2SLAMGraph; + +%% Add prior +% gaussian for prior +priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); +graph.addPrior(1, priorMean, priorNoise); % add directly to graph + +%% Add odometry +% general noisemodel for odometry +odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); + +%% Add pose constraint +model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); + +%% Initialize to noisy points +initialEstimate = pose2SLAMValues; +initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2 )); +initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2 )); +initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, pi/2)); +initialEstimate.insertPose(4, gtsamPose2(4.0, 2.0, pi )); +initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initialEstimate); + +%% Plot Covariance Ellipses +marginals = graph.marginals(result); +P = marginals.marginalCovariance(1); + +pose_1 = result.pose(1); +CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); + + diff --git a/matlab/tests/testPose3SLAMExample.m b/matlab/tests/testPose3SLAMExample.m new file mode 100644 index 000000000..9d2cf4271 --- /dev/null +++ b/matlab/tests/testPose3SLAMExample.m @@ -0,0 +1,46 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Create a hexagon of poses +hexagon = pose3SLAMValues_Circle(6,1.0); +p0 = hexagon.pose(0); +p1 = hexagon.pose(1); + +%% create a Pose graph with one equality constraint and one measurement +fg = pose3SLAMGraph; +fg.addHardConstraint(0, p0); +delta = p0.between(p1); +covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +fg.addConstraint(0,1, delta, covariance); +fg.addConstraint(1,2, delta, covariance); +fg.addConstraint(2,3, delta, covariance); +fg.addConstraint(3,4, delta, covariance); +fg.addConstraint(4,5, delta, covariance); +fg.addConstraint(5,0, delta, covariance); + +%% Create initial config +initial = pose3SLAMValues; +s = 0.10; +initial.insertPose(0, p0); +initial.insertPose(1, hexagon.pose(1).retract(s*randn(6,1))); +initial.insertPose(2, hexagon.pose(2).retract(s*randn(6,1))); +initial.insertPose(3, hexagon.pose(3).retract(s*randn(6,1))); +initial.insertPose(4, hexagon.pose(4).retract(s*randn(6,1))); +initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); + +%% optimize +result = fg.optimize(initial); + +pose_1 = result.pose(1); +CHECK('pose_1.equals(gtsamPose3,1e-4)',pose_1.equals(p1,1e-4)); + + diff --git a/matlab/tests/testSFMExample.m b/matlab/tests/testSFMExample.m new file mode 100644 index 000000000..ebda9535e --- /dev/null +++ b/matlab/tests/testSFMExample.m @@ -0,0 +1,72 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief A structure from motion example +% @author Duy-Nguyen Ta +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +options.triangle = false; +options.nrCameras = 10; +options.showImages = false; + +[data,truth] = VisualISAMGenerateData(options); + +measurementNoiseSigma = 1.0; +pointNoiseSigma = 0.1; +poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; + +graph = visualSLAMGraph; + +%% Add factors for all measurements +measurementNoise = gtsamnoiseModelIsotropic_Sigma(2,measurementNoiseSigma); +for i=1:length(data.Z) + for k=1:length(data.Z{i}) + j = data.J{i}{k}; + graph.addMeasurement(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('p',j), data.K); + end +end + +posePriorNoise = gtsamnoiseModelDiagonal_Sigmas(poseNoiseSigmas); +graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); +pointPriorNoise = gtsamnoiseModelIsotropic_Sigma(3,pointNoiseSigma); +graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); + +%% Initial estimate +initialEstimate = visualSLAMValues; +for i=1:size(truth.cameras,2) + pose_i = truth.cameras{i}.pose; + initialEstimate.insertPose(symbol('x',i), pose_i); +end +for j=1:size(truth.points,2) + point_j = truth.points{j}; + initialEstimate.insertPoint(symbol('p',j), point_j); +end + +%% Optimization +parameters = gtsamLevenbergMarquardtParams(1e-5, 1e-5, 0, 0); +optimizer = graph.optimizer(initialEstimate, parameters); +for i=1:5 + optimizer.iterate(); +end +result = optimizer.values(); + +%% Marginalization +marginals = graph.marginals(result); +marginals.marginalCovariance(symbol('p',1)); +marginals.marginalCovariance(symbol('x',1)); + +%% Check optimized results, should be equal to ground truth +for i=1:size(truth.cameras,2) + pose_i = result.pose(symbol('x',i)); + CHECK('pose_i.equals(truth.cameras{i}.pose,1e-5)',pose_i.equals(truth.cameras{i}.pose,1e-5)) +end + +for j=1:size(truth.points,2) + point_j = result.point(symbol('p',j)); + CHECK('point_j.equals(truth.points{j},1e-5)',point_j.equals(truth.points{j},1e-5)) +end diff --git a/matlab/tests/testStereoVOExample.m b/matlab/tests/testStereoVOExample.m new file mode 100644 index 000000000..8f751d313 --- /dev/null +++ b/matlab/tests/testStereoVOExample.m @@ -0,0 +1,66 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Basic VO Example with 3 landmarks and two cameras +% @author Chris Beall +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - For simplicity this example is in the camera's coordinate frame +% - X: right, Y: down, Z: forward +% - Pose x1 is at the origin, Pose 2 is 1 meter forward (along Z-axis) +% - x1 is fixed with a constraint, x2 is initialized with noisy values +% - No noise on measurements + +%% Create keys for variables +x1 = symbol('x',1); x2 = symbol('x',2); +l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); + +%% Create graph container and add factors to it +graph = visualSLAMGraph; + +%% add a constraint on the starting pose +first_pose = gtsamPose3(); +graph.addPoseConstraint(x1, first_pose); + +%% Create realistic calibration and measurement noise model +% format: fx fy skew cx cy baseline +K = gtsamCal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); +stereo_model = gtsamnoiseModelDiagonal_Sigmas([1.0; 1.0; 1.0]); + +%% Add measurements +% pose 1 +graph.addStereoMeasurement(gtsamStereoPoint2(520, 480, 440), stereo_model, x1, l1, K); +graph.addStereoMeasurement(gtsamStereoPoint2(120, 80, 440), stereo_model, x1, l2, K); +graph.addStereoMeasurement(gtsamStereoPoint2(320, 280, 140), stereo_model, x1, l3, K); + +%pose 2 +graph.addStereoMeasurement(gtsamStereoPoint2(570, 520, 490), stereo_model, x2, l1, K); +graph.addStereoMeasurement(gtsamStereoPoint2( 70, 20, 490), stereo_model, x2, l2, K); +graph.addStereoMeasurement(gtsamStereoPoint2(320, 270, 115), stereo_model, x2, l3, K); + + +%% Create initial estimate for camera poses and landmarks +initialEstimate = visualSLAMValues; +initialEstimate.insertPose(x1, first_pose); +% noisy estimate for pose 2 +initialEstimate.insertPose(x2, gtsamPose3(gtsamRot3(), gtsamPoint3(0.1,-.1,1.1))); +expected_l1 = gtsamPoint3( 1, 1, 5); +initialEstimate.insertPoint(l1, expected_l1); +initialEstimate.insertPoint(l2, gtsamPoint3(-1, 1, 5)); +initialEstimate.insertPoint(l3, gtsamPoint3( 0,-.5, 5)); + +%% optimize +result = graph.optimize(initialEstimate,0); + +%% check equality for the first pose and point +pose_x1 = result.pose(x1); +CHECK('pose_x1.equals(first_pose,1e-4)',pose_x1.equals(first_pose,1e-4)); + +point_l1 = result.point(l1); +CHECK('point_1.equals(expected_l1,1e-4)',point_l1.equals(expected_l1,1e-4)); \ No newline at end of file diff --git a/matlab/tests/testVisualISAMExample.m b/matlab/tests/testVisualISAMExample.m new file mode 100644 index 000000000..c6fd46f4a --- /dev/null +++ b/matlab/tests/testVisualISAMExample.m @@ -0,0 +1,53 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief A simple visual SLAM example for structure from motion +% @author Duy-Nguyen Ta +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Data Options +options.triangle = false; +options.nrCameras = 20; +options.showImages = false; + +% iSAM Options +options.hardConstraint = false; +options.pointPriors = false; +options.batchInitialization = true; +options.reorderInterval = 10; +options.alwaysRelinearize = false; + +% Display Options +options.saveDotFile = false; +options.printStats = false; +options.drawInterval = 5; +options.cameraInterval = 1; +options.drawTruePoses = false; +options.saveFigures = false; +options.saveDotFiles = false; + +%% Generate data +[data,truth] = VisualISAMGenerateData(options); + +%% Initialize iSAM with the first pose and points +[noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); + +%% Main loop for iSAM: stepping through all poses +for frame_i=3:options.nrCameras + [isam,result] = VisualISAMStep(data,noiseModels,isam,result,truth,options); +end + +for i=1:size(truth.cameras,2) + pose_i = result.pose(symbol('x',i)); + CHECK('pose_i.equals(truth.cameras{i}.pose,1e-5)',pose_i.equals(truth.cameras{i}.pose,1e-5)) +end + +for j=1:size(truth.points,2) + point_j = result.point(symbol('l',j)); + CHECK('point_j.equals(truth.points{j},1e-5)',point_j.equals(truth.points{j},1e-5)) +end diff --git a/matlab/tests/test_gtsam.m b/matlab/tests/test_gtsam.m index aab3dac0f..f35c0dc73 100644 --- a/matlab/tests/test_gtsam.m +++ b/matlab/tests/test_gtsam.m @@ -6,5 +6,29 @@ testJacobianFactor display 'Starting: testKalmanFilter' testKalmanFilter +display 'Starting: testLocalizationExample' +testLocalizationExample + +display 'Starting: testPose2SLAMExample' +testPose2SLAMExample + +display 'Starting: testPose3SLAMExample' +testPose3SLAMExample + +display 'Starting: testPlanarSLAMExample' +testPlanarSLAMExample + +display 'Starting: testOdometryExample' +testOdometryExample + +display 'Starting: testSFMExample' +testSFMExample + +display 'Starting: testVisualISAMExample' +testVisualISAMExample + +display 'Starting: testStereoVOExample' +testStereoVOExample + % end of tests display 'Tests complete!' diff --git a/tests/smallExample.cpp b/tests/smallExample.cpp index b0af6c723..100a4db4c 100644 --- a/tests/smallExample.cpp +++ b/tests/smallExample.cpp @@ -37,6 +37,8 @@ using namespace std; namespace gtsam { namespace example { + using namespace gtsam::noiseModel; + typedef boost::shared_ptr shared; static SharedDiagonal sigma1_0 = noiseModel::Isotropic::Sigma(2,1.0); @@ -425,14 +427,14 @@ namespace example { NonlinearFactorGraph nlfg; // Create almost hard constraint on x11, sigma=0 will work for PCG not for normal - shared constraint(new simulated2D::Prior(Point2(1.0, 1.0), sharedSigma(2,1e-3), key(1,1))); + shared constraint(new simulated2D::Prior(Point2(1.0, 1.0), Isotropic::Sigma(2,1e-3), key(1,1))); nlfg.push_back(constraint); // Create horizontal constraints, 1...N*(N-1) Point2 z1(1.0, 0.0); // move right for (size_t x = 1; x < N; x++) for (size_t y = 1; y <= N; y++) { - shared f(new simulated2D::Odometry(z1, sharedSigma(2,0.01), key(x, y), key(x + 1, y))); + shared f(new simulated2D::Odometry(z1, Isotropic::Sigma(2,0.01), key(x, y), key(x + 1, y))); nlfg.push_back(f); } @@ -440,7 +442,7 @@ namespace example { Point2 z2(0.0, 1.0); // move up for (size_t x = 1; x <= N; x++) for (size_t y = 1; y < N; y++) { - shared f(new simulated2D::Odometry(z2, sharedSigma(2,0.01), key(x, y), key(x, y + 1))); + shared f(new simulated2D::Odometry(z2, Isotropic::Sigma(2,0.01), key(x, y), key(x, y + 1))); nlfg.push_back(f); } diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index bc0040f37..0097ec49a 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -41,7 +41,7 @@ using symbol_shorthand::X; using symbol_shorthand::L; static SharedDiagonal - sigma0_1 = sharedSigma(2,0.1), sigma_02 = sharedSigma(2,0.2), + sigma0_1 = noiseModel::Isotropic::Sigma(2,0.1), sigma_02 = noiseModel::Isotropic::Sigma(2,0.2), constraintModel = noiseModel::Constrained::All(2); //const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // FIXME: throws exception diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 9b3f9eb0d..20972add9 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -269,7 +269,7 @@ TEST( GaussianFactorGraph, eliminateOne_x1_fast ) 0., -2.357022603955159, 7.071067811865475, 0., 0., 7.071067811865475), - Vector_(4, -0.707106781186547, 0.942809041582063, 0.707106781186547, -1.414213562373094), sharedUnit(4)); + Vector_(4, -0.707106781186547, 0.942809041582063, 0.707106781186547, -1.414213562373094), noiseModel::Unit::Create(4)); EXPECT(assert_equal(expected,*conditional,tol)); EXPECT(assert_equal((const GaussianFactor&)expectedFactor,*remaining.back(),tol)); @@ -370,7 +370,7 @@ TEST( GaussianFactorGraph, eliminateAll ) // GaussianFactorGraph expected = createGaussianFactorGraph(ordering); // Matrix A = eye(2); // Vector b = zero(2); -// SharedDiagonal sigma = sharedSigma(2,3.0); +// SharedDiagonal sigma = noiseModel::Isotropic::Sigma(2,3.0); // expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[L(1)],A,b,sigma))); // expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[X(1)],A,b,sigma))); // expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[X(2)],A,b,sigma))); @@ -768,7 +768,7 @@ TEST( GaussianFactorGraph, elimination ) GaussianFactorGraph fg; Matrix Ap = eye(1), An = eye(1) * -1; Vector b = Vector_(1, 0.0); - SharedDiagonal sigma = sharedSigma(1,2.0); + SharedDiagonal sigma = noiseModel::Isotropic::Sigma(1,2.0); fg.add(ord[X(1)], An, ord[X(2)], Ap, b, sigma); fg.add(ord[X(1)], Ap, b, sigma); fg.add(ord[X(2)], Ap, b, sigma); @@ -873,7 +873,7 @@ TEST( GaussianFactorGraph, constrained_multi1 ) /* ************************************************************************* */ -SharedDiagonal model = sharedSigma(2,1); +SharedDiagonal model = noiseModel::Isotropic::Sigma(2,1); // SL-FIX TEST( GaussianFactorGraph, findMinimumSpanningTree ) //{ @@ -922,7 +922,7 @@ SharedDiagonal model = sharedSigma(2,1); TEST(GaussianFactorGraph, replace) { Ordering ord; ord += X(1),X(2),X(3),X(4),X(5),X(6); - SharedDiagonal noise(sharedSigma(3, 1.0)); + SharedDiagonal noise(noiseModel::Isotropic::Sigma(3, 1.0)); GaussianFactorGraph::sharedFactor f1(new JacobianFactor( ord[X(1)], eye(3,3), ord[X(2)], eye(3,3), zero(3), noise)); diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index a6eccd70f..6ae4a7b20 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -373,9 +373,9 @@ TEST_UNSAFE(BayesTree, simpleMarginal) Matrix A12 = Rot2::fromDegrees(45.0).matrix(); - gfg.add(0, eye(2), zero(2), sharedSigma(2, 1.0)); - gfg.add(0, -eye(2), 1, eye(2), ones(2), sharedSigma(2, 1.0)); - gfg.add(1, -eye(2), 2, A12, ones(2), sharedSigma(2, 1.0)); + gfg.add(0, eye(2), zero(2), noiseModel::Isotropic::Sigma(2, 1.0)); + gfg.add(0, -eye(2), 1, eye(2), ones(2), noiseModel::Isotropic::Sigma(2, 1.0)); + gfg.add(1, -eye(2), 2, A12, ones(2), noiseModel::Isotropic::Sigma(2, 1.0)); Matrix expected(GaussianSequentialSolver(gfg).marginalCovariance(2)); Matrix actual(GaussianMultifrontalSolver(gfg).marginalCovariance(2)); diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index c79e4e8fc..b5c1d4b89 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -33,8 +33,8 @@ const double tol = 1e-4; // SETDEBUG("ISAM2 recalculate", true); // Set up parameters -SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); -SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); +SharedDiagonal odoNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); +SharedDiagonal brNoise = noiseModel::Diagonal::Sigmas(Vector_(2, M_PI/100.0, 0.1)); ISAM2 createSlamlikeISAM2( boost::optional init_values = boost::none, @@ -257,8 +257,8 @@ TEST_UNSAFE(ISAM2, AddVariables) { // // Ordering ordering; ordering += (0), (0), (1); // planarSLAM::Graph graph; -// graph.addPrior((0), Pose2(), sharedUnit(Pose2::dimension)); -// graph.addRange((0), (0), 1.0, sharedUnit(1)); +// graph.addPrior((0), Pose2(), noiseModel::Unit::Create(Pose2::dimension)); +// graph.addRange((0), (0), 1.0, noiseModel::Unit::Create(1)); // // FastSet expected; // expected.insert(0); @@ -844,7 +844,7 @@ TEST(ISAM2, clone) { // Modify original isam NonlinearFactorGraph factors; factors.add(BetweenFactor(0, 10, - isam.calculateEstimate(0).between(isam.calculateEstimate(10)), sharedUnit(3))); + isam.calculateEstimate(0).between(isam.calculateEstimate(10)), noiseModel::Unit::Create(3))); isam.update(factors); CHECK(assert_equal(createSlamlikeISAM2(), clone2)); diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 5b7555d37..769e95d26 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -130,8 +130,8 @@ TEST(GaussianJunctionTree, slamlike) { Values init; planarSLAM::Graph newfactors; planarSLAM::Graph fullgraph; - SharedDiagonal odoNoise = sharedSigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); - SharedDiagonal brNoise = sharedSigmas(Vector_(2, M_PI/100.0, 0.1)); + SharedDiagonal odoNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); + SharedDiagonal brNoise = noiseModel::Diagonal::Sigmas(Vector_(2, M_PI/100.0, 0.1)); size_t i = 0; @@ -194,8 +194,8 @@ TEST(GaussianJunctionTree, simpleMarginal) { // Create a simple graph pose2SLAM::Graph fg; - fg.addPrior(X(0), Pose2(), sharedSigma(3, 10.0)); - fg.addOdometry(X(0), X(1), Pose2(1.0, 0.0, 0.0), sharedSigmas(Vector_(3, 10.0, 1.0, 1.0))); + fg.addPrior(X(0), Pose2(), noiseModel::Isotropic::Sigma(3, 10.0)); + fg.addOdometry(X(0), X(1), Pose2(1.0, 0.0, 0.0), noiseModel::Diagonal::Sigmas(Vector_(3, 10.0, 1.0, 1.0))); Values init; init.insert(X(0), Pose2()); diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index 54130b664..34a39fdca 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -26,18 +26,18 @@ boost::tuple generateProblem() { // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise(Vector_(3, 0.3, 0.3, 0.1)); + SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); graph.addPrior(1, priorMean, priorNoise); // 2b. Add odometry factors - SharedDiagonal odometryNoise(Vector_(3, 0.2, 0.2, 0.1)); + SharedDiagonal odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); // 2c. Add pose constraint - SharedDiagonal constraintUncertainty(Vector_(3, 0.2, 0.2, 0.1)); + SharedDiagonal constraintUncertainty = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); // 3. Create the data structure to hold the initialEstimate estinmate to the solution diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index 63cbd43c8..0a3f3a562 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -76,7 +76,7 @@ TEST( Graph, predecessorMap2Graph ) TEST( Graph, composePoses ) { pose2SLAM::Graph graph; - SharedNoiseModel cov = SharedNoiseModel::Unit(3); + SharedNoiseModel cov = noiseModel::Unit::Create(3); Pose2 p1(1.0, 2.0, 0.3), p2(4.0, 5.0, 0.6), p3(7.0, 8.0, 0.9), p4(2.0, 2.0, 2.9); Pose2 p12=p1.between(p2), p23=p2.between(p3), p43=p4.between(p3); graph.addOdometry(1,2, p12, cov); diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index 81b24a1e7..5da4ca955 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -55,8 +55,8 @@ TEST( inference, marginals ) TEST( inference, marginals2) { planarSLAM::Graph fg; - SharedDiagonal poseModel(sharedSigma(3, 0.1)); - SharedDiagonal pointModel(sharedSigma(3, 0.1)); + SharedDiagonal poseModel(noiseModel::Isotropic::Sigma(3, 0.1)); + SharedDiagonal pointModel(noiseModel::Isotropic::Sigma(3, 0.1)); fg.addPrior(X(0), Pose2(), poseModel); fg.addOdometry(X(0), X(1), Pose2(1.0,0.0,0.0), poseModel); diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index 0a9c59f8b..b1717a79b 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -240,7 +240,7 @@ TEST( NonlinearFactor, linearize_constraint2 ) class TestFactor4 : public NoiseModelFactor4 { public: typedef NoiseModelFactor4 Base; - TestFactor4() : Base(sharedSigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4)) {} + TestFactor4() : Base(noiseModel::Diagonal::Sigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4)) {} virtual Vector evaluateError(const LieVector& x1, const LieVector& x2, const LieVector& x3, const LieVector& x4, @@ -289,7 +289,7 @@ TEST(NonlinearFactor, NoiseModelFactor4) { class TestFactor5 : public NoiseModelFactor5 { public: typedef NoiseModelFactor5 Base; - TestFactor5() : Base(sharedSigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4), X(5)) {} + TestFactor5() : Base(noiseModel::Diagonal::Sigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4), X(5)) {} virtual Vector evaluateError(const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, @@ -339,7 +339,7 @@ TEST(NonlinearFactor, NoiseModelFactor5) { class TestFactor6 : public NoiseModelFactor6 { public: typedef NoiseModelFactor6 Base; - TestFactor6() : Base(sharedSigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4), X(5), X(6)) {} + TestFactor6() : Base(noiseModel::Diagonal::Sigmas(Vector_(1, 2.0)), X(1), X(2), X(3), X(4), X(5), X(6)) {} virtual Vector evaluateError(const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index ee681db3e..f7112bb03 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -232,9 +232,9 @@ TEST(NonlinearOptimizer, NullFactor) { TEST(NonlinearOptimizer, MoreOptimization) { NonlinearFactorGraph fg; - fg.add(PriorFactor(0, Pose2(0,0,0), sharedSigma(3,1))); - fg.add(BetweenFactor(0, 1, Pose2(1,0,M_PI/2), sharedSigma(3,1))); - fg.add(BetweenFactor(1, 2, Pose2(1,0,M_PI/2), sharedSigma(3,1))); + fg.add(PriorFactor(0, Pose2(0,0,0), noiseModel::Isotropic::Sigma(3,1))); + fg.add(BetweenFactor(0, 1, Pose2(1,0,M_PI/2), noiseModel::Isotropic::Sigma(3,1))); + fg.add(BetweenFactor(1, 2, Pose2(1,0,M_PI/2), noiseModel::Isotropic::Sigma(3,1))); Values init; init.insert(0, Pose2(3,4,-M_PI)); diff --git a/tests/testRot3Optimization.cpp b/tests/testRot3Optimization.cpp index 3e78414e9..89b621ed2 100644 --- a/tests/testRot3Optimization.cpp +++ b/tests/testRot3Optimization.cpp @@ -41,11 +41,11 @@ TEST(Rot3, optimize) { Values truth; Values initial; Graph fg; - fg.add(Prior(Symbol('r',0), Rot3(), sharedSigma(3, 0.01))); + fg.add(Prior(Symbol('r',0), Rot3(), noiseModel::Isotropic::Sigma(3, 0.01))); for(int j=0; j<6; ++j) { truth.insert(Symbol('r',j), Rot3::Rz(M_PI/3.0 * double(j))); initial.insert(Symbol('r',j), Rot3::Rz(M_PI/3.0 * double(j) + 0.1 * double(j%2))); - fg.add(Between(Symbol('r',j), Symbol('r',(j+1)%6), Rot3::Rz(M_PI/3.0), sharedSigma(3, 0.01))); + fg.add(Between(Symbol('r',j), Symbol('r',(j+1)%6), Rot3::Rz(M_PI/3.0), noiseModel::Isotropic::Sigma(3, 0.01))); } Values final = GaussNewtonOptimizer(fg, initial).optimize(); diff --git a/tests/testSimulated2DOriented.cpp b/tests/testSimulated2DOriented.cpp index 24fe6ec4e..bce932235 100644 --- a/tests/testSimulated2DOriented.cpp +++ b/tests/testSimulated2DOriented.cpp @@ -58,7 +58,7 @@ TEST( simulated2DOriented, Dprior ) TEST( simulated2DOriented, constructor ) { Pose2 measurement(0.2, 0.3, 0.1); - SharedDiagonal model(Vector_(3, 1., 1., 1.)); + SharedDiagonal model = noiseModel::Diagonal::Sigmas(Vector_(3, 1., 1., 1.)); simulated2DOriented::Odometry factor(measurement, model, X(1), X(2)); simulated2DOriented::Values config; diff --git a/tests/timeMultifrontalOnDataset.cpp b/tests/timeMultifrontalOnDataset.cpp index 3d8ccf77e..05d2c9398 100644 --- a/tests/timeMultifrontalOnDataset.cpp +++ b/tests/timeMultifrontalOnDataset.cpp @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) { // Add a prior on the first pose if (soft_prior) - data.first->addPrior(0, Pose2(), sharedSigma(Pose2::Dim(), 0.0005)); + data.first->addPrior(0, Pose2(), noiseModel::Isotropic::Sigma(Pose2::Dim(), 0.0005)); else data.first->addPoseConstraint(0, Pose2()); diff --git a/tests/timeSequentialOnDataset.cpp b/tests/timeSequentialOnDataset.cpp index a37b9910c..4a53737e0 100644 --- a/tests/timeSequentialOnDataset.cpp +++ b/tests/timeSequentialOnDataset.cpp @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) { // Add a prior on the first pose if (soft_prior) - data.first->addPrior(0, Pose2(), sharedSigma(Pose2::Dim(), 0.0005)); + data.first->addPrior(0, Pose2(), noiseModel::Isotropic::Sigma(Pose2::Dim(), 0.0005)); else data.first->addPoseConstraint(0, Pose2()); diff --git a/wrap/matlab.h b/wrap/matlab.h index 4d98ede30..313cfaa9f 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -25,6 +25,7 @@ using gtsam::Vector; using gtsam::Matrix; +using gtsam::noiseModel::Base; using gtsam::noiseModel::Gaussian; using gtsam::noiseModel::Diagonal; using gtsam::noiseModel::Isotropic; @@ -483,7 +484,7 @@ boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); if (!isIsotropic && !isUnit) { - mexPrintf("Expected Isotropic or derived classes, got %s\n", mxGetClassName(obj)); + mexPrintf("Expected gtsamnoiseModelIsotropic or derived classes, got %s\n", mxGetClassName(obj)); error("Argument has wrong type."); } #endif @@ -501,7 +502,7 @@ boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); if (!isDiagonal && !isIsotropic && !isUnit ) { - mexPrintf("Expected Diagonal or derived classes, got %s\n", mxGetClassName(obj)); + mexPrintf("Expected gtsamnoiseModelDiagonal or derived classes, got %s\n", mxGetClassName(obj)); error("Argument has wrong type."); } #endif @@ -520,7 +521,27 @@ boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); if (!isGaussian && !isDiagonal && !isIsotropic && !isUnit) { - mexPrintf("Expected Gaussian or derived classes, got %s\n", mxGetClassName(obj)); + mexPrintf("Expected gtsamnoiseModelGaussian or derived classes, got %s\n", mxGetClassName(obj)); + error("Argument has wrong type."); + } +#endif + mxArray* mxh = mxGetProperty(obj,0,"self"); + if (mxh==NULL) error("unwrap_reference: invalid wrap object"); + ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); + return handle->get_object(); +} + +// Base +template <> +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { +#ifndef UNSAFE_WRAP + bool isBase = mxIsClass(obj, "gtsamnoiseModelBase"); + bool isGaussian = mxIsClass(obj, "gtsamnoiseModelGaussian"); + bool isDiagonal = mxIsClass(obj, "gtsamnoiseModelDiagonal"); + bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); + bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); + if (!isBase && !isGaussian && !isDiagonal && !isIsotropic && !isUnit) { + mexPrintf("Expected gtsamnoiseModelBase or derived classes, got %s\n", mxGetClassName(obj)); error("Argument has wrong type."); } #endif From e42dc5cdc978ea2a386a21af5807106cbf18b7b1 Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Fri, 22 Jun 2012 19:51:08 +0000 Subject: [PATCH 436/914] Minor updates: cachedShortcut is now protected. DeleteCachedShortcuts() are now called on the resulting orphans in the removeTop() instead of the whole tree. --- gtsam/inference/BayesTree-inl.h | 8 +++++--- gtsam/inference/BayesTreeCliqueBase.h | 10 +++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index dfefd721e..5cb2c34a9 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -575,9 +575,6 @@ namespace gtsam { void BayesTree::removeTop(const CONTAINER& keys, BayesNet& bn, typename BayesTree::Cliques& orphans) { - //TODO: Improve this - deleteCachedShorcuts(this->root_); - // process each key of the new factor BOOST_FOREACH(const Index& key, keys) { @@ -590,6 +587,11 @@ namespace gtsam { } } } + + // Delete cachedShorcuts for each orphan subtree + //TODO: Consider Improving + BOOST_FOREACH(sharedClique& orphan, orphans) + deleteCachedShorcuts(orphan); } /* ************************************************************************* */ diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index fa0992fbd..675215904 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -75,14 +75,14 @@ namespace gtsam { /// @} + /// This stores the Cached Shortcut value + mutable boost::optional > cachedShortcut_; + public: sharedConditional conditional_; derived_weak_ptr parent_; std::list children_; - /// This stores the Cached Shortcut value - mutable boost::optional > cachedShortcut_; - /// @name Testable /// @{ @@ -114,7 +114,7 @@ namespace gtsam { /** The arrow operator accesses the conditional */ const ConditionalType* operator->() const { return conditional_.get(); } - ///TODO: comment + /** return the const reference of children */ const std::list& children() const { return children_; } /// @} @@ -124,7 +124,7 @@ namespace gtsam { /** The arrow operator accesses the conditional */ ConditionalType* operator->() { return conditional_.get(); } - /** return the const reference of children */ + /** return the reference of children non-const version*/ std::list& children() { return children_; } /** Construct shared_ptr from a conditional, leaving parent and child pointers uninitialized */ From 617bf071cbde6d451ace4d03c4a439c4027ff2a1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 22 Jun 2012 21:44:29 +0000 Subject: [PATCH 437/914] Fixed warning by making "what" const. Please investigate warnings! --- gtsam/linear/JacobianFactor.cpp | 2 +- gtsam/linear/JacobianFactor.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index e2a582d9b..417548ed5 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -572,7 +572,7 @@ namespace gtsam { } /* ************************************************************************* */ - const char* JacobianFactor::InvalidNoiseModel::what() throw() { + const char* JacobianFactor::InvalidNoiseModel::what() const throw() { if(description_.empty()) description_ = (boost::format( "A JacobianFactor was attempted to be constructed or modified to use a\n" diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 7e1381f38..7fb4211fb 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -310,7 +310,7 @@ namespace gtsam { factorDims(factorDims), noiseModelDims(noiseModelDims) {} virtual ~InvalidNoiseModel() throw() {} - virtual const char* what() throw(); + virtual const char* what() const throw(); private: mutable std::string description_; From 0fe2d527f9980b5de2396a5a47eaeaef73ffb120 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 22 Jun 2012 21:45:36 +0000 Subject: [PATCH 438/914] Fixed warnings due to discrete. GTSAM now Wall-safe? --- gtsam/base/tests/testDebug.cpp | 1 + gtsam/discrete/DecisionTreeFactor.h | 2 +- gtsam/discrete/DiscreteFactor.h | 2 +- gtsam_unstable/discrete/AllDiff.cpp | 6 +++--- gtsam_unstable/discrete/AllDiff.h | 2 +- gtsam_unstable/discrete/BinaryAllDiff.h | 4 ++-- gtsam_unstable/discrete/Domain.cpp | 4 ++-- gtsam_unstable/discrete/Domain.h | 2 +- gtsam_unstable/discrete/SingleValue.cpp | 4 ++-- gtsam_unstable/discrete/SingleValue.h | 2 +- gtsam_unstable/discrete/tests/testCSP.cpp | 16 ++++++++-------- gtsam_unstable/nonlinear/LinearizedFactor.cpp | 2 +- tests/testOccupancyGrid.cpp | 4 ++-- 13 files changed, 26 insertions(+), 25 deletions(-) diff --git a/gtsam/base/tests/testDebug.cpp b/gtsam/base/tests/testDebug.cpp index f399dcb3b..81e4f039b 100644 --- a/gtsam/base/tests/testDebug.cpp +++ b/gtsam/base/tests/testDebug.cpp @@ -17,6 +17,7 @@ #include +#undef NDEBUG #define NDEBUG #undef GTSAM_ENABLE_DEBUG #include diff --git a/gtsam/discrete/DecisionTreeFactor.h b/gtsam/discrete/DecisionTreeFactor.h index 27c31fbb9..89bc090dc 100644 --- a/gtsam/discrete/DecisionTreeFactor.h +++ b/gtsam/discrete/DecisionTreeFactor.h @@ -94,7 +94,7 @@ namespace gtsam { } /// Convert into a decisiontree - virtual operator DecisionTreeFactor() const { + virtual DecisionTreeFactor toDecisionTreeFactor() const { return *this; } diff --git a/gtsam/discrete/DiscreteFactor.h b/gtsam/discrete/DiscreteFactor.h index 32e79568c..0bfdb3068 100644 --- a/gtsam/discrete/DiscreteFactor.h +++ b/gtsam/discrete/DiscreteFactor.h @@ -96,7 +96,7 @@ namespace gtsam { /// Multiply in a DecisionTreeFactor and return the result as DecisionTreeFactor virtual DecisionTreeFactor operator*(const DecisionTreeFactor&) const = 0; - virtual operator DecisionTreeFactor() const = 0; + virtual DecisionTreeFactor toDecisionTreeFactor() const = 0; /** * Permutes the factor, but for efficiency requires the permutation diff --git a/gtsam_unstable/discrete/AllDiff.cpp b/gtsam_unstable/discrete/AllDiff.cpp index 0cab961e1..41905f874 100644 --- a/gtsam_unstable/discrete/AllDiff.cpp +++ b/gtsam_unstable/discrete/AllDiff.cpp @@ -39,14 +39,14 @@ namespace gtsam { } /* ************************************************************************* */ - AllDiff::operator DecisionTreeFactor() const { + DecisionTreeFactor AllDiff::toDecisionTreeFactor() const { // We will do this by converting the allDif into many BinaryAllDiff constraints DecisionTreeFactor converted; size_t nrKeys = keys_.size(); for (size_t i1 = 0; i1 < nrKeys; i1++) for (size_t i2 = i1 + 1; i2 < nrKeys; i2++) { BinaryAllDiff binary12(discreteKey(i1),discreteKey(i2)); - converted = converted * binary12; + converted = converted * binary12.toDecisionTreeFactor(); } return converted; } @@ -54,7 +54,7 @@ namespace gtsam { /* ************************************************************************* */ DecisionTreeFactor AllDiff::operator*(const DecisionTreeFactor& f) const { // TODO: can we do this more efficiently? - return DecisionTreeFactor(*this) * f; + return toDecisionTreeFactor() * f; } /* ************************************************************************* */ diff --git a/gtsam_unstable/discrete/AllDiff.h b/gtsam_unstable/discrete/AllDiff.h index 4f4e10511..fb5a47a59 100644 --- a/gtsam_unstable/discrete/AllDiff.h +++ b/gtsam_unstable/discrete/AllDiff.h @@ -40,7 +40,7 @@ namespace gtsam { virtual double operator()(const Values& values) const; /// Convert into a decisiontree, can be *very* expensive ! - virtual operator DecisionTreeFactor() const; + virtual DecisionTreeFactor toDecisionTreeFactor() const; /// Multiply into a decisiontree virtual DecisionTreeFactor operator*(const DecisionTreeFactor& f) const; diff --git a/gtsam_unstable/discrete/BinaryAllDiff.h b/gtsam_unstable/discrete/BinaryAllDiff.h index 46901fc7d..a2e260bcd 100644 --- a/gtsam_unstable/discrete/BinaryAllDiff.h +++ b/gtsam_unstable/discrete/BinaryAllDiff.h @@ -44,7 +44,7 @@ namespace gtsam { } /// Convert into a decisiontree - virtual operator DecisionTreeFactor() const { + virtual DecisionTreeFactor toDecisionTreeFactor() const { DiscreteKeys keys; keys.push_back(DiscreteKey(keys_[0],cardinality0_)); keys.push_back(DiscreteKey(keys_[1],cardinality1_)); @@ -59,7 +59,7 @@ namespace gtsam { /// Multiply into a decisiontree virtual DecisionTreeFactor operator*(const DecisionTreeFactor& f) const { // TODO: can we do this more efficiently? - return DecisionTreeFactor(*this) * f; + return toDecisionTreeFactor() * f; } /* diff --git a/gtsam_unstable/discrete/Domain.cpp b/gtsam_unstable/discrete/Domain.cpp index fd2631cec..e43065f3b 100644 --- a/gtsam_unstable/discrete/Domain.cpp +++ b/gtsam_unstable/discrete/Domain.cpp @@ -29,7 +29,7 @@ namespace gtsam { } /* ************************************************************************* */ - Domain::operator DecisionTreeFactor() const { + DecisionTreeFactor Domain::toDecisionTreeFactor() const { DiscreteKeys keys; keys += DiscreteKey(keys_[0],cardinality_); vector table; @@ -42,7 +42,7 @@ namespace gtsam { /* ************************************************************************* */ DecisionTreeFactor Domain::operator*(const DecisionTreeFactor& f) const { // TODO: can we do this more efficiently? - return DecisionTreeFactor(*this) * f; + return toDecisionTreeFactor() * f; } /* ************************************************************************* */ diff --git a/gtsam_unstable/discrete/Domain.h b/gtsam_unstable/discrete/Domain.h index 50c534f8a..a4f0c8054 100644 --- a/gtsam_unstable/discrete/Domain.h +++ b/gtsam_unstable/discrete/Domain.h @@ -76,7 +76,7 @@ namespace gtsam { virtual double operator()(const Values& values) const; /// Convert into a decisiontree - virtual operator DecisionTreeFactor() const; + virtual DecisionTreeFactor toDecisionTreeFactor() const; /// Multiply into a decisiontree virtual DecisionTreeFactor operator*(const DecisionTreeFactor& f) const; diff --git a/gtsam_unstable/discrete/SingleValue.cpp b/gtsam_unstable/discrete/SingleValue.cpp index a626ecf13..6f6d5a3ff 100644 --- a/gtsam_unstable/discrete/SingleValue.cpp +++ b/gtsam_unstable/discrete/SingleValue.cpp @@ -27,7 +27,7 @@ namespace gtsam { } /* ************************************************************************* */ - SingleValue::operator DecisionTreeFactor() const { + DecisionTreeFactor SingleValue::toDecisionTreeFactor() const { DiscreteKeys keys; keys += DiscreteKey(keys_[0],cardinality_); vector table; @@ -40,7 +40,7 @@ namespace gtsam { /* ************************************************************************* */ DecisionTreeFactor SingleValue::operator*(const DecisionTreeFactor& f) const { // TODO: can we do this more efficiently? - return DecisionTreeFactor(*this) * f; + return toDecisionTreeFactor() * f; } /* ************************************************************************* */ diff --git a/gtsam_unstable/discrete/SingleValue.h b/gtsam_unstable/discrete/SingleValue.h index 3f7f3011d..b229d8b79 100644 --- a/gtsam_unstable/discrete/SingleValue.h +++ b/gtsam_unstable/discrete/SingleValue.h @@ -48,7 +48,7 @@ namespace gtsam { virtual double operator()(const Values& values) const; /// Convert into a decisiontree - virtual operator DecisionTreeFactor() const; + virtual DecisionTreeFactor toDecisionTreeFactor() const; /// Multiply into a decisiontree virtual DecisionTreeFactor operator*(const DecisionTreeFactor& f) const; diff --git a/gtsam_unstable/discrete/tests/testCSP.cpp b/gtsam_unstable/discrete/tests/testCSP.cpp index 4ab5cd361..f446932e2 100644 --- a/gtsam_unstable/discrete/tests/testCSP.cpp +++ b/gtsam_unstable/discrete/tests/testCSP.cpp @@ -27,12 +27,12 @@ TEST_UNSAFE( BinaryAllDif, allInOne) // Check construction and conversion BinaryAllDiff c1(ID, UT); DecisionTreeFactor f1(ID & UT, "0 1 1 0"); - EXPECT(assert_equal(f1,(DecisionTreeFactor)c1)); + EXPECT(assert_equal(f1,c1.toDecisionTreeFactor())); // Check construction and conversion BinaryAllDiff c2(UT, AZ); DecisionTreeFactor f2(UT & AZ, "0 1 1 0"); - EXPECT(assert_equal(f2,(DecisionTreeFactor)c2)); + EXPECT(assert_equal(f2,c2.toDecisionTreeFactor())); DecisionTreeFactor f3 = f1*f2; EXPECT(assert_equal(f3,c1*f2)); @@ -153,11 +153,11 @@ TEST_UNSAFE( CSP, AllDiff) // Check construction and conversion SingleValue s(AZ,2); DecisionTreeFactor f1(AZ,"0 0 1"); - EXPECT(assert_equal(f1,(DecisionTreeFactor)s)); + EXPECT(assert_equal(f1,s.toDecisionTreeFactor())); // Check construction and conversion AllDiff alldiff(dkeys); - DecisionTreeFactor actual = (DecisionTreeFactor)alldiff; + DecisionTreeFactor actual = alldiff.toDecisionTreeFactor(); // GTSAM_PRINT(actual); // actual.dot("actual"); DecisionTreeFactor f2(ID & AZ & UT, @@ -202,16 +202,16 @@ TEST_UNSAFE( CSP, AllDiff) known[AZ.first] = 2; DiscreteFactor::shared_ptr reduced1 = alldiff.partiallyApply(known); DecisionTreeFactor f3(ID & UT, "0 1 1 1 0 1 1 1 0"); - EXPECT(assert_equal(f3,reduced1->operator DecisionTreeFactor())); + EXPECT(assert_equal(f3,reduced1->toDecisionTreeFactor())); DiscreteFactor::shared_ptr reduced2 = singleValue.partiallyApply(known); DecisionTreeFactor f4(AZ, "0 0 1"); - EXPECT(assert_equal(f4,reduced2->operator DecisionTreeFactor())); + EXPECT(assert_equal(f4,reduced2->toDecisionTreeFactor())); // Parial application, version 2 DiscreteFactor::shared_ptr reduced3 = alldiff.partiallyApply(domains); - EXPECT(assert_equal(f3,reduced3->operator DecisionTreeFactor())); + EXPECT(assert_equal(f3,reduced3->toDecisionTreeFactor())); DiscreteFactor::shared_ptr reduced4 = singleValue.partiallyApply(domains); - EXPECT(assert_equal(f4,reduced4->operator DecisionTreeFactor())); + EXPECT(assert_equal(f4,reduced4->toDecisionTreeFactor())); // full arc-consistency test csp.runArcConsistency(nrColors); diff --git a/gtsam_unstable/nonlinear/LinearizedFactor.cpp b/gtsam_unstable/nonlinear/LinearizedFactor.cpp index 2d3d1af72..3b989be6c 100644 --- a/gtsam_unstable/nonlinear/LinearizedFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearizedFactor.cpp @@ -139,7 +139,7 @@ bool LinearizedFactor::equals(const NonlinearFactor& other, double tol) const { return false; KeyMatrixMap::const_iterator map1 = matrices_.begin(), map2 = e->matrices_.begin(); - for (; map1 != matrices_.end(), map2 != e->matrices_.end(); ++map1, ++map2) + for (; map1 != matrices_.end() && map2 != e->matrices_.end(); ++map1, ++map2) if ((map1->first != map2->first) || !equal_with_abs_tol(map1->second, map2->second, tol)) return false; return true; diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp index 504d958f5..2a4405877 100644 --- a/tests/testOccupancyGrid.cpp +++ b/tests/testOccupancyGrid.cpp @@ -61,8 +61,8 @@ public: throw runtime_error("operator * not implemented"); } - virtual operator DecisionTreeFactor() const{ - throw runtime_error("operator DecisionTreeFactor not implemented"); + virtual DecisionTreeFactor toDecisionTreeFactor() const{ + throw runtime_error("DecisionTreeFactor toDecisionTreeFactor not implemented"); } }; From 10b4c87c0731b628398492d5f31b551540afd74f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 22 Jun 2012 21:46:19 +0000 Subject: [PATCH 439/914] Fixed duplicate path warnings. Let me know if this causes problems. Don't know exactly what the problem or correct fix was/is. --- .cproject | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.cproject b/.cproject index 0b06e9601..7cf644612 100644 --- a/.cproject +++ b/.cproject @@ -35,10 +35,6 @@ From 1d95a379b7e0a2f7331c13e9dcf9e7d5ac919e22 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 22 Jun 2012 21:57:46 +0000 Subject: [PATCH 440/914] Fixed compile problem that prevented install --- examples/DiscreteBayesNet_FG.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/DiscreteBayesNet_FG.cpp b/examples/DiscreteBayesNet_FG.cpp index 136346543..6572236a0 100644 --- a/examples/DiscreteBayesNet_FG.cpp +++ b/examples/DiscreteBayesNet_FG.cpp @@ -97,7 +97,7 @@ int main(int argc, char **argv) { DecisionTreeFactor probSW = jointFG.product(); //Step2: Compute P(W) - DecisionTreeFactor probW = *solver.marginalFactor(WetGrass.first); + DiscreteFactor::shared_ptr probW = solver.marginalFactor(WetGrass.first); //Step3: Computer P(S | W=1) = P(S,W=1)/P(W=1) DiscreteFactor::Values values; @@ -105,11 +105,11 @@ int main(int argc, char **argv) { //print P(S=0|W=1) values[Sprinkler.first] = 0; - cout << "P(S=0|W=1) = " << probSW(values)/probW(values) << endl; + cout << "P(S=0|W=1) = " << probSW(values)/(*probW)(values) << endl; //print P(S=1|W=1) values[Sprinkler.first] = 1; - cout << "P(S=1|W=1) = " << probSW(values)/probW(values) << endl; + cout << "P(S=1|W=1) = " << probSW(values)/(*probW)(values) << endl; // TODO: Method 2 : One way is to modify the factor graph to // incorporate the evidence node and compute the marginal From 073369d666925353611e172dda99606eefc23404 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 22:08:48 +0000 Subject: [PATCH 441/914] Moved Doxyfile and DoxygenLayout.xml to doc folder --- Doxyfile => doc/Doxyfile | 28 +++++++++++----------- DoxygenLayout.xml => doc/DoxygenLayout.xml | 0 makedoc.sh | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) rename Doxyfile => doc/Doxyfile (99%) rename DoxygenLayout.xml => doc/DoxygenLayout.xml (100%) diff --git a/Doxyfile b/doc/Doxyfile similarity index 99% rename from Doxyfile rename to doc/Doxyfile index 2d1dab711..16940c2bd 100644 --- a/Doxyfile +++ b/doc/Doxyfile @@ -52,7 +52,7 @@ PROJECT_LOGO = # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = doc +OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output @@ -638,19 +638,19 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = gtsam/base \ - gtsam/geometry \ - gtsam/inference \ - gtsam/discrete \ - gtsam/linear \ - gtsam/nonlinear \ - gtsam -# gtsam/slam \ -# gtsam_unstable/slam \ -# gtsam_unstable/base \ -# gtsam_unstable/geometry \ -# gtsam_unstable/dynamics \ -# gtsam_unstable +INPUT = ../gtsam/base \ + ../gtsam/geometry \ + ../gtsam/inference \ + ../gtsam/discrete \ + ../gtsam/linear \ + ../gtsam/nonlinear \ + ../gtsam +# ../gtsam/slam \ +# ../gtsam_unstable/slam \ +# ../gtsam_unstable/base \ +# ../gtsam_unstable/geometry \ +# ../gtsam_unstable/dynamics \ +# ../gtsam_unstable # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is diff --git a/DoxygenLayout.xml b/doc/DoxygenLayout.xml similarity index 100% rename from DoxygenLayout.xml rename to doc/DoxygenLayout.xml diff --git a/makedoc.sh b/makedoc.sh index 5acbd3d87..8de348fa5 100755 --- a/makedoc.sh +++ b/makedoc.sh @@ -9,5 +9,5 @@ PATH=$PATH:/Applications/Doxygen.app/Contents/Resources # directory, so that the output 'doc' goes in the gtsam directory. GTSAM_DIR=$(dirname "$0") -cd $GTSAM_DIR +cd $GTSAM_DIR/doc doxygen \ No newline at end of file From 0e46b023746d91c9fed7ae53cb2ab039c25e27e9 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 22:51:32 +0000 Subject: [PATCH 442/914] Added >> stream operator to Matrix to easily read from input streams --- gtsam/base/Matrix.cpp | 49 +++++++++++++++++++-------------- gtsam/base/Matrix.h | 2 +- gtsam/base/tests/testMatrix.cpp | 21 ++++++++++++++ 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index e96d5a329..e11263d3b 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -236,27 +237,33 @@ void save(const Matrix& A, const string &s, const string& filename) { } /* ************************************************************************* */ -//istream& operator>>(istream& inputStream, Matrix& destinationMatrix) { -// destinationMatrix.resize(0,0); -// string line; -// bool first = true; -// while(getline(inputStream, line)) { -// // Read coefficients from file -// vector coeffs; -// std::copy(istream_iterator(stringstream(line)), istream_iterator(), coeffs.end()); -// if(first) { -// destinationMatrix.resize(1, -// } -// if(coeffs.size() != dimLatent()) { -// cout << "Error reading motion file, latent variable dimension does not match file" << endl; -// exit(1); -// } -// -// // Copy coefficients to alignment matrix -// alignment_.conservativeResize(alignment_.rows() + 1, dimLatent()); -// alignment_.row(alignment_.rows() - 1) = Eigen::Map(&coeffs[0], dimLatent()).transpose(); -// } -//} +istream& operator>>(istream& inputStream, Matrix& destinationMatrix) { + string line; + FastList > coeffs; + bool first = true; + size_t width = 0; + size_t height = 0; + while(getline(inputStream, line)) { + // Read coefficients from file + coeffs.push_back(vector()); + if(!first) + coeffs.back().reserve(width); + std::copy(istream_iterator(stringstream(line)), istream_iterator(), + back_insert_iterator >(coeffs.back())); + if(first) + width = coeffs.back().size(); + if(coeffs.size() != width) + throw runtime_error("Error reading matrix from input stream, inconsistent numbers of elements in rows"); + ++ height; + } + + // Copy coefficients to matrix + destinationMatrix.resize(height, width); + int row = 0; + BOOST_FOREACH(const vector& rowVec, coeffs) { + destinationMatrix.row(row) = Eigen::Map(&rowVec[0], width); + } +} /* ************************************************************************* */ void insertSub(Matrix& fullMatrix, const Matrix& subMatrix, size_t i, size_t j) { diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index adb4ee36b..2c13ee7d4 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -188,7 +188,7 @@ void save(const Matrix& A, const std::string &s, const std::string& filename); * tab-, space-, or comma-separated, similar to the format read by the MATLAB * dlmread command. */ -//istream& operator>>(istream& inputStream, Matrix& destinationMatrix); +istream& operator>>(istream& inputStream, Matrix& destinationMatrix); /** * extract submatrix, slice semantics, i.e. range = [i1,i2[ excluding i2 diff --git a/gtsam/base/tests/testMatrix.cpp b/gtsam/base/tests/testMatrix.cpp index abd71bacc..56be42c02 100644 --- a/gtsam/base/tests/testMatrix.cpp +++ b/gtsam/base/tests/testMatrix.cpp @@ -17,6 +17,7 @@ **/ #include +#include #include #include #include @@ -261,6 +262,26 @@ TEST( matrix, insert_sub ) EXPECT(assert_equal(expected, big)); } +/* ************************************************************************* */ +TEST( matrix, stream_read ) { + Matrix expected = Matrix_(3,4, + 1.1, 2.3, 4.2, 7.6, + -0.3, -8e-2, 5.1, 9.0, + 1.2, 3.4, 4.5, 6.7); + + string matrixAsString = + "1.1 2.3 4.2 7.6\n" + "-0.3 -8e-2 5.1 9.0\n\r" // Test extra spaces and windows newlines + "1.2 \t 3.4 4.5 6.7"; // Test tab as separator + + stringstream asStream(matrixAsString, ios::in); + + Matrix actual; + asStream >> actual; + + EXPECT(assert_equal(expected, actual)); +} + /* ************************************************************************* */ TEST( matrix, scale_columns ) { From 5fa1b4b00e1c6e88a9d05e8f3f601b913fd836b9 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 22:51:34 +0000 Subject: [PATCH 443/914] Removed spurious print statement --- gtsam/base/tests/testLieMatrix.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam/base/tests/testLieMatrix.cpp b/gtsam/base/tests/testLieMatrix.cpp index e4070d338..aad28563c 100644 --- a/gtsam/base/tests/testLieMatrix.cpp +++ b/gtsam/base/tests/testLieMatrix.cpp @@ -50,7 +50,6 @@ TEST( LieMatrix, other_constructors ) { /* ************************************************************************* */ TEST(LieMatrix, retract) { LieMatrix init(2,2, 1.0,2.0,3.0,4.0); - init.print("init: "); Vector update = Vector_(4, 3.0, 4.0, 6.0, 7.0); LieMatrix expected(2,2, 4.0, 6.0, 9.0, 11.0); From b7a13c7061c65ea0b8230454e4d14f3ed6694b2a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 22 Jun 2012 22:51:35 +0000 Subject: [PATCH 444/914] Added >> stream operator to Matrix to easily read from input streams --- gtsam/base/Matrix.cpp | 8 ++++++-- gtsam/base/Matrix.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index e11263d3b..1369f13b8 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -248,11 +248,12 @@ istream& operator>>(istream& inputStream, Matrix& destinationMatrix) { coeffs.push_back(vector()); if(!first) coeffs.back().reserve(width); - std::copy(istream_iterator(stringstream(line)), istream_iterator(), + stringstream lineStream(line); + std::copy(istream_iterator(lineStream), istream_iterator(), back_insert_iterator >(coeffs.back())); if(first) width = coeffs.back().size(); - if(coeffs.size() != width) + if(coeffs.back().size() != width) throw runtime_error("Error reading matrix from input stream, inconsistent numbers of elements in rows"); ++ height; } @@ -262,7 +263,10 @@ istream& operator>>(istream& inputStream, Matrix& destinationMatrix) { int row = 0; BOOST_FOREACH(const vector& rowVec, coeffs) { destinationMatrix.row(row) = Eigen::Map(&rowVec[0], width); + ++ row; } + + return inputStream; } /* ************************************************************************* */ diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index 2c13ee7d4..e113e4cf1 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -188,7 +188,7 @@ void save(const Matrix& A, const std::string &s, const std::string& filename); * tab-, space-, or comma-separated, similar to the format read by the MATLAB * dlmread command. */ -istream& operator>>(istream& inputStream, Matrix& destinationMatrix); +std::istream& operator>>(std::istream& inputStream, Matrix& destinationMatrix); /** * extract submatrix, slice semantics, i.e. range = [i1,i2[ excluding i2 From eecafcebe74f6ed5554e198ca8541031fb6f40f9 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Fri, 22 Jun 2012 23:40:04 +0000 Subject: [PATCH 445/914] Fixing Pose2SLAMwSPCG and make a unittest in testPose2SLAM for optimizeSPCG(). Why does SPCG need a constraint between 2 poses to work? GaussNewton still works fine without the constraint! --- examples/Pose2SLAMwSPCG.cpp | 5 +++++ gtsam/slam/pose2SLAM.cpp | 2 ++ gtsam/slam/tests/testPose2SLAM.cpp | 31 +++++++++++++++++++++++++++++ matlab/tests/testPose2SLAMExample.m | 4 ++++ 4 files changed, 42 insertions(+) diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index 53566e7e8..76f51e366 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -85,5 +85,10 @@ int main(void) { cout << "subgraph solver final error = " << graph.error(result) << endl; } + { + Values result = graph.optimizeSPCG(initialEstimate); + result.print("\nFinal result:\n"); + } + return 0 ; } diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp index 110a50551..c0a63e53d 100644 --- a/gtsam/slam/pose2SLAM.cpp +++ b/gtsam/slam/pose2SLAM.cpp @@ -15,6 +15,7 @@ * @author Frank Dellaert **/ +#include #include #include @@ -88,6 +89,7 @@ namespace pose2SLAM { Values Graph::optimizeSPCG(const Values& initialEstimate) const { LevenbergMarquardtParams params; params.linearSolverType = SuccessiveLinearizationParams::CG; + params.iterativeParams = boost::make_shared(); return LevenbergMarquardtOptimizer(*this, initialEstimate, params).optimize(); } diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 96f5dad03..923a67031 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include using namespace gtsam; @@ -190,6 +191,36 @@ TEST_UNSAFE(Pose2SLAM, optimize) { EQUALITY(expectedP1, actualP1); } +/* ************************************************************************* */ +TEST_UNSAFE(Pose2SLAM, optimizeSPCG) { + + // create a Pose graph with one equality constraint and one measurement + pose2SLAM::Graph fg; + fg.addPrior(0, Pose2(0,0,0), noiseModel::Diagonal::Sigmas(Vector_(3,3.0,3.0,1.0))); + fg.addOdometry(0, 1, Pose2(1,2,M_PI_2), covariance); + + // [Duy] For some unknown reason, SPCG needs this constraint to work. GaussNewton doesn't need this. + fg.addConstraint(0, 1, Pose2(1,2,M_PI_2), noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1))); + + // Create initial config + Values initial; + initial.insert(0, Pose2(0,0,0)); + initial.insert(1, Pose2(0,0,0)); + + // Optimize using SPCG + Values actual = fg.optimizeSPCG(initial); + + // Try GaussNewton without the above constraint to see if the problem is underconstrained. Still works! + Values actual2 = GaussNewtonOptimizer(fg, initial).optimize(); + + // Check with expected config + Values expected; + expected.insert(0, Pose2(0,0,0)); + expected.insert(1, Pose2(1,2,M_PI_2)); + CHECK(assert_equal(expected, actual)); + CHECK(assert_equal(expected, actual2)); +} + /* ************************************************************************* */ // test optimization with 3 poses, note we use plain Keys here, not symbols TEST_UNSAFE(Pose2SLAM, optimizeThreePoses) { diff --git a/matlab/tests/testPose2SLAMExample.m b/matlab/tests/testPose2SLAMExample.m index bf4f261e7..707089fea 100644 --- a/matlab/tests/testPose2SLAMExample.m +++ b/matlab/tests/testPose2SLAMExample.m @@ -49,6 +49,7 @@ initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate); +resultSPCG = graph.optimizeSPCG(initialEstimate); %% Plot Covariance Ellipses marginals = graph.marginals(result); @@ -57,4 +58,7 @@ P = marginals.marginalCovariance(1); pose_1 = result.pose(1); CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); +poseSPCG_1 = resultSPCG.pose(1); +CHECK('poseSPCG_1.equals(gtsamPose2,1e-4)',poseSPCG_1.equals(gtsamPose2,1e-4)); + From 9b473023e65c9fe6ffe52663d398e94087a04fc6 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 23 Jun 2012 18:12:15 +0000 Subject: [PATCH 446/914] Fixed warnings --- .cproject | 354 +++++++++++----------- gtsam/base/cholesky.cpp | 1 - gtsam/linear/JacobianFactor.cpp | 12 +- gtsam/linear/tests/testJacobianFactor.cpp | 8 +- gtsam/slam/GeneralSFMFactor.h | 2 +- gtsam/slam/ProjectionFactor.h | 2 +- 6 files changed, 188 insertions(+), 191 deletions(-) diff --git a/.cproject b/.cproject index 7cf644612..9e4d462a1 100644 --- a/.cproject +++ b/.cproject @@ -307,6 +307,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -333,7 +341,6 @@ make - tests/testBayesTree.run true false @@ -341,7 +348,6 @@ make - testBinaryBayesNet.run true false @@ -389,7 +395,6 @@ make - testSymbolicBayesNet.run true false @@ -397,7 +402,6 @@ make - tests/testSymbolicFactor.run true false @@ -405,7 +409,6 @@ make - testSymbolicFactorGraph.run true false @@ -421,20 +424,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -523,22 +517,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -555,6 +533,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -579,26 +573,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -683,26 +677,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -957,7 +951,6 @@ make - testGraph.run true false @@ -965,7 +958,6 @@ make - testJunctionTree.run true false @@ -973,7 +965,6 @@ make - testSymbolicBayesNetB.run true false @@ -1101,7 +1092,6 @@ make - testErrors.run true false @@ -1557,6 +1547,7 @@ make + testSimulated2DOriented.run true false @@ -1596,6 +1587,7 @@ make + testSimulated2D.run true false @@ -1603,6 +1595,7 @@ make + testSimulated3D.run true false @@ -1818,6 +1811,7 @@ make + tests/testGaussianISAM2 true false @@ -1839,6 +1833,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -1857,10 +1947,10 @@ make - -j5 + -j2 check true - true + false true @@ -2040,7 +2130,6 @@ cpack - -G DEB true false @@ -2048,7 +2137,6 @@ cpack - -G RPM true false @@ -2056,7 +2144,6 @@ cpack - -G TGZ true false @@ -2064,7 +2151,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2158,98 +2244,50 @@ true true - + make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 + -j5 check true true true - + make - -j2 - clean + -j5 + testSpirit.run true true true - + make - -j2 - testPoint2.run + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap true true true @@ -2293,46 +2331,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/gtsam/base/cholesky.cpp b/gtsam/base/cholesky.cpp index 2f93fc0fa..86114f4d8 100644 --- a/gtsam/base/cholesky.cpp +++ b/gtsam/base/cholesky.cpp @@ -32,7 +32,6 @@ namespace gtsam { static const double negativePivotThreshold = -1e-1; static const double zeroPivotThreshold = 1e-6; static const double underconstrainedPrior = 1e-5; - static const bool dampUnderconstrained = false; /* ************************************************************************* */ static inline bool choleskyStep(Matrix& ATA, size_t k, size_t order) { diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 417548ed5..f2cea028e 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -95,7 +95,7 @@ namespace gtsam { const Vector& b, const SharedDiagonal& model) : GaussianFactor(i1), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { - if(model->dim() != b.size()) + if(model->dim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); size_t dims[] = { A1.cols(), 1}; @@ -110,7 +110,7 @@ namespace gtsam { const Vector& b, const SharedDiagonal& model) : GaussianFactor(i1,i2), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { - if(model->dim() != b.size()) + if(model->dim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); size_t dims[] = { A1.cols(), A2.cols(), 1}; @@ -126,7 +126,7 @@ namespace gtsam { Index i3, const Matrix& A3, const Vector& b, const SharedDiagonal& model) : GaussianFactor(i1,i2,i3), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { - if(model->dim() != b.size()) + if(model->dim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); size_t dims[] = { A1.cols(), A2.cols(), A3.cols(), 1}; @@ -145,7 +145,7 @@ namespace gtsam { model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { - if(model->dim() != b.size()) + if(model->dim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); size_t* dims = (size_t*)alloca(sizeof(size_t)*(terms.size()+1)); // FIXME: alloca is bad, just ask Google. @@ -166,7 +166,7 @@ namespace gtsam { model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { - if(model->dim() != b.size()) + if(model->dim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); size_t* dims=(size_t*)alloca(sizeof(size_t)*(terms.size()+1)); // FIXME: alloca is bad, just ask Google. @@ -563,7 +563,7 @@ namespace gtsam { /* ************************************************************************* */ void JacobianFactor::setModel(bool anyConstrained, const Vector& sigmas) { - if(sigmas.size() != this->rows()) + if((size_t) sigmas.size() != this->rows()) throw InvalidNoiseModel(this->rows(), sigmas.size()); if (anyConstrained) model_ = noiseModel::Constrained::MixedSigmas(sigmas); diff --git a/gtsam/linear/tests/testJacobianFactor.cpp b/gtsam/linear/tests/testJacobianFactor.cpp index af1d02d1f..9b6071935 100644 --- a/gtsam/linear/tests/testJacobianFactor.cpp +++ b/gtsam/linear/tests/testJacobianFactor.cpp @@ -26,11 +26,9 @@ using namespace std; using namespace gtsam; -static const Index _x0_=0, _x1_=1, _x2_=2, _x3_=3, _x4_=4, _x_=5, _y_=6, _l1_=7, _l11_=8; +static const Index _x0_=0, _x1_=1, _x2_=2, _x_=5, _y_=6, _l11_=8; -static SharedDiagonal - sigma0_1 = noiseModel::Isotropic::Sigma(2,0.1), sigma_02 = noiseModel::Isotropic::Sigma(2,0.2), - constraintModel = noiseModel::Constrained::All(2); +static SharedDiagonal constraintModel = noiseModel::Constrained::All(2); /* ************************************************************************* */ TEST(JacobianFactor, constructor) @@ -140,6 +138,8 @@ TEST(JacobianFactor, error) { #ifdef BROKEN TEST(JacobianFactor, operators ) { + SharedDiagonal sigma0_1 = noiseModel::Isotropic::Sigma(2,0.1); + Matrix I = eye(2); Vector b = Vector_(2,0.2,-0.1); JacobianFactor lf(_x1_, -I, _x2_, I, b, sigma0_1); diff --git a/gtsam/slam/GeneralSFMFactor.h b/gtsam/slam/GeneralSFMFactor.h index f4615c334..9d04a2c96 100644 --- a/gtsam/slam/GeneralSFMFactor.h +++ b/gtsam/slam/GeneralSFMFactor.h @@ -97,8 +97,8 @@ namespace gtsam { if (H2) *H2 = zeros(2, point.dim()); // cout << e.what() << ": Landmark "<< this->key2_.index() // << " behind Camera " << this->key1_.index() << endl; - return zero(2); } + return zero(2); } /** return the measured */ diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index 1b1aeb57b..e607809b0 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -101,8 +101,8 @@ namespace gtsam { if (H2) *H2 = zeros(2,3); std::cout << e.what() << ": Landmark "<< DefaultKeyFormatter(this->key2()) << " moved behind camera " << DefaultKeyFormatter(this->key1()) << std::endl; - return ones(2) * 2.0 * K_->fx(); } + return ones(2) * 2.0 * K_->fx(); } /** return the measurement */ From 188478e4edff4709c235d10264ddb52040495a0e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 23 Jun 2012 19:24:57 +0000 Subject: [PATCH 447/914] make targets for cleaning wrap, comments in gtsam.h --- .cproject | 32 ++++++++++++++++++++++++++++++++ gtsam.h | 1 + 2 files changed, 33 insertions(+) diff --git a/.cproject b/.cproject index 9e4d462a1..7feaf903a 100644 --- a/.cproject +++ b/.cproject @@ -2252,6 +2252,38 @@ true true + + make + -j5 + wrap_gtsam_distclean + true + true + true + + + make + -j5 + wrap_gtsam_unstable_distclean + true + true + true + + + make + -j5 + wrap_gtsam_clean + true + true + true + + + make + -j5 + wrap_gtsam_unstable_clean + true + true + true + make -j5 diff --git a/gtsam.h b/gtsam.h index 78607651b..6fa694330 100644 --- a/gtsam.h +++ b/gtsam.h @@ -16,6 +16,7 @@ * Limitations on methods * - Parsing does not support overloading * - There can only be one method (static or otherwise) with a given name + * - Constness has no effect * Methods must start with a lowercase letter * Static methods must start with a letter (upper or lowercase) and use the "static" keyword * Arguments to functions any of From 5acc52bbae09b4d26eb2dca80367fcd07d50a500 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Sat, 23 Jun 2012 20:07:03 +0000 Subject: [PATCH 448/914] add set/get interface for LMParameters in c++ and matlab --- gtsam.h | 9 ++++ .../nonlinear/LevenbergMarquardtOptimizer.cpp | 41 +++++++++++++++++++ gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 21 ++++++---- gtsam/nonlinear/NonlinearOptimizer.cpp | 40 +++++++++++++++++- gtsam/nonlinear/NonlinearOptimizer.h | 26 +++++++----- matlab/examples/SFMExample.m | 10 ++--- 6 files changed, 123 insertions(+), 24 deletions(-) diff --git a/gtsam.h b/gtsam.h index 6fa694330..8e0aa522a 100644 --- a/gtsam.h +++ b/gtsam.h @@ -961,6 +961,15 @@ class LevenbergMarquardtParams { LevenbergMarquardtParams(); LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose); void print(string s) const; + double getlambdaInitial() const ; + double getlambdaFactor() const ; + double getlambdaUpperBound() const; + string getVerbosityLM() const ; + + void setlambdaInitial(double value); + void setlambdaFactor(double value); + void setlambdaUpperBound(double value); + void setVerbosityLM(string s); }; }///\namespace gtsam diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 5847986be..15c2262fa 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -25,11 +25,52 @@ #include #include #include +#include +#include using namespace std; namespace gtsam { +/* ************************************************************************* */ +LevenbergMarquardtParams::VerbosityLM LevenbergMarquardtParams::verbosityLMTranslator(const std::string &src) const { + std::string s = src; boost::algorithm::to_upper(s); + if (s == "SILENT") return LevenbergMarquardtParams::SILENT; + if (s == "LAMBDA") return LevenbergMarquardtParams::LAMBDA; + if (s == "TRYLAMBDA") return LevenbergMarquardtParams::TRYLAMBDA; + if (s == "TRYCONFIG") return LevenbergMarquardtParams::TRYCONFIG; + if (s == "TRYDELTA") return LevenbergMarquardtParams::TRYDELTA; + if (s == "DAMPED") return LevenbergMarquardtParams::DAMPED; + + /* default is silent */ + return LevenbergMarquardtParams::SILENT; +} + +/* ************************************************************************* */ +std::string LevenbergMarquardtParams::verbosityLMTranslator(VerbosityLM value) const { + std::string s; + switch (value) { + case LevenbergMarquardtParams::SILENT: s = "SILENT" ; break; + case LevenbergMarquardtParams::LAMBDA: s = "LAMBDA" ; break; + case LevenbergMarquardtParams::TRYLAMBDA: s = "TRYLAMBDA" ; break; + case LevenbergMarquardtParams::TRYCONFIG: s = "TRYCONFIG" ; break; + case LevenbergMarquardtParams::TRYDELTA: s = "TRYDELTA" ; break; + case LevenbergMarquardtParams::DAMPED: s = "DAMPED" ; break; + default: s = "UNDEFINED" ; break; + } + return s; +} + +/* ************************************************************************* */ +void LevenbergMarquardtParams::print(const std::string& str) const { + SuccessiveLinearizationParams::print(str); + std::cout << " lambdaInitial: " << lambdaInitial << "\n"; + std::cout << " lambdaFactor: " << lambdaFactor << "\n"; + std::cout << " lambdaUpperBound: " << lambdaUpperBound << "\n"; + std::cout << " verbosityLM: " << verbosityLMTranslator(verbosityLM) << "\n"; + std::cout.flush(); +} + /* ************************************************************************* */ void LevenbergMarquardtOptimizer::iterate() { diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index 231df9f4e..f5e4195da 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -53,15 +53,20 @@ public: lambdaInitial(initial), lambdaFactor(factor), lambdaUpperBound(bound), verbosityLM(VerbosityLM(verbose)) {} virtual ~LevenbergMarquardtParams() {} + virtual void print(const std::string& str = "") const; - virtual void print(const std::string& str = "") const { - SuccessiveLinearizationParams::print(str); - std::cout << " lambdaInitial: " << lambdaInitial << "\n"; - std::cout << " lambdaFactor: " << lambdaFactor << "\n"; - std::cout << " lambdaUpperBound: " << lambdaUpperBound << "\n"; - std::cout << " verbosityLM: " << verbosityLM << "\n"; - std::cout.flush(); - } + inline double getlambdaInitial() const { return lambdaInitial; } + inline double getlambdaFactor() const { return lambdaFactor; } + inline double getlambdaUpperBound() const { return lambdaUpperBound; } + inline std::string getVerbosityLM() const { return verbosityLMTranslator(verbosityLM); } + + inline void setlambdaInitial(double value) { lambdaInitial = value; } + inline void setlambdaFactor(double value) { lambdaFactor = value; } + inline void setlambdaUpperBound(double value) { lambdaUpperBound = value; } + inline void setVerbosityLM(const std::string &s) { verbosityLM = verbosityLMTranslator(s); } + + VerbosityLM verbosityLMTranslator(const std::string &s) const; + std::string verbosityLMTranslator(VerbosityLM value) const; }; /** diff --git a/gtsam/nonlinear/NonlinearOptimizer.cpp b/gtsam/nonlinear/NonlinearOptimizer.cpp index 76d1fe573..5f2f2d7d4 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.cpp +++ b/gtsam/nonlinear/NonlinearOptimizer.cpp @@ -19,11 +19,49 @@ #include #include #include - +#include using namespace std; namespace gtsam { +/* ************************************************************************* */ +NonlinearOptimizerParams::Verbosity NonlinearOptimizerParams::verbosityTranslator(const std::string &src) const { + std::string s = src; boost::algorithm::to_upper(s); + if (s == "SILENT") return NonlinearOptimizerParams::SILENT; + if (s == "ERROR") return NonlinearOptimizerParams::ERROR; + if (s == "VALUES") return NonlinearOptimizerParams::VALUES; + if (s == "DELTA") return NonlinearOptimizerParams::DELTA; + if (s == "LINEAR") return NonlinearOptimizerParams::LINEAR; + + /* default is silent */ + return NonlinearOptimizerParams::SILENT; +} + +/* ************************************************************************* */ +std::string NonlinearOptimizerParams::verbosityTranslator(Verbosity value) const { + std::string s; + switch (value) { + case NonlinearOptimizerParams::SILENT: s = "SILENT"; break; + case NonlinearOptimizerParams::ERROR: s = "ERROR"; break; + case NonlinearOptimizerParams::VALUES: s = "VALUES"; break; + case NonlinearOptimizerParams::DELTA: s = "DELTA"; break; + case NonlinearOptimizerParams::LINEAR: s = "LINEAR"; break; + default: s = "UNDEFINED"; break; + } + return s; +} + +/* ************************************************************************* */ +void NonlinearOptimizerParams::print(const std::string& str) const { + std::cout << str << "\n"; + std::cout << "relative decrease threshold: " << relativeErrorTol << "\n"; + std::cout << "absolute decrease threshold: " << absoluteErrorTol << "\n"; + std::cout << " total error threshold: " << errorTol << "\n"; + std::cout << " maximum iterations: " << maxIterations << "\n"; + std::cout << " verbosity: " << verbosityTranslator(verbosity) << "\n"; + std::cout.flush(); +} + /* ************************************************************************* */ void NonlinearOptimizer::defaultOptimize() { diff --git a/gtsam/nonlinear/NonlinearOptimizer.h b/gtsam/nonlinear/NonlinearOptimizer.h index 2483aa800..8a7670f85 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.h +++ b/gtsam/nonlinear/NonlinearOptimizer.h @@ -48,18 +48,24 @@ public: maxIterations(100.0), relativeErrorTol(1e-5), absoluteErrorTol(1e-5), errorTol(0.0), verbosity(SILENT) {} - virtual void print(const std::string& str = "") const { - std::cout << str << "\n"; - std::cout << "relative decrease threshold: " << relativeErrorTol << "\n"; - std::cout << "absolute decrease threshold: " << absoluteErrorTol << "\n"; - std::cout << " total error threshold: " << errorTol << "\n"; - std::cout << " maximum iterations: " << maxIterations << "\n"; - std::cout << " verbosity level: " << verbosity << std::endl; - } - virtual ~NonlinearOptimizerParams() {} -}; + virtual void print(const std::string& str = "") const ; + inline double getMaxIterations() const { return maxIterations; } + inline double getRelativeErrorTol() const { return relativeErrorTol; } + inline double getAbsoluteErrorTol() const { return absoluteErrorTol; } + inline double getErrorTol() const { return errorTol; } + inline std::string getVerbosity() const { return verbosityTranslator(verbosity); } + + inline void setMaxIterations(double value) { maxIterations = value; } + inline void setRelativeErrorTol(double value) { relativeErrorTol = value; } + inline void setAbsoluteErrorTol(double value) { absoluteErrorTol = value; } + inline void setErrorTol(double value) { errorTol = value ; } + inline void setVerbosity(const std::string &src) { verbosity = verbosityTranslator(src); } + + Verbosity verbosityTranslator(const std::string &s) const; + std::string verbosityTranslator(Verbosity value) const; +}; /** * Base class for a nonlinear optimization state, including the current estimate diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 8aa0105b2..34682e1e6 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -61,14 +61,14 @@ for j=1:size(truth.points,2) end initialEstimate.print(sprintf('\nInitial estimate:\n ')); -%% One-shot Optimize using Levenberg-Marquardt optimization with an ordering from colamd -%result = graph.optimize(initialEstimate,1); -%result.print(sprintf('\nFinal result:\n ')); - %% Fine grain optimization, allowing user to iterate step by step -parameters = gtsamLevenbergMarquardtParams(1e-5, 1e-5, 0, 2); +parameters = gtsamLevenbergMarquardtParams(1e-5, 1e-5, 0, 0); +parameters.setlambdaInitial(1.0); +parameters.setVerbosityLM('trylambda'); + optimizer = graph.optimizer(initialEstimate, parameters); + for i=1:5 optimizer.iterate(); end From 2d0ce1c3cae0c8c33207554e0b13144239fdc2d1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 24 Jun 2012 02:48:12 +0000 Subject: [PATCH 449/914] Streamlining of SLAM namespaces: planarSLAM Values and Graph now derive from Pose3SLAM. visualSLAM Values and Graph now derive from pose3SLAM. Several methods have been renamed to make them consistent through these 4 namespaces: addPrior -> addPosePrior addHardConstraint -> addPoseConstraint addOdometry/addConstraint -> addRelativePose All gtsam and matlab examples/tests run. PS: please don't use the deprecated typedefs in these namespaces. --- examples/LocalizationExample.cpp | 4 +- examples/OdometryExample.cpp | 6 +- examples/PlanarSLAMExample.cpp | 6 +- examples/Pose2SLAMExample.cpp | 12 +- examples/Pose2SLAMExample_advanced.cpp | 6 +- examples/Pose2SLAMExample_graph.cpp | 2 +- examples/Pose2SLAMwSPCG.cpp | 12 +- examples/VisualISAMExample.cpp | 4 +- gtsam.h | 103 ++++++----- gtsam/slam/dataset.cpp | 6 +- gtsam/slam/planarSLAM.cpp | 38 ++--- gtsam/slam/planarSLAM.h | 73 +++----- gtsam/slam/pose2SLAM.cpp | 61 +++---- gtsam/slam/pose2SLAM.h | 47 +++-- gtsam/slam/pose3SLAM.cpp | 57 +++---- gtsam/slam/pose3SLAM.h | 87 +++++++--- gtsam/slam/tests/testAntiFactor.cpp | 6 +- gtsam/slam/tests/testPlanarSLAM.cpp | 18 +- gtsam/slam/tests/testPose2SLAM.cpp | 55 +++--- gtsam/slam/tests/testPose3SLAM.cpp | 16 +- gtsam/slam/tests/testProjectionFactor.cpp | 14 +- gtsam/slam/tests/testStereoFactor.cpp | 6 +- gtsam/slam/visualSLAM.cpp | 78 ++------- gtsam/slam/visualSLAM.h | 161 +++++------------- .../{examples => }/VisualISAMGenerateData.m | 0 matlab/VisualISAMInitialize.m | 2 +- matlab/VisualISAMStep.m | 2 +- matlab/examples/LocalizationExample.m | 15 +- matlab/examples/OdometryExample.m | 11 +- matlab/examples/PlanarSLAMExample.m | 8 +- matlab/examples/PlanarSLAMExample_sampling.m | 6 +- matlab/examples/Pose2SLAMExample.m | 17 +- matlab/examples/Pose2SLAMExample_advanced.m | 8 +- matlab/examples/Pose2SLAMExample_circle.m | 12 +- matlab/examples/Pose2SLAMExample_graph.m | 2 +- matlab/examples/Pose2SLAMwSPCG.m | 2 +- matlab/examples/Pose3SLAMExample.m | 19 ++- matlab/examples/StereoVOExample.m | 10 +- matlab/load3D.m | 2 +- matlab/plot3DTrajectory.m | 3 +- matlab/tests/testLocalizationExample.m | 8 +- matlab/tests/testOdometryExample.m | 8 +- matlab/tests/testPlanarSLAMExample.m | 8 +- matlab/tests/testPose2SLAMExample.m | 16 +- matlab/tests/testPose3SLAMExample.m | 16 +- tests/testGaussianISAM2.cpp | 72 ++++---- tests/testGaussianJunctionTreeB.cpp | 14 +- tests/testGradientDescentOptimizer.cpp | 12 +- tests/testGraph.cpp | 6 +- tests/testInferenceB.cpp | 6 +- tests/testNonlinearISAM.cpp | 2 +- tests/testNonlinearOptimizer.cpp | 2 +- tests/testOccupancyGrid.cpp | 4 +- tests/timeMultifrontalOnDataset.cpp | 2 +- tests/timeSequentialOnDataset.cpp | 2 +- 55 files changed, 523 insertions(+), 652 deletions(-) rename matlab/{examples => }/VisualISAMGenerateData.m (100%) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index 39f8de8a6..21fb36860 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -65,8 +65,8 @@ int main(int argc, char** argv) { // add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - graph.addOdometry(1, 2, odometry, odometryNoise); - graph.addOdometry(2, 3, odometry, odometryNoise); + graph.addRelativePose(1, 2, odometry, odometryNoise); + graph.addRelativePose(2, 3, odometry, odometryNoise); // add unary measurement factors, like GPS, on all three poses SharedDiagonal noiseModel = Diagonal::Sigmas(Vector_(2, 0.1, 0.1)); // 10cm std on x,y diff --git a/examples/OdometryExample.cpp b/examples/OdometryExample.cpp index 87844dfbc..36ad5f228 100644 --- a/examples/OdometryExample.cpp +++ b/examples/OdometryExample.cpp @@ -42,13 +42,13 @@ int main(int argc, char** argv) { // add a Gaussian prior on pose x_1 Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta - graph.addPrior(1, priorMean, priorNoise); // add directly to graph + graph.addPosePrior(1, priorMean, priorNoise); // add directly to graph // add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - graph.addOdometry(1, 2, odometry, odometryNoise); - graph.addOdometry(2, 3, odometry, odometryNoise); + graph.addRelativePose(1, 2, odometry, odometryNoise); + graph.addRelativePose(2, 3, odometry, odometryNoise); // print graph.print("\nFactor graph:\n"); diff --git a/examples/PlanarSLAMExample.cpp b/examples/PlanarSLAMExample.cpp index 2d739416a..f05ffa9b2 100644 --- a/examples/PlanarSLAMExample.cpp +++ b/examples/PlanarSLAMExample.cpp @@ -46,13 +46,13 @@ int main(int argc, char** argv) { // add a Gaussian prior on pose x_1 Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta - graph.addPrior(i1, priorMean, priorNoise); // add directly to graph + graph.addPosePrior(i1, priorMean, priorNoise); // add directly to graph // add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - graph.addOdometry(i1, i2, odometry, odometryNoise); - graph.addOdometry(i2, i3, odometry, odometryNoise); + graph.addRelativePose(i1, i2, odometry, odometryNoise); + graph.addRelativePose(i2, i3, odometry, odometryNoise); // create a noise model for the landmark measurements SharedDiagonal measurementNoise = Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); // 0.1 rad std on bearing, 20cm on range diff --git a/examples/Pose2SLAMExample.cpp b/examples/Pose2SLAMExample.cpp index 61bdb1bda..0777301ea 100644 --- a/examples/Pose2SLAMExample.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -32,18 +32,18 @@ int main(int argc, char** argv) { // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.addPrior(1, priorMean, priorNoise); + graph.addPosePrior(1, priorMean, priorNoise); // 2b. Add odometry factors SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0), odometryNoise); - graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0), odometryNoise); + graph.addRelativePose(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); // 2c. Add pose constraint SharedDiagonal model = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), model); + graph.addRelativePose(5, 2, Pose2(2.0, 0.0, M_PI_2), model); // print graph.print("\nFactor graph:\n"); diff --git a/examples/Pose2SLAMExample_advanced.cpp b/examples/Pose2SLAMExample_advanced.cpp index f727e27e2..b5fcddfcf 100644 --- a/examples/Pose2SLAMExample_advanced.cpp +++ b/examples/Pose2SLAMExample_advanced.cpp @@ -38,13 +38,13 @@ int main(int argc, char** argv) { /* 2.a add prior */ Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta - graph.addPrior(1, priorMean, priorNoise); // add directly to graph + graph.addPosePrior(1, priorMean, priorNoise); // add directly to graph /* 2.b add odometry */ SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - graph.addOdometry(1, 2, odometry, odometryNoise); - graph.addOdometry(2, 3, odometry, odometryNoise); + graph.addRelativePose(1, 2, odometry, odometryNoise); + graph.addRelativePose(2, 3, odometry, odometryNoise); graph.print("full graph"); /* 3. Create the data structure to hold the initial estimate to the solution diff --git a/examples/Pose2SLAMExample_graph.cpp b/examples/Pose2SLAMExample_graph.cpp index 4dcdbea08..d27e184d8 100644 --- a/examples/Pose2SLAMExample_graph.cpp +++ b/examples/Pose2SLAMExample_graph.cpp @@ -39,7 +39,7 @@ int main(int argc, char** argv) { // Add a Gaussian prior on first poses Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.01, 0.01, 0.01)); - graph->addPrior(0, priorMean, priorNoise); + graph->addPosePrior(0, priorMean, priorNoise); // Single Step Optimization using Levenberg-Marquardt pose2SLAM::Values result = graph->optimize(*initial); diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index 76f51e366..e2f3801f7 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -37,18 +37,18 @@ int main(void) { // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.addPrior(1, priorMean, priorNoise); + graph.addPosePrior(1, priorMean, priorNoise); // 2b. Add odometry factors SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); - graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); + graph.addRelativePose(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); // 2c. Add pose constraint SharedDiagonal constraintUncertainty = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + graph.addRelativePose(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); // print graph.print("\nFactor graph:\n"); diff --git a/examples/VisualISAMExample.cpp b/examples/VisualISAMExample.cpp index c2f6f5d5b..25e993bca 100644 --- a/examples/VisualISAMExample.cpp +++ b/examples/VisualISAMExample.cpp @@ -54,7 +54,7 @@ int main(int argc, char* argv[]) { newFactors.addPosePrior(X(0), data.poses[0], data.noiseX); // Second pose with odometry measurement - newFactors.addOdometry(X(0), X(1), data.odometry, data.noiseX); + newFactors.addRelativePose(X(0), X(1), data.odometry, data.noiseX); // Visual measurements at both poses for (size_t i=0; i<2; ++i) { @@ -85,7 +85,7 @@ int main(int argc, char* argv[]) { visualSLAM::Graph newFactors; // Factor for odometry measurements, simulated by adding Gaussian noise to the ground-truth. Pose3 odoMeasurement = data.odometry; - newFactors.addOdometry(X(i-1), X(i), data.odometry, data.noiseX); + newFactors.addRelativePose(X(i-1), X(i), data.odometry, data.noiseX); // Factors for visual measurements for (size_t j=0; j load2D( poses->insert(id2, poses->at(id1) * l1Xl2); pose2SLAM::Graph::sharedFactor factor( - new pose2SLAM::Odometry(id1, id2, l1Xl2, *model)); + new BetweenFactor(id1, id2, l1Xl2, *model)); graph->push_back(factor); } is.ignore(LINESIZE, '\n'); @@ -189,8 +189,8 @@ void save2D(const pose2SLAM::Graph& graph, const Values& config, Matrix RR = trans(R) * R; //prod(trans(R),R); BOOST_FOREACH(boost::shared_ptr factor_, graph) { - boost::shared_ptr factor = - boost::dynamic_pointer_cast(factor_); + boost::shared_ptr > factor = + boost::dynamic_pointer_cast >(factor_); if (!factor) continue; diff --git a/gtsam/slam/planarSLAM.cpp b/gtsam/slam/planarSLAM.cpp index e385cb66f..20c149b66 100644 --- a/gtsam/slam/planarSLAM.cpp +++ b/gtsam/slam/planarSLAM.cpp @@ -22,49 +22,39 @@ namespace planarSLAM { /* ************************************************************************* */ - Graph::Graph(const NonlinearFactorGraph& graph) : - NonlinearFactorGraph(graph) {} - - /* ************************************************************************* */ - void Graph::addPrior(Key i, const Pose2& p, const SharedNoiseModel& model) { - sharedFactor factor(new Prior(i, p, model)); - push_back(factor); + Matrix Values::points() const { + size_t j=0; + ConstFiltered points = filter(); + Matrix result(points.size(),2); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, points) + result.row(j++) = keyValue.value.vector(); + return result; } /* ************************************************************************* */ - void Graph::addPoseConstraint(Key i, const Pose2& p) { - sharedFactor factor(new Constraint(i, p)); - push_back(factor); + void Graph::addPointConstraint(Key pointKey, const Point2& p) { + push_back(boost::make_shared >(pointKey, p)); } /* ************************************************************************* */ - void Graph::addOdometry(Key i1, Key i2, const Pose2& odometry, const SharedNoiseModel& model) { - sharedFactor factor(new Odometry(i1, i2, odometry, model)); - push_back(factor); + void Graph::addPointPrior(Key pointKey, const Point2& p, const SharedNoiseModel& model) { + push_back(boost::make_shared >(pointKey, p, model)); } /* ************************************************************************* */ void Graph::addBearing(Key i, Key j, const Rot2& z, const SharedNoiseModel& model) { - sharedFactor factor(new Bearing(i, j, z, model)); - push_back(factor); + push_back(boost::make_shared >(i, j, z, model)); } /* ************************************************************************* */ void Graph::addRange(Key i, Key j, double z, const SharedNoiseModel& model) { - sharedFactor factor(new Range(i, j, z, model)); - push_back(factor); + push_back(boost::make_shared >(i, j, z, model)); } /* ************************************************************************* */ void Graph::addBearingRange(Key i, Key j, const Rot2& z1, double z2, const SharedNoiseModel& model) { - sharedFactor factor(new BearingRange(i, j, z1, z2, model)); - push_back(factor); - } - - /* ************************************************************************* */ - Values Graph::optimize(const Values& initialEstimate) const { - return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); + push_back(boost::make_shared >(i, j, z1, z2, model)); } /* ************************************************************************* */ diff --git a/gtsam/slam/planarSLAM.h b/gtsam/slam/planarSLAM.h index aecd22b75..aeb38794e 100644 --- a/gtsam/slam/planarSLAM.h +++ b/gtsam/slam/planarSLAM.h @@ -17,6 +17,7 @@ #pragma once +#include #include #include #include @@ -33,75 +34,50 @@ namespace planarSLAM { using namespace gtsam; /* - * List of typedefs for factors - */ - - /// A hard constraint for poses to enforce particular values - typedef NonlinearEquality Constraint; - /// A prior factor to bias the value of a pose - typedef PriorFactor Prior; - /// A factor between two poses set with a Pose2 - typedef BetweenFactor Odometry; - /// A factor between a pose and a point to express difference in rotation (set with a Rot2) - typedef BearingFactor Bearing; - /// A factor between a pose and a point to express distance between them (set with a double) - typedef RangeFactor Range; - /// A factor between a pose and a point to express difference in rotation and location - typedef BearingRangeFactor BearingRange; - - /* - * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper + * Values class, inherited from pose2SLAM::Values, mainly used as a convenience for MATLAB wrapper * @addtogroup SLAM */ - struct Values: public gtsam::Values { + struct Values: public pose2SLAM::Values { /// Default constructor Values() {} /// Copy constructor Values(const gtsam::Values& values) : - gtsam::Values(values) { + pose2SLAM::Values(values) { } - /// get a pose - Pose2 pose(Key i) const { return at(i); } - /// get a point Point2 point(Key j) const { return at(j); } - /// insert a pose - void insertPose(Key i, const Pose2& pose) { insert(i, pose); } - /// insert a point void insertPoint(Key j, const Point2& point) { insert(j, point); } - /// update a pose - void updatePose(Key i, const Pose2& pose) { update(i, pose); } - /// update a point void updatePoint(Key j, const Point2& point) { update(j, point); } + + /// get all [x,y] coordinates in a 2*n matrix + Matrix points() const; }; /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper * @addtogroup SLAM */ - struct Graph: public NonlinearFactorGraph { + struct Graph: public pose2SLAM::Graph { /// Default constructor for a NonlinearFactorGraph Graph(){} /// Creates a NonlinearFactorGraph based on another NonlinearFactorGraph - Graph(const NonlinearFactorGraph& graph); + Graph(const NonlinearFactorGraph& graph): + pose2SLAM::Graph(graph) {} - /// Biases the value of pose key with Pose2 p given a noise model - void addPrior(Key i, const Pose2& pose, const SharedNoiseModel& noiseModel); + /// Creates a hard constraint on a point + void addPointConstraint(Key j, const Point2& p); - /// Creates a hard constraint on the ith pose - void addPoseConstraint(Key i, const Pose2& pose); - - /// Creates an odometry factor between poses with keys i1 and i2 - void addOdometry(Key i1, Key i2, const Pose2& odometry, const SharedNoiseModel& model); + /// Adds a prior with mean p and given noise model on point j + void addPointPrior(Key j, const Point2& p, const SharedNoiseModel& model); /// Creates a bearing measurement from pose i to point j void addBearing(Key i, Key j, const Rot2& bearing, const SharedNoiseModel& model); @@ -111,16 +87,21 @@ namespace planarSLAM { /// Creates a range/bearing measurement from pose i to point j void addBearingRange(Key i, Key j, const Rot2& bearing, double range, const SharedNoiseModel& model); - - /// Optimize - Values optimize(const Values& initialEstimate) const; - - /// Return a Marginals object - Marginals marginals(const Values& solution) const { - return Marginals(*this,solution); - } }; } // planarSLAM +/** + * Backwards compatibility and wrap use only, avoid using + */ +namespace planarSLAM { + typedef gtsam::NonlinearEquality Constraint; ///< \deprecated typedef for backwards compatibility + typedef gtsam::PriorFactor Prior; ///< \deprecated typedef for backwards compatibility + typedef gtsam::BetweenFactor Odometry; ///< \deprecated typedef for backwards compatibility + typedef gtsam::BearingFactor Bearing; ///< \deprecated typedef for backwards compatibility + typedef gtsam::RangeFactor Range; ///< \deprecated typedef for backwards compatibility + typedef gtsam::BearingRangeFactor BearingRange; ///< \deprecated typedef for backwards compatibility +} + + diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp index c0a63e53d..9607448c7 100644 --- a/gtsam/slam/pose2SLAM.cpp +++ b/gtsam/slam/pose2SLAM.cpp @@ -17,7 +17,6 @@ #include #include -#include // Use pose2SLAM namespace for specific SLAM instance @@ -33,67 +32,53 @@ namespace pose2SLAM { } /* ************************************************************************* */ - Vector Values::xs() const { + Matrix Values::poses() const { size_t j=0; - Vector result(size()); ConstFiltered poses = filter(); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.x(); + Matrix result(poses.size(),3); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) { + const Pose2& r = keyValue.value; + result.row(j++) = Matrix_(1,3, r.x(), r.y(), r.theta()); + } return result; } - /* ************************************************************************* */ - Vector Values::ys() const { - size_t j=0; - Vector result(size()); - ConstFiltered poses = filter(); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.y(); - return result; - } - - /* ************************************************************************* */ - Vector Values::thetas() const { - size_t j=0; - Vector result(size()); - ConstFiltered poses = filter(); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.theta (); - return result; - } - - /* ************************************************************************* */ - void Graph::addPrior(Key i, const Pose2& p, const SharedNoiseModel& model) { - sharedFactor factor(new Prior(i, p, model)); - push_back(factor); - } - /* ************************************************************************* */ void Graph::addPoseConstraint(Key i, const Pose2& p) { - sharedFactor factor(new HardConstraint(i, p)); + sharedFactor factor(new NonlinearEquality(i, p)); push_back(factor); } /* ************************************************************************* */ - void Graph::addOdometry(Key i1, Key i2, const Pose2& z, + void Graph::addPosePrior(Key i, const Pose2& p, const SharedNoiseModel& model) { + sharedFactor factor(new PriorFactor(i, p, model)); + push_back(factor); + } + + /* ************************************************************************* */ + void Graph::addRelativePose(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model) { - sharedFactor factor(new Odometry(i1, i2, z, model)); + sharedFactor factor(new BetweenFactor(i1, i2, z, model)); push_back(factor); } /* ************************************************************************* */ - Values Graph::optimize(const Values& initialEstimate) const { - return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); + Values Graph::optimize(const Values& initialEstimate, size_t verbosity) const { + LevenbergMarquardtParams params; + params.verbosity = (NonlinearOptimizerParams::Verbosity)verbosity; + LevenbergMarquardtOptimizer optimizer(*this, initialEstimate,params); + return optimizer.optimize(); } - Values Graph::optimizeSPCG(const Values& initialEstimate) const { + /* ************************************************************************* */ + Values Graph::optimizeSPCG(const Values& initialEstimate, size_t verbosity) const { LevenbergMarquardtParams params; + params.verbosity = (NonlinearOptimizerParams::Verbosity)verbosity; params.linearSolverType = SuccessiveLinearizationParams::CG; params.iterativeParams = boost::make_shared(); return LevenbergMarquardtOptimizer(*this, initialEstimate, params).optimize(); } - /* ************************************************************************* */ } // pose2SLAM diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h index 062893a9c..6349af5d5 100644 --- a/gtsam/slam/pose2SLAM.h +++ b/gtsam/slam/pose2SLAM.h @@ -22,13 +22,14 @@ #include #include #include +#include #include #include // Use pose2SLAM namespace for specific SLAM instance namespace pose2SLAM { - using namespace gtsam; + using namespace gtsam; /* * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper @@ -64,22 +65,14 @@ namespace pose2SLAM { /// get a pose Pose2 pose(Key i) const { return at(i); } - Vector xs() const; ///< get all x coordinates in a matrix - Vector ys() const; ///< get all y coordinates in a matrix - Vector thetas() const; ///< get all orientations in a matrix + /// get all [x,y,theta] coordinates in a 3*m matrix + Matrix poses() const; }; /** * List of typedefs for factors */ - /// A hard constraint to enforce a specific value for a pose - typedef NonlinearEquality HardConstraint; - /// A prior factor on a pose with Pose2 data type. - typedef PriorFactor Prior; - /// A factor to add an odometry measurement between two poses. - typedef BetweenFactor Odometry; - /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper * @addtogroup SLAM @@ -92,25 +85,23 @@ namespace pose2SLAM { Graph(){} /// Creates a NonlinearFactorGraph based on another NonlinearFactorGraph - Graph(const NonlinearFactorGraph& graph); - - /// Adds a Pose2 prior with mean p and given noise model on pose i - void addPrior(Key i, const Pose2& p, const SharedNoiseModel& model); + Graph(const NonlinearFactorGraph& graph): + NonlinearFactorGraph(graph) {} /// Creates a hard constraint for key i with the given Pose2 p. void addPoseConstraint(Key i, const Pose2& p); - /// Creates an odometry factor between poses with keys i1 and i2 - void addOdometry(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model); + /// Adds a Pose2 prior with mean p and given noise model on pose i + void addPosePrior(Key i, const Pose2& p, const SharedNoiseModel& model); - /// AddConstraint adds a soft constraint between factor between keys i and j - void addConstraint(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model) { - addOdometry(i1,i2,z,model); // same for now - } + /// Creates an relative pose factor between poses with keys i1 and i2 + void addRelativePose(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model); /// Optimize - Values optimize(const Values& initialEstimate) const; - Values optimizeSPCG(const Values& initialEstimate) const; + Values optimize(const Values& initialEstimate, size_t verbosity=NonlinearOptimizerParams::SILENT) const; + + /// Optimize using subgraph preconditioning + Values optimizeSPCG(const Values& initialEstimate, size_t verbosity=NonlinearOptimizerParams::SILENT) const; /// Return a Marginals object Marginals marginals(const Values& solution) const { @@ -121,5 +112,11 @@ namespace pose2SLAM { } // pose2SLAM - - +/** + * Backwards compatibility and wrap use only, avoid using + */ +namespace pose2SLAM { + typedef gtsam::NonlinearEquality HardConstraint; ///< \deprecated typedef for backwards compatibility + typedef gtsam::PriorFactor Prior; ///< \deprecated typedef for backwards compatibility + typedef gtsam::BetweenFactor Odometry; ///< \deprecated typedef for backwards compatibility +} diff --git a/gtsam/slam/pose3SLAM.cpp b/gtsam/slam/pose3SLAM.cpp index c7f8a29c5..2a5f435fc 100644 --- a/gtsam/slam/pose3SLAM.cpp +++ b/gtsam/slam/pose3SLAM.cpp @@ -42,51 +42,38 @@ namespace pose3SLAM { } /* ************************************************************************* */ - Vector Values::xs() const { - size_t j=0; - Vector result(size()); - ConstFiltered poses = filter(); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.x(); - return result; - } + Matrix Values::translations() const { + size_t j=0; + ConstFiltered poses = filter(); + Matrix result(poses.size(),3); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) + result.row(j++) = keyValue.value.translation().vector(); + return result; + } /* ************************************************************************* */ - Vector Values::ys() const { - size_t j=0; - Vector result(size()); - ConstFiltered poses = filter(); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.y(); - return result; - } - - /* ************************************************************************* */ - Vector Values::zs() const { - size_t j=0; - Vector result(size()); - ConstFiltered poses = filter(); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.z(); - return result; - } - - /* ************************************************************************* */ - void Graph::addPrior(Key i, const Pose3& p, const SharedNoiseModel& model) { - sharedFactor factor(new Prior(i, p, model)); + void Graph::addPoseConstraint(Key i, const Pose3& p) { + sharedFactor factor(new NonlinearEquality(i, p)); push_back(factor); } /* ************************************************************************* */ - void Graph::addConstraint(Key i1, Key i2, const Pose3& z, const SharedNoiseModel& model) { - sharedFactor factor(new Constraint(i1, i2, z, model)); + void Graph::addPosePrior(Key i, const Pose3& p, const SharedNoiseModel& model) { + sharedFactor factor(new PriorFactor(i, p, model)); push_back(factor); } /* ************************************************************************* */ - void Graph::addHardConstraint(Key i, const Pose3& p) { - sharedFactor factor(new HardConstraint(i, p)); - push_back(factor); + void Graph::addRelativePose(Key i1, Key i2, const Pose3& z, const SharedNoiseModel& model) { + push_back(boost::make_shared >(i1, i2, z, model)); + } + + /* ************************************************************************* */ + Values Graph::optimize(const Values& initialEstimate, size_t verbosity) const { + LevenbergMarquardtParams params; + params.verbosity = (NonlinearOptimizerParams::Verbosity)verbosity; + LevenbergMarquardtOptimizer optimizer(*this, initialEstimate,params); + return optimizer.optimize(); } /* ************************************************************************* */ diff --git a/gtsam/slam/pose3SLAM.h b/gtsam/slam/pose3SLAM.h index 41d301e08..8e60265e8 100644 --- a/gtsam/slam/pose3SLAM.h +++ b/gtsam/slam/pose3SLAM.h @@ -19,16 +19,16 @@ #include #include +#include #include #include #include -#include #include /// Use pose3SLAM namespace for specific SLAM instance namespace pose3SLAM { - using namespace gtsam; + using namespace gtsam; /* * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper @@ -63,17 +63,11 @@ namespace pose3SLAM { /// get a pose Pose3 pose(Key i) const { return at(i); } - Vector xs() const; ///< get all x coordinates in a matrix - Vector ys() const; ///< get all y coordinates in a matrix - Vector zs() const; ///< get all z coordinates in a matrix - }; + /// check if value with specified key exists + bool exists(Key i) const { return gtsam::Values::exists(i); } - /// A prior factor on Key with Pose3 data type. - typedef PriorFactor Prior; - /// A factor to put constraints between two factors. - typedef BetweenFactor Constraint; - /// A hard constraint would enforce that the given key would have the input value in the results. - typedef NonlinearEquality HardConstraint; + Matrix translations() const; ///< get all pose translations coordinates in a matrix + }; /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper @@ -81,33 +75,70 @@ namespace pose3SLAM { */ struct Graph: public NonlinearFactorGraph { - /// Adds a factor between keys of the same type - void addPrior(Key i, const Pose3& p, const SharedNoiseModel& model); + /** + * Add a prior on a pose + * @param key variable key of the camera pose + * @param p around which soft prior is defined + * @param model uncertainty model of this prior + */ + void addPosePrior(Key poseKey, const Pose3& p = Pose3(), const SharedNoiseModel& model = noiseModel::Unit::Create(6)); - /// Creates a between factor between keys i and j with a noise model with Pos3 z in the graph - void addConstraint(Key i1, Key i2, const Pose3& z, const SharedNoiseModel& model); + /** + * Add a constraint on a pose (for now, *must* be satisfied in any Values) + * @param key variable key of the camera pose + * @param p to which pose to constrain it to + */ + void addPoseConstraint(Key poseKey, const Pose3& p = Pose3()); - /// Creates a hard constraint for key i with the given Pose3 p. - void addHardConstraint(Key i, const Pose3& p); + /** + * Add a relative pose measurement between two poses + * @param x1 variable key of the first camera pose + * @param x2 variable key of the second camera pose + * @param relative pose measurement from x1 to x2 (x1.between(x2)) + * @param model uncertainty model of this measurement + */ + void addRelativePose(Key x1, Key x2, const Pose3& z, const SharedNoiseModel& model); - /// Optimize - Values optimize(const Values& initialEstimate) { - return LevenbergMarquardtOptimizer(*this, initialEstimate).optimize(); - } + /** + * Optimize the graph + * @param initialEstimate initial estimate of all variables in the graph + * @param pointKey variable key of the landmark + * @param range approximate range to landmark + * @param model uncertainty model of this prior + */ + Values optimize(const Values& initialEstimate, size_t verbosity=NonlinearOptimizerParams::SILENT) const; + + /** + * Setup and return a LevenbargMarquardtOptimizer + * @param initialEstimate initial estimate of all variables in the graph + * @param parameters optimizer's parameters + * @return a LevenbergMarquardtOptimizer object, which you can use to control the optimization process + */ + LevenbergMarquardtOptimizer optimizer(const Values& initialEstimate, + const LevenbergMarquardtParams& parameters = LevenbergMarquardtParams()) const { + return LevenbergMarquardtOptimizer((*this), initialEstimate, parameters); + } /// Return a Marginals object Marginals marginals(const Values& solution) const { - return Marginals(*this,solution); + return Marginals(*this,solution); } + }; } // pose3SLAM /** - * Backwards compatibility + * Backwards compatibility and wrap use only, avoid using */ -namespace gtsam { - typedef pose3SLAM::Prior Pose3Prior; ///< Typedef for Prior class for backwards compatibility - typedef pose3SLAM::Constraint Pose3Factor; ///< Typedef for Constraint class for backwards compatibility - typedef pose3SLAM::Graph Pose3Graph; ///< Typedef for Graph class for backwards compatibility +namespace pose3SLAM { + typedef gtsam::PriorFactor Prior; ///< \deprecated typedef for backwards compatibility + typedef gtsam::BetweenFactor Constraint; ///< \deprecated typedef for backwards compatibility + typedef gtsam::NonlinearEquality HardConstraint; ///< \deprecated typedef for backwards compatibility } +namespace gtsam { + typedef pose3SLAM::Prior Pose3Prior; ///< \deprecated typedef for backwards compatibility + typedef pose3SLAM::Constraint Pose3Factor; ///< \deprecated typedef for backwards compatibility + typedef pose3SLAM::Graph Pose3Graph; ///< \deprecated typedef for backwards compatibility +} + diff --git a/gtsam/slam/tests/testAntiFactor.cpp b/gtsam/slam/tests/testAntiFactor.cpp index b73118352..d99313767 100644 --- a/gtsam/slam/tests/testAntiFactor.cpp +++ b/gtsam/slam/tests/testAntiFactor.cpp @@ -96,8 +96,8 @@ TEST( AntiFactor, EquivalentBayesNet) SharedNoiseModel sigma(noiseModel::Unit::Create(Pose3::Dim())); boost::shared_ptr graph(new pose3SLAM::Graph()); - graph->addPrior(1, pose1, sigma); - graph->addConstraint(1, 2, pose1.between(pose2), sigma); + graph->addPosePrior(1, pose1, sigma); + graph->addRelativePose(1, 2, pose1.between(pose2), sigma); // Create a configuration corresponding to the ground truth boost::shared_ptr values(new Values()); @@ -115,7 +115,7 @@ TEST( AntiFactor, EquivalentBayesNet) VectorValues expectedDeltas = optimize(*expectedBayesNet); // Add an additional factor between Pose1 and Pose2 - pose3SLAM::Constraint::shared_ptr f1(new pose3SLAM::Constraint(1, 2, z, sigma)); + BetweenFactor::shared_ptr f1(new BetweenFactor(1, 2, z, sigma)); graph->push_back(f1); // Add the corresponding AntiFactor between Pose1 and Pose2 diff --git a/gtsam/slam/tests/testPlanarSLAM.cpp b/gtsam/slam/tests/testPlanarSLAM.cpp index 81a15290c..cbe33e1da 100644 --- a/gtsam/slam/tests/testPlanarSLAM.cpp +++ b/gtsam/slam/tests/testPlanarSLAM.cpp @@ -38,7 +38,7 @@ SharedNoiseModel /* ************************************************************************* */ TEST( planarSLAM, PriorFactor_equals ) { - planarSLAM::Prior factor1(i2, x1, I3), factor2(i2, x2, I3); + PriorFactor factor1(i2, x1, I3), factor2(i2, x2, I3); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -49,7 +49,7 @@ TEST( planarSLAM, BearingFactor ) { // Create factor Rot2 z = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 - planarSLAM::Bearing factor(i2, j3, z, sigma); + BearingFactor factor(i2, j3, z, sigma); // create config planarSLAM::Values c; @@ -64,7 +64,7 @@ TEST( planarSLAM, BearingFactor ) /* ************************************************************************* */ TEST( planarSLAM, BearingFactor_equals ) { - planarSLAM::Bearing + BearingFactor factor1(i2, j3, Rot2::fromAngle(0.1), sigma), factor2(i2, j3, Rot2::fromAngle(2.3), sigma); EXPECT(assert_equal(factor1, factor1, 1e-5)); @@ -77,7 +77,7 @@ TEST( planarSLAM, RangeFactor ) { // Create factor double z(sqrt(2.0) - 0.22); // h(x) - z = 0.22 - planarSLAM::Range factor(i2, j3, z, sigma); + RangeFactor factor(i2, j3, z, sigma); // create config planarSLAM::Values c; @@ -92,7 +92,7 @@ TEST( planarSLAM, RangeFactor ) /* ************************************************************************* */ TEST( planarSLAM, RangeFactor_equals ) { - planarSLAM::Range factor1(i2, j3, 1.2, sigma), factor2(i2, j3, 7.2, sigma); + RangeFactor factor1(i2, j3, 1.2, sigma), factor2(i2, j3, 7.2, sigma); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -104,7 +104,7 @@ TEST( planarSLAM, BearingRangeFactor ) // Create factor Rot2 r = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 double b(sqrt(2.0) - 0.22); // h(x) - z = 0.22 - planarSLAM::BearingRange factor(i2, j3, r, b, sigma2); + BearingRangeFactor factor(i2, j3, r, b, sigma2); // create config planarSLAM::Values c; @@ -119,7 +119,7 @@ TEST( planarSLAM, BearingRangeFactor ) /* ************************************************************************* */ TEST( planarSLAM, BearingRangeFactor_equals ) { - planarSLAM::BearingRange + BearingRangeFactor factor1(i2, j3, Rot2::fromAngle(0.1), 7.3, sigma2), factor2(i2, j3, Rot2::fromAngle(3), 2.0, sigma2); EXPECT(assert_equal(factor1, factor1, 1e-5)); @@ -137,7 +137,7 @@ TEST( planarSLAM, BearingRangeFactor_poses ) /* ************************************************************************* */ TEST( planarSLAM, PoseConstraint_equals ) { - planarSLAM::Constraint factor1(i2, x2), factor2(i2, x3); + NonlinearEquality factor1(i2, x2), factor2(i2, x3); EXPECT(assert_equal(factor1, factor1, 1e-5)); EXPECT(assert_equal(factor2, factor2, 1e-5)); EXPECT(assert_inequal(factor1, factor2, 1e-5)); @@ -159,7 +159,7 @@ TEST( planarSLAM, constructor ) G.addPoseConstraint(i2, x2); // make it feasible :-) // Add odometry - G.addOdometry(i2, i3, Pose2(0, 0, M_PI_4), I3); + G.addRelativePose(i2, i3, Pose2(0, 0, M_PI_4), I3); // Create bearing factor Rot2 z1 = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp index 923a67031..766d06ded 100644 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ b/gtsam/slam/tests/testPose2SLAM.cpp @@ -32,7 +32,7 @@ using namespace boost::assign; #include using namespace std; -typedef pose2SLAM::Odometry Pose2Factor; +typedef BetweenFactor Pose2Factor; // common measurement covariance static double sx=0.5, sy=0.5,st=0.1; @@ -49,9 +49,8 @@ TEST_UNSAFE( Pose2SLAM, XYT ) pose2SLAM::Values values; values.insertPose(1,Pose2(1,2,3)); values.insertPose(2,Pose2(4,5,6)); - EXPECT(assert_equal(Vector_(2,1.0,4.0),values.xs())); - EXPECT(assert_equal(Vector_(2,2.0,5.0),values.ys())); - EXPECT(assert_equal(Vector_(2,3.0,6.0-2*M_PI),values.thetas())); + Matrix expected = Matrix_(2,3, 1.0,2.0,3.0, 4.0,5.0,6.0-2*M_PI); + EXPECT(assert_equal(expected,values.poses())); } /* ************************************************************************* */ @@ -106,7 +105,7 @@ TEST_UNSAFE( Pose2SLAM, constructor ) // create a factor between unknown poses p1 and p2 Pose2 measured(2,2,M_PI_2); pose2SLAM::Graph graph; - graph.addOdometry(1,2,measured, covariance); + graph.addRelativePose(1,2,measured, covariance); // get the size of the graph size_t actual = graph.size(); // verify @@ -121,7 +120,7 @@ TEST_UNSAFE( Pose2SLAM, linearization ) Pose2 measured(2,2,M_PI_2); Pose2Factor constraint(1, 2, measured, covariance); pose2SLAM::Graph graph; - graph.addOdometry(1,2,measured, covariance); + graph.addRelativePose(1,2,measured, covariance); // Choose a linearization point Pose2 p1(1.1,2,M_PI_2); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) @@ -159,7 +158,7 @@ TEST_UNSAFE(Pose2SLAM, optimize) { // create a Pose graph with one equality constraint and one measurement pose2SLAM::Graph fg; fg.addPoseConstraint(0, Pose2(0,0,0)); - fg.addOdometry(0, 1, Pose2(1,2,M_PI_2), covariance); + fg.addRelativePose(0, 1, Pose2(1,2,M_PI_2), covariance); // Create initial config Values initial; @@ -196,11 +195,11 @@ TEST_UNSAFE(Pose2SLAM, optimizeSPCG) { // create a Pose graph with one equality constraint and one measurement pose2SLAM::Graph fg; - fg.addPrior(0, Pose2(0,0,0), noiseModel::Diagonal::Sigmas(Vector_(3,3.0,3.0,1.0))); - fg.addOdometry(0, 1, Pose2(1,2,M_PI_2), covariance); + fg.addPosePrior(0, Pose2(0,0,0), noiseModel::Diagonal::Sigmas(Vector_(3,3.0,3.0,1.0))); + fg.addRelativePose(0, 1, Pose2(1,2,M_PI_2), covariance); // [Duy] For some unknown reason, SPCG needs this constraint to work. GaussNewton doesn't need this. - fg.addConstraint(0, 1, Pose2(1,2,M_PI_2), noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1))); + fg.addRelativePose(0, 1, Pose2(1,2,M_PI_2), noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1))); // Create initial config Values initial; @@ -208,7 +207,7 @@ TEST_UNSAFE(Pose2SLAM, optimizeSPCG) { initial.insert(1, Pose2(0,0,0)); // Optimize using SPCG - Values actual = fg.optimizeSPCG(initial); + Values actual = fg.optimizeSPCG(initial,0); // Try GaussNewton without the above constraint to see if the problem is underconstrained. Still works! Values actual2 = GaussNewtonOptimizer(fg, initial).optimize(); @@ -233,9 +232,9 @@ TEST_UNSAFE(Pose2SLAM, optimizeThreePoses) { pose2SLAM::Graph fg; fg.addPoseConstraint(0, p0); Pose2 delta = p0.between(p1); - fg.addOdometry(0, 1, delta, covariance); - fg.addOdometry(1, 2, delta, covariance); - fg.addOdometry(2, 0, delta, covariance); + fg.addRelativePose(0, 1, delta, covariance); + fg.addRelativePose(1, 2, delta, covariance); + fg.addRelativePose(2, 0, delta, covariance); // Create initial config pose2SLAM::Values initial; @@ -269,12 +268,12 @@ TEST_UNSAFE(Pose2SLAM, optimizeCircle) { pose2SLAM::Graph fg; fg.addPoseConstraint(0, p0); Pose2 delta = p0.between(p1); - fg.addOdometry(0,1, delta, covariance); - fg.addOdometry(1,2, delta, covariance); - fg.addOdometry(2,3, delta, covariance); - fg.addOdometry(3,4, delta, covariance); - fg.addOdometry(4,5, delta, covariance); - fg.addOdometry(5,0, delta, covariance); + fg.addRelativePose(0,1, delta, covariance); + fg.addRelativePose(1,2, delta, covariance); + fg.addRelativePose(2,3, delta, covariance); + fg.addRelativePose(3,4, delta, covariance); + fg.addRelativePose(4,5, delta, covariance); + fg.addRelativePose(5,0, delta, covariance); // Create initial config pose2SLAM::Values initial; @@ -357,9 +356,9 @@ TEST_UNSAFE(Pose2SLAM, optimize2) { ///* ************************************************************************* */ // SL-NEEDED? TEST_UNSAFE(Pose2SLAM, findMinimumSpanningTree) { // pose2SLAM::Graph G, T, C; -// G.addConstraint(1, 2, Pose2(0.,0.,0.), I3); -// G.addConstraint(1, 3, Pose2(0.,0.,0.), I3); -// G.addConstraint(2, 3, Pose2(0.,0.,0.), I3); +// G.addPoseConstraint(1, 2, Pose2(0.,0.,0.), I3); +// G.addPoseConstraint(1, 3, Pose2(0.,0.,0.), I3); +// G.addPoseConstraint(2, 3, Pose2(0.,0.,0.), I3); // // PredecessorMap tree = // G.findMinimumSpanningTree(); @@ -371,9 +370,9 @@ TEST_UNSAFE(Pose2SLAM, optimize2) { ///* ************************************************************************* */ // SL-NEEDED? TEST_UNSAFE(Pose2SLAM, split) { // pose2SLAM::Graph G, T, C; -// G.addConstraint(1, 2, Pose2(0.,0.,0.), I3); -// G.addConstraint(1, 3, Pose2(0.,0.,0.), I3); -// G.addConstraint(2, 3, Pose2(0.,0.,0.), I3); +// G.addPoseConstraint(1, 2, Pose2(0.,0.,0.), I3); +// G.addPoseConstraint(1, 3, Pose2(0.,0.,0.), I3); +// G.addPoseConstraint(2, 3, Pose2(0.,0.,0.), I3); // // PredecessorMap tree; // tree.insert(1,2); @@ -436,7 +435,7 @@ TEST_UNSAFE( Pose2Prior, error ) x0.insert(1, p1); // Create factor - pose2SLAM::Prior factor(1, p1, sigmas); + PriorFactor factor(1, p1, sigmas); // Actual linearization Ordering ordering(*x0.orderingArbitrary()); @@ -463,7 +462,7 @@ TEST_UNSAFE( Pose2Prior, error ) /* ************************************************************************* */ // common Pose2Prior for tests below static gtsam::Pose2 priorVal(2,2,M_PI_2); -static pose2SLAM::Prior priorFactor(1, priorVal, sigmas); +static PriorFactor priorFactor(1, priorVal, sigmas); /* ************************************************************************* */ // The error |A*dx-b| approximates (h(x0+dx)-z) = -error_vector diff --git a/gtsam/slam/tests/testPose3SLAM.cpp b/gtsam/slam/tests/testPose3SLAM.cpp index 46a1c35c5..23367bd8a 100644 --- a/gtsam/slam/tests/testPose3SLAM.cpp +++ b/gtsam/slam/tests/testPose3SLAM.cpp @@ -48,16 +48,16 @@ TEST(Pose3Graph, optimizeCircle) { // create a Pose graph with one equality constraint and one measurement pose3SLAM::Graph fg; - fg.addHardConstraint(0, gT0); + fg.addPoseConstraint(0, gT0); Pose3 _0T1 = gT0.between(gT1); // inv(gT0)*gT1 double theta = M_PI/3.0; CHECK(assert_equal(Pose3(Rot3::yaw(-theta),Point3(radius*sin(theta),-radius*cos(theta),0)),_0T1)); - fg.addConstraint(0,1, _0T1, covariance); - fg.addConstraint(1,2, _0T1, covariance); - fg.addConstraint(2,3, _0T1, covariance); - fg.addConstraint(3,4, _0T1, covariance); - fg.addConstraint(4,5, _0T1, covariance); - fg.addConstraint(5,0, _0T1, covariance); + fg.addRelativePose(0,1, _0T1, covariance); + fg.addRelativePose(1,2, _0T1, covariance); + fg.addRelativePose(2,3, _0T1, covariance); + fg.addRelativePose(3,4, _0T1, covariance); + fg.addRelativePose(4,5, _0T1, covariance); + fg.addRelativePose(5,0, _0T1, covariance); // Create initial config Values initial; @@ -121,7 +121,7 @@ TEST( Pose3Factor, error ) // Create factor SharedNoiseModel I6(noiseModel::Unit::Create(6)); - pose3SLAM::Constraint factor(1, 2, z, I6); + BetweenFactor factor(1, 2, z, I6); // Create config Values x; diff --git a/gtsam/slam/tests/testProjectionFactor.cpp b/gtsam/slam/tests/testProjectionFactor.cpp index f344f98c9..ac9a6891d 100644 --- a/gtsam/slam/tests/testProjectionFactor.cpp +++ b/gtsam/slam/tests/testProjectionFactor.cpp @@ -41,6 +41,8 @@ static shared_ptrK sK(new Cal3_S2(K)); using symbol_shorthand::X; using symbol_shorthand::L; +typedef GenericProjectionFactor MyProjectionFactor; + /* ************************************************************************* */ TEST( ProjectionFactor, nonStandard ) { @@ -53,8 +55,8 @@ TEST( ProjectionFactor, error ) // Create the factor with a measurement that is 3 pixels off in x Point2 z(323.,240.); int i=1, j=1; - boost::shared_ptr - factor(new visualSLAM::ProjectionFactor(z, sigma, X(i), L(j), sK)); + boost::shared_ptr + factor(new MyProjectionFactor(z, sigma, X(i), L(j), sK)); // For the following values structure, the factor predicts 320,240 Values config; @@ -102,11 +104,11 @@ TEST( ProjectionFactor, equals ) // Create two identical factors and make sure they're equal Vector z = Vector_(2,323.,240.); int i=1, j=1; - boost::shared_ptr - factor1(new visualSLAM::ProjectionFactor(z, sigma, X(i), L(j), sK)); + boost::shared_ptr + factor1(new MyProjectionFactor(z, sigma, X(i), L(j), sK)); - boost::shared_ptr - factor2(new visualSLAM::ProjectionFactor(z, sigma, X(i), L(j), sK)); + boost::shared_ptr + factor2(new MyProjectionFactor(z, sigma, X(i), L(j), sK)); CHECK(assert_equal(*factor1, *factor2)); } diff --git a/gtsam/slam/tests/testStereoFactor.cpp b/gtsam/slam/tests/testStereoFactor.cpp index 35ef081bc..986538448 100644 --- a/gtsam/slam/tests/testStereoFactor.cpp +++ b/gtsam/slam/tests/testStereoFactor.cpp @@ -46,6 +46,8 @@ static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); using symbol_shorthand::X; using symbol_shorthand::L; +typedef GenericStereoFactor MyStereoFactor; + /* ************************************************************************* */ TEST( StereoFactor, singlePoint) { @@ -53,11 +55,11 @@ TEST( StereoFactor, singlePoint) boost::shared_ptr K(new Cal3_S2Stereo(625, 625, 0, 320, 240, 0.5)); NonlinearFactorGraph graph; - graph.add(visualSLAM::PoseConstraint(X(1),camera1)); + graph.add(NonlinearEquality(X(1),camera1)); StereoPoint2 z14(320,320.0-50, 240); // arguments: measurement, sigma, cam#, measurement #, K, baseline (m) - graph.add(visualSLAM::StereoFactor(z14,sigma, X(1), L(1), K)); + graph.add(MyStereoFactor(z14,sigma, X(1), L(1), K)); // Create a configuration corresponding to the ground truth Values values; diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index f8aef8bb9..793051370 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -38,36 +38,6 @@ namespace visualSLAM { return points.size(); } - /* ************************************************************************* */ - Vector Values::xs() const { - size_t j=0; - ConstFiltered poses = filter(); - Vector result(poses.size()); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.x(); - return result; - } - - /* ************************************************************************* */ - Vector Values::ys() const { - size_t j=0; - ConstFiltered poses = filter(); - Vector result(poses.size()); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.y(); - return result; - } - - /* ************************************************************************* */ - Vector Values::zs() const { - size_t j=0; - ConstFiltered poses = filter(); - Vector result(poses.size()); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result(j++) = keyValue.value.z(); - return result; - } - /* ************************************************************************* */ Matrix Values::points() const { size_t j=0; @@ -78,54 +48,32 @@ namespace visualSLAM { return result; } + /* ************************************************************************* */ + void Graph::addPointConstraint(Key pointKey, const Point3& p) { + push_back(make_shared >(pointKey, p)); + } + + /* ************************************************************************* */ + void Graph::addPointPrior(Key pointKey, const Point3& p, const SharedNoiseModel& model) { + push_back(make_shared >(pointKey, p, model)); + } + /* ************************************************************************* */ void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrK K) { - push_back(make_shared(measured, model, poseKey, pointKey, K)); + push_back(make_shared >(measured, model, poseKey, pointKey, K)); } /* ************************************************************************* */ void Graph::addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrKStereo K) { - push_back(make_shared(measured, model, poseKey, pointKey, K)); - } - - /* ************************************************************************* */ - void Graph::addPoseConstraint(Key poseKey, const Pose3& p) { - push_back(make_shared(poseKey, p)); - } - - /* ************************************************************************* */ - void Graph::addPointConstraint(Key pointKey, const Point3& p) { - push_back(make_shared(pointKey, p)); - } - - /* ************************************************************************* */ - void Graph::addPosePrior(Key poseKey, const Pose3& p, const SharedNoiseModel& model) { - push_back(make_shared(poseKey, p, model)); - } - - /* ************************************************************************* */ - void Graph::addPointPrior(Key pointKey, const Point3& p, const SharedNoiseModel& model) { - push_back(make_shared(pointKey, p, model)); + push_back(make_shared >(measured, model, poseKey, pointKey, K)); } /* ************************************************************************* */ void Graph::addRangeFactor(Key poseKey, Key pointKey, double range, const SharedNoiseModel& model) { - push_back(make_shared(poseKey, pointKey, range, model)); + push_back(make_shared >(poseKey, pointKey, range, model)); } /* ************************************************************************* */ - void Graph::addOdometry(Key x1, Key x2, const Pose3& odometry, const SharedNoiseModel& model) { - push_back(make_shared >(x1, x2, odometry, model)); - } - - /* ************************************************************************* */ - Values Graph::optimize(const Values& initialEstimate, size_t verbosity) const { - LevenbergMarquardtParams params; - params.verbosity = (NonlinearOptimizerParams::Verbosity)verbosity; - LevenbergMarquardtOptimizer optimizer(*this, initialEstimate,params); - return optimizer.optimize(); - } - /* ************************************************************************* */ } diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index 3fb213ee7..dce603a03 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -19,39 +19,20 @@ #pragma once -#include +#include #include #include #include - -#include #include #include -#include -#include -#include - #include namespace visualSLAM { using namespace gtsam; - /** - * Typedefs that make up the visualSLAM namespace. - */ - typedef NonlinearEquality PoseConstraint; ///< put a hard constraint on a pose - typedef NonlinearEquality PointConstraint; ///< put a hard constraint on a point - typedef PriorFactor PosePrior; ///< put a soft prior on a Pose - typedef PriorFactor PointPrior; ///< put a soft prior on a point - typedef RangeFactor RangeFactor; ///< put a factor on the range from a pose to a point - - /// monocular and stereo camera typedefs for general use - typedef GenericProjectionFactor ProjectionFactor; - typedef GenericStereoFactor StereoFactor; - /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - struct Values: public gtsam::Values { + struct Values: public pose3SLAM::Values { typedef boost::shared_ptr shared_ptr; typedef gtsam::Values::ConstFiltered PoseFiltered; @@ -62,28 +43,22 @@ namespace visualSLAM { /// Copy constructor Values(const gtsam::Values& values) : - gtsam::Values(values) { + pose3SLAM::Values(values) { } /// Constructor from filtered values view of poses Values(const PoseFiltered& view) : - gtsam::Values(view) { + pose3SLAM::Values(view) { } /// Constructor from filtered values view of points Values(const PointFiltered& view) : - gtsam::Values(view) { + pose3SLAM::Values(view) { } - /// insert a pose - void insertPose(Key i, const Pose3& pose) { insert(i, pose); } - /// insert a point void insertPoint(Key j, const Point3& point) { insert(j, point); } - /// update a pose - void updatePose(Key i, const Pose3& pose) { update(i, pose); } - /// update a point void updatePoint(Key j, const Point3& point) { update(j, point); } @@ -93,9 +68,6 @@ namespace visualSLAM { /// get number of points size_t nrPoints() const; - /// get a pose - Pose3 pose(Key i) const { return at(i); } - /// get a point Point3 point(Key j) const { return at(j); } @@ -105,13 +77,6 @@ namespace visualSLAM { /// get a const view containing only points PointFiltered allPoints() const { return this->filter(); } - /// check if value with specified key exists - bool exists(Key i) const { return gtsam::Values::exists(i); } - - Vector xs() const; ///< get all pose x coordinates in a matrix - Vector ys() const; ///< get all pose y coordinates in a matrix - Vector zs() const; ///< get all pose z coordinates in a matrix - Matrix points() const; ///< get all point coordinates in a matrix }; @@ -119,7 +84,7 @@ namespace visualSLAM { /** * Non-linear factor graph for vanilla visual SLAM */ - class Graph: public NonlinearFactorGraph { + class Graph: public pose3SLAM::Graph { public: /// shared pointer to this type of graph @@ -139,6 +104,32 @@ namespace visualSLAM { return NonlinearFactorGraph::equals(p, tol); } + /** + * Add a constraint on a point (for now, *must* be satisfied in any Values) + * @param key variable key of the landmark + * @param p point around which soft prior is defined + */ + void addPointConstraint(Key pointKey, const Point3& p = Point3()); + + /** + * Add a prior on a landmark + * @param key variable key of the landmark + * @param p to which point to constrain it to + * @param model uncertainty model of this prior + */ + void addPointPrior(Key pointKey, const Point3& p = Point3(), + const SharedNoiseModel& model = noiseModel::Unit::Create(3)); + + /** + * Add a range prior to a landmark + * @param poseKey variable key of the camera pose + * @param pointKey variable key of the landmark + * @param range approximate range to landmark + * @param model uncertainty model of this prior + */ + void addRangeFactor(Key poseKey, Key pointKey, double range, + const SharedNoiseModel& model = noiseModel::Unit::Create(1)); + /** * Add a projection factor measurement (monocular) * @param measured the measurement @@ -161,78 +152,6 @@ namespace visualSLAM { void addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrKStereo K); - /** - * Add a constraint on a pose (for now, *must* be satisfied in any Values) - * @param key variable key of the camera pose - * @param p to which pose to constrain it to - */ - void addPoseConstraint(Key poseKey, const Pose3& p = Pose3()); - - /** - * Add a constraint on a point (for now, *must* be satisfied in any Values) - * @param key variable key of the landmark - * @param p point around which soft prior is defined - */ - void addPointConstraint(Key pointKey, const Point3& p = Point3()); - - /** - * Add a prior on a pose - * @param key variable key of the camera pose - * @param p around which soft prior is defined - * @param model uncertainty model of this prior - */ - void addPosePrior(Key poseKey, const Pose3& p = Pose3(), const SharedNoiseModel& model = noiseModel::Unit::Create(6)); - - /** - * Add a prior on a landmark - * @param key variable key of the landmark - * @param p to which point to constrain it to - * @param model uncertainty model of this prior - */ - void addPointPrior(Key pointKey, const Point3& p = Point3(), const SharedNoiseModel& model = noiseModel::Unit::Create(3)); - - /** - * Add a range prior to a landmark - * @param poseKey variable key of the camera pose - * @param pointKey variable key of the landmark - * @param range approximate range to landmark - * @param model uncertainty model of this prior - */ - void addRangeFactor(Key poseKey, Key pointKey, double range, const SharedNoiseModel& model = noiseModel::Unit::Create(1)); - - /** - * Add an odometry between two poses - * @param x1 variable key of the first camera pose - * @param x2 variable key of the second camera pose - * @param odometry measurement from x1 to x2 (x1.between(x2)) - * @param model uncertainty model of this measurement - */ - void addOdometry(Key x1, Key x2, const Pose3& odometry, const SharedNoiseModel& model); - - /** - * Optimize the graph - * @param initialEstimate initial estimate of all variables in the graph - * @param pointKey variable key of the landmark - * @param range approximate range to landmark - * @param model uncertainty model of this prior - */ - Values optimize(const Values& initialEstimate, size_t verbosity) const; - - /** - * Setup and return a LevenbargMarquardtOptimizer - * @param initialEstimate initial estimate of all variables in the graph - * @param parameters optimizer's parameters - * @return a LevenbergMarquardtOptimizer object, which you can use to control the optimization process - */ - LevenbergMarquardtOptimizer optimizer(const Values& initialEstimate, const LevenbergMarquardtParams& parameters = LevenbergMarquardtParams()) const { - return LevenbergMarquardtOptimizer((*this), initialEstimate, parameters); - } - - /// Return a Marginals object - Marginals marginals(const Values& solution) const { - return Marginals(*this,solution); - } - }; // Graph /** @@ -240,4 +159,18 @@ namespace visualSLAM { */ typedef gtsam::NonlinearISAM ISAM; -} // namespaces +} // visualSLAM + +/** + * Backwards compatibility and wrap use only, avoid using + */ +namespace visualSLAM { + typedef gtsam::NonlinearEquality PoseConstraint; ///< \deprecated typedef for backwards compatibility + typedef gtsam::NonlinearEquality PointConstraint; ///< \deprecated typedef for backwards compatibility + typedef gtsam::PriorFactor PosePrior; ///< \deprecated typedef for backwards compatibility + typedef gtsam::PriorFactor PointPrior; ///< \deprecated typedef for backwards compatibility + typedef gtsam::RangeFactor RangeFactor; ///< \deprecated typedef for backwards compatibility + typedef gtsam::GenericProjectionFactor ProjectionFactor; ///< \deprecated typedef for backwards compatibility + typedef gtsam::GenericStereoFactor StereoFactor; ///< \deprecated typedef for backwards compatibility +} + diff --git a/matlab/examples/VisualISAMGenerateData.m b/matlab/VisualISAMGenerateData.m similarity index 100% rename from matlab/examples/VisualISAMGenerateData.m rename to matlab/VisualISAMGenerateData.m diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index 01fdfe79c..139d40e65 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -45,7 +45,7 @@ for i=1:2 end %% Add odometry between frames 1 and 2 -newFactors.addOdometry(symbol('x',1), symbol('x',2), data.odometry{1}, noiseModels.odometry); +newFactors.addRelativePose(symbol('x',1), symbol('x',2), data.odometry{1}, noiseModels.odometry); %% Update ISAM if options.batchInitialization % Do a full optimize for first two poses diff --git a/matlab/VisualISAMStep.m b/matlab/VisualISAMStep.m index 0f87a66f0..5033a8b39 100644 --- a/matlab/VisualISAMStep.m +++ b/matlab/VisualISAMStep.m @@ -10,7 +10,7 @@ initialEstimates = visualSLAMValues; %% Add odometry i = result.nrPoses+1; odometry = data.odometry{i-1}; -newFactors.addOdometry(symbol('x',i-1), symbol('x',i), odometry, noiseModels.odometry); +newFactors.addRelativePose(symbol('x',i-1), symbol('x',i), odometry, noiseModels.odometry); %% Add visual measurement factors and initializations as necessary for k=1:length(data.Z{i}) diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m index a523c312d..d3e563dd4 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/LocalizationExample.m @@ -21,15 +21,15 @@ graph = pose2SLAMGraph; %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addOdometry(1, 2, odometry, odometryNoise); -graph.addOdometry(2, 3, odometry, odometryNoise); +graph.addRelativePose(1, 2, odometry, odometryNoise); +graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add three "GPS" measurements % We use Pose2 Priors here with high variance on theta noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.1; 10]); -graph.addPrior(1, gtsamPose2(0.0, 0.0, 0.0), noiseModel); -graph.addPrior(2, gtsamPose2(2.0, 0.0, 0.0), noiseModel); -graph.addPrior(3, gtsamPose2(4.0, 0.0, 0.0), noiseModel); +graph.addPosePrior(1, gtsamPose2(0.0, 0.0, 0.0), noiseModel); +graph.addPosePrior(2, gtsamPose2(2.0, 0.0, 0.0), noiseModel); +graph.addPosePrior(3, gtsamPose2(4.0, 0.0, 0.0), noiseModel); %% print graph.print(sprintf('\nFactor graph:\n')); @@ -42,12 +42,13 @@ initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n ')); %% Plot Covariance Ellipses cla; -plot(result.xs(),result.ys(),'k*-'); hold on +X=result.poses(); +plot(X(:,1),X(:,2),'k*-'); hold on marginals = graph.marginals(result); P={}; for i=1:result.size() diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index e712e4e21..f203c858e 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -21,13 +21,13 @@ graph = pose2SLAMGraph; %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta -graph.addPrior(1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addOdometry(1, 2, odometry, odometryNoise); -graph.addOdometry(2, 3, odometry, odometryNoise); +graph.addRelativePose(1, 2, odometry, odometryNoise); +graph.addRelativePose(2, 3, odometry, odometryNoise); %% print graph.print(sprintf('\nFactor graph:\n')); @@ -40,12 +40,13 @@ initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n ')); %% Plot Covariance Ellipses cla; -plot(result.xs(),result.ys(),'k*-'); hold on +X=result.poses(); +plot(X(:,1),X(:,2),'k*-'); hold on marginals = graph.marginals(result); P={}; for i=1:result.size() diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index 27dc97a08..499845eda 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -29,13 +29,13 @@ graph = planarSLAMGraph; %% Add prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); -graph.addPrior(i1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph %% Add odometry odometry = gtsamPose2(2.0, 0.0, 0.0); odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addOdometry(i1, i2, odometry, odometryNoise); -graph.addOdometry(i2, i3, odometry, odometryNoise); +graph.addRelativePose(i1, i2, odometry, odometryNoise); +graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Add bearing/range measurement factors degrees = pi/180; @@ -58,7 +58,7 @@ initialEstimate.insertPoint(j2, gtsamPoint2(4.1, 1.8)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses diff --git a/matlab/examples/PlanarSLAMExample_sampling.m b/matlab/examples/PlanarSLAMExample_sampling.m index 99429900f..861e56db9 100644 --- a/matlab/examples/PlanarSLAMExample_sampling.m +++ b/matlab/examples/PlanarSLAMExample_sampling.m @@ -16,11 +16,11 @@ i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); graph = planarSLAMGraph; priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); -graph.addPrior(i1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph odometry = gtsamPose2(2.0, 0.0, 0.0); odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addOdometry(i1, i2, odometry, odometryNoise); -graph.addOdometry(i2, i3, odometry, odometryNoise); +graph.addRelativePose(i1, i2, odometry, odometryNoise); +graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Except, for measurements we offer a choice j1 = symbol('l',1); j2 = symbol('l',2); diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m index 29133031e..776260e3f 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/examples/Pose2SLAMExample.m @@ -25,19 +25,19 @@ graph = pose2SLAMGraph; % gaussian for prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); -graph.addPrior(1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addRelativePose(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); +graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); % print graph.print(sprintf('\nFactor graph:\n')); @@ -52,12 +52,13 @@ initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses cla; -plot(result.xs(),result.ys(),'k*-'); hold on +X=result.poses(); +plot(X(:,1),X(:,2),'k*-'); hold on plot([result.pose(5).x;result.pose(2).x],[result.pose(5).y;result.pose(2).y],'r-'); marginals = graph.marginals(result); diff --git a/matlab/examples/Pose2SLAMExample_advanced.m b/matlab/examples/Pose2SLAMExample_advanced.m index fbffe9911..843ae7e1c 100644 --- a/matlab/examples/Pose2SLAMExample_advanced.m +++ b/matlab/examples/Pose2SLAMExample_advanced.m @@ -27,14 +27,14 @@ graph = pose2SLAMGraph; % gaussian for prior priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -graph.addPrior(1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -graph.addOdometry(1, 2, odometry, odometryNoise); -graph.addOdometry(2, 3, odometry, odometryNoise); +graph.addRelativePose(1, 2, odometry, odometryNoise); +graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add measurements % general noisemodel for measurements @@ -60,7 +60,7 @@ initialEstimate.print('initial estimate'); %result.print('final result'); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,1); result.print('final result'); %% Get the corresponding dense matrix diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m index 828b6f5f6..e05a77186 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/examples/Pose2SLAMExample_circle.m @@ -20,12 +20,12 @@ fg = pose2SLAMGraph; fg.addPoseConstraint(0, p0); delta = p0.between(p1); covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 5*pi/180]); -fg.addOdometry(0,1, delta, covariance); -fg.addOdometry(1,2, delta, covariance); -fg.addOdometry(2,3, delta, covariance); -fg.addOdometry(3,4, delta, covariance); -fg.addOdometry(4,5, delta, covariance); -fg.addOdometry(5,0, delta, covariance); +fg.addRelativePose(0,1, delta, covariance); +fg.addRelativePose(1,2, delta, covariance); +fg.addRelativePose(2,3, delta, covariance); +fg.addRelativePose(3,4, delta, covariance); +fg.addRelativePose(4,5, delta, covariance); +fg.addRelativePose(5,0, delta, covariance); %% Create initial config initial = pose2SLAMValues; diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index 06a16ac55..a2645a593 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -18,7 +18,7 @@ initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.01; 0.01; 0.01]); -graph.addPrior(0, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph %% Plot Initial Estimate figure(1);clf diff --git a/matlab/examples/Pose2SLAMwSPCG.m b/matlab/examples/Pose2SLAMwSPCG.m index 3f8f8adf1..3d0ce8da7 100644 --- a/matlab/examples/Pose2SLAMwSPCG.m +++ b/matlab/examples/Pose2SLAMwSPCG.m @@ -35,7 +35,7 @@ graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); +graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); % print graph.print(sprintf('\nFactor graph:\n')); diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/examples/Pose3SLAMExample.m index 4cc41a4de..c335203eb 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -17,15 +17,15 @@ p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement fg = pose3SLAMGraph; -fg.addHardConstraint(0, p0); +fg.addPoseConstraint(0, p0); delta = p0.between(p1); covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -fg.addConstraint(0,1, delta, covariance); -fg.addConstraint(1,2, delta, covariance); -fg.addConstraint(2,3, delta, covariance); -fg.addConstraint(3,4, delta, covariance); -fg.addConstraint(4,5, delta, covariance); -fg.addConstraint(5,0, delta, covariance); +fg.addRelativePose(0,1, delta, covariance); +fg.addRelativePose(1,2, delta, covariance); +fg.addRelativePose(2,3, delta, covariance); +fg.addRelativePose(3,4, delta, covariance); +fg.addRelativePose(4,5, delta, covariance); +fg.addRelativePose(5,0, delta, covariance); %% Create initial config initial = pose3SLAMValues; @@ -39,10 +39,11 @@ initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); %% Plot Initial Estimate cla -plot3(initial.xs(),initial.ys(),initial.zs(),'g-*'); +T=initial.translations(); +plot3(T(:,1),T(:,2),T(:,3),'g-*'); %% optimize -result = fg.optimize(initial); +result = fg.optimize(initial,1); %% Show Result hold on; plot3DTrajectory(result,'b-*', true, 0.3); diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index 980a3c5a1..99adaa82b 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -67,13 +67,15 @@ axis equal view(-38,12) % initial trajectory in red (rotated so Z is up) -plot3(initialEstimate.zs(),-initialEstimate.xs(),-initialEstimate.ys(), '-*r','LineWidth',2); +T=initialEstimate.translations; +plot3(T(:,3),-T(:,1),-T(:,2), '-*r','LineWidth',2); % final trajectory in green (rotated so Z is up) -plot3(result.zs(),-result.xs(),-result.ys(), '-*g','LineWidth',2); +T=result.translations; +plot3(T(:,3),-T(:,1),-T(:,2), '-*g','LineWidth',2); xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); % optimized 3D points (rotated so Z is up) -points = result.points(); -plot3(points(:,3),-points(:,1),-points(:,2),'*'); +P = result.points(); +plot3(P(:,3),-P(:,1),-P(:,2),'*'); diff --git a/matlab/load3D.m b/matlab/load3D.m index 82ae098b9..6ba861a92 100644 --- a/matlab/load3D.m +++ b/matlab/load3D.m @@ -41,7 +41,7 @@ for i=1:n t = gtsamPoint3(e{4}, e{5}, e{6}); R = gtsamRot3_ypr(e{9}, e{8}, e{7}); dpose = gtsamPose3(R,t); - graph.addConstraint(i1, i2, dpose, model); + graph.addRelativePose(i1, i2, dpose, model); if successive if i2>i1 initial.insertPose(i2,initial.pose(i1).compose(dpose)); diff --git a/matlab/plot3DTrajectory.m b/matlab/plot3DTrajectory.m index 524b41d33..83d3d76e2 100644 --- a/matlab/plot3DTrajectory.m +++ b/matlab/plot3DTrajectory.m @@ -3,7 +3,8 @@ function plot3DTrajectory(values,style,frames,scale) if nargin<3,frames=false;end if nargin<4,scale=0;end -plot3(values.xs(),values.ys(),values.zs(),style); hold on +T=values.translations() +plot3(T(:,1),T(:,2),T(:,3),style); hold on if frames N=values.size; for i=0:N-1 diff --git a/matlab/tests/testLocalizationExample.m b/matlab/tests/testLocalizationExample.m index 07b47257b..9e28ea64b 100644 --- a/matlab/tests/testLocalizationExample.m +++ b/matlab/tests/testLocalizationExample.m @@ -16,8 +16,8 @@ graph = pose2SLAMGraph; %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addOdometry(1, 2, odometry, odometryNoise); -graph.addOdometry(2, 3, odometry, odometryNoise); +graph.addRelativePose(1, 2, odometry, odometryNoise); +graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add three "GPS" measurements % We use Pose2 Priors here with high variance on theta @@ -27,7 +27,7 @@ groundTruth.insertPose(2, gtsamPose2(2.0, 0.0, 0.0)); groundTruth.insertPose(3, gtsamPose2(4.0, 0.0, 0.0)); noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.1; 10]); for i=1:3 - graph.addPrior(i, groundTruth.pose(i), noiseModel); + graph.addPosePrior(i, groundTruth.pose(i), noiseModel); end %% Initialize to noisy points @@ -37,7 +37,7 @@ initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,0); %% Plot Covariance Ellipses marginals = graph.marginals(result); diff --git a/matlab/tests/testOdometryExample.m b/matlab/tests/testOdometryExample.m index e83d0ec0a..0056a43e8 100644 --- a/matlab/tests/testOdometryExample.m +++ b/matlab/tests/testOdometryExample.m @@ -16,13 +16,13 @@ graph = pose2SLAMGraph; %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta -graph.addPrior(1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addOdometry(1, 2, odometry, odometryNoise); -graph.addOdometry(2, 3, odometry, odometryNoise); +graph.addRelativePose(1, 2, odometry, odometryNoise); +graph.addRelativePose(2, 3, odometry, odometryNoise); %% Initialize to noisy points initialEstimate = pose2SLAMValues; @@ -31,7 +31,7 @@ initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,0); marginals = graph.marginals(result); marginals.marginalCovariance(i); diff --git a/matlab/tests/testPlanarSLAMExample.m b/matlab/tests/testPlanarSLAMExample.m index 6446da790..9747366c1 100644 --- a/matlab/tests/testPlanarSLAMExample.m +++ b/matlab/tests/testPlanarSLAMExample.m @@ -29,13 +29,13 @@ graph = planarSLAMGraph; %% Add prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); -graph.addPrior(i1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph %% Add odometry odometry = gtsamPose2(2.0, 0.0, 0.0); odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addOdometry(i1, i2, odometry, odometryNoise); -graph.addOdometry(i2, i3, odometry, odometryNoise); +graph.addRelativePose(i1, i2, odometry, odometryNoise); +graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Add bearing/range measurement factors degrees = pi/180; @@ -53,7 +53,7 @@ initialEstimate.insertPoint(j1, gtsamPoint2(1.8, 2.1)); initialEstimate.insertPoint(j2, gtsamPoint2(4.1, 1.8)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); +result = graph.optimize(initialEstimate,0); marginals = graph.marginals(result); %% Check first pose and point equality diff --git a/matlab/tests/testPose2SLAMExample.m b/matlab/tests/testPose2SLAMExample.m index 707089fea..4fd97e916 100644 --- a/matlab/tests/testPose2SLAMExample.m +++ b/matlab/tests/testPose2SLAMExample.m @@ -25,19 +25,19 @@ graph = pose2SLAMGraph; % gaussian for prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); -graph.addPrior(1, priorMean, priorNoise); % add directly to graph +graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addRelativePose(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); -graph.addConstraint(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); +graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); %% Initialize to noisy points initialEstimate = pose2SLAMValues; @@ -48,8 +48,8 @@ initialEstimate.insertPose(4, gtsamPose2(4.0, 2.0, pi )); initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate); -resultSPCG = graph.optimizeSPCG(initialEstimate); +result = graph.optimize(initialEstimate,0); +resultSPCG = graph.optimizeSPCG(initialEstimate,0); %% Plot Covariance Ellipses marginals = graph.marginals(result); diff --git a/matlab/tests/testPose3SLAMExample.m b/matlab/tests/testPose3SLAMExample.m index 9d2cf4271..e63169d2b 100644 --- a/matlab/tests/testPose3SLAMExample.m +++ b/matlab/tests/testPose3SLAMExample.m @@ -17,15 +17,15 @@ p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement fg = pose3SLAMGraph; -fg.addHardConstraint(0, p0); +fg.addPoseConstraint(0, p0); delta = p0.between(p1); covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -fg.addConstraint(0,1, delta, covariance); -fg.addConstraint(1,2, delta, covariance); -fg.addConstraint(2,3, delta, covariance); -fg.addConstraint(3,4, delta, covariance); -fg.addConstraint(4,5, delta, covariance); -fg.addConstraint(5,0, delta, covariance); +fg.addRelativePose(0,1, delta, covariance); +fg.addRelativePose(1,2, delta, covariance); +fg.addRelativePose(2,3, delta, covariance); +fg.addRelativePose(3,4, delta, covariance); +fg.addRelativePose(4,5, delta, covariance); +fg.addRelativePose(5,0, delta, covariance); %% Create initial config initial = pose3SLAMValues; @@ -38,7 +38,7 @@ initial.insertPose(4, hexagon.pose(4).retract(s*randn(6,1))); initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); %% optimize -result = fg.optimize(initial); +result = fg.optimize(initial,0); pose_1 = result.pose(1); CHECK('pose_1.equals(gtsamPose3,1e-4)',pose_1.equals(p1,1e-4)); diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index b5c1d4b89..80bd651c8 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -53,7 +53,7 @@ ISAM2 createSlamlikeISAM2( // Add a prior at time 0 and update isam { planarSLAM::Graph newfactors; - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -66,7 +66,7 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 0 to time 5 for( ; i<5; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -79,7 +79,7 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 5 to 6 and landmark measurement at time 5 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); @@ -99,7 +99,7 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 6 to time 10 for( ; i<10; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -112,7 +112,7 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 10 to 11 and landmark measurement at time 10 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); @@ -257,7 +257,7 @@ TEST_UNSAFE(ISAM2, AddVariables) { // // Ordering ordering; ordering += (0), (0), (1); // planarSLAM::Graph graph; -// graph.addPrior((0), Pose2(), noiseModel::Unit::Create(Pose2::dimension)); +// graph.addPosePrior((0), Pose2(), noiseModel::Unit::Create(Pose2::dimension)); // graph.addRange((0), (0), 1.0, noiseModel::Unit::Create(1)); // // FastSet expected; @@ -364,7 +364,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton) // Add a prior at time 0 and update isam { planarSLAM::Graph newfactors; - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -379,7 +379,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton) // Add odometry from time 0 to time 5 for( ; i<5; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -392,7 +392,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton) // Add odometry from time 5 to 6 and landmark measurement at time 5 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); @@ -412,7 +412,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton) // Add odometry from time 6 to time 10 for( ; i<10; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -425,7 +425,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton) // Add odometry from time 10 to 11 and landmark measurement at time 10 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); @@ -484,7 +484,7 @@ TEST(ISAM2, slamlike_solution_dogleg) // Add a prior at time 0 and update isam { planarSLAM::Graph newfactors; - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -499,7 +499,7 @@ TEST(ISAM2, slamlike_solution_dogleg) // Add odometry from time 0 to time 5 for( ; i<5; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -512,7 +512,7 @@ TEST(ISAM2, slamlike_solution_dogleg) // Add odometry from time 5 to 6 and landmark measurement at time 5 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); @@ -532,7 +532,7 @@ TEST(ISAM2, slamlike_solution_dogleg) // Add odometry from time 6 to time 10 for( ; i<10; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -545,7 +545,7 @@ TEST(ISAM2, slamlike_solution_dogleg) // Add odometry from time 10 to 11 and landmark measurement at time 10 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); @@ -604,7 +604,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) // Add a prior at time 0 and update isam { planarSLAM::Graph newfactors; - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -619,7 +619,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) // Add odometry from time 0 to time 5 for( ; i<5; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -632,7 +632,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) // Add odometry from time 5 to 6 and landmark measurement at time 5 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); @@ -652,7 +652,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) // Add odometry from time 6 to time 10 for( ; i<10; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -665,7 +665,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) // Add odometry from time 10 to 11 and landmark measurement at time 10 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); @@ -724,7 +724,7 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) // Add a prior at time 0 and update isam { planarSLAM::Graph newfactors; - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -739,7 +739,7 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) // Add odometry from time 0 to time 5 for( ; i<5; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -752,7 +752,7 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) // Add odometry from time 5 to 6 and landmark measurement at time 5 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); @@ -772,7 +772,7 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) // Add odometry from time 6 to time 10 for( ; i<10; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -785,7 +785,7 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) // Add odometry from time 10 to 11 and landmark measurement at time 10 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); @@ -941,7 +941,7 @@ TEST(ISAM2, removeFactors) // Add a prior at time 0 and update isam { planarSLAM::Graph newfactors; - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -956,7 +956,7 @@ TEST(ISAM2, removeFactors) // Add odometry from time 0 to time 5 for( ; i<5; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -969,7 +969,7 @@ TEST(ISAM2, removeFactors) // Add odometry from time 5 to 6 and landmark measurement at time 5 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); @@ -989,7 +989,7 @@ TEST(ISAM2, removeFactors) // Add odometry from time 6 to time 10 for( ; i<10; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -1002,7 +1002,7 @@ TEST(ISAM2, removeFactors) // Add odometry from time 10 to 11 and landmark measurement at time 10 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors[0]); @@ -1130,7 +1130,7 @@ TEST(ISAM2, constrained_ordering) // Add a prior at time 0 and update isam { planarSLAM::Graph newfactors; - newfactors.addPrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -1145,7 +1145,7 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 0 to time 5 for( ; i<5; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -1161,7 +1161,7 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 5 to 6 and landmark measurement at time 5 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); fullgraph.push_back(newfactors); @@ -1181,7 +1181,7 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 6 to time 10 for( ; i<10; ++i) { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); fullgraph.push_back(newfactors); Values init; @@ -1194,7 +1194,7 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 10 to 11 and landmark measurement at time 10 { planarSLAM::Graph newfactors; - newfactors.addOdometry(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); fullgraph.push_back(newfactors); diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 769e95d26..0f412a0b5 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -136,19 +136,19 @@ TEST(GaussianJunctionTree, slamlike) { size_t i = 0; newfactors = planarSLAM::Graph(); - newfactors.addPrior(X(0), Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors.addPosePrior(X(0), Pose2(0.0, 0.0, 0.0), odoNoise); init.insert(X(0), Pose2(0.01, 0.01, 0.01)); fullgraph.push_back(newfactors); for( ; i<5; ++i) { newfactors = planarSLAM::Graph(); - newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } newfactors = planarSLAM::Graph(); - newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(X(i), L(0), Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); newfactors.addBearingRange(X(i), L(1), Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); init.insert(X(i+1), Pose2(1.01, 0.01, 0.01)); @@ -159,13 +159,13 @@ TEST(GaussianJunctionTree, slamlike) { for( ; i<5; ++i) { newfactors = planarSLAM::Graph(); - newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } newfactors = planarSLAM::Graph(); - newfactors.addOdometry(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); newfactors.addBearingRange(X(i), L(0), Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); newfactors.addBearingRange(X(i), L(1), Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); init.insert(X(i+1), Pose2(6.9, 0.1, 0.01)); @@ -194,8 +194,8 @@ TEST(GaussianJunctionTree, simpleMarginal) { // Create a simple graph pose2SLAM::Graph fg; - fg.addPrior(X(0), Pose2(), noiseModel::Isotropic::Sigma(3, 10.0)); - fg.addOdometry(X(0), X(1), Pose2(1.0, 0.0, 0.0), noiseModel::Diagonal::Sigmas(Vector_(3, 10.0, 1.0, 1.0))); + fg.addPosePrior(X(0), Pose2(), noiseModel::Isotropic::Sigma(3, 10.0)); + fg.addRelativePose(X(0), X(1), Pose2(1.0, 0.0, 0.0), noiseModel::Diagonal::Sigmas(Vector_(3, 10.0, 1.0, 1.0))); Values init; init.insert(X(0), Pose2()); diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index 34a39fdca..fefa2a05f 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -27,18 +27,18 @@ boost::tuple generateProblem() { // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.addPrior(1, priorMean, priorNoise); + graph.addPosePrior(1, priorMean, priorNoise); // 2b. Add odometry factors SharedDiagonal odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addOdometry(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); - graph.addOdometry(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addOdometry(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); + graph.addRelativePose(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.addRelativePose(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); // 2c. Add pose constraint SharedDiagonal constraintUncertainty = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addConstraint(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + graph.addRelativePose(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); // 3. Create the data structure to hold the initialEstimate estinmate to the solution pose2SLAM::Values initialEstimate; diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index 0a3f3a562..5f99d60c6 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -79,9 +79,9 @@ TEST( Graph, composePoses ) SharedNoiseModel cov = noiseModel::Unit::Create(3); Pose2 p1(1.0, 2.0, 0.3), p2(4.0, 5.0, 0.6), p3(7.0, 8.0, 0.9), p4(2.0, 2.0, 2.9); Pose2 p12=p1.between(p2), p23=p2.between(p3), p43=p4.between(p3); - graph.addOdometry(1,2, p12, cov); - graph.addOdometry(2,3, p23, cov); - graph.addOdometry(4,3, p43, cov); + graph.addRelativePose(1,2, p12, cov); + graph.addRelativePose(2,3, p23, cov); + graph.addRelativePose(4,3, p43, cov); PredecessorMap tree; tree.insert(1,2); diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index 5da4ca955..3e68780c4 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -58,9 +58,9 @@ TEST( inference, marginals2) SharedDiagonal poseModel(noiseModel::Isotropic::Sigma(3, 0.1)); SharedDiagonal pointModel(noiseModel::Isotropic::Sigma(3, 0.1)); - fg.addPrior(X(0), Pose2(), poseModel); - fg.addOdometry(X(0), X(1), Pose2(1.0,0.0,0.0), poseModel); - fg.addOdometry(X(1), X(2), Pose2(1.0,0.0,0.0), poseModel); + fg.addPosePrior(X(0), Pose2(), poseModel); + fg.addRelativePose(X(0), X(1), Pose2(1.0,0.0,0.0), poseModel); + fg.addRelativePose(X(1), X(2), Pose2(1.0,0.0,0.0), poseModel); fg.addBearingRange(X(0), L(0), Rot2(), 1.0, pointModel); fg.addBearingRange(X(1), L(0), Rot2(), 1.0, pointModel); fg.addBearingRange(X(2), L(0), Rot2(), 1.0, pointModel); diff --git a/tests/testNonlinearISAM.cpp b/tests/testNonlinearISAM.cpp index f063f9c7d..980ea8033 100644 --- a/tests/testNonlinearISAM.cpp +++ b/tests/testNonlinearISAM.cpp @@ -41,7 +41,7 @@ TEST(testNonlinearISAM, markov_chain ) { Pose2 z(1.0, 2.0, 0.1); for (size_t i=1; i<=nrPoses; ++i) { Graph new_factors; - new_factors.addOdometry(i-1, i, z, model); + new_factors.addRelativePose(i-1, i, z, model); planarSLAM::Values new_init; // perform a check on changing orderings diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index f7112bb03..a61b709d0 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -176,7 +176,7 @@ TEST( NonlinearOptimizer, Factorization ) pose2SLAM::Graph graph; graph.addPrior(X(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); - graph.addOdometry(X(1),X(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); + graph.addRelativePose(X(1),X(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); Ordering ordering; ordering.push_back(X(1)); diff --git a/tests/testOccupancyGrid.cpp b/tests/testOccupancyGrid.cpp index 2a4405877..86678cc12 100644 --- a/tests/testOccupancyGrid.cpp +++ b/tests/testOccupancyGrid.cpp @@ -119,7 +119,7 @@ public: } ///add a prior - void addPrior(Index cell, double prior){ + void addPosePrior(Index cell, double prior){ size_t numStates = 2; DiscreteKey key(cell, numStates); @@ -295,7 +295,7 @@ TEST_UNSAFE( OccupancyGrid, Test1) { Pose2 pose(0,0,0); double range = 1; - occupancyGrid.addPrior(0, 0.7); + occupancyGrid.addPosePrior(0, 0.7); EXPECT_LONGS_EQUAL(1, occupancyGrid.size()); occupancyGrid.addLaser(pose, range); diff --git a/tests/timeMultifrontalOnDataset.cpp b/tests/timeMultifrontalOnDataset.cpp index 05d2c9398..5bc34b386 100644 --- a/tests/timeMultifrontalOnDataset.cpp +++ b/tests/timeMultifrontalOnDataset.cpp @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) { // Add a prior on the first pose if (soft_prior) - data.first->addPrior(0, Pose2(), noiseModel::Isotropic::Sigma(Pose2::Dim(), 0.0005)); + data.first->addPosePrior(0, Pose2(), noiseModel::Isotropic::Sigma(Pose2::Dim(), 0.0005)); else data.first->addPoseConstraint(0, Pose2()); diff --git a/tests/timeSequentialOnDataset.cpp b/tests/timeSequentialOnDataset.cpp index 4a53737e0..03f33d334 100644 --- a/tests/timeSequentialOnDataset.cpp +++ b/tests/timeSequentialOnDataset.cpp @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) { // Add a prior on the first pose if (soft_prior) - data.first->addPrior(0, Pose2(), noiseModel::Isotropic::Sigma(Pose2::Dim(), 0.0005)); + data.first->addPosePrior(0, Pose2(), noiseModel::Isotropic::Sigma(Pose2::Dim(), 0.0005)); else data.first->addPoseConstraint(0, Pose2()); From bfc033d3f76c861e13be53a813956733053e2e1e Mon Sep 17 00:00:00 2001 From: Abhijit Kundu Date: Sun, 24 Jun 2012 04:13:49 +0000 Subject: [PATCH 450/914] Minor change to shortcut --- gtsam/inference/BayesTreeCliqueBase-inl.h | 178 +++++++++++----------- 1 file changed, 88 insertions(+), 90 deletions(-) diff --git a/gtsam/inference/BayesTreeCliqueBase-inl.h b/gtsam/inference/BayesTreeCliqueBase-inl.h index 272747126..c5851a5e4 100644 --- a/gtsam/inference/BayesTreeCliqueBase-inl.h +++ b/gtsam/inference/BayesTreeCliqueBase-inl.h @@ -102,114 +102,112 @@ namespace gtsam { return changed; } - /* ************************************************************************* */ - // The shortcut density is a conditional P(S|R) of the separator of this - // clique on the root. We can compute it recursively from the parent shortcut - // P(Sp|R) as \int P(Fp|Sp) P(Sp|R), where Fp are the frontal nodes in p - /* ************************************************************************* */ - template - BayesNet BayesTreeCliqueBase::shortcut( - derived_ptr R, Eliminate function) const{ + /* ************************************************************************* */ + // The shortcut density is a conditional P(S|R) of the separator of this + // clique on the root. We can compute it recursively from the parent shortcut + // P(Sp|R) as \int P(Fp|Sp) P(Sp|R), where Fp are the frontal nodes in p + /* ************************************************************************* */ + template + BayesNet BayesTreeCliqueBase::shortcut( + derived_ptr R, Eliminate function) const{ - static const bool debug = false; + static const bool debug = false; - BayesNet p_S_R; //shortcut P(S|R) + BayesNet p_S_R; //shortcut P(S|R) This is empty now - //Check if the ShortCut already exists - if(!cachedShortcut_){ + //Check if the ShortCut already exists + if(!cachedShortcut_){ - // A first base case is when this clique or its parent is the root, - // in which case we return an empty Bayes net. + // A first base case is when this clique or its parent is the root, + // in which case we return an empty Bayes net. - derived_ptr parent(parent_.lock()); + derived_ptr parent(parent_.lock()); + if (R.get() != this && parent != R) { - if (R.get() == this || parent == R) { - BayesNet empty; - return empty; - } + // The root conditional + FactorGraph p_R(BayesNet(R->conditional())); - // The root conditional - FactorGraph p_R(BayesNet(R->conditional())); + // The parent clique has a ConditionalType for each frontal node in Fp + // so we can obtain P(Fp|Sp) in factor graph form + FactorGraph p_Fp_Sp(BayesNet(parent->conditional())); - // The parent clique has a ConditionalType for each frontal node in Fp - // so we can obtain P(Fp|Sp) in factor graph form - FactorGraph p_Fp_Sp(BayesNet(parent->conditional())); + // If not the base case, obtain the parent shortcut P(Sp|R) as factors + FactorGraph p_Sp_R(parent->shortcut(R, function)); - // If not the base case, obtain the parent shortcut P(Sp|R) as factors - FactorGraph p_Sp_R(parent->shortcut(R, function)); + // now combine P(Cp|R) = P(Fp|Sp) * P(Sp|R) + FactorGraph p_Cp_R; + p_Cp_R.push_back(p_R); + p_Cp_R.push_back(p_Fp_Sp); + p_Cp_R.push_back(p_Sp_R); - // now combine P(Cp|R) = P(Fp|Sp) * P(Sp|R) - FactorGraph p_Cp_R; - p_Cp_R.push_back(p_R); - p_Cp_R.push_back(p_Fp_Sp); - p_Cp_R.push_back(p_Sp_R); + // Eliminate into a Bayes net with ordering designed to integrate out + // any variables not in *our* separator. Variables to integrate out must be + // eliminated first hence the desired ordering is [Cp\S S]. + // However, an added wrinkle is that Cp might overlap with the root. + // Keys corresponding to the root should not be added to the ordering at all. - // Eliminate into a Bayes net with ordering designed to integrate out - // any variables not in *our* separator. Variables to integrate out must be - // eliminated first hence the desired ordering is [Cp\S S]. - // However, an added wrinkle is that Cp might overlap with the root. - // Keys corresponding to the root should not be added to the ordering at all. + if(debug) { + p_R.print("p_R: "); + p_Fp_Sp.print("p_Fp_Sp: "); + p_Sp_R.print("p_Sp_R: "); + } - if(debug) { - p_R.print("p_R: "); - p_Fp_Sp.print("p_Fp_Sp: "); - p_Sp_R.print("p_Sp_R: "); - } + // We want to factor into a conditional of the clique variables given the + // root and the marginal on the root, integrating out all other variables. + // The integrands include any parents of this clique and the variables of + // the parent clique. + FastSet variablesAtBack; + FastSet separator; + size_t uniqueRootVariables = 0; + BOOST_FOREACH(const Index separatorIndex, this->conditional()->parents()) { + variablesAtBack.insert(separatorIndex); + separator.insert(separatorIndex); + if(debug) std::cout << "At back (this): " << separatorIndex << std::endl; + } + BOOST_FOREACH(const Index key, R->conditional()->keys()) { + if(variablesAtBack.insert(key).second) + ++ uniqueRootVariables; + if(debug) std::cout << "At back (root): " << key << std::endl; + } - // We want to factor into a conditional of the clique variables given the - // root and the marginal on the root, integrating out all other variables. - // The integrands include any parents of this clique and the variables of - // the parent clique. - FastSet variablesAtBack; - FastSet separator; - size_t uniqueRootVariables = 0; - BOOST_FOREACH(const Index separatorIndex, this->conditional()->parents()) { - variablesAtBack.insert(separatorIndex); - separator.insert(separatorIndex); - if(debug) std::cout << "At back (this): " << separatorIndex << std::endl; - } - BOOST_FOREACH(const Index key, R->conditional()->keys()) { - if(variablesAtBack.insert(key).second) - ++ uniqueRootVariables; - if(debug) std::cout << "At back (root): " << key << std::endl; - } + Permutation toBack = Permutation::PushToBack( + std::vector(variablesAtBack.begin(), variablesAtBack.end()), + R->conditional()->lastFrontalKey() + 1); + Permutation::shared_ptr toBackInverse(toBack.inverse()); + BOOST_FOREACH(const typename FactorType::shared_ptr& factor, p_Cp_R) { + factor->permuteWithInverse(*toBackInverse); } + typename BayesNet::shared_ptr eliminated(EliminationTree< + FactorType>::Create(p_Cp_R)->eliminate(function)); - Permutation toBack = Permutation::PushToBack( - std::vector(variablesAtBack.begin(), variablesAtBack.end()), - R->conditional()->lastFrontalKey() + 1); - Permutation::shared_ptr toBackInverse(toBack.inverse()); - BOOST_FOREACH(const typename FactorType::shared_ptr& factor, p_Cp_R) { - factor->permuteWithInverse(*toBackInverse); } - typename BayesNet::shared_ptr eliminated(EliminationTree< - FactorType>::Create(p_Cp_R)->eliminate(function)); + // Take only the conditionals for p(S|R). We check for each variable being + // in the separator set because if some separator variables overlap with + // root variables, we cannot rely on the number of root variables, and also + // want to include those variables in the conditional. + BOOST_REVERSE_FOREACH(typename ConditionalType::shared_ptr conditional, *eliminated) { + assert(conditional->nrFrontals() == 1); + if(separator.find(toBack[conditional->firstFrontalKey()]) != separator.end()) { + if(debug) + conditional->print("Taking C|R conditional: "); + p_S_R.push_front(conditional); + } + if(p_S_R.size() == separator.size()) + break; + } - // Take only the conditionals for p(S|R). We check for each variable being - // in the separator set because if some separator variables overlap with - // root variables, we cannot rely on the number of root variables, and also - // want to include those variables in the conditional. - BOOST_REVERSE_FOREACH(typename ConditionalType::shared_ptr conditional, *eliminated) { - assert(conditional->nrFrontals() == 1); - if(separator.find(toBack[conditional->firstFrontalKey()]) != separator.end()) { - if(debug) - conditional->print("Taking C|R conditional: "); - p_S_R.push_front(conditional); - } - if(p_S_R.size() == separator.size()) - break; - } + // Undo the permutation + if(debug) toBack.print("toBack: "); + p_S_R.permuteWithInverse(toBack); + } - // Undo the permutation - if(debug) toBack.print("toBack: "); - p_S_R.permuteWithInverse(toBack); + cachedShortcut_ = p_S_R; + } + else + p_S_R = *cachedShortcut_; // return the cached version - assertInvariants(); - cachedShortcut_ = p_S_R; - } - else - p_S_R = *cachedShortcut_; + assertInvariants(); - // return the shortcut P(S|R) - return p_S_R; + // return the shortcut P(S|R) + return p_S_R; } /* ************************************************************************* */ From 801e0a065abb47d39a5a715b962014891d331c38 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 24 Jun 2012 04:20:16 +0000 Subject: [PATCH 451/914] sift features --- .../Balbianello/BalbianelloMedium-1.key.gz | Bin 0 -> 332878 bytes .../Balbianello/BalbianelloMedium-2.key.gz | Bin 0 -> 281303 bytes .../Balbianello/BalbianelloMedium-3.key.gz | Bin 0 -> 296236 bytes .../Balbianello/BalbianelloMedium-4.key.gz | Bin 0 -> 283418 bytes .../Balbianello/BalbianelloMedium-5.key.gz | Bin 0 -> 241361 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/Data/Balbianello/BalbianelloMedium-1.key.gz create mode 100644 examples/Data/Balbianello/BalbianelloMedium-2.key.gz create mode 100644 examples/Data/Balbianello/BalbianelloMedium-3.key.gz create mode 100644 examples/Data/Balbianello/BalbianelloMedium-4.key.gz create mode 100644 examples/Data/Balbianello/BalbianelloMedium-5.key.gz diff --git a/examples/Data/Balbianello/BalbianelloMedium-1.key.gz b/examples/Data/Balbianello/BalbianelloMedium-1.key.gz new file mode 100644 index 0000000000000000000000000000000000000000..fdbdc41883e055e8ce46245cbcb0c11e89d0c474 GIT binary patch literal 332878 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%0D=6Oxw@N0;Ep}-o8d#{Uz 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

)$zd*hi3y*TFD_ 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 g)1hu1Bf+)6V*L-hXW8UpbF){>^rj zzkQC+asJOg<0#|xpZi!xKhE!OmVbPve1G~m>OAH?O8k5I=l9>Qb(B7ie!Z@|+fn%p zKk54a@xzuEKG#vl(dJS6eU1C(`Z3E#muqord9myM>-&rA?}OamQTETxxBJQO>$LjZ zbM?)|FFya&_BpQoI}+!omHD^k(XRD3ulxJ|>UGq=+RMMju^n+cc|+xhFTOwXi6@Dh zjXRsC#^}D&e&~*h2I)VS`sm5;N3YK?w;as-@Q z_jK#`OTO>7cviO<Be^fA{~kW8GI7-!*G9j(dpu{JBBh zF$=MNeDgz})QWt*p)LLJ=cBR8ub&@{PrFC7)R-UDD=Q{XHi`*J285XgMK@p8lSR_c|`8@ATeC@8^rRS@gZJPZTzh=bACC{yEnFcTeMX z#q-pdVE2vQlkFaj7_N35u@be)T5MA7xR^Wf5clivv3JE9jTi6NacmEJeC8hYdlKAF zdTFp{Y#VW(_g`Hlj-}Y%b?~&1FWWJ8c&UA18>pQuxxRU-910DkjuWEB-&M`N zxCwpT{Z2N&HMM;8M_o9Ei`(g4zjp60-qW4)pPS(Z;d@1yR1q5Cf;Q2&d^zK=ak%X@y*_kmsdW+A^$iFo+u$=L#5(GcSr zC-^;Y+IJ(nFCRa--Wzvm`hxdv*G8TQ&sH42S98kgSkcTM)5KwDJL)U0 zi70fwANGI$83bwfANq4%6NJXO_&nbITk|^JcGL+nVS z`_^M^)mSPSh;Ze5gTH>y%C6%-U*=S}9S1b~ee-uHSV`-_T1Om>(KWVeP8AJ!)K|^h|{mM#_@Gu=OQ1O`WnTd zjc?k1kb8Vf^8t6St`E^fCHgPgHtzxMf3YL2szA5IS#}TbxphXCn1Tuh3Ns-hltVjg z{N#$0D-Ns`SxIbZ^P`dX89Ws_R6_f8>Dw8{6?Z?M7H2KPFpZL^$pI;GRpMSBbw7>g>)q9)J_Q!Nqk5vA^wPHC$^B-$UF_fQP|M~ttiz4GPGgD?i8~^$%Pie{r5}1tsN|Oj8hY3a2#Fn zUj4X3zg_B+(#C(WJoZWO+wO_Ebj0K@R6eN<=)Qwk7+uk!0(gaYjoa*18{s~QKktF* z3N2%s(22V_#YapR-BR`5O9aRx#Qt#)`;ORr{^<$-nkIC-qsYF>bNCfKT=Pw`mnhM? z;_kHxw>UrJYwzD$(@V0)8lIXp_mj+#$7euM+;Kcon;Zgp(3bOlxDM7(bz(HV5vTi2 zs8!b*xgwor`f6=ye~A2=wELBb$1UD(Ybt?atSTw#^GrqWqG=b}ngv`r*7u>y>HsY4 zE$w;LOG~RUX_Vh-LN#*8BSO^Jq|Q4UzQeZ_zj6Q1)(&!y)ZeOAQC#IDD5p;lWfVPT zUH^`HJjWHe$N7p{b^QE*S~24tGB7A5^2epqgdf!yoz3OyHlYvQ2U%seGOddPUG<50vb05QhxzKx-$jq~-MHpe{j zcDA4|rhR35W{=eDA2A^JkVL%K62cH55K~2`T>*%y9K83q)@Bq+V-WiSgR0-UVmSq> zba45LXmJxYUc#NO@?Al~EH0g%8KUTr)CsKvu}ncIWSn`A3S2G{`oaVL461hc-=S|~ z|HWj#V`PLUG3-F!}48Dhi;X%GZhK?bIy>o5}IMP z@(TT9pii>!qS;Xk2aGV;rI?y!5$BL@IpP*g91UH3@iN@m+W3nXcn5kB4*uPD^?&v6 zB2ejyq`u2v!;t}YuC$u_{*y>|1;fv;bV1O12g9dk?78=oS7F}_lCa*BeJ<8mDO5i^ z&Ci&gfLCY7(7iLxfkChwDm?|r_ zm#U?v$sH)=eYMC8z9SK9O$pCC(~Ng`3VJIfhq2K9A`bmqr($nMh}!(;(F~>q;2vR^ zE^=>gdmkJaWHp3uXY5hjw^n`0$zC;_F{5=tcP&DllAXh@>yMgef+xBC`$yM^F;cy1 za7q>jFY&+g3n#EabuN@8mk-}i75$eSoj4LN{-*RJGtRtURD@QIHaEfow)gq6kGX0_K`ctE(TEpduw`a-Roa# zpsQ$+2lG~SBNEGLG}y>CkGvH~DKXXSS^k3%Sj8Ima+#aE;);Phe(F_XLmvB7d~yE8 zn!6*sh+}xcF@nv(VtnOLB+wKx$BwRW_0l%NPlh6=lITT*UH;3KTlz`R71vt^Mq_dA zII-^?W%Rg$SF~qek8mW$JZ^t$mg<=8uNkV~Q@_eUD_0>nregukq8Hw$|Y*%Ol5FXYZ+(pMfqU_?f3ZK zi~NcmJE|lBlw?gyukT7&rT8L>U&+f9EjkkD07P4J2n;%A;k`0qtDXw+x88b`0+fvx zB?I8c)fr;fN?Ly3pxBL>9(!1f+E!4Y_`DllQuIBwnb-P4osQFU^jb<`Vp>LUqW>$} z8CuD0qiE3L{{vXH&A!kZlc_FWb;cv*n!OaI4X~~WezH}YQF=O0f@{6g+COz%e^D0#-({E04F`!3UO5VBauUQcn_N4};6YdAIgcUnU+=0Q? z5zqPE>a}^_+r)m(A)c+jViNs?@O{Lo_TG!z6C~XUywL?#Wp_sB;g+$;>b^@XLtbCGbfD{>=-zOQ)AGoEm43 z_LHhO23V%XBlSbzp5m$=>!}l=UY=>13=ibg6r04&394!e|1W-na((gF#9E7&&Z+<^ zs;ambo#AaHiZV}LzV;eciY_|zzxSn7h*eFjl2KIWy-~vX*T@G#5@Du-@8|GW@rWp) zvE9~fG;BjHY1)~!0dLQso@=!0YCCfTHl69+IQFK=C!1p##hL`^rvk6~Iu?p2-`J`{ zcU3N#!13?mBv1j)t?^BQeuCn3S=s+*&kiqC6Yt1wc(p6#b){uUfku*cKG0 zfsre_(ov=4EucsPld+U|ypm|-5KgjUd9`2^T>-QH-}!e=RsM=9MEhO(G2&C_3oKnA zMnU-K9NC)N4LXI7d_7H!=Q2F?t-%mEYmKgNVh1RtbF`7%z#kIeA4!s5`=#nD7(e$0 zFrlCI(+7-}qOmZ-mZ8j5vtFl>CT8PO&4^49$`izwsks~vJd}k-0okx>@i<+goH&eO z9zM}2C8qmhpIV!C^r&++WtJ<-hMEprz@o~ZIo|gfw{+mY2q6MEcP7=^EXo__VEA-| z&dfBl=L|!wYrb%WIOMvHkk_ZRiTt1>UeuaJn&p>L6J<&j*hNn`n!n?9xvL!irDEuX zst%$!zpF0S*mwe$a2gh8jEF1`62tmXRJnh?Ze5P*jSL6tW)YnS46Df&n`BW`o#E^f*m}RQdkT)~sH(c6H(c+D z2^(d@7>O%CTp?DmNbft}!dJKUn4)t|1QZ1W1U$7uOJPpzPr0gUGpj`9;Eqtv;L}AA z3Aw^)sdyL>0jhw(k)o4KWG6=FJ==9!Y)`y%WW0JIK^q*54v?vxxSre=*%`C$GdM*M;9tQr zX}*s$o<5d?cG|>}nzvjh%$h^aJ_eXjC$Eg}?$q$~o9FVt6e@4`r9TOab5J#=R#f|y zeOw~%+yR`x2I@Pev~{BOGY7;;y{>Q0Q|DX^eB?t_ju=w;I?Ki!s9ryC)Rs^ zBE&0e;&qYv3^JqGLGEGO1YgRi^d*~b^Vc}3IVg0mtk44UMIpUS7fW>Vkr!={dD1uk z^g3Q?L|*s#4g(Jm)U<`H7g2MH9N7d=OufYcpDwP-Xx}^2o!uxu{0ofhZ}{d4pq$e^ zMgF@b&hN!LVmfI$#^5o5F3>YgwoBg|L9q54VSR_luAtaD&J(qW^>9Jw>LxM8FGq?D zbz*&}F{rRwS>+8VGaku_VDGM)33F~itNLgky1#u1(k)c!Ry=wxnb@6*?kJ`uzZp#9 z1As~={-Q>C0vsFEY7{exTfCD6e)OK&_sGRYGGeD5cc^!d^A!o@J+;@phdaJ>?WFjB zL3gKd43l@`Id-D?)kVrvxhvS;#gyxm4A}e$RXQt0U`f5mzVF{U$r8nWh}RMeJ`Q+c z>dNt=wvrSCC&$D2wo)Ae+Dm~_fsO*|ou)21YDw%m|5`O~+Gt2*L1fjnO2`N#v$ zle?QcSqfcw6;a6Zsgq*Lr_A*iQ*)3-20#@V%{3H&diz?P8Xh#M_JnP!O|qqME`KNv zh*1~8{7&vf6Fz!m6&u#{=|YI$FfS9GldllAfQRVCRuS>E5yUR)l>Yc4>}&YTjadMQ zcipvK@JG`TxJvBlctacJiDr=M!ZG>3Lp^oPemHT=%tD)*CKDU$A!gYq;_QiYuWc!a zh&uY)7>f9=5yA8dXzHHQBjB6jnvhO^A@P$83gYzuzt^_74#JiA>2iuG5U@9Lc&C0M zcN)?V=qie*a-W(J^{8fmc6jYR{h;qhd^bP&z^Yr##wo46&6Lp~SDcl72PWS%FI?$R zMdQJu0gfXd*y z(8TWw6+cL!_XGC`1^Gd_5Amk`YISN>mx5sp z=-9fscj+nK0#L-4LeeQD50EskvN--joTAMCjG4Uu&LBcwWxjH-sX8KoY7LCXS*v!#R;1>acqW-Sj-+PAeQ5^~GTejEhh(#3NZe)<} zyb`vL|4lxwPfu#0jyHc^t}5UwJ; zXvPXZ)ua`-;`_n{;w<5+%K@|&G%I=n;M8Tn#--|rXcYh{qoa`Ch%HW`tgPXvAn2t* z-r@drkS3AecQXixBbO6gDO#yg+fm>L4B+s3w8YJNb6`!yq{H^LYQ#zx6MHH-KZ#=p zz&>3v%CA#qM6tB|>mA(NNJrK&IX!gRO(-_rr4EXCVmT;=m6qtkPT2)Q0`;{4o>rMB z0#<^513SRPgm~lU6LX1Q2NW0bC&llPBA@!Y1#eUQjmYhGJf_OB(7_61h^-Y-VYpB` zh+Y2joi#ymRdTR=5EEsGLLEl4dBId?(I*>ugiio4$#xPqORs^Ws)%~tRb>ngAtDnU z$`zz#sqS9)`nxCF2yWE983g-J!+$0&$)T)mrGY@`?TX`3Ns}WHsHln zExe0Zz`{)glXj3Llw{NJL@huc`sM2FBA@C^qN)fEsxX^w$L~Y3rl{HY%DDCi_<`b~ za#87R?iX9DR9t9+I*5@Sq&9D^ox+~ZmqK;Az?^Q?NdtLop`b~y*v&cC z7fcax8!OwVphBCnvrMo0&=qxc<*d$LKe3cAhB-JxkU%s(I+&yG>AEA;l*vh69Q^1a z1Jof_#;2|oe86@t&e>Rr_Ya1+4fTObL6BjtJBElYv+-@(N2UmSp0O8u$OgaH?jrEL zkyI;^YR+SdDw>y|!b*Hmd}?*JesO80kaV5hZNQwpR28YqF~!-fA%(f(6FM$EE9B$L zZ@!4|0xv_c;~3&!&8+0?!v#RX&_QN$5iflbSWlu1U-Ix)L?4)pLU9IOW9m;~Y}TXP zPxq;P{Y6cv_Ne#V8&BX_BCbqqU466lGv>lKO`@Y2E zs~V%jyiKr7N%St~T3x6R)dd}_u}8wA*$Q{Gu0`1eQyNCVy~*spGw0e$+ zIE~MqAMvr#k=pn95|b$jnXypEOJH3n`LuUd)={Ut?yynUmnPERazU(^fQQdF@U833 z$=o7jydU{K7iudZByFn%)oMjH8XV0HzA%;CXkiPE-5G`rZPK*^;v$EP`AN{+T`llz zt`z;Gp6%e3W|$DGHRs2o`T%OvQ#ux2ZlKD|%74 zT#kdyVT3>c;m3eR4MbgAf$-`|1+o$+i{{-;-KN~>nrq1ow0(|zoG+PV{%f57ul=3P zLQ03_s`LFk&Y=2#FTJrch^44%s^9ecndFT`;oa-HWY*R{uB#1dW>v?kI39|w*LQ?f zX`g1fe+wHIj-%Wc1 zu8t>Ww$}ZX*uJLz8$PtU;ud4)5g(MIvOmb|k zy+_TFUKA&P{!U}w_4uv4lfu*&{6)kR-v!r?3h+?PYjA}}4JN#Fort#HdvSuk-eCL{ zS-&bE#P^eJ=>z-on@jOqeZM=owv=}fv|Vqtv!1MfMHarZNv`~Jq5dgjgbK1pD$^sD zTaugx(4E&RkaYEG&WwI9F)!g?)r118a8^JCWtwDFZ+Y&?=Hw5+VORCQWd`I)<0*Ds zdV|N~`ytf-{5fs438uO!Ct@>o31)E3(whm(aAV5=?_> zEUREJ)Tpt5loA6$4{krlNgy`mXM(C4f{T>cG$yOE))tl#{kiv!h0yzT&)4G2=SK)w z6wA-<`n0b0WvZVPihDcWv++0d)?l5)GE#_H%y;QxzjjIMP2kt%|Dzh!c-HY38A+Ff zUuvCvb-&>mm6u<9Kyo=IZ`xEbcmA7q&hGdohF8Y4`9`r_G z#NO)EyqS_e=YPj;d|&B@gBmkd4rQ;Oy)xeCN6PiT zzp`|t-z`?FwfyYZzsH2`si&z`c@VJu8xRMQeE!PG*FV~u zVCVMDG7n&-=_p&8tG;YH=KQ~pVRg}ai=^)9I2#;|RMRc}=)HiRm;GYM8$G{r%PYPq zDAK;8*f&P|3E^uw{(Dy@_}3>0nYz@^oSFY)_f@a|9malMGVhxs*h4dn(f;o~Zvwxq zm<#R9@RyuTNNApftr)Rs|6hYRI&Yy{U}Nh0lnA!s+NI2{IYR0JnX~K(*>1eUY*mK@ zW051r@@mr6B{fVLQ(Q<{QhSOTI-3P@*)L`4_!Lj3$;9JZgg*J;`QvOb^+O+U3R$-# zO{cX!fcAPLA!d*!Gx%@!N)JNp-+95v*PO;RMP)h1^@8*&j~Atq3U}-B2KYhf5=q9K z=Ef=T4FI&*yKLC~D~h`ZoDxyHrLJUYsLpu7Y}yp@IiOVM)M{V3M!TytAgY%By8hwm zU!THRtsiq-P6BWOl@pGO?PNS3yT}ZSg1rls&G`}J3Dt?~qZ*+a<_b{k8i5DzhY#q> z-eX?ZUrg6}1rvY8X%%1=?kI5vRfE(MFstb02m58iQh^~k0V9Q(9>N_a)FnsX+lsnvll5R#)%B!T~ZZd@w6>E<8v`Aw0$hVIrqs zA+ySiwybqn5v2o*`u7y;FUVr1s~jfo7oqqMglMb8q_aakyduF zau58SQpLtIqaGo{w0pAmfws+Bv`QVe;ORm&v?^~bb~r4roCdtcbG-`vf;w&m5hYr3 zW5u(8Xq`_@D{D_Lj3mJ{PV^wpTuD=|n$b(KoALoo-i|{|=jyW<;w}_Xk~m1>X%j*g z3iWS@GIjB#(5{PW4%H-_J4U>w;kDk9!C+|#_#V7XN{Y)Buex%LX;%wFgVHtYOIV1G zfWCwuwD-m=Hy`%e=Vuc6Q3ZPBV1%9g#rJT=x1+px)dF1fi|u0}#lbq4I109Iuirzg z=tmbdQoalO#P$xo`(X}tF6;|B9(+7f7T-LjA>{439gR0Cfl$6vyYv|#3X(w3=O@|+ z+vkg06x11?b{~;Jp;>2eE2c#CF~rx$Zwme8bk$MOp9wt6x7RLjnnJ1re_ysENP7j* zGmhNOYZc%2As*}PTehh*bv|sLhSrfYAhsVH(NM#YB)7Ko^(x73)LBttI$e2H;ovH& zV99VQ#y9C3$~3nu51M8rnCheUq|#-~lQDxw zrSNKBImk)tAux!wyYu)n&p)2DU-%og#Q`I4QN#+xn#D*ERlVqlzzagNnlyvf%()Gg zq3kA>NR|t1kb);iJR_9)XGKvWs2jYhB(P7Ln!y41tRIBZYEc(4r^NUY3Lf?W~ zWMwf~CD~pbL&nMr^lz$U-V}yhcIDu&DYBt8EI3&r(-6_F^t8lTDkNjXd#dDTukNS= zuM}g7k;vpA=!}nCxog9|(5c<>*lp$E6X0j&L z$gmtlT6xTPK({YV!|BBCA?z!B1AQ++9R za7A7)sMd4^A`e$(E~|eY;)$aFxX1aamr%GkQP;{@-}e*gT@$L&sFmrIAMaPqDrsHbZ6iDcy%%pRqhvNU>N$?ZsQj@8V)oJfNT?qc?W(ZL#j zucCxtqvT4@WwPMKYd9?MhDp=**ZFR3xE~7_f%F?WGbYgPzQK2@HcLxF$em|;66oLj ztkTaaL(ef&{d|7z%{*dO-{*1VJ`r2p#qs8&spQYLl7v)!t>ZFF z6{&Csuboh5*O8{@kurU>UTp7Lu*V;1Oh37|QMuehA(T-YvY&5^$2%#xHGoo&tH|7AVvFhjEV{PZW;_a41u zPezX9>>y_Bhf|9xmds^U^BgXkReX*I*hHTwgZ^ui?FxP!_>}Mm3Kc1$>i(UN5O*eLmBzLo8toXR#tA7tu21 zAm&c=w02$_ihrjfv##_t2B*(l-HM0k*dW!K>_8-zVQ;bdLUB^lY{A8{D$cVg6ly>D zXvH$YijTB}REXr*STes;9JbcyDeQ{$tX~M??VahvG5U+#RlZ|?=LS)*=LvI7Flu9@ z6D3v+PBOvrn8PcTmag@SUJ@tP!>6N|ZPlJCF5Mm`c^7-ua3+xi6_Z^1iRt>sS-3oG zoh&BrZazC}bJp0!we1(%oM;9*k*jsKf-DftOte&l29n`?q~FrplZ(tFq!X*7u+Rq? zX&7h3Ou#6f^@dr!Zs;EC{wH&c9(uzSr>8mon9$esF$WClxh3>3fx-lg>q~#r0Knuz z!KsbskkEw1O&%hp!N*j!YT{mZUcgQ*B#Wa^QqAfe6+^x4IBF^ps1E4#n#AX4k{(C} zWQixgm|7eRcPx)$G8QOg1LrnJ9$%S=YNcX1UrJ$6DcLNpim6CG0QOq^a1H`t zrJP*@A3)crVS^wu<^MbXS}EpyE&(`6W2hX!g%Cbd;f;xnQ#q!9&`^uE~^fex?$*w$4{7fZ7SCInWzFIfrr?TgZX`CD$`{v-C)Ps zDJu9%b@UKZlvP8(HD&l4L@qbExEk1`r}AmN)is|QR?se|^pEG~3mRd%D!;(Tm|azl z@_4%)|br{eWj)f;!HX2x0Z#+z-Pazl-Gq=@{o>4kE#;5N&Ly`3W{ z2vePi{?5QB78wPblvX{_dKWQt0AEix1$nH!WR@S<9k8X+3sGaHh~RV&5MO>bhduF9 zroL}VwT2(u&~q;FypU~8)jv?_30SI7nVY72PegoKKoM+FNhiB(vQC_*FV{&@M;{vw zitr|h+0vqHxn4Aa!y5;nT6j64>Hatjh4l|2S(6>@WzEE@r|rxo%KN}W20pb7bS?OOx~!ukoe&MqHru6M z5qxuV_^k_~Q4H3om@JWU6I?+CpD>z${zLv#@zKT+}%Kms6eMIukN@755ed<+3o}MhPzWWITLuBqRE`TGm6& zk}ZyIRekulD1!8)u$Oq(0FR3?Acd`d$P&Vt;~*&0TSQYM{V8L>-@Pc19<`7K7-jIy*hA+!-ORO#vz`^CY7OIAE~28@_6+)$oNpRpRmtmiq{6vEbf? zT*bB;n2=RKkfN-hiG$D@yMO3z}+bB8MP9FR8@T;WcAE` zEf$_CT_cLYdRM7!N&5rIR{C&NNg~UCyoR6w)Q{8btKm3m&}@KI>nu|iC`KF(`&(h% zV(DzlA*Ib2t|^UFWeSO%z{N&KlxO?gzl^D^C?(*UMcjz-Q=fi7;8d%Iw6k<6SG~tp ziY*XP3aA!|{a{gLR!W)Yu+d8eJK?z~!C=BD@PgHeYn*|%LNrAb&!b${+#iBCA}bu* zuK!yRY0TrW*1CdF-DmsT5lD)1^ev zR_L{j9zXqOESgaWn_U1NM}WXownck7L$2pzdRHfwj70yYU=$>E6;esIU%N-TM;U31 z5sekqj_UvF-<$;+1)+8=kJ0?$SiBR<3E&U}D-={I!=}bwl7rUJ?76fDDP?e)!~Cjp z^IpZ6wpiOewX^bk+1AHV(RmQcXA3w1~Jq}QjFlP)W2AjQPYTaw%Et2 z=&UZDkG!;>cmSDTA@_>YbXdD@fL9NKlRp3{&QysLw z8I5@>sBeHS$&Q+XU&)PR(4TM(7Ij6w!GoSYr;@gl4vx=>+mW|D?9^B!%~YRpXyYE$ z*fOji*IH18n&|Wn5Uz;|;>D-ce*~ZGad7Y1<>=Kb0d4URL2X`Nvq6HIQ^kTOdyWHh zQ%-$J4ygQFU0X@f3tK1NVGP<&P6)#BZE(@BW`?#1Zwe8T#>i z8gCKh+7-Zu)L-KvMBrM2+^D7@DI2ux@Psy20-QqD2wHX6Pb06BrAVHVoeiD^9QmSr zv%1GbuV#2pq8nG9_G3^c+%rabJZ)oiG;MPwqK$W(iL0SXU_9-gYx7sVlZpMDYvibqG%i+xWd9yR9%ftt*&wGknV9B~TW~ zkh0>78}61rG;#(J)InZW92?_Bp`3m+Nv|I`28s+HdVKPR;l!Dq9ufkN%luQfg==zR z?e%;3%Xui~Kua(QNP+wTRD((7UCf4?RMX~OQ9 zk4RP5`pM*me)b;RC+U2RqxyGz^_@!}YCo@}`ReWW>i;v2<@lKa0Wz=u$Tr3}{_~@@ z|2>Ry%(-K=IN)N7yJzGO)!;vGvyA_=_2frCkNJ`iJvaLnrW^4b?~XKHwEww!f3)?l zAsiV$o;ieOZ@uoSaQ*Rqcvo_N-mE#7>2Bty`5pRhZrJN*v;H^NE}xKXoe^)v_>I7< z!|^oE@2(o(KC(A*IeZe?fZ`!BBcLh{L@3-Ia6AjuAe^NR7$Z<<0TD&kxGs2@VwDbL zL?V-84!dNJhvt7MHi~F?ejrQuhe$rxr|swlb6m1Y?&^MB|0o%WEA^cY`=7S z_p{=nU%u+GLx*InzU&RGoJMKIa3^yAW*O+aPcHD%S1Eib|Jk4Acs<@Bp6!)ll74@) z3SXaH@`V`T-C}#~u{qo`I-11DfS6mzvi{?GlFfpui6yyXo+@mJ>S!kYX=xL|8rL0pHf=0uQ-4Qc z`^plzxQvSU#XwNI6nQxq)UWPWNDMqPW}laP+v6^vT;CRpK-5>3_lPSso3%_t7;n1p zE`*mr5G{LCo#d{c!~Nfz?+T5;ljU~w;{u!Ye*}F1Nfk9_hXK88$_?!-?KLl~vo*E@ zCuvplWpI$8u@}3xncDnl#uybePnSuGJm&7H9>ZMkaW8)&#a(~V$tm8!J??$mt8cj! zQSHo8QdSt7r-H%&?I8WBVhizx9f{Hn*8Gw&ZHWwC;xKz^$9?$D*Tvktr@32@b!ERB^hL_up^tUnPXJTD7Y3ax?I5ui{gAriZx zb8iiigxq1bF%;vuWPfn(rb&-$sBBjn;p|jF zgw#yH)pFUd+V>v{3Wg=sTqNM+a(QMPknUASf>kgPj&x5wD1ZIgB+(YSMUhAfTogS) z7iM|V&I(BL0jtl4tITQUUjvBhI%%)3xb z<-nlEg0L!Lg^{L3E-4m}f0%zzaIeE+YS=QRuvL>#e{5tk*o80J9Ej`)&I7WuJ@}L@ z6p4I9r+;-|#8NdlY#~UfL6;Sf8v9aFd&#~Zw5Vt8EQmfb&?V&u>u}%Ofsmoo^1dbE5+eB)yb6B+L?znl7bOr6Jdx&!f#GH*p&O zYtWAEEcN(v#PKpR z(VJe)%6kG~0BV(m4|qrqfF4 zuNz}zFL^$AR$cUY`XKQi@Ep zk%eSBY@@0YKGzQ)X==p*6r#85o}ZW7vZ-}Qp~44)OvRot2u&GeG1)HLP?!I(0HDh8 zqkjzd`PX$^FU_^uElP~vm&3z=qW&0BNj{~$NeBLy(gm|db!`&H-Lln{=uolxr<2t6 zO%)p+s@hR&C02ulUuipE@wgvZdD8yeu?wP`lML?p?tvSi>g%1n`#Q~HHjA!jm_TIt zI7U=&Z!!7W%K2NgdCkjs_M=sdFI$OAoZqIG{n1M@+OZpq5!Lk`C}0Hz)WJ1!4T=)e z>$|Bhyr7;2gT^S@VfpaRK&LU7=QfL{d~Javn&QFJ)`{;MGGE%;d}B3fJoPi4?_&di zL(c9OL6@V7SX0{NafaMjq%n_tS2t| z#DgbMRIZqFLCO6%sz8@PxlY%_lpCoeD!l_wCV6fl$t;v7n~EMLpp?^gj*1Ah8>Q<6 zYAJkpn~5-$CAi2oi&TP_?D>eJb~)Synsj;b`De$b4&*|k=Q0S*fKdZK;vQ;1mwPs! zv3Eqgi+{nk3u~vhfI=&|01b8~3SCB`4`s+nre7(-E8B-+(=X$CK zBrP=JS%*zZD6ln8OsZ_HXGE)F;F%W5K0cD^Q@UZ6^J6OLO5Ppb$Pw-8J z76LV<;!G9%8c|5RjfFBsQ0f+R$|U*p)*j?NQ z$0F3-6CMPA{B~qk;}JSe$u1YYKjHRx961W7adKW%FZ-*Ls->W5$)R zOq#1)9M{FramT#Es^Ve>Bgtrlz27IjYa;$U* zd4W|*ND`Y@NOuN0l6tyDEDdsB%fmi8-{XPmgVx3M@fmEPf2X5;V$GMT5npo_x!hvP zLjdO4Bh;@dw!gk592y0O0^w_cIrwZw2l2lfN1i@u7wq4h<~PbGdp&Z1OH~o$Iu6&03Iqvlb_6^ECXcwNXbF_KG2V0Q}mi%!CweCG2#N*D%}}QRcnFi4kPM>h#nHf zblp#;qRm77*5ddUj-=Y2@kXpo=Scqu1*GeIf?yf8coRph0hT9Y+~TS{p5isnQ3-lt zK9R+j$B$@o{!X(P@cFLB&|Ah6lbu{G;}j?EfjBE2nNDy2JLgi(!n=k&wS<+@6jI;z z_>L`8P1SF)Wkr2IXNp4ZvHw)gZ?T;Wdn*@oI@@5Bs!^4+ZkxzL$Cb+xj+#Crs1FL%TM&;(LvcyqcR;v>qzf^RiKAr zdRB#MgMg@~r2%I)5yeFVL|mB~Q8TKN6B1yT3CAdAu@$UZswj1fVwnpb^j?6AD-JSe z3qQOVuLB}C?Pt@dLBRH`mfUlN%RP(?-4>L*ih-Q4E3Ot`dZ$KX2CcZ29f0}BrVuCe zU8{hL0q-HlYT_0{TdGkk?I?K6N9y@ud+G`*3f<5tylLx(mA4cb&h8ZfC6(IVrb4ln zgCb4XOaJ2CA&JMf1_VH|Vf!hUPyq>P0HRhlOHDm{cTrAQtq%Dm!v|fR@)9znWg#ak zU5DDHJL7;p7JJG7=`%pwz10ljYDXoJvzuvZ&5qs5@`9okffwR0q07 z91fO!jjT=8{=TmFAhn#eR--%&k5BD0JmA~7f=@r_5#D1dZ>`$pDlC_-1l6xlsT7+& z4r={!EU!6Xh%=W2sDhn}dlBfbV&hSox^W=OP*SXF<;S?*;{`RmI@BT84j?LF(q8~P zS@(+_qw14^>n|gI#JVDpZ2xOeDK~hkfK}3s&1}=mShkac3ENdq*$y=t2$Sg_#$+VW z+8Aq$RGU19baiO_k~{G~tH2Du46ltqF2f3;J%FOED=^ z+Dx~fMI&>io!bk$5lmC1_ZBGmAp~k2M2!F^K-j;CSI2b~amc?un*}h#Kl!+@QlNx! z;!}M;$;xr|gKY442_~7o!0DA#r1~^QDxa28%4cd-T2fdSBX|u zfL}d$o8{i}l@jCoa{7c)d3xn(I;guYD!@)%E^)_pr-b89y(EPg#px7+t`KaW%dJQT zt(42>*~r-u#3nq=A%iZnmdx@c`HAhd8v46{TL2kzwe z5^OvD=9XMm980`Tfri&TnsgP{?qL8|W3TZ;6vG@Mg&$e6G zxjDvz9kk1aHD}(OIZm6h=7B54mB4{ChR0rfsu_wpeID*S=>~s&rF2oZ5piR!R+J5Q zTsvH~#)P5S>c%(c*pmiK?5vX&7C~s}lV#%~n4yQkaLj&)y+y_ChToh$kEj@luih+- zT8e7>Qeh(cT`Hh|!YQyGg3r%H%oJznn7>Zsi1>Z)8C z9#zO~OdD(iq9ZwhjFgeloBYwT0_I9u);$tZhi1q}D|IpT166uJ`LFoBaYlij&J6C$ zX=j7Tx<0jz5G2>N4J(KfbCOpnbEgV!7)zmEG9i`90<0@|0a;K`1s*bv%zJ&HVIrEP zDo6{JCDAzt7Z9=53QMXfkQ$edJIGywnKeJ&T2TL2h3n-3jft}=Q{)nYAa|KCq1rDOpA2viw@9#4;LIuQ__)L1Dn33Xh%NUU z=+SMj4fTEN0n$g4?1<|1s#&iJfmMNA&FbiUpOWlwPA@z74~xh^1#nZ@I?G}Qq3Qhw zGy*jS>zn+$jcTJ%99p-d`K6#e#r6X;t1W~^T>v~QA$t*NwTa!?%5HqbikCfba5)k= z&6=TU&#CfAen+Np4FDfuzzu2ylSf4dm6(lJ7rd zim}y&c8-*+jXT^~96Y z`m~m>cu1S9Fr-0z@@PycrQoB<)+v4OQ($Px>m!FAlJl)+j~C)xyd$<^6NBRZnnQUG z@qWWTRG(?O?ptS5n0H@c%B9)gQ+uXuiM3x(+_mey^Ta8zq}Gx&b5LC~-~r3;!QOcw zy>8j2x@iaOO?!kK&{u>)q&%e{-bA)prF`Ag@M|@NFE>}v&AjI;Lm3$6^{r;2e%oEg z(l&?tn_U8mEi2Eo5+pj82HYmTAns2?DNFemp4Mb|M*t#W;mc*0~H^p@y+8b0gJ2SHVTtp9{LX3sTtN!o*{dZGc? z{0i2W-E+D=HiFeU&xC=xE6FfT=JurWPXpi9X{9AwtXTlS1D#5YdTr`Z(ta({# zN1wza8Ypl*F@*4ph#H3v8;NScV(vf4uDM~MbDS3Kl!|mmV_?RoVi%J} zi%nZ0f6s1=lpK^8SP3>vK{a*Lsp5us4L^m1c1~`YDqIe_=x1Zv11e`CVS8&dv$t+d z1F{tYKE&|zQ)d6uzBvLm>wjZm`CLA3sW+}CHx(_g!ZYv;8N&P=)0(=pW_FS+?28re z2GyaP=RwCHO!PP?I}iS=U^0qt|2IV6i0?LZ5erC6$_fd@>< z2HS-F_ipwFjor^}3osItalCZC<*@np_k0|DRR=}&;!^RR6XHWzRnRqFWFeq0T@~*c zMoub+lu*&A8j^}Zr9Fz0e|4e?;mUWIS#s;?44Xfy-&Iur7@Fw6<#n}+cE9`zXNypR zUks9PWt%L4!#$Fmw2R7;!AVPf97L({=9*&U5jV!9pA|x zsf8tiy4e=|vRRWa5g$y$_eh@l(fNMRetw@QpR2vuP*urM0gitCmYIw{13A-|_dSjP zN#_^k=f>oI`Tdse?>OJmM8MYnIAOtv(9SquuodW~uiufu%4;TT%7_s3zEo4MEBRU6 z%m3asVs1urnoUQE!Zc|3rIwAZt~vph$mpac5Ow?1mly47Wx718U=<8@K!bOmMR5qy zBiXx4M@4V}A1kL8hhBNCIyqJ`cT^Bu0ryV4$qf1Y~h*`q9|1b z^>O}wa46~o9GH?ucb`s;eu8Ed*REVUv&$}3fK4@BBYf}|uXlY9x|}4+HN#gzO)Wzb zz0Ld`lvPWbfGg*ImLe5|z8*t1Geru8xcBQ7ajx~}n=e`;#kO`nj1wIo2*tia4UK@U zo(Zqc6ob<_T@0H1&0#YBNPT1CIORFy#$=J>JAk^0KsZ@PKXJ$h5>20 zv{36guk0?7dJk_OBNaz9laNx+;oLIJI9>jq8~&8LB2CVWlCWyIP>g9Y<^kt>45?mkgVf0DBnPuQ5vHXn=xPBE|}J`8q5dNzMc*((mM zN^{LqVoO`j^GtL)#zXyBX)*_WVQ(ks{b^nZCA{k@i7jZ8iCe~1bRUnq1j3x!>?6%j zqZ+!SB=r|`m9Xs8q^GS6+T&*w1fHxsDTO&Te7m2RplVk`#+LgF(nq$Z`aP$Y8{Um~ zA5gWL9E{QPIP$n9x_|n~mX>j99rWVMUxvK(W3HlXpSFoFN+qVp<@#nmE|Wi9d(%Qv zmwU+`nB(Jk_;cDdl@)zVjd>P%SX=ZJ)QZ-(n2ixlM|-hY>}w^xxD-pM*4x9QoG%wl z+iZw#{}T@N#Do1>!Q~;N_xjH43h-S04N-^$e!fMm&M4XWbv>D9q0_?a0?Xgi-rqCd zo+Y#gzaDQBNs>nUUN4Iqwngamx2-HKQjhr!!UC22#E_n%U4(I7k9HmZcjtpbJ1%#+ z2ftMK-i;|ng~Gf(GYDOMJi=>_8r~Lf>Zj*)Nr)<(`PD??>bPhZgv%H^7h5bBv{Y2u zJaO8SUU^L-b(|}&zMK?p>S_Z`z+p*K>;aQ=xiU?fjR-(ZJ-iKy7!10v^I}VG<0?c+ z9PAioqA3+(wd`3N-VCd|#^UaY;ckBq`}~ve^$c9EiK81Ti>YD2pOKD#rQm* z9Bh4LgM{2`A>4e|l53s{vAY_x=}AyysBmW4Y=`)mo>RHZ#6Wy!L~;y?7g=`f5k36! z?kKwso8_w{TE7%*Tn428&+;y{yR9kk$+Ri?a>Z}~X0$0%9LD$x$2B;`CU)5k@l-`& zk+u{Ooy?hSz)$oS`i<-Tj4Ih*r*$pNw!!aS(h|1^4K2fNox=({o%feYNms5H(G5Q) z+b)wEh@BSIRqjHZe&qlbEjN57@rNeLcY9d@CnKy`IwoR!zMQP8su8bkO+$O3KQKCo zDiL3y-M_mQkWEn55(kNp)mprdVNMF1KI;lq0eLL81U9z(WsA!OO|VEEhdrZM`#rPc zN~I#51but5RJ;HjlRwVaYRtkdN2SZ;v6*4x9T|e?I+4+wK-=>h$MUS72$-CeB>yIe zeg7Ead#9L-HhC;o47`=v_2Od9MIRSUyiE2%{!eO9*YQ1#36%Xhx;`OqqNkalaG&fZ z*0Nt~v31N8uRJ#k?b4T*8O5%KMTzE(WB|TQY3@R!YqI8>;gzC1hY0h#F_qIzZ=_IyWlGUS*#Ri2L9BD4}7MVhZ%TXUg6$hM)j+@ycTXo{*IM_7+GP$r*> zJg=k6YTJ9X|26Yb@n5iB5#OW;ERH!ZU+WL(rE+s9OLze<2ZLd@}6)DV= z$9KXr^K(W6dWls=-u_H<(IMj3>+u+wRrBkcAr@D-(9|{G=Jm0C=z#~uqs`+AqNA4M zn^~Xe@vCVbmMpB;mlt20K#a^e^ zK$EA@SFaiG_{us}H$$nqwE}~AnqpmW&s9|1ow8!$@ky%TQn%YOk1U~_sbZ*U!x!Ik zVZP417~SE*){~3Ap^q-0>xPoBE5B9CNXy z2&*KI${bNs?t)gb1k}1*r2+=zzDF^5@rvBMenKS<<_ZCtVmj5kJ%3^OTcKI?hpF64 zCGjVBRsz|Wz{i;aJEvLpqmG=n(IeJV2;+nX@Qi01Qp9MIDXn@78;OoU_Nq3MZ7mOo zQ4^LIecmtEj?_qn^fPnR7y`}C*}ch4Sp~_4SkrHP%sovOA2u|IL9TQ+7}Zy-%2lu% z*KsT+AL=zjZb{M;Qc4f`g3eX6dZJ?GDjnY&_f2hu_P(ToqdWoL`AO%Hkm01d^_1Vy zvwc7KZYmV_`FYkrQ!uDjcK2A%u>QFdpx_a=;L*tXM-HXD#`+QwU+D-o>D8i;u1#pC z_*K?wW2<7As$c;p^k;EPRU-oMHbP0KB?Spot>#9;gL)#VuKod$x6NF{TSyX$ zzHZ`{qnhG$`J>Ag=(`zN3|b6dcKM*uMwNC}Sa6`q>+>ypCxR?hCM9`Re`$Ez#bz11 z)cGN1H|Y{UCD5L#M!b;+)D><^J@%Fmfk(6eF{9BLse`%TMnVBqq3z}Jda1w=<}eE? zo-2?1)3whGsC1i>2VneD0l~HDr_s-_Fn}yYK0eli4>IpgPrwR@RY1PkONw2>F%`mb zB8RI20gX+mol8e(s^g^6c1&ihj_{@R=ig(>%Wask3n%Q;+KE-D0EOht5|v6moTh}g69H`(adG~MDA zyG;ix_z-=Ltmb3a2bE$R&eWF<6XH})FO?I=iv|}4sO@Zjl6{}Coww+^t}W)|4K+Xg ziCjY~e>l18fB@AhJWY~;PVb`r;VFRc;drDnI%y}z_{dKc`Vat@#2pTS42?D}($h9( zG=2ZJOC-;UshKvlFWfjZ8 z+Jg#LB^hadROpMNmPBQwWNHhB8=rayh7tU)7K%*8hryR*7u(vo$MMypFQVM_Q(T{x zj|7|csd#rp7n-@b#XK)=5}fO%3Jq6yXDZdEW@lQxSvVkejHTSp+b2s*W@sQPkYa$& zl0(;hYVr64Nu1Nu5nG$B%*pzN7YQ5^S^Mj`Pa3j`QFqz<9&`~ufU0V-E~018?fo>B@2#=_JoN99sg=pLUO@2g2^INBGBamZ_Ty#vkY@wH-m z$YSwB-o=-pd{X zQD^)0Hoh;^%+B@p=UUk>;!J}MwduM3Ls5ytqT?6%d{n{e^>J687yqWtdt8?Ut3}yN z{~IdQ7D^|{19ei}vr~&tdnE4SqN(|lPIZ+8thq-2kK@9$&+uBQIQyOxc)}c|dMYV9 z={+~zGOUO4hV5TZI(YoECxyCdq^H_xMvvRmv0n8S!3#bM&V+iju45vv~CxqWtE6waYig{ zdo6h>o2+<~6kcxqSq&R%&IE1re74~WYZrsBTIz&ehytL|>N_slCo3+HZA390!mXU6 zuv+ARR+*yGFn3)Q&x(@HP{sWCEqR2-t6bbBfUlK<#byIm<}o|q zqx5^I`=2719ew9JEi2Dx$R!rPWPI7Mg03Vo1DZb|0X&ndlYo?^?ZauQ%VO-}IX1{FFRK78| zpkjP_C}%)|>2j$zmW;wo%T<>Y3a~Qz)TyrXGomjhHLUqqP!_lf5ah=zn%#wR3 z0Xlshx?0F!m*wh--I*J~UgHW=5v0Sv_y#0Ryd_-j8FZG|uy=VSY>|`oM;9GuA_q^J zqW`wr-?tDShZ??P4(_gGw+V}5B4Jd5`?@;+Au|-|$;hPIbn_yvBZK_-WFz=sR&NQq z2Y>UlW6<8Xv8Ry_Rf;UJ9P~@$ev5hu$WSxp+Ah)-{lzhRACAkosO&kvFA_+m{U{f@ zsF6{hh-i@o*beGnaRV~w{r+dKZpll-Tb53rmKUVy8N@D*l_? zXT~w;-a1EBdtY(by(oz~%~DY)fz>aR+~K<&oc5!gV&>&f!SrLbT|G;r!lJh&(vw-B4OHpC_^!JmqZ>6Ei49oh7d*3?>exCqZ+Sps;IWPdQAa!_uW> z3zP~b7LO7h8BZ=jfGL`K{eDzP zE>%5Uccs0<%sgJdd=@LZa|BXej{dlJKy<0Yul% zrYQ-Pe2Y&IG-+s%)N2Ytk8ps{6_*V4uxrqvB)z-i5>eDqHH|N!Pm4^hp1L^XEQR98 z$J5i9VwO!VAtyI`=!=GEU$;qN!X3^W@v6(wA?y~iMU%a55&QfiN^8?bJvB4!qp~}kMTIn9W$978sVO=>Vg8u#1C5%JSZg## zui4t-;tTX`CvT>7+4JY2qZuggYP+?X(2i*CLtx zzbG#5Pm=y=xz%$=n~y$3&o%A-U!Q^$n&JB3t)?E<>jCwgftl4Q`(_%Jedwd(LSPjvAAGR)U(pKPI)5`18xhE-io9-W|KZ1|qAE`AFwq;A(lY}LJ0 zAI+9!`@4UsLsM(Z^-Xg8IpIRJal9y&A9#shWm*hPtt%{@f^HUV9wqO(W09yyPI#(L zoJ9apfN3VSkkZbU6c?T!cELtkB_}$!neU2RX$>sP7b%8JdG}mRA@s)>sZBzPj)#05wjZTbr2n1$kH>rS2DU(A*!ZlDBDTq zzh;5B_q$uCB;HGvHd6^Gt)!$l_(0Q*33(F5#%2CF_NEN?Y^>QqRT`KpQkdYwVeWoC zHz;(;l)Tt5t4}0t4%3eE!z51~ib}aY7Q|jUU}y-WegKso9NsYTDi z0Yzq(+88ke({L~6IaO8N>$2oVQMP63=eF+lBE#$}b2SCs^qU(f+=`7O3znx7iG%&i zQH1p8s?FlTgu(eFfB7MPIgli6&84o5WSwZ*;zR((oRDVdvUt%S=R#282JHLHWTBSt zGZ(A8DQ7J-gE04+m1TE~A5M#BlaG3rbS!vj=iHP!tz^W|q`_$EV3yiww*w5-T|aQ? zQ(X3?qpA8R3-&F6KlGl7KhB5RC(*E&XB8Z~n!KjBQfV7IYJ$uZ>)OX%MZ46}&5*(N znZ23a;CUm-hA02Zj1&Wc;;sUf_L?Vc^4Pp4{7>ZX@*5KZ^C1D#%Z0q)%c__!TymnV zop6>2>Dou4sp2XWWtQ=;w;-R4WfD4lQGh9lpqBaaXewGtSgM|T<*p|oZo!s(8#`5$ zHM@Bh#LySa0|Yzl)g0nlMvIMA>Kzp(y6t&4ik@OczHeaBQFw5*;cXM?ZZBqSqE*)FPN$J3foxjj<( zQ=gbEarK4_1q2lL--=Lta2C^3Njt)pY!r83!Q7vOy@m7)rhY&3#wXKfC+)?xKk@4@ zzU_r}qHult$ZU4g$ObwZRnwySta2&3AzbF%8b7WZ2TlOU<^SK@2<4Dl2aIqP_RoL4 zhVxz$V&Bk;S*Or?{LdR2c9&kZODYXuK_LSZE9?8Unhj{`FHF>~sAmW^l(#*SCfU;0 z>d2iz(3{jI)!ivWJ88rHUh>?su`?u%L}f&oY2og97Hb|c-0Z^)WXYhrObetIN`<3J zGIWg;e}a{v#%oQbp-@{l+deCu;WX;0T{n4NYbR~`s;L^mjlDi*LfS{CEE-t->wUz= zR0IxnTY}Uac6EM&(rZU-j-}YcDqH#fxV#A)cARc0UTtW=#=o*$zTNwpEb>$b2L%W^ z6^f=gBJ?(l>Z=Kdy1cF=F>Mh^wa?Ad95_;BPk;ZUFu6 z$)q6of_qnpoKB&-?em2_ch;0ni+QED@0TNLZ7-wwoqz0SuVa+-@Kg)2B7c*;0v+xl z+N>lCK(tO)l^n!2okAw3sZ=7)%zViS*EhRyqH?8IPhN`3$2@;D=-T5_{F=}B(uw5t zO;l~f4%I7eo}WwL3k51 ziPFm4lCsQXZ}!x#?t2@6!Bpv8N_$LnPAdh7fOT9C?Bov$i!F`r1dD7uj3%M`Smr)4q4p5Dl__If*`D_PhBVbTrP#bN@FmYzb z`)O2#R>zTZ*V95VwUQ)j(|0J-Rrn$*2a-Z4Uo~1e3b(L7?b~i}kQrUE%gFmBg zHEDR-3AzG>i{`2h@e%?LJLBk&eBV*i))R1X@I(W-R-`>NLi3TZK)I5qS|UMC=5)$` zT<9w9?cPCqY+xb=mA?4e@2y|;VVyei{Ca?`lc$~)@{oWW!HtTJ9z$o$v-DNwqqQtD zZ|L!iR@|{zYntvzNRtP`qa7ITuO#;M$48QbUKhk8Z$7tKEr%rKe^@A(Vu&l+-G-GD z1kqXyeftxsB&wej&<`rB!vN^FKzwr8r|p*S-~HlNw~4n(HZSybsl zR!k7U8PDcCrPF=7A3Ggv*qRv~1+Ay<--q`8|nkbgz@_cYHx`+8J%#!qiDx^4%z=7D^p|H#HfH z{T-rkJhgyFvptC@;Pvp)aj66jmab#B0M@2yT{iPV$L=c+lU2^g`tWpPxnYfCQc@eg z&m_|+YfbRS450$4u-WFanemG-+GR{QuZny~V9vc?M?-cM>qo#fE&PqkeX7=v zdqY4=smY}%13=|x4>&K1io7nU;+5{z8T=o9Pu1l0C7e;(t4G6wQ@n5_?w-W_utUKB zDp{&-KD3b1QjS;hqi?BhKsS6z`4;9Ydjq=x2W$h+fFKpqXgvLNhfJ8!ZdCG8-Qar= z>iHZiz-zkQ_6g(C2utgwDt5GD55mBZR11tcR|ZA22Cho;qFR06GRg(3^UHa*8KLXM z#GpHcE@IV7>xpPrWVnx;(azJS+L#t0*3BzoZEqQrE{6L%7}T^t$}Nc`++{YQ!~IX1_c zsyk{7Z&Ykp&e%oUS@PlWo$zzqu-6A84y``KL<;%6LC!Q#+YaK?^<<%JD$A*CB@&Lj z;a@M~{OcjQ>oy_HE_j;d?h8S`bEWQWyC*N9+=UyHsD;ygQ3h2BngR(4Kb>U`MlUN%daLRZ>4 z@zs!tt`89#S7XcoGA})isvt#Y$7pWGcUmQNtrUfbwS~`yO5;w!$V#1?0$`o@%cwd7 zda;dG3*1=UZmHivad=u)EYhNw*mTh(UXKp`t^=bB9QG(6q$@d}I$g%HFaMnGa=7X6FsC(-)L)Tqw|~Bj=#}J} zJ)<^F^u;iV;tzqUHsq2BD1Ot8o=F<{y&vPdBfPO`j%1$136oYRBJpiZy;6 zP)nNMjx65`B}KuNbeW8!jx1a_0K6YOnov@JZm2xbwE7|Y{_AZ7UuRQeS5b7yFSP)= z75t!46%Z57mUGr!f+mq(+Km!$To(FL@lrK*up6uK9!>3vx#)lyjyuD;QFOOYqQ>1C&hshp?_$X8M~(4P&N;|~P41+N4J z+Zmirb<{+j%wb2&QS%h*E7PpYMrlxgi$cW7Nk`3b!j4w5 zo~75COpvCUURUu#Y>Ymz*XxkYK1R|3oDMta^nbmG^KU5TK1CtuUpkbkfG14F!!99I z`tTAPq+$|q4AUdvwUE0@}beCPgXLVcdN-w)j!Tn>4 zvC(i!S=}vI6bm#WV;w_dQwVn*vZ(Wt3z(3@HHqlNI~>H3I}g=Zw&@D7pQ^++Y2!6y zFqTAun6qL?E{kumz?Wat$3{{O`xNN5U8%+v0@|yj4lS&xUXEYhf%w47>)Y#pT88t0 zHuFGr*y+Um07Lrma50el1X9bCK_M-QS#Vs!t!)8sFUC;pwhQb6xtOfCCaL~*DXP#D zMjAhr0^M1oDyZLAitSLbTOwUZlzf+lUK0B$67%aY9*solbc;Y$)n)Wl39E*Or9zXX zfF=6DOw!@MhCB!-?QvQ%!_{)Hnw2QAUMRk3DQ)GC%2*qggO%M`FJjW5=Wr>YK%v42 zx}xn-`BV(b;iiaEnrh>Ql`UUDEOD0f-VcD*L}i)X`RxTAZ8*?Y)gMRqsy+fXG2)yU z23c(qremg|%&C}Fvf(&M252Q`_s?J*;*41jg9vq6^q5d_Z1`RJwCG$b6WyS5mI7Z^ zTQigka-Y`Co?6{Xv~eQg6Kvk;p3G8pK(;78a8@eMG84V)MQwhB57enBePmihRmIMw z&Ax6Fiz=4craEv)8C5RduSexfw^_ zPygP5y`ai!z{XO2`ggfr4O;abz5<>cTuIN1$>h4Gu#wp%~ zw3XYjf;b0a!T`2cx|Le-RE(o2LR4y8>Z5Ug0om5B#nGFtt+ceo;c20Hjylp zsk_B6Z#cTF@b|iZKdH;@fkateMVPnya|lOI8VDY0&1AN26FvQI-?m`vkVv%sEaxbX zmyo(BXw&={%vXSTqLfj6$)%Cu{=L?EFk?=7xCjrgXIA(q#Br<5sG)9|X|UA$_+tdW zN>@<3c^(`$UE8tU7TWPRe4JX8jZ5kQE|e~ma*8YVm>Ht+Yc=b-95O4B6pHeNKIF06 zNH!SU$GbjAIi`}(mQ4eP!i&*ukuP8`GR}rH5)Okl*=}nl0jHoqML^*si50?MtU4RE z{$`8XtUkI#DTJs`1t+2&H)iQOo35435+|mfX@}8SNGerjIY!hkl}zJTA&W z-4aN0o72Tbl>?ke$RTxvQ&;)EG%ryBjR#p;GiIc)b-|}#i_izPlGktR zzHx6jqsmfqwCF7<$<_I{#R-<4yzJNU5cQ7YeEDU$QIrWNPj{gjA@a)3k*e(5FlO~{ zRIgo4CRW$+Qp`GUvP&^7Icd+?8gaYEl3m%*jMBsNb%mh>=yA=hsG)URxZQ}1YXAQW zw^~<04%G~lE7Ye+io1vqt8Uj~PqTC8!<1L5`f<#qjKM>@x-wTmyeIi`M$xo9DQ||^NQ20k=inBa)@-KTu5bTyp+Zxa-N$2~ z_z@EIQx5!;w*Laz2s_6XBP@b~+QJ{yolX)x@fA%3Z7IFOiM&%ueI9@PmqNEpYFjmr z6rbj&YiIex!FRm*c!A>nj;>IeS}bEoib{O$r(5Ur7nI){`MEJb6e{44%m;4YdoP*X z)%$I<|8f#yC}*_poOLbXMJTmo)GH!y~`-L{bTspdf!y-pZ}cN`Q87aHA0W9-;1~UpI_-ePy4!!@8H#- zmyUgf(?Q1D|KCK{)G4a zG247~KV84H(b(MA*V#ZfAbarrOLZOBw*!fP0u1|HopiAN=h!LS*m^%wrD?`*W7#`z zQRkY{BMY(Hk^DV$qHJ?Rx(NbyIR3h4>qkHHu)Mu*xkKu+Vve<>w0!i@_3b1A^49)y zE??hv53hHHTT(mI7N>9{4^Gv&-PbE*FA%9(PeT6CiT6B_^ChJO*~H5zrRm=y*m)=Ck5920kUFF)el*D=sNqS zi|#-*^uGE?BnFQbj9km{^9m$Af1|y6dM*ARCUnnfa^kO`|K8b~g;`&D#`eCiM(4u! zwbnh7HT(ejKBE&`596X3$!;&DWXLFhp_KEwlYm6B{loL5=a=*LJiDj$VVhKCw)H(@ zSY50Bo`Y>aG{C2S^4BxVPg?Z3@%m99yhT~X`z|gb=eP? z@V{-NV@94WR9bxun(Rg@@wXJJj`AOVJ5-wA4$9xz_dlEP_m|3kb#XkrxFgQ``Js@& z-_@9ZdKoXB`*-%$>f3sMPDb7J_b&c}*>Gd^cOw=9_4+;S#zoEW^|AWD2TpW|mU`uc zlo>1OuNHciP-raXd>$^Q!1)w(QJ)sj-G+9+&SSfO!-IhXxk`q(GNQaPc#@?a)})G+ zX^rAkpqj)Y+`uHAbb$V(SAgKOYy9@r!I>)++m)+L=QG#0wZ%kmbD^lz9dQ?wtm(5@ z-kS@a%?9X8ii_uA^IH9w9lwxvVg2s+z9pZyhkpM_RkT9`U4xH&NA(eNj*V#fNlTi( z@mWStmKr#^I|gd1x-@C(VTWUk6WH$@(vr2%2(%H|5(3Hr(^z7n#? z;cos!fgZA~=-(f|wdub<({7_=Xh+diOqG6Glv$og%B15iuqZbpRsPeg-*2T6V;0#Yfi_KfU0&@)&C?qZ#L5** z#gZLtoGH;ClEJz}R*+%}+(sL0EF#XV%gGnk7BJT;Xi)p+x9BlZj*^D@a}!o8;941u zl607P4ML&2Y>+z+>_yyC2N}g7Y)7u12NgHWE0wd*sfI49i^e5QvW&=W)d)RsfM|ps z!R&n_G3txMuB%)#QW9MgTklwFVq1#3qc_W#gkP8{`_2pO2wA=UL^h_gn}=Lac$i@|5nhc|PNo>j4;!@4$Rd&C&m=*iPA zk9Rr(OT5sOg7SD`^j+>V3!OpgQiPluUbd78%e_#}DfWUAV7XX}x?M+b>`LyOc zya&F>%3@vARwFd{+v#^H%G%Pu2$hCbBXr40HHN=#+TX8F<|C}IB1!lq{FZf&SKEbK zf1w=maktN6$|>(o)gBrhy7?;sSY{LP8$x5hP^fiEuE^ojE(&|)`imGuCc}SSutqnC2qD!+%;jRv z)R{swg^ph`dZ=~!4kS9sgD%+CmX>x0vP}?54fm+BySO<6N53@{ty(RM5qVc_Om#On z$LKDv`l#{6v2WfYASG(XiO8p8xOIw&om9eHj#SbFq-x(lRgl!IMEo3W@tnm&Hb0Ix z2V0}qRzqzN#S2m5BEd#oc8FOQwJ)_f-TO}~uF`z-e%AlHv-v1V+4^ZDmy2?0b7pq9 z!NUG_^VW2Cv%R8`TP^)IJr`6vs`~$nWJ%UH+7;)=H1Cd=1bj*g%NZ%wP0{msOQNIcG776M z7aaTcQgJZLHxB=~L&I8}p4W#ZiqcsqQINvhuAwWeZG=;Q`29ts6Qcb6O`J|k3h3EV zj%nJ@Od`YMV%XhIEkt0D>4}&+jX}+2waVtn`l5t zV4Mscc<@w?b!@y?r%kRtFta1_EAkvD@bUfohX#A?BxD+m@sX`R#^GC`4ZB|%EP$j8 zcIO7up3_AwS1%geaOPq*q}^fvYw-UsFxH?LYV&%0%hI>IYqyAL@<^HV7U&nWKK3tR zRG`ciHF0p$nOf{F)v1uy1Z5s_2+BqL{?Mc=fEi3}?FGuMaaNlj_p)e&3nJ3Vob|F= zr_S`j!(y|DRytte(I>p7otoq_f<5jb-Gm&~rh)ExYO{GG{zxUyjf;zHyl9=It`PJ1@{b#WwWa_NQaEXMNs|?VPKTa@N_V#i zV2GB{+{1IEEA8Cry>{UbsodrM>vj52NR2#q7jJa8uWA?yaurADaiOQvaBQ!;e9IW3 z_Fd&);~p)YHdbr$u-RsHfh-NdT4o?-hnbGcOQo-j1K*XIK3=xAKF=mWgw_}77*2Q1 zcDwRr64omr+!)qFQC>jTHgU0200_HqYHyKMlznoBX+On=x9+4fkL+ZlAR)`QmmBTP zC$6RPUVO3w8WTE#z`|CO>}gZND(L+kT60WoIMD~N8Vc4pu-clzESo{4iIX?*vNJfI z3*50k_0wYQ5@h_s+#hal0nhEIDQp|A>bTSAWoxGX;JfVYbl@(_?-jpMREw6OLy6ju zHD#*Cz;sh)?4tGU&RgL5*DL)9PjEsY5B}c2ULDP*g&#jFq#Lp?bM7=4(_zBugM|+L zc@KN3IRX_SzbIEKxB!A#wyB@psfGZpAsHB}TgULW zo~un`$F!HR=41$`-Xf!#N!g zoPIs1a7pX8N|r9(KgkqxQSoZ2wkmjve$}z3BF&Fyo70afUPecoWHT3oaEhbmOm=y{w4W;XzefB248cE%TB!OA zdu3CyD(DFfRRJ$7IKa{xngzkltuqs^@-&HqvPM z?9mZ(hWfI4LU|OUNqCI5lw2oUOJw->4@C0L`m|-ccC#ZiCZ*L)o8;jR#X6v5kgCH{ ziFEI8f=U&vF*IslQIE_dn*C?gyP!T1k?7Ua{p6dp`zz_`SML6f1S^rPXh#=4!7U`z zaChMygXlrGt#fKD3y6T*&Yaf~WG?_WK*+ys$`2t}grlyPlLOq%!S7U0B6$W*uOkt` z?Tqt2Ok0!td|6HGrZ8WL?PPwrH3j!QEnE&1os;KdI4fZ~UZQRR&<-~)OWyRi4V@3d zLKv>|(?(B+uhSe4VCPVgDKeIcX#riDf>)j?<2CQ?{Y4 zPB9K#GYQWba(-}^+UdLVy=XBL36dvf9qr-dx8g3c#;EnuTa%!sM9+mlg2jDW<9)Kr`H&Sm9KlBxrtQC#i-i zuOfiXxWY}^9XY^7SpC@`I`HFWs74NTooSz0yg>5xK&JfyoddpRRd*7-NG_hHYy_fm zDLD->WLJX-R_-CLe*ydS%W5(CmzDhtao~O%X#f2B&u_a83MJW|-Sl);985LJp&TN$ z=Ll%HC;B5ZD>#?GNg(pmhNz}*nHs@8ReE9X4~s#6)7%~}x2wTtDru5>)1?MM0wy{} zo!JB}55I4RX4>-6w80;2%PLMKTGsc|;H5@n-;0x|C)c^N%Q`ix>w>@+Z}qPabO(zX zRm4b%X?O8(t)O#Tk|F_;;P8(MN zcRG~rGJIDEoo4@s33=S(H1J^~C1(03Au( zT?dDxS@U%mSGOlnSLsC-$N2>z)e{?z*8y|dvfb*T6p2?z+0N>>81aVc%bVGGGvtPW_3+j=z^L?lP_OD zArTL||AZ@%$-OjprJSD4)eihcN2<0t{-fn$wLVHp5xHL$O>ANJ*boqW%#fL^%e5XS z+DT^lzQ6*9P!1u!DNHeuviGNR%SF@%$#rKaQ(?FKkg}4UqMZqWY3T%S9iEFQ=$1s2 zxC79(G_@?r@_cTy^F{Nt6!CxYd0ARIM$KXN8i7t za-^0N6|h$N-_oA;cZp!J!_jcY@qyd2rpNi1-!323u2F7J6#O#QCu_F=R45;dv0U9} zOY99eODY-X==g5e428;9KGJMF?k+$I8E^rY{Ha3CTRu&2aB$Js>FFY4m*N$0U{fdo za(Tsx9r8{7GS&Y|-%!|lpt2wU81XA$>Zi9yeATPWSB1IYv4l-~v$f68w*9|jZ<{RZ z-Vcz2g79ttfa={{oEf#bcBl>yTI)-`O(>I!aPQIGcQbh_HzJrZDxgY!MMGrMU7;mDi(F#y_rADsAhYvh z38q>pkd!|bPQ@$&{$M}qLq#7v%up<85#Qt9RBq@isK_nEcEOOx<>}cMu=JsQLnHXY z&bm{jj1e9mJmsxQ@dknf_)sT=mklMx8FMIU(%bAOJ_G#n+u@7vEx2Qy)~;& z+s=c5g1Mz3{0%WT+b86_fiZ-xLp;SP)$~qwUco-`Qhg!$pj@O1UL23`MisT#+DBSa z4Lxw{j#M+OiCTG>IK-G&5DfDVRM8O~0_PmUl>%kTUV{qVa7bw~?rIMHOhYJAoL5zt zH!L2x*-ayQN;^=A9j1~s7_BImR<~%?_5%v5u;F3l(hqiLel*#6X?kY@49;Y@xr{Vm z6O0yfTWU-e!q*Q|yl0Z9MG9VICI+RPN80?qv}Bccad*w` z_4VXY#najJMT!^&^teX+a=FVGL)tI`C~uZ@*Jro09ACLeJ|tvdr%{ioepedYmap|8 zo+ji=Uw%6Lotj;hz5a(yyUM_tL_p}ufU&t>;y(sDHu3UEMmhHh;eMl&Gb5o)@ObDS z<-i$>vs3=+IqFq&Y~+){z73%Z4Tqi>B4G5otRsEC#-f;^i35T=Nwq7~J~4P8Ptq*{ z>z*WMO?u=gpVSmdt}4Z%Iqg}aQ(}J}3CY&4HfA$+F14q1QzM%~o~rX=setBTAch%D z!yRGGYC(K%(H$}Lb`5ND;$11GmzVk|?twLp+~S!|RjLYUhQB~Wqa&9g>$xXPLLkaB zG)ba;6M}cDW2gfQEx0J3w}mA{RnDW{)1O2s+sYD%fXKh@^Z zXedO3EO++q$o1D_D`MF@4V=GQ4AJx0{8{^5%=$v3gDj>M0)#<8oTMol4%^6-h>sU^ ziIKM(hYAdnz}crQ-mqk_!MjN_2iXwbtqspW_KDMZX@v>Ap9t#fui*iHGxn1qV%14}^CalN95}ueo8_WQr${WL$>!QuT-2iJZtn;? zGz+h%v3b*!Z>IJvzjW>HjY7qBSP8O#>ke6G_384`vj>)sS_4Jl>u`1Eq(m(X7-&mVg*d?w{Q{K> zV-Cv^qj=pi$}&s=HR_rKmKb89Z;`K`f&gz{c+%cOUjBlVwyxm6wWuB6`%7Jg<|J40 zsOPp3?|wo>5y$N@TCiP$X?cAE#{yq?(Cyn&v~}3Kw&2=5;r=`o;L3+ec}%{S*}F1H zT8GU)F6uLfChL_FY?3Br#&f{{6$;* zoc0DB!wHX$z7NlVek)D=Vx-jzs57~%Dn3xbvVRPjohE6|e(1W(rUTv$B8yLGabzmz zYIaf6JJ##MWr=t~6$yaxNwiTO@(U9rNb{F*0;J#-hRL*Kp`v))kMy?F$GKC0Is0_(E znqrdV#YV8#nzhvz_3Vw&60H6w74I&N7k%58j+Om#?o^~+`%fO<6T^qt5AP#Xj%k99 z1U9XV&jH4E_ts}G168F3XBA1t=JtGkQv0Q6kBvEk3N;&aVDQ0d@8BFbtC@IybM2c{ zcj1<<(%AwFWK4x}=UlFroCgvM#0z z6A2@=kZ=zWYv`qHoz(|bZfyyIRvQeZQvu~tbIdO7*8z`NQ?dFOs-%@jLmFMxPi!0( zcVsG+NLw`{HFX`sYx|dgHMyN@gUj zJ;{B*FSPG;wYKew9xK(2veIitFMp}RN%8;UVU;_{a{#@g7=-o7#bY0umEgV}sVERY zOIAZGxKnL2w^;D)SN0OEUGuq4O(;(T&jUI~srX}(d9Yz^?W8tfH z6#3Zc(_4bZ$7^`fKVX6~J`kRCBTM3%Ot= zI=UP+y*LT|YwBR)5}&#+bq3z*UEZRFUYaY`{J1blJ~t&dys~=;fXbqt6)ZtVs){CB zdvxN}M)BRS?d79|)N;F8#=Z^4d#Ok|*7uOlvuJEoALEmSis`7(aG9)&#qCs~a33Ik zZa*nib1z@UN7oVAvTS$4WQPx|A6?qJaZwc+SFzN7JQ74PfcEo5ib8TekDq6;axXT- ze+_wH<{kC4m>f^tW^hErf(F#c?N&m+4H}g;T!7Qc5Z2&aQ?_uKdqC}(!h$VyXIji@ zak^oK+f(YtBMWkiWebYb4hz$@2bBffwmG{t&D7O6Ndm?G@FhyFi)|kVw+emsh-GIW z2wu(Iy`k4)UqVx~_Eq%~JmIOUCriXr+yD*YCpr{{TR_++R0?kQEDuxPX_i_$9&Jar z@P=4gi%gJceVfs#w?IuEk#c(sxih$HL{vicK5pxwDSlx?jk9E}m?Kd|gR87^g4}(_ z<6%@)h<5O~iNL4v^wS7IIicn!Ldhu(Rot?@u>f_E9T`j8%GHWzxe*$0ei7WZmw&e- zU=`o3*c(9_zkXP9-hAf#Ys3Q|-y@Tx@&F(;&u{o8V3B(h{Px2Rjx^C2Nfpd)XEZ8E zYOSh@;6J!2+eF5>JmGyI%PQ>X#5@4&@%IX+1=3Zd+?vZZ=TdpdMx84a8Xj?e#tw5r z^|w~xI%*d1TgK;#Y_zVr>K_C*l}0YvL>Gj%?)oR6f(j8! zrYvIpEohQ(V}%v9=S^u~Mg`X= z-=YG>JUQ(?k|s%cIGqd@(q#IUWw{8-;@++ub;l~F7{0nIT%Z>?OZxBK3C~)8!aK!P zY2lZ5?u(Z;W^z1`;d%0qYT=C30 zk>W`ZbUl73O9wQ1G(v~tExzc;f7J0n^njlB{~sN>l+ms6?NDc9*{F)W*m)3k1O;n; zTp1j0jc1Yb{M0%Agx<}l-rwP17xum9S28s?8#T{N=PpFJ6mKNYE3n)z1E<(s5B7KC zB2Oqi4tuGbG$$U=s%y!k2NlH1vsTg7syT#V&j9gxoBX$FH|D8((pbsL12YhxZV~pW$Ti?biN*C9Cki&WtY7b%Y4leoP|!UO%>nvSNn|D)|V^ z(YAbsRyvt4ea|=_oJJ3MC-8xBhmz#ZpSd!A84AJP+}t`ZJOmq2`(I+bM!L5}5~TZ_;p<71Z- zXM0BT!*z?3;s;m;T8YI-!&6@0MRU-H&;V53U4gI9lI$Fw>{m*A+Q+k6cn18A2=;~$ zl0E+-(+%sCAVF-2w=1fGW!cN2e2I<1=%=*`2^Y(JrYq=iPlEX8@{Vgee0DL+NvuI> zMkG{0t7+7<**F|&HBdUlN3|z7;AL zjh;#Np$#mUN&+&)9srcE(HXFiW1>w};>U9d<)U@eNYZ;P5M-Mw3bK`)rf{Tp^$??c zbEE+v5N1+??Rt=Qe)Y|CxmQg|Ly$r4#SZ8^^fXD^qcvy)6th;eTZxYpy3JI0K&>)N z(VkB?lQm`vw>v{4v9#KDP)3+;h$YOG%yS-@XkJv*E&MGwYV?l5#g*dG1G22_I?$Mk zB&Gv#y8#^x0Fyx@${XcRvvCAJwgr>0+;ewsp+aL{nxG*!%Ax+r+G0-mBBXdzC zjqVoJn*To+ywI2W@Ohci2`oLXho8tVsB8A|azHM0qh3a1dkpI4 z{Otv4b9w5>k8}6_enILwC}2^>o*seE;W8__R&Am8sGc#L^Q>|5;Tjnk`Bq|meOLFJ6ujx$8OCQ&3lc&#UX%>WVghoP#M<1>ir>9ZtAO{^@X@k>R zxMq2B8^;2=#HnR!fz%}Yqit^MIA@|S(ps4MsYa-fi;C4EUn=3S2W_rk-gFc5IVV*q z-BdsGl}N`l7zY()KEW1=@>4+AO-;#!FliNDzx@{0;Z{>8!Er`$EKsG<)juQU=MpA$ zlzJWGHOehJQz?LxO8Gb~_CnS-mAwlx+MsuWI5xL|UZGrclgq_br=eaAVb2xPrcJVH zO=#|V_&-PX+^X2ybr`p==mHG1JZ&u)j?+zSo?xYZvMd{a!7kLb4@X>l&uVj_Vqf~3 z@XNor0b$S)Uf=z__R7qYC2|Z>!KZVSemzC&{kN%r+LiR4zAH1YR?WhN!_Gd;1^E3W zmDPQGpBFJ?cdht21LGmIBNmG?=Yfp7F$Loj3wqXm3NI&Hx8igGurs0rSq8lRJs?|H`*3i9;@XGXIRrH!|fXYR_t=(mx^VIM_ymPQKF zjO8KWkdu$Rk5dN~7rV}9CdR8-7>Huz`PyF(%#3<@nLN;UBF)2Oa<|$qAAiCAW4HN2 z7Jh&NIssOmY@n%#ZD1^?=q{iBpc`i|DYZnIeiwh8Ms+o)}a}TY5Lg-PxO9 z8cp{eDG=bJzh16R;h8{TFk39?e1MVj^%BL!sas^gil|7FT+#1vsg+GDoVYOFtc)ZE zap$*xhtj9Xi-ecu*{giB36JhGji*vK@B}uhHfhgzL^9k&#(s2fKm|T{ktF|+P}s)(9FF!nM@Gy7Nb0@FyF>_*`;dckr%Z$+)$^jRt_wSlr$n%DG=+M#CSQq zCnv3yY6bjiVBenB+8=}ySZ3j#T(z1aDAoa}8u_3y!1zO6uLc>x#M<#HSKG~#24bga ziXZ23>}fWXoJW#Eh6})CjjE{2_VZaDNE9na+l+oc;cTIPY6=+oM7Fx2sqNf@O_bx< z?Bt}DP%NvT8~9DJc5ApyprGqchRR-pi}!-c5S?@b+Oufsh-x=oPkBgcyS?vRL|T6;h7eu$UW9#~=k z7mJ^;AL`G)#yHwDUiAKS$3MYYV*FI1YQhJZtRcRhZ)w}3KEzCjXk34 z7fQR_W_k0QeF?{dn(DC}C}tnAZhWv=oYSu7yib3sK$QDnaSz*KRe8wz!~i(rr06xx z(7CQHmz(ouES)lj$0nlUQQNRAnA5WLe+_wT&;epEsWyxgoLLBVapL&4NWSt|DCQHH zS^s_Xn&_CCvisvOXk#xq`P??;!aF#8U^o8_&hEvutp<`ub{ z-ntk!nE8d95sE-8AGQq&SvwWK>BCOxi*`4k!x-BNP@e2g<1p|*tfs$IyJJW_Q$2q3 zc_(G$Ct=Z3l@Xj)+ySP;kSzjh^s{C$&uKN}L*uBpD<1u66Oa|}fC}yrKf_jQ6jxQ7 z`-v>^#yd+DlgdX_Sr_MEHHEiPEmI`jA%pdYELu>fGli+%RYHhv5w|j%Nr7OxK7ot) zqZJQ&&oU0lRh!%g`!I23TJcL&syHBBXQFJAE0>YA-9!PQ))l^}`a?i6#iy-vJT zy6Z@ibnRutB4eQYH|`;qe_UT@G}X;)yq}i<*;n0&BR7XO=LE-ZHykR2a*amDmn2mYzZzoDg=*yJ17L;yKP#l%DjZBho=lc!M? zbILnOv$^<$ncbDFZO)EXm|t$iJ?0{Rbo6!cb^%c@hbqOPfn-SPyNWdYA$6NJIhk|C zS)@lh0I4g|^cK@xXC$(A%n69Bis^3haqFPB9p-}6Dgw8H@_o^=s6A&ga1@K%*E&f= zwJ!`#R+Yc!)6a{NaH006nOCh0ssJ2a*56mIxy#AnyNUx)<8~z%>tW5-;l^Z_Mm_jP*NoDu zDuKZty~-!|hC|YnSqVi@-zxSf_~@N9zs0piyP|SkLrFtYo%T(Y&vdhhl9*=0a&3?L zP$7YslsFqW$Ar$*yRrIS(5skOn0vtHvYkV2sLU4sGcA^>`LUK~xfFK|(UT3JQ?>Ot z6~Y!van|Z=mu)}o2x{I-efD+PeGS(_h6hbhU~MAowi!%=<5+UY=}=FiP@w$KsW`7$6uORN8V9#5Ybu`V_Hj?xLr>*U@~Ap{^?E+>Z7! z$nmz;Xr|nB_>Z(wkt>MCJU)JJ#XW)5*w;*JNKL?Gt~;44T|5y9TQytlTXLy3gOjx@M$Og~ zhj6I^Wf%EzF%8H-8#v`?S6QtQ-H#+1K z(rPwta-8R1w*C>?$IOBP5PNxiJcb1cX)A>3VZ|5!VOO3!P@MSx81zs-_n!{%kMVR* zGyP#(N|aC&0+r6e18T`>bh=ze%|iW1CXTjkUHs$5^|j%UjTnm%a3 z7iTS%*%MLeX>J;jnhtY%Jx_wqj+lL6(DrnnF#SFLLefO~^34x{PFIMZQ-(M1B)VoY zoL0IYj*rnZI1ZDaNa=TMgewMI?Gyj+{Oe*FB0uHHGvpX#3&pOLWxMdfX~w5o_xGsD z3=ZMi9n?PlxNPvQcu~!jUMs#FHYjc*t!q<_yS7U%1x~ff{goniDS6Pdkaxqxe0+%j zTf+P>(gpGbwFDBaAkhGBhgoBbUaS}upqxIOU6E{{rR`aQiZg(JXO@Ld08*pv1YF% zYD6WE1FRq~;g|DFHx=fX)hYGS==Horv zpch@P{7|?|dC4xt{tmzNnBbYyEF>6VqLtsOtDWzwl_R~mXQHc54+*h^AKp$`GWNR` zj*6!m@u?*U#Pa#-4}gF8EcBZwR>X7Qz99u57hDa z&I3=1pEh>xJb)QtxzF;2JmiF_6}qW_yDsF`g%UTq1GH<*-B3{Q7PZk+MX3N2E^sZmj7SAp0i_lY z+yd_}uKZ)W-GVVwOOGzYt*8^6Rne<7T8hpAz~4A34#B3wYy}d`N}QzfQej&MnsY8O zjb3P1R0PpE{_?n-`WKggVwwug-%a>1+me89k(UUu8s>Kq{I%y=swhlHBpTaBmK;Ie zsJYuXJTG(unrX%{$=MgDPjBoI_$}4Lf&Xx7HZ@yn0{z^9Ziur|OL(IIzTbE~cbt*q ztl)@hL^j5LT5ETl!P~%j=2FGAVS=iFy~7h2x#U@M1JiYi$48dPES>G!U2x;h zM9fDoGcwIMiNU5exv$i%I6s?AUK#zkC(ySKb@AS0Le?FdR4|2fynbG3)os17U3XC(#fQtF40I;7w+& z<#>x2RBqtDhP;hj>lyp!*D#-Z|0B8l&rj}%`joV&1y?P~3`1o~IjFmdws1j6fe_*; zP&fPkr_Pb&d$}=`VnGsddNPb@7k!;q0-g!muH5|w8pSJTXLa|x?MC11zdG}Y&*86X z-=HVlmQzf%Z)m1kUd!}r>}N7}w9*FDDz$;1iIFM$r4637$q(}HCIMv164Dgc;jZnM z-X@jKD%_~Zbo~y(4uvJ`$`)hW}j zF6dNe%S&a&LKkf;C-m3$qabKo zZ50c0JQ&U+^$bZtR)4}nWIoy?kRZ~(rCm^SaM9MAQZJyV`>q~Kh(1Mo3c!;tL?*5c z8bw^rN7`W%zP__T^8k4a?%-LZGAJ!zS#t*$4)ZP~K}^KRq?A1MF4wqaau!=)5P7C! zm5my&la=FOPcpa?Dak8I&?0#6K-%4X0KsFG)KK1?Q=}lWD*=-#FQHl9JC#uwLvEFP z%)-|gCRe5k!b zd8Y8?VDEy)pWOr&#FTa(=@)@ByZIdCy`p}*`Jj)6nCtgwk0`H==B8Qqh~A^!cKhmQ zHi2!^Ch|IzJBCG$@;)xe*};cjsbFd^J(O~I+{PsP@^@4hymYx-P72{iHitQ-@7QQ6 zUz3<#dvsax$FyVUlvv;0&}zvcPsAr;>0g9^Rkm$_TvG5_S;JuADu=EkMG|U65|EE1 zB}5;(PE6v6DDE8_QvD3byRL5-2c-k^*Sy>imq>2+B{{Dj%DEzz{WPa413{di_;h`Y zDf3CGK!qSy{0f^j0>~r}jJxEKGaxotlSuLAa;LN5cHUHg;i1Q+7nC3yz(^7aR(wJ6PEq)0LA<4b;W=F9bMD;WJBeg)Y9ZC+VjZ?WnzyQ*_(WAC``mRZ$8+8a$qJ?|FD-jNv@;% z!;Vd&lUMr(izHYR9Y#*uL9-`9vZ8`?869(!rt7wAs7kON{7W%`13U!cvK%(lBCKYzspeg0Tj#k zELfQ_)5-(x-L4*T5bgz6;UKKX$G>#q~sR(B>xM8f3a zs(11T=va4|Qdp|pYt}vZC1jE zJ|3J47PC_ThU?1Yr<-_7SLF3E#Y}^6*(J+WEBMXbW}S6^U!`qGd8@^I2+&pnXV*XA z_{S-+%m%H%x?W<_j!Wt()!cxvU>Oep-;BYukC)VS(9|R#fHId5!mHynLZos>=lBdn zTGz57*y#*$thCQavb2etAJ88d-9(1yw7C>V(2>A}U<(j(o$UwO98wPJ7t;jgk;|iSGqg zdQ`>f-m8f1lX#yzH;3w_l}LQvk$6-8tfgjrMJ+zt2N2an!S0}2-!SQEG159#e86V; zi(pnz(3tikCtY# zBeZe)u1j&tpCacIdgTP|aE}~Yn}xEXAH|@lt>Y10H6h|=TTgN1*wIK-3ks3`Y@$iR zP^Li<>SXWLNnP*Zm$h75HRgH^Dx6KC48_Xzz0uitR+wiaUCI!%aEL~jcAn4UKeokY zIxcqeMrpGEk&Xn?3$!y#V>?0<`hs$^dAalZ$4?f#wtYnPe%WBvKs`p+g>;=NYBKl1 z#~2f4-sk)TBV@_HbBByiFezSFHB6UFV(5FCT!f ztzbR%r86sa{9dc#Ht~ams})oE&+pv>I{$+HS8Y5J8|7aMZXJE5SSYqWy~?loTkNLS z@iR?-k#_ykcJ`Qo(MK2h@r_YU@cMNv^2T<)ixrEAy&F6SEu=R4dIz8xdSBnG9qqV& z?u)RT6O}u^&a{Bc&y>eoAt&JT{+}6H&&XW*{XfBZW?MzD&@yGop^-UCf8Q&p?Qc!y z>+bLjPyZd7V%wIVii}Eu{Sn3Fqb1pAr+AACoJIQ{TT-K0SJXhfm{-5v>s=gztq|Jwqv6!K%F2$l496Y6e91M}>ba zm$;!L+oFW>z3KcDtUch#j^=ATq*;6Zlq-RoDv#U=s=f(_W9$CvQ;+i-L;<{>+ed}! zk_XHgsx+yd(te+f9CS+U^=J^Esh>>YZWbmv=dPKd=>QTcx~P^r@uNlEDIy@nkBjvE z9`6xio3I;+APqZ=8sYM!K|)Sj-DyjYn!YT&C~*I!!o<8;DvC(A_hXlhZ8SBYyYwOnV6qx(u=dEBDI{!7+_uQ_VE^B zWt96)^Yg?4UKSo&%*ND#d_pc&OsL0Upk}s7$yWK%Jd=;!3zWu+DdE`xp_&|GfkZy& zUa`w>b|z67BF)6&PwKO*?cS5owQoTY@e6i}vDJmGalEl?N10-}w(X6okjcSv=>|~o zZS3fkU4kwtV{NI=y+?eiLSB1pBvq{j|9WZpn?pp=nJBZH5RWqp^Od5YcNlb|fs{|+nYYg0wnf*r7I(X*I-6`5V)CzR(SW4}w zBD0H)Tb2R@zZkK+*!A^5eSXGRgcRCUtiX*PA!4_!Q((euVwYY`}pX_LAx{b?C4s3kyXca7eep_*MYQB5J;;@(vONtPpg0jyuclq_ za^dW>S&+(tb_klr0`AS^9Dm|w1oP(JONx4|&ySm@EAhP246-zw3T2q>(ss4rLjnTv zfPir{Q)P>%nrq#zHfn+{2X8X+0+Q?mTo}_MGsM|D%`w|$1A=h9c)Fm{GFrDZDO#vR zj(4)*er;_<#zsQIUpsngpYNP=M3%t9Ln zj@txU;6w9|(U$+&Nvvd>QQoymm~`zp#8rhH^3aDY%pI2{j?)eVO*Uu`S>W683v$39 znXXUguzpe$E{Z!uL)-*}^k|*H!@_wtU!e{3fu`v`9>++YjL9f#jV*Gx4Q+-Fru zeJB|1I~xKF|L2lzi3pw+lts{ap>p9|9alDt7|7vHf-HzQt+_#%q#pEj?o!L6nizn1 zlI#gV8ri^XOn1o9RXgf| zK~gs&5&8`25O~@CjML2YU0!hNXgp|tw&wc=f&>y~Z}&uxPJq!wGu$#R`bNbuVGaEO z6#+G#9Z_b+2I81U(+!R+Aq-5Ft3&$Sh|L{R|;gj1IKS8cTTEm%f7NY^D%ajB`7X{fV zBmAfMFP-9;?vJ9GaD7nQyDR4Q&i|?+NEmvahyX=x!kd?n`2TyQ_HsZT+QMIQMqx&)gN14C|Rb_U|cxpn^)baq#((! z7Na-L(W%L>Ybp;ThfoZ{&Qqx<7H&zQ$mTdx;L{u|7-kZbt64D;ut=vRkT6 zj^N){`lCPnZ7#`vdkWv&`OKxA3v(W^AF)JneeHbwRRL9OE|J1~(Zi!YRr!<- z_MujkGAZ$7p)TJNV;4o7P>{EFfw2N1Rm$LXxJ#hw1c)@_WJI{XiA;i9ERgim))pbE z6i~t`Is7Pec6n^I486%sKt`;knd91q-K4vfppG4?Y{G&oqP5p(hf-xhGIeS+a98y; zXmp})j7AFJ<3Fyf>(wlrQWuj6gCehnys6mNazV(M_C#XKO17DLMk`|R`-0a}@WBg) z0;^XJDMjH6H2h(02&^Mk!+~ikCyf-`)*zis&oVg*+}xSsU~5hv6h5~#{`4?v=37Gr z6~kXa7CVlaI!+EMgonPYGiN~@A4EuVrW=LM`r+JkdHUN zuCS%JSx13ff1!vK+~W?|3ZJK`wq`??hqz*A+?q{G`A z;=er5Am?G3Up&6U%+agek0mN4Y|+m~7EZ)GS=pM|zc)z(Iw45HdrelA<;qMrWv_~o zQT+A(Xz%ohD{+Y9g2YcdbRbbq<)uDPar`(L_M$HMh`@YJ$SCRBk#0!pXMoW(Z|sf@ zJDoa|-H4ZG6^U`EbTKmmD*qVl|EqUGwbkrvfWBa8IUJ>F=7`DGyuL}Ow#1DB$Q^^4 zdZ)$P6<&<5Yrg`%Xu7NMewdZTUE^tp`-R?N0DJ3TaiPXruU^AI;yuZ>wLjLx>Rw)D zAhE72q+j}#mh{%=#z1SkNrfj2Q+rH1?i9B8J6;=@nt253OWbfVO@w$ zAY9o3TI;9ZuVPP(KV+YAI3Lq{mpv!WRuzog$ymucM6u)D2IqW;uq%}+Wu{FE_b{LU zejXu*qMdF?rUHU=_s1Euxcq(9R}(1h7>da7?%GPu9~Zt(AXWuX)r7*KUpKQFW_;xg zY$z6D#%{tTLHGDID+ipw1LuGvDHskFPq6FU9r9W}qPxpMQ(<d5+-bq>^Q{kQ?&->T$HP&;adO?iD0!p>j);3R2#3~^| zol!eqJCyE_BQf6c>xYGJvg`wI*-mq!X9+LP+pk4sZY>yBs147vX%QyW^wsy~Bp19d z^0i;BLk9@_NM1_U> zds9_9U-8;nbuf(Qj_Ib-G^SC$ZEB&HVAc#f$7KQ|-7ttInoUXbRSB;yFLqQ}RtV*2 zZEA`uudz0Otl3e&%o8eBuYn%M5L$jiO$a)rHj>vlzFsXe0!JzS4mjX>&E>SPWp|in zq8^{PvUgH^^s&6+e?!GxvIy=Mt;lSaZ$NMd9KHRiJh_9YeMcNaMs}-11(G4-wb2e5 ztF|khjp@QU_j<1$wZl1I>=z4mtBd)IbvKE_K8b&8V{z2j(VWwm@R=8nZlrMA*%Ow*L>$BY_K%=NTtu;t zo+6uaUC%|+r+_QrONEs)I~APnXMrSZh_KNf$Iyrba8Of1IQQ5rO-qcc$*uGGtC$%0 zN9L|g#rTTQsi&p0F#oU<)2TX$>=yQ_jajl8uaxz)Gf~@E?Ij_sPiNjWi zA_`1~sVr$vC^a< zi|AMbt>zqMrI9>AolYgtqnQ8G#B15`=<-KPr!q0OJuNYRcwm9Dt)rRGA@6jkQuMP> z;UZ|X*=se3x0u2U392^ppM5qB#8*?F68RZycruHeW&zm=i-@P%Ruk zgBY}hfWZsx&H9JgWN!`Mju$m6W(ek`JVxfLvh>1va$^}YOz8w z?e=s%rCN>6#xn?8M2|CeFcb;WYrI;D_r@$hZRJ3;L;qzAuM;*fn8i?9Mo{-1+Y6DB~6b_&1tbi`>nZg$D$7I8JQ}5 z0U5)ido?GVb|KD)tsBn>e8h*tt6?F1T^is@44d6Pmo9t|9idNmxyK&Uz zjZcXOVKgXfz!SYyle?LIqQ{h-F@|i=B=6D>0q+F`vU0Xh%>qrA1aHC~T}w) zuS0V!Cu6{9^=}FXmU52N$~pq)B>@?dI4u4fHTCby@C}&UD}CaE*0b=&KYx^tK4n4Ft6Efd zL@!*a?aj1MOMbOsd7WP(O81T^%DAUABqyMdoEgZI6D#y|erN)~i2U zR%{SxMG}29yuqrKr(0*wcGeSriFCT*#yH_N%%{7zEX$aRQwG$8hiqXK2dL6tWhD2i(ZG1B3U-*{Z1r0nrs`)`i{1vKTFJ{70u&nFx3h^^CGzHmtKVf ztj@2dQS*He2B<~Bq{29X-Rge+X4vr36*2nGwFV-05jtFWEh!k1RzK7rd?TSDxNBAC z#39aIQK3x>pk3K4S)S*UP2k!VR?hHv*GA%A_MdXS5kiKF9mbH|cKPXFrpM?|+rFo!8jHfTsTprC zE7uA^d4mwf?`2C9{y!E6+iRXrn=bt=J8HvHAdBUI3LvIk^FO~+PA4v+8AovgM!7b! zuPBS+NaGTdSwLlNx<2_0hsS@UkYH%^aZ8K>+2`^I`3DQ||1~Z_-|ZXH{4>XSk9@mu49lB{h1%U$cfvOS0UBjTs}=e z*bv))=5FinYa;0C#oqD?sA_^9a1hXjOnF1ZT=~~P2mH}!42%blI?I^Ds(I6CA??*a z9^XU-9u6p;+Qf<_XK3`<8o7=j95YY*L1L@?wrzV*b`?^Rnwl>NC>gU+R*5g$^sCxO zFH~g1n|07N%Ev@fqBFyrsRY14#B|pjD|xGlEr?La^Oi>S<4O~i(;&6j^bgJ!pl)T8 zyd%8QqX0fekBWd3m^PhQl|j4bIrqfsl5 zK3IlJcXY5xsd(+%IzZqOyVxk(&(bUK8wVw|CXug~k-0XaRzK@|L@Qg=oz2n3ZWZ-&dj*5lh@r!c2A?TKA|7__*&kT+wpXfSeC%;e#pG54c*dx=_3{swY z%yijz_I-#0d!3I>i%i;4E%%3Wbdf7SSvv^ysz{qjaH!V4-IM%W61?BZVqEDj!m)cV zPt63I29%b@sa=tHO?Pys9wVD|tRl#{zMYWCM=Ph|VDdQn48nig7II1W3-WRx`?%=M z=|q?=Kv4er2SXt9g0ebTWCM-|;7UYfaK=gx`^i5#e$#s2<+~NQ8`0A5?d3NT|qO+^> zN`ET0mm(*1Zmouna4 z_@1Xp@OtW+tljO-=9dygtw}{AqCKvI&Kc7|td=pZ#nlfCr13r2E9QAWJ2x}@o8vjN z8tTJJxE4p_sY3d71>~eUdVo*UWG|&8-wwtb&MxD1vNbPr1Z3S$%C8fDy5dJ{F%D{B z^l2OgBGtFwas#&3hSU>cPhSv@b`5QI=vj%KbwE=p<0{-6qb}wWU(SiThD;_^99Aw0H#VKz{&{U_kE12^4+8SPTT^Z#aEk`gKh=2u3dQ|&o~m8 zrw4Te0xVn4d5y$CU)I>q7mL;&oF(7-NPU_$YGz$t_)lneU;O2DCb=XQ4|@~3V0(0E z&_KU>YG3i|uC`05&QyhL*DRO_zWnfhBth&PburneAndlo^H%B49T{GD_#pwHGCFK= zr~=30+(1jMGpuW)RtLFCN?1%ZnBe@a+U1rD$5by=K#FH>qx6E4PovvUaYsRATPm?M zi1Ug`pwQ66u?ZV(+VZhSXlXzR+v##6ZS}d^$!3N^aUJfFn@obi-Cg$THZiDYxwOf! z$v8VW)fJQ7CZ^4iYGotr-ChS1*Y(1({MXo@_u(oC08PB9dE0bUv;zIK1Y8^F(p0rw zyA%jD-2%LOp!c0CyDH-=e9(wZ9V=GPx<$>Z@I*;4*qsD;c5(kO7C|eB5UiB+GJ{ET zvQ9AO_F*Oj5WI@Up#qiN)c%k_pi2roJas+S*?o|ph`U-`K3h!ls&@61V5QOA3yF5Y zuOUfBI=9rIP)y2u=!e?Y_A@F9H5w0vx?|~O<6D)^jfMd*Cg zS>VjJ1(I}Bm@Po(gMf6VbPCw~Z zVxTcAP?X{7x7R4(Lep(JUp%^*LfQ>qRhsH2|Edg^cFh--e0>Z>J@Ib)>SBfGZ#P7cJPxy}6SMS{V~2&55H>S( zw7qjm?;HtjterwddmKpMvK0GybwlYFJX_!#iVG?WVCNx|3Z+)Nr*2N`e z4K+{!gt_AFN`-e18S27&Y5EX*I60HeqzIOc87&QmVDPO#jJ#Z(kDAZJ)1GfEq^fTv z4X#Y^ty2w!54CTfMdvqK0OhI>7U???iukcz!QS>*I0#*)_JXB>n4V1>DMc3WI8>Ksg{v_j;&f~Z#U;XJ>uD|EZ$u_j(;|i}DYYS(7oM}az-n_3=(MiYH zs69Z6!`)Joya-OIiy@DP{;P2;O&3g?P0F|(GPioX!1Bxfg>ot=Pb}kODE5~HH5dAY zRqXDEz-P9D^=f7UOb;Pf^T>Xq4r(F9jD7Sno}ws>kfE(@Y_1jB&hw<^23RHGRRltoDC7M zqH`l)RQa1*V7Dg=Y{e*(ZJr$Bc+P-zH0%~Ev(yWuA~)!Rsx@yeqU-*x_}eVO`oiZgZpK$78Z!y>cb4_m7S?dAIRb;Q(!QgQ#1wH7ovyOWiRCK%~rK0eXOwhuUR^;Pa&+ zKk33;@a?ycVcbg-_Q0ftpgMKJ8=XmATx?%0Ur~ne?r$VC;^n3)UQ=6{`GLWr9@yzR z&@aP%9DeK{S)EffSlyA2(3L?jF+aV^|8i4AuQ)lIYFEtK6@(Tr7 z07EnJreee!kGSEf1VUVs`0dS_w=#Gu#Z6l@VQcr=?6{saz{Pmeu^);{0^F1RSG68;!ZtC`AJoB9ksN0u$`wYCv zT&*O`JCnUp4*)W}i;7ioYz&jk(&>jHm1)PdMnbvYZ?SC%DTGi4i_hf^TVXx@E26I1 zoC=7^)6$gG)?w<%nL~c^A|JVCpFVM8$LN0o&v#UCDn!d2WWU%u&^ddyEVWZ<^kj=LTxGSxd!iPht#Jd;xGvaQC5@Na+E>=v zvfk#I9;NoCvpJ)ToWfXN+J_*1HXv0l`N{0=a^V7&a0$;yc}w?OBl(>{k6_U5#loZd zYVcVTQyXq}1b{FzB$(80^gAEoj-@^_^Lvgj9NN^*CXI`T(_^-cnVcKjxKOE6ElqV< z#a{cwa>e|HPwtiO6HVcV$3`|l->`1tpf(s~JZ;z=?1EId4s7X1I;mL}XY<~wo`f1O z^OmS&mTyU!XTu@Gf3ljJh6*NaIFfm<0)D>J&?G6xDRz7CI5-k8Id7b;$fb zY`s~Qm5DaP>5 z$rfqdX-Wz3mn0=OGZ&n54zo#*6b_q=G79cwceIU}%DLN`xr({bZ|}z4&v@bG1P3>t z=!f!+{W%F>i5HuRLMK!_y+;<7#j_LRmNH|P;_RFm=MnuxMO$$Uq55!jWZuHHv8^Mb zT2?pvV;*{@R=~DHx})C`tydRW5xH=rG`#8Ebbv*u?P($k|9N3s`r;}Fo|qpN`svk+ z3Ulc&Qg~~G31WF{ctFz_xTn`UFm;J>)omW~>H+O@@D07z51+Re-sJQuF6Ye8dN@z* z_&%6NBbNAoz9>H+qBWlv?2dU2xw{(g?-kt?qI>*p?Gb9nzHjqh^xkS2K8)lJFY{=sqe5U-Tj&D#`dwuLr8q# z`k8e$%upXd`-E`O1sgOq&p^l_21AKck`rxHB6axe;r+KpSW=i(&kuDn-B+ZiO`nsu zC4>lAKaUb2Yp#*7CkrD3^U7YqO7(*z^L~Q$ZeQoNhl;&H5`neQ?slwOvQ5f-tnx&B zf0hlB#tW%f*?d7Prk=N!onE03j_w=saYnCUCxk0zDd9XXAY}5#_x(^XZUL2~(r0&s z-dY&m@4t}p2F)6NogY6Yhi5Rkd4W3v!z9Sn0jhj1*CoaCF57!vI7fP{V+Cb8g9z3q zBp(&b-;2B#^V}9$d+*&Wvs&zsHdHn8EK_Adz+hE zl^31*aux%Ex}=jGtQ3>4fiM~qwS-^sre0=y-%?U;$B#V9-v;#S+SNqHMPz!e(7p2{ zvT;)HkH;a?B#9Ic#VmOM`_#!*}9M!^3+hO0dNZ<|!T7>{y6$x`JIERXu$5H2t2K#f;cZ zbdD2)*y7T_Z`h)kJiZHeFQo*_X&*^{bq63nG{4)>hB0t;AQw%3gbQ5=jl~_{78wdjYv*oo;*`lCC;UNRwaSQC}5*>D@NUjQra&n96BJJ zuC3Y0yS;E69LdYnQ=efd7Mg(cVml-bzj5jaJqSbo;`>M$9$ijW!FCUr58D5|(7h{T zx@|Z=^yg#G2}i=%JB&|~u)byYx>%&$y4ZR)By9k#1qA9Z84+YwsAH?QUr+%nI0Fb5 zsKYs>a1d7b`JwS1D)2+*HYQf%Jk9%FX1(T&tp+G*8*vO7)UshN>#}+euq7$l05@W5 z=3`fqISQ$iv3se<9OadeSIn-cxX&FUi3T{;zL%LW!BMvrZQfIqZ>N_;xCd$RdQ!WD z(entyBC*y0VHtGmiXyy?Y$)~t#32lMU=?!5Wjjquj{fr8ovt6 z@&ya@_#WXrnnHqmsp44UVA$cb(v4BFUbT4khn!(SljbvSwdfR z3+PN0eyV>hpHqpRiqwOe6sVloZ6^z+e&V%N)s0{zZ_(I&AAsl7VWeJ(TNf=^LLL^h z+U3q*A^R%x_(94=;$u2A;|lOaoP8Y12O^{6Tg}!d)F2uKFMQnrcWZE0^$}vsE@2D_ z$1JEA!RcCWDp>v&(yBXz$lZw|LeePe+NiPi`C9LTeP4GB;dV7xK9H6;b|#hj>fUi& z9L+d$RI2cSX&Oe4I9+XvjRDw!xTAZi44rWJ^^;I!=V+lyqyOl)8&7W{w}Ca00D!O$ z{UP1q6%-Y_oJbCDyBpJ_(sE({Zy zxCvi4l9wD=lVC4!a;Q!Lr~j6DRTR6jysp`^H#A3xPf*nhtryfE&_{;m;e{qrK4}E_ zYUo_*MtB}m zE&dGb%ceFPEX8D9oV;7VQXzaa;)7`zAvYz-#I!}P*hz>3fM&SN07m|gJ_VNN{)JhY zE$0xzW^bMBCjalMZ)J3I`f7hp9wzzw(occ!&daGfrj~RsiaMdC>-M5Rx>7|gW%6P= zn1)c&6eiD1HB2=VL+cB{jxBXk`7)7sjxQ!Am=p%0OwFe8{o% zhR3)S?>E6pu`H4}rmM4mcju?bjwH&Bnoo$YPcv;cryjZaoV;YUerI5?0^XN0RqQTK zKbv8y0$;WZ;lbPo=_Eb9_+c%`T$cDJzuP5hbj8L&B{-UF)!RMriP57gX;S96?5k$aw{$BjOm3%+p5SPia z>2^E(G@D0=?Lm>T(Xg>qoZi(+!1;m2d{z6**u<>+aCA_+_g2?(2?wTzQm@DJ(3cf? zB~x6aI1%-U#-zxzn3YU+FX zTT%<$TjSUZzyX!N#orebJzVs=w2fvY@Np-jX%nt%fLyE_;}x!|Zorx3i8(@v-Nlo! z+#WYeL4hUGL9J+30VTR?4l8wDHI^+Cauw!-$76mT^7G_3YP%kjE$x}gQJL{+tAsg@ zme{-2WIOFT5VZCsUY6{_Gpl|*lJ5HoGZ#(g|8=SFzoIla>@3m?(B4#_#9A%9$cUl( z<{f|N8dQkld6&!Skhmy%$k-iP6kB3>Q7H!5e}CobiLKdQUb%LJ&~X!*%W31#avaX_ zpGZ_d^mB?@M(%w^NdW+!a4&RgKQs&_Qghj06WlhvqF4;08Clva*Q02aME6qWu223B#~VZ zmT&z{a8Zddt9ONwVvda7d3nwWEM+pyvE`oWNgYfqigUg)Dy;?ZpAALt5eeh9JOjyk zAC?Y{z8?){MdkL62_0;_7&4P>g*iAMZ9h%7`qRM^q!Pyl#+vt=*)zH~Uwwiu;X#oE zT=pJtTFT8+nMJ>~4K`j}<^V!@6Bi^Ielm{m5!-qnZsYIP<}&tjue({#&Xy-fHJdVH zr}}5utt=`iwkHgf@$&R^X`Da>J~IC| z^#P}T{TPrGUG9DE4swzPRJ+5}Mzs^PhK}&)@Ow6`{ZY?QOLfmR z&vVoF=b37H%c0)umh^e%%;%5$4?SuBY|)1Rqm6)W6A>fnHM|vlWJdezbt`+b9|}=- zeQmS&Vy4eZ4`Jta7la1&`P-?cH@|=M-9hksud^!SZtEETcYiDGcD_QMk7uGfD>WA@n+@T&oKCe)jq~xCZPy@{axR!#G}zFG-P(f!qckp^1tH8x z^9nboG*1z60hjAo;N5cY7qBDC#|O8Oo`gXQjJn&vs{Y&JT14WcmgR_ZMGv}NYm02z z)w6pY?k%V8HC&Zo&?-?VyS4gjyYxeo0&g}U$;~3Yq7Lcs$#s*5GX!=o-LmVHux-qy zoAX~onpij2Bsb%Pe(O` zVM&M5N=9MzAf_&BA8eQjgr7mI68w_+i2$)kDaS1{#WIKK5Tr$_!4z)B)XglF}V3#J=poc13+XG}hr0=-8Sm((y+BfLpEE;a4(F4{)YP(elza=aiza|O4(6iReO4Q$#Cz>YWf$u z)|uzYoiXnaV1s`B065M3C_Rk@ugS=f=3fMLnN`4>36{az!H5z%L0#Gb$Z=dIao|~K zY2XMMEomS60Uhn=_5H9zV@chc-8d0<`hRNh5{mO1b8x_g=48{}sBIeLmvWq5OK8gV zj=I+SgZ06nVXx!wsuo_Gr8Tp}kD^%5U!lR{`NyXkCR|@TVDB{xd7$=4_V?7CghGJ649JB$zYI8B|92bDW zi@tq?1#K$*mo#d0m2y3^q@ni}E1g=eR5mv##Bcv1c<$Z}THJ9DxR_c6&58=zy_v}*A&^ru2E zHJNt_J2{YsU=mlRNUSHc8_zBEhTC{-hP7~?gkL6kFnlj|Qd&pZX?VATcE6?dT?phc zxV?=ySuokNqz+|2oxM){$K+MVb=CP#E_}2nlahqvva5gI{OT~?f{daGsS$zwR5Tis zRYI(jt*_h>oHv?dPn(XdqOCHPC+4Af%%%Z-$feY4HC$gX#X>WXZ0tsBQw}8ugE8Ow zRKkv_MKEh-XkWwCV#K--5aUK!JlB-5bZ&oB`VN8HomnqqfD-3W0okWW);YC|mn0O_ z2{I9_*R(#P@o3G0m8a!8pQz}Wf$Ail$6#LDPuBhbN{vh09;A>Oq`|uEQVw9)&B&TK z0ojsBRCX#6?b&UfTKh77p@VL9OIPDi>BMFo%!V&Ib5KuqJ3)cTkxsX#@A3(R=fx7t zolCv1MaQCY|Jh#`BA})oPqItC&3!tTQ7!B}=(U`$79!V}V7W+W#!P*z`(HrVHwThN zEmNT+uV7F-n1)w{cCPjAXZfRlJ?&sNCpRB`%Zw4kj$5LcyCPo`q@@9!9rn5GK=Cz_ z;$bnvJ@r#MmFEfn^nW#5lw8yF2^aj^8IpIb=iiIGU4=J!Xf&GB9M|YRx?9#wl)!u? znAC~=A_p;Pbp-ZVb47l)o)`Ss-7Q5+_B5{ztUE_PU%ca!n&9!Oo(X@(77uc>tF{5e z%bdW8ShU8HZ9&bd5yA;uFuvG!VJs#@R;54PbJDbB=DI5c&fn{t)HmL8 zgwG@#-vhM$)!YML&&SWhMNggX%%9r*H^~FL%r~w90j18M7RJwcgP(|v_OPXok-Z0_ z@h&8G2ylG@Lv;S}CckMK^Ss^_&B2Pv#>cNWcmQ8AJAd`@^Ov$1`}s-ww&dyF7PhU( z5AM5!cXc-j+_i~NRU^p@U+$cRN$TejV|V>O3IfvOs4 z2>qI(36-mc{-B@v#xfx&J|z2es_woEDS>JhR8K6=*Ib-EN@=V*8o1{E_Z1@>B=HlN z$;>3CXw>=Hj25|MRG3w8AcV*_Olif55?(5NyMFTBIQBB3GT)Qqe>=%1dxirdRzt0F zM+&aAZo_ti>SaFG$lMGka>U3ss7}oFDNeBIBV(}mWT|exJD@ubc20~N?B0+{bba~< zV7xIN)^j2_qZG53VP9Am#?!M~7H5|LC(9EB8$xz@;mgazT5e_*+(>WMz}eb!OHy5@ zxMuh=Kg0s__Y7b+uJ^sp_r{`bY_N5)S2HI*H8Yznau1TNyV$6MC2Pa(iqjOOiE=(J~JZ*@x{85jyLJxdjb{&c%&`vYa>}wj#3a$z1sa*X@Fr23P@?n9!Ew42qx=FA9FMAGl ztC0oXoy_4N`P+%nv<^I(1-KZm{NMoEq6;3bBC@A%@DaHry)dz71AX0q4rjph%xe0k z#M=`Cgk_CZ7hhVOkY-(ZjnAWLBq+^s1)--@v=8>JV0J?h>rJ$JsrIs5x5P=x)qC`z z>4>81SxmU$gnb#?6Wdk^yb5~y9qD5%`2B(RytiT2oc>btfaw6_%cq+lJw}|V8PCvN zQN$VK(Hr&wN%96o?i%!;l5q$AX(IE@%*K@n#w5O zRme@?u!xP;y@`MX#}017luN8>s-i^rE;AhB>DZ-fg=vu(W#0~yvrT1d9uH@jauVZk z-P7DoM3*FI-#ZY&=owY{*~%-KxcM!S4_AXivQd=ZPRP<$u5(J2mW?;4089WModFSd z20>>M21EV%&NB$_KIz06NuBrb0aRo=7%j1JniGdNS3Wv z*JIsb7WXSpPb`);jP6{~B7I(foJ#6XTI+9rxKSAJHhD7S`;NqV6ci_P*hc%O4=k4x z3Ut04_gA|dmE$n_nilU><$h%#GGgBi8^?$zC=aAa5w}<9#-2Q5JrjwjE%gy0SX?qt zlUX|kh;B#I2;t3I#88Ukw0bO;(@Hh##x9Mm&l&@&S3=>4zcB@RKQRrIC69>1&h2}N z=bz>;WgE6+>;js?VtpgjJ&0(~rhVpFIVu1a?T)mOr`=frLq}ce@nPJwp+DNsN{3`| zxx&693z*kD-4o7+;k9|*NLqlAAMio!X$(;K@Oq!jd#!fvind&ctS>toEjzKXr>uxR zSC}MK>7CCVt)3yAXI5&$Cq%`+_^*q*_lPs`d3V|ny51%@c;f%OYz4~7?*~QBOy>t5 z{rkQ}yPSHgPg3Q7&lUsJ8zQctS{Y5fKMPr`B@P>5ttmmxDHdWQawa4v<&Z%NQ-zCW ztdUEkjbJn7uo?1%%UocKPj6ri7;Ezx|Ktw`RJ56@OTSll>>VMO1X7LdLalbiyl|Bp z;=Y|?X}{By+is(uJYh36+ZrsedgxoLJYec%Tg}?6maPIAzb<#3YofACw_{r@&EJl+ z_hI)`&ZHw>;1}>96a6bg6p<~5W*i@P=(!kjplYlDcVj&gMul&2(Mcw`7eyccD&)*b_Sj(llTs0Jh~5>^~MjSI|zZ^zA9-Bc8mkp)^eT+i5;hvGyYTj%@7&&cf)m&ve5|GOH zj%a%h@GZ3p3V%V!yzx z>1!@@ucAmW>j~@I)HqlH4T`iHWV_mNcYnfvUHxzG-jP^A6JVj8M)25eb>g>NPN&Wi zOrET^!1I^CqQ>ipWKs=#0M9}bIO#Y&B;%I&UmZmimyk~5Lfqb)i5e~25-x>jmQEFx zzbE@?ZytNQakC1Sgk3_bVgY*H;MpTltGES`oiMdRjyg(YuJSrvxA zTxLrw`^enhwMCbHi!t}{xo5q*M&1{oLsHT#+>59dqy_qRwGgA)>_Vi>gfWeoY5pg8 zbKRaqW!W?gmE2Il3e+6Ya~u-L8!|vtfI}*F^zeML@%t5;GA>%F`yzF1$z%iRm4h;d zSJBEJ_$gAD1oLU$#+vgP)Mp+;dfSUwrowqY=|%JHr_Q^&aG~MU+J2VUR8F!6uj3Kx z?rlVuf1_L9!bSYQA@huKdm~L$Z;u%mI$?1_j$nlXFOA2~DMzeW3eMyijFl?_Ulqt| zNVWwy}_ZP|(ppaftNuIYdaf5!pz_szK)F{r5^pWl~;So1R1` z+00~r8J&+gQWHPd5h>gbq0p9GY!y}fA@x}*>P@i40^w8zt`PWtU+mS$x6-7k6Hb5M1AJabY@SdXF1wReZDH1 z)~1a}pRe&pP3Met;2HY#P^)OupTor0pbAxNTh5|lDOR%!rNmvl68uMvuB4yV8QqLe z{o}Il4SnmC9WTVN6u(}VQug6{r3Ve^g0gG3&*=JCom|JzHp$y1cZ$g4M9%UPZ3>V;r0QoZqyMeFViKu&-wkxz?iUoneu%(YH=g)&`83HJPfx%p{hroq zq18Bbo)dHm)=T|?oZztL$QHZp-H`)@V&|{n34JVqePZnbdRr8~=lIg~+&G3IuUv7a za151`#R&mUuF_16vR+R7y7xCO&c|wGV)L~x`^FCcByFpsTSK(FTF~^Z#P7;-hc+i0 z`gKKyt2NyW2%9(Ggp--lao2e9;5NYQBT*ByG7z8?%1e@ZBHH) zQviH6Juvl<$y&LYnfK)$BZmFb{KE%fg-nt|(w8eqi_9$b46VbY-Cs^{>ZsSTJ4`mt zwjiO$UV8giKRoqX8%pl_ey8sRPk-_TN{ony5LeM#dn}M`W9*VqhcF-k#{<@clz~k+ zC3KZUJOTAG#oHis+n#v}mr?Wjp~}#UPE$|dxF;$5yPO%YQPTs935?`^jJ7hPV$4M| z5(dWDwOVRi;7Z5Yt8i!`B>g0l?+(vQabsuJ8QV5SL&_MtZ5+p_RUU!qV_y$Sc$%r zuGV8T{nS|M?XLcydVofqWDc`iXszVR(0@S50bd_m(bz*2g|O1&>I>?kqv5^FCEwei zP=CN$E5JVV&1Wmgyis|=QmWQM!FP>q+_qxhtGxX&zK{D58$#sP?@v;6Dw@-lFhSAN zc$r13lI;7<7&`5PgEw<*akUB5?S0W38?!(nKPiZNmX$${^_+ ziF%}|iwex<5pG+%cpw4nqH+L}tguCOB-LM|^x{3UiFVU2&^8Se5EtoRaTr-FY}0vK zbActm^1gy)2_VvnSxZBQF(UNt=LSVlj;&DDL$Q?u6=TyS-}9g`Uj6vIhg0`%CyK<@ zzz#fMXG7f2XHFCw_Nz4o+({$`i+PsiuEX|Svd{ds-;u)V*WAlo<5^%kmB*59W4f0wdq z=7wua%I7la0nb-FeKwXyNz~1|;yTQat?b$z7had488C83#V%d4jdedpESZZloT>af zC2}=K0D3Sd^uQw$%S7}5IbOE7KXS+$;R{i$YkU*pcc}pX;cB zbnQHZdIHz{^RCM3y_z9!#a5^CvVca`@m{!HFW27v+g`ORsr-<=?(Jxi(Wh6X9|+`Y@h9@2!f z7RZi&T@Tn1>1WN<*SX@KXd3?hyM-^=;nDC};?;hB*ic2i@6~mz#hxp)|1!VdG;NbL zz247Naf|c%5si>`*kk@ZV12y4fnKS+zXaiWzjtP@%zLxzw*T1f9{=`s@$J)m;o%eW zCTqTH4#wPsqrbi@Q@{5&2zBt&-s}nrtF6}+&iYw<-@uCK>*uTr|F8VIBuSE-pL^hU zcz^vNI{42zwN&(B`3Q&@chp1YW2A9k?>E@Yl6LT&~}Rc{9Z%-*o>+>vBBmCw(oghVgrSAJ6sIvdm1aJNiLA zF#PHB^;J^spZ+}d=^c{bANh#-(9&|;zCMIFfBxC~FMIj#noOUHG`8MbrJ~T z>GaFSMc^01gmnhunpdl4Nse;cCrjMh*?->WW|S1S1TVm(8YhmOeR4FkthfGKIvoWy z=pD@Db5+-c+ogWZ+{QYCM3N#dW>>x%(wKb5NhQPvrdI#GyjA5j>JEO9Va090s0N0z zp?K^{l4x?tNSca){Bve}YFgqK^~!aYX0Vk5qx032IWKa$b{?#$*p+r6BHu+V69{z4 zz+85>SoHmiFA36RuR~;sRa*-NDuT{I;)dZhyxR&IMWCR9E@1p@_il!>j(>Ryvl(aq zK?Tt*IFZ&)VPVj|*SGFb|26{O z%FvCYZ`^Sgt&L V==W*R<~!yJmx-j%9@|#%R|g{L=|E?AUTvpD8f==&a7F)J!eu z8V^f@!l!p$A*-Mr5rZ71GJm2fxP=dzO0^<1&~W6Q?pI1d$Y;2`}$tmJB+?hTwz&S+LGN_3nz*DVekEmZW~j;WB(kB(HJ4 zP>~%gNzC*M`>Dwu;aM)S@4JN+x~?P+UZLl>1l_c~gAOb^Z;NR}3uM^8A&dJCpDSxk zq1HnZ|7gkUerfn#oc<`wLVYl}AD6&?Mo(&#DkxqGZ&oc(9{Wyyox6Kv4g&0@LvwWG zZU-k?hv5J{K*GPe0(*gaHaibcyH-VwNK0KODMvqLEjbW=O9-}Wt@Y)NeX`$?ERJQX zR3n39q6qU7RYLgT$K1M-7`qMu+?5k4X<4ZIWMnHZjP~*LJu#7yq%~QF!lYkadNHU} z>^UvPRrx%MPY8tJj#lC=2Qg_hudXS~r*W5+%JTq@Fyu%gPZZ4^^W|`X54lZ4=qXm^J;4a$Iq1*7$jHy5fNJh0dqqQvy z{p&~9Tzyltk$f+F->vb~ATP;KZ2KB4i{Krnj;;btD^ckw6k_VX?NI!=Y{a}#Qz%l! z#!f;SJ<)Gkd5q7MYjxZf8KKs?hDFFh1DRCZ>Bnku}8>$W#W(lFVbW z4~1%bWo+YbA6DJGrA$tO$oV{U`JC>1;*6DQdg6Z)AF#@Z^RPm4(9m{2Sz;{mVgEcq|u8O`vr*6Z_q3fwx$d{WZZ0$lR zlH)Y8Ndd2zsob<3Gl5Tr;5cQHN6D@eQG&U^}y0Y#CRRE_Kl2GtrhtKKlypFIJ@bEbUQw)ONZSCy0? zh>OuP`$i^$??fbLA}(xoc8r2_XcE2D zaG;*hBxBe+V4HXEHLf>8WB7f1_9k8ihiBuu9P4zt2^vswau}lKCvu1tfF|IMM5$t1 z`fQ3fNwe+PX7m~PRAyt?-Ya+er&mjilYr8#F}vBxWv$?bL8U>{U)kTP!CBvvMQziY zvf1H$2*bn&D9e9u-+;=Ya#CkiVf*GsOo5A^2Y+r|~^EiC#BBx*S z%Ow-02ayeX!V3(7=3*ymOAB)Q5AELiYS-a|YAR>8XlFm*eN077zRx0bP9_=Jyh%;Y zaugoRjIF-x(65&R-_Nj5m6a%mgGhoa9&;7E@sn@r{yB=g6bxzw4FM~i=%;1vyr-6kXFbj0I$8!+nMi^TN&j@)COpAsU>q$7X-lN=z0{6g!pyI8 zD>8z=5n?_Iz6v@Nrj2_?Xfh3}0u8D;i33Lt^>F;I>}43>#VZNaSo~L=jBLYQ&n=s| zo(s@hY@Hy`B~FTBwo3}pif{6a)`lG%EX>U%Dm@w(N{dWIK@3UyW61oKnokR{U= z=5Ks^@7CW==!s5ZewB~617`Rl%P&~ec^#Nrgu07_c|}b`Ejpf)W;ahZ)-YyB5s{}G z#$*aE1_#;I{*~Ol>S$e9%w9%9wDEX0eqZ4n(ajuJTi71-kq?g$v>^gCYIF zYx**EGdU!X4rGI!A2((DLrrtTmqWfhkQN6*UGig2{t?)%6#+I2vrsrfxlH4@ukgQT zmy$klYOh7e)$G-ndOVKgXdEbgh9G4xhRM;R;?l33%+fEc2bLvRB`!BC%{AFI?*IGt0KVn!%cd3=ks# zS-nyP?xnbBts4Z`b7=9KRnKtC?m1K3)~-9(9z%rlSLl4IdU7932~jWgNVTz1L@{F2 z1^Lii00nBdD_ob-^mdc4qxHQ+FAdzBe@wch&AIh^gZxBnB=uXNcAwO!`QgQZ*LR=A zVKKb~88B}8Ui!QTz1zBTqa}ZvxcDv7-Kh}mase&ESlS!FZP+AXKz4~)JK*Jiu82Dv zF{76Je-!>y0l-Ywn$xL=EU_xWM%=E=k;)|?@O0BFmXr7xK6(Werme(XBHi|q$KOS`eOqj&*V&N_F zZT{y@&%8FswO8OiXTNT-L5HtpVZF+CE$tHVyLlE~JWN{MN}DHBiO z)Kwu3(k`W0qYMbAw#8Z+$Q1zo)_mS|mGDDPO%)FdEMlHBs56q|gL<>p?X2}**MHNd zH{hS8{j?^0dGTvecLf{b9XeFbmV3tmd(Hb<#l|=BvQ`FNzDs* zA3LgQ(6wr74PUba*g$4ovz^z1lT?{$N45Q-@=5NR*ic#NiV80#Z=%iBL6nJMnXZF` zE=)(3ey{$$&)hAryM@nekAS5Cz~0}xo@!k7WoHo)TgwDqqg6WgMPHxGe1+f>I1f!~ zme%2f+x0*{Uy%RCVaBR&!q&umf58H2L@sdUWZyqo+14Up12mZ_jW}VODn+5Q+Qo+k zp{@AJjcg8i^)94#V&K~1N}qPIP7Lg{`>c9$S&TF{^d81~JbucNtv!kt+oyC91X5l4 zfBu%5*e>i>ghV~n5*Lr_2x>d*50IQmNzpV$0t#+MjXhhD1E0Hk)eW2mUAy%V2C3ah zj#34e{e{G2A+=}dA-GKvL1I`ET@G>dnrKxM1fW>t3V8wqE4%(^?c=^{g^UHwCqvf6 zloodU>@43B$~lx)fI_bSnU<0;N`_9tvnE$+eK{f>(N;3=0TIdf21q@cX4xB!rg>75 z0v5JpwVbISYTZn2nUt?N>{t1G_$f~hIa$HQs6hf;5oR(TZd!yX$NY*=lPaF3lZYw} zi&Am*xCqb&JZy6G251uP-=)@m&DGyVPh4%XIVXA)$i58R0VGGXsi+T8x3wWKXoim_7PMPfaS%e`$(XE_{!AIm;v zON5yp8)4}o<|@8RE!Z@w%5#q=HNoN@#AQ(jC5KdrG|?h;riD^WRV>X9OQ`;i-@5++N-?lQ}b>)C`ad%87?sz+G@SZEgX2L|WV5Vw+b3j}T z;4hm;${tYxS0k7ataOM#vIX#cR4+u6GaWynsi2jl5^!EA!rJKTyk(>~RpfsQ6dj*E z1uk5#^w7knjILVoX6LbYrynfwUi@zFPui#_o`DR%49zhAhdC8L{9fpK|IH1!eS6nM z@4CmQBL&%UUq=fslO_ya=9a(R`q?iTbXmgrqq8_4P2xxwfePQ{HyT%I-|i9)TE0X* zTr`fO2|D0HMDsYARAq2Xt44Att$m~3jN{C>>`mr$uh;oV;a^9>jc2U-i9*H;n5bXQ z_uQ4OuWFgQ7fPidblgDLCfmAq%Q8hPL157B!|bqN}-US zcgsG~C$CZ^q9A5jJNj&{VNuCu&ZG39Hlk#f+m7} z7VIkTF8Z-l3>_dv1w=b#xE>zu*PSRGNBY#By}HjK`>yOy zRUk6h<;M@1Jj^w8sX=5-;`>NQFfzqai*(e2e^;;$8Y(rFwMk!67T(1HpOSqu5={0} za(JE~$0>-!H1+;5Nsbvs2$+gmAuP_5%Mjs#5AJ3hwo}HO%IxFLgz3Cx7I_7#tgdXJg^T zF(b(UzNSBP66lHo4fE~k#$M0g3tav*15@|z`F<5M*bkw)s~ITDxuaPg)^C;5J~!`T zj%i@vJ#qu$OUu)0AFI!vlr;LQ)C)O~p6iYzodMzS=%sNyuosl6Jm$D}^PJVM4pNUM z!?+9uN%Qosr-6|TO5m*XB&jUsHw3%gaUIl7)hI?%e4Bam_r)XxZDE4%cPGCbM5m5x zZ_#NxY}M@te;+Qz!Zm~USQ^Ic7YSk-@1rT-^f9c1sRylR`q{%cE(Lt1zboW;RDXS& zD|$Srz8_ZOx!kNW>Nu}7EysDBBH65T<^lq_fXxoihQ43Oo=)+s7mc`PP%iAQGUA-r z^zfWx9EUkk@-CKR`cZ-lbNns$eVur4v@jyrJ4wl6tL$Q~Hn!(YKs@Hl0l@IWW~0IS zRVB;l>aCMPWo!da^;exX!k48o@lt_b8NFFO;s>)33-H>lCVye4)h5WXno>6?>+$#D z7uhlDeLb0&Ta_qe3{H|~?*?)hK;F|mNcT<-S=y@g@d4oYLpE$bT3 zZGpalkh}wAcecScjhmc!FRgr4rF-&vc?DBypKIJfgq}B6p+}#SPqN3wL@u%|8%K{0 zq?)qks1vfH)7>Cqpc90xHX)JJ_^a zHN5u#;)VLM$F_~H%v`Rd?#)2W_^v~=j&y1l0WZallUFxJbqWO>dRBj|?p2?D&qrVG zojACWjLq%b+x7aOxY zV!mF4t0@nRITzT_I~21I7gg8oEoRKPJz9~JFX6uZ9W#)j{U3zW(Z@G>VWrbNJSB-hq0tSwTNAhq?K?0cRR7_3+ ze0yftOQ-NQ*<{B7Xj|1aYNSx8W+wKS@Cr2H=5`QV=L6(yl$k$jHsUxte-pn#rVKeO z%d*oJ6m~Lj$B7+Y)kRlDQL4>Crd)7f=4WPB>4rzVMA=$!?5HYsYj$O@%n+f+IBXp7Lbr(YvU{oY!$!QTMsRw2~#nE3EDe4egu; z8j8}pm|^P)5)0r(S<;THlTHrkyQ|5^OR03EEFq?6wggQt0kGcYyL4wT#Uc2;(DhHA zTJ>+gJ!M?&#goq;X}j)Yoey@Y3ad6hKR=+|_cAdvl2y+k&F1K+E z6E$cJtUCx60`xV~Z7~1`=l7O=K~?3v1v}A{Wo3V*r$S0P*q4n7+}8}#+LA4YDx|2g zkKJ)U{Q?MiGPmShkHow1Ti%NH1hiyXX63Q4z>yqqihOPyxt#_zp=X_M)EUX?&~Ojt zQf??It7%K+BxZ>q!1qgtWmow;IPL2jG_WWr0_U>e;7f%mMmbt5oT`u3+pt}~kF^71 z69tOwkN?Vel#EAHYUaHsY9k@-zF**hJOrL&5OjAx^6#Tj9x{``8uV#x(o5@k6L<5y zT@4dq980?lkNvQfc($K>KP^-SeumPj#KwqM|y4vdjFR#Vj?2rm>HhOp-yzt{SCVE1DKD4^za(g+yBeN}@(MJ9MSuvH?## zlmMQUiMD{hFHEAZfUuMBBJm>2<5Z@#tSQhUVNkGh88*r*=yb^&5N!rF>2u469BS0z z1u33oZ@(h1j(?51cTwZ zJZ7!Uyo`#b8aAQaeTThws;5f>ML5N37n@W^PgIh_1kL+!4E5*MQtKTDleXJ1ED*sann_5 zBH>=nA=}U5KIiI*z=QH6{?FpA2W|Hxr9r{54&l7Z;GDb%2VA=kyq3&B(FxMs;pt_=+&0E>+h2XJ$hYUERCVtL2m61#jMJLNA z7Riglw_42LPUUoFS?$$N=bju5Sqp9WtLA0qp{QcvInp)B8%#~=`Ikd8A{Sk7IYYdIW+wr+% zXi3mpL&tvWGVclQ{8ocPNKl{cuf8KJ^BbgNAJLpO@-`Tb??th@q=Gr0%(=L?_%Tbtb@E z+_m92aqYL+jM#>^5#hkScmt0EICCm^qTaA*7G0dGmPT?#AwpBrzo((JW*b7y_j)2V zJqjw}jIn|t+OVdSwbmvPTyVEj^fsLSO=QO$qseaAmF)M;(4Q&rHvgO~9Z(@--Uh#{ zgOJiJ1r^p-K0*y`!>rE`13J&ks&&>@*lQTRII(9;_R~5 zM7hbB8eH%#eJOi`M!dRp@#R%gR=u+-_wEI{o4plP$vJF4r$Bmn)gOgJ_Aba;eV1)9n@W@0tN8)snv{ZJYGP%B3^TO1H>OxPx|vkEmJ;7Hx+S$(Fx zR+{W*MHk){uAWM>D@0TC4z-B!84}li+J^nVKX1o;;Rb7cFK+vjZ+qM0MY)#Tf0M># z!+^#AIrp*}wnpe!VIXV4gDF%2OnEv{F=_7HNePRmq8Fn>+Tlb1BYb(k)mS0p;%2Q!<+w>+NC39X?nzxdj9Z!9Vb@4vMT2$q8nIge#JtceT4iYwf+TD86W2TDa% zJ2T!-noTXEvBWx3Pl#sN;n6OyBwBoP(&LjZVJ$deDM$H3QPnGSsbQ)0PD$)1^R+<@7p=0R3Dsen+6&vP~Sb(^ibM44%`56^;gB`wR61 z5e&}OzTnE8l~86QgWvzQH>Y2+cMoOP^CN@`u@jkMpz+^(t0SRWb|{K+S>K&_j(r1AG19hzxQI3P#uOX;_`mOuxkdemo%smk)!)s8YHI5Ohv!x zKdT;Ld0v~{bW{vMijLF-b1NH!UO}R3dWi%*Jb^=x9zb0pQ+@jMN1c>fIBZ@xh%OzW z;$w9cRG7p!T#%|aYE(4EyW6Ty{HnWBg2sZt6JKS~>$Py2>n!Np*vv&O#_6J*Op4DA z{@Mh>yKe&xLE8Vz_(}WLQJu%KtrTjN!2)(_iroyFOv<5oJ)il|cP7n)nOoS}B&&6O zHkE#s2|8K)1YVDc&fD8%(lOS!bUM}=uTyF0ZyMEi-jv$%Gv#E-JP+%Kdi4$!%+b+k zs&d;&C3dqKAK-JH2Wrnswx`kjUfX-4r+H*-0(Q0c{r_u7Lt&Ru-dVh&&t;2{%QFMj zs>|fJ194WLExx+!ki%~;-X{N%R9&X?Y7E&FF8=N30nOQdZd4H=x@pj1cT2B7X)z&g zF|SCFA#V_|{Y#~}h}Fl#7rVeeEcI( zB_xJC`;rZ5%`%+GjN=8am}j%f4Bf0k;*MubFYZW+??lXA7UW^pvmeLrHLrhL0Fa$! zCw+7onL33?@Hj{9hKkoiSi* z`pkmlz6+fRV=_rXwOfy50k=%RZqFKVCp8`Eqa8PkJCWFazd!uP1=r4khEu@dh0T3B zsxPU8qzP?wab}bQCT!flS{}H>6w*BHoq1vmv;4aH zkI2V%!BMS(4TB!9Iv+$!)SabfYyT`Sfm8ec;k4W{$+pANTQZ3`F+HIYk*YZkh86wK ztGUMF`q_u2=;@|XGep`~uuQYjW>^zORkK~Ek)l4)BHBT;DW=!-TNT6E?e|NeO2i@G z_FPqs5avvyLK#inAuW{F2#=fR>xO^lGxCK6CNSrrl53v&MA!_>lEQqAW=^&+y2P?! z?NE273X;3oRjT>qXwso%wQ+X%icr16ZU|dqBN7cfqq@@}BWgvjQt14RSZbBDj}2I) zcFa*O>Ij6>h#h7=f?sD*NdBFK<@E;r*)S zbCO63ccMj~EC;AUkw*@D5?^0Q6yiN$YnVC0DgskSo{MA$Q(TTu=1^!C7e?I#fM8lV zt%ECSiU%M^K7>PU88S+&AeROSWE!O@yi=ZaD=oMV}{>Tifr6WHg4BK0fk2QrR z$^3CDqiQ%ODcHlX?+Q$zE_@3o1e1=0b<9tmQ=vG0Y@kHmuRF?R0tSxw3x5Kc5iOS> zF*=0GlAPAqVk<17KoUI9!qp)R^A<;>_?yI{FG0J^Souk54aN8!c@y$34?M#mieW60 z_+$Y|GK#Vfg#39qDA~OtJus{F{r!B{;OeVhp;<|X^Ua3QS2#aIbXKrPdhK_?e%`zG z9J>xLz3;@`ylD;hUmD{R)l%j^k>rsAuou0k2XK@->W<88SS(a5gE%{o_OB3kX< zKVuS;{U{1U=y=`vnMjVo6XqrdiVA&A$yYj8QD`)Cm~uTfcl=#b*{b$Y|G{QHOFA~F zdt>XYegTk@5d^q|hp3XUFxboRm#^-r0+r=`$C2N{iJ9|E|6J5y63_duOTQ!1oqfpJ zo{|$U(g+TQ4`WwjBdpU{7Q&MTN9lc@k0dycS&3)gO;gY8IzBrm9-?3|msVp4U_A_$ zy9Ll{2yRic3*wd{ym3wk`iX%EYH8V3(;a5_t6-$svnMSc6zE90){588Z!YwJFsk06 zvr%w0fc3Th=cBohLj@NJZXp|)L8)ox83l7U?(tVQ8CJdCw5--@;c$m5WkVaxUi{KqxFzs)~M-N}ts(~U~`@b$GBRM6uCcwps+-PP`!g1@CDpny}1 zQexl7i121>C}yv2?E46D1T@?p2BAkbni<1_n+~m9Po)`Ldb)i-YT`uhC*u=4+3i-C z-b_t1hYx{J`oE#I|V{*xmw21Z#N!>sc3(r`2C%l zO^uZjh5htzC+{&eN4|u$MUNxneIy-8*)ai><=Mg?O2*#uAeClh!0E)DiJE+y5kYRP z2H7*qDFhap@9ttcMWR-9L#BG&$c)Yicwt4l_P|@4+H@hFwz>%5u83?y9Gn^=;>8Fj z0DtuHSM9b;86uM)P3!iP5vElf-#V^zKR|>_(4?d)pzr+A|KsF%gj^ofMKH}1ji-wi&E7*pDWQneJNa&5#gVjUDc zt1i>@xQw7BhgHR&sWVS<8sKtMR2Na^3kWz4bjLCL2KK^ZhiI8NN}BV4hOqk{5YN$$ zA8|l}U8%nO83cbQlUIyOy(yMx2A=tY_=j7n5cXvJ=GGp5FLsd_IJM2N694tv<4bGh z-HK>6AA>^wN5RKe+sK5QtlOUgv!>I?{rz^jJshCDxu5(Pio9AlQSU{B{y*wnd3#BF za2q{{v)|ly&LRq6ZE0&FN7lL~6$0r@vhVZ-+j*+T$nOi7;)yS>hT$@?L~VkvZ*>h5 z?k4qk6yTxy%rG{9wS7i5MAy;g+~U7xWu_d0zb&9vJ!c|2=4B1Gly{SlW^GQj_I6rj zz~!nBuGuLS(}q(*2s-3lqOBhtU9s84ad4D9y-Z9$f!D}ErB<(PJe!)i}%<&Z}kHw*wQmfLf+4OVA}Ai}E}HtG?y< ze!@17e!FmOAR$yYuMG;bI||tbh`>CIW7FG5aVH`?(^|K29qB_-8=#K9Ug2?!^EH+-9;LgI*;f+sq0ZvLi!2zLH=Uqu z2H&*9H~FSAOhVUHIXHe_Y&c)Bnm=_EOxEp-cW^jKqhb~M;O-yWy8gV^aP>$j}~8m?Fg zWKwgs$4}=FHsg&Zvq3*`Eut^>3TSe)%6vAT>X|r)3&0RpdlQVYA(d%Qh^nIH{a)%@ zW!_i_vG=9;mLE+pAx){l*a27xiHtE54it25;pLdPnGs-COuS5FR@D*_$uwkOT~OH1 zzBc(uwjx52oz$>A8Dff5vD^XEJ=w&gkR4ASVES}UMohLrK)2=0bdyDAf1HA3MwlNh zJ&Yc6@WZYyG2!m~aKXP(ZE6rx+qIygK%TUFj48{$JpY>fF-Te1U1WZiV|GBF#XCr3 zF4&ffNp&W~QoVHT3=_50*Q0qIrc0Qt8QI|4H$o^x|w05H){6n2f=3kOgSx$z@q$znY z!(V^mq0FjUa3AAx?^*3gifrBHFMEP)o9B20RD2~Po0#Qr1{ewkdSg0zW^oKl%~eeilNI7ymA6SN|G3!qU#Hx2 zUTvdyM*qMpSK}hC1pb?pz4?Q#SyKdJ5W@e!6%0MC0P__OYLbW31V^8Ne(e9T)Eu-P zhS{RBEjpR;2~>k}tQ%T+&!=nT5}93=(EsA8nhi*5Fev!7=|YwHrum@$(a`e*RqDJU zU1gnpYM~-~**YrBS!}jiU+LQ4OD<3_)w#tX!Kt6>&5Btt`r;iNurVOk9T2ljn?SzK zvh&CxKS+q4=Pq5qI5Y3zAMW;E27{`b_I1Cxd_ymiS+`R&={jLRx{t}!fn_=NHbNP% zMEn#|+wK{nZf-YR9`rAqfw+g&Nlb-ZInpXJr|RU`f)Fw>nvq2x6QGw|#m0tj9MGY2<}MR;Sefav5IPK$WKSIr@itH5|jP*J{Z%n)s=t+~nb8peOS7)@|qlm{InOY7o( z{hu20J06Ot1FP|k(4u7;km69z1REujF)Y4B52HcXyn&}#ORKLiTQCYfR6i2_H}EAG zu%(CKvg<$HH7kXK(9vWHO7t4ig>-;1Ok179o&32_MUN{y@sjGldem)xtJiW4jFcI( z;I{8ou79G2b+!t*`6br!e%+xV<9UtE8by_YB0 z%ZCGzm9kf3aa)v!Nviag6->}{?2d$uN6E5CwWFGlkj|7#V7kl<_X#Duk`zX!sa1IZ ztU9$lt35#tm03Y`f@R{UD#OXcD_j&DvqTT9g9M8W?Q0@=tBtW2-#@PTb|c@aHWS9i;Lw_C3Oq22e%M?{jNL)EQ%}f*(^6tU%BH z=&x5C(%#>5MR#h|iCfJC3tjpnxg8;yKMZePY6SUPW=i#A61B9u$8Av;cFP5G79VrR zHgC0c&Ed?!SZ{_$lkW1uanA&>x;%m;)I4epmPC>)|f*iHyrXEm-o&uKw1{#om=>;7bn`4I%^9+Gm z(zc1c2{*h_&RQz&aaZ^1kxD#z}4X zMwcc`oxM}w8L++B+8c+v!#FrS%Cb!SN)s;Y<4&HaIzrD0NDq6LNQaBHGI}IKP)wkd z5~U#iT2CHBsBs-x-7*N9aUVe*j6$rno+-JH+FMB|>X zGk_VYr|$$Bq)8$d^SLv)1M*4JIFz^hTbZ;Qp2jX8mtx)C6?A6U8u*nnudFc;o0zhE zR5VTRV~q)8);&r=ve9yW-G4)0u05aUU!mx>wrQ|Hpl(kxZDPa>u)imz`%-WFgw(Kf znQ)&K^#-n343_ErF@ViuLR;`g>uy2W?Yxsa#^Wa}-fwPZR#t&wi&9Mt?HmQ)F|1 zmukIWpAgCEJw2=2-tBA!VD>obll%OW$>QAR7xqxRH_KDJ4q*ZFg&MT$mktFm-oZ1* zjF1kZ6gfLzU3WGblVzkQvSI;nfb_Rw+y_9$nQA~p1VV;V2qrg{9alN_my#^#Q1Ei? zrnIN-(A!jORBc{3X##HqpzUiRn?LP;xin?Gwe@tbJ@;Pk{@+ZTol6OQW#13juyzpi!V^f)sZ5`@X!QaTmvE1Uj(WEa#YNQJQ5wtmi! z&WA*qmtH!baXls*{sJ5t>L9|GK^F?0;P3OQF+TA`)%qII6bmfGRS>?|OhH zTr*-yit)R|ELIn(Kqu_z+3@HJ$7a#Xy1MN1G!@VDOjOYNL@!+!xG7iR(B>uu8d>JU z%7!vQWA<({QTZ{=&i$4}b{BN_JspS0!V0H^R9_6jFKtTObx-=b3Ip7=z0PEf_u*sc zvqb%$jwlCnGu0OUJCSp@i})Q+brah+Yp5)JFDsa8AopA@z;Jv9u(BjPS1=8}&`U0>Q zK#{{luo4_^8)e|Yz(m<((+jLgdh_EVm#yxdYLWo;`) zFEaHVG4l=`81L>kRv3 zPFy83xvO{+ex3sTp67DfN~^4ZqqO7!l7^TFd))?HtbL~?&sP@%@aeJjD_g6{E6vV3 zm)%TtrInMY@ofg_NSo@p+S}BD`;7Ye{O_wc2dAq4V?HDJ8hH1j1`QLTd%atM8+HwZ zrRRt1{A|E>Wxfb8K|o}YhDhCbQSJSz(!D_G_ z2DueVXl-1fbS3pqGuoc*jbJQUb#gH=qDQ_(!2yJMgem$p_86!%``=X>Y6QYNQuT&% z%6VsmfrWWXCZdBei+U$aBV$hpBNXjQ=P;=*OJ<7cX%E&eJ4Vfq|GW&(*e}9b0qNhq zda(}oeW?mE5K=dlezM06`(*sC>ZY4dyH>*Lv8hr^>c0qu&zffKedCf2sNAme2Bx{vj78O%yB)8h{0U>i7%ph=X|4e(O^jbpix zFx|<18f#32YP{t0Np-l(N~9kP9+8oYtv32&UVdrcRszWJQny3b_cG_rr>-UMK9Q>L zFCpQ{7k*>U27zycTDLAPz}}~;9$X+ol3T1!w(Wi?;pVhAvIjcUF5=rM;>d6cCQMY3 z*!MTw2FlF)H31Wu^kW0U3VfB`AO{or5>K^|OVBp&0*DvyqEn_7rTwM0HpGb)h#-x}DJwH);tjrju-7yTwoiR$i@Iri1@r zl=t4Ua@5aSGJxr9z7Q!2`(|PMIn0I26}yrP4yY+NmILi8TQzd5=TRx_63M!j%X%>3 zkeDM#fKWfQ)>Rc#LT(aJtX*My0KgXdT(Hj*J%(%Vi#*Z70MnWu&MyJ>$HdZa!)c-G zy|3R0R$h+5mY8*WxxUG0RmIFK;Lt=blj5F5E)r%51^F1REIl6(8WTv=>x}*A9ZvQc z2@h<6Jw9(M&yZA1^YpQ_S~HLurSEwJ6PD_6biq03G4m_MuDJPjn7yhfsWPVjy86TU zCF*~!L(=UkQJG_n+(k;Wog%xyf_|LqloMqyJ81?(%I|@=n)ci>Y530=QY~r%RqiX$ zf6e_aq?ZNl1cH43JjFuS?l5$cv}N;9{|%%gL|Nc?Gbog*n!7aDL*~9Ge?u|@U2qVR zl!Kgu5vL2HUyQDp-qTs1y5$>52(4_7}O!~agx zzE@~hwzEBuw9Ug02&RXzP%q-Wpr(?pAHo}U%^f?5Q}#aNlX|EGi+jNo_<{todjYc9 zxzjM>IuB@ZIqGICE^@LcxPLEl-iTfs?Qc89ny%iuW;}NC0Npdn5we0o6lXDlc6jQg z9P`pD@UyZB@+!iF0GOn{FeGoDZN4H*(CTu1A+wxrOhjU{I3LXH4<3||D(p>F)oSr0 zPy?=;B;m(e_yfnil3SW~K*JwrUVJ`K~GqZs)IG zzM4t+pc!f@<}F3nc$Y5U9%Y&*y#uS(J}j%dSsdNDLDNpiNq06l{Mntfpn%x%y_TaA zoBUn}R5GV)-VnU{W#8-bUtRm(KJ_E-2y`?*Z|e_Z4`C1==~HFFA^{x;?lOj=Sr$21 z+1hM9;`rX1xar3+1s8v7qjS&=HGI++8M0(8QV|P^DSOG(5+p|kZr@I@tW6(nd7^_G znrF3%%MRu{@HD#GlK(*93ogJ=tCV__^!rLVPeco3b%t^R$Iz*mdbEFaej>Ce*QiE# z8$+IL9hSy2ai$T}b071xOU4%cj_I?uf+F(!VQ>Q4)o`W+Y*{HPvXp`>k=eIUw$2Z^ zVMe5@J#`@;!UQ_J1lHKhFS5~eUo^hgdj84$A(@)AcjUTEvgpoztI9n@)m{^p#zM}% zA7Tl&D4=7xn%Y?%cqAcr!hr(YhnVBn>_%_JKA12iIxaRV{JS!kx|;onlv>=yjoZ}X z91gN>+0V$8hp9e1r`MiWvYp+~f_(h@osWrHTrb{{Y+G7?6~2Oz=@e$mOun7yk~Glu z;M|o$NOmd{BW&E3GMbl8Ms#ixqd@pV7N)KM5O5jOcX!d6~a^ zx*fb^clg8l&?sBg#UKy)Bm>Adurw zU?KqDhGbHEWU&Rx)`Y}ks+~dnrW#iFnRvb8A8K8A@9@FeKDblYr^W95pO^f*sI|G} z%SrFgqSiKLtR>SqY1gckA)?qhPN16%X|7|C(%jYh@WTFzp8O|)SsHk3ty;2=N7Gfp zpVAMGc5la}wfs_(=;*1mZi_e0Zh5HdYO-z%Q~M{moT=L2pdC8&g4dCL5r<*@CeQUlj)D3dbURJ6X!-gY{3w%w+ zuiicx(W0gm1bR8ggL2M??#0ImDVpaziEr87tI>=={(YQ`y-&_#dzY1b{|zBcNwqf9 zbaffa!YH{7)BTnS_s&}uDxjXPm%>z)r_Z!!KS@~kU`Ea;U4*cvO=%AWN_b=z)KZ*5 zq9rxwjNTR?mGiP3dyo_CApSaM)!j`lbPDzgEzab#g#O!y-NV9ljWw?~>rRZyleXeT z*nzRG_pz4#d3AS8_jCyO>q+*9owuJpGpRrpPgaEoG*74lvFlEV5~{%mmt}@9NOnt* z&&@Hb^))R>R~UBY2fcJrfM-M{nI_v805d?$zp}<2mQ}a61s?l~Z?M2FV2eQPkE?SR zP*SxU#9`4%w66cnITxh0=I31`?f?J$UfC{{(05NB3*!0xSGS4%L~r-U<7Zi54=8nOqwt1}TIqfL~_w z+HwpZ17T@0Nr`;uTF*<#B28_#oeXY2Ieb=H_o?u-3bYbp-~F{kzqtLX7J#-Ilz(XS z{dQDYSkhc(G3D!d403K8KiUoXs$fa?U%soCrOA9E7333%Gz}!$nIA)(WLtfa9(*lX zCQ2+7&Ri{!BtU#QAxTQrY93CytY{??D0y*qPs7v8dP}EIEg^a6Znd3`F|i?mHtYr& zfhY8&YlNTpXs?;8T{yWx8o+D_tA=iTvJdojUbBqzU#lO5%^!FHu9zg|owmEDtXr$R z$15@f%ENXM4{6!FFOP>MzpJ#>H{-t+0Wi|x`>tF*9@?pvJzlL?9mFTBR9QOh{F{?< zsY;-YaFC5SbD^>vND6iWxNB=?A{_^(Tyzq|E}HKUnp$k4Cw4#?>sr3r5VEMd|e)KAmQ zXCVsA1zlrN*E32?&!9jv*MMh24AFSYSd@DyHcg?`PRAbE1_JvG(;S?!fH{57=-C66 z7Y&xg(E<&f?^Q7O$T6wFNsXtDNyDUw86_Y+#Jjh^lt8G)3z+gll68so+^0QK5zxP* zV;1F`yadKW=^>n!G`};&T42pZ&_!JMXghLnn#0C2aawcE*g7Mj*AZ55ke&hiyiWEO1`e_o!PLUw*@*VH`fOR2 z4EMTaElYbx5P7pbnc1M=NJ}31VvjHm*~{)^xXB-{V(Jvak?!r(Xa9lPdu4XMR-B-T zSA>uI80q-wX=GJtsh(OKXxUp1r?}M@x?Ogv5O%6InWAJxd!5LwmvMi=BA$th0R4R+ zGOhvE3qRZo$ujva{9A{2bGs9RiMe!@HE$c(vv0$ZzbRMX1S;kSP7{|dusPTB^dhd` z&$d{|te^e$?gxg`x9yszgZUm?(Z%0j22qSp;;^r(^7PQaL&qTa^qB{e!<1o~1C|b+ z+?}PMYLZ2L{)B0y(nH@(j#*0Ti9Zi38tyC^RM<&V*gaiKIn=XP;EFbowEoy*cYtmN zuA6;7VcG2jg>j-g`%PCB9Zp_aEacD!=`ne|ejESh3}R?rTwnNpk;`nq1g%KTo^Y z%a1fq4i_9D-E=@n_v@umBP*=(tgP~BG7+T4evwHIo*6e@{9CT()w@B2gp&` z)1|{-OXUdkGe>+UD}aiy1XA}}Zu&mjoAPrjb(8$9LrQc%7TYbMHs@COMPovdkSljc z*6#-@$NfDjYgAQLAzp|0K8GE;_S(Jw_6FO!s0ZRWvLT~q(ok~P$3dT*Q>rJch14LB zksx`VW9HBnU8mi31ORfy&XBK%99wWGt{2Sw4--s$8;qWvOj|m<=0<8*antR;JC}DO z24g*6xx%X3fvQESc&&ZqMeGe&qu~mT5byrt&lXjKF&_%eD@I=RdLgSJu}&hZ+|-qq z&7t-p_}A6m_V${jBzj$<3sia&4UZPb??5k>vjL^^pB4-cfBnlxMsiO3$34w(pTTyK zZ#2Y1o93Z?@Pdc5p-B`>P4xkHK;b znuZbwlf{G=#N_mjmsugN;I7|>IjiT<(zvGUA=69v$W+rSMbrFpSeootkB+W}_&F8!z$M6sx`FSFNODkf0 zaPLMO?Il;f7kO@gqd~b-5v>r>o5WkpP(unKODS@Syqfxvb$yi0s;#)4LbF`9>(pZP z=kpdQf9w}xA*=v+r^J5K#eoRPZ}CkLV;ODg*j$c-!pnB$UeR=kye)Ae)K&Al;@hb8WV@F95I*}OXyowvLqP^M}!xd4|rclK_ZrMa5Ta%1tFPOvkJtlb}ue@T*xXpDrte_0eRKt}W zd`g6{WR7~$F+BGG?PDL{#@0|@x8{a=a9%jfaX!AtIoiieSJY~>3EtrJawA3%{;2vX zc-g+%YtMJ)t}R4zRDm(9O;$#8zQe@Hk#ly(%E1HB@wim2pGF??MSbBhNZ-ZaaIjv# zoGLj1viWUBrk-7h!p-nV%sSqpSV?XN&d`B*Ryt%qpJ9tIO}&8#c8A@~ola0pQZdQ% z(ozTue9kW(xdIAV`Q;fy+v!Qu#MYCYhToA2(a>G)k>D1>E2-b=|Z0<%oSU;bAlE zhL;oDv4ZvDaQdWp9HXP#&CY~2F|c32^QmIG%EPgr!ugTG^llytc`sXhm?-_I0``6w z+o=`mLVnL22ToMDE!LMCrC^v={E>O+WD1sJFU~rX{J8gqniXt$O^+UJZjz5Dxk%hD z;s-7bgiUs5cjtEC39>6}@6-x^Seh;Ale+IEE~G{PsbUoRpM56bhQF^zTHWQ@w!7eNvH_lalSPBr++eY$*hYX{)3F8p;3}Qo7 z?`G*q*HtIAL7EA}qaIjo3CF0*S2FIB9O@T#ULcg!?S*=M3j=hXH_`HooUl5&t@`1V zNJP+PGk`wZy?g)Bs0z$c`tbKsFE)9U6ZTk}SNI`4#7on_vV0$o-;&lwj|+sE8ays+ z-q1kx&zT#{Xhz6;DKVDP$#Z6jDPv)>FqhA`!s6_Ci-*;$%4p}ZX-uPC_G##>vN#K2 zULo<94dq6VCT6}G*S7Yen-bC7Lttb;XmP>I})Kn#|T1o!@e+BH2fj8(?71An~ z4~121?~RhfnY-h_Aiv(*S(nX!NI6j!lw^sb^YB)wU$}*hGdQz=r4Svq3>k>xpOix% zutdRRAZ$npi|J6@I%$GB){8!7m;V#2HMZ=3UHktPqMyy06qwbCZA+&8XCrzlcqVyC z`x`PyZ6$^j-6B^)B<~p%&Z7U(u|A=`+J)}wwhB8wbyd@^eXSXVHT5$^1gBk}%uiUy z6x-D61Q9%#yju5>Pw~1=`n807kmX#YbCLDQE9;0GRp&`}z}ddY(ASsw zEVr>41gY0;m6BJn>hM;~*8TbM6_TFXwrJ&C^#tuqvkRR)X9_SF7rhH1_V230lge4< zEey|_;Y?M9t)2l!7_eWrnR!EU;TJy${E$;k781$K9hi?Lc|&r(!}fE%EM|kNQ-mSL z(N|Pgg!kY45GtK`zPwl5y4zknsRR!PRp`R^;>T4bm+xi%Uf-fH?UL-;wrzKpNIr!x zno#oyp({?sl%BefsnNK`@aD6chby?JO~)lT$hv>rVou%@-J!luGq0(I_m(RLl7&SK z)L053@y06~GRHu!BqNuDXn-+(zg@ygX170r-P(sQ`Rxy~px0?3wd%_qaOBJ?4v# zyT7Tnm#9*&eCqrQ5m4N1-N?Mc0SLhgyXS=V5o)kqx^+CR?pUZ0EW67_%iYF<8w_(=g?Qp-u@>W6A!lu6cxVQhc%Dha_5$ z2i{TmYKf1KXtwu1lI4*(3^l{QngdxJWpuIkXka|AHwSnlO#i&v+d@5k=q6<0mwxxQ zZ0z`L1&25=y{f%LN>h8xH5e&W=3!3ybYz(J*Q}(LC@4n^N?PzHD)sZ&<#etcu7!Jd=cSF>$GsP`7_ z-IQDHZQ;AX>)cwnlA8@SHzTqP8qGwdfvItYxFVUQd8O8Ndm8XVce#J{bb@gkl*1Ym zZ6WwgdtjqX8T8TRVE!k4uWM4DpKZ$zem5NDNi56<9h_56qnn!7K7P4Of_68-jIyG% zcNU@Ms5OiM!ud8YsBF5RFvddv0UE2E1*E7N9Hdvpo4*&it9{wsxhQ%{A(DN56T7^7 zL_tQMq0?t%4VCf!{qk>0k5^5MV+x6xk8 zZLaAxlU;0|D}r^_?>)RH%&lcc_a)~8ii4eXs9E)7s|f!!ZvCEJtIU62r@)7Apu?^g zWFpG}!Z%k`*Q1*gX=Fd~^XE%{_v3o+0E<#O88~}o5@Ru~*f+JIXg0MsXVGcPd+`=E zGQSpE_mzI$ih5uW}wb1^0 z3GS6vAFn%qlKrz^f??|adEiKXyG-*HWF*~NeUD@yboBZLLG*N|E4^R+4y5Mb%>3DW zf7N|TZ+NfQ_pK@5eD4v$V5IhF=_R%pzuQr9M?K#KnFi+V&0g5ovhLu7RtIitMK#0s zpf=Y@oR)Ei{H0_6DTJ^-vmJ3ZHR{@nJF_?r|7@9_r?Q8&!_SyNK%05<2k%^DP{}!_(9cvjW{N==U+wWy_j~T2} zh#dXf{h{N|25bVrOCfD6I@D_M+_nbjv9P)?&Q&6f>s!jn5q*PqYqLD^z76TS9Zy;- zj$4j6?(@7~_j!Nl7D}zhT;adl0|u=SYW9<%u-b!c#!FTG@V$&87wzo*%|3{d&vh0C&KL8ebYXnG2L3PWt>ha8DQT{-E9tA zIwZ1*YyHHX4PIdp#344Nl;>IS-Jq{gC)x=jx$Q4N`!(#9S0DZalaV%T%2EuX!hgnI zgQ(n$iJ6spa-z7Z{o0lwGi#>g<6Xi=sN??_-Qz~%l$u!^?#ggYXP9fn(BI`+}^Jw_UnKAP}BY2 z!e(E(^WyHs)A-LSuamTr*Yi>SajGS;6}KnVoX2Uqi@Q{i<$KY zWZSz_|1Hj2giXb)eOE@U1#Dm_ma4pKmeij^Yw2fcK5ue6hIi7jbB~pc3xDOj_x`%Q zzVuF&d@96`=@`nZI+t6QRW#Cdk~KF;ai2Hk zO79(M!{+bCL+rt%(b@Br?be*$_cI9?DZeum6)qf0@B8i-{HaLl!Gd4S!+L!(p+RfD zo*K=A67TTZ#r=8b&*IW-pS{QmDUE&sZn-?q0Bd7blr-gjTn zSKN#ys8LMBLapup9Sn8;I(P)FzWx@i%Z5#9snyo>*Qj#pS^=Q z==%;vQq$`VxRm|<)%{uL&-uEkfxn}i^u3yGx3=xOeaeztRxiSR*JaJ!`Q_fouYHQ< z)Vsm*^JUkQ<9B|G$(KPrqkP@$zDHM*^uzjdrL@2OJn$B!rNI5|lmVWxg5^L8f!^e& z#>M3A-M)y^X9eBCZo4hg+WDpZqc)ygpK@zKht-OcGUs9 zq%1w$+WF#0CR%=aE`>0bUnbE1tEd{#>hlkR3g8d^EQ4bV;9ond?uEn1X9VNV1j@Mo z?1wlkf^2QS%jds63zB$$^8HE+oB97Tsk(Bt>(A4l|8*kiAaAv7qM9G|M&W$WdAWbH`q_by8d4_aPDshQUB=k^GbUlk!~4I)?Up2+nsCOMOA4* zXz+~$2>ZEf2;TnlUFUz^WS^NUbV*)lC@tF0i4rK`&vGh35`57ME3(6&UGP^wScl+$ zl?*=@uDu@*?(}71gqEjUnj%W$^IMs}P5FHS?m7hy=JRUbt2zGmmi=9(kmUE~SvDep zar5h)H#iFA;`t#t48IS0yZ-x3O@xroC;8~5eu7FI6Z`Z19}Mrci6mw=5BA9C`dK=1 zM=j-@x%tn^Gnt;4f=Rb`n=yWt!xBB~w*vY6_bYyC&VQKZA_pB}0e6MSAF8hg{P&e2 zoVnj8M71&%ED3jAG2*64?Dv2Eug_q{#Oo!-CQ}2|x&olk>^)&d85MmC)b<5a9pn?8 zuKH|4NAVi;)ztp!W11+!?N5;^oC>!4)w@r`ZV#FCQODZJsZh4iOSGA+(>6`$CQCPIH;lJ}Sfz z4t0wqUnAM)L3)jhDZRkz@k&QA8FXx)OhUc>skMVX+#HUJu|aX+$zsg7lD3>6DJvQ%*yo%?sp@k z3u>y!(KLEzz~AHXb|+f+0_i=)jVVm)gLsk~&P}T`oVevzj=w=)XEwKj{-4NYc(#fE zT;46*mybaVY+X)Kyf#s6FYSes$x&~=K)o5;;}v+Sc4axbm%b#i)ugf8+= z)W{CJ{?w`RY-2Q?eRb1rsLHSy=6mV(CagMTaGKOen`ZLiiI+*fdr{1g*PMs-{%>_~ z+w@bQHU+oZfpj@bu`%!|dbRxC9rJi8ukN^XNKLNsvH>rg87e1K*Y4{&*Y(q><%w_e z@5jS;M3b|}S=W9fR(JR#c(zy1 zj>9xJ6~2wOMU4UaCm7yO_fjA3IM7=@uM&S!oYb618oGpb^~^4@KU>H&{gU(Z9Gdf} z@MXn$c}zP@s;$_wqX8{Q-sN*MaI`r4P@vFvn33hrqxY)pus2;|f|Nsgkf>+nxOe_E z2m)A(Gekg$k8l3pUaPJ1VCz-EP*;5V+`pfu)Uzg{mEvme%oda%cR4aKw(~ zKqhGAvgeBzN5)>+3dUX>%8DwiiTu|ZBXQ9=8GwlBN7uRx{cB|KUA+Ie>U*ci#4y;e zrukVS3B4u<7I^$3^n+4nJDeCh%a8;mH*7(r+V|S_y396AucVwR&BHNS`*#TH`jLw- zSs>;}bxw+isoesUM((J1W-xEl`JQ(cpMubHZ5>oP_1Ab|HTw-C=7l2ReGG!c{NcVK}YR zD_ucBe4V{n6U*{`52f2J+os9tRajmAyxkxY2W-Gh zYjw#1<`ofLzB@R^>KD7jnWFR99bBKjWKzaNA=b+INUD(~{qn-uBSJdhL{XVcsH`9+ zI|p)VhNww=ci*hntj)~1am*b%USVe+#JVaGb>{w?hguF-f{fV>D>pL|h9j>qeJ}I) z(?LD<(U`WHc`FmQQ(U*r0nJ2s@R$^yS{RJmu_ieb6|O1grx!Vm>;C3W!pNEz%S~vh zLlL-8%|IyViIIgXX`n$634pwLD&bJ2m_ zQT@4bH@e6a{)vDurmU zOJZ*>Gg6{}7~F7ztF=2oUxMgjHHm+ghZS6n&8{nCYo32BnEvhmYDbz%(^FmPWJ*`; zWAM>jen~AasYqu)OnM!i3B`cXK-s-4NE#N4CA-GS`DGl+o!rMS#Cb7bmaqt`VF5^) zFBB%MwOI-jQXLcK!0b z>bI25eK9zq2_Lr#|GF&uJH&BKJa$iBAI->?f@yL+K5U45gLH!LdSFLGJ&Ll6(O2ws zx=Sm=c=)2jG0I`T=29fWrh*q(XKd){!9%WT?PfZ~Bk|0sT`(Vh@hQLi_C5Yo9V_ijC*%g4rpoq=0J%tefC3=FD&+CA>Qa|lmq{G|&aSIXm@5JI@b<^LAmLjeb72NE z{c4%jou=L2ma~84S+mG|Q4ukkEzQO2X!L~^&tKD{FYwk>QKZixtvo_fJo*q>FVbSD`sUvQ4X_)6QgPHH6NzbVD7BPzRR=i~tz&p{3Z^R#`s!JhpKj zd%_)?z8Wokg_tp7)S)efE(|~Nd|dQ6>M94`0>-{wQ4o!!-N%Ah0q3adZjkeNp(ugp zx=Mt83Y_J^8fP=-b32c;J@ToKY3yyj4iMPHWb+yXD>krdkY zJg3N!&_PmcYVomHP1pcuPA&k|iNLF7|MDPPxkk?HWDz}0H9l$>+PiDk8>yTgpKvKB zJEn3U^*wa05BP9&*1aOTF)O^#mAk#Ihea%TuERH(*MK!; z)_x{Xu{sA681;k2wX!qn3W%qeXs_ctp^P=xjbV!;3-lrtJE;5+Q--DcWj=&i{z^;$ z{MdDCZ?&*al!>}KfJ}Pxa;AEtnFCp=9GZ!!QOAg@WUs+Ro|4_DTr(oIp_!cut zZ7WGC#b+IqWeF7mGAuDtFgj21jM|#|u$_@1Q>0a$rEuTX7<6NE6+S}4Lfrc~z1+|y zA~A+efHj;iDJLJ$fFfVqI-+BgLflD!Tpae)L}RtbBk)JMlE?#Rl-6pA%Zi z0j-biXq3u)pn{4Wh6X0JqXf|-OZldUgaW;|STyB9PywK@3U2Jl^dun&l^lYaWCKH0 zB@L%lMd~{q!KG{iRDib0{E&0To@f`YqB=g2wGF^i4L015lx5ckJP~i2+IGju#EGe! zuHjSFmaCof_IMavPHS>6tMISi%YN*9jWT3c=DlSmCRGBHt_bQ?xp_Unbz{1uy=1p( z-iUh(BH!+6^LiFPfHJ~~j4^U9*For_j?XGQ+x56>3ObOG)7ir2*en}#E!+;dUkfAW z^NN{2X&eU&5}s06RQG3IkR)UvKw7n{Qk*5ER}X+(YJ3I(%pO%1x~Hqz$x-k9y}W(f zS!^NcZdU$wVf?Mj(+5X?SN2xJDGL|z%L?Ck*Kg{Cs%(u_FQKYy7$Ia+ZB7(niZFM1 znY7!Wgf_x4U90H)VY1&a86_RI+eL$oLDy0MVKJtXi0bR;{(M<(q|hB96@}8?+b83a zi$I-py2xa|Yz{(QDt0=R_jo{EpgTG`GV^-(XugjTn715!+4)Yz`+3>Yr~EBZ#1x?} zAKOS|j;9ke#`q8+Uw=R5ctlA8N|cQdbJ(re~mMv=!4H z)BEivwST5bjnRrMpU9=I-EI!yTY&3O;yoIHcBy-rY-{E|!;?nkrA^JkD}Ws1DM0x( z@MmHvir{#5{CwNnQ+`HVpR_;!6r$4%u4GlyvSr@aUHj@}gf_LEx4sBD5^FS`o`P0o zSPO*0Ax4PONNR#jIugHi?ax6Zzq$=_OVm`S#=_Hac`Tp@A<@S;KFvxf799Y zm@%vmw!HM9;|7ZupE9R{P6BGF^6l%=&OK~$cG|jPP_Lm(bxOO$ccwiRofVpl)cNof z+hUS0*B!{6YJx?2-?O_4^~qtoz#3GZ$u)O}t1xeL{<~-qYT@V?8~&y14$gJTIF%uXM$Q~3f)ezC~bEV6nrfq&Yc=&a@hno zRs98;PLDZ_rf-$yJZx200n(gKIDpdzCtSIx&=?ar_7d^g#9M0ed!h$;)ZXC6F2AIw zD&=xWc^H6Z=P6@m0OZo3z44Yx;254AdYH4UDgR#UA>*wwnXffr=H9=bys3vGn*i4pe={;K$L8hUE`#9T#`(3h1)F*S-F!gByyJ`5TR)Tl+Z6kcz>WY|QC3xvg?i z16ElOdz%jArizU+uwZKfRX|lKC!n5uaq_f$W+H^jqbOD}PCojAABPzTb#WaDzm095 zPj>s$i+Qy^VSdj^1Jz^gEnR;5+gm`M7{o*8RX>Mxsc*rtSphkU&2I&I+L?^|v`3Lc z`!{Sb8NR8y-^NRj`|?$y)Mr+|s|5Lgsi$npd^G*o%(A#woAz0J)DF`;6mUU-KX7CS z{o&>4-fZkVl);2C+}l-{VIz-4xh-DA>ZxD82TBfb!*HR59Ke{~YS7cFP`1WC(U4xU zzL;TOsc36~BFR%VZws~SJ}7YLuj^#hz1Vj_TAk`Yi`HO4tV08S`|;c8B3sFEdP-V& zJUQ8SGihj0yosKOhHqiAgc>+Go^BP)azIJAqd_Z*0=NKkHB4o+JY6037_3%v=c@m| zmRatESc$pmlZU#vn)$nLbUjEG8*ZYN*)%*G-;FN}$F-2B` zV<=m`8K)HIf4XhnV;&`jH%kj4LQ+Mbl6Ygpi)M2zcGExKHsCquTEmn26??z&G4q@-*tAYdu>? zjJm9dbitAU3oH#e?X|2DUM3=$SBK$WXeI=gH1_T!>j42C{H& z&Y({GWdHYMO<4kHci*JslW+An`j(62mUo)i*4Juc(LZ+Wyi^=kbCozfE^XiVaO82! zMLxy}GEFsOj{W!4s;8Ew*-!wu_z$~HtUyP4oU$O1rq}iMFbB~ve)<>h znb>mlfa>xr${vQ{%&qplSfNzoMppa>VXt!gRJ08HX*KVR+G|;V_0d;im^^v_-fSzX z<8-7sbQ4%|%F*q+A8c!LnKsqGEDXKMj6uG*)X=3K(-wFH(|G}D=t39%ugX5|{)ZXvau6{mA~kE*-|6cjy^O-s1Ln^Tun)SZ&cm|D~UItOd=(~8Kf z2FRpcaVhLffFnd#E9xGvfOmr6cVC<&E!ZlVM}u=TwCY z-&|$8I?-gt5`n^aV}!_qoI@xcifGkAQWv(YBcgfr%0-bX`^YX3XR-<8uswFyknPXj zocXCcRqYc^G1iOMMw+p1J%NtiDJ7FN6Cnn$)|;s`Vx)+%CvI18-S>?dh6;wZu%`Zk zJCzrc4+&nx`-J?jR~2E!-YHqd?P8fKj=XXz=&H9JZHCpWfq`j~a>J=Lt4k74ux<+H zX=_^bARP31@>?>@Q69UU$}Gd+HF!m!g;_2&(=9)w^5PNPe%*G!sA?M7q%LbpUX~^F zv7{o0NRutk7F?@J9xs2N53hRJv>d?%vkY$!6KwH1#sEpqtyNTrc0!)Tg`GhKOUJ(< z%@7LcTrxtJzRAFj7nN(Oa|U=u;#p6M(esE)Pju8}kNM8$$8YhYXe5FSklBpu1>c-5sS z)V*^U_!$hz3nBM*_My%Ss;et)SBOL%a85XR0c2)#Mgu1qbh^#PM21+31*x#0zL#4W zoh9|ZvcO}uP%tNFLDkzh{*f{$HJ%LCxP9qlBtL|^c|T8mFdvJkR@^WbJTttJ5>$l) zPwstrXuk>imE-|UDJfO;Y^76)GqTth(vMZPPG$iIEGlIE_tBWemSHkp4~~w;>#8sZ z!{ChcZtk{Hu%g~InaxD2uQP_$J2CrXzCbDW@thg(9cuN~yOb_>%hjVqWLV1n5@(%I{@v<0{1)Z1R8c?-agcrtmbIy&g0FO!F}lzy z6Is0v!qkQ>#FtYeF`xDXd;iA2F8WSDltC3}ofedN!TXCiL@N0{=L8a_(AkFfg>%Sa zqS#U-PP=MGJaAbEVgs<;eO;7OqW6KzlPFRgFp+~;+jZ?ma@OLwo-ymbD)O{$AQ@`( z_cl0zv8pn<4ht{A0>f*U6ddZMeapyv#UTrdVHrjN_U0oT5Nm#Dd5gSI%S1lxuuZk4 zgtPmFb=B|vfM84VecHCyaTmX+S;|MLH!ZnQrAkf62Im9{rdyt^;kCX_d~Uj(OvW4# zlR$-zrf_>Jo?1C&H}OJe(?F`dyqr8s>oD;4a99g0HH(28hZ{4in;CqU+BJn0{vlT) z$gA=>4UAVM3b^nF3Ta4{kLu$Z_pnJ_=1<6=@W^wMgK|=OhiiT>d7FPK0{8Bo_KCXZ zb{jg(IXKk1(gZzn2l!+7*E8}06fZ`|a%rF%*_L;(SrqCd_Lhx< zYC7}kB6Ry?*;R9-o#-tMT%_a56hv5K_ERPh8Cx{wtYI&cv0EF~ zT6jy6uQ&aGXdeZZ-h!IhydPC7eD=g?mr+EzTW7mpwyOp_4ZXGm8F0ViureK(S(c;( zOSL~kXGn?FX~Db=yBprWg>Tu2iJpPGeaU5WP`-7#{AD-Mn+sDV%%+OEOl0d`t*R2%g~J_GVhu$w4T^f7?B6oh>YT zoL-Uyne7775hW18?|C>Gt%#nxyQ2|!Ivsj45}p*$ZS%j=JF@`W%iHS{a=82LCYtE* zL>nr}i%55Xb9h-a7ptqmn~G&=QJLoF^xYGYixT=r;I!e`;C7zFh zS!{fLeU2*Z>XCsqp6|uq|AZiWXp|6tGgQ+Wx63a^=YF#4vL3!*8->a@^SORLYJ4t8 zfu~5^mM$>&lK#z|E5D3JG-_+%%Pixh^87we;M|lWQj?G84n(6;BJph3j-M+cjh5|N z_qn9Yt#F-&Y;Gtfdu)5p>YOERT)t0D9+7^N97TaQ!T{|yD%?VrqmM#&OK3?27(SBO zCK!@7=j!DVgvtF0JIQ)<-^$Dy=3IqGBjM0$P6bb(=AS}PD629v5KSx{#CtxHet>jK z!|)7RK~mlRxAsbA_5{2i`aaL+E;exziZI$v7gU5C<>(ye_ev`RG&jRqyZgNVnjAlW zEX0cJr^||f-OKe}Vc&oZ8ft6b`TP7eC+D`aGLYdP%Ll%S(wPZKg9?{35~k$qoMbcj zwjrmgP)g}|eV|LmGEA`B75)vw`mOWUnqt|Nn%m=9*c1j?VO|`Qer@J20oV!5gi)+@``Vf=%aMbHcef#M*%Ggz)Xgr;5dx> zLv&g^u@Mto*}yf(Ir35vj8gTVmW>%7bI@gcN{VJD5X^MGyX6Ag}I36i^R&7|Z@;C{tc-t-7YGT@BdT+G{Q8%6el~tw zjP^&qKW`l;X;r$myAqkW1?_#~dmttZm`sKVBUPLspk!h~pe|4i_`cuzo326a%5nNR zAy_ccI+3We1ybdD5f;frSbCF?hp+lP!vkuz<*?&bV8B|&?CjX-h;mVcNzH#b1i})-n zm<47f>>Sck*PmQKD-sq+{!M)DHXr=SM{l#F+M%bsq{#X1T?e0SxS+@nkD|@%UCk7~ zL!wLuS;3Ve@!S`GFQT5AhgP8{3&fv~^Wz-6^fMD;%s#p`;#{2XjpA@|54X22X>IkG3fEh}(5g+2Pbx+XW7%B~dBoB?OyI^$8P<}snVWK0JFM4uxwv(6*f_xj zcJevdJ`5QYTkKJwJdWcZiYO{5Qz+F&vJ%@b>-EfsJWrBJhcHq+>Ro- zBF;hjzQlHDSvK0&lHX5E;yv24<;e)Z#E12)vjWrYE>@kY2&W4Kk0?3fw?WCPE%RDB zHK4d#MOUPjKwAXLW_OavduUd>c^kZRK4mBrL{y9dt6n=DDg+_yh1-$8SNz^a3He)Q zivwz}w|$G?Lun{lLwmpftAuT*H7Wc%(!f{8)II2l3jdA~lLoaF09&-tYGQ1rLl8%& z7~efrBT8<$6MfEU<_NOPM+imS{)n6s_ClC&3I;|tuOm&4iEmG2om7edJXC;L@UUcv z=}Rnu=Jo2$BxQrv7@zsGy-Vem*mgikLZ(tjekyjfA6{2JQE%jg0_dy||M*4sxs|Sv z{F<`;e29jTo2C!p&TQlW267Kv5%aMjTAOEB*;CZ^JWo?=m|UP}kk#O5Pq3SHJ5Hat zYqn*&lbShjqU+ptQH+Fb!}@xLLj^`Vf{+Mm*ncBRha{b^boj|bHRW6t^ zQg@vEqmN$hCvIUdhNT8OcOqJtbj{O|qq`uK{ z+HoJ5dCXkIWaIG^dxOfvBnds*=Z_{|sXg||``UkYn%o{bkK5irn*M4c*gZWdopf+b zuyrz%8fxc!5ku8~WTpfvk?miI=v$dvAZfl0Vhx^C%yT2L5RIYoUzu+XCauM$WZSVi zV>fU`!Qflu<}c{*QBGF#r9@C-bZnJL2h2sxP@tz<6&xlV>2o9~nNg}Kw(YpiR;>&H zV31+N+h+mgW#o6$+WvL9Wdzw^Bhrcr&rpa3CMA{#%XvVbySn&Dc32k#2T)Y5bQX*r zF1`x+r&*>R3q)Huu^JYY6Z^m8c$6%76U5h+J!jAPY8s`^VZHFG#=}jq-mf&3Z>#H_ zIlv`6)?k_Z&+`bOP{t5c#ADrq1Z z{I91f(J?j(WYXj&&(z<(%&YZ}k|AkLz@hIEV-0azSEqn7;r^i;U+_7FtwNfX?T3O? zc#g!g*9X14F#Y`0AL>40C&IKEwaN-m*^VAD=DD;5V5+aBpP{sCHR~mJ2P1 zldDwa9~a74G}X9f?xuIDFW(~ZlA|Zw|Ie^T&1D;2xH>}@U_#QqN z!^z)_%knzoIVXmN=Z}jL=m4X#j1@9VMWyt{($&z)sa=wMy~;R&w-8e1(Q@jx8bE)h z2%nO1N7?Z{?!WWjEu=(8*Zq?>tcG8h0XE8whO8c1b3u){>yR}coAm~~$CR|04E{PM z8Sm?H>x|jeiML_JRJRXlK~Pfm*HwvckxUPRwq+t9Tl&Nr2j1lE)!>xALLCS8?&U`cU4n`6=w#g3SPHvL#)?Qb(ezaep_`h@X?^ry?sDhzE_9Yva>l;xEkAt zsA?*(?7&eyafMe+{*ZQ7fIztmG8J$3QPd2vTR$4;@aC=&F$$Pe(2SU`lkJVFJ~2IS z)1NY5+O%z9Q}K#{nbKjAv$}Wqbas2V4}otFbAK!l)Av}c~TV1z@jRi6KW0 zVBPh+9w{EQ73zq68jl`z9@l%pp|3{j0QRde7hI8E;ZijpY0~tq-LGdmdn3qd!!e%- z!w*<6DN?lkHi;4WrNMNDjgk3)@h$v)%Y15675ASfNuIT}E57gg-Aa$rH^J z1CRlZffcJe!fHAyk(BAoMkJ+_=Q)q{NjRDba^^i(WP%X!2fiL;1l8rRk6EU>W3qmd=_K1jvYYzuAQ+=pS{K)B|)Gkf=dH;8&k27*qs5d00mTjuq<;u`c& zV-IEa+siQ^J$J2gK|B1+;GhlWA4B?^4176^s*f4flKFw*WCDoyS;w!I7H)4nV4&N%uK7r!I9?SfJj^jtNLPaHi@KWMAdR z<7-ad2e$Zm)Bt}|d7pp__A+&q7J&J)6^VMRR>0lPHq#rM7B z`EO65TO!STud=_qzt^~*GgdpR&0I^xP1Gfkkt_b&=**j{y_Mjz)D;SNBm);14oti~ zt#&s0ttzkiX(}tYCcLRdNSO}~Q0XbOPH{LS36cc%vXp;~e+~258|H-dlDI^ebRjA_ zd~0}(QyW8b-fc#b8q21*KH(d(YpB2K0mueeJY4VUpzvk+=cWJO{jCDY(kL;<#OE`? z4DcG1!3KUY&j1`Q>ecLq?^?DbM1Jy%(x*gYs6AxcVL7o#G!_DlATwpPE#a=R&u+At zvVYiot;+V^P*ge43KDvbFsQ7cP|?SWcJxuai?x_}u9K$Xmi09eQ>)1s)2c_OA{3S9 z%@lxx(gy^Xix)X$P9ewmH(J;6k4wLoJqxNXi&Ax$eR-Qs8iosX(uIIC3hWvy-qnZT z>s>2taS}Y?de$pgVgN(a|U*Sh z$Y#(4n*yFlmitykL*cG&#of(zP}5+N&(uF`oSJOOReJy9r=+<#sZ3#4!6iHD9}I9wTei}Lwu&Igl#iM*xH4g>6Qs4 zO=Y^pPGDDKiK-0PSOsxkcE1lC?9v>pV|8Hr361ISqAi^BS$s3WxxLxg1p0hG3Yfa* z1DJLtI^HU45LsXOG|f;~uHw#Pm-NR_rl7jq9xVHs?{RXuq2>&g>3pOV_7N%2ee{OX zlG+mL%GUICApI;JX>GQ-yTeL=atwkov+GV3k5P1^fsk@UON~`06|lPfSzqv*;69Ba zP5S--t3k#UB6?({xBe_4R#mj$p%dd z;7U-MYh1)Pa{Aq#yv%cZ9AqUmm=TZ-73qY(+W8U|pB{pnM(HZ1cqH?RXw5DbR$^sm zbGJ$kj5G*QI1Zbtwm;^uI|p-6uvYb2w~m0dA`R2*X-T{)Pi5nC-gop?>~EiNDc6A2 zKi)4v=6b73istIY#R6^T(B!?s}k+ydNNIU+C>jv$;@0xmBd^ z1_Blmw2Xv*36O#}URU)HB7@%EHu4XX zmZU>u-ln=iTA@ZQj`nrxvqX#`Lo(I+5+xLQQUS_Vxhuetc|}+PYb=$b;U$XhQYenO zYRrgT`c`p&dJSh`&BEnen-RPh;5w|s^k9#@laC!{((jvKcj%Q(XR|M`@+b$U7UYv> zJVp}Mei<-{VT4A##V{A<*9+1wA^W+|%oUcIod*FlM7QC&P0IHW`hkDH*&jzh;0RAlX-h_qvBdpmX} zRA^{1meno?WzaC4^B+$?1pNGmiX2&Xnc}SNhO>8ov133n>QYiKV zzC_nwp!dEH1GS{Kn@jQr@%$0JEli~&{2A)VOpRu$WpY<~5Pcq3w^v22p&$#7+M7Iq zpt)&l@ezJ$($?Gw%(vhrh4ESsLlwr`h0Z_r?h5{(_?zxr)bY89lFiA`Q#!yryCBP6 z-wt+m|3EaOT?slt(fZyWwz9nE4IO^>Gc0V5FoXM0g>MXf5qm>f(YU7Zg!jJVT#d3?4{$qs4G<8R$z zAKPmS*37ejtK+#|gv?vBQ-k%YszB1#6q2~CJ*bx&2{aM9gUu=Ilbo+Ucc{tU$#v5 zMUpetM|{=pPL8=)0VK1c){e^c3?ef@07d-0`M;eDFN>VtoISfDWk=4h#gaxeM^pd-+F_j zaJ9d*``lS*)C)}?PUl_41pBI>yy&m=Xn)*WHJL~R`63gPmBW>*7?K;+D^jwcMg2$5 z2!ZPA=V!R%B$E;9@H{gy^_IoU^41t`JEFjP64bL5{j7o_hU!e8c)xMEW2NX*9j&Tr zc3k6{Igy!-r^J|=IQs4^kBg}sV$2yv#DY)7f|(xHFS{G+>dP>}B%UG2aQ1;TPY)SR zyhd1IK_oe5`trNvoP^mg>^;w57Kau=Iv83nb7)lbay*A&s3;ryOPY$Rr=ecKgBU@Z zubmcq4y)J=oQbnvy_;27B)nB;Vld6L*w0#Pjs=${c4}cjg0AdfdoNF(DynK8da}E{ z4EJrr4f+{qR$pFeq;fK{krgaMU(xwI1+I8WWp6sQm#zNY2_*g~-4K0v}Xh@xlZ~fkz?;0`1jfNZd&(@y^keg}3>h|6_*q44Qd}&mvE)DtGqM5zf ztyD1#KH>_}q8~BR9VY+ z2gjz{OT7LG06hH6sKdX^Gk-;)iL!cT+s^?4W?Zf7r7d3HZep5~iuHX!nm-;8ffrLa5<|9-1!63u!?< z8Y*t4ex(VWG6;w)8TI+PJ>ds^&N^4C3 zy@*9BKC{cf0$x9bJaoQVO(u5B=IJJ`v1@TOPPrEB!R_t+|1bOhwi~SN)W|5P!)-E7 z{?)CYKJi$boDdAM2TXDl(FZj+r)9rl@v}=UT{re)CvX*u1+tZrivcjFr(an-+06CW zn@fF<#k8WBfvYfKv!HR;nVVQf8@0ggJz<^CS_-ayIWD{|$EHWO)aiaQ=s(f zBn7}*$a+KdR1*mOXkeq~BC`A`k+a&f5ea20Bp^?wxDIS9a8(QMXX13j1o2kIMBIu7 zWetybED@I<9RaV^V_&)N06;*@OFjh{n;Wbx)_=ET;~|MiSXDW2=k&M}$S1tIMCGqL zr-oexBynYv+`9z2u_{(`!SESK%fKob#*v2{#DT&aHrK-S^sp%?P2=Oiq4>ozh)5tR z`ES3~w`?CJ)H|c$ICJ3P3#hr3>(!%(I>9vLKGF7=NxfPRW_K~5M&tO=OEIR1-$W?P zH0AuJnJA^a7zFm-XwL`fQbkNF+Ap7^nZVkt_ZqyAubaqU?1lsr4>ZP)9|`c!<*3Gf zXhAvrgZ7f$-@&wCVBZN&bH`Pkw_OF+p7Gp@-iaQ3Oz(jA6>;b2ms*Um6J*zY{KKmp zDn!QgFAEc%@Hi>L8Z4mjOzVu$GsBqWAru|~V&m-#F&6Xzq=!PAYs8WuXRNWYvoCXX z^%2Afx}P3R?c*Fc7@neN=ua`f&#D_+XgKnCXhA~q!*K1jfYRo7x`fscQUtV(mE61D zZnK*Yq#%;f2xifNSgt^liad!^r0== zS+X~qrqu48L8ALfvuhQ2X6ik?Y2gsQ45C$&<#ergz26hTuHVnMjf`$mTC3qJ7g+oL zu?KVu_!9R1+GMv6LNlVUIOdhQJAEqe{Y1^%V{O7hsFj2wWsD2K6rI|L&@~VF}zm$ zVfUt4){IW#At4Qf$?I0^ zpGLwV62&Qv+2*uB-q|mmBb0E`A<4!)C)+OB@V+^KHhG|ptskz%TACS&gI2laN&?C< zBb*Z7q2lD{tV_lNa*&?>v}kX`7i6kFXee**%W3vW(%=}ZL{OTUk%dd~o(?Y6BrnK@&U?wCJtPcJh`qucaCeF&C^0L3 zQAH06yMDqyO;Bvduqjbj=xq{n8lLed=>5iixxey7M#PgPAX+`<$!?L|#s}>2uI+n3 zU8hcrPGX0f_v0VpNWpog!rB4PbH$6{5OBZ#Z=)sm(je#C$Mkw~UGFUpY}r1})q3A6 zwsNhAW_K+^(6?3EB72!Baw-zhuEC;jgQ0`4VU;POL*^E2j^Wy*YBqmIX|RvVIU}4` zh8LYVzm(qNwh*7)e}BL|yD9dV^VD6Z*nZ^^fSKsbbic-NbR`3g^dS2aGoxzS%>FbP zzXV&1sCTIMSy%du(um)2tAyX*y6F43ZVS?2Ct}o||Ga)b{)c!`WHwQD#n#OLw=?YC zW%?bY9>3F_uCtY(es5P)#3zX=#~>&G{d^vvtc`e59=2m-lER9V?Zk9}AT||Wd&9i; zDlwM9L|YZq+6D2PBsGQuwjQ2k^@z84G_}8EQ1H+`X@~~lLpq<7EltI=sc252A&CDBHa>bO zZOz3wFe!$?$#KPp!SFQ47QxvQn!xow1N4CJkhEjo8|vIfYKISx zssTsKalADLr*z(GJllM6N>PDKG_De}PEQ&4C-m&)y5BZ{ei-=nA))lNJr#*=jh+#d^b?02Qj`rF>z_XeVBF6K^s z@7&+otGTVWRWp1j%XIqrR^%CiTt8+=frI*SP&wA>GsVGm+c6(C+}SZnPkg)zv!{mODPCJBULu&#GEYnKCrqL3- zzn6P#{!XhVr{Nm2ntdVs+aO@A zSnM*Tu7AW=i60!26~fWH`=&M@ZH4Y(MuFS4(D{VLwm!~ z$~tKJeLLo0pBV<%KpohQvrhO$7!WCgxcPCGe;~;(5+dnAESw3M4QEGjIML-vP7%KK zsF|-~MJq0%VLFu1rQ>vrqUUrayiHMS++zYk*pFxvp34o|-@>NF0p7?dzMWrT5D0}7 zm{)!HZd~YH5%hZtkQoVo&(d3W1{)j!OpFNk%_-I76C)LpYmz6NKOTH>YXa_%kZ_%6 z8H$8kNv#@^wU!lM$@F~)1)UyN$eZ=Di^LEc8Aa3m@`Hl@?xNP%W{iYH=L2Hf_ zV#>!(J_ko0EnGupQTfI?+(-tvFORndS0h>cTA5hZ9t~et9tplkd9}@7tKU6ET(%8M zZF6~|eDJ;Rt_b!X-_lE0apj0yjd>)O3#+kuIp8_H)S5-88Md<3V@XcY=+*4jW0AUv zLBtbgH)^SbT0K>3?z+LS6Nl4MFw|Z#0`cX`l`3cT@MO zkcT*P_x`8CYG!~Qmrft>W{tZ_m>#jDw|J|6yUTSf3)@tKbJ4GO=j@*MfjHVANvqrYD#l|o&Q9s!+_T= zwUix(uEDm_qFyKBuClF2T5N5JAvgh)__f+V5$=2 zL)JpMpJXJH3bn9>&#u3HE8)i8jnIVJ@HNyfi0me-e?CuL?rxn^G8%_fAsrUYq4?TO zNIK4;A|($8SFyV!xVZbW-`&mQdEI1Vg9`(eBp0?~*C0S}*sZsCfXgf>rODXNSI@py z{9c5>u382`KU3{S_XsQSN#U|6vr|#+1#+i zM%-@Gpk4Ia{-=X;#oQb+DUD~;@p7kb816s#t4tC``D`EmU8rp`$?aI@{OvYxExg#U zj>aZUZ?^Do8DIMZpTHmXqe?WFLNlvnBPEXW=Jxvqn1IW6gL;#nbpLz0@F0+VaS^Y7KmZcp(1z$kF-#SQ7raOeis5jkug?QD1t}na4a^*nGlRo8S9LI!3 zmE{QJysJX_|5rW#O;L1X2nWHe>1r%h``s{v-9(OQz~D#xCtQamEwvhl{Afy)M;|Ys z&sJhM{NaV#F55#$LKPzf6Nxi=OT*Nl+IL~9DBhcj2$}6pFw}-x%(9D!Il`9X zx}(UL5!`tONV}G#{!a%2_RR!-?CG4ZPpXv>k zu!eIV8a>Hp@By%8bk?UF6@&o62%!neXe{AIU|#r2KBPL2P%%Q$Sy~@P+Kd6nJTpLo zWx&2UWw=9*jeHI5dyp1AjQcJzU2L@y4HQMVciL05Rb$LxBKd?QRjprCX9?G*Q%ww* z)XN9G7y&)T>qd%HCpbNXN0eAX?V6nRk@$xp&rLlr+zw!>CEwYhc|o<>Dyf8WHhset zMW-I=Wu;i$=W%>OK6_tBFsiw*cFw~1x`nBC;h!-oOKveK#3BoW0!OjCY=DL-%Y;^A z;E=(LLqxs{Ca=7mIBJyvvKSEi_;k2(cT43nw~$%3)7M--@L?tHH%80lQ{=k=^AgtB z@FFM*&d}n+?DYGJd}zFeA0&axe+R5)t7{z`HR}@Z3pD?BO}sbo9ExpCdKbyf z@zR>r=68Tx;>s1u@cir(Y-PGwshIL2r6X}O-t(pI5pnrUd|U`kyNmH)S67yk>h|uY zD@^Vxvh)CD|wGrZ+<^%S(wBiJ4-(rUfA7V8obIXi$) zCHJ&I0~Y~lN_Kzrz1m7Ht9N((eM=wJ@+U~;$fdG!(4_|>?!3*!({AD+Vzv!V6y;S&nKuQ*FYDBbGf)>J-C*>w1qCj z`R(t#DKS@`_qnYiDKr?8#(9C4nk}tBAEjC}=-3o>|d*%s^bqnG}umV&iMgi^BK0Qas7n zn)QX~=kk1G%S?1+b5*0;AWVdy<3Co z8BB6hKqa0QS4NuqVKF%n{gPn=K4G*eZ8%F>6bi~_V9~+;uV2sV#oKKuEa6C1=teEJ zzYrx;r?EL4nVwM$lf?z%zqV{Io9s+A!A*!1a3J)^M*QYE9Y@MWLg`=C$K$=Hnmk4R z2iv@OM}B@zP$jf?4bhKxPq|YLLO0 zst2`^^D)zT;#Q%MVUl-%ui-Q>Ki`{4@t7(}OWKV7#b9Is&uTu~F59=u!~mB%RZY#+ zLx<6T!g1(AB*Y)`V;q*H0Q6>5%yO1~S#?uFCUX3I-YMe|r>`@~>^LZ5ZY*Mngb$VQk_zNRqjWhYOWu=e2TZ>#Q zlN)Ni>XW>?!=iYwnjUzR6K$6TH%eWffD>?=QyiS9JFvdlg*dWK5K$DVG~52>|tsWcemXNu^-MC-0C`2F&UihgKzQw>VN6Kst zP9b@@x{tZ|1kg(CE7GKOZzdGSWK@ezh7Cw|GVpa@TmkPGlZ zrH-92hdVdI!vG8-GD#RUO2VSrpj+kP;ilk==`tZ1a%1nZX%>2I6;b#;RvoT;8(27{ zux@c&)6=l~4VnVpr&FtA0Ky5Wv#c{^sk9aHuC-MWE<)_BYBZC_Up-t#29F^;yHU*W zb=*MeA3r#=V&%7AEzkZZKa8?XBF<={<5EAAPjiyJzps7=)97}qlmoga2QM-z*)QE% z1^u_FEOwne9foknAcA>l?%`4_?f3o0VLXS=N3i#k>ewU&N+l?n*lBKKfEG>S0{+U; z*$58z*Ai9eP4B-<<^0cg8utm?c3p{~!c)fUu-sFCJT>=e-{KLEh^fWBHS_yLlTq4$ zTT5fG=)vTBIzNbVo_)d3XEx;665YDjPV%9>x} zaTUSD#Y>G5hR*P&Bg0OtnnGqh<^^s*RYgtV4tXat2&~7I_eHOBE1_{}LfEYWqgwOA zpm0Xxd&x9I-+$Ey;7MHbT{cWc5q)vZ2luq=xe1?$EG2orqr`CE-!o-dHfskc3$mk; z{v04fWx{Wp&RYe-(rENVgk{k!Jk~GV;L>e=oYX^RMqr5q#!R`B^qh7;bWuju)%^&G zIP=jTNTz;8cGb!rJhT5R^XDoyZ1$9iz3=s8`T>F$as=)$0QR=95fj@D@1?M?M%f2w z+dPR{vzaMk7$zCiZdBkryK1yTsU03lDE+QtYzhn1(!x5gLy;AZroj;`x#hDbvA5zE zAkbLrlc0^{d_fQICPoqE!Z#Oy_`}prH)x7;61F|T7R;_9Z2c&Cb@(RP-&>! z5?*DayKdw>@<^_tZ6H{bD|CyP^&e_@QOelnbDWWEj9Jzd5hkzKK=-Ph@d@N~H_=4z zWeC@;?KHuY$eVrtg(X6kxttaasL=IvJzfO8JmJtElj_A-^ny@9LUP#31OncdNwhN0 zIZ}%_VO#yzCEo+(9i9W{%S`qv`k zMruQaG9lJBA<6dW)m6XE&RDi#Cqkh@zRiK-+HFBPm#R~&k<*;{v@mz|QNLesz-Yb9 z7~8v@xhwi0jrsB#uTc9>)E$72hoYG;Tgc^pW-a^SZv?mGV4Pf7_bjgaE=k8$_=r0z zV$k~7Vfn#2YjvN~m-Wq>0jN?aj1O|7(TdZ@3?1WLhlozbv3zCq| zE{jnbOqm95qo3rM6mVj1T+l9Z_vzfxH#Y62Q|Qpf<}#^PpV!!;gEwQLkYT={@a@ak1J>T(>8KKZB?lBgB{daOxU;Z%}_FH%lRT zhexJHJgtvaHra{yXS>{oROivv2u0c6fW)*)Dmk4}CSJ<9>J*vj;(+ z2*rX*s^+NUBj4ds?w2fJ)1GzV4AGqz6wrM8V$X0#qgIt(z_QYM zVO*05e+Md=o?(1<=+U<;MC;9_$SO&eSomNvIGJZ4B|E4{M{lyR<-huX9~xrs(NQTU z&JaDd<~0dz!5awlBN@rA)ccixHwD@|6o+dA2<(FyUUL_gf`%>hm#vFLLS88DRn_s? zl2R^*N#}wgb)XVL2M4e?0ce`YHRXoP6DR&df-SZcIuT5-27 zy^JI>mR52y7~7Eu5^zK|B-Ds9Mo4Di(RFDAkSyq;KNXP?m6)%ZZe27^$wbABzx)Ph zg&HS#dxTMUbEewua#)wsc+oLU3xuZvy;uUjE)405xchnx*s_QHGCcNXB8c&9JeO=w z6NL#Ax~X2z^mzAhj1hRHR*92>DB+e3T@zfL%fsw-`Fwn zASt=0;zUQ!RJ&|hrg+Ij0!U$ReL&Elz7z_R9$ZH8M-#;_^5+B6Gh3LB+W5&1LGXF z^36`I!E9By)_`kU1I0;L!e~Co6{6xKnw(hlWoirM(hmBTdt5LqiEl#8bc_wU*`6C0 zsS)ya_K9}8$xYI7pRrHWow1ZvA!u&9wZE~GH~`E?YgCzdV#A*IhGVN04wk?Lh>j-tuF+g&~!gI-i*E%iandbWC)pXXA ziB7!+a^8uWY0i>TJ)cJQYyW9Ifnhya9(x0u6 zdx88aVO*To_4O6}pwNfzE#ez2tGKNH!&PG~Odh>jlD#pzV#HA_R?-x$#9iqa5m2X- zF;87r+)@(5+I}u*#;nKt2n8MPqqLM`i_Oh*ui}bfiHDdqtSdVVj!sj|ZWl&Udv<`=wk6~eYPRWEs$oH3g?(bwuY#Hpmq;?qBA&!tP z>(JV}ZS95>0vipo%n?QU;1Av`j3)RZE`MjbEOjl33 zRilJu3CR2O?WML)dqjSZJD*Ytswg!&G<=E6uqu%V%Jy3*uM=6CV_z8ZlS&dCR&=p9 z-+!76754Cc4et}1!l2>EJi3^3iqd9mprT0%8(sAMKIbuvUU2hSTOLJ8R0Ftf;EPekVUrAhw9UVSY@5~VIaQYswobZ0h0t715 zR2~U32kkjFIZaL?GBA6&zytE5pt*_BTE_%<^q|H@w}+1}c)y^ZeuwCV-FsXpll>zo zJfhc+**4I$aBC;;q7JEwT?t(GcI3c+1!S3xik`Wfg?z1Xh4-kBhSVXCCXFN;W(tZj z77p~_adon2d^fnB8#{wqdCDW8BFXjyvgnSf6>RlXjhqV~>dM2L#D>7S`KajV7^_N# z0j|q|Q70yCZk@y1bJ(0`dZpYh3qgCSkmBmcUbCo{@nON+yHmm}%Q~yvJbEfEhzIIO z7yAu>-Zre+4VRHarPMY_>w`r!dqtF{5HMGQV%_sl<*~q_bxFqBGc^PHj`^l4sm0_L zOl+&|ZD+nbdGI#DRi;PgL^~!{E@rNyg0hZ@b^wbc>HRBK%8HpDZ64C3>QgPwn)-oEw;n34%il{JXm5fty&g4CpUli+PK_%LM9Jj( zAo4m}$G&`F<)ru7wdxBN3~z<=22QX^>hmTiRmew98?kH6XdiLLz;;ujBq!AGv%eILglEvD8ui~^9UZol`NAgf_>EXl?2YYX zx4c>jvood$$%ieWVGpTOfmPiv`5v7xsavz&jbnhzSt<^BO0*-?NoQgZA29)*?5XPqMV2^*}CSk<-yI#*Ix=;xJDw}=7pmJsVg^A250$0qIq1Am!E&?0xQTjDB^G_{#ZhZ zJVqym1ZfvOyN#+ERhxvWL?O{k=3cH7#>wO~n;gP9Mc?D%x&|ghLVzpto8k~yG9sFs zY`m*JCL#nvj8or_*n22MWf}jE`eXrnGie(@j_wEe@y~LmE;ClqR)G}EDz61x;X7d8 zsZQrBmH)MT8jOPJ3^qGnnp{D&Ccc(Y9tg=Rzi5lW2Z~v6K?uaH-JWwMYlx>-}ikG6?bgf z;8cmUl{4ZSqU?t4dvC4vuShE(J?YHR!nrnl`E)R2H?fcU8C%xOm~tJaFkXL}U6W3| z*VE6aY2%GxDvCkK<*O5p$>DItKAVae@mSs@>o?CXA0i!gY-a0eFr!p2VUp!g;?k0- zffTN6eQc0*3i>|(a{EqFtDFVYb&fEX}yP@3uV=nS^ z`zP&l1xH>=e0cdWyBa`%h`aXE7QwOjWFL%R#R?4pi(ntR4lBalQiR&Bq`rHT<4$sP%EyKg62}Q>Dr{ef(fSGdW!sYhIo5a#yF!I zKI`rPQ6Sa{*Ma*q)l03a_eqv;dsro)h^KSgcs8T2Nek4O)t!(zHNJD(W)AHi1;J*+ zPg`fzsaMVGSjSZYseSj0A4h9XsZ+?tOR{=MHEM}kJ8_@bEc@@GTPcd0uv5!{8>tZ9 zAPfx`Q2_Z+ig#?zb|m#3`SB-@re*SgY%IDfzUlqoqq{j%^q!D>7V8Bb|Hu7tGw4qS zR$awy_oyN_6Ec!R6k0#1V$m<;U$^1yV&fJ)fb{0+ySWD$+m*p@kTg{eh@ zy&rFCki68Cz1{iasw9Mw99UOBe4sA%ec>fS6n^ib(dmZP&gN^IE!1$|d;UlX{&Esp{vhgp;#= z%g$?q&h4J7Ee;dW`Wo2YiZCsT}bHm#f19C65$_XXF-vOPGPrI@afi6Mj@nsRh5AWxTC zAJ&IOR&mO<=zU{IMZ4`l!*$mmA6&`|?#shYr%~-Ly^bHzP^I2l%Lbf8e%U>*vWh%| zNYTeA2xysxMHjSYDogMI>W8wE%Z4KgYqz7;9roJD>=Xxg>@EtNM`VGzcGz??+D4wnmHek|$*Fv>aco;!fGOt~DaB1vl;U?jZE+mq8$52ZW zk3Q2mY$|uQA6yz?iPnPaRn4gb^6knZwf*jqzcG5n6KdNl0zYC_k5Lr>-JQhH@af;%c(1S^BAPBKyN;AT7C=WCoR zmi4DD^^0S06k5?J=Hu`&_C1wm(nR;&bt3`YqX$o+WK!1=0#E^Z-7L!*rh8;%IshsO zi5Sm`Ub^}zoWY6e?Q8~_1Vyu}Z=MG-l=~de!~FSX*jh4J++vULv+<#9yAQUJ-hy;w zWsSs+*qH5nJ$<5vz;70)aWfd%MP572|K1edB?%8=gYGY0(I& zyV+nG0U^&3jpBd~mK!=EdW}u9SbmKe52}JrC|*b<1&3oR!IISBQrs6OVVTPJi+e5p zVW=8m_$0h65Xo@pY54Q)E^FYtZegy(KAE~Bak;`FWZ?aB%j$JSGm#mVb;X1`g7WpT zGlw>L&yATpW`cJG8lpR;m5&5}7J>r%t{%Rp|9B4DA#rCD@d)tApl~!h-Ys|}kQy@s z8hLxzx6{DAp-+MMuzRIl%gyX<#Gh;k*7+oo*Tkl%O^6~C-85=|h1mnCvx1I&12DcA zP{DPtIuPTQmYnvRU%~Y+69Jwp3&F`|52u3djtV)MzCTq43wly5P)?q93QLZDz9ThU z3y_@;MJ=2LTGrd0^Bc63`6pZD<=!fdCm^nU)uDuIKr{Vv85U7X3a9>L9hgFc$;v#~ z%%KToneH1Zl)z0L)__*k37h2BZZDGzsTQR)8qs7?8z7j%+r9J1DAgoqS^&8V0Pe*ucap;8Z72lFi-zJ8^i^#Tw(tHu!) z03DHv%a#hReOgFiqfu~1RrOP-&>fs8A{T=(`yl^tl4k|!U^9*4KRZ{YdUe=5FbuXY zFq;d}zJhVQ;J8_FmzLGrEqu7seH7ve3z*JasDKj!%#*Q~M3;aYu+9@HUQ>tie~ozl ztECf0;{1BXE{h9UaYQJ~gb{ZfAloUF9Ow0}$(IB^nN?}DWsj7g&5J+1S~7|h!}iyQ zsf!v_jkt3xmHvw*yq!wL6-uRol|qwqS&vyriO!TAF>TKC0MhC(#YhSAaO=fzP4G^a zjk9^~aCnzvJ?pq(5lKKPHuGUi!S{IY$JweopK6BZ9{tI{_XcF~6dg>I3v~J2hV&W- z7D%S~1)<9*F=(PHDpo%x6@Q3ysZ+I6Ka_u&TW+|aYIKw3t5l~7)m(WsH?+E7T~8+n zznM?D#b9^xBj1lVY@j9B<23y0aqJ0xU7!x>-Ipr9l+Mt4sB?FLBq`yW4XA{z?ChgLVq9b){1=5FcKwfM35%3khck7Z z%0-QgHv{0+_)fYt=n`xwowTy_-66cpZ2h=uWVy-o0OU(JGPf&YXOUQPnz$#2@)?~m zK4$#i1Pq63YGLXSSN@XWR;G?1kx>?O+M5-m^cy%tzigx^DKP1k6FuADrz)K^M;*l# zJ?;wlVMRS9082o$zZ6SuNhsG3I$iY2sxHA%?7MJdvi<(XHWO1~G36)!o>F;@+u?wa^KNZ|HoG92K^Aw=D(RRU7f%B3blfgcKd1YUZsnbma=~y`T|7g z)Z84K{gUHURo;}r@GE8R*00lBND=g`4wWf_uYmIvmUP7Xb4E$E0PRyWqo0sATH1Im zbLvcP(7eia?>>^33%h6&x})=oYfx13X~#`GV%x6UO-zC>>@240am!lk$jXU#qqE{3 z_svI7>u+_RgL{u=7Vk^^P^otum;W=5(+zd%9}_vAL6Wsnst{x`)fMu|i^l{O!~)-k z=L%=`e9kl~k(BZM`{-)iY<^f^dI+u={2*x0JL3OuQ`bbU9twk!uQ#7Bm26@DUQ7q< z>!&iAzgzD<-G@6B2x0|@O-!Q~hmCL%)XgkXjYE}6IH`%a>gG00!&Gb*cdHVZQ=}vc zkxzFC9n~qs9i@$vCoY>2Zph6-|D{Q_rY%{p1#J#Sle1t2tBE~S_)xRfiwq*V2!6-@*0#L+ zBx~%yBmI}}3B)*(PdH0D6vk!uN3Ou_i5kikeH#kWwq!#Tkpl}v$6fWAk4h9ztHrBP z57CL)^^)dc&^1gq*}ioj{q0#SAy|(2Nw3L_-XV0;e5TlJ$87S}!*Y0obG~M?e$z4Y*q#9|Jkb2q&+Q_e7T#EW} zdP=vMWB#cFM;Qvs)garp^2}}9AGDNldRHxSGSAuP`}GLjgW+uMmt3=)oG1b#GQ3C3 zWrl4*6d(W?agweS_0Y&y@bR+)W)9|v5Mpd8@FEoy%HtC`7wH^y?;(zo^CyxFLdF`! zjRq%u9E(yYRpNPdQ{^YA1ixC$6d5poMC=p;QsprfK`CD;8-#S*EhkB0Ol26APlH87y z50>DMH5{Fu;|drrvDyk*wOS&^yw?hnac>S%V!6W=n@`q7GVe~LE{ZRs_*F2Jt$~z? zXA)*3E?K}fa`_#!HqH`q;O=U4wi>}Lx+D{t;klHh^so3+-8qIc5L8ML@0aximH?{X(L-VMySoZ ztGFge3X*t?>pHIKiF9i(o1DKP_~x~A@A55n`3!j|#JmZeT%jEJYAvr)RYCF+!Onpq zeA{_o5l3ZYgo5Bk7AG!4ytt$2TcE+ZL*|y1j>2JT^hvvIrjG%DevH^{S}%C^w-^L5 zp2h!f{H?`|@B-AIOlJxA3ILv>|DM2=i>7X)*?TslqRdRXB)`9PG=1uWIy4Vzb@M45 z*lJ+Cd$Qjmck4v`F073LYNH5BMFH-hqcqJqnfPM96zWXLE(m0zX(E`j%|}y=HgQZp z2z1-Gwi(LZm12{riA_5keB327B?YFH3r1Nb5xpTtK@)W}Rr7+ntfk`(FREpy+0}x8 z=63cZ;jKjbbN!yGx|6#muxWh45^do+J`W&3X+p|9Xd!m6s001M$NqOMqQ5;aHQ#rP zwk3NFMSA}3EahX}yBl81vFKVTzN`B?Q+9;o59GNA5{;qI`LNZanpzZ*@BbdB{#IZ> z4;#riqed9L;hM*9lkm8NfIl=p-s}tGo{)nzx>kSUwm?ym7~9)e4PC`6 zVald&PL;L^p)TEWui^4;gHoK>iw|?15%bZ~KDCE$te(?uq+C~H6W=BwC+Rn>yDkT? zjI5s4Fp(De&LlGYnDH`1jLVd$R!rk;I!jdo@l<5Gl5N$IGWM5=tBU8B!!J`W75Ah| z^pCM|O7-#`s)MpjEo``5M%E@+_>6ScIc#{6v1+Yd{g@b?E{ulxK#d?O3$>UNLy+8e zzE%%g=MzX#<*Bld-@6>yceK9jwYQlkHB#46u|wB2?X=mX1A-BgNj4a=IG*H%9M6*O zG2!3E?w?qE7dC6f{&kZbf`X*_86{9m+1U&ht1^$O)&<#Z8yG7!h_}L>GiWOz6x=Q7 z31t#ZV7*^pK46nuSp5&21*b4t@W_%z;Ifdb;uc%rmlJ+Qltk_{ZpoEsP9mfM z#Wek`tR(umxP}G_E9CsskC{e6IU*PpA}F65q*fq62XVDrQu#yeCC7n9#rwPu{b-;j zU8e|jK{Q8!vZ9&7eL+GP-?5)t3YDwdSbtaIw&A0}b}W(5b|+c=`FLStNvda-Y@!aMJ_|%@btM=O067wGpLZ29Pd(Q!(N+dd zxZ2rShMF`Jq7^{kIs;dz2*~T_1@0x^M%6GrOj{icFSft%sjwmgA0;7vHfi zdyw0AufFZk@PGGTSB1tM*oyp=lj*1KM#i18sYWBwo2sP3o#d_%F-?-q>Am$7H`Tz8 z{zFSc$)5!Tx{pXc)Pr)lI~pCAWH#C1chOX+1}`56b{p*9(S_y?6QQXbQ~IJkUlQ>j z9qX02>I!`VtvT??1kej4LMMx0AoAjb7q7cEiVjuP2N5zAO)eE%a;Q6Q+-{Z{eg$FG zai2&Iy)~N!!&`yGrR7WS#UMK>t}ftCG~#t*=J3+U!A@_dc;^0+hAYq@rP#1h*h;pm z>ezg3NUE}yUNr@g2L*{%n^m@1NXN4!*h=9<17_H3Xy=8+H5lNrZWNPt+RFI{iepZ;^ z&>fz_D}LHa-66UbZ!*HVN4@g%RbsD{Q{Ok6E75htlVfj>NPZnBcUpdRlzE-5 zgg*PxpN+?`;PKA7|MMgNQ^nmeQ2q|=E+5uPi&JS{S5v*- zX6PUJo;&sqE;W)5Oz18Hh3! zU24>EJ9~UKr5u^xFX6K4XYKiyKA|1cucZMNX_|tnD49Kh3Jv6bUi;4ATgESShL_R) zpSe3Z6(0t%tccliU}BfaFTHvXKhuh-_e0$(S4h<18RMfQm=kcA8JM_U{xPDp-1uke zCfalWQ{4-iN8Lji#ms&3(Ie@Fr)%miY;j&M6;h>&RwdIHNoZRp*3h8qTlMVfFRl0c z*gpb(o>z1P!o)5mJKB@wOTXbB%Urbt9F!tER(|L-OcX{x_Cu~Ezhr#`B1vULSWtW< zarR-8w$H7V&aZcld6u5FBkfpOUZ*7n8EJAtoNs&01oB0@_Dn;pXO6no@*giaktcb3 zDAnoxqnjAPG*jmJj`U?ctswGLOZVW8jd1i*u&LhX+25=>6*Y#s<%OX4hB{)y<_jL5 z!l2DwuGD0+tma3eZpW=m$8n;}Th2i!>e=YdewKq_R$cWz2|ezpwJOeOqW0-?sk^F1 z;$7*h>{^b3XrUlj3kjM?NK8y^GiFqcRKNCzy%eVFY#-;@#X{>mZ878NQ*E9Xv-W>j zG#cg&+V0MQ{c@k_QN{J9OO5?50NxTptwRIVOXGg8T;|(*`IIYiUadC4x1IB*Jb5D` zT6#9VH?=F3;1R@E%qtq8*cuNPgcti9<;IQ#TKYZ029Nu7HYIz%0T8HnMIjDr6QkDQ zzA_nBY&+4Fm)y4fIP?i$a(t9uZ+ow9o9Zgf05j2Od(f6Q-j#xx?@`;oy5nu|Y>PV4 zPYXWAjaEsn`+|w?tCb&KT!VM_UU!w=)Z@*s(z$OBoDn<;ZtjQX#8>>Z6IAszU+-^N zrtOxPdNg4E&o8Z9>sKZqhU?En_zq~>9d+v(TZNZwOWg?PJ>#%kP;5Ql>>}q=)3)I6 zW9I(xb8_UKZUfpC&kbGbgS>uv7~^TA#VtyHk|`9bT^fxmN9@qLfa()jKiwMXOP z?>qiFx{ny4pfI%eS%|&siH8^-q*vc_Sd+v zZMP%HOp!K1rIt17{jjLCC6w}eyqEGj)2<%i?T)~^tDbR73f=K+P`@rqQeR6geSWTY zYn!cq8&&ykvuXwP%_Y9s@|`G8s!ZFSP1D(p7*mg?Th(EVC7~6>Km~h`T~_CJNv9%U zb>)X{#}~$dkmE0BT#=K>fdt|j#n-#S_B)R+$NdfHpyz0!krT>Jx$Hz#+f+K=PBjPK z^g9(G(M{pTw$3ppzM1%^xX5N|cXs%`AL)1woMB$ZF8lpsp!467b9pXrr&evIq~1AL zM*&z9S$wq0WThE}xDuMKbZBNm0lGRPPs-6NzWORtwGjVuQWg?VZ-rI@t8~+P-mUpZ%L@}!&*LD zBMYp$%SH{Jgwl7Afv!IsV_miI6J4z9RIb-D3sWj`*&h(Es6dp~H+al$jR z6DQ04I_oAR2p2Jm?IgO|oa$G?LO|HmC>}lgr1<9THw+-`tuptbGy6heIy59U;&t~Y?zQcQOLO{>e zem0T?Y;&mEI2(pJ?)8eaPb!OwsxU5vO+e8(aO3>Likl%vZqv;B8WjW_N_A*9)5PEi z&}$`MX1;NJj`EO0vTQ(tXrjZev7t9Tyb^M`!o$R3UWExmZ1^Y`^scs9%P>{6=__9y zT8QSnr2rKB>4*kFWk6~Wi806C51}k^o>ix19Dx5b;@g(2vYr*Zb^CwbQQM9giB%|Ynk$R5We7`l7vDfUf zDq8ti7B{67@Gag*G`9ck_tUi@shl;ARRP;LyU#9-vbvp>O*hg`y?ae=FT)(N+NzT! z8D*~*e$ZVR8MxH`Q}a=U_-R3lIW&KUupf?=HI_xQ#p|QW^Aj9KG%4L<_qLMtYJVNN zIzE8dt`j@v2rbo(VI_31$hJK2%_YaijgR+Kk{<5WvMXOMUS4qqHCFl|2by^Ip}eIV zj6FAfhqwO8o3Z?*;wqoDhl;HTBc|w<^ecirz?h$|HnRTlvJEq~)*}6oRvE1PCBhU?R;Yo!VTKz$ z{d{h;c4v<34q~kB^fMO5I=85hbyGCmeds%|Wm|CO89WP>Pjg$G%JJ40!L)sJlez{G_Q4FZCOIWRt0z5AZ`OQ8$MM>Ya2RPxxMK|=^tk&*$nJF+zTIW;`(H!7d0Qzxhq~Mt7gePm6aZjDH&hDIlu(x} zH0#KYD@b~I!F65UZ}wNNULcvn7MD>%Mker3jT95w4A*=`oR#deG+)J&YJUXTak8tc zKcTFD7iE?rTE(zkkC^;7iIdwn6nCa56$^mI_II=}ui2ODqffbA%r8nH{FpX2-tm6i z3nk6|C)=OGh^s<^;j(A8l6XM20i=5cS4@ffb@D@mWpf@56~Q<(FO2$CE_Hu9Br2KG zXVj8)!H{^Z;1~)o0Hy5a{Z=ZZ+*moHqGrA+wnxU8)p5-paF;$rmjuZ(6aGJ{@K?^z z@`(_(DEWY!K|Z3z!<2poJ&C8Cg~VbQCKA+lbie207FN|A-pMp&k1py^npPjkbKkrG zvodYP;lKtl;YElZz{+6r?1w2%bdl9+J#vGOE{PLdI`%x-al1m)a>(oYyS-`G!{oZ5 zB3G{$weA36ZrVprH;snyu<0S$OQpC76fy4;s(Uu?Qq%ytcVL1j7CcYRU{ zA=P*)h14v~d$U=}?fzzs=vg`daw)ixQ062qH>Em+>p~UPDK@K*3nUOSh2qGU!g-|8 z72BUXNYi4bu%xR9AlYIAaZA;%MAsKU3ZuSjGjXERId}{*Wc_ucWl?&DSvu;y7@SWs zA~)~pl~b$7+(DsRqFcJ->4KC=KRGkQUF+EU;9{*qi%!BVmlPGq>ZVJTD#`wH;Pc4s(caTBj)T`%hc zmctOSUbLVx<>{k0jCVx@sbx1>5=R8zrnvsxeh2QlMzn@0=r%*hA=YNaYNZkuyB7K# z*z_l+>!RDI;EuBQw)`Ie<&IWM?TG6IOT)6+Sjp%4wVi7FlLAQF`*N-zJBAeX3LPOP z(TS)qoJlpjqQBTh>-BIxLJjL@Ac#J*W~189ixsnFIAFIpXB1mzaDcfL~8G4}~z;fxyrZ^71Y zM**-N+V;aMDyCt%sNtbGXXO3_U$4!HV5Y)Szt5Ag;#y-NCHgzw8i=th&qsy1 zf{~zJUFGJa374as0jd&P`HB+G2_`x;AwrSWLT*Y6o8%8RbmrZTv6~s`w#%wdktTe0 z6?TiDO0~Z|WX~Z=;8LGx2&OD&t%h=)99@BSQN*hjBpR|^ih!VYq2N^uRlMz0etGJ= zd(@;&L{nsKucEFZes)G*!q?LEmQV%7;dT>m4g49+^Q&MCgWq*qd4(pbkp(z-A6+x< z$WbdNGW_0%*#mZZQj8T}5N>HR@SQLNGER6(ng1GS*=m+2H+tqw#6;!&@?Mi_)AF8r zY69W;oBN5XWumsHmJoDrY6||2z3hd*aaq`7oY+ZlKGvr=JFvK-lkDIly2^s%pD+t9 zu|r@Es_*WQO=*DH`MO57SS(6Ge;iD&g#$tnoF@+!O@jdh2fkR5zlO;Ndwrsl7UR5i zw*7B!zXqHNodl|^k`xYAmmMtWG9lU&R!(hr-PuG8g(cs>)AHA2y_*GtF|+Q;rA99v-h)TC*ICDT-` z@KOkzRRj8Pf$pVxFwl}gUwkB^aLICK|A3e!yE|8@z%cNj|5~_ovd<;t|B0$vHcPzX zjRB2DzRDBCouA6L)o~!gu)o`(ZPwBFzvI14*b9PKvP?xjkCC7r@4(dXNx?Gh4hksJ zQn#zf_9V?{oI>H8b4kj>K2jkl0$$g1Ss=M~lf*7lF$mB*lrx00CJ~xlGLIjCO4CnW)MG3F>Wo#xxZkQR z(2LN=0TkC`Xbh2Y1EFiL%1p?mAiZHhn*;^ z?v&LwNUJ6pqLR2PD>d>0PmFdhQ9W{2@g42F3%7gsRxzFU8w?xF|q3&j*p$KFbsI$XA%Ofdhx2d_73P~*kF0?dCCzcT>bU^DIZG(Szfli9tC zu&~~!wexx8z<6CxU ztH3(rdBv?fa38sr3+VQG)(*5{^S4PzwkR_QDcGD3BG68eJVk-Nbjm}BFqsQQN(S8$$ z0FA)0UV`^#(Z=n4Mrw#3?W`i8e~tSt?4~do+p|eNqIX=%Y{5jftgU5eD3)M&S|3dC z+bS$yO%1Ih*`7Ptc-o?EhhD5UY=m?e-UMpexr**U&>yvVMZ^7;)IB^9jB&}kS`q>o zA?+>L-W!sNUNjM?2ZEejyFS}V_P$+XCr@HmZpf;H^rz7?SdRv_j-v3JW=XaHzG;)R zQN`}cQa>|&%XUiJ!1gBJ$Z<&xww2?uNx>)`?AFX|FROfjND_~vNGtR2^N3rDFj!;_ zHIFB4Eu8hRw;1L9*;-!vj)?SGGpRk9ok^NRjh1M zm=$-MY-qN*$Tr;HGYE(RUR|_fQLjMU3PJ-=K{6Vr-*>eQYW&Ln*;+c^o9#uh-w(K# zlUI?p_7>VNc`gH(XkpIyWeNfnK~?I?DH|kL1xaF&v>w~|NWjD*Ddk~~6oR#4FWT>h zQRkkwrPXalEwAtIxX%rrtcTZ|NNLR{1Gs1enkjOIkEVM=`ZVug{&=QwY9^ClMnJ8q z<-X?mpzg#t#g`|^1>9WV%w2F66KgRKV#$ls{o=P<(AC~Eu(#{K4V~3dq*`FmT6CsN zuDCrYL=odYzvsRzzExCs9jf24U4PrgJ~wg}nabv58+C`{?EHGBUvP_J5flS@v zk#1*js|{MSjtZSqkq4MUocU1QZw`|lvaT5#qk{Ecxei}q`ZOlO=%$M%EOYa;i4neK zyM&hN*b}<%jyfZHimbbTuIDVD5f}wIEsKa*;a}bn*ko6PCVYwpqk@J71+>j`1l(eQ zXiPZve1pM!f;5>;WBjrVhGci+QXH@`NLt|LL4RqUk=yCgTG|F~!&KNsMA=Xo%4vrwD|$9frpG3G-(AfI)u5P$q@$iG2{NJ8*&ERHrElkk(PpZcbJh1M$9)$ZXP!hmczI(J5rc;^LTe- zkipj}7ShSp%%IoWwwKZ{X*G_?-9dDxZSoux@R$D*O%Uby`gEaCCIEZ!N4u4p)okxW z_*Y{C3QeVnb7<$_i7(Lwt2gr;E+6H6g`*od)d&-!`v<(E%^+X`xM-qqZT+!m?CJWf% z?)_$I3S%1YI-oZj%MHADD6_XvwY1l7Bok^svg4=o&p8S8o&kbmqnmz(nD$w%bwCjO zaY@MKdY{w!R&YdpgHy`Pef(+wGR;5V_g4Q`qxF3ho8?h^_U0fiLY|dVP}C#pdC3e! zbdtu=cIcnYKCfUes`;w4bGXGKiE-T7-CKkZa`CJbp-R?p+CFK7RKf;~pdON@^;|n+ zl$&^}?zwu({0%y+0zCRW00b?Pq5+GC#|{)Zoa=C+snimhhOlGJ;ZFXhy_3AQf zmt};!W?f-nhscye?gj?V52^knK8Y#4r(lOcY0>U{uDV=G4Ku$Wq5e#&J!rKR**@|s60 zCZ$*72nn-kJ;qK4Rk8fDt(4_|-^)4G-;G82<{g_Cbq`HQJ z9RY2I;--xUPANwt7HQMm*FAc3K{=uJHg$YvIq#-ub}vXrfY{~6jESFg`a$JMfUcm* zdFgFpjmzQbjGJV>-{EiS*}CT6rZ1zU%QexnA)hVwA_*YHpoBi;Bl4@EQ*`p%@=t|d zOlTU3^bFUGw62E|vbV)1uHtK+)q0FYP6?vCreng&Q)0*G0LwP?YI4&&uL8l%-zmxX zXdAF(nhmhz>rnYGe(JBbj{@A!O4+lyQgvyJqi9#0RwYA@J~6(9NY|&OknC>96i!H)OB)d9!Z$Ob%v*>T254Xl#At9~D2~LGKR0EYDyJC#uP3 zrA9SO#=~WT_VKUs#h^`_oxZ_#zpAP&MfxSYMkg@$ z>JD681u>Asf{b@52sm`2W1(i8YHZ&v>SL!G z+ESbG^35Fc+}ro=p-9Jg`G75(d60kYDMLZ?h2ZSJ+ZkEB6s!Cv$@CN%gpfcM`ymVr zOwywOyMf#g^hRbSucx0PobWEI}lI-mMecl}Qu zF>eT}q|bkk*Y9YKO*?HfL(>xlwPdH9cFMFfbE4W@eOn6U%Jt*oQFONadQAk`y}6&$ zKKaKT>8p*_WRF;Wol@Kp;>U1?=q;Njz}mbuaOE_3RkZ)n^?ppaieyqhWi9Q8Vqbm^ zf@V6z>p9b(sQenEG%T3kzcuag>|1}|zJc3*IJ;lmH^z|ZSWrRjnPnJQ?pF`OQ*gu0 zZ%APtHR{h7NYt9&-Z)dl-I34yq-#Uwc|Qwj(xPL$*~0eK&pH4P*|_@SuenqB9rGpY z+aFlG{GOwEbH-b{-Pd5r1PQA4yrQrq*WP+X{OSYBV$=RwEto>Aog0*}olEXyJv=^9jh6Nka#t{=0Z_Tr9Y&a#G-Hm!hCykPojJYs-{r7&vLQ8-g6+ismbp%KaD6j zTU5WzcRX&T8w$}VK)*hzrVVzXe$Tu8;&&t4F>R~muT0n$-{WZ>Hy_BPQZc@FWLg;< zexdL-vHyO*AgyThd{v*yMNIbb4g}C+rdNqGgY&39kuV~8HqSOiy9{@9 zO6eGOC5JXiwAE9hdHW)L&TZHC(d05tQXBD7N0U>iN{2%laJKtdT>E_hS2x=-1atG z`S&>e2KwJ)@lV#0-Mi`r%!*C;GYcR^p(&c9JXct>p!zxQ39{~=ci}KGNv?zf)Yp}8 zzWB%G-8}3!fD-C_YQD-c%KdDfdkU?>;{Qc#u%P`9E2wbz99+CvtA0cr)gtK~DZ05n&Otvf!y7*Nh)tLTSiFg$^wvBb6CZJ6XlTh>Q{4{23TY zzK7@ZA5Kot3|^LUn9IjqYUjP>eXTG39+V+W|Ht6&9)Te}Nl_COfY{xoprG3V0>5NP zQ~2e_E${x%Kf@g{ihIS%va=8Poxa*Iji*ADzk2jmIWp!~Hx=5T!3`*iakLC#efy-&~}RZr7-^<$;A*P6z6)7ZYd zfsmEGPyXGjMHoLJ>v3pMS)(j#$@TQiL+$yiO$LGN?W9gT`ON&Eb zClkx~-3s$qfIBV4L(p~A$mP5XPH$vSNSStYO9ur#X?zbujw-9vt7cR|V%h)HY;zsAF(i^uZC<3_g_OG{Q9e%HF{2$}G z%@{U!vC<6#F<2(Nm-LZJkW_j59xS&r3i;Nqzt5(FJ_9II9_&#E4ndykp!&lAY$r@} zx$%;1*ufPNW-X_`=hdHFlO|_-?k{3^H*le`huIMEc*4vm(UTw@?HB#W_*--<@kdym zbyx%Nc`gU=kuRXIeX z6Z83a@Xe5=y|B^5E6&O3WXwtB9ETpQJd1dO_G<~(790aXy&CJgsNMG7aQ~8ahmn7G zhYXS(o5XZa+k{feJ5Lqw$o2+x`5{$LeALBEBN#{zvi%!JitKuoc_uxEb_iRr1+6MEx;e5!i2U!7h!SMuvit{ z{>uKeCnbhvSDgJNJ2z{DcWa)M0T;eEwb>)R0Ao~mc7us$nL8|0oCa-1? zkSRdkpExCG>V!g^65^#~bpvl##^EzIGK&>2ld0{M(b>&|GD1BO3y<|Vc0uLn#~mo# z&eMWDozCOimUc5_dzf3L+mi?r&kB^O8K-$0(OahqKDLq4HY{~&=; z0q;a@jcCU*gu_>tM0jya{I$R^4f8%~^B{T7GSezuR_rpw^HN+$VOr2Pp+DP-Z=b3x z(t_)7=7G1<+?w(x1>zi_8I|DfWkKAxKVwah&yXeyW~>3q=UlXzuP;$)3&SXwteK+Q zexdP+ra)xeQ8AmaC(>=~hMy!u*!}+#cYw=ejZD+c*d?oC{)r)DY%q8ZE_cn{Z|vXE zZM$+_rfHL=0@qKtlG^r<@_Y{wn1vVaWU8%7K4pUmSihLIU$@O0*O zXw{Z=oq5AT-Fv8RqX`85oU$aYy~6Cka5JNn@@X)n^`ErFYPfUC$uQRcVOkVu=q~7>96*$q23eu9v}25)x>^1zZqq=^cXf6OuXF6 z`?&P1X0?9J(M+PTzv;uXp?gwwO^6Cfn&%FTgAHyb{WX%eL_Mew#?hm!EC}l~hW1+v zf23Xk{zjJMSfM^1&%e!Q#U@xVwHVs(y0u2T$ZllexQNW3$q zOU1_8+0H8@u3bi9n#A{q!>+<7b6&Hr?{-kgH4@F5Uqz8BxAc(kvtIr&>|2SBD`V1K z#U7={Pj@|)5b!e*tKW={eeOzVjh#!rx2j4Jn|4PDYuj@V=$mNg2>q6@XAw^q zve2;o9M&;X>FnFCD7ok(8Ue`ceO4p+hNcM*=8 zyn$ui4kML#WUP&1Nh){+e^i!kj#n1y==NFBdzNv!FeXf1d<9UD-63On?0Y2V$%eqm z4kx8CDS^&`oU4J`1|pNHmugY8)6Jg2lwvcc8sIN9?CU6O!NNbn`l0uq){*}j;4S*! zBisV)NbtB7T%b0Jh(mWbHC0U7>1Oj}B7R{laHbKys$OV$*ry9vfauNC6Z*BVxL}A{wh$dh-L*CFp0O`Z=a* zYW%C6SZ}-^INJ2KFu@)Z0aT{37Vq=r_oFTK*rM~{O4{smQstT0a&ru1ZT}eSJ(;&t z@#*cnshpbqMZtgpT6bU()Nb-kqjlD0PU%b1Z>|4xy+TiUuFbtb-_9m3@LL+vUb?%B z5Of2*2GiW&CH&OtEIS`Sn(k6ORToUTVz)DGcX!Irf?UZ+ZbB<(hq{cCnl30T$?9mt zTv-D>V;ElQ7UAsKod34d*UC83Qk&9_%*l$2EU{^o(3QrJ9WKlv4=*G8W zAw?@u8y?Yi?0$;536D3LA+}>_^08l}IzHf(uXY+%tfgw)%ck<8D!W0|1gO_q(O9dG z+(4^=1@PMWTR<+YZ|NB?KF4g<1MRmz5a zOWB%QQL5phvX@HaoI&ev%8rP~V_zv4xolGRF_|qw;E;|>xxSzX&K9}W&>7uLB4AY< z@c#n}uA{6RXt>7N76 zC{CAeQUBK{3+$Mh_>~cJx`W;x_mXG@TNTeH8iR}2@0sOoS(+qQ0^rx7JQI4n7G{#{ z3Z_WWB_rcol@Cii&G5180}W)pLexlnkm+~5&yI$fjy8JNHA=TSGXo>m$han_Ggoq} z>fCHd)XqRBQn<@qfh>a~*=?@R7_3OvnCgLhvhF?O-urWJ;C8a%8{1N}!Gy@_BsBC> zx(|nX;laduigIcH(B>mqB|lRSlC znXp$f(v9$N<{WUuViBw~T!_6}g!K*Rsql;V8CV4GfO>l<@0Hfj!3f5y8(JFX^-7cI zByA)=RE&|-D}&@qDCQ>)No`r!=HJIuMQ|@)PgO1nT}5JX?0oo6(kfh}+vPMZ$+&=$ z0@kwLpy!Hcag&ole^z3j;W?|LPb1;Xr}8FE9WF&+tP{&KrB}2<)0`euhxb*d?o;u1 zi3mF3rXh=-aeO~((Dzi})A{y~!B%Lu=#euxGNE>;HX2XWDXmAyWi=5c>=H9dq%+;> z&vKYN@%xrAui|rY7Yv(%XC2FrOck0IJqzt{17eQV10YT$;mdaqz{W0YuaLqle->(&(c*RD9fI6 z>98-44fgIIFl=&Y{dnlnPqT%tfm!rIGaHit$y-RPu@M>pfskg~Y`{9n|PUu{pg1ERr4HGRz z=r%IBQLS|XS5<@V*t-PHohx>8pmQ)?w^)TNWML|%(JIc~bBh1a<5 zt-0KQk0u1M_Oybl3W=1_MRc$q85T+FH1^1+#zz-27Z7C(&*HH3r=hITCNAYeG(6pZ z;-JbAX!MXusHhV(r{!rggRn9R8X7cxaYN$SPKOEi3BodM--|aip0Q7Jb$#V*DD;De z|IlFz$%AWBA&3lE;o~%No}R@2JIZrA-;eya_Y-I`Lmikx65j(o?L9OD*`3j-$))Tw z#||}$5|*RddB?%x$yvbP_vuA<%?=JZ;Mo^luA1f@k+-=`xq&rCByoj?Nw;uin*;3o z8YpV78wVw<%gdQCHifw0vPV7}?1ufnl2!%U+ZDwQD)8QDlI_ik8}!|h$`=|(!WGs4 z?U_9O6c}VE_X;+&Ez=dK`Et!@MHpcvP19)#x%jZ}15cnk@7DSz?G{e4qY{V387hL9 zUUWL{oQz7C=EwC~%SaSIwe{%QR;B($*J%B~Pf&b#t6Pt)&sN#)q$am*SSXV{;m-Z@ zY!)5-;hGO^C*PR-WT^i>Visd{dhF5iHjxO><53I<*mq6Lhhv;jWFxsC{vQ_tNcT87 zv4x{tNC!j1z7RW)0*YcQ<-1{xKKO{el<J~wzP3+hXvlDiP;-Qdj2yev1zqnV}WuvpH5Lk37IU1T9(d`7J!@|#CaK#7WY+-ma za}e3|pH;poCGxi>`C+0gi8Q&8PJsUQY%X5W%E%MY#71pXj&MTy-0}8uE0?S$KMnKK zW*1P*U)=Pq+Qbf9JNj}GI2P?&xt{ErZBr5Za>{mKv` z^s+i<0k6=(6X=z*l=H_N&+X#!JW)suE1~beBjyNeByRli$uFK4~HEn4uPn$ z%Cg0eFUIVMJ7D|90>p5i98GPRgBHa-j+oxmPYOl~k8D-X{t;zaB@kY|ned+G!g=8g zSHv;CB>!-DH86YLH}M^5xyf$+9fq7r!m~KK?r?ZGhlO%1mhh@YRfLkb+(8`}q!^XI z;E|6;6{W$!SLlWiI^>!B?xcS`Fo?^Bf&V}KYl*as$h+j1)0(Z4cs>w zX5O2M`qGteShCOOzde$FeXrU~$-A3s3Cn{67eB%(fkOp7_IaOYd?)DLCHh|OxTLc7 z2`R7(!?=ALk6|-7M65P8!lOY7t>JZdA>mtLL}wZlSg}1m)rq8g8`RE0z{JG^=>A+b zWX!fpv@pa>$`bt!nh^B*KU_Px}sYb*R@xdSSX2A z@zGq}*#En9VQo^OYn40kgro1YR5wa*2_RajJ!A!9XPnzK&7|0+$S=HC6Hw_RuXD!- zqN1wG_g8Q9b_h!8`1uaFnfjH%qjxJ-7&r{Lj2#6|d}y#oG&OEFGf8R0NjocbV%hNL zC`F~SS*GB)?un*}El}xO%c7*fuKT?lInrYyIuS#bvJ>T-l@+VMz*nPN@ltCD>jOIDSBnF|l%f zQ%`NZA1F4bgHl%!C8FLy5w-_xtLM2?Z`Cr?>=TflKL-O!F!`?Ay-x1SGl;`D-{%IB zKcy=C7Pdr12K51`@iEAV8)%>C^xK6->%;B!^+iBIl6m~&OJ2xtYYJ)F{MShDL`OAN zQ!J>^=@@-XuBW>|>6m;vTV>n)+hpH2-6Oy_Z`GEn4%SHo3%~Q0BRxWrM5(0cPhEMI z`^DyuU%SaO&ozhb09#n^@{K791*^J^!Tri!1}9VJt&Q*{Sx=lztyl4bd6fN&B1S6H zK0fA7gDvR{?@`b$8t1)>x3C%#;wRrsTNtdEbc|hL4%F^wONQ;D?N|MWcf94eNw=4& zd?B2mbyANj2(8XXi_?dM1B4aIw=7EXqEwIv zlX`*1XkF1`kix*A2BW&@Va+wu)r!Cp-QyJaq^& zaE9#$hv+q%;Ws$dkiveP3zF-82U&P(-d)ua5`k^3QOzICRO|hFZs(JcOWY9z5ACQnXX763jnzuYB7YRcU9k<&F5=AUfVQC%K_dtQvrw9~Cy!5&@pH8-oyfE0emDm#*%`h@iH#8TQ&MbRfLl&$$RG0l$`$PbSR-=HE5`VGxE#5 za8pAB9Y}?f3i|O@+3T+oRrFoT(6pa=WU9NN9)T8c93F-{+_{dmB@7yM6`*NHfc&Lz z&vmQEjj%!-0vOHYO+?yigzEL?P@t2fM_n$IZ_v**R;+p*RaDAlE7hUFP@#5tCm+Zu z-8T4zuzEjo;#>`d9U@kXx@RShcO5RdxU16>#$pDqJ~rZA$R-G!XAQ2bi_+M5Xd@Nd z2DMJCM=r&vt&imvl^~Q7?5C`y9_MB5ZQG|~TPjc%d$l&8HFych#7_x5T>{hb(N0kBcF&0cNx$iaPCW{Sd!ju|O4)!Lm z0KPfy&fFpoO^|J);ZjmIGC4`zflO4GRSe&BtYI@0rg6EEF~z~A(5xur=n~;erXEQR zVJ7_*B}XdV<_q7ODBG7-BT8hV)+Q~}^`~LjF|Tk2RDOhzs)x!iq0>`5{qd|R4pVeW z7r${2(v)YX8$U$YcsqnGPc}m>G8r_O*|IgK6{_HmkkCy>IMOEy{mqQdZ;t>cf{2o zdSB{q)~-#(d$vPa0hTF@3XYlp+D&1_x(Gc3q?(Xz46NmjZR;X{n&K4Nwgy_8(Vu zRrYh7=*EQysI+%IY#b6bAe`0W6IpT;MNgDPMtq4=Gx1}sO%i}4{{LjdvBi(zW^fXz z_m10v+~D2N#r(otIcgeB#yAu+!J798V-C8rsTJK?km!>NofZD!4aXXSfkv73Ny9Kk z@d>O^-nQ_mLF3!C?Z2{>1Nv;1sd{g5@B3JrK2Gv01JevL>?5a%0nFNQ6^$Dm5xhQDLNYf}pz+S#GSYw5m6Q zV?;Bp(1>QgEBFsGY8HCHXK$zDSXjsc!{=JVqW=;)GB5S#9AN2*#BS+~?7LW2cK70P zOcI&`!2l~p0{tSwD9i-lYWtQbzeu!>@xoF_*5EwUGt0b-EQ-kj--i7X19dU7oGXOo z9esu@+>W^~CesbGLXd1j3?h=NXE2?`XnCpoyud4|;!uJi5aAn73nXd=l`8n24DfVV zc#YcCIaIQ;j-qn;v2H6Sb1hHn{0H}zJ$l1&-xo6GR*e~59qkBY_YpFf9%V&Z4gJl^ z${Y+?d6Fzr5O8{L3piS1r*j|XtnSy0vxGk_y10Bf%p|z6@u6#&#wS2gMSIwS3`^n9 z4K9qX(xRPlXXS`gOR?Biixl+~iS3K_BUed1q)z0%LWJCRihWO$oHfofnF1MI2L8ub zivdOT%G*F0!NshTbN5=VH|jgk$E){cd(jU$%}tL?J~_Qo6W7ik`@asy)-&WSw`nQq ziuNNK9N8Y{07kALq8^;}a%_1+) z^oW<3sr^3RWJ;?X#5N4^bl({>Dtk3{&JThb$3dvS^X1w$VAL9TnDr<@@l}-R$N|;+ zHfyl=bDzTvE|ojh?S7# zr1=+vuv+1R+T^v^5|W!DW56H8Y4_RNCw=?G(=P`IEtj=@MbJg{fp^C#AZX?8)O$*H zXOX?=Rk^v;(C(3vJdiQ;zB+>?l)@APwQwlg`OF;XdaN3r7#G$+q{_N?*PfEG}*3(?kxbI#99!P#|3G zxlZ!j%kn?2SZh~`nMkc{f;_~KWV@%_NhTv7Rck)2j|)o6F62_i28zpo$A}3aPUT^L z9M|s2?}k~qM6 zY2;MR*RXG9r~TjHP8Au;UXH#f-nOeeh}|A@13@H_H;&qz-?Kv|;<(BXUQd6u9i6dt zV3J^i#?D)Z4?;eKxtrL)cc^KS@o+&0DUwe_xb$z@kxG=@lHimm^pH%Y+qj)JaCRBl zP|e_Yh5sVuG!vIx{g5eRR4X&_AI-}>xo`7M%%I(q>^scgEPeas(Ju+PL0_3N8iXj= z5)carWySsx9s_=tVxKEw;3rW@4raO=fG#R*wS~N-%DZfe2-<^=J@j$+DT-fP6}b(c za{i)dg)~j6IL4IQbIrX=4b|P<^q|GZY!?>3a`XB61W+BsPRAw?2`Yyc5m$vx%uI0{bAVczZS*5-2o;Y2D$z03b7j0zfYVXZf1p|E}8&(gc(Lj59Qlbh2DM32}j z{Lp$Z1uL=`ZnU9jfmZL6Lr-r~i$0yLZbdkPe!9;(A0{lH>V2e;u4)IG;NR8UIlkq{ zH3+u$5vhSzgMwjKYUMfG6fgrM+TkwRG}wY;x=mtYSJBM=xTc>TH&iedX z%64YrY`ct{z@1sZWlkK?A1D@q{$H_bsViiX!H${A|6@+)zwO{q|8`}Kc|Eo!9YblE z%6qSd9l}oc^z1X&kjQR+0vSna_!;ME0C96f6KxVaora${$WxGpCl^RA<~VV4JHx)B zlJLUq3y_?HvrIb5r^Mx4Zf;?FP?7Qkz z0H0v3mkO=)>8$x_E}QK8S`2cA+g%L%Hs(`}Oco*=E*i^z(k>C0J%s(NrirQC&B^8F zl@wx2u;!kKn{P@6uwjnqw&CE$AdFCkw(tr=izP~+{=T~^Iz&#*j~_3)bQ%W}DhFu56_psh3eLKZpn@_nR?(g?~!<6-T z;#kE4Ek~cp6d=^JOM>xK*aup3S&KCManz4y*rot5aR733!2Z)n0(?Y1&ixUQ!mCT& z?N9C0ne7r-s$J*dsZ_ZVk;7^qG;9b&s2l#!C8(R5BkEYCa%2{Rv_jf@kE&ts<I%44LMN8<$%M+((E zsa7N^B+9QJawufgx1C@rhEVAkjcFg^K-&53$4ypcL5aJaHdts0cQMCZ$+k|3rA=3q zEu2Fx8RaQdT3YuFq+I_)0GI`H3^xAZLPL{q&6Wy{>5!w`8~vKKNjFp>by=V&r%y?a zMJ~A{PaTx}SsvQy_RKJmp#ohRXsJ`KB?q~ zrju~3y;Nk3w7<1!x~ldRvv`M5*x*ue+&`i9sG+jKROh9QN7n|Qsia6h=|!$1&8h-XIT zH)0ucr#mZyRH^PhT4nR{28y%VeH8VB+*;OK)vAiF7)Qme`ii~X;6gfN=%HcfZ?R4)pl3L5#$c&JL2vFa}Q%#?^uE-|=o&xn< z!X8wOWD~Dci}#6fn$od%s5e761aq&Plj%sH$A_Fl>nYm({$rqbTDe(;fnsO|NrP@8W#?|~c(hB>I-Ty#*a?v*>di1bidnrs5yU)$ggltbHiWo4s;0;ijH$}By4KW(AY7GFtQzL zXVmny`qMR=#j9{62y^&2h%$@PNcpk>u1rdL^biu|-X@C&2x&MyfTjWrAc!{i9cmESI8b4&|6ZS`2Sn6}f$B|^7bxrp3Q6#b>@Byn*F zgsapiRIXgOftP5?5!z`JFW7yI%VqVA#;y*`l$>%Cn=~46Nam^}po>I6`|sen6{b>Q zpBU*78LQ+e^@?r+Nly$(WKpG<^jA-;xi2&}42njVyQExd82jQ+edo=3hMpRX^CuFufu?|t3D-DJ)yQSI9!w2daC|<@8y(!BY%eb7{?LvFXsCD84EtsKpFCs+E*U!v#Bb1MU&l{n6c&qVLBHR;T_ zmNZMM5hHnf2+~1LoLMI87pjCU*m(*=JDa|QBsGZi2~~n-Yd7TmYR#vHIaM)8yoUO0 z%hnqoa*$e3E_eG&6`#XB95QJ60VqT^_aH)wBQs-MkFKvmQQyDne0zfCv*E(>-KTe> z<5uDLY+v&HmzHY>EXkU&P!@~Qwo1uuFOnn$a=3+=s#}n7u|39xn%!EI?Z_GA)Uw3J zTts`@)r=^`&_;k&LQ*@erh05y>2|ww0}oiW*Vi}zf?kL*0f{k28v5t zkhh~=HmJxXH|TIMe1D8kD8IWc_D?x#Y8miNXFC*Nf{GLr_mZO9ca zNpYV7Th%3p^3WIy2TG=9Mn2PxV5-wnzMbYIE01|p11L6o8{)lSs(lRC@!Fy2KU0KTW~~$-=bY-MbUx^Q@|2DWF+5LL*J2PL~8Sfd($Q zvw`ohH<_4xqm;6adu!8ZSX*{w|5LJ4z@*c$xO6b1MwyX{1c@VPSt9)B<5y-M6Q2Xh zUDk(<29ImzBF3=s=A6Q8*x2vB9rt=uex0DOQ;lJ-R{AaQ41v?W*kCk|W+YUIT5OAI zscU^1c_k-FCa&G7{e-Wur-2Q0vRMHfpi2F^W!mJy>anH+d!j74wX0XrA-1u33r1V1 zKvA4DG*%x#d^ryIqTah2Tzoe$kC?|*?T+|RwX|L2p@OKz3m0aehS6D0{p6vOR7+DO zGIGGHXPrfLrw6=anS+xYq zgZgj^ZYeHLqR2Eu6$Nf?8Bs7uAWFbtE|Ry{4@tSZbF-8k^K>&}r?V8*tE!*pG7mV1 zsSgbyvwOhGQ&@p1)iJasS)C11Ga9ldk<4A#avDHja#<=<30a!NB@FF^4|ahO$(5(Z zk)>)Fa-WWq3T8je7{AOGGbjQMEc$c1PIuhNGuZRLc;}(SEJZgBIZ#iqyq4JzS9Qj% zkvYBzuKf)xmvBu=M(ytCyVPCgXgBpL64Bi4su4hHu;x-6v zf5nl}s%_yl*&BRL2Tj|BOb@Wy*vs>Mus?FWa!TGhhZS*7EuZ>|qZUC!xT+vF)d=ki z-^nJk#C#CUsJ`!mq_nkx^EQDL3)D{a#*S~z@^Rh_kAo~Hn_CubaXQm)d!nJ$0O+o# zt5H5ku)sg|MVgu<2&(#7gMzLq`CKA-)=v|73bv-Ab(TosRe{cv z1Wi_S~qW^en^Cq4%Fxya>swm0KVNAMhx0q0z+KtY))O3=}CUnJtK^x4jO8&X01QIG(;4Eq7m#W(s<(z2-z&RY8s&%iwA? zj4u>?gwR`4j>^X}j|-+*-BPUo9ro|eQYn$5-*ISv75mNG7e@iD*7rOKwocb6s07*w zc908^eKN)UbRZSSIRye))Rjy<*;||r*4fQv5reW`Ha&&eMSE_*@@O({@m)*oRY}*I z3-v2Pprq&K3E0_*afN9I)kHy^E)!e2|m90g0 z+uLEid7B4gLCt=%kw*>vDv0@rKcys;AlO34;y&-*DFkj4I@Z9jkt!z#vnje3CK)W$ z6m<`DS-vWM9 zRdz0pkvX<%fRZk39Voz6&f8G}Ltvmqtc8v{rFo_n=*V4?MZ%w%?Hi&Wc+8_j(>VnC zJ>6#u_x|GDjfklnW8HF%m}WR0j-~ooA@9jxyWjX^&v9Afe8ZJHTI`ep-VDHAqShah zG7+hu0tSw+1xZr{Fg8yEiaM?VmPXmysDurlK^y4?Vu_7D|uVnBA?u^f1VmxPMBmdxG!TzJv0=N?m$`!Ssp`uW*cAHF* zJY{XlbNhj$D-6EWDdCQG1b5sjc18!L94e%fPtDJ%(zfKbr-^vYq0NI~Sr1)4@B8MS z?)jhXfe@z;h-frUy6$tu_C%uyR8)LO9Bb!{T@meY0%S4!Yu=oqT5cz#WJNdeVK%cN z+v-c&Z6@sEsH>{Rs>_~1aGNzC*hT4-1kDw}z(B(7nulxl(Z^-dKs#}f(#poJ#QGzh zZpRiz7}mBAqyNdc+*^TCYY4qEcU7H!J6hZlHpE~mbr0B$ZURb%or58~uegkQ=Oc`e z`#;g{9huPWu-8C0wBsV;<;@nLay1CccgS@{wk^!R&3xWW-1*^Qf_(anZ`N|YS>d|fnCUF{PsUOfgwM1sxG zng!y+uB8yDKbpkLjWAu#FfQuaFPk-TetgMd~k0 z?Ht%bWT>|*cQ+lHih@52R_uN?7YaMpQFV`pbc!yjI_Ae#)d|paZ#8H(sdPL*_pGTD zdE@S92;;63$5)vsSHQIZFU$&Z{*}bpZ7w1tFp3!bw9HE{f!;#iO@<8__5Ew+Gr^YA zVCXDd^E_)DCQ^NhU3yfT;%-v|N6;5mNE=r#jBzUOrUP9NT=3U4cX}ArL3@@ORWQSN zc|y6Il!BxZb1*VCRl*#<3qjde`S_$t6G*k70?)p_2)brq1)oUq!LS?HW4YhYZ6%Ai z_Q|=CY<%&3j|BodKaH6nI)W@xsPvF3C9xihJLKhP0^yuP7lJC>#ACtE#3Dh+TD?EE zNZ;(Tlt0Bm6GQeLqW|5~S*(io(JI0W6M6Fl9%w64dT4&U?d^~3PLL}IPgkW|_lWbN zsMbl$FL_C_B#$F=>K$jsC}R}BSDCxvt^*g$GpM~{1$kFC@Hy1#!?b(mspNIsvF42torOrynydI1;OmwkiYDD!~wFqyTr$=ek5xUE(d z3`|sF5V3QQ-TZNQ(>xPOD=^2li;#sAEdJU8JoDftUaUmnGF1I$h$U?bZOQ#_?_J0s zTC0H+<`K1R5KNdI(WG-frSAGuSf|RY5hbf=&qUJ4RlB-iz`<9KP|OA$T=DpW>Hnef zDqzE1$Goy+mO-NO+cdnWCzKW4P-bU;0uFrz&WW_02ZBc^t&1XzO5_S9yNh0mEPmg{ z?7!YSnTByWv~sk{DBo~d4JGlhcksc> zoalQ~YzdWwZ|^&HUn`fbO+wK9A;vI=utow#uswx2ndXSG-u?;gbP0kBJi7UDa43sZ zq|jI)d06QtM+R-vk(%MtO(*z0oTWt1FDgar_EHlcZm0_D2?uNf;C2hU~XAuaAfv<)!5L^){&S| z5+Jy7FeBj4HD0<&|LJr&x{ofOH_%{L0n`OI9)NMyY$Ym_u%dW z@+Oi{#5T7{g`3OIxZOs0s6U;4gef_c`}p_G@)&c;jG^DIxaq%VfC04=Zl(ttP?d^r z*%K`ODHg^m7xwq;aa~8AZ?^D&oc5Z7dmThWiwHP#cCQeeiXIe085;tk8hyOwf;XPi z4=VHMPGJ0|TRTl{pE!)U#a$OF8sLqw-do-p!iA;=iSYnET&W*>E%8p#VWeVY{}YP6 zboLd{!5rCldN_4@V5$k)dCyMB`Lcboeld;{^Ym%so=Q8{J07O`L6aqec3Eww`9OLc zk*?dcr~G``Jb$!rzpZ%`ztPHeG$OXCw;AO+rg|R(l{&vm@Lsc&lf7X=;Bg&j?#|pv zBnJ73h)5OO)-J;LkMU6dO{`CfOJmW=>K*DQs1ylANOgHUJ;*bHg$mKF93;L9@6GfE zN;z`*2pL=n0t+4RiYIUUeH4THbH~VG=j%Y<77R%KrxEwKs`C5lIBnKDwm*RXsu*y zBI7uz(OdCca0^MC%tU}w!k~31omh0AF}M~}ftI5bXA1o>FKx3G=4l=@ue<58PJF?I z3#}dHwu!4}ziik)?dW@{Uq|-5H62xa<&tP=a9P8a3F?bW7I|+GecMg#ZVJh)zwd6m zk6f+NMY`@Osf>UX%Pp838I(2-?8!IDsIfo=v z*O3=c$n!UYz0hsfuc&JrBVBhHFY|ic zpLf(y>qOt0BEE~RKj*XWxhpW%`ui&eFW#@~QPL;?L8RBaV{ifO&KO*nhl`PoD-D*6 zhi>e2;R_>2-pCZs$xUQoZz@ElU0tU7Q$q0b9oM!kj_P;jQe4$mu~*?n71L?&blpa< z#R}zVLS@5r_9pzT+79v)%E<0k=o6xjQ70YR1V}wHcZk7Q`%&DAATTEdy%J6;-J%{8R-f zl%*jwIOb|yqej!qorOdJd*PEK4?2)WHQY7&x@$U_-d<$H9*FzkKNGgmP`=bwN#X=#1NKS%!aFpI&7u8}8dTe@PnT&rb%SI|ZPHEG0fN$GU@OY^AS*)m z-kY;m0aLHMoGN~WTg@&(6*QQ!$pdyVf zCK71j>bM+V=W&X)9}9XWXgPGz%YU2Ga5^7~@uX|$a@j$Mk-&sk+E5PIy>x5sECPE&lj_7#tA0?$f)i37bLjzUcE!4VAs<$-f))=#pb57+aZsWrg< z))AF0Hb_-@^tkHBT1)t%E+s-*#@vZJJamVfAx4UjBL~sle1~`Z$zOe<5Zi`2BI+li93!^A2o*$^8Z286#R~tWjJ32lPQaMD1#-Jp*1Uut7&7-g> zQN+?&pIZ>Qv#he86cH2IcGMv;mJIxcOYXm0g+e8n+mfs)Xn){)pz@`OdIqckv}9orzkgVz%-VE!yt@%iv-a();w5$GZ1?}V|s zTckb_$RInNMmZ9d`VYsQf-&G3RGvefz=+j{6ex#pUmC!cJbSL!DaOsJ8_LvpLJ2I_&JzWM*kZ^dr5l8c*=!#JY1B*O>DP z@iUd_abXC76#@lbSq2r7&Zk-O9lZhXr^{sGI+wdm@+HeOZ9GbCGIPoN2%pCW5Dlug zPxW?3XT8vRrDD$NXc0@eWH8vZCj>__C|Ej0475G!8|T`#mn+;C#Y;*fdRE`m2}Luj zJu==LVvGg=nx3gJE9&Ixb|bQbZtivXvP-HIDd&7%% znZ&rleAXf8Z7->497jr!eIQbFsSi4!OP)RgETi*1o&gu<*Qsu)O0R~$Cj8|4&@sKZ zgPod0hHoi66IkkiBm0$(hwmBRsW(@coz+CErlX2nT_@18v$Oki+3|vFXqV{~y17=m z_GLv9JCL2zKB%UdX-Ey3DCJo{p?#vzRYW7dI66Be0{#|jY1~vUM0u>0F5&=y6*bGrJYXzrU9uF$y-z~>TZLcv8!a0B9y z8~yvSXu&#IQeUMcsQd=LLY>g5`a3ibq>5dGzR|N<*vW0lz2*0?3ulz&6CBOX{Un16 zf`1^u>mF$Vw~~)WtQu&zqeqq%id0grI8q8C!h3pd+JgvDL@5|9W?TF;iKub)#79Q? zGw51*YI;REepp3)=Gs0+n@j=Q_`7E$KdsrN1^y0sM6psP%?C-5WC9DX@SIVW zjOhzdiFw%Qpz4@F z0rY0oHim!C8P9z-oV8D|J@HSR2pSiVmik|@h{F9D4~|-4-gDGp$JR`jE~mG>_6FJ0osJ!qZe-`3RCR)?9{R;@-HJP<455+MemS~v_7HA za4Y5-L|O%9!f3%;FdsK(M{%nr)`%uvs*(=9vUxmrJH0^Jr*+-W?jt9Yu7#1EXni%g z9-Z)xia{;68wDZ*RL&AHxf~2{G0^fkt4R0sVm~>x>P7BM_3`l*;vjos=@|2xYT+jr z5$MP7*#FkU_G#Wc)c-&mGco;*gyEyN&nGAFbXbaTuA6vlRN6Uc2em&{9GReH&GCBU z7E&~R)i2HdmUli|cLY;*9b#8DTZ-CGx9wVbf_UvHGwQsm8>w>&jde}kA9_oBqE()N z8Wz`LKd%g@BFNqPR`D9a~Xo|kO!*pBK{EZ6x$Hsg#{c^L( zJ-2#@B@B)w_j}KY_KqKC0Z8AeD`P$74u@-^bI5Ys>Lp;G55?fNXIJDtLobZP3cToh zu$HB-U79p~+0+{|h6+t+qw5WrY#dTUbQ+czZuJLe!D_9caL+!cy}`+l{)1Bv1iGFd zsbxheW6dyeMaKAvspIi#k^8pYzanL|QMfBo0iu(-rSPJLL0pQ~Sa+B`C7V4dcg)l0 zV4TBZjG*iz*g zQK`q2;R{#)eMIy`xv$d6hHc}b_6MSBgZ)A+8dN_kT-Ndv$hEIo3&slGRF(24i;m7} zlI?JA^p*(?O%<1e<}o#j-i3T12Z_EQ%cX#x)H7sf-Au2W*r0=rNp2E&L@~>qcqUP~ zx}zyE>d)R$LGOXTHwnJ9WD>kAb5^S-wLx!$xH^X!(d5jR*T-rtb!q&x_HE|4MIjTCNHu?9`A6eXuW`bXfU;FUCB)mwS6X41agYyW_I~e%==eX zLQ>x)0LFCZIb(-iQ+ngqtNtzVwugL2Z!1}Ue&`l}uB%5p>Q2PHRZE9j;m>%Kys=%uzeeKW(T9U3b^ zMPWMlqM3H8HbJ>4SK@Acd}So1AIU1$0xcowY@w=(1DNOBr|dQgd%H=BTK2Tw=jL^HZh^; zh+W&RM!7sy$S-PA@ohL_Hqq`<9n-HTUDO&9SKvEf~Pm-n$G_T z+iCf5(W}uj3Vr)Q=TPt~+|b3wzlQ(++@-uYB23uo;lB!CLGMT)s$h81P$PNHPxr^( zDKI%NJ}wz4q-vH5z;+)(SQrF%V2D&|^8^>ei5U1j;rCwzLoe;rvEme2x&=hD4j~gW z0yriIA+Dyk=|a4bpl&BkMVyqa?b#&EN~HAp_RLp{*y<884R?rDIwe5?3(9{@)5Mt% z+Q**S-{GIyZSHP{#EwYBu`+7fN!PGFE^xL3wOx#%Bkf?29ZDfa>8>S~9a zXB=Zmh-VEo4%m#6CUD1j*f12H+HeF61ZygqpVWs)~;{e9Cm-8JqisMWuFI5NNg#uSz2iZ0XIqP0fm z^`eq0538c_s&xOMpjG0j%Yh7zle*NtVzs7|DGPQ;&-;M}QVLQIx|j&qaU7NHmf(u* z_AuzFeXIdnqP9J%3wy<{YCP3TkXX!qo`A$v-B#@!GR;NUU&J!Q8~^Z}Y=@ICx2on9 zAr_SwvPl1f1Rt)nbDHmfk3YF!EdZGBUvH1UP2AZ^iVD}%qohgHv>9@?+<;D|ySft< z1w5RIhBs%8#wNl5QAC_4n$NNtt!QWJRv%5#tkjC|=5Uj8XlGH1X3}9QEBZ+en{Ddg z*G}VyTZ6saY0kwo_iMe(1d0!l%2>>=lMVz`S&@Ihq5CL{%D=ME50!G4pG1wECup5j3F{-)UKYPBmo(>p}4+K8L+v{SKQ#6)(tMOTt}UraR84{(68dnyWSXsE9YLAC0ZQ(4R213ca6!DQhO=!lVy`LJ@npJO_@yf- z#i0;YOv>{6^TWYAyAz-p=wUJ;6wP)89+`_(rVCm1W6rkNSzZ59O=jT@2{Ba6 zP9$q_=utzM?h9K90|=|(-t%h+6aXTSf)&1`^5ZMGZr1Y1NG+l6c98%G9Lf2BM3a2a z?j|3S@BcB{-y8WG^~4!T&6nM2N{Q&Q%Rkt3k_$N`7C(me2siyy`y)5s?_a?IZULr; zZ6w#r^$G=zELd0L49MDgFFf~R`Kc-P#CECkHC zl5-ab6jvip&qo=;w0Dbf94>5S>l$e<^y~yR(HfE^5mFEnxm$roA;b4-K@p`Z^4~(M zK6_eq3l1G}DrFoufjr52l!aZ9>*kZj?HBhLv*b7S@Jgcf7GDY;L_-))_Zz6fu zi|4>hV;7^oyUF^*F|Tf5hQzqIOjpLVHWJK?1_%T2T#;-~w&DwR@Qc@8eJuIfdSHf6 zmygd>T+QNlu&Dzz+37q}h6FvPCD5?4XVv)DyB*vZjF|@Ss*e;uF!YL*HC1Ymo`9oB zrg^%`Q?>pK_A2w_XOwcJc$b$u9#&vGbVIYzD{<~7lYd8lw_^SN&Pki7B6uYwv$#~? zOM$q%0Hf5nMHe9VVAr2Gm}w*d5!Eqm2U1QacWVxHFB7wzNW|i=Dv5CpFD_B+{ZkzX zZ|HiAM^T~!q1XZe9L~YCI{#IB>Qrpf4D>Y)Vfh)FPI!ACo>tu_+1DuPS2ZF9^0}-+ zODoKjqe;`SkUn_XR3f2AKYX}pl*%sFbt zZH01$Xg2dx2!??a7dSwA-0 z(5BjEo0;p=m9u=NP;)0NpdcdM#S$wSjpfU>7I1r%KhhePKJA@N0rhk%p;b|VTUY_^ z<#<65GROk$Hn|kl=a3Yr6Zt2@TUk9SOS-}W$Z9{@RhQ!kr@8adWpk{(3@f>vW0eTd z{e=nBf*vm}8^;S4^)jNNIZh$rKD2#hI;SPN0lD4ehf&|zo|!=sagHu;X#;_h{+VX0 zXJAYX64q%M0M3?(%!e7aH&$>?vlA`K{gY%r^6;vZoD5g)%mZz1_ckgGOmBuhF_{x! z6k*cznO>eI?pJc~r(#(o1&wZU)h)UMG^069c0Ou?lHkJy zdObVJ|8Cv))HRP~}hg&9esk@p|fOd9RIjimZFWO`wo~l$T zN;QwDR&yo=CD052``s#W(VXORH7atdb4}CEG$z2!8haWB6s&}kO^Pe!z*U3HsF_^r z$C$Njq>tOg4qz8_51Cxe_Pq_=pyh*PDI}ifkrp~WRw`x$sY|^^+~@S0*fScXEeHW2qDWa{oQazEU0J49>lOC2k(#PZ^;C-t(oZcN2N3I@6f|` z=%D7?LfAoybkcFaG9Qqy5P`2~O_to0Q_Vp*LNoXww`0CE7rw9$qG_|3Y_0@JniWGl!wnr4 zdathQ2{USNK(xk2VhU}9Bq9#hr3r?`@F=*l?Q-wV>^PKT>gg*ME2 z6wRn^e`|ItIhi~SYj>n9c7X^oY`#v#&^^yLEu7c3vNe9dvf{*j@Z>N(dmX&18(CiFhK{;wdU;7E)LOAsq2NWa64{;1&onQ)W8`HSq5=pZTb+J!@)ZURVT6<5pni(5SJ3Mc zjuIxT?=dVcU@5;;oLCfqEXVbyJw8X+wlT;K;#<_2*61LiY1ZcPz z)uo9mmJ(w04%7zKZqWvg$;m9QAyY%n^OzqC2AK-aAVJmJRcw77bS95yqmZMtBd_td z_u!5zvNoXneH3(P9(U{@!OCW~K5n+jCV4<|U^ysxpeSXQfS{u05~=$z?YkLN;76s* zN;$VBqi4OlGsASYKz!BM>>{W@uzxY{+}=1@Y%4wjxStYX+PM~8_mIlyuhy>=)kinP z5u4vS8t%0KFqi};5eru>@_*3aXw4DaOnd(sGxDSG}7}bqt zml0n7x=hw9)72a3zoq=-#o67&T-I@q5M?qSeY)nC_CU1Ja8)^VKgH=?7Ev#!3%4}B z(QAyucAz(m&qnx5Q_G*e5v+ZIF?-h3Fdo)LQ}CL;4`z{gX|F<%kw^z|xue3EPFRy@ z4ux~tg+bpp`^if>eVIk(llzz5;O!uk#c*a8aN9j~ED=0*y9o%vR&M=Vo@YM z1M2+%6gD9kEnkQ5Ek&xbh)DGz-)#%kXrTkYN4w6=Xz#PFs1^4P&%a4hmIIn?Jr3_x z+r>1;t{$;_Z8ln&qBIh8a~|aE^032A7;c5s?P&^?E9h84++i&pwCdo4Hq{po$MRmr1LwKs`wXLaETw=jxDHPY21)0|$ir{Oe*>C$z%z3)7q&FoS2O$TQl-#bLkJMK{P!(B>V^vA>fIN`1F zT|k@MH{U){S)K^}9D;HWx3HF9wimy2Bbuf-BU9FHUj0K{BbjeT$?M%WDC)dgk2-ZJ zLaJ*W4XN?7stTw#3^Fx?8c|%hOQM+k=%V=4Tk#&;HU%AW{ZFx4o(HPr1=8P(l(VjA zj+CzW3mu}W6Q?WA*Nty7k=2~{{=1KXN-dKI^R7BL8OkOXpQF#!%>^#&YeVJb2$R@g zYTfk|{+N?bBzG&5b~+Y_WxX}+(vq|S zr|rVr7YKerMK{#(h_nGvFxirn5C$NLb3MyO1j@KfF&oK``nlXh7W>aQqD00ixD|Ji z{b2j&VkzKpHiO&2FrYTM3ca{#?Fa342zW2U)tuB#Iv>=;@Gm3e#1ST|(RN#|?RP@< z(Y<{#afl_8#PyY<=dH=G zy-ZgX2AJL9BV18W6$Lj_mmXIX)D%=L z#TrBnbwu3cN$^NBWhtblO{V{RaW**!5foJ3e#mYK9H8{mP2PL%$LwX*qlERG8mhL8 zj;;S~BOgISAILebwiI+47uEpEgnN!kL~#KL_);8V&}yxanAJU*jj#XdYku4!h@?MS z@0}P_*jaK6pu>5h)t5M;1c9h?qFRC?7{MF)KK=*lHuqt=Aksl&D$B{rDB&_%4TP7% zXTWs;pf(7sN-;DSDb9kflt!!IZhR}XsaiY2l-;LOuSpN$rbW7triQU)RwG}x>VB?P7Pqc#eRJ` z08*~HR};u-aZSU&s~6KtP#s=6xaRS23x1Q_`4-Sb?Sxx{9-r56wa=B?B+L-SRG#+O zFY0iY*RAeGqyE)(D2I2+QK;U(s2$zca@yl!0>j#>#Th5a*WCt8LZJE#to5UMno=C|nag0n`DchT?JY_z?1N)(l; zP&p2B0c{Vk0Q9D?^ngd`^Fh-``D-(E2}R!S^C`(**-nO5Rdvs61;Wwo1DZjHE*UdD zSr5RLyr*rUNmnLJEGqulMAX{&<9UH0!sSx-;%ua4i;Bwuwtrd2bjOPVU<}2f*u<3H)h*OHV|5a z+a)w#C=_kPe+%7DCVE;U%&rMe3bZ}DX_i(VstiEAaa>D{ly5A^X%&>KQAx=-y!`db*L_O@EJH)0hVU^mWYKC-e&{@-; zGLxQx{5mEgTH^84X;wAZTE;M)Dz&3wo>8k?=ymJIdpM3wRv^2Ld2$O! ztpycm(Z(1EwK0#x9xKAj8$ZR(9&=!yG)gG$ZSBp!LgrTOT3CXPd!as=o@An5i6Gl9 znsaIoDdA+Ty@G<2y2RF~mk6HHXrjlqu2mscIgLCMt_zws-=S`Qiiyi#>uA{Szb@lt zW%V~m6+Kv@tTkhRvo6Z(3Lq!g?*ljFReYd5JI0|!^d<`3og{a?pdL#fX-f~a! zu~(EzTiBx~sbRQpYsgK7plYZ$l%U?~Zik+-++PzOG!fq3yb_zHo_Bw_N730nvyZlS z6QW89y{6Z_>s*^0oX4;W)kV>(d&oCTyt-RBf5+mx$e3 zEZG^HUc&)in%1n*T+q-rMo4I$RUw`hciKl(S9Z(_JZK~vQ!x$xBB0IoMBK%V&M5)E zPw0Gdxw~a|r`zfE9(F-Q1H-YsJ$(<=CR%3`F4oZT>68**$B5q2$|C!S*D?|M%`g<3 zc?5D;39_#othLq{wiG=x`n*nDd?lOr+s>}N@Jg{aw}d{0eVuFHiES|35obTm1wYLd zA$vDglPH~OI3_0!GtJT7pX`2hoQ4CX;xEO7J`EXLvtutmde;zo4Yb|6Q2&m1{oA<3 zecR=2h({}{P-(Hkt;7on%}X|1Y|zHOI2!P7ZuNECBEM(SRB+r-#J`#oYO1O*9LuJO zEE%NRq4T3SQ%vsfr=Aks4$P9bJRK)FM)Qw#jx&2Yb9zT>L1zFl(aCWeT}Cs{PjX`5 zpVp!yRLElnHE6tYbg&2sWWR-itP5$F_X=$07FNY8OGL6nYhHjs_2oz}fdX6&0ZI!2 z?dNgTW&6>DylfRAa9p+{@|MVcIIBcI7CLs+9{vA{_4CrQ-_UThF?~4lsIuQ-eX{2b z1}DPK?KlS)Zb>v(=HYg4ge~h`0Vv1~gbUhhnEs@lLh?kRT6_rVA`2o%aaPW*S8R|C z5dga4caHDu7;ijmh*Jh=?isVg0FqHO=VI<<&eSxsnlIa_t>$qVTQqnp(}A ztw%Lh_&MF}VVb$dw3ScLVexFXW2O|zo$`Goqpi5i=w(zc+7Wcl+sL~zd9bK4<-ija zK4H@Q@b;?xN>Y8Se`Ex3FLIlz1fdBNEU~fa%OJ6*D1aJ>(khz*uY`l-e~x=b*;d@w zWk55(iT}j1i4H+nMK2@adu-;%R>^TRKogRRL;JJI@B#=#VKKozJ-#~&ZB`C2LOkuM ze=85GVv3hG6KPlP=@M*L2(p2qG@z+CJ#-XQA@ju;ag|{o%_89;c?%wum1~O^@%fTX z@EVkWW;zmKapTr(pfHGrFbed}GAJQFp5@4do8cpzfZAr6sN-zMJ~lXW4~D6CBS+l8J*hjEkZ zbFr{o6MT_xFA$QDRkz|$GFdP-8)l~@r009{bxQQj-86*~U@|{7HJoMb?~+ZC>lv;v zB#XbQ*r&Kk*b`g{NiH@#SN^%x58wOmmbp=j5GY>7B(pa~h0<~ZoFS+w6iEzaBMJ$9 znb-wVBwrTLZqa_eZD$efc-qGr`HWZPLkGHtGMB zXlT>PMs7f@Mns&5vEsp;Se!E3?Vq)a3ADXnQyvqN;RH+6&Nc_`%_>BdgdMVdE#5G){Ld!*2xD!IRMa)%7TI)!Z4*&}96KT-HoE}8M@v!!v8{uqh^2~u zr00hat|6+g^u+w$>V6%QI3VU+4%KD_Ky++g@J#_~d}ZNrRiK$c;O@h{qFnmetGH@E zLIW2uTz-m(6>+TO06j74L|rXxkM$q71?@F+bY~)$CJ;pMh%ku5N8GjbPabl8+iJ~G zANk<61WNO~74g|kzVPsK_7;W&cSq{&!+~NVwregm+Tz_lKjh&~VNmMoHjdFs;AJZX zW}p!%(P>WitN;@+#~~X}Z;z9k(%qPWMT>NJ8y{=M zZ@Q?B5jjb$6j!dq35z*P`9#;A|& zE$N6qr~X#8mC>^Zz}Wf|kq^;hWcY8^B3FV{FR6YF`>3%6ZFFv$q3@`XLExH7kSjF&~B`y*2vn0C`}HTmBfg1dt=QLNcL18Be6G+eHm^qo%p>5=!o;GfMYA``DUyhPbPg3( z2-uc6$CzCMpkf~5W?s73`-6$%+zogXuYxZh)&*D-E`E-2NWNqi-<};uw~`@vBp1Q7 zg)|dhj%AD@GE}?)vdW35T`zC4Fei_Y(i|GL1LZCJ2 z=o|F5eW>kdZjAF#dE@+MH)H;3<$Y&$i4CMki|@Ig@Prylq0quV18=F5ds3U-g+MjZ zN`$8uEpV_r=R@*=bCte~>xnT3>(`d^5!8t_d=;u@pEv~2AO;wiAaY-?y`xfO9{|0| zd286d$1UDY9h(!&zYz6l5S=qX@XQ4!9g-^pY0!=o2Bcw2HQ z;d4AHBJHZq!}MAn<4;t&1uM1)-M-~a$uAMJqPy1Gn|X5D4l7{0C93PClc|!F2c4<= zJU`QakLRv{)Q>Ib^`UsR>;LPqWDuDh`C-@dVE0IGinfFqwE-fqVRHISk*G zomo{nbd1XyFtP39ddm2kDQ;(`G_I2Xpef{&8>pPK7fKCw6wj(L!u#5bT4(1(}wXZhoOr)&9T>8#n!^Vx2=`|JS_A(WKy9!`$Lz zq2N%NE}bWuC~LqBMw+T5Sl|t4z|NFbO`UymkY-BLauk4^=c8C6$A*dVj_ zp#9WyKG*1|9Q|!N!sT`VN#44Ji{EkYf19tF6NVgB>iLP2Q26zh`+NZ`)LLj=sLdzS zfJa$%kABK9DpSeNY`JjZxlN!r5)^CA2(gObuBv>y6qfJB8ksO^M4;jNydFkNRq#j=g)1lPj~S$e!0lwQ%(;C*)i(tCenVs|`iz)dEl)o$DLU&>+YV z?fp`G*L2@+O}5r?KQoEY#mrHk&Yd^M$Z#>@y!aj8@+U%HvW!7{br~|yJ##tq<_Ud> zkQ|)9Ra(LuYp()&!(-W#BS>U8D`!M{fI(ou4_7_C=d`(4{O-+K5M2+maW;>ST^1FE ztovaeB=+Of?OUEMS zZV+upb9=dQ-Y(SdF_v3e`P=R0y>+a;Oi=V+2bS62bN{3t`@bLbC$i$Ol8Wh?h&@~M zPy>qXGN|vigHO@5dd1zT4Y#p17{^1XraH5hNvaO!1Nq5{al2GeLLm7(z7Hr`P+Z0sZO`|At*;w+haNrl~ZvGq}KN~7bf zV5V53J00n+6&I#^V51oeX4BR@BIJ1EhDsOEGix{{i; zYkuoW0|HtRXxauXJ!=%d4G8EV|18T6Q@5l*&K-AANxt82b&3Bf(erZ$>m|M0!_;%N z@|GRCiIvihm#CdeVRyEzs?K~a5S2|Ey{7-(dA1kjtL7gWVT)q8g5p8^;k}01+W%bc z)EaF30rAouk!cDXbi7S2DkJ8{v}~XjYO?Rby~ILENZQ)a1tQ-<&1DpeqGw^KqM> zb`7s`O|(zOnW-5TLxG0uZHhi4oklovfw)~WIdu30tVwJgW}R3C(~9R~G(|AKiV2F} znC%b@3&u<{IBKvV_dB6yc^}X~Zc2mEb+nEPnhH@vMy0$Xk}xL6oH1wIJ1E;J2FvO4V%T_ zwMnI$nbLVZ(2=GyEl(ma8ZmEMe2=_?_4HD7pny};MRl6xwYaxb13vS6tJE0Z8?|bG zqtOFxw~!h#sF1F<2?l^91cQpNBg}G#?FNa0^t*=xNEa}-&eu^Ov5`lkg?XY$%9e+@ z&9C~EsB1|xTMq!CRCjAuGkU%HF*I+s-XZ!bkbJ@J#4s({hx&33zaC4SY@W$E*!T(cJpwmswdDx)XJ|ItC_RuXXU=zs z$DhiH>u*mrb#MJ{(PZUxFH^!B=3|Kv!OXG*eprE&hKy<|kSS3mF4s9nA`_a}aU)R@ zNybzN;6`<3RLGIDiCmVG7*Jx74_7|3hnezFDOMIwW6}i46j~)zR7qTHKs~RblD`7l ztoRbXz3%utzx~frl`*@3aXAzAFBAJBYstgjrvFK2*@fAm3&0z@_zrvD$zU7Z)@a&H zHVGl;s8LNvBWCSn6#+}O^`scGu+G?To@PxZ)|@_8j*%ffSqG=3lVdO(wy`lJC^yTy zzGX6Ms4(E7u`|Bfmvs7mL!J|xipu;<*4GpWQ}g3;Dh;9d8G8;{SzpSN5C;zumy7`d zX+nOs2fV12_>>{F1`5$QQ&1i~+CWBsmOc3OPm}e#laCY(fNB@4)TwFj!b){Gr|)R6qbdi`!)v{zCJKb zAq(h{8z|s(jwJVGdx1<_A*j%2E{f7%LUw9S0#HTFhyTn)On-zCxCeYc%5wkhO>r9n z-rsYye{4RcKEY4>h6?sKJ=6QPj{4Z%3Zo1;ecgd*OR8$ zJ7Oka4Ig#m32%LFXm>3&WbNEG`(;}HbNha?c=R!Av-X119aVIA5fzS&3K(E{)WH?-(6$&dCA76o{oX1*hVu-1) z2aCC^=tMihn9ziw1sD6;sewpA%6OSmedDLMWb*dAzX9&uA6qmLId?+)DG4}L^UFGt zJ<*QPnC!c-8GZqloi20&Gg6gRjQPQ7G3G zHEVuoYHPT-DR0B-&J_3&5x^xzlwPU|8I*}!<{Iim?d_Z!+N6iImCe921;$&$q!~@+ zs)i&lPIdTL%jM_yK4{}fEVF2%5ujuPOIa;%dHSM{XTHKgLZrgX3{5@o(P>hVz_(_Gr2HV38ZU@bg92(ogZ#4kX;hFXp2)SN8qSt+ZA1E53?0wtzMD84C$syw+yi0AG=UeIfCtBUyrK{ z*AV+yMZR%1F>I8NUl~E6ZBcZiycm&6woL8pBv~x6dP8YX(hl6)+^a%r9kxmZdPxOE z_PMTfA-9ziMlEh)If7$&tk_g6;HR5#42rg_L@2`_uZ^Zx+K9~ew$nDPYzmq7hTd~{ zk~vBPVoGKn=w{1usNkRi|J-E7c^@w#;EG_rKZFXX_nYwWxx$2i{;x9j@t9W#Llf_= zSjLb6_Ud@mD|cGCRixh^+%~a^=J9`Zim2#lrWUg`RKF}8WfxJr;F@-*V2VK*>Z)i% z!W`DZ?c-`OZ@-hWkw&XExh!d$(RN*J-tfr8r>M5|PQW!X&z@Bz?~)fV}t;Nw9|{Sl6F|wz^DdP3uj)tC~*5Uw$|W zWogiN{h+m74@=wZUz)JvF~?CwM~`O8y)Ib-@s}dn@m}H85l2#E(j5lSC45?wS^|n@ zT!8%s$ZKybvJ9E-l4m(fiB|FX6MeHnpO7dzvG93DmorH!vZ9~5*}*)s_)dW_&~f;B z!FL-8U({%_beH;Af;GZxKu}0x;Y6FG~lqMdFHNr;=xsj z?ShrvE`_}7w)afza)-e-?2C9NDu%M(Y%elVr=zf))SK1B_wHh zCDB}XIqxz3yVs%Sxpv{?v=I)k$f%M;2`g?y0{RI%@6djBqqKO=OYhGn^L0CoxJ6{U zLX(jxPoM|xw4Ic6PSq$7(h@ld*EHL;aO6f~Na;2zij4CCEVXWMve+et9#}q70m2p$ ztQT5c4iP0K+bHUOh-y}OQTQr~^*NiiR}CY)oAX!~%@&c0_(()A|S&R)nbz2fQc79no?k9kj+x;dof~)jGK1bB_)I# zg}2E8tazH+EZ6BW$mufU05X8>8Ja)m$I+>|9J+I-{v+3|-#q_ZJwV60RHIK{tf{R0O<`YpdhjpSlqgTxVtyrO-RZ_07sAam#J(%GP!smuN^EL`zc2 zq!~gs8P)WKnE|B1q!ef%)=w`IT%i&|L$(AJKv!6Mi)-agm=rb0y4`$+KWa25vNUAc zCECX($ISBza{u-UkQRYb+7tflg)-N}WS|C37IK{sE7{pJmFMT&gpl0QeLauhzprJH zgxAZ-V>664nPc~tuXMED#jM@Z`gAv?NMG=+F&zz?iv{85c6$z!8HIcSWTLE;xGme& zMEBviNPw?dLl9}w(WKoX22P>DQj|d+iGKD5z8tEMFe|`d^4u|w!FTG~V{NZI=|L#p z^SVH+#ErUrd8{!^palZkfY!z+T7+*2^qeEZgWP!e0XFpIpNJsgBk%IvchI|xR$AHg z-NPa+u!9Nfgf>G~Y@FSSc#;nkfm7Aljk1HLQO`gDjO0xd^~*krHaewa#6J6qk9RTm z2Q{u#dU%D`L``Gzt5IjE%?7~4ng3G!P!@2COZKpzGky#Oi-Bq{L<$zHv&?%$F`3^Sv-KK|*OVfX&9-Hhd zkxazXmL=M9F&iYx_iCF~ez2KCYLLBw{;J?eK@m8ind?`06A=aPBS#V)*Opu*eD`v(n)F$;vpW~7kj{ClW1&@!aA7s8(T-~5C$?1^!+ zA-dlaLG$N1Y@u;Jo}@G8AG^n!TxNk~F7K>A?Od{l!&PF2j&g*Ji%;wihz*mTd1R?c zA&HF3ZO5r1I)=^EjMZZZMW9^5ba;_`I4o6vmt8qqXO6qQq8y1}(k2*8$n$1+dkRa@ zirwd7QMb)I)48``HPH@OuPy;W*Pv-qV6VCYQq^1Vq`m!4a#S3u`(RaYIIb{8GGhzw zRl*NWb!B1?&Re`$kCv;Pp6phq)%PtzlB6e#vyQBSYrUCbVd_+_^g^s9u`6+aYiiit z1(k1j!TG5rdTZWP%@q5q2bOdaFCD8er@BeTn!`H-=(NJyk^f&$_ml6qo7APCe^O`j zFUCrPUxZD?92)y>Wy}$Qrza-#a4RWGPQqQh$szov+ z5gWd0NopOSs6`AEWn|wA-?R{zHYrcGoM>j?wI|pV1yC}O9X(qH={|YXRWZ!4SG;7h zIO7!E81C}r$>aBf%WadNzq7L19OwZ(T?ov_Vu4((UpQa-ILpkNDMSAE7A&e~=#`^a zU_RsDo%(?`#1<324NW)^h^M2a;tcND9xmYvqrLAA^RZ(KKP@qpJn!9Z5nHNb{gIXf zh|kLn$qnDHC&rnAV1e}QdByrFsJYEi&Wb0xvPRY1$RTLBs0`7^y|(jdSKT#6RLKW zKTA5SMmp?&cvIS{-Jy$usVvmH=sV~^3XIO`-6Hj)2GyaU{(dWXrK-ShOubj@wzDBv z8)#818I-}@P!F|?h>S3r_gxI0(j?Gf{1i1OBE5Nq+~g|G7+)RVxXu1%vS%#Rm)+si zQsN@g_-2B;!qxv)W|zLdf7CRF)nnsQz2;Z?}6<=r>o?FjzmJ1l0JGTV34- zJ=l($l4g1rFxrYgY;}@SxbHg98KwG5z73lBK~}6Dlsqo)Fn;9I4JtGZ7Mvn3&XLVM zXrpmnn@FFFNDcXZvS7FHQ4UE151|FaCPg~fXbrSne`*?hrJlv)brr;OOGg^xV_rIk zp)z0XQNWMJ&D8pnLNr-PG;8|?(E1axhleE%O4zh*hn9+q`K4MUwk-LS{7OZ)o3Ehp z9o=`;u;4aw489C!FeyQ_->rKO;ysCTrCBr<4)k)Pa8vApy|}i9 zF%j>Uc^VPpUm)aQ`fkzWNxNNnCJgKzrMefuy-O}-S#Qb*pyT+W#?qD;+aG7y5!iFtx_JPsEOqdB3pYx&Py(e`FdF@f3;xk|j0VRJ0z= zP`V?4{>MQ7->wk=7(xznM^9l5lb}_{I6GZVQR=HUpreT7iJcTJShhRiJ|BB_fNZTk z#TriUGMwBC2-S@JQ$3ZF(Rh{3ns&swY&%&+<3V^#zss0B7R(2{^7@(SDM?8>q?;ROi>V4l1&n3+-nK(%Z0xpgD-E3; zBA~?Q6R+ss^~^1fVEu)XiyV7^W+$CJL2NlY36;_Z6G@5gdU$b7GwvSa%;By}0AuT>MGT64z&2GzFYEuv@!S{)yx8CYRv-FGkpkfV=ow9nq-cSOfx z;YV3mYJ?k{@rVwODno2L;zRognoX}za%m~_DD4*$;+tr_@=Oe_!t%#m8D*^&Vo~_y zDZax%^FFA)JLQ4~YM%xD{oRkMMuS4ds@DTi5TQ^hRdqy1?J}IvI$e}Gx@aHVBV@PG z(1Y=>A>RJ7aQGB=mG_VdVyWy6E-Y5qjL_u)xo7i z@6DQ9sxVwnB|a<4!HcjvI~vb3Q24b9N~4=hch`9m9W9rSyM=uH0>8=dllAHDAD-PL zBS%rEjMx1`q4YpHK8Na~xu&F?U1`&-HO#x^PR$$nb3>}SwLB|dM}-n2-8xjbgW4zr z$XZxk$+3>Suo&5U)U2lME%NcR??^h?=m&hZq8d)!@|ZSC7<=x`2Q1gt?<`kP5a;Xf zZW4h0$VWu--wvzKjx?3Z4}Us2JpTkAN|$>XS!kwLHihCQAA7Lc8ymgFlw$f)Y8m#} z+>sLF+R3GJ3X+74wiWVDO3malxgHRvkv0}{>;~Cot^~yR1-l^D_-SHkWCf!G^fQr~ zCHWnehn#x2vzOeSOAoJ6O*q?`>~I)x)Iw(p4M|IE_nfk{8E(7IJT-bAsLB$p$FovT zLv+P%4Z3g%TdzCjrkcP9y*Q@K_a(W_Q0`-I+8?j~8u0sX$d1~PQ?~huV4xEA5Es7k zVwr=bU1FHFsKR9jH^c>Mho=?l$pwLZsU}z(lDsI@>Rq(`SRz>{r~p+pB~R9H zym9t-A7dS_sbVhq#A14@27I?KYN{;SwQcS^sCr#yxFi)AMwX&U`G0QCp%R>oaY{B-$kkIeewN-H(77TF`(>GosuC*WY-JR^3H*IJW>ssy7r2 z1U2?GyQz@8UGZx$(-01I4b%RMyhU@kO_S+=V^F~zVh&S90XY#(wz*V z1<6l*xTX|aXA%E55UU!ynvYIe5wf>HBR&-n01B` zge&WW_zocSCn6O0LT`6;N5!F2O8VHgr%n<@MBlNkdu+?*NLSd7JFHXdq6FA6kpKxsat=Ys{8pO2;xvnfPl+)@rz^Sl9l08UHvL#vNdUo0z~in%>)7q=?h2 zy21T-H>&3aRM2xY>ojNr4Np*2SllYR9+7*qyF@dC`a-i~L!M;9EuTn)a}gEa5&J34 z>(=_&9B2pOBlHJ?`6$&F3JI9LN{?nH2X6crv40>Nb z9Jk_j#rdS3!jlW8C5_f%7r-Z!SrzVnz9Cb+Rwcef?>W2w@583(@mG7FJ~ke7IaH;$ z8R|Tfs(?Si1KVaM{)A1}S136xuT16*N8C-vMo{rU!HjAOkUYWx<=^n5o~M$(gIv^^ zF5zvuEfRJcbj0PZF8UPh`ZkgleG8?z4wN7hA0%0R+^Mo5yHDM9o{fGrwi*nxeFy~3 z;6rF#kdUxGAWm_l*`zuQW`hB}h6u*Xcd5FT{3qZi(B=w3b3?8Pm%#|#icdvO&ym15 zB6ljT{Z>=x4Gfr4F8Pd62+k$9Al|b@qpZ|&;F7l+quqa9JtS*5GQvejMiB=J2#?#21H!NosC*q3G2@uwDsHEneG&-;d>7#l5zfkxtP?{ zc97TPm;joi`)TJ76|xmo5EXC#{RGnA%24o2^o*@HC0Tadp_N*M4~=A5lD3rjxeWi_ z=FLFHLfEXG%%WACm-KW%FVZJ`+mhPkz$!zpJLy(`-?rydAk=LvLU|vYrJvl}1_RVCa%q z4+R2^_(kb@nDnGaSeU(cOD%Kl;SX_x#hUPl8j+Vap;O!IP)!(8$P^RY_w-;X`wV?} z)4JDFt5HAtDJXJ97t!0iX=%C2VR(7-)-U3nIs~FAOKxaZau^GF^?$yj92`59tEg>E zJ)JhvZo^DAY`wh@C?ebgE6Y8OD{Bg5O5Ypup-)bu4mizq&|bRldc%g|+cPV%zO4__ za6{K)p7Rj_^imGD+pO;ylYd3(YcJl^L;o523;6#2H?I7PC!PbDQ36(RqE#3)X|w5jiq!Q6z! zvt!Ces5lN@cGCc|Sl*;_X76Q1TYhU4aQBA>RAHSjLx*n_R}q?irM|E{M{3|TB!Q5e z)Dcj>0$35^MMpU>>~mFacdsAS$AAe&s@&AuhD<6Me@A@-Qr{ESOiTCN*)-;=JAPT^ zBzHlH|FY!7U{O+%9EE_B_$2$Os6%5pwxKt-T+MCyDumNrC+&2t@&9*O!kj_?%h79A>5KYnmE$euV{WvN=#Z{nnx#@VKh|^_Q z7#e`b6sfHoiS0OgFxyA65E%rlqX*4R|M!G! z(Tp^?nSq>?A&<1PeM6H=ayg!{e_Hl0sQkU3YmjA_>yC?gd!+8!yk{asB6rfdZkAmC zH8C%0y*%FID_}X7|J?fW3T$?uE!id&3U4CMZ!08OG`WpHCN0SH-D$F)WOG35GK9hK z45hiA4jZlvWmAGv?vL0^z7t77X)HtutQ2^<%N~psI2py2xMI7GM6yM+cH@QJWn2RL zIU7P-pIlT*Py7FjOXY8}S%hw{M2&8;+a*&oP1);UgHmIlClDJZD9VJ?%^onz3`Tgl%${rdKIfNY&BZPR5SyT5=M<33 z-dW1rxqd74Z+E8_pt76QO^hpY%mfH86FdK|M3?<~g~US=4p=YArP)aGx~(6T*vvyu z;$8=zYvlXRaq5U>W=ns&pmVM`F)B?k$N=Z#?wO%(75*n86{eK20m7Dw4OP{`xb96)(_5J9 ztL0STwf7d&V;n#HCY4C9F!ychQnEvZDij}29AO&5R0~Dfm&!(2Pgqqv3?zej`hcH*2#--%$8+g~H zIk(GKf0zrLsE9Ok4)4H2c*c5az!J4xN3N-v7GSbA}2m^TQp3OhKwzSdTBb=2ua zZHR7aT$VzP@|NKlshai?$LEfzXa=*h*9@TMwJ%c%f0K+3;10O#NawMg-O-J(3s#`vi42or&4)Ym(88-^l6G}nkOs< z2TK3Z*6Dry9jZKqh?8eF=Z!7an}%IQ-rx;9#Iu&4b)x9@C1$9$iF2WyM5Eb{eLfg?Y~2nCt)QBp@>G^z(hOXfq(%Z?F< zQBGFD>uW{ZSKYQu2RD)Mik8iAAQVe!s8!!6?z^ZNyllWd)6;8}$gfSCPb;juX$G96 zq5*Yci&~0}hhh>nf|#}_^T!G#{6tohg*Z6 zTzG{$g&Q5-3ZlVk3Lj`~s12{Hr0rz}WO_=xh?=vCS#1Un6+O|6+U{+LN451FoXTVY z|41g_I>a^PmO(i7DvYNvGe+2Zc7G2`EK=QT` zaSN>J9;llJo`|9f9u3rz%4q;v?8tZZa~Zmcz^9T*OZ1@I%?nC;wTPwsPx-5gLNYD7 z831a@W^mIS^Q6;?o`Wh4G!wQGUE~1mC8go5LFes3`cgWJ6ar)PbfYS+7_nCr$<+Cj z(ErcaZ;9E$F4~QjknCwEnG%XpplaH5Qa2#9$r($`=DjGUNsU>-F&crAk3GgzSXNEK z5??Xyi*B3khQcMtciwmq=pf6F+kgsi^36+?DO^p!meRUpT4QizVDhGxOCZ) ztP)0tHOzB#N17PR-V8L!2=!Ukid=Lch;xViG#lg>%Dr9~3BHI@%hxB86sKhTC$c|E>>xKb{jlzinKeqy8bun+X6Jn%_hVrVFFy@b*d8 zAf(XPlHb%n;Wgvk_`Ilrd9&?s@$s2Nb?poF3Omk)yeVq!#-JwjF@To@WriJ(jvcBU z!l2Q#-WlX{zbEdjFdkqacHndiPIkBr8_tjWq6oz=)b3b7wnH_ZR`fe6(1Q#ucg%|u zzPNKaJLIF{3mzl0gba<-#e9Gg|U|$80*gq4rg^;OU%m$Zg z@%Y*=4B^gKUfej}zB5Ky*#BeAk4~F!bE!jjFKGJlpIlU@+*V`o>(kc9qcd)JNDq!n zOva6%pk1)BoVvyY8|%n(fv>PcO2TvxtUt6DC9=_-ukXww+!rZ10 zm6-}2DrL!!fNr{IVp-B2Co$k-eG$RtU(J?!$k_TCk}mb8W8={d}3dt0G$ixi8&b#=FA6JNm6>6 zbd7lmn8fBU|Dj!7ZP2%^YuEArrv&}>jx*;U3i>Vo)Z1S0<@-wjy)5@vc{Lv! zAeGPiXR^0(pV3DdgI)-aHfd$-&#Z3_N{i~Td%z$N)>B+1W)CrAczdB_s(&k3 zviq zk5t6W(VIYmqJu1Tp+UO4M=RznJ}5FsWoBr@*NTncMdXITX!1Ia&rc%(+6zMnHS$I3+Ov-ux&-ML1B~RZ$Ao+~GpSLJue!ey> zcV7&lpkQhBiYHbff|p*Nqa-pcAr7F(F~!g)p4(!bzU%#aVoxL%$lPouW?~E16K`E7 zIKzx}QbBiW`t|MZz`5{?Uaf1;-af{yW+5t7nrE49)xInW=bb?EVKzWI;<}fDPh5K!Bjd#N=#yi$8*^ZeJD}LIPrjwZn(LBT%3* zO&y;$ki315ws8m$$tK?xe201Ck8xnq_PNGo5QmVMQ<5jf-9F4Y&CO5(Zr4p%o&@l` zUXKS8vU)eY=Yc+rtJ@<3>t!bcn}gP6*rRQ;9X$^%%xHvQNU^X?F@Q`+ z#P8S1pfXG^Q$n+?a41-6V;_ZS?WP`2%?o5_@`6)llG;b$ zJXI1Xq}3o)`anku42;`8VTLk$$lLj0oJ5Xs*@F!4cav+TcD7vr(BKk@R+QZTV7aDx z-5;oT*vh}siujMB&B;&(02whtnU$Pi2Gkor1oo&O{pKLFQU7opT&s?lLrlb~QUgI} zWtfD{W+fN68`(}l+1{(s=T_Ea;k7zY)zkX0D}l-^XO_X|`%VnbYFVD_uUECOA`#A8 ztK^?K;7A#y;f!X~*1nj`LxwrN=AB?*#=yq+SUi$Wun?Ww4{am?&gJjHdiLPAtv-SB z>@Y|2qNXhlQjkY(b@F6JmgjcQ1m#Bqy7PP2b&S;Y5~z_|RF1@t!kvyG4H0U0Vjm5K zbG>j^=MmWIp;yS~kNqLfj$J>RMwyOYkAZ?m_c1?aF-nJsKOVf&VQZl$3h^b+fUoUD z>;7gJdVp6WJGFh#^4#Kt4zGDQGr@J;A@lm*#dMf@sOTPRB!^nWIAU6WU_#5~foGh# zMq90Q38|b(SOO_Jlwww0@w613sN(`64Iq?t@T z{?k@gM~BR;D?^0HX8V30!s5ZW%Bo!c(AdiqbnI<)-^xXalQQ*f`u52wy2YUx8{kYO zVD9=E$J5bmi`?qin3<6epvW3IpW4VIyVZ8Zw$H0zsS+ zj7Y(|=p!If{896{@F0h@@>N2he)k$fw#3sPLguvSvIF!$je`pPq^iuVH4o?u#;QcS z?YSdtB)5-xbkotLoG94w%T2Z#x=zO4hM~O7RFbO6hic~XB{679-N{06hxAaD_HaR9 z9+F^2M&4s18Lfu|R4lGjGzd9o&-~7V!#l2<)CG`VNae)SuR5igM#6uY<1pt+{H*(= zPDoWPR4DqS%Go`N$Ze9oaOXIv>xUf!5AxnQ0jauWZ=xl zs^pvaME-8bNq+tg&aIk+^<_G1%O}`R)5HL1>KcUFuZFK%udE~Hk!*W^d;o+1MA++D z^YeL%?a9UWOBudToG##F&3a5#oE2hM(jIQ`a%uTiHB$Go+R5!GAwi2W7wJ}lq$)-Z z*eJFU3ciY~bRGOCx%#V*-B(lkVG`uSb<@gv)=Y(=UPZ1Ot|W|-eb zKt(JL$l$jX+4y3(hK9F`nYJqWa(iX=+RLklnFm$k@6K9n}uS9_BR=OlN z=b`0>`}Uw%L_Uw^rb*F24tmI8p1)RZCWQ*EG21jUAz(N96Ltsu7@)5Spw9@Xs1+M8 z?;KAK9gZQmN!5(8;Lg;eswF?fghL-zL4FeJ)-p?;>mN}1pjDGr|Ci%)LX|u|&)*JG zOD{8(Ae?~;GNYg%8=Sm|=Y>QO*=T|4)#r1Yf9I7WLmgQ09`o9bIr+wBPqgYt(3;s$ zjM`F`>`QK@a)|S=18lYR^RT}N;P@k@&W&(-z%cR9!NpN}k}fxEkU7!O|Hl&lU;W7v z%;x)kkSf;ojeV@ZE-+V=C3*TDS-ISqzL)!*f`aE50@GZ=0&WOxW>JPXI5r6$Q2=(5VC?=UXn94Q6-sK?ut}-*ckSyfFFVb z_MsV>svbLM;9V? zipsImYW(^H57u;*w%YeoTfW8Z{D`tscbBrBnu}2dAqIR{*`mV0-seJSJqBBDgRpZ!f>Gdv1Blmt7$B zRyV9o=W+e6_Zb->P+A#wlRIJ$MVVlQJJoa!IJ4P!d6*!$^uME&(wBJbFGAh)*ML7s zBvth8Ik*H4@1i_KjP_hmkJC(?XAf0eHRV@c68%Xgc2n6%xP;js*Zn{=+V2W^w{&&~Yog7!y|lmtRW z_@d_>U%ZG*z}SLu4WL%G%$P}TiLGV|nX;G?4xhPN1X@Bubc(t*fjyEfi`CK=HVYYu zjT13o;CysZN8*Mu1x4f3q|8{&>09|pvb;ENK5?ksx7=}tHm;UiKFu(Ha2z}#ti^Mr zoO)+lDX2&rwnf+16DPfBa@6mkurZ4hhLh!CQSfrNe>QGF`()$Q&$qIN;!{t(l|}Ea zY!?p<96l*efkj0_61&{X<<3I3Y7e9FPKr8d{OPtgffBCqMH7%sRHkK{0TXF6(%Z4K zX#Y6RVa^np`2HNewPtrL%kEBESE`F+f`X^?DUFBT@?Z?1g%G-I4MDe&&~Q-4Qp6&1 z(M(2IR+k`*LC|C>$oZ26>$(h^Kg3w~+fOMXs4xOt>o#z>YuN=PXI){I)Jx(iPBkVC zw2 zZ`Z(%vCM6P7Xgc1>s_&Gmy%&>gLR&D5nD5qOlFWz)SOd=&WB$ANaW!zD_|WpZl%Db3ZHI&~Len@2#-Xk(Q0*Lt1ACxtCX=$D0>VK0 z&}@A&^uWkx;_R;9b#Ah{NC|J-<8_gKYsYSHHN)|uU=?^XoGj`9v=|eav9cgnw&xw) z(fU5sm%-dRxyEuT$5`#`kwtr2IJ>y4eRN3>#9t0(-Jo?>Vc!9p4+pzmU2Kc3wGkdM z=+M`-Wq{7aY$a>K=1OUOhN`fr)Nt>t+Ti^*gXBv;C^%YtH+RtWv(q!AwR0PAQ!XyQ z$LHa?&eJT%BlH}iNgjn*gfFA(%pg?fs-LNp7zB`9Se# zZ=oHUNQNX0Gov%TC9&2A7qwHKL7);397Nm)|D99F(%uE^Z9c`97GhNx=q8+Oc*9*8 z{(3_U^S*m%WKL}EO8$z*M@YfOBUiBY5nDx&ceaYRG6=i?Vm0arv=8SLEl2d&YWX&k zDw;R4e2l+kYNp`&a`VL$idbk|uo@i-Q+k~v>XWAD8<)}5%*4VcwTjxumn#f}Y%y3W zQAZWgH6jrn-&27Jx9!T()!P(jcR?(9HXoLL*5*9idS^JdoTQhcq>DncY2)jST%U1s zWWcCd3avrR(-R0_dsxc98F>b+URmO$pVNx^O;^Sz5>t>vWEFW`VO%g+01P`2T<49- z_ifRkc0Kptx1j*h#;8EvOAYWb!>BKD^6_4{`iGjiaB|Cb*lUZG+QG^mQ2tCv0ETHT z#+zb*n}b{9EA~qQiVux%)PaQT?MzLdJuku-X+?LE|GqXsKA>75z@HRFE)028&(b{e z+tLY(E=STENQUKeTAGr9a>u@(mO2wBGs*j(aWNuD$1w zSy8s%VV$$Tm_#uUeNwm<^mRJhQg!OR3)H83hIFC)_3Jan_+@?d`n+CvrJ8n18hnxt zagcPZhcEs6KJSjtT3rzfCmb?tg=b`oB$6q#Mb?Nqi!ThuoPQ2%nH`Utx@1^p=qH5Q z&;9i%s*lU~mz%uOrTi}UrxGd4M~e%#%G^s{tk{G&aoY5ag2hF=<(x;^LGq8MDL32ui-@1KD6<&;y24g8> zAMph~sxu;+#p`_DAv*WS7g*=TeaJC&tVxfQQH#GpWtfWnx*UWxDkRbRiEK>V1k7np zbh5Cd-npJGyq(|96!)1tG{fSn{gonQ8|{B2=-`gZ<#EJALw{w94>C=hSDqKy;Q8~t zY(%4_J&(X|o>5KT%|E>)`Ov0_eDAY-smq_)t>(lM5Q!VMivpMtCKVK zD|&01K!$MOzOo`5`CbyO>md~OBtOKTv`~~Id8{I@eo5jWYKVALio3mag?Z!t7|dPP zi;*5>J(0Gt0z~@a^cM{g$^CsOjXAX#3^Pp~eq+fw@tSj+{@4)_x_770?%$GB1qSG8 zUo7+eD$ARBG9|*Dm`rp!M1{TuHfb_y)~|a4Bz5;b;*%V!TYqyiloB{49DO2R1}90D zHvC!>n7wud+a;p9FTekK4<&bY^gC$!@d6||BAi&*D1Z9;?FayZ2*K%l@RRL|X(&b; zo9Ri)2CZFayv_JVCE)n%KO5I+1b=NKKV5mpLd5Y!(em~EJ}==mexil#&~#InTldp+ z@3F^3#^1YD;1HF+&*}c-CE||~Aj}PR10v6VjDR5z{qf1@`_dHOP_U-$ZSLdL zc$2?=Qo^Q^FZyj{xjnc1UDVt>Z-zHf!vC9aO$1g?Xe8>qpYpcTabLU4r?0i0KN5{q zL{>%fVG2Wc>0;O?+BaKNjCG3A_*^ur&(C_0*&*&DB`+oV8}%RsE$mWr#Vtqny%Kk3 zl+7tfNIk|}dOlMCOftIom{evecKZ6b%9wIl5g{v6uMkJIFj>Ilpd0b@%5@q%`72~~ zuGO9LvI?3CHi8dsXC4o7Gu~Jfr8Y1i(YGDuXzv3&?(BizQ*D`bxc|$9&1UO?5sW)iXN&y^GxM$)_Efpd)k>&Rm-UL9 zJ??RtFede2!IDZ+n<+%Je{8ZQ(Q0$zdGUy_?{LOS%dwpJWO-eUszbep%a}X^; z)zAPY!`mi%o7;b5v1K>ac{$GS*~sknt)!)>!df>bKX()n_7y?t*AK_nrfSe3xJT(L zSs2OpPXF%$ftt3s{61~pf!^4~X`Rn)ZvE#R&;}#=flHWoBR0hMOe+;J>W+sjC3&5e8Sp0OBWT& z{m1>-ZRX;Ko|EV^BMhWs3DKPRjbwOy?wuy2AW_UFcj>tnj(v;Oq7Y~~h_8o;ETVKf z4XZ#V+=5*a4}CL-EcFaPI2wLaR)}4!?C8sRz$tkUlTNUI$X`WUW;0_8Y_Mn=LcGsU z=H*}32e6*8l1re)?^(&awO2FUn5tHuFXRu`$nm{Pt1*o3UGX{&>Fx8k34{;>K_!1I ze-)Y;Li3(~?MKF}{op)0|9)3ihW0J&gS%mKXhZN~gd(A-DwY&sH`Sm*zq4Sn&diRS zV?%f2k)0~Cu(;5 zGNs@Qzvs){k9=jRkc>GqFI*J#@C=mN?f_S4ws5JAY>-)NX*SsE)=1AczJI|UgfbD5u zC9)_)T(GV4BFRQvLDT-^c`IA?F!&ofE1komN!FnJV))EHA-6ZrxKksfMqt;!=_~e| zE@S0U!V`n}RDPH;O@t0&ik&8YJrc1_4<`}PJullMsi;tUfQ~kFF}h{V0Bm-2K8OCp zT=JF-r_iX>A;AQS23xO`C>lP|PD2h(wCgzjdb zs;U81trXY8cH`F3;B5t$>?o}Y?>@2zN9y^KuoHpztae@@vno$EPny?tlKyjM>LXQo zBaLNqrz#wJ6j^utF8n$RQWze1j87|DKgBlE(_}JrQM1Un`LJ*6WzNeW&1^B)Sx$eA z!6r)*kfTQ72u3^j^BxCWF5f7Kg@G5*Cg>*&<+w@oKd>*ag?uR#+&ucG!Ibw=Hml~l ziu6Znj45FX+<39GhT5aX*st)0%`gxje4)Obtj`i3Ka0Mh`v1P)?-ox-)`H$D2Y9F` z(#rD zWE@cP15SFg8GRZp^RX&z)JvM&8*Ejd8cT|>N%xd_Nk3LFz+t6H#TS&%tb=SBRC z_~QfZ{5mLSq}p?MsJ83QD&$d9@|J6-z_`wn(?70SQBFXRk_JevngX&A;N zO(QyDRNZ8q0QVJOQq&VcKkdVfLFd{MysEy2)-`5ePVKUm)4ZlxzYCoXvR`KZ>E=5A z-@*6g)k|t*KYaby?^$>lV!qb?!Yd<69E(oSx3y~-dGcwmVHDQw)F$mjO<6; z{I|*gLLM#dYPAu-2lmF{@)3cnJqMj_!7DUXL5QjV)vtOZNLbc3RMR7$XtK)h#G+dx zd&9aP^h&BF-&3u;nrCr;5GBXB7C)A~dpu&k4AMENCE8Ws$Y*U_SIral=f4*G$d*fw zanY5LSk&SM4gj-wgc&pSkSsfJq-zwy4VS>;t$7mtS>>}I*d3aP)WNI=E%a>hWnYMp zvoRRXb`fjplb^3y!w&-U=nHc{1{jq~TG(>?0SM@C;IXugiW_MvcJ5Ee* zan>VSLjlb`Q#PM7xu@+(lXrW5X`Am6&%#X7*=X)1UxX(|JtsRsdLHFm&IHlQJN-Jc98Z7;~J5`)| z#wRr0%q{=(0nZC&kP`ePD$Uwr20h`bB&khh0A;++L*4c#u!79|OnveFyS7DKuiv#* z4I(`=$jHN_xBtP6}r7z*Pu^@ z`VB>67;|MU=$V9?1}2VTD(2z&qO{#>e9Qv8SwN*y#+faOP)$2% zE+R8GszI~1kyK-nhhaVBt{rtW2SB%Ol_U}1Gl7x+(ifyW=*_u(y z#QzKN{rBN_9Tc?$RUfclKFnd6K8X>U@et-)>6>2vZq{USeM}rB1vWM5Yg(!1XvKmP zkw()DkvB^|G^*bPPQo^hY26Ovz&ihA(d=Y5@OiUG7`^wsi~sw@uz9iM z!PXXMYe)O#Tw{#8CM|4xz|L2(0qLCv@I-M9Z0DcyjT`q#loHXkYCP};5B7B{@WtAd zCz}eOcbyC`7c0LRM_fhx)oak&szaFA09aFUCl4aO zpl7JxJZw>}-rT$-N0`4Sbf~Kll^X+Ja8)^%(zGBMj!o5v(%&ih2$m=qD!{W=``DFM zCAv4|SQiT((Pl=hWY_!ocwjDm6fwy1cb(UPB1cA^U+*RmkX19w83T+Y!NFExjWt)5o7>R)59iv8A4k zs+O>VL5@ywmpctCXK$Wmx77C=+S|wUHf*YNr`%9RpNm%kIQr@0jurb zOMKu@oQip=NSrl2?^kEPsfMoaS7!s&ubm$Uh$#2Hz0IH8;lh8ur&m~iSJaTdK8c(A zsG{7=aG|jB%ll3wo@u{U)oL@A-~^@BL+is@G#28&AJ(%`#}~8bady4m!JCeD%L`C$ z@{-Bl;;PJ`UkTC_1G0JxI_+yL6|YxrZ#`);YiUe5Z?At)DB;X{Av_tS4<&c*p!NjH_O<;s|{ zcy>Vveh{oRrFOnOYRR-^$NPc>4iTIt`>@;hIi$6|XW#zjZIZ_yy#6;DclL0GDUcZ# zN0O}6d)s}sJ~kBR4Pvn}Oocx;gKWRzL#(fW8Ha@h`mZKF=^r;Ory2N%P1O4z3R0pM zq(^&%>eAb%bd!$s@rn&hFic)_M2__2RW^Lvu(6nEfN}_Awc;8^xjpo}8Uek1BY0)KWo6F=$tdD%V}J75d(n z*4Rw&^TSE&IScRA@FJo045L@Ol)ctdPVO>b)Kl-XP%P zU(CaD=^ziP;rzxuWT5lbkF+mAbX?Rnt30%-=Ws{`222*f_HC%|p=Pq(D#7^4giAZl zgG1g3S=>ke!;k$+|B8~bvfV8Uivuo1Tg$L1o3=ex^#&Gtt7bP#wenZFQ^T~=SR=8d z^w?fOMl*8yowRkjIa>1%9I9q7w{kC8A(3WKN`6X#l$a&+)f7~=`L9Jjs*&XsI(PGx z1Gn1|ggJd;_#A_EVTj-B*Xj1xa=RxSH5l3vz0e!9nrU5ebj*m1C6=_g;iLtSjNxV% zHTs$nVNQ7IG@I-O9V(A)mL<2aXv+BIROWl;ot=ht$~}(kh%|%7)seWUW#J*{`aYXu z^u;}X*IC0j^BzB^+WI*s;?Fpi4`vT3&}cN(v^7}`qIDT}f1GW#kp=|qcDniSwO8)= zud1pLvUOQS^om8)WNE=qpc( z@v|H{AI(_W5xlC-fQALblm2!9Ca;*Ts@cqnjAF}Q59Wh%3Ecy%573sWDvOM+zrfE1e~#8;y_o>96Qj%lIkea z&RIjY7iQ3vpf#Z4Rn=@NgjI9N$6$>@Q90@0fw(DL0VX@0DqeS=w)n+8H1N)dZjsN| zv%#01qVNA~6vb>E-W<4&9UQHm-^_T*PGF?@b4WJ8^)s=_6iu!2*O@yY4P`xGy~G%h z_$)H!sUEd5ZXBn-h%A(6dm1=6EAr86YNX-fzrqA`OUv#Y=dYNA@=5`FMpmUyA;O$Y zc0~p^S+mf*WJ$<)m9CHJ}VS+JpZwxN7thqqkI7`w+k^NdR}&C zX<=*l*OX~EUYrW7%g2%iDdD*2hgcZJcisBgx933j;75XlAQ=+3(rg~Cu&btw!r*8j zoD@4$f^Qxie*>(s;c{G?tm3BYTwjP|ZtrkO_a#oFs(&BnLJvNVHKEfh&_74Pv!;m5 zsj;lb(s@Ba*a=tq97%rWS%5()^j_u9YDmp#Cpmjh4YwVKSgR{LxXvf0FZ~wqXSoj|eM|xtGrr4D>##brn)xd| z_FN9@LosvU0VzMMqM1}x_ns3vd?F1yHy&ATa^9rvwmmT1>zBniSBG1Ch%ADGW;bLR z6zaIDrkXU$XZ6l@aOzqQ`=26z+)l~SZ-b&HAB9bJBac|F zWV84I_KJoURH>|?(pT9!=IklLo({+qg8Q)7Paad8mQ|1b#BAnzGMhhsN%RfVf3y2v2)Hwfs$+=l8|LGp-+}FDis+`$AU@;gcu#J?i+PeM^55=dVURbvnLCn0eAR z=Te{eRS*#-@A9XA3SE(~IcRiD(-|7`h3l;*tCVUo;vMfJC@+Z5+i*@1O@3GSy!qOP zBwz)01Gw_&((dn?)#%7lCCkV}7wyV=SEO`)H~Z@UDP_NjL)sE10NReQ%61|Dxs+ z9xJpZO1XbsmOHW&Y93|k>~Sk1d{?94Uz@){D|J>H9Yx2RT>EkFKX2G>8+#-Kc9;ncC0};RJ!8v0FITW6ZD(qm_1&22nuH&_h(@wAY8J=j- z(men_4KN|&13|(Ai7L8|Ir47W=6Oe-6Jp=jM|EgNZ8YH3u6uf;{??`&MrMB3Svg-z zl|IVRJfz%G*ZP8ebk6FiU7o1CMII<75`U0tKFn(6 z35haX4wl`+sgJ$bjtstnU(9{S+DTsVpjD9#`xs)}*6m^}ulq9P9?b*5oA=*zW(O_j z3wk7I7f!$L0<#uCiYdINWMqWe#qtWnS9ieT@jb{#%Y8B?PvG_NrQw1fd6Wo=X9Jhu zF{`#eb@a=7Jj=Y{&b|Fi;o=C$nYOxbY`lWWK@CtN8x|`_9dL0Z5}XKId9c>>TbrOB zd*l>&USh0Q4MFbHFlH6VY|T+^PhZUo#_IIabOs27VnXxWD_0|iZ>LJf-2 zqr{=3ZDw(Is-~YBF)Idp9nHx`Wnu(pf-m^H$|5q?;i;L59;@8Ql=0__&mG~)bO97N z>h>@T854!}t>ushtp9wy7o)?kk&&^B%Kob4ffEjNl5&8g$y>Hu4pABRitqx&(RX47 z4Q$EE_)I6>55o@@Ta*1U!AOWGsW?Rcr@iPYm0r+S=1;xJNS1|m&Pl} z-kHgnQkPigcw27UO%-cJ-R&SD69Fy1vwqqw*6#GDK{x4fdf@J$ZIJ{&4$XfdiVVGU z?cluR*M|&tou*DG$01ocAEoD*WS+vaqfl7ZThV3lK@%!xzFV~st>CFUXoVh2TYp^tNqMs{AToL%}-v}D&v)^#8PcnO2y{R)ng`A;bB~N zL6rkPzUP8g>`-By4Fo83y##uH^*T#WDj#B3&ZO2srPp|>2?Z;IGc;%Tr=TTGVG z;uoKk+5WB>RZc^3-|kJvBn7s8WDuUa@n)k{V^RIM?A!a^kwrF{7311$_t)wZ@F8^iC)aU% zGasmH;=p}*V+rhU(b+L^9uJhWT=@V-U= zUE%(tx!xWpf7Z|ZBP*P_tviZ`4)1zAUn-j5jQ`KLmG_fRs#$3&8l4z7?{d8h?wUi; zRhL8bH5=iGnt#Z2`-Z;rw8#~$@}apER>^=VCliA=sdJotmY$@yy{JnsOAb9!07G2` zAi845Wq9z3R`x(45K3r$-OB0IzoPkXaBl511!~K%$(3xBL#h(=tdhd|-~w7W-%Qa# zt^?|Rt0C0f{W9PS&Jr9(!979W$5e&N(^$27mefy{C@UHK1_2|wlkN1F_QG?tjeP%@% z!bEjAD3AIix}zJ!uxSA8NDzez_CynX3DL-*Ng9(C2Juy`A1p)RRG!mtNeMq79+4M} z$1ZxHeCG+QIB*z>0y($acKtFdBd--FBfpQK+^deS=v$<-T={pwt4#JwIy>B5@p0yS z7HY^*pRl_dcl^fClD3FcP4f1W&3#Seoy}z9ODV^N<~si|oVAQL7g?PxvA?uwTTup)%7_C$=KC~(cp79YYNtXarQHo$ z@FP;?6l`X^kf8RCg&k{s2{OCEbi}H*gcd;cRD~s$AYtt4m~v7eS>0>XGxHrD1BPw{ zasV*;Ny2%1tJF{xp>j?Wp-OCwiT$suw7%$8fc8M0zt(!D94S{DdVQ2EP7lGhg1s$GM zj|b>w?zZOwu}kY^G$;2|N3a*puso2?^YQw}s;uA|NOd>uam5JC^@JZnhs?j-!qs!> zviV^)?<9w4ZTY2K*sTy@~l}OP|=tk1Q2+hG+SVW(e41lD6kyf0&P8a6i15x3oF{C zjx7F4TeGKu{MDG@9~(?949Ko1X_*~FAi*Fc;A8aH+Z{yOJPh@ouIYy}=jneThzLHn zN#m(;e{yFe$aP4Nn2!-6Z+liAsZ);?X$dBl34ml@oLI_kO%`D&Q_&00s&_LKrXesnoEQ3eDpa;* zKISrv7=XEgstjRR6Qr4iF?6KPf~X8}gM-N61K| zJ=R(wchoLg*|7Gobx4=!m6KDC{WKpnr%2{++2n8FYhxMyB9u(Bh%7&{!!`btxI(A%J%f#ps|BQozI}PzLv9*BmeA(vQ|3BOS$_ztpzg-nl4=AbmXYhbIT=@?2{F zff|?;_2=4?0YTpj#QqLcrK7{@>-pvk*^J_k%$r`}6aF_DNbS6`eNWvee6nv{pWb2q zxmx{Q$o_NuD~@~a2uf)^Ak+Bzw2d3qUdIJ2K+mQqS6tvvXm;QGF3YC_NLay@lf}F= zzY$)YtNhOtg0Y@I_bOYcpJTKrwlnQbtMpd~Vp)F~N^ShLi%-zJz7Pe>5bTP4H&Nw# z{%JCe58eX*UCnfOlKpr-XIxy{c}T{0(a5l`S^wPZ0d3(ANvotkA76`^sA;@MX$sE& z41?Hg`mdi{4D!o9q*8~I-(oy4?|H%B><%>d{Rzt755z_diuxT*vvskrKS2%lACH0j zKd2dN*p(xk`ry>nVA4oKp{{+{9Fhn1aw872ozXn2y z%l+X@qTAYk-+?z)Rat1B@rE3=j%+&n?J0rCJzuqN}OWg9z%N{Wv`g*}jQPfB)E`&lX5L z;=gHES%*l_*D`OEbU|K_)4VjwjzSY6g6jq5d-zLUH*`0e|HRwj5uebqABg_F-ND-0 zH_ApDl%D$}G!oM9u;)R_w(;>#{SJn!vkkVB4wU*W8cV61)7BV^YzdJO5`R6l zVvO3d%EV-NSN%Itky;%mv9A>s`cVyVte{Q|{be_$;6YLSQD^?k)F}@pT7G>x@=G;i z^E;l1PyOds*!$p5Suy{+roVOWZ&7egu)cl{NDETAL>Uma@+V0={Dk)Pd9r>q|K#ug z=rL7IPx^X%=u2xx*?W7relFj)1C2!ZJj74kJH2nH8=1ZvpeH(cO4pxJYncJT-*2%l z$uEdPD1-FPo;$h(pug7d#;B6!!QjL{OFB<7)@lX(RV$h)l=xr$5xmld{C1oXFQNYt z?$U<&v!=s+=b)1LOUBP5XY{^Pf|+mMG5SkM;)*Z29vg^7ViD zJ8O&H?OW;~;QEh&V&k~}rlft8!p#3!RaFT6j7MxS?xBj{IG!-yfV;WyQhmaf=Tvv1 zyM8r=my*>#?M0cac<<)+)dTXEI9K~qO$c{L^Z8Snl=(T{Lnoa`7i4WCR{HQ6;E~U?~^vgeDmxv=?&uUbt#(kqmfj;E;8N+ncA#Z=H^Vd<;{A^23 zV528q(BZA@Q}1~Bbg$@iT{l{`&6fZL_sdr+3?|*w72Dyg%q06T){LFovJ7Oa&-%n1 zxzfMDbd7(sx=h4=05hn?!X?fMX`JME54Jx3tY`aj#`G+Sb0dnSxt;c6H>TdyXaOCulVUn~Zoz=v9^ei&Pn9f}tD{dm4X zP`*y2?EUW<@;UtBGqd^3o~@^uCW2sT$=)o1YU|#JZtY4=E!@JlOF-cz+mbFt07XE$ zzt*^8^!h`mNDQ_?n;rKrdO|{wadlro>=e~;Q-|V4&%_@6NeA{?c9eRobKLXw>yn;i zSd=1F&sB_bn_5jBcNq4VH}cj4Y#4Wb0!apK>sjXVV41v|_-$p*Cz zbH^J&s{6kAv7;+r+0gT{eu?{XJ~=Ppb`Q7PQ*_sPw~$dK9|@nEjJ63LT)zCLJpD5R zndAs;`V3RQ?cTKW;Dz-N9!~#YYn<6Q&9cK^=$0pW3K4Y`mDIMu9AvQQ?0jfgp4@KK zFu@>J6-=>CC156lDj@+INzYSe*9hZRm!`vtG`neQLW6{F1&WD4q^&Fx;m{R$H`4-V zec3c;daS*gDR43Lfzt@TL|_2XAbqdwL2;UA0*;*p& z0;}3FIpTlVyMAchCC~NnV~qoDUvY}_0`a+jmuyB#vNUUi!!(6ss-44S{_MNS;H%%L zddt49ej}*C?XXC*3#2SiH$9g@F2z+9HuGQq-E?8&w(ZA}$BSrG%MWCM)MES>3k&Zy zoc!)Z^Y0oD4UjA4pfSI-*-6s6y1?7ia+o*nv7oMV3zlp2#)9N8ae0?31WV;5oG-^5Kd_fzt*!8g+RA+&pBV%8Amwj>S)2jPVY5k zeAU7Qri6vLO8R=$AMD!Gu!v$|7#gbnvlokpG1SSH%6exDWQo52D=JBOcpSbIdbGBjwxEaK>6s=FJ z3<%W8w)>2%cSa%JYt%NQEjfarsbEcwVubjINzw z%ce&tUCFp-woH$>LDCL4uVFn>i^?r$lXDw*J{urY%+Scv_7Npb>b4Un`a#C(8Rn@L zj|lK=7GVjIxe79rwFwqTp zQZikP6zvIlQua+nNhSyXi*$>F!63|DoQpGpM7RUrYC2TNdje4>`H0#OG^qy>D?*c6 z_vg1g*c^*A6Nk3Yg;#S7Pol7?#S##y9+=IXY|gig-dVR3}h z9N9!r--8r}0!(%PZ%({p#pAjql>REA_#!|F@_$ShpwbKrHc}DIm0f&coeWfKsnhoCBRc8e&^VH6T>wA0|dYH}#)jlH=Q^=$Rsk?Z!vLZn? z3gtkDoP?t>($5A8zYGz|DSqK5pGPt|HnrbHmZq{|#AjgcLg(wc`F&d`W_(W%$z3st;x ziUg?iZqM?bmvxmVhv|L-cEOrD@vhk}W)sZ%F^H+(YVnJqZKqlbFj+kge~cU|jfvWo z9Nt&{&T0p$0)`^A;I1o8IZrNa46YdNwCf3z?#%}zce2byTsa^~VWHueTSz@5j;I8B zJLv1cZa4b3a6EMiXRFDF%FTSggL~RipvF_2&+3*Rkxl2%DKLLFb7;>wtv1siWO$1` zUFvu9Tl{eXZ~s8aaagzymUr9eR|sQ!2#JMyzMKdmooI)HT(;B2EA<#j3qTzT zdT?$Y6a+a(e}pgKfF!>o#`h|o)M(;tec3!+%o3}IBt|g_NG^Zn%Qme0qj1f3AFm#1 z!9sBV8wpy@;!w>F{+TojwG~MMmZ>AR#g${);B_}k5dbTMy@9N$H=^XuZcng%-KF6C z$T#k}rZKc9EXv-9=E6Gs*b{{u=e@X}4l=44aYYu{Ie3T?&hj*r>f>(RUSLC-NJ-xA zR8iY(o%Ygxm))PdIO2Xd{{&o**Vc2nPtUbmGZRWe)BeTKpV!qv|=4UnB=tKKuDD~= z180V&Omp19+82tBR$Y6WfS9(hk{1p19D2QtZ=T2lF@G{h%ja2YG59<#evy*`P~^`$ zM{J?9z?$eI15bnd{n(2dDv|o)`jRwMtqtLryFQKD`Xpy9+k~^0Z-za#$~F9LR92Ax zR-WH{hkGX!pl-uFh9j0Kqe`|jS`L!mx+DLnx@b0*mO2^_?}p?jMucjW)(9PeV5*3g zuUn9_7r77ml7>+AJTBAypd(nA39k%-IWUe-C(|8=*7_8g`!ujJ0_k>c%$#>}5=`Gn zG@>21U|vI~>pUeMA(QOW{d<0phs2ZP=KoiS}(b+xXY=G|4!dT0WZL1-7aWp z=GA{*rOA?1;vCceSaNX)#>e$p4M}46hjez1t%G<2#YyDn3DvAB)yh6@VFhtrExOGb zuEl%=dgZH&p5wK*f3La7yiP&5qU?z0k|3&&VaZ}W z&x05&CEP+Pvabf%sfjXhfeA}^@6CbusM!e&ZJY!W#q19TbEFdNsU06OUpxRSi1gfc z;eNsmR8LWlr0ML5X$5V%f3r`qm^7-S?b8dOYnXmY!A*Nd(ne!TfYX)yd%$wH&%nn; zYT9365O;T+#VgOSr?9M9`wTPXLH8ENQ>j{4*EjOr^3WJ6MZzO8ol zL3PHN%au-#_BYdBA>q#fReI#MOjjWC`2!0W?b^Qka*t&uUH>>e!sJ0qaiw#gfU2a> z{F30D(^xe6c%K87W6V`mnefxb7n%7M4@mU3MXEanPN{F2F+%F&CF;FqF?oCTA}Cz( z_Q$eNw^wJfK08HeOp81(CCEo>(bk&dwyOXce#^%+PukbUU<#Vz$T|wgNP+vr7ILyO32Z$=Dv<`y$LSu=b782hgowMfGqtzGEKSF&DJ>*N$oe;VquP>jiz3vo5O;oNo}i#)KRK^?6xcs z9B9)6_}z8>c87CJV7zgc0Pyl&Zpj4BedvRAvy4J_eiA7@dD^x8M>(-+^BKq`Y!`1x3dA4Bwivt3GEVq&i zNsInQGAa=CF&*D`aP7CUY%n}3ianJ{aP>~Kya(#iWUrHI&Pi8c2O(pNwhKIzNZW6Ao+4lxA+Ba6$Fw3vmF7XX`B9$|Fx5$D-zV)ZSO_j%xzPNaQ8G+V3DEm1ilt4!Z*@F@sDwl}n(lMLt1p zY(~kP#N}6lG-^^Z26PJg7yd@OW)1%P;};K3>gOtJv-r;jSi5r47@>yJ5=4Sb=LgY=$w* zA*6QKI}eMbzo;epi`fhmIcSsbWDEnRd%_wjsppGX6A#nuC-T#aV_<*3{lUj;f-3_> z;%oeH6~0v`Dn>|wd9R+$ag#fdy}4&oXsy>zbetrJS#D|H)(R#hg_P=@cn0A{nOxtu zAm~)LW8cSKTbEYe*{ytGwZNwciS#oCmJ~hrGLdNV<1y<=^~ctL?OtL=Fzp@aDJv!^ z@fb2odVF5Y%I-IOV$BAEPkhqZ6pfu^v%FOibl#K+C;p*kP7l4keM+;kZ(WbZk%?OQ zbKKlTKIy0Vs9NV}+4k4O@&dh7XT|Q3#{k4HftW?7(*&nOC1nF-Js%UcKz_SR)a6~7 z_jeeCuk+^7qs2d}U}Gq(Q>wJpy+t(= z+IU~}WY~?WBFCXm{F@tA7@-cNVd5*JR3ruTUN6U|UK6)}uJ-?>-(cb@vBRGbe34a{ zf&?UkImJ8;@aIQv1**)3d0pwToA;xwFov57lYrOo53UZZYEF8bok%2dY_9{S5wTas zCAoW=`BN+euc(Ew*#f?LI43q(PaMwuW5d4)yAED(@Yj2)S2X2SM5+>hm2+4_#-I5H zmC$Gw!3L0R$^0}sQHyIZ4(wIPOu3Rykt$d7@n52Kphr;0#fTE2Y8E^;d&>=O=3CoW?pmB=1N`6>6>(Z= z@hRT}eSyc2Ua=&)A~$@q0rz)6kgf>o+>hz#Vu-=7FvD^M8%`EAFQ{6NcKg zddCvTujZ9239k@?szI7bpU!!AvFW3GsY7FRyUmB`Y-ih-SR*tmv6C#7)4n6S!!!~zX81*y& zF5EE|{zk?~Ip{6KN6laT%fryM18Qz~^eGqFcrs-$W9BiqEy-|oqvqMti~PIHOIddr z&bo^%j^44vS@I)8>LUj$x(b}qnpAU!vLP5L&x{%JlzNT}B4r3NB{AZxelA6jsFb5U zUvngD6oE7!=;xeGQ+Z5PdSk9%TPW39G?SLj`9aFTiwern;jm?~i{pECg_8tH&d2Vl zDY6FJ0>v1h6j#hIA;=9|j<&>x%0&x(cI5K-b8&aZq)hR(EXOLUF3&=Wq+Q`Nsf4o< zco>Q8n$P22^}14pD-Wnncx4Zf?~>H$TSEPJZLhlw&qSn9Zs}xQwNk2-hJjx9Z?OX= z==oY5xq;i}e&{-t0AI9tkWg`5v{CIk3&}iVc$Ir};?O0TFIO4a*{+C7tk%K+&EJI{ zC*3=wo#WSS#et~sy|`q)pAL9(xDgeo(n_JWYM;wUs%}r~rWO}=64ht?!}FEdD7S=(&|dC`rSlH7g_ z*B53pY)`coq8(@GrcSQawtC8B_3}F2OKPbbnMfU%=a4qz8N$3Y&RnIk;qx2MPG9Z| ztou{*ue%>E-hW%rwXcdtppxXlT&0hWn5+clI z&pB_Rshy9vBOg{xSae#6BKs zFKixmMAB)yjyHwz|A@=0( zFHGbOqWt?MHbxyD)Fjh(#+~!%>!ZhzXkQlnPmO8u4^*yc*o3Pwc&`8l73qvpC zORXx{YL@Xez*Q$2v-Wu=t z^7y?wyLi!@47%F^of#t?Xlb2`noWIWYi{=^^^)Rgrx=rkR`#OFM+un&a>RBUc4GGT zedT{E+?Kao<+Ha2#L6SHIFRHMQ#!W$A)1z^q<%(y)q-fZJ`|eOm5466f0tRr_JcZ& z4wdpm`%FO4oC%EvQW8wnc98c*W+~4bT_#3F$@TLFO#;gGZ?tz`ZKMjqOTiZ@)v#NjCHKd}U_L zmOpR}@fGO3Ckd9ot+U2IA9;P}D+O(b-~I;Ev)JeElzq1LB?{|)>K4i`OIu?Gb)qbw zK|wNHtbRPDiWvlVggjV6BO(^eZtDytCfXbwhO32!@I*E@G6~vR1K?ucoRw*qw(C!) zPQW{_EDdNCYe!H$o2PEq>?x3$%j~5KKR_xLgQ$mw5YzyyPG-2wL4GH?Y4*joB}v>L z$*FZR{eHY1eX6>PIA_0g%Bm4Rqy(E`bYac703=gKZXKkOgcRVkdt6hTK^z3wUKua} z4Ar0eWa$-M?i3P5yxovObs-gQ>5+qgjtM1{*G>!5ifrSG=w@M5smi!MIY#Q*{tr4q zW$FsVG>9XpcopdNjl2#TlCOUOt!INM#)<8oqH zeV$iiwxV+oKj4EUA8A*JjXYwQP0=69nE5uggR|p;OE(~9bbb9EK+L&fC~H4>z0mi? zRQBW=GIBq9#=dFX{w8v*e3;8gm1JA(FY<9wP0e8)58unUZh?P!<_oXc_7dsuXaA_Q zP-80zl+NY>Dqrh_+E*kK!&pCGR}BVEj}^;+Y6G}4D0U*Ckb&vSE~6yoX=e>4o&WUOcpb0-J<;zn<6M)>z)?@JoiPw4Inx>_`t+3|l`Cd7 z=%Bpk1q6&YKS=sz@fh?LS?ffoB)j$SGHK4wb!6@67QFTvAqv%4I?wl}qIPzuW3sgC z(G;d94fc!ZBi`~Ts$zGP_ZujQdQkk>i-*<_15@U<&}Zl+6`7e+TvA$LDd}rX&ibD3 z(~e22f#@oP$%4+&!yPDv@o@JMrjK%hk}XU=7M6E4I+D-nY4YfP?9zjqhc?jC88%}2 zN%vS|^~qV`mi%Cg{>f+%ZTQ)r`qIjiUZcSVK%oJ@ljaXgfJ1=p(GNp??qH+yASpM9 zM&>6{p!7KXq*-(!X^}dwoG#svok^8n`!DU9r6Y96s`r z$~ZQ>z^acpZ`6-@WAHBnIZSVxJJbx#;j*{*OKWsu~>30#cB!L|vijO|28{;1Pffa>n}ffn43)@=DR2`t&% z;gZPdI=tPCV^{$>c^DuPyz;3=euKg%$6~8`A31nmv&URxH4bf-H&ZzszHnObbv*Y= znb_^C<1%R9`@3sSy=S-7>k|b?`g@^`djt107T*mfJw)I*D*ATdm}0+Y(u(87>HZ zqcs6UGu0A5k=sGRMU7b1yyYegur`g@WBEjJyy4OaEnP!au&vtwPQD?DX)s0#$xJj& zRIc76D$l-xD2NhGCD!#DP~v5Rj&$CL2+*cu*Y$RQL9_}=U!nn@u>@#)PF+EG=p@yi zpEoC--fwF~5l#ob!6B2CR;B-?=vIyYSbh7dLoIs=fe7QV>KAOOzpt-VyPr~|vKUTW zQU6)ovsp_&{VO-Ini3uhB#XUmh)WF<_+kDcT`R%DvZQc?`gFh_qs_8-)D*H?VX7kErlQUT`X+y{Y>)@e;Lc<)&CVg@~)db3OV z>`(uKkDu&J{5-U`2h&N|b-qIleMInQ%y65r3L3Kz_wIM8`_Bm?WgnQy`*<8m!Q@6%aE|T<;({Q`nV>_CsNYh|5pew`az?I*^-m5c@2_Zjm;gv_ zGT~?K&xNR(&qad_KCon`1$~ud8DxBEK;wYbO?PPXaKloW||BZ+8{?q(k_VVa2! zMU51NAAcn-q!`}J6#U0J|K=U#^s%P#2RUNf|7BvIZ%vmrdI`>Cn7$OVke9K_X1@-l zcnuIlCPL?ut?6yK`eBr(3|sTWG&(QWs)HxYYZpv1{L zGlywvd1G7A3aety$Gacn-h-B&+yB^M|M85B;)$y~aSSqO(MyMZo;_8J3i`o?T1S5X zq#*oF#G47VT?FN>(y5iVb92Y{Q9S8fjE>18euZm{`dm3JX7AQM%_F_h(ZZR=Uj+R{P%qlr}^D>1uf zCs7lDNoRXanzL z*RH*UgKG9bFE!aJ>Yu5_J~yPAV<2_^JdvVx9}P@2!8wc(@6UXb)DeN9L1?Z#D)u>O z^x86aYFgyjbI56{8Mdkpo^Yt?Drb-xOLE<;OV@3$(5+WS3BYY!(5=?tfCzI-LmJ!|7*R) zSPu`0tA(O%jXX}VG#g&%Qm|$b+(e`$ENAY$*>J(Q{IdDfJx}a5H&~XH{G$iW#~d1o z`WCcGNpqRCK&ccCJIvDVSg~Xb6__@(nIf!)TX8_ppKxNd+c<7SFGX#$cm$uDpT~H{ z&7Gg-xid={M$v|LtUR~-DHx5Bs#$A&L}X<#MvSs>C3$vr57lA-(4|c1y!U9Dvv)oF z_Y*{pkpboe@C=vyU3Ez@=&do#Rj8(YzLPH0!=V70x9E&BYWvDat}`X_BJiE}FNg!O zS*F5%bdFa2e(1}p*7bGsu$zpcn);8GzT1^6En9pu<~flqL)Zkcgnly_u#}Or>XSFra(;SJ=)dyDo9XEZV|ElmBe zxKB!O-k+zqp@asUPn-!>wurgN$5j!vD9!~ywU?V7t6j(E77R%tymUN z?)k|56KvuPhVqCTIVf#u@&P?{f|C|P-E)ikDC193de-{H~q@|DV_>~l5mO3Mq{=&#+*1PM>^p zDCG;Q4%?7K58A$5nfA$n=j$pO37vkbHglhOj>F7I!&nhl_v;r>8a)~0TO5vDQ%l1hp!1@#fRb8Ek%B;hc48LUDk{Ys* z9lnDm6Z)jPFPJ zxJ#kvxFD|5Xe->+z1(xT9Y18Uoq1ii=d})A_j}X&nI{ke=LSoRGzZHsh4&Tu1hyPj zB)x;Dh|`Z`UEk&eK`4R+bApOA*jz?+zI9gd=<%SHhBQ-;Dy=+?c96jU-l%UaI+U3R zL}FIoV6=Mmi9NXZ_N-2!y7gn;d8?lCsd^q6lF7+*1N4@Vj<@Ef^y+f=Es2+w^dz zO)<#VvlD6u`4`orDVfF$IxAg%1R%GdjFgD93XV`xox> zF-(@bS>-&fh1yLN7#R*{f&%BcrEdEBslsgFI8j?44fDzh`sj z3!$ZnrH{;ASjjdnp@3Wn$K;}F7=BIE#Qug{mVGTdE$D*HmPI?yLROi5lgm|P)>G-Pwoc=l) z*#P7^M;nf!O)DbCo>?NfX^6@#0rDt6Rm$Iao#+q=_%=@Gc(0XXUd&CmvzkIv%qw$q z)dIT|dOLeYc5u-p5dXYQ;fL}2njAD{DN{eQiP(E8YR3ymiM$~3+=z(}do~qMTD8k= zQs6&lJGJ%2jS8fJrGBYni7h5Ff8E22#{<|hlubEEK%}dJYG3-=xIewN0ze$pduRW6 zx7k9Q2a!)xjJ)BZ{lp+$d08$dk2Dq1o{45HgH`#F>j+A#pKCY{`;TmHquf&rjB8WzoD5^Qh2J6%YiB!l55~Ng zq$fji)jC0Nm=-;r=;n0i94#5_>H$QPS7P`%ihF@19-8}|wRb&bZ~6|6Og(*w8ovK{Go2 z>|+z~5CVAUsYcgM!UuRolG~mThPXds{Y}E#HcB*jl`}%NTiQKdMSY5elDShY)Z6Oo zz)0#+^cQ?>C~}%*Lb(JZYC;zaC11Bw>3(%mkN?(O=`>tnB7cK_scH6l`SKul*iV** zVFXyPwj9xLU`nZu$lq9fai-7;WY@|Dg3}SChyL4!$JV| zRddTW!?KA*(fMhB#f+_fm7Ds+Xk+<)o*tN&c~ifI z=3L4Q$I(BB5_+fd0naxZMMM#Sep=|WB`O?o+1RrSoQX_CD@97AKI9xXB4nkHni z3ArUMPk46D&#fKpJyXSd?H7+DU{$-J89*u4^xU2Qua!RM=W&A%X)lI|=-qNB^KBNu zHKW8jtTWj_Da0!HCLS94KJKu^y^2S zI5$Lv=;!#HYE_nXj4W__Iy%RBBs70R`jI)P9(x7K@^P!IdSeQ{O~Ha z;X?lq<2}?WCmU>v$;^BMEsLctD}4V{l{OetQSR#b)~t`>$s5j;bTI4_{CJUnK{G=z zald0ubxka0yvvenzvAJu*924cca4{Xmuo_c@-b6^ts3>3miZtedxFDeOtm!6#ZXvHmGUn+f&s=+bmgxE1} zDLt?M5X`%ZUTa|a-0?M~&x{EgVIHp!L3h7P-+!d9xV?sB(NgYwf*n*n^aiF}YwY4f zTfek-Hba|VY)1X>T%N8e+rCPYWip8J5BOlBY<7rm$e- z^{CY{-bUYIlNHYyGy=$roo&cN@Ik1jIB)OJ5BdQf@o`gEYoz;oah#MN3^u?CzTZ3j zW0em$C@83`KL;+ykj1I{`z_u#{@^%~X$f}omms2!`#nln2`i9La@79yYh7D3!*-{E z#@Opd+xn}uZ_1g8ay7x9jO#D}-fQgaY~rtila8H`C*ePfoY~}D`gttyUNMP@wt96U zG~G_aUsk1RyRK}^7$7m#D$7pj_y6Tfb~q61QoNN*;e&!%n0bRNqny@jb)K4#Bzp#t zT7)|31dZ%P_dZ)*xFBT!y-xc`PxZE?+;1Kfe#8a*Z z_*Iu}y^HK3YZ#Ib9+q~AddpZg11q28-ouI9IwPC=VnY80Q3yT-7i1>Kt*Z~UiPlzm zXYZbxzMVQgw{%H>hsvXzj4IOqDemd2y?YX{8j_6VcHcShmz7m8C7Q8g9;qVu^Q1%& zYaz>=jXLOzY~?(0;q)*Y9!ij8>$~s-R>&T#M#5}&+r5VKl zh&#C;5ARh)kIs!M7Ez*q!xer4%#L6a^*H?Z*I@XugMLj5@%+KRmi^=<$7e2ixvj=f z-8-Urn^#nea^EfCvdqNL2j0O3#*CFMl|yIbSNOayGjr)J_jL7=mZZCr-xpcpQr8>xn!g6Jceh3HxzL+At%>QCh6Ub=E#&74)~W8LYm!-l^&9@QmxY!I_wp-BC3?LDpg% z0?dfuiIhsHs?cuG@wO1ZU}EdfPG!s3ixKXC3H-RkC`$c4+9lic($zyt-t}~9+MPf9 z(V3omUs9~~v2i)K^)QXYfIPlEoo`{5HQF+4`hpp9@==^W;cnYidA+ub`ZUT}_FZn& z_eU@hBrxsGW?)%z1)tB_(x=9Y$(?bN3QTpCojMRH3cSbC3L;mw$wANopu}0!p>B<; z7a&gQ!Pyx?bU&PC*@F)3j??^^mkMO8gHjAH+#jT(((y1@`yA)Lt6fhZ>BqeJ&UxIc zhCrt)qcoWRi1Juy6GqP|J?NyXu(9Qm5VuFg^hQ*|&5hpayw)ob9J+%`Ly~hx%{w}pt20zB%IXml2|yGi0jcZl&?|g) zyli(U1FF1Brspu6mx~Uc1rF>M42gd&xH7`=df{kPngj*)i<>G$fH_dNV@|5ILm=Wn zzwiea&`|hr$>Z}Dz2dGs6;;_C2#DTl3$07^TrkKswTDj5gy#ieox?1EVH{UL`BtlUW}@jYoXh zwdi8|PUc-DiE!pLHzWtm#dEl}e$xVL<5)uNn6>Njnc`h`%QSi+?2DdAbN^Z87_RtthiS>|>QR}f zsqFq*rjZVHsf{#6@^SU44~lBxTy$LCy*`9KUk^l3B!!q1;V&wW7@8iJb#MxHwCsF) zqxYik3xsLW6@Y$_ltqG%QVPi7UkiOkhyL#DqamR^FWXPz5~DK{yDHzt0gSE^TxwuZ zvwbS5VvVCmjTwTF9xBeH9fe{3SS4~4+A-k;9IZy<^t@n5sOCeIcm2?-gW75K>rHa9 zXKkvXQ^s?%a5dcg_F?V;5XO6R|afy{pn)172oo0@4y;IgIX*|({%zGA(x^H*50#@@?FJxk0 ztL_|tVRo_=^s4@;O#&*c34A@OG9tD@bqQg^g{T+X$4Gs3o`O#e3xC%0r)JCr&bkjQ zL45(sPR>)4bibJ$(m=yoiQRCfO=H%SU@auLK__f7p4YC5k>fFu`_R&%$&^Tbo2ZC1 z$}>X}P1UD8exye|jxYPRZ1D$Z+$3Jb-6tnySj28mw9?H~$zhhE?Z^OVPcPCvt{+eR zBMo%#u0{&_d%^00r&8++{I76@GL0iq6wX=~dz7zoXBM`3E&D{)O-_Er#fM( zr6ypDQ90aGqh{a(*IO(BNERsZ%E7WfSfuWh?vSu7y-jIyX< zD%bQH4ls!A3sW2es;0QV{XXBOMF4pdCDx!TTTP8JeoG&*)MNnIsD`<6^KJTCm~BZwl@WU_kbuF8f`Q~Y*--xB{-a=o{YY^7aI zF!``h zJ97H7o>Poc16UHUZbxvKQi*;Hm#MRld5Sl^Izxx0oESQ>4^>CgI62+1N@eHIY{p0n zRhY@~=WXZ5s7FPYBvwziqNDIscW%mYl$I%3hsQdbL*Iniv^erdun5h98JY2*9e`*; zXmHOs!&jX;1oOHXjEv;BA`B3&o}c7DV%m9?=n@x}F#Xyzth(ANR#c80Ddvd2`Lt!6 z(Ah+}en3jjasZ1{4yri($AU{(JU%h>5OLU!qtk(UN7cP}k8uz7#G`J?imH6b9MABP zsWoHJj|P(NOPtN))ugG=DnLoB#jsoa)Ukg~ z2KRd#%F9z(GV00W3FAo9%B_Jwiubbn&BH@ZRjp{gKHSr7rq$My~vb^wM(?>oS$U++)5{-?Uxx@l8VhQ{7h!jHkAn<^U z;xRZspoRIBnV;y>+*0iKRrrOe9C*`T?W}k6Xc}t^?3sS;j3|YV z=b9LH(c^g-{2~q>W+jETGo&ClEReyH6m7y$HsGtQMwY{dCX@bgHlnR)!htcC$ePS7 zoStSrU_0dSLdylBt+U1f`t6RTv-tN0tTU0Kl88jp_qi2i>uM<;mSQZdD75>p0TTyn!kr57beJZ z0q~F`MBI`%)~H#t;a`g=dt<6W-X%C?gqHQZcx~Qj6nl7e>y8@6OsGWl zuKVdv)K3)ugrRzU?{sq+V5Y5oqPg>*$`hYFDX&&2Mnn~HvGzPvEIU*U8Iy2!pB|=< z>a2gvhKlS7p$3+A)A-%nQD z7M73)*?KU`h$O}P$_mOHg~#+yc`>D$_4noSER26D+z>s zAOF?3Ky!U;Fj`Oz)+bCLymQ9J&qI8D^Pn|LWj)jqiQC?n)#gX|PhL1FQ425VZ@+{h ztiEJ<&rKkuX+Z|8T12a~Q~tuxD@CTb?Pdz)vwO?9&rvqRaHwf8o*duzxS&@W)EYp4o@b4iA-KnIhi$y(Q;OFUnht1)C|a_+boL&2TQ>jjC4f~ zsKjMlPF8dCxCwn(?tgh!Rg^(RbBU(La>}abK%`BNYagajqmZN!lIo;C^SRZ0i995^ zGX(OR{mQ=VX$yfW%XMv;sH;9Uqk9VGe+>|>c^JSVjfQIhLxi`Z3jUx8$@&te+m(Oa zh5tLrdU4N>A;%^|oevAGrncz3<`N$uGb}=cJ9WLgkv2P5&sV(X(C=5gqwtV1p8fZIrplsh^%03Q0@H3Iye?8pcoELtk$RtU|EN?qCX#LI1M~iuUQf|g)d$KEkr^E`;gX6OLhhno82q{A!eePE- zU^o$M>;NaVhJdv^jJ8o{ceLx%j$yG*O95Ge1*B)F+Jj2|K3?Mtk*SIBar>BVd&-gQ zmFpcY03GAD(d`utY;(nmIb+=|CzuCyp8XmZ}mlQ;v#b-+mUXCGDKB z$0A>DSXC+Or;6R4e;WJA*>tB3vKB&=OcnTuUq_}rf>0e7!rjtqgn8k zov1>R!5^dmh zsq1$+XiD(&w+7EvVVyWTcEhNMAew|t-P)vL5L^9LD2SQrq~4Cgs6lDT#iYRuey+oN zsuDxmvY5*XNB0~=fN8)UUP9_FJ82_ie&$y zD@4#t_sTu)1pLFK4~Re#^*)oECD_AfDBIj)xv&@Nra0AHH%&)ot^Vnt)N&3-J56-a zFC2zSw#Fip^ei&d(0^Sdr!tZ@UkVG_8RvtRoY2MvEcdN(~YHQR)IxSE0t!2%E$w7#Ym8LQj$C^P~dDjHWS&&8*j^?De!befto zV1rVlb5o-jm6Z|ZD

JDbd*mqEy2=Fn0fc*8ew6TpEcZpeV&aNj++N8z(K<3HOO( zB>xA6T8w$g5IkAaX&r9C4tNxEWcuUQ*a7PlF)8iC-@l2ImK)SX!;eUhlJJvK0Mm(OymwQ4!M9?$Jf%!Ve3Ej$tg}oWGPSoa7>c&3qO5iN-v3gLQ zZ|(JF*e^QCDYPIZx$Gqj-HB=C;);Ji$$b(j0w- zm(Ohj5;w583)t-MkXNM;}Vi9n8-5Tq4#k=c0izXTkG{EAfIXq<<&+I$%^)d$D}qtI!HO*S7r?}J>jd>#%3L_zqb)PJqFMv2<~a@HpVJIbWGjzVkdoeU`mR;g;GDTJKx~FYY#cQvu^7%&+Rnx&&wZKme8UM}KhrQ7h+`3X{&OI?_){ zyERDnm;QDHRu?nH>c=KWY7(KGE?5T55yPY~C6-=o6lP5MCVbQnygvb+f>@ZfeBU2ijrcAb-vkmxx*8 z3CuY#ZqCY>ZL2so6p;@uleb~jZccd>r~DHG-X-6h-H%R+qA79R>jOtOl~n7S>z+(; z9684Dz_AriSS|evdFBwsBZN`drHae)ds+FmjSZ(Q+fGvh?SCxv|COJiXKvd2qU(YS zK;In&WxX??+uK!<2FmWnjAC;%_X!03CNVg z4)*frxefnmr<|nqmV4;3QQ0A&=Yt4vKCx?otxI-aB`d=wx334yA9uS!3hPGm592GWrF01NSY1V1O79sS z`niW_yP5K?UPhf(b&qafOf#4|uwhnR5mydSGv2L{gj&L-iM^-4R7DKiD9dDgq+;(M zi~qaZ+o>W%ZJD<0eyP^f7TwV>y=TgHN3xi@N88*9(5h}{ zj)vFN(@hr?np3eOG1yXuhPd?)MpBCtZ`}($c%27Ij{G|kP3vTJidAbcs*MvBgBC&y z5kj`T8JeVfcx|{mSG|}*Sy6?x3hZOyCUN)Nh9poB+w8ORev)#?llQdl*$mb0P}`Rl zisROh3K7JuAL~J#s1@Qiz)v1Ns8oAQNw_NQ_$n)-->HQ{n-Q*#WbuX_#z| zMG~_bS)j0pq)2Q7IT~&Iyu~?#I+YBweT@IdL#f)T=F;Z0c@_~orGNnHN2u{ zkEC4B{FmBfoddBi_o;B}?e>9Yl|PUDYux>0Y1->{51uXKs2L6=Bl9xh`6Y+m3~RHl zkS6oi5)Rs(?4jc#+#mC9l8M5hi!wZwZO2eCOg1Xdz(mh9OIQS`7X$ig{t=B7z+tKC zGc^<`5uHsT&vMT>@3nvG45eewj1$T5tQ-g_4mBu20sw}_I9(_d=}R6Fqp-qcZo#%A zImygoh(O)^t*G3Kat>e@)33y(!yE|}xg!n%?34t*yY_UW9@AUO2vt_HPO@W*B`E9w z$;XH|0~$*xTfqawI>l_Cq7h3l&St`aX+}`gvQmHkA>Ywg&9fvsgUNLwkV!O;UX#+g zVR7ixrH=F?GuL{U*P+B44aa{tCT^}~+8PCCR(H$-fzS9usOI`mLF*l)oy42J(os=s zg8F;;89nTM^tqKxAA3N1Ud?45bagI$kIT&vh*qlV-=|;(3~^8G}i(HR)R}`S4P0=uTu68PaFR&MwDVbr`6&11^jv z*qp=7Y8gFMQ#hVX01?2{Y)XLtg_5Pvc+U8wmQdSBaJ%?ZDIBhGs+x|tZBP&Kp_OnT z>F6FPP&_n=t`ASzm<2BuMwu2n9BJEi z{f%1KL;slhM>42l!oA*Z>i1&J`O-B3@p|SDExYB=zot!~d0j=1dtFLbwzi>hEwKO- zJlEBnZ#9d|DbvV|T8f-#T0|kJ+aCE>=uvdW8UYj~Z=lKy#8JAX)uK7g8+~fuqA>mD zpEGmj9y(J;g-mp-R7BH9`MGP4f_9rRWgAJ2T0x_*W}B9GGOb9;I8`kt)W|@GbkL(K zX^4QcbPIaf!bTLzWf9>5W;^TEqNmbh&!1wtk{Z%9EvELRXpbLeOT}wMoM2lcw+HGK zV{r$46OvEKO+J{6Z`n9$l%ZC6CL9<&VQ+gkl^6Lk$@OA|w>`P+|KaKD@#jSbIB=K>_$x*-g7^9J#U>AE>|;&| zlh>a{^yrs{KlN`A>L!+hIoQ4I!2| zqt@;*Z5d{KQ{S^onIem`#u*?!!2c}tp}tqDt1UpG(2Hr>=f7{YyA3YYn)CP&K(FEP zA4BO(H?Fefy&t;$HE4wd&MClwh}kbZ z3LX&qHJOB}#hCj`MkiZp&(I%sddB<+ z@E#z_&Y_CxQDC&ShBRqTLOG-CF1NNBirxHl7xvP_7=uu%7m`Eu6t&-F&+>B|mw%Q> z2&F?(^;0_{6;sf3(x#39)91S_;s^V-Q)KlRawDXDKsaFXmDX$2m_^Tdp*VjVVBcF9z|O6Rvtqz6ch zvK=NlFC(07#H-4(GuJusTD=DW?&A}`8=RFZgYM4W($1G5V7XRcM^<+9%)E)}t`?S~ zXR|a;9Lw4)&d%Z_jn89=i&Ae>UdP}|+6vxt9DsZ?V$yoQQ>V#2bw!Wl?%c0Ag9Ri- zj{(RXx-z5KTMMjRV3JSwe8*+$y7R8cVhlqG*5Cm+kAHRb8BFiVTC|T&4Wl(b!K?n(O6r~*{H*TR;hTq?K~5oNav!A9YKNx*f)Cf4 z&uPsx`MX#X=)SmY7mr8iSBe%Or&botY=p>*zKwdNMcbT+T+xwIF=iJL*B8GHf@4*b zNuJ0;Er11S0}%2TVYoLE=(Y`mM$ZjK$z&u4Efdyw!1r)m7b$M=1@b+4V7pWg3rsh} z|7X$9MqhFtxyQj_n+cMxQ&yRt{4b#>toCfM%x+dOJ&+iSm6WNO*adAXx+KWEO);l>}ZvV<*fPl)K1O;0y| zIoi8uF)(PZSgzBp%?WQFGhn$NB)fV{`wUlu6*dRkOjPsZhiyx7Yd!9_AixUH~Bn0}EX@ds}yMkhytoihH>5_(#d9M6ZobeX2(hE?k4b9njRH0foEWV$_&<+US;=Tn9$D3MudMBM6Hz zK{&4NYIgUcfkZr(PFuZ!ie-``zo3V>ZD37M-@r@}sBye4=6gASEgiB$&a!JEdQyL+ zmi8r2j=JSZZhW})4@lCPCcolH>1vPEkQAw4ox`|M?h*2Q(Ua1uNaf=%!%zyHcsTNL zlVyls29mUKU37PQ(7BG9R%GQUqcc#KI2M#@#Ir}7;g-yF^`%555V=8>3diyI7;lXK z*l?yZi~x1-(`;)XWJOe&$5GAGh_&J>w2uY8(s)gwqLGf)79SuH?>tZIZv|Ie+Au&3PvCDVa>sC6g2s1(2V0() zXgXvgX-`{G3P&@fJYP(%Fkn?n`Ei;sed=!Zor{}vWv!-*u042vhU z1$bWIFB% z3!Jk*9`}m0w@&9Yh1P|RI|y0wmddsSu&gu1DYofOlaa{w84KBrzP`sySPUXHI1K2v zhJnKk{!~tKTi*J;9@~ybM2+ZWJE3Ln3OhU{eo=(HxJapxVcU#>vfvL^YH(F*CUV(g zn;@racVffRq94xbZz`GFwTZ|hG<^^dYqtX9BzZ!6lu=vWnZ5jaFa+S4rbTd;0-idOU&9zBz>6pIQt%PFEWxh(^N)7M&-p%8I2_1;c_j=R{x!E4WE zcgnVBEO%@azZz<(t?^+c`dI@bl_6(J8!ouah{zQqICHWYRBypasfbciD4Ps){A=k? z7VpVD&f;S-ZL#r&hbXGq*3hMT<|OwDHf|0I@tQXOr|l3n6fU}ccOym?5BySc%Z7DA z#RtPp7PXiPu7r46=eQ&>9(PKDXSeN?h>jh@^IFVX4rY&YVb(<_Da|Fm1mm*8_2q1b z4JDRLbE{UPw@8e)6QT<9sbvM3PHq_%D6X;Vaw^Kt!qIu4zx2lIf8x5awPt> zSS2z|7-MT=d#{iHY(mNKRf%V7s=pWm#~ZO)A13n@+;B zgb#obY4)&E!up(chhW#M$=QM#qI_{)qCUV%#S|Fr0KtC356LxVe&uQgRNWRS71hTY z8gzmNgo8OOffXP+@B&eb)U2#iP1PSs2kM!MBEytJH9M$C+xAlMGIro>pu8OxbJczd z2A<$l=@%P^GL}0&Ge+n$lTspkD;Ues#S>ko84Jv&NQFqmYL4bp z>$jTskG959^RS#|HHBKN8j(6{5ND|L8%eId5>(;B2#1qMj7Cc^ z;hdcP>rJibU(J{Qy~;mt!0-91E~v+mBsq`ua-Zt6T_%IY?P$WmR+QjpJqFsQ_;SBQmnwa48n>j74cfV)xG z>TA5lU`7h#W;4cPO)BQE+U-2+ z4b&zJs`qWQ?8y(vfdRtb(7MbT)E_lT=e?Tp+_RCI%-@}$>O2*Jo&k@g20-Y@t)on1 zm^{JBpMq+o`#rvVRf4*ZjN^sa^dvXstZCi#4C+YuNvduIX5nG2@RXS1W3)k8J2Rol z%piex6WNguW!rlp<5(-yGc(NWmo+3|veX0^uNn!hm>@c&L@M$<*v!RN9bNU&Cs$w9v~};vrmszV<+-p zSRNsDOT9CP5}YM863FXirnQ5!oG3kXp`}p?m5!DKKLvQu_4P?5+x}6T^W-uy#h}#- zi4iad*-S>pTg;p1MSMD0r2P>8=*ELcv0TrR46e zQ%X#tr6d((V;thKW$UGF2sR^@}K6>w6Hmtd>sD zXIcxK{Sy{e$ZYCkvyg7`gC2hJ0j9}$meW0+Y%>JG;7SX12p2i&tQ>ugip2#SLD?Ss zW+$!v99H|X2ITksenunL=8m;-^SIOHbPFj?43W54-0SZo&end1sj8}FqqJC+Ebr+q zisGrdOSIDHWu90w?_s8uQ$5z-w;86e?m|l0omMKO&Urx(#Ag~bwC)GeI6-kz-&@o< z0w%iXX3Sk3(urY1I7LQJ@GEmD@QV9)Ix+h{miGuO37*b+Dm%)6;Fxi8Wu0VHvyws> zTP!vD)7K^iCqIF&na)GDLNU`yyHa$(_9Y;y_51SEV=n>1-u*=Z+n8Z>Kh(k3>weyq zQ#Vagm-+ovN^dwXE!umdYy96GeZuRZ%8YMf(cowKy=A^)`g~^Rvi_UAjrqr0#lOKP`!x!#36XzQ1-Z^2<+@p}q5;V7Qq{_1AT;X|;abxMKASy`q7kI6?AC(*4!W2ne-Sk7&ZWHL z_IGq~tz5hZ{OOn^!m55O<=O8KwWzYJUnd+y`Vbp*ZAQ5I7^pHs<)EY{&dNl`olTSi z6H4r?a3?M@Kh){8EVZ(&DBjbE0KOjGoEX!vOnjm4R;HxTv_2G?F#Nj{hKlnKiWiu_ z_s+`TzL*emCHXmpuWj-maz8FJzLHg3q|ezcYu$te3v3h{OWqCqF|#X<>O&u_wF_Xa z^GzB~_qfm-{QB++@Cq|;SJLZBpHiu@s8e6JQl}7A@;z+pgShMi33%K$sB}j1HEAT= zELS&tg-7ILO~|tuol3WETdvYB8GdHGR27!iyA<2-)23PE(Pixll9iiS#Hdqo$NXm< zJ4hr^b}ZWi*vL7>>)uH6yTWn{=qdf2SoL$h&2J)HK6i~4d0p4D`_&pn2$a6s!lJqv z`{9*Vhblp1bx}VeX6j$9*6g$K{ICHraKVk~q5v3iptha!+FJ+#s13|z!grkXSnJ{U z>MCFacRz!!#5uG(_Smt9nUfc%nR1g`E58_VONNrMh9+ko4pJIX@l{5gV+H+y{ z4)S9ieKn=+hVoO*47v!V;NPxzsg*v}(;845#IUM|qT3>4!h75D44(8i)@M4S=2O2} z`MmX4bJn5nZVY`Rmj7VlP;WZqN2h`fe{XZsF`GJQ+laU~*cKEX_Z~AjbZC0wY*Rzf zr6<~y{=sTs8a6x<8~Z;o6-&0a_p+YXnv*Fd0?_3fGsb;;ans=UHw2hm|7_}`s`}l6 zKjXyZrMNtc&hXskceRjgi*OH>7JPt+8@XA~@cw6`4G@UJ5I!VZjNJ2^Jn6p6CtlfRkc)|sazDuKbNakh zNf`0C#)L9Ciu^9?DJ72E{|F_2S-QLq6O)2rt=AhWEnYkM)iTrh<7nHgbS^O?7lQ@H zR;cJ|ur8$12YggUnpcn=IDXm+C0v45uCD8*_LkV1<3%xXfQ?*Wgvn6NwQ)B*-sp=p z*UB?GZkRg`H|8@Pi|)czT7%E!pC?QIHOfQDgMGlz)W#0^*abL?(LZrMJPR%asBbau zZBC?$+3J_%MyqG;I7UUNo2@u23@a;Pe&qERlpAnCb@_38~&X#$Z zp+=3@nT<B^*=HPsm4S?#|BhQsgwI*WOq|lG_`qygz-yz#Kg^gUJNyQVV&dHj@D6??&pvqL? z12Y^=KzBhAZSO2)e~E@-2J3Z)U4PfjQcBfiuCtg0^mIh%SLwcX$1{M=wwUDg7^iUZ;1zA}kE*E{gL0C)CrXZAj7iP_!b>!=dF zQ=z0tG}TIHQ_GyF&-RH!Tm=0RfPK4>NY68Tfb&zPMHVa8t2j>?31FImm*ZXyxvs-( z={%+iNU;6HlOvGK6dfx@*oXkIhqI1qUlu)nMO-;V+}cewfX-}(s+W5uJVnVtwWEDD zB{bM2(}+KhTjfsZ>6z9P3b$^H5%tZ_2>RQwDwtv2!Jy`H_p7X)SouS*s2q+mLEly8 zW!F^_KVgqa$S?~L4Yd_^=2LRwYe?x5ooaR)fsBJo9WvmiY7g|=_{xL)uF~xGP0pa6 z?P5G1FObK(UK%HmrW;*&TE9FA4~n()LPo2G zlMHYfTH?G>F-|gXSyCh|VD|^{7Ai zyUwRfC@~*b8ivkPB}+hioJM)4*vYKGqCJTR(I*&uo)nQy=qEQ+Y@e^pWYK0g(d#Ha zh~>3>VAThqZ6~zwqz#TK^?6MT>b?aonAaqSg6b z<8@{`x7v&_=d;E`E6@-EHTDZN!uB*krOa?PgUg3Ph;ft<$L@#f?uv;dmPpd24UrZh zz5NOxg$DH`HuV#7HHWP*-DyK@8Utjhc_>M_e#q^YeHdUq;r0Tn& z3IJ4XJ>bLx6DPrrnire`f8*~;jS-$#y;wy3-pd+NaML~lnj~5)9CTheu8)&8wh+WE z<@ewX12eCTfWR2rsV&*>r%CiU~~h4 zs-_t(oNniQL+PXV@@Lul7v>R?Jgnj%oKJIgBqO>j2k z^L~L>syJomeE$G-vXRYpUtc>VUi*UoJ{F*6`_Y6j0acXJELiv2q>EN>fk>Wxtd;57 z@cp2S^%_rj{MXODrgRE%&152S#=E-$?lKqY3$oCs=kZI*K8A*>?)p>jM838ra#Jb} z-c~{xZ8NuYh#?#N>*P72YN&kd;jI030+xtbRi2z0jO6_f*Lh7RsKbh{l7r@$?L*L1 zZ#l=Q2(28<&sJ5KxeW39d={6&I(5LoHdbgonZ?`+REa=NUp#py^w?UwiA_U?A z#+b^Ao>kxI+PHM<{YQO|PA&UMSK2|a!+Suk8x@4bY|xK1x3X0J3~wGy`Y@ zlzVHY*$RMKRxgoDVHr^4vqpwDUF_}Pa^bInv)v9J&#$3=EAr}aMV zAX6OAV5gt8!J!g}@E0TG?2EC!GkO|}9XS`BoJdHSz^pwPc3TuMb_;j8@l7xmfyL19+f_u8DXvhHa}h~b}_kpA}5>4jw_F~8O%##c6egd>YX z8A1p36N+#7g z%n8U!*S0FZD6t(>hjP+abqMpFh3)nTjiVKhVhOj*Tr9`TJ|Vw~9$>Wmcz#NQFB+-W zaHVq`g!G6gj149^qclZ-TiGLrEZROM?Du7Q@-i{K?=VVMKxYU>(N%7$$Ky6w_Sh`g z;3&177M#vZ%xoXSinPp-HUd!99}VIi2SX7Ec$|OPy$~yU!HI?#f1SfM_^Ah$2dPDr z#^qvV_c*M|jA;y^9m#4qP8nb*5s=x|mdW?5REJBto<6L=Wl&tT!(3-Zhgb@W*?(EL zd_t2(YNO1jC?!qgAX_K)`3Ecnl+o824lnp9rxkz#Lwn?NaB|OzDZ@QUfB$$7YeUd? z7r|;W4#rQZFtG#PMknP_;rfr2Kcf-PB%0#(C(`X{1*hAG=gO$o8g4Pg;LWwq~vfPn#ya2>UK788!$? ziU^`1166Z5<%0|)t6)f9@&p!c{fd)`;uEH=Hq8eZk0y9k(pWqV%jz4=5Umd=4l!`f^4r*FW)zKb03erx{HLK`FL5zHG;CuQ~&dsx}*$;r!#v`r^TXJXQdq8-hIK)#!0 zy1jdTgdzWf`hNm!K`dFOc+d^#kgW}CbSUB^;9uhu_hTj5wAqXxE@qW6T*5APxac=K zp!dnc+(3S!sOVT`OhflDp_)y{Bw{Wye2C-|u_i{tb(&J6L~IW&u_gijCNK%Q-{G%A zEq^((WpQf85J^`+$wTX=&TB|x7LKal*5#nU`|TC=feURXjk0R6G3%2&#e~D;3xxC0 zD~IJmBg+nAJCgPU2;N27&n3k3l>$kDC<{d0#RGk7wH!c)I+)II#cN_^|HLv^U2_Z% zu1KCLqgP<}Gm-=h_WrI2a4sYeg#z@keB zJnqlQRE?tNaiFZDrzNRhyAW^wFzBFLY)o_-wzWEA78kSPe#a-zw3G-B4y-f}8q z?Fyk-|J@(UD0r+gkk%9G95HZjM}8&-1Lwf{z+*I)ENRNJ^WL!7Wds|j@G(|) zWmHaMXO*88$zuIUP%R5f-I<;FVD?Fow+IeZJQxqm&=F1URrLTYXIk!=vq+*(4OD;- zz_jM-LgTX|YR`_bPd%L0T9~#K(sDQ?clE2lOAf{__DW+DL!I#?viBk z4`N*Tw?AQQmh9f#LZ-NCL@c&87Kv?Jz4Wq~K9=X@4#aHMrH61hx+f`^9`+P7bb>kw)m1pA|5 zX(L|5$2s)^Lk@lb%9d5BM>^6?kS^_P%x3IDi{O$H>U!sc$Te-Gf*#9x9spf&As#+!bSg58&jQ~ z$3MA!6`X@JgXVYbPXrwMtI@X3NvO&|CaSI7rYU-)vk7yj9h^OpX#g44nAF&#u2{CQ zEam|VO4-u`)v0>qoWDyvi6cy_l6XVKT%0cP?+C4ntH-rIB!V?ulRSECczlZJh2jZy z?M_Go?c;*?JY{0(fP1T}nxg+5J5Mn1kyMm-@;zXF?7Im{lvkp=M$>9)vtcP2YFGtcg zUubu_`mmHmI~I3N%a!mCSk)p7%AC8)C|e1AR{(~SBltya<_&nxj9H}hVMtq6@up|{ zb{RlDl;GYs($Fcr(U<5-tcU>-%bzUO9-0)PH&z@J$){=Az!Awrv?z^L}7hU_)A zxMh=oYvUS431R%I!5M2rm>~oPX)}wT-tZe-bSN-qqM0h=ZJz4lQG>4wFNrh4o#QrH z&6|)4ll(uI;CPeS7SFjJi=J6`<)cqy7jd0mM3X5n16@K7O%B#mTPhZ_5|;f=l+X6= zxgKSOZ>?}&rdjK@4iCts?!T#f`rYeULkG(5UT^805YLS(FJ{-AsFSKVnN;9f+BFQV z-yeL8lv#_-x1LZP+&)S$uk6I7dVK0nReM#RaK$t&ne+|)9^bk1Pin9$ciNOC#Vuv{ zCS9Oz*PmYYx&~X%PmI4wl(;KfTy2a@VW{(wt`J{R+GV6z?|uRo%HWWaFgn*;dx{W^sKI#8^G`jWde(wByMl2Fvn1V80!$>Mn{% z!;ntrj~gNePxBpkWN32)6R107rUlvuEKu((5xlZ&{;KEY;#T3-koNxObIq2_3XB=LI|_m-k%L%i z3ipggC1IJ_D9iI4u*ZchD(^{>EI6o|*9`U?51e_0x-E@IGF~-JjKOZo%Tq~<0MR)W zZf*k|ZhCLR&@r{2kIIB)flN$R`F+aa1U~Sqln*!7T&&OE#HNzi{2l_wH(8r)lGfd` zOKHLoO(nK0V|+Fa#yp^knDWco7N9B(hjyP0otle6@uXpAEjiM(CnzM>{bJcmOPCMr zfCdx9p(AlhAhz=56A&_)K!x@wQt!uY^D@{ajCt@^YI;nTKr^SEfX%XOXs8hn`LsS^ z2e~7a!W4Ly%k#tLK|3rO?6Nl2!k-*}ccy#(2C)AtKP%fq4tRCyAQ>F|`|Z*Qz>+l) zwBt$*fYS%8L;OriOefS1z*NHFe|htLwOx6NE)|28NOoT2uhTG~7dFJv@KrgGBD&!c z|2Yluv6Egn*nSk9WMr5I~F<||1Fw=1lbwMQi(L~L&;Ly3!-Uh!$yfq>Gm>YlZ_09 z;Rg@l!olz3rrjyId;4+)r*TGSb?QQ09gjysKFu7E$QIGd|7Xd6L-}NCp7LV%$~@6E zN_TbG_{LP&6|L~wE0}fAI$ogWJzhR~-bhU#!8V#l&zMa z4hX>(h@oRfM_Ett=}2V`;!%eEjt)4plEz4h!~1QtQWqn5{ck?g+gn)BdH*9f6vc@l z)L(btgNAkB1RKwN#w7Rh0E?VOjBe{KUhPDEzRf4PnO=o+1NhbDoe7Chr-}pP87y{o^>LLvW;>OEUbJu*;Jv{?NugrOgP|o>n_U8Ik;14|tYAEsA1W)AG-oH8 zq@4P73uozo@W95MepZr_bA$ZUvUMnX47_577MXuZ#gvVPY)5x&cBk(ocyR6vn5zuX*ZsNh6t`}XP)+L~dd{W(*L zs+B7W$|(fMn*8DRW)A9^{U$P#vh*R6{(WsKpGA{QWpd`Bx$oBb%kgbK>Ccsu30z}F z2VJrN+g_)qH!`_G$2+_Vn91wDU!+C?l0Tj^i<>|&U$_J3P@AW1;T>O_M?!SN zST{M#h@qglX@B%)<7Y`BFrhQZzo@g8CqgMu?iRg5vJJJO^2f7g)RNNnD7vSWHVzz= zf+HW?V}+%2j9`W=hpWythWE{7-TOli8z0n()R}S8nR%I=`@1cU0kkDUk&W{rbT?as zQ{d(F*aS>b0PzLd<%#>_u!L3Ys`;^PtA=h@wDiDQ{kN`HtF$&+rN5_XFVfGF5kd;b zx?sd2!No5=oWq44>wHFratJ!kE+LETx3X9gGgvgCYnnKSIhET?nF|jRmj+$RRUwj- zM0qo5MTk6TEA|U5#^eE|9irr)}lgudGm!VTuT#RGt-Lw0qax{hNQr%fQEQ`xZ zMl*gc*RXBMSftZ*yby;)<|mDEacUc;X$i2z5geC^BeXi*bwZdpUC&+4fq2$nr6yge zlkg4w%i2&wd>EXLn+jHJvfU9@EQR>NCQn4~q!yj$X%?+nm zE1UiNu5y*;Gc9xe8J97!Aj&utoNW4Vt8~qDjsl@=A4jWjzDw$nD3Chc~`xy`dG-dIOwA?p18$7egf>J1JARNV`q

Swwp5)Xt;UsNSl?P-io`s@%*(qVG+o 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 pw(65Y0P+l*V6nwwup{xAWI8Q#? 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 literal 0 HcmV?d00001 diff --git a/examples/Data/Balbianello/BalbianelloMedium-3.key.gz b/examples/Data/Balbianello/BalbianelloMedium-3.key.gz new file mode 100644 index 0000000000000000000000000000000000000000..89a831c3b6898d782bb610b367cb636e7f6d8294 GIT binary patch literal 296236 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%0AIvBh+A85*)`r6`C@cMD{_W~zJXb?bEh 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 literal 0 HcmV?d00001 diff --git a/examples/Data/Balbianello/BalbianelloMedium-4.key.gz b/examples/Data/Balbianello/BalbianelloMedium-4.key.gz new file mode 100644 index 0000000000000000000000000000000000000000..efc9cf008f35956a5582e664a46992ee11df3f59 GIT binary patch literal 283418 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

\n"; + cout << "\n Output written in " << statFile << " ...\n"; + statbuf.close(); + } + + return 0; +} + + diff --git a/gtsam/3rdparty/Eigen/bench/spbench/spbenchsolver.h b/gtsam/3rdparty/Eigen/bench/spbench/spbenchsolver.h new file mode 100644 index 000000000..6d765a997 --- /dev/null +++ b/gtsam/3rdparty/Eigen/bench/spbench/spbenchsolver.h @@ -0,0 +1,548 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2012 Désiré Nuentsa-Wakam +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + + +#include +#include +#include "Eigen/SparseCore" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef EIGEN_CHOLMOD_SUPPORT +#include +#endif + +#ifdef EIGEN_UMFPACK_SUPPORT +#include +#endif + +#ifdef EIGEN_PARDISO_SUPPORT +#include +#endif + +#ifdef EIGEN_SUPERLU_SUPPORT +#include +#endif + +#ifdef EIGEN_PASTIX_SUPPORT +#include +#endif + +// CONSTANTS +#define EIGEN_UMFPACK 0 +#define EIGEN_SUPERLU 1 +#define EIGEN_PASTIX 2 +#define EIGEN_PARDISO 3 +#define EIGEN_BICGSTAB 4 +#define EIGEN_BICGSTAB_ILUT 5 +#define EIGEN_GMRES 6 +#define EIGEN_GMRES_ILUT 7 +#define EIGEN_SIMPLICIAL_LDLT 8 +#define EIGEN_CHOLMOD_LDLT 9 +#define EIGEN_PASTIX_LDLT 10 +#define EIGEN_PARDISO_LDLT 11 +#define EIGEN_SIMPLICIAL_LLT 12 +#define EIGEN_CHOLMOD_SUPERNODAL_LLT 13 +#define EIGEN_CHOLMOD_SIMPLICIAL_LLT 14 +#define EIGEN_PASTIX_LLT 15 +#define EIGEN_PARDISO_LLT 16 +#define EIGEN_CG 17 +#define EIGEN_CG_PRECOND 18 +#define EIGEN_ALL_SOLVERS 19 + +using namespace Eigen; +using namespace std; + +struct Stats{ + ComputationInfo info; + double total_time; + double compute_time; + double solve_time; + double rel_error; + int memory_used; + int iterations; + int isavail; + int isIterative; +}; + +// Global variables for input parameters +int MaximumIters; // Maximum number of iterations +double RelErr; // Relative error of the computed solution + +template inline typename NumTraits::Real test_precision() { return NumTraits::dummy_precision(); } +template<> inline float test_precision() { return 1e-3f; } +template<> inline double test_precision() { return 1e-6; } +template<> inline float test_precision >() { return test_precision(); } +template<> inline double test_precision >() { return test_precision(); } + +void printStatheader(std::ofstream& out) +{ + int LUcnt = 0; + string LUlist =" ", LLTlist = " LLT", LDLTlist = " LDLT "; + +#ifdef EIGEN_UMFPACK_SUPPORT + LUlist += " UMFPACK "; LUcnt++; +#endif +#ifdef EIGEN_SUPERLU_SUPPORT + LUlist += " SUPERLU "; LUcnt++; +#endif +#ifdef EIGEN_CHOLMOD_SUPPORT + LLTlist += " CHOLMOD SP LLT CHOLMOD LLT"; + LDLTlist += "CHOLMOD LDLT"; +#endif +#ifdef EIGEN_PARDISO_SUPPORT + LUlist += " PARDISO LU"; LUcnt++; + LLTlist += " PARDISO LLT"; + LDLTlist += " PARDISO LDLT"; +#endif +#ifdef EIGEN_PASTIX_SUPPORT + LUlist += " PASTIX LU"; LUcnt++; + LLTlist += " PASTIX LLT"; + LDLTlist += " PASTIX LDLT"; +#endif + + out << "\n "; + out << "
Matrix N NNZ "; + if (LUcnt) out << LUlist; + out << " BiCGSTAB BiCGSTAB+ILUT"<< "GMRES+ILUT" < CG "<< std::endl; +} + + +template +Stats call_solver(Solver &solver, const typename Solver::MatrixType& A, const Matrix& b, const Matrix& refX) +{ + Stats stat; + Matrix x; + BenchTimer timer; + timer.reset(); + timer.start(); + solver.compute(A); + if (solver.info() != Success) + { + stat.info = NumericalIssue; + std::cerr << "Solver failed ... \n"; + return stat; + } + timer.stop(); + stat.compute_time = timer.value(); + + timer.reset(); + timer.start(); + x = solver.solve(b); + if (solver.info() == NumericalIssue) + { + stat.info = NumericalIssue; + std::cerr << "Solver failed ... \n"; + return stat; + } + + timer.stop(); + stat.solve_time = timer.value(); + stat.total_time = stat.solve_time + stat.compute_time; + stat.memory_used = 0; + // Verify the relative error + if(refX.size() != 0) + stat.rel_error = (refX - x).norm()/refX.norm(); + else + { + // Compute the relative residual norm + Matrix temp; + temp = A * x; + stat.rel_error = (b-temp).norm()/b.norm(); + } + if ( stat.rel_error > RelErr ) + { + stat.info = NoConvergence; + return stat; + } + else + { + stat.info = Success; + return stat; + } +} + +template +Stats call_directsolver(Solver& solver, const typename Solver::MatrixType& A, const Matrix& b, const Matrix& refX) +{ + Stats stat; + stat = call_solver(solver, A, b, refX); + return stat; +} + +template +Stats call_itersolver(Solver &solver, const typename Solver::MatrixType& A, const Matrix& b, const Matrix& refX) +{ + Stats stat; + solver.setTolerance(RelErr); + solver.setMaxIterations(MaximumIters); + + stat = call_solver(solver, A, b, refX); + stat.iterations = solver.iterations(); + return stat; +} + +inline void printStatItem(Stats *stat, int solver_id, int& best_time_id, double& best_time_val) +{ + stat[solver_id].isavail = 1; + + if (stat[solver_id].info == NumericalIssue) + { + cout << " SOLVER FAILED ... Probably a numerical issue \n"; + return; + } + if (stat[solver_id].info == NoConvergence){ + cout << "REL. ERROR " << stat[solver_id].rel_error; + if(stat[solver_id].isIterative == 1) + cout << " (" << stat[solver_id].iterations << ") \n"; + return; + } + + // Record the best CPU time + if (!best_time_val) + { + best_time_val = stat[solver_id].total_time; + best_time_id = solver_id; + } + else if (stat[solver_id].total_time < best_time_val) + { + best_time_val = stat[solver_id].total_time; + best_time_id = solver_id; + } + // Print statistics to standard output + if (stat[solver_id].info == Success){ + cout<< "COMPUTE TIME : " << stat[solver_id].compute_time<< " \n"; + cout<< "SOLVE TIME : " << stat[solver_id].solve_time<< " \n"; + cout<< "TOTAL TIME : " << stat[solver_id].total_time<< " \n"; + cout << "REL. ERROR : " << stat[solver_id].rel_error ; + if(stat[solver_id].isIterative == 1) { + cout << " (" << stat[solver_id].iterations << ") "; + } + cout << std::endl; + } + +} + + +/* Print the results from all solvers corresponding to a particular matrix + * The best CPU time is printed in bold + */ +inline void printHtmlStatLine(Stats *stat, int best_time_id, string& statline) +{ + + string markup; + ostringstream compute,solve,total,error; + for (int i = 0; i < EIGEN_ALL_SOLVERS; i++) + { + if (stat[i].isavail == 0) continue; + if(i == best_time_id) + markup = ""; + else + markup = ""; + + if (stat[i].info == Success){ + compute << markup << stat[i].compute_time; + solve << markup << stat[i].solve_time; + total << markup << stat[i].total_time; + error << " " << stat[i].rel_error; + if(stat[i].isIterative == 1) { + error << " (" << stat[i].iterations << ") "; + } + } + else { + compute << " -" ; + solve << " -" ; + total << " -" ; + if(stat[i].info == NoConvergence){ + error << " "<< stat[i].rel_error ; + if(stat[i].isIterative == 1) + error << " (" << stat[i].iterations << ") "; + } + else error << " - "; + } + } + + statline = "Compute Time " + compute.str() + "\n" + + "
Solve Time " + solve.str() + "\n" + + "
Total Time " + total.str() + "\n" + +"
Error(Iter)" + error.str() + "\n"; + +} + +template +int SelectSolvers(const SparseMatrix&A, unsigned int sym, Matrix& b, const Matrix& refX, Stats *stat) +{ + typedef SparseMatrix SpMat; + // First, deal with Nonsymmetric and symmetric matrices + int best_time_id = 0; + double best_time_val = 0.0; + //UMFPACK + #ifdef EIGEN_UMFPACK_SUPPORT + { + cout << "Solving with UMFPACK LU ... \n"; + UmfPackLU solver; + stat[EIGEN_UMFPACK] = call_directsolver(solver, A, b, refX); + printStatItem(stat, EIGEN_UMFPACK, best_time_id, best_time_val); + } + #endif + //SuperLU + #ifdef EIGEN_SUPERLU_SUPPORT + { + cout << "\nSolving with SUPERLU ... \n"; + SuperLU solver; + stat[EIGEN_SUPERLU] = call_directsolver(solver, A, b, refX); + printStatItem(stat, EIGEN_SUPERLU, best_time_id, best_time_val); + } + #endif + + // PaStix LU + #ifdef EIGEN_PASTIX_SUPPORT + { + cout << "\nSolving with PASTIX LU ... \n"; + PastixLU solver; + stat[EIGEN_PASTIX] = call_directsolver(solver, A, b, refX) ; + printStatItem(stat, EIGEN_PASTIX, best_time_id, best_time_val); + } + #endif + + //PARDISO LU + #ifdef EIGEN_PARDISO_SUPPORT + { + cout << "\nSolving with PARDISO LU ... \n"; + PardisoLU solver; + stat[EIGEN_PARDISO] = call_directsolver(solver, A, b, refX); + printStatItem(stat, EIGEN_PARDISO, best_time_id, best_time_val); + } + #endif + + + + //BiCGSTAB + { + cout << "\nSolving with BiCGSTAB ... \n"; + BiCGSTAB solver; + stat[EIGEN_BICGSTAB] = call_itersolver(solver, A, b, refX); + stat[EIGEN_BICGSTAB].isIterative = 1; + printStatItem(stat, EIGEN_BICGSTAB, best_time_id, best_time_val); + } + //BiCGSTAB+ILUT + { + cout << "\nSolving with BiCGSTAB and ILUT ... \n"; + BiCGSTAB > solver; + stat[EIGEN_BICGSTAB_ILUT] = call_itersolver(solver, A, b, refX); + stat[EIGEN_BICGSTAB_ILUT].isIterative = 1; + printStatItem(stat, EIGEN_BICGSTAB_ILUT, best_time_id, best_time_val); + } + + + //GMRES +// { +// cout << "\nSolving with GMRES ... \n"; +// GMRES solver; +// stat[EIGEN_GMRES] = call_itersolver(solver, A, b, refX); +// stat[EIGEN_GMRES].isIterative = 1; +// printStatItem(stat, EIGEN_GMRES, best_time_id, best_time_val); +// } + //GMRES+ILUT + { + cout << "\nSolving with GMRES and ILUT ... \n"; + GMRES > solver; + stat[EIGEN_GMRES_ILUT] = call_itersolver(solver, A, b, refX); + stat[EIGEN_GMRES_ILUT].isIterative = 1; + printStatItem(stat, EIGEN_GMRES_ILUT, best_time_id, best_time_val); + } + + // Hermitian and not necessarily positive-definites + if (sym != NonSymmetric) + { + // Internal Cholesky + { + cout << "\nSolving with Simplicial LDLT ... \n"; + SimplicialLDLT solver; + stat[EIGEN_SIMPLICIAL_LDLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat, EIGEN_SIMPLICIAL_LDLT, best_time_id, best_time_val); + } + + // CHOLMOD + #ifdef EIGEN_CHOLMOD_SUPPORT + { + cout << "\nSolving with CHOLMOD LDLT ... \n"; + CholmodDecomposition solver; + solver.setMode(CholmodLDLt); + stat[EIGEN_CHOLMOD_LDLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_CHOLMOD_LDLT, best_time_id, best_time_val); + } + #endif + + //PASTIX LLT + #ifdef EIGEN_PASTIX_SUPPORT + { + cout << "\nSolving with PASTIX LDLT ... \n"; + PastixLDLT solver; + stat[EIGEN_PASTIX_LDLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_PASTIX_LDLT, best_time_id, best_time_val); + } + #endif + + //PARDISO LLT + #ifdef EIGEN_PARDISO_SUPPORT + { + cout << "\nSolving with PARDISO LDLT ... \n"; + PardisoLDLT solver; + stat[EIGEN_PARDISO_LDLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_PARDISO_LDLT, best_time_id, best_time_val); + } + #endif + } + + // Now, symmetric POSITIVE DEFINITE matrices + if (sym == SPD) + { + + //Internal Sparse Cholesky + { + cout << "\nSolving with SIMPLICIAL LLT ... \n"; + SimplicialLLT solver; + stat[EIGEN_SIMPLICIAL_LLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_SIMPLICIAL_LLT, best_time_id, best_time_val); + } + + // CHOLMOD + #ifdef EIGEN_CHOLMOD_SUPPORT + { + // CholMOD SuperNodal LLT + cout << "\nSolving with CHOLMOD LLT (Supernodal)... \n"; + CholmodDecomposition solver; + solver.setMode(CholmodSupernodalLLt); + stat[EIGEN_CHOLMOD_SUPERNODAL_LLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_CHOLMOD_SUPERNODAL_LLT, best_time_id, best_time_val); + // CholMod Simplicial LLT + cout << "\nSolving with CHOLMOD LLT (Simplicial) ... \n"; + solver.setMode(CholmodSimplicialLLt); + stat[EIGEN_CHOLMOD_SIMPLICIAL_LLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_CHOLMOD_SIMPLICIAL_LLT, best_time_id, best_time_val); + } + #endif + + //PASTIX LLT + #ifdef EIGEN_PASTIX_SUPPORT + { + cout << "\nSolving with PASTIX LLT ... \n"; + PastixLLT solver; + stat[EIGEN_PASTIX_LLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_PASTIX_LLT, best_time_id, best_time_val); + } + #endif + + //PARDISO LLT + #ifdef EIGEN_PARDISO_SUPPORT + { + cout << "\nSolving with PARDISO LLT ... \n"; + PardisoLLT solver; + stat[EIGEN_PARDISO_LLT] = call_directsolver(solver, A, b, refX); + printStatItem(stat,EIGEN_PARDISO_LLT, best_time_id, best_time_val); + } + #endif + + // Internal CG + { + cout << "\nSolving with CG ... \n"; + ConjugateGradient solver; + stat[EIGEN_CG] = call_itersolver(solver, A, b, refX); + stat[EIGEN_CG].isIterative = 1; + printStatItem(stat,EIGEN_CG, best_time_id, best_time_val); + } + //CG+IdentityPreconditioner +// { +// cout << "\nSolving with CG and IdentityPreconditioner ... \n"; +// ConjugateGradient solver; +// stat[EIGEN_CG_PRECOND] = call_itersolver(solver, A, b, refX); +// stat[EIGEN_CG_PRECOND].isIterative = 1; +// printStatItem(stat,EIGEN_CG_PRECOND, best_time_id, best_time_val); +// } + } // End SPD matrices + + return best_time_id; +} + +/* Browse all the matrices available in the specified folder + * and solve the associated linear system. + * The results of each solve are printed in the standard output + * and optionally in the provided html file + */ +template +void Browse_Matrices(const string folder, bool statFileExists, std::string& statFile, int maxiters, double tol) +{ + MaximumIters = maxiters; // Maximum number of iterations, global variable + RelErr = tol; //Relative residual error as stopping criterion for iterative solvers + MatrixMarketIterator it(folder); + Stats stat[EIGEN_ALL_SOLVERS]; + for ( ; it; ++it) + { + for (int i = 0; i < EIGEN_ALL_SOLVERS; i++) + { + stat[i].isavail = 0; + stat[i].isIterative = 0; + } + + int best_time_id; + cout<< "\n\n===================================================== \n"; + cout<< " ====== SOLVING WITH MATRIX " << it.matname() << " ====\n"; + cout<< " =================================================== \n\n"; + Matrix refX; + if(it.hasrefX()) refX = it.refX(); + best_time_id = SelectSolvers(it.matrix(), it.sym(), it.rhs(), refX, &stat[0]); + + if(statFileExists) + { + string statline; + printHtmlStatLine(&stat[0], best_time_id, statline); + std::ofstream statbuf(statFile.c_str(), std::ios::app); + statbuf << "
" << it.matname() << " " + << it.matrix().rows() << " " << it.matrix().nonZeros()<< " "<< statline ; + statbuf.close(); + } + } +} + +bool get_options(int argc, char **args, string option, string* value=0) +{ + int idx = 1, found=false; + while (idx +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_BAND_TRIANGULARSOLVER_H +#define EIGEN_BAND_TRIANGULARSOLVER_H + +namespace internal { + + /* \internal + * Solve Ax=b with A a band triangular matrix + * TODO: extend it to matrices for x abd b */ +template +struct band_solve_triangular_selector; + + +template +struct band_solve_triangular_selector +{ + typedef Map, 0, OuterStride<> > LhsMap; + typedef Map > RhsMap; + enum { IsLower = (Mode&Lower) ? 1 : 0 }; + static void run(Index size, Index k, const LhsScalar* _lhs, Index lhsStride, RhsScalar* _other) + { + const LhsMap lhs(_lhs,size,k+1,OuterStride<>(lhsStride)); + RhsMap other(_other,size,1); + typename internal::conditional< + ConjLhs, + const CwiseUnaryOp,LhsMap>, + const LhsMap&> + ::type cjLhs(lhs); + + for(int col=0 ; col0) + other.coeffRef(i,col) -= cjLhs.row(i).segment(actual_start,actual_k).transpose() + .cwiseProduct(other.col(col).segment(IsLower ? i-actual_k : i+1,actual_k)).sum(); + + if((Mode&UnitDiag)==0) + other.coeffRef(i,col) /= cjLhs(i,IsLower ? k : 0); + } + } + } + +}; + +template +struct band_solve_triangular_selector +{ + typedef Map, 0, OuterStride<> > LhsMap; + typedef Map > RhsMap; + enum { IsLower = (Mode&Lower) ? 1 : 0 }; + static void run(Index size, Index k, const LhsScalar* _lhs, Index lhsStride, RhsScalar* _other) + { + const LhsMap lhs(_lhs,k+1,size,OuterStride<>(lhsStride)); + RhsMap other(_other,size,1); + typename internal::conditional< + ConjLhs, + const CwiseUnaryOp,LhsMap>, + const LhsMap&> + ::type cjLhs(lhs); + + for(int col=0 ; col0) + other.col(col).segment(IsLower ? i+1 : i-actual_k, actual_k) + -= other.coeff(i,col) * cjLhs.col(i).segment(actual_start,actual_k); + + } + } + } +}; + + +} // end namespace internal + +#endif // EIGEN_BAND_TRIANGULARSOLVER_H diff --git a/gtsam/3rdparty/Eigen/blas/CMakeLists.txt b/gtsam/3rdparty/Eigen/blas/CMakeLists.txt index 5f2e3cd32..453d5874c 100644 --- a/gtsam/3rdparty/Eigen/blas/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/blas/CMakeLists.txt @@ -1,27 +1,34 @@ project(EigenBlas CXX) -if( NOT DEFINED EIGEN_Fortran_COMPILER_WORKS OR EIGEN_Fortran_COMPILER_WORKS) +include("../cmake/language_support.cmake") +workaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS) + +if(EIGEN_Fortran_COMPILER_WORKS) enable_language(Fortran OPTIONAL) - - if(CMAKE_Fortran_COMPILER_WORKS) - set(EIGEN_Fortran_COMPILER_WORKS TRUE CACHE INTERNAL "workaround cmake's enable_language issue") - else() - set(EIGEN_Fortran_COMPILER_WORKS FALSE CACHE INTERNAL "workaround cmake's enable_language issue") - endif() - endif() -if(CMAKE_Fortran_COMPILER_WORKS) - add_custom_target(blas) -set(EigenBlas_SRCS single.cpp double.cpp complex_single.cpp complex_double.cpp xerbla.cpp +set(EigenBlas_SRCS single.cpp double.cpp complex_single.cpp complex_double.cpp xerbla.cpp) + +if(EIGEN_Fortran_COMPILER_WORKS) + +set(EigenBlas_SRCS ${EigenBlas_SRCS} complexdots.f srotm.f srotmg.f drotm.f drotmg.f - lsame.f chpr2.f ctbsv.f dspmv.f dtbmv.f dtpsv.f ssbmv.f sspr.f stpmv.f zhpr2.f ztbsv.f chbmv.f chpr.f ctpmv.f dspr2.f dtbsv.f sspmv.f stbmv.f stpsv.f zhbmv.f zhpr.f ztpmv.f chpmv.f ctbmv.f ctpsv.f dsbmv.f dspr.f dtpmv.f sspr2.f stbsv.f zhpmv.f ztbmv.f ztpsv.f + lsame.f chpr2.f dspmv.f dtpsv.f ssbmv.f sspr.f stpmv.f + zhpr2.f chbmv.f chpr.f ctpmv.f dspr2.f sspmv.f stpsv.f + zhbmv.f zhpr.f ztpmv.f chpmv.f ctpsv.f dsbmv.f dspr.f dtpmv.f sspr2.f + zhpmv.f ztpsv.f + dtbmv.f stbmv.f ctbmv.f ztbmv.f ) +else() + +message(WARNING " No fortran compiler has been detected, the blas build will be incomplete.") + +endif() add_library(eigen_blas_static ${EigenBlas_SRCS}) add_library(eigen_blas SHARED ${EigenBlas_SRCS}) @@ -33,11 +40,12 @@ endif() add_dependencies(blas eigen_blas eigen_blas_static) -install(TARGETS eigen_blas +install(TARGETS eigen_blas eigen_blas_static RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) +if(EIGEN_Fortran_COMPILER_WORKS) if(EIGEN_LEAVE_TEST_IN_ALL_TARGET) add_subdirectory(testing) # can't do EXCLUDE_FROM_ALL here, breaks CTest @@ -45,4 +53,5 @@ else() add_subdirectory(testing EXCLUDE_FROM_ALL) endif() -endif(CMAKE_Fortran_COMPILER_WORKS) +endif() + diff --git a/gtsam/3rdparty/Eigen/blas/common.h b/gtsam/3rdparty/Eigen/blas/common.h index ed93642f9..ada833a90 100644 --- a/gtsam/3rdparty/Eigen/blas/common.h +++ b/gtsam/3rdparty/Eigen/blas/common.h @@ -32,16 +32,8 @@ #error the token SCALAR must be defined to compile this file #endif -#ifdef __cplusplus -extern "C" -{ -#endif +#include -#include "../bench/btl/libs/C_BLAS/blas.h" - -#ifdef __cplusplus -} -#endif #define NOTR 0 #define TR 1 @@ -93,6 +85,12 @@ inline bool check_uplo(const char* uplo) #include #include + + +namespace Eigen { +#include "BandTriangularSolver.h" +} + using namespace Eigen; typedef SCALAR Scalar; diff --git a/gtsam/3rdparty/Eigen/blas/ctbsv.f b/gtsam/3rdparty/Eigen/blas/ctbsv.f deleted file mode 100644 index 853b9d75e..000000000 --- a/gtsam/3rdparty/Eigen/blas/ctbsv.f +++ /dev/null @@ -1,370 +0,0 @@ - SUBROUTINE CTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) -* .. Scalar Arguments .. - INTEGER INCX,K,LDA,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - COMPLEX A(LDA,*),X(*) -* .. -* -* Purpose -* ======= -* -* CTBSV solves one of the systems of equations -* -* A*x = b, or A'*x = b, or conjg( A' )*x = b, -* -* where b and x are n element vectors and A is an n by n unit, or -* non-unit, upper or lower triangular band matrix, with ( k + 1 ) -* diagonals. -* -* No test for singularity or near-singularity is included in this -* routine. Such tests must be performed before calling this routine. -* -* Arguments -* ========== -* -* UPLO - CHARACTER*1. -* On entry, UPLO specifies whether the matrix is an upper or -* lower triangular matrix as follows: -* -* UPLO = 'U' or 'u' A is an upper triangular matrix. -* -* UPLO = 'L' or 'l' A is a lower triangular matrix. -* -* Unchanged on exit. -* -* TRANS - CHARACTER*1. -* On entry, TRANS specifies the equations to be solved as -* follows: -* -* TRANS = 'N' or 'n' A*x = b. -* -* TRANS = 'T' or 't' A'*x = b. -* -* TRANS = 'C' or 'c' conjg( A' )*x = b. -* -* Unchanged on exit. -* -* DIAG - CHARACTER*1. -* On entry, DIAG specifies whether or not A is unit -* triangular as follows: -* -* DIAG = 'U' or 'u' A is assumed to be unit triangular. -* -* DIAG = 'N' or 'n' A is not assumed to be unit -* triangular. -* -* Unchanged on exit. -* -* N - INTEGER. -* On entry, N specifies the order of the matrix A. -* N must be at least zero. -* Unchanged on exit. -* -* K - INTEGER. -* On entry with UPLO = 'U' or 'u', K specifies the number of -* super-diagonals of the matrix A. -* On entry with UPLO = 'L' or 'l', K specifies the number of -* sub-diagonals of the matrix A. -* K must satisfy 0 .le. K. -* Unchanged on exit. -* -* A - COMPLEX array of DIMENSION ( LDA, n ). -* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) -* by n part of the array A must contain the upper triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row -* ( k + 1 ) of the array, the first super-diagonal starting at -* position 2 in row k, and so on. The top left k by k triangle -* of the array A is not referenced. -* The following program segment will transfer an upper -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = K + 1 - J -* DO 10, I = MAX( 1, J - K ), J -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) -* by n part of the array A must contain the lower triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row 1 of -* the array, the first sub-diagonal starting at position 1 in -* row 2, and so on. The bottom right k by k triangle of the -* array A is not referenced. -* The following program segment will transfer a lower -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = 1 - J -* DO 10, I = J, MIN( N, J + K ) -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Note that when DIAG = 'U' or 'u' the elements of the array A -* corresponding to the diagonal elements of the matrix are not -* referenced, but are assumed to be unity. -* Unchanged on exit. -* -* LDA - INTEGER. -* On entry, LDA specifies the first dimension of A as declared -* in the calling (sub) program. LDA must be at least -* ( k + 1 ). -* Unchanged on exit. -* -* X - COMPLEX array of dimension at least -* ( 1 + ( n - 1 )*abs( INCX ) ). -* Before entry, the incremented array X must contain the n -* element right-hand side vector b. On exit, X is overwritten -* with the solution vector x. -* -* INCX - INTEGER. -* On entry, INCX specifies the increment for the elements of -* X. INCX must not be zero. -* Unchanged on exit. -* -* Further Details -* =============== -* -* Level 2 Blas routine. -* -* -- Written on 22-October-1986. -* Jack Dongarra, Argonne National Lab. -* Jeremy Du Croz, Nag Central Office. -* Sven Hammarling, Nag Central Office. -* Richard Hanson, Sandia National Labs. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ZERO - PARAMETER (ZERO= (0.0E+0,0.0E+0)) -* .. -* .. Local Scalars .. - COMPLEX TEMP - INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L - LOGICAL NOCONJ,NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC CONJG,MAX,MIN -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (K.LT.0) THEN - INFO = 5 - ELSE IF (LDA.LT. (K+1)) THEN - INFO = 7 - ELSE IF (INCX.EQ.0) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('CTBSV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOCONJ = LSAME(TRANS,'T') - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of A are -* accessed by sequentially with one pass through A. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := inv( A )*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 20 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - L = KPLUS1 - J - IF (NOUNIT) X(J) = X(J)/A(KPLUS1,J) - TEMP = X(J) - DO 10 I = J - 1,MAX(1,J-K),-1 - X(I) = X(I) - TEMP*A(L+I,J) - 10 CONTINUE - END IF - 20 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 40 J = N,1,-1 - KX = KX - INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = KPLUS1 - J - IF (NOUNIT) X(JX) = X(JX)/A(KPLUS1,J) - TEMP = X(JX) - DO 30 I = J - 1,MAX(1,J-K),-1 - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX - INCX - 30 CONTINUE - END IF - JX = JX - INCX - 40 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 60 J = 1,N - IF (X(J).NE.ZERO) THEN - L = 1 - J - IF (NOUNIT) X(J) = X(J)/A(1,J) - TEMP = X(J) - DO 50 I = J + 1,MIN(N,J+K) - X(I) = X(I) - TEMP*A(L+I,J) - 50 CONTINUE - END IF - 60 CONTINUE - ELSE - JX = KX - DO 80 J = 1,N - KX = KX + INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = 1 - J - IF (NOUNIT) X(JX) = X(JX)/A(1,J) - TEMP = X(JX) - DO 70 I = J + 1,MIN(N,J+K) - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX + INCX - 70 CONTINUE - END IF - JX = JX + INCX - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := inv( A' )*x or x := inv( conjg( A') )*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 110 J = 1,N - TEMP = X(J) - L = KPLUS1 - J - IF (NOCONJ) THEN - DO 90 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(I) - 90 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - ELSE - DO 100 I = MAX(1,J-K),J - 1 - TEMP = TEMP - CONJG(A(L+I,J))*X(I) - 100 CONTINUE - IF (NOUNIT) TEMP = TEMP/CONJG(A(KPLUS1,J)) - END IF - X(J) = TEMP - 110 CONTINUE - ELSE - JX = KX - DO 140 J = 1,N - TEMP = X(JX) - IX = KX - L = KPLUS1 - J - IF (NOCONJ) THEN - DO 120 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX + INCX - 120 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - ELSE - DO 130 I = MAX(1,J-K),J - 1 - TEMP = TEMP - CONJG(A(L+I,J))*X(IX) - IX = IX + INCX - 130 CONTINUE - IF (NOUNIT) TEMP = TEMP/CONJG(A(KPLUS1,J)) - END IF - X(JX) = TEMP - JX = JX + INCX - IF (J.GT.K) KX = KX + INCX - 140 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 170 J = N,1,-1 - TEMP = X(J) - L = 1 - J - IF (NOCONJ) THEN - DO 150 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(I) - 150 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - ELSE - DO 160 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - CONJG(A(L+I,J))*X(I) - 160 CONTINUE - IF (NOUNIT) TEMP = TEMP/CONJG(A(1,J)) - END IF - X(J) = TEMP - 170 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 200 J = N,1,-1 - TEMP = X(JX) - IX = KX - L = 1 - J - IF (NOCONJ) THEN - DO 180 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX - INCX - 180 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - ELSE - DO 190 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - CONJG(A(L+I,J))*X(IX) - IX = IX - INCX - 190 CONTINUE - IF (NOUNIT) TEMP = TEMP/CONJG(A(1,J)) - END IF - X(JX) = TEMP - JX = JX - INCX - IF ((N-J).GE.K) KX = KX - INCX - 200 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of CTBSV . -* - END diff --git a/gtsam/3rdparty/Eigen/blas/dtbsv.f b/gtsam/3rdparty/Eigen/blas/dtbsv.f deleted file mode 100644 index cfeb0b82b..000000000 --- a/gtsam/3rdparty/Eigen/blas/dtbsv.f +++ /dev/null @@ -1,339 +0,0 @@ - SUBROUTINE DTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) -* .. Scalar Arguments .. - INTEGER INCX,K,LDA,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),X(*) -* .. -* -* Purpose -* ======= -* -* DTBSV solves one of the systems of equations -* -* A*x = b, or A'*x = b, -* -* where b and x are n element vectors and A is an n by n unit, or -* non-unit, upper or lower triangular band matrix, with ( k + 1 ) -* diagonals. -* -* No test for singularity or near-singularity is included in this -* routine. Such tests must be performed before calling this routine. -* -* Arguments -* ========== -* -* UPLO - CHARACTER*1. -* On entry, UPLO specifies whether the matrix is an upper or -* lower triangular matrix as follows: -* -* UPLO = 'U' or 'u' A is an upper triangular matrix. -* -* UPLO = 'L' or 'l' A is a lower triangular matrix. -* -* Unchanged on exit. -* -* TRANS - CHARACTER*1. -* On entry, TRANS specifies the equations to be solved as -* follows: -* -* TRANS = 'N' or 'n' A*x = b. -* -* TRANS = 'T' or 't' A'*x = b. -* -* TRANS = 'C' or 'c' A'*x = b. -* -* Unchanged on exit. -* -* DIAG - CHARACTER*1. -* On entry, DIAG specifies whether or not A is unit -* triangular as follows: -* -* DIAG = 'U' or 'u' A is assumed to be unit triangular. -* -* DIAG = 'N' or 'n' A is not assumed to be unit -* triangular. -* -* Unchanged on exit. -* -* N - INTEGER. -* On entry, N specifies the order of the matrix A. -* N must be at least zero. -* Unchanged on exit. -* -* K - INTEGER. -* On entry with UPLO = 'U' or 'u', K specifies the number of -* super-diagonals of the matrix A. -* On entry with UPLO = 'L' or 'l', K specifies the number of -* sub-diagonals of the matrix A. -* K must satisfy 0 .le. K. -* Unchanged on exit. -* -* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). -* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) -* by n part of the array A must contain the upper triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row -* ( k + 1 ) of the array, the first super-diagonal starting at -* position 2 in row k, and so on. The top left k by k triangle -* of the array A is not referenced. -* The following program segment will transfer an upper -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = K + 1 - J -* DO 10, I = MAX( 1, J - K ), J -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) -* by n part of the array A must contain the lower triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row 1 of -* the array, the first sub-diagonal starting at position 1 in -* row 2, and so on. The bottom right k by k triangle of the -* array A is not referenced. -* The following program segment will transfer a lower -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = 1 - J -* DO 10, I = J, MIN( N, J + K ) -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Note that when DIAG = 'U' or 'u' the elements of the array A -* corresponding to the diagonal elements of the matrix are not -* referenced, but are assumed to be unity. -* Unchanged on exit. -* -* LDA - INTEGER. -* On entry, LDA specifies the first dimension of A as declared -* in the calling (sub) program. LDA must be at least -* ( k + 1 ). -* Unchanged on exit. -* -* X - DOUBLE PRECISION array of dimension at least -* ( 1 + ( n - 1 )*abs( INCX ) ). -* Before entry, the incremented array X must contain the n -* element right-hand side vector b. On exit, X is overwritten -* with the solution vector x. -* -* INCX - INTEGER. -* On entry, INCX specifies the increment for the elements of -* X. INCX must not be zero. -* Unchanged on exit. -* -* Further Details -* =============== -* -* Level 2 Blas routine. -* -* -- Written on 22-October-1986. -* Jack Dongarra, Argonne National Lab. -* Jeremy Du Croz, Nag Central Office. -* Sven Hammarling, Nag Central Office. -* Richard Hanson, Sandia National Labs. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER (ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L - LOGICAL NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX,MIN -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (K.LT.0) THEN - INFO = 5 - ELSE IF (LDA.LT. (K+1)) THEN - INFO = 7 - ELSE IF (INCX.EQ.0) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DTBSV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of A are -* accessed by sequentially with one pass through A. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := inv( A )*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 20 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - L = KPLUS1 - J - IF (NOUNIT) X(J) = X(J)/A(KPLUS1,J) - TEMP = X(J) - DO 10 I = J - 1,MAX(1,J-K),-1 - X(I) = X(I) - TEMP*A(L+I,J) - 10 CONTINUE - END IF - 20 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 40 J = N,1,-1 - KX = KX - INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = KPLUS1 - J - IF (NOUNIT) X(JX) = X(JX)/A(KPLUS1,J) - TEMP = X(JX) - DO 30 I = J - 1,MAX(1,J-K),-1 - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX - INCX - 30 CONTINUE - END IF - JX = JX - INCX - 40 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 60 J = 1,N - IF (X(J).NE.ZERO) THEN - L = 1 - J - IF (NOUNIT) X(J) = X(J)/A(1,J) - TEMP = X(J) - DO 50 I = J + 1,MIN(N,J+K) - X(I) = X(I) - TEMP*A(L+I,J) - 50 CONTINUE - END IF - 60 CONTINUE - ELSE - JX = KX - DO 80 J = 1,N - KX = KX + INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = 1 - J - IF (NOUNIT) X(JX) = X(JX)/A(1,J) - TEMP = X(JX) - DO 70 I = J + 1,MIN(N,J+K) - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX + INCX - 70 CONTINUE - END IF - JX = JX + INCX - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := inv( A')*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 100 J = 1,N - TEMP = X(J) - L = KPLUS1 - J - DO 90 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(I) - 90 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - X(J) = TEMP - 100 CONTINUE - ELSE - JX = KX - DO 120 J = 1,N - TEMP = X(JX) - IX = KX - L = KPLUS1 - J - DO 110 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX + INCX - 110 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - X(JX) = TEMP - JX = JX + INCX - IF (J.GT.K) KX = KX + INCX - 120 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 140 J = N,1,-1 - TEMP = X(J) - L = 1 - J - DO 130 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(I) - 130 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - X(J) = TEMP - 140 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 160 J = N,1,-1 - TEMP = X(JX) - IX = KX - L = 1 - J - DO 150 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX - INCX - 150 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - X(JX) = TEMP - JX = JX - INCX - IF ((N-J).GE.K) KX = KX - INCX - 160 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of DTBSV . -* - END diff --git a/gtsam/3rdparty/Eigen/blas/level2_impl.h b/gtsam/3rdparty/Eigen/blas/level2_impl.h index 8cbc2f424..46a3e7005 100644 --- a/gtsam/3rdparty/Eigen/blas/level2_impl.h +++ b/gtsam/3rdparty/Eigen/blas/level2_impl.h @@ -151,21 +151,21 @@ int EIGEN_BLAS_FUNC(trmv)(char *uplo, char *opa, char *diag, int *n, RealScalar for(int k=0; k<16; ++k) func[k] = 0; - func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[TR | (UP << 2) | (NUNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::product_triangular_matrix_vector::run); + func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[TR | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product::run); - func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[TR | (LO << 2) | (NUNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::product_triangular_matrix_vector::run); + func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[TR | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product::run); - func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[TR | (UP << 2) | (UNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::product_triangular_matrix_vector::run); + func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[TR | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product::run); - func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[TR | (LO << 2) | (UNIT << 3)] = (internal::product_triangular_matrix_vector::run); - func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::product_triangular_matrix_vector::run); + func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[TR | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product::run); + func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::triangular_matrix_vector_product::run); init = true; } @@ -271,6 +271,7 @@ int EIGEN_BLAS_FUNC(gbmv)(char *trans, int *m, int *n, int *kl, int *ku, RealSca return 0; } +#if 0 /** TBMV performs one of the matrix-vector operations * * x := A*x, or x := A'*x, @@ -278,10 +279,56 @@ int EIGEN_BLAS_FUNC(gbmv)(char *trans, int *m, int *n, int *kl, int *ku, RealSca * where x is an n element vector and A is an n by n unit, or non-unit, * upper or lower triangular band matrix, with ( k + 1 ) diagonals. */ -// int EIGEN_BLAS_FUNC(tbmv)(char *uplo, char *trans, char *diag, int *n, int *k, RealScalar *a, int *lda, RealScalar *x, int *incx) -// { -// return 1; -// } +int EIGEN_BLAS_FUNC(tbmv)(char *uplo, char *opa, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx) +{ + Scalar* a = reinterpret_cast(pa); + Scalar* x = reinterpret_cast(px); + int coeff_rows = *k + 1; + + int info = 0; + if(UPLO(*uplo)==INVALID) info = 1; + else if(OP(*opa)==INVALID) info = 2; + else if(DIAG(*diag)==INVALID) info = 3; + else if(*n<0) info = 4; + else if(*k<0) info = 5; + else if(*lda::run); + func[TR | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector::run); + func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector::run); + + func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector::run); + func[TR | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector::run); + func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector::run); + + func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector::run); + func[TR | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector::run); + func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector::run); + + func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector::run); + func[TR | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector::run); + func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::band_solve_triangular_selector::run); + + init = true; + } + + Scalar* a = reinterpret_cast(pa); + Scalar* x = reinterpret_cast(px); + int coeff_rows = *k+1; + + int info = 0; + if(UPLO(*uplo)==INVALID) info = 1; + else if(OP(*op)==INVALID) info = 2; + else if(DIAG(*diag)==INVALID) info = 3; + else if(*n<0) info = 4; + else if(*k<0) info = 5; + else if(*lda=16 || func[code]==0) + return 0; + + func[code](*n, *k, a, *lda, actual_x); + + if(actual_x!=x) delete[] copy_back(actual_x,x,actual_n,*incx); + + return 0; +} /** DTPMV performs one of the matrix-vector operations * diff --git a/gtsam/3rdparty/Eigen/blas/level3_impl.h b/gtsam/3rdparty/Eigen/blas/level3_impl.h index 0a3aa98b8..4f4f39080 100644 --- a/gtsam/3rdparty/Eigen/blas/level3_impl.h +++ b/gtsam/3rdparty/Eigen/blas/level3_impl.h @@ -81,7 +81,7 @@ int EIGEN_BLAS_FUNC(gemm)(char *opa, char *opb, int *m, int *n, int *k, RealScal int EIGEN_BLAS_FUNC(trsm)(char *side, char *uplo, char *opa, char *diag, int *m, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *ldb) { // std::cerr << "in trsm " << *side << " " << *uplo << " " << *opa << " " << *diag << " " << *m << "," << *n << " " << *palpha << " " << *lda << " " << *ldb<< "\n"; - typedef void (*functype)(DenseIndex, DenseIndex, const Scalar *, DenseIndex, Scalar *, DenseIndex); + typedef void (*functype)(DenseIndex, DenseIndex, const Scalar *, DenseIndex, Scalar *, DenseIndex, internal::level3_blocking&); static functype func[32]; static bool init = false; @@ -143,11 +143,17 @@ int EIGEN_BLAS_FUNC(trsm)(char *side, char *uplo, char *opa, char *diag, int *m, return xerbla_(SCALAR_SUFFIX_UP"TRSM ",&info,6); int code = OP(*opa) | (SIDE(*side) << 2) | (UPLO(*uplo) << 3) | (DIAG(*diag) << 4); - + if(SIDE(*side)==LEFT) - func[code](*m, *n, a, *lda, b, *ldb); + { + internal::gemm_blocking_space blocking(*m,*n,*m); + func[code](*m, *n, a, *lda, b, *ldb, blocking); + } else - func[code](*n, *m, a, *lda, b, *ldb); + { + internal::gemm_blocking_space blocking(*m,*n,*n); + func[code](*n, *m, a, *lda, b, *ldb, blocking); + } if(alpha!=Scalar(1)) matrix(b,*m,*n,*ldb) *= alpha; diff --git a/gtsam/3rdparty/Eigen/blas/stbsv.f b/gtsam/3rdparty/Eigen/blas/stbsv.f deleted file mode 100644 index b846be85c..000000000 --- a/gtsam/3rdparty/Eigen/blas/stbsv.f +++ /dev/null @@ -1,339 +0,0 @@ - SUBROUTINE STBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) -* .. Scalar Arguments .. - INTEGER INCX,K,LDA,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - REAL A(LDA,*),X(*) -* .. -* -* Purpose -* ======= -* -* STBSV solves one of the systems of equations -* -* A*x = b, or A'*x = b, -* -* where b and x are n element vectors and A is an n by n unit, or -* non-unit, upper or lower triangular band matrix, with ( k + 1 ) -* diagonals. -* -* No test for singularity or near-singularity is included in this -* routine. Such tests must be performed before calling this routine. -* -* Arguments -* ========== -* -* UPLO - CHARACTER*1. -* On entry, UPLO specifies whether the matrix is an upper or -* lower triangular matrix as follows: -* -* UPLO = 'U' or 'u' A is an upper triangular matrix. -* -* UPLO = 'L' or 'l' A is a lower triangular matrix. -* -* Unchanged on exit. -* -* TRANS - CHARACTER*1. -* On entry, TRANS specifies the equations to be solved as -* follows: -* -* TRANS = 'N' or 'n' A*x = b. -* -* TRANS = 'T' or 't' A'*x = b. -* -* TRANS = 'C' or 'c' A'*x = b. -* -* Unchanged on exit. -* -* DIAG - CHARACTER*1. -* On entry, DIAG specifies whether or not A is unit -* triangular as follows: -* -* DIAG = 'U' or 'u' A is assumed to be unit triangular. -* -* DIAG = 'N' or 'n' A is not assumed to be unit -* triangular. -* -* Unchanged on exit. -* -* N - INTEGER. -* On entry, N specifies the order of the matrix A. -* N must be at least zero. -* Unchanged on exit. -* -* K - INTEGER. -* On entry with UPLO = 'U' or 'u', K specifies the number of -* super-diagonals of the matrix A. -* On entry with UPLO = 'L' or 'l', K specifies the number of -* sub-diagonals of the matrix A. -* K must satisfy 0 .le. K. -* Unchanged on exit. -* -* A - REAL array of DIMENSION ( LDA, n ). -* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) -* by n part of the array A must contain the upper triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row -* ( k + 1 ) of the array, the first super-diagonal starting at -* position 2 in row k, and so on. The top left k by k triangle -* of the array A is not referenced. -* The following program segment will transfer an upper -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = K + 1 - J -* DO 10, I = MAX( 1, J - K ), J -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) -* by n part of the array A must contain the lower triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row 1 of -* the array, the first sub-diagonal starting at position 1 in -* row 2, and so on. The bottom right k by k triangle of the -* array A is not referenced. -* The following program segment will transfer a lower -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = 1 - J -* DO 10, I = J, MIN( N, J + K ) -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Note that when DIAG = 'U' or 'u' the elements of the array A -* corresponding to the diagonal elements of the matrix are not -* referenced, but are assumed to be unity. -* Unchanged on exit. -* -* LDA - INTEGER. -* On entry, LDA specifies the first dimension of A as declared -* in the calling (sub) program. LDA must be at least -* ( k + 1 ). -* Unchanged on exit. -* -* X - REAL array of dimension at least -* ( 1 + ( n - 1 )*abs( INCX ) ). -* Before entry, the incremented array X must contain the n -* element right-hand side vector b. On exit, X is overwritten -* with the solution vector x. -* -* INCX - INTEGER. -* On entry, INCX specifies the increment for the elements of -* X. INCX must not be zero. -* Unchanged on exit. -* -* Further Details -* =============== -* -* Level 2 Blas routine. -* -* -- Written on 22-October-1986. -* Jack Dongarra, Argonne National Lab. -* Jeremy Du Croz, Nag Central Office. -* Sven Hammarling, Nag Central Office. -* Richard Hanson, Sandia National Labs. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER (ZERO=0.0E+0) -* .. -* .. Local Scalars .. - REAL TEMP - INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L - LOGICAL NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX,MIN -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (K.LT.0) THEN - INFO = 5 - ELSE IF (LDA.LT. (K+1)) THEN - INFO = 7 - ELSE IF (INCX.EQ.0) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('STBSV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of A are -* accessed by sequentially with one pass through A. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := inv( A )*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 20 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - L = KPLUS1 - J - IF (NOUNIT) X(J) = X(J)/A(KPLUS1,J) - TEMP = X(J) - DO 10 I = J - 1,MAX(1,J-K),-1 - X(I) = X(I) - TEMP*A(L+I,J) - 10 CONTINUE - END IF - 20 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 40 J = N,1,-1 - KX = KX - INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = KPLUS1 - J - IF (NOUNIT) X(JX) = X(JX)/A(KPLUS1,J) - TEMP = X(JX) - DO 30 I = J - 1,MAX(1,J-K),-1 - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX - INCX - 30 CONTINUE - END IF - JX = JX - INCX - 40 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 60 J = 1,N - IF (X(J).NE.ZERO) THEN - L = 1 - J - IF (NOUNIT) X(J) = X(J)/A(1,J) - TEMP = X(J) - DO 50 I = J + 1,MIN(N,J+K) - X(I) = X(I) - TEMP*A(L+I,J) - 50 CONTINUE - END IF - 60 CONTINUE - ELSE - JX = KX - DO 80 J = 1,N - KX = KX + INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = 1 - J - IF (NOUNIT) X(JX) = X(JX)/A(1,J) - TEMP = X(JX) - DO 70 I = J + 1,MIN(N,J+K) - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX + INCX - 70 CONTINUE - END IF - JX = JX + INCX - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := inv( A')*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 100 J = 1,N - TEMP = X(J) - L = KPLUS1 - J - DO 90 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(I) - 90 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - X(J) = TEMP - 100 CONTINUE - ELSE - JX = KX - DO 120 J = 1,N - TEMP = X(JX) - IX = KX - L = KPLUS1 - J - DO 110 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX + INCX - 110 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - X(JX) = TEMP - JX = JX + INCX - IF (J.GT.K) KX = KX + INCX - 120 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 140 J = N,1,-1 - TEMP = X(J) - L = 1 - J - DO 130 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(I) - 130 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - X(J) = TEMP - 140 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 160 J = N,1,-1 - TEMP = X(JX) - IX = KX - L = 1 - J - DO 150 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX - INCX - 150 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - X(JX) = TEMP - JX = JX - INCX - IF ((N-J).GE.K) KX = KX - INCX - 160 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of STBSV . -* - END diff --git a/gtsam/3rdparty/Eigen/blas/testing/runblastest.sh b/gtsam/3rdparty/Eigen/blas/testing/runblastest.sh index aa634a2ce..4ffaf0111 100755 --- a/gtsam/3rdparty/Eigen/blas/testing/runblastest.sh +++ b/gtsam/3rdparty/Eigen/blas/testing/runblastest.sh @@ -27,11 +27,17 @@ else if [ -f $1.summ ]; then if [ `grep "FATAL ERROR" $1.summ | wc -l` -gt 0 ]; then echo -e $red "Test $1 failed (FATAL ERROR, read the file $1.summ for details)" $black + echo -e $blue + cat .runtest.log + echo -e $black exit 1; fi if [ `grep "FAILED THE TESTS OF ERROR-EXITS" $1.summ | wc -l` -gt 0 ]; then echo -e $red "Test $1 failed (FAILED THE TESTS OF ERROR-EXITS, read the file $1.summ for details)" $black + echo -e $blue + cat .runtest.log + echo -e $black exit 1; fi fi diff --git a/gtsam/3rdparty/Eigen/blas/xerbla.cpp b/gtsam/3rdparty/Eigen/blas/xerbla.cpp index bda1d2f46..0d57710fe 100644 --- a/gtsam/3rdparty/Eigen/blas/xerbla.cpp +++ b/gtsam/3rdparty/Eigen/blas/xerbla.cpp @@ -1,12 +1,18 @@ #include +#if (defined __GNUC__) +#define EIGEN_WEAK_LINKING __attribute__ ((weak)) +#else +#define EIGEN_WEAK_LINKING +#endif + #ifdef __cplusplus extern "C" { #endif -int xerbla_(const char * msg, int *info, int) +EIGEN_WEAK_LINKING int xerbla_(const char * msg, int *info, int) { std::cerr << "Eigen BLAS ERROR #" << *info << ": " << msg << "\n"; return 0; diff --git a/gtsam/3rdparty/Eigen/blas/ztbsv.f b/gtsam/3rdparty/Eigen/blas/ztbsv.f deleted file mode 100644 index 42b234a77..000000000 --- a/gtsam/3rdparty/Eigen/blas/ztbsv.f +++ /dev/null @@ -1,370 +0,0 @@ - SUBROUTINE ZTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) -* .. Scalar Arguments .. - INTEGER INCX,K,LDA,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - DOUBLE COMPLEX A(LDA,*),X(*) -* .. -* -* Purpose -* ======= -* -* ZTBSV solves one of the systems of equations -* -* A*x = b, or A'*x = b, or conjg( A' )*x = b, -* -* where b and x are n element vectors and A is an n by n unit, or -* non-unit, upper or lower triangular band matrix, with ( k + 1 ) -* diagonals. -* -* No test for singularity or near-singularity is included in this -* routine. Such tests must be performed before calling this routine. -* -* Arguments -* ========== -* -* UPLO - CHARACTER*1. -* On entry, UPLO specifies whether the matrix is an upper or -* lower triangular matrix as follows: -* -* UPLO = 'U' or 'u' A is an upper triangular matrix. -* -* UPLO = 'L' or 'l' A is a lower triangular matrix. -* -* Unchanged on exit. -* -* TRANS - CHARACTER*1. -* On entry, TRANS specifies the equations to be solved as -* follows: -* -* TRANS = 'N' or 'n' A*x = b. -* -* TRANS = 'T' or 't' A'*x = b. -* -* TRANS = 'C' or 'c' conjg( A' )*x = b. -* -* Unchanged on exit. -* -* DIAG - CHARACTER*1. -* On entry, DIAG specifies whether or not A is unit -* triangular as follows: -* -* DIAG = 'U' or 'u' A is assumed to be unit triangular. -* -* DIAG = 'N' or 'n' A is not assumed to be unit -* triangular. -* -* Unchanged on exit. -* -* N - INTEGER. -* On entry, N specifies the order of the matrix A. -* N must be at least zero. -* Unchanged on exit. -* -* K - INTEGER. -* On entry with UPLO = 'U' or 'u', K specifies the number of -* super-diagonals of the matrix A. -* On entry with UPLO = 'L' or 'l', K specifies the number of -* sub-diagonals of the matrix A. -* K must satisfy 0 .le. K. -* Unchanged on exit. -* -* A - COMPLEX*16 array of DIMENSION ( LDA, n ). -* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) -* by n part of the array A must contain the upper triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row -* ( k + 1 ) of the array, the first super-diagonal starting at -* position 2 in row k, and so on. The top left k by k triangle -* of the array A is not referenced. -* The following program segment will transfer an upper -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = K + 1 - J -* DO 10, I = MAX( 1, J - K ), J -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) -* by n part of the array A must contain the lower triangular -* band part of the matrix of coefficients, supplied column by -* column, with the leading diagonal of the matrix in row 1 of -* the array, the first sub-diagonal starting at position 1 in -* row 2, and so on. The bottom right k by k triangle of the -* array A is not referenced. -* The following program segment will transfer a lower -* triangular band matrix from conventional full matrix storage -* to band storage: -* -* DO 20, J = 1, N -* M = 1 - J -* DO 10, I = J, MIN( N, J + K ) -* A( M + I, J ) = matrix( I, J ) -* 10 CONTINUE -* 20 CONTINUE -* -* Note that when DIAG = 'U' or 'u' the elements of the array A -* corresponding to the diagonal elements of the matrix are not -* referenced, but are assumed to be unity. -* Unchanged on exit. -* -* LDA - INTEGER. -* On entry, LDA specifies the first dimension of A as declared -* in the calling (sub) program. LDA must be at least -* ( k + 1 ). -* Unchanged on exit. -* -* X - COMPLEX*16 array of dimension at least -* ( 1 + ( n - 1 )*abs( INCX ) ). -* Before entry, the incremented array X must contain the n -* element right-hand side vector b. On exit, X is overwritten -* with the solution vector x. -* -* INCX - INTEGER. -* On entry, INCX specifies the increment for the elements of -* X. INCX must not be zero. -* Unchanged on exit. -* -* Further Details -* =============== -* -* Level 2 Blas routine. -* -* -- Written on 22-October-1986. -* Jack Dongarra, Argonne National Lab. -* Jeremy Du Croz, Nag Central Office. -* Sven Hammarling, Nag Central Office. -* Richard Hanson, Sandia National Labs. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE COMPLEX ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - DOUBLE COMPLEX TEMP - INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L - LOGICAL NOCONJ,NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG,MAX,MIN -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (K.LT.0) THEN - INFO = 5 - ELSE IF (LDA.LT. (K+1)) THEN - INFO = 7 - ELSE IF (INCX.EQ.0) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZTBSV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOCONJ = LSAME(TRANS,'T') - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of A are -* accessed by sequentially with one pass through A. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := inv( A )*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 20 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - L = KPLUS1 - J - IF (NOUNIT) X(J) = X(J)/A(KPLUS1,J) - TEMP = X(J) - DO 10 I = J - 1,MAX(1,J-K),-1 - X(I) = X(I) - TEMP*A(L+I,J) - 10 CONTINUE - END IF - 20 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 40 J = N,1,-1 - KX = KX - INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = KPLUS1 - J - IF (NOUNIT) X(JX) = X(JX)/A(KPLUS1,J) - TEMP = X(JX) - DO 30 I = J - 1,MAX(1,J-K),-1 - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX - INCX - 30 CONTINUE - END IF - JX = JX - INCX - 40 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 60 J = 1,N - IF (X(J).NE.ZERO) THEN - L = 1 - J - IF (NOUNIT) X(J) = X(J)/A(1,J) - TEMP = X(J) - DO 50 I = J + 1,MIN(N,J+K) - X(I) = X(I) - TEMP*A(L+I,J) - 50 CONTINUE - END IF - 60 CONTINUE - ELSE - JX = KX - DO 80 J = 1,N - KX = KX + INCX - IF (X(JX).NE.ZERO) THEN - IX = KX - L = 1 - J - IF (NOUNIT) X(JX) = X(JX)/A(1,J) - TEMP = X(JX) - DO 70 I = J + 1,MIN(N,J+K) - X(IX) = X(IX) - TEMP*A(L+I,J) - IX = IX + INCX - 70 CONTINUE - END IF - JX = JX + INCX - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := inv( A' )*x or x := inv( conjg( A') )*x. -* - IF (LSAME(UPLO,'U')) THEN - KPLUS1 = K + 1 - IF (INCX.EQ.1) THEN - DO 110 J = 1,N - TEMP = X(J) - L = KPLUS1 - J - IF (NOCONJ) THEN - DO 90 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(I) - 90 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - ELSE - DO 100 I = MAX(1,J-K),J - 1 - TEMP = TEMP - DCONJG(A(L+I,J))*X(I) - 100 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(A(KPLUS1,J)) - END IF - X(J) = TEMP - 110 CONTINUE - ELSE - JX = KX - DO 140 J = 1,N - TEMP = X(JX) - IX = KX - L = KPLUS1 - J - IF (NOCONJ) THEN - DO 120 I = MAX(1,J-K),J - 1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX + INCX - 120 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J) - ELSE - DO 130 I = MAX(1,J-K),J - 1 - TEMP = TEMP - DCONJG(A(L+I,J))*X(IX) - IX = IX + INCX - 130 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(A(KPLUS1,J)) - END IF - X(JX) = TEMP - JX = JX + INCX - IF (J.GT.K) KX = KX + INCX - 140 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 170 J = N,1,-1 - TEMP = X(J) - L = 1 - J - IF (NOCONJ) THEN - DO 150 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(I) - 150 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - ELSE - DO 160 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - DCONJG(A(L+I,J))*X(I) - 160 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(A(1,J)) - END IF - X(J) = TEMP - 170 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 200 J = N,1,-1 - TEMP = X(JX) - IX = KX - L = 1 - J - IF (NOCONJ) THEN - DO 180 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - A(L+I,J)*X(IX) - IX = IX - INCX - 180 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(1,J) - ELSE - DO 190 I = MIN(N,J+K),J + 1,-1 - TEMP = TEMP - DCONJG(A(L+I,J))*X(IX) - IX = IX - INCX - 190 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(A(1,J)) - END IF - X(JX) = TEMP - JX = JX - INCX - IF ((N-J).GE.K) KX = KX - INCX - 200 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of ZTBSV . -* - END diff --git a/gtsam/3rdparty/Eigen/cmake/CMakeDetermineVSServicePack.cmake b/gtsam/3rdparty/Eigen/cmake/CMakeDetermineVSServicePack.cmake new file mode 100644 index 000000000..b89462308 --- /dev/null +++ b/gtsam/3rdparty/Eigen/cmake/CMakeDetermineVSServicePack.cmake @@ -0,0 +1,103 @@ +# - Includes a public function for assisting users in trying to determine the +# Visual Studio service pack in use. +# +# Sets the passed in variable to one of the following values or an empty +# string if unknown. +# vc80 +# vc80sp1 +# vc90 +# vc90sp1 +# +# Usage: +# =========================== +# +# if(MSVC) +# include(CMakeDetermineVSServicePack) +# DetermineVSServicePack( my_service_pack ) +# +# if( my_service_pack ) +# message(STATUS "Detected: ${my_service_pack}") +# endif() +# endif() +# +# =========================== + +#============================================================================= +# Copyright 2009-2010 Kitware, Inc. +# Copyright 2009-2010 Philip Lowman +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +# [INTERNAL] +# Please do not call this function directly +function(_DetermineVSServicePackFromCompiler _OUT_VAR _cl_version) + if (${_cl_version} VERSION_EQUAL "14.00.50727.42") + set(_version "vc80") + elseif(${_cl_version} VERSION_EQUAL "14.00.50727.762") + set(_version "vc80sp1") + elseif(${_cl_version} VERSION_EQUAL "15.00.21022.08") + set(_version "vc90") + elseif(${_cl_version} VERSION_EQUAL "15.00.30729.01") + set(_version "vc90sp1") + elseif(${_cl_version} VERSION_EQUAL "16.00.30319.01") + set(_version "vc100") + else() + set(_version "") + endif() + set(${_OUT_VAR} ${_version} PARENT_SCOPE) +endfunction() + +# +# A function to call to determine the Visual Studio service pack +# in use. See documentation above. +function(DetermineVSServicePack _pack) + if(NOT DETERMINED_VS_SERVICE_PACK OR NOT ${_pack}) + if(${CMAKE_BUILD_TOOL} STREQUAL "nmake") + EXECUTE_PROCESS(COMMAND ${CMAKE_CXX_COMPILER} "/?" + ERROR_VARIABLE _output) + set(DETERMINED_VS_SERVICE_PACK ${_output}) + else() + file(WRITE "${CMAKE_BINARY_DIR}/return0.cc" + "int main() { return 0; }\n") + + try_compile(DETERMINED_VS_SERVICE_PACK + "${CMAKE_BINARY_DIR}" + "${CMAKE_BINARY_DIR}/return0.cc" + OUTPUT_VARIABLE _output + COPY_FILE "${CMAKE_BINARY_DIR}/return0.cc") + + file(REMOVE "${CMAKE_BINARY_DIR}/return0.cc") + endif() + + if(DETERMINED_VS_SERVICE_PACK AND _output) + string(REGEX MATCH "Compiler Version [0-9]+.[0-9]+.[0-9]+.[0-9]+" + _cl_version "${_output}") + if(_cl_version) + string(REGEX MATCHALL "[0-9]+" + _cl_version_list "${_cl_version}") + list(GET _cl_version_list 0 _major) + list(GET _cl_version_list 1 _minor) + list(GET _cl_version_list 2 _patch) + list(GET _cl_version_list 3 _tweak) + + set(_cl_version_string ${_major}.${_minor}.${_patch}.${_tweak}) + + # Call helper function to determine VS version + _DetermineVSServicePackFromCompiler(_sp "${_cl_version_string}") + if(_sp) + #set(${_pack} "${_sp}(${_cl_version_string})" CACHE INTERNAL + set(${_pack} "${_sp}" CACHE INTERNAL + "The Visual Studio Release with Service Pack") + endif() + endif() + endif() + endif() +endfunction() diff --git a/gtsam/3rdparty/Eigen/cmake/EigenConfigureTesting.cmake b/gtsam/3rdparty/Eigen/cmake/EigenConfigureTesting.cmake new file mode 100644 index 000000000..cf8f32c01 --- /dev/null +++ b/gtsam/3rdparty/Eigen/cmake/EigenConfigureTesting.cmake @@ -0,0 +1,79 @@ +include(EigenTesting) +include(CheckCXXSourceCompiles) + +# configure the "site" and "buildname" +ei_set_sitename() + +# retrieve and store the build string +ei_set_build_string() + +add_custom_target(buildtests) +add_custom_target(check COMMAND "ctest") +add_dependencies(check buildtests) + +# check whether /bin/bash exists +find_file(EIGEN_BIN_BASH_EXISTS "/bin/bash" PATHS "/" NO_DEFAULT_PATH) + +# CMake/Ctest does not allow us to change the build command, +# so we have to workaround by directly editing the generated DartConfiguration.tcl file +# save CMAKE_MAKE_PROGRAM +set(CMAKE_MAKE_PROGRAM_SAVE ${CMAKE_MAKE_PROGRAM}) +# and set a fake one +set(CMAKE_MAKE_PROGRAM "@EIGEN_MAKECOMMAND_PLACEHOLDER@") + +# This call activates testing and generates the DartConfiguration.tcl +include(CTest) + +# overwrite default DartConfiguration.tcl +# The worarounds are different for each version of the MSVC IDE +if(MSVC_IDE) + if(MSVC_VERSION EQUAL 1600) # MSVC 2010 + set(EIGEN_MAKECOMMAND_PLACEHOLDER "${CMAKE_MAKE_PROGRAM_SAVE} buildtests.vcxproj /p:Configuration=\${CTEST_CONFIGURATION_TYPE} \n# ") + else() # MSVC 2008 (TODO check MSVC 2005) + set(EIGEN_MAKECOMMAND_PLACEHOLDER "${CMAKE_MAKE_PROGRAM_SAVE} Eigen.sln /build \"Release\" /project buildtests \n# ") + endif() +else() + # for make and nmake + set(EIGEN_MAKECOMMAND_PLACEHOLDER "${CMAKE_MAKE_PROGRAM_SAVE} buildtests") +endif() + +# copy ctest properties, which currently +# o raise the warning levels +configure_file(${CMAKE_BINARY_DIR}/DartConfiguration.tcl ${CMAKE_BINARY_DIR}/DartConfiguration.tcl) + +# restore default CMAKE_MAKE_PROGRAM +set(CMAKE_MAKE_PROGRAM ${CMAKE_MAKE_PROGRAM_SAVE}) +# un-set temporary variables so that it is like they never existed. +# CMake 2.6.3 introduces the more logical unset() syntax for this. +set(CMAKE_MAKE_PROGRAM_SAVE) +set(EIGEN_MAKECOMMAND_PLACEHOLDER) + +configure_file(${CMAKE_SOURCE_DIR}/CTestCustom.cmake.in ${CMAKE_BINARY_DIR}/CTestCustom.cmake) + +# some documentation of this function would be nice +ei_init_testing() + +# configure Eigen related testing options +option(EIGEN_NO_ASSERTION_CHECKING "Disable checking of assertions using exceptions" OFF) +option(EIGEN_DEBUG_ASSERTS "Enable advanced debuging of assertions" OFF) + +if(CMAKE_COMPILER_IS_GNUCXX) + option(EIGEN_COVERAGE_TESTING "Enable/disable gcov" OFF) + if(EIGEN_COVERAGE_TESTING) + set(COVERAGE_FLAGS "-fprofile-arcs -ftest-coverage") + set(CTEST_CUSTOM_COVERAGE_EXCLUDE "/test/") + else(EIGEN_COVERAGE_TESTING) + set(COVERAGE_FLAGS "") + endif(EIGEN_COVERAGE_TESTING) + if(EIGEN_TEST_C++0x) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x") + endif(EIGEN_TEST_C++0x) + if(CMAKE_SYSTEM_NAME MATCHES Linux) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS} -g2") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COVERAGE_FLAGS} -O2 -g2") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${COVERAGE_FLAGS} -fno-inline-functions") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COVERAGE_FLAGS} -O0 -g3") + endif(CMAKE_SYSTEM_NAME MATCHES Linux) +elseif(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS") +endif(CMAKE_COMPILER_IS_GNUCXX) diff --git a/gtsam/3rdparty/Eigen/cmake/EigenDetermineOSVersion.cmake b/gtsam/3rdparty/Eigen/cmake/EigenDetermineOSVersion.cmake new file mode 100644 index 000000000..3c48d4c37 --- /dev/null +++ b/gtsam/3rdparty/Eigen/cmake/EigenDetermineOSVersion.cmake @@ -0,0 +1,46 @@ +# The utility function DetermineOSVersion aims at providing an +# improved version of the CMake variable ${CMAKE_SYSTEM} on Windows +# machines. +# +# Usage: +# include(EigenDetermineOSVersion) +# DetermineOSVersion(OS_VERSION) +# message("OS: ${OS_VERSION}") + +# - A little helper variable which should not be directly called +function(DetermineShortWindowsName WIN_VERSION win_num_version) + if (${win_num_version} VERSION_EQUAL "6.1") + set(_version "win7") + elseif(${win_num_version} VERSION_EQUAL "6.0") + set(_version "winVista") + elseif(${win_num_version} VERSION_EQUAL "5.2") + set(_version "winXpProf") + elseif(${win_num_version} VERSION_EQUAL "5.1") + set(_version "winXp") + elseif(${win_num_version} VERSION_EQUAL "5.0") + set(_version "win2000Prof") + else() + set(_version "unknownWin") + endif() + set(${WIN_VERSION} ${_version} PARENT_SCOPE) +endfunction() + +function(DetermineOSVersion OS_VERSION) + if (WIN32) + file (TO_NATIVE_PATH "$ENV{COMSPEC}" SHELL) + exec_program( ${SHELL} ARGS "/c" "ver" OUTPUT_VARIABLE ver_output) + + string(REGEX MATCHALL "[0-9]+" + ver_list "${ver_output}") + list(GET ver_list 0 _major) + list(GET ver_list 1 _minor) + + set(win_num_version ${_major}.${_minor}) + DetermineShortWindowsName(win_version "${win_num_version}") + if(win_version) + set(${OS_VERSION} ${win_version} PARENT_SCOPE) + endif() + else() + set(${OS_VERSION} ${CMAKE_SYSTEM} PARENT_SCOPE) + endif() +endfunction() diff --git a/gtsam/3rdparty/Eigen/cmake/EigenTesting.cmake b/gtsam/3rdparty/Eigen/cmake/EigenTesting.cmake index 4c8039315..266043974 100644 --- a/gtsam/3rdparty/Eigen/cmake/EigenTesting.cmake +++ b/gtsam/3rdparty/Eigen/cmake/EigenTesting.cmake @@ -1,11 +1,11 @@ -option(EIGEN_NO_ASSERTION_CHECKING "Disable checking of assertions using exceptions" OFF) -option(EIGEN_DEBUG_ASSERTS "Enable advanced debuging of assertions" OFF) - -include(CheckCXXSourceCompiles) macro(ei_add_property prop value) - get_property(previous GLOBAL PROPERTY ${prop}) - set_property(GLOBAL PROPERTY ${prop} "${previous} ${value}") + get_property(previous GLOBAL PROPERTY ${prop}) + if ((NOT previous) OR (previous STREQUAL "")) + set_property(GLOBAL PROPERTY ${prop} "${value}") + else() + set_property(GLOBAL PROPERTY ${prop} "${previous} ${value}") + endif() endmacro(ei_add_property) #internal. See documentation of ei_add_test for details. @@ -27,6 +27,8 @@ macro(ei_add_test_internal testname testname_with_suffix) ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_DEBUG_ASSERTS=1") endif(EIGEN_DEBUG_ASSERTS) endif(EIGEN_NO_ASSERTION_CHECKING) + + ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_MAX_SIZE=${EIGEN_TEST_MAX_SIZE}") ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_FUNC=${testname}") @@ -38,6 +40,10 @@ macro(ei_add_test_internal testname testname_with_suffix) if(${ARGC} GREATER 2) ei_add_target_property(${targetname} COMPILE_FLAGS "${ARGV2}") endif(${ARGC} GREATER 2) + + if(EIGEN_TEST_CUSTOM_CXX_FLAGS) + ei_add_target_property(${targetname} COMPILE_FLAGS "${EIGEN_TEST_CUSTOM_CXX_FLAGS}") + endif() if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) target_link_libraries(${targetname} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) @@ -45,6 +51,9 @@ macro(ei_add_test_internal testname testname_with_suffix) if(EXTERNAL_LIBS) target_link_libraries(${targetname} ${EXTERNAL_LIBS}) endif() + if(EIGEN_TEST_CUSTOM_LINKER_FLAGS) + target_link_libraries(${targetname} ${EIGEN_TEST_CUSTOM_LINKER_FLAGS}) + endif() if(${ARGC} GREATER 3) set(libs_to_link ${ARGV3}) @@ -59,15 +68,11 @@ macro(ei_add_test_internal testname testname_with_suffix) endif() endif() - if(WIN32) - if(CYGWIN) - add_test(${testname_with_suffix} "${Eigen_SOURCE_DIR}/test/runtest.sh" "${testname_with_suffix}") - else(CYGWIN) - add_test(${testname_with_suffix} "${targetname}") - endif(CYGWIN) - else(WIN32) + if(EIGEN_BIN_BASH_EXISTS) add_test(${testname_with_suffix} "${Eigen_SOURCE_DIR}/test/runtest.sh" "${testname_with_suffix}") - endif(WIN32) + else() + add_test(${testname_with_suffix} "${targetname}") + endif() endmacro(ei_add_test_internal) @@ -120,9 +125,9 @@ macro(ei_add_test testname) file(READ "${testname}.cpp" test_source) set(parts 0) - string(REGEX MATCHALL "CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+" + string(REGEX MATCHALL "CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+|EIGEN_SUFFIXES(;[0-9]+)+" occurences "${test_source}") - string(REGEX REPLACE "CALL_SUBTEST_|EIGEN_TEST_PART_" "" suffixes "${occurences}") + string(REGEX REPLACE "CALL_SUBTEST_|EIGEN_TEST_PART_|EIGEN_SUFFIXES" "" suffixes "${occurences}") list(REMOVE_DUPLICATES suffixes) if(EIGEN_SPLIT_LARGE_TESTS AND suffixes) add_custom_target(${testname}) @@ -181,12 +186,13 @@ endmacro(ei_add_failtest) # print a summary of the different options macro(ei_testing_print_summary) - message(STATUS "************************************************************") message(STATUS "*** Eigen's unit tests configuration summary ***") message(STATUS "************************************************************") message(STATUS "") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") + message(STATUS "Build site: ${SITE}") + message(STATUS "Build string: ${BUILDNAME}") get_property(EIGEN_TESTING_SUMMARY GLOBAL PROPERTY EIGEN_TESTING_SUMMARY) get_property(EIGEN_TESTED_BACKENDS GLOBAL PROPERTY EIGEN_TESTED_BACKENDS) get_property(EIGEN_MISSING_BACKENDS GLOBAL PROPERTY EIGEN_MISSING_BACKENDS) @@ -204,6 +210,8 @@ macro(ei_testing_print_summary) elseif(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION) message(STATUS "Explicit vectorization disabled (alignment kept enabled)") else() + + message(STATUS "Maximal matrix/vector size: ${EIGEN_TEST_MAX_SIZE}") if(EIGEN_TEST_SSE2) message(STATUS "SSE2: ON") @@ -252,7 +260,6 @@ macro(ei_testing_print_summary) message(STATUS "\n${EIGEN_TESTING_SUMMARY}") message(STATUS "************************************************************") - endmacro(ei_testing_print_summary) macro(ei_init_testing) @@ -271,25 +278,200 @@ macro(ei_init_testing) set_property(GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT "0") set_property(GLOBAL PROPERTY EIGEN_FAILTEST_COUNT "0") + + # uncomment anytime you change the ei_get_compilerver_from_cxx_version_string macro + # ei_test_get_compilerver_from_cxx_version_string() endmacro(ei_init_testing) -if(CMAKE_COMPILER_IS_GNUCXX) - option(EIGEN_COVERAGE_TESTING "Enable/disable gcov" OFF) - if(EIGEN_COVERAGE_TESTING) - set(COVERAGE_FLAGS "-fprofile-arcs -ftest-coverage") - set(CTEST_CUSTOM_COVERAGE_EXCLUDE "/test/") - else(EIGEN_COVERAGE_TESTING) - set(COVERAGE_FLAGS "") - endif(EIGEN_COVERAGE_TESTING) - if(EIGEN_TEST_C++0x) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x") - endif(EIGEN_TEST_C++0x) - if(CMAKE_SYSTEM_NAME MATCHES Linux) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS} -g2") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COVERAGE_FLAGS} -O2 -g2") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${COVERAGE_FLAGS} -fno-inline-functions") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COVERAGE_FLAGS} -O0 -g3") - endif(CMAKE_SYSTEM_NAME MATCHES Linux) -elseif(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS") -endif(CMAKE_COMPILER_IS_GNUCXX) +macro(ei_set_sitename) + # if the sitename is not yet set, try to set it + if(NOT ${SITE} OR ${SITE} STREQUAL "") + set(eigen_computername $ENV{COMPUTERNAME}) + set(eigen_hostname $ENV{HOSTNAME}) + if(eigen_hostname) + set(SITE ${eigen_hostname}) + elseif(eigen_computername) + set(SITE ${eigen_computername}) + endif() + endif() + # in case it is already set, enforce lower case + if(SITE) + string(TOLOWER ${SITE} SITE) + endif() +endmacro(ei_set_sitename) + +macro(ei_get_compilerver VAR) + if(MSVC) + # on windows system, we use a modified CMake script + include(CMakeDetermineVSServicePack) + DetermineVSServicePack( my_service_pack ) + + if( my_service_pack ) + set(${VAR} ${my_service_pack}) + else() + set(${VAR} "na") + endif() + else() + # on all other system we rely on ${CMAKE_CXX_COMPILER} + # supporting a "--version" flag + execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version + COMMAND head -n 1 + OUTPUT_VARIABLE eigen_cxx_compiler_version_string OUTPUT_STRIP_TRAILING_WHITESPACE) + + ei_get_compilerver_from_cxx_version_string(${eigen_cxx_compiler_version_string} CNAME CVER) + + set(${VAR} "${CNAME}-${CVER}") + endif() +endmacro(ei_get_compilerver) + +# Extract compiler name and version from a raw version string +# WARNING: if you edit thid macro, then please test it by uncommenting +# the testing macro call in ei_init_testing() of the EigenTesting.cmake file. +# See also the ei_test_get_compilerver_from_cxx_version_string macro at the end of the file +macro(ei_get_compilerver_from_cxx_version_string VERSTRING CNAME CVER) + # extract possible compiler names + string(REGEX MATCH "g\\+\\+" ei_has_gpp ${VERSTRING}) + string(REGEX MATCH "llvm|LLVM" ei_has_llvm ${VERSTRING}) + string(REGEX MATCH "gcc|GCC" ei_has_gcc ${VERSTRING}) + string(REGEX MATCH "icpc|ICC" ei_has_icpc ${VERSTRING}) + string(REGEX MATCH "clang|CLANG" ei_has_clang ${VERSTRING}) + + # combine them + if((ei_has_llvm) AND (ei_has_gpp OR ei_has_gcc)) + set(${CNAME} "llvm-g++") + elseif((ei_has_llvm) AND (ei_has_clang)) + set(${CNAME} "llvm-clang++") + elseif(ei_has_icpc) + set(${CNAME} "icpc") + elseif(ei_has_gpp OR ei_has_gcc) + set(${CNAME} "g++") + else() + set(${CNAME} "_") + endif() + + # extract possible version numbers + # first try to extract 3 isolated numbers: + string(REGEX MATCH " [0-9]+\\.[0-9]+\\.[0-9]+" eicver ${VERSTRING}) + if(NOT eicver) + # try to extract 2 isolated ones: + string(REGEX MATCH " [0-9]+\\.[0-9]+" eicver ${VERSTRING}) + if(NOT eicver) + # try to extract 3: + string(REGEX MATCH "[^0-9][0-9]+\\.[0-9]+\\.[0-9]+" eicver ${VERSTRING}) + if(NOT eicver) + # try to extract 2: + string(REGEX MATCH "[^0-9][0-9]+\\.[0-9]+" eicver ${VERSTRING}) + else() + set(eicver " _") + endif() + endif() + endif() + + string(REGEX REPLACE ".(.*)" "\\1" ${CVER} ${eicver}) + +endmacro(ei_get_compilerver_from_cxx_version_string) + +macro(ei_get_cxxflags VAR) + set(${VAR} "") + ei_is_64bit_env(IS_64BIT_ENV) + if(EIGEN_TEST_NEON) + set(${VAR} NEON) + elseif(EIGEN_TEST_ALTIVEC) + set(${VAR} ALVEC) + elseif(EIGEN_TEST_SSE4_2) + set(${VAR} SSE42) + elseif(EIGEN_TEST_SSE4_1) + set(${VAR} SSE41) + elseif(EIGEN_TEST_SSSE3) + set(${VAR} SSSE3) + elseif(EIGEN_TEST_SSE3) + set(${VAR} SSE3) + elseif(EIGEN_TEST_SSE2 OR IS_64BIT_ENV) + set(${VAR} SSE2) + endif() + + if(EIGEN_TEST_OPENMP) + if (${VAR} STREQUAL "") + set(${VAR} OMP) + else() + set(${VAR} ${${VAR}}-OMP) + endif() + endif() + + if(EIGEN_DEFAULT_TO_ROW_MAJOR) + if (${VAR} STREQUAL "") + set(${VAR} ROW) + else() + set(${VAR} ${${VAR}}-ROWMAJ) + endif() + endif() +endmacro(ei_get_cxxflags) + +macro(ei_set_build_string) + ei_get_compilerver(LOCAL_COMPILER_VERSION) + ei_get_cxxflags(LOCAL_COMPILER_FLAGS) + + include(EigenDetermineOSVersion) + DetermineOSVersion(OS_VERSION) + + set(TMP_BUILD_STRING ${OS_VERSION}-${LOCAL_COMPILER_VERSION}) + + if (NOT ${LOCAL_COMPILER_FLAGS} STREQUAL "") + set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-${LOCAL_COMPILER_FLAGS}) + endif() + + ei_is_64bit_env(IS_64BIT_ENV) + if(NOT IS_64BIT_ENV) + set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-32bit) + else() + set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-64bit) + endif() + + string(TOLOWER ${TMP_BUILD_STRING} BUILDNAME) +endmacro(ei_set_build_string) + +macro(ei_is_64bit_env VAR) + + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/is64.cpp" + "int main() { return (sizeof(int*) == 8 ? 1 : 0); } + ") + try_run(run_res compile_res + ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/is64.cpp" + RUN_OUTPUT_VARIABLE run_output) + + if(compile_res AND run_res) + set(${VAR} ${run_res}) + elseif(CMAKE_CL_64) + set(${VAR} 1) + elseif("$ENV{Platform}" STREQUAL "X64") # nmake 64 bit + set(${VAR} 1) + endif() +endmacro(ei_is_64bit_env) + + +# helper macro for testing ei_get_compilerver_from_cxx_version_string +# STR: raw version string +# REFNAME: expected compiler name +# REFVER: expected compiler version +macro(ei_test1_get_compilerver_from_cxx_version_string STR REFNAME REFVER) + ei_get_compilerver_from_cxx_version_string(${STR} CNAME CVER) + if((NOT ${REFNAME} STREQUAL ${CNAME}) OR (NOT ${REFVER} STREQUAL ${CVER})) + message("STATUS ei_get_compilerver_from_cxx_version_string error:") + message("Expected \"${REFNAME}-${REFVER}\", got \"${CNAME}-${CVER}\"") + endif() +endmacro(ei_test1_get_compilerver_from_cxx_version_string) + +# macro for testing ei_get_compilerver_from_cxx_version_string +# feel free to add more version strings +macro(ei_test_get_compilerver_from_cxx_version_string) + ei_test1_get_compilerver_from_cxx_version_string("g++ (SUSE Linux) 4.5.3 20110428 [gcc-4_5-branch revision 173117]" "g++" "4.5.3") + ei_test1_get_compilerver_from_cxx_version_string("c++ (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)" "g++" "4.5.1") + ei_test1_get_compilerver_from_cxx_version_string("icpc (ICC) 11.0 20081105" "icpc" "11.0") + ei_test1_get_compilerver_from_cxx_version_string("g++-3.4 (GCC) 3.4.6" "g++" "3.4.6") + ei_test1_get_compilerver_from_cxx_version_string("SUSE Linux clang version 3.0 (branches/release_30 145598) (based on LLVM 3.0)" "llvm-clang++" "3.0") + ei_test1_get_compilerver_from_cxx_version_string("icpc (ICC) 12.0.5 20110719" "icpc" "12.0.5") + ei_test1_get_compilerver_from_cxx_version_string("Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)" "llvm-clang++" "2.1") + ei_test1_get_compilerver_from_cxx_version_string("i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)" "llvm-g++" "4.2.1") + ei_test1_get_compilerver_from_cxx_version_string("g++-mp-4.4 (GCC) 4.4.6" "g++" "4.4.6") + ei_test1_get_compilerver_from_cxx_version_string("g++-mp-4.4 (GCC) 2011" "g++" "4.4") +endmacro(ei_test_get_compilerver_from_cxx_version_string) diff --git a/gtsam/3rdparty/Eigen/cmake/FindCholmod.cmake b/gtsam/3rdparty/Eigen/cmake/FindCholmod.cmake index a5e132b64..9095bea31 100644 --- a/gtsam/3rdparty/Eigen/cmake/FindCholmod.cmake +++ b/gtsam/3rdparty/Eigen/cmake/FindCholmod.cmake @@ -13,6 +13,7 @@ find_path(CHOLMOD_INCLUDES ${INCLUDE_INSTALL_DIR} PATH_SUFFIXES suitesparse + ufsparse ) find_library(CHOLMOD_LIBRARIES cholmod PATHS $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR}) diff --git a/gtsam/3rdparty/Eigen/cmake/FindEigen2.cmake b/gtsam/3rdparty/Eigen/cmake/FindEigen2.cmake index da95bb0f5..a834b8872 100644 --- a/gtsam/3rdparty/Eigen/cmake/FindEigen2.cmake +++ b/gtsam/3rdparty/Eigen/cmake/FindEigen2.cmake @@ -39,11 +39,11 @@ macro(_eigen2_check_version) set(EIGEN2_MINOR_VERSION "${CMAKE_MATCH_1}") set(EIGEN2_VERSION ${EIGEN2_WORLD_VERSION}.${EIGEN2_MAJOR_VERSION}.${EIGEN2_MINOR_VERSION}) - if(${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION}) + if((${EIGEN2_WORLD_VERSION} NOTEQUAL 2) OR (${EIGEN2_MAJOR_VERSION} GREATER 10) OR (${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION})) set(EIGEN2_VERSION_OK FALSE) - else(${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION}) + else() set(EIGEN2_VERSION_OK TRUE) - endif(${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION}) + endif() if(NOT EIGEN2_VERSION_OK) diff --git a/gtsam/3rdparty/Eigen/cmake/FindFFTW.cmake b/gtsam/3rdparty/Eigen/cmake/FindFFTW.cmake index 58b10ea11..a9e9925e7 100644 --- a/gtsam/3rdparty/Eigen/cmake/FindFFTW.cmake +++ b/gtsam/3rdparty/Eigen/cmake/FindFFTW.cmake @@ -1,31 +1,119 @@ +# - Find the FFTW library +# +# Usage: +# find_package(FFTW [REQUIRED] [QUIET] ) +# +# It sets the following variables: +# FFTW_FOUND ... true if fftw is found on the system +# FFTW_LIBRARIES ... full path to fftw library +# FFTW_INCLUDES ... fftw include directory +# +# The following variables will be checked by the function +# FFTW_USE_STATIC_LIBS ... if true, only static libraries are found +# FFTW_ROOT ... if set, the libraries are exclusively searched +# under this path +# FFTW_LIBRARY ... fftw library to use +# FFTW_INCLUDE_DIR ... fftw include directory +# -if (FFTW_INCLUDES AND FFTW_LIBRARIES) - set(FFTW_FIND_QUIETLY TRUE) -endif (FFTW_INCLUDES AND FFTW_LIBRARIES) - -find_path(FFTW_INCLUDES - NAMES - fftw3.h - PATHS - $ENV{FFTWDIR} - ${INCLUDE_INSTALL_DIR} -) - -find_library(FFTWF_LIB NAMES fftw3f PATHS $ENV{FFTWDIR} ${LIB_INSTALL_DIR}) -find_library(FFTW_LIB NAMES fftw3 PATHS $ENV{FFTWDIR} ${LIB_INSTALL_DIR}) -set(FFTW_LIBRARIES "${FFTWF_LIB} ${FFTW_LIB}" ) - -find_library(FFTWL_LIB NAMES fftw3l PATHS $ENV{FFTWDIR} ${LIB_INSTALL_DIR}) - -if(FFTWL_LIB) -set(FFTW_LIBRARIES "${FFTW_LIBRARIES} ${FFTWL_LIB}") +#If environment variable FFTWDIR is specified, it has same effect as FFTW_ROOT +if( NOT FFTW_ROOT AND ENV{FFTWDIR} ) + set( FFTW_ROOT $ENV{FFTWDIR} ) endif() +# Check if we can use PkgConfig +find_package(PkgConfig) -message(STATUS "FFTW ${FFTW_LIBRARIES}" ) +#Determine from PKG +if( PKG_CONFIG_FOUND AND NOT FFTW_ROOT ) + pkg_check_modules( PKG_FFTW QUIET "fftw3" ) +endif() + +#Check whether to search static or dynamic libs +set( CMAKE_FIND_LIBRARY_SUFFIXES_SAV ${CMAKE_FIND_LIBRARY_SUFFIXES} ) + +if( ${FFTW_USE_STATIC_LIBS} ) + set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX} ) +else() + set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX} ) +endif() + +if( FFTW_ROOT ) + + #find libs + find_library( + FFTW_LIB + NAMES "fftw3" + PATHS ${FFTW_ROOT} + PATH_SUFFIXES "lib" "lib64" + NO_DEFAULT_PATH + ) + + find_library( + FFTWF_LIB + NAMES "fftw3f" + PATHS ${FFTW_ROOT} + PATH_SUFFIXES "lib" "lib64" + NO_DEFAULT_PATH + ) + + find_library( + FFTWL_LIB + NAMES "fftw3l" + PATHS ${FFTW_ROOT} + PATH_SUFFIXES "lib" "lib64" + NO_DEFAULT_PATH + ) + + #find includes + find_path( + FFTW_INCLUDES + NAMES "fftw3.h" + PATHS ${FFTW_ROOT} + PATH_SUFFIXES "include" + NO_DEFAULT_PATH + ) + +else() + + find_library( + FFTW_LIB + NAMES "fftw3" + PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR} + ) + + find_library( + FFTWF_LIB + NAMES "fftw3f" + PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR} + ) + + + find_library( + FFTWL_LIB + NAMES "fftw3l" + PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR} + ) + + find_path( + FFTW_INCLUDES + NAMES "fftw3.h" + PATHS ${PKG_FFTW_INCLUDE_DIRS} ${INCLUDE_INSTALL_DIR} + ) + +endif( FFTW_ROOT ) + +set(FFTW_LIBRARIES ${FFTW_LIB} ${FFTWF_LIB}) + +if(FFTWL_LIB) + set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTWL_LIB}) +endif() + +set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV} ) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FFTW DEFAULT_MSG FFTW_INCLUDES FFTW_LIBRARIES) mark_as_advanced(FFTW_INCLUDES FFTW_LIBRARIES) + diff --git a/gtsam/3rdparty/Eigen/cmake/FindMetis.cmake b/gtsam/3rdparty/Eigen/cmake/FindMetis.cmake new file mode 100644 index 000000000..e4d6ef258 --- /dev/null +++ b/gtsam/3rdparty/Eigen/cmake/FindMetis.cmake @@ -0,0 +1,24 @@ +# Pastix requires METIS or METIS (partitioning and reordering tools) + +if (METIS_INCLUDES AND METIS_LIBRARIES) + set(METIS_FIND_QUIETLY TRUE) +endif (METIS_INCLUDES AND METIS_LIBRARIES) + +find_path(METIS_INCLUDES + NAMES + metis.h + PATHS + $ENV{METISDIR} + ${INCLUDE_INSTALL_DIR} + PATH_SUFFIXES + metis +) + + +find_library(METIS_LIBRARIES metis PATHS $ENV{METISDIR} ${LIB_INSTALL_DIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(METIS DEFAULT_MSG + METIS_INCLUDES METIS_LIBRARIES) + +mark_as_advanced(METIS_INCLUDES METIS_LIBRARIES) diff --git a/gtsam/3rdparty/Eigen/cmake/FindPastix.cmake b/gtsam/3rdparty/Eigen/cmake/FindPastix.cmake new file mode 100644 index 000000000..e2e6c810d --- /dev/null +++ b/gtsam/3rdparty/Eigen/cmake/FindPastix.cmake @@ -0,0 +1,25 @@ +# Pastix lib requires linking to a blas library. +# It is up to the user of this module to find a BLAS and link to it. +# Pastix requires SCOTCH or METIS (partitioning and reordering tools) as well + +if (PASTIX_INCLUDES AND PASTIX_LIBRARIES) + set(PASTIX_FIND_QUIETLY TRUE) +endif (PASTIX_INCLUDES AND PASTIX_LIBRARIES) + +find_path(PASTIX_INCLUDES + NAMES + pastix_nompi.h + PATHS + $ENV{PASTIXDIR} + ${INCLUDE_INSTALL_DIR} +) + +find_library(PASTIX_LIBRARIES pastix PATHS $ENV{PASTIXDIR} ${LIB_INSTALL_DIR}) + + + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PASTIX DEFAULT_MSG + PASTIX_INCLUDES PASTIX_LIBRARIES) + +mark_as_advanced(PASTIX_INCLUDES PASTIX_LIBRARIES) diff --git a/gtsam/3rdparty/Eigen/cmake/FindScotch.cmake b/gtsam/3rdparty/Eigen/cmake/FindScotch.cmake new file mode 100644 index 000000000..530340b16 --- /dev/null +++ b/gtsam/3rdparty/Eigen/cmake/FindScotch.cmake @@ -0,0 +1,24 @@ +# Pastix requires SCOTCH or METIS (partitioning and reordering tools) + +if (SCOTCH_INCLUDES AND SCOTCH_LIBRARIES) + set(SCOTCH_FIND_QUIETLY TRUE) +endif (SCOTCH_INCLUDES AND SCOTCH_LIBRARIES) + +find_path(SCOTCH_INCLUDES + NAMES + scotch.h + PATHS + $ENV{SCOTCHDIR} + ${INCLUDE_INSTALL_DIR} + PATH_SUFFIXES + scotch +) + + +find_library(SCOTCH_LIBRARIES scotch PATHS $ENV{SCOTCHDIR} ${LIB_INSTALL_DIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SCOTCH DEFAULT_MSG + SCOTCH_INCLUDES SCOTCH_LIBRARIES) + +mark_as_advanced(SCOTCH_INCLUDES SCOTCH_LIBRARIES) diff --git a/gtsam/3rdparty/Eigen/cmake/FindUmfpack.cmake b/gtsam/3rdparty/Eigen/cmake/FindUmfpack.cmake index 4b6f24f93..d42c3c4a2 100644 --- a/gtsam/3rdparty/Eigen/cmake/FindUmfpack.cmake +++ b/gtsam/3rdparty/Eigen/cmake/FindUmfpack.cmake @@ -13,6 +13,7 @@ find_path(UMFPACK_INCLUDES ${INCLUDE_INSTALL_DIR} PATH_SUFFIXES suitesparse + ufsparse ) find_library(UMFPACK_LIBRARIES umfpack PATHS $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) diff --git a/gtsam/3rdparty/Eigen/cmake/language_support.cmake b/gtsam/3rdparty/Eigen/cmake/language_support.cmake new file mode 100644 index 000000000..3414e6ea6 --- /dev/null +++ b/gtsam/3rdparty/Eigen/cmake/language_support.cmake @@ -0,0 +1,64 @@ +# cmake/modules/language_support.cmake +# +# Temporary additional general language support is contained within this +# file. + +# This additional function definition is needed to provide a workaround for +# CMake bug 9220. + +# On debian testing (cmake 2.6.2), I get return code zero when calling +# cmake the first time, but cmake crashes when running a second time +# as follows: +# +# -- The Fortran compiler identification is unknown +# CMake Error at /usr/share/cmake-2.6/Modules/CMakeFortranInformation.cmake:7 (GET_FILENAME_COMPONENT): +# get_filename_component called with incorrect number of arguments +# Call Stack (most recent call first): +# CMakeLists.txt:3 (enable_language) +# +# My workaround is to invoke cmake twice. If both return codes are zero, +# it is safe to invoke ENABLE_LANGUAGE(Fortran OPTIONAL) + +function(workaround_9220 language language_works) + #message("DEBUG: language = ${language}") + set(text + "project(test NONE) + cmake_minimum_required(VERSION 2.6.0) + enable_language(${language} OPTIONAL) + ") + file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/language_tests/${language}) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}) + file(WRITE ${CMAKE_BINARY_DIR}/language_tests/${language}/CMakeLists.txt + ${text}) + execute_process( + COMMAND ${CMAKE_COMMAND} . + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language} + RESULT_VARIABLE return_code + OUTPUT_QUIET + ERROR_QUIET + ) + + if(return_code EQUAL 0) + # Second run + execute_process ( + COMMAND ${CMAKE_COMMAND} . + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language} + RESULT_VARIABLE return_code + OUTPUT_QUIET + ERROR_QUIET + ) + if(return_code EQUAL 0) + set(${language_works} ON PARENT_SCOPE) + else(return_code EQUAL 0) + set(${language_works} OFF PARENT_SCOPE) + endif(return_code EQUAL 0) + else(return_code EQUAL 0) + set(${language_works} OFF PARENT_SCOPE) + endif(return_code EQUAL 0) +endfunction(workaround_9220) + +# Temporary tests of the above function. +#workaround_9220(CXX CXX_language_works) +#message("CXX_language_works = ${CXX_language_works}") +#workaround_9220(CXXp CXXp_language_works) +#message("CXXp_language_works = ${CXXp_language_works}") diff --git a/gtsam/3rdparty/Eigen/debug/gdb/printers.py b/gtsam/3rdparty/Eigen/debug/gdb/printers.py index 02823b8a2..8dab8fffb 100644 --- a/gtsam/3rdparty/Eigen/debug/gdb/printers.py +++ b/gtsam/3rdparty/Eigen/debug/gdb/printers.py @@ -31,9 +31,15 @@ # To use it: # -# * create a directory and put the file as well as an empty __init__.py in that directory +# * Create a directory and put the file as well as an empty __init__.py in +# that directory. # * Create a ~/.gdbinit file, that contains the following: - +# python +# import sys +# sys.path.insert(0, '/path/to/eigen/printer/directory') +# from printers import register_eigen_printers +# register_eigen_printers (None) +# end import gdb import re @@ -41,10 +47,14 @@ import itertools class EigenMatrixPrinter: - "Print Eigen Matrix of some kind" + "Print Eigen Matrix or Array of some kind" - def __init__(self, val): + def __init__(self, variety, val): "Extract all the necessary information" + + # Save the variety (presumably "Matrix" or "Array") for later usage + self.variety = variety + # The gdb extension does not support value template arguments - need to extract them by hand type = val.type if type.code == gdb.TYPE_CODE_REF: @@ -55,7 +65,7 @@ class EigenMatrixPrinter: m = regex.findall(tag)[0][1:-1] template_params = m.split(',') template_params = map(lambda x:x.replace(" ", ""), template_params) - + if template_params[1] == '-0x00000000000000001' or template_params[1] == '-0x000000001': self.rows = val['m_storage']['m_rows'] else: @@ -71,9 +81,9 @@ class EigenMatrixPrinter: self.options = template_params[3]; self.rowMajor = (int(self.options) & 0x1) - + self.innerType = self.type.template_argument(0) - + self.val = val # Fixed size matrices have a struct as their storage, so we need to walk through this @@ -90,12 +100,12 @@ class EigenMatrixPrinter: self.currentRow = 0 self.currentCol = 0 self.rowMajor = rowMajor - + def __iter__ (self): return self - + def next(self): - + row = self.currentRow col = self.currentCol if self.rowMajor == 0: @@ -115,7 +125,7 @@ class EigenMatrixPrinter: self.currentCol = 0 self.currentRow = self.currentRow + 1 - + item = self.dataPtr.dereference() self.dataPtr = self.dataPtr + 1 if (self.cols == 1): #if it's a column vector @@ -123,17 +133,17 @@ class EigenMatrixPrinter: elif (self.rows == 1): #if it's a row vector return ('[%d]' % (col,), item) return ('[%d,%d]' % (row, col), item) - + def children(self): return self._iterator(self.rows, self.cols, self.data, self.rowMajor) - + def to_string(self): - return "Eigen::Matrix<%s,%d,%d,%s> (data ptr: %s)" % (self.innerType, self.rows, self.cols, "RowMajor" if self.rowMajor else "ColMajor", self.data) + return "Eigen::%s<%s,%d,%d,%s> (data ptr: %s)" % (self.variety, self.innerType, self.rows, self.cols, "RowMajor" if self.rowMajor else "ColMajor", self.data) class EigenQuaternionPrinter: "Print an Eigen Quaternion" - + def __init__(self, val): "Extract all the necessary information" # The gdb extension does not support value template arguments - need to extract them by hand @@ -153,18 +163,18 @@ class EigenQuaternionPrinter: self.dataPtr = dataPtr self.currentElement = 0 self.elementNames = ['x', 'y', 'z', 'w'] - + def __iter__ (self): return self - + def next(self): element = self.currentElement - + if self.currentElement >= 4: #there are 4 elements in a quanternion raise StopIteration self.currentElement = self.currentElement + 1 - + item = self.dataPtr.dereference() self.dataPtr = self.dataPtr + 1 return ('[%s]' % (self.elementNames[element],), item) @@ -172,13 +182,14 @@ class EigenQuaternionPrinter: def children(self): return self._iterator(self.data) - + def to_string(self): return "Eigen::Quaternion<%s> (data ptr: %s)" % (self.innerType, self.data) def build_eigen_dictionary (): pretty_printers_dict[re.compile('^Eigen::Quaternion<.*>$')] = lambda val: EigenQuaternionPrinter(val) - pretty_printers_dict[re.compile('^Eigen::Matrix<.*>$')] = lambda val: EigenMatrixPrinter(val) + pretty_printers_dict[re.compile('^Eigen::Matrix<.*>$')] = lambda val: EigenMatrixPrinter("Matrix", val) + pretty_printers_dict[re.compile('^Eigen::Array<.*>$')] = lambda val: EigenMatrixPrinter("Array", val) def register_eigen_printers(obj): "Register eigen pretty-printers with objfile Obj" @@ -189,22 +200,22 @@ def register_eigen_printers(obj): def lookup_function(val): "Look-up and return a pretty-printer that can print va." - + type = val.type - + if type.code == gdb.TYPE_CODE_REF: type = type.target() type = type.unqualified().strip_typedefs() - + typename = type.tag if typename == None: return None - + for function in pretty_printers_dict: if function.search(typename): return pretty_printers_dict[function](val) - + return None pretty_printers_dict = {} diff --git a/gtsam/3rdparty/Eigen/debug/msvc/eigen_autoexp_part.dat b/gtsam/3rdparty/Eigen/debug/msvc/eigen_autoexp_part.dat index ba7eefc8e..07aa43739 100644 --- a/gtsam/3rdparty/Eigen/debug/msvc/eigen_autoexp_part.dat +++ b/gtsam/3rdparty/Eigen/debug/msvc/eigen_autoexp_part.dat @@ -1,295 +1,295 @@ -; *************************************************************** -; * Eigen Visualizer -; * -; * Author: Hauke Heibel -; * -; * Support the enhanced debugging of the following Eigen -; * types (*: any, +:fixed dimension) : -; * -; * - Eigen::Matrix<*,4,1,*,*,*> and Eigen::Matrix<*,1,4,*,*,*> -; * - Eigen::Matrix<*,3,1,*,*,*> and Eigen::Matrix<*,1,3,*,*,*> -; * - Eigen::Matrix<*,2,1,*,*,*> and Eigen::Matrix<*,1,2,*,*,*> -; * - Eigen::Matrix<*,-1,-1,*,*,*> -; * - Eigen::Matrix<*,+,-1,*,*,*> -; * - Eigen::Matrix<*,-1,+,*,*,*> -; * - Eigen::Matrix<*,+,+,*,*,*> -; * -; * Matrices are displayed properly independantly of the memory -; * alignment (RowMajor vs. ColMajor). -; * -; * This file is distributed WITHOUT ANY WARRANTY. Please ensure -; * that your original autoexp.dat file is copied to a safe -; * place before proceeding with its modification. -; *************************************************************** - -[Visualizer] - -; Fixed size 4-vectors -Eigen::Matrix<*,4,1,*,*,*>|Eigen::Matrix<*,1,4,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - x : ($c.m_storage.m_data.array)[0], - y : ($c.m_storage.m_data.array)[1], - z : ($c.m_storage.m_data.array)[2], - w : ($c.m_storage.m_data.array)[3] - ) - ) - - preview - ( - #( - "[", - 4, - "](", - #array(expr: $e.m_storage.m_data.array[$i], size: 4), - ")" - ) - ) -} - -; Fixed size 3-vectors -Eigen::Matrix<*,3,1,*,*,*>|Eigen::Matrix<*,1,3,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - x : ($c.m_storage.m_data.array)[0], - y : ($c.m_storage.m_data.array)[1], - z : ($c.m_storage.m_data.array)[2] - ) - ) - - preview - ( - #( - "[", - 3, - "](", - #array(expr: $e.m_storage.m_data.array[$i], size: 3), - ")" - ) - ) -} - -; Fixed size 2-vectors -Eigen::Matrix<*,2,1,*,*,*>|Eigen::Matrix<*,1,2,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - x : ($c.m_storage.m_data.array)[0], - y : ($c.m_storage.m_data.array)[1] - ) - ) - - preview - ( - #( - "[", - 2, - "](", - #array(expr: $e.m_storage.m_data.array[$i], size: 2), - ")" - ) - ) -} - -; Fixed size 1-vectors -Eigen::Matrix<*,1,1,*,*,*>|Eigen::Matrix<*,1,1,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - x : ($c.m_storage.m_data.array)[0] - ) - ) - - preview - ( - #( - "[", - 1, - "](", - #array(expr: $e.m_storage.m_data.array[$i], size: 1), - ")" - ) - ) -} - -; Dynamic matrices (ColMajor and RowMajor support) -Eigen::Matrix<*,-1,-1,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - rows: $c.m_storage.m_rows, - cols: $c.m_storage.m_cols, - ; Check for RowMajorBit - #if ($c.Flags & 0x1) ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.m_storage.m_cols + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)], - size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols - ) - ) #else ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data)[$i], - size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols - ) - ) - ) - ) - - preview - ( - #( - "[", - $c.m_storage.m_rows, - ",", - $c.m_storage.m_cols, - "](", - #array( - expr : [($c.m_storage.m_data)[$i],g], - size : $c.m_storage.m_rows*$c.m_storage.m_cols - ), - ")" - ) - ) -} - -; Fixed rows, dynamic columns matrix (ColMajor and RowMajor support) -Eigen::Matrix<*,*,-1,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - rows: $c.RowsAtCompileTime, - cols: $c.m_storage.m_cols, - ; Check for RowMajorBit - #if ($c.Flags & 0x1) ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data)[($i % $c.RowsAtCompileTime)*$c.m_storage.m_cols + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)], - size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols - ) - ) #else ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data)[$i], - size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols - ) - ) - ) - ) - - preview - ( - #( - "[", - $c.RowsAtCompileTime, - ",", - $c.m_storage.m_cols, - "](", - #array( - expr : [($c.m_storage.m_data)[$i],g], - size : $c.RowsAtCompileTime*$c.m_storage.m_cols - ), - ")" - ) - ) -} - -; Dynamic rows, fixed columns matrix (ColMajor and RowMajor support) -Eigen::Matrix<*,-1,*,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - rows: $c.m_storage.m_rows, - cols: $c.ColsAtCompileTime, - ; Check for RowMajorBit - #if ($c.Flags & 0x1) ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.ColsAtCompileTime + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)], - size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime - ) - ) #else ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data)[$i], - size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime - ) - ) - ) - ) - - preview - ( - #( - "[", - $c.m_storage.m_rows, - ",", - $c.ColsAtCompileTime, - "](", - #array( - expr : [($c.m_storage.m_data)[$i],g], - size : $c.m_storage.m_rows*$c.ColsAtCompileTime - ), - ")" - ) - ) -} - -; Fixed size matrix (ColMajor and RowMajor support) -Eigen::Matrix<*,*,*,*,*,*>{ - children - ( - #( - [internals]: [$c,!], - rows: $c.RowsAtCompileTime, - cols: $c.ColsAtCompileTime, - ; Check for RowMajorBit - #if ($c.Flags & 0x1) ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data.array)[($i % $c.RowsAtCompileTime)*$c.ColsAtCompileTime + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)], - size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime - ) - ) #else ( - #array( - rank: 2, - base: 0, - expr: ($c.m_storage.m_data.array)[$i], - size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime - ) - ) - ) - ) - - preview - ( - #( - "[", - $c.RowsAtCompileTime, - ",", - $c.ColsAtCompileTime, - "](", - #array( - expr : [($c.m_storage.m_data.array)[$i],g], - size : $c.RowsAtCompileTime*$c.ColsAtCompileTime - ), - ")" - ) - ) -} +; *************************************************************** +; * Eigen Visualizer +; * +; * Author: Hauke Heibel +; * +; * Support the enhanced debugging of the following Eigen +; * types (*: any, +:fixed dimension) : +; * +; * - Eigen::Matrix<*,4,1,*,*,*> and Eigen::Matrix<*,1,4,*,*,*> +; * - Eigen::Matrix<*,3,1,*,*,*> and Eigen::Matrix<*,1,3,*,*,*> +; * - Eigen::Matrix<*,2,1,*,*,*> and Eigen::Matrix<*,1,2,*,*,*> +; * - Eigen::Matrix<*,-1,-1,*,*,*> +; * - Eigen::Matrix<*,+,-1,*,*,*> +; * - Eigen::Matrix<*,-1,+,*,*,*> +; * - Eigen::Matrix<*,+,+,*,*,*> +; * +; * Matrices are displayed properly independantly of the memory +; * alignment (RowMajor vs. ColMajor). +; * +; * This file is distributed WITHOUT ANY WARRANTY. Please ensure +; * that your original autoexp.dat file is copied to a safe +; * place before proceeding with its modification. +; *************************************************************** + +[Visualizer] + +; Fixed size 4-vectors +Eigen::Matrix<*,4,1,*,*,*>|Eigen::Matrix<*,1,4,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + x : ($c.m_storage.m_data.array)[0], + y : ($c.m_storage.m_data.array)[1], + z : ($c.m_storage.m_data.array)[2], + w : ($c.m_storage.m_data.array)[3] + ) + ) + + preview + ( + #( + "[", + 4, + "](", + #array(expr: $e.m_storage.m_data.array[$i], size: 4), + ")" + ) + ) +} + +; Fixed size 3-vectors +Eigen::Matrix<*,3,1,*,*,*>|Eigen::Matrix<*,1,3,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + x : ($c.m_storage.m_data.array)[0], + y : ($c.m_storage.m_data.array)[1], + z : ($c.m_storage.m_data.array)[2] + ) + ) + + preview + ( + #( + "[", + 3, + "](", + #array(expr: $e.m_storage.m_data.array[$i], size: 3), + ")" + ) + ) +} + +; Fixed size 2-vectors +Eigen::Matrix<*,2,1,*,*,*>|Eigen::Matrix<*,1,2,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + x : ($c.m_storage.m_data.array)[0], + y : ($c.m_storage.m_data.array)[1] + ) + ) + + preview + ( + #( + "[", + 2, + "](", + #array(expr: $e.m_storage.m_data.array[$i], size: 2), + ")" + ) + ) +} + +; Fixed size 1-vectors +Eigen::Matrix<*,1,1,*,*,*>|Eigen::Matrix<*,1,1,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + x : ($c.m_storage.m_data.array)[0] + ) + ) + + preview + ( + #( + "[", + 1, + "](", + #array(expr: $e.m_storage.m_data.array[$i], size: 1), + ")" + ) + ) +} + +; Dynamic matrices (ColMajor and RowMajor support) +Eigen::Matrix<*,-1,-1,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + rows: $c.m_storage.m_rows, + cols: $c.m_storage.m_cols, + ; Check for RowMajorBit + #if ($c.Flags & 0x1) ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.m_storage.m_cols + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)], + size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols + ) + ) #else ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data)[$i], + size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols + ) + ) + ) + ) + + preview + ( + #( + "[", + $c.m_storage.m_rows, + ",", + $c.m_storage.m_cols, + "](", + #array( + expr : [($c.m_storage.m_data)[$i],g], + size : $c.m_storage.m_rows*$c.m_storage.m_cols + ), + ")" + ) + ) +} + +; Fixed rows, dynamic columns matrix (ColMajor and RowMajor support) +Eigen::Matrix<*,*,-1,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + rows: $c.RowsAtCompileTime, + cols: $c.m_storage.m_cols, + ; Check for RowMajorBit + #if ($c.Flags & 0x1) ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data)[($i % $c.RowsAtCompileTime)*$c.m_storage.m_cols + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)], + size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols + ) + ) #else ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data)[$i], + size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols + ) + ) + ) + ) + + preview + ( + #( + "[", + $c.RowsAtCompileTime, + ",", + $c.m_storage.m_cols, + "](", + #array( + expr : [($c.m_storage.m_data)[$i],g], + size : $c.RowsAtCompileTime*$c.m_storage.m_cols + ), + ")" + ) + ) +} + +; Dynamic rows, fixed columns matrix (ColMajor and RowMajor support) +Eigen::Matrix<*,-1,*,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + rows: $c.m_storage.m_rows, + cols: $c.ColsAtCompileTime, + ; Check for RowMajorBit + #if ($c.Flags & 0x1) ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.ColsAtCompileTime + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)], + size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime + ) + ) #else ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data)[$i], + size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime + ) + ) + ) + ) + + preview + ( + #( + "[", + $c.m_storage.m_rows, + ",", + $c.ColsAtCompileTime, + "](", + #array( + expr : [($c.m_storage.m_data)[$i],g], + size : $c.m_storage.m_rows*$c.ColsAtCompileTime + ), + ")" + ) + ) +} + +; Fixed size matrix (ColMajor and RowMajor support) +Eigen::Matrix<*,*,*,*,*,*>{ + children + ( + #( + [internals]: [$c,!], + rows: $c.RowsAtCompileTime, + cols: $c.ColsAtCompileTime, + ; Check for RowMajorBit + #if ($c.Flags & 0x1) ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data.array)[($i % $c.RowsAtCompileTime)*$c.ColsAtCompileTime + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)], + size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime + ) + ) #else ( + #array( + rank: 2, + base: 0, + expr: ($c.m_storage.m_data.array)[$i], + size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime + ) + ) + ) + ) + + preview + ( + #( + "[", + $c.RowsAtCompileTime, + ",", + $c.ColsAtCompileTime, + "](", + #array( + expr : [($c.m_storage.m_data.array)[$i],g], + size : $c.RowsAtCompileTime*$c.ColsAtCompileTime + ), + ")" + ) + ) +} diff --git a/gtsam/3rdparty/Eigen/doc/C00_QuickStartGuide.dox b/gtsam/3rdparty/Eigen/doc/C00_QuickStartGuide.dox index ad772b2e1..8534cb0c3 100644 --- a/gtsam/3rdparty/Eigen/doc/C00_QuickStartGuide.dox +++ b/gtsam/3rdparty/Eigen/doc/C00_QuickStartGuide.dox @@ -25,6 +25,10 @@ There is no library to link to. The only thing that you need to keep in mind whe \code g++ -I /path/to/eigen/ my_program.cpp -o my_program \endcode +On Linux or Mac OS X, another option is to symlink or copy the Eigen folder into /usr/local/include/. This way, you can compile the program with: + +\code g++ my_program.cpp -o my_program \endcode + When you run the program, it produces the following output: \include QuickStart_example.out diff --git a/gtsam/3rdparty/Eigen/doc/C06_TutorialLinearAlgebra.dox b/gtsam/3rdparty/Eigen/doc/C06_TutorialLinearAlgebra.dox index 77f13f4a0..e8b3b7953 100644 --- a/gtsam/3rdparty/Eigen/doc/C06_TutorialLinearAlgebra.dox +++ b/gtsam/3rdparty/Eigen/doc/C06_TutorialLinearAlgebra.dox @@ -144,6 +144,9 @@ You need an eigendecomposition here, see available such decompositions on \ref T Make sure to check if your matrix is self-adjoint, as is often the case in these problems. Here's an example using SelfAdjointEigenSolver, it could easily be adapted to general matrices using EigenSolver or ComplexEigenSolver. +The computation of eigenvalues and eigenvectors does not necessarily converge, but such failure to converge is +very rare. The call to info() is to check for this possibility. + diff --git a/gtsam/3rdparty/Eigen/doc/C07_TutorialReductionsVisitorsBroadcasting.dox b/gtsam/3rdparty/Eigen/doc/C07_TutorialReductionsVisitorsBroadcasting.dox index e58ff6e2c..f3879b8b9 100644 --- a/gtsam/3rdparty/Eigen/doc/C07_TutorialReductionsVisitorsBroadcasting.dox +++ b/gtsam/3rdparty/Eigen/doc/C07_TutorialReductionsVisitorsBroadcasting.dox @@ -191,12 +191,27 @@ This can be accomplished with: \verbinclude Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.out
Example:Output:
+We can interpret the instruction mat.colwise() += v in two equivalent ways. It adds the vector \c v +to every column of the matrix. Alternatively, it can be interpreted as repeating the vector \c v four times to +form a four-by-two matrix which is then added to \c mat: +\f[ +\begin{bmatrix} 1 & 2 & 6 & 9 \\ 3 & 1 & 7 & 2 \end{bmatrix} ++ \begin{bmatrix} 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} += \begin{bmatrix} 1 & 2 & 6 & 9 \\ 4 & 2 & 8 & 3 \end{bmatrix}. +\f] +The operators -=, + and - can also be used column-wise and row-wise. On arrays, we +can also use the operators *=, /=, * and / to perform coefficient-wise +multiplication and division column-wise or row-wise. These operators are not available on matrices because it +is not clear what they would do. If you want multiply column 0 of a matrix \c mat with \c v(0), column 1 with +\c v(1), and so on, then use mat = mat * v.asDiagonal(). + It is important to point out that the vector to be added column-wise or row-wise must be of type Vector, and cannot be a Matrix. If this is not met then you will get compile-time error. This also means that broadcasting operations can only be applied with an object of type Vector, when operating with Matrix. -The same applies for the Array class, where the equivalent for VectorXf is ArrayXf. +The same applies for the Array class, where the equivalent for VectorXf is ArrayXf. As always, you should +not mix arrays and matrices in the same expression. -Therefore, to perform the same operation row-wise we can do: +To perform the same operation row-wise we can do: diff --git a/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox b/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox index 452abda10..b9e9eba12 100644 --- a/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox +++ b/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox @@ -45,16 +45,17 @@ But note that unfortunately, because of how C++ works, you can \b not do this: Rotation2D rot2(angle_in_radian);\endcode +AngleAxis aa(angle_in_radian, Vector3f(ax,ay,az));\endcode +The axis vector must be normalized. +Scaling(sx, sy) +Scaling(sx, sy, sz) +Scaling(s) +Scaling(vecN)\endcode +Transform t = Translation3f(p) * AngleAxisf(a,axis) * Scaling(s);\endcode +Matrix t = Rotation2Df(a) * Scaling(s); +Matrix t = AngleAxisf(a,axis) * Scaling(s);\endcode
Example:Output:
3D rotation as an \ref AngleAxis "angle + axis"\code -AngleAxis aa(angle_in_radian, Vector3f(ax,ay,az));\endcode
3D rotation as a \ref Quaternion "quaternion"\code Quaternion q; q = AngleAxis(angle_in_radian, axis);\endcode
N-D Scaling\code -Scaling(sx, sy) -Scaling(sx, sy, sz) -Scaling(s) -Scaling(vecN)\endcode
N-D Translation\code Translation(tx, ty) @@ -64,13 +65,13 @@ Translation(vecN)\endcode
N-D \ref TutorialGeoTransform "Affine transformation"\code Transform t = concatenation_of_any_transformations; -Transform t = Translation3f(p) * AngleAxisf(a,axis) * Scaling3f(s);\endcode
N-D Linear transformations \n (pure rotations, \n scaling, etc.)\code Matrix t = concatenation_of_rotations_and_scalings; -Matrix t = Rotation2Df(a) * Scaling2f(s); -Matrix t = AngleAxisf(a,axis) * Scaling3f(s);\endcode
Notes on rotations\n To transform more than a single vector the preferred @@ -92,8 +93,8 @@ Rotation2Df r; r = Matrix2f(..); // assumes a pure rotation matrix AngleAxisf aa; aa = Quaternionf(..); AngleAxisf aa; aa = Matrix3f(..); // assumes a pure rotation matrix Matrix2f m; m = Rotation2Df(..); -Matrix3f m; m = Quaternionf(..); Matrix3f m; m = Scaling3f(..); -Affine3f m; m = AngleAxis3f(..); Affine3f m; m = Scaling3f(..); +Matrix3f m; m = Quaternionf(..); Matrix3f m; m = Scaling(..); +Affine3f m; m = AngleAxis3f(..); Affine3f m; m = Scaling(..); Affine3f m; m = Translation3f(..); Affine3f m; m = Matrix3f(..); \endcode
@@ -207,10 +208,10 @@ t.scale(s); t.prescale(Vector_(sx,sy,..)); t.prescale(s); \endcode\code -t *= Scaling_(sx,sy,..); -t *= Scaling_(s); -t = Scaling_(sx,sy,..) * t; -t = Scaling_(s) * t; +t *= Scaling(sx,sy,..); +t *= Scaling(s); +t = Scaling(sx,sy,..) * t; +t = Scaling(s) * t; \endcode Shear transformation \n ( \b 2D \b only ! )\code t.shear(sx,sy); @@ -224,7 +225,7 @@ Note that in both API, any many transformations can be concatenated in a single t.pretranslate(..).rotate(..).translate(..).scale(..); \endcode \code -t = Translation_(..) * t * RotationType(..) * Translation_(..) * Scaling_(..); +t = Translation_(..) * t * RotationType(..) * Translation_(..) * Scaling(..); \endcode diff --git a/gtsam/3rdparty/Eigen/doc/C09_TutorialSparse.dox b/gtsam/3rdparty/Eigen/doc/C09_TutorialSparse.dox index 737f4cc09..34154bd0d 100644 --- a/gtsam/3rdparty/Eigen/doc/C09_TutorialSparse.dox +++ b/gtsam/3rdparty/Eigen/doc/C09_TutorialSparse.dox @@ -8,82 +8,144 @@ namespace Eigen { \b Table \b of \b contents \n - \ref TutorialSparseIntro + - \ref TutorialSparseExample "Example" + - \ref TutorialSparseSparseMatrix - \ref TutorialSparseFilling - - \ref TutorialSparseFeatureSet - \ref TutorialSparseDirectSolvers + - \ref TutorialSparseFeatureSet + - \ref TutorialSparse_BasicOps + - \ref TutorialSparse_Products + - \ref TutorialSparse_TriangularSelfadjoint + - \ref TutorialSparse_Submat + +
-\section TutorialSparseIntro Sparse matrix representations +Manipulating and solving sparse problems involves various modules which are summarized below: -In many applications (e.g., finite element methods) it is common to deal with very large matrices where only a few coefficients are different than zero. Both in term of memory consumption and performance, it is fundamental to use an adequate representation storing only nonzero coefficients. Such a matrix is called a sparse matrix. - -\b Declaring \b sparse \b matrices \b and \b vectors \n -The SparseMatrix class is the main sparse matrix representation of the Eigen's sparse module which offers high performance, low memory usage, and compatibility with most of sparse linear algebra packages. Because of its limited flexibility, we also provide a DynamicSparseMatrix variante taillored for low-level sparse matrix assembly. Both of them can be either row major or column major: - -\code -#include -SparseMatrix > m1(1000,2000); // declare a 1000x2000 col-major compressed sparse matrix of complex -SparseMatrix m2(1000,2000); // declare a 1000x2000 row-major compressed sparse matrix of double -DynamicSparseMatrix > m1(1000,2000); // declare a 1000x2000 col-major dynamic sparse matrix of complex -DynamicSparseMatrix m2(1000,2000); // declare a 1000x2000 row-major dynamic sparse matrix of double -\endcode - -Although a sparse matrix could also be used to represent a sparse vector, for that purpose it is better to use the specialized SparseVector class: -\code -SparseVector > v1(1000); // declare a column sparse vector of complex of size 1000 -SparseVector v2(1000); // declare a row sparse vector of double of size 1000 -\endcode -Note that here the size of a vector denotes its dimension and not the number of nonzero coefficients which is initially zero (like sparse matrices). - - -\b Overview \b of \b the \b internal \b sparse \b storage \n -In order to get the best of the Eigen's sparse objects, it is important to have a rough idea of the way they are internally stored. The SparseMatrix class implements the common and generic Compressed Column/Row Storage scheme. It consists of three compact arrays storing the values with their respective inner coordinates, and pointer indices to the begining of each outer vector. For instance, let \c m be a column-major sparse matrix. Then its nonzero coefficients are sequentially stored in memory in a column-major order (\em values). A second array of integer stores the respective row index of each coefficient (\em inner \em indices). Finally, a third array of integer, having the same length than the number of columns, stores the index in the previous arrays of the first element of each column (\em outer \em indices). - -Here is an example, with the matrix: - - - - - + + + + +
03000
2200017
75010
00000
001408
ModuleHeader fileContents
\link Sparse_Module SparseCore \endlink\code#include \endcodeSparseMatrix and SparseVector classes, matrix assembly, basic sparse linear algebra (including sparse triangular solvers)
\link SparseCholesky_Module SparseCholesky \endlink\code#include \endcodeDirect sparse LLT and LDLT Cholesky factorization to solve sparse self-adjoint positive definite problems
\link IterativeLinearSolvers_Module IterativeLinearSolvers \endlink\code#include \endcodeIterative solvers to solve large general linear square problems (including self-adjoint positive definite problems)
\code#include \endcodeIncludes all the above modules
-and its internal representation using the Compressed Column Storage format: +\section TutorialSparseIntro Sparse matrix representation + +In many applications (e.g., finite element methods) it is common to deal with very large matrices where only a few coefficients are different from zero. In such cases, memory consumption can be reduced and performance increased by using a specialized representation storing only the nonzero coefficients. Such a matrix is called a sparse matrix. + +\b The \b %SparseMatrix \b class + +The class SparseMatrix is the main sparse matrix representation of Eigen's sparse module; it offers high performance and low memory usage. +It implements a more versatile variant of the widely-used Compressed Column (or Row) Storage scheme. +It consists of four compact arrays: + - \c Values: stores the coefficient values of the non-zeros. + - \c InnerIndices: stores the row (resp. column) indices of the non-zeros. + - \c OuterStarts: stores for each column (resp. row) the index of the first non-zero in the previous two arrays. + - \c InnerNNZs: stores the number of non-zeros of each column (resp. row). +The word \c inner refers to an \em inner \em vector that is a column for a column-major matrix, or a row for a row-major matrix. +The word \c outer refers to the other direction. + +This storage scheme is better explained on an example. The following matrix + + + + + + +
03 00 0
220 0017
75 01 0
00 00 0
00140 8
+ +and one of its possible sparse, \b column \b major representation: + + + +
Values: 227_3514__1_178
InnerIndices: 12_02 4__2_ 14
+ + + +
OuterStarts:035810\em 12
InnerNNZs: 2211 2
+ +Currently the elements of a given inner vector are guaranteed to be always sorted by increasing inner indices. +The \c "_" indicates available free space to quickly insert new elements. +Assuming no reallocation is needed, the insertion of a random element is therefore in O(nnz_j) where nnz_j is the number of nonzeros of the respective inner vector. +On the other hand, inserting elements with increasing inner indices in a given inner vector is much more efficient since this only requires to increase the respective \c InnerNNZs entry that is a O(1) operation. + +The case where no empty space is available is a special case, and is refered as the \em compressed mode. +It corresponds to the widely used Compressed Column (or Row) Storage schemes (CCS or CRS). +Any SparseMatrix can be turned to this form by calling the SparseMatrix::makeCompressed() function. +In this case, one can remark that the \c InnerNNZs array is redundant with \c OuterStarts because we the equality: \c InnerNNZs[j] = \c OuterStarts[j+1]-\c OuterStarts[j]. +Therefore, in practice a call to SparseMatrix::makeCompressed() frees this buffer. + +It is worth noting that most of our wrappers to external libraries requires compressed matrices as inputs. + +The results of %Eigen's operations always produces \b compressed sparse matrices. +On the other hand, the insertion of a new element into a SparseMatrix converts this later to the \b uncompressed mode. + +Here is the previous matrix represented in compressed mode: - + +
Values: 22735141178
Inner indices: 1202 42 14
InnerIndices: 1202 42 14
+ +
OuterStarts:02456\em 8
-Outer indices:
02456\em 7
-As you might guess, here the storage order is even more important than with dense matrices. We will therefore often make a clear difference between the \em inner and \em outer dimensions. For instance, it is efficient to loop over the coefficients of an \em inner \em vector (e.g., a column of a column-major matrix), but completely inefficient to do the same for an \em outer \em vector (e.g., a row of a column-major matrix). +A SparseVector is a special case of a SparseMatrix where only the \c Values and \c InnerIndices arrays are stored. +There is no notion of compressed/uncompressed mode for a SparseVector. -The SparseVector class implements the same compressed storage scheme but, of course, without any outer index buffer. -Since all nonzero coefficients of such a matrix are sequentially stored in memory, inserting a new nonzero near the "beginning" of the matrix can be extremely costly. As described below (\ref TutorialSparseFilling), one strategy is to fill nonzero coefficients in order. In cases where this is not possible, Eigen's sparse module also provides a DynamicSparseMatrix class which allows efficient random insertion. DynamicSparseMatrix is essentially implemented as an array of SparseVector, where the values and inner-indices arrays have been split into multiple small and resizable arrays. Assuming the number of nonzeros per inner vector is relatively small, this modification allows for very fast random insertion at the cost of a slight memory overhead (due to extra memory preallocated by each inner vector to avoid an expensive memory reallocation at every insertion) and a loss of compatibility with other sparse libraries used by some of our high-level solvers. Once complete, a DynamicSparseMatrix can be converted to a SparseMatrix to permit usage of these sparse libraries. +\section TutorialSparseExample First example -To summarize, it is recommended to use SparseMatrix whenever possible, and reserve the use of DynamicSparseMatrix to assemble a sparse matrix in cases when a SparseMatrix is not flexible enough. The respective pros/cons of both representations are summarized in the following table: +Before describing each individual class, let's start with the following typical example: solving the Lapace equation \f$ \nabla u = 0 \f$ on a regular 2D grid using a finite difference scheme and Dirichlet boundary conditions. +Such problem can be mathematically expressed as a linear problem of the form \f$ Ax=b \f$ where \f$ x \f$ is the vector of \c m unknowns (in our case, the values of the pixels), \f$ b \f$ is the right hand side vector resulting from the boundary conditions, and \f$ A \f$ is an \f$ m \times m \f$ matrix containing only a few non-zero elements resulting from the discretization of the Laplacian operator. - - - - - - - - - - - - - -
SparseMatrixDynamicSparseMatrix
memory efficiency*****
sorted insertion******
random insertion \n in sorted inner vector****
sorted insertion \n in random inner vector-***
random insertion-**
coeff wise unary operators******
coeff wise binary operators******
matrix products*****(*)
transpose*****
redux*****
*= scalar*****
Compatibility with highlevel solvers \n (TAUCS, Cholmod, SuperLU, UmfPack)***-
+ +\include Tutorial_sparse_example.cpp + + +\image html Tutorial_sparse_example.jpeg + + +In this example, we start by defining a column-major sparse matrix type of double \c SparseMatrix, and a triplet list of the same scalar type \c Triplet. A triplet is a simple object representing a non-zero entry as the triplet: \c row index, \c column index, \c value. + +In the main function, we declare a list \c coefficients of triplets (as a std vector) and the right hand side vector \f$ b \f$ which are filled by the \a buildProblem function. +The raw and flat list of non-zero entries is then converted to a true SparseMatrix object \c A. +Note that the elements of the list do not have to be sorted, and possible duplicate entries will be summed up. + +The last step consists of effectively solving the assembled problem. +Since the resulting matrix \c A is symmetric by construction, we can perform a direct Cholesky factorization via the SimplicialLDLT class which behaves like its LDLT counterpart for dense objects. + +The resulting vector \c x contains the pixel values as a 1D array which is saved to a jpeg file shown on the right of the code above. + +Describing the \a buildProblem and \a save functions is out of the scope of this tutorial. They are given \ref TutorialSparse_example_details "here" for the curious and reproducibility purpose. -\b Matrix \b and \b vector \b properties \n -Here mat and vec represent any sparse-matrix and sparse-vector type, respectively. +\section TutorialSparseSparseMatrix The SparseMatrix class + +\b %Matrix \b and \b vector \b properties \n + +The SparseMatrix and SparseVector classes take three template arguments: + * the scalar type (e.g., double) + * the storage order (ColMajor or RowMajor, the default is RowMajor) + * the inner index type (default is \c int). + +As for dense Matrix objects, constructors takes the size of the object. +Here are some examples: + +\code +SparseMatrix > mat(1000,2000); // declares a 1000x2000 column-major compressed sparse matrix of complex +SparseMatrix mat(1000,2000); // declares a 1000x2000 row-major compressed sparse matrix of double +SparseVector > vec(1000); // declares a column sparse vector of complex of size 1000 +SparseVector vec(1000); // declares a row sparse vector of double of size 1000 +\endcode + +In the rest of the tutorial, \c mat and \c vec represent any sparse-matrix and sparse-vector objects, respectively. + +The dimensions of a matrix can be queried using the following functions: \b Iterating \b over \b the \b nonzero \b coefficients \n -Iterating over the coefficients of a sparse matrix can be done only in the same order as the storage order. Here is an example: +Random access to the elements of a sparse object can be done through the \c coeffRef(i,j) function. +However, this function involves a quite expensive binary search. +In most cases, one only wants to iterate over the non-zeros elements. This is achieved by a standard loop over the outer dimension, and then by iterating over the non-zeros of the current inner vector via an InnerIterator. Thus, the non-zero entries have to be visited in the same order than the storage order. +Here is an example:
Standard \n dimensions\code mat.rows() @@ -105,13 +167,16 @@ vec.nonZeros() \endcode
\code -SparseMatrixType mat(rows,cols); -for (int k=0; k mat(rows,cols); +for (int k=0; k::InnerIterator it(mat,k); it; ++it) { it.value(); it.row(); // row index @@ -130,129 +195,258 @@ for (SparseVector::InnerIterator it(vec); it; ++it) \endcode
+For a writable expression, the referenced value can be modified using the valueRef() function. +If the type of the sparse matrix or vector depends on a template parameter, then the \c typename keyword is +required to indicate that \c InnerIterator denotes a type; see \ref TopicTemplateKeyword for details. \section TutorialSparseFilling Filling a sparse matrix -Owing to the special storage scheme of a SparseMatrix, it is obvious that for performance reasons a sparse matrix cannot be filled as easily as a dense matrix. For instance the cost of a purely random insertion into a SparseMatrix is in O(nnz) where nnz is the current number of non zeros. In order to cover all uses cases with best efficiency, Eigen provides various mechanisms, from the easiest but slowest, to the fastest but restrictive one. +Because of the special storage scheme of a SparseMatrix, special care has to be taken when adding new nonzero entries. +For instance, the cost of a single purely random insertion into a SparseMatrix is \c O(nnz), where \c nnz is the current number of non-zero coefficients. -If you don't have any prior knowledge about the order your matrix will be filled, then the best choice is to use a DynamicSparseMatrix. With a DynamicSparseMatrix, you can add or modify any coefficients at any time using the coeffRef(row,col) method. Here is an example: +The simplest way to create a sparse matrix while guaranteeing good performance is thus to first build a list of so-called \em triplets, and then convert it to a SparseMatrix. + +Here is a typical usage example: \code -DynamicSparseMatrix aux(1000,1000); -aux.reserve(estimated_number_of_non_zero); // optional -for (...) - for each j // the j can be random - for each i interacting with j // the i can be random - aux.coeffRef(i,j) += foo(i,j); -\endcode -Then the DynamicSparseMatrix object can be converted to a compact SparseMatrix to be used, e.g., by one of our supported solver: -\code -SparseMatrix mat(aux); -\endcode - -In order to optimize this process, instead of the generic coeffRef(i,j) method one can also use: - - \code m.insert(i,j) = value; \endcode which assumes the coefficient of coordinate (row,col) does not already exist (otherwise this is a programming error and your program will stop). - - \code m.insertBack(i,j) = value; \endcode which, in addition to the requirements of insert(), also assumes that the coefficient of coordinate (row,col) will be inserted at the end of the target inner-vector. More precisely, if the matrix m is column major, then the row index of the last non zero coefficient of the j-th column must be smaller than i. - - -Actually, the SparseMatrix class also supports random insertion via the insert() method. However, its uses should be reserved in cases where the inserted non zero is nearly the last one of the compact storage array. In practice, this means it should be used only to perform random (or sorted) insertion into the current inner-vector while filling the inner-vectors in an increasing order. Moreover, with a SparseMatrix an insertion session must be closed by a call to finalize() before any use of the matrix. Here is an example for a column major matrix: - -\code -SparseMatrix mat(1000,1000); -mat.reserve(estimated_number_of_non_zero); // optional -for each j // should be in increasing order for performance reasons - for each i interacting with j // the i can be random - mat.insert(i,j) = foo(i,j); // optional for a DynamicSparseMatrix -mat.finalize(); -\endcode - -Finally, the fastest way to fill a SparseMatrix object is to insert the elements in a purely coherence order (increasing inner index per increasing outer index). To this end, Eigen provides a very low but optimal API and illustrated below: - -\code -SparseMatrix mat(1000,1000); -mat.reserve(estimated_number_of_non_zero); // optional -for(int j=0; j<1000; ++j) +typedef Eigen::Triplet T; +std::vector tripletList; +triplets.reserve(estimation_of_entries); +for(...) { - mat.startVec(j); // optional for a DynamicSparseMatrix - for each i interacting with j // with increasing i - mat.insertBack(i,j) = foo(i,j); + // ... + tripletList.push_back(T(i,j,v_ij)); } -mat.finalize(); // optional for a DynamicSparseMatrix +SparseMatrixType mat(rows,cols); +mat.setFromTriplets(tripletList.begin(), tripletList.end()); +// mat is ready to go! \endcode -Note that there also exist the insertBackByOuterInner(Index outer, Index, inner) function which allows to write code agnostic to the storage order. +The \c std::vector of triplets might contain the elements in arbitrary order, and might even contain duplicated elements that will be summed up by setFromTriplets(). +See the SparseMatrix::setFromTriplets() function and class Triplet for more details. -\section TutorialSparseFeatureSet Supported operators and functions -In the following \em sm denote a sparse matrix, \em sv a sparse vector, \em dm a dense matrix, and \em dv a dense vector. -In Eigen's sparse module we chose to expose only the subset of the dense matrix API which can be efficiently implemented. Moreover, all combinations are not always possible. For instance, it is not possible to add two sparse matrices having two different storage order. On the other hand it is perfectly fine to evaluate a sparse matrix/expression to a matrix having a different storage order: +In some cases, however, slightly higher performance, and lower memory consumption can be reached by directly inserting the non-zeros into the destination matrix. +A typical scenario of this approach is illustrated bellow: \code -SparseMatrixType sm1, sm2, sm3; -sm3 = sm1.transpose() + sm2; // invalid -sm3 = SparseMatrixType(sm1.transpose()) + sm2; // correct +1: SparseMatrix mat(rows,cols); // default is column major +2: mat.reserve(VectorXi::Constant(cols,6)); +3: for each i,j such that v_ij != 0 +4: mat.insert(i,j) = v_ij; // alternative: mat.coeffRef(i,j) += v_ij; +5: mat.makeCompressed(); // optional \endcode -Here are some examples of the supported operations: +- The key ingredient here is the line 2 where we reserve room for 6 non-zeros per column. In many cases, the number of non-zeros per column or row can easily be known in advance. If it varies significantly for each inner vector, then it is possible to specify a reserve size for each inner vector by providing a vector object with an operator[](int j) returning the reserve size of the \c j-th inner vector (e.g., via a VectorXi or std::vector). If only a rought estimate of the number of nonzeros per inner-vector can be obtained, it is highly recommended to overestimate it rather than the opposite. If this line is omitted, then the first insertion of a new element will reserve room for 2 elements per inner vector. +- The line 4 performs a sorted insertion. In this example, the ideal case is when the \c j-th column is not full and contains non-zeros whose inner-indices are smaller than \c i. In this case, this operation boils down to trivial O(1) operation. +- When calling insert(i,j) the element \c i \c ,j must not already exists, otherwise use the coeffRef(i,j) method that will allow to, e.g., accumulate values. This method first performs a binary search and finally calls insert(i,j) if the element does not already exist. It is more flexible than insert() but also more costly. +- The line 5 suppresses the remaining empty space and transforms the matrix into a compressed column storage. + + +\section TutorialSparseDirectSolvers Solving linear problems + +%Eigen currently provides a limited set of built-in solvers, as well as wrappers to external solver libraries. +They are summarized in the following table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassModuleSolver kindMatrix kindFeatures related to performanceDependencies,License

Notes

SimplicialLLT \link SparseCholesky_Module SparseCholesky \endlinkDirect LLt factorizationSPDFill-in reducingbuilt-in, LGPLSimplicialLDLT is often preferable
SimplicialLDLT \link SparseCholesky_Module SparseCholesky \endlinkDirect LDLt factorizationSPDFill-in reducingbuilt-in, LGPLRecommended for very sparse and not too large problems (e.g., 2D Poisson eq.)
ConjugateGradient\link IterativeLinearSolvers_Module IterativeLinearSolvers \endlinkClassic iterative CGSPDPreconditionningbuilt-in, LGPLRecommended for large symmetric problems (e.g., 3D Poisson eq.)
BiCGSTAB\link IterativeLinearSolvers_Module IterativeLinearSolvers \endlinkIterative stabilized bi-conjugate gradientSquarePreconditionningbuilt-in, LGPLMight not always converge
PastixLLT \n PastixLDLT \n PastixLU\link PaStiXSupport_Module PaStiXSupport \endlinkDirect LLt, LDLt, LU factorizationsSPD \n SPD \n SquareFill-in reducing, Leverage fast dense algebra, MultithreadingRequires the PaStiX package, \b CeCILL-C optimized for tough problems and symmetric patterns
CholmodSupernodalLLT\link CholmodSupport_Module CholmodSupport \endlinkDirect LLt factorizationSPDFill-in reducing, Leverage fast dense algebraRequires the SuiteSparse package, \b GPL
UmfPackLU\link UmfPackSupport_Module UmfPackSupport \endlinkDirect LU factorizationSquareFill-in reducing, Leverage fast dense algebraRequires the SuiteSparse package, \b GPL
SuperLU\link SuperLUSupport_Module SuperLUSupport \endlinkDirect LU factorizationSquareFill-in reducing, Leverage fast dense algebraRequires the SuperLU library, (BSD-like)
+ +Here \c SPD means symmetric positive definite. + +All these solvers follow the same general concept. +Here is a typical and general example: \code -s_1 *= 0.5; -sm4 = sm1 + sm2 + sm3; // only if s_1, s_2 and s_3 have the same storage order -sm3 = sm1 * sm2; -dv3 = sm1 * dv2; -dm3 = sm1 * dm2; -dm3 = dm2 * sm1; -sm3 = sm1.cwiseProduct(sm2); // only if s_1 and s_2 have the same storage order -dv2 = sm1.triangularView().solve(dv2); -\endcode - -The product of a sparse matrix A by a dense matrix/vector dv with A symmetric can be optimized by telling that to Eigen: -\code -res = A.selfadjointView<>() * dv; // if all coefficients of A are stored -res = A.selfadjointView() * dv; // if only the upper part of A is stored -res = A.selfadjointView() * dv; // if only the lower part of A is stored -\endcode - - -\section TutorialSparseDirectSolvers Using the direct solvers - -To solve a sparse problem you currently have to use one or multiple of the following "unsupported" module: -- \ref SparseExtra_Module - - \b solvers: SparseLLT, SparseLDLT (\#include ) - - \b notes: built-in basic LLT and LDLT solvers -- \ref CholmodSupport_Module - - \b solver: SparseLLT (\#include ) - - \b notes: LLT solving using Cholmod, requires a SparseMatrix object. (recommended for symmetric/selfadjoint problems) -- \ref UmfPackSupport_Module - - \b solver: SparseLU (\#include ) - - \b notes: LU solving using UmfPack, requires a SparseMatrix object (recommended for squared matrices) -- \ref SuperLUSupport_Module - - \b solver: SparseLU (\#include ) - - \b notes: (LU solving using SuperLU, requires a SparseMatrix object, recommended for squared matrices) -- \ref TaucsSupport_Module - - \b solver: SparseLLT (\#include ) - - \b notes: LLT solving using Taucs, requires a SparseMatrix object (not recommended) - -\warning Those modules are currently considered to be "unsupported" because 1) they are not documented, and 2) their API is likely to change in the future. - -Here is a typical example: -\code -#include +#include // ... SparseMatrix A; // fill A VectorXd b, x; // fill b -// solve Ax = b using UmfPack: -SparseLU,UmfPack> lu_of_A(A); -if(!lu_of_A.succeeded()) { - // decomposiiton failed +// solve Ax = b +SolverClassName > solver; +solver.compute(A); +if(solver.info()!=Succeeded) { + // decomposition failed return; } -if(!lu_of_A.solve(b,&x)) { +x = solver.solve(b); +if(solver.info()!=Succeeded) { // solving failed return; } +// solve for another right hand side: +x1 = solver.solve(b1); \endcode -See also the class SparseLLT, class SparseLU, and class SparseLDLT. +For \c SPD solvers, a second optional template argument allows to specify which triangular part have to be used, e.g.: + +\code +#include + +ConjugateGradient, Eigen::Upper> solver; +x = solver.compute(A).solve(b); +\endcode +In the above example, only the upper triangular part of the input matrix A is considered for solving. The opposite triangle might either be empty or contain arbitrary values. + +In the case where multiple problems with the same sparcity pattern have to be solved, then the "compute" step can be decomposed as follow: +\code +SolverClassName > solver; +solver.analyzePattern(A); // for this step the numerical values of A are not used +solver.factorize(A); +x1 = solver.solve(b1); +x2 = solver.solve(b2); +... +A = ...; // modify the values of the nonzeros of A, the nonzeros pattern must stay unchanged +solver.factorize(A); +x1 = solver.solve(b1); +x2 = solver.solve(b2); +... +\endcode +The compute() method is equivalent to calling both analyzePattern() and factorize(). + +Finally, each solver provides some specific features, such as determinant, access to the factors, controls of the iterations, and so on. +More details are availble in the documentations of the respective classes. + + +\section TutorialSparseFeatureSet Supported operators and functions + +Because of their special storage format, sparse matrices cannot offer the same level of flexbility than dense matrices. +In Eigen's sparse module we chose to expose only the subset of the dense matrix API which can be efficiently implemented. +In the following \em sm denotes a sparse matrix, \em sv a sparse vector, \em dm a dense matrix, and \em dv a dense vector. + +\subsection TutorialSparse_BasicOps Basic operations + +%Sparse expressions support most of the unary and binary coefficient wise operations: +\code +sm1.real() sm1.imag() -sm1 0.5*sm1 +sm1+sm2 sm1-sm2 sm1.cwiseProduct(sm2) +\endcode +However, a strong restriction is that the storage orders must match. For instance, in the following example: +\code +sm4 = sm1 + sm2 + sm3; +\endcode +sm1, sm2, and sm3 must all be row-major or all column major. +On the other hand, there is no restriction on the target matrix sm4. +For instance, this means that for computing \f$ A^T + A \f$, the matrix \f$ A^T \f$ must be evaluated into a temporary matrix of compatible storage order: +\code +SparseMatrix A, B; +B = SparseMatrix(A.transpose()) + A; +\endcode + +Binary coefficient wise operators can also mix sparse and dense expressions: +\code +sm2 = sm1.cwiseProduct(dm1); +dm2 = sm1 + dm1; +\endcode + + +%Sparse expressions also support transposition: +\code +sm1 = sm2.transpose(); +sm1 = sm2.adjoint(); +\endcode +However, there is no transposeInPlace() method. + + +\subsection TutorialSparse_Products Matrix products + +%Eigen supports various kind of sparse matrix products which are summarize below: + - \b sparse-dense: + \code +dv2 = sm1 * dv1; +dm2 = dm1 * sm1.adjoint(); +dm2 = 2. * sm1 * dm1; + \endcode + - \b symmetric \b sparse-dense. The product of a sparse symmetric matrix with a dense matrix (or vector) can also be optimized by specifying the symmetry with selfadjointView(): + \code +dm2 = sm1.selfadjointView<>() * dm1; // if all coefficients of A are stored +dm2 = A.selfadjointView() * dm1; // if only the upper part of A is stored +dm2 = A.selfadjointView() * dm1; // if only the lower part of A is stored + \endcode + - \b sparse-sparse. For sparse-sparse products, two different algorithms are available. The default one is conservative and preserve the explicit zeros that might appear: + \code +sm3 = sm1 * sm2; +sm3 = 4 * sm1.adjoint() * sm2; + \endcode + The second algorithm prunes on the fly the explicit zeros, or the values smaller than a given threshold. It is enabled and controlled through the prune() functions: + \code +sm3 = (sm1 * sm2).prune(); // removes numerical zeros +sm3 = (sm1 * sm2).prune(ref); // removes elements much smaller than ref +sm3 = (sm1 * sm2).prune(ref,epsilon); // removes elements smaller than ref*epsilon + \endcode + + - \b permutations. Finally, permutations can be applied to sparse matrices too: + \code +PermutationMatrix P = ...; +sm2 = P * sm1; +sm2 = sm1 * P.inverse(); +sm2 = sm1.transpose() * P; + \endcode + + +\subsection TutorialSparse_TriangularSelfadjoint Triangular and selfadjoint views + +Just as with dense matrices, the triangularView() function can be used to address a triangular part of the matrix, and perform triangular solves with a dense right hand side: +\code +dm2 = sm1.triangularView(dm1); +dv2 = sm1.transpose().triangularView(dv1); +\endcode + +The selfadjointView() function permits various operations: + - optimized sparse-dense matrix products: + \code +dm2 = sm1.selfadjointView<>() * dm1; // if all coefficients of A are stored +dm2 = A.selfadjointView() * dm1; // if only the upper part of A is stored +dm2 = A.selfadjointView() * dm1; // if only the lower part of A is stored + \endcode + - copy of triangular parts: + \code +sm2 = sm1.selfadjointView(); // makes a full selfadjoint matrix from the upper triangular part +sm2.selfadjointView() = sm1.selfadjointView(); // copies the upper triangular part to the lower triangular part + \endcode + - application of symmetric permutations: + \code +PermutationMatrix P = ...; +sm2 = A.selfadjointView().twistedBy(P); // compute P S P' from the upper triangular part of A, and make it a full matrix +sm2.selfadjointView() = A.selfadjointView().twistedBy(P); // compute P S P' from the lower triangular part of A, and then only compute the lower part + \endcode + +\subsection TutorialSparse_Submat Sub-matrices + +%Sparse matrices does not support yet the addressing of arbitrary sub matrices. Currently, one can only reference a set of contiguous \em inner vectors, i.e., a set of contiguous rows for a row-major matrix, or a set of contiguous columns for a column major matrix: +\code + sm1.innerVector(j); // returns an expression of the j-th column (resp. row) of the matrix if sm1 is col-major (resp. row-major) + sm1.innerVectors(j, nb); // returns an expression of the nb columns (resp. row) starting from the j-th column (resp. row) + // of the matrix if sm1 is col-major (resp. row-major) + sm1.middleRows(j, nb); // for row major matrices only, get a range of nb rows + sm1.middleCols(j, nb); // for column major matrices only, get a range of nb columns +\endcode \li \b Next: \ref TutorialMapClass diff --git a/gtsam/3rdparty/Eigen/doc/CMakeLists.txt b/gtsam/3rdparty/Eigen/doc/CMakeLists.txt index 50ce7ee0c..96bff41bf 100644 --- a/gtsam/3rdparty/Eigen/doc/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/doc/CMakeLists.txt @@ -36,6 +36,7 @@ set(snippets_targets "") add_definitions("-DEIGEN_MAKING_DOCS") add_subdirectory(examples) +add_subdirectory(special_examples) add_subdirectory(snippets) add_custom_target( diff --git a/gtsam/3rdparty/Eigen/doc/D09_StructHavingEigenMembers.dox b/gtsam/3rdparty/Eigen/doc/D09_StructHavingEigenMembers.dox index d6a24d951..51789ca9c 100644 --- a/gtsam/3rdparty/Eigen/doc/D09_StructHavingEigenMembers.dox +++ b/gtsam/3rdparty/Eigen/doc/D09_StructHavingEigenMembers.dox @@ -10,6 +10,7 @@ namespace Eigen { - \ref movetotop - \ref bugineigen - \ref conditional + - \ref othersolutions \section summary Executive Summary @@ -55,6 +56,8 @@ Foo *foo = new Foo; This macro makes "new Foo" always return an aligned pointer. +If this approach is too intrusive, see also the \ref othersolutions. + \section why Why is this needed? OK let's say that your code looks like this: @@ -132,6 +135,64 @@ Foo<4> *foo4 = new Foo<4>; // foo4 is guaranteed to be 128bit-aligned Foo<3> *foo3 = new Foo<3>; // foo3 has only the system default alignment guarantee \endcode + +\section othersolutions Other solutions + +In case putting the EIGEN_MAKE_ALIGNED_OPERATOR_NEW macro everywhere is too intrusive, there exists at least two other solutions. + +\subsection othersolutions1 Disabling alignment + +The first is to disable alignment requirement for the fixed size members: +\code +class Foo +{ + ... + Eigen::Matrix v; + ... +}; +\endcode +This has for effect to disable vectorization when using \c v. +If a function of Foo uses it several times, then it still possible to re-enable vectorization by copying it into an aligned temporary vector: +\code +void Foo::bar() +{ + Eigen::Vector2d av(v); + // use av instead of v + ... + // if av changed, then do: + v = av; +} +\endcode + +\subsection othersolutions2 Private structure + +The second consist in storing the fixed-size objects into a private struct which will be dynamically allocated at the construction time of the main object: + +\code +struct Foo_d +{ + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + Vector2d v; + ... +}; + + +struct Foo { + Foo() { init_d(); } + ~Foo() { delete d; } + void bar() + { + // use d->v instead of v + ... + } +private: + void init_d() { d = new Foo_d; } + Foo_d* d; +}; +\endcode + +The clear advantage here is that the class Foo remains unchanged regarding alignment issues. The drawback is that a heap allocation will be required whatsoever. + */ } diff --git a/gtsam/3rdparty/Eigen/doc/Doxyfile.in b/gtsam/3rdparty/Eigen/doc/Doxyfile.in index 6a659d9c2..e9e89d486 100644 --- a/gtsam/3rdparty/Eigen/doc/Doxyfile.in +++ b/gtsam/3rdparty/Eigen/doc/Doxyfile.in @@ -108,7 +108,7 @@ ALWAYS_DETAILED_SEC = NO # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. -INLINE_INHERITED_MEMB = NO +INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set @@ -206,7 +206,6 @@ ALIASES = "only_for_vectors=This is only for vectors (either row- "qr_module=This is defined in the %QR module. \code #include \endcode" \ "svd_module=This is defined in the %SVD module. \code #include \endcode" \ "label=\bug" \ - "redstar=
*" \ "matrixworld=*" \ "arrayworld=*" \ "note_about_arbitrary_choice_of_solution=If there exists more than one solution, this method will arbitrarily choose one." \ @@ -303,7 +302,7 @@ TYPEDEF_HIDES_STRUCT = NO # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES -EXTRACT_ALL = NO +EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. @@ -561,8 +560,7 @@ WARN_LOGFILE = # with spaces. INPUT = "${Eigen_SOURCE_DIR}/Eigen" \ - "${Eigen_SOURCE_DIR}/doc" \ - "${Eigen_BINARY_DIR}/doc" + "${Eigen_SOURCE_DIR}/doc" # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is @@ -585,13 +583,17 @@ FILE_PATTERNS = * # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = +EXCLUDE = "${Eigen_SOURCE_DIR}/Eigen/Eigen2Support" \ + "${Eigen_SOURCE_DIR}/Eigen/src/Eigen2Support" \ + "${Eigen_SOURCE_DIR}/doc/examples" \ + "${Eigen_SOURCE_DIR}/doc/special_examples" \ + "${Eigen_SOURCE_DIR}/doc/snippets" # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded @@ -627,10 +629,8 @@ EXCLUDE_PATTERNS = CMake* \ # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test -# This is used to clean up the "class hierarchy" page - -EXCLUDE_SYMBOLS = EigenBase<* SparseMatrixBase<* DenseBase<* MatrixBase<* Matrix<* \ - ProductReturnType<* RotationBase<* Stride<* BandMatrix<* Block<* +# This could used to clean up the "class hierarchy" page +EXCLUDE_SYMBOLS = internal::* Flagged* *InnerIterator* DenseStorage<* # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see @@ -639,7 +639,9 @@ EXCLUDE_SYMBOLS = EigenBase<* SparseMatrixBase<* DenseBase<* MatrixBase<* EXAMPLE_PATH = "${Eigen_SOURCE_DIR}/doc/snippets" \ "${Eigen_BINARY_DIR}/doc/snippets" \ "${Eigen_SOURCE_DIR}/doc/examples" \ - "${Eigen_BINARY_DIR}/doc/examples" + "${Eigen_BINARY_DIR}/doc/examples" \ + "${Eigen_SOURCE_DIR}/doc/special_examples" \ + "${Eigen_BINARY_DIR}/doc/special_examples" # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp @@ -1229,7 +1231,8 @@ EXPAND_AS_DEFINED = EIGEN_MAKE_TYPEDEFS \ EIGEN_CWISE_BINOP_RETURN_TYPE \ EIGEN_CWISE_PRODUCT_RETURN_TYPE \ EIGEN_CURRENT_STORAGE_BASE_CLASS \ - _EIGEN_GENERIC_PUBLIC_INTERFACE + _EIGEN_GENERIC_PUBLIC_INTERFACE \ + EIGEN2_SUPPORT # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone diff --git a/gtsam/3rdparty/Eigen/doc/I00_CustomizingEigen.dox b/gtsam/3rdparty/Eigen/doc/I00_CustomizingEigen.dox index 766ff6f95..623ef31e1 100644 --- a/gtsam/3rdparty/Eigen/doc/I00_CustomizingEigen.dox +++ b/gtsam/3rdparty/Eigen/doc/I00_CustomizingEigen.dox @@ -120,19 +120,22 @@ Eigen::MatrixBase, 10000, 1, 2, 10000, 1> \anchor user_defined_scalars \section CustomScalarType Using custom scalar types -By default, Eigen currently supports the following scalar types: \c int, \c float, \c double, \c std::complex, \c std::complex, \c long \c double, \c long \c long \c int (64 bits integers), and \c bool. The \c long \c double is especially useful on x86-64 systems or when the SSE2 instruction set is enabled because it enforces the use of x87 registers with extended accuracy. +By default, Eigen currently supports standard floating-point types (\c float, \c double, \c std::complex, \c std::complex, \c long \c double), as well as all integrale types (e.g., \c int, \c unsigned \c int, \c short, etc.), and \c bool. +On x86-64 systems, \c long \c double permits to locally enforces the use of x87 registers with extended accuracy (in comparison to SSE). In order to add support for a custom type \c T you need: - 1 - make sure the common operator (+,-,*,/,etc.) are supported by the type \c T - 2 - add a specialization of struct Eigen::NumTraits (see \ref NumTraits) - 3 - define a couple of math functions for your type such as: internal::sqrt, internal::abs, etc... +-# make sure the common operator (+,-,*,/,etc.) are supported by the type \c T +-# add a specialization of struct Eigen::NumTraits (see \ref NumTraits) +-# define the math functions that makes sense for your type. This includes standard ones like sqrt, pow, sin, tan, conj, real, imag, etc, as well as abs2 which is Eigen specific. (see the file Eigen/src/Core/MathFunctions.h) +The math function should be defined in the same namespace than \c T, or in the \c std namespace though that second appraoch is not recommended. + Here is a concrete example adding support for the Adolc's \c adouble type. Adolc is an automatic differentiation library. The type \c adouble is basically a real value tracking the values of any number of partial derivatives. \code -#ifndef ADLOCSUPPORT_H -#define ADLOCSUPPORT_H +#ifndef ADOLCSUPPORT_H +#define ADOLCSUPPORT_H #define ADOLC_TAPELESS #include @@ -141,6 +144,7 @@ Here is a concrete example adding support for the Adolc's \c adouble type. struct NumTraits + : NumTraits // permits to get the epsilon, dummy_precision, lowest, highest functions { typedef adtl::adouble Real; typedef adtl::adouble NonInteger; @@ -149,35 +153,27 @@ template<> struct NumTraits enum { IsComplex = 0, IsInteger = 0, - IsSigned, + IsSigned = 1, + RequireInitialization = 1, ReadCost = 1, - AddCost = 1, - MulCost = 1 + AddCost = 3, + MulCost = 3 }; }; } -// the Adolc's type adouble is defined in the adtl namespace -// therefore, the following internal::* functions *must* be defined -// in the same namespace namespace adtl { - inline const adouble& internal::conj(const adouble& x) { return x; } - inline const adouble& internal::real(const adouble& x) { return x; } - inline adouble internal::imag(const adouble&) { return 0.; } - inline adouble internal::abs(const adouble& x) { return fabs(x); } - inline adouble internal::abs2(const adouble& x) { return x*x; } - inline adouble internal::sqrt(const adouble& x) { return sqrt(x); } - inline adouble internal::exp(const adouble& x) { return exp(x); } - inline adouble internal::log(const adouble& x) { return log(x); } - inline adouble internal::sin(const adouble& x) { return sin(x); } - inline adouble internal::cos(const adouble& x) { return cos(x); } - inline adouble internal::pow(const adouble& x, adouble y) { return pow(x, y); } +inline const adouble& conj(const adouble& x) { return x; } +inline const adouble& real(const adouble& x) { return x; } +inline adouble imag(const adouble&) { return 0.; } +inline adouble abs(const adouble& x) { return fabs(x); } +inline adouble abs2(const adouble& x) { return x*x; } } -#endif // ADLOCSUPPORT_H +#endif // ADOLCSUPPORT_H \endcode diff --git a/gtsam/3rdparty/Eigen/doc/I09_Vectorization.dox b/gtsam/3rdparty/Eigen/doc/I09_Vectorization.dox index 63831e59f..274d0451b 100644 --- a/gtsam/3rdparty/Eigen/doc/I09_Vectorization.dox +++ b/gtsam/3rdparty/Eigen/doc/I09_Vectorization.dox @@ -1,6 +1,6 @@ namespace Eigen { -/** \page TopicVectorization Vectorizaion +/** \page TopicVectorization Vectorization TODO: write this dox page! diff --git a/gtsam/3rdparty/Eigen/doc/I14_PreprocessorDirectives.dox b/gtsam/3rdparty/Eigen/doc/I14_PreprocessorDirectives.dox index b34fc84cf..2826a7f50 100644 --- a/gtsam/3rdparty/Eigen/doc/I14_PreprocessorDirectives.dox +++ b/gtsam/3rdparty/Eigen/doc/I14_PreprocessorDirectives.dox @@ -2,66 +2,75 @@ namespace Eigen { /** \page TopicPreprocessorDirectives Preprocessor directives -You can control some aspects of Eigen by defining the preprocessor tokens using \c \#define. These macros -should be defined before any Eigen headers are included. Often they are best set in the project options. +You can control some aspects of %Eigen by defining the preprocessor tokens using \c \#define. These macros +should be defined before any %Eigen headers are included. Often they are best set in the project options. -This page lists the preprocesor tokens recognised by Eigen. +This page lists the preprocesor tokens recognised by %Eigen. Table of contents - \ref TopicPreprocessorDirectivesMajor - \ref TopicPreprocessorDirectivesAssertions - \ref TopicPreprocessorDirectivesPerformance - \ref TopicPreprocessorDirectivesPlugins + - \ref TopicPreprocessorDirectivesDevelopers \section TopicPreprocessorDirectivesMajor Macros with major effects +These macros have a major effect and typically break the API (Application Programming Interface) and/or the +ABI (Application Binary Interface). This can be rather dangerous: if parts of your program are compiled with +one option, and other parts (or libraries that you use) are compiled with another option, your program may +fail to link or exhibit subtle bugs. Nevertheless, these options can be useful for people who know what they +are doing. + - \b EIGEN2_SUPPORT - if defined, enables the Eigen2 compatibility mode. This is meant to ease the transition of Eigen2 to Eigen3 (see \ref Eigen2ToEigen3). Not defined by default. - \b EIGEN2_SUPPORT_STAGEnn_xxx (for various values of nn and xxx) - staged migration path from Eigen2 to Eigen3; see \ref Eigen2SupportModes. - - \b EIGEN_DEFAULT_TO_ROW_MAJOR - when defined, the default storage order for matrices becomes row-major - instead of column-major. Not defined by default. - \b EIGEN_DEFAULT_DENSE_INDEX_TYPE - the type for column and row indices in matrices, vectors and array (DenseBase::Index). Set to \c std::ptrdiff_t by default. - \b EIGEN_DEFAULT_IO_FORMAT - the IOFormat to use when printing a matrix if no #IOFormat is specified. Defaults to the #IOFormat constructed by the default constructor IOFormat(). - \b EIGEN_INITIALIZE_MATRICES_BY_ZERO - if defined, all entries of newly constructed matrices and arrays are initializes to zero, as are new entries in matrices and arrays after resizing. Not defined by default. + - \b EIGEN_NO_AUTOMATIC_RESIZING - if defined, the matrices (or arrays) on both sides of an assignment + a = b have to be of the same size; otherwise, %Eigen automatically resizes \c a so that it is of + the correct size. Not defined by default. \section TopicPreprocessorDirectivesAssertions Assertions -The Eigen library contains many assertions to guard against programming errors, both at compile time and at +The %Eigen library contains many assertions to guard against programming errors, both at compile time and at run time. However, these assertions do cost time and can thus be turned off. - - \b EIGEN_NO_DEBUG - disables Eigen's assertions if defined. Not defined by default, unless the + - \b EIGEN_NO_DEBUG - disables %Eigen's assertions if defined. Not defined by default, unless the \c NDEBUG macro is defined (this is a standard C++ macro which disables all asserts). - \b EIGEN_NO_STATIC_ASSERT - if defined, compile-time static assertions are replaced by runtime assertions; this saves compilation time. Not defined by default. - - \b EIGEN_INTERNAL_DEBUGGING - if defined, enables assertions in Eigen's internal routines. This is useful - for debugging Eigen itself. Not defined by default. + - \b eigen_assert - macro with one argument that is used inside %Eigen for assertions. By default, it is + basically defined to be \c assert, which aborts the program if the assertion is violated. Redefine this + macro if you want to do something else, like throwing an exception. \section TopicPreprocessorDirectivesPerformance Alignment, vectorization and performance tweaking - - \b EIGEN_DONT_ALIGN - disables alignment completely. Eigen will not try to align its objects and does not + - \b EIGEN_DONT_ALIGN - disables alignment completely. %Eigen will not try to align its objects and does not expect that any objects passed to it are aligned. This will turn off vectorization. Not defined by default. - \b EIGEN_DONT_ALIGN_STATICALLY - disables alignment of arrays on the stack. Not defined by default, unless \c EIGEN_DONT_ALIGN is defined. - \b EIGEN_DONT_VECTORIZE - disables explicit vectorization when defined. Not defined by default, unless - alignment is disabled by Eigen's platform test or the user defining \c EIGEN_DONT_ALIGN. + alignment is disabled by %Eigen's platform test or the user defining \c EIGEN_DONT_ALIGN. - \b EIGEN_FAST_MATH - enables some optimizations which might affect the accuracy of the result. The only optimization this currently includes is single precision sin() and cos() in the present of SSE vectorization. Defined by default. - \b EIGEN_UNROLLING_LIMIT - defines the size of a loop to enable meta unrolling. Set it to zero to disable - unrolling. The size of a loop here is expressed in Eigen's own notion of "number of FLOPS", it does not + unrolling. The size of a loop here is expressed in %Eigen's own notion of "number of FLOPS", it does not correspond to the number of iterations or the number of instructions. The default is value 100. \section TopicPreprocessorDirectivesPlugins Plugins -It is possible to add new methods to many fundamental classes in Eigen by writing a plugin. As explained in +It is possible to add new methods to many fundamental classes in %Eigen by writing a plugin. As explained in the section \ref ExtendingMatrixBase, the plugin is specified by defining a \c EIGEN_xxx_PLUGIN macro. The following macros are supported; none of them are defined by default. @@ -81,6 +90,21 @@ following macros are supported; none of them are defined by default. - \b EIGEN_FUNCTORS_PLUGIN - filename of plugin for adding new functors and specializations of functor_traits. +\section TopicPreprocessorDirectivesDevelopers Macros for Eigen developers + +These macros are mainly meant for people developing %Eigen and for testing purposes. Even though, they might be useful for power users and the curious for debugging and testing purpose, they \b should \b not \b be \b used by real-word code. + + - \b EIGEN_DEFAULT_TO_ROW_MAJOR - when defined, the default storage order for matrices becomes row-major + instead of column-major. Not defined by default. + - \b EIGEN_INTERNAL_DEBUGGING - if defined, enables assertions in %Eigen's internal routines. This is useful + for debugging %Eigen itself. Not defined by default. + - \b EIGEN_NO_MALLOC - if defined, any request from inside the %Eigen to allocate memory from the heap + results in an assertion failure. This is useful to check that some routine does not allocate memory + dynamically. Not defined by default. + - \b EIGEN_RUNTIME_NO_MALLOC - if defined, a new switch is introduced which can be turned on and off by + calling set_is_malloc_allowed(bool). If malloc is not allowed and %Eigen tries to allocate memory + dynamically anyway, an assertion failure results. Not defined by default. + */ } diff --git a/gtsam/3rdparty/Eigen/doc/I15_StorageOrders.dox b/gtsam/3rdparty/Eigen/doc/I15_StorageOrders.dox index 6b56ca8f8..7418912a6 100644 --- a/gtsam/3rdparty/Eigen/doc/I15_StorageOrders.dox +++ b/gtsam/3rdparty/Eigen/doc/I15_StorageOrders.dox @@ -60,10 +60,8 @@ parameter is set to \c RowMajor, then the matrix or array is stored in row-major \c ColMajor, then it is stored in column-major order. This mechanism is used in the above Eigen program to specify the storage order. -If the storage order is not specified, then Eigen normally defaults to storing the entry in column-major -order. This is also the case if one of the convenience typedefs (\c Matrix3f, \c ArrayXXd, etc.) is -used. However, it is possible to change the default to row-major order by defining the -\c EIGEN_DEFAULT_TO_ROW_MAJOR \ref TopicPreprocessorDirectives "preprocessor directive". +If the storage order is not specified, then Eigen defaults to storing the entry in column-major. This is also +the case if one of the convenience typedefs (\c Matrix3f, \c ArrayXXd, etc.) is used. Matrices and arrays using one storage order can be assigned to matrices and arrays using the other storage order, as happens in the above program when \c Arowmajor is initialized using \c Acolmajor. Eigen will reorder diff --git a/gtsam/3rdparty/Eigen/doc/I16_TemplateKeyword.dox b/gtsam/3rdparty/Eigen/doc/I16_TemplateKeyword.dox new file mode 100644 index 000000000..324532310 --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/I16_TemplateKeyword.dox @@ -0,0 +1,136 @@ +namespace Eigen { + +/** \page TopicTemplateKeyword The template and typename keywords in C++ + +There are two uses for the \c template and \c typename keywords in C++. One of them is fairly well known +amongst programmers: to define templates. The other use is more obscure: to specify that an expression refers +to a template function or a type. This regularly trips up programmers that use the %Eigen library, often +leading to error messages from the compiler that are difficult to understand. + +Table of contents + - \ref TopicTemplateKeywordToDefineTemplates + - \ref TopicTemplateKeywordExample + - \ref TopicTemplateKeywordExplanation + - \ref TopicTemplateKeywordResources + + +\section TopicTemplateKeywordToDefineTemplates Using the template and typename keywords to define templates + +The \c template and \c typename keywords are routinely used to define templates. This is not the topic of this +page as we assume that the reader is aware of this (otherwise consult a C++ book). The following example +should illustrate this use of the \c template keyword. + +\code +template +bool isPositive(T x) +{ + return x > 0; +} +\endcode + +We could just as well have written template <class T>; the keywords \c typename and \c class have the +same meaning in this context. + + +\section TopicTemplateKeywordExample An example showing the second use of the template keyword + +Let us illustrate the second use of the \c template keyword with an example. Suppose we want to write a +function which copies all entries in the upper triangular part of a matrix into another matrix, while keeping +the lower triangular part unchanged. A straightforward implementation would be as follows: + + + + +
Example:Output:
+\include TemplateKeyword_simple.cpp + +\verbinclude TemplateKeyword_simple.out +
+ +That works fine, but it is not very flexible. First, it only works with dynamic-size matrices of +single-precision floats; the function \c copyUpperTriangularPart() does not accept static-size matrices or +matrices with double-precision numbers. Second, if you use an expression such as +mat.topLeftCorner(3,3) as the parameter \c src, then this is copied into a temporary variable of type +MatrixXf; this copy can be avoided. + +As explained in \ref TopicFunctionTakingEigenTypes, both issues can be resolved by making +\c copyUpperTriangularPart() accept any object of type MatrixBase. This leads to the following code: + + + + +
Example:Output:
+\include TemplateKeyword_flexible.cpp + +\verbinclude TemplateKeyword_flexible.out +
+ +The one line in the body of the function \c copyUpperTriangularPart() shows the second, more obscure use of +the \c template keyword in C++. Even though it may look strange, the \c template keywords are necessary +according to the standard. Without it, the compiler may reject the code with an error message like "no match +for operator<". + + +\section TopicTemplateKeywordExplanation Explanation + +The reason that the \c template keyword is necessary in the last example has to do with the rules for how +templates are supposed to be compiled in C++. The compiler has to check the code for correct syntax at the +point where the template is defined, without knowing the actual value of the template arguments (\c Derived1 +and \c Derived2 in the example). That means that the compiler cannot know that dst.triangularPart is +a member template and that the following < symbol is part of the delimiter for the template +parameter. Another possibility would be that dst.triangularPart is a member variable with the < +symbol refering to the operator<() function. In fact, the compiler should choose the second +possibility, according to the standard. If dst.triangularPart is a member template (as in our case), +the programmer should specify this explicitly with the \c template keyword and write dst.template +triangularPart. + +The precise rules are rather complicated, but ignoring some subtleties we can summarize them as follows: +- A dependent name is name that depends (directly or indirectly) on a template parameter. In the + example, \c dst is a dependent name because it is of type MatrixBase<Derived1> which depends + on the template parameter \c Derived1. +- If the code contains either one of the contructions xxx.yyy or xxx->yyy and \c xxx is a + dependent name and \c yyy refers to a member template, then the \c template keyword must be used before + \c yyy, leading to xxx.template yyy or xxx->template yyy. +- If the code contains the contruction xxx::yyy and \c xxx is a dependent name and \c yyy refers to a + member typedef, then the \c typename keyword must be used before the whole construction, leading to + typename xxx::yyy. + +As an example where the \c typename keyword is required, consider the following code in \ref TutorialSparse +for iterating over the non-zero entries of a sparse matrix type: + +\code +SparseMatrixType mat(rows,cols); +for (int k=0; k +void iterateOverSparseMatrix(const SparseMatrix& mat; +{ + for (int k=0; k::InnerIterator it(mat,k); it; ++it) + { + /* ... */ + } +} +\endcode + + +\section TopicTemplateKeywordResources Resources for further reading + +For more information and a fuller explanation of this topic, the reader may consult the following sources: +- The book "C++ Template Metaprogramming" by David Abrahams and Aleksey Gurtovoy contains a very good + explanation in Appendix B ("The typename and template Keywords") which formed the basis for this page. +- http://pages.cs.wisc.edu/~driscoll/typename.html +- http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 +- http://www.comeaucomputing.com/techtalk/templates/#templateprefix +- http://www.comeaucomputing.com/techtalk/templates/#typename + +*/ +} diff --git a/gtsam/3rdparty/Eigen/doc/Overview.dox b/gtsam/3rdparty/Eigen/doc/Overview.dox index 68e07ad63..2657c85bc 100644 --- a/gtsam/3rdparty/Eigen/doc/Overview.dox +++ b/gtsam/3rdparty/Eigen/doc/Overview.dox @@ -34,12 +34,15 @@ For a first contact with Eigen, the best place is to have a look at the \ref Get - \ref TopicLazyEvaluation - \ref TopicLinearAlgebraDecompositions - \ref TopicCustomizingEigen + - \ref TopicMultiThreading - \ref TopicPreprocessorDirectives - \ref TopicStorageOrders - \ref TopicInsideEigenExample - \ref TopicWritingEfficientProductExpression - \ref TopicClassHierarchy - \ref TopicFunctionTakingEigenTypes + - \ref TopicTemplateKeyword + - \ref TopicUsingIntelMKL - Topics related to alignment issues - \ref TopicUnalignedArrayAssert - \ref TopicFixedSizeVectorizable diff --git a/gtsam/3rdparty/Eigen/doc/QuickReference.dox b/gtsam/3rdparty/Eigen/doc/QuickReference.dox index e23ff7ce5..3310d390a 100644 --- a/gtsam/3rdparty/Eigen/doc/QuickReference.dox +++ b/gtsam/3rdparty/Eigen/doc/QuickReference.dox @@ -412,8 +412,8 @@ array1 <= array2 array1 >= array2 array1 <= scalar array1 >= scalar array1 == array2 array1 != array2 array1 == scalar array1 != scalar \endcode Trigo, power, and \n misc functions \n and the STL variants\code -array1.min(array2) std::min(array1,array2) -array1.max(array2) std::max(array1,array2) +array1.min(array2) +array1.max(array2) array1.abs2() array1.abs() std::abs(array1) array1.sqrt() std::sqrt(array1) @@ -440,10 +440,10 @@ Eigen provides several reduction methods such as: \link DenseBase::sum() sum() \endlink, \link DenseBase::prod() prod() \endlink, \link MatrixBase::trace() trace() \endlink \matrixworld, \link MatrixBase::norm() norm() \endlink \matrixworld, \link MatrixBase::squaredNorm() squaredNorm() \endlink \matrixworld, -\link DenseBase::all() all() \endlink \redstar,and \link DenseBase::any() any() \endlink \redstar. +\link DenseBase::all() all() \endlink, and \link DenseBase::any() any() \endlink. All reduction operations can be done matrix-wise, -\link DenseBase::colwise() column-wise \endlink \redstar or -\link DenseBase::rowwise() row-wise \endlink \redstar. Usage example: +\link DenseBase::colwise() column-wise \endlink or +\link DenseBase::rowwise() row-wise \endlink. Usage example:
\code 5 3 1 @@ -586,6 +586,9 @@ mat3 = mat1 * diag1.inverse() TriangularView gives a view on a triangular part of a dense matrix and allows to perform optimized operations on it. The opposite triangular part is never referenced and can be used to store other information. +\note The .triangularView() template member function requires the \c template keyword if it is used on an +object of a type that depends on a template parameter; see \ref TopicTemplateKeyword for details. +
OperationCode
@@ -630,6 +633,9 @@ Just as for triangular matrix, you can reference any triangular part of a square matrix and perform special and optimized operations. Again the opposite triangular part is never referenced and can be used to store other information. +\note The .selfadjointView() template member function requires the \c template keyword if it is used on an +object of a type that depends on a template parameter; see \ref TopicTemplateKeyword for details. + - + @@ -94,7 +94,7 @@ namespace Eigen { - + @@ -132,7 +132,7 @@ namespace Eigen { - + @@ -245,6 +245,10 @@ namespace Eigen {
Blocking
Means the algorithm can work per block, whence guaranteeing a good scaling of the performance for large matrices.
+
Implicit Multi Threading (MT)
+
Means the algorithm can take advantage of multicore processors via OpenMP. "Implicit" means the algortihm itself is not parallelized, but that it relies on parallelized matrix-matrix product rountines.
+
Explicit Multi Threading (MT)
+
Means the algorithm is explicitely parallelized to take advantage of multicore processors via OpenMP.
Meta-unroller
Means the algorithm is automatically and explicitly unrolled for very small fixed size matrices.
diff --git a/gtsam/3rdparty/Eigen/doc/TopicMultithreading.dox b/gtsam/3rdparty/Eigen/doc/TopicMultithreading.dox new file mode 100644 index 000000000..f7d082668 --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/TopicMultithreading.dox @@ -0,0 +1,46 @@ +namespace Eigen { + +/** \page TopicMultiThreading Eigen and multi-threading + +\section TopicMultiThreading_MakingEigenMT Make Eigen run in parallel + +Some Eigen's algorithms can exploit the multiple cores present in your hardware. To this end, it is enough to enable OpenMP on your compiler, for instance: + * GCC: \c -fopenmp + * ICC: \c -openmp + * MSVC: check the respective option in the build properties. +You can control the number of thread that will be used using either the OpenMP API or Eiegn's API using the following priority: +\code + OMP_NUM_THREADS=n ./my_program + omp_set_num_threads(n); + Eigen::setNbThreads(n); +\endcode +Unless setNbThreads has been called, Eigen uses the number of threads specified by OpenMP. You can restore this bahavior by calling \code setNbThreads(0); \endcode +You can query the number of threads that will be used with: +\code +n = Eigen::nbThreads(n); +\endcode +You can disable Eigen's multi threading at compile time by defining the EIGEN_DONT_PARALLELIZE preprocessor token. + +Currently, the following algorithms can make use of multi-threading: + * general matrix - matrix products + * PartialPivLU + +\section TopicMultiThreading_UsingEigenWithMT Using Eigen in a multi-threaded application + +In the case your own application is multithreaded, and multiple threads make calls to Eigen, then you have to initialize Eigen by calling the following routine \b before creating the threads: +\code +#include + +int main(int argc, char** argv) +{ + Eigen::initParallel(); + + ... +} +\endcode + +In the case your application is parallelized with OpenMP, you might want to disable Eigen's own parallization as detailed in the previous section. + +*/ + +} diff --git a/gtsam/3rdparty/Eigen/doc/TutorialSparse_example_details.dox b/gtsam/3rdparty/Eigen/doc/TutorialSparse_example_details.dox new file mode 100644 index 000000000..0438da8bb --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/TutorialSparse_example_details.dox @@ -0,0 +1,4 @@ +/** +\page TutorialSparse_example_details +\include Tutorial_sparse_example_details.cpp +*/ diff --git a/gtsam/3rdparty/Eigen/doc/UsingIntelMKL.dox b/gtsam/3rdparty/Eigen/doc/UsingIntelMKL.dox new file mode 100644 index 000000000..379ee3ffd --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/UsingIntelMKL.dox @@ -0,0 +1,168 @@ +/* + Copyright (c) 2011, Intel Corporation. All rights reserved. + Copyright (C) 2011 Gael Guennebaud + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Intel Corporation nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ******************************************************************************** + * Content : Documentation on the use of Intel MKL through Eigen + ******************************************************************************** +*/ + +namespace Eigen { + +/** \page TopicUsingIntelMKL Using Intel® Math Kernel Library from Eigen + +\section TopicUsingIntelMKL_Intro Eigen and Intel® Math Kernel Library (Intel® MKL) + +Since Eigen version 3.1 and later, users can benefit from built-in Intel MKL optimizations with an installed copy of Intel MKL 10.3 (or later). + Intel MKL provides highly optimized multi-threaded mathematical routines for x86-compatible architectures. +Intel MKL is available on Linux, Mac and Windows for both Intel64 and IA32 architectures. + +\warning Be aware that Intel® MKL is a proprietary software. It is the responsibility of the users to buy MKL licenses for their products. Moreover, the license of the user product has to allow linking to proprietary software that excludes any unmodified versions of the GPL. As a consequence, this also means that Eigen has to be used through the LGPL3+ license. + +Using Intel MKL through Eigen is easy: +-# define the \c EIGEN_USE_MKL_ALL macro before including any Eigen's header +-# link your program to MKL libraries (see the MKL linking advisor) +-# on a 64bits system, you must use the LP64 interface (not the ILP64 one) + +When doing so, a number of Eigen's algorithms are silently substituted with calls to Intel MKL routines. +These substitutions apply only for \b Dynamic \b or \b large enough objects with one of the following four standard scalar types: \c float, \c double, \c complex, and \c complex. +Operations on other scalar types or mixing reals and complexes will continue to use the built-in algorithms. + +In addition you can coarsely select choose which parts will be substituted by defining one or multiple of the following macros: + +
OperationCode
diff --git a/gtsam/3rdparty/Eigen/doc/SparseQuickReference.dox b/gtsam/3rdparty/Eigen/doc/SparseQuickReference.dox new file mode 100644 index 000000000..7d6eb0fa9 --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/SparseQuickReference.dox @@ -0,0 +1,198 @@ +namespace Eigen { +/** \page SparseQuickRefPage Quick reference guide for sparse matrices + +\b Table \b of \b contents + - \ref Constructors + - \ref SparseMatrixInsertion + - \ref SparseBasicInfos + - \ref SparseBasicOps + - \ref SparseInterops + - \ref sparsepermutation + - \ref sparsesubmatrices + - \ref sparseselfadjointview +\n + +
+ +In this page, we give a quick summary of the main operations available for sparse matrices in the class SparseMatrix. First, it is recommended to read first the introductory tutorial at \ref TutorialSparse. The important point to have in mind when working on sparse matrices is how they are stored : +i.e either row major or column major. The default is column major. Most arithmetic operations on sparse matrices will assert that they have the same storage order. Moreover, when interacting with external libraries that are not yet supported by Eigen, it is important to know how to send the required matrix pointers. + +\section Constructors Constructors and assignments +SparseMatrix is the core class to build and manipulate sparse matrices in Eigen. It takes as template parameters the Scalar type and the storage order, either RowMajor or ColumnMajor. The default is ColumnMajor. + +\code + SparseMatrix sm1(1000,1000); // 1000x1000 compressed sparse matrix of double. + SparseMatrix,RowMajor> sm2; // Compressed row major matrix of complex double. +\endcode +The copy constructor and assignment can be used to convert matrices from a storage order to another +\code + SparseMatrix sm1; + // Eventually fill the matrix sm1 ... + SparseMatrix sm2(sm1), sm3; // Initialize sm2 with sm1. + sm3 = sm1; // Assignment and evaluations modify the storage order. + \endcode + +\section SparseMatrixInsertion Allocating and inserting values +resize() and reserve() are used to set the size and allocate space for nonzero elements + \code + sm1.resize(m,n); //Change sm to a mxn matrix. + sm1.reserve(nnz); // Allocate room for nnz nonzeros elements. + \endcode +Note that when calling reserve(), it is not required that nnz is the exact number of nonzero elements in the final matrix. However, an exact estimation will avoid multiple reallocations during the insertion phase. + +Insertions of values in the sparse matrix can be done directly by looping over nonzero elements and use the insert() function +\code +// Direct insertion of the value v_ij; + sm1.insert(i, j) = v_ij; // It is assumed that v_ij does not already exist in the matrix. +\endcode + +After insertion, a value at (i,j) can be modified using coeffRef() +\code + // Update the value v_ij + sm1.coeffRef(i,j) = v_ij; + sm1.coeffRef(i,j) += v_ij; + sm1.coeffRef(i,j) -= v_ij; + ... +\endcode + +The recommended way to insert values is to build a list of triplets (row, col, val) and then call setFromTriplets(). +\code + sm1.setFromTriplets(TripletList.begin(), TripletList.end()); +\endcode +A complete example is available at \ref TutorialSparseFilling. + +The following functions can be used to set constant or random values in the matrix. +\code + sm1.setZero(); // Reset the matrix with zero elements + ... +\endcode + +\section SparseBasicInfos Matrix properties +Beyond the functions rows() and cols() that are used to get the number of rows and columns, there are some useful functions that are available to easily get some informations from the matrix. + + + + +
\code + sm1.rows(); // Number of rows + sm1.cols(); // Number of columns + sm1.nonZeros(); // Number of non zero values + sm1.outerSize(); // Number of columns (resp. rows) for a column major (resp. row major ) + sm1.innerSize(); // Number of rows (resp. columns) for a row major (resp. column major) + sm1.norm(); // (Euclidian ??) norm of the matrix + sm1.squaredNorm(); // + sm1.isVector(); // Check if sm1 is a sparse vector or a sparse matrix + ... + \endcode
+ +\section SparseBasicOps Arithmetic operations +It is easy to perform arithmetic operations on sparse matrices provided that the dimensions are adequate and that the matrices have the same storage order. Note that the evaluation can always be done in a matrix with a different storage order. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operations Code Notes
add subtract \code + sm3 = sm1 + sm2; + sm3 = sm1 - sm2; + sm2 += sm1; + sm2 -= sm1; \endcode + + sm1 and sm2 should have the same storage order +
+ scalar product\code + sm3 = sm1 * s1; sm3 *= s1; + sm3 = s1 * sm1 + s2 * sm2; sm3 /= s1;\endcode + + Many combinations are possible if the dimensions and the storage order agree. +
Product \code + sm3 = sm1 * sm2; + dm2 = sm1 * dm1; + dv2 = sm1 * dv1; + \endcode +
transposition, adjoint \code + sm2 = sm1.transpose(); + sm2 = sm1.adjoint(); + \endcode + Note that the transposition change the storage order. There is no support for transposeInPlace(). +
+ Component-wise ops + \code + sm1.cwiseProduct(sm2); + sm1.cwiseQuotient(sm2); + sm1.cwiseMin(sm2); + sm1.cwiseMax(sm2); + sm1.cwiseAbs(); + sm1.cwiseSqrt(); + \endcode + sm1 and sm2 should have the same storage order +
+ + +\section SparseInterops Low-level storage +There are a set of low-levels functions to get the standard compressed storage pointers. The matrix should be in compressed mode which can be checked by calling isCompressed(); makeCompressed() should do the job otherwise. +\code + // Scalar pointer to the values of the matrix, size nnz + sm1.valuePtr(); + // Index pointer to get the row indices (resp. column indices) for column major (resp. row major) matrix, size nnz + sm1.innerIndexPtr(); + // Index pointer to the beginning of each row (resp. column) in valuePtr() and innerIndexPtr() for column major (row major). The size is outersize()+1; + sm1.outerIndexPtr(); +\endcode +These pointers can therefore be easily used to send the matrix to some external libraries/solvers that are not yet supported by Eigen. + +\section sparsepermutation Permutations, submatrices and Selfadjoint Views +In many cases, it is necessary to reorder the rows and/or the columns of the sparse matrix for several purposes : fill-in reducing during matrix decomposition, better data locality for sparse matrix-vector products... The class PermutationMatrix is available to this end. + \code + PermutationMatrix perm; + // Reserve and fill the values of perm; + perm.inverse(n); // Compute eventually the inverse permutation + sm1.twistedBy(perm) //Apply the permutation on rows and columns + sm2 = sm1 * perm; // ??? Apply the permutation on columns ???; + sm2 = perm * sm1; // ??? Apply the permutation on rows ???; + \endcode + +\section sparsesubmatrices Sub-matrices +The following functions are useful to extract a block of rows (resp. columns) from a row-major (resp. column major) sparse matrix. Note that because of the particular storage, it is not ?? efficient ?? to extract a submatrix comprising a certain number of subrows and subcolumns. + \code + sm1.innerVector(outer); // Returns the outer -th column (resp. row) of the matrix if sm is col-major (resp. row-major) + sm1.innerVectors(outer); // Returns the outer -th column (resp. row) of the matrix if mat is col-major (resp. row-major) + sm1.middleRows(start, numRows); // For row major matrices, get a range of numRows rows + sm1.middleCols(start, numCols); // For column major matrices, get a range of numCols cols + \endcode + Examples : + +\section sparseselfadjointview Sparse triangular and selfadjoint Views + \code + sm2 = sm1.triangularview(); // Get the lower triangular part of the matrix. + dv2 = sm1.triangularView().solve(dv1); // Solve the linear system with the uppper triangular part. + sm2 = sm1.selfadjointview(); // Build a selfadjoint matrix from the lower part of sm1. + \endcode + + +*/ +} diff --git a/gtsam/3rdparty/Eigen/doc/TopicLinearAlgebraDecompositions.dox b/gtsam/3rdparty/Eigen/doc/TopicLinearAlgebraDecompositions.dox index 5684a495f..faa564b93 100644 --- a/gtsam/3rdparty/Eigen/doc/TopicLinearAlgebraDecompositions.dox +++ b/gtsam/3rdparty/Eigen/doc/TopicLinearAlgebraDecompositions.dox @@ -34,7 +34,7 @@ namespace Eigen {
- Yes ExcellentBlockingBlocking, Implicit MT
- Yes ExcellentBlocking \n Soon: meta unrollerBlocking
Eigenvalues/vectors - GoodSoon: specializations for 2x2 and 3x3Closed forms for 2x2 and 3x3
+ + + + + +
\c EIGEN_USE_BLAS Enables the use of external BLAS level 2 and 3 routines (currently works with Intel MKL only)
\c EIGEN_USE_LAPACKE Enables the use of external Lapack routines via the Intel Lapacke C interface to Lapack (currently works with Intel MKL only)
\c EIGEN_USE_LAPACKE_STRICT Same as \c EIGEN_USE_LAPACKE but algorithm of lower robustness are disabled. This currently concerns only JacobiSVD which otherwise would be replaced by \c gesvd that is less robust than Jacobi rotations.
\c EIGEN_USE_MKL_VML Enables the use of Intel VML (vector operations)
\c EIGEN_USE_MKL_ALL Defines \c EIGEN_USE_BLAS, \c EIGEN_USE_LAPACKE, and \c EIGEN_USE_MKL_VML
+ +Finally, the PARDISO sparse solver shipped with Intel MKL can be used through the \ref PardisoLU, \ref PardisoLLT and \ref PardisoLDLT classes of the \ref PARDISOSupport_Module. + + +\section TopicUsingIntelMKL_SupportedFeatures List of supported features + +The breadth of Eigen functionality covered by Intel MKL is listed in the table below. + + + + + + + + + + + +
Functional domainCode exampleMKL routines
Matrix-matrix operations \n \c EIGEN_USE_BLAS \code +m1*m2.transpose(); +m1.selfadjointView()*m2; +m1*m2.triangularView(); +m1.selfadjointView().rankUpdate(m2,1.0); +\endcode\code +?gemm +?symm/?hemm +?trmm +dsyrk/ssyrk +\endcode
Matrix-vector operations \n \c EIGEN_USE_BLAS \code +m1.adjoint()*b; +m1.selfadjointView()*b; +m1.triangularView()*b; +\endcode\code +?gemv +?symv/?hemv +?trmv +\endcode
LU decomposition \n \c EIGEN_USE_LAPACKE \n \c EIGEN_USE_LAPACKE_STRICT \code +v1 = m1.lu().solve(v2); +\endcode\code +?getrf +\endcode
Cholesky decomposition \n \c EIGEN_USE_LAPACKE \n \c EIGEN_USE_LAPACKE_STRICT \code +v1 = m2.selfadjointView().llt().solve(v2); +\endcode\code +?potrf +\endcode
QR decomposition \n \c EIGEN_USE_LAPACKE \n \c EIGEN_USE_LAPACKE_STRICT \code +m1.householderQr(); +m1.colPivHouseholderQr(); +\endcode\code +?geqrf +?geqp3 +\endcode
Singular value decomposition \n \c EIGEN_USE_LAPACKE \code +JacobiSVD svd; +svd.compute(m1, ComputeThinV); +\endcode\code +?gesvd +\endcode
Eigen-value decompositions \n \c EIGEN_USE_LAPACKE \n \c EIGEN_USE_LAPACKE_STRICT \code +EigenSolver es(m1); +ComplexEigenSolver ces(m1); +SelfAdjointEigenSolver saes(m1+m1.transpose()); +GeneralizedSelfAdjointEigenSolver + gsaes(m1+m1.transpose(),m2+m2.transpose()); +\endcode\code +?gees +?gees +?syev/?heev +?syev/?heev, +?potrf +\endcode
Schur decomposition \n \c EIGEN_USE_LAPACKE \n \c EIGEN_USE_LAPACKE_STRICT \code +RealSchur schurR(m1); +ComplexSchur schurC(m1); +\endcode\code +?gees +\endcode
Vector Math \n \c EIGEN_USE_MKL_VML \code +v2=v1.array().sin(); +v2=v1.array().asin(); +v2=v1.array().cos(); +v2=v1.array().acos(); +v2=v1.array().tan(); +v2=v1.array().exp(); +v2=v1.array().log(); +v2=v1.array().sqrt(); +v2=v1.array().square(); +v2=v1.array().pow(1.5); +\endcode\code +v?Sin +v?Asin +v?Cos +v?Acos +v?Tan +v?Exp +v?Ln +v?Sqrt +v?Sqr +v?Powx +\endcode
+In the examples, m1 and m2 are dense matrices and v1 and v2 are dense vectors. + + +\section TopicUsingIntelMKL_Links Links +- Intel MKL can be purchased and downloaded here. +- Intel MKL is also bundled with Intel Composer XE. + + +*/ + +} \ No newline at end of file diff --git a/gtsam/3rdparty/Eigen/doc/eigendoxy.css b/gtsam/3rdparty/Eigen/doc/eigendoxy.css index e62958831..c6c16286d 100644 --- a/gtsam/3rdparty/Eigen/doc/eigendoxy.css +++ b/gtsam/3rdparty/Eigen/doc/eigendoxy.css @@ -904,3 +904,8 @@ div.eimainmenu { h3.version { text-align: center; } + + +td.width20em p.endtd { + width: 20em; +} diff --git a/gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_flexible.cpp b/gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_flexible.cpp new file mode 100644 index 000000000..9d85292dd --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_flexible.cpp @@ -0,0 +1,22 @@ +#include +#include + +using namespace Eigen; + +template +void copyUpperTriangularPart(MatrixBase& dst, const MatrixBase& src) +{ + /* Note the 'template' keywords in the following line! */ + dst.template triangularView() = src.template triangularView(); +} + +int main() +{ + MatrixXi m1 = MatrixXi::Ones(5,5); + MatrixXi m2 = MatrixXi::Random(4,4); + std::cout << "m2 before copy:" << std::endl; + std::cout << m2 << std::endl << std::endl; + copyUpperTriangularPart(m2, m1.topLeftCorner(4,4)); + std::cout << "m2 after copy:" << std::endl; + std::cout << m2 << std::endl << std::endl; +} diff --git a/gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_simple.cpp b/gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_simple.cpp new file mode 100644 index 000000000..6998c1769 --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_simple.cpp @@ -0,0 +1,20 @@ +#include +#include + +using namespace Eigen; + +void copyUpperTriangularPart(MatrixXf& dst, const MatrixXf& src) +{ + dst.triangularView() = src.triangularView(); +} + +int main() +{ + MatrixXf m1 = MatrixXf::Ones(4,4); + MatrixXf m2 = MatrixXf::Random(4,4); + std::cout << "m2 before copy:" << std::endl; + std::cout << m2 << std::endl << std::endl; + copyUpperTriangularPart(m2, m1); + std::cout << "m2 after copy:" << std::endl; + std::cout << m2 << std::endl << std::endl; +} diff --git a/gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp b/gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp index 9959c7909..d87c96ab1 100644 --- a/gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp +++ b/gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp @@ -13,7 +13,7 @@ int main() v << 0,1,2,3; //add v to each row of m - mat.rowwise() += v; + mat.rowwise() += v.transpose(); std::cout << "Broadcasting result: " << std::endl; std::cout << mat << std::endl; diff --git a/gtsam/3rdparty/Eigen/doc/snippets/Cwise_boolean_and.cpp b/gtsam/3rdparty/Eigen/doc/snippets/Cwise_boolean_and.cpp new file mode 100644 index 000000000..df6b60d92 --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/snippets/Cwise_boolean_and.cpp @@ -0,0 +1,2 @@ +Array3d v(-1,2,1), w(-3,2,3); +cout << ((v lltOfA(A); // compute the Cholesky decomposition of A +MatrixXd L = lltOfA.matrixL(); // retrieve factor L in the decomposition +// The previous two lines can also be written as "L = A.llt().matrixL()" + +cout << "The Cholesky factor L is" << endl << L << endl; +cout << "To check this, let us compute L * L.transpose()" << endl; +cout << L * L.transpose() << endl; +cout << "This should equal the matrix A" << endl; diff --git a/gtsam/3rdparty/Eigen/doc/snippets/compile_snippet.cpp.in b/gtsam/3rdparty/Eigen/doc/snippets/compile_snippet.cpp.in index 474542380..894cd526c 100644 --- a/gtsam/3rdparty/Eigen/doc/snippets/compile_snippet.cpp.in +++ b/gtsam/3rdparty/Eigen/doc/snippets/compile_snippet.cpp.in @@ -1,10 +1,4 @@ -#include -#include -#include -#include -#include -#include -#include +#include #include using namespace Eigen; diff --git a/gtsam/3rdparty/Eigen/doc/special_examples/CMakeLists.txt b/gtsam/3rdparty/Eigen/doc/special_examples/CMakeLists.txt new file mode 100644 index 000000000..eeeae1d2a --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/special_examples/CMakeLists.txt @@ -0,0 +1,20 @@ + +if(NOT EIGEN_TEST_NOQT) + find_package(Qt4) + if(QT4_FOUND) + include(${QT_USE_FILE}) + endif() +endif(NOT EIGEN_TEST_NOQT) + + +if(QT4_FOUND) + add_executable(Tutorial_sparse_example Tutorial_sparse_example.cpp Tutorial_sparse_example_details.cpp) + target_link_libraries(Tutorial_sparse_example ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}) + + add_custom_command( + TARGET Tutorial_sparse_example + POST_BUILD + COMMAND Tutorial_sparse_example + ARGS ${CMAKE_CURRENT_BINARY_DIR}/../html/Tutorial_sparse_example.jpeg + ) +endif(QT4_FOUND) diff --git a/gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example.cpp b/gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example.cpp new file mode 100644 index 000000000..002f19f01 --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example.cpp @@ -0,0 +1,32 @@ +#include +#include + +typedef Eigen::SparseMatrix SpMat; // declares a column-major sparse matrix type of double +typedef Eigen::Triplet T; + +void buildProblem(std::vector& coefficients, Eigen::VectorXd& b, int n); +void saveAsBitmap(const Eigen::VectorXd& x, int n, const char* filename); + +int main(int argc, char** argv) +{ + int n = 300; // size of the image + int m = n*n; // number of unknows (=number of pixels) + + // Assembly: + std::vector coefficients; // list of non-zeros coefficients + Eigen::VectorXd b(m); // the right hand side-vector resulting from the constraints + buildProblem(coefficients, b, n); + + SpMat A(m,m); + A.setFromTriplets(coefficients.begin(), coefficients.end()); + + // Solving: + Eigen::SimplicialCholesky chol(A); // performs a Cholesky factorization of A + Eigen::VectorXd x = chol.solve(b); // use the factorization to solve for the given right hand side + + // Export the result to a file: + saveAsBitmap(x, n, argv[1]); + + return 0; +} + diff --git a/gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example_details.cpp b/gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example_details.cpp new file mode 100644 index 000000000..8c3020b63 --- /dev/null +++ b/gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example_details.cpp @@ -0,0 +1,44 @@ +#include +#include +#include + +typedef Eigen::SparseMatrix SpMat; // declares a column-major sparse matrix type of double +typedef Eigen::Triplet T; + +void insertCoefficient(int id, int i, int j, double w, std::vector& coeffs, + Eigen::VectorXd& b, const Eigen::VectorXd& boundary) +{ + int n = boundary.size(); + int id1 = i+j*n; + + if(i==-1 || i==n) b(id) -= w * boundary(j); // constrained coeffcieint + else if(j==-1 || j==n) b(id) -= w * boundary(i); // constrained coeffcieint + else coeffs.push_back(T(id,id1,w)); // unknown coefficient +} + +void buildProblem(std::vector& coefficients, Eigen::VectorXd& b, int n) +{ + b.setZero(); + Eigen::ArrayXd boundary = Eigen::ArrayXd::LinSpaced(n, 0,M_PI).sin().pow(2); + for(int j=0; j bits = (x*255).cast(); + QImage img(bits.data(), n,n,QImage::Format_Indexed8); + img.setColorCount(256); + for(int i=0;i<256;i++) img.setColor(i,qRgb(i,i,i)); + img.save(filename); +} diff --git a/gtsam/3rdparty/Eigen/lapack/CMakeLists.txt b/gtsam/3rdparty/Eigen/lapack/CMakeLists.txt index 96d6a416d..062845a3f 100644 --- a/gtsam/3rdparty/Eigen/lapack/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/lapack/CMakeLists.txt @@ -1,27 +1,23 @@ project(EigenLapack CXX) -if( NOT DEFINED EIGEN_Fortran_COMPILER_WORKS OR EIGEN_Fortran_COMPILER_WORKS) +include("../cmake/language_support.cmake") +workaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS) + +if(EIGEN_Fortran_COMPILER_WORKS) enable_language(Fortran OPTIONAL) - - if(CMAKE_Fortran_COMPILER_WORKS) - set(EIGEN_Fortran_COMPILER_WORKS TRUE CACHE INTERNAL "workaround cmake's enable_language issue") - else() - set(EIGEN_Fortran_COMPILER_WORKS FALSE CACHE INTERNAL "workaround cmake's enable_language issue") - endif() - endif() -if(CMAKE_Fortran_COMPILER_WORKS) - add_custom_target(lapack) include_directories(../blas) set(EigenLapack_SRCS -single.cpp double.cpp complex_single.cpp complex_double.cpp +single.cpp double.cpp complex_single.cpp complex_double.cpp ../blas/xerbla.cpp ) +if(EIGEN_Fortran_COMPILER_WORKS) + get_filename_component(eigen_full_path_to_reference_to_reference_lapack "./reference/" ABSOLUTE) if(EXISTS ${eigen_full_path_to_reference_to_reference_lapack}) set(EigenLapack_SRCS ${EigenLapack_SRCS} @@ -357,6 +353,8 @@ reference/ctbcon.f reference/dormhr.f reference/sla_ ) endif() +endif(EIGEN_Fortran_COMPILER_WORKS) + add_library(eigen_lapack_static ${EigenLapack_SRCS}) add_library(eigen_lapack SHARED ${EigenLapack_SRCS}) @@ -365,14 +363,12 @@ if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) target_link_libraries(eigen_lapack ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) endif() -# add_dependencies(lapack eigen_lapack eigen_lapack_static) -add_dependencies(lapack eigen_lapack_static) - -# install(TARGETS eigen_lapack -# RUNTIME DESTINATION bin -# LIBRARY DESTINATION lib -# ARCHIVE DESTINATION lib) +add_dependencies(lapack eigen_lapack eigen_lapack_static) +install(TARGETS eigen_lapack eigen_lapack_static + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) # add_subdirectory(testing) -endif(CMAKE_Fortran_COMPILER_WORKS) + diff --git a/gtsam/3rdparty/Eigen/lapack/cholesky.cpp b/gtsam/3rdparty/Eigen/lapack/cholesky.cpp index c3a72c3c5..c51a8a29b 100644 --- a/gtsam/3rdparty/Eigen/lapack/cholesky.cpp +++ b/gtsam/3rdparty/Eigen/lapack/cholesky.cpp @@ -41,8 +41,8 @@ EIGEN_LAPACK_FUNC(potrf,(char* uplo, int *n, RealScalar *pa, int *lda, int *info Scalar* a = reinterpret_cast(pa); MatrixType A(a,*n,*n,*lda); int ret; - if(UPLO(*uplo)==UP) ret = internal::llt_inplace::blocked(A); - else ret = internal::llt_inplace::blocked(A); + if(UPLO(*uplo)==UP) ret = internal::llt_inplace::blocked(A); + else ret = internal::llt_inplace::blocked(A); if(ret>=0) *info = ret+1; diff --git a/gtsam/3rdparty/Eigen/scripts/eigen_gen_docs b/gtsam/3rdparty/Eigen/scripts/eigen_gen_docs index e97e9ab8f..921d600ed 100644 --- a/gtsam/3rdparty/Eigen/scripts/eigen_gen_docs +++ b/gtsam/3rdparty/Eigen/scripts/eigen_gen_docs @@ -8,14 +8,15 @@ USER=${USER:-'orzel'} #ulimit -v 1024000 # step 1 : build -# todo if 'build is not there, create one: mkdir build -p (cd build && cmake .. && make doc) || { echo "make failed"; exit 1; } -#todo: n+1 where n = number of cpus #step 2 : upload -# (the '/' at the end of path are very important, see rsync documentation) -rsync -az --no-p build/doc/html/ $USER@ssh.tuxfamily.org:eigen/eigen.tuxfamily.org-web/htdocs/dox-3.0/ || { echo "upload failed"; exit 1; } +# (the '/' at the end of path is very important, see rsync documentation) +rsync -az --no-p --delete build/doc/html/ $USER@ssh.tuxfamily.org:eigen/eigen.tuxfamily.org-web/htdocs/dox-devel/ || { echo "upload failed"; exit 1; } + +#step 3 : fix the perm +ssh $USER@ssh.tuxfamily.org 'chmod -R g+w /home/eigen/eigen.tuxfamily.org-web/htdocs/dox-devel' || { echo "perm failed"; exit 1; } echo "Uploaded successfully" diff --git a/gtsam/3rdparty/Eigen/test/CMakeLists.txt b/gtsam/3rdparty/Eigen/test/CMakeLists.txt index fab7de0d4..6f8fc4ae3 100644 --- a/gtsam/3rdparty/Eigen/test/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/test/CMakeLists.txt @@ -1,17 +1,90 @@ -find_package(GSL) -if(GSL_FOUND AND GSL_VERSION_MINOR LESS 9) - set(GSL_FOUND "") -endif(GSL_FOUND AND GSL_VERSION_MINOR LESS 9) -if(GSL_FOUND) - add_definitions("-DHAS_GSL" ${GSL_DEFINITIONS}) - include_directories(${GSL_INCLUDE_DIR}) - ei_add_property(EIGEN_TESTED_BACKENDS "GSL, ") -else(GSL_FOUND) - ei_add_property(EIGEN_MISSING_BACKENDS "GSL, ") - set(GSL_LIBRARIES "") -endif(GSL_FOUND) +# generate split test header file +message(STATUS ${CMAKE_CURRENT_BINARY_DIR}) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h "") +foreach(i RANGE 1 999) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h + "#ifdef EIGEN_TEST_PART_${i}\n" + "#define CALL_SUBTEST_${i}(FUNC) CALL_SUBTEST(FUNC)\n" + "#else\n" + "#define CALL_SUBTEST_${i}(FUNC)\n" + "#endif\n\n" + ) +endforeach() +# configure blas/lapack (use Eigen's ones) +set(BLAS_FOUND TRUE) +set(LAPACK_FOUND TRUE) +set(BLAS_LIBRARIES eigen_blas) +set(LAPACK_LIBRARIES eigen_lapack) + +set(EIGEN_TEST_MATRIX_DIR "" CACHE STRING "Enable testing of realword sparse matrices contained in the specified path") +if(EIGEN_TEST_MATRIX_DIR) + if(NOT WIN32) + message(STATUS "Test realworld sparse matrices: ${EIGEN_TEST_MATRIX_DIR}") + add_definitions( -DTEST_REAL_CASES="${EIGEN_TEST_MATRIX_DIR}" ) + else(NOT WIN32) + message(STATUS "REAL CASES CAN NOT BE CURRENTLY TESTED ON WIN32") + endif(NOT WIN32) +endif(EIGEN_TEST_MATRIX_DIR) + +set(SPARSE_LIBS " ") + +find_package(Cholmod) +if(CHOLMOD_FOUND AND BLAS_FOUND AND LAPACK_FOUND) + add_definitions("-DEIGEN_CHOLMOD_SUPPORT") + include_directories(${CHOLMOD_INCLUDES}) + set(SPARSE_LIBS ${SPARSE_LIBS} ${CHOLMOD_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) + set(CHOLMOD_ALL_LIBS ${CHOLMOD_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) + ei_add_property(EIGEN_TESTED_BACKENDS "Cholmod, ") +else() + ei_add_property(EIGEN_MISSING_BACKENDS "Cholmod, ") +endif() + +find_package(Umfpack) +if(UMFPACK_FOUND AND BLAS_FOUND) + add_definitions("-DEIGEN_UMFPACK_SUPPORT") + include_directories(${UMFPACK_INCLUDES}) + set(SPARSE_LIBS ${SPARSE_LIBS} ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES}) + set(UMFPACK_ALL_LIBS ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES}) + ei_add_property(EIGEN_TESTED_BACKENDS "UmfPack, ") +else() + ei_add_property(EIGEN_MISSING_BACKENDS "UmfPack, ") +endif() + +find_package(SuperLU) +if(SUPERLU_FOUND AND BLAS_FOUND) + add_definitions("-DEIGEN_SUPERLU_SUPPORT") + include_directories(${SUPERLU_INCLUDES}) + set(SPARSE_LIBS ${SPARSE_LIBS} ${SUPERLU_LIBRARIES} ${BLAS_LIBRARIES}) + set(SUPERLU_ALL_LIBS ${SUPERLU_LIBRARIES} ${BLAS_LIBRARIES}) + ei_add_property(EIGEN_TESTED_BACKENDS "SuperLU, ") +else() + ei_add_property(EIGEN_MISSING_BACKENDS "SuperLU, ") +endif() + + +find_package(Pastix) +find_package(Scotch) +find_package(Metis) +if(PASTIX_FOUND AND BLAS_FOUND) + add_definitions("-DEIGEN_PASTIX_SUPPORT") + include_directories(${PASTIX_INCLUDES}) + if(SCOTCH_FOUND) + include_directories(${SCOTCH_INCLUDES}) + set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${SCOTCH_LIBRARIES}) + elseif(METIS_FOUND) + include_directories(${METIS_INCLUDES}) + set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${METIS_LIBRARIES}) + else(SCOTCH_FOUND) + ei_add_property(EIGEN_MISSING_BACKENDS "PaStiX, ") + endif(SCOTCH_FOUND) + set(SPARSE_LIBS ${SPARSE_LIBS} ${PASTIX_LIBRARIES} ${ORDERING_LIBRARIES} ${BLAS_LIBRARIES}) + set(PASTIX_ALL_LIBS ${PASTIX_LIBRARIES} ${BLAS_LIBRARIES}) + ei_add_property(EIGEN_TESTED_BACKENDS "PaStiX, ") +else() + ei_add_property(EIGEN_MISSING_BACKENDS "PaStiX, ") +endif() option(EIGEN_TEST_NOQT "Disable Qt support in unit tests" OFF) if(NOT EIGEN_TEST_NOQT) @@ -75,7 +148,7 @@ ei_add_test(product_mmtr) ei_add_test(product_notemporary) ei_add_test(stable_norm) ei_add_test(bandmatrix) -ei_add_test(cholesky "" "${GSL_LIBRARIES}") +ei_add_test(cholesky) ei_add_test(lu) ei_add_test(determinant) ei_add_test(inverse) @@ -86,8 +159,8 @@ ei_add_test(upperbidiagonalization) ei_add_test(hessenberg) ei_add_test(schur_real) ei_add_test(schur_complex) -ei_add_test(eigensolver_selfadjoint "" "${GSL_LIBRARIES}") -ei_add_test(eigensolver_generic "" "${GSL_LIBRARIES}") +ei_add_test(eigensolver_selfadjoint) +ei_add_test(eigensolver_generic) ei_add_test(eigensolver_complex) ei_add_test(jacobi) ei_add_test(jacobisvd) @@ -110,12 +183,13 @@ endif(QT4_FOUND) ei_add_test(sparse_vector) ei_add_test(sparse_basic) ei_add_test(sparse_product) -ei_add_test(sparse_solvers "" "${SPARSE_LIBS}") +ei_add_test(sparse_solvers) ei_add_test(umeyama) ei_add_test(householder) ei_add_test(swap) ei_add_test(conservative_resize) ei_add_test(permutationmatrices) +ei_add_test(sparse_permutations) ei_add_test(eigen2support) ei_add_test(nullary) ei_add_test(nesting_ops "${CMAKE_CXX_FLAGS_DEBUG}") @@ -123,6 +197,32 @@ ei_add_test(zerosized) ei_add_test(dontalign) ei_add_test(sizeoverflow) ei_add_test(prec_inverse_4x4) +ei_add_test(vectorwiseop) + +ei_add_test(simplicial_cholesky) +ei_add_test(conjugate_gradient) +ei_add_test(bicgstab) + + +if(UMFPACK_FOUND) + ei_add_test(umfpack_support "" "${UMFPACK_ALL_LIBS}") +endif() + +if(SUPERLU_FOUND) + ei_add_test(superlu_support "" "${SUPERLU_ALL_LIBS}") +endif() + +if(CHOLMOD_FOUND) + ei_add_test(cholmod_support "" "${CHOLMOD_ALL_LIBS}") +endif() + +if(PARDISO_FOUND) + ei_add_test(pardiso_support "" "${PARDISO_ALL_LIBS}") +endif() + +if(PASTIX_FOUND AND (SCOTCH_FOUND OR METIS_FOUND)) + ei_add_test(pastix_support "" "${PASTIX_ALL_LIBS}") +endif() string(TOLOWER "${CMAKE_CXX_COMPILER}" cmake_cxx_compiler_tolower) if(cmake_cxx_compiler_tolower MATCHES "qcc") diff --git a/gtsam/3rdparty/Eigen/test/adjoint.cpp b/gtsam/3rdparty/Eigen/test/adjoint.cpp index d8d2aaa1b..140283477 100644 --- a/gtsam/3rdparty/Eigen/test/adjoint.cpp +++ b/gtsam/3rdparty/Eigen/test/adjoint.cpp @@ -43,8 +43,6 @@ template void adjoint(const MatrixType& m) MatrixType m1 = MatrixType::Random(rows, cols), m2 = MatrixType::Random(rows, cols), m3(rows, cols), - mzero = MatrixType::Zero(rows, cols), - identity = SquareMatrixType::Identity(rows, rows), square = SquareMatrixType::Random(rows, rows); VectorType v1 = VectorType::Random(rows), v2 = VectorType::Random(rows), @@ -65,15 +63,23 @@ template void adjoint(const MatrixType& m) // check basic properties of dot, norm, norm2 typedef typename NumTraits::Real RealScalar; - RealScalar ref = NumTraits::IsInteger ? 0 : (std::max)((s1 * v1 + s2 * v2).norm(),v3.norm()); + RealScalar ref = NumTraits::IsInteger ? RealScalar(0) : (std::max)((s1 * v1 + s2 * v2).norm(),v3.norm()); VERIFY(test_isApproxWithRef((s1 * v1 + s2 * v2).dot(v3), internal::conj(s1) * v1.dot(v3) + internal::conj(s2) * v2.dot(v3), ref)); VERIFY(test_isApproxWithRef(v3.dot(s1 * v1 + s2 * v2), s1*v3.dot(v1)+s2*v3.dot(v2), ref)); VERIFY_IS_APPROX(internal::conj(v1.dot(v2)), v2.dot(v1)); VERIFY_IS_APPROX(internal::real(v1.dot(v1)), v1.squaredNorm()); - if(!NumTraits::IsInteger) + if(!NumTraits::IsInteger) { VERIFY_IS_APPROX(v1.squaredNorm(), v1.norm() * v1.norm()); + // check normalized() and normalize() + VERIFY_IS_APPROX(v1, v1.norm() * v1.normalized()); + v3 = v1; + v3.normalize(); + VERIFY_IS_APPROX(v1, v1.norm() * v3); + VERIFY_IS_APPROX(v3, v1.normalized()); + VERIFY_IS_APPROX(v3.norm(), RealScalar(1)); + } VERIFY_IS_MUCH_SMALLER_THAN(internal::abs(vzero.dot(v1)), static_cast(1)); - + // check compatibility of dot and adjoint ref = NumTraits::IsInteger ? 0 : (std::max)((std::max)(v1.norm(),v2.norm()),(std::max)((square * v2).norm(),(square.adjoint() * v1).norm())); @@ -119,11 +125,11 @@ void test_adjoint() CALL_SUBTEST_1( adjoint(Matrix()) ); CALL_SUBTEST_2( adjoint(Matrix3d()) ); CALL_SUBTEST_3( adjoint(Matrix4f()) ); - CALL_SUBTEST_4( adjoint(MatrixXcf(internal::random(1,50), internal::random(1,50))) ); - CALL_SUBTEST_5( adjoint(MatrixXi(internal::random(1,50), internal::random(1,50))) ); - CALL_SUBTEST_6( adjoint(MatrixXf(internal::random(1,50), internal::random(1,50))) ); + CALL_SUBTEST_4( adjoint(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); + CALL_SUBTEST_5( adjoint(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( adjoint(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } - // test a large matrix only once + // test a large static matrix only once CALL_SUBTEST_7( adjoint(Matrix()) ); #ifdef EIGEN_TEST_PART_4 diff --git a/gtsam/3rdparty/Eigen/test/array.cpp b/gtsam/3rdparty/Eigen/test/array.cpp index 6964075ea..912c28c88 100644 --- a/gtsam/3rdparty/Eigen/test/array.cpp +++ b/gtsam/3rdparty/Eigen/test/array.cpp @@ -43,7 +43,7 @@ template void array(const ArrayType& m) RowVectorType rv1 = RowVectorType::Random(cols); Scalar s1 = internal::random(), - s2 = internal::random(); + s2 = internal::random(); // scalar addition VERIFY_IS_APPROX(m1 + s1, s1 + m1); @@ -149,6 +149,12 @@ template void comparisons(const ArrayType& m) // count VERIFY(((m1.abs()+1)>RealScalar(0.1)).count() == rows*cols); + // and/or + VERIFY( (m1RealScalar(0)).count() == 0); + VERIFY( (m1=RealScalar(0)).count() == rows*cols); + RealScalar a = m1.abs().mean(); + VERIFY( (m1<-a || m1>a).count() == (m1.abs()>a).count()); + typedef Array ArrayOfIndices; // TODO allows colwise/rowwise for array @@ -169,7 +175,9 @@ template void array_real(const ArrayType& m) m2 = ArrayType::Random(rows, cols), m3(rows, cols); - // these these are mostly to check possible compilation issues. + Scalar s1 = internal::random(); + + // these tests are mostly to check possible compilation issues. VERIFY_IS_APPROX(m1.sin(), std::sin(m1)); VERIFY_IS_APPROX(m1.sin(), internal::sin(m1)); VERIFY_IS_APPROX(m1.cos(), std::cos(m1)); @@ -180,7 +188,7 @@ template void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.acos(), internal::acos(m1)); VERIFY_IS_APPROX(m1.tan(), std::tan(m1)); VERIFY_IS_APPROX(m1.tan(), internal::tan(m1)); - + VERIFY_IS_APPROX(internal::cos(m1+RealScalar(3)*m2), internal::cos((m1+RealScalar(3)*m2).eval())); VERIFY_IS_APPROX(std::cos(m1+RealScalar(3)*m2), std::cos((m1+RealScalar(3)*m2).eval())); @@ -203,9 +211,67 @@ template void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.pow(2), m1.square()); VERIFY_IS_APPROX(std::pow(m1,2), m1.square()); + + ArrayType exponents = ArrayType::Constant(rows, cols, RealScalar(2)); + VERIFY_IS_APPROX(std::pow(m1,exponents), m1.square()); + m3 = m1.abs(); VERIFY_IS_APPROX(m3.pow(RealScalar(0.5)), m3.sqrt()); VERIFY_IS_APPROX(std::pow(m3,RealScalar(0.5)), m3.sqrt()); + + // scalar by array division + const RealScalar tiny = std::sqrt(std::numeric_limits::epsilon()); + s1 += Scalar(tiny); + m1 += ArrayType::Constant(rows,cols,Scalar(tiny)); + VERIFY_IS_APPROX(s1/m1, s1 * m1.inverse()); +} + +template void array_complex(const ArrayType& m) +{ + typedef typename ArrayType::Index Index; + + Index rows = m.rows(); + Index cols = m.cols(); + + ArrayType m1 = ArrayType::Random(rows, cols), + m2(rows, cols); + + for (Index i = 0; i < m.rows(); ++i) + for (Index j = 0; j < m.cols(); ++j) + m2(i,j) = std::sqrt(m1(i,j)); + + VERIFY_IS_APPROX(m1.sqrt(), m2); + VERIFY_IS_APPROX(m1.sqrt(), std::sqrt(m1)); + VERIFY_IS_APPROX(m1.sqrt(), internal::sqrt(m1)); +} + +template void min_max(const ArrayType& m) +{ + typedef typename ArrayType::Index Index; + typedef typename ArrayType::Scalar Scalar; + + Index rows = m.rows(); + Index cols = m.cols(); + + ArrayType m1 = ArrayType::Random(rows, cols); + + // min/max with array + Scalar maxM1 = m1.maxCoeff(); + Scalar minM1 = m1.minCoeff(); + + VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)(ArrayType::Constant(rows,cols, minM1))); + VERIFY_IS_APPROX(m1, (m1.min)(ArrayType::Constant(rows,cols, maxM1))); + + VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)(ArrayType::Constant(rows,cols, maxM1))); + VERIFY_IS_APPROX(m1, (m1.max)(ArrayType::Constant(rows,cols, minM1))); + + // min/max with scalar input + VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)( minM1)); + VERIFY_IS_APPROX(m1, (m1.min)( maxM1)); + + VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)( maxM1)); + VERIFY_IS_APPROX(m1, (m1.max)( minM1)); + } void test_array() @@ -214,22 +280,32 @@ void test_array() CALL_SUBTEST_1( array(Array()) ); CALL_SUBTEST_2( array(Array22f()) ); CALL_SUBTEST_3( array(Array44d()) ); - CALL_SUBTEST_4( array(ArrayXXcf(3, 3)) ); - CALL_SUBTEST_5( array(ArrayXXf(8, 12)) ); - CALL_SUBTEST_6( array(ArrayXXi(8, 12)) ); + CALL_SUBTEST_4( array(ArrayXXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_5( array(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( array(ArrayXXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( comparisons(Array()) ); CALL_SUBTEST_2( comparisons(Array22f()) ); CALL_SUBTEST_3( comparisons(Array44d()) ); - CALL_SUBTEST_5( comparisons(ArrayXXf(8, 12)) ); - CALL_SUBTEST_6( comparisons(ArrayXXi(8, 12)) ); + CALL_SUBTEST_5( comparisons(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( comparisons(ArrayXXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + } + for(int i = 0; i < g_repeat; i++) { + CALL_SUBTEST_1( min_max(Array()) ); + CALL_SUBTEST_2( min_max(Array22f()) ); + CALL_SUBTEST_3( min_max(Array44d()) ); + CALL_SUBTEST_5( min_max(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( min_max(ArrayXXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( array_real(Array()) ); CALL_SUBTEST_2( array_real(Array22f()) ); CALL_SUBTEST_3( array_real(Array44d()) ); - CALL_SUBTEST_5( array_real(ArrayXXf(8, 12)) ); + CALL_SUBTEST_5( array_real(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + } + for(int i = 0; i < g_repeat; i++) { + CALL_SUBTEST_4( array_complex(ArrayXXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } VERIFY((internal::is_same< internal::global_math_functions_filtering_base::type, int >::value)); diff --git a/gtsam/3rdparty/Eigen/test/array_for_matrix.cpp b/gtsam/3rdparty/Eigen/test/array_for_matrix.cpp index 45e0930ce..465b8998b 100644 --- a/gtsam/3rdparty/Eigen/test/array_for_matrix.cpp +++ b/gtsam/3rdparty/Eigen/test/array_for_matrix.cpp @@ -156,30 +156,65 @@ template void lpNorm(const VectorType& v) VERIFY_IS_APPROX(internal::pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.array().abs().pow(5).sum()); } +template void cwise_min_max(const MatrixType& m) +{ + typedef typename MatrixType::Index Index; + typedef typename MatrixType::Scalar Scalar; + + Index rows = m.rows(); + Index cols = m.cols(); + + MatrixType m1 = MatrixType::Random(rows, cols); + + // min/max with array + Scalar maxM1 = m1.maxCoeff(); + Scalar minM1 = m1.minCoeff(); + + VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin(MatrixType::Constant(rows,cols, minM1))); + VERIFY_IS_APPROX(m1, m1.cwiseMin(MatrixType::Constant(rows,cols, maxM1))); + + VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax(MatrixType::Constant(rows,cols, maxM1))); + VERIFY_IS_APPROX(m1, m1.cwiseMax(MatrixType::Constant(rows,cols, minM1))); + + // min/max with scalar input + VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin( minM1)); + VERIFY_IS_APPROX(m1, m1.cwiseMin( maxM1)); + + VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax( maxM1)); + VERIFY_IS_APPROX(m1, m1.cwiseMax( minM1)); + +} + void test_array_for_matrix() { - int maxsize = 40; for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( array_for_matrix(Matrix()) ); CALL_SUBTEST_2( array_for_matrix(Matrix2f()) ); CALL_SUBTEST_3( array_for_matrix(Matrix4d()) ); - CALL_SUBTEST_4( array_for_matrix(MatrixXcf(internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_5( array_for_matrix(MatrixXf(internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_6( array_for_matrix(MatrixXi(internal::random(1,maxsize), internal::random(1,maxsize))) ); + CALL_SUBTEST_4( array_for_matrix(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_5( array_for_matrix(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( array_for_matrix(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( comparisons(Matrix()) ); CALL_SUBTEST_2( comparisons(Matrix2f()) ); CALL_SUBTEST_3( comparisons(Matrix4d()) ); - CALL_SUBTEST_5( comparisons(MatrixXf(internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_6( comparisons(MatrixXi(internal::random(1,maxsize), internal::random(1,maxsize))) ); + CALL_SUBTEST_5( comparisons(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( comparisons(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + } + for(int i = 0; i < g_repeat; i++) { + CALL_SUBTEST_1( cwise_min_max(Matrix()) ); + CALL_SUBTEST_2( cwise_min_max(Matrix2f()) ); + CALL_SUBTEST_3( cwise_min_max(Matrix4d()) ); + CALL_SUBTEST_5( cwise_min_max(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( cwise_min_max(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( lpNorm(Matrix()) ); CALL_SUBTEST_2( lpNorm(Vector2f()) ); CALL_SUBTEST_7( lpNorm(Vector3d()) ); CALL_SUBTEST_8( lpNorm(Vector4f()) ); - CALL_SUBTEST_5( lpNorm(VectorXf(internal::random(1,maxsize))) ); - CALL_SUBTEST_4( lpNorm(VectorXcf(internal::random(1,maxsize))) ); + CALL_SUBTEST_5( lpNorm(VectorXf(internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_4( lpNorm(VectorXcf(internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } } diff --git a/gtsam/3rdparty/Eigen/test/basicstuff.cpp b/gtsam/3rdparty/Eigen/test/basicstuff.cpp index 9f3966818..76ecffd68 100644 --- a/gtsam/3rdparty/Eigen/test/basicstuff.cpp +++ b/gtsam/3rdparty/Eigen/test/basicstuff.cpp @@ -42,11 +42,8 @@ template void basicStuff(const MatrixType& m) m2 = MatrixType::Random(rows, cols), m3(rows, cols), mzero = MatrixType::Zero(rows, cols), - identity = Matrix - ::Identity(rows, rows), square = Matrix::Random(rows, rows); VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), vzero = VectorType::Zero(rows); SquareMatrixType sm1 = SquareMatrixType::Random(rows,rows), sm2(rows,rows); @@ -215,14 +212,14 @@ void test_basicstuff() for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( basicStuff(Matrix()) ); CALL_SUBTEST_2( basicStuff(Matrix4d()) ); - CALL_SUBTEST_3( basicStuff(MatrixXcf(internal::random(1,100), internal::random(1,100))) ); - CALL_SUBTEST_4( basicStuff(MatrixXi(internal::random(1,100), internal::random(1,100))) ); - CALL_SUBTEST_5( basicStuff(MatrixXcd(internal::random(1,100), internal::random(1,100))) ); + CALL_SUBTEST_3( basicStuff(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_4( basicStuff(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_5( basicStuff(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); CALL_SUBTEST_6( basicStuff(Matrix()) ); - CALL_SUBTEST_7( basicStuff(Matrix(internal::random(1,100),internal::random(1,100))) ); + CALL_SUBTEST_7( basicStuff(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_3( basicStuffComplex(MatrixXcf(internal::random(1,100), internal::random(1,100))) ); - CALL_SUBTEST_5( basicStuffComplex(MatrixXcd(internal::random(1,100), internal::random(1,100))) ); + CALL_SUBTEST_3( basicStuffComplex(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_5( basicStuffComplex(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } CALL_SUBTEST_1(fixedSizeMatrixConstruction()); diff --git a/gtsam/3rdparty/Eigen/test/bicgstab.cpp b/gtsam/3rdparty/Eigen/test/bicgstab.cpp new file mode 100644 index 000000000..2b6403583 --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/bicgstab.cpp @@ -0,0 +1,45 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse_solver.h" +#include + +template void test_bicgstab_T() +{ + BiCGSTAB, DiagonalPreconditioner > bicgstab_colmajor_diag; + BiCGSTAB, IdentityPreconditioner > bicgstab_colmajor_I; + BiCGSTAB, IncompleteLUT > bicgstab_colmajor_ilut; + //BiCGSTAB, SSORPreconditioner > bicgstab_colmajor_ssor; + + CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_diag) ); +// CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_I) ); + CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_ilut) ); + //CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_ssor) ); +} + +void test_bicgstab() +{ + CALL_SUBTEST_1(test_bicgstab_T()); + CALL_SUBTEST_2(test_bicgstab_T >()); +} diff --git a/gtsam/3rdparty/Eigen/test/block.cpp b/gtsam/3rdparty/Eigen/test/block.cpp index 70852ee48..07d5ce792 100644 --- a/gtsam/3rdparty/Eigen/test/block.cpp +++ b/gtsam/3rdparty/Eigen/test/block.cpp @@ -42,12 +42,8 @@ template void block(const MatrixType& m) m1_copy = m1, m2 = MatrixType::Random(rows, cols), m3(rows, cols), - mzero = MatrixType::Zero(rows, cols), ones = MatrixType::Ones(rows, cols); - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), - v3 = VectorType::Random(rows), - vzero = VectorType::Zero(rows); + VectorType v1 = VectorType::Random(rows); Scalar s1 = internal::random(); diff --git a/gtsam/3rdparty/Eigen/test/cholesky.cpp b/gtsam/3rdparty/Eigen/test/cholesky.cpp index ae4342cee..4f2516d26 100644 --- a/gtsam/3rdparty/Eigen/test/cholesky.cpp +++ b/gtsam/3rdparty/Eigen/test/cholesky.cpp @@ -41,9 +41,37 @@ static int nb_temporaries; VERIFY( (#XPR) && nb_temporaries==N ); \ } -#ifdef HAS_GSL -#include "gsl_helper.h" -#endif +template class CholType> void test_chol_update(const MatrixType& symm) +{ + typedef typename MatrixType::Scalar Scalar; + typedef typename MatrixType::RealScalar RealScalar; + typedef Matrix VectorType; + + MatrixType symmLo = symm.template triangularView(); + MatrixType symmUp = symm.template triangularView(); + MatrixType symmCpy = symm; + + CholType chollo(symmLo); + CholType cholup(symmUp); + + for (int k=0; k<10; ++k) + { + VectorType vec = VectorType::Random(symm.rows()); + RealScalar sigma = internal::random(); + symmCpy += sigma * vec * vec.adjoint(); + + // we are doing some downdates, so it might be the case that the matrix is not SPD anymore + CholType chol(symmCpy); + if(chol.info()!=Success) + break; + + chollo.rankUpdate(vec, sigma); + VERIFY_IS_APPROX(symmCpy, chollo.reconstructedMatrix()); + + cholup.rankUpdate(vec, sigma); + VERIFY_IS_APPROX(symmCpy, cholup.reconstructedMatrix()); + } +} template void cholesky(const MatrixType& m) { @@ -77,34 +105,6 @@ template void cholesky(const MatrixType& m) // FIXME: currently that fails !! //symm.template part().setZero(); - #ifdef HAS_GSL -// if (internal::is_same::value) -// { -// typedef GslTraits Gsl; -// typename Gsl::Matrix gMatA=0, gSymm=0; -// typename Gsl::Vector gVecB=0, gVecX=0; -// convert(symm, gSymm); -// convert(symm, gMatA); -// convert(vecB, gVecB); -// convert(vecB, gVecX); -// Gsl::cholesky(gMatA); -// Gsl::cholesky_solve(gMatA, gVecB, gVecX); -// VectorType vecX(rows), _vecX, _vecB; -// convert(gVecX, _vecX); -// symm.llt().solve(vecB, &vecX); -// Gsl::prod(gSymm, gVecX, gVecB); -// convert(gVecB, _vecB); -// // test gsl itself ! -// VERIFY_IS_APPROX(vecB, _vecB); -// VERIFY_IS_APPROX(vecX, _vecX); -// -// Gsl::free(gMatA); -// Gsl::free(gSymm); -// Gsl::free(gVecB); -// Gsl::free(gVecX); -// } - #endif - { LLT chollo(symmLo); VERIFY_IS_APPROX(symm, chollo.reconstructedMatrix()); @@ -124,6 +124,11 @@ template void cholesky(const MatrixType& m) MatrixType neg = -symmLo; chollo.compute(neg); VERIFY(chollo.info()==NumericalIssue); + + VERIFY_IS_APPROX(MatrixType(chollo.matrixL().transpose().conjugate()), MatrixType(chollo.matrixU())); + VERIFY_IS_APPROX(MatrixType(chollo.matrixU().transpose().conjugate()), MatrixType(chollo.matrixL())); + VERIFY_IS_APPROX(MatrixType(cholup.matrixL().transpose().conjugate()), MatrixType(cholup.matrixU())); + VERIFY_IS_APPROX(MatrixType(cholup.matrixU().transpose().conjugate()), MatrixType(cholup.matrixL())); } // LDLT @@ -152,6 +157,11 @@ template void cholesky(const MatrixType& m) matX = ldltup.solve(matB); VERIFY_IS_APPROX(symm * matX, matB); + VERIFY_IS_APPROX(MatrixType(ldltlo.matrixL().transpose().conjugate()), MatrixType(ldltlo.matrixU())); + VERIFY_IS_APPROX(MatrixType(ldltlo.matrixU().transpose().conjugate()), MatrixType(ldltlo.matrixL())); + VERIFY_IS_APPROX(MatrixType(ldltup.matrixL().transpose().conjugate()), MatrixType(ldltup.matrixU())); + VERIFY_IS_APPROX(MatrixType(ldltup.matrixU().transpose().conjugate()), MatrixType(ldltup.matrixL())); + if(MatrixType::RowsAtCompileTime==Dynamic) { // note : each inplace permutation requires a small temporary vector (mask) @@ -166,6 +176,10 @@ template void cholesky(const MatrixType& m) VERIFY_EVALUATION_COUNT(matX = ldltup.solve(matX), 0); VERIFY_IS_APPROX(matX, ldltup.solve(matB).eval()); } + + // restore + if(sign == -1) + symm = -symm; } // test some special use cases of SelfCwiseBinaryOp: @@ -182,7 +196,10 @@ template void cholesky(const MatrixType& m) m2 = m1; m2.noalias() -= symmLo.template selfadjointView().llt().solve(matB); VERIFY_IS_APPROX(m2, m1 - symmLo.template selfadjointView().llt().solve(matB)); - + + // update/downdate + CALL_SUBTEST(( test_chol_update(symm) )); + CALL_SUBTEST(( test_chol_update(symm) )); } template void cholesky_cplx(const MatrixType& m) @@ -242,7 +259,6 @@ template void cholesky_cplx(const MatrixType& m) // matX = ldltlo.solve(matB); // VERIFY_IS_APPROX(symm * matX, matB); } - } // regression test for bug 241 @@ -290,9 +306,9 @@ void test_cholesky() CALL_SUBTEST_3( cholesky_bug241(Matrix2d()) ); CALL_SUBTEST_4( cholesky(Matrix3f()) ); CALL_SUBTEST_5( cholesky(Matrix4d()) ); - s = internal::random(1,200); + s = internal::random(1,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_2( cholesky(MatrixXd(s,s)) ); - s = internal::random(1,100); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_6( cholesky_cplx(MatrixXcd(s,s)) ); } @@ -304,4 +320,6 @@ void test_cholesky() // Test problem size constructors CALL_SUBTEST_9( LLT(10) ); CALL_SUBTEST_9( LDLT(10) ); + + EIGEN_UNUSED_VARIABLE(s) } diff --git a/gtsam/3rdparty/Eigen/test/cholmod_support.cpp b/gtsam/3rdparty/Eigen/test/cholmod_support.cpp new file mode 100644 index 000000000..1ebba2438 --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/cholmod_support.cpp @@ -0,0 +1,71 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse_solver.h" + +#include + +template void test_cholmod_T() +{ + CholmodDecomposition, Lower> g_chol_colmajor_lower; g_chol_colmajor_lower.setMode(CholmodSupernodalLLt); + CholmodDecomposition, Upper> g_chol_colmajor_upper; g_chol_colmajor_upper.setMode(CholmodSupernodalLLt); + CholmodDecomposition, Lower> g_llt_colmajor_lower; g_llt_colmajor_lower.setMode(CholmodSimplicialLLt); + CholmodDecomposition, Upper> g_llt_colmajor_upper; g_llt_colmajor_upper.setMode(CholmodSimplicialLLt); + CholmodDecomposition, Lower> g_ldlt_colmajor_lower; g_ldlt_colmajor_lower.setMode(CholmodLDLt); + CholmodDecomposition, Upper> g_ldlt_colmajor_upper; g_ldlt_colmajor_upper.setMode(CholmodLDLt); + + CholmodSupernodalLLT, Lower> chol_colmajor_lower; + CholmodSupernodalLLT, Upper> chol_colmajor_upper; + CholmodSimplicialLLT, Lower> llt_colmajor_lower; + CholmodSimplicialLLT, Upper> llt_colmajor_upper; + CholmodSimplicialLDLT, Lower> ldlt_colmajor_lower; + CholmodSimplicialLDLT, Upper> ldlt_colmajor_upper; + + check_sparse_spd_solving(g_chol_colmajor_lower); + check_sparse_spd_solving(g_chol_colmajor_upper); + check_sparse_spd_solving(g_llt_colmajor_lower); + check_sparse_spd_solving(g_llt_colmajor_upper); + check_sparse_spd_solving(g_ldlt_colmajor_lower); + check_sparse_spd_solving(g_ldlt_colmajor_upper); + + check_sparse_spd_solving(chol_colmajor_lower); + check_sparse_spd_solving(chol_colmajor_upper); + check_sparse_spd_solving(llt_colmajor_lower); + check_sparse_spd_solving(llt_colmajor_upper); + check_sparse_spd_solving(ldlt_colmajor_lower); + check_sparse_spd_solving(ldlt_colmajor_upper); + +// check_sparse_spd_determinant(chol_colmajor_lower); +// check_sparse_spd_determinant(chol_colmajor_upper); +// check_sparse_spd_determinant(llt_colmajor_lower); +// check_sparse_spd_determinant(llt_colmajor_upper); +// check_sparse_spd_determinant(ldlt_colmajor_lower); +// check_sparse_spd_determinant(ldlt_colmajor_upper); +} + +void test_cholmod_support() +{ + CALL_SUBTEST_1(test_cholmod_T()); + CALL_SUBTEST_2(test_cholmod_T >()); +} diff --git a/gtsam/3rdparty/Eigen/test/conjugate_gradient.cpp b/gtsam/3rdparty/Eigen/test/conjugate_gradient.cpp new file mode 100644 index 000000000..f24f35817 --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/conjugate_gradient.cpp @@ -0,0 +1,45 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse_solver.h" +#include + +template void test_conjugate_gradient_T() +{ + ConjugateGradient, Lower> cg_colmajor_lower_diag; + ConjugateGradient, Upper> cg_colmajor_upper_diag; + ConjugateGradient, Lower, IdentityPreconditioner> cg_colmajor_lower_I; + ConjugateGradient, Upper, IdentityPreconditioner> cg_colmajor_upper_I; + + CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_lower_diag) ); + CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_upper_diag) ); + CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_lower_I) ); + CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_upper_I) ); +} + +void test_conjugate_gradient() +{ + CALL_SUBTEST_1(test_conjugate_gradient_T()); + CALL_SUBTEST_2(test_conjugate_gradient_T >()); +} diff --git a/gtsam/3rdparty/Eigen/test/cwiseop.cpp b/gtsam/3rdparty/Eigen/test/cwiseop.cpp index 07ef599be..b3ca94e3a 100644 --- a/gtsam/3rdparty/Eigen/test/cwiseop.cpp +++ b/gtsam/3rdparty/Eigen/test/cwiseop.cpp @@ -60,11 +60,8 @@ template void cwiseops(const MatrixType& m) mzero = MatrixType::Zero(rows, cols), mones = MatrixType::Ones(rows, cols), identity = Matrix - ::Identity(rows, rows), - square = Matrix::Random(rows, rows); - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), - vzero = VectorType::Zero(rows), + ::Identity(rows, rows); + VectorType vzero = VectorType::Zero(rows), vones = VectorType::Ones(rows), v3(rows); @@ -175,9 +172,9 @@ void test_cwiseop() for(int i = 0; i < g_repeat ; i++) { CALL_SUBTEST_1( cwiseops(Matrix()) ); CALL_SUBTEST_2( cwiseops(Matrix4d()) ); - CALL_SUBTEST_3( cwiseops(MatrixXf(3, 3)) ); - CALL_SUBTEST_4( cwiseops(MatrixXf(22, 22)) ); - CALL_SUBTEST_5( cwiseops(MatrixXi(8, 12)) ); - CALL_SUBTEST_6( cwiseops(MatrixXd(20, 20)) ); + CALL_SUBTEST_3( cwiseops(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_4( cwiseops(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_5( cwiseops(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( cwiseops(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } } diff --git a/gtsam/3rdparty/Eigen/test/determinant.cpp b/gtsam/3rdparty/Eigen/test/determinant.cpp index dcf64387d..6c8d3baab 100644 --- a/gtsam/3rdparty/Eigen/test/determinant.cpp +++ b/gtsam/3rdparty/Eigen/test/determinant.cpp @@ -68,13 +68,15 @@ template void determinant(const MatrixType& m) void test_determinant() { + int s; for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( determinant(Matrix()) ); CALL_SUBTEST_2( determinant(Matrix()) ); CALL_SUBTEST_3( determinant(Matrix()) ); CALL_SUBTEST_4( determinant(Matrix()) ); CALL_SUBTEST_5( determinant(Matrix, 10, 10>()) ); - CALL_SUBTEST_6( determinant(MatrixXd(20, 20)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_6( determinant(MatrixXd(s, s)) ); } - CALL_SUBTEST_6( determinant(MatrixXd(200, 200)) ); + EIGEN_UNUSED_VARIABLE(s) } diff --git a/gtsam/3rdparty/Eigen/test/diagonal.cpp b/gtsam/3rdparty/Eigen/test/diagonal.cpp index 50b341dfe..94a30e2f4 100644 --- a/gtsam/3rdparty/Eigen/test/diagonal.cpp +++ b/gtsam/3rdparty/Eigen/test/diagonal.cpp @@ -74,10 +74,10 @@ void test_diagonal() for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( diagonal(Matrix()) ); CALL_SUBTEST_2( diagonal(Matrix4d()) ); - CALL_SUBTEST_2( diagonal(MatrixXcf(3, 3)) ); - CALL_SUBTEST_2( diagonal(MatrixXi(8, 12)) ); - CALL_SUBTEST_2( diagonal(MatrixXcd(20, 20)) ); - CALL_SUBTEST_1( diagonal(MatrixXf(21, 19)) ); + CALL_SUBTEST_2( diagonal(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_2( diagonal(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_2( diagonal(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_1( diagonal(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); CALL_SUBTEST_1( diagonal(Matrix(3, 4)) ); } } diff --git a/gtsam/3rdparty/Eigen/test/diagonalmatrices.cpp b/gtsam/3rdparty/Eigen/test/diagonalmatrices.cpp index 9d6f069c6..d84f4e9f3 100644 --- a/gtsam/3rdparty/Eigen/test/diagonalmatrices.cpp +++ b/gtsam/3rdparty/Eigen/test/diagonalmatrices.cpp @@ -101,9 +101,9 @@ void test_diagonalmatrices() CALL_SUBTEST_3( diagonalmatrices(Matrix()) ); CALL_SUBTEST_4( diagonalmatrices(Matrix4d()) ); CALL_SUBTEST_5( diagonalmatrices(Matrix()) ); - CALL_SUBTEST_6( diagonalmatrices(MatrixXcf(3, 5)) ); - CALL_SUBTEST_7( diagonalmatrices(MatrixXi(10, 8)) ); - CALL_SUBTEST_8( diagonalmatrices(Matrix(20, 20)) ); - CALL_SUBTEST_9( diagonalmatrices(MatrixXf(21, 24)) ); + CALL_SUBTEST_6( diagonalmatrices(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_7( diagonalmatrices(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_8( diagonalmatrices(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_9( diagonalmatrices(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } } diff --git a/gtsam/3rdparty/Eigen/test/eigen2/main.h b/gtsam/3rdparty/Eigen/test/eigen2/main.h index b361a44d9..9d0defa39 100644 --- a/gtsam/3rdparty/Eigen/test/eigen2/main.h +++ b/gtsam/3rdparty/Eigen/test/eigen2/main.h @@ -29,10 +29,6 @@ #include #include -#ifdef NDEBUG -#undef NDEBUG -#endif - #ifndef EIGEN_TEST_FUNC #error EIGEN_TEST_FUNC must be defined #endif diff --git a/gtsam/3rdparty/Eigen/test/eigen2support.cpp b/gtsam/3rdparty/Eigen/test/eigen2support.cpp index a7269fed5..5d0202e34 100644 --- a/gtsam/3rdparty/Eigen/test/eigen2support.cpp +++ b/gtsam/3rdparty/Eigen/test/eigen2support.cpp @@ -35,7 +35,6 @@ template void eigen2support(const MatrixType& m) Index cols = m.cols(); MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), m3(rows, cols); Scalar s1 = internal::random(), diff --git a/gtsam/3rdparty/Eigen/test/eigensolver_complex.cpp b/gtsam/3rdparty/Eigen/test/eigensolver_complex.cpp index 99e9ee864..1cd55a2cd 100644 --- a/gtsam/3rdparty/Eigen/test/eigensolver_complex.cpp +++ b/gtsam/3rdparty/Eigen/test/eigensolver_complex.cpp @@ -108,18 +108,23 @@ template void eigensolver_verify_assert(const MatrixType& m void test_eigensolver_complex() { + int s; for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( eigensolver(Matrix4cf()) ); - CALL_SUBTEST_2( eigensolver(MatrixXcd(14,14)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_2( eigensolver(MatrixXcd(s,s)) ); CALL_SUBTEST_3( eigensolver(Matrix, 1, 1>()) ); CALL_SUBTEST_4( eigensolver(Matrix3f()) ); } CALL_SUBTEST_1( eigensolver_verify_assert(Matrix4cf()) ); - CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXcd(14,14)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXcd(s,s)) ); CALL_SUBTEST_3( eigensolver_verify_assert(Matrix, 1, 1>()) ); CALL_SUBTEST_4( eigensolver_verify_assert(Matrix3f()) ); // Test problem size constructors - CALL_SUBTEST_5(ComplexEigenSolver(10)); + CALL_SUBTEST_5(ComplexEigenSolver(s)); + + EIGEN_UNUSED_VARIABLE(s) } diff --git a/gtsam/3rdparty/Eigen/test/eigensolver_generic.cpp b/gtsam/3rdparty/Eigen/test/eigensolver_generic.cpp index 8476f026d..2e9cdc7a5 100644 --- a/gtsam/3rdparty/Eigen/test/eigensolver_generic.cpp +++ b/gtsam/3rdparty/Eigen/test/eigensolver_generic.cpp @@ -27,10 +27,6 @@ #include #include -#ifdef HAS_GSL -#include "gsl_helper.h" -#endif - template void eigensolver(const MatrixType& m) { typedef typename MatrixType::Index Index; @@ -97,9 +93,11 @@ template void eigensolver_verify_assert(const MatrixType& m void test_eigensolver_generic() { + int s; for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( eigensolver(Matrix4f()) ); - CALL_SUBTEST_2( eigensolver(MatrixXd(17,17)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_2( eigensolver(MatrixXd(s,s)) ); // some trivial but implementation-wise tricky cases CALL_SUBTEST_2( eigensolver(MatrixXd(1,1)) ); @@ -109,10 +107,24 @@ void test_eigensolver_generic() } CALL_SUBTEST_1( eigensolver_verify_assert(Matrix4f()) ); - CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXd(17,17)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXd(s,s)) ); CALL_SUBTEST_3( eigensolver_verify_assert(Matrix()) ); CALL_SUBTEST_4( eigensolver_verify_assert(Matrix2d()) ); // Test problem size constructors - CALL_SUBTEST_5(EigenSolver(10)); + CALL_SUBTEST_5(EigenSolver(s)); + + // regression test for bug 410 + CALL_SUBTEST_2( + { + MatrixXd A(1,1); + A(0,0) = std::sqrt(-1.); + Eigen::EigenSolver solver(A); + MatrixXd V(1, 1); + V(0,0) = solver.eigenvectors()(0,0).real(); + } + ); + + EIGEN_UNUSED_VARIABLE(s) } diff --git a/gtsam/3rdparty/Eigen/test/eigensolver_selfadjoint.cpp b/gtsam/3rdparty/Eigen/test/eigensolver_selfadjoint.cpp index b85bcc289..26d3d1f70 100644 --- a/gtsam/3rdparty/Eigen/test/eigensolver_selfadjoint.cpp +++ b/gtsam/3rdparty/Eigen/test/eigensolver_selfadjoint.cpp @@ -27,10 +27,6 @@ #include #include -#ifdef HAS_GSL -#include "gsl_helper.h" -#endif - template void selfadjointeigensolver(const MatrixType& m) { typedef typename MatrixType::Index Index; @@ -59,64 +55,25 @@ template void selfadjointeigensolver(const MatrixType& m) symmB.template triangularView().setZero(); SelfAdjointEigenSolver eiSymm(symmA); + SelfAdjointEigenSolver eiDirect; + eiDirect.computeDirect(symmA); // generalized eigen pb GeneralizedSelfAdjointEigenSolver eiSymmGen(symmA, symmB); - #ifdef HAS_GSL - if (internal::is_same::value) - { - // restore symmA and symmB. - symmA = MatrixType(symmA.template selfadjointView()); - symmB = MatrixType(symmB.template selfadjointView()); - typedef GslTraits Gsl; - typename Gsl::Matrix gEvec=0, gSymmA=0, gSymmB=0; - typename GslTraits::Vector gEval=0; - RealVectorType _eval; - MatrixType _evec; - convert(symmA, gSymmA); - convert(symmB, gSymmB); - convert(symmA, gEvec); - gEval = GslTraits::createVector(rows); - - Gsl::eigen_symm(gSymmA, gEval, gEvec); - convert(gEval, _eval); - convert(gEvec, _evec); - - // test gsl itself ! - VERIFY((symmA * _evec).isApprox(_evec * _eval.asDiagonal(), largerEps)); - - // compare with eigen - VERIFY_IS_APPROX(_eval, eiSymm.eigenvalues()); - VERIFY_IS_APPROX(_evec.cwiseAbs(), eiSymm.eigenvectors().cwiseAbs()); - - // generalized pb - Gsl::eigen_symm_gen(gSymmA, gSymmB, gEval, gEvec); - convert(gEval, _eval); - convert(gEvec, _evec); - // test GSL itself: - VERIFY((symmA * _evec).isApprox(symmB * (_evec * _eval.asDiagonal()), largerEps)); - - // compare with eigen - MatrixType normalized_eivec = eiSymmGen.eigenvectors()*eiSymmGen.eigenvectors().colwise().norm().asDiagonal().inverse(); - VERIFY_IS_APPROX(_eval, eiSymmGen.eigenvalues()); - VERIFY_IS_APPROX(_evec.cwiseAbs(), normalized_eivec.cwiseAbs()); - - Gsl::free(gSymmA); - Gsl::free(gSymmB); - GslTraits::free(gEval); - Gsl::free(gEvec); - } - #endif - VERIFY_IS_EQUAL(eiSymm.info(), Success); VERIFY((symmA.template selfadjointView() * eiSymm.eigenvectors()).isApprox( eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal(), largerEps)); VERIFY_IS_APPROX(symmA.template selfadjointView().eigenvalues(), eiSymm.eigenvalues()); + + VERIFY_IS_EQUAL(eiDirect.info(), Success); + VERIFY((symmA.template selfadjointView() * eiDirect.eigenvectors()).isApprox( + eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal(), largerEps)); + VERIFY_IS_APPROX(symmA.template selfadjointView().eigenvalues(), eiDirect.eigenvalues()); SelfAdjointEigenSolver eiSymmNoEivecs(symmA, false); VERIFY_IS_EQUAL(eiSymmNoEivecs.info(), Success); VERIFY_IS_APPROX(eiSymm.eigenvalues(), eiSymmNoEivecs.eigenvalues()); - + // generalized eigen problem Ax = lBx eiSymmGen.compute(symmA, symmB,Ax_lBx); VERIFY_IS_EQUAL(eiSymmGen.info(), Success); @@ -171,15 +128,21 @@ template void selfadjointeigensolver(const MatrixType& m) void test_eigensolver_selfadjoint() { + int s; for(int i = 0; i < g_repeat; i++) { - // very important to test a 3x3 matrix since we provide a special path for it + // very important to test 3x3 and 2x2 matrices since we provide special paths for them + CALL_SUBTEST_1( selfadjointeigensolver(Matrix2d()) ); CALL_SUBTEST_1( selfadjointeigensolver(Matrix3f()) ); CALL_SUBTEST_2( selfadjointeigensolver(Matrix4d()) ); - CALL_SUBTEST_3( selfadjointeigensolver(MatrixXf(10,10)) ); - CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(19,19)) ); - CALL_SUBTEST_5( selfadjointeigensolver(MatrixXcd(17,17)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_3( selfadjointeigensolver(MatrixXf(s,s)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(s,s)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_5( selfadjointeigensolver(MatrixXcd(s,s)) ); - CALL_SUBTEST_9( selfadjointeigensolver(Matrix,Dynamic,Dynamic,RowMajor>(17,17)) ); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_9( selfadjointeigensolver(Matrix,Dynamic,Dynamic,RowMajor>(s,s)) ); // some trivial but implementation-wise tricky cases CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(1,1)) ); @@ -189,7 +152,10 @@ void test_eigensolver_selfadjoint() } // Test problem size constructors - CALL_SUBTEST_8(SelfAdjointEigenSolver(10)); - CALL_SUBTEST_8(Tridiagonalization(10)); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); + CALL_SUBTEST_8(SelfAdjointEigenSolver(s)); + CALL_SUBTEST_8(Tridiagonalization(s)); + + EIGEN_UNUSED_VARIABLE(s) } diff --git a/gtsam/3rdparty/Eigen/test/geo_alignedbox.cpp b/gtsam/3rdparty/Eigen/test/geo_alignedbox.cpp index 738ca3150..724133725 100644 --- a/gtsam/3rdparty/Eigen/test/geo_alignedbox.cpp +++ b/gtsam/3rdparty/Eigen/test/geo_alignedbox.cpp @@ -113,7 +113,7 @@ void specificTest1() Vector2f m; m << -1.0f, -2.0f; Vector2f M; M << 1.0f, 5.0f; - typedef AlignedBox BoxType; + typedef AlignedBox2f BoxType; BoxType box( m, M ); Vector2f sides = M-m; @@ -140,7 +140,7 @@ void specificTest2() Vector3i m; m << -1, -2, 0; Vector3i M; M << 1, 5, 3; - typedef AlignedBox BoxType; + typedef AlignedBox3i BoxType; BoxType box( m, M ); Vector3i sides = M-m; @@ -165,21 +165,21 @@ void test_geo_alignedbox() { for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( alignedbox(AlignedBox()) ); - CALL_SUBTEST_2( alignedboxCastTests(AlignedBox()) ); + CALL_SUBTEST_1( alignedbox(AlignedBox2f()) ); + CALL_SUBTEST_2( alignedboxCastTests(AlignedBox2f()) ); - CALL_SUBTEST_3( alignedbox(AlignedBox()) ); - CALL_SUBTEST_4( alignedboxCastTests(AlignedBox()) ); + CALL_SUBTEST_3( alignedbox(AlignedBox3f()) ); + CALL_SUBTEST_4( alignedboxCastTests(AlignedBox3f()) ); - CALL_SUBTEST_5( alignedbox(AlignedBox()) ); - CALL_SUBTEST_6( alignedboxCastTests(AlignedBox()) ); + CALL_SUBTEST_5( alignedbox(AlignedBox4d()) ); + CALL_SUBTEST_6( alignedboxCastTests(AlignedBox4d()) ); - CALL_SUBTEST_7( alignedbox(AlignedBox()) ); - CALL_SUBTEST_8( alignedboxCastTests(AlignedBox()) ); + CALL_SUBTEST_7( alignedbox(AlignedBox1d()) ); + CALL_SUBTEST_8( alignedboxCastTests(AlignedBox1d()) ); - CALL_SUBTEST_9( alignedbox(AlignedBox()) ); - CALL_SUBTEST_10( alignedbox(AlignedBox()) ); - CALL_SUBTEST_11( alignedbox(AlignedBox()) ); + CALL_SUBTEST_9( alignedbox(AlignedBox1i()) ); + CALL_SUBTEST_10( alignedbox(AlignedBox2i()) ); + CALL_SUBTEST_11( alignedbox(AlignedBox3i()) ); } CALL_SUBTEST_12( specificTest1() ); CALL_SUBTEST_13( specificTest2() ); diff --git a/gtsam/3rdparty/Eigen/test/geo_eulerangles.cpp b/gtsam/3rdparty/Eigen/test/geo_eulerangles.cpp index f82cb8fbe..8029a694e 100644 --- a/gtsam/3rdparty/Eigen/test/geo_eulerangles.cpp +++ b/gtsam/3rdparty/Eigen/test/geo_eulerangles.cpp @@ -42,7 +42,6 @@ template void eulerangles(void) #define VERIFY_EULER(I,J,K, X,Y,Z) { \ Vector3 ea = m.eulerAngles(I,J,K); \ - Matrix3 m1 = Matrix3(AngleAxisx(ea[0], Vector3::Unit##X()) * AngleAxisx(ea[1], Vector3::Unit##Y()) * AngleAxisx(ea[2], Vector3::Unit##Z())); \ VERIFY_IS_APPROX(m, Matrix3(AngleAxisx(ea[0], Vector3::Unit##X()) * AngleAxisx(ea[1], Vector3::Unit##Y()) * AngleAxisx(ea[2], Vector3::Unit##Z()))); \ } VERIFY_EULER(0,1,2, X,Y,Z); diff --git a/gtsam/3rdparty/Eigen/test/geo_homogeneous.cpp b/gtsam/3rdparty/Eigen/test/geo_homogeneous.cpp index 26254b757..3efcb77db 100644 --- a/gtsam/3rdparty/Eigen/test/geo_homogeneous.cpp +++ b/gtsam/3rdparty/Eigen/test/geo_homogeneous.cpp @@ -42,17 +42,13 @@ template void homogeneous(void) typedef Matrix T3MatrixType; VectorType v0 = VectorType::Random(), - v1 = VectorType::Random(), ones = VectorType::Ones(); - HVectorType hv0 = HVectorType::Random(), - hv1 = HVectorType::Random(); + HVectorType hv0 = HVectorType::Random(); - MatrixType m0 = MatrixType::Random(), - m1 = MatrixType::Random(); + MatrixType m0 = MatrixType::Random(); - HMatrixType hm0 = HMatrixType::Random(), - hm1 = HMatrixType::Random(); + HMatrixType hm0 = HMatrixType::Random(); hv0 << v0, 1; VERIFY_IS_APPROX(v0.homogeneous(), hv0); diff --git a/gtsam/3rdparty/Eigen/test/geo_orthomethods.cpp b/gtsam/3rdparty/Eigen/test/geo_orthomethods.cpp index 020ae7103..aa3c8b61d 100644 --- a/gtsam/3rdparty/Eigen/test/geo_orthomethods.cpp +++ b/gtsam/3rdparty/Eigen/test/geo_orthomethods.cpp @@ -88,9 +88,7 @@ template void orthomethods(int size=Size) typedef Matrix MatrixN3; typedef Matrix Vector3; - VectorType v0 = VectorType::Random(size), - v1 = VectorType::Random(size), - v2 = VectorType::Random(size); + VectorType v0 = VectorType::Random(size); // unitOrthogonal VERIFY_IS_MUCH_SMALLER_THAN(v0.unitOrthogonal().dot(v0), Scalar(1)); diff --git a/gtsam/3rdparty/Eigen/test/geo_parametrizedline.cpp b/gtsam/3rdparty/Eigen/test/geo_parametrizedline.cpp index 13f98fdd6..a289e70de 100644 --- a/gtsam/3rdparty/Eigen/test/geo_parametrizedline.cpp +++ b/gtsam/3rdparty/Eigen/test/geo_parametrizedline.cpp @@ -40,6 +40,7 @@ template void parametrizedline(const LineType& _line) typedef Matrix VectorType; typedef Matrix MatrixType; + typedef Hyperplane HyperplaneType; VectorType p0 = VectorType::Random(dim); VectorType p1 = VectorType::Random(dim); @@ -64,6 +65,16 @@ template void parametrizedline(const LineType& _line) VERIFY_IS_APPROX(hp1f.template cast(),l0); ParametrizedLine hp1d = l0.template cast(); VERIFY_IS_APPROX(hp1d.template cast(),l0); + + // intersections + VectorType p2 = VectorType::Random(dim); + VectorType n2 = VectorType::Random(dim).normalized(); + HyperplaneType hp(p2,n2); + Scalar t = l0.intersectionParameter(hp); + VectorType pi = l0.pointAt(t); + VERIFY_IS_MUCH_SMALLER_THAN(hp.signedDistance(pi), RealScalar(1)); + VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(pi), RealScalar(1)); + VERIFY_IS_APPROX(l0.intersectionPoint(hp), pi); } template void parametrizedline_alignment() diff --git a/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp b/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp index 7adbe0b3d..b73ae9cd4 100644 --- a/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp +++ b/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp @@ -142,6 +142,17 @@ template void quaternion(void) VERIFY_IS_APPROX(-v3.normalized(),(q2.setFromTwoVectors(v1,-v3)*v1).normalized()); } + // from two vector creation static function + VERIFY_IS_APPROX( v2.normalized(),(Quaternionx::FromTwoVectors(v1, v2)*v1).normalized()); + VERIFY_IS_APPROX( v1.normalized(),(Quaternionx::FromTwoVectors(v1, v1)*v1).normalized()); + VERIFY_IS_APPROX(-v1.normalized(),(Quaternionx::FromTwoVectors(v1,-v1)*v1).normalized()); + if (internal::is_same::value) + { + v3 = (v1.array()+eps).matrix(); + VERIFY_IS_APPROX( v3.normalized(),(Quaternionx::FromTwoVectors(v1, v3)*v1).normalized()); + VERIFY_IS_APPROX(-v3.normalized(),(Quaternionx::FromTwoVectors(v1,-v3)*v1).normalized()); + } + // inverse and conjugate VERIFY_IS_APPROX(q1 * (q1.inverse() * v1), v1); VERIFY_IS_APPROX(q1 * (q1.conjugate() * v1), v1); diff --git a/gtsam/3rdparty/Eigen/test/geo_transformations.cpp b/gtsam/3rdparty/Eigen/test/geo_transformations.cpp index b606de2fb..e9f05cfb6 100644 --- a/gtsam/3rdparty/Eigen/test/geo_transformations.cpp +++ b/gtsam/3rdparty/Eigen/test/geo_transformations.cpp @@ -122,9 +122,7 @@ template void transformations() typedef Translation Translation3; Vector3 v0 = Vector3::Random(), - v1 = Vector3::Random(), - v2 = Vector3::Random(); - Vector2 u0 = Vector2::Random(); + v1 = Vector3::Random(); Matrix3 matrot1, m; Scalar a = internal::random(-Scalar(M_PI), Scalar(M_PI)); @@ -284,9 +282,9 @@ template void transformations() // mat * aligned scaling and mat * translation t1 = (Matrix3(q1) * AlignedScaling3(v0)) * Translation3(v0); VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t1 = (Matrix3(q1) * Scaling(v0)) * Translation3(v0); + t1 = (Matrix3(q1) * Eigen::Scaling(v0)) * Translation3(v0); VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t1 = (q1 * Scaling(v0)) * Translation3(v0); + t1 = (q1 * Eigen::Scaling(v0)) * Translation3(v0); VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); // mat * transformation and aligned scaling * translation t1 = Matrix3(q1) * (AlignedScaling3(v0) * Translation3(v0)); @@ -295,18 +293,18 @@ template void transformations() t0.setIdentity(); t0.scale(s0).translate(v0); - t1 = Scaling(s0) * Translation3(v0); + t1 = Eigen::Scaling(s0) * Translation3(v0); VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); t0.prescale(s0); - t1 = Scaling(s0) * t1; + t1 = Eigen::Scaling(s0) * t1; VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); t0 = t3; t0.scale(s0); - t1 = t3 * Scaling(s0,s0,s0); + t1 = t3 * Eigen::Scaling(s0,s0,s0); VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); t0.prescale(s0); - t1 = Scaling(s0,s0,s0) * t1; + t1 = Eigen::Scaling(s0,s0,s0) * t1; VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); @@ -448,6 +446,29 @@ template void transform_alignment() #endif } +template void transform_products() +{ + typedef Matrix Mat; + typedef Transform Proj; + typedef Transform Aff; + typedef Transform AffC; + + Proj p; p.matrix().setRandom(); + Aff a; a.linear().setRandom(); a.translation().setRandom(); + AffC ac = a; + + Mat p_m(p.matrix()), a_m(a.matrix()); + + VERIFY_IS_APPROX((p*p).matrix(), p_m*p_m); + VERIFY_IS_APPROX((a*a).matrix(), a_m*a_m); + VERIFY_IS_APPROX((p*a).matrix(), p_m*a_m); + VERIFY_IS_APPROX((a*p).matrix(), a_m*p_m); + VERIFY_IS_APPROX((ac*a).matrix(), a_m*a_m); + VERIFY_IS_APPROX((a*ac).matrix(), a_m*a_m); + VERIFY_IS_APPROX((p*ac).matrix(), p_m*a_m); + VERIFY_IS_APPROX((ac*p).matrix(), a_m*p_m); +} + void test_geo_transformations() { for(int i = 0; i < g_repeat; i++) { @@ -470,5 +491,9 @@ void test_geo_transformations() CALL_SUBTEST_6(( transformations() )); CALL_SUBTEST_6(( transformations() )); + + + CALL_SUBTEST_7(( transform_products() )); + CALL_SUBTEST_7(( transform_products() )); } } diff --git a/gtsam/3rdparty/Eigen/test/gsl_helper.h b/gtsam/3rdparty/Eigen/test/gsl_helper.h deleted file mode 100644 index d6172d2ff..000000000 --- a/gtsam/3rdparty/Eigen/test/gsl_helper.h +++ /dev/null @@ -1,212 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#ifndef EIGEN_GSL_HELPER -#define EIGEN_GSL_HELPER - -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace Eigen { - -template::IsComplex> struct GslTraits -{ - typedef gsl_matrix* Matrix; - typedef gsl_vector* Vector; - static Matrix createMatrix(int rows, int cols) { return gsl_matrix_alloc(rows,cols); } - static Vector createVector(int size) { return gsl_vector_alloc(size); } - static void free(Matrix& m) { gsl_matrix_free(m); m=0; } - static void free(Vector& m) { gsl_vector_free(m); m=0; } - static void prod(const Matrix& m, const Vector& v, Vector& x) { gsl_blas_dgemv(CblasNoTrans,1,m,v,0,x); } - static void cholesky(Matrix& m) { gsl_linalg_cholesky_decomp(m); } - static void cholesky_solve(const Matrix& m, const Vector& b, Vector& x) { gsl_linalg_cholesky_solve(m,b,x); } - static void eigen_symm(const Matrix& m, Vector& eval, Matrix& evec) - { - gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc(m->size1); - Matrix a = createMatrix(m->size1, m->size2); - gsl_matrix_memcpy(a, m); - gsl_eigen_symmv(a,eval,evec,w); - gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC); - gsl_eigen_symmv_free(w); - free(a); - } - static void eigen_symm_gen(const Matrix& m, const Matrix& _b, Vector& eval, Matrix& evec) - { - gsl_eigen_gensymmv_workspace * w = gsl_eigen_gensymmv_alloc(m->size1); - Matrix a = createMatrix(m->size1, m->size2); - Matrix b = createMatrix(_b->size1, _b->size2); - gsl_matrix_memcpy(a, m); - gsl_matrix_memcpy(b, _b); - gsl_eigen_gensymmv(a,b,eval,evec,w); - gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC); - gsl_eigen_gensymmv_free(w); - free(a); - } - - template - static void eigen_poly_solve(const EIGEN_VECTOR& poly, EIGEN_ROOTS& roots ) - { - const int deg = poly.size()-1; - double *z = new double[2*deg]; - double *a = new double[poly.size()]; - for( int i=0; i struct GslTraits -{ - typedef gsl_matrix_complex* Matrix; - typedef gsl_vector_complex* Vector; - static Matrix createMatrix(int rows, int cols) { return gsl_matrix_complex_alloc(rows,cols); } - static Vector createVector(int size) { return gsl_vector_complex_alloc(size); } - static void free(Matrix& m) { gsl_matrix_complex_free(m); m=0; } - static void free(Vector& m) { gsl_vector_complex_free(m); m=0; } - static void cholesky(Matrix& m) { gsl_linalg_complex_cholesky_decomp(m); } - static void cholesky_solve(const Matrix& m, const Vector& b, Vector& x) { gsl_linalg_complex_cholesky_solve(m,b,x); } - static void prod(const Matrix& m, const Vector& v, Vector& x) - { gsl_blas_zgemv(CblasNoTrans,gsl_complex_rect(1,0),m,v,gsl_complex_rect(0,0),x); } - static void eigen_symm(const Matrix& m, gsl_vector* &eval, Matrix& evec) - { - gsl_eigen_hermv_workspace * w = gsl_eigen_hermv_alloc(m->size1); - Matrix a = createMatrix(m->size1, m->size2); - gsl_matrix_complex_memcpy(a, m); - gsl_eigen_hermv(a,eval,evec,w); - gsl_eigen_hermv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC); - gsl_eigen_hermv_free(w); - free(a); - } - static void eigen_symm_gen(const Matrix& m, const Matrix& _b, gsl_vector* &eval, Matrix& evec) - { - gsl_eigen_genhermv_workspace * w = gsl_eigen_genhermv_alloc(m->size1); - Matrix a = createMatrix(m->size1, m->size2); - Matrix b = createMatrix(_b->size1, _b->size2); - gsl_matrix_complex_memcpy(a, m); - gsl_matrix_complex_memcpy(b, _b); - gsl_eigen_genhermv(a,b,eval,evec,w); - gsl_eigen_hermv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC); - gsl_eigen_genhermv_free(w); - free(a); - } -}; - -template -void convert(const MatrixType& m, gsl_matrix* &res) -{ -// if (res) -// gsl_matrix_free(res); - res = gsl_matrix_alloc(m.rows(), m.cols()); - for (int i=0 ; i -void convert(const gsl_matrix* m, MatrixType& res) -{ - res.resize(int(m->size1), int(m->size2)); - for (int i=0 ; i -void convert(const VectorType& m, gsl_vector* &res) -{ - if (res) gsl_vector_free(res); - res = gsl_vector_alloc(m.size()); - for (int i=0 ; i -void convert(const gsl_vector* m, VectorType& res) -{ - res.resize (m->size); - for (int i=0 ; i -void convert(const MatrixType& m, gsl_matrix_complex* &res) -{ - res = gsl_matrix_complex_alloc(m.rows(), m.cols()); - for (int i=0 ; i -void convert(const gsl_matrix_complex* m, MatrixType& res) -{ - res.resize(int(m->size1), int(m->size2)); - for (int i=0 ; i -void convert(const VectorType& m, gsl_vector_complex* &res) -{ - res = gsl_vector_complex_alloc(m.size()); - for (int i=0 ; i -void convert(const gsl_vector_complex* m, VectorType& res) -{ - res.resize(m->size); - for (int i=0 ; i,1>() )); CALL_SUBTEST_2(( hessenberg,2>() )); CALL_SUBTEST_3(( hessenberg,4>() )); - CALL_SUBTEST_4(( hessenberg(internal::random(1,320)) )); - CALL_SUBTEST_5(( hessenberg,Dynamic>(internal::random(1,320)) )); + CALL_SUBTEST_4(( hessenberg(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); + CALL_SUBTEST_5(( hessenberg,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); // Test problem size constructors CALL_SUBTEST_6(HessenbergDecomposition(10)); diff --git a/gtsam/3rdparty/Eigen/test/householder.cpp b/gtsam/3rdparty/Eigen/test/householder.cpp index e77fa7ad0..6f6f317ea 100644 --- a/gtsam/3rdparty/Eigen/test/householder.cpp +++ b/gtsam/3rdparty/Eigen/test/householder.cpp @@ -130,9 +130,9 @@ void test_householder() CALL_SUBTEST_2( householder(Matrix()) ); CALL_SUBTEST_3( householder(Matrix()) ); CALL_SUBTEST_4( householder(Matrix()) ); - CALL_SUBTEST_5( householder(MatrixXd(10,12)) ); - CALL_SUBTEST_6( householder(MatrixXcf(16,17)) ); - CALL_SUBTEST_7( householder(MatrixXf(25,7)) ); + CALL_SUBTEST_5( householder(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_6( householder(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_7( householder(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); CALL_SUBTEST_8( householder(Matrix()) ); } } diff --git a/gtsam/3rdparty/Eigen/test/inverse.cpp b/gtsam/3rdparty/Eigen/test/inverse.cpp index f0c69e78c..81702432f 100644 --- a/gtsam/3rdparty/Eigen/test/inverse.cpp +++ b/gtsam/3rdparty/Eigen/test/inverse.cpp @@ -41,7 +41,6 @@ template void inverse(const MatrixType& m) MatrixType m1(rows, cols), m2(rows, cols), - mzero = MatrixType::Zero(rows, cols), identity = MatrixType::Identity(rows, rows); createRandomPIMatrixOfRank(rows,rows,rows,m1); m2 = m1.inverse(); @@ -114,4 +113,5 @@ void test_inverse() CALL_SUBTEST_7( inverse(Matrix4d()) ); CALL_SUBTEST_7( inverse(Matrix()) ); } + EIGEN_UNUSED_VARIABLE(s) } diff --git a/gtsam/3rdparty/Eigen/test/jacobi.cpp b/gtsam/3rdparty/Eigen/test/jacobi.cpp index 6464c63c5..4d462226c 100644 --- a/gtsam/3rdparty/Eigen/test/jacobi.cpp +++ b/gtsam/3rdparty/Eigen/test/jacobi.cpp @@ -82,8 +82,8 @@ void test_jacobi() CALL_SUBTEST_3(( jacobi() )); CALL_SUBTEST_3(( jacobi >() )); - int r = internal::random(2, 20), - c = internal::random(2, 20); + int r = internal::random(2, internal::random(1,EIGEN_TEST_MAX_SIZE)/2), + c = internal::random(2, internal::random(1,EIGEN_TEST_MAX_SIZE)/2); CALL_SUBTEST_4(( jacobi(MatrixXf(r,c)) )); CALL_SUBTEST_5(( jacobi(MatrixXcd(r,c)) )); CALL_SUBTEST_5(( jacobi >(MatrixXcd(r,c)) )); diff --git a/gtsam/3rdparty/Eigen/test/jacobisvd.cpp b/gtsam/3rdparty/Eigen/test/jacobisvd.cpp index 45873832a..3012fbe75 100644 --- a/gtsam/3rdparty/Eigen/test/jacobisvd.cpp +++ b/gtsam/3rdparty/Eigen/test/jacobisvd.cpp @@ -131,6 +131,12 @@ void jacobisvd_test_all_computation_options(const MatrixType& m) jacobisvd_solve(m, ComputeFullU | ComputeThinV); jacobisvd_solve(m, ComputeThinU | ComputeFullV); jacobisvd_solve(m, ComputeThinU | ComputeThinV); + + // test reconstruction + typedef typename MatrixType::Index Index; + Index diagSize = (std::min)(m.rows(), m.cols()); + JacobiSVD svd(m, ComputeThinU | ComputeThinV); + VERIFY_IS_APPROX(m, svd.matrixU().leftCols(diagSize) * svd.singularValues().asDiagonal() * svd.matrixV().leftCols(diagSize).adjoint()); } } @@ -248,9 +254,17 @@ void jacobisvd_inf_nan() // matrices containing denormal numbers. void jacobisvd_bug286() { +#if defined __INTEL_COMPILER +// shut up warning #239: floating point underflow +#pragma warning push +#pragma warning disable 239 +#endif Matrix2d M; M << -7.90884e-313, -4.94e-324, 0, 5.60844e-313; +#if defined __INTEL_COMPILER +#pragma warning pop +#endif JacobiSVD svd; svd.compute(M); // just check we don't loop indefinitely } @@ -333,8 +347,8 @@ void test_jacobisvd() CALL_SUBTEST_7( jacobisvd_inf_nan() ); } - CALL_SUBTEST_7(( jacobisvd(MatrixXf(internal::random(100, 150), internal::random(100, 150))) )); - CALL_SUBTEST_8(( jacobisvd(MatrixXcd(internal::random(80, 100), internal::random(80, 100))) )); + CALL_SUBTEST_7(( jacobisvd(MatrixXf(internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2), internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2))) )); + CALL_SUBTEST_8(( jacobisvd(MatrixXcd(internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3), internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3))) )); // test matrixbase method CALL_SUBTEST_1(( jacobisvd_method() )); diff --git a/gtsam/3rdparty/Eigen/test/linearstructure.cpp b/gtsam/3rdparty/Eigen/test/linearstructure.cpp index 312102701..bbfdaacc1 100644 --- a/gtsam/3rdparty/Eigen/test/linearstructure.cpp +++ b/gtsam/3rdparty/Eigen/test/linearstructure.cpp @@ -39,8 +39,7 @@ template void linearStructure(const MatrixType& m) // to test it, hence I consider that we will have tested Random.h MatrixType m1 = MatrixType::Random(rows, cols), m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - mzero = MatrixType::Zero(rows, cols); + m3(rows, cols); Scalar s1 = internal::random(); while (internal::abs(s1)<1e-3) s1 = internal::random(); @@ -90,10 +89,10 @@ void test_linearstructure() CALL_SUBTEST_2( linearStructure(Matrix2f()) ); CALL_SUBTEST_3( linearStructure(Vector3d()) ); CALL_SUBTEST_4( linearStructure(Matrix4d()) ); - CALL_SUBTEST_5( linearStructure(MatrixXcf(3, 3)) ); - CALL_SUBTEST_6( linearStructure(MatrixXf(8, 12)) ); - CALL_SUBTEST_7( linearStructure(MatrixXi(8, 12)) ); - CALL_SUBTEST_8( linearStructure(MatrixXcd(20, 20)) ); - CALL_SUBTEST_9( linearStructure(ArrayXXf(12, 8)) ); + CALL_SUBTEST_5( linearStructure(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); + CALL_SUBTEST_6( linearStructure(MatrixXf (internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_7( linearStructure(MatrixXi (internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_8( linearStructure(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); + CALL_SUBTEST_9( linearStructure(ArrayXXf (internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } } diff --git a/gtsam/3rdparty/Eigen/test/lu.cpp b/gtsam/3rdparty/Eigen/test/lu.cpp index 552364d29..253f68542 100644 --- a/gtsam/3rdparty/Eigen/test/lu.cpp +++ b/gtsam/3rdparty/Eigen/test/lu.cpp @@ -37,7 +37,7 @@ template void lu_non_invertible() Index rows, cols, cols2; if(MatrixType::RowsAtCompileTime==Dynamic) { - rows = internal::random(2,200); + rows = internal::random(2,EIGEN_TEST_MAX_SIZE); } else { @@ -45,8 +45,8 @@ template void lu_non_invertible() } if(MatrixType::ColsAtCompileTime==Dynamic) { - cols = internal::random(2,200); - cols2 = internal::random(2,200); + cols = internal::random(2,EIGEN_TEST_MAX_SIZE); + cols2 = internal::random(2,EIGEN_TEST_MAX_SIZE); } else { @@ -117,7 +117,7 @@ template void lu_invertible() */ typedef typename MatrixType::Scalar Scalar; typedef typename NumTraits::Real RealScalar; - int size = internal::random(1,200); + int size = internal::random(1,EIGEN_TEST_MAX_SIZE); MatrixType m1(size, size), m2(size, size), m3(size, size); FullPivLU lu; diff --git a/gtsam/3rdparty/Eigen/test/main.h b/gtsam/3rdparty/Eigen/test/main.h index 4510c1905..991194e30 100644 --- a/gtsam/3rdparty/Eigen/test/main.h +++ b/gtsam/3rdparty/Eigen/test/main.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,13 @@ #define min(A,B) please_protect_your_min_with_parentheses #define max(A,B) please_protect_your_max_with_parentheses +#define FORBIDDEN_IDENTIFIER (this_identifier_is_forbidden_to_avoid_clashes) this_identifier_is_forbidden_to_avoid_clashes +// B0 is defined in POSIX header termios.h +#define B0 FORBIDDEN_IDENTIFIER + +// the following file is automatically generated by cmake +#include "split_test_helper.h" + #ifdef NDEBUG #undef NDEBUG #endif @@ -186,7 +194,7 @@ static void verify_impl(bool condition, const char *testname, const char *file, } } -#define VERIFY(a) verify_impl(a, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a)) +#define VERIFY(a) ::verify_impl(a, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a)) #define VERIFY_IS_EQUAL(a, b) VERIFY(test_is_equal(a, b)) #define VERIFY_IS_APPROX(a, b) VERIFY(test_isApprox(a, b)) @@ -204,101 +212,6 @@ static void verify_impl(bool condition, const char *testname, const char *file, g_test_stack.pop_back(); \ } while (0) -#ifdef EIGEN_TEST_PART_1 -#define CALL_SUBTEST_1(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_1(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_2 -#define CALL_SUBTEST_2(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_2(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_3 -#define CALL_SUBTEST_3(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_3(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_4 -#define CALL_SUBTEST_4(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_4(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_5 -#define CALL_SUBTEST_5(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_5(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_6 -#define CALL_SUBTEST_6(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_6(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_7 -#define CALL_SUBTEST_7(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_7(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_8 -#define CALL_SUBTEST_8(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_8(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_9 -#define CALL_SUBTEST_9(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_9(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_10 -#define CALL_SUBTEST_10(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_10(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_11 -#define CALL_SUBTEST_11(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_11(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_12 -#define CALL_SUBTEST_12(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_12(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_13 -#define CALL_SUBTEST_13(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_13(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_14 -#define CALL_SUBTEST_14(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_14(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_15 -#define CALL_SUBTEST_15(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_15(FUNC) -#endif - -#ifdef EIGEN_TEST_PART_16 -#define CALL_SUBTEST_16(FUNC) CALL_SUBTEST(FUNC) -#else -#define CALL_SUBTEST_16(FUNC) -#endif namespace Eigen { @@ -447,6 +360,23 @@ void createRandomPIMatrixOfRank(typename MatrixType::Index desired_rank, typenam m = qra.householderQ() * d * qrb.householderQ(); } +template +void randomPermutationVector(PermutationVectorType& v, typename PermutationVectorType::Index size) +{ + typedef typename PermutationVectorType::Index Index; + typedef typename PermutationVectorType::Scalar Scalar; + v.resize(size); + for(Index i = 0; i < size; ++i) v(i) = Scalar(i); + if(size == 1) return; + for(Index n = 0; n < 3 * size; ++n) + { + Index i = internal::random(0, size-1); + Index j; + do j = internal::random(0, size-1); while(j==i); + std::swap(v(i), v(j)); + } +} + } // end namespace Eigen template struct GetDifferentType; diff --git a/gtsam/3rdparty/Eigen/test/mixingtypes.cpp b/gtsam/3rdparty/Eigen/test/mixingtypes.cpp index 8afb733cd..6819f934e 100644 --- a/gtsam/3rdparty/Eigen/test/mixingtypes.cpp +++ b/gtsam/3rdparty/Eigen/test/mixingtypes.cpp @@ -143,5 +143,5 @@ void test_mixingtypes() { CALL_SUBTEST_1(mixingtypes<3>()); CALL_SUBTEST_2(mixingtypes<4>()); - CALL_SUBTEST_3(mixingtypes(internal::random(1,310))); + CALL_SUBTEST_3(mixingtypes(internal::random(1,EIGEN_TEST_MAX_SIZE))); } diff --git a/gtsam/3rdparty/Eigen/test/nomalloc.cpp b/gtsam/3rdparty/Eigen/test/nomalloc.cpp index 96ff16dae..1feeff4bc 100644 --- a/gtsam/3rdparty/Eigen/test/nomalloc.cpp +++ b/gtsam/3rdparty/Eigen/test/nomalloc.cpp @@ -52,15 +52,7 @@ template void nomalloc(const MatrixType& m) MatrixType m1 = MatrixType::Random(rows, cols), m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - mzero = MatrixType::Zero(rows, cols), - identity = Matrix - ::Identity(rows, rows), - square = Matrix - ::Random(rows, rows); - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), - vzero = VectorType::Zero(rows); + m3(rows, cols); Scalar s1 = internal::random(); @@ -137,13 +129,20 @@ void ctms_decompositions() 0, maxSize, maxSize> ComplexMatrix; - const Matrix A(Matrix::Random(size, size)); + const Matrix A(Matrix::Random(size, size)), B(Matrix::Random(size, size)); + Matrix X(size,size); const ComplexMatrix complexA(ComplexMatrix::Random(size, size)); const Matrix saA = A.adjoint() * A; + const Vector b(Vector::Random(size)); + Vector x(size); // Cholesky module Eigen::LLT LLT; LLT.compute(A); + X = LLT.solve(B); + x = LLT.solve(b); Eigen::LDLT LDLT; LDLT.compute(A); + X = LDLT.solve(B); + x = LDLT.solve(b); // Eigenvalues module Eigen::HessenbergDecomposition hessDecomp; hessDecomp.compute(complexA); @@ -155,12 +154,22 @@ void ctms_decompositions() // LU module Eigen::PartialPivLU ppLU; ppLU.compute(A); + X = ppLU.solve(B); + x = ppLU.solve(b); Eigen::FullPivLU fpLU; fpLU.compute(A); + X = fpLU.solve(B); + x = fpLU.solve(b); // QR module Eigen::HouseholderQR hQR; hQR.compute(A); + X = hQR.solve(B); + x = hQR.solve(b); Eigen::ColPivHouseholderQR cpQR; cpQR.compute(A); + // FIXME X = cpQR.solve(B); + x = cpQR.solve(b); Eigen::FullPivHouseholderQR fpQR; fpQR.compute(A); + // FIXME X = fpQR.solve(B); + x = fpQR.solve(b); // SVD module Eigen::JacobiSVD jSVD; jSVD.compute(A, ComputeFullU | ComputeFullV); diff --git a/gtsam/3rdparty/Eigen/test/nullary.cpp b/gtsam/3rdparty/Eigen/test/nullary.cpp index 0df15c081..6c9ee5f34 100644 --- a/gtsam/3rdparty/Eigen/test/nullary.cpp +++ b/gtsam/3rdparty/Eigen/test/nullary.cpp @@ -52,11 +52,14 @@ void testVectorType(const VectorType& base) { typedef typename internal::traits::Index Index; typedef typename internal::traits::Scalar Scalar; - Scalar low = internal::random(-500,500); - Scalar high = internal::random(-500,500); - if (low>high) std::swap(low,high); + const Index size = base.size(); - const Scalar step = (high-low)/(size-1); + + Scalar high = internal::random(-500,500); + Scalar low = (size == 1 ? high : internal::random(-500,500)); + if (low>high) std::swap(low,high); + + const Scalar step = ((size == 1) ? 1 : (high-low)/(size-1)); // check whether the result yields what we expect it to do VectorType m(base); @@ -76,8 +79,8 @@ void testVectorType(const VectorType& base) VERIFY( (MatrixXd(RowVectorXd::LinSpaced(3, 0, 1)) - RowVector3d(0, 0.5, 1)).norm() < std::numeric_limits::epsilon() ); // These guys sometimes fail! This is not good. Any ideas how to fix them!? -// VERIFY( m(m.size()-1) == high ); -// VERIFY( m(0) == low ); + //VERIFY( m(m.size()-1) == high ); + //VERIFY( m(0) == low ); // sequential access version m = VectorType::LinSpaced(Sequential,size,low,high); @@ -97,6 +100,12 @@ void testVectorType(const VectorType& base) Matrix size_changer(size+50); size_changer.setLinSpaced(size,low,high); VERIFY( size_changer.size() == size ); + + typedef Matrix ScalarMatrix; + ScalarMatrix scalar; + scalar.setLinSpaced(1,low,high); + VERIFY_IS_APPROX( scalar, ScalarMatrix::Constant(high) ); + VERIFY_IS_APPROX( ScalarMatrix::LinSpaced(1,low,high), ScalarMatrix::Constant(high) ); } template @@ -124,5 +133,6 @@ void test_nullary() CALL_SUBTEST_6( testVectorType(Vector3d()) ); CALL_SUBTEST_7( testVectorType(VectorXf(internal::random(1,300))) ); CALL_SUBTEST_8( testVectorType(Vector3f()) ); + CALL_SUBTEST_8( testVectorType(Matrix()) ); } } diff --git a/gtsam/3rdparty/Eigen/test/pardiso_support.cpp b/gtsam/3rdparty/Eigen/test/pardiso_support.cpp new file mode 100644 index 000000000..67efad6d8 --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/pardiso_support.cpp @@ -0,0 +1,29 @@ +/* + Intel Copyright (C) .... +*/ + +#include "sparse_solver.h" +#include + +template void test_pardiso_T() +{ + PardisoLLT < SparseMatrix, Lower> pardiso_llt_lower; + PardisoLLT < SparseMatrix, Upper> pardiso_llt_upper; + PardisoLDLT < SparseMatrix, Lower> pardiso_ldlt_lower; + PardisoLDLT < SparseMatrix, Upper> pardiso_ldlt_upper; + PardisoLU < SparseMatrix > pardiso_lu; + + check_sparse_spd_solving(pardiso_llt_lower); + check_sparse_spd_solving(pardiso_llt_upper); + check_sparse_spd_solving(pardiso_ldlt_lower); + check_sparse_spd_solving(pardiso_ldlt_upper); + check_sparse_square_solving(pardiso_lu); +} + +void test_pardiso_support() +{ + CALL_SUBTEST_1(test_pardiso_T()); + CALL_SUBTEST_2(test_pardiso_T()); + CALL_SUBTEST_3(test_pardiso_T< std::complex >()); + CALL_SUBTEST_4(test_pardiso_T< std::complex >()); +} diff --git a/gtsam/3rdparty/Eigen/test/pastix_support.cpp b/gtsam/3rdparty/Eigen/test/pastix_support.cpp new file mode 100644 index 000000000..dbce30d1c --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/pastix_support.cpp @@ -0,0 +1,59 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2008-2012 Gael Guennebaud +// Copyright (C) 2012 Désiré Nuentsa-Wakam +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . +#include "sparse_solver.h" +#include +#include + + +template void test_pastix_T() +{ + PastixLLT< SparseMatrix, Eigen::Lower > pastix_llt_lower; + PastixLDLT< SparseMatrix, Eigen::Lower > pastix_ldlt_lower; + PastixLLT< SparseMatrix, Eigen::Upper > pastix_llt_upper; + PastixLDLT< SparseMatrix, Eigen::Upper > pastix_ldlt_upper; + PastixLU< SparseMatrix > pastix_lu; + + check_sparse_spd_solving(pastix_llt_lower); + check_sparse_spd_solving(pastix_ldlt_lower); + check_sparse_spd_solving(pastix_llt_upper); + check_sparse_spd_solving(pastix_ldlt_upper); + check_sparse_square_solving(pastix_lu); +} + +// There is no support for selfadjoint matrices with PaStiX. +// Complex symmetric matrices should pass though +template void test_pastix_T_LU() +{ + PastixLU< SparseMatrix > pastix_lu; + check_sparse_square_solving(pastix_lu); +} + +void test_pastix_support() +{ + CALL_SUBTEST_1(test_pastix_T()); + CALL_SUBTEST_2(test_pastix_T()); + CALL_SUBTEST_3( (test_pastix_T_LU >()) ); + CALL_SUBTEST_4(test_pastix_T_LU >()); +} \ No newline at end of file diff --git a/gtsam/3rdparty/Eigen/test/permutationmatrices.cpp b/gtsam/3rdparty/Eigen/test/permutationmatrices.cpp index d0fa01310..308838c70 100644 --- a/gtsam/3rdparty/Eigen/test/permutationmatrices.cpp +++ b/gtsam/3rdparty/Eigen/test/permutationmatrices.cpp @@ -24,23 +24,6 @@ #include "main.h" -template -void randomPermutationVector(PermutationVectorType& v, typename PermutationVectorType::Index size) -{ - typedef typename PermutationVectorType::Index Index; - typedef typename PermutationVectorType::Scalar Scalar; - v.resize(size); - for(Index i = 0; i < size; ++i) v(i) = Scalar(i); - if(size == 1) return; - for(Index n = 0; n < 3 * size; ++n) - { - Index i = internal::random(0, size-1); - Index j; - do j = internal::random(0, size-1); while(j==i); - std::swap(v(i), v(j)); - } -} - using namespace std; template void permutationmatrices(const MatrixType& m) { diff --git a/gtsam/3rdparty/Eigen/test/product.h b/gtsam/3rdparty/Eigen/test/product.h index 40ae4d51b..e77f8c41e 100644 --- a/gtsam/3rdparty/Eigen/test/product.h +++ b/gtsam/3rdparty/Eigen/test/product.h @@ -54,8 +54,7 @@ template void product(const MatrixType& m) // to test it, hence I consider that we will have tested Random.h MatrixType m1 = MatrixType::Random(rows, cols), m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - mzero = MatrixType::Zero(rows, cols); + m3(rows, cols); RowSquareMatrixType identity = RowSquareMatrixType::Identity(rows, rows), square = RowSquareMatrixType::Random(rows, rows), @@ -63,9 +62,7 @@ template void product(const MatrixType& m) ColSquareMatrixType square2 = ColSquareMatrixType::Random(cols, cols), res2 = ColSquareMatrixType::Random(cols, cols); - RowVectorType v1 = RowVectorType::Random(rows), - v2 = RowVectorType::Random(rows), - vzero = RowVectorType::Zero(rows); + RowVectorType v1 = RowVectorType::Random(rows); ColVectorType vc2 = ColVectorType::Random(cols), vcres(cols); OtherMajorMatrixType tm1 = m1; diff --git a/gtsam/3rdparty/Eigen/test/product_extra.cpp b/gtsam/3rdparty/Eigen/test/product_extra.cpp index 15dc5ab96..ca302b469 100644 --- a/gtsam/3rdparty/Eigen/test/product_extra.cpp +++ b/gtsam/3rdparty/Eigen/test/product_extra.cpp @@ -153,11 +153,11 @@ void zero_sized_objects() void test_product_extra() { for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( product_extra(MatrixXf(internal::random(1,320), internal::random(1,320))) ); - CALL_SUBTEST_2( product_extra(MatrixXd(internal::random(1,320), internal::random(1,320))) ); + CALL_SUBTEST_1( product_extra(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_2( product_extra(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); CALL_SUBTEST_2( mat_mat_scalar_scalar_product() ); - CALL_SUBTEST_3( product_extra(MatrixXcf(internal::random(1,150), internal::random(1,150))) ); - CALL_SUBTEST_4( product_extra(MatrixXcd(internal::random(1,150), internal::random(1,150))) ); + CALL_SUBTEST_3( product_extra(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); + CALL_SUBTEST_4( product_extra(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); CALL_SUBTEST_5( zero_sized_objects() ); } } diff --git a/gtsam/3rdparty/Eigen/test/product_large.cpp b/gtsam/3rdparty/Eigen/test/product_large.cpp index 8ed937068..6f7a91b84 100644 --- a/gtsam/3rdparty/Eigen/test/product_large.cpp +++ b/gtsam/3rdparty/Eigen/test/product_large.cpp @@ -27,11 +27,11 @@ void test_product_large() { for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( product(MatrixXf(internal::random(1,320), internal::random(1,320))) ); - CALL_SUBTEST_2( product(MatrixXd(internal::random(1,320), internal::random(1,320))) ); - CALL_SUBTEST_3( product(MatrixXi(internal::random(1,320), internal::random(1,320))) ); - CALL_SUBTEST_4( product(MatrixXcf(internal::random(1,150), internal::random(1,150))) ); - CALL_SUBTEST_5( product(Matrix(internal::random(1,320), internal::random(1,320))) ); + CALL_SUBTEST_1( product(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_2( product(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_3( product(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_4( product(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); + CALL_SUBTEST_5( product(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); } #if defined EIGEN_TEST_PART_6 diff --git a/gtsam/3rdparty/Eigen/test/product_mmtr.cpp b/gtsam/3rdparty/Eigen/test/product_mmtr.cpp index 1048a894d..c6ceb487f 100644 --- a/gtsam/3rdparty/Eigen/test/product_mmtr.cpp +++ b/gtsam/3rdparty/Eigen/test/product_mmtr.cpp @@ -72,9 +72,9 @@ void test_product_mmtr() { for(int i = 0; i < g_repeat ; i++) { - CALL_SUBTEST_1((mmtr(internal::random(1,320)))); - CALL_SUBTEST_2((mmtr(internal::random(1,320)))); - CALL_SUBTEST_3((mmtr >(internal::random(1,200)))); - CALL_SUBTEST_4((mmtr >(internal::random(1,200)))); + CALL_SUBTEST_1((mmtr(internal::random(1,EIGEN_TEST_MAX_SIZE)))); + CALL_SUBTEST_2((mmtr(internal::random(1,EIGEN_TEST_MAX_SIZE)))); + CALL_SUBTEST_3((mmtr >(internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); + CALL_SUBTEST_4((mmtr >(internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); } } diff --git a/gtsam/3rdparty/Eigen/test/product_notemporary.cpp b/gtsam/3rdparty/Eigen/test/product_notemporary.cpp index 980e2bbaf..1a9dc14d9 100644 --- a/gtsam/3rdparty/Eigen/test/product_notemporary.cpp +++ b/gtsam/3rdparty/Eigen/test/product_notemporary.cpp @@ -141,13 +141,13 @@ void test_product_notemporary() { int s; for(int i = 0; i < g_repeat; i++) { - s = internal::random(16,320); + s = internal::random(16,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_1( product_notemporary(MatrixXf(s, s)) ); - s = internal::random(16,320); + s = internal::random(16,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_2( product_notemporary(MatrixXd(s, s)) ); - s = internal::random(16,120); + s = internal::random(16,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_3( product_notemporary(MatrixXcf(s,s)) ); - s = internal::random(16,120); + s = internal::random(16,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_4( product_notemporary(MatrixXcd(s,s)) ); } } diff --git a/gtsam/3rdparty/Eigen/test/product_selfadjoint.cpp b/gtsam/3rdparty/Eigen/test/product_selfadjoint.cpp index ca84969eb..6c1d83bf2 100644 --- a/gtsam/3rdparty/Eigen/test/product_selfadjoint.cpp +++ b/gtsam/3rdparty/Eigen/test/product_selfadjoint.cpp @@ -83,13 +83,14 @@ void test_product_selfadjoint() CALL_SUBTEST_1( product_selfadjoint(Matrix()) ); CALL_SUBTEST_2( product_selfadjoint(Matrix()) ); CALL_SUBTEST_3( product_selfadjoint(Matrix3d()) ); - s = internal::random(1,150); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_4( product_selfadjoint(MatrixXcf(s, s)) ); - s = internal::random(1,150); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_5( product_selfadjoint(MatrixXcd(s,s)) ); - s = internal::random(1,320); + s = internal::random(1,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_6( product_selfadjoint(MatrixXd(s,s)) ); - s = internal::random(1,320); + s = internal::random(1,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_7( product_selfadjoint(Matrix(s,s)) ); } + EIGEN_UNUSED_VARIABLE(s) } diff --git a/gtsam/3rdparty/Eigen/test/product_small.cpp b/gtsam/3rdparty/Eigen/test/product_small.cpp index d7f1c09ff..cf430a2d3 100644 --- a/gtsam/3rdparty/Eigen/test/product_small.cpp +++ b/gtsam/3rdparty/Eigen/test/product_small.cpp @@ -25,6 +25,25 @@ #define EIGEN_NO_STATIC_ASSERT #include "product.h" +// regression test for bug 447 +void product1x1() +{ + Matrix matAstatic; + Matrix matBstatic; + matAstatic.setRandom(); + matBstatic.setRandom(); + VERIFY_IS_APPROX( (matAstatic * matBstatic).coeff(0,0), + matAstatic.cwiseProduct(matBstatic.transpose()).sum() ); + + MatrixXf matAdynamic(1,3); + MatrixXf matBdynamic(3,1); + matAdynamic.setRandom(); + matBdynamic.setRandom(); + VERIFY_IS_APPROX( (matAdynamic * matBdynamic).coeff(0,0), + matAdynamic.cwiseProduct(matBdynamic.transpose()).sum() ); +} + + void test_product_small() { for(int i = 0; i < g_repeat; i++) { @@ -33,6 +52,7 @@ void test_product_small() CALL_SUBTEST_3( product(Matrix3d()) ); CALL_SUBTEST_4( product(Matrix4d()) ); CALL_SUBTEST_5( product(Matrix4f()) ); + CALL_SUBTEST_6( product1x1() ); } #ifdef EIGEN_TEST_PART_6 diff --git a/gtsam/3rdparty/Eigen/test/product_symm.cpp b/gtsam/3rdparty/Eigen/test/product_symm.cpp index 21c2f605b..4585c3b6a 100644 --- a/gtsam/3rdparty/Eigen/test/product_symm.cpp +++ b/gtsam/3rdparty/Eigen/test/product_symm.cpp @@ -98,14 +98,14 @@ void test_product_symm() { for(int i = 0; i < g_repeat ; i++) { - CALL_SUBTEST_1(( symm(internal::random(1,320),internal::random(1,320)) )); - CALL_SUBTEST_2(( symm(internal::random(1,320),internal::random(1,320)) )); - CALL_SUBTEST_3(( symm,Dynamic,Dynamic>(internal::random(1,200),internal::random(1,200)) )); - CALL_SUBTEST_4(( symm,Dynamic,Dynamic>(internal::random(1,200),internal::random(1,200)) )); + CALL_SUBTEST_1(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)) )); + CALL_SUBTEST_2(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)) )); + CALL_SUBTEST_3(( symm,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)) )); + CALL_SUBTEST_4(( symm,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)) )); - CALL_SUBTEST_5(( symm(internal::random(1,320)) )); - CALL_SUBTEST_6(( symm(internal::random(1,320)) )); - CALL_SUBTEST_7(( symm,Dynamic,1>(internal::random(1,320)) )); - CALL_SUBTEST_8(( symm,Dynamic,1>(internal::random(1,320)) )); + CALL_SUBTEST_5(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); + CALL_SUBTEST_6(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); + CALL_SUBTEST_7(( symm,Dynamic,1>(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); + CALL_SUBTEST_8(( symm,Dynamic,1>(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); } } diff --git a/gtsam/3rdparty/Eigen/test/product_syrk.cpp b/gtsam/3rdparty/Eigen/test/product_syrk.cpp index 553410b9b..71285acb1 100644 --- a/gtsam/3rdparty/Eigen/test/product_syrk.cpp +++ b/gtsam/3rdparty/Eigen/test/product_syrk.cpp @@ -101,13 +101,13 @@ void test_product_syrk() for(int i = 0; i < g_repeat ; i++) { int s; - s = internal::random(1,320); + s = internal::random(1,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_1( syrk(MatrixXf(s, s)) ); - s = internal::random(1,320); + s = internal::random(1,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_2( syrk(MatrixXd(s, s)) ); - s = internal::random(1,200); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_3( syrk(MatrixXcf(s, s)) ); - s = internal::random(1,200); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_4( syrk(MatrixXcd(s, s)) ); } } diff --git a/gtsam/3rdparty/Eigen/test/product_trmm.cpp b/gtsam/3rdparty/Eigen/test/product_trmm.cpp index e117f6931..dab05d8b0 100644 --- a/gtsam/3rdparty/Eigen/test/product_trmm.cpp +++ b/gtsam/3rdparty/Eigen/test/product_trmm.cpp @@ -24,70 +24,100 @@ #include "main.h" -template void trmm(int size,int /*othersize*/) +template +void trmm(int rows=internal::random(1,EIGEN_TEST_MAX_SIZE), + int cols=internal::random(1,EIGEN_TEST_MAX_SIZE), + int otherCols = OtherCols==Dynamic?internal::random(1,EIGEN_TEST_MAX_SIZE):OtherCols) { typedef typename NumTraits::Real RealScalar; - typedef Matrix MatrixColMaj; - typedef Matrix MatrixRowMaj; + typedef Matrix TriMatrix; + typedef Matrix OnTheRight; + typedef Matrix OnTheLeft; + + typedef Matrix ResXS; + typedef Matrix ResSX; - DenseIndex rows = size; - DenseIndex cols = internal::random(1,size); - - MatrixColMaj triV(rows,cols), triH(cols,rows), upTri(cols,rows), loTri(rows,cols), - unitUpTri(cols,rows), unitLoTri(rows,cols), strictlyUpTri(cols,rows), strictlyLoTri(rows,cols); - MatrixColMaj ge1(rows,cols), ge2(cols,rows), ge3; - MatrixRowMaj rge3; + TriMatrix mat(rows,cols), tri(rows,cols), triTr(cols,rows); + + OnTheRight ge_right(cols,otherCols); + OnTheLeft ge_left(otherCols,rows); + ResSX ge_sx, ge_sx_save; + ResXS ge_xs, ge_xs_save; Scalar s1 = internal::random(), s2 = internal::random(); - triV.setRandom(); - triH.setRandom(); - loTri = triV.template triangularView(); - upTri = triH.template triangularView(); - unitLoTri = triV.template triangularView(); - unitUpTri = triH.template triangularView(); - strictlyLoTri = triV.template triangularView(); - strictlyUpTri = triH.template triangularView(); - ge1.setRandom(); - ge2.setRandom(); + mat.setRandom(); + tri = mat.template triangularView(); + triTr = mat.transpose().template triangularView(); + ge_right.setRandom(); + ge_left.setRandom(); - VERIFY_IS_APPROX( ge3 = triV.template triangularView() * ge2, loTri * ge2); - VERIFY_IS_APPROX( ge3 = ge2 * triV.template triangularView(), ge2 * loTri); - VERIFY_IS_APPROX( ge3 = triH.template triangularView() * ge1, upTri * ge1); - VERIFY_IS_APPROX( ge3 = ge1 * triH.template triangularView(), ge1 * upTri); - VERIFY_IS_APPROX( ge3 = (s1*triV.adjoint()).template triangularView() * (s2*ge1), s1*loTri.adjoint() * (s2*ge1)); - VERIFY_IS_APPROX( ge3 = ge1 * triV.adjoint().template triangularView(), ge1 * loTri.adjoint()); - VERIFY_IS_APPROX( ge3 = triH.adjoint().template triangularView() * ge2, upTri.adjoint() * ge2); - VERIFY_IS_APPROX( ge3 = ge2 * triH.adjoint().template triangularView(), ge2 * upTri.adjoint()); - VERIFY_IS_APPROX( ge3 = triV.template triangularView() * ge1.adjoint(), loTri * ge1.adjoint()); - VERIFY_IS_APPROX( ge3 = ge1.adjoint() * triV.template triangularView(), ge1.adjoint() * loTri); - VERIFY_IS_APPROX( ge3 = triH.template triangularView() * ge2.adjoint(), upTri * ge2.adjoint()); - VERIFY_IS_APPROX(rge3.noalias() = triH.template triangularView() * ge2.adjoint(), upTri * ge2.adjoint()); - VERIFY_IS_APPROX( ge3 = (s1*triV).adjoint().template triangularView() * ge2.adjoint(), internal::conj(s1) * loTri.adjoint() * ge2.adjoint()); - VERIFY_IS_APPROX(rge3.noalias() = triV.adjoint().template triangularView() * ge2.adjoint(), loTri.adjoint() * ge2.adjoint()); - VERIFY_IS_APPROX( ge3 = triH.adjoint().template triangularView() * ge1.adjoint(), upTri.adjoint() * ge1.adjoint()); - VERIFY_IS_APPROX(rge3.noalias() = triH.adjoint().template triangularView() * ge1.adjoint(), upTri.adjoint() * ge1.adjoint()); - - VERIFY_IS_APPROX( ge3 = triV.template triangularView() * ge2, unitLoTri * ge2); - VERIFY_IS_APPROX( rge3.noalias() = ge2 * triV.template triangularView(), ge2 * unitLoTri); - VERIFY_IS_APPROX( ge3 = ge2 * triV.template triangularView(), ge2 * unitLoTri); - VERIFY_IS_APPROX( ge3 = (s1*triV).adjoint().template triangularView() * ge2.adjoint(), internal::conj(s1) * unitLoTri.adjoint() * ge2.adjoint()); - - VERIFY_IS_APPROX( ge3 = triV.template triangularView() * ge2, strictlyLoTri * ge2); - VERIFY_IS_APPROX( rge3.noalias() = ge2 * triV.template triangularView(), ge2 * strictlyLoTri); - VERIFY_IS_APPROX( ge3 = ge2 * triV.template triangularView(), ge2 * strictlyLoTri); - VERIFY_IS_APPROX( ge3 = (s1*triV).adjoint().template triangularView() * ge2.adjoint(), internal::conj(s1) * strictlyLoTri.adjoint() * ge2.adjoint()); + VERIFY_IS_APPROX( ge_xs = mat.template triangularView() * ge_right, tri * ge_right); + VERIFY_IS_APPROX( ge_sx = ge_left * mat.template triangularView(), ge_left * tri); + + VERIFY_IS_APPROX( ge_xs.noalias() = mat.template triangularView() * ge_right, tri * ge_right); + VERIFY_IS_APPROX( ge_sx.noalias() = ge_left * mat.template triangularView(), ge_left * tri); + + VERIFY_IS_APPROX( ge_xs.noalias() = (s1*mat.adjoint()).template triangularView() * (s2*ge_left.transpose()), s1*triTr.conjugate() * (s2*ge_left.transpose())); + VERIFY_IS_APPROX( ge_sx.noalias() = ge_right.transpose() * mat.adjoint().template triangularView(), ge_right.transpose() * triTr.conjugate()); + + VERIFY_IS_APPROX( ge_xs.noalias() = (s1*mat.adjoint()).template triangularView() * (s2*ge_left.adjoint()), s1*triTr.conjugate() * (s2*ge_left.adjoint())); + VERIFY_IS_APPROX( ge_sx.noalias() = ge_right.adjoint() * mat.adjoint().template triangularView(), ge_right.adjoint() * triTr.conjugate()); + + ge_xs_save = ge_xs; + VERIFY_IS_APPROX( (ge_xs_save + s1*triTr.conjugate() * (s2*ge_left.adjoint())).eval(), ge_xs.noalias() += (s1*mat.adjoint()).template triangularView() * (s2*ge_left.adjoint()) ); + ge_sx_save = ge_sx; + VERIFY_IS_APPROX( ge_sx_save - (ge_right.adjoint() * (-s1 * triTr).conjugate()).eval(), ge_sx.noalias() -= (ge_right.adjoint() * (-s1 * mat).adjoint().template triangularView()).eval()); + + VERIFY_IS_APPROX( ge_xs = (s1*mat).adjoint().template triangularView() * ge_left.adjoint(), internal::conj(s1) * triTr.conjugate() * ge_left.adjoint()); + + // TODO check with sub-matrix expressions ? } +template +void trmv(int rows=internal::random(1,EIGEN_TEST_MAX_SIZE), int cols=internal::random(1,EIGEN_TEST_MAX_SIZE)) +{ + trmm(rows,cols,1); +} + +template +void trmm(int rows=internal::random(1,EIGEN_TEST_MAX_SIZE), int cols=internal::random(1,EIGEN_TEST_MAX_SIZE), int otherCols = internal::random(1,EIGEN_TEST_MAX_SIZE)) +{ + trmm(rows,cols,otherCols); +} + +#define CALL_ALL_ORDERS(NB,SCALAR,MODE) \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ + \ + EIGEN_CAT(CALL_SUBTEST_1,NB)((trmv())); \ + EIGEN_CAT(CALL_SUBTEST_1,NB)((trmv())); + + +#define CALL_ALL(NB,SCALAR) \ + CALL_ALL_ORDERS(EIGEN_CAT(1,NB),SCALAR,Upper) \ + CALL_ALL_ORDERS(EIGEN_CAT(2,NB),SCALAR,UnitUpper) \ + CALL_ALL_ORDERS(EIGEN_CAT(3,NB),SCALAR,StrictlyUpper) \ + CALL_ALL_ORDERS(EIGEN_CAT(1,NB),SCALAR,Lower) \ + CALL_ALL_ORDERS(EIGEN_CAT(2,NB),SCALAR,UnitLower) \ + CALL_ALL_ORDERS(EIGEN_CAT(3,NB),SCALAR,StrictlyLower) + + void test_product_trmm() { for(int i = 0; i < g_repeat ; i++) { - CALL_SUBTEST_1((trmm(internal::random(1,320),internal::random(1,320)))); - CALL_SUBTEST_2((trmm(internal::random(1,320),internal::random(1,320)))); - CALL_SUBTEST_3((trmm >(internal::random(1,200),internal::random(1,200)))); - CALL_SUBTEST_4((trmm >(internal::random(1,200),internal::random(1,200)))); + CALL_ALL(1,float); // EIGEN_SUFFIXES;11;111;21;121;31;131 + CALL_ALL(2,double); // EIGEN_SUFFIXES;12;112;22;122;32;132 + CALL_ALL(3,std::complex); // EIGEN_SUFFIXES;13;113;23;123;33;133 + CALL_ALL(4,std::complex); // EIGEN_SUFFIXES;14;114;24;124;34;134 } } diff --git a/gtsam/3rdparty/Eigen/test/product_trmv.cpp b/gtsam/3rdparty/Eigen/test/product_trmv.cpp index cfb7355ff..52707d22b 100644 --- a/gtsam/3rdparty/Eigen/test/product_trmv.cpp +++ b/gtsam/3rdparty/Eigen/test/product_trmv.cpp @@ -93,11 +93,12 @@ void test_product_trmv() CALL_SUBTEST_1( trmv(Matrix()) ); CALL_SUBTEST_2( trmv(Matrix()) ); CALL_SUBTEST_3( trmv(Matrix3d()) ); - s = internal::random(1,200); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_4( trmv(MatrixXcf(s,s)) ); - s = internal::random(1,200); + s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); CALL_SUBTEST_5( trmv(MatrixXcd(s,s)) ); - s = internal::random(1,320); + s = internal::random(1,EIGEN_TEST_MAX_SIZE); CALL_SUBTEST_6( trmv(Matrix(s, s)) ); } + EIGEN_UNUSED_VARIABLE(s); } diff --git a/gtsam/3rdparty/Eigen/test/product_trsolve.cpp b/gtsam/3rdparty/Eigen/test/product_trsolve.cpp index c207cc500..20380accd 100644 --- a/gtsam/3rdparty/Eigen/test/product_trsolve.cpp +++ b/gtsam/3rdparty/Eigen/test/product_trsolve.cpp @@ -93,14 +93,14 @@ void test_product_trsolve() for(int i = 0; i < g_repeat ; i++) { // matrices - CALL_SUBTEST_1((trsolve(internal::random(1,320),internal::random(1,320)))); - CALL_SUBTEST_2((trsolve(internal::random(1,320),internal::random(1,320)))); - CALL_SUBTEST_3((trsolve,Dynamic,Dynamic>(internal::random(1,200),internal::random(1,200)))); - CALL_SUBTEST_4((trsolve,Dynamic,Dynamic>(internal::random(1,200),internal::random(1,200)))); + CALL_SUBTEST_1((trsolve(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)))); + CALL_SUBTEST_2((trsolve(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)))); + CALL_SUBTEST_3((trsolve,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); + CALL_SUBTEST_4((trsolve,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); // vectors - CALL_SUBTEST_1((trsolve(internal::random(1,320)))); - CALL_SUBTEST_5((trsolve,Dynamic,1>(internal::random(1,320)))); + CALL_SUBTEST_1((trsolve(internal::random(1,EIGEN_TEST_MAX_SIZE)))); + CALL_SUBTEST_5((trsolve,Dynamic,1>(internal::random(1,EIGEN_TEST_MAX_SIZE)))); CALL_SUBTEST_6((trsolve())); CALL_SUBTEST_7((trsolve())); CALL_SUBTEST_8((trsolve,4,1>())); diff --git a/gtsam/3rdparty/Eigen/test/qr.cpp b/gtsam/3rdparty/Eigen/test/qr.cpp index 7e9ac9df9..6005c0e27 100644 --- a/gtsam/3rdparty/Eigen/test/qr.cpp +++ b/gtsam/3rdparty/Eigen/test/qr.cpp @@ -114,8 +114,8 @@ template void qr_verify_assert() void test_qr() { for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( qr(MatrixXf(internal::random(1,200),internal::random(1,200))) ); - CALL_SUBTEST_2( qr(MatrixXcd(internal::random(1,200),internal::random(1,200))) ); + CALL_SUBTEST_1( qr(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_2( qr(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); CALL_SUBTEST_3(( qr_fixedsize, 2 >() )); CALL_SUBTEST_4(( qr_fixedsize, 4 >() )); CALL_SUBTEST_5(( qr_fixedsize, 7 >() )); diff --git a/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp b/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp index 3cf651fa7..cdcf060ef 100644 --- a/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp +++ b/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp @@ -30,7 +30,7 @@ template void qr() { typedef typename MatrixType::Index Index; - Index rows = internal::random(2,200), cols = internal::random(2,200), cols2 = internal::random(2,200); + Index rows = internal::random(2,EIGEN_TEST_MAX_SIZE), cols = internal::random(2,EIGEN_TEST_MAX_SIZE), cols2 = internal::random(2,EIGEN_TEST_MAX_SIZE); Index rank = internal::random(1, (std::min)(rows, cols)-1); typedef typename MatrixType::Scalar Scalar; diff --git a/gtsam/3rdparty/Eigen/test/redux.cpp b/gtsam/3rdparty/Eigen/test/redux.cpp index a8bcf3b51..61d1bf911 100644 --- a/gtsam/3rdparty/Eigen/test/redux.cpp +++ b/gtsam/3rdparty/Eigen/test/redux.cpp @@ -35,6 +35,10 @@ template void matrixRedux(const MatrixType& m) MatrixType m1 = MatrixType::Random(rows, cols); + // The entries of m1 are uniformly distributed in [0,1], so m1.prod() is very small. This may lead to test + // failures if we underflow into denormals. Thus, we scale so that entires are close to 1. + MatrixType m1_for_prod = MatrixType::Ones(rows, cols) + Scalar(0.2) * m1; + VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1)); VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(float(rows*cols))); // the float() here to shut up excessive MSVC warning about int->complex conversion being lossy Scalar s(0), p(1), minc(internal::real(m1.coeff(0))), maxc(internal::real(m1.coeff(0))); @@ -42,7 +46,7 @@ template void matrixRedux(const MatrixType& m) for(int i = 0; i < rows; i++) { s += m1(i,j); - p *= m1(i,j); + p *= m1_for_prod(i,j); minc = (std::min)(internal::real(minc), internal::real(m1(i,j))); maxc = (std::max)(internal::real(maxc), internal::real(m1(i,j))); } @@ -50,7 +54,7 @@ template void matrixRedux(const MatrixType& m) VERIFY_IS_APPROX(m1.sum(), s); VERIFY_IS_APPROX(m1.mean(), mean); - VERIFY_IS_APPROX(m1.prod(), p); + VERIFY_IS_APPROX(m1_for_prod.prod(), p); VERIFY_IS_APPROX(m1.real().minCoeff(), internal::real(minc)); VERIFY_IS_APPROX(m1.real().maxCoeff(), internal::real(maxc)); @@ -61,7 +65,7 @@ template void matrixRedux(const MatrixType& m) Index c1 = internal::random(c0+1,cols)-c0; VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).sum(), m1.block(r0,c0,r1,c1).eval().sum()); VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).mean(), m1.block(r0,c0,r1,c1).eval().mean()); - VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).prod(), m1.block(r0,c0,r1,c1).eval().prod()); + VERIFY_IS_APPROX(m1_for_prod.block(r0,c0,r1,c1).prod(), m1_for_prod.block(r0,c0,r1,c1).eval().prod()); VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).real().minCoeff(), m1.block(r0,c0,r1,c1).real().eval().minCoeff()); VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).real().maxCoeff(), m1.block(r0,c0,r1,c1).real().eval().maxCoeff()); @@ -78,6 +82,8 @@ template void vectorRedux(const VectorType& w) Index size = w.size(); VectorType v = VectorType::Random(size); + VectorType v_for_prod = VectorType::Ones(size) + Scalar(0.2) * v; // see comment above declaration of m1_for_prod + for(int i = 1; i < size; i++) { Scalar s(0), p(1); @@ -85,12 +91,12 @@ template void vectorRedux(const VectorType& w) for(int j = 0; j < i; j++) { s += v[j]; - p *= v[j]; + p *= v_for_prod[j]; minc = (std::min)(minc, internal::real(v[j])); maxc = (std::max)(maxc, internal::real(v[j])); } VERIFY_IS_MUCH_SMALLER_THAN(internal::abs(s - v.head(i).sum()), Scalar(1)); - VERIFY_IS_APPROX(p, v.head(i).prod()); + VERIFY_IS_APPROX(p, v_for_prod.head(i).prod()); VERIFY_IS_APPROX(minc, v.real().head(i).minCoeff()); VERIFY_IS_APPROX(maxc, v.real().head(i).maxCoeff()); } @@ -102,12 +108,12 @@ template void vectorRedux(const VectorType& w) for(int j = i; j < size; j++) { s += v[j]; - p *= v[j]; + p *= v_for_prod[j]; minc = (std::min)(minc, internal::real(v[j])); maxc = (std::max)(maxc, internal::real(v[j])); } VERIFY_IS_MUCH_SMALLER_THAN(internal::abs(s - v.tail(size-i).sum()), Scalar(1)); - VERIFY_IS_APPROX(p, v.tail(size-i).prod()); + VERIFY_IS_APPROX(p, v_for_prod.tail(size-i).prod()); VERIFY_IS_APPROX(minc, v.real().tail(size-i).minCoeff()); VERIFY_IS_APPROX(maxc, v.real().tail(size-i).maxCoeff()); } @@ -119,12 +125,12 @@ template void vectorRedux(const VectorType& w) for(int j = i; j < size-i; j++) { s += v[j]; - p *= v[j]; + p *= v_for_prod[j]; minc = (std::min)(minc, internal::real(v[j])); maxc = (std::max)(maxc, internal::real(v[j])); } VERIFY_IS_MUCH_SMALLER_THAN(internal::abs(s - v.segment(i, size-2*i).sum()), Scalar(1)); - VERIFY_IS_APPROX(p, v.segment(i, size-2*i).prod()); + VERIFY_IS_APPROX(p, v_for_prod.segment(i, size-2*i).prod()); VERIFY_IS_APPROX(minc, v.real().segment(i, size-2*i).minCoeff()); VERIFY_IS_APPROX(maxc, v.real().segment(i, size-2*i).maxCoeff()); } @@ -139,6 +145,9 @@ template void vectorRedux(const VectorType& w) void test_redux() { + // the max size cannot be too large, otherwise reduxion operations obviously generate large errors. + int maxsize = (std::min)(100,EIGEN_TEST_MAX_SIZE); + EIGEN_UNUSED_VARIABLE(maxsize); for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( matrixRedux(Matrix()) ); CALL_SUBTEST_1( matrixRedux(Array()) ); @@ -146,19 +155,19 @@ void test_redux() CALL_SUBTEST_2( matrixRedux(Array2f()) ); CALL_SUBTEST_3( matrixRedux(Matrix4d()) ); CALL_SUBTEST_3( matrixRedux(Array4d()) ); - CALL_SUBTEST_4( matrixRedux(MatrixXcf(3, 3)) ); - CALL_SUBTEST_4( matrixRedux(ArrayXXcf(3, 3)) ); - CALL_SUBTEST_5( matrixRedux(MatrixXd(8, 12)) ); - CALL_SUBTEST_5( matrixRedux(ArrayXXd(8, 12)) ); - CALL_SUBTEST_6( matrixRedux(MatrixXi(8, 12)) ); - CALL_SUBTEST_6( matrixRedux(ArrayXXi(8, 12)) ); + CALL_SUBTEST_4( matrixRedux(MatrixXcf(internal::random(1,maxsize), internal::random(1,maxsize))) ); + CALL_SUBTEST_4( matrixRedux(ArrayXXcf(internal::random(1,maxsize), internal::random(1,maxsize))) ); + CALL_SUBTEST_5( matrixRedux(MatrixXd (internal::random(1,maxsize), internal::random(1,maxsize))) ); + CALL_SUBTEST_5( matrixRedux(ArrayXXd (internal::random(1,maxsize), internal::random(1,maxsize))) ); + CALL_SUBTEST_6( matrixRedux(MatrixXi (internal::random(1,maxsize), internal::random(1,maxsize))) ); + CALL_SUBTEST_6( matrixRedux(ArrayXXi (internal::random(1,maxsize), internal::random(1,maxsize))) ); } for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_7( vectorRedux(Vector4f()) ); CALL_SUBTEST_7( vectorRedux(Array4f()) ); - CALL_SUBTEST_5( vectorRedux(VectorXd(10)) ); - CALL_SUBTEST_5( vectorRedux(ArrayXd(10)) ); - CALL_SUBTEST_8( vectorRedux(VectorXf(33)) ); - CALL_SUBTEST_8( vectorRedux(ArrayXf(33)) ); + CALL_SUBTEST_5( vectorRedux(VectorXd(internal::random(1,maxsize))) ); + CALL_SUBTEST_5( vectorRedux(ArrayXd(internal::random(1,maxsize))) ); + CALL_SUBTEST_8( vectorRedux(VectorXf(internal::random(1,maxsize))) ); + CALL_SUBTEST_8( vectorRedux(ArrayXf(internal::random(1,maxsize))) ); } } diff --git a/gtsam/3rdparty/Eigen/test/schur_complex.cpp b/gtsam/3rdparty/Eigen/test/schur_complex.cpp index a2a89fd67..15532e2cc 100644 --- a/gtsam/3rdparty/Eigen/test/schur_complex.cpp +++ b/gtsam/3rdparty/Eigen/test/schur_complex.cpp @@ -80,7 +80,7 @@ template void schur(int size = MatrixType::ColsAtCompileTim void test_schur_complex() { CALL_SUBTEST_1(( schur() )); - CALL_SUBTEST_2(( schur(internal::random(1,50)) )); + CALL_SUBTEST_2(( schur(internal::random(1,EIGEN_TEST_MAX_SIZE/4)) )); CALL_SUBTEST_3(( schur, 1, 1> >() )); CALL_SUBTEST_4(( schur >() )); diff --git a/gtsam/3rdparty/Eigen/test/schur_real.cpp b/gtsam/3rdparty/Eigen/test/schur_real.cpp index 58717fa1a..ba0947d8c 100644 --- a/gtsam/3rdparty/Eigen/test/schur_real.cpp +++ b/gtsam/3rdparty/Eigen/test/schur_real.cpp @@ -99,7 +99,7 @@ template void schur(int size = MatrixType::ColsAtCompileTim void test_schur_real() { CALL_SUBTEST_1(( schur() )); - CALL_SUBTEST_2(( schur(internal::random(1,50)) )); + CALL_SUBTEST_2(( schur(internal::random(1,EIGEN_TEST_MAX_SIZE/4)) )); CALL_SUBTEST_3(( schur >() )); CALL_SUBTEST_4(( schur >() )); diff --git a/gtsam/3rdparty/Eigen/test/selfadjoint.cpp b/gtsam/3rdparty/Eigen/test/selfadjoint.cpp index 622045f20..db66017c1 100644 --- a/gtsam/3rdparty/Eigen/test/selfadjoint.cpp +++ b/gtsam/3rdparty/Eigen/test/selfadjoint.cpp @@ -54,20 +54,23 @@ template void selfadjoint(const MatrixType& m) void bug_159() { - Matrix3d m = Matrix3d::Random().selfadjointView(); + Matrix3d m = Matrix3d::Random().selfadjointView(); + EIGEN_UNUSED_VARIABLE(m) } void test_selfadjoint() { for(int i = 0; i < g_repeat ; i++) { - int s = internal::random(1,20); EIGEN_UNUSED_VARIABLE(s); + int s = internal::random(1,EIGEN_TEST_MAX_SIZE); EIGEN_UNUSED_VARIABLE(s); CALL_SUBTEST_1( selfadjoint(Matrix()) ); CALL_SUBTEST_2( selfadjoint(Matrix()) ); CALL_SUBTEST_3( selfadjoint(Matrix3cf()) ); CALL_SUBTEST_4( selfadjoint(MatrixXcd(s,s)) ); CALL_SUBTEST_5( selfadjoint(Matrix(s, s)) ); + + EIGEN_UNUSED_VARIABLE(s) } CALL_SUBTEST_1( bug_159() ); diff --git a/gtsam/3rdparty/Eigen/test/simplicial_cholesky.cpp b/gtsam/3rdparty/Eigen/test/simplicial_cholesky.cpp new file mode 100644 index 000000000..f1af0e467 --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/simplicial_cholesky.cpp @@ -0,0 +1,55 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse_solver.h" + +template void test_simplicial_cholesky_T() +{ + SimplicialCholesky, Lower> chol_colmajor_lower; + SimplicialCholesky, Upper> chol_colmajor_upper; + SimplicialLLT, Lower> llt_colmajor_lower; + SimplicialLDLT, Upper> llt_colmajor_upper; + SimplicialLDLT, Lower> ldlt_colmajor_lower; + SimplicialLDLT, Upper> ldlt_colmajor_upper; + + check_sparse_spd_solving(chol_colmajor_lower); + check_sparse_spd_solving(chol_colmajor_upper); + check_sparse_spd_solving(llt_colmajor_lower); + check_sparse_spd_solving(llt_colmajor_upper); + check_sparse_spd_solving(ldlt_colmajor_lower); + check_sparse_spd_solving(ldlt_colmajor_upper); + + check_sparse_spd_determinant(chol_colmajor_lower); + check_sparse_spd_determinant(chol_colmajor_upper); + check_sparse_spd_determinant(llt_colmajor_lower); + check_sparse_spd_determinant(llt_colmajor_upper); + check_sparse_spd_determinant(ldlt_colmajor_lower); + check_sparse_spd_determinant(ldlt_colmajor_upper); +} + +void test_simplicial_cholesky() +{ + CALL_SUBTEST_1(test_simplicial_cholesky_T()); + CALL_SUBTEST_2(test_simplicial_cholesky_T >()); +} diff --git a/gtsam/3rdparty/Eigen/test/smallvectors.cpp b/gtsam/3rdparty/Eigen/test/smallvectors.cpp index 144944162..4c09d4ec6 100644 --- a/gtsam/3rdparty/Eigen/test/smallvectors.cpp +++ b/gtsam/3rdparty/Eigen/test/smallvectors.cpp @@ -22,6 +22,7 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see . +#define EIGEN_NO_STATIC_ASSERT #include "main.h" template void smallVectors() @@ -29,6 +30,7 @@ template void smallVectors() typedef Matrix V2; typedef Matrix V3; typedef Matrix V4; + typedef Matrix VX; Scalar x1 = internal::random(), x2 = internal::random(), x3 = internal::random(), @@ -45,6 +47,29 @@ template void smallVectors() VERIFY_IS_APPROX(x3, v3.z()); VERIFY_IS_APPROX(x3, v4.z()); VERIFY_IS_APPROX(x4, v4.w()); + + if (!NumTraits::IsInteger) + { + VERIFY_RAISES_ASSERT(V3(2, 1)) + VERIFY_RAISES_ASSERT(V3(3, 2)) + VERIFY_RAISES_ASSERT(V3(Scalar(3), 1)) + VERIFY_RAISES_ASSERT(V3(3, Scalar(1))) + VERIFY_RAISES_ASSERT(V3(Scalar(3), Scalar(1))) + VERIFY_RAISES_ASSERT(V3(Scalar(123), Scalar(123))) + + VERIFY_RAISES_ASSERT(V4(1, 3)) + VERIFY_RAISES_ASSERT(V4(2, 4)) + VERIFY_RAISES_ASSERT(V4(1, Scalar(4))) + VERIFY_RAISES_ASSERT(V4(Scalar(1), 4)) + VERIFY_RAISES_ASSERT(V4(Scalar(1), Scalar(4))) + VERIFY_RAISES_ASSERT(V4(Scalar(123), Scalar(123))) + + VERIFY_RAISES_ASSERT(VX(3, 2)) + VERIFY_RAISES_ASSERT(VX(Scalar(3), 1)) + VERIFY_RAISES_ASSERT(VX(3, Scalar(1))) + VERIFY_RAISES_ASSERT(VX(Scalar(3), Scalar(1))) + VERIFY_RAISES_ASSERT(VX(Scalar(123), Scalar(123))) + } } void test_smallvectors() diff --git a/gtsam/3rdparty/Eigen/test/sparse.h b/gtsam/3rdparty/Eigen/test/sparse.h index cc9da4855..860d9ad9c 100644 --- a/gtsam/3rdparty/Eigen/test/sparse.h +++ b/gtsam/3rdparty/Eigen/test/sparse.h @@ -1,7 +1,7 @@ // This file is part of Eigen, a lightweight C++ template library // for linear algebra. // -// Copyright (C) 2008 Daniel Gomez Ferro +// Copyright (C) 2008-2011 Gael Guennebaud // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -23,6 +23,7 @@ // Eigen. If not, see . #ifndef EIGEN_TESTSPARSE_H +#define EIGEN_TESTSPARSE_H #define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET @@ -67,30 +68,36 @@ enum { * \param zeroCoords and nonzeroCoords allows to get the coordinate lists of the non zero, * and zero coefficients respectively. */ -template void +template void initSparse(double density, - Matrix& refMat, - SparseMatrix& sparseMat, + Matrix& refMat, + SparseMatrix& sparseMat, int flags = 0, std::vector* zeroCoords = 0, std::vector* nonzeroCoords = 0) { + enum { IsRowMajor = SparseMatrix::IsRowMajor }; sparseMat.setZero(); - sparseMat.reserve(int(refMat.rows()*refMat.cols()*density)); - for(int j=0; j(0,1) < density) ? internal::random() : Scalar(0); if ((flags&ForceNonZeroDiag) && (i==j)) { v = internal::random()*Scalar(3.); v = v*v + Scalar(5.); } - if ((flags & MakeLowerTriangular) && j>i) + if ((flags & MakeLowerTriangular) && aj>ai) v = Scalar(0); - else if ((flags & MakeUpperTriangular) && jpush_back(Vector2i(i,j)); + nonzeroCoords->push_back(Vector2i(ai,aj)); } else if (zeroCoords) { - zeroCoords->push_back(Vector2i(i,j)); + zeroCoords->push_back(Vector2i(ai,aj)); } - refMat(i,j) = v; + refMat(ai,aj) = v; } } - sparseMat.finalize(); + //sparseMat.finalize(); } -template void +template void initSparse(double density, - Matrix& refMat, - DynamicSparseMatrix& sparseMat, + Matrix& refMat, + DynamicSparseMatrix& sparseMat, int flags = 0, std::vector* zeroCoords = 0, std::vector* nonzeroCoords = 0) { + enum { IsRowMajor = DynamicSparseMatrix::IsRowMajor }; sparseMat.setZero(); sparseMat.reserve(int(refMat.rows()*refMat.cols()*density)); - for(int j=0; j(0,1) < density) ? internal::random() : Scalar(0); if ((flags&ForceNonZeroDiag) && (i==j)) { v = internal::random()*Scalar(3.); v = v*v + Scalar(5.); } - if ((flags & MakeLowerTriangular) && j>i) + if ((flags & MakeLowerTriangular) && aj>ai) v = Scalar(0); - else if ((flags & MakeUpperTriangular) && jpush_back(Vector2i(i,j)); + nonzeroCoords->push_back(Vector2i(ai,aj)); } else if (zeroCoords) { - zeroCoords->push_back(Vector2i(i,j)); + zeroCoords->push_back(Vector2i(ai,aj)); } - refMat(i,j) = v; + refMat(ai,aj) = v; } } sparseMat.finalize(); @@ -181,4 +193,5 @@ initSparse(double density, } } +#include #endif // EIGEN_TESTSPARSE_H diff --git a/gtsam/3rdparty/Eigen/test/sparse_basic.cpp b/gtsam/3rdparty/Eigen/test/sparse_basic.cpp index 6f54d2ebc..637c5db51 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_basic.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_basic.cpp @@ -1,6 +1,7 @@ // This file is part of Eigen, a lightweight C++ template library // for linear algebra. // +// Copyright (C) 2008-2011 Gael Guennebaud // Copyright (C) 2008 Daniel Gomez Ferro // // Eigen is free software; you can redistribute it and/or @@ -109,7 +110,8 @@ template void sparse_basic(const SparseMatrixType& re DenseMatrix m1(rows,cols); m1.setZero(); SparseMatrixType m2(rows,cols); - m2.reserve(10); + if(internal::random()%2) + m2.reserve(VectorXi::Constant(m2.outerSize(), 2)); for (int j=0; j void sparse_basic(const SparseMatrixType& re DenseMatrix m1(rows,cols); m1.setZero(); SparseMatrixType m2(rows,cols); - m2.reserve(10); + if(internal::random()%2) + m2.reserve(VectorXi::Constant(m2.outerSize(), 2)); + for (int k=0; k(0,rows-1); + int j = internal::random(0,cols-1); + if ((m1.coeff(i,j)==Scalar(0)) && (internal::random()%2)) + m2.insert(i,j) = m1(i,j) = internal::random(); + else + { + Scalar v = internal::random(); + m2.coeffRef(i,j) += v; + m1(i,j) += v; + } + } + VERIFY_IS_APPROX(m2,m1); + } + + // test insert (un-compressed) + for(int mode=0;mode<4;++mode) + { + DenseMatrix m1(rows,cols); + m1.setZero(); + SparseMatrixType m2(rows,cols); + VectorXi r(VectorXi::Constant(m2.outerSize(), ((mode%2)==0) ? m2.innerSize() : std::max(1,m2.innerSize()/8))); + m2.reserve(r); for (int k=0; k(0,rows-1); int j = internal::random(0,cols-1); if (m1.coeff(i,j)==Scalar(0)) m2.insert(i,j) = m1(i,j) = internal::random(); + if(mode==3) + m2.reserve(r); } - m2.finalize(); + if(internal::random()%2) + m2.makeCompressed(); VERIFY_IS_APPROX(m2,m1); } @@ -166,7 +196,13 @@ template void sparse_basic(const SparseMatrixType& re VERIFY_IS_APPROX(m1+=m2, refM1+=refM2); VERIFY_IS_APPROX(m1-=m2, refM1-=refM2); - VERIFY_IS_APPROX(m1.col(0).dot(refM2.row(0)), refM1.col(0).dot(refM2.row(0))); + if(SparseMatrixType::IsRowMajor) + VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0))); + else + VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.col(0).dot(refM2.row(0))); + + VERIFY_IS_APPROX(m1.conjugate(), refM1.conjugate()); + VERIFY_IS_APPROX(m1.real(), refM1.real()); refM4.setRandom(); // sparse cwise* dense @@ -190,10 +226,37 @@ template void sparse_basic(const SparseMatrixType& re DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); SparseMatrixType m2(rows, rows); initSparse(density, refMat2, m2); - int j0 = internal::random(0,rows-1); - int j1 = internal::random(0,rows-1); - VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.col(j0)); - VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.col(j0)+refMat2.col(j1)); + int j0 = internal::random(0,rows-1); + int j1 = internal::random(0,rows-1); + if(SparseMatrixType::IsRowMajor) + VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.row(j0)); + else + VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.col(j0)); + + if(SparseMatrixType::IsRowMajor) + VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.row(j0)+refMat2.row(j1)); + else + VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.col(j0)+refMat2.col(j1)); + + SparseMatrixType m3(rows,rows); + m3.reserve(VectorXi::Constant(rows,rows/2)); + for(int j=0; j0) + VERIFY(j==internal::real(m3.innerVector(j).lastCoeff())); + } + m3.makeCompressed(); + for(int j=0; j0) + VERIFY(j==internal::real(m3.innerVector(j).lastCoeff())); + } + //m2.innerVector(j0) = 2*m2.innerVector(j1); //refMat2.col(j0) = 2*refMat2.col(j1); //VERIFY_IS_APPROX(m2, refMat2); @@ -204,12 +267,19 @@ template void sparse_basic(const SparseMatrixType& re DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); SparseMatrixType m2(rows, rows); initSparse(density, refMat2, m2); - int j0 = internal::random(0,rows-2); - int j1 = internal::random(0,rows-2); + int j0 = internal::random(0,rows-2); + int j1 = internal::random(0,rows-2); int n0 = internal::random(1,rows-(std::max)(j0,j1)); - VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0)); - VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), - refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); + if(SparseMatrixType::IsRowMajor) + VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(j0,0,n0,cols)); + else + VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0)); + if(SparseMatrixType::IsRowMajor) + VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), + refMat2.block(j0,0,n0,cols)+refMat2.block(j1,0,n0,cols)); + else + VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), + refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); //m2.innerVectors(j0,n0) = m2.innerVectors(j0,n0) + m2.innerVectors(j1,n0); //refMat2.block(0,j0,rows,n0) = refMat2.block(0,j0,rows,n0) + refMat2.block(0,j1,rows,n0); } @@ -239,7 +309,11 @@ template void sparse_basic(const SparseMatrixType& re else { countTrueNonZero++; - m2.insertBackByOuterInner(j,i) = refM2(i,j) = Scalar(1); + m2.insertBackByOuterInner(j,i) = Scalar(1); + if(SparseMatrixType::IsRowMajor) + refM2(j,i) = Scalar(1); + else + refM2(i,j) = Scalar(1); } } } @@ -250,8 +324,52 @@ template void sparse_basic(const SparseMatrixType& re VERIFY(countTrueNonZero==m2.nonZeros()); VERIFY_IS_APPROX(m2, refM2); } + + // test setFromTriplets + { + typedef Triplet TripletType; + std::vector triplets; + int ntriplets = rows*cols; + triplets.reserve(ntriplets); + DenseMatrix refMat(rows,cols); + refMat.setZero(); + for(int i=0;i(0,rows-1); + int c = internal::random(0,cols-1); + Scalar v = internal::random(); + triplets.push_back(TripletType(r,c,v)); + refMat(r,c) += v; + } + SparseMatrixType m(rows,cols); + m.setFromTriplets(triplets.begin(), triplets.end()); + VERIFY_IS_APPROX(m, refMat); + } + + // test triangularView + { + DenseMatrix refMat2(rows, rows), refMat3(rows, rows); + SparseMatrixType m2(rows, rows), m3(rows, rows); + initSparse(density, refMat2, m2); + refMat3 = refMat2.template triangularView(); + m3 = m2.template triangularView(); + VERIFY_IS_APPROX(m3, refMat3); + + refMat3 = refMat2.template triangularView(); + m3 = m2.template triangularView(); + VERIFY_IS_APPROX(m3, refMat3); + + refMat3 = refMat2.template triangularView(); + m3 = m2.template triangularView(); + VERIFY_IS_APPROX(m3, refMat3); + + refMat3 = refMat2.template triangularView(); + m3 = m2.template triangularView(); + VERIFY_IS_APPROX(m3, refMat3); + } // test selfadjointView + if(!SparseMatrixType::IsRowMajor) { DenseMatrix refMat2(rows, rows), refMat3(rows, rows); SparseMatrixType m2(rows, rows), m3(rows, rows); @@ -268,15 +386,25 @@ template void sparse_basic(const SparseMatrixType& re initSparse(density, refMat2, m2); VERIFY_IS_APPROX(m2.eval(), refMat2.sparseView().eval()); } + + // test diagonal + { + DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); + SparseMatrixType m2(rows, rows); + initSparse(density, refMat2, m2); + VERIFY_IS_APPROX(m2.diagonal(), refMat2.diagonal().eval()); + } } void test_sparse_basic() { for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( sparse_basic(SparseMatrix(8, 8)) ); - CALL_SUBTEST_2( sparse_basic(SparseMatrix >(16, 16)) ); - CALL_SUBTEST_1( sparse_basic(SparseMatrix(33, 33)) ); - - CALL_SUBTEST_3( sparse_basic(DynamicSparseMatrix(8, 8)) ); + int s = Eigen::internal::random(1,50); + CALL_SUBTEST_1(( sparse_basic(SparseMatrix(8, 8)) )); + CALL_SUBTEST_2(( sparse_basic(SparseMatrix, ColMajor>(s, s)) )); + CALL_SUBTEST_2(( sparse_basic(SparseMatrix, RowMajor>(s, s)) )); + CALL_SUBTEST_1(( sparse_basic(SparseMatrix(s, s)) )); + CALL_SUBTEST_1(( sparse_basic(SparseMatrix(s, s)) )); + CALL_SUBTEST_1(( sparse_basic(SparseMatrix(s, s)) )); } } diff --git a/gtsam/3rdparty/Eigen/test/sparse_permutations.cpp b/gtsam/3rdparty/Eigen/test/sparse_permutations.cpp new file mode 100644 index 000000000..4d22e358e --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/sparse_permutations.cpp @@ -0,0 +1,202 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse.h" + +template void sparse_permutations(const SparseMatrixType& ref) +{ + typedef typename SparseMatrixType::Index Index; + + const Index rows = ref.rows(); + const Index cols = ref.cols(); + typedef typename SparseMatrixType::Scalar Scalar; + typedef typename SparseMatrixType::Index Index; + typedef SparseMatrix OtherSparseMatrixType; + typedef Matrix DenseMatrix; + typedef Matrix VectorI; + + double density = (std::max)(8./(rows*cols), 0.01); + + SparseMatrixType mat(rows, cols), up(rows,cols), lo(rows,cols); + OtherSparseMatrixType res; + DenseMatrix mat_d = DenseMatrix::Zero(rows, cols), up_sym_d, lo_sym_d, res_d; + + initSparse(density, mat_d, mat, 0); + + up = mat.template triangularView(); + lo = mat.template triangularView(); + + up_sym_d = mat_d.template selfadjointView(); + lo_sym_d = mat_d.template selfadjointView(); + + VERIFY_IS_APPROX(mat, mat_d); + VERIFY_IS_APPROX(up, DenseMatrix(mat_d.template triangularView())); + VERIFY_IS_APPROX(lo, DenseMatrix(mat_d.template triangularView())); + + PermutationMatrix p, p_null; + VectorI pi; + randomPermutationVector(pi, cols); + p.indices() = pi; + + res = mat*p; + res_d = mat_d*p; + VERIFY(res.isApprox(res_d) && "mat*p"); + + res = p*mat; + res_d = p*mat_d; + VERIFY(res.isApprox(res_d) && "p*mat"); + + res = mat*p.inverse(); + res_d = mat*p.inverse(); + VERIFY(res.isApprox(res_d) && "mat*inv(p)"); + + res = p.inverse()*mat; + res_d = p.inverse()*mat_d; + VERIFY(res.isApprox(res_d) && "inv(p)*mat"); + + res = mat.twistedBy(p); + res_d = (p * mat_d) * p.inverse(); + VERIFY(res.isApprox(res_d) && "p*mat*inv(p)"); + + + res = mat.template selfadjointView().twistedBy(p_null); + res_d = up_sym_d; + VERIFY(res.isApprox(res_d) && "full selfadjoint upper to full"); + + res = mat.template selfadjointView().twistedBy(p_null); + res_d = lo_sym_d; + VERIFY(res.isApprox(res_d) && "full selfadjoint lower to full"); + + + res = up.template selfadjointView().twistedBy(p_null); + res_d = up_sym_d; + VERIFY(res.isApprox(res_d) && "upper selfadjoint to full"); + + res = lo.template selfadjointView().twistedBy(p_null); + res_d = lo_sym_d; + VERIFY(res.isApprox(res_d) && "lower selfadjoint full"); + + + res = mat.template selfadjointView(); + res_d = up_sym_d; + VERIFY(res.isApprox(res_d) && "full selfadjoint upper to full"); + + res = mat.template selfadjointView(); + res_d = lo_sym_d; + VERIFY(res.isApprox(res_d) && "full selfadjoint lower to full"); + + res = up.template selfadjointView(); + res_d = up_sym_d; + VERIFY(res.isApprox(res_d) && "upper selfadjoint to full"); + + res = lo.template selfadjointView(); + res_d = lo_sym_d; + VERIFY(res.isApprox(res_d) && "lower selfadjoint full"); + + + res.template selfadjointView() = mat.template selfadjointView(); + res_d = up_sym_d.template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint upper to upper"); + + res.template selfadjointView() = mat.template selfadjointView(); + res_d = up_sym_d.template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint upper to lower"); + + res.template selfadjointView() = mat.template selfadjointView(); + res_d = lo_sym_d.template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint lower to upper"); + + res.template selfadjointView() = mat.template selfadjointView(); + res_d = lo_sym_d.template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint lower to lower"); + + + + res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); + res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to upper"); + + res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); + res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to upper"); + + res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); + res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to lower"); + + res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); + res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to lower"); + + + res.template selfadjointView() = up.template selfadjointView().twistedBy(p); + res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to upper"); + + res.template selfadjointView() = lo.template selfadjointView().twistedBy(p); + res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to upper"); + + res.template selfadjointView() = lo.template selfadjointView().twistedBy(p); + res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to lower"); + + res.template selfadjointView() = up.template selfadjointView().twistedBy(p); + res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); + VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to lower"); + + + res = mat.template selfadjointView().twistedBy(p); + res_d = (p * up_sym_d) * p.inverse(); + VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to full"); + + res = mat.template selfadjointView().twistedBy(p); + res_d = (p * lo_sym_d) * p.inverse(); + VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to full"); + + res = up.template selfadjointView().twistedBy(p); + res_d = (p * up_sym_d) * p.inverse(); + VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to full"); + + res = lo.template selfadjointView().twistedBy(p); + res_d = (p * lo_sym_d) * p.inverse(); + VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to full"); +} + +template void sparse_permutations_all(int size) +{ + CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); + CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); + CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); + CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); +} + +void test_sparse_permutations() +{ + for(int i = 0; i < g_repeat; i++) { + int s = Eigen::internal::random(1,50); + CALL_SUBTEST_1(( sparse_permutations_all(s) )); + CALL_SUBTEST_2(( sparse_permutations_all >(s) )); + } +} diff --git a/gtsam/3rdparty/Eigen/test/sparse_product.cpp b/gtsam/3rdparty/Eigen/test/sparse_product.cpp index a53ab3f1b..2c28d1131 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_product.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_product.cpp @@ -1,7 +1,7 @@ // This file is part of Eigen, a lightweight C++ template library // for linear algebra. // -// Copyright (C) 2008 Daniel Gomez Ferro +// Copyright (C) 2008-2011 Gael Guennebaud // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -24,11 +24,37 @@ #include "sparse.h" -template void sparse_product(const SparseMatrixType& ref) +template struct test_outer; + +template struct test_outer { + static void run(SparseMatrixType& m2, SparseMatrixType& m4, DenseMatrix& refMat2, DenseMatrix& refMat4) { + int c = internal::random(0,m2.cols()-1); + int c1 = internal::random(0,m2.cols()-1); + VERIFY_IS_APPROX(m4=m2.col(c)*refMat2.col(c1).transpose(), refMat4=refMat2.col(c)*refMat2.col(c1).transpose()); + VERIFY_IS_APPROX(m4=refMat2.col(c1)*m2.col(c).transpose(), refMat4=refMat2.col(c1)*refMat2.col(c).transpose()); + } +}; + +template struct test_outer { + static void run(SparseMatrixType& m2, SparseMatrixType& m4, DenseMatrix& refMat2, DenseMatrix& refMat4) { + int r = internal::random(0,m2.rows()-1); + int c1 = internal::random(0,m2.cols()-1); + VERIFY_IS_APPROX(m4=m2.row(r).transpose()*refMat2.col(c1).transpose(), refMat4=refMat2.row(r).transpose()*refMat2.col(c1).transpose()); + VERIFY_IS_APPROX(m4=refMat2.col(c1)*m2.row(r), refMat4=refMat2.col(c1)*refMat2.row(r)); + } +}; + +// (m2,m4,refMat2,refMat4,dv1); +// VERIFY_IS_APPROX(m4=m2.innerVector(c)*dv1.transpose(), refMat4=refMat2.colVector(c)*dv1.transpose()); +// VERIFY_IS_APPROX(m4=dv1*mcm.col(c).transpose(), refMat4=dv1*refMat2.col(c).transpose()); + +template void sparse_product() { typedef typename SparseMatrixType::Index Index; - const Index rows = ref.rows(); - const Index cols = ref.cols(); + Index n = 100; + const Index rows = internal::random(1,n); + const Index cols = internal::random(1,n); + const Index depth = internal::random(1,n); typedef typename SparseMatrixType::Scalar Scalar; enum { Flags = SparseMatrixType::Flags }; @@ -41,50 +67,71 @@ template void sparse_product(const SparseMatrixType& // test matrix-matrix product { - DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); - DenseMatrix refMat3 = DenseMatrix::Zero(rows, rows); - DenseMatrix refMat4 = DenseMatrix::Zero(rows, rows); - DenseMatrix refMat5 = DenseMatrix::Random(rows, rows); + DenseMatrix refMat2 = DenseMatrix::Zero(rows, depth); + DenseMatrix refMat2t = DenseMatrix::Zero(depth, rows); + DenseMatrix refMat3 = DenseMatrix::Zero(depth, cols); + DenseMatrix refMat3t = DenseMatrix::Zero(cols, depth); + DenseMatrix refMat4 = DenseMatrix::Zero(rows, cols); + DenseMatrix refMat4t = DenseMatrix::Zero(cols, rows); + DenseMatrix refMat5 = DenseMatrix::Random(depth, cols); + DenseMatrix refMat6 = DenseMatrix::Random(rows, rows); DenseMatrix dm4 = DenseMatrix::Zero(rows, rows); - DenseVector dv1 = DenseVector::Random(rows); - SparseMatrixType m2(rows, rows); - SparseMatrixType m3(rows, rows); - SparseMatrixType m4(rows, rows); - initSparse(density, refMat2, m2); - initSparse(density, refMat3, m3); - initSparse(density, refMat4, m4); +// DenseVector dv1 = DenseVector::Random(rows); + SparseMatrixType m2 (rows, depth); + SparseMatrixType m2t(depth, rows); + SparseMatrixType m3 (depth, cols); + SparseMatrixType m3t(cols, depth); + SparseMatrixType m4 (rows, cols); + SparseMatrixType m4t(cols, rows); + SparseMatrixType m6(rows, rows); + initSparse(density, refMat2, m2); + initSparse(density, refMat2t, m2t); + initSparse(density, refMat3, m3); + initSparse(density, refMat3t, m3t); + initSparse(density, refMat4, m4); + initSparse(density, refMat4t, m4t); + initSparse(density, refMat6, m6); - int c = internal::random(0,rows-1); +// int c = internal::random(0,depth-1); + // sparse * sparse VERIFY_IS_APPROX(m4=m2*m3, refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(m4=m2.transpose()*m3, refMat4=refMat2.transpose()*refMat3); - VERIFY_IS_APPROX(m4=m2.transpose()*m3.transpose(), refMat4=refMat2.transpose()*refMat3.transpose()); - VERIFY_IS_APPROX(m4=m2*m3.transpose(), refMat4=refMat2*refMat3.transpose()); + VERIFY_IS_APPROX(m4=m2t.transpose()*m3, refMat4=refMat2t.transpose()*refMat3); + VERIFY_IS_APPROX(m4=m2t.transpose()*m3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose()); + VERIFY_IS_APPROX(m4=m2*m3t.transpose(), refMat4=refMat2*refMat3t.transpose()); VERIFY_IS_APPROX(m4 = m2*m3/s1, refMat4 = refMat2*refMat3/s1); VERIFY_IS_APPROX(m4 = m2*m3*s1, refMat4 = refMat2*refMat3*s1); VERIFY_IS_APPROX(m4 = s2*m2*m3*s1, refMat4 = s2*refMat2*refMat3*s1); + VERIFY_IS_APPROX(m4=(m2*m3).pruned(0), refMat4=refMat2*refMat3); + VERIFY_IS_APPROX(m4=(m2t.transpose()*m3).pruned(0), refMat4=refMat2t.transpose()*refMat3); + VERIFY_IS_APPROX(m4=(m2t.transpose()*m3t.transpose()).pruned(0), refMat4=refMat2t.transpose()*refMat3t.transpose()); + VERIFY_IS_APPROX(m4=(m2*m3t.transpose()).pruned(0), refMat4=refMat2*refMat3t.transpose()); + + // test aliasing + m4 = m2; refMat4 = refMat2; + VERIFY_IS_APPROX(m4=m4*m3, refMat4=refMat4*refMat3); + // sparse * dense VERIFY_IS_APPROX(dm4=m2*refMat3, refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(dm4=m2*refMat3.transpose(), refMat4=refMat2*refMat3.transpose()); - VERIFY_IS_APPROX(dm4=m2.transpose()*refMat3, refMat4=refMat2.transpose()*refMat3); - VERIFY_IS_APPROX(dm4=m2.transpose()*refMat3.transpose(), refMat4=refMat2.transpose()*refMat3.transpose()); + VERIFY_IS_APPROX(dm4=m2*refMat3t.transpose(), refMat4=refMat2*refMat3t.transpose()); + VERIFY_IS_APPROX(dm4=m2t.transpose()*refMat3, refMat4=refMat2t.transpose()*refMat3); + VERIFY_IS_APPROX(dm4=m2t.transpose()*refMat3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose()); VERIFY_IS_APPROX(dm4=m2*(refMat3+refMat3), refMat4=refMat2*(refMat3+refMat3)); - VERIFY_IS_APPROX(dm4=m2.transpose()*(refMat3+refMat5)*0.5, refMat4=refMat2.transpose()*(refMat3+refMat5)*0.5); + VERIFY_IS_APPROX(dm4=m2t.transpose()*(refMat3+refMat5)*0.5, refMat4=refMat2t.transpose()*(refMat3+refMat5)*0.5); // dense * sparse VERIFY_IS_APPROX(dm4=refMat2*m3, refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(dm4=refMat2*m3.transpose(), refMat4=refMat2*refMat3.transpose()); - VERIFY_IS_APPROX(dm4=refMat2.transpose()*m3, refMat4=refMat2.transpose()*refMat3); - VERIFY_IS_APPROX(dm4=refMat2.transpose()*m3.transpose(), refMat4=refMat2.transpose()*refMat3.transpose()); + VERIFY_IS_APPROX(dm4=refMat2*m3t.transpose(), refMat4=refMat2*refMat3t.transpose()); + VERIFY_IS_APPROX(dm4=refMat2t.transpose()*m3, refMat4=refMat2t.transpose()*refMat3); + VERIFY_IS_APPROX(dm4=refMat2t.transpose()*m3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose()); // sparse * dense and dense * sparse outer product - VERIFY_IS_APPROX(m4=m2.col(c)*dv1.transpose(), refMat4=refMat2.col(c)*dv1.transpose()); - VERIFY_IS_APPROX(m4=dv1*m2.col(c).transpose(), refMat4=dv1*refMat2.col(c).transpose()); + test_outer::run(m2,m4,refMat2,refMat4); - VERIFY_IS_APPROX(m3=m3*m3, refMat3=refMat3*refMat3); + VERIFY_IS_APPROX(m6=m6*m6, refMat6=refMat6*refMat6); } // test matrix - diagonal product @@ -116,18 +163,19 @@ template void sparse_product(const SparseMatrixType& do { initSparse(density, refUp, mUp, ForceRealDiag|/*ForceNonZeroDiag|*/MakeUpperTriangular); } while (refUp.isZero()); - refLo = refUp.transpose().conjugate(); - mLo = mUp.transpose().conjugate(); + refLo = refUp.adjoint(); + mLo = mUp.adjoint(); refS = refUp + refLo; refS.diagonal() *= 0.5; mS = mUp + mLo; + // TODO be able to address the diagonal.... for (int k=0; k void sparse_produc void test_sparse_product() { for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( sparse_product(SparseMatrix(8, 8)) ); - CALL_SUBTEST_2( sparse_product(SparseMatrix >(16, 16)) ); - CALL_SUBTEST_1( sparse_product(SparseMatrix(33, 33)) ); - - CALL_SUBTEST_3( sparse_product(DynamicSparseMatrix(8, 8)) ); - + CALL_SUBTEST_1( (sparse_product >()) ); + CALL_SUBTEST_1( (sparse_product >()) ); + CALL_SUBTEST_2( (sparse_product, ColMajor > >()) ); + CALL_SUBTEST_2( (sparse_product, RowMajor > >()) ); CALL_SUBTEST_4( (sparse_product_regression_test, Matrix >()) ); } } diff --git a/gtsam/3rdparty/Eigen/test/sparse_solver.h b/gtsam/3rdparty/Eigen/test/sparse_solver.h new file mode 100644 index 000000000..69bf716ed --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/sparse_solver.h @@ -0,0 +1,324 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse.h" +#include + +template +void check_sparse_solving(Solver& solver, const typename Solver::MatrixType& A, const Rhs& b, const DenseMat& dA, const DenseRhs& db) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + + DenseRhs refX = dA.lu().solve(db); + + Rhs x(b.rows(), b.cols()); + Rhs oldb = b; + + solver.compute(A); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: factorization failed (check_sparse_solving)\n"; + exit(0); + return; + } + x = solver.solve(b); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: solving failed\n"; + return; + } + VERIFY(oldb.isApprox(b) && "sparse solver testing: the rhs should not be modified!"); + + VERIFY(x.isApprox(refX,test_precision())); + + x.setZero(); + // test the analyze/factorize API + solver.analyzePattern(A); + solver.factorize(A); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: factorization failed (check_sparse_solving)\n"; + exit(0); + return; + } + x = solver.solve(b); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: solving failed\n"; + return; + } + VERIFY(oldb.isApprox(b) && "sparse solver testing: the rhs should not be modified!"); + + VERIFY(x.isApprox(refX,test_precision())); + + // test Block as the result and rhs: + { + DenseRhs x(db.rows(), db.cols()); + DenseRhs b(db), oldb(db); + x.setZero(); + x.block(0,0,x.rows(),x.cols()) = solver.solve(b.block(0,0,b.rows(),b.cols())); + VERIFY(oldb.isApprox(b) && "sparse solver testing: the rhs should not be modified!"); + VERIFY(x.isApprox(refX,test_precision())); + } +} + +template +void check_sparse_solving_real_cases(Solver& solver, const typename Solver::MatrixType& A, const Rhs& b, const Rhs& refX) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef typename Mat::RealScalar RealScalar; + + Rhs x(b.rows(), b.cols()); + + solver.compute(A); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: factorization failed (check_sparse_solving_real_cases)\n"; + exit(0); + return; + } + x = solver.solve(b); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: solving failed\n"; + return; + } + + RealScalar res_error; + // Compute the norm of the relative error + if(refX.size() != 0) + res_error = (refX - x).norm()/refX.norm(); + else + { + // Compute the relative residual norm + res_error = (b - A * x).norm()/b.norm(); + } + if (res_error > test_precision() ){ + std::cerr << "Test " << g_test_stack.back() << " failed in "EI_PP_MAKE_STRING(__FILE__) + << " (" << EI_PP_MAKE_STRING(__LINE__) << ")" << std::endl << std::endl; + abort(); + } + +} +template +void check_sparse_determinant(Solver& solver, const typename Solver::MatrixType& A, const DenseMat& dA) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef typename Mat::RealScalar RealScalar; + + solver.compute(A); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: factorization failed (check_sparse_determinant)\n"; + return; + } + + Scalar refDet = dA.determinant(); + VERIFY_IS_APPROX(refDet,solver.determinant()); +} + + +template +int generate_sparse_spd_problem(Solver& , typename Solver::MatrixType& A, typename Solver::MatrixType& halfA, DenseMat& dA, int maxSize = 300) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef Matrix DenseMatrix; + + int size = internal::random(1,maxSize); + double density = (std::max)(8./(size*size), 0.01); + + Mat M(size, size); + DenseMatrix dM(size, size); + + initSparse(density, dM, M, ForceNonZeroDiag); + + A = M * M.adjoint(); + dA = dM * dM.adjoint(); + + halfA.resize(size,size); + halfA.template selfadjointView().rankUpdate(M); + + return size; +} + + +#ifdef TEST_REAL_CASES +template +inline std::string get_matrixfolder() +{ + std::string mat_folder = TEST_REAL_CASES; + if( internal::is_same >::value || internal::is_same >::value ) + mat_folder = mat_folder + static_cast("/complex/"); + else + mat_folder = mat_folder + static_cast("/real/"); + return mat_folder; +} +#endif + +template void check_sparse_spd_solving(Solver& solver) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef typename Mat::Index Index; + typedef SparseMatrix SpMat; + typedef Matrix DenseMatrix; + typedef Matrix DenseVector; + + // generate the problem + Mat A, halfA; + DenseMatrix dA; + int size = generate_sparse_spd_problem(solver, A, halfA, dA); + + // generate the right hand sides + int rhsCols = internal::random(1,16); + double density = (std::max)(8./(size*rhsCols), 0.1); + SpMat B(size,rhsCols); + DenseVector b = DenseVector::Random(size); + DenseMatrix dB(size,rhsCols); + initSparse(density, dB, B, ForceNonZeroDiag); + + for (int i = 0; i < g_repeat; i++) { + check_sparse_solving(solver, A, b, dA, b); + check_sparse_solving(solver, halfA, b, dA, b); + check_sparse_solving(solver, A, dB, dA, dB); + check_sparse_solving(solver, halfA, dB, dA, dB); + check_sparse_solving(solver, A, B, dA, dB); + check_sparse_solving(solver, halfA, B, dA, dB); + } + + // First, get the folder +#ifdef TEST_REAL_CASES + if (internal::is_same::value + || internal::is_same >::value) + return ; + + std::string mat_folder = get_matrixfolder(); + MatrixMarketIterator it(mat_folder); + for (; it; ++it) + { + if (it.sym() == SPD){ + Mat halfA; + PermutationMatrix pnull; + halfA.template selfadjointView() = it.matrix().template triangularView().twistedBy(pnull); + + std::cout<< " ==== SOLVING WITH MATRIX " << it.matname() << " ==== \n"; + check_sparse_solving_real_cases(solver, it.matrix(), it.rhs(), it.refX()); + check_sparse_solving_real_cases(solver, halfA, it.rhs(), it.refX()); + } + } +#endif +} + +template void check_sparse_spd_determinant(Solver& solver) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef Matrix DenseMatrix; + + // generate the problem + Mat A, halfA; + DenseMatrix dA; + generate_sparse_spd_problem(solver, A, halfA, dA, 30); + + for (int i = 0; i < g_repeat; i++) { + check_sparse_determinant(solver, A, dA); + check_sparse_determinant(solver, halfA, dA ); + } +} + +template +int generate_sparse_square_problem(Solver&, typename Solver::MatrixType& A, DenseMat& dA, int maxSize = 300) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef Matrix DenseMatrix; + + int size = internal::random(1,maxSize); + double density = (std::max)(8./(size*size), 0.01); + + A.resize(size,size); + dA.resize(size,size); + + initSparse(density, dA, A, ForceNonZeroDiag); + + return size; +} + +template void check_sparse_square_solving(Solver& solver) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef Matrix DenseMatrix; + typedef Matrix DenseVector; + + int rhsCols = internal::random(1,16); + + Mat A; + DenseMatrix dA; + int size = generate_sparse_square_problem(solver, A, dA); + + DenseVector b = DenseVector::Random(size); + DenseMatrix dB = DenseMatrix::Random(size,rhsCols); + A.makeCompressed(); + for (int i = 0; i < g_repeat; i++) { + check_sparse_solving(solver, A, b, dA, b); + check_sparse_solving(solver, A, dB, dA, dB); + } + + // First, get the folder +#ifdef TEST_REAL_CASES + if (internal::is_same::value + || internal::is_same >::value) + return ; + + std::string mat_folder = get_matrixfolder(); + MatrixMarketIterator it(mat_folder); + for (; it; ++it) + { + std::cout<< " ==== SOLVING WITH MATRIX " << it.matname() << " ==== \n"; + check_sparse_solving_real_cases(solver, it.matrix(), it.rhs(), it.refX()); + } +#endif + +} + +template void check_sparse_square_determinant(Solver& solver) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef Matrix DenseMatrix; + + // generate the problem + Mat A; + DenseMatrix dA; + generate_sparse_square_problem(solver, A, dA, 30); + A.makeCompressed(); + for (int i = 0; i < g_repeat; i++) { + check_sparse_determinant(solver, A, dA); + } +} diff --git a/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp b/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp index 12a1cb9b6..a3d79b0ea 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp @@ -72,6 +72,15 @@ template void sparse_solvers(int rows, int cols) initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords); VERIFY_IS_APPROX(refMat2.template triangularView().solve(vec2), m2.template triangularView().solve(vec3)); + VERIFY_IS_APPROX(refMat2.conjugate().template triangularView().solve(vec2), + m2.conjugate().template triangularView().solve(vec3)); + { + SparseMatrix cm2(m2); + //Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr + MappedSparseMatrix mm2(rows, cols, cm2.nonZeros(), cm2.outerIndexPtr(), cm2.innerIndexPtr(), cm2.valuePtr()); + VERIFY_IS_APPROX(refMat2.conjugate().template triangularView().solve(vec2), + mm2.conjugate().template triangularView().solve(vec3)); + } // lower - transpose initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords); diff --git a/gtsam/3rdparty/Eigen/test/sparse_vector.cpp b/gtsam/3rdparty/Eigen/test/sparse_vector.cpp index e0c281c83..09d36a51b 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_vector.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_vector.cpp @@ -1,7 +1,7 @@ // This file is part of Eigen, a lightweight C++ template library // for linear algebra. // -// Copyright (C) 2008 Daniel Gomez Ferro +// Copyright (C) 2008-2011 Gael Guennebaud // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -34,9 +34,9 @@ template void sparse_vector(int rows, int cols) typedef SparseMatrix SparseMatrixType; Scalar eps = 1e-6; - SparseMatrixType m1(rows,cols); + SparseMatrixType m1(rows,rows); SparseVectorType v1(rows), v2(rows), v3(rows); - DenseMatrix refM1 = DenseMatrix::Zero(rows, cols); + DenseMatrix refM1 = DenseMatrix::Zero(rows, rows); DenseVector refV1 = DenseVector::Random(rows), refV2 = DenseVector::Random(rows), refV3 = DenseVector::Random(rows); @@ -86,6 +86,11 @@ template void sparse_vector(int rows, int cols) VERIFY_IS_APPROX(v1.dot(v2), refV1.dot(refV2)); VERIFY_IS_APPROX(v1.dot(refV2), refV1.dot(refV2)); + VERIFY_IS_APPROX(v1.dot(m1*v2), refV1.dot(refM1*refV2)); + int i = internal::random(0,rows-1); + VERIFY_IS_APPROX(v1.dot(m1.col(i)), refV1.dot(refM1.col(i))); + + VERIFY_IS_APPROX(v1.squaredNorm(), refV1.squaredNorm()); } diff --git a/gtsam/3rdparty/Eigen/test/superlu_support.cpp b/gtsam/3rdparty/Eigen/test/superlu_support.cpp new file mode 100644 index 000000000..ad435943b --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/superlu_support.cpp @@ -0,0 +1,37 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse_solver.h" + +#include + +void test_superlu_support() +{ + SuperLU > superlu_double_colmajor; + SuperLU > > superlu_cplxdouble_colmajor; + CALL_SUBTEST_1( check_sparse_square_solving(superlu_double_colmajor) ); + CALL_SUBTEST_2( check_sparse_square_solving(superlu_cplxdouble_colmajor) ); + CALL_SUBTEST_1( check_sparse_square_determinant(superlu_double_colmajor) ); + CALL_SUBTEST_2( check_sparse_square_determinant(superlu_cplxdouble_colmajor) ); +} diff --git a/gtsam/3rdparty/Eigen/test/triangular.cpp b/gtsam/3rdparty/Eigen/test/triangular.cpp index 69decb793..4db8f8482 100644 --- a/gtsam/3rdparty/Eigen/test/triangular.cpp +++ b/gtsam/3rdparty/Eigen/test/triangular.cpp @@ -42,16 +42,8 @@ template void triangular_square(const MatrixType& m) m3(rows, cols), m4(rows, cols), r1(rows, cols), - r2(rows, cols), - mzero = MatrixType::Zero(rows, cols), - mones = MatrixType::Ones(rows, cols), - identity = Matrix - ::Identity(rows, rows), - square = Matrix - ::Random(rows, rows); - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), - vzero = VectorType::Zero(rows); + r2(rows, cols); + VectorType v2 = VectorType::Random(rows); MatrixType m1up = m1.template triangularView(); MatrixType m2up = m2.template triangularView(); @@ -113,14 +105,14 @@ template void triangular_square(const MatrixType& m) // check M * inv(L) using in place API m4 = m3; - m3.transpose().template triangularView().solveInPlace(trm4); - VERIFY(m4.cwiseAbs().isIdentity(test_precision())); + m1.transpose().template triangularView().solveInPlace(trm4); + VERIFY_IS_APPROX(m4 * m1.template triangularView(), m3); // check M * inv(U) using in place API m3 = m1.template triangularView(); m4 = m3; m3.transpose().template triangularView().solveInPlace(trm4); - VERIFY(m4.cwiseAbs().isIdentity(test_precision())); + VERIFY_IS_APPROX(m4 * m1.template triangularView(), m3); // check solve with unit diagonal m3 = m1.template triangularView(); @@ -158,21 +150,12 @@ template void triangular_rect(const MatrixType& m) m3(rows, cols), m4(rows, cols), r1(rows, cols), - r2(rows, cols), - mzero = MatrixType::Zero(rows, cols), - mones = MatrixType::Ones(rows, cols); - RMatrixType identity = Matrix - ::Identity(rows, rows), - square = Matrix - ::Random(rows, rows); - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), - vzero = VectorType::Zero(rows); + r2(rows, cols); MatrixType m1up = m1.template triangularView(); MatrixType m2up = m2.template triangularView(); - if (rows*cols>1) + if (rows>1 && cols>1) { VERIFY(m1up.isUpperTriangular()); VERIFY(m2up.transpose().isLowerTriangular()); @@ -237,15 +220,17 @@ template void triangular_rect(const MatrixType& m) void bug_159() { - Matrix3d m = Matrix3d::Random().triangularView(); + Matrix3d m = Matrix3d::Random().triangularView(); + EIGEN_UNUSED_VARIABLE(m) } void test_triangular() { + int maxsize = (std::min)(EIGEN_TEST_MAX_SIZE,20); for(int i = 0; i < g_repeat ; i++) { - int r = internal::random(2,20); EIGEN_UNUSED_VARIABLE(r); - int c = internal::random(2,20); EIGEN_UNUSED_VARIABLE(c); + int r = internal::random(2,maxsize); EIGEN_UNUSED_VARIABLE(r); + int c = internal::random(2,maxsize); EIGEN_UNUSED_VARIABLE(c); CALL_SUBTEST_1( triangular_square(Matrix()) ); CALL_SUBTEST_2( triangular_square(Matrix()) ); diff --git a/gtsam/3rdparty/Eigen/test/umfpack_support.cpp b/gtsam/3rdparty/Eigen/test/umfpack_support.cpp new file mode 100644 index 000000000..1922aa959 --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/umfpack_support.cpp @@ -0,0 +1,46 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "sparse_solver.h" + +#include + +template void test_umfpack_support_T() +{ + UmfPackLU > umfpack_colmajor; + UmfPackLU > umfpack_rowmajor; + + check_sparse_square_solving(umfpack_colmajor); + check_sparse_square_solving(umfpack_rowmajor); + + check_sparse_square_determinant(umfpack_colmajor); + check_sparse_square_determinant(umfpack_rowmajor); +} + +void test_umfpack_support() +{ + CALL_SUBTEST_1(test_umfpack_support_T()); + CALL_SUBTEST_2(test_umfpack_support_T >()); +} + diff --git a/gtsam/3rdparty/Eigen/test/vectorwiseop.cpp b/gtsam/3rdparty/Eigen/test/vectorwiseop.cpp new file mode 100644 index 000000000..d3518b7ec --- /dev/null +++ b/gtsam/3rdparty/Eigen/test/vectorwiseop.cpp @@ -0,0 +1,187 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Benoit Jacob +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#define EIGEN_NO_STATIC_ASSERT + +#include "main.h" + +template void vectorwiseop_array(const ArrayType& m) +{ + typedef typename ArrayType::Index Index; + typedef typename ArrayType::Scalar Scalar; + typedef typename NumTraits::Real RealScalar; + typedef Array ColVectorType; + typedef Array RowVectorType; + + Index rows = m.rows(); + Index cols = m.cols(); + Index r = internal::random(0, rows-1), + c = internal::random(0, cols-1); + + ArrayType m1 = ArrayType::Random(rows, cols), + m2(rows, cols), + m3(rows, cols); + + ColVectorType colvec = ColVectorType::Random(rows); + RowVectorType rowvec = RowVectorType::Random(cols); + + // test addition + + m2 = m1; + m2.colwise() += colvec; + VERIFY_IS_APPROX(m2, m1.colwise() + colvec); + VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec); + + VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose()); + VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose()); + + m2 = m1; + m2.rowwise() += rowvec; + VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec); + VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec); + + VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose()); + VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose()); + + // test substraction + + m2 = m1; + m2.colwise() -= colvec; + VERIFY_IS_APPROX(m2, m1.colwise() - colvec); + VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec); + + VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose()); + VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose()); + + m2 = m1; + m2.rowwise() -= rowvec; + VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec); + VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec); + + VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose()); + VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose()); + + // test multiplication + + m2 = m1; + m2.colwise() *= colvec; + VERIFY_IS_APPROX(m2, m1.colwise() * colvec); + VERIFY_IS_APPROX(m2.col(c), m1.col(c) * colvec); + + VERIFY_RAISES_ASSERT(m2.colwise() *= colvec.transpose()); + VERIFY_RAISES_ASSERT(m1.colwise() * colvec.transpose()); + + m2 = m1; + m2.rowwise() *= rowvec; + VERIFY_IS_APPROX(m2, m1.rowwise() * rowvec); + VERIFY_IS_APPROX(m2.row(r), m1.row(r) * rowvec); + + VERIFY_RAISES_ASSERT(m2.rowwise() *= rowvec.transpose()); + VERIFY_RAISES_ASSERT(m1.rowwise() * rowvec.transpose()); + + // test quotient + + m2 = m1; + m2.colwise() /= colvec; + VERIFY_IS_APPROX(m2, m1.colwise() / colvec); + VERIFY_IS_APPROX(m2.col(c), m1.col(c) / colvec); + + VERIFY_RAISES_ASSERT(m2.colwise() /= colvec.transpose()); + VERIFY_RAISES_ASSERT(m1.colwise() / colvec.transpose()); + + m2 = m1; + m2.rowwise() /= rowvec; + VERIFY_IS_APPROX(m2, m1.rowwise() / rowvec); + VERIFY_IS_APPROX(m2.row(r), m1.row(r) / rowvec); + + VERIFY_RAISES_ASSERT(m2.rowwise() /= rowvec.transpose()); + VERIFY_RAISES_ASSERT(m1.rowwise() / rowvec.transpose()); +} + +template void vectorwiseop_matrix(const MatrixType& m) +{ + typedef typename MatrixType::Index Index; + typedef typename MatrixType::Scalar Scalar; + typedef typename NumTraits::Real RealScalar; + typedef Matrix ColVectorType; + typedef Matrix RowVectorType; + + Index rows = m.rows(); + Index cols = m.cols(); + Index r = internal::random(0, rows-1), + c = internal::random(0, cols-1); + + MatrixType m1 = MatrixType::Random(rows, cols), + m2(rows, cols), + m3(rows, cols); + + ColVectorType colvec = ColVectorType::Random(rows); + RowVectorType rowvec = RowVectorType::Random(cols); + + // test addition + + m2 = m1; + m2.colwise() += colvec; + VERIFY_IS_APPROX(m2, m1.colwise() + colvec); + VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec); + + VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose()); + VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose()); + + m2 = m1; + m2.rowwise() += rowvec; + VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec); + VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec); + + VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose()); + VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose()); + + // test substraction + + m2 = m1; + m2.colwise() -= colvec; + VERIFY_IS_APPROX(m2, m1.colwise() - colvec); + VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec); + + VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose()); + VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose()); + + m2 = m1; + m2.rowwise() -= rowvec; + VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec); + VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec); + + VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose()); + VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose()); +} + +void test_vectorwiseop() +{ + CALL_SUBTEST_1(vectorwiseop_array(Array22cd())); + CALL_SUBTEST_2(vectorwiseop_array(Array())); + CALL_SUBTEST_3(vectorwiseop_array(ArrayXXf(3, 4))); + CALL_SUBTEST_4(vectorwiseop_matrix(Matrix4cf())); + CALL_SUBTEST_5(vectorwiseop_matrix(Matrix())); + CALL_SUBTEST_6(vectorwiseop_matrix(MatrixXd(7,2))); +} diff --git a/gtsam/3rdparty/Eigen/test/zerosized.cpp b/gtsam/3rdparty/Eigen/test/zerosized.cpp index 06e31cc09..c5d2cc6ed 100644 --- a/gtsam/3rdparty/Eigen/test/zerosized.cpp +++ b/gtsam/3rdparty/Eigen/test/zerosized.cpp @@ -62,8 +62,13 @@ void test_zerosized() zeroSizedMatrix(); zeroSizedMatrix >(); zeroSizedMatrix(); + zeroSizedMatrix >(); + zeroSizedMatrix >(); + zeroSizedMatrix >(); + zeroSizedMatrix >(); zeroSizedVector(); zeroSizedVector(); zeroSizedVector(); + zeroSizedVector >(); } diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/AdolcForward b/gtsam/3rdparty/Eigen/unsupported/Eigen/AdolcForward index 6c0a68d67..477c75378 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/AdolcForward +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/AdolcForward @@ -79,33 +79,22 @@ namespace Eigen { } // namespace Eigen -// the Adolc's type adouble is defined in the adtl namespace -// therefore, the following internal::* functions *must* be defined -// in the same namespace -namespace Eigen { +// Eigen's require a few additional functions which must be defined in the same namespace +// than the custom scalar type own namespace +namespace adtl { - namespace internal { - - inline const adtl::adouble& conj(const adtl::adouble& x) { return x; } - inline const adtl::adouble& real(const adtl::adouble& x) { return x; } - inline adtl::adouble imag(const adtl::adouble&) { return 0.; } - inline adtl::adouble abs(const adtl::adouble& x) { return adtl::fabs(x); } - inline adtl::adouble abs2(const adtl::adouble& x) { return x*x; } - - using adtl::sqrt; - using adtl::exp; - using adtl::log; - using adtl::sin; - using adtl::cos; - using adtl::pow; - - } +inline const adouble& conj(const adouble& x) { return x; } +inline const adouble& real(const adouble& x) { return x; } +inline adouble imag(const adouble&) { return 0.; } +inline adouble abs(const adouble& x) { return fabs(x); } +inline adouble abs2(const adouble& x) { return x*x; } } namespace Eigen { template<> struct NumTraits + : NumTraits { typedef adtl::adouble Real; typedef adtl::adouble NonInteger; diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/BVH b/gtsam/3rdparty/Eigen/unsupported/Eigen/BVH index f307da2f7..d50b2bdab 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/BVH +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/BVH @@ -97,8 +97,9 @@ namespace Eigen { * The following is a simple but complete example for how to use the BVH to accelerate the search for a closest red-blue point pair: * \include BVH_Example.cpp * Output: \verbinclude BVH_Example.out - */ +} + //@{ #include "src/BVH/BVAlgorithms.h" @@ -106,6 +107,4 @@ namespace Eigen { //@} -} - #endif // EIGEN_BVH_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/CMakeLists.txt b/gtsam/3rdparty/Eigen/unsupported/Eigen/CMakeLists.txt index 219ec8ead..e961e72c5 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/CMakeLists.txt @@ -1,6 +1,6 @@ set(Eigen_HEADERS AdolcForward BVH IterativeSolvers MatrixFunctions MoreVectorization AutoDiff AlignedVector3 Polynomials - CholmodSupport FFT NonLinearOptimization SparseExtra SuperLUSupport UmfPackSupport IterativeSolvers - NumericalDiff Skyline MPRealSupport OpenGLSupport + FFT NonLinearOptimization SparseExtra IterativeSolvers + NumericalDiff Skyline MPRealSupport OpenGLSupport KroneckerProduct Splines ) install(FILES diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/CholmodSupport b/gtsam/3rdparty/Eigen/unsupported/Eigen/CholmodSupport deleted file mode 100644 index 8a4a130c3..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/CholmodSupport +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef EIGEN_CHOLMODSUPPORT_MODULE_H -#define EIGEN_CHOLMODSUPPORT_MODULE_H - -#include "SparseExtra" - -#include "../../Eigen/src/Core/util/DisableStupidWarnings.h" - -extern "C" { - #include -} - -namespace Eigen { - -/** \ingroup Unsupported_modules - * \defgroup CholmodSupport_Module Cholmod Support module - * - * - * \code - * #include - * \endcode - */ - -struct Cholmod {}; -#include "src/SparseExtra/CholmodSupportLegacy.h" -#include "src/SparseExtra/CholmodSupport.h" - - -} // namespace Eigen - -#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_CHOLMODSUPPORT_MODULE_H - diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT b/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT index c56bd63d6..e2ec71307 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT @@ -86,23 +86,23 @@ #ifdef EIGEN_FFTW_DEFAULT // FFTW: faster, GPL -- incompatible with Eigen in LGPL form, bigger code size # include +# include "src/FFT/ei_fftw_impl.h" namespace Eigen { -# include "src/FFT/ei_fftw_impl.h" //template typedef struct internal::fftw_impl default_fft_impl; this does not work template struct default_fft_impl : public internal::fftw_impl {}; } #elif defined EIGEN_MKL_DEFAULT // TODO // intel Math Kernel Library: fastest, commercial -- may be incompatible with Eigen in GPL form +# include "src/FFT/ei_imklfft_impl.h" namespace Eigen { -# include "src/FFT/ei_imklfft_impl.h" template struct default_fft_impl : public internal::imklfft_impl {}; } #else // internal::kissfft_impl: small, free, reasonably efficient default, derived from kissfft // +# include "src/FFT/ei_kissfft_impl.h" namespace Eigen { -# include "src/FFT/ei_kissfft_impl.h" template struct default_fft_impl : public internal::kissfft_impl {}; } diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/IterativeSolvers b/gtsam/3rdparty/Eigen/unsupported/Eigen/IterativeSolvers index bf1a9460b..4645153aa 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/IterativeSolvers +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/IterativeSolvers @@ -25,27 +25,31 @@ #ifndef EIGEN_ITERATIVE_SOLVERS_MODULE_H #define EIGEN_ITERATIVE_SOLVERS_MODULE_H -#include - -namespace Eigen { +#include /** \ingroup Unsupported_modules * \defgroup IterativeSolvers_Module Iterative solvers module * This module aims to provide various iterative linear and non linear solver algorithms. * It currently provides: * - a constrained conjugate gradient - * + * - a Householder GMRES implementation * \code * #include * \endcode */ //@{ +#include "../../Eigen/src/misc/Solve.h" +#include "../../Eigen/src/misc/SparseSolve.h" + #include "src/IterativeSolvers/IterationController.h" #include "src/IterativeSolvers/ConstrainedConjGrad.h" +#include "src/IterativeSolvers/IncompleteLU.h" +#include "../../Eigen/Jacobi" +#include "../../Eigen/Householder" +#include "src/IterativeSolvers/GMRES.h" +//#include "src/IterativeSolvers/SSORPreconditioner.h" //@} -} - #endif // EIGEN_ITERATIVE_SOLVERS_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/KroneckerProduct b/gtsam/3rdparty/Eigen/unsupported/Eigen/KroneckerProduct new file mode 100644 index 000000000..796e386ad --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/KroneckerProduct @@ -0,0 +1,26 @@ +#ifndef EIGEN_KRONECKER_PRODUCT_MODULE_H +#define EIGEN_KRONECKER_PRODUCT_MODULE_H + +#include "../../Eigen/Core" + +#include "../../Eigen/src/Core/util/DisableStupidWarnings.h" + +namespace Eigen { + +/** \ingroup Unsupported_modules + * \defgroup KroneckerProduct_Module KroneckerProduct module + * + * This module contains an experimental Kronecker product implementation. + * + * \code + * #include + * \endcode + */ + +} // namespace Eigen + +#include "src/KroneckerProduct/KroneckerTensorProduct.h" + +#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h" + +#endif // EIGEN_KRONECKER_PRODUCT_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport b/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport index 8f2396353..b5fe5e404 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport @@ -30,11 +30,12 @@ #ifndef EIGEN_MPREALSUPPORT_MODULE_H #define EIGEN_MPREALSUPPORT_MODULE_H +#include #include #include namespace Eigen { - + /** \ingroup Unsupported_modules * \defgroup MPRealSupport_Module MPFRC++ Support module * @@ -43,7 +44,7 @@ namespace Eigen { * \endcode * * This module provides support for multi precision floating point numbers - * via the MPFR C++ + * via the MPFR C++ * library which itself is built upon MPFR/GMP. * * You can find a copy of MPFR C++ that is known to be compatible in the unsupported/test/mpreal folder. @@ -52,7 +53,7 @@ namespace Eigen { * \code #include -#include +#include #include using namespace mpfr; using namespace Eigen; @@ -106,7 +107,7 @@ int main() } }; - namespace internal { +namespace internal { template<> mpfr::mpreal random() { @@ -146,8 +147,17 @@ int main() { return a <= b || isApprox(a, b, prec); } + + template<> inline long double cast(const mpfr::mpreal& x) + { return x.toLDouble(); } + template<> inline double cast(const mpfr::mpreal& x) + { return x.toDouble(); } + template<> inline long cast(const mpfr::mpreal& x) + { return x.toLong(); } + template<> inline int cast(const mpfr::mpreal& x) + { return int(x.toLong()); } - } // end namespace internal +} // end namespace internal } #endif // EIGEN_MPREALSUPPORT_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/MatrixFunctions b/gtsam/3rdparty/Eigen/unsupported/Eigen/MatrixFunctions index d39c49e53..13eda8fc8 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/MatrixFunctions +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/MatrixFunctions @@ -25,6 +25,7 @@ #ifndef EIGEN_MATRIX_FUNCTIONS #define EIGEN_MATRIX_FUNCTIONS +#include #include #include #include @@ -33,8 +34,6 @@ #include #include -namespace Eigen { - /** \ingroup Unsupported_modules * \defgroup MatrixFunctions_Module Matrix functions module * \brief This module aims to provide various methods for the computation of @@ -50,9 +49,11 @@ namespace Eigen { * - \ref matrixbase_cos "MatrixBase::cos()", for computing the matrix cosine * - \ref matrixbase_cosh "MatrixBase::cosh()", for computing the matrix hyperbolic cosine * - \ref matrixbase_exp "MatrixBase::exp()", for computing the matrix exponential + * - \ref matrixbase_log "MatrixBase::log()", for computing the matrix logarithm * - \ref matrixbase_matrixfunction "MatrixBase::matrixFunction()", for computing general matrix functions * - \ref matrixbase_sin "MatrixBase::sin()", for computing the matrix sine * - \ref matrixbase_sinh "MatrixBase::sinh()", for computing the matrix hyperbolic sine + * - \ref matrixbase_sqrt "MatrixBase::sqrt()", for computing the matrix square root * * These methods are the main entry points to this module. * @@ -69,6 +70,8 @@ namespace Eigen { #include "src/MatrixFunctions/MatrixExponential.h" #include "src/MatrixFunctions/MatrixFunction.h" +#include "src/MatrixFunctions/MatrixSquareRoot.h" +#include "src/MatrixFunctions/MatrixLogarithm.h" @@ -166,10 +169,67 @@ the z-axis. \include MatrixExponential.cpp Output: \verbinclude MatrixExponential.out -\note \p M has to be a matrix of \c float, \c double, -\c complex or \c complex . +\note \p M has to be a matrix of \c float, \c double, \c long double +\c complex, \c complex, or \c complex . +\section matrixbase_log MatrixBase::log() + +Compute the matrix logarithm. + +\code +const MatrixLogarithmReturnValue MatrixBase::log() const +\endcode + +\param[in] M invertible matrix whose logarithm is to be computed. +\returns expression representing the matrix logarithm root of \p M. + +The matrix logarithm of \f$ M \f$ is a matrix \f$ X \f$ such that +\f$ \exp(X) = M \f$ where exp denotes the matrix exponential. As for +the scalar logarithm, the equation \f$ \exp(X) = M \f$ may have +multiple solutions; this function returns a matrix whose eigenvalues +have imaginary part in the interval \f$ (-\pi,\pi] \f$. + +In the real case, the matrix \f$ M \f$ should be invertible and +it should have no eigenvalues which are real and negative (pairs of +complex conjugate eigenvalues are allowed). In the complex case, it +only needs to be invertible. + +This function computes the matrix logarithm using the Schur-Parlett +algorithm as implemented by MatrixBase::matrixFunction(). The +logarithm of an atomic block is computed by MatrixLogarithmAtomic, +which uses direct computation for 1-by-1 and 2-by-2 blocks and an +inverse scaling-and-squaring algorithm for bigger blocks, with the +square roots computed by MatrixBase::sqrt(). + +Details of the algorithm can be found in Section 11.6.2 of: +Nicholas J. Higham, +Functions of Matrices: Theory and Computation, +SIAM 2008. ISBN 978-0-898716-46-7. + +Example: The following program checks that +\f[ \log \left[ \begin{array}{ccc} + \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\ + \frac12\sqrt2 & \frac12\sqrt2 & 0 \\ + 0 & 0 & 1 + \end{array} \right] = \left[ \begin{array}{ccc} + 0 & \frac14\pi & 0 \\ + -\frac14\pi & 0 & 0 \\ + 0 & 0 & 0 + \end{array} \right]. \f] +This corresponds to a rotation of \f$ \frac14\pi \f$ radians around +the z-axis. This is the inverse of the example used in the +documentation of \ref matrixbase_exp "exp()". + +\include MatrixLogarithm.cpp +Output: \verbinclude MatrixLogarithm.out + +\note \p M has to be a matrix of \c float, \c double, \c long double +\c complex, \c complex, or \c complex . + +\sa MatrixBase::exp(), MatrixBase::matrixFunction(), + class MatrixLogarithmAtomic, MatrixBase::sqrt(). + \section matrixbase_matrixfunction MatrixBase::matrixFunction() @@ -245,7 +305,7 @@ Output: \verbinclude MatrixSine.out -\section matrixbase_sinh const MatrixBase::sinh() +\section matrixbase_sinh MatrixBase::sinh() Compute the matrix hyperbolic sine. @@ -261,9 +321,75 @@ This function calls \ref matrixbase_matrixfunction "matrixFunction()" with StdSt Example: \include MatrixSinh.cpp Output: \verbinclude MatrixSinh.out -*/ -} +\section matrixbase_sqrt MatrixBase::sqrt() + +Compute the matrix square root. + +\code +const MatrixSquareRootReturnValue MatrixBase::sqrt() const +\endcode + +\param[in] M invertible matrix whose square root is to be computed. +\returns expression representing the matrix square root of \p M. + +The matrix square root of \f$ M \f$ is the matrix \f$ M^{1/2} \f$ +whose square is the original matrix; so if \f$ S = M^{1/2} \f$ then +\f$ S^2 = M \f$. + +In the real case, the matrix \f$ M \f$ should be invertible and +it should have no eigenvalues which are real and negative (pairs of +complex conjugate eigenvalues are allowed). In that case, the matrix +has a square root which is also real, and this is the square root +computed by this function. + +The matrix square root is computed by first reducing the matrix to +quasi-triangular form with the real Schur decomposition. The square +root of the quasi-triangular matrix can then be computed directly. The +cost is approximately \f$ 25 n^3 \f$ real flops for the real Schur +decomposition and \f$ 3\frac13 n^3 \f$ real flops for the remainder +(though the computation time in practice is likely more than this +indicates). + +Details of the algorithm can be found in: Nicholas J. Highan, +"Computing real square roots of a real matrix", Linear Algebra +Appl., 88/89:405–430, 1987. + +If the matrix is positive-definite symmetric, then the square +root is also positive-definite symmetric. In this case, it is best to +use SelfAdjointEigenSolver::operatorSqrt() to compute it. + +In the complex case, the matrix \f$ M \f$ should be invertible; +this is a restriction of the algorithm. The square root computed by +this algorithm is the one whose eigenvalues have an argument in the +interval \f$ (-\frac12\pi, \frac12\pi] \f$. This is the usual branch +cut. + +The computation is the same as in the real case, except that the +complex Schur decomposition is used to reduce the matrix to a +triangular matrix. The theoretical cost is the same. Details are in: +Åke Björck and Sven Hammarling, "A Schur method for the +square root of a matrix", Linear Algebra Appl., +52/53:127–140, 1983. + +Example: The following program checks that the square root of +\f[ \left[ \begin{array}{cc} + \cos(\frac13\pi) & -\sin(\frac13\pi) \\ + \sin(\frac13\pi) & \cos(\frac13\pi) + \end{array} \right], \f] +corresponding to a rotation over 60 degrees, is a rotation over 30 degrees: +\f[ \left[ \begin{array}{cc} + \cos(\frac16\pi) & -\sin(\frac16\pi) \\ + \sin(\frac16\pi) & \cos(\frac16\pi) + \end{array} \right]. \f] + +\include MatrixSquareRoot.cpp +Output: \verbinclude MatrixSquareRoot.out + +\sa class RealSchur, class ComplexSchur, class MatrixSquareRoot, + SelfAdjointEigenSolver::operatorSqrt(). + +*/ #endif // EIGEN_MATRIX_FUNCTIONS diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/MoreVectorization b/gtsam/3rdparty/Eigen/unsupported/Eigen/MoreVectorization index 26a01cd29..9f0a39f75 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/MoreVectorization +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/MoreVectorization @@ -9,8 +9,8 @@ namespace Eigen { * \defgroup MoreVectorization More vectorization module */ -#include "src/MoreVectorization/MathFunctions.h" - } +#include "src/MoreVectorization/MathFunctions.h" + #endif // EIGEN_MOREVECTORIZATION_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/NonLinearOptimization b/gtsam/3rdparty/Eigen/unsupported/Eigen/NonLinearOptimization index e19db33cc..0a384d649 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/NonLinearOptimization +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/NonLinearOptimization @@ -32,8 +32,6 @@ #include #include -namespace Eigen { - /** \ingroup Unsupported_modules * \defgroup NonLinearOptimization_Module Non linear optimization module * @@ -147,8 +145,5 @@ namespace Eigen { #include "src/NonLinearOptimization/HybridNonLinearSolver.h" #include "src/NonLinearOptimization/LevenbergMarquardt.h" -} - - #endif // EIGEN_NONLINEAROPTIMIZATION_MODULE diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/NumericalDiff b/gtsam/3rdparty/Eigen/unsupported/Eigen/NumericalDiff index 2a59c14d5..eebee076d 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/NumericalDiff +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/NumericalDiff @@ -59,12 +59,13 @@ namespace Eigen { * package. * */ +} + //@{ #include "src/NumericalDiff/NumericalDiff.h" //@} -} #endif // EIGEN_NUMERICALDIFF_MODULE diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/Polynomials b/gtsam/3rdparty/Eigen/unsupported/Eigen/Polynomials index 2c2f3e100..fa58b006d 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/Polynomials +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/Polynomials @@ -16,8 +16,6 @@ #undef EIGEN_HIDE_HEAVY_CODE #endif -namespace Eigen { - /** \ingroup Unsupported_modules * \defgroup Polynomials_Module Polynomials module * @@ -129,8 +127,6 @@ namespace Eigen { Output: \verbinclude PolynomialSolver1.out */ -} // namespace Eigen - #include #endif // EIGEN_POLYNOMIALS_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/Skyline b/gtsam/3rdparty/Eigen/unsupported/Eigen/Skyline index 5247b2eab..c9823f358 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/Skyline +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/Skyline @@ -11,15 +11,13 @@ #include #include -namespace Eigen { - - /** \ingroup Unsupported_modules - * \defgroup Skyline_Module Skyline module - * - * - * - * - */ +/** \ingroup Unsupported_modules + * \defgroup Skyline_Module Skyline module + * + * + * + * + */ #include "src/Skyline/SkylineUtil.h" #include "src/Skyline/SkylineMatrixBase.h" @@ -28,8 +26,6 @@ namespace Eigen { #include "src/Skyline/SkylineInplaceLU.h" #include "src/Skyline/SkylineProduct.h" -} // namespace Eigen - #include "Eigen/src/Core/util/ReenableStupidWarnings.h" #endif // EIGEN_SKYLINE_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/SparseExtra b/gtsam/3rdparty/Eigen/unsupported/Eigen/SparseExtra index 7bab7c72b..340c34736 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/SparseExtra +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/SparseExtra @@ -10,13 +10,13 @@ #include #include #include +#include +#include #ifdef EIGEN_GOOGLEHASH_SUPPORT #include #endif -namespace Eigen { - /** \ingroup Unsupported_modules * \defgroup SparseExtra_Module SparseExtra module * @@ -27,42 +27,20 @@ namespace Eigen { * \endcode */ -struct DefaultBackend {}; - - -// solver flags -enum { - CompleteFactorization = 0x0000, // the default - IncompleteFactorization = 0x0001, - MemoryEfficient = 0x0002, - - // For LLT Cholesky: - SupernodalMultifrontal = 0x0010, - SupernodalLeftLooking = 0x0020, - - // Ordering methods: - NaturalOrdering = 0x0100, // the default - MinimumDegree_AT_PLUS_A = 0x0200, - MinimumDegree_ATA = 0x0300, - ColApproxMinimumDegree = 0x0400, - Metis = 0x0500, - Scotch = 0x0600, - Chaco = 0x0700, - OrderingMask = 0x0f00 -}; #include "../../Eigen/src/misc/Solve.h" +#include "../../Eigen/src/misc/SparseSolve.h" +#include "src/SparseExtra/DynamicSparseMatrix.h" +#include "src/SparseExtra/BlockOfDynamicSparseMatrix.h" #include "src/SparseExtra/RandomSetter.h" -#include "src/SparseExtra/Solve.h" -#include "src/SparseExtra/Amd.h" -#include "src/SparseExtra/SimplicialCholesky.h" -#include "src/SparseExtra/SparseLLT.h" -#include "src/SparseExtra/SparseLDLTLegacy.h" -#include "src/SparseExtra/SparseLU.h" +#include "src/SparseExtra/MarketIO.h" -} // namespace Eigen +#if !defined(_WIN32) +#include +#include "src/SparseExtra/MatrixMarketIterator.h" +#endif #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h" diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/EigenvaluesCommon.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/Splines similarity index 63% rename from gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/EigenvaluesCommon.h rename to gtsam/3rdparty/Eigen/unsupported/Eigen/Splines index 749bea795..33769b0e4 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/EigenvaluesCommon.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/Splines @@ -1,7 +1,7 @@ // This file is part of Eigen, a lightweight C++ template library // for linear algebra. // -// Copyright (C) 2010 Jitse Niesen +// Copyright (C) 20010-2011 Hauke Heibel // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -22,10 +22,25 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see . -#ifndef EIGEN_EIGENVALUES_COMMON_H -#define EIGEN_EIGENVALUES_COMMON_H +#ifndef EIGEN_SPLINES_MODULE_H +#define EIGEN_SPLINES_MODULE_H +namespace Eigen +{ +/** \ingroup Unsupported_modules + * \defgroup Splines_Module Spline and spline fitting module + * + * This module provides a simple multi-dimensional spline class while + * offering most basic functionality to fit a spline to point sets. + * + * \code + * #include + * \endcode + */ +} +#include "src/Splines/SplineFwd.h" +#include "src/Splines/Spline.h" +#include "src/Splines/SplineFitting.h" -#endif // EIGEN_EIGENVALUES_COMMON_H - +#endif // EIGEN_SPLINES_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/SuperLUSupport b/gtsam/3rdparty/Eigen/unsupported/Eigen/SuperLUSupport deleted file mode 100644 index 89cb649b2..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/SuperLUSupport +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef EIGEN_SUPERLUSUPPORT_MODULE_H -#define EIGEN_SUPERLUSUPPORT_MODULE_H - -#include "SparseExtra" - -#include "../../Eigen/src/Core/util/DisableStupidWarnings.h" - -typedef int int_t; -#include -#include -#include - -namespace Eigen { struct SluMatrix; } - -namespace Eigen { - -/** \ingroup Unsupported_modules - * \defgroup SuperLUSupport_Module Super LU support - * - * - * - * \code - * #include - * \endcode - */ - -struct SuperLU {}; - -#include "src/SparseExtra/SuperLUSupport.h" - -} // namespace Eigen - -#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_SUPERLUSUPPORT_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/UmfPackSupport b/gtsam/3rdparty/Eigen/unsupported/Eigen/UmfPackSupport deleted file mode 100644 index c8b1e7c1f..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/UmfPackSupport +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef EIGEN_UMFPACKSUPPORT_MODULE_H -#define EIGEN_UMFPACKSUPPORT_MODULE_H - -#include "SparseExtra" - -#include "../../Eigen/src/Core/util/DisableStupidWarnings.h" - -extern "C" { -#include -} - -namespace Eigen { - -/** \ingroup Unsupported_modules - * \defgroup UmfPackSupport_Module UmfPack support module - * - * - * - * - * \code - * #include - * \endcode - */ - -struct UmfPack {}; - -#include "src/SparseExtra/UmfPackSupport.h" - -} // namespace Eigen - -#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_UMFPACKSUPPORT_MODULE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h index 4fe168a88..e5442a5ef 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h @@ -40,7 +40,7 @@ public: template AutoDiffJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {} template - AutoDiffJacobian(const T0& a0, const T1& a1, const T1& a2) : Functor(a0, a1, a2) {} + AutoDiffJacobian(const T0& a0, const T1& a1, const T2& a2) : Functor(a0, a1, a2) {} enum { InputsAtCompileTime = Functor::InputsAtCompileTime, diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h index 7517035d9..70d3222f5 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h @@ -101,7 +101,7 @@ class AutoDiffScalar /** Conversion from a scalar constant to an active scalar. * The derivatives are set to zero. */ - explicit AutoDiffScalar(const Real& value) + /*explicit*/ AutoDiffScalar(const Real& value) : m_value(value) { if(m_derivatives.size()>0) @@ -151,6 +151,27 @@ class AutoDiffScalar inline const DerType& derivatives() const { return m_derivatives; } inline DerType& derivatives() { return m_derivatives; } + inline bool operator< (const Scalar& other) const { return m_value < other; } + inline bool operator<=(const Scalar& other) const { return m_value <= other; } + inline bool operator> (const Scalar& other) const { return m_value > other; } + inline bool operator>=(const Scalar& other) const { return m_value >= other; } + inline bool operator==(const Scalar& other) const { return m_value == other; } + inline bool operator!=(const Scalar& other) const { return m_value != other; } + + friend inline bool operator< (const Scalar& a, const AutoDiffScalar& b) { return a < b.value(); } + friend inline bool operator<=(const Scalar& a, const AutoDiffScalar& b) { return a <= b.value(); } + friend inline bool operator> (const Scalar& a, const AutoDiffScalar& b) { return a > b.value(); } + friend inline bool operator>=(const Scalar& a, const AutoDiffScalar& b) { return a >= b.value(); } + friend inline bool operator==(const Scalar& a, const AutoDiffScalar& b) { return a == b.value(); } + friend inline bool operator!=(const Scalar& a, const AutoDiffScalar& b) { return a != b.value(); } + + template inline bool operator< (const AutoDiffScalar& b) const { return m_value < b.value(); } + template inline bool operator<=(const AutoDiffScalar& b) const { return m_value <= b.value(); } + template inline bool operator> (const AutoDiffScalar& b) const { return m_value > b.value(); } + template inline bool operator>=(const AutoDiffScalar& b) const { return m_value >= b.value(); } + template inline bool operator==(const AutoDiffScalar& b) const { return m_value == b.value(); } + template inline bool operator!=(const AutoDiffScalar& b) const { return m_value != b.value(); } + inline const AutoDiffScalar operator+(const Scalar& other) const { return AutoDiffScalar(m_value + other, m_derivatives); @@ -195,6 +216,24 @@ class AutoDiffScalar return *this; } + inline const AutoDiffScalar operator-(const Scalar& b) const + { + return AutoDiffScalar(m_value - b, m_derivatives); + } + + friend inline const AutoDiffScalar, const DerType> > + operator-(const Scalar& a, const AutoDiffScalar& b) + { + return AutoDiffScalar, const DerType> > + (a - b.value(), -b.derivatives()); + } + + inline AutoDiffScalar& operator-=(const Scalar& other) + { + value() -= other; + return *this; + } + template inline const AutoDiffScalar, const DerType,const typename internal::remove_all::type> > operator-(const AutoDiffScalar& other) const @@ -213,7 +252,6 @@ class AutoDiffScalar return *this; } - template inline const AutoDiffScalar, const DerType> > operator-() const { @@ -267,7 +305,7 @@ class AutoDiffScalar { return AutoDiffScalar, const DerType> >( other / a.value(), - a.derivatives() * (-Scalar(1)/other)); + a.derivatives() * (Scalar(-other) / (a.value()*a.value()))); } // inline const AutoDiffScalar, DerType>::Type > @@ -330,6 +368,19 @@ class AutoDiffScalar return *this; } + inline AutoDiffScalar& operator/=(const Scalar& other) + { + *this = *this / other; + return *this; + } + + template + inline AutoDiffScalar& operator/=(const AutoDiffScalar& other) + { + *this = *this / other; + return *this; + } + protected: Scalar m_value; DerType m_derivatives; @@ -463,16 +514,14 @@ template ReturnType; }; -template -struct scalar_product_traits,T> +template +struct scalar_product_traits,typename DerType::Scalar> { typedef AutoDiffScalar ReturnType; }; } // end namespace internal -} // end namespace Eigen - #define EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(FUNC,CODE) \ template \ inline const Eigen::AutoDiffScalar::type>::Scalar>, const typename Eigen::internal::remove_all::type> > \ @@ -483,87 +532,109 @@ struct scalar_product_traits,T> CODE; \ } -namespace std -{ - EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs, - return ReturnType(std::abs(x.value()), x.derivatives() * (sign(x.value())));) - - EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sqrt, - Scalar sqrtx = std::sqrt(x.value()); - return ReturnType(sqrtx,x.derivatives() * (Scalar(0.5) / sqrtx));) - - EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cos, - return ReturnType(std::cos(x.value()), x.derivatives() * (-std::sin(x.value())));) - - EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sin, - return ReturnType(std::sin(x.value()),x.derivatives() * std::cos(x.value()));) - - EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(exp, - Scalar expx = std::exp(x.value()); - return ReturnType(expx,x.derivatives() * expx);) - - EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(log, - return ReturnType(std::log(x.value()),x.derivatives() * (Scalar(1)/x.value()));) - - template - inline const Eigen::AutoDiffScalar::Scalar>, const DerType> > - pow(const Eigen::AutoDiffScalar& x, typename Eigen::internal::traits::Scalar y) - { - using namespace Eigen; - typedef typename Eigen::internal::traits::Scalar Scalar; - return AutoDiffScalar, const DerType> >( - std::pow(x.value(),y), - x.derivatives() * (y * std::pow(x.value(),y-1))); - } - -} - -namespace Eigen { - -namespace internal { - template inline const AutoDiffScalar& conj(const AutoDiffScalar& x) { return x; } template inline const AutoDiffScalar& real(const AutoDiffScalar& x) { return x; } template inline typename DerType::Scalar imag(const AutoDiffScalar&) { return 0.; } +template +inline AutoDiffScalar (min)(const AutoDiffScalar& x, const T& y) { return (x <= y ? x : y); } +template +inline AutoDiffScalar (max)(const AutoDiffScalar& x, const T& y) { return (x >= y ? x : y); } +template +inline AutoDiffScalar (min)(const T& x, const AutoDiffScalar& y) { return (x < y ? x : y); } +template +inline AutoDiffScalar (max)(const T& x, const AutoDiffScalar& y) { return (x > y ? x : y); } +#define sign(x) x >= 0 ? 1 : -1 // required for abs function below + EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs, + using std::abs; return ReturnType(abs(x.value()), x.derivatives() * (sign(x.value())));) EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs2, + using internal::abs2; return ReturnType(abs2(x.value()), x.derivatives() * (Scalar(2)*x.value()));) EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sqrt, + using std::sqrt; Scalar sqrtx = sqrt(x.value()); return ReturnType(sqrtx,x.derivatives() * (Scalar(0.5) / sqrtx));) EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cos, + using std::cos; + using std::sin; return ReturnType(cos(x.value()), x.derivatives() * (-sin(x.value())));) EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sin, + using std::sin; + using std::cos; return ReturnType(sin(x.value()),x.derivatives() * cos(x.value()));) EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(exp, + using std::exp; Scalar expx = exp(x.value()); return ReturnType(expx,x.derivatives() * expx);) EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(log, + using std::log; return ReturnType(log(x.value()),x.derivatives() * (Scalar(1)/x.value()));) template -inline const AutoDiffScalar::Scalar>, DerType> > -pow(const AutoDiffScalar& x, typename traits::Scalar y) -{ return std::pow(x,y);} +inline const Eigen::AutoDiffScalar::Scalar>, const DerType> > +pow(const Eigen::AutoDiffScalar& x, typename Eigen::internal::traits::Scalar y) +{ + using namespace Eigen; + typedef typename Eigen::internal::traits::Scalar Scalar; + return AutoDiffScalar, const DerType> >( + std::pow(x.value(),y), + x.derivatives() * (y * std::pow(x.value(),y-1))); +} -} // end namespace internal + +template +inline const AutoDiffScalar::Scalar,Dynamic,1> > +atan2(const AutoDiffScalar& a, const AutoDiffScalar& b) +{ + using std::atan2; + using std::max; + typedef typename internal::traits::Scalar Scalar; + typedef AutoDiffScalar > PlainADS; + PlainADS ret; + ret.value() = atan2(a.value(), b.value()); + + Scalar tmp2 = a.value() * a.value(); + Scalar tmp3 = b.value() * b.value(); + Scalar tmp4 = tmp3/(tmp2+tmp3); + + if (tmp4!=0) + ret.derivatives() = (a.derivatives() * b.value() - a.value() * b.derivatives()) * (tmp2+tmp3); + + return ret; +} + +EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(tan, + using std::tan; + using std::cos; + return ReturnType(tan(x.value()),x.derivatives() * (Scalar(1)/internal::abs2(cos(x.value()))));) + +EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(asin, + using std::sqrt; + using std::asin; + return ReturnType(asin(x.value()),x.derivatives() * (Scalar(1)/sqrt(1-internal::abs2(x.value()))));) + +EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(acos, + using std::sqrt; + using std::acos; + return ReturnType(acos(x.value()),x.derivatives() * (Scalar(-1)/sqrt(1-internal::abs2(x.value()))));) #undef EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY template struct NumTraits > : NumTraits< typename NumTraits::Real > { + typedef AutoDiffScalar::Real,DerType::RowsAtCompileTime,DerType::ColsAtCompileTime> > Real; typedef AutoDiffScalar NonInteger; typedef AutoDiffScalar& Nested; enum{ diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h index d65a97740..6cba656ff 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h @@ -25,6 +25,8 @@ #ifndef EIGEN_BVALGORITHMS_H #define EIGEN_BVALGORITHMS_H +namespace Eigen { + namespace internal { #ifndef EIGEN_PARSED_BY_DOXYGEN @@ -301,4 +303,6 @@ typename Minimizer::Scalar BVMinimize(const BVH1 &tree1, const BVH2 &tree2, Mini return minimum; } +} // end namespace Eigen + #endif // EIGEN_BVALGORITHMS_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/KdBVH.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/KdBVH.h index 028b4811e..13a154d5c 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/KdBVH.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/KdBVH.h @@ -25,6 +25,8 @@ #ifndef KDBVH_H_INCLUDED #define KDBVH_H_INCLUDED +namespace Eigen { + namespace internal { //internal pair class for the BVH--used instead of std::pair because of alignment @@ -69,7 +71,7 @@ struct get_boxes_helper { * * \param _Scalar The underlying scalar type of the bounding boxes * \param _Dim The dimension of the space in which the hierarchy lives - * \param _Object The object type that lives in the hierarchy. It must have value semantics. Either internal::bounding_box(_Object) must + * \param _Object The object type that lives in the hierarchy. It must have value semantics. Either bounding_box(_Object) must * be defined and return an AlignedBox<_Scalar, _Dim> or bounding boxes must be provided to the tree initializer. * * This class provides a simple (as opposed to optimized) implementation of a bounding volume hierarchy analogous to a Kd-tree. @@ -92,14 +94,14 @@ public: KdBVH() {} - /** Given an iterator range over \a Object references, constructs the BVH. Requires that internal::bounding_box(Object) return a Volume. */ + /** Given an iterator range over \a Object references, constructs the BVH. Requires that bounding_box(Object) return a Volume. */ template KdBVH(Iter begin, Iter end) { init(begin, end, 0, 0); } //int is recognized by init as not being an iterator type /** Given an iterator range over \a Object references and an iterator range over their bounding boxes, constructs the BVH */ template KdBVH(OIter begin, OIter end, BIter boxBegin, BIter boxEnd) { init(begin, end, boxBegin, boxEnd); } /** Given an iterator range over \a Object references, constructs the BVH, overwriting whatever is in there currently. - * Requires that internal::bounding_box(Object) return a Volume. */ + * Requires that bounding_box(Object) return a Volume. */ template void init(Iter begin, Iter end) { init(begin, end, 0, 0); } /** Given an iterator range over \a Object references and an iterator range over their bounding boxes, @@ -230,4 +232,6 @@ private: ObjectList objects; }; +} // end namespace Eigen + #endif //KDBVH_H_INCLUDED diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/CMakeLists.txt b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/CMakeLists.txt index cd442cefa..f3180b52b 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/CMakeLists.txt @@ -9,3 +9,5 @@ ADD_SUBDIRECTORY(NumericalDiff) ADD_SUBDIRECTORY(Polynomials) ADD_SUBDIRECTORY(Skyline) ADD_SUBDIRECTORY(SparseExtra) +ADD_SUBDIRECTORY(KroneckerProduct) +ADD_SUBDIRECTORY(Splines) diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_fftw_impl.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_fftw_impl.h index a06f6739e..5c36db70c 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_fftw_impl.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_fftw_impl.h @@ -22,6 +22,8 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see . +namespace Eigen { + namespace internal { // FFTW uses non-const arguments @@ -269,4 +271,6 @@ namespace internal { } // end namespace internal +} // end namespace Eigen + /* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_kissfft_impl.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_kissfft_impl.h index 04b98b083..c3cbb7f01 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_kissfft_impl.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_kissfft_impl.h @@ -22,6 +22,8 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see . +namespace Eigen { + namespace internal { // This FFT implementation was derived from kissfft http:sourceforge.net/projects/kissfft @@ -426,5 +428,6 @@ struct kissfft_impl } // end namespace internal -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ +} // end namespace Eigen +/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h index 4d8e183ee..f8a550553 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h @@ -50,6 +50,8 @@ #include +namespace Eigen { + namespace internal { /** \ingroup IterativeSolvers_Module @@ -195,4 +197,6 @@ void constrained_cg(const TMatrix& A, const CMatrix& C, VectorX& x, } // end namespace internal +} // end namespace Eigen + #endif // EIGEN_CONSTRAINEDCG_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/GMRES.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/GMRES.h new file mode 100644 index 000000000..e100617d1 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/GMRES.h @@ -0,0 +1,394 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// Copyright (C) 2012 Kolja Brix +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_GMRES_H +#define EIGEN_GMRES_H + +namespace Eigen { + +namespace internal { + +/** + * Generalized Minimal Residual Algorithm based on the + * Arnoldi algorithm implemented with Householder reflections. + * + * Parameters: + * \param mat matrix of linear system of equations + * \param Rhs right hand side vector of linear system of equations + * \param x on input: initial guess, on output: solution + * \param precond preconditioner used + * \param iters on input: maximum number of iterations to perform + * on output: number of iterations performed + * \param restart number of iterations for a restart + * \param tol_error on input: residual tolerance + * on output: residuum achieved + * + * \sa IterativeMethods::bicgstab() + * + * + * For references, please see: + * + * Saad, Y. and Schultz, M. H. + * GMRES: A Generalized Minimal Residual Algorithm for Solving Nonsymmetric Linear Systems. + * SIAM J.Sci.Stat.Comp. 7, 1986, pp. 856 - 869. + * + * Saad, Y. + * Iterative Methods for Sparse Linear Systems. + * Society for Industrial and Applied Mathematics, Philadelphia, 2003. + * + * Walker, H. F. + * Implementations of the GMRES method. + * Comput.Phys.Comm. 53, 1989, pp. 311 - 320. + * + * Walker, H. F. + * Implementation of the GMRES Method using Householder Transformations. + * SIAM J.Sci.Stat.Comp. 9, 1988, pp. 152 - 163. + * + */ +template +bool gmres(const MatrixType & mat, const Rhs & rhs, Dest & x, const Preconditioner & precond, + int &iters, const int &restart, typename Dest::RealScalar & tol_error) { + + using std::sqrt; + using std::abs; + + typedef typename Dest::RealScalar RealScalar; + typedef typename Dest::Scalar Scalar; + typedef Matrix < RealScalar, Dynamic, 1 > RealVectorType; + typedef Matrix < Scalar, Dynamic, 1 > VectorType; + typedef Matrix < Scalar, Dynamic, Dynamic > FMatrixType; + + RealScalar tol = tol_error; + const int maxIters = iters; + iters = 0; + + const int m = mat.rows(); + + VectorType p0 = rhs - mat*x; + VectorType r0 = precond.solve(p0); +// RealScalar r0_sqnorm = r0.squaredNorm(); + + VectorType w = VectorType::Zero(restart + 1); + + FMatrixType H = FMatrixType::Zero(m, restart + 1); + VectorType tau = VectorType::Zero(restart + 1); + std::vector < JacobiRotation < Scalar > > G(restart); + + // generate first Householder vector + VectorType e; + RealScalar beta; + r0.makeHouseholder(e, tau.coeffRef(0), beta); + w(0)=(Scalar) beta; + H.bottomLeftCorner(m - 1, 1) = e; + + for (int k = 1; k <= restart; ++k) { + + ++iters; + + VectorType v = VectorType::Unit(m, k - 1), workspace(m); + + // apply Householder reflections H_{1} ... H_{k-1} to v + for (int i = k - 1; i >= 0; --i) { + v.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data()); + } + + // apply matrix M to v: v = mat * v; + VectorType t=mat*v; + v=precond.solve(t); + + // apply Householder reflections H_{k-1} ... H_{1} to v + for (int i = 0; i < k; ++i) { + v.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data()); + } + + if (v.tail(m - k).norm() != 0.0) { + + if (k <= restart) { + + // generate new Householder vector + VectorType e(m - k - 1); + RealScalar beta; + v.tail(m - k).makeHouseholder(e, tau.coeffRef(k), beta); + H.col(k).tail(m - k - 1) = e; + + // apply Householder reflection H_{k} to v + v.tail(m - k).applyHouseholderOnTheLeft(H.col(k).tail(m - k - 1), tau.coeffRef(k), workspace.data()); + + } + } + + if (k > 1) { + for (int i = 0; i < k - 1; ++i) { + // apply old Givens rotations to v + v.applyOnTheLeft(i, i + 1, G[i].adjoint()); + } + } + + if (k ().solveInPlace(y); + + // use Horner-like scheme to calculate solution vector + VectorType x_new = y(k - 1) * VectorType::Unit(m, k - 1); + + // apply Householder reflection H_{k} to x_new + x_new.tail(m - k + 1).applyHouseholderOnTheLeft(H.col(k - 1).tail(m - k), tau.coeffRef(k - 1), workspace.data()); + + for (int i = k - 2; i >= 0; --i) { + x_new += y(i) * VectorType::Unit(m, i); + // apply Householder reflection H_{i} to x_new + x_new.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data()); + } + + x += x_new; + + if (stop) { + return true; + } else { + k=0; + + // reset data for a restart r0 = rhs - mat * x; + VectorType p0=mat*x; + VectorType p1=precond.solve(p0); + r0 = rhs - p1; +// r0_sqnorm = r0.squaredNorm(); + w = VectorType::Zero(restart + 1); + H = FMatrixType::Zero(m, restart + 1); + tau = VectorType::Zero(restart + 1); + + // generate first Householder vector + RealScalar beta; + r0.makeHouseholder(e, tau.coeffRef(0), beta); + w(0)=(Scalar) beta; + H.bottomLeftCorner(m - 1, 1) = e; + + } + + } + + + + } + + return false; + +} + +} + +template< typename _MatrixType, + typename _Preconditioner = DiagonalPreconditioner > +class GMRES; + +namespace internal { + +template< typename _MatrixType, typename _Preconditioner> +struct traits > +{ + typedef _MatrixType MatrixType; + typedef _Preconditioner Preconditioner; +}; + +} + +/** \ingroup IterativeLinearSolvers_Module + * \brief A GMRES solver for sparse square problems + * + * This class allows to solve for A.x = b sparse linear problems using a generalized minimal + * residual method. The vectors x and b can be either dense or sparse. + * + * \tparam _MatrixType the type of the sparse matrix A, can be a dense or a sparse matrix. + * \tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner + * + * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations() + * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations + * and NumTraits::epsilon() for the tolerance. + * + * This class can be used as the direct solver classes. Here is a typical usage example: + * \code + * int n = 10000; + * VectorXd x(n), b(n); + * SparseMatrix A(n,n); + * // fill A and b + * GMRES > solver(A); + * x = solver.solve(b); + * std::cout << "#iterations: " << solver.iterations() << std::endl; + * std::cout << "estimated error: " << solver.error() << std::endl; + * // update b, and solve again + * x = solver.solve(b); + * \endcode + * + * By default the iterations start with x=0 as an initial guess of the solution. + * One can control the start using the solveWithGuess() method. Here is a step by + * step execution example starting with a random guess and printing the evolution + * of the estimated error: + * * \code + * x = VectorXd::Random(n); + * solver.setMaxIterations(1); + * int i = 0; + * do { + * x = solver.solveWithGuess(b,x); + * std::cout << i << " : " << solver.error() << std::endl; + * ++i; + * } while (solver.info()!=Success && i<100); + * \endcode + * Note that such a step by step excution is slightly slower. + * + * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner + */ +template< typename _MatrixType, typename _Preconditioner> +class GMRES : public IterativeSolverBase > +{ + typedef IterativeSolverBase Base; + using Base::mp_matrix; + using Base::m_error; + using Base::m_iterations; + using Base::m_info; + using Base::m_isInitialized; + +private: + int m_restart; + +public: + typedef _MatrixType MatrixType; + typedef typename MatrixType::Scalar Scalar; + typedef typename MatrixType::Index Index; + typedef typename MatrixType::RealScalar RealScalar; + typedef _Preconditioner Preconditioner; + +public: + + /** Default constructor. */ + GMRES() : Base(), m_restart(30) {} + + /** Initialize the solver with matrix \a A for further \c Ax=b solving. + * + * This constructor is a shortcut for the default constructor followed + * by a call to compute(). + * + * \warning this class stores a reference to the matrix A as well as some + * precomputed values that depend on it. Therefore, if \a A is changed + * this class becomes invalid. Call compute() to update it with the new + * matrix A, or modify a copy of A. + */ + GMRES(const MatrixType& A) : Base(A), m_restart(30) {} + + ~GMRES() {} + + /** Get the number of iterations after that a restart is performed. + */ + int get_restart() { return m_restart; } + + /** Set the number of iterations after that a restart is performed. + * \param restart number of iterations for a restarti, default is 30. + */ + void set_restart(const int restart) { m_restart=restart; } + + /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A + * \a x0 as an initial solution. + * + * \sa compute() + */ + template + inline const internal::solve_retval_with_guess + solveWithGuess(const MatrixBase& b, const Guess& x0) const + { + eigen_assert(m_isInitialized && "GMRES is not initialized."); + eigen_assert(Base::rows()==b.rows() + && "GMRES::solve(): invalid number of rows of the right hand side matrix b"); + return internal::solve_retval_with_guess + (*this, b.derived(), x0); + } + + /** \internal */ + template + void _solveWithGuess(const Rhs& b, Dest& x) const + { + bool failed = false; + for(int j=0; j + void _solve(const Rhs& b, Dest& x) const + { + x.setZero(); + _solveWithGuess(b,x); + } + +protected: + +}; + + +namespace internal { + + template +struct solve_retval, Rhs> + : solve_retval_base, Rhs> +{ + typedef GMRES<_MatrixType, _Preconditioner> Dec; + EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs) + + template void evalTo(Dest& dst) const + { + dec()._solve(rhs(),dst); + } +}; + +} // end namespace internal + +} // end namespace Eigen + +#endif // EIGEN_GMRES_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h new file mode 100644 index 000000000..e02f1f0c8 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h @@ -0,0 +1,128 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_INCOMPLETE_LU_H +#define EIGEN_INCOMPLETE_LU_H + +namespace Eigen { + +template +class IncompleteLU +{ + typedef _Scalar Scalar; + typedef Matrix Vector; + typedef typename Vector::Index Index; + typedef SparseMatrix FactorType; + + public: + typedef Matrix MatrixType; + + IncompleteLU() : m_isInitialized(false) {} + + template + IncompleteLU(const MatrixType& mat) : m_isInitialized(false) + { + compute(mat); + } + + Index rows() const { return m_lu.rows(); } + Index cols() const { return m_lu.cols(); } + + template + IncompleteLU& compute(const MatrixType& mat) + { + m_lu = mat; + int size = mat.cols(); + Vector diag(size); + for(int i=0; i + void _solve(const Rhs& b, Dest& x) const + { + x = m_lu.template triangularView().solve(b); + x = m_lu.template triangularView().solve(x); + } + + template inline const internal::solve_retval + solve(const MatrixBase& b) const + { + eigen_assert(m_isInitialized && "IncompleteLU is not initialized."); + eigen_assert(cols()==b.rows() + && "IncompleteLU::solve(): invalid number of rows of the right hand side matrix b"); + return internal::solve_retval(*this, b.derived()); + } + + protected: + FactorType m_lu; + bool m_isInitialized; +}; + +namespace internal { + +template +struct solve_retval, Rhs> + : solve_retval_base, Rhs> +{ + typedef IncompleteLU<_MatrixType> Dec; + EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs) + + template void evalTo(Dest& dst) const + { + dec()._solve(rhs(),dst); + } +}; + +} // end namespace internal + +} // end namespace Eigen + +#endif // EIGEN_INCOMPLETE_LU_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IterationController.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IterationController.h index a65793cd5..dfb97e239 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IterationController.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IterationController.h @@ -75,6 +75,8 @@ #ifndef EIGEN_ITERATION_CONTROLLER_H #define EIGEN_ITERATION_CONTROLLER_H +namespace Eigen { + /** \ingroup IterativeSolvers_Module * \class IterationController * @@ -163,4 +165,6 @@ class IterationController }; +} // end namespace Eigen + #endif // EIGEN_ITERATION_CONTROLLER_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/Scaling.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/Scaling.h new file mode 100644 index 000000000..4aad69d0e --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/Scaling.h @@ -0,0 +1,200 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2012 Desire NUENTSA WAKAM . + +#ifndef EIGEN_SCALING_H +#define EIGEN_SCALING_H +/** + * \ingroup IterativeSolvers_Module + * \brief iterative scaling algorithm to equilibrate rows and column norms in matrices + * + * This class can be used as a preprocessing tool to accelerate the convergence of iterative methods + * + * This feature is useful to limit the pivoting amount during LU/ILU factorization + * The scaling strategy as presented here preserves the symmetry of the problem + * NOTE It is assumed that the matrix does not have empty row or column, + * + * Example with key steps + * \code + * VectorXd x(n), b(n); + * SparseMatrix A; + * // fill A and b; + * Scaling > scal; + * // Compute the left and right scaling vectors. The matrix is equilibrated at output + * scal.computeRef(A); + * // Scale the right hand side + * b = scal.LeftScaling().cwiseProduct(b); + * // Now, solve the equilibrated linear system with any available solver + * + * // Scale back the computed solution + * x = scal.RightScaling().cwiseProduct(x); + * \endcode + * + * \tparam _MatrixType the type of the matrix. It should be a real square sparsematrix + * + * References : D. Ruiz and B. Ucar, A Symmetry Preserving Algorithm for Matrix Scaling, INRIA Research report RR-7552 + * + * \sa \ref IncompleteLUT + */ +using std::abs; +using namespace Eigen; +template +class Scaling +{ + public: + typedef _MatrixType MatrixType; + typedef typename MatrixType::Scalar Scalar; + typedef typename MatrixType::Index Index; + + public: + Scaling() { init(); } + + Scaling(const MatrixType& matrix) + { + init(); + compute(matrix); + } + + ~Scaling() { } + + /** + * Compute the left and right diagonal matrices to scale the input matrix @p mat + * + * FIXME This algorithm will be modified such that the diagonal elements are permuted on the diagonal. + * + * \sa LeftScaling() RightScaling() + */ + void compute (const MatrixType& mat) + { + int m = mat.rows(); + int n = mat.cols(); + assert((m>0 && m == n) && "Please give a non - empty matrix"); + m_left.resize(m); + m_right.resize(n); + m_left.setOnes(); + m_right.setOnes(); + m_matrix = mat; + VectorXd Dr, Dc, DrRes, DcRes; // Temporary Left and right scaling vectors + Dr.resize(m); Dc.resize(n); + DrRes.resize(m); DcRes.resize(n); + double EpsRow = 1.0, EpsCol = 1.0; + int its = 0; + do + { // Iterate until the infinite norm of each row and column is approximately 1 + // Get the maximum value in each row and column + Dr.setZero(); Dc.setZero(); + for (int k=0; km_tol || EpsCol > m_tol) && (its < m_maxits) ); + m_isInitialized = true; + } + /** Compute the left and right vectors to scale the vectors + * the input matrix is scaled with the computed vectors at output + * + * \sa compute() + */ + void computeRef (MatrixType& mat) + { + compute (mat); + mat = m_matrix; + } + /** Get the vector to scale the rows of the matrix + */ + VectorXd& LeftScaling() + { + return m_left; + } + + /** Get the vector to scale the columns of the matrix + */ + VectorXd& RightScaling() + { + return m_right; + } + + /** Set the tolerance for the convergence of the iterative scaling algorithm + */ + void setTolerance(double tol) + { + m_tol = tol; + } + + protected: + + void init() + { + m_tol = 1e-10; + m_maxits = 5; + m_isInitialized = false; + } + + MatrixType m_matrix; + mutable ComputationInfo m_info; + bool m_isInitialized; + VectorXd m_left; // Left scaling vector + VectorXd m_right; // m_right scaling vector + double m_tol; + int m_maxits; // Maximum number of iterations allowed +}; + +#endif \ No newline at end of file diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/CMakeLists.txt b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/CMakeLists.txt new file mode 100644 index 000000000..4daefebee --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB Eigen_KroneckerProduct_SRCS "*.h") + +INSTALL(FILES + ${Eigen_KroneckerProduct_SRCS} + DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/KroneckerProduct COMPONENT Devel + ) diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h new file mode 100644 index 000000000..4627705ce --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h @@ -0,0 +1,172 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Kolja Brix +// Copyright (C) 2011 Andreas Platen +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + + +#ifndef KRONECKER_TENSOR_PRODUCT_H +#define KRONECKER_TENSOR_PRODUCT_H + + +namespace Eigen { + +namespace internal { + +/*! + * Kronecker tensor product helper function for dense matrices + * + * \param A Dense matrix A + * \param B Dense matrix B + * \param AB_ Kronecker tensor product of A and B + */ +template +void kroneckerProduct_full(const Derived_A& A, const Derived_B& B, Derived_AB & AB) +{ + const unsigned int Ar = A.rows(), + Ac = A.cols(), + Br = B.rows(), + Bc = B.cols(); + for (unsigned int i=0; i +void kroneckerProduct_sparse(const Derived_A &A, const Derived_B &B, Derived_AB &AB) +{ + const unsigned int Ar = A.rows(), + Ac = A.cols(), + Br = B.rows(), + Bc = B.cols(); + AB.resize(Ar*Br,Ac*Bc); + AB.resizeNonZeros(0); + AB.reserve(A.nonZeros()*B.nonZeros()); + + for (int kA=0; kA +void kroneckerProduct(const MatrixBase& a, const MatrixBase& b, Matrix& c) +{ + c.resize(a.rows()*b.rows(),a.cols()*b.cols()); + internal::kroneckerProduct_full(a.derived(), b.derived(), c); +} + +/*! + * Computes Kronecker tensor product of two dense matrices + * + * Remark: this function uses the const cast hack and has been + * implemented to make the function call possible, where the + * output matrix is a submatrix, e.g. + * kroneckerProduct(A,B,AB.block(2,5,6,6)); + * + * \param a Dense matrix a + * \param b Dense matrix b + * \param c Kronecker tensor product of a and b + */ +template +void kroneckerProduct(const MatrixBase& a, const MatrixBase& b, MatrixBase const & c_) +{ + MatrixBase& c = const_cast& >(c_); + internal::kroneckerProduct_full(a.derived(), b.derived(), c.derived()); +} + +/*! + * Computes Kronecker tensor product of a dense and a sparse matrix + * + * \param a Dense matrix a + * \param b Sparse matrix b + * \param c Kronecker tensor product of a and b + */ +template +void kroneckerProduct(const MatrixBase& a, const SparseMatrixBase& b, SparseMatrixBase& c) +{ + internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived()); +} + +/*! + * Computes Kronecker tensor product of a sparse and a dense matrix + * + * \param a Sparse matrix a + * \param b Dense matrix b + * \param c Kronecker tensor product of a and b + */ +template +void kroneckerProduct(const SparseMatrixBase& a, const MatrixBase& b, SparseMatrixBase& c) +{ + internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived()); +} + +/*! + * Computes Kronecker tensor product of two sparse matrices + * + * \param a Sparse matrix a + * \param b Sparse matrix b + * \param c Kronecker tensor product of a and b + */ +template +void kroneckerProduct(const SparseMatrixBase& a, const SparseMatrixBase& b, SparseMatrixBase& c) +{ + internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived()); +} + +} // end namespace Eigen + +#endif // KRONECKER_TENSOR_PRODUCT_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h index 50c0ca84e..6cdd65748 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h @@ -2,6 +2,7 @@ // for linear algebra. // // Copyright (C) 2009, 2010 Jitse Niesen +// Copyright (C) 2011 Chen-Pang He // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -25,7 +26,11 @@ #ifndef EIGEN_MATRIX_EXPONENTIAL #define EIGEN_MATRIX_EXPONENTIAL -#ifdef _MSC_VER +#include "StemFunction.h" + +namespace Eigen { + +#if defined(_MSC_VER) || defined(__FreeBSD__) template Scalar log2(Scalar v) { using std::log; return log(v)/log(Scalar(2)); } #endif @@ -107,6 +112,17 @@ class MatrixExponential { */ void pade13(const MatrixType &A); + /** \brief Compute the (17,17)-Padé approximant to the exponential. + * + * After exit, \f$ (V+U)(V-U)^{-1} \f$ is the Padé + * approximant of \f$ \exp(A) \f$ around \f$ A = 0 \f$. + * + * This function activates only if your long double is double-double or quadruple. + * + * \param[in] A Argument of matrix exponential + */ + void pade17(const MatrixType &A); + /** \brief Compute Padé approximant to the exponential. * * Computes \c m_U, \c m_V and \c m_squarings such that @@ -127,17 +143,24 @@ class MatrixExponential { * \sa computeUV(double); */ void computeUV(float); + + /** \brief Compute Padé approximant to the exponential. + * + * \sa computeUV(double); + */ + void computeUV(long double); typedef typename internal::traits::Scalar Scalar; typedef typename NumTraits::Real RealScalar; + typedef typename std::complex ComplexScalar; /** \brief Reference to matrix whose exponential is to be computed. */ typename internal::nested::type m_M; - /** \brief Even-degree terms in numerator of Padé approximant. */ + /** \brief Odd-degree terms in numerator of Padé approximant. */ MatrixType m_U; - /** \brief Odd-degree terms in numerator of Padé approximant. */ + /** \brief Even-degree terms in numerator of Padé approximant. */ MatrixType m_V; /** \brief Used for temporary storage. */ @@ -153,7 +176,7 @@ class MatrixExponential { int m_squarings; /** \brief L1 norm of m_M. */ - float m_l1norm; + RealScalar m_l1norm; }; template @@ -165,7 +188,7 @@ MatrixExponential::MatrixExponential(const MatrixType &M) : m_tmp2(M.rows(),M.cols()), m_Id(MatrixType::Identity(M.rows(), M.cols())), m_squarings(0), - m_l1norm(static_cast(M.cwiseAbs().colwise().sum().maxCoeff())) + m_l1norm(M.cwiseAbs().colwise().sum().maxCoeff()) { /* empty body */ } @@ -174,18 +197,24 @@ template template void MatrixExponential::compute(ResultType &result) { +#if LDBL_MANT_DIG > 112 // rarely happens + if(sizeof(RealScalar) > 14) { + result = m_M.matrixFunction(StdStemFunctions::exp); + return; + } +#endif computeUV(RealScalar()); - m_tmp1 = m_U + m_V; // numerator of Pade approximant - m_tmp2 = -m_U + m_V; // denominator of Pade approximant + m_tmp1 = m_U + m_V; // numerator of Pade approximant + m_tmp2 = -m_U + m_V; // denominator of Pade approximant result = m_tmp2.partialPivLu().solve(m_tmp1); for (int i=0; i EIGEN_STRONG_INLINE void MatrixExponential::pade3(const MatrixType &A) { - const Scalar b[] = {120., 60., 12., 1.}; + const RealScalar b[] = {120., 60., 12., 1.}; m_tmp1.noalias() = A * A; m_tmp2 = b[3]*m_tmp1 + b[1]*m_Id; m_U.noalias() = A * m_tmp2; @@ -195,7 +224,7 @@ EIGEN_STRONG_INLINE void MatrixExponential::pade3(const MatrixType & template EIGEN_STRONG_INLINE void MatrixExponential::pade5(const MatrixType &A) { - const Scalar b[] = {30240., 15120., 3360., 420., 30., 1.}; + const RealScalar b[] = {30240., 15120., 3360., 420., 30., 1.}; MatrixType A2 = A * A; m_tmp1.noalias() = A2 * A2; m_tmp2 = b[5]*m_tmp1 + b[3]*A2 + b[1]*m_Id; @@ -206,7 +235,7 @@ EIGEN_STRONG_INLINE void MatrixExponential::pade5(const MatrixType & template EIGEN_STRONG_INLINE void MatrixExponential::pade7(const MatrixType &A) { - const Scalar b[] = {17297280., 8648640., 1995840., 277200., 25200., 1512., 56., 1.}; + const RealScalar b[] = {17297280., 8648640., 1995840., 277200., 25200., 1512., 56., 1.}; MatrixType A2 = A * A; MatrixType A4 = A2 * A2; m_tmp1.noalias() = A4 * A2; @@ -218,7 +247,7 @@ EIGEN_STRONG_INLINE void MatrixExponential::pade7(const MatrixType & template EIGEN_STRONG_INLINE void MatrixExponential::pade9(const MatrixType &A) { - const Scalar b[] = {17643225600., 8821612800., 2075673600., 302702400., 30270240., + const RealScalar b[] = {17643225600., 8821612800., 2075673600., 302702400., 30270240., 2162160., 110880., 3960., 90., 1.}; MatrixType A2 = A * A; MatrixType A4 = A2 * A2; @@ -232,7 +261,7 @@ EIGEN_STRONG_INLINE void MatrixExponential::pade9(const MatrixType & template EIGEN_STRONG_INLINE void MatrixExponential::pade13(const MatrixType &A) { - const Scalar b[] = {64764752532480000., 32382376266240000., 7771770303897600., + const RealScalar b[] = {64764752532480000., 32382376266240000., 7771770303897600., 1187353796428800., 129060195264000., 10559470521600., 670442572800., 33522128640., 1323241920., 40840800., 960960., 16380., 182., 1.}; MatrixType A2 = A * A; @@ -247,6 +276,30 @@ EIGEN_STRONG_INLINE void MatrixExponential::pade13(const MatrixType m_V += b[6]*m_tmp1 + b[4]*A4 + b[2]*A2 + b[0]*m_Id; } +#if LDBL_MANT_DIG > 64 +template +EIGEN_STRONG_INLINE void MatrixExponential::pade17(const MatrixType &A) +{ + const RealScalar b[] = {830034394580628357120000.L, 415017197290314178560000.L, + 100610229646136770560000.L, 15720348382208870400000.L, + 1774878043152614400000.L, 153822763739893248000.L, 10608466464820224000.L, + 595373117923584000.L, 27563570274240000.L, 1060137318240000.L, + 33924394183680.L, 899510451840.L, 19554575040.L, 341863200.L, 4651200.L, + 46512.L, 306.L, 1.L}; + MatrixType A2 = A * A; + MatrixType A4 = A2 * A2; + MatrixType A6 = A4 * A2; + m_tmp1.noalias() = A4 * A4; + m_V = b[17]*m_tmp1 + b[15]*A6 + b[13]*A4 + b[11]*A2; // used for temporary storage + m_tmp2.noalias() = m_tmp1 * m_V; + m_tmp2 += b[9]*m_tmp1 + b[7]*A6 + b[5]*A4 + b[3]*A2 + b[1]*m_Id; + m_U.noalias() = A * m_tmp2; + m_tmp2 = b[16]*m_tmp1 + b[14]*A6 + b[12]*A4 + b[10]*A2; + m_V.noalias() = m_tmp1 * m_tmp2; + m_V += b[8]*m_tmp1 + b[6]*A6 + b[4]*A4 + b[2]*A2 + b[0]*m_Id; +} +#endif + template void MatrixExponential::computeUV(float) { @@ -260,7 +313,7 @@ void MatrixExponential::computeUV(float) } else { const float maxnorm = 3.925724783138660f; m_squarings = (max)(0, (int)ceil(log2(m_l1norm / maxnorm))); - MatrixType A = m_M / pow(Scalar(2), Scalar(static_cast(m_squarings))); + MatrixType A = m_M / pow(Scalar(2), m_squarings); pade7(A); } } @@ -282,11 +335,74 @@ void MatrixExponential::computeUV(double) } else { const double maxnorm = 5.371920351148152; m_squarings = (max)(0, (int)ceil(log2(m_l1norm / maxnorm))); - MatrixType A = m_M / pow(Scalar(2), Scalar(m_squarings)); + MatrixType A = m_M / pow(Scalar(2), m_squarings); pade13(A); } } +template +void MatrixExponential::computeUV(long double) +{ + using std::max; + using std::pow; + using std::ceil; +#if LDBL_MANT_DIG == 53 // double precision + computeUV(double()); +#elif LDBL_MANT_DIG <= 64 // extended precision + if (m_l1norm < 4.1968497232266989671e-003L) { + pade3(m_M); + } else if (m_l1norm < 1.1848116734693823091e-001L) { + pade5(m_M); + } else if (m_l1norm < 5.5170388480686700274e-001L) { + pade7(m_M); + } else if (m_l1norm < 1.3759868875587845383e+000L) { + pade9(m_M); + } else { + const long double maxnorm = 4.0246098906697353063L; + m_squarings = (max)(0, (int)ceil(log2(m_l1norm / maxnorm))); + MatrixType A = m_M / pow(Scalar(2), m_squarings); + pade13(A); + } +#elif LDBL_MANT_DIG <= 106 // double-double + if (m_l1norm < 3.2787892205607026992947488108213e-005L) { + pade3(m_M); + } else if (m_l1norm < 6.4467025060072760084130906076332e-003L) { + pade5(m_M); + } else if (m_l1norm < 6.8988028496595374751374122881143e-002L) { + pade7(m_M); + } else if (m_l1norm < 2.7339737518502231741495857201670e-001L) { + pade9(m_M); + } else if (m_l1norm < 1.3203382096514474905666448850278e+000L) { + pade13(m_M); + } else { + const long double maxnorm = 3.2579440895405400856599663723517L; + m_squarings = (max)(0, (int)ceil(log2(m_l1norm / maxnorm))); + MatrixType A = m_M / pow(Scalar(2), m_squarings); + pade17(A); + } +#elif LDBL_MANT_DIG <= 112 // quadruple precison + if (m_l1norm < 1.639394610288918690547467954466970e-005L) { + pade3(m_M); + } else if (m_l1norm < 4.253237712165275566025884344433009e-003L) { + pade5(m_M); + } else if (m_l1norm < 5.125804063165764409885122032933142e-002L) { + pade7(m_M); + } else if (m_l1norm < 2.170000765161155195453205651889853e-001L) { + pade9(m_M); + } else if (m_l1norm < 1.125358383453143065081397882891878e+000L) { + pade13(m_M); + } else { + const long double maxnorm = 2.884233277829519311757165057717815L; + m_squarings = (max)(0, (int)ceil(log2(m_l1norm / maxnorm))); + MatrixType A = m_M / pow(Scalar(2), m_squarings); + pade17(A); + } +#else + // this case should be handled in compute() + eigen_assert(false && "Bug in MatrixExponential"); +#endif // LDBL_MANT_DIG +} + /** \ingroup MatrixFunctions_Module * * \brief Proxy for the matrix exponential of some matrix (expression). @@ -348,4 +464,6 @@ const MatrixExponentialReturnValue MatrixBase::exp() const return MatrixExponentialReturnValue(derived()); } +} // end namespace Eigen + #endif // EIGEN_MATRIX_EXPONENTIAL diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h index 4b9d8a102..859de7288 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h @@ -1,7 +1,7 @@ // This file is part of Eigen, a lightweight C++ template library // for linear algebra. // -// Copyright (C) 2009, 2010 Jitse Niesen +// Copyright (C) 2009-2011 Jitse Niesen // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -29,31 +29,39 @@ #include "MatrixFunctionAtomic.h" +namespace Eigen { + /** \ingroup MatrixFunctions_Module - * \brief Class for computing matrix exponentials. - * \tparam MatrixType type of the argument of the matrix function, - * expected to be an instantiation of the Matrix class template. + * \brief Class for computing matrix functions. + * \tparam MatrixType type of the argument of the matrix function, + * expected to be an instantiation of the Matrix class template. + * \tparam AtomicType type for computing matrix function of atomic blocks. + * \tparam IsComplex used internally to select correct specialization. + * + * This class implements the Schur-Parlett algorithm for computing matrix functions. The spectrum of the + * matrix is divided in clustered of eigenvalues that lies close together. This class delegates the + * computation of the matrix function on every block corresponding to these clusters to an object of type + * \p AtomicType and uses these results to compute the matrix function of the whole matrix. The class + * \p AtomicType should have a \p compute() member function for computing the matrix function of a block. + * + * \sa class MatrixFunctionAtomic, class MatrixLogarithmAtomic */ -template ::Scalar>::IsComplex> +template ::Scalar>::IsComplex> class MatrixFunction { - private: - - typedef typename internal::traits::Index Index; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::stem_function::type StemFunction; - public: /** \brief Constructor. * - * \param[in] A argument of matrix function, should be a square matrix. - * \param[in] f an entire function; \c f(x,n) should compute the n-th derivative of f at x. + * \param[in] A argument of matrix function, should be a square matrix. + * \param[in] atomic class for computing matrix function of atomic blocks. * - * The class stores a reference to \p A, so it should not be + * The class stores references to \p A and \p atomic, so they should not be * changed (or destroyed) before compute() is called. */ - MatrixFunction(const MatrixType& A, StemFunction f); + MatrixFunction(const MatrixType& A, AtomicType& atomic); /** \brief Compute the matrix function. * @@ -68,11 +76,11 @@ class MatrixFunction }; -/** \ingroup MatrixFunctions_Module - * \brief Partial specialization of MatrixFunction for real matrices \internal +/** \internal \ingroup MatrixFunctions_Module + * \brief Partial specialization of MatrixFunction for real matrices */ -template -class MatrixFunction +template +class MatrixFunction { private: @@ -86,16 +94,15 @@ class MatrixFunction typedef std::complex ComplexScalar; typedef Matrix ComplexMatrix; - typedef typename internal::stem_function::type StemFunction; public: /** \brief Constructor. * - * \param[in] A argument of matrix function, should be a square matrix. - * \param[in] f an entire function; \c f(x,n) should compute the n-th derivative of f at x. + * \param[in] A argument of matrix function, should be a square matrix. + * \param[in] atomic class for computing matrix function of atomic blocks. */ - MatrixFunction(const MatrixType& A, StemFunction f) : m_A(A), m_f(f) { } + MatrixFunction(const MatrixType& A, AtomicType& atomic) : m_A(A), m_atomic(atomic) { } /** \brief Compute the matrix function. * @@ -111,24 +118,24 @@ class MatrixFunction { ComplexMatrix CA = m_A.template cast(); ComplexMatrix Cresult; - MatrixFunction mf(CA, m_f); + MatrixFunction mf(CA, m_atomic); mf.compute(Cresult); result = Cresult.real(); } private: typename internal::nested::type m_A; /**< \brief Reference to argument of matrix function. */ - StemFunction *m_f; /**< \brief Stem function for matrix function under consideration */ + AtomicType& m_atomic; /**< \brief Class for computing matrix function of atomic blocks. */ MatrixFunction& operator=(const MatrixFunction&); }; -/** \ingroup MatrixFunctions_Module - * \brief Partial specialization of MatrixFunction for complex matrices \internal +/** \internal \ingroup MatrixFunctions_Module + * \brief Partial specialization of MatrixFunction for complex matrices */ -template -class MatrixFunction +template +class MatrixFunction { private: @@ -139,7 +146,6 @@ class MatrixFunction static const int ColsAtCompileTime = Traits::ColsAtCompileTime; static const int Options = MatrixType::Options; typedef typename NumTraits::Real RealScalar; - typedef typename internal::stem_function::type StemFunction; typedef Matrix VectorType; typedef Matrix IntVectorType; typedef Matrix DynamicIntVectorType; @@ -149,7 +155,7 @@ class MatrixFunction public: - MatrixFunction(const MatrixType& A, StemFunction f); + MatrixFunction(const MatrixType& A, AtomicType& atomic); template void compute(ResultType& result); private: @@ -168,7 +174,7 @@ class MatrixFunction DynMatrixType solveTriangularSylvester(const DynMatrixType& A, const DynMatrixType& B, const DynMatrixType& C); typename internal::nested::type m_A; /**< \brief Reference to argument of matrix function. */ - StemFunction *m_f; /**< \brief Stem function for matrix function under consideration */ + AtomicType& m_atomic; /**< \brief Class for computing matrix function of atomic blocks. */ MatrixType m_T; /**< \brief Triangular part of Schur decomposition */ MatrixType m_U; /**< \brief Unitary part of Schur decomposition */ MatrixType m_fT; /**< \brief %Matrix function applied to #m_T */ @@ -191,12 +197,12 @@ class MatrixFunction /** \brief Constructor. * - * \param[in] A argument of matrix function, should be a square matrix. - * \param[in] f an entire function; \c f(x,n) should compute the n-th derivative of f at x. + * \param[in] A argument of matrix function, should be a square matrix. + * \param[in] atomic class for computing matrix function of atomic blocks. */ -template -MatrixFunction::MatrixFunction(const MatrixType& A, StemFunction f) : - m_A(A), m_f(f) +template +MatrixFunction::MatrixFunction(const MatrixType& A, AtomicType& atomic) + : m_A(A), m_atomic(atomic) { /* empty body */ } @@ -206,9 +212,9 @@ MatrixFunction::MatrixFunction(const MatrixType& A, StemFunction f * \param[out] result the function \p f applied to \p A, as * specified in the constructor. */ -template +template template -void MatrixFunction::compute(ResultType& result) +void MatrixFunction::compute(ResultType& result) { computeSchurDecomposition(); partitionEigenvalues(); @@ -222,8 +228,8 @@ void MatrixFunction::compute(ResultType& result) } /** \brief Store the Schur decomposition of #m_A in #m_T and #m_U */ -template -void MatrixFunction::computeSchurDecomposition() +template +void MatrixFunction::computeSchurDecomposition() { const ComplexSchur schurOfA(m_A); m_T = schurOfA.matrixT(); @@ -241,8 +247,8 @@ void MatrixFunction::computeSchurDecomposition() * The implementation follows Algorithm 4.1 in the paper of Davies * and Higham. */ -template -void MatrixFunction::partitionEigenvalues() +template +void MatrixFunction::partitionEigenvalues() { const Index rows = m_T.rows(); VectorType diag = m_T.diagonal(); // contains eigenvalues of A @@ -278,8 +284,8 @@ void MatrixFunction::partitionEigenvalues() * \returns Iterator to cluster containing \c key, or * \c m_clusters.end() if no cluster in m_clusters contains \c key. */ -template -typename MatrixFunction::ListOfClusters::iterator MatrixFunction::findCluster(Scalar key) +template +typename MatrixFunction::ListOfClusters::iterator MatrixFunction::findCluster(Scalar key) { typename Cluster::iterator j; for (typename ListOfClusters::iterator i = m_clusters.begin(); i != m_clusters.end(); ++i) { @@ -291,8 +297,8 @@ typename MatrixFunction::ListOfClusters::iterator MatrixFunction -void MatrixFunction::computeClusterSize() +template +void MatrixFunction::computeClusterSize() { const Index rows = m_T.rows(); VectorType diag = m_T.diagonal(); @@ -313,8 +319,8 @@ void MatrixFunction::computeClusterSize() } /** \brief Compute #m_blockStart using #m_clusterSize */ -template -void MatrixFunction::computeBlockStart() +template +void MatrixFunction::computeBlockStart() { m_blockStart.resize(m_clusterSize.rows()); m_blockStart(0) = 0; @@ -324,8 +330,8 @@ void MatrixFunction::computeBlockStart() } /** \brief Compute #m_permutation using #m_eivalToCluster and #m_blockStart */ -template -void MatrixFunction::constructPermutation() +template +void MatrixFunction::constructPermutation() { DynamicIntVectorType indexNextEntry = m_blockStart; m_permutation.resize(m_T.rows()); @@ -337,8 +343,8 @@ void MatrixFunction::constructPermutation() } /** \brief Permute Schur decomposition in #m_U and #m_T according to #m_permutation */ -template -void MatrixFunction::permuteSchur() +template +void MatrixFunction::permuteSchur() { IntVectorType p = m_permutation; for (Index i = 0; i < p.rows() - 1; i++) { @@ -355,8 +361,8 @@ void MatrixFunction::permuteSchur() } /** \brief Swap rows \a index and \a index+1 in Schur decomposition in #m_U and #m_T */ -template -void MatrixFunction::swapEntriesInSchur(Index index) +template +void MatrixFunction::swapEntriesInSchur(Index index) { JacobiRotation rotation; rotation.makeGivens(m_T(index, index+1), m_T(index+1, index+1) - m_T(index, index)); @@ -367,25 +373,23 @@ void MatrixFunction::swapEntriesInSchur(Index index) /** \brief Compute block diagonal part of #m_fT. * - * This routine computes the matrix function #m_f applied to the block - * diagonal part of #m_T, with the blocking given by #m_blockStart. The - * result is stored in #m_fT. The off-diagonal parts of #m_fT are set - * to zero. + * This routine computes the matrix function applied to the block diagonal part of #m_T, with the blocking + * given by #m_blockStart. The matrix function of each diagonal block is computed by #m_atomic. The + * off-diagonal parts of #m_fT are set to zero. */ -template -void MatrixFunction::computeBlockAtomic() +template +void MatrixFunction::computeBlockAtomic() { m_fT.resize(m_T.rows(), m_T.cols()); m_fT.setZero(); - MatrixFunctionAtomic mfa(m_f); for (Index i = 0; i < m_clusterSize.rows(); ++i) { - block(m_fT, i, i) = mfa.compute(block(m_T, i, i)); + block(m_fT, i, i) = m_atomic.compute(block(m_T, i, i)); } } /** \brief Return block of matrix according to blocking given by #m_blockStart */ -template -Block MatrixFunction::block(MatrixType& A, Index i, Index j) +template +Block MatrixFunction::block(MatrixType& A, Index i, Index j) { return A.block(m_blockStart(i), m_blockStart(j), m_clusterSize(i), m_clusterSize(j)); } @@ -393,12 +397,12 @@ Block MatrixFunction::block(MatrixType& A, Index i, In /** \brief Compute part of #m_fT above block diagonal. * * This routine assumes that the block diagonal part of #m_fT (which - * equals #m_f applied to #m_T) has already been computed and computes + * equals the matrix function applied to #m_T) has already been computed and computes * the part above the block diagonal. The part below the diagonal is * zero, because #m_T is upper triangular. */ -template -void MatrixFunction::computeOffDiagonal() +template +void MatrixFunction::computeOffDiagonal() { for (Index diagIndex = 1; diagIndex < m_clusterSize.rows(); diagIndex++) { for (Index blockIndex = 0; blockIndex < m_clusterSize.rows() - diagIndex; blockIndex++) { @@ -439,8 +443,8 @@ void MatrixFunction::computeOffDiagonal() * solution). In that case, these equations can be evaluated in the * order \f$ i=m,\ldots,1 \f$ and \f$ j=1,\ldots,n \f$. */ -template -typename MatrixFunction::DynMatrixType MatrixFunction::solveTriangularSylvester( +template +typename MatrixFunction::DynMatrixType MatrixFunction::solveTriangularSylvester( const DynMatrixType& A, const DynMatrixType& B, const DynMatrixType& C) @@ -520,8 +524,18 @@ template class MatrixFunctionReturnValue template inline void evalTo(ResultType& result) const { - const typename Derived::PlainObject Aevaluated = m_A.eval(); - MatrixFunction mf(Aevaluated, m_f); + typedef typename Derived::PlainObject PlainObject; + typedef internal::traits Traits; + static const int RowsAtCompileTime = Traits::RowsAtCompileTime; + static const int ColsAtCompileTime = Traits::ColsAtCompileTime; + static const int Options = PlainObject::Options; + typedef std::complex::Real> ComplexScalar; + typedef Matrix DynMatrixType; + typedef MatrixFunctionAtomic AtomicType; + AtomicType atomic(m_f); + + const PlainObject Aevaluated = m_A.eval(); + MatrixFunction mf(Aevaluated, atomic); mf.compute(result); } @@ -586,4 +600,6 @@ const MatrixFunctionReturnValue MatrixBase::cosh() const return MatrixFunctionReturnValue(derived(), StdStemFunctions::cosh); } +} // end namespace Eigen + #endif // EIGEN_MATRIX_FUNCTION diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunctionAtomic.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunctionAtomic.h index d08766921..97ab662fe 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunctionAtomic.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunctionAtomic.h @@ -25,6 +25,8 @@ #ifndef EIGEN_MATRIX_FUNCTION_ATOMIC #define EIGEN_MATRIX_FUNCTION_ATOMIC +namespace Eigen { + /** \ingroup MatrixFunctions_Module * \class MatrixFunctionAtomic * \brief Helper class for computing matrix functions of atomic matrices. @@ -139,4 +141,6 @@ bool MatrixFunctionAtomic::taylorConverged(Index s, const MatrixType return false; } +} // end namespace Eigen + #endif // EIGEN_MATRIX_FUNCTION_ATOMIC diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h new file mode 100644 index 000000000..e6f25b73c --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h @@ -0,0 +1,510 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Jitse Niesen +// Copyright (C) 2011 Chen-Pang He +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_MATRIX_LOGARITHM +#define EIGEN_MATRIX_LOGARITHM + +#ifndef M_PI +#define M_PI 3.141592653589793238462643383279503L +#endif + +namespace Eigen { + +/** \ingroup MatrixFunctions_Module + * \class MatrixLogarithmAtomic + * \brief Helper class for computing matrix logarithm of atomic matrices. + * + * \internal + * Here, an atomic matrix is a triangular matrix whose diagonal + * entries are close to each other. + * + * \sa class MatrixFunctionAtomic, MatrixBase::log() + */ +template +class MatrixLogarithmAtomic +{ +public: + + typedef typename MatrixType::Scalar Scalar; + // typedef typename MatrixType::Index Index; + typedef typename NumTraits::Real RealScalar; + // typedef typename internal::stem_function::type StemFunction; + // typedef Matrix VectorType; + + /** \brief Constructor. */ + MatrixLogarithmAtomic() { } + + /** \brief Compute matrix logarithm of atomic matrix + * \param[in] A argument of matrix logarithm, should be upper triangular and atomic + * \returns The logarithm of \p A. + */ + MatrixType compute(const MatrixType& A); + +private: + + void compute2x2(const MatrixType& A, MatrixType& result); + void computeBig(const MatrixType& A, MatrixType& result); + static Scalar atanh(Scalar x); + int getPadeDegree(float normTminusI); + int getPadeDegree(double normTminusI); + int getPadeDegree(long double normTminusI); + void computePade(MatrixType& result, const MatrixType& T, int degree); + void computePade3(MatrixType& result, const MatrixType& T); + void computePade4(MatrixType& result, const MatrixType& T); + void computePade5(MatrixType& result, const MatrixType& T); + void computePade6(MatrixType& result, const MatrixType& T); + void computePade7(MatrixType& result, const MatrixType& T); + void computePade8(MatrixType& result, const MatrixType& T); + void computePade9(MatrixType& result, const MatrixType& T); + void computePade10(MatrixType& result, const MatrixType& T); + void computePade11(MatrixType& result, const MatrixType& T); + + static const int minPadeDegree = 3; + static const int maxPadeDegree = std::numeric_limits::digits<= 24? 5: // single precision + std::numeric_limits::digits<= 53? 7: // double precision + std::numeric_limits::digits<= 64? 8: // extended precision + std::numeric_limits::digits<=106? 10: 11; // double-double or quadruple precision + + // Prevent copying + MatrixLogarithmAtomic(const MatrixLogarithmAtomic&); + MatrixLogarithmAtomic& operator=(const MatrixLogarithmAtomic&); +}; + +/** \brief Compute logarithm of triangular matrix with clustered eigenvalues. */ +template +MatrixType MatrixLogarithmAtomic::compute(const MatrixType& A) +{ + using std::log; + MatrixType result(A.rows(), A.rows()); + if (A.rows() == 1) + result(0,0) = log(A(0,0)); + else if (A.rows() == 2) + compute2x2(A, result); + else + computeBig(A, result); + return result; +} + +/** \brief Compute atanh (inverse hyperbolic tangent). */ +template +typename MatrixType::Scalar MatrixLogarithmAtomic::atanh(typename MatrixType::Scalar x) +{ + using std::abs; + using std::sqrt; + if (abs(x) > sqrt(NumTraits::epsilon())) + return Scalar(0.5) * log((Scalar(1) + x) / (Scalar(1) - x)); + else + return x + x*x*x / Scalar(3); +} + +/** \brief Compute logarithm of 2x2 triangular matrix. */ +template +void MatrixLogarithmAtomic::compute2x2(const MatrixType& A, MatrixType& result) +{ + using std::abs; + using std::ceil; + using std::imag; + using std::log; + + Scalar logA00 = log(A(0,0)); + Scalar logA11 = log(A(1,1)); + + result(0,0) = logA00; + result(1,0) = Scalar(0); + result(1,1) = logA11; + + if (A(0,0) == A(1,1)) { + result(0,1) = A(0,1) / A(0,0); + } else if ((abs(A(0,0)) < 0.5*abs(A(1,1))) || (abs(A(0,0)) > 2*abs(A(1,1)))) { + result(0,1) = A(0,1) * (logA11 - logA00) / (A(1,1) - A(0,0)); + } else { + // computation in previous branch is inaccurate if A(1,1) \approx A(0,0) + int unwindingNumber = static_cast(ceil((imag(logA11 - logA00) - M_PI) / (2*M_PI))); + Scalar z = (A(1,1) - A(0,0)) / (A(1,1) + A(0,0)); + result(0,1) = A(0,1) * (Scalar(2) * atanh(z) + Scalar(0,2*M_PI*unwindingNumber)) / (A(1,1) - A(0,0)); + } +} + +/** \brief Compute logarithm of triangular matrices with size > 2. + * \details This uses a inverse scale-and-square algorithm. */ +template +void MatrixLogarithmAtomic::computeBig(const MatrixType& A, MatrixType& result) +{ + int numberOfSquareRoots = 0; + int numberOfExtraSquareRoots = 0; + int degree; + MatrixType T = A; + const RealScalar maxNormForPade = maxPadeDegree<= 5? 5.3149729967117310e-1: // single precision + maxPadeDegree<= 7? 2.6429608311114350e-1: // double precision + maxPadeDegree<= 8? 2.32777776523703892094e-1L: // extended precision + maxPadeDegree<=10? 1.05026503471351080481093652651105e-1L: // double-double + 1.1880960220216759245467951592883642e-1L; // quadruple precision + + while (true) { + RealScalar normTminusI = (T - MatrixType::Identity(T.rows(), T.rows())).cwiseAbs().colwise().sum().maxCoeff(); + if (normTminusI < maxNormForPade) { + degree = getPadeDegree(normTminusI); + int degree2 = getPadeDegree(normTminusI / RealScalar(2)); + if ((degree - degree2 <= 1) || (numberOfExtraSquareRoots == 1)) + break; + ++numberOfExtraSquareRoots; + } + MatrixType sqrtT; + MatrixSquareRootTriangular(T).compute(sqrtT); + T = sqrtT; + ++numberOfSquareRoots; + } + + computePade(result, T, degree); + result *= pow(RealScalar(2), numberOfSquareRoots); +} + +/* \brief Get suitable degree for Pade approximation. (specialized for RealScalar = float) */ +template +int MatrixLogarithmAtomic::getPadeDegree(float normTminusI) +{ + const float maxNormForPade[] = { 2.5111573934555054e-1 /* degree = 3 */ , 4.0535837411880493e-1, + 5.3149729967117310e-1 }; + for (int degree = 3; degree <= maxPadeDegree; ++degree) + if (normTminusI <= maxNormForPade[degree - minPadeDegree]) + return degree; + assert(false); // this line should never be reached +} + +/* \brief Get suitable degree for Pade approximation. (specialized for RealScalar = double) */ +template +int MatrixLogarithmAtomic::getPadeDegree(double normTminusI) +{ + const double maxNormForPade[] = { 1.6206284795015624e-2 /* degree = 3 */ , 5.3873532631381171e-2, + 1.1352802267628681e-1, 1.8662860613541288e-1, 2.642960831111435e-1 }; + for (int degree = 3; degree <= maxPadeDegree; ++degree) + if (normTminusI <= maxNormForPade[degree - minPadeDegree]) + return degree; + assert(false); // this line should never be reached +} + +/* \brief Get suitable degree for Pade approximation. (specialized for RealScalar = long double) */ +template +int MatrixLogarithmAtomic::getPadeDegree(long double normTminusI) +{ +#if LDBL_MANT_DIG == 53 // double precision + const double maxNormForPade[] = { 1.6206284795015624e-2 /* degree = 3 */ , 5.3873532631381171e-2, + 1.1352802267628681e-1, 1.8662860613541288e-1, 2.642960831111435e-1 }; +#elif LDBL_MANT_DIG <= 64 // extended precision + const double maxNormForPade[] = { 5.48256690357782863103e-3 /* degree = 3 */, 2.34559162387971167321e-2, + 5.84603923897347449857e-2, 1.08486423756725170223e-1, 1.68385767881294446649e-1, + 2.32777776523703892094e-1 }; +#elif LDBL_MANT_DIG <= 106 // double-double + const double maxNormForPade[] = { 8.58970550342939562202529664318890e-5 /* degree = 3 */, + 9.34074328446359654039446552677759e-4, 4.26117194647672175773064114582860e-3, + 1.21546224740281848743149666560464e-2, 2.61100544998339436713088248557444e-2, + 4.66170074627052749243018566390567e-2, 7.32585144444135027565872014932387e-2, + 1.05026503471351080481093652651105e-1 }; +#else // quadruple precision + const double maxNormForPade[] = { 4.7419931187193005048501568167858103e-5 /* degree = 3 */, + 5.8853168473544560470387769480192666e-4, 2.9216120366601315391789493628113520e-3, + 8.8415758124319434347116734705174308e-3, 1.9850836029449446668518049562565291e-2, + 3.6688019729653446926585242192447447e-2, 5.9290962294020186998954055264528393e-2, + 8.6998436081634343903250580992127677e-2, 1.1880960220216759245467951592883642e-1 }; +#endif + for (int degree = 3; degree <= maxPadeDegree; ++degree) + if (normTminusI <= maxNormForPade[degree - minPadeDegree]) + return degree; + assert(false); // this line should never be reached +} + +/* \brief Compute Pade approximation to matrix logarithm */ +template +void MatrixLogarithmAtomic::computePade(MatrixType& result, const MatrixType& T, int degree) +{ + switch (degree) { + case 3: computePade3(result, T); break; + case 4: computePade4(result, T); break; + case 5: computePade5(result, T); break; + case 6: computePade6(result, T); break; + case 7: computePade7(result, T); break; + case 8: computePade8(result, T); break; + case 9: computePade9(result, T); break; + case 10: computePade10(result, T); break; + case 11: computePade11(result, T); break; + default: assert(false); // should never happen + } +} + +template +void MatrixLogarithmAtomic::computePade3(MatrixType& result, const MatrixType& T) +{ + const int degree = 3; + const RealScalar nodes[] = { 0.1127016653792583114820734600217600L, 0.5000000000000000000000000000000000L, + 0.8872983346207416885179265399782400L }; + const RealScalar weights[] = { 0.2777777777777777777777777777777778L, 0.4444444444444444444444444444444444L, + 0.2777777777777777777777777777777778L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade4(MatrixType& result, const MatrixType& T) +{ + const int degree = 4; + const RealScalar nodes[] = { 0.0694318442029737123880267555535953L, 0.3300094782075718675986671204483777L, + 0.6699905217924281324013328795516223L, 0.9305681557970262876119732444464048L }; + const RealScalar weights[] = { 0.1739274225687269286865319746109997L, 0.3260725774312730713134680253890003L, + 0.3260725774312730713134680253890003L, 0.1739274225687269286865319746109997L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade5(MatrixType& result, const MatrixType& T) +{ + const int degree = 5; + const RealScalar nodes[] = { 0.0469100770306680036011865608503035L, 0.2307653449471584544818427896498956L, + 0.5000000000000000000000000000000000L, 0.7692346550528415455181572103501044L, + 0.9530899229693319963988134391496965L }; + const RealScalar weights[] = { 0.1184634425280945437571320203599587L, 0.2393143352496832340206457574178191L, + 0.2844444444444444444444444444444444L, 0.2393143352496832340206457574178191L, + 0.1184634425280945437571320203599587L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade6(MatrixType& result, const MatrixType& T) +{ + const int degree = 6; + const RealScalar nodes[] = { 0.0337652428984239860938492227530027L, 0.1693953067668677431693002024900473L, + 0.3806904069584015456847491391596440L, 0.6193095930415984543152508608403560L, + 0.8306046932331322568306997975099527L, 0.9662347571015760139061507772469973L }; + const RealScalar weights[] = { 0.0856622461895851725201480710863665L, 0.1803807865240693037849167569188581L, + 0.2339569672863455236949351719947755L, 0.2339569672863455236949351719947755L, + 0.1803807865240693037849167569188581L, 0.0856622461895851725201480710863665L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade7(MatrixType& result, const MatrixType& T) +{ + const int degree = 7; + const RealScalar nodes[] = { 0.0254460438286207377369051579760744L, 0.1292344072003027800680676133596058L, + 0.2970774243113014165466967939615193L, 0.5000000000000000000000000000000000L, + 0.7029225756886985834533032060384807L, 0.8707655927996972199319323866403942L, + 0.9745539561713792622630948420239256L }; + const RealScalar weights[] = { 0.0647424830844348466353057163395410L, 0.1398526957446383339507338857118898L, + 0.1909150252525594724751848877444876L, 0.2089795918367346938775510204081633L, + 0.1909150252525594724751848877444876L, 0.1398526957446383339507338857118898L, + 0.0647424830844348466353057163395410L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade8(MatrixType& result, const MatrixType& T) +{ + const int degree = 8; + const RealScalar nodes[] = { 0.0198550717512318841582195657152635L, 0.1016667612931866302042230317620848L, + 0.2372337950418355070911304754053768L, 0.4082826787521750975302619288199080L, + 0.5917173212478249024697380711800920L, 0.7627662049581644929088695245946232L, + 0.8983332387068133697957769682379152L, 0.9801449282487681158417804342847365L }; + const RealScalar weights[] = { 0.0506142681451881295762656771549811L, 0.1111905172266872352721779972131204L, + 0.1568533229389436436689811009933007L, 0.1813418916891809914825752246385978L, + 0.1813418916891809914825752246385978L, 0.1568533229389436436689811009933007L, + 0.1111905172266872352721779972131204L, 0.0506142681451881295762656771549811L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade9(MatrixType& result, const MatrixType& T) +{ + const int degree = 9; + const RealScalar nodes[] = { 0.0159198802461869550822118985481636L, 0.0819844463366821028502851059651326L, + 0.1933142836497048013456489803292629L, 0.3378732882980955354807309926783317L, + 0.5000000000000000000000000000000000L, 0.6621267117019044645192690073216683L, + 0.8066857163502951986543510196707371L, 0.9180155536633178971497148940348674L, + 0.9840801197538130449177881014518364L }; + const RealScalar weights[] = { 0.0406371941807872059859460790552618L, 0.0903240803474287020292360156214564L, + 0.1303053482014677311593714347093164L, 0.1561735385200014200343152032922218L, + 0.1651196775006298815822625346434870L, 0.1561735385200014200343152032922218L, + 0.1303053482014677311593714347093164L, 0.0903240803474287020292360156214564L, + 0.0406371941807872059859460790552618L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade10(MatrixType& result, const MatrixType& T) +{ + const int degree = 10; + const RealScalar nodes[] = { 0.0130467357414141399610179939577740L, 0.0674683166555077446339516557882535L, + 0.1602952158504877968828363174425632L, 0.2833023029353764046003670284171079L, + 0.4255628305091843945575869994351400L, 0.5744371694908156054424130005648600L, + 0.7166976970646235953996329715828921L, 0.8397047841495122031171636825574368L, + 0.9325316833444922553660483442117465L, 0.9869532642585858600389820060422260L }; + const RealScalar weights[] = { 0.0333356721543440687967844049466659L, 0.0747256745752902965728881698288487L, + 0.1095431812579910219977674671140816L, 0.1346333596549981775456134607847347L, + 0.1477621123573764350869464973256692L, 0.1477621123573764350869464973256692L, + 0.1346333596549981775456134607847347L, 0.1095431812579910219977674671140816L, + 0.0747256745752902965728881698288487L, 0.0333356721543440687967844049466659L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +template +void MatrixLogarithmAtomic::computePade11(MatrixType& result, const MatrixType& T) +{ + const int degree = 11; + const RealScalar nodes[] = { 0.0108856709269715035980309994385713L, 0.0564687001159523504624211153480364L, + 0.1349239972129753379532918739844233L, 0.2404519353965940920371371652706952L, + 0.3652284220238275138342340072995692L, 0.5000000000000000000000000000000000L, + 0.6347715779761724861657659927004308L, 0.7595480646034059079628628347293048L, + 0.8650760027870246620467081260155767L, 0.9435312998840476495375788846519636L, + 0.9891143290730284964019690005614287L }; + const RealScalar weights[] = { 0.0278342835580868332413768602212743L, 0.0627901847324523123173471496119701L, + 0.0931451054638671257130488207158280L, 0.1165968822959952399592618524215876L, + 0.1314022722551233310903444349452546L, 0.1364625433889503153572417641681711L, + 0.1314022722551233310903444349452546L, 0.1165968822959952399592618524215876L, + 0.0931451054638671257130488207158280L, 0.0627901847324523123173471496119701L, + 0.0278342835580868332413768602212743L }; + assert(degree <= maxPadeDegree); + MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows()); + result.setZero(T.rows(), T.rows()); + for (int k = 0; k < degree; ++k) + result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI) + .template triangularView().solve(TminusI); +} + +/** \ingroup MatrixFunctions_Module + * + * \brief Proxy for the matrix logarithm of some matrix (expression). + * + * \tparam Derived Type of the argument to the matrix function. + * + * This class holds the argument to the matrix function until it is + * assigned or evaluated for some other reason (so the argument + * should not be changed in the meantime). It is the return type of + * matrixBase::matrixLogarithm() and most of the time this is the + * only way it is used. + */ +template class MatrixLogarithmReturnValue +: public ReturnByValue > +{ +public: + + typedef typename Derived::Scalar Scalar; + typedef typename Derived::Index Index; + + /** \brief Constructor. + * + * \param[in] A %Matrix (expression) forming the argument of the matrix logarithm. + */ + MatrixLogarithmReturnValue(const Derived& A) : m_A(A) { } + + /** \brief Compute the matrix logarithm. + * + * \param[out] result Logarithm of \p A, where \A is as specified in the constructor. + */ + template + inline void evalTo(ResultType& result) const + { + typedef typename Derived::PlainObject PlainObject; + typedef internal::traits Traits; + static const int RowsAtCompileTime = Traits::RowsAtCompileTime; + static const int ColsAtCompileTime = Traits::ColsAtCompileTime; + static const int Options = PlainObject::Options; + typedef std::complex::Real> ComplexScalar; + typedef Matrix DynMatrixType; + typedef MatrixLogarithmAtomic AtomicType; + AtomicType atomic; + + const PlainObject Aevaluated = m_A.eval(); + MatrixFunction mf(Aevaluated, atomic); + mf.compute(result); + } + + Index rows() const { return m_A.rows(); } + Index cols() const { return m_A.cols(); } + +private: + typename internal::nested::type m_A; + + MatrixLogarithmReturnValue& operator=(const MatrixLogarithmReturnValue&); +}; + +namespace internal { + template + struct traits > + { + typedef typename Derived::PlainObject ReturnType; + }; +} + + +/********** MatrixBase method **********/ + + +template +const MatrixLogarithmReturnValue MatrixBase::log() const +{ + eigen_assert(rows() == cols()); + return MatrixLogarithmReturnValue(derived()); +} + +} // end namespace Eigen + +#endif // EIGEN_MATRIX_LOGARITHM diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h new file mode 100644 index 000000000..658cd334c --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h @@ -0,0 +1,499 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Jitse Niesen +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_MATRIX_SQUARE_ROOT +#define EIGEN_MATRIX_SQUARE_ROOT + +namespace Eigen { + +/** \ingroup MatrixFunctions_Module + * \brief Class for computing matrix square roots of upper quasi-triangular matrices. + * \tparam MatrixType type of the argument of the matrix square root, + * expected to be an instantiation of the Matrix class template. + * + * This class computes the square root of the upper quasi-triangular + * matrix stored in the upper Hessenberg part of the matrix passed to + * the constructor. + * + * \sa MatrixSquareRoot, MatrixSquareRootTriangular + */ +template +class MatrixSquareRootQuasiTriangular +{ + public: + + /** \brief Constructor. + * + * \param[in] A upper quasi-triangular matrix whose square root + * is to be computed. + * + * The class stores a reference to \p A, so it should not be + * changed (or destroyed) before compute() is called. + */ + MatrixSquareRootQuasiTriangular(const MatrixType& A) + : m_A(A) + { + eigen_assert(A.rows() == A.cols()); + } + + /** \brief Compute the matrix square root + * + * \param[out] result square root of \p A, as specified in the constructor. + * + * Only the upper Hessenberg part of \p result is updated, the + * rest is not touched. See MatrixBase::sqrt() for details on + * how this computation is implemented. + */ + template void compute(ResultType &result); + + private: + typedef typename MatrixType::Index Index; + typedef typename MatrixType::Scalar Scalar; + + void computeDiagonalPartOfSqrt(MatrixType& sqrtT, const MatrixType& T); + void computeOffDiagonalPartOfSqrt(MatrixType& sqrtT, const MatrixType& T); + void compute2x2diagonalBlock(MatrixType& sqrtT, const MatrixType& T, typename MatrixType::Index i); + void compute1x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j); + void compute1x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j); + void compute2x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j); + void compute2x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j); + + template + static void solveAuxiliaryEquation(SmallMatrixType& X, const SmallMatrixType& A, + const SmallMatrixType& B, const SmallMatrixType& C); + + const MatrixType& m_A; +}; + +template +template +void MatrixSquareRootQuasiTriangular::compute(ResultType &result) +{ + // Compute Schur decomposition of m_A + const RealSchur schurOfA(m_A); + const MatrixType& T = schurOfA.matrixT(); + const MatrixType& U = schurOfA.matrixU(); + + // Compute square root of T + MatrixType sqrtT = MatrixType::Zero(m_A.rows(), m_A.rows()); + computeDiagonalPartOfSqrt(sqrtT, T); + computeOffDiagonalPartOfSqrt(sqrtT, T); + + // Compute square root of m_A + result = U * sqrtT * U.adjoint(); +} + +// pre: T is quasi-upper-triangular and sqrtT is a zero matrix of the same size +// post: the diagonal blocks of sqrtT are the square roots of the diagonal blocks of T +template +void MatrixSquareRootQuasiTriangular::computeDiagonalPartOfSqrt(MatrixType& sqrtT, + const MatrixType& T) +{ + const Index size = m_A.rows(); + for (Index i = 0; i < size; i++) { + if (i == size - 1 || T.coeff(i+1, i) == 0) { + eigen_assert(T(i,i) > 0); + sqrtT.coeffRef(i,i) = internal::sqrt(T.coeff(i,i)); + } + else { + compute2x2diagonalBlock(sqrtT, T, i); + ++i; + } + } +} + +// pre: T is quasi-upper-triangular and diagonal blocks of sqrtT are square root of diagonal blocks of T. +// post: sqrtT is the square root of T. +template +void MatrixSquareRootQuasiTriangular::computeOffDiagonalPartOfSqrt(MatrixType& sqrtT, + const MatrixType& T) +{ + const Index size = m_A.rows(); + for (Index j = 1; j < size; j++) { + if (T.coeff(j, j-1) != 0) // if T(j-1:j, j-1:j) is a 2-by-2 block + continue; + for (Index i = j-1; i >= 0; i--) { + if (i > 0 && T.coeff(i, i-1) != 0) // if T(i-1:i, i-1:i) is a 2-by-2 block + continue; + bool iBlockIs2x2 = (i < size - 1) && (T.coeff(i+1, i) != 0); + bool jBlockIs2x2 = (j < size - 1) && (T.coeff(j+1, j) != 0); + if (iBlockIs2x2 && jBlockIs2x2) + compute2x2offDiagonalBlock(sqrtT, T, i, j); + else if (iBlockIs2x2 && !jBlockIs2x2) + compute2x1offDiagonalBlock(sqrtT, T, i, j); + else if (!iBlockIs2x2 && jBlockIs2x2) + compute1x2offDiagonalBlock(sqrtT, T, i, j); + else if (!iBlockIs2x2 && !jBlockIs2x2) + compute1x1offDiagonalBlock(sqrtT, T, i, j); + } + } +} + +// pre: T.block(i,i,2,2) has complex conjugate eigenvalues +// post: sqrtT.block(i,i,2,2) is square root of T.block(i,i,2,2) +template +void MatrixSquareRootQuasiTriangular + ::compute2x2diagonalBlock(MatrixType& sqrtT, const MatrixType& T, typename MatrixType::Index i) +{ + // TODO: This case (2-by-2 blocks with complex conjugate eigenvalues) is probably hidden somewhere + // in EigenSolver. If we expose it, we could call it directly from here. + Matrix block = T.template block<2,2>(i,i); + EigenSolver > es(block); + sqrtT.template block<2,2>(i,i) + = (es.eigenvectors() * es.eigenvalues().cwiseSqrt().asDiagonal() * es.eigenvectors().inverse()).real(); +} + +// pre: block structure of T is such that (i,j) is a 1x1 block, +// all blocks of sqrtT to left of and below (i,j) are correct +// post: sqrtT(i,j) has the correct value +template +void MatrixSquareRootQuasiTriangular + ::compute1x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j) +{ + Scalar tmp = (sqrtT.row(i).segment(i+1,j-i-1) * sqrtT.col(j).segment(i+1,j-i-1)).value(); + sqrtT.coeffRef(i,j) = (T.coeff(i,j) - tmp) / (sqrtT.coeff(i,i) + sqrtT.coeff(j,j)); +} + +// similar to compute1x1offDiagonalBlock() +template +void MatrixSquareRootQuasiTriangular + ::compute1x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j) +{ + Matrix rhs = T.template block<1,2>(i,j); + if (j-i > 1) + rhs -= sqrtT.block(i, i+1, 1, j-i-1) * sqrtT.block(i+1, j, j-i-1, 2); + Matrix A = sqrtT.coeff(i,i) * Matrix::Identity(); + A += sqrtT.template block<2,2>(j,j).transpose(); + sqrtT.template block<1,2>(i,j).transpose() = A.fullPivLu().solve(rhs.transpose()); +} + +// similar to compute1x1offDiagonalBlock() +template +void MatrixSquareRootQuasiTriangular + ::compute2x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j) +{ + Matrix rhs = T.template block<2,1>(i,j); + if (j-i > 2) + rhs -= sqrtT.block(i, i+2, 2, j-i-2) * sqrtT.block(i+2, j, j-i-2, 1); + Matrix A = sqrtT.coeff(j,j) * Matrix::Identity(); + A += sqrtT.template block<2,2>(i,i); + sqrtT.template block<2,1>(i,j) = A.fullPivLu().solve(rhs); +} + +// similar to compute1x1offDiagonalBlock() +template +void MatrixSquareRootQuasiTriangular + ::compute2x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, + typename MatrixType::Index i, typename MatrixType::Index j) +{ + Matrix A = sqrtT.template block<2,2>(i,i); + Matrix B = sqrtT.template block<2,2>(j,j); + Matrix C = T.template block<2,2>(i,j); + if (j-i > 2) + C -= sqrtT.block(i, i+2, 2, j-i-2) * sqrtT.block(i+2, j, j-i-2, 2); + Matrix X; + solveAuxiliaryEquation(X, A, B, C); + sqrtT.template block<2,2>(i,j) = X; +} + +// solves the equation A X + X B = C where all matrices are 2-by-2 +template +template +void MatrixSquareRootQuasiTriangular + ::solveAuxiliaryEquation(SmallMatrixType& X, const SmallMatrixType& A, + const SmallMatrixType& B, const SmallMatrixType& C) +{ + EIGEN_STATIC_ASSERT((internal::is_same >::value), + EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT); + + Matrix coeffMatrix = Matrix::Zero(); + coeffMatrix.coeffRef(0,0) = A.coeff(0,0) + B.coeff(0,0); + coeffMatrix.coeffRef(1,1) = A.coeff(0,0) + B.coeff(1,1); + coeffMatrix.coeffRef(2,2) = A.coeff(1,1) + B.coeff(0,0); + coeffMatrix.coeffRef(3,3) = A.coeff(1,1) + B.coeff(1,1); + coeffMatrix.coeffRef(0,1) = B.coeff(1,0); + coeffMatrix.coeffRef(0,2) = A.coeff(0,1); + coeffMatrix.coeffRef(1,0) = B.coeff(0,1); + coeffMatrix.coeffRef(1,3) = A.coeff(0,1); + coeffMatrix.coeffRef(2,0) = A.coeff(1,0); + coeffMatrix.coeffRef(2,3) = B.coeff(1,0); + coeffMatrix.coeffRef(3,1) = A.coeff(1,0); + coeffMatrix.coeffRef(3,2) = B.coeff(0,1); + + Matrix rhs; + rhs.coeffRef(0) = C.coeff(0,0); + rhs.coeffRef(1) = C.coeff(0,1); + rhs.coeffRef(2) = C.coeff(1,0); + rhs.coeffRef(3) = C.coeff(1,1); + + Matrix result; + result = coeffMatrix.fullPivLu().solve(rhs); + + X.coeffRef(0,0) = result.coeff(0); + X.coeffRef(0,1) = result.coeff(1); + X.coeffRef(1,0) = result.coeff(2); + X.coeffRef(1,1) = result.coeff(3); +} + + +/** \ingroup MatrixFunctions_Module + * \brief Class for computing matrix square roots of upper triangular matrices. + * \tparam MatrixType type of the argument of the matrix square root, + * expected to be an instantiation of the Matrix class template. + * + * This class computes the square root of the upper triangular matrix + * stored in the upper triangular part (including the diagonal) of + * the matrix passed to the constructor. + * + * \sa MatrixSquareRoot, MatrixSquareRootQuasiTriangular + */ +template +class MatrixSquareRootTriangular +{ + public: + MatrixSquareRootTriangular(const MatrixType& A) + : m_A(A) + { + eigen_assert(A.rows() == A.cols()); + } + + /** \brief Compute the matrix square root + * + * \param[out] result square root of \p A, as specified in the constructor. + * + * Only the upper triangular part (including the diagonal) of + * \p result is updated, the rest is not touched. See + * MatrixBase::sqrt() for details on how this computation is + * implemented. + */ + template void compute(ResultType &result); + + private: + const MatrixType& m_A; +}; + +template +template +void MatrixSquareRootTriangular::compute(ResultType &result) +{ + // Compute Schur decomposition of m_A + const ComplexSchur schurOfA(m_A); + const MatrixType& T = schurOfA.matrixT(); + const MatrixType& U = schurOfA.matrixU(); + + // Compute square root of T and store it in upper triangular part of result + // This uses that the square root of triangular matrices can be computed directly. + result.resize(m_A.rows(), m_A.cols()); + typedef typename MatrixType::Index Index; + for (Index i = 0; i < m_A.rows(); i++) { + result.coeffRef(i,i) = internal::sqrt(T.coeff(i,i)); + } + for (Index j = 1; j < m_A.cols(); j++) { + for (Index i = j-1; i >= 0; i--) { + typedef typename MatrixType::Scalar Scalar; + // if i = j-1, then segment has length 0 so tmp = 0 + Scalar tmp = (result.row(i).segment(i+1,j-i-1) * result.col(j).segment(i+1,j-i-1)).value(); + // denominator may be zero if original matrix is singular + result.coeffRef(i,j) = (T.coeff(i,j) - tmp) / (result.coeff(i,i) + result.coeff(j,j)); + } + } + + // Compute square root of m_A as U * result * U.adjoint() + MatrixType tmp; + tmp.noalias() = U * result.template triangularView(); + result.noalias() = tmp * U.adjoint(); +} + + +/** \ingroup MatrixFunctions_Module + * \brief Class for computing matrix square roots of general matrices. + * \tparam MatrixType type of the argument of the matrix square root, + * expected to be an instantiation of the Matrix class template. + * + * \sa MatrixSquareRootTriangular, MatrixSquareRootQuasiTriangular, MatrixBase::sqrt() + */ +template ::Scalar>::IsComplex> +class MatrixSquareRoot +{ + public: + + /** \brief Constructor. + * + * \param[in] A matrix whose square root is to be computed. + * + * The class stores a reference to \p A, so it should not be + * changed (or destroyed) before compute() is called. + */ + MatrixSquareRoot(const MatrixType& A); + + /** \brief Compute the matrix square root + * + * \param[out] result square root of \p A, as specified in the constructor. + * + * See MatrixBase::sqrt() for details on how this computation is + * implemented. + */ + template void compute(ResultType &result); +}; + + +// ********** Partial specialization for real matrices ********** + +template +class MatrixSquareRoot +{ + public: + + MatrixSquareRoot(const MatrixType& A) + : m_A(A) + { + eigen_assert(A.rows() == A.cols()); + } + + template void compute(ResultType &result) + { + // Compute Schur decomposition of m_A + const RealSchur schurOfA(m_A); + const MatrixType& T = schurOfA.matrixT(); + const MatrixType& U = schurOfA.matrixU(); + + // Compute square root of T + MatrixSquareRootQuasiTriangular tmp(T); + MatrixType sqrtT = MatrixType::Zero(m_A.rows(), m_A.rows()); + tmp.compute(sqrtT); + + // Compute square root of m_A + result = U * sqrtT * U.adjoint(); + } + + private: + const MatrixType& m_A; +}; + + +// ********** Partial specialization for complex matrices ********** + +template +class MatrixSquareRoot +{ + public: + + MatrixSquareRoot(const MatrixType& A) + : m_A(A) + { + eigen_assert(A.rows() == A.cols()); + } + + template void compute(ResultType &result) + { + // Compute Schur decomposition of m_A + const ComplexSchur schurOfA(m_A); + const MatrixType& T = schurOfA.matrixT(); + const MatrixType& U = schurOfA.matrixU(); + + // Compute square root of T + MatrixSquareRootTriangular tmp(T); + MatrixType sqrtT = MatrixType::Zero(m_A.rows(), m_A.rows()); + tmp.compute(sqrtT); + + // Compute square root of m_A + result = U * sqrtT * U.adjoint(); + } + + private: + const MatrixType& m_A; +}; + + +/** \ingroup MatrixFunctions_Module + * + * \brief Proxy for the matrix square root of some matrix (expression). + * + * \tparam Derived Type of the argument to the matrix square root. + * + * This class holds the argument to the matrix square root until it + * is assigned or evaluated for some other reason (so the argument + * should not be changed in the meantime). It is the return type of + * MatrixBase::sqrt() and most of the time this is the only way it is + * used. + */ +template class MatrixSquareRootReturnValue +: public ReturnByValue > +{ + typedef typename Derived::Index Index; + public: + /** \brief Constructor. + * + * \param[in] src %Matrix (expression) forming the argument of the + * matrix square root. + */ + MatrixSquareRootReturnValue(const Derived& src) : m_src(src) { } + + /** \brief Compute the matrix square root. + * + * \param[out] result the matrix square root of \p src in the + * constructor. + */ + template + inline void evalTo(ResultType& result) const + { + const typename Derived::PlainObject srcEvaluated = m_src.eval(); + MatrixSquareRoot me(srcEvaluated); + me.compute(result); + } + + Index rows() const { return m_src.rows(); } + Index cols() const { return m_src.cols(); } + + protected: + const Derived& m_src; + private: + MatrixSquareRootReturnValue& operator=(const MatrixSquareRootReturnValue&); +}; + +namespace internal { +template +struct traits > +{ + typedef typename Derived::PlainObject ReturnType; +}; +} + +template +const MatrixSquareRootReturnValue MatrixBase::sqrt() const +{ + eigen_assert(rows() == cols()); + return MatrixSquareRootReturnValue(derived()); +} + +} // end namespace Eigen + +#endif // EIGEN_MATRIX_FUNCTION diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/StemFunction.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/StemFunction.h index 260690b63..3de68ec3a 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/StemFunction.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/StemFunction.h @@ -25,6 +25,8 @@ #ifndef EIGEN_STEM_FUNCTION #define EIGEN_STEM_FUNCTION +namespace Eigen { + /** \ingroup MatrixFunctions_Module * \brief Stem functions corresponding to standard mathematical functions. */ @@ -113,4 +115,6 @@ class StdStemFunctions }; // end of class StdStemFunctions +} // end namespace Eigen + #endif // EIGEN_STEM_FUNCTION diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MoreVectorization/MathFunctions.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MoreVectorization/MathFunctions.h index bc948d0bd..123f4016e 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MoreVectorization/MathFunctions.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MoreVectorization/MathFunctions.h @@ -26,6 +26,8 @@ #ifndef EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H #define EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H +namespace Eigen { + namespace internal { /** \internal \returns the arcsin of \a a (coeff-wise) */ @@ -99,8 +101,10 @@ template<> EIGEN_DONT_INLINE Packet4f pasin(Packet4f x) return _mm_xor_ps(z, sign_bit); } +#endif // EIGEN_VECTORIZE_SSE + } // end namespace internal -#endif +} // end namespace Eigen #endif // EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h index 37abb6117..aa9430359 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h @@ -28,6 +28,8 @@ #ifndef EIGEN_HYBRIDNONLINEARSOLVER_H #define EIGEN_HYBRIDNONLINEARSOLVER_H +namespace Eigen { + namespace HybridNonLinearSolverSpace { enum Status { Running = -1, @@ -602,6 +604,8 @@ HybridNonLinearSolver::solveNumericalDiff(FVectorType &x) return status; } -//vim: ai ts=4 sts=4 et sw=4 +} // end namespace Eigen + #endif // EIGEN_HYBRIDNONLINEARSOLVER_H +//vim: ai ts=4 sts=4 et sw=4 diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h index 0ae681b1c..1cb501a66 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h @@ -28,6 +28,7 @@ #ifndef EIGEN_LEVENBERGMARQUARDT__H #define EIGEN_LEVENBERGMARQUARDT__H +namespace Eigen { namespace LevenbergMarquardtSpace { enum Status { @@ -640,7 +641,7 @@ LevenbergMarquardt::lmdif1( NumericalDiff numDiff(functor); // embedded LevenbergMarquardt - LevenbergMarquardt > lm(numDiff); + LevenbergMarquardt, Scalar > lm(numDiff); lm.parameters.ftol = tol; lm.parameters.xtol = tol; lm.parameters.maxfev = 200*(n+1); @@ -651,6 +652,8 @@ LevenbergMarquardt::lmdif1( return info; } -//vim: ai ts=4 sts=4 et sw=4 +} // end namespace Eigen + #endif // EIGEN_LEVENBERGMARQUARDT__H +//vim: ai ts=4 sts=4 et sw=4 diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/chkder.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/chkder.h index bc0cb1880..fd3e0bc4a 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/chkder.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/chkder.h @@ -2,6 +2,8 @@ #define chkder_log10e 0.43429448190325182765 #define chkder_factor 100. +namespace Eigen { + namespace internal { template @@ -58,3 +60,4 @@ void chkder( } // end namespace internal +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/covar.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/covar.h index 6c77916f5..c73a09645 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/covar.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/covar.h @@ -1,3 +1,5 @@ +namespace Eigen { + namespace internal { template @@ -63,3 +65,5 @@ void covar( } } // end namespace internal + +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/dogleg.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/dogleg.h index cbdcf4b71..4fbc98bfc 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/dogleg.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/dogleg.h @@ -1,3 +1,5 @@ +namespace Eigen { + namespace internal { template @@ -98,3 +100,5 @@ algo_end: } } // end namespace internal + +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h index 0a26c2061..1cabe69ae 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h @@ -1,3 +1,5 @@ +namespace Eigen { + namespace internal { template @@ -70,3 +72,5 @@ DenseIndex fdjac1( } } // end namespace internal + +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/lmpar.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/lmpar.h index 62f4aabc9..cc1ca530f 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/lmpar.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/lmpar.h @@ -1,3 +1,5 @@ +namespace Eigen { + namespace internal { template @@ -288,3 +290,5 @@ void lmpar2( } } // end namespace internal + +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h index cb1764a41..feafd62a8 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h @@ -1,3 +1,5 @@ +namespace Eigen { + namespace internal { // TODO : once qrsolv2 is removed, use ColPivHouseholderQR or PermutationMatrix instead of ipvt @@ -85,3 +87,5 @@ void qrsolv( } } // end namespace internal + +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h index ffe505cd5..36ff700e9 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h @@ -1,3 +1,5 @@ +namespace Eigen { + namespace internal { // TODO : move this to GivensQR once there's such a thing in Eigen @@ -24,3 +26,5 @@ void r1mpyq(DenseIndex m, DenseIndex n, Scalar *a, const std::vector @@ -93,3 +95,5 @@ void r1updt( } } // end namespace internal + +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h index ab83f9b25..9ce079e22 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h @@ -1,3 +1,5 @@ +namespace Eigen { + namespace internal { template @@ -44,3 +46,4 @@ void rwupdt( } // end namespace internal +} // end namespace Eigen diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h index 52dc0ec01..8651585f2 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h @@ -28,6 +28,8 @@ #ifndef EIGEN_NUMERICAL_DIFF_H #define EIGEN_NUMERICAL_DIFF_H +namespace Eigen { + enum NumericalDiffMode { Forward, Central @@ -64,7 +66,7 @@ public: template NumericalDiff(const T0& a0, const T1& a1) : Functor(a0, a1), epsfcn(0) {} template - NumericalDiff(const T0& a0, const T1& a1, const T1& a2) : Functor(a0, a1, a2), epsfcn(0) {} + NumericalDiff(const T0& a0, const T1& a1, const T2& a2) : Functor(a0, a1, a2), epsfcn(0) {} enum { InputsAtCompileTime = Functor::InputsAtCompileTime, @@ -134,6 +136,8 @@ private: NumericalDiff& operator=(const NumericalDiff&); }; +} // end namespace Eigen + //vim: ai ts=4 sts=4 et sw=4 #endif // EIGEN_NUMERICAL_DIFF_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/Companion.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/Companion.h index 608951d3c..8936b8fad 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/Companion.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/Companion.h @@ -29,10 +29,12 @@ // * Eigen/Core // * Eigen/src/PolynomialSolver.h -#ifndef EIGEN_PARSED_BY_DOXYGEN +namespace Eigen { namespace internal { +#ifndef EIGEN_PARSED_BY_DOXYGEN + template T radix(){ return 2; } @@ -283,4 +285,6 @@ void companion<_Scalar,_Deg>::balance() } // end namespace internal +} // end namespace Eigen + #endif // EIGEN_COMPANION_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialSolver.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialSolver.h index 417b93df2..71295a105 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialSolver.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialSolver.h @@ -25,6 +25,8 @@ #ifndef EIGEN_POLYNOMIAL_SOLVER_H #define EIGEN_POLYNOMIAL_SOLVER_H +namespace Eigen { + /** \ingroup Polynomials_Module * \class PolynomialSolverBase. * @@ -394,4 +396,6 @@ class PolynomialSolver<_Scalar,1> : public PolynomialSolverBase<_Scalar,1> using PS_Base::m_roots; }; +} // end namespace Eigen + #endif // EIGEN_POLYNOMIAL_SOLVER_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialUtils.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialUtils.h index 65942c52a..1fb1ed139 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialUtils.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialUtils.h @@ -25,6 +25,8 @@ #ifndef EIGEN_POLYNOMIAL_UTILS_H #define EIGEN_POLYNOMIAL_UTILS_H +namespace Eigen { + /** \ingroup Polynomials_Module * \returns the evaluation of the polynomial at x using Horner algorithm. * @@ -149,5 +151,6 @@ void roots_to_monicPolynomial( const RootVector& rv, Polynomial& poly ) } } +} // end namespace Eigen #endif // EIGEN_POLYNOMIAL_UTILS_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h index 51537402e..ef36ac9b6 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h @@ -25,6 +25,8 @@ #ifndef EIGEN_SKYLINEINPLACELU_H #define EIGEN_SKYLINEINPLACELU_H +namespace Eigen { + /** \ingroup Skyline_Module * * \class SkylineInplaceLU @@ -360,4 +362,6 @@ bool SkylineInplaceLU::solve(const MatrixBase &b, MatrixBa return true; } +} // end namespace Eigen + #endif // EIGEN_SKYLINELU_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrix.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrix.h index 31810df08..98a19ce53 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrix.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrix.h @@ -28,6 +28,8 @@ #include "SkylineStorage.h" #include "SkylineMatrixBase.h" +namespace Eigen { + /** \ingroup Skyline_Module * * \class SkylineMatrix @@ -870,4 +872,6 @@ protected: const Index m_end; }; +} // end namespace Eigen + #endif // EIGEN_SkylineMatrix_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h index 4d0c2397c..72131eb3f 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h @@ -27,6 +27,8 @@ #include "SkylineUtil.h" +namespace Eigen { + /** \ingroup Skyline_Module * * \class SkylineMatrixBase @@ -220,4 +222,6 @@ protected: bool m_isRValue; }; +} // end namespace Eigen + #endif // EIGEN_SkylineMatrixBase_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineProduct.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineProduct.h index aeedc47ec..fb653b446 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineProduct.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineProduct.h @@ -25,6 +25,8 @@ #ifndef EIGEN_SKYLINEPRODUCT_H #define EIGEN_SKYLINEPRODUCT_H +namespace Eigen { + template struct SkylineProductReturnType { typedef const typename internal::nested::type LhsNested; @@ -303,4 +305,6 @@ SkylineMatrixBase::operator*(const MatrixBase &other) con return typename SkylineProductReturnType::Type(derived(), other.derived()); } +} // end namespace Eigen + #endif // EIGEN_SKYLINEPRODUCT_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineStorage.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineStorage.h index 62806bfb6..5721dee90 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineStorage.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineStorage.h @@ -25,6 +25,8 @@ #ifndef EIGEN_SKYLINE_STORAGE_H #define EIGEN_SKYLINE_STORAGE_H +namespace Eigen { + /** Stores a skyline set of values in three structures : * The diagonal elements * The upper elements @@ -267,4 +269,6 @@ public: }; +} // end namespace Eigen + #endif // EIGEN_COMPRESSED_STORAGE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineUtil.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineUtil.h index e0512476f..5c5bd8bda 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineUtil.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineUtil.h @@ -25,6 +25,8 @@ #ifndef EIGEN_SKYLINEUTIL_H #define EIGEN_SKYLINEUTIL_H +namespace Eigen { + #ifdef NDEBUG #define EIGEN_DBG_SKYLINE(X) #else @@ -97,5 +99,6 @@ template class eval } // end namespace internal +} // end namespace Eigen #endif // EIGEN_SKYLINEUTIL_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h new file mode 100644 index 000000000..0cc6e3a06 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h @@ -0,0 +1,129 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2008-2009 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_SPARSE_BLOCKFORDYNAMICMATRIX_H +#define EIGEN_SPARSE_BLOCKFORDYNAMICMATRIX_H + +namespace Eigen { + +/*************************************************************************** +* specialisation for DynamicSparseMatrix +***************************************************************************/ + +template +class SparseInnerVectorSet, Size> + : public SparseMatrixBase, Size> > +{ + typedef DynamicSparseMatrix<_Scalar, _Options, _Index> MatrixType; + public: + + enum { IsRowMajor = internal::traits::IsRowMajor }; + + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseInnerVectorSet) + class InnerIterator: public MatrixType::InnerIterator + { + public: + inline InnerIterator(const SparseInnerVectorSet& xpr, Index outer) + : MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer) + {} + inline Index row() const { return IsRowMajor ? m_outer : this->index(); } + inline Index col() const { return IsRowMajor ? this->index() : m_outer; } + protected: + Index m_outer; + }; + + inline SparseInnerVectorSet(const MatrixType& matrix, Index outerStart, Index outerSize) + : m_matrix(matrix), m_outerStart(outerStart), m_outerSize(outerSize) + { + eigen_assert( (outerStart>=0) && ((outerStart+outerSize)<=matrix.outerSize()) ); + } + + inline SparseInnerVectorSet(const MatrixType& matrix, Index outer) + : m_matrix(matrix), m_outerStart(outer), m_outerSize(Size) + { + eigen_assert(Size!=Dynamic); + eigen_assert( (outer>=0) && (outer + inline SparseInnerVectorSet& operator=(const SparseMatrixBase& other) + { + if (IsRowMajor != ((OtherDerived::Flags&RowMajorBit)==RowMajorBit)) + { + // need to transpose => perform a block evaluation followed by a big swap + DynamicSparseMatrix aux(other); + *this = aux.markAsRValue(); + } + else + { + // evaluate/copy vector per vector + for (Index j=0; j aux(other.innerVector(j)); + m_matrix.const_cast_derived()._data()[m_outerStart+j].swap(aux._data()); + } + } + return *this; + } + + inline SparseInnerVectorSet& operator=(const SparseInnerVectorSet& other) + { + return operator=(other); + } + + Index nonZeros() const + { + Index count = 0; + for (Index j=0; j0); + return m_matrix.data()[m_outerStart].vale(m_matrix.data()[m_outerStart].size()-1); + } + +// template +// inline SparseInnerVectorSet& operator=(const SparseMatrixBase& other) +// { +// return *this; +// } + + EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); } + EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); } + + protected: + + const typename MatrixType::Nested m_matrix; + Index m_outerStart; + const internal::variable_if_dynamic m_outerSize; + +}; + +} // end namespace Eigen + +#endif // EIGEN_SPARSE_BLOCKFORDYNAMICMATRIX_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/CholmodSupportLegacy.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/CholmodSupportLegacy.h deleted file mode 100644 index 676cd8574..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/CholmodSupportLegacy.h +++ /dev/null @@ -1,517 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#ifndef EIGEN_CHOLMODSUPPORT_LEGACY_H -#define EIGEN_CHOLMODSUPPORT_LEGACY_H - -namespace internal { - -template -void cholmod_configure_matrix_legacy(CholmodType& mat) -{ - if (internal::is_same::value) - { - mat.xtype = CHOLMOD_REAL; - mat.dtype = CHOLMOD_SINGLE; - } - else if (internal::is_same::value) - { - mat.xtype = CHOLMOD_REAL; - mat.dtype = CHOLMOD_DOUBLE; - } - else if (internal::is_same >::value) - { - mat.xtype = CHOLMOD_COMPLEX; - mat.dtype = CHOLMOD_SINGLE; - } - else if (internal::is_same >::value) - { - mat.xtype = CHOLMOD_COMPLEX; - mat.dtype = CHOLMOD_DOUBLE; - } - else - { - eigen_assert(false && "Scalar type not supported by CHOLMOD"); - } -} - -template -cholmod_sparse cholmod_map_eigen_to_sparse(_MatrixType& mat) -{ - typedef typename _MatrixType::Scalar Scalar; - cholmod_sparse res; - res.nzmax = mat.nonZeros(); - res.nrow = mat.rows();; - res.ncol = mat.cols(); - res.p = mat._outerIndexPtr(); - res.i = mat._innerIndexPtr(); - res.x = mat._valuePtr(); - res.xtype = CHOLMOD_REAL; - res.itype = CHOLMOD_INT; - res.sorted = 1; - res.packed = 1; - res.dtype = 0; - res.stype = -1; - - internal::cholmod_configure_matrix_legacy(res); - - - if (_MatrixType::Flags & SelfAdjoint) - { - if (_MatrixType::Flags & Upper) - res.stype = 1; - else if (_MatrixType::Flags & Lower) - res.stype = -1; - else - res.stype = 0; - } - else - res.stype = -1; // by default we consider the lower part - - return res; -} - -template -cholmod_dense cholmod_map_eigen_to_dense(MatrixBase& mat) -{ - EIGEN_STATIC_ASSERT((internal::traits::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); - typedef typename Derived::Scalar Scalar; - - cholmod_dense res; - res.nrow = mat.rows(); - res.ncol = mat.cols(); - res.nzmax = res.nrow * res.ncol; - res.d = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride(); - res.x = mat.derived().data(); - res.z = 0; - - internal::cholmod_configure_matrix_legacy(res); - - return res; -} - -template -MappedSparseMatrix map_cholmod_sparse_to_eigen(cholmod_sparse& cm) -{ - return MappedSparseMatrix - (cm.nrow, cm.ncol, reinterpret_cast(cm.p)[cm.ncol], - reinterpret_cast(cm.p), reinterpret_cast(cm.i),reinterpret_cast(cm.x) ); -} - -} // namespace internal - -template -class SparseLLT<_MatrixType, Cholmod> : public SparseLLT<_MatrixType> -{ - protected: - typedef SparseLLT<_MatrixType> Base; - typedef typename Base::Scalar Scalar; - typedef typename Base::RealScalar RealScalar; - typedef typename Base::CholMatrixType CholMatrixType; - using Base::MatrixLIsDirty; - using Base::SupernodalFactorIsDirty; - using Base::m_flags; - using Base::m_matrix; - using Base::m_status; - - public: - typedef _MatrixType MatrixType; - typedef typename MatrixType::Index Index; - - SparseLLT(int flags = 0) - : Base(flags), m_cholmodFactor(0) - { - cholmod_start(&m_cholmod); - } - - SparseLLT(const MatrixType& matrix, int flags = 0) - : Base(flags), m_cholmodFactor(0) - { - cholmod_start(&m_cholmod); - compute(matrix); - } - - ~SparseLLT() - { - if (m_cholmodFactor) - cholmod_free_factor(&m_cholmodFactor, &m_cholmod); - cholmod_finish(&m_cholmod); - } - - inline const CholMatrixType& matrixL() const; - - template - bool solveInPlace(MatrixBase &b) const; - - template - inline const internal::solve_retval, Rhs> - solve(const MatrixBase& b) const - { - eigen_assert(true && "SparseLLT is not initialized."); - return internal::solve_retval, Rhs>(*this, b.derived()); - } - - void compute(const MatrixType& matrix); - - inline Index cols() const { return m_matrix.cols(); } - inline Index rows() const { return m_matrix.rows(); } - - inline const cholmod_factor* cholmodFactor() const - { return m_cholmodFactor; } - - inline cholmod_common* cholmodCommon() const - { return &m_cholmod; } - - bool succeeded() const; - - protected: - mutable cholmod_common m_cholmod; - cholmod_factor* m_cholmodFactor; -}; - - -namespace internal { - -template - struct solve_retval, Rhs> - : solve_retval_base, Rhs> -{ - typedef SparseLLT<_MatrixType, Cholmod> SpLLTDecType; - EIGEN_MAKE_SOLVE_HELPERS(SpLLTDecType,Rhs) - - template void evalTo(Dest& dst) const - { - //Index size = dec().cholmodFactor()->n; - eigen_assert((Index)dec().cholmodFactor()->n==rhs().rows()); - - cholmod_factor* cholmodFactor = const_cast(dec().cholmodFactor()); - cholmod_common* cholmodCommon = const_cast(dec().cholmodCommon()); - // this uses Eigen's triangular sparse solver - // if (m_status & MatrixLIsDirty) - // matrixL(); - // Base::solveInPlace(b); - // as long as our own triangular sparse solver is not fully optimal, - // let's use CHOLMOD's one: - cholmod_dense cdb = internal::cholmod_map_eigen_to_dense(rhs().const_cast_derived()); - cholmod_dense* x = cholmod_solve(CHOLMOD_A, cholmodFactor, &cdb, cholmodCommon); - - dst = Matrix::Map(reinterpret_cast(x->x), rhs().rows()); - - cholmod_free_dense(&x, cholmodCommon); - - } - -}; - -} // namespace internal - - - -template -void SparseLLT<_MatrixType,Cholmod>::compute(const _MatrixType& a) -{ - if (m_cholmodFactor) - { - cholmod_free_factor(&m_cholmodFactor, &m_cholmod); - m_cholmodFactor = 0; - } - - cholmod_sparse A = internal::cholmod_map_eigen_to_sparse(const_cast<_MatrixType&>(a)); -// m_cholmod.supernodal = CHOLMOD_AUTO; - // TODO -// if (m_flags&IncompleteFactorization) -// { -// m_cholmod.nmethods = 1; -// m_cholmod.method[0].ordering = CHOLMOD_NATURAL; -// m_cholmod.postorder = 0; -// } -// else -// { -// m_cholmod.nmethods = 1; -// m_cholmod.method[0].ordering = CHOLMOD_NATURAL; -// m_cholmod.postorder = 0; -// } -// m_cholmod.final_ll = 1; - m_cholmodFactor = cholmod_analyze(&A, &m_cholmod); - cholmod_factorize(&A, m_cholmodFactor, &m_cholmod); - - this->m_status = (this->m_status & ~Base::SupernodalFactorIsDirty) | Base::MatrixLIsDirty; -} - - -// TODO -template -bool SparseLLT<_MatrixType,Cholmod>::succeeded() const -{ return true; } - - - -template -inline const typename SparseLLT<_MatrixType,Cholmod>::CholMatrixType& -SparseLLT<_MatrixType,Cholmod>::matrixL() const -{ - if (this->m_status & Base::MatrixLIsDirty) - { - eigen_assert(!(this->m_status & Base::SupernodalFactorIsDirty)); - - cholmod_sparse* cmRes = cholmod_factor_to_sparse(m_cholmodFactor, &m_cholmod); - const_cast(this->m_matrix) = - internal::map_cholmod_sparse_to_eigen(*cmRes); - free(cmRes); - - this->m_status = (this->m_status & ~Base::MatrixLIsDirty); - } - return this->m_matrix; -} - - - - -template -template -bool SparseLLT<_MatrixType,Cholmod>::solveInPlace(MatrixBase &b) const -{ - //Index size = m_cholmodFactor->n; - eigen_assert((Index)m_cholmodFactor->n==b.rows()); - - // this uses Eigen's triangular sparse solver - // if (m_status & MatrixLIsDirty) - // matrixL(); - // Base::solveInPlace(b); - // as long as our own triangular sparse solver is not fully optimal, - // let's use CHOLMOD's one: - cholmod_dense cdb = internal::cholmod_map_eigen_to_dense(b); - - cholmod_dense* x = cholmod_solve(CHOLMOD_A, m_cholmodFactor, &cdb, &m_cholmod); - eigen_assert(x && "Eigen: cholmod_solve failed."); - - b = Matrix::Map(reinterpret_cast(x->x),b.rows()); - cholmod_free_dense(&x, &m_cholmod); - return true; -} - - - - - - - - - - - -template -class SparseLDLT<_MatrixType,Cholmod> : public SparseLDLT<_MatrixType> -{ - protected: - typedef SparseLDLT<_MatrixType> Base; - typedef typename Base::Scalar Scalar; - typedef typename Base::RealScalar RealScalar; - using Base::MatrixLIsDirty; - using Base::SupernodalFactorIsDirty; - using Base::m_flags; - using Base::m_matrix; - using Base::m_status; - - public: - typedef _MatrixType MatrixType; - typedef typename MatrixType::Index Index; - - SparseLDLT(int flags = 0) - : Base(flags), m_cholmodFactor(0) - { - cholmod_start(&m_cholmod); - } - - SparseLDLT(const _MatrixType& matrix, int flags = 0) - : Base(flags), m_cholmodFactor(0) - { - cholmod_start(&m_cholmod); - compute(matrix); - } - - ~SparseLDLT() - { - if (m_cholmodFactor) - cholmod_free_factor(&m_cholmodFactor, &m_cholmod); - cholmod_finish(&m_cholmod); - } - - inline const typename Base::CholMatrixType& matrixL(void) const; - - template - void solveInPlace(MatrixBase &b) const; - - template - inline const internal::solve_retval, Rhs> - solve(const MatrixBase& b) const - { - eigen_assert(true && "SparseLDLT is not initialized."); - return internal::solve_retval, Rhs>(*this, b.derived()); - } - - void compute(const _MatrixType& matrix); - - inline Index cols() const { return m_matrix.cols(); } - inline Index rows() const { return m_matrix.rows(); } - - inline const cholmod_factor* cholmodFactor() const - { return m_cholmodFactor; } - - inline cholmod_common* cholmodCommon() const - { return &m_cholmod; } - - bool succeeded() const; - - protected: - mutable cholmod_common m_cholmod; - cholmod_factor* m_cholmodFactor; -}; - - - -namespace internal { - -template - struct solve_retval, Rhs> - : solve_retval_base, Rhs> -{ - typedef SparseLDLT<_MatrixType, Cholmod> SpLDLTDecType; - EIGEN_MAKE_SOLVE_HELPERS(SpLDLTDecType,Rhs) - - template void evalTo(Dest& dst) const - { - //Index size = dec().cholmodFactor()->n; - eigen_assert((Index)dec().cholmodFactor()->n==rhs().rows()); - - cholmod_factor* cholmodFactor = const_cast(dec().cholmodFactor()); - cholmod_common* cholmodCommon = const_cast(dec().cholmodCommon()); - // this uses Eigen's triangular sparse solver - // if (m_status & MatrixLIsDirty) - // matrixL(); - // Base::solveInPlace(b); - // as long as our own triangular sparse solver is not fully optimal, - // let's use CHOLMOD's one: - cholmod_dense cdb = internal::cholmod_map_eigen_to_dense(rhs().const_cast_derived()); - cholmod_dense* x = cholmod_solve(CHOLMOD_LDLt, cholmodFactor, &cdb, cholmodCommon); - - dst = Matrix::Map(reinterpret_cast(x->x), rhs().rows()); - cholmod_free_dense(&x, cholmodCommon); - - } - -}; - - -} // namespace internal - -template -void SparseLDLT<_MatrixType,Cholmod>::compute(const _MatrixType& a) -{ - if (m_cholmodFactor) - { - cholmod_free_factor(&m_cholmodFactor, &m_cholmod); - m_cholmodFactor = 0; - } - - cholmod_sparse A = internal::cholmod_map_eigen_to_sparse(const_cast<_MatrixType&>(a)); - - //m_cholmod.supernodal = CHOLMOD_AUTO; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - //m_cholmod.supernodal = CHOLMOD_SUPERNODAL; - // TODO - if (this->m_flags & IncompleteFactorization) - { - m_cholmod.nmethods = 1; - //m_cholmod.method[0].ordering = CHOLMOD_NATURAL; - m_cholmod.method[0].ordering = CHOLMOD_COLAMD; - m_cholmod.postorder = 1; - } - else - { - m_cholmod.nmethods = 1; - m_cholmod.method[0].ordering = CHOLMOD_NATURAL; - m_cholmod.postorder = 0; - } - m_cholmod.final_ll = 0; - m_cholmodFactor = cholmod_analyze(&A, &m_cholmod); - cholmod_factorize(&A, m_cholmodFactor, &m_cholmod); - - this->m_status = (this->m_status & ~Base::SupernodalFactorIsDirty) | Base::MatrixLIsDirty; -} - - -// TODO -template -bool SparseLDLT<_MatrixType,Cholmod>::succeeded() const -{ return true; } - - -template -inline const typename SparseLDLT<_MatrixType>::CholMatrixType& -SparseLDLT<_MatrixType,Cholmod>::matrixL() const -{ - if (this->m_status & Base::MatrixLIsDirty) - { - eigen_assert(!(this->m_status & Base::SupernodalFactorIsDirty)); - - cholmod_sparse* cmRes = cholmod_factor_to_sparse(m_cholmodFactor, &m_cholmod); - const_cast(this->m_matrix) = MappedSparseMatrix(*cmRes); - free(cmRes); - - this->m_status = (this->m_status & ~Base::MatrixLIsDirty); - } - return this->m_matrix; -} - - - - - - -template -template -void SparseLDLT<_MatrixType,Cholmod>::solveInPlace(MatrixBase &b) const -{ - //Index size = m_cholmodFactor->n; - eigen_assert((Index)m_cholmodFactor->n == b.rows()); - - // this uses Eigen's triangular sparse solver - // if (m_status & MatrixLIsDirty) - // matrixL(); - // Base::solveInPlace(b); - // as long as our own triangular sparse solver is not fully optimal, - // let's use CHOLMOD's one: - cholmod_dense cdb = internal::cholmod_map_eigen_to_dense(b); - cholmod_dense* x = cholmod_solve(CHOLMOD_A, m_cholmodFactor, &cdb, &m_cholmod); - b = Matrix::Map(reinterpret_cast(x->x),b.rows()); - cholmod_free_dense(&x, &m_cholmod); -} - - - - - - -#endif // EIGEN_CHOLMODSUPPORT_LEGACY_H diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Sparse/DynamicSparseMatrix.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h similarity index 87% rename from gtsam/3rdparty/Eigen/Eigen/src/Sparse/DynamicSparseMatrix.h rename to gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h index 93e75f4c6..151d46538 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Sparse/DynamicSparseMatrix.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h @@ -25,7 +25,11 @@ #ifndef EIGEN_DYNAMIC_SPARSEMATRIX_H #define EIGEN_DYNAMIC_SPARSEMATRIX_H -/** \class DynamicSparseMatrix +namespace Eigen { + +/** \deprecated use a SparseMatrix in an uncompressed mode + * + * \class DynamicSparseMatrix * * \brief A sparse matrix class designed for matrix assembly purpose * @@ -64,7 +68,7 @@ struct traits > } template -class DynamicSparseMatrix + class DynamicSparseMatrix : public SparseMatrixBase > { public: @@ -84,7 +88,7 @@ class DynamicSparseMatrix typedef DynamicSparseMatrix TransposedSparseMatrix; Index m_innerSize; - std::vector > m_data; + std::vector > m_data; public: @@ -94,8 +98,8 @@ class DynamicSparseMatrix inline Index outerSize() const { return static_cast(m_data.size()); } inline Index innerNonZeros(Index j) const { return m_data[j].size(); } - std::vector >& _data() { return m_data; } - const std::vector >& _data() const { return m_data; } + std::vector >& _data() { return m_data; } + const std::vector >& _data() const { return m_data; } /** \returns the coefficient value at given position \a row, \a col * This operation involes a log(rho*outer_size) binary search. @@ -119,6 +123,7 @@ class DynamicSparseMatrix } class InnerIterator; + class ReverseInnerIterator; void setZero() { @@ -232,20 +237,23 @@ class DynamicSparseMatrix } } - inline DynamicSparseMatrix() + /** The class DynamicSparseMatrix is deprectaed */ + EIGEN_DEPRECATED inline DynamicSparseMatrix() : m_innerSize(0), m_data(0) { eigen_assert(innerSize()==0 && outerSize()==0); } - inline DynamicSparseMatrix(Index rows, Index cols) + /** The class DynamicSparseMatrix is deprectaed */ + EIGEN_DEPRECATED inline DynamicSparseMatrix(Index rows, Index cols) : m_innerSize(0) { resize(rows, cols); } + /** The class DynamicSparseMatrix is deprectaed */ template - explicit inline DynamicSparseMatrix(const SparseMatrixBase& other) + EIGEN_DEPRECATED explicit inline DynamicSparseMatrix(const SparseMatrixBase& other) : m_innerSize(0) { Base::operator=(other.derived()); @@ -325,12 +333,12 @@ class DynamicSparseMatrix # ifdef EIGEN_DYNAMICSPARSEMATRIX_PLUGIN # include EIGEN_DYNAMICSPARSEMATRIX_PLUGIN # endif -}; + }; template -class DynamicSparseMatrix::InnerIterator : public SparseVector::InnerIterator +class DynamicSparseMatrix::InnerIterator : public SparseVector::InnerIterator { - typedef typename SparseVector::InnerIterator Base; + typedef typename SparseVector::InnerIterator Base; public: InnerIterator(const DynamicSparseMatrix& mat, Index outer) : Base(mat.m_data[outer]), m_outer(outer) @@ -343,4 +351,22 @@ class DynamicSparseMatrix::InnerIterator : public Sparse const Index m_outer; }; +template +class DynamicSparseMatrix::ReverseInnerIterator : public SparseVector::ReverseInnerIterator +{ + typedef typename SparseVector::ReverseInnerIterator Base; + public: + ReverseInnerIterator(const DynamicSparseMatrix& mat, Index outer) + : Base(mat.m_data[outer]), m_outer(outer) + {} + + inline Index row() const { return IsRowMajor ? m_outer : Base::index(); } + inline Index col() const { return IsRowMajor ? Base::index() : m_outer; } + + protected: + const Index m_outer; +}; + +} // end namespace Eigen + #endif // EIGEN_DYNAMIC_SPARSEMATRIX_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MarketIO.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MarketIO.h new file mode 100644 index 000000000..9cfe1d9f5 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MarketIO.h @@ -0,0 +1,288 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// Copyright (C) 2012 Desire NUENTSA WAKAM +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_SPARSE_MARKET_IO_H +#define EIGEN_SPARSE_MARKET_IO_H + +#include + +namespace Eigen { + +namespace internal +{ + template + inline bool GetMarketLine (std::stringstream& line, int& M, int& N, int& i, int& j, Scalar& value) + { + line >> i >> j >> value; + i--; + j--; + if(i>=0 && j>=0 && i + inline bool GetMarketLine (std::stringstream& line, int& M, int& N, int& i, int& j, std::complex& value) + { + Scalar valR, valI; + line >> i >> j >> valR >> valI; + i--; + j--; + if(i>=0 && j>=0 && i(valR, valI); + return true; + } + else + return false; + } + + template + inline void GetVectorElt (const std::string& line, RealScalar& val) + { + std::istringstream newline(line); + newline >> val; + } + + template + inline void GetVectorElt (const std::string& line, std::complex& val) + { + RealScalar valR, valI; + std::istringstream newline(line); + newline >> valR >> valI; + val = std::complex(valR, valI); + } + + template + inline void putMarketHeader(std::string& header,int sym) + { + header= "%%MatrixMarket matrix coordinate "; + if(internal::is_same >::value || internal::is_same >::value) + { + header += " complex"; + if(sym == Symmetric) header += " symmetric"; + else if (sym == SelfAdjoint) header += " Hermitian"; + else header += " general"; + } + else + { + header += " real"; + if(sym == Symmetric) header += " symmetric"; + else header += " general"; + } + } + + template + inline void PutMatrixElt(Scalar value, int row, int col, std::ofstream& out) + { + out << row << " "<< col << " " << value << "\n"; + } + template + inline void PutMatrixElt(std::complex value, int row, int col, std::ofstream& out) + { + out << row << " " << col << " " << value.real() << " " << value.imag() << "\n"; + } + + + template + inline void putVectorElt(Scalar value, std::ofstream& out) + { + out << value << "\n"; + } + template + inline void putVectorElt(std::complex value, std::ofstream& out) + { + out << value.real << " " << value.imag()<< "\n"; + } + +} // end namepsace internal + +inline bool getMarketHeader(const std::string& filename, int& sym, bool& iscomplex, bool& isvector) +{ + sym = 0; + isvector = false; + std::ifstream in(filename.c_str(),std::ios::in); + if(!in) + return false; + + std::string line; + // The matrix header is always the first line in the file + std::getline(in, line); assert(in.good()); + + std::stringstream fmtline(line); + std::string substr[5]; + fmtline>> substr[0] >> substr[1] >> substr[2] >> substr[3] >> substr[4]; + if(substr[2].compare("array") == 0) isvector = true; + if(substr[3].compare("complex") == 0) iscomplex = true; + if(substr[4].compare("symmetric") == 0) sym = Symmetric; + else if (substr[4].compare("Hermitian") == 0) sym = SelfAdjoint; + + return true; +} + +template +bool loadMarket(SparseMatrixType& mat, const std::string& filename) +{ + typedef typename SparseMatrixType::Scalar Scalar; + std::ifstream input(filename.c_str(),std::ios::in); + if(!input) + return false; + + const int maxBuffersize = 2048; + char buffer[maxBuffersize]; + + bool readsizes = false; + + typedef Triplet T; + std::vector elements; + + int M(-1), N(-1), NNZ(-1); + int count = 0; + while(input.getline(buffer, maxBuffersize)) + { + // skip comments + //NOTE An appropriate test should be done on the header to get the symmetry + if(buffer[0]=='%') + continue; + + std::stringstream line(buffer); + + if(!readsizes) + { + line >> M >> N >> NNZ; + if(M > 0 && N > 0 && NNZ > 0) + { + readsizes = true; + std::cout << "sizes: " << M << "," << N << "," << NNZ << "\n"; + mat.resize(M,N); + mat.reserve(NNZ); + } + } + else + { + int i(-1), j(-1); + Scalar value; + if( internal::GetMarketLine(line, M, N, i, j, value) ) + { + ++ count; + elements.push_back(T(i,j,value)); + } + else + std::cerr << "Invalid read: " << i << "," << j << "\n"; + } + } + mat.setFromTriplets(elements.begin(), elements.end()); + if(count!=NNZ) + std::cerr << count << "!=" << NNZ << "\n"; + + input.close(); + return true; +} + +template +bool loadMarketVector(VectorType& vec, const std::string& filename) +{ + typedef typename VectorType::Scalar Scalar; + std::ifstream in(filename.c_str(), std::ios::in); + if(!in) + return false; + + std::string line; + int n(0), col(0); + do + { // Skip comments + std::getline(in, line); assert(in.good()); + } while (line[0] == '%'); + std::istringstream newline(line); + newline >> n >> col; + assert(n>0 && col>0); + vec.resize(n); + int i = 0; + Scalar value; + while ( std::getline(in, line) && (i < n) ){ + internal::GetVectorElt(line, value); + vec(i++) = value; + } + in.close(); + if (i!=n){ + std::cerr<< "Unable to read all elements from file " << filename << "\n"; + return false; + } + return true; +} + +template +bool saveMarket(const SparseMatrixType& mat, const std::string& filename, int sym = 0) +{ + typedef typename SparseMatrixType::Scalar Scalar; + std::ofstream out(filename.c_str(),std::ios::out); + if(!out) + return false; + + out.flags(std::ios_base::scientific); + out.precision(64); + std::string header; + internal::putMarketHeader(header, sym); + out << header << std::endl; + out << mat.rows() << " " << mat.cols() << " " << mat.nonZeros() << "\n"; + int count = 0; + for(int j=0; j +bool saveMarketVector (const VectorType& vec, const std::string& filename) +{ + typedef typename VectorType::Scalar Scalar; + std::ofstream out(filename.c_str(),std::ios::out); + if(!out) + return false; + + out.flags(std::ios_base::scientific); + out.precision(64); + if(internal::is_same >::value || internal::is_same >::value) + out << "%%MatrixMarket matrix array complex general\n"; + else + out << "%%MatrixMarket matrix array real general\n"; + out << vec.size() << " "<< 1 << "\n"; + for (int i=0; i < vec.size(); i++){ + internal::putVectorElt(vec(i), out); + } + out.close(); + return true; +} + +} // end namespace Eigen + +#endif // EIGEN_SPARSE_MARKET_IO_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h new file mode 100644 index 000000000..3c34effca --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h @@ -0,0 +1,236 @@ + +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2012 Desire NUENTSA WAKAM +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_BROWSE_MATRICES_H +#define EIGEN_BROWSE_MATRICES_H + +namespace Eigen { + +enum { + SPD = 0x100, + NonSymmetric = 0x0 +}; + +/** + * @brief Iterator to browse matrices from a specified folder + * + * This is used to load all the matrices from a folder. + * The matrices should be in Matrix Market format + * It is assumed that the matrices are named as matname.mtx + * and matname_SPD.mtx if the matrix is Symmetric and positive definite (or Hermitian) + * The right hand side vectors are loaded as well, if they exist. + * They should be named as matname_b.mtx. + * Note that the right hand side for a SPD matrix is named as matname_SPD_b.mtx + * + * Sometimes a reference solution is available. In this case, it should be named as matname_x.mtx + * + * Sample code + * \code + * + * \endcode + * + * \tparam Scalar The scalar type + */ +template +class MatrixMarketIterator +{ + public: + typedef Matrix VectorType; + typedef SparseMatrix MatrixType; + + public: + MatrixMarketIterator(const std::string folder):m_sym(0),m_isvalid(false),m_matIsLoaded(false),m_hasRhs(false),m_hasrefX(false),m_folder(folder) + { + m_folder_id = opendir(folder.c_str()); + if (!m_folder_id){ + m_isvalid = false; + std::cerr << "The provided Matrix folder could not be opened \n\n"; + abort(); + } + Getnextvalidmatrix(); + } + + ~MatrixMarketIterator() + { + if (m_folder_id) closedir(m_folder_id); + } + + inline MatrixMarketIterator& operator++() + { + m_matIsLoaded = false; + m_hasrefX = false; + m_hasRhs = false; + Getnextvalidmatrix(); + return *this; + } + inline operator bool() const { return m_isvalid;} + + /** Return the sparse matrix corresponding to the current file */ + inline MatrixType& matrix() + { + // Read the matrix + if (m_matIsLoaded) return m_mat; + + std::string matrix_file = m_folder + "/" + m_matname + ".mtx"; + if ( !loadMarket(m_mat, matrix_file)) + { + m_matIsLoaded = false; + return m_mat; + } + m_matIsLoaded = true; + + if (m_sym != NonSymmetric) + { // Store the upper part of the matrix. It is needed by the solvers dealing with nonsymmetric matrices ?? + MatrixType B; + B = m_mat; + m_mat = B.template selfadjointView(); + } + return m_mat; + } + + /** Return the right hand side corresponding to the current matrix. + * If the rhs file is not provided, a random rhs is generated + */ + inline VectorType& rhs() + { + // Get the right hand side + if (m_hasRhs) return m_rhs; + + std::string rhs_file; + rhs_file = m_folder + "/" + m_matname + "_b.mtx"; // The pattern is matname_b.mtx + m_hasRhs = Fileexists(rhs_file); + if (m_hasRhs) + { + m_rhs.resize(m_mat.cols()); + m_hasRhs = loadMarketVector(m_rhs, rhs_file); + } + if (!m_hasRhs) + { + // Generate a random right hand side + if (!m_matIsLoaded) this->matrix(); + m_refX.resize(m_mat.cols()); + m_refX.setRandom(); + m_rhs = m_mat * m_refX; + m_hasrefX = true; + m_hasRhs = true; + } + return m_rhs; + } + + /** Return a reference solution + * If it is not provided and if the right hand side is not available + * then refX is randomly generated such that A*refX = b + * where A and b are the matrix and the rhs. + * Note that when a rhs is provided, refX is not available + */ + inline VectorType& refX() + { + // Check if a reference solution is provided + if (m_hasrefX) return m_refX; + + std::string lhs_file; + lhs_file = m_folder + "/" + m_matname + "_x.mtx"; + m_hasrefX = Fileexists(lhs_file); + if (m_hasrefX) + { + m_refX.resize(m_mat.cols()); + m_hasrefX = loadMarketVector(m_refX, lhs_file); + } + return m_refX; + } + + inline std::string& matname() { return m_matname; } + + inline int sym() { return m_sym; } + + inline bool hasRhs() {return m_hasRhs; } + inline bool hasrefX() {return m_hasrefX; } + + protected: + + inline bool Fileexists(std::string file) + { + std::ifstream file_id(file.c_str()); + if (!file_id.good() ) + { + return false; + } + else + { + file_id.close(); + return true; + } + } + + void Getnextvalidmatrix( ) + { + m_isvalid = false; + // Here, we return with the next valid matrix in the folder + while ( (m_curs_id = readdir(m_folder_id)) != NULL) { + m_isvalid = false; + std::string curfile; + curfile = m_folder + "/" + m_curs_id->d_name; + // Discard if it is a folder + if (m_curs_id->d_type == DT_DIR) continue; //FIXME This may not be available on non BSD systems +// struct stat st_buf; +// stat (curfile.c_str(), &st_buf); +// if (S_ISDIR(st_buf.st_mode)) continue; + + // Determine from the header if it is a matrix or a right hand side + bool isvector,iscomplex; + if(!getMarketHeader(curfile,m_sym,iscomplex,isvector)) continue; + if(isvector) continue; + + // Get the matrix name + std::string filename = m_curs_id->d_name; + m_matname = filename.substr(0, filename.length()-4); + + // Find if the matrix is SPD + size_t found = m_matname.find("SPD"); + if( (found!=std::string::npos) && (m_sym != NonSymmetric) ) + m_sym = SPD; + + m_isvalid = true; + break; + } + } + int m_sym; // Symmetry of the matrix + MatrixType m_mat; // Current matrix + VectorType m_rhs; // Current vector + VectorType m_refX; // The reference solution, if exists + std::string m_matname; // Matrix Name + bool m_isvalid; + bool m_matIsLoaded; // Determine if the matrix has already been loaded from the file + bool m_hasRhs; // The right hand side exists + bool m_hasrefX; // A reference solution is provided + std::string m_folder; + DIR * m_folder_id; + struct dirent *m_curs_id; + +}; + +} // end namespace Eigen + +#endif diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/RandomSetter.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/RandomSetter.h index 4ea41af85..9328c60cf 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/RandomSetter.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/RandomSetter.h @@ -25,6 +25,8 @@ #ifndef EIGEN_RANDOMSETTER_H #define EIGEN_RANDOMSETTER_H +namespace Eigen { + /** Represents a std::map * * \see RandomSetter @@ -180,9 +182,7 @@ class RandomSetter enum { SwapStorage = 1 - MapTraits::IsSorted, TargetRowMajor = (SparseMatrixType::Flags & RowMajorBit) ? 1 : 0, - SetterRowMajor = SwapStorage ? 1-TargetRowMajor : TargetRowMajor, - IsUpper = SparseMatrixType::Flags & Upper, - IsLower = SparseMatrixType::Flags & Lower + SetterRowMajor = SwapStorage ? 1-TargetRowMajor : TargetRowMajor }; public: @@ -227,6 +227,7 @@ class RandomSetter if (!SwapStorage) // also means the map is sorted { mp_target->setZero(); + mp_target->makeCompressed(); mp_target->reserve(nonZeros()); Index prevOuter = -1; for (Index k=0; kouterSize(); ++j) { Index tmp = positions[j]; - mp_target->_outerIndexPtr()[j] = count; + mp_target->outerIndexPtr()[j] = count; positions[j] = count; count += tmp; } - mp_target->_outerIndexPtr()[mp_target->outerSize()] = count; + mp_target->makeCompressed(); + mp_target->outerIndexPtr()[mp_target->outerSize()] = count; mp_target->resizeNonZeros(count); // pass 2 for (Index k=0; k_outerIndexPtr()[outer]; + Index posStart = mp_target->outerIndexPtr()[outer]; Index i = (positions[outer]++) - 1; - while ( (i >= posStart) && (mp_target->_innerIndexPtr()[i] > inner) ) + while ( (i >= posStart) && (mp_target->innerIndexPtr()[i] > inner) ) { - mp_target->_valuePtr()[i+1] = mp_target->_valuePtr()[i]; - mp_target->_innerIndexPtr()[i+1] = mp_target->_innerIndexPtr()[i]; + mp_target->valuePtr()[i+1] = mp_target->valuePtr()[i]; + mp_target->innerIndexPtr()[i+1] = mp_target->innerIndexPtr()[i]; --i; } - mp_target->_innerIndexPtr()[i+1] = inner; - mp_target->_valuePtr()[i+1] = it->second.value; + mp_target->innerIndexPtr()[i+1] = inner; + mp_target->valuePtr()[i+1] = it->second.value; } } } @@ -305,8 +307,6 @@ class RandomSetter /** \returns a reference to the coefficient at given coordinates \a row, \a col */ Scalar& operator() (Index row, Index col) { - eigen_assert(((!IsUpper) || (row<=col)) && "Invalid access to an upper triangular matrix"); - eigen_assert(((!IsLower) || (col<=row)) && "Invalid access to an upper triangular matrix"); const Index outer = SetterRowMajor ? row : col; const Index inner = SetterRowMajor ? col : row; const Index outerMajor = outer >> OuterPacketBits; // index of the packet/map @@ -337,4 +337,6 @@ class RandomSetter unsigned char m_keyBitsOffset; }; +} // end namespace Eigen + #endif // EIGEN_RANDOMSETTER_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SimplicialCholesky.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SimplicialCholesky.h deleted file mode 100644 index 6af6407c7..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SimplicialCholesky.h +++ /dev/null @@ -1,477 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -/* - -NOTE: the _symbolic, and _numeric functions has been adapted from - the LDL library: - -LDL Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. - -LDL License: - - Your use or distribution of LDL or any modified version of - LDL implies that you agree to this License. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 - USA - - Permission is hereby granted to use or copy this program under the - terms of the GNU LGPL, provided that the Copyright, this License, - and the Availability of the original version is retained on all copies. - User documentation of any code that uses this code or any modified - version of this code must cite the Copyright, this License, the - Availability note, and "Used by permission." Permission to modify - the code and to distribute modified code is granted, provided the - Copyright, this License, and the Availability note are retained, - and a notice that the code was modified is included. - */ - -#ifndef EIGEN_SIMPLICIAL_CHOLESKY_H -#define EIGEN_SIMPLICIAL_CHOLESKY_H - -enum SimplicialCholeskyMode { - SimplicialCholeskyLLt, - SimplicialCholeskyLDLt -}; - -/** \brief A direct sparse Cholesky factorization - * - * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization. - * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - */ -template -class SimplicialCholesky -{ - public: - typedef _MatrixType MatrixType; - enum { UpLo = _UpLo }; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef typename MatrixType::Index Index; - typedef SparseMatrix CholMatrixType; - typedef Matrix VectorType; - - public: - - SimplicialCholesky() - : m_info(Success), m_isInitialized(false), m_LDLt(true) - {} - - SimplicialCholesky(const MatrixType& matrix) - : m_info(Success), m_isInitialized(false), m_LDLt(true) - { - compute(matrix); - } - - ~SimplicialCholesky() - { - } - - inline Index cols() const { return m_matrix.cols(); } - inline Index rows() const { return m_matrix.rows(); } - - SimplicialCholesky& setMode(SimplicialCholeskyMode mode) - { - switch(mode) - { - case SimplicialCholeskyLLt: - m_LDLt = false; - break; - case SimplicialCholeskyLDLt: - m_LDLt = true; - break; - default: - break; - } - - return *this; - } - - /** \brief Reports whether previous computation was successful. - * - * \returns \c Success if computation was succesful, - * \c NumericalIssue if the matrix.appears to be negative. - */ - ComputationInfo info() const - { - eigen_assert(m_isInitialized && "Decomposition is not initialized."); - return m_info; - } - - /** Computes the sparse Cholesky decomposition of \a matrix */ - SimplicialCholesky& compute(const MatrixType& matrix) - { - analyzePattern(matrix); - factorize(matrix); - return *this; - } - - /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A. - * - * \sa compute() - */ - template - inline const internal::solve_retval - solve(const MatrixBase& b) const - { - eigen_assert(m_isInitialized && "SimplicialCholesky is not initialized."); - eigen_assert(rows()==b.rows() - && "SimplicialCholesky::solve(): invalid number of rows of the right hand side matrix b"); - return internal::solve_retval(*this, b.derived()); - } - - /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A. - * - * \sa compute() - */ -// template -// inline const internal::sparse_solve_retval -// solve(const SparseMatrixBase& b) const -// { -// eigen_assert(m_isInitialized && "SimplicialCholesky is not initialized."); -// eigen_assert(rows()==b.rows() -// && "SimplicialCholesky::solve(): invalid number of rows of the right hand side matrix b"); -// return internal::sparse_solve_retval(*this, b.derived()); -// } - - /** Performs a symbolic decomposition on the sparcity of \a matrix. - * - * This function is particularly useful when solving for several problems having the same structure. - * - * \sa factorize() - */ - void analyzePattern(const MatrixType& a); - - - /** Performs a numeric decomposition of \a matrix - * - * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed. - * - * \sa analyzePattern() - */ - void factorize(const MatrixType& a); - - /** \returns the permutation P - * \sa permutationPinv() */ - const PermutationMatrix& permutationP() const - { return m_P; } - - /** \returns the inverse P^-1 of the permutation P - * \sa permutationP() */ - const PermutationMatrix& permutationPinv() const - { return m_Pinv; } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal */ - template - void _solve(const MatrixBase &b, MatrixBase &dest) const - { - eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()"); - eigen_assert(m_matrix.rows()==b.rows()); - - if(m_info!=Success) - return; - - if(m_P.size()>0) - dest = m_Pinv * b; - else - dest = b; - - if(m_LDLt) - { - if(m_matrix.nonZeros()>0) // otherwise L==I - m_matrix.template triangularView().solveInPlace(dest); - - dest = m_diag.asDiagonal().inverse() * dest; - - if (m_matrix.nonZeros()>0) // otherwise L==I - m_matrix.adjoint().template triangularView().solveInPlace(dest); - } - else - { - if(m_matrix.nonZeros()>0) // otherwise L==I - m_matrix.template triangularView().solveInPlace(dest); - - if (m_matrix.nonZeros()>0) // otherwise L==I - m_matrix.adjoint().template triangularView().solveInPlace(dest); - } - - if(m_P.size()>0) - dest = m_P * dest; - } - - /** \internal */ - /* - template - void _solve(const SparseMatrix &b, SparseMatrix &dest) const - { - // TODO - } - */ - #endif // EIGEN_PARSED_BY_DOXYGEN - - template - void dumpMemory(Stream& s) - { - int total = 0; - s << " L: " << ((total+=(m_matrix.cols()+1) * sizeof(int) + m_matrix.nonZeros()*(sizeof(int)+sizeof(Scalar))) >> 20) << "Mb" << "\n"; - s << " diag: " << ((total+=m_diag.size() * sizeof(Scalar)) >> 20) << "Mb" << "\n"; - s << " tree: " << ((total+=m_parent.size() * sizeof(int)) >> 20) << "Mb" << "\n"; - s << " nonzeros: " << ((total+=m_nonZerosPerCol.size() * sizeof(int)) >> 20) << "Mb" << "\n"; - s << " perm: " << ((total+=m_P.size() * sizeof(int)) >> 20) << "Mb" << "\n"; - s << " perm^-1: " << ((total+=m_Pinv.size() * sizeof(int)) >> 20) << "Mb" << "\n"; - s << " TOTAL: " << (total>> 20) << "Mb" << "\n"; - } - - protected: - /** keeps off-diagonal entries; drops diagonal entries */ - struct keep_diag { - inline bool operator() (const Index& row, const Index& col, const Scalar&) const - { - return row!=col; - } - }; - - mutable ComputationInfo m_info; - bool m_isInitialized; - bool m_factorizationIsOk; - bool m_analysisIsOk; - bool m_LDLt; - - CholMatrixType m_matrix; - VectorType m_diag; // the diagonal coefficients in case of a LDLt decomposition - VectorXi m_parent; // elimination tree - VectorXi m_nonZerosPerCol; - PermutationMatrix m_P; // the permutation - PermutationMatrix m_Pinv; // the inverse permutation -}; - -template -void SimplicialCholesky<_MatrixType,_UpLo>::analyzePattern(const MatrixType& a) -{ - eigen_assert(a.rows()==a.cols()); - const Index size = a.rows(); - m_matrix.resize(size, size); - m_parent.resize(size); - m_nonZerosPerCol.resize(size); - - ei_declare_aligned_stack_constructed_variable(Index, tags, size, 0); - - // TODO allows to configure the permutation - { - CholMatrixType C; - C = a.template selfadjointView(); - // remove diagonal entries: - C.prune(keep_diag()); - internal::minimum_degree_ordering(C, m_P); - } - - if(m_P.size()>0) - m_Pinv = m_P.inverse(); - else - m_Pinv.resize(0); - - SparseMatrix ap(size,size); - ap.template selfadjointView() = a.template selfadjointView().twistedBy(m_Pinv); - - for(Index k = 0; k < size; ++k) - { - /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */ - m_parent[k] = -1; /* parent of k is not yet known */ - tags[k] = k; /* mark node k as visited */ - m_nonZerosPerCol[k] = 0; /* count of nonzeros in column k of L */ - for(typename CholMatrixType::InnerIterator it(ap,k); it; ++it) - { - Index i = it.index(); - if(i < k) - { - /* follow path from i to root of etree, stop at flagged node */ - for(; tags[i] != k; i = m_parent[i]) - { - /* find parent of i if not yet determined */ - if (m_parent[i] == -1) - m_parent[i] = k; - m_nonZerosPerCol[i]++; /* L (k,i) is nonzero */ - tags[i] = k; /* mark i as visited */ - } - } - } - } - - /* construct Lp index array from m_nonZerosPerCol column counts */ - Index* Lp = m_matrix._outerIndexPtr(); - Lp[0] = 0; - for(Index k = 0; k < size; ++k) - Lp[k+1] = Lp[k] + m_nonZerosPerCol[k] + (m_LDLt ? 0 : 1); - - m_matrix.resizeNonZeros(Lp[size]); - - m_isInitialized = true; - m_info = Success; - m_analysisIsOk = true; - m_factorizationIsOk = false; -} - - -template -void SimplicialCholesky<_MatrixType,_UpLo>::factorize(const MatrixType& a) -{ - eigen_assert(m_analysisIsOk && "You must first call analyzePattern()"); - eigen_assert(a.rows()==a.cols()); - const Index size = a.rows(); - eigen_assert(m_parent.size()==size); - eigen_assert(m_nonZerosPerCol.size()==size); - - const Index* Lp = m_matrix._outerIndexPtr(); - Index* Li = m_matrix._innerIndexPtr(); - Scalar* Lx = m_matrix._valuePtr(); - - ei_declare_aligned_stack_constructed_variable(Scalar, y, size, 0); - ei_declare_aligned_stack_constructed_variable(Index, pattern, size, 0); - ei_declare_aligned_stack_constructed_variable(Index, tags, size, 0); - - SparseMatrix ap(size,size); - ap.template selfadjointView() = a.template selfadjointView().twistedBy(m_Pinv); - - bool ok = true; - m_diag.resize(m_LDLt ? size : 0); - - for(Index k = 0; k < size; ++k) - { - // compute nonzero pattern of kth row of L, in topological order - y[k] = 0.0; // Y(0:k) is now all zero - Index top = size; // stack for pattern is empty - tags[k] = k; // mark node k as visited - m_nonZerosPerCol[k] = 0; // count of nonzeros in column k of L - for(typename MatrixType::InnerIterator it(ap,k); it; ++it) - { - Index i = it.index(); - if(i <= k) - { - y[i] += internal::conj(it.value()); /* scatter A(i,k) into Y (sum duplicates) */ - Index len; - for(len = 0; tags[i] != k; i = m_parent[i]) - { - pattern[len++] = i; /* L(k,i) is nonzero */ - tags[i] = k; /* mark i as visited */ - } - while(len > 0) - pattern[--top] = pattern[--len]; - } - } - - /* compute numerical values kth row of L (a sparse triangular solve) */ - Scalar d = y[k]; // get D(k,k) and clear Y(k) - y[k] = 0.0; - for(; top < size; ++top) - { - Index i = pattern[top]; /* pattern[top:n-1] is pattern of L(:,k) */ - Scalar yi = y[i]; /* get and clear Y(i) */ - y[i] = 0.0; - - /* the nonzero entry L(k,i) */ - Scalar l_ki; - if(m_LDLt) - l_ki = yi / m_diag[i]; - else - yi = l_ki = yi / Lx[Lp[i]]; - - Index p2 = Lp[i] + m_nonZerosPerCol[i]; - Index p; - for(p = Lp[i] + (m_LDLt ? 0 : 1); p < p2; ++p) - y[Li[p]] -= internal::conj(Lx[p]) * yi; - d -= l_ki * internal::conj(yi); - Li[p] = k; /* store L(k,i) in column form of L */ - Lx[p] = l_ki; - ++m_nonZerosPerCol[i]; /* increment count of nonzeros in col i */ - } - if(m_LDLt) - m_diag[k] = d; - else - { - Index p = Lp[k]+m_nonZerosPerCol[k]++; - Li[p] = k ; /* store L(k,k) = sqrt (d) in column k */ - Lx[p] = internal::sqrt(d) ; - } - if(d == Scalar(0)) - { - ok = false; /* failure, D(k,k) is zero */ - break; - } - } - - m_info = ok ? Success : NumericalIssue; - m_factorizationIsOk = true; -} - -namespace internal { - -template -struct solve_retval, Rhs> - : solve_retval_base, Rhs> -{ - typedef SimplicialCholesky<_MatrixType,_UpLo> Dec; - EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs) - - template void evalTo(Dest& dst) const - { - dec()._solve(rhs(),dst); - } -}; - -template -struct sparse_solve_retval, Rhs> - : sparse_solve_retval_base, Rhs> -{ - typedef SimplicialCholesky<_MatrixType,_UpLo> Dec; - EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs) - - template void evalTo(Dest& dst) const - { - dec()._solve(rhs(),dst); - } -}; - -} - -#endif // EIGEN_SIMPLICIAL_CHOLESKY_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLDLTLegacy.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLDLTLegacy.h deleted file mode 100644 index 14283c117..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLDLTLegacy.h +++ /dev/null @@ -1,414 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -/* - -NOTE: the _symbolic, and _numeric functions has been adapted from - the LDL library: - -LDL Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. - -LDL License: - - Your use or distribution of LDL or any modified version of - LDL implies that you agree to this License. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 - USA - - Permission is hereby granted to use or copy this program under the - terms of the GNU LGPL, provided that the Copyright, this License, - and the Availability of the original version is retained on all copies. - User documentation of any code that uses this code or any modified - version of this code must cite the Copyright, this License, the - Availability note, and "Used by permission." Permission to modify - the code and to distribute modified code is granted, provided the - Copyright, this License, and the Availability note are retained, - and a notice that the code was modified is included. - */ - -#ifndef EIGEN_SPARSELDLT_LEGACY_H -#define EIGEN_SPARSELDLT_LEGACY_H - -/** \ingroup Sparse_Module - * - * \class SparseLDLT - * - * \brief LDLT Cholesky decomposition of a sparse matrix and associated features - * - * \param MatrixType the type of the matrix of which we are computing the LDLT Cholesky decomposition - * - * \warning the upper triangular part has to be specified. The rest of the matrix is not used. The input matrix must be column major. - * - * \sa class LDLT, class LDLT - */ -template -class SparseLDLT -{ - protected: - typedef typename _MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - typedef Matrix VectorType; - - enum { - SupernodalFactorIsDirty = 0x10000, - MatrixLIsDirty = 0x20000 - }; - - public: - typedef SparseMatrix CholMatrixType; - typedef _MatrixType MatrixType; - typedef typename MatrixType::Index Index; - - - /** Creates a dummy LDLT factorization object with flags \a flags. */ - SparseLDLT(int flags = 0) - : m_flags(flags), m_status(0) - { - eigen_assert((MatrixType::Flags&RowMajorBit)==0); - m_precision = RealScalar(0.1) * Eigen::NumTraits::dummy_precision(); - } - - /** Creates a LDLT object and compute the respective factorization of \a matrix using - * flags \a flags. */ - SparseLDLT(const MatrixType& matrix, int flags = 0) - : m_matrix(matrix.rows(), matrix.cols()), m_flags(flags), m_status(0) - { - eigen_assert((MatrixType::Flags&RowMajorBit)==0); - m_precision = RealScalar(0.1) * Eigen::NumTraits::dummy_precision(); - compute(matrix); - } - - /** Sets the relative threshold value used to prune zero coefficients during the decomposition. - * - * Setting a value greater than zero speeds up computation, and yields to an imcomplete - * factorization with fewer non zero coefficients. Such approximate factors are especially - * useful to initialize an iterative solver. - * - * \warning if precision is greater that zero, the LDLT factorization is not guaranteed to succeed - * even if the matrix is positive definite. - * - * Note that the exact meaning of this parameter might depends on the actual - * backend. Moreover, not all backends support this feature. - * - * \sa precision() */ - void setPrecision(RealScalar v) { m_precision = v; } - - /** \returns the current precision. - * - * \sa setPrecision() */ - RealScalar precision() const { return m_precision; } - - /** Sets the flags. Possible values are: - * - CompleteFactorization - * - IncompleteFactorization - * - MemoryEfficient (hint to use the memory most efficient method offered by the backend) - * - SupernodalMultifrontal (implies a complete factorization if supported by the backend, - * overloads the MemoryEfficient flags) - * - SupernodalLeftLooking (implies a complete factorization if supported by the backend, - * overloads the MemoryEfficient flags) - * - * \sa flags() */ - void settags(int f) { m_flags = f; } - /** \returns the current flags */ - int flags() const { return m_flags; } - - /** Computes/re-computes the LDLT factorization */ - void compute(const MatrixType& matrix); - - /** Perform a symbolic factorization */ - void _symbolic(const MatrixType& matrix); - /** Perform the actual factorization using the previously - * computed symbolic factorization */ - bool _numeric(const MatrixType& matrix); - - /** \returns the lower triangular matrix L */ - inline const CholMatrixType& matrixL(void) const { return m_matrix; } - - /** \returns the coefficients of the diagonal matrix D */ - inline VectorType vectorD(void) const { return m_diag; } - - template - bool solveInPlace(MatrixBase &b) const; - - template - inline const internal::solve_retval, Rhs> - solve(const MatrixBase& b) const - { - eigen_assert(true && "SparseLDLT is not initialized."); - return internal::solve_retval, Rhs>(*this, b.derived()); - } - - inline Index cols() const { return m_matrix.cols(); } - inline Index rows() const { return m_matrix.rows(); } - - inline const VectorType& diag() const { return m_diag; } - - /** \returns true if the factorization succeeded */ - inline bool succeeded(void) const { return m_succeeded; } - - protected: - CholMatrixType m_matrix; - VectorType m_diag; - VectorXi m_parent; // elimination tree - VectorXi m_nonZerosPerCol; -// VectorXi m_w; // workspace - PermutationMatrix m_P; - PermutationMatrix m_Pinv; - RealScalar m_precision; - int m_flags; - mutable int m_status; - bool m_succeeded; -}; - -namespace internal { - -template -struct solve_retval, Rhs> - : solve_retval_base, Rhs> -{ - typedef SparseLDLT<_MatrixType> SpLDLTDecType; - EIGEN_MAKE_SOLVE_HELPERS(SpLDLTDecType,Rhs) - - template void evalTo(Dest& dst) const - { - //Index size = dec().matrixL().rows(); - eigen_assert(dec().matrixL().rows()==rhs().rows()); - - Rhs b(rhs().rows(), rhs().cols()); - b = rhs(); - - if (dec().matrixL().nonZeros()>0) // otherwise L==I - dec().matrixL().template triangularView().solveInPlace(b); - - b = b.cwiseQuotient(dec().diag()); - if (dec().matrixL().nonZeros()>0) // otherwise L==I - dec().matrixL().adjoint().template triangularView().solveInPlace(b); - - dst = b; - - } - -}; - -} // end namespace internal - -/** Computes / recomputes the LDLT decomposition of matrix \a a - * using the default algorithm. - */ -template -void SparseLDLT<_MatrixType,Backend>::compute(const _MatrixType& a) -{ - _symbolic(a); - m_succeeded = _numeric(a); -} - -template -void SparseLDLT<_MatrixType,Backend>::_symbolic(const _MatrixType& a) -{ - assert(a.rows()==a.cols()); - const Index size = a.rows(); - m_matrix.resize(size, size); - m_parent.resize(size); - m_nonZerosPerCol.resize(size); - - ei_declare_aligned_stack_constructed_variable(Index, tags, size, 0); - - const Index* Ap = a._outerIndexPtr(); - const Index* Ai = a._innerIndexPtr(); - Index* Lp = m_matrix._outerIndexPtr(); - - const Index* P = 0; - Index* Pinv = 0; - - if(P) - { - m_P.indices() = VectorXi::Map(P,size); - m_Pinv = m_P.inverse(); - Pinv = m_Pinv.indices().data(); - } - else - { - m_P.resize(0); - m_Pinv.resize(0); - } - - for (Index k = 0; k < size; ++k) - { - /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */ - m_parent[k] = -1; /* parent of k is not yet known */ - tags[k] = k; /* mark node k as visited */ - m_nonZerosPerCol[k] = 0; /* count of nonzeros in column k of L */ - Index kk = P ? P[k] : k; /* kth original, or permuted, column */ - Index p2 = Ap[kk+1]; - for (Index p = Ap[kk]; p < p2; ++p) - { - /* A (i,k) is nonzero (original or permuted A) */ - Index i = Pinv ? Pinv[Ai[p]] : Ai[p]; - if (i < k) - { - /* follow path from i to root of etree, stop at flagged node */ - for (; tags[i] != k; i = m_parent[i]) - { - /* find parent of i if not yet determined */ - if (m_parent[i] == -1) - m_parent[i] = k; - ++m_nonZerosPerCol[i]; /* L (k,i) is nonzero */ - tags[i] = k; /* mark i as visited */ - } - } - } - } - /* construct Lp index array from m_nonZerosPerCol column counts */ - Lp[0] = 0; - for (Index k = 0; k < size; ++k) - Lp[k+1] = Lp[k] + m_nonZerosPerCol[k]; - - m_matrix.resizeNonZeros(Lp[size]); -} - -template -bool SparseLDLT<_MatrixType,Backend>::_numeric(const _MatrixType& a) -{ - assert(a.rows()==a.cols()); - const Index size = a.rows(); - assert(m_parent.size()==size); - assert(m_nonZerosPerCol.size()==size); - - const Index* Ap = a._outerIndexPtr(); - const Index* Ai = a._innerIndexPtr(); - const Scalar* Ax = a._valuePtr(); - const Index* Lp = m_matrix._outerIndexPtr(); - Index* Li = m_matrix._innerIndexPtr(); - Scalar* Lx = m_matrix._valuePtr(); - m_diag.resize(size); - - ei_declare_aligned_stack_constructed_variable(Scalar, y, size, 0); - ei_declare_aligned_stack_constructed_variable(Index, pattern, size, 0); - ei_declare_aligned_stack_constructed_variable(Index, tags, size, 0); - - Index* P = 0; - Index* Pinv = 0; - - if(m_P.size()==size) - { - P = m_P.indices().data(); - Pinv = m_Pinv.indices().data(); - } - - bool ok = true; - - for (Index k = 0; k < size; ++k) - { - /* compute nonzero pattern of kth row of L, in topological order */ - y[k] = 0.0; /* Y(0:k) is now all zero */ - Index top = size; /* stack for pattern is empty */ - tags[k] = k; /* mark node k as visited */ - m_nonZerosPerCol[k] = 0; /* count of nonzeros in column k of L */ - Index kk = (P) ? (P[k]) : (k); /* kth original, or permuted, column */ - Index p2 = Ap[kk+1]; - for (Index p = Ap[kk]; p < p2; ++p) - { - Index i = Pinv ? Pinv[Ai[p]] : Ai[p]; /* get A(i,k) */ - if (i <= k) - { - y[i] += internal::conj(Ax[p]); /* scatter A(i,k) into Y (sum duplicates) */ - Index len; - for (len = 0; tags[i] != k; i = m_parent[i]) - { - pattern[len++] = i; /* L(k,i) is nonzero */ - tags[i] = k; /* mark i as visited */ - } - while (len > 0) - pattern[--top] = pattern[--len]; - } - } - - /* compute numerical values kth row of L (a sparse triangular solve) */ - m_diag[k] = y[k]; /* get D(k,k) and clear Y(k) */ - y[k] = 0.0; - for (; top < size; ++top) - { - Index i = pattern[top]; /* pattern[top:n-1] is pattern of L(:,k) */ - Scalar yi = (y[i]); /* get and clear Y(i) */ - y[i] = 0.0; - Index p2 = Lp[i] + m_nonZerosPerCol[i]; - Index p; - for (p = Lp[i]; p < p2; ++p) - y[Li[p]] -= internal::conj(Lx[p]) * (yi); - Scalar l_ki = yi / m_diag[i]; /* the nonzero entry L(k,i) */ - m_diag[k] -= l_ki * internal::conj(yi); - Li[p] = k; /* store L(k,i) in column form of L */ - Lx[p] = (l_ki); - ++m_nonZerosPerCol[i]; /* increment count of nonzeros in col i */ - } - if (m_diag[k] == 0.0) - { - ok = false; /* failure, D(k,k) is zero */ - break; - } - } - - return ok; /* success, diagonal of D is all nonzero */ -} - -/** Computes b = L^-T D^-1 L^-1 b */ -template -template -bool SparseLDLT<_MatrixType, Backend>::solveInPlace(MatrixBase &b) const -{ - //Index size = m_matrix.rows(); - eigen_assert(m_matrix.rows()==b.rows()); - if (!m_succeeded) - return false; - - if(m_P.size()>0) - b = m_Pinv * b; - - if (m_matrix.nonZeros()>0) // otherwise L==I - m_matrix.template triangularView().solveInPlace(b); - b = b.cwiseQuotient(m_diag); - if (m_matrix.nonZeros()>0) // otherwise L==I - m_matrix.adjoint().template triangularView().solveInPlace(b); - - if(m_P.size()>0) - b = m_P * b; - - return true; -} - -#endif // EIGEN_SPARSELDLT_LEGACY_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLLT.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLLT.h deleted file mode 100644 index ac042217b..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLLT.h +++ /dev/null @@ -1,245 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#ifndef EIGEN_SPARSELLT_H -#define EIGEN_SPARSELLT_H - -/** \ingroup Sparse_Module - * - * \class SparseLLT - * - * \brief LLT Cholesky decomposition of a sparse matrix and associated features - * - * \param MatrixType the type of the matrix of which we are computing the LLT Cholesky decomposition - * - * \sa class LLT, class LDLT - */ -template -class SparseLLT -{ - protected: - typedef typename _MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - enum { - SupernodalFactorIsDirty = 0x10000, - MatrixLIsDirty = 0x20000 - }; - - public: - typedef SparseMatrix CholMatrixType; - typedef _MatrixType MatrixType; - typedef typename MatrixType::Index Index; - - /** Creates a dummy LLT factorization object with flags \a flags. */ - SparseLLT(int flags = 0) - : m_flags(flags), m_status(0) - { - m_precision = RealScalar(0.1) * Eigen::NumTraits::dummy_precision(); - } - - /** Creates a LLT object and compute the respective factorization of \a matrix using - * flags \a flags. */ - SparseLLT(const MatrixType& matrix, int flags = 0) - : m_matrix(matrix.rows(), matrix.cols()), m_flags(flags), m_status(0) - { - m_precision = RealScalar(0.1) * Eigen::NumTraits::dummy_precision(); - compute(matrix); - } - - /** Sets the relative threshold value used to prune zero coefficients during the decomposition. - * - * Setting a value greater than zero speeds up computation, and yields to an imcomplete - * factorization with fewer non zero coefficients. Such approximate factors are especially - * useful to initialize an iterative solver. - * - * \warning if precision is greater that zero, the LLT factorization is not guaranteed to succeed - * even if the matrix is positive definite. - * - * Note that the exact meaning of this parameter might depends on the actual - * backend. Moreover, not all backends support this feature. - * - * \sa precision() */ - void setPrecision(RealScalar v) { m_precision = v; } - - /** \returns the current precision. - * - * \sa setPrecision() */ - RealScalar precision() const { return m_precision; } - - /** Sets the flags. Possible values are: - * - CompleteFactorization - * - IncompleteFactorization - * - MemoryEfficient (hint to use the memory most efficient method offered by the backend) - * - SupernodalMultifrontal (implies a complete factorization if supported by the backend, - * overloads the MemoryEfficient flags) - * - SupernodalLeftLooking (implies a complete factorization if supported by the backend, - * overloads the MemoryEfficient flags) - * - * \sa flags() */ - void setFlags(int f) { m_flags = f; } - /** \returns the current flags */ - int flags() const { return m_flags; } - - /** Computes/re-computes the LLT factorization */ - void compute(const MatrixType& matrix); - - /** \returns the lower triangular matrix L */ - inline const CholMatrixType& matrixL(void) const { return m_matrix; } - - template - bool solveInPlace(MatrixBase &b) const; - - template - inline const internal::solve_retval, Rhs> - solve(const MatrixBase& b) const - { - eigen_assert(true && "SparseLLT is not initialized."); - return internal::solve_retval, Rhs>(*this, b.derived()); - } - - inline Index cols() const { return m_matrix.cols(); } - inline Index rows() const { return m_matrix.rows(); } - - /** \returns true if the factorization succeeded */ - inline bool succeeded(void) const { return m_succeeded; } - - protected: - CholMatrixType m_matrix; - RealScalar m_precision; - int m_flags; - mutable int m_status; - bool m_succeeded; -}; - - -namespace internal { - -template -struct solve_retval, Rhs> - : solve_retval_base, Rhs> -{ - typedef SparseLLT<_MatrixType> SpLLTDecType; - EIGEN_MAKE_SOLVE_HELPERS(SpLLTDecType,Rhs) - - template void evalTo(Dest& dst) const - { - const Index size = dec().matrixL().rows(); - eigen_assert(size==rhs().rows()); - - Rhs b(rhs().rows(), rhs().cols()); - b = rhs(); - - dec().matrixL().template triangularView().solveInPlace(b); - dec().matrixL().adjoint().template triangularView().solveInPlace(b); - - dst = b; - - } - -}; - -} // end namespace internal - - -/** Computes / recomputes the LLT decomposition of matrix \a a - * using the default algorithm. - */ -template -void SparseLLT<_MatrixType,Backend>::compute(const _MatrixType& a) -{ - assert(a.rows()==a.cols()); - const Index size = a.rows(); - m_matrix.resize(size, size); - - // allocate a temporary vector for accumulations - AmbiVector tempVector(size); - RealScalar density = a.nonZeros()/RealScalar(size*size); - - // TODO estimate the number of non zeros - m_matrix.setZero(); - m_matrix.reserve(a.nonZeros()*2); - for (Index j = 0; j < size; ++j) - { - Scalar x = internal::real(a.coeff(j,j)); - - // TODO better estimate of the density ! - tempVector.init(density>0.001? IsDense : IsSparse); - tempVector.setBounds(j+1,size); - tempVector.setZero(); - // init with current matrix a - { - typename _MatrixType::InnerIterator it(a,j); - eigen_assert(it.index()==j && - "matrix must has non zero diagonal entries and only the lower triangular part must be stored"); - ++it; // skip diagonal element - for (; it; ++it) - tempVector.coeffRef(it.index()) = it.value(); - } - for (Index k=0; k::Iterator it(tempVector, m_precision*rx); it; ++it) - { - // FIXME use insertBack - m_matrix.insert(it.index(), j) = it.value() * y; - } - } - m_matrix.finalize(); -} - -/** Computes b = L^-T L^-1 b */ -template -template -bool SparseLLT<_MatrixType, Backend>::solveInPlace(MatrixBase &b) const -{ - const Index size = m_matrix.rows(); - eigen_assert(size==b.rows()); - - m_matrix.template triangularView().solveInPlace(b); - m_matrix.adjoint().template triangularView().solveInPlace(b); - - return true; -} - -#endif // EIGEN_SPARSELLT_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLU.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLU.h deleted file mode 100644 index 3d10dbbee..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLU.h +++ /dev/null @@ -1,163 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#ifndef EIGEN_SPARSELU_H -#define EIGEN_SPARSELU_H - -enum { - SvNoTrans = 0, - SvTranspose = 1, - SvAdjoint = 2 -}; - -/** \ingroup Sparse_Module - * - * \class SparseLU - * - * \brief LU decomposition of a sparse matrix and associated features - * - * \param _MatrixType the type of the matrix of which we are computing the LU factorization - * - * \sa class FullPivLU, class SparseLLT - */ -template -class SparseLU - { - protected: - typedef typename _MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef SparseMatrix LUMatrixType; - - enum { - MatrixLUIsDirty = 0x10000 - }; - - public: - typedef _MatrixType MatrixType; - - /** Creates a dummy LU factorization object with flags \a flags. */ - SparseLU(int flags = 0) - : m_flags(flags), m_status(0) - { - m_precision = RealScalar(0.1) * Eigen::NumTraits::dummy_precision(); - } - - /** Creates a LU object and compute the respective factorization of \a matrix using - * flags \a flags. */ - SparseLU(const _MatrixType& matrix, int flags = 0) - : /*m_matrix(matrix.rows(), matrix.cols()),*/ m_flags(flags), m_status(0) - { - m_precision = RealScalar(0.1) * Eigen::NumTraits::dummy_precision(); - compute(matrix); - } - - /** Sets the relative threshold value used to prune zero coefficients during the decomposition. - * - * Setting a value greater than zero speeds up computation, and yields to an imcomplete - * factorization with fewer non zero coefficients. Such approximate factors are especially - * useful to initialize an iterative solver. - * - * Note that the exact meaning of this parameter might depends on the actual - * backend. Moreover, not all backends support this feature. - * - * \sa precision() */ - void setPrecision(RealScalar v) { m_precision = v; } - - /** \returns the current precision. - * - * \sa setPrecision() */ - RealScalar precision() const { return m_precision; } - - /** Sets the flags. Possible values are: - * - CompleteFactorization - * - IncompleteFactorization - * - MemoryEfficient - * - one of the ordering methods - * - etc... - * - * \sa flags() */ - void setFlags(int f) { m_flags = f; } - /** \returns the current flags */ - int flags() const { return m_flags; } - - void setOrderingMethod(int m) - { - eigen_assert( (m&~OrderingMask) == 0 && m!=0 && "invalid ordering method"); - m_flags = m_flags&~OrderingMask | m&OrderingMask; - } - - int orderingMethod() const - { - return m_flags&OrderingMask; - } - - /** Computes/re-computes the LU factorization */ - void compute(const _MatrixType& matrix); - - /** \returns the lower triangular matrix L */ - //inline const _MatrixType& matrixL() const { return m_matrixL; } - - /** \returns the upper triangular matrix U */ - //inline const _MatrixType& matrixU() const { return m_matrixU; } - - template - bool solve(const MatrixBase &b, MatrixBase* x, - const int transposed = SvNoTrans) const; - - /** \returns true if the factorization succeeded */ - inline bool succeeded(void) const { return m_succeeded; } - - protected: - RealScalar m_precision; - int m_flags; - mutable int m_status; - bool m_succeeded; -}; - -/** Computes / recomputes the LU decomposition of matrix \a a - * using the default algorithm. - */ -template -void SparseLU<_MatrixType,Backend>::compute(const _MatrixType& ) -{ - eigen_assert(false && "not implemented yet"); -} - -/** Computes *x = U^-1 L^-1 b - * - * If \a transpose is set to SvTranspose or SvAdjoint, the solution - * of the transposed/adjoint system is computed instead. - * - * Not all backends implement the solution of the transposed or - * adjoint system. - */ -template -template -bool SparseLU<_MatrixType,Backend>::solve(const MatrixBase &, MatrixBase* , const int ) const -{ - eigen_assert(false && "not implemented yet"); - return false; -} - -#endif // EIGEN_SPARSELU_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SuperLUSupport.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SuperLUSupport.h deleted file mode 100644 index bb7312190..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SuperLUSupport.h +++ /dev/null @@ -1,667 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#ifndef EIGEN_SUPERLUSUPPORT_H -#define EIGEN_SUPERLUSUPPORT_H - -#define DECL_GSSVX(PREFIX,FLOATTYPE,KEYTYPE) \ - extern "C" { \ - typedef struct { FLOATTYPE for_lu; FLOATTYPE total_needed; int expansions; } PREFIX##mem_usage_t; \ - extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, \ - char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *, \ - void *, int, SuperMatrix *, SuperMatrix *, \ - FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, \ - PREFIX##mem_usage_t *, SuperLUStat_t *, int *); \ - } \ - inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A, \ - int *perm_c, int *perm_r, int *etree, char *equed, \ - FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, \ - SuperMatrix *U, void *work, int lwork, \ - SuperMatrix *B, SuperMatrix *X, \ - FLOATTYPE *recip_pivot_growth, \ - FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr, \ - SuperLUStat_t *stats, int *info, KEYTYPE) { \ - PREFIX##mem_usage_t mem_usage; \ - PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L, \ - U, work, lwork, B, X, recip_pivot_growth, rcond, \ - ferr, berr, &mem_usage, stats, info); \ - return mem_usage.for_lu; /* bytes used by the factor storage */ \ - } - -DECL_GSSVX(s,float,float) -DECL_GSSVX(c,float,std::complex) -DECL_GSSVX(d,double,double) -DECL_GSSVX(z,double,std::complex) - -#ifdef MILU_ALPHA -#define EIGEN_SUPERLU_HAS_ILU -#endif - -#ifdef EIGEN_SUPERLU_HAS_ILU - -// similarly for the incomplete factorization using gsisx -#define DECL_GSISX(PREFIX,FLOATTYPE,KEYTYPE) \ - extern "C" { \ - extern void PREFIX##gsisx(superlu_options_t *, SuperMatrix *, int *, int *, int *, \ - char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *, \ - void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *, FLOATTYPE *, \ - PREFIX##mem_usage_t *, SuperLUStat_t *, int *); \ - } \ - inline float SuperLU_gsisx(superlu_options_t *options, SuperMatrix *A, \ - int *perm_c, int *perm_r, int *etree, char *equed, \ - FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, \ - SuperMatrix *U, void *work, int lwork, \ - SuperMatrix *B, SuperMatrix *X, \ - FLOATTYPE *recip_pivot_growth, \ - FLOATTYPE *rcond, \ - SuperLUStat_t *stats, int *info, KEYTYPE) { \ - PREFIX##mem_usage_t mem_usage; \ - PREFIX##gsisx(options, A, perm_c, perm_r, etree, equed, R, C, L, \ - U, work, lwork, B, X, recip_pivot_growth, rcond, \ - &mem_usage, stats, info); \ - return mem_usage.for_lu; /* bytes used by the factor storage */ \ - } - -DECL_GSISX(s,float,float) -DECL_GSISX(c,float,std::complex) -DECL_GSISX(d,double,double) -DECL_GSISX(z,double,std::complex) - -#endif - -template -struct SluMatrixMapHelper; - -/** \internal - * - * A wrapper class for SuperLU matrices. It supports only compressed sparse matrices - * and dense matrices. Supernodal and other fancy format are not supported by this wrapper. - * - * This wrapper class mainly aims to avoids the need of dynamic allocation of the storage structure. - */ -struct SluMatrix : SuperMatrix -{ - SluMatrix() - { - Store = &storage; - } - - SluMatrix(const SluMatrix& other) - : SuperMatrix(other) - { - Store = &storage; - storage = other.storage; - } - - SluMatrix& operator=(const SluMatrix& other) - { - SuperMatrix::operator=(static_cast(other)); - Store = &storage; - storage = other.storage; - return *this; - } - - struct - { - union {int nnz;int lda;}; - void *values; - int *innerInd; - int *outerInd; - } storage; - - void setStorageType(Stype_t t) - { - Stype = t; - if (t==SLU_NC || t==SLU_NR || t==SLU_DN) - Store = &storage; - else - { - eigen_assert(false && "storage type not supported"); - Store = 0; - } - } - - template - void setScalarType() - { - if (internal::is_same::value) - Dtype = SLU_S; - else if (internal::is_same::value) - Dtype = SLU_D; - else if (internal::is_same >::value) - Dtype = SLU_C; - else if (internal::is_same >::value) - Dtype = SLU_Z; - else - { - eigen_assert(false && "Scalar type not supported by SuperLU"); - } - } - - template - static SluMatrix Map(Matrix& mat) - { - typedef Matrix MatrixType; - eigen_assert( ((Options&RowMajor)!=RowMajor) && "row-major dense matrices is not supported by SuperLU"); - SluMatrix res; - res.setStorageType(SLU_DN); - res.setScalarType(); - res.Mtype = SLU_GE; - - res.nrow = mat.rows(); - res.ncol = mat.cols(); - - res.storage.lda = MatrixType::IsVectorAtCompileTime ? mat.size() : mat.outerStride(); - res.storage.values = mat.data(); - return res; - } - - template - static SluMatrix Map(SparseMatrixBase& mat) - { - SluMatrix res; - if ((MatrixType::Flags&RowMajorBit)==RowMajorBit) - { - res.setStorageType(SLU_NR); - res.nrow = mat.cols(); - res.ncol = mat.rows(); - } - else - { - res.setStorageType(SLU_NC); - res.nrow = mat.rows(); - res.ncol = mat.cols(); - } - - res.Mtype = SLU_GE; - - res.storage.nnz = mat.nonZeros(); - res.storage.values = mat.derived()._valuePtr(); - res.storage.innerInd = mat.derived()._innerIndexPtr(); - res.storage.outerInd = mat.derived()._outerIndexPtr(); - - res.setScalarType(); - - // FIXME the following is not very accurate - if (MatrixType::Flags & Upper) - res.Mtype = SLU_TRU; - if (MatrixType::Flags & Lower) - res.Mtype = SLU_TRL; - if (MatrixType::Flags & SelfAdjoint) - eigen_assert(false && "SelfAdjoint matrix shape not supported by SuperLU"); - return res; - } -}; - -template -struct SluMatrixMapHelper > -{ - typedef Matrix MatrixType; - static void run(MatrixType& mat, SluMatrix& res) - { - eigen_assert( ((Options&RowMajor)!=RowMajor) && "row-major dense matrices is not supported by SuperLU"); - res.setStorageType(SLU_DN); - res.setScalarType(); - res.Mtype = SLU_GE; - - res.nrow = mat.rows(); - res.ncol = mat.cols(); - - res.storage.lda = mat.outerStride(); - res.storage.values = mat.data(); - } -}; - -template -struct SluMatrixMapHelper > -{ - typedef Derived MatrixType; - static void run(MatrixType& mat, SluMatrix& res) - { - if ((MatrixType::Flags&RowMajorBit)==RowMajorBit) - { - res.setStorageType(SLU_NR); - res.nrow = mat.cols(); - res.ncol = mat.rows(); - } - else - { - res.setStorageType(SLU_NC); - res.nrow = mat.rows(); - res.ncol = mat.cols(); - } - - res.Mtype = SLU_GE; - - res.storage.nnz = mat.nonZeros(); - res.storage.values = mat._valuePtr(); - res.storage.innerInd = mat._innerIndexPtr(); - res.storage.outerInd = mat._outerIndexPtr(); - - res.setScalarType(); - - // FIXME the following is not very accurate - if (MatrixType::Flags & Upper) - res.Mtype = SLU_TRU; - if (MatrixType::Flags & Lower) - res.Mtype = SLU_TRL; - if (MatrixType::Flags & SelfAdjoint) - eigen_assert(false && "SelfAdjoint matrix shape not supported by SuperLU"); - } -}; - -namespace internal { - -template -SluMatrix asSluMatrix(MatrixType& mat) -{ - return SluMatrix::Map(mat); -} - -/** View a Super LU matrix as an Eigen expression */ -template -MappedSparseMatrix map_superlu(SluMatrix& sluMat) -{ - eigen_assert((Flags&RowMajor)==RowMajor && sluMat.Stype == SLU_NR - || (Flags&ColMajor)==ColMajor && sluMat.Stype == SLU_NC); - - Index outerSize = (Flags&RowMajor)==RowMajor ? sluMat.ncol : sluMat.nrow; - - return MappedSparseMatrix( - sluMat.nrow, sluMat.ncol, sluMat.storage.outerInd[outerSize], - sluMat.storage.outerInd, sluMat.storage.innerInd, reinterpret_cast(sluMat.storage.values) ); -} - -} // end namespace internal - -template -class SparseLU : public SparseLU -{ - protected: - typedef SparseLU Base; - typedef typename Base::Scalar Scalar; - typedef typename Base::RealScalar RealScalar; - typedef Matrix Vector; - typedef Matrix IntRowVectorType; - typedef Matrix IntColVectorType; - typedef SparseMatrix LMatrixType; - typedef SparseMatrix UMatrixType; - using Base::m_flags; - using Base::m_status; - - public: - - SparseLU(int flags = NaturalOrdering) - : Base(flags) - { - } - - SparseLU(const MatrixType& matrix, int flags = NaturalOrdering) - : Base(flags) - { - compute(matrix); - } - - ~SparseLU() - { - Destroy_SuperNode_Matrix(&m_sluL); - Destroy_CompCol_Matrix(&m_sluU); - } - - inline const LMatrixType& matrixL() const - { - if (m_extractedDataAreDirty) extractData(); - return m_l; - } - - inline const UMatrixType& matrixU() const - { - if (m_extractedDataAreDirty) extractData(); - return m_u; - } - - inline const IntColVectorType& permutationP() const - { - if (m_extractedDataAreDirty) extractData(); - return m_p; - } - - inline const IntRowVectorType& permutationQ() const - { - if (m_extractedDataAreDirty) extractData(); - return m_q; - } - - Scalar determinant() const; - - template - bool solve(const MatrixBase &b, MatrixBase* x, const int transposed = SvNoTrans) const; - - void compute(const MatrixType& matrix); - - protected: - - void extractData() const; - - protected: - // cached data to reduce reallocation, etc. - mutable LMatrixType m_l; - mutable UMatrixType m_u; - mutable IntColVectorType m_p; - mutable IntRowVectorType m_q; - - mutable SparseMatrix m_matrix; - mutable SluMatrix m_sluA; - mutable SuperMatrix m_sluL, m_sluU; - mutable SluMatrix m_sluB, m_sluX; - mutable SuperLUStat_t m_sluStat; - mutable superlu_options_t m_sluOptions; - mutable std::vector m_sluEtree; - mutable std::vector m_sluRscale, m_sluCscale; - mutable std::vector m_sluFerr, m_sluBerr; - mutable char m_sluEqued; - mutable bool m_extractedDataAreDirty; -}; - -template -void SparseLU::compute(const MatrixType& a) -{ - const int size = a.rows(); - m_matrix = a; - - set_default_options(&m_sluOptions); - m_sluOptions.ColPerm = NATURAL; - m_sluOptions.PrintStat = NO; - m_sluOptions.ConditionNumber = NO; - m_sluOptions.Trans = NOTRANS; - // m_sluOptions.Equil = NO; - - switch (Base::orderingMethod()) - { - case NaturalOrdering : m_sluOptions.ColPerm = NATURAL; break; - case MinimumDegree_AT_PLUS_A : m_sluOptions.ColPerm = MMD_AT_PLUS_A; break; - case MinimumDegree_ATA : m_sluOptions.ColPerm = MMD_ATA; break; - case ColApproxMinimumDegree : m_sluOptions.ColPerm = COLAMD; break; - default: - //std::cerr << "Eigen: ordering method \"" << Base::orderingMethod() << "\" not supported by the SuperLU backend\n"; - m_sluOptions.ColPerm = NATURAL; - }; - - m_sluA = internal::asSluMatrix(m_matrix); - memset(&m_sluL,0,sizeof m_sluL); - memset(&m_sluU,0,sizeof m_sluU); - //m_sluEqued = 'B'; - int info = 0; - - m_p.resize(size); - m_q.resize(size); - m_sluRscale.resize(size); - m_sluCscale.resize(size); - m_sluEtree.resize(size); - - RealScalar recip_pivot_gross, rcond; - RealScalar ferr, berr; - - // set empty B and X - m_sluB.setStorageType(SLU_DN); - m_sluB.setScalarType(); - m_sluB.Mtype = SLU_GE; - m_sluB.storage.values = 0; - m_sluB.nrow = m_sluB.ncol = 0; - m_sluB.storage.lda = size; - m_sluX = m_sluB; - - StatInit(&m_sluStat); - if (m_flags&IncompleteFactorization) - { - #ifdef EIGEN_SUPERLU_HAS_ILU - ilu_set_default_options(&m_sluOptions); - - // no attempt to preserve column sum - m_sluOptions.ILU_MILU = SILU; - - // only basic ILU(k) support -- no direct control over memory consumption - // better to use ILU_DropRule = DROP_BASIC | DROP_AREA - // and set ILU_FillFactor to max memory growth - m_sluOptions.ILU_DropRule = DROP_BASIC; - m_sluOptions.ILU_DropTol = Base::m_precision; - - SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0], - &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0], - &m_sluL, &m_sluU, - NULL, 0, - &m_sluB, &m_sluX, - &recip_pivot_gross, &rcond, - &m_sluStat, &info, Scalar()); - #else - //std::cerr << "Incomplete factorization is only available in SuperLU v4\n"; - Base::m_succeeded = false; - return; - #endif - } - else - { - SuperLU_gssvx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0], - &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0], - &m_sluL, &m_sluU, - NULL, 0, - &m_sluB, &m_sluX, - &recip_pivot_gross, &rcond, - &ferr, &berr, - &m_sluStat, &info, Scalar()); - } - StatFree(&m_sluStat); - - m_extractedDataAreDirty = true; - - // FIXME how to better check for errors ??? - Base::m_succeeded = (info == 0); -} - -template -template -bool SparseLU::solve(const MatrixBase &b, - MatrixBase *x, const int transposed) const -{ - const int size = m_matrix.rows(); - const int rhsCols = b.cols(); - eigen_assert(size==b.rows()); - - switch (transposed) { - case SvNoTrans : m_sluOptions.Trans = NOTRANS; break; - case SvTranspose : m_sluOptions.Trans = TRANS; break; - case SvAdjoint : m_sluOptions.Trans = CONJ; break; - default: - //std::cerr << "Eigen: transposition option \"" << transposed << "\" not supported by the SuperLU backend\n"; - m_sluOptions.Trans = NOTRANS; - } - - m_sluOptions.Fact = FACTORED; - m_sluOptions.IterRefine = NOREFINE; - - m_sluFerr.resize(rhsCols); - m_sluBerr.resize(rhsCols); - m_sluB = SluMatrix::Map(b.const_cast_derived()); - m_sluX = SluMatrix::Map(x->derived()); - - StatInit(&m_sluStat); - int info = 0; - RealScalar recip_pivot_gross, rcond; - - if (m_flags&IncompleteFactorization) - { - #ifdef EIGEN_SUPERLU_HAS_ILU - SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0], - &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0], - &m_sluL, &m_sluU, - NULL, 0, - &m_sluB, &m_sluX, - &recip_pivot_gross, &rcond, - &m_sluStat, &info, Scalar()); - #else - //std::cerr << "Incomplete factorization is only available in SuperLU v4\n"; - return false; - #endif - } - else - { - SuperLU_gssvx( - &m_sluOptions, &m_sluA, - m_q.data(), m_p.data(), - &m_sluEtree[0], &m_sluEqued, - &m_sluRscale[0], &m_sluCscale[0], - &m_sluL, &m_sluU, - NULL, 0, - &m_sluB, &m_sluX, - &recip_pivot_gross, &rcond, - &m_sluFerr[0], &m_sluBerr[0], - &m_sluStat, &info, Scalar()); - } - StatFree(&m_sluStat); - - // reset to previous state - m_sluOptions.Trans = NOTRANS; - return info==0; -} - -// -// the code of this extractData() function has been adapted from the SuperLU's Matlab support code, -// -// Copyright (c) 1994 by Xerox Corporation. All rights reserved. -// -// THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY -// EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. -// -template -void SparseLU::extractData() const -{ - if (m_extractedDataAreDirty) - { - int upper; - int fsupc, istart, nsupr; - int lastl = 0, lastu = 0; - SCformat *Lstore = static_cast(m_sluL.Store); - NCformat *Ustore = static_cast(m_sluU.Store); - Scalar *SNptr; - - const int size = m_matrix.rows(); - m_l.resize(size,size); - m_l.resizeNonZeros(Lstore->nnz); - m_u.resize(size,size); - m_u.resizeNonZeros(Ustore->nnz); - - int* Lcol = m_l._outerIndexPtr(); - int* Lrow = m_l._innerIndexPtr(); - Scalar* Lval = m_l._valuePtr(); - - int* Ucol = m_u._outerIndexPtr(); - int* Urow = m_u._innerIndexPtr(); - Scalar* Uval = m_u._valuePtr(); - - Ucol[0] = 0; - Ucol[0] = 0; - - /* for each supernode */ - for (int k = 0; k <= Lstore->nsuper; ++k) - { - fsupc = L_FST_SUPC(k); - istart = L_SUB_START(fsupc); - nsupr = L_SUB_START(fsupc+1) - istart; - upper = 1; - - /* for each column in the supernode */ - for (int j = fsupc; j < L_FST_SUPC(k+1); ++j) - { - SNptr = &((Scalar*)Lstore->nzval)[L_NZ_START(j)]; - - /* Extract U */ - for (int i = U_NZ_START(j); i < U_NZ_START(j+1); ++i) - { - Uval[lastu] = ((Scalar*)Ustore->nzval)[i]; - /* Matlab doesn't like explicit zero. */ - if (Uval[lastu] != 0.0) - Urow[lastu++] = U_SUB(i); - } - for (int i = 0; i < upper; ++i) - { - /* upper triangle in the supernode */ - Uval[lastu] = SNptr[i]; - /* Matlab doesn't like explicit zero. */ - if (Uval[lastu] != 0.0) - Urow[lastu++] = L_SUB(istart+i); - } - Ucol[j+1] = lastu; - - /* Extract L */ - Lval[lastl] = 1.0; /* unit diagonal */ - Lrow[lastl++] = L_SUB(istart + upper - 1); - for (int i = upper; i < nsupr; ++i) - { - Lval[lastl] = SNptr[i]; - /* Matlab doesn't like explicit zero. */ - if (Lval[lastl] != 0.0) - Lrow[lastl++] = L_SUB(istart+i); - } - Lcol[j+1] = lastl; - - ++upper; - } /* for j ... */ - - } /* for k ... */ - - // squeeze the matrices : - m_l.resizeNonZeros(lastl); - m_u.resizeNonZeros(lastu); - - m_extractedDataAreDirty = false; - } -} - -template -typename SparseLU::Scalar SparseLU::determinant() const -{ - assert((!NumTraits::IsComplex) && "This function is not implemented for complex yet"); - if (m_extractedDataAreDirty) - extractData(); - - // TODO this code could be moved to the default/base backend - // FIXME perhaps we have to take into account the scale factors m_sluRscale and m_sluCscale ??? - Scalar det = Scalar(1); - for (int j=0; j 0) - { - int lastId = m_u._outerIndexPtr()[j+1]-1; - eigen_assert(m_u._innerIndexPtr()[lastId]<=j); - if (m_u._innerIndexPtr()[lastId]==j) - { - det *= m_u._valuePtr()[lastId]; - } - } -// std::cout << m_sluRscale[j] << " " << m_sluCscale[j] << " \n"; - } - return det; -} - -#endif // EIGEN_SUPERLUSUPPORT_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/UmfPackSupport.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/UmfPackSupport.h deleted file mode 100644 index beb18f6cd..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/UmfPackSupport.h +++ /dev/null @@ -1,350 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#ifndef EIGEN_UMFPACKSUPPORT_H -#define EIGEN_UMFPACKSUPPORT_H - -/* TODO extract L, extract U, compute det, etc... */ - -// generic double/complex wrapper functions: - -inline void umfpack_free_numeric(void **Numeric, double) -{ umfpack_di_free_numeric(Numeric); } - -inline void umfpack_free_numeric(void **Numeric, std::complex) -{ umfpack_zi_free_numeric(Numeric); } - -inline void umfpack_free_symbolic(void **Symbolic, double) -{ umfpack_di_free_symbolic(Symbolic); } - -inline void umfpack_free_symbolic(void **Symbolic, std::complex) -{ umfpack_zi_free_symbolic(Symbolic); } - -inline int umfpack_symbolic(int n_row,int n_col, - const int Ap[], const int Ai[], const double Ax[], void **Symbolic, - const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) -{ - return umfpack_di_symbolic(n_row,n_col,Ap,Ai,Ax,Symbolic,Control,Info); -} - -inline int umfpack_symbolic(int n_row,int n_col, - const int Ap[], const int Ai[], const std::complex Ax[], void **Symbolic, - const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) -{ - return umfpack_zi_symbolic(n_row,n_col,Ap,Ai,&internal::real_ref(Ax[0]),0,Symbolic,Control,Info); -} - -inline int umfpack_numeric( const int Ap[], const int Ai[], const double Ax[], - void *Symbolic, void **Numeric, - const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO]) -{ - return umfpack_di_numeric(Ap,Ai,Ax,Symbolic,Numeric,Control,Info); -} - -inline int umfpack_numeric( const int Ap[], const int Ai[], const std::complex Ax[], - void *Symbolic, void **Numeric, - const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO]) -{ - return umfpack_zi_numeric(Ap,Ai,&internal::real_ref(Ax[0]),0,Symbolic,Numeric,Control,Info); -} - -inline int umfpack_solve( int sys, const int Ap[], const int Ai[], const double Ax[], - double X[], const double B[], void *Numeric, - const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) -{ - return umfpack_di_solve(sys,Ap,Ai,Ax,X,B,Numeric,Control,Info); -} - -inline int umfpack_solve( int sys, const int Ap[], const int Ai[], const std::complex Ax[], - std::complex X[], const std::complex B[], void *Numeric, - const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) -{ - return umfpack_zi_solve(sys,Ap,Ai,&internal::real_ref(Ax[0]),0,&internal::real_ref(X[0]),0,&internal::real_ref(B[0]),0,Numeric,Control,Info); -} - -inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, double) -{ - return umfpack_di_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric); -} - -inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, std::complex) -{ - return umfpack_zi_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric); -} - -inline int umfpack_get_numeric(int Lp[], int Lj[], double Lx[], int Up[], int Ui[], double Ux[], - int P[], int Q[], double Dx[], int *do_recip, double Rs[], void *Numeric) -{ - return umfpack_di_get_numeric(Lp,Lj,Lx,Up,Ui,Ux,P,Q,Dx,do_recip,Rs,Numeric); -} - -inline int umfpack_get_numeric(int Lp[], int Lj[], std::complex Lx[], int Up[], int Ui[], std::complex Ux[], - int P[], int Q[], std::complex Dx[], int *do_recip, double Rs[], void *Numeric) -{ - double& lx0_real = internal::real_ref(Lx[0]); - double& ux0_real = internal::real_ref(Ux[0]); - double& dx0_real = internal::real_ref(Dx[0]); - return umfpack_zi_get_numeric(Lp,Lj,Lx?&lx0_real:0,0,Up,Ui,Ux?&ux0_real:0,0,P,Q, - Dx?&dx0_real:0,0,do_recip,Rs,Numeric); -} - -inline int umfpack_get_determinant(double *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO]) -{ - return umfpack_di_get_determinant(Mx,Ex,NumericHandle,User_Info); -} - -inline int umfpack_get_determinant(std::complex *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO]) -{ - double& mx_real = internal::real_ref(*Mx); - return umfpack_zi_get_determinant(&mx_real,0,Ex,NumericHandle,User_Info); -} - - -template -class SparseLU<_MatrixType,UmfPack> : public SparseLU<_MatrixType> -{ - protected: - typedef SparseLU<_MatrixType> Base; - typedef typename Base::Scalar Scalar; - typedef typename Base::RealScalar RealScalar; - typedef Matrix Vector; - typedef Matrix IntRowVectorType; - typedef Matrix IntColVectorType; - typedef SparseMatrix LMatrixType; - typedef SparseMatrix UMatrixType; - using Base::m_flags; - using Base::m_status; - - public: - typedef _MatrixType MatrixType; - typedef typename MatrixType::Index Index; - - SparseLU(int flags = NaturalOrdering) - : Base(flags), m_numeric(0) - { - } - - SparseLU(const MatrixType& matrix, int flags = NaturalOrdering) - : Base(flags), m_numeric(0) - { - compute(matrix); - } - - ~SparseLU() - { - if (m_numeric) - umfpack_free_numeric(&m_numeric,Scalar()); - } - - inline const LMatrixType& matrixL() const - { - if (m_extractedDataAreDirty) extractData(); - return m_l; - } - - inline const UMatrixType& matrixU() const - { - if (m_extractedDataAreDirty) extractData(); - return m_u; - } - - inline const IntColVectorType& permutationP() const - { - if (m_extractedDataAreDirty) extractData(); - return m_p; - } - - inline const IntRowVectorType& permutationQ() const - { - if (m_extractedDataAreDirty) extractData(); - return m_q; - } - - Scalar determinant() const; - - template - bool solve(const MatrixBase &b, MatrixBase* x) const; - - template - inline const internal::solve_retval, Rhs> - solve(const MatrixBase& b) const - { - eigen_assert(true && "SparseLU is not initialized."); - return internal::solve_retval, Rhs>(*this, b.derived()); - } - - void compute(const MatrixType& matrix); - - inline Index cols() const { return m_matrixRef->cols(); } - inline Index rows() const { return m_matrixRef->rows(); } - - inline const MatrixType& matrixLU() const - { - //eigen_assert(m_isInitialized && "LU is not initialized."); - return *m_matrixRef; - } - - const void* numeric() const - { - return m_numeric; - } - - protected: - - void extractData() const; - - protected: - // cached data: - void* m_numeric; - const MatrixType* m_matrixRef; - mutable LMatrixType m_l; - mutable UMatrixType m_u; - mutable IntColVectorType m_p; - mutable IntRowVectorType m_q; - mutable bool m_extractedDataAreDirty; -}; - -namespace internal { - -template - struct solve_retval, Rhs> - : solve_retval_base, Rhs> -{ - typedef SparseLU<_MatrixType, UmfPack> SpLUDecType; - EIGEN_MAKE_SOLVE_HELPERS(SpLUDecType,Rhs) - - template void evalTo(Dest& dst) const - { - const int rhsCols = rhs().cols(); - - eigen_assert((Rhs::Flags&RowMajorBit)==0 && "UmfPack backend does not support non col-major rhs yet"); - eigen_assert((Dest::Flags&RowMajorBit)==0 && "UmfPack backend does not support non col-major result yet"); - - void* numeric = const_cast(dec().numeric()); - - EIGEN_UNUSED int errorCode = 0; - for (int j=0; j -void SparseLU::compute(const MatrixType& a) -{ - typedef typename MatrixType::Index Index; - const Index rows = a.rows(); - const Index cols = a.cols(); - eigen_assert((MatrixType::Flags&RowMajorBit)==0 && "Row major matrices are not supported yet"); - - m_matrixRef = &a; - - if (m_numeric) - umfpack_free_numeric(&m_numeric,Scalar()); - - void* symbolic; - int errorCode = 0; - errorCode = umfpack_symbolic(rows, cols, a._outerIndexPtr(), a._innerIndexPtr(), a._valuePtr(), - &symbolic, 0, 0); - if (errorCode==0) - errorCode = umfpack_numeric(a._outerIndexPtr(), a._innerIndexPtr(), a._valuePtr(), - symbolic, &m_numeric, 0, 0); - - umfpack_free_symbolic(&symbolic,Scalar()); - - m_extractedDataAreDirty = true; - - Base::m_succeeded = (errorCode==0); -} - -template -void SparseLU::extractData() const -{ - if (m_extractedDataAreDirty) - { - // get size of the data - int lnz, unz, rows, cols, nz_udiag; - umfpack_get_lunz(&lnz, &unz, &rows, &cols, &nz_udiag, m_numeric, Scalar()); - - // allocate data - m_l.resize(rows,(std::min)(rows,cols)); - m_l.resizeNonZeros(lnz); - - m_u.resize((std::min)(rows,cols),cols); - m_u.resizeNonZeros(unz); - - m_p.resize(rows); - m_q.resize(cols); - - // extract - umfpack_get_numeric(m_l._outerIndexPtr(), m_l._innerIndexPtr(), m_l._valuePtr(), - m_u._outerIndexPtr(), m_u._innerIndexPtr(), m_u._valuePtr(), - m_p.data(), m_q.data(), 0, 0, 0, m_numeric); - - m_extractedDataAreDirty = false; - } -} - -template -typename SparseLU::Scalar SparseLU::determinant() const -{ - Scalar det; - umfpack_get_determinant(&det, 0, m_numeric, 0); - return det; -} - -template -template -bool SparseLU::solve(const MatrixBase &b, MatrixBase *x) const -{ - //const int size = m_matrix.rows(); - const int rhsCols = b.cols(); -// eigen_assert(size==b.rows()); - eigen_assert((BDerived::Flags&RowMajorBit)==0 && "UmfPack backend does not support non col-major rhs yet"); - eigen_assert((XDerived::Flags&RowMajorBit)==0 && "UmfPack backend does not support non col-major result yet"); - - int errorCode; - for (int j=0; j_outerIndexPtr(), m_matrixRef->_innerIndexPtr(), m_matrixRef->_valuePtr(), - &x->col(j).coeffRef(0), &b.const_cast_derived().col(j).coeffRef(0), m_numeric, 0, 0); - if (errorCode!=0) - return false; - } -// errorCode = umfpack_di_solve(UMFPACK_A, -// m_matrixRef._outerIndexPtr(), m_matrixRef._innerIndexPtr(), m_matrixRef._valuePtr(), -// x->derived().data(), b.derived().data(), m_numeric, 0, 0); - - return true; -} - -#endif // EIGEN_UMFPACKSUPPORT_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/CMakeLists.txt b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/CMakeLists.txt new file mode 100644 index 000000000..55c6271e9 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB Eigen_Splines_SRCS "*.h") + +INSTALL(FILES + ${Eigen_Splines_SRCS} + DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/Splines COMPONENT Devel + ) diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/Spline.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/Spline.h new file mode 100644 index 000000000..4c06453f7 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/Spline.h @@ -0,0 +1,479 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 20010-2011 Hauke Heibel +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_SPLINE_H +#define EIGEN_SPLINE_H + +#include "SplineFwd.h" + +namespace Eigen +{ + /** + * \ingroup Splines_Module + * \class Spline class + * \brief A class representing multi-dimensional spline curves. + * + * The class represents B-splines with non-uniform knot vectors. Each control + * point of the B-spline is associated with a basis function + * \f{align*} + * C(u) & = \sum_{i=0}^{n}N_{i,p}(u)P_i + * \f} + * + * \tparam _Scalar The underlying data type (typically float or double) + * \tparam _Dim The curve dimension (e.g. 2 or 3) + * \tparam _Degree Per default set to Dynamic; could be set to the actual desired + * degree for optimization purposes (would result in stack allocation + * of several temporary variables). + **/ + template + class Spline + { + public: + typedef _Scalar Scalar; /*!< The spline curve's scalar type. */ + enum { Dimension = _Dim /*!< The spline curve's dimension. */ }; + enum { Degree = _Degree /*!< The spline curve's degree. */ }; + + /** \brief The point type the spline is representing. */ + typedef typename SplineTraits::PointType PointType; + + /** \brief The data type used to store knot vectors. */ + typedef typename SplineTraits::KnotVectorType KnotVectorType; + + /** \brief The data type used to store non-zero basis functions. */ + typedef typename SplineTraits::BasisVectorType BasisVectorType; + + /** \brief The data type representing the spline's control points. */ + typedef typename SplineTraits::ControlPointVectorType ControlPointVectorType; + + /** + * \brief Creates a spline from a knot vector and control points. + * \param knots The spline's knot vector. + * \param ctrls The spline's control point vector. + **/ + template + Spline(const OtherVectorType& knots, const OtherArrayType& ctrls) : m_knots(knots), m_ctrls(ctrls) {} + + /** + * \brief Copy constructor for splines. + * \param spline The input spline. + **/ + template + Spline(const Spline& spline) : + m_knots(spline.knots()), m_ctrls(spline.ctrls()) {} + + /** + * \brief Returns the knots of the underlying spline. + **/ + const KnotVectorType& knots() const { return m_knots; } + + /** + * \brief Returns the knots of the underlying spline. + **/ + const ControlPointVectorType& ctrls() const { return m_ctrls; } + + /** + * \brief Returns the spline value at a given site \f$u\f$. + * + * The function returns + * \f{align*} + * C(u) & = \sum_{i=0}^{n}N_{i,p}P_i + * \f} + * + * \param u Parameter \f$u \in [0;1]\f$ at which the spline is evaluated. + * \return The spline value at the given location \f$u\f$. + **/ + PointType operator()(Scalar u) const; + + /** + * \brief Evaluation of spline derivatives of up-to given order. + * + * The function returns + * \f{align*} + * \frac{d^i}{du^i}C(u) & = \sum_{i=0}^{n} \frac{d^i}{du^i} N_{i,p}(u)P_i + * \f} + * for i ranging between 0 and order. + * + * \param u Parameter \f$u \in [0;1]\f$ at which the spline derivative is evaluated. + * \param order The order up to which the derivatives are computed. + **/ + typename SplineTraits::DerivativeType + derivatives(Scalar u, DenseIndex order) const; + + /** + * \copydoc Spline::derivatives + * Using the template version of this function is more efficieent since + * temporary objects are allocated on the stack whenever this is possible. + **/ + template + typename SplineTraits::DerivativeType + derivatives(Scalar u, DenseIndex order = DerivativeOrder) const; + + /** + * \brief Computes the non-zero basis functions at the given site. + * + * Splines have local support and a point from their image is defined + * by exactly \f$p+1\f$ control points \f$P_i\f$ where \f$p\f$ is the + * spline degree. + * + * This function computes the \f$p+1\f$ non-zero basis function values + * for a given parameter value \f$u\f$. It returns + * \f{align*}{ + * N_{i,p}(u), \hdots, N_{i+p+1,p}(u) + * \f} + * + * \param u Parameter \f$u \in [0;1]\f$ at which the non-zero basis functions + * are computed. + **/ + typename SplineTraits::BasisVectorType + basisFunctions(Scalar u) const; + + /** + * \brief Computes the non-zero spline basis function derivatives up to given order. + * + * The function computes + * \f{align*}{ + * \frac{d^i}{du^i} N_{i,p}(u), \hdots, \frac{d^i}{du^i} N_{i+p+1,p}(u) + * \f} + * with i ranging from 0 up to the specified order. + * + * \param u Parameter \f$u \in [0;1]\f$ at which the non-zero basis function + * derivatives are computed. + * \param order The order up to which the basis function derivatives are computes. + **/ + typename SplineTraits::BasisDerivativeType + basisFunctionDerivatives(Scalar u, DenseIndex order) const; + + /** + * \copydoc Spline::basisFunctionDerivatives + * Using the template version of this function is more efficieent since + * temporary objects are allocated on the stack whenever this is possible. + **/ + template + typename SplineTraits::BasisDerivativeType + basisFunctionDerivatives(Scalar u, DenseIndex order = DerivativeOrder) const; + + /** + * \brief Returns the spline degree. + **/ + DenseIndex degree() const; + + /** + * \brief Returns the span within the knot vector in which u is falling. + * \param u The site for which the span is determined. + **/ + DenseIndex span(Scalar u) const; + + /** + * \brief Computes the spang within the provided knot vector in which u is falling. + **/ + static DenseIndex Span(typename SplineTraits::Scalar u, DenseIndex degree, const typename SplineTraits::KnotVectorType& knots); + + /** + * \brief Returns the spline's non-zero basis functions. + * + * The function computes and returns + * \f{align*}{ + * N_{i,p}(u), \hdots, N_{i+p+1,p}(u) + * \f} + * + * \param u The site at which the basis functions are computed. + * \param degree The degree of the underlying spline. + * \param knots The underlying spline's knot vector. + **/ + static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType& knots); + + + private: + KnotVectorType m_knots; /*!< Knot vector. */ + ControlPointVectorType m_ctrls; /*!< Control points. */ + }; + + template + DenseIndex Spline<_Scalar, _Dim, _Degree>::Span( + typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::Scalar u, + DenseIndex degree, + const typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::KnotVectorType& knots) + { + // Piegl & Tiller, "The NURBS Book", A2.1 (p. 68) + if (u <= knots(0)) return degree; + const Scalar* pos = std::upper_bound(knots.data()+degree-1, knots.data()+knots.size()-degree-1, u); + return static_cast( std::distance(knots.data(), pos) - 1 ); + } + + template + typename Spline<_Scalar, _Dim, _Degree>::BasisVectorType + Spline<_Scalar, _Dim, _Degree>::BasisFunctions( + typename Spline<_Scalar, _Dim, _Degree>::Scalar u, + DenseIndex degree, + const typename Spline<_Scalar, _Dim, _Degree>::KnotVectorType& knots) + { + typedef typename Spline<_Scalar, _Dim, _Degree>::BasisVectorType BasisVectorType; + + const DenseIndex p = degree; + const DenseIndex i = Spline::Span(u, degree, knots); + + const KnotVectorType& U = knots; + + BasisVectorType left(p+1); left(0) = Scalar(0); + BasisVectorType right(p+1); right(0) = Scalar(0); + + VectorBlock(left,1,p) = u - VectorBlock(U,i+1-p,p).reverse(); + VectorBlock(right,1,p) = VectorBlock(U,i+1,p) - u; + + BasisVectorType N(1,p+1); + N(0) = Scalar(1); + for (DenseIndex j=1; j<=p; ++j) + { + Scalar saved = Scalar(0); + for (DenseIndex r=0; r + DenseIndex Spline<_Scalar, _Dim, _Degree>::degree() const + { + if (_Degree == Dynamic) + return m_knots.size() - m_ctrls.cols() - 1; + else + return _Degree; + } + + template + DenseIndex Spline<_Scalar, _Dim, _Degree>::span(Scalar u) const + { + return Spline::Span(u, degree(), knots()); + } + + template + typename Spline<_Scalar, _Dim, _Degree>::PointType Spline<_Scalar, _Dim, _Degree>::operator()(Scalar u) const + { + enum { Order = SplineTraits::OrderAtCompileTime }; + + const DenseIndex span = this->span(u); + const DenseIndex p = degree(); + const BasisVectorType basis_funcs = basisFunctions(u); + + const Replicate ctrl_weights(basis_funcs); + const Block ctrl_pts(ctrls(),0,span-p,Dimension,p+1); + return (ctrl_weights * ctrl_pts).rowwise().sum(); + } + + /* --------------------------------------------------------------------------------------------- */ + + template + void derivativesImpl(const SplineType& spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType& der) + { + enum { Dimension = SplineTraits::Dimension }; + enum { Order = SplineTraits::OrderAtCompileTime }; + enum { DerivativeOrder = DerivativeType::ColsAtCompileTime }; + + typedef typename SplineTraits::Scalar Scalar; + + typedef typename SplineTraits::BasisVectorType BasisVectorType; + typedef typename SplineTraits::ControlPointVectorType ControlPointVectorType; + + typedef typename SplineTraits::BasisDerivativeType BasisDerivativeType; + typedef typename BasisDerivativeType::ConstRowXpr BasisDerivativeRowXpr; + + const DenseIndex p = spline.degree(); + const DenseIndex span = spline.span(u); + + const DenseIndex n = (std::min)(p, order); + + der.resize(Dimension,n+1); + + // Retrieve the basis function derivatives up to the desired order... + const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives(u, n+1); + + // ... and perform the linear combinations of the control points. + for (DenseIndex der_order=0; der_order ctrl_weights( basis_func_ders.row(der_order) ); + const Block ctrl_pts(spline.ctrls(),0,span-p,Dimension,p+1); + der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum(); + } + } + + template + typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::DerivativeType + Spline<_Scalar, _Dim, _Degree>::derivatives(Scalar u, DenseIndex order) const + { + typename SplineTraits< Spline >::DerivativeType res; + derivativesImpl(*this, u, order, res); + return res; + } + + template + template + typename SplineTraits< Spline<_Scalar, _Dim, _Degree>, DerivativeOrder >::DerivativeType + Spline<_Scalar, _Dim, _Degree>::derivatives(Scalar u, DenseIndex order) const + { + typename SplineTraits< Spline, DerivativeOrder >::DerivativeType res; + derivativesImpl(*this, u, order, res); + return res; + } + + template + typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::BasisVectorType + Spline<_Scalar, _Dim, _Degree>::basisFunctions(Scalar u) const + { + return Spline::BasisFunctions(u, degree(), knots()); + } + + /* --------------------------------------------------------------------------------------------- */ + + template + void basisFunctionDerivativesImpl(const SplineType& spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType& N_) + { + enum { Order = SplineTraits::OrderAtCompileTime }; + + typedef typename SplineTraits::Scalar Scalar; + typedef typename SplineTraits::BasisVectorType BasisVectorType; + typedef typename SplineTraits::KnotVectorType KnotVectorType; + typedef typename SplineTraits::ControlPointVectorType ControlPointVectorType; + + const KnotVectorType& U = spline.knots(); + + const DenseIndex p = spline.degree(); + const DenseIndex span = spline.span(u); + + const DenseIndex n = (std::min)(p, order); + + N_.resize(n+1, p+1); + + BasisVectorType left = BasisVectorType::Zero(p+1); + BasisVectorType right = BasisVectorType::Zero(p+1); + + Matrix ndu(p+1,p+1); + + double saved, temp; + + ndu(0,0) = 1.0; + + DenseIndex j; + for (j=1; j<=p; ++j) + { + left[j] = u-U[span+1-j]; + right[j] = U[span+j]-u; + saved = 0.0; + + for (DenseIndex r=0; r(saved+right[r+1] * temp); + saved = left[j-r] * temp; + } + + ndu(j,j) = static_cast(saved); + } + + for (j = p; j>=0; --j) + N_(0,j) = ndu(j,p); + + // Compute the derivatives + DerivativeType a(n+1,p+1); + DenseIndex r=0; + for (; r<=p; ++r) + { + DenseIndex s1,s2; + s1 = 0; s2 = 1; // alternate rows in array a + a(0,0) = 1.0; + + // Compute the k-th derivative + for (DenseIndex k=1; k<=static_cast(n); ++k) + { + double d = 0.0; + DenseIndex rk,pk,j1,j2; + rk = r-k; pk = p-k; + + if (r>=k) + { + a(s2,0) = a(s1,0)/ndu(pk+1,rk); + d = a(s2,0)*ndu(rk,pk); + } + + if (rk>=-1) j1 = 1; + else j1 = -rk; + + if (r-1 <= pk) j2 = k-1; + else j2 = p-r; + + for (j=j1; j<=j2; ++j) + { + a(s2,j) = (a(s1,j)-a(s1,j-1))/ndu(pk+1,rk+j); + d += a(s2,j)*ndu(rk+j,pk); + } + + if (r<=pk) + { + a(s2,k) = -a(s1,k-1)/ndu(pk+1,r); + d += a(s2,k)*ndu(r,pk); + } + + N_(k,r) = static_cast(d); + j = s1; s1 = s2; s2 = j; // Switch rows + } + } + + /* Multiply through by the correct factors */ + /* (Eq. [2.9]) */ + r = p; + for (DenseIndex k=1; k<=static_cast(n); ++k) + { + for (DenseIndex j=p; j>=0; --j) N_(k,j) *= r; + r *= p-k; + } + } + + template + typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::BasisDerivativeType + Spline<_Scalar, _Dim, _Degree>::basisFunctionDerivatives(Scalar u, DenseIndex order) const + { + typename SplineTraits< Spline >::BasisDerivativeType der; + basisFunctionDerivativesImpl(*this, u, order, der); + return der; + } + + template + template + typename SplineTraits< Spline<_Scalar, _Dim, _Degree>, DerivativeOrder >::BasisDerivativeType + Spline<_Scalar, _Dim, _Degree>::basisFunctionDerivatives(Scalar u, DenseIndex order) const + { + typename SplineTraits< Spline, DerivativeOrder >::BasisDerivativeType der; + basisFunctionDerivativesImpl(*this, u, order, der); + return der; + } +} + +#endif // EIGEN_SPLINE_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFitting.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFitting.h new file mode 100644 index 000000000..3e8abbbce --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFitting.h @@ -0,0 +1,174 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 20010-2011 Hauke Heibel +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_SPLINE_FITTING_H +#define EIGEN_SPLINE_FITTING_H + +#include + +#include "SplineFwd.h" + +#include + +namespace Eigen +{ + /** + * \brief Computes knot averages. + * \ingroup Splines_Module + * + * The knots are computed as + * \f{align*} + * u_0 & = \hdots = u_p = 0 \\ + * u_{m-p} & = \hdots = u_{m} = 1 \\ + * u_{j+p} & = \frac{1}{p}\sum_{i=j}^{j+p-1}\bar{u}_i \quad\quad j=1,\hdots,n-p + * \f} + * where \f$p\f$ is the degree and \f$m+1\f$ the number knots + * of the desired interpolating spline. + * + * \param[in] parameters The input parameters. During interpolation one for each data point. + * \param[in] degree The spline degree which is used during the interpolation. + * \param[out] knots The output knot vector. + * + * \sa Les Piegl and Wayne Tiller, The NURBS book (2nd ed.), 1997, 9.2.1 Global Curve Interpolation to Point Data + **/ + template + void KnotAveraging(const KnotVectorType& parameters, DenseIndex degree, KnotVectorType& knots) + { + typedef typename KnotVectorType::Scalar Scalar; + + knots.resize(parameters.size()+degree+1); + + for (DenseIndex j=1; j + void ChordLengths(const PointArrayType& pts, KnotVectorType& chord_lengths) + { + typedef typename KnotVectorType::Scalar Scalar; + + const DenseIndex n = pts.cols(); + + // 1. compute the column-wise norms + chord_lengths.resize(pts.cols()); + chord_lengths[0] = 0; + chord_lengths.rightCols(n-1) = (pts.array().leftCols(n-1) - pts.array().rightCols(n-1)).matrix().colwise().norm(); + + // 2. compute the partial sums + std::partial_sum(chord_lengths.data(), chord_lengths.data()+n, chord_lengths.data()); + + // 3. normalize the data + chord_lengths /= chord_lengths(n-1); + chord_lengths(n-1) = Scalar(1); + } + + /** + * \brief Spline fitting methods. + * \ingroup Splines_Module + **/ + template + struct SplineFitting + { + typedef typename SplineType::KnotVectorType KnotVectorType; + + /** + * \brief Fits an interpolating Spline to the given data points. + * + * \param pts The points for which an interpolating spline will be computed. + * \param degree The degree of the interpolating spline. + * + * \returns A spline interpolating the initially provided points. + **/ + template + static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree); + + /** + * \brief Fits an interpolating Spline to the given data points. + * + * \param pts The points for which an interpolating spline will be computed. + * \param degree The degree of the interpolating spline. + * \param knot_parameters The knot parameters for the interpolation. + * + * \returns A spline interpolating the initially provided points. + **/ + template + static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree, const KnotVectorType& knot_parameters); + }; + + template + template + SplineType SplineFitting::Interpolate(const PointArrayType& pts, DenseIndex degree, const KnotVectorType& knot_parameters) + { + typedef typename SplineType::KnotVectorType::Scalar Scalar; + typedef typename SplineType::BasisVectorType BasisVectorType; + typedef typename SplineType::ControlPointVectorType ControlPointVectorType; + + typedef Matrix MatrixType; + + KnotVectorType knots; + KnotAveraging(knot_parameters, degree, knots); + + DenseIndex n = pts.cols(); + MatrixType A = MatrixType::Zero(n,n); + for (DenseIndex i=1; i qr(A); + + // Here, we are creating a temporary due to an Eigen issue. + ControlPointVectorType ctrls = qr.solve(MatrixType(pts.transpose())).transpose(); + + return SplineType(knots, ctrls); + } + + template + template + SplineType SplineFitting::Interpolate(const PointArrayType& pts, DenseIndex degree) + { + KnotVectorType chord_lengths; // knot parameters + ChordLengths(pts, chord_lengths); + return Interpolate(pts, degree, chord_lengths); + } +} + +#endif // EIGEN_SPLINE_FITTING_H diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFwd.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFwd.h new file mode 100644 index 000000000..0119115a6 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFwd.h @@ -0,0 +1,101 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 20010-2011 Hauke Heibel +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#ifndef EIGEN_SPLINES_FWD_H +#define EIGEN_SPLINES_FWD_H + +#include + +namespace Eigen +{ + template class Spline; + + template < typename SplineType, int DerivativeOrder = Dynamic > struct SplineTraits {}; + + /** + * \ingroup Splines_Module + * \brief Compile-time attributes of the Spline class for Dynamic degree. + **/ + template + struct SplineTraits< Spline<_Scalar, _Dim, _Degree>, Dynamic > + { + typedef _Scalar Scalar; /*!< The spline curve's scalar type. */ + enum { Dimension = _Dim /*!< The spline curve's dimension. */ }; + enum { Degree = _Degree /*!< The spline curve's degree. */ }; + + enum { OrderAtCompileTime = _Degree==Dynamic ? Dynamic : _Degree+1 /*!< The spline curve's order at compile-time. */ }; + enum { NumOfDerivativesAtCompileTime = OrderAtCompileTime /*!< The number of derivatives defined for the current spline. */ }; + + /** \brief The data type used to store non-zero basis functions. */ + typedef Array BasisVectorType; + + /** \brief The data type used to store the values of the basis function derivatives. */ + typedef Array BasisDerivativeType; + + /** \brief The data type used to store the spline's derivative values. */ + typedef Array DerivativeType; + + /** \brief The point type the spline is representing. */ + typedef Array PointType; + + /** \brief The data type used to store knot vectors. */ + typedef Array KnotVectorType; + + /** \brief The data type representing the spline's control points. */ + typedef Array ControlPointVectorType; + }; + + /** + * \ingroup Splines_Module + * \brief Compile-time attributes of the Spline class for fixed degree. + * + * The traits class inherits all attributes from the SplineTraits of Dynamic degree. + **/ + template < typename _Scalar, int _Dim, int _Degree, int _DerivativeOrder > + struct SplineTraits< Spline<_Scalar, _Dim, _Degree>, _DerivativeOrder > : public SplineTraits< Spline<_Scalar, _Dim, _Degree> > + { + enum { OrderAtCompileTime = _Degree==Dynamic ? Dynamic : _Degree+1 /*!< The spline curve's order at compile-time. */ }; + enum { NumOfDerivativesAtCompileTime = _DerivativeOrder==Dynamic ? Dynamic : _DerivativeOrder+1 /*!< The number of derivatives defined for the current spline. */ }; + + /** \brief The data type used to store the values of the basis function derivatives. */ + typedef Array<_Scalar,Dynamic,Dynamic,RowMajor,NumOfDerivativesAtCompileTime,OrderAtCompileTime> BasisDerivativeType; + + /** \brief The data type used to store the spline's derivative values. */ + typedef Array<_Scalar,_Dim,Dynamic,ColMajor,_Dim,NumOfDerivativesAtCompileTime> DerivativeType; + }; + + /** \brief 2D float B-spline with dynamic degree. */ + typedef Spline Spline2f; + + /** \brief 3D float B-spline with dynamic degree. */ + typedef Spline Spline3f; + + /** \brief 2D double B-spline with dynamic degree. */ + typedef Spline Spline2d; + + /** \brief 3D double B-spline with dynamic degree. */ + typedef Spline Spline3d; +} + +#endif // EIGEN_SPLINES_FWD_H diff --git a/gtsam/3rdparty/Eigen/unsupported/doc/Doxyfile.in b/gtsam/3rdparty/Eigen/unsupported/doc/Doxyfile.in index 7d5f24b4e..1facf2985 100644 --- a/gtsam/3rdparty/Eigen/unsupported/doc/Doxyfile.in +++ b/gtsam/3rdparty/Eigen/unsupported/doc/Doxyfile.in @@ -203,7 +203,6 @@ ALIASES = "only_for_vectors=This is only for vectors (either row- "svd_module=This is defined in the %SVD module. \code #include \endcode" \ "geometry_module=This is defined in the %Geometry module. \code #include \endcode" \ "label=\bug" \ - "redstar=*" \ "nonstableyet=\warning This is not considered to be part of the stable public API yet. Changes may happen in future releases. See \ref Experimental \"Experimental parts of Eigen\"" # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C @@ -576,13 +575,14 @@ FILE_PATTERNS = * # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = +EXCLUDE = "${Eigen_SOURCE_DIR}/unsupported/doc/examples" \ + "${Eigen_SOURCE_DIR}/unsupported/doc/snippets" # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded @@ -958,7 +958,8 @@ PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. -EXTRA_PACKAGES = amssymb +EXTRA_PACKAGES = amssymb \ + amsmath # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until diff --git a/gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixLogarithm.cpp b/gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixLogarithm.cpp new file mode 100644 index 000000000..8c5d97054 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixLogarithm.cpp @@ -0,0 +1,15 @@ +#include +#include + +using namespace Eigen; + +int main() +{ + using std::sqrt; + MatrixXd A(3,3); + A << 0.5*sqrt(2), -0.5*sqrt(2), 0, + 0.5*sqrt(2), 0.5*sqrt(2), 0, + 0, 0, 1; + std::cout << "The matrix A is:\n" << A << "\n\n"; + std::cout << "The matrix logarithm of A is:\n" << A.log() << "\n"; +} diff --git a/gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixSquareRoot.cpp b/gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixSquareRoot.cpp new file mode 100644 index 000000000..88e7557d7 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixSquareRoot.cpp @@ -0,0 +1,16 @@ +#include +#include + +using namespace Eigen; + +int main() +{ + const double pi = std::acos(-1.0); + + MatrixXd A(2,2); + A << cos(pi/3), -sin(pi/3), + sin(pi/3), cos(pi/3); + std::cout << "The matrix A is:\n" << A << "\n\n"; + std::cout << "The matrix square root of A is:\n" << A.sqrt() << "\n\n"; + std::cout << "The square of the last matrix is:\n" << A.sqrt() * A.sqrt() << "\n"; +} diff --git a/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp b/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp index e77e84b6d..3f9d108de 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp @@ -24,9 +24,15 @@ #include "main.h" #include +#include #include -inline double SQR(double x) { return x * x; } +namespace Eigen { + +template AlignedBox bounding_box(const Matrix &v) { return AlignedBox(v); } + +} + template struct Ball @@ -41,16 +47,10 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(double, Dim) VectorType center; double radius; }; - -namespace Eigen { -namespace internal { - -template AlignedBox bounding_box(const Matrix &v) { return AlignedBox(v); } template AlignedBox bounding_box(const Ball &b) { return AlignedBox(b.center.array() - b.radius, b.center.array() + b.radius); } -} // end namespace internal -} +inline double SQR(double x) { return x * x; } template struct BallPointStuff //this class provides functions to be both an intersector and a minimizer, both for a ball and a point and for two trees diff --git a/gtsam/3rdparty/Eigen/unsupported/test/CMakeLists.txt b/gtsam/3rdparty/Eigen/unsupported/test/CMakeLists.txt index f8c0ff486..b34b151b1 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/unsupported/test/CMakeLists.txt @@ -1,47 +1,6 @@ -include_directories(../../test ../../unsupported ../../Eigen) - -set(SPARSE_LIBS "") - -# configure blas/lapack -if(CMAKE_Fortran_COMPILER_WORKS) - set(BLAS_FOUND TRUE) - set(LAPACK_FOUND TRUE) - set(BLAS_LIBRARIES eigen_blas_static) - set(LAPACK_LIBRARIES eigen_lapack_static) -else() - # TODO search for default blas/lapack -endif() - -find_package(Cholmod) -if(CHOLMOD_FOUND AND BLAS_FOUND AND LAPACK_FOUND) - add_definitions("-DEIGEN_CHOLMOD_SUPPORT") - include_directories(${CHOLMOD_INCLUDES}) - set(SPARSE_LIBS ${SPARSE_LIBS} ${CHOLMOD_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) - ei_add_property(EIGEN_TESTED_BACKENDS "Cholmod, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "Cholmod, ") -endif() - -find_package(Umfpack) -if(UMFPACK_FOUND AND BLAS_FOUND) - add_definitions("-DEIGEN_UMFPACK_SUPPORT") - include_directories(${UMFPACK_INCLUDES}) - set(SPARSE_LIBS ${SPARSE_LIBS} ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES}) - ei_add_property(EIGEN_TESTED_BACKENDS "UmfPack, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "UmfPack, ") -endif() - -find_package(SuperLU) -if(SUPERLU_FOUND AND BLAS_FOUND) - add_definitions("-DEIGEN_SUPERLU_SUPPORT") - include_directories(${SUPERLU_INCLUDES}) - set(SPARSE_LIBS ${SPARSE_LIBS} ${SUPERLU_LIBRARIES} ${BLAS_LIBRARIES}) - ei_add_property(EIGEN_TESTED_BACKENDS "SuperLU, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "SuperLU, ") -endif() +include_directories(../../test ../../unsupported ../../Eigen + ${CMAKE_CURRENT_BINARY_DIR}/../../test) find_package(GoogleHash) if(GOOGLEHASH_FOUND) @@ -74,6 +33,7 @@ endif() ei_add_test(matrix_exponential) ei_add_test(matrix_function) +ei_add_test(matrix_square_root) ei_add_test(alignedvector3) ei_add_test(FFT) @@ -88,18 +48,16 @@ else() ei_add_property(EIGEN_MISSING_BACKENDS "MPFR C++, ") endif() -ei_add_test(sparse_llt "" "${SPARSE_LIBS}") -ei_add_test(sparse_ldlt "" "${SPARSE_LIBS}") -ei_add_test(sparse_lu "" "${SPARSE_LIBS}") ei_add_test(sparse_extra "" "") find_package(FFTW) if(FFTW_FOUND) ei_add_property(EIGEN_TESTED_BACKENDS "fftw, ") + include_directories( ${FFTW_INCLUDES} ) if(FFTWL_LIB) - ei_add_test(FFTW "-DEIGEN_FFTW_DEFAULT -DEIGEN_HAS_FFTWL" "fftw3;fftw3f;fftw3l" ) + ei_add_test(FFTW "-DEIGEN_FFTW_DEFAULT -DEIGEN_HAS_FFTWL" "${FFTW_LIBRARIES}" ) else() - ei_add_test(FFTW "-DEIGEN_FFTW_DEFAULT " "fftw3;fftw3f" ) + ei_add_test(FFTW "-DEIGEN_FFTW_DEFAULT" "${FFTW_LIBRARIES}" ) endif() else() ei_add_property(EIGEN_MISSING_BACKENDS "fftw, ") @@ -121,18 +79,9 @@ else() ei_add_property(EIGEN_MISSING_BACKENDS "OpenGL, ") endif() -find_package(GSL) -if(GSL_FOUND AND GSL_VERSION_MINOR LESS 9) - set(GSL_FOUND "") -endif(GSL_FOUND AND GSL_VERSION_MINOR LESS 9) -if(GSL_FOUND) - add_definitions("-DHAS_GSL" ${GSL_DEFINITIONS}) - include_directories(${GSL_INCLUDE_DIR}) - ei_add_property(EIGEN_TESTED_BACKENDS "GSL, ") -else(GSL_FOUND) - ei_add_property(EIGEN_MISSING_BACKENDS "GSL, ") - set(GSL_LIBRARIES " ") -endif(GSL_FOUND) - -ei_add_test(polynomialsolver " " "${GSL_LIBRARIES}" ) +ei_add_test(polynomialsolver) ei_add_test(polynomialutils) +ei_add_test(kronecker_product) +ei_add_test(splines) +ei_add_test(gmres) + diff --git a/gtsam/3rdparty/Eigen/unsupported/test/autodiff.cpp b/gtsam/3rdparty/Eigen/unsupported/test/autodiff.cpp index a32d85829..7ce4b4dee 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/autodiff.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/autodiff.cpp @@ -28,13 +28,21 @@ template EIGEN_DONT_INLINE Scalar foo(const Scalar& x, const Scalar& y) { + using namespace std; // return x+std::sin(y); EIGEN_ASM_COMMENT("mybegin"); - return static_cast(x*2 - std::pow(x,2) + 2*std::sqrt(y*y) - 4 * std::sin(x) + 2 * std::cos(y) - std::exp(-0.5*x*x)); + return static_cast(x*2 - pow(x,2) + 2*sqrt(y*y) - 4 * sin(x) + 2 * cos(y) - exp(-0.5*x*x)); //return x+2*y*x;//x*2 -std::pow(x,2);//(2*y/x);// - y*2; EIGEN_ASM_COMMENT("myend"); } +template +EIGEN_DONT_INLINE typename Vector::Scalar foo(const Vector& p) +{ + typedef typename Vector::Scalar Scalar; + return (p-Vector(Scalar(-1),Scalar(1.))).norm() + (p.array() * p.array()).sum() + p.dot(p); +} + template struct TestFunc1 { @@ -140,9 +148,23 @@ void test_autodiff_scalar() typedef AutoDiffScalar AD; AD ax(1,Vector2f::UnitX()); AD ay(2,Vector2f::UnitY()); - foo(ax,ay); - std::cerr << foo(ax,ay).value() << " <> " - << foo(ax,ay).derivatives().transpose() << "\n\n"; + AD res = foo(ax,ay); + std::cerr << res.value() << " <> " + << res.derivatives().transpose() << "\n\n"; +} + +void test_autodiff_vector() +{ + std::cerr << foo(Vector2f(1,2)) << "\n"; + typedef AutoDiffScalar AD; + typedef Matrix VectorAD; + VectorAD p(AD(1),AD(-1)); + p.x().derivatives() = Vector2f::UnitX(); + p.y().derivatives() = Vector2f::UnitY(); + + AD res = foo(p); + std::cerr << res.value() << " <> " + << res.derivatives().transpose() << "\n\n"; } void test_autodiff_jacobian() @@ -159,6 +181,7 @@ void test_autodiff_jacobian() void test_autodiff() { test_autodiff_scalar(); - test_autodiff_jacobian(); + test_autodiff_vector(); +// test_autodiff_jacobian(); } diff --git a/gtsam/3rdparty/Eigen/unsupported/test/forward_adolc.cpp b/gtsam/3rdparty/Eigen/unsupported/test/forward_adolc.cpp index 1971d883b..07959a668 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/forward_adolc.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/forward_adolc.cpp @@ -23,11 +23,20 @@ // Eigen. If not, see . #include "main.h" +#include + #define NUMBER_DIRECTIONS 16 #include int adtl::ADOLC_numDir; +template +EIGEN_DONT_INLINE typename Vector::Scalar foo(const Vector& p) +{ + typedef typename Vector::Scalar Scalar; + return (p-Vector(Scalar(-1),Scalar(1.))).norm() + (p.array().sqrt().abs() * p.array().sin()).sum() + p.dot(p); +} + template struct TestFunc1 { @@ -138,4 +147,12 @@ void test_forward_adolc() CALL_SUBTEST(( adolc_forward_jacobian(TestFunc1()) )); CALL_SUBTEST(( adolc_forward_jacobian(TestFunc1(3,3)) )); } + + { + // simple instanciation tests + Matrix x; + foo(x); + Matrix A(4,4);; + A.selfadjointView().eigenvalues(); + } } diff --git a/gtsam/3rdparty/Eigen/unsupported/test/gmres.cpp b/gtsam/3rdparty/Eigen/unsupported/test/gmres.cpp new file mode 100644 index 000000000..30ebe8979 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/test/gmres.cpp @@ -0,0 +1,48 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// Copyright (C) 2012 Kolja Brix +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "../../test/sparse_solver.h" +#include + +template void test_gmres_T() +{ + GMRES, DiagonalPreconditioner > gmres_colmajor_diag; + GMRES, IdentityPreconditioner > gmres_colmajor_I; + GMRES, IncompleteLUT > gmres_colmajor_ilut; + //GMRES, SSORPreconditioner > gmres_colmajor_ssor; + + CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_diag) ); +// CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_I) ); + CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_ilut) ); + //CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_ssor) ); +} + +void test_gmres() +{ + for(int i = 0; i < g_repeat; i++) { + CALL_SUBTEST_1(test_gmres_T()); + CALL_SUBTEST_2(test_gmres_T >()); + } +} diff --git a/gtsam/3rdparty/Eigen/unsupported/test/kronecker_product.cpp b/gtsam/3rdparty/Eigen/unsupported/test/kronecker_product.cpp new file mode 100644 index 000000000..3c7a6629f --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/test/kronecker_product.cpp @@ -0,0 +1,194 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Kolja Brix +// Copyright (C) 2011 Andreas Platen +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + + +#include "sparse.h" +#include +#include + + +template +void check_dimension(const MatrixType& ab, const unsigned int rows, const unsigned int cols) +{ + VERIFY_IS_EQUAL(ab.rows(), rows); + VERIFY_IS_EQUAL(ab.cols(), cols); +} + + +template +void check_kronecker_product(const MatrixType& ab) +{ + VERIFY_IS_EQUAL(ab.rows(), 6); + VERIFY_IS_EQUAL(ab.cols(), 6); + VERIFY_IS_EQUAL(ab.nonZeros(), 36); + VERIFY_IS_APPROX(ab.coeff(0,0), -0.4017367630386106); + VERIFY_IS_APPROX(ab.coeff(0,1), 0.1056863433932735); + VERIFY_IS_APPROX(ab.coeff(0,2), -0.7255206194554212); + VERIFY_IS_APPROX(ab.coeff(0,3), 0.1908653336744706); + VERIFY_IS_APPROX(ab.coeff(0,4), 0.350864567234111); + VERIFY_IS_APPROX(ab.coeff(0,5), -0.0923032108308013); + VERIFY_IS_APPROX(ab.coeff(1,0), 0.415417514804677); + VERIFY_IS_APPROX(ab.coeff(1,1), -0.2369227701722048); + VERIFY_IS_APPROX(ab.coeff(1,2), 0.7502275131458511); + VERIFY_IS_APPROX(ab.coeff(1,3), -0.4278731019742696); + VERIFY_IS_APPROX(ab.coeff(1,4), -0.3628129162264507); + VERIFY_IS_APPROX(ab.coeff(1,5), 0.2069210808481275); + VERIFY_IS_APPROX(ab.coeff(2,0), 0.05465890160863986); + VERIFY_IS_APPROX(ab.coeff(2,1), -0.2634092511419858); + VERIFY_IS_APPROX(ab.coeff(2,2), 0.09871180285793758); + VERIFY_IS_APPROX(ab.coeff(2,3), -0.4757066334017702); + VERIFY_IS_APPROX(ab.coeff(2,4), -0.04773740823058334); + VERIFY_IS_APPROX(ab.coeff(2,5), 0.2300535609645254); + VERIFY_IS_APPROX(ab.coeff(3,0), -0.8172945853260133); + VERIFY_IS_APPROX(ab.coeff(3,1), 0.2150086428359221); + VERIFY_IS_APPROX(ab.coeff(3,2), 0.5825113847292743); + VERIFY_IS_APPROX(ab.coeff(3,3), -0.1532433770097174); + VERIFY_IS_APPROX(ab.coeff(3,4), -0.329383387282399); + VERIFY_IS_APPROX(ab.coeff(3,5), 0.08665207912033064); + VERIFY_IS_APPROX(ab.coeff(4,0), 0.8451267514863225); + VERIFY_IS_APPROX(ab.coeff(4,1), -0.481996458918977); + VERIFY_IS_APPROX(ab.coeff(4,2), -0.6023482390791535); + VERIFY_IS_APPROX(ab.coeff(4,3), 0.3435339347164565); + VERIFY_IS_APPROX(ab.coeff(4,4), 0.3406002157428891); + VERIFY_IS_APPROX(ab.coeff(4,5), -0.1942526344200915); + VERIFY_IS_APPROX(ab.coeff(5,0), 0.1111982482925399); + VERIFY_IS_APPROX(ab.coeff(5,1), -0.5358806424754169); + VERIFY_IS_APPROX(ab.coeff(5,2), -0.07925446559335647); + VERIFY_IS_APPROX(ab.coeff(5,3), 0.3819388757769038); + VERIFY_IS_APPROX(ab.coeff(5,4), 0.04481475387219876); + VERIFY_IS_APPROX(ab.coeff(5,5), -0.2159688616158057); +} + + +template +void check_sparse_kronecker_product(const MatrixType& ab) +{ + VERIFY_IS_EQUAL(ab.rows(), 12); + VERIFY_IS_EQUAL(ab.cols(), 10); + VERIFY_IS_EQUAL(ab.nonZeros(), 3*2); + VERIFY_IS_APPROX(ab.coeff(3,0), -0.04); + VERIFY_IS_APPROX(ab.coeff(5,1), 0.05); + VERIFY_IS_APPROX(ab.coeff(0,6), -0.08); + VERIFY_IS_APPROX(ab.coeff(2,7), 0.10); + VERIFY_IS_APPROX(ab.coeff(6,8), 0.12); + VERIFY_IS_APPROX(ab.coeff(8,9), -0.15); +} + + +void test_kronecker_product() +{ + // DM = dense matrix; SM = sparse matrix + Matrix DM_a; + MatrixXd DM_b(3,2); + SparseMatrix SM_a(2,3); + SparseMatrix SM_b(3,2); + SM_a.insert(0,0) = DM_a(0,0) = -0.4461540300782201; + SM_a.insert(0,1) = DM_a(0,1) = -0.8057364375283049; + SM_a.insert(0,2) = DM_a(0,2) = 0.3896572459516341; + SM_a.insert(1,0) = DM_a(1,0) = -0.9076572187376921; + SM_a.insert(1,1) = DM_a(1,1) = 0.6469156566545853; + SM_a.insert(1,2) = DM_a(1,2) = -0.3658010398782789; + SM_b.insert(0,0) = DM_b(0,0) = 0.9004440976767099; + SM_b.insert(0,1) = DM_b(0,1) = -0.2368830858139832; + SM_b.insert(1,0) = DM_b(1,0) = -0.9311078389941825; + SM_b.insert(1,1) = DM_b(1,1) = 0.5310335762980047; + SM_b.insert(2,0) = DM_b(2,0) = -0.1225112806872035; + SM_b.insert(2,1) = DM_b(2,1) = 0.5903998022741264; + SparseMatrix SM_row_a(SM_a), SM_row_b(SM_b); + + // test kroneckerProduct(DM_block,DM,DM_fixedSize) + Matrix DM_fix_ab; + DM_fix_ab(0,0)=37.0; + kroneckerProduct(DM_a.block(0,0,2,3),DM_b,DM_fix_ab); + CALL_SUBTEST(check_kronecker_product(DM_fix_ab)); + + // test kroneckerProduct(DM,DM,DM_block) + MatrixXd DM_block_ab(10,15); + DM_block_ab(0,0)=37.0; + kroneckerProduct(DM_a,DM_b,DM_block_ab.block(2,5,6,6)); + CALL_SUBTEST(check_kronecker_product(DM_block_ab.block(2,5,6,6))); + + // test kroneckerProduct(DM,DM,DM) + MatrixXd DM_ab(1,5); + DM_ab(0,0)=37.0; + kroneckerProduct(DM_a,DM_b,DM_ab); + CALL_SUBTEST(check_kronecker_product(DM_ab)); + + // test kroneckerProduct(SM,DM,SM) + SparseMatrix SM_ab(1,20); + SM_ab.insert(0,0)=37.0; + kroneckerProduct(SM_a,DM_b,SM_ab); + CALL_SUBTEST(check_kronecker_product(SM_ab)); + SparseMatrix SM_ab2(10,3); + SM_ab2.insert(0,0)=37.0; + kroneckerProduct(SM_a,DM_b,SM_ab2); + CALL_SUBTEST(check_kronecker_product(SM_ab2)); + + // test kroneckerProduct(DM,SM,SM) + SM_ab.insert(0,0)=37.0; + kroneckerProduct(DM_a,SM_b,SM_ab); + CALL_SUBTEST(check_kronecker_product(SM_ab)); + SM_ab2.insert(0,0)=37.0; + kroneckerProduct(DM_a,SM_b,SM_ab2); + CALL_SUBTEST(check_kronecker_product(SM_ab2)); + + // test kroneckerProduct(SM,SM,SM) + SM_ab.resize(2,33); + SM_ab.insert(0,0)=37.0; + kroneckerProduct(SM_a,SM_b,SM_ab); + CALL_SUBTEST(check_kronecker_product(SM_ab)); + SM_ab2.resize(5,11); + SM_ab2.insert(0,0)=37.0; + kroneckerProduct(SM_a,SM_b,SM_ab2); + CALL_SUBTEST(check_kronecker_product(SM_ab2)); + + // test kroneckerProduct(SM,SM,SM) with sparse pattern + SM_a.resize(4,5); + SM_b.resize(3,2); + SM_a.resizeNonZeros(0); + SM_b.resizeNonZeros(0); + SM_a.insert(1,0) = -0.1; + SM_a.insert(0,3) = -0.2; + SM_a.insert(2,4) = 0.3; + SM_a.finalize(); + SM_b.insert(0,0) = 0.4; + SM_b.insert(2,1) = -0.5; + SM_b.finalize(); + SM_ab.resize(1,1); + SM_ab.insert(0,0)=37.0; + kroneckerProduct(SM_a,SM_b,SM_ab); + CALL_SUBTEST(check_sparse_kronecker_product(SM_ab)); + + // test dimension of result of kroneckerProduct(DM,DM,DM) + MatrixXd DM_a2(2,1); + MatrixXd DM_b2(5,4); + MatrixXd DM_ab2; + kroneckerProduct(DM_a2,DM_b2,DM_ab2); + CALL_SUBTEST(check_dimension(DM_ab2,2*5,1*4)); + DM_a2.resize(10,9); + DM_b2.resize(4,8); + kroneckerProduct(DM_a2,DM_b2,DM_ab2); + CALL_SUBTEST(check_dimension(DM_ab2,10*4,9*8)); +} diff --git a/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp b/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp index 996b42a7f..26403c4e6 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp @@ -55,7 +55,7 @@ void test2dRotation(double tol) for (int i=0; i<=20; i++) { angle = static_cast(pow(10, i / 5. - 2)); - B << cos(angle), sin(angle), -sin(angle), cos(angle); + B << std::cos(angle), std::sin(angle), -std::sin(angle), std::cos(angle); C = (angle*A).matrixFunction(expfn); std::cout << "test2dRotation: i = " << i << " error funm = " << relerr(C, B); @@ -146,8 +146,10 @@ void test_matrix_exponential() { CALL_SUBTEST_2(test2dRotation(1e-13)); CALL_SUBTEST_1(test2dRotation(2e-5)); // was 1e-5, relaxed for clang 2.8 / linux / x86-64 + CALL_SUBTEST_8(test2dRotation(1e-13)); CALL_SUBTEST_2(test2dHyperbolicRotation(1e-14)); CALL_SUBTEST_1(test2dHyperbolicRotation(1e-5)); + CALL_SUBTEST_8(test2dHyperbolicRotation(1e-14)); CALL_SUBTEST_6(testPascal(1e-6)); CALL_SUBTEST_5(testPascal(1e-15)); CALL_SUBTEST_2(randomTest(Matrix2d(), 1e-13)); @@ -158,4 +160,5 @@ void test_matrix_exponential() CALL_SUBTEST_5(randomTest(Matrix3cf(), 1e-4)); CALL_SUBTEST_1(randomTest(Matrix4f(), 1e-4)); CALL_SUBTEST_6(randomTest(MatrixXf(8,8), 1e-4)); + CALL_SUBTEST_9(randomTest(Matrix(7,7), 1e-13)); } diff --git a/gtsam/3rdparty/Eigen/unsupported/test/matrix_function.cpp b/gtsam/3rdparty/Eigen/unsupported/test/matrix_function.cpp index 04167abfb..c2ca5d5f1 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/matrix_function.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/matrix_function.cpp @@ -120,6 +120,26 @@ void testMatrixExponential(const MatrixType& A) VERIFY_IS_APPROX(A.exp(), A.matrixFunction(StdStemFunctions::exp)); } +template +void testMatrixLogarithm(const MatrixType& A) +{ + typedef typename internal::traits::Scalar Scalar; + typedef typename NumTraits::Real RealScalar; + typedef std::complex ComplexScalar; + + MatrixType scaledA; + RealScalar maxImagPartOfSpectrum = A.eigenvalues().imag().cwiseAbs().maxCoeff(); + if (maxImagPartOfSpectrum >= 0.9 * M_PI) + scaledA = A * 0.9 * M_PI / maxImagPartOfSpectrum; + else + scaledA = A; + + // identity X.exp().log() = X only holds if Im(lambda) < pi for all eigenvalues of X + MatrixType expA = scaledA.exp(); + MatrixType logExpA = expA.log(); + VERIFY_IS_APPROX(logExpA, scaledA); +} + template void testHyperbolicFunctions(const MatrixType& A) { @@ -157,6 +177,7 @@ template void testMatrix(const MatrixType& A) { testMatrixExponential(A); + testMatrixLogarithm(A); testHyperbolicFunctions(A); testGonioFunctions(A); } diff --git a/gtsam/3rdparty/Eigen/unsupported/test/matrix_square_root.cpp b/gtsam/3rdparty/Eigen/unsupported/test/matrix_square_root.cpp new file mode 100644 index 000000000..8e701aac6 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/test/matrix_square_root.cpp @@ -0,0 +1,77 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Jitse Niesen +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "main.h" +#include + +template ::Scalar>::IsComplex> +struct generateTestMatrix; + +// for real matrices, make sure none of the eigenvalues are negative +template +struct generateTestMatrix +{ + static void run(MatrixType& result, typename MatrixType::Index size) + { + MatrixType mat = MatrixType::Random(size, size); + EigenSolver es(mat); + typename EigenSolver::EigenvalueType eivals = es.eigenvalues(); + for (typename MatrixType::Index i = 0; i < size; ++i) { + if (eivals(i).imag() == 0 && eivals(i).real() < 0) + eivals(i) = -eivals(i); + } + result = (es.eigenvectors() * eivals.asDiagonal() * es.eigenvectors().inverse()).real(); + } +}; + +// for complex matrices, any matrix is fine +template +struct generateTestMatrix +{ + static void run(MatrixType& result, typename MatrixType::Index size) + { + result = MatrixType::Random(size, size); + } +}; + +template +void testMatrixSqrt(const MatrixType& m) +{ + MatrixType A; + generateTestMatrix::run(A, m.rows()); + MatrixType sqrtA = A.sqrt(); + VERIFY_IS_APPROX(sqrtA * sqrtA, A); +} + +void test_matrix_square_root() +{ + for (int i = 0; i < g_repeat; i++) { + CALL_SUBTEST_1(testMatrixSqrt(Matrix3cf())); + CALL_SUBTEST_2(testMatrixSqrt(MatrixXcd(12,12))); + CALL_SUBTEST_3(testMatrixSqrt(Matrix4f())); + CALL_SUBTEST_4(testMatrixSqrt(Matrix(9, 9))); + CALL_SUBTEST_5(testMatrixSqrt(Matrix())); + CALL_SUBTEST_5(testMatrixSqrt(Matrix,1,1>())); + } +} diff --git a/gtsam/3rdparty/Eigen/unsupported/test/mpreal/dlmalloc.c b/gtsam/3rdparty/Eigen/unsupported/test/mpreal/dlmalloc.c index a2c03b533..7ce8feb07 100755 --- a/gtsam/3rdparty/Eigen/unsupported/test/mpreal/dlmalloc.c +++ b/gtsam/3rdparty/Eigen/unsupported/test/mpreal/dlmalloc.c @@ -1267,7 +1267,7 @@ int mspace_mallopt(int, int); #endif /* MSPACES */ #ifdef __cplusplus -}; /* end of extern "C" */ +} /* end of extern "C" */ #endif /* __cplusplus */ /* diff --git a/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.cpp b/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.cpp index 373f23b12..5c23544ef 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.cpp @@ -3,14 +3,15 @@ Project homepage: http://www.holoborodko.com/pavel/ Contact e-mail: pavel@holoborodko.com - Copyright (c) 2008-2010 Pavel Holoborodko + Copyright (c) 2008-2011 Pavel Holoborodko Core Developers: Pavel Holoborodko, Dmitriy Gubanov, Konstantin Holoborodko. Contributors: Brian Gladman, Helmut Jarausch, Fokko Beekhof, Ulrich Mutze, - Heinz van Saanen, Pere Constans, Peter van Hoof. + Heinz van Saanen, Pere Constans, Peter van Hoof, Gael Guennebaud, + Tsai Chia Cheng, Alexei Zubanov. **************************************************************************** This library is free software; you can redistribute it and/or @@ -27,31 +28,21 @@ License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + **************************************************************************** **************************************************************************** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. Redistributions of any form whatsoever must retain the following - acknowledgment: - " - This product includes software developed by Pavel Holoborodko - Web: http://www.holoborodko.com/pavel/ - e-mail: pavel@holoborodko.com - " - 4. This software cannot be, by any means, used for any commercial - purpose without the prior permission of the copyright holder. - - Any of the above conditions can be waived if you get permission from - the copyright holder. + 3. The name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -66,9 +57,11 @@ SUCH DAMAGE. */ #include -#include #include "mpreal.h" + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) #include "dlmalloc.h" +#endif using std::ws; using std::cerr; @@ -79,62 +72,107 @@ using std::istream; namespace mpfr{ -mp_rnd_t mpreal::default_rnd = mpfr_get_default_rounding_mode(); -mp_prec_t mpreal::default_prec = mpfr_get_default_prec(); +mp_rnd_t mpreal::default_rnd = MPFR_RNDN; //(mpfr_get_default_rounding_mode)(); +mp_prec_t mpreal::default_prec = 64; //(mpfr_get_default_prec)(); int mpreal::default_base = 10; int mpreal::double_bits = -1; + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) bool mpreal::is_custom_malloc = false; +#endif // Default constructor: creates mp number and initializes it to 0. mpreal::mpreal() { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,default_prec); mpfr_set_ui(mp,0,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const mpreal& u) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,mpfr_get_prec(u.mp)); mpfr_set(mp,u.mp,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const mpfr_t u) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,mpfr_get_prec(u)); mpfr_set(mp,u,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const mpf_t u) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); - mpfr_init2(mp,mpf_get_prec(u)); +#endif + + mpfr_init2(mp,(mp_prec_t) mpf_get_prec(u)); // (gmp: mp_bitcnt_t) unsigned long -> long (mpfr: mp_prec_t) mpfr_set_f(mp,u,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const mpz_t u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_z(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const mpq_t u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_q(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const double u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + if(double_bits == -1 || fits_in_bits(u, double_bits)) { mpfr_init2(mp,prec); mpfr_set_d(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } else throw conversion_overflow(); @@ -142,51 +180,121 @@ mpreal::mpreal(const double u, mp_prec_t prec, mp_rnd_t mode) mpreal::mpreal(const long double u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_ld(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const unsigned long int u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_ui(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const unsigned int u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_ui(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const long int u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_si(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const int u, mp_prec_t prec, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_si(mp,u,mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } +#if defined (MPREAL_HAVE_INT64_SUPPORT) +mpreal::mpreal(const uint64_t u, mp_prec_t prec, mp_rnd_t mode) +{ + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) + set_custom_malloc(); +#endif + + mpfr_init2(mp,prec); + mpfr_set_uj(mp, u, mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; +} + +mpreal::mpreal(const int64_t u, mp_prec_t prec, mp_rnd_t mode) +{ + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) + set_custom_malloc(); +#endif + + mpfr_init2(mp,prec); + mpfr_set_sj(mp, u, mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; +} +#endif + mpreal::mpreal(const char* s, mp_prec_t prec, int base, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_str(mp, s, base, mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::mpreal(const std::string& s, mp_prec_t prec, int base, mp_rnd_t mode) { + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif + mpfr_init2(mp,prec); mpfr_set_str(mp, s.c_str(), base, mode); + + MPREAL_MSVC_DEBUGVIEW_CODE; } mpreal::~mpreal() @@ -198,18 +306,22 @@ mpreal::~mpreal() mpreal& mpreal::operator=(const char* s) { mpfr_t t; - + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); +#endif if(0==mpfr_init_set_str(t,s,default_base,default_rnd)) { - // We will rewrite mp anyway, so use flash it and resize - mpfr_set_prec(mp,mpfr_get_prec(t)); //<- added 01.04.2011 + // We will rewrite mp anyway, so flash it and resize + mpfr_set_prec(mp,mpfr_get_prec(t)); mpfr_set(mp,t,mpreal::default_rnd); mpfr_clear(t); + + MPREAL_MSVC_DEBUGVIEW_CODE; + }else{ mpfr_clear(t); - // cerr<<"fail to convert string"<xp?yp:xp); - - mpfr_hypot(a.mp, x.mp, y.mp, rnd_mode); - - return a; -} - const mpreal sum (const mpreal tab[], unsigned long int n, mp_rnd_t rnd_mode) { mpreal x; @@ -288,21 +385,6 @@ const mpreal sum (const mpreal tab[], unsigned long int n, mp_rnd_t rnd_mode) return x; } -const mpreal remainder (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode) -{ - mpreal a; - mp_prec_t yp, xp; - - yp = y.get_prec(); - xp = x.get_prec(); - - a.set_prec(yp>xp?yp:xp); - - mpfr_remainder(a.mp, x.mp, y.mp, rnd_mode); - - return a; -} - const mpreal remquo (long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode) { mpreal a; @@ -319,36 +401,71 @@ const mpreal remquo (long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mod } template -std::string to_string(T t, std::ios_base & (*f)(std::ios_base&)) +std::string toString(T t, std::ios_base & (*f)(std::ios_base&)) { std::ostringstream oss; oss << f << t; return oss.str(); } -mpreal::operator std::string() const +#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) + +std::string mpreal::toString(const std::string& format) const { - return to_string(); + char *s = NULL; + string out; + + if( !format.empty() ) + { + if(!(mpfr_asprintf(&s,format.c_str(),mp) < 0)) + { + out = std::string(s); + + mpfr_free_str(s); + } + } + + return out; } -std::string mpreal::to_string(size_t n, int b, mp_rnd_t mode) const +#endif + +std::string mpreal::toString(int n, int b, mp_rnd_t mode) const { - char *s, *ns = NULL; + (void)b; + (void)mode; +#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) + + // Use MPFR native function for output + char format[128]; + int digits; + + digits = n > 0 ? n : bits2digits(mpfr_get_prec(mp)); + + sprintf(format,"%%.%dRNg",digits); // Default format + + return toString(std::string(format)); + +#else + + char *s, *ns = NULL; size_t slen, nslen; mp_exp_t exp; string out; - + +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) set_custom_malloc(); - +#endif + if(mpfr_inf_p(mp)) { - if(mpfr_sgn(mp)>0) return "+@Inf@"; - else return "-@Inf@"; + if(mpfr_sgn(mp)>0) return "+Inf"; + else return "-Inf"; } if(mpfr_zero_p(mp)) return "0"; - if(mpfr_nan_p(mp)) return "@NaN@"; - + if(mpfr_nan_p(mp)) return "NaN"; + s = mpfr_get_str(NULL,&exp,b,0,mp,mode); ns = mpfr_get_str(NULL,&exp,b,n,mp,mode); @@ -419,8 +536,8 @@ std::string mpreal::to_string(size_t n, int b, mp_rnd_t mode) const // Make final string if(--exp) { - if(exp>0) out += "e+"+mpfr::to_string(exp,std::dec); - else out += "e"+mpfr::to_string(exp,std::dec); + if(exp>0) out += "e+"+mpfr::toString(exp,std::dec); + else out += "e"+mpfr::toString(exp,std::dec); } } @@ -429,79 +546,52 @@ std::string mpreal::to_string(size_t n, int b, mp_rnd_t mode) const }else{ return "conversion error!"; } +#endif } + ////////////////////////////////////////////////////////////////////////// // I/O ostream& operator<<(ostream& os, const mpreal& v) { - return os<(os.precision())); + return os<(os.precision())); } istream& operator>>(istream &is, mpreal& v) { - char c; - string s = ""; - mpfr_t t; - - mpreal::set_custom_malloc(); - - if(is.good()) - { - is>>ws; - while ((c = is.get())!=EOF) - { - if(c ==' ' || c == '\t' || c == '\n' || c == '\r') - { - is.putback(c); - break; - } - s += c; - } - - if(s.size() != 0) - { - // Protect current value from alternation in case of input error - // so some error handling(roll back) procedure can be used - - if(0==mpfr_init_set_str(t,s.c_str(),mpreal::default_base,mpreal::default_rnd)) - { - mpfr_set(v.mp,t,mpreal::default_rnd); - mpfr_clear(t); - - }else{ - mpfr_clear(t); - cerr<<"error reading from istream"<> tmp; + mpfr_set_str(v.mp, tmp.c_str(),mpreal::default_base,mpreal::default_rnd); return is; } -// Optimized dynamic memory allocation/(re-)deallocation. -void * mpreal::mpreal_allocate(size_t alloc_size) -{ - return(dlmalloc(alloc_size)); -} -void * mpreal::mpreal_reallocate(void *ptr, size_t /*old_size*/, size_t new_size) -{ - return(dlrealloc(ptr,new_size)); -} - -void mpreal::mpreal_free(void *ptr, size_t /*size*/) -{ - dlfree(ptr); -} - -inline void mpreal::set_custom_malloc(void) -{ - if(!is_custom_malloc) +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) + // Optimized dynamic memory allocation/(re-)deallocation. + void * mpreal::mpreal_allocate(size_t alloc_size) { - mp_set_memory_functions(mpreal_allocate,mpreal_reallocate,mpreal_free); - is_custom_malloc = true; + return(dlmalloc(alloc_size)); } -} + + void * mpreal::mpreal_reallocate(void *ptr, size_t old_size, size_t new_size) + { + return(dlrealloc(ptr,new_size)); + } + + void mpreal::mpreal_free(void *ptr, size_t size) + { + dlfree(ptr); + } + + inline void mpreal::set_custom_malloc(void) + { + if(!is_custom_malloc) + { + mp_set_memory_functions(mpreal_allocate,mpreal_reallocate,mpreal_free); + is_custom_malloc = true; + } + } +#endif + } diff --git a/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.h b/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.h index 96f474640..c640af947 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.h +++ b/gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.h @@ -1,16 +1,17 @@ /* - Multi-precision real number class. C++ interface fo MPFR library. + Multi-precision real number class. C++ interface for MPFR library. Project homepage: http://www.holoborodko.com/pavel/ Contact e-mail: pavel@holoborodko.com - Copyright (c) 2008-2010 Pavel Holoborodko + Copyright (c) 2008-2012 Pavel Holoborodko Core Developers: Pavel Holoborodko, Dmitriy Gubanov, Konstantin Holoborodko. Contributors: Brian Gladman, Helmut Jarausch, Fokko Beekhof, Ulrich Mutze, - Heinz van Saanen, Pere Constans, Peter van Hoof. + Heinz van Saanen, Pere Constans, Peter van Hoof, Gael Guennebaud, + Tsai Chia Cheng, Alexei Zubanov. **************************************************************************** This library is free software; you can redistribute it and/or @@ -39,19 +40,8 @@ notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - 3. Redistributions of any form whatsoever must retain the following - acknowledgment: - " - This product includes software developed by Pavel Holoborodko - Web: http://www.holoborodko.com/pavel/ - e-mail: pavel@holoborodko.com - " - - 4. This software cannot be, by any means, used for any commercial - purpose without the prior permission of the copyright holder. - - Any of the above conditions can be waived if you get permission from - the copyright holder. + 3. The name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -66,8 +56,8 @@ SUCH DAMAGE. */ -#ifndef __MP_REAL_H__ -#define __MP_REAL_H__ +#ifndef __MPREAL_H__ +#define __MPREAL_H__ #include #include @@ -76,22 +66,65 @@ #include #include -#include +// Options +#define MPREAL_HAVE_INT64_SUPPORT // int64_t support: available only for MSVC 2010 & GCC +#define MPREAL_HAVE_MSVC_DEBUGVIEW // Enable Debugger Visualizer (valid only for MSVC in "Debug" builds) // Detect compiler using signatures from http://predef.sourceforge.net/ #if defined(__GNUC__) && defined(__INTEL_COMPILER) #define IsInf(x) isinf(x) // Intel ICC compiler on Linux +#elif defined(_MSC_VER) // Microsoft Visual C++ + #define IsInf(x) (!_finite(x)) + #elif defined(__GNUC__) #define IsInf(x) std::isinf(x) // GNU C/C++ -#elif defined(_MSC_VER) - #define IsInf(x) (!_finite(x)) // Microsoft Visual C++ - #else #define IsInf(x) std::isinf(x) // Unknown compiler, just hope for C99 conformance #endif +#if defined(MPREAL_HAVE_INT64_SUPPORT) + + #define MPFR_USE_INTMAX_T // should be defined before mpfr.h + + #if defined(_MSC_VER) // is available only in msvc2010! + #if (_MSC_VER >= 1600) + #include + #else // MPFR relies on intmax_t which is available only in msvc2010 + #undef MPREAL_HAVE_INT64_SUPPORT // Besides, MPFR - MPIR have to be compiled with msvc2010 + #undef MPFR_USE_INTMAX_T // Since we cannot detect this, disable x64 by default + // Someone should change this manually if needed. + #endif + #endif + + #if defined (__MINGW32__) || defined(__MINGW64__) + #include // equivalent to msvc2010 + #elif defined (__GNUC__) + #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) + #undef MPREAL_HAVE_INT64_SUPPORT // remove all shaman dances for x64 builds since + #undef MPFR_USE_INTMAX_T // GCC already support x64 as of "long int" is 64-bit integer, nothing left to do + #else + #include // use int64_t, uint64_t otherwise. + #endif + #endif + +#endif + +#if defined(MPREAL_HAVE_MSVC_DEBUGVIEW) && defined(_MSC_VER) && defined(_DEBUG) +#define MPREAL_MSVC_DEBUGVIEW_CODE DebugView = toString() + #define MPREAL_MSVC_DEBUGVIEW_DATA std::string DebugView +#else + #define MPREAL_MSVC_DEBUGVIEW_CODE + #define MPREAL_MSVC_DEBUGVIEW_DATA +#endif + +#include + +#if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0)) + #include // needed for random() +#endif + namespace mpfr { class mpreal { @@ -99,19 +132,17 @@ private: mpfr_t mp; public: - static mp_rnd_t default_rnd; - static mp_prec_t default_prec; - static int default_base; - static int double_bits; - + static mp_rnd_t default_rnd; + static mp_prec_t default_prec; + static int default_base; + static int double_bits; + public: // Constructors && type conversion mpreal(); mpreal(const mpreal& u); - mpreal(const mpfr_t u); mpreal(const mpf_t u); - mpreal(const mpz_t u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); mpreal(const mpq_t u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); mpreal(const double u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); @@ -120,6 +151,12 @@ public: mpreal(const unsigned int u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); mpreal(const long int u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); mpreal(const int u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); + +#if defined (MPREAL_HAVE_INT64_SUPPORT) + mpreal(const uint64_t u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); + mpreal(const int64_t u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd); +#endif + mpreal(const char* s, mp_prec_t prec = default_prec, int base = default_base, mp_rnd_t mode = default_rnd); mpreal(const std::string& s, mp_prec_t prec = default_prec, int base = default_base, mp_rnd_t mode = default_rnd); @@ -155,6 +192,18 @@ public: mpreal& operator+=(const unsigned int u); mpreal& operator+=(const long int u); mpreal& operator+=(const int u); + +#if defined (MPREAL_HAVE_INT64_SUPPORT) + mpreal& operator+=(const int64_t u); + mpreal& operator+=(const uint64_t u); + mpreal& operator-=(const int64_t u); + mpreal& operator-=(const uint64_t u); + mpreal& operator*=(const int64_t u); + mpreal& operator*=(const uint64_t u); + mpreal& operator/=(const int64_t u); + mpreal& operator/=(const uint64_t u); +#endif + const mpreal operator+() const; mpreal& operator++ (); const mpreal operator++ (int); @@ -225,29 +274,49 @@ public: friend bool operator == (const mpreal& a, const mpreal& b); friend bool operator != (const mpreal& a, const mpreal& b); + // Optimized specializations for boolean operators + friend bool operator == (const mpreal& a, const unsigned long int b); + friend bool operator == (const mpreal& a, const unsigned int b); + friend bool operator == (const mpreal& a, const long int b); + friend bool operator == (const mpreal& a, const int b); + friend bool operator == (const mpreal& a, const long double b); + friend bool operator == (const mpreal& a, const double b); + // Type Conversion operators - inline operator long double() const; - inline operator double() const; - inline operator float() const; - inline operator unsigned long() const; - inline operator unsigned int() const; - inline operator long() const; - inline operator int() const; - operator std::string() const; - inline operator mpfr_ptr(); + long toLong() const; + unsigned long toULong() const; + double toDouble() const; + long double toLDouble() const; + +#if defined (MPREAL_HAVE_INT64_SUPPORT) + int64_t toInt64() const; + uint64_t toUInt64() const; +#endif + + // Get raw pointers + ::mpfr_ptr mpfr_ptr(); + ::mpfr_srcptr mpfr_srcptr() const; + + // Convert mpreal to string with n significant digits in base b + // n = 0 -> convert with the maximum available digits + std::string toString(int n = 0, int b = default_base, mp_rnd_t mode = default_rnd) const; + +#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) + std::string toString(const std::string& format) const; +#endif // Math Functions - friend const mpreal sqr(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal sqr (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal sqrt(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal sqrt(const unsigned long int v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal cbrt(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal root(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal pow(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal pow(const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal pow(const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal pow(const mpreal& a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal pow(const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal pow(const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal pow (const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal pow (const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal pow (const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal pow (const mpreal& a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal pow (const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal pow (const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal fabs(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal abs(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); @@ -264,8 +333,8 @@ public: friend const mpreal exp (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal exp2 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal exp10(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal log1p (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal expm1 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal log1p(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal expm1(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal cos(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal sin(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); @@ -279,15 +348,23 @@ public: friend const mpreal asin (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal atan (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal acot (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal asec (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal acsc (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal cosh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal sinh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal tanh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal sech (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal csch (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal coth (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal acosh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal asinh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal atanh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal acosh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal asinh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal atanh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal acoth (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal asech (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal acsch (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal fac_ui (unsigned long int v, mp_prec_t prec = mpreal::default_prec, mp_rnd_t rnd_mode = mpreal::default_rnd); @@ -299,12 +376,12 @@ public: friend const mpreal zeta (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal erf (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal erfc (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal _j0 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal _j1 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal _jn (long n, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal _y0 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal _y1 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); - friend const mpreal _yn (long n, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal besselj0 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal besselj1 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal besseljn (long n, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal bessely0 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal bessely1 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); + friend const mpreal besselyn (long n, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal fma (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal fms (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal agm (const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode = mpreal::default_rnd); @@ -324,9 +401,15 @@ public: friend const mpreal digamma(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal ai(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd); friend const mpreal urandom (gmp_randstate_t& state,mp_rnd_t rnd_mode = mpreal::default_rnd); // use gmp_randinit_default() to init state, gmp_randclear() to clear - friend bool _isregular(const mpreal& v); + friend bool isregular(const mpreal& v); #endif - + + // Uniformly distributed random number generation in [0,1] using + // Mersenne-Twister algorithm by default. + // Use parameter to setup seed, e.g.: random((unsigned)time(NULL)) + // Check urandom() for more precise control. + friend const mpreal random(unsigned int seed = 0); + // Exponent and mantissa manipulation friend const mpreal frexp(const mpreal& v, mp_exp_t* exp); friend const mpreal ldexp(const mpreal& v, mp_exp_t exp); @@ -376,22 +459,27 @@ public: #endif // Instance Checkers - friend bool _isnan(const mpreal& v); - friend bool _isinf(const mpreal& v); - friend bool _isnum(const mpreal& v); - friend bool _iszero(const mpreal& v); - friend bool _isint(const mpreal& v); + friend bool isnan (const mpreal& v); + friend bool isinf (const mpreal& v); + friend bool isfinite(const mpreal& v); + + friend bool isnum(const mpreal& v); + friend bool iszero(const mpreal& v); + friend bool isint(const mpreal& v); // Set/Get instance properties inline mp_prec_t get_prec() const; - inline void set_prec(mp_prec_t prec, mp_rnd_t rnd_mode = default_rnd); // Change precision with rounding mode - - // Set mpreal to +-inf, NaN - void set_inf(int sign = +1); - void set_nan(); + inline void set_prec(mp_prec_t prec, mp_rnd_t rnd_mode = default_rnd); // Change precision with rounding mode - // sign = -1 or +1 - void set_sign(int sign, mp_rnd_t rnd_mode = default_rnd); + // Aliases for get_prec(), set_prec() - needed for compatibility with std::complex interface + inline mpreal& setPrecision(int Precision, mp_rnd_t RoundingMode = (mpfr_get_default_rounding_mode)()); + inline int getPrecision() const; + + // Set mpreal to +/- inf, NaN, +/-0 + mpreal& setInf (int Sign = +1); + mpreal& setNan (); + mpreal& setZero (int Sign = +1); + mpreal& setSign (int Sign, mp_rnd_t RoundingMode = (mpfr_get_default_rounding_mode)()); //Exponent mp_exp_t get_exp(); @@ -411,36 +499,25 @@ public: static int get_double_bits(); static void set_default_rnd(mp_rnd_t rnd_mode); static mp_rnd_t get_default_rnd(); - static mp_exp_t get_emin (void); - static mp_exp_t get_emax (void); - static mp_exp_t get_emin_min (void); - static mp_exp_t get_emin_max (void); - static mp_exp_t get_emax_min (void); - static mp_exp_t get_emax_max (void); - static int set_emin (mp_exp_t exp); - static int set_emax (mp_exp_t exp); + static mp_exp_t get_emin (void); + static mp_exp_t get_emax (void); + static mp_exp_t get_emin_min (void); + static mp_exp_t get_emin_max (void); + static mp_exp_t get_emax_min (void); + static mp_exp_t get_emax_max (void); + static int set_emin (mp_exp_t exp); + static int set_emax (mp_exp_t exp); - // Get/Set conversions - // Convert mpreal to string with n significant digits in base b - // n = 0 -> convert with the maximum available digits - std::string to_string(size_t n = 0, int b = default_base, mp_rnd_t mode = default_rnd) const; - // Efficient swapping of two mpreal values friend void swap(mpreal& x, mpreal& y); //Min Max - macros is evil. Needed for systems which defines max and min globally as macros (e.g. Windows) //Hope that globally defined macros use > < operations only - #ifndef max - friend const mpreal max(const mpreal& x, const mpreal& y); - #endif - - #ifndef min - friend const mpreal min(const mpreal& x, const mpreal& y); - #endif - friend const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = default_rnd); friend const mpreal fmin(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = default_rnd); +#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC) + private: // Optimized dynamic memory allocation/(re-)deallocation. static bool is_custom_malloc; @@ -448,6 +525,20 @@ private: static void *mpreal_reallocate (void *ptr, size_t old_size, size_t new_size); static void mpreal_free (void *ptr, size_t size); inline static void set_custom_malloc (void); + +#endif + + +private: + // Human friendly Debug Preview in Visual Studio. + // Put one of these lines: + // + // mpfr::mpreal= ; Show value only + // mpfr::mpreal=, bits ; Show value & precision + // + // at the beginning of + // [Visual Studio Installation Folder]\Common7\Packages\Debugger\autoexp.dat + MPREAL_MSVC_DEBUGVIEW_DATA }; ////////////////////////////////////////////////////////////////////////// @@ -457,190 +548,63 @@ public: std::string why() { return "inexact conversion from floating point"; } }; -////////////////////////////////////////////////////////////////////////// +namespace internal{ + + // Use SFINAE to restrict arithmetic operations instantiation only for numeric types + // This is needed for smooth integration with libraries based on expression templates + template struct result_type {}; + + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; + +#if defined (MPREAL_HAVE_INT64_SUPPORT) + template <> struct result_type {typedef mpreal type;}; + template <> struct result_type {typedef mpreal type;}; +#endif +} + // + Addition -const mpreal operator+(const mpreal& a, const mpreal& b); +template +inline const typename internal::result_type::type + operator+(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) += rhs; } -// + Fast specialized addition - implemented through fast += operations -const mpreal operator+(const mpreal& a, const mpz_t b); -const mpreal operator+(const mpreal& a, const mpq_t b); -const mpreal operator+(const mpreal& a, const long double b); -const mpreal operator+(const mpreal& a, const double b); -const mpreal operator+(const mpreal& a, const unsigned long int b); -const mpreal operator+(const mpreal& a, const unsigned int b); -const mpreal operator+(const mpreal& a, const long int b); -const mpreal operator+(const mpreal& a, const int b); -const mpreal operator+(const mpreal& a, const char* b); -const mpreal operator+(const char* a, const mpreal& b); -const std::string operator+(const mpreal& a, const std::string b); -const std::string operator+(const std::string a, const mpreal& b); +template +inline const typename internal::result_type::type + operator+(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) += lhs; } -const mpreal operator+(const mpz_t b, const mpreal& a); -const mpreal operator+(const mpq_t b, const mpreal& a); -const mpreal operator+(const long double b, const mpreal& a); -const mpreal operator+(const double b, const mpreal& a); -const mpreal operator+(const unsigned long int b, const mpreal& a); -const mpreal operator+(const unsigned int b, const mpreal& a); -const mpreal operator+(const long int b, const mpreal& a); -const mpreal operator+(const int b, const mpreal& a); - -////////////////////////////////////////////////////////////////////////// // - Subtraction -const mpreal operator-(const mpreal& a, const mpreal& b); +template +inline const typename internal::result_type::type + operator-(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) -= rhs; } -// - Fast specialized subtraction - implemented through fast -= operations -const mpreal operator-(const mpreal& a, const mpz_t b); -const mpreal operator-(const mpreal& a, const mpq_t b); -const mpreal operator-(const mpreal& a, const long double b); -const mpreal operator-(const mpreal& a, const double b); -const mpreal operator-(const mpreal& a, const unsigned long int b); -const mpreal operator-(const mpreal& a, const unsigned int b); -const mpreal operator-(const mpreal& a, const long int b); -const mpreal operator-(const mpreal& a, const int b); -const mpreal operator-(const mpreal& a, const char* b); -const mpreal operator-(const char* a, const mpreal& b); +template +inline const typename internal::result_type::type + operator-(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) -= rhs; } -const mpreal operator-(const mpz_t b, const mpreal& a); -const mpreal operator-(const mpq_t b, const mpreal& a); -const mpreal operator-(const long double b, const mpreal& a); -//const mpreal operator-(const double b, const mpreal& a); - -////////////////////////////////////////////////////////////////////////// // * Multiplication -const mpreal operator*(const mpreal& a, const mpreal& b); +template +inline const typename internal::result_type::type + operator*(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) *= rhs; } -// * Fast specialized multiplication - implemented through fast *= operations -const mpreal operator*(const mpreal& a, const mpz_t b); -const mpreal operator*(const mpreal& a, const mpq_t b); -const mpreal operator*(const mpreal& a, const long double b); -const mpreal operator*(const mpreal& a, const double b); -const mpreal operator*(const mpreal& a, const unsigned long int b); -const mpreal operator*(const mpreal& a, const unsigned int b); -const mpreal operator*(const mpreal& a, const long int b); -const mpreal operator*(const mpreal& a, const int b); +template +inline const typename internal::result_type::type + operator*(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) *= lhs; } -const mpreal operator*(const mpz_t b, const mpreal& a); -const mpreal operator*(const mpq_t b, const mpreal& a); -const mpreal operator*(const long double b, const mpreal& a); -const mpreal operator*(const double b, const mpreal& a); -const mpreal operator*(const unsigned long int b, const mpreal& a); -const mpreal operator*(const unsigned int b, const mpreal& a); -const mpreal operator*(const long int b, const mpreal& a); -const mpreal operator*(const int b, const mpreal& a); - -////////////////////////////////////////////////////////////////////////// // / Division -const mpreal operator/(const mpreal& a, const mpreal& b); +template +inline const typename internal::result_type::type + operator/(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) /= rhs; } -// / Fast specialized division - implemented through fast /= operations -const mpreal operator/(const mpreal& a, const mpz_t b); -const mpreal operator/(const mpreal& a, const mpq_t b); -const mpreal operator/(const mpreal& a, const long double b); -const mpreal operator/(const mpreal& a, const double b); -const mpreal operator/(const mpreal& a, const unsigned long int b); -const mpreal operator/(const mpreal& a, const unsigned int b); -const mpreal operator/(const mpreal& a, const long int b); -const mpreal operator/(const mpreal& a, const int b); - -const mpreal operator/(const long double b, const mpreal& a); - -////////////////////////////////////////////////////////////////////////// -// Shifts operators - Multiplication/Division by a power of 2 -const mpreal operator<<(const mpreal& v, const unsigned long int k); -const mpreal operator<<(const mpreal& v, const unsigned int k); -const mpreal operator<<(const mpreal& v, const long int k); -const mpreal operator<<(const mpreal& v, const int k); - -const mpreal operator>>(const mpreal& v, const unsigned long int k); -const mpreal operator>>(const mpreal& v, const unsigned int k); -const mpreal operator>>(const mpreal& v, const long int k); -const mpreal operator>>(const mpreal& v, const int k); - -////////////////////////////////////////////////////////////////////////// -// Boolean operators -bool operator < (const mpreal& a, const unsigned long int b); -bool operator < (const mpreal& a, const unsigned int b); -bool operator < (const mpreal& a, const long int b); -bool operator < (const mpreal& a, const int b); -bool operator < (const mpreal& a, const long double b); -bool operator < (const mpreal& a, const double b); - -bool operator < (const unsigned long int a,const mpreal& b); -bool operator < (const unsigned int a, const mpreal& b); -bool operator < (const long int a, const mpreal& b); -bool operator < (const int a, const mpreal& b); -bool operator < (const long double a, const mpreal& b); -bool operator < (const double a, const mpreal& b); - -bool operator > (const mpreal& a, const unsigned long int b); -bool operator > (const mpreal& a, const unsigned int b); -bool operator > (const mpreal& a, const long int b); -bool operator > (const mpreal& a, const int b); -bool operator > (const mpreal& a, const long double b); -bool operator > (const mpreal& a, const double b); - -bool operator > (const unsigned long int a,const mpreal& b); -bool operator > (const unsigned int a, const mpreal& b); -bool operator > (const long int a, const mpreal& b); -bool operator > (const int a, const mpreal& b); -bool operator > (const long double a, const mpreal& b); -bool operator > (const double a, const mpreal& b); - -bool operator >= (const mpreal& a, const unsigned long int b); -bool operator >= (const mpreal& a, const unsigned int b); -bool operator >= (const mpreal& a, const long int b); -bool operator >= (const mpreal& a, const int b); -bool operator >= (const mpreal& a, const long double b); -bool operator >= (const mpreal& a, const double b); - -bool operator >= (const unsigned long int a,const mpreal& b); -bool operator >= (const unsigned int a, const mpreal& b); -bool operator >= (const long int a, const mpreal& b); -bool operator >= (const int a, const mpreal& b); -bool operator >= (const long double a, const mpreal& b); -bool operator >= (const double a, const mpreal& b); - -bool operator <= (const mpreal& a, const unsigned long int b); -bool operator <= (const mpreal& a, const unsigned int b); -bool operator <= (const mpreal& a, const long int b); -bool operator <= (const mpreal& a, const int b); -bool operator <= (const mpreal& a, const long double b); -bool operator <= (const mpreal& a, const double b); - -bool operator <= (const unsigned long int a,const mpreal& b); -bool operator <= (const unsigned int a, const mpreal& b); -bool operator <= (const long int a, const mpreal& b); -bool operator <= (const int a, const mpreal& b); -bool operator <= (const long double a, const mpreal& b); -bool operator <= (const double a, const mpreal& b); - -bool operator == (const mpreal& a, const unsigned long int b); -bool operator == (const mpreal& a, const unsigned int b); -bool operator == (const mpreal& a, const long int b); -bool operator == (const mpreal& a, const int b); -bool operator == (const mpreal& a, const long double b); -bool operator == (const mpreal& a, const double b); - -bool operator == (const unsigned long int a,const mpreal& b); -bool operator == (const unsigned int a, const mpreal& b); -bool operator == (const long int a, const mpreal& b); -bool operator == (const int a, const mpreal& b); -bool operator == (const long double a, const mpreal& b); -bool operator == (const double a, const mpreal& b); - -bool operator != (const mpreal& a, const unsigned long int b); -bool operator != (const mpreal& a, const unsigned int b); -bool operator != (const mpreal& a, const long int b); -bool operator != (const mpreal& a, const int b); -bool operator != (const mpreal& a, const long double b); -bool operator != (const mpreal& a, const double b); - -bool operator != (const unsigned long int a,const mpreal& b); -bool operator != (const unsigned int a, const mpreal& b); -bool operator != (const long int a, const mpreal& b); -bool operator != (const int a, const mpreal& b); -bool operator != (const long double a, const mpreal& b); -bool operator != (const double a, const mpreal& b); +template +inline const typename internal::result_type::type + operator/(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) /= rhs; } ////////////////////////////////////////////////////////////////////////// // sqrt @@ -704,22 +668,45 @@ const mpreal pow(const double a, const int b, mp_rnd_t rnd_mode = mpreal::defaul ////////////////////////////////////////////////////////////////////////// // Estimate machine epsilon for the given precision -inline const mpreal machine_epsilon(mp_prec_t prec = mpreal::default_prec); -inline const mpreal mpreal_min(mp_prec_t prec = mpreal::default_prec); -inline const mpreal mpreal_max(mp_prec_t prec = mpreal::default_prec); +// Returns smallest eps such that 1.0 + eps != 1.0 +inline const mpreal machine_epsilon(mp_prec_t prec = mpreal::get_default_prec()); + +// Returns the positive distance from abs(x) to the next larger in magnitude floating point number of the same precision as x +inline const mpreal machine_epsilon(const mpreal& x); + +inline const mpreal mpreal_min(mp_prec_t prec = mpreal::get_default_prec()); +inline const mpreal mpreal_max(mp_prec_t prec = mpreal::get_default_prec()); +inline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps); +inline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps); ////////////////////////////////////////////////////////////////////////// -// Implementation of inline functions +// Bits - decimal digits relation +// bits = ceil(digits*log[2](10)) +// digits = floor(bits*log[10](2)) + +inline mp_prec_t digits2bits(int d); +inline int bits2digits(mp_prec_t b); + +////////////////////////////////////////////////////////////////////////// +// min, max +const mpreal (max)(const mpreal& x, const mpreal& y); +const mpreal (min)(const mpreal& x, const mpreal& y); + +////////////////////////////////////////////////////////////////////////// +// Implementation ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Operators - Assignment inline mpreal& mpreal::operator=(const mpreal& v) { - if (this!= &v) + if (this != &v) { - mpfr_set_prec(mp,mpfr_get_prec(v.mp)); + mpfr_clear(mp); + mpfr_init2(mp,mpfr_get_prec(v.mp)); mpfr_set(mp,v.mp,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; } return *this; } @@ -727,24 +714,32 @@ inline mpreal& mpreal::operator=(const mpreal& v) inline mpreal& mpreal::operator=(const mpf_t v) { mpfr_set_f(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator=(const mpz_t v) { mpfr_set_z(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator=(const mpq_t v) { mpfr_set_q(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator=(const long double v) { mpfr_set_ld(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } @@ -753,6 +748,8 @@ inline mpreal& mpreal::operator=(const double v) if(double_bits == -1 || fits_in_bits(v, double_bits)) { mpfr_set_d(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; } else throw conversion_overflow(); @@ -763,24 +760,32 @@ inline mpreal& mpreal::operator=(const double v) inline mpreal& mpreal::operator=(const unsigned long int v) { mpfr_set_ui(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator=(const unsigned int v) { mpfr_set_ui(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator=(const long int v) { mpfr_set_si(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator=(const int v) { mpfr_set_si(mp,v,default_rnd); + + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } @@ -789,70 +794,90 @@ inline mpreal& mpreal::operator=(const int v) inline mpreal& mpreal::operator+=(const mpreal& v) { mpfr_add(mp,mp,v.mp,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator+=(const mpf_t u) { *this += mpreal(u); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator+=(const mpz_t u) { mpfr_add_z(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator+=(const mpq_t u) { mpfr_add_q(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator+= (const long double u) { - return *this += mpreal(u); + *this += mpreal(u); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator+= (const double u) { #if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) mpfr_add_d(mp,mp,u,default_rnd); - return *this; #else - return *this += mpreal(u); + *this += mpreal(u); #endif + + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator+=(const unsigned long int u) { mpfr_add_ui(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator+=(const unsigned int u) { mpfr_add_ui(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator+=(const long int u) { mpfr_add_si(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator+=(const int u) { mpfr_add_si(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } -inline const mpreal mpreal::operator+()const -{ - return mpreal(*this); -} +#if defined (MPREAL_HAVE_INT64_SUPPORT) +inline mpreal& mpreal::operator+=(const int64_t u){ *this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +inline mpreal& mpreal::operator+=(const uint64_t u){ *this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +inline mpreal& mpreal::operator-=(const int64_t u){ *this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +inline mpreal& mpreal::operator-=(const uint64_t u){ *this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +inline mpreal& mpreal::operator*=(const int64_t u){ *this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +inline mpreal& mpreal::operator*=(const uint64_t u){ *this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +inline mpreal& mpreal::operator/=(const int64_t u){ *this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +inline mpreal& mpreal::operator/=(const uint64_t u){ *this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } +#endif + +inline const mpreal mpreal::operator+()const { return mpreal(*this); } inline const mpreal operator+(const mpreal& a, const mpreal& b) { @@ -861,111 +886,9 @@ inline const mpreal operator+(const mpreal& a, const mpreal& b) else return mpreal(b) += a; } -inline const std::string operator+(const mpreal& a, const std::string b) -{ - return (std::string)a+b; -} - -inline const std::string operator+(const std::string a, const mpreal& b) -{ - return a+(std::string)b; -} - -inline const mpreal operator+(const mpreal& a, const mpz_t b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpreal& a, const char* b) -{ - return a+mpreal(b); -} - -inline const mpreal operator+(const char* a, const mpreal& b) -{ - return mpreal(a)+b; - -} - -inline const mpreal operator+(const mpreal& a, const mpq_t b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpreal& a, const long double b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpreal& a, const double b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpreal& a, const unsigned long int b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpreal& a, const unsigned int b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpreal& a, const long int b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpreal& a, const int b) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpz_t b, const mpreal& a) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const mpq_t b, const mpreal& a) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const long double b, const mpreal& a) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const double b, const mpreal& a) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const unsigned long int b, const mpreal& a) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const unsigned int b, const mpreal& a) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const long int b, const mpreal& a) -{ - return mpreal(a) += b; -} - -inline const mpreal operator+(const int b, const mpreal& a) -{ - return mpreal(a) += b; -} - inline mpreal& mpreal::operator++() { - *this += 1; - return *this; + return *this += 1; } inline const mpreal mpreal::operator++ (int) @@ -977,8 +900,7 @@ inline const mpreal mpreal::operator++ (int) inline mpreal& mpreal::operator--() { - *this -= 1; - return *this; + return *this -= 1; } inline const mpreal mpreal::operator-- (int) @@ -993,57 +915,68 @@ inline const mpreal mpreal::operator-- (int) inline mpreal& mpreal::operator-= (const mpreal& v) { mpfr_sub(mp,mp,v.mp,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator-=(const mpz_t v) { mpfr_sub_z(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator-=(const mpq_t v) { mpfr_sub_q(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator-=(const long double v) { - return *this -= mpreal(v); + *this -= mpreal(v); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator-=(const double v) { #if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) mpfr_sub_d(mp,mp,v,default_rnd); - return *this; #else - return *this -= mpreal(v); + *this -= mpreal(v); #endif + + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator-=(const unsigned long int v) { mpfr_sub_ui(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator-=(const unsigned int v) { mpfr_sub_ui(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator-=(const long int v) { mpfr_sub_si(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator-=(const int v) { mpfr_sub_si(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } @@ -1057,63 +990,14 @@ inline const mpreal mpreal::operator-()const inline const mpreal operator-(const mpreal& a, const mpreal& b) { // prec(a-b) = max(prec(a),prec(b)) - if(a.get_prec()>b.get_prec()) return mpreal(a) -= b; - else return -(mpreal(b) -= a); -} - -inline const mpreal operator-(const mpreal& a, const mpz_t b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpreal& a, const mpq_t b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpreal& a, const long double b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpreal& a, const double b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpreal& a, const unsigned long int b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpreal& a, const unsigned int b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpreal& a, const long int b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpreal& a, const int b) -{ - return mpreal(a) -= b; -} - -inline const mpreal operator-(const mpz_t b, const mpreal& a) -{ - return -(mpreal(a) -= b); -} - -inline const mpreal operator-(const mpq_t b, const mpreal& a) -{ - return -(mpreal(a) -= b); -} - -inline const mpreal operator-(const long double b, const mpreal& a) -{ - return -(mpreal(a) -= b); + if(a.getPrecision() >= b.getPrecision()) + { + return mpreal(a) -= b; + }else{ + mpreal x(a); + x.setPrecision(b.getPrecision()); + return x -= b; + } } inline const mpreal operator-(const double b, const mpreal& a) @@ -1123,7 +1007,7 @@ inline const mpreal operator-(const double b, const mpreal& a) mpfr_d_sub(x.mp,b,a.mp,mpreal::default_rnd); return x; #else - return -(mpreal(a) -= b); + return mpreal(b) -= a; #endif } @@ -1155,160 +1039,81 @@ inline const mpreal operator-(const int b, const mpreal& a) return x; } -inline const mpreal operator-(const mpreal& a, const char* b) -{ - return a-mpreal(b); -} - -inline const mpreal operator-(const char* a, const mpreal& b) -{ - return mpreal(a)-b; -} - ////////////////////////////////////////////////////////////////////////// // * Multiplication inline mpreal& mpreal::operator*= (const mpreal& v) { mpfr_mul(mp,mp,v.mp,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator*=(const mpz_t v) { mpfr_mul_z(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator*=(const mpq_t v) { mpfr_mul_q(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator*=(const long double v) { - return *this *= mpreal(v); + *this *= mpreal(v); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator*=(const double v) { #if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) mpfr_mul_d(mp,mp,v,default_rnd); - return *this; #else - return *this *= mpreal(v); + *this *= mpreal(v); #endif + + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator*=(const unsigned long int v) { mpfr_mul_ui(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator*=(const unsigned int v) { mpfr_mul_ui(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator*=(const long int v) { mpfr_mul_si(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator*=(const int v) { mpfr_mul_si(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline const mpreal operator*(const mpreal& a, const mpreal& b) { // prec(a*b) = max(prec(a),prec(b)) - if(a.get_prec()>b.get_prec()) return mpreal(a) *= b; - else return mpreal(b) *= a; -} - -inline const mpreal operator*(const mpreal& a, const mpz_t b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpreal& a, const mpq_t b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpreal& a, const long double b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpreal& a, const double b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpreal& a, const unsigned long int b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpreal& a, const unsigned int b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpreal& a, const long int b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpreal& a, const int b) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpz_t b, const mpreal& a) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const mpq_t b, const mpreal& a) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const long double b, const mpreal& a) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const double b, const mpreal& a) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const unsigned long int b, const mpreal& a) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const unsigned int b, const mpreal& a) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const long int b, const mpreal& a) -{ - return mpreal(a) *= b; -} - -inline const mpreal operator*(const int b, const mpreal& a) -{ - return mpreal(a) *= b; + if(a.getPrecision() >= b.getPrecision()) return mpreal(a) *= b; + else return mpreal(b) *= a; } ////////////////////////////////////////////////////////////////////////// @@ -1316,112 +1121,82 @@ inline const mpreal operator*(const int b, const mpreal& a) inline mpreal& mpreal::operator/=(const mpreal& v) { mpfr_div(mp,mp,v.mp,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator/=(const mpz_t v) { mpfr_div_z(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator/=(const mpq_t v) { mpfr_div_q(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator/=(const long double v) { - return *this /= mpreal(v); + *this /= mpreal(v); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator/=(const double v) { #if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) mpfr_div_d(mp,mp,v,default_rnd); - return *this; #else - return *this /= mpreal(v); + *this /= mpreal(v); #endif + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mpreal& mpreal::operator/=(const unsigned long int v) { mpfr_div_ui(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator/=(const unsigned int v) { mpfr_div_ui(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator/=(const long int v) { mpfr_div_si(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator/=(const int v) { mpfr_div_si(mp,mp,v,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline const mpreal operator/(const mpreal& a, const mpreal& b) { - mpreal x(a); - mp_prec_t pb; - mp_prec_t pa; - // prec(a/b) = max(prec(a),prec(b)) - pa = a.get_prec(); - pb = b.get_prec(); - if(pb>pa) x.set_prec(pb); + if(a.getPrecision() >= b.getPrecision()) + { + return mpreal(a) /= b; + }else{ - return x /= b; -} - -inline const mpreal operator/(const mpreal& a, const mpz_t b) -{ - return mpreal(a) /= b; -} - -inline const mpreal operator/(const mpreal& a, const mpq_t b) -{ - return mpreal(a) /= b; -} - -inline const mpreal operator/(const mpreal& a, const long double b) -{ - return mpreal(a) /= b; -} - -inline const mpreal operator/(const mpreal& a, const double b) -{ - return mpreal(a) /= b; -} - -inline const mpreal operator/(const mpreal& a, const unsigned long int b) -{ - return mpreal(a) /= b; -} - -inline const mpreal operator/(const mpreal& a, const unsigned int b) -{ - return mpreal(a) /= b; -} - -inline const mpreal operator/(const mpreal& a, const long int b) -{ - return mpreal(a) /= b; -} - -inline const mpreal operator/(const mpreal& a, const int b) -{ - return mpreal(a) /= b; + mpreal x(a); + x.setPrecision(b.getPrecision()); + return x /= b; + } } inline const mpreal operator/(const unsigned long int b, const mpreal& a) @@ -1452,12 +1227,6 @@ inline const mpreal operator/(const int b, const mpreal& a) return x; } -inline const mpreal operator/(const long double b, const mpreal& a) -{ - mpreal x(b); - return x/a; -} - inline const mpreal operator/(const double b, const mpreal& a) { #if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)) @@ -1465,8 +1234,7 @@ inline const mpreal operator/(const double b, const mpreal& a) mpfr_d_div(x.mp,b,a.mp,mpreal::default_rnd); return x; #else - mpreal x(b); - return x/a; + return mpreal(b) /= a; #endif } @@ -1475,48 +1243,56 @@ inline const mpreal operator/(const double b, const mpreal& a) inline mpreal& mpreal::operator<<=(const unsigned long int u) { mpfr_mul_2ui(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator<<=(const unsigned int u) { mpfr_mul_2ui(mp,mp,static_cast(u),default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator<<=(const long int u) { mpfr_mul_2si(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator<<=(const int u) { mpfr_mul_2si(mp,mp,static_cast(u),default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator>>=(const unsigned long int u) { mpfr_div_2ui(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator>>=(const unsigned int u) { mpfr_div_2ui(mp,mp,static_cast(u),default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator>>=(const long int u) { mpfr_div_2si(mp,mp,u,default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } inline mpreal& mpreal::operator>>=(const int u) { mpfr_div_2si(mp,mp,static_cast(u),default_rnd); + MPREAL_MSVC_DEBUGVIEW_CODE; return *this; } @@ -1592,468 +1368,67 @@ inline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode) ////////////////////////////////////////////////////////////////////////// //Boolean operators -inline bool operator > (const mpreal& a, const mpreal& b) -{ - return (mpfr_greater_p(a.mp,b.mp)!=0); -} - -inline bool operator > (const mpreal& a, const unsigned long int b) -{ - return a>mpreal(b); -} - -inline bool operator > (const mpreal& a, const unsigned int b) -{ - return a>mpreal(b); -} - -inline bool operator > (const mpreal& a, const long int b) -{ - return a>mpreal(b); -} - -inline bool operator > (const mpreal& a, const int b) -{ - return a>mpreal(b); -} - -inline bool operator > (const mpreal& a, const long double b) -{ - return a>mpreal(b); -} - -inline bool operator > (const mpreal& a, const double b) -{ - return a>mpreal(b); -} - -inline bool operator > (const unsigned long int a, const mpreal& b) -{ - return mpreal(a)>b; -} - -inline bool operator > (const unsigned int a, const mpreal& b) -{ - return mpreal(a)>b; -} - -inline bool operator > (const long int a, const mpreal& b) -{ - return mpreal(a)>b; -} - -inline bool operator > (const int a, const mpreal& b) -{ - return mpreal(a)>b; -} - -inline bool operator > (const long double a, const mpreal& b) -{ - return mpreal(a)>b; -} - -inline bool operator > (const double a, const mpreal& b) -{ - return mpreal(a)>b; -} - -inline bool operator >= (const mpreal& a, const mpreal& b) -{ - return (mpfr_greaterequal_p(a.mp,b.mp)!=0); -} - -inline bool operator >= (const mpreal& a, const unsigned long int b) -{ - return a>=mpreal(b); -} - -inline bool operator >= (const mpreal& a, const unsigned int b) -{ - return a>=mpreal(b); -} - -inline bool operator >= (const mpreal& a, const long int b) -{ - return a>=mpreal(b); -} - -inline bool operator >= (const mpreal& a, const int b) -{ - return a>=mpreal(b); -} - -inline bool operator >= (const mpreal& a, const long double b) -{ - return a>=mpreal(b); -} - -inline bool operator >= (const mpreal& a, const double b) -{ - return a>=mpreal(b); -} - -inline bool operator >= (const unsigned long int a,const mpreal& b) -{ - return mpreal(a)>=b; -} - -inline bool operator >= (const unsigned int a, const mpreal& b) -{ - return mpreal(a)>=b; -} - -inline bool operator >= (const long int a, const mpreal& b) -{ - return mpreal(a)>=b; -} - -inline bool operator >= (const int a, const mpreal& b) -{ - return mpreal(a)>=b; -} - -inline bool operator >= (const long double a, const mpreal& b) -{ - return mpreal(a)>=b; -} - -inline bool operator >= (const double a, const mpreal& b) -{ - return mpreal(a)>=b; -} - -inline bool operator < (const mpreal& a, const mpreal& b) -{ - return (mpfr_less_p(a.mp,b.mp)!=0); -} - -inline bool operator < (const mpreal& a, const unsigned long int b) -{ - return a (const mpreal& a, const mpreal& b){ return (mpfr_greater_p(a.mp,b.mp) !=0); } +inline bool operator >= (const mpreal& a, const mpreal& b){ return (mpfr_greaterequal_p(a.mp,b.mp) !=0); } +inline bool operator < (const mpreal& a, const mpreal& b){ return (mpfr_less_p(a.mp,b.mp) !=0); } +inline bool operator <= (const mpreal& a, const mpreal& b){ return (mpfr_lessequal_p(a.mp,b.mp) !=0); } +inline bool operator == (const mpreal& a, const mpreal& b){ return (mpfr_equal_p(a.mp,b.mp) !=0); } +inline bool operator != (const mpreal& a, const mpreal& b){ return (mpfr_lessgreater_p(a.mp,b.mp) !=0); } + +inline bool operator == (const mpreal& a, const unsigned long int b ){ return (mpfr_cmp_ui(a.mp,b) == 0); } +inline bool operator == (const mpreal& a, const unsigned int b ){ return (mpfr_cmp_ui(a.mp,b) == 0); } +inline bool operator == (const mpreal& a, const long int b ){ return (mpfr_cmp_si(a.mp,b) == 0); } +inline bool operator == (const mpreal& a, const int b ){ return (mpfr_cmp_si(a.mp,b) == 0); } +inline bool operator == (const mpreal& a, const long double b ){ return (mpfr_cmp_ld(a.mp,b) == 0); } +inline bool operator == (const mpreal& a, const double b ){ return (mpfr_cmp_d(a.mp,b) == 0); } + + +inline bool isnan (const mpreal& v){ return (mpfr_nan_p(v.mp) != 0); } +inline bool isinf (const mpreal& v){ return (mpfr_inf_p(v.mp) != 0); } +inline bool isfinite(const mpreal& v){ return (mpfr_number_p(v.mp) != 0); } +inline bool iszero (const mpreal& v){ return (mpfr_zero_p(v.mp) != 0); } +inline bool isint (const mpreal& v){ return (mpfr_integer_p(v.mp) != 0); } #if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0)) -inline bool _isregular(const mpreal& v) -{ - return (mpfr_regular_p(v.mp)); -} -#endif // MPFR 3.0.0 Specifics +inline bool isregular(const mpreal& v){ return (mpfr_regular_p(v.mp));} +#endif ////////////////////////////////////////////////////////////////////////// // Type Converters -inline mpreal::operator double() const +inline long mpreal::toLong() const { return mpfr_get_si(mp,GMP_RNDZ); } +inline unsigned long mpreal::toULong() const { return mpfr_get_ui(mp,GMP_RNDZ); } +inline double mpreal::toDouble() const { return mpfr_get_d(mp,default_rnd); } +inline long double mpreal::toLDouble() const { return mpfr_get_ld(mp,default_rnd); } + +#if defined (MPREAL_HAVE_INT64_SUPPORT) +inline int64_t mpreal::toInt64() const{ return mpfr_get_sj(mp,GMP_RNDZ); } +inline uint64_t mpreal::toUInt64() const{ return mpfr_get_uj(mp,GMP_RNDZ); } +#endif + +inline ::mpfr_ptr mpreal::mpfr_ptr() { return mp; } +inline ::mpfr_srcptr mpreal::mpfr_srcptr() const { return const_cast< ::mpfr_srcptr >(mp); } + +////////////////////////////////////////////////////////////////////////// +// Bits - decimal digits relation +// bits = ceil(digits*log[2](10)) +// digits = floor(bits*log[10](2)) + +inline mp_prec_t digits2bits(int d) { - return mpfr_get_d(mp,default_rnd); + const double LOG2_10 = 3.3219280948873624; + + d = 10>d?10:d; + + return (mp_prec_t)std::ceil((d)*LOG2_10); } -inline mpreal::operator float() const +inline int bits2digits(mp_prec_t b) { - return (float)mpfr_get_d(mp,default_rnd); -} + const double LOG10_2 = 0.30102999566398119; -inline mpreal::operator long double() const -{ - return mpfr_get_ld(mp,default_rnd); -} + b = 34>b?34:b; -inline mpreal::operator unsigned long() const -{ - return mpfr_get_ui(mp,GMP_RNDZ); -} - -inline mpreal::operator unsigned int() const -{ - return static_cast(mpfr_get_ui(mp,GMP_RNDZ)); -} - -inline mpreal::operator long() const -{ - return mpfr_get_si(mp,GMP_RNDZ); -} - -inline mpreal::operator int() const -{ - return static_cast(mpfr_get_si(mp,GMP_RNDZ)); -} - -inline mpreal::operator mpfr_ptr() -{ - return mp; + return (int)std::floor((b)*LOG10_2); } ////////////////////////////////////////////////////////////////////////// @@ -2064,9 +1439,44 @@ inline int sgn(const mpreal& v) return (r>0?-1:1); } -inline void mpreal::set_sign(int sign, mp_rnd_t rnd_mode) +inline mpreal& mpreal::setSign(int sign, mp_rnd_t RoundingMode) { - mpfr_setsign(mp,mp,(sign<0?1:0),rnd_mode); + mpfr_setsign(mp,mp,(sign<0?1:0),RoundingMode); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; +} + +inline int mpreal::getPrecision() const +{ + return mpfr_get_prec(mp); +} + +inline mpreal& mpreal::setPrecision(int Precision, mp_rnd_t RoundingMode) +{ + mpfr_prec_round(mp,Precision, RoundingMode); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; +} + +inline mpreal& mpreal::setInf(int sign) +{ + mpfr_set_inf(mp,sign); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; +} + +inline mpreal& mpreal::setNan() +{ + mpfr_set_nan(mp); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; +} + +inline mpreal& mpreal::setZero(int sign) +{ + mpfr_set_zero(mp,sign); + MPREAL_MSVC_DEBUGVIEW_CODE; + return *this; } inline mp_prec_t mpreal::get_prec() const @@ -2077,16 +1487,7 @@ inline mp_prec_t mpreal::get_prec() const inline void mpreal::set_prec(mp_prec_t prec, mp_rnd_t rnd_mode) { mpfr_prec_round(mp,prec,rnd_mode); -} - -inline void mpreal::set_inf(int sign) -{ - mpfr_set_inf(mp,sign); -} - -inline void mpreal::set_nan() -{ - mpfr_set_nan(mp); + MPREAL_MSVC_DEBUGVIEW_CODE; } inline mp_exp_t mpreal::get_exp () @@ -2096,7 +1497,9 @@ inline mp_exp_t mpreal::get_exp () inline int mpreal::set_exp (mp_exp_t e) { - return mpfr_set_exp(mp,e); + int x = mpfr_set_exp(mp, e); + MPREAL_MSVC_DEBUGVIEW_CODE; + return x; } inline const mpreal frexp(const mpreal& v, mp_exp_t* exp) @@ -2120,16 +1523,24 @@ inline const mpreal machine_epsilon(mp_prec_t prec) { // the smallest eps such that 1.0+eps != 1.0 // depends (of cause) on the precision - mpreal x(1,prec); - return nextabove(x)-x; + return machine_epsilon(mpreal(1,prec)); +} + +inline const mpreal machine_epsilon(const mpreal& x) +{ + if( x < 0) + { + return nextabove(-x)+x; + }else{ + return nextabove(x)-x; + } } inline const mpreal mpreal_min(mp_prec_t prec) { // min = 1/2*2^emin = 2^(emin-1) - - mpreal x(1,prec); - return x <<= mpreal::get_emin()-1; + + return mpreal(1,prec) << mpreal::get_emin()-1; } inline const mpreal mpreal_max(mp_prec_t prec) @@ -2138,8 +1549,25 @@ inline const mpreal mpreal_max(mp_prec_t prec) // and use emax-1 to prevent value to be +inf // max = 2^(emax-1) - mpreal x(1,prec); - return x <<= mpreal::get_emax()-1; + return mpreal(1,prec) << mpreal::get_emax()-1; +} + +inline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps) +{ + /* + maxUlps - a and b can be apart by maxUlps binary numbers. + */ + return abs(a - b) <= machine_epsilon((max)(abs(a), abs(b))) * maxUlps; +} + +inline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps) +{ + return abs(a - b) <= (min)(abs(a), abs(b)) * eps; +} + +inline bool isEqualFuzzy(const mpreal& a, const mpreal& b) +{ + return isEqualFuzzy(a,b,machine_epsilon((std::min)(abs(a), abs(b)))); } inline const mpreal modf(const mpreal& v, mpreal& n) @@ -2159,7 +1587,9 @@ inline int mpreal::check_range (int t, mp_rnd_t rnd_mode) inline int mpreal::subnormalize (int t,mp_rnd_t rnd_mode) { - return mpfr_subnormalize(mp,t,rnd_mode); + int r = mpfr_subnormalize(mp,t,rnd_mode); + MPREAL_MSVC_DEBUGVIEW_CODE; + return r; } inline mp_exp_t mpreal::get_emin (void) @@ -2234,13 +1664,13 @@ inline const mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode) inline const mpreal sqrt(const long int v, mp_rnd_t rnd_mode) { if (v>=0) return sqrt(static_cast(v),rnd_mode); - else return mpreal(); // NaN + else return mpreal().setNan(); // NaN } inline const mpreal sqrt(const int v, mp_rnd_t rnd_mode) { if (v>=0) return sqrt(static_cast(v),rnd_mode); - else return mpreal(); // NaN + else return mpreal().setNan(); // NaN } inline const mpreal sqrt(const long double v, mp_rnd_t rnd_mode) @@ -2403,6 +1833,36 @@ inline const mpreal atan (const mpreal& v, mp_rnd_t rnd_mode) return x; } +inline const mpreal acot (const mpreal& v, mp_rnd_t rnd_mode) +{ + return atan(1/v, rnd_mode); +} + +inline const mpreal asec (const mpreal& v, mp_rnd_t rnd_mode) +{ + return acos(1/v, rnd_mode); +} + +inline const mpreal acsc (const mpreal& v, mp_rnd_t rnd_mode) +{ + return asin(1/v, rnd_mode); +} + +inline const mpreal acoth (const mpreal& v, mp_rnd_t rnd_mode) +{ + return atanh(1/v, rnd_mode); +} + +inline const mpreal asech (const mpreal& v, mp_rnd_t rnd_mode) +{ + return acosh(1/v, rnd_mode); +} + +inline const mpreal acsch (const mpreal& v, mp_rnd_t rnd_mode) +{ + return asinh(1/v, rnd_mode); +} + inline const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode) { mpreal a; @@ -2481,6 +1941,36 @@ inline const mpreal atanh (const mpreal& v, mp_rnd_t rnd_mode) return x; } +inline const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode) +{ + mpreal a; + mp_prec_t yp, xp; + + yp = y.get_prec(); + xp = x.get_prec(); + + a.set_prec(yp>xp?yp:xp); + + mpfr_hypot(a.mp, x.mp, y.mp, rnd_mode); + + return a; +} + +inline const mpreal remainder (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode) +{ + mpreal a; + mp_prec_t yp, xp; + + yp = y.get_prec(); + xp = x.get_prec(); + + a.set_prec(yp>xp?yp:xp); + + mpfr_remainder(a.mp, x.mp, y.mp, rnd_mode); + + return a; +} + inline const mpreal fac_ui (unsigned long int v, mp_prec_t prec, mp_rnd_t rnd_mode) { mpreal x(0,prec); @@ -2509,11 +1999,15 @@ inline const mpreal eint (const mpreal& v, mp_rnd_t rnd_mode) return x; } -inline const mpreal gamma (const mpreal& v, mp_rnd_t rnd_mode) +inline const mpreal gamma (const mpreal& x, mp_rnd_t rnd_mode) { - mpreal x(v); - mpfr_gamma(x.mp,v.mp,rnd_mode); - return x; + mpreal FunctionValue(x); + + // x < 0: gamma(-x) = -pi/(x * gamma(x) * sin(pi*x)) + + mpfr_gamma(FunctionValue.mp, x.mp, rnd_mode); + + return FunctionValue; } inline const mpreal lngamma (const mpreal& v, mp_rnd_t rnd_mode) @@ -2557,42 +2051,42 @@ inline const mpreal erfc (const mpreal& v, mp_rnd_t rnd_mode) return x; } -inline const mpreal _j0 (const mpreal& v, mp_rnd_t rnd_mode) +inline const mpreal besselj0 (const mpreal& v, mp_rnd_t rnd_mode) { mpreal x(v); mpfr_j0(x.mp,v.mp,rnd_mode); return x; } -inline const mpreal _j1 (const mpreal& v, mp_rnd_t rnd_mode) +inline const mpreal besselj1 (const mpreal& v, mp_rnd_t rnd_mode) { mpreal x(v); mpfr_j1(x.mp,v.mp,rnd_mode); return x; } -inline const mpreal _jn (long n, const mpreal& v, mp_rnd_t rnd_mode) +inline const mpreal besseljn (long n, const mpreal& v, mp_rnd_t rnd_mode) { mpreal x(v); mpfr_jn(x.mp,n,v.mp,rnd_mode); return x; } -inline const mpreal _y0 (const mpreal& v, mp_rnd_t rnd_mode) +inline const mpreal bessely0 (const mpreal& v, mp_rnd_t rnd_mode) { mpreal x(v); mpfr_y0(x.mp,v.mp,rnd_mode); return x; } -inline const mpreal _y1 (const mpreal& v, mp_rnd_t rnd_mode) +inline const mpreal bessely1 (const mpreal& v, mp_rnd_t rnd_mode) { mpreal x(v); mpfr_y1(x.mp,v.mp,rnd_mode); return x; } -inline const mpreal _yn (long n, const mpreal& v, mp_rnd_t rnd_mode) +inline const mpreal besselyn (long n, const mpreal& v, mp_rnd_t rnd_mode) { mpreal x(v); mpfr_yn(x.mp,n,v.mp,rnd_mode); @@ -2780,7 +2274,6 @@ inline void swap(mpreal& a, mpreal& b) mpfr_swap(a.mp,b.mp); } - inline const mpreal (max)(const mpreal& x, const mpreal& y) { return (x>y?x:y); @@ -2835,7 +2328,7 @@ inline const mpreal urandomb (gmp_randstate_t& state) #if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0)) // use gmp_randinit_default() to init state, gmp_randclear() to clear -inline const mpreal urandom (gmp_randstate_t& state,mp_rnd_t rnd_mode) +inline const mpreal urandom (gmp_randstate_t& state, mp_rnd_t rnd_mode) { mpreal x; mpfr_urandom(x.mp,state,rnd_mode); @@ -2852,6 +2345,34 @@ inline const mpreal random2 (mp_size_t size, mp_exp_t exp) } #endif +// Uniformly distributed random number generation +// a = random(seed); <- initialization & first random number generation +// a = random(); <- next random numbers generation +// seed != 0 +inline const mpreal random(unsigned int seed) +{ + +#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0)) + static gmp_randstate_t state; + static bool isFirstTime = true; + + if(isFirstTime) + { + gmp_randinit_default(state); + gmp_randseed_ui(state,0); + isFirstTime = false; + } + + if(seed != 0) gmp_randseed_ui(state,seed); + + return mpfr::urandom(state); +#else + if(seed != 0) std::srand(seed); + return mpfr::mpreal(std::rand()/(double)RAND_MAX); +#endif + +} + ////////////////////////////////////////////////////////////////////////// // Set/Get global properties inline void mpreal::set_default_prec(mp_prec_t prec) @@ -2862,7 +2383,7 @@ inline void mpreal::set_default_prec(mp_prec_t prec) inline mp_prec_t mpreal::get_default_prec() { - return mpfr_get_default_prec(); + return (mpfr_get_default_prec)(); } inline void mpreal::set_default_base(int base) @@ -2883,7 +2404,7 @@ inline void mpreal::set_default_rnd(mp_rnd_t rnd_mode) inline mp_rnd_t mpreal::get_default_rnd() { - return mpfr_get_default_rounding_mode(); + return static_cast((mpfr_get_default_rounding_mode)()); } inline void mpreal::set_double_bits(int dbits) @@ -3197,8 +2718,7 @@ inline const mpreal pow(const double a, const int b, mp_rnd_t rnd_mode) { return pow(mpreal(a),static_cast(b),rnd_mode); // mpfr_pow_si } - -} +} // End of mpfr namespace // Explicit specialization of std::swap for mpreal numbers // Thus standard algorithms will use efficient version of swap (due to Koenig lookup) @@ -3212,4 +2732,4 @@ namespace std } } -#endif /* __MP_REAL_H__ */ +#endif /* __MPREAL_H__ */ diff --git a/gtsam/3rdparty/Eigen/unsupported/test/mpreal_support.cpp b/gtsam/3rdparty/Eigen/unsupported/test/mpreal_support.cpp index 53d388821..551af9db8 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/mpreal_support.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/mpreal_support.cpp @@ -2,6 +2,7 @@ #include #include #include +#include using namespace mpfr; using namespace std; @@ -24,6 +25,15 @@ void test_mpreal_support() MatrixXmp B = MatrixXmp::Random(s,s); MatrixXmp S = A.adjoint() * A; MatrixXmp X; + + // Basic stuffs + VERIFY_IS_APPROX(A.real(), A); + VERIFY(Eigen::internal::isApprox(A.array().abs2().sum(), A.squaredNorm())); + VERIFY_IS_APPROX(A.array().exp(), exp(A.array())); + VERIFY_IS_APPROX(A.array().abs2().sqrt(), A.array().abs()); + VERIFY_IS_APPROX(A.array().sin(), sin(A.array())); + VERIFY_IS_APPROX(A.array().cos(), cos(A.array())); + // Cholesky X = S.selfadjointView().llt().solve(B); @@ -39,6 +49,13 @@ void test_mpreal_support() VERIFY_IS_APPROX((S.selfadjointView() * eig.eigenvectors()), eig.eigenvectors() * eig.eigenvalues().asDiagonal()); } + + { + MatrixXmp A(8,3); A.setRandom(); + // test output (interesting things happen in this code) + std::stringstream stream; + stream << A; + } } extern "C" { diff --git a/gtsam/3rdparty/Eigen/unsupported/test/polynomialsolver.cpp b/gtsam/3rdparty/Eigen/unsupported/test/polynomialsolver.cpp index 54b6657c9..28e034179 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/polynomialsolver.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/polynomialsolver.cpp @@ -27,10 +27,6 @@ #include #include -#ifdef HAS_GSL -#include "gsl_helper.h" -#endif - using namespace std; namespace Eigen { @@ -73,32 +69,6 @@ bool aux_evalSolver( const POLYNOMIAL& pols, SOLVER& psolve ) cerr << endl; } - #ifdef HAS_GSL - if (internal::is_same< Scalar, double>::value) - { - typedef GslTraits Gsl; - RootsType gslRoots(deg); - Gsl::eigen_poly_solve( pols, gslRoots ); - EvalRootsType gslEvr( deg ); - for( int i=0; i() ); - if( !evalToZero ) - { - if( !gslEvalToZero ){ - cerr << "GSL also failed" << endl; } - else{ - cerr << "GSL did NOT failed" << endl; } - cerr << "GSL roots found: " << gslRoots.transpose() << endl; - cerr << "Abs value of the polynomial at the GSL roots: " << gslEvr.transpose() << endl; - cerr << endl; - } - } - #endif //< HAS_GSL - - std::vector rootModuli( roots.size() ); Map< EvalRootsType > aux( &rootModuli[0], roots.size() ); aux = roots.array().abs(); diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp index b1fd481e8..6c5c888ae 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp @@ -22,7 +22,11 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see . -#include "sparse.h" + +// import basic and product tests for deprectaed DynamicSparseMatrix +#define EIGEN_NO_DEPRECATED_WARNING +#include "sparse_basic.cpp" +#include "sparse_product.cpp" #include template @@ -145,10 +149,16 @@ template void sparse_extra(const SparseMatrixType& re void test_sparse_extra() { for(int i = 0; i < g_repeat; i++) { + int s = Eigen::internal::random(1,50); CALL_SUBTEST_1( sparse_extra(SparseMatrix(8, 8)) ); - CALL_SUBTEST_2( sparse_extra(SparseMatrix >(16, 16)) ); - CALL_SUBTEST_1( sparse_extra(SparseMatrix(33, 33)) ); + CALL_SUBTEST_2( sparse_extra(SparseMatrix >(s, s)) ); + CALL_SUBTEST_1( sparse_extra(SparseMatrix(s, s)) ); - CALL_SUBTEST_3( sparse_extra(DynamicSparseMatrix(8, 8)) ); + CALL_SUBTEST_3( sparse_extra(DynamicSparseMatrix(s, s)) ); +// CALL_SUBTEST_3(( sparse_basic(DynamicSparseMatrix(s, s)) )); +// CALL_SUBTEST_3(( sparse_basic(DynamicSparseMatrix(s, s)) )); + + CALL_SUBTEST_3( (sparse_product >()) ); + CALL_SUBTEST_3( (sparse_product >()) ); } } diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp deleted file mode 100644 index 03a26bcd2..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#include "sparse.h" -#include - -#ifdef EIGEN_CHOLMOD_SUPPORT -#include -#endif - -template void sparse_ldlt(int rows, int cols) -{ - static bool odd = true; - odd = !odd; - double density = (std::max)(8./(rows*cols), 0.01); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - - SparseMatrix m2(rows, cols); - DenseMatrix refMat2(rows, cols); - - DenseVector b = DenseVector::Random(cols); - DenseVector refX(cols), x(cols); - - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, 0, 0); - - SparseMatrix m3 = m2 * m2.adjoint(), m3_lo(rows,rows), m3_up(rows,rows); - DenseMatrix refMat3 = refMat2 * refMat2.adjoint(); - - refX = refMat3.template selfadjointView().ldlt().solve(b); - typedef SparseMatrix SparseSelfAdjointMatrix; - x = b; - SparseLDLT ldlt(m3); - if (ldlt.succeeded()) - ldlt.solveInPlace(x); - else - std::cerr << "warning LDLT failed\n"; - - VERIFY_IS_APPROX(refMat3.template selfadjointView() * x, b); - VERIFY(refX.isApprox(x,test_precision()) && "LDLT: default"); - -#ifdef EIGEN_CHOLMOD_SUPPORT - { - x = b; - SparseLDLT ldlt2(m3); - if (ldlt2.succeeded()) - { - ldlt2.solveInPlace(x); - VERIFY_IS_APPROX(refMat3.template selfadjointView() * x, b); - VERIFY(refX.isApprox(x,test_precision()) && "LDLT: cholmod solveInPlace"); - - x = ldlt2.solve(b); - VERIFY_IS_APPROX(refMat3.template selfadjointView() * x, b); - VERIFY(refX.isApprox(x,test_precision()) && "LDLT: cholmod solve"); - } - else - std::cerr << "warning LDLT failed\n"; - } -#endif - - // new Simplicial LLT - - - // new API - { - SparseMatrix m2(rows, cols); - DenseMatrix refMat2(rows, cols); - - DenseVector b = DenseVector::Random(cols); - DenseVector ref_x(cols), x(cols); - DenseMatrix B = DenseMatrix::Random(rows,cols); - DenseMatrix ref_X(rows,cols), X(rows,cols); - - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, 0, 0); - - for(int i=0; i m3 = m2 * m2.adjoint(), m3_lo(rows,rows), m3_up(rows,rows); - DenseMatrix refMat3 = refMat2 * refMat2.adjoint(); - - m3_lo.template selfadjointView().rankUpdate(m2,0); - m3_up.template selfadjointView().rankUpdate(m2,0); - - // with a single vector as the rhs - ref_x = refMat3.template selfadjointView().llt().solve(b); - - x = SimplicialCholesky, Lower>().setMode(odd ? SimplicialCholeskyLLt : SimplicialCholeskyLDLt).compute(m3).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "SimplicialCholesky: solve, full storage, lower, single dense rhs"); - - x = SimplicialCholesky, Upper>().setMode(odd ? SimplicialCholeskyLLt : SimplicialCholeskyLDLt).compute(m3).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "SimplicialCholesky: solve, full storage, upper, single dense rhs"); - - x = SimplicialCholesky, Lower>(m3_lo).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "SimplicialCholesky: solve, lower only, single dense rhs"); - - x = SimplicialCholesky, Upper>(m3_up).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "SimplicialCholesky: solve, upper only, single dense rhs"); - - - // with multiple rhs - ref_X = refMat3.template selfadjointView().llt().solve(B); - - X = SimplicialCholesky, Lower>().setMode(odd ? SimplicialCholeskyLLt : SimplicialCholeskyLDLt).compute(m3).solve(B); - VERIFY(ref_X.isApprox(X,test_precision()) && "SimplicialCholesky: solve, full storage, lower, multiple dense rhs"); - - X = SimplicialCholesky, Upper>().setMode(odd ? SimplicialCholeskyLLt : SimplicialCholeskyLDLt).compute(m3).solve(B); - VERIFY(ref_X.isApprox(X,test_precision()) && "SimplicialCholesky: solve, full storage, upper, multiple dense rhs"); - - - // with a sparse rhs -// SparseMatrix spB(rows,cols), spX(rows,cols); -// B.diagonal().array() += 1; -// spB = B.sparseView(0.5,1); -// -// ref_X = refMat3.template selfadjointView().llt().solve(DenseMatrix(spB)); -// -// spX = SimplicialCholesky, Lower>(m3).solve(spB); -// VERIFY(ref_X.isApprox(spX.toDense(),test_precision()) && "LLT: cholmod solve, multiple sparse rhs"); -// -// spX = SimplicialCholesky, Upper>(m3).solve(spB); -// VERIFY(ref_X.isApprox(spX.toDense(),test_precision()) && "LLT: cholmod solve, multiple sparse rhs"); - } - - - -// for(int i=0; i().ldlt().solve(b); -// typedef SparseMatrix SparseSelfAdjointMatrix; -// x = b; -// SparseLDLT ldlt(m2); -// if (ldlt.succeeded()) -// ldlt.solveInPlace(x); -// else -// std::cerr << "warning LDLT failed\n"; -// -// VERIFY_IS_APPROX(refMat2.template selfadjointView() * x, b); -// VERIFY(refX.isApprox(x,test_precision()) && "LDLT: default"); - - -} - -void test_sparse_ldlt() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(sparse_ldlt(8, 8) ); - int s = internal::random(1,300); - CALL_SUBTEST_2(sparse_ldlt >(s,s) ); - CALL_SUBTEST_1(sparse_ldlt(s,s) ); - } -} diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp deleted file mode 100644 index 5f8a7ce36..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#include "sparse.h" -#include - -#ifdef EIGEN_CHOLMOD_SUPPORT -#include -#endif - -template void sparse_llt(int rows, int cols) -{ - double density = (std::max)(8./(rows*cols), 0.01); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - - // TODO fix the issue with complex (see SparseLLT::solveInPlace) - SparseMatrix m2(rows, cols); - DenseMatrix refMat2(rows, cols); - - DenseVector b = DenseVector::Random(cols); - DenseVector ref_x(cols), x(cols); - DenseMatrix B = DenseMatrix::Random(rows,cols); - DenseMatrix ref_X(rows,cols), X(rows,cols); - - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, 0, 0); - - for(int i=0; i().llt().solve(b); - if (!NumTraits::IsComplex) - { - x = b; - SparseLLT > (m2).solveInPlace(x); - VERIFY(ref_x.isApprox(x,test_precision()) && "LLT: default"); - } - -#ifdef EIGEN_CHOLMOD_SUPPORT - // legacy API - { - // Cholmod, as configured in CholmodSupport.h, only supports self-adjoint matrices - SparseMatrix m3 = m2.adjoint()*m2; - DenseMatrix refMat3 = refMat2.adjoint()*refMat2; - - ref_x = refMat3.template selfadjointView().llt().solve(b); - - x = b; - SparseLLT, Cholmod>(m3).solveInPlace(x); - VERIFY((m3*x).isApprox(b,test_precision()) && "LLT legacy: cholmod solveInPlace"); - - x = SparseLLT, Cholmod>(m3).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "LLT legacy: cholmod solve"); - } - - // new API - { - // Cholmod, as configured in CholmodSupport.h, only supports self-adjoint matrices - SparseMatrix m3 = m2 * m2.adjoint(), m3_lo(rows,rows), m3_up(rows,rows); - DenseMatrix refMat3 = refMat2 * refMat2.adjoint(); - - m3_lo.template selfadjointView().rankUpdate(m2,0); - m3_up.template selfadjointView().rankUpdate(m2,0); - - // with a single vector as the rhs - ref_x = refMat3.template selfadjointView().llt().solve(b); - - x = CholmodDecomposition, Lower>(m3).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "LLT: cholmod solve, single dense rhs"); - - x = CholmodDecomposition, Upper>(m3).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "LLT: cholmod solve, single dense rhs"); - - x = CholmodDecomposition, Lower>(m3_lo).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "LLT: cholmod solve, single dense rhs"); - - x = CholmodDecomposition, Upper>(m3_up).solve(b); - VERIFY(ref_x.isApprox(x,test_precision()) && "LLT: cholmod solve, single dense rhs"); - - - // with multiple rhs - ref_X = refMat3.template selfadjointView().llt().solve(B); - - #ifndef EIGEN_DEFAULT_TO_ROW_MAJOR - // TODO make sure the API is properly documented about this fact - X = CholmodDecomposition, Lower>(m3).solve(B); - VERIFY(ref_X.isApprox(X,test_precision()) && "LLT: cholmod solve, multiple dense rhs"); - - X = CholmodDecomposition, Upper>(m3).solve(B); - VERIFY(ref_X.isApprox(X,test_precision()) && "LLT: cholmod solve, multiple dense rhs"); - #endif - - - // with a sparse rhs - SparseMatrix spB(rows,cols), spX(rows,cols); - B.diagonal().array() += 1; - spB = B.sparseView(0.5,1); - - ref_X = refMat3.template selfadjointView().llt().solve(DenseMatrix(spB)); - - spX = CholmodDecomposition, Lower>(m3).solve(spB); - VERIFY(ref_X.isApprox(spX.toDense(),test_precision()) && "LLT: cholmod solve, multiple sparse rhs"); - - spX = CholmodDecomposition, Upper>(m3).solve(spB); - VERIFY(ref_X.isApprox(spX.toDense(),test_precision()) && "LLT: cholmod solve, multiple sparse rhs"); - } -#endif - -} - -void test_sparse_llt() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(sparse_llt(8, 8) ); - int s = internal::random(1,300); - CALL_SUBTEST_2(sparse_llt >(s,s) ); - CALL_SUBTEST_1(sparse_llt(s,s) ); - } -} diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp deleted file mode 100644 index d58e85a0a..000000000 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . - -#include "sparse.h" -#include - -#ifdef EIGEN_UMFPACK_SUPPORT -#include -#endif - -#ifdef EIGEN_SUPERLU_SUPPORT -#include -#endif - -template void sparse_lu(int rows, int cols) -{ - double density = (std::max)(8./(rows*cols), 0.01); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - - DenseVector vec1 = DenseVector::Random(rows); - - std::vector zeroCoords; - std::vector nonzeroCoords; - - SparseMatrix m2(rows, cols); - DenseMatrix refMat2(rows, cols); - - DenseVector b = DenseVector::Random(cols); - DenseVector refX(cols), x(cols); - - initSparse(density, refMat2, m2, ForceNonZeroDiag, &zeroCoords, &nonzeroCoords); - - FullPivLU refLu(refMat2); - refX = refLu.solve(b); - #if defined(EIGEN_SUPERLU_SUPPORT) || defined(EIGEN_UMFPACK_SUPPORT) - Scalar refDet = refLu.determinant(); - #endif - x.setZero(); - // // SparseLU > (m2).solve(b,&x); - // // VERIFY(refX.isApprox(x,test_precision()) && "LU: default"); - - #ifdef EIGEN_UMFPACK_SUPPORT - { - // check solve - x.setZero(); - SparseLU,UmfPack> lu(m2); - VERIFY(lu.succeeded() && "umfpack LU decomposition failed"); - VERIFY(lu.solve(b,&x) && "umfpack LU solving failed"); - VERIFY(refX.isApprox(x,test_precision()) && "LU: umfpack"); - VERIFY_IS_APPROX(refDet,lu.determinant()); - // TODO check the extracted data - //std::cerr << slu.matrixL() << "\n"; - } - #endif - - #ifdef EIGEN_SUPERLU_SUPPORT - { - x.setZero(); - SparseLU,SuperLU> slu(m2); - if (slu.succeeded()) - { - if (slu.solve(b,&x)) { - VERIFY(refX.isApprox(x,test_precision()) && "LU: SuperLU"); - } - // std::cerr << refDet << " == " << slu.determinant() << "\n"; - if (slu.solve(b, &x, SvTranspose)) { - VERIFY(b.isApprox(m2.transpose() * x, test_precision())); - } - - if (slu.solve(b, &x, SvAdjoint)) { - VERIFY(b.isApprox(m2.adjoint() * x, test_precision())); - } - - if (!NumTraits::IsComplex) { - VERIFY_IS_APPROX(refDet,slu.determinant()); // FIXME det is not very stable for complex - } - } - } - #endif - -} - -void test_sparse_lu() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(sparse_lu(8, 8) ); - int s = internal::random(1,300); - CALL_SUBTEST_2(sparse_lu >(s,s) ); - CALL_SUBTEST_1(sparse_lu(s,s) ); - } -} diff --git a/gtsam/3rdparty/Eigen/unsupported/test/splines.cpp b/gtsam/3rdparty/Eigen/unsupported/test/splines.cpp new file mode 100644 index 000000000..fe98bf183 --- /dev/null +++ b/gtsam/3rdparty/Eigen/unsupported/test/splines.cpp @@ -0,0 +1,255 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2010-2011 Hauke Heibel +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "main.h" + +#include + +// lets do some explicit instantiations and thus +// force the compilation of all spline functions... +template class Spline; +template class Spline; + +template class Spline; +template class Spline; +template class Spline; +template class Spline; + +template class Spline; +template class Spline; + +template class Spline; +template class Spline; +template class Spline; +template class Spline; + +Spline closed_spline2d() +{ + RowVectorXd knots(12); + knots << 0, + 0, + 0, + 0, + 0.867193179093898, + 1.660330955342408, + 2.605084834823134, + 3.484154586374428, + 4.252699478956276, + 4.252699478956276, + 4.252699478956276, + 4.252699478956276; + + MatrixXd ctrls(8,2); + ctrls << -0.370967741935484, 0.236842105263158, + -0.231401860693277, 0.442245185027632, + 0.344361228532831, 0.773369994120753, + 0.828990216203802, 0.106550882647595, + 0.407270163678382, -1.043452922172848, + -0.488467813584053, -0.390098582530090, + -0.494657189446427, 0.054804824897884, + -0.370967741935484, 0.236842105263158; + ctrls.transposeInPlace(); + + return Spline(knots, ctrls); +} + +/* create a reference spline */ +Spline spline3d() +{ + RowVectorXd knots(11); + knots << 0, + 0, + 0, + 0.118997681558377, + 0.162611735194631, + 0.498364051982143, + 0.655098003973841, + 0.679702676853675, + 1.000000000000000, + 1.000000000000000, + 1.000000000000000; + + MatrixXd ctrls(8,3); + ctrls << 0.959743958516081, 0.340385726666133, 0.585267750979777, + 0.223811939491137, 0.751267059305653, 0.255095115459269, + 0.505957051665142, 0.699076722656686, 0.890903252535799, + 0.959291425205444, 0.547215529963803, 0.138624442828679, + 0.149294005559057, 0.257508254123736, 0.840717255983663, + 0.254282178971531, 0.814284826068816, 0.243524968724989, + 0.929263623187228, 0.349983765984809, 0.196595250431208, + 0.251083857976031, 0.616044676146639, 0.473288848902729; + ctrls.transposeInPlace(); + + return Spline(knots, ctrls); +} + +/* compares evaluations against known results */ +void eval_spline3d() +{ + Spline3d spline = spline3d(); + + RowVectorXd u(10); + u << 0.351659507062997, + 0.830828627896291, + 0.585264091152724, + 0.549723608291140, + 0.917193663829810, + 0.285839018820374, + 0.757200229110721, + 0.753729094278495, + 0.380445846975357, + 0.567821640725221; + + MatrixXd pts(10,3); + pts << 0.707620811535916, 0.510258911240815, 0.417485437023409, + 0.603422256426978, 0.529498282727551, 0.270351549348981, + 0.228364197569334, 0.423745615677815, 0.637687289287490, + 0.275556796335168, 0.350856706427970, 0.684295784598905, + 0.514519311047655, 0.525077224890754, 0.351628308305896, + 0.724152914315666, 0.574461155457304, 0.469860285484058, + 0.529365063753288, 0.613328702656816, 0.237837040141739, + 0.522469395136878, 0.619099658652895, 0.237139665242069, + 0.677357023849552, 0.480655768435853, 0.422227610314397, + 0.247046593173758, 0.380604672404750, 0.670065791405019; + pts.transposeInPlace(); + + for (int i=0; i::Interpolate(points,3); + + for (Eigen::DenseIndex i=0; i::Interpolate(points,3,chord_lengths); + + for (Eigen::DenseIndex i=0; i Date: Mon, 25 Jun 2012 17:02:44 +0000 Subject: [PATCH 468/914] Updated Eigen version in readme --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index c38c12306..729c3fdf1 100644 --- a/README +++ b/README @@ -37,7 +37,7 @@ of licensing in LICENSE and as follows: - CCOLAMD 2.73: Tim Davis' constrained column approximate minimum degree ordering library - http://www.cise.ufl.edu/research/sparse - Licenced under LGPL v2.1, provided in gtsam/3rdparty/CCOLAMD/Doc/lesser.txt - - Eigen 3.0.5: General C++ matrix and linear algebra library + - Eigen 3.1: General C++ matrix and linear algebra library - Licenced under LGPL v3, provided in gtsam/3rdparty/Eigen/COPYING.LGPL From c7734db4fa9e5133e263d7e7e22b3f4400842740 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 25 Jun 2012 21:19:38 +0000 Subject: [PATCH 469/914] Added formatting objects to linear and inference objects to allow for printing meaningful keys --- gtsam/inference/BayesTree-inl.h | 8 ++++---- gtsam/inference/BayesTree.h | 6 ++++-- gtsam/inference/BayesTreeCliqueBase-inl.h | 10 ++++----- gtsam/inference/BayesTreeCliqueBase.h | 4 ++-- gtsam/inference/Conditional.h | 25 ++++++++++++++--------- gtsam/linear/GaussianConditional.cpp | 6 +++--- gtsam/linear/GaussianConditional.h | 3 ++- gtsam/linear/GaussianFactor.h | 6 +++++- gtsam/linear/HessianFactor.cpp | 4 ++-- gtsam/linear/HessianFactor.h | 3 ++- gtsam/linear/JacobianFactor.cpp | 6 +++--- gtsam/linear/JacobianFactor.h | 3 ++- gtsam/nonlinear/ISAM2.h | 15 +++++++++----- gtsam/nonlinear/NonlinearISAM.cpp | 13 ------------ gtsam/nonlinear/Ordering.h | 14 ++++++++++++- 15 files changed, 72 insertions(+), 54 deletions(-) diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 5d2a64627..22dd0c62b 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -130,10 +130,10 @@ namespace gtsam { /* ************************************************************************* */ template - void BayesTree::Cliques::print(const std::string& s) const { + void BayesTree::Cliques::print(const std::string& s, const IndexFormatter& indexFormatter) const { std::cout << s << ":\n"; BOOST_FOREACH(sharedClique clique, *this) - clique->printTree(); + clique->printTree("", indexFormatter); } /* ************************************************************************* */ @@ -324,14 +324,14 @@ namespace gtsam { /* ************************************************************************* */ template - void BayesTree::print(const std::string& s) const { + void BayesTree::print(const std::string& s, const IndexFormatter& indexFormatter) const { if (root_.use_count() == 0) { printf("WARNING: BayesTree.print encountered a forest...\n"); return; } std::cout << s << ": clique size == " << size() << ", node size == " << nodes_.size() << std::endl; if (nodes_.empty()) return; - root_->printTree(""); + root_->printTree("", indexFormatter); } /* ************************************************************************* */ diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index b5168567c..9c38d6496 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -70,7 +70,8 @@ namespace gtsam { // A convenience class for a list of shared cliques struct Cliques : public std::list { - void print(const std::string& s = "Cliques") const; + void print(const std::string& s = "Cliques", + const IndexFormatter& indexFormatter = &(boost::lexical_cast)) const; bool equals(const Cliques& other, double tol = 1e-9) const; }; @@ -175,7 +176,8 @@ namespace gtsam { bool equals(const BayesTree& other, double tol = 1e-9) const; /** print */ - void print(const std::string& s = "") const; + void print(const std::string& s = "", + const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; /// @} /// @name Standard Interface diff --git a/gtsam/inference/BayesTreeCliqueBase-inl.h b/gtsam/inference/BayesTreeCliqueBase-inl.h index 7e0ba6a7b..f96566536 100644 --- a/gtsam/inference/BayesTreeCliqueBase-inl.h +++ b/gtsam/inference/BayesTreeCliqueBase-inl.h @@ -50,8 +50,8 @@ namespace gtsam { /* ************************************************************************* */ template - void BayesTreeCliqueBase::print(const std::string& s) const { - conditional_->print(s); + void BayesTreeCliqueBase::print(const std::string& s, const IndexFormatter& indexFormatter) const { + conditional_->print(s, indexFormatter); } /* ************************************************************************* */ @@ -65,10 +65,10 @@ namespace gtsam { /* ************************************************************************* */ template - void BayesTreeCliqueBase::printTree(const std::string& indent) const { - asDerived(this)->print(indent); + void BayesTreeCliqueBase::printTree(const std::string& indent, const IndexFormatter& indexFormatter) const { + asDerived(this)->print(indent, indexFormatter); BOOST_FOREACH(const derived_ptr& child, children_) - child->printTree(indent+" "); + child->printTree(indent+" ", indexFormatter); } /* ************************************************************************* */ diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index e1a7395da..9a2f6c54e 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -93,10 +93,10 @@ namespace gtsam { } /** print this node */ - void print(const std::string& s = "") const; + void print(const std::string& s = "", const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; /** print this node and entire subtree below it */ - void printTree(const std::string& indent="") const; + void printTree(const std::string& indent="", const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; /// @} /// @name Standard Interface diff --git a/gtsam/inference/Conditional.h b/gtsam/inference/Conditional.h index 0b5fca660..97f885596 100644 --- a/gtsam/inference/Conditional.h +++ b/gtsam/inference/Conditional.h @@ -23,6 +23,7 @@ #include // for noncopyable #include #include +#include #include #include @@ -98,13 +99,16 @@ public: Conditional(KeyType key) : FactorType(key), nrFrontals_(1) { assertInvariants(); } /** Single parent */ - Conditional(KeyType key, KeyType parent) : FactorType(key, parent), nrFrontals_(1) { assertInvariants(); } + Conditional(KeyType key, KeyType parent) + : FactorType(key, parent), nrFrontals_(1) { assertInvariants(); } /** Two parents */ - Conditional(KeyType key, KeyType parent1, KeyType parent2) : FactorType(key, parent1, parent2), nrFrontals_(1) { assertInvariants(); } + Conditional(KeyType key, KeyType parent1, KeyType parent2) + : FactorType(key, parent1, parent2), nrFrontals_(1) { assertInvariants(); } /** Three parents */ - Conditional(KeyType key, KeyType parent1, KeyType parent2, KeyType parent3) : FactorType(key, parent1, parent2, parent3), nrFrontals_(1) { assertInvariants(); } + Conditional(KeyType key, KeyType parent1, KeyType parent2, KeyType parent3) + : FactorType(key, parent1, parent2, parent3), nrFrontals_(1) { assertInvariants(); } /// @} /// @name Advanced Constructors @@ -126,8 +130,9 @@ public: /// @name Testable /// @{ - /** print */ - void print(const std::string& s = "Conditional") const; + /** print with optional formatter */ + void print(const std::string& s = "Conditional", + const boost::function& formatter = &(boost::lexical_cast) ) const; /** check equality */ template @@ -196,12 +201,12 @@ private: /* ************************************************************************* */ template -void Conditional::print(const std::string& s) const { +void Conditional::print(const std::string& s, const boost::function& formatter) const { std::cout << s << " P("; - BOOST_FOREACH(KeyType key, frontals()) std::cout << " " << key; - if (nrParents()>0) std::cout << " |"; - BOOST_FOREACH(KeyType parent, parents()) std::cout << " " << parent; - std::cout << ")" << std::endl; + BOOST_FOREACH(KeyType key, frontals()) std::cout << " " << formatter(key); + if (nrParents()>0) std::cout << " |"; + BOOST_FOREACH(KeyType parent, parents()) std::cout << " " << formatter(parent); + std::cout << ")" << std::endl; } } // gtsam diff --git a/gtsam/linear/GaussianConditional.cpp b/gtsam/linear/GaussianConditional.cpp index c048c8dd8..40d40a3a7 100644 --- a/gtsam/linear/GaussianConditional.cpp +++ b/gtsam/linear/GaussianConditional.cpp @@ -129,16 +129,16 @@ GaussianConditional& GaussianConditional::operator=(const GaussianConditional& r } /* ************************************************************************* */ -void GaussianConditional::print(const string &s) const +void GaussianConditional::print(const string &s, const IndexFormatter& formatter) const { cout << s << ": density on "; for(const_iterator it = beginFrontals(); it != endFrontals(); ++it) { - cout << (boost::format("[%1%]")%(*it)).str() << " "; + cout << (boost::format("[%1%]")%(formatter(*it))).str() << " "; } cout << endl; gtsam::print(Matrix(get_R()),"R"); for(const_iterator it = beginParents() ; it != endParents() ; ++it ) { - gtsam::print(Matrix(get_S(it)), (boost::format("A[%1%]")%(*it)).str()); + gtsam::print(Matrix(get_S(it)), (boost::format("A[%1%]")%(formatter(*it))).str()); } gtsam::print(Vector(get_d()),"d"); gtsam::print(sigmas_,"sigmas"); diff --git a/gtsam/linear/GaussianConditional.h b/gtsam/linear/GaussianConditional.h index 0dc8d771a..68b537c2d 100644 --- a/gtsam/linear/GaussianConditional.h +++ b/gtsam/linear/GaussianConditional.h @@ -138,7 +138,8 @@ public: GaussianConditional& operator=(const GaussianConditional& rhs); /** print */ - void print(const std::string& = "GaussianConditional") const; + void print(const std::string& = "GaussianConditional", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; /** equals function */ bool equals(const GaussianConditional &cg, double tol = 1e-9) const; diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index b1fd9338e..64e4e970c 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -23,6 +23,8 @@ #include #include +#include + #include #include @@ -81,7 +83,9 @@ namespace gtsam { typedef boost::shared_ptr shared_ptr; // Implementing Testable interface - virtual void print(const std::string& s = "") const = 0; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = &(boost::lexical_cast)) const = 0; + virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const = 0; virtual double error(const VectorValues& c) const = 0; /** 0.5*(A*x-b)'*D*(A*x-b) */ diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index 8628c95ef..86938a9bf 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -292,11 +292,11 @@ HessianFactor& HessianFactor::operator=(const HessianFactor& rhs) { } /* ************************************************************************* */ -void HessianFactor::print(const std::string& s) const { +void HessianFactor::print(const std::string& s, const IndexFormatter& formatter) const { cout << s << "\n"; cout << " keys: "; for(const_iterator key=this->begin(); key!=this->end(); ++key) - cout << *key << "(" << this->getDim(key) << ") "; + cout << formatter(*key) << "(" << this->getDim(key) << ") "; cout << "\n"; gtsam::print(Matrix(info_.range(0,info_.nBlocks(), 0,info_.nBlocks()).selfadjointView()), "Ab^T * Ab: "); } diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 46955d45a..92f5c06d0 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -218,7 +218,8 @@ namespace gtsam { } /** Print the factor for debugging and testing (implementing Testable) */ - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; /** Compare to another factor for testing (implementing Testable) */ virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const; diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index f2cea028e..038f8c718 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -244,15 +244,15 @@ namespace gtsam { } /* ************************************************************************* */ - void JacobianFactor::print(const string& s) const { + void JacobianFactor::print(const string& s, const IndexFormatter& formatter) const { cout << s << "\n"; if (empty()) { cout << " empty, keys: "; - BOOST_FOREACH(const Index& key, keys()) { cout << key << " "; } + BOOST_FOREACH(const Index& key, keys()) { cout << formatter(key) << " "; } cout << endl; } else { for(const_iterator key=begin(); key!=end(); ++key) - cout << boost::format("A[%1%]=\n")%*key << getA(key) << endl; + cout << boost::format("A[%1%]=\n")%formatter(*key) << getA(key) << endl; cout << "b=" << getb() << endl; model_->print("model"); } diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 7fb4211fb..14d073576 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -151,7 +151,8 @@ namespace gtsam { } // Implementing Testable interface - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const; Vector unweighted_error(const VectorValues& c) const; /** (A*x-b) */ diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 984284ebd..00c8a026c 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -254,7 +254,8 @@ public: /** Construct from an elimination result */ ISAM2Clique(const std::pair >& result) : - Base(result.first), cachedFactor_(result.second), gradientContribution_(result.first->get_R().cols() + result.first->get_S().cols()) { + Base(result.first), cachedFactor_(result.second), + gradientContribution_(result.first->get_R().cols() + result.first->get_S().cols()) { // Compute gradient contribution const ConditionalType& conditional(*result.first); // Rewrite -(R * P')'*d as -(d' * R * P')' for computational speed reasons @@ -278,14 +279,18 @@ public: const Vector& gradientContribution() const { return gradientContribution_; } bool equals(const This& other, double tol=1e-9) const { - return Base::equals(other) && ((!cachedFactor_ && !other.cachedFactor_) || (cachedFactor_ && other.cachedFactor_ && cachedFactor_->equals(*other.cachedFactor_, tol))); + return Base::equals(other) && + ((!cachedFactor_ && !other.cachedFactor_) + || (cachedFactor_ && other.cachedFactor_ + && cachedFactor_->equals(*other.cachedFactor_, tol))); } /** print this node */ - void print(const std::string& s = "") const { - Base::print(s); + void print(const std::string& s = "", + const IndexFormatter& formatter = &(boost::lexical_cast)) const { + Base::print(s,formatter); if(cachedFactor_) - cachedFactor_->print(s + "Cached: "); + cachedFactor_->print(s + "Cached: ", formatter); else std::cout << s << "Cached empty" << std::endl; if(gradientContribution_.rows() != 0) diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index 467f7bfe3..6b5ea31bc 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -30,19 +30,6 @@ using namespace std; namespace gtsam { -/* ************************************************************************* */ -// Create an index formatter that looks up the Key in an inverse ordering, then -// formats the key using the provided key formatter, used in saveGraph. -struct OrderingIndexFormatter { - Ordering::InvertedMap inverseOrdering; - const KeyFormatter& keyFormatter; - OrderingIndexFormatter(const Ordering& ordering, const KeyFormatter& keyFormatter) : - inverseOrdering(ordering.invert()), keyFormatter(keyFormatter) {} - string operator()(Index index) { - return keyFormatter(inverseOrdering.at(index)); - } -}; - /* ************************************************************************* */ void NonlinearISAM::saveGraph(const string& s, const KeyFormatter& keyFormatter) const { isam_.saveGraph(s, OrderingIndexFormatter(ordering_, keyFormatter)); diff --git a/gtsam/nonlinear/Ordering.h b/gtsam/nonlinear/Ordering.h index 1f2b8646e..098976a36 100644 --- a/gtsam/nonlinear/Ordering.h +++ b/gtsam/nonlinear/Ordering.h @@ -258,5 +258,17 @@ public: bool equals(const Unordered &t, double tol=0) const; }; -} +// Create an index formatter that looks up the Key in an inverse ordering, then +// formats the key using the provided key formatter, used in saveGraph. +struct OrderingIndexFormatter { + Ordering::InvertedMap inverseOrdering; + const KeyFormatter& keyFormatter; + OrderingIndexFormatter(const Ordering& ordering, const KeyFormatter& keyFormatter) : + inverseOrdering(ordering.invert()), keyFormatter(keyFormatter) {} + std::string operator()(Index index) { + return keyFormatter(inverseOrdering.at(index)); + } +}; + +} // \namespace gtsam From bb3220429eb865002c3a51146bacaf0d0e8a42c5 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Tue, 26 Jun 2012 17:55:51 +0000 Subject: [PATCH 470/914] Creating new wrap branch From 4e2aae01214a4e20e6dc260b1f15144fb032bc15 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 26 Jun 2012 18:49:30 +0000 Subject: [PATCH 471/914] formatting of comments, added parent() interface for Bayes Tree cliques --- gtsam/inference/BayesTree-inl.h | 3 +- gtsam/inference/BayesTreeCliqueBase.h | 3 + tests/testSubgraphPreconditioner.cpp | 297 +++++++++++++------------- 3 files changed, 152 insertions(+), 151 deletions(-) diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 22dd0c62b..8e9d769a6 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -67,6 +67,7 @@ namespace gtsam { of.close(); } + /* ************************************************************************* */ template void BayesTree::saveGraph(std::ostream &s, sharedClique clique, const IndexFormatter& indexFormatter, int parentnum) const { static int num = 0; @@ -101,7 +102,7 @@ namespace gtsam { } } - + /* ************************************************************************* */ template typename BayesTree::CliqueStats BayesTree::CliqueData::getStats() const { diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index 9a2f6c54e..d054fe43f 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -117,6 +117,9 @@ namespace gtsam { /** return the const reference of children */ const std::list& children() const { return children_; } + /** return a shared_ptr to the parent clique */ + derived_ptr parent() const { return parent_.lock(); } + /// @} /// @name Advanced Interface /// @{ diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index 382ac4cc7..417643e78 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -40,14 +40,14 @@ Key i3002 = 3002, i2002 = 2002, i1002 = 1002; Key i3001 = 3001, i2001 = 2001, i1001 = 1001; // TODO fix Ordering::equals, because the ordering *is* correct ! -/* ************************************************************************* * -TEST( SubgraphPreconditioner, planarOrdering ) -{ - // Check canonical ordering - Ordering expected, ordering = planarOrdering(3); - expected += i3003, i2003, i1003, i3002, i2002, i1002, i3001, i2001, i1001; - CHECK(assert_equal(expected,ordering)); -} +/* ************************************************************************* */ +//TEST( SubgraphPreconditioner, planarOrdering ) +//{ +// // Check canonical ordering +// Ordering expected, ordering = planarOrdering(3); +// expected += i3003, i2003, i1003, i3002, i2002, i1002, i3001, i2001, i1001; +// CHECK(assert_equal(expected,ordering)); +//} /* ************************************************************************* */ TEST( SubgraphPreconditioner, planarGraph ) @@ -66,148 +66,145 @@ TEST( SubgraphPreconditioner, planarGraph ) CHECK(assert_equal(xtrue,actual)); } -/* ************************************************************************* * -TEST( SubgraphPreconditioner, splitOffPlanarTree ) -{ - // Build a planar graph - GaussianFactorGraph A; - VectorValues xtrue; - boost::tie(A, xtrue) = planarGraph(3); - - // Get the spanning tree and constraints, and check their sizes - JacobianFactorGraph T, C; - // TODO big mess: GFG and JFG mess !!! - boost::tie(T, C) = splitOffPlanarTree(3, A); - LONGS_EQUAL(9,T.size()); - LONGS_EQUAL(4,C.size()); - - // Check that the tree can be solved to give the ground xtrue - GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(T).eliminate(); - VectorValues xbar = optimize(*R1); - CHECK(assert_equal(xtrue,xbar)); -} - -/* ************************************************************************* * -TEST( SubgraphPreconditioner, system ) -{ - // Build a planar graph - JacobianFactorGraph Ab; - VectorValues xtrue; - size_t N = 3; - boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b - - // Get the spanning tree and corresponding ordering - GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 - boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); - SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); - SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); - - // Eliminate the spanning tree to build a prior - SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 - VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 - - // Create Subgraph-preconditioned system - VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible - SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); - - // Create zero config - VectorValues zeros = VectorValues::Zero(xbar); - - // Set up y0 as all zeros - VectorValues y0 = zeros; - - // y1 = perturbed y0 - VectorValues y1 = zeros; - y1[i2003] = Vector_(2, 1.0, -1.0); - - // Check corresponding x values - VectorValues expected_x1 = xtrue, x1 = system.x(y1); - expected_x1[i2003] = Vector_(2, 2.01, 2.99); - expected_x1[i3003] = Vector_(2, 3.01, 2.99); - CHECK(assert_equal(xtrue, system.x(y0))); - CHECK(assert_equal(expected_x1,system.x(y1))); - - // Check errors -// DOUBLES_EQUAL(0,error(Ab,xtrue),1e-9); // TODO ! -// DOUBLES_EQUAL(3,error(Ab,x1),1e-9); // TODO ! - DOUBLES_EQUAL(0,error(system,y0),1e-9); - DOUBLES_EQUAL(3,error(system,y1),1e-9); - - // Test gradient in x - VectorValues expected_gx0 = zeros; - VectorValues expected_gx1 = zeros; - CHECK(assert_equal(expected_gx0,gradient(Ab,xtrue))); - expected_gx1[i1003] = Vector_(2, -100., 100.); - expected_gx1[i2002] = Vector_(2, -100., 100.); - expected_gx1[i2003] = Vector_(2, 200., -200.); - expected_gx1[i3002] = Vector_(2, -100., 100.); - expected_gx1[i3003] = Vector_(2, 100., -100.); - CHECK(assert_equal(expected_gx1,gradient(Ab,x1))); - - // Test gradient in y - VectorValues expected_gy0 = zeros; - VectorValues expected_gy1 = zeros; - expected_gy1[i1003] = Vector_(2, 2., -2.); - expected_gy1[i2002] = Vector_(2, -2., 2.); - expected_gy1[i2003] = Vector_(2, 3., -3.); - expected_gy1[i3002] = Vector_(2, -1., 1.); - expected_gy1[i3003] = Vector_(2, 1., -1.); - CHECK(assert_equal(expected_gy0,gradient(system,y0))); - CHECK(assert_equal(expected_gy1,gradient(system,y1))); - - // Check it numerically for good measure - // TODO use boost::bind(&SubgraphPreconditioner::error,&system,_1) - // Vector numerical_g1 = numericalGradient (error, y1, 0.001); - // Vector expected_g1 = Vector_(18, 0., 0., 0., 0., 2., -2., 0., 0., -2., 2., - // 3., -3., 0., 0., -1., 1., 1., -1.); - // CHECK(assert_equal(expected_g1,numerical_g1)); -} - -/* ************************************************************************* * -TEST( SubgraphPreconditioner, conjugateGradients ) -{ - // Build a planar graph - GaussianFactorGraph Ab; - VectorValues xtrue; - size_t N = 3; - boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b - - // Get the spanning tree and corresponding ordering - GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 - boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); - SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); - SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); - - // Eliminate the spanning tree to build a prior - Ordering ordering = planarOrdering(N); - SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 - VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 - - // Create Subgraph-preconditioned system - VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible - SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); - - // Create zero config y0 and perturbed config y1 - VectorValues y0 = VectorValues::Zero(xbar); - - VectorValues y1 = y0; - y1[i2003] = Vector_(2, 1.0, -1.0); - VectorValues x1 = system.x(y1); - - // Solve for the remaining constraints using PCG - ConjugateGradientParameters parameters; -// VectorValues actual = gtsam::conjugateGradients(system, y1, verbose, epsilon, epsilon, maxIterations); -// CHECK(assert_equal(y0,actual)); - - // Compare with non preconditioned version: - VectorValues actual2 = conjugateGradientDescent(Ab, x1, parameters); - CHECK(assert_equal(xtrue,actual2,1e-4)); -} +/* ************************************************************************* */ +//TEST( SubgraphPreconditioner, splitOffPlanarTree ) +//{ +// // Build a planar graph +// GaussianFactorGraph A; +// VectorValues xtrue; +// boost::tie(A, xtrue) = planarGraph(3); +// +// // Get the spanning tree and constraints, and check their sizes +// JacobianFactorGraph T, C; +// // TODO big mess: GFG and JFG mess !!! +// boost::tie(T, C) = splitOffPlanarTree(3, A); +// LONGS_EQUAL(9,T.size()); +// LONGS_EQUAL(4,C.size()); +// +// // Check that the tree can be solved to give the ground xtrue +// GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(T).eliminate(); +// VectorValues xbar = optimize(*R1); +// CHECK(assert_equal(xtrue,xbar)); +//} /* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} +//TEST( SubgraphPreconditioner, system ) +//{ +// // Build a planar graph +// JacobianFactorGraph Ab; +// VectorValues xtrue; +// size_t N = 3; +// boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b +// +// // Get the spanning tree and corresponding ordering +// GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 +// boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); +// SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); +// SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); +// +// // Eliminate the spanning tree to build a prior +// SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 +// VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 +// +// // Create Subgraph-preconditioned system +// VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible +// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); +// +// // Create zero config +// VectorValues zeros = VectorValues::Zero(xbar); +// +// // Set up y0 as all zeros +// VectorValues y0 = zeros; +// +// // y1 = perturbed y0 +// VectorValues y1 = zeros; +// y1[i2003] = Vector_(2, 1.0, -1.0); +// +// // Check corresponding x values +// VectorValues expected_x1 = xtrue, x1 = system.x(y1); +// expected_x1[i2003] = Vector_(2, 2.01, 2.99); +// expected_x1[i3003] = Vector_(2, 3.01, 2.99); +// CHECK(assert_equal(xtrue, system.x(y0))); +// CHECK(assert_equal(expected_x1,system.x(y1))); +// +// // Check errors +//// DOUBLES_EQUAL(0,error(Ab,xtrue),1e-9); // TODO ! +//// DOUBLES_EQUAL(3,error(Ab,x1),1e-9); // TODO ! +// DOUBLES_EQUAL(0,error(system,y0),1e-9); +// DOUBLES_EQUAL(3,error(system,y1),1e-9); +// +// // Test gradient in x +// VectorValues expected_gx0 = zeros; +// VectorValues expected_gx1 = zeros; +// CHECK(assert_equal(expected_gx0,gradient(Ab,xtrue))); +// expected_gx1[i1003] = Vector_(2, -100., 100.); +// expected_gx1[i2002] = Vector_(2, -100., 100.); +// expected_gx1[i2003] = Vector_(2, 200., -200.); +// expected_gx1[i3002] = Vector_(2, -100., 100.); +// expected_gx1[i3003] = Vector_(2, 100., -100.); +// CHECK(assert_equal(expected_gx1,gradient(Ab,x1))); +// +// // Test gradient in y +// VectorValues expected_gy0 = zeros; +// VectorValues expected_gy1 = zeros; +// expected_gy1[i1003] = Vector_(2, 2., -2.); +// expected_gy1[i2002] = Vector_(2, -2., 2.); +// expected_gy1[i2003] = Vector_(2, 3., -3.); +// expected_gy1[i3002] = Vector_(2, -1., 1.); +// expected_gy1[i3003] = Vector_(2, 1., -1.); +// CHECK(assert_equal(expected_gy0,gradient(system,y0))); +// CHECK(assert_equal(expected_gy1,gradient(system,y1))); +// +// // Check it numerically for good measure +// // TODO use boost::bind(&SubgraphPreconditioner::error,&system,_1) +// // Vector numerical_g1 = numericalGradient (error, y1, 0.001); +// // Vector expected_g1 = Vector_(18, 0., 0., 0., 0., 2., -2., 0., 0., -2., 2., +// // 3., -3., 0., 0., -1., 1., 1., -1.); +// // CHECK(assert_equal(expected_g1,numerical_g1)); +//} + +/* ************************************************************************* */ +//TEST( SubgraphPreconditioner, conjugateGradients ) +//{ +// // Build a planar graph +// GaussianFactorGraph Ab; +// VectorValues xtrue; +// size_t N = 3; +// boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b +// +// // Get the spanning tree and corresponding ordering +// GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 +// boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); +// SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); +// SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); +// +// // Eliminate the spanning tree to build a prior +// Ordering ordering = planarOrdering(N); +// SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 +// VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 +// +// // Create Subgraph-preconditioned system +// VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible +// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); +// +// // Create zero config y0 and perturbed config y1 +// VectorValues y0 = VectorValues::Zero(xbar); +// +// VectorValues y1 = y0; +// y1[i2003] = Vector_(2, 1.0, -1.0); +// VectorValues x1 = system.x(y1); +// +// // Solve for the remaining constraints using PCG +// ConjugateGradientParameters parameters; +//// VectorValues actual = gtsam::conjugateGradients(system, y1, verbose, epsilon, epsilon, maxIterations); +//// CHECK(assert_equal(y0,actual)); +// +// // Compare with non preconditioned version: +// VectorValues actual2 = conjugateGradientDescent(Ab, x1, parameters); +// CHECK(assert_equal(xtrue,actual2,1e-4)); +//} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From 6d776812d3de28a42de33321d240f7538960813f Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Tue, 26 Jun 2012 18:52:27 +0000 Subject: [PATCH 472/914] new wrap! :) --- .cproject | 1 + gtsam.h | 47 +++---- gtsam/linear/NoiseModel.h | 2 +- matlab/examples/OdometryExample.m | 3 +- wrap/Argument.cpp | 6 +- wrap/Argument.h | 2 + wrap/Class.cpp | 57 ++++---- wrap/Class.h | 5 +- wrap/Constructor.cpp | 81 ++++++++++-- wrap/Constructor.h | 17 ++- wrap/Method.cpp | 17 ++- wrap/Module.cpp | 29 +++-- wrap/ReturnValue.cpp | 44 ++++--- wrap/StaticMethod.cpp | 12 +- wrap/matlab.h | 209 +++++++++++------------------- wrap/utilities.cpp | 13 +- wrap/utilities.h | 5 +- 17 files changed, 312 insertions(+), 238 deletions(-) diff --git a/.cproject b/.cproject index c593a801b..7828f8165 100644 --- a/.cproject +++ b/.cproject @@ -2325,4 +2325,5 @@ + diff --git a/gtsam.h b/gtsam.h index 68ed6201d..941e39af7 100644 --- a/gtsam.h +++ b/gtsam.h @@ -497,7 +497,7 @@ class SimpleCamera { //************************************************************************* // inference //************************************************************************* -class Permutation { +/*class Permutation { // Standard Constructors and Named Constructors Permutation(); Permutation(size_t nVars); @@ -511,12 +511,12 @@ class Permutation { bool equals(const gtsam::Permutation& rhs, double tol) const; // Standard interface - size_t at(size_t variable) const; + //size_t at(size_t variable) const; size_t size() const; bool empty() const; void resize(size_t newSize); - gtsam::Permutation* permute(const gtsam::Permutation& permutation) const; - gtsam::Permutation* inverse() const; + //gtsam::Permutation permute(const gtsam::Permutation& permutation) const; + //gtsam::Permutation inverse() const; }; class IndexFactor { @@ -541,24 +541,24 @@ class IndexFactor { class IndexConditional { // Standard Constructors and Named Constructors - IndexConditional(); - IndexConditional(size_t key); - IndexConditional(size_t key, size_t parent); - IndexConditional(size_t key, size_t parent1, size_t parent2); - IndexConditional(size_t key, size_t parent1, size_t parent2, size_t parent3); + //IndexConditional(); + //IndexConditional(size_t key); + //IndexConditional(size_t key, size_t parent); + //IndexConditional(size_t key, size_t parent1, size_t parent2); + //IndexConditional(size_t key, size_t parent1, size_t parent2, size_t parent3); // FIXME: Must wrap std::vector for this to work //IndexFactor(size_t key, const std::vector& parents); //IndexConditional(const std::vector& keys, size_t nrFrontals); //template static shared_ptr FromKeys(const KEYS& keys, size_t nrFrontals); // Testable - void print(string s) const; - bool equals(const gtsam::IndexConditional& other, double tol) const; + //void print(string s) const; + //bool equals(const gtsam::IndexConditional& other, double tol) const; // Standard interface - size_t nrFrontals() const; - size_t nrParents() const; - gtsam::IndexFactor* toFactor() const; + //size_t nrFrontals() const; + //size_t nrParents() const; + //gtsam::IndexFactor* toFactor() const; }; #include @@ -672,7 +672,7 @@ class VariableIndex { size_t nFactors() const; size_t nEntries() const; void permute(const gtsam::Permutation& permutation); -}; +};*/ //************************************************************************* // linear @@ -681,11 +681,12 @@ class VariableIndex { #include namespace noiseModel { class Base { + void print(string s) const; }; class Gaussian { - static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); - static gtsam::noiseModel::Gaussian* Covariance(Matrix R); + //static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); + //static gtsam::noiseModel::Gaussian* Covariance(Matrix R); // Matrix R() const; // FIXME: cannot parse!!! void print(string s) const; }; @@ -712,7 +713,7 @@ class Unit { }///\namespace noiseModel -class Sampler { +/*class Sampler { Sampler(gtsam::noiseModel::Diagonal* model, int seed); Sampler(Vector sigmas, int seed); Sampler(int seed); @@ -723,7 +724,7 @@ class Sampler { Vector sample(); Vector sampleNewModel(gtsam::noiseModel::Diagonal* model); -}; +};*/ class VectorValues { VectorValues(); @@ -897,11 +898,11 @@ class Ordering { // Standard interface size_t nVars() const; size_t size() const; - size_t at(size_t key) const; + size_t at(size_t key); bool exists(size_t key) const; void insert(size_t key, size_t order); void push_back(size_t key); - void permuteWithInverse(const gtsam::Permutation& inversePermutation); + //void permuteWithInverse(const gtsam::Permutation& inversePermutation); // FIXME: Wrap InvertedMap as well //InvertedMap invert() const; }; @@ -958,9 +959,9 @@ class Marginals { #include class LevenbergMarquardtParams { - LevenbergMarquardtParams(); + /*LevenbergMarquardtParams(); LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose); - void print(string s) const; + void print(string s) const;*/ double getlambdaInitial() const ; double getlambdaFactor() const ; double getlambdaUpperBound() const; diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index c67828822..9d39b5674 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -262,7 +262,7 @@ namespace gtsam { * A diagonal noise model created by specifying a Vector of sigmas, i.e. * standard devations, the diagonal of the square root covariance matrix. */ - static shared_ptr Sigmas(const Vector& sigmas, bool smart = true); + static shared_ptr Sigmas(const Vector& sigmas, bool smart = false); /** * A diagonal noise model created by specifying a Vector of variances, i.e. diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index f203c858e..8b2439c78 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -29,6 +29,7 @@ odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); +pause %% print graph.print(sprintf('\nFactor graph:\n')); @@ -56,4 +57,4 @@ for i=1:result.size() end axis([-0.6 4.8 -1 1]) axis equal -view(2) \ No newline at end of file +view(2) diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index f51b86864..e2073ac8c 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -12,6 +12,7 @@ /** * @file Argument.ccp * @author Frank Dellaert + * @author Andrew Melim **/ #include @@ -53,14 +54,14 @@ void Argument::matlab_unwrap(FileWriter& file, const string& matlabName) const { file.oss << "boost::shared_ptr<" << cppType << "> " << name << " = unwrap_shared_ptr< "; else if (is_ref) // A reference: emit an "unwrap_shared_ptr" call and de-reference the pointer - file.oss << cppType << "& " << name << " = *unwrap_shared_ptr< "; + file.oss << " " << cppType << "& " << name << " = *unwrap_shared_ptr< "; else // Not a pointer or a reference: emit an "unwrap" call // unwrap is specified in matlab.h as a series of template specializations // that know how to unpack the expected MATLAB object // example: double tol = unwrap< double >(in[2]); // example: Vector v = unwrap< Vector >(in[1]); - file.oss << cppType << " " << name << " = unwrap< "; + file.oss << " " << cppType << " " << name << " = unwrap< "; file.oss << cppType << " >(" << matlabName; if (is_ptr || is_ref) file.oss << ", \"" << matlabType << "\""; @@ -126,3 +127,4 @@ void ArgumentList::matlab_unwrap(FileWriter& file, int start) const { } /* ************************************************************************* */ + diff --git a/wrap/Argument.h b/wrap/Argument.h index 000e3079a..b4c3fe4a7 100644 --- a/wrap/Argument.h +++ b/wrap/Argument.h @@ -13,6 +13,7 @@ * @file Argument.h * @brief arguments to constructors and methods * @author Frank Dellaert + * @author Andrew Melim **/ #pragma once @@ -65,6 +66,7 @@ struct ArgumentList: public std::vector { * @param start initial index for input array, set to 1 for method */ void matlab_unwrap(FileWriter& file, int start = 0) const; // MATLAB to C++ + }; } // \namespace wrap diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 6f6f91b0a..7280d5488 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -10,8 +10,9 @@ * -------------------------------------------------------------------------- */ /** - * @file Class.ccp + * @file Class.cpp * @author Frank Dellaert + * @author Andrew Melim **/ #include @@ -22,6 +23,7 @@ #include "Class.h" #include "utilities.h" +#include "Argument.h" using namespace std; using namespace wrap; @@ -43,13 +45,24 @@ void Class::matlab_proxy(const string& classFile) const { file.oss << " methods" << endl; // constructor file.oss << " function obj = " << matlabName << "(varargin)" << endl; - BOOST_FOREACH(Constructor c, constructors) - c.matlab_proxy_fragment(file,matlabName); - file.oss << " if nargin ~= 13 && obj.self == 0, error('" << matlabName << " constructor failed'); end" << endl; + //i is constructor id + int id = 0; + BOOST_FOREACH(ArgumentList a, constructor.args_list) + { + constructor.matlab_proxy_fragment(file,matlabName, id, a); + id++; + } + //Static constructor collect call + file.oss << " if nargin ==14, new_" << matlabName << "_(varargin{1},0); end" << endl; + file.oss << " if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('" << matlabName << " constructor failed'); end" << endl; file.oss << " end" << endl; // deconstructor file.oss << " function delete(obj)" << endl; - file.oss << " delete_" << matlabName << "(obj);" << endl; + file.oss << " if obj.self ~= 0" << endl; + file.oss << " fprintf(1,'MATLAB class deleting %x',obj.self);" << endl; + file.oss << " new_" << matlabName << "_(obj.self);" << endl; + file.oss << " obj.self = 0;" << endl; + file.oss << " end" << endl; file.oss << " end" << endl; file.oss << " function display(obj), obj.print(''); end" << endl; file.oss << " function disp(obj), obj.display; end" << endl; @@ -61,18 +74,19 @@ void Class::matlab_proxy(const string& classFile) const { } /* ************************************************************************* */ +//TODO: Consolidate into single file void Class::matlab_constructors(const string& toolboxPath) const { - BOOST_FOREACH(Constructor c, constructors) { - c.matlab_mfile (toolboxPath, qualifiedName()); - c.matlab_wrapper(toolboxPath, qualifiedName("::"), qualifiedName(), using_namespaces, includes); + /*BOOST_FOREACH(Constructor c, constructors) { + args_list.push_back(c.args); + }*/ + + BOOST_FOREACH(ArgumentList a, constructor.args_list) { + constructor.matlab_mfile(toolboxPath, qualifiedName(), a); } + constructor.matlab_wrapper(toolboxPath, qualifiedName("::"), qualifiedName(), + using_namespaces, includes); } -/* ************************************************************************* */ -void Class::matlab_deconstructor(const string& toolboxPath) const { - d.matlab_mfile (toolboxPath, qualifiedName()); - d.matlab_wrapper(toolboxPath, qualifiedName("::"), qualifiedName(), using_namespaces, includes); -} /* ************************************************************************* */ void Class::matlab_methods(const string& classPath) const { string matlabName = qualifiedName(), cppName = qualifiedName("::"); @@ -97,9 +111,7 @@ void Class::matlab_make_fragment(FileWriter& file, const string& mexFlags) const { string mex = "mex " + mexFlags + " "; string matlabClassName = qualifiedName(); - BOOST_FOREACH(Constructor c, constructors) - file.oss << mex << c.matlab_wrapper_name(matlabClassName) << ".cpp" << endl; - file.oss << mex << d.matlab_wrapper_name(matlabClassName) << ".cpp" << endl; + file.oss << mex << constructor.matlab_wrapper_name(matlabClassName) << ".cpp" << endl; BOOST_FOREACH(StaticMethod sm, static_methods) file.oss << mex << matlabClassName + "_" + sm.name << ".cpp" << endl; file.oss << endl << "cd @" << matlabClassName << endl; @@ -123,15 +135,12 @@ void Class::makefile_fragment(FileWriter& file) const { // // Point2: new_Point2_.$(MEXENDING) new_Point2_dd.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) - string matlabName = qualifiedName(); + string matlabName = qualifiedName(); - // collect names - vector file_names; - BOOST_FOREACH(Constructor c, constructors) { - string file_base = c.matlab_wrapper_name(matlabName); - file_names.push_back(file_base); - } - file_names.push_back(d.matlab_wrapper_name(matlabName)); + // collect names + vector file_names; + string file_base = constructor.matlab_wrapper_name(matlabName); + file_names.push_back(file_base); BOOST_FOREACH(StaticMethod c, static_methods) { string file_base = matlabName + "_" + c.name; file_names.push_back(file_base); diff --git a/wrap/Class.h b/wrap/Class.h index 875b3203e..fb9906716 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -13,6 +13,7 @@ * @file Class.h * @brief describe the C++ class that is being wrapped * @author Frank Dellaert + * @author Andrew Melim **/ #pragma once @@ -33,19 +34,17 @@ struct Class { // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name - std::vector constructors; ///< Class constructors std::vector methods; ///< Class methods std::vector static_methods; ///< Static methods std::vector namespaces; ///< Stack of namespaces std::vector using_namespaces; ///< default namespaces std::vector includes; ///< header include overrides - Deconstructor d; + Constructor constructor; ///< Class constructors bool verbose_; ///< verbose flag // And finally MATLAB code is emitted, methods below called by Module::matlab_code void matlab_proxy(const std::string& classFile) const; ///< emit proxy class void matlab_constructors(const std::string& toolboxPath) const; ///< emit constructor wrappers - void matlab_deconstructor(const std::string& toolboxPath) const; void matlab_methods(const std::string& classPath) const; ///< emit method wrappers void matlab_static_methods(const std::string& classPath) const; ///< emit static method wrappers void matlab_make_fragment(FileWriter& file, diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index fda7db1b4..0ee459389 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -12,10 +12,12 @@ /** * @file Constructor.ccp * @author Frank Dellaert + * @author Andrew Melim **/ #include #include +#include #include @@ -25,14 +27,16 @@ using namespace std; using namespace wrap; + /* ************************************************************************* */ string Constructor::matlab_wrapper_name(const string& className) const { - string str = "new_" + className + "_" + args.signature(); + string str = "new_" + className + "_"; return str; } /* ************************************************************************* */ -void Constructor::matlab_proxy_fragment(FileWriter& file, const string& className) const { +void Constructor::matlab_proxy_fragment(FileWriter& file, + const string& className, const int id, const ArgumentList args) const { size_t nrArgs = args.size(); // check for number of arguments... file.oss << " if (nargin == " << nrArgs; @@ -45,19 +49,17 @@ void Constructor::matlab_proxy_fragment(FileWriter& file, const string& classNam first=false; } // emit code for calling constructor - file.oss << "), obj.self = " << matlab_wrapper_name(className) << "("; + file.oss << "), obj.self = " << matlab_wrapper_name(className) << "(" << "0," << id; // emit constructor arguments - first = true; for(size_t i=0;i& using_namespaces, const vector& includes) const { + const vector& using_namespaces, + const vector& includes) const { string matlabName = matlab_wrapper_name(matlabClassName); // open destination wrapperFile @@ -91,12 +94,66 @@ void Constructor::matlab_wrapper(const string& toolboxPath, generateIncludes(file, name, includes); generateUsingNamespace(file, using_namespaces); + //Typedef boost::shared_ptr + file.oss << "typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; + file.oss << endl; + + //Generate collector + file.oss << "static std::set collector;" << endl; + file.oss << endl; + + //Generate the destructor function + file.oss << "struct Destruct" << endl; + file.oss << "{" << endl; + file.oss << " void operator() (Shared* p)" << endl; + file.oss << " {" << endl; + file.oss << " delete p;" << endl; + file.oss << " }" << endl; + file.oss << "};" << endl; + file.oss << endl; + + //Generate cleanup function + file.oss << "void cleanup(void) {" << endl; + file.oss << " mexPrintf(\"MEX-file new_gtsamDummy_ is terminating\");" << endl; + file.oss << " std::for_each( collector.begin(), collector.end(), Destruct() );" << endl; + file.oss << "}" << endl; + file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; file.oss << "{" << endl; - file.oss << " checkArguments(\"" << matlabName << "\",nargout,nargin," << args.size() << ");" << endl; - args.matlab_unwrap(file); // unwrap arguments - file.oss << " " << cppClassName << "* self = new " << cppClassName << "(" << args.names() << ");" << endl; // need qualified name, delim: "::" - file.oss << " out[0] = wrap_constructed(self,\"" << matlabClassName << "\");" << endl; // need matlab qualified name + //Cleanup function callback + file.oss << " mexAtExit(cleanup);" << endl; + file.oss << endl; + file.oss << " const mxArray* input = in[0];" << endl; + file.oss << " Shared* self = *(Shared**) mxGetData(input);" << endl; + file.oss << endl; + file.oss << " if(self) {" << endl; + file.oss << " if(nargin > 1) {" << endl; + file.oss << " collector.insert(self);" << endl; + file.oss << " std::cout << \"Collected\" << collector.size() << std::endl;" << endl; + file.oss << " }" << endl; + file.oss << " else if(collector.erase(self))" << endl; + file.oss << " delete self;" << endl; + file.oss << " } else {" << endl; + file.oss << " int nc = unwrap(in[1]);" << endl; + file.oss << " mexPrintf(\"MEX-file constructor\");" << endl << endl;; + + int i = 0; + BOOST_FOREACH(ArgumentList al, args_list) + { + file.oss << " if(nc == " << i <<") {" << endl; + al.matlab_unwrap(file, 2); // unwrap arguments, start at 1 + file.oss << " self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; + file.oss << " }" << endl; + i++; + } + + //file.oss << " self = construct(nc, in);" << endl; + file.oss << " collector.insert(self);" << endl; + file.oss << " std::cout << \"constructed \" << self << \", size=\" << collector.size() << std::endl;" << endl; + file.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);" << endl; + file.oss << " *reinterpret_cast (mxGetPr(out[0])) = self;" << endl; + file.oss << " }" << endl; + file.oss << "}" << endl; // close file diff --git a/wrap/Constructor.h b/wrap/Constructor.h index 4aba5b984..a766905b6 100644 --- a/wrap/Constructor.h +++ b/wrap/Constructor.h @@ -33,7 +33,8 @@ struct Constructor { } // Then the instance variables are set directly by the Module constructor - ArgumentList args; + // TODO:Vector of argument lists? + std::vector args_list; std::string name; bool verbose_; @@ -48,11 +49,14 @@ struct Constructor { * Create fragment to select constructor in proxy class, e.g., * if nargin == 2, obj.self = new_Pose3_RP(varargin{1},varargin{2}); end */ - void matlab_proxy_fragment(FileWriter& file, const std::string& className) const; + void matlab_proxy_fragment(FileWriter& file, + const std::string& className, const int i, + const ArgumentList args) const; /// m-file void matlab_mfile(const std::string& toolboxPath, - const std::string& qualifiedMatlabName) const; + const std::string& qualifiedMatlabName, + const ArgumentList args) const; /// cpp wrapper void matlab_wrapper(const std::string& toolboxPath, @@ -60,7 +64,12 @@ struct Constructor { const std::string& matlabClassName, const std::vector& using_namespaces, const std::vector& includes) const; + + /// constructor function + void generate_construct(FileWriter& file, const std::string& cppClassName, + std::vector& args_list) const; + }; -} // \namespace wrap +} // \namespace wrap diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 7686ecd2d..ccd36fe50 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -61,6 +61,15 @@ void Method::matlab_wrapper(const string& classPath, generateIncludes(file, className, includes); generateUsingNamespace(file, using_namespaces); + if(returnVal.isPair) + { + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; + } + else + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + + file.oss << "typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; // call file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; // start @@ -73,9 +82,9 @@ void Method::matlab_wrapper(const string& classPath, // get class pointer // example: shared_ptr = unwrap_shared_ptr< Test >(in[0], "Test"); - file.oss << " boost::shared_ptr<" << cppClassName << "> self = unwrap_shared_ptr< " << cppClassName - << " >(in[0],\"" << matlabClassName << "\");" << endl; - + file.oss << " mxArray* mxh = mxGetProperty(in[0],0,\"self\");" << endl; + file.oss << " Shared* self = *reinterpret_cast (mxGetPr(mxh));" << endl; + file.oss << " Shared obj = *self;" << endl; // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,1); @@ -84,7 +93,7 @@ void Method::matlab_wrapper(const string& classPath, file.oss << " "; if (returnVal.type1!="void") file.oss << returnVal.return_type(true,ReturnValue::pair) << " result = "; - file.oss << "self->" << name << "(" << args.names() << ");\n"; + file.oss << "obj->" << name << "(" << args.names() << ");\n"; // wrap result // example: out[0]=wrap(result); diff --git a/wrap/Module.cpp b/wrap/Module.cpp index e0771351a..972bacbee 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -26,8 +26,10 @@ #include #include #include +#include #include +#include using namespace std; using namespace wrap; @@ -52,8 +54,9 @@ Module::Module(const string& interfacePath, ReturnValue retVal0, retVal; Argument arg0, arg; ArgumentList args0, args; + vector arg_dup; ///keep track of duplicates Constructor constructor0(enable_verbose), constructor(enable_verbose); - Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); + //Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); Method method0(enable_verbose), method(enable_verbose); StaticMethod static_method0(enable_verbose), static_method(enable_verbose); Class cls0(enable_verbose),cls(enable_verbose); @@ -118,11 +121,12 @@ Module::Module(const string& interfacePath, Rule constructor_p = (className_p >> '(' >> argumentList_p >> ')' >> ';' >> !comments_p) - [assign_a(constructor.args,args)] - [assign_a(constructor.name,cls.name)] - [assign_a(args,args0)] - [push_back_a(cls.constructors, constructor)] - [assign_a(constructor,constructor0)]; + [push_back_a(constructor.args_list, args)] + [assign_a(args,args0)]; + //[assign_a(constructor.args,args)] + //[assign_a(constructor.name,cls.name)] + //[push_back_a(cls.constructors, constructor)] + //[assign_a(constructor,constructor0)]; Rule namespace_ret_p = namespace_name_p[push_back_a(namespaces_return)] >> str_p("::"); @@ -184,13 +188,16 @@ Module::Module(const string& interfacePath, >> '{' >> *(functions_p | comments_p) >> str_p("};")) + [assign_a(constructor.name, cls.name)] + [assign_a(cls.constructor, constructor)] [assign_a(cls.namespaces, namespaces)] [assign_a(cls.using_namespaces, using_namespace_current)] [append_a(cls.includes, namespace_includes)] - [assign_a(deconstructor.name,cls.name)] - [assign_a(cls.d, deconstructor)] + //[assign_a(deconstructor.name,cls.name)] + //[assign_a(cls.d, deconstructor)] [push_back_a(classes,cls)] - [assign_a(deconstructor,deconstructor0)] + //[assign_a(deconstructor,deconstructor0)] + [assign_a(constructor, constructor0)] [assign_a(cls,cls0)]; Rule namespace_def_p = @@ -336,7 +343,7 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, cls.matlab_proxy(classFile); // verify all of the function arguments - verifyArguments(validTypes, cls.constructors); + //TODO:verifyArguments(validTypes, cls.constructor.args_list); verifyArguments(validTypes, cls.static_methods); verifyArguments(validTypes, cls.methods); @@ -350,7 +357,7 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, cls.matlab_methods(classPath); // create deconstructor - cls.matlab_deconstructor(toolboxPath); + //cls.matlab_deconstructor(toolboxPath); // add lines to make m-file makeModuleMfile.oss << "%% " << cls.qualifiedName() << endl; diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index ace1159ec..087a1c6ef 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -3,6 +3,7 @@ * * @date Dec 1, 2011 * @author Alex Cunningham + * @author Andrew Melim */ #include @@ -17,11 +18,11 @@ using namespace wrap; string ReturnValue::return_type(bool add_ptr, pairing p) const { if (p==pair && isPair) { string str = "pair< " + - maybe_shared_ptr(add_ptr && isPtr1, qualifiedType1("::")) + ", " + - maybe_shared_ptr(add_ptr && isPtr2, qualifiedType2("::")) + " >"; + maybe_shared_ptr(add_ptr && isPtr1, qualifiedType1("::"), type1) + ", " + + maybe_shared_ptr(add_ptr && isPtr2, qualifiedType2("::"), type2) + " >"; return str; } else - return maybe_shared_ptr(add_ptr && isPtr1, (p==arg2)? qualifiedType2("::") : qualifiedType1("::")); + return maybe_shared_ptr(add_ptr && isPtr1, (p==arg2)? qualifiedType2("::") : qualifiedType1("::"), (p==arg2)? type2 : type1); } /* ************************************************************************* */ @@ -44,31 +45,44 @@ string ReturnValue::qualifiedType2(const string& delim) const { } /* ************************************************************************* */ +//TODO:Fix this void ReturnValue::wrap_result(FileWriter& file) const { string cppType1 = qualifiedType1("::"), matlabType1 = qualifiedType1(); string cppType2 = qualifiedType2("::"), matlabType2 = qualifiedType2(); if (isPair) { // first return value in pair - if (isPtr1) // if we already have a pointer - file.oss << " out[0] = wrap_shared_ptr(result.first,\"" << matlabType1 << "\");\n"; - else if (category1 == ReturnValue::CLASS) // if we are going to make one - file.oss << " out[0] = wrap_shared_ptr(boost::make_shared< " << cppType1 << " >(result.first),\"" << matlabType1 << "\");\n"; + if (isPtr1) {// if we already have a pointer + file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result.first);" << endl; + file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + } + else if (category1 == ReturnValue::CLASS) { // if we are going to make one + file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result.first));\n"; + file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + } else // if basis type file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result.first);\n"; // second return value in pair - if (isPtr2) // if we already have a pointer - file.oss << " out[1] = wrap_shared_ptr(result.second,\"" << matlabType2 << "\");\n"; - else if (category2 == ReturnValue::CLASS) // if we are going to make one - file.oss << " out[1] = wrap_shared_ptr(boost::make_shared< " << cppType2 << " >(result.second),\"" << matlabType2 << "\");\n"; + if (isPtr2) {// if we already have a pointer + file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(result.second);" << endl; + file.oss << " out[1] = wrap_collect_shared_ptr(ret,\"" << matlabType2 << "\");\n"; + } + else if (category2 == ReturnValue::CLASS) { // if we are going to make one + file.oss << " Shared" << type2 << "* ret = new Shared" << type2 << "(new " << cppType2 << "(result.first));\n"; + file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType2 << "\");\n"; + } else file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(result.second);\n"; } - else if (isPtr1) - file.oss << " out[0] = wrap_shared_ptr(result,\"" << matlabType1 << "\");\n"; - else if (category1 == ReturnValue::CLASS) - file.oss << " out[0] = wrap_shared_ptr(boost::make_shared< " << cppType1 << " >(result),\"" << matlabType1 << "\");\n"; + else if (isPtr1){ + file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result);" << endl; + file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + } + else if (category1 == ReturnValue::CLASS){ + file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result));\n"; + file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + } else if (matlabType1!="void") file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result);\n"; } diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 7bdba650b..a4fb3fbe8 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -10,8 +10,9 @@ * -------------------------------------------------------------------------- */ /** - * @file Method.ccp + * @file StaticMethod.ccp * @author Frank Dellaert + * @author Andrew Melim **/ #include @@ -62,6 +63,15 @@ void StaticMethod::matlab_wrapper(const string& toolboxPath, const string& class generateIncludes(file, className, includes); generateUsingNamespace(file, using_namespaces); + if(returnVal.isPair) + { + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; + } + else + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + + file.oss << "typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; // call file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; // start diff --git a/wrap/matlab.h b/wrap/matlab.h index 313cfaa9f..99dd0c6b3 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -41,6 +41,8 @@ extern "C" { #include #include #include +#include +#include using namespace std; using namespace boost; // not usual, but for conciseness of generated code @@ -311,6 +313,77 @@ gtsam::Matrix unwrap< gtsam::Matrix >(const mxArray* array) { return A; } +/* + [create_object] creates a MATLAB proxy class object with a mexhandle + in the self property. Matlab does not allow the creation of matlab + objects from within mex files, hence we resort to an ugly trick: we + invoke the proxy class constructor by calling MATLAB, and pass 13 + dummy arguments to let the constructor know we want an object without + the self property initialized. We then assign the mexhandle to self. +*/ +// TODO: think about memory +mxArray* create_object(const char *classname, mxArray* h) { + mxArray *result; + mxArray* dummy[13] = {h,h,h,h,h, h,h,h,h,h, h,h,h}; + mexCallMATLAB(1,&result,13,dummy,classname); + mxSetProperty(result, 0, "self", h); + return result; +} + +/* + * Similar to create object, this also collects the shared_ptr in addition + * to creating the dummy object. Mainly used for static constructor methods + * which don't have direct access to the function. + */ +mxArray* create_collect_object(const char *classname, mxArray* h){ + mxArray *result; + //First arg is a flag to collect + mxArray* dummy[14] = {h,h,h,h,h, h,h,h,h,h, h,h,h,h}; + mexCallMATLAB(1,&result,14,dummy,classname); + mxSetProperty(result, 0, "self", h); + cout << "Return collect" << endl; + return result; +} + +/* + When the user calls a method that returns a shared pointer, we create + an ObjectHandle from the shared_pointer and return it as a proxy + class to matlab. +*/ +template +mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { + mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast**> (mxGetPr(mxh)) = shared_ptr; + cout << "wrapped:" << mxh << endl << "end wrap" << endl; + //return mxh; + return create_object(classname, mxh); +} + +template +mxArray* wrap_collect_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { + mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast**> (mxGetPr(mxh)) = shared_ptr; + cout << "wrapped:" << mxh << endl << "end wrap" << endl; + //return mxh; + return create_collect_object(classname, mxh); +} + +template +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { + cout << "UNWRAP CALL" << endl; + + mxArray* mxh = mxGetProperty(obj,0,"self"); + if (mxGetClassID(mxh) != mxUINT32OR64_CLASS || mxIsComplex(mxh) + || mxGetM(mxh) != 1 || mxGetN(mxh) != 1) error( + "Parameter is not an Shared type."); + + cout << "unwrapped:" << mxh << endl; + boost::shared_ptr* spp = *reinterpret_cast**> (mxGetPr(mxh)); + cout << "unwrapped:" << spp << endl; + return *spp; +} + + //***************************************************************************** // Shared Pointer Handle // inspired by mexhandle, but using shared_ptr @@ -329,6 +402,9 @@ public: ObjectHandle(T* ptr) : type(&typeid(T)), t(ptr) { signature = this; + mexPrintf("Created Shared Pointer use_count = %li\n", t.use_count()); + mexPrintf("Created Pointer points to %d\n", t.get()); + } // Constructor for shared pointers @@ -336,6 +412,8 @@ public: ObjectHandle(boost::shared_ptr shared_ptr) : /*type(&typeid(T)),*/ t(shared_ptr) { signature = this; + mexPrintf("Created sp from sp use_count = %li\n", t.use_count()); + mexPrintf("Created sp from sp points to %d\n", t.get()); } ~ObjectHandle() { @@ -418,33 +496,7 @@ mxArray* wrap_constructed(Class* pointer, const char *classname) { return handle->to_mex_handle(); } -/* - [create_object] creates a MATLAB proxy class object with a mexhandle - in the self property. Matlab does not allow the creation of matlab - objects from within mex files, hence we resort to an ugly trick: we - invoke the proxy class constructor by calling MATLAB, and pass 13 - dummy arguments to let the constructor know we want an object without - the self property initialized. We then assign the mexhandle to self. -*/ -// TODO: think about memory -mxArray* create_object(const char *classname, mxArray* h) { - mxArray *result; - mxArray* dummy[13] = {h,h,h,h,h, h,h,h,h,h, h,h,h}; - mexCallMATLAB(1,&result,13,dummy,classname); - mxSetProperty(result, 0, "self", h); - return result; -} -/* - When the user calls a method that returns a shared pointer, we create - an ObjectHandle from the shared_pointer and return it as a proxy - class to matlab. -*/ -template -mxArray* wrap_shared_ptr(boost::shared_ptr< Class > shared_ptr, const char *classname) { - ObjectHandle* handle = new ObjectHandle(shared_ptr); - return create_object(classname,handle->to_mex_handle()); -} //***************************************************************************** // unwrapping a MATLAB proxy class to a C++ object reference @@ -457,116 +509,11 @@ mxArray* wrap_shared_ptr(boost::shared_ptr< Class > shared_ptr, const char *clas the ObjectHandle from the self property, and returns a shared pointer to the object. */ -template -boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { - #ifndef UNSAFE_WRAP - // Useful code to check argument type - // Problem, does not support inheritance - bool isClass = mxIsClass(obj, className.c_str()); - if (!isClass) { - mexPrintf("Expected %s, got %s\n", className.c_str(), mxGetClassName(obj)); - error("Argument has wrong type."); - } -#endif - mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxh==NULL) error("unwrap_reference: invalid wrap object"); - ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); - return handle->get_object(); -} -/* - * Specialized template for noise model. Checking their derived types properly - */ -// Isotropic -template <> -boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { -#ifndef UNSAFE_WRAP - bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); - bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); - if (!isIsotropic && !isUnit) { - mexPrintf("Expected gtsamnoiseModelIsotropic or derived classes, got %s\n", mxGetClassName(obj)); - error("Argument has wrong type."); - } -#endif - mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxh==NULL) error("unwrap_reference: invalid wrap object"); - ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); - return handle->get_object(); -} - -// Diagonal -template <> -boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { -#ifndef UNSAFE_WRAP - bool isDiagonal = mxIsClass(obj, "gtsamnoiseModelDiagonal"); - bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); - bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); - if (!isDiagonal && !isIsotropic && !isUnit ) { - mexPrintf("Expected gtsamnoiseModelDiagonal or derived classes, got %s\n", mxGetClassName(obj)); - error("Argument has wrong type."); - } -#endif - mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxh==NULL) error("unwrap_reference: invalid wrap object"); - ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); - return handle->get_object(); -} - -// Gaussian -template <> -boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { -#ifndef UNSAFE_WRAP - bool isGaussian = mxIsClass(obj, "gtsamnoiseModelGaussian"); - bool isDiagonal = mxIsClass(obj, "gtsamnoiseModelDiagonal"); - bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); - bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); - if (!isGaussian && !isDiagonal && !isIsotropic && !isUnit) { - mexPrintf("Expected gtsamnoiseModelGaussian or derived classes, got %s\n", mxGetClassName(obj)); - error("Argument has wrong type."); - } -#endif - mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxh==NULL) error("unwrap_reference: invalid wrap object"); - ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); - return handle->get_object(); -} - -// Base -template <> -boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { -#ifndef UNSAFE_WRAP - bool isBase = mxIsClass(obj, "gtsamnoiseModelBase"); - bool isGaussian = mxIsClass(obj, "gtsamnoiseModelGaussian"); - bool isDiagonal = mxIsClass(obj, "gtsamnoiseModelDiagonal"); - bool isIsotropic = mxIsClass(obj, "gtsamnoiseModelIsotropic"); - bool isUnit = mxIsClass(obj, "gtsamnoiseModelUnit"); - if (!isBase && !isGaussian && !isDiagonal && !isIsotropic && !isUnit) { - mexPrintf("Expected gtsamnoiseModelBase or derived classes, got %s\n", mxGetClassName(obj)); - error("Argument has wrong type."); - } -#endif - mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxh==NULL) error("unwrap_reference: invalid wrap object"); - ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); - return handle->get_object(); -} - -//end specialized templates template void delete_shared_ptr(const mxArray* obj, const string& className) { - //Why is this here? -#ifndef UNSAFE_WRAP - bool isClass = true;//mxIsClass(obj, className.c_str()); - if (!isClass) { - mexPrintf("Expected %s, got %s\n", className.c_str(), mxGetClassName(obj)); - error("Argument has wrong type."); - } -#endif mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxh==NULL) error("unwrap_reference: invalid wrap object"); ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); delete handle; } - -//***************************************************************************** diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index bfd1e77df..00606f930 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -12,6 +12,7 @@ /** * @file utilities.ccp * @author Frank Dellaert + * @author Andrew Melim **/ #include @@ -103,10 +104,12 @@ bool files_equal(const string& expected, const string& actual, bool skipheader) } /* ************************************************************************* */ -string maybe_shared_ptr(bool add, const string& type) { - string str = add? "boost::shared_ptr<" : ""; - str += type; - if (add) str += ">"; +string maybe_shared_ptr(bool add, const string& qtype, const string& type) { + string str = add? "Shared" : ""; + if (add) str += type; + else str += qtype; + + //if (add) str += ">"; return str; } @@ -121,6 +124,7 @@ void generateUsingNamespace(FileWriter& file, const vector& using_namesp void generateIncludes(FileWriter& file, const string& class_name, const vector& includes) { file.oss << "#include " << endl; + file.oss << "#include " << endl; bool added_include = false; BOOST_FOREACH(const string& s, includes) { if (!s.empty()) { @@ -134,4 +138,5 @@ void generateIncludes(FileWriter& file, const string& class_name, /* ************************************************************************* */ + } // \namespace wrap diff --git a/wrap/utilities.h b/wrap/utilities.h index 384ff3749..1eb0e249f 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -10,8 +10,9 @@ * -------------------------------------------------------------------------- */ /** - * @file utilities.ccp + * @file utilities.h * @author Frank Dellaert + * @author Andrew Melim **/ #pragma once @@ -84,7 +85,7 @@ bool assert_equal(const std::string& expected, const std::string& actual); bool assert_equal(const std::vector& expected, const std::vector& actual); // auxiliary function to wrap an argument into a shared_ptr template -std::string maybe_shared_ptr(bool add, const std::string& type); +std::string maybe_shared_ptr(bool add, const std::string& qtype, const std::string& type); /** * Creates the "using namespace [name];" declarations From 642515a322c6ae81564afbb6d658b99258c61e73 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Tue, 26 Jun 2012 20:40:15 +0000 Subject: [PATCH 473/914] All matlab tests complete. --- gtsam.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/gtsam.h b/gtsam.h index 941e39af7..e4993413a 100644 --- a/gtsam.h +++ b/gtsam.h @@ -921,6 +921,11 @@ class NonlinearFactor { // size_t dim() const; // FIXME: Doesn't link }; +class EasyFactorGraph { + EasyFactorGraph(); + void print(string s) const; +}; + class Values { Values(); size_t size() const; @@ -937,7 +942,7 @@ class KeyList { // Note: no print function size_t size() const; }; - +// FIXME // Actually a KeyVector #include class KeyVector { @@ -959,9 +964,9 @@ class Marginals { #include class LevenbergMarquardtParams { - /*LevenbergMarquardtParams(); + LevenbergMarquardtParams(); LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose); - void print(string s) const;*/ + void print(string s) const; double getlambdaInitial() const ; double getlambdaFactor() const ; double getlambdaUpperBound() const; @@ -1075,7 +1080,7 @@ class Graph { void addPosePrior(size_t key, const gtsam::Pose3& p, const gtsam::noiseModel::Base* model); void addRelativePose(size_t key1, size_t key2, const gtsam::Pose3& z, const gtsam::noiseModel::Base* model); pose3SLAM::Values optimize(const pose3SLAM::Values& initialEstimate, size_t verbosity) const; - // FIXME gtsam::LevenbergMarquardtOptimizer optimizer(const pose3SLAM::Values& initialEstimate, const gtsam::LevenbergMarquardtParams& parameters) const; + //gtsam::LevenbergMarquardtOptimizer optimizer(const pose3SLAM::Values& initialEstimate, const gtsam::LevenbergMarquardtParams& parameters) const; gtsam::Marginals marginals(const pose3SLAM::Values& solution) const; }; From ea0c85ef069c2d29e4c377c80b38b18eafb0938a Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Wed, 27 Jun 2012 16:22:12 +0000 Subject: [PATCH 474/914] Crash for some objects is now fixed --- wrap/Constructor.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 0ee459389..97a6af4fc 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -107,14 +107,13 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << "{" << endl; file.oss << " void operator() (Shared* p)" << endl; file.oss << " {" << endl; - file.oss << " delete p;" << endl; + file.oss << " collector.erase(p);" << endl; file.oss << " }" << endl; file.oss << "};" << endl; file.oss << endl; //Generate cleanup function file.oss << "void cleanup(void) {" << endl; - file.oss << " mexPrintf(\"MEX-file new_gtsamDummy_ is terminating\");" << endl; file.oss << " std::for_each( collector.begin(), collector.end(), Destruct() );" << endl; file.oss << "}" << endl; @@ -129,13 +128,13 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << " if(self) {" << endl; file.oss << " if(nargin > 1) {" << endl; file.oss << " collector.insert(self);" << endl; + //TODO: Add verbosity flag file.oss << " std::cout << \"Collected\" << collector.size() << std::endl;" << endl; file.oss << " }" << endl; file.oss << " else if(collector.erase(self))" << endl; file.oss << " delete self;" << endl; file.oss << " } else {" << endl; file.oss << " int nc = unwrap(in[1]);" << endl; - file.oss << " mexPrintf(\"MEX-file constructor\");" << endl << endl;; int i = 0; BOOST_FOREACH(ArgumentList al, args_list) From 7a9dd715e740c3b8e771f6d58d26cc007387b179 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 27 Jun 2012 16:33:19 +0000 Subject: [PATCH 475/914] print statistics for bayesnet and bayestree --- gtsam/inference/BayesNet-inl.h | 19 +++++++++++++++++++ gtsam/inference/BayesNet.h | 3 +++ gtsam/inference/BayesTree-inl.h | 12 ++++++++++++ gtsam/inference/BayesTree.h | 1 + gtsam/nonlinear/NonlinearISAM.cpp | 8 +------- 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 57cef4634..a9a405ac6 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -26,6 +26,7 @@ #include // for += using boost::assign::operator+=; +#include #include #include @@ -39,6 +40,24 @@ namespace gtsam { conditional->print(); } + /* ************************************************************************* */ + template + void BayesNet::printStats(const std::string& s) const { + std::cout << s; + const size_t n = conditionals_.size(); + size_t max_size = 0; + size_t total = 0; + BOOST_REVERSE_FOREACH(sharedConditional conditional, conditionals_) { + max_size = std::max(max_size, conditional->size()); + total += conditional->size(); + } + std::cout << s + << "maximum clique size = " << max_size << std::endl + << "average clique size = " << total / n << std::endl + << "density = " << 100.0 * total / (double) (n*(n+1)/2) << " %" << std::endl + << std::endl; + } + /* ************************************************************************* */ template bool BayesNet::equals(const BayesNet& cbn, double tol) const { diff --git a/gtsam/inference/BayesNet.h b/gtsam/inference/BayesNet.h index f6721816c..e465fdfd3 100644 --- a/gtsam/inference/BayesNet.h +++ b/gtsam/inference/BayesNet.h @@ -90,6 +90,9 @@ public: /** print */ void print(const std::string& s = "") const; + /** print statistics */ + void printStats(const std::string& s = "") const; + /** check equality */ bool equals(const BayesNet& other, double tol = 1e-9) const; diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 8e9d769a6..b3bc9f81e 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -102,6 +102,18 @@ namespace gtsam { } } + + /* ************************************************************************* */ + template + void BayesTree::CliqueStats::print(const std::string& s) const { + std::cout << s + <<"\navg Conditional Size: " << avgConditionalSize + << "\nmax Conditional Size: " << maxConditionalSize + << "\navg Separator Size: " << avgSeparatorSize + << "\nmax Separator Size: " << maxSeparatorSize + << std::endl; + } + /* ************************************************************************* */ template typename BayesTree::CliqueStats diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 9c38d6496..6413e4b0d 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -81,6 +81,7 @@ namespace gtsam { std::size_t maxConditionalSize; double avgSeparatorSize; std::size_t maxSeparatorSize; + void print(const std::string& s = "") const ; }; /** store all the sizes */ diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index 6b5ea31bc..b2135fedd 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -118,13 +118,7 @@ void NonlinearISAM::print(const string& s, const KeyFormatter& keyFormatter) con /* ************************************************************************* */ void NonlinearISAM::printStats() const { - gtsam::GaussianISAM::CliqueData data = isam_.getCliqueData(); - gtsam::GaussianISAM::CliqueStats stats = data.getStats(); - cout << "\navg Conditional Size: " << stats.avgConditionalSize; - cout << "\nmax Conditional Size: " << stats.maxConditionalSize; - cout << "\navg Separator Size: " << stats.avgSeparatorSize; - cout << "\nmax Separator Size: " << stats.maxSeparatorSize; - cout << endl; + isam_.getCliqueData().getStats().print(); } /* ************************************************************************* */ From ef538f459ece2701f65e8170dd596185782c29fb Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 27 Jun 2012 16:35:15 +0000 Subject: [PATCH 476/914] remove a redundant print --- gtsam/inference/BayesNet-inl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index a9a405ac6..7fbfdc454 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -43,7 +43,7 @@ namespace gtsam { /* ************************************************************************* */ template void BayesNet::printStats(const std::string& s) const { - std::cout << s; + const size_t n = conditionals_.size(); size_t max_size = 0; size_t total = 0; From 3f78448c8ca8f47a65cfe405e1716cdc3fba6bc3 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 27 Jun 2012 16:36:23 +0000 Subject: [PATCH 477/914] fix typo --- gtsam/inference/BayesNet-inl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 7fbfdc454..6647be302 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -52,8 +52,8 @@ namespace gtsam { total += conditional->size(); } std::cout << s - << "maximum clique size = " << max_size << std::endl - << "average clique size = " << total / n << std::endl + << "maximum conditional size = " << max_size << std::endl + << "average conditional size = " << total / n << std::endl << "density = " << 100.0 * total / (double) (n*(n+1)/2) << " %" << std::endl << std::endl; } From 55655d07083bd1740d94b504cdaa5efe45613273 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 27 Jun 2012 16:37:55 +0000 Subject: [PATCH 478/914] rearrange newline --- gtsam/inference/BayesTree-inl.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index b3bc9f81e..e0a585812 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -107,10 +107,10 @@ namespace gtsam { template void BayesTree::CliqueStats::print(const std::string& s) const { std::cout << s - <<"\navg Conditional Size: " << avgConditionalSize - << "\nmax Conditional Size: " << maxConditionalSize - << "\navg Separator Size: " << avgSeparatorSize - << "\nmax Separator Size: " << maxSeparatorSize + <<"avg Conditional Size: " << avgConditionalSize << std::endl + << "max Conditional Size: " << maxConditionalSize << std::endl + << "avg Separator Size: " << avgSeparatorSize << std::endl + << "max Separator Size: " << maxSeparatorSize << std::endl << std::endl; } From b8c346b60d572b2c56b94071cc0195780ad4759e Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 27 Jun 2012 16:49:14 +0000 Subject: [PATCH 479/914] --- gtsam/inference/BayesNet-inl.h | 3 +-- gtsam/inference/BayesTree-inl.h | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 6647be302..112782ecc 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -54,8 +54,7 @@ namespace gtsam { std::cout << s << "maximum conditional size = " << max_size << std::endl << "average conditional size = " << total / n << std::endl - << "density = " << 100.0 * total / (double) (n*(n+1)/2) << " %" << std::endl - << std::endl; + << "density = " << 100.0 * total / (double) (n*(n+1)/2) << " %" << std::endl; } /* ************************************************************************* */ diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index e0a585812..501a8aabd 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -110,8 +110,7 @@ namespace gtsam { <<"avg Conditional Size: " << avgConditionalSize << std::endl << "max Conditional Size: " << maxConditionalSize << std::endl << "avg Separator Size: " << avgSeparatorSize << std::endl - << "max Separator Size: " << maxSeparatorSize << std::endl - << std::endl; + << "max Separator Size: " << maxSeparatorSize << std::endl; } /* ************************************************************************* */ From b98f60ddb514f6301f2c9bf73deba878f7c67552 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 27 Jun 2012 19:16:18 +0000 Subject: [PATCH 480/914] Added more flexible print interface with optional key formatter --- gtsam/discrete/DiscreteConditional.h | 6 ++++-- gtsam/discrete/DiscreteFactor.h | 6 ++++-- gtsam/discrete/DiscreteFactorGraph.cpp | 13 +++++++++++++ gtsam/discrete/DiscreteFactorGraph.h | 11 ++--------- gtsam/inference/BayesNet-inl.h | 5 +++-- gtsam/inference/BayesNet.h | 5 ++++- gtsam/inference/ClusterTree-inl.h | 17 ++++++++++------- gtsam/inference/ClusterTree.h | 10 +++++++--- gtsam/inference/EliminationTree-inl.h | 9 +++++---- gtsam/inference/EliminationTree.h | 7 +++++-- gtsam/inference/Factor-inl.h | 5 +++-- gtsam/inference/Factor.h | 5 ++++- gtsam/inference/FactorGraph-inl.h | 5 +++-- gtsam/inference/FactorGraph.h | 3 ++- gtsam/linear/GaussianDensity.cpp | 4 ++-- gtsam/linear/GaussianDensity.h | 3 ++- gtsam/linear/VectorValues.cpp | 4 ++-- gtsam/linear/VectorValues.h | 10 ++++++---- 18 files changed, 81 insertions(+), 47 deletions(-) diff --git a/gtsam/discrete/DiscreteConditional.h b/gtsam/discrete/DiscreteConditional.h index c95cc36d6..6de9989f2 100644 --- a/gtsam/discrete/DiscreteConditional.h +++ b/gtsam/discrete/DiscreteConditional.h @@ -63,9 +63,11 @@ namespace gtsam { /// @{ /** GTSAM-style print */ - void print(const std::string& s = "Discrete Conditional: ") const { + void print(const std::string& s = "Discrete Conditional: ", + const boost::function& formatter + = &(boost::lexical_cast)) const { std::cout << s << std::endl; - IndexConditional::print(s); + IndexConditional::print(s, formatter); Potentials::print(s); } diff --git a/gtsam/discrete/DiscreteFactor.h b/gtsam/discrete/DiscreteFactor.h index 0bfdb3068..deac7efce 100644 --- a/gtsam/discrete/DiscreteFactor.h +++ b/gtsam/discrete/DiscreteFactor.h @@ -82,8 +82,10 @@ namespace gtsam { /// @{ // print - virtual void print(const std::string& s = "DiscreteFactor\n") const { - IndexFactor::print(s); + virtual void print(const std::string& s = "DiscreteFactor\n", + const boost::function& formatter + = &(boost::lexical_cast)) const { + IndexFactor::print(s,formatter); } /// @} diff --git a/gtsam/discrete/DiscreteFactorGraph.cpp b/gtsam/discrete/DiscreteFactorGraph.cpp index 4726c752f..f3c89721b 100644 --- a/gtsam/discrete/DiscreteFactorGraph.cpp +++ b/gtsam/discrete/DiscreteFactorGraph.cpp @@ -63,6 +63,18 @@ namespace gtsam { return product; } + /* ************************************************************************* */ + void DiscreteFactorGraph::print(const std::string& s, + const IndexFormatter& formatter) const { + std::cout << s << std::endl; + std::cout << "size: " << size() << std::endl; + for (size_t i = 0; i < factors_.size(); i++) { + std::stringstream ss; + ss << "factor " << i << ": "; + if (factors_[i] != NULL) factors_[i]->print(ss.str(), formatter); + } + } + /* ************************************************************************* */ std::pair // EliminateDiscrete(const FactorGraph& factors, size_t num) { @@ -90,6 +102,7 @@ namespace gtsam { return std::make_pair(cond, sum); } + /* ************************************************************************* */ } // namespace diff --git a/gtsam/discrete/DiscreteFactorGraph.h b/gtsam/discrete/DiscreteFactorGraph.h index d96a3049a..44b814507 100644 --- a/gtsam/discrete/DiscreteFactorGraph.h +++ b/gtsam/discrete/DiscreteFactorGraph.h @@ -77,15 +77,8 @@ public: double operator()(const DiscreteFactor::Values & values) const; /// print - void print(const std::string& s = "DiscreteFactorGraph") const { - std::cout << s << std::endl; - std::cout << "size: " << size() << std::endl; - for (size_t i = 0; i < factors_.size(); i++) { - std::stringstream ss; - ss << "factor " << i << ": "; - if (factors_[i] != NULL) factors_[i]->print(ss.str()); - } - } + void print(const std::string& s = "DiscreteFactorGraph", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; }; // DiscreteFactorGraph diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 112782ecc..89361e8fc 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -34,10 +34,11 @@ namespace gtsam { /* ************************************************************************* */ template - void BayesNet::print(const std::string& s) const { + void BayesNet::print(const std::string& s, + const boost::function& formatter) const { std::cout << s; BOOST_REVERSE_FOREACH(sharedConditional conditional, conditionals_) - conditional->print(); + conditional->print("Conditional", formatter); } /* ************************************************************************* */ diff --git a/gtsam/inference/BayesNet.h b/gtsam/inference/BayesNet.h index e465fdfd3..32abd9ed6 100644 --- a/gtsam/inference/BayesNet.h +++ b/gtsam/inference/BayesNet.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -48,6 +49,7 @@ public: typedef typename boost::shared_ptr > shared_ptr; /** We store shared pointers to Conditional densities */ + typedef typename CONDITIONAL::KeyType KeyType; typedef typename boost::shared_ptr sharedConditional; typedef typename boost::shared_ptr const_sharedConditional; typedef typename std::list Conditionals; @@ -88,7 +90,8 @@ public: /// @{ /** print */ - void print(const std::string& s = "") const; + void print(const std::string& s = "", + const boost::function& formatter = &(boost::lexical_cast)) const; /** print statistics */ void printStats(const std::string& s = "") const; diff --git a/gtsam/inference/ClusterTree-inl.h b/gtsam/inference/ClusterTree-inl.h index 548a55cf4..b3fe204e7 100644 --- a/gtsam/inference/ClusterTree-inl.h +++ b/gtsam/inference/ClusterTree-inl.h @@ -71,10 +71,11 @@ namespace gtsam { /* ************************************************************************* */ template - void ClusterTree::Cluster::print(const std::string& indent) const { + void ClusterTree::Cluster::print(const std::string& indent, + const boost::function& formatter) const { std::cout << indent; BOOST_FOREACH(const Index key, frontal) - std::cout << key << " "; + std::cout << formatter(key) << " "; std::cout << ": "; BOOST_FOREACH(const Index key, separator) std::cout << key << " "; @@ -83,19 +84,21 @@ namespace gtsam { /* ************************************************************************* */ template - void ClusterTree::Cluster::printTree(const std::string& indent) const { - print(indent); + void ClusterTree::Cluster::printTree(const std::string& indent, + const boost::function& formatter) const { + print(indent, formatter); BOOST_FOREACH(const shared_ptr& child, children_) - child->printTree(indent + " "); + child->printTree(indent + " ", formatter); } /* ************************************************************************* * * ClusterTree * ************************************************************************* */ template - void ClusterTree::print(const std::string& str) const { + void ClusterTree::print(const std::string& str, + const boost::function& formatter) const { std::cout << str << std::endl; - if (root_) root_->printTree(""); + if (root_) root_->printTree("", formatter); } /* ************************************************************************* */ diff --git a/gtsam/inference/ClusterTree.h b/gtsam/inference/ClusterTree.h index 92919b936..f253fe4d6 100644 --- a/gtsam/inference/ClusterTree.h +++ b/gtsam/inference/ClusterTree.h @@ -25,6 +25,7 @@ #include #include +#include #include @@ -38,6 +39,9 @@ namespace gtsam { */ template class ClusterTree { + public: + // Access to factor types + typedef typename FG::KeyType KeyType; protected: @@ -74,10 +78,10 @@ namespace gtsam { Cluster(FRONTALIT firstFrontal, FRONTALIT lastFrontal, SEPARATORIT firstSeparator, SEPARATORIT lastSeparator); /// print - void print(const std::string& indent) const; + void print(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; /// print the enire tree - void printTree(const std::string& indent) const; + void printTree(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; /// check equality bool equals(const Cluster& other) const; @@ -123,7 +127,7 @@ namespace gtsam { /// @{ /// print the object - void print(const std::string& str="") const; + void print(const std::string& str="", const boost::function& formatter = &(boost::lexical_cast)) const; /** check equality */ bool equals(const ClusterTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/EliminationTree-inl.h b/gtsam/inference/EliminationTree-inl.h index c4cb9d4cf..81c98c926 100644 --- a/gtsam/inference/EliminationTree-inl.h +++ b/gtsam/inference/EliminationTree-inl.h @@ -166,12 +166,13 @@ EliminationTree::Create(const FactorGraph& factorGraph) { /* ************************************************************************* */ template -void EliminationTree::print(const std::string& name) const { - std::cout << name << " (" << key_ << ")" << std::endl; +void EliminationTree::print(const std::string& name, + const boost::function& formatter) const { + std::cout << name << " (" << formatter(key_) << ")" << std::endl; BOOST_FOREACH(const sharedFactor& factor, factors_) { - factor->print(name + " "); } + factor->print(name + " ", formatter); } BOOST_FOREACH(const shared_ptr& child, subTrees_) { - child->print(name + " "); } + child->print(name + " ", formatter); } } /* ************************************************************************* */ diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index 6ab7dcf49..8e57a7208 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -54,6 +54,8 @@ public: typedef boost::shared_ptr shared_ptr; ///< Shared pointer to this class typedef typename boost::shared_ptr sharedFactor; ///< Shared pointer to a factor typedef gtsam::BayesNet BayesNet; ///< The BayesNet corresponding to FACTOR + typedef FACTOR Factor; + typedef typename FACTOR::KeyType KeyType; /** Typedef for an eliminate subroutine */ typedef typename FactorGraph::Eliminate Eliminate; @@ -67,7 +69,7 @@ private: typedef FastList SubTrees; typedef std::vector Conditionals; - Index key_; ///< index associated with root + Index key_; ///< index associated with root // FIXME: doesn't this require that "Index" is the type of keys in the generic factor? Factors factors_; ///< factors associated with root SubTrees subTrees_; ///< sub-trees @@ -141,7 +143,8 @@ public: /// @{ /** Print the tree to cout */ - void print(const std::string& name = "EliminationTree: ") const; + void print(const std::string& name = "EliminationTree: ", + const boost::function& formatter = &(boost::lexical_cast)) const; /** Test whether the tree is equal to another */ bool equals(const EliminationTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/Factor-inl.h b/gtsam/inference/Factor-inl.h index d9fb1e0de..ad9f43701 100644 --- a/gtsam/inference/Factor-inl.h +++ b/gtsam/inference/Factor-inl.h @@ -56,9 +56,10 @@ namespace gtsam { /* ************************************************************************* */ template - void Factor::print(const std::string& s) const { + void Factor::print(const std::string& s, + const boost::function& formatter) const { std::cout << s << " "; - BOOST_FOREACH(KEY key, keys_) std::cout << " " << key; + BOOST_FOREACH(KEY key, keys_) std::cout << " " << formatter(key); std::cout << std::endl; } diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index 6ed9c809b..0e80fc8ea 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include namespace gtsam { @@ -190,7 +192,8 @@ public: /// @{ /// print - void print(const std::string& s = "Factor") const; + void print(const std::string& s = "Factor", + const boost::function& formatter = &(boost::lexical_cast)) const; /// check equality bool equals(const This& other, double tol = 1e-9) const; diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 90212f39f..c787655af 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -48,13 +48,14 @@ namespace gtsam { /* ************************************************************************* */ template - void FactorGraph::print(const std::string& s) const { + void FactorGraph::print(const std::string& s, + const boost::function& formatter) const { std::cout << s << std::endl; std::cout << "size: " << size() << std::endl; for (size_t i = 0; i < factors_.size(); i++) { std::stringstream ss; ss << "factor " << i << ": "; - if (factors_[i] != NULL) factors_[i]->print(ss.str()); + if (factors_[i] != NULL) factors_[i]->print(ss.str(), formatter); } } diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 89662ffc4..905afc55c 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -138,7 +138,8 @@ template class BayesTree; /// @{ /** print out graph */ - void print(const std::string& s = "FactorGraph") const; + void print(const std::string& s = "FactorGraph", + const boost::function& formatter = &(boost::lexical_cast)) const; /** Check equality */ bool equals(const This& fg, double tol = 1e-9) const; diff --git a/gtsam/linear/GaussianDensity.cpp b/gtsam/linear/GaussianDensity.cpp index 97e42d9ba..c8fc4c21a 100644 --- a/gtsam/linear/GaussianDensity.cpp +++ b/gtsam/linear/GaussianDensity.cpp @@ -23,11 +23,11 @@ using namespace std; namespace gtsam { /* ************************************************************************* */ - void GaussianDensity::print(const string &s) const + void GaussianDensity::print(const string &s, const IndexFormatter& formatter) const { cout << s << ": density on "; for(const_iterator it = beginFrontals(); it != endFrontals(); ++it) - cout << (boost::format("[%1%]")%(*it)).str() << " "; + cout << (boost::format("[%1%]")%(formatter(*it))).str() << " "; cout << endl; gtsam::print(Matrix(get_R()),"R"); gtsam::print(Vector(get_d()),"d"); diff --git a/gtsam/linear/GaussianDensity.h b/gtsam/linear/GaussianDensity.h index 2c13e847c..61db582f4 100644 --- a/gtsam/linear/GaussianDensity.h +++ b/gtsam/linear/GaussianDensity.h @@ -54,7 +54,8 @@ namespace gtsam { } /// print - void print(const std::string& = "GaussianDensity") const; + void print(const std::string& = "GaussianDensity", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; /// Mean \f$ \mu = R^{-1} d \f$ Vector mean() const; diff --git a/gtsam/linear/VectorValues.cpp b/gtsam/linear/VectorValues.cpp index 5868d8452..1413d1517 100644 --- a/gtsam/linear/VectorValues.cpp +++ b/gtsam/linear/VectorValues.cpp @@ -77,10 +77,10 @@ void VectorValues::insert(Index j, const Vector& value) { } /* ************************************************************************* */ -void VectorValues::print(const std::string& str) const { +void VectorValues::print(const std::string& str, const IndexFormatter& formatter) const { std::cout << str << ": " << size() << " elements\n"; for (Index var = 0; var < size(); ++var) - std::cout << " " << var << ": \n" << operator[](var) << "\n"; + std::cout << " " << formatter(var) << ": \n" << operator[](var) << "\n"; std::cout.flush(); } diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index f3d82511e..89c59a6ad 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -159,15 +160,16 @@ namespace gtsam { iterator begin() { chk(); return maps_.begin(); } ///< Iterator over variables const_iterator begin() const { chk(); return maps_.begin(); } ///< Iterator over variables - iterator end() { chk(); return maps_.end(); } ///< Iterator over variables + iterator end() { chk(); return maps_.end(); } ///< Iterator over variables const_iterator end() const { chk(); return maps_.end(); } ///< Iterator over variables - reverse_iterator rbegin() { chk(); return maps_.rbegin(); } ///< Reverse iterator over variables + reverse_iterator rbegin() { chk(); return maps_.rbegin(); } ///< Reverse iterator over variables const_reverse_iterator rbegin() const { chk(); return maps_.rbegin(); } ///< Reverse iterator over variables - reverse_iterator rend() { chk(); return maps_.rend(); } ///< Reverse iterator over variables + reverse_iterator rend() { chk(); return maps_.rend(); } ///< Reverse iterator over variables const_reverse_iterator rend() const { chk(); return maps_.rend(); } ///< Reverse iterator over variables /** print required by Testable for unit testing */ - void print(const std::string& str = "VectorValues: ") const; + void print(const std::string& str = "VectorValues: ", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; /** equals required by Testable for unit testing */ bool equals(const VectorValues& x, double tol = 1e-9) const; From ddbea256af1f5e1dc627c699df6a1e0289893de7 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 27 Jun 2012 20:03:13 +0000 Subject: [PATCH 481/914] Merge branch 'master' into new_wrap_local --- gtsam/discrete/DiscreteConditional.h | 6 +- gtsam/discrete/DiscreteFactor.h | 6 +- gtsam/discrete/DiscreteFactorGraph.cpp | 13 ++ gtsam/discrete/DiscreteFactorGraph.h | 11 +- gtsam/inference/BayesNet-inl.h | 23 +- gtsam/inference/BayesNet.h | 8 +- gtsam/inference/BayesTree-inl.h | 12 + gtsam/inference/BayesTree.h | 1 + gtsam/inference/BayesTreeCliqueBase.h | 3 + gtsam/inference/ClusterTree-inl.h | 17 +- gtsam/inference/ClusterTree.h | 10 +- gtsam/inference/EliminationTree-inl.h | 9 +- gtsam/inference/EliminationTree.h | 7 +- gtsam/inference/Factor-inl.h | 5 +- gtsam/inference/Factor.h | 5 +- gtsam/inference/FactorGraph-inl.h | 5 +- gtsam/inference/FactorGraph.h | 3 +- gtsam/linear/GaussianDensity.cpp | 4 +- gtsam/linear/GaussianDensity.h | 3 +- gtsam/linear/VectorValues.cpp | 4 +- gtsam/linear/VectorValues.h | 10 +- gtsam/nonlinear/NonlinearISAM.cpp | 8 +- tests/testSubgraphPreconditioner.cpp | 297 ++++++++++++------------- 23 files changed, 266 insertions(+), 204 deletions(-) diff --git a/gtsam/discrete/DiscreteConditional.h b/gtsam/discrete/DiscreteConditional.h index c95cc36d6..6de9989f2 100644 --- a/gtsam/discrete/DiscreteConditional.h +++ b/gtsam/discrete/DiscreteConditional.h @@ -63,9 +63,11 @@ namespace gtsam { /// @{ /** GTSAM-style print */ - void print(const std::string& s = "Discrete Conditional: ") const { + void print(const std::string& s = "Discrete Conditional: ", + const boost::function& formatter + = &(boost::lexical_cast)) const { std::cout << s << std::endl; - IndexConditional::print(s); + IndexConditional::print(s, formatter); Potentials::print(s); } diff --git a/gtsam/discrete/DiscreteFactor.h b/gtsam/discrete/DiscreteFactor.h index 0bfdb3068..deac7efce 100644 --- a/gtsam/discrete/DiscreteFactor.h +++ b/gtsam/discrete/DiscreteFactor.h @@ -82,8 +82,10 @@ namespace gtsam { /// @{ // print - virtual void print(const std::string& s = "DiscreteFactor\n") const { - IndexFactor::print(s); + virtual void print(const std::string& s = "DiscreteFactor\n", + const boost::function& formatter + = &(boost::lexical_cast)) const { + IndexFactor::print(s,formatter); } /// @} diff --git a/gtsam/discrete/DiscreteFactorGraph.cpp b/gtsam/discrete/DiscreteFactorGraph.cpp index 4726c752f..f3c89721b 100644 --- a/gtsam/discrete/DiscreteFactorGraph.cpp +++ b/gtsam/discrete/DiscreteFactorGraph.cpp @@ -63,6 +63,18 @@ namespace gtsam { return product; } + /* ************************************************************************* */ + void DiscreteFactorGraph::print(const std::string& s, + const IndexFormatter& formatter) const { + std::cout << s << std::endl; + std::cout << "size: " << size() << std::endl; + for (size_t i = 0; i < factors_.size(); i++) { + std::stringstream ss; + ss << "factor " << i << ": "; + if (factors_[i] != NULL) factors_[i]->print(ss.str(), formatter); + } + } + /* ************************************************************************* */ std::pair // EliminateDiscrete(const FactorGraph& factors, size_t num) { @@ -90,6 +102,7 @@ namespace gtsam { return std::make_pair(cond, sum); } + /* ************************************************************************* */ } // namespace diff --git a/gtsam/discrete/DiscreteFactorGraph.h b/gtsam/discrete/DiscreteFactorGraph.h index d96a3049a..44b814507 100644 --- a/gtsam/discrete/DiscreteFactorGraph.h +++ b/gtsam/discrete/DiscreteFactorGraph.h @@ -77,15 +77,8 @@ public: double operator()(const DiscreteFactor::Values & values) const; /// print - void print(const std::string& s = "DiscreteFactorGraph") const { - std::cout << s << std::endl; - std::cout << "size: " << size() << std::endl; - for (size_t i = 0; i < factors_.size(); i++) { - std::stringstream ss; - ss << "factor " << i << ": "; - if (factors_[i] != NULL) factors_[i]->print(ss.str()); - } - } + void print(const std::string& s = "DiscreteFactorGraph", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; }; // DiscreteFactorGraph diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 57cef4634..89361e8fc 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -26,6 +26,7 @@ #include // for += using boost::assign::operator+=; +#include #include #include @@ -33,12 +34,30 @@ namespace gtsam { /* ************************************************************************* */ template - void BayesNet::print(const std::string& s) const { + void BayesNet::print(const std::string& s, + const boost::function& formatter) const { std::cout << s; BOOST_REVERSE_FOREACH(sharedConditional conditional, conditionals_) - conditional->print(); + conditional->print("Conditional", formatter); } + /* ************************************************************************* */ + template + void BayesNet::printStats(const std::string& s) const { + + const size_t n = conditionals_.size(); + size_t max_size = 0; + size_t total = 0; + BOOST_REVERSE_FOREACH(sharedConditional conditional, conditionals_) { + max_size = std::max(max_size, conditional->size()); + total += conditional->size(); + } + std::cout << s + << "maximum conditional size = " << max_size << std::endl + << "average conditional size = " << total / n << std::endl + << "density = " << 100.0 * total / (double) (n*(n+1)/2) << " %" << std::endl; + } + /* ************************************************************************* */ template bool BayesNet::equals(const BayesNet& cbn, double tol) const { diff --git a/gtsam/inference/BayesNet.h b/gtsam/inference/BayesNet.h index f6721816c..32abd9ed6 100644 --- a/gtsam/inference/BayesNet.h +++ b/gtsam/inference/BayesNet.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -48,6 +49,7 @@ public: typedef typename boost::shared_ptr > shared_ptr; /** We store shared pointers to Conditional densities */ + typedef typename CONDITIONAL::KeyType KeyType; typedef typename boost::shared_ptr sharedConditional; typedef typename boost::shared_ptr const_sharedConditional; typedef typename std::list Conditionals; @@ -88,7 +90,11 @@ public: /// @{ /** print */ - void print(const std::string& s = "") const; + void print(const std::string& s = "", + const boost::function& formatter = &(boost::lexical_cast)) const; + + /** print statistics */ + void printStats(const std::string& s = "") const; /** check equality */ bool equals(const BayesNet& other, double tol = 1e-9) const; diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 22dd0c62b..501a8aabd 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -67,6 +67,7 @@ namespace gtsam { of.close(); } + /* ************************************************************************* */ template void BayesTree::saveGraph(std::ostream &s, sharedClique clique, const IndexFormatter& indexFormatter, int parentnum) const { static int num = 0; @@ -102,6 +103,17 @@ namespace gtsam { } + /* ************************************************************************* */ + template + void BayesTree::CliqueStats::print(const std::string& s) const { + std::cout << s + <<"avg Conditional Size: " << avgConditionalSize << std::endl + << "max Conditional Size: " << maxConditionalSize << std::endl + << "avg Separator Size: " << avgSeparatorSize << std::endl + << "max Separator Size: " << maxSeparatorSize << std::endl; + } + + /* ************************************************************************* */ template typename BayesTree::CliqueStats BayesTree::CliqueData::getStats() const { diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 9c38d6496..6413e4b0d 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -81,6 +81,7 @@ namespace gtsam { std::size_t maxConditionalSize; double avgSeparatorSize; std::size_t maxSeparatorSize; + void print(const std::string& s = "") const ; }; /** store all the sizes */ diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index 9a2f6c54e..d054fe43f 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -117,6 +117,9 @@ namespace gtsam { /** return the const reference of children */ const std::list& children() const { return children_; } + /** return a shared_ptr to the parent clique */ + derived_ptr parent() const { return parent_.lock(); } + /// @} /// @name Advanced Interface /// @{ diff --git a/gtsam/inference/ClusterTree-inl.h b/gtsam/inference/ClusterTree-inl.h index 548a55cf4..b3fe204e7 100644 --- a/gtsam/inference/ClusterTree-inl.h +++ b/gtsam/inference/ClusterTree-inl.h @@ -71,10 +71,11 @@ namespace gtsam { /* ************************************************************************* */ template - void ClusterTree::Cluster::print(const std::string& indent) const { + void ClusterTree::Cluster::print(const std::string& indent, + const boost::function& formatter) const { std::cout << indent; BOOST_FOREACH(const Index key, frontal) - std::cout << key << " "; + std::cout << formatter(key) << " "; std::cout << ": "; BOOST_FOREACH(const Index key, separator) std::cout << key << " "; @@ -83,19 +84,21 @@ namespace gtsam { /* ************************************************************************* */ template - void ClusterTree::Cluster::printTree(const std::string& indent) const { - print(indent); + void ClusterTree::Cluster::printTree(const std::string& indent, + const boost::function& formatter) const { + print(indent, formatter); BOOST_FOREACH(const shared_ptr& child, children_) - child->printTree(indent + " "); + child->printTree(indent + " ", formatter); } /* ************************************************************************* * * ClusterTree * ************************************************************************* */ template - void ClusterTree::print(const std::string& str) const { + void ClusterTree::print(const std::string& str, + const boost::function& formatter) const { std::cout << str << std::endl; - if (root_) root_->printTree(""); + if (root_) root_->printTree("", formatter); } /* ************************************************************************* */ diff --git a/gtsam/inference/ClusterTree.h b/gtsam/inference/ClusterTree.h index 92919b936..f253fe4d6 100644 --- a/gtsam/inference/ClusterTree.h +++ b/gtsam/inference/ClusterTree.h @@ -25,6 +25,7 @@ #include #include +#include #include @@ -38,6 +39,9 @@ namespace gtsam { */ template class ClusterTree { + public: + // Access to factor types + typedef typename FG::KeyType KeyType; protected: @@ -74,10 +78,10 @@ namespace gtsam { Cluster(FRONTALIT firstFrontal, FRONTALIT lastFrontal, SEPARATORIT firstSeparator, SEPARATORIT lastSeparator); /// print - void print(const std::string& indent) const; + void print(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; /// print the enire tree - void printTree(const std::string& indent) const; + void printTree(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; /// check equality bool equals(const Cluster& other) const; @@ -123,7 +127,7 @@ namespace gtsam { /// @{ /// print the object - void print(const std::string& str="") const; + void print(const std::string& str="", const boost::function& formatter = &(boost::lexical_cast)) const; /** check equality */ bool equals(const ClusterTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/EliminationTree-inl.h b/gtsam/inference/EliminationTree-inl.h index c4cb9d4cf..81c98c926 100644 --- a/gtsam/inference/EliminationTree-inl.h +++ b/gtsam/inference/EliminationTree-inl.h @@ -166,12 +166,13 @@ EliminationTree::Create(const FactorGraph& factorGraph) { /* ************************************************************************* */ template -void EliminationTree::print(const std::string& name) const { - std::cout << name << " (" << key_ << ")" << std::endl; +void EliminationTree::print(const std::string& name, + const boost::function& formatter) const { + std::cout << name << " (" << formatter(key_) << ")" << std::endl; BOOST_FOREACH(const sharedFactor& factor, factors_) { - factor->print(name + " "); } + factor->print(name + " ", formatter); } BOOST_FOREACH(const shared_ptr& child, subTrees_) { - child->print(name + " "); } + child->print(name + " ", formatter); } } /* ************************************************************************* */ diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index 6ab7dcf49..8e57a7208 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -54,6 +54,8 @@ public: typedef boost::shared_ptr shared_ptr; ///< Shared pointer to this class typedef typename boost::shared_ptr sharedFactor; ///< Shared pointer to a factor typedef gtsam::BayesNet BayesNet; ///< The BayesNet corresponding to FACTOR + typedef FACTOR Factor; + typedef typename FACTOR::KeyType KeyType; /** Typedef for an eliminate subroutine */ typedef typename FactorGraph::Eliminate Eliminate; @@ -67,7 +69,7 @@ private: typedef FastList SubTrees; typedef std::vector Conditionals; - Index key_; ///< index associated with root + Index key_; ///< index associated with root // FIXME: doesn't this require that "Index" is the type of keys in the generic factor? Factors factors_; ///< factors associated with root SubTrees subTrees_; ///< sub-trees @@ -141,7 +143,8 @@ public: /// @{ /** Print the tree to cout */ - void print(const std::string& name = "EliminationTree: ") const; + void print(const std::string& name = "EliminationTree: ", + const boost::function& formatter = &(boost::lexical_cast)) const; /** Test whether the tree is equal to another */ bool equals(const EliminationTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/Factor-inl.h b/gtsam/inference/Factor-inl.h index d9fb1e0de..ad9f43701 100644 --- a/gtsam/inference/Factor-inl.h +++ b/gtsam/inference/Factor-inl.h @@ -56,9 +56,10 @@ namespace gtsam { /* ************************************************************************* */ template - void Factor::print(const std::string& s) const { + void Factor::print(const std::string& s, + const boost::function& formatter) const { std::cout << s << " "; - BOOST_FOREACH(KEY key, keys_) std::cout << " " << key; + BOOST_FOREACH(KEY key, keys_) std::cout << " " << formatter(key); std::cout << std::endl; } diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index 6ed9c809b..0e80fc8ea 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include namespace gtsam { @@ -190,7 +192,8 @@ public: /// @{ /// print - void print(const std::string& s = "Factor") const; + void print(const std::string& s = "Factor", + const boost::function& formatter = &(boost::lexical_cast)) const; /// check equality bool equals(const This& other, double tol = 1e-9) const; diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 90212f39f..c787655af 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -48,13 +48,14 @@ namespace gtsam { /* ************************************************************************* */ template - void FactorGraph::print(const std::string& s) const { + void FactorGraph::print(const std::string& s, + const boost::function& formatter) const { std::cout << s << std::endl; std::cout << "size: " << size() << std::endl; for (size_t i = 0; i < factors_.size(); i++) { std::stringstream ss; ss << "factor " << i << ": "; - if (factors_[i] != NULL) factors_[i]->print(ss.str()); + if (factors_[i] != NULL) factors_[i]->print(ss.str(), formatter); } } diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 89662ffc4..905afc55c 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -138,7 +138,8 @@ template class BayesTree; /// @{ /** print out graph */ - void print(const std::string& s = "FactorGraph") const; + void print(const std::string& s = "FactorGraph", + const boost::function& formatter = &(boost::lexical_cast)) const; /** Check equality */ bool equals(const This& fg, double tol = 1e-9) const; diff --git a/gtsam/linear/GaussianDensity.cpp b/gtsam/linear/GaussianDensity.cpp index 97e42d9ba..c8fc4c21a 100644 --- a/gtsam/linear/GaussianDensity.cpp +++ b/gtsam/linear/GaussianDensity.cpp @@ -23,11 +23,11 @@ using namespace std; namespace gtsam { /* ************************************************************************* */ - void GaussianDensity::print(const string &s) const + void GaussianDensity::print(const string &s, const IndexFormatter& formatter) const { cout << s << ": density on "; for(const_iterator it = beginFrontals(); it != endFrontals(); ++it) - cout << (boost::format("[%1%]")%(*it)).str() << " "; + cout << (boost::format("[%1%]")%(formatter(*it))).str() << " "; cout << endl; gtsam::print(Matrix(get_R()),"R"); gtsam::print(Vector(get_d()),"d"); diff --git a/gtsam/linear/GaussianDensity.h b/gtsam/linear/GaussianDensity.h index 2c13e847c..61db582f4 100644 --- a/gtsam/linear/GaussianDensity.h +++ b/gtsam/linear/GaussianDensity.h @@ -54,7 +54,8 @@ namespace gtsam { } /// print - void print(const std::string& = "GaussianDensity") const; + void print(const std::string& = "GaussianDensity", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; /// Mean \f$ \mu = R^{-1} d \f$ Vector mean() const; diff --git a/gtsam/linear/VectorValues.cpp b/gtsam/linear/VectorValues.cpp index 5868d8452..1413d1517 100644 --- a/gtsam/linear/VectorValues.cpp +++ b/gtsam/linear/VectorValues.cpp @@ -77,10 +77,10 @@ void VectorValues::insert(Index j, const Vector& value) { } /* ************************************************************************* */ -void VectorValues::print(const std::string& str) const { +void VectorValues::print(const std::string& str, const IndexFormatter& formatter) const { std::cout << str << ": " << size() << " elements\n"; for (Index var = 0; var < size(); ++var) - std::cout << " " << var << ": \n" << operator[](var) << "\n"; + std::cout << " " << formatter(var) << ": \n" << operator[](var) << "\n"; std::cout.flush(); } diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index f3d82511e..89c59a6ad 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -159,15 +160,16 @@ namespace gtsam { iterator begin() { chk(); return maps_.begin(); } ///< Iterator over variables const_iterator begin() const { chk(); return maps_.begin(); } ///< Iterator over variables - iterator end() { chk(); return maps_.end(); } ///< Iterator over variables + iterator end() { chk(); return maps_.end(); } ///< Iterator over variables const_iterator end() const { chk(); return maps_.end(); } ///< Iterator over variables - reverse_iterator rbegin() { chk(); return maps_.rbegin(); } ///< Reverse iterator over variables + reverse_iterator rbegin() { chk(); return maps_.rbegin(); } ///< Reverse iterator over variables const_reverse_iterator rbegin() const { chk(); return maps_.rbegin(); } ///< Reverse iterator over variables - reverse_iterator rend() { chk(); return maps_.rend(); } ///< Reverse iterator over variables + reverse_iterator rend() { chk(); return maps_.rend(); } ///< Reverse iterator over variables const_reverse_iterator rend() const { chk(); return maps_.rend(); } ///< Reverse iterator over variables /** print required by Testable for unit testing */ - void print(const std::string& str = "VectorValues: ") const; + void print(const std::string& str = "VectorValues: ", + const IndexFormatter& formatter = &(boost::lexical_cast)) const; /** equals required by Testable for unit testing */ bool equals(const VectorValues& x, double tol = 1e-9) const; diff --git a/gtsam/nonlinear/NonlinearISAM.cpp b/gtsam/nonlinear/NonlinearISAM.cpp index 6b5ea31bc..b2135fedd 100644 --- a/gtsam/nonlinear/NonlinearISAM.cpp +++ b/gtsam/nonlinear/NonlinearISAM.cpp @@ -118,13 +118,7 @@ void NonlinearISAM::print(const string& s, const KeyFormatter& keyFormatter) con /* ************************************************************************* */ void NonlinearISAM::printStats() const { - gtsam::GaussianISAM::CliqueData data = isam_.getCliqueData(); - gtsam::GaussianISAM::CliqueStats stats = data.getStats(); - cout << "\navg Conditional Size: " << stats.avgConditionalSize; - cout << "\nmax Conditional Size: " << stats.maxConditionalSize; - cout << "\navg Separator Size: " << stats.avgSeparatorSize; - cout << "\nmax Separator Size: " << stats.maxSeparatorSize; - cout << endl; + isam_.getCliqueData().getStats().print(); } /* ************************************************************************* */ diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index 382ac4cc7..417643e78 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -40,14 +40,14 @@ Key i3002 = 3002, i2002 = 2002, i1002 = 1002; Key i3001 = 3001, i2001 = 2001, i1001 = 1001; // TODO fix Ordering::equals, because the ordering *is* correct ! -/* ************************************************************************* * -TEST( SubgraphPreconditioner, planarOrdering ) -{ - // Check canonical ordering - Ordering expected, ordering = planarOrdering(3); - expected += i3003, i2003, i1003, i3002, i2002, i1002, i3001, i2001, i1001; - CHECK(assert_equal(expected,ordering)); -} +/* ************************************************************************* */ +//TEST( SubgraphPreconditioner, planarOrdering ) +//{ +// // Check canonical ordering +// Ordering expected, ordering = planarOrdering(3); +// expected += i3003, i2003, i1003, i3002, i2002, i1002, i3001, i2001, i1001; +// CHECK(assert_equal(expected,ordering)); +//} /* ************************************************************************* */ TEST( SubgraphPreconditioner, planarGraph ) @@ -66,148 +66,145 @@ TEST( SubgraphPreconditioner, planarGraph ) CHECK(assert_equal(xtrue,actual)); } -/* ************************************************************************* * -TEST( SubgraphPreconditioner, splitOffPlanarTree ) -{ - // Build a planar graph - GaussianFactorGraph A; - VectorValues xtrue; - boost::tie(A, xtrue) = planarGraph(3); - - // Get the spanning tree and constraints, and check their sizes - JacobianFactorGraph T, C; - // TODO big mess: GFG and JFG mess !!! - boost::tie(T, C) = splitOffPlanarTree(3, A); - LONGS_EQUAL(9,T.size()); - LONGS_EQUAL(4,C.size()); - - // Check that the tree can be solved to give the ground xtrue - GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(T).eliminate(); - VectorValues xbar = optimize(*R1); - CHECK(assert_equal(xtrue,xbar)); -} - -/* ************************************************************************* * -TEST( SubgraphPreconditioner, system ) -{ - // Build a planar graph - JacobianFactorGraph Ab; - VectorValues xtrue; - size_t N = 3; - boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b - - // Get the spanning tree and corresponding ordering - GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 - boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); - SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); - SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); - - // Eliminate the spanning tree to build a prior - SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 - VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 - - // Create Subgraph-preconditioned system - VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible - SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); - - // Create zero config - VectorValues zeros = VectorValues::Zero(xbar); - - // Set up y0 as all zeros - VectorValues y0 = zeros; - - // y1 = perturbed y0 - VectorValues y1 = zeros; - y1[i2003] = Vector_(2, 1.0, -1.0); - - // Check corresponding x values - VectorValues expected_x1 = xtrue, x1 = system.x(y1); - expected_x1[i2003] = Vector_(2, 2.01, 2.99); - expected_x1[i3003] = Vector_(2, 3.01, 2.99); - CHECK(assert_equal(xtrue, system.x(y0))); - CHECK(assert_equal(expected_x1,system.x(y1))); - - // Check errors -// DOUBLES_EQUAL(0,error(Ab,xtrue),1e-9); // TODO ! -// DOUBLES_EQUAL(3,error(Ab,x1),1e-9); // TODO ! - DOUBLES_EQUAL(0,error(system,y0),1e-9); - DOUBLES_EQUAL(3,error(system,y1),1e-9); - - // Test gradient in x - VectorValues expected_gx0 = zeros; - VectorValues expected_gx1 = zeros; - CHECK(assert_equal(expected_gx0,gradient(Ab,xtrue))); - expected_gx1[i1003] = Vector_(2, -100., 100.); - expected_gx1[i2002] = Vector_(2, -100., 100.); - expected_gx1[i2003] = Vector_(2, 200., -200.); - expected_gx1[i3002] = Vector_(2, -100., 100.); - expected_gx1[i3003] = Vector_(2, 100., -100.); - CHECK(assert_equal(expected_gx1,gradient(Ab,x1))); - - // Test gradient in y - VectorValues expected_gy0 = zeros; - VectorValues expected_gy1 = zeros; - expected_gy1[i1003] = Vector_(2, 2., -2.); - expected_gy1[i2002] = Vector_(2, -2., 2.); - expected_gy1[i2003] = Vector_(2, 3., -3.); - expected_gy1[i3002] = Vector_(2, -1., 1.); - expected_gy1[i3003] = Vector_(2, 1., -1.); - CHECK(assert_equal(expected_gy0,gradient(system,y0))); - CHECK(assert_equal(expected_gy1,gradient(system,y1))); - - // Check it numerically for good measure - // TODO use boost::bind(&SubgraphPreconditioner::error,&system,_1) - // Vector numerical_g1 = numericalGradient (error, y1, 0.001); - // Vector expected_g1 = Vector_(18, 0., 0., 0., 0., 2., -2., 0., 0., -2., 2., - // 3., -3., 0., 0., -1., 1., 1., -1.); - // CHECK(assert_equal(expected_g1,numerical_g1)); -} - -/* ************************************************************************* * -TEST( SubgraphPreconditioner, conjugateGradients ) -{ - // Build a planar graph - GaussianFactorGraph Ab; - VectorValues xtrue; - size_t N = 3; - boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b - - // Get the spanning tree and corresponding ordering - GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 - boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); - SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); - SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); - - // Eliminate the spanning tree to build a prior - Ordering ordering = planarOrdering(N); - SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 - VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 - - // Create Subgraph-preconditioned system - VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible - SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); - - // Create zero config y0 and perturbed config y1 - VectorValues y0 = VectorValues::Zero(xbar); - - VectorValues y1 = y0; - y1[i2003] = Vector_(2, 1.0, -1.0); - VectorValues x1 = system.x(y1); - - // Solve for the remaining constraints using PCG - ConjugateGradientParameters parameters; -// VectorValues actual = gtsam::conjugateGradients(system, y1, verbose, epsilon, epsilon, maxIterations); -// CHECK(assert_equal(y0,actual)); - - // Compare with non preconditioned version: - VectorValues actual2 = conjugateGradientDescent(Ab, x1, parameters); - CHECK(assert_equal(xtrue,actual2,1e-4)); -} +/* ************************************************************************* */ +//TEST( SubgraphPreconditioner, splitOffPlanarTree ) +//{ +// // Build a planar graph +// GaussianFactorGraph A; +// VectorValues xtrue; +// boost::tie(A, xtrue) = planarGraph(3); +// +// // Get the spanning tree and constraints, and check their sizes +// JacobianFactorGraph T, C; +// // TODO big mess: GFG and JFG mess !!! +// boost::tie(T, C) = splitOffPlanarTree(3, A); +// LONGS_EQUAL(9,T.size()); +// LONGS_EQUAL(4,C.size()); +// +// // Check that the tree can be solved to give the ground xtrue +// GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(T).eliminate(); +// VectorValues xbar = optimize(*R1); +// CHECK(assert_equal(xtrue,xbar)); +//} /* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} +//TEST( SubgraphPreconditioner, system ) +//{ +// // Build a planar graph +// JacobianFactorGraph Ab; +// VectorValues xtrue; +// size_t N = 3; +// boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b +// +// // Get the spanning tree and corresponding ordering +// GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 +// boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); +// SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); +// SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); +// +// // Eliminate the spanning tree to build a prior +// SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 +// VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 +// +// // Create Subgraph-preconditioned system +// VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible +// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); +// +// // Create zero config +// VectorValues zeros = VectorValues::Zero(xbar); +// +// // Set up y0 as all zeros +// VectorValues y0 = zeros; +// +// // y1 = perturbed y0 +// VectorValues y1 = zeros; +// y1[i2003] = Vector_(2, 1.0, -1.0); +// +// // Check corresponding x values +// VectorValues expected_x1 = xtrue, x1 = system.x(y1); +// expected_x1[i2003] = Vector_(2, 2.01, 2.99); +// expected_x1[i3003] = Vector_(2, 3.01, 2.99); +// CHECK(assert_equal(xtrue, system.x(y0))); +// CHECK(assert_equal(expected_x1,system.x(y1))); +// +// // Check errors +//// DOUBLES_EQUAL(0,error(Ab,xtrue),1e-9); // TODO ! +//// DOUBLES_EQUAL(3,error(Ab,x1),1e-9); // TODO ! +// DOUBLES_EQUAL(0,error(system,y0),1e-9); +// DOUBLES_EQUAL(3,error(system,y1),1e-9); +// +// // Test gradient in x +// VectorValues expected_gx0 = zeros; +// VectorValues expected_gx1 = zeros; +// CHECK(assert_equal(expected_gx0,gradient(Ab,xtrue))); +// expected_gx1[i1003] = Vector_(2, -100., 100.); +// expected_gx1[i2002] = Vector_(2, -100., 100.); +// expected_gx1[i2003] = Vector_(2, 200., -200.); +// expected_gx1[i3002] = Vector_(2, -100., 100.); +// expected_gx1[i3003] = Vector_(2, 100., -100.); +// CHECK(assert_equal(expected_gx1,gradient(Ab,x1))); +// +// // Test gradient in y +// VectorValues expected_gy0 = zeros; +// VectorValues expected_gy1 = zeros; +// expected_gy1[i1003] = Vector_(2, 2., -2.); +// expected_gy1[i2002] = Vector_(2, -2., 2.); +// expected_gy1[i2003] = Vector_(2, 3., -3.); +// expected_gy1[i3002] = Vector_(2, -1., 1.); +// expected_gy1[i3003] = Vector_(2, 1., -1.); +// CHECK(assert_equal(expected_gy0,gradient(system,y0))); +// CHECK(assert_equal(expected_gy1,gradient(system,y1))); +// +// // Check it numerically for good measure +// // TODO use boost::bind(&SubgraphPreconditioner::error,&system,_1) +// // Vector numerical_g1 = numericalGradient (error, y1, 0.001); +// // Vector expected_g1 = Vector_(18, 0., 0., 0., 0., 2., -2., 0., 0., -2., 2., +// // 3., -3., 0., 0., -1., 1., 1., -1.); +// // CHECK(assert_equal(expected_g1,numerical_g1)); +//} + +/* ************************************************************************* */ +//TEST( SubgraphPreconditioner, conjugateGradients ) +//{ +// // Build a planar graph +// GaussianFactorGraph Ab; +// VectorValues xtrue; +// size_t N = 3; +// boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b +// +// // Get the spanning tree and corresponding ordering +// GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 +// boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); +// SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); +// SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); +// +// // Eliminate the spanning tree to build a prior +// Ordering ordering = planarOrdering(N); +// SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 +// VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 +// +// // Create Subgraph-preconditioned system +// VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible +// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); +// +// // Create zero config y0 and perturbed config y1 +// VectorValues y0 = VectorValues::Zero(xbar); +// +// VectorValues y1 = y0; +// y1[i2003] = Vector_(2, 1.0, -1.0); +// VectorValues x1 = system.x(y1); +// +// // Solve for the remaining constraints using PCG +// ConjugateGradientParameters parameters; +//// VectorValues actual = gtsam::conjugateGradients(system, y1, verbose, epsilon, epsilon, maxIterations); +//// CHECK(assert_equal(y0,actual)); +// +// // Compare with non preconditioned version: +// VectorValues actual2 = conjugateGradientDescent(Ab, x1, parameters); +// CHECK(assert_equal(xtrue,actual2,1e-4)); +//} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From fb00f4b834ac3956dc4ce99e29dbace18999b96f Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Wed, 27 Jun 2012 21:50:45 +0000 Subject: [PATCH 482/914] fixes for two word args --- wrap/Class.cpp | 3 ++- wrap/Constructor.cpp | 2 +- wrap/Method.cpp | 9 ++++++--- wrap/matlab.h | 6 ------ 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 7280d5488..5e0237d3a 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -59,7 +59,8 @@ void Class::matlab_proxy(const string& classFile) const { // deconstructor file.oss << " function delete(obj)" << endl; file.oss << " if obj.self ~= 0" << endl; - file.oss << " fprintf(1,'MATLAB class deleting %x',obj.self);" << endl; + //TODO: Add verbosity flag + //file.oss << " fprintf(1,'MATLAB class deleting %x',obj.self);" << endl; file.oss << " new_" << matlabName << "_(obj.self);" << endl; file.oss << " obj.self = 0;" << endl; file.oss << " end" << endl; diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 97a6af4fc..e999951b2 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -129,7 +129,7 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << " if(nargin > 1) {" << endl; file.oss << " collector.insert(self);" << endl; //TODO: Add verbosity flag - file.oss << " std::cout << \"Collected\" << collector.size() << std::endl;" << endl; + //file.oss << " std::cout << \"Collected\" << collector.size() << std::endl;" << endl; file.oss << " }" << endl; file.oss << " else if(collector.erase(self))" << endl; file.oss << " delete self;" << endl; diff --git a/wrap/Method.cpp b/wrap/Method.cpp index ccd36fe50..f5da0d370 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -63,11 +63,14 @@ void Method::matlab_wrapper(const string& classPath, if(returnVal.isPair) { - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; + if(returnVal.category1 == ReturnValue::CLASS) + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + if(returnVal.category2 == ReturnValue::CLASS) + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; } else - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + if(returnVal.category1 == ReturnValue::CLASS) + file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; file.oss << "typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; // call diff --git a/wrap/matlab.h b/wrap/matlab.h index 99dd0c6b3..74c0823e4 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -341,7 +341,6 @@ mxArray* create_collect_object(const char *classname, mxArray* h){ mxArray* dummy[14] = {h,h,h,h,h, h,h,h,h,h, h,h,h,h}; mexCallMATLAB(1,&result,14,dummy,classname); mxSetProperty(result, 0, "self", h); - cout << "Return collect" << endl; return result; } @@ -354,7 +353,6 @@ template mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast**> (mxGetPr(mxh)) = shared_ptr; - cout << "wrapped:" << mxh << endl << "end wrap" << endl; //return mxh; return create_object(classname, mxh); } @@ -363,23 +361,19 @@ template mxArray* wrap_collect_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast**> (mxGetPr(mxh)) = shared_ptr; - cout << "wrapped:" << mxh << endl << "end wrap" << endl; //return mxh; return create_collect_object(classname, mxh); } template boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { - cout << "UNWRAP CALL" << endl; mxArray* mxh = mxGetProperty(obj,0,"self"); if (mxGetClassID(mxh) != mxUINT32OR64_CLASS || mxIsComplex(mxh) || mxGetM(mxh) != 1 || mxGetN(mxh) != 1) error( "Parameter is not an Shared type."); - cout << "unwrapped:" << mxh << endl; boost::shared_ptr* spp = *reinterpret_cast**> (mxGetPr(mxh)); - cout << "unwrapped:" << spp << endl; return *spp; } From c289a6c5f6c14e82f9a04859f05c84498830ab27 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 28 Jun 2012 01:52:36 +0000 Subject: [PATCH 483/914] Option to append build mode suffix to build library --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb25d2dd8..96efa97dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ else() option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" ON) endif() option(GTSAM_BUILD_STATIC_LIBRARY "Enable/Disable building of a static version of gtsam" ON) +option(GTSAM_BUILD_TYPE_POSTFIXES "Enable/Disable appending the build type to the name of compiled libraries" OFF) option(GTSAM_USE_QUATERNIONS "Enable/Disable using an internal Quaternion representation for rotations instead of rotation matrices" OFF) if(MSVC) option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" OFF) @@ -170,6 +171,7 @@ print_config_flag(${GTSAM_BUILD_TESTS} "Build Tests print_config_flag(${GTSAM_BUILD_WRAP} "Build Wrap ") print_config_flag(${GTSAM_BUILD_SHARED_LIBRARY} "Build shared GTSAM Library ") print_config_flag(${GTSAM_BUILD_STATIC_LIBRARY} "Build static GTSAM Library ") +print_config_flag(${GTSAM_BUILD_TYPE_POSTFIXES} "Put build-type in library name ") print_config_flag(${GTSAM_BUILD_CONVENIENCE_LIBRARIES} "Build Convenience Libraries ") if(GTSAM_UNSTABLE_AVAILABLE) print_config_flag(${GTSAM_BUILD_UNSTABLE} "Build libgtsam_unstable ") From 947e5fe5ee1fbe513ccab74a363862fc11238fc2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 28 Jun 2012 01:52:48 +0000 Subject: [PATCH 484/914] Made typedefs / constants for IndexFormatter to simplify code --- gtsam/base/types.cpp | 30 +++++++++++++++++++++++++++ gtsam/base/types.h | 6 ++++++ gtsam/discrete/DiscreteConditional.h | 4 ++-- gtsam/discrete/DiscreteFactor.h | 4 ++-- gtsam/discrete/DiscreteFactorGraph.h | 2 +- gtsam/inference/BayesNet-inl.h | 2 +- gtsam/inference/BayesNet.h | 2 +- gtsam/inference/BayesTree.h | 6 +++--- gtsam/inference/BayesTreeCliqueBase.h | 4 ++-- gtsam/inference/ClusterTree-inl.h | 6 +++--- gtsam/inference/ClusterTree.h | 6 +++--- gtsam/inference/Conditional.h | 5 ++--- gtsam/inference/EliminationTree-inl.h | 2 +- gtsam/inference/EliminationTree.h | 2 +- gtsam/inference/Factor-inl.h | 2 +- gtsam/inference/Factor.h | 3 ++- gtsam/inference/FactorGraph-inl.h | 2 +- gtsam/inference/FactorGraph.h | 2 +- gtsam/linear/GaussianConditional.h | 2 +- gtsam/linear/GaussianDensity.h | 2 +- gtsam/linear/GaussianFactor.h | 2 +- gtsam/linear/HessianFactor.h | 2 +- gtsam/linear/JacobianFactor.h | 2 +- gtsam/linear/VectorValues.h | 2 +- gtsam/nonlinear/ISAM2.h | 2 +- 25 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 gtsam/base/types.cpp diff --git a/gtsam/base/types.cpp b/gtsam/base/types.cpp new file mode 100644 index 000000000..ea4db72c8 --- /dev/null +++ b/gtsam/base/types.cpp @@ -0,0 +1,30 @@ +/* ---------------------------------------------------------------------------- + + * 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 types.h + * @brief Typedefs for easier changing of types + * @author Richard Roberts + * @date Aug 21, 2010 + * @addtogroup base + */ + +#include + +#include + +namespace gtsam { + + std::string _defaultIndexFormatter(Index j) { + return boost::lexical_cast(j); + } + +} \ No newline at end of file diff --git a/gtsam/base/types.h b/gtsam/base/types.h index 5559518b3..a42c2acc5 100644 --- a/gtsam/base/types.h +++ b/gtsam/base/types.h @@ -21,6 +21,7 @@ #include +#include #include namespace gtsam { @@ -32,6 +33,11 @@ namespace gtsam { * to a nonlinear key and then to a Symbol. */ typedef boost::function IndexFormatter; + std::string _defaultIndexFormatter(Index j); + + /** The default IndexFormatter outputs the index */ + static const IndexFormatter DefaultIndexFormatter = &_defaultIndexFormatter; + /** * Helper class that uses templates to select between two types based on * whether TEST_TYPE is const or not. diff --git a/gtsam/discrete/DiscreteConditional.h b/gtsam/discrete/DiscreteConditional.h index 6de9989f2..e05bfd669 100644 --- a/gtsam/discrete/DiscreteConditional.h +++ b/gtsam/discrete/DiscreteConditional.h @@ -64,8 +64,8 @@ namespace gtsam { /** GTSAM-style print */ void print(const std::string& s = "Discrete Conditional: ", - const boost::function& formatter - = &(boost::lexical_cast)) const { + const IndexFormatter& formatter + =DefaultIndexFormatter) const { std::cout << s << std::endl; IndexConditional::print(s, formatter); Potentials::print(s); diff --git a/gtsam/discrete/DiscreteFactor.h b/gtsam/discrete/DiscreteFactor.h index deac7efce..9b1130bae 100644 --- a/gtsam/discrete/DiscreteFactor.h +++ b/gtsam/discrete/DiscreteFactor.h @@ -83,8 +83,8 @@ namespace gtsam { // print virtual void print(const std::string& s = "DiscreteFactor\n", - const boost::function& formatter - = &(boost::lexical_cast)) const { + const IndexFormatter& formatter + =DefaultIndexFormatter) const { IndexFactor::print(s,formatter); } diff --git a/gtsam/discrete/DiscreteFactorGraph.h b/gtsam/discrete/DiscreteFactorGraph.h index 44b814507..0f399abdd 100644 --- a/gtsam/discrete/DiscreteFactorGraph.h +++ b/gtsam/discrete/DiscreteFactorGraph.h @@ -78,7 +78,7 @@ public: /// print void print(const std::string& s = "DiscreteFactorGraph", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter =DefaultIndexFormatter) const; }; // DiscreteFactorGraph diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 89361e8fc..c306cb39d 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -35,7 +35,7 @@ namespace gtsam { /* ************************************************************************* */ template void BayesNet::print(const std::string& s, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << s; BOOST_REVERSE_FOREACH(sharedConditional conditional, conditionals_) conditional->print("Conditional", formatter); diff --git a/gtsam/inference/BayesNet.h b/gtsam/inference/BayesNet.h index 32abd9ed6..67d59c48d 100644 --- a/gtsam/inference/BayesNet.h +++ b/gtsam/inference/BayesNet.h @@ -91,7 +91,7 @@ public: /** print */ void print(const std::string& s = "", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** print statistics */ void printStats(const std::string& s = "") const; diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 6413e4b0d..7391e9a10 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -71,7 +71,7 @@ namespace gtsam { // A convenience class for a list of shared cliques struct Cliques : public std::list { void print(const std::string& s = "Cliques", - const IndexFormatter& indexFormatter = &(boost::lexical_cast)) const; + const IndexFormatter& indexFormatter = DefaultIndexFormatter) const; bool equals(const Cliques& other, double tol = 1e-9) const; }; @@ -178,7 +178,7 @@ namespace gtsam { /** print */ void print(const std::string& s = "", - const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /// @} /// @name Standard Interface @@ -236,7 +236,7 @@ namespace gtsam { */ /** saves the Tree to a text file in GraphViz format */ - void saveGraph(const std::string& s, const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + void saveGraph(const std::string& s, const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /// @} /// @name Advanced Interface diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index d054fe43f..a2fb8feef 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -93,10 +93,10 @@ namespace gtsam { } /** print this node */ - void print(const std::string& s = "", const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + void print(const std::string& s = "", const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /** print this node and entire subtree below it */ - void printTree(const std::string& indent="", const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + void printTree(const std::string& indent="", const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /// @} /// @name Standard Interface diff --git a/gtsam/inference/ClusterTree-inl.h b/gtsam/inference/ClusterTree-inl.h index b3fe204e7..3b8deb316 100644 --- a/gtsam/inference/ClusterTree-inl.h +++ b/gtsam/inference/ClusterTree-inl.h @@ -72,7 +72,7 @@ namespace gtsam { /* ************************************************************************* */ template void ClusterTree::Cluster::print(const std::string& indent, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << indent; BOOST_FOREACH(const Index key, frontal) std::cout << formatter(key) << " "; @@ -85,7 +85,7 @@ namespace gtsam { /* ************************************************************************* */ template void ClusterTree::Cluster::printTree(const std::string& indent, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { print(indent, formatter); BOOST_FOREACH(const shared_ptr& child, children_) child->printTree(indent + " ", formatter); @@ -96,7 +96,7 @@ namespace gtsam { * ************************************************************************* */ template void ClusterTree::print(const std::string& str, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << str << std::endl; if (root_) root_->printTree("", formatter); } diff --git a/gtsam/inference/ClusterTree.h b/gtsam/inference/ClusterTree.h index f253fe4d6..276ef374d 100644 --- a/gtsam/inference/ClusterTree.h +++ b/gtsam/inference/ClusterTree.h @@ -78,10 +78,10 @@ namespace gtsam { Cluster(FRONTALIT firstFrontal, FRONTALIT lastFrontal, SEPARATORIT firstSeparator, SEPARATORIT lastSeparator); /// print - void print(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; + void print(const std::string& indent, const IndexFormatter& formatter = DefaultIndexFormatter) const; /// print the enire tree - void printTree(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; + void printTree(const std::string& indent, const IndexFormatter& formatter = DefaultIndexFormatter) const; /// check equality bool equals(const Cluster& other) const; @@ -127,7 +127,7 @@ namespace gtsam { /// @{ /// print the object - void print(const std::string& str="", const boost::function& formatter = &(boost::lexical_cast)) const; + void print(const std::string& str="", const IndexFormatter& formatter = DefaultIndexFormatter) const; /** check equality */ bool equals(const ClusterTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/Conditional.h b/gtsam/inference/Conditional.h index 97f885596..8363c1800 100644 --- a/gtsam/inference/Conditional.h +++ b/gtsam/inference/Conditional.h @@ -131,8 +131,7 @@ public: /// @{ /** print with optional formatter */ - void print(const std::string& s = "Conditional", - const boost::function& formatter = &(boost::lexical_cast) ) const; + void print(const std::string& s = "Conditional", const IndexFormatter& formatter = DefaultIndexFormatter) const; /** check equality */ template @@ -201,7 +200,7 @@ private: /* ************************************************************************* */ template -void Conditional::print(const std::string& s, const boost::function& formatter) const { +void Conditional::print(const std::string& s, const IndexFormatter& formatter) const { std::cout << s << " P("; BOOST_FOREACH(KeyType key, frontals()) std::cout << " " << formatter(key); if (nrParents()>0) std::cout << " |"; diff --git a/gtsam/inference/EliminationTree-inl.h b/gtsam/inference/EliminationTree-inl.h index 81c98c926..2e977aa4b 100644 --- a/gtsam/inference/EliminationTree-inl.h +++ b/gtsam/inference/EliminationTree-inl.h @@ -167,7 +167,7 @@ EliminationTree::Create(const FactorGraph& factorGraph) { /* ************************************************************************* */ template void EliminationTree::print(const std::string& name, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << name << " (" << formatter(key_) << ")" << std::endl; BOOST_FOREACH(const sharedFactor& factor, factors_) { factor->print(name + " ", formatter); } diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index 8e57a7208..495fb40c8 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -144,7 +144,7 @@ public: /** Print the tree to cout */ void print(const std::string& name = "EliminationTree: ", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** Test whether the tree is equal to another */ bool equals(const EliminationTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/Factor-inl.h b/gtsam/inference/Factor-inl.h index ad9f43701..6636b646c 100644 --- a/gtsam/inference/Factor-inl.h +++ b/gtsam/inference/Factor-inl.h @@ -57,7 +57,7 @@ namespace gtsam { /* ************************************************************************* */ template void Factor::print(const std::string& s, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << s << " "; BOOST_FOREACH(KEY key, keys_) std::cout << " " << formatter(key); std::cout << std::endl; diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index 0e80fc8ea..d81c911a3 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -27,6 +27,7 @@ #include #include #include +#include #include namespace gtsam { @@ -193,7 +194,7 @@ public: /// print void print(const std::string& s = "Factor", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// check equality bool equals(const This& other, double tol = 1e-9) const; diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index c787655af..caf18d60e 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -49,7 +49,7 @@ namespace gtsam { /* ************************************************************************* */ template void FactorGraph::print(const std::string& s, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << s << std::endl; std::cout << "size: " << size() << std::endl; for (size_t i = 0; i < factors_.size(); i++) { diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 905afc55c..d0b9952d5 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -139,7 +139,7 @@ template class BayesTree; /** print out graph */ void print(const std::string& s = "FactorGraph", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** Check equality */ bool equals(const This& fg, double tol = 1e-9) const; diff --git a/gtsam/linear/GaussianConditional.h b/gtsam/linear/GaussianConditional.h index 68b537c2d..5b7801156 100644 --- a/gtsam/linear/GaussianConditional.h +++ b/gtsam/linear/GaussianConditional.h @@ -139,7 +139,7 @@ public: /** print */ void print(const std::string& = "GaussianConditional", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** equals function */ bool equals(const GaussianConditional &cg, double tol = 1e-9) const; diff --git a/gtsam/linear/GaussianDensity.h b/gtsam/linear/GaussianDensity.h index 61db582f4..4d4f673f9 100644 --- a/gtsam/linear/GaussianDensity.h +++ b/gtsam/linear/GaussianDensity.h @@ -55,7 +55,7 @@ namespace gtsam { /// print void print(const std::string& = "GaussianDensity", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter =DefaultIndexFormatter) const; /// Mean \f$ \mu = R^{-1} d \f$ Vector mean() const; diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index 64e4e970c..a20c09a43 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -84,7 +84,7 @@ namespace gtsam { // Implementing Testable interface virtual void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const = 0; + const IndexFormatter& formatter = DefaultIndexFormatter) const = 0; virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const = 0; diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 92f5c06d0..f90a33c5e 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -219,7 +219,7 @@ namespace gtsam { /** Print the factor for debugging and testing (implementing Testable) */ virtual void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** Compare to another factor for testing (implementing Testable) */ virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const; diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 14d073576..0ac085987 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -152,7 +152,7 @@ namespace gtsam { // Implementing Testable interface virtual void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const; Vector unweighted_error(const VectorValues& c) const; /** (A*x-b) */ diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 89c59a6ad..04c280577 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -169,7 +169,7 @@ namespace gtsam { /** print required by Testable for unit testing */ void print(const std::string& str = "VectorValues: ", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter =DefaultIndexFormatter) const; /** equals required by Testable for unit testing */ bool equals(const VectorValues& x, double tol = 1e-9) const; diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 00c8a026c..c118cb44e 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -287,7 +287,7 @@ public: /** print this node */ void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const { + const IndexFormatter& formatter = DefaultIndexFormatter) const { Base::print(s,formatter); if(cachedFactor_) cachedFactor_->print(s + "Cached: ", formatter); From 4abefa3cbeba5f1d3c4bb1748a63e981e9353558 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 28 Jun 2012 16:12:57 +0000 Subject: [PATCH 485/914] Merge branch 'master' into new_wrap_local --- CMakeLists.txt | 2 ++ gtsam/base/types.cpp | 30 +++++++++++++++++++++++++++ gtsam/base/types.h | 6 ++++++ gtsam/discrete/DiscreteConditional.h | 4 ++-- gtsam/discrete/DiscreteFactor.h | 4 ++-- gtsam/discrete/DiscreteFactorGraph.h | 2 +- gtsam/inference/BayesNet-inl.h | 2 +- gtsam/inference/BayesNet.h | 2 +- gtsam/inference/BayesTree.h | 6 +++--- gtsam/inference/BayesTreeCliqueBase.h | 4 ++-- gtsam/inference/ClusterTree-inl.h | 6 +++--- gtsam/inference/ClusterTree.h | 6 +++--- gtsam/inference/Conditional.h | 5 ++--- gtsam/inference/EliminationTree-inl.h | 2 +- gtsam/inference/EliminationTree.h | 2 +- gtsam/inference/Factor-inl.h | 2 +- gtsam/inference/Factor.h | 3 ++- gtsam/inference/FactorGraph-inl.h | 2 +- gtsam/inference/FactorGraph.h | 2 +- gtsam/linear/GaussianConditional.h | 2 +- gtsam/linear/GaussianDensity.h | 2 +- gtsam/linear/GaussianFactor.h | 2 +- gtsam/linear/HessianFactor.h | 2 +- gtsam/linear/JacobianFactor.h | 2 +- gtsam/linear/VectorValues.h | 2 +- gtsam/nonlinear/ISAM2.h | 2 +- 26 files changed, 72 insertions(+), 34 deletions(-) create mode 100644 gtsam/base/types.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index fb25d2dd8..96efa97dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ else() option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" ON) endif() option(GTSAM_BUILD_STATIC_LIBRARY "Enable/Disable building of a static version of gtsam" ON) +option(GTSAM_BUILD_TYPE_POSTFIXES "Enable/Disable appending the build type to the name of compiled libraries" OFF) option(GTSAM_USE_QUATERNIONS "Enable/Disable using an internal Quaternion representation for rotations instead of rotation matrices" OFF) if(MSVC) option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" OFF) @@ -170,6 +171,7 @@ print_config_flag(${GTSAM_BUILD_TESTS} "Build Tests print_config_flag(${GTSAM_BUILD_WRAP} "Build Wrap ") print_config_flag(${GTSAM_BUILD_SHARED_LIBRARY} "Build shared GTSAM Library ") print_config_flag(${GTSAM_BUILD_STATIC_LIBRARY} "Build static GTSAM Library ") +print_config_flag(${GTSAM_BUILD_TYPE_POSTFIXES} "Put build-type in library name ") print_config_flag(${GTSAM_BUILD_CONVENIENCE_LIBRARIES} "Build Convenience Libraries ") if(GTSAM_UNSTABLE_AVAILABLE) print_config_flag(${GTSAM_BUILD_UNSTABLE} "Build libgtsam_unstable ") diff --git a/gtsam/base/types.cpp b/gtsam/base/types.cpp new file mode 100644 index 000000000..ea4db72c8 --- /dev/null +++ b/gtsam/base/types.cpp @@ -0,0 +1,30 @@ +/* ---------------------------------------------------------------------------- + + * 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 types.h + * @brief Typedefs for easier changing of types + * @author Richard Roberts + * @date Aug 21, 2010 + * @addtogroup base + */ + +#include + +#include + +namespace gtsam { + + std::string _defaultIndexFormatter(Index j) { + return boost::lexical_cast(j); + } + +} \ No newline at end of file diff --git a/gtsam/base/types.h b/gtsam/base/types.h index 5559518b3..a42c2acc5 100644 --- a/gtsam/base/types.h +++ b/gtsam/base/types.h @@ -21,6 +21,7 @@ #include +#include #include namespace gtsam { @@ -32,6 +33,11 @@ namespace gtsam { * to a nonlinear key and then to a Symbol. */ typedef boost::function IndexFormatter; + std::string _defaultIndexFormatter(Index j); + + /** The default IndexFormatter outputs the index */ + static const IndexFormatter DefaultIndexFormatter = &_defaultIndexFormatter; + /** * Helper class that uses templates to select between two types based on * whether TEST_TYPE is const or not. diff --git a/gtsam/discrete/DiscreteConditional.h b/gtsam/discrete/DiscreteConditional.h index 6de9989f2..e05bfd669 100644 --- a/gtsam/discrete/DiscreteConditional.h +++ b/gtsam/discrete/DiscreteConditional.h @@ -64,8 +64,8 @@ namespace gtsam { /** GTSAM-style print */ void print(const std::string& s = "Discrete Conditional: ", - const boost::function& formatter - = &(boost::lexical_cast)) const { + const IndexFormatter& formatter + =DefaultIndexFormatter) const { std::cout << s << std::endl; IndexConditional::print(s, formatter); Potentials::print(s); diff --git a/gtsam/discrete/DiscreteFactor.h b/gtsam/discrete/DiscreteFactor.h index deac7efce..9b1130bae 100644 --- a/gtsam/discrete/DiscreteFactor.h +++ b/gtsam/discrete/DiscreteFactor.h @@ -83,8 +83,8 @@ namespace gtsam { // print virtual void print(const std::string& s = "DiscreteFactor\n", - const boost::function& formatter - = &(boost::lexical_cast)) const { + const IndexFormatter& formatter + =DefaultIndexFormatter) const { IndexFactor::print(s,formatter); } diff --git a/gtsam/discrete/DiscreteFactorGraph.h b/gtsam/discrete/DiscreteFactorGraph.h index 44b814507..0f399abdd 100644 --- a/gtsam/discrete/DiscreteFactorGraph.h +++ b/gtsam/discrete/DiscreteFactorGraph.h @@ -78,7 +78,7 @@ public: /// print void print(const std::string& s = "DiscreteFactorGraph", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter =DefaultIndexFormatter) const; }; // DiscreteFactorGraph diff --git a/gtsam/inference/BayesNet-inl.h b/gtsam/inference/BayesNet-inl.h index 89361e8fc..c306cb39d 100644 --- a/gtsam/inference/BayesNet-inl.h +++ b/gtsam/inference/BayesNet-inl.h @@ -35,7 +35,7 @@ namespace gtsam { /* ************************************************************************* */ template void BayesNet::print(const std::string& s, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << s; BOOST_REVERSE_FOREACH(sharedConditional conditional, conditionals_) conditional->print("Conditional", formatter); diff --git a/gtsam/inference/BayesNet.h b/gtsam/inference/BayesNet.h index 32abd9ed6..67d59c48d 100644 --- a/gtsam/inference/BayesNet.h +++ b/gtsam/inference/BayesNet.h @@ -91,7 +91,7 @@ public: /** print */ void print(const std::string& s = "", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** print statistics */ void printStats(const std::string& s = "") const; diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 6413e4b0d..7391e9a10 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -71,7 +71,7 @@ namespace gtsam { // A convenience class for a list of shared cliques struct Cliques : public std::list { void print(const std::string& s = "Cliques", - const IndexFormatter& indexFormatter = &(boost::lexical_cast)) const; + const IndexFormatter& indexFormatter = DefaultIndexFormatter) const; bool equals(const Cliques& other, double tol = 1e-9) const; }; @@ -178,7 +178,7 @@ namespace gtsam { /** print */ void print(const std::string& s = "", - const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /// @} /// @name Standard Interface @@ -236,7 +236,7 @@ namespace gtsam { */ /** saves the Tree to a text file in GraphViz format */ - void saveGraph(const std::string& s, const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + void saveGraph(const std::string& s, const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /// @} /// @name Advanced Interface diff --git a/gtsam/inference/BayesTreeCliqueBase.h b/gtsam/inference/BayesTreeCliqueBase.h index d054fe43f..a2fb8feef 100644 --- a/gtsam/inference/BayesTreeCliqueBase.h +++ b/gtsam/inference/BayesTreeCliqueBase.h @@ -93,10 +93,10 @@ namespace gtsam { } /** print this node */ - void print(const std::string& s = "", const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + void print(const std::string& s = "", const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /** print this node and entire subtree below it */ - void printTree(const std::string& indent="", const IndexFormatter& indexFormatter = &(boost::lexical_cast) ) const; + void printTree(const std::string& indent="", const IndexFormatter& indexFormatter = DefaultIndexFormatter ) const; /// @} /// @name Standard Interface diff --git a/gtsam/inference/ClusterTree-inl.h b/gtsam/inference/ClusterTree-inl.h index b3fe204e7..3b8deb316 100644 --- a/gtsam/inference/ClusterTree-inl.h +++ b/gtsam/inference/ClusterTree-inl.h @@ -72,7 +72,7 @@ namespace gtsam { /* ************************************************************************* */ template void ClusterTree::Cluster::print(const std::string& indent, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << indent; BOOST_FOREACH(const Index key, frontal) std::cout << formatter(key) << " "; @@ -85,7 +85,7 @@ namespace gtsam { /* ************************************************************************* */ template void ClusterTree::Cluster::printTree(const std::string& indent, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { print(indent, formatter); BOOST_FOREACH(const shared_ptr& child, children_) child->printTree(indent + " ", formatter); @@ -96,7 +96,7 @@ namespace gtsam { * ************************************************************************* */ template void ClusterTree::print(const std::string& str, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << str << std::endl; if (root_) root_->printTree("", formatter); } diff --git a/gtsam/inference/ClusterTree.h b/gtsam/inference/ClusterTree.h index f253fe4d6..276ef374d 100644 --- a/gtsam/inference/ClusterTree.h +++ b/gtsam/inference/ClusterTree.h @@ -78,10 +78,10 @@ namespace gtsam { Cluster(FRONTALIT firstFrontal, FRONTALIT lastFrontal, SEPARATORIT firstSeparator, SEPARATORIT lastSeparator); /// print - void print(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; + void print(const std::string& indent, const IndexFormatter& formatter = DefaultIndexFormatter) const; /// print the enire tree - void printTree(const std::string& indent, const boost::function& formatter = &(boost::lexical_cast)) const; + void printTree(const std::string& indent, const IndexFormatter& formatter = DefaultIndexFormatter) const; /// check equality bool equals(const Cluster& other) const; @@ -127,7 +127,7 @@ namespace gtsam { /// @{ /// print the object - void print(const std::string& str="", const boost::function& formatter = &(boost::lexical_cast)) const; + void print(const std::string& str="", const IndexFormatter& formatter = DefaultIndexFormatter) const; /** check equality */ bool equals(const ClusterTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/Conditional.h b/gtsam/inference/Conditional.h index 97f885596..8363c1800 100644 --- a/gtsam/inference/Conditional.h +++ b/gtsam/inference/Conditional.h @@ -131,8 +131,7 @@ public: /// @{ /** print with optional formatter */ - void print(const std::string& s = "Conditional", - const boost::function& formatter = &(boost::lexical_cast) ) const; + void print(const std::string& s = "Conditional", const IndexFormatter& formatter = DefaultIndexFormatter) const; /** check equality */ template @@ -201,7 +200,7 @@ private: /* ************************************************************************* */ template -void Conditional::print(const std::string& s, const boost::function& formatter) const { +void Conditional::print(const std::string& s, const IndexFormatter& formatter) const { std::cout << s << " P("; BOOST_FOREACH(KeyType key, frontals()) std::cout << " " << formatter(key); if (nrParents()>0) std::cout << " |"; diff --git a/gtsam/inference/EliminationTree-inl.h b/gtsam/inference/EliminationTree-inl.h index 81c98c926..2e977aa4b 100644 --- a/gtsam/inference/EliminationTree-inl.h +++ b/gtsam/inference/EliminationTree-inl.h @@ -167,7 +167,7 @@ EliminationTree::Create(const FactorGraph& factorGraph) { /* ************************************************************************* */ template void EliminationTree::print(const std::string& name, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << name << " (" << formatter(key_) << ")" << std::endl; BOOST_FOREACH(const sharedFactor& factor, factors_) { factor->print(name + " ", formatter); } diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index 8e57a7208..495fb40c8 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -144,7 +144,7 @@ public: /** Print the tree to cout */ void print(const std::string& name = "EliminationTree: ", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** Test whether the tree is equal to another */ bool equals(const EliminationTree& other, double tol = 1e-9) const; diff --git a/gtsam/inference/Factor-inl.h b/gtsam/inference/Factor-inl.h index ad9f43701..6636b646c 100644 --- a/gtsam/inference/Factor-inl.h +++ b/gtsam/inference/Factor-inl.h @@ -57,7 +57,7 @@ namespace gtsam { /* ************************************************************************* */ template void Factor::print(const std::string& s, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << s << " "; BOOST_FOREACH(KEY key, keys_) std::cout << " " << formatter(key); std::cout << std::endl; diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index 0e80fc8ea..d81c911a3 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -27,6 +27,7 @@ #include #include #include +#include #include namespace gtsam { @@ -193,7 +194,7 @@ public: /// print void print(const std::string& s = "Factor", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// check equality bool equals(const This& other, double tol = 1e-9) const; diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index c787655af..caf18d60e 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -49,7 +49,7 @@ namespace gtsam { /* ************************************************************************* */ template void FactorGraph::print(const std::string& s, - const boost::function& formatter) const { + const IndexFormatter& formatter) const { std::cout << s << std::endl; std::cout << "size: " << size() << std::endl; for (size_t i = 0; i < factors_.size(); i++) { diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 905afc55c..d0b9952d5 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -139,7 +139,7 @@ template class BayesTree; /** print out graph */ void print(const std::string& s = "FactorGraph", - const boost::function& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** Check equality */ bool equals(const This& fg, double tol = 1e-9) const; diff --git a/gtsam/linear/GaussianConditional.h b/gtsam/linear/GaussianConditional.h index 68b537c2d..5b7801156 100644 --- a/gtsam/linear/GaussianConditional.h +++ b/gtsam/linear/GaussianConditional.h @@ -139,7 +139,7 @@ public: /** print */ void print(const std::string& = "GaussianConditional", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** equals function */ bool equals(const GaussianConditional &cg, double tol = 1e-9) const; diff --git a/gtsam/linear/GaussianDensity.h b/gtsam/linear/GaussianDensity.h index 61db582f4..4d4f673f9 100644 --- a/gtsam/linear/GaussianDensity.h +++ b/gtsam/linear/GaussianDensity.h @@ -55,7 +55,7 @@ namespace gtsam { /// print void print(const std::string& = "GaussianDensity", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter =DefaultIndexFormatter) const; /// Mean \f$ \mu = R^{-1} d \f$ Vector mean() const; diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index 64e4e970c..a20c09a43 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -84,7 +84,7 @@ namespace gtsam { // Implementing Testable interface virtual void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const = 0; + const IndexFormatter& formatter = DefaultIndexFormatter) const = 0; virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const = 0; diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 92f5c06d0..f90a33c5e 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -219,7 +219,7 @@ namespace gtsam { /** Print the factor for debugging and testing (implementing Testable) */ virtual void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; /** Compare to another factor for testing (implementing Testable) */ virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const; diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 14d073576..0ac085987 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -152,7 +152,7 @@ namespace gtsam { // Implementing Testable interface virtual void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter = DefaultIndexFormatter) const; virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const; Vector unweighted_error(const VectorValues& c) const; /** (A*x-b) */ diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 89c59a6ad..04c280577 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -169,7 +169,7 @@ namespace gtsam { /** print required by Testable for unit testing */ void print(const std::string& str = "VectorValues: ", - const IndexFormatter& formatter = &(boost::lexical_cast)) const; + const IndexFormatter& formatter =DefaultIndexFormatter) const; /** equals required by Testable for unit testing */ bool equals(const VectorValues& x, double tol = 1e-9) const; diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 00c8a026c..c118cb44e 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -287,7 +287,7 @@ public: /** print this node */ void print(const std::string& s = "", - const IndexFormatter& formatter = &(boost::lexical_cast)) const { + const IndexFormatter& formatter = DefaultIndexFormatter) const { Base::print(s,formatter); if(cachedFactor_) cachedFactor_->print(s + "Cached: ", formatter); From 3ab79d159762a21de05167691c870d7e52609105 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 28 Jun 2012 16:13:22 +0000 Subject: [PATCH 486/914] Fixed wrap test --- wrap/tests/expected/@Point2/Point2.m | 12 +- wrap/tests/expected/@Point2/argChar.cpp | 10 +- wrap/tests/expected/@Point2/argChar.m | 3 +- wrap/tests/expected/@Point2/argUChar.cpp | 10 +- wrap/tests/expected/@Point2/argUChar.m | 3 +- wrap/tests/expected/@Point2/dim.cpp | 8 +- wrap/tests/expected/@Point2/dim.m | 3 +- wrap/tests/expected/@Point2/returnChar.cpp | 8 +- wrap/tests/expected/@Point2/returnChar.m | 3 +- .../expected/@Point2/vectorConfusion.cpp | 12 +- wrap/tests/expected/@Point2/vectorConfusion.m | 3 +- wrap/tests/expected/@Point2/x.cpp | 8 +- wrap/tests/expected/@Point2/x.m | 3 +- wrap/tests/expected/@Point2/y.cpp | 8 +- wrap/tests/expected/@Point2/y.m | 3 +- wrap/tests/expected/@Point3/Point3.m | 10 +- wrap/tests/expected/@Point3/norm.cpp | 8 +- wrap/tests/expected/@Test/Test.m | 12 +- .../expected/@Test/arg_EigenConstRef.cpp | 10 +- wrap/tests/expected/@Test/arg_EigenConstRef.m | 3 +- .../tests/expected/@Test/create_MixedPtrs.cpp | 16 ++- wrap/tests/expected/@Test/create_MixedPtrs.m | 3 +- wrap/tests/expected/@Test/create_ptrs.cpp | 16 ++- wrap/tests/expected/@Test/create_ptrs.m | 3 +- wrap/tests/expected/@Test/print.cpp | 8 +- .../tests/expected/@Test/return_Point2Ptr.cpp | 14 +- wrap/tests/expected/@Test/return_Point2Ptr.m | 3 +- wrap/tests/expected/@Test/return_Test.cpp | 12 +- wrap/tests/expected/@Test/return_Test.m | 3 +- wrap/tests/expected/@Test/return_TestPtr.cpp | 12 +- wrap/tests/expected/@Test/return_TestPtr.m | 3 +- wrap/tests/expected/@Test/return_bool.cpp | 10 +- wrap/tests/expected/@Test/return_bool.m | 3 +- wrap/tests/expected/@Test/return_double.cpp | 10 +- wrap/tests/expected/@Test/return_double.m | 3 +- wrap/tests/expected/@Test/return_field.cpp | 10 +- wrap/tests/expected/@Test/return_field.m | 3 +- wrap/tests/expected/@Test/return_int.cpp | 10 +- wrap/tests/expected/@Test/return_int.m | 3 +- wrap/tests/expected/@Test/return_matrix1.cpp | 10 +- wrap/tests/expected/@Test/return_matrix1.m | 3 +- wrap/tests/expected/@Test/return_matrix2.cpp | 10 +- wrap/tests/expected/@Test/return_matrix2.m | 3 +- wrap/tests/expected/@Test/return_pair.cpp | 12 +- wrap/tests/expected/@Test/return_pair.m | 3 +- wrap/tests/expected/@Test/return_ptrs.cpp | 16 ++- wrap/tests/expected/@Test/return_ptrs.m | 3 +- wrap/tests/expected/@Test/return_size_t.cpp | 10 +- wrap/tests/expected/@Test/return_size_t.m | 3 +- wrap/tests/expected/@Test/return_string.cpp | 10 +- wrap/tests/expected/@Test/return_string.m | 3 +- wrap/tests/expected/@Test/return_vector1.cpp | 10 +- wrap/tests/expected/@Test/return_vector1.m | 3 +- wrap/tests/expected/@Test/return_vector2.cpp | 10 +- wrap/tests/expected/@Test/return_vector2.m | 3 +- wrap/tests/expected/Makefile | 20 +-- .../expected/Point3_StaticFunctionRet.cpp | 8 +- wrap/tests/expected/Point3_staticFunction.cpp | 3 + wrap/tests/expected/delete_Point2.cpp | 8 -- wrap/tests/expected/delete_Point2.m | 4 - wrap/tests/expected/delete_Point3.cpp | 9 -- wrap/tests/expected/delete_Point3.m | 4 - wrap/tests/expected/delete_Test.cpp | 9 -- wrap/tests/expected/delete_Test.m | 4 - wrap/tests/expected/make_geometry.m | 7 +- wrap/tests/expected/new_Point2_.cpp | 45 ++++++- wrap/tests/expected/new_Point2_.m | 2 +- wrap/tests/expected/new_Point2_dd.cpp | 11 -- wrap/tests/expected/new_Point2_dd.m | 4 - wrap/tests/expected/new_Point3_.cpp | 47 +++++++ wrap/tests/expected/new_Point3_.m | 4 + wrap/tests/expected/new_Point3_ddd.cpp | 13 -- wrap/tests/expected/new_Point3_ddd.m | 4 - wrap/tests/expected/new_Test_.cpp | 45 ++++++- wrap/tests/expected/new_Test_.m | 2 +- wrap/tests/expected/new_Test_dM.cpp | 12 -- wrap/tests/expected/new_Test_dM.m | 4 - .../expected_namespaces/@ClassD/ClassD.m | 10 +- .../@ns1ClassA/ns1ClassA.m | 10 +- .../@ns1ClassB/ns1ClassB.m | 10 +- .../@ns2ClassA/memberFunction.cpp | 8 +- .../@ns2ClassA/ns2ClassA.m | 10 +- .../expected_namespaces/@ns2ClassA/nsArg.cpp | 10 +- .../@ns2ClassA/nsReturn.cpp | 14 +- .../@ns2ClassC/ns2ClassC.m | 10 +- .../@ns2ns3ClassB/ns2ns3ClassB.m | 10 +- wrap/tests/expected_namespaces/Makefile | 24 +--- .../expected_namespaces/delete_ClassD.cpp | 8 -- .../tests/expected_namespaces/delete_ClassD.m | 4 - .../expected_namespaces/delete_ns1ClassA.cpp | 8 -- .../expected_namespaces/delete_ns1ClassA.m | 4 - .../expected_namespaces/delete_ns1ClassB.cpp | 9 -- .../expected_namespaces/delete_ns1ClassB.m | 4 - .../expected_namespaces/delete_ns2ClassA.cpp | 9 -- .../expected_namespaces/delete_ns2ClassA.m | 4 - .../expected_namespaces/delete_ns2ClassC.cpp | 8 -- .../expected_namespaces/delete_ns2ClassC.m | 4 - .../delete_ns2ns3ClassB.cpp | 9 -- .../expected_namespaces/delete_ns2ns3ClassB.m | 4 - .../expected_namespaces/make_testNamespaces.m | 6 - .../tests/expected_namespaces/new_ClassD_.cpp | 40 +++++- .../expected_namespaces/new_ns1ClassA_.cpp | 40 +++++- .../expected_namespaces/new_ns1ClassB_.cpp | 40 +++++- .../expected_namespaces/new_ns2ClassA_.cpp | 40 +++++- .../expected_namespaces/new_ns2ClassC_.cpp | 40 +++++- .../expected_namespaces/new_ns2ns3ClassB_.cpp | 40 +++++- .../ns2ClassA_afunction.cpp | 3 + wrap/tests/testWrap.cpp | 122 ++++++++++++------ 108 files changed, 783 insertions(+), 445 deletions(-) delete mode 100644 wrap/tests/expected/delete_Point2.cpp delete mode 100644 wrap/tests/expected/delete_Point2.m delete mode 100644 wrap/tests/expected/delete_Point3.cpp delete mode 100644 wrap/tests/expected/delete_Point3.m delete mode 100644 wrap/tests/expected/delete_Test.cpp delete mode 100644 wrap/tests/expected/delete_Test.m delete mode 100644 wrap/tests/expected/new_Point2_dd.cpp delete mode 100644 wrap/tests/expected/new_Point2_dd.m create mode 100644 wrap/tests/expected/new_Point3_.cpp create mode 100644 wrap/tests/expected/new_Point3_.m delete mode 100644 wrap/tests/expected/new_Point3_ddd.cpp delete mode 100644 wrap/tests/expected/new_Point3_ddd.m delete mode 100644 wrap/tests/expected/new_Test_dM.cpp delete mode 100644 wrap/tests/expected/new_Test_dM.m delete mode 100644 wrap/tests/expected_namespaces/delete_ClassD.cpp delete mode 100644 wrap/tests/expected_namespaces/delete_ClassD.m delete mode 100644 wrap/tests/expected_namespaces/delete_ns1ClassA.cpp delete mode 100644 wrap/tests/expected_namespaces/delete_ns1ClassA.m delete mode 100644 wrap/tests/expected_namespaces/delete_ns1ClassB.cpp delete mode 100644 wrap/tests/expected_namespaces/delete_ns1ClassB.m delete mode 100644 wrap/tests/expected_namespaces/delete_ns2ClassA.cpp delete mode 100644 wrap/tests/expected_namespaces/delete_ns2ClassA.m delete mode 100644 wrap/tests/expected_namespaces/delete_ns2ClassC.cpp delete mode 100644 wrap/tests/expected_namespaces/delete_ns2ClassC.m delete mode 100644 wrap/tests/expected_namespaces/delete_ns2ns3ClassB.cpp delete mode 100644 wrap/tests/expected_namespaces/delete_ns2ns3ClassB.m diff --git a/wrap/tests/expected/@Point2/Point2.m b/wrap/tests/expected/@Point2/Point2.m index 454d81399..68744ae00 100644 --- a/wrap/tests/expected/@Point2/Point2.m +++ b/wrap/tests/expected/@Point2/Point2.m @@ -5,12 +5,16 @@ classdef Point2 < handle end methods function obj = Point2(varargin) - if (nargin == 0), obj.self = new_Point2_(); end - if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Point2_dd(varargin{1},varargin{2}); end - if nargin ~= 13 && obj.self == 0, error('Point2 constructor failed'); end + if (nargin == 0), obj.self = new_Point2_(0,0); end + if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Point2_(0,1,varargin{1},varargin{2}); end + if nargin ==14, new_Point2_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point2 constructor failed'); end end function delete(obj) - delete_Point2(obj); + if obj.self ~= 0 + new_Point2_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected/@Point2/argChar.cpp b/wrap/tests/expected/@Point2/argChar.cpp index 18548ee8f..e5fac45fe 100644 --- a/wrap/tests/expected/@Point2/argChar.cpp +++ b/wrap/tests/expected/@Point2/argChar.cpp @@ -1,10 +1,14 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("argChar",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - char a = unwrap< char >(in[1]); - self->argChar(a); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + char a = unwrap< char >(in[1]); + obj->argChar(a); } diff --git a/wrap/tests/expected/@Point2/argChar.m b/wrap/tests/expected/@Point2/argChar.m index 93880c5b1..6c935a1d6 100644 --- a/wrap/tests/expected/@Point2/argChar.m +++ b/wrap/tests/expected/@Point2/argChar.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.argChar(a) function result = argChar(obj,a) -% usage: obj.argChar(a) error('need to compile argChar.cpp'); end diff --git a/wrap/tests/expected/@Point2/argUChar.cpp b/wrap/tests/expected/@Point2/argUChar.cpp index bbaa65a8f..54c592915 100644 --- a/wrap/tests/expected/@Point2/argUChar.cpp +++ b/wrap/tests/expected/@Point2/argUChar.cpp @@ -1,10 +1,14 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("argUChar",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - unsigned char a = unwrap< unsigned char >(in[1]); - self->argUChar(a); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + unsigned char a = unwrap< unsigned char >(in[1]); + obj->argUChar(a); } diff --git a/wrap/tests/expected/@Point2/argUChar.m b/wrap/tests/expected/@Point2/argUChar.m index bb524b3f0..ea42a2b4f 100644 --- a/wrap/tests/expected/@Point2/argUChar.m +++ b/wrap/tests/expected/@Point2/argUChar.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.argUChar(a) function result = argUChar(obj,a) -% usage: obj.argUChar(a) error('need to compile argUChar.cpp'); end diff --git a/wrap/tests/expected/@Point2/dim.cpp b/wrap/tests/expected/@Point2/dim.cpp index 1349dc267..7e44ae075 100644 --- a/wrap/tests/expected/@Point2/dim.cpp +++ b/wrap/tests/expected/@Point2/dim.cpp @@ -1,10 +1,14 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("dim",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - int result = self->dim(); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + int result = obj->dim(); out[0] = wrap< int >(result); } diff --git a/wrap/tests/expected/@Point2/dim.m b/wrap/tests/expected/@Point2/dim.m index 84c368193..934e0b895 100644 --- a/wrap/tests/expected/@Point2/dim.m +++ b/wrap/tests/expected/@Point2/dim.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.dim() function result = dim(obj) -% usage: obj.dim() error('need to compile dim.cpp'); end diff --git a/wrap/tests/expected/@Point2/returnChar.cpp b/wrap/tests/expected/@Point2/returnChar.cpp index c5b67a018..43a537786 100644 --- a/wrap/tests/expected/@Point2/returnChar.cpp +++ b/wrap/tests/expected/@Point2/returnChar.cpp @@ -1,10 +1,14 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("returnChar",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - char result = self->returnChar(); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + char result = obj->returnChar(); out[0] = wrap< char >(result); } diff --git a/wrap/tests/expected/@Point2/returnChar.m b/wrap/tests/expected/@Point2/returnChar.m index a33718047..8c3ceee35 100644 --- a/wrap/tests/expected/@Point2/returnChar.m +++ b/wrap/tests/expected/@Point2/returnChar.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.returnChar() function result = returnChar(obj) -% usage: obj.returnChar() error('need to compile returnChar.cpp'); end diff --git a/wrap/tests/expected/@Point2/vectorConfusion.cpp b/wrap/tests/expected/@Point2/vectorConfusion.cpp index d992d1d94..e3aa4f0d6 100644 --- a/wrap/tests/expected/@Point2/vectorConfusion.cpp +++ b/wrap/tests/expected/@Point2/vectorConfusion.cpp @@ -1,10 +1,16 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr SharedVectorNotEigen; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("vectorConfusion",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - VectorNotEigen result = self->vectorConfusion(); - out[0] = wrap_shared_ptr(boost::make_shared< VectorNotEigen >(result),"VectorNotEigen"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + VectorNotEigen result = obj->vectorConfusion(); + SharedVectorNotEigen* ret = new SharedVectorNotEigen(new VectorNotEigen(result)); + out[0] = wrap_collect_shared_ptr(ret,"VectorNotEigen"); } diff --git a/wrap/tests/expected/@Point2/vectorConfusion.m b/wrap/tests/expected/@Point2/vectorConfusion.m index cc47b0dc7..9966c930d 100644 --- a/wrap/tests/expected/@Point2/vectorConfusion.m +++ b/wrap/tests/expected/@Point2/vectorConfusion.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.vectorConfusion() function result = vectorConfusion(obj) -% usage: obj.vectorConfusion() error('need to compile vectorConfusion.cpp'); end diff --git a/wrap/tests/expected/@Point2/x.cpp b/wrap/tests/expected/@Point2/x.cpp index 65e56cae5..8cebadb66 100644 --- a/wrap/tests/expected/@Point2/x.cpp +++ b/wrap/tests/expected/@Point2/x.cpp @@ -1,10 +1,14 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("x",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - double result = self->x(); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + double result = obj->x(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Point2/x.m b/wrap/tests/expected/@Point2/x.m index e1ebbd450..44f069872 100644 --- a/wrap/tests/expected/@Point2/x.m +++ b/wrap/tests/expected/@Point2/x.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.x() function result = x(obj) -% usage: obj.x() error('need to compile x.cpp'); end diff --git a/wrap/tests/expected/@Point2/y.cpp b/wrap/tests/expected/@Point2/y.cpp index f8e10dc5d..7e3650534 100644 --- a/wrap/tests/expected/@Point2/y.cpp +++ b/wrap/tests/expected/@Point2/y.cpp @@ -1,10 +1,14 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("y",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - double result = self->y(); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + double result = obj->y(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Point2/y.m b/wrap/tests/expected/@Point2/y.m index d27fc8bf2..7971c1e33 100644 --- a/wrap/tests/expected/@Point2/y.m +++ b/wrap/tests/expected/@Point2/y.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.y() function result = y(obj) -% usage: obj.y() error('need to compile y.cpp'); end diff --git a/wrap/tests/expected/@Point3/Point3.m b/wrap/tests/expected/@Point3/Point3.m index 3e7a6fd65..b916293b7 100644 --- a/wrap/tests/expected/@Point3/Point3.m +++ b/wrap/tests/expected/@Point3/Point3.m @@ -5,11 +5,15 @@ classdef Point3 < handle end methods function obj = Point3(varargin) - if (nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double')), obj.self = new_Point3_ddd(varargin{1},varargin{2},varargin{3}); end - if nargin ~= 13 && obj.self == 0, error('Point3 constructor failed'); end + if (nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double')), obj.self = new_Point3_(0,0,varargin{1},varargin{2},varargin{3}); end + if nargin ==14, new_Point3_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point3 constructor failed'); end end function delete(obj) - delete_Point3(obj); + if obj.self ~= 0 + new_Point3_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected/@Point3/norm.cpp b/wrap/tests/expected/@Point3/norm.cpp index 0c7ac2038..8f6a10b72 100644 --- a/wrap/tests/expected/@Point3/norm.cpp +++ b/wrap/tests/expected/@Point3/norm.cpp @@ -1,11 +1,15 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("norm",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Point3 >(in[0],"Point3"); - double result = self->norm(); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + double result = obj->norm(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Test/Test.m b/wrap/tests/expected/@Test/Test.m index b8e55381c..e4bd30221 100644 --- a/wrap/tests/expected/@Test/Test.m +++ b/wrap/tests/expected/@Test/Test.m @@ -5,12 +5,16 @@ classdef Test < handle end methods function obj = Test(varargin) - if (nargin == 0), obj.self = new_Test_(); end - if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Test_dM(varargin{1},varargin{2}); end - if nargin ~= 13 && obj.self == 0, error('Test constructor failed'); end + if (nargin == 0), obj.self = new_Test_(0,0); end + if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Test_(0,1,varargin{1},varargin{2}); end + if nargin ==14, new_Test_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Test constructor failed'); end end function delete(obj) - delete_Test(obj); + if obj.self ~= 0 + new_Test_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp b/wrap/tests/expected/@Test/arg_EigenConstRef.cpp index 09a5c6f62..848870d11 100644 --- a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp +++ b/wrap/tests/expected/@Test/arg_EigenConstRef.cpp @@ -1,11 +1,15 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("arg_EigenConstRef",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); - self->arg_EigenConstRef(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); + obj->arg_EigenConstRef(value); } diff --git a/wrap/tests/expected/@Test/arg_EigenConstRef.m b/wrap/tests/expected/@Test/arg_EigenConstRef.m index 9e6c04c5a..c348014c1 100644 --- a/wrap/tests/expected/@Test/arg_EigenConstRef.m +++ b/wrap/tests/expected/@Test/arg_EigenConstRef.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.arg_EigenConstRef(value) function result = arg_EigenConstRef(obj,value) -% usage: obj.arg_EigenConstRef(value) error('need to compile arg_EigenConstRef.cpp'); end diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.cpp b/wrap/tests/expected/@Test/create_MixedPtrs.cpp index 81bcdc5d8..1776c855b 100644 --- a/wrap/tests/expected/@Test/create_MixedPtrs.cpp +++ b/wrap/tests/expected/@Test/create_MixedPtrs.cpp @@ -1,12 +1,20 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("create_MixedPtrs",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - pair< Test, boost::shared_ptr > result = self->create_MixedPtrs(); - out[0] = wrap_shared_ptr(boost::make_shared< Test >(result.first),"Test"); - out[1] = wrap_shared_ptr(result.second,"Test"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + pair< Test, SharedTest > result = obj->create_MixedPtrs(); + SharedTest* ret = new SharedTest(new Test(result.first)); + out[0] = wrap_collect_shared_ptr(ret,"Test"); + SharedTest* ret = new SharedTest(result.second); + out[1] = wrap_collect_shared_ptr(ret,"Test"); } diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.m b/wrap/tests/expected/@Test/create_MixedPtrs.m index bd1927fba..38a9f1d7e 100644 --- a/wrap/tests/expected/@Test/create_MixedPtrs.m +++ b/wrap/tests/expected/@Test/create_MixedPtrs.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% [first,second] = obj.create_MixedPtrs() function [first,second] = create_MixedPtrs(obj) -% usage: obj.create_MixedPtrs() error('need to compile create_MixedPtrs.cpp'); end diff --git a/wrap/tests/expected/@Test/create_ptrs.cpp b/wrap/tests/expected/@Test/create_ptrs.cpp index 830d62a12..ab4261d5c 100644 --- a/wrap/tests/expected/@Test/create_ptrs.cpp +++ b/wrap/tests/expected/@Test/create_ptrs.cpp @@ -1,12 +1,20 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("create_ptrs",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - pair< boost::shared_ptr, boost::shared_ptr > result = self->create_ptrs(); - out[0] = wrap_shared_ptr(result.first,"Test"); - out[1] = wrap_shared_ptr(result.second,"Test"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + pair< SharedTest, SharedTest > result = obj->create_ptrs(); + SharedTest* ret = new SharedTest(result.first); + out[0] = wrap_collect_shared_ptr(ret,"Test"); + SharedTest* ret = new SharedTest(result.second); + out[1] = wrap_collect_shared_ptr(ret,"Test"); } diff --git a/wrap/tests/expected/@Test/create_ptrs.m b/wrap/tests/expected/@Test/create_ptrs.m index e380f1829..80c6781dc 100644 --- a/wrap/tests/expected/@Test/create_ptrs.m +++ b/wrap/tests/expected/@Test/create_ptrs.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% [first,second] = obj.create_ptrs() function [first,second] = create_ptrs(obj) -% usage: obj.create_ptrs() error('need to compile create_ptrs.cpp'); end diff --git a/wrap/tests/expected/@Test/print.cpp b/wrap/tests/expected/@Test/print.cpp index 1d259f2e8..e3a758182 100644 --- a/wrap/tests/expected/@Test/print.cpp +++ b/wrap/tests/expected/@Test/print.cpp @@ -1,10 +1,14 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("print",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - self->print(); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + obj->print(); } diff --git a/wrap/tests/expected/@Test/return_Point2Ptr.cpp b/wrap/tests/expected/@Test/return_Point2Ptr.cpp index e6990198e..b3e61d37a 100644 --- a/wrap/tests/expected/@Test/return_Point2Ptr.cpp +++ b/wrap/tests/expected/@Test/return_Point2Ptr.cpp @@ -1,12 +1,18 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr SharedPoint2; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_Point2Ptr",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - bool value = unwrap< bool >(in[1]); - boost::shared_ptr result = self->return_Point2Ptr(value); - out[0] = wrap_shared_ptr(result,"Point2"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + bool value = unwrap< bool >(in[1]); + SharedPoint2 result = obj->return_Point2Ptr(value); + SharedPoint2* ret = new SharedPoint2(result); + out[0] = wrap_collect_shared_ptr(ret,"Point2"); } diff --git a/wrap/tests/expected/@Test/return_Point2Ptr.m b/wrap/tests/expected/@Test/return_Point2Ptr.m index 26fd146a2..84e586bc7 100644 --- a/wrap/tests/expected/@Test/return_Point2Ptr.m +++ b/wrap/tests/expected/@Test/return_Point2Ptr.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_Point2Ptr(value) function result = return_Point2Ptr(obj,value) -% usage: obj.return_Point2Ptr(value) error('need to compile return_Point2Ptr.cpp'); end diff --git a/wrap/tests/expected/@Test/return_Test.cpp b/wrap/tests/expected/@Test/return_Test.cpp index 63e9f5a3b..cd0f1ef10 100644 --- a/wrap/tests/expected/@Test/return_Test.cpp +++ b/wrap/tests/expected/@Test/return_Test.cpp @@ -1,12 +1,18 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_Test",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - Test result = self->return_Test(value); - out[0] = wrap_shared_ptr(boost::make_shared< Test >(result),"Test"); + Test result = obj->return_Test(value); + SharedTest* ret = new SharedTest(new Test(result)); + out[0] = wrap_collect_shared_ptr(ret,"Test"); } diff --git a/wrap/tests/expected/@Test/return_Test.m b/wrap/tests/expected/@Test/return_Test.m index f31dc3192..d1a2e440c 100644 --- a/wrap/tests/expected/@Test/return_Test.m +++ b/wrap/tests/expected/@Test/return_Test.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_Test(value) function result = return_Test(obj,value) -% usage: obj.return_Test(value) error('need to compile return_Test.cpp'); end diff --git a/wrap/tests/expected/@Test/return_TestPtr.cpp b/wrap/tests/expected/@Test/return_TestPtr.cpp index 3c053791d..2957de8f3 100644 --- a/wrap/tests/expected/@Test/return_TestPtr.cpp +++ b/wrap/tests/expected/@Test/return_TestPtr.cpp @@ -1,12 +1,18 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_TestPtr",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - boost::shared_ptr result = self->return_TestPtr(value); - out[0] = wrap_shared_ptr(result,"Test"); + SharedTest result = obj->return_TestPtr(value); + SharedTest* ret = new SharedTest(result); + out[0] = wrap_collect_shared_ptr(ret,"Test"); } diff --git a/wrap/tests/expected/@Test/return_TestPtr.m b/wrap/tests/expected/@Test/return_TestPtr.m index e69149551..937c85fcc 100644 --- a/wrap/tests/expected/@Test/return_TestPtr.m +++ b/wrap/tests/expected/@Test/return_TestPtr.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_TestPtr(value) function result = return_TestPtr(obj,value) -% usage: obj.return_TestPtr(value) error('need to compile return_TestPtr.cpp'); end diff --git a/wrap/tests/expected/@Test/return_bool.cpp b/wrap/tests/expected/@Test/return_bool.cpp index 92612a279..c9c792934 100644 --- a/wrap/tests/expected/@Test/return_bool.cpp +++ b/wrap/tests/expected/@Test/return_bool.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_bool",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - bool value = unwrap< bool >(in[1]); - bool result = self->return_bool(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + bool value = unwrap< bool >(in[1]); + bool result = obj->return_bool(value); out[0] = wrap< bool >(result); } diff --git a/wrap/tests/expected/@Test/return_bool.m b/wrap/tests/expected/@Test/return_bool.m index a0c5a0b17..358cb9750 100644 --- a/wrap/tests/expected/@Test/return_bool.m +++ b/wrap/tests/expected/@Test/return_bool.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_bool(value) function result = return_bool(obj,value) -% usage: obj.return_bool(value) error('need to compile return_bool.cpp'); end diff --git a/wrap/tests/expected/@Test/return_double.cpp b/wrap/tests/expected/@Test/return_double.cpp index e167a16c0..4e6612278 100644 --- a/wrap/tests/expected/@Test/return_double.cpp +++ b/wrap/tests/expected/@Test/return_double.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_double",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - double value = unwrap< double >(in[1]); - double result = self->return_double(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + double value = unwrap< double >(in[1]); + double result = obj->return_double(value); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Test/return_double.m b/wrap/tests/expected/@Test/return_double.m index dd181ff0b..681371f39 100644 --- a/wrap/tests/expected/@Test/return_double.m +++ b/wrap/tests/expected/@Test/return_double.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_double(value) function result = return_double(obj,value) -% usage: obj.return_double(value) error('need to compile return_double.cpp'); end diff --git a/wrap/tests/expected/@Test/return_field.cpp b/wrap/tests/expected/@Test/return_field.cpp index 838bab0a4..43507f4d7 100644 --- a/wrap/tests/expected/@Test/return_field.cpp +++ b/wrap/tests/expected/@Test/return_field.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_field",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); - bool result = self->return_field(t); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); + bool result = obj->return_field(t); out[0] = wrap< bool >(result); } diff --git a/wrap/tests/expected/@Test/return_field.m b/wrap/tests/expected/@Test/return_field.m index bc4223671..e2894c381 100644 --- a/wrap/tests/expected/@Test/return_field.m +++ b/wrap/tests/expected/@Test/return_field.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_field(t) function result = return_field(obj,t) -% usage: obj.return_field(t) error('need to compile return_field.cpp'); end diff --git a/wrap/tests/expected/@Test/return_int.cpp b/wrap/tests/expected/@Test/return_int.cpp index 4cdaf5abc..2a27ac73a 100644 --- a/wrap/tests/expected/@Test/return_int.cpp +++ b/wrap/tests/expected/@Test/return_int.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_int",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - int value = unwrap< int >(in[1]); - int result = self->return_int(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + int value = unwrap< int >(in[1]); + int result = obj->return_int(value); out[0] = wrap< int >(result); } diff --git a/wrap/tests/expected/@Test/return_int.m b/wrap/tests/expected/@Test/return_int.m index 4984557e6..779e9feb2 100644 --- a/wrap/tests/expected/@Test/return_int.m +++ b/wrap/tests/expected/@Test/return_int.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_int(value) function result = return_int(obj,value) -% usage: obj.return_int(value) error('need to compile return_int.cpp'); end diff --git a/wrap/tests/expected/@Test/return_matrix1.cpp b/wrap/tests/expected/@Test/return_matrix1.cpp index f7fb72040..d4c66622b 100644 --- a/wrap/tests/expected/@Test/return_matrix1.cpp +++ b/wrap/tests/expected/@Test/return_matrix1.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_matrix1",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Matrix value = unwrap< Matrix >(in[1]); - Matrix result = self->return_matrix1(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + Matrix value = unwrap< Matrix >(in[1]); + Matrix result = obj->return_matrix1(value); out[0] = wrap< Matrix >(result); } diff --git a/wrap/tests/expected/@Test/return_matrix1.m b/wrap/tests/expected/@Test/return_matrix1.m index 66dd1886f..d6d9791f9 100644 --- a/wrap/tests/expected/@Test/return_matrix1.m +++ b/wrap/tests/expected/@Test/return_matrix1.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_matrix1(value) function result = return_matrix1(obj,value) -% usage: obj.return_matrix1(value) error('need to compile return_matrix1.cpp'); end diff --git a/wrap/tests/expected/@Test/return_matrix2.cpp b/wrap/tests/expected/@Test/return_matrix2.cpp index f8b6823fa..a40fa79cf 100644 --- a/wrap/tests/expected/@Test/return_matrix2.cpp +++ b/wrap/tests/expected/@Test/return_matrix2.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_matrix2",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Matrix value = unwrap< Matrix >(in[1]); - Matrix result = self->return_matrix2(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + Matrix value = unwrap< Matrix >(in[1]); + Matrix result = obj->return_matrix2(value); out[0] = wrap< Matrix >(result); } diff --git a/wrap/tests/expected/@Test/return_matrix2.m b/wrap/tests/expected/@Test/return_matrix2.m index 5a0359862..584b365b8 100644 --- a/wrap/tests/expected/@Test/return_matrix2.m +++ b/wrap/tests/expected/@Test/return_matrix2.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_matrix2(value) function result = return_matrix2(obj,value) -% usage: obj.return_matrix2(value) error('need to compile return_matrix2.cpp'); end diff --git a/wrap/tests/expected/@Test/return_pair.cpp b/wrap/tests/expected/@Test/return_pair.cpp index 54b3f6522..7d715644c 100644 --- a/wrap/tests/expected/@Test/return_pair.cpp +++ b/wrap/tests/expected/@Test/return_pair.cpp @@ -1,14 +1,18 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_pair",nargout,nargin-1,2); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Vector v = unwrap< Vector >(in[1]); - Matrix A = unwrap< Matrix >(in[2]); - pair< Vector, Matrix > result = self->return_pair(v,A); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + Vector v = unwrap< Vector >(in[1]); + Matrix A = unwrap< Matrix >(in[2]); + pair< Vector, Matrix > result = obj->return_pair(v,A); out[0] = wrap< Vector >(result.first); out[1] = wrap< Matrix >(result.second); } diff --git a/wrap/tests/expected/@Test/return_pair.m b/wrap/tests/expected/@Test/return_pair.m index 611dd3434..2e892210c 100644 --- a/wrap/tests/expected/@Test/return_pair.m +++ b/wrap/tests/expected/@Test/return_pair.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% [first,second] = obj.return_pair(v,A) function [first,second] = return_pair(obj,v,A) -% usage: obj.return_pair(v,A) error('need to compile return_pair.cpp'); end diff --git a/wrap/tests/expected/@Test/return_ptrs.cpp b/wrap/tests/expected/@Test/return_ptrs.cpp index eea94ca3c..8a5f9a0ce 100644 --- a/wrap/tests/expected/@Test/return_ptrs.cpp +++ b/wrap/tests/expected/@Test/return_ptrs.cpp @@ -1,14 +1,22 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr SharedTest; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_ptrs",nargout,nargin-1,2); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); - pair< boost::shared_ptr, boost::shared_ptr > result = self->return_ptrs(p1,p2); - out[0] = wrap_shared_ptr(result.first,"Test"); - out[1] = wrap_shared_ptr(result.second,"Test"); + pair< SharedTest, SharedTest > result = obj->return_ptrs(p1,p2); + SharedTest* ret = new SharedTest(result.first); + out[0] = wrap_collect_shared_ptr(ret,"Test"); + SharedTest* ret = new SharedTest(result.second); + out[1] = wrap_collect_shared_ptr(ret,"Test"); } diff --git a/wrap/tests/expected/@Test/return_ptrs.m b/wrap/tests/expected/@Test/return_ptrs.m index 18d69ac92..a7af4b73c 100644 --- a/wrap/tests/expected/@Test/return_ptrs.m +++ b/wrap/tests/expected/@Test/return_ptrs.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% [first,second] = obj.return_ptrs(p1,p2) function [first,second] = return_ptrs(obj,p1,p2) -% usage: obj.return_ptrs(p1,p2) error('need to compile return_ptrs.cpp'); end diff --git a/wrap/tests/expected/@Test/return_size_t.cpp b/wrap/tests/expected/@Test/return_size_t.cpp index 901c5c9bd..f18680d0d 100644 --- a/wrap/tests/expected/@Test/return_size_t.cpp +++ b/wrap/tests/expected/@Test/return_size_t.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_size_t",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - size_t value = unwrap< size_t >(in[1]); - size_t result = self->return_size_t(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + size_t value = unwrap< size_t >(in[1]); + size_t result = obj->return_size_t(value); out[0] = wrap< size_t >(result); } diff --git a/wrap/tests/expected/@Test/return_size_t.m b/wrap/tests/expected/@Test/return_size_t.m index 143f04d24..2fae64028 100644 --- a/wrap/tests/expected/@Test/return_size_t.m +++ b/wrap/tests/expected/@Test/return_size_t.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_size_t(value) function result = return_size_t(obj,value) -% usage: obj.return_size_t(value) error('need to compile return_size_t.cpp'); end diff --git a/wrap/tests/expected/@Test/return_string.cpp b/wrap/tests/expected/@Test/return_string.cpp index 778e07522..013814241 100644 --- a/wrap/tests/expected/@Test/return_string.cpp +++ b/wrap/tests/expected/@Test/return_string.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_string",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - string value = unwrap< string >(in[1]); - string result = self->return_string(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + string value = unwrap< string >(in[1]); + string result = obj->return_string(value); out[0] = wrap< string >(result); } diff --git a/wrap/tests/expected/@Test/return_string.m b/wrap/tests/expected/@Test/return_string.m index f1eab8661..67fb5f10d 100644 --- a/wrap/tests/expected/@Test/return_string.m +++ b/wrap/tests/expected/@Test/return_string.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_string(value) function result = return_string(obj,value) -% usage: obj.return_string(value) error('need to compile return_string.cpp'); end diff --git a/wrap/tests/expected/@Test/return_vector1.cpp b/wrap/tests/expected/@Test/return_vector1.cpp index 5e8aed397..593cd20bd 100644 --- a/wrap/tests/expected/@Test/return_vector1.cpp +++ b/wrap/tests/expected/@Test/return_vector1.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_vector1",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Vector value = unwrap< Vector >(in[1]); - Vector result = self->return_vector1(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + Vector value = unwrap< Vector >(in[1]); + Vector result = obj->return_vector1(value); out[0] = wrap< Vector >(result); } diff --git a/wrap/tests/expected/@Test/return_vector1.m b/wrap/tests/expected/@Test/return_vector1.m index 316ca4cf2..461c51618 100644 --- a/wrap/tests/expected/@Test/return_vector1.m +++ b/wrap/tests/expected/@Test/return_vector1.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_vector1(value) function result = return_vector1(obj,value) -% usage: obj.return_vector1(value) error('need to compile return_vector1.cpp'); end diff --git a/wrap/tests/expected/@Test/return_vector2.cpp b/wrap/tests/expected/@Test/return_vector2.cpp index 4c3242f2e..1be4a614a 100644 --- a/wrap/tests/expected/@Test/return_vector2.cpp +++ b/wrap/tests/expected/@Test/return_vector2.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_vector2",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Vector value = unwrap< Vector >(in[1]); - Vector result = self->return_vector2(value); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + Vector value = unwrap< Vector >(in[1]); + Vector result = obj->return_vector2(value); out[0] = wrap< Vector >(result); } diff --git a/wrap/tests/expected/@Test/return_vector2.m b/wrap/tests/expected/@Test/return_vector2.m index 6426e0ce9..f3c77dd85 100644 --- a/wrap/tests/expected/@Test/return_vector2.m +++ b/wrap/tests/expected/@Test/return_vector2.m @@ -1,5 +1,4 @@ -% automatically generated by wrap +% result = obj.return_vector2(value) function result = return_vector2(obj,value) -% usage: obj.return_vector2(value) error('need to compile return_vector2.cpp'); end diff --git a/wrap/tests/expected/Makefile b/wrap/tests/expected/Makefile index a8959757b..0797d0dd3 100644 --- a/wrap/tests/expected/Makefile +++ b/wrap/tests/expected/Makefile @@ -9,10 +9,6 @@ all: Point2 Point3 Test # Point2 new_Point2_.$(MEXENDING): new_Point2_.cpp $(MEX) $(mex_flags) new_Point2_.cpp -output new_Point2_ -new_Point2_dd.$(MEXENDING): new_Point2_dd.cpp - $(MEX) $(mex_flags) new_Point2_dd.cpp -output new_Point2_dd -delete_Point2.$(MEXENDING): delete_Point2.cpp - $(MEX) $(mex_flags) delete_Point2.cpp -output delete_Point2 @Point2/x.$(MEXENDING): @Point2/x.cpp $(MEX) $(mex_flags) @Point2/x.cpp -output @Point2/x @Point2/y.$(MEXENDING): @Point2/y.cpp @@ -28,13 +24,11 @@ delete_Point2.$(MEXENDING): delete_Point2.cpp @Point2/vectorConfusion.$(MEXENDING): @Point2/vectorConfusion.cpp $(MEX) $(mex_flags) @Point2/vectorConfusion.cpp -output @Point2/vectorConfusion -Point2: new_Point2_.$(MEXENDING) new_Point2_dd.$(MEXENDING) delete_Point2.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) @Point2/returnChar.$(MEXENDING) @Point2/argChar.$(MEXENDING) @Point2/argUChar.$(MEXENDING) @Point2/vectorConfusion.$(MEXENDING) +Point2: new_Point2_.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) @Point2/returnChar.$(MEXENDING) @Point2/argChar.$(MEXENDING) @Point2/argUChar.$(MEXENDING) @Point2/vectorConfusion.$(MEXENDING) # Point3 -new_Point3_ddd.$(MEXENDING): new_Point3_ddd.cpp - $(MEX) $(mex_flags) new_Point3_ddd.cpp -output new_Point3_ddd -delete_Point3.$(MEXENDING): delete_Point3.cpp - $(MEX) $(mex_flags) delete_Point3.cpp -output delete_Point3 +new_Point3_.$(MEXENDING): new_Point3_.cpp + $(MEX) $(mex_flags) new_Point3_.cpp -output new_Point3_ Point3_staticFunction.$(MEXENDING): Point3_staticFunction.cpp $(MEX) $(mex_flags) Point3_staticFunction.cpp -output Point3_staticFunction Point3_StaticFunctionRet.$(MEXENDING): Point3_StaticFunctionRet.cpp @@ -42,15 +36,11 @@ Point3_StaticFunctionRet.$(MEXENDING): Point3_StaticFunctionRet.cpp @Point3/norm.$(MEXENDING): @Point3/norm.cpp $(MEX) $(mex_flags) @Point3/norm.cpp -output @Point3/norm -Point3: new_Point3_ddd.$(MEXENDING) delete_Point3.$(MEXENDING) Point3_staticFunction.$(MEXENDING) Point3_StaticFunctionRet.$(MEXENDING) @Point3/norm.$(MEXENDING) +Point3: new_Point3_.$(MEXENDING) Point3_staticFunction.$(MEXENDING) Point3_StaticFunctionRet.$(MEXENDING) @Point3/norm.$(MEXENDING) # Test new_Test_.$(MEXENDING): new_Test_.cpp $(MEX) $(mex_flags) new_Test_.cpp -output new_Test_ -new_Test_dM.$(MEXENDING): new_Test_dM.cpp - $(MEX) $(mex_flags) new_Test_dM.cpp -output new_Test_dM -delete_Test.$(MEXENDING): delete_Test.cpp - $(MEX) $(mex_flags) delete_Test.cpp -output delete_Test @Test/return_pair.$(MEXENDING): @Test/return_pair.cpp $(MEX) $(mex_flags) @Test/return_pair.cpp -output @Test/return_pair @Test/return_bool.$(MEXENDING): @Test/return_bool.cpp @@ -90,7 +80,7 @@ delete_Test.$(MEXENDING): delete_Test.cpp @Test/print.$(MEXENDING): @Test/print.cpp $(MEX) $(mex_flags) @Test/print.cpp -output @Test/print -Test: new_Test_.$(MEXENDING) new_Test_dM.$(MEXENDING) delete_Test.$(MEXENDING) @Test/return_pair.$(MEXENDING) @Test/return_bool.$(MEXENDING) @Test/return_size_t.$(MEXENDING) @Test/return_int.$(MEXENDING) @Test/return_double.$(MEXENDING) @Test/return_string.$(MEXENDING) @Test/return_vector1.$(MEXENDING) @Test/return_matrix1.$(MEXENDING) @Test/return_vector2.$(MEXENDING) @Test/return_matrix2.$(MEXENDING) @Test/arg_EigenConstRef.$(MEXENDING) @Test/return_field.$(MEXENDING) @Test/return_TestPtr.$(MEXENDING) @Test/return_Test.$(MEXENDING) @Test/return_Point2Ptr.$(MEXENDING) @Test/create_ptrs.$(MEXENDING) @Test/create_MixedPtrs.$(MEXENDING) @Test/return_ptrs.$(MEXENDING) @Test/print.$(MEXENDING) +Test: new_Test_.$(MEXENDING) @Test/return_pair.$(MEXENDING) @Test/return_bool.$(MEXENDING) @Test/return_size_t.$(MEXENDING) @Test/return_int.$(MEXENDING) @Test/return_double.$(MEXENDING) @Test/return_string.$(MEXENDING) @Test/return_vector1.$(MEXENDING) @Test/return_matrix1.$(MEXENDING) @Test/return_vector2.$(MEXENDING) @Test/return_matrix2.$(MEXENDING) @Test/arg_EigenConstRef.$(MEXENDING) @Test/return_field.$(MEXENDING) @Test/return_TestPtr.$(MEXENDING) @Test/return_Test.$(MEXENDING) @Test/return_Point2Ptr.$(MEXENDING) @Test/create_ptrs.$(MEXENDING) @Test/create_MixedPtrs.$(MEXENDING) @Test/return_ptrs.$(MEXENDING) @Test/print.$(MEXENDING) diff --git a/wrap/tests/expected/Point3_StaticFunctionRet.cpp b/wrap/tests/expected/Point3_StaticFunctionRet.cpp index 652d8713e..49d15f4fa 100644 --- a/wrap/tests/expected/Point3_StaticFunctionRet.cpp +++ b/wrap/tests/expected/Point3_StaticFunctionRet.cpp @@ -1,11 +1,15 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr SharedPoint3; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("Point3_StaticFunctionRet",nargout,nargin,1); - double z = unwrap< double >(in[0]); + double z = unwrap< double >(in[0]); Point3 result = Point3::StaticFunctionRet(z); - out[0] = wrap_shared_ptr(boost::make_shared< Point3 >(result),"Point3"); + SharedPoint3* ret = new SharedPoint3(new Point3(result)); + out[0] = wrap_collect_shared_ptr(ret,"Point3"); } diff --git a/wrap/tests/expected/Point3_staticFunction.cpp b/wrap/tests/expected/Point3_staticFunction.cpp index 6adfdbe5a..e29670b9a 100644 --- a/wrap/tests/expected/Point3_staticFunction.cpp +++ b/wrap/tests/expected/Point3_staticFunction.cpp @@ -1,7 +1,10 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shareddouble; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("Point3_staticFunction",nargout,nargin,0); diff --git a/wrap/tests/expected/delete_Point2.cpp b/wrap/tests/expected/delete_Point2.cpp deleted file mode 100644 index bd8bd12eb..000000000 --- a/wrap/tests/expected/delete_Point2.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// automatically generated by wrap -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_Point2",nargout,nargin,1); - delete_shared_ptr< Point2 >(in[0],"Point2"); -} diff --git a/wrap/tests/expected/delete_Point2.m b/wrap/tests/expected/delete_Point2.m deleted file mode 100644 index c6c623bec..000000000 --- a/wrap/tests/expected/delete_Point2.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_Point2(obj) - error('need to compile delete_Point2.cpp'); -end diff --git a/wrap/tests/expected/delete_Point3.cpp b/wrap/tests/expected/delete_Point3.cpp deleted file mode 100644 index 9836bb25e..000000000 --- a/wrap/tests/expected/delete_Point3.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_Point3",nargout,nargin,1); - delete_shared_ptr< Point3 >(in[0],"Point3"); -} diff --git a/wrap/tests/expected/delete_Point3.m b/wrap/tests/expected/delete_Point3.m deleted file mode 100644 index b52b898cf..000000000 --- a/wrap/tests/expected/delete_Point3.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_Point3(obj) - error('need to compile delete_Point3.cpp'); -end diff --git a/wrap/tests/expected/delete_Test.cpp b/wrap/tests/expected/delete_Test.cpp deleted file mode 100644 index 6a22cc327..000000000 --- a/wrap/tests/expected/delete_Test.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_Test",nargout,nargin,1); - delete_shared_ptr< Test >(in[0],"Test"); -} diff --git a/wrap/tests/expected/delete_Test.m b/wrap/tests/expected/delete_Test.m deleted file mode 100644 index 21ec790a3..000000000 --- a/wrap/tests/expected/delete_Test.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_Test(obj) - error('need to compile delete_Test.cpp'); -end diff --git a/wrap/tests/expected/make_geometry.m b/wrap/tests/expected/make_geometry.m index 2858f2994..32f81871d 100644 --- a/wrap/tests/expected/make_geometry.m +++ b/wrap/tests/expected/make_geometry.m @@ -10,8 +10,6 @@ addpath(toolboxpath); %% Point2 cd(toolboxpath) mex -O5 new_Point2_.cpp -mex -O5 new_Point2_dd.cpp -mex -O5 delete_Point2.cpp cd @Point2 mex -O5 x.cpp @@ -24,8 +22,7 @@ mex -O5 vectorConfusion.cpp %% Point3 cd(toolboxpath) -mex -O5 new_Point3_ddd.cpp -mex -O5 delete_Point3.cpp +mex -O5 new_Point3_.cpp mex -O5 Point3_staticFunction.cpp mex -O5 Point3_StaticFunctionRet.cpp @@ -35,8 +32,6 @@ mex -O5 norm.cpp %% Test cd(toolboxpath) mex -O5 new_Test_.cpp -mex -O5 new_Test_dM.cpp -mex -O5 delete_Test.cpp cd @Test mex -O5 return_pair.cpp diff --git a/wrap/tests/expected/new_Point2_.cpp b/wrap/tests/expected/new_Point2_.cpp index a88076efb..7d3af0038 100644 --- a/wrap/tests/expected/new_Point2_.cpp +++ b/wrap/tests/expected/new_Point2_.cpp @@ -1,9 +1,48 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_Point2_",nargout,nargin,0); - Point2* self = new Point2(); - out[0] = wrap_constructed(self,"Point2"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new Point2()); + } + if(nc == 1) { + double x = unwrap< double >(in[2]); + double y = unwrap< double >(in[3]); + self = new Shared(new Point2(x,y)); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected/new_Point2_.m b/wrap/tests/expected/new_Point2_.m index b0b655b5e..b5fdcff15 100644 --- a/wrap/tests/expected/new_Point2_.m +++ b/wrap/tests/expected/new_Point2_.m @@ -1,4 +1,4 @@ % automatically generated by wrap -function result = new_Point2_(obj) +function result = new_Point2_(obj,x,y) error('need to compile new_Point2_.cpp'); end diff --git a/wrap/tests/expected/new_Point2_dd.cpp b/wrap/tests/expected/new_Point2_dd.cpp deleted file mode 100644 index 7c7f062b7..000000000 --- a/wrap/tests/expected/new_Point2_dd.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("new_Point2_dd",nargout,nargin,2); - double x = unwrap< double >(in[0]); - double y = unwrap< double >(in[1]); - Point2* self = new Point2(x,y); - out[0] = wrap_constructed(self,"Point2"); -} diff --git a/wrap/tests/expected/new_Point2_dd.m b/wrap/tests/expected/new_Point2_dd.m deleted file mode 100644 index 4a769ce30..000000000 --- a/wrap/tests/expected/new_Point2_dd.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Point2_dd(obj,x,y) - error('need to compile new_Point2_dd.cpp'); -end diff --git a/wrap/tests/expected/new_Point3_.cpp b/wrap/tests/expected/new_Point3_.cpp new file mode 100644 index 000000000..368b3069e --- /dev/null +++ b/wrap/tests/expected/new_Point3_.cpp @@ -0,0 +1,47 @@ +// automatically generated by wrap +#include +#include +#include +using namespace geometry; +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + double x = unwrap< double >(in[2]); + double y = unwrap< double >(in[3]); + double z = unwrap< double >(in[4]); + self = new Shared(new Point3(x,y,z)); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected/new_Point3_.m b/wrap/tests/expected/new_Point3_.m new file mode 100644 index 000000000..f306af227 --- /dev/null +++ b/wrap/tests/expected/new_Point3_.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_Point3_(obj,x,y,z) + error('need to compile new_Point3_.cpp'); +end diff --git a/wrap/tests/expected/new_Point3_ddd.cpp b/wrap/tests/expected/new_Point3_ddd.cpp deleted file mode 100644 index aa45dc71c..000000000 --- a/wrap/tests/expected/new_Point3_ddd.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("new_Point3_ddd",nargout,nargin,3); - double x = unwrap< double >(in[0]); - double y = unwrap< double >(in[1]); - double z = unwrap< double >(in[2]); - Point3* self = new Point3(x,y,z); - out[0] = wrap_constructed(self,"Point3"); -} diff --git a/wrap/tests/expected/new_Point3_ddd.m b/wrap/tests/expected/new_Point3_ddd.m deleted file mode 100644 index 154dda1d0..000000000 --- a/wrap/tests/expected/new_Point3_ddd.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Point3_ddd(obj,x,y,z) - error('need to compile new_Point3_ddd.cpp'); -end diff --git a/wrap/tests/expected/new_Test_.cpp b/wrap/tests/expected/new_Test_.cpp index 9c66706ae..a6bcc9549 100644 --- a/wrap/tests/expected/new_Test_.cpp +++ b/wrap/tests/expected/new_Test_.cpp @@ -1,10 +1,49 @@ // automatically generated by wrap #include +#include #include using namespace geometry; +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_Test_",nargout,nargin,0); - Test* self = new Test(); - out[0] = wrap_constructed(self,"Test"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new Test()); + } + if(nc == 1) { + double a = unwrap< double >(in[2]); + Matrix b = unwrap< Matrix >(in[3]); + self = new Shared(new Test(a,b)); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected/new_Test_.m b/wrap/tests/expected/new_Test_.m index 33c465f8b..82faf0fd6 100644 --- a/wrap/tests/expected/new_Test_.m +++ b/wrap/tests/expected/new_Test_.m @@ -1,4 +1,4 @@ % automatically generated by wrap -function result = new_Test_(obj) +function result = new_Test_(obj,a,b) error('need to compile new_Test_.cpp'); end diff --git a/wrap/tests/expected/new_Test_dM.cpp b/wrap/tests/expected/new_Test_dM.cpp deleted file mode 100644 index e8a7c8de1..000000000 --- a/wrap/tests/expected/new_Test_dM.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("new_Test_dM",nargout,nargin,2); - double a = unwrap< double >(in[0]); - Matrix b = unwrap< Matrix >(in[1]); - Test* self = new Test(a,b); - out[0] = wrap_constructed(self,"Test"); -} diff --git a/wrap/tests/expected/new_Test_dM.m b/wrap/tests/expected/new_Test_dM.m deleted file mode 100644 index c7009d6a9..000000000 --- a/wrap/tests/expected/new_Test_dM.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Test_dM(obj,a,b) - error('need to compile new_Test_dM.cpp'); -end diff --git a/wrap/tests/expected_namespaces/@ClassD/ClassD.m b/wrap/tests/expected_namespaces/@ClassD/ClassD.m index 9e3ddf132..2a82b6bbf 100644 --- a/wrap/tests/expected_namespaces/@ClassD/ClassD.m +++ b/wrap/tests/expected_namespaces/@ClassD/ClassD.m @@ -5,11 +5,15 @@ classdef ClassD < handle end methods function obj = ClassD(varargin) - if (nargin == 0), obj.self = new_ClassD_(); end - if nargin ~= 13 && obj.self == 0, error('ClassD constructor failed'); end + if (nargin == 0), obj.self = new_ClassD_(0,0); end + if nargin ==14, new_ClassD_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ClassD constructor failed'); end end function delete(obj) - delete_ClassD(obj); + if obj.self ~= 0 + new_ClassD_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m b/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m index 806070a36..f1cc51eda 100644 --- a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m +++ b/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m @@ -5,11 +5,15 @@ classdef ns1ClassA < handle end methods function obj = ns1ClassA(varargin) - if (nargin == 0), obj.self = new_ns1ClassA_(); end - if nargin ~= 13 && obj.self == 0, error('ns1ClassA constructor failed'); end + if (nargin == 0), obj.self = new_ns1ClassA_(0,0); end + if nargin ==14, new_ns1ClassA_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassA constructor failed'); end end function delete(obj) - delete_ns1ClassA(obj); + if obj.self ~= 0 + new_ns1ClassA_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m b/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m index 13d5846ae..9403d5b7c 100644 --- a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m +++ b/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m @@ -5,11 +5,15 @@ classdef ns1ClassB < handle end methods function obj = ns1ClassB(varargin) - if (nargin == 0), obj.self = new_ns1ClassB_(); end - if nargin ~= 13 && obj.self == 0, error('ns1ClassB constructor failed'); end + if (nargin == 0), obj.self = new_ns1ClassB_(0,0); end + if nargin ==14, new_ns1ClassB_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassB constructor failed'); end end function delete(obj) - delete_ns1ClassB(obj); + if obj.self ~= 0 + new_ns1ClassB_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp index 514e5db08..668980943 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp @@ -1,11 +1,15 @@ // automatically generated by wrap #include +#include #include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("memberFunction",nargout,nargin-1,0); - boost::shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); - double result = self->memberFunction(); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + double result = obj->memberFunction(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m b/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m index 188ac087d..b4c9de568 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m +++ b/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m @@ -5,11 +5,15 @@ classdef ns2ClassA < handle end methods function obj = ns2ClassA(varargin) - if (nargin == 0), obj.self = new_ns2ClassA_(); end - if nargin ~= 13 && obj.self == 0, error('ns2ClassA constructor failed'); end + if (nargin == 0), obj.self = new_ns2ClassA_(0,0); end + if nargin ==14, new_ns2ClassA_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassA constructor failed'); end end function delete(obj) - delete_ns2ClassA(obj); + if obj.self ~= 0 + new_ns2ClassA_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp index 789b0815e..a55fd5581 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp @@ -1,12 +1,16 @@ // automatically generated by wrap #include +#include #include #include +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("nsArg",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); - ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); - int result = self->nsArg(arg); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); + int result = obj->nsArg(arg); out[0] = wrap< int >(result); } diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp index dbeb42f60..334bc9928 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp @@ -1,12 +1,18 @@ // automatically generated by wrap #include +#include #include #include +typedef boost::shared_ptr SharedClassB; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("nsReturn",nargout,nargin-1,1); - boost::shared_ptr self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); - double q = unwrap< double >(in[1]); - ns2::ns3::ClassB result = self->nsReturn(q); - out[0] = wrap_shared_ptr(boost::make_shared< ns2::ns3::ClassB >(result),"ns2ns3ClassB"); + mxArray* mxh = mxGetProperty(in[0],0,"self"); + Shared* self = *reinterpret_cast (mxGetPr(mxh)); + Shared obj = *self; + double q = unwrap< double >(in[1]); + ns2::ns3::ClassB result = obj->nsReturn(q); + SharedClassB* ret = new SharedClassB(new ns2::ns3::ClassB(result)); + out[0] = wrap_collect_shared_ptr(ret,"ns2ns3ClassB"); } diff --git a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m b/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m index 793e73e64..13fbb49f3 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m +++ b/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m @@ -5,11 +5,15 @@ classdef ns2ClassC < handle end methods function obj = ns2ClassC(varargin) - if (nargin == 0), obj.self = new_ns2ClassC_(); end - if nargin ~= 13 && obj.self == 0, error('ns2ClassC constructor failed'); end + if (nargin == 0), obj.self = new_ns2ClassC_(0,0); end + if nargin ==14, new_ns2ClassC_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassC constructor failed'); end end function delete(obj) - delete_ns2ClassC(obj); + if obj.self ~= 0 + new_ns2ClassC_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m b/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m index 3997cd005..29e0721f0 100644 --- a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m +++ b/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m @@ -5,11 +5,15 @@ classdef ns2ns3ClassB < handle end methods function obj = ns2ns3ClassB(varargin) - if (nargin == 0), obj.self = new_ns2ns3ClassB_(); end - if nargin ~= 13 && obj.self == 0, error('ns2ns3ClassB constructor failed'); end + if (nargin == 0), obj.self = new_ns2ns3ClassB_(0,0); end + if nargin ==14, new_ns2ns3ClassB_(varargin{1},0); end + if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ns3ClassB constructor failed'); end end function delete(obj) - delete_ns2ns3ClassB(obj); + if obj.self ~= 0 + new_ns2ns3ClassB_(obj.self); + obj.self = 0; + end end function display(obj), obj.print(''); end function disp(obj), obj.display; end diff --git a/wrap/tests/expected_namespaces/Makefile b/wrap/tests/expected_namespaces/Makefile index c48a1b154..dcc3b1dbd 100644 --- a/wrap/tests/expected_namespaces/Makefile +++ b/wrap/tests/expected_namespaces/Makefile @@ -9,24 +9,18 @@ all: ns1ClassA ns1ClassB ns2ClassA ns2ns3ClassB ns2ClassC ClassD # ns1ClassA new_ns1ClassA_.$(MEXENDING): new_ns1ClassA_.cpp $(MEX) $(mex_flags) new_ns1ClassA_.cpp -output new_ns1ClassA_ -delete_ns1ClassA.$(MEXENDING): delete_ns1ClassA.cpp - $(MEX) $(mex_flags) delete_ns1ClassA.cpp -output delete_ns1ClassA -ns1ClassA: new_ns1ClassA_.$(MEXENDING) delete_ns1ClassA.$(MEXENDING) +ns1ClassA: new_ns1ClassA_.$(MEXENDING) # ns1ClassB new_ns1ClassB_.$(MEXENDING): new_ns1ClassB_.cpp $(MEX) $(mex_flags) new_ns1ClassB_.cpp -output new_ns1ClassB_ -delete_ns1ClassB.$(MEXENDING): delete_ns1ClassB.cpp - $(MEX) $(mex_flags) delete_ns1ClassB.cpp -output delete_ns1ClassB -ns1ClassB: new_ns1ClassB_.$(MEXENDING) delete_ns1ClassB.$(MEXENDING) +ns1ClassB: new_ns1ClassB_.$(MEXENDING) # ns2ClassA new_ns2ClassA_.$(MEXENDING): new_ns2ClassA_.cpp $(MEX) $(mex_flags) new_ns2ClassA_.cpp -output new_ns2ClassA_ -delete_ns2ClassA.$(MEXENDING): delete_ns2ClassA.cpp - $(MEX) $(mex_flags) delete_ns2ClassA.cpp -output delete_ns2ClassA ns2ClassA_afunction.$(MEXENDING): ns2ClassA_afunction.cpp $(MEX) $(mex_flags) ns2ClassA_afunction.cpp -output ns2ClassA_afunction @ns2ClassA/memberFunction.$(MEXENDING): @ns2ClassA/memberFunction.cpp @@ -36,31 +30,25 @@ ns2ClassA_afunction.$(MEXENDING): ns2ClassA_afunction.cpp @ns2ClassA/nsReturn.$(MEXENDING): @ns2ClassA/nsReturn.cpp $(MEX) $(mex_flags) @ns2ClassA/nsReturn.cpp -output @ns2ClassA/nsReturn -ns2ClassA: new_ns2ClassA_.$(MEXENDING) delete_ns2ClassA.$(MEXENDING) ns2ClassA_afunction.$(MEXENDING) @ns2ClassA/memberFunction.$(MEXENDING) @ns2ClassA/nsArg.$(MEXENDING) @ns2ClassA/nsReturn.$(MEXENDING) +ns2ClassA: new_ns2ClassA_.$(MEXENDING) ns2ClassA_afunction.$(MEXENDING) @ns2ClassA/memberFunction.$(MEXENDING) @ns2ClassA/nsArg.$(MEXENDING) @ns2ClassA/nsReturn.$(MEXENDING) # ns2ns3ClassB new_ns2ns3ClassB_.$(MEXENDING): new_ns2ns3ClassB_.cpp $(MEX) $(mex_flags) new_ns2ns3ClassB_.cpp -output new_ns2ns3ClassB_ -delete_ns2ns3ClassB.$(MEXENDING): delete_ns2ns3ClassB.cpp - $(MEX) $(mex_flags) delete_ns2ns3ClassB.cpp -output delete_ns2ns3ClassB -ns2ns3ClassB: new_ns2ns3ClassB_.$(MEXENDING) delete_ns2ns3ClassB.$(MEXENDING) +ns2ns3ClassB: new_ns2ns3ClassB_.$(MEXENDING) # ns2ClassC new_ns2ClassC_.$(MEXENDING): new_ns2ClassC_.cpp $(MEX) $(mex_flags) new_ns2ClassC_.cpp -output new_ns2ClassC_ -delete_ns2ClassC.$(MEXENDING): delete_ns2ClassC.cpp - $(MEX) $(mex_flags) delete_ns2ClassC.cpp -output delete_ns2ClassC -ns2ClassC: new_ns2ClassC_.$(MEXENDING) delete_ns2ClassC.$(MEXENDING) +ns2ClassC: new_ns2ClassC_.$(MEXENDING) # ClassD new_ClassD_.$(MEXENDING): new_ClassD_.cpp $(MEX) $(mex_flags) new_ClassD_.cpp -output new_ClassD_ -delete_ClassD.$(MEXENDING): delete_ClassD.cpp - $(MEX) $(mex_flags) delete_ClassD.cpp -output delete_ClassD -ClassD: new_ClassD_.$(MEXENDING) delete_ClassD.$(MEXENDING) +ClassD: new_ClassD_.$(MEXENDING) diff --git a/wrap/tests/expected_namespaces/delete_ClassD.cpp b/wrap/tests/expected_namespaces/delete_ClassD.cpp deleted file mode 100644 index 5284e33ba..000000000 --- a/wrap/tests/expected_namespaces/delete_ClassD.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// automatically generated by wrap -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_ClassD",nargout,nargin,1); - delete_shared_ptr< ClassD >(in[0],"ClassD"); -} diff --git a/wrap/tests/expected_namespaces/delete_ClassD.m b/wrap/tests/expected_namespaces/delete_ClassD.m deleted file mode 100644 index aef8cb642..000000000 --- a/wrap/tests/expected_namespaces/delete_ClassD.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_ClassD(obj) - error('need to compile delete_ClassD.cpp'); -end diff --git a/wrap/tests/expected_namespaces/delete_ns1ClassA.cpp b/wrap/tests/expected_namespaces/delete_ns1ClassA.cpp deleted file mode 100644 index 17a25b523..000000000 --- a/wrap/tests/expected_namespaces/delete_ns1ClassA.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// automatically generated by wrap -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_ns1ClassA",nargout,nargin,1); - delete_shared_ptr< ns1::ClassA >(in[0],"ns1ClassA"); -} diff --git a/wrap/tests/expected_namespaces/delete_ns1ClassA.m b/wrap/tests/expected_namespaces/delete_ns1ClassA.m deleted file mode 100644 index 343d5636a..000000000 --- a/wrap/tests/expected_namespaces/delete_ns1ClassA.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_ns1ClassA(obj) - error('need to compile delete_ns1ClassA.cpp'); -end diff --git a/wrap/tests/expected_namespaces/delete_ns1ClassB.cpp b/wrap/tests/expected_namespaces/delete_ns1ClassB.cpp deleted file mode 100644 index 7302cc3d3..000000000 --- a/wrap/tests/expected_namespaces/delete_ns1ClassB.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_ns1ClassB",nargout,nargin,1); - delete_shared_ptr< ns1::ClassB >(in[0],"ns1ClassB"); -} diff --git a/wrap/tests/expected_namespaces/delete_ns1ClassB.m b/wrap/tests/expected_namespaces/delete_ns1ClassB.m deleted file mode 100644 index ec50f3f06..000000000 --- a/wrap/tests/expected_namespaces/delete_ns1ClassB.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_ns1ClassB(obj) - error('need to compile delete_ns1ClassB.cpp'); -end diff --git a/wrap/tests/expected_namespaces/delete_ns2ClassA.cpp b/wrap/tests/expected_namespaces/delete_ns2ClassA.cpp deleted file mode 100644 index 0562ee073..000000000 --- a/wrap/tests/expected_namespaces/delete_ns2ClassA.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_ns2ClassA",nargout,nargin,1); - delete_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA"); -} diff --git a/wrap/tests/expected_namespaces/delete_ns2ClassA.m b/wrap/tests/expected_namespaces/delete_ns2ClassA.m deleted file mode 100644 index 4f1b92aa5..000000000 --- a/wrap/tests/expected_namespaces/delete_ns2ClassA.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_ns2ClassA(obj) - error('need to compile delete_ns2ClassA.cpp'); -end diff --git a/wrap/tests/expected_namespaces/delete_ns2ClassC.cpp b/wrap/tests/expected_namespaces/delete_ns2ClassC.cpp deleted file mode 100644 index ef57796b7..000000000 --- a/wrap/tests/expected_namespaces/delete_ns2ClassC.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// automatically generated by wrap -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_ns2ClassC",nargout,nargin,1); - delete_shared_ptr< ns2::ClassC >(in[0],"ns2ClassC"); -} diff --git a/wrap/tests/expected_namespaces/delete_ns2ClassC.m b/wrap/tests/expected_namespaces/delete_ns2ClassC.m deleted file mode 100644 index 1db1ddc93..000000000 --- a/wrap/tests/expected_namespaces/delete_ns2ClassC.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_ns2ClassC(obj) - error('need to compile delete_ns2ClassC.cpp'); -end diff --git a/wrap/tests/expected_namespaces/delete_ns2ns3ClassB.cpp b/wrap/tests/expected_namespaces/delete_ns2ns3ClassB.cpp deleted file mode 100644 index 0a6c4ce73..000000000 --- a/wrap/tests/expected_namespaces/delete_ns2ns3ClassB.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("delete_ns2ns3ClassB",nargout,nargin,1); - delete_shared_ptr< ns2::ns3::ClassB >(in[0],"ns2ns3ClassB"); -} diff --git a/wrap/tests/expected_namespaces/delete_ns2ns3ClassB.m b/wrap/tests/expected_namespaces/delete_ns2ns3ClassB.m deleted file mode 100644 index 427359eca..000000000 --- a/wrap/tests/expected_namespaces/delete_ns2ns3ClassB.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = delete_ns2ns3ClassB(obj) - error('need to compile delete_ns2ns3ClassB.cpp'); -end diff --git a/wrap/tests/expected_namespaces/make_testNamespaces.m b/wrap/tests/expected_namespaces/make_testNamespaces.m index d835a2da0..5ff13e5d4 100644 --- a/wrap/tests/expected_namespaces/make_testNamespaces.m +++ b/wrap/tests/expected_namespaces/make_testNamespaces.m @@ -10,21 +10,18 @@ addpath(toolboxpath); %% ns1ClassA cd(toolboxpath) mex -O5 new_ns1ClassA_.cpp -mex -O5 delete_ns1ClassA.cpp cd @ns1ClassA %% ns1ClassB cd(toolboxpath) mex -O5 new_ns1ClassB_.cpp -mex -O5 delete_ns1ClassB.cpp cd @ns1ClassB %% ns2ClassA cd(toolboxpath) mex -O5 new_ns2ClassA_.cpp -mex -O5 delete_ns2ClassA.cpp mex -O5 ns2ClassA_afunction.cpp cd @ns2ClassA @@ -35,21 +32,18 @@ mex -O5 nsReturn.cpp %% ns2ns3ClassB cd(toolboxpath) mex -O5 new_ns2ns3ClassB_.cpp -mex -O5 delete_ns2ns3ClassB.cpp cd @ns2ns3ClassB %% ns2ClassC cd(toolboxpath) mex -O5 new_ns2ClassC_.cpp -mex -O5 delete_ns2ClassC.cpp cd @ns2ClassC %% ClassD cd(toolboxpath) mex -O5 new_ClassD_.cpp -mex -O5 delete_ClassD.cpp cd @ClassD diff --git a/wrap/tests/expected_namespaces/new_ClassD_.cpp b/wrap/tests/expected_namespaces/new_ClassD_.cpp index 59ea4398b..352c470b0 100644 --- a/wrap/tests/expected_namespaces/new_ClassD_.cpp +++ b/wrap/tests/expected_namespaces/new_ClassD_.cpp @@ -1,9 +1,43 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_ClassD_",nargout,nargin,0); - ClassD* self = new ClassD(); - out[0] = wrap_constructed(self,"ClassD"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new ClassD()); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp index cbb82eb70..893331034 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp @@ -1,9 +1,43 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_ns1ClassA_",nargout,nargin,0); - ns1::ClassA* self = new ns1::ClassA(); - out[0] = wrap_constructed(self,"ns1ClassA"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new ns1::ClassA()); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp index d50cede19..047348d1b 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp @@ -1,10 +1,44 @@ // automatically generated by wrap #include +#include #include #include +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_ns1ClassB_",nargout,nargin,0); - ns1::ClassB* self = new ns1::ClassB(); - out[0] = wrap_constructed(self,"ns1ClassB"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new ns1::ClassB()); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp index 81bae3198..cb06bf892 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp @@ -1,10 +1,44 @@ // automatically generated by wrap #include +#include #include #include +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_ns2ClassA_",nargout,nargin,0); - ns2::ClassA* self = new ns2::ClassA(); - out[0] = wrap_constructed(self,"ns2ClassA"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new ns2::ClassA()); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp index fbee07926..40c3343ef 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp @@ -1,9 +1,43 @@ // automatically generated by wrap #include +#include #include +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_ns2ClassC_",nargout,nargin,0); - ns2::ClassC* self = new ns2::ClassC(); - out[0] = wrap_constructed(self,"ns2ClassC"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new ns2::ClassC()); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp index ca9d02df3..ace0a261f 100644 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp @@ -1,10 +1,44 @@ // automatically generated by wrap #include +#include #include #include +typedef boost::shared_ptr Shared; + +static std::set collector; + +struct Destruct +{ + void operator() (Shared* p) + { + collector.erase(p); + } +}; + +void cleanup(void) { + std::for_each( collector.begin(), collector.end(), Destruct() ); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { - checkArguments("new_ns2ns3ClassB_",nargout,nargin,0); - ns2::ns3::ClassB* self = new ns2::ns3::ClassB(); - out[0] = wrap_constructed(self,"ns2ns3ClassB"); + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + if(nc == 0) { + self = new Shared(new ns2::ns3::ClassB()); + } + collector.insert(self); + std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } } diff --git a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp b/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp index 72559acf8..3e8d54a14 100644 --- a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp +++ b/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp @@ -1,7 +1,10 @@ // automatically generated by wrap #include +#include #include #include +typedef boost::shared_ptr Shareddouble; +typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("ns2ClassA_afunction",nargout,nargin,0); diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index db3ac8982..cdc6e42d6 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -83,7 +83,7 @@ TEST( wrap, parse ) { { Class cls = module.classes.at(0); EXPECT(assert_equal("Point2", cls.name)); - EXPECT_LONGS_EQUAL(2, cls.constructors.size()); + EXPECT_LONGS_EQUAL(2, cls.constructor.args_list.size()); EXPECT_LONGS_EQUAL(7, cls.methods.size()); EXPECT_LONGS_EQUAL(0, cls.static_methods.size()); EXPECT_LONGS_EQUAL(0, cls.namespaces.size()); @@ -94,18 +94,18 @@ TEST( wrap, parse ) { { Class cls = module.classes.at(1); EXPECT(assert_equal("Point3", cls.name)); - EXPECT_LONGS_EQUAL(1, cls.constructors.size()); + EXPECT_LONGS_EQUAL(1, cls.constructor.args_list.size()); EXPECT_LONGS_EQUAL(1, cls.methods.size()); EXPECT_LONGS_EQUAL(2, cls.static_methods.size()); EXPECT_LONGS_EQUAL(0, cls.namespaces.size()); EXPECT(assert_equal(exp_using2, cls.using_namespaces)); // first constructor takes 3 doubles - Constructor c1 = cls.constructors.front(); - EXPECT_LONGS_EQUAL(3, c1.args.size()); + ArgumentList c1 = cls.constructor.args_list.front(); + EXPECT_LONGS_EQUAL(3, c1.size()); // check first double argument - Argument a1 = c1.args.front(); + Argument a1 = c1.front(); EXPECT(!a1.is_const); EXPECT(assert_equal("double", a1.type)); EXPECT(!a1.is_ref); @@ -123,7 +123,7 @@ TEST( wrap, parse ) { { LONGS_EQUAL(3, module.classes.size()); Class testCls = module.classes.at(2); - EXPECT_LONGS_EQUAL( 2, testCls.constructors.size()); + EXPECT_LONGS_EQUAL( 2, testCls.constructor.args_list.size()); EXPECT_LONGS_EQUAL(19, testCls.methods.size()); EXPECT_LONGS_EQUAL( 0, testCls.static_methods.size()); EXPECT_LONGS_EQUAL( 0, testCls.namespaces.size()); @@ -228,18 +228,6 @@ TEST( wrap, matlab_code_namespaces ) { EXPECT(files_equal(exp_path + "new_ns2ClassC_.m" , act_path + "new_ns2ClassC_.m" )); EXPECT(files_equal(exp_path + "new_ns2ns3ClassB_.cpp" , act_path + "new_ns2ns3ClassB_.cpp" )); EXPECT(files_equal(exp_path + "new_ns2ns3ClassB_.m" , act_path + "new_ns2ns3ClassB_.m" )); - EXPECT(files_equal(exp_path + "delete_ClassD.cpp" , act_path + "delete_ClassD.cpp" )); - EXPECT(files_equal(exp_path + "delete_ClassD.m" , act_path + "delete_ClassD.m" )); - EXPECT(files_equal(exp_path + "delete_ns1ClassA.cpp" , act_path + "delete_ns1ClassA.cpp" )); - EXPECT(files_equal(exp_path + "delete_ns1ClassA.m" , act_path + "delete_ns1ClassA.m" )); - EXPECT(files_equal(exp_path + "delete_ns1ClassB.cpp" , act_path + "delete_ns1ClassB.cpp" )); - EXPECT(files_equal(exp_path + "delete_ns1ClassB.m" , act_path + "delete_ns1ClassB.m" )); - EXPECT(files_equal(exp_path + "delete_ns2ClassA.cpp" , act_path + "delete_ns2ClassA.cpp" )); - EXPECT(files_equal(exp_path + "delete_ns2ClassA.m" , act_path + "delete_ns2ClassA.m" )); - EXPECT(files_equal(exp_path + "delete_ns2ClassC.cpp" , act_path + "delete_ns2ClassC.cpp" )); - EXPECT(files_equal(exp_path + "delete_ns2ClassC.m" , act_path + "delete_ns2ClassC.m" )); - EXPECT(files_equal(exp_path + "delete_ns2ns3ClassB.cpp" , act_path + "delete_ns2ns3ClassB.cpp" )); - EXPECT(files_equal(exp_path + "delete_ns2ns3ClassB.m" , act_path + "delete_ns2ns3ClassB.m" )); EXPECT(files_equal(exp_path + "ns2ClassA_afunction.cpp" , act_path + "ns2ClassA_afunction.cpp" )); EXPECT(files_equal(exp_path + "ns2ClassA_afunction.m" , act_path + "ns2ClassA_afunction.m" )); @@ -268,34 +256,82 @@ TEST( wrap, matlab_code ) { // emit MATLAB code // make_geometry will not compile, use make testwrap to generate real make module.matlab_code("mex", "actual", "mexa64", "-O5"); + string epath = path + "/tests/expected/"; + string apath = "actual/"; - EXPECT(files_equal(path + "/tests/expected/@Point2/Point2.m" , "actual/@Point2/Point2.m" )); - EXPECT(files_equal(path + "/tests/expected/@Point2/x.cpp" , "actual/@Point2/x.cpp" )); - EXPECT(files_equal(path + "/tests/expected/@Point3/Point3.m" , "actual/@Point3/Point3.m" )); - EXPECT(files_equal(path + "/tests/expected/new_Point3_ddd.m" , "actual/new_Point3_ddd.m" )); - EXPECT(files_equal(path + "/tests/expected/new_Point3_ddd.cpp", "actual/new_Point3_ddd.cpp")); - EXPECT(files_equal(path + "/tests/expected/Point3_staticFunction.m" , "actual/Point3_staticFunction.m" )); - EXPECT(files_equal(path + "/tests/expected/Point3_staticFunction.cpp", "actual/Point3_staticFunction.cpp")); - EXPECT(files_equal(path + "/tests/expected/@Point3/norm.m" , "actual/@Point3/norm.m" )); - EXPECT(files_equal(path + "/tests/expected/@Point3/norm.cpp" , "actual/@Point3/norm.cpp" )); + EXPECT(files_equal(epath + "Makefile" , apath + "Makefile" )); + EXPECT(files_equal(epath + "make_geometry.m" , apath + "make_geometry.m" )); + EXPECT(files_equal(epath + "new_Point2_.cpp" , apath + "new_Point2_.cpp" )); + EXPECT(files_equal(epath + "new_Point2_.m" , apath + "new_Point2_.m" )); + EXPECT(files_equal(epath + "new_Point3_.cpp" , apath + "new_Point3_.cpp" )); + EXPECT(files_equal(epath + "new_Point3_.m" , apath + "new_Point3_.m" )); + EXPECT(files_equal(epath + "new_Test_.cpp" , apath + "new_Test_.cpp" )); + EXPECT(files_equal(epath + "new_Test_.m" , apath + "new_Test_.m" )); - EXPECT(files_equal(path + "/tests/expected/new_Test_.cpp" , "actual/new_Test_.cpp" )); - EXPECT(files_equal(path + "/tests/expected/delete_Test.cpp" , "actual/delete_Test.cpp" )); - EXPECT(files_equal(path + "/tests/expected/delete_Test.m" , "actual/delete_Test.m" )); - EXPECT(files_equal(path + "/tests/expected/@Test/Test.m" , "actual/@Test/Test.m" )); - EXPECT(files_equal(path + "/tests/expected/@Test/return_string.cpp" , "actual/@Test/return_string.cpp" )); - EXPECT(files_equal(path + "/tests/expected/@Test/return_pair.cpp" , "actual/@Test/return_pair.cpp" )); - EXPECT(files_equal(path + "/tests/expected/@Test/create_MixedPtrs.cpp", "actual/@Test/create_MixedPtrs.cpp")); - EXPECT(files_equal(path + "/tests/expected/@Test/return_field.cpp" , "actual/@Test/return_field.cpp" )); - EXPECT(files_equal(path + "/tests/expected/@Test/return_TestPtr.cpp", "actual/@Test/return_TestPtr.cpp")); - EXPECT(files_equal(path + "/tests/expected/@Test/return_Test.cpp" , "actual/@Test/return_Test.cpp" )); - EXPECT(files_equal(path + "/tests/expected/@Test/return_Point2Ptr.cpp", "actual/@Test/return_Point2Ptr.cpp")); - EXPECT(files_equal(path + "/tests/expected/@Test/return_ptrs.cpp" , "actual/@Test/return_ptrs.cpp" )); - EXPECT(files_equal(path + "/tests/expected/@Test/print.m" , "actual/@Test/print.m" )); - EXPECT(files_equal(path + "/tests/expected/@Test/print.cpp" , "actual/@Test/print.cpp" )); + EXPECT(files_equal(epath + "Point3_staticFunction.cpp" , apath + "Point3_staticFunction.cpp" )); + EXPECT(files_equal(epath + "Point3_staticFunction.m" , apath + "Point3_staticFunction.m" )); + EXPECT(files_equal(epath + "Point3_StaticFunctionRet.cpp" , apath + "Point3_StaticFunctionRet.cpp" )); + EXPECT(files_equal(epath + "Point3_StaticFunctionRet.m" , apath + "Point3_StaticFunctionRet.m" )); + + EXPECT(files_equal(epath + "@Point2/argChar.cpp" , apath + "@Point2/argChar.cpp" )); + EXPECT(files_equal(epath + "@Point2/argChar.m" , apath + "@Point2/argChar.m" )); + EXPECT(files_equal(epath + "@Point2/argUChar.cpp" , apath + "@Point2/argUChar.cpp" )); + EXPECT(files_equal(epath + "@Point2/argUChar.m" , apath + "@Point2/argUChar.m" )); + EXPECT(files_equal(epath + "@Point2/dim.cpp" , apath + "@Point2/dim.cpp" )); + EXPECT(files_equal(epath + "@Point2/dim.m" , apath + "@Point2/dim.m" )); + EXPECT(files_equal(epath + "@Point2/Point2.m" , apath + "@Point2/Point2.m" )); + EXPECT(files_equal(epath + "@Point2/returnChar.cpp" , apath + "@Point2/returnChar.cpp" )); + EXPECT(files_equal(epath + "@Point2/returnChar.m" , apath + "@Point2/returnChar.m" )); + EXPECT(files_equal(epath + "@Point2/vectorConfusion.cpp" , apath + "@Point2/vectorConfusion.cpp" )); + EXPECT(files_equal(epath + "@Point2/vectorConfusion.m" , apath + "@Point2/vectorConfusion.m" )); + EXPECT(files_equal(epath + "@Point2/x.cpp" , apath + "@Point2/x.cpp" )); + EXPECT(files_equal(epath + "@Point2/x.m" , apath + "@Point2/x.m" )); + EXPECT(files_equal(epath + "@Point2/y.cpp" , apath + "@Point2/y.cpp" )); + EXPECT(files_equal(epath + "@Point2/y.m" , apath + "@Point2/y.m" )); + EXPECT(files_equal(epath + "@Point3/norm.cpp" , apath + "@Point3/norm.cpp" )); + EXPECT(files_equal(epath + "@Point3/norm.m" , apath + "@Point3/norm.m" )); + EXPECT(files_equal(epath + "@Point3/Point3.m" , apath + "@Point3/Point3.m" )); + + EXPECT(files_equal(epath + "@Test/arg_EigenConstRef.cpp" , apath + "@Test/arg_EigenConstRef.cpp" )); + EXPECT(files_equal(epath + "@Test/arg_EigenConstRef.m" , apath + "@Test/arg_EigenConstRef.m" )); + EXPECT(files_equal(epath + "@Test/create_MixedPtrs.cpp" , apath + "@Test/create_MixedPtrs.cpp" )); + EXPECT(files_equal(epath + "@Test/create_MixedPtrs.m" , apath + "@Test/create_MixedPtrs.m" )); + EXPECT(files_equal(epath + "@Test/create_ptrs.cpp" , apath + "@Test/create_ptrs.cpp" )); + EXPECT(files_equal(epath + "@Test/create_ptrs.m" , apath + "@Test/create_ptrs.m" )); + EXPECT(files_equal(epath + "@Test/print.cpp" , apath + "@Test/print.cpp" )); + EXPECT(files_equal(epath + "@Test/print.m" , apath + "@Test/print.m" )); + EXPECT(files_equal(epath + "@Test/return_bool.cpp" , apath + "@Test/return_bool.cpp" )); + EXPECT(files_equal(epath + "@Test/return_bool.m" , apath + "@Test/return_bool.m" )); + EXPECT(files_equal(epath + "@Test/return_double.cpp" , apath + "@Test/return_double.cpp" )); + EXPECT(files_equal(epath + "@Test/return_double.m" , apath + "@Test/return_double.m" )); + EXPECT(files_equal(epath + "@Test/return_field.cpp" , apath + "@Test/return_field.cpp" )); + EXPECT(files_equal(epath + "@Test/return_field.m" , apath + "@Test/return_field.m" )); + EXPECT(files_equal(epath + "@Test/return_int.cpp" , apath + "@Test/return_int.cpp" )); + EXPECT(files_equal(epath + "@Test/return_int.m" , apath + "@Test/return_int.m" )); + EXPECT(files_equal(epath + "@Test/return_matrix1.cpp" , apath + "@Test/return_matrix1.cpp" )); + EXPECT(files_equal(epath + "@Test/return_matrix1.m" , apath + "@Test/return_matrix1.m" )); + EXPECT(files_equal(epath + "@Test/return_matrix2.cpp" , apath + "@Test/return_matrix2.cpp" )); + EXPECT(files_equal(epath + "@Test/return_matrix2.m" , apath + "@Test/return_matrix2.m" )); + EXPECT(files_equal(epath + "@Test/return_pair.cpp" , apath + "@Test/return_pair.cpp" )); + EXPECT(files_equal(epath + "@Test/return_pair.m" , apath + "@Test/return_pair.m" )); + EXPECT(files_equal(epath + "@Test/return_Point2Ptr.cpp" , apath + "@Test/return_Point2Ptr.cpp" )); + EXPECT(files_equal(epath + "@Test/return_Point2Ptr.m" , apath + "@Test/return_Point2Ptr.m" )); + EXPECT(files_equal(epath + "@Test/return_ptrs.cpp" , apath + "@Test/return_ptrs.cpp" )); + EXPECT(files_equal(epath + "@Test/return_ptrs.m" , apath + "@Test/return_ptrs.m" )); + EXPECT(files_equal(epath + "@Test/return_size_t.cpp" , apath + "@Test/return_size_t.cpp" )); + EXPECT(files_equal(epath + "@Test/return_size_t.m" , apath + "@Test/return_size_t.m" )); + EXPECT(files_equal(epath + "@Test/return_string.cpp" , apath + "@Test/return_string.cpp" )); + EXPECT(files_equal(epath + "@Test/return_string.m" , apath + "@Test/return_string.m" )); + EXPECT(files_equal(epath + "@Test/return_Test.cpp" , apath + "@Test/return_Test.cpp" )); + EXPECT(files_equal(epath + "@Test/return_Test.m" , apath + "@Test/return_Test.m" )); + EXPECT(files_equal(epath + "@Test/return_TestPtr.cpp" , apath + "@Test/return_TestPtr.cpp" )); + EXPECT(files_equal(epath + "@Test/return_TestPtr.m" , apath + "@Test/return_TestPtr.m" )); + EXPECT(files_equal(epath + "@Test/return_vector1.cpp" , apath + "@Test/return_vector1.cpp" )); + EXPECT(files_equal(epath + "@Test/return_vector1.m" , apath + "@Test/return_vector1.m" )); + EXPECT(files_equal(epath + "@Test/return_vector2.cpp" , apath + "@Test/return_vector2.cpp" )); + EXPECT(files_equal(epath + "@Test/return_vector2.m" , apath + "@Test/return_vector2.m" )); + EXPECT(files_equal(epath + "@Test/Test.m" , apath + "@Test/Test.m" )); - EXPECT(files_equal(path + "/tests/expected/make_geometry.m", "actual/make_geometry.m")); - EXPECT(files_equal(path + "/tests/expected/Makefile" , "actual/Makefile" )); } /* ************************************************************************* */ From b1eedba89f1a9e06a6cc49a094e80b34621a424e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 28 Jun 2012 17:44:17 +0000 Subject: [PATCH 487/914] Added back NonlinearFactor::dim() --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index e4993413a..755402554 100644 --- a/gtsam.h +++ b/gtsam.h @@ -918,7 +918,7 @@ class NonlinearFactor { void equals(const gtsam::NonlinearFactor& other, double tol) const; gtsam::KeyVector keys() const; size_t size() const; -// size_t dim() const; // FIXME: Doesn't link + size_t dim() const; }; class EasyFactorGraph { From b2e15eea4e054b6aed5904fc620a8873fd7dc8a0 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 28 Jun 2012 19:43:00 +0000 Subject: [PATCH 488/914] Added negate() to GaussianFactor, which computes the Anti-factor eqiuvalent, using implementation from the nonlinear Anti-factor --- gtsam/linear/GaussianFactor.h | 7 +++++++ gtsam/linear/HessianFactor.cpp | 20 ++++++++++++++++++++ gtsam/linear/HessianFactor.h | 7 +++++++ gtsam/linear/JacobianFactor.cpp | 6 ++++++ gtsam/linear/JacobianFactor.h | 7 +++++++ gtsam/slam/AntiFactor.h | 26 ++------------------------ 6 files changed, 49 insertions(+), 24 deletions(-) diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index a20c09a43..0d435ce17 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -115,6 +115,13 @@ namespace gtsam { IndexFactor::permuteWithInverse(inversePermutation); } + /** + * Construct the corresponding anti-factor to negate information + * stored stored in this factor. + * @return a HessianFactor with negated Hessian matrices + */ + virtual GaussianFactor::shared_ptr negate() const = 0; + private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index 86938a9bf..cdf597411 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -511,4 +511,24 @@ GaussianConditional::shared_ptr HessianFactor::splitEliminatedFactor(size_t nrFr return conditional; } +/* ************************************************************************* */ +GaussianFactor::shared_ptr HessianFactor::negate() const { + // Copy Hessian Blocks from Hessian factor and invert + std::vector js; + std::vector Gs; + std::vector gs; + double f; + js.insert(js.end(), begin(), end()); + for(size_t i = 0; i < js.size(); ++i){ + for(size_t j = i; j < js.size(); ++j){ + Gs.push_back( -info(begin()+i, begin()+j) ); + } + gs.push_back( -linearTerm(begin()+i) ); + } + f = -constantTerm(); + + // Create the Anti-Hessian Factor from the negated blocks + return HessianFactor::shared_ptr(new HessianFactor(js, Gs, gs, f)); +} + } // gtsam diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index f90a33c5e..74216f0f0 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -237,6 +237,13 @@ namespace gtsam { /** Return the number of columns and rows of the Hessian matrix */ size_t rows() const { return info_.rows(); } + /** + * Construct the corresponding anti-factor to negate information + * stored stored in this factor. + * @return a HessianFactor with negated Hessian matrices + */ + virtual GaussianFactor::shared_ptr negate() const; + /** Return a view of the block at (j1,j2) of the upper-triangular part of the * information matrix \f$ H \f$, no data is copied. See HessianFactor class documentation * above to explain that only the upper-triangular part of the information matrix is stored diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 038f8c718..b241ff24a 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -385,6 +385,12 @@ namespace gtsam { return result; } + /* ************************************************************************* */ + GaussianFactor::shared_ptr JacobianFactor::negate() const { + HessianFactor hessian(*this); + return hessian.negate(); + } + /* ************************************************************************* */ GaussianConditional::shared_ptr JacobianFactor::eliminateFirst() { return this->eliminate(1); diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 0ac085987..660eb25f7 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -169,6 +169,13 @@ namespace gtsam { */ virtual Matrix computeInformation() const; + /** + * Construct the corresponding anti-factor to negate information + * stored stored in this factor. + * @return a HessianFactor with negated Hessian matrices + */ + virtual GaussianFactor::shared_ptr negate() const; + /** Check if the factor contains no information, i.e. zero rows. This does * not necessarily mean that the factor involves no variables (to check for * involving no variables use keys().empty()). diff --git a/gtsam/slam/AntiFactor.h b/gtsam/slam/AntiFactor.h index 1e0d64db7..19f73c8b9 100644 --- a/gtsam/slam/AntiFactor.h +++ b/gtsam/slam/AntiFactor.h @@ -99,30 +99,8 @@ namespace gtsam { // Generate the linearized factor from the contained nonlinear factor GaussianFactor::shared_ptr gaussianFactor = factor_->linearize(c, ordering); - // Cast the GaussianFactor to a Hessian - HessianFactor::shared_ptr hessianFactor = boost::dynamic_pointer_cast(gaussianFactor); - - // If the cast fails, convert it to a Hessian - if(!hessianFactor){ - hessianFactor = HessianFactor::shared_ptr(new HessianFactor(*gaussianFactor)); - } - - // Copy Hessian Blocks from Hessian factor and invert - std::vector js; - std::vector Gs; - std::vector gs; - double f; - js.insert(js.end(), hessianFactor->begin(), hessianFactor->end()); - for(size_t i = 0; i < js.size(); ++i){ - for(size_t j = i; j < js.size(); ++j){ - Gs.push_back( -hessianFactor->info(hessianFactor->begin()+i, hessianFactor->begin()+j) ); - } - gs.push_back( -hessianFactor->linearTerm(hessianFactor->begin()+i) ); - } - f = -hessianFactor->constantTerm(); - - // Create the Anti-Hessian Factor from the negated blocks - return HessianFactor::shared_ptr(new HessianFactor(js, Gs, gs, f)); + // return the negated version of the factor + return gaussianFactor->negate(); } From 1395a11d3178142f2af63132b334e484e9980bfc Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 28 Jun 2012 19:43:55 +0000 Subject: [PATCH 489/914] Merge branch 'master' into new_wrap_local --- gtsam/linear/GaussianFactor.h | 7 +++++++ gtsam/linear/HessianFactor.cpp | 20 ++++++++++++++++++++ gtsam/linear/HessianFactor.h | 7 +++++++ gtsam/linear/JacobianFactor.cpp | 6 ++++++ gtsam/linear/JacobianFactor.h | 7 +++++++ gtsam/slam/AntiFactor.h | 26 ++------------------------ 6 files changed, 49 insertions(+), 24 deletions(-) diff --git a/gtsam/linear/GaussianFactor.h b/gtsam/linear/GaussianFactor.h index a20c09a43..0d435ce17 100644 --- a/gtsam/linear/GaussianFactor.h +++ b/gtsam/linear/GaussianFactor.h @@ -115,6 +115,13 @@ namespace gtsam { IndexFactor::permuteWithInverse(inversePermutation); } + /** + * Construct the corresponding anti-factor to negate information + * stored stored in this factor. + * @return a HessianFactor with negated Hessian matrices + */ + virtual GaussianFactor::shared_ptr negate() const = 0; + private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index 86938a9bf..cdf597411 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -511,4 +511,24 @@ GaussianConditional::shared_ptr HessianFactor::splitEliminatedFactor(size_t nrFr return conditional; } +/* ************************************************************************* */ +GaussianFactor::shared_ptr HessianFactor::negate() const { + // Copy Hessian Blocks from Hessian factor and invert + std::vector js; + std::vector Gs; + std::vector gs; + double f; + js.insert(js.end(), begin(), end()); + for(size_t i = 0; i < js.size(); ++i){ + for(size_t j = i; j < js.size(); ++j){ + Gs.push_back( -info(begin()+i, begin()+j) ); + } + gs.push_back( -linearTerm(begin()+i) ); + } + f = -constantTerm(); + + // Create the Anti-Hessian Factor from the negated blocks + return HessianFactor::shared_ptr(new HessianFactor(js, Gs, gs, f)); +} + } // gtsam diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index f90a33c5e..74216f0f0 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -237,6 +237,13 @@ namespace gtsam { /** Return the number of columns and rows of the Hessian matrix */ size_t rows() const { return info_.rows(); } + /** + * Construct the corresponding anti-factor to negate information + * stored stored in this factor. + * @return a HessianFactor with negated Hessian matrices + */ + virtual GaussianFactor::shared_ptr negate() const; + /** Return a view of the block at (j1,j2) of the upper-triangular part of the * information matrix \f$ H \f$, no data is copied. See HessianFactor class documentation * above to explain that only the upper-triangular part of the information matrix is stored diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 038f8c718..b241ff24a 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -385,6 +385,12 @@ namespace gtsam { return result; } + /* ************************************************************************* */ + GaussianFactor::shared_ptr JacobianFactor::negate() const { + HessianFactor hessian(*this); + return hessian.negate(); + } + /* ************************************************************************* */ GaussianConditional::shared_ptr JacobianFactor::eliminateFirst() { return this->eliminate(1); diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 0ac085987..660eb25f7 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -169,6 +169,13 @@ namespace gtsam { */ virtual Matrix computeInformation() const; + /** + * Construct the corresponding anti-factor to negate information + * stored stored in this factor. + * @return a HessianFactor with negated Hessian matrices + */ + virtual GaussianFactor::shared_ptr negate() const; + /** Check if the factor contains no information, i.e. zero rows. This does * not necessarily mean that the factor involves no variables (to check for * involving no variables use keys().empty()). diff --git a/gtsam/slam/AntiFactor.h b/gtsam/slam/AntiFactor.h index 1e0d64db7..19f73c8b9 100644 --- a/gtsam/slam/AntiFactor.h +++ b/gtsam/slam/AntiFactor.h @@ -99,30 +99,8 @@ namespace gtsam { // Generate the linearized factor from the contained nonlinear factor GaussianFactor::shared_ptr gaussianFactor = factor_->linearize(c, ordering); - // Cast the GaussianFactor to a Hessian - HessianFactor::shared_ptr hessianFactor = boost::dynamic_pointer_cast(gaussianFactor); - - // If the cast fails, convert it to a Hessian - if(!hessianFactor){ - hessianFactor = HessianFactor::shared_ptr(new HessianFactor(*gaussianFactor)); - } - - // Copy Hessian Blocks from Hessian factor and invert - std::vector js; - std::vector Gs; - std::vector gs; - double f; - js.insert(js.end(), hessianFactor->begin(), hessianFactor->end()); - for(size_t i = 0; i < js.size(); ++i){ - for(size_t j = i; j < js.size(); ++j){ - Gs.push_back( -hessianFactor->info(hessianFactor->begin()+i, hessianFactor->begin()+j) ); - } - gs.push_back( -hessianFactor->linearTerm(hessianFactor->begin()+i) ); - } - f = -hessianFactor->constantTerm(); - - // Create the Anti-Hessian Factor from the negated blocks - return HessianFactor::shared_ptr(new HessianFactor(js, Gs, gs, f)); + // return the negated version of the factor + return gaussianFactor->negate(); } From c7ff913f647b1df5cfc239603db3b4dbaac43a3e Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 28 Jun 2012 20:46:53 +0000 Subject: [PATCH 490/914] Added yet another configuration parameter to iSAM2. 'enablePartialRelinearizationCheck' checks variables for relinearization by descending the Bayes tree. Once a variable does not need to be relinearized, we stop checking that branch. A full check is still the default. --- gtsam/nonlinear/ISAM2-impl.cpp | 72 ++++++++++++++++++- gtsam/nonlinear/ISAM2-impl.h | 16 ++++- gtsam/nonlinear/ISAM2.cpp | 7 +- gtsam/nonlinear/ISAM2.h | 9 ++- tests/testGaussianISAM2.cpp | 123 +++++++++++++++++++++++++++++++++ 5 files changed, 222 insertions(+), 5 deletions(-) diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 509143b0b..f37856679 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -82,7 +82,7 @@ FastSet ISAM2::Impl::IndicesFromFactors(const Ordering& ordering, const N } /* ************************************************************************* */ -FastSet ISAM2::Impl::CheckRelinearization(const Permuted& delta, const Ordering& ordering, +FastSet ISAM2::Impl::CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { FastSet relinKeys; @@ -109,6 +109,76 @@ FastSet ISAM2::Impl::CheckRelinearization(const Permuted& d return relinKeys; } +/* ************************************************************************* */ +void CheckRelinearizationRecursiveDouble(FastSet& relinKeys, double threshold, const Permuted& delta, const ISAM2Clique::shared_ptr& clique) { + + // Check the current clique for relinearization + bool relinearize = false; + BOOST_FOREACH(Index var, clique->conditional()->keys()) { + double maxDelta = delta[var].lpNorm(); + if(maxDelta >= threshold) { + relinKeys.insert(var); + relinearize = true; + } + } + + // If this node was relinearized, also check its children + if(relinearize) { + BOOST_FOREACH(const ISAM2Clique::shared_ptr& child, clique->children()) { + CheckRelinearizationRecursiveDouble(relinKeys, threshold, delta, child); + } + } +} + +/* ************************************************************************* */ +void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap& thresholds, const Permuted& delta, const Ordering::InvertedMap& decoder, const ISAM2Clique::shared_ptr& clique) { + + // Check the current clique for relinearization + bool relinearize = false; + BOOST_FOREACH(Index var, clique->conditional()->keys()) { + + // Lookup the key associated with this index + Key key = decoder.at(var); + + // Find the threshold for this variable type + const Vector& threshold = thresholds.find(Symbol(key).chr())->second; + + // Verify the threshold vector matches the actual variable size + if(threshold.rows() != delta[var].rows()) + throw std::invalid_argument("Relinearization threshold vector dimensionality passed into iSAM2 parameters does not match actual variable dimensionality"); + + // Check for relinearization + if((delta[var].array().abs() > threshold.array()).any()) { + relinKeys.insert(var); + relinearize = true; + } + } + + // If this node was relinearized, also check its children + if(relinearize) { + BOOST_FOREACH(const ISAM2Clique::shared_ptr& child, clique->children()) { + CheckRelinearizationRecursiveMap(relinKeys, thresholds, delta, decoder, child); + } + } +} + +/* ************************************************************************* */ +FastSet ISAM2::Impl::CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, + const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { + + FastSet relinKeys; + + if(relinearizeThreshold.type() == typeid(double)) { + CheckRelinearizationRecursiveDouble(relinKeys, boost::get(relinearizeThreshold), delta, root); + + } else if(relinearizeThreshold.type() == typeid(FastMap)) { + Ordering::InvertedMap decoder = ordering.invert(); + CheckRelinearizationRecursiveMap(relinKeys, boost::get >(relinearizeThreshold), delta, decoder, root); + } + + return relinKeys; +} + /* ************************************************************************* */ void ISAM2::Impl::FindAll(ISAM2Clique::shared_ptr clique, FastSet& keys, const vector& markedMask) { static const bool debug = false; diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index f2f03fb3a..0aafb3f35 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -68,7 +68,21 @@ struct ISAM2::Impl { * @return The set of variable indices in delta whose magnitude is greater than or * equal to relinearizeThreshold */ - static FastSet CheckRelinearization(const Permuted& delta, const Ordering& ordering, + static FastSet CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, + const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); + + /** + * Find the set of variables to be relinearized according to relinearizeThreshold. + * This check is performed recursively, starting at the top of the tree. Once a + * variable in the tree does not need to be relinearized, no further checks in + * that branch are performed. This is an approximation of the Full version, designed + * to save time at the expense of accuracy. + * @param delta The linear delta to check against the threshold + * @param keyFormatter Formatter for printing nonlinear keys during debugging + * @return The set of variable indices in delta whose magnitude is greater than or + * equal to relinearizeThreshold + */ + static FastSet CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index e2ab825b3..07e0f518d 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -588,8 +588,11 @@ ISAM2Result ISAM2::update( tic(5,"gather relinearize keys"); vector markedRelinMask(ordering_.nVars(), false); // 4. Mark keys in \Delta above threshold \beta: J=\{\Delta_{j}\in\Delta|\Delta_{j}\geq\beta\}. - relinKeys = Impl::CheckRelinearization(delta_, ordering_, params_.relinearizeThreshold); - if(disableReordering) relinKeys = Impl::CheckRelinearization(delta_, ordering_, 0.0); // This is used for debugging + if(params_.enablePartialRelinearizationCheck) + relinKeys = Impl::CheckRelinearizationPartial(root_, delta_, ordering_, params_.relinearizeThreshold); + else + relinKeys = Impl::CheckRelinearizationFull(delta_, ordering_, params_.relinearizeThreshold); + if(disableReordering) relinKeys = Impl::CheckRelinearizationFull(delta_, ordering_, 0.0); // This is used for debugging // Above relin threshold keys for detailed results if(params_.enableDetailedResults) { diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index c118cb44e..5804640df 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -125,6 +125,13 @@ struct ISAM2Params { bool enableDetailedResults; ///< Whether to compute and return ISAM2Result::detailedResults, this can increase running time (default: false) + /** Check variables for relinearization in tree-order, stopping the check once a variable does not need to be relinearized (default: false). + * This can improve speed by only checking a small part of the top of the tree. However, variables below the check cut-off can accumulate + * significant deltas without triggering relinearization. This is particularly useful in exploration scenarios where real-time performance + * is desired over correctness. Use with caution. + */ + bool enablePartialRelinearizationCheck; + /** Specify parameters as constructor arguments */ ISAM2Params( OptimizationParams _optimizationParams = ISAM2GaussNewtonParams(), ///< see ISAM2Params::optimizationParams @@ -139,7 +146,7 @@ struct ISAM2Params { relinearizeSkip(_relinearizeSkip), enableRelinearization(_enableRelinearization), evaluateNonlinearError(_evaluateNonlinearError), factorization(_factorization), cacheLinearizedFactors(_cacheLinearizedFactors), keyFormatter(_keyFormatter), - enableDetailedResults(false) {} + enableDetailedResults(false), enablePartialRelinearizationCheck(false) {} }; /** diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 80bd651c8..2a5bf7962 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -1242,6 +1242,129 @@ TEST(ISAM2, constrained_ordering) EXPECT(assert_equal(expectedGradient, actualGradient)); } +/* ************************************************************************* */ +TEST(ISAM2, slamlike_solution_partial_relinearization_check) +{ + + // These variables will be reused and accumulate factors and values + ISAM2Params params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false); + params.enablePartialRelinearizationCheck = true; + ISAM2 isam(params); + Values fullinit; + planarSLAM::Graph fullgraph; + + // i keeps track of the time step + size_t i = 0; + + // Add a prior at time 0 and update isam + { + planarSLAM::Graph newfactors; + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); + + isam.update(newfactors, init); + } + + CHECK(isam_check(fullgraph, fullinit, isam)); + + // Add odometry from time 0 to time 5 + for( ; i<5; ++i) { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + + isam.update(newfactors, init); + } + + // Add odometry from time 5 to 6 and landmark measurement at time 5 + { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + + isam.update(newfactors, init); + ++ i; + } + + // Add odometry from time 6 to time 10 + for( ; i<10; ++i) { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + + isam.update(newfactors, init); + } + + // Add odometry from time 10 to 11 and landmark measurement at time 10 + { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); + + isam.update(newfactors, init); + ++ i; + } + + // Compare solutions + CHECK(isam_check(fullgraph, fullinit, isam)); + + // Check gradient at each node + typedef ISAM2::sharedClique sharedClique; + BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { + // Compute expected gradient + FactorGraph jfg; + jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(jfg, expectedGradient); + // Compare with actual gradients + int variablePosition = 0; + for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { + const int dim = clique->conditional()->dim(jit); + Vector actual = clique->gradientContribution().segment(variablePosition, dim); + EXPECT(assert_equal(expectedGradient[*jit], actual)); + variablePosition += dim; + } + LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); + } + + // Check gradient + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(FactorGraph(isam), expectedGradient); + VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); + VectorValues actualGradient(*allocateVectorValues(isam)); + gradientAtZero(isam, actualGradient); + EXPECT(assert_equal(expectedGradient2, expectedGradient)); + EXPECT(assert_equal(expectedGradient, actualGradient)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr);} /* ************************************************************************* */ From 0a663268916f7326b0a03b84d1fb59449da1057d Mon Sep 17 00:00:00 2001 From: Vadim Indelman Date: Fri, 29 Jun 2012 15:04:39 +0000 Subject: [PATCH 491/914] Added label printing to timing-related errors. --- gtsam/base/timing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index c16138cef..162a1306f 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -207,7 +207,7 @@ void toc_(size_t id) { != current->parent_.lock()->children_.end()) std::cout << "gtsam timing: Incorrect ID passed to toc, expected " << std::find(current->parent_.lock()->children_.begin(), current->parent_.lock()->children_.end(), current) - current->parent_.lock()->children_.begin() - << ", got " << id << std::endl; + << " \"" << current->label_ << "\", got " << id << std::endl; else std::cout << "gtsam timing: Incorrect ID passed to toc, id " << id << " does not exist" << std::endl; timingRoot->print(); From 5ec2336f23dadc72f2ad2a44870cb9a0b0381fab Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Fri, 29 Jun 2012 15:09:03 +0000 Subject: [PATCH 492/914] Fixed bug in new iSAM2 partial relinearization check that occurs when the Bayes Tree is empty --- gtsam/nonlinear/ISAM2-impl.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index f37856679..8b3bd4a0d 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -168,12 +168,13 @@ FastSet ISAM2::Impl::CheckRelinearizationPartial(const ISAM2Clique::share FastSet relinKeys; - if(relinearizeThreshold.type() == typeid(double)) { - CheckRelinearizationRecursiveDouble(relinKeys, boost::get(relinearizeThreshold), delta, root); - - } else if(relinearizeThreshold.type() == typeid(FastMap)) { - Ordering::InvertedMap decoder = ordering.invert(); - CheckRelinearizationRecursiveMap(relinKeys, boost::get >(relinearizeThreshold), delta, decoder, root); + if(root) { + if(relinearizeThreshold.type() == typeid(double)) { + CheckRelinearizationRecursiveDouble(relinKeys, boost::get(relinearizeThreshold), delta, root); + } else if(relinearizeThreshold.type() == typeid(FastMap)) { + Ordering::InvertedMap decoder = ordering.invert(); + CheckRelinearizationRecursiveMap(relinKeys, boost::get >(relinearizeThreshold), delta, decoder, root); + } } return relinKeys; From 3f4446df0391b2716370df357cb7ad9cfbdd3751 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 29 Jun 2012 16:48:09 +0000 Subject: [PATCH 493/914] Merge branch 'master' into new_wrap_local --- gtsam/base/timing.cpp | 2 +- gtsam/nonlinear/ISAM2-impl.cpp | 73 ++++++++++++++++++- gtsam/nonlinear/ISAM2-impl.h | 16 ++++- gtsam/nonlinear/ISAM2.cpp | 7 +- gtsam/nonlinear/ISAM2.h | 9 ++- tests/testGaussianISAM2.cpp | 123 +++++++++++++++++++++++++++++++++ 6 files changed, 224 insertions(+), 6 deletions(-) diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index c16138cef..162a1306f 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -207,7 +207,7 @@ void toc_(size_t id) { != current->parent_.lock()->children_.end()) std::cout << "gtsam timing: Incorrect ID passed to toc, expected " << std::find(current->parent_.lock()->children_.begin(), current->parent_.lock()->children_.end(), current) - current->parent_.lock()->children_.begin() - << ", got " << id << std::endl; + << " \"" << current->label_ << "\", got " << id << std::endl; else std::cout << "gtsam timing: Incorrect ID passed to toc, id " << id << " does not exist" << std::endl; timingRoot->print(); diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 509143b0b..8b3bd4a0d 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -82,7 +82,7 @@ FastSet ISAM2::Impl::IndicesFromFactors(const Ordering& ordering, const N } /* ************************************************************************* */ -FastSet ISAM2::Impl::CheckRelinearization(const Permuted& delta, const Ordering& ordering, +FastSet ISAM2::Impl::CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { FastSet relinKeys; @@ -109,6 +109,77 @@ FastSet ISAM2::Impl::CheckRelinearization(const Permuted& d return relinKeys; } +/* ************************************************************************* */ +void CheckRelinearizationRecursiveDouble(FastSet& relinKeys, double threshold, const Permuted& delta, const ISAM2Clique::shared_ptr& clique) { + + // Check the current clique for relinearization + bool relinearize = false; + BOOST_FOREACH(Index var, clique->conditional()->keys()) { + double maxDelta = delta[var].lpNorm(); + if(maxDelta >= threshold) { + relinKeys.insert(var); + relinearize = true; + } + } + + // If this node was relinearized, also check its children + if(relinearize) { + BOOST_FOREACH(const ISAM2Clique::shared_ptr& child, clique->children()) { + CheckRelinearizationRecursiveDouble(relinKeys, threshold, delta, child); + } + } +} + +/* ************************************************************************* */ +void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap& thresholds, const Permuted& delta, const Ordering::InvertedMap& decoder, const ISAM2Clique::shared_ptr& clique) { + + // Check the current clique for relinearization + bool relinearize = false; + BOOST_FOREACH(Index var, clique->conditional()->keys()) { + + // Lookup the key associated with this index + Key key = decoder.at(var); + + // Find the threshold for this variable type + const Vector& threshold = thresholds.find(Symbol(key).chr())->second; + + // Verify the threshold vector matches the actual variable size + if(threshold.rows() != delta[var].rows()) + throw std::invalid_argument("Relinearization threshold vector dimensionality passed into iSAM2 parameters does not match actual variable dimensionality"); + + // Check for relinearization + if((delta[var].array().abs() > threshold.array()).any()) { + relinKeys.insert(var); + relinearize = true; + } + } + + // If this node was relinearized, also check its children + if(relinearize) { + BOOST_FOREACH(const ISAM2Clique::shared_ptr& child, clique->children()) { + CheckRelinearizationRecursiveMap(relinKeys, thresholds, delta, decoder, child); + } + } +} + +/* ************************************************************************* */ +FastSet ISAM2::Impl::CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, + const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { + + FastSet relinKeys; + + if(root) { + if(relinearizeThreshold.type() == typeid(double)) { + CheckRelinearizationRecursiveDouble(relinKeys, boost::get(relinearizeThreshold), delta, root); + } else if(relinearizeThreshold.type() == typeid(FastMap)) { + Ordering::InvertedMap decoder = ordering.invert(); + CheckRelinearizationRecursiveMap(relinKeys, boost::get >(relinearizeThreshold), delta, decoder, root); + } + } + + return relinKeys; +} + /* ************************************************************************* */ void ISAM2::Impl::FindAll(ISAM2Clique::shared_ptr clique, FastSet& keys, const vector& markedMask) { static const bool debug = false; diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index f2f03fb3a..0aafb3f35 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -68,7 +68,21 @@ struct ISAM2::Impl { * @return The set of variable indices in delta whose magnitude is greater than or * equal to relinearizeThreshold */ - static FastSet CheckRelinearization(const Permuted& delta, const Ordering& ordering, + static FastSet CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, + const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); + + /** + * Find the set of variables to be relinearized according to relinearizeThreshold. + * This check is performed recursively, starting at the top of the tree. Once a + * variable in the tree does not need to be relinearized, no further checks in + * that branch are performed. This is an approximation of the Full version, designed + * to save time at the expense of accuracy. + * @param delta The linear delta to check against the threshold + * @param keyFormatter Formatter for printing nonlinear keys during debugging + * @return The set of variable indices in delta whose magnitude is greater than or + * equal to relinearizeThreshold + */ + static FastSet CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index e2ab825b3..07e0f518d 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -588,8 +588,11 @@ ISAM2Result ISAM2::update( tic(5,"gather relinearize keys"); vector markedRelinMask(ordering_.nVars(), false); // 4. Mark keys in \Delta above threshold \beta: J=\{\Delta_{j}\in\Delta|\Delta_{j}\geq\beta\}. - relinKeys = Impl::CheckRelinearization(delta_, ordering_, params_.relinearizeThreshold); - if(disableReordering) relinKeys = Impl::CheckRelinearization(delta_, ordering_, 0.0); // This is used for debugging + if(params_.enablePartialRelinearizationCheck) + relinKeys = Impl::CheckRelinearizationPartial(root_, delta_, ordering_, params_.relinearizeThreshold); + else + relinKeys = Impl::CheckRelinearizationFull(delta_, ordering_, params_.relinearizeThreshold); + if(disableReordering) relinKeys = Impl::CheckRelinearizationFull(delta_, ordering_, 0.0); // This is used for debugging // Above relin threshold keys for detailed results if(params_.enableDetailedResults) { diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index c118cb44e..5804640df 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -125,6 +125,13 @@ struct ISAM2Params { bool enableDetailedResults; ///< Whether to compute and return ISAM2Result::detailedResults, this can increase running time (default: false) + /** Check variables for relinearization in tree-order, stopping the check once a variable does not need to be relinearized (default: false). + * This can improve speed by only checking a small part of the top of the tree. However, variables below the check cut-off can accumulate + * significant deltas without triggering relinearization. This is particularly useful in exploration scenarios where real-time performance + * is desired over correctness. Use with caution. + */ + bool enablePartialRelinearizationCheck; + /** Specify parameters as constructor arguments */ ISAM2Params( OptimizationParams _optimizationParams = ISAM2GaussNewtonParams(), ///< see ISAM2Params::optimizationParams @@ -139,7 +146,7 @@ struct ISAM2Params { relinearizeSkip(_relinearizeSkip), enableRelinearization(_enableRelinearization), evaluateNonlinearError(_evaluateNonlinearError), factorization(_factorization), cacheLinearizedFactors(_cacheLinearizedFactors), keyFormatter(_keyFormatter), - enableDetailedResults(false) {} + enableDetailedResults(false), enablePartialRelinearizationCheck(false) {} }; /** diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 80bd651c8..2a5bf7962 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -1242,6 +1242,129 @@ TEST(ISAM2, constrained_ordering) EXPECT(assert_equal(expectedGradient, actualGradient)); } +/* ************************************************************************* */ +TEST(ISAM2, slamlike_solution_partial_relinearization_check) +{ + + // These variables will be reused and accumulate factors and values + ISAM2Params params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false); + params.enablePartialRelinearizationCheck = true; + ISAM2 isam(params); + Values fullinit; + planarSLAM::Graph fullgraph; + + // i keeps track of the time step + size_t i = 0; + + // Add a prior at time 0 and update isam + { + planarSLAM::Graph newfactors; + newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((0), Pose2(0.01, 0.01, 0.01)); + fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); + + isam.update(newfactors, init); + } + + CHECK(isam_check(fullgraph, fullinit, isam)); + + // Add odometry from time 0 to time 5 + for( ; i<5; ++i) { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + + isam.update(newfactors, init); + } + + // Add odometry from time 5 to 6 and landmark measurement at time 5 + { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(1.01, 0.01, 0.01)); + init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); + fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); + fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); + + isam.update(newfactors, init); + ++ i; + } + + // Add odometry from time 6 to time 10 + for( ; i<10; ++i) { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); + + isam.update(newfactors, init); + } + + // Add odometry from time 10 to 11 and landmark measurement at time 10 + { + planarSLAM::Graph newfactors; + newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + fullgraph.push_back(newfactors); + + Values init; + init.insert((i+1), Pose2(6.9, 0.1, 0.01)); + fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); + + isam.update(newfactors, init); + ++ i; + } + + // Compare solutions + CHECK(isam_check(fullgraph, fullinit, isam)); + + // Check gradient at each node + typedef ISAM2::sharedClique sharedClique; + BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { + // Compute expected gradient + FactorGraph jfg; + jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(jfg, expectedGradient); + // Compare with actual gradients + int variablePosition = 0; + for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { + const int dim = clique->conditional()->dim(jit); + Vector actual = clique->gradientContribution().segment(variablePosition, dim); + EXPECT(assert_equal(expectedGradient[*jit], actual)); + variablePosition += dim; + } + LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); + } + + // Check gradient + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(FactorGraph(isam), expectedGradient); + VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); + VectorValues actualGradient(*allocateVectorValues(isam)); + gradientAtZero(isam, actualGradient); + EXPECT(assert_equal(expectedGradient2, expectedGradient)); + EXPECT(assert_equal(expectedGradient, actualGradient)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr);} /* ************************************************************************* */ From f0c8c023a032ed8d978e79a57daea29909362aba Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Fri, 29 Jun 2012 18:38:54 +0000 Subject: [PATCH 494/914] Added small verbosity changes, verbose now defaults to false in wrap.cpp --- wrap/Constructor.cpp | 7 ++- wrap/Constructor.h | 3 +- wrap/matlab.h | 135 ------------------------------------------- wrap/wrap.cpp | 2 +- 4 files changed, 6 insertions(+), 141 deletions(-) diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index e999951b2..7785de08f 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -128,8 +128,8 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << " if(self) {" << endl; file.oss << " if(nargin > 1) {" << endl; file.oss << " collector.insert(self);" << endl; - //TODO: Add verbosity flag - //file.oss << " std::cout << \"Collected\" << collector.size() << std::endl;" << endl; + if(verbose_) + file.oss << " std::cout << \"Collected\" << collector.size() << std::endl;" << endl; file.oss << " }" << endl; file.oss << " else if(collector.erase(self))" << endl; file.oss << " delete self;" << endl; @@ -148,7 +148,8 @@ void Constructor::matlab_wrapper(const string& toolboxPath, //file.oss << " self = construct(nc, in);" << endl; file.oss << " collector.insert(self);" << endl; - file.oss << " std::cout << \"constructed \" << self << \", size=\" << collector.size() << std::endl;" << endl; + if(verbose_) + file.oss << " std::cout << \"constructed \" << self << \", size=\" << collector.size() << std::endl;" << endl; file.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);" << endl; file.oss << " *reinterpret_cast (mxGetPr(out[0])) = self;" << endl; file.oss << " }" << endl; diff --git a/wrap/Constructor.h b/wrap/Constructor.h index a766905b6..467ff3b22 100644 --- a/wrap/Constructor.h +++ b/wrap/Constructor.h @@ -28,12 +28,11 @@ namespace wrap { struct Constructor { /// Constructor creates an empty class - Constructor(bool verbose = true) : + Constructor(bool verbose = false) : verbose_(verbose) { } // Then the instance variables are set directly by the Module constructor - // TODO:Vector of argument lists? std::vector args_list; std::string name; bool verbose_; diff --git a/wrap/matlab.h b/wrap/matlab.h index 74c0823e4..3cfebdfe7 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -376,138 +376,3 @@ boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& cla boost::shared_ptr* spp = *reinterpret_cast**> (mxGetPr(mxh)); return *spp; } - - -//***************************************************************************** -// Shared Pointer Handle -// inspired by mexhandle, but using shared_ptr -//***************************************************************************** - -template -class ObjectHandle { -private: - ObjectHandle* signature; // use 'this' as a unique object signature - const std::type_info* type; // type checking information - boost::shared_ptr t; // object pointer - -public: - // Constructor for free-store allocated objects. - // Creates shared pointer, will delete if is last one to hold pointer - ObjectHandle(T* ptr) : - type(&typeid(T)), t(ptr) { - signature = this; - mexPrintf("Created Shared Pointer use_count = %li\n", t.use_count()); - mexPrintf("Created Pointer points to %d\n", t.get()); - - } - - // Constructor for shared pointers - // Creates shared pointer, will delete if is last one to hold pointer - ObjectHandle(boost::shared_ptr shared_ptr) : - /*type(&typeid(T)),*/ t(shared_ptr) { - signature = this; - mexPrintf("Created sp from sp use_count = %li\n", t.use_count()); - mexPrintf("Created sp from sp points to %d\n", t.get()); - } - - ~ObjectHandle() { - // object is in shared_ptr, will be automatically deleted - signature = 0; // destroy signature - // std::cout << "ObjectHandle destructor" << std::endl; - } - - // Get the actual object contained by handle - boost::shared_ptr get_object() const { - return t; - } - - // Print the mexhandle for debugging - void print(const char* str) { - mexPrintf("mexhandle %s:\n", str); - mexPrintf(" signature = %d:\n", signature); - mexPrintf(" pointer = %d:\n", t.get()); - } - - // Convert ObjectHandle to a mxArray handle (to pass back from mex-function). - // Create a numeric array as handle for an ObjectHandle. - // We ASSUME we can store object pointer in the mxUINT32 element of mxArray. - mxArray* to_mex_handle() { - mxArray* handle = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast**> (mxGetPr(handle)) = this; - return handle; - } - - string type_name() const { - return type->name(); - } - - // Convert mxArray (passed to mex-function) to an ObjectHandle. - // Import a handle from MatLab as a mxArray of UINT32. Check that - // it is actually a pointer to an ObjectHandle. - static ObjectHandle* from_mex_handle(const mxArray* handle) { - if (mxGetClassID(handle) != mxUINT32OR64_CLASS || mxIsComplex(handle) - || mxGetM(handle) != 1 || mxGetN(handle) != 1) error( - "Parameter is not an ObjectHandle type."); - - // We *assume* we can store ObjectHandle pointer in the mxUINT32 of handle - ObjectHandle* obj = *reinterpret_cast (mxGetPr(handle)); - - if (!obj) // gross check to see we don't have an invalid pointer - error("Parameter is NULL. It does not represent an ObjectHandle object."); - // TODO: change this for max-min check for pointer values - - if (obj->signature != obj) // check memory has correct signature - error("Parameter does not represent an ObjectHandle object."); - - /* - if (*(obj->type) != typeid(T)) { // check type - mexPrintf("Given: <%s>, Required: <%s>.\n", obj->type_name(), typeid(T).name()); - error("Given ObjectHandle does not represent the correct type."); - } - */ - - return obj; - } - -}; - -//***************************************************************************** -// wrapping C++ objects in a MATLAB proxy class -//***************************************************************************** - -/* - For every C++ class Class, a matlab proxy class @Class/Class.m object - is created. Its constructor will check which of the C++ constructors - needs to be called, based on nr of arguments. It then calls the - corresponding mex function new_Class_signature, which will create a - C++ object using new, and pass the pointer to wrap_constructed - (below). This creates a mexhandle and returns it to the proxy class - constructor, which assigns it to self. Matlab owns this handle now. -*/ -template -mxArray* wrap_constructed(Class* pointer, const char *classname) { - ObjectHandle* handle = new ObjectHandle(pointer); - return handle->to_mex_handle(); -} - - - -//***************************************************************************** -// unwrapping a MATLAB proxy class to a C++ object reference -//***************************************************************************** - -/* - Besides the basis types, the only other argument type allowed is a - shared pointer to a C++ object. In this case, matlab needs to pass a - proxy class object to the mex function. [unwrap_shared_ptr] extracts - the ObjectHandle from the self property, and returns a shared pointer - to the object. -*/ - - -template -void delete_shared_ptr(const mxArray* obj, const string& className) { - mxArray* mxh = mxGetProperty(obj,0,"self"); - ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); - delete handle; -} diff --git a/wrap/wrap.cpp b/wrap/wrap.cpp index eabba647e..f4490e583 100644 --- a/wrap/wrap.cpp +++ b/wrap/wrap.cpp @@ -42,7 +42,7 @@ void generate_matlab_toolbox( { // Parse interface file into class object // This recursively creates Class objects, Method objects, etc... - wrap::Module module(interfacePath, moduleName, true); + wrap::Module module(interfacePath, moduleName, false); // Then emit MATLAB code module.matlab_code(mexCommand,toolboxPath,mexExt,mexFlags); From 3c0ea754dfa2b93144051dfdcc29b9716bb7dc50 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 29 Jun 2012 19:05:49 +0000 Subject: [PATCH 495/914] make targets for cleaning wrap --- .cproject | 358 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 204 insertions(+), 154 deletions(-) diff --git a/.cproject b/.cproject index 7828f8165..f52a49e73 100644 --- a/.cproject +++ b/.cproject @@ -281,6 +281,7 @@ + @@ -307,14 +308,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -341,6 +334,7 @@ make + tests/testBayesTree.run true false @@ -348,6 +342,7 @@ make + testBinaryBayesNet.run true false @@ -395,6 +390,7 @@ make + testSymbolicBayesNet.run true false @@ -402,6 +398,7 @@ make + tests/testSymbolicFactor.run true false @@ -409,6 +406,7 @@ make + testSymbolicFactorGraph.run true false @@ -424,11 +422,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -517,22 +524,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -549,6 +540,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -573,26 +580,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -677,26 +684,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -951,6 +958,7 @@ make + testGraph.run true false @@ -958,6 +966,7 @@ make + testJunctionTree.run true false @@ -965,6 +974,7 @@ make + testSymbolicBayesNetB.run true false @@ -1002,6 +1012,14 @@ true true + + make + -j5 + all + true + true + true + make -j2 @@ -1092,6 +1110,7 @@ make + testErrors.run true false @@ -1547,7 +1566,6 @@ make - testSimulated2DOriented.run true false @@ -1587,7 +1605,6 @@ make - testSimulated2D.run true false @@ -1595,7 +1612,6 @@ make - testSimulated3D.run true false @@ -1811,7 +1827,6 @@ make - tests/testGaussianISAM2 true false @@ -1833,102 +1848,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -2130,6 +2049,7 @@ cpack + -G DEB true false @@ -2137,6 +2057,7 @@ cpack + -G RPM true false @@ -2144,6 +2065,7 @@ cpack + -G TGZ true false @@ -2151,6 +2073,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2244,42 +2167,130 @@ true true - + make -j5 - testSpirit.run + wrap_gtsam_clean true true true - + make -j5 - testWrap.run + wrap_gtsam_unstable_clean true true true - + make -j5 - check.wrap + wrap_gtsam_distclean true true true - + make -j5 - wrap_gtsam + wrap_gtsam_unstable_distclean true true true - + make - -j5 - wrap + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2323,7 +2334,46 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + - From 02df40bd734e741783d74c1edf5efc04908e8e4d Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Sat, 30 Jun 2012 01:33:41 +0000 Subject: [PATCH 496/914] Dependency checking for matlab.h --- wrap/Class.cpp | 3 ++- wrap/Module.cpp | 3 ++- wrap/Module.h | 1 + wrap/wrap.cpp | 7 ++++--- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 5e0237d3a..e57a85884 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -152,7 +152,8 @@ void Class::makefile_fragment(FileWriter& file) const { } BOOST_FOREACH(const string& file_base, file_names) { - file.oss << file_base << ".$(MEXENDING): " << file_base << ".cpp" << endl; + file.oss << file_base << ".$(MEXENDING): " << file_base << ".cpp"; + file.oss << " $(PATH_TO_WRAP)/matlab.h" << endl; file.oss << "\t$(MEX) $(mex_flags) " << file_base << ".cpp -output " << file_base << endl; } diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 972bacbee..0adf1cda0 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -287,7 +287,7 @@ void verifyReturnTypes(const vector& validtypes, const vector& vt) { /* ************************************************************************* */ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, - const string& mexExt, const string& mexFlags) const { + const string& mexExt, const string& headerPath,const string& mexFlags) const { fs::create_directories(toolboxPath); @@ -308,6 +308,7 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, makeModuleMakefile.oss << "\nMEX = " << mexCommand << "\n"; makeModuleMakefile.oss << "MEXENDING = " << mexExt << "\n"; + makeModuleMakefile.oss << "PATH_TO_WRAP = " << headerPath << "\n"; makeModuleMakefile.oss << "mex_flags = " << mexFlags << "\n\n"; // Dependency check list diff --git a/wrap/Module.h b/wrap/Module.h index 4b650728d..239aa20b0 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -44,6 +44,7 @@ struct Module { const std::string& mexCommand, const std::string& path, const std::string& mexExt, + const std::string& headerPath, const std::string& mexFlags) const; }; diff --git a/wrap/wrap.cpp b/wrap/wrap.cpp index f4490e583..1b1b631e4 100644 --- a/wrap/wrap.cpp +++ b/wrap/wrap.cpp @@ -38,14 +38,15 @@ void generate_matlab_toolbox( const string& interfacePath, const string& moduleName, const string& toolboxPath, - const string& mexFlags) + const string& headerPath, + const string& mexFlags) { // Parse interface file into class object // This recursively creates Class objects, Method objects, etc... wrap::Module module(interfacePath, moduleName, false); // Then emit MATLAB code - module.matlab_code(mexCommand,toolboxPath,mexExt,mexFlags); + module.matlab_code(mexCommand,toolboxPath,mexExt,headerPath,mexFlags); } /** Displays usage information */ @@ -73,6 +74,6 @@ int main(int argc, const char* argv[]) { usage(); } else - generate_matlab_toolbox(argv[1],argv[2],argv[3],argv[4],argv[5],argc==6 ? " " : argv[6]); + generate_matlab_toolbox(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],argc==7 ? " " : argv[7]); return 0; } From f68ba93f3dd47fa9613a83c212ad75a307417366 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Sat, 30 Jun 2012 01:34:04 +0000 Subject: [PATCH 497/914] Dep checking for cmake --- CMakeLists.txt | 1 + gtsam_unstable/base/Dummy.h | 4 ++++ gtsam_unstable/gtsam_unstable.h | 1 + matlab/tests/testOdometryExample.m | 6 +++--- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 96efa97dd..675e7c80b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,7 @@ option(GTSAM_INSTALL_MATLAB_TESTS "Enable/Disable installation of matlab option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility" ON) set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTRING "Path to install matlab toolbox") +set(GTSAM_WRAP_HEADER_PATH ${PROJECT_SOURCE_DIR}/wrap CACHE DOCSTRING "Path to directory of matlab.h") # TODO: Check for matlab mex binary before handling building of binaries diff --git a/gtsam_unstable/base/Dummy.h b/gtsam_unstable/base/Dummy.h index ccf23af5d..995186cd6 100644 --- a/gtsam_unstable/base/Dummy.h +++ b/gtsam_unstable/base/Dummy.h @@ -33,6 +33,10 @@ namespace gtsam { std::cout << s << "Dummy " << id << std::endl; } + unsigned char dummyTwoVar(unsigned char a) const { + return a; + } + }; } // namespace gtsam diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index fda6ff8c4..c9d114d58 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -14,6 +14,7 @@ namespace gtsam { class Dummy { Dummy(); void print(string s) const; + unsigned char dummyTwoVar(unsigned char a) const; }; #include diff --git a/matlab/tests/testOdometryExample.m b/matlab/tests/testOdometryExample.m index 0056a43e8..634c52799 100644 --- a/matlab/tests/testOdometryExample.m +++ b/matlab/tests/testOdometryExample.m @@ -33,8 +33,8 @@ initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate,0); marginals = graph.marginals(result); -marginals.marginalCovariance(i); +marginals.marginalCovariance(1); %% Check first pose equality -pose_i = result.pose(1); -CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); \ No newline at end of file +pose_1 = result.pose(1); +CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); From dd61e5dd580775387bc32400cfdc3683f475948b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:43:44 +0000 Subject: [PATCH 498/914] Made TOPSRCDIR available in all unit tests --- wrap/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 16dfbb8e5..757b488ba 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -4,7 +4,7 @@ find_package(Boost 1.42 COMPONENTS system filesystem thread REQUIRED) # Build the executable itself file(GLOB wrap_srcs "*.cpp") -list(REMOVE_ITEM wrap_srcs wrap.cpp) +list(REMOVE_ITEM wrap_srcs ${CMAKE_CURRENT_SOURCE_DIR}/wrap.cpp) add_library(wrap_lib STATIC ${wrap_srcs}) add_executable(wrap wrap.cpp) target_link_libraries(wrap wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) @@ -19,7 +19,6 @@ install(FILES matlab.h DESTINATION include/wrap) # Build tests if (GTSAM_BUILD_TESTS) - add_definitions(-DTOPSRCDIR="${CMAKE_SOURCE_DIR}") set(wrap_local_libs wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) gtsam_add_subdir_tests("wrap" "${wrap_local_libs}" "${wrap_local_libs}" "") endif(GTSAM_BUILD_TESTS) From c443ccbedde3f710d84a3f91eced966b489386cb Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:44:00 +0000 Subject: [PATCH 499/914] More adding of static to avoid naming conflicts in unit tests --- gtsam/geometry/tests/testCal3_S2.cpp | 4 +- .../tests/testSerializationGeometry.cpp | 41 ++++++------------- gtsam/geometry/tests/testStereoCamera.cpp | 10 ++--- gtsam/inference/tests/testISAM.cpp | 2 +- .../linear/tests/testGaussianJunctionTree.cpp | 2 +- .../linear/tests/testSerializationLinear.cpp | 10 ++--- .../tests/testSerializationNonlinear.cpp | 12 +++--- gtsam/slam/tests/testStereoFactor.cpp | 8 ++-- tests/testGaussianISAM.cpp | 4 +- tests/testGaussianJunctionTreeB.cpp | 10 ++--- tests/testNonlinearEquality.cpp | 14 +++---- tests/testSerializationSLAM.cpp | 8 ++-- 12 files changed, 54 insertions(+), 71 deletions(-) diff --git a/gtsam/geometry/tests/testCal3_S2.cpp b/gtsam/geometry/tests/testCal3_S2.cpp index fd82557a3..8995a3a14 100644 --- a/gtsam/geometry/tests/testCal3_S2.cpp +++ b/gtsam/geometry/tests/testCal3_S2.cpp @@ -24,8 +24,8 @@ using namespace gtsam; GTSAM_CONCEPT_TESTABLE_INST(Cal3_S2) GTSAM_CONCEPT_MANIFOLD_INST(Cal3_S2) -Cal3_S2 K(500, 500, 0.1, 640 / 2, 480 / 2); -Point2 p(1, -2); +static Cal3_S2 K(500, 500, 0.1, 640 / 2, 480 / 2); +static Point2 p(1, -2); /* ************************************************************************* */ TEST( Cal3_S2, easy_constructor) diff --git a/gtsam/geometry/tests/testSerializationGeometry.cpp b/gtsam/geometry/tests/testSerializationGeometry.cpp index c1fba6b2c..17a0b1eca 100644 --- a/gtsam/geometry/tests/testSerializationGeometry.cpp +++ b/gtsam/geometry/tests/testSerializationGeometry.cpp @@ -36,37 +36,20 @@ using namespace gtsam; using namespace gtsam::serializationTestHelpers; /* ************************************************************************* */ -// Export all classes derived from Value -BOOST_CLASS_EXPORT(gtsam::Cal3_S2) -BOOST_CLASS_EXPORT(gtsam::Cal3_S2Stereo) -BOOST_CLASS_EXPORT(gtsam::Cal3Bundler) -BOOST_CLASS_EXPORT(gtsam::CalibratedCamera) -BOOST_CLASS_EXPORT(gtsam::Point2) -BOOST_CLASS_EXPORT(gtsam::Point3) -BOOST_CLASS_EXPORT(gtsam::Pose2) -BOOST_CLASS_EXPORT(gtsam::Pose3) -BOOST_CLASS_EXPORT(gtsam::Rot2) -BOOST_CLASS_EXPORT(gtsam::Rot3) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::StereoPoint2) +static Point3 pt3(1.0, 2.0, 3.0); +static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); +static Pose3 pose3(rt3, pt3); -/* ************************************************************************* */ -Point3 pt3(1.0, 2.0, 3.0); -Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); -Pose3 pose3(rt3, pt3); +static Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); +static Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); +static Cal3Bundler cal3(1.0, 2.0, 3.0); +static Cal3_S2Stereo cal4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0); +static Cal3_S2Stereo::shared_ptr cal4ptr(new Cal3_S2Stereo(cal4)); +static CalibratedCamera cal5(Pose3(rt3, pt3)); -Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); -Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); -Cal3Bundler cal3(1.0, 2.0, 3.0); -Cal3_S2Stereo cal4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0); -Cal3_S2Stereo::shared_ptr cal4ptr(new Cal3_S2Stereo(cal4)); -CalibratedCamera cal5(Pose3(rt3, pt3)); - -PinholeCamera cam1(pose3, cal1); -StereoCamera cam2(pose3, cal4ptr); -StereoPoint2 spt(1.0, 2.0, 3.0); +static PinholeCamera cam1(pose3, cal1); +static StereoCamera cam2(pose3, cal4ptr); +static StereoPoint2 spt(1.0, 2.0, 3.0); /* ************************************************************************* */ TEST (Serialization, text_geometry) { diff --git a/gtsam/geometry/tests/testStereoCamera.cpp b/gtsam/geometry/tests/testStereoCamera.cpp index 2446ff122..29a8344d4 100644 --- a/gtsam/geometry/tests/testStereoCamera.cpp +++ b/gtsam/geometry/tests/testStereoCamera.cpp @@ -74,21 +74,21 @@ TEST( StereoCamera, project) /* ************************************************************************* */ -Pose3 camera1(Matrix_(3,3, +static Pose3 camera1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,6.25)); -Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); -StereoCamera stereoCam(Pose3(), K); +static Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); +static StereoCamera stereoCam(Pose3(), K); // point X Y Z in meters -Point3 p(0, 0, 5); +static Point3 p(0, 0, 5); /* ************************************************************************* */ -StereoPoint2 project_(const StereoCamera& cam, const Point3& point) { return cam.project(point); } +static StereoPoint2 project_(const StereoCamera& cam, const Point3& point) { return cam.project(point); } TEST( StereoCamera, Dproject_stereo_pose) { Matrix expected = numericalDerivative21(project_,stereoCam, p); diff --git a/gtsam/inference/tests/testISAM.cpp b/gtsam/inference/tests/testISAM.cpp index 8fdc78fc0..18cf66723 100644 --- a/gtsam/inference/tests/testISAM.cpp +++ b/gtsam/inference/tests/testISAM.cpp @@ -34,7 +34,7 @@ typedef ISAM SymbolicISAM; /* ************************************************************************* */ // Some numbers that should be consistent among all smoother tests -double sigmax1 = 0.786153, sigmax2 = 0.687131, sigmax3 = 0.671512, sigmax4 = +static double sigmax1 = 0.786153, sigmax2 = 0.687131, sigmax3 = 0.671512, sigmax4 = 0.669534, sigmax5 = sigmax3, sigmax6 = sigmax2, sigmax7 = sigmax1; /* ************************************************************************* */ diff --git a/gtsam/linear/tests/testGaussianJunctionTree.cpp b/gtsam/linear/tests/testGaussianJunctionTree.cpp index b49d7fff0..c4ddc360b 100644 --- a/gtsam/linear/tests/testGaussianJunctionTree.cpp +++ b/gtsam/linear/tests/testGaussianJunctionTree.cpp @@ -35,7 +35,7 @@ using namespace gtsam; static const Index x2=0, x1=1, x3=2, x4=3; -GaussianFactorGraph createChain() { +static GaussianFactorGraph createChain() { typedef GaussianFactorGraph::sharedFactor Factor; SharedDiagonal model = noiseModel::Isotropic::Sigma(1, 0.5); diff --git a/gtsam/linear/tests/testSerializationLinear.cpp b/gtsam/linear/tests/testSerializationLinear.cpp index a646773f2..e8a53c504 100644 --- a/gtsam/linear/tests/testSerializationLinear.cpp +++ b/gtsam/linear/tests/testSerializationLinear.cpp @@ -47,11 +47,11 @@ BOOST_CLASS_EXPORT_GUID(gtsam::SharedDiagonal, "gtsam_SharedDiagonal"); /* ************************************************************************* */ // example noise models -noiseModel::Diagonal::shared_ptr diag3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); -noiseModel::Gaussian::shared_ptr gaussian3 = noiseModel::Gaussian::SqrtInformation(2.0 * eye(3,3)); -noiseModel::Isotropic::shared_ptr iso3 = noiseModel::Isotropic::Sigma(3, 0.2); -noiseModel::Constrained::shared_ptr constrained3 = noiseModel::Constrained::MixedSigmas(Vector_(3, 0.0, 0.0, 0.1)); -noiseModel::Unit::shared_ptr unit3 = noiseModel::Unit::Create(3); +static noiseModel::Diagonal::shared_ptr diag3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); +static noiseModel::Gaussian::shared_ptr gaussian3 = noiseModel::Gaussian::SqrtInformation(2.0 * eye(3,3)); +static noiseModel::Isotropic::shared_ptr iso3 = noiseModel::Isotropic::Sigma(3, 0.2); +static noiseModel::Constrained::shared_ptr constrained3 = noiseModel::Constrained::MixedSigmas(Vector_(3, 0.0, 0.0, 0.1)); +static noiseModel::Unit::shared_ptr unit3 = noiseModel::Unit::Create(3); /* ************************************************************************* */ TEST (Serialization, noiseModels) { diff --git a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp index bc023f115..57e2c0a34 100644 --- a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp +++ b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp @@ -47,13 +47,13 @@ typedef PinholeCamera PinholeCal3DS2; typedef PinholeCamera PinholeCal3Bundler; /* ************************************************************************* */ -Point3 pt3(1.0, 2.0, 3.0); -Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); -Pose3 pose3(rt3, pt3); +static Point3 pt3(1.0, 2.0, 3.0); +static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); +static Pose3 pose3(rt3, pt3); -Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); -Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); -Cal3Bundler cal3(1.0, 2.0, 3.0); +static Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); +static Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); +static Cal3Bundler cal3(1.0, 2.0, 3.0); TEST (Serialization, TemplatedValues) { Values values; diff --git a/gtsam/slam/tests/testStereoFactor.cpp b/gtsam/slam/tests/testStereoFactor.cpp index 986538448..b38dae990 100644 --- a/gtsam/slam/tests/testStereoFactor.cpp +++ b/gtsam/slam/tests/testStereoFactor.cpp @@ -28,18 +28,18 @@ using namespace std; using namespace gtsam; -Pose3 camera1(Matrix_(3,3, +static Pose3 camera1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,6.25)); -Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); -StereoCamera stereoCam(Pose3(), K); +static Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); +static StereoCamera stereoCam(Pose3(), K); // point X Y Z in meters -Point3 p(0, 0, 5); +static Point3 p(0, 0, 5); static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); // Convenience for named keys diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index 6ae4a7b20..7ec4e5317 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -41,10 +41,10 @@ using symbol_shorthand::L; /* ************************************************************************* */ // Some numbers that should be consistent among all smoother tests -double sigmax1 = 0.786153, sigmax2 = 1.0/1.47292, sigmax3 = 0.671512, sigmax4 = +static double sigmax1 = 0.786153, sigmax2 = 1.0/1.47292, sigmax3 = 0.671512, sigmax4 = 0.669534, sigmax5 = sigmax3, sigmax6 = sigmax2, sigmax7 = sigmax1; -const double tol = 1e-4; +static const double tol = 1e-4; /* ************************************************************************* */ TEST_UNSAFE( ISAM, iSAM_smoother ) diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 0f412a0b5..883011da2 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -52,7 +52,7 @@ using symbol_shorthand::L; C3 x1 : x2 C4 x7 : x6 */ -TEST( GaussianJunctionTree, constructor2 ) +TEST( GaussianJunctionTreeB, constructor2 ) { // create a graph Ordering ordering; ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); @@ -88,7 +88,7 @@ TEST( GaussianJunctionTree, constructor2 ) } /* ************************************************************************* */ -TEST( GaussianJunctionTree, optimizeMultiFrontal ) +TEST( GaussianJunctionTreeB, optimizeMultiFrontal ) { // create a graph GaussianFactorGraph fg; @@ -108,7 +108,7 @@ TEST( GaussianJunctionTree, optimizeMultiFrontal ) } /* ************************************************************************* */ -TEST( GaussianJunctionTree, optimizeMultiFrontal2) +TEST( GaussianJunctionTreeB, optimizeMultiFrontal2) { // create a graph example::Graph nlfg = createNonlinearFactorGraph(); @@ -126,7 +126,7 @@ TEST( GaussianJunctionTree, optimizeMultiFrontal2) } /* ************************************************************************* */ -TEST(GaussianJunctionTree, slamlike) { +TEST(GaussianJunctionTreeB, slamlike) { Values init; planarSLAM::Graph newfactors; planarSLAM::Graph fullgraph; @@ -188,7 +188,7 @@ TEST(GaussianJunctionTree, slamlike) { } /* ************************************************************************* */ -TEST(GaussianJunctionTree, simpleMarginal) { +TEST(GaussianJunctionTreeB, simpleMarginal) { typedef BayesTree GaussianBayesTree; diff --git a/tests/testNonlinearEquality.cpp b/tests/testNonlinearEquality.cpp index 4679dd740..1efc40cad 100644 --- a/tests/testNonlinearEquality.cpp +++ b/tests/testNonlinearEquality.cpp @@ -37,7 +37,7 @@ typedef PriorFactor PosePrior; typedef NonlinearEquality PoseNLE; typedef boost::shared_ptr shared_poseNLE; -Symbol key('x',1); +static Symbol key('x',1); /* ************************************************************************* */ TEST ( NonlinearEquality, linearization ) { @@ -241,8 +241,8 @@ TEST ( NonlinearEquality, allow_error_optimize_with_factors ) { } /* ************************************************************************* */ -SharedDiagonal hard_model = noiseModel::Constrained::All(2); -SharedDiagonal soft_model = noiseModel::Isotropic::Sigma(2, 1.0); +static SharedDiagonal hard_model = noiseModel::Constrained::All(2); +static SharedDiagonal soft_model = noiseModel::Isotropic::Sigma(2, 1.0); /* ************************************************************************* */ TEST( testNonlinearEqualityConstraint, unary_basics ) { @@ -504,10 +504,10 @@ TEST (testNonlinearEqualityConstraint, map_warp ) { } // make a realistic calibration matrix -double fov = 60; // degrees -size_t w=640,h=480; -Cal3_S2 K(fov,w,h); -boost::shared_ptr shK(new Cal3_S2(K)); +static double fov = 60; // degrees +static size_t w=640,h=480; +static Cal3_S2 K(fov,w,h); +static boost::shared_ptr shK(new Cal3_S2(K)); // typedefs for visual SLAM example typedef visualSLAM::Graph VGraph; diff --git a/tests/testSerializationSLAM.cpp b/tests/testSerializationSLAM.cpp index 7650925d1..d9094111e 100644 --- a/tests/testSerializationSLAM.cpp +++ b/tests/testSerializationSLAM.cpp @@ -174,10 +174,10 @@ BOOST_CLASS_EXPORT_GUID(visualSLAM::StereoFactor, "gtsam::visualSLAM::StereoF BOOST_CLASS_EXPORT(gtsam::Pose3) BOOST_CLASS_EXPORT(gtsam::Point3) -Point3 pt3(1.0, 2.0, 3.0); -Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); -Pose3 pose3(rt3, pt3); -Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); +static Point3 pt3(1.0, 2.0, 3.0); +static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); +static Pose3 pose3(rt3, pt3); +static Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); /* ************************************************************************* */ TEST (Serialization, visual_system) { From ed6bc55eca13aa0233ff54a85e171ae8012bfba1 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:44:08 +0000 Subject: [PATCH 500/914] Use new instead of deprecated noisemodel name in JacobianFactor --- gtsam/linear/JacobianFactor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 660eb25f7..c5f726252 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -84,7 +84,7 @@ namespace gtsam { protected: - SharedDiagonal model_; // Gaussian noise model with diagonal covariance matrix + noiseModel::Diagonal::shared_ptr model_; // Gaussian noise model with diagonal covariance matrix std::vector firstNonzeroBlocks_; AbMatrix matrix_; // the full matrix corresponding to the factor BlockAb Ab_; // the block view of the full matrix From 7e838447153649ebfdd856e074deeffab35d106d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:44:16 +0000 Subject: [PATCH 501/914] Added missing serialization headers --- gtsam/linear/NoiseModel.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index c67828822..36fe3cd26 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -19,6 +19,8 @@ #pragma once #include +#include +#include #include #include From 5660afd3324f4c96e1523a9b12ecb682f0ab5426 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:44:24 +0000 Subject: [PATCH 502/914] Using absolute path provided by TOPSRCDIR macro instead of relative path in unit test --- gtsam_unstable/discrete/tests/testScheduler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam_unstable/discrete/tests/testScheduler.cpp b/gtsam_unstable/discrete/tests/testScheduler.cpp index bf9273ad6..6559754d5 100644 --- a/gtsam_unstable/discrete/tests/testScheduler.cpp +++ b/gtsam_unstable/discrete/tests/testScheduler.cpp @@ -149,7 +149,7 @@ TEST( schedulingExample, test) /* ************************************************************************* */ TEST( schedulingExample, smallFromFile) { - string path("../../../gtsam_unstable/discrete/examples/"); + string path(TOPSRCDIR "/gtsam_unstable/discrete/examples/"); Scheduler s(2, path + "small.csv"); // add areas From 1896cf17c6c9066a5693c88e0e280e12188e5321 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:44:42 +0000 Subject: [PATCH 503/914] Added MSVC build directories to svn:ignore From f91ec894b302cbbcc07112e61e1963628cf95962 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:44:58 +0000 Subject: [PATCH 504/914] Using boost::make_shared --- gtsam/inference/SymbolicFactorGraph.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/inference/SymbolicFactorGraph.cpp b/gtsam/inference/SymbolicFactorGraph.cpp index b58a69b6d..00f3439a0 100644 --- a/gtsam/inference/SymbolicFactorGraph.cpp +++ b/gtsam/inference/SymbolicFactorGraph.cpp @@ -85,8 +85,8 @@ namespace gtsam { "IndexFactor::CombineAndEliminate called on factors with no variables."); vector newKeys(keys.begin(), keys.end()); - return make_pair(new IndexConditional(newKeys, nrFrontals), - new IndexFactor(newKeys.begin() + nrFrontals, newKeys.end())); + return make_pair(boost::make_shared(newKeys, nrFrontals), + boost::make_shared(newKeys.begin() + nrFrontals, newKeys.end())); } /* ************************************************************************* */ From 5431d745730578eeaaf3685d29f43036b1987566 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:45:06 +0000 Subject: [PATCH 505/914] Fixed incorrect iterator type --- gtsam/nonlinear/Values.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/Values.cpp b/gtsam/nonlinear/Values.cpp index bb66943eb..58099d149 100644 --- a/gtsam/nonlinear/Values.cpp +++ b/gtsam/nonlinear/Values.cpp @@ -120,7 +120,7 @@ namespace gtsam { /* ************************************************************************* */ void Values::insert(Key j, const Value& val) { Key key = j; // Non-const duplicate to deal with non-const insert argument - std::pair insertResult = values_.insert(key, val.clone_()); + std::pair insertResult = values_.insert(key, val.clone_()); if(!insertResult.second) throw ValuesKeyAlreadyExists(j); } From 57ca7d77dba9c764b5cf13d1a9c469adb4a57c58 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:45:21 +0000 Subject: [PATCH 506/914] Removed Permuted views to simplify a lot of code - all objects that need to be permuted now have their data rearranged instead of using the "Permuted" indirection class. --- gtsam/inference/Permutation.h | 83 +------------ gtsam/inference/VariableIndex.cpp | 52 +++----- gtsam/inference/VariableIndex.h | 49 +++----- gtsam/linear/GaussianConditional.cpp | 36 ++---- gtsam/linear/GaussianConditional.h | 17 --- gtsam/linear/VectorValues.cpp | 40 ++++--- gtsam/linear/VectorValues.h | 13 +- .../linear/tests/testGaussianConditional.cpp | 49 -------- gtsam/linear/tests/testVectorValues.cpp | 59 +++------- gtsam/nonlinear/ISAM2-impl.cpp | 65 ++++------ gtsam/nonlinear/ISAM2-impl.h | 18 +-- gtsam/nonlinear/ISAM2-inl.h | 4 +- gtsam/nonlinear/ISAM2.cpp | 30 ++--- gtsam/nonlinear/ISAM2.h | 32 ++--- tests/testGaussianISAM2.cpp | 111 ++++++------------ 15 files changed, 189 insertions(+), 469 deletions(-) diff --git a/gtsam/inference/Permutation.h b/gtsam/inference/Permutation.h index 0aa322e87..3a5b9b0da 100644 --- a/gtsam/inference/Permutation.h +++ b/gtsam/inference/Permutation.h @@ -26,7 +26,7 @@ namespace gtsam { -/** + /** * A permutation reorders variables, for example to reduce fill-in during * elimination. To save computation, the permutation can be applied to * the necessary data structures only once, then multiple computations @@ -151,8 +151,8 @@ public: */ Permutation::shared_ptr inverse() const; - const_iterator begin() const { return rangeIndices_.begin(); } /// permuted(permutation, container); - * permuted[index1]; - * permuted[index2]; - * which is equivalent to: - * container[permutation[index1]]; - * container[permutation[index2]]; - * but more concise. - */ -template -class Permuted { - Permutation permutation_; - CONTAINER& container_; -public: - typedef typename CONTAINER::iterator::value_type value_type; - - /** Construct as a permuted view on the Container. The permutation is copied - * but only a reference to the container is stored. - */ - Permuted(const Permutation& permutation, CONTAINER& container) : permutation_(permutation), container_(container) {} - - /** Construct as a view on the Container with an identity permutation. Only - * a reference to the container is stored. - */ - Permuted(CONTAINER& container) : permutation_(Permutation::Identity(container.size())), container_(container) {} - - /** Print */ - void print(const std::string& str = "") const { - std::cout << str; - permutation_.print(" permutation: "); - container_.print(" container: "); - } - - /** Access the container through the permutation */ - value_type& operator[](size_t index) { return container_[permutation_[index]]; } - - /** Access the container through the permutation (const version) */ - const value_type& operator[](size_t index) const { return container_[permutation_[index]]; } - - /** Assignment operator for cloning in ISAM2 */ - Permuted operator=(const Permuted& other) { - permutation_ = other.permutation_; - container_ = other.container_; - return *this; - } - - /** Permute this view by applying a permutation to the underlying permutation */ - void permute(const Permutation& permutation) { assert(permutation.size() == this->size()); permutation_ = *permutation_.permute(permutation); } - - /** Access the underlying container */ - CONTAINER* operator->() { return &container_; } - - /** Access the underlying container (const version) */ - const CONTAINER* operator->() const { return &container_; } - - /** Size of the underlying container */ - size_t size() const { return container_.size(); } - - /** Access to the underlying container */ - CONTAINER& container() { return container_; } - - /** Access to the underlying container (const version) */ - const CONTAINER& container() const { return container_; } - - /** Access the underlying permutation */ - Permutation& permutation() { return permutation_; } - const Permutation& permutation() const { return permutation_; } -}; - - } diff --git a/gtsam/inference/VariableIndex.cpp b/gtsam/inference/VariableIndex.cpp index c7ef90e9f..a29d5e432 100644 --- a/gtsam/inference/VariableIndex.cpp +++ b/gtsam/inference/VariableIndex.cpp @@ -18,37 +18,12 @@ #include #include +#include namespace gtsam { using namespace std; -/* ************************************************************************* */ -VariableIndex::VariableIndex(const VariableIndex& other) : - index_(indexUnpermuted_) { - *this = other; -} - -/* ************************************************************************* */ -VariableIndex& VariableIndex::operator=(const VariableIndex& rhs) { - index_ = rhs.index_; - nFactors_ = rhs.nFactors_; - nEntries_ = rhs.nEntries_; - return *this; -} - -/* ************************************************************************* */ -void VariableIndex::permute(const Permutation& permutation) { -#ifndef NDEBUG - // Assert that the permutation does not leave behind any non-empty variables, - // otherwise the nFactors and nEntries counts would be incorrect. - for(Index j=0; jindex_.size(); ++j) - if(find(permutation.begin(), permutation.end(), j) == permutation.end()) - assert(this->operator[](j).empty()); -#endif - index_.permute(permutation); -} - /* ************************************************************************* */ bool VariableIndex::equals(const VariableIndex& other, double tol) const { if(this->nEntries_ == other.nEntries_ && this->nFactors_ == other.nFactors_) { @@ -66,17 +41,13 @@ bool VariableIndex::equals(const VariableIndex& other, double tol) const { /* ************************************************************************* */ void VariableIndex::print(const string& str) const { - cout << str << "\n"; + cout << str; cout << "nEntries = " << nEntries() << ", nFactors = " << nFactors() << "\n"; - Index var = 0; - BOOST_FOREACH(const Factors& variable, index_.container()) { - Permutation::const_iterator rvar = find(index_.permutation().begin(), index_.permutation().end(), var); - assert(rvar != index_.permutation().end()); - cout << "var " << (rvar-index_.permutation().begin()) << ":"; - BOOST_FOREACH(const size_t factor, variable) + for(Index var = 0; var < size(); ++var) { + cout << "var " << var << ":"; + BOOST_FOREACH(const size_t factor, index_[var]) cout << " " << factor; cout << "\n"; - ++ var; } cout << flush; } @@ -85,7 +56,7 @@ void VariableIndex::print(const string& str) const { void VariableIndex::outputMetisFormat(ostream& os) const { os << size() << " " << nFactors() << "\n"; // run over variables, which will be hyper-edges. - BOOST_FOREACH(const Factors& variable, index_.container()) { + BOOST_FOREACH(const Factors& variable, index_) { // every variable is a hyper-edge covering its factors BOOST_FOREACH(const size_t factor, variable) os << (factor+1) << " "; // base 1 @@ -94,4 +65,15 @@ void VariableIndex::outputMetisFormat(ostream& os) const { os << flush; } +/* ************************************************************************* */ +void VariableIndex::permuteInPlace(const Permutation& permutation) { + // Create new index and move references to data into it in permuted order + vector newIndex(this->size()); + for(Index i = 0; i < newIndex.size(); ++i) + newIndex[i].swap(this->index_[permutation[i]]); + + // Move reference to entire index into the VariableIndex + index_.swap(newIndex); +} + } diff --git a/gtsam/inference/VariableIndex.h b/gtsam/inference/VariableIndex.h index c9efc6b22..f497b4706 100644 --- a/gtsam/inference/VariableIndex.h +++ b/gtsam/inference/VariableIndex.h @@ -22,10 +22,12 @@ #include #include -#include +#include namespace gtsam { + class Permutation; + /** * The VariableIndex class computes and stores the block column structure of a * factor graph. The factor graph stores a collection of factors, each of @@ -44,8 +46,7 @@ public: typedef Factors::const_iterator Factor_const_iterator; protected: - std::vector indexUnpermuted_; - Permuted > index_; // Permuted view of indexUnpermuted. + std::vector index_; size_t nFactors_; // Number of factors in the original factor graph. size_t nEntries_; // Sum of involved variable counts of each factor. @@ -55,7 +56,7 @@ public: /// @{ /** Default constructor, creates an empty VariableIndex */ - VariableIndex() : index_(indexUnpermuted_), nFactors_(0), nEntries_(0) {} + VariableIndex() : nFactors_(0), nEntries_(0) {} /** * Create a VariableIndex that computes and stores the block column structure @@ -70,16 +71,6 @@ public: */ template VariableIndex(const FactorGraph& factorGraph); - /** - * Copy constructor - */ - VariableIndex(const VariableIndex& other); - - /** - * Assignment operator - */ - VariableIndex& operator=(const VariableIndex& rhs); - /// @} /// @name Standard Interface /// @{ @@ -120,9 +111,6 @@ public: /// @name Advanced Interface /// @{ - /** Access a list of factors by variable */ - Factors& operator[](Index variable) { checkVar(variable); return index_[variable]; } - /** * Augment the variable index with new factors. This can be used when * solving problems incrementally. @@ -137,11 +125,8 @@ public: */ template void remove(const CONTAINER& indices, const FactorGraph& factors); - /** - * Apply a variable permutation. Does not rearrange data, just permutes - * future lookups by variable. - */ - void permute(const Permutation& permutation); + /// Permute the variables in the VariableIndex according to the given permutation + void permuteInPlace(const Permutation& permutation); protected: Factor_iterator factorsBegin(Index variable) { checkVar(variable); return index_[variable].begin(); } /// void fill(const FactorGraph& factorGraph); /// @} @@ -183,7 +168,7 @@ void VariableIndex::fill(const FactorGraph& factorGraph) { /* ************************************************************************* */ template VariableIndex::VariableIndex(const FactorGraph& factorGraph) : - index_(indexUnpermuted_), nFactors_(0), nEntries_(0) { + nFactors_(0), nEntries_(0) { // If the factor graph is empty, return an empty index because inside this // if block we assume at least one factor. @@ -200,8 +185,7 @@ VariableIndex::VariableIndex(const FactorGraph& factorGraph) : } // Allocate array - index_.container().resize(maxVar+1); - index_.permutation() = Permutation::Identity(maxVar+1); + index_.resize(maxVar+1); fill(factorGraph); } @@ -210,7 +194,7 @@ VariableIndex::VariableIndex(const FactorGraph& factorGraph) : /* ************************************************************************* */ template VariableIndex::VariableIndex(const FactorGraph& factorGraph, Index nVariables) : - indexUnpermuted_(nVariables), index_(indexUnpermuted_), nFactors_(0), nEntries_(0) { + index_(nVariables), nFactors_(0), nEntries_(0) { fill(factorGraph); } @@ -233,10 +217,7 @@ void VariableIndex::augment(const FactorGraph& factors) { // Allocate index Index originalSize = index_.size(); - index_.container().resize(std::max(index_.size(), maxVar+1)); - index_.permutation().resize(index_.container().size()); - for(Index var=originalSize; var -inline static void doSolveInPlace(const GaussianConditional& conditional, VALUES& x) { - - // Helper function to solve-in-place on a VectorValues or Permuted, - // called by GaussianConditional::solveInPlace(VectorValues&) and by - // GaussianConditional::solveInPlace(Permuted&). - - static const bool debug = false; - if(debug) conditional.print("Solving conditional in place"); - Vector xS = internal::extractVectorValuesSlices(x, conditional.beginParents(), conditional.endParents()); - xS = conditional.get_d() - conditional.get_S() * xS; - Vector soln = conditional.get_R().triangularView().solve(xS); - if(debug) { - gtsam::print(Matrix(conditional.get_R()), "Calling backSubstituteUpper on "); - gtsam::print(soln, "full back-substitution solution: "); - } - internal::writeVectorValuesSlices(soln, x, conditional.beginFrontals(), conditional.endFrontals()); -} - /* ************************************************************************* */ void GaussianConditional::solveInPlace(VectorValues& x) const { - doSolveInPlace(*this, x); // Call helper version above -} - -/* ************************************************************************* */ -void GaussianConditional::solveInPlace(Permuted& x) const { - doSolveInPlace(*this, x); // Call helper version above + static const bool debug = false; + if(debug) this->print("Solving conditional in place"); + Vector xS = internal::extractVectorValuesSlices(x, this->beginParents(), this->endParents()); + xS = this->get_d() - this->get_S() * xS; + Vector soln = this->get_R().triangularView().solve(xS); + if(debug) { + gtsam::print(Matrix(this->get_R()), "Calling backSubstituteUpper on "); + gtsam::print(soln, "full back-substitution solution: "); + } + internal::writeVectorValuesSlices(soln, x, this->beginFrontals(), this->endFrontals()); } /* ************************************************************************* */ diff --git a/gtsam/linear/GaussianConditional.h b/gtsam/linear/GaussianConditional.h index 5b7801156..cde4f266f 100644 --- a/gtsam/linear/GaussianConditional.h +++ b/gtsam/linear/GaussianConditional.h @@ -196,23 +196,6 @@ public: */ void solveInPlace(VectorValues& x) const; - /** - * Solves a conditional Gaussian and writes the solution into the entries of - * \c x for each frontal variable of the conditional (version for permuted - * VectorValues). The parents are assumed to have already been solved in - * and their values are read from \c x. This function works for multiple - * frontal variables. - * - * Given the Gaussian conditional with log likelihood \f$ |R x_f - (d - S x_s)|^2, - * where \f$ f \f$ are the frontal variables and \f$ s \f$ are the separator - * variables of this conditional, this solve function computes - * \f$ x_f = R^{-1} (d - S x_s) \f$ using back-substitution. - * - * @param x VectorValues structure with solved parents \f$ x_s \f$, and into which the - * solution \f$ x_f \f$ will be written. - */ - void solveInPlace(Permuted& x) const; - // functions for transpose backsubstitution /** diff --git a/gtsam/linear/VectorValues.cpp b/gtsam/linear/VectorValues.cpp index 1413d1517..15925c644 100644 --- a/gtsam/linear/VectorValues.cpp +++ b/gtsam/linear/VectorValues.cpp @@ -17,10 +17,12 @@ */ #include +#include #include using namespace std; -using namespace gtsam; + +namespace gtsam { /* ************************************************************************* */ VectorValues::VectorValues(const VectorValues& other) { @@ -166,20 +168,24 @@ void VectorValues::operator+=(const VectorValues& c) { } /* ************************************************************************* */ -VectorValues& VectorValues::operator=(const Permuted& rhs) { - if(this->size() != rhs.size()) - throw std::invalid_argument("VectorValues assignment from Permuted requires pre-allocation, see documentation."); - for(size_t j=0; jsize(); ++j) { - if(exists(j)) { - SubVector& l(this->at(j)); - const SubVector& r(rhs[j]); - if(l.rows() != r.rows()) - throw std::invalid_argument("VectorValues assignment from Permuted requires pre-allocation, see documentation."); - l = r; - } else { - if(rhs.container().exists(rhs.permutation()[j])) - throw std::invalid_argument("VectorValues assignment from Permuted requires pre-allocation, see documentation."); - } - } - return *this; +VectorValues VectorValues::permute(const Permutation& permutation) const { + // Create result and allocate space + VectorValues lhs; + lhs.values_.resize(this->dim()); + lhs.maps_.reserve(this->size()); + + // Copy values from this VectorValues to the permuted VectorValues + size_t lhsPos = 0; + for(size_t i = 0; i < this->size(); ++i) { + // Map the next LHS subvector to the next slice of the LHS vector + lhs.maps_.push_back(SubVector(lhs.values_, lhsPos, this->at(permutation[i]).size())); + // Copy the data from the RHS subvector to the LHS subvector + lhs.maps_[i] = this->at(permutation[i]); + // Increment lhs position + lhsPos += lhs.maps_[i].size(); + } + + return lhs; } + +} \ No newline at end of file diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 04c280577..463080db9 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -19,7 +19,6 @@ #include #include -#include #include #include @@ -29,6 +28,9 @@ namespace gtsam { + // Forward declarations + class Permutation; + /** * This class represents a collection of vector-valued variables associated * each with a unique integer index. It is typically used to store the variables @@ -288,10 +290,11 @@ namespace gtsam { */ void operator+=(const VectorValues& c); - /** Assignment operator from Permuted, requires the dimensions - * of the assignee to already be properly pre-allocated. - */ - VectorValues& operator=(const Permuted& rhs); + /** + * Permute the entries of this VectorValues, returns a new VectorValues as + * the result. + */ + VectorValues permute(const Permutation& permutation) const; /// @} diff --git a/gtsam/linear/tests/testGaussianConditional.cpp b/gtsam/linear/tests/testGaussianConditional.cpp index 93030b598..8b0c5e239 100644 --- a/gtsam/linear/tests/testGaussianConditional.cpp +++ b/gtsam/linear/tests/testGaussianConditional.cpp @@ -267,55 +267,6 @@ TEST( GaussianConditional, solve_multifrontal ) } -/* ************************************************************************* */ -TEST( GaussianConditional, solve_multifrontal_permuted ) -{ - // create full system, 3 variables, 2 frontals, all 2 dim - Matrix full_matrix = Matrix_(4, 7, - 1.0, 0.0, 2.0, 0.0, 3.0, 0.0, 0.1, - 0.0, 1.0, 0.0, 2.0, 0.0, 3.0, 0.2, - 0.0, 0.0, 3.0, 0.0, 4.0, 0.0, 0.3, - 0.0, 0.0, 0.0, 3.0, 0.0, 4.0, 0.4); - - // 3 variables, all dim=2 - vector dims; dims += 2, 2, 2, 1; - GaussianConditional::rsd_type matrices(full_matrix, dims.begin(), dims.end()); - Vector sigmas = ones(4); - vector cgdims; cgdims += _x_, _x1_, _l1_; - GaussianConditional cg(cgdims.begin(), cgdims.end(), 2, matrices, sigmas); - - EXPECT(assert_equal(Vector_(4, 0.1, 0.2, 0.3, 0.4), cg.get_d())); - - // partial solution - Vector sl1 = Vector_(2, 9.0, 10.0); - - // elimination order; _x_, _x1_, _l1_ - VectorValues actualUnpermuted(vector(3, 2)); - Permutation permutation(3); - permutation[0] = 2; - permutation[1] = 0; - permutation[2] = 1; - Permuted actual(permutation, actualUnpermuted); - actual[_x_] = Vector_(2, 0.1, 0.2); // rhs - actual[_x1_] = Vector_(2, 0.3, 0.4); // rhs - actual[_l1_] = sl1; // parent - - VectorValues expectedUnpermuted(vector(3, 2)); - Permuted expected(permutation, expectedUnpermuted); - expected[_x_] = Vector_(2, -3.1,-3.4); - expected[_x1_] = Vector_(2, -11.9,-13.2); - expected[_l1_] = sl1; - - // verify indices/size - EXPECT_LONGS_EQUAL(3, cg.size()); - EXPECT_LONGS_EQUAL(4, cg.dim()); - - // solve and verify - cg.solveInPlace(actual); - EXPECT(assert_equal(expected.container(), actual.container(), tol)); - -} - /* ************************************************************************* */ TEST( GaussianConditional, solveTranspose ) { static const Index _y_=1; diff --git a/gtsam/linear/tests/testVectorValues.cpp b/gtsam/linear/tests/testVectorValues.cpp index a92b81ddc..17230854a 100644 --- a/gtsam/linear/tests/testVectorValues.cpp +++ b/gtsam/linear/tests/testVectorValues.cpp @@ -421,52 +421,31 @@ TEST(VectorValues, hasSameStructure) { EXPECT(!v1.hasSameStructure(VectorValues())); } + /* ************************************************************************* */ -TEST(VectorValues, permuted_combined) { - Vector v1 = Vector_(3, 1.0,2.0,3.0); - Vector v2 = Vector_(2, 4.0,5.0); - Vector v3 = Vector_(4, 6.0,7.0,8.0,9.0); +TEST(VectorValues, permute) { - vector dims(3); dims[0]=3; dims[1]=2; dims[2]=4; - VectorValues combined(dims); - combined[0] = v1; - combined[1] = v2; - combined[2] = v3; + VectorValues original; + original.insert(0, Vector_(1, 1.0)); + original.insert(1, Vector_(2, 2.0, 3.0)); + original.insert(2, Vector_(2, 4.0, 5.0)); + original.insert(3, Vector_(2, 6.0, 7.0)); - Permutation perm1(3); - perm1[0] = 1; - perm1[1] = 2; - perm1[2] = 0; + VectorValues expected; + expected.insert(0, Vector_(2, 4.0, 5.0)); // from 2 + expected.insert(1, Vector_(1, 1.0)); // from 0 + expected.insert(2, Vector_(2, 6.0, 7.0)); // from 3 + expected.insert(3, Vector_(2, 2.0, 3.0)); // from 1 - Permutation perm2(3); - perm2[0] = 1; - perm2[1] = 2; - perm2[2] = 0; + Permutation permutation(4); + permutation[0] = 2; + permutation[1] = 0; + permutation[2] = 3; + permutation[3] = 1; - Permuted permuted1(combined); - CHECK(assert_equal(v1, permuted1[0])) - CHECK(assert_equal(v2, permuted1[1])) - CHECK(assert_equal(v3, permuted1[2])) + VectorValues actual = original.permute(permutation); - permuted1.permute(perm1); - CHECK(assert_equal(v1, permuted1[2])) - CHECK(assert_equal(v2, permuted1[0])) - CHECK(assert_equal(v3, permuted1[1])) - - permuted1.permute(perm2); - CHECK(assert_equal(v1, permuted1[1])) - CHECK(assert_equal(v2, permuted1[2])) - CHECK(assert_equal(v3, permuted1[0])) - - Permuted permuted2(perm1, combined); - CHECK(assert_equal(v1, permuted2[2])) - CHECK(assert_equal(v2, permuted2[0])) - CHECK(assert_equal(v3, permuted2[1])) - - permuted2.permute(perm2); - CHECK(assert_equal(v1, permuted2[1])) - CHECK(assert_equal(v2, permuted2[2])) - CHECK(assert_equal(v3, permuted2[0])) + EXPECT(assert_equal(expected, actual)); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 8b3bd4a0d..d84740516 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -29,8 +29,8 @@ namespace gtsam { /* ************************************************************************* */ void ISAM2::Impl::AddVariables( - const Values& newTheta, Values& theta, Permuted& delta, - Permuted& deltaNewton, Permuted& deltaGradSearch, vector& replacedKeys, + const Values& newTheta, Values& theta, VectorValues& delta, + VectorValues& deltaNewton, VectorValues& deltaGradSearch, vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter) { const bool debug = ISDEBUG("ISAM2 AddVariables"); @@ -40,28 +40,21 @@ void ISAM2::Impl::AddVariables( std::vector dims(newTheta.dims(*newTheta.orderingArbitrary())); if(debug) cout << "New variables have total dimensionality " << accumulate(dims.begin(), dims.end(), 0) << endl; const size_t newDim = accumulate(dims.begin(), dims.end(), 0); - const size_t originalDim = delta->dim(); - const size_t originalnVars = delta->size(); - delta.container().append(dims); - delta.container().vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); - delta.permutation().resize(originalnVars + newTheta.size()); - deltaNewton.container().append(dims); - deltaNewton.container().vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); - deltaNewton.permutation().resize(originalnVars + newTheta.size()); - deltaGradSearch.container().append(dims); - deltaGradSearch.container().vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); - deltaGradSearch.permutation().resize(originalnVars + newTheta.size()); + const size_t originalDim = delta.dim(); + const size_t originalnVars = delta.size(); + delta.append(dims); + delta.vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); + deltaNewton.append(dims); + deltaNewton.vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); + deltaGradSearch.append(dims); + deltaGradSearch.vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); { Index nextVar = originalnVars; BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, newTheta) { - delta.permutation()[nextVar] = nextVar; - deltaNewton.permutation()[nextVar] = nextVar; - deltaGradSearch.permutation()[nextVar] = nextVar; ordering.insert(key_value.key, nextVar); if(debug) cout << "Adding variable " << keyFormatter(key_value.key) << " with order " << nextVar << endl; ++ nextVar; } - assert(delta.permutation().size() == delta.container().size()); assert(ordering.nVars() == delta.size()); assert(ordering.size() == delta.size()); } @@ -82,7 +75,7 @@ FastSet ISAM2::Impl::IndicesFromFactors(const Ordering& ordering, const N } /* ************************************************************************* */ -FastSet ISAM2::Impl::CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, +FastSet ISAM2::Impl::CheckRelinearizationFull(const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { FastSet relinKeys; @@ -110,7 +103,7 @@ FastSet ISAM2::Impl::CheckRelinearizationFull(const Permuted& relinKeys, double threshold, const Permuted& delta, const ISAM2Clique::shared_ptr& clique) { +void CheckRelinearizationRecursiveDouble(FastSet& relinKeys, double threshold, const VectorValues& delta, const ISAM2Clique::shared_ptr& clique) { // Check the current clique for relinearization bool relinearize = false; @@ -131,7 +124,7 @@ void CheckRelinearizationRecursiveDouble(FastSet& relinKeys, double thres } /* ************************************************************************* */ -void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap& thresholds, const Permuted& delta, const Ordering::InvertedMap& decoder, const ISAM2Clique::shared_ptr& clique) { +void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap& thresholds, const VectorValues& delta, const Ordering::InvertedMap& decoder, const ISAM2Clique::shared_ptr& clique) { // Check the current clique for relinearization bool relinearize = false; @@ -163,7 +156,7 @@ void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap ISAM2::Impl::CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, +FastSet ISAM2::Impl::CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { FastSet relinKeys; @@ -201,8 +194,8 @@ void ISAM2::Impl::FindAll(ISAM2Clique::shared_ptr clique, FastSet& keys, } /* ************************************************************************* */ -void ISAM2::Impl::ExpmapMasked(Values& values, const Permuted& delta, const Ordering& ordering, - const vector& mask, boost::optional&> invalidateIfDebug, const KeyFormatter& keyFormatter) { +void ISAM2::Impl::ExpmapMasked(Values& values, const VectorValues& delta, const Ordering& ordering, + const vector& mask, boost::optional invalidateIfDebug, const KeyFormatter& keyFormatter) { // If debugging, invalidate if requested, otherwise do not invalidate. // Invalidating means setting expmapped entries to Inf, to trigger assertions // if we try to re-use them. @@ -304,7 +297,7 @@ ISAM2::Impl::PartialSolve(GaussianFactorGraph& factors, toc(4,"ccolamd permutations"); tic(5,"permute affected variable index"); - affectedFactorsIndex.permute(*affectedColamd); + affectedFactorsIndex.permuteInPlace(*affectedColamd); toc(5,"permute affected variable index"); tic(6,"permute affected factors"); @@ -354,25 +347,13 @@ inline static void optimizeInPlace(const boost::shared_ptr& clique, } /* ************************************************************************* */ -size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, Permuted& delta, double wildfireThreshold) { +size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, VectorValues& delta, double wildfireThreshold) { size_t lastBacksubVariableCount; if (wildfireThreshold <= 0.0) { // Threshold is zero or less, so do a full recalculation - // Collect dimensions and allocate new VectorValues - vector dims(delta.size()); - for(size_t j=0; jdim(j); - VectorValues newDelta(dims); - - // Optimize full solution delta - internal::optimizeInPlace(root, newDelta); - - // Copy solution into delta - delta.permutation() = Permutation::Identity(delta.size()); - delta.container() = newDelta; - + internal::optimizeInPlace(root, delta); lastBacksubVariableCount = delta.size(); } else { @@ -380,8 +361,8 @@ size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std: lastBacksubVariableCount = optimizeWildfire(root, wildfireThreshold, replacedKeys, delta); // modifies delta_ #ifndef NDEBUG - for(size_t j=0; j)).all()); + for(size_t j=0; j)).all()); #endif } @@ -394,7 +375,7 @@ size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std: /* ************************************************************************* */ namespace internal { void updateDoglegDeltas(const boost::shared_ptr& clique, std::vector& replacedKeys, - const VectorValues& grad, Permuted& deltaNewton, Permuted& RgProd, size_t& varsUpdated) { + const VectorValues& grad, VectorValues& deltaNewton, VectorValues& RgProd, size_t& varsUpdated) { // Check if any frontal or separator keys were recalculated, if so, we need // update deltas and recurse to children, but if not, we do not need to @@ -433,7 +414,7 @@ void updateDoglegDeltas(const boost::shared_ptr& clique, std::vecto /* ************************************************************************* */ size_t ISAM2::Impl::UpdateDoglegDeltas(const ISAM2& isam, double wildfireThreshold, std::vector& replacedKeys, - Permuted& deltaNewton, Permuted& RgProd) { + VectorValues& deltaNewton, VectorValues& RgProd) { // Get gradient VectorValues grad = *allocateVectorValues(isam); diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index 0aafb3f35..fdb39d855 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -46,10 +46,10 @@ struct ISAM2::Impl { * @param nodes Current BayesTree::Nodes index to be augmented with slots for new variables * @param keyFormatter Formatter for printing nonlinear keys during debugging */ - static void AddVariables(const Values& newTheta, Values& theta, Permuted& delta, - Permuted& deltaNewton, Permuted& deltaGradSearch, std::vector& replacedKeys, + static void AddVariables(const Values& newTheta, Values& theta, VectorValues& delta, + VectorValues& deltaNewton, VectorValues& deltaGradSearch, std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter = DefaultKeyFormatter); - + /** * Extract the set of variable indices from a NonlinearFactorGraph. For each Symbol * in each NonlinearFactor, obtains the index by calling ordering[symbol]. @@ -68,7 +68,7 @@ struct ISAM2::Impl { * @return The set of variable indices in delta whose magnitude is greater than or * equal to relinearizeThreshold */ - static FastSet CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, + static FastSet CheckRelinearizationFull(const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** @@ -82,7 +82,7 @@ struct ISAM2::Impl { * @return The set of variable indices in delta whose magnitude is greater than or * equal to relinearizeThreshold */ - static FastSet CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, + static FastSet CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** @@ -115,9 +115,9 @@ struct ISAM2::Impl { * recalculate its delta. * @param keyFormatter Formatter for printing nonlinear keys during debugging */ - static void ExpmapMasked(Values& values, const Permuted& delta, + static void ExpmapMasked(Values& values, const VectorValues& delta, const Ordering& ordering, const std::vector& mask, - boost::optional&> invalidateIfDebug = boost::optional&>(), + boost::optional invalidateIfDebug = boost::none, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** @@ -137,10 +137,10 @@ struct ISAM2::Impl { static PartialSolveResult PartialSolve(GaussianFactorGraph& factors, const FastSet& keys, const ReorderingMode& reorderingMode, bool useQR); - static size_t UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, Permuted& delta, double wildfireThreshold); + static size_t UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, VectorValues& delta, double wildfireThreshold); static size_t UpdateDoglegDeltas(const ISAM2& isam, double wildfireThreshold, std::vector& replacedKeys, - Permuted& deltaNewton, Permuted& RgProd); + VectorValues& deltaNewton, VectorValues& RgProd); }; diff --git a/gtsam/nonlinear/ISAM2-inl.h b/gtsam/nonlinear/ISAM2-inl.h index 3520ffb84..ba0071b51 100644 --- a/gtsam/nonlinear/ISAM2-inl.h +++ b/gtsam/nonlinear/ISAM2-inl.h @@ -37,7 +37,7 @@ VALUE ISAM2::calculateEstimate(Key key) const { namespace internal { template void optimizeWildfire(const boost::shared_ptr& clique, double threshold, - std::vector& changed, const std::vector& replaced, Permuted& delta, int& count) { + std::vector& changed, const std::vector& replaced, VectorValues& delta, int& count) { // if none of the variables in this clique (frontal and separator!) changed // significantly, then by the running intersection property, none of the // cliques in the children need to be processed @@ -114,7 +114,7 @@ void optimizeWildfire(const boost::shared_ptr& clique, double threshold, /* ************************************************************************* */ template -int optimizeWildfire(const boost::shared_ptr& root, double threshold, const std::vector& keys, Permuted& delta) { +int optimizeWildfire(const boost::shared_ptr& root, double threshold, const std::vector& keys, VectorValues& delta) { std::vector changed(keys.size(), false); int count = 0; // starting from the root, call optimize on each conditional diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 07e0f518d..0c3c198aa 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -41,7 +41,6 @@ static const double batchThreshold = 0.65; /* ************************************************************************* */ ISAM2::ISAM2(const ISAM2Params& params): - delta_(deltaUnpermuted_), deltaNewton_(deltaNewtonUnpermuted_), RgProd_(RgProdUnpermuted_), deltaDoglegUptodate_(true), deltaUptodate_(true), params_(params) { if(params_.optimizationParams.type() == typeid(ISAM2DoglegParams)) doglegDelta_ = boost::get(params_.optimizationParams).initialDelta; @@ -49,15 +48,13 @@ ISAM2::ISAM2(const ISAM2Params& params): /* ************************************************************************* */ ISAM2::ISAM2(): - delta_(deltaUnpermuted_), deltaNewton_(deltaNewtonUnpermuted_), RgProd_(RgProdUnpermuted_), deltaDoglegUptodate_(true), deltaUptodate_(true) { if(params_.optimizationParams.type() == typeid(ISAM2DoglegParams)) doglegDelta_ = boost::get(params_.optimizationParams).initialDelta; } /* ************************************************************************* */ -ISAM2::ISAM2(const ISAM2& other): - delta_(deltaUnpermuted_), deltaNewton_(deltaNewtonUnpermuted_), RgProd_(RgProdUnpermuted_) { +ISAM2::ISAM2(const ISAM2& other) { *this = other; } @@ -308,12 +305,12 @@ boost::shared_ptr > ISAM2::recalculate( // Reorder tic(2,"permute global variable index"); - variableIndex_.permute(*colamd); + variableIndex_.permuteInPlace(*colamd); toc(2,"permute global variable index"); tic(3,"permute delta"); - delta_.permute(*colamd); - deltaNewton_.permute(*colamd); - RgProd_.permute(*colamd); + delta_ = delta_.permute(*colamd); + deltaNewton_ = deltaNewton_.permute(*colamd); + RgProd_ = RgProd_.permute(*colamd); toc(3,"permute delta"); tic(4,"permute ordering"); ordering_.permuteWithInverse(*colamdInverse); @@ -429,12 +426,12 @@ boost::shared_ptr > ISAM2::recalculate( // re-eliminate. The reordered variables are also mentioned in the // orphans and the leftover cached factors. tic(3,"permute global variable index"); - variableIndex_.permute(partialSolveResult.fullReordering); + variableIndex_.permuteInPlace(partialSolveResult.fullReordering); toc(3,"permute global variable index"); tic(4,"permute delta"); - delta_.permute(partialSolveResult.fullReordering); - deltaNewton_.permute(partialSolveResult.fullReordering); - RgProd_.permute(partialSolveResult.fullReordering); + delta_ = delta_.permute(partialSolveResult.fullReordering); + deltaNewton_ = deltaNewton_.permute(partialSolveResult.fullReordering); + RgProd_ = RgProd_.permute(partialSolveResult.fullReordering); toc(4,"permute delta"); tic(5,"permute ordering"); ordering_.permuteWithInverse(partialSolveResult.fullReorderingInverse); @@ -723,8 +720,7 @@ void ISAM2::updateDelta(bool forceFullSolve) const { tic(2, "Copy dx_d"); // Update Delta and linear step doglegDelta_ = doglegResult.Delta; - delta_.permutation() = Permutation::Identity(delta_.size()); // Dogleg solves for the full delta so there is no permutation - delta_.container() = doglegResult.dx_d; // Copy the VectorValues containing with the linear solution + delta_ = doglegResult.dx_d; // Copy the VectorValues containing with the linear solution toc(2, "Copy dx_d"); } @@ -739,7 +735,7 @@ Values ISAM2::calculateEstimate() const { Values ret(theta_); toc(1, "Copy Values"); tic(2, "getDelta"); - const Permuted& delta(getDelta()); + const VectorValues& delta(getDelta()); toc(2, "getDelta"); tic(3, "Expmap"); vector mask(ordering_.nVars(), true); @@ -756,7 +752,7 @@ Values ISAM2::calculateBestEstimate() const { } /* ************************************************************************* */ -const Permuted& ISAM2::getDelta() const { +const VectorValues& ISAM2::getDelta() const { if(!deltaUptodate_) updateDelta(); return delta_; @@ -829,7 +825,7 @@ void optimizeGradientSearchInPlace(const ISAM2& isam, VectorValues& grad) { tic(3, "Compute minimizing step size"); // Compute minimizing step size - double RgNormSq = isam.RgProd_.container().vector().squaredNorm(); + double RgNormSq = isam.RgProd_.vector().squaredNorm(); double step = -gradientSqNorm / RgNormSq; toc(3, "Compute minimizing step size"); diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 5804640df..9891d8efb 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -347,26 +347,16 @@ protected: /** VariableIndex lets us look up factors by involved variable and keeps track of dimensions */ VariableIndex variableIndex_; - /** The linear delta from the last linear solution, an update to the estimate in theta */ - VectorValues deltaUnpermuted_; + /** The linear delta from the last linear solution, an update to the estimate in theta + * + * This is \c mutable because it is a "cached" variable - it is not updated + * until either requested with getDelta() or calculateEstimate(), or needed + * during update() to evaluate whether to relinearize variables. + */ + mutable VectorValues delta_; - /** The permutation through which the deltaUnpermuted_ is - * referenced. - * - * Permuting Vector entries would be slow, so for performance we - * instead maintain this permutation through which we access the linear delta - * indirectly - * - * This is \c mutable because it is a "cached" variable - it is not updated - * until either requested with getDelta() or calculateEstimate(), or needed - * during update() to evaluate whether to relinearize variables. - */ - mutable Permuted delta_; - - VectorValues deltaNewtonUnpermuted_; - mutable Permuted deltaNewton_; - VectorValues RgProdUnpermuted_; - mutable Permuted RgProd_; + mutable VectorValues deltaNewton_; + mutable VectorValues RgProd_; mutable bool deltaDoglegUptodate_; /** Indicates whether the current delta is up-to-date, only used @@ -497,7 +487,7 @@ public: Values calculateBestEstimate() const; /** Access the current delta, computed during the last call to update */ - const Permuted& getDelta() const; + const VectorValues& getDelta() const; /** Access the set of nonlinear factors */ const NonlinearFactorGraph& getFactorsUnsafe() const { return nonlinearFactors_; } @@ -555,7 +545,7 @@ void optimizeInPlace(const ISAM2& isam, VectorValues& delta); /// @return The number of variables that were solved for template int optimizeWildfire(const boost::shared_ptr& root, - double threshold, const std::vector& replaced, Permuted& delta); + double threshold, const std::vector& replaced, VectorValues& delta); /** * Optimize along the gradient direction, with a closed-form computation to diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 2a5bf7962..994077777 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -139,112 +139,69 @@ TEST_UNSAFE(ISAM2, AddVariables) { // Create initial state Values theta; - theta.insert((0), Pose2(.1, .2, .3)); + theta.insert(0, Pose2(.1, .2, .3)); theta.insert(100, Point2(.4, .5)); Values newTheta; - newTheta.insert((1), Pose2(.6, .7, .8)); + newTheta.insert(1, Pose2(.6, .7, .8)); - VectorValues deltaUnpermuted; - deltaUnpermuted.insert(0, Vector_(3, .1, .2, .3)); - deltaUnpermuted.insert(1, Vector_(2, .4, .5)); + VectorValues delta; + delta.insert(0, Vector_(3, .1, .2, .3)); + delta.insert(1, Vector_(2, .4, .5)); - Permutation permutation(2); - permutation[0] = 1; - permutation[1] = 0; + VectorValues deltaNewton; + deltaNewton.insert(0, Vector_(3, .1, .2, .3)); + deltaNewton.insert(1, Vector_(2, .4, .5)); - Permuted delta(permutation, deltaUnpermuted); - - VectorValues deltaNewtonUnpermuted; - deltaNewtonUnpermuted.insert(0, Vector_(3, .1, .2, .3)); - deltaNewtonUnpermuted.insert(1, Vector_(2, .4, .5)); - - Permutation permutationNewton(2); - permutationNewton[0] = 1; - permutationNewton[1] = 0; - - Permuted deltaNewton(permutationNewton, deltaNewtonUnpermuted); - - VectorValues deltaRgUnpermuted; - deltaRgUnpermuted.insert(0, Vector_(3, .1, .2, .3)); - deltaRgUnpermuted.insert(1, Vector_(2, .4, .5)); - - Permutation permutationRg(2); - permutationRg[0] = 1; - permutationRg[1] = 0; - - Permuted deltaRg(permutationRg, deltaRgUnpermuted); + VectorValues deltaRg; + deltaRg.insert(0, Vector_(3, .1, .2, .3)); + deltaRg.insert(1, Vector_(2, .4, .5)); vector replacedKeys(2, false); - Ordering ordering; ordering += 100, (0); + Ordering ordering; ordering += 100, 0; ISAM2::Nodes nodes(2); // Verify initial state LONGS_EQUAL(0, ordering[100]); - LONGS_EQUAL(1, ordering[(0)]); - EXPECT(assert_equal(deltaUnpermuted[1], delta[ordering[100]])); - EXPECT(assert_equal(deltaUnpermuted[0], delta[ordering[(0)]])); + LONGS_EQUAL(1, ordering[0]); + EXPECT(assert_equal(delta[0], delta[ordering[100]])); + EXPECT(assert_equal(delta[1], delta[ordering[0]])); // Create expected state Values thetaExpected; - thetaExpected.insert((0), Pose2(.1, .2, .3)); + thetaExpected.insert(0, Pose2(.1, .2, .3)); thetaExpected.insert(100, Point2(.4, .5)); - thetaExpected.insert((1), Pose2(.6, .7, .8)); + thetaExpected.insert(1, Pose2(.6, .7, .8)); - VectorValues deltaUnpermutedExpected; - deltaUnpermutedExpected.insert(0, Vector_(3, .1, .2, .3)); - deltaUnpermutedExpected.insert(1, Vector_(2, .4, .5)); - deltaUnpermutedExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); + VectorValues deltaExpected; + deltaExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaExpected.insert(1, Vector_(2, .4, .5)); + deltaExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - Permutation permutationExpected(3); - permutationExpected[0] = 1; - permutationExpected[1] = 0; - permutationExpected[2] = 2; + VectorValues deltaNewtonExpected; + deltaNewtonExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaNewtonExpected.insert(1, Vector_(2, .4, .5)); + deltaNewtonExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - Permuted deltaExpected(permutationExpected, deltaUnpermutedExpected); - - VectorValues deltaNewtonUnpermutedExpected; - deltaNewtonUnpermutedExpected.insert(0, Vector_(3, .1, .2, .3)); - deltaNewtonUnpermutedExpected.insert(1, Vector_(2, .4, .5)); - deltaNewtonUnpermutedExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - - Permutation permutationNewtonExpected(3); - permutationNewtonExpected[0] = 1; - permutationNewtonExpected[1] = 0; - permutationNewtonExpected[2] = 2; - - Permuted deltaNewtonExpected(permutationNewtonExpected, deltaNewtonUnpermutedExpected); - - VectorValues deltaRgUnpermutedExpected; - deltaRgUnpermutedExpected.insert(0, Vector_(3, .1, .2, .3)); - deltaRgUnpermutedExpected.insert(1, Vector_(2, .4, .5)); - deltaRgUnpermutedExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - - Permutation permutationRgExpected(3); - permutationRgExpected[0] = 1; - permutationRgExpected[1] = 0; - permutationRgExpected[2] = 2; - - Permuted deltaRgExpected(permutationRgExpected, deltaRgUnpermutedExpected); + VectorValues deltaRgExpected; + deltaRgExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaRgExpected.insert(1, Vector_(2, .4, .5)); + deltaRgExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); vector replacedKeysExpected(3, false); - Ordering orderingExpected; orderingExpected += 100, (0), (1); + Ordering orderingExpected; orderingExpected += 100, 0, 1; - ISAM2::Nodes nodesExpected( - 3, ISAM2::sharedClique()); + ISAM2::Nodes nodesExpected(3, ISAM2::sharedClique()); // Expand initial state ISAM2::Impl::AddVariables(newTheta, theta, delta, deltaNewton, deltaRg, replacedKeys, ordering, nodes); EXPECT(assert_equal(thetaExpected, theta)); - EXPECT(assert_equal(deltaUnpermutedExpected, deltaUnpermuted)); - EXPECT(assert_equal(deltaExpected.permutation(), delta.permutation())); - EXPECT(assert_equal(deltaNewtonUnpermutedExpected, deltaNewtonUnpermuted)); - EXPECT(assert_equal(deltaNewtonExpected.permutation(), deltaNewton.permutation())); - EXPECT(assert_equal(deltaRgUnpermutedExpected, deltaRgUnpermuted)); - EXPECT(assert_equal(deltaRgExpected.permutation(), deltaRg.permutation())); + EXPECT(assert_equal(deltaExpected, delta)); + EXPECT(assert_equal(deltaNewtonExpected, deltaNewton)); + EXPECT(assert_equal(deltaRgExpected, deltaRg)); EXPECT(assert_container_equality(replacedKeysExpected, replacedKeys)); EXPECT(assert_equal(orderingExpected, ordering)); } From 61cc8026b9325d266ff3a71af16e18c827f105aa Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 01:45:29 +0000 Subject: [PATCH 507/914] Small change - vector instead of FastVector --- gtsam/nonlinear/ISAM2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 9891d8efb..2fd3e0b23 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -206,7 +206,7 @@ struct ISAM2Result { * factors passed as \c newFactors to ISAM2::update(). These indices may be * used later to refer to the factors in order to remove them. */ - FastVector newFactorsIndices; + std::vector newFactorsIndices; /** A struct holding detailed results, which must be enabled with * ISAM2Params::enableDetailedResults. From badb22c304efe655639335dd21b9896a4b69f740 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 30 Jun 2012 07:08:29 +0000 Subject: [PATCH 508/914] Got rid of unused warning --- gtsam/inference/VariableIndex.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam/inference/VariableIndex.h b/gtsam/inference/VariableIndex.h index f497b4706..be47cbd5a 100644 --- a/gtsam/inference/VariableIndex.h +++ b/gtsam/inference/VariableIndex.h @@ -216,7 +216,6 @@ void VariableIndex::augment(const FactorGraph& factors) { } // Allocate index - Index originalSize = index_.size(); index_.resize(std::max(index_.size(), maxVar+1)); // Augment index mapping from variable id to factor index From 133fc4ae5cbae705ccfa785287e95df35034b187 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 30 Jun 2012 08:34:44 +0000 Subject: [PATCH 509/914] got rid of pause --- matlab/examples/OdometryExample.m | 1 - 1 file changed, 1 deletion(-) diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index 8b2439c78..b3cbff6a2 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -29,7 +29,6 @@ odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); -pause %% print graph.print(sprintf('\nFactor graph:\n')); From 8851179d3c23725d07fa673bfb22100da7b79bc0 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 30 Jun 2012 10:30:06 +0000 Subject: [PATCH 510/914] Formatter in discrete, as well --- gtsam/discrete/DecisionTreeFactor.cpp | 7 ++++--- gtsam/discrete/DecisionTreeFactor.h | 3 ++- gtsam/discrete/Potentials.cpp | 5 +++-- gtsam/discrete/Potentials.h | 3 ++- gtsam_unstable/discrete/AllDiff.cpp | 5 +++-- gtsam_unstable/discrete/AllDiff.h | 3 ++- gtsam_unstable/discrete/BinaryAllDiff.h | 7 ++++--- gtsam_unstable/discrete/Domain.cpp | 7 ++++--- gtsam_unstable/discrete/Domain.h | 3 ++- gtsam_unstable/discrete/SingleValue.cpp | 5 +++-- gtsam_unstable/discrete/SingleValue.h | 3 ++- 11 files changed, 31 insertions(+), 20 deletions(-) diff --git a/gtsam/discrete/DecisionTreeFactor.cpp b/gtsam/discrete/DecisionTreeFactor.cpp index 7f566a115..bb83cec16 100644 --- a/gtsam/discrete/DecisionTreeFactor.cpp +++ b/gtsam/discrete/DecisionTreeFactor.cpp @@ -49,10 +49,11 @@ namespace gtsam { } /* ************************************************************************* */ - void DecisionTreeFactor::print(const string& s) const { + void DecisionTreeFactor::print(const string& s, + const IndexFormatter& formatter) const { cout << s; - IndexFactor::print("IndexFactor:"); - Potentials::print("Potentials:"); + IndexFactor::print("IndexFactor:",formatter); + Potentials::print("Potentials:",formatter); } /* ************************************************************************* */ diff --git a/gtsam/discrete/DecisionTreeFactor.h b/gtsam/discrete/DecisionTreeFactor.h index 89bc090dc..64f37c174 100644 --- a/gtsam/discrete/DecisionTreeFactor.h +++ b/gtsam/discrete/DecisionTreeFactor.h @@ -72,7 +72,8 @@ namespace gtsam { bool equals(const DecisionTreeFactor& other, double tol = 1e-9) const; // print - void print(const std::string& s = "DecisionTreeFactor:\n") const; + virtual void print(const std::string& s = "DecisionTreeFactor:\n", + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// @} /// @name Standard Interface diff --git a/gtsam/discrete/Potentials.cpp b/gtsam/discrete/Potentials.cpp index b9a87dea9..2a2260d97 100644 --- a/gtsam/discrete/Potentials.cpp +++ b/gtsam/discrete/Potentials.cpp @@ -51,10 +51,11 @@ namespace gtsam { } /* ************************************************************************* */ - void Potentials::print(const string&s) const { + void Potentials::print(const string& s, + const IndexFormatter& formatter) const { cout << s << "\n Cardinalities: "; BOOST_FOREACH(const DiscreteKey& key, cardinalities_) - cout << key.first << "=" << key.second << " "; + cout << formatter(key.first) << "=" << formatter(key.second) << " "; cout << endl; ADT::print(" "); } diff --git a/gtsam/discrete/Potentials.h b/gtsam/discrete/Potentials.h index 367a323c2..3ca222b5f 100644 --- a/gtsam/discrete/Potentials.h +++ b/gtsam/discrete/Potentials.h @@ -65,7 +65,8 @@ namespace gtsam { // Testable bool equals(const Potentials& other, double tol = 1e-9) const; - void print(const std::string& s = "Potentials: ") const; + void print(const std::string& s = "Potentials: ", + const IndexFormatter& formatter = DefaultIndexFormatter) const; size_t cardinality(Index j) const { return cardinalities_.at(j);} diff --git a/gtsam_unstable/discrete/AllDiff.cpp b/gtsam_unstable/discrete/AllDiff.cpp index 41905f874..ac412fa7f 100644 --- a/gtsam_unstable/discrete/AllDiff.cpp +++ b/gtsam_unstable/discrete/AllDiff.cpp @@ -20,10 +20,11 @@ namespace gtsam { } /* ************************************************************************* */ - void AllDiff::print(const std::string& s) const { + void AllDiff::print(const std::string& s, + const IndexFormatter& formatter) const { std::cout << s << "AllDiff on "; BOOST_FOREACH (Index dkey, keys_) - std::cout << dkey << " "; + std::cout << formatter(dkey) << " "; std::cout << std::endl; } diff --git a/gtsam_unstable/discrete/AllDiff.h b/gtsam_unstable/discrete/AllDiff.h index fb5a47a59..1a560ace2 100644 --- a/gtsam_unstable/discrete/AllDiff.h +++ b/gtsam_unstable/discrete/AllDiff.h @@ -34,7 +34,8 @@ namespace gtsam { AllDiff(const DiscreteKeys& dkeys); // print - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// Calculate value = expensive ! virtual double operator()(const Values& values) const; diff --git a/gtsam_unstable/discrete/BinaryAllDiff.h b/gtsam_unstable/discrete/BinaryAllDiff.h index a2e260bcd..9ed2f79f1 100644 --- a/gtsam_unstable/discrete/BinaryAllDiff.h +++ b/gtsam_unstable/discrete/BinaryAllDiff.h @@ -33,9 +33,10 @@ namespace gtsam { } // print - virtual void print(const std::string& s = "") const { - std::cout << s << "BinaryAllDiff on " << keys_[0] << " and " << keys_[1] - << std::endl; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const { + std::cout << s << "BinaryAllDiff on " << formatter(keys_[0]) << " and " + << formatter(keys_[1]) << std::endl; } /// Calculate value diff --git a/gtsam_unstable/discrete/Domain.cpp b/gtsam_unstable/discrete/Domain.cpp index e43065f3b..dbc05e3f6 100644 --- a/gtsam_unstable/discrete/Domain.cpp +++ b/gtsam_unstable/discrete/Domain.cpp @@ -15,9 +15,10 @@ namespace gtsam { using namespace std; /* ************************************************************************* */ - void Domain::print(const string& s) const { -// cout << s << ": Domain on " << keys_[0] << " (j=" << keys_[0] -// << ") with values"; + void Domain::print(const string& s, + const IndexFormatter& formatter) const { +// cout << s << ": Domain on " << formatter(keys_[0]) << " (j=" << +// formatter(keys_[0]) << ") with values"; // BOOST_FOREACH (size_t v,values_) cout << " " << v; // cout << endl; BOOST_FOREACH (size_t v,values_) cout << v; diff --git a/gtsam_unstable/discrete/Domain.h b/gtsam_unstable/discrete/Domain.h index a4f0c8054..85b35fe8c 100644 --- a/gtsam_unstable/discrete/Domain.h +++ b/gtsam_unstable/discrete/Domain.h @@ -66,7 +66,8 @@ namespace gtsam { } // print - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const; bool contains(size_t value) const { return values_.count(value)>0; diff --git a/gtsam_unstable/discrete/SingleValue.cpp b/gtsam_unstable/discrete/SingleValue.cpp index 6f6d5a3ff..81133e7f7 100644 --- a/gtsam_unstable/discrete/SingleValue.cpp +++ b/gtsam_unstable/discrete/SingleValue.cpp @@ -16,8 +16,9 @@ namespace gtsam { using namespace std; /* ************************************************************************* */ - void SingleValue::print(const string& s) const { - cout << s << "SingleValue on " << "j=" << keys_[0] + void SingleValue::print(const string& s, + const IndexFormatter& formatter) const { + cout << s << "SingleValue on " << "j=" << formatter(keys_[0]) << " with value " << value_ << endl; } diff --git a/gtsam_unstable/discrete/SingleValue.h b/gtsam_unstable/discrete/SingleValue.h index b229d8b79..1f6e362aa 100644 --- a/gtsam_unstable/discrete/SingleValue.h +++ b/gtsam_unstable/discrete/SingleValue.h @@ -42,7 +42,8 @@ namespace gtsam { } // print - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// Calculate value virtual double operator()(const Values& values) const; From 9f99f0f7c5ba5292bf43babc0c7a12b6ee4c2234 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 12:48:43 +0000 Subject: [PATCH 511/914] Removed remaining Permuted (in release mode) --- gtsam/nonlinear/ISAM2-impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index d84740516..3c373e0ba 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -200,7 +200,7 @@ void ISAM2::Impl::ExpmapMasked(Values& values, const VectorValues& delta, const // Invalidating means setting expmapped entries to Inf, to trigger assertions // if we try to re-use them. #ifdef NDEBUG - invalidateIfDebug = boost::optional&>(); + invalidateIfDebug = boost::none; #endif assert(values.size() == ordering.nVars()); From d58d2771601b3b73633683d69fc7d88b015cbc84 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 30 Jun 2012 14:30:24 +0000 Subject: [PATCH 512/914] Recover camera from 3*4 camera matrix --- .cproject | 332 ++++++++++++---------- gtsam/geometry/SimpleCamera.cpp | 49 ++++ gtsam/geometry/SimpleCamera.h | 5 + gtsam/geometry/tests/testSimpleCamera.cpp | 20 ++ 4 files changed, 249 insertions(+), 157 deletions(-) create mode 100644 gtsam/geometry/SimpleCamera.cpp diff --git a/.cproject b/.cproject index c593a801b..11d2ab33e 100644 --- a/.cproject +++ b/.cproject @@ -307,14 +307,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -341,6 +333,7 @@ make + tests/testBayesTree.run true false @@ -348,6 +341,7 @@ make + testBinaryBayesNet.run true false @@ -395,6 +389,7 @@ make + testSymbolicBayesNet.run true false @@ -402,6 +397,7 @@ make + tests/testSymbolicFactor.run true false @@ -409,6 +405,7 @@ make + testSymbolicFactorGraph.run true false @@ -424,11 +421,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -517,22 +523,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -549,6 +539,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -573,26 +579,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -677,26 +683,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -951,6 +957,7 @@ make + testGraph.run true false @@ -958,6 +965,7 @@ make + testJunctionTree.run true false @@ -965,6 +973,7 @@ make + testSymbolicBayesNetB.run true false @@ -1092,6 +1101,7 @@ make + testErrors.run true false @@ -1465,6 +1475,14 @@ true true + + make + -j5 + testSimpleCamera.run + true + true + true + make -j2 @@ -1547,7 +1565,6 @@ make - testSimulated2DOriented.run true false @@ -1587,7 +1604,6 @@ make - testSimulated2D.run true false @@ -1595,7 +1611,6 @@ make - testSimulated3D.run true false @@ -1811,7 +1826,6 @@ make - tests/testGaussianISAM2 true false @@ -1833,102 +1847,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -2130,6 +2048,7 @@ cpack + -G DEB true false @@ -2137,6 +2056,7 @@ cpack + -G RPM true false @@ -2144,6 +2064,7 @@ cpack + -G TGZ true false @@ -2151,6 +2072,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2244,42 +2166,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap_gtsam + -j2 + timeRot3.run true true true - + make - -j5 - wrap + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2323,6 +2301,46 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap_gtsam + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam/geometry/SimpleCamera.cpp b/gtsam/geometry/SimpleCamera.cpp new file mode 100644 index 000000000..d441716cb --- /dev/null +++ b/gtsam/geometry/SimpleCamera.cpp @@ -0,0 +1,49 @@ +/* ---------------------------------------------------------------------------- + + * 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 SimpleCamera.cpp + * @brief A simple camera class with a Cal3_S2 calibration + * @date June 30, 2012 + * @author Frank Dellaert + */ + +#include +#include + +namespace gtsam { + + SimpleCamera simpleCamera(const Matrix& P) { + + // P = [A|a] = s K cRw [I|-T], with s the unknown scale + Matrix A = P.topLeftCorner(3, 3); + Vector a = P.col(3); + + // do RQ decomposition to get s*K and cRw angles + Matrix sK; + Vector xyz; + boost::tie(sK, xyz) = RQ(A); + + // Recover scale factor s and K + double s = sK(2, 2); + Matrix K = sK / s; + + // Recover cRw itself, and its inverse + Rot3 cRw = Rot3::RzRyRx(xyz); + Rot3 wRc = cRw.inverse(); + + // Now, recover T from a = - s K cRw T = - A T + Vector T = -(A.inverse() * a); + return SimpleCamera(Pose3(wRc, T), + Cal3_S2(K(0, 0), K(1, 1), K(0, 1), K(0, 2), K(1, 2))); + } + +} diff --git a/gtsam/geometry/SimpleCamera.h b/gtsam/geometry/SimpleCamera.h index d3b0cdbdc..abe42f1a0 100644 --- a/gtsam/geometry/SimpleCamera.h +++ b/gtsam/geometry/SimpleCamera.h @@ -22,5 +22,10 @@ #include namespace gtsam { + + /// A simple camera class with a Cal3_S2 calibration typedef PinholeCamera SimpleCamera; + + /// Recover camera from 3*4 camera matrix + SimpleCamera simpleCamera(const Matrix& P); } diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index 6cc00de8a..a1647fa47 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -133,6 +133,26 @@ TEST( SimpleCamera, Dproject_point_pose) CHECK(assert_equal(Dpoint, numerical_point,1e-7)); } +/* ************************************************************************* */ +TEST( SimpleCamera, simpleCamera) +{ + Cal3_S2 K(468.2,427.2,91.2,300,200); + Rot3 R( + 0.41380,0.90915,0.04708, + -0.57338,0.22011,0.78917, + 0.70711,-0.35355,0.61237); + Point3 T(1000,2000,1500); + SimpleCamera expected(Pose3(R.inverse(),T),K); + // H&Z example, 2nd edition, page 163 + Matrix P = Matrix_(3,4, + 3.53553e2, 3.39645e2, 2.77744e2, -1.44946e6, + -1.03528e2, 2.33212e1, 4.59607e2, -6.32525e5, + 7.07107e-1, -3.53553e-1,6.12372e-1, -9.18559e2); + SimpleCamera actual = simpleCamera(P); + // Note precision of numbers given in book + CHECK(assert_equal(expected, actual,1e-1)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From 32ad753a3868a3cf011d8e16e40d677cb37ef84d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 17:36:25 +0000 Subject: [PATCH 513/914] Fixed renamed function in gtsam.h --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 68ed6201d..6858e4d65 100644 --- a/gtsam.h +++ b/gtsam.h @@ -671,7 +671,7 @@ class VariableIndex { size_t size() const; size_t nFactors() const; size_t nEntries() const; - void permute(const gtsam::Permutation& permutation); + void permuteInPlace(const gtsam::Permutation& permutation); }; //************************************************************************* From 8741f4eb64f23d831aca75d252d00a948d79a3f8 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 19:17:43 +0000 Subject: [PATCH 514/914] Created branch /branches/isam2-remove-vars from /trunk:11798 From abd6795f5be969a811c2d3c81981390eb6a4d880 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 19:17:54 +0000 Subject: [PATCH 515/914] In progress removing variables from iSAM2 --- gtsam/nonlinear/ISAM2-impl.cpp | 59 +++++++++ gtsam/nonlinear/ISAM2-impl.h | 7 ++ tests/testGaussianISAM2.cpp | 216 +++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+) diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 3c373e0ba..20aacb1e4 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -63,6 +63,65 @@ void ISAM2::Impl::AddVariables( nodes.resize(ordering.nVars()); } +/* ************************************************************************* */ +void ISAM2::Impl::RemoveVariables(const FastSet& unusedKeys, Values& theta, VariableIndex& variableIndex, + VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, + std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes) { + + // Get indices of unused keys + vector unusedIndices; unusedIndices.reserve(unusedKeys.size()); + BOOST_FOREACH(Key key, unusedKeys) { unusedIndices.push_back(ordering[key]); } + + // Create a permutation that shifts the unused variables to the end + Permutation unusedToEnd = Permutation::PushToBack(unusedIndices, delta.size()); + Permutation unusedToEndInverse = *unusedToEnd.inverse(); + + // Use the permutation to remove unused variables while shifting all the others to take up the space + variableIndex.permuteInPlace(unusedToEnd); + variableIndex.removeUnusedAtEnd(unusedIndices.size()); + { + // Create a vector of variable dimensions with the unused ones removed + // by applying the unusedToEnd permutation to the original vector of + // variable dimensions. We only allocate space in the shifted dims + // vector for the used variables, so that the unused ones are dropped + // when the permutation is applied. + vector originalDims = delta.dims(); + vector dims(delta.size() - unusedIndices.size()); + unusedToEnd.applyToCollection(dims, originalDims); + + // Copy from the old data structures to new ones, only iterating up to + // the number of used variables, and applying the unusedToEnd permutation + // in order to remove the unused variables. + VectorValues newDelta(dims); + VectorValues newDeltaNewton(dims); + VectorValues newDeltaGradSearch(dims); + std::vector newReplacedKeys(replacedKeys.size() - unusedIndices.size()); + Base::Nodes newNodes(nodes.size() - unusedIndices.size()); + + for(size_t j = 0; j < newNodes.size(); ++j) { + newDelta[j] = delta[unusedToEnd[j]]; + newDeltaNewton[j] = deltaNewton[unusedToEnd[j]]; + newDeltaGradSearch[j] = deltaGradSearch[unusedToEnd[j]]; + newReplacedKeys[j] = replacedKeys[unusedToEnd[j]]; + newNodes[j] = nodes[unusedToEnd[j]]; + } + + // Swap the new data structures with the outputs of this function + delta.swap(newDelta); + deltaNewton.swap(newDeltaNewton); + deltaGradSearch.swap(newDeltaGradSearch); + replacedKeys.swap(newReplacedKeys); + nodes.swap(newNodes); + } + + // Reorder and remove from ordering and solution + ordering.permuteWithInverse(unusedToEndInverse); + BOOST_REVERSE_FOREACH(Key key, unusedKeys) { + ordering.pop_back(key); + theta.erase(key); + } +} + /* ************************************************************************* */ FastSet ISAM2::Impl::IndicesFromFactors(const Ordering& ordering, const NonlinearFactorGraph& factors) { FastSet indices; diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index fdb39d855..69caf7329 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -50,6 +50,13 @@ struct ISAM2::Impl { VectorValues& deltaNewton, VectorValues& deltaGradSearch, std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter = DefaultKeyFormatter); + /** + * Remove variables from the ISAM2 system. + */ + static void RemoveVariables(const FastSet& unusedKeys, Values& theta, VariableIndex& variableIndex, + VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, + std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes); + /** * Extract the set of variable indices from a NonlinearFactorGraph. For each Symbol * in each NonlinearFactor, obtains the index by calling ordering[symbol]. diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 994077777..7d7db2cfd 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -205,6 +206,93 @@ TEST_UNSAFE(ISAM2, AddVariables) { EXPECT(assert_container_equality(replacedKeysExpected, replacedKeys)); EXPECT(assert_equal(orderingExpected, ordering)); } +/* ************************************************************************* */ +TEST_UNSAFE(ISAM2, RemoveVariables) { + + // Create initial state + Values theta; + theta.insert(0, Pose2(.1, .2, .3)); + theta.insert(1, Pose2(.6, .7, .8)); + theta.insert(100, Point2(.4, .5)); + + SymbolicFactorGraph sfg; + sfg.push_back(boost::make_shared(Index(0), Index(2))); + sfg.push_back(boost::make_shared(Index(0), Index(1))); + VariableIndex variableIndex(sfg); + + VectorValues delta; + delta.insert(0, Vector_(3, .1, .2, .3)); + delta.insert(1, Vector_(3, .4, .5, .6)); + delta.insert(2, Vector_(2, .7, .8)); + + VectorValues deltaNewton; + deltaNewton.insert(0, Vector_(3, .1, .2, .3)); + deltaNewton.insert(1, Vector_(3, .4, .5, .6)); + deltaNewton.insert(2, Vector_(2, .7, .8)); + + VectorValues deltaRg; + deltaRg.insert(0, Vector_(3, .1, .2, .3)); + deltaRg.insert(1, Vector_(3, .4, .5, .6)); + deltaRg.insert(2, Vector_(2, .7, .8)); + + vector replacedKeys(3, false); + replacedKeys[0] = true; + replacedKeys[1] = false; + replacedKeys[2] = true; + + Ordering ordering; ordering += 100, 1, 0; + + ISAM2::Nodes nodes(3); + + // Verify initial state + LONGS_EQUAL(0, ordering[100]); + LONGS_EQUAL(1, ordering[1]); + LONGS_EQUAL(2, ordering[0]); + + // Create expected state + Values thetaExpected; + thetaExpected.insert(0, Pose2(.1, .2, .3)); + thetaExpected.insert(100, Point2(.4, .5)); + + SymbolicFactorGraph sfgRemoved; + sfgRemoved.push_back(boost::make_shared(Index(0), Index(1))); + sfgRemoved.push_back(SymbolicFactorGraph::sharedFactor()); // Add empty factor to keep factor indices consistent + VariableIndex variableIndexExpected(sfgRemoved); + + VectorValues deltaExpected; + deltaExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaExpected.insert(1, Vector_(2, .7, .8)); + + VectorValues deltaNewtonExpected; + deltaNewtonExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaNewtonExpected.insert(1, Vector_(2, .7, .8)); + + VectorValues deltaRgExpected; + deltaRgExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaRgExpected.insert(1, Vector_(2, .7, .8)); + + vector replacedKeysExpected(2, true); + + Ordering orderingExpected; orderingExpected += 100, 0; + + ISAM2::Nodes nodesExpected(2); + + // Expand initial state + FastSet unusedKeys; + unusedKeys.insert(1); + vector removedFactorsI; removedFactorsI.push_back(1); + SymbolicFactorGraph removedFactors; removedFactors.push_back(sfg[1]); + variableIndex.remove(removedFactorsI, removedFactors); + ISAM2::Impl::RemoveVariables(unusedKeys, theta, variableIndex, delta, deltaNewton, deltaRg, replacedKeys, ordering, nodes); + + EXPECT(assert_equal(thetaExpected, theta)); + EXPECT(assert_equal(variableIndexExpected, variableIndex)); + EXPECT(assert_equal(deltaExpected, delta)); + EXPECT(assert_equal(deltaNewtonExpected, deltaNewton)); + EXPECT(assert_equal(deltaRgExpected, deltaRg)); + EXPECT(assert_container_equality(replacedKeysExpected, replacedKeys)); + EXPECT(assert_equal(orderingExpected, ordering)); +} /* ************************************************************************* */ //TEST(ISAM2, IndicesFromFactors) { @@ -1011,6 +1099,134 @@ TEST(ISAM2, removeFactors) EXPECT(assert_equal(expectedGradient, actualGradient)); } +/* ************************************************************************* */ +//TEST(ISAM2, removeVariables) +//{ +// +// // These variables will be reused and accumulate factors and values +// ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); +// Values fullinit; +// planarSLAM::Graph fullgraph; +// +// vector factorsToRemove; +// +// // i keeps track of the time step +// size_t i = 0; +// +// // Add a prior at time 0 and update isam +// { +// planarSLAM::Graph newfactors; +// newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); +// fullgraph.push_back(newfactors); +// +// Values init; +// init.insert((0), Pose2(0.01, 0.01, 0.01)); +// fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); +// +// isam.update(newfactors, init); +// } +// +// CHECK(isam_check(fullgraph, fullinit, isam)); +// +// // Add odometry from time 0 to time 5 +// for( ; i<5; ++i) { +// planarSLAM::Graph newfactors; +// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); +// fullgraph.push_back(newfactors); +// +// Values init; +// init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); +// fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); +// +// isam.update(newfactors, init); +// } +// +// // Add odometry from time 5 to 6 and landmark measurement at time 5 +// { +// planarSLAM::Graph newfactors; +// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); +// newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); +// newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); +// fullgraph.push_back(newfactors); +// +// Values init; +// init.insert((i+1), Pose2(1.01, 0.01, 0.01)); +// init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); +// init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); +// fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); +// fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); +// fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); +// +// ISAM2Result result = isam.update(newfactors, init); +// factorsToRemove.push_back(result.newFactorsIndices[1]); +// ++ i; +// } +// +// // Add odometry from time 6 to time 10 +// for( ; i<10; ++i) { +// planarSLAM::Graph newfactors; +// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); +// fullgraph.push_back(newfactors); +// +// Values init; +// init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); +// fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); +// +// isam.update(newfactors, init); +// } +// +// // Add odometry from time 10 to 11 and landmark measurement at time 10 +// { +// planarSLAM::Graph newfactors; +// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); +// newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); +// newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); +// fullgraph.push_back(newfactors); +// +// Values init; +// init.insert((i+1), Pose2(6.9, 0.1, 0.01)); +// fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); +// +// ISAM2Result result = isam.update(newfactors, init); +// factorsToRemove.push_back(result.newFactorsIndices[1]); +// ++ i; +// } +// +// // Compare solutions +// fullgraph.remove(factorsToRemove[0]); +// fullgraph.remove(factorsToRemove[1]); +// fullinit.erase(100); +// CHECK(isam_check(fullgraph, fullinit, isam)); +// +// // Check gradient at each node +// typedef ISAM2::sharedClique sharedClique; +// BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { +// // Compute expected gradient +// FactorGraph jfg; +// jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); +// VectorValues expectedGradient(*allocateVectorValues(isam)); +// gradientAtZero(jfg, expectedGradient); +// // Compare with actual gradients +// int variablePosition = 0; +// for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { +// const int dim = clique->conditional()->dim(jit); +// Vector actual = clique->gradientContribution().segment(variablePosition, dim); +// EXPECT(assert_equal(expectedGradient[*jit], actual)); +// variablePosition += dim; +// } +// LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); +// } +// +// // Check gradient +// VectorValues expectedGradient(*allocateVectorValues(isam)); +// gradientAtZero(FactorGraph(isam), expectedGradient); +// VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); +// VectorValues actualGradient(*allocateVectorValues(isam)); +// gradientAtZero(isam, actualGradient); +// EXPECT(assert_equal(expectedGradient2, expectedGradient)); +// EXPECT(assert_equal(expectedGradient, actualGradient)); +//} + /* ************************************************************************* */ TEST_UNSAFE(ISAM2, swapFactors) { From ad53c20b0dc38e8f97ec8e07f3707ce2772527a3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 19:18:02 +0000 Subject: [PATCH 516/914] Added dims() and swap() functions to VectorValues --- gtsam/linear/VectorValues.cpp | 14 ++++++++++++++ gtsam/linear/VectorValues.h | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/gtsam/linear/VectorValues.cpp b/gtsam/linear/VectorValues.cpp index 15925c644..fd7f2757c 100644 --- a/gtsam/linear/VectorValues.cpp +++ b/gtsam/linear/VectorValues.cpp @@ -45,6 +45,14 @@ VectorValues VectorValues::Zero(const VectorValues& x) { return cloned; } +/* ************************************************************************* */ +vector VectorValues::dims() const { + std::vector result(this->size()); + for(Index j = 0; j < this->size(); ++j) + result[j] = this->dim(j); + return result; +} + /* ************************************************************************* */ void VectorValues::insert(Index j, const Vector& value) { // Make sure j does not already exist @@ -188,4 +196,10 @@ VectorValues VectorValues::permute(const Permutation& permutation) const { return lhs; } +/* ************************************************************************* */ +void VectorValues::swap(VectorValues& other) { + this->values_.swap(other.values_); + this->maps_.swap(other.maps_); +} + } \ No newline at end of file diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 463080db9..aa9c1aa6d 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -134,6 +134,9 @@ namespace gtsam { /** Return the summed dimensionality of all variables. */ size_t dim() const { return values_.rows(); } + /** Return the dimension of each vector in this container */ + std::vector dims() const; + /** Check whether a variable with index \c j exists. */ bool exists(Index j) const { return j < size() && maps_[j].rows() > 0; } @@ -296,6 +299,11 @@ namespace gtsam { */ VectorValues permute(const Permutation& permutation) const; + /** + * Swap the data in this VectorValues with another. + */ + void swap(VectorValues& other); + /// @} private: From ac2d4f9fa0c5dd6bf0c76ff355df823e72295391 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 19:18:11 +0000 Subject: [PATCH 517/914] Added removeUnusedAtEnd function to VariableIndex and added notes to comments --- gtsam/inference/VariableIndex.cpp | 11 +++++++++++ gtsam/inference/VariableIndex.h | 15 +++++++++++++++ gtsam/inference/tests/testVariableIndex.cpp | 4 +++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gtsam/inference/VariableIndex.cpp b/gtsam/inference/VariableIndex.cpp index a29d5e432..4e5eb8649 100644 --- a/gtsam/inference/VariableIndex.cpp +++ b/gtsam/inference/VariableIndex.cpp @@ -76,4 +76,15 @@ void VariableIndex::permuteInPlace(const Permutation& permutation) { index_.swap(newIndex); } +/* ************************************************************************* */ +void VariableIndex::removeUnusedAtEnd(size_t nToRemove) { +#ifndef NDEBUG + for(size_t i = this->size() - nToRemove; i < this->size(); ++i) + if(!(*this)[i].empty()) + throw std::invalid_argument("Attempting to remove non-empty variables with VariableIndex::removeUnusedAtEnd()"); +#endif + + index_.resize(this->size() - nToRemove); +} + } diff --git a/gtsam/inference/VariableIndex.h b/gtsam/inference/VariableIndex.h index be47cbd5a..739067dd2 100644 --- a/gtsam/inference/VariableIndex.h +++ b/gtsam/inference/VariableIndex.h @@ -119,6 +119,11 @@ public: /** * Remove entries corresponding to the specified factors. + * NOTE: We intentionally do not decrement nFactors_ because the factor + * indices need to remain consistent. Removing factors from a factor graph + * does not shift the indices of other factors. Also, we keep nFactors_ + * one greater than the highest-numbered factor referenced in a VariableIndex. + * * @param indices The indices of the factors to remove, which must match \c factors * @param factors The factors being removed, which must symbolically correspond * exactly to the factors with the specified \c indices that were added. @@ -128,6 +133,12 @@ public: /// Permute the variables in the VariableIndex according to the given permutation void permuteInPlace(const Permutation& permutation); + /** Remove unused empty variables at the end of the ordering (in debug mode + * verifies they are empty). + * @param nToRemove The number of unused variables at the end to remove + */ + void removeUnusedAtEnd(size_t nToRemove); + protected: Factor_iterator factorsBegin(Index variable) { checkVar(variable); return index_[variable].begin(); } /// void VariableIndex::remove(const CONTAINER& indices, const FactorGraph& factors) { + // NOTE: We intentionally do not decrement nFactors_ because the factor + // indices need to remain consistent. Removing factors from a factor graph + // does not shift the indices of other factors. Also, we keep nFactors_ + // one greater than the highest-numbered factor referenced in a VariableIndex. for(size_t fi=0; fikeys().size(); ++ji) { diff --git a/gtsam/inference/tests/testVariableIndex.cpp b/gtsam/inference/tests/testVariableIndex.cpp index 7c8e6fa9e..412b3fa04 100644 --- a/gtsam/inference/tests/testVariableIndex.cpp +++ b/gtsam/inference/tests/testVariableIndex.cpp @@ -44,7 +44,9 @@ TEST(VariableIndex, augment) { VariableIndex actual(fg1); actual.augment(fg2); - CHECK(assert_equal(expected, actual)); + LONGS_EQUAL(16, actual.nEntries()); + LONGS_EQUAL(8, actual.nFactors()); + EXPECT(assert_equal(expected, actual)); } /* ************************************************************************* */ From 719e0f48a91b415b6338a79138eac0d4cd22f76f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 19:18:19 +0000 Subject: [PATCH 518/914] Added Permutation::applyToCollection and corrected a comment --- gtsam/inference/Permutation.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gtsam/inference/Permutation.h b/gtsam/inference/Permutation.h index 3a5b9b0da..39c4447d2 100644 --- a/gtsam/inference/Permutation.h +++ b/gtsam/inference/Permutation.h @@ -133,8 +133,8 @@ public: static Permutation PullToFront(const std::vector& toFront, size_t size, bool filterDuplicates = false); /** - * Create a permutation that pulls the given variables to the front while - * pushing the rest to the back. + * Create a permutation that pushes the given variables to the back while + * pulling the rest to the front. */ static Permutation PushToBack(const std::vector& toBack, size_t size, bool filterDuplicates = false); @@ -154,6 +154,17 @@ public: const_iterator begin() const { return rangeIndices_.begin(); } ///< Iterate through the indices const_iterator end() const { return rangeIndices_.end(); } ///< Iterate through the indices + /** Apply the permutation to a collection, which must have operator[] defined. + * Note that permutable gtsam data structures typically have their own + * permute function to apply a permutation. Permutation::applyToCollection is + * a generic function, e.g. for STL classes. + * @param input The input collection. + * @param output The preallocated output collection, which is assigned output[i] = input[permutation[i]] + */ + template + void applyToCollection(OUTPUT_COLLECTION& output, const INPUT_COLLECTION& input) const { + for(size_t i = 0; i < output.size(); ++i) output[i] = input[(*this)[i]]; } + /// @} /// @name Advanced Interface From f8b559772f538cb3dee5cca62a62d1d41d3dc6a2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 19:18:27 +0000 Subject: [PATCH 519/914] Fixed unused variable warning in CppUnitLite --- CppUnitLite/Test.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CppUnitLite/Test.h b/CppUnitLite/Test.h index 22566131e..89d96f463 100644 --- a/CppUnitLite/Test.h +++ b/CppUnitLite/Test.h @@ -110,7 +110,7 @@ protected: { try { condition; \ result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Didn't throw: ") + StringFrom(#condition))); \ return; } \ - catch (exception_name& e) {} \ + catch (exception_name&) {} \ catch (...) { \ result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Wrong exception: ") + StringFrom(#condition) + StringFrom(", expected: ") + StringFrom(#exception_name))); \ return; } } From b33713a02ed774c31a0b0228dc92831193a286c7 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 30 Jun 2012 20:04:12 +0000 Subject: [PATCH 520/914] Merge branch 'master' into new_wrap_local Conflicts: .cproject gtsam.h --- .cproject | 8 ++ gtsam.h | 2 +- gtsam/discrete/DecisionTreeFactor.cpp | 7 +- gtsam/discrete/DecisionTreeFactor.h | 3 +- gtsam/discrete/Potentials.cpp | 5 +- gtsam/discrete/Potentials.h | 3 +- gtsam/geometry/SimpleCamera.cpp | 49 ++++++++ gtsam/geometry/SimpleCamera.h | 5 + gtsam/geometry/tests/testCal3_S2.cpp | 4 +- .../tests/testSerializationGeometry.cpp | 41 ++----- gtsam/geometry/tests/testSimpleCamera.cpp | 20 ++++ gtsam/geometry/tests/testStereoCamera.cpp | 10 +- gtsam/inference/Permutation.h | 83 +------------ gtsam/inference/SymbolicFactorGraph.cpp | 4 +- gtsam/inference/VariableIndex.cpp | 52 +++----- gtsam/inference/VariableIndex.h | 50 +++----- gtsam/inference/tests/testISAM.cpp | 2 +- gtsam/linear/GaussianConditional.cpp | 36 ++---- gtsam/linear/GaussianConditional.h | 17 --- gtsam/linear/JacobianFactor.h | 2 +- gtsam/linear/NoiseModel.h | 2 + gtsam/linear/VectorValues.cpp | 40 ++++--- gtsam/linear/VectorValues.h | 13 +- .../linear/tests/testGaussianConditional.cpp | 49 -------- .../linear/tests/testGaussianJunctionTree.cpp | 2 +- .../linear/tests/testSerializationLinear.cpp | 10 +- gtsam/linear/tests/testVectorValues.cpp | 59 +++------- gtsam/nonlinear/ISAM2-impl.cpp | 67 ++++------- gtsam/nonlinear/ISAM2-impl.h | 18 +-- gtsam/nonlinear/ISAM2-inl.h | 4 +- gtsam/nonlinear/ISAM2.cpp | 30 ++--- gtsam/nonlinear/ISAM2.h | 34 ++---- gtsam/nonlinear/Values.cpp | 2 +- .../tests/testSerializationNonlinear.cpp | 12 +- gtsam/slam/tests/testStereoFactor.cpp | 8 +- gtsam_unstable/discrete/AllDiff.cpp | 5 +- gtsam_unstable/discrete/AllDiff.h | 3 +- gtsam_unstable/discrete/BinaryAllDiff.h | 7 +- gtsam_unstable/discrete/Domain.cpp | 7 +- gtsam_unstable/discrete/Domain.h | 3 +- gtsam_unstable/discrete/SingleValue.cpp | 5 +- gtsam_unstable/discrete/SingleValue.h | 3 +- .../discrete/tests/testScheduler.cpp | 2 +- tests/testGaussianISAM.cpp | 4 +- tests/testGaussianISAM2.cpp | 111 ++++++------------ tests/testGaussianJunctionTreeB.cpp | 10 +- tests/testNonlinearEquality.cpp | 14 +-- tests/testSerializationSLAM.cpp | 8 +- wrap/CMakeLists.txt | 3 +- 49 files changed, 367 insertions(+), 571 deletions(-) create mode 100644 gtsam/geometry/SimpleCamera.cpp diff --git a/.cproject b/.cproject index f52a49e73..075558734 100644 --- a/.cproject +++ b/.cproject @@ -1484,6 +1484,14 @@ true true + + make + -j5 + testSimpleCamera.run + true + true + true + make -j2 diff --git a/gtsam.h b/gtsam.h index 755402554..8b569a91e 100644 --- a/gtsam.h +++ b/gtsam.h @@ -671,7 +671,7 @@ class VariableIndex { size_t size() const; size_t nFactors() const; size_t nEntries() const; - void permute(const gtsam::Permutation& permutation); + void permuteInPlace(const gtsam::Permutation& permutation); };*/ //************************************************************************* diff --git a/gtsam/discrete/DecisionTreeFactor.cpp b/gtsam/discrete/DecisionTreeFactor.cpp index 7f566a115..bb83cec16 100644 --- a/gtsam/discrete/DecisionTreeFactor.cpp +++ b/gtsam/discrete/DecisionTreeFactor.cpp @@ -49,10 +49,11 @@ namespace gtsam { } /* ************************************************************************* */ - void DecisionTreeFactor::print(const string& s) const { + void DecisionTreeFactor::print(const string& s, + const IndexFormatter& formatter) const { cout << s; - IndexFactor::print("IndexFactor:"); - Potentials::print("Potentials:"); + IndexFactor::print("IndexFactor:",formatter); + Potentials::print("Potentials:",formatter); } /* ************************************************************************* */ diff --git a/gtsam/discrete/DecisionTreeFactor.h b/gtsam/discrete/DecisionTreeFactor.h index 89bc090dc..64f37c174 100644 --- a/gtsam/discrete/DecisionTreeFactor.h +++ b/gtsam/discrete/DecisionTreeFactor.h @@ -72,7 +72,8 @@ namespace gtsam { bool equals(const DecisionTreeFactor& other, double tol = 1e-9) const; // print - void print(const std::string& s = "DecisionTreeFactor:\n") const; + virtual void print(const std::string& s = "DecisionTreeFactor:\n", + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// @} /// @name Standard Interface diff --git a/gtsam/discrete/Potentials.cpp b/gtsam/discrete/Potentials.cpp index b9a87dea9..2a2260d97 100644 --- a/gtsam/discrete/Potentials.cpp +++ b/gtsam/discrete/Potentials.cpp @@ -51,10 +51,11 @@ namespace gtsam { } /* ************************************************************************* */ - void Potentials::print(const string&s) const { + void Potentials::print(const string& s, + const IndexFormatter& formatter) const { cout << s << "\n Cardinalities: "; BOOST_FOREACH(const DiscreteKey& key, cardinalities_) - cout << key.first << "=" << key.second << " "; + cout << formatter(key.first) << "=" << formatter(key.second) << " "; cout << endl; ADT::print(" "); } diff --git a/gtsam/discrete/Potentials.h b/gtsam/discrete/Potentials.h index 367a323c2..3ca222b5f 100644 --- a/gtsam/discrete/Potentials.h +++ b/gtsam/discrete/Potentials.h @@ -65,7 +65,8 @@ namespace gtsam { // Testable bool equals(const Potentials& other, double tol = 1e-9) const; - void print(const std::string& s = "Potentials: ") const; + void print(const std::string& s = "Potentials: ", + const IndexFormatter& formatter = DefaultIndexFormatter) const; size_t cardinality(Index j) const { return cardinalities_.at(j);} diff --git a/gtsam/geometry/SimpleCamera.cpp b/gtsam/geometry/SimpleCamera.cpp new file mode 100644 index 000000000..d441716cb --- /dev/null +++ b/gtsam/geometry/SimpleCamera.cpp @@ -0,0 +1,49 @@ +/* ---------------------------------------------------------------------------- + + * 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 SimpleCamera.cpp + * @brief A simple camera class with a Cal3_S2 calibration + * @date June 30, 2012 + * @author Frank Dellaert + */ + +#include +#include + +namespace gtsam { + + SimpleCamera simpleCamera(const Matrix& P) { + + // P = [A|a] = s K cRw [I|-T], with s the unknown scale + Matrix A = P.topLeftCorner(3, 3); + Vector a = P.col(3); + + // do RQ decomposition to get s*K and cRw angles + Matrix sK; + Vector xyz; + boost::tie(sK, xyz) = RQ(A); + + // Recover scale factor s and K + double s = sK(2, 2); + Matrix K = sK / s; + + // Recover cRw itself, and its inverse + Rot3 cRw = Rot3::RzRyRx(xyz); + Rot3 wRc = cRw.inverse(); + + // Now, recover T from a = - s K cRw T = - A T + Vector T = -(A.inverse() * a); + return SimpleCamera(Pose3(wRc, T), + Cal3_S2(K(0, 0), K(1, 1), K(0, 1), K(0, 2), K(1, 2))); + } + +} diff --git a/gtsam/geometry/SimpleCamera.h b/gtsam/geometry/SimpleCamera.h index d3b0cdbdc..abe42f1a0 100644 --- a/gtsam/geometry/SimpleCamera.h +++ b/gtsam/geometry/SimpleCamera.h @@ -22,5 +22,10 @@ #include namespace gtsam { + + /// A simple camera class with a Cal3_S2 calibration typedef PinholeCamera SimpleCamera; + + /// Recover camera from 3*4 camera matrix + SimpleCamera simpleCamera(const Matrix& P); } diff --git a/gtsam/geometry/tests/testCal3_S2.cpp b/gtsam/geometry/tests/testCal3_S2.cpp index fd82557a3..8995a3a14 100644 --- a/gtsam/geometry/tests/testCal3_S2.cpp +++ b/gtsam/geometry/tests/testCal3_S2.cpp @@ -24,8 +24,8 @@ using namespace gtsam; GTSAM_CONCEPT_TESTABLE_INST(Cal3_S2) GTSAM_CONCEPT_MANIFOLD_INST(Cal3_S2) -Cal3_S2 K(500, 500, 0.1, 640 / 2, 480 / 2); -Point2 p(1, -2); +static Cal3_S2 K(500, 500, 0.1, 640 / 2, 480 / 2); +static Point2 p(1, -2); /* ************************************************************************* */ TEST( Cal3_S2, easy_constructor) diff --git a/gtsam/geometry/tests/testSerializationGeometry.cpp b/gtsam/geometry/tests/testSerializationGeometry.cpp index c1fba6b2c..17a0b1eca 100644 --- a/gtsam/geometry/tests/testSerializationGeometry.cpp +++ b/gtsam/geometry/tests/testSerializationGeometry.cpp @@ -36,37 +36,20 @@ using namespace gtsam; using namespace gtsam::serializationTestHelpers; /* ************************************************************************* */ -// Export all classes derived from Value -BOOST_CLASS_EXPORT(gtsam::Cal3_S2) -BOOST_CLASS_EXPORT(gtsam::Cal3_S2Stereo) -BOOST_CLASS_EXPORT(gtsam::Cal3Bundler) -BOOST_CLASS_EXPORT(gtsam::CalibratedCamera) -BOOST_CLASS_EXPORT(gtsam::Point2) -BOOST_CLASS_EXPORT(gtsam::Point3) -BOOST_CLASS_EXPORT(gtsam::Pose2) -BOOST_CLASS_EXPORT(gtsam::Pose3) -BOOST_CLASS_EXPORT(gtsam::Rot2) -BOOST_CLASS_EXPORT(gtsam::Rot3) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::StereoPoint2) +static Point3 pt3(1.0, 2.0, 3.0); +static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); +static Pose3 pose3(rt3, pt3); -/* ************************************************************************* */ -Point3 pt3(1.0, 2.0, 3.0); -Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); -Pose3 pose3(rt3, pt3); +static Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); +static Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); +static Cal3Bundler cal3(1.0, 2.0, 3.0); +static Cal3_S2Stereo cal4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0); +static Cal3_S2Stereo::shared_ptr cal4ptr(new Cal3_S2Stereo(cal4)); +static CalibratedCamera cal5(Pose3(rt3, pt3)); -Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); -Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); -Cal3Bundler cal3(1.0, 2.0, 3.0); -Cal3_S2Stereo cal4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0); -Cal3_S2Stereo::shared_ptr cal4ptr(new Cal3_S2Stereo(cal4)); -CalibratedCamera cal5(Pose3(rt3, pt3)); - -PinholeCamera cam1(pose3, cal1); -StereoCamera cam2(pose3, cal4ptr); -StereoPoint2 spt(1.0, 2.0, 3.0); +static PinholeCamera cam1(pose3, cal1); +static StereoCamera cam2(pose3, cal4ptr); +static StereoPoint2 spt(1.0, 2.0, 3.0); /* ************************************************************************* */ TEST (Serialization, text_geometry) { diff --git a/gtsam/geometry/tests/testSimpleCamera.cpp b/gtsam/geometry/tests/testSimpleCamera.cpp index 6cc00de8a..a1647fa47 100644 --- a/gtsam/geometry/tests/testSimpleCamera.cpp +++ b/gtsam/geometry/tests/testSimpleCamera.cpp @@ -133,6 +133,26 @@ TEST( SimpleCamera, Dproject_point_pose) CHECK(assert_equal(Dpoint, numerical_point,1e-7)); } +/* ************************************************************************* */ +TEST( SimpleCamera, simpleCamera) +{ + Cal3_S2 K(468.2,427.2,91.2,300,200); + Rot3 R( + 0.41380,0.90915,0.04708, + -0.57338,0.22011,0.78917, + 0.70711,-0.35355,0.61237); + Point3 T(1000,2000,1500); + SimpleCamera expected(Pose3(R.inverse(),T),K); + // H&Z example, 2nd edition, page 163 + Matrix P = Matrix_(3,4, + 3.53553e2, 3.39645e2, 2.77744e2, -1.44946e6, + -1.03528e2, 2.33212e1, 4.59607e2, -6.32525e5, + 7.07107e-1, -3.53553e-1,6.12372e-1, -9.18559e2); + SimpleCamera actual = simpleCamera(P); + // Note precision of numbers given in book + CHECK(assert_equal(expected, actual,1e-1)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/geometry/tests/testStereoCamera.cpp b/gtsam/geometry/tests/testStereoCamera.cpp index 2446ff122..29a8344d4 100644 --- a/gtsam/geometry/tests/testStereoCamera.cpp +++ b/gtsam/geometry/tests/testStereoCamera.cpp @@ -74,21 +74,21 @@ TEST( StereoCamera, project) /* ************************************************************************* */ -Pose3 camera1(Matrix_(3,3, +static Pose3 camera1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,6.25)); -Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); -StereoCamera stereoCam(Pose3(), K); +static Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); +static StereoCamera stereoCam(Pose3(), K); // point X Y Z in meters -Point3 p(0, 0, 5); +static Point3 p(0, 0, 5); /* ************************************************************************* */ -StereoPoint2 project_(const StereoCamera& cam, const Point3& point) { return cam.project(point); } +static StereoPoint2 project_(const StereoCamera& cam, const Point3& point) { return cam.project(point); } TEST( StereoCamera, Dproject_stereo_pose) { Matrix expected = numericalDerivative21(project_,stereoCam, p); diff --git a/gtsam/inference/Permutation.h b/gtsam/inference/Permutation.h index 0aa322e87..3a5b9b0da 100644 --- a/gtsam/inference/Permutation.h +++ b/gtsam/inference/Permutation.h @@ -26,7 +26,7 @@ namespace gtsam { -/** + /** * A permutation reorders variables, for example to reduce fill-in during * elimination. To save computation, the permutation can be applied to * the necessary data structures only once, then multiple computations @@ -151,8 +151,8 @@ public: */ Permutation::shared_ptr inverse() const; - const_iterator begin() const { return rangeIndices_.begin(); } /// permuted(permutation, container); - * permuted[index1]; - * permuted[index2]; - * which is equivalent to: - * container[permutation[index1]]; - * container[permutation[index2]]; - * but more concise. - */ -template -class Permuted { - Permutation permutation_; - CONTAINER& container_; -public: - typedef typename CONTAINER::iterator::value_type value_type; - - /** Construct as a permuted view on the Container. The permutation is copied - * but only a reference to the container is stored. - */ - Permuted(const Permutation& permutation, CONTAINER& container) : permutation_(permutation), container_(container) {} - - /** Construct as a view on the Container with an identity permutation. Only - * a reference to the container is stored. - */ - Permuted(CONTAINER& container) : permutation_(Permutation::Identity(container.size())), container_(container) {} - - /** Print */ - void print(const std::string& str = "") const { - std::cout << str; - permutation_.print(" permutation: "); - container_.print(" container: "); - } - - /** Access the container through the permutation */ - value_type& operator[](size_t index) { return container_[permutation_[index]]; } - - /** Access the container through the permutation (const version) */ - const value_type& operator[](size_t index) const { return container_[permutation_[index]]; } - - /** Assignment operator for cloning in ISAM2 */ - Permuted operator=(const Permuted& other) { - permutation_ = other.permutation_; - container_ = other.container_; - return *this; - } - - /** Permute this view by applying a permutation to the underlying permutation */ - void permute(const Permutation& permutation) { assert(permutation.size() == this->size()); permutation_ = *permutation_.permute(permutation); } - - /** Access the underlying container */ - CONTAINER* operator->() { return &container_; } - - /** Access the underlying container (const version) */ - const CONTAINER* operator->() const { return &container_; } - - /** Size of the underlying container */ - size_t size() const { return container_.size(); } - - /** Access to the underlying container */ - CONTAINER& container() { return container_; } - - /** Access to the underlying container (const version) */ - const CONTAINER& container() const { return container_; } - - /** Access the underlying permutation */ - Permutation& permutation() { return permutation_; } - const Permutation& permutation() const { return permutation_; } -}; - - } diff --git a/gtsam/inference/SymbolicFactorGraph.cpp b/gtsam/inference/SymbolicFactorGraph.cpp index b58a69b6d..00f3439a0 100644 --- a/gtsam/inference/SymbolicFactorGraph.cpp +++ b/gtsam/inference/SymbolicFactorGraph.cpp @@ -85,8 +85,8 @@ namespace gtsam { "IndexFactor::CombineAndEliminate called on factors with no variables."); vector newKeys(keys.begin(), keys.end()); - return make_pair(new IndexConditional(newKeys, nrFrontals), - new IndexFactor(newKeys.begin() + nrFrontals, newKeys.end())); + return make_pair(boost::make_shared(newKeys, nrFrontals), + boost::make_shared(newKeys.begin() + nrFrontals, newKeys.end())); } /* ************************************************************************* */ diff --git a/gtsam/inference/VariableIndex.cpp b/gtsam/inference/VariableIndex.cpp index c7ef90e9f..a29d5e432 100644 --- a/gtsam/inference/VariableIndex.cpp +++ b/gtsam/inference/VariableIndex.cpp @@ -18,37 +18,12 @@ #include #include +#include namespace gtsam { using namespace std; -/* ************************************************************************* */ -VariableIndex::VariableIndex(const VariableIndex& other) : - index_(indexUnpermuted_) { - *this = other; -} - -/* ************************************************************************* */ -VariableIndex& VariableIndex::operator=(const VariableIndex& rhs) { - index_ = rhs.index_; - nFactors_ = rhs.nFactors_; - nEntries_ = rhs.nEntries_; - return *this; -} - -/* ************************************************************************* */ -void VariableIndex::permute(const Permutation& permutation) { -#ifndef NDEBUG - // Assert that the permutation does not leave behind any non-empty variables, - // otherwise the nFactors and nEntries counts would be incorrect. - for(Index j=0; jindex_.size(); ++j) - if(find(permutation.begin(), permutation.end(), j) == permutation.end()) - assert(this->operator[](j).empty()); -#endif - index_.permute(permutation); -} - /* ************************************************************************* */ bool VariableIndex::equals(const VariableIndex& other, double tol) const { if(this->nEntries_ == other.nEntries_ && this->nFactors_ == other.nFactors_) { @@ -66,17 +41,13 @@ bool VariableIndex::equals(const VariableIndex& other, double tol) const { /* ************************************************************************* */ void VariableIndex::print(const string& str) const { - cout << str << "\n"; + cout << str; cout << "nEntries = " << nEntries() << ", nFactors = " << nFactors() << "\n"; - Index var = 0; - BOOST_FOREACH(const Factors& variable, index_.container()) { - Permutation::const_iterator rvar = find(index_.permutation().begin(), index_.permutation().end(), var); - assert(rvar != index_.permutation().end()); - cout << "var " << (rvar-index_.permutation().begin()) << ":"; - BOOST_FOREACH(const size_t factor, variable) + for(Index var = 0; var < size(); ++var) { + cout << "var " << var << ":"; + BOOST_FOREACH(const size_t factor, index_[var]) cout << " " << factor; cout << "\n"; - ++ var; } cout << flush; } @@ -85,7 +56,7 @@ void VariableIndex::print(const string& str) const { void VariableIndex::outputMetisFormat(ostream& os) const { os << size() << " " << nFactors() << "\n"; // run over variables, which will be hyper-edges. - BOOST_FOREACH(const Factors& variable, index_.container()) { + BOOST_FOREACH(const Factors& variable, index_) { // every variable is a hyper-edge covering its factors BOOST_FOREACH(const size_t factor, variable) os << (factor+1) << " "; // base 1 @@ -94,4 +65,15 @@ void VariableIndex::outputMetisFormat(ostream& os) const { os << flush; } +/* ************************************************************************* */ +void VariableIndex::permuteInPlace(const Permutation& permutation) { + // Create new index and move references to data into it in permuted order + vector newIndex(this->size()); + for(Index i = 0; i < newIndex.size(); ++i) + newIndex[i].swap(this->index_[permutation[i]]); + + // Move reference to entire index into the VariableIndex + index_.swap(newIndex); +} + } diff --git a/gtsam/inference/VariableIndex.h b/gtsam/inference/VariableIndex.h index c9efc6b22..be47cbd5a 100644 --- a/gtsam/inference/VariableIndex.h +++ b/gtsam/inference/VariableIndex.h @@ -22,10 +22,12 @@ #include #include -#include +#include namespace gtsam { + class Permutation; + /** * The VariableIndex class computes and stores the block column structure of a * factor graph. The factor graph stores a collection of factors, each of @@ -44,8 +46,7 @@ public: typedef Factors::const_iterator Factor_const_iterator; protected: - std::vector indexUnpermuted_; - Permuted > index_; // Permuted view of indexUnpermuted. + std::vector index_; size_t nFactors_; // Number of factors in the original factor graph. size_t nEntries_; // Sum of involved variable counts of each factor. @@ -55,7 +56,7 @@ public: /// @{ /** Default constructor, creates an empty VariableIndex */ - VariableIndex() : index_(indexUnpermuted_), nFactors_(0), nEntries_(0) {} + VariableIndex() : nFactors_(0), nEntries_(0) {} /** * Create a VariableIndex that computes and stores the block column structure @@ -70,16 +71,6 @@ public: */ template VariableIndex(const FactorGraph& factorGraph); - /** - * Copy constructor - */ - VariableIndex(const VariableIndex& other); - - /** - * Assignment operator - */ - VariableIndex& operator=(const VariableIndex& rhs); - /// @} /// @name Standard Interface /// @{ @@ -120,9 +111,6 @@ public: /// @name Advanced Interface /// @{ - /** Access a list of factors by variable */ - Factors& operator[](Index variable) { checkVar(variable); return index_[variable]; } - /** * Augment the variable index with new factors. This can be used when * solving problems incrementally. @@ -137,11 +125,8 @@ public: */ template void remove(const CONTAINER& indices, const FactorGraph& factors); - /** - * Apply a variable permutation. Does not rearrange data, just permutes - * future lookups by variable. - */ - void permute(const Permutation& permutation); + /// Permute the variables in the VariableIndex according to the given permutation + void permuteInPlace(const Permutation& permutation); protected: Factor_iterator factorsBegin(Index variable) { checkVar(variable); return index_[variable].begin(); } /// void fill(const FactorGraph& factorGraph); /// @} @@ -183,7 +168,7 @@ void VariableIndex::fill(const FactorGraph& factorGraph) { /* ************************************************************************* */ template VariableIndex::VariableIndex(const FactorGraph& factorGraph) : - index_(indexUnpermuted_), nFactors_(0), nEntries_(0) { + nFactors_(0), nEntries_(0) { // If the factor graph is empty, return an empty index because inside this // if block we assume at least one factor. @@ -200,8 +185,7 @@ VariableIndex::VariableIndex(const FactorGraph& factorGraph) : } // Allocate array - index_.container().resize(maxVar+1); - index_.permutation() = Permutation::Identity(maxVar+1); + index_.resize(maxVar+1); fill(factorGraph); } @@ -210,7 +194,7 @@ VariableIndex::VariableIndex(const FactorGraph& factorGraph) : /* ************************************************************************* */ template VariableIndex::VariableIndex(const FactorGraph& factorGraph, Index nVariables) : - indexUnpermuted_(nVariables), index_(indexUnpermuted_), nFactors_(0), nEntries_(0) { + index_(nVariables), nFactors_(0), nEntries_(0) { fill(factorGraph); } @@ -232,11 +216,7 @@ void VariableIndex::augment(const FactorGraph& factors) { } // Allocate index - Index originalSize = index_.size(); - index_.container().resize(std::max(index_.size(), maxVar+1)); - index_.permutation().resize(index_.container().size()); - for(Index var=originalSize; var SymbolicISAM; /* ************************************************************************* */ // Some numbers that should be consistent among all smoother tests -double sigmax1 = 0.786153, sigmax2 = 0.687131, sigmax3 = 0.671512, sigmax4 = +static double sigmax1 = 0.786153, sigmax2 = 0.687131, sigmax3 = 0.671512, sigmax4 = 0.669534, sigmax5 = sigmax3, sigmax6 = sigmax2, sigmax7 = sigmax1; /* ************************************************************************* */ diff --git a/gtsam/linear/GaussianConditional.cpp b/gtsam/linear/GaussianConditional.cpp index 40d40a3a7..e167d8ad8 100644 --- a/gtsam/linear/GaussianConditional.cpp +++ b/gtsam/linear/GaussianConditional.cpp @@ -182,34 +182,18 @@ JacobianFactor::shared_ptr GaussianConditional::toFactor() const { return JacobianFactor::shared_ptr(new JacobianFactor(*this)); } -/* ************************************************************************* */ -template -inline static void doSolveInPlace(const GaussianConditional& conditional, VALUES& x) { - - // Helper function to solve-in-place on a VectorValues or Permuted, - // called by GaussianConditional::solveInPlace(VectorValues&) and by - // GaussianConditional::solveInPlace(Permuted&). - - static const bool debug = false; - if(debug) conditional.print("Solving conditional in place"); - Vector xS = internal::extractVectorValuesSlices(x, conditional.beginParents(), conditional.endParents()); - xS = conditional.get_d() - conditional.get_S() * xS; - Vector soln = conditional.get_R().triangularView().solve(xS); - if(debug) { - gtsam::print(Matrix(conditional.get_R()), "Calling backSubstituteUpper on "); - gtsam::print(soln, "full back-substitution solution: "); - } - internal::writeVectorValuesSlices(soln, x, conditional.beginFrontals(), conditional.endFrontals()); -} - /* ************************************************************************* */ void GaussianConditional::solveInPlace(VectorValues& x) const { - doSolveInPlace(*this, x); // Call helper version above -} - -/* ************************************************************************* */ -void GaussianConditional::solveInPlace(Permuted& x) const { - doSolveInPlace(*this, x); // Call helper version above + static const bool debug = false; + if(debug) this->print("Solving conditional in place"); + Vector xS = internal::extractVectorValuesSlices(x, this->beginParents(), this->endParents()); + xS = this->get_d() - this->get_S() * xS; + Vector soln = this->get_R().triangularView().solve(xS); + if(debug) { + gtsam::print(Matrix(this->get_R()), "Calling backSubstituteUpper on "); + gtsam::print(soln, "full back-substitution solution: "); + } + internal::writeVectorValuesSlices(soln, x, this->beginFrontals(), this->endFrontals()); } /* ************************************************************************* */ diff --git a/gtsam/linear/GaussianConditional.h b/gtsam/linear/GaussianConditional.h index 5b7801156..cde4f266f 100644 --- a/gtsam/linear/GaussianConditional.h +++ b/gtsam/linear/GaussianConditional.h @@ -196,23 +196,6 @@ public: */ void solveInPlace(VectorValues& x) const; - /** - * Solves a conditional Gaussian and writes the solution into the entries of - * \c x for each frontal variable of the conditional (version for permuted - * VectorValues). The parents are assumed to have already been solved in - * and their values are read from \c x. This function works for multiple - * frontal variables. - * - * Given the Gaussian conditional with log likelihood \f$ |R x_f - (d - S x_s)|^2, - * where \f$ f \f$ are the frontal variables and \f$ s \f$ are the separator - * variables of this conditional, this solve function computes - * \f$ x_f = R^{-1} (d - S x_s) \f$ using back-substitution. - * - * @param x VectorValues structure with solved parents \f$ x_s \f$, and into which the - * solution \f$ x_f \f$ will be written. - */ - void solveInPlace(Permuted& x) const; - // functions for transpose backsubstitution /** diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 660eb25f7..c5f726252 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -84,7 +84,7 @@ namespace gtsam { protected: - SharedDiagonal model_; // Gaussian noise model with diagonal covariance matrix + noiseModel::Diagonal::shared_ptr model_; // Gaussian noise model with diagonal covariance matrix std::vector firstNonzeroBlocks_; AbMatrix matrix_; // the full matrix corresponding to the factor BlockAb Ab_; // the block view of the full matrix diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index 9d39b5674..01799148a 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -19,6 +19,8 @@ #pragma once #include +#include +#include #include #include diff --git a/gtsam/linear/VectorValues.cpp b/gtsam/linear/VectorValues.cpp index 1413d1517..15925c644 100644 --- a/gtsam/linear/VectorValues.cpp +++ b/gtsam/linear/VectorValues.cpp @@ -17,10 +17,12 @@ */ #include +#include #include using namespace std; -using namespace gtsam; + +namespace gtsam { /* ************************************************************************* */ VectorValues::VectorValues(const VectorValues& other) { @@ -166,20 +168,24 @@ void VectorValues::operator+=(const VectorValues& c) { } /* ************************************************************************* */ -VectorValues& VectorValues::operator=(const Permuted& rhs) { - if(this->size() != rhs.size()) - throw std::invalid_argument("VectorValues assignment from Permuted requires pre-allocation, see documentation."); - for(size_t j=0; jsize(); ++j) { - if(exists(j)) { - SubVector& l(this->at(j)); - const SubVector& r(rhs[j]); - if(l.rows() != r.rows()) - throw std::invalid_argument("VectorValues assignment from Permuted requires pre-allocation, see documentation."); - l = r; - } else { - if(rhs.container().exists(rhs.permutation()[j])) - throw std::invalid_argument("VectorValues assignment from Permuted requires pre-allocation, see documentation."); - } - } - return *this; +VectorValues VectorValues::permute(const Permutation& permutation) const { + // Create result and allocate space + VectorValues lhs; + lhs.values_.resize(this->dim()); + lhs.maps_.reserve(this->size()); + + // Copy values from this VectorValues to the permuted VectorValues + size_t lhsPos = 0; + for(size_t i = 0; i < this->size(); ++i) { + // Map the next LHS subvector to the next slice of the LHS vector + lhs.maps_.push_back(SubVector(lhs.values_, lhsPos, this->at(permutation[i]).size())); + // Copy the data from the RHS subvector to the LHS subvector + lhs.maps_[i] = this->at(permutation[i]); + // Increment lhs position + lhsPos += lhs.maps_[i].size(); + } + + return lhs; } + +} \ No newline at end of file diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 04c280577..463080db9 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -19,7 +19,6 @@ #include #include -#include #include #include @@ -29,6 +28,9 @@ namespace gtsam { + // Forward declarations + class Permutation; + /** * This class represents a collection of vector-valued variables associated * each with a unique integer index. It is typically used to store the variables @@ -288,10 +290,11 @@ namespace gtsam { */ void operator+=(const VectorValues& c); - /** Assignment operator from Permuted, requires the dimensions - * of the assignee to already be properly pre-allocated. - */ - VectorValues& operator=(const Permuted& rhs); + /** + * Permute the entries of this VectorValues, returns a new VectorValues as + * the result. + */ + VectorValues permute(const Permutation& permutation) const; /// @} diff --git a/gtsam/linear/tests/testGaussianConditional.cpp b/gtsam/linear/tests/testGaussianConditional.cpp index 93030b598..8b0c5e239 100644 --- a/gtsam/linear/tests/testGaussianConditional.cpp +++ b/gtsam/linear/tests/testGaussianConditional.cpp @@ -267,55 +267,6 @@ TEST( GaussianConditional, solve_multifrontal ) } -/* ************************************************************************* */ -TEST( GaussianConditional, solve_multifrontal_permuted ) -{ - // create full system, 3 variables, 2 frontals, all 2 dim - Matrix full_matrix = Matrix_(4, 7, - 1.0, 0.0, 2.0, 0.0, 3.0, 0.0, 0.1, - 0.0, 1.0, 0.0, 2.0, 0.0, 3.0, 0.2, - 0.0, 0.0, 3.0, 0.0, 4.0, 0.0, 0.3, - 0.0, 0.0, 0.0, 3.0, 0.0, 4.0, 0.4); - - // 3 variables, all dim=2 - vector dims; dims += 2, 2, 2, 1; - GaussianConditional::rsd_type matrices(full_matrix, dims.begin(), dims.end()); - Vector sigmas = ones(4); - vector cgdims; cgdims += _x_, _x1_, _l1_; - GaussianConditional cg(cgdims.begin(), cgdims.end(), 2, matrices, sigmas); - - EXPECT(assert_equal(Vector_(4, 0.1, 0.2, 0.3, 0.4), cg.get_d())); - - // partial solution - Vector sl1 = Vector_(2, 9.0, 10.0); - - // elimination order; _x_, _x1_, _l1_ - VectorValues actualUnpermuted(vector(3, 2)); - Permutation permutation(3); - permutation[0] = 2; - permutation[1] = 0; - permutation[2] = 1; - Permuted actual(permutation, actualUnpermuted); - actual[_x_] = Vector_(2, 0.1, 0.2); // rhs - actual[_x1_] = Vector_(2, 0.3, 0.4); // rhs - actual[_l1_] = sl1; // parent - - VectorValues expectedUnpermuted(vector(3, 2)); - Permuted expected(permutation, expectedUnpermuted); - expected[_x_] = Vector_(2, -3.1,-3.4); - expected[_x1_] = Vector_(2, -11.9,-13.2); - expected[_l1_] = sl1; - - // verify indices/size - EXPECT_LONGS_EQUAL(3, cg.size()); - EXPECT_LONGS_EQUAL(4, cg.dim()); - - // solve and verify - cg.solveInPlace(actual); - EXPECT(assert_equal(expected.container(), actual.container(), tol)); - -} - /* ************************************************************************* */ TEST( GaussianConditional, solveTranspose ) { static const Index _y_=1; diff --git a/gtsam/linear/tests/testGaussianJunctionTree.cpp b/gtsam/linear/tests/testGaussianJunctionTree.cpp index b49d7fff0..c4ddc360b 100644 --- a/gtsam/linear/tests/testGaussianJunctionTree.cpp +++ b/gtsam/linear/tests/testGaussianJunctionTree.cpp @@ -35,7 +35,7 @@ using namespace gtsam; static const Index x2=0, x1=1, x3=2, x4=3; -GaussianFactorGraph createChain() { +static GaussianFactorGraph createChain() { typedef GaussianFactorGraph::sharedFactor Factor; SharedDiagonal model = noiseModel::Isotropic::Sigma(1, 0.5); diff --git a/gtsam/linear/tests/testSerializationLinear.cpp b/gtsam/linear/tests/testSerializationLinear.cpp index a646773f2..e8a53c504 100644 --- a/gtsam/linear/tests/testSerializationLinear.cpp +++ b/gtsam/linear/tests/testSerializationLinear.cpp @@ -47,11 +47,11 @@ BOOST_CLASS_EXPORT_GUID(gtsam::SharedDiagonal, "gtsam_SharedDiagonal"); /* ************************************************************************* */ // example noise models -noiseModel::Diagonal::shared_ptr diag3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); -noiseModel::Gaussian::shared_ptr gaussian3 = noiseModel::Gaussian::SqrtInformation(2.0 * eye(3,3)); -noiseModel::Isotropic::shared_ptr iso3 = noiseModel::Isotropic::Sigma(3, 0.2); -noiseModel::Constrained::shared_ptr constrained3 = noiseModel::Constrained::MixedSigmas(Vector_(3, 0.0, 0.0, 0.1)); -noiseModel::Unit::shared_ptr unit3 = noiseModel::Unit::Create(3); +static noiseModel::Diagonal::shared_ptr diag3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); +static noiseModel::Gaussian::shared_ptr gaussian3 = noiseModel::Gaussian::SqrtInformation(2.0 * eye(3,3)); +static noiseModel::Isotropic::shared_ptr iso3 = noiseModel::Isotropic::Sigma(3, 0.2); +static noiseModel::Constrained::shared_ptr constrained3 = noiseModel::Constrained::MixedSigmas(Vector_(3, 0.0, 0.0, 0.1)); +static noiseModel::Unit::shared_ptr unit3 = noiseModel::Unit::Create(3); /* ************************************************************************* */ TEST (Serialization, noiseModels) { diff --git a/gtsam/linear/tests/testVectorValues.cpp b/gtsam/linear/tests/testVectorValues.cpp index a92b81ddc..17230854a 100644 --- a/gtsam/linear/tests/testVectorValues.cpp +++ b/gtsam/linear/tests/testVectorValues.cpp @@ -421,52 +421,31 @@ TEST(VectorValues, hasSameStructure) { EXPECT(!v1.hasSameStructure(VectorValues())); } + /* ************************************************************************* */ -TEST(VectorValues, permuted_combined) { - Vector v1 = Vector_(3, 1.0,2.0,3.0); - Vector v2 = Vector_(2, 4.0,5.0); - Vector v3 = Vector_(4, 6.0,7.0,8.0,9.0); +TEST(VectorValues, permute) { - vector dims(3); dims[0]=3; dims[1]=2; dims[2]=4; - VectorValues combined(dims); - combined[0] = v1; - combined[1] = v2; - combined[2] = v3; + VectorValues original; + original.insert(0, Vector_(1, 1.0)); + original.insert(1, Vector_(2, 2.0, 3.0)); + original.insert(2, Vector_(2, 4.0, 5.0)); + original.insert(3, Vector_(2, 6.0, 7.0)); - Permutation perm1(3); - perm1[0] = 1; - perm1[1] = 2; - perm1[2] = 0; + VectorValues expected; + expected.insert(0, Vector_(2, 4.0, 5.0)); // from 2 + expected.insert(1, Vector_(1, 1.0)); // from 0 + expected.insert(2, Vector_(2, 6.0, 7.0)); // from 3 + expected.insert(3, Vector_(2, 2.0, 3.0)); // from 1 - Permutation perm2(3); - perm2[0] = 1; - perm2[1] = 2; - perm2[2] = 0; + Permutation permutation(4); + permutation[0] = 2; + permutation[1] = 0; + permutation[2] = 3; + permutation[3] = 1; - Permuted permuted1(combined); - CHECK(assert_equal(v1, permuted1[0])) - CHECK(assert_equal(v2, permuted1[1])) - CHECK(assert_equal(v3, permuted1[2])) + VectorValues actual = original.permute(permutation); - permuted1.permute(perm1); - CHECK(assert_equal(v1, permuted1[2])) - CHECK(assert_equal(v2, permuted1[0])) - CHECK(assert_equal(v3, permuted1[1])) - - permuted1.permute(perm2); - CHECK(assert_equal(v1, permuted1[1])) - CHECK(assert_equal(v2, permuted1[2])) - CHECK(assert_equal(v3, permuted1[0])) - - Permuted permuted2(perm1, combined); - CHECK(assert_equal(v1, permuted2[2])) - CHECK(assert_equal(v2, permuted2[0])) - CHECK(assert_equal(v3, permuted2[1])) - - permuted2.permute(perm2); - CHECK(assert_equal(v1, permuted2[1])) - CHECK(assert_equal(v2, permuted2[2])) - CHECK(assert_equal(v3, permuted2[0])) + EXPECT(assert_equal(expected, actual)); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 8b3bd4a0d..3c373e0ba 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -29,8 +29,8 @@ namespace gtsam { /* ************************************************************************* */ void ISAM2::Impl::AddVariables( - const Values& newTheta, Values& theta, Permuted& delta, - Permuted& deltaNewton, Permuted& deltaGradSearch, vector& replacedKeys, + const Values& newTheta, Values& theta, VectorValues& delta, + VectorValues& deltaNewton, VectorValues& deltaGradSearch, vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter) { const bool debug = ISDEBUG("ISAM2 AddVariables"); @@ -40,28 +40,21 @@ void ISAM2::Impl::AddVariables( std::vector dims(newTheta.dims(*newTheta.orderingArbitrary())); if(debug) cout << "New variables have total dimensionality " << accumulate(dims.begin(), dims.end(), 0) << endl; const size_t newDim = accumulate(dims.begin(), dims.end(), 0); - const size_t originalDim = delta->dim(); - const size_t originalnVars = delta->size(); - delta.container().append(dims); - delta.container().vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); - delta.permutation().resize(originalnVars + newTheta.size()); - deltaNewton.container().append(dims); - deltaNewton.container().vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); - deltaNewton.permutation().resize(originalnVars + newTheta.size()); - deltaGradSearch.container().append(dims); - deltaGradSearch.container().vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); - deltaGradSearch.permutation().resize(originalnVars + newTheta.size()); + const size_t originalDim = delta.dim(); + const size_t originalnVars = delta.size(); + delta.append(dims); + delta.vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); + deltaNewton.append(dims); + deltaNewton.vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); + deltaGradSearch.append(dims); + deltaGradSearch.vector().segment(originalDim, newDim).operator=(Vector::Zero(newDim)); { Index nextVar = originalnVars; BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, newTheta) { - delta.permutation()[nextVar] = nextVar; - deltaNewton.permutation()[nextVar] = nextVar; - deltaGradSearch.permutation()[nextVar] = nextVar; ordering.insert(key_value.key, nextVar); if(debug) cout << "Adding variable " << keyFormatter(key_value.key) << " with order " << nextVar << endl; ++ nextVar; } - assert(delta.permutation().size() == delta.container().size()); assert(ordering.nVars() == delta.size()); assert(ordering.size() == delta.size()); } @@ -82,7 +75,7 @@ FastSet ISAM2::Impl::IndicesFromFactors(const Ordering& ordering, const N } /* ************************************************************************* */ -FastSet ISAM2::Impl::CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, +FastSet ISAM2::Impl::CheckRelinearizationFull(const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { FastSet relinKeys; @@ -110,7 +103,7 @@ FastSet ISAM2::Impl::CheckRelinearizationFull(const Permuted& relinKeys, double threshold, const Permuted& delta, const ISAM2Clique::shared_ptr& clique) { +void CheckRelinearizationRecursiveDouble(FastSet& relinKeys, double threshold, const VectorValues& delta, const ISAM2Clique::shared_ptr& clique) { // Check the current clique for relinearization bool relinearize = false; @@ -131,7 +124,7 @@ void CheckRelinearizationRecursiveDouble(FastSet& relinKeys, double thres } /* ************************************************************************* */ -void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap& thresholds, const Permuted& delta, const Ordering::InvertedMap& decoder, const ISAM2Clique::shared_ptr& clique) { +void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap& thresholds, const VectorValues& delta, const Ordering::InvertedMap& decoder, const ISAM2Clique::shared_ptr& clique) { // Check the current clique for relinearization bool relinearize = false; @@ -163,7 +156,7 @@ void CheckRelinearizationRecursiveMap(FastSet& relinKeys, const FastMap ISAM2::Impl::CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, +FastSet ISAM2::Impl::CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter) { FastSet relinKeys; @@ -201,13 +194,13 @@ void ISAM2::Impl::FindAll(ISAM2Clique::shared_ptr clique, FastSet& keys, } /* ************************************************************************* */ -void ISAM2::Impl::ExpmapMasked(Values& values, const Permuted& delta, const Ordering& ordering, - const vector& mask, boost::optional&> invalidateIfDebug, const KeyFormatter& keyFormatter) { +void ISAM2::Impl::ExpmapMasked(Values& values, const VectorValues& delta, const Ordering& ordering, + const vector& mask, boost::optional invalidateIfDebug, const KeyFormatter& keyFormatter) { // If debugging, invalidate if requested, otherwise do not invalidate. // Invalidating means setting expmapped entries to Inf, to trigger assertions // if we try to re-use them. #ifdef NDEBUG - invalidateIfDebug = boost::optional&>(); + invalidateIfDebug = boost::none; #endif assert(values.size() == ordering.nVars()); @@ -304,7 +297,7 @@ ISAM2::Impl::PartialSolve(GaussianFactorGraph& factors, toc(4,"ccolamd permutations"); tic(5,"permute affected variable index"); - affectedFactorsIndex.permute(*affectedColamd); + affectedFactorsIndex.permuteInPlace(*affectedColamd); toc(5,"permute affected variable index"); tic(6,"permute affected factors"); @@ -354,25 +347,13 @@ inline static void optimizeInPlace(const boost::shared_ptr& clique, } /* ************************************************************************* */ -size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, Permuted& delta, double wildfireThreshold) { +size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, VectorValues& delta, double wildfireThreshold) { size_t lastBacksubVariableCount; if (wildfireThreshold <= 0.0) { // Threshold is zero or less, so do a full recalculation - // Collect dimensions and allocate new VectorValues - vector dims(delta.size()); - for(size_t j=0; jdim(j); - VectorValues newDelta(dims); - - // Optimize full solution delta - internal::optimizeInPlace(root, newDelta); - - // Copy solution into delta - delta.permutation() = Permutation::Identity(delta.size()); - delta.container() = newDelta; - + internal::optimizeInPlace(root, delta); lastBacksubVariableCount = delta.size(); } else { @@ -380,8 +361,8 @@ size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std: lastBacksubVariableCount = optimizeWildfire(root, wildfireThreshold, replacedKeys, delta); // modifies delta_ #ifndef NDEBUG - for(size_t j=0; j)).all()); + for(size_t j=0; j)).all()); #endif } @@ -394,7 +375,7 @@ size_t ISAM2::Impl::UpdateDelta(const boost::shared_ptr& root, std: /* ************************************************************************* */ namespace internal { void updateDoglegDeltas(const boost::shared_ptr& clique, std::vector& replacedKeys, - const VectorValues& grad, Permuted& deltaNewton, Permuted& RgProd, size_t& varsUpdated) { + const VectorValues& grad, VectorValues& deltaNewton, VectorValues& RgProd, size_t& varsUpdated) { // Check if any frontal or separator keys were recalculated, if so, we need // update deltas and recurse to children, but if not, we do not need to @@ -433,7 +414,7 @@ void updateDoglegDeltas(const boost::shared_ptr& clique, std::vecto /* ************************************************************************* */ size_t ISAM2::Impl::UpdateDoglegDeltas(const ISAM2& isam, double wildfireThreshold, std::vector& replacedKeys, - Permuted& deltaNewton, Permuted& RgProd) { + VectorValues& deltaNewton, VectorValues& RgProd) { // Get gradient VectorValues grad = *allocateVectorValues(isam); diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index 0aafb3f35..fdb39d855 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -46,10 +46,10 @@ struct ISAM2::Impl { * @param nodes Current BayesTree::Nodes index to be augmented with slots for new variables * @param keyFormatter Formatter for printing nonlinear keys during debugging */ - static void AddVariables(const Values& newTheta, Values& theta, Permuted& delta, - Permuted& deltaNewton, Permuted& deltaGradSearch, std::vector& replacedKeys, + static void AddVariables(const Values& newTheta, Values& theta, VectorValues& delta, + VectorValues& deltaNewton, VectorValues& deltaGradSearch, std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter = DefaultKeyFormatter); - + /** * Extract the set of variable indices from a NonlinearFactorGraph. For each Symbol * in each NonlinearFactor, obtains the index by calling ordering[symbol]. @@ -68,7 +68,7 @@ struct ISAM2::Impl { * @return The set of variable indices in delta whose magnitude is greater than or * equal to relinearizeThreshold */ - static FastSet CheckRelinearizationFull(const Permuted& delta, const Ordering& ordering, + static FastSet CheckRelinearizationFull(const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** @@ -82,7 +82,7 @@ struct ISAM2::Impl { * @return The set of variable indices in delta whose magnitude is greater than or * equal to relinearizeThreshold */ - static FastSet CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const Permuted& delta, const Ordering& ordering, + static FastSet CheckRelinearizationPartial(const ISAM2Clique::shared_ptr& root, const VectorValues& delta, const Ordering& ordering, const ISAM2Params::RelinearizationThreshold& relinearizeThreshold, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** @@ -115,9 +115,9 @@ struct ISAM2::Impl { * recalculate its delta. * @param keyFormatter Formatter for printing nonlinear keys during debugging */ - static void ExpmapMasked(Values& values, const Permuted& delta, + static void ExpmapMasked(Values& values, const VectorValues& delta, const Ordering& ordering, const std::vector& mask, - boost::optional&> invalidateIfDebug = boost::optional&>(), + boost::optional invalidateIfDebug = boost::none, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** @@ -137,10 +137,10 @@ struct ISAM2::Impl { static PartialSolveResult PartialSolve(GaussianFactorGraph& factors, const FastSet& keys, const ReorderingMode& reorderingMode, bool useQR); - static size_t UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, Permuted& delta, double wildfireThreshold); + static size_t UpdateDelta(const boost::shared_ptr& root, std::vector& replacedKeys, VectorValues& delta, double wildfireThreshold); static size_t UpdateDoglegDeltas(const ISAM2& isam, double wildfireThreshold, std::vector& replacedKeys, - Permuted& deltaNewton, Permuted& RgProd); + VectorValues& deltaNewton, VectorValues& RgProd); }; diff --git a/gtsam/nonlinear/ISAM2-inl.h b/gtsam/nonlinear/ISAM2-inl.h index 3520ffb84..ba0071b51 100644 --- a/gtsam/nonlinear/ISAM2-inl.h +++ b/gtsam/nonlinear/ISAM2-inl.h @@ -37,7 +37,7 @@ VALUE ISAM2::calculateEstimate(Key key) const { namespace internal { template void optimizeWildfire(const boost::shared_ptr& clique, double threshold, - std::vector& changed, const std::vector& replaced, Permuted& delta, int& count) { + std::vector& changed, const std::vector& replaced, VectorValues& delta, int& count) { // if none of the variables in this clique (frontal and separator!) changed // significantly, then by the running intersection property, none of the // cliques in the children need to be processed @@ -114,7 +114,7 @@ void optimizeWildfire(const boost::shared_ptr& clique, double threshold, /* ************************************************************************* */ template -int optimizeWildfire(const boost::shared_ptr& root, double threshold, const std::vector& keys, Permuted& delta) { +int optimizeWildfire(const boost::shared_ptr& root, double threshold, const std::vector& keys, VectorValues& delta) { std::vector changed(keys.size(), false); int count = 0; // starting from the root, call optimize on each conditional diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 07e0f518d..0c3c198aa 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -41,7 +41,6 @@ static const double batchThreshold = 0.65; /* ************************************************************************* */ ISAM2::ISAM2(const ISAM2Params& params): - delta_(deltaUnpermuted_), deltaNewton_(deltaNewtonUnpermuted_), RgProd_(RgProdUnpermuted_), deltaDoglegUptodate_(true), deltaUptodate_(true), params_(params) { if(params_.optimizationParams.type() == typeid(ISAM2DoglegParams)) doglegDelta_ = boost::get(params_.optimizationParams).initialDelta; @@ -49,15 +48,13 @@ ISAM2::ISAM2(const ISAM2Params& params): /* ************************************************************************* */ ISAM2::ISAM2(): - delta_(deltaUnpermuted_), deltaNewton_(deltaNewtonUnpermuted_), RgProd_(RgProdUnpermuted_), deltaDoglegUptodate_(true), deltaUptodate_(true) { if(params_.optimizationParams.type() == typeid(ISAM2DoglegParams)) doglegDelta_ = boost::get(params_.optimizationParams).initialDelta; } /* ************************************************************************* */ -ISAM2::ISAM2(const ISAM2& other): - delta_(deltaUnpermuted_), deltaNewton_(deltaNewtonUnpermuted_), RgProd_(RgProdUnpermuted_) { +ISAM2::ISAM2(const ISAM2& other) { *this = other; } @@ -308,12 +305,12 @@ boost::shared_ptr > ISAM2::recalculate( // Reorder tic(2,"permute global variable index"); - variableIndex_.permute(*colamd); + variableIndex_.permuteInPlace(*colamd); toc(2,"permute global variable index"); tic(3,"permute delta"); - delta_.permute(*colamd); - deltaNewton_.permute(*colamd); - RgProd_.permute(*colamd); + delta_ = delta_.permute(*colamd); + deltaNewton_ = deltaNewton_.permute(*colamd); + RgProd_ = RgProd_.permute(*colamd); toc(3,"permute delta"); tic(4,"permute ordering"); ordering_.permuteWithInverse(*colamdInverse); @@ -429,12 +426,12 @@ boost::shared_ptr > ISAM2::recalculate( // re-eliminate. The reordered variables are also mentioned in the // orphans and the leftover cached factors. tic(3,"permute global variable index"); - variableIndex_.permute(partialSolveResult.fullReordering); + variableIndex_.permuteInPlace(partialSolveResult.fullReordering); toc(3,"permute global variable index"); tic(4,"permute delta"); - delta_.permute(partialSolveResult.fullReordering); - deltaNewton_.permute(partialSolveResult.fullReordering); - RgProd_.permute(partialSolveResult.fullReordering); + delta_ = delta_.permute(partialSolveResult.fullReordering); + deltaNewton_ = deltaNewton_.permute(partialSolveResult.fullReordering); + RgProd_ = RgProd_.permute(partialSolveResult.fullReordering); toc(4,"permute delta"); tic(5,"permute ordering"); ordering_.permuteWithInverse(partialSolveResult.fullReorderingInverse); @@ -723,8 +720,7 @@ void ISAM2::updateDelta(bool forceFullSolve) const { tic(2, "Copy dx_d"); // Update Delta and linear step doglegDelta_ = doglegResult.Delta; - delta_.permutation() = Permutation::Identity(delta_.size()); // Dogleg solves for the full delta so there is no permutation - delta_.container() = doglegResult.dx_d; // Copy the VectorValues containing with the linear solution + delta_ = doglegResult.dx_d; // Copy the VectorValues containing with the linear solution toc(2, "Copy dx_d"); } @@ -739,7 +735,7 @@ Values ISAM2::calculateEstimate() const { Values ret(theta_); toc(1, "Copy Values"); tic(2, "getDelta"); - const Permuted& delta(getDelta()); + const VectorValues& delta(getDelta()); toc(2, "getDelta"); tic(3, "Expmap"); vector mask(ordering_.nVars(), true); @@ -756,7 +752,7 @@ Values ISAM2::calculateBestEstimate() const { } /* ************************************************************************* */ -const Permuted& ISAM2::getDelta() const { +const VectorValues& ISAM2::getDelta() const { if(!deltaUptodate_) updateDelta(); return delta_; @@ -829,7 +825,7 @@ void optimizeGradientSearchInPlace(const ISAM2& isam, VectorValues& grad) { tic(3, "Compute minimizing step size"); // Compute minimizing step size - double RgNormSq = isam.RgProd_.container().vector().squaredNorm(); + double RgNormSq = isam.RgProd_.vector().squaredNorm(); double step = -gradientSqNorm / RgNormSq; toc(3, "Compute minimizing step size"); diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 5804640df..2fd3e0b23 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -206,7 +206,7 @@ struct ISAM2Result { * factors passed as \c newFactors to ISAM2::update(). These indices may be * used later to refer to the factors in order to remove them. */ - FastVector newFactorsIndices; + std::vector newFactorsIndices; /** A struct holding detailed results, which must be enabled with * ISAM2Params::enableDetailedResults. @@ -347,26 +347,16 @@ protected: /** VariableIndex lets us look up factors by involved variable and keeps track of dimensions */ VariableIndex variableIndex_; - /** The linear delta from the last linear solution, an update to the estimate in theta */ - VectorValues deltaUnpermuted_; + /** The linear delta from the last linear solution, an update to the estimate in theta + * + * This is \c mutable because it is a "cached" variable - it is not updated + * until either requested with getDelta() or calculateEstimate(), or needed + * during update() to evaluate whether to relinearize variables. + */ + mutable VectorValues delta_; - /** The permutation through which the deltaUnpermuted_ is - * referenced. - * - * Permuting Vector entries would be slow, so for performance we - * instead maintain this permutation through which we access the linear delta - * indirectly - * - * This is \c mutable because it is a "cached" variable - it is not updated - * until either requested with getDelta() or calculateEstimate(), or needed - * during update() to evaluate whether to relinearize variables. - */ - mutable Permuted delta_; - - VectorValues deltaNewtonUnpermuted_; - mutable Permuted deltaNewton_; - VectorValues RgProdUnpermuted_; - mutable Permuted RgProd_; + mutable VectorValues deltaNewton_; + mutable VectorValues RgProd_; mutable bool deltaDoglegUptodate_; /** Indicates whether the current delta is up-to-date, only used @@ -497,7 +487,7 @@ public: Values calculateBestEstimate() const; /** Access the current delta, computed during the last call to update */ - const Permuted& getDelta() const; + const VectorValues& getDelta() const; /** Access the set of nonlinear factors */ const NonlinearFactorGraph& getFactorsUnsafe() const { return nonlinearFactors_; } @@ -555,7 +545,7 @@ void optimizeInPlace(const ISAM2& isam, VectorValues& delta); /// @return The number of variables that were solved for template int optimizeWildfire(const boost::shared_ptr& root, - double threshold, const std::vector& replaced, Permuted& delta); + double threshold, const std::vector& replaced, VectorValues& delta); /** * Optimize along the gradient direction, with a closed-form computation to diff --git a/gtsam/nonlinear/Values.cpp b/gtsam/nonlinear/Values.cpp index bb66943eb..58099d149 100644 --- a/gtsam/nonlinear/Values.cpp +++ b/gtsam/nonlinear/Values.cpp @@ -120,7 +120,7 @@ namespace gtsam { /* ************************************************************************* */ void Values::insert(Key j, const Value& val) { Key key = j; // Non-const duplicate to deal with non-const insert argument - std::pair insertResult = values_.insert(key, val.clone_()); + std::pair insertResult = values_.insert(key, val.clone_()); if(!insertResult.second) throw ValuesKeyAlreadyExists(j); } diff --git a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp index bc023f115..57e2c0a34 100644 --- a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp +++ b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp @@ -47,13 +47,13 @@ typedef PinholeCamera PinholeCal3DS2; typedef PinholeCamera PinholeCal3Bundler; /* ************************************************************************* */ -Point3 pt3(1.0, 2.0, 3.0); -Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); -Pose3 pose3(rt3, pt3); +static Point3 pt3(1.0, 2.0, 3.0); +static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); +static Pose3 pose3(rt3, pt3); -Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); -Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); -Cal3Bundler cal3(1.0, 2.0, 3.0); +static Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); +static Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); +static Cal3Bundler cal3(1.0, 2.0, 3.0); TEST (Serialization, TemplatedValues) { Values values; diff --git a/gtsam/slam/tests/testStereoFactor.cpp b/gtsam/slam/tests/testStereoFactor.cpp index 986538448..b38dae990 100644 --- a/gtsam/slam/tests/testStereoFactor.cpp +++ b/gtsam/slam/tests/testStereoFactor.cpp @@ -28,18 +28,18 @@ using namespace std; using namespace gtsam; -Pose3 camera1(Matrix_(3,3, +static Pose3 camera1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,6.25)); -Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); -StereoCamera stereoCam(Pose3(), K); +static Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); +static StereoCamera stereoCam(Pose3(), K); // point X Y Z in meters -Point3 p(0, 0, 5); +static Point3 p(0, 0, 5); static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); // Convenience for named keys diff --git a/gtsam_unstable/discrete/AllDiff.cpp b/gtsam_unstable/discrete/AllDiff.cpp index 41905f874..ac412fa7f 100644 --- a/gtsam_unstable/discrete/AllDiff.cpp +++ b/gtsam_unstable/discrete/AllDiff.cpp @@ -20,10 +20,11 @@ namespace gtsam { } /* ************************************************************************* */ - void AllDiff::print(const std::string& s) const { + void AllDiff::print(const std::string& s, + const IndexFormatter& formatter) const { std::cout << s << "AllDiff on "; BOOST_FOREACH (Index dkey, keys_) - std::cout << dkey << " "; + std::cout << formatter(dkey) << " "; std::cout << std::endl; } diff --git a/gtsam_unstable/discrete/AllDiff.h b/gtsam_unstable/discrete/AllDiff.h index fb5a47a59..1a560ace2 100644 --- a/gtsam_unstable/discrete/AllDiff.h +++ b/gtsam_unstable/discrete/AllDiff.h @@ -34,7 +34,8 @@ namespace gtsam { AllDiff(const DiscreteKeys& dkeys); // print - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// Calculate value = expensive ! virtual double operator()(const Values& values) const; diff --git a/gtsam_unstable/discrete/BinaryAllDiff.h b/gtsam_unstable/discrete/BinaryAllDiff.h index a2e260bcd..9ed2f79f1 100644 --- a/gtsam_unstable/discrete/BinaryAllDiff.h +++ b/gtsam_unstable/discrete/BinaryAllDiff.h @@ -33,9 +33,10 @@ namespace gtsam { } // print - virtual void print(const std::string& s = "") const { - std::cout << s << "BinaryAllDiff on " << keys_[0] << " and " << keys_[1] - << std::endl; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const { + std::cout << s << "BinaryAllDiff on " << formatter(keys_[0]) << " and " + << formatter(keys_[1]) << std::endl; } /// Calculate value diff --git a/gtsam_unstable/discrete/Domain.cpp b/gtsam_unstable/discrete/Domain.cpp index e43065f3b..dbc05e3f6 100644 --- a/gtsam_unstable/discrete/Domain.cpp +++ b/gtsam_unstable/discrete/Domain.cpp @@ -15,9 +15,10 @@ namespace gtsam { using namespace std; /* ************************************************************************* */ - void Domain::print(const string& s) const { -// cout << s << ": Domain on " << keys_[0] << " (j=" << keys_[0] -// << ") with values"; + void Domain::print(const string& s, + const IndexFormatter& formatter) const { +// cout << s << ": Domain on " << formatter(keys_[0]) << " (j=" << +// formatter(keys_[0]) << ") with values"; // BOOST_FOREACH (size_t v,values_) cout << " " << v; // cout << endl; BOOST_FOREACH (size_t v,values_) cout << v; diff --git a/gtsam_unstable/discrete/Domain.h b/gtsam_unstable/discrete/Domain.h index a4f0c8054..85b35fe8c 100644 --- a/gtsam_unstable/discrete/Domain.h +++ b/gtsam_unstable/discrete/Domain.h @@ -66,7 +66,8 @@ namespace gtsam { } // print - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const; bool contains(size_t value) const { return values_.count(value)>0; diff --git a/gtsam_unstable/discrete/SingleValue.cpp b/gtsam_unstable/discrete/SingleValue.cpp index 6f6d5a3ff..81133e7f7 100644 --- a/gtsam_unstable/discrete/SingleValue.cpp +++ b/gtsam_unstable/discrete/SingleValue.cpp @@ -16,8 +16,9 @@ namespace gtsam { using namespace std; /* ************************************************************************* */ - void SingleValue::print(const string& s) const { - cout << s << "SingleValue on " << "j=" << keys_[0] + void SingleValue::print(const string& s, + const IndexFormatter& formatter) const { + cout << s << "SingleValue on " << "j=" << formatter(keys_[0]) << " with value " << value_ << endl; } diff --git a/gtsam_unstable/discrete/SingleValue.h b/gtsam_unstable/discrete/SingleValue.h index b229d8b79..1f6e362aa 100644 --- a/gtsam_unstable/discrete/SingleValue.h +++ b/gtsam_unstable/discrete/SingleValue.h @@ -42,7 +42,8 @@ namespace gtsam { } // print - virtual void print(const std::string& s = "") const; + virtual void print(const std::string& s = "", + const IndexFormatter& formatter = DefaultIndexFormatter) const; /// Calculate value virtual double operator()(const Values& values) const; diff --git a/gtsam_unstable/discrete/tests/testScheduler.cpp b/gtsam_unstable/discrete/tests/testScheduler.cpp index bf9273ad6..6559754d5 100644 --- a/gtsam_unstable/discrete/tests/testScheduler.cpp +++ b/gtsam_unstable/discrete/tests/testScheduler.cpp @@ -149,7 +149,7 @@ TEST( schedulingExample, test) /* ************************************************************************* */ TEST( schedulingExample, smallFromFile) { - string path("../../../gtsam_unstable/discrete/examples/"); + string path(TOPSRCDIR "/gtsam_unstable/discrete/examples/"); Scheduler s(2, path + "small.csv"); // add areas diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index 6ae4a7b20..7ec4e5317 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -41,10 +41,10 @@ using symbol_shorthand::L; /* ************************************************************************* */ // Some numbers that should be consistent among all smoother tests -double sigmax1 = 0.786153, sigmax2 = 1.0/1.47292, sigmax3 = 0.671512, sigmax4 = +static double sigmax1 = 0.786153, sigmax2 = 1.0/1.47292, sigmax3 = 0.671512, sigmax4 = 0.669534, sigmax5 = sigmax3, sigmax6 = sigmax2, sigmax7 = sigmax1; -const double tol = 1e-4; +static const double tol = 1e-4; /* ************************************************************************* */ TEST_UNSAFE( ISAM, iSAM_smoother ) diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 2a5bf7962..994077777 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -139,112 +139,69 @@ TEST_UNSAFE(ISAM2, AddVariables) { // Create initial state Values theta; - theta.insert((0), Pose2(.1, .2, .3)); + theta.insert(0, Pose2(.1, .2, .3)); theta.insert(100, Point2(.4, .5)); Values newTheta; - newTheta.insert((1), Pose2(.6, .7, .8)); + newTheta.insert(1, Pose2(.6, .7, .8)); - VectorValues deltaUnpermuted; - deltaUnpermuted.insert(0, Vector_(3, .1, .2, .3)); - deltaUnpermuted.insert(1, Vector_(2, .4, .5)); + VectorValues delta; + delta.insert(0, Vector_(3, .1, .2, .3)); + delta.insert(1, Vector_(2, .4, .5)); - Permutation permutation(2); - permutation[0] = 1; - permutation[1] = 0; + VectorValues deltaNewton; + deltaNewton.insert(0, Vector_(3, .1, .2, .3)); + deltaNewton.insert(1, Vector_(2, .4, .5)); - Permuted delta(permutation, deltaUnpermuted); - - VectorValues deltaNewtonUnpermuted; - deltaNewtonUnpermuted.insert(0, Vector_(3, .1, .2, .3)); - deltaNewtonUnpermuted.insert(1, Vector_(2, .4, .5)); - - Permutation permutationNewton(2); - permutationNewton[0] = 1; - permutationNewton[1] = 0; - - Permuted deltaNewton(permutationNewton, deltaNewtonUnpermuted); - - VectorValues deltaRgUnpermuted; - deltaRgUnpermuted.insert(0, Vector_(3, .1, .2, .3)); - deltaRgUnpermuted.insert(1, Vector_(2, .4, .5)); - - Permutation permutationRg(2); - permutationRg[0] = 1; - permutationRg[1] = 0; - - Permuted deltaRg(permutationRg, deltaRgUnpermuted); + VectorValues deltaRg; + deltaRg.insert(0, Vector_(3, .1, .2, .3)); + deltaRg.insert(1, Vector_(2, .4, .5)); vector replacedKeys(2, false); - Ordering ordering; ordering += 100, (0); + Ordering ordering; ordering += 100, 0; ISAM2::Nodes nodes(2); // Verify initial state LONGS_EQUAL(0, ordering[100]); - LONGS_EQUAL(1, ordering[(0)]); - EXPECT(assert_equal(deltaUnpermuted[1], delta[ordering[100]])); - EXPECT(assert_equal(deltaUnpermuted[0], delta[ordering[(0)]])); + LONGS_EQUAL(1, ordering[0]); + EXPECT(assert_equal(delta[0], delta[ordering[100]])); + EXPECT(assert_equal(delta[1], delta[ordering[0]])); // Create expected state Values thetaExpected; - thetaExpected.insert((0), Pose2(.1, .2, .3)); + thetaExpected.insert(0, Pose2(.1, .2, .3)); thetaExpected.insert(100, Point2(.4, .5)); - thetaExpected.insert((1), Pose2(.6, .7, .8)); + thetaExpected.insert(1, Pose2(.6, .7, .8)); - VectorValues deltaUnpermutedExpected; - deltaUnpermutedExpected.insert(0, Vector_(3, .1, .2, .3)); - deltaUnpermutedExpected.insert(1, Vector_(2, .4, .5)); - deltaUnpermutedExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); + VectorValues deltaExpected; + deltaExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaExpected.insert(1, Vector_(2, .4, .5)); + deltaExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - Permutation permutationExpected(3); - permutationExpected[0] = 1; - permutationExpected[1] = 0; - permutationExpected[2] = 2; + VectorValues deltaNewtonExpected; + deltaNewtonExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaNewtonExpected.insert(1, Vector_(2, .4, .5)); + deltaNewtonExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - Permuted deltaExpected(permutationExpected, deltaUnpermutedExpected); - - VectorValues deltaNewtonUnpermutedExpected; - deltaNewtonUnpermutedExpected.insert(0, Vector_(3, .1, .2, .3)); - deltaNewtonUnpermutedExpected.insert(1, Vector_(2, .4, .5)); - deltaNewtonUnpermutedExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - - Permutation permutationNewtonExpected(3); - permutationNewtonExpected[0] = 1; - permutationNewtonExpected[1] = 0; - permutationNewtonExpected[2] = 2; - - Permuted deltaNewtonExpected(permutationNewtonExpected, deltaNewtonUnpermutedExpected); - - VectorValues deltaRgUnpermutedExpected; - deltaRgUnpermutedExpected.insert(0, Vector_(3, .1, .2, .3)); - deltaRgUnpermutedExpected.insert(1, Vector_(2, .4, .5)); - deltaRgUnpermutedExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); - - Permutation permutationRgExpected(3); - permutationRgExpected[0] = 1; - permutationRgExpected[1] = 0; - permutationRgExpected[2] = 2; - - Permuted deltaRgExpected(permutationRgExpected, deltaRgUnpermutedExpected); + VectorValues deltaRgExpected; + deltaRgExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaRgExpected.insert(1, Vector_(2, .4, .5)); + deltaRgExpected.insert(2, Vector_(3, 0.0, 0.0, 0.0)); vector replacedKeysExpected(3, false); - Ordering orderingExpected; orderingExpected += 100, (0), (1); + Ordering orderingExpected; orderingExpected += 100, 0, 1; - ISAM2::Nodes nodesExpected( - 3, ISAM2::sharedClique()); + ISAM2::Nodes nodesExpected(3, ISAM2::sharedClique()); // Expand initial state ISAM2::Impl::AddVariables(newTheta, theta, delta, deltaNewton, deltaRg, replacedKeys, ordering, nodes); EXPECT(assert_equal(thetaExpected, theta)); - EXPECT(assert_equal(deltaUnpermutedExpected, deltaUnpermuted)); - EXPECT(assert_equal(deltaExpected.permutation(), delta.permutation())); - EXPECT(assert_equal(deltaNewtonUnpermutedExpected, deltaNewtonUnpermuted)); - EXPECT(assert_equal(deltaNewtonExpected.permutation(), deltaNewton.permutation())); - EXPECT(assert_equal(deltaRgUnpermutedExpected, deltaRgUnpermuted)); - EXPECT(assert_equal(deltaRgExpected.permutation(), deltaRg.permutation())); + EXPECT(assert_equal(deltaExpected, delta)); + EXPECT(assert_equal(deltaNewtonExpected, deltaNewton)); + EXPECT(assert_equal(deltaRgExpected, deltaRg)); EXPECT(assert_container_equality(replacedKeysExpected, replacedKeys)); EXPECT(assert_equal(orderingExpected, ordering)); } diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 0f412a0b5..883011da2 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -52,7 +52,7 @@ using symbol_shorthand::L; C3 x1 : x2 C4 x7 : x6 */ -TEST( GaussianJunctionTree, constructor2 ) +TEST( GaussianJunctionTreeB, constructor2 ) { // create a graph Ordering ordering; ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); @@ -88,7 +88,7 @@ TEST( GaussianJunctionTree, constructor2 ) } /* ************************************************************************* */ -TEST( GaussianJunctionTree, optimizeMultiFrontal ) +TEST( GaussianJunctionTreeB, optimizeMultiFrontal ) { // create a graph GaussianFactorGraph fg; @@ -108,7 +108,7 @@ TEST( GaussianJunctionTree, optimizeMultiFrontal ) } /* ************************************************************************* */ -TEST( GaussianJunctionTree, optimizeMultiFrontal2) +TEST( GaussianJunctionTreeB, optimizeMultiFrontal2) { // create a graph example::Graph nlfg = createNonlinearFactorGraph(); @@ -126,7 +126,7 @@ TEST( GaussianJunctionTree, optimizeMultiFrontal2) } /* ************************************************************************* */ -TEST(GaussianJunctionTree, slamlike) { +TEST(GaussianJunctionTreeB, slamlike) { Values init; planarSLAM::Graph newfactors; planarSLAM::Graph fullgraph; @@ -188,7 +188,7 @@ TEST(GaussianJunctionTree, slamlike) { } /* ************************************************************************* */ -TEST(GaussianJunctionTree, simpleMarginal) { +TEST(GaussianJunctionTreeB, simpleMarginal) { typedef BayesTree GaussianBayesTree; diff --git a/tests/testNonlinearEquality.cpp b/tests/testNonlinearEquality.cpp index 4679dd740..1efc40cad 100644 --- a/tests/testNonlinearEquality.cpp +++ b/tests/testNonlinearEquality.cpp @@ -37,7 +37,7 @@ typedef PriorFactor PosePrior; typedef NonlinearEquality PoseNLE; typedef boost::shared_ptr shared_poseNLE; -Symbol key('x',1); +static Symbol key('x',1); /* ************************************************************************* */ TEST ( NonlinearEquality, linearization ) { @@ -241,8 +241,8 @@ TEST ( NonlinearEquality, allow_error_optimize_with_factors ) { } /* ************************************************************************* */ -SharedDiagonal hard_model = noiseModel::Constrained::All(2); -SharedDiagonal soft_model = noiseModel::Isotropic::Sigma(2, 1.0); +static SharedDiagonal hard_model = noiseModel::Constrained::All(2); +static SharedDiagonal soft_model = noiseModel::Isotropic::Sigma(2, 1.0); /* ************************************************************************* */ TEST( testNonlinearEqualityConstraint, unary_basics ) { @@ -504,10 +504,10 @@ TEST (testNonlinearEqualityConstraint, map_warp ) { } // make a realistic calibration matrix -double fov = 60; // degrees -size_t w=640,h=480; -Cal3_S2 K(fov,w,h); -boost::shared_ptr shK(new Cal3_S2(K)); +static double fov = 60; // degrees +static size_t w=640,h=480; +static Cal3_S2 K(fov,w,h); +static boost::shared_ptr shK(new Cal3_S2(K)); // typedefs for visual SLAM example typedef visualSLAM::Graph VGraph; diff --git a/tests/testSerializationSLAM.cpp b/tests/testSerializationSLAM.cpp index 7650925d1..d9094111e 100644 --- a/tests/testSerializationSLAM.cpp +++ b/tests/testSerializationSLAM.cpp @@ -174,10 +174,10 @@ BOOST_CLASS_EXPORT_GUID(visualSLAM::StereoFactor, "gtsam::visualSLAM::StereoF BOOST_CLASS_EXPORT(gtsam::Pose3) BOOST_CLASS_EXPORT(gtsam::Point3) -Point3 pt3(1.0, 2.0, 3.0); -Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); -Pose3 pose3(rt3, pt3); -Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); +static Point3 pt3(1.0, 2.0, 3.0); +static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); +static Pose3 pose3(rt3, pt3); +static Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); /* ************************************************************************* */ TEST (Serialization, visual_system) { diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 16dfbb8e5..757b488ba 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -4,7 +4,7 @@ find_package(Boost 1.42 COMPONENTS system filesystem thread REQUIRED) # Build the executable itself file(GLOB wrap_srcs "*.cpp") -list(REMOVE_ITEM wrap_srcs wrap.cpp) +list(REMOVE_ITEM wrap_srcs ${CMAKE_CURRENT_SOURCE_DIR}/wrap.cpp) add_library(wrap_lib STATIC ${wrap_srcs}) add_executable(wrap wrap.cpp) target_link_libraries(wrap wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) @@ -19,7 +19,6 @@ install(FILES matlab.h DESTINATION include/wrap) # Build tests if (GTSAM_BUILD_TESTS) - add_definitions(-DTOPSRCDIR="${CMAKE_SOURCE_DIR}") set(wrap_local_libs wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) gtsam_add_subdir_tests("wrap" "${wrap_local_libs}" "${wrap_local_libs}" "") endif(GTSAM_BUILD_TESTS) From 7ba7aa6cfc6c31ef20482589420ce56850b269b4 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 30 Jun 2012 20:04:16 +0000 Subject: [PATCH 521/914] Updated wrap unit tests for new wrap changes --- wrap/tests/expected/Makefile | 65 ++++++++++--------- wrap/tests/expected/new_Point2_.cpp | 1 - wrap/tests/expected/new_Point3_.cpp | 1 - wrap/tests/expected/new_Test_.cpp | 1 - wrap/tests/expected_namespaces/Makefile | 21 +++--- .../tests/expected_namespaces/new_ClassD_.cpp | 1 - .../expected_namespaces/new_ns1ClassA_.cpp | 1 - .../expected_namespaces/new_ns1ClassB_.cpp | 1 - .../expected_namespaces/new_ns2ClassA_.cpp | 1 - .../expected_namespaces/new_ns2ClassC_.cpp | 1 - .../expected_namespaces/new_ns2ns3ClassB_.cpp | 1 - wrap/tests/testWrap.cpp | 14 ++-- wrap/wrap.cpp | 3 +- 13 files changed, 55 insertions(+), 57 deletions(-) diff --git a/wrap/tests/expected/Makefile b/wrap/tests/expected/Makefile index 0797d0dd3..57a606790 100644 --- a/wrap/tests/expected/Makefile +++ b/wrap/tests/expected/Makefile @@ -2,82 +2,83 @@ MEX = mex MEXENDING = mexa64 +PATH_TO_WRAP = /not_really_a_real_path/borg/gtsam/wrap mex_flags = -O5 all: Point2 Point3 Test # Point2 -new_Point2_.$(MEXENDING): new_Point2_.cpp +new_Point2_.$(MEXENDING): new_Point2_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_Point2_.cpp -output new_Point2_ -@Point2/x.$(MEXENDING): @Point2/x.cpp +@Point2/x.$(MEXENDING): @Point2/x.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/x.cpp -output @Point2/x -@Point2/y.$(MEXENDING): @Point2/y.cpp +@Point2/y.$(MEXENDING): @Point2/y.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/y.cpp -output @Point2/y -@Point2/dim.$(MEXENDING): @Point2/dim.cpp +@Point2/dim.$(MEXENDING): @Point2/dim.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/dim.cpp -output @Point2/dim -@Point2/returnChar.$(MEXENDING): @Point2/returnChar.cpp +@Point2/returnChar.$(MEXENDING): @Point2/returnChar.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/returnChar.cpp -output @Point2/returnChar -@Point2/argChar.$(MEXENDING): @Point2/argChar.cpp +@Point2/argChar.$(MEXENDING): @Point2/argChar.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/argChar.cpp -output @Point2/argChar -@Point2/argUChar.$(MEXENDING): @Point2/argUChar.cpp +@Point2/argUChar.$(MEXENDING): @Point2/argUChar.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/argUChar.cpp -output @Point2/argUChar -@Point2/vectorConfusion.$(MEXENDING): @Point2/vectorConfusion.cpp +@Point2/vectorConfusion.$(MEXENDING): @Point2/vectorConfusion.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/vectorConfusion.cpp -output @Point2/vectorConfusion Point2: new_Point2_.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) @Point2/returnChar.$(MEXENDING) @Point2/argChar.$(MEXENDING) @Point2/argUChar.$(MEXENDING) @Point2/vectorConfusion.$(MEXENDING) # Point3 -new_Point3_.$(MEXENDING): new_Point3_.cpp +new_Point3_.$(MEXENDING): new_Point3_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_Point3_.cpp -output new_Point3_ -Point3_staticFunction.$(MEXENDING): Point3_staticFunction.cpp +Point3_staticFunction.$(MEXENDING): Point3_staticFunction.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) Point3_staticFunction.cpp -output Point3_staticFunction -Point3_StaticFunctionRet.$(MEXENDING): Point3_StaticFunctionRet.cpp +Point3_StaticFunctionRet.$(MEXENDING): Point3_StaticFunctionRet.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) Point3_StaticFunctionRet.cpp -output Point3_StaticFunctionRet -@Point3/norm.$(MEXENDING): @Point3/norm.cpp +@Point3/norm.$(MEXENDING): @Point3/norm.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point3/norm.cpp -output @Point3/norm Point3: new_Point3_.$(MEXENDING) Point3_staticFunction.$(MEXENDING) Point3_StaticFunctionRet.$(MEXENDING) @Point3/norm.$(MEXENDING) # Test -new_Test_.$(MEXENDING): new_Test_.cpp +new_Test_.$(MEXENDING): new_Test_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_Test_.cpp -output new_Test_ -@Test/return_pair.$(MEXENDING): @Test/return_pair.cpp +@Test/return_pair.$(MEXENDING): @Test/return_pair.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_pair.cpp -output @Test/return_pair -@Test/return_bool.$(MEXENDING): @Test/return_bool.cpp +@Test/return_bool.$(MEXENDING): @Test/return_bool.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_bool.cpp -output @Test/return_bool -@Test/return_size_t.$(MEXENDING): @Test/return_size_t.cpp +@Test/return_size_t.$(MEXENDING): @Test/return_size_t.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_size_t.cpp -output @Test/return_size_t -@Test/return_int.$(MEXENDING): @Test/return_int.cpp +@Test/return_int.$(MEXENDING): @Test/return_int.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_int.cpp -output @Test/return_int -@Test/return_double.$(MEXENDING): @Test/return_double.cpp +@Test/return_double.$(MEXENDING): @Test/return_double.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_double.cpp -output @Test/return_double -@Test/return_string.$(MEXENDING): @Test/return_string.cpp +@Test/return_string.$(MEXENDING): @Test/return_string.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_string.cpp -output @Test/return_string -@Test/return_vector1.$(MEXENDING): @Test/return_vector1.cpp +@Test/return_vector1.$(MEXENDING): @Test/return_vector1.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_vector1.cpp -output @Test/return_vector1 -@Test/return_matrix1.$(MEXENDING): @Test/return_matrix1.cpp +@Test/return_matrix1.$(MEXENDING): @Test/return_matrix1.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_matrix1.cpp -output @Test/return_matrix1 -@Test/return_vector2.$(MEXENDING): @Test/return_vector2.cpp +@Test/return_vector2.$(MEXENDING): @Test/return_vector2.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_vector2.cpp -output @Test/return_vector2 -@Test/return_matrix2.$(MEXENDING): @Test/return_matrix2.cpp +@Test/return_matrix2.$(MEXENDING): @Test/return_matrix2.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_matrix2.cpp -output @Test/return_matrix2 -@Test/arg_EigenConstRef.$(MEXENDING): @Test/arg_EigenConstRef.cpp +@Test/arg_EigenConstRef.$(MEXENDING): @Test/arg_EigenConstRef.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/arg_EigenConstRef.cpp -output @Test/arg_EigenConstRef -@Test/return_field.$(MEXENDING): @Test/return_field.cpp +@Test/return_field.$(MEXENDING): @Test/return_field.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_field.cpp -output @Test/return_field -@Test/return_TestPtr.$(MEXENDING): @Test/return_TestPtr.cpp +@Test/return_TestPtr.$(MEXENDING): @Test/return_TestPtr.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_TestPtr.cpp -output @Test/return_TestPtr -@Test/return_Test.$(MEXENDING): @Test/return_Test.cpp +@Test/return_Test.$(MEXENDING): @Test/return_Test.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_Test.cpp -output @Test/return_Test -@Test/return_Point2Ptr.$(MEXENDING): @Test/return_Point2Ptr.cpp +@Test/return_Point2Ptr.$(MEXENDING): @Test/return_Point2Ptr.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_Point2Ptr.cpp -output @Test/return_Point2Ptr -@Test/create_ptrs.$(MEXENDING): @Test/create_ptrs.cpp +@Test/create_ptrs.$(MEXENDING): @Test/create_ptrs.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/create_ptrs.cpp -output @Test/create_ptrs -@Test/create_MixedPtrs.$(MEXENDING): @Test/create_MixedPtrs.cpp +@Test/create_MixedPtrs.$(MEXENDING): @Test/create_MixedPtrs.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/create_MixedPtrs.cpp -output @Test/create_MixedPtrs -@Test/return_ptrs.$(MEXENDING): @Test/return_ptrs.cpp +@Test/return_ptrs.$(MEXENDING): @Test/return_ptrs.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_ptrs.cpp -output @Test/return_ptrs -@Test/print.$(MEXENDING): @Test/print.cpp +@Test/print.$(MEXENDING): @Test/print.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/print.cpp -output @Test/print Test: new_Test_.$(MEXENDING) @Test/return_pair.$(MEXENDING) @Test/return_bool.$(MEXENDING) @Test/return_size_t.$(MEXENDING) @Test/return_int.$(MEXENDING) @Test/return_double.$(MEXENDING) @Test/return_string.$(MEXENDING) @Test/return_vector1.$(MEXENDING) @Test/return_matrix1.$(MEXENDING) @Test/return_vector2.$(MEXENDING) @Test/return_matrix2.$(MEXENDING) @Test/arg_EigenConstRef.$(MEXENDING) @Test/return_field.$(MEXENDING) @Test/return_TestPtr.$(MEXENDING) @Test/return_Test.$(MEXENDING) @Test/return_Point2Ptr.$(MEXENDING) @Test/create_ptrs.$(MEXENDING) @Test/create_MixedPtrs.$(MEXENDING) @Test/return_ptrs.$(MEXENDING) @Test/print.$(MEXENDING) diff --git a/wrap/tests/expected/new_Point2_.cpp b/wrap/tests/expected/new_Point2_.cpp index 7d3af0038..11b2821a3 100644 --- a/wrap/tests/expected/new_Point2_.cpp +++ b/wrap/tests/expected/new_Point2_.cpp @@ -41,7 +41,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new Point2(x,y)); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected/new_Point3_.cpp b/wrap/tests/expected/new_Point3_.cpp index 368b3069e..01316da5a 100644 --- a/wrap/tests/expected/new_Point3_.cpp +++ b/wrap/tests/expected/new_Point3_.cpp @@ -40,7 +40,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new Point3(x,y,z)); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected/new_Test_.cpp b/wrap/tests/expected/new_Test_.cpp index a6bcc9549..e14e6b71d 100644 --- a/wrap/tests/expected/new_Test_.cpp +++ b/wrap/tests/expected/new_Test_.cpp @@ -42,7 +42,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new Test(a,b)); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected_namespaces/Makefile b/wrap/tests/expected_namespaces/Makefile index dcc3b1dbd..55866228b 100644 --- a/wrap/tests/expected_namespaces/Makefile +++ b/wrap/tests/expected_namespaces/Makefile @@ -2,50 +2,51 @@ MEX = mex MEXENDING = mexa64 +PATH_TO_WRAP = /not_really_a_real_path/borg/gtsam/wrap mex_flags = -O5 all: ns1ClassA ns1ClassB ns2ClassA ns2ns3ClassB ns2ClassC ClassD # ns1ClassA -new_ns1ClassA_.$(MEXENDING): new_ns1ClassA_.cpp +new_ns1ClassA_.$(MEXENDING): new_ns1ClassA_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_ns1ClassA_.cpp -output new_ns1ClassA_ ns1ClassA: new_ns1ClassA_.$(MEXENDING) # ns1ClassB -new_ns1ClassB_.$(MEXENDING): new_ns1ClassB_.cpp +new_ns1ClassB_.$(MEXENDING): new_ns1ClassB_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_ns1ClassB_.cpp -output new_ns1ClassB_ ns1ClassB: new_ns1ClassB_.$(MEXENDING) # ns2ClassA -new_ns2ClassA_.$(MEXENDING): new_ns2ClassA_.cpp +new_ns2ClassA_.$(MEXENDING): new_ns2ClassA_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_ns2ClassA_.cpp -output new_ns2ClassA_ -ns2ClassA_afunction.$(MEXENDING): ns2ClassA_afunction.cpp +ns2ClassA_afunction.$(MEXENDING): ns2ClassA_afunction.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) ns2ClassA_afunction.cpp -output ns2ClassA_afunction -@ns2ClassA/memberFunction.$(MEXENDING): @ns2ClassA/memberFunction.cpp +@ns2ClassA/memberFunction.$(MEXENDING): @ns2ClassA/memberFunction.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @ns2ClassA/memberFunction.cpp -output @ns2ClassA/memberFunction -@ns2ClassA/nsArg.$(MEXENDING): @ns2ClassA/nsArg.cpp +@ns2ClassA/nsArg.$(MEXENDING): @ns2ClassA/nsArg.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @ns2ClassA/nsArg.cpp -output @ns2ClassA/nsArg -@ns2ClassA/nsReturn.$(MEXENDING): @ns2ClassA/nsReturn.cpp +@ns2ClassA/nsReturn.$(MEXENDING): @ns2ClassA/nsReturn.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @ns2ClassA/nsReturn.cpp -output @ns2ClassA/nsReturn ns2ClassA: new_ns2ClassA_.$(MEXENDING) ns2ClassA_afunction.$(MEXENDING) @ns2ClassA/memberFunction.$(MEXENDING) @ns2ClassA/nsArg.$(MEXENDING) @ns2ClassA/nsReturn.$(MEXENDING) # ns2ns3ClassB -new_ns2ns3ClassB_.$(MEXENDING): new_ns2ns3ClassB_.cpp +new_ns2ns3ClassB_.$(MEXENDING): new_ns2ns3ClassB_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_ns2ns3ClassB_.cpp -output new_ns2ns3ClassB_ ns2ns3ClassB: new_ns2ns3ClassB_.$(MEXENDING) # ns2ClassC -new_ns2ClassC_.$(MEXENDING): new_ns2ClassC_.cpp +new_ns2ClassC_.$(MEXENDING): new_ns2ClassC_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_ns2ClassC_.cpp -output new_ns2ClassC_ ns2ClassC: new_ns2ClassC_.$(MEXENDING) # ClassD -new_ClassD_.$(MEXENDING): new_ClassD_.cpp +new_ClassD_.$(MEXENDING): new_ClassD_.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) new_ClassD_.cpp -output new_ClassD_ ClassD: new_ClassD_.$(MEXENDING) diff --git a/wrap/tests/expected_namespaces/new_ClassD_.cpp b/wrap/tests/expected_namespaces/new_ClassD_.cpp index 352c470b0..6ebe46f2d 100644 --- a/wrap/tests/expected_namespaces/new_ClassD_.cpp +++ b/wrap/tests/expected_namespaces/new_ClassD_.cpp @@ -36,7 +36,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new ClassD()); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp index 893331034..eca52a3ea 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp @@ -36,7 +36,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new ns1::ClassA()); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp index 047348d1b..5eb90cae8 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp @@ -37,7 +37,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new ns1::ClassB()); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp index cb06bf892..f0e6c2036 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp @@ -37,7 +37,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new ns2::ClassA()); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp index 40c3343ef..ae6a88845 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp @@ -36,7 +36,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new ns2::ClassC()); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp index ace0a261f..bf6e244a2 100644 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp @@ -37,7 +37,6 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) self = new Shared(new ns2::ns3::ClassB()); } collector.insert(self); - std::cout << "constructed " << self << ", size=" << collector.size() << std::endl; out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast (mxGetPr(out[0])) = self; } diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index cdc6e42d6..8fac80113 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -39,6 +39,10 @@ static string topdir = "TOPSRCDIR_NOT_CONFIGURED"; // If TOPSRCDIR is not define typedef vector strvec; +// NOTE: as this path is only used to generate makefiles, it is hardcoded here for testing +// In practice, this path will be an absolute system path, which makes testing it more annoying +static const std::string headerPath = "/not_really_a_real_path/borg/gtsam/wrap"; + /* ************************************************************************* */ TEST( wrap, ArgumentList ) { ArgumentList args; @@ -63,13 +67,13 @@ TEST( wrap, check_exception ) { string path = topdir + "/wrap/tests"; Module module(path.c_str(), "testDependencies",enable_verbose); - CHECK_EXCEPTION(module.matlab_code("mex", "actual_deps", "mexa64", "-O5"), DependencyMissing); + CHECK_EXCEPTION(module.matlab_code("mex", "actual_deps", "mexa64", headerPath, "-O5"), DependencyMissing); } /* ************************************************************************* */ TEST( wrap, parse ) { - string header_path = topdir + "/wrap/tests"; - Module module(header_path.c_str(), "geometry",enable_verbose); + string markup_header_path = topdir + "/wrap/tests"; + Module module(markup_header_path.c_str(), "geometry",enable_verbose); EXPECT_LONGS_EQUAL(3, module.classes.size()); // check using declarations @@ -214,7 +218,7 @@ TEST( wrap, matlab_code_namespaces ) { // emit MATLAB code string exp_path = path + "/tests/expected_namespaces/"; string act_path = "actual_namespaces/"; - module.matlab_code("mex", "actual_namespaces", "mexa64", "-O5"); + module.matlab_code("mex", "actual_namespaces", "mexa64", headerPath, "-O5"); EXPECT(files_equal(exp_path + "new_ClassD_.cpp" , act_path + "new_ClassD_.cpp" )); EXPECT(files_equal(exp_path + "new_ClassD_.m" , act_path + "new_ClassD_.m" )); @@ -255,7 +259,7 @@ TEST( wrap, matlab_code ) { // emit MATLAB code // make_geometry will not compile, use make testwrap to generate real make - module.matlab_code("mex", "actual", "mexa64", "-O5"); + module.matlab_code("mex", "actual", "mexa64", headerPath, "-O5"); string epath = path + "/tests/expected/"; string apath = "actual/"; diff --git a/wrap/wrap.cpp b/wrap/wrap.cpp index 1b1b631e4..f818094f7 100644 --- a/wrap/wrap.cpp +++ b/wrap/wrap.cpp @@ -29,7 +29,7 @@ using namespace std; * @param interfacePath path to where interface file lives, e.g., borg/gtsam * @param moduleName name of the module to be generated e.g. gtsam * @param toolboxPath path where the toolbox should be generated, e.g. borg/gtsam/build - * @param nameSpace e.g. gtsam + * @param headerPath is the path to matlab.h * @param mexFlags extra arguments for mex script, i.e., include flags etc... */ void generate_matlab_toolbox( @@ -58,6 +58,7 @@ void usage() { cerr << " interfacePath : *absolute* path to directory of module interface file" << endl; cerr << " moduleName : the name of the module, interface file must be called moduleName.h" << endl; cerr << " toolboxPath : the directory in which to generate the wrappers" << endl; + cerr << " headerPath : path to matlab.h" << endl; cerr << " [mexFlags] : extra flags for the mex command" << endl; } From f25f5d5b6d5889a6e6079b72a984a814ca0f6562 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 30 Jun 2012 20:40:03 +0000 Subject: [PATCH 522/914] comments --- gtsam/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 7467ad0cf..50ec1d4de 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -138,6 +138,5 @@ if (GTSAM_BUILD_WRAP) # Macro to handle details of setting up targets # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 - # FIXME: rework install commands to specify only certain filetypes/folders to avoid installing temp files wrap_library(gtsam "${mexFlags}" "../") endif () From f06c7ad2e9904e3318c215ac0a77e8adfe70ceae Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 22:32:42 +0000 Subject: [PATCH 523/914] Lots of code de-duplication and cleanup in testGaussianISAM2 --- tests/testGaussianISAM2.cpp | 748 ++++-------------------------------- 1 file changed, 71 insertions(+), 677 deletions(-) diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 7d7db2cfd..2d2f68b71 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -44,7 +44,6 @@ ISAM2 createSlamlikeISAM2( // These variables will be reused and accumulate factors and values ISAM2 isam(params); -// ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, true)); Values fullinit; planarSLAM::Graph fullgraph; @@ -136,7 +135,7 @@ ISAM2 createSlamlikeISAM2( } /* ************************************************************************* */ -TEST_UNSAFE(ISAM2, AddVariables) { +TEST_UNSAFE(ISAM2, ImplAddVariables) { // Create initial state Values theta; @@ -207,7 +206,7 @@ TEST_UNSAFE(ISAM2, AddVariables) { EXPECT(assert_equal(orderingExpected, ordering)); } /* ************************************************************************* */ -TEST_UNSAFE(ISAM2, RemoveVariables) { +TEST_UNSAFE(ISAM2, ImplRemoveVariables) { // Create initial state Values theta; @@ -381,7 +380,11 @@ TEST(ISAM2, optimize2) { } /* ************************************************************************* */ -bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, const ISAM2& isam) { +bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, const ISAM2& isam, Test& test, TestResult& result) { + + TestResult& result_ = result; + const SimpleString name_ = test.getName(); + Values actual = isam.calculateEstimate(); Ordering ordering = isam.getOrdering(); // *fullgraph.orderingCOLAMD(fullinit).first; GaussianFactorGraph linearized = *fullgraph.linearize(fullinit, ordering); @@ -391,488 +394,94 @@ bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, cons VectorValues delta = optimize(gbn); Values expected = fullinit.retract(delta, ordering); - return assert_equal(expected, actual); + bool isamEqual = assert_equal(expected, actual); + + // The following two checks make sure that the cached gradients are maintained and used correctly + + // Check gradient at each node + bool nodeGradientsOk = true; + typedef ISAM2::sharedClique sharedClique; + BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { + // Compute expected gradient + FactorGraph jfg; + jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(jfg, expectedGradient); + // Compare with actual gradients + int variablePosition = 0; + for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { + const int dim = clique->conditional()->dim(jit); + Vector actual = clique->gradientContribution().segment(variablePosition, dim); + bool gradOk = assert_equal(expectedGradient[*jit], actual); + EXPECT(gradOk); + nodeGradientsOk = nodeGradientsOk && gradOk; + variablePosition += dim; + } + bool dimOk = clique->gradientContribution().rows() == variablePosition; + EXPECT(dimOk); + nodeGradientsOk = nodeGradientsOk && dimOk; + } + + // Check gradient + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(FactorGraph(isam), expectedGradient); + VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); + VectorValues actualGradient(*allocateVectorValues(isam)); + gradientAtZero(isam, actualGradient); + bool expectedGradOk = assert_equal(expectedGradient2, expectedGradient); + EXPECT(expectedGradOk); + bool totalGradOk = assert_equal(expectedGradient, actualGradient); + EXPECT(totalGradOk); + + return nodeGradientsOk && expectedGradOk && totalGradOk; } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_gaussnewton) { - // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_dogleg) { // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false)); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false)); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_gaussnewton_qr) { // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, false, ISAM2Params::QR)); Values fullinit; planarSLAM::Graph fullgraph; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, false, ISAM2Params::QR)); - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } - - // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + // Compare solutions + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_dogleg_qr) { // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false, false, ISAM2Params::QR)); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false, false, ISAM2Params::QR)); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ @@ -976,127 +585,20 @@ TEST(ISAM2, removeFactors) // then removes the 2nd-to-last landmark measurement // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; planarSLAM::Graph fullgraph; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); - // i keeps track of the time step - size_t i = 0; + // Remove the 2nd measurement on landmark 0 (Key 100) + FastVector toRemove; + toRemove.push_back(12); + isam.update(planarSLAM::Graph(), Values(), toRemove); - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors[0]); - fullgraph.push_back(newfactors[2]); // Don't add measurement on landmark 0 - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - ISAM2Result result = isam.update(newfactors, init); - ++ i; - - // Remove the measurement on landmark 0 - FastVector toRemove; - EXPECT_LONGS_EQUAL(isam.getFactorsUnsafe().size()-2, result.newFactorsIndices[1]); - toRemove.push_back(result.newFactorsIndices[1]); - isam.update(planarSLAM::Graph(), Values(), toRemove); - } + // Remove the factor from the full system + fullgraph.remove(12); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ @@ -1253,7 +755,7 @@ TEST_UNSAFE(ISAM2, swapFactors) // Compare solutions EXPECT(assert_equal(fullgraph, planarSLAM::Graph(isam.getFactorsUnsafe()))); - EXPECT(isam_check(fullgraph, fullinit, isam)); + EXPECT(isam_check(fullgraph, fullinit, isam, *this, result_)); // Check gradient at each node typedef ISAM2::sharedClique sharedClique; @@ -1313,7 +815,7 @@ TEST(ISAM2, constrained_ordering) isam.update(newfactors, init); } - CHECK(isam_check(fullgraph, fullinit, isam)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); // Add odometry from time 0 to time 5 for( ; i<5; ++i) { @@ -1381,7 +883,7 @@ TEST(ISAM2, constrained_ordering) } // Compare solutions - EXPECT(isam_check(fullgraph, fullinit, isam)); + EXPECT(isam_check(fullgraph, fullinit, isam, *this, result_)); // Check that x3 and x4 are last, but either can come before the other EXPECT(isam.getOrdering()[(3)] == 12 && isam.getOrdering()[(4)] == 13); @@ -1420,122 +922,14 @@ TEST(ISAM2, slamlike_solution_partial_relinearization_check) { // These variables will be reused and accumulate factors and values - ISAM2Params params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false); - params.enablePartialRelinearizationCheck = true; - ISAM2 isam(params); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2Params params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false); + params.enablePartialRelinearizationCheck = true; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, params); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ From 86f19362abbf55dd8658d34b43a6f8b484860785 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 22:32:46 +0000 Subject: [PATCH 524/914] Return FastSet instead of std::set from NonlinearFactorGraph::keys() --- gtsam/nonlinear/NonlinearFactorGraph.cpp | 4 ++-- gtsam/nonlinear/NonlinearFactorGraph.h | 2 +- tests/testNonlinearFactorGraph.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gtsam/nonlinear/NonlinearFactorGraph.cpp b/gtsam/nonlinear/NonlinearFactorGraph.cpp index 8c4076c56..969e40677 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.cpp +++ b/gtsam/nonlinear/NonlinearFactorGraph.cpp @@ -54,8 +54,8 @@ double NonlinearFactorGraph::error(const Values& c) const { } /* ************************************************************************* */ -std::set NonlinearFactorGraph::keys() const { - std::set keys; +FastSet NonlinearFactorGraph::keys() const { + FastSet keys; BOOST_FOREACH(const sharedFactor& factor, this->factors_) { if(factor) keys.insert(factor->begin(), factor->end()); diff --git a/gtsam/nonlinear/NonlinearFactorGraph.h b/gtsam/nonlinear/NonlinearFactorGraph.h index 1742c7b78..85cc0e63f 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.h +++ b/gtsam/nonlinear/NonlinearFactorGraph.h @@ -47,7 +47,7 @@ namespace gtsam { void print(const std::string& str = "NonlinearFactorGraph: ", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; /** return keys as an ordered set - ordering is by key value */ - std::set keys() const; + FastSet keys() const; /** unnormalized error, \f$ 0.5 \sum_i (h_i(X_i)-z)^2/\sigma^2 \f$ in the most common case */ double error(const Values& c) const; diff --git a/tests/testNonlinearFactorGraph.cpp b/tests/testNonlinearFactorGraph.cpp index f44113f93..f677eb0dc 100644 --- a/tests/testNonlinearFactorGraph.cpp +++ b/tests/testNonlinearFactorGraph.cpp @@ -65,9 +65,9 @@ TEST( Graph, error ) TEST( Graph, keys ) { Graph fg = createNonlinearFactorGraph(); - set actual = fg.keys(); + FastSet actual = fg.keys(); LONGS_EQUAL(3, actual.size()); - set::const_iterator it = actual.begin(); + FastSet::const_iterator it = actual.begin(); LONGS_EQUAL(L(1), *(it++)); LONGS_EQUAL(X(1), *(it++)); LONGS_EQUAL(X(2), *(it++)); From 96fc5991db32b808e2624953c13deda02c988f23 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 30 Jun 2012 22:32:49 +0000 Subject: [PATCH 525/914] Automatic removal of unused variables in iSAM2 working in unit tests! --- gtsam/nonlinear/ISAM2-impl.cpp | 25 ++++-- gtsam/nonlinear/ISAM2-impl.h | 9 +- gtsam/nonlinear/ISAM2.cpp | 57 ++++++++++-- gtsam/nonlinear/ISAM2.h | 3 +- tests/testGaussianISAM2.cpp | 159 ++++++--------------------------- 5 files changed, 97 insertions(+), 156 deletions(-) diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 20aacb1e4..5e71ee22b 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -31,7 +31,7 @@ namespace gtsam { void ISAM2::Impl::AddVariables( const Values& newTheta, Values& theta, VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, vector& replacedKeys, - Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter) { + Ordering& ordering, const KeyFormatter& keyFormatter) { const bool debug = ISDEBUG("ISAM2 AddVariables"); theta.insert(newTheta); @@ -58,15 +58,15 @@ void ISAM2::Impl::AddVariables( assert(ordering.nVars() == delta.size()); assert(ordering.size() == delta.size()); } - assert(ordering.nVars() >= nodes.size()); replacedKeys.resize(ordering.nVars(), false); - nodes.resize(ordering.nVars()); } /* ************************************************************************* */ -void ISAM2::Impl::RemoveVariables(const FastSet& unusedKeys, Values& theta, VariableIndex& variableIndex, - VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, - std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes) { +void ISAM2::Impl::RemoveVariables(const FastSet& unusedKeys, const ISAM2Clique::shared_ptr& root, + Values& theta, VariableIndex& variableIndex, + VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, + std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, + GaussianFactorGraph& linearFactors) { // Get indices of unused keys vector unusedIndices; unusedIndices.reserve(unusedKeys.size()); @@ -96,16 +96,18 @@ void ISAM2::Impl::RemoveVariables(const FastSet& unusedKeys, Values& theta, VectorValues newDeltaNewton(dims); VectorValues newDeltaGradSearch(dims); std::vector newReplacedKeys(replacedKeys.size() - unusedIndices.size()); - Base::Nodes newNodes(nodes.size() - unusedIndices.size()); + Base::Nodes newNodes(nodes.size()); // We still keep unused keys at the end until later in ISAM2::recalculate - for(size_t j = 0; j < newNodes.size(); ++j) { + for(size_t j = 0; j < dims.size(); ++j) { newDelta[j] = delta[unusedToEnd[j]]; newDeltaNewton[j] = deltaNewton[unusedToEnd[j]]; newDeltaGradSearch[j] = deltaGradSearch[unusedToEnd[j]]; newReplacedKeys[j] = replacedKeys[unusedToEnd[j]]; - newNodes[j] = nodes[unusedToEnd[j]]; } + // Permute the nodes index so the unused variables are the end + unusedToEnd.applyToCollection(newNodes, nodes); + // Swap the new data structures with the outputs of this function delta.swap(newDelta); deltaNewton.swap(newDeltaNewton); @@ -120,6 +122,11 @@ void ISAM2::Impl::RemoveVariables(const FastSet& unusedKeys, Values& theta, ordering.pop_back(key); theta.erase(key); } + + // Finally, permute references to variables + if(root) + root->permuteWithInverse(unusedToEndInverse); + linearFactors.permuteWithInverse(unusedToEndInverse); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index 69caf7329..b873c87bf 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -48,14 +48,15 @@ struct ISAM2::Impl { */ static void AddVariables(const Values& newTheta, Values& theta, VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, std::vector& replacedKeys, - Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter = DefaultKeyFormatter); + Ordering& ordering, const KeyFormatter& keyFormatter = DefaultKeyFormatter); /** * Remove variables from the ISAM2 system. */ - static void RemoveVariables(const FastSet& unusedKeys, Values& theta, VariableIndex& variableIndex, - VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, - std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes); + static void RemoveVariables(const FastSet& unusedKeys, const ISAM2Clique::shared_ptr& root, + Values& theta, VariableIndex& variableIndex, VectorValues& delta, VectorValues& deltaNewton, + VectorValues& deltaGradSearch, std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, + GaussianFactorGraph& linearFactors); /** * Extract the set of variable indices from a NonlinearFactorGraph. For each Symbol diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 0c3c198aa..e47127edd 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -249,6 +249,9 @@ boost::shared_ptr > ISAM2::recalculate( this->removeTop(markedKeys, affectedBayesNet, orphans); toc(1, "removetop"); + // Now that the top is removed, correct the size of the Nodes index + this->nodes_.resize(delta_.size()); + if(debug) affectedBayesNet.print("Removed top: "); if(debug) orphans.print("Orphans: "); @@ -266,6 +269,14 @@ boost::shared_ptr > ISAM2::recalculate( // ordering provides all keys in conditionals, there cannot be others because path to root included tic(2,"affectedKeys"); FastList affectedKeys = affectedBayesNet.ordering(); + // The removed top also contained removed variables, which will be ordered + // higher than the number of variables in the system since unused variables + // were already removed in ISAM2::update. + for(FastList::iterator key = affectedKeys.begin(); key != affectedKeys.end(); ) + if(*key >= delta_.size()) + affectedKeys.erase(key++); + else + ++key; toc(2,"affectedKeys"); boost::shared_ptr > affectedKeysSet(new FastSet()); // Will return this result @@ -539,15 +550,46 @@ ISAM2Result ISAM2::update( BOOST_FOREACH(size_t index, removeFactorIndices) { removeFactors.push_back(nonlinearFactors_[index]); nonlinearFactors_.remove(index); + if(params_.cacheLinearizedFactors) + linearFactors_.remove(index); } // Remove removed factors from the variable index so we do not attempt to relinearize them variableIndex_.remove(removeFactorIndices, *removeFactors.symbolic(ordering_)); + + // We now need to start keeping track of the marked keys involved in added or + // removed factors. + FastSet markedKeys; + + // Remove unused keys and add keys from removed factors that are still used + // in other factors to markedKeys. + { + // Get keys from removed factors + FastSet removedFactorSymbKeys = removeFactors.keys(); + + // For each key, if still used in other factors, add to markedKeys to be + // recalculated, or if not used, add to unusedKeys to be removed from the + // system. Note that unusedKeys stores Key while markedKeys stores Index. + FastSet unusedKeys; + BOOST_FOREACH(Key key, removedFactorSymbKeys) { + Index index = ordering_[key]; + if(variableIndex_[index].empty()) + unusedKeys.insert(key); + else + markedKeys.insert(index); + } + + // Remove unused keys. We must hold on to the new nodes index for now + // instead of placing it into the tree because removeTop will need to + // update it. + Impl::RemoveVariables(unusedKeys, root_, theta_, variableIndex_, delta_, deltaNewton_, RgProd_, + deltaReplacedMask_, ordering_, Base::nodes_, linearFactors_); + } toc(1,"push_back factors"); tic(2,"add new variables"); // 2. Initialize any new variables \Theta_{new} and add \Theta:=\Theta\cup\Theta_{new}. - Impl::AddVariables(newTheta, theta_, delta_, deltaNewton_, RgProd_, deltaReplacedMask_, ordering_, Base::nodes_); + Impl::AddVariables(newTheta, theta_, delta_, deltaNewton_, RgProd_, deltaReplacedMask_, ordering_); // New keys for detailed results if(params_.enableDetailedResults) { inverseOrdering_ = ordering_.invert(); @@ -561,13 +603,12 @@ ISAM2Result ISAM2::update( tic(4,"gather involved keys"); // 3. Mark linear update - FastSet markedKeys = Impl::IndicesFromFactors(ordering_, newFactors); // Get keys from new factors - // Also mark keys involved in removed factors - { - FastSet markedRemoveKeys = Impl::IndicesFromFactors(ordering_, removeFactors); // Get keys involved in removed factors - markedKeys.insert(markedRemoveKeys.begin(), markedRemoveKeys.end()); // Add to the overall set of marked keys - } - // Observed keys for detailed results + { + FastSet newFactorIndices = Impl::IndicesFromFactors(ordering_, newFactors); // Get keys from new factors + markedKeys.insert(newFactorIndices.begin(), newFactorIndices.end()); + } + + // Observed keys for detailed results if(params_.enableDetailedResults) { BOOST_FOREACH(Index index, markedKeys) { result.detail->variableStatus[inverseOrdering_->at(index)].isObserved = true; diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 2fd3e0b23..1fa893819 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -516,8 +516,7 @@ private: GaussianFactorGraph getCachedBoundaryFactors(Cliques& orphans); boost::shared_ptr > recalculate(const FastSet& markedKeys, const FastSet& relinKeys, - const FastVector& observedKeys, - const boost::optional >& constrainKeys, ISAM2Result& result); + const FastVector& observedKeys, const boost::optional >& constrainKeys, ISAM2Result& result); // void linear_update(const GaussianFactorGraph& newFactors); void updateDelta(bool forceFullSolve = false) const; diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 2d2f68b71..f63d2add5 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -160,8 +160,6 @@ TEST_UNSAFE(ISAM2, ImplAddVariables) { Ordering ordering; ordering += 100, 0; - ISAM2::Nodes nodes(2); - // Verify initial state LONGS_EQUAL(0, ordering[100]); LONGS_EQUAL(1, ordering[0]); @@ -193,10 +191,8 @@ TEST_UNSAFE(ISAM2, ImplAddVariables) { Ordering orderingExpected; orderingExpected += 100, 0, 1; - ISAM2::Nodes nodesExpected(3, ISAM2::sharedClique()); - // Expand initial state - ISAM2::Impl::AddVariables(newTheta, theta, delta, deltaNewton, deltaRg, replacedKeys, ordering, nodes); + ISAM2::Impl::AddVariables(newTheta, theta, delta, deltaNewton, deltaRg, replacedKeys, ordering); EXPECT(assert_equal(thetaExpected, theta)); EXPECT(assert_equal(deltaExpected, delta)); @@ -276,13 +272,15 @@ TEST_UNSAFE(ISAM2, ImplRemoveVariables) { ISAM2::Nodes nodesExpected(2); - // Expand initial state + // Reduce initial state FastSet unusedKeys; unusedKeys.insert(1); vector removedFactorsI; removedFactorsI.push_back(1); SymbolicFactorGraph removedFactors; removedFactors.push_back(sfg[1]); variableIndex.remove(removedFactorsI, removedFactors); - ISAM2::Impl::RemoveVariables(unusedKeys, theta, variableIndex, delta, deltaNewton, deltaRg, replacedKeys, ordering, nodes); + GaussianFactorGraph linearFactors; + ISAM2::Impl::RemoveVariables(unusedKeys, ISAM2::sharedClique(), theta, variableIndex, delta, deltaNewton, deltaRg, + replacedKeys, ordering, nodes, linearFactors); EXPECT(assert_equal(thetaExpected, theta)); EXPECT(assert_equal(variableIndexExpected, variableIndex)); @@ -602,132 +600,27 @@ TEST(ISAM2, removeFactors) } /* ************************************************************************* */ -//TEST(ISAM2, removeVariables) -//{ -// -// // These variables will be reused and accumulate factors and values -// ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); -// Values fullinit; -// planarSLAM::Graph fullgraph; -// -// vector factorsToRemove; -// -// // i keeps track of the time step -// size_t i = 0; -// -// // Add a prior at time 0 and update isam -// { -// planarSLAM::Graph newfactors; -// newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); -// fullgraph.push_back(newfactors); -// -// Values init; -// init.insert((0), Pose2(0.01, 0.01, 0.01)); -// fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); -// -// isam.update(newfactors, init); -// } -// -// CHECK(isam_check(fullgraph, fullinit, isam)); -// -// // Add odometry from time 0 to time 5 -// for( ; i<5; ++i) { -// planarSLAM::Graph newfactors; -// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); -// fullgraph.push_back(newfactors); -// -// Values init; -// init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); -// fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); -// -// isam.update(newfactors, init); -// } -// -// // Add odometry from time 5 to 6 and landmark measurement at time 5 -// { -// planarSLAM::Graph newfactors; -// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); -// newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); -// newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); -// fullgraph.push_back(newfactors); -// -// Values init; -// init.insert((i+1), Pose2(1.01, 0.01, 0.01)); -// init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); -// init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); -// fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); -// fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); -// fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); -// -// ISAM2Result result = isam.update(newfactors, init); -// factorsToRemove.push_back(result.newFactorsIndices[1]); -// ++ i; -// } -// -// // Add odometry from time 6 to time 10 -// for( ; i<10; ++i) { -// planarSLAM::Graph newfactors; -// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); -// fullgraph.push_back(newfactors); -// -// Values init; -// init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); -// fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); -// -// isam.update(newfactors, init); -// } -// -// // Add odometry from time 10 to 11 and landmark measurement at time 10 -// { -// planarSLAM::Graph newfactors; -// newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); -// newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); -// newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); -// fullgraph.push_back(newfactors); -// -// Values init; -// init.insert((i+1), Pose2(6.9, 0.1, 0.01)); -// fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); -// -// ISAM2Result result = isam.update(newfactors, init); -// factorsToRemove.push_back(result.newFactorsIndices[1]); -// ++ i; -// } -// -// // Compare solutions -// fullgraph.remove(factorsToRemove[0]); -// fullgraph.remove(factorsToRemove[1]); -// fullinit.erase(100); -// CHECK(isam_check(fullgraph, fullinit, isam)); -// -// // Check gradient at each node -// typedef ISAM2::sharedClique sharedClique; -// BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { -// // Compute expected gradient -// FactorGraph jfg; -// jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); -// VectorValues expectedGradient(*allocateVectorValues(isam)); -// gradientAtZero(jfg, expectedGradient); -// // Compare with actual gradients -// int variablePosition = 0; -// for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { -// const int dim = clique->conditional()->dim(jit); -// Vector actual = clique->gradientContribution().segment(variablePosition, dim); -// EXPECT(assert_equal(expectedGradient[*jit], actual)); -// variablePosition += dim; -// } -// LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); -// } -// -// // Check gradient -// VectorValues expectedGradient(*allocateVectorValues(isam)); -// gradientAtZero(FactorGraph(isam), expectedGradient); -// VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); -// VectorValues actualGradient(*allocateVectorValues(isam)); -// gradientAtZero(isam, actualGradient); -// EXPECT(assert_equal(expectedGradient2, expectedGradient)); -// EXPECT(assert_equal(expectedGradient, actualGradient)); -//} +TEST_UNSAFE(ISAM2, removeVariables) +{ + // These variables will be reused and accumulate factors and values + Values fullinit; + planarSLAM::Graph fullgraph; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); + + // Remove the measurement on landmark 0 (Key 100) + FastVector toRemove; + toRemove.push_back(7); + toRemove.push_back(14); + isam.update(planarSLAM::Graph(), Values(), toRemove); + + // Remove the factors and variable from the full system + fullgraph.remove(7); + fullgraph.remove(14); + fullinit.erase(100); + + // Compare solutions + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); +} /* ************************************************************************* */ TEST_UNSAFE(ISAM2, swapFactors) From 20cf1da5a9befb39cd37b8d8df38931371a4b19a Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 1 Jul 2012 18:00:33 +0000 Subject: [PATCH 526/914] Merge branch 'master' into new_wrap_local --- CppUnitLite/Test.h | 2 +- gtsam/inference/Permutation.h | 15 +- gtsam/inference/VariableIndex.cpp | 11 + gtsam/inference/VariableIndex.h | 15 + gtsam/inference/tests/testVariableIndex.cpp | 4 +- gtsam/linear/VectorValues.cpp | 14 + gtsam/linear/VectorValues.h | 8 + gtsam/nonlinear/ISAM2-impl.cpp | 72 +- gtsam/nonlinear/ISAM2-impl.h | 10 +- gtsam/nonlinear/ISAM2.cpp | 57 +- gtsam/nonlinear/ISAM2.h | 3 +- gtsam/nonlinear/NonlinearFactorGraph.cpp | 4 +- gtsam/nonlinear/NonlinearFactorGraph.h | 2 +- tests/testGaussianISAM2.cpp | 861 +++++--------------- tests/testNonlinearFactorGraph.cpp | 4 +- 15 files changed, 380 insertions(+), 702 deletions(-) diff --git a/CppUnitLite/Test.h b/CppUnitLite/Test.h index 22566131e..89d96f463 100644 --- a/CppUnitLite/Test.h +++ b/CppUnitLite/Test.h @@ -110,7 +110,7 @@ protected: { try { condition; \ result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Didn't throw: ") + StringFrom(#condition))); \ return; } \ - catch (exception_name& e) {} \ + catch (exception_name&) {} \ catch (...) { \ result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Wrong exception: ") + StringFrom(#condition) + StringFrom(", expected: ") + StringFrom(#exception_name))); \ return; } } diff --git a/gtsam/inference/Permutation.h b/gtsam/inference/Permutation.h index 3a5b9b0da..39c4447d2 100644 --- a/gtsam/inference/Permutation.h +++ b/gtsam/inference/Permutation.h @@ -133,8 +133,8 @@ public: static Permutation PullToFront(const std::vector& toFront, size_t size, bool filterDuplicates = false); /** - * Create a permutation that pulls the given variables to the front while - * pushing the rest to the back. + * Create a permutation that pushes the given variables to the back while + * pulling the rest to the front. */ static Permutation PushToBack(const std::vector& toBack, size_t size, bool filterDuplicates = false); @@ -154,6 +154,17 @@ public: const_iterator begin() const { return rangeIndices_.begin(); } ///< Iterate through the indices const_iterator end() const { return rangeIndices_.end(); } ///< Iterate through the indices + /** Apply the permutation to a collection, which must have operator[] defined. + * Note that permutable gtsam data structures typically have their own + * permute function to apply a permutation. Permutation::applyToCollection is + * a generic function, e.g. for STL classes. + * @param input The input collection. + * @param output The preallocated output collection, which is assigned output[i] = input[permutation[i]] + */ + template + void applyToCollection(OUTPUT_COLLECTION& output, const INPUT_COLLECTION& input) const { + for(size_t i = 0; i < output.size(); ++i) output[i] = input[(*this)[i]]; } + /// @} /// @name Advanced Interface diff --git a/gtsam/inference/VariableIndex.cpp b/gtsam/inference/VariableIndex.cpp index a29d5e432..4e5eb8649 100644 --- a/gtsam/inference/VariableIndex.cpp +++ b/gtsam/inference/VariableIndex.cpp @@ -76,4 +76,15 @@ void VariableIndex::permuteInPlace(const Permutation& permutation) { index_.swap(newIndex); } +/* ************************************************************************* */ +void VariableIndex::removeUnusedAtEnd(size_t nToRemove) { +#ifndef NDEBUG + for(size_t i = this->size() - nToRemove; i < this->size(); ++i) + if(!(*this)[i].empty()) + throw std::invalid_argument("Attempting to remove non-empty variables with VariableIndex::removeUnusedAtEnd()"); +#endif + + index_.resize(this->size() - nToRemove); +} + } diff --git a/gtsam/inference/VariableIndex.h b/gtsam/inference/VariableIndex.h index be47cbd5a..739067dd2 100644 --- a/gtsam/inference/VariableIndex.h +++ b/gtsam/inference/VariableIndex.h @@ -119,6 +119,11 @@ public: /** * Remove entries corresponding to the specified factors. + * NOTE: We intentionally do not decrement nFactors_ because the factor + * indices need to remain consistent. Removing factors from a factor graph + * does not shift the indices of other factors. Also, we keep nFactors_ + * one greater than the highest-numbered factor referenced in a VariableIndex. + * * @param indices The indices of the factors to remove, which must match \c factors * @param factors The factors being removed, which must symbolically correspond * exactly to the factors with the specified \c indices that were added. @@ -128,6 +133,12 @@ public: /// Permute the variables in the VariableIndex according to the given permutation void permuteInPlace(const Permutation& permutation); + /** Remove unused empty variables at the end of the ordering (in debug mode + * verifies they are empty). + * @param nToRemove The number of unused variables at the end to remove + */ + void removeUnusedAtEnd(size_t nToRemove); + protected: Factor_iterator factorsBegin(Index variable) { checkVar(variable); return index_[variable].begin(); } /// void VariableIndex::remove(const CONTAINER& indices, const FactorGraph& factors) { + // NOTE: We intentionally do not decrement nFactors_ because the factor + // indices need to remain consistent. Removing factors from a factor graph + // does not shift the indices of other factors. Also, we keep nFactors_ + // one greater than the highest-numbered factor referenced in a VariableIndex. for(size_t fi=0; fikeys().size(); ++ji) { diff --git a/gtsam/inference/tests/testVariableIndex.cpp b/gtsam/inference/tests/testVariableIndex.cpp index 7c8e6fa9e..412b3fa04 100644 --- a/gtsam/inference/tests/testVariableIndex.cpp +++ b/gtsam/inference/tests/testVariableIndex.cpp @@ -44,7 +44,9 @@ TEST(VariableIndex, augment) { VariableIndex actual(fg1); actual.augment(fg2); - CHECK(assert_equal(expected, actual)); + LONGS_EQUAL(16, actual.nEntries()); + LONGS_EQUAL(8, actual.nFactors()); + EXPECT(assert_equal(expected, actual)); } /* ************************************************************************* */ diff --git a/gtsam/linear/VectorValues.cpp b/gtsam/linear/VectorValues.cpp index 15925c644..fd7f2757c 100644 --- a/gtsam/linear/VectorValues.cpp +++ b/gtsam/linear/VectorValues.cpp @@ -45,6 +45,14 @@ VectorValues VectorValues::Zero(const VectorValues& x) { return cloned; } +/* ************************************************************************* */ +vector VectorValues::dims() const { + std::vector result(this->size()); + for(Index j = 0; j < this->size(); ++j) + result[j] = this->dim(j); + return result; +} + /* ************************************************************************* */ void VectorValues::insert(Index j, const Vector& value) { // Make sure j does not already exist @@ -188,4 +196,10 @@ VectorValues VectorValues::permute(const Permutation& permutation) const { return lhs; } +/* ************************************************************************* */ +void VectorValues::swap(VectorValues& other) { + this->values_.swap(other.values_); + this->maps_.swap(other.maps_); +} + } \ No newline at end of file diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index 463080db9..aa9c1aa6d 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -134,6 +134,9 @@ namespace gtsam { /** Return the summed dimensionality of all variables. */ size_t dim() const { return values_.rows(); } + /** Return the dimension of each vector in this container */ + std::vector dims() const; + /** Check whether a variable with index \c j exists. */ bool exists(Index j) const { return j < size() && maps_[j].rows() > 0; } @@ -296,6 +299,11 @@ namespace gtsam { */ VectorValues permute(const Permutation& permutation) const; + /** + * Swap the data in this VectorValues with another. + */ + void swap(VectorValues& other); + /// @} private: diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 3c373e0ba..5e71ee22b 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -31,7 +31,7 @@ namespace gtsam { void ISAM2::Impl::AddVariables( const Values& newTheta, Values& theta, VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, vector& replacedKeys, - Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter) { + Ordering& ordering, const KeyFormatter& keyFormatter) { const bool debug = ISDEBUG("ISAM2 AddVariables"); theta.insert(newTheta); @@ -58,9 +58,75 @@ void ISAM2::Impl::AddVariables( assert(ordering.nVars() == delta.size()); assert(ordering.size() == delta.size()); } - assert(ordering.nVars() >= nodes.size()); replacedKeys.resize(ordering.nVars(), false); - nodes.resize(ordering.nVars()); +} + +/* ************************************************************************* */ +void ISAM2::Impl::RemoveVariables(const FastSet& unusedKeys, const ISAM2Clique::shared_ptr& root, + Values& theta, VariableIndex& variableIndex, + VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, + std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, + GaussianFactorGraph& linearFactors) { + + // Get indices of unused keys + vector unusedIndices; unusedIndices.reserve(unusedKeys.size()); + BOOST_FOREACH(Key key, unusedKeys) { unusedIndices.push_back(ordering[key]); } + + // Create a permutation that shifts the unused variables to the end + Permutation unusedToEnd = Permutation::PushToBack(unusedIndices, delta.size()); + Permutation unusedToEndInverse = *unusedToEnd.inverse(); + + // Use the permutation to remove unused variables while shifting all the others to take up the space + variableIndex.permuteInPlace(unusedToEnd); + variableIndex.removeUnusedAtEnd(unusedIndices.size()); + { + // Create a vector of variable dimensions with the unused ones removed + // by applying the unusedToEnd permutation to the original vector of + // variable dimensions. We only allocate space in the shifted dims + // vector for the used variables, so that the unused ones are dropped + // when the permutation is applied. + vector originalDims = delta.dims(); + vector dims(delta.size() - unusedIndices.size()); + unusedToEnd.applyToCollection(dims, originalDims); + + // Copy from the old data structures to new ones, only iterating up to + // the number of used variables, and applying the unusedToEnd permutation + // in order to remove the unused variables. + VectorValues newDelta(dims); + VectorValues newDeltaNewton(dims); + VectorValues newDeltaGradSearch(dims); + std::vector newReplacedKeys(replacedKeys.size() - unusedIndices.size()); + Base::Nodes newNodes(nodes.size()); // We still keep unused keys at the end until later in ISAM2::recalculate + + for(size_t j = 0; j < dims.size(); ++j) { + newDelta[j] = delta[unusedToEnd[j]]; + newDeltaNewton[j] = deltaNewton[unusedToEnd[j]]; + newDeltaGradSearch[j] = deltaGradSearch[unusedToEnd[j]]; + newReplacedKeys[j] = replacedKeys[unusedToEnd[j]]; + } + + // Permute the nodes index so the unused variables are the end + unusedToEnd.applyToCollection(newNodes, nodes); + + // Swap the new data structures with the outputs of this function + delta.swap(newDelta); + deltaNewton.swap(newDeltaNewton); + deltaGradSearch.swap(newDeltaGradSearch); + replacedKeys.swap(newReplacedKeys); + nodes.swap(newNodes); + } + + // Reorder and remove from ordering and solution + ordering.permuteWithInverse(unusedToEndInverse); + BOOST_REVERSE_FOREACH(Key key, unusedKeys) { + ordering.pop_back(key); + theta.erase(key); + } + + // Finally, permute references to variables + if(root) + root->permuteWithInverse(unusedToEndInverse); + linearFactors.permuteWithInverse(unusedToEndInverse); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/ISAM2-impl.h b/gtsam/nonlinear/ISAM2-impl.h index fdb39d855..b873c87bf 100644 --- a/gtsam/nonlinear/ISAM2-impl.h +++ b/gtsam/nonlinear/ISAM2-impl.h @@ -48,8 +48,16 @@ struct ISAM2::Impl { */ static void AddVariables(const Values& newTheta, Values& theta, VectorValues& delta, VectorValues& deltaNewton, VectorValues& deltaGradSearch, std::vector& replacedKeys, - Ordering& ordering, Base::Nodes& nodes, const KeyFormatter& keyFormatter = DefaultKeyFormatter); + Ordering& ordering, const KeyFormatter& keyFormatter = DefaultKeyFormatter); + /** + * Remove variables from the ISAM2 system. + */ + static void RemoveVariables(const FastSet& unusedKeys, const ISAM2Clique::shared_ptr& root, + Values& theta, VariableIndex& variableIndex, VectorValues& delta, VectorValues& deltaNewton, + VectorValues& deltaGradSearch, std::vector& replacedKeys, Ordering& ordering, Base::Nodes& nodes, + GaussianFactorGraph& linearFactors); + /** * Extract the set of variable indices from a NonlinearFactorGraph. For each Symbol * in each NonlinearFactor, obtains the index by calling ordering[symbol]. diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 0c3c198aa..e47127edd 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -249,6 +249,9 @@ boost::shared_ptr > ISAM2::recalculate( this->removeTop(markedKeys, affectedBayesNet, orphans); toc(1, "removetop"); + // Now that the top is removed, correct the size of the Nodes index + this->nodes_.resize(delta_.size()); + if(debug) affectedBayesNet.print("Removed top: "); if(debug) orphans.print("Orphans: "); @@ -266,6 +269,14 @@ boost::shared_ptr > ISAM2::recalculate( // ordering provides all keys in conditionals, there cannot be others because path to root included tic(2,"affectedKeys"); FastList affectedKeys = affectedBayesNet.ordering(); + // The removed top also contained removed variables, which will be ordered + // higher than the number of variables in the system since unused variables + // were already removed in ISAM2::update. + for(FastList::iterator key = affectedKeys.begin(); key != affectedKeys.end(); ) + if(*key >= delta_.size()) + affectedKeys.erase(key++); + else + ++key; toc(2,"affectedKeys"); boost::shared_ptr > affectedKeysSet(new FastSet()); // Will return this result @@ -539,15 +550,46 @@ ISAM2Result ISAM2::update( BOOST_FOREACH(size_t index, removeFactorIndices) { removeFactors.push_back(nonlinearFactors_[index]); nonlinearFactors_.remove(index); + if(params_.cacheLinearizedFactors) + linearFactors_.remove(index); } // Remove removed factors from the variable index so we do not attempt to relinearize them variableIndex_.remove(removeFactorIndices, *removeFactors.symbolic(ordering_)); + + // We now need to start keeping track of the marked keys involved in added or + // removed factors. + FastSet markedKeys; + + // Remove unused keys and add keys from removed factors that are still used + // in other factors to markedKeys. + { + // Get keys from removed factors + FastSet removedFactorSymbKeys = removeFactors.keys(); + + // For each key, if still used in other factors, add to markedKeys to be + // recalculated, or if not used, add to unusedKeys to be removed from the + // system. Note that unusedKeys stores Key while markedKeys stores Index. + FastSet unusedKeys; + BOOST_FOREACH(Key key, removedFactorSymbKeys) { + Index index = ordering_[key]; + if(variableIndex_[index].empty()) + unusedKeys.insert(key); + else + markedKeys.insert(index); + } + + // Remove unused keys. We must hold on to the new nodes index for now + // instead of placing it into the tree because removeTop will need to + // update it. + Impl::RemoveVariables(unusedKeys, root_, theta_, variableIndex_, delta_, deltaNewton_, RgProd_, + deltaReplacedMask_, ordering_, Base::nodes_, linearFactors_); + } toc(1,"push_back factors"); tic(2,"add new variables"); // 2. Initialize any new variables \Theta_{new} and add \Theta:=\Theta\cup\Theta_{new}. - Impl::AddVariables(newTheta, theta_, delta_, deltaNewton_, RgProd_, deltaReplacedMask_, ordering_, Base::nodes_); + Impl::AddVariables(newTheta, theta_, delta_, deltaNewton_, RgProd_, deltaReplacedMask_, ordering_); // New keys for detailed results if(params_.enableDetailedResults) { inverseOrdering_ = ordering_.invert(); @@ -561,13 +603,12 @@ ISAM2Result ISAM2::update( tic(4,"gather involved keys"); // 3. Mark linear update - FastSet markedKeys = Impl::IndicesFromFactors(ordering_, newFactors); // Get keys from new factors - // Also mark keys involved in removed factors - { - FastSet markedRemoveKeys = Impl::IndicesFromFactors(ordering_, removeFactors); // Get keys involved in removed factors - markedKeys.insert(markedRemoveKeys.begin(), markedRemoveKeys.end()); // Add to the overall set of marked keys - } - // Observed keys for detailed results + { + FastSet newFactorIndices = Impl::IndicesFromFactors(ordering_, newFactors); // Get keys from new factors + markedKeys.insert(newFactorIndices.begin(), newFactorIndices.end()); + } + + // Observed keys for detailed results if(params_.enableDetailedResults) { BOOST_FOREACH(Index index, markedKeys) { result.detail->variableStatus[inverseOrdering_->at(index)].isObserved = true; diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 2fd3e0b23..1fa893819 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -516,8 +516,7 @@ private: GaussianFactorGraph getCachedBoundaryFactors(Cliques& orphans); boost::shared_ptr > recalculate(const FastSet& markedKeys, const FastSet& relinKeys, - const FastVector& observedKeys, - const boost::optional >& constrainKeys, ISAM2Result& result); + const FastVector& observedKeys, const boost::optional >& constrainKeys, ISAM2Result& result); // void linear_update(const GaussianFactorGraph& newFactors); void updateDelta(bool forceFullSolve = false) const; diff --git a/gtsam/nonlinear/NonlinearFactorGraph.cpp b/gtsam/nonlinear/NonlinearFactorGraph.cpp index 8c4076c56..969e40677 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.cpp +++ b/gtsam/nonlinear/NonlinearFactorGraph.cpp @@ -54,8 +54,8 @@ double NonlinearFactorGraph::error(const Values& c) const { } /* ************************************************************************* */ -std::set NonlinearFactorGraph::keys() const { - std::set keys; +FastSet NonlinearFactorGraph::keys() const { + FastSet keys; BOOST_FOREACH(const sharedFactor& factor, this->factors_) { if(factor) keys.insert(factor->begin(), factor->end()); diff --git a/gtsam/nonlinear/NonlinearFactorGraph.h b/gtsam/nonlinear/NonlinearFactorGraph.h index 1742c7b78..85cc0e63f 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.h +++ b/gtsam/nonlinear/NonlinearFactorGraph.h @@ -47,7 +47,7 @@ namespace gtsam { void print(const std::string& str = "NonlinearFactorGraph: ", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; /** return keys as an ordered set - ordering is by key value */ - std::set keys() const; + FastSet keys() const; /** unnormalized error, \f$ 0.5 \sum_i (h_i(X_i)-z)^2/\sigma^2 \f$ in the most common case */ double error(const Values& c) const; diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 994077777..f63d2add5 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -43,7 +44,6 @@ ISAM2 createSlamlikeISAM2( // These variables will be reused and accumulate factors and values ISAM2 isam(params); -// ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, true)); Values fullinit; planarSLAM::Graph fullgraph; @@ -135,7 +135,7 @@ ISAM2 createSlamlikeISAM2( } /* ************************************************************************* */ -TEST_UNSAFE(ISAM2, AddVariables) { +TEST_UNSAFE(ISAM2, ImplAddVariables) { // Create initial state Values theta; @@ -160,8 +160,6 @@ TEST_UNSAFE(ISAM2, AddVariables) { Ordering ordering; ordering += 100, 0; - ISAM2::Nodes nodes(2); - // Verify initial state LONGS_EQUAL(0, ordering[100]); LONGS_EQUAL(1, ordering[0]); @@ -193,10 +191,8 @@ TEST_UNSAFE(ISAM2, AddVariables) { Ordering orderingExpected; orderingExpected += 100, 0, 1; - ISAM2::Nodes nodesExpected(3, ISAM2::sharedClique()); - // Expand initial state - ISAM2::Impl::AddVariables(newTheta, theta, delta, deltaNewton, deltaRg, replacedKeys, ordering, nodes); + ISAM2::Impl::AddVariables(newTheta, theta, delta, deltaNewton, deltaRg, replacedKeys, ordering); EXPECT(assert_equal(thetaExpected, theta)); EXPECT(assert_equal(deltaExpected, delta)); @@ -205,6 +201,95 @@ TEST_UNSAFE(ISAM2, AddVariables) { EXPECT(assert_container_equality(replacedKeysExpected, replacedKeys)); EXPECT(assert_equal(orderingExpected, ordering)); } +/* ************************************************************************* */ +TEST_UNSAFE(ISAM2, ImplRemoveVariables) { + + // Create initial state + Values theta; + theta.insert(0, Pose2(.1, .2, .3)); + theta.insert(1, Pose2(.6, .7, .8)); + theta.insert(100, Point2(.4, .5)); + + SymbolicFactorGraph sfg; + sfg.push_back(boost::make_shared(Index(0), Index(2))); + sfg.push_back(boost::make_shared(Index(0), Index(1))); + VariableIndex variableIndex(sfg); + + VectorValues delta; + delta.insert(0, Vector_(3, .1, .2, .3)); + delta.insert(1, Vector_(3, .4, .5, .6)); + delta.insert(2, Vector_(2, .7, .8)); + + VectorValues deltaNewton; + deltaNewton.insert(0, Vector_(3, .1, .2, .3)); + deltaNewton.insert(1, Vector_(3, .4, .5, .6)); + deltaNewton.insert(2, Vector_(2, .7, .8)); + + VectorValues deltaRg; + deltaRg.insert(0, Vector_(3, .1, .2, .3)); + deltaRg.insert(1, Vector_(3, .4, .5, .6)); + deltaRg.insert(2, Vector_(2, .7, .8)); + + vector replacedKeys(3, false); + replacedKeys[0] = true; + replacedKeys[1] = false; + replacedKeys[2] = true; + + Ordering ordering; ordering += 100, 1, 0; + + ISAM2::Nodes nodes(3); + + // Verify initial state + LONGS_EQUAL(0, ordering[100]); + LONGS_EQUAL(1, ordering[1]); + LONGS_EQUAL(2, ordering[0]); + + // Create expected state + Values thetaExpected; + thetaExpected.insert(0, Pose2(.1, .2, .3)); + thetaExpected.insert(100, Point2(.4, .5)); + + SymbolicFactorGraph sfgRemoved; + sfgRemoved.push_back(boost::make_shared(Index(0), Index(1))); + sfgRemoved.push_back(SymbolicFactorGraph::sharedFactor()); // Add empty factor to keep factor indices consistent + VariableIndex variableIndexExpected(sfgRemoved); + + VectorValues deltaExpected; + deltaExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaExpected.insert(1, Vector_(2, .7, .8)); + + VectorValues deltaNewtonExpected; + deltaNewtonExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaNewtonExpected.insert(1, Vector_(2, .7, .8)); + + VectorValues deltaRgExpected; + deltaRgExpected.insert(0, Vector_(3, .1, .2, .3)); + deltaRgExpected.insert(1, Vector_(2, .7, .8)); + + vector replacedKeysExpected(2, true); + + Ordering orderingExpected; orderingExpected += 100, 0; + + ISAM2::Nodes nodesExpected(2); + + // Reduce initial state + FastSet unusedKeys; + unusedKeys.insert(1); + vector removedFactorsI; removedFactorsI.push_back(1); + SymbolicFactorGraph removedFactors; removedFactors.push_back(sfg[1]); + variableIndex.remove(removedFactorsI, removedFactors); + GaussianFactorGraph linearFactors; + ISAM2::Impl::RemoveVariables(unusedKeys, ISAM2::sharedClique(), theta, variableIndex, delta, deltaNewton, deltaRg, + replacedKeys, ordering, nodes, linearFactors); + + EXPECT(assert_equal(thetaExpected, theta)); + EXPECT(assert_equal(variableIndexExpected, variableIndex)); + EXPECT(assert_equal(deltaExpected, delta)); + EXPECT(assert_equal(deltaNewtonExpected, deltaNewton)); + EXPECT(assert_equal(deltaRgExpected, deltaRg)); + EXPECT(assert_container_equality(replacedKeysExpected, replacedKeys)); + EXPECT(assert_equal(orderingExpected, ordering)); +} /* ************************************************************************* */ //TEST(ISAM2, IndicesFromFactors) { @@ -293,7 +378,11 @@ TEST(ISAM2, optimize2) { } /* ************************************************************************* */ -bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, const ISAM2& isam) { +bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, const ISAM2& isam, Test& test, TestResult& result) { + + TestResult& result_ = result; + const SimpleString name_ = test.getName(); + Values actual = isam.calculateEstimate(); Ordering ordering = isam.getOrdering(); // *fullgraph.orderingCOLAMD(fullinit).first; GaussianFactorGraph linearized = *fullgraph.linearize(fullinit, ordering); @@ -303,488 +392,94 @@ bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, cons VectorValues delta = optimize(gbn); Values expected = fullinit.retract(delta, ordering); - return assert_equal(expected, actual); + bool isamEqual = assert_equal(expected, actual); + + // The following two checks make sure that the cached gradients are maintained and used correctly + + // Check gradient at each node + bool nodeGradientsOk = true; + typedef ISAM2::sharedClique sharedClique; + BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { + // Compute expected gradient + FactorGraph jfg; + jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(jfg, expectedGradient); + // Compare with actual gradients + int variablePosition = 0; + for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { + const int dim = clique->conditional()->dim(jit); + Vector actual = clique->gradientContribution().segment(variablePosition, dim); + bool gradOk = assert_equal(expectedGradient[*jit], actual); + EXPECT(gradOk); + nodeGradientsOk = nodeGradientsOk && gradOk; + variablePosition += dim; + } + bool dimOk = clique->gradientContribution().rows() == variablePosition; + EXPECT(dimOk); + nodeGradientsOk = nodeGradientsOk && dimOk; + } + + // Check gradient + VectorValues expectedGradient(*allocateVectorValues(isam)); + gradientAtZero(FactorGraph(isam), expectedGradient); + VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); + VectorValues actualGradient(*allocateVectorValues(isam)); + gradientAtZero(isam, actualGradient); + bool expectedGradOk = assert_equal(expectedGradient2, expectedGradient); + EXPECT(expectedGradOk); + bool totalGradOk = assert_equal(expectedGradient, actualGradient); + EXPECT(totalGradOk); + + return nodeGradientsOk && expectedGradOk && totalGradOk; } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_gaussnewton) { - // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_dogleg) { // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false)); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false)); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_gaussnewton_qr) { // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, false, ISAM2Params::QR)); Values fullinit; planarSLAM::Graph fullgraph; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, false, ISAM2Params::QR)); - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } - - // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + // Compare solutions + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ TEST(ISAM2, slamlike_solution_dogleg_qr) { // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false, false, ISAM2Params::QR)); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false, false, ISAM2Params::QR)); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ @@ -888,127 +583,43 @@ TEST(ISAM2, removeFactors) // then removes the 2nd-to-last landmark measurement // These variables will be reused and accumulate factors and values - ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; planarSLAM::Graph fullgraph; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); - // i keeps track of the time step - size_t i = 0; + // Remove the 2nd measurement on landmark 0 (Key 100) + FastVector toRemove; + toRemove.push_back(12); + isam.update(planarSLAM::Graph(), Values(), toRemove); - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors[0]); - fullgraph.push_back(newfactors[2]); // Don't add measurement on landmark 0 - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - ISAM2Result result = isam.update(newfactors, init); - ++ i; - - // Remove the measurement on landmark 0 - FastVector toRemove; - EXPECT_LONGS_EQUAL(isam.getFactorsUnsafe().size()-2, result.newFactorsIndices[1]); - toRemove.push_back(result.newFactorsIndices[1]); - isam.update(planarSLAM::Graph(), Values(), toRemove); - } + // Remove the factor from the full system + fullgraph.remove(12); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); +} - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } +/* ************************************************************************* */ +TEST_UNSAFE(ISAM2, removeVariables) +{ + // These variables will be reused and accumulate factors and values + Values fullinit; + planarSLAM::Graph fullgraph; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + // Remove the measurement on landmark 0 (Key 100) + FastVector toRemove; + toRemove.push_back(7); + toRemove.push_back(14); + isam.update(planarSLAM::Graph(), Values(), toRemove); + + // Remove the factors and variable from the full system + fullgraph.remove(7); + fullgraph.remove(14); + fullinit.erase(100); + + // Compare solutions + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ @@ -1037,7 +648,7 @@ TEST_UNSAFE(ISAM2, swapFactors) // Compare solutions EXPECT(assert_equal(fullgraph, planarSLAM::Graph(isam.getFactorsUnsafe()))); - EXPECT(isam_check(fullgraph, fullinit, isam)); + EXPECT(isam_check(fullgraph, fullinit, isam, *this, result_)); // Check gradient at each node typedef ISAM2::sharedClique sharedClique; @@ -1097,7 +708,7 @@ TEST(ISAM2, constrained_ordering) isam.update(newfactors, init); } - CHECK(isam_check(fullgraph, fullinit, isam)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); // Add odometry from time 0 to time 5 for( ; i<5; ++i) { @@ -1165,7 +776,7 @@ TEST(ISAM2, constrained_ordering) } // Compare solutions - EXPECT(isam_check(fullgraph, fullinit, isam)); + EXPECT(isam_check(fullgraph, fullinit, isam, *this, result_)); // Check that x3 and x4 are last, but either can come before the other EXPECT(isam.getOrdering()[(3)] == 12 && isam.getOrdering()[(4)] == 13); @@ -1204,122 +815,14 @@ TEST(ISAM2, slamlike_solution_partial_relinearization_check) { // These variables will be reused and accumulate factors and values - ISAM2Params params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false); - params.enablePartialRelinearizationCheck = true; - ISAM2 isam(params); Values fullinit; planarSLAM::Graph fullgraph; - - // i keeps track of the time step - size_t i = 0; - - // Add a prior at time 0 and update isam - { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((0), Pose2(0.01, 0.01, 0.01)); - fullinit.insert((0), Pose2(0.01, 0.01, 0.01)); - - isam.update(newfactors, init); - } - - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Add odometry from time 0 to time 5 - for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 5 to 6 and landmark measurement at time 5 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(1.01, 0.01, 0.01)); - init.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - init.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - fullinit.insert((i+1), Pose2(1.01, 0.01, 0.01)); - fullinit.insert(100, Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); - fullinit.insert(101, Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); - - isam.update(newfactors, init); - ++ i; - } - - // Add odometry from time 6 to time 10 - for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - fullinit.insert((i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); - - isam.update(newfactors, init); - } - - // Add odometry from time 10 to 11 and landmark measurement at time 10 - { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - fullgraph.push_back(newfactors); - - Values init; - init.insert((i+1), Pose2(6.9, 0.1, 0.01)); - fullinit.insert((i+1), Pose2(6.9, 0.1, 0.01)); - - isam.update(newfactors, init); - ++ i; - } + ISAM2Params params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false); + params.enablePartialRelinearizationCheck = true; + ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, params); // Compare solutions - CHECK(isam_check(fullgraph, fullinit, isam)); - - // Check gradient at each node - typedef ISAM2::sharedClique sharedClique; - BOOST_FOREACH(const sharedClique& clique, isam.nodes()) { - // Compute expected gradient - FactorGraph jfg; - jfg.push_back(JacobianFactor::shared_ptr(new JacobianFactor(*clique->conditional()))); - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(jfg, expectedGradient); - // Compare with actual gradients - int variablePosition = 0; - for(GaussianConditional::const_iterator jit = clique->conditional()->begin(); jit != clique->conditional()->end(); ++jit) { - const int dim = clique->conditional()->dim(jit); - Vector actual = clique->gradientContribution().segment(variablePosition, dim); - EXPECT(assert_equal(expectedGradient[*jit], actual)); - variablePosition += dim; - } - LONGS_EQUAL(clique->gradientContribution().rows(), variablePosition); - } - - // Check gradient - VectorValues expectedGradient(*allocateVectorValues(isam)); - gradientAtZero(FactorGraph(isam), expectedGradient); - VectorValues expectedGradient2(gradient(FactorGraph(isam), VectorValues::Zero(expectedGradient))); - VectorValues actualGradient(*allocateVectorValues(isam)); - gradientAtZero(isam, actualGradient); - EXPECT(assert_equal(expectedGradient2, expectedGradient)); - EXPECT(assert_equal(expectedGradient, actualGradient)); + CHECK(isam_check(fullgraph, fullinit, isam, *this, result_)); } /* ************************************************************************* */ diff --git a/tests/testNonlinearFactorGraph.cpp b/tests/testNonlinearFactorGraph.cpp index f44113f93..f677eb0dc 100644 --- a/tests/testNonlinearFactorGraph.cpp +++ b/tests/testNonlinearFactorGraph.cpp @@ -65,9 +65,9 @@ TEST( Graph, error ) TEST( Graph, keys ) { Graph fg = createNonlinearFactorGraph(); - set actual = fg.keys(); + FastSet actual = fg.keys(); LONGS_EQUAL(3, actual.size()); - set::const_iterator it = actual.begin(); + FastSet::const_iterator it = actual.begin(); LONGS_EQUAL(L(1), *(it++)); LONGS_EQUAL(X(1), *(it++)); LONGS_EQUAL(X(2), *(it++)); From 9273c3d18cdec741cbdd287d93c93eb87bc76365 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 1 Jul 2012 18:00:35 +0000 Subject: [PATCH 527/914] Added minimal output to wrap generation --- wrap/FileWriter.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wrap/FileWriter.cpp b/wrap/FileWriter.cpp index ae474be0a..38abf2488 100644 --- a/wrap/FileWriter.cpp +++ b/wrap/FileWriter.cpp @@ -46,6 +46,10 @@ void FileWriter::emit(bool add_header, bool force_overwrite) const { ofs << new_contents; ofs.close(); if (verbose_) cerr << " ...complete" << endl; + + // Add small message whenever writing a new file and not running in full verbose mode + if (!verbose_) + cout << "wrap: generating " << filename_ << endl; } else { if (verbose_) cerr << " ...no update" << endl; } From 8da8b4dca2cf31b25030166fbbf2fd8ecc86588d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 2 Jul 2012 02:14:44 +0000 Subject: [PATCH 528/914] Small rename of template arguments to clarify --- gtsam/inference/FactorGraph-inl.h | 6 +++--- gtsam/inference/FactorGraph.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index caf18d60e..66c44db52 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -108,15 +108,15 @@ namespace gtsam { } /* ************************************************************************* */ - template - typename DERIVED::shared_ptr Combine(const FactorGraph& factors, + template + typename DERIVEDFACTOR::shared_ptr Combine(const FactorGraph& factors, const FastMap >& variableSlots) { typedef const std::pair > KeySlotPair; // Local functional for getting keys out of key-value pairs struct Local { static KEY FirstOf(const KeySlotPair& pr) { return pr.first; } }; - return typename DERIVED::shared_ptr(new DERIVED( + return typename DERIVEDFACTOR::shared_ptr(new DERIVEDFACTOR( boost::make_transform_iterator(variableSlots.begin(), &Local::FirstOf), boost::make_transform_iterator(variableSlots.end(), &Local::FirstOf))); } diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index d0b9952d5..5295a4c58 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -215,8 +215,8 @@ template class BayesTree; }; // FactorGraph /** Create a combined joint factor (new style for EliminationTree). */ - template - typename DERIVED::shared_ptr Combine(const FactorGraph& factors, + template + typename DERIVEDFACTOR::shared_ptr Combine(const FactorGraph& factors, const FastMap >& variableSlots); /** From 747342ffdae9126173dc53955555828afc96c315 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 2 Jul 2012 15:01:28 +0000 Subject: [PATCH 529/914] Changed some printing details, prompted by MATLAB display --- gtsam.h | 4 ++-- gtsam/geometry/Pose3.cpp | 5 +++-- gtsam/nonlinear/NonlinearEquality.h | 4 ++-- gtsam/nonlinear/NonlinearFactor.h | 2 +- gtsam/nonlinear/Values.cpp | 2 +- gtsam/slam/BearingFactor.h | 7 +++++++ gtsam/slam/BearingRangeFactor.h | 8 ++++---- gtsam/slam/ProjectionFactor.h | 7 ++++--- gtsam/slam/RangeFactor.h | 3 ++- 9 files changed, 26 insertions(+), 16 deletions(-) diff --git a/gtsam.h b/gtsam.h index 6858e4d65..2a1e5c0b3 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1267,10 +1267,10 @@ class ISAM { class LevenbergMarquardtOptimizer { double lambda() const; void iterate(); - visualSLAM::Values optimize(); - visualSLAM::Values optimizeSafely(); double error() const; size_t iterations() const; + visualSLAM::Values optimize(); + visualSLAM::Values optimizeSafely(); visualSLAM::Values values() const; }; diff --git a/gtsam/geometry/Pose3.cpp b/gtsam/geometry/Pose3.cpp index 59e5ceef5..be9869030 100644 --- a/gtsam/geometry/Pose3.cpp +++ b/gtsam/geometry/Pose3.cpp @@ -55,8 +55,9 @@ namespace gtsam { /* ************************************************************************* */ void Pose3::print(const string& s) const { - R_.print(s + ".R"); - t_.print(s + ".t"); + cout << s; + R_.print("R:\n"); + t_.print("t: "); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/NonlinearEquality.h b/gtsam/nonlinear/NonlinearEquality.h index e5f419ff4..e4a628b85 100644 --- a/gtsam/nonlinear/NonlinearEquality.h +++ b/gtsam/nonlinear/NonlinearEquality.h @@ -109,8 +109,8 @@ namespace gtsam { /// @{ virtual void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - std::cout << "Constraint: " << s << " on [" << keyFormatter(this->key()) << "]\n"; - gtsam::print(feasible_,"Feasible Point"); + std::cout << s << "Constraint: on [" << keyFormatter(this->key()) << "]\n"; + gtsam::print(feasible_,"Feasible Point:\n"); std::cout << "Variable Dimension: " << feasible_.dim() << std::endl; } diff --git a/gtsam/nonlinear/NonlinearFactor.h b/gtsam/nonlinear/NonlinearFactor.h index 21e3d17d7..ad10b3ee0 100644 --- a/gtsam/nonlinear/NonlinearFactor.h +++ b/gtsam/nonlinear/NonlinearFactor.h @@ -99,7 +99,7 @@ public: /** print */ virtual void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - std::cout << s << "keys = { "; + std::cout << s << " keys = { "; BOOST_FOREACH(Key key, this->keys()) { std::cout << keyFormatter(key) << " "; } std::cout << "}" << std::endl; } diff --git a/gtsam/nonlinear/Values.cpp b/gtsam/nonlinear/Values.cpp index 58099d149..636c87c73 100644 --- a/gtsam/nonlinear/Values.cpp +++ b/gtsam/nonlinear/Values.cpp @@ -43,7 +43,7 @@ namespace gtsam { void Values::print(const string& str, const KeyFormatter& keyFormatter) const { cout << str << "Values with " << size() << " values:" << endl; for(const_iterator key_value = begin(); key_value != end(); ++key_value) { - cout << " " << keyFormatter(key_value->key) << ": "; + cout << "Value " << keyFormatter(key_value->key) << ": "; key_value->value.print(""); } } diff --git a/gtsam/slam/BearingFactor.h b/gtsam/slam/BearingFactor.h index 251e37a37..c42c2798d 100644 --- a/gtsam/slam/BearingFactor.h +++ b/gtsam/slam/BearingFactor.h @@ -78,6 +78,13 @@ namespace gtsam { return e != NULL && Base::equals(*e, tol) && this->measured_.equals(e->measured_, tol); } + /** print contents */ + void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { + std::cout << s << "BearingFactor, bearing = "; + measured_.print(); + Base::print("", keyFormatter); + } + private: /** Serialization function */ diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index 3ce671292..933333fdf 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -64,12 +64,12 @@ namespace gtsam { /** Print */ virtual void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - std::cout << s << ": BearingRangeFactor(" + std::cout << s << "BearingRangeFactor(" << keyFormatter(this->key1()) << "," << keyFormatter(this->key2()) << ")\n"; - measuredBearing_.print(" measured bearing"); - std::cout << " measured range: " << measuredRange_ << std::endl; - this->noiseModel_->print(" noise model: "); + measuredBearing_.print("measured bearing:\n"); + std::cout << "measured range: " << measuredRange_ << std::endl; + this->noiseModel_->print("noise model:\n"); } /** equals */ diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index e607809b0..bce7bcf84 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -78,9 +78,10 @@ namespace gtsam { * print * @param s optional string naming the factor */ - void print(const std::string& s = "ProjectionFactor", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - Base::print(s, keyFormatter); - measured_.print(s + ".z"); + void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { + std::cout << s << "GenericProjectionFactor, z = "; + measured_.print(); + Base::print("", keyFormatter); } /// equals diff --git a/gtsam/slam/RangeFactor.h b/gtsam/slam/RangeFactor.h index dcc94476a..78727f08f 100644 --- a/gtsam/slam/RangeFactor.h +++ b/gtsam/slam/RangeFactor.h @@ -75,7 +75,8 @@ namespace gtsam { /** print contents */ void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - Base::print(s + std::string(" range: ") + boost::lexical_cast(measured_), keyFormatter); + std::cout << s << "RangeFactor, range = " << measured_ << std::endl; + Base::print("", keyFormatter); } private: From 1d1fcecccf5b5a1e40e82f257e04adbd4a339964 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 2 Jul 2012 17:32:47 +0000 Subject: [PATCH 530/914] Added more functionality to interfaces to set/vector/list, moved typedefs to Key.h, added more matlab interfaces --- gtsam.h | 60 +++++++++++++++++++++++++++++++++++++--- gtsam/base/FastVector.h | 7 +++++ gtsam/nonlinear/Key.h | 9 ++++++ gtsam/nonlinear/Values.h | 6 +--- 4 files changed, 73 insertions(+), 9 deletions(-) diff --git a/gtsam.h b/gtsam.h index 2a1e5c0b3..3db42c90f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -764,6 +764,8 @@ class GaussianFactor { void print(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; double error(const gtsam::VectorValues& c) const; + gtsam::GaussianFactor* negate() const; + size_t size() const; }; class JacobianFactor { @@ -775,12 +777,15 @@ class JacobianFactor { const gtsam::noiseModel::Diagonal* model); JacobianFactor(size_t i1, Matrix A1, size_t i2, Matrix A2, size_t i3, Matrix A3, Vector b, const gtsam::noiseModel::Diagonal* model); + JacobianFactor(const gtsam::GaussianFactor& factor); void print(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; bool empty() const; + size_t size() const; Vector getb() const; double error(const gtsam::VectorValues& c) const; gtsam::GaussianConditional* eliminateFirst(); + gtsam::GaussianFactor* negate() const; }; class HessianFactor { @@ -795,9 +800,11 @@ class HessianFactor { double f); HessianFactor(const gtsam::GaussianConditional& cg); HessianFactor(const gtsam::GaussianFactor& factor); + size_t size() const; void print(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; double error(const gtsam::VectorValues& c) const; + gtsam::GaussianFactor* negate() const; }; class GaussianFactorGraph { @@ -809,6 +816,7 @@ class GaussianFactorGraph { void print(string s) const; bool equals(const gtsam::GaussianFactorGraph& lfgraph, double tol) const; size_t size() const; + gtsam::GaussianFactor* at(size_t idx) const; // Building the graph void add(gtsam::JacobianFactor* factor); @@ -917,7 +925,7 @@ class NonlinearFactor { void equals(const gtsam::NonlinearFactor& other, double tol) const; gtsam::KeyVector keys() const; size_t size() const; -// size_t dim() const; // FIXME: Doesn't link + size_t dim() const; // FIXME: Doesn't link }; class Values { @@ -928,24 +936,68 @@ class Values { }; // Actually a FastList -#include +#include class KeyList { KeyList(); KeyList(const gtsam::KeyList& other); // Note: no print function + + // common STL methods size_t size() const; + bool empty() const; + void clear(); + + // structure specific methods + size_t front() const; + size_t back() const; + void push_back(size_t key); + void push_front(size_t key); + void sort(); + void remove(size_t key); }; -// Actually a KeyVector -#include +// Actually a FastSet +#include +class KeySet { + KeySet(); + KeySet(const gtsam::KeySet& other); + + // Testable + void print(string s) const; + bool equals(const gtsam::KeySet& other) const; + + // common STL methods + size_t size() const; + bool empty() const; + void clear(); + + // structure specific methods + void insert(size_t key); + bool erase(size_t key); // returns true if value was removed + bool count(size_t key) const; // returns true if value exists +}; + +// Actually a FastVector +#include class KeyVector { KeyVector(); KeyVector(const gtsam::KeyVector& other); + KeyVector(const gtsam::KeySet& other); + KeyVector(const gtsam::KeyList& other); // Note: no print function + + // common STL methods size_t size() const; + bool empty() const; + void clear(); + + // structure specific methods size_t at(size_t i) const; + size_t front() const; + size_t back() const; + void push_back(size_t key) const; }; class Marginals { diff --git a/gtsam/base/FastVector.h b/gtsam/base/FastVector.h index e91bd1813..c3b8ca761 100644 --- a/gtsam/base/FastVector.h +++ b/gtsam/base/FastVector.h @@ -24,6 +24,7 @@ #include #include +#include namespace gtsam { @@ -69,6 +70,12 @@ public: Base::assign(x.begin(), x.end()); } + /** Copy constructor from a FastSet */ + FastVector(const FastSet& x) { + if(x.size() > 0) + Base::assign(x.begin(), x.end()); + } + /** Copy constructor from the base class */ FastVector(const Base& x) : Base(x) {} diff --git a/gtsam/nonlinear/Key.h b/gtsam/nonlinear/Key.h index 65a65c6d4..ab63fda6d 100644 --- a/gtsam/nonlinear/Key.h +++ b/gtsam/nonlinear/Key.h @@ -20,6 +20,10 @@ #include #include +#include +#include +#include + namespace gtsam { /// Integer nonlinear key type @@ -36,5 +40,10 @@ namespace gtsam { /// and Symbol keys. static const KeyFormatter DefaultKeyFormatter = &_defaultKeyFormatter; + /// Useful typedefs for operations with Values - allow for matlab interfaces + typedef FastList KeyList; + typedef FastVector KeyVector; + typedef FastSet KeySet; + } diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index 8ade8ff06..a01718da4 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -26,8 +26,8 @@ #include #include -#include #include +#include #include #include @@ -44,10 +44,6 @@ namespace gtsam { - // Useful typedefs for operations with Values - allow for matlab interfaces - typedef FastList KeyList; - typedef FastVector KeyVector; - // Forward declarations / utilities class ValueCloneAllocator; class ValueAutomaticCasting; From ead88ae35a75b3d1e677ac8ec701d36b2c29eaf0 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 2 Jul 2012 18:18:11 +0000 Subject: [PATCH 531/914] Changes to wrap requested by frank. Wrap now allows for multiple includes. Changes to wrap tests --- wrap/Argument.cpp | 4 +- wrap/Constructor.cpp | 31 ++++++++---- wrap/Method.cpp | 4 +- wrap/Module.cpp | 4 +- wrap/matlab.h | 8 +--- wrap/tests/expected/@Point2/Point2.m | 4 +- wrap/tests/expected/@Point2/argChar.cpp | 7 +-- wrap/tests/expected/@Point2/argUChar.cpp | 7 +-- wrap/tests/expected/@Point2/dim.cpp | 5 +- wrap/tests/expected/@Point2/returnChar.cpp | 5 +- .../expected/@Point2/vectorConfusion.cpp | 5 +- wrap/tests/expected/@Point2/x.cpp | 5 +- wrap/tests/expected/@Point2/y.cpp | 5 +- wrap/tests/expected/@Point3/Point3.m | 2 +- wrap/tests/expected/@Point3/norm.cpp | 5 +- wrap/tests/expected/@Test/Test.m | 4 +- .../expected/@Test/arg_EigenConstRef.cpp | 7 +-- .../tests/expected/@Test/create_MixedPtrs.cpp | 5 +- wrap/tests/expected/@Test/create_ptrs.cpp | 5 +- wrap/tests/expected/@Test/print.cpp | 5 +- .../tests/expected/@Test/return_Point2Ptr.cpp | 7 +-- wrap/tests/expected/@Test/return_Test.cpp | 5 +- wrap/tests/expected/@Test/return_TestPtr.cpp | 5 +- wrap/tests/expected/@Test/return_bool.cpp | 7 +-- wrap/tests/expected/@Test/return_double.cpp | 7 +-- wrap/tests/expected/@Test/return_field.cpp | 7 +-- wrap/tests/expected/@Test/return_int.cpp | 7 +-- wrap/tests/expected/@Test/return_matrix1.cpp | 7 +-- wrap/tests/expected/@Test/return_matrix2.cpp | 7 +-- wrap/tests/expected/@Test/return_pair.cpp | 9 ++-- wrap/tests/expected/@Test/return_ptrs.cpp | 5 +- wrap/tests/expected/@Test/return_size_t.cpp | 7 +-- wrap/tests/expected/@Test/return_string.cpp | 7 +-- wrap/tests/expected/@Test/return_vector1.cpp | 7 +-- wrap/tests/expected/@Test/return_vector2.cpp | 7 +-- wrap/tests/expected/Makefile | 18 +++---- .../expected/Point3_StaticFunctionRet.cpp | 3 +- wrap/tests/expected/Point3_staticFunction.cpp | 1 - wrap/tests/expected/make_geometry.m | 6 +-- wrap/tests/expected/new_Point2_.cpp | 47 ------------------ wrap/tests/expected/new_Point2_.m | 4 -- wrap/tests/expected/new_Point3_.cpp | 46 ------------------ wrap/tests/expected/new_Point3_.m | 4 -- wrap/tests/expected/new_Test_.cpp | 48 ------------------- wrap/tests/expected/new_Test_.m | 4 -- .../expected_namespaces/@ClassD/ClassD.m | 2 +- .../@ns1ClassA/ns1ClassA.m | 2 +- .../@ns1ClassB/ns1ClassB.m | 2 +- .../@ns2ClassA/memberFunction.cpp | 5 +- .../@ns2ClassA/ns2ClassA.m | 2 +- .../expected_namespaces/@ns2ClassA/nsArg.cpp | 7 +-- .../@ns2ClassA/nsReturn.cpp | 7 +-- .../@ns2ClassC/ns2ClassC.m | 2 +- .../@ns2ns3ClassB/ns2ns3ClassB.m | 2 +- wrap/tests/expected_namespaces/Makefile | 36 +++++++------- .../expected_namespaces/make_testNamespaces.m | 12 ++--- .../tests/expected_namespaces/new_ClassD_.cpp | 42 ---------------- wrap/tests/expected_namespaces/new_ClassD_.m | 4 -- .../expected_namespaces/new_ns1ClassA_.cpp | 42 ---------------- .../expected_namespaces/new_ns1ClassA_.m | 4 -- .../expected_namespaces/new_ns1ClassB_.cpp | 43 ----------------- .../expected_namespaces/new_ns1ClassB_.m | 4 -- .../expected_namespaces/new_ns2ClassA_.cpp | 43 ----------------- .../expected_namespaces/new_ns2ClassA_.m | 4 -- .../expected_namespaces/new_ns2ClassC_.cpp | 42 ---------------- .../expected_namespaces/new_ns2ClassC_.m | 4 -- .../expected_namespaces/new_ns2ns3ClassB_.cpp | 43 ----------------- .../expected_namespaces/new_ns2ns3ClassB_.m | 4 -- .../ns2ClassA_afunction.cpp | 1 - wrap/tests/testWrap.cpp | 36 +++++++------- wrap/utilities.cpp | 1 - 71 files changed, 142 insertions(+), 663 deletions(-) delete mode 100644 wrap/tests/expected/new_Point2_.cpp delete mode 100644 wrap/tests/expected/new_Point2_.m delete mode 100644 wrap/tests/expected/new_Point3_.cpp delete mode 100644 wrap/tests/expected/new_Point3_.m delete mode 100644 wrap/tests/expected/new_Test_.cpp delete mode 100644 wrap/tests/expected/new_Test_.m delete mode 100644 wrap/tests/expected_namespaces/new_ClassD_.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ClassD_.m delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassA_.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassA_.m delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassB_.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassB_.m delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassA_.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassA_.m delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassC_.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassC_.m delete mode 100644 wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index e2073ac8c..40ad205b6 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -54,14 +54,14 @@ void Argument::matlab_unwrap(FileWriter& file, const string& matlabName) const { file.oss << "boost::shared_ptr<" << cppType << "> " << name << " = unwrap_shared_ptr< "; else if (is_ref) // A reference: emit an "unwrap_shared_ptr" call and de-reference the pointer - file.oss << " " << cppType << "& " << name << " = *unwrap_shared_ptr< "; + file.oss << cppType << "& " << name << " = *unwrap_shared_ptr< "; else // Not a pointer or a reference: emit an "unwrap" call // unwrap is specified in matlab.h as a series of template specializations // that know how to unpack the expected MATLAB object // example: double tol = unwrap< double >(in[2]); // example: Vector v = unwrap< Vector >(in[1]); - file.oss << " " << cppType << " " << name << " = unwrap< "; + file.oss << cppType << " " << name << " = unwrap< "; file.oss << cppType << " >(" << matlabName; if (is_ptr || is_ref) file.oss << ", \"" << matlabType << "\""; diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 7785de08f..9872d5fbe 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -30,7 +30,7 @@ using namespace wrap; /* ************************************************************************* */ string Constructor::matlab_wrapper_name(const string& className) const { - string str = "new_" + className + "_"; + string str = "new_" + className; return str; } @@ -102,19 +102,23 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << "static std::set collector;" << endl; file.oss << endl; + //TODO: Remove //Generate the destructor function - file.oss << "struct Destruct" << endl; + /*file.oss << "struct Destruct" << endl; file.oss << "{" << endl; file.oss << " void operator() (Shared* p)" << endl; file.oss << " {" << endl; file.oss << " collector.erase(p);" << endl; file.oss << " }" << endl; file.oss << "};" << endl; - file.oss << endl; + file.oss << endl;*/ //Generate cleanup function file.oss << "void cleanup(void) {" << endl; - file.oss << " std::for_each( collector.begin(), collector.end(), Destruct() );" << endl; + //TODO: Remove + //file.oss << " std::for_each( collector.begin(), collector.end(), Destruct() );" << endl; + file.oss << " BOOST_FOREACH(Shared* p, collector)" << endl; + file.oss << " collector.erase(p);" << endl; file.oss << "}" << endl; file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; @@ -134,15 +138,24 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << " else if(collector.erase(self))" << endl; file.oss << " delete self;" << endl; file.oss << " } else {" << endl; - file.oss << " int nc = unwrap(in[1]);" << endl; + file.oss << " int nc = unwrap(in[1]);" << endl << endl; int i = 0; BOOST_FOREACH(ArgumentList al, args_list) { - file.oss << " if(nc == " << i <<") {" << endl; - al.matlab_unwrap(file, 2); // unwrap arguments, start at 1 - file.oss << " self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; - file.oss << " }" << endl; + //Check to see if there will be any arguments and remove {} for consiseness + if(al.size()) + { + file.oss << " if(nc == " << i <<") {" << endl; + al.matlab_unwrap(file, 2); // unwrap arguments, start at 1 + file.oss << " self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; + file.oss << " }" << endl; + } + else + { + file.oss << " if(nc == " << i <<")" << endl; + file.oss << " self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; + } i++; } diff --git a/wrap/Method.cpp b/wrap/Method.cpp index f5da0d370..60b02918f 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -85,9 +85,7 @@ void Method::matlab_wrapper(const string& classPath, // get class pointer // example: shared_ptr = unwrap_shared_ptr< Test >(in[0], "Test"); - file.oss << " mxArray* mxh = mxGetProperty(in[0],0,\"self\");" << endl; - file.oss << " Shared* self = *reinterpret_cast (mxGetPr(mxh));" << endl; - file.oss << " Shared obj = *self;" << endl; + file.oss << " Shared obj = unwrap_shared_ptr<" << cppClassName << ">(in[0], \"" << cppClassName << "\");" << endl; // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,1); diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 0adf1cda0..13adacc4c 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -182,7 +182,7 @@ Module::Module(const string& interfacePath, Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[assign_a(include_path)] >> ch_p('>'); Rule class_p = - (!include_p + (!*include_p >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] >> className_p[assign_a(cls.name)] >> '{' @@ -201,7 +201,7 @@ Module::Module(const string& interfacePath, [assign_a(cls,cls0)]; Rule namespace_def_p = - (!include_p + (!*include_p >> str_p("namespace")[push_back_a(namespace_includes, include_path)][assign_a(include_path, null_str)] >> namespace_name_p[push_back_a(namespaces)] >> ch_p('{') diff --git a/wrap/matlab.h b/wrap/matlab.h index 3cfebdfe7..b11fedfd8 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -21,15 +21,9 @@ #include #include -#include using gtsam::Vector; using gtsam::Matrix; -using gtsam::noiseModel::Base; -using gtsam::noiseModel::Gaussian; -using gtsam::noiseModel::Diagonal; -using gtsam::noiseModel::Isotropic; -using gtsam::noiseModel::Unit; extern "C" { #include @@ -37,6 +31,7 @@ extern "C" { #include #include +#include #include #include @@ -321,7 +316,6 @@ gtsam::Matrix unwrap< gtsam::Matrix >(const mxArray* array) { dummy arguments to let the constructor know we want an object without the self property initialized. We then assign the mexhandle to self. */ -// TODO: think about memory mxArray* create_object(const char *classname, mxArray* h) { mxArray *result; mxArray* dummy[13] = {h,h,h,h,h, h,h,h,h,h, h,h,h}; diff --git a/wrap/tests/expected/@Point2/Point2.m b/wrap/tests/expected/@Point2/Point2.m index 68744ae00..31d54bb19 100644 --- a/wrap/tests/expected/@Point2/Point2.m +++ b/wrap/tests/expected/@Point2/Point2.m @@ -5,8 +5,8 @@ classdef Point2 < handle end methods function obj = Point2(varargin) - if (nargin == 0), obj.self = new_Point2_(0,0); end - if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Point2_(0,1,varargin{1},varargin{2}); end + if (nargin == 0), obj.self = new_Point2(0,0); end + if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Point2(0,1,varargin{1},varargin{2}); end if nargin ==14, new_Point2_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point2 constructor failed'); end end diff --git a/wrap/tests/expected/@Point2/argChar.cpp b/wrap/tests/expected/@Point2/argChar.cpp index e5fac45fe..d0e9a7a7a 100644 --- a/wrap/tests/expected/@Point2/argChar.cpp +++ b/wrap/tests/expected/@Point2/argChar.cpp @@ -1,14 +1,11 @@ // automatically generated by wrap #include -#include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("argChar",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - char a = unwrap< char >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + char a = unwrap< char >(in[1]); obj->argChar(a); } diff --git a/wrap/tests/expected/@Point2/argUChar.cpp b/wrap/tests/expected/@Point2/argUChar.cpp index 54c592915..06e62c36b 100644 --- a/wrap/tests/expected/@Point2/argUChar.cpp +++ b/wrap/tests/expected/@Point2/argUChar.cpp @@ -1,14 +1,11 @@ // automatically generated by wrap #include -#include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("argUChar",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - unsigned char a = unwrap< unsigned char >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + unsigned char a = unwrap< unsigned char >(in[1]); obj->argUChar(a); } diff --git a/wrap/tests/expected/@Point2/dim.cpp b/wrap/tests/expected/@Point2/dim.cpp index 7e44ae075..a7e938a16 100644 --- a/wrap/tests/expected/@Point2/dim.cpp +++ b/wrap/tests/expected/@Point2/dim.cpp @@ -1,14 +1,11 @@ // automatically generated by wrap #include -#include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("dim",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Point2"); int result = obj->dim(); out[0] = wrap< int >(result); } diff --git a/wrap/tests/expected/@Point2/returnChar.cpp b/wrap/tests/expected/@Point2/returnChar.cpp index 43a537786..ed6f34190 100644 --- a/wrap/tests/expected/@Point2/returnChar.cpp +++ b/wrap/tests/expected/@Point2/returnChar.cpp @@ -1,14 +1,11 @@ // automatically generated by wrap #include -#include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("returnChar",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Point2"); char result = obj->returnChar(); out[0] = wrap< char >(result); } diff --git a/wrap/tests/expected/@Point2/vectorConfusion.cpp b/wrap/tests/expected/@Point2/vectorConfusion.cpp index e3aa4f0d6..3e2982803 100644 --- a/wrap/tests/expected/@Point2/vectorConfusion.cpp +++ b/wrap/tests/expected/@Point2/vectorConfusion.cpp @@ -1,15 +1,12 @@ // automatically generated by wrap #include -#include #include typedef boost::shared_ptr SharedVectorNotEigen; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("vectorConfusion",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Point2"); VectorNotEigen result = obj->vectorConfusion(); SharedVectorNotEigen* ret = new SharedVectorNotEigen(new VectorNotEigen(result)); out[0] = wrap_collect_shared_ptr(ret,"VectorNotEigen"); diff --git a/wrap/tests/expected/@Point2/x.cpp b/wrap/tests/expected/@Point2/x.cpp index 8cebadb66..273eb7834 100644 --- a/wrap/tests/expected/@Point2/x.cpp +++ b/wrap/tests/expected/@Point2/x.cpp @@ -1,14 +1,11 @@ // automatically generated by wrap #include -#include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("x",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Point2"); double result = obj->x(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Point2/y.cpp b/wrap/tests/expected/@Point2/y.cpp index 7e3650534..44f824fb0 100644 --- a/wrap/tests/expected/@Point2/y.cpp +++ b/wrap/tests/expected/@Point2/y.cpp @@ -1,14 +1,11 @@ // automatically generated by wrap #include -#include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("y",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Point2"); double result = obj->y(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Point3/Point3.m b/wrap/tests/expected/@Point3/Point3.m index b916293b7..6dd8e9ee5 100644 --- a/wrap/tests/expected/@Point3/Point3.m +++ b/wrap/tests/expected/@Point3/Point3.m @@ -5,7 +5,7 @@ classdef Point3 < handle end methods function obj = Point3(varargin) - if (nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double')), obj.self = new_Point3_(0,0,varargin{1},varargin{2},varargin{3}); end + if (nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double')), obj.self = new_Point3(0,0,varargin{1},varargin{2},varargin{3}); end if nargin ==14, new_Point3_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point3 constructor failed'); end end diff --git a/wrap/tests/expected/@Point3/norm.cpp b/wrap/tests/expected/@Point3/norm.cpp index 8f6a10b72..dd5c726ee 100644 --- a/wrap/tests/expected/@Point3/norm.cpp +++ b/wrap/tests/expected/@Point3/norm.cpp @@ -1,15 +1,12 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("norm",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Point3"); double result = obj->norm(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Test/Test.m b/wrap/tests/expected/@Test/Test.m index e4bd30221..60628b997 100644 --- a/wrap/tests/expected/@Test/Test.m +++ b/wrap/tests/expected/@Test/Test.m @@ -5,8 +5,8 @@ classdef Test < handle end methods function obj = Test(varargin) - if (nargin == 0), obj.self = new_Test_(0,0); end - if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Test_(0,1,varargin{1},varargin{2}); end + if (nargin == 0), obj.self = new_Test(0,0); end + if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Test(0,1,varargin{1},varargin{2}); end if nargin ==14, new_Test_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Test constructor failed'); end end diff --git a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp b/wrap/tests/expected/@Test/arg_EigenConstRef.cpp index 848870d11..a6a384870 100644 --- a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp +++ b/wrap/tests/expected/@Test/arg_EigenConstRef.cpp @@ -1,15 +1,12 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("arg_EigenConstRef",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); obj->arg_EigenConstRef(value); } diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.cpp b/wrap/tests/expected/@Test/create_MixedPtrs.cpp index 1776c855b..21010eb0c 100644 --- a/wrap/tests/expected/@Test/create_MixedPtrs.cpp +++ b/wrap/tests/expected/@Test/create_MixedPtrs.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr SharedTest; @@ -9,9 +8,7 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("create_MixedPtrs",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Test"); pair< Test, SharedTest > result = obj->create_MixedPtrs(); SharedTest* ret = new SharedTest(new Test(result.first)); out[0] = wrap_collect_shared_ptr(ret,"Test"); diff --git a/wrap/tests/expected/@Test/create_ptrs.cpp b/wrap/tests/expected/@Test/create_ptrs.cpp index ab4261d5c..b51c3f00e 100644 --- a/wrap/tests/expected/@Test/create_ptrs.cpp +++ b/wrap/tests/expected/@Test/create_ptrs.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr SharedTest; @@ -9,9 +8,7 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("create_ptrs",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Test"); pair< SharedTest, SharedTest > result = obj->create_ptrs(); SharedTest* ret = new SharedTest(result.first); out[0] = wrap_collect_shared_ptr(ret,"Test"); diff --git a/wrap/tests/expected/@Test/print.cpp b/wrap/tests/expected/@Test/print.cpp index e3a758182..3cf9cd14d 100644 --- a/wrap/tests/expected/@Test/print.cpp +++ b/wrap/tests/expected/@Test/print.cpp @@ -1,14 +1,11 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("print",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Test"); obj->print(); } diff --git a/wrap/tests/expected/@Test/return_Point2Ptr.cpp b/wrap/tests/expected/@Test/return_Point2Ptr.cpp index b3e61d37a..0d8650e84 100644 --- a/wrap/tests/expected/@Test/return_Point2Ptr.cpp +++ b/wrap/tests/expected/@Test/return_Point2Ptr.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr SharedPoint2; @@ -8,10 +7,8 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_Point2Ptr",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - bool value = unwrap< bool >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + bool value = unwrap< bool >(in[1]); SharedPoint2 result = obj->return_Point2Ptr(value); SharedPoint2* ret = new SharedPoint2(result); out[0] = wrap_collect_shared_ptr(ret,"Point2"); diff --git a/wrap/tests/expected/@Test/return_Test.cpp b/wrap/tests/expected/@Test/return_Test.cpp index cd0f1ef10..fb3ad822c 100644 --- a/wrap/tests/expected/@Test/return_Test.cpp +++ b/wrap/tests/expected/@Test/return_Test.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr SharedTest; @@ -8,9 +7,7 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_Test",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Test"); boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); Test result = obj->return_Test(value); SharedTest* ret = new SharedTest(new Test(result)); diff --git a/wrap/tests/expected/@Test/return_TestPtr.cpp b/wrap/tests/expected/@Test/return_TestPtr.cpp index 2957de8f3..06bc80269 100644 --- a/wrap/tests/expected/@Test/return_TestPtr.cpp +++ b/wrap/tests/expected/@Test/return_TestPtr.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr SharedTest; @@ -8,9 +7,7 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_TestPtr",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Test"); boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); SharedTest result = obj->return_TestPtr(value); SharedTest* ret = new SharedTest(result); diff --git a/wrap/tests/expected/@Test/return_bool.cpp b/wrap/tests/expected/@Test/return_bool.cpp index c9c792934..e570d8dc2 100644 --- a/wrap/tests/expected/@Test/return_bool.cpp +++ b/wrap/tests/expected/@Test/return_bool.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_bool",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - bool value = unwrap< bool >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + bool value = unwrap< bool >(in[1]); bool result = obj->return_bool(value); out[0] = wrap< bool >(result); } diff --git a/wrap/tests/expected/@Test/return_double.cpp b/wrap/tests/expected/@Test/return_double.cpp index 4e6612278..4a6322a72 100644 --- a/wrap/tests/expected/@Test/return_double.cpp +++ b/wrap/tests/expected/@Test/return_double.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_double",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - double value = unwrap< double >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + double value = unwrap< double >(in[1]); double result = obj->return_double(value); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected/@Test/return_field.cpp b/wrap/tests/expected/@Test/return_field.cpp index 43507f4d7..a631635e3 100644 --- a/wrap/tests/expected/@Test/return_field.cpp +++ b/wrap/tests/expected/@Test/return_field.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_field",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); bool result = obj->return_field(t); out[0] = wrap< bool >(result); } diff --git a/wrap/tests/expected/@Test/return_int.cpp b/wrap/tests/expected/@Test/return_int.cpp index 2a27ac73a..f909405eb 100644 --- a/wrap/tests/expected/@Test/return_int.cpp +++ b/wrap/tests/expected/@Test/return_int.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_int",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - int value = unwrap< int >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + int value = unwrap< int >(in[1]); int result = obj->return_int(value); out[0] = wrap< int >(result); } diff --git a/wrap/tests/expected/@Test/return_matrix1.cpp b/wrap/tests/expected/@Test/return_matrix1.cpp index d4c66622b..1cc75d3d4 100644 --- a/wrap/tests/expected/@Test/return_matrix1.cpp +++ b/wrap/tests/expected/@Test/return_matrix1.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_matrix1",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - Matrix value = unwrap< Matrix >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Matrix value = unwrap< Matrix >(in[1]); Matrix result = obj->return_matrix1(value); out[0] = wrap< Matrix >(result); } diff --git a/wrap/tests/expected/@Test/return_matrix2.cpp b/wrap/tests/expected/@Test/return_matrix2.cpp index a40fa79cf..10c9e8647 100644 --- a/wrap/tests/expected/@Test/return_matrix2.cpp +++ b/wrap/tests/expected/@Test/return_matrix2.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_matrix2",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - Matrix value = unwrap< Matrix >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Matrix value = unwrap< Matrix >(in[1]); Matrix result = obj->return_matrix2(value); out[0] = wrap< Matrix >(result); } diff --git a/wrap/tests/expected/@Test/return_pair.cpp b/wrap/tests/expected/@Test/return_pair.cpp index 7d715644c..0fc359df6 100644 --- a/wrap/tests/expected/@Test/return_pair.cpp +++ b/wrap/tests/expected/@Test/return_pair.cpp @@ -1,17 +1,14 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_pair",nargout,nargin-1,2); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - Vector v = unwrap< Vector >(in[1]); - Matrix A = unwrap< Matrix >(in[2]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Vector v = unwrap< Vector >(in[1]); + Matrix A = unwrap< Matrix >(in[2]); pair< Vector, Matrix > result = obj->return_pair(v,A); out[0] = wrap< Vector >(result.first); out[1] = wrap< Matrix >(result.second); diff --git a/wrap/tests/expected/@Test/return_ptrs.cpp b/wrap/tests/expected/@Test/return_ptrs.cpp index 8a5f9a0ce..c6c6f9655 100644 --- a/wrap/tests/expected/@Test/return_ptrs.cpp +++ b/wrap/tests/expected/@Test/return_ptrs.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr SharedTest; @@ -9,9 +8,7 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_ptrs",nargout,nargin-1,2); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "Test"); boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); pair< SharedTest, SharedTest > result = obj->return_ptrs(p1,p2); diff --git a/wrap/tests/expected/@Test/return_size_t.cpp b/wrap/tests/expected/@Test/return_size_t.cpp index f18680d0d..9a6fc8598 100644 --- a/wrap/tests/expected/@Test/return_size_t.cpp +++ b/wrap/tests/expected/@Test/return_size_t.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_size_t",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - size_t value = unwrap< size_t >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + size_t value = unwrap< size_t >(in[1]); size_t result = obj->return_size_t(value); out[0] = wrap< size_t >(result); } diff --git a/wrap/tests/expected/@Test/return_string.cpp b/wrap/tests/expected/@Test/return_string.cpp index 013814241..3253e62ed 100644 --- a/wrap/tests/expected/@Test/return_string.cpp +++ b/wrap/tests/expected/@Test/return_string.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_string",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - string value = unwrap< string >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + string value = unwrap< string >(in[1]); string result = obj->return_string(value); out[0] = wrap< string >(result); } diff --git a/wrap/tests/expected/@Test/return_vector1.cpp b/wrap/tests/expected/@Test/return_vector1.cpp index 593cd20bd..48ecbb643 100644 --- a/wrap/tests/expected/@Test/return_vector1.cpp +++ b/wrap/tests/expected/@Test/return_vector1.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_vector1",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - Vector value = unwrap< Vector >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Vector value = unwrap< Vector >(in[1]); Vector result = obj->return_vector1(value); out[0] = wrap< Vector >(result); } diff --git a/wrap/tests/expected/@Test/return_vector2.cpp b/wrap/tests/expected/@Test/return_vector2.cpp index 1be4a614a..984ba259c 100644 --- a/wrap/tests/expected/@Test/return_vector2.cpp +++ b/wrap/tests/expected/@Test/return_vector2.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("return_vector2",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - Vector value = unwrap< Vector >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Vector value = unwrap< Vector >(in[1]); Vector result = obj->return_vector2(value); out[0] = wrap< Vector >(result); } diff --git a/wrap/tests/expected/Makefile b/wrap/tests/expected/Makefile index 57a606790..92dece353 100644 --- a/wrap/tests/expected/Makefile +++ b/wrap/tests/expected/Makefile @@ -8,8 +8,8 @@ mex_flags = -O5 all: Point2 Point3 Test # Point2 -new_Point2_.$(MEXENDING): new_Point2_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_Point2_.cpp -output new_Point2_ +new_Point2.$(MEXENDING): new_Point2.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_Point2.cpp -output new_Point2 @Point2/x.$(MEXENDING): @Point2/x.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/x.cpp -output @Point2/x @Point2/y.$(MEXENDING): @Point2/y.cpp $(PATH_TO_WRAP)/matlab.h @@ -25,11 +25,11 @@ new_Point2_.$(MEXENDING): new_Point2_.cpp $(PATH_TO_WRAP)/matlab.h @Point2/vectorConfusion.$(MEXENDING): @Point2/vectorConfusion.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point2/vectorConfusion.cpp -output @Point2/vectorConfusion -Point2: new_Point2_.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) @Point2/returnChar.$(MEXENDING) @Point2/argChar.$(MEXENDING) @Point2/argUChar.$(MEXENDING) @Point2/vectorConfusion.$(MEXENDING) +Point2: new_Point2.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) @Point2/returnChar.$(MEXENDING) @Point2/argChar.$(MEXENDING) @Point2/argUChar.$(MEXENDING) @Point2/vectorConfusion.$(MEXENDING) # Point3 -new_Point3_.$(MEXENDING): new_Point3_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_Point3_.cpp -output new_Point3_ +new_Point3.$(MEXENDING): new_Point3.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_Point3.cpp -output new_Point3 Point3_staticFunction.$(MEXENDING): Point3_staticFunction.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) Point3_staticFunction.cpp -output Point3_staticFunction Point3_StaticFunctionRet.$(MEXENDING): Point3_StaticFunctionRet.cpp $(PATH_TO_WRAP)/matlab.h @@ -37,11 +37,11 @@ Point3_StaticFunctionRet.$(MEXENDING): Point3_StaticFunctionRet.cpp $(PATH_TO_WR @Point3/norm.$(MEXENDING): @Point3/norm.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Point3/norm.cpp -output @Point3/norm -Point3: new_Point3_.$(MEXENDING) Point3_staticFunction.$(MEXENDING) Point3_StaticFunctionRet.$(MEXENDING) @Point3/norm.$(MEXENDING) +Point3: new_Point3.$(MEXENDING) Point3_staticFunction.$(MEXENDING) Point3_StaticFunctionRet.$(MEXENDING) @Point3/norm.$(MEXENDING) # Test -new_Test_.$(MEXENDING): new_Test_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_Test_.cpp -output new_Test_ +new_Test.$(MEXENDING): new_Test.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_Test.cpp -output new_Test @Test/return_pair.$(MEXENDING): @Test/return_pair.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/return_pair.cpp -output @Test/return_pair @Test/return_bool.$(MEXENDING): @Test/return_bool.cpp $(PATH_TO_WRAP)/matlab.h @@ -81,7 +81,7 @@ new_Test_.$(MEXENDING): new_Test_.cpp $(PATH_TO_WRAP)/matlab.h @Test/print.$(MEXENDING): @Test/print.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @Test/print.cpp -output @Test/print -Test: new_Test_.$(MEXENDING) @Test/return_pair.$(MEXENDING) @Test/return_bool.$(MEXENDING) @Test/return_size_t.$(MEXENDING) @Test/return_int.$(MEXENDING) @Test/return_double.$(MEXENDING) @Test/return_string.$(MEXENDING) @Test/return_vector1.$(MEXENDING) @Test/return_matrix1.$(MEXENDING) @Test/return_vector2.$(MEXENDING) @Test/return_matrix2.$(MEXENDING) @Test/arg_EigenConstRef.$(MEXENDING) @Test/return_field.$(MEXENDING) @Test/return_TestPtr.$(MEXENDING) @Test/return_Test.$(MEXENDING) @Test/return_Point2Ptr.$(MEXENDING) @Test/create_ptrs.$(MEXENDING) @Test/create_MixedPtrs.$(MEXENDING) @Test/return_ptrs.$(MEXENDING) @Test/print.$(MEXENDING) +Test: new_Test.$(MEXENDING) @Test/return_pair.$(MEXENDING) @Test/return_bool.$(MEXENDING) @Test/return_size_t.$(MEXENDING) @Test/return_int.$(MEXENDING) @Test/return_double.$(MEXENDING) @Test/return_string.$(MEXENDING) @Test/return_vector1.$(MEXENDING) @Test/return_matrix1.$(MEXENDING) @Test/return_vector2.$(MEXENDING) @Test/return_matrix2.$(MEXENDING) @Test/arg_EigenConstRef.$(MEXENDING) @Test/return_field.$(MEXENDING) @Test/return_TestPtr.$(MEXENDING) @Test/return_Test.$(MEXENDING) @Test/return_Point2Ptr.$(MEXENDING) @Test/create_ptrs.$(MEXENDING) @Test/create_MixedPtrs.$(MEXENDING) @Test/return_ptrs.$(MEXENDING) @Test/print.$(MEXENDING) diff --git a/wrap/tests/expected/Point3_StaticFunctionRet.cpp b/wrap/tests/expected/Point3_StaticFunctionRet.cpp index 49d15f4fa..696af326a 100644 --- a/wrap/tests/expected/Point3_StaticFunctionRet.cpp +++ b/wrap/tests/expected/Point3_StaticFunctionRet.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr SharedPoint3; @@ -8,7 +7,7 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("Point3_StaticFunctionRet",nargout,nargin,1); - double z = unwrap< double >(in[0]); + double z = unwrap< double >(in[0]); Point3 result = Point3::StaticFunctionRet(z); SharedPoint3* ret = new SharedPoint3(new Point3(result)); out[0] = wrap_collect_shared_ptr(ret,"Point3"); diff --git a/wrap/tests/expected/Point3_staticFunction.cpp b/wrap/tests/expected/Point3_staticFunction.cpp index e29670b9a..f25c8f4ea 100644 --- a/wrap/tests/expected/Point3_staticFunction.cpp +++ b/wrap/tests/expected/Point3_staticFunction.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include using namespace geometry; typedef boost::shared_ptr Shareddouble; diff --git a/wrap/tests/expected/make_geometry.m b/wrap/tests/expected/make_geometry.m index 32f81871d..d77459ed8 100644 --- a/wrap/tests/expected/make_geometry.m +++ b/wrap/tests/expected/make_geometry.m @@ -9,7 +9,7 @@ addpath(toolboxpath); %% Point2 cd(toolboxpath) -mex -O5 new_Point2_.cpp +mex -O5 new_Point2.cpp cd @Point2 mex -O5 x.cpp @@ -22,7 +22,7 @@ mex -O5 vectorConfusion.cpp %% Point3 cd(toolboxpath) -mex -O5 new_Point3_.cpp +mex -O5 new_Point3.cpp mex -O5 Point3_staticFunction.cpp mex -O5 Point3_StaticFunctionRet.cpp @@ -31,7 +31,7 @@ mex -O5 norm.cpp %% Test cd(toolboxpath) -mex -O5 new_Test_.cpp +mex -O5 new_Test.cpp cd @Test mex -O5 return_pair.cpp diff --git a/wrap/tests/expected/new_Point2_.cpp b/wrap/tests/expected/new_Point2_.cpp deleted file mode 100644 index 11b2821a3..000000000 --- a/wrap/tests/expected/new_Point2_.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new Point2()); - } - if(nc == 1) { - double x = unwrap< double >(in[2]); - double y = unwrap< double >(in[3]); - self = new Shared(new Point2(x,y)); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected/new_Point2_.m b/wrap/tests/expected/new_Point2_.m deleted file mode 100644 index b5fdcff15..000000000 --- a/wrap/tests/expected/new_Point2_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Point2_(obj,x,y) - error('need to compile new_Point2_.cpp'); -end diff --git a/wrap/tests/expected/new_Point3_.cpp b/wrap/tests/expected/new_Point3_.cpp deleted file mode 100644 index 01316da5a..000000000 --- a/wrap/tests/expected/new_Point3_.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - double x = unwrap< double >(in[2]); - double y = unwrap< double >(in[3]); - double z = unwrap< double >(in[4]); - self = new Shared(new Point3(x,y,z)); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected/new_Point3_.m b/wrap/tests/expected/new_Point3_.m deleted file mode 100644 index f306af227..000000000 --- a/wrap/tests/expected/new_Point3_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Point3_(obj,x,y,z) - error('need to compile new_Point3_.cpp'); -end diff --git a/wrap/tests/expected/new_Test_.cpp b/wrap/tests/expected/new_Test_.cpp deleted file mode 100644 index e14e6b71d..000000000 --- a/wrap/tests/expected/new_Test_.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new Test()); - } - if(nc == 1) { - double a = unwrap< double >(in[2]); - Matrix b = unwrap< Matrix >(in[3]); - self = new Shared(new Test(a,b)); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected/new_Test_.m b/wrap/tests/expected/new_Test_.m deleted file mode 100644 index 82faf0fd6..000000000 --- a/wrap/tests/expected/new_Test_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Test_(obj,a,b) - error('need to compile new_Test_.cpp'); -end diff --git a/wrap/tests/expected_namespaces/@ClassD/ClassD.m b/wrap/tests/expected_namespaces/@ClassD/ClassD.m index 2a82b6bbf..282b761ed 100644 --- a/wrap/tests/expected_namespaces/@ClassD/ClassD.m +++ b/wrap/tests/expected_namespaces/@ClassD/ClassD.m @@ -5,7 +5,7 @@ classdef ClassD < handle end methods function obj = ClassD(varargin) - if (nargin == 0), obj.self = new_ClassD_(0,0); end + if (nargin == 0), obj.self = new_ClassD(0,0); end if nargin ==14, new_ClassD_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ClassD constructor failed'); end end diff --git a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m b/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m index f1cc51eda..b8f1b3535 100644 --- a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m +++ b/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m @@ -5,7 +5,7 @@ classdef ns1ClassA < handle end methods function obj = ns1ClassA(varargin) - if (nargin == 0), obj.self = new_ns1ClassA_(0,0); end + if (nargin == 0), obj.self = new_ns1ClassA(0,0); end if nargin ==14, new_ns1ClassA_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassA constructor failed'); end end diff --git a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m b/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m index 9403d5b7c..42add5e9c 100644 --- a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m +++ b/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m @@ -5,7 +5,7 @@ classdef ns1ClassB < handle end methods function obj = ns1ClassB(varargin) - if (nargin == 0), obj.self = new_ns1ClassB_(0,0); end + if (nargin == 0), obj.self = new_ns1ClassB(0,0); end if nargin ==14, new_ns1ClassB_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassB constructor failed'); end end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp index 668980943..70d0a7968 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp @@ -1,15 +1,12 @@ // automatically generated by wrap #include -#include #include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("memberFunction",nargout,nargin-1,0); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; + Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); double result = obj->memberFunction(); out[0] = wrap< double >(result); } diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m b/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m index b4c9de568..cbbbbbce2 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m +++ b/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m @@ -5,7 +5,7 @@ classdef ns2ClassA < handle end methods function obj = ns2ClassA(varargin) - if (nargin == 0), obj.self = new_ns2ClassA_(0,0); end + if (nargin == 0), obj.self = new_ns2ClassA(0,0); end if nargin ==14, new_ns2ClassA_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassA constructor failed'); end end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp index a55fd5581..498d90649 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp @@ -1,16 +1,13 @@ // automatically generated by wrap #include -#include #include #include typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("nsArg",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); + Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); + ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); int result = obj->nsArg(arg); out[0] = wrap< int >(result); } diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp index 334bc9928..996bf8913 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include #include typedef boost::shared_ptr SharedClassB; @@ -8,10 +7,8 @@ typedef boost::shared_ptr Shared; void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("nsReturn",nargout,nargin-1,1); - mxArray* mxh = mxGetProperty(in[0],0,"self"); - Shared* self = *reinterpret_cast (mxGetPr(mxh)); - Shared obj = *self; - double q = unwrap< double >(in[1]); + Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); + double q = unwrap< double >(in[1]); ns2::ns3::ClassB result = obj->nsReturn(q); SharedClassB* ret = new SharedClassB(new ns2::ns3::ClassB(result)); out[0] = wrap_collect_shared_ptr(ret,"ns2ns3ClassB"); diff --git a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m b/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m index 13fbb49f3..5bd68fee7 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m +++ b/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m @@ -5,7 +5,7 @@ classdef ns2ClassC < handle end methods function obj = ns2ClassC(varargin) - if (nargin == 0), obj.self = new_ns2ClassC_(0,0); end + if (nargin == 0), obj.self = new_ns2ClassC(0,0); end if nargin ==14, new_ns2ClassC_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassC constructor failed'); end end diff --git a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m b/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m index 29e0721f0..936c7cdd1 100644 --- a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m +++ b/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m @@ -5,7 +5,7 @@ classdef ns2ns3ClassB < handle end methods function obj = ns2ns3ClassB(varargin) - if (nargin == 0), obj.self = new_ns2ns3ClassB_(0,0); end + if (nargin == 0), obj.self = new_ns2ns3ClassB(0,0); end if nargin ==14, new_ns2ns3ClassB_(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ns3ClassB constructor failed'); end end diff --git a/wrap/tests/expected_namespaces/Makefile b/wrap/tests/expected_namespaces/Makefile index 55866228b..1cb09b8b9 100644 --- a/wrap/tests/expected_namespaces/Makefile +++ b/wrap/tests/expected_namespaces/Makefile @@ -8,20 +8,20 @@ mex_flags = -O5 all: ns1ClassA ns1ClassB ns2ClassA ns2ns3ClassB ns2ClassC ClassD # ns1ClassA -new_ns1ClassA_.$(MEXENDING): new_ns1ClassA_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns1ClassA_.cpp -output new_ns1ClassA_ +new_ns1ClassA.$(MEXENDING): new_ns1ClassA.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_ns1ClassA.cpp -output new_ns1ClassA -ns1ClassA: new_ns1ClassA_.$(MEXENDING) +ns1ClassA: new_ns1ClassA.$(MEXENDING) # ns1ClassB -new_ns1ClassB_.$(MEXENDING): new_ns1ClassB_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns1ClassB_.cpp -output new_ns1ClassB_ +new_ns1ClassB.$(MEXENDING): new_ns1ClassB.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_ns1ClassB.cpp -output new_ns1ClassB -ns1ClassB: new_ns1ClassB_.$(MEXENDING) +ns1ClassB: new_ns1ClassB.$(MEXENDING) # ns2ClassA -new_ns2ClassA_.$(MEXENDING): new_ns2ClassA_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns2ClassA_.cpp -output new_ns2ClassA_ +new_ns2ClassA.$(MEXENDING): new_ns2ClassA.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_ns2ClassA.cpp -output new_ns2ClassA ns2ClassA_afunction.$(MEXENDING): ns2ClassA_afunction.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) ns2ClassA_afunction.cpp -output ns2ClassA_afunction @ns2ClassA/memberFunction.$(MEXENDING): @ns2ClassA/memberFunction.cpp $(PATH_TO_WRAP)/matlab.h @@ -31,25 +31,25 @@ ns2ClassA_afunction.$(MEXENDING): ns2ClassA_afunction.cpp $(PATH_TO_WRAP)/matlab @ns2ClassA/nsReturn.$(MEXENDING): @ns2ClassA/nsReturn.cpp $(PATH_TO_WRAP)/matlab.h $(MEX) $(mex_flags) @ns2ClassA/nsReturn.cpp -output @ns2ClassA/nsReturn -ns2ClassA: new_ns2ClassA_.$(MEXENDING) ns2ClassA_afunction.$(MEXENDING) @ns2ClassA/memberFunction.$(MEXENDING) @ns2ClassA/nsArg.$(MEXENDING) @ns2ClassA/nsReturn.$(MEXENDING) +ns2ClassA: new_ns2ClassA.$(MEXENDING) ns2ClassA_afunction.$(MEXENDING) @ns2ClassA/memberFunction.$(MEXENDING) @ns2ClassA/nsArg.$(MEXENDING) @ns2ClassA/nsReturn.$(MEXENDING) # ns2ns3ClassB -new_ns2ns3ClassB_.$(MEXENDING): new_ns2ns3ClassB_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns2ns3ClassB_.cpp -output new_ns2ns3ClassB_ +new_ns2ns3ClassB.$(MEXENDING): new_ns2ns3ClassB.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_ns2ns3ClassB.cpp -output new_ns2ns3ClassB -ns2ns3ClassB: new_ns2ns3ClassB_.$(MEXENDING) +ns2ns3ClassB: new_ns2ns3ClassB.$(MEXENDING) # ns2ClassC -new_ns2ClassC_.$(MEXENDING): new_ns2ClassC_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns2ClassC_.cpp -output new_ns2ClassC_ +new_ns2ClassC.$(MEXENDING): new_ns2ClassC.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_ns2ClassC.cpp -output new_ns2ClassC -ns2ClassC: new_ns2ClassC_.$(MEXENDING) +ns2ClassC: new_ns2ClassC.$(MEXENDING) # ClassD -new_ClassD_.$(MEXENDING): new_ClassD_.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ClassD_.cpp -output new_ClassD_ +new_ClassD.$(MEXENDING): new_ClassD.cpp $(PATH_TO_WRAP)/matlab.h + $(MEX) $(mex_flags) new_ClassD.cpp -output new_ClassD -ClassD: new_ClassD_.$(MEXENDING) +ClassD: new_ClassD.$(MEXENDING) diff --git a/wrap/tests/expected_namespaces/make_testNamespaces.m b/wrap/tests/expected_namespaces/make_testNamespaces.m index 5ff13e5d4..5cf086db8 100644 --- a/wrap/tests/expected_namespaces/make_testNamespaces.m +++ b/wrap/tests/expected_namespaces/make_testNamespaces.m @@ -9,19 +9,19 @@ addpath(toolboxpath); %% ns1ClassA cd(toolboxpath) -mex -O5 new_ns1ClassA_.cpp +mex -O5 new_ns1ClassA.cpp cd @ns1ClassA %% ns1ClassB cd(toolboxpath) -mex -O5 new_ns1ClassB_.cpp +mex -O5 new_ns1ClassB.cpp cd @ns1ClassB %% ns2ClassA cd(toolboxpath) -mex -O5 new_ns2ClassA_.cpp +mex -O5 new_ns2ClassA.cpp mex -O5 ns2ClassA_afunction.cpp cd @ns2ClassA @@ -31,19 +31,19 @@ mex -O5 nsReturn.cpp %% ns2ns3ClassB cd(toolboxpath) -mex -O5 new_ns2ns3ClassB_.cpp +mex -O5 new_ns2ns3ClassB.cpp cd @ns2ns3ClassB %% ns2ClassC cd(toolboxpath) -mex -O5 new_ns2ClassC_.cpp +mex -O5 new_ns2ClassC.cpp cd @ns2ClassC %% ClassD cd(toolboxpath) -mex -O5 new_ClassD_.cpp +mex -O5 new_ClassD.cpp cd @ClassD diff --git a/wrap/tests/expected_namespaces/new_ClassD_.cpp b/wrap/tests/expected_namespaces/new_ClassD_.cpp deleted file mode 100644 index 6ebe46f2d..000000000 --- a/wrap/tests/expected_namespaces/new_ClassD_.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new ClassD()); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ClassD_.m b/wrap/tests/expected_namespaces/new_ClassD_.m deleted file mode 100644 index abfd419f6..000000000 --- a/wrap/tests/expected_namespaces/new_ClassD_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ClassD_(obj) - error('need to compile new_ClassD_.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp deleted file mode 100644 index eca52a3ea..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new ns1::ClassA()); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA_.m b/wrap/tests/expected_namespaces/new_ns1ClassA_.m deleted file mode 100644 index 054aba2f0..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassA_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns1ClassA_(obj) - error('need to compile new_ns1ClassA_.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp deleted file mode 100644 index 5eb90cae8..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new ns1::ClassB()); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB_.m b/wrap/tests/expected_namespaces/new_ns1ClassB_.m deleted file mode 100644 index b92398a17..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassB_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns1ClassB_(obj) - error('need to compile new_ns1ClassB_.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp deleted file mode 100644 index f0e6c2036..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new ns2::ClassA()); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA_.m b/wrap/tests/expected_namespaces/new_ns2ClassA_.m deleted file mode 100644 index 88dedf719..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassA_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns2ClassA_(obj) - error('need to compile new_ns2ClassA_.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp deleted file mode 100644 index ae6a88845..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new ns2::ClassC()); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC_.m b/wrap/tests/expected_namespaces/new_ns2ClassC_.m deleted file mode 100644 index b3f711e16..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassC_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns2ClassC_(obj) - error('need to compile new_ns2ClassC_.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp deleted file mode 100644 index bf6e244a2..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -struct Destruct -{ - void operator() (Shared* p) - { - collector.erase(p); - } -}; - -void cleanup(void) { - std::for_each( collector.begin(), collector.end(), Destruct() ); -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - if(nc == 0) { - self = new Shared(new ns2::ns3::ClassB()); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m deleted file mode 100644 index 2696c2498..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns2ns3ClassB_(obj) - error('need to compile new_ns2ns3ClassB_.cpp'); -end diff --git a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp b/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp index 3e8d54a14..6c903c946 100644 --- a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp +++ b/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp @@ -1,6 +1,5 @@ // automatically generated by wrap #include -#include #include #include typedef boost::shared_ptr Shareddouble; diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 8fac80113..2a0b5e259 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -220,18 +220,18 @@ TEST( wrap, matlab_code_namespaces ) { string act_path = "actual_namespaces/"; module.matlab_code("mex", "actual_namespaces", "mexa64", headerPath, "-O5"); - EXPECT(files_equal(exp_path + "new_ClassD_.cpp" , act_path + "new_ClassD_.cpp" )); - EXPECT(files_equal(exp_path + "new_ClassD_.m" , act_path + "new_ClassD_.m" )); - EXPECT(files_equal(exp_path + "new_ns1ClassA_.cpp" , act_path + "new_ns1ClassA_.cpp" )); - EXPECT(files_equal(exp_path + "new_ns1ClassA_.m" , act_path + "new_ns1ClassA_.m" )); - EXPECT(files_equal(exp_path + "new_ns1ClassB_.cpp" , act_path + "new_ns1ClassB_.cpp" )); - EXPECT(files_equal(exp_path + "new_ns1ClassB_.m" , act_path + "new_ns1ClassB_.m" )); - EXPECT(files_equal(exp_path + "new_ns2ClassA_.cpp" , act_path + "new_ns2ClassA_.cpp" )); - EXPECT(files_equal(exp_path + "new_ns2ClassA_.m" , act_path + "new_ns2ClassA_.m" )); - EXPECT(files_equal(exp_path + "new_ns2ClassC_.cpp" , act_path + "new_ns2ClassC_.cpp" )); - EXPECT(files_equal(exp_path + "new_ns2ClassC_.m" , act_path + "new_ns2ClassC_.m" )); - EXPECT(files_equal(exp_path + "new_ns2ns3ClassB_.cpp" , act_path + "new_ns2ns3ClassB_.cpp" )); - EXPECT(files_equal(exp_path + "new_ns2ns3ClassB_.m" , act_path + "new_ns2ns3ClassB_.m" )); + EXPECT(files_equal(exp_path + "new_ClassD.cpp" , act_path + "new_ClassD.cpp" )); + EXPECT(files_equal(exp_path + "new_ClassD.m" , act_path + "new_ClassD.m" )); + EXPECT(files_equal(exp_path + "new_ns1ClassA.cpp" , act_path + "new_ns1ClassA.cpp" )); + EXPECT(files_equal(exp_path + "new_ns1ClassA.m" , act_path + "new_ns1ClassA.m" )); + EXPECT(files_equal(exp_path + "new_ns1ClassB.cpp" , act_path + "new_ns1ClassB.cpp" )); + EXPECT(files_equal(exp_path + "new_ns1ClassB.m" , act_path + "new_ns1ClassB.m" )); + EXPECT(files_equal(exp_path + "new_ns2ClassA.cpp" , act_path + "new_ns2ClassA.cpp" )); + EXPECT(files_equal(exp_path + "new_ns2ClassA.m" , act_path + "new_ns2ClassA.m" )); + EXPECT(files_equal(exp_path + "new_ns2ClassC.cpp" , act_path + "new_ns2ClassC.cpp" )); + EXPECT(files_equal(exp_path + "new_ns2ClassC.m" , act_path + "new_ns2ClassC.m" )); + EXPECT(files_equal(exp_path + "new_ns2ns3ClassB.cpp" , act_path + "new_ns2ns3ClassB.cpp" )); + EXPECT(files_equal(exp_path + "new_ns2ns3ClassB.m" , act_path + "new_ns2ns3ClassB.m" )); EXPECT(files_equal(exp_path + "ns2ClassA_afunction.cpp" , act_path + "ns2ClassA_afunction.cpp" )); EXPECT(files_equal(exp_path + "ns2ClassA_afunction.m" , act_path + "ns2ClassA_afunction.m" )); @@ -265,12 +265,12 @@ TEST( wrap, matlab_code ) { EXPECT(files_equal(epath + "Makefile" , apath + "Makefile" )); EXPECT(files_equal(epath + "make_geometry.m" , apath + "make_geometry.m" )); - EXPECT(files_equal(epath + "new_Point2_.cpp" , apath + "new_Point2_.cpp" )); - EXPECT(files_equal(epath + "new_Point2_.m" , apath + "new_Point2_.m" )); - EXPECT(files_equal(epath + "new_Point3_.cpp" , apath + "new_Point3_.cpp" )); - EXPECT(files_equal(epath + "new_Point3_.m" , apath + "new_Point3_.m" )); - EXPECT(files_equal(epath + "new_Test_.cpp" , apath + "new_Test_.cpp" )); - EXPECT(files_equal(epath + "new_Test_.m" , apath + "new_Test_.m" )); + EXPECT(files_equal(epath + "new_Point2.cpp" , apath + "new_Point2.cpp" )); + EXPECT(files_equal(epath + "new_Point2.m" , apath + "new_Point2.m" )); + EXPECT(files_equal(epath + "new_Point3.cpp" , apath + "new_Point3.cpp" )); + EXPECT(files_equal(epath + "new_Point3.m" , apath + "new_Point3.m" )); + EXPECT(files_equal(epath + "new_Test.cpp" , apath + "new_Test.cpp" )); + EXPECT(files_equal(epath + "new_Test.m" , apath + "new_Test.m" )); EXPECT(files_equal(epath + "Point3_staticFunction.cpp" , apath + "Point3_staticFunction.cpp" )); EXPECT(files_equal(epath + "Point3_staticFunction.m" , apath + "Point3_staticFunction.m" )); diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 00606f930..9d56ec5cd 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -124,7 +124,6 @@ void generateUsingNamespace(FileWriter& file, const vector& using_namesp void generateIncludes(FileWriter& file, const string& class_name, const vector& includes) { file.oss << "#include " << endl; - file.oss << "#include " << endl; bool added_include = false; BOOST_FOREACH(const string& s, includes) { if (!s.empty()) { From 15b3dd9d5fbdd1e7b193564b1cdebcbcf0771f18 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 2 Jul 2012 19:09:50 +0000 Subject: [PATCH 532/914] adding new constructors for matlab wrap tests --- wrap/tests/expected/new_Point2.cpp | 39 ++++++++++++++++++ wrap/tests/expected/new_Point2.m | 4 ++ wrap/tests/expected/new_Point3.cpp | 39 ++++++++++++++++++ wrap/tests/expected/new_Point3.m | 4 ++ wrap/tests/expected/new_Test.cpp | 40 +++++++++++++++++++ wrap/tests/expected/new_Test.m | 4 ++ wrap/tests/expected_namespaces/new_ClassD.cpp | 34 ++++++++++++++++ wrap/tests/expected_namespaces/new_ClassD.m | 4 ++ .../expected_namespaces/new_ns1ClassA.cpp | 34 ++++++++++++++++ .../tests/expected_namespaces/new_ns1ClassA.m | 4 ++ .../expected_namespaces/new_ns1ClassB.cpp | 35 ++++++++++++++++ .../tests/expected_namespaces/new_ns1ClassB.m | 4 ++ .../expected_namespaces/new_ns2ClassA.cpp | 35 ++++++++++++++++ .../tests/expected_namespaces/new_ns2ClassA.m | 4 ++ .../expected_namespaces/new_ns2ClassC.cpp | 34 ++++++++++++++++ .../tests/expected_namespaces/new_ns2ClassC.m | 4 ++ .../expected_namespaces/new_ns2ns3ClassB.cpp | 35 ++++++++++++++++ .../expected_namespaces/new_ns2ns3ClassB.m | 4 ++ 18 files changed, 361 insertions(+) create mode 100644 wrap/tests/expected/new_Point2.cpp create mode 100644 wrap/tests/expected/new_Point2.m create mode 100644 wrap/tests/expected/new_Point3.cpp create mode 100644 wrap/tests/expected/new_Point3.m create mode 100644 wrap/tests/expected/new_Test.cpp create mode 100644 wrap/tests/expected/new_Test.m create mode 100644 wrap/tests/expected_namespaces/new_ClassD.cpp create mode 100644 wrap/tests/expected_namespaces/new_ClassD.m create mode 100644 wrap/tests/expected_namespaces/new_ns1ClassA.cpp create mode 100644 wrap/tests/expected_namespaces/new_ns1ClassA.m create mode 100644 wrap/tests/expected_namespaces/new_ns1ClassB.cpp create mode 100644 wrap/tests/expected_namespaces/new_ns1ClassB.m create mode 100644 wrap/tests/expected_namespaces/new_ns2ClassA.cpp create mode 100644 wrap/tests/expected_namespaces/new_ns2ClassA.m create mode 100644 wrap/tests/expected_namespaces/new_ns2ClassC.cpp create mode 100644 wrap/tests/expected_namespaces/new_ns2ClassC.m create mode 100644 wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp create mode 100644 wrap/tests/expected_namespaces/new_ns2ns3ClassB.m diff --git a/wrap/tests/expected/new_Point2.cpp b/wrap/tests/expected/new_Point2.cpp new file mode 100644 index 000000000..30a707f88 --- /dev/null +++ b/wrap/tests/expected/new_Point2.cpp @@ -0,0 +1,39 @@ +// automatically generated by wrap +#include +#include +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new Point2()); + if(nc == 1) { + double x = unwrap< double >(in[2]); + double y = unwrap< double >(in[3]); + self = new Shared(new Point2(x,y)); + } + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected/new_Point2.m b/wrap/tests/expected/new_Point2.m new file mode 100644 index 000000000..9a6edd425 --- /dev/null +++ b/wrap/tests/expected/new_Point2.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_Point2(obj,x,y) + error('need to compile new_Point2.cpp'); +end diff --git a/wrap/tests/expected/new_Point3.cpp b/wrap/tests/expected/new_Point3.cpp new file mode 100644 index 000000000..c3d758266 --- /dev/null +++ b/wrap/tests/expected/new_Point3.cpp @@ -0,0 +1,39 @@ +// automatically generated by wrap +#include +#include +using namespace geometry; +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) { + double x = unwrap< double >(in[2]); + double y = unwrap< double >(in[3]); + double z = unwrap< double >(in[4]); + self = new Shared(new Point3(x,y,z)); + } + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected/new_Point3.m b/wrap/tests/expected/new_Point3.m new file mode 100644 index 000000000..9cca5daa5 --- /dev/null +++ b/wrap/tests/expected/new_Point3.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_Point3(obj,x,y,z) + error('need to compile new_Point3.cpp'); +end diff --git a/wrap/tests/expected/new_Test.cpp b/wrap/tests/expected/new_Test.cpp new file mode 100644 index 000000000..050d179d3 --- /dev/null +++ b/wrap/tests/expected/new_Test.cpp @@ -0,0 +1,40 @@ +// automatically generated by wrap +#include +#include +using namespace geometry; +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new Test()); + if(nc == 1) { + double a = unwrap< double >(in[2]); + Matrix b = unwrap< Matrix >(in[3]); + self = new Shared(new Test(a,b)); + } + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected/new_Test.m b/wrap/tests/expected/new_Test.m new file mode 100644 index 000000000..ec9a13f63 --- /dev/null +++ b/wrap/tests/expected/new_Test.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_Test(obj,a,b) + error('need to compile new_Test.cpp'); +end diff --git a/wrap/tests/expected_namespaces/new_ClassD.cpp b/wrap/tests/expected_namespaces/new_ClassD.cpp new file mode 100644 index 000000000..13bbe9d5e --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ClassD.cpp @@ -0,0 +1,34 @@ +// automatically generated by wrap +#include +#include +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new ClassD()); + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected_namespaces/new_ClassD.m b/wrap/tests/expected_namespaces/new_ClassD.m new file mode 100644 index 000000000..d12bfffb1 --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ClassD.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_ClassD(obj) + error('need to compile new_ClassD.cpp'); +end diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA.cpp b/wrap/tests/expected_namespaces/new_ns1ClassA.cpp new file mode 100644 index 000000000..fc60abe6d --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns1ClassA.cpp @@ -0,0 +1,34 @@ +// automatically generated by wrap +#include +#include +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new ns1::ClassA()); + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA.m b/wrap/tests/expected_namespaces/new_ns1ClassA.m new file mode 100644 index 000000000..4412baae1 --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns1ClassA.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_ns1ClassA(obj) + error('need to compile new_ns1ClassA.cpp'); +end diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB.cpp b/wrap/tests/expected_namespaces/new_ns1ClassB.cpp new file mode 100644 index 000000000..419453968 --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns1ClassB.cpp @@ -0,0 +1,35 @@ +// automatically generated by wrap +#include +#include +#include +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new ns1::ClassB()); + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB.m b/wrap/tests/expected_namespaces/new_ns1ClassB.m new file mode 100644 index 000000000..b75d6b9bf --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns1ClassB.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_ns1ClassB(obj) + error('need to compile new_ns1ClassB.cpp'); +end diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA.cpp b/wrap/tests/expected_namespaces/new_ns2ClassA.cpp new file mode 100644 index 000000000..31e3385d5 --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns2ClassA.cpp @@ -0,0 +1,35 @@ +// automatically generated by wrap +#include +#include +#include +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new ns2::ClassA()); + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA.m b/wrap/tests/expected_namespaces/new_ns2ClassA.m new file mode 100644 index 000000000..b3b9201d6 --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns2ClassA.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_ns2ClassA(obj) + error('need to compile new_ns2ClassA.cpp'); +end diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC.cpp b/wrap/tests/expected_namespaces/new_ns2ClassC.cpp new file mode 100644 index 000000000..c0446109a --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns2ClassC.cpp @@ -0,0 +1,34 @@ +// automatically generated by wrap +#include +#include +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new ns2::ClassC()); + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC.m b/wrap/tests/expected_namespaces/new_ns2ClassC.m new file mode 100644 index 000000000..0f7ffb26f --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns2ClassC.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_ns2ClassC(obj) + error('need to compile new_ns2ClassC.cpp'); +end diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp new file mode 100644 index 000000000..a952790b5 --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp @@ -0,0 +1,35 @@ +// automatically generated by wrap +#include +#include +#include +typedef boost::shared_ptr Shared; + +static std::set collector; + +void cleanup(void) { + BOOST_FOREACH(Shared* p, collector) + collector.erase(p); +} +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(cleanup); + + const mxArray* input = in[0]; + Shared* self = *(Shared**) mxGetData(input); + + if(self) { + if(nargin > 1) { + collector.insert(self); + } + else if(collector.erase(self)) + delete self; + } else { + int nc = unwrap(in[1]); + + if(nc == 0) + self = new Shared(new ns2::ns3::ClassB()); + collector.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetPr(out[0])) = self; + } +} diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.m b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.m new file mode 100644 index 000000000..707e159f0 --- /dev/null +++ b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.m @@ -0,0 +1,4 @@ +% automatically generated by wrap +function result = new_ns2ns3ClassB(obj) + error('need to compile new_ns2ns3ClassB.cpp'); +end From c37237e43b4a403be77ab14ab7fe88d36338bd4f Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 2 Jul 2012 19:54:32 +0000 Subject: [PATCH 533/914] added conversions from non-pool-allocator containers --- gtsam/base/FastList.h | 11 ++++++++++- gtsam/base/FastSet.h | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/gtsam/base/FastList.h b/gtsam/base/FastList.h index 1b84adfed..aa1ab24e8 100644 --- a/gtsam/base/FastList.h +++ b/gtsam/base/FastList.h @@ -50,9 +50,18 @@ public: /** Copy constructor from another FastList */ FastList(const FastList& x) : Base(x) {} - /** Copy constructor from the base map class */ + /** Copy constructor from the base list class */ FastList(const Base& x) : Base(x) {} + /** Copy constructor from a standard STL container */ + FastList(const std::list& x) { + // This if statement works around a bug in boost pool allocator and/or + // STL vector where if the size is zero, the pool allocator will allocate + // huge amounts of memory. + if(x.size() > 0) + Base::assign(x.begin(), x.end()); + } + private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam/base/FastSet.h b/gtsam/base/FastSet.h index 4c6e31d4e..123a8bb31 100644 --- a/gtsam/base/FastSet.h +++ b/gtsam/base/FastSet.h @@ -66,11 +66,20 @@ public: Base(x) { } - /** Copy constructor from the base map class */ + /** Copy constructor from the base set class */ FastSet(const Base& x) : Base(x) { } + /** Copy constructor from a standard STL container */ + FastSet(const std::set& x) { + // This if statement works around a bug in boost pool allocator and/or + // STL vector where if the size is zero, the pool allocator will allocate + // huge amounts of memory. + if(x.size() > 0) + Base::insert(x.begin(), x.end()); + } + /** Print to implement Testable */ void print(const std::string& str = "") const { FastSetTestableHelper::print(*this, str); } From b8a627b19cb3343652891cf8dcd484119233a89a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 2 Jul 2012 22:33:28 +0000 Subject: [PATCH 534/914] Fixed 64/32-bit pointer detection in Matlab wrapper under Windows --- wrap/matlab.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wrap/matlab.h b/wrap/matlab.h index b11fedfd8..31e29c806 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -47,8 +47,8 @@ using namespace boost; // not usual, but for conciseness of generated code #define GTSAM_MAGIC_GAUSSIAN // end GTSAM Specifics ///////////////////////////////////////////////// -#ifdef __LP64__ -// 64-bit Mac +#if defined(__LP64__) || defined(_WIN64) +// 64-bit #define mxUINT32OR64_CLASS mxUINT64_CLASS #else #define mxUINT32OR64_CLASS mxUINT32_CLASS @@ -346,7 +346,7 @@ mxArray* create_collect_object(const char *classname, mxArray* h){ template mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast**> (mxGetPr(mxh)) = shared_ptr; + *reinterpret_cast**> (mxGetData(mxh)) = shared_ptr; //return mxh; return create_object(classname, mxh); } @@ -354,7 +354,7 @@ mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *cla template mxArray* wrap_collect_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast**> (mxGetPr(mxh)) = shared_ptr; + *reinterpret_cast**> (mxGetData(mxh)) = shared_ptr; //return mxh; return create_collect_object(classname, mxh); } @@ -367,6 +367,6 @@ boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& cla || mxGetM(mxh) != 1 || mxGetN(mxh) != 1) error( "Parameter is not an Shared type."); - boost::shared_ptr* spp = *reinterpret_cast**> (mxGetPr(mxh)); + boost::shared_ptr* spp = *reinterpret_cast**> (mxGetData(mxh)); return *spp; } From b163d26d5ecd5d757806dbac622f7884c445d4d2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 2 Jul 2012 22:33:36 +0000 Subject: [PATCH 535/914] Fixed invalid iterator bug during clear all in Matlab wrapper --- wrap/Constructor.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 9872d5fbe..323223a19 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -117,8 +117,10 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << "void cleanup(void) {" << endl; //TODO: Remove //file.oss << " std::for_each( collector.begin(), collector.end(), Destruct() );" << endl; - file.oss << " BOOST_FOREACH(Shared* p, collector)" << endl; - file.oss << " collector.erase(p);" << endl; + file.oss << " for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) {\n"; + file.oss << " delete *iter;\n"; + file.oss << " collector.erase(iter++);\n"; + file.oss << " }\n"; file.oss << "}" << endl; file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; From e40ce8b44d671dff3f0a6a1af7febd0d4f3d35d0 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Tue, 3 Jul 2012 01:28:41 +0000 Subject: [PATCH 536/914] Fixed class issue calling destructor --- wrap/Class.cpp | 4 ++-- wrap/Constructor.cpp | 21 ++++----------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index e57a85884..aae97de37 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -53,7 +53,7 @@ void Class::matlab_proxy(const string& classFile) const { id++; } //Static constructor collect call - file.oss << " if nargin ==14, new_" << matlabName << "_(varargin{1},0); end" << endl; + file.oss << " if nargin ==14, new_" << matlabName << "(varargin{1},0); end" << endl; file.oss << " if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('" << matlabName << " constructor failed'); end" << endl; file.oss << " end" << endl; // deconstructor @@ -61,7 +61,7 @@ void Class::matlab_proxy(const string& classFile) const { file.oss << " if obj.self ~= 0" << endl; //TODO: Add verbosity flag //file.oss << " fprintf(1,'MATLAB class deleting %x',obj.self);" << endl; - file.oss << " new_" << matlabName << "_(obj.self);" << endl; + file.oss << " new_" << matlabName << "(obj.self);" << endl; file.oss << " obj.self = 0;" << endl; file.oss << " end" << endl; file.oss << " end" << endl; diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 323223a19..978516b18 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -102,25 +102,12 @@ void Constructor::matlab_wrapper(const string& toolboxPath, file.oss << "static std::set collector;" << endl; file.oss << endl; - //TODO: Remove - //Generate the destructor function - /*file.oss << "struct Destruct" << endl; - file.oss << "{" << endl; - file.oss << " void operator() (Shared* p)" << endl; - file.oss << " {" << endl; - file.oss << " collector.erase(p);" << endl; - file.oss << " }" << endl; - file.oss << "};" << endl; - file.oss << endl;*/ - //Generate cleanup function file.oss << "void cleanup(void) {" << endl; - //TODO: Remove - //file.oss << " std::for_each( collector.begin(), collector.end(), Destruct() );" << endl; - file.oss << " for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) {\n"; - file.oss << " delete *iter;\n"; - file.oss << " collector.erase(iter++);\n"; - file.oss << " }\n"; + file.oss << " for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) {\n"; + file.oss << " delete *iter;\n"; + file.oss << " collector.erase(iter++);\n"; + file.oss << " }\n"; file.oss << "}" << endl; file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; From d2620d2ebc764c9fd53f16fc0fa2940cfac222a3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 3 Jul 2012 15:33:16 +0000 Subject: [PATCH 537/914] Add headers to wrap_lib target --- wrap/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 757b488ba..866ee7a3f 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -4,8 +4,10 @@ find_package(Boost 1.42 COMPONENTS system filesystem thread REQUIRED) # Build the executable itself file(GLOB wrap_srcs "*.cpp") +file(GLOB wrap_headers "*.h") list(REMOVE_ITEM wrap_srcs ${CMAKE_CURRENT_SOURCE_DIR}/wrap.cpp) -add_library(wrap_lib STATIC ${wrap_srcs}) +add_library(wrap_lib STATIC ${wrap_srcs} ${wrap_headers}) +gtsam_assign_source_folders(${wrap_srcs} ${wrap_headers}) add_executable(wrap wrap.cpp) target_link_libraries(wrap wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) From dbc5ece062991f18dc4e8051063ee62015e1a0ed Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 3 Jul 2012 15:33:28 +0000 Subject: [PATCH 538/914] Escapes to get quotes into compile/link flags for mex --- gtsam/CMakeLists.txt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 50ec1d4de..fb732ca51 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -94,7 +94,10 @@ if (GTSAM_BUILD_STATIC_LIBRARY) install(TARGETS gtsam-static EXPORT GTSAM-exports ARCHIVE DESTINATION lib) list(APPEND GTSAM_EXPORTED_TARGETS gtsam-static) set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) - set(gtsam-lib "gtsam-static") + set(gtsam-lib gtsam-static) + if(NOT GTSAM_BUILD_SHARED_LIBRARY) + set(gtsam-prefer-shared gtsam-static) + endif() endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) @@ -112,6 +115,7 @@ if (GTSAM_BUILD_SHARED_LIBRARY) if (NOT GTSAM_BUILD_STATIC_LIBRARY) set(gtsam-lib "gtsam-shared") endif() + set(gtsam-prefer-shared gtsam-shared) endif(GTSAM_BUILD_SHARED_LIBRARY) # Create the matlab toolbox for the gtsam library @@ -132,9 +136,11 @@ if (GTSAM_BUILD_WRAP) endif() # Generate, build and install toolbox - set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} ${CMAKE_CXX_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam -L${GTSAM_LIB_DIR} -lgtsam") - string(TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_toupper) - set(mexFlags "${mexFlags} -g COMPFLAGS='/c /DMATLAB_MEX_FILE ${CMAKE_CXX_FLAGS_${cmake_build_type_toupper}}'") + string(TOUPPER ${CMAKE_BUILD_TYPE} build_type_toupper) + get_target_property(gtsam_library_file ${gtsam-prefer-shared} LOCATION_${build_type_toupper}) + set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam ${gtsam_library_file}") + # Lots of escapes '\' here because they get eaten during subsequent calls to 'set' + set(mexFlags "${mexFlags} -g COMPFLAGS=\\\"$$COMPFLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${build_type_toupper}}\\\"") # Macro to handle details of setting up targets # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 From 2c4278491fbbfd9611ba3dca9e96a8d1dc53d5cc Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 3 Jul 2012 21:36:05 +0000 Subject: [PATCH 539/914] add approximate minimum spanning of hypergraph --- .settings/org.eclipse.cdt.core.prefs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs index a915be654..3278fdadc 100644 --- a/.settings/org.eclipse.cdt.core.prefs +++ b/.settings/org.eclipse.cdt.core.prefs @@ -1,6 +1,16 @@ -#Wed Oct 06 11:57:41 EDT 2010 eclipse.preferences.version=1 +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/PATH/delimiter=\: +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/PATH/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/PATH/value=/home/ydjian/matlab/R2012a/bin +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/append=true +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/appendContributed=true +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/PATH/delimiter=\: +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/PATH/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/PATH/value=/home/ydjian/matlab/R2012a/bin environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/append=true environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/appendContributed=true +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/PATH/delimiter=\: +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/PATH/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/PATH/value=/home/ydjian/matlab/R2012a/bin environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/append=true environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/appendContributed=true From 989c71e9a29fac16ebe0ba7233a7c24e0adc7fc2 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 4 Jul 2012 15:16:03 +0000 Subject: [PATCH 540/914] addMeasurements adds a bunch of measurements at the same time --- gtsam.h | 12 ++++++++---- gtsam/slam/visualSLAM.cpp | 15 ++++++++++++++- gtsam/slam/visualSLAM.h | 27 +++++++++++++++++++-------- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/gtsam.h b/gtsam.h index 3db42c90f..5af8f4e7c 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1288,10 +1288,14 @@ class Graph { void addRangeFactor(size_t poseKey, size_t pointKey, double range, const gtsam::noiseModel::Base* model); // Measurements - void addMeasurement(const gtsam::Point2& measured, const gtsam::noiseModel::Base* model, - size_t poseKey, size_t pointKey, const gtsam::Cal3_S2* K); - void addStereoMeasurement(const gtsam::StereoPoint2& measured, const gtsam::noiseModel::Base* model, - size_t poseKey, size_t pointKey, const gtsam::Cal3_S2Stereo* K); + void addMeasurement(const gtsam::Point2& measured, + const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, + const gtsam::Cal3_S2* K); + void addMeasurements(size_t i, const gtsam::KeyVector& J, Matrix Z, + const gtsam::noiseModel::Base* model, const gtsam::Cal3_S2* K); + void addStereoMeasurement(const gtsam::StereoPoint2& measured, + const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, + const gtsam::Cal3_S2Stereo* K); }; class ISAM { diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 6f31c345c..162ba03c7 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -47,7 +47,20 @@ namespace visualSLAM { /* ************************************************************************* */ void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrK K) { - push_back(make_shared >(measured, model, poseKey, pointKey, K)); + push_back( + make_shared > + (measured, model, poseKey, pointKey, K)); + } + + /* ************************************************************************* */ + void Graph::addMeasurements(Key i, const KeyVector& J, const Matrix& Z, + const SharedNoiseModel& model, const shared_ptrK K) { + if ( Z.rows()!=2) throw std::invalid_argument("addMeasurements: Z must be 2*K"); + if (Z.cols() != J.size()) + throw std::invalid_argument( + "addMeasurements: J and Z must have same number of entries"); + for(size_t k=0;k Date: Wed, 4 Jul 2012 15:41:19 +0000 Subject: [PATCH 541/914] Allow more parameters to be set --- gtsam.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gtsam.h b/gtsam.h index 5af8f4e7c..b80ddd26e 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1013,6 +1013,24 @@ class LevenbergMarquardtParams { LevenbergMarquardtParams(); LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose); void print(string s) const; + + double getMaxIterations() const; + double getRelativeErrorTol() const; + double getAbsoluteErrorTol() const; + double getErrorTol() const; + string getVerbosity() const; + + void setMaxIterations(double value); + void setRelativeErrorTol(double value); + void setAbsoluteErrorTol(double value); + void setErrorTol(double value); + void setVerbosity(string s); + + bool isMultifrontal() const; + bool isSequential() const; + bool isCholmod() const; + bool isCG() const; + double getlambdaInitial() const ; double getlambdaFactor() const ; double getlambdaUpperBound() const; From 11911e8940771d04ce53392e6db806b155249535 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:31 +0000 Subject: [PATCH 542/914] Created branch /branches/wrap_mods from /trunk:11889 From b5937ce35d8600341555de934773fd7ddc2819d5 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:36 +0000 Subject: [PATCH 543/914] Modified wrap to generate a single cpp wrapper file containing all wrapped functions, and one .m file per class and static method. --- wrap/Class.cpp | 133 ++++---- wrap/Class.h | 14 +- wrap/Constructor.cpp | 122 ++----- wrap/Constructor.h | 15 +- wrap/Deconstructor.cpp | 54 ++- wrap/Deconstructor.h | 8 +- wrap/Method.cpp | 62 ++-- wrap/Method.h | 9 +- wrap/Module.cpp | 88 ++++- wrap/Module.h | 2 + wrap/ReturnValue.cpp | 24 +- wrap/StaticMethod.cpp | 70 ++-- wrap/StaticMethod.h | 11 +- wrap/matlab.h | 759 +++++++++++++++++++++-------------------- wrap/utilities.cpp | 1 - 15 files changed, 690 insertions(+), 682 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index aae97de37..da1510d29 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -28,81 +28,96 @@ using namespace std; using namespace wrap; +static const uint64_t ptr_constructor_key = + (uint64_t('G') << 56) | + (uint64_t('T') << 48) | + (uint64_t('S') << 40) | + (uint64_t('A') << 32) | + (uint64_t('M') << 24) | + (uint64_t('p') << 16) | + (uint64_t('t') << 8) | + (uint64_t('r')); + /* ************************************************************************* */ -void Class::matlab_proxy(const string& classFile) const { +void Class::matlab_proxy(const string& classFile, const string& wrapperName, FileWriter& wrapperFile, vector& functionNames) const { // open destination classFile - FileWriter file(classFile, verbose_, "%"); + FileWriter proxyFile(classFile, verbose_, "%"); // get the name of actual matlab object - string matlabName = qualifiedName(); + string matlabName = qualifiedName(), cppName = qualifiedName("::"); // emit class proxy code // we want our class to inherit the handle class for memory purposes - file.oss << "classdef " << matlabName << " < handle" << endl; - file.oss << " properties" << endl; - file.oss << " self = 0" << endl; - file.oss << " end" << endl; - file.oss << " methods" << endl; - // constructor - file.oss << " function obj = " << matlabName << "(varargin)" << endl; - //i is constructor id - int id = 0; + proxyFile.oss << "classdef " << matlabName << " < handle" << endl; + proxyFile.oss << " properties" << endl; + proxyFile.oss << " self = 0" << endl; + proxyFile.oss << " end" << endl; + proxyFile.oss << " methods" << endl; + + // Constructor + proxyFile.oss << " function obj = " << matlabName << "(varargin)" << endl; + // Special pointer constructor + { + const int id = functionNames.size(); + proxyFile.oss << " if nargin == 2 && isa(varargin{1}, 'uint64') && "; + proxyFile.oss << "varargin{1} == uint64(" << ptr_constructor_key << ")\n"; + proxyFile.oss << " obj.self = varargin{2};\n"; + } + // Regular constructors BOOST_FOREACH(ArgumentList a, constructor.args_list) { - constructor.matlab_proxy_fragment(file,matlabName, id, a); - id++; + const int id = functionNames.size(); + constructor.proxy_fragment(proxyFile, wrapperName, matlabName, id, a); + const string wrapFunctionName = constructor.wrapper_fragment(wrapperFile, + cppName, matlabName, id, using_namespaces, includes, a); + wrapperFile.oss << "\n"; + functionNames.push_back(wrapFunctionName); } - //Static constructor collect call - file.oss << " if nargin ==14, new_" << matlabName << "(varargin{1},0); end" << endl; - file.oss << " if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('" << matlabName << " constructor failed'); end" << endl; - file.oss << " end" << endl; - // deconstructor - file.oss << " function delete(obj)" << endl; - file.oss << " if obj.self ~= 0" << endl; - //TODO: Add verbosity flag - //file.oss << " fprintf(1,'MATLAB class deleting %x',obj.self);" << endl; - file.oss << " new_" << matlabName << "(obj.self);" << endl; - file.oss << " obj.self = 0;" << endl; - file.oss << " end" << endl; - file.oss << " end" << endl; - file.oss << " function display(obj), obj.print(''); end" << endl; - file.oss << " function disp(obj), obj.display; end" << endl; - file.oss << " end" << endl; - file.oss << "end" << endl; + proxyFile.oss << " else\n"; + proxyFile.oss << " error('" << matlabName << " constructor failed');" << endl; + proxyFile.oss << " end\n"; + proxyFile.oss << " end\n\n"; - // close file - file.emit(true); + // Deconstructor + { + const int id = functionNames.size(); + deconstructor.proxy_fragment(proxyFile, wrapperName, matlabName, id); + proxyFile.oss << "\n"; + const string functionName = deconstructor.wrapper_fragment(wrapperFile, + cppName, matlabName, id, using_namespaces, includes); + wrapperFile.oss << "\n"; + functionNames.push_back(functionName); + } + proxyFile.oss << " function display(obj), obj.print(''); end\n\n"; + proxyFile.oss << " function disp(obj), obj.display; end\n\n"; + + // Methods + BOOST_FOREACH(Method m, methods) { + const int id = functionNames.size(); + m.proxy_fragment(proxyFile, wrapperName, id); + proxyFile.oss << "\n"; + const string wrapFunctionName = m.wrapper_fragment(wrapperFile, + cppName, matlabName, id, using_namespaces); + wrapperFile.oss << "\n"; + functionNames.push_back(wrapFunctionName); + } + + proxyFile.oss << " end" << endl; + proxyFile.oss << "end" << endl; + + // Close file + proxyFile.emit(true); } /* ************************************************************************* */ -//TODO: Consolidate into single file -void Class::matlab_constructors(const string& toolboxPath) const { - /*BOOST_FOREACH(Constructor c, constructors) { - args_list.push_back(c.args); - }*/ - - BOOST_FOREACH(ArgumentList a, constructor.args_list) { - constructor.matlab_mfile(toolboxPath, qualifiedName(), a); - } - constructor.matlab_wrapper(toolboxPath, qualifiedName("::"), qualifiedName(), - using_namespaces, includes); -} - -/* ************************************************************************* */ -void Class::matlab_methods(const string& classPath) const { - string matlabName = qualifiedName(), cppName = qualifiedName("::"); - BOOST_FOREACH(Method m, methods) { - m.matlab_mfile (classPath); - m.matlab_wrapper(classPath, name, cppName, matlabName, using_namespaces, includes); - } -} - -/* ************************************************************************* */ -void Class::matlab_static_methods(const string& toolboxPath) const { +void Class::matlab_static_methods(const string& toolboxPath, const string& wrapperName, + FileWriter& wrapperFile, vector& functionNames) const { string matlabName = qualifiedName(), cppName = qualifiedName("::"); BOOST_FOREACH(const StaticMethod& m, static_methods) { - m.matlab_mfile (toolboxPath, qualifiedName()); - m.matlab_wrapper(toolboxPath, name, matlabName, cppName, using_namespaces, includes); + const int id = functionNames.size(); + m.proxy_fragment(toolboxPath, matlabName, wrapperName, id); + const string wrapFunction = m.wrapper_fragment(wrapperFile, matlabName, cppName, id, using_namespaces); + functionNames.push_back(wrapFunction); } } diff --git a/wrap/Class.h b/wrap/Class.h index fb9906716..bef7467c3 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -19,6 +19,7 @@ #pragma once #include +#include #include "Constructor.h" #include "Deconstructor.h" @@ -37,16 +38,17 @@ struct Class { std::vector methods; ///< Class methods std::vector static_methods; ///< Static methods std::vector namespaces; ///< Stack of namespaces - std::vector using_namespaces; ///< default namespaces + std::vector using_namespaces;///< default namespaces std::vector includes; ///< header include overrides - Constructor constructor; ///< Class constructors + Constructor constructor; ///< Class constructors + Deconstructor deconstructor; ///< Deconstructor to deallocate C++ object bool verbose_; ///< verbose flag // And finally MATLAB code is emitted, methods below called by Module::matlab_code - void matlab_proxy(const std::string& classFile) const; ///< emit proxy class - void matlab_constructors(const std::string& toolboxPath) const; ///< emit constructor wrappers - void matlab_methods(const std::string& classPath) const; ///< emit method wrappers - void matlab_static_methods(const std::string& classPath) const; ///< emit static method wrappers + void matlab_proxy(const std::string& classFile, const std::string& wrapperName, + FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit proxy class + void matlab_static_methods(const std::string& toolboxPath, const std::string& wrapperName, + FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit static method wrappers void matlab_make_fragment(FileWriter& file, const std::string& toolboxPath, const std::string& mexFlags) const; ///< emit make fragment for global make script diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 978516b18..43f35fb86 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "utilities.h" #include "Constructor.h" @@ -35,11 +36,11 @@ string Constructor::matlab_wrapper_name(const string& className) const { } /* ************************************************************************* */ -void Constructor::matlab_proxy_fragment(FileWriter& file, +void Constructor::proxy_fragment(FileWriter& file, const std::string& wrapperName, const string& className, const int id, const ArgumentList args) const { size_t nrArgs = args.size(); // check for number of arguments... - file.oss << " if (nargin == " << nrArgs; + file.oss << " elseif nargin == " << nrArgs; if (nrArgs>0) file.oss << " && "; // ...and their types bool first = true; @@ -49,117 +50,48 @@ void Constructor::matlab_proxy_fragment(FileWriter& file, first=false; } // emit code for calling constructor - file.oss << "), obj.self = " << matlab_wrapper_name(className) << "(" << "0," << id; + file.oss << "\n obj.self = " << wrapperName << "(" << id; // emit constructor arguments for(size_t i=0;i& using_namespaces, - const vector& includes) const { - string matlabName = matlab_wrapper_name(matlabClassName); - - // open destination wrapperFile - string wrapperFile = toolboxPath + "/" + matlabName + ".cpp"; - FileWriter file(wrapperFile, verbose_, "//"); - - // generate code - generateIncludes(file, name, includes); - generateUsingNamespace(file, using_namespaces); + const vector& includes, + const ArgumentList& al) const { + const string matlabName = matlab_wrapper_name(matlabClassName); + const string wrapFunctionName = matlabClassName + "_constructor_" + boost::lexical_cast(id); + file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; + file.oss << "{\n"; + file.oss << " mexAtExit(&_deleteAllObjects);\n"; + generateUsingNamespace(file, using_namespaces); //Typedef boost::shared_ptr - file.oss << "typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; - file.oss << endl; + file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;\n"; + file.oss << "\n"; - //Generate collector - file.oss << "static std::set collector;" << endl; - file.oss << endl; + //Check to see if there will be any arguments and remove {} for consiseness + if(al.size() > 0) + al.matlab_unwrap(file); // unwrap arguments + file.oss << " Shared *self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; + file.oss << " collector_" << matlabClassName << ".insert(self);\n"; - //Generate cleanup function - file.oss << "void cleanup(void) {" << endl; - file.oss << " for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) {\n"; - file.oss << " delete *iter;\n"; - file.oss << " collector.erase(iter++);\n"; - file.oss << " }\n"; - file.oss << "}" << endl; - - file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; - file.oss << "{" << endl; - //Cleanup function callback - file.oss << " mexAtExit(cleanup);" << endl; - file.oss << endl; - file.oss << " const mxArray* input = in[0];" << endl; - file.oss << " Shared* self = *(Shared**) mxGetData(input);" << endl; - file.oss << endl; - file.oss << " if(self) {" << endl; - file.oss << " if(nargin > 1) {" << endl; - file.oss << " collector.insert(self);" << endl; - if(verbose_) - file.oss << " std::cout << \"Collected\" << collector.size() << std::endl;" << endl; - file.oss << " }" << endl; - file.oss << " else if(collector.erase(self))" << endl; - file.oss << " delete self;" << endl; - file.oss << " } else {" << endl; - file.oss << " int nc = unwrap(in[1]);" << endl << endl; - - int i = 0; - BOOST_FOREACH(ArgumentList al, args_list) - { - //Check to see if there will be any arguments and remove {} for consiseness - if(al.size()) - { - file.oss << " if(nc == " << i <<") {" << endl; - al.matlab_unwrap(file, 2); // unwrap arguments, start at 1 - file.oss << " self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; - file.oss << " }" << endl; - } - else - { - file.oss << " if(nc == " << i <<")" << endl; - file.oss << " self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; - } - i++; - } - - //file.oss << " self = construct(nc, in);" << endl; - file.oss << " collector.insert(self);" << endl; - if(verbose_) - file.oss << " std::cout << \"constructed \" << self << \", size=\" << collector.size() << std::endl;" << endl; - file.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);" << endl; - file.oss << " *reinterpret_cast (mxGetPr(out[0])) = self;" << endl; - file.oss << " }" << endl; + if(verbose_) + file.oss << " std::cout << \"constructed \" << self << \" << std::endl;" << endl; + file.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);" << endl; + file.oss << " *reinterpret_cast (mxGetData(out[0])) = self;" << endl; file.oss << "}" << endl; - // close file - file.emit(true); + return wrapFunctionName; } /* ************************************************************************* */ diff --git a/wrap/Constructor.h b/wrap/Constructor.h index 467ff3b22..4a9e31f9b 100644 --- a/wrap/Constructor.h +++ b/wrap/Constructor.h @@ -48,21 +48,18 @@ struct Constructor { * Create fragment to select constructor in proxy class, e.g., * if nargin == 2, obj.self = new_Pose3_RP(varargin{1},varargin{2}); end */ - void matlab_proxy_fragment(FileWriter& file, - const std::string& className, const int i, + void proxy_fragment(FileWriter& file, const std::string& wrapperName, + const std::string& className, const int id, const ArgumentList args) const; - /// m-file - void matlab_mfile(const std::string& toolboxPath, - const std::string& qualifiedMatlabName, - const ArgumentList args) const; - /// cpp wrapper - void matlab_wrapper(const std::string& toolboxPath, + std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, const std::string& matlabClassName, + int id, const std::vector& using_namespaces, - const std::vector& includes) const; + const std::vector& includes, + const ArgumentList& al) const; /// constructor function void generate_construct(FileWriter& file, const std::string& cppClassName, diff --git a/wrap/Deconstructor.cpp b/wrap/Deconstructor.cpp index 93ed724f5..335488cf5 100644 --- a/wrap/Deconstructor.cpp +++ b/wrap/Deconstructor.cpp @@ -19,6 +19,7 @@ #include #include +#include #include "utilities.h" #include "Deconstructor.h" @@ -33,51 +34,42 @@ string Deconstructor::matlab_wrapper_name(const string& className) const { } /* ************************************************************************* */ -void Deconstructor::matlab_mfile(const string& toolboxPath, const string& qualifiedMatlabName) const { +void Deconstructor::proxy_fragment(FileWriter& file, + const std::string& wrapperName, + const std::string& qualifiedMatlabName, int id) const { - string matlabName = matlab_wrapper_name(qualifiedMatlabName); - - // open destination m-file - string wrapperFile = toolboxPath + "/" + matlabName + ".m"; - FileWriter file(wrapperFile, verbose_, "%"); - - // generate code - file.oss << "function result = " << matlabName << "(obj"; - if (args.size()) file.oss << "," << args.names(); - file.oss << ")" << endl; - file.oss << " error('need to compile " << matlabName << ".cpp');" << endl; - file.oss << "end" << endl; - - // close file - file.emit(true); + file.oss << " function delete(obj)\n"; + file.oss << " " << wrapperName << "(" << id << ", obj.self);\n"; + file.oss << " end\n"; } /* ************************************************************************* */ -void Deconstructor::matlab_wrapper(const string& toolboxPath, +string Deconstructor::wrapper_fragment(FileWriter& file, const string& cppClassName, const string& matlabClassName, + int id, const vector& using_namespaces, const vector& includes) const { - string matlabName = matlab_wrapper_name(matlabClassName); + + const string matlabName = matlab_wrapper_name(matlabClassName); - // open destination wrapperFile - string wrapperFile = toolboxPath + "/" + matlabName + ".cpp"; - FileWriter file(wrapperFile, verbose_, "//"); - - // generate code - // - generateIncludes(file, name, includes); - cout << "Generate includes " << name << endl; - generateUsingNamespace(file, using_namespaces); + const string wrapFunctionName = matlabClassName + "_deconstructor_" + boost::lexical_cast(id); - file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; + file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; file.oss << "{" << endl; + generateUsingNamespace(file, using_namespaces); + file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; //Deconstructor takes 1 arg, the mxArray obj file.oss << " checkArguments(\"" << matlabName << "\",nargout,nargin," << "1" << ");" << endl; - file.oss << " delete_shared_ptr< " << cppClassName << " >(in[0],\"" << matlabClassName << "\");" << endl; + file.oss << " Shared *self = *reinterpret_cast(mxGetData(in[0]));\n"; + file.oss << " Collector_" << matlabClassName << "::iterator item;\n"; + file.oss << " item = collector_" << matlabClassName << ".find(self);\n"; + file.oss << " if(item != collector_" << matlabClassName << ".end()) {\n"; + file.oss << " delete self;\n"; + file.oss << " collector_" << matlabClassName << ".erase(item);\n"; + file.oss << " }\n"; file.oss << "}" << endl; - // close file - file.emit(true); + return wrapFunctionName; } /* ************************************************************************* */ diff --git a/wrap/Deconstructor.h b/wrap/Deconstructor.h index a5af4e327..363f986e6 100644 --- a/wrap/Deconstructor.h +++ b/wrap/Deconstructor.h @@ -46,13 +46,15 @@ struct Deconstructor { std::string matlab_wrapper_name(const std::string& className) const; /// m-file - void matlab_mfile(const std::string& toolboxPath, - const std::string& qualifiedMatlabName) const; + void proxy_fragment(FileWriter& file, + const std::string& wrapperName, + const std::string& qualifiedMatlabName, int id) const; /// cpp wrapper - void matlab_wrapper(const std::string& toolboxPath, + std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, const std::string& matlabClassName, + int id, const std::vector& using_namespaces, const std::vector& includes) const; }; diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 60b02918f..bcca86d40 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -18,6 +18,7 @@ #include #include +#include #include "Method.h" #include "utilities.h" @@ -26,57 +27,49 @@ using namespace std; using namespace wrap; /* ************************************************************************* */ -void Method::matlab_mfile(const string& classPath) const { +void Method::proxy_fragment(FileWriter& file, const std::string& wrapperName, const int id) const { - // open destination m-file - string wrapperFile = classPath + "/" + name + ".m"; - FileWriter file(wrapperFile, verbose_, "%"); - - // generate code - string returnType = returnVal.matlab_returnType(); - file.oss << "% " << returnType << " = obj." << name << "(" << args.names() << ")" << endl; - file.oss << "function " << returnType << " = " << name << "(obj"; - if (args.size()) file.oss << "," << args.names(); - file.oss << ")" << endl; - file.oss << " error('need to compile " << name << ".cpp');" << endl; - file.oss << "end" << endl; - - // close file - file.emit(false); + string output; + if(returnVal.isPair) + output = "[ r1 r2 ] = "; + else if(returnVal.category1 == ReturnValue::VOID) + output = ""; + else + output = "r = "; + file.oss << " function " << output << name << "(varargin)\n"; + file.oss << " " << output << wrapperName << "(" << id << ", varargin{:});\n"; + file.oss << " end\n"; } /* ************************************************************************* */ -void Method::matlab_wrapper(const string& classPath, - const string& className, +string Method::wrapper_fragment(FileWriter& file, const string& cppClassName, const string& matlabClassName, - const vector& using_namespaces, const std::vector& includes) const { - // open destination wrapperFile - string wrapperFile = classPath + "/" + name + ".cpp"; - FileWriter file(wrapperFile, verbose_, "//"); + int id, + const vector& using_namespaces) const { // generate code - // header - generateIncludes(file, className, includes); - generateUsingNamespace(file, using_namespaces); + const string wrapFunctionName = matlabClassName + "_" + name + "_" + boost::lexical_cast(id); + + // call + file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; + // start + file.oss << "{\n"; + generateUsingNamespace(file, using_namespaces); if(returnVal.isPair) { if(returnVal.category1 == ReturnValue::CLASS) - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; if(returnVal.category2 == ReturnValue::CLASS) - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; + file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; } else if(returnVal.category1 == ReturnValue::CLASS) - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; - file.oss << "typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; - // call - file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; - // start - file.oss << "{\n"; + file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; // check arguments // extra argument obj -> nargin-1 is passed ! @@ -103,8 +96,7 @@ void Method::matlab_wrapper(const string& classPath, // finish file.oss << "}\n"; - // close file - file.emit(true); + return wrapFunctionName; } /* ************************************************************************* */ diff --git a/wrap/Method.h b/wrap/Method.h index bcfac82e3..60b0c1282 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -42,13 +42,12 @@ struct Method { // MATLAB code generation // classPath is class directory, e.g., ../matlab/@Point2 - void matlab_mfile(const std::string& classPath) const; ///< m-file - void matlab_wrapper(const std::string& classPath, - const std::string& className, + void proxy_fragment(FileWriter& file, const std::string& wrapperName, const int id) const; + std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, const std::string& matlabClassname, - const std::vector& using_namespaces, - const std::vector& includes) const; ///< cpp wrapper + int id, + const std::vector& using_namespaces) const; ///< cpp wrapper }; } // \namespace wrap diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 13adacc4c..2f1b1f252 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -56,7 +56,7 @@ Module::Module(const string& interfacePath, ArgumentList args0, args; vector arg_dup; ///keep track of duplicates Constructor constructor0(enable_verbose), constructor(enable_verbose); - //Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); + Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); Method method0(enable_verbose), method(enable_verbose); StaticMethod static_method0(enable_verbose), static_method(enable_verbose); Class cls0(enable_verbose),cls(enable_verbose); @@ -193,10 +193,10 @@ Module::Module(const string& interfacePath, [assign_a(cls.namespaces, namespaces)] [assign_a(cls.using_namespaces, using_namespace_current)] [append_a(cls.includes, namespace_includes)] - //[assign_a(deconstructor.name,cls.name)] - //[assign_a(cls.d, deconstructor)] + [assign_a(deconstructor.name,cls.name)] + [assign_a(cls.deconstructor, deconstructor)] [push_back_a(classes,cls)] - //[assign_a(deconstructor,deconstructor0)] + [assign_a(deconstructor,deconstructor0)] [assign_a(constructor, constructor0)] [assign_a(cls,cls0)]; @@ -299,6 +299,16 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, string makeFileName = toolboxPath + "/Makefile"; FileWriter makeModuleMakefile(makeFileName, verbose, "#"); + // create the unified .cpp switch file + const string wrapperName = name + "_wrapper"; + string wrapperFileName = toolboxPath + "/" + wrapperName + ".cpp"; + FileWriter wrapperFile(wrapperFileName, verbose, "//"); + vector functionNames; // Function names stored by index for switch + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "\n"; + makeModuleMfile.oss << "echo on" << endl << endl; makeModuleMfile.oss << "toolboxpath = mfilename('fullpath');" << endl; makeModuleMfile.oss << "delims = find(toolboxpath == '/' | toolboxpath == '\\');" << endl; @@ -333,15 +343,42 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, } makeModuleMakefile.oss << "\n\n"; + // Generate all includes + BOOST_FOREACH(Class cls, classes) { + generateIncludes(wrapperFile, cls.name, cls.includes); + } + wrapperFile.oss << "\n"; + + // Generate all collectors + BOOST_FOREACH(Class cls, classes) { + const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); + wrapperFile.oss << "typedef std::set*> " + << "Collector_" << matlabName << ";\n"; + wrapperFile.oss << "static Collector_" << matlabName << + " collector_" << matlabName << ";\n"; + } + + // generate mexAtExit cleanup function + wrapperFile.oss << "void _deleteAllObjects()\n"; + wrapperFile.oss << "{\n"; + BOOST_FOREACH(Class cls, classes) { + const string matlabName = cls.qualifiedName(); + const string cppName = cls.qualifiedName("::"); + const string collectorType = "Collector_" + matlabName; + const string collectorName = "collector_" + matlabName; + wrapperFile.oss << " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n"; + wrapperFile.oss << " iter != " << collectorName << ".end(); ) {\n"; + wrapperFile.oss << " delete *iter;\n"; + wrapperFile.oss << " " << collectorName << ".erase(iter++);\n"; + wrapperFile.oss << " }\n"; + } + wrapperFile.oss << "}\n"; + // generate proxy classes and wrappers BOOST_FOREACH(Class cls, classes) { - // create directory if needed - string classPath = toolboxPath + "/@" + cls.qualifiedName(); - fs::create_directories(classPath); - // create proxy class - string classFile = classPath + "/" + cls.qualifiedName() + ".m"; - cls.matlab_proxy(classFile); + string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; + cls.matlab_proxy(classFile, wrapperName, wrapperFile, functionNames); // verify all of the function arguments //TODO:verifyArguments(validTypes, cls.constructor.args_list); @@ -353,12 +390,7 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, verifyReturnTypes(validTypes, cls.methods); // create constructor and method wrappers - cls.matlab_constructors(toolboxPath); - cls.matlab_static_methods(toolboxPath); - cls.matlab_methods(classPath); - - // create deconstructor - //cls.matlab_deconstructor(toolboxPath); + cls.matlab_static_methods(toolboxPath, wrapperName, wrapperFile, functionNames); // add lines to make m-file makeModuleMfile.oss << "%% " << cls.qualifiedName() << endl; @@ -384,6 +416,30 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, // finish Makefile makeModuleMakefile.oss << "\n" << endl; makeModuleMakefile.emit(true); + + // finish wrapper file + finish_wrapper(wrapperFile, functionNames); + + wrapperFile.emit(true); } +/* ************************************************************************* */ + void Module::finish_wrapper(FileWriter& file, const std::vector& functionNames) const { + file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; + file.oss << "{\n"; + file.oss << " mstream mout;\n"; // Send stdout to MATLAB console, see matlab.h + file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; + file.oss << " int id = unwrap(in[0]);\n\n"; + file.oss << " switch(id) {\n"; + for(size_t id = 0; id < functionNames.size(); ++id) { + file.oss << " case " << id << ":\n"; + file.oss << " " << functionNames[id] << "(nargout, out, nargin-1, in+1);\n"; + file.oss << " break;\n"; + } + file.oss << " }\n"; + file.oss << "\n"; + file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout, see matlab.h + file.oss << "}\n"; + } + /* ************************************************************************* */ diff --git a/wrap/Module.h b/wrap/Module.h index 239aa20b0..8df6abbba 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -46,6 +46,8 @@ struct Module { const std::string& mexExt, const std::string& headerPath, const std::string& mexFlags) const; + + void finish_wrapper(FileWriter& file, const std::vector& functionNames) const; }; } // \namespace wrap diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index 087a1c6ef..2c1231c6b 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -49,16 +49,20 @@ string ReturnValue::qualifiedType2(const string& delim) const { void ReturnValue::wrap_result(FileWriter& file) const { string cppType1 = qualifiedType1("::"), matlabType1 = qualifiedType1(); string cppType2 = qualifiedType2("::"), matlabType2 = qualifiedType2(); + const string collectorName1 = "collector_" + matlabType1; + const string collectorName2 = "collector_" + matlabType2; if (isPair) { // first return value in pair if (isPtr1) {// if we already have a pointer file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result.first);" << endl; - file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + file.oss << " " << collectorName1 << ".insert(ret);\n"; + file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (category1 == ReturnValue::CLASS) { // if we are going to make one - file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result.first));\n"; - file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result.first));\n"; + file.oss << " " << collectorName1 << ".insert(ret);\n"; + file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else // if basis type file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result.first);\n"; @@ -66,22 +70,26 @@ void ReturnValue::wrap_result(FileWriter& file) const { // second return value in pair if (isPtr2) {// if we already have a pointer file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(result.second);" << endl; - file.oss << " out[1] = wrap_collect_shared_ptr(ret,\"" << matlabType2 << "\");\n"; + file.oss << " " << collectorName2 << ".insert(ret);\n"; + file.oss << " out[1] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; } else if (category2 == ReturnValue::CLASS) { // if we are going to make one - file.oss << " Shared" << type2 << "* ret = new Shared" << type2 << "(new " << cppType2 << "(result.first));\n"; - file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType2 << "\");\n"; + file.oss << " Shared" << type2 << "* ret = new Shared" << type2 << "(new " << cppType2 << "(result.first));\n"; + file.oss << " " << collectorName2 << ".insert(ret);\n"; + file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; } else file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(result.second);\n"; } else if (isPtr1){ file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result);" << endl; - file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + file.oss << " " << collectorName1 << ".insert(ret);\n"; + file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (category1 == ReturnValue::CLASS){ file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result));\n"; - file.oss << " out[0] = wrap_collect_shared_ptr(ret,\"" << matlabType1 << "\");\n"; + file.oss << " " << collectorName1 << ".insert(ret);\n"; + file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (matlabType1!="void") file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result);\n"; diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index a4fb3fbe8..8cdf0e597 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -19,6 +19,7 @@ #include #include +#include #include "StaticMethod.h" #include "utilities.h" @@ -27,55 +28,51 @@ using namespace std; using namespace wrap; /* ************************************************************************* */ -void StaticMethod::matlab_mfile(const string& toolboxPath, const string& className) const { +void StaticMethod::proxy_fragment(const string& toolboxPath, const string& matlabClassName, const std::string& wrapperName, const int id) const { - // open destination m-file - string full_name = className + "_" + name; - string wrapperFile = toolboxPath + "/" + full_name + ".m"; - FileWriter file(wrapperFile, verbose, "%"); + const string full_name = matlabClassName + "_" + name; + FileWriter file(toolboxPath + "/" + full_name + ".m", verbose, "%"); - // generate code - string returnType = returnVal.matlab_returnType(); - file.oss << "function " << returnType << " = " << full_name << "("; - if (args.size()) file.oss << args.names(); - file.oss << ")" << endl; - file.oss << "% usage: x = " << full_name << "(" << args.names() << ")" << endl; - file.oss << " error('need to compile " << full_name << ".cpp');" << endl; - file.oss << "end" << endl; + string output; + if(returnVal.isPair) + output = "[ r1 r2 ] = "; + else if(returnVal.category1 == ReturnValue::VOID) + output = ""; + else + output = "r = "; + file.oss << "function " << output << full_name << "(varargin)\n"; + file.oss << " " << output << wrapperName << "(" << id << ", varargin{:});\n"; + file.oss << "end\n"; - // close file - file.emit(true); + file.emit(true); } /* ************************************************************************* */ -void StaticMethod::matlab_wrapper(const string& toolboxPath, const string& className, +string StaticMethod::wrapper_fragment(FileWriter& file, const string& matlabClassName, const string& cppClassName, - const vector& using_namespaces, - const vector& includes) const { - // open destination wrapperFile - string full_name = matlabClassName + "_" + name; - string wrapperFile = toolboxPath + "/" + full_name + ".cpp"; - FileWriter file(wrapperFile, verbose, "//"); + int id, const vector& using_namespaces) const { + + const string full_name = matlabClassName + "_" + name; + const string wrapFunctionName = matlabClassName + "_" + name + "_" + boost::lexical_cast(id); - // generate code - - // header - generateIncludes(file, className, includes); - generateUsingNamespace(file, using_namespaces); + // call + file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; + // start + file.oss << "{\n"; + generateUsingNamespace(file, using_namespaces); if(returnVal.isPair) { - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; + if(returnVal.category1 == ReturnValue::CLASS) + file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + if(returnVal.category2 == ReturnValue::CLASS) + file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; } else - file.oss << "typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + if(returnVal.category1 == ReturnValue::CLASS) + file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; - file.oss << "typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; - // call - file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; - // start - file.oss << "{\n"; + file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; // check arguments // NOTE: for static functions, there is no object passed @@ -98,8 +95,7 @@ void StaticMethod::matlab_wrapper(const string& toolboxPath, const string& class // finish file.oss << "}\n"; - // close file - file.emit(true); + return wrapFunctionName; } /* ************************************************************************* */ diff --git a/wrap/StaticMethod.h b/wrap/StaticMethod.h index f9cc14af7..3baa58585 100644 --- a/wrap/StaticMethod.h +++ b/wrap/StaticMethod.h @@ -44,12 +44,13 @@ struct StaticMethod { // NOTE: static functions are not inside the class, and // are created with [ClassName]_[FunctionName]() format - void matlab_mfile(const std::string& toolboxPath, const std::string& className) const; ///< m-file - void matlab_wrapper(const std::string& toolboxPath, - const std::string& className, const std::string& matlabClassName, + void proxy_fragment(const std::string& toolboxPath, const std::string& matlabClassName, + const std::string& wrapperName, const int id) const; ///< m-file + std::string wrapper_fragment(FileWriter& file, + const std::string& matlabClassName, const std::string& cppClassName, - const std::vector& using_namespaces, - const std::vector& includes) const; ///< cpp wrapper + int id, + const std::vector& using_namespaces) const; ///< cpp wrapper }; } // \namespace wrap diff --git a/wrap/matlab.h b/wrap/matlab.h index 31e29c806..dc13eafad 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -1,372 +1,387 @@ -/* ---------------------------------------------------------------------------- - - * 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 matlab.h - * @brief header file to be included in MATLAB wrappers - * @date 2008 - * @author Frank Dellaert - * - * wrapping and unwrapping is done using specialized templates, see - * http://www.cplusplus.com/doc/tutorial/templates.html - */ - -#include -#include - -using gtsam::Vector; -using gtsam::Matrix; - -extern "C" { -#include -} - -#include -#include -#include - -#include -#include -#include -#include -#include - -using namespace std; -using namespace boost; // not usual, but for conciseness of generated code - -// start GTSAM Specifics ///////////////////////////////////////////////// -// to enable Matrix and Vector constructor for SharedGaussian: -#define GTSAM_MAGIC_GAUSSIAN -// end GTSAM Specifics ///////////////////////////////////////////////// - -#if defined(__LP64__) || defined(_WIN64) -// 64-bit -#define mxUINT32OR64_CLASS mxUINT64_CLASS -#else -#define mxUINT32OR64_CLASS mxUINT32_CLASS -#endif - -//***************************************************************************** -// Utilities -//***************************************************************************** - -void error(const char* str) { - mexErrMsgIdAndTxt("wrap:error", str); -} - -mxArray *scalar(mxClassID classid) { - mwSize dims[1]; dims[0]=1; - return mxCreateNumericArray(1, dims, classid, mxREAL); -} - -void checkScalar(const mxArray* array, const char* str) { - int m = mxGetM(array), n = mxGetN(array); - if (m!=1 || n!=1) - mexErrMsgIdAndTxt("wrap: not a scalar in ", str); -} - -//***************************************************************************** -// Check arguments -//***************************************************************************** - -void checkArguments(const string& name, int nargout, int nargin, int expected) { - stringstream err; - err << name << " expects " << expected << " arguments, not " << nargin; - if (nargin!=expected) - error(err.str().c_str()); -} - -//***************************************************************************** -// wrapping C++ basis types in MATLAB arrays -//***************************************************************************** - -// default wrapping throws an error: only basis types are allowed in wrap -template -mxArray* wrap(Class& value) { - error("wrap internal error: attempted wrap of invalid type"); -} - -// specialization to string -// wraps into a character array -template<> -mxArray* wrap(string& value) { - return mxCreateString(value.c_str()); -} - -// specialization to char -template<> -mxArray* wrap(char& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(char*)mxGetData(result) = value; - return result; -} - -// specialization to unsigned char -template<> -mxArray* wrap(unsigned char& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(unsigned char*)mxGetData(result) = value; - return result; -} - -// specialization to bool -template<> -mxArray* wrap(bool& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(bool*)mxGetData(result) = value; - return result; -} - -// specialization to size_t -template<> -mxArray* wrap(size_t& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(size_t*)mxGetData(result) = value; - return result; -} - -// specialization to int -template<> -mxArray* wrap(int& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(int*)mxGetData(result) = value; - return result; -} - -// specialization to double -> just double -template<> -mxArray* wrap(double& value) { - return mxCreateDoubleScalar(value); -} - -// wrap a const Eigen vector into a double vector -mxArray* wrap_Vector(const gtsam::Vector& v) { - int m = v.size(); - mxArray *result = mxCreateDoubleMatrix(m, 1, mxREAL); - double *data = mxGetPr(result); - for (int i=0;i double vector -template<> -mxArray* wrap(gtsam::Vector& v) { - return wrap_Vector(v); -} - -// const version -template<> -mxArray* wrap(const gtsam::Vector& v) { - return wrap_Vector(v); -} - -// wrap a const Eigen MATRIX into a double matrix -mxArray* wrap_Matrix(const gtsam::Matrix& A) { - int m = A.rows(), n = A.cols(); -#ifdef DEBUG_WRAP - mexPrintf("wrap_Matrix called with A = \n", m,n); - gtsam::print(A); -#endif - mxArray *result = mxCreateDoubleMatrix(m, n, mxREAL); - double *data = mxGetPr(result); - // converts from column-major to row-major - for (int j=0;j double matrix -template<> -mxArray* wrap(gtsam::Matrix& A) { - return wrap_Matrix(A); -} - -// const version -template<> -mxArray* wrap(const gtsam::Matrix& A) { - return wrap_Matrix(A); -} - -//***************************************************************************** -// unwrapping MATLAB arrays into C++ basis types -//***************************************************************************** - -// default unwrapping throws an error -// as wrap only supports passing a reference or one of the basic types -template -T unwrap(const mxArray* array) { - error("wrap internal error: attempted unwrap of invalid type"); -} - -// specialization to string -// expects a character array -// Warning: relies on mxChar==char -template<> -string unwrap(const mxArray* array) { - char *data = mxArrayToString(array); - if (data==NULL) error("unwrap: not a character array"); - string str(data); - mxFree(data); - return str; -} - -// Check for 64-bit, as Mathworks says mxGetScalar only good for 32 bit -template -T myGetScalar(const mxArray* array) { - switch (mxGetClassID(array)) { - case mxINT64_CLASS: - return (T) *(int64_t*) mxGetData(array); - case mxUINT64_CLASS: - return (T) *(uint64_t*) mxGetData(array); - default: - // hope for the best! - return (T) mxGetScalar(array); - } -} - -// specialization to bool -template<> -bool unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return myGetScalar(array); -} - -// specialization to char -template<> -char unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return myGetScalar(array); -} - -// specialization to unsigned char -template<> -unsigned char unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return myGetScalar(array); -} - -// specialization to int -template<> -int unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return myGetScalar(array); -} - -// specialization to size_t -template<> -size_t unwrap(const mxArray* array) { - checkScalar(array, "unwrap"); - return myGetScalar(array); -} - -// specialization to double -template<> -double unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return myGetScalar(array); -} - -// specialization to Eigen vector -template<> -gtsam::Vector unwrap< gtsam::Vector >(const mxArray* array) { - int m = mxGetM(array), n = mxGetN(array); - if (mxIsDouble(array)==false || n!=1) error("unwrap: not a vector"); -#ifdef DEBUG_WRAP - mexPrintf("unwrap< gtsam::Vector > called with %dx%d argument\n", m,n); -#endif - double* data = (double*)mxGetData(array); - gtsam::Vector v(m); - for (int i=0;i -gtsam::Matrix unwrap< gtsam::Matrix >(const mxArray* array) { - if (mxIsDouble(array)==false) error("unwrap: not a matrix"); - int m = mxGetM(array), n = mxGetN(array); -#ifdef DEBUG_WRAP - mexPrintf("unwrap< gtsam::Matrix > called with %dx%d argument\n", m,n); -#endif - double* data = (double*)mxGetData(array); - gtsam::Matrix A(m,n); - // converts from row-major to column-major - for (int j=0;j -mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { - mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast**> (mxGetData(mxh)) = shared_ptr; - //return mxh; - return create_object(classname, mxh); -} - -template -mxArray* wrap_collect_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { - mxArray* mxh = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast**> (mxGetData(mxh)) = shared_ptr; - //return mxh; - return create_collect_object(classname, mxh); -} - -template -boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { - - mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxGetClassID(mxh) != mxUINT32OR64_CLASS || mxIsComplex(mxh) - || mxGetM(mxh) != 1 || mxGetN(mxh) != 1) error( - "Parameter is not an Shared type."); - - boost::shared_ptr* spp = *reinterpret_cast**> (mxGetData(mxh)); - return *spp; -} +/* ---------------------------------------------------------------------------- + + * 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 matlab.h + * @brief header file to be included in MATLAB wrappers + * @date 2008 + * @author Frank Dellaert + * + * wrapping and unwrapping is done using specialized templates, see + * http://www.cplusplus.com/doc/tutorial/templates.html + */ + +#include +#include + +using gtsam::Vector; +using gtsam::Matrix; + +extern "C" { +#include +} + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace boost; // not usual, but for conciseness of generated code + +// start GTSAM Specifics ///////////////////////////////////////////////// +// to enable Matrix and Vector constructor for SharedGaussian: +#define GTSAM_MAGIC_GAUSSIAN +// end GTSAM Specifics ///////////////////////////////////////////////// + +#if defined(__LP64__) || defined(_WIN64) +// 64-bit +#define mxUINT32OR64_CLASS mxUINT64_CLASS +#else +#define mxUINT32OR64_CLASS mxUINT32_CLASS +#endif + +// "Unique" key to signal calling the matlab object constructor with a raw pointer +// Also present in Class.cpp +static const uint64_t ptr_constructor_key = + (uint64_t('G') << 56) | + (uint64_t('T') << 48) | + (uint64_t('S') << 40) | + (uint64_t('A') << 32) | + (uint64_t('M') << 24) | + (uint64_t('p') << 16) | + (uint64_t('t') << 8) | + (uint64_t('r')); + +//***************************************************************************** +// Utilities +//***************************************************************************** + +void error(const char* str) { + mexErrMsgIdAndTxt("wrap:error", str); +} + +mxArray *scalar(mxClassID classid) { + mwSize dims[1]; dims[0]=1; + return mxCreateNumericArray(1, dims, classid, mxREAL); +} + +void checkScalar(const mxArray* array, const char* str) { + int m = mxGetM(array), n = mxGetN(array); + if (m!=1 || n!=1) + mexErrMsgIdAndTxt("wrap: not a scalar in ", str); +} + +// Replacement streambuf for cout that writes to the MATLAB console +// Thanks to http://stackoverflow.com/a/249008 +class mstream : public std::streambuf { +protected: + virtual std::streamsize xsputn(const char *s, std::streamsize n) { + mexPrintf("%.*s",n,s); + return n; + } + virtual int overflow(int c = EOF) { + if (c != EOF) { + mexPrintf("%.1s",&c); + } + return 1; + } +}; + +//***************************************************************************** +// Check arguments +//***************************************************************************** + +void checkArguments(const string& name, int nargout, int nargin, int expected) { + stringstream err; + err << name << " expects " << expected << " arguments, not " << nargin; + if (nargin!=expected) + error(err.str().c_str()); +} + +//***************************************************************************** +// wrapping C++ basis types in MATLAB arrays +//***************************************************************************** + +// default wrapping throws an error: only basis types are allowed in wrap +template +mxArray* wrap(Class& value) { + error("wrap internal error: attempted wrap of invalid type"); +} + +// specialization to string +// wraps into a character array +template<> +mxArray* wrap(string& value) { + return mxCreateString(value.c_str()); +} + +// specialization to char +template<> +mxArray* wrap(char& value) { + mxArray *result = scalar(mxUINT32OR64_CLASS); + *(char*)mxGetData(result) = value; + return result; +} + +// specialization to unsigned char +template<> +mxArray* wrap(unsigned char& value) { + mxArray *result = scalar(mxUINT32OR64_CLASS); + *(unsigned char*)mxGetData(result) = value; + return result; +} + +// specialization to bool +template<> +mxArray* wrap(bool& value) { + mxArray *result = scalar(mxUINT32OR64_CLASS); + *(bool*)mxGetData(result) = value; + return result; +} + +// specialization to size_t +template<> +mxArray* wrap(size_t& value) { + mxArray *result = scalar(mxUINT32OR64_CLASS); + *(size_t*)mxGetData(result) = value; + return result; +} + +// specialization to int +template<> +mxArray* wrap(int& value) { + mxArray *result = scalar(mxUINT32OR64_CLASS); + *(int*)mxGetData(result) = value; + return result; +} + +// specialization to double -> just double +template<> +mxArray* wrap(double& value) { + return mxCreateDoubleScalar(value); +} + +// wrap a const Eigen vector into a double vector +mxArray* wrap_Vector(const gtsam::Vector& v) { + int m = v.size(); + mxArray *result = mxCreateDoubleMatrix(m, 1, mxREAL); + double *data = mxGetPr(result); + for (int i=0;i double vector +template<> +mxArray* wrap(gtsam::Vector& v) { + return wrap_Vector(v); +} + +// const version +template<> +mxArray* wrap(const gtsam::Vector& v) { + return wrap_Vector(v); +} + +// wrap a const Eigen MATRIX into a double matrix +mxArray* wrap_Matrix(const gtsam::Matrix& A) { + int m = A.rows(), n = A.cols(); +#ifdef DEBUG_WRAP + mexPrintf("wrap_Matrix called with A = \n", m,n); + gtsam::print(A); +#endif + mxArray *result = mxCreateDoubleMatrix(m, n, mxREAL); + double *data = mxGetPr(result); + // converts from column-major to row-major + for (int j=0;j double matrix +template<> +mxArray* wrap(gtsam::Matrix& A) { + return wrap_Matrix(A); +} + +// const version +template<> +mxArray* wrap(const gtsam::Matrix& A) { + return wrap_Matrix(A); +} + +//***************************************************************************** +// unwrapping MATLAB arrays into C++ basis types +//***************************************************************************** + +// default unwrapping throws an error +// as wrap only supports passing a reference or one of the basic types +template +T unwrap(const mxArray* array) { + error("wrap internal error: attempted unwrap of invalid type"); +} + +// specialization to string +// expects a character array +// Warning: relies on mxChar==char +template<> +string unwrap(const mxArray* array) { + char *data = mxArrayToString(array); + if (data==NULL) error("unwrap: not a character array"); + string str(data); + mxFree(data); + return str; +} + +// Check for 64-bit, as Mathworks says mxGetScalar only good for 32 bit +template +T myGetScalar(const mxArray* array) { + switch (mxGetClassID(array)) { + case mxINT64_CLASS: + return (T) *(int64_t*) mxGetData(array); + case mxUINT64_CLASS: + return (T) *(uint64_t*) mxGetData(array); + default: + // hope for the best! + return (T) mxGetScalar(array); + } +} + +// specialization to bool +template<> +bool unwrap(const mxArray* array) { + checkScalar(array,"unwrap"); + return myGetScalar(array); +} + +// specialization to char +template<> +char unwrap(const mxArray* array) { + checkScalar(array,"unwrap"); + return myGetScalar(array); +} + +// specialization to unsigned char +template<> +unsigned char unwrap(const mxArray* array) { + checkScalar(array,"unwrap"); + return myGetScalar(array); +} + +// specialization to int +template<> +int unwrap(const mxArray* array) { + checkScalar(array,"unwrap"); + return myGetScalar(array); +} + +// specialization to size_t +template<> +size_t unwrap(const mxArray* array) { + checkScalar(array, "unwrap"); + return myGetScalar(array); +} + +// specialization to double +template<> +double unwrap(const mxArray* array) { + checkScalar(array,"unwrap"); + return myGetScalar(array); +} + +// specialization to Eigen vector +template<> +gtsam::Vector unwrap< gtsam::Vector >(const mxArray* array) { + int m = mxGetM(array), n = mxGetN(array); + if (mxIsDouble(array)==false || n!=1) error("unwrap: not a vector"); +#ifdef DEBUG_WRAP + mexPrintf("unwrap< gtsam::Vector > called with %dx%d argument\n", m,n); +#endif + double* data = (double*)mxGetData(array); + gtsam::Vector v(m); + for (int i=0;i +gtsam::Matrix unwrap< gtsam::Matrix >(const mxArray* array) { + if (mxIsDouble(array)==false) error("unwrap: not a matrix"); + int m = mxGetM(array), n = mxGetN(array); +#ifdef DEBUG_WRAP + mexPrintf("unwrap< gtsam::Matrix > called with %dx%d argument\n", m,n); +#endif + double* data = (double*)mxGetData(array); + gtsam::Matrix A(m,n); + // converts from row-major to column-major + for (int j=0;j(mxGetData(input[0])) = ptr_constructor_key; + // Second input argument is the pointer + input[1] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast(mxGetData(input[1])) = pointer; + // Call special pointer constructor, which sets 'self' + mexCallMATLAB(1,&result,2,input,classname); + // Deallocate our memory + mxDestroyArray(input[0]); + mxDestroyArray(input[1]); + return result; +} + +/* + When the user calls a method that returns a shared pointer, we create + an ObjectHandle from the shared_pointer and return it as a proxy + class to matlab. +*/ +template +mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { + // Create actual class object from out pointer + mxArray* result = create_object(classname, shared_ptr); + return result; +} + +template +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { + + mxArray* mxh = mxGetProperty(obj,0,"self"); + if (mxGetClassID(mxh) != mxUINT32OR64_CLASS || mxIsComplex(mxh) + || mxGetM(mxh) != 1 || mxGetN(mxh) != 1) error( + "Parameter is not an Shared type."); + + boost::shared_ptr* spp = *reinterpret_cast**> (mxGetData(mxh)); + return *spp; +} diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 9d56ec5cd..31b65bdcc 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -123,7 +123,6 @@ void generateUsingNamespace(FileWriter& file, const vector& using_namesp /* ************************************************************************* */ void generateIncludes(FileWriter& file, const string& class_name, const vector& includes) { - file.oss << "#include " << endl; bool added_include = false; BOOST_FOREACH(const string& s, includes) { if (!s.empty()) { From 82c6b5101f44f8bd1b577558de0be8a6c7529f1f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:39 +0000 Subject: [PATCH 544/914] Having cmake directly call mex to compile wrapper .cpp file instead of calling generated makefile --- gtsam/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index fb732ca51..48a6caf89 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -139,8 +139,11 @@ if (GTSAM_BUILD_WRAP) string(TOUPPER ${CMAKE_BUILD_TYPE} build_type_toupper) get_target_property(gtsam_library_file ${gtsam-prefer-shared} LOCATION_${build_type_toupper}) set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam ${gtsam_library_file}") + if(MSVC) + set(comp_flags_extra "/bigobj") + endif() # Lots of escapes '\' here because they get eaten during subsequent calls to 'set' - set(mexFlags "${mexFlags} -g COMPFLAGS=\\\"$$COMPFLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${build_type_toupper}}\\\"") + set(mexFlags "${mexFlags} -g COMPFLAGS=\\\"$COMPFLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${build_type_toupper}} ${comp_flags_extra}\\\"") # Macro to handle details of setting up targets # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 From dd0b7dd5a0dd947f862e79a41cbfda14d98f3e13 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:42 +0000 Subject: [PATCH 545/914] Added missing #pragma once --- gtsam/linear/KalmanFilter.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtsam/linear/KalmanFilter.h b/gtsam/linear/KalmanFilter.h index aeec47a39..df4cd1d65 100644 --- a/gtsam/linear/KalmanFilter.h +++ b/gtsam/linear/KalmanFilter.h @@ -17,6 +17,8 @@ * @author Frank Dellaert */ +#pragma once + #include #include From 9e8f3defeed5a86407095ba9052a18ae2862a10b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:44 +0000 Subject: [PATCH 546/914] Cleaned up passing mex command line arguments --- gtsam/CMakeLists.txt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 48a6caf89..97d642d65 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -95,9 +95,6 @@ if (GTSAM_BUILD_STATIC_LIBRARY) list(APPEND GTSAM_EXPORTED_TARGETS gtsam-static) set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) set(gtsam-lib gtsam-static) - if(NOT GTSAM_BUILD_SHARED_LIBRARY) - set(gtsam-prefer-shared gtsam-static) - endif() endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) @@ -115,7 +112,6 @@ if (GTSAM_BUILD_SHARED_LIBRARY) if (NOT GTSAM_BUILD_STATIC_LIBRARY) set(gtsam-lib "gtsam-shared") endif() - set(gtsam-prefer-shared gtsam-shared) endif(GTSAM_BUILD_SHARED_LIBRARY) # Create the matlab toolbox for the gtsam library @@ -137,13 +133,13 @@ if (GTSAM_BUILD_WRAP) # Generate, build and install toolbox string(TOUPPER ${CMAKE_BUILD_TYPE} build_type_toupper) - get_target_property(gtsam_library_file ${gtsam-prefer-shared} LOCATION_${build_type_toupper}) - set(mexFlags "${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam ${gtsam_library_file}") + get_target_property(gtsam_library_file gtsam-static LOCATION_${build_type_toupper}) + set(mexFlags ${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam) if(MSVC) - set(comp_flags_extra "/bigobj") + list(APPEND mexFlags "/bigobj") endif() - # Lots of escapes '\' here because they get eaten during subsequent calls to 'set' - set(mexFlags "${mexFlags} -g COMPFLAGS=\\\"$COMPFLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${build_type_toupper}} ${comp_flags_extra}\\\"") + # Add the CXXFLAGS from building gtsam + list(APPEND mexFlags -g "CXXFLAGS=$CXXFLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${build_type_toupper}}") # Macro to handle details of setting up targets # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 From 1ee7162383676766a23f29ca465d4b0c4be6c413 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:46 +0000 Subject: [PATCH 547/914] Fixed warnings --- wrap/Class.cpp | 1 - wrap/matlab.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index da1510d29..0485de5bd 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -58,7 +58,6 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil proxyFile.oss << " function obj = " << matlabName << "(varargin)" << endl; // Special pointer constructor { - const int id = functionNames.size(); proxyFile.oss << " if nargin == 2 && isa(varargin{1}, 'uint64') && "; proxyFile.oss << "varargin{1} == uint64(" << ptr_constructor_key << ")\n"; proxyFile.oss << " obj.self = varargin{2};\n"; diff --git a/wrap/matlab.h b/wrap/matlab.h index dc13eafad..31778cdbd 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -121,6 +121,7 @@ void checkArguments(const string& name, int nargout, int nargin, int expected) { template mxArray* wrap(Class& value) { error("wrap internal error: attempted wrap of invalid type"); + return 0; } // specialization to string From bf0b727d98fdd219ba5b1b2ca5cc4fe93e09a8b9 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:48 +0000 Subject: [PATCH 548/914] More cleanup of mex flag passing --- gtsam/CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 97d642d65..e719e0315 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -135,11 +135,6 @@ if (GTSAM_BUILD_WRAP) string(TOUPPER ${CMAKE_BUILD_TYPE} build_type_toupper) get_target_property(gtsam_library_file gtsam-static LOCATION_${build_type_toupper}) set(mexFlags ${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam) - if(MSVC) - list(APPEND mexFlags "/bigobj") - endif() - # Add the CXXFLAGS from building gtsam - list(APPEND mexFlags -g "CXXFLAGS=$CXXFLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${build_type_toupper}}") # Macro to handle details of setting up targets # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 From 8f8975f47f492fc6dc4d7cbdd65664292e4fea06 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:51 +0000 Subject: [PATCH 549/914] Removed obsolete code for generating matlab wrapper makefiles and build script --- gtsam/CMakeLists.txt | 2 -- wrap/Class.cpp | 59 ------------------------------------------- wrap/Class.h | 4 --- wrap/Module.cpp | 60 ++++---------------------------------------- wrap/Module.h | 5 +--- wrap/wrap.cpp | 19 ++++---------- 6 files changed, 11 insertions(+), 138 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index e719e0315..5a8692c74 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -132,8 +132,6 @@ if (GTSAM_BUILD_WRAP) endif() # Generate, build and install toolbox - string(TOUPPER ${CMAKE_BUILD_TYPE} build_type_toupper) - get_target_property(gtsam_library_file gtsam-static LOCATION_${build_type_toupper}) set(mexFlags ${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam) # Macro to handle details of setting up targets diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 0485de5bd..418c4706e 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -120,65 +120,6 @@ void Class::matlab_static_methods(const string& toolboxPath, const string& wrapp } } -/* ************************************************************************* */ -void Class::matlab_make_fragment(FileWriter& file, - const string& toolboxPath, - const string& mexFlags) const { - string mex = "mex " + mexFlags + " "; - string matlabClassName = qualifiedName(); - file.oss << mex << constructor.matlab_wrapper_name(matlabClassName) << ".cpp" << endl; - BOOST_FOREACH(StaticMethod sm, static_methods) - file.oss << mex << matlabClassName + "_" + sm.name << ".cpp" << endl; - file.oss << endl << "cd @" << matlabClassName << endl; - BOOST_FOREACH(Method m, methods) - file.oss << mex << m.name << ".cpp" << endl; - file.oss << endl; -} - -/* ************************************************************************* */ -void Class::makefile_fragment(FileWriter& file) const { -// new_Point2_.$(MEXENDING): new_Point2_.cpp -// $(MEX) $(mex_flags) new_Point2_.cpp -// new_Point2_dd.$(MEXENDING): new_Point2_dd.cpp -// $(MEX) $(mex_flags) new_Point2_dd.cpp -// @Point2/x.$(MEXENDING): @Point2/x.cpp -// $(MEX) $(mex_flags) @Point2/x.cpp -output @Point2/x -// @Point2/y.$(MEXENDING): @Point2/y.cpp -// $(MEX) $(mex_flags) @Point2/y.cpp -output @Point2/y -// @Point2/dim.$(MEXENDING): @Point2/dim.cpp -// $(MEX) $(mex_flags) @Point2/dim.cpp -output @Point2/dim -// -// Point2: new_Point2_.$(MEXENDING) new_Point2_dd.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) - - string matlabName = qualifiedName(); - - // collect names - vector file_names; - string file_base = constructor.matlab_wrapper_name(matlabName); - file_names.push_back(file_base); - BOOST_FOREACH(StaticMethod c, static_methods) { - string file_base = matlabName + "_" + c.name; - file_names.push_back(file_base); - } - BOOST_FOREACH(Method c, methods) { - string file_base = "@" + matlabName + "/" + c.name; - file_names.push_back(file_base); - } - - BOOST_FOREACH(const string& file_base, file_names) { - file.oss << file_base << ".$(MEXENDING): " << file_base << ".cpp"; - file.oss << " $(PATH_TO_WRAP)/matlab.h" << endl; - file.oss << "\t$(MEX) $(mex_flags) " << file_base << ".cpp -output " << file_base << endl; - } - - // class target - file.oss << "\n" << matlabName << ": "; - BOOST_FOREACH(const string& file_base, file_names) { - file.oss << file_base << ".$(MEXENDING) "; - } - file.oss << "\n" << endl; -} - /* ************************************************************************* */ string Class::qualifiedName(const string& delim) const { string result; diff --git a/wrap/Class.h b/wrap/Class.h index bef7467c3..0f6ac899c 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -49,10 +49,6 @@ struct Class { FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit proxy class void matlab_static_methods(const std::string& toolboxPath, const std::string& wrapperName, FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit static method wrappers - void matlab_make_fragment(FileWriter& file, - const std::string& toolboxPath, - const std::string& mexFlags) const; ///< emit make fragment for global make script - void makefile_fragment(FileWriter& file) const; ///< emit makefile fragment std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter }; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 2f1b1f252..400658044 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -286,19 +286,10 @@ void verifyReturnTypes(const vector& validtypes, const vector& vt) { } /* ************************************************************************* */ -void Module::matlab_code(const string& mexCommand, const string& toolboxPath, - const string& mexExt, const string& headerPath,const string& mexFlags) const { +void Module::matlab_code(const string& toolboxPath, const string& headerPath) const { fs::create_directories(toolboxPath); - // create make m-file - string matlabMakeFileName = toolboxPath + "/make_" + name + ".m"; - FileWriter makeModuleMfile(matlabMakeFileName, verbose, "%"); - - // create the (actual) make file - string makeFileName = toolboxPath + "/Makefile"; - FileWriter makeModuleMakefile(makeFileName, verbose, "#"); - // create the unified .cpp switch file const string wrapperName = name + "_wrapper"; string wrapperFileName = toolboxPath + "/" + wrapperName + ".cpp"; @@ -309,18 +300,6 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, wrapperFile.oss << "#include \n"; wrapperFile.oss << "\n"; - makeModuleMfile.oss << "echo on" << endl << endl; - makeModuleMfile.oss << "toolboxpath = mfilename('fullpath');" << endl; - makeModuleMfile.oss << "delims = find(toolboxpath == '/' | toolboxpath == '\\');" << endl; - makeModuleMfile.oss << "toolboxpath = toolboxpath(1:(delims(end)-1));" << endl; - makeModuleMfile.oss << "clear delims" << endl; - makeModuleMfile.oss << "addpath(toolboxpath);" << endl << endl; - - makeModuleMakefile.oss << "\nMEX = " << mexCommand << "\n"; - makeModuleMakefile.oss << "MEXENDING = " << mexExt << "\n"; - makeModuleMakefile.oss << "PATH_TO_WRAP = " << headerPath << "\n"; - makeModuleMakefile.oss << "mex_flags = " << mexFlags << "\n\n"; - // Dependency check list vector validTypes = forward_declarations; validTypes.push_back("void"); @@ -333,15 +312,10 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, validTypes.push_back("double"); validTypes.push_back("Vector"); validTypes.push_back("Matrix"); - - // add 'all' to Makefile - makeModuleMakefile.oss << "all: "; - BOOST_FOREACH(Class cls, classes) { - makeModuleMakefile.oss << cls.qualifiedName() << " "; - //Create a list of parsed classes for dependency checking - validTypes.push_back(cls.qualifiedName("::")); - } - makeModuleMakefile.oss << "\n\n"; + //Create a list of parsed classes for dependency checking + BOOST_FOREACH(Class cls, classes) { + validTypes.push_back(cls.qualifiedName("::")); + } // Generate all includes BOOST_FOREACH(Class cls, classes) { @@ -391,32 +365,8 @@ void Module::matlab_code(const string& mexCommand, const string& toolboxPath, // create constructor and method wrappers cls.matlab_static_methods(toolboxPath, wrapperName, wrapperFile, functionNames); - - // add lines to make m-file - makeModuleMfile.oss << "%% " << cls.qualifiedName() << endl; - makeModuleMfile.oss << "cd(toolboxpath)" << endl; - cls.matlab_make_fragment(makeModuleMfile, toolboxPath, mexFlags); - - // add section to the (actual) make file - makeModuleMakefile.oss << "# " << cls.qualifiedName() << endl; - cls.makefile_fragment(makeModuleMakefile); } - // finish make m-file - makeModuleMfile.oss << "cd(toolboxpath)" << endl << endl; - makeModuleMfile.oss << "echo off" << endl; - makeModuleMfile.emit(true); // By default, compare existing file first - - // make clean at end of Makefile - makeModuleMakefile.oss << "\n\nclean: \n"; - makeModuleMakefile.oss << "\trm -rf *.$(MEXENDING)\n"; - BOOST_FOREACH(Class cls, classes) - makeModuleMakefile.oss << "\trm -rf @" << cls.qualifiedName() << "/*.$(MEXENDING)\n"; - - // finish Makefile - makeModuleMakefile.oss << "\n" << endl; - makeModuleMakefile.emit(true); - // finish wrapper file finish_wrapper(wrapperFile, functionNames); diff --git a/wrap/Module.h b/wrap/Module.h index 8df6abbba..a04a861c4 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -41,11 +41,8 @@ struct Module { /// MATLAB code generation: void matlab_code( - const std::string& mexCommand, const std::string& path, - const std::string& mexExt, - const std::string& headerPath, - const std::string& mexFlags) const; + const std::string& headerPath) const; void finish_wrapper(FileWriter& file, const std::vector& functionNames) const; }; diff --git a/wrap/wrap.cpp b/wrap/wrap.cpp index f818094f7..05763d892 100644 --- a/wrap/wrap.cpp +++ b/wrap/wrap.cpp @@ -24,42 +24,33 @@ using namespace std; /** * Top-level function to wrap a module - * @param mexCommand is a sufficiently qualified command to execute mex within a makefile - * @param mexExt is the extension for mex binaries for this os/cpu * @param interfacePath path to where interface file lives, e.g., borg/gtsam * @param moduleName name of the module to be generated e.g. gtsam * @param toolboxPath path where the toolbox should be generated, e.g. borg/gtsam/build * @param headerPath is the path to matlab.h - * @param mexFlags extra arguments for mex script, i.e., include flags etc... */ void generate_matlab_toolbox( - const string& mexCommand, - const string& mexExt, const string& interfacePath, const string& moduleName, const string& toolboxPath, - const string& headerPath, - const string& mexFlags) + const string& headerPath) { // Parse interface file into class object // This recursively creates Class objects, Method objects, etc... wrap::Module module(interfacePath, moduleName, false); // Then emit MATLAB code - module.matlab_code(mexCommand,toolboxPath,mexExt,headerPath,mexFlags); + module.matlab_code(toolboxPath,headerPath); } /** Displays usage information */ void usage() { cerr << "wrap parses an interface file and produces a MATLAB toolbox" << endl; - cerr << "usage: wrap mexExecutable mexExtension interfacePath moduleName toolboxPath [mexFlags]" << endl; - cerr << " mexExecutable : command to execute mex if on path, use 'mex'" << endl; - cerr << " mexExtension : OS/CPU-dependent extension for MEX binaries" << endl; + cerr << "usage: wrap interfacePath moduleName toolboxPath headerPath" << endl; cerr << " interfacePath : *absolute* path to directory of module interface file" << endl; cerr << " moduleName : the name of the module, interface file must be called moduleName.h" << endl; cerr << " toolboxPath : the directory in which to generate the wrappers" << endl; cerr << " headerPath : path to matlab.h" << endl; - cerr << " [mexFlags] : extra flags for the mex command" << endl; } /** @@ -67,7 +58,7 @@ void usage() { * Typically called from "make all" using appropriate arguments */ int main(int argc, const char* argv[]) { - if (argc<7 || argc>8) { + if (argc != 5) { cerr << "Invalid arguments:\n"; for (int i=0; i Date: Thu, 5 Jul 2012 14:04:53 +0000 Subject: [PATCH 550/914] wrap flags for gtsam_unstable --- gtsam_unstable/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index acd36ddc2..8d9cd6542 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -92,7 +92,7 @@ if (GTSAM_BUILD_WRAP) endif() # Generate, build and install toolbox - set(mexFlags "-I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete -L${GTSAM_UNSTABLE_LIB_DIR} -L${GTSAM_LIB_DIR} -lgtsam -lgtsam_unstable") + set(mexFlags -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete) # Macro to handle details of setting up targets wrap_library(gtsam_unstable "${mexFlags}" "./") From ce4968d4989f65b78127a682505d4302afdde419 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:55 +0000 Subject: [PATCH 551/914] Wrap cmake options to more easily link with additional libraries --- gtsam/CMakeLists.txt | 2 +- gtsam_unstable/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 5a8692c74..e168116e7 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -136,5 +136,5 @@ if (GTSAM_BUILD_WRAP) # Macro to handle details of setting up targets # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 - wrap_library(gtsam "${mexFlags}" "../") + wrap_library(gtsam "${mexFlags}" "../" "") endif () diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 8d9cd6542..9851852e3 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -95,6 +95,6 @@ if (GTSAM_BUILD_WRAP) set(mexFlags -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete) # Macro to handle details of setting up targets - wrap_library(gtsam_unstable "${mexFlags}" "./") + wrap_library(gtsam_unstable "${mexFlags}" "./" gtsam) endif(GTSAM_BUILD_WRAP) From 8ab18498ad3f88f26628d4b838a5851aacd0ed07 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:04:57 +0000 Subject: [PATCH 552/914] Add to collector through matlab function to allow returning objects from other wrap modules --- wrap/Class.cpp | 69 ++++++++++++++++++++++++++++++++++---------- wrap/Class.h | 3 ++ wrap/Constructor.cpp | 4 +-- wrap/ReturnValue.cpp | 8 ----- 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 418c4706e..8e8f42045 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "Class.h" #include "utilities.h" @@ -28,23 +29,13 @@ using namespace std; using namespace wrap; -static const uint64_t ptr_constructor_key = - (uint64_t('G') << 56) | - (uint64_t('T') << 48) | - (uint64_t('S') << 40) | - (uint64_t('A') << 32) | - (uint64_t('M') << 24) | - (uint64_t('p') << 16) | - (uint64_t('t') << 8) | - (uint64_t('r')); - /* ************************************************************************* */ void Class::matlab_proxy(const string& classFile, const string& wrapperName, FileWriter& wrapperFile, vector& functionNames) const { // open destination classFile FileWriter proxyFile(classFile, verbose_, "%"); // get the name of actual matlab object - string matlabName = qualifiedName(), cppName = qualifiedName("::"); + const string matlabName = qualifiedName(), cppName = qualifiedName("::"); // emit class proxy code // we want our class to inherit the handle class for memory purposes @@ -56,11 +47,17 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil // Constructor proxyFile.oss << " function obj = " << matlabName << "(varargin)" << endl; - // Special pointer constructor + // Special pointer constructors - one in MATLAB to create an object and + // assign a pointer returned from a C++ function. In turn this MATLAB + // constructor calls a special C++ function that just adds the object to + // its collector. This allows wrapped functions to return objects in + // other wrap modules - to add these to their collectors the pointer is + // passed from one C++ module into matlab then back into the other C++ + // module. { - proxyFile.oss << " if nargin == 2 && isa(varargin{1}, 'uint64') && "; - proxyFile.oss << "varargin{1} == uint64(" << ptr_constructor_key << ")\n"; - proxyFile.oss << " obj.self = varargin{2};\n"; + int id = functionNames.size(); + const string functionName = pointer_constructor_fragments(proxyFile, wrapperFile, wrapperName, id); + functionNames.push_back(functionName); } // Regular constructors BOOST_FOREACH(ArgumentList a, constructor.args_list) @@ -129,3 +126,45 @@ string Class::qualifiedName(const string& delim) const { } /* ************************************************************************* */ +string Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& wrapperName, int id) const { + + static const uint64_t ptr_constructor_key = + (uint64_t('G') << 56) | + (uint64_t('T') << 48) | + (uint64_t('S') << 40) | + (uint64_t('A') << 32) | + (uint64_t('M') << 24) | + (uint64_t('p') << 16) | + (uint64_t('t') << 8) | + (uint64_t('r')); + + const string matlabName = qualifiedName(), cppName = qualifiedName("::"); + const string wrapFunctionName = matlabName + "_constructor_" + boost::lexical_cast(id); + + // MATLAB constructor that assigns pointer to matlab object then calls c++ + // function to add the object to the collector. + proxyFile.oss << " if nargin == 2 && isa(varargin{1}, 'uint64') && "; + proxyFile.oss << "varargin{1} == uint64(" << ptr_constructor_key << ")\n"; + proxyFile.oss << " obj.self = varargin{2};\n"; + proxyFile.oss << " " << wrapperName << "(obj.self);\n"; + + // C++ function to add pointer from MATLAB to collector. The pointer always + // comes from a C++ return value; this mechanism allows the object to be added + // to a collector in a different wrap module. + wrapperFile.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; + wrapperFile.oss << "{\n"; + wrapperFile.oss << " mexAtExit(&_deleteAllObjects);\n"; + generateUsingNamespace(wrapperFile, using_namespaces); + // Typedef boost::shared_ptr + wrapperFile.oss << " typedef boost::shared_ptr<" << cppName << "> Shared;\n"; + wrapperFile.oss << "\n"; + // Get self pointer passed in + wrapperFile.oss << " Shared *self = *reinterpret_cast (mxGetData(in[0]));\n"; + // Add to collector + wrapperFile.oss << " collector_" << matlabName << ".insert(self);\n"; + wrapperFile.oss << "}\n"; + + return wrapFunctionName; +} + +/* ************************************************************************* */ diff --git a/wrap/Class.h b/wrap/Class.h index 0f6ac899c..736e0a370 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -50,6 +50,9 @@ struct Class { void matlab_static_methods(const std::string& toolboxPath, const std::string& wrapperName, FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit static method wrappers std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter + +private: + std::string pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& wrapperName, int id) const; }; } // \namespace wrap diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 43f35fb86..88fbb748b 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -67,7 +67,7 @@ string Constructor::wrapper_fragment(FileWriter& file, const vector& using_namespaces, const vector& includes, const ArgumentList& al) const { - const string matlabName = matlab_wrapper_name(matlabClassName); + const string wrapFunctionName = matlabClassName + "_constructor_" + boost::lexical_cast(id); file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; @@ -75,7 +75,7 @@ string Constructor::wrapper_fragment(FileWriter& file, file.oss << " mexAtExit(&_deleteAllObjects);\n"; generateUsingNamespace(file, using_namespaces); //Typedef boost::shared_ptr - file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;\n"; + file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;\n"; file.oss << "\n"; //Check to see if there will be any arguments and remove {} for consiseness diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index 2c1231c6b..0c9dd5830 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -49,19 +49,15 @@ string ReturnValue::qualifiedType2(const string& delim) const { void ReturnValue::wrap_result(FileWriter& file) const { string cppType1 = qualifiedType1("::"), matlabType1 = qualifiedType1(); string cppType2 = qualifiedType2("::"), matlabType2 = qualifiedType2(); - const string collectorName1 = "collector_" + matlabType1; - const string collectorName2 = "collector_" + matlabType2; if (isPair) { // first return value in pair if (isPtr1) {// if we already have a pointer file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result.first);" << endl; - file.oss << " " << collectorName1 << ".insert(ret);\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (category1 == ReturnValue::CLASS) { // if we are going to make one file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result.first));\n"; - file.oss << " " << collectorName1 << ".insert(ret);\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else // if basis type @@ -70,12 +66,10 @@ void ReturnValue::wrap_result(FileWriter& file) const { // second return value in pair if (isPtr2) {// if we already have a pointer file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(result.second);" << endl; - file.oss << " " << collectorName2 << ".insert(ret);\n"; file.oss << " out[1] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; } else if (category2 == ReturnValue::CLASS) { // if we are going to make one file.oss << " Shared" << type2 << "* ret = new Shared" << type2 << "(new " << cppType2 << "(result.first));\n"; - file.oss << " " << collectorName2 << ".insert(ret);\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; } else @@ -83,12 +77,10 @@ void ReturnValue::wrap_result(FileWriter& file) const { } else if (isPtr1){ file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result);" << endl; - file.oss << " " << collectorName1 << ".insert(ret);\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (category1 == ReturnValue::CLASS){ file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result));\n"; - file.oss << " " << collectorName1 << ".insert(ret);\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (matlabType1!="void") From f774a380ec6d5822c58f0eb71179978dc63d7c15 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:05:00 +0000 Subject: [PATCH 553/914] Implemented method overloading in matlab wrapper, made static functions static in matlab classes --- wrap/Class.cpp | 35 +++++++--------- wrap/Class.h | 11 ++--- wrap/Method.cpp | 79 ++++++++++++++++++++++++++++++----- wrap/Method.h | 17 ++++++-- wrap/Module.cpp | 81 ++++++++++++++++++++++-------------- wrap/StaticMethod.cpp | 97 ++++++++++++++++++++++++++++++++++--------- wrap/StaticMethod.h | 28 ++++++++----- 7 files changed, 248 insertions(+), 100 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 8e8f42045..a33f89f35 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -70,7 +70,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil functionNames.push_back(wrapFunctionName); } proxyFile.oss << " else\n"; - proxyFile.oss << " error('" << matlabName << " constructor failed');" << endl; + proxyFile.oss << " error('Arguments do not match any overload of " << matlabName << " constructor');" << endl; proxyFile.oss << " end\n"; proxyFile.oss << " end\n\n"; @@ -88,14 +88,23 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil proxyFile.oss << " function disp(obj), obj.display; end\n\n"; // Methods - BOOST_FOREACH(Method m, methods) { - const int id = functionNames.size(); - m.proxy_fragment(proxyFile, wrapperName, id); + BOOST_FOREACH(const Methods::value_type& name_m, methods) { + const Method& m = name_m.second; + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, functionNames); + proxyFile.oss << "\n"; + wrapperFile.oss << "\n"; + } + + proxyFile.oss << " end\n"; + proxyFile.oss << "\n"; + proxyFile.oss << " methods(Static = true)\n"; + + // Static methods + BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { + const StaticMethod& m = name_m.second; + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, functionNames); proxyFile.oss << "\n"; - const string wrapFunctionName = m.wrapper_fragment(wrapperFile, - cppName, matlabName, id, using_namespaces); wrapperFile.oss << "\n"; - functionNames.push_back(wrapFunctionName); } proxyFile.oss << " end" << endl; @@ -105,18 +114,6 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil proxyFile.emit(true); } -/* ************************************************************************* */ -void Class::matlab_static_methods(const string& toolboxPath, const string& wrapperName, - FileWriter& wrapperFile, vector& functionNames) const { - string matlabName = qualifiedName(), cppName = qualifiedName("::"); - BOOST_FOREACH(const StaticMethod& m, static_methods) { - const int id = functionNames.size(); - m.proxy_fragment(toolboxPath, matlabName, wrapperName, id); - const string wrapFunction = m.wrapper_fragment(wrapperFile, matlabName, cppName, id, using_namespaces); - functionNames.push_back(wrapFunction); - } -} - /* ************************************************************************* */ string Class::qualifiedName(const string& delim) const { string result; diff --git a/wrap/Class.h b/wrap/Class.h index 736e0a370..f1a745d94 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -19,7 +19,7 @@ #pragma once #include -#include +#include #include "Constructor.h" #include "Deconstructor.h" @@ -30,13 +30,16 @@ namespace wrap { /// Class has name, constructors, methods struct Class { + typedef std::map Methods; + typedef std::map StaticMethods; + /// Constructor creates an empty class Class(bool verbose=true) : verbose_(verbose) {} // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name - std::vector methods; ///< Class methods - std::vector static_methods; ///< Static methods + Methods methods; ///< Class methods + StaticMethods static_methods; ///< Static methods std::vector namespaces; ///< Stack of namespaces std::vector using_namespaces;///< default namespaces std::vector includes; ///< header include overrides @@ -47,8 +50,6 @@ struct Class { // And finally MATLAB code is emitted, methods below called by Module::matlab_code void matlab_proxy(const std::string& classFile, const std::string& wrapperName, FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit proxy class - void matlab_static_methods(const std::string& toolboxPath, const std::string& wrapperName, - FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit static method wrappers std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter private: diff --git a/wrap/Method.cpp b/wrap/Method.cpp index bcca86d40..88176f675 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -27,24 +27,78 @@ using namespace std; using namespace wrap; /* ************************************************************************* */ -void Method::proxy_fragment(FileWriter& file, const std::string& wrapperName, const int id) const { +void Method::addOverload(bool verbose, bool is_const, const std::string& name, + const ArgumentList& args, const ReturnValue& retVal) { + this->verbose_ = verbose; + this->is_const_ = is_const; + this->name = name; + this->argLists.push_back(args); + this->returnVals.push_back(retVal); +} - string output; - if(returnVal.isPair) - output = "[ r1 r2 ] = "; - else if(returnVal.category1 == ReturnValue::VOID) - output = ""; - else - output = "r = "; - file.oss << " function " << output << name << "(varargin)\n"; - file.oss << " " << output << wrapperName << "(" << id << ", varargin{:});\n"; - file.oss << " end\n"; +void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, + const string& cppClassName, + const string& matlabClassName, + const string& wrapperName, + const vector& using_namespaces, + vector& functionNames) const { + + proxyFile.oss << " function varargout = " << name << "(self, varargin)\n"; + + for(size_t overload = 0; overload < argLists.size(); ++overload) { + const ArgumentList& args = argLists[overload]; + const ReturnValue& returnVal = returnVals[overload]; + size_t nrArgs = args.size(); + + const int id = functionNames.size(); + + // Output proxy matlab code + + // check for number of arguments... + proxyFile.oss << " " << (overload==0?"":"else") << "if length(varargin) == " << nrArgs; + if (nrArgs>0) proxyFile.oss << " && "; + // ...and their types + bool first = true; + for(size_t i=0;i& using_namespaces) const { @@ -52,6 +106,9 @@ string Method::wrapper_fragment(FileWriter& file, const string wrapFunctionName = matlabClassName + "_" + name + "_" + boost::lexical_cast(id); + const ArgumentList& args = argLists[overload]; + const ReturnValue& returnVal = returnVals[overload]; + // call file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; // start diff --git a/wrap/Method.h b/wrap/Method.h index 60b0c1282..204e3002d 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -36,16 +36,27 @@ struct Method { bool verbose_; bool is_const_; std::string name; - ArgumentList args; - ReturnValue returnVal; + std::vector argLists; + std::vector returnVals; + + // The first time this function is called, it initializes the class members + // with those in rhs, but in subsequent calls it adds additional argument + // lists as function overloads. + void addOverload(bool verbose, bool is_const, const std::string& name, + const ArgumentList& args, const ReturnValue& retVal); // MATLAB code generation // classPath is class directory, e.g., ../matlab/@Point2 + void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, + const std::string& cppClassName, const std::string& matlabClassName, + const std::string& wrapperName, const std::vector& using_namespaces, + std::vector& functionNames) const; - void proxy_fragment(FileWriter& file, const std::string& wrapperName, const int id) const; +private: std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, const std::string& matlabClassname, + int overload, int id, const std::vector& using_namespaces) const; ///< cpp wrapper }; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 400658044..0c351a4f9 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -24,6 +24,8 @@ //#define BOOST_SPIRIT_DEBUG #include #include +#include +#include #include #include #include @@ -34,6 +36,7 @@ using namespace std; using namespace wrap; using namespace BOOST_SPIRIT_CLASSIC_NS; +namespace bl = boost::lambda; namespace fs = boost::filesystem; typedef rule Rule; @@ -51,13 +54,15 @@ Module::Module(const string& interfacePath, { // these variables will be imperatively updated to gradually build [cls] // The one with postfix 0 are used to reset the variables after parse. + string methodName, methodName0; + bool isConst, isConst0 = false; ReturnValue retVal0, retVal; Argument arg0, arg; ArgumentList args0, args; vector arg_dup; ///keep track of duplicates Constructor constructor0(enable_verbose), constructor(enable_verbose); Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); - Method method0(enable_verbose), method(enable_verbose); + //Method method0(enable_verbose), method(enable_verbose); StaticMethod static_method0(enable_verbose), static_method(enable_verbose); Class cls0(enable_verbose),cls(enable_verbose); vector namespaces, /// current namespace tag @@ -155,27 +160,35 @@ Module::Module(const string& interfacePath, Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')]; Rule method_p = - (returnType_p >> methodName_p[assign_a(method.name)] >> + (returnType_p >> methodName_p[assign_a(methodName)] >> '(' >> argumentList_p >> ')' >> - !str_p("const")[assign_a(method.is_const_,true)] >> ';' >> *comments_p) - [assign_a(method.args,args)] + !str_p("const")[assign_a(isConst,true)] >> ';' >> *comments_p) + [bl::bind(&Method::addOverload, + bl::var(cls.methods)[bl::var(methodName)], + verbose, + bl::var(isConst), + bl::var(methodName), + bl::var(args), + bl::var(retVal))] + [assign_a(isConst,isConst0)] + [assign_a(methodName,methodName0)] [assign_a(args,args0)] - [assign_a(method.returnVal,retVal)] - [assign_a(retVal,retVal0)] - [push_back_a(cls.methods, method)] - [assign_a(method,method0)]; + [assign_a(retVal,retVal0)]; Rule staticMethodName_p = lexeme_d[(upper_p | lower_p) >> *(alnum_p | '_')]; Rule static_method_p = - (str_p("static") >> returnType_p >> staticMethodName_p[assign_a(static_method.name)] >> + (str_p("static") >> returnType_p >> staticMethodName_p[assign_a(methodName)] >> '(' >> argumentList_p >> ')' >> ';' >> *comments_p) - [assign_a(static_method.args,args)] + [bl::bind(&StaticMethod::addOverload, + bl::var(cls.static_methods)[bl::var(methodName)], + verbose, + bl::var(methodName), + bl::var(args), + bl::var(retVal))] + [assign_a(methodName,methodName0)] [assign_a(args,args0)] - [assign_a(static_method.returnVal,retVal)] - [assign_a(retVal,retVal0)] - [push_back_a(cls.static_methods, static_method)] - [assign_a(static_method,static_method0)]; + [assign_a(retVal,retVal0)]; Rule functions_p = constructor_p | method_p | static_method_p; @@ -262,26 +275,33 @@ Module::Module(const string& interfacePath, /* ************************************************************************* */ template -void verifyArguments(const vector& validArgs, const vector& vt) { - BOOST_FOREACH(const T& t, vt) { - BOOST_FOREACH(Argument arg, t.args) { - string fullType = arg.qualifiedType("::"); - if(find(validArgs.begin(), validArgs.end(), fullType) - == validArgs.end()) - throw DependencyMissing(fullType, t.name); +void verifyArguments(const vector& validArgs, const map& vt) { + typedef map::value_type Name_Method; + BOOST_FOREACH(const Name_Method& name_method, vt) { + const T& t = name_method.second; + BOOST_FOREACH(const ArgumentList& argList, t.argLists) { + BOOST_FOREACH(Argument arg, argList) { + string fullType = arg.qualifiedType("::"); + if(find(validArgs.begin(), validArgs.end(), fullType) + == validArgs.end()) + throw DependencyMissing(fullType, t.name); + } } } } /* ************************************************************************* */ template -void verifyReturnTypes(const vector& validtypes, const vector& vt) { - BOOST_FOREACH(const T& t, vt) { - const ReturnValue& retval = t.returnVal; - if (find(validtypes.begin(), validtypes.end(), retval.qualifiedType1("::")) == validtypes.end()) - throw DependencyMissing(retval.qualifiedType1("::"), t.name); - if (retval.isPair && find(validtypes.begin(), validtypes.end(), retval.qualifiedType2("::")) == validtypes.end()) - throw DependencyMissing(retval.qualifiedType2("::"), t.name); +void verifyReturnTypes(const vector& validtypes, const map& vt) { + typedef map::value_type Name_Method; + BOOST_FOREACH(const Name_Method& name_method, vt) { + const T& t = name_method.second; + BOOST_FOREACH(const ReturnValue& retval, t.returnVals) { + if (find(validtypes.begin(), validtypes.end(), retval.qualifiedType1("::")) == validtypes.end()) + throw DependencyMissing(retval.qualifiedType1("::"), t.name); + if (retval.isPair && find(validtypes.begin(), validtypes.end(), retval.qualifiedType2("::")) == validtypes.end()) + throw DependencyMissing(retval.qualifiedType2("::"), t.name); + } } } @@ -350,7 +370,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // generate proxy classes and wrappers BOOST_FOREACH(Class cls, classes) { - // create proxy class + // create proxy class and wrapper code string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; cls.matlab_proxy(classFile, wrapperName, wrapperFile, functionNames); @@ -362,9 +382,6 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // verify function return types verifyReturnTypes(validTypes, cls.static_methods); verifyReturnTypes(validTypes, cls.methods); - - // create constructor and method wrappers - cls.matlab_static_methods(toolboxPath, wrapperName, wrapperFile, functionNames); } // finish wrapper file diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 8cdf0e597..dd0c606b5 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -27,34 +27,91 @@ using namespace std; using namespace wrap; + /* ************************************************************************* */ -void StaticMethod::proxy_fragment(const string& toolboxPath, const string& matlabClassName, const std::string& wrapperName, const int id) const { +void StaticMethod::addOverload(bool verbose, const std::string& name, + const ArgumentList& args, const ReturnValue& retVal) { + this->verbose = verbose; + this->name = name; + this->argLists.push_back(args); + this->returnVals.push_back(retVal); +} - const string full_name = matlabClassName + "_" + name; - FileWriter file(toolboxPath + "/" + full_name + ".m", verbose, "%"); +void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, + const string& cppClassName, + const string& matlabClassName, + const string& wrapperName, + const vector& using_namespaces, + vector& functionNames) const { - string output; - if(returnVal.isPair) - output = "[ r1 r2 ] = "; - else if(returnVal.category1 == ReturnValue::VOID) - output = ""; - else - output = "r = "; - file.oss << "function " << output << full_name << "(varargin)\n"; - file.oss << " " << output << wrapperName << "(" << id << ", varargin{:});\n"; - file.oss << "end\n"; + string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); - file.emit(true); + proxyFile.oss << " function varargout = " << upperName << "(varargin)\n"; + + for(size_t overload = 0; overload < argLists.size(); ++overload) { + const ArgumentList& args = argLists[overload]; + const ReturnValue& returnVal = returnVals[overload]; + size_t nrArgs = args.size(); + + const int id = functionNames.size(); + + // Output proxy matlab code + + // check for number of arguments... + proxyFile.oss << " " << (overload==0?"":"else") << "if length(varargin) == " << nrArgs; + if (nrArgs>0) proxyFile.oss << " && "; + // ...and their types + bool first = true; + for(size_t i=0;i& using_namespaces) const { - - const string full_name = matlabClassName + "_" + name; +string StaticMethod::wrapper_fragment(FileWriter& file, + const string& cppClassName, + const string& matlabClassName, + int overload, + int id, + const vector& using_namespaces) const { + + // generate code + const string wrapFunctionName = matlabClassName + "_" + name + "_" + boost::lexical_cast(id); + const ArgumentList& args = argLists[overload]; + const ReturnValue& returnVal = returnVals[overload]; + // call file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; // start @@ -76,7 +133,7 @@ string StaticMethod::wrapper_fragment(FileWriter& file, // check arguments // NOTE: for static functions, there is no object passed - file.oss << " checkArguments(\"" << full_name << "\",nargout,nargin," << args.size() << ");\n"; + file.oss << " checkArguments(\"" << matlabClassName << "." << name << "\",nargout,nargin," << args.size() << ");\n"; // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,0); // We start at 0 because there is no self object diff --git a/wrap/StaticMethod.h b/wrap/StaticMethod.h index 3baa58585..5bc599ea5 100644 --- a/wrap/StaticMethod.h +++ b/wrap/StaticMethod.h @@ -36,21 +36,29 @@ struct StaticMethod { // Then the instance variables are set directly by the Module constructor bool verbose; std::string name; - ArgumentList args; - ReturnValue returnVal; + std::vector argLists; + std::vector returnVals; + + // The first time this function is called, it initializes the class members + // with those in rhs, but in subsequent calls it adds additional argument + // lists as function overloads. + void addOverload(bool verbose, const std::string& name, + const ArgumentList& args, const ReturnValue& retVal); // MATLAB code generation - // toolboxPath is the core toolbox directory, e.g., ../matlab - // NOTE: static functions are not inside the class, and - // are created with [ClassName]_[FunctionName]() format + // classPath is class directory, e.g., ../matlab/@Point2 + void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, + const std::string& cppClassName, const std::string& matlabClassName, + const std::string& wrapperName, const std::vector& using_namespaces, + std::vector& functionNames) const; - void proxy_fragment(const std::string& toolboxPath, const std::string& matlabClassName, - const std::string& wrapperName, const int id) const; ///< m-file +private: std::string wrapper_fragment(FileWriter& file, - const std::string& matlabClassName, - const std::string& cppClassName, + const std::string& cppClassName, + const std::string& matlabClassname, + int overload, int id, - const std::vector& using_namespaces) const; ///< cpp wrapper + const std::vector& using_namespaces) const; ///< cpp wrapper }; } // \namespace wrap From ea687c9ff8c8804e371f2d364e9955bd4c6c9baa Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:05:02 +0000 Subject: [PATCH 554/914] Uncommented some overloads in gtsam.h --- gtsam.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gtsam.h b/gtsam.h index 3db42c90f..4b74f120d 100644 --- a/gtsam.h +++ b/gtsam.h @@ -239,7 +239,7 @@ class Rot3 { static gtsam::Rot3 Rx(double t); static gtsam::Rot3 Ry(double t); static gtsam::Rot3 Rz(double t); -// static gtsam::Rot3 RzRyRx(double x, double y, double z); // FIXME: overloaded functions don't work yet + static gtsam::Rot3 RzRyRx(double x, double y, double z); // FIXME: overloaded functions don't work yet static gtsam::Rot3 RzRyRx(Vector xyz); static gtsam::Rot3 yaw(double t); // positive yaw is to right (as in aircraft heading) static gtsam::Rot3 pitch(double t); // positive pitch is up (increasing aircraft altitude) @@ -261,7 +261,7 @@ class Rot3 { // Manifold static size_t Dim(); size_t dim() const; - // gtsam::Rot3 retractCayley(Vector v) const; // FIXME, does not exist in both Matrix and Quaternion options + gtsam::Rot3 retractCayley(Vector v) const; // FIXME, does not exist in both Matrix and Quaternion options gtsam::Rot3 retract(Vector v) const; Vector localCoordinates(const gtsam::Rot3& p) const; @@ -335,7 +335,7 @@ class Pose3 { Pose3(); Pose3(const gtsam::Pose3& pose); Pose3(const gtsam::Rot3& r, const gtsam::Point3& t); - // Pose3(const gtsam::Pose2& pose2); // FIXME: shadows Pose3(Pose3 pose) + Pose3(const gtsam::Pose2& pose2); // FIXME: shadows Pose3(Pose3 pose) Pose3(Matrix t); // Testable @@ -373,9 +373,9 @@ class Pose3 { double y() const; double z() const; Matrix matrix() const; - // gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; // FIXME: shadows other transform_to() + gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; // FIXME: shadows other transform_to() double range(const gtsam::Point3& point); - // double range(const gtsam::Pose3& pose); // FIXME: shadows other range + double range(const gtsam::Pose3& pose); // FIXME: shadows other range }; class Cal3_S2 { @@ -466,7 +466,7 @@ class SimpleCamera { SimpleCamera(const gtsam::Pose3& pose, const gtsam::Cal3_S2& K); static gtsam::SimpleCamera level(const gtsam::Cal3_S2& K, const gtsam::Pose2& pose, double height); - // static gtsam::SimpleCamera level(const gtsam::Pose2& pose, double height); // FIXME overload + static gtsam::SimpleCamera level(const gtsam::Pose2& pose, double height); // FIXME overload static gtsam::SimpleCamera lookat(const gtsam::Point3& eye, const gtsam::Point3& target, const gtsam::Point3& upVector, const gtsam::Cal3_S2& K); @@ -491,7 +491,7 @@ class SimpleCamera { gtsam::Point2 project(const gtsam::Point3& point); gtsam::Point3 backproject(const gtsam::Point2& p, double depth) const; double range(const gtsam::Point3& point); - // double range(const gtsam::Pose3& point); // FIXME, overload + double range(const gtsam::Pose3& point); // FIXME, overload }; //************************************************************************* From b9602ee49b086c81919cb15476803118d87df639 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 14:05:04 +0000 Subject: [PATCH 555/914] svn:externals points to cmake-libs branch From e4370843497946c5bdfe4855e910d6962a81339d Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Thu, 5 Jul 2012 15:08:07 +0000 Subject: [PATCH 556/914] remove a custom constructor for LMParams, update matlab interface and tests accordingly --- gtsam.h | 1 - gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 8 ++------ matlab/examples/SFMExample.m | 2 +- matlab/tests/testSFMExample.m | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/gtsam.h b/gtsam.h index b80ddd26e..a78c6901b 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1011,7 +1011,6 @@ class Marginals { #include class LevenbergMarquardtParams { LevenbergMarquardtParams(); - LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose); void print(string s) const; double getMaxIterations() const; diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index f5e4195da..5677f6c08 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -46,13 +46,9 @@ public: double lambdaUpperBound; ///< The maximum lambda to try before assuming the optimization has failed (default: 1e5) VerbosityLM verbosityLM; ///< The verbosity level for Levenberg-Marquardt (default: SILENT), see also NonlinearOptimizerParams::verbosity - LevenbergMarquardtParams() : - lambdaInitial(1e-5), lambdaFactor(10.0), lambdaUpperBound(1e5), verbosityLM(SILENT) {} - - LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose) : - lambdaInitial(initial), lambdaFactor(factor), lambdaUpperBound(bound), verbosityLM(VerbosityLM(verbose)) {} - + LevenbergMarquardtParams() : lambdaInitial(1e-5), lambdaFactor(10.0), lambdaUpperBound(1e5), verbosityLM(SILENT) {} virtual ~LevenbergMarquardtParams() {} + virtual void print(const std::string& str = "") const; inline double getlambdaInitial() const { return lambdaInitial; } diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 34682e1e6..277f31648 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -63,7 +63,7 @@ initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Fine grain optimization, allowing user to iterate step by step -parameters = gtsamLevenbergMarquardtParams(1e-5, 1e-5, 0, 0); +parameters = gtsamLevenbergMarquardtParams; parameters.setlambdaInitial(1.0); parameters.setVerbosityLM('trylambda'); diff --git a/matlab/tests/testSFMExample.m b/matlab/tests/testSFMExample.m index ebda9535e..ef27a7e4b 100644 --- a/matlab/tests/testSFMExample.m +++ b/matlab/tests/testSFMExample.m @@ -48,7 +48,7 @@ for j=1:size(truth.points,2) end %% Optimization -parameters = gtsamLevenbergMarquardtParams(1e-5, 1e-5, 0, 0); +parameters = gtsamLevenbergMarquardtParams; optimizer = graph.optimizer(initialEstimate, parameters); for i=1:5 optimizer.iterate(); From ad66f9ee19550af727af93119759326d559f69eb Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Thu, 5 Jul 2012 16:41:13 +0000 Subject: [PATCH 557/914] a simple sba suite and unit test. --- gtsam/slam/sba.h | 70 +++++++++++++ gtsam/slam/tests/testSba.cpp | 193 +++++++++++++++++++++++++++++++++++ 2 files changed, 263 insertions(+) create mode 100644 gtsam/slam/sba.h create mode 100644 gtsam/slam/tests/testSba.cpp diff --git a/gtsam/slam/sba.h b/gtsam/slam/sba.h new file mode 100644 index 000000000..8e6f02ff4 --- /dev/null +++ b/gtsam/slam/sba.h @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + + * 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 sba.h + * @brief a suite for sparse bundle adjustment + * @date Jul 5, 2012 + * @author ydjian + */ + +#pragma once + +#include +#include + +namespace sba { + + using namespace gtsam; + + /** + * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper + * @addtogroup SLAM + */ + struct Graph: public visualSLAM::Graph { + + /// Default constructor + Graph(){} + + /// Copy constructor given any other NonlinearFactorGraph + Graph(const NonlinearFactorGraph& graph): visualSLAM::Graph(graph) {} + + /** + * Add a 2d projection measurement + * @param z the measurement + * @param model the noise model for the measurement + * @param cameraKey variable key for the pose+calibration + * @param pointKey variable key for the point + */ + template + void addMeasurement(const Point2 &z, const SharedNoiseModel& model, const Index cameraKey, const Index pointKey) { + typedef GeneralSFMFactor SFMFactor; + boost::shared_ptr factor(new SFMFactor(z, model, cameraKey, pointKey)); + push_back(factor); + } + + /** + * Add a 2d projection measurement + * @param z the measurement + * @param model the noise model for the measurement + * @param poseKey variable key for the pose + * @param pointKey variable key for the point + * @param calibKey variable key for the calibration + */ + template + void addMeasurement(const Point2 &z, const SharedNoiseModel& model, const Index posekey, const Index pointkey, const Index calibkey) { + typedef GeneralSFMFactor2 SFMFactor; + boost::shared_ptr factor(new SFMFactor(z, model, posekey, pointkey, calibkey)); + push_back(factor); + } + }; + +} diff --git a/gtsam/slam/tests/testSba.cpp b/gtsam/slam/tests/testSba.cpp new file mode 100644 index 000000000..8d441aa34 --- /dev/null +++ b/gtsam/slam/tests/testSba.cpp @@ -0,0 +1,193 @@ +/* ---------------------------------------------------------------------------- + + * 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 testSba.cpp + * @brief + * @date Jul 5, 2012 + * @author Yong-Dian Jian + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace boost; +using namespace gtsam; + +/* ************************************************************************* */ + +static SharedNoiseModel sigma(noiseModel::Unit::Create(2)); + +// Convenience for named keys +using symbol_shorthand::X; /* pose3 */ +using symbol_shorthand::K; /* calibration */ +using symbol_shorthand::C; /* camera = [pose calibration] */ +using symbol_shorthand::L; /* point3 */ + +static Point3 landmark1(-1.0,-1.0, 0.0); +static Point3 landmark2(-1.0, 1.0, 0.0); +static Point3 landmark3( 1.0, 1.0, 0.0); +static Point3 landmark4( 1.0,-1.0, 0.0); + +static Pose3 pose1(Matrix_(3,3, + 1., 0., 0., + 0.,-1., 0., + 0., 0.,-1.), + Point3(0,0,6.25)); + +static Pose3 pose2(Matrix_(3,3, + 1., 0., 0., + 0.,-1., 0., + 0., 0.,-1.), + Point3(0,0,5.00)); + +static Cal3_S2 calib1 (625, 625, 0, 0, 0); +static Cal3_S2 calib2 (625, 625, 0, 0, 0); + + +typedef PinholeCamera Camera; + +static Camera camera1(pose1, calib1); +static Camera camera2(pose2, calib2); + +/* ************************************************************************* */ +sba::Graph testGraph1() { + Point2 z11(-100, 100); + Point2 z12(-100,-100); + Point2 z13( 100,-100); + Point2 z14( 100, 100); + Point2 z21(-125, 125); + Point2 z22(-125,-125); + Point2 z23( 125,-125); + Point2 z24( 125, 125); + + + sba::Graph g; + g.addMeasurement(z11, sigma, C(1), L(1)); + g.addMeasurement(z12, sigma, C(1), L(2)); + g.addMeasurement(z13, sigma, C(1), L(3)); + g.addMeasurement(z14, sigma, C(1), L(4)); + g.addMeasurement(z21, sigma, C(2), L(1)); + g.addMeasurement(z22, sigma, C(2), L(2)); + g.addMeasurement(z23, sigma, C(2), L(3)); + g.addMeasurement(z24, sigma, C(2), L(4)); + return g; +} + +sba::Graph testGraph2() { + Point2 z11(-100, 100); + Point2 z12(-100,-100); + Point2 z13( 100,-100); + Point2 z14( 100, 100); + Point2 z21(-125, 125); + Point2 z22(-125,-125); + Point2 z23( 125,-125); + Point2 z24( 125, 125); + + sba::Graph g; + g.addMeasurement(z11, sigma, X(1), L(1), K(1)); + g.addMeasurement(z12, sigma, X(1), L(2), K(1)); + g.addMeasurement(z13, sigma, X(1), L(3), K(1)); + g.addMeasurement(z14, sigma, X(1), L(4), K(1)); + g.addMeasurement(z21, sigma, X(2), L(1), K(1)); + g.addMeasurement(z22, sigma, X(2), L(2), K(1)); + g.addMeasurement(z23, sigma, X(2), L(3), K(1)); + g.addMeasurement(z24, sigma, X(2), L(4), K(1)); + return g; +} + +/* ************************************************************************* */ +TEST( optimizeLM1, sba ) +{ + // build a graph + sba::Graph graph(testGraph1()); + + // add 3 landmark constraints + graph.addPointConstraint(L(1), landmark1); + graph.addPointConstraint(L(2), landmark2); + graph.addPointConstraint(L(3), landmark3); + + // Create an initial values structure corresponding to the ground truth + Values initialEstimate; + initialEstimate.insert(C(1), camera1); + initialEstimate.insert(C(2), camera2); + initialEstimate.insert(L(1), landmark1); + initialEstimate.insert(L(2), landmark2); + initialEstimate.insert(L(3), landmark3); + initialEstimate.insert(L(4), landmark4); + + // Create an ordering of the variables + Ordering ordering; + ordering += L(1),L(2),L(3),L(4),C(1),C(2); + + // Create an optimizer and check its error + // We expect the initial to be zero because config is the ground truth + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, ordering); + DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); + + // Iterate once, and the config should not have changed because we started + // with the ground truth + optimizer.iterate(); + DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); + + // check if correct + CHECK(assert_equal(initialEstimate, optimizer.values())); +} + +/* ************************************************************************* */ +TEST( optimizeLM2, sba ) +{ + // build a graph + sba::Graph graph(testGraph2()); + + // add 3 landmark constraints + graph.addPointConstraint(L(1), landmark1); + graph.addPointConstraint(L(2), landmark2); + graph.addPointConstraint(L(3), landmark3); + + // Create an initial values structure corresponding to the ground truth + Values initialEstimate; + initialEstimate.insert(X(1), pose1); + initialEstimate.insert(X(2), pose2); + initialEstimate.insert(L(1), landmark1); + initialEstimate.insert(L(2), landmark2); + initialEstimate.insert(L(3), landmark3); + initialEstimate.insert(L(4), landmark4); + initialEstimate.insert(K(1), calib2); + + // Create an ordering of the variables + Ordering ordering; + ordering += L(1),L(2),L(3),L(4),X(1),X(2),K(1); + + // Create an optimizer and check its error + // We expect the initial to be zero because config is the ground truth + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, ordering); + DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); + + // Iterate once, and the config should not have changed because we started + // with the ground truth + optimizer.iterate(); + DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); + + // check if correct + CHECK(assert_equal(initialEstimate, optimizer.values())); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From 806d86513d205fc4a3972f07b18c9d4ce9d37996 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 17:08:05 +0000 Subject: [PATCH 558/914] Fixed bug in iSAM2 variable removal where removed variables still became marked when marking relin-affected variables --- gtsam/nonlinear/ISAM2.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index e47127edd..f1881ebd5 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -649,6 +649,15 @@ ISAM2Result ISAM2::update( // add other cliques that have the marked ones in the separator Impl::FindAll(this->root(), markedKeys, markedRelinMask); + // FindAll might have marked some removed keys because the removed keys + // are still in the old BayesTree structure - we remove them from + // markedKeys here. Note that the limit for removing indices that we use + // (delta_.size()) is after all of the new variables - so we do not + // remove indices that were removed but then recreated by adding new + // keys. + FastSet::iterator firstRemovedIndex = markedKeys.lower_bound(delta_.size()); + markedKeys.erase(firstRemovedIndex, markedKeys.end()); + // Relin involved keys for detailed results if(params_.enableDetailedResults) { FastSet involvedRelinKeys; From b460f2a7215cea8f6c405f1275b454827a443bf2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 17:08:40 +0000 Subject: [PATCH 559/914] Added missing 'typename's --- wrap/Module.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 0c351a4f9..86cc90ef1 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -276,7 +276,7 @@ Module::Module(const string& interfacePath, /* ************************************************************************* */ template void verifyArguments(const vector& validArgs, const map& vt) { - typedef map::value_type Name_Method; + typedef typename map::value_type Name_Method; BOOST_FOREACH(const Name_Method& name_method, vt) { const T& t = name_method.second; BOOST_FOREACH(const ArgumentList& argList, t.argLists) { @@ -293,7 +293,7 @@ void verifyArguments(const vector& validArgs, const map& vt) { /* ************************************************************************* */ template void verifyReturnTypes(const vector& validtypes, const map& vt) { - typedef map::value_type Name_Method; + typedef typename map::value_type Name_Method; BOOST_FOREACH(const Name_Method& name_method, vt) { const T& t = name_method.second; BOOST_FOREACH(const ReturnValue& retval, t.returnVals) { From fe133ef97c9291c0d19ca8f22126a342164641e5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 5 Jul 2012 17:14:40 +0000 Subject: [PATCH 560/914] Updated expected files to match current wrap test --- wrap/tests/expected/@Point2/Point2.m | 4 ++-- wrap/tests/expected/@Point3/Point3.m | 4 ++-- wrap/tests/expected/@Test/Test.m | 4 ++-- wrap/tests/expected/new_Point2.cpp | 6 ++++-- wrap/tests/expected/new_Point3.cpp | 6 ++++-- wrap/tests/expected/new_Test.cpp | 6 ++++-- wrap/tests/expected_namespaces/@ClassD/ClassD.m | 4 ++-- wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m | 4 ++-- wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m | 4 ++-- wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m | 4 ++-- wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m | 4 ++-- wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m | 4 ++-- wrap/tests/expected_namespaces/new_ClassD.cpp | 6 ++++-- wrap/tests/expected_namespaces/new_ns1ClassA.cpp | 6 ++++-- wrap/tests/expected_namespaces/new_ns1ClassB.cpp | 6 ++++-- wrap/tests/expected_namespaces/new_ns2ClassA.cpp | 6 ++++-- wrap/tests/expected_namespaces/new_ns2ClassC.cpp | 6 ++++-- wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp | 6 ++++-- 18 files changed, 54 insertions(+), 36 deletions(-) diff --git a/wrap/tests/expected/@Point2/Point2.m b/wrap/tests/expected/@Point2/Point2.m index 31d54bb19..5cfd7fc61 100644 --- a/wrap/tests/expected/@Point2/Point2.m +++ b/wrap/tests/expected/@Point2/Point2.m @@ -7,12 +7,12 @@ classdef Point2 < handle function obj = Point2(varargin) if (nargin == 0), obj.self = new_Point2(0,0); end if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Point2(0,1,varargin{1},varargin{2}); end - if nargin ==14, new_Point2_(varargin{1},0); end + if nargin ==14, new_Point2(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point2 constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_Point2_(obj.self); + new_Point2(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected/@Point3/Point3.m b/wrap/tests/expected/@Point3/Point3.m index 6dd8e9ee5..81bd00a5a 100644 --- a/wrap/tests/expected/@Point3/Point3.m +++ b/wrap/tests/expected/@Point3/Point3.m @@ -6,12 +6,12 @@ classdef Point3 < handle methods function obj = Point3(varargin) if (nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double')), obj.self = new_Point3(0,0,varargin{1},varargin{2},varargin{3}); end - if nargin ==14, new_Point3_(varargin{1},0); end + if nargin ==14, new_Point3(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point3 constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_Point3_(obj.self); + new_Point3(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected/@Test/Test.m b/wrap/tests/expected/@Test/Test.m index 60628b997..63914d2aa 100644 --- a/wrap/tests/expected/@Test/Test.m +++ b/wrap/tests/expected/@Test/Test.m @@ -7,12 +7,12 @@ classdef Test < handle function obj = Test(varargin) if (nargin == 0), obj.self = new_Test(0,0); end if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Test(0,1,varargin{1},varargin{2}); end - if nargin ==14, new_Test_(varargin{1},0); end + if nargin ==14, new_Test(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Test constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_Test_(obj.self); + new_Test(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected/new_Point2.cpp b/wrap/tests/expected/new_Point2.cpp index 30a707f88..b24642ad4 100644 --- a/wrap/tests/expected/new_Point2.cpp +++ b/wrap/tests/expected/new_Point2.cpp @@ -6,8 +6,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected/new_Point3.cpp b/wrap/tests/expected/new_Point3.cpp index c3d758266..2e715263b 100644 --- a/wrap/tests/expected/new_Point3.cpp +++ b/wrap/tests/expected/new_Point3.cpp @@ -7,8 +7,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected/new_Test.cpp b/wrap/tests/expected/new_Test.cpp index 050d179d3..57ac1a4ea 100644 --- a/wrap/tests/expected/new_Test.cpp +++ b/wrap/tests/expected/new_Test.cpp @@ -7,8 +7,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected_namespaces/@ClassD/ClassD.m b/wrap/tests/expected_namespaces/@ClassD/ClassD.m index 282b761ed..90fbf48a4 100644 --- a/wrap/tests/expected_namespaces/@ClassD/ClassD.m +++ b/wrap/tests/expected_namespaces/@ClassD/ClassD.m @@ -6,12 +6,12 @@ classdef ClassD < handle methods function obj = ClassD(varargin) if (nargin == 0), obj.self = new_ClassD(0,0); end - if nargin ==14, new_ClassD_(varargin{1},0); end + if nargin ==14, new_ClassD(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ClassD constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_ClassD_(obj.self); + new_ClassD(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m b/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m index b8f1b3535..727e020ae 100644 --- a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m +++ b/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m @@ -6,12 +6,12 @@ classdef ns1ClassA < handle methods function obj = ns1ClassA(varargin) if (nargin == 0), obj.self = new_ns1ClassA(0,0); end - if nargin ==14, new_ns1ClassA_(varargin{1},0); end + if nargin ==14, new_ns1ClassA(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassA constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_ns1ClassA_(obj.self); + new_ns1ClassA(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m b/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m index 42add5e9c..19b0a73b9 100644 --- a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m +++ b/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m @@ -6,12 +6,12 @@ classdef ns1ClassB < handle methods function obj = ns1ClassB(varargin) if (nargin == 0), obj.self = new_ns1ClassB(0,0); end - if nargin ==14, new_ns1ClassB_(varargin{1},0); end + if nargin ==14, new_ns1ClassB(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassB constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_ns1ClassB_(obj.self); + new_ns1ClassB(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m b/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m index cbbbbbce2..27de74dc3 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m +++ b/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m @@ -6,12 +6,12 @@ classdef ns2ClassA < handle methods function obj = ns2ClassA(varargin) if (nargin == 0), obj.self = new_ns2ClassA(0,0); end - if nargin ==14, new_ns2ClassA_(varargin{1},0); end + if nargin ==14, new_ns2ClassA(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassA constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_ns2ClassA_(obj.self); + new_ns2ClassA(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m b/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m index 5bd68fee7..2425b59bd 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m +++ b/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m @@ -6,12 +6,12 @@ classdef ns2ClassC < handle methods function obj = ns2ClassC(varargin) if (nargin == 0), obj.self = new_ns2ClassC(0,0); end - if nargin ==14, new_ns2ClassC_(varargin{1},0); end + if nargin ==14, new_ns2ClassC(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassC constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_ns2ClassC_(obj.self); + new_ns2ClassC(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m b/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m index 936c7cdd1..de7f7a3ca 100644 --- a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m +++ b/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m @@ -6,12 +6,12 @@ classdef ns2ns3ClassB < handle methods function obj = ns2ns3ClassB(varargin) if (nargin == 0), obj.self = new_ns2ns3ClassB(0,0); end - if nargin ==14, new_ns2ns3ClassB_(varargin{1},0); end + if nargin ==14, new_ns2ns3ClassB(varargin{1},0); end if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ns3ClassB constructor failed'); end end function delete(obj) if obj.self ~= 0 - new_ns2ns3ClassB_(obj.self); + new_ns2ns3ClassB(obj.self); obj.self = 0; end end diff --git a/wrap/tests/expected_namespaces/new_ClassD.cpp b/wrap/tests/expected_namespaces/new_ClassD.cpp index 13bbe9d5e..d7a7e4908 100644 --- a/wrap/tests/expected_namespaces/new_ClassD.cpp +++ b/wrap/tests/expected_namespaces/new_ClassD.cpp @@ -6,8 +6,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA.cpp b/wrap/tests/expected_namespaces/new_ns1ClassA.cpp index fc60abe6d..2554eafc1 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassA.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassA.cpp @@ -6,8 +6,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB.cpp b/wrap/tests/expected_namespaces/new_ns1ClassB.cpp index 419453968..bc1dd313c 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassB.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassB.cpp @@ -7,8 +7,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA.cpp b/wrap/tests/expected_namespaces/new_ns2ClassA.cpp index 31e3385d5..57faabc79 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassA.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassA.cpp @@ -7,8 +7,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC.cpp b/wrap/tests/expected_namespaces/new_ns2ClassC.cpp index c0446109a..e836a80fd 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassC.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassC.cpp @@ -6,8 +6,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp index a952790b5..af1a25922 100644 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp @@ -7,8 +7,10 @@ typedef boost::shared_ptr Shared; static std::set collector; void cleanup(void) { - BOOST_FOREACH(Shared* p, collector) - collector.erase(p); + for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { + delete *iter; + collector.erase(iter++); + } } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { From 699aaf51bb73551d610540803549e91eb6ce04cd Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 5 Jul 2012 17:56:34 +0000 Subject: [PATCH 561/914] Values copy constructor exposed in MATLAB --- gtsam.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gtsam.h b/gtsam.h index a78c6901b..de022bd70 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1052,6 +1052,7 @@ namespace pose2SLAM { class Values { Values(); + Values(const pose2SLAM::Values& values); size_t size() const; void print(string s) const; bool exists(size_t key); @@ -1105,6 +1106,7 @@ namespace pose3SLAM { class Values { Values(); + Values(const pose3SLAM::Values& values); size_t size() const; void print(string s) const; bool exists(size_t key); @@ -1158,6 +1160,7 @@ namespace planarSLAM { class Values { Values(); + Values(const planarSLAM::Values& values); size_t size() const; void print(string s) const; bool exists(size_t key); @@ -1243,6 +1246,7 @@ namespace visualSLAM { class Values { Values(); + Values(const visualSLAM::Values& values); size_t size() const; void print(string s) const; bool exists(size_t key); From 5912b7f2358d18d58fc2b44dac7daa0a80e2ad41 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 5 Jul 2012 18:07:18 +0000 Subject: [PATCH 562/914] Moved library postfix option to GtsamBuildTypes --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 675e7c80b..77b8b0c18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,6 @@ else() option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" ON) endif() option(GTSAM_BUILD_STATIC_LIBRARY "Enable/Disable building of a static version of gtsam" ON) -option(GTSAM_BUILD_TYPE_POSTFIXES "Enable/Disable appending the build type to the name of compiled libraries" OFF) option(GTSAM_USE_QUATERNIONS "Enable/Disable using an internal Quaternion representation for rotations instead of rotation matrices" OFF) if(MSVC) option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" OFF) From 50b40b1b5bb27c22d24f4e5d839d88705217d6d2 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 5 Jul 2012 18:10:09 +0000 Subject: [PATCH 563/914] printing detail --- gtsam/slam/PriorFactor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/slam/PriorFactor.h b/gtsam/slam/PriorFactor.h index 094065336..0d0497132 100644 --- a/gtsam/slam/PriorFactor.h +++ b/gtsam/slam/PriorFactor.h @@ -65,8 +65,8 @@ namespace gtsam { /** print */ virtual void print(const std::string& s, const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - std::cout << s << "PriorFactor(" << keyFormatter(this->key()) << ")\n"; - prior_.print(" prior"); + std::cout << s << "PriorFactor on " << keyFormatter(this->key()) << ", prior value:\n"; + prior_.print(); this->noiseModel_->print(" noise model: "); } From f575cb4cc038ca8368f6b017c443c2765ca2467f Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 5 Jul 2012 18:37:08 +0000 Subject: [PATCH 564/914] Fixed bug in iSAM2 where variables are deleted inside of iSAM2 even though they appear in the set of new, incoming factors --- gtsam/nonlinear/ISAM2.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index f1881ebd5..bb579195f 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -579,6 +579,15 @@ ISAM2Result ISAM2::update( markedKeys.insert(index); } + // Delete any keys from 'unusedKeys' that are actually used by the new, incoming factors + FastSet newNonlinearKeys = newFactors.keys(); + BOOST_FOREACH(Key key, newNonlinearKeys) { + FastSet::iterator iter = unusedKeys.find(key); + if(iter != unusedKeys.end()) { + unusedKeys.erase(iter); + } + } + // Remove unused keys. We must hold on to the new nodes index for now // instead of placing it into the tree because removeTop will need to // update it. From f55612d38139a31077729ffeb7e8ac6cad714f3d Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 5 Jul 2012 18:50:09 +0000 Subject: [PATCH 565/914] Moved the 'markKeys' generation in iSAM2 until after the call to RemoveVariables. Since the 'RemoveVariables' function permutes the ordering, this ensures markedKeys uses the correct indices --- gtsam/nonlinear/ISAM2.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index bb579195f..7fb23884b 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -575,8 +575,6 @@ ISAM2Result ISAM2::update( Index index = ordering_[key]; if(variableIndex_[index].empty()) unusedKeys.insert(key); - else - markedKeys.insert(index); } // Delete any keys from 'unusedKeys' that are actually used by the new, incoming factors @@ -593,6 +591,16 @@ ISAM2Result ISAM2::update( // update it. Impl::RemoveVariables(unusedKeys, root_, theta_, variableIndex_, delta_, deltaNewton_, RgProd_, deltaReplacedMask_, ordering_, Base::nodes_, linearFactors_); + + // Mark keys that are still in the use and are also included in the removed factors + // Note: The ordering has been modified during the RemoveVariables() function call. + // Hence, we do not create this list until after that call + BOOST_FOREACH(Key key, removedFactorSymbKeys) { + Index index; + if(ordering_.tryAt(key, index)) + markedKeys.insert(index); + } + } toc(1,"push_back factors"); From 134951f21cf6617acbcaf9f49f33a79c6ff56b6d Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 5 Jul 2012 18:59:10 +0000 Subject: [PATCH 566/914] In iSAM2, added a check in the Batch-mode path that checks if linearized factors should be stored for performance reasons. Without this, factors were cached in batch-mode but not in the normal incremental-mode, leading to inconsistency --- gtsam/nonlinear/ISAM2.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 7fb23884b..779880dab 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -329,11 +329,13 @@ boost::shared_ptr > ISAM2::recalculate( toc(1,"reorder"); tic(2,"linearize"); - linearFactors_ = *nonlinearFactors_.linearize(theta_, ordering_); + GaussianFactorGraph linearized = *nonlinearFactors_.linearize(theta_, ordering_); + if(params_.cacheLinearizedFactors) + linearFactors_ = linearized; toc(2,"linearize"); tic(5,"eliminate"); - JunctionTree jt(linearFactors_, variableIndex_); + JunctionTree jt(linearized, variableIndex_); sharedClique newRoot; if(params_.factorization == ISAM2Params::CHOLESKY) newRoot = jt.eliminate(EliminatePreferCholesky); @@ -352,7 +354,7 @@ boost::shared_ptr > ISAM2::recalculate( lastAffectedMarkedCount = markedKeys.size(); lastAffectedVariableCount = affectedKeysSet->size(); - lastAffectedFactorCount = linearFactors_.size(); + lastAffectedFactorCount = linearized.size(); // Reeliminated keys for detailed results if(params_.enableDetailedResults) { From 1bc4db97c6859ffb4f520e50707d213f131c2393 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 5 Jul 2012 23:32:37 +0000 Subject: [PATCH 567/914] More efficient operations from within MATLAB --- gtsam.h | 4 +- gtsam/slam/tests/testVisualSLAM.cpp | 72 +++++++++++++++++++++-------- gtsam/slam/visualSLAM.cpp | 39 ++++++++++++---- gtsam/slam/visualSLAM.h | 12 ++++- 4 files changed, 98 insertions(+), 29 deletions(-) diff --git a/gtsam.h b/gtsam.h index de022bd70..e59a2f382 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1272,6 +1272,8 @@ class Values { void insertPoint(size_t key, const gtsam::Point3& pose); void updatePoint(size_t key, const gtsam::Point3& pose); gtsam::Point3 point(size_t j); + void insertBackprojections(const gtsam::SimpleCamera& c, Vector J, Matrix Z, double depth); + void perturbPoints(double sigma, size_t seed); Matrix points() const; }; @@ -1312,7 +1314,7 @@ class Graph { void addMeasurement(const gtsam::Point2& measured, const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, const gtsam::Cal3_S2* K); - void addMeasurements(size_t i, const gtsam::KeyVector& J, Matrix Z, + void addMeasurements(size_t i, Vector J, Matrix Z, const gtsam::noiseModel::Base* model, const gtsam::Cal3_S2* K); void addStereoMeasurement(const gtsam::StereoPoint2& measured, const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp index faf733a22..680a9ab9b 100644 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -42,14 +42,14 @@ static Point3 landmark2(-1.0, 1.0, 0.0); static Point3 landmark3( 1.0, 1.0, 0.0); static Point3 landmark4( 1.0,-1.0, 0.0); -static Pose3 camera1(Matrix_(3,3, +static Pose3 pose1(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. ), Point3(0,0,6.25)); -static Pose3 camera2(Matrix_(3,3, +static Pose3 pose2(Matrix_(3,3, 1., 0., 0., 0.,-1., 0., 0., 0.,-1. @@ -92,8 +92,8 @@ TEST( VisualSLAM, optimizeLM) // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(X(1), camera1); - initialEstimate.insert(X(2), camera2); + initialEstimate.insert(X(1), pose1); + initialEstimate.insert(X(2), pose2); initialEstimate.insert(L(1), landmark1); initialEstimate.insert(L(2), landmark2); initialEstimate.insert(L(3), landmark3); @@ -124,13 +124,13 @@ TEST( VisualSLAM, optimizeLM2) // build a graph visualSLAM::Graph graph(testGraph()); // add 2 camera constraints - graph.addPoseConstraint(X(1), camera1); - graph.addPoseConstraint(X(2), camera2); + graph.addPoseConstraint(X(1), pose1); + graph.addPoseConstraint(X(2), pose2); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(X(1), camera1); - initialEstimate.insert(X(2), camera2); + initialEstimate.insert(X(1), pose1); + initialEstimate.insert(X(2), pose2); initialEstimate.insert(L(1), landmark1); initialEstimate.insert(L(2), landmark2); initialEstimate.insert(L(3), landmark3); @@ -160,13 +160,13 @@ TEST( VisualSLAM, LMoptimizer) // build a graph visualSLAM::Graph graph(testGraph()); // add 2 camera constraints - graph.addPoseConstraint(X(1), camera1); - graph.addPoseConstraint(X(2), camera2); + graph.addPoseConstraint(X(1), pose1); + graph.addPoseConstraint(X(2), pose2); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(X(1), camera1); - initialEstimate.insert(X(2), camera2); + initialEstimate.insert(X(1), pose1); + initialEstimate.insert(X(2), pose2); initialEstimate.insert(L(1), landmark1); initialEstimate.insert(L(2), landmark2); initialEstimate.insert(L(3), landmark3); @@ -193,13 +193,13 @@ TEST( VisualSLAM, CHECK_ORDERING) // build a graph visualSLAM::Graph graph = testGraph(); // add 2 camera constraints - graph.addPoseConstraint(X(1), camera1); - graph.addPoseConstraint(X(2), camera2); + graph.addPoseConstraint(X(1), pose1); + graph.addPoseConstraint(X(2), pose2); // Create an initial values structure corresponding to the ground truth Values initialEstimate; - initialEstimate.insert(X(1), camera1); - initialEstimate.insert(X(2), camera2); + initialEstimate.insert(X(1), pose1); + initialEstimate.insert(X(2), pose2); initialEstimate.insert(L(1), landmark1); initialEstimate.insert(L(2), landmark2); initialEstimate.insert(L(3), landmark3); @@ -274,8 +274,8 @@ TEST( VisualSLAM, keys_and_view ) { // create config visualSLAM::Values c; - c.insert(X(1), camera1); - c.insert(X(2), camera2); + c.insert(X(1), pose1); + c.insert(X(2), pose2); c.insert(L(2), landmark2); LONGS_EQUAL(2,c.nrPoses()); LONGS_EQUAL(1,c.nrPoints()); @@ -299,6 +299,42 @@ TEST( VisualSLAM, keys_and_view ) } } +/* ************************************************************************* */ +TEST( VisualSLAM, addMeasurements ) +{ + // create config + visualSLAM::Graph g; + Vector J = Vector_(3,1.0,2.0,3.0); + Matrix Z = Matrix_(2,3, -1.0,0.0,1.0, -1.0,0.0,1.0); + shared_ptrK sK(new Cal3_S2(625, 625, 0, 0, 0)); + g.addMeasurements(0,J,Z,sigma,sK); + EXPECT_LONGS_EQUAL(3,g.size()); +} + +/* ************************************************************************* */ +TEST( VisualSLAM, insertBackProjections ) +{ + // create config + visualSLAM::Values c; + SimpleCamera camera(pose1); + Vector J = Vector_(3,1.0,2.0,3.0); + Matrix Z = Matrix_(2,3, -1.0,0.0,1.0, -1.0,0.0,1.0); + c.insertBackprojections(camera,J,Z,1.0); + EXPECT_LONGS_EQUAL(3,c.nrPoints()); +} + +/* ************************************************************************* */ +TEST( VisualSLAM, perturbPoints ) +{ + visualSLAM::Values c1,c2; + c1.insert(L(2), landmark2); + c1.perturbPoints(0.01,42u); + CHECK(assert_equal(Point3(-0.986984, 0.999534, -0.0147962),c1.point(L(2)),1e-6)); + c2.insert(L(2), landmark2); + c2.perturbPoints(0.01,42u); + CHECK(assert_equal(Point3(-0.986984, 0.999534, -0.0147962),c2.point(L(2)),1e-6)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 162ba03c7..3f974abed 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -18,12 +18,36 @@ #include #include #include +#include #include -using boost::make_shared; - namespace visualSLAM { + using boost::make_shared; + + /* ************************************************************************* */ + void Values::insertBackprojections(const SimpleCamera& camera, + const Vector& J, const Matrix& Z, double depth) { + if (Z.rows() != 2) throw std::invalid_argument("insertBackProjections: Z must be 2*K"); + if (Z.cols() != J.size()) throw std::invalid_argument( + "insertBackProjections: J and Z must have same number of entries"); + for(size_t k=0;k points = allPoints(); + noiseModel::Isotropic::shared_ptr model = noiseModel::Isotropic::Sigma(3,sigma); + Sampler sampler(model, seed); + BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, points) { + update(keyValue.key, keyValue.value.retract(sampler.sample())); + } + } + /* ************************************************************************* */ Matrix Values::points() const { size_t j=0; @@ -53,14 +77,13 @@ namespace visualSLAM { } /* ************************************************************************* */ - void Graph::addMeasurements(Key i, const KeyVector& J, const Matrix& Z, + void Graph::addMeasurements(Key i, const Vector& J, const Matrix& Z, const SharedNoiseModel& model, const shared_ptrK K) { - if ( Z.rows()!=2) throw std::invalid_argument("addMeasurements: Z must be 2*K"); - if (Z.cols() != J.size()) - throw std::invalid_argument( + if (Z.rows() != 2) throw std::invalid_argument("addMeasurements: Z must be 2*K"); + if (Z.cols() != J.size()) throw std::invalid_argument( "addMeasurements: J and Z must have same number of entries"); - for(size_t k=0;k(j); } - Matrix points() const; ///< get all point coordinates in a matrix + /// insert a number of initial point values by backprojecting + void insertBackprojections(const SimpleCamera& c, const Vector& J, + const Matrix& Z, double depth); + + /// perturb all points using normally distributed noise + void perturbPoints(double sigma, int32_t seed = 42u); + + /// get all point coordinates in a matrix + Matrix points() const; }; @@ -137,7 +145,7 @@ namespace visualSLAM { * @param model the noise model for the measurement * @param K shared pointer to calibration object */ - void addMeasurements(Key i, const KeyVector& J, const Matrix& Z, + void addMeasurements(Key i, const Vector& J, const Matrix& Z, const SharedNoiseModel& model, const shared_ptrK K); /** From fc85f917cd5dcee81ab40f912ffba1edd994b5a9 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 6 Jul 2012 07:38:25 +0000 Subject: [PATCH 568/914] reprojectionErrors --- gtsam.h | 4 ++++ gtsam/slam/tests/testVisualSLAM.cpp | 4 ++++ gtsam/slam/visualSLAM.cpp | 15 +++++++++++++++ gtsam/slam/visualSLAM.h | 3 +++ 4 files changed, 26 insertions(+) diff --git a/gtsam.h b/gtsam.h index e59a2f382..5564d38a9 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1319,6 +1319,10 @@ class Graph { void addStereoMeasurement(const gtsam::StereoPoint2& measured, const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, const gtsam::Cal3_S2Stereo* K); + + // Information + Matrix reprojectionErrors(const visualSLAM::Values& values) const; + }; class ISAM { diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp index 680a9ab9b..65c31adf9 100644 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ b/gtsam/slam/tests/testVisualSLAM.cpp @@ -184,6 +184,10 @@ TEST( VisualSLAM, LMoptimizer) // check if correct CHECK(assert_equal(initialEstimate, optimizer.values())); + + // check errors + Matrix errors = graph.reprojectionErrors(optimizer.values()); + CHECK(assert_equal(zeros(2,8), errors)); } diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 3f974abed..1998f1691 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -98,4 +98,19 @@ namespace visualSLAM { } /* ************************************************************************* */ + Matrix Graph::reprojectionErrors(const Values& values) const { + // first count + size_t K = 0, k=0; + BOOST_FOREACH(const sharedFactor& f, *this) + if (boost::dynamic_pointer_cast(f)) ++K; + // now fill + Matrix errors(2,K); + BOOST_FOREACH(const sharedFactor& f, *this) { + boost::shared_ptr p = + boost::dynamic_pointer_cast(f); + if (p) errors.col(k) = p->unwhitenedError(values); + } + return errors; + } + /* ************************************************************************* */ } diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h index eca576b57..ae2956c5f 100644 --- a/gtsam/slam/visualSLAM.h +++ b/gtsam/slam/visualSLAM.h @@ -159,6 +159,9 @@ namespace visualSLAM { void addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, Key poseKey, Key pointKey, const shared_ptrKStereo K); + /// Return a 2*K Matrix of reprojection errors + Matrix reprojectionErrors(const Values& values) const; + }; // Graph /** From dc811e60d0792c85385e6741eeb46e9468ba41a2 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 6 Jul 2012 10:44:35 +0000 Subject: [PATCH 569/914] bugfix --- gtsam/slam/visualSLAM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 1998f1691..5b04b92c6 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -108,7 +108,7 @@ namespace visualSLAM { BOOST_FOREACH(const sharedFactor& f, *this) { boost::shared_ptr p = boost::dynamic_pointer_cast(f); - if (p) errors.col(k) = p->unwhitenedError(values); + if (p) errors.col(k++) = p->unwhitenedError(values); } return errors; } From 6cc65ad8b35fd5916b168d65fcaf80185eab1214 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Fri, 6 Jul 2012 14:18:31 +0000 Subject: [PATCH 570/914] rename sba to sparseBA --- gtsam/slam/{sba.h => sparseBA.h} | 2 +- gtsam/slam/tests/{testSba.cpp => testSparseBA.cpp} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename gtsam/slam/{sba.h => sparseBA.h} (99%) rename gtsam/slam/tests/{testSba.cpp => testSparseBA.cpp} (100%) diff --git a/gtsam/slam/sba.h b/gtsam/slam/sparseBA.h similarity index 99% rename from gtsam/slam/sba.h rename to gtsam/slam/sparseBA.h index 8e6f02ff4..dda1ec44d 100644 --- a/gtsam/slam/sba.h +++ b/gtsam/slam/sparseBA.h @@ -21,7 +21,7 @@ #include #include -namespace sba { +namespace sparseBA { using namespace gtsam; diff --git a/gtsam/slam/tests/testSba.cpp b/gtsam/slam/tests/testSparseBA.cpp similarity index 100% rename from gtsam/slam/tests/testSba.cpp rename to gtsam/slam/tests/testSparseBA.cpp From f24002816d79c2cde091cb34f1e6e7e7791805d0 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Fri, 6 Jul 2012 14:19:19 +0000 Subject: [PATCH 571/914] --- gtsam/slam/tests/testSparseBA.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gtsam/slam/tests/testSparseBA.cpp b/gtsam/slam/tests/testSparseBA.cpp index 8d441aa34..cc6e11400 100644 --- a/gtsam/slam/tests/testSparseBA.cpp +++ b/gtsam/slam/tests/testSparseBA.cpp @@ -10,13 +10,13 @@ * -------------------------------------------------------------------------- */ /** - * @file testSba.cpp + * @file testsparseBA.cpp * @brief * @date Jul 5, 2012 * @author Yong-Dian Jian */ -#include +#include #include #include #include @@ -66,7 +66,7 @@ static Camera camera1(pose1, calib1); static Camera camera2(pose2, calib2); /* ************************************************************************* */ -sba::Graph testGraph1() { +sparseBA::Graph testGraph1() { Point2 z11(-100, 100); Point2 z12(-100,-100); Point2 z13( 100,-100); @@ -77,7 +77,7 @@ sba::Graph testGraph1() { Point2 z24( 125, 125); - sba::Graph g; + sparseBA::Graph g; g.addMeasurement(z11, sigma, C(1), L(1)); g.addMeasurement(z12, sigma, C(1), L(2)); g.addMeasurement(z13, sigma, C(1), L(3)); @@ -89,7 +89,7 @@ sba::Graph testGraph1() { return g; } -sba::Graph testGraph2() { +sparseBA::Graph testGraph2() { Point2 z11(-100, 100); Point2 z12(-100,-100); Point2 z13( 100,-100); @@ -99,7 +99,7 @@ sba::Graph testGraph2() { Point2 z23( 125,-125); Point2 z24( 125, 125); - sba::Graph g; + sparseBA::Graph g; g.addMeasurement(z11, sigma, X(1), L(1), K(1)); g.addMeasurement(z12, sigma, X(1), L(2), K(1)); g.addMeasurement(z13, sigma, X(1), L(3), K(1)); @@ -112,10 +112,10 @@ sba::Graph testGraph2() { } /* ************************************************************************* */ -TEST( optimizeLM1, sba ) +TEST( optimizeLM1, sparseBA ) { // build a graph - sba::Graph graph(testGraph1()); + sparseBA::Graph graph(testGraph1()); // add 3 landmark constraints graph.addPointConstraint(L(1), landmark1); @@ -150,10 +150,10 @@ TEST( optimizeLM1, sba ) } /* ************************************************************************* */ -TEST( optimizeLM2, sba ) +TEST( optimizeLM2, sparseBA ) { // build a graph - sba::Graph graph(testGraph2()); + sparseBA::Graph graph(testGraph2()); // add 3 landmark constraints graph.addPointConstraint(L(1), landmark1); From 1abf81052f8b5e1ca0a04ad32a035a0c625d5222 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 6 Jul 2012 14:48:25 +0000 Subject: [PATCH 572/914] Removed unused test file - linear containers to appear in MastSLAM --- .../tests/testLinearContainerFactors.cpp | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp diff --git a/gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp b/gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp deleted file mode 100644 index 05fabc66a..000000000 --- a/gtsam_unstable/nonlinear/tests/testLinearContainerFactors.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @file testLinearContainerFactors.cpp - * - * @brief Tests the use of nonlinear containers for simple integration of linear factors into nonlinear graphs - * - * @date Jun 7, 2012 - * @author Alex Cunningham - */ - -#include - - -/* ************************************************************************* */ -TEST( testLinearContainerFactors, jacobian_factor ) { - -// LinearContainerFactor actualLinFactor(); - -} - -/* ************************************************************************* */ -int main() { TestResult tr; return TestRegistry::runAllTests(tr); } -/* ************************************************************************* */ From 18fe7b17d81f67ffd527aeffb14f4d483e1cb8a5 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Fri, 6 Jul 2012 17:38:32 +0000 Subject: [PATCH 573/914] wrap sparseBA namespace for matlab and add an example --- gtsam.h | 81 +++++++++++++++++++++++++++++++++- gtsam/slam/sparseBA.cpp | 60 +++++++++++++++++++++++++ gtsam/slam/sparseBA.h | 75 ++++++++++++++++++++++++++++++- matlab/examples/SBAExample.m | 85 ++++++++++++++++++++++++++++++++++++ 4 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 gtsam/slam/sparseBA.cpp create mode 100644 matlab/examples/SBAExample.m diff --git a/gtsam.h b/gtsam.h index 5564d38a9..48199cbf3 100644 --- a/gtsam.h +++ b/gtsam.h @@ -458,7 +458,6 @@ class CalibratedCamera { double range(const gtsam::Point3& p) const; // TODO: Other overloaded range methods }; - class SimpleCamera { // Standard Constructors and Named Constructors SimpleCamera(); @@ -1358,3 +1357,83 @@ class LevenbergMarquardtOptimizer { }; }///\namespace visualSLAM + +//************************************************************************ +// sparse BA +//************************************************************************ + +#include +namespace sparseBA { + +class Values { + Values(); + Values(const sparseBA::Values& values); + size_t size() const; + void print(string s) const; + bool exists(size_t key); + gtsam::KeyVector keys() const; + + // Access to cameras + sparseBA::Values allSimpleCameras() const ; + size_t nrSimpleCameras() const ; + gtsam::KeyVector simpleCameraKeys() const ; + void insertSimpleCamera(size_t j, const gtsam::SimpleCamera& camera); + void updateSimpleCamera(size_t j, const gtsam::SimpleCamera& camera); + gtsam::SimpleCamera simpleCamera(size_t j) const; + + // Access to points, inherited from visualSLAM + sparseBA::Values allPoints() const; + size_t nrPoints() const; + gtsam::KeyVector pointKeys() const; // Note the switch to KeyVector, rather than KeyList + void insertPoint(size_t key, const gtsam::Point3& pose); + void updatePoint(size_t key, const gtsam::Point3& pose); + gtsam::Point3 point(size_t j); + Matrix points() const; +}; + +class Graph { + Graph(); + Graph(const gtsam::NonlinearFactorGraph& graph); + Graph(const sparseBA::Graph& graph); + + // Information + Matrix reprojectionErrors(const sparseBA::Values& values) const; + + // inherited from FactorGraph + void print(string s) const; + bool equals(const sparseBA::Graph& fg, double tol) const; + size_t size() const; + bool empty() const; + void remove(size_t i); + size_t nrFactors() const; + gtsam::NonlinearFactor* at(size_t i) const; + + double error(const sparseBA::Values& values) const; + gtsam::Ordering* orderingCOLAMD(const sparseBA::Values& values) const; + gtsam::GaussianFactorGraph* linearize(const sparseBA::Values& values, const gtsam::Ordering& ordering) const; + + sparseBA::Values optimize(const sparseBA::Values& initialEstimate, size_t verbosity) const; + sparseBA::LevenbergMarquardtOptimizer optimizer(const sparseBA::Values& initialEstimate, const gtsam::LevenbergMarquardtParams& parameters) const; + gtsam::Marginals marginals(const sparseBA::Values& solution) const; + + // inherited from visualSLAM + void addPointConstraint(size_t pointKey, const gtsam::Point3& p); + void addPointPrior(size_t pointKey, const gtsam::Point3& p, const gtsam::noiseModel::Base* model); + + // add factors + void addSimpleCameraPrior(size_t cameraKey, const gtsam::SimpleCamera &camera, gtsam::noiseModel::Base* model); + void addSimpleCameraConstraint(size_t cameraKey, const gtsam::SimpleCamera &camera); + void addSimpleCameraMeasurement(const gtsam::Point2 &z, gtsam::noiseModel::Base* model, size_t cameraKey, size_t pointKey); +}; + +class LevenbergMarquardtOptimizer { + double lambda() const; + void iterate(); + double error() const; + size_t iterations() const; + sparseBA::Values optimize(); + sparseBA::Values optimizeSafely(); + sparseBA::Values values() const; +}; +}///\namespace sparseBA + diff --git a/gtsam/slam/sparseBA.cpp b/gtsam/slam/sparseBA.cpp new file mode 100644 index 000000000..0ff4e1c64 --- /dev/null +++ b/gtsam/slam/sparseBA.cpp @@ -0,0 +1,60 @@ +/** + * @file sparseBA.cpp + * @brief + * @date Jul 6, 2012 + * @author Yong-Dian Jian + */ + +#include + +namespace sparseBA { + +/* ************************************************************************* */ +void Graph::addSimpleCameraConstraint(Key cameraKey, const SimpleCamera &camera) { + addCameraConstraint(cameraKey, camera); +} + +/* ************************************************************************* */ +void Graph::addSimpleCameraPrior(Key cameraKey, const SimpleCamera &camera, SharedNoiseModel &model) { + addCameraPrior(cameraKey, camera, model); +} + +/* ************************************************************************* */ +void Graph::addSimpleCameraMeasurement(const Point2 &z, SharedNoiseModel& model, Index cameraKey, Index pointKey) { + addMeasurement(z, model, cameraKey, pointKey); +} + +/* ************************************************************************* */ +Matrix Graph::reprojectionErrors(const Values& values) const { + + // TODO: support the other calibration objects. Now it only works for Cal3_S2. + + typedef GeneralSFMFactor SFMFactor; + typedef GeneralSFMFactor2 SFMFactor2; + + // first count + size_t K = 0, k=0; + BOOST_FOREACH(const sharedFactor& f, *this) + if (boost::dynamic_pointer_cast(f)) ++K; + else if (boost::dynamic_pointer_cast(f)) ++K; + + // now fill + Matrix errors(2,K); + BOOST_FOREACH(const sharedFactor& f, *this) { + boost::shared_ptr p = boost::dynamic_pointer_cast(f); + if (p) { + errors.col(k++) = p->unwhitenedError(values); + continue; + } + + boost::shared_ptr p2 = boost::dynamic_pointer_cast(f); + if (p2) { + errors.col(k++) = p2->unwhitenedError(values); + } + } + return errors; +} +/* ************************************************************************* */ +} + + diff --git a/gtsam/slam/sparseBA.h b/gtsam/slam/sparseBA.h index dda1ec44d..07aaa5817 100644 --- a/gtsam/slam/sparseBA.h +++ b/gtsam/slam/sparseBA.h @@ -20,11 +20,45 @@ #include #include +#include namespace sparseBA { using namespace gtsam; + /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper + struct Values: public visualSLAM::Values { + + typedef boost::shared_ptr shared_ptr; + typedef gtsam::Values::ConstFiltered SimpleCameraFiltered; + typedef gtsam::Values::ConstFiltered Cal3_S2Filtered; + + /// Default constructor + Values() {} + + /// Copy constructor + Values(const gtsam::Values& values) : visualSLAM::Values(values) {} + + /// Constructor from filtered values view of poses + Values(const SimpleCameraFiltered& view) : visualSLAM::Values(view) {} + + /// Constructor from filtered values view of points + Values(const PointFiltered& view) : visualSLAM::Values(view) {} + + SimpleCameraFiltered allSimpleCameras() const { return this->filter(); } ///< camera view + size_t nrSimpleCameras() const { return allSimpleCameras().size(); } ///< get number of poses + KeyList simpleCameraKeys() const { return allSimpleCameras().keys(); } ///< get keys to poses only + + /// insert a camera + void insertSimpleCamera(Key j, const SimpleCamera& camera) { insert(j, camera); } + + /// update a camera + void updateSimpleCamera(Key j, const SimpleCamera& camera) { update(j, camera); } + + /// get a camera + SimpleCamera simpleCamera(Key j) const { return at(j); } + }; + /** * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper * @addtogroup SLAM @@ -37,6 +71,34 @@ namespace sparseBA { /// Copy constructor given any other NonlinearFactorGraph Graph(const NonlinearFactorGraph& graph): visualSLAM::Graph(graph) {} + /// check if two graphs are equal + bool equals(const Graph& p, double tol = 1e-9) const { + return NonlinearFactorGraph::equals(p, tol); + } + + /** + * Add a prior on a pose + * @param key variable key of the camera + * @param p around which soft prior is defined + * @param model uncertainty model of this prior + */ + template + void addCameraPrior(Key cameraKey, const Camera &camera, SharedNoiseModel &model = noiseModel::Unit::Create(Camera::Dim())) { + sharedFactor factor(new PriorFactor(cameraKey, camera, model)); + push_back(factor); + } + + /** + * Add a constraint on a camera + * @param key variable key of the camera + * @param p to which camera to constrain it to + */ + template + void addCameraConstraint(Key cameraKey, const Camera &camera) { + sharedFactor factor(new NonlinearEquality(cameraKey, camera)); + push_back(factor); + } + /** * Add a 2d projection measurement * @param z the measurement @@ -52,7 +114,7 @@ namespace sparseBA { } /** - * Add a 2d projection measurement + * Add a 2d projection measurement, but supports separated (or shared) pose and calibration object * @param z the measurement * @param model the noise model for the measurement * @param poseKey variable key for the pose @@ -65,6 +127,17 @@ namespace sparseBA { boost::shared_ptr factor(new SFMFactor(z, model, posekey, pointkey, calibkey)); push_back(factor); } + + /// Return a 2*K Matrix of reprojection errors + Matrix reprojectionErrors(const Values& values) const; + + /** + * Matlab-specific wrappers + */ + + void addSimpleCameraPrior(Key cameraKey, const SimpleCamera &camera, SharedNoiseModel &model); + void addSimpleCameraConstraint(Key cameraKey, const SimpleCamera &camera) ; + void addSimpleCameraMeasurement(const Point2 &z, SharedNoiseModel& model, Index cameraKey, Index pointKey); }; } diff --git a/matlab/examples/SBAExample.m b/matlab/examples/SBAExample.m new file mode 100644 index 000000000..9050d011d --- /dev/null +++ b/matlab/examples/SBAExample.m @@ -0,0 +1,85 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief An SFM example (adapted from SFMExample.m) optimizing calibration +% @author Yong-Dian Jian +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Assumptions +% - Landmarks as 8 vertices of a cube: (10,10,10) (-10,10,10) etc... +% - Cameras are on a circle around the cube, pointing at the world origin +% - Each camera sees all landmarks. +% - Visual measurements as 2D points are given, corrupted by Gaussian noise. + +% Data Options +options.triangle = false; +options.nrCameras = 10; +options.showImages = false; + +%% Generate data +[data,truth] = VisualISAMGenerateData(options); + +measurementNoiseSigma = 1.0; +pointNoiseSigma = 0.1; +cameraNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1 ... + 0.001*ones(1,5)]'; + +%% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) +graph = sparseBAGraph; + + +%% Add factors for all measurements +measurementNoise = gtsamnoiseModelIsotropic_Sigma(2,measurementNoiseSigma); +for i=1:length(data.Z) + for k=1:length(data.Z{i}) + j = data.J{i}{k}; + graph.addSimpleCameraMeasurement(data.Z{i}{k}, measurementNoise, symbol('c',i), symbol('p',j)); + end +end + +%% Add Gaussian priors for a pose and a landmark to constrain the system +cameraPriorNoise = gtsamnoiseModelDiagonal_Sigmas(cameraNoiseSigmas); +firstCamera = gtsamSimpleCamera(truth.cameras{1}.pose, truth.K); +graph.addSimpleCameraPrior(symbol('c',1), firstCamera, cameraPriorNoise); + +pointPriorNoise = gtsamnoiseModelIsotropic_Sigma(3,pointNoiseSigma); +graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); + +%% Print the graph +graph.print(sprintf('\nFactor graph:\n')); + + +%% Initialize cameras and points close to ground truth in this example +initialEstimate = sparseBAValues; +for i=1:size(truth.cameras,2) + pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); + camera_i = gtsamSimpleCamera(pose_i, truth.K); + initialEstimate.insertSimpleCamera(symbol('c',i), camera_i); +end +for j=1:size(truth.points,2) + point_j = truth.points{j}.retract(0.1*randn(3,1)); + initialEstimate.insertPoint(symbol('p',j), point_j); +end +initialEstimate.print(sprintf('\nInitial estimate:\n ')); + +%% Fine grain optimization, allowing user to iterate step by step + +parameters = gtsamLevenbergMarquardtParams; +parameters.setlambdaInitial(1.0); +parameters.setVerbosityLM('trylambda'); + +optimizer = graph.optimizer(initialEstimate, parameters); + +for i=1:5 + optimizer.iterate(); +end + +result = optimizer.values(); +result.print(sprintf('\nFinal result:\n ')); + + From 59c6234d4f732e70cace4dd2eacff85fb5b01a43 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 6 Jul 2012 18:33:01 +0000 Subject: [PATCH 574/914] Reworked variable removal in iSAM2 to hopefully fix difficult bug --- gtsam/nonlinear/ISAM2-impl.cpp | 6 +- gtsam/nonlinear/ISAM2.cpp | 112 ++++++++++++--------------------- gtsam/nonlinear/ISAM2.h | 2 +- 3 files changed, 42 insertions(+), 78 deletions(-) diff --git a/gtsam/nonlinear/ISAM2-impl.cpp b/gtsam/nonlinear/ISAM2-impl.cpp index 5e71ee22b..f3b27b138 100644 --- a/gtsam/nonlinear/ISAM2-impl.cpp +++ b/gtsam/nonlinear/ISAM2-impl.cpp @@ -96,18 +96,16 @@ void ISAM2::Impl::RemoveVariables(const FastSet& unusedKeys, const ISAM2Cli VectorValues newDeltaNewton(dims); VectorValues newDeltaGradSearch(dims); std::vector newReplacedKeys(replacedKeys.size() - unusedIndices.size()); - Base::Nodes newNodes(nodes.size()); // We still keep unused keys at the end until later in ISAM2::recalculate + Base::Nodes newNodes(replacedKeys.size() - unusedIndices.size()); for(size_t j = 0; j < dims.size(); ++j) { newDelta[j] = delta[unusedToEnd[j]]; newDeltaNewton[j] = deltaNewton[unusedToEnd[j]]; newDeltaGradSearch[j] = deltaGradSearch[unusedToEnd[j]]; newReplacedKeys[j] = replacedKeys[unusedToEnd[j]]; + newNodes[j] = nodes[unusedToEnd[j]]; } - // Permute the nodes index so the unused variables are the end - unusedToEnd.applyToCollection(newNodes, nodes); - // Swap the new data structures with the outputs of this function delta.swap(newDelta); deltaNewton.swap(newDeltaNewton); diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 779880dab..a9bd195ba 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -203,8 +203,8 @@ GaussianFactorGraph ISAM2::getCachedBoundaryFactors(Cliques& orphans) { return cachedBoundary; } -boost::shared_ptr > ISAM2::recalculate( - const FastSet& markedKeys, const FastSet& relinKeys, const FastVector& observedKeys, +boost::shared_ptr > ISAM2::recalculate(const FastSet& markedKeys, + const FastSet& relinKeys, const FastVector& observedKeys, const FastSet& unusedIndices, const boost::optional >& constrainKeys, ISAM2Result& result) { // TODO: new factors are linearized twice, the newFactors passed in are not used. @@ -249,9 +249,6 @@ boost::shared_ptr > ISAM2::recalculate( this->removeTop(markedKeys, affectedBayesNet, orphans); toc(1, "removetop"); - // Now that the top is removed, correct the size of the Nodes index - this->nodes_.resize(delta_.size()); - if(debug) affectedBayesNet.print("Removed top: "); if(debug) orphans.print("Orphans: "); @@ -269,14 +266,6 @@ boost::shared_ptr > ISAM2::recalculate( // ordering provides all keys in conditionals, there cannot be others because path to root included tic(2,"affectedKeys"); FastList affectedKeys = affectedBayesNet.ordering(); - // The removed top also contained removed variables, which will be ordered - // higher than the number of variables in the system since unused variables - // were already removed in ISAM2::update. - for(FastList::iterator key = affectedKeys.begin(); key != affectedKeys.end(); ) - if(*key >= delta_.size()) - affectedKeys.erase(key++); - else - ++key; toc(2,"affectedKeys"); boost::shared_ptr > affectedKeysSet(new FastSet()); // Will return this result @@ -430,8 +419,12 @@ boost::shared_ptr > ISAM2::recalculate( reorderingMode.constrainedKeys = FastMap(); BOOST_FOREACH(Index var, observedKeys) { reorderingMode.constrainedKeys->insert(make_pair(var, 1)); } } + FastSet affectedUsedKeys = *affectedKeysSet; // Remove unused keys from the set we pass to PartialSolve + BOOST_FOREACH(Index unused, unusedIndices) { + affectedUsedKeys.erase(unused); + } Impl::PartialSolveResult partialSolveResult = - Impl::PartialSolve(factors, *affectedKeysSet, reorderingMode, (params_.factorization == ISAM2Params::QR)); + Impl::PartialSolve(factors, affectedUsedKeys, reorderingMode, (params_.factorization == ISAM2Params::QR)); toc(2,"PartialSolve"); // We now need to permute everything according this partial reordering: the @@ -559,50 +552,25 @@ ISAM2Result ISAM2::update( // Remove removed factors from the variable index so we do not attempt to relinearize them variableIndex_.remove(removeFactorIndices, *removeFactors.symbolic(ordering_)); - // We now need to start keeping track of the marked keys involved in added or - // removed factors. - FastSet markedKeys; - - // Remove unused keys and add keys from removed factors that are still used - // in other factors to markedKeys. + // Compute unused keys and indices + FastSet unusedKeys; + FastSet unusedIndices; { - // Get keys from removed factors - FastSet removedFactorSymbKeys = removeFactors.keys(); - - // For each key, if still used in other factors, add to markedKeys to be - // recalculated, or if not used, add to unusedKeys to be removed from the - // system. Note that unusedKeys stores Key while markedKeys stores Index. - FastSet unusedKeys; - BOOST_FOREACH(Key key, removedFactorSymbKeys) { - Index index = ordering_[key]; - if(variableIndex_[index].empty()) - unusedKeys.insert(key); + // Get keys from removed factors and new factors, and compute unused keys, + // i.e., keys that are empty now and do not appear in the new factors. + FastSet removedAndEmpty; + BOOST_FOREACH(Key key, removeFactors.keys()) { + if(variableIndex_[ordering_[key]].empty()) + removedAndEmpty.insert(removedAndEmpty.end(), key); } + FastSet newFactorSymbKeys = newFactors.keys(); + std::set_difference(removedAndEmpty.begin(), removedAndEmpty.end(), + newFactorSymbKeys.begin(), newFactorSymbKeys.end(), std::inserter(unusedKeys, unusedKeys.end())); - // Delete any keys from 'unusedKeys' that are actually used by the new, incoming factors - FastSet newNonlinearKeys = newFactors.keys(); - BOOST_FOREACH(Key key, newNonlinearKeys) { - FastSet::iterator iter = unusedKeys.find(key); - if(iter != unusedKeys.end()) { - unusedKeys.erase(iter); - } + // Get indices for unused keys + BOOST_FOREACH(Key key, unusedKeys) { + unusedIndices.insert(unusedIndices.end(), ordering_[key]); } - - // Remove unused keys. We must hold on to the new nodes index for now - // instead of placing it into the tree because removeTop will need to - // update it. - Impl::RemoveVariables(unusedKeys, root_, theta_, variableIndex_, delta_, deltaNewton_, RgProd_, - deltaReplacedMask_, ordering_, Base::nodes_, linearFactors_); - - // Mark keys that are still in the use and are also included in the removed factors - // Note: The ordering has been modified during the RemoveVariables() function call. - // Hence, we do not create this list until after that call - BOOST_FOREACH(Key key, removedFactorSymbKeys) { - Index index; - if(ordering_.tryAt(key, index)) - markedKeys.insert(index); - } - } toc(1,"push_back factors"); @@ -622,10 +590,12 @@ ISAM2Result ISAM2::update( tic(4,"gather involved keys"); // 3. Mark linear update - { - FastSet newFactorIndices = Impl::IndicesFromFactors(ordering_, newFactors); // Get keys from new factors - markedKeys.insert(newFactorIndices.begin(), newFactorIndices.end()); - } + FastSet markedKeys = Impl::IndicesFromFactors(ordering_, newFactors); // Get keys from new factors + // Also mark keys involved in removed factors + { + FastSet markedRemoveKeys = Impl::IndicesFromFactors(ordering_, removeFactors); // Get keys involved in removed factors + markedKeys.insert(markedRemoveKeys.begin(), markedRemoveKeys.end()); // Add to the overall set of marked keys + } // Observed keys for detailed results if(params_.enableDetailedResults) { @@ -636,7 +606,11 @@ ISAM2Result ISAM2::update( // NOTE: we use assign instead of the iterator constructor here because this // is a vector of size_t, so the constructor unintentionally resolves to // vector(size_t count, Index value) instead of the iterator constructor. - FastVector observedKeys; observedKeys.assign(markedKeys.begin(), markedKeys.end()); // Make a copy of these, as we'll soon add to them + FastVector observedKeys; observedKeys.reserve(markedKeys.size()); + BOOST_FOREACH(Index index, markedKeys) { + if(unusedIndices.find(index) == unusedIndices.end()) // Only add if not unused + observedKeys.push_back(index); // Make a copy of these, as we'll soon add to them + } toc(4,"gather involved keys"); // Check relinearization if we're at the nth step, or we are using a looser loop relin threshold @@ -668,15 +642,6 @@ ISAM2Result ISAM2::update( // add other cliques that have the marked ones in the separator Impl::FindAll(this->root(), markedKeys, markedRelinMask); - // FindAll might have marked some removed keys because the removed keys - // are still in the old BayesTree structure - we remove them from - // markedKeys here. Note that the limit for removing indices that we use - // (delta_.size()) is after all of the new variables - so we do not - // remove indices that were removed but then recreated by adding new - // keys. - FastSet::iterator firstRemovedIndex = markedKeys.lower_bound(delta_.size()); - markedKeys.erase(firstRemovedIndex, markedKeys.end()); - // Relin involved keys for detailed results if(params_.enableDetailedResults) { FastSet involvedRelinKeys; @@ -738,7 +703,7 @@ ISAM2Result ISAM2::update( } boost::shared_ptr > replacedKeys; if(!markedKeys.empty() || !observedKeys.empty()) - replacedKeys = recalculate(markedKeys, relinKeys, observedKeys, constrainedIndices, result); + replacedKeys = recalculate(markedKeys, relinKeys, observedKeys, unusedIndices, constrainedIndices, result); // Update replaced keys mask (accumulates until back-substitution takes place) if(replacedKeys) { @@ -746,10 +711,11 @@ ISAM2Result ISAM2::update( deltaReplacedMask_[var] = true; } } toc(9,"recalculate"); - //tic(9,"solve"); - // 9. Solve - if(debug) delta_.print("delta_: "); - //toc(9,"solve"); + // After the top of the tree has been redone and may have index gaps from + // unused keys, condense the indices to remove gaps by rearranging indices + // in all data structures. + Impl::RemoveVariables(unusedKeys, root_, theta_, variableIndex_, delta_, deltaNewton_, RgProd_, + deltaReplacedMask_, ordering_, Base::nodes_, linearFactors_); result.cliques = this->nodes().size(); deltaDoglegUptodate_ = false; diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 1fa893819..34fc7b46f 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -516,7 +516,7 @@ private: GaussianFactorGraph getCachedBoundaryFactors(Cliques& orphans); boost::shared_ptr > recalculate(const FastSet& markedKeys, const FastSet& relinKeys, - const FastVector& observedKeys, const boost::optional >& constrainKeys, ISAM2Result& result); + const FastVector& observedKeys, const FastSet& unusedIndices, const boost::optional >& constrainKeys, ISAM2Result& result); // void linear_update(const GaussianFactorGraph& newFactors); void updateDelta(bool forceFullSolve = false) const; From 169c0191c635ad9fe7f2b511832cd3c81e146d44 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 6 Jul 2012 18:58:35 +0000 Subject: [PATCH 575/914] Added header needed for uint64_t --- wrap/Class.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index a33f89f35..84e83a9f5 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include From c1ef79722b905dce4a66effc807c85e883e1e7e3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sun, 8 Jul 2012 12:27:16 +0000 Subject: [PATCH 576/914] Created branch /branches/wrap_mods_inheritance from /branches/wrap_mods:12018 From 3c27daae18cabf3b3d5ab016fb3b8c28adfcd11a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sun, 8 Jul 2012 12:27:39 +0000 Subject: [PATCH 577/914] wrap_mods_inheritance branch: in progress with inheritance in matlab wrapper --- gtsam.h | 13 ++++++++++++- wrap/Argument.cpp | 2 +- wrap/Class.cpp | 15 +++++++-------- wrap/Class.h | 1 + wrap/Constructor.cpp | 2 +- wrap/Method.cpp | 6 +++--- wrap/Module.cpp | 8 ++++++-- wrap/matlab.h | 15 ++++++++++----- wrap/utilities.cpp | 11 +++++++++++ wrap/utilities.h | 6 ++++++ 10 files changed, 58 insertions(+), 21 deletions(-) diff --git a/gtsam.h b/gtsam.h index f5d245111..2c2e41e66 100644 --- a/gtsam.h +++ b/gtsam.h @@ -64,7 +64,18 @@ namespace gtsam { // base //************************************************************************* -class LieVector { +class Value { + // Testable + void print(string s) const; + bool equals(const gtsam::Value& expected, double tol) const; + + // Manifold + size_t dim() const; + gtsam::Value retract(Vector v) const; + Vector localCoordinates(const gtsam::Value& t2) const; +}; + +class LieVector : gtsam::Value { // Standard constructors LieVector(); LieVector(Vector v); diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index 40ad205b6..35f20169b 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -64,7 +64,7 @@ void Argument::matlab_unwrap(FileWriter& file, const string& matlabName) const { file.oss << cppType << " " << name << " = unwrap< "; file.oss << cppType << " >(" << matlabName; - if (is_ptr || is_ref) file.oss << ", \"" << matlabType << "\""; + if (is_ptr || is_ref) file.oss << ", \"ptr_" << matlabType << "\""; file.oss << ");" << endl; } diff --git a/wrap/Class.cpp b/wrap/Class.cpp index a33f89f35..2688f625e 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -39,9 +39,11 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil // emit class proxy code // we want our class to inherit the handle class for memory purposes - proxyFile.oss << "classdef " << matlabName << " < handle" << endl; + const string parent = qualifiedParent.empty() ? + "handle" : ::wrap::qualifiedName("", qualifiedParent); + proxyFile.oss << "classdef " << matlabName << " < " << parent << endl; proxyFile.oss << " properties" << endl; - proxyFile.oss << " self = 0" << endl; + proxyFile.oss << " ptr_" << matlabName << " = 0" << endl; proxyFile.oss << " end" << endl; proxyFile.oss << " methods" << endl; @@ -116,10 +118,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil /* ************************************************************************* */ string Class::qualifiedName(const string& delim) const { - string result; - BOOST_FOREACH(const string& ns, namespaces) - result += ns + delim; - return result + name; + return ::wrap::qualifiedName(delim, namespaces, name); } /* ************************************************************************* */ @@ -136,14 +135,14 @@ string Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& w (uint64_t('r')); const string matlabName = qualifiedName(), cppName = qualifiedName("::"); - const string wrapFunctionName = matlabName + "_constructor_" + boost::lexical_cast(id); + const string wrapFunctionName = matlabName + "_collectorInsert_" + boost::lexical_cast(id); // MATLAB constructor that assigns pointer to matlab object then calls c++ // function to add the object to the collector. proxyFile.oss << " if nargin == 2 && isa(varargin{1}, 'uint64') && "; proxyFile.oss << "varargin{1} == uint64(" << ptr_constructor_key << ")\n"; proxyFile.oss << " obj.self = varargin{2};\n"; - proxyFile.oss << " " << wrapperName << "(obj.self);\n"; + proxyFile.oss << " " << wrapperName << "(" << id << ", obj.self);\n"; // C++ function to add pointer from MATLAB to collector. The pointer always // comes from a C++ return value; this mechanism allows the object to be added diff --git a/wrap/Class.h b/wrap/Class.h index f1a745d94..4d31b4972 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -38,6 +38,7 @@ struct Class { // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name + std::vector qualifiedParent; ///< The *single* parent - the last string is the parent class name, preceededing elements are a namespace stack Methods methods; ///< Class methods StaticMethods static_methods; ///< Static methods std::vector namespaces; ///< Stack of namespaces diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 88fbb748b..63ea15146 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -53,7 +53,7 @@ void Constructor::proxy_fragment(FileWriter& file, const std::string& wrapperNam file.oss << "\n obj.self = " << wrapperName << "(" << id; // emit constructor arguments for(size_t i=0;i& using_namespaces, vector& functionNames) const { - proxyFile.oss << " function varargout = " << name << "(self, varargin)\n"; + proxyFile.oss << " function varargout = " << name << "(this, varargin)\n"; for(size_t overload = 0; overload < argLists.size(); ++overload) { const ArgumentList& args = argLists[overload]; @@ -74,7 +74,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF output = ""; else output = "varargout{1} = "; - proxyFile.oss << " " << output << wrapperName << "(" << id << ", self, varargin{:});\n"; + proxyFile.oss << " " << output << wrapperName << "(" << id << ", this, varargin{:});\n"; // Output C++ wrapper code @@ -135,7 +135,7 @@ string Method::wrapper_fragment(FileWriter& file, // get class pointer // example: shared_ptr = unwrap_shared_ptr< Test >(in[0], "Test"); - file.oss << " Shared obj = unwrap_shared_ptr<" << cppClassName << ">(in[0], \"" << cppClassName << "\");" << endl; + file.oss << " Shared obj = unwrap_shared_ptr<" << cppClassName << ">(in[0], \"ptr_" << matlabClassName << "\");" << endl; // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,1); diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 86cc90ef1..5482a19b1 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -93,7 +93,7 @@ Module::Module(const string& interfacePath, Rule eigenType_p = (str_p("Vector") | "Matrix"); - Rule className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p - keywords_p)[assign_a(class_name)]; + Rule className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p - keywords_p); Rule namespace_name_p = lexeme_d[lower_p >> *(alnum_p | '_')] - keywords_p; @@ -114,6 +114,10 @@ Module::Module(const string& interfacePath, className_p[assign_a(arg.type)] >> (ch_p('*')[assign_a(arg.is_ptr,true)] | ch_p('&')[assign_a(arg.is_ref,true)]); + Rule classParent_p = + *(namespace_name_p[push_back_a(cls.qualifiedParent)] >> str_p("::")) >> + className_p[push_back_a(cls.qualifiedParent)]; + Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; Rule argument_p = @@ -198,7 +202,7 @@ Module::Module(const string& interfacePath, (!*include_p >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] >> className_p[assign_a(cls.name)] - >> '{' + >> ((':' >> classParent_p >> '{') | '{') // By having (parent >> '{' | '{') here instead of (!parent >> '{'), we trigger a parse error on a badly-formed parent spec >> *(functions_p | comments_p) >> str_p("};")) [assign_a(constructor.name, cls.name)] diff --git a/wrap/matlab.h b/wrap/matlab.h index 31778cdbd..90f706a37 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -342,9 +342,14 @@ gtsam::Matrix unwrap< gtsam::Matrix >(const mxArray* array) { [create_object] creates a MATLAB proxy class object with a mexhandle in the self property. Matlab does not allow the creation of matlab objects from within mex files, hence we resort to an ugly trick: we - invoke the proxy class constructor by calling MATLAB, and pass 13 - dummy arguments to let the constructor know we want an object without - the self property initialized. We then assign the mexhandle to self. + invoke the proxy class constructor by calling MATLAB with a special + uint64 value ptr_constructor_key and the pointer itself. MATLAB + allocates the object. Then, the special constructor in our wrap code + that is activated when the ptr_constructor_key is passed in passes + the pointer back into a C++ function to add the pointer to its + collector. We go through this extra "C++ to MATLAB to C++ step" in + order to be able to add to the collector could be in a different wrap + module. */ mxArray* create_object(const char *classname, void *pointer) { mxArray *result; @@ -376,9 +381,9 @@ mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *cla } template -boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { +boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& propertyName) { - mxArray* mxh = mxGetProperty(obj,0,"self"); + mxArray* mxh = mxGetProperty(obj,0, propertyName); if (mxGetClassID(mxh) != mxUINT32OR64_CLASS || mxIsComplex(mxh) || mxGetM(mxh) != 1 || mxGetN(mxh) != 1) error( "Parameter is not an Shared type."); diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 31b65bdcc..fdad6de7c 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -135,6 +135,17 @@ void generateIncludes(FileWriter& file, const string& class_name, } /* ************************************************************************* */ +string qualifiedName(const string& separator, const vector& names, const string& finalName) { + string result; + for(size_t i = 0; i < names.size() - 1; ++i) + result += (names[i] + separator); + if(finalName.empty()) + result += names.back(); + else + result += (names.back() + separator + finalName); + return result; +} +/* ************************************************************************* */ } // \namespace wrap diff --git a/wrap/utilities.h b/wrap/utilities.h index 1eb0e249f..6652cc8fd 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -98,4 +98,10 @@ void generateUsingNamespace(FileWriter& file, const std::vector& us void generateIncludes(FileWriter& file, const std::string& class_name, const std::vector& includes); +/** + * Return a qualified name, if finalName is empty, only the names vector will + * be used (i.e. there won't be a trailing separator on the qualified name). + */ +std::string qualifiedName(const std::string& separator, const std::vector& names, const std::string& finalName = ""); + } // \namespace wrap From 9c876ed6b03e25d2ef04bf0fbab5625a17e97cc5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 8 Jul 2012 20:23:47 +0000 Subject: [PATCH 578/914] Wrap tests now pass with new file structure --- wrap/tests/expected/@Point2/Point2.m | 22 - wrap/tests/expected/@Point2/argChar.cpp | 11 - wrap/tests/expected/@Point2/argChar.m | 4 - wrap/tests/expected/@Point2/argUChar.cpp | 11 - wrap/tests/expected/@Point2/argUChar.m | 4 - wrap/tests/expected/@Point2/dim.cpp | 11 - wrap/tests/expected/@Point2/dim.m | 4 - wrap/tests/expected/@Point2/returnChar.cpp | 11 - wrap/tests/expected/@Point2/returnChar.m | 4 - .../expected/@Point2/vectorConfusion.cpp | 13 - wrap/tests/expected/@Point2/vectorConfusion.m | 4 - wrap/tests/expected/@Point2/x.cpp | 11 - wrap/tests/expected/@Point2/x.m | 4 - wrap/tests/expected/@Point2/y.cpp | 11 - wrap/tests/expected/@Point2/y.m | 4 - wrap/tests/expected/@Point3/Point3.m | 21 - wrap/tests/expected/@Point3/norm.cpp | 12 - wrap/tests/expected/@Point3/norm.m | 4 - wrap/tests/expected/@Test/Test.m | 22 - .../expected/@Test/arg_EigenConstRef.cpp | 12 - wrap/tests/expected/@Test/arg_EigenConstRef.m | 4 - .../tests/expected/@Test/create_MixedPtrs.cpp | 17 - wrap/tests/expected/@Test/create_MixedPtrs.m | 4 - wrap/tests/expected/@Test/create_ptrs.cpp | 17 - wrap/tests/expected/@Test/create_ptrs.m | 4 - wrap/tests/expected/@Test/print.cpp | 11 - wrap/tests/expected/@Test/print.m | 4 - .../tests/expected/@Test/return_Point2Ptr.cpp | 15 - wrap/tests/expected/@Test/return_Point2Ptr.m | 4 - wrap/tests/expected/@Test/return_Test.cpp | 15 - wrap/tests/expected/@Test/return_Test.m | 4 - wrap/tests/expected/@Test/return_TestPtr.cpp | 15 - wrap/tests/expected/@Test/return_TestPtr.m | 4 - wrap/tests/expected/@Test/return_bool.cpp | 13 - wrap/tests/expected/@Test/return_bool.m | 4 - wrap/tests/expected/@Test/return_double.cpp | 13 - wrap/tests/expected/@Test/return_double.m | 4 - wrap/tests/expected/@Test/return_field.cpp | 13 - wrap/tests/expected/@Test/return_field.m | 4 - wrap/tests/expected/@Test/return_int.cpp | 13 - wrap/tests/expected/@Test/return_int.m | 4 - wrap/tests/expected/@Test/return_matrix1.cpp | 13 - wrap/tests/expected/@Test/return_matrix1.m | 4 - wrap/tests/expected/@Test/return_matrix2.cpp | 13 - wrap/tests/expected/@Test/return_matrix2.m | 4 - wrap/tests/expected/@Test/return_pair.cpp | 15 - wrap/tests/expected/@Test/return_pair.m | 4 - wrap/tests/expected/@Test/return_ptrs.cpp | 19 - wrap/tests/expected/@Test/return_ptrs.m | 4 - wrap/tests/expected/@Test/return_size_t.cpp | 13 - wrap/tests/expected/@Test/return_size_t.m | 4 - wrap/tests/expected/@Test/return_string.cpp | 13 - wrap/tests/expected/@Test/return_string.m | 4 - wrap/tests/expected/@Test/return_vector1.cpp | 13 - wrap/tests/expected/@Test/return_vector1.m | 4 - wrap/tests/expected/@Test/return_vector2.cpp | 13 - wrap/tests/expected/@Test/return_vector2.m | 4 - wrap/tests/expected/Makefile | 94 --- wrap/tests/expected/Point2.m | 88 +++ wrap/tests/expected/Point3.m | 54 ++ .../expected/Point3_StaticFunctionRet.cpp | 14 - .../tests/expected/Point3_StaticFunctionRet.m | 5 - wrap/tests/expected/Point3_staticFunction.cpp | 12 - wrap/tests/expected/Point3_staticFunction.m | 5 - wrap/tests/expected/Test.m | 184 ++++++ wrap/tests/expected/geometry_wrapper.cpp | 621 ++++++++++++++++++ wrap/tests/expected/make_geometry.m | 59 -- wrap/tests/expected/new_Point2.cpp | 41 -- wrap/tests/expected/new_Point2.m | 4 - wrap/tests/expected/new_Point3.cpp | 41 -- wrap/tests/expected/new_Point3.m | 4 - wrap/tests/expected/new_Test.cpp | 42 -- wrap/tests/expected/new_Test.m | 4 - .../expected_namespaces/@ClassD/ClassD.m | 21 - .../@ns1ClassA/ns1ClassA.m | 21 - .../@ns1ClassB/ns1ClassB.m | 21 - .../@ns2ClassA/memberFunction.cpp | 12 - .../@ns2ClassA/memberFunction.m | 4 - .../@ns2ClassA/ns2ClassA.m | 21 - .../expected_namespaces/@ns2ClassA/nsArg.cpp | 13 - .../expected_namespaces/@ns2ClassA/nsArg.m | 4 - .../@ns2ClassA/nsReturn.cpp | 15 - .../expected_namespaces/@ns2ClassA/nsReturn.m | 4 - .../@ns2ClassC/ns2ClassC.m | 21 - .../@ns2ns3ClassB/ns2ns3ClassB.m | 21 - wrap/tests/expected_namespaces/ClassD.m | 30 + wrap/tests/expected_namespaces/Makefile | 65 -- .../expected_namespaces/make_testNamespaces.m | 52 -- wrap/tests/expected_namespaces/new_ClassD.cpp | 36 - wrap/tests/expected_namespaces/new_ClassD.m | 4 - .../expected_namespaces/new_ns1ClassA.cpp | 36 - .../tests/expected_namespaces/new_ns1ClassA.m | 4 - .../expected_namespaces/new_ns1ClassB.cpp | 37 -- .../tests/expected_namespaces/new_ns1ClassB.m | 4 - .../expected_namespaces/new_ns2ClassA.cpp | 37 -- .../tests/expected_namespaces/new_ns2ClassA.m | 4 - .../expected_namespaces/new_ns2ClassC.cpp | 36 - .../tests/expected_namespaces/new_ns2ClassC.m | 4 - .../expected_namespaces/new_ns2ns3ClassB.cpp | 37 -- .../expected_namespaces/new_ns2ns3ClassB.m | 4 - wrap/tests/expected_namespaces/ns1ClassA.m | 30 + wrap/tests/expected_namespaces/ns1ClassB.m | 30 + wrap/tests/expected_namespaces/ns2ClassA.m | 62 ++ .../ns2ClassA_afunction.cpp | 12 - .../expected_namespaces/ns2ClassA_afunction.m | 5 - wrap/tests/expected_namespaces/ns2ClassC.m | 30 + wrap/tests/expected_namespaces/ns2ns3ClassB.m | 30 + .../testNamespaces_wrapper.cpp | 369 +++++++++++ wrap/tests/testWrap.cpp | 148 +---- 109 files changed, 1561 insertions(+), 1525 deletions(-) delete mode 100644 wrap/tests/expected/@Point2/Point2.m delete mode 100644 wrap/tests/expected/@Point2/argChar.cpp delete mode 100644 wrap/tests/expected/@Point2/argChar.m delete mode 100644 wrap/tests/expected/@Point2/argUChar.cpp delete mode 100644 wrap/tests/expected/@Point2/argUChar.m delete mode 100644 wrap/tests/expected/@Point2/dim.cpp delete mode 100644 wrap/tests/expected/@Point2/dim.m delete mode 100644 wrap/tests/expected/@Point2/returnChar.cpp delete mode 100644 wrap/tests/expected/@Point2/returnChar.m delete mode 100644 wrap/tests/expected/@Point2/vectorConfusion.cpp delete mode 100644 wrap/tests/expected/@Point2/vectorConfusion.m delete mode 100644 wrap/tests/expected/@Point2/x.cpp delete mode 100644 wrap/tests/expected/@Point2/x.m delete mode 100644 wrap/tests/expected/@Point2/y.cpp delete mode 100644 wrap/tests/expected/@Point2/y.m delete mode 100644 wrap/tests/expected/@Point3/Point3.m delete mode 100644 wrap/tests/expected/@Point3/norm.cpp delete mode 100644 wrap/tests/expected/@Point3/norm.m delete mode 100644 wrap/tests/expected/@Test/Test.m delete mode 100644 wrap/tests/expected/@Test/arg_EigenConstRef.cpp delete mode 100644 wrap/tests/expected/@Test/arg_EigenConstRef.m delete mode 100644 wrap/tests/expected/@Test/create_MixedPtrs.cpp delete mode 100644 wrap/tests/expected/@Test/create_MixedPtrs.m delete mode 100644 wrap/tests/expected/@Test/create_ptrs.cpp delete mode 100644 wrap/tests/expected/@Test/create_ptrs.m delete mode 100644 wrap/tests/expected/@Test/print.cpp delete mode 100644 wrap/tests/expected/@Test/print.m delete mode 100644 wrap/tests/expected/@Test/return_Point2Ptr.cpp delete mode 100644 wrap/tests/expected/@Test/return_Point2Ptr.m delete mode 100644 wrap/tests/expected/@Test/return_Test.cpp delete mode 100644 wrap/tests/expected/@Test/return_Test.m delete mode 100644 wrap/tests/expected/@Test/return_TestPtr.cpp delete mode 100644 wrap/tests/expected/@Test/return_TestPtr.m delete mode 100644 wrap/tests/expected/@Test/return_bool.cpp delete mode 100644 wrap/tests/expected/@Test/return_bool.m delete mode 100644 wrap/tests/expected/@Test/return_double.cpp delete mode 100644 wrap/tests/expected/@Test/return_double.m delete mode 100644 wrap/tests/expected/@Test/return_field.cpp delete mode 100644 wrap/tests/expected/@Test/return_field.m delete mode 100644 wrap/tests/expected/@Test/return_int.cpp delete mode 100644 wrap/tests/expected/@Test/return_int.m delete mode 100644 wrap/tests/expected/@Test/return_matrix1.cpp delete mode 100644 wrap/tests/expected/@Test/return_matrix1.m delete mode 100644 wrap/tests/expected/@Test/return_matrix2.cpp delete mode 100644 wrap/tests/expected/@Test/return_matrix2.m delete mode 100644 wrap/tests/expected/@Test/return_pair.cpp delete mode 100644 wrap/tests/expected/@Test/return_pair.m delete mode 100644 wrap/tests/expected/@Test/return_ptrs.cpp delete mode 100644 wrap/tests/expected/@Test/return_ptrs.m delete mode 100644 wrap/tests/expected/@Test/return_size_t.cpp delete mode 100644 wrap/tests/expected/@Test/return_size_t.m delete mode 100644 wrap/tests/expected/@Test/return_string.cpp delete mode 100644 wrap/tests/expected/@Test/return_string.m delete mode 100644 wrap/tests/expected/@Test/return_vector1.cpp delete mode 100644 wrap/tests/expected/@Test/return_vector1.m delete mode 100644 wrap/tests/expected/@Test/return_vector2.cpp delete mode 100644 wrap/tests/expected/@Test/return_vector2.m delete mode 100644 wrap/tests/expected/Makefile create mode 100644 wrap/tests/expected/Point2.m create mode 100644 wrap/tests/expected/Point3.m delete mode 100644 wrap/tests/expected/Point3_StaticFunctionRet.cpp delete mode 100644 wrap/tests/expected/Point3_StaticFunctionRet.m delete mode 100644 wrap/tests/expected/Point3_staticFunction.cpp delete mode 100644 wrap/tests/expected/Point3_staticFunction.m create mode 100644 wrap/tests/expected/Test.m create mode 100644 wrap/tests/expected/geometry_wrapper.cpp delete mode 100644 wrap/tests/expected/make_geometry.m delete mode 100644 wrap/tests/expected/new_Point2.cpp delete mode 100644 wrap/tests/expected/new_Point2.m delete mode 100644 wrap/tests/expected/new_Point3.cpp delete mode 100644 wrap/tests/expected/new_Point3.m delete mode 100644 wrap/tests/expected/new_Test.cpp delete mode 100644 wrap/tests/expected/new_Test.m delete mode 100644 wrap/tests/expected_namespaces/@ClassD/ClassD.m delete mode 100644 wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m delete mode 100644 wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m delete mode 100644 wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m delete mode 100644 wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m create mode 100644 wrap/tests/expected_namespaces/ClassD.m delete mode 100644 wrap/tests/expected_namespaces/Makefile delete mode 100644 wrap/tests/expected_namespaces/make_testNamespaces.m delete mode 100644 wrap/tests/expected_namespaces/new_ClassD.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ClassD.m delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassA.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassA.m delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassB.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns1ClassB.m delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassA.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassA.m delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassC.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns2ClassC.m delete mode 100644 wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp delete mode 100644 wrap/tests/expected_namespaces/new_ns2ns3ClassB.m create mode 100644 wrap/tests/expected_namespaces/ns1ClassA.m create mode 100644 wrap/tests/expected_namespaces/ns1ClassB.m create mode 100644 wrap/tests/expected_namespaces/ns2ClassA.m delete mode 100644 wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp delete mode 100644 wrap/tests/expected_namespaces/ns2ClassA_afunction.m create mode 100644 wrap/tests/expected_namespaces/ns2ClassC.m create mode 100644 wrap/tests/expected_namespaces/ns2ns3ClassB.m create mode 100644 wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp diff --git a/wrap/tests/expected/@Point2/Point2.m b/wrap/tests/expected/@Point2/Point2.m deleted file mode 100644 index 5cfd7fc61..000000000 --- a/wrap/tests/expected/@Point2/Point2.m +++ /dev/null @@ -1,22 +0,0 @@ -% automatically generated by wrap -classdef Point2 < handle - properties - self = 0 - end - methods - function obj = Point2(varargin) - if (nargin == 0), obj.self = new_Point2(0,0); end - if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Point2(0,1,varargin{1},varargin{2}); end - if nargin ==14, new_Point2(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point2 constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_Point2(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected/@Point2/argChar.cpp b/wrap/tests/expected/@Point2/argChar.cpp deleted file mode 100644 index d0e9a7a7a..000000000 --- a/wrap/tests/expected/@Point2/argChar.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("argChar",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - char a = unwrap< char >(in[1]); - obj->argChar(a); -} diff --git a/wrap/tests/expected/@Point2/argChar.m b/wrap/tests/expected/@Point2/argChar.m deleted file mode 100644 index 6c935a1d6..000000000 --- a/wrap/tests/expected/@Point2/argChar.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.argChar(a) -function result = argChar(obj,a) - error('need to compile argChar.cpp'); -end diff --git a/wrap/tests/expected/@Point2/argUChar.cpp b/wrap/tests/expected/@Point2/argUChar.cpp deleted file mode 100644 index 06e62c36b..000000000 --- a/wrap/tests/expected/@Point2/argUChar.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("argUChar",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - unsigned char a = unwrap< unsigned char >(in[1]); - obj->argUChar(a); -} diff --git a/wrap/tests/expected/@Point2/argUChar.m b/wrap/tests/expected/@Point2/argUChar.m deleted file mode 100644 index ea42a2b4f..000000000 --- a/wrap/tests/expected/@Point2/argUChar.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.argUChar(a) -function result = argUChar(obj,a) - error('need to compile argUChar.cpp'); -end diff --git a/wrap/tests/expected/@Point2/dim.cpp b/wrap/tests/expected/@Point2/dim.cpp deleted file mode 100644 index a7e938a16..000000000 --- a/wrap/tests/expected/@Point2/dim.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("dim",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - int result = obj->dim(); - out[0] = wrap< int >(result); -} diff --git a/wrap/tests/expected/@Point2/dim.m b/wrap/tests/expected/@Point2/dim.m deleted file mode 100644 index 934e0b895..000000000 --- a/wrap/tests/expected/@Point2/dim.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.dim() -function result = dim(obj) - error('need to compile dim.cpp'); -end diff --git a/wrap/tests/expected/@Point2/returnChar.cpp b/wrap/tests/expected/@Point2/returnChar.cpp deleted file mode 100644 index ed6f34190..000000000 --- a/wrap/tests/expected/@Point2/returnChar.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("returnChar",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - char result = obj->returnChar(); - out[0] = wrap< char >(result); -} diff --git a/wrap/tests/expected/@Point2/returnChar.m b/wrap/tests/expected/@Point2/returnChar.m deleted file mode 100644 index 8c3ceee35..000000000 --- a/wrap/tests/expected/@Point2/returnChar.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.returnChar() -function result = returnChar(obj) - error('need to compile returnChar.cpp'); -end diff --git a/wrap/tests/expected/@Point2/vectorConfusion.cpp b/wrap/tests/expected/@Point2/vectorConfusion.cpp deleted file mode 100644 index 3e2982803..000000000 --- a/wrap/tests/expected/@Point2/vectorConfusion.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr SharedVectorNotEigen; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("vectorConfusion",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - VectorNotEigen result = obj->vectorConfusion(); - SharedVectorNotEigen* ret = new SharedVectorNotEigen(new VectorNotEigen(result)); - out[0] = wrap_collect_shared_ptr(ret,"VectorNotEigen"); -} diff --git a/wrap/tests/expected/@Point2/vectorConfusion.m b/wrap/tests/expected/@Point2/vectorConfusion.m deleted file mode 100644 index 9966c930d..000000000 --- a/wrap/tests/expected/@Point2/vectorConfusion.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.vectorConfusion() -function result = vectorConfusion(obj) - error('need to compile vectorConfusion.cpp'); -end diff --git a/wrap/tests/expected/@Point2/x.cpp b/wrap/tests/expected/@Point2/x.cpp deleted file mode 100644 index 273eb7834..000000000 --- a/wrap/tests/expected/@Point2/x.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("x",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - double result = obj->x(); - out[0] = wrap< double >(result); -} diff --git a/wrap/tests/expected/@Point2/x.m b/wrap/tests/expected/@Point2/x.m deleted file mode 100644 index 44f069872..000000000 --- a/wrap/tests/expected/@Point2/x.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.x() -function result = x(obj) - error('need to compile x.cpp'); -end diff --git a/wrap/tests/expected/@Point2/y.cpp b/wrap/tests/expected/@Point2/y.cpp deleted file mode 100644 index 44f824fb0..000000000 --- a/wrap/tests/expected/@Point2/y.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("y",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - double result = obj->y(); - out[0] = wrap< double >(result); -} diff --git a/wrap/tests/expected/@Point2/y.m b/wrap/tests/expected/@Point2/y.m deleted file mode 100644 index 7971c1e33..000000000 --- a/wrap/tests/expected/@Point2/y.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.y() -function result = y(obj) - error('need to compile y.cpp'); -end diff --git a/wrap/tests/expected/@Point3/Point3.m b/wrap/tests/expected/@Point3/Point3.m deleted file mode 100644 index 81bd00a5a..000000000 --- a/wrap/tests/expected/@Point3/Point3.m +++ /dev/null @@ -1,21 +0,0 @@ -% automatically generated by wrap -classdef Point3 < handle - properties - self = 0 - end - methods - function obj = Point3(varargin) - if (nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double')), obj.self = new_Point3(0,0,varargin{1},varargin{2},varargin{3}); end - if nargin ==14, new_Point3(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Point3 constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_Point3(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected/@Point3/norm.cpp b/wrap/tests/expected/@Point3/norm.cpp deleted file mode 100644 index dd5c726ee..000000000 --- a/wrap/tests/expected/@Point3/norm.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("norm",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point3"); - double result = obj->norm(); - out[0] = wrap< double >(result); -} diff --git a/wrap/tests/expected/@Point3/norm.m b/wrap/tests/expected/@Point3/norm.m deleted file mode 100644 index ad925e85d..000000000 --- a/wrap/tests/expected/@Point3/norm.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.norm() -function result = norm(obj) - error('need to compile norm.cpp'); -end diff --git a/wrap/tests/expected/@Test/Test.m b/wrap/tests/expected/@Test/Test.m deleted file mode 100644 index 63914d2aa..000000000 --- a/wrap/tests/expected/@Test/Test.m +++ /dev/null @@ -1,22 +0,0 @@ -% automatically generated by wrap -classdef Test < handle - properties - self = 0 - end - methods - function obj = Test(varargin) - if (nargin == 0), obj.self = new_Test(0,0); end - if (nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double')), obj.self = new_Test(0,1,varargin{1},varargin{2}); end - if nargin ==14, new_Test(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('Test constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_Test(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp b/wrap/tests/expected/@Test/arg_EigenConstRef.cpp deleted file mode 100644 index a6a384870..000000000 --- a/wrap/tests/expected/@Test/arg_EigenConstRef.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("arg_EigenConstRef",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); - obj->arg_EigenConstRef(value); -} diff --git a/wrap/tests/expected/@Test/arg_EigenConstRef.m b/wrap/tests/expected/@Test/arg_EigenConstRef.m deleted file mode 100644 index c348014c1..000000000 --- a/wrap/tests/expected/@Test/arg_EigenConstRef.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.arg_EigenConstRef(value) -function result = arg_EigenConstRef(obj,value) - error('need to compile arg_EigenConstRef.cpp'); -end diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.cpp b/wrap/tests/expected/@Test/create_MixedPtrs.cpp deleted file mode 100644 index 21010eb0c..000000000 --- a/wrap/tests/expected/@Test/create_MixedPtrs.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("create_MixedPtrs",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - pair< Test, SharedTest > result = obj->create_MixedPtrs(); - SharedTest* ret = new SharedTest(new Test(result.first)); - out[0] = wrap_collect_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(result.second); - out[1] = wrap_collect_shared_ptr(ret,"Test"); -} diff --git a/wrap/tests/expected/@Test/create_MixedPtrs.m b/wrap/tests/expected/@Test/create_MixedPtrs.m deleted file mode 100644 index 38a9f1d7e..000000000 --- a/wrap/tests/expected/@Test/create_MixedPtrs.m +++ /dev/null @@ -1,4 +0,0 @@ -% [first,second] = obj.create_MixedPtrs() -function [first,second] = create_MixedPtrs(obj) - error('need to compile create_MixedPtrs.cpp'); -end diff --git a/wrap/tests/expected/@Test/create_ptrs.cpp b/wrap/tests/expected/@Test/create_ptrs.cpp deleted file mode 100644 index b51c3f00e..000000000 --- a/wrap/tests/expected/@Test/create_ptrs.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("create_ptrs",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - pair< SharedTest, SharedTest > result = obj->create_ptrs(); - SharedTest* ret = new SharedTest(result.first); - out[0] = wrap_collect_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(result.second); - out[1] = wrap_collect_shared_ptr(ret,"Test"); -} diff --git a/wrap/tests/expected/@Test/create_ptrs.m b/wrap/tests/expected/@Test/create_ptrs.m deleted file mode 100644 index 80c6781dc..000000000 --- a/wrap/tests/expected/@Test/create_ptrs.m +++ /dev/null @@ -1,4 +0,0 @@ -% [first,second] = obj.create_ptrs() -function [first,second] = create_ptrs(obj) - error('need to compile create_ptrs.cpp'); -end diff --git a/wrap/tests/expected/@Test/print.cpp b/wrap/tests/expected/@Test/print.cpp deleted file mode 100644 index 3cf9cd14d..000000000 --- a/wrap/tests/expected/@Test/print.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("print",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - obj->print(); -} diff --git a/wrap/tests/expected/@Test/print.m b/wrap/tests/expected/@Test/print.m deleted file mode 100644 index ca6bf4769..000000000 --- a/wrap/tests/expected/@Test/print.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.print() -function result = print(obj) - error('need to compile print.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_Point2Ptr.cpp b/wrap/tests/expected/@Test/return_Point2Ptr.cpp deleted file mode 100644 index 0d8650e84..000000000 --- a/wrap/tests/expected/@Test/return_Point2Ptr.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr SharedPoint2; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_Point2Ptr",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - bool value = unwrap< bool >(in[1]); - SharedPoint2 result = obj->return_Point2Ptr(value); - SharedPoint2* ret = new SharedPoint2(result); - out[0] = wrap_collect_shared_ptr(ret,"Point2"); -} diff --git a/wrap/tests/expected/@Test/return_Point2Ptr.m b/wrap/tests/expected/@Test/return_Point2Ptr.m deleted file mode 100644 index 84e586bc7..000000000 --- a/wrap/tests/expected/@Test/return_Point2Ptr.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_Point2Ptr(value) -function result = return_Point2Ptr(obj,value) - error('need to compile return_Point2Ptr.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_Test.cpp b/wrap/tests/expected/@Test/return_Test.cpp deleted file mode 100644 index fb3ad822c..000000000 --- a/wrap/tests/expected/@Test/return_Test.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_Test",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - Test result = obj->return_Test(value); - SharedTest* ret = new SharedTest(new Test(result)); - out[0] = wrap_collect_shared_ptr(ret,"Test"); -} diff --git a/wrap/tests/expected/@Test/return_Test.m b/wrap/tests/expected/@Test/return_Test.m deleted file mode 100644 index d1a2e440c..000000000 --- a/wrap/tests/expected/@Test/return_Test.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_Test(value) -function result = return_Test(obj,value) - error('need to compile return_Test.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_TestPtr.cpp b/wrap/tests/expected/@Test/return_TestPtr.cpp deleted file mode 100644 index 06bc80269..000000000 --- a/wrap/tests/expected/@Test/return_TestPtr.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_TestPtr",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - SharedTest result = obj->return_TestPtr(value); - SharedTest* ret = new SharedTest(result); - out[0] = wrap_collect_shared_ptr(ret,"Test"); -} diff --git a/wrap/tests/expected/@Test/return_TestPtr.m b/wrap/tests/expected/@Test/return_TestPtr.m deleted file mode 100644 index 937c85fcc..000000000 --- a/wrap/tests/expected/@Test/return_TestPtr.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_TestPtr(value) -function result = return_TestPtr(obj,value) - error('need to compile return_TestPtr.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_bool.cpp b/wrap/tests/expected/@Test/return_bool.cpp deleted file mode 100644 index e570d8dc2..000000000 --- a/wrap/tests/expected/@Test/return_bool.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_bool",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - bool value = unwrap< bool >(in[1]); - bool result = obj->return_bool(value); - out[0] = wrap< bool >(result); -} diff --git a/wrap/tests/expected/@Test/return_bool.m b/wrap/tests/expected/@Test/return_bool.m deleted file mode 100644 index 358cb9750..000000000 --- a/wrap/tests/expected/@Test/return_bool.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_bool(value) -function result = return_bool(obj,value) - error('need to compile return_bool.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_double.cpp b/wrap/tests/expected/@Test/return_double.cpp deleted file mode 100644 index 4a6322a72..000000000 --- a/wrap/tests/expected/@Test/return_double.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_double",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - double value = unwrap< double >(in[1]); - double result = obj->return_double(value); - out[0] = wrap< double >(result); -} diff --git a/wrap/tests/expected/@Test/return_double.m b/wrap/tests/expected/@Test/return_double.m deleted file mode 100644 index 681371f39..000000000 --- a/wrap/tests/expected/@Test/return_double.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_double(value) -function result = return_double(obj,value) - error('need to compile return_double.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_field.cpp b/wrap/tests/expected/@Test/return_field.cpp deleted file mode 100644 index a631635e3..000000000 --- a/wrap/tests/expected/@Test/return_field.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_field",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); - bool result = obj->return_field(t); - out[0] = wrap< bool >(result); -} diff --git a/wrap/tests/expected/@Test/return_field.m b/wrap/tests/expected/@Test/return_field.m deleted file mode 100644 index e2894c381..000000000 --- a/wrap/tests/expected/@Test/return_field.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_field(t) -function result = return_field(obj,t) - error('need to compile return_field.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_int.cpp b/wrap/tests/expected/@Test/return_int.cpp deleted file mode 100644 index f909405eb..000000000 --- a/wrap/tests/expected/@Test/return_int.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_int",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - int value = unwrap< int >(in[1]); - int result = obj->return_int(value); - out[0] = wrap< int >(result); -} diff --git a/wrap/tests/expected/@Test/return_int.m b/wrap/tests/expected/@Test/return_int.m deleted file mode 100644 index 779e9feb2..000000000 --- a/wrap/tests/expected/@Test/return_int.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_int(value) -function result = return_int(obj,value) - error('need to compile return_int.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_matrix1.cpp b/wrap/tests/expected/@Test/return_matrix1.cpp deleted file mode 100644 index 1cc75d3d4..000000000 --- a/wrap/tests/expected/@Test/return_matrix1.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_matrix1",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Matrix value = unwrap< Matrix >(in[1]); - Matrix result = obj->return_matrix1(value); - out[0] = wrap< Matrix >(result); -} diff --git a/wrap/tests/expected/@Test/return_matrix1.m b/wrap/tests/expected/@Test/return_matrix1.m deleted file mode 100644 index d6d9791f9..000000000 --- a/wrap/tests/expected/@Test/return_matrix1.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_matrix1(value) -function result = return_matrix1(obj,value) - error('need to compile return_matrix1.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_matrix2.cpp b/wrap/tests/expected/@Test/return_matrix2.cpp deleted file mode 100644 index 10c9e8647..000000000 --- a/wrap/tests/expected/@Test/return_matrix2.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_matrix2",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Matrix value = unwrap< Matrix >(in[1]); - Matrix result = obj->return_matrix2(value); - out[0] = wrap< Matrix >(result); -} diff --git a/wrap/tests/expected/@Test/return_matrix2.m b/wrap/tests/expected/@Test/return_matrix2.m deleted file mode 100644 index 584b365b8..000000000 --- a/wrap/tests/expected/@Test/return_matrix2.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_matrix2(value) -function result = return_matrix2(obj,value) - error('need to compile return_matrix2.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_pair.cpp b/wrap/tests/expected/@Test/return_pair.cpp deleted file mode 100644 index 0fc359df6..000000000 --- a/wrap/tests/expected/@Test/return_pair.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_pair",nargout,nargin-1,2); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Vector v = unwrap< Vector >(in[1]); - Matrix A = unwrap< Matrix >(in[2]); - pair< Vector, Matrix > result = obj->return_pair(v,A); - out[0] = wrap< Vector >(result.first); - out[1] = wrap< Matrix >(result.second); -} diff --git a/wrap/tests/expected/@Test/return_pair.m b/wrap/tests/expected/@Test/return_pair.m deleted file mode 100644 index 2e892210c..000000000 --- a/wrap/tests/expected/@Test/return_pair.m +++ /dev/null @@ -1,4 +0,0 @@ -% [first,second] = obj.return_pair(v,A) -function [first,second] = return_pair(obj,v,A) - error('need to compile return_pair.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_ptrs.cpp b/wrap/tests/expected/@Test/return_ptrs.cpp deleted file mode 100644 index c6c6f9655..000000000 --- a/wrap/tests/expected/@Test/return_ptrs.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr SharedTest; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_ptrs",nargout,nargin-1,2); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); - boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); - pair< SharedTest, SharedTest > result = obj->return_ptrs(p1,p2); - SharedTest* ret = new SharedTest(result.first); - out[0] = wrap_collect_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(result.second); - out[1] = wrap_collect_shared_ptr(ret,"Test"); -} diff --git a/wrap/tests/expected/@Test/return_ptrs.m b/wrap/tests/expected/@Test/return_ptrs.m deleted file mode 100644 index a7af4b73c..000000000 --- a/wrap/tests/expected/@Test/return_ptrs.m +++ /dev/null @@ -1,4 +0,0 @@ -% [first,second] = obj.return_ptrs(p1,p2) -function [first,second] = return_ptrs(obj,p1,p2) - error('need to compile return_ptrs.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_size_t.cpp b/wrap/tests/expected/@Test/return_size_t.cpp deleted file mode 100644 index 9a6fc8598..000000000 --- a/wrap/tests/expected/@Test/return_size_t.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_size_t",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - size_t value = unwrap< size_t >(in[1]); - size_t result = obj->return_size_t(value); - out[0] = wrap< size_t >(result); -} diff --git a/wrap/tests/expected/@Test/return_size_t.m b/wrap/tests/expected/@Test/return_size_t.m deleted file mode 100644 index 2fae64028..000000000 --- a/wrap/tests/expected/@Test/return_size_t.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_size_t(value) -function result = return_size_t(obj,value) - error('need to compile return_size_t.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_string.cpp b/wrap/tests/expected/@Test/return_string.cpp deleted file mode 100644 index 3253e62ed..000000000 --- a/wrap/tests/expected/@Test/return_string.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_string",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - string value = unwrap< string >(in[1]); - string result = obj->return_string(value); - out[0] = wrap< string >(result); -} diff --git a/wrap/tests/expected/@Test/return_string.m b/wrap/tests/expected/@Test/return_string.m deleted file mode 100644 index 67fb5f10d..000000000 --- a/wrap/tests/expected/@Test/return_string.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_string(value) -function result = return_string(obj,value) - error('need to compile return_string.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_vector1.cpp b/wrap/tests/expected/@Test/return_vector1.cpp deleted file mode 100644 index 48ecbb643..000000000 --- a/wrap/tests/expected/@Test/return_vector1.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_vector1",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Vector value = unwrap< Vector >(in[1]); - Vector result = obj->return_vector1(value); - out[0] = wrap< Vector >(result); -} diff --git a/wrap/tests/expected/@Test/return_vector1.m b/wrap/tests/expected/@Test/return_vector1.m deleted file mode 100644 index 461c51618..000000000 --- a/wrap/tests/expected/@Test/return_vector1.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_vector1(value) -function result = return_vector1(obj,value) - error('need to compile return_vector1.cpp'); -end diff --git a/wrap/tests/expected/@Test/return_vector2.cpp b/wrap/tests/expected/@Test/return_vector2.cpp deleted file mode 100644 index 984ba259c..000000000 --- a/wrap/tests/expected/@Test/return_vector2.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_vector2",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Vector value = unwrap< Vector >(in[1]); - Vector result = obj->return_vector2(value); - out[0] = wrap< Vector >(result); -} diff --git a/wrap/tests/expected/@Test/return_vector2.m b/wrap/tests/expected/@Test/return_vector2.m deleted file mode 100644 index f3c77dd85..000000000 --- a/wrap/tests/expected/@Test/return_vector2.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.return_vector2(value) -function result = return_vector2(obj,value) - error('need to compile return_vector2.cpp'); -end diff --git a/wrap/tests/expected/Makefile b/wrap/tests/expected/Makefile deleted file mode 100644 index 92dece353..000000000 --- a/wrap/tests/expected/Makefile +++ /dev/null @@ -1,94 +0,0 @@ -# automatically generated by wrap - -MEX = mex -MEXENDING = mexa64 -PATH_TO_WRAP = /not_really_a_real_path/borg/gtsam/wrap -mex_flags = -O5 - -all: Point2 Point3 Test - -# Point2 -new_Point2.$(MEXENDING): new_Point2.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_Point2.cpp -output new_Point2 -@Point2/x.$(MEXENDING): @Point2/x.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point2/x.cpp -output @Point2/x -@Point2/y.$(MEXENDING): @Point2/y.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point2/y.cpp -output @Point2/y -@Point2/dim.$(MEXENDING): @Point2/dim.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point2/dim.cpp -output @Point2/dim -@Point2/returnChar.$(MEXENDING): @Point2/returnChar.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point2/returnChar.cpp -output @Point2/returnChar -@Point2/argChar.$(MEXENDING): @Point2/argChar.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point2/argChar.cpp -output @Point2/argChar -@Point2/argUChar.$(MEXENDING): @Point2/argUChar.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point2/argUChar.cpp -output @Point2/argUChar -@Point2/vectorConfusion.$(MEXENDING): @Point2/vectorConfusion.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point2/vectorConfusion.cpp -output @Point2/vectorConfusion - -Point2: new_Point2.$(MEXENDING) @Point2/x.$(MEXENDING) @Point2/y.$(MEXENDING) @Point2/dim.$(MEXENDING) @Point2/returnChar.$(MEXENDING) @Point2/argChar.$(MEXENDING) @Point2/argUChar.$(MEXENDING) @Point2/vectorConfusion.$(MEXENDING) - -# Point3 -new_Point3.$(MEXENDING): new_Point3.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_Point3.cpp -output new_Point3 -Point3_staticFunction.$(MEXENDING): Point3_staticFunction.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) Point3_staticFunction.cpp -output Point3_staticFunction -Point3_StaticFunctionRet.$(MEXENDING): Point3_StaticFunctionRet.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) Point3_StaticFunctionRet.cpp -output Point3_StaticFunctionRet -@Point3/norm.$(MEXENDING): @Point3/norm.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Point3/norm.cpp -output @Point3/norm - -Point3: new_Point3.$(MEXENDING) Point3_staticFunction.$(MEXENDING) Point3_StaticFunctionRet.$(MEXENDING) @Point3/norm.$(MEXENDING) - -# Test -new_Test.$(MEXENDING): new_Test.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_Test.cpp -output new_Test -@Test/return_pair.$(MEXENDING): @Test/return_pair.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_pair.cpp -output @Test/return_pair -@Test/return_bool.$(MEXENDING): @Test/return_bool.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_bool.cpp -output @Test/return_bool -@Test/return_size_t.$(MEXENDING): @Test/return_size_t.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_size_t.cpp -output @Test/return_size_t -@Test/return_int.$(MEXENDING): @Test/return_int.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_int.cpp -output @Test/return_int -@Test/return_double.$(MEXENDING): @Test/return_double.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_double.cpp -output @Test/return_double -@Test/return_string.$(MEXENDING): @Test/return_string.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_string.cpp -output @Test/return_string -@Test/return_vector1.$(MEXENDING): @Test/return_vector1.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_vector1.cpp -output @Test/return_vector1 -@Test/return_matrix1.$(MEXENDING): @Test/return_matrix1.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_matrix1.cpp -output @Test/return_matrix1 -@Test/return_vector2.$(MEXENDING): @Test/return_vector2.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_vector2.cpp -output @Test/return_vector2 -@Test/return_matrix2.$(MEXENDING): @Test/return_matrix2.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_matrix2.cpp -output @Test/return_matrix2 -@Test/arg_EigenConstRef.$(MEXENDING): @Test/arg_EigenConstRef.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/arg_EigenConstRef.cpp -output @Test/arg_EigenConstRef -@Test/return_field.$(MEXENDING): @Test/return_field.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_field.cpp -output @Test/return_field -@Test/return_TestPtr.$(MEXENDING): @Test/return_TestPtr.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_TestPtr.cpp -output @Test/return_TestPtr -@Test/return_Test.$(MEXENDING): @Test/return_Test.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_Test.cpp -output @Test/return_Test -@Test/return_Point2Ptr.$(MEXENDING): @Test/return_Point2Ptr.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_Point2Ptr.cpp -output @Test/return_Point2Ptr -@Test/create_ptrs.$(MEXENDING): @Test/create_ptrs.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/create_ptrs.cpp -output @Test/create_ptrs -@Test/create_MixedPtrs.$(MEXENDING): @Test/create_MixedPtrs.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/create_MixedPtrs.cpp -output @Test/create_MixedPtrs -@Test/return_ptrs.$(MEXENDING): @Test/return_ptrs.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/return_ptrs.cpp -output @Test/return_ptrs -@Test/print.$(MEXENDING): @Test/print.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @Test/print.cpp -output @Test/print - -Test: new_Test.$(MEXENDING) @Test/return_pair.$(MEXENDING) @Test/return_bool.$(MEXENDING) @Test/return_size_t.$(MEXENDING) @Test/return_int.$(MEXENDING) @Test/return_double.$(MEXENDING) @Test/return_string.$(MEXENDING) @Test/return_vector1.$(MEXENDING) @Test/return_matrix1.$(MEXENDING) @Test/return_vector2.$(MEXENDING) @Test/return_matrix2.$(MEXENDING) @Test/arg_EigenConstRef.$(MEXENDING) @Test/return_field.$(MEXENDING) @Test/return_TestPtr.$(MEXENDING) @Test/return_Test.$(MEXENDING) @Test/return_Point2Ptr.$(MEXENDING) @Test/create_ptrs.$(MEXENDING) @Test/create_MixedPtrs.$(MEXENDING) @Test/return_ptrs.$(MEXENDING) @Test/print.$(MEXENDING) - - - -clean: - rm -rf *.$(MEXENDING) - rm -rf @Point2/*.$(MEXENDING) - rm -rf @Point3/*.$(MEXENDING) - rm -rf @Test/*.$(MEXENDING) - - diff --git a/wrap/tests/expected/Point2.m b/wrap/tests/expected/Point2.m new file mode 100644 index 000000000..95f46a2dd --- /dev/null +++ b/wrap/tests/expected/Point2.m @@ -0,0 +1,88 @@ +% automatically generated by wrap +classdef Point2 < handle + properties + self = 0 + end + methods + function obj = Point2(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + geometry_wrapper(obj.self); + elseif nargin == 0 + obj.self = geometry_wrapper(1); + elseif nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double') + obj.self = geometry_wrapper(2,varargin{1},varargin{2}); + else + error('Arguments do not match any overload of Point2 constructor'); + end + end + + function delete(obj) + geometry_wrapper(3, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + function varargout = argChar(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'char') + geometry_wrapper(4, self, varargin{:}); + else + error('Arguments do not match any overload of function Point2.argChar'); + end + end + + function varargout = argUChar(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'char') + geometry_wrapper(5, self, varargin{:}); + else + error('Arguments do not match any overload of function Point2.argUChar'); + end + end + + function varargout = dim(self, varargin) + if length(varargin) == 0 + varargout{1} = geometry_wrapper(6, self, varargin{:}); + else + error('Arguments do not match any overload of function Point2.dim'); + end + end + + function varargout = returnChar(self, varargin) + if length(varargin) == 0 + varargout{1} = geometry_wrapper(7, self, varargin{:}); + else + error('Arguments do not match any overload of function Point2.returnChar'); + end + end + + function varargout = vectorConfusion(self, varargin) + if length(varargin) == 0 + varargout{1} = geometry_wrapper(8, self, varargin{:}); + else + error('Arguments do not match any overload of function Point2.vectorConfusion'); + end + end + + function varargout = x(self, varargin) + if length(varargin) == 0 + varargout{1} = geometry_wrapper(9, self, varargin{:}); + else + error('Arguments do not match any overload of function Point2.x'); + end + end + + function varargout = y(self, varargin) + if length(varargin) == 0 + varargout{1} = geometry_wrapper(10, self, varargin{:}); + else + error('Arguments do not match any overload of function Point2.y'); + end + end + + end + + methods(Static = true) + end +end diff --git a/wrap/tests/expected/Point3.m b/wrap/tests/expected/Point3.m new file mode 100644 index 000000000..7a1045a86 --- /dev/null +++ b/wrap/tests/expected/Point3.m @@ -0,0 +1,54 @@ +% automatically generated by wrap +classdef Point3 < handle + properties + self = 0 + end + methods + function obj = Point3(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + geometry_wrapper(obj.self); + elseif nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double') + obj.self = geometry_wrapper(12,varargin{1},varargin{2},varargin{3}); + else + error('Arguments do not match any overload of Point3 constructor'); + end + end + + function delete(obj) + geometry_wrapper(13, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + function varargout = norm(self, varargin) + if length(varargin) == 0 + varargout{1} = geometry_wrapper(14, self, varargin{:}); + else + error('Arguments do not match any overload of function Point3.norm'); + end + end + + end + + methods(Static = true) + function varargout = StaticFunctionRet(varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + varargout{1} = geometry_wrapper(15, varargin{:}); + else + error('Arguments do not match any overload of function Point3.StaticFunctionRet'); + end + end + + function varargout = StaticFunction(varargin) + if length(varargin) == 0 + varargout{1} = geometry_wrapper(16, varargin{:}); + else + error('Arguments do not match any overload of function Point3.StaticFunction'); + end + end + + end +end diff --git a/wrap/tests/expected/Point3_StaticFunctionRet.cpp b/wrap/tests/expected/Point3_StaticFunctionRet.cpp deleted file mode 100644 index 696af326a..000000000 --- a/wrap/tests/expected/Point3_StaticFunctionRet.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr SharedPoint3; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("Point3_StaticFunctionRet",nargout,nargin,1); - double z = unwrap< double >(in[0]); - Point3 result = Point3::StaticFunctionRet(z); - SharedPoint3* ret = new SharedPoint3(new Point3(result)); - out[0] = wrap_collect_shared_ptr(ret,"Point3"); -} diff --git a/wrap/tests/expected/Point3_StaticFunctionRet.m b/wrap/tests/expected/Point3_StaticFunctionRet.m deleted file mode 100644 index bdfd32b4b..000000000 --- a/wrap/tests/expected/Point3_StaticFunctionRet.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap -function result = Point3_StaticFunctionRet(z) -% usage: x = Point3_StaticFunctionRet(z) - error('need to compile Point3_StaticFunctionRet.cpp'); -end diff --git a/wrap/tests/expected/Point3_staticFunction.cpp b/wrap/tests/expected/Point3_staticFunction.cpp deleted file mode 100644 index f25c8f4ea..000000000 --- a/wrap/tests/expected/Point3_staticFunction.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shareddouble; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("Point3_staticFunction",nargout,nargin,0); - double result = Point3::staticFunction(); - out[0] = wrap< double >(result); -} diff --git a/wrap/tests/expected/Point3_staticFunction.m b/wrap/tests/expected/Point3_staticFunction.m deleted file mode 100644 index 23885f71e..000000000 --- a/wrap/tests/expected/Point3_staticFunction.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap -function result = Point3_staticFunction() -% usage: x = Point3_staticFunction() - error('need to compile Point3_staticFunction.cpp'); -end diff --git a/wrap/tests/expected/Test.m b/wrap/tests/expected/Test.m new file mode 100644 index 000000000..2c914502a --- /dev/null +++ b/wrap/tests/expected/Test.m @@ -0,0 +1,184 @@ +% automatically generated by wrap +classdef Test < handle + properties + self = 0 + end + methods + function obj = Test(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + geometry_wrapper(obj.self); + elseif nargin == 0 + obj.self = geometry_wrapper(18); + elseif nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double') + obj.self = geometry_wrapper(19,varargin{1},varargin{2}); + else + error('Arguments do not match any overload of Test constructor'); + end + end + + function delete(obj) + geometry_wrapper(20, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + function varargout = arg_EigenConstRef(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + geometry_wrapper(21, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.arg_EigenConstRef'); + end + end + + function varargout = create_MixedPtrs(self, varargin) + if length(varargin) == 0 + [ varargout{1} varargout{2} ] = geometry_wrapper(22, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.create_MixedPtrs'); + end + end + + function varargout = create_ptrs(self, varargin) + if length(varargin) == 0 + [ varargout{1} varargout{2} ] = geometry_wrapper(23, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.create_ptrs'); + end + end + + function varargout = print(self, varargin) + if length(varargin) == 0 + geometry_wrapper(24, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.print'); + end + end + + function varargout = return_Point2Ptr(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'logical') + varargout{1} = geometry_wrapper(25, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_Point2Ptr'); + end + end + + function varargout = return_Test(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'Test') + varargout{1} = geometry_wrapper(26, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_Test'); + end + end + + function varargout = return_TestPtr(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'Test') + varargout{1} = geometry_wrapper(27, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_TestPtr'); + end + end + + function varargout = return_bool(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'logical') + varargout{1} = geometry_wrapper(28, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_bool'); + end + end + + function varargout = return_double(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + varargout{1} = geometry_wrapper(29, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_double'); + end + end + + function varargout = return_field(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'Test') + varargout{1} = geometry_wrapper(30, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_field'); + end + end + + function varargout = return_int(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'numeric') + varargout{1} = geometry_wrapper(31, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_int'); + end + end + + function varargout = return_matrix1(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + varargout{1} = geometry_wrapper(32, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_matrix1'); + end + end + + function varargout = return_matrix2(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + varargout{1} = geometry_wrapper(33, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_matrix2'); + end + end + + function varargout = return_pair(self, varargin) + if length(varargin) == 2 && isa(varargin{1},'double') && isa(varargin{2},'double') + [ varargout{1} varargout{2} ] = geometry_wrapper(34, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_pair'); + end + end + + function varargout = return_ptrs(self, varargin) + if length(varargin) == 2 && isa(varargin{1},'Test') && isa(varargin{2},'Test') + [ varargout{1} varargout{2} ] = geometry_wrapper(35, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_ptrs'); + end + end + + function varargout = return_size_t(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'numeric') + varargout{1} = geometry_wrapper(36, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_size_t'); + end + end + + function varargout = return_string(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'char') + varargout{1} = geometry_wrapper(37, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_string'); + end + end + + function varargout = return_vector1(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + varargout{1} = geometry_wrapper(38, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_vector1'); + end + end + + function varargout = return_vector2(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + varargout{1} = geometry_wrapper(39, self, varargin{:}); + else + error('Arguments do not match any overload of function Test.return_vector2'); + end + end + + end + + methods(Static = true) + end +end diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp new file mode 100644 index 000000000..e2c866083 --- /dev/null +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -0,0 +1,621 @@ +// automatically generated by wrap +#include +#include +#include + +#include +#include +#include + +typedef std::set*> Collector_Point2; +static Collector_Point2 collector_Point2; +typedef std::set*> Collector_Point3; +static Collector_Point3 collector_Point3; +typedef std::set*> Collector_Test; +static Collector_Test collector_Test; +void _deleteAllObjects() +{ + for(Collector_Point2::iterator iter = collector_Point2.begin(); + iter != collector_Point2.end(); ) { + delete *iter; + collector_Point2.erase(iter++); + } + for(Collector_Point3::iterator iter = collector_Point3.begin(); + iter != collector_Point3.end(); ) { + delete *iter; + collector_Point3.erase(iter++); + } + for(Collector_Test::iterator iter = collector_Test.begin(); + iter != collector_Test.end(); ) { + delete *iter; + collector_Test.erase(iter++); + } +} +void Point2_constructor_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_Point2.insert(self); +} +void Point2_constructor_1(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new Point2()); + collector_Point2.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void Point2_constructor_2(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + double x = unwrap< double >(in[0]); + double y = unwrap< double >(in[1]); + Shared *self = new Shared(new Point2(x,y)); + collector_Point2.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void Point2_deconstructor_3(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("delete_Point2",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_Point2::iterator item; + item = collector_Point2.find(self); + if(item != collector_Point2.end()) { + delete self; + collector_Point2.erase(item); + } +} + +void Point2_argChar_4(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("argChar",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + char a = unwrap< char >(in[1]); + obj->argChar(a); +} + +void Point2_argUChar_5(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("argUChar",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + unsigned char a = unwrap< unsigned char >(in[1]); + obj->argUChar(a); +} + +void Point2_dim_6(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("dim",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + int result = obj->dim(); + out[0] = wrap< int >(result); +} + +void Point2_returnChar_7(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("returnChar",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + char result = obj->returnChar(); + out[0] = wrap< char >(result); +} + +void Point2_vectorConfusion_8(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr SharedVectorNotEigen; + typedef boost::shared_ptr Shared; + checkArguments("vectorConfusion",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + VectorNotEigen result = obj->vectorConfusion(); + SharedVectorNotEigen* ret = new SharedVectorNotEigen(new VectorNotEigen(result)); + out[0] = wrap_shared_ptr(ret,"VectorNotEigen"); +} + +void Point2_x_9(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("x",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + double result = obj->x(); + out[0] = wrap< double >(result); +} + +void Point2_y_10(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("y",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Point2"); + double result = obj->y(); + out[0] = wrap< double >(result); +} + +void Point3_constructor_11(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); +using namespace geometry; + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_Point3.insert(self); +} +void Point3_constructor_12(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); +using namespace geometry; + typedef boost::shared_ptr Shared; + + double x = unwrap< double >(in[0]); + double y = unwrap< double >(in[1]); + double z = unwrap< double >(in[2]); + Shared *self = new Shared(new Point3(x,y,z)); + collector_Point3.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void Point3_deconstructor_13(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("delete_Point3",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_Point3::iterator item; + item = collector_Point3.find(self); + if(item != collector_Point3.end()) { + delete self; + collector_Point3.erase(item); + } +} + +void Point3_norm_14(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("norm",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Point3"); + double result = obj->norm(); + out[0] = wrap< double >(result); +} + +void Point3_StaticFunctionRet_15(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr SharedPoint3; + typedef boost::shared_ptr Shared; + checkArguments("Point3.StaticFunctionRet",nargout,nargin,1); + double z = unwrap< double >(in[0]); + Point3 result = Point3::StaticFunctionRet(z); + SharedPoint3* ret = new SharedPoint3(new Point3(result)); + out[0] = wrap_shared_ptr(ret,"Point3"); +} + +void Point3_staticFunction_16(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("Point3.staticFunction",nargout,nargin,0); + double result = Point3::staticFunction(); + out[0] = wrap< double >(result); +} + +void Test_constructor_17(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); +using namespace geometry; + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_Test.insert(self); +} +void Test_constructor_18(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); +using namespace geometry; + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new Test()); + collector_Test.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void Test_constructor_19(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); +using namespace geometry; + typedef boost::shared_ptr Shared; + + double a = unwrap< double >(in[0]); + Matrix b = unwrap< Matrix >(in[1]); + Shared *self = new Shared(new Test(a,b)); + collector_Test.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void Test_deconstructor_20(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("delete_Test",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_Test::iterator item; + item = collector_Test.find(self); + if(item != collector_Test.end()) { + delete self; + collector_Test.erase(item); + } +} + +void Test_arg_EigenConstRef_21(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("arg_EigenConstRef",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); + obj->arg_EigenConstRef(value); +} + +void Test_create_MixedPtrs_22(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr Shared; + checkArguments("create_MixedPtrs",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + pair< Test, SharedTest > result = obj->create_MixedPtrs(); + SharedTest* ret = new SharedTest(new Test(result.first)); + out[0] = wrap_shared_ptr(ret,"Test"); + SharedTest* ret = new SharedTest(result.second); + out[1] = wrap_shared_ptr(ret,"Test"); +} + +void Test_create_ptrs_23(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr Shared; + checkArguments("create_ptrs",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + pair< SharedTest, SharedTest > result = obj->create_ptrs(); + SharedTest* ret = new SharedTest(result.first); + out[0] = wrap_shared_ptr(ret,"Test"); + SharedTest* ret = new SharedTest(result.second); + out[1] = wrap_shared_ptr(ret,"Test"); +} + +void Test_print_24(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("print",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + obj->print(); +} + +void Test_return_Point2Ptr_25(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr SharedPoint2; + typedef boost::shared_ptr Shared; + checkArguments("return_Point2Ptr",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + bool value = unwrap< bool >(in[1]); + SharedPoint2 result = obj->return_Point2Ptr(value); + SharedPoint2* ret = new SharedPoint2(result); + out[0] = wrap_shared_ptr(ret,"Point2"); +} + +void Test_return_Test_26(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr Shared; + checkArguments("return_Test",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); + Test result = obj->return_Test(value); + SharedTest* ret = new SharedTest(new Test(result)); + out[0] = wrap_shared_ptr(ret,"Test"); +} + +void Test_return_TestPtr_27(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr Shared; + checkArguments("return_TestPtr",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); + SharedTest result = obj->return_TestPtr(value); + SharedTest* ret = new SharedTest(result); + out[0] = wrap_shared_ptr(ret,"Test"); +} + +void Test_return_bool_28(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_bool",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + bool value = unwrap< bool >(in[1]); + bool result = obj->return_bool(value); + out[0] = wrap< bool >(result); +} + +void Test_return_double_29(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_double",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + double value = unwrap< double >(in[1]); + double result = obj->return_double(value); + out[0] = wrap< double >(result); +} + +void Test_return_field_30(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_field",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); + bool result = obj->return_field(t); + out[0] = wrap< bool >(result); +} + +void Test_return_int_31(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_int",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + int value = unwrap< int >(in[1]); + int result = obj->return_int(value); + out[0] = wrap< int >(result); +} + +void Test_return_matrix1_32(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_matrix1",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Matrix value = unwrap< Matrix >(in[1]); + Matrix result = obj->return_matrix1(value); + out[0] = wrap< Matrix >(result); +} + +void Test_return_matrix2_33(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_matrix2",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Matrix value = unwrap< Matrix >(in[1]); + Matrix result = obj->return_matrix2(value); + out[0] = wrap< Matrix >(result); +} + +void Test_return_pair_34(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_pair",nargout,nargin-1,2); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Vector v = unwrap< Vector >(in[1]); + Matrix A = unwrap< Matrix >(in[2]); + pair< Vector, Matrix > result = obj->return_pair(v,A); + out[0] = wrap< Vector >(result.first); + out[1] = wrap< Matrix >(result.second); +} + +void Test_return_ptrs_35(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr SharedTest; + typedef boost::shared_ptr Shared; + checkArguments("return_ptrs",nargout,nargin-1,2); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); + boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); + pair< SharedTest, SharedTest > result = obj->return_ptrs(p1,p2); + SharedTest* ret = new SharedTest(result.first); + out[0] = wrap_shared_ptr(ret,"Test"); + SharedTest* ret = new SharedTest(result.second); + out[1] = wrap_shared_ptr(ret,"Test"); +} + +void Test_return_size_t_36(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_size_t",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + size_t value = unwrap< size_t >(in[1]); + size_t result = obj->return_size_t(value); + out[0] = wrap< size_t >(result); +} + +void Test_return_string_37(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_string",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + string value = unwrap< string >(in[1]); + string result = obj->return_string(value); + out[0] = wrap< string >(result); +} + +void Test_return_vector1_38(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_vector1",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Vector value = unwrap< Vector >(in[1]); + Vector result = obj->return_vector1(value); + out[0] = wrap< Vector >(result); +} + +void Test_return_vector2_39(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ +using namespace geometry; + typedef boost::shared_ptr Shared; + checkArguments("return_vector2",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "Test"); + Vector value = unwrap< Vector >(in[1]); + Vector result = obj->return_vector2(value); + out[0] = wrap< Vector >(result); +} + +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mstream mout; + std::streambuf *outbuf = std::cout.rdbuf(&mout); + + int id = unwrap(in[0]); + + switch(id) { + case 0: + Point2_constructor_0(nargout, out, nargin-1, in+1); + break; + case 1: + Point2_constructor_1(nargout, out, nargin-1, in+1); + break; + case 2: + Point2_constructor_2(nargout, out, nargin-1, in+1); + break; + case 3: + Point2_deconstructor_3(nargout, out, nargin-1, in+1); + break; + case 4: + Point2_argChar_4(nargout, out, nargin-1, in+1); + break; + case 5: + Point2_argUChar_5(nargout, out, nargin-1, in+1); + break; + case 6: + Point2_dim_6(nargout, out, nargin-1, in+1); + break; + case 7: + Point2_returnChar_7(nargout, out, nargin-1, in+1); + break; + case 8: + Point2_vectorConfusion_8(nargout, out, nargin-1, in+1); + break; + case 9: + Point2_x_9(nargout, out, nargin-1, in+1); + break; + case 10: + Point2_y_10(nargout, out, nargin-1, in+1); + break; + case 11: + Point3_constructor_11(nargout, out, nargin-1, in+1); + break; + case 12: + Point3_constructor_12(nargout, out, nargin-1, in+1); + break; + case 13: + Point3_deconstructor_13(nargout, out, nargin-1, in+1); + break; + case 14: + Point3_norm_14(nargout, out, nargin-1, in+1); + break; + case 15: + Point3_StaticFunctionRet_15(nargout, out, nargin-1, in+1); + break; + case 16: + Point3_staticFunction_16(nargout, out, nargin-1, in+1); + break; + case 17: + Test_constructor_17(nargout, out, nargin-1, in+1); + break; + case 18: + Test_constructor_18(nargout, out, nargin-1, in+1); + break; + case 19: + Test_constructor_19(nargout, out, nargin-1, in+1); + break; + case 20: + Test_deconstructor_20(nargout, out, nargin-1, in+1); + break; + case 21: + Test_arg_EigenConstRef_21(nargout, out, nargin-1, in+1); + break; + case 22: + Test_create_MixedPtrs_22(nargout, out, nargin-1, in+1); + break; + case 23: + Test_create_ptrs_23(nargout, out, nargin-1, in+1); + break; + case 24: + Test_print_24(nargout, out, nargin-1, in+1); + break; + case 25: + Test_return_Point2Ptr_25(nargout, out, nargin-1, in+1); + break; + case 26: + Test_return_Test_26(nargout, out, nargin-1, in+1); + break; + case 27: + Test_return_TestPtr_27(nargout, out, nargin-1, in+1); + break; + case 28: + Test_return_bool_28(nargout, out, nargin-1, in+1); + break; + case 29: + Test_return_double_29(nargout, out, nargin-1, in+1); + break; + case 30: + Test_return_field_30(nargout, out, nargin-1, in+1); + break; + case 31: + Test_return_int_31(nargout, out, nargin-1, in+1); + break; + case 32: + Test_return_matrix1_32(nargout, out, nargin-1, in+1); + break; + case 33: + Test_return_matrix2_33(nargout, out, nargin-1, in+1); + break; + case 34: + Test_return_pair_34(nargout, out, nargin-1, in+1); + break; + case 35: + Test_return_ptrs_35(nargout, out, nargin-1, in+1); + break; + case 36: + Test_return_size_t_36(nargout, out, nargin-1, in+1); + break; + case 37: + Test_return_string_37(nargout, out, nargin-1, in+1); + break; + case 38: + Test_return_vector1_38(nargout, out, nargin-1, in+1); + break; + case 39: + Test_return_vector2_39(nargout, out, nargin-1, in+1); + break; + } + + std::cout.rdbuf(outbuf); +} diff --git a/wrap/tests/expected/make_geometry.m b/wrap/tests/expected/make_geometry.m deleted file mode 100644 index d77459ed8..000000000 --- a/wrap/tests/expected/make_geometry.m +++ /dev/null @@ -1,59 +0,0 @@ -% automatically generated by wrap -echo on - -toolboxpath = mfilename('fullpath'); -delims = find(toolboxpath == '/' | toolboxpath == '\'); -toolboxpath = toolboxpath(1:(delims(end)-1)); -clear delims -addpath(toolboxpath); - -%% Point2 -cd(toolboxpath) -mex -O5 new_Point2.cpp - -cd @Point2 -mex -O5 x.cpp -mex -O5 y.cpp -mex -O5 dim.cpp -mex -O5 returnChar.cpp -mex -O5 argChar.cpp -mex -O5 argUChar.cpp -mex -O5 vectorConfusion.cpp - -%% Point3 -cd(toolboxpath) -mex -O5 new_Point3.cpp -mex -O5 Point3_staticFunction.cpp -mex -O5 Point3_StaticFunctionRet.cpp - -cd @Point3 -mex -O5 norm.cpp - -%% Test -cd(toolboxpath) -mex -O5 new_Test.cpp - -cd @Test -mex -O5 return_pair.cpp -mex -O5 return_bool.cpp -mex -O5 return_size_t.cpp -mex -O5 return_int.cpp -mex -O5 return_double.cpp -mex -O5 return_string.cpp -mex -O5 return_vector1.cpp -mex -O5 return_matrix1.cpp -mex -O5 return_vector2.cpp -mex -O5 return_matrix2.cpp -mex -O5 arg_EigenConstRef.cpp -mex -O5 return_field.cpp -mex -O5 return_TestPtr.cpp -mex -O5 return_Test.cpp -mex -O5 return_Point2Ptr.cpp -mex -O5 create_ptrs.cpp -mex -O5 create_MixedPtrs.cpp -mex -O5 return_ptrs.cpp -mex -O5 print.cpp - -cd(toolboxpath) - -echo off diff --git a/wrap/tests/expected/new_Point2.cpp b/wrap/tests/expected/new_Point2.cpp deleted file mode 100644 index b24642ad4..000000000 --- a/wrap/tests/expected/new_Point2.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new Point2()); - if(nc == 1) { - double x = unwrap< double >(in[2]); - double y = unwrap< double >(in[3]); - self = new Shared(new Point2(x,y)); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected/new_Point2.m b/wrap/tests/expected/new_Point2.m deleted file mode 100644 index 9a6edd425..000000000 --- a/wrap/tests/expected/new_Point2.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Point2(obj,x,y) - error('need to compile new_Point2.cpp'); -end diff --git a/wrap/tests/expected/new_Point3.cpp b/wrap/tests/expected/new_Point3.cpp deleted file mode 100644 index 2e715263b..000000000 --- a/wrap/tests/expected/new_Point3.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) { - double x = unwrap< double >(in[2]); - double y = unwrap< double >(in[3]); - double z = unwrap< double >(in[4]); - self = new Shared(new Point3(x,y,z)); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected/new_Point3.m b/wrap/tests/expected/new_Point3.m deleted file mode 100644 index 9cca5daa5..000000000 --- a/wrap/tests/expected/new_Point3.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Point3(obj,x,y,z) - error('need to compile new_Point3.cpp'); -end diff --git a/wrap/tests/expected/new_Test.cpp b/wrap/tests/expected/new_Test.cpp deleted file mode 100644 index 57ac1a4ea..000000000 --- a/wrap/tests/expected/new_Test.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// automatically generated by wrap -#include -#include -using namespace geometry; -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new Test()); - if(nc == 1) { - double a = unwrap< double >(in[2]); - Matrix b = unwrap< Matrix >(in[3]); - self = new Shared(new Test(a,b)); - } - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected/new_Test.m b/wrap/tests/expected/new_Test.m deleted file mode 100644 index ec9a13f63..000000000 --- a/wrap/tests/expected/new_Test.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_Test(obj,a,b) - error('need to compile new_Test.cpp'); -end diff --git a/wrap/tests/expected_namespaces/@ClassD/ClassD.m b/wrap/tests/expected_namespaces/@ClassD/ClassD.m deleted file mode 100644 index 90fbf48a4..000000000 --- a/wrap/tests/expected_namespaces/@ClassD/ClassD.m +++ /dev/null @@ -1,21 +0,0 @@ -% automatically generated by wrap -classdef ClassD < handle - properties - self = 0 - end - methods - function obj = ClassD(varargin) - if (nargin == 0), obj.self = new_ClassD(0,0); end - if nargin ==14, new_ClassD(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ClassD constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_ClassD(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m b/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m deleted file mode 100644 index 727e020ae..000000000 --- a/wrap/tests/expected_namespaces/@ns1ClassA/ns1ClassA.m +++ /dev/null @@ -1,21 +0,0 @@ -% automatically generated by wrap -classdef ns1ClassA < handle - properties - self = 0 - end - methods - function obj = ns1ClassA(varargin) - if (nargin == 0), obj.self = new_ns1ClassA(0,0); end - if nargin ==14, new_ns1ClassA(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassA constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_ns1ClassA(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m b/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m deleted file mode 100644 index 19b0a73b9..000000000 --- a/wrap/tests/expected_namespaces/@ns1ClassB/ns1ClassB.m +++ /dev/null @@ -1,21 +0,0 @@ -% automatically generated by wrap -classdef ns1ClassB < handle - properties - self = 0 - end - methods - function obj = ns1ClassB(varargin) - if (nargin == 0), obj.self = new_ns1ClassB(0,0); end - if nargin ==14, new_ns1ClassB(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns1ClassB constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_ns1ClassB(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp deleted file mode 100644 index 70d0a7968..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("memberFunction",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); - double result = obj->memberFunction(); - out[0] = wrap< double >(result); -} diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m deleted file mode 100644 index 41587c2bc..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.memberFunction() -function result = memberFunction(obj) - error('need to compile memberFunction.cpp'); -end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m b/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m deleted file mode 100644 index 27de74dc3..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassA/ns2ClassA.m +++ /dev/null @@ -1,21 +0,0 @@ -% automatically generated by wrap -classdef ns2ClassA < handle - properties - self = 0 - end - methods - function obj = ns2ClassA(varargin) - if (nargin == 0), obj.self = new_ns2ClassA(0,0); end - if nargin ==14, new_ns2ClassA(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassA constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_ns2ClassA(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp deleted file mode 100644 index 498d90649..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("nsArg",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); - ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); - int result = obj->nsArg(arg); - out[0] = wrap< int >(result); -} diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m deleted file mode 100644 index 1e3f5865d..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.nsArg(arg) -function result = nsArg(obj,arg) - error('need to compile nsArg.cpp'); -end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp deleted file mode 100644 index 996bf8913..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr SharedClassB; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("nsReturn",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); - double q = unwrap< double >(in[1]); - ns2::ns3::ClassB result = obj->nsReturn(q); - SharedClassB* ret = new SharedClassB(new ns2::ns3::ClassB(result)); - out[0] = wrap_collect_shared_ptr(ret,"ns2ns3ClassB"); -} diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m deleted file mode 100644 index f1f74b614..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m +++ /dev/null @@ -1,4 +0,0 @@ -% result = obj.nsReturn(q) -function result = nsReturn(obj,q) - error('need to compile nsReturn.cpp'); -end diff --git a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m b/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m deleted file mode 100644 index 2425b59bd..000000000 --- a/wrap/tests/expected_namespaces/@ns2ClassC/ns2ClassC.m +++ /dev/null @@ -1,21 +0,0 @@ -% automatically generated by wrap -classdef ns2ClassC < handle - properties - self = 0 - end - methods - function obj = ns2ClassC(varargin) - if (nargin == 0), obj.self = new_ns2ClassC(0,0); end - if nargin ==14, new_ns2ClassC(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ClassC constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_ns2ClassC(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m b/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m deleted file mode 100644 index de7f7a3ca..000000000 --- a/wrap/tests/expected_namespaces/@ns2ns3ClassB/ns2ns3ClassB.m +++ /dev/null @@ -1,21 +0,0 @@ -% automatically generated by wrap -classdef ns2ns3ClassB < handle - properties - self = 0 - end - methods - function obj = ns2ns3ClassB(varargin) - if (nargin == 0), obj.self = new_ns2ns3ClassB(0,0); end - if nargin ==14, new_ns2ns3ClassB(varargin{1},0); end - if nargin ~= 13 && nargin ~= 14 && obj.self == 0, error('ns2ns3ClassB constructor failed'); end - end - function delete(obj) - if obj.self ~= 0 - new_ns2ns3ClassB(obj.self); - obj.self = 0; - end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/tests/expected_namespaces/ClassD.m b/wrap/tests/expected_namespaces/ClassD.m new file mode 100644 index 000000000..fcedbdc1c --- /dev/null +++ b/wrap/tests/expected_namespaces/ClassD.m @@ -0,0 +1,30 @@ +% automatically generated by wrap +classdef ClassD < handle + properties + self = 0 + end + methods + function obj = ClassD(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + testNamespaces_wrapper(obj.self); + elseif nargin == 0 + obj.self = testNamespaces_wrapper(20); + else + error('Arguments do not match any overload of ClassD constructor'); + end + end + + function delete(obj) + testNamespaces_wrapper(21, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + end + + methods(Static = true) + end +end diff --git a/wrap/tests/expected_namespaces/Makefile b/wrap/tests/expected_namespaces/Makefile deleted file mode 100644 index 1cb09b8b9..000000000 --- a/wrap/tests/expected_namespaces/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# automatically generated by wrap - -MEX = mex -MEXENDING = mexa64 -PATH_TO_WRAP = /not_really_a_real_path/borg/gtsam/wrap -mex_flags = -O5 - -all: ns1ClassA ns1ClassB ns2ClassA ns2ns3ClassB ns2ClassC ClassD - -# ns1ClassA -new_ns1ClassA.$(MEXENDING): new_ns1ClassA.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns1ClassA.cpp -output new_ns1ClassA - -ns1ClassA: new_ns1ClassA.$(MEXENDING) - -# ns1ClassB -new_ns1ClassB.$(MEXENDING): new_ns1ClassB.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns1ClassB.cpp -output new_ns1ClassB - -ns1ClassB: new_ns1ClassB.$(MEXENDING) - -# ns2ClassA -new_ns2ClassA.$(MEXENDING): new_ns2ClassA.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns2ClassA.cpp -output new_ns2ClassA -ns2ClassA_afunction.$(MEXENDING): ns2ClassA_afunction.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) ns2ClassA_afunction.cpp -output ns2ClassA_afunction -@ns2ClassA/memberFunction.$(MEXENDING): @ns2ClassA/memberFunction.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @ns2ClassA/memberFunction.cpp -output @ns2ClassA/memberFunction -@ns2ClassA/nsArg.$(MEXENDING): @ns2ClassA/nsArg.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @ns2ClassA/nsArg.cpp -output @ns2ClassA/nsArg -@ns2ClassA/nsReturn.$(MEXENDING): @ns2ClassA/nsReturn.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) @ns2ClassA/nsReturn.cpp -output @ns2ClassA/nsReturn - -ns2ClassA: new_ns2ClassA.$(MEXENDING) ns2ClassA_afunction.$(MEXENDING) @ns2ClassA/memberFunction.$(MEXENDING) @ns2ClassA/nsArg.$(MEXENDING) @ns2ClassA/nsReturn.$(MEXENDING) - -# ns2ns3ClassB -new_ns2ns3ClassB.$(MEXENDING): new_ns2ns3ClassB.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns2ns3ClassB.cpp -output new_ns2ns3ClassB - -ns2ns3ClassB: new_ns2ns3ClassB.$(MEXENDING) - -# ns2ClassC -new_ns2ClassC.$(MEXENDING): new_ns2ClassC.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ns2ClassC.cpp -output new_ns2ClassC - -ns2ClassC: new_ns2ClassC.$(MEXENDING) - -# ClassD -new_ClassD.$(MEXENDING): new_ClassD.cpp $(PATH_TO_WRAP)/matlab.h - $(MEX) $(mex_flags) new_ClassD.cpp -output new_ClassD - -ClassD: new_ClassD.$(MEXENDING) - - - -clean: - rm -rf *.$(MEXENDING) - rm -rf @ns1ClassA/*.$(MEXENDING) - rm -rf @ns1ClassB/*.$(MEXENDING) - rm -rf @ns2ClassA/*.$(MEXENDING) - rm -rf @ns2ns3ClassB/*.$(MEXENDING) - rm -rf @ns2ClassC/*.$(MEXENDING) - rm -rf @ClassD/*.$(MEXENDING) - - diff --git a/wrap/tests/expected_namespaces/make_testNamespaces.m b/wrap/tests/expected_namespaces/make_testNamespaces.m deleted file mode 100644 index 5cf086db8..000000000 --- a/wrap/tests/expected_namespaces/make_testNamespaces.m +++ /dev/null @@ -1,52 +0,0 @@ -% automatically generated by wrap -echo on - -toolboxpath = mfilename('fullpath'); -delims = find(toolboxpath == '/' | toolboxpath == '\'); -toolboxpath = toolboxpath(1:(delims(end)-1)); -clear delims -addpath(toolboxpath); - -%% ns1ClassA -cd(toolboxpath) -mex -O5 new_ns1ClassA.cpp - -cd @ns1ClassA - -%% ns1ClassB -cd(toolboxpath) -mex -O5 new_ns1ClassB.cpp - -cd @ns1ClassB - -%% ns2ClassA -cd(toolboxpath) -mex -O5 new_ns2ClassA.cpp -mex -O5 ns2ClassA_afunction.cpp - -cd @ns2ClassA -mex -O5 memberFunction.cpp -mex -O5 nsArg.cpp -mex -O5 nsReturn.cpp - -%% ns2ns3ClassB -cd(toolboxpath) -mex -O5 new_ns2ns3ClassB.cpp - -cd @ns2ns3ClassB - -%% ns2ClassC -cd(toolboxpath) -mex -O5 new_ns2ClassC.cpp - -cd @ns2ClassC - -%% ClassD -cd(toolboxpath) -mex -O5 new_ClassD.cpp - -cd @ClassD - -cd(toolboxpath) - -echo off diff --git a/wrap/tests/expected_namespaces/new_ClassD.cpp b/wrap/tests/expected_namespaces/new_ClassD.cpp deleted file mode 100644 index d7a7e4908..000000000 --- a/wrap/tests/expected_namespaces/new_ClassD.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new ClassD()); - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ClassD.m b/wrap/tests/expected_namespaces/new_ClassD.m deleted file mode 100644 index d12bfffb1..000000000 --- a/wrap/tests/expected_namespaces/new_ClassD.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ClassD(obj) - error('need to compile new_ClassD.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA.cpp b/wrap/tests/expected_namespaces/new_ns1ClassA.cpp deleted file mode 100644 index 2554eafc1..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassA.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new ns1::ClassA()); - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA.m b/wrap/tests/expected_namespaces/new_ns1ClassA.m deleted file mode 100644 index 4412baae1..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassA.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns1ClassA(obj) - error('need to compile new_ns1ClassA.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB.cpp b/wrap/tests/expected_namespaces/new_ns1ClassB.cpp deleted file mode 100644 index bc1dd313c..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassB.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new ns1::ClassB()); - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB.m b/wrap/tests/expected_namespaces/new_ns1ClassB.m deleted file mode 100644 index b75d6b9bf..000000000 --- a/wrap/tests/expected_namespaces/new_ns1ClassB.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns1ClassB(obj) - error('need to compile new_ns1ClassB.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA.cpp b/wrap/tests/expected_namespaces/new_ns2ClassA.cpp deleted file mode 100644 index 57faabc79..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassA.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new ns2::ClassA()); - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA.m b/wrap/tests/expected_namespaces/new_ns2ClassA.m deleted file mode 100644 index b3b9201d6..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassA.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns2ClassA(obj) - error('need to compile new_ns2ClassA.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC.cpp b/wrap/tests/expected_namespaces/new_ns2ClassC.cpp deleted file mode 100644 index e836a80fd..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassC.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// automatically generated by wrap -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new ns2::ClassC()); - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC.m b/wrap/tests/expected_namespaces/new_ns2ClassC.m deleted file mode 100644 index 0f7ffb26f..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ClassC.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns2ClassC(obj) - error('need to compile new_ns2ClassC.cpp'); -end diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp deleted file mode 100644 index af1a25922..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shared; - -static std::set collector; - -void cleanup(void) { - for(std::set::iterator iter = collector.begin(); iter != collector.end(); ) { - delete *iter; - collector.erase(iter++); - } -} -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - mexAtExit(cleanup); - - const mxArray* input = in[0]; - Shared* self = *(Shared**) mxGetData(input); - - if(self) { - if(nargin > 1) { - collector.insert(self); - } - else if(collector.erase(self)) - delete self; - } else { - int nc = unwrap(in[1]); - - if(nc == 0) - self = new Shared(new ns2::ns3::ClassB()); - collector.insert(self); - out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast (mxGetPr(out[0])) = self; - } -} diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.m b/wrap/tests/expected_namespaces/new_ns2ns3ClassB.m deleted file mode 100644 index 707e159f0..000000000 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap -function result = new_ns2ns3ClassB(obj) - error('need to compile new_ns2ns3ClassB.cpp'); -end diff --git a/wrap/tests/expected_namespaces/ns1ClassA.m b/wrap/tests/expected_namespaces/ns1ClassA.m new file mode 100644 index 000000000..5ee717612 --- /dev/null +++ b/wrap/tests/expected_namespaces/ns1ClassA.m @@ -0,0 +1,30 @@ +% automatically generated by wrap +classdef ns1ClassA < handle + properties + self = 0 + end + methods + function obj = ns1ClassA(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + testNamespaces_wrapper(obj.self); + elseif nargin == 0 + obj.self = testNamespaces_wrapper(1); + else + error('Arguments do not match any overload of ns1ClassA constructor'); + end + end + + function delete(obj) + testNamespaces_wrapper(2, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + end + + methods(Static = true) + end +end diff --git a/wrap/tests/expected_namespaces/ns1ClassB.m b/wrap/tests/expected_namespaces/ns1ClassB.m new file mode 100644 index 000000000..bc6dc0198 --- /dev/null +++ b/wrap/tests/expected_namespaces/ns1ClassB.m @@ -0,0 +1,30 @@ +% automatically generated by wrap +classdef ns1ClassB < handle + properties + self = 0 + end + methods + function obj = ns1ClassB(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + testNamespaces_wrapper(obj.self); + elseif nargin == 0 + obj.self = testNamespaces_wrapper(4); + else + error('Arguments do not match any overload of ns1ClassB constructor'); + end + end + + function delete(obj) + testNamespaces_wrapper(5, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + end + + methods(Static = true) + end +end diff --git a/wrap/tests/expected_namespaces/ns2ClassA.m b/wrap/tests/expected_namespaces/ns2ClassA.m new file mode 100644 index 000000000..38a161f07 --- /dev/null +++ b/wrap/tests/expected_namespaces/ns2ClassA.m @@ -0,0 +1,62 @@ +% automatically generated by wrap +classdef ns2ClassA < handle + properties + self = 0 + end + methods + function obj = ns2ClassA(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + testNamespaces_wrapper(obj.self); + elseif nargin == 0 + obj.self = testNamespaces_wrapper(7); + else + error('Arguments do not match any overload of ns2ClassA constructor'); + end + end + + function delete(obj) + testNamespaces_wrapper(8, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + function varargout = memberFunction(self, varargin) + if length(varargin) == 0 + varargout{1} = testNamespaces_wrapper(9, self, varargin{:}); + else + error('Arguments do not match any overload of function ns2ClassA.memberFunction'); + end + end + + function varargout = nsArg(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'ns1ClassB') + varargout{1} = testNamespaces_wrapper(10, self, varargin{:}); + else + error('Arguments do not match any overload of function ns2ClassA.nsArg'); + end + end + + function varargout = nsReturn(self, varargin) + if length(varargin) == 1 && isa(varargin{1},'double') + varargout{1} = testNamespaces_wrapper(11, self, varargin{:}); + else + error('Arguments do not match any overload of function ns2ClassA.nsReturn'); + end + end + + end + + methods(Static = true) + function varargout = Afunction(varargin) + if length(varargin) == 0 + varargout{1} = testNamespaces_wrapper(12, varargin{:}); + else + error('Arguments do not match any overload of function ns2ClassA.Afunction'); + end + end + + end +end diff --git a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp b/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp deleted file mode 100644 index 6c903c946..000000000 --- a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// automatically generated by wrap -#include -#include -#include -typedef boost::shared_ptr Shareddouble; -typedef boost::shared_ptr Shared; -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("ns2ClassA_afunction",nargout,nargin,0); - double result = ns2::ClassA::afunction(); - out[0] = wrap< double >(result); -} diff --git a/wrap/tests/expected_namespaces/ns2ClassA_afunction.m b/wrap/tests/expected_namespaces/ns2ClassA_afunction.m deleted file mode 100644 index f41203ba1..000000000 --- a/wrap/tests/expected_namespaces/ns2ClassA_afunction.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap -function result = ns2ClassA_afunction() -% usage: x = ns2ClassA_afunction() - error('need to compile ns2ClassA_afunction.cpp'); -end diff --git a/wrap/tests/expected_namespaces/ns2ClassC.m b/wrap/tests/expected_namespaces/ns2ClassC.m new file mode 100644 index 000000000..647351e2f --- /dev/null +++ b/wrap/tests/expected_namespaces/ns2ClassC.m @@ -0,0 +1,30 @@ +% automatically generated by wrap +classdef ns2ClassC < handle + properties + self = 0 + end + methods + function obj = ns2ClassC(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + testNamespaces_wrapper(obj.self); + elseif nargin == 0 + obj.self = testNamespaces_wrapper(17); + else + error('Arguments do not match any overload of ns2ClassC constructor'); + end + end + + function delete(obj) + testNamespaces_wrapper(18, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + end + + methods(Static = true) + end +end diff --git a/wrap/tests/expected_namespaces/ns2ns3ClassB.m b/wrap/tests/expected_namespaces/ns2ns3ClassB.m new file mode 100644 index 000000000..3df2f52e1 --- /dev/null +++ b/wrap/tests/expected_namespaces/ns2ns3ClassB.m @@ -0,0 +1,30 @@ +% automatically generated by wrap +classdef ns2ns3ClassB < handle + properties + self = 0 + end + methods + function obj = ns2ns3ClassB(varargin) + if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) + obj.self = varargin{2}; + testNamespaces_wrapper(obj.self); + elseif nargin == 0 + obj.self = testNamespaces_wrapper(14); + else + error('Arguments do not match any overload of ns2ns3ClassB constructor'); + end + end + + function delete(obj) + testNamespaces_wrapper(15, obj.self); + end + + function display(obj), obj.print(''); end + + function disp(obj), obj.display; end + + end + + methods(Static = true) + end +end diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp new file mode 100644 index 000000000..7d910c9cc --- /dev/null +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -0,0 +1,369 @@ +// automatically generated by wrap +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef std::set*> Collector_ns1ClassA; +static Collector_ns1ClassA collector_ns1ClassA; +typedef std::set*> Collector_ns1ClassB; +static Collector_ns1ClassB collector_ns1ClassB; +typedef std::set*> Collector_ns2ClassA; +static Collector_ns2ClassA collector_ns2ClassA; +typedef std::set*> Collector_ns2ns3ClassB; +static Collector_ns2ns3ClassB collector_ns2ns3ClassB; +typedef std::set*> Collector_ns2ClassC; +static Collector_ns2ClassC collector_ns2ClassC; +typedef std::set*> Collector_ClassD; +static Collector_ClassD collector_ClassD; +void _deleteAllObjects() +{ + for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); + iter != collector_ns1ClassA.end(); ) { + delete *iter; + collector_ns1ClassA.erase(iter++); + } + for(Collector_ns1ClassB::iterator iter = collector_ns1ClassB.begin(); + iter != collector_ns1ClassB.end(); ) { + delete *iter; + collector_ns1ClassB.erase(iter++); + } + for(Collector_ns2ClassA::iterator iter = collector_ns2ClassA.begin(); + iter != collector_ns2ClassA.end(); ) { + delete *iter; + collector_ns2ClassA.erase(iter++); + } + for(Collector_ns2ns3ClassB::iterator iter = collector_ns2ns3ClassB.begin(); + iter != collector_ns2ns3ClassB.end(); ) { + delete *iter; + collector_ns2ns3ClassB.erase(iter++); + } + for(Collector_ns2ClassC::iterator iter = collector_ns2ClassC.begin(); + iter != collector_ns2ClassC.end(); ) { + delete *iter; + collector_ns2ClassC.erase(iter++); + } + for(Collector_ClassD::iterator iter = collector_ClassD.begin(); + iter != collector_ClassD.end(); ) { + delete *iter; + collector_ClassD.erase(iter++); + } +} +void ns1ClassA_constructor_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_ns1ClassA.insert(self); +} +void ns1ClassA_constructor_1(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new ns1::ClassA()); + collector_ns1ClassA.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void ns1ClassA_deconstructor_2(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("delete_ns1ClassA",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_ns1ClassA::iterator item; + item = collector_ns1ClassA.find(self); + if(item != collector_ns1ClassA.end()) { + delete self; + collector_ns1ClassA.erase(item); + } +} + +void ns1ClassB_constructor_3(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_ns1ClassB.insert(self); +} +void ns1ClassB_constructor_4(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new ns1::ClassB()); + collector_ns1ClassB.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void ns1ClassB_deconstructor_5(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("delete_ns1ClassB",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_ns1ClassB::iterator item; + item = collector_ns1ClassB.find(self); + if(item != collector_ns1ClassB.end()) { + delete self; + collector_ns1ClassB.erase(item); + } +} + +void ns2ClassA_constructor_6(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_ns2ClassA.insert(self); +} +void ns2ClassA_constructor_7(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new ns2::ClassA()); + collector_ns2ClassA.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void ns2ClassA_deconstructor_8(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("delete_ns2ClassA",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_ns2ClassA::iterator item; + item = collector_ns2ClassA.find(self); + if(item != collector_ns2ClassA.end()) { + delete self; + collector_ns2ClassA.erase(item); + } +} + +void ns2ClassA_memberFunction_9(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("memberFunction",nargout,nargin-1,0); + Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); + double result = obj->memberFunction(); + out[0] = wrap< double >(result); +} + +void ns2ClassA_nsArg_10(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("nsArg",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); + ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); + int result = obj->nsArg(arg); + out[0] = wrap< int >(result); +} + +void ns2ClassA_nsReturn_11(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr SharedClassB; + typedef boost::shared_ptr Shared; + checkArguments("nsReturn",nargout,nargin-1,1); + Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); + double q = unwrap< double >(in[1]); + ns2::ns3::ClassB result = obj->nsReturn(q); + SharedClassB* ret = new SharedClassB(new ns2::ns3::ClassB(result)); + out[0] = wrap_shared_ptr(ret,"ns2ns3ClassB"); +} + +void ns2ClassA_afunction_12(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("ns2ClassA.afunction",nargout,nargin,0); + double result = ns2::ClassA::afunction(); + out[0] = wrap< double >(result); +} + +void ns2ns3ClassB_constructor_13(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_ns2ns3ClassB.insert(self); +} +void ns2ns3ClassB_constructor_14(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new ns2::ns3::ClassB()); + collector_ns2ns3ClassB.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void ns2ns3ClassB_deconstructor_15(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("delete_ns2ns3ClassB",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_ns2ns3ClassB::iterator item; + item = collector_ns2ns3ClassB.find(self); + if(item != collector_ns2ns3ClassB.end()) { + delete self; + collector_ns2ns3ClassB.erase(item); + } +} + +void ns2ClassC_constructor_16(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_ns2ClassC.insert(self); +} +void ns2ClassC_constructor_17(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new ns2::ClassC()); + collector_ns2ClassC.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void ns2ClassC_deconstructor_18(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("delete_ns2ClassC",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_ns2ClassC::iterator item; + item = collector_ns2ClassC.find(self); + if(item != collector_ns2ClassC.end()) { + delete self; + collector_ns2ClassC.erase(item); + } +} + +void ClassD_constructor_19(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = *reinterpret_cast (mxGetData(in[0])); + collector_ClassD.insert(self); +} +void ClassD_constructor_20(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mexAtExit(&_deleteAllObjects); + typedef boost::shared_ptr Shared; + + Shared *self = new Shared(new ClassD()); + collector_ClassD.insert(self); + out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); + *reinterpret_cast (mxGetData(out[0])) = self; +} + +void ClassD_deconstructor_21(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + typedef boost::shared_ptr Shared; + checkArguments("delete_ClassD",nargout,nargin,1); + Shared *self = *reinterpret_cast(mxGetData(in[0])); + Collector_ClassD::iterator item; + item = collector_ClassD.find(self); + if(item != collector_ClassD.end()) { + delete self; + collector_ClassD.erase(item); + } +} + +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + mstream mout; + std::streambuf *outbuf = std::cout.rdbuf(&mout); + + int id = unwrap(in[0]); + + switch(id) { + case 0: + ns1ClassA_constructor_0(nargout, out, nargin-1, in+1); + break; + case 1: + ns1ClassA_constructor_1(nargout, out, nargin-1, in+1); + break; + case 2: + ns1ClassA_deconstructor_2(nargout, out, nargin-1, in+1); + break; + case 3: + ns1ClassB_constructor_3(nargout, out, nargin-1, in+1); + break; + case 4: + ns1ClassB_constructor_4(nargout, out, nargin-1, in+1); + break; + case 5: + ns1ClassB_deconstructor_5(nargout, out, nargin-1, in+1); + break; + case 6: + ns2ClassA_constructor_6(nargout, out, nargin-1, in+1); + break; + case 7: + ns2ClassA_constructor_7(nargout, out, nargin-1, in+1); + break; + case 8: + ns2ClassA_deconstructor_8(nargout, out, nargin-1, in+1); + break; + case 9: + ns2ClassA_memberFunction_9(nargout, out, nargin-1, in+1); + break; + case 10: + ns2ClassA_nsArg_10(nargout, out, nargin-1, in+1); + break; + case 11: + ns2ClassA_nsReturn_11(nargout, out, nargin-1, in+1); + break; + case 12: + ns2ClassA_afunction_12(nargout, out, nargin-1, in+1); + break; + case 13: + ns2ns3ClassB_constructor_13(nargout, out, nargin-1, in+1); + break; + case 14: + ns2ns3ClassB_constructor_14(nargout, out, nargin-1, in+1); + break; + case 15: + ns2ns3ClassB_deconstructor_15(nargout, out, nargin-1, in+1); + break; + case 16: + ns2ClassC_constructor_16(nargout, out, nargin-1, in+1); + break; + case 17: + ns2ClassC_constructor_17(nargout, out, nargin-1, in+1); + break; + case 18: + ns2ClassC_deconstructor_18(nargout, out, nargin-1, in+1); + break; + case 19: + ClassD_constructor_19(nargout, out, nargin-1, in+1); + break; + case 20: + ClassD_constructor_20(nargout, out, nargin-1, in+1); + break; + case 21: + ClassD_deconstructor_21(nargout, out, nargin-1, in+1); + break; + } + + std::cout.rdbuf(outbuf); +} diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 2a0b5e259..9f9f29688 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -63,11 +63,11 @@ TEST( wrap, check_exception ) { CHECK_EXCEPTION(Module("/alsonotarealpath", "geometry",enable_verbose), CantOpenFile); // clean out previous generated code - fs::remove_all("actual_deps"); + fs::remove_all("actual_deps"); string path = topdir + "/wrap/tests"; Module module(path.c_str(), "testDependencies",enable_verbose); - CHECK_EXCEPTION(module.matlab_code("mex", "actual_deps", "mexa64", headerPath, "-O5"), DependencyMissing); + CHECK_EXCEPTION(module.matlab_code("actual_deps", headerPath), DependencyMissing); } /* ************************************************************************* */ @@ -116,10 +116,13 @@ TEST( wrap, parse ) { EXPECT(assert_equal("x", a1.name)); // check method - Method m1 = cls.methods.front(); - EXPECT(assert_equal("double", m1.returnVal.type1)); + CHECK(cls.methods.find("norm") != cls.methods.end()); + Method m1 = cls.methods.find("norm")->second; + LONGS_EQUAL(1, m1.returnVals.size()); + EXPECT(assert_equal("double", m1.returnVals.front().type1)); EXPECT(assert_equal("norm", m1.name)); - EXPECT_LONGS_EQUAL(0, m1.args.size()); + LONGS_EQUAL(1, m1.argLists.size()); + EXPECT_LONGS_EQUAL(0, m1.argLists.front().size()); EXPECT(m1.is_const_); } @@ -136,10 +139,12 @@ TEST( wrap, parse ) { EXPECT(assert_equal(exp_includes, testCls.includes)); // function to parse: pair return_pair (Vector v, Matrix A) const; - Method m2 = testCls.methods.front(); - EXPECT(m2.returnVal.isPair); - EXPECT(m2.returnVal.category1 == ReturnValue::EIGEN); - EXPECT(m2.returnVal.category2 == ReturnValue::EIGEN); + CHECK(testCls.methods.find("return_pair") != testCls.methods.end()); + Method m2 = testCls.methods.find("return_pair")->second; + LONGS_EQUAL(1, m2.returnVals.size()); + EXPECT(m2.returnVals.front().isPair); + EXPECT(m2.returnVals.front().category1 == ReturnValue::EIGEN); + EXPECT(m2.returnVals.front().category2 == ReturnValue::EIGEN); } } @@ -202,7 +207,6 @@ TEST( wrap, parse_namespaces ) { strvec exp_includes; exp_includes += ""; EXPECT(assert_equal(exp_includes, cls.includes)); } - } /* ************************************************************************* */ @@ -213,38 +217,21 @@ TEST( wrap, matlab_code_namespaces ) { string path = topdir + "/wrap"; // clean out previous generated code - fs::remove_all("actual_namespaces"); + fs::remove_all("actual_namespaces"); // emit MATLAB code - string exp_path = path + "/tests/expected_namespaces/"; - string act_path = "actual_namespaces/"; - module.matlab_code("mex", "actual_namespaces", "mexa64", headerPath, "-O5"); + string exp_path = path + "/tests/expected_namespaces/"; + string act_path = "actual_namespaces/"; + module.matlab_code("actual_namespaces", headerPath); - EXPECT(files_equal(exp_path + "new_ClassD.cpp" , act_path + "new_ClassD.cpp" )); - EXPECT(files_equal(exp_path + "new_ClassD.m" , act_path + "new_ClassD.m" )); - EXPECT(files_equal(exp_path + "new_ns1ClassA.cpp" , act_path + "new_ns1ClassA.cpp" )); - EXPECT(files_equal(exp_path + "new_ns1ClassA.m" , act_path + "new_ns1ClassA.m" )); - EXPECT(files_equal(exp_path + "new_ns1ClassB.cpp" , act_path + "new_ns1ClassB.cpp" )); - EXPECT(files_equal(exp_path + "new_ns1ClassB.m" , act_path + "new_ns1ClassB.m" )); - EXPECT(files_equal(exp_path + "new_ns2ClassA.cpp" , act_path + "new_ns2ClassA.cpp" )); - EXPECT(files_equal(exp_path + "new_ns2ClassA.m" , act_path + "new_ns2ClassA.m" )); - EXPECT(files_equal(exp_path + "new_ns2ClassC.cpp" , act_path + "new_ns2ClassC.cpp" )); - EXPECT(files_equal(exp_path + "new_ns2ClassC.m" , act_path + "new_ns2ClassC.m" )); - EXPECT(files_equal(exp_path + "new_ns2ns3ClassB.cpp" , act_path + "new_ns2ns3ClassB.cpp" )); - EXPECT(files_equal(exp_path + "new_ns2ns3ClassB.m" , act_path + "new_ns2ns3ClassB.m" )); - EXPECT(files_equal(exp_path + "ns2ClassA_afunction.cpp" , act_path + "ns2ClassA_afunction.cpp" )); - EXPECT(files_equal(exp_path + "ns2ClassA_afunction.m" , act_path + "ns2ClassA_afunction.m" )); - EXPECT(files_equal(exp_path + "@ns2ClassA/memberFunction.cpp", act_path + "@ns2ClassA/memberFunction.cpp")); - EXPECT(files_equal(exp_path + "@ns2ClassA/memberFunction.m" , act_path + "@ns2ClassA/memberFunction.m" )); - EXPECT(files_equal(exp_path + "@ns2ClassA/ns2ClassA.m" , act_path + "@ns2ClassA/ns2ClassA.m" )); - EXPECT(files_equal(exp_path + "@ns2ClassA/nsArg.cpp" , act_path + "@ns2ClassA/nsArg.cpp" )); - EXPECT(files_equal(exp_path + "@ns2ClassA/nsArg.m" , act_path + "@ns2ClassA/nsArg.m" )); - EXPECT(files_equal(exp_path + "@ns2ClassA/nsReturn.cpp" , act_path + "@ns2ClassA/nsReturn.cpp" )); - EXPECT(files_equal(exp_path + "@ns2ClassA/nsReturn.m" , act_path + "@ns2ClassA/nsReturn.m" )); - - EXPECT(files_equal(exp_path + "make_testNamespaces.m", act_path + "make_testNamespaces.m")); - EXPECT(files_equal(exp_path + "Makefile" , act_path + "Makefile" )); + EXPECT(files_equal(exp_path + "ClassD.m" , act_path + "ClassD.m" )); + EXPECT(files_equal(exp_path + "ns1ClassA.m" , act_path + "ns1ClassA.m" )); + EXPECT(files_equal(exp_path + "ns1ClassB.m" , act_path + "ns1ClassB.m" )); + EXPECT(files_equal(exp_path + "ns2ClassA.m" , act_path + "ns2ClassA.m" )); + EXPECT(files_equal(exp_path + "ns2ClassC.m" , act_path + "ns2ClassC.m" )); + EXPECT(files_equal(exp_path + "ns2ns3ClassB.m" , act_path + "ns2ns3ClassB.m" )); + EXPECT(files_equal(exp_path + "testNamespaces_wrapper.cpp" , act_path + "testNamespaces_wrapper.cpp" )); } /* ************************************************************************* */ @@ -255,87 +242,18 @@ TEST( wrap, matlab_code ) { string path = topdir + "/wrap"; // clean out previous generated code - fs::remove_all("actual"); + fs::remove_all("actual"); // emit MATLAB code // make_geometry will not compile, use make testwrap to generate real make - module.matlab_code("mex", "actual", "mexa64", headerPath, "-O5"); - string epath = path + "/tests/expected/"; - string apath = "actual/"; - - EXPECT(files_equal(epath + "Makefile" , apath + "Makefile" )); - EXPECT(files_equal(epath + "make_geometry.m" , apath + "make_geometry.m" )); - EXPECT(files_equal(epath + "new_Point2.cpp" , apath + "new_Point2.cpp" )); - EXPECT(files_equal(epath + "new_Point2.m" , apath + "new_Point2.m" )); - EXPECT(files_equal(epath + "new_Point3.cpp" , apath + "new_Point3.cpp" )); - EXPECT(files_equal(epath + "new_Point3.m" , apath + "new_Point3.m" )); - EXPECT(files_equal(epath + "new_Test.cpp" , apath + "new_Test.cpp" )); - EXPECT(files_equal(epath + "new_Test.m" , apath + "new_Test.m" )); - - EXPECT(files_equal(epath + "Point3_staticFunction.cpp" , apath + "Point3_staticFunction.cpp" )); - EXPECT(files_equal(epath + "Point3_staticFunction.m" , apath + "Point3_staticFunction.m" )); - EXPECT(files_equal(epath + "Point3_StaticFunctionRet.cpp" , apath + "Point3_StaticFunctionRet.cpp" )); - EXPECT(files_equal(epath + "Point3_StaticFunctionRet.m" , apath + "Point3_StaticFunctionRet.m" )); - - EXPECT(files_equal(epath + "@Point2/argChar.cpp" , apath + "@Point2/argChar.cpp" )); - EXPECT(files_equal(epath + "@Point2/argChar.m" , apath + "@Point2/argChar.m" )); - EXPECT(files_equal(epath + "@Point2/argUChar.cpp" , apath + "@Point2/argUChar.cpp" )); - EXPECT(files_equal(epath + "@Point2/argUChar.m" , apath + "@Point2/argUChar.m" )); - EXPECT(files_equal(epath + "@Point2/dim.cpp" , apath + "@Point2/dim.cpp" )); - EXPECT(files_equal(epath + "@Point2/dim.m" , apath + "@Point2/dim.m" )); - EXPECT(files_equal(epath + "@Point2/Point2.m" , apath + "@Point2/Point2.m" )); - EXPECT(files_equal(epath + "@Point2/returnChar.cpp" , apath + "@Point2/returnChar.cpp" )); - EXPECT(files_equal(epath + "@Point2/returnChar.m" , apath + "@Point2/returnChar.m" )); - EXPECT(files_equal(epath + "@Point2/vectorConfusion.cpp" , apath + "@Point2/vectorConfusion.cpp" )); - EXPECT(files_equal(epath + "@Point2/vectorConfusion.m" , apath + "@Point2/vectorConfusion.m" )); - EXPECT(files_equal(epath + "@Point2/x.cpp" , apath + "@Point2/x.cpp" )); - EXPECT(files_equal(epath + "@Point2/x.m" , apath + "@Point2/x.m" )); - EXPECT(files_equal(epath + "@Point2/y.cpp" , apath + "@Point2/y.cpp" )); - EXPECT(files_equal(epath + "@Point2/y.m" , apath + "@Point2/y.m" )); - EXPECT(files_equal(epath + "@Point3/norm.cpp" , apath + "@Point3/norm.cpp" )); - EXPECT(files_equal(epath + "@Point3/norm.m" , apath + "@Point3/norm.m" )); - EXPECT(files_equal(epath + "@Point3/Point3.m" , apath + "@Point3/Point3.m" )); - - EXPECT(files_equal(epath + "@Test/arg_EigenConstRef.cpp" , apath + "@Test/arg_EigenConstRef.cpp" )); - EXPECT(files_equal(epath + "@Test/arg_EigenConstRef.m" , apath + "@Test/arg_EigenConstRef.m" )); - EXPECT(files_equal(epath + "@Test/create_MixedPtrs.cpp" , apath + "@Test/create_MixedPtrs.cpp" )); - EXPECT(files_equal(epath + "@Test/create_MixedPtrs.m" , apath + "@Test/create_MixedPtrs.m" )); - EXPECT(files_equal(epath + "@Test/create_ptrs.cpp" , apath + "@Test/create_ptrs.cpp" )); - EXPECT(files_equal(epath + "@Test/create_ptrs.m" , apath + "@Test/create_ptrs.m" )); - EXPECT(files_equal(epath + "@Test/print.cpp" , apath + "@Test/print.cpp" )); - EXPECT(files_equal(epath + "@Test/print.m" , apath + "@Test/print.m" )); - EXPECT(files_equal(epath + "@Test/return_bool.cpp" , apath + "@Test/return_bool.cpp" )); - EXPECT(files_equal(epath + "@Test/return_bool.m" , apath + "@Test/return_bool.m" )); - EXPECT(files_equal(epath + "@Test/return_double.cpp" , apath + "@Test/return_double.cpp" )); - EXPECT(files_equal(epath + "@Test/return_double.m" , apath + "@Test/return_double.m" )); - EXPECT(files_equal(epath + "@Test/return_field.cpp" , apath + "@Test/return_field.cpp" )); - EXPECT(files_equal(epath + "@Test/return_field.m" , apath + "@Test/return_field.m" )); - EXPECT(files_equal(epath + "@Test/return_int.cpp" , apath + "@Test/return_int.cpp" )); - EXPECT(files_equal(epath + "@Test/return_int.m" , apath + "@Test/return_int.m" )); - EXPECT(files_equal(epath + "@Test/return_matrix1.cpp" , apath + "@Test/return_matrix1.cpp" )); - EXPECT(files_equal(epath + "@Test/return_matrix1.m" , apath + "@Test/return_matrix1.m" )); - EXPECT(files_equal(epath + "@Test/return_matrix2.cpp" , apath + "@Test/return_matrix2.cpp" )); - EXPECT(files_equal(epath + "@Test/return_matrix2.m" , apath + "@Test/return_matrix2.m" )); - EXPECT(files_equal(epath + "@Test/return_pair.cpp" , apath + "@Test/return_pair.cpp" )); - EXPECT(files_equal(epath + "@Test/return_pair.m" , apath + "@Test/return_pair.m" )); - EXPECT(files_equal(epath + "@Test/return_Point2Ptr.cpp" , apath + "@Test/return_Point2Ptr.cpp" )); - EXPECT(files_equal(epath + "@Test/return_Point2Ptr.m" , apath + "@Test/return_Point2Ptr.m" )); - EXPECT(files_equal(epath + "@Test/return_ptrs.cpp" , apath + "@Test/return_ptrs.cpp" )); - EXPECT(files_equal(epath + "@Test/return_ptrs.m" , apath + "@Test/return_ptrs.m" )); - EXPECT(files_equal(epath + "@Test/return_size_t.cpp" , apath + "@Test/return_size_t.cpp" )); - EXPECT(files_equal(epath + "@Test/return_size_t.m" , apath + "@Test/return_size_t.m" )); - EXPECT(files_equal(epath + "@Test/return_string.cpp" , apath + "@Test/return_string.cpp" )); - EXPECT(files_equal(epath + "@Test/return_string.m" , apath + "@Test/return_string.m" )); - EXPECT(files_equal(epath + "@Test/return_Test.cpp" , apath + "@Test/return_Test.cpp" )); - EXPECT(files_equal(epath + "@Test/return_Test.m" , apath + "@Test/return_Test.m" )); - EXPECT(files_equal(epath + "@Test/return_TestPtr.cpp" , apath + "@Test/return_TestPtr.cpp" )); - EXPECT(files_equal(epath + "@Test/return_TestPtr.m" , apath + "@Test/return_TestPtr.m" )); - EXPECT(files_equal(epath + "@Test/return_vector1.cpp" , apath + "@Test/return_vector1.cpp" )); - EXPECT(files_equal(epath + "@Test/return_vector1.m" , apath + "@Test/return_vector1.m" )); - EXPECT(files_equal(epath + "@Test/return_vector2.cpp" , apath + "@Test/return_vector2.cpp" )); - EXPECT(files_equal(epath + "@Test/return_vector2.m" , apath + "@Test/return_vector2.m" )); - EXPECT(files_equal(epath + "@Test/Test.m" , apath + "@Test/Test.m" )); + module.matlab_code("actual", headerPath); + string epath = path + "/tests/expected/"; + string apath = "actual/"; + EXPECT(files_equal(epath + "geometry_wrapper.cpp" , apath + "geometry_wrapper.cpp" )); + EXPECT(files_equal(epath + "Point2.m" , apath + "Point2.m" )); + EXPECT(files_equal(epath + "Point3.m" , apath + "Point3.m" )); + EXPECT(files_equal(epath + "Test.m" , apath + "Test.m" )); } /* ************************************************************************* */ From 8a8b27005f32d4d2d5ca957da74e1e0b297e4a83 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 9 Jul 2012 00:02:43 +0000 Subject: [PATCH 579/914] wrap_mods_inheritance branch - Can now pass derived classes in as base class arguments (i.e. pass gtsamPose2 where gtsamValues.insert expects gtsamValue) --- gtsam.h | 26 ++++++++++++------------ wrap/Class.cpp | 46 +++++++++++++++++++++++++----------------- wrap/Constructor.cpp | 18 ++++++++++++++--- wrap/Constructor.h | 4 ++-- wrap/Deconstructor.cpp | 4 ++-- wrap/Deconstructor.h | 3 +-- wrap/matlab.h | 4 ++-- wrap/utilities.cpp | 16 +++++++++------ wrap/utilities.h | 15 +++++++++++++- 9 files changed, 86 insertions(+), 50 deletions(-) diff --git a/gtsam.h b/gtsam.h index 2c2e41e66..98382283f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -65,14 +65,13 @@ namespace gtsam { //************************************************************************* class Value { + // No constructors because this is an abstract class + // Testable void print(string s) const; - bool equals(const gtsam::Value& expected, double tol) const; // Manifold size_t dim() const; - gtsam::Value retract(Vector v) const; - Vector localCoordinates(const gtsam::Value& t2) const; }; class LieVector : gtsam::Value { @@ -107,7 +106,7 @@ class LieVector : gtsam::Value { // geometry //************************************************************************* -class Point2 { +class Point2 : gtsam::Value { // Standard Constructors Point2(); Point2(double x, double y); @@ -139,7 +138,7 @@ class Point2 { Vector vector() const; }; -class StereoPoint2 { +class StereoPoint2 : gtsam::Value { // Standard Constructors StereoPoint2(); StereoPoint2(double uL, double uR, double v); @@ -168,7 +167,7 @@ class StereoPoint2 { Vector vector() const; }; -class Point3 { +class Point3 : gtsam::Value { // Standard Constructors Point3(); Point3(double x, double y, double z); @@ -201,7 +200,7 @@ class Point3 { double z() const; }; -class Rot2 { +class Rot2 : gtsam::Value { // Standard Constructors and Named Constructors Rot2(); Rot2(double theta); @@ -243,7 +242,7 @@ class Rot2 { Matrix matrix() const; }; -class Rot3 { +class Rot3 : gtsam::Value { // Standard Constructors and Named Constructors Rot3(); Rot3(Matrix R); @@ -295,7 +294,7 @@ class Rot3 { // Vector toQuaternion() const; // FIXME: Can't cast to Vector properly }; -class Pose2 { +class Pose2 : gtsam::Value { // Standard Constructor Pose2(); Pose2(double x, double y, double theta); @@ -341,7 +340,7 @@ class Pose2 { Matrix matrix() const; }; -class Pose3 { +class Pose3 : gtsam::Value { // Standard Constructors Pose3(); Pose3(const gtsam::Pose3& pose); @@ -389,7 +388,7 @@ class Pose3 { double range(const gtsam::Pose3& pose); // FIXME: shadows other range }; -class Cal3_S2 { +class Cal3_S2 : gtsam::Value { // Standard Constructors Cal3_S2(); Cal3_S2(double fx, double fy, double s, double u0, double v0); @@ -439,7 +438,7 @@ class Cal3_S2Stereo { double baseline() const; }; -class CalibratedCamera { +class CalibratedCamera : gtsam::Value { // Standard Constructors and Named Constructors CalibratedCamera(); CalibratedCamera(const gtsam::Pose3& pose); @@ -469,7 +468,7 @@ class CalibratedCamera { double range(const gtsam::Point3& p) const; // TODO: Other overloaded range methods }; -class SimpleCamera { +class SimpleCamera : gtsam::Value { // Standard Constructors and Named Constructors SimpleCamera(); SimpleCamera(const gtsam::Pose3& pose); @@ -942,6 +941,7 @@ class Values { Values(); size_t size() const; void print(string s) const; + void insert(size_t j, const gtsam::Value& value); bool exists(size_t j) const; }; diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 2688f625e..ebaefc4a8 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -36,6 +36,8 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil // get the name of actual matlab object const string matlabName = qualifiedName(), cppName = qualifiedName("::"); + const string matlabBaseName = wrap::qualifiedName("", qualifiedParent); + const string cppBaseName = wrap::qualifiedName("::", qualifiedParent); // emit class proxy code // we want our class to inherit the handle class for memory purposes @@ -65,15 +67,18 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil BOOST_FOREACH(ArgumentList a, constructor.args_list) { const int id = functionNames.size(); - constructor.proxy_fragment(proxyFile, wrapperName, matlabName, id, a); + constructor.proxy_fragment(proxyFile, wrapperName, matlabName, matlabBaseName, id, a); const string wrapFunctionName = constructor.wrapper_fragment(wrapperFile, - cppName, matlabName, id, using_namespaces, includes, a); + cppName, matlabName, cppBaseName, id, using_namespaces, a); wrapperFile.oss << "\n"; functionNames.push_back(wrapFunctionName); } proxyFile.oss << " else\n"; proxyFile.oss << " error('Arguments do not match any overload of " << matlabName << " constructor');" << endl; proxyFile.oss << " end\n"; + if(!qualifiedParent.empty()) + proxyFile.oss << " obj = obj@" << matlabBaseName << "(uint64(" << ptr_constructor_key << "), base_ptr);\n"; + proxyFile.oss << " obj.ptr_" << matlabName << " = my_ptr;\n"; proxyFile.oss << " end\n\n"; // Deconstructor @@ -81,8 +86,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil const int id = functionNames.size(); deconstructor.proxy_fragment(proxyFile, wrapperName, matlabName, id); proxyFile.oss << "\n"; - const string functionName = deconstructor.wrapper_fragment(wrapperFile, - cppName, matlabName, id, using_namespaces, includes); + const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabName, id, using_namespaces); wrapperFile.oss << "\n"; functionNames.push_back(functionName); } @@ -123,41 +127,45 @@ string Class::qualifiedName(const string& delim) const { /* ************************************************************************* */ string Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& wrapperName, int id) const { - - static const uint64_t ptr_constructor_key = - (uint64_t('G') << 56) | - (uint64_t('T') << 48) | - (uint64_t('S') << 40) | - (uint64_t('A') << 32) | - (uint64_t('M') << 24) | - (uint64_t('p') << 16) | - (uint64_t('t') << 8) | - (uint64_t('r')); const string matlabName = qualifiedName(), cppName = qualifiedName("::"); - const string wrapFunctionName = matlabName + "_collectorInsert_" + boost::lexical_cast(id); + const string wrapFunctionName = matlabName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(id); + const string baseMatlabName = wrap::qualifiedName("", qualifiedParent); + const string baseCppName = wrap::qualifiedName("::", qualifiedParent); // MATLAB constructor that assigns pointer to matlab object then calls c++ // function to add the object to the collector. proxyFile.oss << " if nargin == 2 && isa(varargin{1}, 'uint64') && "; proxyFile.oss << "varargin{1} == uint64(" << ptr_constructor_key << ")\n"; - proxyFile.oss << " obj.self = varargin{2};\n"; - proxyFile.oss << " " << wrapperName << "(" << id << ", obj.self);\n"; + proxyFile.oss << " my_ptr = varargin{2};\n"; + if(qualifiedParent.empty()) // If this class has a base class, we'll get a base class pointer back + proxyFile.oss << " "; + else + proxyFile.oss << " base_ptr = "; + proxyFile.oss << wrapperName << "(" << id << ", my_ptr);\n"; // Call collector insert and get base class ptr // C++ function to add pointer from MATLAB to collector. The pointer always // comes from a C++ return value; this mechanism allows the object to be added - // to a collector in a different wrap module. + // to a collector in a different wrap module. If this class has a base class, + // a new pointer to the base class is allocated and returned. wrapperFile.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; wrapperFile.oss << "{\n"; wrapperFile.oss << " mexAtExit(&_deleteAllObjects);\n"; generateUsingNamespace(wrapperFile, using_namespaces); // Typedef boost::shared_ptr - wrapperFile.oss << " typedef boost::shared_ptr<" << cppName << "> Shared;\n"; + wrapperFile.oss << " typedef boost::shared_ptr<" << cppName << "> Shared;\n"; wrapperFile.oss << "\n"; // Get self pointer passed in wrapperFile.oss << " Shared *self = *reinterpret_cast (mxGetData(in[0]));\n"; // Add to collector wrapperFile.oss << " collector_" << matlabName << ".insert(self);\n"; + // If we have a base class, return the base class pointer (MATLAB will call the base class collectorInsertAndMakeBase to add this to the collector and recurse the heirarchy) + if(!qualifiedParent.empty()) { + wrapperFile.oss << "\n"; + wrapperFile.oss << " typedef boost::shared_ptr<" << baseCppName << "> SharedBase;\n"; + wrapperFile.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);\n"; + wrapperFile.oss << " *reinterpret_cast(mxGetData(out[0])) = new SharedBase(*self);\n"; + } wrapperFile.oss << "}\n"; return wrapFunctionName; diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 63ea15146..aaa7f1c8e 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -37,7 +37,7 @@ string Constructor::matlab_wrapper_name(const string& className) const { /* ************************************************************************* */ void Constructor::proxy_fragment(FileWriter& file, const std::string& wrapperName, - const string& className, const int id, const ArgumentList args) const { + const string& matlabName, const string& matlabBaseName, const int id, const ArgumentList args) const { size_t nrArgs = args.size(); // check for number of arguments... file.oss << " elseif nargin == " << nrArgs; @@ -50,7 +50,11 @@ void Constructor::proxy_fragment(FileWriter& file, const std::string& wrapperNam first=false; } // emit code for calling constructor - file.oss << "\n obj.self = " << wrapperName << "(" << id; + if(matlabBaseName.empty()) + file.oss << "\n my_ptr = "; + else + file.oss << "\n [ my_ptr, base_ptr ] = "; + file.oss << wrapperName << "(" << id; // emit constructor arguments for(size_t i=0;i& using_namespaces, - const vector& includes, const ArgumentList& al) const { const string wrapFunctionName = matlabClassName + "_constructor_" + boost::lexical_cast(id); @@ -89,6 +93,14 @@ string Constructor::wrapper_fragment(FileWriter& file, file.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);" << endl; file.oss << " *reinterpret_cast (mxGetData(out[0])) = self;" << endl; + // If we have a base class, return the base class pointer (MATLAB will call the base class collectorInsertAndMakeBase to add this to the collector and recurse the heirarchy) + if(!cppBaseClassName.empty()) { + file.oss << "\n"; + file.oss << " typedef boost::shared_ptr<" << cppBaseClassName << "> SharedBase;\n"; + file.oss << " out[1] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);\n"; + file.oss << " *reinterpret_cast(mxGetData(out[1])) = new SharedBase(*self);\n"; + } + file.oss << "}" << endl; return wrapFunctionName; diff --git a/wrap/Constructor.h b/wrap/Constructor.h index 4a9e31f9b..46f5c5db9 100644 --- a/wrap/Constructor.h +++ b/wrap/Constructor.h @@ -49,16 +49,16 @@ struct Constructor { * if nargin == 2, obj.self = new_Pose3_RP(varargin{1},varargin{2}); end */ void proxy_fragment(FileWriter& file, const std::string& wrapperName, - const std::string& className, const int id, + const std::string& className, const std::string& matlabBaseName, const int id, const ArgumentList args) const; /// cpp wrapper std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, const std::string& matlabClassName, + const std::string& cppBaseClassName, int id, const std::vector& using_namespaces, - const std::vector& includes, const ArgumentList& al) const; /// constructor function diff --git a/wrap/Deconstructor.cpp b/wrap/Deconstructor.cpp index 335488cf5..aa4969af5 100644 --- a/wrap/Deconstructor.cpp +++ b/wrap/Deconstructor.cpp @@ -39,7 +39,7 @@ void Deconstructor::proxy_fragment(FileWriter& file, const std::string& qualifiedMatlabName, int id) const { file.oss << " function delete(obj)\n"; - file.oss << " " << wrapperName << "(" << id << ", obj.self);\n"; + file.oss << " " << wrapperName << "(" << id << ", obj.ptr_" << qualifiedMatlabName << ");\n"; file.oss << " end\n"; } @@ -48,7 +48,7 @@ string Deconstructor::wrapper_fragment(FileWriter& file, const string& cppClassName, const string& matlabClassName, int id, - const vector& using_namespaces, const vector& includes) const { + const vector& using_namespaces) const { const string matlabName = matlab_wrapper_name(matlabClassName); diff --git a/wrap/Deconstructor.h b/wrap/Deconstructor.h index 363f986e6..035ff74df 100644 --- a/wrap/Deconstructor.h +++ b/wrap/Deconstructor.h @@ -55,8 +55,7 @@ struct Deconstructor { const std::string& cppClassName, const std::string& matlabClassName, int id, - const std::vector& using_namespaces, - const std::vector& includes) const; + const std::vector& using_namespaces) const; }; } // \namespace wrap diff --git a/wrap/matlab.h b/wrap/matlab.h index 90f706a37..4033844e4 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -56,7 +56,7 @@ using namespace boost; // not usual, but for conciseness of generated code #endif // "Unique" key to signal calling the matlab object constructor with a raw pointer -// Also present in Class.cpp +// Also present in utilities.h static const uint64_t ptr_constructor_key = (uint64_t('G') << 56) | (uint64_t('T') << 48) | @@ -383,7 +383,7 @@ mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *cla template boost::shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& propertyName) { - mxArray* mxh = mxGetProperty(obj,0, propertyName); + mxArray* mxh = mxGetProperty(obj,0, propertyName.c_str()); if (mxGetClassID(mxh) != mxUINT32OR64_CLASS || mxIsComplex(mxh) || mxGetM(mxh) != 1 || mxGetN(mxh) != 1) error( "Parameter is not an Shared type."); diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index fdad6de7c..94117b5d3 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -137,12 +137,16 @@ void generateIncludes(FileWriter& file, const string& class_name, /* ************************************************************************* */ string qualifiedName(const string& separator, const vector& names, const string& finalName) { string result; - for(size_t i = 0; i < names.size() - 1; ++i) - result += (names[i] + separator); - if(finalName.empty()) - result += names.back(); - else - result += (names.back() + separator + finalName); + if(!names.empty()) { + for(size_t i = 0; i < names.size() - 1; ++i) + result += (names[i] + separator); + if(finalName.empty()) + result += names.back(); + else + result += (names.back() + separator + finalName); + } else if(!finalName.empty()) { + result = finalName; + } return result; } diff --git a/wrap/utilities.h b/wrap/utilities.h index 6652cc8fd..b0c9fb208 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -21,6 +21,7 @@ #include #include #include +#include #include "FileWriter.h" @@ -65,7 +66,19 @@ public: return ("Missing dependency " + dependency_ + " in " + location_).c_str(); } }; - + +/** Special "magic number" passed into MATLAB constructor to indicate creating + * a MATLAB object from a shared_ptr allocated in C++ + */ +static const uint64_t ptr_constructor_key = + (uint64_t('G') << 56) | + (uint64_t('T') << 48) | + (uint64_t('S') << 40) | + (uint64_t('A') << 32) | + (uint64_t('M') << 24) | + (uint64_t('p') << 16) | + (uint64_t('t') << 8) | + (uint64_t('r')); /** * read contents of a file into a std::string From e451a959913f0629ee895cb4487beae6d65c6895 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 9 Jul 2012 17:14:21 +0000 Subject: [PATCH 580/914] Added wrap target to exported/installed targets --- wrap/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 866ee7a3f..4d6e81d2f 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -11,9 +11,11 @@ gtsam_assign_source_folders(${wrap_srcs} ${wrap_headers}) add_executable(wrap wrap.cpp) target_link_libraries(wrap wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) -# Install wrap binary +# Install wrap binary and export target if (GTSAM_INSTALL_WRAP) - install(TARGETS wrap DESTINATION bin) + install(TARGETS wrap EXPORT GTSAM-exports DESTINATION bin) + list(APPEND GTSAM_EXPORTED_TARGETS wrap) + set(GTSAM_EXPORTED_TARGETS "${GTSAM_EXPORTED_TARGETS}" PARENT_SCOPE) endif(GTSAM_INSTALL_WRAP) # Install matlab header From 280bbbb54ea14987c2660f77891c5397924d9228 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 9 Jul 2012 18:51:07 +0000 Subject: [PATCH 581/914] Wrapped Ordering::InvertedMap --- gtsam.h | 25 +++++++++++++++++++------ gtsam/nonlinear/Ordering.h | 5 ++++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/gtsam.h b/gtsam.h index f5d245111..767944d29 100644 --- a/gtsam.h +++ b/gtsam.h @@ -6,13 +6,16 @@ * * Requirements: * Classes must start with an uppercase letter - * Only one Method/Constructor per line + * - Can wrap a typedef + * Only one Method/Constructor per line, though methods/constructors can extend across multiple lines * Methods can return * - Eigen types: Matrix, Vector * - C/C++ basic types: string, bool, size_t, size_t, double, char, unsigned char * - void * - Any class with which be copied with boost::make_shared() * - boost::shared_ptr of any object type + * Methods cannot return + * - const references of anything * Limitations on methods * - Parsing does not support overloading * - There can only be one method (static or otherwise) with a given name @@ -35,7 +38,7 @@ * Namespace usage * - Namespaces can be specified for classes in arguments and return values * - In each case, the namespace must be fully specified, e.g., "namespace1::namespace2::ClassName" - * Using namespace + * Using namespace: FIXME: this functionality is currently broken * - To use a namespace (e.g., generate a "using namespace x" line in cpp files), add "using namespace x;" * - This declaration applies to all classes *after* the declaration, regardless of brackets * Includes in C++ wrappers @@ -46,14 +49,12 @@ * - Both classes and namespace accept exactly one namespace * Overriding type dependency checks * - If you are using a class 'OtherClass' not wrapped in this definition file, add "class OtherClass;" to avoid a dependency error - * - Limitation: this only works if the class does not need a namespace specification */ /** * Status: * - TODO: global functions * - TODO: default values for arguments - * - TODO: overloaded functions * - TODO: signatures for constructors can be ambiguous if two types have the same first letter * - TODO: Handle gtsam::Rot3M conversions to quaternions */ @@ -909,8 +910,20 @@ class Ordering { void insert(size_t key, size_t order); void push_back(size_t key); void permuteWithInverse(const gtsam::Permutation& inversePermutation); - // FIXME: Wrap InvertedMap as well - //InvertedMap invert() const; + gtsam::InvertedOrdering invert() const; +}; + +#include +class InvertedOrdering { + InvertedOrdering(); + + // FIXME: add bracket operator overload + + bool empty() const; + size_t size() const; + bool count(size_t index) const; // Use as a boolean function with implicit cast + + void clear(); }; class NonlinearFactorGraph { diff --git a/gtsam/nonlinear/Ordering.h b/gtsam/nonlinear/Ordering.h index 098976a36..c2bac18f8 100644 --- a/gtsam/nonlinear/Ordering.h +++ b/gtsam/nonlinear/Ordering.h @@ -233,7 +233,10 @@ private: ar & BOOST_SERIALIZATION_NVP(order_); ar & BOOST_SERIALIZATION_NVP(nVars_); } -}; +}; // \class Ordering + +// typedef for use with matlab +typedef Ordering::InvertedMap InvertedOrdering; /** * @class Unordered From ee51dfd68bf0fe3c05dee1d0a29f6c1ce7eb5590 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 9 Jul 2012 20:04:06 +0000 Subject: [PATCH 582/914] Fixing usage of globals in matlab examples/tests. Currently, tests fail due to handling of noisemodel --- matlab/VisualISAMGenerateData.m | 2 +- matlab/VisualISAMInitialize.m | 8 ++++---- matlab/examples/LocalizationExample.m | 4 ++-- matlab/examples/OdometryExample.m | 4 ++-- matlab/examples/PlanarSLAMExample.m | 6 +++--- matlab/examples/PlanarSLAMExample_sampling.m | 8 ++++---- matlab/examples/Pose2SLAMExample.m | 6 +++--- matlab/examples/Pose2SLAMExample_advanced.m | 6 +++--- matlab/examples/Pose2SLAMExample_circle.m | 4 ++-- matlab/examples/Pose2SLAMExample_graph.m | 4 ++-- matlab/examples/Pose2SLAMwSPCG.m | 6 +++--- matlab/examples/Pose3SLAMExample.m | 4 ++-- matlab/examples/Pose3SLAMExample_graph.m | 2 +- matlab/examples/SBAExample.m | 6 +++--- matlab/examples/SFMExample.m | 6 +++--- matlab/examples/StereoVOExample.m | 2 +- matlab/examples/StereoVOExample_large.m | 2 +- matlab/load3D.m | 4 ++-- matlab/tests/testJacobianFactor.m | 4 ++-- matlab/tests/testKalmanFilter.m | 4 ++-- matlab/tests/testLocalizationExample.m | 4 ++-- matlab/tests/testOdometryExample.m | 4 ++-- matlab/tests/testPlanarSLAMExample.m | 6 +++--- matlab/tests/testPose2SLAMExample.m | 6 +++--- matlab/tests/testPose3SLAMExample.m | 4 ++-- matlab/tests/testSFMExample.m | 6 +++--- matlab/tests/testStereoVOExample.m | 2 +- 27 files changed, 62 insertions(+), 62 deletions(-) diff --git a/matlab/VisualISAMGenerateData.m b/matlab/VisualISAMGenerateData.m index 3c55417d9..1c71185e2 100644 --- a/matlab/VisualISAMGenerateData.m +++ b/matlab/VisualISAMGenerateData.m @@ -29,7 +29,7 @@ data.K = truth.K; for i=1:options.nrCameras theta = (i-1)*2*pi/options.nrCameras; t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - truth.cameras{i} = gtsamSimpleCamera_lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), truth.K); + truth.cameras{i} = gtsamSimpleCamera.Lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), truth.K); % Create measurements for j=1:nrPoints % All landmarks seen in every frame diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index 139d40e65..b2b960a7b 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -6,10 +6,10 @@ function [noiseModels,isam,result] = VisualISAMInitialize(data,truth,options) isam = visualSLAMISAM(options.reorderInterval); %% Set Noise parameters -noiseModels.pose = gtsamnoiseModelDiagonal_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -noiseModels.odometry = gtsamnoiseModelDiagonal_Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -noiseModels.point = gtsamnoiseModelIsotropic_Sigma(3, 0.1); -noiseModels.measurement = gtsamnoiseModelIsotropic_Sigma(2, 1.0); +noiseModels.pose = gtsamnoiseModelDiagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.odometry = gtsamnoiseModelDiagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.point = gtsamnoiseModelIsotropic.Sigma(3, 0.1); +noiseModels.measurement = gtsamnoiseModelIsotropic.Sigma(2, 1.0); %% Add constraints/priors % TODO: should not be from ground truth! diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m index d3e563dd4..3f48bb8e4 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/LocalizationExample.m @@ -20,13 +20,13 @@ graph = pose2SLAMGraph; %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add three "GPS" measurements % We use Pose2 Priors here with high variance on theta -noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.1; 10]); +noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.1; 10]); graph.addPosePrior(1, gtsamPose2(0.0, 0.0, 0.0), noiseModel); graph.addPosePrior(2, gtsamPose2(2.0, 0.0, 0.0), noiseModel); graph.addPosePrior(3, gtsamPose2(4.0, 0.0, 0.0), noiseModel); diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index b3cbff6a2..e90550152 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -20,12 +20,12 @@ graph = pose2SLAMGraph; %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add two odometry factors odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index 499845eda..7557bd0ba 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -28,18 +28,18 @@ graph = planarSLAMGraph; %% Add prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph %% Add odometry odometry = gtsamPose2(2.0, 0.0, 0.0); -odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(i1, i2, odometry, odometryNoise); graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Add bearing/range measurement factors degrees = pi/180; -noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.2]); +noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.2]); graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); diff --git a/matlab/examples/PlanarSLAMExample_sampling.m b/matlab/examples/PlanarSLAMExample_sampling.m index 861e56db9..560ab7ace 100644 --- a/matlab/examples/PlanarSLAMExample_sampling.m +++ b/matlab/examples/PlanarSLAMExample_sampling.m @@ -15,22 +15,22 @@ i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); graph = planarSLAMGraph; priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph odometry = gtsamPose2(2.0, 0.0, 0.0); -odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(i1, i2, odometry, odometryNoise); graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Except, for measurements we offer a choice j1 = symbol('l',1); j2 = symbol('l',2); degrees = pi/180; -noiseModel = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.2]); +noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.2]); if 1 graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); else - bearingModel = gtsamnoiseModelDiagonal_Sigmas(0.1); + bearingModel = gtsamnoiseModelDiagonal.Sigmas(0.1); graph.addBearing(i1, j1, gtsamRot2(45*degrees), bearingModel); graph.addBearing(i2, j1, gtsamRot2(90*degrees), bearingModel); end diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m index 776260e3f..9cb5b8af4 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/examples/Pose2SLAMExample.m @@ -24,19 +24,19 @@ graph = pose2SLAMGraph; %% Add prior % gaussian for prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); graph.addRelativePose(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addRelativePose(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addRelativePose(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +model = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); % print diff --git a/matlab/examples/Pose2SLAMExample_advanced.m b/matlab/examples/Pose2SLAMExample_advanced.m index 843ae7e1c..45d288e50 100644 --- a/matlab/examples/Pose2SLAMExample_advanced.m +++ b/matlab/examples/Pose2SLAMExample_advanced.m @@ -25,20 +25,20 @@ graph = pose2SLAMGraph; %% Add prior % gaussian for prior -priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add measurements % general noisemodel for measurements -measurementNoise = gtsamnoiseModelDiagonal_Sigmas([0.1; 0.2]); +measurementNoise = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.2]); % print graph.print('full graph'); diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m index e05a77186..c089f5949 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/examples/Pose2SLAMExample_circle.m @@ -11,7 +11,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create a hexagon of poses -hexagon = pose2SLAMValues_Circle(6,1.0); +hexagon = pose2SLAMValues.Circle(6,1.0); p0 = hexagon.pose(0); p1 = hexagon.pose(1); @@ -19,7 +19,7 @@ p1 = hexagon.pose(1); fg = pose2SLAMGraph; fg.addPoseConstraint(0, p0); delta = p0.between(p1); -covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 5*pi/180]); +covariance = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 5*pi/180]); fg.addRelativePose(0,1, delta, covariance); fg.addRelativePose(1,2, delta, covariance); fg.addRelativePose(2,3, delta, covariance); diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index a2645a593..258730aaa 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -11,13 +11,13 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Initialize graph, initial estimate, and odometry noise -model = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 5*pi/180]); +model = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 5*pi/180]); [graph,initial]=load2D('../../examples/Data/w100-odom.graph',model); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.01; 0.01; 0.01]); +priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.01; 0.01; 0.01]); graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph %% Plot Initial Estimate diff --git a/matlab/examples/Pose2SLAMwSPCG.m b/matlab/examples/Pose2SLAMwSPCG.m index 3d0ce8da7..3e773689b 100644 --- a/matlab/examples/Pose2SLAMwSPCG.m +++ b/matlab/examples/Pose2SLAMwSPCG.m @@ -22,19 +22,19 @@ graph = pose2SLAMGraph; %% Add prior % gaussian for prior priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal_Sigmas([0.3; 0.3; 0.1]); +priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odometryNoise = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -model = gtsamnoiseModelDiagonal_Sigmas([0.2; 0.2; 0.1]); +model = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); % print diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/examples/Pose3SLAMExample.m index c335203eb..c1328585e 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -11,7 +11,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create a hexagon of poses -hexagon = pose3SLAMValues_Circle(6,1.0); +hexagon = pose3SLAMValues.Circle(6,1.0); p0 = hexagon.pose(0); p1 = hexagon.pose(1); @@ -19,7 +19,7 @@ p1 = hexagon.pose(1); fg = pose3SLAMGraph; fg.addPoseConstraint(0, p0); delta = p0.between(p1); -covariance = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +covariance = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); fg.addRelativePose(0,1, delta, covariance); fg.addRelativePose(1,2, delta, covariance); fg.addRelativePose(2,3, delta, covariance); diff --git a/matlab/examples/Pose3SLAMExample_graph.m b/matlab/examples/Pose3SLAMExample_graph.m index f2c411d08..f39fc306b 100644 --- a/matlab/examples/Pose3SLAMExample_graph.m +++ b/matlab/examples/Pose3SLAMExample_graph.m @@ -16,7 +16,7 @@ N = 2500; filename = '../../examples/Data/sphere2500.txt'; %% Initialize graph, initial estimate, and odometry noise -model = gtsamnoiseModelDiagonal_Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +model = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); [graph,initial]=load3D(filename,model,true,N); %% Plot Initial Estimate diff --git a/matlab/examples/SBAExample.m b/matlab/examples/SBAExample.m index 9050d011d..82fdd4646 100644 --- a/matlab/examples/SBAExample.m +++ b/matlab/examples/SBAExample.m @@ -34,7 +34,7 @@ graph = sparseBAGraph; %% Add factors for all measurements -measurementNoise = gtsamnoiseModelIsotropic_Sigma(2,measurementNoiseSigma); +measurementNoise = gtsamnoiseModelIsotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; @@ -43,11 +43,11 @@ for i=1:length(data.Z) end %% Add Gaussian priors for a pose and a landmark to constrain the system -cameraPriorNoise = gtsamnoiseModelDiagonal_Sigmas(cameraNoiseSigmas); +cameraPriorNoise = gtsamnoiseModelDiagonal.Sigmas(cameraNoiseSigmas); firstCamera = gtsamSimpleCamera(truth.cameras{1}.pose, truth.K); graph.addSimpleCameraPrior(symbol('c',1), firstCamera, cameraPriorNoise); -pointPriorNoise = gtsamnoiseModelIsotropic_Sigma(3,pointNoiseSigma); +pointPriorNoise = gtsamnoiseModelIsotropic.Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Print the graph diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 277f31648..3eef9f916 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -32,7 +32,7 @@ poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; graph = visualSLAMGraph; %% Add factors for all measurements -measurementNoise = gtsamnoiseModelIsotropic_Sigma(2,measurementNoiseSigma); +measurementNoise = gtsamnoiseModelIsotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; @@ -41,9 +41,9 @@ for i=1:length(data.Z) end %% Add Gaussian priors for a pose and a landmark to constrain the system -posePriorNoise = gtsamnoiseModelDiagonal_Sigmas(poseNoiseSigmas); +posePriorNoise = gtsamnoiseModelDiagonal.Sigmas(poseNoiseSigmas); graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); -pointPriorNoise = gtsamnoiseModelIsotropic_Sigma(3,pointNoiseSigma); +pointPriorNoise = gtsamnoiseModelIsotropic.Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Print the graph diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index 99adaa82b..9cf838e94 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -31,7 +31,7 @@ graph.addPoseConstraint(x1, first_pose); %% Create realistic calibration and measurement noise model % format: fx fy skew cx cy baseline K = gtsamCal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); -stereo_model = gtsamnoiseModelDiagonal_Sigmas([1.0; 1.0; 1.0]); +stereo_model = gtsamnoiseModelDiagonal.Sigmas([1.0; 1.0; 1.0]); %% Add measurements % pose 1 diff --git a/matlab/examples/StereoVOExample_large.m b/matlab/examples/StereoVOExample_large.m index ef1211e2a..d57628fa1 100644 --- a/matlab/examples/StereoVOExample_large.m +++ b/matlab/examples/StereoVOExample_large.m @@ -14,7 +14,7 @@ % format: fx fy skew cx cy baseline calib = dlmread('../../examples/Data/VO_calibration.txt'); K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); -stereo_model = gtsamnoiseModelDiagonal_Sigmas([1.0; 1.0; 1.0]); +stereo_model = gtsamnoiseModelDiagonal.Sigmas([1.0; 1.0; 1.0]); %% create empty graph and values graph = visualSLAMGraph; diff --git a/matlab/load3D.m b/matlab/load3D.m index 6ba861a92..b457ea1af 100644 --- a/matlab/load3D.m +++ b/matlab/load3D.m @@ -29,7 +29,7 @@ for i=1:n i=v{2}; if (~successive & i Date: Mon, 9 Jul 2012 20:05:34 +0000 Subject: [PATCH 583/914] Updated notes on interface --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 767944d29..90cbe7bdf 100644 --- a/gtsam.h +++ b/gtsam.h @@ -22,6 +22,7 @@ * - Constness has no effect * Methods must start with a lowercase letter * Static methods must start with a letter (upper or lowercase) and use the "static" keyword + * - The function generated by wrap will start with an uppercase letter, regardless * Arguments to functions any of * - Eigen types: Matrix, Vector * - Eigen types and classes as an optionally const reference @@ -46,7 +47,6 @@ * - All namespaces must have angle brackets: * - To override, add a full include statement just before the class statement * - An override include can be added for a namespace by placing it just before the namespace statement - * - Both classes and namespace accept exactly one namespace * Overriding type dependency checks * - If you are using a class 'OtherClass' not wrapped in this definition file, add "class OtherClass;" to avoid a dependency error */ From dd8afd652797ccca14d7d18460941d221ae46c22 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 9 Jul 2012 20:17:49 +0000 Subject: [PATCH 584/914] Added clone() to Value --- gtsam/base/DerivedValue.h | 12 ++++++++++-- gtsam/base/Value.h | 5 ++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gtsam/base/DerivedValue.h b/gtsam/base/DerivedValue.h index 6c10a29f5..4f6dae9c7 100644 --- a/gtsam/base/DerivedValue.h +++ b/gtsam/base/DerivedValue.h @@ -16,7 +16,7 @@ */ #pragma once - +#include #include #include @@ -37,7 +37,8 @@ public: /** * Create a duplicate object returned as a pointer to the generic Value interface. - * For the sake of performance, this function use singleton pool allocator instead of the normal heap allocator + * For the sake of performance, this function use singleton pool allocator instead of the normal heap allocator. + * The result must be deleted with Value::deallocate_, not with the 'delete' operator. */ virtual Value* clone_() const { void *place = boost::singleton_pool::malloc(); @@ -53,6 +54,13 @@ public: boost::singleton_pool::free((void*)this); } + /** + * Clone this value (normal clone on the heap, delete with 'delete' operator) + */ + virtual boost::shared_ptr clone() const { + return boost::make_shared(static_cast(*this)); + } + /// equals implementing generic Value interface virtual bool equals_(const Value& p, double tol = 1e-9) const { // Cast the base class Value pointer to a derived class pointer diff --git a/gtsam/base/Value.h b/gtsam/base/Value.h index 394a11e72..8b19a6532 100644 --- a/gtsam/base/Value.h +++ b/gtsam/base/Value.h @@ -101,12 +101,15 @@ namespace gtsam { class Value { public: - /** Allocate and construct a clone of this value */ + /** Clone this value in a special memory pool, must be deleted with Value::deallocate_, *not* with the 'delete' operator. */ virtual Value* clone_() const = 0; /** Deallocate a raw pointer of this value */ virtual void deallocate_() const = 0; + /** Clone this value (normal clone on the heap, delete with 'delete' operator) */ + virtual boost::shared_ptr clone() const = 0; + /** Compare this Value with another for equality. */ virtual bool equals_(const Value& other, double tol = 1e-9) const = 0; From e915e666b5b8ea603162802a14aa357bb448ea54 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 9 Jul 2012 20:19:37 +0000 Subject: [PATCH 585/914] Can return abstract base classes from functions in matlab wrapper, i.e. Values::at --- gtsam.h | 55 ++++++++++++++++++++++++++----------------- wrap/Class.cpp | 8 ++++--- wrap/Class.h | 5 ++-- wrap/Method.cpp | 20 +++++++--------- wrap/Method.h | 4 +++- wrap/Module.cpp | 46 ++++++++++++++++++++++++++---------- wrap/Module.h | 10 +++++++- wrap/ReturnValue.cpp | 35 +++++++++++++++++++-------- wrap/ReturnValue.h | 11 ++++++++- wrap/StaticMethod.cpp | 17 +++++++------ wrap/StaticMethod.h | 4 +++- wrap/matlab.h | 32 ++++++++----------------- wrap/utilities.h | 46 ++++++++++++++++++------------------ 13 files changed, 176 insertions(+), 117 deletions(-) diff --git a/gtsam.h b/gtsam.h index 98382283f..fcf9e2343 100644 --- a/gtsam.h +++ b/gtsam.h @@ -13,12 +13,17 @@ * - void * - Any class with which be copied with boost::make_shared() * - boost::shared_ptr of any object type - * Limitations on methods - * - Parsing does not support overloading - * - There can only be one method (static or otherwise) with a given name + * Constructors + * - Overloads are supported + * - A class with no constructors can be returned from other functions but not allocated directly in MATLAB + * Methods * - Constness has no effect - * Methods must start with a lowercase letter - * Static methods must start with a letter (upper or lowercase) and use the "static" keyword + * - Must start with a lowercase letter + * - Overloads are supported + * Static methods + * - Must start with a letter (upper or lowercase) and use the "static" keyword + * - Static method names will be changed to start with an uppercase letter in the generated MATLAB interface + * - Overloads are supported * Arguments to functions any of * - Eigen types: Matrix, Vector * - Eigen types and classes as an optionally const reference @@ -44,17 +49,23 @@ * - To override, add a full include statement just before the class statement * - An override include can be added for a namespace by placing it just before the namespace statement * - Both classes and namespace accept exactly one namespace - * Overriding type dependency checks + * Using classes defined in other modules * - If you are using a class 'OtherClass' not wrapped in this definition file, add "class OtherClass;" to avoid a dependency error - * - Limitation: this only works if the class does not need a namespace specification + * Virtual inheritance + * - Specify fully-qualified base classes, i.e. "virtual class Derived : module::Base {" + * - Mark with 'virtual' keyword, e.g. "virtual class Base {", and also "virtual class Derived : module::Base {" + * - Forward declarations must also be marked virtual, e.g. "virtual class module::Base;" and + * also "virtual class module::Derived;" + * - Pure virtual (abstract) classes should list no constructors in this interface file + * - Virtual classes must have a clone() function in C++ (though it does not have to be included + * in the MATLAB interface). clone() will be called whenever an object copy is needed, instead + * of using the copy constructor (which is used for non-virtual objects). */ /** * Status: * - TODO: global functions * - TODO: default values for arguments - * - TODO: overloaded functions - * - TODO: signatures for constructors can be ambiguous if two types have the same first letter * - TODO: Handle gtsam::Rot3M conversions to quaternions */ @@ -64,8 +75,9 @@ namespace gtsam { // base //************************************************************************* -class Value { +virtual class Value { // No constructors because this is an abstract class + Value(const gtsam::Value& rhs); // Testable void print(string s) const; @@ -74,7 +86,7 @@ class Value { size_t dim() const; }; -class LieVector : gtsam::Value { +virtual class LieVector : gtsam::Value { // Standard constructors LieVector(); LieVector(Vector v); @@ -106,7 +118,7 @@ class LieVector : gtsam::Value { // geometry //************************************************************************* -class Point2 : gtsam::Value { +virtual class Point2 : gtsam::Value { // Standard Constructors Point2(); Point2(double x, double y); @@ -138,7 +150,7 @@ class Point2 : gtsam::Value { Vector vector() const; }; -class StereoPoint2 : gtsam::Value { +virtual class StereoPoint2 : gtsam::Value { // Standard Constructors StereoPoint2(); StereoPoint2(double uL, double uR, double v); @@ -167,7 +179,7 @@ class StereoPoint2 : gtsam::Value { Vector vector() const; }; -class Point3 : gtsam::Value { +virtual class Point3 : gtsam::Value { // Standard Constructors Point3(); Point3(double x, double y, double z); @@ -200,7 +212,7 @@ class Point3 : gtsam::Value { double z() const; }; -class Rot2 : gtsam::Value { +virtual class Rot2 : gtsam::Value { // Standard Constructors and Named Constructors Rot2(); Rot2(double theta); @@ -242,7 +254,7 @@ class Rot2 : gtsam::Value { Matrix matrix() const; }; -class Rot3 : gtsam::Value { +virtual class Rot3 : gtsam::Value { // Standard Constructors and Named Constructors Rot3(); Rot3(Matrix R); @@ -294,7 +306,7 @@ class Rot3 : gtsam::Value { // Vector toQuaternion() const; // FIXME: Can't cast to Vector properly }; -class Pose2 : gtsam::Value { +virtual class Pose2 : gtsam::Value { // Standard Constructor Pose2(); Pose2(double x, double y, double theta); @@ -340,7 +352,7 @@ class Pose2 : gtsam::Value { Matrix matrix() const; }; -class Pose3 : gtsam::Value { +virtual class Pose3 : gtsam::Value { // Standard Constructors Pose3(); Pose3(const gtsam::Pose3& pose); @@ -388,7 +400,7 @@ class Pose3 : gtsam::Value { double range(const gtsam::Pose3& pose); // FIXME: shadows other range }; -class Cal3_S2 : gtsam::Value { +virtual class Cal3_S2 : gtsam::Value { // Standard Constructors Cal3_S2(); Cal3_S2(double fx, double fy, double s, double u0, double v0); @@ -438,7 +450,7 @@ class Cal3_S2Stereo { double baseline() const; }; -class CalibratedCamera : gtsam::Value { +virtual class CalibratedCamera : gtsam::Value { // Standard Constructors and Named Constructors CalibratedCamera(); CalibratedCamera(const gtsam::Pose3& pose); @@ -468,7 +480,7 @@ class CalibratedCamera : gtsam::Value { double range(const gtsam::Point3& p) const; // TODO: Other overloaded range methods }; -class SimpleCamera : gtsam::Value { +virtual class SimpleCamera : gtsam::Value { // Standard Constructors and Named Constructors SimpleCamera(); SimpleCamera(const gtsam::Pose3& pose); @@ -943,6 +955,7 @@ class Values { void print(string s) const; void insert(size_t j, const gtsam::Value& value); bool exists(size_t j) const; + gtsam::Value at(size_t j) const; }; // Actually a FastList diff --git a/wrap/Class.cpp b/wrap/Class.cpp index ebaefc4a8..fa6a0c950 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -30,7 +30,9 @@ using namespace std; using namespace wrap; /* ************************************************************************* */ -void Class::matlab_proxy(const string& classFile, const string& wrapperName, FileWriter& wrapperFile, vector& functionNames) const { +void Class::matlab_proxy(const string& classFile, const string& wrapperName, + const ReturnValue::TypeAttributesTable& typeAttributes, + FileWriter& wrapperFile, vector& functionNames) const { // open destination classFile FileWriter proxyFile(classFile, verbose_, "%"); @@ -96,7 +98,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil // Methods BOOST_FOREACH(const Methods::value_type& name_m, methods) { const Method& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, functionNames); + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, typeAttributes, functionNames); proxyFile.oss << "\n"; wrapperFile.oss << "\n"; } @@ -108,7 +110,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, Fil // Static methods BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { const StaticMethod& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, functionNames); + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, typeAttributes, functionNames); proxyFile.oss << "\n"; wrapperFile.oss << "\n"; } diff --git a/wrap/Class.h b/wrap/Class.h index 4d31b4972..5703f8353 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -34,10 +34,11 @@ struct Class { typedef std::map StaticMethods; /// Constructor creates an empty class - Class(bool verbose=true) : verbose_(verbose) {} + Class(bool verbose=true) : verbose_(verbose), isVirtual(false) {} // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name + bool isVirtual; ///< Whether the class is part of a virtual inheritance chain std::vector qualifiedParent; ///< The *single* parent - the last string is the parent class name, preceededing elements are a namespace stack Methods methods; ///< Class methods StaticMethods static_methods; ///< Static methods @@ -49,7 +50,7 @@ struct Class { bool verbose_; ///< verbose flag // And finally MATLAB code is emitted, methods below called by Module::matlab_code - void matlab_proxy(const std::string& classFile, const std::string& wrapperName, + void matlab_proxy(const std::string& classFile, const std::string& wrapperName, const ReturnValue::TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit proxy class std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 01bb80189..f44a08a73 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -41,6 +41,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF const string& matlabClassName, const string& wrapperName, const vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes, vector& functionNames) const { proxyFile.oss << " function varargout = " << name << "(this, varargin)\n"; @@ -79,7 +80,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF // Output C++ wrapper code const string wrapFunctionName = wrapper_fragment( - wrapperFile, cppClassName, matlabClassName, overload, id, using_namespaces); + wrapperFile, cppClassName, matlabClassName, overload, id, using_namespaces, typeAttributes); // Add to function list functionNames.push_back(wrapFunctionName); @@ -100,7 +101,8 @@ string Method::wrapper_fragment(FileWriter& file, const string& matlabClassName, int overload, int id, - const vector& using_namespaces) const { + const vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes) const { // generate code @@ -139,16 +141,12 @@ string Method::wrapper_fragment(FileWriter& file, // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,1); - // call method - // example: bool result = self->return_field(t); - file.oss << " "; + // call method and wrap result + // example: out[0]=wrap(self->return_field(t)); if (returnVal.type1!="void") - file.oss << returnVal.return_type(true,ReturnValue::pair) << " result = "; - file.oss << "obj->" << name << "(" << args.names() << ");\n"; - - // wrap result - // example: out[0]=wrap(result); - returnVal.wrap_result(file); + returnVal.wrap_result("obj->"+name+"("+args.names()+")", file, typeAttributes); + else + file.oss << " obj->"+name+"("+args.names()+");\n"; // finish file.oss << "}\n"; diff --git a/wrap/Method.h b/wrap/Method.h index 204e3002d..d9b1f09f1 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -50,6 +50,7 @@ struct Method { void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& cppClassName, const std::string& matlabClassName, const std::string& wrapperName, const std::vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes, std::vector& functionNames) const; private: @@ -58,7 +59,8 @@ private: const std::string& matlabClassname, int overload, int id, - const std::vector& using_namespaces) const; ///< cpp wrapper + const std::vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes) const; ///< cpp wrapper }; } // \namespace wrap diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 5482a19b1..006e38d4a 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -24,8 +24,10 @@ //#define BOOST_SPIRIT_DEBUG #include #include +#include #include #include +#include #include #include #include @@ -65,12 +67,12 @@ Module::Module(const string& interfacePath, //Method method0(enable_verbose), method(enable_verbose); StaticMethod static_method0(enable_verbose), static_method(enable_verbose); Class cls0(enable_verbose),cls(enable_verbose); + ForwardDeclaration fwDec0, fwDec; vector namespaces, /// current namespace tag namespace_includes, /// current set of includes namespaces_return, /// namespace for current return type using_namespace_current; /// All namespaces from "using" declarations string include_path = ""; - string class_name = ""; const string null_str = ""; //---------------------------------------------------------------------------- @@ -200,6 +202,7 @@ Module::Module(const string& interfacePath, Rule class_p = (!*include_p + >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] >> className_p[assign_a(cls.name)] >> ((':' >> classParent_p >> '{') | '{') // By having (parent >> '{' | '{') here instead of (!parent >> '{'), we trigger a parse error on a badly-formed parent spec @@ -212,7 +215,7 @@ Module::Module(const string& interfacePath, [append_a(cls.includes, namespace_includes)] [assign_a(deconstructor.name,cls.name)] [assign_a(cls.deconstructor, deconstructor)] - [push_back_a(classes,cls)] + [push_back_a(classes, cls)] [assign_a(deconstructor,deconstructor0)] [assign_a(constructor, constructor0)] [assign_a(cls,cls0)]; @@ -233,9 +236,12 @@ Module::Module(const string& interfacePath, >> namespace_name_p[push_back_a(using_namespace_current)] >> ch_p(';'); Rule forward_declaration_p = - str_p("class") >> - (*(namespace_name_p >> str_p("::")) >> className_p)[push_back_a(forward_declarations)] - >> ch_p(';'); + !(str_p("virtual")[assign_a(fwDec.isVirtual, true)]) + >> str_p("class") + >> (*(namespace_name_p >> str_p("::")) >> className_p)[assign_a(fwDec.name)] + >> ch_p(';') + [push_back_a(forward_declarations, fwDec)] + [assign_a(fwDec, fwDec0)]; Rule module_content_p = comments_p | using_namespace_p | class_p | forward_declaration_p | namespace_def_p ; @@ -325,7 +331,10 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co wrapperFile.oss << "\n"; // Dependency check list - vector validTypes = forward_declarations; + vector validTypes; + BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { + validTypes.push_back(fwDec.name); + } validTypes.push_back("void"); validTypes.push_back("string"); validTypes.push_back("int"); @@ -337,18 +346,31 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co validTypes.push_back("Vector"); validTypes.push_back("Matrix"); //Create a list of parsed classes for dependency checking - BOOST_FOREACH(Class cls, classes) { + BOOST_FOREACH(const Class& cls, classes) { validTypes.push_back(cls.qualifiedName("::")); } + + // Create type attributes table + ReturnValue::TypeAttributesTable typeAttributes; + BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { + if(!typeAttributes.insert(make_pair(fwDec.name, ReturnValue::TypeAttributes(fwDec.isVirtual))).second) + throw DuplicateDefinition("class " + fwDec.name); + } + BOOST_FOREACH(const Class& cls, classes) { + if(!typeAttributes.insert(make_pair(cls.qualifiedName("::"), ReturnValue::TypeAttributes(cls.isVirtual))).second) + throw DuplicateDefinition("class " + cls.qualifiedName("::")); + + // Check that class is virtual if it has a parent + } // Generate all includes - BOOST_FOREACH(Class cls, classes) { + BOOST_FOREACH(const Class& cls, classes) { generateIncludes(wrapperFile, cls.name, cls.includes); } wrapperFile.oss << "\n"; // Generate all collectors - BOOST_FOREACH(Class cls, classes) { + BOOST_FOREACH(const Class& cls, classes) { const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); wrapperFile.oss << "typedef std::set*> " << "Collector_" << matlabName << ";\n"; @@ -359,7 +381,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // generate mexAtExit cleanup function wrapperFile.oss << "void _deleteAllObjects()\n"; wrapperFile.oss << "{\n"; - BOOST_FOREACH(Class cls, classes) { + BOOST_FOREACH(const Class& cls, classes) { const string matlabName = cls.qualifiedName(); const string cppName = cls.qualifiedName("::"); const string collectorType = "Collector_" + matlabName; @@ -373,10 +395,10 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co wrapperFile.oss << "}\n"; // generate proxy classes and wrappers - BOOST_FOREACH(Class cls, classes) { + BOOST_FOREACH(const Class& cls, classes) { // create proxy class and wrapper code string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; - cls.matlab_proxy(classFile, wrapperName, wrapperFile, functionNames); + cls.matlab_proxy(classFile, wrapperName, typeAttributes, wrapperFile, functionNames); // verify all of the function arguments //TODO:verifyArguments(validTypes, cls.constructor.args_list); diff --git a/wrap/Module.h b/wrap/Module.h index a04a861c4..3cb23be25 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -19,6 +19,7 @@ #include #include +#include #include "Class.h" @@ -28,11 +29,18 @@ namespace wrap { * A module just has a name and a list of classes */ struct Module { + + struct ForwardDeclaration { + std::string name; + bool isVirtual; + ForwardDeclaration() : isVirtual(false) {} + }; + std::string name; ///< module name std::vector classes; ///< list of classes bool verbose; ///< verbose flag // std::vector using_namespaces; ///< all default namespaces - std::vector forward_declarations; + std::vector forward_declarations; /// constructor that parses interface file Module(const std::string& interfacePath, diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index 0c9dd5830..77bdeb746 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -46,45 +46,60 @@ string ReturnValue::qualifiedType2(const string& delim) const { /* ************************************************************************* */ //TODO:Fix this -void ReturnValue::wrap_result(FileWriter& file) const { +void ReturnValue::wrap_result(const string& result, FileWriter& file, const TypeAttributesTable& typeAttributes) const { string cppType1 = qualifiedType1("::"), matlabType1 = qualifiedType1(); string cppType2 = qualifiedType2("::"), matlabType2 = qualifiedType2(); if (isPair) { // first return value in pair if (isPtr1) {// if we already have a pointer - file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result.first);" << endl; + file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(" << result << ".first);" << endl; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (category1 == ReturnValue::CLASS) { // if we are going to make one - file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result.first));\n"; + string objCopy; + if(typeAttributes.at(cppType1).isVirtual) + objCopy = "boost::dynamic_pointer_cast<" + cppType1 + ">(" + result + ".first.clone())"; + else + objCopy = "new " + cppType1 + "(" + result + ".first)"; + file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(" << objCopy << ");\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else // if basis type - file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result.first);\n"; + file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(" << result << ".first);\n"; // second return value in pair if (isPtr2) {// if we already have a pointer - file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(result.second);" << endl; + file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(" << result << ".second);" << endl; file.oss << " out[1] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; } else if (category2 == ReturnValue::CLASS) { // if we are going to make one - file.oss << " Shared" << type2 << "* ret = new Shared" << type2 << "(new " << cppType2 << "(result.first));\n"; + string objCopy; + if(typeAttributes.at(cppType1).isVirtual) + objCopy = "boost::dynamic_pointer_cast<" + cppType2 + ">(" + result + ".second.clone())"; + else + objCopy = "new " + cppType1 + "(" + result + ".second)"; + file.oss << " Shared" << type2 << "* ret = new Shared" << type2 << "(" << objCopy << ");\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; } else - file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(result.second);\n"; + file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(" << result << ".second);\n"; } else if (isPtr1){ - file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(result);" << endl; + file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(" << result << ");" << endl; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (category1 == ReturnValue::CLASS){ - file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(new " << cppType1 << "(result));\n"; + string objCopy; + if(typeAttributes.at(cppType1).isVirtual) + objCopy = "boost::dynamic_pointer_cast<" + cppType1 + ">(" + result + ".clone())"; + else + objCopy = "new " + cppType1 + "(" + result + ")"; + file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(" << objCopy << ");\n"; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; } else if (matlabType1!="void") - file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(result);\n"; + file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(" << result << ");\n"; } /* ************************************************************************* */ diff --git a/wrap/ReturnValue.h b/wrap/ReturnValue.h index 859e00433..7d30578b2 100644 --- a/wrap/ReturnValue.h +++ b/wrap/ReturnValue.h @@ -8,6 +8,7 @@ */ #include +#include #include "FileWriter.h" @@ -17,6 +18,14 @@ namespace wrap { struct ReturnValue { + struct TypeAttributes { + bool isVirtual; + TypeAttributes() : isVirtual(false) {} + TypeAttributes(bool isVirtual) : isVirtual(isVirtual) {} + }; + + typedef std::map TypeAttributesTable; + typedef enum { CLASS, EIGEN, @@ -47,7 +56,7 @@ struct ReturnValue { std::string matlab_returnType() const; - void wrap_result(FileWriter& file) const; + void wrap_result(const std::string& result, FileWriter& file, const TypeAttributesTable& typeAttributes) const; }; diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index dd0c606b5..75456b6b7 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -42,6 +42,7 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr const string& matlabClassName, const string& wrapperName, const vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes, vector& functionNames) const { string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); @@ -82,7 +83,7 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr // Output C++ wrapper code const string wrapFunctionName = wrapper_fragment( - wrapperFile, cppClassName, matlabClassName, overload, id, using_namespaces); + wrapperFile, cppClassName, matlabClassName, overload, id, using_namespaces, typeAttributes); // Add to function list functionNames.push_back(wrapFunctionName); @@ -103,7 +104,8 @@ string StaticMethod::wrapper_fragment(FileWriter& file, const string& matlabClassName, int overload, int id, - const vector& using_namespaces) const { + const vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes) const { // generate code @@ -140,14 +142,11 @@ string StaticMethod::wrapper_fragment(FileWriter& file, file.oss << " "; - // call method with default type + // call method with default type and wrap result if (returnVal.type1!="void") - file.oss << returnVal.return_type(true,ReturnValue::pair) << " result = "; - file.oss << cppClassName << "::" << name << "(" << args.names() << ");\n"; - - // wrap result - // example: out[0]=wrap(result); - returnVal.wrap_result(file); + returnVal.wrap_result(cppClassName+"::"+name+"("+args.names()+")", file, typeAttributes); + else + file.oss << cppClassName+"::"+name+"("+args.names()+");\n"; // finish file.oss << "}\n"; diff --git a/wrap/StaticMethod.h b/wrap/StaticMethod.h index 5bc599ea5..8a739665d 100644 --- a/wrap/StaticMethod.h +++ b/wrap/StaticMethod.h @@ -50,6 +50,7 @@ struct StaticMethod { void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& cppClassName, const std::string& matlabClassName, const std::string& wrapperName, const std::vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes, std::vector& functionNames) const; private: @@ -58,7 +59,8 @@ private: const std::string& matlabClassname, int overload, int id, - const std::vector& using_namespaces) const; ///< cpp wrapper + const std::vector& using_namespaces, + const ReturnValue::TypeAttributesTable& typeAttributes) const; ///< cpp wrapper }; } // \namespace wrap diff --git a/wrap/matlab.h b/wrap/matlab.h index 4033844e4..05f7fffb5 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -119,7 +119,7 @@ void checkArguments(const string& name, int nargout, int nargin, int expected) { // default wrapping throws an error: only basis types are allowed in wrap template -mxArray* wrap(Class& value) { +mxArray* wrap(const Class& value) { error("wrap internal error: attempted wrap of invalid type"); return 0; } @@ -127,13 +127,13 @@ mxArray* wrap(Class& value) { // specialization to string // wraps into a character array template<> -mxArray* wrap(string& value) { +mxArray* wrap(const string& value) { return mxCreateString(value.c_str()); } // specialization to char template<> -mxArray* wrap(char& value) { +mxArray* wrap(const char& value) { mxArray *result = scalar(mxUINT32OR64_CLASS); *(char*)mxGetData(result) = value; return result; @@ -141,7 +141,7 @@ mxArray* wrap(char& value) { // specialization to unsigned char template<> -mxArray* wrap(unsigned char& value) { +mxArray* wrap(const unsigned char& value) { mxArray *result = scalar(mxUINT32OR64_CLASS); *(unsigned char*)mxGetData(result) = value; return result; @@ -149,7 +149,7 @@ mxArray* wrap(unsigned char& value) { // specialization to bool template<> -mxArray* wrap(bool& value) { +mxArray* wrap(const bool& value) { mxArray *result = scalar(mxUINT32OR64_CLASS); *(bool*)mxGetData(result) = value; return result; @@ -157,7 +157,7 @@ mxArray* wrap(bool& value) { // specialization to size_t template<> -mxArray* wrap(size_t& value) { +mxArray* wrap(const size_t& value) { mxArray *result = scalar(mxUINT32OR64_CLASS); *(size_t*)mxGetData(result) = value; return result; @@ -165,7 +165,7 @@ mxArray* wrap(size_t& value) { // specialization to int template<> -mxArray* wrap(int& value) { +mxArray* wrap(const int& value) { mxArray *result = scalar(mxUINT32OR64_CLASS); *(int*)mxGetData(result) = value; return result; @@ -173,7 +173,7 @@ mxArray* wrap(int& value) { // specialization to double -> just double template<> -mxArray* wrap(double& value) { +mxArray* wrap(const double& value) { return mxCreateDoubleScalar(value); } @@ -188,13 +188,7 @@ mxArray* wrap_Vector(const gtsam::Vector& v) { // specialization to Eigen vector -> double vector template<> -mxArray* wrap(gtsam::Vector& v) { - return wrap_Vector(v); -} - -// const version -template<> -mxArray* wrap(const gtsam::Vector& v) { +mxArray* wrap(const gtsam::Vector& v) { return wrap_Vector(v); } @@ -214,13 +208,7 @@ mxArray* wrap_Matrix(const gtsam::Matrix& A) { // specialization to Eigen MATRIX -> double matrix template<> -mxArray* wrap(gtsam::Matrix& A) { - return wrap_Matrix(A); -} - -// const version -template<> -mxArray* wrap(const gtsam::Matrix& A) { +mxArray* wrap(const gtsam::Matrix& A) { return wrap_Matrix(A); } diff --git a/wrap/utilities.h b/wrap/utilities.h index b0c9fb208..eeda3c68a 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include "FileWriter.h" @@ -29,42 +31,40 @@ namespace wrap { class CantOpenFile : public std::exception { private: - std::string filename_; + const std::string what_; public: - CantOpenFile(const std::string& filename) : filename_(filename) {} + CantOpenFile(const std::string& filename) : what_("Can't open file " + filename) {} ~CantOpenFile() throw() {} - virtual const char* what() const throw() { - return ("Can't open file " + filename_).c_str(); - } + virtual const char* what() const throw() { return what_.c_str(); } }; class ParseFailed : public std::exception { private: - int length_; + const std::string what_; public: - ParseFailed(int length) : length_(length) {} - ~ParseFailed() throw() {} - virtual const char* what() const throw() { - std::stringstream buf; - int len = length_+1; - buf << "Parse failed at character [" << len << "]"; - return buf.str().c_str(); - } + ParseFailed(int length) : what_((boost::format("Parse failed at character [%d]")%(length-1)).str()) {} + ~ParseFailed() throw() {} + virtual const char* what() const throw() { return what_.c_str(); } }; class DependencyMissing : public std::exception { private: - std::string dependency_; - std::string location_; + const std::string what_; public: - DependencyMissing(const std::string& dep, const std::string& loc) { - dependency_ = dep; - location_ = loc; - } + DependencyMissing(const std::string& dep, const std::string& loc) : + what_("Missing dependency " + dep + " in " + loc) {} ~DependencyMissing() throw() {} - virtual const char* what() const throw() { - return ("Missing dependency " + dependency_ + " in " + location_).c_str(); - } + virtual const char* what() const throw() { return what_.c_str(); } +}; + +class DuplicateDefinition : public std::exception { +private: + const std::string what_; +public: + DuplicateDefinition(const std::string& name) : + what_("Duplicate definition of " + name) {} + ~DuplicateDefinition() throw() {} + virtual const char* what() const throw() { return what_.c_str(); } }; /** Special "magic number" passed into MATLAB constructor to indicate creating From 0bbe6daf6e9b827e31c1a2d45a0ff6d8db9087d5 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 9 Jul 2012 20:53:09 +0000 Subject: [PATCH 586/914] Removed incorrect constructor left in from test --- gtsam.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index c57f32263..fcebf8fd2 100644 --- a/gtsam.h +++ b/gtsam.h @@ -79,7 +79,6 @@ namespace gtsam { virtual class Value { // No constructors because this is an abstract class - Value(const gtsam::Value& rhs); // Testable void print(string s) const; From 6a7dffda226041ee8224b612a7f303632cf5748c Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 9 Jul 2012 20:53:10 +0000 Subject: [PATCH 587/914] Specified noiseModel inheritance in gtsam.h --- gtsam.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtsam.h b/gtsam.h index fcebf8fd2..46ea37241 100644 --- a/gtsam.h +++ b/gtsam.h @@ -705,14 +705,14 @@ namespace noiseModel { class Base { }; -class Gaussian { +class Gaussian : gtsam::noiseModel::Base { static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); static gtsam::noiseModel::Gaussian* Covariance(Matrix R); // Matrix R() const; // FIXME: cannot parse!!! void print(string s) const; }; -class Diagonal { +class Diagonal : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas); static gtsam::noiseModel::Diagonal* Variances(Vector variances); static gtsam::noiseModel::Diagonal* Precisions(Vector precisions); @@ -720,14 +720,14 @@ class Diagonal { void print(string s) const; }; -class Isotropic { +class Isotropic : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); static gtsam::noiseModel::Isotropic* Precision(size_t dim, double precision); void print(string s) const; }; -class Unit { +class Unit : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Unit* Create(size_t dim); void print(string s) const; }; From 6daa86f1379bd5317a91dd40b45df585b56a617a Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 10 Jul 2012 14:21:56 +0000 Subject: [PATCH 588/914] Fixed C++ versioning issue in wrap, now compiles and toolbox passes matlab tests, testWrap now compiles but does not pass --- .cproject | 327 +++++++++++++++++++--------------------- wrap/Class.cpp | 4 +- wrap/tests/testWrap.cpp | 2 +- wrap/utilities.h | 4 +- 4 files changed, 162 insertions(+), 175 deletions(-) diff --git a/.cproject b/.cproject index 075558734..b31515394 100644 --- a/.cproject +++ b/.cproject @@ -308,6 +308,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -334,7 +342,6 @@ make - tests/testBayesTree.run true false @@ -342,7 +349,6 @@ make - testBinaryBayesNet.run true false @@ -390,7 +396,6 @@ make - testSymbolicBayesNet.run true false @@ -398,7 +403,6 @@ make - tests/testSymbolicFactor.run true false @@ -406,7 +410,6 @@ make - testSymbolicFactorGraph.run true false @@ -422,20 +425,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -524,22 +518,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -556,6 +534,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -580,26 +574,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -684,26 +678,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -958,7 +952,6 @@ make - testGraph.run true false @@ -966,7 +959,6 @@ make - testJunctionTree.run true false @@ -974,7 +966,6 @@ make - testSymbolicBayesNetB.run true false @@ -1110,7 +1101,6 @@ make - testErrors.run true false @@ -1574,6 +1564,7 @@ make + testSimulated2DOriented.run true false @@ -1613,6 +1604,7 @@ make + testSimulated2D.run true false @@ -1620,6 +1612,7 @@ make + testSimulated3D.run true false @@ -1835,6 +1828,7 @@ make + tests/testGaussianISAM2 true false @@ -1856,6 +1850,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j2 @@ -2057,7 +2147,6 @@ cpack - -G DEB true false @@ -2065,7 +2154,6 @@ cpack - -G RPM true false @@ -2073,7 +2161,6 @@ cpack - -G TGZ true false @@ -2081,7 +2168,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2207,98 +2293,34 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2342,46 +2364,7 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap_gtsam - true - true - true - - - make - -j5 - wrap - true - true - true - + diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 803017e42..dd28a830a 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -18,7 +18,9 @@ #include #include #include -#include +//#include // on Linux GCC: fails with error regarding needing C++0x std flags +//#include // same failure as above +#include // works on Linux GCC #include #include diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 9f9f29688..2619d96a8 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -81,7 +81,7 @@ TEST( wrap, parse ) { // forward declarations strvec exp_forward; exp_forward += "VectorNotEigen", "ns::OtherClass"; - EXPECT(assert_equal(exp_forward, module.forward_declarations)); +// EXPECT(assert_equal(exp_forward, module.forward_declarations)); // FIXME: forward_declarations no longer a simple strvec // check first class, Point2 { diff --git a/wrap/utilities.h b/wrap/utilities.h index eeda3c68a..f84a28b51 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -21,7 +21,9 @@ #include #include #include -#include +//#include // on Linux GCC: fails with error regarding needing C++0x std flags +//#include // same failure as above +#include // works on Linux GCC #include #include From 5d58dbd5123a6dc280c697a5ff0cc1ccd0db0e0f Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 10 Jul 2012 14:21:58 +0000 Subject: [PATCH 589/914] Fixed testWrap so that it passes, fixed dependency checking in codegen, fixed warnings --- wrap/Class.h | 2 +- wrap/Method.h | 2 +- wrap/Module.cpp | 28 +-- wrap/tests/expected/Point2.m | 41 ++--- wrap/tests/expected/Point3.m | 15 +- wrap/tests/expected/Test.m | 89 +++++----- wrap/tests/expected/geometry_wrapper.cpp | 161 ++++++++---------- wrap/tests/expected_namespaces/ClassD.m | 11 +- wrap/tests/expected_namespaces/ns1ClassA.m | 11 +- wrap/tests/expected_namespaces/ns1ClassB.m | 11 +- wrap/tests/expected_namespaces/ns2ClassA.m | 23 +-- wrap/tests/expected_namespaces/ns2ClassC.m | 11 +- wrap/tests/expected_namespaces/ns2ns3ClassB.m | 11 +- .../testNamespaces_wrapper.cpp | 44 +++-- wrap/tests/testDependencies.h | 24 +-- wrap/tests/testWrap.cpp | 7 +- 16 files changed, 229 insertions(+), 262 deletions(-) diff --git a/wrap/Class.h b/wrap/Class.h index 5703f8353..78d779a1f 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -34,7 +34,7 @@ struct Class { typedef std::map StaticMethods; /// Constructor creates an empty class - Class(bool verbose=true) : verbose_(verbose), isVirtual(false) {} + Class(bool verbose=true) : isVirtual(false), verbose_(verbose) {} // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name diff --git a/wrap/Method.h b/wrap/Method.h index d9b1f09f1..936b3812d 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -30,7 +30,7 @@ struct Method { /// Constructor creates empty object Method(bool verbose = true) : - verbose_(verbose) {} + verbose_(verbose), is_const_(false) {} // Then the instance variables are set directly by the Module constructor bool verbose_; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 006e38d4a..6109da928 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -348,8 +348,8 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co //Create a list of parsed classes for dependency checking BOOST_FOREACH(const Class& cls, classes) { validTypes.push_back(cls.qualifiedName("::")); - } - + } + // Create type attributes table ReturnValue::TypeAttributesTable typeAttributes; BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { @@ -363,6 +363,18 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // Check that class is virtual if it has a parent } + // Check that all classes have been defined somewhere + BOOST_FOREACH(const Class& cls, classes) { + // verify all of the function arguments + //TODO:verifyArguments(validTypes, cls.constructor.args_list); + verifyArguments(validTypes, cls.static_methods); + verifyArguments(validTypes, cls.methods); + + // verify function return types + verifyReturnTypes(validTypes, cls.static_methods); + verifyReturnTypes(validTypes, cls.methods); + } + // Generate all includes BOOST_FOREACH(const Class& cls, classes) { generateIncludes(wrapperFile, cls.name, cls.includes); @@ -394,20 +406,10 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } wrapperFile.oss << "}\n"; - // generate proxy classes and wrappers + // create proxy class and wrapper code BOOST_FOREACH(const Class& cls, classes) { - // create proxy class and wrapper code string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; cls.matlab_proxy(classFile, wrapperName, typeAttributes, wrapperFile, functionNames); - - // verify all of the function arguments - //TODO:verifyArguments(validTypes, cls.constructor.args_list); - verifyArguments(validTypes, cls.static_methods); - verifyArguments(validTypes, cls.methods); - - // verify function return types - verifyReturnTypes(validTypes, cls.static_methods); - verifyReturnTypes(validTypes, cls.methods); } // finish wrapper file diff --git a/wrap/tests/expected/Point2.m b/wrap/tests/expected/Point2.m index 95f46a2dd..f23e15eb4 100644 --- a/wrap/tests/expected/Point2.m +++ b/wrap/tests/expected/Point2.m @@ -1,81 +1,82 @@ % automatically generated by wrap classdef Point2 < handle properties - self = 0 + ptr_Point2 = 0 end methods function obj = Point2(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - geometry_wrapper(obj.self); + my_ptr = varargin{2}; + geometry_wrapper(0, my_ptr); elseif nargin == 0 - obj.self = geometry_wrapper(1); + my_ptr = geometry_wrapper(1); elseif nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double') - obj.self = geometry_wrapper(2,varargin{1},varargin{2}); + my_ptr = geometry_wrapper(2, varargin{1}, varargin{2}); else error('Arguments do not match any overload of Point2 constructor'); end + obj.ptr_Point2 = my_ptr; end function delete(obj) - geometry_wrapper(3, obj.self); + geometry_wrapper(3, obj.ptr_Point2); end function display(obj), obj.print(''); end function disp(obj), obj.display; end - function varargout = argChar(self, varargin) + function varargout = argChar(this, varargin) if length(varargin) == 1 && isa(varargin{1},'char') - geometry_wrapper(4, self, varargin{:}); + geometry_wrapper(4, this, varargin{:}); else error('Arguments do not match any overload of function Point2.argChar'); end end - function varargout = argUChar(self, varargin) + function varargout = argUChar(this, varargin) if length(varargin) == 1 && isa(varargin{1},'char') - geometry_wrapper(5, self, varargin{:}); + geometry_wrapper(5, this, varargin{:}); else error('Arguments do not match any overload of function Point2.argUChar'); end end - function varargout = dim(self, varargin) + function varargout = dim(this, varargin) if length(varargin) == 0 - varargout{1} = geometry_wrapper(6, self, varargin{:}); + varargout{1} = geometry_wrapper(6, this, varargin{:}); else error('Arguments do not match any overload of function Point2.dim'); end end - function varargout = returnChar(self, varargin) + function varargout = returnChar(this, varargin) if length(varargin) == 0 - varargout{1} = geometry_wrapper(7, self, varargin{:}); + varargout{1} = geometry_wrapper(7, this, varargin{:}); else error('Arguments do not match any overload of function Point2.returnChar'); end end - function varargout = vectorConfusion(self, varargin) + function varargout = vectorConfusion(this, varargin) if length(varargin) == 0 - varargout{1} = geometry_wrapper(8, self, varargin{:}); + varargout{1} = geometry_wrapper(8, this, varargin{:}); else error('Arguments do not match any overload of function Point2.vectorConfusion'); end end - function varargout = x(self, varargin) + function varargout = x(this, varargin) if length(varargin) == 0 - varargout{1} = geometry_wrapper(9, self, varargin{:}); + varargout{1} = geometry_wrapper(9, this, varargin{:}); else error('Arguments do not match any overload of function Point2.x'); end end - function varargout = y(self, varargin) + function varargout = y(this, varargin) if length(varargin) == 0 - varargout{1} = geometry_wrapper(10, self, varargin{:}); + varargout{1} = geometry_wrapper(10, this, varargin{:}); else error('Arguments do not match any overload of function Point2.y'); end diff --git a/wrap/tests/expected/Point3.m b/wrap/tests/expected/Point3.m index 7a1045a86..773ebefc0 100644 --- a/wrap/tests/expected/Point3.m +++ b/wrap/tests/expected/Point3.m @@ -1,31 +1,32 @@ % automatically generated by wrap classdef Point3 < handle properties - self = 0 + ptr_Point3 = 0 end methods function obj = Point3(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - geometry_wrapper(obj.self); + my_ptr = varargin{2}; + geometry_wrapper(11, my_ptr); elseif nargin == 3 && isa(varargin{1},'double') && isa(varargin{2},'double') && isa(varargin{3},'double') - obj.self = geometry_wrapper(12,varargin{1},varargin{2},varargin{3}); + my_ptr = geometry_wrapper(12, varargin{1}, varargin{2}, varargin{3}); else error('Arguments do not match any overload of Point3 constructor'); end + obj.ptr_Point3 = my_ptr; end function delete(obj) - geometry_wrapper(13, obj.self); + geometry_wrapper(13, obj.ptr_Point3); end function display(obj), obj.print(''); end function disp(obj), obj.display; end - function varargout = norm(self, varargin) + function varargout = norm(this, varargin) if length(varargin) == 0 - varargout{1} = geometry_wrapper(14, self, varargin{:}); + varargout{1} = geometry_wrapper(14, this, varargin{:}); else error('Arguments do not match any overload of function Point3.norm'); end diff --git a/wrap/tests/expected/Test.m b/wrap/tests/expected/Test.m index 2c914502a..f36c8eb30 100644 --- a/wrap/tests/expected/Test.m +++ b/wrap/tests/expected/Test.m @@ -1,177 +1,178 @@ % automatically generated by wrap classdef Test < handle properties - self = 0 + ptr_Test = 0 end methods function obj = Test(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - geometry_wrapper(obj.self); + my_ptr = varargin{2}; + geometry_wrapper(17, my_ptr); elseif nargin == 0 - obj.self = geometry_wrapper(18); + my_ptr = geometry_wrapper(18); elseif nargin == 2 && isa(varargin{1},'double') && isa(varargin{2},'double') - obj.self = geometry_wrapper(19,varargin{1},varargin{2}); + my_ptr = geometry_wrapper(19, varargin{1}, varargin{2}); else error('Arguments do not match any overload of Test constructor'); end + obj.ptr_Test = my_ptr; end function delete(obj) - geometry_wrapper(20, obj.self); + geometry_wrapper(20, obj.ptr_Test); end function display(obj), obj.print(''); end function disp(obj), obj.display; end - function varargout = arg_EigenConstRef(self, varargin) + function varargout = arg_EigenConstRef(this, varargin) if length(varargin) == 1 && isa(varargin{1},'double') - geometry_wrapper(21, self, varargin{:}); + geometry_wrapper(21, this, varargin{:}); else error('Arguments do not match any overload of function Test.arg_EigenConstRef'); end end - function varargout = create_MixedPtrs(self, varargin) + function varargout = create_MixedPtrs(this, varargin) if length(varargin) == 0 - [ varargout{1} varargout{2} ] = geometry_wrapper(22, self, varargin{:}); + [ varargout{1} varargout{2} ] = geometry_wrapper(22, this, varargin{:}); else error('Arguments do not match any overload of function Test.create_MixedPtrs'); end end - function varargout = create_ptrs(self, varargin) + function varargout = create_ptrs(this, varargin) if length(varargin) == 0 - [ varargout{1} varargout{2} ] = geometry_wrapper(23, self, varargin{:}); + [ varargout{1} varargout{2} ] = geometry_wrapper(23, this, varargin{:}); else error('Arguments do not match any overload of function Test.create_ptrs'); end end - function varargout = print(self, varargin) + function varargout = print(this, varargin) if length(varargin) == 0 - geometry_wrapper(24, self, varargin{:}); + geometry_wrapper(24, this, varargin{:}); else error('Arguments do not match any overload of function Test.print'); end end - function varargout = return_Point2Ptr(self, varargin) + function varargout = return_Point2Ptr(this, varargin) if length(varargin) == 1 && isa(varargin{1},'logical') - varargout{1} = geometry_wrapper(25, self, varargin{:}); + varargout{1} = geometry_wrapper(25, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_Point2Ptr'); end end - function varargout = return_Test(self, varargin) + function varargout = return_Test(this, varargin) if length(varargin) == 1 && isa(varargin{1},'Test') - varargout{1} = geometry_wrapper(26, self, varargin{:}); + varargout{1} = geometry_wrapper(26, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_Test'); end end - function varargout = return_TestPtr(self, varargin) + function varargout = return_TestPtr(this, varargin) if length(varargin) == 1 && isa(varargin{1},'Test') - varargout{1} = geometry_wrapper(27, self, varargin{:}); + varargout{1} = geometry_wrapper(27, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_TestPtr'); end end - function varargout = return_bool(self, varargin) + function varargout = return_bool(this, varargin) if length(varargin) == 1 && isa(varargin{1},'logical') - varargout{1} = geometry_wrapper(28, self, varargin{:}); + varargout{1} = geometry_wrapper(28, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_bool'); end end - function varargout = return_double(self, varargin) + function varargout = return_double(this, varargin) if length(varargin) == 1 && isa(varargin{1},'double') - varargout{1} = geometry_wrapper(29, self, varargin{:}); + varargout{1} = geometry_wrapper(29, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_double'); end end - function varargout = return_field(self, varargin) + function varargout = return_field(this, varargin) if length(varargin) == 1 && isa(varargin{1},'Test') - varargout{1} = geometry_wrapper(30, self, varargin{:}); + varargout{1} = geometry_wrapper(30, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_field'); end end - function varargout = return_int(self, varargin) + function varargout = return_int(this, varargin) if length(varargin) == 1 && isa(varargin{1},'numeric') - varargout{1} = geometry_wrapper(31, self, varargin{:}); + varargout{1} = geometry_wrapper(31, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_int'); end end - function varargout = return_matrix1(self, varargin) + function varargout = return_matrix1(this, varargin) if length(varargin) == 1 && isa(varargin{1},'double') - varargout{1} = geometry_wrapper(32, self, varargin{:}); + varargout{1} = geometry_wrapper(32, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_matrix1'); end end - function varargout = return_matrix2(self, varargin) + function varargout = return_matrix2(this, varargin) if length(varargin) == 1 && isa(varargin{1},'double') - varargout{1} = geometry_wrapper(33, self, varargin{:}); + varargout{1} = geometry_wrapper(33, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_matrix2'); end end - function varargout = return_pair(self, varargin) + function varargout = return_pair(this, varargin) if length(varargin) == 2 && isa(varargin{1},'double') && isa(varargin{2},'double') - [ varargout{1} varargout{2} ] = geometry_wrapper(34, self, varargin{:}); + [ varargout{1} varargout{2} ] = geometry_wrapper(34, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_pair'); end end - function varargout = return_ptrs(self, varargin) + function varargout = return_ptrs(this, varargin) if length(varargin) == 2 && isa(varargin{1},'Test') && isa(varargin{2},'Test') - [ varargout{1} varargout{2} ] = geometry_wrapper(35, self, varargin{:}); + [ varargout{1} varargout{2} ] = geometry_wrapper(35, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_ptrs'); end end - function varargout = return_size_t(self, varargin) + function varargout = return_size_t(this, varargin) if length(varargin) == 1 && isa(varargin{1},'numeric') - varargout{1} = geometry_wrapper(36, self, varargin{:}); + varargout{1} = geometry_wrapper(36, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_size_t'); end end - function varargout = return_string(self, varargin) + function varargout = return_string(this, varargin) if length(varargin) == 1 && isa(varargin{1},'char') - varargout{1} = geometry_wrapper(37, self, varargin{:}); + varargout{1} = geometry_wrapper(37, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_string'); end end - function varargout = return_vector1(self, varargin) + function varargout = return_vector1(this, varargin) if length(varargin) == 1 && isa(varargin{1},'double') - varargout{1} = geometry_wrapper(38, self, varargin{:}); + varargout{1} = geometry_wrapper(38, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_vector1'); end end - function varargout = return_vector2(self, varargin) + function varargout = return_vector2(this, varargin) if length(varargin) == 1 && isa(varargin{1},'double') - varargout{1} = geometry_wrapper(39, self, varargin{:}); + varargout{1} = geometry_wrapper(39, this, varargin{:}); else error('Arguments do not match any overload of function Test.return_vector2'); end diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index e2c866083..aad0c258a 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -31,7 +31,7 @@ void _deleteAllObjects() collector_Test.erase(iter++); } } -void Point2_constructor_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void Point2_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); typedef boost::shared_ptr Shared; @@ -80,7 +80,7 @@ void Point2_argChar_4(int nargout, mxArray *out[], int nargin, const mxArray *in { typedef boost::shared_ptr Shared; checkArguments("argChar",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); char a = unwrap< char >(in[1]); obj->argChar(a); } @@ -89,7 +89,7 @@ void Point2_argUChar_5(int nargout, mxArray *out[], int nargin, const mxArray *i { typedef boost::shared_ptr Shared; checkArguments("argUChar",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); unsigned char a = unwrap< unsigned char >(in[1]); obj->argUChar(a); } @@ -98,18 +98,16 @@ void Point2_dim_6(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { typedef boost::shared_ptr Shared; checkArguments("dim",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - int result = obj->dim(); - out[0] = wrap< int >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); + out[0] = wrap< int >(obj->dim()); } void Point2_returnChar_7(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { typedef boost::shared_ptr Shared; checkArguments("returnChar",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - char result = obj->returnChar(); - out[0] = wrap< char >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); + out[0] = wrap< char >(obj->returnChar()); } void Point2_vectorConfusion_8(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -117,9 +115,8 @@ void Point2_vectorConfusion_8(int nargout, mxArray *out[], int nargin, const mxA typedef boost::shared_ptr SharedVectorNotEigen; typedef boost::shared_ptr Shared; checkArguments("vectorConfusion",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - VectorNotEigen result = obj->vectorConfusion(); - SharedVectorNotEigen* ret = new SharedVectorNotEigen(new VectorNotEigen(result)); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); + SharedVectorNotEigen* ret = new SharedVectorNotEigen(new VectorNotEigen(obj->vectorConfusion())); out[0] = wrap_shared_ptr(ret,"VectorNotEigen"); } @@ -127,21 +124,19 @@ void Point2_x_9(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { typedef boost::shared_ptr Shared; checkArguments("x",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - double result = obj->x(); - out[0] = wrap< double >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); + out[0] = wrap< double >(obj->x()); } void Point2_y_10(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { typedef boost::shared_ptr Shared; checkArguments("y",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point2"); - double result = obj->y(); - out[0] = wrap< double >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); + out[0] = wrap< double >(obj->y()); } -void Point3_constructor_11(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void Point3_collectorInsertAndMakeBase_11(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); using namespace geometry; @@ -184,9 +179,8 @@ void Point3_norm_14(int nargout, mxArray *out[], int nargin, const mxArray *in[] using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("norm",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Point3"); - double result = obj->norm(); - out[0] = wrap< double >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Point3"); + out[0] = wrap< double >(obj->norm()); } void Point3_StaticFunctionRet_15(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -196,8 +190,7 @@ using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("Point3.StaticFunctionRet",nargout,nargin,1); double z = unwrap< double >(in[0]); - Point3 result = Point3::StaticFunctionRet(z); - SharedPoint3* ret = new SharedPoint3(new Point3(result)); + SharedPoint3* ret = new SharedPoint3(new Point3(Point3::StaticFunctionRet(z))); out[0] = wrap_shared_ptr(ret,"Point3"); } @@ -206,11 +199,10 @@ void Point3_staticFunction_16(int nargout, mxArray *out[], int nargin, const mxA using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("Point3.staticFunction",nargout,nargin,0); - double result = Point3::staticFunction(); - out[0] = wrap< double >(result); + out[0] = wrap< double >(Point3::staticFunction()); } -void Test_constructor_17(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void Test_collectorInsertAndMakeBase_17(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); using namespace geometry; @@ -264,8 +256,8 @@ void Test_arg_EigenConstRef_21(int nargout, mxArray *out[], int nargin, const mx using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("arg_EigenConstRef",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "Matrix"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); + Matrix& value = *unwrap_shared_ptr< Matrix >(in[1], "ptr_Matrix"); obj->arg_EigenConstRef(value); } @@ -276,11 +268,10 @@ using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; checkArguments("create_MixedPtrs",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - pair< Test, SharedTest > result = obj->create_MixedPtrs(); - SharedTest* ret = new SharedTest(new Test(result.first)); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); + SharedTest* ret = new SharedTest(new Test(obj->create_MixedPtrs().first)); out[0] = wrap_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(result.second); + SharedTest* ret = new SharedTest(obj->create_MixedPtrs().second); out[1] = wrap_shared_ptr(ret,"Test"); } @@ -291,11 +282,10 @@ using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; checkArguments("create_ptrs",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - pair< SharedTest, SharedTest > result = obj->create_ptrs(); - SharedTest* ret = new SharedTest(result.first); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); + SharedTest* ret = new SharedTest(obj->create_ptrs().first); out[0] = wrap_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(result.second); + SharedTest* ret = new SharedTest(obj->create_ptrs().second); out[1] = wrap_shared_ptr(ret,"Test"); } @@ -304,7 +294,7 @@ void Test_print_24(int nargout, mxArray *out[], int nargin, const mxArray *in[]) using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("print",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); obj->print(); } @@ -314,10 +304,9 @@ using namespace geometry; typedef boost::shared_ptr SharedPoint2; typedef boost::shared_ptr Shared; checkArguments("return_Point2Ptr",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); bool value = unwrap< bool >(in[1]); - SharedPoint2 result = obj->return_Point2Ptr(value); - SharedPoint2* ret = new SharedPoint2(result); + SharedPoint2* ret = new SharedPoint2(obj->return_Point2Ptr(value)); out[0] = wrap_shared_ptr(ret,"Point2"); } @@ -327,10 +316,9 @@ using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; checkArguments("return_Test",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - Test result = obj->return_Test(value); - SharedTest* ret = new SharedTest(new Test(result)); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); + boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); + SharedTest* ret = new SharedTest(new Test(obj->return_Test(value))); out[0] = wrap_shared_ptr(ret,"Test"); } @@ -340,10 +328,9 @@ using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; checkArguments("return_TestPtr",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - SharedTest result = obj->return_TestPtr(value); - SharedTest* ret = new SharedTest(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); + boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); + SharedTest* ret = new SharedTest(obj->return_TestPtr(value)); out[0] = wrap_shared_ptr(ret,"Test"); } @@ -352,10 +339,9 @@ void Test_return_bool_28(int nargout, mxArray *out[], int nargin, const mxArray using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_bool",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); bool value = unwrap< bool >(in[1]); - bool result = obj->return_bool(value); - out[0] = wrap< bool >(result); + out[0] = wrap< bool >(obj->return_bool(value)); } void Test_return_double_29(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -363,10 +349,9 @@ void Test_return_double_29(int nargout, mxArray *out[], int nargin, const mxArra using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_double",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); double value = unwrap< double >(in[1]); - double result = obj->return_double(value); - out[0] = wrap< double >(result); + out[0] = wrap< double >(obj->return_double(value)); } void Test_return_field_30(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -374,10 +359,9 @@ void Test_return_field_30(int nargout, mxArray *out[], int nargin, const mxArray using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_field",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); - bool result = obj->return_field(t); - out[0] = wrap< bool >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); + Test& t = *unwrap_shared_ptr< Test >(in[1], "ptr_Test"); + out[0] = wrap< bool >(obj->return_field(t)); } void Test_return_int_31(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -385,10 +369,9 @@ void Test_return_int_31(int nargout, mxArray *out[], int nargin, const mxArray * using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_int",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); int value = unwrap< int >(in[1]); - int result = obj->return_int(value); - out[0] = wrap< int >(result); + out[0] = wrap< int >(obj->return_int(value)); } void Test_return_matrix1_32(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -396,10 +379,9 @@ void Test_return_matrix1_32(int nargout, mxArray *out[], int nargin, const mxArr using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_matrix1",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); Matrix value = unwrap< Matrix >(in[1]); - Matrix result = obj->return_matrix1(value); - out[0] = wrap< Matrix >(result); + out[0] = wrap< Matrix >(obj->return_matrix1(value)); } void Test_return_matrix2_33(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -407,10 +389,9 @@ void Test_return_matrix2_33(int nargout, mxArray *out[], int nargin, const mxArr using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_matrix2",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); Matrix value = unwrap< Matrix >(in[1]); - Matrix result = obj->return_matrix2(value); - out[0] = wrap< Matrix >(result); + out[0] = wrap< Matrix >(obj->return_matrix2(value)); } void Test_return_pair_34(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -418,12 +399,11 @@ void Test_return_pair_34(int nargout, mxArray *out[], int nargin, const mxArray using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_pair",nargout,nargin-1,2); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); Vector v = unwrap< Vector >(in[1]); Matrix A = unwrap< Matrix >(in[2]); - pair< Vector, Matrix > result = obj->return_pair(v,A); - out[0] = wrap< Vector >(result.first); - out[1] = wrap< Matrix >(result.second); + out[0] = wrap< Vector >(obj->return_pair(v,A).first); + out[1] = wrap< Matrix >(obj->return_pair(v,A).second); } void Test_return_ptrs_35(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -433,13 +413,12 @@ using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; checkArguments("return_ptrs",nargout,nargin-1,2); - Shared obj = unwrap_shared_ptr(in[0], "Test"); - boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); - boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); - pair< SharedTest, SharedTest > result = obj->return_ptrs(p1,p2); - SharedTest* ret = new SharedTest(result.first); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); + boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); + boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "ptr_Test"); + SharedTest* ret = new SharedTest(obj->return_ptrs(p1,p2).first); out[0] = wrap_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(result.second); + SharedTest* ret = new SharedTest(obj->return_ptrs(p1,p2).second); out[1] = wrap_shared_ptr(ret,"Test"); } @@ -448,10 +427,9 @@ void Test_return_size_t_36(int nargout, mxArray *out[], int nargin, const mxArra using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_size_t",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); size_t value = unwrap< size_t >(in[1]); - size_t result = obj->return_size_t(value); - out[0] = wrap< size_t >(result); + out[0] = wrap< size_t >(obj->return_size_t(value)); } void Test_return_string_37(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -459,10 +437,9 @@ void Test_return_string_37(int nargout, mxArray *out[], int nargin, const mxArra using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_string",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); string value = unwrap< string >(in[1]); - string result = obj->return_string(value); - out[0] = wrap< string >(result); + out[0] = wrap< string >(obj->return_string(value)); } void Test_return_vector1_38(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -470,10 +447,9 @@ void Test_return_vector1_38(int nargout, mxArray *out[], int nargin, const mxArr using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_vector1",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); Vector value = unwrap< Vector >(in[1]); - Vector result = obj->return_vector1(value); - out[0] = wrap< Vector >(result); + out[0] = wrap< Vector >(obj->return_vector1(value)); } void Test_return_vector2_39(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -481,10 +457,9 @@ void Test_return_vector2_39(int nargout, mxArray *out[], int nargin, const mxArr using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_vector2",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "Test"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); Vector value = unwrap< Vector >(in[1]); - Vector result = obj->return_vector2(value); - out[0] = wrap< Vector >(result); + out[0] = wrap< Vector >(obj->return_vector2(value)); } void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -496,7 +471,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) switch(id) { case 0: - Point2_constructor_0(nargout, out, nargin-1, in+1); + Point2_collectorInsertAndMakeBase_0(nargout, out, nargin-1, in+1); break; case 1: Point2_constructor_1(nargout, out, nargin-1, in+1); @@ -529,7 +504,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) Point2_y_10(nargout, out, nargin-1, in+1); break; case 11: - Point3_constructor_11(nargout, out, nargin-1, in+1); + Point3_collectorInsertAndMakeBase_11(nargout, out, nargin-1, in+1); break; case 12: Point3_constructor_12(nargout, out, nargin-1, in+1); @@ -547,7 +522,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) Point3_staticFunction_16(nargout, out, nargin-1, in+1); break; case 17: - Test_constructor_17(nargout, out, nargin-1, in+1); + Test_collectorInsertAndMakeBase_17(nargout, out, nargin-1, in+1); break; case 18: Test_constructor_18(nargout, out, nargin-1, in+1); diff --git a/wrap/tests/expected_namespaces/ClassD.m b/wrap/tests/expected_namespaces/ClassD.m index fcedbdc1c..3fb8d4837 100644 --- a/wrap/tests/expected_namespaces/ClassD.m +++ b/wrap/tests/expected_namespaces/ClassD.m @@ -1,22 +1,23 @@ % automatically generated by wrap classdef ClassD < handle properties - self = 0 + ptr_ClassD = 0 end methods function obj = ClassD(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - testNamespaces_wrapper(obj.self); + my_ptr = varargin{2}; + testNamespaces_wrapper(19, my_ptr); elseif nargin == 0 - obj.self = testNamespaces_wrapper(20); + my_ptr = testNamespaces_wrapper(20); else error('Arguments do not match any overload of ClassD constructor'); end + obj.ptr_ClassD = my_ptr; end function delete(obj) - testNamespaces_wrapper(21, obj.self); + testNamespaces_wrapper(21, obj.ptr_ClassD); end function display(obj), obj.print(''); end diff --git a/wrap/tests/expected_namespaces/ns1ClassA.m b/wrap/tests/expected_namespaces/ns1ClassA.m index 5ee717612..29f48ab4e 100644 --- a/wrap/tests/expected_namespaces/ns1ClassA.m +++ b/wrap/tests/expected_namespaces/ns1ClassA.m @@ -1,22 +1,23 @@ % automatically generated by wrap classdef ns1ClassA < handle properties - self = 0 + ptr_ns1ClassA = 0 end methods function obj = ns1ClassA(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - testNamespaces_wrapper(obj.self); + my_ptr = varargin{2}; + testNamespaces_wrapper(0, my_ptr); elseif nargin == 0 - obj.self = testNamespaces_wrapper(1); + my_ptr = testNamespaces_wrapper(1); else error('Arguments do not match any overload of ns1ClassA constructor'); end + obj.ptr_ns1ClassA = my_ptr; end function delete(obj) - testNamespaces_wrapper(2, obj.self); + testNamespaces_wrapper(2, obj.ptr_ns1ClassA); end function display(obj), obj.print(''); end diff --git a/wrap/tests/expected_namespaces/ns1ClassB.m b/wrap/tests/expected_namespaces/ns1ClassB.m index bc6dc0198..a1e9bc9a5 100644 --- a/wrap/tests/expected_namespaces/ns1ClassB.m +++ b/wrap/tests/expected_namespaces/ns1ClassB.m @@ -1,22 +1,23 @@ % automatically generated by wrap classdef ns1ClassB < handle properties - self = 0 + ptr_ns1ClassB = 0 end methods function obj = ns1ClassB(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - testNamespaces_wrapper(obj.self); + my_ptr = varargin{2}; + testNamespaces_wrapper(3, my_ptr); elseif nargin == 0 - obj.self = testNamespaces_wrapper(4); + my_ptr = testNamespaces_wrapper(4); else error('Arguments do not match any overload of ns1ClassB constructor'); end + obj.ptr_ns1ClassB = my_ptr; end function delete(obj) - testNamespaces_wrapper(5, obj.self); + testNamespaces_wrapper(5, obj.ptr_ns1ClassB); end function display(obj), obj.print(''); end diff --git a/wrap/tests/expected_namespaces/ns2ClassA.m b/wrap/tests/expected_namespaces/ns2ClassA.m index 38a161f07..7b3df9ed6 100644 --- a/wrap/tests/expected_namespaces/ns2ClassA.m +++ b/wrap/tests/expected_namespaces/ns2ClassA.m @@ -1,47 +1,48 @@ % automatically generated by wrap classdef ns2ClassA < handle properties - self = 0 + ptr_ns2ClassA = 0 end methods function obj = ns2ClassA(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - testNamespaces_wrapper(obj.self); + my_ptr = varargin{2}; + testNamespaces_wrapper(6, my_ptr); elseif nargin == 0 - obj.self = testNamespaces_wrapper(7); + my_ptr = testNamespaces_wrapper(7); else error('Arguments do not match any overload of ns2ClassA constructor'); end + obj.ptr_ns2ClassA = my_ptr; end function delete(obj) - testNamespaces_wrapper(8, obj.self); + testNamespaces_wrapper(8, obj.ptr_ns2ClassA); end function display(obj), obj.print(''); end function disp(obj), obj.display; end - function varargout = memberFunction(self, varargin) + function varargout = memberFunction(this, varargin) if length(varargin) == 0 - varargout{1} = testNamespaces_wrapper(9, self, varargin{:}); + varargout{1} = testNamespaces_wrapper(9, this, varargin{:}); else error('Arguments do not match any overload of function ns2ClassA.memberFunction'); end end - function varargout = nsArg(self, varargin) + function varargout = nsArg(this, varargin) if length(varargin) == 1 && isa(varargin{1},'ns1ClassB') - varargout{1} = testNamespaces_wrapper(10, self, varargin{:}); + varargout{1} = testNamespaces_wrapper(10, this, varargin{:}); else error('Arguments do not match any overload of function ns2ClassA.nsArg'); end end - function varargout = nsReturn(self, varargin) + function varargout = nsReturn(this, varargin) if length(varargin) == 1 && isa(varargin{1},'double') - varargout{1} = testNamespaces_wrapper(11, self, varargin{:}); + varargout{1} = testNamespaces_wrapper(11, this, varargin{:}); else error('Arguments do not match any overload of function ns2ClassA.nsReturn'); end diff --git a/wrap/tests/expected_namespaces/ns2ClassC.m b/wrap/tests/expected_namespaces/ns2ClassC.m index 647351e2f..5ba6e7125 100644 --- a/wrap/tests/expected_namespaces/ns2ClassC.m +++ b/wrap/tests/expected_namespaces/ns2ClassC.m @@ -1,22 +1,23 @@ % automatically generated by wrap classdef ns2ClassC < handle properties - self = 0 + ptr_ns2ClassC = 0 end methods function obj = ns2ClassC(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - testNamespaces_wrapper(obj.self); + my_ptr = varargin{2}; + testNamespaces_wrapper(16, my_ptr); elseif nargin == 0 - obj.self = testNamespaces_wrapper(17); + my_ptr = testNamespaces_wrapper(17); else error('Arguments do not match any overload of ns2ClassC constructor'); end + obj.ptr_ns2ClassC = my_ptr; end function delete(obj) - testNamespaces_wrapper(18, obj.self); + testNamespaces_wrapper(18, obj.ptr_ns2ClassC); end function display(obj), obj.print(''); end diff --git a/wrap/tests/expected_namespaces/ns2ns3ClassB.m b/wrap/tests/expected_namespaces/ns2ns3ClassB.m index 3df2f52e1..b5e57ea19 100644 --- a/wrap/tests/expected_namespaces/ns2ns3ClassB.m +++ b/wrap/tests/expected_namespaces/ns2ns3ClassB.m @@ -1,22 +1,23 @@ % automatically generated by wrap classdef ns2ns3ClassB < handle properties - self = 0 + ptr_ns2ns3ClassB = 0 end methods function obj = ns2ns3ClassB(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) - obj.self = varargin{2}; - testNamespaces_wrapper(obj.self); + my_ptr = varargin{2}; + testNamespaces_wrapper(13, my_ptr); elseif nargin == 0 - obj.self = testNamespaces_wrapper(14); + my_ptr = testNamespaces_wrapper(14); else error('Arguments do not match any overload of ns2ns3ClassB constructor'); end + obj.ptr_ns2ns3ClassB = my_ptr; end function delete(obj) - testNamespaces_wrapper(15, obj.self); + testNamespaces_wrapper(15, obj.ptr_ns2ns3ClassB); end function display(obj), obj.print(''); end diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 7d910c9cc..3633e38c8 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -58,7 +58,7 @@ void _deleteAllObjects() collector_ClassD.erase(iter++); } } -void ns1ClassA_constructor_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void ns1ClassA_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); typedef boost::shared_ptr Shared; @@ -90,7 +90,7 @@ void ns1ClassA_deconstructor_2(int nargout, mxArray *out[], int nargin, const mx } } -void ns1ClassB_constructor_3(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void ns1ClassB_collectorInsertAndMakeBase_3(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); typedef boost::shared_ptr Shared; @@ -122,7 +122,7 @@ void ns1ClassB_deconstructor_5(int nargout, mxArray *out[], int nargin, const mx } } -void ns2ClassA_constructor_6(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void ns2ClassA_collectorInsertAndMakeBase_6(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); typedef boost::shared_ptr Shared; @@ -158,19 +158,17 @@ void ns2ClassA_memberFunction_9(int nargout, mxArray *out[], int nargin, const m { typedef boost::shared_ptr Shared; checkArguments("memberFunction",nargout,nargin-1,0); - Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); - double result = obj->memberFunction(); - out[0] = wrap< double >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_ns2ClassA"); + out[0] = wrap< double >(obj->memberFunction()); } void ns2ClassA_nsArg_10(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { typedef boost::shared_ptr Shared; checkArguments("nsArg",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); - ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB"); - int result = obj->nsArg(arg); - out[0] = wrap< int >(result); + Shared obj = unwrap_shared_ptr(in[0], "ptr_ns2ClassA"); + ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ptr_ns1ClassB"); + out[0] = wrap< int >(obj->nsArg(arg)); } void ns2ClassA_nsReturn_11(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -178,10 +176,9 @@ void ns2ClassA_nsReturn_11(int nargout, mxArray *out[], int nargin, const mxArra typedef boost::shared_ptr SharedClassB; typedef boost::shared_ptr Shared; checkArguments("nsReturn",nargout,nargin-1,1); - Shared obj = unwrap_shared_ptr(in[0], "ns2::ClassA"); + Shared obj = unwrap_shared_ptr(in[0], "ptr_ns2ClassA"); double q = unwrap< double >(in[1]); - ns2::ns3::ClassB result = obj->nsReturn(q); - SharedClassB* ret = new SharedClassB(new ns2::ns3::ClassB(result)); + SharedClassB* ret = new SharedClassB(new ns2::ns3::ClassB(obj->nsReturn(q))); out[0] = wrap_shared_ptr(ret,"ns2ns3ClassB"); } @@ -189,11 +186,10 @@ void ns2ClassA_afunction_12(int nargout, mxArray *out[], int nargin, const mxArr { typedef boost::shared_ptr Shared; checkArguments("ns2ClassA.afunction",nargout,nargin,0); - double result = ns2::ClassA::afunction(); - out[0] = wrap< double >(result); + out[0] = wrap< double >(ns2::ClassA::afunction()); } -void ns2ns3ClassB_constructor_13(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void ns2ns3ClassB_collectorInsertAndMakeBase_13(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); typedef boost::shared_ptr Shared; @@ -225,7 +221,7 @@ void ns2ns3ClassB_deconstructor_15(int nargout, mxArray *out[], int nargin, cons } } -void ns2ClassC_constructor_16(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void ns2ClassC_collectorInsertAndMakeBase_16(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); typedef boost::shared_ptr Shared; @@ -257,7 +253,7 @@ void ns2ClassC_deconstructor_18(int nargout, mxArray *out[], int nargin, const m } } -void ClassD_constructor_19(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +void ClassD_collectorInsertAndMakeBase_19(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); typedef boost::shared_ptr Shared; @@ -298,7 +294,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) switch(id) { case 0: - ns1ClassA_constructor_0(nargout, out, nargin-1, in+1); + ns1ClassA_collectorInsertAndMakeBase_0(nargout, out, nargin-1, in+1); break; case 1: ns1ClassA_constructor_1(nargout, out, nargin-1, in+1); @@ -307,7 +303,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) ns1ClassA_deconstructor_2(nargout, out, nargin-1, in+1); break; case 3: - ns1ClassB_constructor_3(nargout, out, nargin-1, in+1); + ns1ClassB_collectorInsertAndMakeBase_3(nargout, out, nargin-1, in+1); break; case 4: ns1ClassB_constructor_4(nargout, out, nargin-1, in+1); @@ -316,7 +312,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) ns1ClassB_deconstructor_5(nargout, out, nargin-1, in+1); break; case 6: - ns2ClassA_constructor_6(nargout, out, nargin-1, in+1); + ns2ClassA_collectorInsertAndMakeBase_6(nargout, out, nargin-1, in+1); break; case 7: ns2ClassA_constructor_7(nargout, out, nargin-1, in+1); @@ -337,7 +333,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) ns2ClassA_afunction_12(nargout, out, nargin-1, in+1); break; case 13: - ns2ns3ClassB_constructor_13(nargout, out, nargin-1, in+1); + ns2ns3ClassB_collectorInsertAndMakeBase_13(nargout, out, nargin-1, in+1); break; case 14: ns2ns3ClassB_constructor_14(nargout, out, nargin-1, in+1); @@ -346,7 +342,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) ns2ns3ClassB_deconstructor_15(nargout, out, nargin-1, in+1); break; case 16: - ns2ClassC_constructor_16(nargout, out, nargin-1, in+1); + ns2ClassC_collectorInsertAndMakeBase_16(nargout, out, nargin-1, in+1); break; case 17: ns2ClassC_constructor_17(nargout, out, nargin-1, in+1); @@ -355,7 +351,7 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) ns2ClassC_deconstructor_18(nargout, out, nargin-1, in+1); break; case 19: - ClassD_constructor_19(nargout, out, nargin-1, in+1); + ClassD_collectorInsertAndMakeBase_19(nargout, out, nargin-1, in+1); break; case 20: ClassD_constructor_20(nargout, out, nargin-1, in+1); diff --git a/wrap/tests/testDependencies.h b/wrap/tests/testDependencies.h index 429bb5a2a..34a8056b8 100644 --- a/wrap/tests/testDependencies.h +++ b/wrap/tests/testDependencies.h @@ -1,24 +1,8 @@ //Header file to test dependency checking // class Pose3 { - Pose3(); - Pose3(const Rot3& r, const Point3& t);//What is Rot3? Throw here - Pose3(Vector v); - Pose3(Matrix t); - static Pose3 Expmap(Vector v); - static Vector Logmap(const Pose3& p); - static Rot3 testStaticDep(Rot3& r);//What is Rot3? Throw here - void print(string s) const; - bool equals(const Pose3& pose, double tol) const; - double x() const; - double y() const; - double z() const; - Rot3 testReturnType() const; // Throw here - Matrix matrix() const; - Matrix adjointMap() const; - Pose3 compose(const Pose3& p2); - Pose3 between(const Pose3& p2); - Pose3 retract(Vector v); - Point3 translation() const; - Rot3 rotation() const; //What is Rot3? Throw here + Pose3(const Rot3& r, const Point3& t); //What is Rot3? Throw here + static Rot3 testStaticDep(Rot3& r); //What is Rot3? Throw here + Rot3 testReturnType() const; // Throw here + void testMethodArg(const Rot3& r) const; }; diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 2619d96a8..b8e9effc1 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -58,7 +58,7 @@ TEST( wrap, ArgumentList ) { } /* ************************************************************************* */ -TEST( wrap, check_exception ) { +TEST_UNSAFE( wrap, check_exception ) { THROWS_EXCEPTION(Module("/notarealpath", "geometry",enable_verbose)); CHECK_EXCEPTION(Module("/alsonotarealpath", "geometry",enable_verbose), CantOpenFile); @@ -80,8 +80,9 @@ TEST( wrap, parse ) { strvec exp_using1, exp_using2; exp_using2 += "geometry"; // forward declarations - strvec exp_forward; exp_forward += "VectorNotEigen", "ns::OtherClass"; -// EXPECT(assert_equal(exp_forward, module.forward_declarations)); // FIXME: forward_declarations no longer a simple strvec + LONGS_EQUAL(2, module.forward_declarations.size()); + EXPECT(assert_equal("VectorNotEigen", module.forward_declarations[0].name)); + EXPECT(assert_equal("ns::OtherClass", module.forward_declarations[1].name)); // check first class, Point2 { From e6a294d1882a342237ab088da1cd05ea1fa28def Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 10 Jul 2012 18:15:51 +0000 Subject: [PATCH 590/914] Added LinearContainerFactor to add linear factors to nonlinear graphs --- .../nonlinear/LinearContainerFactor.cpp | 148 ++++++++++++++++++ .../nonlinear/LinearContainerFactor.h | 113 +++++++++++++ .../tests/testLinearContainerFactor.cpp | 113 +++++++++++++ 3 files changed, 374 insertions(+) create mode 100644 gtsam_unstable/nonlinear/LinearContainerFactor.cpp create mode 100644 gtsam_unstable/nonlinear/LinearContainerFactor.h create mode 100644 gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp new file mode 100644 index 000000000..8a27284f1 --- /dev/null +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -0,0 +1,148 @@ +/** + * @file LinearContainerFactor.cpp + * + * @date Jul 6, 2012 + * @author Alex Cunningham + */ + +#include + +#include + +namespace gtsam { + +/* ************************************************************************* */ +void LinearContainerFactor::rekeyFactor(const Ordering& ordering) { + Ordering::InvertedMap invOrdering = ordering.invert(); // TODO: inefficient - make more selective ordering invert + rekeyFactor(invOrdering); +} + +/* ************************************************************************* */ +void LinearContainerFactor::rekeyFactor(const Ordering::InvertedMap& invOrdering) { + BOOST_FOREACH(Index& idx, factor_->keys()) { + Key fullKey = invOrdering.find(idx)->second; + idx = fullKey; + keys_.push_back(fullKey); + } +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const JacobianFactor& factor, const Ordering& ordering) +: factor_(factor.clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const HessianFactor& factor, const Ordering& ordering) +: factor_(factor.clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor, const Ordering& ordering) +: factor_(factor->clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor) +: factor_(factor->clone()) +{ +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor(const JacobianFactor& factor, + const Ordering::InvertedMap& inverted_ordering) +: factor_(factor.clone()) { + rekeyFactor(inverted_ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor(const HessianFactor& factor, + const Ordering::InvertedMap& inverted_ordering) +: factor_(factor.clone()) { + rekeyFactor(inverted_ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor, + const Ordering::InvertedMap& ordering) +: factor_(factor->clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +void LinearContainerFactor::print(const std::string& s, const KeyFormatter& keyFormatter) const { + Base::print(s+"LinearContainerFactor", keyFormatter); + if (factor_) + factor_->print(" Stored Factor", keyFormatter); +} + +/* ************************************************************************* */ +bool LinearContainerFactor::equals(const NonlinearFactor& f, double tol) const { + const LinearContainerFactor* jcf = dynamic_cast(&f); + return jcf && factor_->equals(*jcf->factor_, tol) && NonlinearFactor::equals(f); +} + +/* ************************************************************************* */ +double LinearContainerFactor::error(const Values& c) const { + // VectorValues vecvalues; + // // FIXME: add values correctly here + // return factor_.error(vecvalues); + return 0; // FIXME: placeholder +} + +/* ************************************************************************* */ +size_t LinearContainerFactor::dim() const { + if (isJacobian()) + return toJacobian()->get_model()->dim(); + else + return 1; // Hessians don't have true dimension +} + +/* ************************************************************************* */ +boost::shared_ptr +LinearContainerFactor::linearize(const Values& c, const Ordering& ordering) const { + // clone factor + boost::shared_ptr result = factor_->clone(); + + // rekey + BOOST_FOREACH(Index& key, result->keys()) + key = ordering[key]; + + return result; +} + +/* ************************************************************************* */ +bool LinearContainerFactor::isJacobian() const { + return boost::shared_dynamic_cast(factor_); +} + +/* ************************************************************************* */ +JacobianFactor::shared_ptr LinearContainerFactor::toJacobian() const { + return boost::shared_dynamic_cast(factor_); +} + +/* ************************************************************************* */ +HessianFactor::shared_ptr LinearContainerFactor::toHessian() const { + return boost::shared_dynamic_cast(factor_); +} + +/* ************************************************************************* */ +GaussianFactor::shared_ptr LinearContainerFactor::negate(const Ordering& ordering) const { + GaussianFactor::shared_ptr result = factor_->negate(); + BOOST_FOREACH(Key& key, result->keys()) + key = ordering[key]; + return result; +} + +/* ************************************************************************* */ +} // \namespace gtsam + + + diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.h b/gtsam_unstable/nonlinear/LinearContainerFactor.h new file mode 100644 index 000000000..23705f96e --- /dev/null +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.h @@ -0,0 +1,113 @@ +/** + * @file LinearContainerFactor.h + * + * @brief Wrap Jacobian and Hessian linear factors to allow simple injection into a nonlinear graph + * + * @date Jul 6, 2012 + * @author Alex Cunningham + */ + +#pragma once + +#include +#include + +namespace gtsam { + +/** + * Dummy version of a generic linear factor to be injected into a nonlinear factor graph + */ +class LinearContainerFactor : public NonlinearFactor { +protected: + + GaussianFactor::shared_ptr factor_; + +public: + + /** Primary constructor: store a linear factor and decode the ordering */ + LinearContainerFactor(const JacobianFactor& factor, const Ordering& ordering); + + /** Primary constructor: store a linear factor and decode the ordering */ + LinearContainerFactor(const HessianFactor& factor, const Ordering& ordering); + + /** Constructor from shared_ptr */ + LinearContainerFactor(const GaussianFactor::shared_ptr& factor, const Ordering& ordering); + + /** Constructor from re-keyed factor: all indices assumed replaced with Key */ + LinearContainerFactor(const GaussianFactor::shared_ptr& factor); + + /** Alternate constructor: store a linear factor and decode keys with inverted ordering*/ + LinearContainerFactor(const JacobianFactor& factor, + const Ordering::InvertedMap& inverted_ordering); + + /** Alternate constructor: store a linear factor and decode keys with inverted ordering*/ + LinearContainerFactor(const HessianFactor& factor, + const Ordering::InvertedMap& inverted_ordering); + + /** Constructor from shared_ptr with inverted ordering*/ + LinearContainerFactor(const GaussianFactor::shared_ptr& factor, + const Ordering::InvertedMap& ordering); + + // Access + + const GaussianFactor::shared_ptr& factor() const { return factor_; } + + // Testable + + /** print */ + void print(const std::string& s = "", const KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const; + + /** Check if two factors are equal */ + bool equals(const NonlinearFactor& f, double tol = 1e-9) const; + + // NonlinearFactor + + /** + * Calculate the error of the factor: uses the underlying linear factor to compute ordering + */ + double error(const Values& c) const; + + /** get the dimension of the factor: rows of linear factor */ + size_t dim() const; + + /** linearize to a GaussianFactor: values has no effect, just clones/rekeys underlying factor */ + boost::shared_ptr + linearize(const Values& c, const Ordering& ordering) const; + + /** + * Creates an anti-factor directly and performs rekeying due to ordering + */ + GaussianFactor::shared_ptr negate(const Ordering& ordering) const; + + /** + * Creates a shared_ptr clone of the factor - needs to be specialized to allow + * for subclasses + * + * Clones the underlying linear factor + */ + NonlinearFactor::shared_ptr clone() const { + return NonlinearFactor::shared_ptr(new LinearContainerFactor(factor_)); + } + + // casting syntactic sugar + + /** + * Simple check whether this is a Jacobian or Hessian factor + */ + bool isJacobian() const; + + /** Casts to JacobianFactor */ + JacobianFactor::shared_ptr toJacobian() const; + + /** Casts to HessianFactor */ + HessianFactor::shared_ptr toHessian() const; + +protected: + void rekeyFactor(const Ordering& ordering); + void rekeyFactor(const Ordering::InvertedMap& invOrdering); + +}; // \class LinearContainerFactor + +} // \namespace gtsam + + diff --git a/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp new file mode 100644 index 000000000..e85b880e8 --- /dev/null +++ b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp @@ -0,0 +1,113 @@ +/** + * @file testLinearContainerFactor.cpp + * + * @date Jul 6, 2012 + * @author Alex Cunningham + */ + +#include + +#include + +#include + +using namespace gtsam; + +const gtsam::noiseModel::Diagonal::shared_ptr diag_model2 = noiseModel::Diagonal::Sigmas(Vector_(2, 1.0, 1.0)); +const double tol = 1e-5; + +gtsam::Key l1 = 101, l2 = 102, x1 = 1, x2 = 2; + +Point2 landmark1(5.0, 1.5), landmark2(7.0, 1.5); +Pose2 poseA1(0.0, 0.0, 0.0), poseA2(2.0, 0.0, 0.0); + +/* ************************************************************************* */ +TEST( testLinearContainerFactor, generic_jacobian_factor ) { + + Ordering initOrdering; initOrdering += x1, x2, l1, l2; + + JacobianFactor expLinFactor1( + initOrdering[l1], + Matrix_(2,2, + 2.74222, -0.0067457, + 0.0, 2.63624), + initOrdering[l2], + Matrix_(2,2, + -0.0455167, -0.0443573, + -0.0222154, -0.102489), + Vector_(2, 0.0277052, + -0.0533393), + diag_model2); + + LinearContainerFactor actFactor1(expLinFactor1, initOrdering); + Values values; + values.insert(l1, landmark1); + values.insert(l2, landmark2); + values.insert(x1, poseA1); + values.insert(x2, poseA2); + + // Check reconstruction from same ordering + GaussianFactor::shared_ptr actLinearizationA = actFactor1.linearize(values, initOrdering); + EXPECT(assert_equal(*expLinFactor1.clone(), *actLinearizationA, tol)); + + // Check reconstruction from new ordering + Ordering newOrdering; newOrdering += x1, l1, x2, l2; + GaussianFactor::shared_ptr actLinearizationB = actFactor1.linearize(values, newOrdering); + + JacobianFactor expLinFactor2( + newOrdering[l1], + Matrix_(2,2, + 2.74222, -0.0067457, + 0.0, 2.63624), + newOrdering[l2], + Matrix_(2,2, + -0.0455167, -0.0443573, + -0.0222154, -0.102489), + Vector_(2, 0.0277052, + -0.0533393), + diag_model2); + + EXPECT(assert_equal(*expLinFactor2.clone(), *actLinearizationB, tol)); +} + +/* ************************************************************************* */ +TEST( testLinearContainerFactor, generic_hessian_factor ) { + Matrix G11 = Matrix_(1,1, 1.0); + Matrix G12 = Matrix_(1,2, 2.0, 4.0); + Matrix G13 = Matrix_(1,3, 3.0, 6.0, 9.0); + + Matrix G22 = Matrix_(2,2, 3.0, 5.0, 0.0, 6.0); + Matrix G23 = Matrix_(2,3, 4.0, 6.0, 8.0, 1.0, 2.0, 4.0); + + Matrix G33 = Matrix_(3,3, 1.0, 2.0, 3.0, 0.0, 5.0, 6.0, 0.0, 0.0, 9.0); + + Vector g1 = Vector_(1, -7.0); + Vector g2 = Vector_(2, -8.0, -9.0); + Vector g3 = Vector_(3, 1.0, 2.0, 3.0); + + double f = 10.0; + + Ordering initOrdering; initOrdering += x1, x2, l1, l2; + HessianFactor initFactor(initOrdering[x1], initOrdering[x2], initOrdering[l1], + G11, G12, G13, g1, G22, G23, g2, G33, g3, f); + + Values values; + values.insert(l1, landmark1); + values.insert(l2, landmark2); + values.insert(x1, poseA1); + values.insert(x2, poseA2); + + LinearContainerFactor actFactor(initFactor, initOrdering); + GaussianFactor::shared_ptr actLinearization1 = actFactor.linearize(values, initOrdering); + EXPECT(assert_equal(*initFactor.clone(), *actLinearization1, tol)); + + Ordering newOrdering; newOrdering += l1, x1, x2, l2; + HessianFactor expLinFactor(newOrdering[x1], newOrdering[x2], newOrdering[l1], + G11, G12, G13, g1, G22, G23, g2, G33, g3, f); + GaussianFactor::shared_ptr actLinearization2 = actFactor.linearize(values, newOrdering); + EXPECT(assert_equal(*expLinFactor.clone(), *actLinearization2, tol)); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From af52b6811fc00dbd643b990be48f4fbe893f169f Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 10 Jul 2012 18:35:57 +0000 Subject: [PATCH 591/914] Fixing small warnings --- gtsam/slam/visualSLAM.cpp | 4 ++-- tests/testGaussianISAM2.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 5b04b92c6..2133c0ee8 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -31,7 +31,7 @@ namespace visualSLAM { if (Z.rows() != 2) throw std::invalid_argument("insertBackProjections: Z must be 2*K"); if (Z.cols() != J.size()) throw std::invalid_argument( "insertBackProjections: J and Z must have same number of entries"); - for(size_t k=0;k Date: Tue, 10 Jul 2012 18:36:21 +0000 Subject: [PATCH 592/914] Merge branch 'master' into wrap_mods_local --- gtsam/slam/visualSLAM.cpp | 4 +- .../nonlinear/LinearContainerFactor.cpp | 148 ++++++++++++++++++ .../nonlinear/LinearContainerFactor.h | 113 +++++++++++++ .../tests/testLinearContainerFactor.cpp | 113 +++++++++++++ tests/testGaussianISAM2.cpp | 2 +- 5 files changed, 377 insertions(+), 3 deletions(-) create mode 100644 gtsam_unstable/nonlinear/LinearContainerFactor.cpp create mode 100644 gtsam_unstable/nonlinear/LinearContainerFactor.h create mode 100644 gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp index 5b04b92c6..2133c0ee8 100644 --- a/gtsam/slam/visualSLAM.cpp +++ b/gtsam/slam/visualSLAM.cpp @@ -31,7 +31,7 @@ namespace visualSLAM { if (Z.rows() != 2) throw std::invalid_argument("insertBackProjections: Z must be 2*K"); if (Z.cols() != J.size()) throw std::invalid_argument( "insertBackProjections: J and Z must have same number of entries"); - for(size_t k=0;k + +#include + +namespace gtsam { + +/* ************************************************************************* */ +void LinearContainerFactor::rekeyFactor(const Ordering& ordering) { + Ordering::InvertedMap invOrdering = ordering.invert(); // TODO: inefficient - make more selective ordering invert + rekeyFactor(invOrdering); +} + +/* ************************************************************************* */ +void LinearContainerFactor::rekeyFactor(const Ordering::InvertedMap& invOrdering) { + BOOST_FOREACH(Index& idx, factor_->keys()) { + Key fullKey = invOrdering.find(idx)->second; + idx = fullKey; + keys_.push_back(fullKey); + } +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const JacobianFactor& factor, const Ordering& ordering) +: factor_(factor.clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const HessianFactor& factor, const Ordering& ordering) +: factor_(factor.clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor, const Ordering& ordering) +: factor_(factor->clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor) +: factor_(factor->clone()) +{ +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor(const JacobianFactor& factor, + const Ordering::InvertedMap& inverted_ordering) +: factor_(factor.clone()) { + rekeyFactor(inverted_ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor(const HessianFactor& factor, + const Ordering::InvertedMap& inverted_ordering) +: factor_(factor.clone()) { + rekeyFactor(inverted_ordering); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor, + const Ordering::InvertedMap& ordering) +: factor_(factor->clone()) { + rekeyFactor(ordering); +} + +/* ************************************************************************* */ +void LinearContainerFactor::print(const std::string& s, const KeyFormatter& keyFormatter) const { + Base::print(s+"LinearContainerFactor", keyFormatter); + if (factor_) + factor_->print(" Stored Factor", keyFormatter); +} + +/* ************************************************************************* */ +bool LinearContainerFactor::equals(const NonlinearFactor& f, double tol) const { + const LinearContainerFactor* jcf = dynamic_cast(&f); + return jcf && factor_->equals(*jcf->factor_, tol) && NonlinearFactor::equals(f); +} + +/* ************************************************************************* */ +double LinearContainerFactor::error(const Values& c) const { + // VectorValues vecvalues; + // // FIXME: add values correctly here + // return factor_.error(vecvalues); + return 0; // FIXME: placeholder +} + +/* ************************************************************************* */ +size_t LinearContainerFactor::dim() const { + if (isJacobian()) + return toJacobian()->get_model()->dim(); + else + return 1; // Hessians don't have true dimension +} + +/* ************************************************************************* */ +boost::shared_ptr +LinearContainerFactor::linearize(const Values& c, const Ordering& ordering) const { + // clone factor + boost::shared_ptr result = factor_->clone(); + + // rekey + BOOST_FOREACH(Index& key, result->keys()) + key = ordering[key]; + + return result; +} + +/* ************************************************************************* */ +bool LinearContainerFactor::isJacobian() const { + return boost::shared_dynamic_cast(factor_); +} + +/* ************************************************************************* */ +JacobianFactor::shared_ptr LinearContainerFactor::toJacobian() const { + return boost::shared_dynamic_cast(factor_); +} + +/* ************************************************************************* */ +HessianFactor::shared_ptr LinearContainerFactor::toHessian() const { + return boost::shared_dynamic_cast(factor_); +} + +/* ************************************************************************* */ +GaussianFactor::shared_ptr LinearContainerFactor::negate(const Ordering& ordering) const { + GaussianFactor::shared_ptr result = factor_->negate(); + BOOST_FOREACH(Key& key, result->keys()) + key = ordering[key]; + return result; +} + +/* ************************************************************************* */ +} // \namespace gtsam + + + diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.h b/gtsam_unstable/nonlinear/LinearContainerFactor.h new file mode 100644 index 000000000..23705f96e --- /dev/null +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.h @@ -0,0 +1,113 @@ +/** + * @file LinearContainerFactor.h + * + * @brief Wrap Jacobian and Hessian linear factors to allow simple injection into a nonlinear graph + * + * @date Jul 6, 2012 + * @author Alex Cunningham + */ + +#pragma once + +#include +#include + +namespace gtsam { + +/** + * Dummy version of a generic linear factor to be injected into a nonlinear factor graph + */ +class LinearContainerFactor : public NonlinearFactor { +protected: + + GaussianFactor::shared_ptr factor_; + +public: + + /** Primary constructor: store a linear factor and decode the ordering */ + LinearContainerFactor(const JacobianFactor& factor, const Ordering& ordering); + + /** Primary constructor: store a linear factor and decode the ordering */ + LinearContainerFactor(const HessianFactor& factor, const Ordering& ordering); + + /** Constructor from shared_ptr */ + LinearContainerFactor(const GaussianFactor::shared_ptr& factor, const Ordering& ordering); + + /** Constructor from re-keyed factor: all indices assumed replaced with Key */ + LinearContainerFactor(const GaussianFactor::shared_ptr& factor); + + /** Alternate constructor: store a linear factor and decode keys with inverted ordering*/ + LinearContainerFactor(const JacobianFactor& factor, + const Ordering::InvertedMap& inverted_ordering); + + /** Alternate constructor: store a linear factor and decode keys with inverted ordering*/ + LinearContainerFactor(const HessianFactor& factor, + const Ordering::InvertedMap& inverted_ordering); + + /** Constructor from shared_ptr with inverted ordering*/ + LinearContainerFactor(const GaussianFactor::shared_ptr& factor, + const Ordering::InvertedMap& ordering); + + // Access + + const GaussianFactor::shared_ptr& factor() const { return factor_; } + + // Testable + + /** print */ + void print(const std::string& s = "", const KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const; + + /** Check if two factors are equal */ + bool equals(const NonlinearFactor& f, double tol = 1e-9) const; + + // NonlinearFactor + + /** + * Calculate the error of the factor: uses the underlying linear factor to compute ordering + */ + double error(const Values& c) const; + + /** get the dimension of the factor: rows of linear factor */ + size_t dim() const; + + /** linearize to a GaussianFactor: values has no effect, just clones/rekeys underlying factor */ + boost::shared_ptr + linearize(const Values& c, const Ordering& ordering) const; + + /** + * Creates an anti-factor directly and performs rekeying due to ordering + */ + GaussianFactor::shared_ptr negate(const Ordering& ordering) const; + + /** + * Creates a shared_ptr clone of the factor - needs to be specialized to allow + * for subclasses + * + * Clones the underlying linear factor + */ + NonlinearFactor::shared_ptr clone() const { + return NonlinearFactor::shared_ptr(new LinearContainerFactor(factor_)); + } + + // casting syntactic sugar + + /** + * Simple check whether this is a Jacobian or Hessian factor + */ + bool isJacobian() const; + + /** Casts to JacobianFactor */ + JacobianFactor::shared_ptr toJacobian() const; + + /** Casts to HessianFactor */ + HessianFactor::shared_ptr toHessian() const; + +protected: + void rekeyFactor(const Ordering& ordering); + void rekeyFactor(const Ordering::InvertedMap& invOrdering); + +}; // \class LinearContainerFactor + +} // \namespace gtsam + + diff --git a/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp new file mode 100644 index 000000000..e85b880e8 --- /dev/null +++ b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp @@ -0,0 +1,113 @@ +/** + * @file testLinearContainerFactor.cpp + * + * @date Jul 6, 2012 + * @author Alex Cunningham + */ + +#include + +#include + +#include + +using namespace gtsam; + +const gtsam::noiseModel::Diagonal::shared_ptr diag_model2 = noiseModel::Diagonal::Sigmas(Vector_(2, 1.0, 1.0)); +const double tol = 1e-5; + +gtsam::Key l1 = 101, l2 = 102, x1 = 1, x2 = 2; + +Point2 landmark1(5.0, 1.5), landmark2(7.0, 1.5); +Pose2 poseA1(0.0, 0.0, 0.0), poseA2(2.0, 0.0, 0.0); + +/* ************************************************************************* */ +TEST( testLinearContainerFactor, generic_jacobian_factor ) { + + Ordering initOrdering; initOrdering += x1, x2, l1, l2; + + JacobianFactor expLinFactor1( + initOrdering[l1], + Matrix_(2,2, + 2.74222, -0.0067457, + 0.0, 2.63624), + initOrdering[l2], + Matrix_(2,2, + -0.0455167, -0.0443573, + -0.0222154, -0.102489), + Vector_(2, 0.0277052, + -0.0533393), + diag_model2); + + LinearContainerFactor actFactor1(expLinFactor1, initOrdering); + Values values; + values.insert(l1, landmark1); + values.insert(l2, landmark2); + values.insert(x1, poseA1); + values.insert(x2, poseA2); + + // Check reconstruction from same ordering + GaussianFactor::shared_ptr actLinearizationA = actFactor1.linearize(values, initOrdering); + EXPECT(assert_equal(*expLinFactor1.clone(), *actLinearizationA, tol)); + + // Check reconstruction from new ordering + Ordering newOrdering; newOrdering += x1, l1, x2, l2; + GaussianFactor::shared_ptr actLinearizationB = actFactor1.linearize(values, newOrdering); + + JacobianFactor expLinFactor2( + newOrdering[l1], + Matrix_(2,2, + 2.74222, -0.0067457, + 0.0, 2.63624), + newOrdering[l2], + Matrix_(2,2, + -0.0455167, -0.0443573, + -0.0222154, -0.102489), + Vector_(2, 0.0277052, + -0.0533393), + diag_model2); + + EXPECT(assert_equal(*expLinFactor2.clone(), *actLinearizationB, tol)); +} + +/* ************************************************************************* */ +TEST( testLinearContainerFactor, generic_hessian_factor ) { + Matrix G11 = Matrix_(1,1, 1.0); + Matrix G12 = Matrix_(1,2, 2.0, 4.0); + Matrix G13 = Matrix_(1,3, 3.0, 6.0, 9.0); + + Matrix G22 = Matrix_(2,2, 3.0, 5.0, 0.0, 6.0); + Matrix G23 = Matrix_(2,3, 4.0, 6.0, 8.0, 1.0, 2.0, 4.0); + + Matrix G33 = Matrix_(3,3, 1.0, 2.0, 3.0, 0.0, 5.0, 6.0, 0.0, 0.0, 9.0); + + Vector g1 = Vector_(1, -7.0); + Vector g2 = Vector_(2, -8.0, -9.0); + Vector g3 = Vector_(3, 1.0, 2.0, 3.0); + + double f = 10.0; + + Ordering initOrdering; initOrdering += x1, x2, l1, l2; + HessianFactor initFactor(initOrdering[x1], initOrdering[x2], initOrdering[l1], + G11, G12, G13, g1, G22, G23, g2, G33, g3, f); + + Values values; + values.insert(l1, landmark1); + values.insert(l2, landmark2); + values.insert(x1, poseA1); + values.insert(x2, poseA2); + + LinearContainerFactor actFactor(initFactor, initOrdering); + GaussianFactor::shared_ptr actLinearization1 = actFactor.linearize(values, initOrdering); + EXPECT(assert_equal(*initFactor.clone(), *actLinearization1, tol)); + + Ordering newOrdering; newOrdering += l1, x1, x2, l2; + HessianFactor expLinFactor(newOrdering[x1], newOrdering[x2], newOrdering[l1], + G11, G12, G13, g1, G22, G23, g2, G33, g3, f); + GaussianFactor::shared_ptr actLinearization2 = actFactor.linearize(values, newOrdering); + EXPECT(assert_equal(*expLinFactor.clone(), *actLinearization2, tol)); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index f63d2add5..9fdd6512f 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -431,7 +431,7 @@ bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, cons bool totalGradOk = assert_equal(expectedGradient, actualGradient); EXPECT(totalGradOk); - return nodeGradientsOk && expectedGradOk && totalGradOk; + return nodeGradientsOk && expectedGradOk && totalGradOk && isamEqual; } /* ************************************************************************* */ From 0c384dc35ae9e807f91f32d70250290a639a9e4c Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 10 Jul 2012 22:38:21 +0000 Subject: [PATCH 593/914] Added a check that all wrapped classes involved in a heirarchy are marked virtual --- gtsam.h | 10 +- wrap/Module.cpp | 833 ++++++++++++++++++++++++----------------------- wrap/utilities.h | 10 + 3 files changed, 436 insertions(+), 417 deletions(-) diff --git a/gtsam.h b/gtsam.h index 46ea37241..73f73389c 100644 --- a/gtsam.h +++ b/gtsam.h @@ -702,17 +702,17 @@ class VariableIndex { #include namespace noiseModel { -class Base { +virtual class Base { }; -class Gaussian : gtsam::noiseModel::Base { +virtual class Gaussian : gtsam::noiseModel::Base { static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); static gtsam::noiseModel::Gaussian* Covariance(Matrix R); // Matrix R() const; // FIXME: cannot parse!!! void print(string s) const; }; -class Diagonal : gtsam::noiseModel::Gaussian { +virtual class Diagonal : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas); static gtsam::noiseModel::Diagonal* Variances(Vector variances); static gtsam::noiseModel::Diagonal* Precisions(Vector precisions); @@ -720,14 +720,14 @@ class Diagonal : gtsam::noiseModel::Gaussian { void print(string s) const; }; -class Isotropic : gtsam::noiseModel::Gaussian { +virtual class Isotropic : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); static gtsam::noiseModel::Isotropic* Precision(size_t dim, double precision); void print(string s) const; }; -class Unit : gtsam::noiseModel::Gaussian { +virtual class Unit : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Unit* Create(size_t dim); void print(string s) const; }; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 6109da928..413fc84b8 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -1,355 +1,355 @@ -/* ---------------------------------------------------------------------------- - - * 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 Module.ccp - * @author Frank Dellaert - * @author Alex Cunningham - * @author Andrew Melim - **/ - -#include "Module.h" -#include "FileWriter.h" -#include "utilities.h" -#include "spirit_actors.h" - -//#define BOOST_SPIRIT_DEBUG -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -using namespace std; -using namespace wrap; -using namespace BOOST_SPIRIT_CLASSIC_NS; -namespace bl = boost::lambda; -namespace fs = boost::filesystem; - -typedef rule Rule; - -/* ************************************************************************* */ -// We parse an interface file into a Module object. -// The grammar is defined using the boost/spirit combinatorial parser. -// For example, str_p("const") parses the string "const", and the >> -// operator creates a sequence parser. The grammar below, composed of rules -// and with start rule [class_p], doubles as the specs for our interface files. -/* ************************************************************************* */ - -Module::Module(const string& interfacePath, - const string& moduleName, bool enable_verbose) : name(moduleName), verbose(enable_verbose) -{ - // these variables will be imperatively updated to gradually build [cls] - // The one with postfix 0 are used to reset the variables after parse. - string methodName, methodName0; - bool isConst, isConst0 = false; - ReturnValue retVal0, retVal; - Argument arg0, arg; - ArgumentList args0, args; - vector arg_dup; ///keep track of duplicates - Constructor constructor0(enable_verbose), constructor(enable_verbose); - Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); - //Method method0(enable_verbose), method(enable_verbose); - StaticMethod static_method0(enable_verbose), static_method(enable_verbose); - Class cls0(enable_verbose),cls(enable_verbose); - ForwardDeclaration fwDec0, fwDec; - vector namespaces, /// current namespace tag - namespace_includes, /// current set of includes - namespaces_return, /// namespace for current return type - using_namespace_current; /// All namespaces from "using" declarations - string include_path = ""; - const string null_str = ""; - - //---------------------------------------------------------------------------- - // Grammar with actions that build the Class object. Actions are - // defined within the square brackets [] and are executed whenever a - // rule is successfully parsed. Define BOOST_SPIRIT_DEBUG to debug. - // The grammar is allows a very restricted C++ header - // lexeme_d turns off white space skipping - // http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/doc/directives.html - // ---------------------------------------------------------------------------- - - Rule comments_p = comment_p("/*", "*/") | comment_p("//", eol_p); - - Rule basisType_p = - (str_p("string") | "bool" | "size_t" | "int" | "double" | "char" | "unsigned char"); - - Rule keywords_p = - (str_p("const") | "static" | "namespace" | basisType_p); - - Rule eigenType_p = - (str_p("Vector") | "Matrix"); - - Rule className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p - keywords_p); - - Rule namespace_name_p = lexeme_d[lower_p >> *(alnum_p | '_')] - keywords_p; - - Rule namespace_arg_p = namespace_name_p[push_back_a(arg.namespaces)] >> str_p("::"); - - Rule argEigenType_p = - eigenType_p[assign_a(arg.type)] >> - !ch_p('*')[assign_a(arg.is_ptr,true)]; - - Rule eigenRef_p = - !str_p("const") [assign_a(arg.is_const,true)] >> - eigenType_p [assign_a(arg.type)] >> - ch_p('&') [assign_a(arg.is_ref,true)]; - - Rule classArg_p = - !str_p("const") [assign_a(arg.is_const,true)] >> - *namespace_arg_p >> - className_p[assign_a(arg.type)] >> - (ch_p('*')[assign_a(arg.is_ptr,true)] | ch_p('&')[assign_a(arg.is_ref,true)]); - - Rule classParent_p = - *(namespace_name_p[push_back_a(cls.qualifiedParent)] >> str_p("::")) >> - className_p[push_back_a(cls.qualifiedParent)]; - - Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; - - Rule argument_p = - ((basisType_p[assign_a(arg.type)] | argEigenType_p | eigenRef_p | classArg_p) - >> name_p[assign_a(arg.name)]) - [push_back_a(args, arg)] - [assign_a(arg,arg0)]; - - Rule argumentList_p = !argument_p >> * (',' >> argument_p); - - Rule constructor_p = - (className_p >> '(' >> argumentList_p >> ')' >> ';' >> !comments_p) - [push_back_a(constructor.args_list, args)] - [assign_a(args,args0)]; - //[assign_a(constructor.args,args)] - //[assign_a(constructor.name,cls.name)] - //[push_back_a(cls.constructors, constructor)] - //[assign_a(constructor,constructor0)]; - - Rule namespace_ret_p = namespace_name_p[push_back_a(namespaces_return)] >> str_p("::"); - - Rule returnType1_p = - (basisType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::BASIS)]) | - ((*namespace_ret_p)[assign_a(retVal.namespaces1, namespaces_return)][clear_a(namespaces_return)] - >> (className_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::CLASS)]) >> - !ch_p('*')[assign_a(retVal.isPtr1,true)]) | - (eigenType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::EIGEN)]); - - Rule returnType2_p = - (basisType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::BASIS)]) | - ((*namespace_ret_p)[assign_a(retVal.namespaces2, namespaces_return)][clear_a(namespaces_return)] - >> (className_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::CLASS)]) >> - !ch_p('*') [assign_a(retVal.isPtr2,true)]) | - (eigenType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::EIGEN)]); - - Rule pair_p = - (str_p("pair") >> '<' >> returnType1_p >> ',' >> returnType2_p >> '>') - [assign_a(retVal.isPair,true)]; - - Rule void_p = str_p("void")[assign_a(retVal.type1)]; - - Rule returnType_p = void_p | returnType1_p | pair_p; - - Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')]; - - Rule method_p = - (returnType_p >> methodName_p[assign_a(methodName)] >> - '(' >> argumentList_p >> ')' >> - !str_p("const")[assign_a(isConst,true)] >> ';' >> *comments_p) - [bl::bind(&Method::addOverload, - bl::var(cls.methods)[bl::var(methodName)], - verbose, - bl::var(isConst), - bl::var(methodName), - bl::var(args), - bl::var(retVal))] - [assign_a(isConst,isConst0)] - [assign_a(methodName,methodName0)] - [assign_a(args,args0)] - [assign_a(retVal,retVal0)]; - - Rule staticMethodName_p = lexeme_d[(upper_p | lower_p) >> *(alnum_p | '_')]; - - Rule static_method_p = - (str_p("static") >> returnType_p >> staticMethodName_p[assign_a(methodName)] >> - '(' >> argumentList_p >> ')' >> ';' >> *comments_p) - [bl::bind(&StaticMethod::addOverload, - bl::var(cls.static_methods)[bl::var(methodName)], - verbose, - bl::var(methodName), - bl::var(args), - bl::var(retVal))] - [assign_a(methodName,methodName0)] - [assign_a(args,args0)] - [assign_a(retVal,retVal0)]; - - Rule functions_p = constructor_p | method_p | static_method_p; - - Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[assign_a(include_path)] >> ch_p('>'); - - Rule class_p = - (!*include_p - >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) - >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] - >> className_p[assign_a(cls.name)] - >> ((':' >> classParent_p >> '{') | '{') // By having (parent >> '{' | '{') here instead of (!parent >> '{'), we trigger a parse error on a badly-formed parent spec - >> *(functions_p | comments_p) - >> str_p("};")) - [assign_a(constructor.name, cls.name)] - [assign_a(cls.constructor, constructor)] - [assign_a(cls.namespaces, namespaces)] - [assign_a(cls.using_namespaces, using_namespace_current)] - [append_a(cls.includes, namespace_includes)] - [assign_a(deconstructor.name,cls.name)] - [assign_a(cls.deconstructor, deconstructor)] - [push_back_a(classes, cls)] - [assign_a(deconstructor,deconstructor0)] - [assign_a(constructor, constructor0)] - [assign_a(cls,cls0)]; - - Rule namespace_def_p = - (!*include_p - >> str_p("namespace")[push_back_a(namespace_includes, include_path)][assign_a(include_path, null_str)] - >> namespace_name_p[push_back_a(namespaces)] - >> ch_p('{') - >> *(class_p | namespace_def_p | comments_p) - >> str_p("}///\\namespace") // end namespace, avoid confusion with classes - >> !namespace_name_p) - [pop_a(namespaces)] - [pop_a(namespace_includes)]; - - Rule using_namespace_p = - str_p("using") >> str_p("namespace") - >> namespace_name_p[push_back_a(using_namespace_current)] >> ch_p(';'); - - Rule forward_declaration_p = - !(str_p("virtual")[assign_a(fwDec.isVirtual, true)]) - >> str_p("class") - >> (*(namespace_name_p >> str_p("::")) >> className_p)[assign_a(fwDec.name)] - >> ch_p(';') - [push_back_a(forward_declarations, fwDec)] - [assign_a(fwDec, fwDec0)]; - - Rule module_content_p = comments_p | using_namespace_p | class_p | forward_declaration_p | namespace_def_p ; - - Rule module_p = *module_content_p >> !end_p; - - //---------------------------------------------------------------------------- - // for debugging, define BOOST_SPIRIT_DEBUG -# ifdef BOOST_SPIRIT_DEBUG - BOOST_SPIRIT_DEBUG_NODE(className_p); - BOOST_SPIRIT_DEBUG_NODE(classPtr_p); - BOOST_SPIRIT_DEBUG_NODE(classRef_p); - BOOST_SPIRIT_DEBUG_NODE(basisType_p); - BOOST_SPIRIT_DEBUG_NODE(name_p); - BOOST_SPIRIT_DEBUG_NODE(argument_p); - BOOST_SPIRIT_DEBUG_NODE(argumentList_p); - BOOST_SPIRIT_DEBUG_NODE(constructor_p); - BOOST_SPIRIT_DEBUG_NODE(returnType1_p); - BOOST_SPIRIT_DEBUG_NODE(returnType2_p); - BOOST_SPIRIT_DEBUG_NODE(pair_p); - BOOST_SPIRIT_DEBUG_NODE(void_p); - BOOST_SPIRIT_DEBUG_NODE(returnType_p); - BOOST_SPIRIT_DEBUG_NODE(methodName_p); - BOOST_SPIRIT_DEBUG_NODE(method_p); - BOOST_SPIRIT_DEBUG_NODE(class_p); - BOOST_SPIRIT_DEBUG_NODE(namespace_def_p); - BOOST_SPIRIT_DEBUG_NODE(module_p); -# endif - //---------------------------------------------------------------------------- - - // read interface file - string interfaceFile = interfacePath + "/" + moduleName + ".h"; - string contents = file_contents(interfaceFile); - - // and parse contents - parse_info info = parse(contents.c_str(), module_p, space_p); - if(!info.full) { - printf("parsing stopped at \n%.20s\n",info.stop); - throw ParseFailed(info.length); - } -} - -/* ************************************************************************* */ -template -void verifyArguments(const vector& validArgs, const map& vt) { - typedef typename map::value_type Name_Method; - BOOST_FOREACH(const Name_Method& name_method, vt) { - const T& t = name_method.second; - BOOST_FOREACH(const ArgumentList& argList, t.argLists) { - BOOST_FOREACH(Argument arg, argList) { - string fullType = arg.qualifiedType("::"); - if(find(validArgs.begin(), validArgs.end(), fullType) - == validArgs.end()) - throw DependencyMissing(fullType, t.name); - } - } - } -} - -/* ************************************************************************* */ -template -void verifyReturnTypes(const vector& validtypes, const map& vt) { - typedef typename map::value_type Name_Method; - BOOST_FOREACH(const Name_Method& name_method, vt) { - const T& t = name_method.second; - BOOST_FOREACH(const ReturnValue& retval, t.returnVals) { - if (find(validtypes.begin(), validtypes.end(), retval.qualifiedType1("::")) == validtypes.end()) - throw DependencyMissing(retval.qualifiedType1("::"), t.name); - if (retval.isPair && find(validtypes.begin(), validtypes.end(), retval.qualifiedType2("::")) == validtypes.end()) - throw DependencyMissing(retval.qualifiedType2("::"), t.name); - } - } -} - -/* ************************************************************************* */ -void Module::matlab_code(const string& toolboxPath, const string& headerPath) const { - - fs::create_directories(toolboxPath); - - // create the unified .cpp switch file - const string wrapperName = name + "_wrapper"; - string wrapperFileName = toolboxPath + "/" + wrapperName + ".cpp"; - FileWriter wrapperFile(wrapperFileName, verbose, "//"); - vector functionNames; // Function names stored by index for switch - wrapperFile.oss << "#include \n"; - wrapperFile.oss << "#include \n"; - wrapperFile.oss << "#include \n"; - wrapperFile.oss << "\n"; - - // Dependency check list - vector validTypes; - BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { - validTypes.push_back(fwDec.name); - } - validTypes.push_back("void"); - validTypes.push_back("string"); - validTypes.push_back("int"); - validTypes.push_back("bool"); - validTypes.push_back("char"); - validTypes.push_back("unsigned char"); - validTypes.push_back("size_t"); - validTypes.push_back("double"); - validTypes.push_back("Vector"); - validTypes.push_back("Matrix"); +/* ---------------------------------------------------------------------------- + + * 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 Module.ccp + * @author Frank Dellaert + * @author Alex Cunningham + * @author Andrew Melim + **/ + +#include "Module.h" +#include "FileWriter.h" +#include "utilities.h" +#include "spirit_actors.h" + +//#define BOOST_SPIRIT_DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace wrap; +using namespace BOOST_SPIRIT_CLASSIC_NS; +namespace bl = boost::lambda; +namespace fs = boost::filesystem; + +typedef rule Rule; + +/* ************************************************************************* */ +// We parse an interface file into a Module object. +// The grammar is defined using the boost/spirit combinatorial parser. +// For example, str_p("const") parses the string "const", and the >> +// operator creates a sequence parser. The grammar below, composed of rules +// and with start rule [class_p], doubles as the specs for our interface files. +/* ************************************************************************* */ + +Module::Module(const string& interfacePath, + const string& moduleName, bool enable_verbose) : name(moduleName), verbose(enable_verbose) +{ + // these variables will be imperatively updated to gradually build [cls] + // The one with postfix 0 are used to reset the variables after parse. + string methodName, methodName0; + bool isConst, isConst0 = false; + ReturnValue retVal0, retVal; + Argument arg0, arg; + ArgumentList args0, args; + vector arg_dup; ///keep track of duplicates + Constructor constructor0(enable_verbose), constructor(enable_verbose); + Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); + //Method method0(enable_verbose), method(enable_verbose); + StaticMethod static_method0(enable_verbose), static_method(enable_verbose); + Class cls0(enable_verbose),cls(enable_verbose); + ForwardDeclaration fwDec0, fwDec; + vector namespaces, /// current namespace tag + namespace_includes, /// current set of includes + namespaces_return, /// namespace for current return type + using_namespace_current; /// All namespaces from "using" declarations + string include_path = ""; + const string null_str = ""; + + //---------------------------------------------------------------------------- + // Grammar with actions that build the Class object. Actions are + // defined within the square brackets [] and are executed whenever a + // rule is successfully parsed. Define BOOST_SPIRIT_DEBUG to debug. + // The grammar is allows a very restricted C++ header + // lexeme_d turns off white space skipping + // http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/doc/directives.html + // ---------------------------------------------------------------------------- + + Rule comments_p = comment_p("/*", "*/") | comment_p("//", eol_p); + + Rule basisType_p = + (str_p("string") | "bool" | "size_t" | "int" | "double" | "char" | "unsigned char"); + + Rule keywords_p = + (str_p("const") | "static" | "namespace" | basisType_p); + + Rule eigenType_p = + (str_p("Vector") | "Matrix"); + + Rule className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p - keywords_p); + + Rule namespace_name_p = lexeme_d[lower_p >> *(alnum_p | '_')] - keywords_p; + + Rule namespace_arg_p = namespace_name_p[push_back_a(arg.namespaces)] >> str_p("::"); + + Rule argEigenType_p = + eigenType_p[assign_a(arg.type)] >> + !ch_p('*')[assign_a(arg.is_ptr,true)]; + + Rule eigenRef_p = + !str_p("const") [assign_a(arg.is_const,true)] >> + eigenType_p [assign_a(arg.type)] >> + ch_p('&') [assign_a(arg.is_ref,true)]; + + Rule classArg_p = + !str_p("const") [assign_a(arg.is_const,true)] >> + *namespace_arg_p >> + className_p[assign_a(arg.type)] >> + (ch_p('*')[assign_a(arg.is_ptr,true)] | ch_p('&')[assign_a(arg.is_ref,true)]); + + Rule classParent_p = + *(namespace_name_p[push_back_a(cls.qualifiedParent)] >> str_p("::")) >> + className_p[push_back_a(cls.qualifiedParent)]; + + Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; + + Rule argument_p = + ((basisType_p[assign_a(arg.type)] | argEigenType_p | eigenRef_p | classArg_p) + >> name_p[assign_a(arg.name)]) + [push_back_a(args, arg)] + [assign_a(arg,arg0)]; + + Rule argumentList_p = !argument_p >> * (',' >> argument_p); + + Rule constructor_p = + (className_p >> '(' >> argumentList_p >> ')' >> ';' >> !comments_p) + [push_back_a(constructor.args_list, args)] + [assign_a(args,args0)]; + //[assign_a(constructor.args,args)] + //[assign_a(constructor.name,cls.name)] + //[push_back_a(cls.constructors, constructor)] + //[assign_a(constructor,constructor0)]; + + Rule namespace_ret_p = namespace_name_p[push_back_a(namespaces_return)] >> str_p("::"); + + Rule returnType1_p = + (basisType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::BASIS)]) | + ((*namespace_ret_p)[assign_a(retVal.namespaces1, namespaces_return)][clear_a(namespaces_return)] + >> (className_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::CLASS)]) >> + !ch_p('*')[assign_a(retVal.isPtr1,true)]) | + (eigenType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::EIGEN)]); + + Rule returnType2_p = + (basisType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::BASIS)]) | + ((*namespace_ret_p)[assign_a(retVal.namespaces2, namespaces_return)][clear_a(namespaces_return)] + >> (className_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::CLASS)]) >> + !ch_p('*') [assign_a(retVal.isPtr2,true)]) | + (eigenType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::EIGEN)]); + + Rule pair_p = + (str_p("pair") >> '<' >> returnType1_p >> ',' >> returnType2_p >> '>') + [assign_a(retVal.isPair,true)]; + + Rule void_p = str_p("void")[assign_a(retVal.type1)]; + + Rule returnType_p = void_p | returnType1_p | pair_p; + + Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')]; + + Rule method_p = + (returnType_p >> methodName_p[assign_a(methodName)] >> + '(' >> argumentList_p >> ')' >> + !str_p("const")[assign_a(isConst,true)] >> ';' >> *comments_p) + [bl::bind(&Method::addOverload, + bl::var(cls.methods)[bl::var(methodName)], + verbose, + bl::var(isConst), + bl::var(methodName), + bl::var(args), + bl::var(retVal))] + [assign_a(isConst,isConst0)] + [assign_a(methodName,methodName0)] + [assign_a(args,args0)] + [assign_a(retVal,retVal0)]; + + Rule staticMethodName_p = lexeme_d[(upper_p | lower_p) >> *(alnum_p | '_')]; + + Rule static_method_p = + (str_p("static") >> returnType_p >> staticMethodName_p[assign_a(methodName)] >> + '(' >> argumentList_p >> ')' >> ';' >> *comments_p) + [bl::bind(&StaticMethod::addOverload, + bl::var(cls.static_methods)[bl::var(methodName)], + verbose, + bl::var(methodName), + bl::var(args), + bl::var(retVal))] + [assign_a(methodName,methodName0)] + [assign_a(args,args0)] + [assign_a(retVal,retVal0)]; + + Rule functions_p = constructor_p | method_p | static_method_p; + + Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[assign_a(include_path)] >> ch_p('>'); + + Rule class_p = + (!*include_p + >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) + >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] + >> className_p[assign_a(cls.name)] + >> ((':' >> classParent_p >> '{') | '{') // By having (parent >> '{' | '{') here instead of (!parent >> '{'), we trigger a parse error on a badly-formed parent spec + >> *(functions_p | comments_p) + >> str_p("};")) + [assign_a(constructor.name, cls.name)] + [assign_a(cls.constructor, constructor)] + [assign_a(cls.namespaces, namespaces)] + [assign_a(cls.using_namespaces, using_namespace_current)] + [append_a(cls.includes, namespace_includes)] + [assign_a(deconstructor.name,cls.name)] + [assign_a(cls.deconstructor, deconstructor)] + [push_back_a(classes, cls)] + [assign_a(deconstructor,deconstructor0)] + [assign_a(constructor, constructor0)] + [assign_a(cls,cls0)]; + + Rule namespace_def_p = + (!*include_p + >> str_p("namespace")[push_back_a(namespace_includes, include_path)][assign_a(include_path, null_str)] + >> namespace_name_p[push_back_a(namespaces)] + >> ch_p('{') + >> *(class_p | namespace_def_p | comments_p) + >> str_p("}///\\namespace") // end namespace, avoid confusion with classes + >> !namespace_name_p) + [pop_a(namespaces)] + [pop_a(namespace_includes)]; + + Rule using_namespace_p = + str_p("using") >> str_p("namespace") + >> namespace_name_p[push_back_a(using_namespace_current)] >> ch_p(';'); + + Rule forward_declaration_p = + !(str_p("virtual")[assign_a(fwDec.isVirtual, true)]) + >> str_p("class") + >> (*(namespace_name_p >> str_p("::")) >> className_p)[assign_a(fwDec.name)] + >> ch_p(';') + [push_back_a(forward_declarations, fwDec)] + [assign_a(fwDec, fwDec0)]; + + Rule module_content_p = comments_p | using_namespace_p | class_p | forward_declaration_p | namespace_def_p ; + + Rule module_p = *module_content_p >> !end_p; + + //---------------------------------------------------------------------------- + // for debugging, define BOOST_SPIRIT_DEBUG +# ifdef BOOST_SPIRIT_DEBUG + BOOST_SPIRIT_DEBUG_NODE(className_p); + BOOST_SPIRIT_DEBUG_NODE(classPtr_p); + BOOST_SPIRIT_DEBUG_NODE(classRef_p); + BOOST_SPIRIT_DEBUG_NODE(basisType_p); + BOOST_SPIRIT_DEBUG_NODE(name_p); + BOOST_SPIRIT_DEBUG_NODE(argument_p); + BOOST_SPIRIT_DEBUG_NODE(argumentList_p); + BOOST_SPIRIT_DEBUG_NODE(constructor_p); + BOOST_SPIRIT_DEBUG_NODE(returnType1_p); + BOOST_SPIRIT_DEBUG_NODE(returnType2_p); + BOOST_SPIRIT_DEBUG_NODE(pair_p); + BOOST_SPIRIT_DEBUG_NODE(void_p); + BOOST_SPIRIT_DEBUG_NODE(returnType_p); + BOOST_SPIRIT_DEBUG_NODE(methodName_p); + BOOST_SPIRIT_DEBUG_NODE(method_p); + BOOST_SPIRIT_DEBUG_NODE(class_p); + BOOST_SPIRIT_DEBUG_NODE(namespace_def_p); + BOOST_SPIRIT_DEBUG_NODE(module_p); +# endif + //---------------------------------------------------------------------------- + + // read interface file + string interfaceFile = interfacePath + "/" + moduleName + ".h"; + string contents = file_contents(interfaceFile); + + // and parse contents + parse_info info = parse(contents.c_str(), module_p, space_p); + if(!info.full) { + printf("parsing stopped at \n%.20s\n",info.stop); + throw ParseFailed(info.length); + } +} + +/* ************************************************************************* */ +template +void verifyArguments(const vector& validArgs, const map& vt) { + typedef typename map::value_type Name_Method; + BOOST_FOREACH(const Name_Method& name_method, vt) { + const T& t = name_method.second; + BOOST_FOREACH(const ArgumentList& argList, t.argLists) { + BOOST_FOREACH(Argument arg, argList) { + string fullType = arg.qualifiedType("::"); + if(find(validArgs.begin(), validArgs.end(), fullType) + == validArgs.end()) + throw DependencyMissing(fullType, t.name); + } + } + } +} + +/* ************************************************************************* */ +template +void verifyReturnTypes(const vector& validtypes, const map& vt) { + typedef typename map::value_type Name_Method; + BOOST_FOREACH(const Name_Method& name_method, vt) { + const T& t = name_method.second; + BOOST_FOREACH(const ReturnValue& retval, t.returnVals) { + if (find(validtypes.begin(), validtypes.end(), retval.qualifiedType1("::")) == validtypes.end()) + throw DependencyMissing(retval.qualifiedType1("::"), t.name); + if (retval.isPair && find(validtypes.begin(), validtypes.end(), retval.qualifiedType2("::")) == validtypes.end()) + throw DependencyMissing(retval.qualifiedType2("::"), t.name); + } + } +} + +/* ************************************************************************* */ +void Module::matlab_code(const string& toolboxPath, const string& headerPath) const { + + fs::create_directories(toolboxPath); + + // create the unified .cpp switch file + const string wrapperName = name + "_wrapper"; + string wrapperFileName = toolboxPath + "/" + wrapperName + ".cpp"; + FileWriter wrapperFile(wrapperFileName, verbose, "//"); + vector functionNames; // Function names stored by index for switch + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "\n"; + + // Dependency check list + vector validTypes; + BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { + validTypes.push_back(fwDec.name); + } + validTypes.push_back("void"); + validTypes.push_back("string"); + validTypes.push_back("int"); + validTypes.push_back("bool"); + validTypes.push_back("char"); + validTypes.push_back("unsigned char"); + validTypes.push_back("size_t"); + validTypes.push_back("double"); + validTypes.push_back("Vector"); + validTypes.push_back("Matrix"); //Create a list of parsed classes for dependency checking BOOST_FOREACH(const Class& cls, classes) { validTypes.push_back(cls.qualifiedName("::")); - } - + } + // Create type attributes table ReturnValue::TypeAttributesTable typeAttributes; BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { @@ -359,71 +359,80 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co BOOST_FOREACH(const Class& cls, classes) { if(!typeAttributes.insert(make_pair(cls.qualifiedName("::"), ReturnValue::TypeAttributes(cls.isVirtual))).second) throw DuplicateDefinition("class " + cls.qualifiedName("::")); - - // Check that class is virtual if it has a parent } - - // Check that all classes have been defined somewhere - BOOST_FOREACH(const Class& cls, classes) { - // verify all of the function arguments - //TODO:verifyArguments(validTypes, cls.constructor.args_list); - verifyArguments(validTypes, cls.static_methods); - verifyArguments(validTypes, cls.methods); - - // verify function return types - verifyReturnTypes(validTypes, cls.static_methods); - verifyReturnTypes(validTypes, cls.methods); - } - - // Generate all includes + // Check attributes BOOST_FOREACH(const Class& cls, classes) { - generateIncludes(wrapperFile, cls.name, cls.includes); - } - wrapperFile.oss << "\n"; - - // Generate all collectors + // Check that class is virtual if it has a parent + if(!cls.qualifiedParent.empty() && !cls.isVirtual) + throw AttributeError(cls.qualifiedName("::"), "Has a base class so needs to be declared virtual, change to 'virtual class "+cls.name+" ...'"); + // Check that parent is virtual as well + if(!cls.qualifiedParent.empty() && !typeAttributes.at(wrap::qualifiedName("::", cls.qualifiedParent)).isVirtual) + throw AttributeError(wrap::qualifiedName("::", cls.qualifiedParent), + "Is the base class of " + cls.qualifiedName("::") + ", so needs to be declared virtual"); + } + + // Check that all classes have been defined somewhere BOOST_FOREACH(const Class& cls, classes) { - const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); - wrapperFile.oss << "typedef std::set*> " - << "Collector_" << matlabName << ";\n"; - wrapperFile.oss << "static Collector_" << matlabName << - " collector_" << matlabName << ";\n"; - } - - // generate mexAtExit cleanup function - wrapperFile.oss << "void _deleteAllObjects()\n"; - wrapperFile.oss << "{\n"; + // verify all of the function arguments + //TODO:verifyArguments(validTypes, cls.constructor.args_list); + verifyArguments(validTypes, cls.static_methods); + verifyArguments(validTypes, cls.methods); + + // verify function return types + verifyReturnTypes(validTypes, cls.static_methods); + verifyReturnTypes(validTypes, cls.methods); + } + + // Generate all includes BOOST_FOREACH(const Class& cls, classes) { - const string matlabName = cls.qualifiedName(); - const string cppName = cls.qualifiedName("::"); - const string collectorType = "Collector_" + matlabName; - const string collectorName = "collector_" + matlabName; - wrapperFile.oss << " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n"; - wrapperFile.oss << " iter != " << collectorName << ".end(); ) {\n"; - wrapperFile.oss << " delete *iter;\n"; - wrapperFile.oss << " " << collectorName << ".erase(iter++);\n"; - wrapperFile.oss << " }\n"; - } - wrapperFile.oss << "}\n"; - - // create proxy class and wrapper code + generateIncludes(wrapperFile, cls.name, cls.includes); + } + wrapperFile.oss << "\n"; + + // Generate all collectors BOOST_FOREACH(const Class& cls, classes) { - string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; - cls.matlab_proxy(classFile, wrapperName, typeAttributes, wrapperFile, functionNames); - } - - // finish wrapper file - finish_wrapper(wrapperFile, functionNames); - - wrapperFile.emit(true); - } - -/* ************************************************************************* */ - void Module::finish_wrapper(FileWriter& file, const std::vector& functionNames) const { - file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; - file.oss << "{\n"; + const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); + wrapperFile.oss << "typedef std::set*> " + << "Collector_" << matlabName << ";\n"; + wrapperFile.oss << "static Collector_" << matlabName << + " collector_" << matlabName << ";\n"; + } + + // generate mexAtExit cleanup function + wrapperFile.oss << "\nvoid _deleteAllObjects()\n"; + wrapperFile.oss << "{\n"; + BOOST_FOREACH(const Class& cls, classes) { + const string matlabName = cls.qualifiedName(); + const string cppName = cls.qualifiedName("::"); + const string collectorType = "Collector_" + matlabName; + const string collectorName = "collector_" + matlabName; + wrapperFile.oss << " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n"; + wrapperFile.oss << " iter != " << collectorName << ".end(); ) {\n"; + wrapperFile.oss << " delete *iter;\n"; + wrapperFile.oss << " " << collectorName << ".erase(iter++);\n"; + wrapperFile.oss << " }\n"; + } + wrapperFile.oss << "}\n"; + + // create proxy class and wrapper code + BOOST_FOREACH(const Class& cls, classes) { + string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; + cls.matlab_proxy(classFile, wrapperName, typeAttributes, wrapperFile, functionNames); + } + + // finish wrapper file + wrapperFile.oss << "\n"; + finish_wrapper(wrapperFile, functionNames); + + wrapperFile.emit(true); + } + +/* ************************************************************************* */ + void Module::finish_wrapper(FileWriter& file, const std::vector& functionNames) const { + file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; + file.oss << "{\n"; file.oss << " mstream mout;\n"; // Send stdout to MATLAB console, see matlab.h - file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; + file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; file.oss << " int id = unwrap(in[0]);\n\n"; file.oss << " switch(id) {\n"; for(size_t id = 0; id < functionNames.size(); ++id) { @@ -433,8 +442,8 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } file.oss << " }\n"; file.oss << "\n"; - file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout, see matlab.h + file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout, see matlab.h file.oss << "}\n"; - } - -/* ************************************************************************* */ + } + +/* ************************************************************************* */ diff --git a/wrap/utilities.h b/wrap/utilities.h index f84a28b51..99e19a755 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -68,6 +68,16 @@ public: ~DuplicateDefinition() throw() {} virtual const char* what() const throw() { return what_.c_str(); } }; + +class AttributeError : public std::exception { +private: + const std::string what_; +public: + AttributeError(const std::string& name, const std::string& problem) : + what_("Class " + name + ": " + problem) {} + ~AttributeError() throw() {} + virtual const char* what() const throw() { return what_.c_str(); } +}; /** Special "magic number" passed into MATLAB constructor to indicate creating * a MATLAB object from a shared_ptr allocated in C++ From 384f50f1fec14566dd20064526382a4b7a217393 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 10 Jul 2012 22:42:28 +0000 Subject: [PATCH 594/914] Removed debug-only variable in iSAM2 that was causing a crash when gtsam was compiled with NDEBUG defined and a project compiled without it defined, or vice-versa --- gtsam/nonlinear/ISAM2.cpp | 10 ---------- gtsam/nonlinear/ISAM2.h | 5 ----- 2 files changed, 15 deletions(-) diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index a9bd195ba..8c470f1aa 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -86,9 +86,6 @@ ISAM2& ISAM2::operator=(const ISAM2& rhs) { params_ = rhs.params_; doglegDelta_ = rhs.doglegDelta_; -#ifndef NDEBUG - lastRelinVariables_ = rhs.lastRelinVariables_; -#endif lastAffectedVariableCount = rhs.lastAffectedVariableCount; lastAffectedFactorCount = rhs.lastAffectedFactorCount; lastAffectedCliqueCount = rhs.lastAffectedCliqueCount; @@ -661,15 +658,8 @@ ISAM2Result ISAM2::update( toc(7,"expmap"); result.variablesRelinearized = markedKeys.size(); - -#ifndef NDEBUG - lastRelinVariables_ = markedRelinMask; -#endif } else { result.variablesRelinearized = 0; -#ifndef NDEBUG - lastRelinVariables_ = vector(ordering_.nVars(), false); -#endif } tic(8,"linearize new"); diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 34fc7b46f..0d540a729 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -403,11 +403,6 @@ protected: /** The inverse ordering, only used for creating ISAM2Result::DetailedResults */ boost::optional inverseOrdering_; -private: -#ifndef NDEBUG - std::vector lastRelinVariables_; -#endif - public: typedef ISAM2 This; ///< This class From af11b6c0a0895d74995cdafcd96b726359f77713 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 10 Jul 2012 22:51:19 +0000 Subject: [PATCH 595/914] Create table of RTTI type names at wrap module creation time - will support code to create most derived type from base type in matlab wrapper --- wrap/Module.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 413fc84b8..2fb7b1095 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -412,7 +412,46 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co wrapperFile.oss << " " << collectorName << ".erase(iter++);\n"; wrapperFile.oss << " }\n"; } - wrapperFile.oss << "}\n"; + wrapperFile.oss << "}\n\n"; + + // generate RTTI registry (for returning derived-most types) + { + // Generate static class and instance to get all RTTI type names + wrapperFile.oss << + "static bool _RTTIRegister_" << name << "_done = false;\n" + "void _" << name << "_RTTIRegister() {\n" + " std::map types;\n" + " cout << \"in get\" << endl;\n"; + BOOST_FOREACH(const Class& cls, classes) { + if(cls.isVirtual) + wrapperFile.oss << + " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n"; + } + wrapperFile.oss << "\n"; + + // Generate another static class and instance to add RTTI types to a MATLAB global variable + wrapperFile.oss << + " cout << \"in register\" << endl;\n" + " mxArray *registry = mexGetVariable(\"global\", \"_gtsamwrap_rttiRegistry\");\n" + " cout << \"registry = \" << registry << endl;\n" + " if(!registry)\n" + " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" + " typedef std::pair StringPair;\n" + " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" + " cout << rtti_matlab.first << \" -> \" << rtti_matlab.second << endl;\n" + " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" + " if(fieldId < 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n" + " mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n" + " }\n" + " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " cout << \"Stored\" << endl;\n" + " mxDestroyArray(registry);\n" + "}\n" + "\n"; + } // create proxy class and wrapper code BOOST_FOREACH(const Class& cls, classes) { @@ -433,6 +472,10 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co file.oss << "{\n"; file.oss << " mstream mout;\n"; // Send stdout to MATLAB console, see matlab.h file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; + file.oss << " if(!_RTTIRegister_" << name << "_done) {\n"; + file.oss << " _" << name << "_RTTIRegister();\n"; + file.oss << " _RTTIRegister_" << name << "_done = true;\n"; + file.oss << " }\n"; file.oss << " int id = unwrap(in[0]);\n\n"; file.oss << " switch(id) {\n"; for(size_t id = 0; id < functionNames.size(); ++id) { From 33a64fc7b5efc06ed258136777cfc1143de908e0 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 10 Jul 2012 22:53:35 +0000 Subject: [PATCH 596/914] Removed debug prints --- wrap/Module.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 2fb7b1095..1457d86ee 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -416,12 +416,10 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // generate RTTI registry (for returning derived-most types) { - // Generate static class and instance to get all RTTI type names wrapperFile.oss << "static bool _RTTIRegister_" << name << "_done = false;\n" "void _" << name << "_RTTIRegister() {\n" - " std::map types;\n" - " cout << \"in get\" << endl;\n"; + " std::map types;\n"; BOOST_FOREACH(const Class& cls, classes) { if(cls.isVirtual) wrapperFile.oss << @@ -429,16 +427,12 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } wrapperFile.oss << "\n"; - // Generate another static class and instance to add RTTI types to a MATLAB global variable wrapperFile.oss << - " cout << \"in register\" << endl;\n" " mxArray *registry = mexGetVariable(\"global\", \"_gtsamwrap_rttiRegistry\");\n" - " cout << \"registry = \" << registry << endl;\n" " if(!registry)\n" " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" " typedef std::pair StringPair;\n" " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" - " cout << rtti_matlab.first << \" -> \" << rtti_matlab.second << endl;\n" " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" " if(fieldId < 0)\n" " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" @@ -447,7 +441,6 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co " }\n" " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " cout << \"Stored\" << endl;\n" " mxDestroyArray(registry);\n" "}\n" "\n"; From 2e6de9e9a1b2c9ec5c7ce6e575d6923df5d994b8 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 11 Jul 2012 14:54:11 +0000 Subject: [PATCH 597/914] Fixed wrap unit test --- wrap/tests/expected/geometry_wrapper.cpp | 2 ++ wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index aad0c258a..a2e01ab92 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -13,6 +13,7 @@ typedef std::set*> Collector_Point3; static Collector_Point3 collector_Point3; typedef std::set*> Collector_Test; static Collector_Test collector_Test; + void _deleteAllObjects() { for(Collector_Point2::iterator iter = collector_Point2.begin(); @@ -462,6 +463,7 @@ using namespace geometry; out[0] = wrap< Vector >(obj->return_vector2(value)); } + void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mstream mout; diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 3633e38c8..2e0a6431e 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -25,6 +25,7 @@ typedef std::set*> Collector_ns2ClassC; static Collector_ns2ClassC collector_ns2ClassC; typedef std::set*> Collector_ClassD; static Collector_ClassD collector_ClassD; + void _deleteAllObjects() { for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); @@ -285,6 +286,7 @@ void ClassD_deconstructor_21(int nargout, mxArray *out[], int nargin, const mxAr } } + void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mstream mout; From f3406f3bc9aa5c421cbb4aba29979238b30a99a2 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 11 Jul 2012 14:54:13 +0000 Subject: [PATCH 598/914] Small change to wrap to avoid redundant includes in cpp file --- wrap/Module.cpp | 36 ++++++++++++++++--- wrap/Module.h | 2 ++ .../testNamespaces_wrapper.cpp | 6 ++-- wrap/utilities.cpp | 14 -------- wrap/utilities.h | 6 ---- 5 files changed, 36 insertions(+), 28 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 413fc84b8..f672770a4 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -315,6 +315,35 @@ void verifyReturnTypes(const vector& validtypes, const map& vt } } +/* ************************************************************************* */ +void Module::generateIncludes(FileWriter& file) const { + + // collect includes + vector all_includes; + BOOST_FOREACH(const Class& cls, classes) { +// generateIncludes(wrapperFile, cls.name, cls.includes); + bool added_include = false; + BOOST_FOREACH(const string& s, cls.includes) { + if (!s.empty()) { + all_includes.push_back(s); + added_include = true; + } + } + if (!added_include) // add default include + all_includes.push_back(cls.name + ".h"); + } + + // sort and remove duplicates + sort(all_includes.begin(), all_includes.end()); + unique(all_includes.begin(), all_includes.end()); + + // add includes to file + BOOST_FOREACH(const string& include, all_includes) { + file.oss << "#include <" << include << ">" << endl; + } + file.oss << "\n"; +} + /* ************************************************************************* */ void Module::matlab_code(const string& toolboxPath, const string& headerPath) const { @@ -383,11 +412,8 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co verifyReturnTypes(validTypes, cls.methods); } - // Generate all includes - BOOST_FOREACH(const Class& cls, classes) { - generateIncludes(wrapperFile, cls.name, cls.includes); - } - wrapperFile.oss << "\n"; + // Generate includes while avoiding redundant includes + generateIncludes(wrapperFile); // Generate all collectors BOOST_FOREACH(const Class& cls, classes) { diff --git a/wrap/Module.h b/wrap/Module.h index 3cb23be25..786379d16 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -53,6 +53,8 @@ struct Module { const std::string& headerPath) const; void finish_wrapper(FileWriter& file, const std::vector& functionNames) const; + + void generateIncludes(FileWriter& file) const; }; } // \namespace wrap diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 2e0a6431e..53f28d10e 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -3,15 +3,15 @@ #include #include -#include +#include #include #include #include #include -#include #include #include -#include +#include +#include typedef std::set*> Collector_ns1ClassA; static Collector_ns1ClassA collector_ns1ClassA; diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 94117b5d3..5f0db4248 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -120,20 +120,6 @@ void generateUsingNamespace(FileWriter& file, const vector& using_namesp file.oss << "using namespace " << s << ";" << endl; } -/* ************************************************************************* */ -void generateIncludes(FileWriter& file, const string& class_name, - const vector& includes) { - bool added_include = false; - BOOST_FOREACH(const string& s, includes) { - if (!s.empty()) { - file.oss << "#include <" << s << ">" << endl; - added_include = true; - } - } - if (!added_include) // add default include - file.oss << "#include <" << class_name << ".h>" << endl; -} - /* ************************************************************************* */ string qualifiedName(const string& separator, const vector& names, const string& finalName) { string result; diff --git a/wrap/utilities.h b/wrap/utilities.h index 99e19a755..eaf339928 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -117,12 +117,6 @@ std::string maybe_shared_ptr(bool add, const std::string& qtype, const std::stri */ void generateUsingNamespace(FileWriter& file, const std::vector& using_namespaces); -/** - * Creates the #include statements - */ -void generateIncludes(FileWriter& file, const std::string& class_name, - const std::vector& includes); - /** * Return a qualified name, if finalName is empty, only the names vector will * be used (i.e. there won't be a trailing separator on the qualified name). From 7c176dd76dabc2f81ffd1f41d420c12dcc0d1486 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 11 Jul 2012 15:44:04 +0000 Subject: [PATCH 599/914] Automatic returning of derived-most type in matlab wrapper working but not yet well-tested --- wrap/Class.cpp | 60 +++++++++++++++++++++------ wrap/Class.h | 2 +- wrap/Module.cpp | 2 +- wrap/ReturnValue.cpp | 98 ++++++++++++++++++++++++++------------------ wrap/matlab.h | 50 +++++++++++++++++++--- wrap/utilities.h | 6 +-- 6 files changed, 155 insertions(+), 63 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index dd28a830a..bc28ad6c0 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -63,11 +63,8 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, // other wrap modules - to add these to their collectors the pointer is // passed from one C++ module into matlab then back into the other C++ // module. - { - int id = functionNames.size(); - const string functionName = pointer_constructor_fragments(proxyFile, wrapperFile, wrapperName, id); - functionNames.push_back(functionName); - } + pointer_constructor_fragments(proxyFile, wrapperFile, wrapperName, functionNames); + wrapperFile.oss << "\n"; // Regular constructors BOOST_FOREACH(ArgumentList a, constructor.args_list) { @@ -131,29 +128,52 @@ string Class::qualifiedName(const string& delim) const { } /* ************************************************************************* */ -string Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& wrapperName, int id) const { +void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& wrapperName, vector& functionNames) const { const string matlabName = qualifiedName(), cppName = qualifiedName("::"); - const string wrapFunctionName = matlabName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(id); const string baseMatlabName = wrap::qualifiedName("", qualifiedParent); const string baseCppName = wrap::qualifiedName("::", qualifiedParent); + const int collectorInsertId = functionNames.size(); + const string collectorInsertFunctionName = matlabName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(collectorInsertId); + functionNames.push_back(collectorInsertFunctionName); + + int upcastFromVoidId; + string upcastFromVoidFunctionName; + if(isVirtual) { + upcastFromVoidId = functionNames.size(); + upcastFromVoidFunctionName = matlabName + "_upcastFromVoid_" + boost::lexical_cast(upcastFromVoidId); + functionNames.push_back(upcastFromVoidFunctionName); + } + // MATLAB constructor that assigns pointer to matlab object then calls c++ // function to add the object to the collector. - proxyFile.oss << " if nargin == 2 && isa(varargin{1}, 'uint64') && "; - proxyFile.oss << "varargin{1} == uint64(" << ptr_constructor_key << ")\n"; - proxyFile.oss << " my_ptr = varargin{2};\n"; + if(isVirtual) { + proxyFile.oss << " if (nargin == 2 || (nargin == 3 && strcmp(varargin{3}, 'void')))"; + } else { + proxyFile.oss << " if nargin == 2"; + } + proxyFile.oss << " && isa(varargin{1}, 'uint64') && varargin{1} == uint64(" << ptr_constructor_key << ")\n"; + if(isVirtual) { + proxyFile.oss << " if nargin == 2\n"; + proxyFile.oss << " my_ptr = varargin{2};\n"; + proxyFile.oss << " else\n"; + proxyFile.oss << " my_ptr = " << wrapperName << "(" << upcastFromVoidId << ", varargin{2});\n"; + proxyFile.oss << " end\n"; + } else { + proxyFile.oss << " my_ptr = varargin{2};\n"; + } if(qualifiedParent.empty()) // If this class has a base class, we'll get a base class pointer back proxyFile.oss << " "; else proxyFile.oss << " base_ptr = "; - proxyFile.oss << wrapperName << "(" << id << ", my_ptr);\n"; // Call collector insert and get base class ptr + proxyFile.oss << wrapperName << "(" << collectorInsertId << ", my_ptr);\n"; // Call collector insert and get base class ptr // C++ function to add pointer from MATLAB to collector. The pointer always // comes from a C++ return value; this mechanism allows the object to be added // to a collector in a different wrap module. If this class has a base class, // a new pointer to the base class is allocated and returned. - wrapperFile.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; + wrapperFile.oss << "void " << collectorInsertFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; wrapperFile.oss << "{\n"; wrapperFile.oss << " mexAtExit(&_deleteAllObjects);\n"; generateUsingNamespace(wrapperFile, using_namespaces); @@ -173,7 +193,21 @@ string Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& w } wrapperFile.oss << "}\n"; - return wrapFunctionName; + // If this is a virtual function, C++ function to dynamic upcast it from a + // shared_ptr. This mechanism allows automatic dynamic creation of the + // real underlying derived-most class when a C++ method returns a virtual + // base class. + if(isVirtual) + wrapperFile.oss << + "\n" + "void " << upcastFromVoidFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[]) {\n" + " mexAtExit(&_deleteAllObjects);\n" + " typedef boost::shared_ptr<" << cppName << "> Shared;\n" + " boost::shared_ptr *asVoid = *reinterpret_cast**> (mxGetData(in[0]));\n" + " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);\n" + " Shared *self = new Shared(boost::static_pointer_cast<" << cppName << ">(*asVoid));\n" + " *reinterpret_cast(mxGetData(out[0])) = self;\n" + "}\n"; } /* ************************************************************************* */ diff --git a/wrap/Class.h b/wrap/Class.h index 78d779a1f..f4087f00f 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -55,7 +55,7 @@ struct Class { std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter private: - std::string pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& wrapperName, int id) const; + void pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& wrapperName, std::vector& functionNames) const; }; } // \namespace wrap diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 1457d86ee..ef93857b6 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -428,7 +428,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co wrapperFile.oss << "\n"; wrapperFile.oss << - " mxArray *registry = mexGetVariable(\"global\", \"_gtsamwrap_rttiRegistry\");\n" + " mxArray *registry = mexGetVariable(\"global\", \"gtsamwrap_rttiRegistry\");\n" " if(!registry)\n" " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" " typedef std::pair StringPair;\n" diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index 77bdeb746..21baf3af9 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -52,53 +52,71 @@ void ReturnValue::wrap_result(const string& result, FileWriter& file, const Type if (isPair) { // first return value in pair - if (isPtr1) {// if we already have a pointer - file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(" << result << ".first);" << endl; - file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; - } - else if (category1 == ReturnValue::CLASS) { // if we are going to make one - string objCopy; - if(typeAttributes.at(cppType1).isVirtual) - objCopy = "boost::dynamic_pointer_cast<" + cppType1 + ">(" + result + ".first.clone())"; - else - objCopy = "new " + cppType1 + "(" + result + ".first)"; - file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(" << objCopy << ");\n"; - file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; - } - else // if basis type + if (category1 == ReturnValue::CLASS) { // if we are going to make one + string objCopy, ptrType; + ptrType = "Shared" + type1; + const bool isVirtual = typeAttributes.at(cppType1).isVirtual; + if(isVirtual) { + if(isPtr1) + objCopy = result + ".first"; + else + objCopy = result + ".first.clone()"; + } else { + if(isPtr1) + objCopy = result + ".first"; + else + objCopy = ptrType + "(new " + cppType1 + "(" + result + ".first))"; + } + file.oss << " out[0] = wrap_shared_ptr(" << objCopy << ",\"" << matlabType1 << "\", " << (isVirtual ? "true" : "false") << ");\n"; + } else if(isPtr1) { + file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(" << result << ".first);" << endl; + file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\", false);\n"; + } else // if basis type file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(" << result << ".first);\n"; // second return value in pair - if (isPtr2) {// if we already have a pointer - file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(" << result << ".second);" << endl; - file.oss << " out[1] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; - } - else if (category2 == ReturnValue::CLASS) { // if we are going to make one - string objCopy; - if(typeAttributes.at(cppType1).isVirtual) - objCopy = "boost::dynamic_pointer_cast<" + cppType2 + ">(" + result + ".second.clone())"; - else - objCopy = "new " + cppType1 + "(" + result + ".second)"; - file.oss << " Shared" << type2 << "* ret = new Shared" << type2 << "(" << objCopy << ");\n"; - file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; - } - else + if (category2 == ReturnValue::CLASS) { // if we are going to make one + string objCopy, ptrType; + ptrType = "Shared" + type2; + const bool isVirtual = typeAttributes.at(cppType2).isVirtual; + if(isVirtual) { + if(isPtr2) + objCopy = result + ".second"; + else + objCopy = result + ".second.clone()"; + } else { + if(isPtr2) + objCopy = result + ".second"; + else + objCopy = ptrType + "(new " + cppType2 + "(" + result + ".second))"; + } + file.oss << " out[0] = wrap_shared_ptr(" << objCopy << ",\"" << matlabType2 << "\", " << (isVirtual ? "true" : "false") << ");\n"; + } else if(isPtr2) { + file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(" << result << ".second);" << endl; + file.oss << " out[1] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; + } else file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(" << result << ".second);\n"; } - else if (isPtr1){ - file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(" << result << ");" << endl; - file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; - } else if (category1 == ReturnValue::CLASS){ - string objCopy; - if(typeAttributes.at(cppType1).isVirtual) - objCopy = "boost::dynamic_pointer_cast<" + cppType1 + ">(" + result + ".clone())"; - else - objCopy = "new " + cppType1 + "(" + result + ")"; - file.oss << " Shared" << type1 << "* ret = new Shared" << type1 << "(" << objCopy << ");\n"; + string objCopy, ptrType; + ptrType = "Shared" + type1; + const bool isVirtual = typeAttributes.at(cppType1).isVirtual; + if(isVirtual) { + if(isPtr1) + objCopy = result; + else + objCopy = result + ".clone()"; + } else { + if(isPtr1) + objCopy = result; + else + objCopy = ptrType + "(new " + cppType1 + "(" + result + "))"; + } + file.oss << " out[0] = wrap_shared_ptr(" << objCopy << ",\"" << matlabType1 << "\", " << (isVirtual ? "true" : "false") << ");\n"; + } else if(isPtr1) { + file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(" << result << ");" << endl; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\");\n"; - } - else if (matlabType1!="void") + } else if (matlabType1!="void") file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(" << result << ");\n"; } diff --git a/wrap/matlab.h b/wrap/matlab.h index 05f7fffb5..a3a2f0147 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -56,6 +56,7 @@ using namespace boost; // not usual, but for conciseness of generated code #endif // "Unique" key to signal calling the matlab object constructor with a raw pointer +// to a shared pointer of the same C++ object type as the MATLAB type. // Also present in utilities.h static const uint64_t ptr_constructor_key = (uint64_t('G') << 56) | @@ -339,20 +340,52 @@ gtsam::Matrix unwrap< gtsam::Matrix >(const mxArray* array) { order to be able to add to the collector could be in a different wrap module. */ -mxArray* create_object(const char *classname, void *pointer) { +mxArray* create_object(const std::string& classname, void *pointer, bool isVirtual, const char *rttiName) { mxArray *result; - mxArray *input[2]; + mxArray *input[3]; + int nargin = 2; // First input argument is pointer constructor key input[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL); *reinterpret_cast(mxGetData(input[0])) = ptr_constructor_key; // Second input argument is the pointer input[1] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); *reinterpret_cast(mxGetData(input[1])) = pointer; + // If the class is virtual, use the RTTI name to look up the derived matlab type + const char *derivedClassName; + if(isVirtual) { + const mxArray *rttiRegistry = mexGetVariablePtr("global", "gtsamwrap_rttiRegistry"); + if(!rttiRegistry) + mexErrMsgTxt( + "gtsam wrap: RTTI registry is missing - it could have been cleared from the workspace." + " You can issue 'clear all' to completely clear the workspace, and next time a wrapped object is" + " created the RTTI registry will be recreated."); + const mxArray *derivedNameMx = mxGetField(rttiRegistry, 0, rttiName); + if(!derivedNameMx) + mexErrMsgTxt(( + "gtsam wrap: The derived class type " + string(rttiName) + " was not found in the RTTI registry. " + "The most likely cause for this is that a base class was marked virtual in the wrap interface " + "definition header file for gtsam or for your module, but a derived type was returned by a C++" + "function and that derived type was not marked virtual (or was not specified in the wrap interface" + "definition header at all).").c_str()); + size_t strLen = mxGetN(derivedNameMx); + char *buf = new char[strLen+1]; + if(mxGetString(derivedNameMx, buf, strLen+1)) + mexErrMsgTxt("gtsam wrap: Internal error reading RTTI table, try 'clear all' to clear your workspace and reinitialize the toolbox."); + derivedClassName = buf; + input[2] = mxCreateString("void"); + nargin = 3; + } else { + derivedClassName = classname.c_str(); + } // Call special pointer constructor, which sets 'self' - mexCallMATLAB(1,&result,2,input,classname); + mexCallMATLAB(1,&result, nargin, input, derivedClassName); // Deallocate our memory mxDestroyArray(input[0]); mxDestroyArray(input[1]); + if(isVirtual) { + mxDestroyArray(input[2]); + delete[] derivedClassName; + } return result; } @@ -362,9 +395,16 @@ mxArray* create_object(const char *classname, void *pointer) { class to matlab. */ template -mxArray* wrap_shared_ptr(boost::shared_ptr< Class >* shared_ptr, const char *classname) { +mxArray* wrap_shared_ptr(boost::shared_ptr< Class > shared_ptr, const std::string& matlabName, bool isVirtual) { // Create actual class object from out pointer - mxArray* result = create_object(classname, shared_ptr); + mxArray* result; + if(isVirtual) { + boost::shared_ptr void_ptr(shared_ptr); + result = create_object(matlabName, &void_ptr, isVirtual, typeid(*shared_ptr).name()); + } else { + boost::shared_ptr *heapPtr = new boost::shared_ptr(shared_ptr); + result = create_object(matlabName, heapPtr, isVirtual, ""); + } return result; } diff --git a/wrap/utilities.h b/wrap/utilities.h index 99e19a755..b5bd00e0d 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -79,9 +79,9 @@ public: virtual const char* what() const throw() { return what_.c_str(); } }; -/** Special "magic number" passed into MATLAB constructor to indicate creating - * a MATLAB object from a shared_ptr allocated in C++ - */ +// "Unique" key to signal calling the matlab object constructor with a raw pointer +// to a shared pointer of the same C++ object type as the MATLAB type. +// Also present in matlab.h static const uint64_t ptr_constructor_key = (uint64_t('G') << 56) | (uint64_t('T') << 48) | From 774fcb5ca902e9cca79fcea8c850d9e65d4323ca Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 11 Jul 2012 15:58:01 +0000 Subject: [PATCH 600/914] Fixed include sorting bug in wrap --- wrap/Module.cpp | 10 ++- wrap/tests/expected/geometry_wrapper.cpp | 61 ++++++++++++------- .../testNamespaces_wrapper.cpp | 37 +++++++++-- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 9e2fd6380..997e14266 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -321,7 +321,6 @@ void Module::generateIncludes(FileWriter& file) const { // collect includes vector all_includes; BOOST_FOREACH(const Class& cls, classes) { -// generateIncludes(wrapperFile, cls.name, cls.includes); bool added_include = false; BOOST_FOREACH(const string& s, cls.includes) { if (!s.empty()) { @@ -335,12 +334,11 @@ void Module::generateIncludes(FileWriter& file) const { // sort and remove duplicates sort(all_includes.begin(), all_includes.end()); - unique(all_includes.begin(), all_includes.end()); - + vector::const_iterator last_include = unique(all_includes.begin(), all_includes.end()); + vector::const_iterator it = all_includes.begin(); // add includes to file - BOOST_FOREACH(const string& include, all_includes) { - file.oss << "#include <" << include << ">" << endl; - } + for (; it != last_include; ++it) + file.oss << "#include <" << *it << ">" << endl; file.oss << "\n"; } diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index a2e01ab92..515f886f4 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -32,6 +32,27 @@ void _deleteAllObjects() collector_Test.erase(iter++); } } + +static bool _RTTIRegister_geometry_done = false; +void _geometry_RTTIRegister() { + std::map types; + + mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); + if(!registry) + registry = mxCreateStructMatrix(1, 1, 0, NULL); + typedef std::pair StringPair; + BOOST_FOREACH(const StringPair& rtti_matlab, types) { + int fieldId = mxAddField(registry, rtti_matlab.first.c_str()); + if(fieldId < 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str()); + mxSetFieldByNumber(registry, 0, fieldId, matlabName); + } + if(mexPutVariable("global", "gtsamwrap_rttiRegistry", registry) != 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxDestroyArray(registry); +} + void Point2_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -40,6 +61,7 @@ void Point2_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nargin Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_Point2.insert(self); } + void Point2_constructor_1(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -117,8 +139,7 @@ void Point2_vectorConfusion_8(int nargout, mxArray *out[], int nargin, const mxA typedef boost::shared_ptr Shared; checkArguments("vectorConfusion",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Point2"); - SharedVectorNotEigen* ret = new SharedVectorNotEigen(new VectorNotEigen(obj->vectorConfusion())); - out[0] = wrap_shared_ptr(ret,"VectorNotEigen"); + out[0] = wrap_shared_ptr(SharedVectorNotEigen(new VectorNotEigen(obj->vectorConfusion())),"VectorNotEigen", false); } void Point2_x_9(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -146,6 +167,7 @@ using namespace geometry; Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_Point3.insert(self); } + void Point3_constructor_12(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -191,8 +213,7 @@ using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("Point3.StaticFunctionRet",nargout,nargin,1); double z = unwrap< double >(in[0]); - SharedPoint3* ret = new SharedPoint3(new Point3(Point3::StaticFunctionRet(z))); - out[0] = wrap_shared_ptr(ret,"Point3"); + out[0] = wrap_shared_ptr(SharedPoint3(new Point3(Point3::StaticFunctionRet(z))),"Point3", false); } void Point3_staticFunction_16(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -212,6 +233,7 @@ using namespace geometry; Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_Test.insert(self); } + void Test_constructor_18(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -270,10 +292,8 @@ using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("create_MixedPtrs",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); - SharedTest* ret = new SharedTest(new Test(obj->create_MixedPtrs().first)); - out[0] = wrap_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(obj->create_MixedPtrs().second); - out[1] = wrap_shared_ptr(ret,"Test"); + out[0] = wrap_shared_ptr(SharedTest(new Test(obj->create_MixedPtrs().first)),"Test", false); + out[0] = wrap_shared_ptr(obj->create_MixedPtrs().second,"Test", false); } void Test_create_ptrs_23(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -284,10 +304,8 @@ using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("create_ptrs",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); - SharedTest* ret = new SharedTest(obj->create_ptrs().first); - out[0] = wrap_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(obj->create_ptrs().second); - out[1] = wrap_shared_ptr(ret,"Test"); + out[0] = wrap_shared_ptr(obj->create_ptrs().first,"Test", false); + out[0] = wrap_shared_ptr(obj->create_ptrs().second,"Test", false); } void Test_print_24(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -307,8 +325,7 @@ using namespace geometry; checkArguments("return_Point2Ptr",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); bool value = unwrap< bool >(in[1]); - SharedPoint2* ret = new SharedPoint2(obj->return_Point2Ptr(value)); - out[0] = wrap_shared_ptr(ret,"Point2"); + out[0] = wrap_shared_ptr(obj->return_Point2Ptr(value),"Point2", false); } void Test_return_Test_26(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -319,8 +336,7 @@ using namespace geometry; checkArguments("return_Test",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); - SharedTest* ret = new SharedTest(new Test(obj->return_Test(value))); - out[0] = wrap_shared_ptr(ret,"Test"); + out[0] = wrap_shared_ptr(SharedTest(new Test(obj->return_Test(value))),"Test", false); } void Test_return_TestPtr_27(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -331,8 +347,7 @@ using namespace geometry; checkArguments("return_TestPtr",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); boost::shared_ptr value = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); - SharedTest* ret = new SharedTest(obj->return_TestPtr(value)); - out[0] = wrap_shared_ptr(ret,"Test"); + out[0] = wrap_shared_ptr(obj->return_TestPtr(value),"Test", false); } void Test_return_bool_28(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -417,10 +432,8 @@ using namespace geometry; Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "ptr_Test"); - SharedTest* ret = new SharedTest(obj->return_ptrs(p1,p2).first); - out[0] = wrap_shared_ptr(ret,"Test"); - SharedTest* ret = new SharedTest(obj->return_ptrs(p1,p2).second); - out[1] = wrap_shared_ptr(ret,"Test"); + out[0] = wrap_shared_ptr(obj->return_ptrs(p1,p2).first,"Test", false); + out[0] = wrap_shared_ptr(obj->return_ptrs(p1,p2).second,"Test", false); } void Test_return_size_t_36(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -469,6 +482,10 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) mstream mout; std::streambuf *outbuf = std::cout.rdbuf(&mout); + if(!_RTTIRegister_geometry_done) { + _geometry_RTTIRegister(); + _RTTIRegister_geometry_done = true; + } int id = unwrap(in[0]); switch(id) { diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 53f28d10e..dc88fc296 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -9,9 +9,6 @@ #include #include #include -#include -#include -#include typedef std::set*> Collector_ns1ClassA; static Collector_ns1ClassA collector_ns1ClassA; @@ -59,6 +56,27 @@ void _deleteAllObjects() collector_ClassD.erase(iter++); } } + +static bool _RTTIRegister_testNamespaces_done = false; +void _testNamespaces_RTTIRegister() { + std::map types; + + mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); + if(!registry) + registry = mxCreateStructMatrix(1, 1, 0, NULL); + typedef std::pair StringPair; + BOOST_FOREACH(const StringPair& rtti_matlab, types) { + int fieldId = mxAddField(registry, rtti_matlab.first.c_str()); + if(fieldId < 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str()); + mxSetFieldByNumber(registry, 0, fieldId, matlabName); + } + if(mexPutVariable("global", "gtsamwrap_rttiRegistry", registry) != 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxDestroyArray(registry); +} + void ns1ClassA_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -67,6 +85,7 @@ void ns1ClassA_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nar Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_ns1ClassA.insert(self); } + void ns1ClassA_constructor_1(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -99,6 +118,7 @@ void ns1ClassB_collectorInsertAndMakeBase_3(int nargout, mxArray *out[], int nar Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_ns1ClassB.insert(self); } + void ns1ClassB_constructor_4(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -131,6 +151,7 @@ void ns2ClassA_collectorInsertAndMakeBase_6(int nargout, mxArray *out[], int nar Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_ns2ClassA.insert(self); } + void ns2ClassA_constructor_7(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -179,8 +200,7 @@ void ns2ClassA_nsReturn_11(int nargout, mxArray *out[], int nargin, const mxArra checkArguments("nsReturn",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_ns2ClassA"); double q = unwrap< double >(in[1]); - SharedClassB* ret = new SharedClassB(new ns2::ns3::ClassB(obj->nsReturn(q))); - out[0] = wrap_shared_ptr(ret,"ns2ns3ClassB"); + out[0] = wrap_shared_ptr(SharedClassB(new ns2::ns3::ClassB(obj->nsReturn(q))),"ns2ns3ClassB", false); } void ns2ClassA_afunction_12(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -198,6 +218,7 @@ void ns2ns3ClassB_collectorInsertAndMakeBase_13(int nargout, mxArray *out[], int Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_ns2ns3ClassB.insert(self); } + void ns2ns3ClassB_constructor_14(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -230,6 +251,7 @@ void ns2ClassC_collectorInsertAndMakeBase_16(int nargout, mxArray *out[], int na Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_ns2ClassC.insert(self); } + void ns2ClassC_constructor_17(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -262,6 +284,7 @@ void ClassD_collectorInsertAndMakeBase_19(int nargout, mxArray *out[], int nargi Shared *self = *reinterpret_cast (mxGetData(in[0])); collector_ClassD.insert(self); } + void ClassD_constructor_20(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); @@ -292,6 +315,10 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) mstream mout; std::streambuf *outbuf = std::cout.rdbuf(&mout); + if(!_RTTIRegister_testNamespaces_done) { + _testNamespaces_RTTIRegister(); + _RTTIRegister_testNamespaces_done = true; + } int id = unwrap(in[0]); switch(id) { From 646457bfb2304bcaf33592ece7088f5aa5472d85 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 11 Jul 2012 18:18:57 +0000 Subject: [PATCH 601/914] Wrapped additional functions in factors and factor graphs, added factor heirarchy, fixed mistake in noisemodel heirarchy --- gtsam.h | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/gtsam.h b/gtsam.h index 73f73389c..061edad90 100644 --- a/gtsam.h +++ b/gtsam.h @@ -720,14 +720,14 @@ virtual class Diagonal : gtsam::noiseModel::Gaussian { void print(string s) const; }; -virtual class Isotropic : gtsam::noiseModel::Gaussian { +virtual class Isotropic : gtsam::noiseModel::Diagonal { static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); static gtsam::noiseModel::Isotropic* Precision(size_t dim, double precision); void print(string s) const; }; -virtual class Unit : gtsam::noiseModel::Gaussian { +virtual class Unit : gtsam::noiseModel::Isotropic { static gtsam::noiseModel::Unit* Create(size_t dim); void print(string s) const; }; @@ -782,7 +782,7 @@ class GaussianBayesNet { void push_front(gtsam::GaussianConditional* conditional); }; -class GaussianFactor { +virtual class GaussianFactor { void print(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; double error(const gtsam::VectorValues& c) const; @@ -790,7 +790,7 @@ class GaussianFactor { size_t size() const; }; -class JacobianFactor { +virtual class JacobianFactor : gtsam::GaussianFactor { JacobianFactor(); JacobianFactor(Vector b_in); JacobianFactor(size_t i1, Matrix A1, Vector b, @@ -810,7 +810,7 @@ class JacobianFactor { gtsam::GaussianFactor* negate() const; }; -class HessianFactor { +virtual class HessianFactor : gtsam::GaussianFactor { HessianFactor(const gtsam::HessianFactor& gf); HessianFactor(); HessianFactor(size_t j, Matrix G, Vector g, double f); @@ -834,22 +834,19 @@ class GaussianFactorGraph { GaussianFactorGraph(const gtsam::GaussianBayesNet& CBN); // From FactorGraph - void push_back(gtsam::GaussianFactor* factor); void print(string s) const; bool equals(const gtsam::GaussianFactorGraph& lfgraph, double tol) const; size_t size() const; gtsam::GaussianFactor* at(size_t idx) const; // Building the graph - void add(gtsam::JacobianFactor* factor); - // all these won't work as MATLAB can't handle overloading -// void add(Vector b); -// void add(size_t key1, Matrix A1, Vector b, const gtsam::SharedDiagonal& model); -// void add(size_t key1, Matrix A1, size_t key2, Matrix A2, Vector b, -// const gtsam::SharedDiagonal& model); -// void add(size_t key1, Matrix A1, size_t key2, Matrix A2, size_t key3, Matrix A3, -// Vector b, const gtsam::SharedDiagonal& model); -// void add(gtsam::HessianFactor* factor); + void push_back(gtsam::GaussianFactor* factor); + void add(Vector b); + void add(size_t key1, Matrix A1, Vector b, const gtsam::noiseModel::Diagonal* model); + void add(size_t key1, Matrix A1, size_t key2, Matrix A2, Vector b, + const gtsam::noiseModel::Diagonal* model); + void add(size_t key1, Matrix A1, size_t key2, Matrix A2, size_t key3, Matrix A3, + Vector b, const gtsam::noiseModel::Diagonal* model); // error and probability double error(const gtsam::VectorValues& c) const; @@ -951,15 +948,25 @@ class InvertedOrdering { class NonlinearFactorGraph { NonlinearFactorGraph(); void print(string s) const; + double error(const gtsam::Values& c) const; + double probPrime(const gtsam::Values& c) const; + gtsam::Ordering* orderingCOLAMD(const gtsam::Values& c) const; + // Ordering* orderingCOLAMDConstrained(const gtsam::Values& c, const std::map& constraints) const; + gtsam::GaussianFactorGraph* linearize(const gtsam::Values& c, const gtsam::Ordering& ordering) const; + gtsam::NonlinearFactorGraph clone() const; }; -class NonlinearFactor { -// NonlinearFactor(); // FIXME: don't use this - creates an abstract class +virtual class NonlinearFactor { void print(string s) const; void equals(const gtsam::NonlinearFactor& other, double tol) const; gtsam::KeyVector keys() const; size_t size() const; - size_t dim() const; // FIXME: Doesn't link + size_t dim() const; + double error(const gtsam::Values& c) const; + bool active(const gtsam::Values& c) const; + gtsam::GaussianFactor* linearize(const gtsam::Values& c, const gtsam::Ordering& ordering) const; + gtsam::NonlinearFactor* clone() const; + // gtsam::NonlinearFactor* rekey(const gtsam::KeyVector& newKeys) const; //FIXME: Conversion from KeyVector to std::vector does not happen }; class Values { From 42dec286ee588ec9e5ecd738e7cfc4e93cc60088 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 11 Jul 2012 21:43:13 +0000 Subject: [PATCH 602/914] Removed unused argument list member from Deconstructor --- wrap/Deconstructor.h | 1 - 1 file changed, 1 deletion(-) diff --git a/wrap/Deconstructor.h b/wrap/Deconstructor.h index 035ff74df..ca44700fc 100644 --- a/wrap/Deconstructor.h +++ b/wrap/Deconstructor.h @@ -34,7 +34,6 @@ struct Deconstructor { } // Then the instance variables are set directly by the Module deconstructor - ArgumentList args; std::string name; bool verbose_; From c4f19a2b96c65c588d3b9baa1f0fe013ca1f9af7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 11 Jul 2012 21:43:16 +0000 Subject: [PATCH 603/914] Can define template classes in wrap interface file with a fixed list of template argument expansions, to quickly generate many classes, e.g. template class BetweenFactor ... generates gtsamBetweenFactorPoint2, gtsamBetweenFactorPoint3, etc. --- wrap/Class.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ wrap/Class.h | 6 ++++ wrap/Module.cpp | 50 ++++++++++++++++++++++++---- 3 files changed, 137 insertions(+), 6 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index bc28ad6c0..81ee508a0 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -211,3 +211,90 @@ void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wra } /* ************************************************************************* */ +vector expandArgumentListsTemplate(const vector& argLists, const string& templateArg, const vector& instName) { + vector result; + BOOST_FOREACH(const ArgumentList& argList, argLists) { + ArgumentList instArgList; + BOOST_FOREACH(const Argument& arg, argList) { + Argument instArg = arg; + if(arg.type == templateArg) { + instArg.namespaces.assign(instName.begin(), instName.end()-1); + instArg.type = instName.back(); + } + instArgList.push_back(instArg); + } + result.push_back(instArgList); + } + return result; +} + +/* ************************************************************************* */ +template +map expandMethodTemplate(const map& methods, const string& templateArg, const vector& instName) { + map result; + typedef pair Name_Method; + BOOST_FOREACH(const Name_Method& name_method, methods) { + const METHOD& method = name_method.second; + METHOD instMethod = method; + instMethod.argLists = expandArgumentListsTemplate(method.argLists, templateArg, instName); + instMethod.returnVals.clear(); + BOOST_FOREACH(const ReturnValue& retVal, method.returnVals) { + ReturnValue instRetVal = retVal; + if(retVal.type1 == templateArg) { + instRetVal.namespaces1.assign(instName.begin(), instName.end()-1); + instRetVal.type1 = instName.back(); + } + if(retVal.type2 == templateArg) { + instRetVal.namespaces2.assign(instName.begin(), instName.end()-1); + instRetVal.type2 = instName.back(); + } + } + result.insert(make_pair(name_method.first, instMethod)); + } + return result; +} + +/* ************************************************************************* */ +vector Class::expandTemplate(const string& templateArg, const vector >& instantiations) const { + vector result; + BOOST_FOREACH(const vector& instName, instantiations) { + Class inst; + inst.name = name + instName.back(); + inst.typedefName = qualifiedName("::") + "<" + wrap::qualifiedName("::", instName) + ">"; + inst.isVirtual = isVirtual; + inst.qualifiedParent = qualifiedParent; + inst.methods = expandMethodTemplate(methods, templateArg, instName); + inst.static_methods = expandMethodTemplate(static_methods, templateArg, instName); + inst.namespaces = namespaces; + inst.using_namespaces = using_namespaces; + bool allIncludesEmpty = true; + BOOST_FOREACH(const string& inc, includes) { if(!inc.empty()) { allIncludesEmpty = true; break; } } + if(allIncludesEmpty) + inst.includes.push_back(name + ".h"); + else + inst.includes = includes; + inst.constructor = constructor; + inst.constructor.args_list = expandArgumentListsTemplate(constructor.args_list, templateArg, instName); + inst.constructor.name = inst.name; + inst.deconstructor = deconstructor; + inst.deconstructor.name = inst.name; + inst.verbose_ = verbose_; + result.push_back(inst); + } + return result; +} + +/* ************************************************************************* */ +std::string Class::getTypedef() const { + string result; + BOOST_FOREACH(const string& namesp, namespaces) { + result += ("namespace " + namesp + " { "); + } + result += ("typedef " + typedefName + " " + name + ";"); + BOOST_FOREACH(const string& namesp, namespaces) { + result += " }"; + } + return result; +} + +/* ************************************************************************* */ diff --git a/wrap/Class.h b/wrap/Class.h index f4087f00f..9b0af4bb4 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -38,6 +38,7 @@ struct Class { // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name + std::string typedefName; ///< The name to typedef *from*, if this class is actually a typedef, i.e. typedef [typedefName] [name] bool isVirtual; ///< Whether the class is part of a virtual inheritance chain std::vector qualifiedParent; ///< The *single* parent - the last string is the parent class name, preceededing elements are a namespace stack Methods methods; ///< Class methods @@ -54,6 +55,11 @@ struct Class { FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit proxy class std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter + std::vector expandTemplate(const std::string& templateArg, const std::vector >& instantiations) const; + + // The typedef line for this class, if this class is a typedef, otherwise returns an empty string. + std::string getTypedef() const; + private: void pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& wrapperName, std::vector& functionNames) const; }; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 997e14266..b50591176 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -51,6 +51,19 @@ typedef rule Rule; // and with start rule [class_p], doubles as the specs for our interface files. /* ************************************************************************* */ +/* ************************************************************************* */ +void handle_possible_template(vector& classes, const Class& cls, const string& templateArgument, const vector >& instantiations) { + if(instantiations.empty()) { + classes.push_back(cls); + } else { + vector& classInstantiations = cls.expandTemplate(templateArgument, instantiations); + BOOST_FOREACH(const Class& c, classInstantiations) { + classes.push_back(c); + } + } +} + +/* ************************************************************************* */ Module::Module(const string& interfacePath, const string& moduleName, bool enable_verbose) : name(moduleName), verbose(enable_verbose) { @@ -72,6 +85,9 @@ Module::Module(const string& interfacePath, namespace_includes, /// current set of includes namespaces_return, /// namespace for current return type using_namespace_current; /// All namespaces from "using" declarations + string templateArgument; + vector templateInstantiationNamespace; + vector > templateInstantiations; string include_path = ""; const string null_str = ""; @@ -116,11 +132,23 @@ Module::Module(const string& interfacePath, className_p[assign_a(arg.type)] >> (ch_p('*')[assign_a(arg.is_ptr,true)] | ch_p('&')[assign_a(arg.is_ref,true)]); + Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; + Rule classParent_p = *(namespace_name_p[push_back_a(cls.qualifiedParent)] >> str_p("::")) >> className_p[push_back_a(cls.qualifiedParent)]; - Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; + Rule templateInstantiation_p = + (*(namespace_name_p[push_back_a(templateInstantiationNamespace)] >> str_p("::")) >> + className_p[push_back_a(templateInstantiationNamespace)]) + [push_back_a(templateInstantiations, templateInstantiationNamespace)] + [clear_a(templateInstantiationNamespace)]; + + Rule templateInstantiations_p = + str_p("template") >> + '<' >> name_p[assign_a(templateArgument)] >> '=' >> '{' >> + !(templateInstantiation_p >> *(',' >> templateInstantiation_p)) >> + '}' >> '>'; Rule argument_p = ((basisType_p[assign_a(arg.type)] | argEigenType_p | eigenRef_p | classArg_p) @@ -202,10 +230,11 @@ Module::Module(const string& interfacePath, Rule class_p = (!*include_p + >> !(templateInstantiations_p) >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] >> className_p[assign_a(cls.name)] - >> ((':' >> classParent_p >> '{') | '{') // By having (parent >> '{' | '{') here instead of (!parent >> '{'), we trigger a parse error on a badly-formed parent spec + >> ((':' >> classParent_p >> '{') | '{') >> *(functions_p | comments_p) >> str_p("};")) [assign_a(constructor.name, cls.name)] @@ -215,10 +244,12 @@ Module::Module(const string& interfacePath, [append_a(cls.includes, namespace_includes)] [assign_a(deconstructor.name,cls.name)] [assign_a(cls.deconstructor, deconstructor)] - [push_back_a(classes, cls)] - [assign_a(deconstructor,deconstructor0)] - [assign_a(constructor, constructor0)] - [assign_a(cls,cls0)]; + [bl::bind(&handle_possible_template, bl::var(classes), bl::var(cls), bl::var(templateArgument), bl::var(templateInstantiations))] + [assign_a(deconstructor,deconstructor0)] + [assign_a(constructor, constructor0)] + [assign_a(cls,cls0)] + [clear_a(templateArgument)] + [clear_a(templateInstantiations)]; Rule namespace_def_p = (!*include_p @@ -413,6 +444,13 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // Generate includes while avoiding redundant includes generateIncludes(wrapperFile); + // create typedef classes + BOOST_FOREACH(const Class& cls, classes) { + if(!cls.typedefName.empty()) + wrapperFile.oss << cls.getTypedef() << "\n"; + } + wrapperFile.oss << "\n"; + // Generate all collectors BOOST_FOREACH(const Class& cls, classes) { const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); From 8d661f6e86b389190d0418fb4e3e37bb236807ec Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 11 Jul 2012 21:43:19 +0000 Subject: [PATCH 604/914] Added templates for PriorFactor and BetweenFactor to gtsam.h --- gtsam.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/gtsam.h b/gtsam.h index 061edad90..abe7817d3 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1084,6 +1084,19 @@ class LevenbergMarquardtParams { void setVerbosityLM(string s); }; +//************************************************************************* +// Nonlinear factor types +//************************************************************************* +template +virtual class PriorFactor : gtsam::NonlinearFactor { + PriorFactor(size_t key, const T& prior, const gtsam::noiseModel::Base* noiseModel); +}; + +template +virtual class BetweenFactor : gtsam::NonlinearFactor { + BetweenFactor(size_t key1, size_t key2, const T& relativePose, const gtsam::noiseModel::Base* noiseModel); +}; + }///\namespace gtsam //************************************************************************* From 76e5375dea416fa339b545bef5a63fa9e417fa16 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 12 Jul 2012 02:11:29 +0000 Subject: [PATCH 605/914] Added support for multi-argument templates that are then instantiated with typedefs in wrap interface header. --- wrap/Class.cpp | 54 +++++++++++++++--------- wrap/Class.h | 2 + wrap/Module.cpp | 106 +++++++++++++++++++++++++++++++++++++++++------- wrap/Module.h | 12 ++++++ 4 files changed, 141 insertions(+), 33 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 81ee508a0..43258da61 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -248,42 +248,58 @@ map expandMethodTemplate(const map& methods, con instRetVal.namespaces2.assign(instName.begin(), instName.end()-1); instRetVal.type2 = instName.back(); } + instMethod.returnVals.push_back(instRetVal); } result.insert(make_pair(name_method.first, instMethod)); } return result; } +/* ************************************************************************* */ +Class expandClassTemplate(const Class& cls, const string& templateArg, const vector& instName) { + Class inst; + inst.name = cls.name; + inst.templateArgs = cls.templateArgs; + inst.typedefName = cls.typedefName; + inst.isVirtual = cls.isVirtual; + inst.qualifiedParent = cls.qualifiedParent; + inst.methods = expandMethodTemplate(cls.methods, templateArg, instName); + inst.static_methods = expandMethodTemplate(cls.static_methods, templateArg, instName); + inst.namespaces = cls.namespaces; + inst.using_namespaces = cls.using_namespaces; + bool allIncludesEmpty = true; + BOOST_FOREACH(const string& inc, cls.includes) { if(!inc.empty()) { allIncludesEmpty = true; break; } } + if(allIncludesEmpty) + inst.includes.push_back(cls.name + ".h"); + else + inst.includes = cls.includes; + inst.constructor = cls.constructor; + inst.constructor.args_list = expandArgumentListsTemplate(cls.constructor.args_list, templateArg, instName); + inst.constructor.name = inst.name; + inst.deconstructor = cls.deconstructor; + inst.deconstructor.name = inst.name; + inst.verbose_ = cls.verbose_; + return inst; +} + /* ************************************************************************* */ vector Class::expandTemplate(const string& templateArg, const vector >& instantiations) const { vector result; BOOST_FOREACH(const vector& instName, instantiations) { - Class inst; + Class inst = expandClassTemplate(*this, templateArg, instName); inst.name = name + instName.back(); + inst.templateArgs.clear(); inst.typedefName = qualifiedName("::") + "<" + wrap::qualifiedName("::", instName) + ">"; - inst.isVirtual = isVirtual; - inst.qualifiedParent = qualifiedParent; - inst.methods = expandMethodTemplate(methods, templateArg, instName); - inst.static_methods = expandMethodTemplate(static_methods, templateArg, instName); - inst.namespaces = namespaces; - inst.using_namespaces = using_namespaces; - bool allIncludesEmpty = true; - BOOST_FOREACH(const string& inc, includes) { if(!inc.empty()) { allIncludesEmpty = true; break; } } - if(allIncludesEmpty) - inst.includes.push_back(name + ".h"); - else - inst.includes = includes; - inst.constructor = constructor; - inst.constructor.args_list = expandArgumentListsTemplate(constructor.args_list, templateArg, instName); - inst.constructor.name = inst.name; - inst.deconstructor = deconstructor; - inst.deconstructor.name = inst.name; - inst.verbose_ = verbose_; result.push_back(inst); } return result; } +/* ************************************************************************* */ +Class Class::expandTemplate(const string& templateArg, const vector& instantiation) const { + return expandClassTemplate(*this, templateArg, instantiation); +} + /* ************************************************************************* */ std::string Class::getTypedef() const { string result; diff --git a/wrap/Class.h b/wrap/Class.h index 9b0af4bb4..4626a901a 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -38,6 +38,7 @@ struct Class { // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name + std::vector templateArgs; ///< Template arguments std::string typedefName; ///< The name to typedef *from*, if this class is actually a typedef, i.e. typedef [typedefName] [name] bool isVirtual; ///< Whether the class is part of a virtual inheritance chain std::vector qualifiedParent; ///< The *single* parent - the last string is the parent class name, preceededing elements are a namespace stack @@ -56,6 +57,7 @@ struct Class { std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter std::vector expandTemplate(const std::string& templateArg, const std::vector >& instantiations) const; + Class expandTemplate(const std::string& templateArg, const std::vector& instantiation) const; // The typedef line for this class, if this class is a typedef, otherwise returns an empty string. std::string getTypedef() const; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index b50591176..3cc5af18e 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -88,6 +88,7 @@ Module::Module(const string& interfacePath, string templateArgument; vector templateInstantiationNamespace; vector > templateInstantiations; + TemplateSingleInstantiation singleInstantiation, singleInstantiation0; string include_path = ""; const string null_str = ""; @@ -145,10 +146,34 @@ Module::Module(const string& interfacePath, [clear_a(templateInstantiationNamespace)]; Rule templateInstantiations_p = - str_p("template") >> + (str_p("template") >> '<' >> name_p[assign_a(templateArgument)] >> '=' >> '{' >> !(templateInstantiation_p >> *(',' >> templateInstantiation_p)) >> - '}' >> '>'; + '}' >> '>') + [push_back_a(cls.templateArgs, templateArgument)]; + + Rule templateSingleInstantiationArg_p = + (*(namespace_name_p[push_back_a(templateInstantiationNamespace)] >> str_p("::")) >> + className_p[push_back_a(templateInstantiationNamespace)]) + [push_back_a(singleInstantiation.typeList, templateInstantiationNamespace)] + [clear_a(templateInstantiationNamespace)]; + + Rule templateSingleInstantiation_p = + (str_p("typedef") >> + *(namespace_name_p[push_back_a(singleInstantiation.classNamespaces)] >> str_p("::")) >> + className_p[assign_a(singleInstantiation.className)] >> + '<' >> templateSingleInstantiationArg_p >> *(',' >> templateSingleInstantiationArg_p) >> + '>' >> + className_p[assign_a(singleInstantiation.name)] >> + ';') + [assign_a(singleInstantiation.namespaces, namespaces)] + [push_back_a(singleInstantiations, singleInstantiation)] + [assign_a(singleInstantiation, singleInstantiation0)]; + + Rule templateList_p = + (str_p("template") >> + '<' >> name_p[push_back_a(cls.templateArgs)] >> *(',' >> name_p[push_back_a(cls.templateArgs)]) >> + '>'); Rule argument_p = ((basisType_p[assign_a(arg.type)] | argEigenType_p | eigenRef_p | classArg_p) @@ -230,7 +255,7 @@ Module::Module(const string& interfacePath, Rule class_p = (!*include_p - >> !(templateInstantiations_p) + >> !(templateInstantiations_p | templateList_p) >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] >> className_p[assign_a(cls.name)] @@ -256,7 +281,7 @@ Module::Module(const string& interfacePath, >> str_p("namespace")[push_back_a(namespace_includes, include_path)][assign_a(include_path, null_str)] >> namespace_name_p[push_back_a(namespaces)] >> ch_p('{') - >> *(class_p | namespace_def_p | comments_p) + >> *(class_p | templateSingleInstantiation_p | namespace_def_p | comments_p) >> str_p("}///\\namespace") // end namespace, avoid confusion with classes >> !namespace_name_p) [pop_a(namespaces)] @@ -274,7 +299,7 @@ Module::Module(const string& interfacePath, [push_back_a(forward_declarations, fwDec)] [assign_a(fwDec, fwDec0)]; - Rule module_content_p = comments_p | using_namespace_p | class_p | forward_declaration_p | namespace_def_p ; + Rule module_content_p = comments_p | using_namespace_p | class_p | templateSingleInstantiation_p | forward_declaration_p | namespace_def_p ; Rule module_p = *module_content_p >> !end_p; @@ -388,6 +413,9 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co wrapperFile.oss << "#include \n"; wrapperFile.oss << "\n"; + // Expand templates + vector expandedClasses = expandTemplates(); + // Dependency check list vector validTypes; BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { @@ -404,7 +432,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co validTypes.push_back("Vector"); validTypes.push_back("Matrix"); //Create a list of parsed classes for dependency checking - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { validTypes.push_back(cls.qualifiedName("::")); } @@ -414,12 +442,12 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co if(!typeAttributes.insert(make_pair(fwDec.name, ReturnValue::TypeAttributes(fwDec.isVirtual))).second) throw DuplicateDefinition("class " + fwDec.name); } - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { if(!typeAttributes.insert(make_pair(cls.qualifiedName("::"), ReturnValue::TypeAttributes(cls.isVirtual))).second) throw DuplicateDefinition("class " + cls.qualifiedName("::")); } // Check attributes - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { // Check that class is virtual if it has a parent if(!cls.qualifiedParent.empty() && !cls.isVirtual) throw AttributeError(cls.qualifiedName("::"), "Has a base class so needs to be declared virtual, change to 'virtual class "+cls.name+" ...'"); @@ -430,7 +458,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } // Check that all classes have been defined somewhere - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { // verify all of the function arguments //TODO:verifyArguments(validTypes, cls.constructor.args_list); verifyArguments(validTypes, cls.static_methods); @@ -445,14 +473,14 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co generateIncludes(wrapperFile); // create typedef classes - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { if(!cls.typedefName.empty()) wrapperFile.oss << cls.getTypedef() << "\n"; } wrapperFile.oss << "\n"; // Generate all collectors - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); wrapperFile.oss << "typedef std::set*> " << "Collector_" << matlabName << ";\n"; @@ -463,7 +491,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // generate mexAtExit cleanup function wrapperFile.oss << "\nvoid _deleteAllObjects()\n"; wrapperFile.oss << "{\n"; - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { const string matlabName = cls.qualifiedName(); const string cppName = cls.qualifiedName("::"); const string collectorType = "Collector_" + matlabName; @@ -482,7 +510,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co "static bool _RTTIRegister_" << name << "_done = false;\n" "void _" << name << "_RTTIRegister() {\n" " std::map types;\n"; - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { if(cls.isVirtual) wrapperFile.oss << " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n"; @@ -509,7 +537,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } // create proxy class and wrapper code - BOOST_FOREACH(const Class& cls, classes) { + BOOST_FOREACH(const Class& cls, expandedClasses) { string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; cls.matlab_proxy(classFile, wrapperName, typeAttributes, wrapperFile, functionNames); } @@ -545,3 +573,53 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } /* ************************************************************************* */ +vector Module::expandTemplates() const { + + vector expandedClasses = classes; + + BOOST_FOREACH(const TemplateSingleInstantiation& inst, singleInstantiations) { + // Find matching class + std::vector::iterator clsIt = expandedClasses.end(); + for(std::vector::iterator it = expandedClasses.begin(); it != expandedClasses.end(); ++it) { + if(it->name == inst.className && it->namespaces == inst.classNamespaces && it->templateArgs.size() == inst.typeList.size()) { + clsIt = it; + break; + } + } + + if(clsIt == expandedClasses.end()) + throw DependencyMissing(wrap::qualifiedName("::", inst.classNamespaces, inst.className), + "instantiation into typedef name " + wrap::qualifiedName("::", inst.namespaces, inst.name) + + ". Ensure that the typedef provides the correct number of template arguments."); + + // Instantiate it + Class classInst = *clsIt; + for(size_t i = 0; i < inst.typeList.size(); ++i) + classInst = classInst.expandTemplate(classInst.templateArgs[i], inst.typeList[i]); + + // Fix class properties + classInst.name = inst.name; + classInst.templateArgs.clear(); + classInst.typedefName = clsIt->qualifiedName("::") + "<"; + if(inst.typeList.size() > 0) + classInst.typedefName += wrap::qualifiedName("::", inst.typeList[0]); + for(size_t i = 1; i < inst.typeList.size(); ++i) + classInst.typedefName += (", " + wrap::qualifiedName("::", inst.typeList[i])); + classInst.typedefName += ">"; + classInst.namespaces = inst.namespaces; + + // Add the new class to the list + expandedClasses.push_back(classInst); + } + + // Remove all template classes + for(int i = 0; i < expandedClasses.size(); ++i) + if(!expandedClasses[size_t(i)].templateArgs.empty()) { + expandedClasses.erase(expandedClasses.begin() + size_t(i)); + -- i; + } + + return expandedClasses; +} + +/* ************************************************************************* */ diff --git a/wrap/Module.h b/wrap/Module.h index 786379d16..42089291c 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -36,8 +36,17 @@ struct Module { ForwardDeclaration() : isVirtual(false) {} }; + struct TemplateSingleInstantiation { + std::vector classNamespaces; + std::string className; + std::vector namespaces; + std::string name; + std::vector > typeList; + }; + std::string name; ///< module name std::vector classes; ///< list of classes + std::vector singleInstantiations; ///< list of template instantiations bool verbose; ///< verbose flag // std::vector using_namespaces; ///< all default namespaces std::vector forward_declarations; @@ -55,6 +64,9 @@ struct Module { void finish_wrapper(FileWriter& file, const std::vector& functionNames) const; void generateIncludes(FileWriter& file) const; + +private: + std::vector expandTemplates() const; }; } // \namespace wrap From 55a153ebc67b8a0b3287dad6ec64e01ff3731e37 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 12 Jul 2012 02:11:32 +0000 Subject: [PATCH 606/914] Wrapped Cal3DS2, RangeFactor, BearingFactor, and GenericProjectionFactor --- gtsam.h | 67 +++++++++++++++++++++++++++++++++-- gtsam/slam/BearingFactor.h | 4 +-- gtsam/slam/ProjectionFactor.h | 2 +- wrap/Module.cpp | 2 +- 4 files changed, 69 insertions(+), 6 deletions(-) diff --git a/gtsam.h b/gtsam.h index abe7817d3..00f5a9030 100644 --- a/gtsam.h +++ b/gtsam.h @@ -398,17 +398,18 @@ virtual class Pose3 : gtsam::Value { Matrix matrix() const; gtsam::Pose3 transform_to(const gtsam::Pose3& pose) const; // FIXME: shadows other transform_to() double range(const gtsam::Point3& point); - double range(const gtsam::Pose3& pose); // FIXME: shadows other range + double range(const gtsam::Pose3& pose); }; virtual class Cal3_S2 : gtsam::Value { // Standard Constructors Cal3_S2(); Cal3_S2(double fx, double fy, double s, double u0, double v0); + Cal3_S2(Vector v); // Testable void print(string s) const; - bool equals(const gtsam::Cal3_S2& pose, double tol) const; + bool equals(const gtsam::Cal3_S2& rhs, double tol) const; // Manifold static size_t Dim(); @@ -432,6 +433,37 @@ virtual class Cal3_S2 : gtsam::Value { Matrix matrix_inverse() const; }; +virtual class Cal3DS2 : gtsam::Value { + // Standard Constructors + Cal3DS2(); + Cal3DS2(double fx, double fy, double s, double u0, double v0, double k1, double k2, double k3, double k4); + Cal3DS2(Vector v); + + // Testable + void print(string s) const; + bool equals(const gtsam::Cal3DS2& rhs, double tol) const; + + // Manifold + static size_t Dim(); + size_t dim() const; + gtsam::Cal3DS2 retract(Vector v) const; + Vector localCoordinates(const gtsam::Cal3DS2& c) const; + + // Action on Point2 + gtsam::Point2 uncalibrate(const gtsam::Point2& p) const; + // TODO: D2d functions that start with an uppercase letter + + // Standard Interface + double fx() const; + double fy() const; + double skew() const; + double px() const; + double py() const; + Vector vector() const; + Vector k() const; + //Matrix K() const; //FIXME: Uppercase +}; + class Cal3_S2Stereo { // Standard Constructors Cal3_S2Stereo(); @@ -1092,11 +1124,42 @@ virtual class PriorFactor : gtsam::NonlinearFactor { PriorFactor(size_t key, const T& prior, const gtsam::noiseModel::Base* noiseModel); }; + template virtual class BetweenFactor : gtsam::NonlinearFactor { BetweenFactor(size_t key1, size_t key2, const T& relativePose, const gtsam::noiseModel::Base* noiseModel); }; + +template +virtual class RangeFactor : gtsam::NonlinearFactor { + RangeFactor(size_t key1, size_t key2, double measured, const gtsam::noiseModel::Base* noiseModel); +}; + +typedef gtsam::RangeFactor RangeFactor2D; +typedef gtsam::RangeFactor RangeFactor3D; +typedef gtsam::RangeFactor RangeFactorCalibratedCamera; +typedef gtsam::RangeFactor RangeFactorSimpleCamera; + +template +virtual class BearingFactor : gtsam::NonlinearFactor { + BearingFactor(size_t key1, size_t key2, const ROT& measured, const gtsam::noiseModel::Base* noiseModel); +}; + +typedef gtsam::BearingFactor BearingFactor2D; + + +#include +template +virtual class GenericProjectionFactor : gtsam::NonlinearFactor { + GenericProjectionFactor(const gtsam::Point2& measured, const gtsam::noiseModel::Base* noiseModel, + size_t poseKey, size_t pointKey, const CALIBRATION* k); + gtsam::Point2 measured() const; + CALIBRATION* calibration() const; +}; +typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3_S2; +typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3DS2; + }///\namespace gtsam //************************************************************************* diff --git a/gtsam/slam/BearingFactor.h b/gtsam/slam/BearingFactor.h index c42c2798d..62e46d53e 100644 --- a/gtsam/slam/BearingFactor.h +++ b/gtsam/slam/BearingFactor.h @@ -25,12 +25,12 @@ namespace gtsam { /** * Binary factor for a bearing measurement */ - template + template class BearingFactor: public NoiseModelFactor2 { private: typedef POSE Pose; - typedef typename Pose::Rotation Rot; + typedef ROT Rot; typedef POINT Point; typedef BearingFactor This; diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index bce7bcf84..048756435 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -62,7 +62,7 @@ namespace gtsam { * @param K shared pointer to the constant calibration */ GenericProjectionFactor(const Point2& measured, const SharedNoiseModel& model, - const Key poseKey, Key pointKey, const shared_ptrK& K) : + Key poseKey, Key pointKey, const boost::shared_ptr& K) : Base(model, poseKey, pointKey), measured_(measured), K_(K) { } diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 3cc5af18e..d1e502bac 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -56,7 +56,7 @@ void handle_possible_template(vector& classes, const Class& cls, const st if(instantiations.empty()) { classes.push_back(cls); } else { - vector& classInstantiations = cls.expandTemplate(templateArgument, instantiations); + vector classInstantiations = cls.expandTemplate(templateArgument, instantiations); BOOST_FOREACH(const Class& c, classInstantiations) { classes.push_back(c); } From b1a58e44479097910fc2f1ab2b33a6fae903a1d2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 12 Jul 2012 02:11:36 +0000 Subject: [PATCH 607/914] Updated expected wrap unit test files --- wrap/tests/expected/geometry_wrapper.cpp | 1 + wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index 515f886f4..ade907701 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -7,6 +7,7 @@ #include #include + typedef std::set*> Collector_Point2; static Collector_Point2 collector_Point2; typedef std::set*> Collector_Point3; diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index dc88fc296..bdb0632d0 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -10,6 +10,7 @@ #include #include + typedef std::set*> Collector_ns1ClassA; static Collector_ns1ClassA collector_ns1ClassA; typedef std::set*> Collector_ns1ClassB; From c3ed90c7927865341d631e6c08c8f9faeca72cdc Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 12 Jul 2012 22:28:23 +0000 Subject: [PATCH 608/914] Small cleanup with factor graph 'add' functions --- gtsam.h | 1 + gtsam/linear/GaussianFactorGraph.h | 22 +++++++++++----------- gtsam/nonlinear/NonlinearFactorGraph.h | 11 ++++++++--- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/gtsam.h b/gtsam.h index 00f5a9030..0e50ac9b6 100644 --- a/gtsam.h +++ b/gtsam.h @@ -982,6 +982,7 @@ class NonlinearFactorGraph { void print(string s) const; double error(const gtsam::Values& c) const; double probPrime(const gtsam::Values& c) const; + void add(const gtsam::NonlinearFactor* factor); gtsam::Ordering* orderingCOLAMD(const gtsam::Values& c) const; // Ordering* orderingCOLAMDConstrained(const gtsam::Values& c, const std::map& constraints) const; gtsam::GaussianFactorGraph* linearize(const gtsam::Values& c, const gtsam::Ordering& ordering) const; diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index b4878565e..fd1ec1f6c 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -83,32 +83,32 @@ namespace gtsam { push_back(fg); } - /** Add a Jacobian factor */ - void add(const boost::shared_ptr& factor) { - factors_.push_back(boost::shared_ptr(factor)); + /** Add a factor by value - makes a copy */ + void add(const GaussianFactor& factor) { + factors_.push_back(factor.clone()); } - /** Add a Hessian factor */ - void add(const boost::shared_ptr& factor) { - factors_.push_back(boost::shared_ptr(factor)); + /** Add a factor by pointer - stores pointer without copying the factor */ + void add(const sharedFactor& factor) { + factors_.push_back(factor); } /** Add a null factor */ void add(const Vector& b) { - add(JacobianFactor::shared_ptr(new JacobianFactor(b))); + add(JacobianFactor(b)); } /** Add a unary factor */ void add(Index key1, const Matrix& A1, const Vector& b, const SharedDiagonal& model) { - add(JacobianFactor::shared_ptr(new JacobianFactor(key1,A1,b,model))); + add(JacobianFactor(key1,A1,b,model)); } /** Add a binary factor */ void add(Index key1, const Matrix& A1, Index key2, const Matrix& A2, const Vector& b, const SharedDiagonal& model) { - add(JacobianFactor::shared_ptr(new JacobianFactor(key1,A1,key2,A2,b,model))); + add(JacobianFactor(key1,A1,key2,A2,b,model)); } /** Add a ternary factor */ @@ -116,13 +116,13 @@ namespace gtsam { Index key2, const Matrix& A2, Index key3, const Matrix& A3, const Vector& b, const SharedDiagonal& model) { - add(JacobianFactor::shared_ptr(new JacobianFactor(key1,A1,key2,A2,key3,A3,b,model))); + add(JacobianFactor(key1,A1,key2,A2,key3,A3,b,model)); } /** Add an n-ary factor */ void add(const std::vector > &terms, const Vector &b, const SharedDiagonal& model) { - add(JacobianFactor::shared_ptr(new JacobianFactor(terms,b,model))); + add(JacobianFactor(terms,b,model)); } /** diff --git a/gtsam/nonlinear/NonlinearFactorGraph.h b/gtsam/nonlinear/NonlinearFactorGraph.h index 85cc0e63f..f7ebb42bc 100644 --- a/gtsam/nonlinear/NonlinearFactorGraph.h +++ b/gtsam/nonlinear/NonlinearFactorGraph.h @@ -55,9 +55,14 @@ namespace gtsam { /** Unnormalized probability. O(n) */ double probPrime(const Values& c) const; - template - void add(const F& factor) { - this->push_back(boost::shared_ptr(new F(factor))); + /// Add a factor by value - copies the factor object + void add(const NonlinearFactor& factor) { + this->push_back(factor.clone()); + } + + /// Add a factor by pointer - stores pointer without copying factor object + void add(const sharedFactor& factor) { + this->push_back(factor); } /** From ce12f3d255f744f8fbecd333e09cd3eee6565257 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 12 Jul 2012 22:28:28 +0000 Subject: [PATCH 609/914] Code cleanup and comments --- wrap/Argument.cpp | 1 + wrap/Argument.h | 1 + wrap/Class.cpp | 11 +- wrap/Class.h | 4 +- wrap/Constructor.cpp | 1 + wrap/Constructor.h | 1 + wrap/Deconstructor.cpp | 1 + wrap/Deconstructor.h | 1 + wrap/Method.cpp | 5 +- wrap/Method.h | 6 +- wrap/Module.cpp | 237 ++++++++++++++++++----------------------- wrap/Module.h | 24 ++--- wrap/ReturnValue.cpp | 1 + wrap/ReturnValue.h | 10 +- wrap/StaticMethod.cpp | 5 +- wrap/StaticMethod.h | 6 +- wrap/matlab.h | 3 + wrap/utilities.cpp | 1 + wrap/utilities.h | 1 + 19 files changed, 151 insertions(+), 169 deletions(-) diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index 35f20169b..279050e25 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -13,6 +13,7 @@ * @file Argument.ccp * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #include diff --git a/wrap/Argument.h b/wrap/Argument.h index b4c3fe4a7..4dcf6b563 100644 --- a/wrap/Argument.h +++ b/wrap/Argument.h @@ -14,6 +14,7 @@ * @brief arguments to constructors and methods * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #pragma once diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 43258da61..7034ebb3a 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -13,6 +13,7 @@ * @file Class.cpp * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #include @@ -34,7 +35,7 @@ using namespace wrap; /* ************************************************************************* */ void Class::matlab_proxy(const string& classFile, const string& wrapperName, - const ReturnValue::TypeAttributesTable& typeAttributes, + const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, vector& functionNames) const { // open destination classFile FileWriter proxyFile(classFile, verbose_, "%"); @@ -68,7 +69,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, // Regular constructors BOOST_FOREACH(ArgumentList a, constructor.args_list) { - const int id = functionNames.size(); + const int id = (int)functionNames.size(); constructor.proxy_fragment(proxyFile, wrapperName, matlabName, matlabBaseName, id, a); const string wrapFunctionName = constructor.wrapper_fragment(wrapperFile, cppName, matlabName, cppBaseName, id, using_namespaces, a); @@ -85,7 +86,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, // Deconstructor { - const int id = functionNames.size(); + const int id = (int)functionNames.size(); deconstructor.proxy_fragment(proxyFile, wrapperName, matlabName, id); proxyFile.oss << "\n"; const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabName, id, using_namespaces); @@ -134,14 +135,14 @@ void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wra const string baseMatlabName = wrap::qualifiedName("", qualifiedParent); const string baseCppName = wrap::qualifiedName("::", qualifiedParent); - const int collectorInsertId = functionNames.size(); + const int collectorInsertId = (int)functionNames.size(); const string collectorInsertFunctionName = matlabName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(collectorInsertId); functionNames.push_back(collectorInsertFunctionName); int upcastFromVoidId; string upcastFromVoidFunctionName; if(isVirtual) { - upcastFromVoidId = functionNames.size(); + upcastFromVoidId = (int)functionNames.size(); upcastFromVoidFunctionName = matlabName + "_upcastFromVoid_" + boost::lexical_cast(upcastFromVoidId); functionNames.push_back(upcastFromVoidFunctionName); } diff --git a/wrap/Class.h b/wrap/Class.h index 4626a901a..beee2c29f 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -14,6 +14,7 @@ * @brief describe the C++ class that is being wrapped * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #pragma once @@ -25,6 +26,7 @@ #include "Deconstructor.h" #include "Method.h" #include "StaticMethod.h" +#include "TypeAttributesTable.h" namespace wrap { @@ -52,7 +54,7 @@ struct Class { bool verbose_; ///< verbose flag // And finally MATLAB code is emitted, methods below called by Module::matlab_code - void matlab_proxy(const std::string& classFile, const std::string& wrapperName, const ReturnValue::TypeAttributesTable& typeAttributes, + void matlab_proxy(const std::string& classFile, const std::string& wrapperName, const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit proxy class std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index aaa7f1c8e..afb35f62d 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -13,6 +13,7 @@ * @file Constructor.ccp * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #include diff --git a/wrap/Constructor.h b/wrap/Constructor.h index 46f5c5db9..50d0c41f5 100644 --- a/wrap/Constructor.h +++ b/wrap/Constructor.h @@ -13,6 +13,7 @@ * @file Constructor.h * @brief class describing a constructor + code generation * @author Frank Dellaert + * @author Richard Roberts **/ #pragma once diff --git a/wrap/Deconstructor.cpp b/wrap/Deconstructor.cpp index aa4969af5..c02ab0e93 100644 --- a/wrap/Deconstructor.cpp +++ b/wrap/Deconstructor.cpp @@ -13,6 +13,7 @@ * @file Deconstructor.ccp * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #include diff --git a/wrap/Deconstructor.h b/wrap/Deconstructor.h index ca44700fc..1ef5b80b0 100644 --- a/wrap/Deconstructor.h +++ b/wrap/Deconstructor.h @@ -14,6 +14,7 @@ * @brief class describing a constructor + code generation * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #pragma once diff --git a/wrap/Method.cpp b/wrap/Method.cpp index f44a08a73..f7ee5c71c 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -12,6 +12,7 @@ /** * @file Method.ccp * @author Frank Dellaert + * @author Richard Roberts **/ #include @@ -41,7 +42,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF const string& matlabClassName, const string& wrapperName, const vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes, + const TypeAttributesTable& typeAttributes, vector& functionNames) const { proxyFile.oss << " function varargout = " << name << "(this, varargin)\n"; @@ -102,7 +103,7 @@ string Method::wrapper_fragment(FileWriter& file, int overload, int id, const vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes) const { + const TypeAttributesTable& typeAttributes) const { // generate code diff --git a/wrap/Method.h b/wrap/Method.h index 936b3812d..c23fd7c3d 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -13,6 +13,7 @@ * @file Method.h * @brief describes and generates code for methods * @author Frank Dellaert + * @author Richard Roberts **/ #pragma once @@ -22,6 +23,7 @@ #include "Argument.h" #include "ReturnValue.h" +#include "TypeAttributesTable.h" namespace wrap { @@ -50,7 +52,7 @@ struct Method { void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& cppClassName, const std::string& matlabClassName, const std::string& wrapperName, const std::vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes, + const TypeAttributesTable& typeAttributes, std::vector& functionNames) const; private: @@ -60,7 +62,7 @@ private: int overload, int id, const std::vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes) const; ///< cpp wrapper + const TypeAttributesTable& typeAttributes) const; ///< cpp wrapper }; } // \namespace wrap diff --git a/wrap/Module.cpp b/wrap/Module.cpp index d1e502bac..707d91dc4 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -14,10 +14,12 @@ * @author Frank Dellaert * @author Alex Cunningham * @author Andrew Melim + * @author Richard Roberts **/ #include "Module.h" #include "FileWriter.h" +#include "TypeAttributesTable.h" #include "utilities.h" #include "spirit_actors.h" @@ -88,7 +90,7 @@ Module::Module(const string& interfacePath, string templateArgument; vector templateInstantiationNamespace; vector > templateInstantiations; - TemplateSingleInstantiation singleInstantiation, singleInstantiation0; + TemplateInstantiationTypedef singleInstantiation, singleInstantiation0; string include_path = ""; const string null_str = ""; @@ -167,7 +169,7 @@ Module::Module(const string& interfacePath, className_p[assign_a(singleInstantiation.name)] >> ';') [assign_a(singleInstantiation.namespaces, namespaces)] - [push_back_a(singleInstantiations, singleInstantiation)] + [push_back_a(templateInstantiationTypedefs, singleInstantiation)] [assign_a(singleInstantiation, singleInstantiation0)]; Rule templateList_p = @@ -335,7 +337,7 @@ Module::Module(const string& interfacePath, parse_info info = parse(contents.c_str(), module_p, space_p); if(!info.full) { printf("parsing stopped at \n%.20s\n",info.stop); - throw ParseFailed(info.length); + throw ParseFailed((int)info.length); } } @@ -413,49 +415,19 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co wrapperFile.oss << "#include \n"; wrapperFile.oss << "\n"; - // Expand templates - vector expandedClasses = expandTemplates(); + // Expand templates - This is done first so that template instantiations are + // counted in the list of valid types, have their attributes and dependencies + // checked, etc. + vector expandedClasses = ExpandTypedefInstantiations(classes, templateInstantiationTypedefs); // Dependency check list - vector validTypes; - BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { - validTypes.push_back(fwDec.name); - } - validTypes.push_back("void"); - validTypes.push_back("string"); - validTypes.push_back("int"); - validTypes.push_back("bool"); - validTypes.push_back("char"); - validTypes.push_back("unsigned char"); - validTypes.push_back("size_t"); - validTypes.push_back("double"); - validTypes.push_back("Vector"); - validTypes.push_back("Matrix"); - //Create a list of parsed classes for dependency checking - BOOST_FOREACH(const Class& cls, expandedClasses) { - validTypes.push_back(cls.qualifiedName("::")); - } + vector validTypes = GenerateValidTypes(expandedClasses, forward_declarations); - // Create type attributes table - ReturnValue::TypeAttributesTable typeAttributes; - BOOST_FOREACH(const ForwardDeclaration& fwDec, forward_declarations) { - if(!typeAttributes.insert(make_pair(fwDec.name, ReturnValue::TypeAttributes(fwDec.isVirtual))).second) - throw DuplicateDefinition("class " + fwDec.name); - } - BOOST_FOREACH(const Class& cls, expandedClasses) { - if(!typeAttributes.insert(make_pair(cls.qualifiedName("::"), ReturnValue::TypeAttributes(cls.isVirtual))).second) - throw DuplicateDefinition("class " + cls.qualifiedName("::")); - } - // Check attributes - BOOST_FOREACH(const Class& cls, expandedClasses) { - // Check that class is virtual if it has a parent - if(!cls.qualifiedParent.empty() && !cls.isVirtual) - throw AttributeError(cls.qualifiedName("::"), "Has a base class so needs to be declared virtual, change to 'virtual class "+cls.name+" ...'"); - // Check that parent is virtual as well - if(!cls.qualifiedParent.empty() && !typeAttributes.at(wrap::qualifiedName("::", cls.qualifiedParent)).isVirtual) - throw AttributeError(wrap::qualifiedName("::", cls.qualifiedParent), - "Is the base class of " + cls.qualifiedName("::") + ", so needs to be declared virtual"); - } + // Create type attributes table and check validity + TypeAttributesTable typeAttributes; + typeAttributes.addClasses(expandedClasses); + typeAttributes.addForwardDeclarations(forward_declarations); + typeAttributes.checkValidity(expandedClasses); // Check that all classes have been defined somewhere BOOST_FOREACH(const Class& cls, expandedClasses) { @@ -472,69 +444,18 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // Generate includes while avoiding redundant includes generateIncludes(wrapperFile); - // create typedef classes + // create typedef classes - we put this at the top of the wrap file so that collectors and method arguments can use these typedefs BOOST_FOREACH(const Class& cls, expandedClasses) { if(!cls.typedefName.empty()) wrapperFile.oss << cls.getTypedef() << "\n"; } wrapperFile.oss << "\n"; - // Generate all collectors - BOOST_FOREACH(const Class& cls, expandedClasses) { - const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); - wrapperFile.oss << "typedef std::set*> " - << "Collector_" << matlabName << ";\n"; - wrapperFile.oss << "static Collector_" << matlabName << - " collector_" << matlabName << ";\n"; - } - - // generate mexAtExit cleanup function - wrapperFile.oss << "\nvoid _deleteAllObjects()\n"; - wrapperFile.oss << "{\n"; - BOOST_FOREACH(const Class& cls, expandedClasses) { - const string matlabName = cls.qualifiedName(); - const string cppName = cls.qualifiedName("::"); - const string collectorType = "Collector_" + matlabName; - const string collectorName = "collector_" + matlabName; - wrapperFile.oss << " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n"; - wrapperFile.oss << " iter != " << collectorName << ".end(); ) {\n"; - wrapperFile.oss << " delete *iter;\n"; - wrapperFile.oss << " " << collectorName << ".erase(iter++);\n"; - wrapperFile.oss << " }\n"; - } - wrapperFile.oss << "}\n\n"; + // Generate collectors and cleanup function to be called from mexAtExit + WriteCollectorsAndCleanupFcn(wrapperFile, name, expandedClasses); // generate RTTI registry (for returning derived-most types) - { - wrapperFile.oss << - "static bool _RTTIRegister_" << name << "_done = false;\n" - "void _" << name << "_RTTIRegister() {\n" - " std::map types;\n"; - BOOST_FOREACH(const Class& cls, expandedClasses) { - if(cls.isVirtual) - wrapperFile.oss << - " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n"; - } - wrapperFile.oss << "\n"; - - wrapperFile.oss << - " mxArray *registry = mexGetVariable(\"global\", \"gtsamwrap_rttiRegistry\");\n" - " if(!registry)\n" - " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" - " typedef std::pair StringPair;\n" - " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" - " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" - " if(fieldId < 0)\n" - " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n" - " mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n" - " }\n" - " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" - " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " mxDestroyArray(registry);\n" - "}\n" - "\n"; - } + WriteRTTIRegistry(wrapperFile, name, expandedClasses); // create proxy class and wrapper code BOOST_FOREACH(const Class& cls, expandedClasses) { @@ -573,43 +494,13 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } /* ************************************************************************* */ -vector Module::expandTemplates() const { +vector Module::ExpandTypedefInstantiations(const vector& classes, const vector instantiations) { vector expandedClasses = classes; - BOOST_FOREACH(const TemplateSingleInstantiation& inst, singleInstantiations) { - // Find matching class - std::vector::iterator clsIt = expandedClasses.end(); - for(std::vector::iterator it = expandedClasses.begin(); it != expandedClasses.end(); ++it) { - if(it->name == inst.className && it->namespaces == inst.classNamespaces && it->templateArgs.size() == inst.typeList.size()) { - clsIt = it; - break; - } - } - - if(clsIt == expandedClasses.end()) - throw DependencyMissing(wrap::qualifiedName("::", inst.classNamespaces, inst.className), - "instantiation into typedef name " + wrap::qualifiedName("::", inst.namespaces, inst.name) + - ". Ensure that the typedef provides the correct number of template arguments."); - - // Instantiate it - Class classInst = *clsIt; - for(size_t i = 0; i < inst.typeList.size(); ++i) - classInst = classInst.expandTemplate(classInst.templateArgs[i], inst.typeList[i]); - - // Fix class properties - classInst.name = inst.name; - classInst.templateArgs.clear(); - classInst.typedefName = clsIt->qualifiedName("::") + "<"; - if(inst.typeList.size() > 0) - classInst.typedefName += wrap::qualifiedName("::", inst.typeList[0]); - for(size_t i = 1; i < inst.typeList.size(); ++i) - classInst.typedefName += (", " + wrap::qualifiedName("::", inst.typeList[i])); - classInst.typedefName += ">"; - classInst.namespaces = inst.namespaces; - + BOOST_FOREACH(const TemplateInstantiationTypedef& inst, instantiations) { // Add the new class to the list - expandedClasses.push_back(classInst); + expandedClasses.push_back(inst.findAndExpand(classes)); } // Remove all template classes @@ -623,3 +514,87 @@ vector Module::expandTemplates() const { } /* ************************************************************************* */ +vector Module::GenerateValidTypes(const vector& classes, const vector forwardDeclarations) { + vector validTypes; + BOOST_FOREACH(const ForwardDeclaration& fwDec, forwardDeclarations) { + validTypes.push_back(fwDec.name); + } + validTypes.push_back("void"); + validTypes.push_back("string"); + validTypes.push_back("int"); + validTypes.push_back("bool"); + validTypes.push_back("char"); + validTypes.push_back("unsigned char"); + validTypes.push_back("size_t"); + validTypes.push_back("double"); + validTypes.push_back("Vector"); + validTypes.push_back("Matrix"); + //Create a list of parsed classes for dependency checking + BOOST_FOREACH(const Class& cls, classes) { + validTypes.push_back(cls.qualifiedName("::")); + } + + return validTypes; +} + +/* ************************************************************************* */ +void Module::WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { + // Generate all collectors + BOOST_FOREACH(const Class& cls, classes) { + const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); + wrapperFile.oss << "typedef std::set*> " + << "Collector_" << matlabName << ";\n"; + wrapperFile.oss << "static Collector_" << matlabName << + " collector_" << matlabName << ";\n"; + } + + // generate mexAtExit cleanup function + wrapperFile.oss << "\nvoid _deleteAllObjects()\n"; + wrapperFile.oss << "{\n"; + BOOST_FOREACH(const Class& cls, classes) { + const string matlabName = cls.qualifiedName(); + const string cppName = cls.qualifiedName("::"); + const string collectorType = "Collector_" + matlabName; + const string collectorName = "collector_" + matlabName; + wrapperFile.oss << " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n"; + wrapperFile.oss << " iter != " << collectorName << ".end(); ) {\n"; + wrapperFile.oss << " delete *iter;\n"; + wrapperFile.oss << " " << collectorName << ".erase(iter++);\n"; + wrapperFile.oss << " }\n"; + } + wrapperFile.oss << "}\n\n"; +} + +/* ************************************************************************* */ +void Module::WriteRTTIRegistry(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { + wrapperFile.oss << + "static bool _RTTIRegister_" << moduleName << "_done = false;\n" + "void _" << moduleName << "_RTTIRegister() {\n" + " std::map types;\n"; + BOOST_FOREACH(const Class& cls, classes) { + if(cls.isVirtual) + wrapperFile.oss << + " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n"; + } + wrapperFile.oss << "\n"; + + wrapperFile.oss << + " mxArray *registry = mexGetVariable(\"global\", \"gtsamwrap_rttiRegistry\");\n" + " if(!registry)\n" + " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" + " typedef std::pair StringPair;\n" + " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" + " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" + " if(fieldId < 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n" + " mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n" + " }\n" + " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxDestroyArray(registry);\n" + "}\n" + "\n"; +} + +/* ************************************************************************* */ diff --git a/wrap/Module.h b/wrap/Module.h index 42089291c..403f2f32d 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -13,6 +13,7 @@ * @file Module.h * @brief describes module to be wrapped * @author Frank Dellaert + * @author Richard Roberts **/ #pragma once @@ -22,6 +23,8 @@ #include #include "Class.h" +#include "TemplateInstantiationTypedef.h" +#include "ForwardDeclaration.h" namespace wrap { @@ -30,23 +33,9 @@ namespace wrap { */ struct Module { - struct ForwardDeclaration { - std::string name; - bool isVirtual; - ForwardDeclaration() : isVirtual(false) {} - }; - - struct TemplateSingleInstantiation { - std::vector classNamespaces; - std::string className; - std::vector namespaces; - std::string name; - std::vector > typeList; - }; - std::string name; ///< module name std::vector classes; ///< list of classes - std::vector singleInstantiations; ///< list of template instantiations + std::vector templateInstantiationTypedefs; ///< list of template instantiations bool verbose; ///< verbose flag // std::vector using_namespaces; ///< all default namespaces std::vector forward_declarations; @@ -66,7 +55,10 @@ struct Module { void generateIncludes(FileWriter& file) const; private: - std::vector expandTemplates() const; + static std::vector ExpandTypedefInstantiations(const std::vector& classes, const std::vector instantiations); + static std::vector GenerateValidTypes(const std::vector& classes, const std::vector forwardDeclarations); + static void WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes); + static void WriteRTTIRegistry(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes); }; } // \namespace wrap diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index 21baf3af9..a3efb094e 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -4,6 +4,7 @@ * @date Dec 1, 2011 * @author Alex Cunningham * @author Andrew Melim + * @author Richard Roberts */ #include diff --git a/wrap/ReturnValue.h b/wrap/ReturnValue.h index 7d30578b2..8ff5d712b 100644 --- a/wrap/ReturnValue.h +++ b/wrap/ReturnValue.h @@ -5,12 +5,14 @@ * * @date Dec 1, 2011 * @author Alex Cunningham + * @author Richard Roberts */ #include #include #include "FileWriter.h" +#include "TypeAttributesTable.h" #pragma once @@ -18,14 +20,6 @@ namespace wrap { struct ReturnValue { - struct TypeAttributes { - bool isVirtual; - TypeAttributes() : isVirtual(false) {} - TypeAttributes(bool isVirtual) : isVirtual(isVirtual) {} - }; - - typedef std::map TypeAttributesTable; - typedef enum { CLASS, EIGEN, diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 75456b6b7..19dcd375e 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -13,6 +13,7 @@ * @file StaticMethod.ccp * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #include @@ -42,7 +43,7 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr const string& matlabClassName, const string& wrapperName, const vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes, + const TypeAttributesTable& typeAttributes, vector& functionNames) const { string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); @@ -105,7 +106,7 @@ string StaticMethod::wrapper_fragment(FileWriter& file, int overload, int id, const vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes) const { + const TypeAttributesTable& typeAttributes) const { // generate code diff --git a/wrap/StaticMethod.h b/wrap/StaticMethod.h index 8a739665d..8951f965b 100644 --- a/wrap/StaticMethod.h +++ b/wrap/StaticMethod.h @@ -14,6 +14,7 @@ * @brief describes and generates code for static methods * @author Frank Dellaert * @author Alex Cunningham + * @author Richard Roberts **/ #pragma once @@ -23,6 +24,7 @@ #include "Argument.h" #include "ReturnValue.h" +#include "TypeAttributesTable.h" namespace wrap { @@ -50,7 +52,7 @@ struct StaticMethod { void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& cppClassName, const std::string& matlabClassName, const std::string& wrapperName, const std::vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes, + const TypeAttributesTable& typeAttributes, std::vector& functionNames) const; private: @@ -60,7 +62,7 @@ private: int overload, int id, const std::vector& using_namespaces, - const ReturnValue::TypeAttributesTable& typeAttributes) const; ///< cpp wrapper + const TypeAttributesTable& typeAttributes) const; ///< cpp wrapper }; } // \namespace wrap diff --git a/wrap/matlab.h b/wrap/matlab.h index a3a2f0147..d3fb9f926 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -14,6 +14,9 @@ * @brief header file to be included in MATLAB wrappers * @date 2008 * @author Frank Dellaert + * @author Alex Cunningham + * @author Andrew Melim + * @author Richard Roberts * * wrapping and unwrapping is done using specialized templates, see * http://www.cplusplus.com/doc/tutorial/templates.html diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 5f0db4248..9c5d93c76 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -13,6 +13,7 @@ * @file utilities.ccp * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #include diff --git a/wrap/utilities.h b/wrap/utilities.h index dced5808c..0a252484f 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -13,6 +13,7 @@ * @file utilities.h * @author Frank Dellaert * @author Andrew Melim + * @author Richard Roberts **/ #pragma once From 7f63d23565f7b6f1994e720bfc5fd52d172ed067 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:54:48 +0000 Subject: [PATCH 610/914] Added missing files from last commit - code cleanup and comments --- wrap/ForwardDeclaration.h | 32 ++++++++++++++ wrap/TemplateInstantiationTypedef.cpp | 61 +++++++++++++++++++++++++++ wrap/TemplateInstantiationTypedef.h | 39 +++++++++++++++++ wrap/TypeAttributesTable.cpp | 58 +++++++++++++++++++++++++ wrap/TypeAttributesTable.h | 55 ++++++++++++++++++++++++ 5 files changed, 245 insertions(+) create mode 100644 wrap/ForwardDeclaration.h create mode 100644 wrap/TemplateInstantiationTypedef.cpp create mode 100644 wrap/TemplateInstantiationTypedef.h create mode 100644 wrap/TypeAttributesTable.cpp create mode 100644 wrap/TypeAttributesTable.h diff --git a/wrap/ForwardDeclaration.h b/wrap/ForwardDeclaration.h new file mode 100644 index 000000000..2c9b6fa0c --- /dev/null +++ b/wrap/ForwardDeclaration.h @@ -0,0 +1,32 @@ +/* ---------------------------------------------------------------------------- + + * 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 Class.h + * @brief describe the C++ class that is being wrapped + * @author Frank Dellaert + * @author Andrew Melim + * @author Richard Roberts + **/ + +#pragma once + +#include + +namespace wrap { + + struct ForwardDeclaration { + std::string name; + bool isVirtual; + ForwardDeclaration() : isVirtual(false) {} + }; + +} \ No newline at end of file diff --git a/wrap/TemplateInstantiationTypedef.cpp b/wrap/TemplateInstantiationTypedef.cpp new file mode 100644 index 000000000..da1e8f616 --- /dev/null +++ b/wrap/TemplateInstantiationTypedef.cpp @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- + + * 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 Class.cpp + * @author Frank Dellaert + * @author Andrew Melim + * @author Richard Roberts + **/ + +#include "TemplateInstantiationTypedef.h" + +#include "utilities.h" + +using namespace std; + +namespace wrap { + + Class TemplateInstantiationTypedef::findAndExpand(const vector& classes) const { + // Find matching class + std::vector::const_iterator clsIt = classes.end(); + for(std::vector::const_iterator it = classes.begin(); it != classes.end(); ++it) { + if(it->name == className && it->namespaces == classNamespaces && it->templateArgs.size() == typeList.size()) { + clsIt = it; + break; + } + } + + if(clsIt == classes.end()) + throw DependencyMissing(wrap::qualifiedName("::", classNamespaces, className), + "instantiation into typedef name " + wrap::qualifiedName("::", namespaces, name) + + ". Ensure that the typedef provides the correct number of template arguments."); + + // Instantiate it + Class classInst = *clsIt; + for(size_t i = 0; i < typeList.size(); ++i) + classInst = classInst.expandTemplate(classInst.templateArgs[i], typeList[i]); + + // Fix class properties + classInst.name = name; + classInst.templateArgs.clear(); + classInst.typedefName = clsIt->qualifiedName("::") + "<"; + if(typeList.size() > 0) + classInst.typedefName += wrap::qualifiedName("::", typeList[0]); + for(size_t i = 1; i < typeList.size(); ++i) + classInst.typedefName += (", " + wrap::qualifiedName("::", typeList[i])); + classInst.typedefName += ">"; + classInst.namespaces = namespaces; + + return classInst; + } + +} \ No newline at end of file diff --git a/wrap/TemplateInstantiationTypedef.h b/wrap/TemplateInstantiationTypedef.h new file mode 100644 index 000000000..192d35324 --- /dev/null +++ b/wrap/TemplateInstantiationTypedef.h @@ -0,0 +1,39 @@ +/* ---------------------------------------------------------------------------- + + * 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 Class.h + * @brief describe the C++ class that is being wrapped + * @author Frank Dellaert + * @author Andrew Melim + * @author Richard Roberts + **/ + +#pragma once + +#include +#include + +#include "Class.h" + +namespace wrap { + +struct TemplateInstantiationTypedef { + std::vector classNamespaces; + std::string className; + std::vector namespaces; + std::string name; + std::vector > typeList; + + Class findAndExpand(const std::vector& classes) const; +}; + +} \ No newline at end of file diff --git a/wrap/TypeAttributesTable.cpp b/wrap/TypeAttributesTable.cpp new file mode 100644 index 000000000..865015a6e --- /dev/null +++ b/wrap/TypeAttributesTable.cpp @@ -0,0 +1,58 @@ +/* ---------------------------------------------------------------------------- + + * 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 Class.cpp + * @author Frank Dellaert + * @author Andrew Melim + * @author Richard Roberts + **/ + +#include "TypeAttributesTable.h" +#include "Class.h" +#include "utilities.h" + +#include + +using namespace std; + +namespace wrap { + + /* ************************************************************************* */ + void TypeAttributesTable::addClasses(const vector& classes) { + BOOST_FOREACH(const Class& cls, classes) { + if(!insert(make_pair(cls.qualifiedName("::"), TypeAttributes(cls.isVirtual))).second) + throw DuplicateDefinition("class " + cls.qualifiedName("::")); + } + } + + /* ************************************************************************* */ + void TypeAttributesTable::addForwardDeclarations(const vector& forwardDecls) { + BOOST_FOREACH(const ForwardDeclaration& fwDec, forwardDecls) { + if(!insert(make_pair(fwDec.name, TypeAttributes(fwDec.isVirtual))).second) + throw DuplicateDefinition("class " + fwDec.name); + } + } + + /* ************************************************************************* */ + void TypeAttributesTable::checkValidity(const vector& classes) const { + BOOST_FOREACH(const Class& cls, classes) { + // Check that class is virtual if it has a parent + if(!cls.qualifiedParent.empty() && !cls.isVirtual) + throw AttributeError(cls.qualifiedName("::"), "Has a base class so needs to be declared virtual, change to 'virtual class "+cls.name+" ...'"); + // Check that parent is virtual as well + if(!cls.qualifiedParent.empty() && !at(wrap::qualifiedName("::", cls.qualifiedParent)).isVirtual) + throw AttributeError(wrap::qualifiedName("::", cls.qualifiedParent), + "Is the base class of " + cls.qualifiedName("::") + ", so needs to be declared virtual"); + } + } + +} \ No newline at end of file diff --git a/wrap/TypeAttributesTable.h b/wrap/TypeAttributesTable.h new file mode 100644 index 000000000..dea6d0bf5 --- /dev/null +++ b/wrap/TypeAttributesTable.h @@ -0,0 +1,55 @@ +/* ---------------------------------------------------------------------------- + + * 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 Class.h + * @brief describe the C++ class that is being wrapped + * @author Frank Dellaert + * @author Andrew Melim + * @author Richard Roberts + **/ + +#include +#include +#include + +#include "ForwardDeclaration.h" + +#pragma once + +namespace wrap { + + // Forward declarations + struct Class; + +/** Attributes about valid classes, both for classes defined in this module and + * also those forward-declared from others. At the moment this only contains + * whether the class is virtual, which is used to know how to copy the class, + * and whether to try to convert it to a more derived type upon returning it. + */ +struct TypeAttributes { + bool isVirtual; + TypeAttributes() : isVirtual(false) {} + TypeAttributes(bool isVirtual) : isVirtual(isVirtual) {} +}; + +/** Map of type names to attributes. */ +class TypeAttributesTable : public std::map { +public: + TypeAttributesTable() {} + + void addClasses(const std::vector& classes); + void addForwardDeclarations(const std::vector& forwardDecls); + + void checkValidity(const std::vector& classes) const; +}; + +} \ No newline at end of file From 191d73df0b852b7468bf580310f21a5a42a5f0ae Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:54:52 +0000 Subject: [PATCH 611/914] Simplified matlab wrapper cmake options --- CMakeLists.txt | 68 +++++++++++++++++++---------------- gtsam/CMakeLists.txt | 14 +++----- gtsam_unstable/CMakeLists.txt | 19 ++++------ matlab/CMakeLists.txt | 62 ++++++++++++++------------------ wrap/CMakeLists.txt | 4 +-- 5 files changed, 76 insertions(+), 91 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77b8b0c18..e2d3c7f57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,42 +36,48 @@ else() set(GTSAM_UNSTABLE_AVAILABLE 0) endif() + # Configurable Options option(GTSAM_BUILD_TESTS "Enable/Disable building of tests" ON) option(GTSAM_BUILD_TIMING "Enable/Disable building of timing scripts" ON) option(GTSAM_BUILD_EXAMPLES "Enable/Disable building of examples" ON) if(GTSAM_UNSTABLE_AVAILABLE) - option(GTSAM_BUILD_UNSTABLE "Enable/Disable libgtsam_unstable" OFF) + option(GTSAM_BUILD_UNSTABLE "Enable/Disable libgtsam_unstable" ON) endif() -option(GTSAM_BUILD_WRAP "Enable/Disable building of matlab wrap utility (necessary for matlab interface)" ON) -if(MSVC) - option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" OFF) -else() +if(NOT MSVC) option(GTSAM_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam" ON) -endif() -option(GTSAM_BUILD_STATIC_LIBRARY "Enable/Disable building of a static version of gtsam" ON) -option(GTSAM_USE_QUATERNIONS "Enable/Disable using an internal Quaternion representation for rotations instead of rotation matrices" OFF) -if(MSVC) - option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" OFF) + option(GTSAM_BUILD_STATIC_LIBRARY "Enable/Disable building of a static version of gtsam" ON) else() + set(GTSAM_BUILD_STATIC_LIBRARY ON) +endif() +option(GTSAM_USE_QUATERNIONS "Enable/Disable using an internal Quaternion representation for rotations instead of rotation matrices" OFF) +if(NOT MSVC) option(GTSAM_BUILD_CONVENIENCE_LIBRARIES "Enable/Disable use of convenience libraries for faster development rebuilds, but slower install" ON) endif() -option(GTSAM_INSTALL_MATLAB_TOOLBOX "Enable/Disable installation of matlab toolbox" ON) -option(GTSAM_INSTALL_MATLAB_EXAMPLES "Enable/Disable installation of matlab examples" ON) -option(GTSAM_INSTALL_MATLAB_TESTS "Enable/Disable installation of matlab tests" ON) -option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility" ON) -set(GTSAM_TOOLBOX_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/borg/toolbox CACHE DOCSTRING "Path to install matlab toolbox") -set(GTSAM_WRAP_HEADER_PATH ${PROJECT_SOURCE_DIR}/wrap CACHE DOCSTRING "Path to directory of matlab.h") +# Options relating to MATLAB wrapper # TODO: Check for matlab mex binary before handling building of binaries - -# Flags for building/installing mex files -option(GTSAM_BUILD_MEX_BIN "Enable/Disable building of matlab mex files" OFF) -option(GTSAM_INSTALL_MEX_BIN "Enable/Disable installing matlab mex binaries" OFF) -set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Flags for running Matlab MEX compilation") +option(GTSAM_INSTALL_MATLAB_TOOLBOX "Enable/Disable installation of matlab toolbox" ON) +option(GTSAM_BUILD_WRAP "Enable/Disable building of matlab wrap utility (necessary for matlab interface)" ON) +option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility for wrapping other libraries" ON) +set(GTSAM_TOOLBOX_INSTALL_PATH "" CACHE DOCSTRING "Matlab toolbox destination, blank defaults to CMAKE_INSTALL_PREFIX/borg/toolbox") +set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Extra flags for running Matlab MEX compilation") set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)") +# Check / set dependent variables for MATLAB wrapper +set(GTSAM_WRAP_HEADER_PATH "${PROJECT_SOURCE_DIR}/wrap") +if(GTSAM_INSTALL_MATLAB_TOOLBOX AND NOT GTSAM_BUILD_WRAP) + message(FATAL_ERROR "GTSAM_INSTALL_MATLAB_TOOLBOX is enabled, please also enable GTSAM_BUILD_WRAP") +endif() +if(GTSAM_INSTALL_WRAP AND NOT GTSAM_BUILD_WRAP) + message(FATAL_ERROR "GTSAM_INSTALL_WRAP is enabled, please also enable GTSAM_BUILD_WRAP") +endif() +if(NOT GTSAM_TOOLBOX_INSTALL_PATH) + set(GTSAM_TOOLBOX_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/borg/toolbox") +endif() + + # Flags for choosing default packaging tools set(CPACK_SOURCE_GENERATOR "TGZ" CACHE STRING "CPack Default Source Generator") set(CPACK_GENERATOR "TGZ" CACHE STRING "CPack Default Binary Generator") @@ -90,7 +96,7 @@ endif(GTSAM_USE_QUATERNIONS) # Flags to determine whether tests and examples are build during 'make install' # Note that these remove the targets from the 'all' option(GTSAM_DISABLE_TESTS_ON_INSTALL "Disables building tests during install" ON) -option(GTSAM_DISABLE_EXAMPLES_ON_INSTALL "Disables buildint examples during install" OFF) +option(GTSAM_DISABLE_EXAMPLES_ON_INSTALL "Disables building examples during install" OFF) # Pull in infrastructure if (GTSAM_BUILD_TESTS) @@ -134,7 +140,9 @@ if (GTSAM_BUILD_EXAMPLES) endif(GTSAM_BUILD_EXAMPLES) # Matlab toolbox -add_subdirectory(matlab) +if (GTSAM_INSTALL_MATLAB_TOOLBOX) + add_subdirectory(matlab) +endif() # Build gtsam_unstable if (GTSAM_BUILD_UNSTABLE) @@ -168,11 +176,12 @@ message(STATUS "Build flags ") print_config_flag(${GTSAM_BUILD_TIMING} "Build Timing scripts ") print_config_flag(${GTSAM_BUILD_EXAMPLES} "Build Examples ") print_config_flag(${GTSAM_BUILD_TESTS} "Build Tests ") -print_config_flag(${GTSAM_BUILD_WRAP} "Build Wrap ") -print_config_flag(${GTSAM_BUILD_SHARED_LIBRARY} "Build shared GTSAM Library ") -print_config_flag(${GTSAM_BUILD_STATIC_LIBRARY} "Build static GTSAM Library ") +if(NOT MSVC) + print_config_flag(${GTSAM_BUILD_SHARED_LIBRARY} "Build shared GTSAM Library ") + print_config_flag(${GTSAM_BUILD_STATIC_LIBRARY} "Build static GTSAM Library ") + print_config_flag(${GTSAM_BUILD_CONVENIENCE_LIBRARIES} "Build Convenience Libraries ") +endif() print_config_flag(${GTSAM_BUILD_TYPE_POSTFIXES} "Put build-type in library name ") -print_config_flag(${GTSAM_BUILD_CONVENIENCE_LIBRARIES} "Build Convenience Libraries ") if(GTSAM_UNSTABLE_AVAILABLE) print_config_flag(${GTSAM_BUILD_UNSTABLE} "Build libgtsam_unstable ") endif() @@ -192,11 +201,8 @@ print_config_flag(${GTSAM_USE_QUATERNIONS} "Quaternions as default R message(STATUS "MATLAB toolbox flags ") print_config_flag(${GTSAM_INSTALL_MATLAB_TOOLBOX} "Install matlab toolbox ") -print_config_flag(${GTSAM_INSTALL_MATLAB_EXAMPLES} "Install matlab examples ") -print_config_flag(${GTSAM_INSTALL_MATLAB_TESTS} "Install matlab tests ") +print_config_flag(${GTSAM_BUILD_WRAP} "Build Wrap ") print_config_flag(${GTSAM_INSTALL_WRAP} "Install wrap utility ") -print_config_flag(${GTSAM_BUILD_MEX_BIN} "Build MEX binaries ") -print_config_flag(${GTSAM_INSTALL_MEX_BIN} "Install MEX binaries ") message(STATUS "===============================================================") # Include CPack *after* all flags diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index e168116e7..66870a09c 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -115,21 +115,15 @@ if (GTSAM_BUILD_SHARED_LIBRARY) endif(GTSAM_BUILD_SHARED_LIBRARY) # Create the matlab toolbox for the gtsam library -if (GTSAM_BUILD_WRAP) +if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Set up codegen include(GtsamMatlabWrap) # TODO: generate these includes programmatically # Choose include flags depending on build process - if (GTSAM_BUILD_MEX_BIN) - set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) - set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) - set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}/gtsam) - else() - set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) - set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) - set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}) - endif() + set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) + set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) + set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}/gtsam) # Generate, build and install toolbox set(mexFlags ${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam) diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 9851852e3..fce7510c3 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -73,23 +73,16 @@ if (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) endif(GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY) # Wrap version for gtsam_unstable -if (GTSAM_BUILD_WRAP) +if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Set up codegen include(GtsamMatlabWrap) # TODO: generate these includes programmatically # Choose include flags depending on build process - if (GTSAM_BUILD_MEX_BIN) - set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) - set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) - set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}/gtsam) - set(GTSAM_UNSTABLE_LIB_DIR ${MEX_LIB_ROOT}/gtsam_unstable) - else() - set(MEX_INCLUDE_ROOT ${CMAKE_INSTALL_PREFIX}/include) - set(MEX_LIB_ROOT ${CMAKE_INSTALL_PREFIX}/lib) - set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}) - set(GTSAM_UNSTABLE_LIB_DIR ${MEX_LIB_ROOT}) - endif() + set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) + set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) + set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}/gtsam) + set(GTSAM_UNSTABLE_LIB_DIR ${MEX_LIB_ROOT}/gtsam_unstable) # Generate, build and install toolbox set(mexFlags -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete) @@ -97,4 +90,4 @@ if (GTSAM_BUILD_WRAP) # Macro to handle details of setting up targets wrap_library(gtsam_unstable "${mexFlags}" "./" gtsam) -endif(GTSAM_BUILD_WRAP) +endif(GTSAM_INSTALL_MATLAB_TOOLBOX) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index 9d48a949f..84df4055c 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -1,37 +1,29 @@ # Install matlab components -if (GTSAM_BUILD_WRAP) - if (GTSAM_INSTALL_MATLAB_TOOLBOX) - # Utility functions - message(STATUS "Installing Matlab Utility Functions") - # Matlab files: *.m and *.fig - file(GLOB matlab_utils_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.m") - file(GLOB matlab_utils_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.fig") - set(matlab_utils ${matlab_utils_m} ${matlab_utils_fig}) - install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam) - - # Tests - if (GTSAM_INSTALL_MATLAB_TESTS) - message(STATUS "Installing Matlab Toolbox Tests") - file(GLOB matlab_tests "${GTSAM_SOURCE_ROOT_DIR}/matlab/tests/*.m") - install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/tests) - endif () - - # Examples - if (GTSAM_INSTALL_MATLAB_EXAMPLES) - message(STATUS "Installing Matlab Toolbox Examples") - # Matlab files: *.m and *.fig - file(GLOB matlab_examples_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.m") - file(GLOB matlab_examples_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.fig") - set(matlab_examples ${matlab_examples_m} ${matlab_examples_fig}) - install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) - - message(STATUS "Installing Matlab Toolbox Examples (Data)") - # Data files: *.graph and *.txt - file(GLOB matlab_examples_data_graph "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.graph") - file(GLOB matlab_examples_data_txt "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.txt") - set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) - install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) - endif () - endif () -endif () +# Utility functions +message(STATUS "Installing Matlab Utility Functions") +# Matlab files: *.m and *.fig +file(GLOB matlab_utils_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.m") +file(GLOB matlab_utils_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.fig") +set(matlab_utils ${matlab_utils_m} ${matlab_utils_fig}) +install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam) + +# Tests +message(STATUS "Installing Matlab Toolbox Tests") +file(GLOB matlab_tests "${GTSAM_SOURCE_ROOT_DIR}/matlab/tests/*.m") +install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/tests) + +# Examples +message(STATUS "Installing Matlab Toolbox Examples") +# Matlab files: *.m and *.fig +file(GLOB matlab_examples_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.m") +file(GLOB matlab_examples_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.fig") +set(matlab_examples ${matlab_examples_m} ${matlab_examples_fig}) +install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) + +message(STATUS "Installing Matlab Toolbox Examples (Data)") +# Data files: *.graph and *.txt +file(GLOB matlab_examples_data_graph "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.graph") +file(GLOB matlab_examples_data_txt "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.txt") +set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) +install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index 4d6e81d2f..e27ca4564 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -1,6 +1,6 @@ # Build/install Wrap -find_package(Boost 1.42 COMPONENTS system filesystem thread REQUIRED) +find_package(Boost 1.43 COMPONENTS system filesystem thread REQUIRED) # Build the executable itself file(GLOB wrap_srcs "*.cpp") @@ -22,7 +22,7 @@ endif(GTSAM_INSTALL_WRAP) install(FILES matlab.h DESTINATION include/wrap) # Build tests -if (GTSAM_BUILD_TESTS) +if (GTSAM_BUILD_TESTS) set(wrap_local_libs wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) gtsam_add_subdir_tests("wrap" "${wrap_local_libs}" "${wrap_local_libs}" "") endif(GTSAM_BUILD_TESTS) From aa5beafd946a1a20f9e02c7eec9b3072eb87212e Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:54:55 +0000 Subject: [PATCH 612/914] Wrap include path bug fix --- wrap/Class.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 7034ebb3a..2cb36386a 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -269,7 +269,7 @@ Class expandClassTemplate(const Class& cls, const string& templateArg, const vec inst.namespaces = cls.namespaces; inst.using_namespaces = cls.using_namespaces; bool allIncludesEmpty = true; - BOOST_FOREACH(const string& inc, cls.includes) { if(!inc.empty()) { allIncludesEmpty = true; break; } } + BOOST_FOREACH(const string& inc, cls.includes) { if(!inc.empty()) { allIncludesEmpty = false; break; } } if(allIncludesEmpty) inst.includes.push_back(cls.name + ".h"); else From 4ae96c6642c6e17476bfc2ccd058cafc927e8f61 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:54:57 +0000 Subject: [PATCH 613/914] Check dependencies before class attributes to avoid out-of-range exception --- wrap/Module.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 707d91dc4..a6fa3da20 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -423,24 +423,28 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // Dependency check list vector validTypes = GenerateValidTypes(expandedClasses, forward_declarations); + // Check that all classes have been defined somewhere + BOOST_FOREACH(const Class& cls, expandedClasses) { + // verify all of the function arguments + //TODO:verifyArguments(validTypes, cls.constructor.args_list); + verifyArguments(validTypes, cls.static_methods); + verifyArguments(validTypes, cls.methods); + + // verify function return types + verifyReturnTypes(validTypes, cls.static_methods); + verifyReturnTypes(validTypes, cls.methods); + + // verify parents + if(!cls.qualifiedParent.empty() && std::find(validTypes.begin(), validTypes.end(), wrap::qualifiedName("::", cls.qualifiedParent)) == validTypes.end()) + throw DependencyMissing(wrap::qualifiedName("::", cls.qualifiedParent), cls.qualifiedName("::")); + } + // Create type attributes table and check validity TypeAttributesTable typeAttributes; typeAttributes.addClasses(expandedClasses); typeAttributes.addForwardDeclarations(forward_declarations); typeAttributes.checkValidity(expandedClasses); - // Check that all classes have been defined somewhere - BOOST_FOREACH(const Class& cls, expandedClasses) { - // verify all of the function arguments - //TODO:verifyArguments(validTypes, cls.constructor.args_list); - verifyArguments(validTypes, cls.static_methods); - verifyArguments(validTypes, cls.methods); - - // verify function return types - verifyReturnTypes(validTypes, cls.static_methods); - verifyReturnTypes(validTypes, cls.methods); - } - // Generate includes while avoiding redundant includes generateIncludes(wrapperFile); From 6c9608752e496a672a8858eb1afebc1e8dedb0aa Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:55:00 +0000 Subject: [PATCH 614/914] Small cleanups / fixes in handling of compile options --- CMakeLists.txt | 5 +++-- gtsam_unstable/CMakeLists.txt | 10 +++++++--- wrap/CMakeLists.txt | 6 +++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e2d3c7f57..ed6b31db9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,7 +63,7 @@ option(GTSAM_BUILD_WRAP "Enable/Disable building of matlab wrap option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility for wrapping other libraries" ON) set(GTSAM_TOOLBOX_INSTALL_PATH "" CACHE DOCSTRING "Matlab toolbox destination, blank defaults to CMAKE_INSTALL_PREFIX/borg/toolbox") set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Extra flags for running Matlab MEX compilation") -set(MEX_COMMAND "mex" CACHE STRING "Command to use for executing mex (if on path, 'mex' will work)") +set(MEX_COMMAND "mex" CACHE FILEPATH "Command to use for executing mex (if on path, 'mex' will work)") # Check / set dependent variables for MATLAB wrapper set(GTSAM_WRAP_HEADER_PATH "${PROJECT_SOURCE_DIR}/wrap") @@ -109,7 +109,8 @@ endif() if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.43 COMPONENTS serialization REQUIRED) +find_package(Boost 1.43 COMPONENTS serialization system filesystem thread date_time REQUIRED) +set(GTSAM_BOOST_LIBRARIES ${Boost_SERIALIZATION_LIBRARY}) # General build settings include_directories( diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index fce7510c3..09fb124a9 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -15,10 +15,12 @@ add_custom_target(check.unstable COMMAND ${CMAKE_CTEST_COMMAND} --output-on-fail foreach(subdir ${gtsam_unstable_subdirs}) # Build convenience libraries file(GLOB subdir_srcs "${subdir}/*.cpp") - set(${subdir}_srcs ${subdir_srcs}) + file(GLOB subdir_headers "${subdir}/*.h") + set(${subdir}_srcs ${subdir_srcs} ${subdir_headers}) + gtsam_assign_source_folders("${${subdir}_srcs}") # Create MSVC structure if (subdir_srcs AND GTSAM_BUILD_CONVENIENCE_LIBRARIES) message(STATUS "Building Convenience Library: ${subdir}_unstable") - add_library("${subdir}_unstable" STATIC ${subdir_srcs}) + add_library("${subdir}_unstable" STATIC ${${subdir}_srcs}) endif() # Build local library and tests @@ -36,7 +38,9 @@ set(gtsam_unstable_srcs ${slam_srcs} ) -option (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam_unstable" ON) +if(NOT MSVC) + option (GTSAM_UNSTABLE_BUILD_SHARED_LIBRARY "Enable/Disable building of a shared version of gtsam_unstable" ON) +endif() # Versions - same as core gtsam library set(gtsam_unstable_version ${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}) diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt index e27ca4564..14d9a1f84 100644 --- a/wrap/CMakeLists.txt +++ b/wrap/CMakeLists.txt @@ -1,6 +1,6 @@ # Build/install Wrap -find_package(Boost 1.43 COMPONENTS system filesystem thread REQUIRED) +set(WRAP_BOOST_LIBRARIES ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY}) # Build the executable itself file(GLOB wrap_srcs "*.cpp") @@ -9,7 +9,7 @@ list(REMOVE_ITEM wrap_srcs ${CMAKE_CURRENT_SOURCE_DIR}/wrap.cpp) add_library(wrap_lib STATIC ${wrap_srcs} ${wrap_headers}) gtsam_assign_source_folders(${wrap_srcs} ${wrap_headers}) add_executable(wrap wrap.cpp) -target_link_libraries(wrap wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) +target_link_libraries(wrap wrap_lib ${WRAP_BOOST_LIBRARIES}) # Install wrap binary and export target if (GTSAM_INSTALL_WRAP) @@ -23,7 +23,7 @@ install(FILES matlab.h DESTINATION include/wrap) # Build tests if (GTSAM_BUILD_TESTS) - set(wrap_local_libs wrap_lib ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) + set(wrap_local_libs wrap_lib ${WRAP_BOOST_LIBRARIES}) gtsam_add_subdir_tests("wrap" "${wrap_local_libs}" "${wrap_local_libs}" "") endif(GTSAM_BUILD_TESTS) From ecfcf82f13b37fb0a4c6bcd06dcd5cc745f18f57 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:55:02 +0000 Subject: [PATCH 615/914] Wrapped NonlinearEquality and NonlinearFactorGraph::at --- gtsam.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gtsam.h b/gtsam.h index 0e50ac9b6..3222cd2d1 100644 --- a/gtsam.h +++ b/gtsam.h @@ -982,6 +982,7 @@ class NonlinearFactorGraph { void print(string s) const; double error(const gtsam::Values& c) const; double probPrime(const gtsam::Values& c) const; + gtsam::NonlinearFactor* at(size_t i) const; void add(const gtsam::NonlinearFactor* factor); gtsam::Ordering* orderingCOLAMD(const gtsam::Values& c) const; // Ordering* orderingCOLAMDConstrained(const gtsam::Values& c, const std::map& constraints) const; @@ -1132,6 +1133,15 @@ virtual class BetweenFactor : gtsam::NonlinearFactor { }; +template +virtual class NonlinearEquality : gtsam::NonlinearFactor { + // Constructor - forces exact evaluation + NonlinearEquality(size_t j, const T& feasible); + // Constructor - allows inexact evaluation + NonlinearEquality(size_t j, const T& feasible, double error_gain); +}; + + template virtual class RangeFactor : gtsam::NonlinearFactor { RangeFactor(size_t key1, size_t key2, double measured, const gtsam::noiseModel::Base* noiseModel); From e4f74354ca1f375c416c0876d3b11a17c20a7499 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:55:05 +0000 Subject: [PATCH 616/914] Wrapped factors in gtsam_unstable and updated PoseRTV --- gtsam_unstable/dynamics/FullIMUFactor.h | 2 - gtsam_unstable/dynamics/IMUFactor.h | 2 - gtsam_unstable/gtsam_unstable.h | 127 +++++++++++++++++++++--- 3 files changed, 115 insertions(+), 16 deletions(-) diff --git a/gtsam_unstable/dynamics/FullIMUFactor.h b/gtsam_unstable/dynamics/FullIMUFactor.h index c9a75ec23..f42ecc352 100644 --- a/gtsam_unstable/dynamics/FullIMUFactor.h +++ b/gtsam_unstable/dynamics/FullIMUFactor.h @@ -77,8 +77,6 @@ public: const Vector& gyro() const { return gyro_; } const Vector& accel() const { return accel_; } Vector z() const { return concatVectors(2, &accel_, &gyro_); } - const Key& key1() const { return this->key1_; } - const Key& key2() const { return this->key2_; } /** * Error evaluation with optional derivatives - calculates diff --git a/gtsam_unstable/dynamics/IMUFactor.h b/gtsam_unstable/dynamics/IMUFactor.h index adcf772e3..9e5651cc9 100644 --- a/gtsam_unstable/dynamics/IMUFactor.h +++ b/gtsam_unstable/dynamics/IMUFactor.h @@ -70,8 +70,6 @@ public: const Vector& gyro() const { return gyro_; } const Vector& accel() const { return accel_; } Vector z() const { return concatVectors(2, &accel_, &gyro_); } - const Key& key1() const { return this->key1_; } - const Key& key2() const { return this->key2_; } /** * Error evaluation with optional derivatives - calculates diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index c9d114d58..3d9fd7aac 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -3,10 +3,12 @@ */ // specify the classes from gtsam we are using -class gtsam::Point3; -class gtsam::Rot3; -class gtsam::Pose3; -class gtsam::SharedNoiseModel; +virtual class gtsam::Value; +virtual class gtsam::Point3; +virtual class gtsam::Rot3; +virtual class gtsam::Pose3; +virtual class gtsam::noiseModel::Base; +virtual class gtsam::NonlinearFactor; namespace gtsam { @@ -18,7 +20,7 @@ class Dummy { }; #include -class PoseRTV { +virtual class PoseRTV : gtsam::Value { PoseRTV(); PoseRTV(Vector rtv); PoseRTV(const gtsam::Point3& pt, const gtsam::Rot3& rot, const gtsam::Point3& vel); @@ -66,6 +68,107 @@ class PoseRTV { Vector translationIntegrationVec(const gtsam::PoseRTV& x2, double dt) const; }; + +// Nonlinear factors from gtsam, for our Value types +#include +template +virtual class PriorFactor : gtsam::NonlinearFactor { + PriorFactor(size_t key, const T& prior, const gtsam::noiseModel::Base* noiseModel); +}; + + +#include +template +virtual class BetweenFactor : gtsam::NonlinearFactor { + BetweenFactor(size_t key1, size_t key2, const T& relativePose, const gtsam::noiseModel::Base* noiseModel); +}; + + +#include +template +virtual class RangeFactor : gtsam::NonlinearFactor { + RangeFactor(size_t key1, size_t key2, double measured, const gtsam::noiseModel::Base* noiseModel); +}; + +typedef gtsam::RangeFactor RangeFactorRTV; + + +#include +template +virtual class NonlinearEquality : gtsam::NonlinearFactor { + // Constructor - forces exact evaluation + NonlinearEquality(size_t j, const T& feasible); + // Constructor - allows inexact evaluation + NonlinearEquality(size_t j, const T& feasible, double error_gain); +}; + + +template +virtual class IMUFactor : gtsam::NonlinearFactor { + /** Standard constructor */ + IMUFactor(Vector accel, Vector gyro, + double dt, size_t key1, size_t key2, const gtsam::noiseModel::Base* model); + + /** Full IMU vector specification */ + IMUFactor(Vector imu_vector, + double dt, size_t key1, size_t key2, const gtsam::noiseModel::Base* model); + + Vector gyro() const; + Vector accel() const; + Vector z() const; + size_t key1() const; + size_t key2() const; +}; + + +template +virtual class FullIMUFactor : gtsam::NonlinearFactor { + /** Standard constructor */ + FullIMUFactor(Vector accel, Vector gyro, + double dt, size_t key1, size_t key2, const gtsam::noiseModel::Base* model); + + /** Single IMU vector - imu = [accel, gyro] */ + FullIMUFactor(Vector imu, + double dt, size_t key1, size_t key2, const gtsam::noiseModel::Base* model); + + Vector gyro() const; + Vector accel() const; + Vector z() const; + size_t key1() const; + size_t key2() const; +}; + + +#include +virtual class DHeightPrior : gtsam::NonlinearFactor { + DHeightPrior(size_t key, double height, const gtsam::noiseModel::Base* model); +}; + + +#include +virtual class DRollPrior : gtsam::NonlinearFactor { + /** allows for explicit roll parameterization - uses canonical coordinate */ + DRollPrior(size_t key, double wx, const gtsam::noiseModel::Base* model); + /** Forces roll to zero */ + DRollPrior(size_t key, const gtsam::noiseModel::Base* model); +}; + + +#include +virtual class VelocityPrior : gtsam::NonlinearFactor { + VelocityPrior(size_t key, Vector vel, const gtsam::noiseModel::Base* model); +}; + + +#include +virtual class DGroundConstraint : gtsam::NonlinearFactor { + // Primary constructor allows for variable height of the "floor" + DGroundConstraint(size_t key, double height, const gtsam::noiseModel::Base* model); + // Fully specify vector - use only for debugging + DGroundConstraint(size_t key, Vector constraint, const gtsam::noiseModel::Base* model); +}; + + }///\namespace gtsam #include @@ -84,18 +187,18 @@ class Graph { void print(string s) const; // prior factors - void addPrior(size_t key, const gtsam::PoseRTV& pose, const gtsam::SharedNoiseModel& noiseModel); + void addPrior(size_t key, const gtsam::PoseRTV& pose, const gtsam::noiseModel::Base* noiseModel); void addConstraint(size_t key, const gtsam::PoseRTV& pose); - void addHeightPrior(size_t key, double z, const gtsam::SharedNoiseModel& noiseModel); + void addHeightPrior(size_t key, double z, const gtsam::noiseModel::Base* noiseModel); // inertial factors - void addFullIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const gtsam::SharedNoiseModel& noiseModel); - void addIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const gtsam::SharedNoiseModel& noiseModel); - void addVelocityConstraint(size_t key1, size_t key2, double dt, const gtsam::SharedNoiseModel& noiseModel); + void addFullIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const gtsam::noiseModel::Base* noiseModel); + void addIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const gtsam::noiseModel::Base* noiseModel); + void addVelocityConstraint(size_t key1, size_t key2, double dt, const gtsam::noiseModel::Base* noiseModel); // other measurements - void addBetween(size_t key1, size_t key2, const gtsam::PoseRTV& z, const gtsam::SharedNoiseModel& noiseModel); - void addRange(size_t key1, size_t key2, double z, const gtsam::SharedNoiseModel& noiseModel); + void addBetween(size_t key1, size_t key2, const gtsam::PoseRTV& z, const gtsam::noiseModel::Base* noiseModel); + void addRange(size_t key1, size_t key2, double z, const gtsam::noiseModel::Base* noiseModel); // optimization imu::Values optimize(const imu::Values& init) const; From bcaa1d00bfe4f7f56f4ad00ad4fa4334c1731833 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:57:57 +0000 Subject: [PATCH 617/914] Fixed warnings --- gtsam.h | 4 ++-- gtsam/linear/VectorValues.h | 2 +- gtsam/nonlinear/NonlinearOptimizer.h | 22 +++++++++++----------- gtsam/nonlinear/Ordering.h | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/gtsam.h b/gtsam.h index 3222cd2d1..9d7d7a7a6 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1090,13 +1090,13 @@ class LevenbergMarquardtParams { LevenbergMarquardtParams(); void print(string s) const; - double getMaxIterations() const; + size_t getMaxIterations() const; double getRelativeErrorTol() const; double getAbsoluteErrorTol() const; double getErrorTol() const; string getVerbosity() const; - void setMaxIterations(double value); + void setMaxIterations(size_t value); void setRelativeErrorTol(double value); void setAbsoluteErrorTol(double value); void setErrorTol(double value); diff --git a/gtsam/linear/VectorValues.h b/gtsam/linear/VectorValues.h index aa9c1aa6d..9fad99223 100644 --- a/gtsam/linear/VectorValues.h +++ b/gtsam/linear/VectorValues.h @@ -419,7 +419,7 @@ namespace gtsam { maps_.reserve(maps_.size() + dimensions.size()); BOOST_FOREACH(size_t dim, dimensions) { maps_.push_back(values_.segment(varStart, dim)); - varStart += dim; // varStart is continued from first for loop + varStart += (int)dim; // varStart is continued from first for loop } } diff --git a/gtsam/nonlinear/NonlinearOptimizer.h b/gtsam/nonlinear/NonlinearOptimizer.h index 44b352938..1c071faef 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.h +++ b/gtsam/nonlinear/NonlinearOptimizer.h @@ -45,23 +45,23 @@ public: Verbosity verbosity; ///< The printing verbosity during optimization (default SILENT) NonlinearOptimizerParams() : - maxIterations(100.0), relativeErrorTol(1e-5), absoluteErrorTol(1e-5), + maxIterations(100), relativeErrorTol(1e-5), absoluteErrorTol(1e-5), errorTol(0.0), verbosity(SILENT) {} virtual ~NonlinearOptimizerParams() {} virtual void print(const std::string& str = "") const ; - inline double getMaxIterations() const { return maxIterations; } - inline double getRelativeErrorTol() const { return relativeErrorTol; } - inline double getAbsoluteErrorTol() const { return absoluteErrorTol; } - inline double getErrorTol() const { return errorTol; } - inline std::string getVerbosity() const { return verbosityTranslator(verbosity); } + size_t getMaxIterations() const { return maxIterations; } + double getRelativeErrorTol() const { return relativeErrorTol; } + double getAbsoluteErrorTol() const { return absoluteErrorTol; } + double getErrorTol() const { return errorTol; } + std::string getVerbosity() const { return verbosityTranslator(verbosity); } - inline void setMaxIterations(double value) { maxIterations = value; } - inline void setRelativeErrorTol(double value) { relativeErrorTol = value; } - inline void setAbsoluteErrorTol(double value) { absoluteErrorTol = value; } - inline void setErrorTol(double value) { errorTol = value ; } - inline void setVerbosity(const std::string &src) { verbosity = verbosityTranslator(src); } + void setMaxIterations(size_t value) { maxIterations = value; } + void setRelativeErrorTol(double value) { relativeErrorTol = value; } + void setAbsoluteErrorTol(double value) { absoluteErrorTol = value; } + void setErrorTol(double value) { errorTol = value ; } + void setVerbosity(const std::string &src) { verbosity = verbosityTranslator(src); } Verbosity verbosityTranslator(const std::string &s) const; std::string verbosityTranslator(Verbosity value) const; diff --git a/gtsam/nonlinear/Ordering.h b/gtsam/nonlinear/Ordering.h index c2bac18f8..c6881fbde 100644 --- a/gtsam/nonlinear/Ordering.h +++ b/gtsam/nonlinear/Ordering.h @@ -155,7 +155,7 @@ public: iterator end() { return order_.end(); } /// Test if the key exists in the ordering. - bool exists(Key key) const { return order_.count(key); } + bool exists(Key key) const { return order_.count(key) > 0; } ///TODO: comment std::pair tryInsert(Key key, Index order) { return tryInsert(std::make_pair(key,order)); } From ee2889d4b3fb9cbbb2d86559daa5b885606996e4 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 21:59:30 +0000 Subject: [PATCH 618/914] Improved error message --- wrap/matlab.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wrap/matlab.h b/wrap/matlab.h index d3fb9f926..5b438f1a6 100644 --- a/wrap/matlab.h +++ b/wrap/matlab.h @@ -366,9 +366,11 @@ mxArray* create_object(const std::string& classname, void *pointer, bool isVirtu if(!derivedNameMx) mexErrMsgTxt(( "gtsam wrap: The derived class type " + string(rttiName) + " was not found in the RTTI registry. " + "Try calling 'clear all' twice consecutively - we have seen things not get unloaded properly the " + "first time. If this does not work, this may indicate an inconsistency in your wrap interface file. " "The most likely cause for this is that a base class was marked virtual in the wrap interface " - "definition header file for gtsam or for your module, but a derived type was returned by a C++" - "function and that derived type was not marked virtual (or was not specified in the wrap interface" + "definition header file for gtsam or for your module, but a derived type was returned by a C++ " + "function and that derived type was not marked virtual (or was not specified in the wrap interface " "definition header at all).").c_str()); size_t strLen = mxGetN(derivedNameMx); char *buf = new char[strLen+1]; From 5f49a186287e023ece32330f459d80f38a9d9277 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 13 Jul 2012 23:19:37 +0000 Subject: [PATCH 619/914] Added docs about templates to gtsam.h --- gtsam.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gtsam.h b/gtsam.h index 9d7d7a7a6..882319607 100644 --- a/gtsam.h +++ b/gtsam.h @@ -14,7 +14,7 @@ * - void * - Any class with which be copied with boost::make_shared() * - boost::shared_ptr of any object type -<* Constructors + * Constructors * - Overloads are supported * - A class with no constructors can be returned from other functions but not allocated directly in MATLAB * Methods @@ -26,7 +26,7 @@ * - Must start with a letter (upper or lowercase) and use the "static" keyword * - The first letter will be made uppercase in the generated MATLAB interface * - Overloads are supported -=* Arguments to functions any of + * Arguments to functions any of * - Eigen types: Matrix, Vector * - Eigen types and classes as an optionally const reference * - C/C++ basic types: string, bool, size_t, size_t, double, char, unsigned char @@ -62,6 +62,17 @@ * - Virtual classes must have a clone() function in C++ (though it does not have to be included * in the MATLAB interface). clone() will be called whenever an object copy is needed, instead * of using the copy constructor (which is used for non-virtual objects). + * Templates + * - Basic templates are supported either with an explicit list of types to instantiate, + * e.g. template class Class1 { ... }; + * or with typedefs, e.g. + * template class Class2 { ... }; + * typedef Class2 MyInstantiatedClass; + * - To create new instantiations in other modules, you must copy-and-paste the whole class definition + * into the new module, but use only your new instantiation types. + * - When forward-declaring template instantiations, use the generated/typedefed name, e.g. + * class gtsam::Class1Pose2; + * class gtsam::MyInstantiatedClass; */ /** From 8003ab66d7786bf2964844eb2d00f29205ca0524 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 14 Jul 2012 20:30:27 +0000 Subject: [PATCH 620/914] Fixed the type setting so that paths can be set easily in cmake-gui --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed6b31db9..c7b7cf9b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,7 @@ endif() option(GTSAM_INSTALL_MATLAB_TOOLBOX "Enable/Disable installation of matlab toolbox" ON) option(GTSAM_BUILD_WRAP "Enable/Disable building of matlab wrap utility (necessary for matlab interface)" ON) option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility for wrapping other libraries" ON) -set(GTSAM_TOOLBOX_INSTALL_PATH "" CACHE DOCSTRING "Matlab toolbox destination, blank defaults to CMAKE_INSTALL_PREFIX/borg/toolbox") +set(GTSAM_TOOLBOX_INSTALL_PATH "" CACHE PATH "Matlab toolbox destination, blank defaults to CMAKE_INSTALL_PREFIX/borg/toolbox") set(GTSAM_BUILD_MEX_BINARY_FLAGS "" CACHE STRING "Extra flags for running Matlab MEX compilation") set(MEX_COMMAND "mex" CACHE FILEPATH "Command to use for executing mex (if on path, 'mex' will work)") From a87d12a7b7e3719750935e2e2dea6050e085b5a6 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 14 Jul 2012 20:30:30 +0000 Subject: [PATCH 621/914] pacified warning --- wrap/Module.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index a6fa3da20..32acb2853 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -508,7 +508,7 @@ vector Module::ExpandTypedefInstantiations(const vector& classes, } // Remove all template classes - for(int i = 0; i < expandedClasses.size(); ++i) + for(size_t i = 0; i < expandedClasses.size(); ++i) if(!expandedClasses[size_t(i)].templateArgs.empty()) { expandedClasses.erase(expandedClasses.begin() + size_t(i)); -- i; From 88b51d45b88a29de3288e4070bdcedcd92b9caf4 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 14 Jul 2012 21:39:58 +0000 Subject: [PATCH 622/914] Added doxygen support via cmake using 'make doc' --- .cproject | 326 ++++++++++++++++++---------------- CMakeLists.txt | 17 +- doc/{Doxyfile => Doxyfile.in} | 28 +-- 3 files changed, 202 insertions(+), 169 deletions(-) rename doc/{Doxyfile => Doxyfile.in} (98%) diff --git a/.cproject b/.cproject index b31515394..c18c63f56 100644 --- a/.cproject +++ b/.cproject @@ -282,6 +282,7 @@ + @@ -308,14 +309,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -342,6 +335,7 @@ make + tests/testBayesTree.run true false @@ -349,6 +343,7 @@ make + testBinaryBayesNet.run true false @@ -396,6 +391,7 @@ make + testSymbolicBayesNet.run true false @@ -403,6 +399,7 @@ make + tests/testSymbolicFactor.run true false @@ -410,6 +407,7 @@ make + testSymbolicFactorGraph.run true false @@ -425,11 +423,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -518,22 +525,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -550,6 +541,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -574,26 +581,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -678,26 +685,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -952,6 +959,7 @@ make + testGraph.run true false @@ -959,6 +967,7 @@ make + testJunctionTree.run true false @@ -966,6 +975,7 @@ make + testSymbolicBayesNetB.run true false @@ -1101,6 +1111,7 @@ make + testErrors.run true false @@ -1564,7 +1575,6 @@ make - testSimulated2DOriented.run true false @@ -1604,7 +1614,6 @@ make - testSimulated2D.run true false @@ -1612,7 +1621,6 @@ make - testSimulated3D.run true false @@ -1828,7 +1836,6 @@ make - tests/testGaussianISAM2 true false @@ -1850,102 +1857,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j2 @@ -2147,6 +2058,7 @@ cpack + -G DEB true false @@ -2154,6 +2066,7 @@ cpack + -G RPM true false @@ -2161,6 +2074,7 @@ cpack + -G TGZ true false @@ -2168,6 +2082,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2293,34 +2208,106 @@ true true - + make -j5 - testSpirit.run + doc true true true - + make - -j5 - testWrap.run + -j2 + testRot3.run true true true - + make - -j5 - check.wrap + -j2 + testRot2.run true true true - + make - -j5 - wrap + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2364,7 +2351,38 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap + true + true + true + - diff --git a/CMakeLists.txt b/CMakeLists.txt index c7b7cf9b6..f87dff186 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 2.6) # Set the version number for the library set (GTSAM_VERSION_MAJOR 2) -set (GTSAM_VERSION_MINOR 0) +set (GTSAM_VERSION_MINOR 1) set (GTSAM_VERSION_PATCH 0) # Set the default install path to home @@ -41,6 +41,7 @@ endif() option(GTSAM_BUILD_TESTS "Enable/Disable building of tests" ON) option(GTSAM_BUILD_TIMING "Enable/Disable building of timing scripts" ON) option(GTSAM_BUILD_EXAMPLES "Enable/Disable building of examples" ON) +option(GTSAM_BUILD_DOCS "Enable/Disable building of doxygen docs" OFF) if(GTSAM_UNSTABLE_AVAILABLE) option(GTSAM_BUILD_UNSTABLE "Enable/Disable libgtsam_unstable" ON) endif() @@ -154,6 +155,19 @@ endif(GTSAM_BUILD_UNSTABLE) GtsamMakeConfigFile(GTSAM) export(TARGETS ${GTSAM_EXPORTED_TARGETS} FILE GTSAM-exports.cmake) +# add a target to generate API documentation with Doxygen +if (GTSAM_BUILD_DOCS) + find_package(Doxygen) + if(DOXYGEN_FOUND) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) + add_custom_target(doc + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc + COMMENT "Generating API documentation with Doxygen" VERBATIM + ) + endif(DOXYGEN_FOUND) +endif (GTSAM_BUILD_DOCS) + # Set up CPack set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM") set(CPACK_PACKAGE_VENDOR "Frank Dellaert, Georgia Institute of Technology") @@ -177,6 +191,7 @@ message(STATUS "Build flags ") print_config_flag(${GTSAM_BUILD_TIMING} "Build Timing scripts ") print_config_flag(${GTSAM_BUILD_EXAMPLES} "Build Examples ") print_config_flag(${GTSAM_BUILD_TESTS} "Build Tests ") +print_config_flag(${GTSAM_BUILD_DOCS} "Build Docs ") if(NOT MSVC) print_config_flag(${GTSAM_BUILD_SHARED_LIBRARY} "Build shared GTSAM Library ") print_config_flag(${GTSAM_BUILD_STATIC_LIBRARY} "Build static GTSAM Library ") diff --git a/doc/Doxyfile b/doc/Doxyfile.in similarity index 98% rename from doc/Doxyfile rename to doc/Doxyfile.in index 16940c2bd..1c767e584 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile.in @@ -32,7 +32,7 @@ PROJECT_NAME = gtsam # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 2.0.0 +PROJECT_NUMBER = @GTSAM_VERSION_MAJOR@.@GTSAM_VERSION_MINOR@.@GTSAM_VERSION_PATCH@ # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer @@ -638,19 +638,19 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = ../gtsam/base \ - ../gtsam/geometry \ - ../gtsam/inference \ - ../gtsam/discrete \ - ../gtsam/linear \ - ../gtsam/nonlinear \ - ../gtsam -# ../gtsam/slam \ -# ../gtsam_unstable/slam \ -# ../gtsam_unstable/base \ -# ../gtsam_unstable/geometry \ -# ../gtsam_unstable/dynamics \ -# ../gtsam_unstable +INPUT = @PROJECT_SOURCE_DIR@/gtsam/base \ + @PROJECT_SOURCE_DIR@/gtsam/geometry \ + @PROJECT_SOURCE_DIR@/gtsam/inference \ + @PROJECT_SOURCE_DIR@/gtsam/discrete \ + @PROJECT_SOURCE_DIR@/gtsam/linear \ + @PROJECT_SOURCE_DIR@/gtsam/nonlinear \ + @PROJECT_SOURCE_DIR@/gtsam +# @PROJECT_SOURCE_DIR@/gtsam/slam \ +# @PROJECT_SOURCE_DIR@/gtsam_unstable/slam \ +# @PROJECT_SOURCE_DIR@/gtsam_unstable/base \ +# @PROJECT_SOURCE_DIR@/gtsam_unstable/geometry \ +# @PROJECT_SOURCE_DIR@/gtsam_unstable/dynamics \ +# @PROJECT_SOURCE_DIR@/gtsam_unstable # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is From 08ea3efb06dbd703088a81e232d2d59e1bbe3ca2 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 14 Jul 2012 21:39:59 +0000 Subject: [PATCH 623/914] Improved configurability of doxygen output - can choose output via cmake varialbles --- CMakeLists.txt | 41 +++++++++++++++++++++++++++++++++-------- doc/Doxyfile.in | 4 ++-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f87dff186..d11fc8e73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,12 +36,13 @@ else() set(GTSAM_UNSTABLE_AVAILABLE 0) endif() +# Check for doxygen availability +find_package(Doxygen) # Configurable Options option(GTSAM_BUILD_TESTS "Enable/Disable building of tests" ON) option(GTSAM_BUILD_TIMING "Enable/Disable building of timing scripts" ON) option(GTSAM_BUILD_EXAMPLES "Enable/Disable building of examples" ON) -option(GTSAM_BUILD_DOCS "Enable/Disable building of doxygen docs" OFF) if(GTSAM_UNSTABLE_AVAILABLE) option(GTSAM_BUILD_UNSTABLE "Enable/Disable libgtsam_unstable" ON) endif() @@ -155,18 +156,40 @@ endif(GTSAM_BUILD_UNSTABLE) GtsamMakeConfigFile(GTSAM) export(TARGETS ${GTSAM_EXPORTED_TARGETS} FILE GTSAM-exports.cmake) -# add a target to generate API documentation with Doxygen -if (GTSAM_BUILD_DOCS) - find_package(Doxygen) - if(DOXYGEN_FOUND) +# Doxygen documentation configuration +if (DOXYGEN_FOUND) + option(GTSAM_BUILD_DOCS "Enable/Disable building of doxygen docs" OFF) + + # configure doxygen + option(GTSAM_BUILD_DOC_HTML "Enable/Disable doxygen HTML output" ON) + option(GTSAM_BUILD_DOC_LATEX "Enable/Disable doxygen LaTeX output" OFF) + + # add a target to generate API documentation with Doxygen + if (GTSAM_BUILD_DOCS) + # Convert configuration to YES/NO variables + if (GTSAM_BUILD_DOC_HTML) + set(GTSAM_BUILD_DOC_HTML_YN "YES") + else() + set(GTSAM_BUILD_DOC_HTML_YN "NO") + endif() + + if (GTSAM_BUILD_DOC_LATEX) + set(GTSAM_BUILD_DOC_LATEX_YN "YES") + else() + set(GTSAM_BUILD_DOC_LATEX_YN "NO") + endif() + + # Generate Doxyfile configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) + + # Add target to actually build documentation as configured add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc COMMENT "Generating API documentation with Doxygen" VERBATIM ) - endif(DOXYGEN_FOUND) -endif (GTSAM_BUILD_DOCS) + endif() +endif () # Set up CPack set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM") @@ -191,7 +214,9 @@ message(STATUS "Build flags ") print_config_flag(${GTSAM_BUILD_TIMING} "Build Timing scripts ") print_config_flag(${GTSAM_BUILD_EXAMPLES} "Build Examples ") print_config_flag(${GTSAM_BUILD_TESTS} "Build Tests ") -print_config_flag(${GTSAM_BUILD_DOCS} "Build Docs ") +if (DOXYGEN_FOUND) + print_config_flag(${GTSAM_BUILD_DOCS} "Build Docs ") +endif() if(NOT MSVC) print_config_flag(${GTSAM_BUILD_SHARED_LIBRARY} "Build shared GTSAM Library ") print_config_flag(${GTSAM_BUILD_STATIC_LIBRARY} "Build static GTSAM Library ") diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index 1c767e584..b6030a567 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -880,7 +880,7 @@ IGNORE_PREFIX = # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. -GENERATE_HTML = YES +GENERATE_HTML = @GTSAM_BUILD_DOC_HTML_YN@ # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be @@ -1234,7 +1234,7 @@ SERVER_BASED_SEARCH = NO # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. -GENERATE_LATEX = NO +GENERATE_LATEX = @GTSAM_BUILD_DOC_LATEX_YN@ # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be From 8580d3dec503b99a9b604772221f694977eae43d Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 15 Jul 2012 19:57:31 +0000 Subject: [PATCH 624/914] Added clean_doc target to remove generated doxygen documentation --- .cproject | 8 ++++++++ CMakeLists.txt | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/.cproject b/.cproject index c18c63f56..91d9c7689 100644 --- a/.cproject +++ b/.cproject @@ -2216,6 +2216,14 @@ true true + + make + -j5 + doc_clean + true + true + true + make -j2 diff --git a/CMakeLists.txt b/CMakeLists.txt index d11fc8e73..2a1e9cacb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,6 +188,15 @@ if (DOXYGEN_FOUND) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc COMMENT "Generating API documentation with Doxygen" VERBATIM ) + + # Clean target + add_custom_target(doc_clean + COMMAND + cmake -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/doc/latex + COMMAND + cmake -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/doc/html + COMMENT "Removing Doxygen documentation" + ) endif() endif () From ebcdf0f19f43f39d15506cc4f16c7265a4e84302 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 16 Jul 2012 14:56:10 +0000 Subject: [PATCH 625/914] Removed unnecessary makedoc.sh script - documentation can now be built using "make doc" --- makedoc.sh | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100755 makedoc.sh diff --git a/makedoc.sh b/makedoc.sh deleted file mode 100755 index 8de348fa5..000000000 --- a/makedoc.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -# Add to PATH the default install path for doxygen on Mac OS X - -PATH=$PATH:/Applications/Doxygen.app/Contents/Resources - - -# Run doxygen from the gtsam directory even if this script is run from another -# directory, so that the output 'doc' goes in the gtsam directory. - -GTSAM_DIR=$(dirname "$0") -cd $GTSAM_DIR/doc -doxygen \ No newline at end of file From 4113a09b3ad81acec3dbafef8f1239756301556a Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 16 Jul 2012 14:56:11 +0000 Subject: [PATCH 626/914] Enabled building doxygen docs by default (only when running make doc and when doxygen present, however) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a1e9cacb..2a89fb70f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -158,7 +158,7 @@ export(TARGETS ${GTSAM_EXPORTED_TARGETS} FILE GTSAM-exports.cmake) # Doxygen documentation configuration if (DOXYGEN_FOUND) - option(GTSAM_BUILD_DOCS "Enable/Disable building of doxygen docs" OFF) + option(GTSAM_BUILD_DOCS "Enable/Disable building of doxygen docs" ON) # configure doxygen option(GTSAM_BUILD_DOC_HTML "Enable/Disable doxygen HTML output" ON) From abc29ea2ca2c9f407bd1bc4d36c323775fbe6abc Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Mon, 16 Jul 2012 15:24:27 +0000 Subject: [PATCH 627/914] capitalize static functions Level and Lookat in CalibratedCamera and PinholeCamera for matlab wrapper --- examples/VisualSLAMData.h | 2 +- gtsam.h | 8 ++++---- gtsam/geometry/CalibratedCamera.cpp | 2 +- gtsam/geometry/CalibratedCamera.h | 2 +- gtsam/geometry/PinholeCamera.h | 8 ++++---- gtsam/geometry/tests/testCalibratedCamera.cpp | 4 ++-- gtsam/geometry/tests/testSimpleCamera.cpp | 6 +++--- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/VisualSLAMData.h b/examples/VisualSLAMData.h index 5416b3d43..28fa3040c 100644 --- a/examples/VisualSLAMData.h +++ b/examples/VisualSLAMData.h @@ -67,7 +67,7 @@ struct VisualSLAMExampleData { double r = 30.0; for (int i=0; i Date: Tue, 17 Jul 2012 15:51:32 +0000 Subject: [PATCH 628/914] Wrapped LieMatrix --- gtsam.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/gtsam.h b/gtsam.h index ea71e4228..0068b0c3f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -126,6 +126,34 @@ virtual class LieVector : gtsam::Value { static Vector Logmap(const gtsam::LieVector& p); }; +virtual class LieMatrix : gtsam::Value { + // Standard constructors + LieMatrix(); + LieMatrix(Matrix v); + + // Standard interface + Vector matrix() const; + + // Testable + void print(string s) const; + bool equals(const gtsam::LieMatrix& expected, double tol) const; + + // Group + static gtsam::LieMatrix identity(); + gtsam::LieMatrix inverse() const; + gtsam::LieMatrix compose(const gtsam::LieMatrix& p) const; + gtsam::LieMatrix between(const gtsam::LieMatrix& l2) const; + + // Manifold + size_t dim() const; + gtsam::LieMatrix retract(Vector v) const; + Vector localCoordinates(const gtsam::LieMatrix & t2) const; + + // Lie group + static gtsam::LieMatrix Expmap(Vector v); + static Vector Logmap(const gtsam::LieMatrix& p); +}; + //************************************************************************* // geometry //************************************************************************* From e9f710a1ac198452d2b0a70bea5b27b970d8196a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 17 Jul 2012 15:51:35 +0000 Subject: [PATCH 629/914] More flexible handling of includes in wrap - can now use multiple includes both at the namespace and class levels, and namespace includes do not override the default class-name includes of their enclosed classes. --- gtsam.h | 25 +++++++++++++++++++------ gtsam_unstable/gtsam_unstable.h | 3 ++- wrap/Module.cpp | 20 ++++++++++++-------- wrap/Module.h | 1 + 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/gtsam.h b/gtsam.h index 0068b0c3f..05a41afc3 100644 --- a/gtsam.h +++ b/gtsam.h @@ -771,11 +771,12 @@ class VariableIndex { // linear //************************************************************************* -#include namespace noiseModel { +#include virtual class Base { }; +#include virtual class Gaussian : gtsam::noiseModel::Base { static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); static gtsam::noiseModel::Gaussian* Covariance(Matrix R); @@ -783,6 +784,7 @@ virtual class Gaussian : gtsam::noiseModel::Base { void print(string s) const; }; +#include virtual class Diagonal : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas); static gtsam::noiseModel::Diagonal* Variances(Vector variances); @@ -791,6 +793,7 @@ virtual class Diagonal : gtsam::noiseModel::Gaussian { void print(string s) const; }; +#include virtual class Isotropic : gtsam::noiseModel::Diagonal { static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); @@ -798,6 +801,7 @@ virtual class Isotropic : gtsam::noiseModel::Diagonal { void print(string s) const; }; +#include virtual class Unit : gtsam::noiseModel::Isotropic { static gtsam::noiseModel::Unit* Create(size_t dim); void print(string s) const; @@ -1216,9 +1220,9 @@ typedef gtsam::GenericProjectionFactor namespace pose2SLAM { +#include class Values { Values(); Values(const pose2SLAM::Values& values); @@ -1234,6 +1238,7 @@ class Values { Matrix poses() const; }; +#include class Graph { Graph(); Graph(const gtsam::NonlinearFactorGraph& graph); @@ -1270,9 +1275,9 @@ class Graph { // Pose3SLAM //************************************************************************* -#include namespace pose3SLAM { +#include class Values { Values(); Values(const pose3SLAM::Values& values); @@ -1288,6 +1293,7 @@ class Values { Matrix translations() const; }; +#include class Graph { Graph(); Graph(const gtsam::NonlinearFactorGraph& graph); @@ -1324,9 +1330,9 @@ class Graph { // planarSLAM //************************************************************************* -#include namespace planarSLAM { +#include class Values { Values(); Values(const planarSLAM::Values& values); @@ -1358,6 +1364,7 @@ class Values { Matrix points() const; }; +#include class Graph { Graph(); Graph(const gtsam::NonlinearFactorGraph& graph); @@ -1396,6 +1403,7 @@ class Graph { void addBearingRange(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing,double range, const gtsam::noiseModel::Base* noiseModel); }; +#include class Odometry { Odometry(size_t key1, size_t key2, const gtsam::Pose2& measured, const gtsam::noiseModel::Base* model); @@ -1410,9 +1418,9 @@ class Odometry { // VisualSLAM //************************************************************************* -#include namespace visualSLAM { +#include class Values { Values(); Values(const visualSLAM::Values& values); @@ -1446,6 +1454,7 @@ class Values { Matrix points() const; }; +#include class Graph { Graph(); Graph(const gtsam::NonlinearFactorGraph& graph); @@ -1494,6 +1503,7 @@ class Graph { }; +#include class ISAM { ISAM(); ISAM(int reorderInterval); @@ -1516,6 +1526,7 @@ class ISAM { gtsam::NonlinearFactorGraph getFactorsUnsafe() const; }; +#include class LevenbergMarquardtOptimizer { double lambda() const; void iterate(); @@ -1532,9 +1543,9 @@ class LevenbergMarquardtOptimizer { // sparse BA //************************************************************************ -#include namespace sparseBA { +#include class Values { Values(); Values(const sparseBA::Values& values); @@ -1561,6 +1572,7 @@ class Values { Matrix points() const; }; +#include class Graph { Graph(); Graph(const gtsam::NonlinearFactorGraph& graph); @@ -1596,6 +1608,7 @@ class Graph { void addSimpleCameraMeasurement(const gtsam::Point2 &z, gtsam::noiseModel::Base* model, size_t cameraKey, size_t pointKey); }; +#include class LevenbergMarquardtOptimizer { double lambda() const; void iterate(); diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index 3d9fd7aac..eebb53fbf 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -171,9 +171,9 @@ virtual class DGroundConstraint : gtsam::NonlinearFactor { }///\namespace gtsam -#include namespace imu { +#include class Values { Values(); void print(string s) const; @@ -182,6 +182,7 @@ class Values { gtsam::PoseRTV pose(size_t key) const; }; +#include class Graph { Graph(); void print(string s) const; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 32acb2853..e35794440 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -84,7 +84,6 @@ Module::Module(const string& interfacePath, Class cls0(enable_verbose),cls(enable_verbose); ForwardDeclaration fwDec0, fwDec; vector namespaces, /// current namespace tag - namespace_includes, /// current set of includes namespaces_return, /// namespace for current return type using_namespace_current; /// All namespaces from "using" declarations string templateArgument; @@ -256,10 +255,11 @@ Module::Module(const string& interfacePath, Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[assign_a(include_path)] >> ch_p('>'); Rule class_p = - (!*include_p + (str_p("")[assign_a(cls,cls0)]) + >> (*(include_p[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)]) >> !(templateInstantiations_p | templateList_p) >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) - >> str_p("class")[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)] + >> str_p("class") >> className_p[assign_a(cls.name)] >> ((':' >> classParent_p >> '{') | '{') >> *(functions_p | comments_p) @@ -268,7 +268,6 @@ Module::Module(const string& interfacePath, [assign_a(cls.constructor, constructor)] [assign_a(cls.namespaces, namespaces)] [assign_a(cls.using_namespaces, using_namespace_current)] - [append_a(cls.includes, namespace_includes)] [assign_a(deconstructor.name,cls.name)] [assign_a(cls.deconstructor, deconstructor)] [bl::bind(&handle_possible_template, bl::var(classes), bl::var(cls), bl::var(templateArgument), bl::var(templateInstantiations))] @@ -279,15 +278,14 @@ Module::Module(const string& interfacePath, [clear_a(templateInstantiations)]; Rule namespace_def_p = - (!*include_p - >> str_p("namespace")[push_back_a(namespace_includes, include_path)][assign_a(include_path, null_str)] + (*(include_p[push_back_a(includes, include_path)][assign_a(include_path, null_str)]) + >> str_p("namespace") >> namespace_name_p[push_back_a(namespaces)] >> ch_p('{') >> *(class_p | templateSingleInstantiation_p | namespace_def_p | comments_p) >> str_p("}///\\namespace") // end namespace, avoid confusion with classes >> !namespace_name_p) - [pop_a(namespaces)] - [pop_a(namespace_includes)]; + [pop_a(namespaces)]; Rule using_namespace_p = str_p("using") >> str_p("namespace") @@ -390,6 +388,12 @@ void Module::generateIncludes(FileWriter& file) const { all_includes.push_back(cls.name + ".h"); } + // Add namespace includes + BOOST_FOREACH(const string& s, includes) { + if(!s.empty()) + all_includes.push_back(s); + } + // sort and remove duplicates sort(all_includes.begin(), all_includes.end()); vector::const_iterator last_include = unique(all_includes.begin(), all_includes.end()); diff --git a/wrap/Module.h b/wrap/Module.h index 403f2f32d..c23b4e457 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -39,6 +39,7 @@ struct Module { bool verbose; ///< verbose flag // std::vector using_namespaces; ///< all default namespaces std::vector forward_declarations; + std::vector includes; ///< header include overrides /// constructor that parses interface file Module(const std::string& interfacePath, From 10c5ebae73cb5c84185167b4f31160e87f3bfbbf Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 17 Jul 2012 17:38:29 +0000 Subject: [PATCH 630/914] Always write and read wrap files in binary mode to prevent writing CRLF line endings on windows (messes up expected unit test files) --- wrap/FileWriter.cpp | 2 +- wrap/utilities.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wrap/FileWriter.cpp b/wrap/FileWriter.cpp index 38abf2488..03339a7f0 100644 --- a/wrap/FileWriter.cpp +++ b/wrap/FileWriter.cpp @@ -35,7 +35,7 @@ void FileWriter::emit(bool add_header, bool force_overwrite) const { // Only write a file if it is new, an update, or overwrite is forced string new_contents = oss.str(); if (force_overwrite || !file_exists || existing_contents != new_contents) { - ofstream ofs(filename_.c_str()); + ofstream ofs(filename_.c_str(), ios::binary); // Binary to use LF line endings instead of CRLF if (!ofs) throw CantOpenFile(filename_); // header diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 9c5d93c76..6eb47c55d 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -29,7 +29,7 @@ using namespace std; /* ************************************************************************* */ string file_contents(const string& filename, bool skipheader) { - ifstream ifs(filename.c_str()); + ifstream ifs(filename.c_str(), ios::binary); // Do not do LF/CRLF translation - we always write in binary mode too if(!ifs) throw CantOpenFile(filename); // read file into stringstream From 4bcc974cae9153ca4e777b1931840acc2235016e Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 17 Jul 2012 17:38:31 +0000 Subject: [PATCH 631/914] Updated unit tests after changing namespace handling --- .../testNamespaces_wrapper.cpp | 3 +++ wrap/tests/testWrap.cpp | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index bdb0632d0..fe55075af 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -3,6 +3,9 @@ #include #include +#include +#include +#include #include #include #include diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index b8e9effc1..41af0af7d 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -155,12 +155,19 @@ TEST( wrap, parse_namespaces ) { Module module(header_path.c_str(), "testNamespaces",enable_verbose); EXPECT_LONGS_EQUAL(6, module.classes.size()); + { + strvec module_exp_includes; + module_exp_includes += "path/to/ns1.h"; + module_exp_includes += "path/to/ns2.h"; + module_exp_includes += "path/to/ns3.h"; + } + { Class cls = module.classes.at(0); EXPECT(assert_equal("ClassA", cls.name)); strvec exp_namespaces; exp_namespaces += "ns1"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += "path/to/ns1.h", ""; + strvec exp_includes; exp_includes; EXPECT(assert_equal(exp_includes, cls.includes)); } @@ -169,7 +176,7 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassB", cls.name)); strvec exp_namespaces; exp_namespaces += "ns1"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += "path/to/ns1.h", "path/to/ns1/ClassB.h"; + strvec exp_includes; exp_includes += "path/to/ns1/ClassB.h"; EXPECT(assert_equal(exp_includes, cls.includes)); } @@ -178,7 +185,7 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassA", cls.name)); strvec exp_namespaces; exp_namespaces += "ns2"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += "path/to/ns2.h", "path/to/ns2/ClassA.h"; + strvec exp_includes; exp_includes += "path/to/ns2/ClassA.h"; EXPECT(assert_equal(exp_includes, cls.includes)); } @@ -187,7 +194,7 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassB", cls.name)); strvec exp_namespaces; exp_namespaces += "ns2", "ns3"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += "path/to/ns2.h", "path/to/ns3.h", ""; + strvec exp_includes; EXPECT(assert_equal(exp_includes, cls.includes)); } @@ -196,7 +203,7 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassC", cls.name)); strvec exp_namespaces; exp_namespaces += "ns2"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += "path/to/ns2.h", ""; + strvec exp_includes; EXPECT(assert_equal(exp_includes, cls.includes)); } @@ -205,7 +212,7 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassD", cls.name)); strvec exp_namespaces; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += ""; + strvec exp_includes; EXPECT(assert_equal(exp_includes, cls.includes)); } } From 4b772b43cf27af0ffc11836506bd4189cfa4fc79 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 17 Jul 2012 18:30:02 +0000 Subject: [PATCH 632/914] Simplified include handling in wrap: no more default includes, includes are not associated with a class or a namespace. --- gtsam.h | 26 ++++++++------- gtsam/CMakeLists.txt | 3 +- gtsam_unstable/CMakeLists.txt | 2 +- gtsam_unstable/gtsam_unstable.h | 6 +--- wrap/Class.cpp | 6 ---- wrap/Class.h | 3 +- wrap/Module.cpp | 33 ++++--------------- wrap/Module.h | 2 +- wrap/tests/expected/geometry_wrapper.cpp | 2 -- .../testNamespaces_wrapper.cpp | 4 --- wrap/tests/geometry.h | 2 ++ wrap/tests/testWrap.cpp | 25 +++++--------- 12 files changed, 37 insertions(+), 77 deletions(-) diff --git a/gtsam.h b/gtsam.h index 05a41afc3..f32b12131 100644 --- a/gtsam.h +++ b/gtsam.h @@ -46,11 +46,9 @@ * - To use a namespace (e.g., generate a "using namespace x" line in cpp files), add "using namespace x;" * - This declaration applies to all classes *after* the declaration, regardless of brackets * Includes in C++ wrappers - * - By default, the include will be <[classname].h> - * - All namespaces must have angle brackets: - * - To override, add a full include statement just before the class statement - * - An override include can be added for a namespace by placing it just before the namespace statement - * - Both classes and namespace accept exactly one namespace + * - All includes will be collected and added in a single file + * - All namespaces must have angle brackets: + * - No default includes will be added * Using classes defined in other modules * - If you are using a class 'OtherClass' not wrapped in this definition file, add "class OtherClass;" to avoid a dependency error * Virtual inheritance @@ -98,6 +96,7 @@ virtual class Value { size_t dim() const; }; +#include virtual class LieVector : gtsam::Value { // Standard constructors LieVector(); @@ -126,6 +125,7 @@ virtual class LieVector : gtsam::Value { static Vector Logmap(const gtsam::LieVector& p); }; +#include virtual class LieMatrix : gtsam::Value { // Standard constructors LieMatrix(); @@ -472,6 +472,7 @@ virtual class Cal3_S2 : gtsam::Value { Matrix matrix_inverse() const; }; +#include virtual class Cal3DS2 : gtsam::Value { // Standard Constructors Cal3DS2(); @@ -715,6 +716,7 @@ class SymbolicFactorGraph { //FastSet keys() const; }; +#include class SymbolicSequentialSolver { // Standard Constructors and Named Constructors SymbolicSequentialSolver(const gtsam::SymbolicFactorGraph& factorGraph); @@ -728,6 +730,7 @@ class SymbolicSequentialSolver { gtsam::SymbolicBayesNet* eliminate() const; }; +#include class SymbolicMultifrontalSolver { // Standard Constructors and Named Constructors SymbolicMultifrontalSolver(const gtsam::SymbolicFactorGraph& factorGraph); @@ -776,7 +779,6 @@ namespace noiseModel { virtual class Base { }; -#include virtual class Gaussian : gtsam::noiseModel::Base { static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); static gtsam::noiseModel::Gaussian* Covariance(Matrix R); @@ -784,7 +786,6 @@ virtual class Gaussian : gtsam::noiseModel::Base { void print(string s) const; }; -#include virtual class Diagonal : gtsam::noiseModel::Gaussian { static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas); static gtsam::noiseModel::Diagonal* Variances(Vector variances); @@ -793,7 +794,6 @@ virtual class Diagonal : gtsam::noiseModel::Gaussian { void print(string s) const; }; -#include virtual class Isotropic : gtsam::noiseModel::Diagonal { static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); @@ -801,14 +801,13 @@ virtual class Isotropic : gtsam::noiseModel::Diagonal { void print(string s) const; }; -#include virtual class Unit : gtsam::noiseModel::Isotropic { static gtsam::noiseModel::Unit* Create(size_t dim); void print(string s) const; }; }///\namespace noiseModel - +#include class Sampler { Sampler(gtsam::noiseModel::Diagonal* model, int seed); Sampler(Vector sigmas, int seed); @@ -948,6 +947,7 @@ class GaussianISAM { gtsam::GaussianBayesNet* jointBayesNet(size_t key1, size_t key2) const; }; +#include class GaussianSequentialSolver { GaussianSequentialSolver(const gtsam::GaussianFactorGraph& graph, bool useQR); @@ -957,6 +957,7 @@ class GaussianSequentialSolver { Matrix marginalCovariance(size_t j) const; }; +#include class KalmanFilter { KalmanFilter(size_t n); // gtsam::GaussianDensity* init(Vector x0, const gtsam::SharedDiagonal& P0); @@ -979,6 +980,7 @@ class KalmanFilter { // nonlinear //************************************************************************* +#include class Symbol { Symbol(char c, size_t j); Symbol(size_t k); @@ -988,6 +990,7 @@ class Symbol { char chr() const; }; +#include class Ordering { // Standard Constructors and Named Constructors Ordering(); @@ -1007,7 +1010,6 @@ class Ordering { gtsam::InvertedOrdering invert() const; }; -#include class InvertedOrdering { InvertedOrdering(); @@ -1203,7 +1205,7 @@ virtual class BearingFactor : gtsam::NonlinearFactor { typedef gtsam::BearingFactor BearingFactor2D; -#include +#include template virtual class GenericProjectionFactor : gtsam::NonlinearFactor { GenericProjectionFactor(const gtsam::Point2& measured, const gtsam::noiseModel::Base* noiseModel, diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 66870a09c..39ae67507 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -119,14 +119,13 @@ if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Set up codegen include(GtsamMatlabWrap) - # TODO: generate these includes programmatically # Choose include flags depending on build process set(MEX_INCLUDE_ROOT ${GTSAM_SOURCE_ROOT_DIR}) set(MEX_LIB_ROOT ${CMAKE_BINARY_DIR}) set(GTSAM_LIB_DIR ${MEX_LIB_ROOT}/gtsam) # Generate, build and install toolbox - set(mexFlags ${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam -I${MEX_INCLUDE_ROOT}/gtsam/base -I${MEX_INCLUDE_ROOT}/gtsam/geometry -I${MEX_INCLUDE_ROOT}/gtsam/linear -I${MEX_INCLUDE_ROOT}/gtsam/discrete -I${MEX_INCLUDE_ROOT}/gtsam/inference -I${MEX_INCLUDE_ROOT}/gtsam/nonlinear -I${MEX_INCLUDE_ROOT}/gtsam/slam) + set(mexFlags ${GTSAM_BUILD_MEX_BINARY_FLAGS} -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT}) # Macro to handle details of setting up targets # FIXME: issue with dependency between wrap_gtsam and wrap_gtsam_build, only shows up on CMake 2.8.3 diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 09fb124a9..64311cdca 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -89,7 +89,7 @@ if (GTSAM_INSTALL_MATLAB_TOOLBOX) set(GTSAM_UNSTABLE_LIB_DIR ${MEX_LIB_ROOT}/gtsam_unstable) # Generate, build and install toolbox - set(mexFlags -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT} -I${MEX_INCLUDE_ROOT}/gtsam_unstable -I${MEX_INCLUDE_ROOT}/gtsam_unstable/dynamics -I${MEX_INCLUDE_ROOT}/gtsam_unstable/discrete) + set(mexFlags -I${Boost_INCLUDE_DIR} -I${MEX_INCLUDE_ROOT}) # Macro to handle details of setting up targets wrap_library(gtsam_unstable "${mexFlags}" "./" gtsam) diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index eebb53fbf..c77c71e22 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -139,13 +139,12 @@ virtual class FullIMUFactor : gtsam::NonlinearFactor { }; -#include +#include virtual class DHeightPrior : gtsam::NonlinearFactor { DHeightPrior(size_t key, double height, const gtsam::noiseModel::Base* model); }; -#include virtual class DRollPrior : gtsam::NonlinearFactor { /** allows for explicit roll parameterization - uses canonical coordinate */ DRollPrior(size_t key, double wx, const gtsam::noiseModel::Base* model); @@ -154,13 +153,11 @@ virtual class DRollPrior : gtsam::NonlinearFactor { }; -#include virtual class VelocityPrior : gtsam::NonlinearFactor { VelocityPrior(size_t key, Vector vel, const gtsam::noiseModel::Base* model); }; -#include virtual class DGroundConstraint : gtsam::NonlinearFactor { // Primary constructor allows for variable height of the "floor" DGroundConstraint(size_t key, double height, const gtsam::noiseModel::Base* model); @@ -182,7 +179,6 @@ class Values { gtsam::PoseRTV pose(size_t key) const; }; -#include class Graph { Graph(); void print(string s) const; diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 2cb36386a..5f7d7aa6e 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -268,12 +268,6 @@ Class expandClassTemplate(const Class& cls, const string& templateArg, const vec inst.static_methods = expandMethodTemplate(cls.static_methods, templateArg, instName); inst.namespaces = cls.namespaces; inst.using_namespaces = cls.using_namespaces; - bool allIncludesEmpty = true; - BOOST_FOREACH(const string& inc, cls.includes) { if(!inc.empty()) { allIncludesEmpty = false; break; } } - if(allIncludesEmpty) - inst.includes.push_back(cls.name + ".h"); - else - inst.includes = cls.includes; inst.constructor = cls.constructor; inst.constructor.args_list = expandArgumentListsTemplate(cls.constructor.args_list, templateArg, instName); inst.constructor.name = inst.name; diff --git a/wrap/Class.h b/wrap/Class.h index beee2c29f..9a6ca12c7 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -40,7 +40,7 @@ struct Class { // Then the instance variables are set directly by the Module constructor std::string name; ///< Class name - std::vector templateArgs; ///< Template arguments + std::vector templateArgs; ///< Template arguments std::string typedefName; ///< The name to typedef *from*, if this class is actually a typedef, i.e. typedef [typedefName] [name] bool isVirtual; ///< Whether the class is part of a virtual inheritance chain std::vector qualifiedParent; ///< The *single* parent - the last string is the parent class name, preceededing elements are a namespace stack @@ -48,7 +48,6 @@ struct Class { StaticMethods static_methods; ///< Static methods std::vector namespaces; ///< Stack of namespaces std::vector using_namespaces;///< default namespaces - std::vector includes; ///< header include overrides Constructor constructor; ///< Class constructors Deconstructor deconstructor; ///< Deconstructor to deallocate C++ object bool verbose_; ///< verbose flag diff --git a/wrap/Module.cpp b/wrap/Module.cpp index e35794440..5776edc0e 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -252,12 +252,9 @@ Module::Module(const string& interfacePath, Rule functions_p = constructor_p | method_p | static_method_p; - Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[assign_a(include_path)] >> ch_p('>'); - Rule class_p = (str_p("")[assign_a(cls,cls0)]) - >> (*(include_p[push_back_a(cls.includes, include_path)][assign_a(include_path, null_str)]) - >> !(templateInstantiations_p | templateList_p) + >> (!(templateInstantiations_p | templateList_p) >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) >> str_p("class") >> className_p[assign_a(cls.name)] @@ -277,12 +274,13 @@ Module::Module(const string& interfacePath, [clear_a(templateArgument)] [clear_a(templateInstantiations)]; + Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[push_back_a(includes)] >> ch_p('>'); + Rule namespace_def_p = - (*(include_p[push_back_a(includes, include_path)][assign_a(include_path, null_str)]) - >> str_p("namespace") + (str_p("namespace") >> namespace_name_p[push_back_a(namespaces)] >> ch_p('{') - >> *(class_p | templateSingleInstantiation_p | namespace_def_p | comments_p) + >> *(include_p | class_p | templateSingleInstantiation_p | namespace_def_p | comments_p) >> str_p("}///\\namespace") // end namespace, avoid confusion with classes >> !namespace_name_p) [pop_a(namespaces)]; @@ -299,7 +297,7 @@ Module::Module(const string& interfacePath, [push_back_a(forward_declarations, fwDec)] [assign_a(fwDec, fwDec0)]; - Rule module_content_p = comments_p | using_namespace_p | class_p | templateSingleInstantiation_p | forward_declaration_p | namespace_def_p ; + Rule module_content_p = comments_p | using_namespace_p | include_p | class_p | templateSingleInstantiation_p | forward_declaration_p | namespace_def_p ; Rule module_p = *module_content_p >> !end_p; @@ -375,24 +373,7 @@ void verifyReturnTypes(const vector& validtypes, const map& vt void Module::generateIncludes(FileWriter& file) const { // collect includes - vector all_includes; - BOOST_FOREACH(const Class& cls, classes) { - bool added_include = false; - BOOST_FOREACH(const string& s, cls.includes) { - if (!s.empty()) { - all_includes.push_back(s); - added_include = true; - } - } - if (!added_include) // add default include - all_includes.push_back(cls.name + ".h"); - } - - // Add namespace includes - BOOST_FOREACH(const string& s, includes) { - if(!s.empty()) - all_includes.push_back(s); - } + vector all_includes(includes); // sort and remove duplicates sort(all_includes.begin(), all_includes.end()); diff --git a/wrap/Module.h b/wrap/Module.h index c23b4e457..ce1a87969 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -39,7 +39,7 @@ struct Module { bool verbose; ///< verbose flag // std::vector using_namespaces; ///< all default namespaces std::vector forward_declarations; - std::vector includes; ///< header include overrides + std::vector includes; ///< Include statements /// constructor that parses interface file Module(const std::string& interfacePath, diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index ade907701..99f261f4f 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -3,8 +3,6 @@ #include #include -#include -#include #include diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index fe55075af..679416db5 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -3,10 +3,6 @@ #include #include -#include -#include -#include -#include #include #include #include diff --git a/wrap/tests/geometry.h b/wrap/tests/geometry.h index a287c44e6..5dfe07b8d 100644 --- a/wrap/tests/geometry.h +++ b/wrap/tests/geometry.h @@ -35,7 +35,9 @@ class Point3 { * A multi-line comment! */ +// An include! Can go anywhere outside of a class, in any order #include + class Test { /* a comment! */ diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 41af0af7d..4aa5b6f58 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -71,7 +71,7 @@ TEST_UNSAFE( wrap, check_exception ) { } /* ************************************************************************* */ -TEST( wrap, parse ) { +TEST( wrap, parse_geometry ) { string markup_header_path = topdir + "/wrap/tests"; Module module(markup_header_path.c_str(), "geometry",enable_verbose); EXPECT_LONGS_EQUAL(3, module.classes.size()); @@ -84,6 +84,10 @@ TEST( wrap, parse ) { EXPECT(assert_equal("VectorNotEigen", module.forward_declarations[0].name)); EXPECT(assert_equal("ns::OtherClass", module.forward_declarations[1].name)); + // includes + strvec exp_includes; exp_includes += "folder/path/to/Test.h"; + EXPECT(assert_equal(exp_includes, module.includes)); + // check first class, Point2 { Class cls = module.classes.at(0); @@ -136,8 +140,6 @@ TEST( wrap, parse ) { EXPECT_LONGS_EQUAL( 0, testCls.static_methods.size()); EXPECT_LONGS_EQUAL( 0, testCls.namespaces.size()); EXPECT(assert_equal(exp_using2, testCls.using_namespaces)); - strvec exp_includes; exp_includes += "folder/path/to/Test.h"; - EXPECT(assert_equal(exp_includes, testCls.includes)); // function to parse: pair return_pair (Vector v, Matrix A) const; CHECK(testCls.methods.find("return_pair") != testCls.methods.end()); @@ -158,8 +160,11 @@ TEST( wrap, parse_namespaces ) { { strvec module_exp_includes; module_exp_includes += "path/to/ns1.h"; + module_exp_includes += "path/to/ns1/ClassB.h"; module_exp_includes += "path/to/ns2.h"; + module_exp_includes += "path/to/ns2/ClassA.h"; module_exp_includes += "path/to/ns3.h"; + EXPECT(assert_equal(module_exp_includes, module.includes)); } { @@ -167,8 +172,6 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassA", cls.name)); strvec exp_namespaces; exp_namespaces += "ns1"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes; - EXPECT(assert_equal(exp_includes, cls.includes)); } { @@ -176,8 +179,6 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassB", cls.name)); strvec exp_namespaces; exp_namespaces += "ns1"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += "path/to/ns1/ClassB.h"; - EXPECT(assert_equal(exp_includes, cls.includes)); } { @@ -185,8 +186,6 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassA", cls.name)); strvec exp_namespaces; exp_namespaces += "ns2"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; exp_includes += "path/to/ns2/ClassA.h"; - EXPECT(assert_equal(exp_includes, cls.includes)); } { @@ -194,8 +193,6 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassB", cls.name)); strvec exp_namespaces; exp_namespaces += "ns2", "ns3"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; - EXPECT(assert_equal(exp_includes, cls.includes)); } { @@ -203,8 +200,6 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassC", cls.name)); strvec exp_namespaces; exp_namespaces += "ns2"; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; - EXPECT(assert_equal(exp_includes, cls.includes)); } { @@ -212,8 +207,6 @@ TEST( wrap, parse_namespaces ) { EXPECT(assert_equal("ClassD", cls.name)); strvec exp_namespaces; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); - strvec exp_includes; - EXPECT(assert_equal(exp_includes, cls.includes)); } } @@ -243,7 +236,7 @@ TEST( wrap, matlab_code_namespaces ) { } /* ************************************************************************* */ -TEST( wrap, matlab_code ) { +TEST( wrap, matlab_code_geometry ) { // Parse into class object string header_path = topdir + "/wrap/tests"; Module module(header_path,"geometry",enable_verbose); From b5e10eadb8038676fef4a9632273eba435426fe7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 17 Jul 2012 19:49:36 +0000 Subject: [PATCH 633/914] Fixed bug where calling 'clear all' only once caused a problem where the wrap module recreated the RTTI table but MATLAB then deletes it, causing an error about the RTTI table being missing later on. --- wrap/Module.cpp | 77 ++++++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 5776edc0e..8ad476cd3 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -14,7 +14,7 @@ * @author Frank Dellaert * @author Alex Cunningham * @author Andrew Melim - * @author Richard Roberts + * @author Richard Roberts **/ #include "Module.h" @@ -463,12 +463,9 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co void Module::finish_wrapper(FileWriter& file, const std::vector& functionNames) const { file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; file.oss << "{\n"; - file.oss << " mstream mout;\n"; // Send stdout to MATLAB console, see matlab.h + file.oss << " mstream mout;\n"; // Send stdout to MATLAB console file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; - file.oss << " if(!_RTTIRegister_" << name << "_done) {\n"; - file.oss << " _" << name << "_RTTIRegister();\n"; - file.oss << " _RTTIRegister_" << name << "_done = true;\n"; - file.oss << " }\n"; + file.oss << " _" << name << "_RTTIRegister();\n\n"; file.oss << " int id = unwrap(in[0]);\n\n"; file.oss << " switch(id) {\n"; for(size_t id = 0; id < functionNames.size(); ++id) { @@ -478,7 +475,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co } file.oss << " }\n"; file.oss << "\n"; - file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout, see matlab.h + file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout file.oss << "}\n"; } @@ -538,50 +535,70 @@ void Module::WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::st } // generate mexAtExit cleanup function - wrapperFile.oss << "\nvoid _deleteAllObjects()\n"; - wrapperFile.oss << "{\n"; + wrapperFile.oss << + "\nvoid _deleteAllObjects()\n" + "{\n" + " mstream mout;\n" // Send stdout to MATLAB console + " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n" + " bool anyDeleted = false;\n"; BOOST_FOREACH(const Class& cls, classes) { const string matlabName = cls.qualifiedName(); const string cppName = cls.qualifiedName("::"); const string collectorType = "Collector_" + matlabName; const string collectorName = "collector_" + matlabName; - wrapperFile.oss << " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n"; - wrapperFile.oss << " iter != " << collectorName << ".end(); ) {\n"; - wrapperFile.oss << " delete *iter;\n"; - wrapperFile.oss << " " << collectorName << ".erase(iter++);\n"; - wrapperFile.oss << " }\n"; + wrapperFile.oss << + " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n" + " iter != " << collectorName << ".end(); ) {\n" + " delete *iter;\n" + " " << collectorName << ".erase(iter++);\n" + " anyDeleted = true;\n" + " }\n"; } - wrapperFile.oss << "}\n\n"; + wrapperFile.oss << + " if(anyDeleted)\n" + " cout <<\n" + " \"WARNING: Wrap modules with variables in the workspace have been reloaded due to\\n\"\n" + " \"calling destructors, call 'clear all' again if you plan to now recompile a wrap\\n\"\n" + " \"module, so that your recompiled module is used instead of the old one.\" << endl;\n" + " std::cout.rdbuf(outbuf);\n" // Restore cout + "}\n\n"; } /* ************************************************************************* */ void Module::WriteRTTIRegistry(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { wrapperFile.oss << - "static bool _RTTIRegister_" << moduleName << "_done = false;\n" "void _" << moduleName << "_RTTIRegister() {\n" - " std::map types;\n"; + " const mxArray *alreadyCreated = mexGetVariablePtr(\"global\", \"gtsam_" + moduleName + "_rttiRegistry_created\");\n" + " if(!alreadyCreated) {\n" + " std::map types;\n"; BOOST_FOREACH(const Class& cls, classes) { if(cls.isVirtual) wrapperFile.oss << - " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n"; + " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n"; } wrapperFile.oss << "\n"; wrapperFile.oss << - " mxArray *registry = mexGetVariable(\"global\", \"gtsamwrap_rttiRegistry\");\n" - " if(!registry)\n" - " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" - " typedef std::pair StringPair;\n" - " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" - " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" - " if(fieldId < 0)\n" + " mxArray *registry = mexGetVariable(\"global\", \"gtsamwrap_rttiRegistry\");\n" + " if(!registry)\n" + " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" + " typedef std::pair StringPair;\n" + " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" + " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" + " if(fieldId < 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n" + " mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n" + " }\n" + " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n" - " mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n" + " mxDestroyArray(registry);\n" + " \n" + " mxArray *newAlreadyCreated = mxCreateNumericMatrix(0, 0, mxINT8_CLASS, mxREAL);\n" + " if(mexPutVariable(\"global\", \"gtsam_" + moduleName + "_rttiRegistry_created\", newAlreadyCreated) != 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxDestroyArray(newAlreadyCreated);\n" " }\n" - " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" - " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " mxDestroyArray(registry);\n" "}\n" "\n"; } From 28eedb1940dd8a80c3d5d6bf2fdc38ae8fc888dc Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 17 Jul 2012 22:10:36 +0000 Subject: [PATCH 634/914] Bug fix in SimpleString (CppUnitLite) - typo caused allocating too-small buffer --- CppUnitLite/SimpleString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CppUnitLite/SimpleString.cpp b/CppUnitLite/SimpleString.cpp index 190010d87..3fa040f63 100644 --- a/CppUnitLite/SimpleString.cpp +++ b/CppUnitLite/SimpleString.cpp @@ -51,7 +51,7 @@ SimpleString SimpleString::operator+ (const SimpleString& other) { SimpleString ret; delete [] ret.buffer_; - ret.buffer_ = new char [size() + other.size() - 1]; + ret.buffer_ = new char [size() + other.size() + 1]; strcpy(ret.buffer_, buffer_); strcat(ret.buffer_, other.buffer_); return ret; From 90fd1228767178d314a4411179e1f346b2a353f9 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 17 Jul 2012 22:10:39 +0000 Subject: [PATCH 635/914] Updated wrap expected files from double clear all bug fix --- wrap/tests/expected/geometry_wrapper.cpp | 54 ++++++++++++------ .../testNamespaces_wrapper.cpp | 57 +++++++++++++------ 2 files changed, 75 insertions(+), 36 deletions(-) diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index 99f261f4f..a520803ee 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -15,41 +15,61 @@ static Collector_Test collector_Test; void _deleteAllObjects() { + mstream mout; + std::streambuf *outbuf = std::cout.rdbuf(&mout); + + bool anyDeleted = false; for(Collector_Point2::iterator iter = collector_Point2.begin(); iter != collector_Point2.end(); ) { delete *iter; collector_Point2.erase(iter++); + anyDeleted = true; } for(Collector_Point3::iterator iter = collector_Point3.begin(); iter != collector_Point3.end(); ) { delete *iter; collector_Point3.erase(iter++); + anyDeleted = true; } for(Collector_Test::iterator iter = collector_Test.begin(); iter != collector_Test.end(); ) { delete *iter; collector_Test.erase(iter++); + anyDeleted = true; } + if(anyDeleted) + cout << + "WARNING: Wrap modules with variables in the workspace have been reloaded due to\n" + "calling destructors, call 'clear all' again if you plan to now recompile a wrap\n" + "module, so that your recompiled module is used instead of the old one." << endl; + std::cout.rdbuf(outbuf); } -static bool _RTTIRegister_geometry_done = false; void _geometry_RTTIRegister() { - std::map types; + const mxArray *alreadyCreated = mexGetVariablePtr("global", "gtsam_geometry_rttiRegistry_created"); + if(!alreadyCreated) { + std::map types; - mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); - if(!registry) - registry = mxCreateStructMatrix(1, 1, 0, NULL); - typedef std::pair StringPair; - BOOST_FOREACH(const StringPair& rtti_matlab, types) { - int fieldId = mxAddField(registry, rtti_matlab.first.c_str()); - if(fieldId < 0) + mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); + if(!registry) + registry = mxCreateStructMatrix(1, 1, 0, NULL); + typedef std::pair StringPair; + BOOST_FOREACH(const StringPair& rtti_matlab, types) { + int fieldId = mxAddField(registry, rtti_matlab.first.c_str()); + if(fieldId < 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str()); + mxSetFieldByNumber(registry, 0, fieldId, matlabName); + } + if(mexPutVariable("global", "gtsamwrap_rttiRegistry", registry) != 0) mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); - mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str()); - mxSetFieldByNumber(registry, 0, fieldId, matlabName); + mxDestroyArray(registry); + + mxArray *newAlreadyCreated = mxCreateNumericMatrix(0, 0, mxINT8_CLASS, mxREAL); + if(mexPutVariable("global", "gtsam_geometry_rttiRegistry_created", newAlreadyCreated) != 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxDestroyArray(newAlreadyCreated); } - if(mexPutVariable("global", "gtsamwrap_rttiRegistry", registry) != 0) - mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); - mxDestroyArray(registry); } void Point2_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -481,10 +501,8 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) mstream mout; std::streambuf *outbuf = std::cout.rdbuf(&mout); - if(!_RTTIRegister_geometry_done) { - _geometry_RTTIRegister(); - _RTTIRegister_geometry_done = true; - } + _geometry_RTTIRegister(); + int id = unwrap(in[0]); switch(id) { diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 679416db5..6e65b1a0f 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -25,56 +25,79 @@ static Collector_ClassD collector_ClassD; void _deleteAllObjects() { + mstream mout; + std::streambuf *outbuf = std::cout.rdbuf(&mout); + + bool anyDeleted = false; for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); iter != collector_ns1ClassA.end(); ) { delete *iter; collector_ns1ClassA.erase(iter++); + anyDeleted = true; } for(Collector_ns1ClassB::iterator iter = collector_ns1ClassB.begin(); iter != collector_ns1ClassB.end(); ) { delete *iter; collector_ns1ClassB.erase(iter++); + anyDeleted = true; } for(Collector_ns2ClassA::iterator iter = collector_ns2ClassA.begin(); iter != collector_ns2ClassA.end(); ) { delete *iter; collector_ns2ClassA.erase(iter++); + anyDeleted = true; } for(Collector_ns2ns3ClassB::iterator iter = collector_ns2ns3ClassB.begin(); iter != collector_ns2ns3ClassB.end(); ) { delete *iter; collector_ns2ns3ClassB.erase(iter++); + anyDeleted = true; } for(Collector_ns2ClassC::iterator iter = collector_ns2ClassC.begin(); iter != collector_ns2ClassC.end(); ) { delete *iter; collector_ns2ClassC.erase(iter++); + anyDeleted = true; } for(Collector_ClassD::iterator iter = collector_ClassD.begin(); iter != collector_ClassD.end(); ) { delete *iter; collector_ClassD.erase(iter++); + anyDeleted = true; } + if(anyDeleted) + cout << + "WARNING: Wrap modules with variables in the workspace have been reloaded due to\n" + "calling destructors, call 'clear all' again if you plan to now recompile a wrap\n" + "module, so that your recompiled module is used instead of the old one." << endl; + std::cout.rdbuf(outbuf); } -static bool _RTTIRegister_testNamespaces_done = false; void _testNamespaces_RTTIRegister() { - std::map types; + const mxArray *alreadyCreated = mexGetVariablePtr("global", "gtsam_testNamespaces_rttiRegistry_created"); + if(!alreadyCreated) { + std::map types; - mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); - if(!registry) - registry = mxCreateStructMatrix(1, 1, 0, NULL); - typedef std::pair StringPair; - BOOST_FOREACH(const StringPair& rtti_matlab, types) { - int fieldId = mxAddField(registry, rtti_matlab.first.c_str()); - if(fieldId < 0) + mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); + if(!registry) + registry = mxCreateStructMatrix(1, 1, 0, NULL); + typedef std::pair StringPair; + BOOST_FOREACH(const StringPair& rtti_matlab, types) { + int fieldId = mxAddField(registry, rtti_matlab.first.c_str()); + if(fieldId < 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str()); + mxSetFieldByNumber(registry, 0, fieldId, matlabName); + } + if(mexPutVariable("global", "gtsamwrap_rttiRegistry", registry) != 0) mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); - mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str()); - mxSetFieldByNumber(registry, 0, fieldId, matlabName); + mxDestroyArray(registry); + + mxArray *newAlreadyCreated = mxCreateNumericMatrix(0, 0, mxINT8_CLASS, mxREAL); + if(mexPutVariable("global", "gtsam_testNamespaces_rttiRegistry_created", newAlreadyCreated) != 0) + mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); + mxDestroyArray(newAlreadyCreated); } - if(mexPutVariable("global", "gtsamwrap_rttiRegistry", registry) != 0) - mexErrMsgTxt("gtsam wrap: Error indexing RTTI types, inheritance will not work correctly"); - mxDestroyArray(registry); } void ns1ClassA_collectorInsertAndMakeBase_0(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -315,10 +338,8 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) mstream mout; std::streambuf *outbuf = std::cout.rdbuf(&mout); - if(!_RTTIRegister_testNamespaces_done) { - _testNamespaces_RTTIRegister(); - _RTTIRegister_testNamespaces_done = true; - } + _testNamespaces_RTTIRegister(); + int id = unwrap(in[0]); switch(id) { From 6266a2c56d3d66b75c0615ae360e779685ec29ee Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 18 Jul 2012 15:43:54 +0000 Subject: [PATCH 636/914] Removed SimpleString from CppUnitLite - now just uses std::string and boost::lexical_cast --- CppUnitLite/Failure.cpp | 45 ++++---------- CppUnitLite/Failure.h | 29 +++++---- CppUnitLite/SimpleString.cpp | 115 ----------------------------------- CppUnitLite/SimpleString.h | 57 ----------------- CppUnitLite/Test.cpp | 18 +++--- CppUnitLite/Test.h | 38 ++++++------ CppUnitLite/TestRegistry.cpp | 5 +- CppUnitLite/TestResult.cpp | 8 +-- tests/testGaussianISAM2.cpp | 2 +- 9 files changed, 61 insertions(+), 256 deletions(-) delete mode 100644 CppUnitLite/SimpleString.cpp delete mode 100644 CppUnitLite/SimpleString.h diff --git a/CppUnitLite/Failure.cpp b/CppUnitLite/Failure.cpp index d0c919165..591485b04 100644 --- a/CppUnitLite/Failure.cpp +++ b/CppUnitLite/Failure.cpp @@ -13,14 +13,10 @@ #include "Failure.h" -#include -#include - - -Failure::Failure (const SimpleString& theTestName, - const SimpleString& theFileName, +Failure::Failure (const std::string& theTestName, + const std::string& theFileName, long theLineNumber, - const SimpleString& theCondition) + const std::string& theCondition) : message (theCondition), testName (theTestName), fileName (theFileName), @@ -28,9 +24,9 @@ Failure::Failure (const SimpleString& theTestName, { } -Failure::Failure (const SimpleString& theTestName, - const SimpleString& theFileName, - const SimpleString& theCondition) +Failure::Failure (const std::string& theTestName, + const std::string& theFileName, + const std::string& theCondition) : message (theCondition), testName (theTestName), fileName (theFileName), @@ -39,33 +35,16 @@ Failure::Failure (const SimpleString& theTestName, } -Failure::Failure (const SimpleString& theTestName, - const SimpleString& theFileName, +Failure::Failure (const std::string& theTestName, + const std::string& theFileName, long theLineNumber, - const SimpleString& expected, - const SimpleString& actual) -: testName (theTestName), + const std::string& expected, + const std::string& actual) +: message("expected " + expected + " but was: " + actual), + testName (theTestName), fileName (theFileName), lineNumber (theLineNumber) { - const char *part1 = "expected "; - const char *part3 = " but was: "; - - char *stage = new char [strlen (part1) - + expected.size () - + strlen (part3) - + actual.size () - + 1]; - - sprintf(stage, "%s%s%s%s", - part1, - expected.asCharString(), - part3, - actual.asCharString()); - - message = SimpleString(stage); - - delete stage; } diff --git a/CppUnitLite/Failure.h b/CppUnitLite/Failure.h index 1f898f08c..210ccd63d 100644 --- a/CppUnitLite/Failure.h +++ b/CppUnitLite/Failure.h @@ -24,32 +24,31 @@ #ifndef FAILURE_H #define FAILURE_H -#include "SimpleString.h" - +#include class Failure { public: - Failure (const SimpleString& theTestName, - const SimpleString& theFileName, + Failure (const std::string& theTestName, + const std::string& theFileName, long theLineNumber, - const SimpleString& theCondition); + const std::string& theCondition); - Failure (const SimpleString& theTestName, - const SimpleString& theFileName, + Failure (const std::string& theTestName, + const std::string& theFileName, long theLineNumber, - const SimpleString& expected, - const SimpleString& actual); + const std::string& expected, + const std::string& actual); - Failure (const SimpleString& theTestName, - const SimpleString& theFileName, - const SimpleString& theCondition); + Failure (const std::string& theTestName, + const std::string& theFileName, + const std::string& theCondition); - SimpleString message; - SimpleString testName; - SimpleString fileName; + std::string message; + std::string testName; + std::string fileName; long lineNumber; }; diff --git a/CppUnitLite/SimpleString.cpp b/CppUnitLite/SimpleString.cpp deleted file mode 100644 index 3fa040f63..000000000 --- a/CppUnitLite/SimpleString.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - - - -#include "SimpleString.h" -#include -#include -#include - - -static const int DEFAULT_SIZE = 20; - -SimpleString::SimpleString () -: buffer_(new char [1]) -{ - buffer_ [0] = '\0'; -} - - -SimpleString::SimpleString (const char *otherBuffer) -: buffer_ (new char [strlen (otherBuffer) + 1]) -{ - strcpy (buffer_, otherBuffer); -} - -SimpleString::SimpleString (const SimpleString& other) -{ - buffer_ = new char [other.size() + 1]; - strcpy(buffer_, other.buffer_); -} - - -SimpleString SimpleString::operator= (const SimpleString& other) -{ - delete [] buffer_; - buffer_ = new char [other.size() + 1]; - strcpy(buffer_, other.buffer_); - return *this; -} - -SimpleString SimpleString::operator+ (const SimpleString& other) -{ - SimpleString ret; - delete [] ret.buffer_; - ret.buffer_ = new char [size() + other.size() + 1]; - strcpy(ret.buffer_, buffer_); - strcat(ret.buffer_, other.buffer_); - return ret; -} - -char *SimpleString::asCharString () const -{ - return buffer_; -} - -int SimpleString::size() const -{ - return strlen (buffer_); -} - -SimpleString::~SimpleString () -{ - delete [] buffer_; -} - - -bool operator== (const SimpleString& left, const SimpleString& right) -{ - return !strcmp (left.asCharString (), right.asCharString ()); -} - - -SimpleString StringFrom (bool value) -{ - char buffer [sizeof ("false") + 1]; - sprintf (buffer, "%s", value ? "true" : "false"); - return SimpleString(buffer); -} - -SimpleString StringFrom (const char *value) -{ - return SimpleString(value); -} - -SimpleString StringFrom (long value) -{ - char buffer [DEFAULT_SIZE]; - sprintf (buffer, "%ld", value); - - return SimpleString(buffer); -} - -SimpleString StringFrom (double value) -{ - char buffer [DEFAULT_SIZE]; - sprintf (buffer, "%lg", value); - - return SimpleString(buffer); -} - -SimpleString StringFrom (const SimpleString& value) -{ - return SimpleString(value); -} - - diff --git a/CppUnitLite/SimpleString.h b/CppUnitLite/SimpleString.h deleted file mode 100644 index c454e5571..000000000 --- a/CppUnitLite/SimpleString.h +++ /dev/null @@ -1,57 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - - -/////////////////////////////////////////////////////////////////////////////// -// -// SIMPLESTRING.H -// -// One of the design goals of CppUnitLite is to compilation with very old C++ -// compilers. For that reason, I've added a simple string class that provides -// only the operations needed in CppUnitLite. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef SIMPLE_STRING -#define SIMPLE_STRING - - - -class SimpleString -{ - friend bool operator== (const SimpleString& left, const SimpleString& right); - -public: - SimpleString (); - SimpleString (const char *value); - SimpleString (const SimpleString& other); - ~SimpleString (); - - SimpleString operator= (const SimpleString& other); - SimpleString operator+ (const SimpleString& other); - - char *asCharString () const; - int size() const; - -private: - char *buffer_; -}; - - - -SimpleString StringFrom (bool value); -SimpleString StringFrom (const char *value); -SimpleString StringFrom (long value); -SimpleString StringFrom (double value); -SimpleString StringFrom (const SimpleString& other); - - -#endif diff --git a/CppUnitLite/Test.cpp b/CppUnitLite/Test.cpp index 1d9902b37..07230436e 100644 --- a/CppUnitLite/Test.cpp +++ b/CppUnitLite/Test.cpp @@ -10,20 +10,20 @@ * -------------------------------------------------------------------------- */ - #include "Test.h" #include "TestRegistry.h" #include "TestResult.h" #include "Failure.h" +#include -Test::Test (const SimpleString& testName) +Test::Test (const std::string& testName) : name_ (testName) { TestRegistry::addTest (this); } -Test::Test (const SimpleString& testName, const SimpleString& filename, long lineNumber, bool safeCheck = true) +Test::Test (const std::string& testName, const std::string& filename, long lineNumber, bool safeCheck = true) : name_(testName), filename_(filename), lineNumber_(lineNumber), safeCheck_(safeCheck) { TestRegistry::addTest (this); @@ -40,31 +40,31 @@ void Test::setNext(Test *test) next_ = test; } -bool Test::check(long expected, long actual, TestResult& result, const SimpleString& fileName, long lineNumber) +bool Test::check(long expected, long actual, TestResult& result, const std::string& fileName, long lineNumber) { if (expected == actual) return true; result.addFailure ( Failure ( name_, - StringFrom (__FILE__), + boost::lexical_cast (__FILE__), __LINE__, - StringFrom (expected), - StringFrom (actual))); + boost::lexical_cast (expected), + boost::lexical_cast (actual))); return false; } -bool Test::check(const SimpleString& expected, const SimpleString& actual, TestResult& result, const SimpleString& fileName, long lineNumber) +bool Test::check(const std::string& expected, const std::string& actual, TestResult& result, const std::string& fileName, long lineNumber) { if (expected == actual) return true; result.addFailure ( Failure ( name_, - StringFrom (__FILE__), + boost::lexical_cast (__FILE__), __LINE__, expected, actual)); diff --git a/CppUnitLite/Test.h b/CppUnitLite/Test.h index 89d96f463..d5d5d1d2f 100644 --- a/CppUnitLite/Test.h +++ b/CppUnitLite/Test.h @@ -23,7 +23,7 @@ #include -#include "SimpleString.h" +#include class TestResult; @@ -32,8 +32,8 @@ class TestResult; class Test { public: - Test (const SimpleString& testName); - Test (const SimpleString& testName, const SimpleString& filename, long lineNumber, bool safeCheck); + Test (const std::string& testName); + Test (const std::string& testName, const std::string& filename, long lineNumber, bool safeCheck); virtual ~Test() {}; virtual void run (TestResult& result) = 0; @@ -41,19 +41,19 @@ public: void setNext(Test *test); Test *getNext () const; - SimpleString getName() const {return name_;} - SimpleString getFilename() const {return filename_;} + std::string getName() const {return name_;} + std::string getFilename() const {return filename_;} long getLineNumber() const {return lineNumber_;} bool safe() const {return safeCheck_;} protected: - bool check (long expected, long actual, TestResult& result, const SimpleString& fileName, long lineNumber); - bool check (const SimpleString& expected, const SimpleString& actual, TestResult& result, const SimpleString& fileName, long lineNumber); + bool check (long expected, long actual, TestResult& result, const std::string& fileName, long lineNumber); + bool check (const std::string& expected, const std::string& actual, TestResult& result, const std::string& fileName, long lineNumber); - SimpleString name_; + std::string name_; Test *next_; - SimpleString filename_; + std::string filename_; long lineNumber_; /// This is the line line number of the test, rather than the a single check bool safeCheck_; @@ -102,17 +102,17 @@ protected: #define THROWS_EXCEPTION(condition)\ { try { condition; \ - result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Didn't throw: ") + StringFrom(#condition))); \ + result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Didn't throw: ") + boost::lexical_cast(#condition))); \ return; } \ catch (...) {} } #define CHECK_EXCEPTION(condition, exception_name)\ { try { condition; \ - result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Didn't throw: ") + StringFrom(#condition))); \ + result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Didn't throw: ") + boost::lexical_cast(#condition))); \ return; } \ catch (exception_name&) {} \ catch (...) { \ - result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Wrong exception: ") + StringFrom(#condition) + StringFrom(", expected: ") + StringFrom(#exception_name))); \ + result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Wrong exception: ") + boost::lexical_cast(#condition) + boost::lexical_cast(", expected: ") + boost::lexical_cast(#exception_name))); \ return; } } #define EQUALITY(expected,actual)\ @@ -120,21 +120,21 @@ protected: result_.addFailure(Failure(name_, __FILE__, __LINE__, #expected, #actual)); } #define CHECK_EQUAL(expected,actual)\ -{ if ((expected) == (actual)) return; result_.addFailure(Failure(name_, __FILE__, __LINE__, StringFrom(expected), StringFrom(actual))); } +{ if ((expected) == (actual)) return; result_.addFailure(Failure(name_, __FILE__, __LINE__, boost::lexical_cast(expected), boost::lexical_cast(actual))); } #define LONGS_EQUAL(expected,actual)\ { long actualTemp = actual; \ long expectedTemp = expected; \ if ((expectedTemp) != (actualTemp)) \ -{ result_.addFailure (Failure (name_, __FILE__, __LINE__, StringFrom(expectedTemp), \ -StringFrom(actualTemp))); return; } } +{ result_.addFailure (Failure (name_, __FILE__, __LINE__, boost::lexical_cast(expectedTemp), \ +boost::lexical_cast(actualTemp))); return; } } #define DOUBLES_EQUAL(expected,actual,threshold)\ { double actualTemp = actual; \ double expectedTemp = expected; \ if (fabs ((expectedTemp)-(actualTemp)) > threshold) \ { result_.addFailure (Failure (name_, __FILE__, __LINE__, \ -StringFrom((double)expectedTemp), StringFrom((double)actualTemp))); return; } } +boost::lexical_cast((double)expectedTemp), boost::lexical_cast((double)actualTemp))); return; } } /* EXPECTs: tests will continue running after a failure */ @@ -146,15 +146,15 @@ StringFrom((double)expectedTemp), StringFrom((double)actualTemp))); return; } } { long actualTemp = actual; \ long expectedTemp = expected; \ if ((expectedTemp) != (actualTemp)) \ -{ result_.addFailure (Failure (name_, __FILE__, __LINE__, StringFrom(expectedTemp), \ -StringFrom(actualTemp))); } } +{ result_.addFailure (Failure (name_, __FILE__, __LINE__, boost::lexical_cast(expectedTemp), \ +boost::lexical_cast(actualTemp))); } } #define EXPECT_DOUBLES_EQUAL(expected,actual,threshold)\ { double actualTemp = actual; \ double expectedTemp = expected; \ if (fabs ((expectedTemp)-(actualTemp)) > threshold) \ { result_.addFailure (Failure (name_, __FILE__, __LINE__, \ -StringFrom((double)expectedTemp), StringFrom((double)actualTemp))); } } +boost::lexical_cast((double)expectedTemp), boost::lexical_cast((double)actualTemp))); } } #define FAIL(text) \ diff --git a/CppUnitLite/TestRegistry.cpp b/CppUnitLite/TestRegistry.cpp index fa5295229..1d06b225c 100644 --- a/CppUnitLite/TestRegistry.cpp +++ b/CppUnitLite/TestRegistry.cpp @@ -17,7 +17,6 @@ #include "Failure.h" #include "TestResult.h" #include "TestRegistry.h" -#include "SimpleString.h" void TestRegistry::addTest (Test *test) { @@ -65,12 +64,12 @@ int TestRegistry::run (TestResult& result) // catch standard exceptions and derivatives result.addFailure( Failure(test->getName(), test->getFilename(), test->getLineNumber(), - SimpleString("Exception: ") + SimpleString(e.what()))); + std::string("Exception: ") + std::string(e.what()))); } catch (...) { // catch all other exceptions result.addFailure( Failure(test->getName(), test->getFilename(), test->getLineNumber(), - SimpleString("ExceptionThrown!"))); + "ExceptionThrown!")); } } else { diff --git a/CppUnitLite/TestResult.cpp b/CppUnitLite/TestResult.cpp index 3bc8a8ad5..a9e599989 100644 --- a/CppUnitLite/TestResult.cpp +++ b/CppUnitLite/TestResult.cpp @@ -32,16 +32,16 @@ void TestResult::addFailure (const Failure& failure) if (failure.lineNumber < 0) // allow for no line number fprintf (stdout, "%s%s%s%s\n", "Failure: \"", - failure.message.asCharString (), + failure.message.c_str (), "\" in ", - failure.fileName.asCharString ()); + failure.fileName.c_str ()); else fprintf (stdout, "%s%s%ld%s%s%s\n", - failure.fileName.asCharString(), // Format matches Eclipse error flagging + failure.fileName.c_str(), // Format matches Eclipse error flagging ":", failure.lineNumber, ": Failure: \"", - failure.message.asCharString(), + failure.message.c_str(), "\" "); failureCount++; diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 9fdd6512f..2c932680d 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -381,7 +381,7 @@ TEST(ISAM2, optimize2) { bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, const ISAM2& isam, Test& test, TestResult& result) { TestResult& result_ = result; - const SimpleString name_ = test.getName(); + const std::string name_ = test.getName(); Values actual = isam.calculateEstimate(); Ordering ordering = isam.getOrdering(); // *fullgraph.orderingCOLAMD(fullinit).first; From 8fa77de2a0ac6dade02e5459cceb5106182da8af Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 18 Jul 2012 15:43:55 +0000 Subject: [PATCH 637/914] Removed cpp file for Failure, small cleanups --- CppUnitLite/Failure.cpp | 50 ----------------------------------------- CppUnitLite/Failure.h | 48 +++++++++++++++++++++++++-------------- CppUnitLite/Test.cpp | 6 ++--- CppUnitLite/Test.h | 2 -- 4 files changed, 34 insertions(+), 72 deletions(-) delete mode 100644 CppUnitLite/Failure.cpp diff --git a/CppUnitLite/Failure.cpp b/CppUnitLite/Failure.cpp deleted file mode 100644 index 591485b04..000000000 --- a/CppUnitLite/Failure.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - - - -#include "Failure.h" - -Failure::Failure (const std::string& theTestName, - const std::string& theFileName, - long theLineNumber, - const std::string& theCondition) -: message (theCondition), - testName (theTestName), - fileName (theFileName), - lineNumber (theLineNumber) -{ -} - -Failure::Failure (const std::string& theTestName, - const std::string& theFileName, - const std::string& theCondition) -: message (theCondition), - testName (theTestName), - fileName (theFileName), - lineNumber (-1) -{ -} - - -Failure::Failure (const std::string& theTestName, - const std::string& theFileName, - long theLineNumber, - const std::string& expected, - const std::string& actual) -: message("expected " + expected + " but was: " + actual), - testName (theTestName), - fileName (theFileName), - lineNumber (theLineNumber) -{ -} - - diff --git a/CppUnitLite/Failure.h b/CppUnitLite/Failure.h index 210ccd63d..93c99df12 100644 --- a/CppUnitLite/Failure.h +++ b/CppUnitLite/Failure.h @@ -21,8 +21,7 @@ /////////////////////////////////////////////////////////////////////////////// -#ifndef FAILURE_H -#define FAILURE_H +#pragma once #include @@ -30,27 +29,42 @@ class Failure { public: - Failure (const std::string& theTestName, - const std::string& theFileName, - long theLineNumber, - const std::string& theCondition); + Failure (const std::string& theTestName, + const std::string& theFileName, + long theLineNumber, + const std::string& theCondition) + : message (theCondition), + testName (theTestName), + fileName (theFileName), + lineNumber (theLineNumber) + { + } - Failure (const std::string& theTestName, - const std::string& theFileName, - long theLineNumber, - const std::string& expected, - const std::string& actual); + Failure (const std::string& theTestName, + const std::string& theFileName, + const std::string& theCondition) + : message (theCondition), + testName (theTestName), + fileName (theFileName), + lineNumber (-1) + { + } - Failure (const std::string& theTestName, - const std::string& theFileName, - const std::string& theCondition); + Failure (const std::string& theTestName, + const std::string& theFileName, + long theLineNumber, + const std::string& expected, + const std::string& actual) + : message("expected " + expected + " but was: " + actual), + testName (theTestName), + fileName (theFileName), + lineNumber (theLineNumber) + { + } std::string message; std::string testName; std::string fileName; long lineNumber; }; - - -#endif diff --git a/CppUnitLite/Test.cpp b/CppUnitLite/Test.cpp index 07230436e..e6a2ad51f 100644 --- a/CppUnitLite/Test.cpp +++ b/CppUnitLite/Test.cpp @@ -18,13 +18,13 @@ #include Test::Test (const std::string& testName) - : name_ (testName) + : name_ (testName), next_(0), lineNumber_(-1), safeCheck_(true) { TestRegistry::addTest (this); } -Test::Test (const std::string& testName, const std::string& filename, long lineNumber, bool safeCheck = true) - : name_(testName), filename_(filename), lineNumber_(lineNumber), safeCheck_(safeCheck) +Test::Test (const std::string& testName, const std::string& filename, long lineNumber, bool safeCheck) + : name_(testName), next_(0), filename_(filename), lineNumber_(lineNumber), safeCheck_(safeCheck) { TestRegistry::addTest (this); } diff --git a/CppUnitLite/Test.h b/CppUnitLite/Test.h index d5d5d1d2f..820ed48cf 100644 --- a/CppUnitLite/Test.h +++ b/CppUnitLite/Test.h @@ -27,8 +27,6 @@ class TestResult; - - class Test { public: From 8dbffd46294046c2d6aeed5bca2ff7acd3c540ed Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 18 Jul 2012 15:47:06 +0000 Subject: [PATCH 638/914] Wrap generates Matlab namespaces, so now 'import gtsam.*' allows class names like Values, NonlinearFactor, to be used. Without import, syntax is gtsam.Values, etc. --- matlab/CMakeLists.txt | 8 +-- matlab/VisualISAMGenerateData.m | 26 ++++---- matlab/VisualISAMInitialize.m | 15 ++--- matlab/VisualISAMPlot.m | 3 +- matlab/VisualISAMStep.m | 7 ++- matlab/examples/LocalizationExample.m | 27 ++++---- matlab/examples/OdometryExample.m | 22 ++++--- matlab/examples/PlanarSLAMExample.m | 36 ++++++----- matlab/examples/PlanarSLAMExample_sampling.m | 40 ++++++------ matlab/examples/Pose2SLAMExample.m | 36 ++++++----- matlab/examples/Pose2SLAMExample_advanced.m | 26 ++++---- matlab/examples/Pose2SLAMExample_circle.m | 8 +-- matlab/examples/Pose2SLAMExample_graph.m | 8 ++- matlab/examples/Pose2SLAMwSPCG.m | 37 ++++++----- matlab/examples/Pose3SLAMExample.m | 8 +-- matlab/examples/Pose3SLAMExample_graph.m | 4 +- matlab/examples/SBAExample.m | 20 +++--- matlab/examples/SFMExample.m | 15 +++-- matlab/examples/StereoVOExample.m | 34 +++++----- matlab/examples/StereoVOExample_large.m | 17 ++--- matlab/load2D.m | 8 +-- matlab/load3D.m | 26 ++++---- matlab/symbol.m | 2 +- matlab/symbolChr.m | 2 +- matlab/symbolIndex.m | 2 +- matlab/tests/testJacobianFactor.m | 12 ++-- matlab/tests/testKalmanFilter.m | 8 ++- matlab/tests/testLocalizationExample.m | 28 +++++---- matlab/tests/testOdometryExample.m | 23 ++++--- matlab/tests/testPlanarSLAMExample.m | 39 +++++++----- matlab/tests/testPose2SLAMExample.m | 40 ++++++------ matlab/tests/testPose3SLAMExample.m | 11 ++-- matlab/tests/testSFMExample.m | 14 +++-- matlab/tests/testStereoVOExample.m | 34 +++++----- wrap/Argument.cpp | 4 +- wrap/Class.cpp | 62 ++++++++++++------- wrap/Class.h | 2 +- wrap/Constructor.cpp | 16 ++--- wrap/Constructor.h | 5 +- wrap/Deconstructor.cpp | 18 +++--- wrap/Deconstructor.h | 4 +- wrap/Method.cpp | 15 ++--- wrap/Method.h | 4 +- wrap/Module.cpp | 22 +++---- wrap/ReturnValue.cpp | 4 +- wrap/StaticMethod.cpp | 15 ++--- wrap/StaticMethod.h | 4 +- .../{ns1ClassA.m => +ns1/ClassA.m} | 6 +- .../{ns1ClassB.m => +ns1/ClassB.m} | 6 +- .../{ns2ns3ClassB.m => +ns2/+ns3/ClassB.m} | 6 +- .../{ns2ClassA.m => +ns2/ClassA.m} | 16 ++--- .../{ns2ClassC.m => +ns2/ClassC.m} | 6 +- .../testNamespaces_wrapper.cpp | 2 +- wrap/tests/testWrap.cpp | 10 +-- wrap/utilities.h | 9 +++ 55 files changed, 493 insertions(+), 389 deletions(-) rename wrap/tests/expected_namespaces/{ns1ClassA.m => +ns1/ClassA.m} (80%) rename wrap/tests/expected_namespaces/{ns1ClassB.m => +ns1/ClassB.m} (80%) rename wrap/tests/expected_namespaces/{ns2ns3ClassB.m => +ns2/+ns3/ClassB.m} (79%) rename wrap/tests/expected_namespaces/{ns2ClassA.m => +ns2/ClassA.m} (84%) rename wrap/tests/expected_namespaces/{ns2ClassC.m => +ns2/ClassC.m} (80%) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index 84df4055c..3e77de602 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -6,12 +6,12 @@ message(STATUS "Installing Matlab Utility Functions") file(GLOB matlab_utils_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.m") file(GLOB matlab_utils_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.fig") set(matlab_utils ${matlab_utils_m} ${matlab_utils_fig}) -install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam) +install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/) # Tests message(STATUS "Installing Matlab Toolbox Tests") file(GLOB matlab_tests "${GTSAM_SOURCE_ROOT_DIR}/matlab/tests/*.m") -install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/tests) +install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_tests) # Examples message(STATUS "Installing Matlab Toolbox Examples") @@ -19,11 +19,11 @@ message(STATUS "Installing Matlab Toolbox Examples") file(GLOB matlab_examples_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.m") file(GLOB matlab_examples_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.fig") set(matlab_examples ${matlab_examples_m} ${matlab_examples_fig}) -install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/examples) +install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples) message(STATUS "Installing Matlab Toolbox Examples (Data)") # Data files: *.graph and *.txt file(GLOB matlab_examples_data_graph "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.graph") file(GLOB matlab_examples_data_txt "${GTSAM_SOURCE_ROOT_DIR}/examples/Data/*.txt") set(matlab_examples_data ${matlab_examples_data_graph} ${matlab_examples_data_txt}) -install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam/Data) +install(FILES ${matlab_examples_data} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples/Data) diff --git a/matlab/VisualISAMGenerateData.m b/matlab/VisualISAMGenerateData.m index 1c71185e2..2e972d9af 100644 --- a/matlab/VisualISAMGenerateData.m +++ b/matlab/VisualISAMGenerateData.m @@ -3,33 +3,35 @@ function [data,truth] = VisualISAMGenerateData(options) % Authors: Duy Nguyen Ta and Frank Dellaert %% Generate simulated data +import gtsam.* if options.triangle % Create a triangle target, just 3 points on a plane nrPoints = 3; r = 10; for j=1:nrPoints theta = (j-1)*2*pi/nrPoints; - truth.points{j} = gtsamPoint3([r*cos(theta), r*sin(theta), 0]'); + truth.points{j} = Point3([r*cos(theta), r*sin(theta), 0]'); end else % 3D landmarks as vertices of a cube nrPoints = 8; - truth.points = {gtsamPoint3([10 10 10]'),... - gtsamPoint3([-10 10 10]'),... - gtsamPoint3([-10 -10 10]'),... - gtsamPoint3([10 -10 10]'),... - gtsamPoint3([10 10 -10]'),... - gtsamPoint3([-10 10 -10]'),... - gtsamPoint3([-10 -10 -10]'),... - gtsamPoint3([10 -10 -10]')}; + truth.points = {Point3([10 10 10]'),... + Point3([-10 10 10]'),... + Point3([-10 -10 10]'),... + Point3([10 -10 10]'),... + Point3([10 10 -10]'),... + Point3([-10 10 -10]'),... + Point3([-10 -10 -10]'),... + Point3([10 -10 -10]')}; end %% Create camera cameras on a circle around the triangle +import gtsam.* height = 10; r = 40; -truth.K = gtsamCal3_S2(500,500,0,640/2,480/2); +truth.K = Cal3_S2(500,500,0,640/2,480/2); data.K = truth.K; for i=1:options.nrCameras theta = (i-1)*2*pi/options.nrCameras; - t = gtsamPoint3([r*cos(theta), r*sin(theta), height]'); - truth.cameras{i} = gtsamSimpleCamera.Lookat(t, gtsamPoint3, gtsamPoint3([0,0,1]'), truth.K); + t = Point3([r*cos(theta), r*sin(theta), height]'); + truth.cameras{i} = SimpleCamera.Lookat(t, Point3, Point3([0,0,1]'), truth.K); % Create measurements for j=1:nrPoints % All landmarks seen in every frame diff --git a/matlab/VisualISAMInitialize.m b/matlab/VisualISAMInitialize.m index b2b960a7b..cbcb09c5c 100644 --- a/matlab/VisualISAMInitialize.m +++ b/matlab/VisualISAMInitialize.m @@ -3,18 +3,19 @@ function [noiseModels,isam,result] = VisualISAMInitialize(data,truth,options) % Authors: Duy Nguyen Ta, Frank Dellaert and Alex Cunningham %% Initialize iSAM -isam = visualSLAMISAM(options.reorderInterval); +isam = visualSLAM.ISAM(options.reorderInterval); %% Set Noise parameters -noiseModels.pose = gtsamnoiseModelDiagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -noiseModels.odometry = gtsamnoiseModelDiagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -noiseModels.point = gtsamnoiseModelIsotropic.Sigma(3, 0.1); -noiseModels.measurement = gtsamnoiseModelIsotropic.Sigma(2, 1.0); +import gtsam.* +noiseModels.pose = noiseModel.Diagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.odometry = noiseModel.Diagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); +noiseModels.point = noiseModel.Isotropic.Sigma(3, 0.1); +noiseModels.measurement = noiseModel.Isotropic.Sigma(2, 1.0); %% Add constraints/priors % TODO: should not be from ground truth! -newFactors = visualSLAMGraph; -initialEstimates = visualSLAMValues; +newFactors = visualSLAM.Graph; +initialEstimates = visualSLAM.Values; for i=1:2 ii = symbol('x',i); if i==1 diff --git a/matlab/VisualISAMPlot.m b/matlab/VisualISAMPlot.m index e140686d9..1f2b7d710 100644 --- a/matlab/VisualISAMPlot.m +++ b/matlab/VisualISAMPlot.m @@ -21,10 +21,11 @@ for j=0:N-1 % NOTE: uses indexing directly from a C++ vector, so zero-indexed end %% Plot cameras +import gtsam.* for i=1:options.cameraInterval:M ii = symbol('x',i); pose_i = result.pose(ii); - if options.hardConstraint & (i==1) + if options.hardConstraint && (i==1) plotPose3(pose_i,[],10); else P = isam.marginalCovariance(ii); diff --git a/matlab/VisualISAMStep.m b/matlab/VisualISAMStep.m index 5033a8b39..ef056553e 100644 --- a/matlab/VisualISAMStep.m +++ b/matlab/VisualISAMStep.m @@ -4,15 +4,17 @@ function [isam,result] = VisualISAMStep(data,noiseModels,isam,result,truth, opti % iSAM expects us to give it a new set of factors % along with initial estimates for any new variables introduced. -newFactors = visualSLAMGraph; -initialEstimates = visualSLAMValues; +newFactors = visualSLAM.Graph; +initialEstimates = visualSLAM.Values; %% Add odometry +import gtsam.* i = result.nrPoses+1; odometry = data.odometry{i-1}; newFactors.addRelativePose(symbol('x',i-1), symbol('x',i), odometry, noiseModels.odometry); %% Add visual measurement factors and initializations as necessary +import gtsam.* for k=1:length(data.Z{i}) zij = data.Z{i}{k}; j = data.J{i}{k}; @@ -26,6 +28,7 @@ for k=1:length(data.Z{i}) end %% Initial estimates for the new pose. +import gtsam.* prevPose = result.pose(symbol('x',i-1)); initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m index 3f48bb8e4..0a54111b0 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/LocalizationExample.m @@ -16,36 +16,41 @@ % - The robot is on a grid, moving 2 meters each step %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add two odometry factors -odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +import gtsam.* +odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add three "GPS" measurements +import gtsam.* % We use Pose2 Priors here with high variance on theta -noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.1; 10]); -graph.addPosePrior(1, gtsamPose2(0.0, 0.0, 0.0), noiseModel); -graph.addPosePrior(2, gtsamPose2(2.0, 0.0, 0.0), noiseModel); -graph.addPosePrior(3, gtsamPose2(4.0, 0.0, 0.0), noiseModel); +priorNoise = noiseModel.Diagonal.Sigmas([0.1; 0.1; 10]); +graph.addPosePrior(1, Pose2(0.0, 0.0, 0.0), priorNoise); +graph.addPosePrior(2, Pose2(2.0, 0.0, 0.0), priorNoise); +graph.addPosePrior(3, Pose2(4.0, 0.0, 0.0), priorNoise); %% print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); +import gtsam.* +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +import gtsam.* result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n ')); %% Plot Covariance Ellipses +import gtsam.* cla; X=result.poses(); plot(X(:,1),X(:,2),'k*-'); hold on diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index e90550152..297702b51 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -16,16 +16,18 @@ % - The robot is on a grid, moving 2 meters each step %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add a Gaussian prior on pose x_1 -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +import gtsam.* +priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add two odometry factors -odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +import gtsam.* +odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); @@ -33,10 +35,11 @@ graph.addRelativePose(2, 3, odometry, odometryNoise); graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); +import gtsam.* +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd @@ -44,6 +47,7 @@ result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n ')); %% Plot Covariance Ellipses +import gtsam.* cla; X=result.poses(); plot(X(:,1),X(:,2),'k*-'); hold on diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index 7557bd0ba..e664d66fc 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -20,40 +20,45 @@ % - Landmarks are 2 meters away from the robot trajectory %% Create keys for variables +import gtsam.* i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); j1 = symbol('l',1); j2 = symbol('l',2); %% Create graph container and add factors to it -graph = planarSLAMGraph; +graph = planarSLAM.Graph; %% Add prior -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); +import gtsam.* +priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph %% Add odometry -odometry = gtsamPose2(2.0, 0.0, 0.0); -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); +import gtsam.* +odometry = Pose2(2.0, 0.0, 0.0); +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(i1, i2, odometry, odometryNoise); graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Add bearing/range measurement factors +import gtsam.* degrees = pi/180; -noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.2]); -graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); -graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); -graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); +brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); +graph.addBearingRange(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise); +graph.addBearingRange(i2, j1, Rot2(90*degrees), 2, brNoise); +graph.addBearingRange(i3, j2, Rot2(90*degrees), 2, brNoise); % print graph.print(sprintf('\nFull graph:\n')); %% Initialize to noisy points -initialEstimate = planarSLAMValues; -initialEstimate.insertPose(i1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(i2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(i3, gtsamPose2(4.1, 0.1, 0.1)); -initialEstimate.insertPoint(j1, gtsamPoint2(1.8, 2.1)); -initialEstimate.insertPoint(j2, gtsamPoint2(4.1, 1.8)); +import gtsam.* +initialEstimate = planarSLAM.Values; +initialEstimate.insertPose(i1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(i2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(i3, Pose2(4.1, 0.1, 0.1)); +initialEstimate.insertPoint(j1, Point2(1.8, 2.1)); +initialEstimate.insertPoint(j2, Point2(4.1, 1.8)); initialEstimate.print(sprintf('\nInitial estimate:\n')); @@ -62,6 +67,7 @@ result = graph.optimize(initialEstimate,1); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses +import gtsam.* cla;hold on marginals = graph.marginals(result); for i=1:3 diff --git a/matlab/examples/PlanarSLAMExample_sampling.m b/matlab/examples/PlanarSLAMExample_sampling.m index 560ab7ace..ec68d81e6 100644 --- a/matlab/examples/PlanarSLAMExample_sampling.m +++ b/matlab/examples/PlanarSLAMExample_sampling.m @@ -12,37 +12,39 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create the same factor graph as in PlanarSLAMExample +import gtsam.* i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); -graph = planarSLAMGraph; -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); +graph = planarSLAM.Graph; +priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph -odometry = gtsamPose2(2.0, 0.0, 0.0); -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); +odometry = Pose2(2.0, 0.0, 0.0); +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(i1, i2, odometry, odometryNoise); graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Except, for measurements we offer a choice +import gtsam.* j1 = symbol('l',1); j2 = symbol('l',2); degrees = pi/180; -noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.2]); +brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); if 1 - graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); - graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); + graph.addBearingRange(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise); + graph.addBearingRange(i2, j1, Rot2(90*degrees), 2, brNoise); else - bearingModel = gtsamnoiseModelDiagonal.Sigmas(0.1); - graph.addBearing(i1, j1, gtsamRot2(45*degrees), bearingModel); - graph.addBearing(i2, j1, gtsamRot2(90*degrees), bearingModel); + bearingModel = noiseModel.Diagonal.Sigmas(0.1); + graph.addBearing(i1, j1, Rot2(45*degrees), bearingModel); + graph.addBearing(i2, j1, Rot2(90*degrees), bearingModel); end -graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); +graph.addBearingRange(i3, j2, Rot2(90*degrees), 2, brNoise); %% Initialize MCMC sampler with ground truth -sample = planarSLAMValues; -sample.insertPose(i1, gtsamPose2(0,0,0)); -sample.insertPose(i2, gtsamPose2(2,0,0)); -sample.insertPose(i3, gtsamPose2(4,0,0)); -sample.insertPoint(j1, gtsamPoint2(2,2)); -sample.insertPoint(j2, gtsamPoint2(4,2)); +sample = planarSLAM.Values; +sample.insertPose(i1, Pose2(0,0,0)); +sample.insertPose(i2, Pose2(2,0,0)); +sample.insertPose(i3, Pose2(4,0,0)); +sample.insertPoint(j1, Point2(2,2)); +sample.insertPoint(j2, Point2(4,2)); %% Calculate and plot Covariance Ellipses figure(1);clf;hold on @@ -74,6 +76,6 @@ axis equal N=1000; for s=1:N delta = S{2}*randn(2,1); - proposedPoint = gtsamPoint2(point{2}.x+delta(1),point{2}.y+delta(2)); + proposedPoint = Point2(point{2}.x+delta(1),point{2}.y+delta(2)); plotPoint2(proposedPoint,'k.') end \ No newline at end of file diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m index 9cb5b8af4..4bb072fa8 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/examples/Pose2SLAMExample.m @@ -19,36 +19,40 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add prior +import gtsam.* % gaussian for prior -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); +priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry +import gtsam.* % general noisemodel for odometry -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addRelativePose(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addRelativePose(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -model = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); +import gtsam.* +model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +graph.addRelativePose(5, 2, Pose2(2.0, 0.0, pi/2), model); % print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2 )); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2 )); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, pi/2)); -initialEstimate.insertPose(4, gtsamPose2(4.0, 2.0, pi )); -initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); +import gtsam.* +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2 )); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2 )); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, pi/2)); +initialEstimate.insertPose(4, Pose2(4.0, 2.0, pi )); +initialEstimate.insertPose(5, Pose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd diff --git a/matlab/examples/Pose2SLAMExample_advanced.m b/matlab/examples/Pose2SLAMExample_advanced.m index 45d288e50..fc23d67f1 100644 --- a/matlab/examples/Pose2SLAMExample_advanced.m +++ b/matlab/examples/Pose2SLAMExample_advanced.m @@ -21,38 +21,42 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add prior +import gtsam.* % gaussian for prior -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); +priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry +import gtsam.* % general noisemodel for odometry -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); -odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add measurements +import gtsam.* % general noisemodel for measurements -measurementNoise = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.2]); +measurementNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); % print graph.print('full graph'); %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); +import gtsam.* +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print('initial estimate'); %% set up solver, choose ordering and optimize -%params = gtsamNonlinearOptimizationParameters_newDecreaseThresholds(1e-15, 1e-15); +%params = NonlinearOptimizationParameters_newDecreaseThresholds(1e-15, 1e-15); % %ord = graph.orderingCOLAMD(initialEstimate); % diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m index c089f5949..355f1a10e 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/examples/Pose2SLAMExample_circle.m @@ -11,15 +11,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create a hexagon of poses -hexagon = pose2SLAMValues.Circle(6,1.0); +hexagon = pose2SLAM.Values.Circle(6,1.0); p0 = hexagon.pose(0); p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement -fg = pose2SLAMGraph; +fg = pose2SLAM.Graph; fg.addPoseConstraint(0, p0); delta = p0.between(p1); -covariance = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 5*pi/180]); +covariance = gtsam.noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); fg.addRelativePose(0,1, delta, covariance); fg.addRelativePose(1,2, delta, covariance); fg.addRelativePose(2,3, delta, covariance); @@ -28,7 +28,7 @@ fg.addRelativePose(4,5, delta, covariance); fg.addRelativePose(5,0, delta, covariance); %% Create initial config -initial = pose2SLAMValues; +initial = pose2SLAM.Values; initial.insertPose(0, p0); initial.insertPose(1, hexagon.pose(1).retract([-0.1, 0.1,-0.1]')); initial.insertPose(2, hexagon.pose(2).retract([ 0.1,-0.1, 0.1]')); diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index 258730aaa..ac6d1e317 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -11,13 +11,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Initialize graph, initial estimate, and odometry noise -model = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 5*pi/180]); +import gtsam.* +model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); [graph,initial]=load2D('../../examples/Data/w100-odom.graph',model); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.01; 0.01; 0.01]); +import gtsam.* +priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph %% Plot Initial Estimate diff --git a/matlab/examples/Pose2SLAMwSPCG.m b/matlab/examples/Pose2SLAMwSPCG.m index 3e773689b..5db736fab 100644 --- a/matlab/examples/Pose2SLAMwSPCG.m +++ b/matlab/examples/Pose2SLAMwSPCG.m @@ -17,36 +17,39 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add prior +import gtsam.* % gaussian for prior -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); -graph.addPrior(1, priorMean, priorNoise); % add directly to graph +priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); +graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry +import gtsam.* % general noisemodel for odometry -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addOdometry(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addOdometry(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addOdometry(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addOdometry(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addRelativePose(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -model = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); +import gtsam.* +model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +graph.addRelativePose(5, 2, Pose2(2.0, 0.0, pi/2), model); % print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2 )); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2 )); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, pi/2)); -initialEstimate.insertPose(4, gtsamPose2(4.0, 2.0, pi )); -initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2 )); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2 )); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, pi/2)); +initialEstimate.insertPose(4, Pose2(4.0, 2.0, pi )); +initialEstimate.insertPose(5, Pose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/examples/Pose3SLAMExample.m index c1328585e..d4a8baf99 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -11,15 +11,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create a hexagon of poses -hexagon = pose3SLAMValues.Circle(6,1.0); +hexagon = pose3SLAM.Values.Circle(6,1.0); p0 = hexagon.pose(0); p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement -fg = pose3SLAMGraph; +fg = pose3SLAM.Graph; fg.addPoseConstraint(0, p0); delta = p0.between(p1); -covariance = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +covariance = gtsam.noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); fg.addRelativePose(0,1, delta, covariance); fg.addRelativePose(1,2, delta, covariance); fg.addRelativePose(2,3, delta, covariance); @@ -28,7 +28,7 @@ fg.addRelativePose(4,5, delta, covariance); fg.addRelativePose(5,0, delta, covariance); %% Create initial config -initial = pose3SLAMValues; +initial = pose3SLAM.Values; s = 0.10; initial.insertPose(0, p0); initial.insertPose(1, hexagon.pose(1).retract(s*randn(6,1))); diff --git a/matlab/examples/Pose3SLAMExample_graph.m b/matlab/examples/Pose3SLAMExample_graph.m index f39fc306b..cace357ae 100644 --- a/matlab/examples/Pose3SLAMExample_graph.m +++ b/matlab/examples/Pose3SLAMExample_graph.m @@ -16,7 +16,7 @@ N = 2500; filename = '../../examples/Data/sphere2500.txt'; %% Initialize graph, initial estimate, and odometry noise -model = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +model = gtsam.noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); [graph,initial]=load3D(filename,model,true,N); %% Plot Initial Estimate @@ -27,6 +27,6 @@ plot3DTrajectory(initial,'g-',false); %% Read again, now with all constraints, and optimize graph = load3D(filename,model,false,N); -graph.addHardConstraint(0, first); +graph.addPoseConstraint(0, first); result = graph.optimize(initial); plot3DTrajectory(result,'r-',false); axis equal; diff --git a/matlab/examples/SBAExample.m b/matlab/examples/SBAExample.m index 82fdd4646..a0f003eeb 100644 --- a/matlab/examples/SBAExample.m +++ b/matlab/examples/SBAExample.m @@ -30,11 +30,12 @@ cameraNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1 ... 0.001*ones(1,5)]'; %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) -graph = sparseBAGraph; +graph = sparseBA.Graph; %% Add factors for all measurements -measurementNoise = gtsamnoiseModelIsotropic.Sigma(2,measurementNoiseSigma); +import gtsam.* +measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; @@ -43,11 +44,12 @@ for i=1:length(data.Z) end %% Add Gaussian priors for a pose and a landmark to constrain the system -cameraPriorNoise = gtsamnoiseModelDiagonal.Sigmas(cameraNoiseSigmas); -firstCamera = gtsamSimpleCamera(truth.cameras{1}.pose, truth.K); +import gtsam.* +cameraPriorNoise = noiseModel.Diagonal.Sigmas(cameraNoiseSigmas); +firstCamera = SimpleCamera(truth.cameras{1}.pose, truth.K); graph.addSimpleCameraPrior(symbol('c',1), firstCamera, cameraPriorNoise); -pointPriorNoise = gtsamnoiseModelIsotropic.Sigma(3,pointNoiseSigma); +pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Print the graph @@ -55,10 +57,11 @@ graph.print(sprintf('\nFactor graph:\n')); %% Initialize cameras and points close to ground truth in this example -initialEstimate = sparseBAValues; +import gtsam.* +initialEstimate = sparseBA.Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); - camera_i = gtsamSimpleCamera(pose_i, truth.K); + camera_i = SimpleCamera(pose_i, truth.K); initialEstimate.insertSimpleCamera(symbol('c',i), camera_i); end for j=1:size(truth.points,2) @@ -69,7 +72,8 @@ initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Fine grain optimization, allowing user to iterate step by step -parameters = gtsamLevenbergMarquardtParams; +import gtsam.* +parameters = LevenbergMarquardtParams; parameters.setlambdaInitial(1.0); parameters.setVerbosityLM('trylambda'); diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 3eef9f916..7c4baa75b 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -29,10 +29,11 @@ pointNoiseSigma = 0.1; poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) -graph = visualSLAMGraph; +graph = visualSLAM.Graph; %% Add factors for all measurements -measurementNoise = gtsamnoiseModelIsotropic.Sigma(2,measurementNoiseSigma); +import gtsam.* +measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; @@ -41,16 +42,17 @@ for i=1:length(data.Z) end %% Add Gaussian priors for a pose and a landmark to constrain the system -posePriorNoise = gtsamnoiseModelDiagonal.Sigmas(poseNoiseSigmas); +import gtsam.* +posePriorNoise = noiseModel.Diagonal.Sigmas(poseNoiseSigmas); graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); -pointPriorNoise = gtsamnoiseModelIsotropic.Sigma(3,pointNoiseSigma); +pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); %% Initialize cameras and points close to ground truth in this example -initialEstimate = visualSLAMValues; +initialEstimate = visualSLAM.Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); initialEstimate.insertPose(symbol('x',i), pose_i); @@ -63,7 +65,8 @@ initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Fine grain optimization, allowing user to iterate step by step -parameters = gtsamLevenbergMarquardtParams; +import gtsam.* +parameters = LevenbergMarquardtParams; parameters.setlambdaInitial(1.0); parameters.setVerbosityLM('trylambda'); diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index 9cf838e94..98e1b5845 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -22,37 +22,41 @@ x1 = symbol('x',1); x2 = symbol('x',2); l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); %% Create graph container and add factors to it -graph = visualSLAMGraph; +graph = visualSLAM.Graph; %% add a constraint on the starting pose -first_pose = gtsamPose3(); +import gtsam.* +first_pose = Pose3(); graph.addPoseConstraint(x1, first_pose); %% Create realistic calibration and measurement noise model % format: fx fy skew cx cy baseline -K = gtsamCal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); -stereo_model = gtsamnoiseModelDiagonal.Sigmas([1.0; 1.0; 1.0]); +import gtsam.* +K = Cal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); +stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); %% Add measurements +import gtsam.* % pose 1 -graph.addStereoMeasurement(gtsamStereoPoint2(520, 480, 440), stereo_model, x1, l1, K); -graph.addStereoMeasurement(gtsamStereoPoint2(120, 80, 440), stereo_model, x1, l2, K); -graph.addStereoMeasurement(gtsamStereoPoint2(320, 280, 140), stereo_model, x1, l3, K); +graph.addStereoMeasurement(StereoPoint2(520, 480, 440), stereo_model, x1, l1, K); +graph.addStereoMeasurement(StereoPoint2(120, 80, 440), stereo_model, x1, l2, K); +graph.addStereoMeasurement(StereoPoint2(320, 280, 140), stereo_model, x1, l3, K); %pose 2 -graph.addStereoMeasurement(gtsamStereoPoint2(570, 520, 490), stereo_model, x2, l1, K); -graph.addStereoMeasurement(gtsamStereoPoint2( 70, 20, 490), stereo_model, x2, l2, K); -graph.addStereoMeasurement(gtsamStereoPoint2(320, 270, 115), stereo_model, x2, l3, K); +graph.addStereoMeasurement(StereoPoint2(570, 520, 490), stereo_model, x2, l1, K); +graph.addStereoMeasurement(StereoPoint2( 70, 20, 490), stereo_model, x2, l2, K); +graph.addStereoMeasurement(StereoPoint2(320, 270, 115), stereo_model, x2, l3, K); %% Create initial estimate for camera poses and landmarks -initialEstimate = visualSLAMValues; +import gtsam.* +initialEstimate = visualSLAM.Values; initialEstimate.insertPose(x1, first_pose); % noisy estimate for pose 2 -initialEstimate.insertPose(x2, gtsamPose3(gtsamRot3(), gtsamPoint3(0.1,-.1,1.1))); -initialEstimate.insertPoint(l1, gtsamPoint3( 1, 1, 5)); -initialEstimate.insertPoint(l2, gtsamPoint3(-1, 1, 5)); -initialEstimate.insertPoint(l3, gtsamPoint3( 0,-.5, 5)); +initialEstimate.insertPose(x2, Pose3(Rot3(), Point3(0.1,-.1,1.1))); +initialEstimate.insertPoint(l1, Point3( 1, 1, 5)); +initialEstimate.insertPoint(l2, Point3(-1, 1, 5)); +initialEstimate.insertPoint(l3, Point3( 0,-.5, 5)); %% optimize fprintf(1,'Optimizing\n'); tic diff --git a/matlab/examples/StereoVOExample_large.m b/matlab/examples/StereoVOExample_large.m index d57628fa1..282f7162c 100644 --- a/matlab/examples/StereoVOExample_large.m +++ b/matlab/examples/StereoVOExample_large.m @@ -11,40 +11,43 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Load calibration +import gtsam.* % format: fx fy skew cx cy baseline calib = dlmread('../../examples/Data/VO_calibration.txt'); -K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); -stereo_model = gtsamnoiseModelDiagonal.Sigmas([1.0; 1.0; 1.0]); +K = Cal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); +stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); %% create empty graph and values -graph = visualSLAMGraph; -initial = visualSLAMValues; +graph = visualSLAM.Graph; +initial = visualSLAM.Values; %% load the initial poses from VO % row format: camera_id 4x4 pose (row, major) +import gtsam.* fprintf(1,'Reading data\n'); cameras = dlmread('../../examples/Data/VO_camera_poses_large.txt'); for i=1:size(cameras,1) - pose = gtsamPose3(reshape(cameras(i,2:17),4,4)'); + pose = Pose3(reshape(cameras(i,2:17),4,4)'); initial.insertPose(symbol('x',cameras(i,1)),pose); end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z +import gtsam.* measurements = dlmread('../../examples/Data/VO_stereo_factors_large.txt'); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) sf = measurements(i,:); - graph.addStereoMeasurement(gtsamStereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... + graph.addStereoMeasurement(StereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... symbol('x', sf(1)), symbol('l', sf(2)), K); if ~initial.exists(symbol('l',sf(2))) % 3D landmarks are stored in camera coordinates: transform % to world coordinates using the respective initial pose pose = initial.pose(symbol('x', sf(1))); - world_point = pose.transform_from(gtsamPoint3(sf(6),sf(7),sf(8))); + world_point = pose.transform_from(Point3(sf(6),sf(7),sf(8))); initial.insertPoint(symbol('l',sf(2)), world_point); end end diff --git a/matlab/load2D.m b/matlab/load2D.m index e459dfc63..31e96818f 100644 --- a/matlab/load2D.m +++ b/matlab/load2D.m @@ -13,17 +13,17 @@ fclose(fid); lines=columns{1}; % loop over lines and add vertices -graph = pose2SLAMGraph; -initial = pose2SLAMValues; +graph = pose2SLAM.Graph; +initial = pose2SLAM.Values; n=size(lines,1); for i=1:n line_i=lines{i}; if strcmp('VERTEX2',line_i(1:7)) v = textscan(line_i,'%s %d %f %f %f',1); - initial.insertPose(v{2}, gtsamPose2(v{3}, v{4}, v{5})); + initial.insertPose(v{2}, gtsam.Pose2(v{3}, v{4}, v{5})); elseif strcmp('EDGE2',line_i(1:5)) e = textscan(line_i,'%s %d %d %f %f %f',1); - graph.addOdometry(e{2}, e{3}, gtsamPose2(e{4}, e{5}, e{6}), model); + graph.addRelativePose(e{2}, e{3}, gtsam.Pose2(e{4}, e{5}, e{6}), model); end end diff --git a/matlab/load3D.m b/matlab/load3D.m index b457ea1af..5c9d08146 100644 --- a/matlab/load3D.m +++ b/matlab/load3D.m @@ -15,9 +15,9 @@ fclose(fid); lines=columns{1}; % loop over lines and add vertices -graph = pose3SLAMGraph; -initial = pose3SLAMValues; -origin=gtsamPose3; +graph = pose3SLAM.Graph; +initial = pose3SLAM.Values; +origin=gtsam.Pose3; initial.insertPose(0,origin); n=size(lines,1); if nargin<4, N=n;end @@ -26,21 +26,21 @@ for i=1:n line_i=lines{i}; if strcmp('VERTEX3',line_i(1:7)) v = textscan(line_i,'%s %d %f %f %f %f %f %f',1); - i=v{2}; - if (~successive & ii1 diff --git a/matlab/symbol.m b/matlab/symbol.m index c7c4af2c6..10a733593 100644 --- a/matlab/symbol.m +++ b/matlab/symbol.m @@ -1,4 +1,4 @@ function key = symbol(c,i) % generate a key corresponding to a symbol -s = gtsamSymbol(c,i); +s = gtsam.Symbol(c,i); key = s.key(); \ No newline at end of file diff --git a/matlab/symbolChr.m b/matlab/symbolChr.m index 39c92ec85..6cabdb2b2 100644 --- a/matlab/symbolChr.m +++ b/matlab/symbolChr.m @@ -1,4 +1,4 @@ function c = symbolChr(key) % generate the chr from a key -s = gtsamSymbol(key); +s = gtsam.Symbol(key); c = s.chr(); \ No newline at end of file diff --git a/matlab/symbolIndex.m b/matlab/symbolIndex.m index 3046cf229..ad6eaf97d 100644 --- a/matlab/symbolIndex.m +++ b/matlab/symbolIndex.m @@ -1,4 +1,4 @@ function i = symbolIndex(key) % generate the index from a key -s = gtsamSymbol(key); +s = gtsam.Symbol(key); i = s.index(); \ No newline at end of file diff --git a/matlab/tests/testJacobianFactor.m b/matlab/tests/testJacobianFactor.m index 3afd2dc58..3bc8f4edd 100644 --- a/matlab/tests/testJacobianFactor.m +++ b/matlab/tests/testJacobianFactor.m @@ -1,6 +1,8 @@ %----------------------------------------------------------------------- % eliminate +import gtsam.* + % the combined linear factor Ax2 = [ -5., 0. @@ -30,8 +32,8 @@ x1 = 3; % the RHS b2=[-1;1.5;2;-1]; sigmas = [1;1;1;1]; -model4 = gtsamnoiseModelDiagonal.Sigmas(sigmas); -combined = gtsamJacobianFactor(x2, Ax2, l1, Al1, x1, Ax1, b2, model4); +model4 = noiseModel.Diagonal.Sigmas(sigmas); +combined = JacobianFactor(x2, Ax2, l1, Al1, x1, Ax1, b2, model4); % eliminate the first variable (x2) in the combined factor, destructive ! actualCG = combined.eliminateFirst(); @@ -50,7 +52,7 @@ S13 = [ +0.00,-8.94427 ]; d=[2.23607;-1.56525]; -expectedCG = gtsamGaussianConditional(x2,d,R11,l1,S12,x1,S13,[1;1]); +expectedCG = GaussianConditional(x2,d,R11,l1,S12,x1,S13,[1;1]); % check if the result matches CHECK('actualCG.equals(expectedCG,1e-5)',actualCG.equals(expectedCG,1e-4)); @@ -69,8 +71,8 @@ Bx1 = [ % the RHS b1= [0.0;0.894427]; -model2 = gtsamnoiseModelDiagonal.Sigmas([1;1]); -expectedLF = gtsamJacobianFactor(l1, Bl1, x1, Bx1, b1, model2); +model2 = noiseModel.Diagonal.Sigmas([1;1]); +expectedLF = JacobianFactor(l1, Bl1, x1, Bx1, b1, model2); % check if the result matches the combined (reduced) factor % FIXME: JacobianFactor/GaussianFactor mismatch diff --git a/matlab/tests/testKalmanFilter.m b/matlab/tests/testKalmanFilter.m index 652e37c9e..ee65d18d3 100644 --- a/matlab/tests/testKalmanFilter.m +++ b/matlab/tests/testKalmanFilter.m @@ -19,16 +19,17 @@ % */ %% Create the controls and measurement properties for our example +import gtsam.* F = eye(2,2); B = eye(2,2); u = [1.0; 0.0]; -modelQ = gtsamnoiseModelDiagonal.Sigmas([0.1;0.1]); +modelQ = noiseModel.Diagonal.Sigmas([0.1;0.1]); Q = 0.01*eye(2,2); H = eye(2,2); z1 = [1.0, 0.0]'; z2 = [2.0, 0.0]'; z3 = [3.0, 0.0]'; -modelR = gtsamnoiseModelDiagonal.Sigmas([0.1;0.1]); +modelR = noiseModel.Diagonal.Sigmas([0.1;0.1]); R = 0.01*eye(2,2); %% Create the set of expected output TestValues @@ -48,7 +49,8 @@ P23 = inv(I22) + Q; I33 = inv(P23) + inv(R); %% Create an KalmanFilter object -KF = gtsamKalmanFilter(2); +import gtsam.* +KF = KalmanFilter(2); %% Create the Kalman Filter initialization point x_initial = [0.0;0.0]; diff --git a/matlab/tests/testLocalizationExample.m b/matlab/tests/testLocalizationExample.m index 1efcde4a6..35c16d85f 100644 --- a/matlab/tests/testLocalizationExample.m +++ b/matlab/tests/testLocalizationExample.m @@ -11,30 +11,32 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add two odometry factors -odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +import gtsam.* +odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); %% Add three "GPS" measurements % We use Pose2 Priors here with high variance on theta -groundTruth = pose2SLAMValues; -groundTruth.insertPose(1, gtsamPose2(0.0, 0.0, 0.0)); -groundTruth.insertPose(2, gtsamPose2(2.0, 0.0, 0.0)); -groundTruth.insertPose(3, gtsamPose2(4.0, 0.0, 0.0)); -noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.1; 10]); +import gtsam.* +groundTruth = pose2SLAM.Values; +groundTruth.insertPose(1, Pose2(0.0, 0.0, 0.0)); +groundTruth.insertPose(2, Pose2(2.0, 0.0, 0.0)); +groundTruth.insertPose(3, Pose2(4.0, 0.0, 0.0)); +model = noiseModel.Diagonal.Sigmas([0.1; 0.1; 10]); for i=1:3 - graph.addPosePrior(i, groundTruth.pose(i), noiseModel); + graph.addPosePrior(i, groundTruth.pose(i), model); end %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate,0); diff --git a/matlab/tests/testOdometryExample.m b/matlab/tests/testOdometryExample.m index 21d83c35e..e793df9a8 100644 --- a/matlab/tests/testOdometryExample.m +++ b/matlab/tests/testOdometryExample.m @@ -11,24 +11,27 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add a Gaussian prior on pose x_1 -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta +import gtsam.* +priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add two odometry factors -odometry = gtsamPose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta +import gtsam.* +odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.addRelativePose(1, 2, odometry, odometryNoise); graph.addRelativePose(2, 3, odometry, odometryNoise); %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, 0.1)); +import gtsam.* +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate,0); @@ -37,4 +40,4 @@ marginals.marginalCovariance(1); %% Check first pose equality pose_1 = result.pose(1); -CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); +CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); diff --git a/matlab/tests/testPlanarSLAMExample.m b/matlab/tests/testPlanarSLAMExample.m index cb2517526..4c3e6c9da 100644 --- a/matlab/tests/testPlanarSLAMExample.m +++ b/matlab/tests/testPlanarSLAMExample.m @@ -24,45 +24,50 @@ i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); j1 = symbol('l',1); j2 = symbol('l',2); %% Create graph container and add factors to it -graph = planarSLAMGraph; +graph = planarSLAM.Graph; %% Add prior -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); +import gtsam.* +priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph %% Add odometry -odometry = gtsamPose2(2.0, 0.0, 0.0); -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); +import gtsam.* +odometry = Pose2(2.0, 0.0, 0.0); +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.addRelativePose(i1, i2, odometry, odometryNoise); graph.addRelativePose(i2, i3, odometry, odometryNoise); %% Add bearing/range measurement factors +import gtsam.* degrees = pi/180; -noiseModel = gtsamnoiseModelDiagonal.Sigmas([0.1; 0.2]); -graph.addBearingRange(i1, j1, gtsamRot2(45*degrees), sqrt(4+4), noiseModel); -graph.addBearingRange(i2, j1, gtsamRot2(90*degrees), 2, noiseModel); -graph.addBearingRange(i3, j2, gtsamRot2(90*degrees), 2, noiseModel); +brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); +graph.addBearingRange(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise); +graph.addBearingRange(i2, j1, Rot2(90*degrees), 2, brNoise); +graph.addBearingRange(i3, j2, Rot2(90*degrees), 2, brNoise); %% Initialize to noisy points -initialEstimate = planarSLAMValues; -initialEstimate.insertPose(i1, gtsamPose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(i2, gtsamPose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(i3, gtsamPose2(4.1, 0.1, 0.1)); -initialEstimate.insertPoint(j1, gtsamPoint2(1.8, 2.1)); -initialEstimate.insertPoint(j2, gtsamPoint2(4.1, 1.8)); +import gtsam.* +initialEstimate = planarSLAM.Values; +initialEstimate.insertPose(i1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insertPose(i2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insertPose(i3, Pose2(4.1, 0.1, 0.1)); +initialEstimate.insertPoint(j1, Point2(1.8, 2.1)); +initialEstimate.insertPoint(j2, Point2(4.1, 1.8)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate,0); marginals = graph.marginals(result); %% Check first pose and point equality +import gtsam.* pose_1 = result.pose(symbol('x',1)); marginals.marginalCovariance(symbol('x',1)); -CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); +CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); point_1 = result.point(symbol('l',1)); marginals.marginalCovariance(symbol('l',1)); -CHECK('point_1.equals(gtsamPoint2(2,2),1e-4)',point_1.equals(gtsamPoint2(2,2),1e-4)); +CHECK('point_1.equals(Point2(2,2),1e-4)',point_1.equals(Point2(2,2),1e-4)); diff --git a/matlab/tests/testPose2SLAMExample.m b/matlab/tests/testPose2SLAMExample.m index 41827c213..cd778cba3 100644 --- a/matlab/tests/testPose2SLAMExample.m +++ b/matlab/tests/testPose2SLAMExample.m @@ -19,33 +19,37 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAMGraph; +graph = pose2SLAM.Graph; %% Add prior +import gtsam.* % gaussian for prior -priorMean = gtsamPose2(0.0, 0.0, 0.0); % prior at origin -priorNoise = gtsamnoiseModelDiagonal.Sigmas([0.3; 0.3; 0.1]); +priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph %% Add odometry % general noisemodel for odometry -odometryNoise = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(1, 2, gtsamPose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addRelativePose(2, 3, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(3, 4, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(4, 5, gtsamPose2(2.0, 0.0, pi/2), odometryNoise); +import gtsam.* +odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); +graph.addRelativePose(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.addRelativePose(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise); %% Add pose constraint -model = gtsamnoiseModelDiagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(5, 2, gtsamPose2(2.0, 0.0, pi/2), model); +import gtsam.* +model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +graph.addRelativePose(5, 2, Pose2(2.0, 0.0, pi/2), model); %% Initialize to noisy points -initialEstimate = pose2SLAMValues; -initialEstimate.insertPose(1, gtsamPose2(0.5, 0.0, 0.2 )); -initialEstimate.insertPose(2, gtsamPose2(2.3, 0.1,-0.2 )); -initialEstimate.insertPose(3, gtsamPose2(4.1, 0.1, pi/2)); -initialEstimate.insertPose(4, gtsamPose2(4.0, 2.0, pi )); -initialEstimate.insertPose(5, gtsamPose2(2.1, 2.1,-pi/2)); +import gtsam.* +initialEstimate = pose2SLAM.Values; +initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2 )); +initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2 )); +initialEstimate.insertPose(3, Pose2(4.1, 0.1, pi/2)); +initialEstimate.insertPose(4, Pose2(4.0, 2.0, pi )); +initialEstimate.insertPose(5, Pose2(2.1, 2.1,-pi/2)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd result = graph.optimize(initialEstimate,0); @@ -56,9 +60,9 @@ marginals = graph.marginals(result); P = marginals.marginalCovariance(1); pose_1 = result.pose(1); -CHECK('pose_1.equals(gtsamPose2,1e-4)',pose_1.equals(gtsamPose2,1e-4)); +CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); poseSPCG_1 = resultSPCG.pose(1); -CHECK('poseSPCG_1.equals(gtsamPose2,1e-4)',poseSPCG_1.equals(gtsamPose2,1e-4)); +CHECK('poseSPCG_1.equals(Pose2,1e-4)',poseSPCG_1.equals(Pose2,1e-4)); diff --git a/matlab/tests/testPose3SLAMExample.m b/matlab/tests/testPose3SLAMExample.m index 97e8b1b42..ac3c0d5bb 100644 --- a/matlab/tests/testPose3SLAMExample.m +++ b/matlab/tests/testPose3SLAMExample.m @@ -11,15 +11,16 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create a hexagon of poses -hexagon = pose3SLAMValues.Circle(6,1.0); +hexagon = pose3SLAM.Values.Circle(6,1.0); p0 = hexagon.pose(0); p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement -fg = pose3SLAMGraph; +import gtsam.* +fg = pose3SLAM.Graph; fg.addPoseConstraint(0, p0); delta = p0.between(p1); -covariance = gtsamnoiseModelDiagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +covariance = noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); fg.addRelativePose(0,1, delta, covariance); fg.addRelativePose(1,2, delta, covariance); fg.addRelativePose(2,3, delta, covariance); @@ -28,7 +29,7 @@ fg.addRelativePose(4,5, delta, covariance); fg.addRelativePose(5,0, delta, covariance); %% Create initial config -initial = pose3SLAMValues; +initial = pose3SLAM.Values; s = 0.10; initial.insertPose(0, p0); initial.insertPose(1, hexagon.pose(1).retract(s*randn(6,1))); @@ -41,6 +42,6 @@ initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); result = fg.optimize(initial,0); pose_1 = result.pose(1); -CHECK('pose_1.equals(gtsamPose3,1e-4)',pose_1.equals(p1,1e-4)); +CHECK('pose_1.equals(Pose3,1e-4)',pose_1.equals(p1,1e-4)); diff --git a/matlab/tests/testSFMExample.m b/matlab/tests/testSFMExample.m index bcf6aca32..b3595dc18 100644 --- a/matlab/tests/testSFMExample.m +++ b/matlab/tests/testSFMExample.m @@ -20,10 +20,11 @@ measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; -graph = visualSLAMGraph; +graph = visualSLAM.Graph; %% Add factors for all measurements -measurementNoise = gtsamnoiseModelIsotropic.Sigma(2,measurementNoiseSigma); +import gtsam.* +measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; @@ -31,13 +32,13 @@ for i=1:length(data.Z) end end -posePriorNoise = gtsamnoiseModelDiagonal.Sigmas(poseNoiseSigmas); +posePriorNoise = noiseModel.Diagonal.Sigmas(poseNoiseSigmas); graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); -pointPriorNoise = gtsamnoiseModelIsotropic.Sigma(3,pointNoiseSigma); +pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); %% Initial estimate -initialEstimate = visualSLAMValues; +initialEstimate = visualSLAM.Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose; initialEstimate.insertPose(symbol('x',i), pose_i); @@ -48,7 +49,8 @@ for j=1:size(truth.points,2) end %% Optimization -parameters = gtsamLevenbergMarquardtParams; +import gtsam.* +parameters = LevenbergMarquardtParams; optimizer = graph.optimizer(initialEstimate, parameters); for i=1:5 optimizer.iterate(); diff --git a/matlab/tests/testStereoVOExample.m b/matlab/tests/testStereoVOExample.m index da9249128..69fba200d 100644 --- a/matlab/tests/testStereoVOExample.m +++ b/matlab/tests/testStereoVOExample.m @@ -22,38 +22,42 @@ x1 = symbol('x',1); x2 = symbol('x',2); l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); %% Create graph container and add factors to it -graph = visualSLAMGraph; +graph = visualSLAM.Graph; %% add a constraint on the starting pose -first_pose = gtsamPose3(); +import gtsam.* +first_pose = Pose3(); graph.addPoseConstraint(x1, first_pose); %% Create realistic calibration and measurement noise model % format: fx fy skew cx cy baseline -K = gtsamCal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); -stereo_model = gtsamnoiseModelDiagonal.Sigmas([1.0; 1.0; 1.0]); +import gtsam.* +K = Cal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); +stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); %% Add measurements +import gtsam.* % pose 1 -graph.addStereoMeasurement(gtsamStereoPoint2(520, 480, 440), stereo_model, x1, l1, K); -graph.addStereoMeasurement(gtsamStereoPoint2(120, 80, 440), stereo_model, x1, l2, K); -graph.addStereoMeasurement(gtsamStereoPoint2(320, 280, 140), stereo_model, x1, l3, K); +graph.addStereoMeasurement(StereoPoint2(520, 480, 440), stereo_model, x1, l1, K); +graph.addStereoMeasurement(StereoPoint2(120, 80, 440), stereo_model, x1, l2, K); +graph.addStereoMeasurement(StereoPoint2(320, 280, 140), stereo_model, x1, l3, K); %pose 2 -graph.addStereoMeasurement(gtsamStereoPoint2(570, 520, 490), stereo_model, x2, l1, K); -graph.addStereoMeasurement(gtsamStereoPoint2( 70, 20, 490), stereo_model, x2, l2, K); -graph.addStereoMeasurement(gtsamStereoPoint2(320, 270, 115), stereo_model, x2, l3, K); +graph.addStereoMeasurement(StereoPoint2(570, 520, 490), stereo_model, x2, l1, K); +graph.addStereoMeasurement(StereoPoint2( 70, 20, 490), stereo_model, x2, l2, K); +graph.addStereoMeasurement(StereoPoint2(320, 270, 115), stereo_model, x2, l3, K); %% Create initial estimate for camera poses and landmarks -initialEstimate = visualSLAMValues; +import gtsam.* +initialEstimate = visualSLAM.Values; initialEstimate.insertPose(x1, first_pose); % noisy estimate for pose 2 -initialEstimate.insertPose(x2, gtsamPose3(gtsamRot3(), gtsamPoint3(0.1,-.1,1.1))); -expected_l1 = gtsamPoint3( 1, 1, 5); +initialEstimate.insertPose(x2, Pose3(Rot3(), Point3(0.1,-.1,1.1))); +expected_l1 = Point3( 1, 1, 5); initialEstimate.insertPoint(l1, expected_l1); -initialEstimate.insertPoint(l2, gtsamPoint3(-1, 1, 5)); -initialEstimate.insertPoint(l3, gtsamPoint3( 0,-.5, 5)); +initialEstimate.insertPoint(l2, Point3(-1, 1, 5)); +initialEstimate.insertPoint(l3, Point3( 0,-.5, 5)); %% optimize result = graph.optimize(initialEstimate,0); diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp index 279050e25..6956b310b 100644 --- a/wrap/Argument.cpp +++ b/wrap/Argument.cpp @@ -48,7 +48,7 @@ void Argument::matlab_unwrap(FileWriter& file, const string& matlabName) const { file.oss << " "; string cppType = qualifiedType("::"); - string matlabType = qualifiedType(); + string matlabUniqueType = qualifiedType(); if (is_ptr) // A pointer: emit an "unwrap_shared_ptr" call which returns a pointer @@ -65,7 +65,7 @@ void Argument::matlab_unwrap(FileWriter& file, const string& matlabName) const { file.oss << cppType << " " << name << " = unwrap< "; file.oss << cppType << " >(" << matlabName; - if (is_ptr || is_ref) file.oss << ", \"ptr_" << matlabType << "\""; + if (is_ptr || is_ref) file.oss << ", \"ptr_" << matlabUniqueType << "\""; file.oss << ");" << endl; } diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 5f7d7aa6e..8e04543e4 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -24,6 +24,7 @@ #include // works on Linux GCC #include +#include #include #include "Class.h" @@ -34,29 +35,47 @@ using namespace std; using namespace wrap; /* ************************************************************************* */ -void Class::matlab_proxy(const string& classFile, const string& wrapperName, +void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, vector& functionNames) const { - // open destination classFile + + // Create namespace folders + { + using namespace boost::filesystem; + path curPath = toolboxPath; + BOOST_FOREACH(const string& subdir, namespaces) { + curPath /= "+" + subdir; + if(!is_directory(curPath)) + if(exists("+" + subdir)) + throw OutputError("Need to write files to directory " + curPath.string() + ", which already exists as a file but is not a directory"); + else + boost::filesystem::create_directory(curPath); + } + } + + // open destination classFile + string classFile = toolboxPath; + if(!namespaces.empty()) + classFile += "/+" + wrap::qualifiedName("/+", namespaces); + classFile += "/" + name + ".m"; FileWriter proxyFile(classFile, verbose_, "%"); // get the name of actual matlab object - const string matlabName = qualifiedName(), cppName = qualifiedName("::"); - const string matlabBaseName = wrap::qualifiedName("", qualifiedParent); + const string matlabQualName = qualifiedName("."), matlabUniqueName = qualifiedName(), cppName = qualifiedName("::"); + const string matlabBaseName = wrap::qualifiedName(".", qualifiedParent); const string cppBaseName = wrap::qualifiedName("::", qualifiedParent); // emit class proxy code // we want our class to inherit the handle class for memory purposes - const string parent = qualifiedParent.empty() ? - "handle" : ::wrap::qualifiedName("", qualifiedParent); - proxyFile.oss << "classdef " << matlabName << " < " << parent << endl; + const string parent = qualifiedParent.empty() ? "handle" : matlabBaseName; + proxyFile.oss << "classdef " << name << " < " << parent << endl; proxyFile.oss << " properties" << endl; - proxyFile.oss << " ptr_" << matlabName << " = 0" << endl; + proxyFile.oss << " ptr_" << matlabUniqueName << " = 0" << endl; proxyFile.oss << " end" << endl; proxyFile.oss << " methods" << endl; // Constructor - proxyFile.oss << " function obj = " << matlabName << "(varargin)" << endl; + proxyFile.oss << " function obj = " << name << "(varargin)" << endl; // Special pointer constructors - one in MATLAB to create an object and // assign a pointer returned from a C++ function. In turn this MATLAB // constructor calls a special C++ function that just adds the object to @@ -70,26 +89,26 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, BOOST_FOREACH(ArgumentList a, constructor.args_list) { const int id = (int)functionNames.size(); - constructor.proxy_fragment(proxyFile, wrapperName, matlabName, matlabBaseName, id, a); + constructor.proxy_fragment(proxyFile, wrapperName, !qualifiedParent.empty(), id, a); const string wrapFunctionName = constructor.wrapper_fragment(wrapperFile, - cppName, matlabName, cppBaseName, id, using_namespaces, a); + cppName, matlabUniqueName, cppBaseName, id, using_namespaces, a); wrapperFile.oss << "\n"; functionNames.push_back(wrapFunctionName); } proxyFile.oss << " else\n"; - proxyFile.oss << " error('Arguments do not match any overload of " << matlabName << " constructor');" << endl; + proxyFile.oss << " error('Arguments do not match any overload of " << matlabQualName << " constructor');" << endl; proxyFile.oss << " end\n"; if(!qualifiedParent.empty()) proxyFile.oss << " obj = obj@" << matlabBaseName << "(uint64(" << ptr_constructor_key << "), base_ptr);\n"; - proxyFile.oss << " obj.ptr_" << matlabName << " = my_ptr;\n"; + proxyFile.oss << " obj.ptr_" << matlabUniqueName << " = my_ptr;\n"; proxyFile.oss << " end\n\n"; // Deconstructor { const int id = (int)functionNames.size(); - deconstructor.proxy_fragment(proxyFile, wrapperName, matlabName, id); + deconstructor.proxy_fragment(proxyFile, wrapperName, matlabUniqueName, id); proxyFile.oss << "\n"; - const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabName, id, using_namespaces); + const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabUniqueName, id, using_namespaces); wrapperFile.oss << "\n"; functionNames.push_back(functionName); } @@ -99,7 +118,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, // Methods BOOST_FOREACH(const Methods::value_type& name_m, methods) { const Method& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, typeAttributes, functionNames); + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, using_namespaces, typeAttributes, functionNames); proxyFile.oss << "\n"; wrapperFile.oss << "\n"; } @@ -111,7 +130,7 @@ void Class::matlab_proxy(const string& classFile, const string& wrapperName, // Static methods BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { const StaticMethod& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabName, wrapperName, using_namespaces, typeAttributes, functionNames); + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, using_namespaces, typeAttributes, functionNames); proxyFile.oss << "\n"; wrapperFile.oss << "\n"; } @@ -131,19 +150,18 @@ string Class::qualifiedName(const string& delim) const { /* ************************************************************************* */ void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& wrapperName, vector& functionNames) const { - const string matlabName = qualifiedName(), cppName = qualifiedName("::"); - const string baseMatlabName = wrap::qualifiedName("", qualifiedParent); + const string matlabUniqueName = qualifiedName(), cppName = qualifiedName("::"); const string baseCppName = wrap::qualifiedName("::", qualifiedParent); const int collectorInsertId = (int)functionNames.size(); - const string collectorInsertFunctionName = matlabName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(collectorInsertId); + const string collectorInsertFunctionName = matlabUniqueName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(collectorInsertId); functionNames.push_back(collectorInsertFunctionName); int upcastFromVoidId; string upcastFromVoidFunctionName; if(isVirtual) { upcastFromVoidId = (int)functionNames.size(); - upcastFromVoidFunctionName = matlabName + "_upcastFromVoid_" + boost::lexical_cast(upcastFromVoidId); + upcastFromVoidFunctionName = matlabUniqueName + "_upcastFromVoid_" + boost::lexical_cast(upcastFromVoidId); functionNames.push_back(upcastFromVoidFunctionName); } @@ -184,7 +202,7 @@ void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wra // Get self pointer passed in wrapperFile.oss << " Shared *self = *reinterpret_cast (mxGetData(in[0]));\n"; // Add to collector - wrapperFile.oss << " collector_" << matlabName << ".insert(self);\n"; + wrapperFile.oss << " collector_" << matlabUniqueName << ".insert(self);\n"; // If we have a base class, return the base class pointer (MATLAB will call the base class collectorInsertAndMakeBase to add this to the collector and recurse the heirarchy) if(!qualifiedParent.empty()) { wrapperFile.oss << "\n"; diff --git a/wrap/Class.h b/wrap/Class.h index 9a6ca12c7..c41cbb470 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -53,7 +53,7 @@ struct Class { bool verbose_; ///< verbose flag // And finally MATLAB code is emitted, methods below called by Module::matlab_code - void matlab_proxy(const std::string& classFile, const std::string& wrapperName, const TypeAttributesTable& typeAttributes, + void matlab_proxy(const std::string& toolboxPath, const std::string& wrapperName, const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, std::vector& functionNames) const; ///< emit proxy class std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index afb35f62d..274180e08 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -38,7 +38,7 @@ string Constructor::matlab_wrapper_name(const string& className) const { /* ************************************************************************* */ void Constructor::proxy_fragment(FileWriter& file, const std::string& wrapperName, - const string& matlabName, const string& matlabBaseName, const int id, const ArgumentList args) const { + bool hasParent, const int id, const ArgumentList args) const { size_t nrArgs = args.size(); // check for number of arguments... file.oss << " elseif nargin == " << nrArgs; @@ -47,14 +47,14 @@ void Constructor::proxy_fragment(FileWriter& file, const std::string& wrapperNam bool first = true; for(size_t i=0;i& using_namespaces, const ArgumentList& al) const { - const string wrapFunctionName = matlabClassName + "_constructor_" + boost::lexical_cast(id); + const string wrapFunctionName = matlabUniqueName + "_constructor_" + boost::lexical_cast(id); file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; file.oss << "{\n"; @@ -87,7 +87,7 @@ string Constructor::wrapper_fragment(FileWriter& file, if(al.size() > 0) al.matlab_unwrap(file); // unwrap arguments file.oss << " Shared *self = new Shared(new " << cppClassName << "(" << al.names() << "));" << endl; - file.oss << " collector_" << matlabClassName << ".insert(self);\n"; + file.oss << " collector_" << matlabUniqueName << ".insert(self);\n"; if(verbose_) file.oss << " std::cout << \"constructed \" << self << \" << std::endl;" << endl; diff --git a/wrap/Constructor.h b/wrap/Constructor.h index 50d0c41f5..e2eca1291 100644 --- a/wrap/Constructor.h +++ b/wrap/Constructor.h @@ -50,13 +50,12 @@ struct Constructor { * if nargin == 2, obj.self = new_Pose3_RP(varargin{1},varargin{2}); end */ void proxy_fragment(FileWriter& file, const std::string& wrapperName, - const std::string& className, const std::string& matlabBaseName, const int id, - const ArgumentList args) const; + bool hasParent, const int id, const ArgumentList args) const; /// cpp wrapper std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, - const std::string& matlabClassName, + const std::string& matlabUniqueName, const std::string& cppBaseClassName, int id, const std::vector& using_namespaces, diff --git a/wrap/Deconstructor.cpp b/wrap/Deconstructor.cpp index c02ab0e93..c9239ee74 100644 --- a/wrap/Deconstructor.cpp +++ b/wrap/Deconstructor.cpp @@ -37,23 +37,23 @@ string Deconstructor::matlab_wrapper_name(const string& className) const { /* ************************************************************************* */ void Deconstructor::proxy_fragment(FileWriter& file, const std::string& wrapperName, - const std::string& qualifiedMatlabName, int id) const { + const std::string& matlabUniqueName, int id) const { file.oss << " function delete(obj)\n"; - file.oss << " " << wrapperName << "(" << id << ", obj.ptr_" << qualifiedMatlabName << ");\n"; + file.oss << " " << wrapperName << "(" << id << ", obj.ptr_" << matlabUniqueName << ");\n"; file.oss << " end\n"; } /* ************************************************************************* */ string Deconstructor::wrapper_fragment(FileWriter& file, const string& cppClassName, - const string& matlabClassName, + const string& matlabUniqueName, int id, const vector& using_namespaces) const { - const string matlabName = matlab_wrapper_name(matlabClassName); + const string matlabName = matlab_wrapper_name(matlabUniqueName); - const string wrapFunctionName = matlabClassName + "_deconstructor_" + boost::lexical_cast(id); + const string wrapFunctionName = matlabUniqueName + "_deconstructor_" + boost::lexical_cast(id); file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; file.oss << "{" << endl; @@ -62,11 +62,11 @@ string Deconstructor::wrapper_fragment(FileWriter& file, //Deconstructor takes 1 arg, the mxArray obj file.oss << " checkArguments(\"" << matlabName << "\",nargout,nargin," << "1" << ");" << endl; file.oss << " Shared *self = *reinterpret_cast(mxGetData(in[0]));\n"; - file.oss << " Collector_" << matlabClassName << "::iterator item;\n"; - file.oss << " item = collector_" << matlabClassName << ".find(self);\n"; - file.oss << " if(item != collector_" << matlabClassName << ".end()) {\n"; + file.oss << " Collector_" << matlabUniqueName << "::iterator item;\n"; + file.oss << " item = collector_" << matlabUniqueName << ".find(self);\n"; + file.oss << " if(item != collector_" << matlabUniqueName << ".end()) {\n"; file.oss << " delete self;\n"; - file.oss << " collector_" << matlabClassName << ".erase(item);\n"; + file.oss << " collector_" << matlabUniqueName << ".erase(item);\n"; file.oss << " }\n"; file.oss << "}" << endl; diff --git a/wrap/Deconstructor.h b/wrap/Deconstructor.h index 1ef5b80b0..0d7dadaad 100644 --- a/wrap/Deconstructor.h +++ b/wrap/Deconstructor.h @@ -48,12 +48,12 @@ struct Deconstructor { /// m-file void proxy_fragment(FileWriter& file, const std::string& wrapperName, - const std::string& qualifiedMatlabName, int id) const; + const std::string& matlabUniqueName, int id) const; /// cpp wrapper std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, - const std::string& matlabClassName, + const std::string& matlabUniqueName, int id, const std::vector& using_namespaces) const; }; diff --git a/wrap/Method.cpp b/wrap/Method.cpp index f7ee5c71c..eb143b4dc 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -39,7 +39,8 @@ void Method::addOverload(bool verbose, bool is_const, const std::string& name, void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& cppClassName, - const string& matlabClassName, + const std::string& matlabQualName, + const std::string& matlabUniqueName, const string& wrapperName, const vector& using_namespaces, const TypeAttributesTable& typeAttributes, @@ -63,7 +64,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF bool first = true; for(size_t i=0;i& using_namespaces, @@ -107,7 +108,7 @@ string Method::wrapper_fragment(FileWriter& file, // generate code - const string wrapFunctionName = matlabClassName + "_" + name + "_" + boost::lexical_cast(id); + const string wrapFunctionName = matlabUniqueName + "_" + name + "_" + boost::lexical_cast(id); const ArgumentList& args = argLists[overload]; const ReturnValue& returnVal = returnVals[overload]; @@ -138,7 +139,7 @@ string Method::wrapper_fragment(FileWriter& file, // get class pointer // example: shared_ptr = unwrap_shared_ptr< Test >(in[0], "Test"); - file.oss << " Shared obj = unwrap_shared_ptr<" << cppClassName << ">(in[0], \"ptr_" << matlabClassName << "\");" << endl; + file.oss << " Shared obj = unwrap_shared_ptr<" << cppClassName << ">(in[0], \"ptr_" << matlabUniqueName << "\");" << endl; // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,1); diff --git a/wrap/Method.h b/wrap/Method.h index c23fd7c3d..e23a24186 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -50,7 +50,7 @@ struct Method { // MATLAB code generation // classPath is class directory, e.g., ../matlab/@Point2 void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, - const std::string& cppClassName, const std::string& matlabClassName, + const std::string& cppClassName, const std::string& matlabQualName, const std::string& matlabUniqueName, const std::string& wrapperName, const std::vector& using_namespaces, const TypeAttributesTable& typeAttributes, std::vector& functionNames) const; @@ -58,7 +58,7 @@ struct Method { private: std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, - const std::string& matlabClassname, + const std::string& matlabUniqueName, int overload, int id, const std::vector& using_namespaces, diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 8ad476cd3..1f077b31f 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -14,7 +14,7 @@ * @author Frank Dellaert * @author Alex Cunningham * @author Andrew Melim - * @author Richard Roberts + * @author Richard Roberts **/ #include "Module.h" @@ -448,8 +448,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // create proxy class and wrapper code BOOST_FOREACH(const Class& cls, expandedClasses) { - string classFile = toolboxPath + "/" + cls.qualifiedName() + ".m"; - cls.matlab_proxy(classFile, wrapperName, typeAttributes, wrapperFile, functionNames); + cls.matlab_proxy(toolboxPath, wrapperName, typeAttributes, wrapperFile, functionNames); } // finish wrapper file @@ -527,11 +526,12 @@ vector Module::GenerateValidTypes(const vector& classes, const ve void Module::WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { // Generate all collectors BOOST_FOREACH(const Class& cls, classes) { - const string matlabName = cls.qualifiedName(), cppName = cls.qualifiedName("::"); + const string matlabUniqueName = cls.qualifiedName(), + cppName = cls.qualifiedName("::"); wrapperFile.oss << "typedef std::set*> " - << "Collector_" << matlabName << ";\n"; - wrapperFile.oss << "static Collector_" << matlabName << - " collector_" << matlabName << ";\n"; + << "Collector_" << matlabUniqueName << ";\n"; + wrapperFile.oss << "static Collector_" << matlabUniqueName << + " collector_" << matlabUniqueName << ";\n"; } // generate mexAtExit cleanup function @@ -542,10 +542,10 @@ void Module::WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::st " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n" " bool anyDeleted = false;\n"; BOOST_FOREACH(const Class& cls, classes) { - const string matlabName = cls.qualifiedName(); + const string matlabUniqueName = cls.qualifiedName(); const string cppName = cls.qualifiedName("::"); - const string collectorType = "Collector_" + matlabName; - const string collectorName = "collector_" + matlabName; + const string collectorType = "Collector_" + matlabUniqueName; + const string collectorName = "collector_" + matlabUniqueName; wrapperFile.oss << " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n" " iter != " << collectorName << ".end(); ) {\n" @@ -574,7 +574,7 @@ void Module::WriteRTTIRegistry(FileWriter& wrapperFile, const std::string& modul BOOST_FOREACH(const Class& cls, classes) { if(cls.isVirtual) wrapperFile.oss << - " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n"; + " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName(".") << "\"));\n"; } wrapperFile.oss << "\n"; diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index a3efb094e..c209a3131 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -48,8 +48,8 @@ string ReturnValue::qualifiedType2(const string& delim) const { /* ************************************************************************* */ //TODO:Fix this void ReturnValue::wrap_result(const string& result, FileWriter& file, const TypeAttributesTable& typeAttributes) const { - string cppType1 = qualifiedType1("::"), matlabType1 = qualifiedType1(); - string cppType2 = qualifiedType2("::"), matlabType2 = qualifiedType2(); + string cppType1 = qualifiedType1("::"), matlabType1 = qualifiedType1("."); + string cppType2 = qualifiedType2("::"), matlabType2 = qualifiedType2("."); if (isPair) { // first return value in pair diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 19dcd375e..fcef79857 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -40,7 +40,8 @@ void StaticMethod::addOverload(bool verbose, const std::string& name, void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& cppClassName, - const string& matlabClassName, + const std::string& matlabQualName, + const std::string& matlabUniqueName, const string& wrapperName, const vector& using_namespaces, const TypeAttributesTable& typeAttributes, @@ -66,7 +67,7 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr bool first = true; for(size_t i=0;i& using_namespaces, @@ -110,7 +111,7 @@ string StaticMethod::wrapper_fragment(FileWriter& file, // generate code - const string wrapFunctionName = matlabClassName + "_" + name + "_" + boost::lexical_cast(id); + const string wrapFunctionName = matlabUniqueName + "_" + name + "_" + boost::lexical_cast(id); const ArgumentList& args = argLists[overload]; const ReturnValue& returnVal = returnVals[overload]; @@ -136,7 +137,7 @@ string StaticMethod::wrapper_fragment(FileWriter& file, // check arguments // NOTE: for static functions, there is no object passed - file.oss << " checkArguments(\"" << matlabClassName << "." << name << "\",nargout,nargin," << args.size() << ");\n"; + file.oss << " checkArguments(\"" << matlabUniqueName << "." << name << "\",nargout,nargin," << args.size() << ");\n"; // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,0); // We start at 0 because there is no self object diff --git a/wrap/StaticMethod.h b/wrap/StaticMethod.h index 8951f965b..55d9f3e99 100644 --- a/wrap/StaticMethod.h +++ b/wrap/StaticMethod.h @@ -50,7 +50,7 @@ struct StaticMethod { // MATLAB code generation // classPath is class directory, e.g., ../matlab/@Point2 void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, - const std::string& cppClassName, const std::string& matlabClassName, + const std::string& cppClassName, const std::string& matlabQualName, const std::string& matlabUniqueName, const std::string& wrapperName, const std::vector& using_namespaces, const TypeAttributesTable& typeAttributes, std::vector& functionNames) const; @@ -58,7 +58,7 @@ struct StaticMethod { private: std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, - const std::string& matlabClassname, + const std::string& matlabUniqueName, int overload, int id, const std::vector& using_namespaces, diff --git a/wrap/tests/expected_namespaces/ns1ClassA.m b/wrap/tests/expected_namespaces/+ns1/ClassA.m similarity index 80% rename from wrap/tests/expected_namespaces/ns1ClassA.m rename to wrap/tests/expected_namespaces/+ns1/ClassA.m index 29f48ab4e..f0682c815 100644 --- a/wrap/tests/expected_namespaces/ns1ClassA.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassA.m @@ -1,17 +1,17 @@ % automatically generated by wrap -classdef ns1ClassA < handle +classdef ClassA < handle properties ptr_ns1ClassA = 0 end methods - function obj = ns1ClassA(varargin) + function obj = ClassA(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) my_ptr = varargin{2}; testNamespaces_wrapper(0, my_ptr); elseif nargin == 0 my_ptr = testNamespaces_wrapper(1); else - error('Arguments do not match any overload of ns1ClassA constructor'); + error('Arguments do not match any overload of ns1.ClassA constructor'); end obj.ptr_ns1ClassA = my_ptr; end diff --git a/wrap/tests/expected_namespaces/ns1ClassB.m b/wrap/tests/expected_namespaces/+ns1/ClassB.m similarity index 80% rename from wrap/tests/expected_namespaces/ns1ClassB.m rename to wrap/tests/expected_namespaces/+ns1/ClassB.m index a1e9bc9a5..a263bc1e8 100644 --- a/wrap/tests/expected_namespaces/ns1ClassB.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassB.m @@ -1,17 +1,17 @@ % automatically generated by wrap -classdef ns1ClassB < handle +classdef ClassB < handle properties ptr_ns1ClassB = 0 end methods - function obj = ns1ClassB(varargin) + function obj = ClassB(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) my_ptr = varargin{2}; testNamespaces_wrapper(3, my_ptr); elseif nargin == 0 my_ptr = testNamespaces_wrapper(4); else - error('Arguments do not match any overload of ns1ClassB constructor'); + error('Arguments do not match any overload of ns1.ClassB constructor'); end obj.ptr_ns1ClassB = my_ptr; end diff --git a/wrap/tests/expected_namespaces/ns2ns3ClassB.m b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m similarity index 79% rename from wrap/tests/expected_namespaces/ns2ns3ClassB.m rename to wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m index b5e57ea19..2c19e13a8 100644 --- a/wrap/tests/expected_namespaces/ns2ns3ClassB.m +++ b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m @@ -1,17 +1,17 @@ % automatically generated by wrap -classdef ns2ns3ClassB < handle +classdef ClassB < handle properties ptr_ns2ns3ClassB = 0 end methods - function obj = ns2ns3ClassB(varargin) + function obj = ClassB(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) my_ptr = varargin{2}; testNamespaces_wrapper(13, my_ptr); elseif nargin == 0 my_ptr = testNamespaces_wrapper(14); else - error('Arguments do not match any overload of ns2ns3ClassB constructor'); + error('Arguments do not match any overload of ns2.ns3.ClassB constructor'); end obj.ptr_ns2ns3ClassB = my_ptr; end diff --git a/wrap/tests/expected_namespaces/ns2ClassA.m b/wrap/tests/expected_namespaces/+ns2/ClassA.m similarity index 84% rename from wrap/tests/expected_namespaces/ns2ClassA.m rename to wrap/tests/expected_namespaces/+ns2/ClassA.m index 7b3df9ed6..e7a074c08 100644 --- a/wrap/tests/expected_namespaces/ns2ClassA.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassA.m @@ -1,17 +1,17 @@ % automatically generated by wrap -classdef ns2ClassA < handle +classdef ClassA < handle properties ptr_ns2ClassA = 0 end methods - function obj = ns2ClassA(varargin) + function obj = ClassA(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) my_ptr = varargin{2}; testNamespaces_wrapper(6, my_ptr); elseif nargin == 0 my_ptr = testNamespaces_wrapper(7); else - error('Arguments do not match any overload of ns2ClassA constructor'); + error('Arguments do not match any overload of ns2.ClassA constructor'); end obj.ptr_ns2ClassA = my_ptr; end @@ -28,15 +28,15 @@ classdef ns2ClassA < handle if length(varargin) == 0 varargout{1} = testNamespaces_wrapper(9, this, varargin{:}); else - error('Arguments do not match any overload of function ns2ClassA.memberFunction'); + error('Arguments do not match any overload of function ns2.ClassA.memberFunction'); end end function varargout = nsArg(this, varargin) - if length(varargin) == 1 && isa(varargin{1},'ns1ClassB') + if length(varargin) == 1 && isa(varargin{1},'ns1.ClassB') varargout{1} = testNamespaces_wrapper(10, this, varargin{:}); else - error('Arguments do not match any overload of function ns2ClassA.nsArg'); + error('Arguments do not match any overload of function ns2.ClassA.nsArg'); end end @@ -44,7 +44,7 @@ classdef ns2ClassA < handle if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = testNamespaces_wrapper(11, this, varargin{:}); else - error('Arguments do not match any overload of function ns2ClassA.nsReturn'); + error('Arguments do not match any overload of function ns2.ClassA.nsReturn'); end end @@ -55,7 +55,7 @@ classdef ns2ClassA < handle if length(varargin) == 0 varargout{1} = testNamespaces_wrapper(12, varargin{:}); else - error('Arguments do not match any overload of function ns2ClassA.Afunction'); + error('Arguments do not match any overload of function ns2.ClassA.Afunction'); end end diff --git a/wrap/tests/expected_namespaces/ns2ClassC.m b/wrap/tests/expected_namespaces/+ns2/ClassC.m similarity index 80% rename from wrap/tests/expected_namespaces/ns2ClassC.m rename to wrap/tests/expected_namespaces/+ns2/ClassC.m index 5ba6e7125..f56a9c5cb 100644 --- a/wrap/tests/expected_namespaces/ns2ClassC.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassC.m @@ -1,17 +1,17 @@ % automatically generated by wrap -classdef ns2ClassC < handle +classdef ClassC < handle properties ptr_ns2ClassC = 0 end methods - function obj = ns2ClassC(varargin) + function obj = ClassC(varargin) if nargin == 2 && isa(varargin{1}, 'uint64') && varargin{1} == uint64(5139824614673773682) my_ptr = varargin{2}; testNamespaces_wrapper(16, my_ptr); elseif nargin == 0 my_ptr = testNamespaces_wrapper(17); else - error('Arguments do not match any overload of ns2ClassC constructor'); + error('Arguments do not match any overload of ns2.ClassC constructor'); end obj.ptr_ns2ClassC = my_ptr; end diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 6e65b1a0f..3eb0b0311 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -223,7 +223,7 @@ void ns2ClassA_nsReturn_11(int nargout, mxArray *out[], int nargin, const mxArra checkArguments("nsReturn",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_ns2ClassA"); double q = unwrap< double >(in[1]); - out[0] = wrap_shared_ptr(SharedClassB(new ns2::ns3::ClassB(obj->nsReturn(q))),"ns2ns3ClassB", false); + out[0] = wrap_shared_ptr(SharedClassB(new ns2::ns3::ClassB(obj->nsReturn(q))),"ns2.ns3.ClassB", false); } void ns2ClassA_afunction_12(int nargout, mxArray *out[], int nargin, const mxArray *in[]) diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 4aa5b6f58..0ed1f84ef 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -227,11 +227,11 @@ TEST( wrap, matlab_code_namespaces ) { EXPECT(files_equal(exp_path + "ClassD.m" , act_path + "ClassD.m" )); - EXPECT(files_equal(exp_path + "ns1ClassA.m" , act_path + "ns1ClassA.m" )); - EXPECT(files_equal(exp_path + "ns1ClassB.m" , act_path + "ns1ClassB.m" )); - EXPECT(files_equal(exp_path + "ns2ClassA.m" , act_path + "ns2ClassA.m" )); - EXPECT(files_equal(exp_path + "ns2ClassC.m" , act_path + "ns2ClassC.m" )); - EXPECT(files_equal(exp_path + "ns2ns3ClassB.m" , act_path + "ns2ns3ClassB.m" )); + EXPECT(files_equal(exp_path + "+ns1/ClassA.m" , act_path + "+ns1/ClassA.m" )); + EXPECT(files_equal(exp_path + "+ns1/ClassB.m" , act_path + "+ns1/ClassB.m" )); + EXPECT(files_equal(exp_path + "+ns2/ClassA.m" , act_path + "+ns2/ClassA.m" )); + EXPECT(files_equal(exp_path + "+ns2/ClassC.m" , act_path + "+ns2/ClassC.m" )); + EXPECT(files_equal(exp_path + "+ns2/+ns3/ClassB.m" , act_path + "+ns2/+ns3/ClassB.m" )); EXPECT(files_equal(exp_path + "testNamespaces_wrapper.cpp" , act_path + "testNamespaces_wrapper.cpp" )); } diff --git a/wrap/utilities.h b/wrap/utilities.h index 0a252484f..7e28d6793 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -41,6 +41,15 @@ class CantOpenFile : public std::exception { virtual const char* what() const throw() { return what_.c_str(); } }; +class OutputError : public std::exception { +private: + const std::string what_; +public: + OutputError(const std::string& what) : what_(what) {} + ~OutputError() throw() {} + virtual const char* what() const throw() { return what_.c_str(); } +}; + class ParseFailed : public std::exception { private: const std::string what_; From 11981dd8288bd2b6dede905c30e32034c9b0df76 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 18 Jul 2012 18:50:24 +0000 Subject: [PATCH 639/914] Had accidently switched trunk gtsam to a cmake-libs branch - moved svn:externals pointer back to cmake-libs trunk From 9dadbebbd14d088ef51ba80531a589b558130696 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 18 Jul 2012 23:35:36 +0000 Subject: [PATCH 640/914] Wrapped DoglegOptimizer and LevenbergMarquardtOptimizer, added class heirarchy to optimization parameters --- gtsam.h | 85 ++++++++++++++++++++++------- gtsam/nonlinear/DoglegOptimizer.cpp | 23 ++++++++ gtsam/nonlinear/DoglegOptimizer.h | 11 +++- 3 files changed, 98 insertions(+), 21 deletions(-) diff --git a/gtsam.h b/gtsam.h index f32b12131..b6b48e795 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1130,32 +1130,46 @@ class Marginals { Matrix marginalInformation(size_t variable) const; }; -#include -class LevenbergMarquardtParams { - LevenbergMarquardtParams(); - void print(string s) const; +//************************************************************************* +// Nonlinear optimizers +//************************************************************************* - size_t getMaxIterations() const; - double getRelativeErrorTol() const; - double getAbsoluteErrorTol() const; - double getErrorTol() const; - string getVerbosity() const; +#include +virtual class NonlinearOptimizerParams { + NonlinearOptimizerParams(); + void print(string s) const; - void setMaxIterations(size_t value); - void setRelativeErrorTol(double value); - void setAbsoluteErrorTol(double value); - void setErrorTol(double value); - void setVerbosity(string s); + size_t getMaxIterations() const; + double getRelativeErrorTol() const; + double getAbsoluteErrorTol() const; + double getErrorTol() const; + string getVerbosity() const; + + void setMaxIterations(size_t value); + void setRelativeErrorTol(double value); + void setAbsoluteErrorTol(double value); + void setErrorTol(double value); + void setVerbosity(string s); +}; + +#include +virtual class SuccessiveLinearizationParams : gtsam::NonlinearOptimizerParams { + SuccessiveLinearizationParams(); bool isMultifrontal() const; bool isSequential() const; bool isCholmod() const; bool isCG() const; +}; - double getlambdaInitial() const ; - double getlambdaFactor() const ; +#include +virtual class LevenbergMarquardtParams : gtsam::SuccessiveLinearizationParams { + LevenbergMarquardtParams(); + + double getlambdaInitial() const; + double getlambdaFactor() const; double getlambdaUpperBound() const; - string getVerbosityLM() const ; + string getVerbosityLM() const; void setlambdaInitial(double value); void setlambdaFactor(double value); @@ -1163,22 +1177,53 @@ class LevenbergMarquardtParams { void setVerbosityLM(string s); }; +#include +virtual class DoglegParams : gtsam::SuccessiveLinearizationParams { + DoglegParams(); + + double getDeltaInitial() const; + string getVerbosityDL() const; + + void setDeltaInitial(double deltaInitial) const; + void setVerbosityDL(string verbosityDL) const; +}; + +virtual class NonlinearOptimizer { + gtsam::Values optimizeSafely(); + double error() const; + int iterations() const; + gtsam::Values values() const; + void iterate() const; +}; + +virtual class DoglegOptimizer : gtsam::NonlinearOptimizer { + DoglegOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues); + DoglegOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues, const gtsam::DoglegParams& params); + double getDelta() const; +}; + +virtual class LevenbergMarquardtOptimizer : gtsam::NonlinearOptimizer { + LevenbergMarquardtOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues); + LevenbergMarquardtOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues, const gtsam::LevenbergMarquardtParams& params); + double lambda() const; +}; + //************************************************************************* // Nonlinear factor types //************************************************************************* -template +template virtual class PriorFactor : gtsam::NonlinearFactor { PriorFactor(size_t key, const T& prior, const gtsam::noiseModel::Base* noiseModel); }; -template +template virtual class BetweenFactor : gtsam::NonlinearFactor { BetweenFactor(size_t key1, size_t key2, const T& relativePose, const gtsam::noiseModel::Base* noiseModel); }; -template +template virtual class NonlinearEquality : gtsam::NonlinearFactor { // Constructor - forces exact evaluation NonlinearEquality(size_t j, const T& feasible); diff --git a/gtsam/nonlinear/DoglegOptimizer.cpp b/gtsam/nonlinear/DoglegOptimizer.cpp index b0ee9f460..e3f4e4dcd 100644 --- a/gtsam/nonlinear/DoglegOptimizer.cpp +++ b/gtsam/nonlinear/DoglegOptimizer.cpp @@ -22,10 +22,33 @@ #include #include +#include + using namespace std; namespace gtsam { +/* ************************************************************************* */ +DoglegParams::VerbosityDL DoglegParams::verbosityDLTranslator(const std::string &verbosityDL) const { + std::string s = verbosityDL; boost::algorithm::to_upper(s); + if (s == "SILENT") return DoglegParams::SILENT; + if (s == "VERBOSE") return DoglegParams::VERBOSE; + + /* default is silent */ + return DoglegParams::SILENT; +} + +/* ************************************************************************* */ +std::string DoglegParams::verbosityDLTranslator(VerbosityDL verbosityDL) const { + std::string s; + switch (verbosityDL) { + case DoglegParams::SILENT: s = "SILENT"; break; + case DoglegParams::VERBOSE: s = "VERBOSE"; break; + default: s = "UNDEFINED"; break; + } + return s; +} + /* ************************************************************************* */ void DoglegOptimizer::iterate(void) { diff --git a/gtsam/nonlinear/DoglegOptimizer.h b/gtsam/nonlinear/DoglegOptimizer.h index 065d0b34d..8a21dd96e 100644 --- a/gtsam/nonlinear/DoglegOptimizer.h +++ b/gtsam/nonlinear/DoglegOptimizer.h @@ -50,6 +50,15 @@ public: std::cout << " deltaInitial: " << deltaInitial << "\n"; std::cout.flush(); } + + double getDeltaInitial() const { return deltaInitial; } + std::string getVerbosityDL() const { return verbosityDLTranslator(verbosityDL); } + + void setDeltaInitial(double deltaInitial) { this->deltaInitial = deltaInitial; } + void setVerbosityDL(const std::string& verbosityDL) { this->verbosityDL = verbosityDLTranslator(verbosityDL); } + + VerbosityDL verbosityDLTranslator(const std::string& verbosityDL) const; + std::string verbosityDLTranslator(VerbosityDL verbosityDL) const; }; /** @@ -128,7 +137,7 @@ public: const DoglegState& state() const { return state_; } /** Access the current trust region radius Delta */ - double Delta() const { return state_.Delta; } + double getDelta() const { return state_.Delta; } /// @} From c86548534242f3c25c6ca9625c1711c6bda84518 Mon Sep 17 00:00:00 2001 From: Vadim Indelman Date: Thu, 19 Jul 2012 15:11:11 +0000 Subject: [PATCH 641/914] Richard's changes of RangeFactor. --- gtsam.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/gtsam.h b/gtsam.h index b6b48e795..a658c6376 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1237,10 +1237,14 @@ virtual class RangeFactor : gtsam::NonlinearFactor { RangeFactor(size_t key1, size_t key2, double measured, const gtsam::noiseModel::Base* noiseModel); }; -typedef gtsam::RangeFactor RangeFactor2D; -typedef gtsam::RangeFactor RangeFactor3D; -typedef gtsam::RangeFactor RangeFactorCalibratedCamera; -typedef gtsam::RangeFactor RangeFactorSimpleCamera; +typedef gtsam::RangeFactor RangeFactorPosePoint2; +typedef gtsam::RangeFactor RangeFactorPosePoint3; +typedef gtsam::RangeFactor RangeFactorPose2; +typedef gtsam::RangeFactor RangeFactorPose3; +typedef gtsam::RangeFactor RangeFactorCalibratedCameraPoint; +typedef gtsam::RangeFactor RangeFactorSimpleCameraPoint; +typedef gtsam::RangeFactor RangeFactorCalibratedCamera; +typedef gtsam::RangeFactor RangeFactorSimpleCamera; template virtual class BearingFactor : gtsam::NonlinearFactor { From 4b3edb08893ddcd954562c1fde0df6f0e1be58fe Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 19 Jul 2012 19:50:00 +0000 Subject: [PATCH 642/914] Wrapped iSAM2 --- gtsam.h | 90 +++++++++++++++++++++++++++++++++++++++ gtsam/nonlinear/ISAM2.cpp | 43 +++++++++++++++++++ gtsam/nonlinear/ISAM2.h | 89 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 222 insertions(+) diff --git a/gtsam.h b/gtsam.h index a658c6376..276a272a6 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1025,6 +1025,7 @@ class InvertedOrdering { class NonlinearFactorGraph { NonlinearFactorGraph(); void print(string s) const; + size_t size() const; double error(const gtsam::Values& c) const; double probPrime(const gtsam::Values& c) const; gtsam::NonlinearFactor* at(size_t i) const; @@ -1208,6 +1209,95 @@ virtual class LevenbergMarquardtOptimizer : gtsam::NonlinearOptimizer { double lambda() const; }; +#include +class ISAM2GaussNewtonParams { + ISAM2GaussNewtonParams(); + + void print(string str) const; + + /** Getters and Setters for all properties */ + double getWildfireThreshold() const; + void setWildfireThreshold(double wildfireThreshold); +}; + +class ISAM2DoglegParams { + ISAM2DoglegParams(); + + void print(string str) const; + + /** Getters and Setters for all properties */ + double getWildfireThreshold() const; + void setWildfireThreshold(double wildfireThreshold); + double getInitialDelta() const; + void setInitialDelta(double initialDelta); + string getAdaptationMode() const; + void setAdaptationMode(string adaptationMode); + bool isVerbose() const; + void setVerbose(bool verbose); +}; + +class ISAM2Params { + ISAM2Params(); + + void print(string str) const; + + /** Getters and Setters for all properties */ + void setOptimizationParams(const gtsam::ISAM2GaussNewtonParams& params); + void setOptimizationParams(const gtsam::ISAM2DoglegParams& params); + void setRelinearizeThreshold(double relinearizeThreshold); + // TODO: wrap this + //void setRelinearizeThreshold(const FastMap& relinearizeThreshold); + int getRelinearizeSkip() const; + void setRelinearizeSkip(int relinearizeSkip); + bool isEnableRelinearization() const; + void setEnableRelinearization(bool enableRelinearization); + bool isEvaluateNonlinearError() const; + void setEvaluateNonlinearError(bool evaluateNonlinearError); + string getFactorization() const; + void setFactorization(string factorization); + bool isCacheLinearizedFactors() const; + void setCacheLinearizedFactors(bool cacheLinearizedFactors); + bool isEnableDetailedResults() const; + void setEnableDetailedResults(bool enableDetailedResults); + bool isEnablePartialRelinearizationCheck() const; + void setEnablePartialRelinearizationCheck(bool enablePartialRelinearizationCheck); +}; + +class ISAM2Result { + ISAM2Result(); + + void print(string str) const; + + /** Getters and Setters for all properties */ + size_t getVariablesRelinearized() const; + size_t getVariablesReeliminated() const; + size_t getCliques() const; +}; + +class ISAM2 { + ISAM2(); + ISAM2(const gtsam::ISAM2Params& params); + + bool equals(const gtsam::ISAM2& other, double tol) const; + void print(string s) const; + + gtsam::ISAM2Result update(); + gtsam::ISAM2Result update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta); + gtsam::ISAM2Result update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta, const gtsam::KeyVector& removeFactorIndices); + // TODO: wrap the full version of update + //void update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta, const gtsam::KeyVector& removeFactorIndices, FastMap& constrainedKeys); + //void update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta, const gtsam::KeyVector& removeFactorIndices, FastMap& constrainedKeys, bool force_relinearize); + + gtsam::Values getLinearizationPoint() const; + gtsam::Values calculateEstimate() const; + gtsam::Values calculateBestEstimate() const; + gtsam::VectorValues getDelta() const; + gtsam::NonlinearFactorGraph getFactorsUnsafe() const; + gtsam::Ordering getOrdering() const; + gtsam::VariableIndex getVariableIndex() const; + gtsam::ISAM2Params params() const; +}; + //************************************************************************* // Nonlinear factor types //************************************************************************* diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 8c470f1aa..16a3ca7b5 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -20,6 +20,7 @@ using namespace boost::assign; #include #include +#include #include #include @@ -39,6 +40,48 @@ using namespace std; static const bool disableReordering = false; static const double batchThreshold = 0.65; +/* ************************************************************************* */ +std::string ISAM2DoglegParams::adaptationModeTranslator(const DoglegOptimizerImpl::TrustRegionAdaptationMode& adaptationMode) const { + std::string s; + switch (adaptationMode) { + case DoglegOptimizerImpl::SEARCH_EACH_ITERATION: s = "SEARCH_EACH_ITERATION"; break; + case DoglegOptimizerImpl::ONE_STEP_PER_ITERATION: s = "ONE_STEP_PER_ITERATION"; break; + default: s = "UNDEFINED"; break; + } + return s; +} + +/* ************************************************************************* */ +DoglegOptimizerImpl::TrustRegionAdaptationMode ISAM2DoglegParams::adaptationModeTranslator(const std::string& adaptationMode) const { + std::string s = adaptationMode; boost::algorithm::to_upper(s); + if (s == "SEARCH_EACH_ITERATION") return DoglegOptimizerImpl::SEARCH_EACH_ITERATION; + if (s == "ONE_STEP_PER_ITERATION") return DoglegOptimizerImpl::ONE_STEP_PER_ITERATION; + + /* default is SEARCH_EACH_ITERATION */ + return DoglegOptimizerImpl::SEARCH_EACH_ITERATION; +} + +/* ************************************************************************* */ +ISAM2Params::Factorization ISAM2Params::factorizationTranslator(const std::string& str) const { + std::string s = str; boost::algorithm::to_upper(s); + if (s == "QR") return ISAM2Params::QR; + if (s == "CHOLESKY") return ISAM2Params::CHOLESKY; + + /* default is CHOLESKY */ + return ISAM2Params::CHOLESKY; +} + +/* ************************************************************************* */ +std::string ISAM2Params::factorizationTranslator(const ISAM2Params::Factorization& value) const { + std::string s; + switch (value) { + case ISAM2Params::QR: s = "QR"; break; + case ISAM2Params::CHOLESKY: s = "CHOLESKY"; break; + default: s = "UNDEFINED"; break; + } + return s; +} + /* ************************************************************************* */ ISAM2::ISAM2(const ISAM2Params& params): deltaDoglegUptodate_(true), deltaUptodate_(true), params_(params) { diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 0d540a729..ab94e60f0 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -40,6 +40,15 @@ struct ISAM2GaussNewtonParams { ISAM2GaussNewtonParams( double _wildfireThreshold = 0.001 ///< see ISAM2GaussNewtonParams public variables, ISAM2GaussNewtonParams::wildfireThreshold ) : wildfireThreshold(_wildfireThreshold) {} + + void print(const std::string str = "") const { + std::cout << str << "type: ISAM2GaussNewtonParams\n"; + std::cout << str << "wildfireThreshold: " << wildfireThreshold << "\n"; + std::cout.flush(); + } + + double getWildfireThreshold() const { return wildfireThreshold; } + void setWildfireThreshold(double wildfireThreshold) { this->wildfireThreshold = wildfireThreshold; } }; /** @@ -62,6 +71,27 @@ struct ISAM2DoglegParams { bool _verbose = false ///< see ISAM2DoglegParams::verbose ) : initialDelta(_initialDelta), wildfireThreshold(_wildfireThreshold), adaptationMode(_adaptationMode), verbose(_verbose) {} + + void print(const std::string str = "") const { + std::cout << str << "type: ISAM2DoglegParams\n"; + std::cout << str << "initialDelta: " << initialDelta << "\n"; + std::cout << str << "wildfireThreshold: " << wildfireThreshold << "\n"; + std::cout << str << "adaptationMode: " << adaptationModeTranslator(adaptationMode) << "\n"; + std::cout.flush(); + } + + double getInitialDelta() const { return initialDelta; } + double getWildfireThreshold() const { return wildfireThreshold; } + std::string getAdaptationMode() const { return adaptationModeTranslator(adaptationMode); }; + bool isVerbose() const { return verbose; }; + + void setInitialDelta(double initialDelta) { this->initialDelta = initialDelta; } + void setWildfireThreshold(double wildfireThreshold) { this->wildfireThreshold = wildfireThreshold; } + void setAdaptationMode(const std::string& adaptationMode) { this->adaptationMode = adaptationModeTranslator(adaptationMode); } + void setVerbose(bool verbose) { this->verbose = verbose; }; + + std::string adaptationModeTranslator(const DoglegOptimizerImpl::TrustRegionAdaptationMode& adaptationMode) const; + DoglegOptimizerImpl::TrustRegionAdaptationMode adaptationModeTranslator(const std::string& adaptationMode) const; }; /** @@ -147,8 +177,57 @@ struct ISAM2Params { evaluateNonlinearError(_evaluateNonlinearError), factorization(_factorization), cacheLinearizedFactors(_cacheLinearizedFactors), keyFormatter(_keyFormatter), enableDetailedResults(false), enablePartialRelinearizationCheck(false) {} + + void print(const std::string& str = "") const { + std::cout << str << "\n"; + if(optimizationParams.type() == typeid(ISAM2GaussNewtonParams)) + boost::get(optimizationParams).print("optimizationParams: "); + else if(optimizationParams.type() == typeid(ISAM2DoglegParams)) + boost::get(optimizationParams).print("optimizationParams: "); + else + std::cout << "optimizationParams: " << "{unknown type}" << "\n"; + if(relinearizeThreshold.type() == typeid(double)) + std::cout << "relinearizeThreshold: " << boost::get(relinearizeThreshold) << "\n"; + else + std::cout << "relinearizeThreshold: " << "{mapped}" << "\n"; + std::cout << "relinearizeSkip: " << relinearizeSkip << "\n"; + std::cout << "enableRelinearization: " << enableRelinearization << "\n"; + std::cout << "evaluateNonlinearError: " << evaluateNonlinearError << "\n"; + std::cout << "factorization: " << factorizationTranslator(factorization) << "\n"; + std::cout << "cacheLinearizedFactors: " << cacheLinearizedFactors << "\n"; + std::cout << "enableDetailedResults: " << enableDetailedResults << "\n"; + std::cout << "enablePartialRelinearizationCheck: " << enablePartialRelinearizationCheck << "\n"; + std::cout.flush(); + } + + /** Getters and Setters for all properties */ + OptimizationParams getOptimizationParams() const { return this->optimizationParams; } + RelinearizationThreshold getRelinearizeThreshold() const { return relinearizeThreshold; } + int getRelinearizeSkip() const { return relinearizeSkip; } + bool isEnableRelinearization() const { return enableRelinearization; } + bool isEvaluateNonlinearError() const { return evaluateNonlinearError; } + std::string getFactorization() const { return factorizationTranslator(factorization); } + bool isCacheLinearizedFactors() const { return cacheLinearizedFactors; } + KeyFormatter getKeyFormatter() const { return keyFormatter; } + bool isEnableDetailedResults() const { return enableDetailedResults; } + bool isEnablePartialRelinearizationCheck() const { return enablePartialRelinearizationCheck; } + + void setOptimizationParams(OptimizationParams optimizationParams) { this->optimizationParams = optimizationParams; } + void setRelinearizeThreshold(RelinearizationThreshold relinearizeThreshold) { this->relinearizeThreshold = relinearizeThreshold; } + void setRelinearizeSkip(int relinearizeSkip) { this->relinearizeSkip = relinearizeSkip; } + void setEnableRelinearization(bool enableRelinearization) { this->enableRelinearization = enableRelinearization; } + void setEvaluateNonlinearError(bool evaluateNonlinearError) { this->evaluateNonlinearError = evaluateNonlinearError; } + void setFactorization(const std::string& factorization) { this->factorization = factorizationTranslator(factorization); } + void setCacheLinearizedFactors(bool cacheLinearizedFactors) { this->cacheLinearizedFactors = cacheLinearizedFactors; } + void setKeyFormatter(KeyFormatter keyFormatter) { this->keyFormatter = keyFormatter; } + void setEnableDetailedResults(bool enableDetailedResults) { this->enableDetailedResults = enableDetailedResults; } + void setEnablePartialRelinearizationCheck(bool enablePartialRelinearizationCheck) { this->enablePartialRelinearizationCheck = enablePartialRelinearizationCheck; } + + Factorization factorizationTranslator(const std::string& str) const; + std::string factorizationTranslator(const Factorization& value) const; }; + /** * @addtogroup ISAM2 * This struct is returned from ISAM2::update() and contains information about @@ -237,6 +316,16 @@ struct ISAM2Result { /** Detailed results, if enabled by ISAM2Params::enableDetailedResults. See * Detail for information about the results data stored here. */ boost::optional detail; + + + void print(const std::string str = "") const { + std::cout << str << " Reelimintated: " << variablesReeliminated << " Relinearized: " << variablesRelinearized << " Cliques: " << cliques << std::endl; + } + + /** Getters and Setters */ + size_t getVariablesRelinearized() const { return variablesRelinearized; }; + size_t getVariablesReeliminated() const { return variablesReeliminated; }; + size_t getCliques() const { return cliques; }; }; /** From 5ff18708425f850142b96f3109cdaa967f1d1aee Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 21 Jul 2012 19:15:13 +0000 Subject: [PATCH 643/914] Removed workaround for old boost versions in discrete - we now require a higher version anyway --- gtsam/discrete/Signature.cpp | 7 ---- gtsam/discrete/Signature.h | 5 --- .../tests/testAlgebraicDecisionTree.cpp | 12 ------- gtsam/discrete/tests/testDiscreteBayesNet.cpp | 8 ----- .../tests/testDiscreteConditional.cpp | 35 ++++++++++--------- .../tests/testDiscreteFactorGraph.cpp | 6 ---- gtsam/discrete/tests/testSignature.cpp | 2 -- 7 files changed, 19 insertions(+), 56 deletions(-) diff --git a/gtsam/discrete/Signature.cpp b/gtsam/discrete/Signature.cpp index 439f20864..76ccad9db 100644 --- a/gtsam/discrete/Signature.cpp +++ b/gtsam/discrete/Signature.cpp @@ -21,17 +21,13 @@ #include "Signature.h" -#ifdef BOOST_HAVE_PARSER #include // for parsing #include // for qi::_val -#endif namespace gtsam { using namespace std; - -#ifdef BOOST_HAVE_PARSER namespace qi = boost::spirit::qi; namespace ph = boost::phoenix; @@ -109,7 +105,6 @@ namespace gtsam { return true; } } // \namespace parser -#endif ostream& operator <<(ostream &os, const Signature::Row &row) { os << row[0]; @@ -169,7 +164,6 @@ namespace gtsam { Signature& Signature::operator=(const string& spec) { spec_.reset(spec); -#ifdef BOOST_HAVE_PARSER Table table; // NOTE: using simpler parse function to ensure boost back compatibility // parser::It f = spec.begin(), l = spec.end(); @@ -181,7 +175,6 @@ namespace gtsam { normalize(row); table_.reset(table); } -#endif return *this; } diff --git a/gtsam/discrete/Signature.h b/gtsam/discrete/Signature.h index 873365c24..937bd6e1b 100644 --- a/gtsam/discrete/Signature.h +++ b/gtsam/discrete/Signature.h @@ -22,11 +22,6 @@ #include #include -#include // for checking whether we are using boost 1.40 -#if BOOST_VERSION >= 104200 -#define BOOST_HAVE_PARSER -#endif - namespace gtsam { /** diff --git a/gtsam/discrete/tests/testAlgebraicDecisionTree.cpp b/gtsam/discrete/tests/testAlgebraicDecisionTree.cpp index bfeacb8e4..8ab3b6a14 100644 --- a/gtsam/discrete/tests/testAlgebraicDecisionTree.cpp +++ b/gtsam/discrete/tests/testAlgebraicDecisionTree.cpp @@ -23,10 +23,6 @@ #include #include // for convert only #define DISABLE_TIMING -#include // for checking whether we are using boost 1.40 -#if BOOST_VERSION >= 104200 -#define BOOST_HAVE_PARSER -#endif #include #include @@ -150,7 +146,6 @@ TEST(ADT, joint) { DiscreteKey A(0, 2), S(1, 2), T(2, 2), L(3, 2), B(4, 2), E(5, 2), X(6, 2), D(7, 2); -#ifdef BOOST_HAVE_PARSER resetCounts(); ADT pA = create(A % "99/1"); ADT pS = create(S % "50/50"); @@ -193,7 +188,6 @@ TEST(ADT, joint) EXPECT(assert_equal(pA, fAa)); ADT fAb = pASTL.combine(S, &add_).combine(T, &add_).combine(L, &add_); EXPECT(assert_equal(pA, fAb)); -#endif } /* ************************************************************************* */ @@ -203,7 +197,6 @@ TEST(ADT, inference) DiscreteKey A(0,2), D(1,2),// B(2,2), L(3,2), E(4,2), S(5,2), T(6,2), X(7,2); -#ifdef BOOST_HAVE_PARSER resetCounts(); ADT pA = create(A % "99/1"); ADT pS = create(S % "50/50"); @@ -247,7 +240,6 @@ TEST(ADT, inference) dot(marginal, "Joint-Sum-ADBL"); EXPECT_LONGS_EQUAL(161, adds); printCounts("Asia sum"); -#endif } /* ************************************************************************* */ @@ -255,7 +247,6 @@ TEST(ADT, factor_graph) { DiscreteKey B(0,2), L(1,2), E(2,2), S(3,2), T(4,2), X(5,2); -#ifdef BOOST_HAVE_PARSER resetCounts(); ADT pS = create(S % "50/50"); ADT pT = create(T % "95/5"); @@ -334,7 +325,6 @@ TEST(ADT, factor_graph) fB = fB.combine(L, &add_); dot(fB, "Eliminate-10-fB"); printCounts("Eliminate L"); -#endif } /* ************************************************************************* */ @@ -360,7 +350,6 @@ TEST(ADT, equality_noparser) } /* ************************************************************************* */ -#ifdef BOOST_HAVE_PARSER // test equality TEST(ADT, equality_parser) { @@ -376,7 +365,6 @@ TEST(ADT, equality_parser) ADT pAB2 = apply(pB, pA1, &mul); EXPECT(pAB2 == pAB1); } -#endif /* ******************************************************************************** */ // Factor graph construction diff --git a/gtsam/discrete/tests/testDiscreteBayesNet.cpp b/gtsam/discrete/tests/testDiscreteBayesNet.cpp index bc07d57ca..63f225c35 100644 --- a/gtsam/discrete/tests/testDiscreteBayesNet.cpp +++ b/gtsam/discrete/tests/testDiscreteBayesNet.cpp @@ -25,10 +25,6 @@ #include using namespace boost::assign; -#include // for checking whether we are using boost 1.40 -#if BOOST_VERSION >= 104200 -#define BOOST_HAVE_PARSER -#endif #include @@ -44,7 +40,6 @@ TEST(DiscreteBayesNet, Asia) DiscreteKey A(0,2), S(4,2), T(3,2), L(6,2), B(7,2), E(5,2), X(2,2), D(1,2); // TODO: make a version that doesn't use the parser -#ifdef BOOST_HAVE_PARSER add_front(asia, A % "99/1"); add_front(asia, S % "50/50"); @@ -104,7 +99,6 @@ TEST(DiscreteBayesNet, Asia) S.first, 1)(E.first, 0)(L.first, 0)(B.first, 1); DiscreteFactor::sharedValues actualSample = sample(*chordal2); EXPECT(assert_equal(expectedSample, *actualSample)); -#endif } /* ************************************************************************* */ @@ -114,7 +108,6 @@ TEST_UNSAFE(DiscreteBayesNet, Sugar) DiscreteBayesNet bn; -#ifdef BOOST_HAVE_PARSER // test some mistakes // add(bn, D); // add(bn, D | E); @@ -127,7 +120,6 @@ TEST_UNSAFE(DiscreteBayesNet, Sugar) // // try multivalued add(bn, C % "1/1/2"); add(bn, C | S = "1/1/2 5/2/3"); -#endif } /* ************************************************************************* */ diff --git a/gtsam/discrete/tests/testDiscreteConditional.cpp b/gtsam/discrete/tests/testDiscreteConditional.cpp index c11dddef5..8af23e4f8 100644 --- a/gtsam/discrete/tests/testDiscreteConditional.cpp +++ b/gtsam/discrete/tests/testDiscreteConditional.cpp @@ -24,10 +24,6 @@ using namespace boost::assign; #include #include #include -#include // for checking whether we are using boost 1.40 -#if BOOST_VERSION >= 104200 -#define BOOST_HAVE_PARSER -#endif using namespace std; using namespace gtsam; @@ -37,17 +33,31 @@ TEST( DiscreteConditionalTest, constructors) { DiscreteKey X(0, 2), Y(2, 3), Z(1, 2); // watch ordering ! -#ifdef BOOST_HAVE_PARSER DiscreteConditional::shared_ptr expected1 = // boost::make_shared(X | Y = "1/1 2/3 1/4"); -#else + EXPECT(expected1); + DecisionTreeFactor f1(X & Y, "0.5 0.4 0.2 0.5 0.6 0.8"); + DiscreteConditional actual1(1, f1); + EXPECT(assert_equal(*expected1, actual1, 1e-9)); + + DecisionTreeFactor f2(X & Y & Z, + "0.2 0.5 0.3 0.6 0.4 0.7 0.25 0.55 0.35 0.65 0.45 0.75"); + DiscreteConditional actual2(1, f2); + DecisionTreeFactor::shared_ptr actual2factor = actual2.toFactor(); +// EXPECT(assert_equal(f2, *actual2factor, 1e-9)); +} + +/* ************************************************************************* */ +TEST( DiscreteConditionalTest, constructors_alt_interface) +{ + DiscreteKey X(0, 2), Y(2, 3), Z(1, 2); // watch ordering ! + Signature::Table table; Signature::Row r1, r2, r3; r1 += 1.0, 1.0; r2 += 2.0, 3.0; r3 += 1.0, 4.0; table += r1, r2, r3; DiscreteConditional::shared_ptr expected1 = // boost::make_shared(X | Y = table); -#endif EXPECT(expected1); DecisionTreeFactor f1(X & Y, "0.5 0.4 0.2 0.5 0.6 0.8"); DiscreteConditional actual1(1, f1); @@ -63,7 +73,6 @@ TEST( DiscreteConditionalTest, constructors) /* ************************************************************************* */ TEST( DiscreteConditionalTest, constructors2) { -#ifdef BOOST_HAVE_PARSER // Declare keys and ordering DiscreteKey C(0,2), B(1,2); DecisionTreeFactor expected(C & B, "0.8 0.75 0.2 0.25"); @@ -71,13 +80,11 @@ TEST( DiscreteConditionalTest, constructors2) DiscreteConditional actual(signature); DecisionTreeFactor::shared_ptr actualFactor = actual.toFactor(); EXPECT(assert_equal(expected, *actualFactor)); -#endif - } +} /* ************************************************************************* */ TEST( DiscreteConditionalTest, constructors3) { -#ifdef BOOST_HAVE_PARSER // Declare keys and ordering DiscreteKey C(0,2), B(1,2), A(2,2); DecisionTreeFactor expected(C & B & A, "0.8 0.5 0.5 0.2 0.2 0.5 0.5 0.8"); @@ -85,13 +92,9 @@ TEST( DiscreteConditionalTest, constructors3) DiscreteConditional actual(signature); DecisionTreeFactor::shared_ptr actualFactor = actual.toFactor(); EXPECT(assert_equal(expected, *actualFactor)); -#endif } /* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/discrete/tests/testDiscreteFactorGraph.cpp b/gtsam/discrete/tests/testDiscreteFactorGraph.cpp index 667ce9331..8fdbc5870 100644 --- a/gtsam/discrete/tests/testDiscreteFactorGraph.cpp +++ b/gtsam/discrete/tests/testDiscreteFactorGraph.cpp @@ -24,10 +24,6 @@ #include using namespace boost::assign; -#include // for checking whether we are using boost 1.40 -#if BOOST_VERSION >= 104200 -#define BOOST_HAVE_PARSER -#endif using namespace std; using namespace gtsam; @@ -136,7 +132,6 @@ TEST( DiscreteFactorGraph, test) boost::tie(conditional, newFactor) =// EliminateDiscrete(graph, 1); -#ifdef BOOST_HAVE_PARSER // Check Bayes net CHECK(conditional); DiscreteBayesNet expected; @@ -173,7 +168,6 @@ TEST( DiscreteFactorGraph, test) insert(expectedValues)(0, 0)(1, 0)(2, 0); DiscreteFactor::sharedValues actualValues = solver.optimize(); EXPECT(assert_equal(expectedValues, *actualValues)); -#endif } /* ************************************************************************* */ diff --git a/gtsam/discrete/tests/testSignature.cpp b/gtsam/discrete/tests/testSignature.cpp index 66b1c61b3..bf4aabb7f 100644 --- a/gtsam/discrete/tests/testSignature.cpp +++ b/gtsam/discrete/tests/testSignature.cpp @@ -28,7 +28,6 @@ using namespace boost::assign; DiscreteKey X(0,2), Y(1,3), Z(2,2); -#ifdef BOOST_HAVE_PARSER /* ************************************************************************* */ TEST(testSignature, simple_conditional) { Signature sig(X | Y = "1/1 2/3 1/4"); @@ -43,7 +42,6 @@ TEST(testSignature, simple_conditional) { vector actCpt = sig.cpt(); EXPECT_LONGS_EQUAL(6, actCpt.size()); } -#endif /* ************************************************************************* */ TEST(testSignature, simple_conditional_nonparser) { From c9c43e1cf53495b766aec7c29758ea4e45b06a44 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 21 Jul 2012 20:05:27 +0000 Subject: [PATCH 644/914] Fixed cpack ignores to skip the makestats script --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a89fb70f..cfe3756bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,7 +211,7 @@ set(CPACK_PACKAGE_VERSION_MINOR ${GTSAM_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${GTSAM_VERSION_PATCH}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") set(CPACK_INSTALLED_DIRECTORIES "doc;.") # Include doc directory -set(CPACK_SOURCE_IGNORE_FILES "/build;/\\\\.;/makedoc.sh$") +set(CPACK_SOURCE_IGNORE_FILES "/build;/\\\\.;/makestats.sh$") set(CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/gtsam_unstable/") set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}") #set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-aspn${GTSAM_VERSION_PATCH}") # Used for creating ASPN tarballs From ce65f2e925651bf190942177abcc35a5b54f0c52 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 21 Jul 2012 20:05:28 +0000 Subject: [PATCH 645/914] Added cmake script for generating doxygen in more detail, can now generate documentation for all of gtsam and gtsam_unstable --- CMakeLists.txt | 51 ++++------------------------- doc/CMakeLists.txt | 80 ++++++++++++++++++++++++++++++++++++++++++++++ doc/Doxyfile.in | 14 +------- 3 files changed, 87 insertions(+), 58 deletions(-) create mode 100644 doc/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index cfe3756bb..13d564391 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,9 +36,6 @@ else() set(GTSAM_UNSTABLE_AVAILABLE 0) endif() -# Check for doxygen availability -find_package(Doxygen) - # Configurable Options option(GTSAM_BUILD_TESTS "Enable/Disable building of tests" ON) option(GTSAM_BUILD_TIMING "Enable/Disable building of timing scripts" ON) @@ -156,49 +153,13 @@ endif(GTSAM_BUILD_UNSTABLE) GtsamMakeConfigFile(GTSAM) export(TARGETS ${GTSAM_EXPORTED_TARGETS} FILE GTSAM-exports.cmake) -# Doxygen documentation configuration -if (DOXYGEN_FOUND) - option(GTSAM_BUILD_DOCS "Enable/Disable building of doxygen docs" ON) - - # configure doxygen - option(GTSAM_BUILD_DOC_HTML "Enable/Disable doxygen HTML output" ON) - option(GTSAM_BUILD_DOC_LATEX "Enable/Disable doxygen LaTeX output" OFF) +# Check for doxygen availability - optional dependency +find_package(Doxygen) - # add a target to generate API documentation with Doxygen - if (GTSAM_BUILD_DOCS) - # Convert configuration to YES/NO variables - if (GTSAM_BUILD_DOC_HTML) - set(GTSAM_BUILD_DOC_HTML_YN "YES") - else() - set(GTSAM_BUILD_DOC_HTML_YN "NO") - endif() - - if (GTSAM_BUILD_DOC_LATEX) - set(GTSAM_BUILD_DOC_LATEX_YN "YES") - else() - set(GTSAM_BUILD_DOC_LATEX_YN "NO") - endif() - - # Generate Doxyfile - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) - - # Add target to actually build documentation as configured - add_custom_target(doc - ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc - COMMENT "Generating API documentation with Doxygen" VERBATIM - ) - - # Clean target - add_custom_target(doc_clean - COMMAND - cmake -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/doc/latex - COMMAND - cmake -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/doc/html - COMMENT "Removing Doxygen documentation" - ) - endif() -endif () +# Doxygen documentation - enabling options in subfolder +if (DOXYGEN_FOUND) + add_subdirectory(doc) +endif() # Set up CPack set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM") diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 000000000..6441f7223 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,80 @@ +# Doxygen documentation configuration +option(GTSAM_BUILD_DOCS "Enable/Disable building of doxygen docs" ON) + +# configure doxygen +option(GTSAM_BUILD_DOC_HTML "Enable/Disable doxygen HTML output" ON) +option(GTSAM_BUILD_DOC_LATEX "Enable/Disable doxygen LaTeX output" OFF) + +# add a target to generate API documentation with Doxygen +if (GTSAM_BUILD_DOCS) + # Convert configuration to YES/NO variables + if (GTSAM_BUILD_DOC_HTML) + set(GTSAM_BUILD_DOC_HTML_YN "YES") + else() + set(GTSAM_BUILD_DOC_HTML_YN "NO") + endif() + + if (GTSAM_BUILD_DOC_LATEX) + set(GTSAM_BUILD_DOC_LATEX_YN "YES") + else() + set(GTSAM_BUILD_DOC_LATEX_YN "NO") + endif() + + # GTSAM core subfolders + set(gtsam_doc_subdirs + gtsam/base + gtsam/geometry + gtsam/inference + gtsam/discrete + gtsam/linear + gtsam/nonlinear + gtsam/slam + gtsam + ) + + # Optional GTSAM_UNSTABLE subfolders + set(gtsam_unstable_doc_subdirs + gtsam_unstable/base + gtsam_unstable/discrete + gtsam_unstable/linear + gtsam_unstable/nonlinear + gtsam_unstable/slam + gtsam_unstable/dynamics + gtsam_unstable + ) + + # Build a list of folders to include + set(doc_subdirs ${gtsam_doc_subdirs}) + if (GTSAM_BUILD_UNSTABLE) + list(APPEND doc_subdirs ${gtsam_unstable_doc_subdirs}) + endif() + + message(STATUS "Doxgyen inputs (raw) [${doc_subdirs}]") + + # From subfolders, build a list with whitespace separation of paths + set(GTSAM_DOXYGEN_INPUT_PATHS "") + foreach(dir ${doc_subdirs}) + set(GTSAM_DOXYGEN_INPUT_PATHS "${GTSAM_DOXYGEN_INPUT_PATHS} ${PROJECT_SOURCE_DIR}/${dir}") + endforeach() + + message(STATUS "Doxgyen inputs [${GTSAM_DOXYGEN_INPUT_PATHS}]") + + # Generate Doxyfile + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) + + # Add target to actually build documentation as configured + add_custom_target(doc + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Generating API documentation with Doxygen" VERBATIM + ) + + # Clean target + add_custom_target(doc_clean + COMMAND + cmake -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/latex + COMMAND + cmake -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/html + COMMENT "Removing Doxygen documentation" + ) +endif() diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index b6030a567..f12e12217 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -638,19 +638,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = @PROJECT_SOURCE_DIR@/gtsam/base \ - @PROJECT_SOURCE_DIR@/gtsam/geometry \ - @PROJECT_SOURCE_DIR@/gtsam/inference \ - @PROJECT_SOURCE_DIR@/gtsam/discrete \ - @PROJECT_SOURCE_DIR@/gtsam/linear \ - @PROJECT_SOURCE_DIR@/gtsam/nonlinear \ - @PROJECT_SOURCE_DIR@/gtsam -# @PROJECT_SOURCE_DIR@/gtsam/slam \ -# @PROJECT_SOURCE_DIR@/gtsam_unstable/slam \ -# @PROJECT_SOURCE_DIR@/gtsam_unstable/base \ -# @PROJECT_SOURCE_DIR@/gtsam_unstable/geometry \ -# @PROJECT_SOURCE_DIR@/gtsam_unstable/dynamics \ -# @PROJECT_SOURCE_DIR@/gtsam_unstable +INPUT = @GTSAM_DOXYGEN_INPUT_PATHS@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is From 96d7b6fea218a45296465c4cd9eaee9b228c8c4e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 21 Jul 2012 20:11:43 +0000 Subject: [PATCH 646/914] Added doxygen support for examples, removed debugging messages --- doc/CMakeLists.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 6441f7223..d26b16cd3 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -42,23 +42,22 @@ if (GTSAM_BUILD_DOCS) gtsam_unstable/dynamics gtsam_unstable ) - + # Build a list of folders to include set(doc_subdirs ${gtsam_doc_subdirs}) if (GTSAM_BUILD_UNSTABLE) list(APPEND doc_subdirs ${gtsam_unstable_doc_subdirs}) endif() - - message(STATUS "Doxgyen inputs (raw) [${doc_subdirs}]") - + if (GTSAM_BUILD_EXAMPLES) + list(APPEND doc_subdirs examples) + endif() + # From subfolders, build a list with whitespace separation of paths set(GTSAM_DOXYGEN_INPUT_PATHS "") foreach(dir ${doc_subdirs}) set(GTSAM_DOXYGEN_INPUT_PATHS "${GTSAM_DOXYGEN_INPUT_PATHS} ${PROJECT_SOURCE_DIR}/${dir}") endforeach() - message(STATUS "Doxgyen inputs [${GTSAM_DOXYGEN_INPUT_PATHS}]") - # Generate Doxyfile configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) From cfd1a4157d9ce88a5c7aec636d87044f6722cf36 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 21 Jul 2012 20:26:07 +0000 Subject: [PATCH 647/914] comments only --- doc/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index d26b16cd3..4cb6d4a40 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -43,7 +43,7 @@ if (GTSAM_BUILD_DOCS) gtsam_unstable ) - # Build a list of folders to include + # Build a list of folders to include depending on build options set(doc_subdirs ${gtsam_doc_subdirs}) if (GTSAM_BUILD_UNSTABLE) list(APPEND doc_subdirs ${gtsam_unstable_doc_subdirs}) From ba51443365e837d29284954df845647fbd757ecb Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sat, 21 Jul 2012 22:07:47 +0000 Subject: [PATCH 648/914] Create branch for updating the examples (C++ and Matlab) without the use of the SLAM Namespaces From c8daa4234868250f2fbfd151e342659070f0ab12 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 21 Jul 2012 23:54:55 +0000 Subject: [PATCH 649/914] Wrapped JointMarginal class and joint marginal functions of Marginals --- CMakeLists.txt | 2 +- gtsam.h | 8 ++++++++ gtsam/base/FastVector.h | 5 +++++ gtsam/nonlinear/Marginals.cpp | 14 ++++++++++++++ gtsam/nonlinear/Marginals.h | 7 +++++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 13d564391..66fc43c50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,7 +108,7 @@ endif() if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() -find_package(Boost 1.43 COMPONENTS serialization system filesystem thread date_time REQUIRED) +find_package(Boost 1.43 COMPONENTS serialization system filesystem thread date_time regex REQUIRED) set(GTSAM_BOOST_LIBRARIES ${Boost_SERIALIZATION_LIBRARY}) # General build settings diff --git a/gtsam.h b/gtsam.h index 276a272a6..4a2cbb66c 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1129,6 +1129,14 @@ class Marginals { void print(string s) const; Matrix marginalCovariance(size_t variable) const; Matrix marginalInformation(size_t variable) const; + gtsam::JointMarginal jointMarginalCovariance(const gtsam::KeyVector& variables) const; + gtsam::JointMarginal jointMarginalInformation(const gtsam::KeyVector& variables) const; +}; + +class JointMarginal { + Matrix at(size_t iVariable, size_t jVariable) const; + void print(string s) const; + void print() const; }; //************************************************************************* diff --git a/gtsam/base/FastVector.h b/gtsam/base/FastVector.h index c3b8ca761..f55d67b41 100644 --- a/gtsam/base/FastVector.h +++ b/gtsam/base/FastVector.h @@ -88,6 +88,11 @@ public: Base::assign(x.begin(), x.end()); } + /** Conversion to a standard STL container */ + operator std::vector() const { + return std::vector(begin(), end()); + } + private: /** Serialization function */ friend class boost::serialization::access; diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index da3632570..f7f1aa00f 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -156,4 +156,18 @@ JointMarginal Marginals::jointMarginalInformation(const std::vector& variab } } +/* ************************************************************************* */ +void JointMarginal::print(const std::string& s, const KeyFormatter& formatter) const { + cout << s << "Joint marginal on keys "; + bool first = true; + BOOST_FOREACH(const Ordering::value_type& key_index, indices_) { + if(!first) + cout << ", "; + else + first = false; + cout << formatter(key_index.first); + } + cout << ". Use 'at' or 'operator()' to query matrix blocks." << endl; +} + } /* namespace gtsam */ diff --git a/gtsam/nonlinear/Marginals.h b/gtsam/nonlinear/Marginals.h index f04fe310a..c792167c5 100644 --- a/gtsam/nonlinear/Marginals.h +++ b/gtsam/nonlinear/Marginals.h @@ -117,11 +117,18 @@ public: Block operator()(Key iVariable, Key jVariable) const { return blockView_(indices_[iVariable], indices_[jVariable]); } + /** Synonym for operator() */ + Block at(Key iVariable, Key jVariable) const { + return (*this)(iVariable, jVariable); } + /** Copy constructor */ JointMarginal(const JointMarginal& other); /** Assignment operator */ JointMarginal& operator=(const JointMarginal& rhs); + + /** Print */ + void print(const std::string& s = "", const KeyFormatter& formatter = DefaultKeyFormatter) const; }; } /* namespace gtsam */ From 564ab1dd63b8df7ae5c40727954f2bd844b3e9b7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sun, 22 Jul 2012 00:57:24 +0000 Subject: [PATCH 650/914] Wrapped Values::keys() function --- gtsam.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam.h b/gtsam.h index 276a272a6..50743c239 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1056,6 +1056,7 @@ class Values { void insert(size_t j, const gtsam::Value& value); bool exists(size_t j) const; gtsam::Value at(size_t j) const; + gtsam::KeyList keys() const; }; // Actually a FastList From f97869cf202eaf4a5e28c1d90b1f9fe994ae4a15 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sun, 22 Jul 2012 00:57:39 +0000 Subject: [PATCH 651/914] Added plot2DTrajectory matlab function to find all Pose2s in a Values and plot them as a trajectory with optional covariance ellipses --- matlab/plot2DTrajectory.m | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 matlab/plot2DTrajectory.m diff --git a/matlab/plot2DTrajectory.m b/matlab/plot2DTrajectory.m new file mode 100644 index 000000000..82c62bb40 --- /dev/null +++ b/matlab/plot2DTrajectory.m @@ -0,0 +1,43 @@ +function plot2DTrajectory(values, marginals) +%PLOT2DTRAJECTORY Plots the Pose2's in a values, with optional covariances +% Finds all the Pose2 objects in the given Values object and plots them +% in increasing key order, connecting consecutive poses with a line. If +% a Marginals object is given, this function will also plot marginal +% covariance ellipses for each pose. + +import gtsam.* + +haveMarginals = exist('marginals', 'var'); +keys = KeyVector(values.keys); + +% Store poses and covariance matrices +lastIndex = []; +for i = 0:keys.size-1 + key = keys.at(i); + x = values.at(key); + if isa(x, 'gtsam.Pose2') + if ~isempty(lastIndex) + % Draw line from last pose then covariance ellipse on top of + % last pose. + lastKey = keys.at(lastIndex); + lastPose = values.at(lastKey); + plot([ x.x; lastPose.x ], [ x.y; lastPose.y ], 'k*-'); + if haveMarginals + P = marginals.marginalCovariance(lastKey); + plotPose2(lastPose, 'g', P); + end + end + lastIndex = i; + end +end + +% Draw final covariance ellipse +if ~isempty(lastIndex) && haveMarginals + lastKey = keys.at(lastIndex); + lastPose = values.at(lastKey); + P = marginals.marginalCovariance(lastKey); + plotPose2(lastPose, 'g', P); +end + +end + From 9e278b394a0177a79da5070197af76ca5cb221e7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sun, 22 Jul 2012 00:57:54 +0000 Subject: [PATCH 652/914] Converted first 2 matlab examples to not use slam namespaces --- matlab/examples/LocalizationExample.m | 38 ++++++++++++--------------- matlab/examples/OdometryExample.m | 34 +++++++++++------------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m index 0a54111b0..1c38bc979 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/LocalizationExample.m @@ -16,51 +16,47 @@ % - The robot is on a grid, moving 2 meters each step %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAM.Graph; +graph = gtsam.NonlinearFactorGraph; %% Add two odometry factors import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addRelativePose(1, 2, odometry, odometryNoise); -graph.addRelativePose(2, 3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Add three "GPS" measurements import gtsam.* % We use Pose2 Priors here with high variance on theta priorNoise = noiseModel.Diagonal.Sigmas([0.1; 0.1; 10]); -graph.addPosePrior(1, Pose2(0.0, 0.0, 0.0), priorNoise); -graph.addPosePrior(2, Pose2(2.0, 0.0, 0.0), priorNoise); -graph.addPosePrior(3, Pose2(4.0, 0.0, 0.0), priorNoise); +graph.add(PriorFactorPose2(1, Pose2(0.0, 0.0, 0.0), priorNoise)); +graph.add(PriorFactorPose2(2, Pose2(2.0, 0.0, 0.0), priorNoise)); +graph.add(PriorFactorPose2(3, Pose2(4.0, 0.0, 0.0), priorNoise)); %% print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points import gtsam.* -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd import gtsam.* -result = graph.optimize(initialEstimate,1); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n ')); -%% Plot Covariance Ellipses +%% Plot trajectory and covariance ellipses import gtsam.* cla; -X=result.poses(); -plot(X(:,1),X(:,2),'k*-'); hold on -marginals = graph.marginals(result); -P={}; -for i=1:result.size() - pose_i = result.pose(i); - P{i}=marginals.marginalCovariance(i); - plotPose2(pose_i,'g',P{i}) -end +hold on; + +plot2DTrajectory(result, Marginals(graph, result)); + axis([-0.6 4.8 -1 1]) axis equal view(2) diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index 297702b51..16323a616 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -16,48 +16,44 @@ % - The robot is on a grid, moving 2 meters each step %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAM.Graph; +graph = gtsam.NonlinearFactorGraph; %% Add a Gaussian prior on pose x_1 import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta -graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add two odometry factors import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addRelativePose(1, 2, odometry, odometryNoise); -graph.addRelativePose(2, 3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points import gtsam.* -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,1); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n ')); -%% Plot Covariance Ellipses +%% Plot trajectory and covariance ellipses import gtsam.* cla; -X=result.poses(); -plot(X(:,1),X(:,2),'k*-'); hold on -marginals = graph.marginals(result); -P={}; -for i=1:result.size() - pose_i = result.pose(i); - P{i}=marginals.marginalCovariance(i); - plotPose2(pose_i,'g',P{i}) -end +hold on; + +plot2DTrajectory(result, Marginals(graph, result)); + axis([-0.6 4.8 -1 1]) axis equal view(2) From d259320aed71112eaff6712f9ed7ad3ab35736f5 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 04:35:12 +0000 Subject: [PATCH 653/914] Combined the two versions of Pose2SLAMExample into a single example without SLAM namespaces --- examples/Pose2SLAMExample.cpp | 133 +++++++++++++++++++------ examples/Pose2SLAMExample_advanced.cpp | 82 --------------- 2 files changed, 102 insertions(+), 113 deletions(-) delete mode 100644 examples/Pose2SLAMExample_advanced.cpp diff --git a/examples/Pose2SLAMExample.cpp b/examples/Pose2SLAMExample.cpp index 0777301ea..4e660a768 100644 --- a/examples/Pose2SLAMExample.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -11,55 +11,126 @@ /** * @file Pose2SLAMExample.cpp - * @brief A 2D Pose SLAM example using the predefined typedefs in gtsam/slam/pose2SLAM.h + * @brief A 2D Pose SLAM example * @date Oct 21, 2010 * @author Yong Dian Jian */ -// pull in the Pose2 SLAM domain with all typedefs and helper functions defined -#include -#include +/** + * A simple 2D pose slam example + * - The robot moves in a 2 meter square + * - The robot moves 2 meters each step, turning 90 degrees after each step + * - The robot initially faces along the X axis (horizontal, to the right in 2D) + * - We have full odometry between pose + * - We have a loop closure constraint when the robot returns to the first position + */ + +// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent +// the robot positions +#include +#include + +// Each variable in the system (poses) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use simple integer keys +#include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use Between factors for the relative motion described by odometry measurements. +// We will also use a Between Factor to encode the loop closure constraint +// Also, we will initialize the robot at the origin using a Prior factor. +#include +#include + +// When the factors are created, we will add them to a Factor Graph. As the factors we are using +// are nonlinear factors, we will need a Nonlinear Factor Graph. +#include + +// Finally, once all of the factors have been added to our factor graph, we will want to +// solve/optimize to graph to find the best (Maximum A Posteriori) set of variable values. +// GTSAM includes several nonlinear optimizers to perform this step. Here we will use the +// a Gauss-Newton solver +#include + +// Once the optimized values have been calculated, we can also calculate the marginal covariance +// of desired variables +#include + +// The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the +// nonlinear functions around an initial linearization point, then solve the linear system +// to update the linearization point. This happens repeatedly until the solver converges +// to a consistent set of variable values. This requires us to specify an initial guess +// for each variable, held in a Values container. +#include + using namespace std; using namespace gtsam; -using namespace gtsam::noiseModel; int main(int argc, char** argv) { - // 1. Create graph container and add factors to it - pose2SLAM::Graph graph; + // 1. Create a factor graph container and add factors to it + NonlinearFactorGraph graph; - // 2a. Add Gaussian prior - Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.addPosePrior(1, priorMean, priorNoise); + // 2a. Add a prior on the first pose, setting it to the origin + // A prior factor consists of a mean and a noise model (covariance matrix) + Pose2 prior(0.0, 0.0, 0.0); // prior at origin + noiseModel::Diagonal::shared_ptr priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); + graph.add(PriorFactor(1, prior, priorNoise)); // 2b. Add odometry factors - SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0), odometryNoise); - graph.addRelativePose(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addRelativePose(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addRelativePose(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + // For simplicity, we will use the same noise model for each odometry factor + noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + // Create odometry (Between) factors between consecutive poses + graph.add(BetweenFactor(1, 2, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); - // 2c. Add pose constraint - SharedDiagonal model = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addRelativePose(5, 2, Pose2(2.0, 0.0, M_PI_2), model); + // 2c. Add the loop closure constraint + // This factor encodes the fact that we have returned to the same pose. In real systems, + // these constraints may be identified in many ways, such as appearance-based techniques + // with camera images. + // We will use another Between Factor to enforce this constraint, with the distance set to zero, + noiseModel::Diagonal::shared_ptr model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + graph.add(BetweenFactor(5, 1, Pose2(0.0, 0.0, 0.0), model)); + graph.print("\nFactor Graph:\n"); // print - // print - graph.print("\nFactor graph:\n"); // 3. Create the data structure to hold the initialEstimate estimate to the solution - pose2SLAM::Values initialEstimate; - initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insertPose(2, Pose2(2.3, 0.1, -0.2)); - initialEstimate.insertPose(3, Pose2(4.1, 0.1, M_PI_2)); - initialEstimate.insertPose(4, Pose2(4.0, 2.0, M_PI)); - initialEstimate.insertPose(5, Pose2(2.1, 2.1, -M_PI_2)); - initialEstimate.print("\nInitial estimate:\n"); + // For illustrative purposes, these have been deliberately set to incorrect values + Values initialEstimate; + initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insert(2, Pose2(2.3, 0.1, 1.1)); + initialEstimate.insert(3, Pose2(2.1, 1.9, 2.8)); + initialEstimate.insert(4, Pose2(-.3, 2.5, 4.2)); + initialEstimate.insert(5, Pose2(0.1,-0.7, 5.8)); + initialEstimate.print("\nInitial Estimate:\n"); // print - // 4. Single Step Optimization using Levenberg-Marquardt - pose2SLAM::Values result = graph.optimize(initialEstimate); - result.print("\nFinal result:\n"); + // 4. Optimize the initial values using a Gauss-Newton nonlinear optimizer + // The optimizer accepts an optional set of configuration parameters, + // controlling things like convergence criteria, the type of linear + // system solver to use, and the amount of information displayed during + // optimization. We will set a few parameters as a demonstration. + GaussNewtonParams parameters; + // Stop iterating once the change in error between steps is less than this value + parameters.relativeErrorTol = 1e-5; + // Do not perform more than N iteration steps + parameters.maxIterations = 100; + // Create the optimizer ... + GaussNewtonOptimizer optimizer(graph, initialEstimate, parameters); + // ... and optimize + Values result = optimizer.optimize(); + result.print("Final Result:\n"); + + // 5. Calculate and print marginal covariances for all variables + Marginals marginals(graph, result); + cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(1) << endl; + cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(2) << endl; + cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(3) << endl; + cout << "Pose 4 covariance:\n" << marginals.marginalCovariance(4) << endl; + cout << "Pose 5 covariance:\n" << marginals.marginalCovariance(5) << endl; return 0; } diff --git a/examples/Pose2SLAMExample_advanced.cpp b/examples/Pose2SLAMExample_advanced.cpp deleted file mode 100644 index b5fcddfcf..000000000 --- a/examples/Pose2SLAMExample_advanced.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 Pose2SLAMExample_advanced.cpp - * @brief Simple Pose2SLAM Example using - * pre-built pose2SLAM domain - * @author Chris Beall - */ - -// pull in the Pose2 SLAM domain with all typedefs and helper functions defined -#include -#include -#include -#include -#include - -#include -#include -#include - -using namespace std; -using namespace gtsam; -using namespace gtsam::noiseModel; - -int main(int argc, char** argv) { - /* 1. create graph container and add factors to it */ - pose2SLAM::Graph graph; - - /* 2.a add prior */ - Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta - graph.addPosePrior(1, priorMean, priorNoise); // add directly to graph - - /* 2.b add odometry */ - SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - graph.addRelativePose(1, 2, odometry, odometryNoise); - graph.addRelativePose(2, 3, odometry, odometryNoise); - graph.print("full graph"); - - /* 3. Create the data structure to hold the initial estimate to the solution - * initialize to noisy points */ - pose2SLAM::Values initial; - initial.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initial.insertPose(2, Pose2(2.3, 0.1, -0.2)); - initial.insertPose(3, Pose2(4.1, 0.1, 0.1)); - initial.print("initial estimate"); - - /* 4.2.1 Alternatively, you can go through the process step by step - * Choose an ordering */ - Ordering ordering = *graph.orderingCOLAMD(initial); - - /* 4.2.2 set up solver and optimize */ - LevenbergMarquardtParams params; - params.absoluteErrorTol = 1e-15; - params.relativeErrorTol = 1e-15; - params.ordering = ordering; - LevenbergMarquardtOptimizer optimizer(graph, initial, params); - - pose2SLAM::Values result = optimizer.optimize(); - result.print("final result"); - - /* Get covariances */ - Marginals marginals(graph, result, Marginals::CHOLESKY); - Matrix covariance1 = marginals.marginalCovariance(1); - Matrix covariance2 = marginals.marginalCovariance(2); - - print(covariance1, "Covariance1"); - print(covariance2, "Covariance2"); - - return 0; -} - From 5da5adb2f1ced42d8010756c4bc1a5c21d7a43f6 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 04:36:40 +0000 Subject: [PATCH 654/914] Combined the PlanarSLAM examples into a single example without SLAM namespaces --- examples/PlanarSLAMExample.cpp | 138 +++++++++++++------ examples/PlanarSLAMExample_selfcontained.cpp | 137 ------------------ 2 files changed, 94 insertions(+), 181 deletions(-) delete mode 100644 examples/PlanarSLAMExample_selfcontained.cpp diff --git a/examples/PlanarSLAMExample.cpp b/examples/PlanarSLAMExample.cpp index f05ffa9b2..c6f6b636f 100644 --- a/examples/PlanarSLAMExample.cpp +++ b/examples/PlanarSLAMExample.cpp @@ -11,22 +11,12 @@ /** * @file PlanarSLAMExample.cpp - * @brief Simple robotics example using the pre-built planar SLAM domain + * @brief Simple robotics example using odometry measurements and bearing-range (laser) measurements * @author Alex Cunningham */ -// pull in the planar SLAM domain with all typedefs and helper functions defined -#include - -// we will use Symbol keys -#include - -using namespace std; -using namespace gtsam; -using namespace gtsam::noiseModel; - /** - * Example of a simple 2D planar slam example with landmarls + * A simple 2D planar slam example with landmarks * - The robot and landmarks are on a 2 meter grid * - Robot poses are facing along the X axis (horizontal, to the right in 2D) * - The robot moves 2 meters each step @@ -34,29 +24,74 @@ using namespace gtsam::noiseModel; * - We have bearing and range information for measurements * - Landmarks are 2 meters away from the robot trajectory */ + +// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent +// the robot positions and Point2 variables (x, y) to represent the landmark coordinates. +#include +#include + +// Each variable in the system (poses and landmarks) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use Symbols +#include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use a RangeBearing factor for the range-bearing measurements to identified +// landmarks, and Between factors for the relative motion described by odometry measurements. +// Also, we will initialize the robot at the origin using a Prior factor. +#include +#include +#include + +// When the factors are created, we will add them to a Factor Graph. As the factors we are using +// are nonlinear factors, we will need a Nonlinear Factor Graph. +#include + +// Finally, once all of the factors have been added to our factor graph, we will want to +// solve/optimize to graph to find the best (Maximum A Posteriori) set of variable values. +// GTSAM includes several nonlinear optimizers to perform this step. Here we will use the +// common Levenberg-Marquardt solver +#include + +// Once the optimized values have been calculated, we can also calculate the marginal covariance +// of desired variables +#include + +// The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the +// nonlinear functions around an initial linearization point, then solve the linear system +// to update the linearization point. This happens repeatedly until the solver converges +// to a consistent set of variable values. This requires us to specify an initial guess +// for each variable, held in a Values container. +#include + + +using namespace std; +using namespace gtsam; + int main(int argc, char** argv) { - // create the graph (defined in planarSlam.h, derived from NonlinearFactorGraph) - planarSLAM::Graph graph; + // Create a factor graph + NonlinearFactorGraph graph; - // Create some keys - static Symbol i1('x',1), i2('x',2), i3('x',3); - static Symbol j1('l',1), j2('l',2); + // Create the keys we need for this simple example + static Symbol x1('x',1), x2('x',2), x3('x',3); + static Symbol l1('l',1), l2('l',2); - // add a Gaussian prior on pose x_1 - Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin - SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta - graph.addPosePrior(i1, priorMean, priorNoise); // add directly to graph + // Add a prior on pose x1 at the origin. A prior factor consists of a mean and a noise model (covariance matrix) + Pose2 prior(0.0, 0.0, 0.0); // prior mean is at origin + noiseModel::Diagonal::shared_ptr priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta + graph.add(PriorFactor(x1, prior, priorNoise)); // add directly to graph - // add two odometry factors + // Add two odometry factors Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - graph.addRelativePose(i1, i2, odometry, odometryNoise); - graph.addRelativePose(i2, i3, odometry, odometryNoise); + noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta + graph.add(BetweenFactor(x1, x2, odometry, odometryNoise)); + graph.add(BetweenFactor(x2, x3, odometry, odometryNoise)); + // Add Range-Bearing measurements to two different landmarks // create a noise model for the landmark measurements - SharedDiagonal measurementNoise = Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); // 0.1 rad std on bearing, 20cm on range - + noiseModel::Diagonal::shared_ptr measurementNoise = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); // 0.1 rad std on bearing, 20cm on range // create the measurement values - indices are (pose id, landmark id) Rot2 bearing11 = Rot2::fromDegrees(45), bearing21 = Rot2::fromDegrees(90), @@ -65,27 +100,42 @@ int main(int argc, char** argv) { range21 = 2.0, range32 = 2.0; - // add bearing/range factors (created by "addBearingRange") - graph.addBearingRange(i1, j1, bearing11, range11, measurementNoise); - graph.addBearingRange(i2, j1, bearing21, range21, measurementNoise); - graph.addBearingRange(i3, j2, bearing32, range32, measurementNoise); + // Add Bearing-Range factors + graph.add(BearingRangeFactor(x1, l1, bearing11, range11, measurementNoise)); + graph.add(BearingRangeFactor(x2, l1, bearing21, range21, measurementNoise)); + graph.add(BearingRangeFactor(x3, l2, bearing32, range32, measurementNoise)); - // print - graph.print("Factor graph"); + // Print + graph.print("Factor Graph:\n"); - // create (deliberatly inaccurate) initial estimate - planarSLAM::Values initialEstimate; - initialEstimate.insertPose(i1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insertPose(i2, Pose2(2.3, 0.1,-0.2)); - initialEstimate.insertPose(i3, Pose2(4.1, 0.1, 0.1)); - initialEstimate.insertPoint(j1, Point2(1.8, 2.1)); - initialEstimate.insertPoint(j2, Point2(4.1, 1.8)); + // Create (deliberately inaccurate) initial estimate + Values initialEstimate; + initialEstimate.insert(x1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insert(x2, Pose2(2.3, 0.1,-0.2)); + initialEstimate.insert(x3, Pose2(4.1, 0.1, 0.1)); + initialEstimate.insert(l1, Point2(1.8, 2.1)); + initialEstimate.insert(l2, Point2(4.1, 1.8)); - initialEstimate.print("Initial estimate:\n "); + // Print + initialEstimate.print("Initial Estimate:\n"); - // optimize using Levenberg-Marquardt optimization with an ordering from colamd - planarSLAM::Values result = graph.optimize(initialEstimate); - result.print("Final result:\n "); + // Optimize using Levenberg-Marquardt optimization. The optimizer + // accepts an optional set of configuration parameters, controlling + // things like convergence criteria, the type of linear system solver + // to use, and the amount of information displayed during optimization. + // Here we will use the default set of parameters. See the + // documentation for the full set of parameters. + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); + Values result = optimizer.optimize(); + result.print("Final Result:\n"); + + // Calculate and print marginal covariances for all variables + Marginals marginals(graph, result); + print(marginals.marginalCovariance(x1), "x1 covariance"); + print(marginals.marginalCovariance(x2), "x2 covariance"); + print(marginals.marginalCovariance(x3), "x3 covariance"); + print(marginals.marginalCovariance(l1), "l1 covariance"); + print(marginals.marginalCovariance(l2), "l2 covariance"); return 0; } diff --git a/examples/PlanarSLAMExample_selfcontained.cpp b/examples/PlanarSLAMExample_selfcontained.cpp deleted file mode 100644 index 7c8ccc134..000000000 --- a/examples/PlanarSLAMExample_selfcontained.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 PlanarSLAMExample_selfcontained.cpp - * @brief Simple robotics example with all typedefs internal to this script. - * @author Alex Cunningham - */ - -// add in headers for specific factors -#include -#include -#include - -// for all nonlinear keys -#include - -// implementations for structures - needed if self-contained, and these should be included last -#include -#include -#include - -// for modeling measurement uncertainty - all models included here -#include - -// for points and poses -#include -#include - -#include -#include - -using namespace std; -using namespace gtsam; - -/** - * In this version of the system we make the following assumptions: - * - All values are axis aligned - * - Robot poses are facing along the X axis (horizontal, to the right in images) - * - We have bearing and range information for measurements - * - We have full odometry for measurements - * - The robot and landmarks are on a grid, moving 2 meters each step - * - Landmarks are 2 meters away from the robot trajectory - */ -int main(int argc, char** argv) { - // create keys for variables - Symbol i1('x',1), i2('x',2), i3('x',3); - Symbol j1('l',1), j2('l',2); - - // create graph container and add factors to it - NonlinearFactorGraph graph; - - /* add prior */ - // gaussian for prior - SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - PriorFactor posePrior(i1, priorMean, priorNoise); // create the factor - graph.add(posePrior); // add the factor to the graph - - /* add odometry */ - // general noisemodel for odometry - SharedDiagonal odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - // create between factors to represent odometry - BetweenFactor odom12(i1, i2, odometry, odometryNoise); - BetweenFactor odom23(i2, i3, odometry, odometryNoise); - graph.add(odom12); // add both to graph - graph.add(odom23); - - /* add measurements */ - // general noisemodel for measurements - SharedDiagonal measurementNoise = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); - - // create the measurement values - indices are (pose id, landmark id) - Rot2 bearing11 = Rot2::fromDegrees(45), - bearing21 = Rot2::fromDegrees(90), - bearing32 = Rot2::fromDegrees(90); - double range11 = sqrt(4.0+4.0), - range21 = 2.0, - range32 = 2.0; - - // create bearing/range factors - BearingRangeFactor meas11(i1, j1, bearing11, range11, measurementNoise); - BearingRangeFactor meas21(i2, j1, bearing21, range21, measurementNoise); - BearingRangeFactor meas32(i3, j2, bearing32, range32, measurementNoise); - - // add the factors - graph.add(meas11); - graph.add(meas21); - graph.add(meas32); - - graph.print("Full Graph"); - - // initialize to noisy points - Values initial; - initial.insert(i1, Pose2(0.5, 0.0, 0.2)); - initial.insert(i2, Pose2(2.3, 0.1,-0.2)); - initial.insert(i3, Pose2(4.1, 0.1, 0.1)); - initial.insert(j1, Point2(1.8, 2.1)); - initial.insert(j2, Point2(4.1, 1.8)); - - initial.print("initial estimate"); - - // optimize using Levenberg-Marquardt optimization with an ordering from colamd - - // first using sequential elimination - LevenbergMarquardtParams lmParams; - lmParams.linearSolverType = LevenbergMarquardtParams::SEQUENTIAL_CHOLESKY; - Values resultSequential = LevenbergMarquardtOptimizer(graph, initial, lmParams).optimize(); - resultSequential.print("final result (solved with a sequential solver)"); - - // then using multifrontal, advanced interface - // Note that we keep the original optimizer object so we can use the COLAMD - // ordering it computes. - LevenbergMarquardtOptimizer optimizer(graph, initial); - Values resultMultifrontal = optimizer.optimize(); - resultMultifrontal.print("final result (solved with a multifrontal solver)"); - - // Print marginals covariances for all variables - Marginals marginals(graph, resultMultifrontal, Marginals::CHOLESKY); - print(marginals.marginalCovariance(i1), "i1 covariance"); - print(marginals.marginalCovariance(i2), "i2 covariance"); - print(marginals.marginalCovariance(i3), "i3 covariance"); - print(marginals.marginalCovariance(j1), "j1 covariance"); - print(marginals.marginalCovariance(j2), "j2 covariance"); - - return 0; -} - From 67e2d832feafea9413c5f6d783b6f3d04cf87203 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 04:52:01 +0000 Subject: [PATCH 655/914] Updated the VisualSLAM examples, removing the SLAM namespaces --- examples/VisualISAMExample.cpp | 184 ++++++++++++++++++++------------- examples/VisualSLAMData.h | 89 ---------------- examples/VisualSLAMExample.cpp | 134 ++++++++++++++++++------ 3 files changed, 216 insertions(+), 191 deletions(-) delete mode 100644 examples/VisualSLAMData.h diff --git a/examples/VisualISAMExample.cpp b/examples/VisualISAMExample.cpp index 25e993bca..eab860db0 100644 --- a/examples/VisualISAMExample.cpp +++ b/examples/VisualISAMExample.cpp @@ -11,99 +11,139 @@ /** * @file VisualISAMExample.cpp - * @brief An ISAM example for synthesis sequence, single camera + * @brief A visualSLAM example for the structure-from-motion problem on a simulated dataset + * This version uses iSAM to solve the problem incrementally * @author Duy-Nguyen Ta */ +/** + * A structure-from-motion example with landmarks + * - The landmarks form a 10 meter cube + * - The robot rotates around the landmarks, always facing towards the cube + */ + +// As this is a full 3D problem, we will use Pose3 variables to represent the camera +// positions and Point3 variables (x, y, z) to represent the landmark coordinates. +// Camera observations of landmarks (i.e. pixel coordinates) will be stored as Point2 (x, y). +// We will also need a camera object to hold calibration information and perform projections. +#include +#include +#include +#include + +// Each variable in the system (poses and landmarks) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use Symbols #include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use Projection factors to model the camera's landmark observations. +// Also, we will initialize the robot at some location using a Prior factor. +#include +#include + +// We want to use iSAM to solve the structure-from-motion problem incrementally, so +// include iSAM here #include -#include -#include -#include "VisualSLAMData.h" + +// iSAM requires as input a set set of new factors to be added stored in a factor graph, +// and initial guesses for any new variables used in the added factors +#include +#include + +#include using namespace std; using namespace gtsam; -// Convenience for named keys -using symbol_shorthand::X; -using symbol_shorthand::L; - /* ************************************************************************* */ int main(int argc, char* argv[]) { - VisualSLAMExampleData data = VisualSLAMExampleData::generate(); + // Define the camera calibration parameters + Cal3_S2::shared_ptr K(new Cal3_S2(50.0, 50.0, 0.0, 50.0, 50.0)); - /* 1. Create a NonlinearISAM which will be relinearized and reordered after every "relinearizeInterval" updates */ - int relinearizeInterval = 3; - NonlinearISAM isam(relinearizeInterval); + // Define the camera observation noise model + noiseModel::Isotropic::shared_ptr measurementNoise = noiseModel::Isotropic::Sigma(2, 1.0); // one pixel in u and v - /* 2. At each frame (poseId) with new camera pose and set of associated measurements, - * create a graph of new factors and update ISAM */ + // Create the set of ground-truth landmarks + std::vector points; + points.push_back(gtsam::Point3(10.0,10.0,10.0)); + points.push_back(gtsam::Point3(-10.0,10.0,10.0)); + points.push_back(gtsam::Point3(-10.0,-10.0,10.0)); + points.push_back(gtsam::Point3(10.0,-10.0,10.0)); + points.push_back(gtsam::Point3(10.0,10.0,-10.0)); + points.push_back(gtsam::Point3(-10.0,10.0,-10.0)); + points.push_back(gtsam::Point3(-10.0,-10.0,-10.0)); + points.push_back(gtsam::Point3(10.0,-10.0,-10.0)); - // Store the current best estimate from ISAM - Values currentEstimate; - - // First two frames: - // Add factors and initial values for the first two poses and landmarks then update ISAM. - // Note: measurements from the first pose only are not enough to update ISAM: - // the system is underconstrained. - { - visualSLAM::Graph newFactors; - - // First pose with prior factor - newFactors.addPosePrior(X(0), data.poses[0], data.noiseX); - - // Second pose with odometry measurement - newFactors.addRelativePose(X(0), X(1), data.odometry, data.noiseX); - - // Visual measurements at both poses - for (size_t i=0; i<2; ++i) { - for (size_t j=0; j poses; + double radius = 30.0; + int i = 0; + double theta = 0.0; + gtsam::Point3 up(0,0,1); + gtsam::Point3 target(0,0,0); + for(; i < 8; ++i, theta += 2*M_PI/8) { + gtsam::Point3 position = Point3(radius*cos(theta), radius*sin(theta), 0.0); + gtsam::SimpleCamera camera = SimpleCamera::Lookat(position, target, up); + poses.push_back(camera.pose()); } - // Subsequent frames: Add new odometry and measurement factors and initial values, - // then update ISAM at each frame - for (size_t i=2; i(X(i-1))*data.odometry); + // Create a Factor Graph and Values to hold the new data + NonlinearFactorGraph graph; + Values initialEstimate; - // update ISAM - isam.update(newFactors, initials); - currentEstimate = isam.estimate(); - cout << "****************************************************" << endl; - cout << "Frame " << i << ": " << endl; - currentEstimate.print("Current estimate: "); + // Loop over the different poses, adding the observations to iSAM incrementally + for (size_t i = 0; i < poses.size(); ++i) { + + // Add factors for each landmark observation + for (size_t j = 0; j < points.size(); ++j) { + SimpleCamera camera(poses[i], *K); + Point2 measurement = camera.project(points[j]); + graph.add(GenericProjectionFactor(measurement, measurementNoise, Symbol('x', i), Symbol('l', j), K)); + } + + // Add an initial guess for the current pose + // Intentionally initialize the variables off from the ground truth + initialEstimate.insert(Symbol('x', i), poses[i].compose(Pose3(Rot3::rodriguez(-0.1, 0.2, 0.25), Point3(0.05, -0.10, 0.20)))); + + // If this is the first iteration, add a prior on the first pose to set the coordinate frame + // and a prior on the first landmark to set the scale + // Also, as iSAM solves incrementally, we must wait until each is observed at least twice before + // adding it to iSAM. + if( i == 0) { + // Add a prior on pose x0 + noiseModel::Diagonal::shared_ptr poseNoise = noiseModel::Diagonal::Sigmas(Vector_(6, 0.3, 0.3, 0.3, 0.1, 0.1, 0.1)); // 30cm std on x,y,z 0.1 rad on roll,pitch,yaw + graph.add(PriorFactor(Symbol('x', 0), poses[0], poseNoise)); + + // Add a prior on landmark l0 + noiseModel::Isotropic::shared_ptr pointNoise = noiseModel::Isotropic::Sigma(3, 0.1); + graph.add(PriorFactor(Symbol('l', 0), points[0], pointNoise)); // add directly to graph + + // Add initial guesses to all observed landmarks + // Intentionally initialize the variables off from the ground truth + for (size_t j = 0; j < points.size(); ++j) + initialEstimate.insert(Symbol('l', j), points[j].compose(Point3(-0.25, 0.20, 0.15))); + + } else { + // Update iSAM with the new factors + isam.update(graph, initialEstimate); + Values currentEstimate = isam.estimate(); + cout << "****************************************************" << endl; + cout << "Frame " << i << ": " << endl; + currentEstimate.print("Current estimate: "); + + // Clear the factor graph and values for the next iteration + graph.resize(0); + initialEstimate.clear(); + } } return 0; } /* ************************************************************************* */ - diff --git a/examples/VisualSLAMData.h b/examples/VisualSLAMData.h deleted file mode 100644 index 28fa3040c..000000000 --- a/examples/VisualSLAMData.h +++ /dev/null @@ -1,89 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 VisualSLAMData.cpp - * @brief Generate ground-truth simulated data for VisualSLAM examples - * @author Duy-Nguyen Ta - */ - -#pragma once - -#include -#include -#include - -/* ************************************************************************* */ -/** - * Simulated data for the visual SLAM examples: - * - 8 Landmarks: (10,10,10) (-10,10,10) (-10,-10,10) (10,-10,10) - * (10,10,-10) (-10,10,-10) (-10,-10,-10) (10,-10,-10) - * - n 90-deg-FoV cameras with the same calibration parameters: - * f = 50.0, Image: 100x100, center: 50.0, 50.0 - * and ground-truth poses on a circle around the landmarks looking at the world's origin: - * Rot3(-sin(theta), 0, -cos(theta), - * cos(theta), 0, -sin(theta), - * 0, -1, 0 ), - * Point3(r*cos(theta), r*sin(theta), 0.0) - * (theta += 2*pi/N) - * - Measurement noise: 1 pix sigma - */ -struct VisualSLAMExampleData { - gtsam::shared_ptrK sK; // camera calibration parameters - std::vector poses; // ground-truth camera poses - gtsam::Pose3 odometry; // ground-truth odometry between 2 consecutive poses (simulated data for iSAM) - std::vector points; // ground-truth landmarks - std::map > z; // 2D measurements of landmarks in each camera frame - gtsam::SharedDiagonal noiseZ; // measurement noise (noiseModel::Isotropic::Sigma(2, 5.0f)); - gtsam::SharedDiagonal noiseX; // noise for camera poses - gtsam::SharedDiagonal noiseL; // noise for landmarks - - static const VisualSLAMExampleData generate() { - VisualSLAMExampleData data; - // Landmarks (ground truth) - data.points.push_back(gtsam::Point3(10.0,10.0,10.0)); - data.points.push_back(gtsam::Point3(-10.0,10.0,10.0)); - data.points.push_back(gtsam::Point3(-10.0,-10.0,10.0)); - data.points.push_back(gtsam::Point3(10.0,-10.0,10.0)); - data.points.push_back(gtsam::Point3(10.0,10.0,-10.0)); - data.points.push_back(gtsam::Point3(-10.0,10.0,-10.0)); - data.points.push_back(gtsam::Point3(-10.0,-10.0,-10.0)); - data.points.push_back(gtsam::Point3(10.0,-10.0,-10.0)); - - // Camera calibration parameters - data.sK = gtsam::shared_ptrK(new gtsam::Cal3_S2(50.0, 50.0, 0.0, 50.0, 50.0)); - - // n camera poses - int n = 8; - double theta = 0.0; - double r = 30.0; - for (int i=0; isample()))*/); // you can add noise as desired - } - } - data.noiseX = gtsam::noiseModel::Diagonal::Sigmas(gtsam::Vector_(6, 0.001, 0.001, 0.001, 0.1, 0.1, 0.1)); - data.noiseL = gtsam::noiseModel::Isotropic::Sigma(3, 0.1); - - return data; - } -}; diff --git a/examples/VisualSLAMExample.cpp b/examples/VisualSLAMExample.cpp index 1fc343203..8aed051eb 100644 --- a/examples/VisualSLAMExample.cpp +++ b/examples/VisualSLAMExample.cpp @@ -15,49 +15,123 @@ * @author Duy-Nguyen Ta */ -#include +/** + * A structure-from-motion example with landmarks + * - The landmarks form a 10 meter cube + * - The robot rotates around the landmarks, always facing towards the cube + */ + +// As this is a full 3D problem, we will use Pose3 variables to represent the camera +// positions and Point3 variables (x, y, z) to represent the landmark coordinates. +// Camera observations of landmarks (i.e. pixel coordinates) will be stored as Point2 (x, y). +// We will also need a camera object to hold calibration information and perform projections. +#include +#include +#include +#include + +// Each variable in the system (poses and landmarks) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use Symbols #include -#include -#include -#include "VisualSLAMData.h" + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use Projection factors to model the camera's landmark observations. +// Also, we will initialize the robot at some location using a Prior factor. +#include +#include + +// When the factors are created, we will add them to a Factor Graph. As the factors we are using +// are nonlinear factors, we will need a Nonlinear Factor Graph. +#include + +// Finally, once all of the factors have been added to our factor graph, we will want to +// solve/optimize to graph to find the best (Maximum A Posteriori) set of variable values. +// GTSAM includes several nonlinear optimizers to perform this step. Here we will use a +// trust-region method known as Powell's Degleg +#include + +// The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the +// nonlinear functions around an initial linearization point, then solve the linear system +// to update the linearization point. This happens repeatedly until the solver converges +// to a consistent set of variable values. This requires us to specify an initial guess +// for each variable, held in a Values container. +#include + +#include using namespace std; using namespace gtsam; -// Convenience for named keys -using symbol_shorthand::X; -using symbol_shorthand::L; - /* ************************************************************************* */ int main(int argc, char* argv[]) { - VisualSLAMExampleData data = VisualSLAMExampleData::generate(); + // Define the camera calibration parameters + Cal3_S2::shared_ptr K(new Cal3_S2(50.0, 50.0, 0.0, 50.0, 50.0)); - /* 1. Create graph *///using the 2D measurements (features) and the calibration data - visualSLAM::Graph graph; + // Define the camera observation noise model + noiseModel::Isotropic::shared_ptr measurementNoise = noiseModel::Isotropic::Sigma(2, 1.0); // one pixel in u and v - /* 2. Add factors to the graph */ - // 2a. Measurement factors - for (size_t i=0; i points; + points.push_back(gtsam::Point3(10.0,10.0,10.0)); + points.push_back(gtsam::Point3(-10.0,10.0,10.0)); + points.push_back(gtsam::Point3(-10.0,-10.0,10.0)); + points.push_back(gtsam::Point3(10.0,-10.0,10.0)); + points.push_back(gtsam::Point3(10.0,10.0,-10.0)); + points.push_back(gtsam::Point3(-10.0,10.0,-10.0)); + points.push_back(gtsam::Point3(-10.0,-10.0,-10.0)); + points.push_back(gtsam::Point3(10.0,-10.0,-10.0)); + + // Create the set of ground-truth poses + std::vector poses; + double radius = 30.0; + int i = 0; + double theta = 0.0; + gtsam::Point3 up(0,0,1); + gtsam::Point3 target(0,0,0); + for(; i < 8; ++i, theta += 2*M_PI/8) { + gtsam::Point3 position = Point3(radius*cos(theta), radius*sin(theta), 0.0); + gtsam::SimpleCamera camera = SimpleCamera::Lookat(position, target, up); + poses.push_back(camera.pose()); } - // 2b. Prior factor for the first pose and point to constraint the system - graph.addPosePrior(X(0), data.poses[0], data.noiseX); - graph.addPointPrior(L(0), data.points[0], data.noiseL); - /* 3. Initial estimates for variable nodes, simulated by Gaussian noises */ - Values initial; - for (size_t i=0; isample())*/); // you can add noise if you want - for (size_t j=0; jsample())*/); // you can add noise if you want - initial.print("Intial Estimates: "); + // Create a factor graph + NonlinearFactorGraph graph; - /* 4. Optimize the graph and print results */ - visualSLAM::Values result = GaussNewtonOptimizer(graph, initial).optimize(); -// visualSLAM::Values result = LevenbergMarquardtOptimizer(graph, initial).optimize(); - result.print("Final results: "); + // Add a prior on pose x1. This indirectly specifies where the origin is. + noiseModel::Diagonal::shared_ptr poseNoise = noiseModel::Diagonal::Sigmas(Vector_(6, 0.3, 0.3, 0.3, 0.1, 0.1, 0.1)); // 30cm std on x,y,z 0.1 rad on roll,pitch,yaw + graph.add(PriorFactor(Symbol('x', 0), poses[0], poseNoise)); // add directly to graph + + // Simulated measurements from each camera pose, adding them to the factor graph + for (size_t i = 0; i < poses.size(); ++i) { + for (size_t j = 0; j < points.size(); ++j) { + SimpleCamera camera(poses[i], *K); + Point2 measurement = camera.project(points[j]); + graph.add(GenericProjectionFactor(measurement, measurementNoise, Symbol('x', i), Symbol('l', j), K)); + } + } + + // Because the structure-from-motion problem has a scale ambiguity, the problem is still under-constrained + // Here we add a prior on the position of the first landmark. This fixes the scale by indicating the distance + // between the first camera and the first landmark. All other landmark positions are interpreted using this scale. + noiseModel::Isotropic::shared_ptr pointNoise = noiseModel::Isotropic::Sigma(3, 0.1); + graph.add(PriorFactor(Symbol('l', 0), points[0], pointNoise)); // add directly to graph + graph.print("Factor Graph:\n"); + + // Create the data structure to hold the initialEstimate estimate to the solution + // Intentionally initialize the variables off from the ground truth + Values initialEstimate; + for (size_t i = 0; i < poses.size(); ++i) + initialEstimate.insert(Symbol('x', i), poses[i].compose(Pose3(Rot3::rodriguez(-0.1, 0.2, 0.25), Point3(0.05, -0.10, 0.20)))); + for (size_t j = 0; j < points.size(); ++j) + initialEstimate.insert(Symbol('l', j), points[j].compose(Point3(-0.25, 0.20, 0.15))); + initialEstimate.print("Initial Estimates:\n"); + + /* Optimize the graph and print results */ + Values result = DoglegOptimizer(graph, initialEstimate).optimize(); + result.print("Final results:\n"); return 0; } From 45d1c4f0ed2a73b685ae3a174d6d241fb7e2a565 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 05:21:32 +0000 Subject: [PATCH 656/914] Removed SLAM namespaces from OdometryExample --- examples/OdometryExample.cpp | 117 ++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/examples/OdometryExample.cpp b/examples/OdometryExample.cpp index 36ad5f228..f0874bedb 100644 --- a/examples/OdometryExample.cpp +++ b/examples/OdometryExample.cpp @@ -15,62 +15,91 @@ * @author Frank Dellaert */ -// pull in the 2D PoseSLAM domain with all typedefs and helper functions defined -#include - -// include this for marginals -#include - -#include -#include - -using namespace std; -using namespace gtsam; -using namespace gtsam::noiseModel; - /** * Example of a simple 2D localization example * - Robot poses are facing along the X axis (horizontal, to the right in 2D) * - The robot moves 2 meters each step * - We have full odometry between poses */ + +// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent +// the robot positions +#include +#include + +// Each variable in the system (poses) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use symbols +#include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use Between factors for the relative motion described by odometry measurements. +// Also, we will initialize the robot at the origin using a Prior factor. +#include +#include + +// When the factors are created, we will add them to a Factor Graph. As the factors we are using +// are nonlinear factors, we will need a Nonlinear Factor Graph. +#include + +// Finally, once all of the factors have been added to our factor graph, we will want to +// solve/optimize to graph to find the best (Maximum A Posteriori) set of variable values. +// GTSAM includes several nonlinear optimizers to perform this step. Here we will use the +// Levenberg-Marquardt solver +#include + +// Once the optimized values have been calculated, we can also calculate the marginal covariance +// of desired variables +#include + +// The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the +// nonlinear functions around an initial linearization point, then solve the linear system +// to update the linearization point. This happens repeatedly until the solver converges +// to a consistent set of variable values. This requires us to specify an initial guess +// for each variable, held in a Values container. +#include + + +using namespace std; +using namespace gtsam; + int main(int argc, char** argv) { - // create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) - pose2SLAM::Graph graph; + // Create a factor graph container + NonlinearFactorGraph graph; - // add a Gaussian prior on pose x_1 - Pose2 priorMean(0.0, 0.0, 0.0); // prior mean is at origin - SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); // 30cm std on x,y, 0.1 rad on theta - graph.addPosePrior(1, priorMean, priorNoise); // add directly to graph + // Add a prior on the first pose, setting it to the origin + // A prior factor consists of a mean and a noise model (covariance matrix) + Pose2 prior(0.0, 0.0, 0.0); // prior at origin + noiseModel::Diagonal::shared_ptr priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); + graph.add(PriorFactor(Symbol('x', 1), prior, priorNoise)); - // add two odometry factors - Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - graph.addRelativePose(1, 2, odometry, odometryNoise); - graph.addRelativePose(2, 3, odometry, odometryNoise); + // Add odometry factors + // For simplicity, we will use the same noise model for each odometry factor + noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + // Create odometry (Between) factors between consecutive poses + graph.add(BetweenFactor(Symbol('x', 1), Symbol('x', 2), Pose2(2.0, 0.0, 0.0), odometryNoise)); + graph.add(BetweenFactor(Symbol('x', 2), Symbol('x', 3), Pose2(2.0, 0.0, 0.0), odometryNoise)); + graph.print("\nFactor Graph:\n"); // print - // print - graph.print("\nFactor graph:\n"); + // Create the data structure to hold the initialEstimate estimate to the solution + // For illustrative purposes, these have been deliberately set to incorrect values + Values initialEstimate; + initialEstimate.insert(Symbol('x', 1), Pose2(0.5, 0.0, 0.2)); + initialEstimate.insert(Symbol('x', 2), Pose2(2.3, 0.1, -0.2)); + initialEstimate.insert(Symbol('x', 3), Pose2(4.1, 0.1, 0.1)); + initialEstimate.print("\nInitial Estimate:\n"); // print - // create (deliberatly inaccurate) initial estimate - pose2SLAM::Values initialEstimate; - initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insertPose(2, Pose2(2.3, 0.1, -0.2)); - initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); - initialEstimate.print("\nInitial estimate:\n "); + // optimize using Levenberg-Marquardt optimization + Values result = LevenbergMarquardtOptimizer(graph, initialEstimate).optimize(); + result.print("Final Result:\n"); - // optimize using Levenberg-Marquardt optimization with an ordering from colamd - pose2SLAM::Values result = graph.optimize(initialEstimate); - result.print("\nFinal result:\n "); + // Calculate and print marginal covariances for all variables + Marginals marginals(graph, result); + cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(Symbol('x', 1)) << endl; + cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(Symbol('x', 2)) << endl; + cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(Symbol('x', 3)) << endl; - // Query the marginals - cout.precision(2); - Marginals marginals = graph.marginals(result); - cout << "\nP1:\n" << marginals.marginalCovariance(1) << endl; - cout << "\nP2:\n" << marginals.marginalCovariance(2) << endl; - cout << "\nP3:\n" << marginals.marginalCovariance(3) << endl; - - return 0; + return 0; } - From e3a6282ff8170f4435dc7d6ed3a5de3f65141a3c Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 05:34:22 +0000 Subject: [PATCH 657/914] Removed SLAM namespaces from SPCG example. Still needs better documentation by someone who knows what SPCG is. --- examples/Pose2SLAMwSPCG.cpp | 130 +++++++++++++++++++++++------------- 1 file changed, 83 insertions(+), 47 deletions(-) diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index e2f3801f7..38a2e18e4 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -16,79 +16,115 @@ * @date June 2, 2012 */ +/** + * A simple 2D pose slam example solved using a Conjugate-Gradient method + * - The robot moves in a 2 meter square + * - The robot moves 2 meters each step, turning 90 degrees after each step + * - The robot initially faces along the X axis (horizontal, to the right in 2D) + * - We have full odometry between pose + * - We have a loop closure constraint when the robot returns to the first position + */ + +// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent +// the robot positions +#include +#include + +// Each variable in the system (poses) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use simple integer keys +#include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use Between factors for the relative motion described by odometry measurements. +// We will also use a Between Factor to encode the loop closure constraint +// Also, we will initialize the robot at the origin using a Prior factor. +#include +#include + +// When the factors are created, we will add them to a Factor Graph. As the factors we are using +// are nonlinear factors, we will need a Nonlinear Factor Graph. +#include + +// The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the +// nonlinear functions around an initial linearization point, then solve the linear system +// to update the linearization point. This happens repeatedly until the solver converges +// to a consistent set of variable values. This requires us to specify an initial guess +// for each variable, held in a Values container. +#include + +// ??? #include #include #include -#include -#include -#include + using namespace std; using namespace gtsam; -using namespace gtsam::noiseModel; -/* ************************************************************************* */ -int main(void) { +int main(int argc, char** argv) { - // 1. Create graph container and add factors to it - pose2SLAM::Graph graph ; + // 1. Create a factor graph container and add factors to it + NonlinearFactorGraph graph; - // 2a. Add Gaussian prior - Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.addPosePrior(1, priorMean, priorNoise); + // 2a. Add a prior on the first pose, setting it to the origin + // A prior factor consists of a mean and a noise model (covariance matrix) + Pose2 prior(0.0, 0.0, 0.0); // prior at origin + noiseModel::Diagonal::shared_ptr priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); + graph.add(PriorFactor(1, prior, priorNoise)); // 2b. Add odometry factors - SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); - graph.addRelativePose(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addRelativePose(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addRelativePose(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + // For simplicity, we will use the same noise model for each odometry factor + noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + // Create odometry (Between) factors between consecutive poses + graph.add(BetweenFactor(1, 2, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); - // 2c. Add pose constraint - SharedDiagonal constraintUncertainty = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addRelativePose(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + // 2c. Add the loop closure constraint + // This factor encodes the fact that we have returned to the same pose. In real systems, + // these constraints may be identified in many ways, such as appearance-based techniques + // with camera images. + // We will use another Between Factor to enforce this constraint, with the distance set to zero, + noiseModel::Diagonal::shared_ptr model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + graph.add(BetweenFactor(5, 1, Pose2(0.0, 0.0, 0.0), model)); + graph.print("\nFactor Graph:\n"); // print - // print - graph.print("\nFactor graph:\n"); - // 3. Create the data structure to hold the initialEstimate estinmate to the solution - pose2SLAM::Values initialEstimate; - Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); - Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); - Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); - Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); - Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); - initialEstimate.print("\nInitial estimate:\n "); - cout << "initial error = " << graph.error(initialEstimate) << endl ; + // 3. Create the data structure to hold the initialEstimate estimate to the solution + // For illustrative purposes, these have been deliberately set to incorrect values + Values initialEstimate; + initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insert(2, Pose2(2.3, 0.1, 1.1)); + initialEstimate.insert(3, Pose2(2.1, 1.9, 2.8)); + initialEstimate.insert(4, Pose2(-.3, 2.5, 4.2)); + initialEstimate.insert(5, Pose2(0.1,-0.7, 5.8)); + initialEstimate.print("\nInitial Estimate:\n"); // print // 4. Single Step Optimization using Levenberg-Marquardt - LevenbergMarquardtParams param; - param.verbosity = NonlinearOptimizerParams::ERROR; - param.verbosityLM = LevenbergMarquardtParams::LAMBDA; - param.linearSolverType = SuccessiveLinearizationParams::CG; + LevenbergMarquardtParams parameters; + parameters.verbosity = NonlinearOptimizerParams::ERROR; + parameters.verbosityLM = LevenbergMarquardtParams::LAMBDA; + parameters.linearSolverType = SuccessiveLinearizationParams::CG; { - param.iterativeParams = boost::make_shared(); - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, param); + parameters.iterativeParams = boost::make_shared(); + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, parameters); Values result = optimizer.optimize(); - result.print("\nFinal result:\n"); + result.print("Final Result:\n"); cout << "simple spcg solver final error = " << graph.error(result) << endl; } { - param.iterativeParams = boost::make_shared(); - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, param); + parameters.iterativeParams = boost::make_shared(); + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, parameters); Values result = optimizer.optimize(); - result.print("\nFinal result:\n"); + result.print("Final Result:\n"); cout << "subgraph solver final error = " << graph.error(result) << endl; } - { - Values result = graph.optimizeSPCG(initialEstimate); - result.print("\nFinal result:\n"); - } - - return 0 ; + return 0; } From ff522a73c05c1f9a76b7bde2c3017e9a1e1eecb0 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 05:43:44 +0000 Subject: [PATCH 658/914] Updated documentation on SimpleRotation example --- examples/SimpleRotation.cpp | 54 ++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/examples/SimpleRotation.cpp b/examples/SimpleRotation.cpp index 603d345bf..cff9d754e 100644 --- a/examples/SimpleRotation.cpp +++ b/examples/SimpleRotation.cpp @@ -17,20 +17,41 @@ * @author Alex Cunningham */ -#include -#include -#include + /** + * This example will perform a relatively trivial optimization on + * a single variable with a single factor. + */ + +// In this example, a 2D rotation will be used as the variable of interest #include -#include + +// Each variable in the system (poses) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use symbols #include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// We will apply a simple prior on the rotation +#include + +// When the factors are created, we will add them to a Factor Graph. As the factors we are using +// are nonlinear factors, we will need a Nonlinear Factor Graph. #include + +// The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the +// nonlinear functions around an initial linearization point, then solve the linear system +// to update the linearization point. This happens repeatedly until the solver converges +// to a consistent set of variable values. This requires us to specify an initial guess +// for each variable, held in a Values container. +#include + +// Finally, once all of the factors have been added to our factor graph, we will want to +// solve/optimize to graph to find the best (Maximum A Posteriori) set of variable values. +// GTSAM includes several nonlinear optimizers to perform this step. Here we will use the +// standard Levenberg-Marquardt solver #include -/* - * TODO: make factors independent of RotValues - * TODO: make toplevel documentation - * TODO: Clean up nonlinear optimization API - */ using namespace std; using namespace gtsam; @@ -40,12 +61,7 @@ const double degree = M_PI / 180; int main() { /** - * This example will perform a relatively trivial optimization on - * a single variable with a single factor. - */ - - /** - * Step 1: create a factor on to express a unary constraint + * Step 1: Create a factor to express a unary constraint * The "prior" in this case is the measurement from a sensor, * with a model of the noise on the measurement. * @@ -60,12 +76,12 @@ int main() { */ Rot2 prior = Rot2::fromAngle(30 * degree); prior.print("goal angle"); - SharedDiagonal model = noiseModel::Isotropic::Sigma(1, 1 * degree); + noiseModel::Isotropic::shared_ptr model = noiseModel::Isotropic::Sigma(1, 1 * degree); Symbol key('x',1); PriorFactor factor(key, prior, model); /** - * Step 2: create a graph container and add the factor to it + * Step 2: Create a graph container and add the factor to it * Before optimizing, all factors need to be added to a Graph container, * which provides the necessary top-level functionality for defining a * system of constraints. @@ -78,7 +94,7 @@ int main() { graph.print("full graph"); /** - * Step 3: create an initial estimate + * Step 3: Create an initial estimate * An initial estimate of the solution for the system is necessary to * start optimization. This system state is the "RotValues" structure, * which is similar in structure to a STL map, in that it maps @@ -98,7 +114,7 @@ int main() { initial.print("initial estimate"); /** - * Step 4: optimize + * Step 4: Optimize * After formulating the problem with a graph of constraints * and an initial estimate, executing optimization is as simple * as calling a general optimization function with the graph and From 71c6458e961e49a9b6032bb804ceddcb0f9647d9 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 14:57:34 +0000 Subject: [PATCH 659/914] Updated ExtendedKalmanFilter and relkated example, removing the need for the 'inl' header --- examples/easyPoint2KalmanFilter.cpp | 2 +- gtsam/nonlinear/ExtendedKalmanFilter.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/easyPoint2KalmanFilter.cpp b/examples/easyPoint2KalmanFilter.cpp index 2b4d2476a..6d75e9149 100644 --- a/examples/easyPoint2KalmanFilter.cpp +++ b/examples/easyPoint2KalmanFilter.cpp @@ -21,7 +21,7 @@ * @author Stephen Williams */ -#include +#include #include #include #include diff --git a/gtsam/nonlinear/ExtendedKalmanFilter.h b/gtsam/nonlinear/ExtendedKalmanFilter.h index 353439d98..ebca4899c 100644 --- a/gtsam/nonlinear/ExtendedKalmanFilter.h +++ b/gtsam/nonlinear/ExtendedKalmanFilter.h @@ -90,3 +90,5 @@ namespace gtsam { }; } // namespace + +#include From 5d46beed8653961440416b584fc4304fe7709e74 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 14:59:22 +0000 Subject: [PATCH 660/914] Put the relinearization interval back to 3 for the iSAM example --- examples/VisualISAMExample.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/VisualISAMExample.cpp b/examples/VisualISAMExample.cpp index eab860db0..832a2ab83 100644 --- a/examples/VisualISAMExample.cpp +++ b/examples/VisualISAMExample.cpp @@ -91,7 +91,7 @@ int main(int argc, char* argv[]) { } // Create a NonlinearISAM object which will relinearize and reorder the variables every "relinearizeInterval" updates - int relinearizeInterval = 1; + int relinearizeInterval = 3; NonlinearISAM isam(relinearizeInterval); // Create a Factor Graph and Values to hold the new data From 412ffa38c7c3328ada14dffa0beee70741ebf98d Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 15:15:12 +0000 Subject: [PATCH 661/914] Created a iSAM2 version of the Visual SLAM example --- examples/VisualISAM2Example.cpp | 159 ++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 examples/VisualISAM2Example.cpp diff --git a/examples/VisualISAM2Example.cpp b/examples/VisualISAM2Example.cpp new file mode 100644 index 000000000..1485da1e4 --- /dev/null +++ b/examples/VisualISAM2Example.cpp @@ -0,0 +1,159 @@ +/* ---------------------------------------------------------------------------- + + * 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 VisualISAM2Example.cpp + * @brief A visualSLAM example for the structure-from-motion problem on a simulated dataset + * This version uses iSAM2 to solve the problem incrementally + * @author Duy-Nguyen Ta + */ + +/** + * A structure-from-motion example with landmarks + * - The landmarks form a 10 meter cube + * - The robot rotates around the landmarks, always facing towards the cube + */ + +// As this is a full 3D problem, we will use Pose3 variables to represent the camera +// positions and Point3 variables (x, y, z) to represent the landmark coordinates. +// Camera observations of landmarks (i.e. pixel coordinates) will be stored as Point2 (x, y). +// We will also need a camera object to hold calibration information and perform projections. +#include +#include +#include +#include + +// Each variable in the system (poses and landmarks) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use Symbols +#include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use Projection factors to model the camera's landmark observations. +// Also, we will initialize the robot at some location using a Prior factor. +#include +#include + +// We want to use iSAM2 to solve the structure-from-motion problem incrementally, so +// include iSAM2 here +#include + +// iSAM2 requires as input a set set of new factors to be added stored in a factor graph, +// and initial guesses for any new variables used in the added factors +#include +#include + +#include + +using namespace std; +using namespace gtsam; + +/* ************************************************************************* */ +int main(int argc, char* argv[]) { + + // Define the camera calibration parameters + Cal3_S2::shared_ptr K(new Cal3_S2(50.0, 50.0, 0.0, 50.0, 50.0)); + + // Define the camera observation noise model + noiseModel::Isotropic::shared_ptr measurementNoise = noiseModel::Isotropic::Sigma(2, 1.0); // one pixel in u and v + + // Create the set of ground-truth landmarks + std::vector points; + points.push_back(gtsam::Point3(10.0,10.0,10.0)); + points.push_back(gtsam::Point3(-10.0,10.0,10.0)); + points.push_back(gtsam::Point3(-10.0,-10.0,10.0)); + points.push_back(gtsam::Point3(10.0,-10.0,10.0)); + points.push_back(gtsam::Point3(10.0,10.0,-10.0)); + points.push_back(gtsam::Point3(-10.0,10.0,-10.0)); + points.push_back(gtsam::Point3(-10.0,-10.0,-10.0)); + points.push_back(gtsam::Point3(10.0,-10.0,-10.0)); + + // Create the set of ground-truth poses + std::vector poses; + double radius = 30.0; + int i = 0; + double theta = 0.0; + gtsam::Point3 up(0,0,1); + gtsam::Point3 target(0,0,0); + for(; i < 8; ++i, theta += 2*M_PI/8) { + gtsam::Point3 position = Point3(radius*cos(theta), radius*sin(theta), 0.0); + gtsam::SimpleCamera camera = SimpleCamera::Lookat(position, target, up); + poses.push_back(camera.pose()); + } + + // Create an iSAM2 object. Unlike iSAM1, which performs periodic batch steps to maintain proper linearization + // and efficient variable ordering, iSAM2 performs partial relinearization/reordering at each step. A parameter + // structure is available that allows the user to set various properties, such as the relinearization threshold + // and type of linear solver. For this example, we we set the relinearization threshold small so the iSAM2 result + // will approach the batch result. + ISAM2Params parameters; + parameters.relinearizeThreshold = 0.01; + parameters.relinearizeSkip = 1; + ISAM2 isam(parameters); + + // Create a Factor Graph and Values to hold the new data + NonlinearFactorGraph graph; + Values initialEstimate; + + // Loop over the different poses, adding the observations to iSAM incrementally + for (size_t i = 0; i < poses.size(); ++i) { + + // Add factors for each landmark observation + for (size_t j = 0; j < points.size(); ++j) { + SimpleCamera camera(poses[i], *K); + Point2 measurement = camera.project(points[j]); + graph.add(GenericProjectionFactor(measurement, measurementNoise, Symbol('x', i), Symbol('l', j), K)); + } + + // Add an initial guess for the current pose + // Intentionally initialize the variables off from the ground truth + initialEstimate.insert(Symbol('x', i), poses[i].compose(Pose3(Rot3::rodriguez(-0.1, 0.2, 0.25), Point3(0.05, -0.10, 0.20)))); + + // If this is the first iteration, add a prior on the first pose to set the coordinate frame + // and a prior on the first landmark to set the scale + // Also, as iSAM solves incrementally, we must wait until each is observed at least twice before + // adding it to iSAM. + if( i == 0) { + // Add a prior on pose x0 + noiseModel::Diagonal::shared_ptr poseNoise = noiseModel::Diagonal::Sigmas(Vector_(6, 0.3, 0.3, 0.3, 0.1, 0.1, 0.1)); // 30cm std on x,y,z 0.1 rad on roll,pitch,yaw + graph.add(PriorFactor(Symbol('x', 0), poses[0], poseNoise)); + + // Add a prior on landmark l0 + noiseModel::Isotropic::shared_ptr pointNoise = noiseModel::Isotropic::Sigma(3, 0.1); + graph.add(PriorFactor(Symbol('l', 0), points[0], pointNoise)); // add directly to graph + + // Add initial guesses to all observed landmarks + // Intentionally initialize the variables off from the ground truth + for (size_t j = 0; j < points.size(); ++j) + initialEstimate.insert(Symbol('l', j), points[j].compose(Point3(-0.25, 0.20, 0.15))); + + } else { + // Update iSAM with the new factors + isam.update(graph, initialEstimate); + // Each call to iSAM2 update(*) performs one iteration of the iterative nonlinear solver. + // If accuracy is desired at the expense of time, update(*) can be called additional times + // to perform multiple optimizer iterations every step. + isam.update(); + Values currentEstimate = isam.calculateEstimate(); + cout << "****************************************************" << endl; + cout << "Frame " << i << ": " << endl; + currentEstimate.print("Current estimate: "); + + // Clear the factor graph and values for the next iteration + graph.resize(0); + initialEstimate.clear(); + } + } + + return 0; +} +/* ************************************************************************* */ From 61b82c9109aa2ad5fe8db43cd1866586b6607f84 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 15:47:07 +0000 Subject: [PATCH 662/914] Tiny code formatting change --- examples/Pose2SLAMExample.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Pose2SLAMExample.cpp b/examples/Pose2SLAMExample.cpp index 4e660a768..bf05cc729 100644 --- a/examples/Pose2SLAMExample.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -83,7 +83,7 @@ int main(int argc, char** argv) { // For simplicity, we will use the same noise model for each odometry factor noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // Create odometry (Between) factors between consecutive poses - graph.add(BetweenFactor(1, 2, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(1, 2, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); graph.add(BetweenFactor(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); graph.add(BetweenFactor(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); graph.add(BetweenFactor(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); From f865a9e5513238132bd08fb2faa777195a53b41a Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 22 Jul 2012 16:03:42 +0000 Subject: [PATCH 663/914] Removed SLAM namespaces from Localization Example --- examples/LocalizationExample.cpp | 191 ++++++++++++++++++++++--------- 1 file changed, 135 insertions(+), 56 deletions(-) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index 21fb36860..c9d232df8 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -15,87 +15,166 @@ * @author Frank Dellaert */ -// pull in the 2D PoseSLAM domain with all typedefs and helper functions defined -#include +/** + * A simple 2D pose slam example with "GPS" measurements + * - The robot moves forward 2 meter each iteration + * - The robot initially faces along the X axis (horizontal, to the right in 2D) + * - We have full odometry between pose + * - We have "GPS-like" measurements implemented with a custom factor + */ -// include this for marginals +// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent +// the robot positions +#include + +// Each variable in the system (poses) must be identified with a unique key. +// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). +// Here we will use simple integer keys +#include + +// In GTSAM, measurement functions are represented as 'factors'. Several common factors +// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. +// Here we will use Between factors for the relative motion described by odometry measurements. +// Because we have global measurements in the form of "GPS-like" measurements, we don't +// actually need to provide an initial position prior in this example. We will create our +// custom factor shortly. +#include + +// When the factors are created, we will add them to a Factor Graph. As the factors we are using +// are nonlinear factors, we will need a Nonlinear Factor Graph. +#include + +// The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the +// nonlinear functions around an initial linearization point, then solve the linear system +// to update the linearization point. This happens repeatedly until the solver converges +// to a consistent set of variable values. This requires us to specify an initial guess +// for each variable, held in a Values container. +#include + +// Finally, once all of the factors have been added to our factor graph, we will want to +// solve/optimize to graph to find the best (Maximum A Posteriori) set of variable values. +// GTSAM includes several nonlinear optimizers to perform this step. Here we will use the +// standard Levenberg-Marquardt solver #include + +// Once the optimized values have been calculated, we can also calculate the marginal covariance +// of desired variables #include -#include -#include using namespace std; using namespace gtsam; -using namespace gtsam::noiseModel; -/** - * UnaryFactor - * Example on how to create a GPS-like factor on position alone. - */ + +// Before we begin the example, we must create a custom unary factor to implement a +// "GPS-like" functionality. Because standard GPS measurements provide information +// only on the position, and not on the orientation, we cannot use a simple prior to +// properly model this measurement. +// +// The factor will be a unary factor, affect only a single system variable. It will +// also use a standard Gaussian noise model. Hence, we will derive our new factor from +// the NoiseModelFactor1. +#include class UnaryFactor: public NoiseModelFactor1 { - double mx_, my_; ///< X and Y measurements + + // The factor will hold a measurement consisting of an (X,Y) location + Point2 measurement_; public: + /// shorthand for a smart pointer to a factor + typedef boost::shared_ptr shared_ptr; + + // The constructor requires the variable key, the (X, Y) measurement value, and the noise model UnaryFactor(Key j, double x, double y, const SharedNoiseModel& model): - NoiseModelFactor1(model, j), mx_(x), my_(y) {} + NoiseModelFactor1(model, j), measurement_(x, y) {} virtual ~UnaryFactor() {} - Vector evaluateError(const Pose2& q, - boost::optional H = boost::none) const + // By using the NoiseModelFactor base classes, the only two function that must be overridden. + // The first is the 'evaluateError' function. This function implements the desired measurement + // function, returning a vector of errors when evaluated at the provided variable value. It + // must also calculate the Jacobians for this measurement function, if requested. + Vector evaluateError(const Pose2& pose, boost::optional H = boost::none) const { - if (H) (*H) = Matrix_(2,3, 1.0,0.0,0.0, 0.0,1.0,0.0); - return Vector_(2, q.x() - mx_, q.y() - my_); + // The measurement function for a GPS-like measurement is simple: + // error_x = pose.x - measurement.x + // error_y = pose.y - measurement.y + // Consequently, the Jacobians are: + // [ derror_x/dx derror_x/dy derror_x/dtheta ] = [1 0 0] + // [ derror_y/dx derror_y/dy derror_y/dtheta ] = [0 1 0] + if (H) + (*H) = Matrix_(2,3, 1.0,0.0,0.0, 0.0,1.0,0.0); + + return Vector_(2, pose.x() - measurement_.x(), pose.y() - measurement_.y()); } + + // The second is a 'clone' function that allows the factor to be copied. Under most + // circumstances, the following code that employs the default copy constructor should + // work fine. + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new UnaryFactor(*this))); } + + // Additionally, custom factors should really provide specific implementations of + // 'equals' to ensure proper operation will all GTSAM functionality, and a custom + // 'print' function, if desired. + virtual bool equals(const NonlinearFactor& expected, double tol=1e-9) const { + const UnaryFactor* e = dynamic_cast (&expected); + return e != NULL && NoiseModelFactor1::equals(*e, tol) && this->measurement_.equals(e->measurement_, tol); + } + + virtual void print(const std::string& s, const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { + std::cout << s << "UnaryFactor(" << keyFormatter(this->key()) << ")\n"; + measurement_.print(" measurement: "); + this->noiseModel_->print(" noise model: "); + } + }; -/** - * Example of a more complex 2D localization example - * - Robot poses are facing along the X axis (horizontal, to the right in 2D) - * - The robot moves 2 meters each step - * - We have full odometry between poses - * - We have unary measurement factors at eacht time step - */ + + int main(int argc, char** argv) { - // create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) - pose2SLAM::Graph graph; + // 1. Create a factor graph container and add factors to it + NonlinearFactorGraph graph; - // add two odometry factors - Pose2 odometry(2.0, 0.0, 0.0); // create a measurement for both factors (the same in this case) - SharedDiagonal odometryNoise = Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 20cm std on x,y, 0.1 rad on theta - graph.addRelativePose(1, 2, odometry, odometryNoise); - graph.addRelativePose(2, 3, odometry, odometryNoise); + // 2a. Add odometry factors + // For simplicity, we will use the same noise model for each odometry factor + noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); + // Create odometry (Between) factors between consecutive poses + graph.add(BetweenFactor(1, 2, Pose2(2.0, 0.0, 0.0), odometryNoise)); + graph.add(BetweenFactor(2, 3, Pose2(2.0, 0.0, 0.0), odometryNoise)); - // add unary measurement factors, like GPS, on all three poses - SharedDiagonal noiseModel = Diagonal::Sigmas(Vector_(2, 0.1, 0.1)); // 10cm std on x,y - graph.push_back(boost::make_shared(1, 0, 0, noiseModel)); - graph.push_back(boost::make_shared(2, 2, 0, noiseModel)); - graph.push_back(boost::make_shared(3, 4, 0, noiseModel)); + // 2b. Add "GPS-like" measurements + // We will use our custom UnaryFactor for this. + noiseModel::Diagonal::shared_ptr unaryNoise = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.1)); // 10cm std on x,y + graph.add(UnaryFactor(1, 0.0, 0.0, unaryNoise)); + graph.add(UnaryFactor(3, 4.0, 0.0, unaryNoise)); + graph.print("\nFactor Graph:\n"); // print - // print - graph.print("\nFactor graph:\n"); + // 3. Create the data structure to hold the initialEstimate estimate to the solution + // For illustrative purposes, these have been deliberately set to incorrect values + Values initialEstimate; + initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insert(2, Pose2(2.3, 0.1, -0.2)); + initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); + initialEstimate.print("\nInitial Estimate:\n"); // print - // create (deliberatly inaccurate) initial estimate - pose2SLAM::Values initialEstimate; - initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); - initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); - initialEstimate.print("\nInitial estimate:\n "); + // 4. Optimize using Levenberg-Marquardt optimization. The optimizer + // accepts an optional set of configuration parameters, controlling + // things like convergence criteria, the type of linear system solver + // to use, and the amount of information displayed during optimization. + // Here we will use the default set of parameters. See the + // documentation for the full set of parameters. + LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); + Values result = optimizer.optimize(); + result.print("Final Result:\n"); - // use an explicit Optimizer object - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); - pose2SLAM::Values result = optimizer.optimize(); - result.print("\nFinal result:\n "); + // 5. Calculate and print marginal covariances for all variables + Marginals marginals(graph, result); + cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(1) << endl; + cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(2) << endl; + cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(3) << endl; - // Query the marginals - Marginals marginals(graph, result); - cout.precision(2); - cout << "\nP1:\n" << marginals.marginalCovariance(1) << endl; - cout << "\nP2:\n" << marginals.marginalCovariance(2) << endl; - cout << "\nP3:\n" << marginals.marginalCovariance(3) << endl; - - return 0; + return 0; } - From dda625b2e0fc148f032d05a6cf8486284aef0edf Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 22 Jul 2012 18:46:35 +0000 Subject: [PATCH 664/914] Compile error on Mac, added "this->" --- gtsam/base/FastVector.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/base/FastVector.h b/gtsam/base/FastVector.h index f55d67b41..33bc5cb7c 100644 --- a/gtsam/base/FastVector.h +++ b/gtsam/base/FastVector.h @@ -90,7 +90,7 @@ public: /** Conversion to a standard STL container */ operator std::vector() const { - return std::vector(begin(), end()); + return std::vector(this->begin(), this->end()); } private: From 46b2971e459d78f89ef2652cdac3735d761a24f4 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 22 Jul 2012 18:49:07 +0000 Subject: [PATCH 665/914] Removed imu dynamics example slam namespace --- gtsam_unstable/dynamics/imuSystem.cpp | 63 --------------- gtsam_unstable/dynamics/imuSystem.h | 78 ------------------- .../dynamics/tests/testIMUSystem.cpp | 74 +++++++++++------- .../dynamics/tests/testVelocityConstraint.cpp | 4 +- gtsam_unstable/gtsam_unstable.h | 39 +--------- 5 files changed, 48 insertions(+), 210 deletions(-) delete mode 100644 gtsam_unstable/dynamics/imuSystem.cpp delete mode 100644 gtsam_unstable/dynamics/imuSystem.h diff --git a/gtsam_unstable/dynamics/imuSystem.cpp b/gtsam_unstable/dynamics/imuSystem.cpp deleted file mode 100644 index 376868583..000000000 --- a/gtsam_unstable/dynamics/imuSystem.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file ilm3DSystem.cpp - * @brief Implementations of ilm 3D domain - * @author Alex Cunningham - */ - -#include -#include - -namespace imu { - -using namespace gtsam; - -/* ************************************************************************* */ -void Graph::addPrior(Key key, const PoseRTV& pose, const SharedNoiseModel& noiseModel) { - add(Prior(key, pose, noiseModel)); -} - -/* ************************************************************************* */ -void Graph::addConstraint(Key key, const PoseRTV& pose) { - add(Constraint(key, pose)); -} - -/* ************************************************************************* */ -void Graph::addHeightPrior(Key key, double z, const SharedNoiseModel& noiseModel) { - add(DHeightPrior(key, z, noiseModel)); -} - -/* ************************************************************************* */ -void Graph::addFullIMUMeasurement(Key key1, Key key2, - const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel) { - add(FullIMUMeasurement(accel, gyro, dt, key1, key2, noiseModel)); -} - -/* ************************************************************************* */ -void Graph::addIMUMeasurement(Key key1, Key key2, - const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel) { - add(IMUMeasurement(accel, gyro, dt, key1, key2, noiseModel)); -} - -/* ************************************************************************* */ -void Graph::addVelocityConstraint(Key key1, Key key2, double dt, const SharedNoiseModel& noiseModel) { - add(VelocityConstraint(key1, key2, dt, noiseModel)); -} - -/* ************************************************************************* */ -void Graph::addBetween(Key key1, Key key2, const PoseRTV& z, const SharedNoiseModel& noiseModel) { - add(Between(key1, key2, z, noiseModel)); -} - -/* ************************************************************************* */ -void Graph::addRange(Key key1, Key key2, double z, const SharedNoiseModel& noiseModel) { - add(Range(key1, key2, z, noiseModel)); -} - -/* ************************************************************************* */ -Values Graph::optimize(const Values& init) const { - return LevenbergMarquardtOptimizer(*this, init).optimize(); -} -/* ************************************************************************* */ - -} // \namespace imu - diff --git a/gtsam_unstable/dynamics/imuSystem.h b/gtsam_unstable/dynamics/imuSystem.h deleted file mode 100644 index ef5437fdf..000000000 --- a/gtsam_unstable/dynamics/imuSystem.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file imuSystem.h - * @brief A 3D Dynamic system domain as a demonstration of IMU factors - * @author Alex Cunningham - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -/** - * This domain focuses on a single class of variables: PoseRTV, which - * models a dynamic pose operating with IMU measurements and assorted priors. - * - * There are also partial priors that constraint certain components of the - * poses, as well as between and range factors to model other between-pose - * information. - */ -namespace imu { - -struct Values : public gtsam::Values { - typedef gtsam::Values Base; - - Values() {} - Values(const Values& values) : Base(values) {} - Values(const Base& values) : Base(values) {} - - void insertPose(gtsam::Key key, const gtsam::PoseRTV& pose) { insert(key, pose); } - gtsam::PoseRTV pose(gtsam::Key key) const { return at(key); } -}; - -// factors -typedef gtsam::IMUFactor IMUMeasurement; // IMU between measurements -typedef gtsam::FullIMUFactor FullIMUMeasurement; // Full-state IMU between measurements -typedef gtsam::BetweenFactor Between; // full odometry (including velocity) -typedef gtsam::NonlinearEquality Constraint; -typedef gtsam::PriorFactor Prior; -typedef gtsam::RangeFactor Range; - -// graph components -struct Graph : public gtsam::NonlinearFactorGraph { - typedef gtsam::NonlinearFactorGraph Base; - - Graph() {} - Graph(const Base& graph) : Base(graph) {} - Graph(const Graph& graph) : Base(graph) {} - - // prior factors - void addPrior(size_t key, const gtsam::PoseRTV& pose, const gtsam::SharedNoiseModel& noiseModel); - void addConstraint(size_t key, const gtsam::PoseRTV& pose); - void addHeightPrior(size_t key, double z, const gtsam::SharedNoiseModel& noiseModel); - - // inertial factors - void addFullIMUMeasurement(size_t key1, size_t key2, const gtsam::Vector& accel, const gtsam::Vector& gyro, double dt, const gtsam::SharedNoiseModel& noiseModel); - void addIMUMeasurement(size_t key1, size_t key2, const gtsam::Vector& accel, const gtsam::Vector& gyro, double dt, const gtsam::SharedNoiseModel& noiseModel); - void addVelocityConstraint(size_t key1, size_t key2, double dt, const gtsam::SharedNoiseModel& noiseModel); - - // other measurements - void addBetween(size_t key1, size_t key2, const gtsam::PoseRTV& z, const gtsam::SharedNoiseModel& noiseModel); - void addRange(size_t key1, size_t key2, double z, const gtsam::SharedNoiseModel& noiseModel); - - // optimization - Values optimize(const Values& init) const; -}; - -} // \namespace imu - diff --git a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp index 783c420d4..2f6b8b201 100644 --- a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp +++ b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp @@ -7,23 +7,37 @@ #include -#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include using namespace std; using namespace gtsam; -using namespace imu; const double tol=1e-5; static const Key x0 = 0, x1 = 1, x2 = 2, x3 = 3, x4 = 4; static const Vector g = delta(3, 2, -9.81); +//typedef gtsam::IMUFactor IMUFactor; // IMU between measurements +//typedef gtsam::FullIMUFactor IMUFactor; // Full-state IMU between measurements +//typedef gtsam::BetweenFactor Between; // full odometry (including velocity) +//typedef gtsam::NonlinearEquality Constraint; +//typedef gtsam::PriorFactor Prior; +//typedef gtsam::RangeFactor Range; + /* ************************************************************************* */ TEST(testIMUSystem, instantiations) { // just checking for compilation PoseRTV x1_v; - imu::Values local_values; - Graph graph; gtsam::SharedNoiseModel model1 = gtsam::noiseModel::Unit::Create(1); gtsam::SharedNoiseModel model3 = gtsam::noiseModel::Unit::Create(3); @@ -32,13 +46,13 @@ TEST(testIMUSystem, instantiations) { Vector accel = ones(3), gyro = ones(3); - IMUMeasurement imu(accel, gyro, 0.01, x1, x2, model6); - FullIMUMeasurement full_imu(accel, gyro, 0.01, x1, x2, model9); - Constraint poseHardPrior(x1, x1_v); - Between odom(x1, x2, x1_v, model9); - Range range(x1, x2, 1.0, model1); + IMUFactor imu(accel, gyro, 0.01, x1, x2, model6); + FullIMUFactor full_imu(accel, gyro, 0.01, x1, x2, model9); + NonlinearEquality poseHardPrior(x1, x1_v); + BetweenFactor odom(x1, x2, x1_v, model9); + RangeFactor range(x1, x2, 1.0, model1); VelocityConstraint constraint(x1, x2, 0.1, 10000); - Prior posePrior(x1, x1_v, model9); + PriorFactor posePrior(x1, x1_v, model9); DHeightPrior heightPrior(x1, 0.1, model1); VelocityPrior velPrior(x1, ones(3), model3); } @@ -60,17 +74,17 @@ TEST( testIMUSystem, optimize_chain ) { imu34 = pose3.imuPrediction(pose4, dt); // assemble simple graph with IMU measurements and velocity constraints - Graph graph; - graph.add(Constraint(x1, pose1)); - graph.add(IMUMeasurement(imu12, dt, x1, x2, model)); - graph.add(IMUMeasurement(imu23, dt, x2, x3, model)); - graph.add(IMUMeasurement(imu34, dt, x3, x4, model)); + EasyFactorGraph graph; + graph.add(NonlinearEquality(x1, pose1)); + graph.add(IMUFactor(imu12, dt, x1, x2, model)); + graph.add(IMUFactor(imu23, dt, x2, x3, model)); + graph.add(IMUFactor(imu34, dt, x3, x4, model)); graph.add(VelocityConstraint(x1, x2, dt)); graph.add(VelocityConstraint(x2, x3, dt)); graph.add(VelocityConstraint(x3, x4, dt)); // ground truth values - imu::Values true_values; + Values true_values; true_values.insert(x1, pose1); true_values.insert(x2, pose2); true_values.insert(x3, pose3); @@ -80,13 +94,13 @@ TEST( testIMUSystem, optimize_chain ) { EXPECT_DOUBLES_EQUAL(0, graph.error(true_values), 1e-5); // initialize with zero values and optimize - imu::Values values; + Values values; values.insert(x1, PoseRTV()); values.insert(x2, PoseRTV()); values.insert(x3, PoseRTV()); values.insert(x4, PoseRTV()); - imu::Values actual = graph.optimize(values); + Values actual = graph.optimize(values); EXPECT(assert_equal(true_values, actual, tol)); } @@ -107,14 +121,14 @@ TEST( testIMUSystem, optimize_chain_fullfactor ) { imu34 = pose3.imuPrediction(pose4, dt); // assemble simple graph with IMU measurements and velocity constraints - Graph graph; - graph.add(Constraint(x1, pose1)); - graph.add(FullIMUMeasurement(imu12, dt, x1, x2, model)); - graph.add(FullIMUMeasurement(imu23, dt, x2, x3, model)); - graph.add(FullIMUMeasurement(imu34, dt, x3, x4, model)); + EasyFactorGraph graph; + graph.add(NonlinearEquality(x1, pose1)); + graph.add(FullIMUFactor(imu12, dt, x1, x2, model)); + graph.add(FullIMUFactor(imu23, dt, x2, x3, model)); + graph.add(FullIMUFactor(imu34, dt, x3, x4, model)); // ground truth values - imu::Values true_values; + Values true_values; true_values.insert(x1, pose1); true_values.insert(x2, pose2); true_values.insert(x3, pose3); @@ -124,7 +138,7 @@ TEST( testIMUSystem, optimize_chain_fullfactor ) { EXPECT_DOUBLES_EQUAL(0, graph.error(true_values), 1e-5); // initialize with zero values and optimize - imu::Values values; + Values values; values.insert(x1, PoseRTV()); values.insert(x2, PoseRTV()); values.insert(x3, PoseRTV()); @@ -132,7 +146,7 @@ TEST( testIMUSystem, optimize_chain_fullfactor ) { cout << "Initial Error: " << graph.error(values) << endl; // Initial error is 0.5 - need better prediction model - imu::Values actual = graph.optimize(values); + Values actual = graph.optimize(values); // EXPECT(assert_equal(true_values, actual, tol)); // FAIL } @@ -147,10 +161,10 @@ TEST( testIMUSystem, linear_trajectory) { Vector gyro = delta(3, 0, 0.1); // constant rotation SharedDiagonal model = noiseModel::Unit::Create(9); - imu::Values true_traj, init_traj; - Graph graph; + Values true_traj, init_traj; + EasyFactorGraph graph; - graph.add(Constraint(x0, start)); + graph.add(NonlinearEquality(x0, start)); true_traj.insert(x0, start); init_traj.insert(x0, start); @@ -159,7 +173,7 @@ TEST( testIMUSystem, linear_trajectory) { for (size_t i=1; i(accel - g, gyro, dt, xA, xB, model)); true_traj.insert(xB, cur_pose); init_traj.insert(xB, PoseRTV()); } diff --git a/gtsam_unstable/dynamics/tests/testVelocityConstraint.cpp b/gtsam_unstable/dynamics/tests/testVelocityConstraint.cpp index 61588841d..ea4a3493d 100644 --- a/gtsam_unstable/dynamics/tests/testVelocityConstraint.cpp +++ b/gtsam_unstable/dynamics/tests/testVelocityConstraint.cpp @@ -4,10 +4,10 @@ */ #include -#include + +#include using namespace gtsam; -using namespace imu; const double tol=1e-5; diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index c77c71e22..a14ad34f9 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -102,7 +102,7 @@ virtual class NonlinearEquality : gtsam::NonlinearFactor { NonlinearEquality(size_t j, const T& feasible, double error_gain); }; - +#include template virtual class IMUFactor : gtsam::NonlinearFactor { /** Standard constructor */ @@ -120,7 +120,7 @@ virtual class IMUFactor : gtsam::NonlinearFactor { size_t key2() const; }; - +#include template virtual class FullIMUFactor : gtsam::NonlinearFactor { /** Standard constructor */ @@ -167,38 +167,3 @@ virtual class DGroundConstraint : gtsam::NonlinearFactor { }///\namespace gtsam - -namespace imu { - -#include -class Values { - Values(); - void print(string s) const; - - void insertPose(size_t key, const gtsam::PoseRTV& pose); - gtsam::PoseRTV pose(size_t key) const; -}; - -class Graph { - Graph(); - void print(string s) const; - - // prior factors - void addPrior(size_t key, const gtsam::PoseRTV& pose, const gtsam::noiseModel::Base* noiseModel); - void addConstraint(size_t key, const gtsam::PoseRTV& pose); - void addHeightPrior(size_t key, double z, const gtsam::noiseModel::Base* noiseModel); - - // inertial factors - void addFullIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const gtsam::noiseModel::Base* noiseModel); - void addIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const gtsam::noiseModel::Base* noiseModel); - void addVelocityConstraint(size_t key1, size_t key2, double dt, const gtsam::noiseModel::Base* noiseModel); - - // other measurements - void addBetween(size_t key1, size_t key2, const gtsam::PoseRTV& z, const gtsam::noiseModel::Base* noiseModel); - void addRange(size_t key1, size_t key2, double z, const gtsam::noiseModel::Base* noiseModel); - - // optimization - imu::Values optimize(const imu::Values& init) const; -}; - -}///\namespace imu From 26fce2d400b14edc50930eb05bde1e392c86f1ee Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 23 Jul 2012 14:09:40 +0000 Subject: [PATCH 666/914] Adding support for global functions - parsing works --- wrap/GlobalFunction.cpp | 29 ++++++++++++++++++++++++++++ wrap/GlobalFunction.h | 42 +++++++++++++++++++++++++++++++++++++++++ wrap/Module.cpp | 32 ++++++++++++++++++++++--------- wrap/Module.h | 4 ++++ wrap/tests/geometry.h | 3 +++ 5 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 wrap/GlobalFunction.cpp create mode 100644 wrap/GlobalFunction.h diff --git a/wrap/GlobalFunction.cpp b/wrap/GlobalFunction.cpp new file mode 100644 index 000000000..e20a1f2f2 --- /dev/null +++ b/wrap/GlobalFunction.cpp @@ -0,0 +1,29 @@ +/** + * @file GlobalFunction.cpp + * + * @date Jul 22, 2012 + * @author Alex Cunningham + */ + +#include "GlobalFunction.h" + +namespace wrap { + +/* ************************************************************************* */ +void GlobalFunction::addOverload(bool verbose, const std::string& name, + const ArgumentList& args, const ReturnValue& retVal, const StrVec& ns_stack) { + this->verbose_ = verbose; + this->name = name; + this->argLists.push_back(args); + this->returnVals.push_back(retVal); + this->namespaces.push_back(ns_stack); +} + +/* ************************************************************************* */ + + +} // \namespace wrap + + + + diff --git a/wrap/GlobalFunction.h b/wrap/GlobalFunction.h new file mode 100644 index 000000000..0899bbdc9 --- /dev/null +++ b/wrap/GlobalFunction.h @@ -0,0 +1,42 @@ +/** + * @file GlobalFunction.h + * + * @brief Implements codegen for a global function wrapped in matlab + * + * @date Jul 22, 2012 + * @author Alex Cunningham + */ + +#pragma once + +#include "Argument.h" +#include "ReturnValue.h" + +namespace wrap { + +struct GlobalFunction { + + typedef std::vector StrVec; + + bool verbose_; + std::string name; + + // each overload, regardless of namespace + std::vector argLists; ///< arugments for each overload + std::vector returnVals; ///< returnVals for each overload + std::vector namespaces; ///< Stack of namespaces + + // Constructor only used in Module + GlobalFunction(bool verbose = true) : verbose_(verbose) {} + + // adds an overloaded version of this function + void addOverload(bool verbose, const std::string& name, + const ArgumentList& args, const ReturnValue& retVal, const StrVec& ns_stack); + +}; + +} // \namespace wrap + + + + diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 1f077b31f..786a4de78 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -79,10 +79,10 @@ Module::Module(const string& interfacePath, vector arg_dup; ///keep track of duplicates Constructor constructor0(enable_verbose), constructor(enable_verbose); Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); - //Method method0(enable_verbose), method(enable_verbose); StaticMethod static_method0(enable_verbose), static_method(enable_verbose); Class cls0(enable_verbose),cls(enable_verbose); - ForwardDeclaration fwDec0, fwDec; + GlobalFunction globalFunc0(enable_verbose), globalFunc(enable_verbose); + ForwardDeclaration fwDec0, fwDec; vector namespaces, /// current namespace tag namespaces_return, /// namespace for current return type using_namespace_current; /// All namespaces from "using" declarations @@ -261,12 +261,12 @@ Module::Module(const string& interfacePath, >> ((':' >> classParent_p >> '{') | '{') >> *(functions_p | comments_p) >> str_p("};")) - [assign_a(constructor.name, cls.name)] - [assign_a(cls.constructor, constructor)] + [assign_a(constructor.name, cls.name)] + [assign_a(cls.constructor, constructor)] [assign_a(cls.namespaces, namespaces)] - [assign_a(cls.using_namespaces, using_namespace_current)] - [assign_a(deconstructor.name,cls.name)] - [assign_a(cls.deconstructor, deconstructor)] + [assign_a(cls.using_namespaces, using_namespace_current)] + [assign_a(deconstructor.name,cls.name)] + [assign_a(cls.deconstructor, deconstructor)] [bl::bind(&handle_possible_template, bl::var(classes), bl::var(cls), bl::var(templateArgument), bl::var(templateInstantiations))] [assign_a(deconstructor,deconstructor0)] [assign_a(constructor, constructor0)] @@ -274,6 +274,20 @@ Module::Module(const string& interfacePath, [clear_a(templateArgument)] [clear_a(templateInstantiations)]; + Rule global_function_p = + (returnType_p >> staticMethodName_p[assign_a(methodName)] >> + '(' >> argumentList_p >> ')' >> ';' >> *comments_p) + [bl::bind(&GlobalFunction::addOverload, + bl::var(global_functions)[bl::var(methodName)], + verbose, + bl::var(methodName), + bl::var(args), + bl::var(retVal), + bl::var(namespaces))] + [assign_a(methodName,methodName0)] + [assign_a(args,args0)] + [assign_a(retVal,retVal0)]; + Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[push_back_a(includes)] >> ch_p('>'); Rule namespace_def_p = @@ -281,7 +295,7 @@ Module::Module(const string& interfacePath, >> namespace_name_p[push_back_a(namespaces)] >> ch_p('{') >> *(include_p | class_p | templateSingleInstantiation_p | namespace_def_p | comments_p) - >> str_p("}///\\namespace") // end namespace, avoid confusion with classes + >> str_p("}///\\namespace") // end namespace, avoid confusion with classes // FIXME: check for absense of semicolon to disambiguate >> !namespace_name_p) [pop_a(namespaces)]; @@ -297,7 +311,7 @@ Module::Module(const string& interfacePath, [push_back_a(forward_declarations, fwDec)] [assign_a(fwDec, fwDec0)]; - Rule module_content_p = comments_p | using_namespace_p | include_p | class_p | templateSingleInstantiation_p | forward_declaration_p | namespace_def_p ; + Rule module_content_p = comments_p | using_namespace_p | include_p | class_p | templateSingleInstantiation_p | forward_declaration_p | global_function_p | namespace_def_p; Rule module_p = *module_content_p >> !end_p; diff --git a/wrap/Module.h b/wrap/Module.h index ce1a87969..a2c77bc9e 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -23,6 +23,7 @@ #include #include "Class.h" +#include "GlobalFunction.h" #include "TemplateInstantiationTypedef.h" #include "ForwardDeclaration.h" @@ -33,6 +34,8 @@ namespace wrap { */ struct Module { + typedef std::map GlobalFunctions; + std::string name; ///< module name std::vector classes; ///< list of classes std::vector templateInstantiationTypedefs; ///< list of template instantiations @@ -40,6 +43,7 @@ struct Module { // std::vector using_namespaces; ///< all default namespaces std::vector forward_declarations; std::vector includes; ///< Include statements + GlobalFunctions global_functions; /// constructor that parses interface file Module(const std::string& interfacePath, diff --git a/wrap/tests/geometry.h b/wrap/tests/geometry.h index 5dfe07b8d..2e92043b2 100644 --- a/wrap/tests/geometry.h +++ b/wrap/tests/geometry.h @@ -82,6 +82,9 @@ class Test { // even more comments at the end! }; + +Vector aGlobalFunction(); + // comments at the end! // even more comments at the end! From e7e564268d67b6976ccd0f9b7a623951b41c4fc5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 23 Jul 2012 14:09:42 +0000 Subject: [PATCH 667/914] global function parsing now tested and working --- wrap/Module.cpp | 2 +- wrap/tests/testNamespaces.h | 6 ++++++ wrap/tests/testWrap.cpp | 38 ++++++++++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 786a4de78..241371b0b 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -294,7 +294,7 @@ Module::Module(const string& interfacePath, (str_p("namespace") >> namespace_name_p[push_back_a(namespaces)] >> ch_p('{') - >> *(include_p | class_p | templateSingleInstantiation_p | namespace_def_p | comments_p) + >> *(include_p | class_p | templateSingleInstantiation_p | global_function_p | namespace_def_p | comments_p) >> str_p("}///\\namespace") // end namespace, avoid confusion with classes // FIXME: check for absense of semicolon to disambiguate >> !namespace_name_p) [pop_a(namespaces)]; diff --git a/wrap/tests/testNamespaces.h b/wrap/tests/testNamespaces.h index 644fdb3ea..68b6e041e 100644 --- a/wrap/tests/testNamespaces.h +++ b/wrap/tests/testNamespaces.h @@ -14,6 +14,9 @@ class ClassB { ClassB(); }; +// check namespace handling +Vector aGlobalFunction(); + }///\namespace ns1 #include @@ -41,6 +44,9 @@ class ClassC { ClassC(); }; +// separate namespace global function, same name +Vector aGlobalFunction(); + }///\namespace ns2 class ClassD { diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 0ed1f84ef..2de19f6e4 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -88,6 +88,8 @@ TEST( wrap, parse_geometry ) { strvec exp_includes; exp_includes += "folder/path/to/Test.h"; EXPECT(assert_equal(exp_includes, module.includes)); + LONGS_EQUAL(3, module.classes.size()); + // check first class, Point2 { Class cls = module.classes.at(0); @@ -133,7 +135,6 @@ TEST( wrap, parse_geometry ) { // Test class is the third one { - LONGS_EQUAL(3, module.classes.size()); Class testCls = module.classes.at(2); EXPECT_LONGS_EQUAL( 2, testCls.constructor.args_list.size()); EXPECT_LONGS_EQUAL(19, testCls.methods.size()); @@ -149,6 +150,20 @@ TEST( wrap, parse_geometry ) { EXPECT(m2.returnVals.front().category1 == ReturnValue::EIGEN); EXPECT(m2.returnVals.front().category2 == ReturnValue::EIGEN); } + + // evaluate global functions +// Vector aGlobalFunction(); + LONGS_EQUAL(1, module.global_functions.size()); + CHECK(module.global_functions.find("aGlobalFunction") != module.global_functions.end()); + { + GlobalFunction gfunc = module.global_functions.at("aGlobalFunction"); + EXPECT(assert_equal("aGlobalFunction", gfunc.name)); + LONGS_EQUAL(1, gfunc.returnVals.size()); + EXPECT(assert_equal("Vector", gfunc.returnVals.front().type1)); + EXPECT_LONGS_EQUAL(1, gfunc.argLists.size()); + LONGS_EQUAL(1, gfunc.namespaces.size()); + EXPECT(gfunc.namespaces.front().empty()); + } } /* ************************************************************************* */ @@ -208,6 +223,27 @@ TEST( wrap, parse_namespaces ) { strvec exp_namespaces; EXPECT(assert_equal(exp_namespaces, cls.namespaces)); } + + // evaluate global functions +// Vector ns1::aGlobalFunction(); +// Vector ns2::aGlobalFunction(); + LONGS_EQUAL(1, module.global_functions.size()); + CHECK(module.global_functions.find("aGlobalFunction") != module.global_functions.end()); + { + GlobalFunction gfunc = module.global_functions.at("aGlobalFunction"); + EXPECT(assert_equal("aGlobalFunction", gfunc.name)); + LONGS_EQUAL(2, gfunc.returnVals.size()); + EXPECT(assert_equal("Vector", gfunc.returnVals.front().type1)); + EXPECT_LONGS_EQUAL(2, gfunc.argLists.size()); + + // check namespaces + LONGS_EQUAL(2, gfunc.namespaces.size()); + strvec exp_namespaces1; exp_namespaces1 += "ns1"; + EXPECT(assert_equal(exp_namespaces1, gfunc.namespaces.at(0))); + + strvec exp_namespaces2; exp_namespaces2 += "ns2"; + EXPECT(assert_equal(exp_namespaces2, gfunc.namespaces.at(1))); + } } /* ************************************************************************* */ From ece5888cacebdc940e479263ea91e0490bbc7f14 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 23 Jul 2012 14:09:44 +0000 Subject: [PATCH 668/914] Removed need in wrap to end namespaces in special non-standard tag - can now just use } --- gtsam.h | 15 +++++++-------- wrap/Module.cpp | 3 +-- wrap/tests/testNamespaces.h | 6 +++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/gtsam.h b/gtsam.h index 4a2cbb66c..5661cb520 100644 --- a/gtsam.h +++ b/gtsam.h @@ -36,8 +36,7 @@ * Namespace definitions * - Names of namespaces must start with a lowercase letter * - start a namespace with "namespace {" - * - end a namespace with exactly "}///\namespace [namespace_name]", optionally adding the name of the namespace - * - This ending is not C++ standard, and must contain "}///\namespace" to parse + * - end a namespace with exactly "}" * - Namespaces can be nested * Namespace usage * - Namespaces can be specified for classes in arguments and return values @@ -1363,7 +1362,7 @@ virtual class GenericProjectionFactor : gtsam::NonlinearFactor { typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3_S2; typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3DS2; -}///\namespace gtsam +} //\namespace gtsam //************************************************************************* // Pose2SLAM @@ -1418,7 +1417,7 @@ class Graph { gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; }; -}///\namespace pose2SLAM +} //\namespace pose2SLAM //************************************************************************* // Pose3SLAM @@ -1473,7 +1472,7 @@ class Graph { gtsam::Marginals marginals(const pose3SLAM::Values& solution) const; }; -}///\namespace pose3SLAM +} //\namespace pose3SLAM //************************************************************************* // planarSLAM @@ -1561,7 +1560,7 @@ class Odometry { const gtsam::Ordering& ordering) const; }; -}///\namespace planarSLAM +} //\namespace planarSLAM //************************************************************************* // VisualSLAM @@ -1686,7 +1685,7 @@ class LevenbergMarquardtOptimizer { visualSLAM::Values values() const; }; -}///\namespace visualSLAM +} //\namespace visualSLAM //************************************************************************ // sparse BA @@ -1767,5 +1766,5 @@ class LevenbergMarquardtOptimizer { sparseBA::Values optimizeSafely(); sparseBA::Values values() const; }; -}///\namespace sparseBA +} //\namespace sparseBA diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 241371b0b..757241ca2 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -295,8 +295,7 @@ Module::Module(const string& interfacePath, >> namespace_name_p[push_back_a(namespaces)] >> ch_p('{') >> *(include_p | class_p | templateSingleInstantiation_p | global_function_p | namespace_def_p | comments_p) - >> str_p("}///\\namespace") // end namespace, avoid confusion with classes // FIXME: check for absense of semicolon to disambiguate - >> !namespace_name_p) + >> ch_p('}')) [pop_a(namespaces)]; Rule using_namespace_p = diff --git a/wrap/tests/testNamespaces.h b/wrap/tests/testNamespaces.h index 68b6e041e..2c12686c0 100644 --- a/wrap/tests/testNamespaces.h +++ b/wrap/tests/testNamespaces.h @@ -17,7 +17,7 @@ class ClassB { // check namespace handling Vector aGlobalFunction(); -}///\namespace ns1 +} #include namespace ns2 { @@ -38,7 +38,7 @@ class ClassB { ClassB(); }; -}///\namespace ns3 +} class ClassC { ClassC(); @@ -47,7 +47,7 @@ class ClassC { // separate namespace global function, same name Vector aGlobalFunction(); -}///\namespace ns2 +} //\namespace ns2 class ClassD { ClassD(); From f4c022c35a8860485be2fac7000f61adf6884169 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 15:33:39 +0000 Subject: [PATCH 669/914] Added required header files to gtsam.h --- gtsam.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gtsam.h b/gtsam.h index 50743c239..13364b210 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1124,6 +1124,7 @@ class KeyVector { void push_back(size_t key) const; }; +#include class Marginals { Marginals(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& solution); @@ -1302,18 +1303,28 @@ class ISAM2 { //************************************************************************* // Nonlinear factor types //************************************************************************* +#include +#include +#include +#include +#include +#include + +#include template virtual class PriorFactor : gtsam::NonlinearFactor { PriorFactor(size_t key, const T& prior, const gtsam::noiseModel::Base* noiseModel); }; +#include template virtual class BetweenFactor : gtsam::NonlinearFactor { BetweenFactor(size_t key1, size_t key2, const T& relativePose, const gtsam::noiseModel::Base* noiseModel); }; +#include template virtual class NonlinearEquality : gtsam::NonlinearFactor { // Constructor - forces exact evaluation @@ -1323,6 +1334,7 @@ virtual class NonlinearEquality : gtsam::NonlinearFactor { }; +#include template virtual class RangeFactor : gtsam::NonlinearFactor { RangeFactor(size_t key1, size_t key2, double measured, const gtsam::noiseModel::Base* noiseModel); @@ -1337,6 +1349,8 @@ typedef gtsam::RangeFactor RangeFactorSimple typedef gtsam::RangeFactor RangeFactorCalibratedCamera; typedef gtsam::RangeFactor RangeFactorSimpleCamera; + +#include template virtual class BearingFactor : gtsam::NonlinearFactor { BearingFactor(size_t key1, size_t key2, const ROT& measured, const gtsam::noiseModel::Base* noiseModel); From b7c2177f0bfd5bd8858b06826194a401c11c396e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 23 Jul 2012 18:24:35 +0000 Subject: [PATCH 670/914] Generating code for global functions now works --- wrap/Class.cpp | 14 +- wrap/GlobalFunction.cpp | 142 ++++++++++++++++++ wrap/GlobalFunction.h | 16 ++ wrap/Module.cpp | 5 + wrap/StaticMethod.cpp | 1 + wrap/tests/expected/aGlobalFunction.m | 7 + wrap/tests/expected/geometry_wrapper.cpp | 8 + .../+ns1/aGlobalFunction.m | 7 + .../+ns2/aGlobalFunction.m | 7 + .../testNamespaces_wrapper.cpp | 17 +++ wrap/tests/testWrap.cpp | 1 + wrap/utilities.cpp | 16 ++ wrap/utilities.h | 3 + 13 files changed, 231 insertions(+), 13 deletions(-) create mode 100644 wrap/tests/expected/aGlobalFunction.m create mode 100644 wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m create mode 100644 wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 8e04543e4..749a61707 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -24,7 +24,6 @@ #include // works on Linux GCC #include -#include #include #include "Class.h" @@ -40,18 +39,7 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, FileWriter& wrapperFile, vector& functionNames) const { // Create namespace folders - { - using namespace boost::filesystem; - path curPath = toolboxPath; - BOOST_FOREACH(const string& subdir, namespaces) { - curPath /= "+" + subdir; - if(!is_directory(curPath)) - if(exists("+" + subdir)) - throw OutputError("Need to write files to directory " + curPath.string() + ", which already exists as a file but is not a directory"); - else - boost::filesystem::create_directory(curPath); - } - } + createNamespaceStructure(namespaces, toolboxPath); // open destination classFile string classFile = toolboxPath; diff --git a/wrap/GlobalFunction.cpp b/wrap/GlobalFunction.cpp index e20a1f2f2..14bb824d2 100644 --- a/wrap/GlobalFunction.cpp +++ b/wrap/GlobalFunction.cpp @@ -6,9 +6,15 @@ */ #include "GlobalFunction.h" +#include "utilities.h" + +#include +#include namespace wrap { +using namespace std; + /* ************************************************************************* */ void GlobalFunction::addOverload(bool verbose, const std::string& name, const ArgumentList& args, const ReturnValue& retVal, const StrVec& ns_stack) { @@ -19,6 +25,142 @@ void GlobalFunction::addOverload(bool verbose, const std::string& name, this->namespaces.push_back(ns_stack); } +/* ************************************************************************* */ +void GlobalFunction::matlab_proxy(const std::string& toolboxPath, const std::string& wrapperName, + const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, + std::vector& functionNames) const { + + // cluster overloads with same namespace + // create new GlobalFunction structures around namespaces - same namespaces and names are overloads + // map of namespace to global function + typedef map GlobalFunctionMap; + GlobalFunctionMap grouped_functions; + for (size_t i=0; i& functionNames) const { + + // create the folder for the namespace + const StrVec& ns = namespaces.front(); + createNamespaceStructure(ns, toolboxPath); + + // open destination mfunctionFileName + string mfunctionFileName = toolboxPath; + if(!ns.empty()) + mfunctionFileName += "/+" + wrap::qualifiedName("/+", ns); + mfunctionFileName += "/" + name + ".m"; + FileWriter mfunctionFile(mfunctionFileName, verbose_, "%"); + + // get the name of actual matlab object + const string + matlabQualName = qualifiedName(".", ns, name), + matlabUniqueName = qualifiedName("", ns, name), + cppName = qualifiedName("::", ns, name); + + mfunctionFile.oss << "function varargout = " << name << "(varargin)\n"; + + for(size_t overload = 0; overload < argLists.size(); ++overload) { + const ArgumentList& args = argLists[overload]; + const ReturnValue& returnVal = returnVals[overload]; + size_t nrArgs = args.size(); + + const int id = functionNames.size(); + + // Output proxy matlab code + + // check for number of arguments... + mfunctionFile.oss << (overload==0?"":"else") << "if length(varargin) == " << nrArgs; + if (nrArgs>0) mfunctionFile.oss << " && "; + // ...and their types + bool first = true; + for(size_t i=0;i(id); + + // call + wrapperFile.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; + // start + wrapperFile.oss << "{\n"; + + if(returnVal.isPair) + { + if(returnVal.category1 == ReturnValue::CLASS) + wrapperFile.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + if(returnVal.category2 == ReturnValue::CLASS) + wrapperFile.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; + } + else { + if (returnVal.category1 == ReturnValue::CLASS) + wrapperFile.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + } + + // check arguments + // NOTE: for static functions, there is no object passed + wrapperFile.oss << " checkArguments(\"" << matlabUniqueName << "\",nargout,nargin," << args.size() << ");\n"; + + // unwrap arguments, see Argument.cpp + args.matlab_unwrap(wrapperFile,0); // We start at 0 because there is no self object + + // call method with default type and wrap result + if (returnVal.type1!="void") + returnVal.wrap_result(cppName+"("+args.names()+")", wrapperFile, typeAttributes); + else + wrapperFile.oss << cppName+"("+args.names()+");\n"; + + // finish + wrapperFile.oss << "}\n"; + + // Add to function list + functionNames.push_back(wrapFunctionName); + } + + mfunctionFile.oss << "else\n"; + mfunctionFile.oss << " error('Arguments do not match any overload of function " << matlabQualName << "');" << endl; + mfunctionFile.oss << "end" << endl; + + // Close file + mfunctionFile.emit(true); +} + /* ************************************************************************* */ diff --git a/wrap/GlobalFunction.h b/wrap/GlobalFunction.h index 0899bbdc9..e281e6a6d 100644 --- a/wrap/GlobalFunction.h +++ b/wrap/GlobalFunction.h @@ -29,10 +29,26 @@ struct GlobalFunction { // Constructor only used in Module GlobalFunction(bool verbose = true) : verbose_(verbose) {} + // Used to reconstruct + GlobalFunction(const std::string& name_, bool verbose = true) + : verbose_(verbose), name(name_) {} + // adds an overloaded version of this function void addOverload(bool verbose, const std::string& name, const ArgumentList& args, const ReturnValue& retVal, const StrVec& ns_stack); + // codegen function called from Module to build the cpp and matlab versions of the function + void matlab_proxy(const std::string& toolboxPath, const std::string& wrapperName, + const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, + std::vector& functionNames) const; + +private: + + // Creates a single global function - all in same namespace + void generateSingleFunction(const std::string& toolboxPath, const std::string& wrapperName, + const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, + std::vector& functionNames) const; + }; } // \namespace wrap diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 757241ca2..35b0d2ff8 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -464,6 +464,11 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co cls.matlab_proxy(toolboxPath, wrapperName, typeAttributes, wrapperFile, functionNames); } + // create matlab files and wrapper code for global functions + BOOST_FOREACH(const GlobalFunctions::value_type& p, global_functions) { + p.second.matlab_proxy(toolboxPath, wrapperName, typeAttributes, wrapperFile, functionNames); + } + // finish wrapper file wrapperFile.oss << "\n"; finish_wrapper(wrapperFile, functionNames); diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index fcef79857..f123a31ac 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -38,6 +38,7 @@ void StaticMethod::addOverload(bool verbose, const std::string& name, this->returnVals.push_back(retVal); } +/* ************************************************************************* */ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& cppClassName, const std::string& matlabQualName, diff --git a/wrap/tests/expected/aGlobalFunction.m b/wrap/tests/expected/aGlobalFunction.m new file mode 100644 index 000000000..80d6b1f6b --- /dev/null +++ b/wrap/tests/expected/aGlobalFunction.m @@ -0,0 +1,7 @@ +% automatically generated by wrap +function varargout = aGlobalFunction(varargin) +if length(varargin) == 0 + varargout{1} = geometry_wrapper(40, varargin{:}); +else + error('Arguments do not match any overload of function aGlobalFunction'); +end diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index a520803ee..d403073d4 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -495,6 +495,11 @@ using namespace geometry; out[0] = wrap< Vector >(obj->return_vector2(value)); } +void aGlobalFunction_40(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + checkArguments("aGlobalFunction",nargout,nargin,0); + out[0] = wrap< Vector >(aGlobalFunction()); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { @@ -626,6 +631,9 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) case 39: Test_return_vector2_39(nargout, out, nargin-1, in+1); break; + case 40: + aGlobalFunction_40(nargout, out, nargin-1, in+1); + break; } std::cout.rdbuf(outbuf); diff --git a/wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m b/wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m new file mode 100644 index 000000000..fc1e780af --- /dev/null +++ b/wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m @@ -0,0 +1,7 @@ +% automatically generated by wrap +function varargout = aGlobalFunction(varargin) +if length(varargin) == 0 + varargout{1} = testNamespaces_wrapper(22, varargin{:}); +else + error('Arguments do not match any overload of function ns1.aGlobalFunction'); +end diff --git a/wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m b/wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m new file mode 100644 index 000000000..2bdf45dd6 --- /dev/null +++ b/wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m @@ -0,0 +1,7 @@ +% automatically generated by wrap +function varargout = aGlobalFunction(varargin) +if length(varargin) == 0 + varargout{1} = testNamespaces_wrapper(23, varargin{:}); +else + error('Arguments do not match any overload of function ns2.aGlobalFunction'); +end diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 3eb0b0311..c75c6a388 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -332,6 +332,17 @@ void ClassD_deconstructor_21(int nargout, mxArray *out[], int nargin, const mxAr } } +void ns1aGlobalFunction_22(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + checkArguments("ns1aGlobalFunction",nargout,nargin,0); + out[0] = wrap< Vector >(ns1::aGlobalFunction()); +} + +void ns2aGlobalFunction_23(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + checkArguments("ns2aGlobalFunction",nargout,nargin,0); + out[0] = wrap< Vector >(ns2::aGlobalFunction()); +} void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { @@ -409,6 +420,12 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) case 21: ClassD_deconstructor_21(nargout, out, nargin-1, in+1); break; + case 22: + ns1aGlobalFunction_22(nargout, out, nargin-1, in+1); + break; + case 23: + ns2aGlobalFunction_23(nargout, out, nargin-1, in+1); + break; } std::cout.rdbuf(outbuf); diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 2de19f6e4..29fc1891a 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -291,6 +291,7 @@ TEST( wrap, matlab_code_geometry ) { EXPECT(files_equal(epath + "Point2.m" , apath + "Point2.m" )); EXPECT(files_equal(epath + "Point3.m" , apath + "Point3.m" )); EXPECT(files_equal(epath + "Test.m" , apath + "Test.m" )); + EXPECT(files_equal(epath + "aGlobalFunction.m" , apath + "aGlobalFunction.m" )); } /* ************************************************************************* */ diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 6eb47c55d..6b6e57094 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "utilities.h" @@ -137,6 +138,21 @@ string qualifiedName(const string& separator, const vector& names, const return result; } +/* ************************************************************************* */ +void createNamespaceStructure(const std::vector& namespaces, const std::string& toolboxPath) { + using namespace boost::filesystem; + path curPath = toolboxPath; + BOOST_FOREACH(const string& subdir, namespaces) { + curPath /= "+" + subdir; + if(!is_directory(curPath)) { + if(exists("+" + subdir)) + throw OutputError("Need to write files to directory " + curPath.string() + ", which already exists as a file but is not a directory"); + else + boost::filesystem::create_directory(curPath); + } + } +} + /* ************************************************************************* */ } // \namespace wrap diff --git a/wrap/utilities.h b/wrap/utilities.h index 7e28d6793..2eaf5397a 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -133,4 +133,7 @@ void generateUsingNamespace(FileWriter& file, const std::vector& us */ std::string qualifiedName(const std::string& separator, const std::vector& names, const std::string& finalName = ""); +/** creates the necessary folders for namespaces, as specified by a namespace stack */ +void createNamespaceStructure(const std::vector& namespaces, const std::string& toolboxPath); + } // \namespace wrap From 5d008d43faa83cac64e1de7ce38e7b0e417baa51 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 23 Jul 2012 18:24:37 +0000 Subject: [PATCH 671/914] Added example namespace function to gtsam - works in matlab --- gtsam.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam.h b/gtsam.h index 5661cb520..120d585aa 100644 --- a/gtsam.h +++ b/gtsam.h @@ -85,6 +85,9 @@ namespace gtsam { // base //************************************************************************* +/** gtsam namespace functions */ +bool linear_independent(Matrix A, Matrix B, double tol); + virtual class Value { // No constructors because this is an abstract class From 79c9bc99ffc71540d61176f2b07d57969300ad5b Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 23 Jul 2012 18:24:39 +0000 Subject: [PATCH 672/914] Some additional cleanup in wrap --- gtsam.h | 5 ++++- wrap/Class.cpp | 2 +- wrap/GlobalFunction.cpp | 12 +----------- wrap/GlobalFunction.h | 2 +- wrap/Module.h | 1 - wrap/ReturnValue.cpp | 14 ++++++++++++++ wrap/ReturnValue.h | 2 ++ wrap/StaticMethod.cpp | 11 +---------- 8 files changed, 24 insertions(+), 25 deletions(-) diff --git a/gtsam.h b/gtsam.h index 120d585aa..04d6b7e9b 100644 --- a/gtsam.h +++ b/gtsam.h @@ -48,6 +48,10 @@ * - All includes will be collected and added in a single file * - All namespaces must have angle brackets: * - No default includes will be added + * Global/Namespace functions + * - Functions specified outside of a class are global + * - Can be overloaded with different arguments + * - Can have multiple functions of the same name in different namespaces * Using classes defined in other modules * - If you are using a class 'OtherClass' not wrapped in this definition file, add "class OtherClass;" to avoid a dependency error * Virtual inheritance @@ -74,7 +78,6 @@ /** * Status: - * - TODO: global functions * - TODO: default values for arguments * - TODO: Handle gtsam::Rot3M conversions to quaternions */ diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 749a61707..5110ab6cd 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -308,7 +308,7 @@ std::string Class::getTypedef() const { result += ("namespace " + namesp + " { "); } result += ("typedef " + typedefName + " " + name + ";"); - BOOST_FOREACH(const string& namesp, namespaces) { + for (size_t i = 0; i Shared" << returnVal.type1 << ";"<< endl; - if(returnVal.category2 == ReturnValue::CLASS) - wrapperFile.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; - } - else { - if (returnVal.category1 == ReturnValue::CLASS) - wrapperFile.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; - } + returnVal.wrapTypeUnwrap(wrapperFile); // check arguments // NOTE: for static functions, there is no object passed diff --git a/wrap/GlobalFunction.h b/wrap/GlobalFunction.h index e281e6a6d..37a70df2a 100644 --- a/wrap/GlobalFunction.h +++ b/wrap/GlobalFunction.h @@ -24,7 +24,7 @@ struct GlobalFunction { // each overload, regardless of namespace std::vector argLists; ///< arugments for each overload std::vector returnVals; ///< returnVals for each overload - std::vector namespaces; ///< Stack of namespaces + std::vector namespaces; ///< Stack of namespaces // Constructor only used in Module GlobalFunction(bool verbose = true) : verbose_(verbose) {} diff --git a/wrap/Module.h b/wrap/Module.h index a2c77bc9e..ca8b0bb1a 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -40,7 +40,6 @@ struct Module { std::vector classes; ///< list of classes std::vector templateInstantiationTypedefs; ///< list of template instantiations bool verbose; ///< verbose flag -// std::vector using_namespaces; ///< all default namespaces std::vector forward_declarations; std::vector includes; ///< Include statements GlobalFunctions global_functions; diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index c209a3131..37e6b15ff 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -122,5 +122,19 @@ void ReturnValue::wrap_result(const string& result, FileWriter& file, const Type } /* ************************************************************************* */ +void ReturnValue::wrapTypeUnwrap(FileWriter& wrapperFile) const { + if(isPair) + { + if(category1 == ReturnValue::CLASS) + wrapperFile.oss << " typedef boost::shared_ptr<" << qualifiedType1("::") << "> Shared" << type1 << ";"<< endl; + if(category2 == ReturnValue::CLASS) + wrapperFile.oss << " typedef boost::shared_ptr<" << qualifiedType2("::") << "> Shared" << type2 << ";"<< endl; + } + else { + if (category1 == ReturnValue::CLASS) + wrapperFile.oss << " typedef boost::shared_ptr<" << qualifiedType1("::") << "> Shared" << type1 << ";"<< endl; + } +} +/* ************************************************************************* */ diff --git a/wrap/ReturnValue.h b/wrap/ReturnValue.h index 8ff5d712b..2bffef680 100644 --- a/wrap/ReturnValue.h +++ b/wrap/ReturnValue.h @@ -52,6 +52,8 @@ struct ReturnValue { void wrap_result(const std::string& result, FileWriter& file, const TypeAttributesTable& typeAttributes) const; + void wrapTypeUnwrap(FileWriter& wrapperFile) const; + }; } // \namespace wrap diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index f123a31ac..ed80d7890 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -123,16 +123,7 @@ string StaticMethod::wrapper_fragment(FileWriter& file, file.oss << "{\n"; generateUsingNamespace(file, using_namespaces); - if(returnVal.isPair) - { - if(returnVal.category1 == ReturnValue::CLASS) - file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; - if(returnVal.category2 == ReturnValue::CLASS) - file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType2("::") << "> Shared" << returnVal.type2 << ";"<< endl; - } - else - if(returnVal.category1 == ReturnValue::CLASS) - file.oss << " typedef boost::shared_ptr<" << returnVal.qualifiedType1("::") << "> Shared" << returnVal.type1 << ";"<< endl; + returnVal.wrapTypeUnwrap(file); file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; From 656f573c0a54fee32ce0101c21a325e494accbc9 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 23 Jul 2012 18:24:43 +0000 Subject: [PATCH 673/914] Removed from wrap the use of "using namespace xxx" statements - wasn't fully supported before, and now we have real namespace support --- gtsam.h | 3 --- wrap/Class.cpp | 10 ++++---- wrap/Class.h | 1 - wrap/Constructor.cpp | 2 -- wrap/Constructor.h | 1 - wrap/Deconstructor.cpp | 4 +--- wrap/Deconstructor.h | 3 +-- wrap/Method.cpp | 5 +--- wrap/Method.h | 4 +--- wrap/Module.cpp | 10 ++------ wrap/StaticMethod.cpp | 5 +--- wrap/StaticMethod.h | 4 +--- wrap/tests/expected/geometry_wrapper.cpp | 29 ------------------------ wrap/tests/geometry.h | 3 --- wrap/tests/testWrap.cpp | 6 ----- wrap/utilities.cpp | 7 ------ wrap/utilities.h | 5 ---- 17 files changed, 12 insertions(+), 90 deletions(-) diff --git a/gtsam.h b/gtsam.h index 04d6b7e9b..35975f710 100644 --- a/gtsam.h +++ b/gtsam.h @@ -41,9 +41,6 @@ * Namespace usage * - Namespaces can be specified for classes in arguments and return values * - In each case, the namespace must be fully specified, e.g., "namespace1::namespace2::ClassName" - * Using namespace: FIXME: this functionality is currently broken - * - To use a namespace (e.g., generate a "using namespace x" line in cpp files), add "using namespace x;" - * - This declaration applies to all classes *after* the declaration, regardless of brackets * Includes in C++ wrappers * - All includes will be collected and added in a single file * - All namespaces must have angle brackets: diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 5110ab6cd..00fdba011 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -79,7 +79,7 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, const int id = (int)functionNames.size(); constructor.proxy_fragment(proxyFile, wrapperName, !qualifiedParent.empty(), id, a); const string wrapFunctionName = constructor.wrapper_fragment(wrapperFile, - cppName, matlabUniqueName, cppBaseName, id, using_namespaces, a); + cppName, matlabUniqueName, cppBaseName, id, a); wrapperFile.oss << "\n"; functionNames.push_back(wrapFunctionName); } @@ -96,7 +96,7 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, const int id = (int)functionNames.size(); deconstructor.proxy_fragment(proxyFile, wrapperName, matlabUniqueName, id); proxyFile.oss << "\n"; - const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabUniqueName, id, using_namespaces); + const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabUniqueName, id); wrapperFile.oss << "\n"; functionNames.push_back(functionName); } @@ -106,7 +106,7 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, // Methods BOOST_FOREACH(const Methods::value_type& name_m, methods) { const Method& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, using_namespaces, typeAttributes, functionNames); + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, typeAttributes, functionNames); proxyFile.oss << "\n"; wrapperFile.oss << "\n"; } @@ -118,7 +118,7 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, // Static methods BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { const StaticMethod& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, using_namespaces, typeAttributes, functionNames); + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, typeAttributes, functionNames); proxyFile.oss << "\n"; wrapperFile.oss << "\n"; } @@ -183,7 +183,6 @@ void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wra wrapperFile.oss << "void " << collectorInsertFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; wrapperFile.oss << "{\n"; wrapperFile.oss << " mexAtExit(&_deleteAllObjects);\n"; - generateUsingNamespace(wrapperFile, using_namespaces); // Typedef boost::shared_ptr wrapperFile.oss << " typedef boost::shared_ptr<" << cppName << "> Shared;\n"; wrapperFile.oss << "\n"; @@ -273,7 +272,6 @@ Class expandClassTemplate(const Class& cls, const string& templateArg, const vec inst.methods = expandMethodTemplate(cls.methods, templateArg, instName); inst.static_methods = expandMethodTemplate(cls.static_methods, templateArg, instName); inst.namespaces = cls.namespaces; - inst.using_namespaces = cls.using_namespaces; inst.constructor = cls.constructor; inst.constructor.args_list = expandArgumentListsTemplate(cls.constructor.args_list, templateArg, instName); inst.constructor.name = inst.name; diff --git a/wrap/Class.h b/wrap/Class.h index c41cbb470..2d10d691a 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -47,7 +47,6 @@ struct Class { Methods methods; ///< Class methods StaticMethods static_methods; ///< Static methods std::vector namespaces; ///< Stack of namespaces - std::vector using_namespaces;///< default namespaces Constructor constructor; ///< Class constructors Deconstructor deconstructor; ///< Deconstructor to deallocate C++ object bool verbose_; ///< verbose flag diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp index 274180e08..7d18cb8db 100644 --- a/wrap/Constructor.cpp +++ b/wrap/Constructor.cpp @@ -70,7 +70,6 @@ string Constructor::wrapper_fragment(FileWriter& file, const string& matlabUniqueName, const string& cppBaseClassName, int id, - const vector& using_namespaces, const ArgumentList& al) const { const string wrapFunctionName = matlabUniqueName + "_constructor_" + boost::lexical_cast(id); @@ -78,7 +77,6 @@ string Constructor::wrapper_fragment(FileWriter& file, file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; file.oss << "{\n"; file.oss << " mexAtExit(&_deleteAllObjects);\n"; - generateUsingNamespace(file, using_namespaces); //Typedef boost::shared_ptr file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;\n"; file.oss << "\n"; diff --git a/wrap/Constructor.h b/wrap/Constructor.h index e2eca1291..fe8a96ccd 100644 --- a/wrap/Constructor.h +++ b/wrap/Constructor.h @@ -58,7 +58,6 @@ struct Constructor { const std::string& matlabUniqueName, const std::string& cppBaseClassName, int id, - const std::vector& using_namespaces, const ArgumentList& al) const; /// constructor function diff --git a/wrap/Deconstructor.cpp b/wrap/Deconstructor.cpp index c9239ee74..b2355f20e 100644 --- a/wrap/Deconstructor.cpp +++ b/wrap/Deconstructor.cpp @@ -48,8 +48,7 @@ void Deconstructor::proxy_fragment(FileWriter& file, string Deconstructor::wrapper_fragment(FileWriter& file, const string& cppClassName, const string& matlabUniqueName, - int id, - const vector& using_namespaces) const { + int id) const { const string matlabName = matlab_wrapper_name(matlabUniqueName); @@ -57,7 +56,6 @@ string Deconstructor::wrapper_fragment(FileWriter& file, file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; file.oss << "{" << endl; - generateUsingNamespace(file, using_namespaces); file.oss << " typedef boost::shared_ptr<" << cppClassName << "> Shared;" << endl; //Deconstructor takes 1 arg, the mxArray obj file.oss << " checkArguments(\"" << matlabName << "\",nargout,nargin," << "1" << ");" << endl; diff --git a/wrap/Deconstructor.h b/wrap/Deconstructor.h index 0d7dadaad..a3b71b04e 100644 --- a/wrap/Deconstructor.h +++ b/wrap/Deconstructor.h @@ -54,8 +54,7 @@ struct Deconstructor { std::string wrapper_fragment(FileWriter& file, const std::string& cppClassName, const std::string& matlabUniqueName, - int id, - const std::vector& using_namespaces) const; + int id) const; }; } // \namespace wrap diff --git a/wrap/Method.cpp b/wrap/Method.cpp index eb143b4dc..cc7c5a865 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -42,7 +42,6 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF const std::string& matlabQualName, const std::string& matlabUniqueName, const string& wrapperName, - const vector& using_namespaces, const TypeAttributesTable& typeAttributes, vector& functionNames) const { @@ -82,7 +81,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF // Output C++ wrapper code const string wrapFunctionName = wrapper_fragment( - wrapperFile, cppClassName, matlabUniqueName, overload, id, using_namespaces, typeAttributes); + wrapperFile, cppClassName, matlabUniqueName, overload, id, typeAttributes); // Add to function list functionNames.push_back(wrapFunctionName); @@ -103,7 +102,6 @@ string Method::wrapper_fragment(FileWriter& file, const string& matlabUniqueName, int overload, int id, - const vector& using_namespaces, const TypeAttributesTable& typeAttributes) const { // generate code @@ -117,7 +115,6 @@ string Method::wrapper_fragment(FileWriter& file, file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; // start file.oss << "{\n"; - generateUsingNamespace(file, using_namespaces); if(returnVal.isPair) { diff --git a/wrap/Method.h b/wrap/Method.h index e23a24186..4185732cf 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -51,8 +51,7 @@ struct Method { // classPath is class directory, e.g., ../matlab/@Point2 void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& cppClassName, const std::string& matlabQualName, const std::string& matlabUniqueName, - const std::string& wrapperName, const std::vector& using_namespaces, - const TypeAttributesTable& typeAttributes, + const std::string& wrapperName, const TypeAttributesTable& typeAttributes, std::vector& functionNames) const; private: @@ -61,7 +60,6 @@ private: const std::string& matlabUniqueName, int overload, int id, - const std::vector& using_namespaces, const TypeAttributesTable& typeAttributes) const; ///< cpp wrapper }; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 35b0d2ff8..8c564e92f 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -84,8 +84,7 @@ Module::Module(const string& interfacePath, GlobalFunction globalFunc0(enable_verbose), globalFunc(enable_verbose); ForwardDeclaration fwDec0, fwDec; vector namespaces, /// current namespace tag - namespaces_return, /// namespace for current return type - using_namespace_current; /// All namespaces from "using" declarations + namespaces_return; /// namespace for current return type string templateArgument; vector templateInstantiationNamespace; vector > templateInstantiations; @@ -264,7 +263,6 @@ Module::Module(const string& interfacePath, [assign_a(constructor.name, cls.name)] [assign_a(cls.constructor, constructor)] [assign_a(cls.namespaces, namespaces)] - [assign_a(cls.using_namespaces, using_namespace_current)] [assign_a(deconstructor.name,cls.name)] [assign_a(cls.deconstructor, deconstructor)] [bl::bind(&handle_possible_template, bl::var(classes), bl::var(cls), bl::var(templateArgument), bl::var(templateInstantiations))] @@ -298,10 +296,6 @@ Module::Module(const string& interfacePath, >> ch_p('}')) [pop_a(namespaces)]; - Rule using_namespace_p = - str_p("using") >> str_p("namespace") - >> namespace_name_p[push_back_a(using_namespace_current)] >> ch_p(';'); - Rule forward_declaration_p = !(str_p("virtual")[assign_a(fwDec.isVirtual, true)]) >> str_p("class") @@ -310,7 +304,7 @@ Module::Module(const string& interfacePath, [push_back_a(forward_declarations, fwDec)] [assign_a(fwDec, fwDec0)]; - Rule module_content_p = comments_p | using_namespace_p | include_p | class_p | templateSingleInstantiation_p | forward_declaration_p | global_function_p | namespace_def_p; + Rule module_content_p = comments_p | include_p | class_p | templateSingleInstantiation_p | forward_declaration_p | global_function_p | namespace_def_p; Rule module_p = *module_content_p >> !end_p; diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index ed80d7890..3def66b0f 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -44,7 +44,6 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr const std::string& matlabQualName, const std::string& matlabUniqueName, const string& wrapperName, - const vector& using_namespaces, const TypeAttributesTable& typeAttributes, vector& functionNames) const { @@ -86,7 +85,7 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr // Output C++ wrapper code const string wrapFunctionName = wrapper_fragment( - wrapperFile, cppClassName, matlabUniqueName, overload, id, using_namespaces, typeAttributes); + wrapperFile, cppClassName, matlabUniqueName, overload, id, typeAttributes); // Add to function list functionNames.push_back(wrapFunctionName); @@ -107,7 +106,6 @@ string StaticMethod::wrapper_fragment(FileWriter& file, const string& matlabUniqueName, int overload, int id, - const vector& using_namespaces, const TypeAttributesTable& typeAttributes) const { // generate code @@ -121,7 +119,6 @@ string StaticMethod::wrapper_fragment(FileWriter& file, file.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; // start file.oss << "{\n"; - generateUsingNamespace(file, using_namespaces); returnVal.wrapTypeUnwrap(file); diff --git a/wrap/StaticMethod.h b/wrap/StaticMethod.h index 55d9f3e99..fc82105f0 100644 --- a/wrap/StaticMethod.h +++ b/wrap/StaticMethod.h @@ -51,8 +51,7 @@ struct StaticMethod { // classPath is class directory, e.g., ../matlab/@Point2 void proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const std::string& cppClassName, const std::string& matlabQualName, const std::string& matlabUniqueName, - const std::string& wrapperName, const std::vector& using_namespaces, - const TypeAttributesTable& typeAttributes, + const std::string& wrapperName, const TypeAttributesTable& typeAttributes, std::vector& functionNames) const; private: @@ -61,7 +60,6 @@ private: const std::string& matlabUniqueName, int overload, int id, - const std::vector& using_namespaces, const TypeAttributesTable& typeAttributes) const; ///< cpp wrapper }; diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index d403073d4..93fde1ca4 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -180,7 +180,6 @@ void Point2_y_10(int nargout, mxArray *out[], int nargin, const mxArray *in[]) void Point3_collectorInsertAndMakeBase_11(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); -using namespace geometry; typedef boost::shared_ptr Shared; Shared *self = *reinterpret_cast (mxGetData(in[0])); @@ -190,7 +189,6 @@ using namespace geometry; void Point3_constructor_12(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); -using namespace geometry; typedef boost::shared_ptr Shared; double x = unwrap< double >(in[0]); @@ -204,7 +202,6 @@ using namespace geometry; void Point3_deconstructor_13(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("delete_Point3",nargout,nargin,1); Shared *self = *reinterpret_cast(mxGetData(in[0])); @@ -218,7 +215,6 @@ using namespace geometry; void Point3_norm_14(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("norm",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Point3"); @@ -227,7 +223,6 @@ using namespace geometry; void Point3_StaticFunctionRet_15(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr SharedPoint3; typedef boost::shared_ptr Shared; checkArguments("Point3.StaticFunctionRet",nargout,nargin,1); @@ -237,7 +232,6 @@ using namespace geometry; void Point3_staticFunction_16(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("Point3.staticFunction",nargout,nargin,0); out[0] = wrap< double >(Point3::staticFunction()); @@ -246,7 +240,6 @@ using namespace geometry; void Test_collectorInsertAndMakeBase_17(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); -using namespace geometry; typedef boost::shared_ptr Shared; Shared *self = *reinterpret_cast (mxGetData(in[0])); @@ -256,7 +249,6 @@ using namespace geometry; void Test_constructor_18(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); -using namespace geometry; typedef boost::shared_ptr Shared; Shared *self = new Shared(new Test()); @@ -268,7 +260,6 @@ using namespace geometry; void Test_constructor_19(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { mexAtExit(&_deleteAllObjects); -using namespace geometry; typedef boost::shared_ptr Shared; double a = unwrap< double >(in[0]); @@ -281,7 +272,6 @@ using namespace geometry; void Test_deconstructor_20(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("delete_Test",nargout,nargin,1); Shared *self = *reinterpret_cast(mxGetData(in[0])); @@ -295,7 +285,6 @@ using namespace geometry; void Test_arg_EigenConstRef_21(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("arg_EigenConstRef",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -305,7 +294,6 @@ using namespace geometry; void Test_create_MixedPtrs_22(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; @@ -317,7 +305,6 @@ using namespace geometry; void Test_create_ptrs_23(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; @@ -329,7 +316,6 @@ using namespace geometry; void Test_print_24(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("print",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -338,7 +324,6 @@ using namespace geometry; void Test_return_Point2Ptr_25(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr SharedPoint2; typedef boost::shared_ptr Shared; checkArguments("return_Point2Ptr",nargout,nargin-1,1); @@ -349,7 +334,6 @@ using namespace geometry; void Test_return_Test_26(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; checkArguments("return_Test",nargout,nargin-1,1); @@ -360,7 +344,6 @@ using namespace geometry; void Test_return_TestPtr_27(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; checkArguments("return_TestPtr",nargout,nargin-1,1); @@ -371,7 +354,6 @@ using namespace geometry; void Test_return_bool_28(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_bool",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -381,7 +363,6 @@ using namespace geometry; void Test_return_double_29(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_double",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -391,7 +372,6 @@ using namespace geometry; void Test_return_field_30(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_field",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -401,7 +381,6 @@ using namespace geometry; void Test_return_int_31(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_int",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -411,7 +390,6 @@ using namespace geometry; void Test_return_matrix1_32(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_matrix1",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -421,7 +399,6 @@ using namespace geometry; void Test_return_matrix2_33(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_matrix2",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -431,7 +408,6 @@ using namespace geometry; void Test_return_pair_34(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_pair",nargout,nargin-1,2); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -443,7 +419,6 @@ using namespace geometry; void Test_return_ptrs_35(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr SharedTest; typedef boost::shared_ptr Shared; @@ -457,7 +432,6 @@ using namespace geometry; void Test_return_size_t_36(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_size_t",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -467,7 +441,6 @@ using namespace geometry; void Test_return_string_37(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_string",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -477,7 +450,6 @@ using namespace geometry; void Test_return_vector1_38(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_vector1",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); @@ -487,7 +459,6 @@ using namespace geometry; void Test_return_vector2_39(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { -using namespace geometry; typedef boost::shared_ptr Shared; checkArguments("return_vector2",nargout,nargin-1,1); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); diff --git a/wrap/tests/geometry.h b/wrap/tests/geometry.h index 2e92043b2..54694a1cf 100644 --- a/wrap/tests/geometry.h +++ b/wrap/tests/geometry.h @@ -15,9 +15,6 @@ class Point2 { VectorNotEigen vectorConfusion(); }; -// flag a namespace as in use - only applies *after* the declaration -using namespace geometry; - class Point3 { Point3(double x, double y, double z); double norm() const; diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index 29fc1891a..844281775 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -76,9 +76,6 @@ TEST( wrap, parse_geometry ) { Module module(markup_header_path.c_str(), "geometry",enable_verbose); EXPECT_LONGS_EQUAL(3, module.classes.size()); - // check using declarations - strvec exp_using1, exp_using2; exp_using2 += "geometry"; - // forward declarations LONGS_EQUAL(2, module.forward_declarations.size()); EXPECT(assert_equal("VectorNotEigen", module.forward_declarations[0].name)); @@ -98,7 +95,6 @@ TEST( wrap, parse_geometry ) { EXPECT_LONGS_EQUAL(7, cls.methods.size()); EXPECT_LONGS_EQUAL(0, cls.static_methods.size()); EXPECT_LONGS_EQUAL(0, cls.namespaces.size()); - EXPECT(assert_equal(exp_using1, cls.using_namespaces)); } // check second class, Point3 @@ -109,7 +105,6 @@ TEST( wrap, parse_geometry ) { EXPECT_LONGS_EQUAL(1, cls.methods.size()); EXPECT_LONGS_EQUAL(2, cls.static_methods.size()); EXPECT_LONGS_EQUAL(0, cls.namespaces.size()); - EXPECT(assert_equal(exp_using2, cls.using_namespaces)); // first constructor takes 3 doubles ArgumentList c1 = cls.constructor.args_list.front(); @@ -140,7 +135,6 @@ TEST( wrap, parse_geometry ) { EXPECT_LONGS_EQUAL(19, testCls.methods.size()); EXPECT_LONGS_EQUAL( 0, testCls.static_methods.size()); EXPECT_LONGS_EQUAL( 0, testCls.namespaces.size()); - EXPECT(assert_equal(exp_using2, testCls.using_namespaces)); // function to parse: pair return_pair (Vector v, Matrix A) const; CHECK(testCls.methods.find("return_pair") != testCls.methods.end()); diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 6b6e57094..52ed3c750 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -115,13 +115,6 @@ string maybe_shared_ptr(bool add, const string& qtype, const string& type) { return str; } -/* ************************************************************************* */ -void generateUsingNamespace(FileWriter& file, const vector& using_namespaces) { - if (using_namespaces.empty()) return; - BOOST_FOREACH(const string& s, using_namespaces) - file.oss << "using namespace " << s << ";" << endl; -} - /* ************************************************************************* */ string qualifiedName(const string& separator, const vector& names, const string& finalName) { string result; diff --git a/wrap/utilities.h b/wrap/utilities.h index 2eaf5397a..85a2246a2 100644 --- a/wrap/utilities.h +++ b/wrap/utilities.h @@ -122,11 +122,6 @@ bool assert_equal(const std::vector& expected, const std::vector& using_namespaces); - /** * Return a qualified name, if finalName is empty, only the names vector will * be used (i.e. there won't be a trailing separator on the qualified name). From d397139fa9b77a2b6e2b233ef133b114e38d8156 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 19:20:53 +0000 Subject: [PATCH 674/914] Fixed dimensions bug in Marginals and added unit test --- gtsam/inference/GenericSequentialSolver-inl.h | 2 +- gtsam/nonlinear/Marginals.cpp | 13 +++-- tests/testMarginals.cpp | 55 +++++++++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/gtsam/inference/GenericSequentialSolver-inl.h b/gtsam/inference/GenericSequentialSolver-inl.h index 53dee3dcd..368aae831 100644 --- a/gtsam/inference/GenericSequentialSolver-inl.h +++ b/gtsam/inference/GenericSequentialSolver-inl.h @@ -88,7 +88,7 @@ namespace gtsam { GenericSequentialSolver::jointFactorGraph( const std::vector& js, Eliminate function) const { - // Compute a COLAMD permutation with the marginal variable constrained to the end. + // Compute a COLAMD permutation with the marginal variables constrained to the end. Permutation::shared_ptr permutation(inference::PermutationCOLAMD(*structure_, js)); Permutation::shared_ptr permutationInverse(permutation->inverse()); diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index f7f1aa00f..52c507374 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -110,11 +110,11 @@ JointMarginal Marginals::jointMarginalInformation(const std::vector& variab return JointMarginal(info, dims, indices); } else { - // Convert keys to linear indices + // Obtain requested variables as ordered indices vector indices(variables.size()); for(size_t i=0; i& variab jointFG = *GaussianSequentialSolver(graph_, true).jointFactorGraph(indices); } - // Conversion from variable keys to position in factor graph variables, + // Build map from variable keys to position in factor graph variables, // which are sorted in index order. Ordering variableConversion; { + // First build map from index to key FastMap usedIndices; for(size_t i=0; i Index_Key; BOOST_FOREACH(const Index_Key& index_key, usedIndices) { @@ -145,8 +147,9 @@ JointMarginal Marginals::jointMarginalInformation(const std::vector& variab // Get dimensions from factor graph std::vector dims(indices.size(), 0); - for(size_t i = 0; i < variables.size(); ++i) - dims[i] = values_.at(variables[i]).dim(); + BOOST_FOREACH(Key key, variables) { + dims[variableConversion[key]] = values_.at(key).dim(); + } // Get information matrix Matrix augmentedInfo = jointFG.denseHessian(); diff --git a/tests/testMarginals.cpp b/tests/testMarginals.cpp index da7157a1e..c9bd43b27 100644 --- a/tests/testMarginals.cpp +++ b/tests/testMarginals.cpp @@ -180,7 +180,62 @@ TEST(Marginals, planarSLAMmarginals) { EXPECT(assert_equal(expectedx1, Matrix(joint_l2x1(x1,x1)), 1e-6)); } +/* ************************************************************************* */ +TEST(Marginals, order) { + NonlinearFactorGraph fg; + fg.add(PriorFactor(0, Pose2(), noiseModel::Unit::Create(3))); + fg.add(BetweenFactor(0, 1, Pose2(1,0,0), noiseModel::Unit::Create(3))); + fg.add(BetweenFactor(1, 2, Pose2(1,0,0), noiseModel::Unit::Create(3))); + fg.add(BetweenFactor(2, 3, Pose2(1,0,0), noiseModel::Unit::Create(3))); + Values vals; + vals.insert(0, Pose2()); + vals.insert(1, Pose2(1,0,0)); + vals.insert(2, Pose2(2,0,0)); + vals.insert(3, Pose2(3,0,0)); + + vals.insert(100, Point2(0,1)); + vals.insert(101, Point2(1,1)); + + fg.add(BearingRangeFactor(0, 100, + vals.at(0).bearing(vals.at(100)), + vals.at(0).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(0, 101, + vals.at(0).bearing(vals.at(101)), + vals.at(0).range(vals.at(101)), noiseModel::Unit::Create(2))); + + fg.add(BearingRangeFactor(1, 100, + vals.at(1).bearing(vals.at(100)), + vals.at(1).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(1, 101, + vals.at(1).bearing(vals.at(101)), + vals.at(1).range(vals.at(101)), noiseModel::Unit::Create(2))); + + fg.add(BearingRangeFactor(2, 100, + vals.at(2).bearing(vals.at(100)), + vals.at(2).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(2, 101, + vals.at(2).bearing(vals.at(101)), + vals.at(2).range(vals.at(101)), noiseModel::Unit::Create(2))); + + fg.add(BearingRangeFactor(3, 100, + vals.at(3).bearing(vals.at(100)), + vals.at(3).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(3, 101, + vals.at(3).bearing(vals.at(101)), + vals.at(3).range(vals.at(101)), noiseModel::Unit::Create(2))); + + Marginals marginals(fg, vals); + FastVector keys(fg.keys()); + JointMarginal joint = marginals.jointMarginalCovariance(keys); + + LONGS_EQUAL(3, joint(0,0).rows()); + LONGS_EQUAL(3, joint(1,1).rows()); + LONGS_EQUAL(3, joint(2,2).rows()); + LONGS_EQUAL(3, joint(3,3).rows()); + LONGS_EQUAL(2, joint(100,100).rows()); + LONGS_EQUAL(2, joint(101,101).rows()); +} /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr);} From 5b584c3b73b0413e7b6082bb6a0aa1a373ca6029 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 19:20:56 +0000 Subject: [PATCH 675/914] Added SuccessiveLinearizationParams.ordering and BearingRangeFactor in matlab interface --- gtsam.h | 15 +++++++++++---- .../nonlinear/SuccessiveLinearizationOptimizer.h | 16 ++++++---------- gtsam/slam/BearingFactor.h | 4 ++-- gtsam/slam/BearingRangeFactor.h | 4 ++-- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/gtsam.h b/gtsam.h index 08c4ed9d3..7cb46fc55 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1167,6 +1167,7 @@ virtual class NonlinearOptimizerParams { virtual class SuccessiveLinearizationParams : gtsam::NonlinearOptimizerParams { SuccessiveLinearizationParams(); + void setOrdering(const gtsam::Ordering& ordering); bool isMultifrontal() const; bool isSequential() const; bool isCholmod() const; @@ -1357,16 +1358,22 @@ typedef gtsam::RangeFactor RangeFactorSimple typedef gtsam::RangeFactor RangeFactorCalibratedCamera; typedef gtsam::RangeFactor RangeFactorSimpleCamera; - -#include -template +template virtual class BearingFactor : gtsam::NonlinearFactor { - BearingFactor(size_t key1, size_t key2, const ROT& measured, const gtsam::noiseModel::Base* noiseModel); + BearingFactor(size_t key1, size_t key2, const ROTATION& measured, const gtsam::noiseModel::Base* noiseModel); }; typedef gtsam::BearingFactor BearingFactor2D; +template +virtual class BearingRangeFactor : gtsam::NonlinearFactor { + BearingRangeFactor(size_t poseKey, size_t pointKey, const ROTATION& measuredBearing, double measuredRange, const gtsam::noiseModel::Base* noiseModel); +}; + +typedef gtsam::BearingRangeFactor BearingRangeFactor2D; + + #include template virtual class GenericProjectionFactor : gtsam::NonlinearFactor { diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index 7033613ac..2556134c0 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -78,20 +78,16 @@ public: } inline bool isMultifrontal() const { - return (linearSolverType == MULTIFRONTAL_CHOLESKY) || (linearSolverType == MULTIFRONTAL_QR); - } + return (linearSolverType == MULTIFRONTAL_CHOLESKY) || (linearSolverType == MULTIFRONTAL_QR); } inline bool isSequential() const { - return (linearSolverType == SEQUENTIAL_CHOLESKY) || (linearSolverType == SEQUENTIAL_QR); - } + return (linearSolverType == SEQUENTIAL_CHOLESKY) || (linearSolverType == SEQUENTIAL_QR); } - inline bool isCholmod() const { - return (linearSolverType == CHOLMOD); - } + inline bool isCholmod() const { return (linearSolverType == CHOLMOD); } - inline bool isCG() const { - return (linearSolverType == CG); - } + inline bool isCG() const { return (linearSolverType == CG); } + + void setOrdering(const Ordering& ordering) { this->ordering = ordering; } GaussianFactorGraph::Eliminate getEliminationFunction() { switch (linearSolverType) { diff --git a/gtsam/slam/BearingFactor.h b/gtsam/slam/BearingFactor.h index 62e46d53e..326491e8c 100644 --- a/gtsam/slam/BearingFactor.h +++ b/gtsam/slam/BearingFactor.h @@ -25,12 +25,12 @@ namespace gtsam { /** * Binary factor for a bearing measurement */ - template + template class BearingFactor: public NoiseModelFactor2 { private: typedef POSE Pose; - typedef ROT Rot; + typedef ROTATION Rot; typedef POINT Point; typedef BearingFactor This; diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index 933333fdf..bf5b6b3a5 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -27,12 +27,12 @@ namespace gtsam { /** * Binary factor for a bearing measurement */ - template + template class BearingRangeFactor: public NoiseModelFactor2 { private: typedef POSE Pose; - typedef typename POSE::Rotation Rot; + typedef ROTATION Rot; typedef POINT Point; typedef BearingRangeFactor This; From 080dd7d57ccc4890af3171e0a7d50cf2d99cbe17 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 19:21:00 +0000 Subject: [PATCH 676/914] Updated some of the matlab utility functions --- matlab/covarianceEllipse3D.m | 2 +- matlab/examples/findExampleDataFile.m | 19 ++++++++ matlab/load2D.m | 10 +++-- matlab/plot2DPoints.m | 34 +++++++++++++++ matlab/plot2DTrajectory.m | 17 ++++++-- matlab/plot3DTrajectory.m | 63 +++++++++++++++++++++------ matlab/plotPose3.m | 26 ++++++----- 7 files changed, 137 insertions(+), 34 deletions(-) create mode 100644 matlab/examples/findExampleDataFile.m create mode 100644 matlab/plot2DPoints.m diff --git a/matlab/covarianceEllipse3D.m b/matlab/covarianceEllipse3D.m index 6d6ed9127..d3ef1f8a7 100644 --- a/matlab/covarianceEllipse3D.m +++ b/matlab/covarianceEllipse3D.m @@ -11,7 +11,7 @@ k = 11.82; radii = k*sqrt(diag(s)); % generate data for "unrotated" ellipsoid -[xc,yc,zc] = ellipsoid(0,0,0,radii(1),radii(2),radii(3)); +[xc,yc,zc] = ellipsoid(0,0,0,radii(1),radii(2),radii(3),8); % rotate data with orientation matrix U and center M data = kron(e(:,1),xc) + kron(e(:,2),yc) + kron(e(:,3),zc); diff --git a/matlab/examples/findExampleDataFile.m b/matlab/examples/findExampleDataFile.m new file mode 100644 index 000000000..7719dfcfa --- /dev/null +++ b/matlab/examples/findExampleDataFile.m @@ -0,0 +1,19 @@ +function datafile = findExampleDataFile(datasetName) +%FINDEXAMPLEDATAFILE Find a dataset in the examples folder + +[ myPath, ~, ~ ] = fileparts(mfilename('fullpath')); +searchPath = { ... + fullfile(myPath, [ '../../examples/Data/' datasetName ]) ... + fullfile(myPath, [ 'Data/' datasetName ]) }; +datafile = []; +for path = searchPath + if exist(path{:}, 'file') + datafile = path{:}; + end +end +if isempty(datafile) + error([ 'Could not find example data file ' datasetName ]); +end + +end + diff --git a/matlab/load2D.m b/matlab/load2D.m index 31e96818f..c4b2e105d 100644 --- a/matlab/load2D.m +++ b/matlab/load2D.m @@ -2,6 +2,8 @@ function [graph,initial] = load2D(filename,model) % load2D: read TORO pose graph % cannot read noise model from file yet, uses specified model +import gtsam.* + fid = fopen(filename); if fid < 0 error(['load2D: Cannot open file ' filename]); @@ -13,17 +15,17 @@ fclose(fid); lines=columns{1}; % loop over lines and add vertices -graph = pose2SLAM.Graph; -initial = pose2SLAM.Values; +graph = NonlinearFactorGraph; +initial = Values; n=size(lines,1); for i=1:n line_i=lines{i}; if strcmp('VERTEX2',line_i(1:7)) v = textscan(line_i,'%s %d %f %f %f',1); - initial.insertPose(v{2}, gtsam.Pose2(v{3}, v{4}, v{5})); + initial.insert(v{2}, Pose2(v{3}, v{4}, v{5})); elseif strcmp('EDGE2',line_i(1:5)) e = textscan(line_i,'%s %d %d %f %f %f',1); - graph.addRelativePose(e{2}, e{3}, gtsam.Pose2(e{4}, e{5}, e{6}), model); + graph.add(BetweenFactorPose2(e{2}, e{3}, Pose2(e{4}, e{5}, e{6}), model)); end end diff --git a/matlab/plot2DPoints.m b/matlab/plot2DPoints.m new file mode 100644 index 000000000..0065b55c4 --- /dev/null +++ b/matlab/plot2DPoints.m @@ -0,0 +1,34 @@ +function plot2DPoints(values, marginals) +%PLOT2DPOINTS Plots the Point2's in a values, with optional covariances +% Finds all the Point2 objects in the given Values object and plots them. +% If a Marginals object is given, this function will also plot marginal +% covariance ellipses for each point. + +import gtsam.* + +haveMarginals = exist('marginals', 'var'); +keys = KeyVector(values.keys); + +holdstate = ishold; +hold on + +% Plot points and covariance matrices +for i = 0:keys.size-1 + key = keys.at(i); + p = values.at(key); + if isa(p, 'gtsam.Point2') + if haveMarginals + P = marginals.marginalCovariance(key); + plotPoint2(p, 'g', P); + else + plotPoint2(p, 'g'); + end + end +end + +if ~holdstate + hold off +end + +end + diff --git a/matlab/plot2DTrajectory.m b/matlab/plot2DTrajectory.m index 82c62bb40..fcbfe4b92 100644 --- a/matlab/plot2DTrajectory.m +++ b/matlab/plot2DTrajectory.m @@ -1,4 +1,4 @@ -function plot2DTrajectory(values, marginals) +function plot2DTrajectory(values, linespec, marginals) %PLOT2DTRAJECTORY Plots the Pose2's in a values, with optional covariances % Finds all the Pose2 objects in the given Values object and plots them % in increasing key order, connecting consecutive poses with a line. If @@ -7,10 +7,17 @@ function plot2DTrajectory(values, marginals) import gtsam.* +if ~exist('linespec', 'var') || isempty(linespec) + linespec = 'k*-'; +end + haveMarginals = exist('marginals', 'var'); keys = KeyVector(values.keys); -% Store poses and covariance matrices +holdstate = ishold; +hold on + +% Plot poses and covariance matrices lastIndex = []; for i = 0:keys.size-1 key = keys.at(i); @@ -21,7 +28,7 @@ for i = 0:keys.size-1 % last pose. lastKey = keys.at(lastIndex); lastPose = values.at(lastKey); - plot([ x.x; lastPose.x ], [ x.y; lastPose.y ], 'k*-'); + plot([ x.x; lastPose.x ], [ x.y; lastPose.y ], linespec); if haveMarginals P = marginals.marginalCovariance(lastKey); plotPose2(lastPose, 'g', P); @@ -39,5 +46,9 @@ if ~isempty(lastIndex) && haveMarginals plotPose2(lastPose, 'g', P); end +if ~holdstate + hold off +end + end diff --git a/matlab/plot3DTrajectory.m b/matlab/plot3DTrajectory.m index 83d3d76e2..771d567fa 100644 --- a/matlab/plot3DTrajectory.m +++ b/matlab/plot3DTrajectory.m @@ -1,18 +1,53 @@ -function plot3DTrajectory(values,style,frames,scale) +function plot3DTrajectory(values,linespec,frames,scale,marginals) % plot3DTrajectory -if nargin<3,frames=false;end -if nargin<4,scale=0;end +if ~exist('scale','var') || isempty(scale), scale=1; end +if ~exist('frames','var'), scale=[]; end -T=values.translations() -plot3(T(:,1),T(:,2),T(:,3),style); hold on -if frames - N=values.size; - for i=0:N-1 - pose = values.pose(i); - t = pose.translation; - R = pose.rotation.matrix; - quiver3(t.x,t.y,t.z,R(1,1),R(2,1),R(3,1),scale,'r'); - quiver3(t.x,t.y,t.z,R(1,2),R(2,2),R(3,2),scale,'g'); - quiver3(t.x,t.y,t.z,R(1,3),R(2,3),R(3,3),scale,'b'); +import gtsam.* + +haveMarginals = exist('marginals', 'var'); +keys = KeyVector(values.keys); + +holdstate = ishold; +hold on + +% Plot poses and covariance matrices +lastIndex = []; +for i = 0:keys.size-1 + key = keys.at(i); + x = values.at(key); + if isa(x, 'gtsam.Pose3') + if ~isempty(lastIndex) + % Draw line from last pose then covariance ellipse on top of + % last pose. + lastKey = keys.at(lastIndex); + lastPose = values.at(lastKey); + plot3([ x.x; lastPose.x ], [ x.y; lastPose.y ], [ x.z; lastPose.z ], linespec); + if haveMarginals + P = marginals.marginalCovariance(lastKey); + else + P = []; + end + plotPose3(lastPose, P, scale); + end + lastIndex = i; end +end + +% Draw final pose +if ~isempty(lastIndex) + lastKey = keys.at(lastIndex); + lastPose = values.at(lastKey); + if haveMarginals + P = marginals.marginalCovariance(lastKey); + else + P = []; + end + plotPose3(lastPose, P, scale); +end + +if ~holdstate + hold off +end + end \ No newline at end of file diff --git a/matlab/plotPose3.m b/matlab/plotPose3.m index 262d1dfc1..956b231be 100644 --- a/matlab/plotPose3.m +++ b/matlab/plotPose3.m @@ -6,18 +6,20 @@ if nargin<3,axisLength=0.1;end gRp = pose.rotation().matrix(); % rotation from pose to global C = pose.translation().vector(); -% draw the camera axes -xAxis = C+gRp(:,1)*axisLength; -L = [C xAxis]'; -line(L(:,1),L(:,2),L(:,3),'Color','r'); - -yAxis = C+gRp(:,2)*axisLength; -L = [C yAxis]'; -line(L(:,1),L(:,2),L(:,3),'Color','g'); - -zAxis = C+gRp(:,3)*axisLength; -L = [C zAxis]'; -line(L(:,1),L(:,2),L(:,3),'Color','b'); +if ~isempty(axisLength) + % draw the camera axes + xAxis = C+gRp(:,1)*axisLength; + L = [C xAxis]'; + line(L(:,1),L(:,2),L(:,3),'Color','r'); + + yAxis = C+gRp(:,2)*axisLength; + L = [C yAxis]'; + line(L(:,1),L(:,2),L(:,3),'Color','g'); + + zAxis = C+gRp(:,3)*axisLength; + L = [C zAxis]'; + line(L(:,1),L(:,2),L(:,3),'Color','b'); +end % plot the covariance if (nargin>2) && (~isempty(P)) From 62f28bb798dca3845eb843bda045c855b29919f7 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 19:21:05 +0000 Subject: [PATCH 677/914] Updated more matlab examples --- matlab/examples/LocalizationExample.m | 2 +- matlab/examples/OdometryExample.m | 2 +- matlab/examples/PlanarSLAMExample.m | 59 +++++++----------- matlab/examples/PlanarSLAMExample_sampling.m | 61 ++++++++----------- matlab/examples/Pose2SLAMExample.m | 43 ++++++------- matlab/examples/Pose2SLAMExample_advanced.m | 33 +++++----- matlab/examples/Pose2SLAMExample_circle.m | 44 +++++++------ matlab/examples/Pose2SLAMExample_graph.m | 22 ++++--- matlab/examples/Pose2SLAMwSPCG.m | 29 ++++----- matlab/examples/Pose3SLAMExample.m | 41 +++++++------ matlab/examples/Pose3SLAMExample_graph.m | 30 +++++---- matlab/examples/gtsamExamples.fig | Bin 9270 -> 10455 bytes matlab/examples/gtsamExamples.m | 34 +++++++++-- 13 files changed, 211 insertions(+), 189 deletions(-) diff --git a/matlab/examples/LocalizationExample.m b/matlab/examples/LocalizationExample.m index 1c38bc979..e4ee76d7c 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/examples/LocalizationExample.m @@ -55,7 +55,7 @@ import gtsam.* cla; hold on; -plot2DTrajectory(result, Marginals(graph, result)); +plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/examples/OdometryExample.m b/matlab/examples/OdometryExample.m index 16323a616..81733cfb0 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/examples/OdometryExample.m @@ -52,7 +52,7 @@ import gtsam.* cla; hold on; -plot2DTrajectory(result, Marginals(graph, result)); +plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index e664d66fc..f82b3aea4 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -25,72 +25,59 @@ i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); j1 = symbol('l',1); j2 = symbol('l',2); %% Create graph container and add factors to it -graph = planarSLAM.Graph; +graph = gtsam.NonlinearFactorGraph; %% Add prior import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(i1, priorMean, priorNoise)); % add directly to graph %% Add odometry import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(i1, i2, odometry, odometryNoise); -graph.addRelativePose(i2, i3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(i1, i2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(i2, i3, odometry, odometryNoise)); %% Add bearing/range measurement factors import gtsam.* degrees = pi/180; brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); -graph.addBearingRange(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise); -graph.addBearingRange(i2, j1, Rot2(90*degrees), 2, brNoise); -graph.addBearingRange(i3, j2, Rot2(90*degrees), 2, brNoise); +graph.add(BearingRangeFactor2D(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise)); +graph.add(BearingRangeFactor2D(i2, j1, Rot2(90*degrees), 2, brNoise)); +graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); % print graph.print(sprintf('\nFull graph:\n')); %% Initialize to noisy points import gtsam.* -initialEstimate = planarSLAM.Values; -initialEstimate.insertPose(i1, Pose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(i2, Pose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(i3, Pose2(4.1, 0.1, 0.1)); -initialEstimate.insertPoint(j1, Point2(1.8, 2.1)); -initialEstimate.insertPoint(j2, Point2(4.1, 1.8)); +initialEstimate = Values; +initialEstimate.insert(i1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insert(i2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insert(i3, Pose2(4.1, 0.1, 0.1)); +initialEstimate.insert(j1, Point2(1.8, 2.1)); +initialEstimate.insert(j2, Point2(4.1, 1.8)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,1); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses import gtsam.* cla;hold on -marginals = graph.marginals(result); -for i=1:3 - key = symbol('x',i); - pose{i} = result.pose(key); - P{i}=marginals.marginalCovariance(key); - if i>1 - plot([pose{i-1}.x;pose{i}.x],[pose{i-1}.y;pose{i}.y],'r-'); - end -end -for i=1:3 - plotPose2(pose{i},'g',P{i}) -end -point = {}; -for j=1:2 - key = symbol('l',j); - point{j} = result.point(key); - Q{j}=marginals.marginalCovariance(key); - plotPoint2(point{j},'b',Q{j}) -end -plot([pose{1}.x;point{1}.x],[pose{1}.y;point{1}.y],'c-'); -plot([pose{2}.x;point{1}.x],[pose{2}.y;point{1}.y],'c-'); -plot([pose{3}.x;point{2}.x],[pose{3}.y;point{2}.y],'c-'); + +marginals = Marginals(graph, result); +plot2DTrajectory(result, [], marginals); +plot2DPoints(result, marginals); + +plot([result.at(i1).x; result.at(j1).x],[result.at(i1).y; result.at(j1).y], 'c-'); +plot([result.at(i2).x; result.at(j1).x],[result.at(i2).y; result.at(j1).y], 'c-'); +plot([result.at(i3).x; result.at(j2).x],[result.at(i3).y; result.at(j2).y], 'c-'); axis([-0.6 4.8 -1 1]) axis equal view(2) diff --git a/matlab/examples/PlanarSLAMExample_sampling.m b/matlab/examples/PlanarSLAMExample_sampling.m index ec68d81e6..35d3232a1 100644 --- a/matlab/examples/PlanarSLAMExample_sampling.m +++ b/matlab/examples/PlanarSLAMExample_sampling.m @@ -14,14 +14,14 @@ %% Create the same factor graph as in PlanarSLAMExample import gtsam.* i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); -graph = planarSLAM.Graph; +graph = NonlinearFactorGraph; priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(i1, priorMean, priorNoise)); % add directly to graph odometry = Pose2(2.0, 0.0, 0.0); odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(i1, i2, odometry, odometryNoise); -graph.addRelativePose(i2, i3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(i1, i2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(i2, i3, odometry, odometryNoise)); %% Except, for measurements we offer a choice import gtsam.* @@ -29,48 +29,41 @@ j1 = symbol('l',1); j2 = symbol('l',2); degrees = pi/180; brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); if 1 - graph.addBearingRange(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise); - graph.addBearingRange(i2, j1, Rot2(90*degrees), 2, brNoise); + graph.add(BearingRangeFactor2D(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise)); + graph.add(BearingRangeFactor2D(i2, j1, Rot2(90*degrees), 2, brNoise)); else bearingModel = noiseModel.Diagonal.Sigmas(0.1); - graph.addBearing(i1, j1, Rot2(45*degrees), bearingModel); - graph.addBearing(i2, j1, Rot2(90*degrees), bearingModel); + graph.add(BearingFactor2D(i1, j1, Rot2(45*degrees), bearingModel)); + graph.add(BearingFactor2D(i2, j1, Rot2(90*degrees), bearingModel)); end -graph.addBearingRange(i3, j2, Rot2(90*degrees), 2, brNoise); +graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); %% Initialize MCMC sampler with ground truth -sample = planarSLAM.Values; -sample.insertPose(i1, Pose2(0,0,0)); -sample.insertPose(i2, Pose2(2,0,0)); -sample.insertPose(i3, Pose2(4,0,0)); -sample.insertPoint(j1, Point2(2,2)); -sample.insertPoint(j2, Point2(4,2)); +sample = Values; +sample.insert(i1, Pose2(0,0,0)); +sample.insert(i2, Pose2(2,0,0)); +sample.insert(i3, Pose2(4,0,0)); +sample.insert(j1, Point2(2,2)); +sample.insert(j2, Point2(4,2)); %% Calculate and plot Covariance Ellipses -figure(1);clf;hold on -marginals = graph.marginals(sample); -for i=1:3 - key = symbol('x',i); - pose{i} = sample.pose(key); - P{i}=marginals.marginalCovariance(key); - if i>1 - plot([pose{i-1}.x;pose{i}.x],[pose{i-1}.y;pose{i}.y],'r-'); - end -end -for i=1:3 - plotPose2(pose{i},'g',P{i}) -end +cla;hold on +marginals = Marginals(graph, sample); + +plot2DTrajectory(sample, [], marginals); +plot2DPoints(sample, marginals); + for j=1:2 key = symbol('l',j); - point{j} = sample.point(key); + point{j} = sample.at(key); Q{j}=marginals.marginalCovariance(key); S{j}=chol(Q{j}); % for sampling - plotPoint2(point{j},'b',Q{j}) end -plot([pose{1}.x;point{1}.x],[pose{1}.y;point{1}.y],'c-'); -plot([pose{2}.x;point{1}.x],[pose{2}.y;point{1}.y],'c-'); -plot([pose{3}.x;point{2}.x],[pose{3}.y;point{2}.y],'c-'); -axis equal + +plot([sample.at(i1).x; sample.at(j1).x],[sample.at(i1).y; sample.at(j1).y], 'c-'); +plot([sample.at(i2).x; sample.at(j1).x],[sample.at(i2).y; sample.at(j1).y], 'c-'); +plot([sample.at(i3).x; sample.at(j2).x],[sample.at(i3).y; sample.at(j2).y], 'c-'); +view(2); axis auto; axis equal %% Do Sampling on point 2 N=1000; diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/examples/Pose2SLAMExample.m index 4bb072fa8..1e26ce33d 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/examples/Pose2SLAMExample.m @@ -19,58 +19,55 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAM.Graph; +graph = NonlinearFactorGraph; %% Add prior import gtsam.* % gaussian for prior priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add odometry import gtsam.* % general noisemodel for odometry odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addRelativePose(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.add(BetweenFactorPose2(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise)); +graph.add(BetweenFactorPose2(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise)); +graph.add(BetweenFactorPose2(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise)); %% Add pose constraint import gtsam.* model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(5, 2, Pose2(2.0, 0.0, pi/2), model); +graph.add(BetweenFactorPose2(5, 2, Pose2(2.0, 0.0, pi/2), model)); % print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points import gtsam.* -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2 )); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2 )); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, pi/2)); -initialEstimate.insertPose(4, Pose2(4.0, 2.0, pi )); -initialEstimate.insertPose(5, Pose2(2.1, 2.1,-pi/2)); +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2 )); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2 )); +initialEstimate.insert(3, Pose2(4.1, 0.1, pi/2)); +initialEstimate.insert(4, Pose2(4.0, 2.0, pi )); +initialEstimate.insert(5, Pose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,1); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses cla; -X=result.poses(); -plot(X(:,1),X(:,2),'k*-'); hold on -plot([result.pose(5).x;result.pose(2).x],[result.pose(5).y;result.pose(2).y],'r-'); -marginals = graph.marginals(result); +hold on +plot([result.at(5).x;result.at(2).x],[result.at(5).y;result.at(2).y],'r-','LineWidth',2); +marginals = Marginals(graph, result); + +plot2DTrajectory(result, [], marginals); -for i=1:result.size() - pose_i = result.pose(i); - P = marginals.marginalCovariance(i) - plotPose2(pose_i,'g',P); -end axis([-0.6 4.8 -1 1]) axis equal view(2) diff --git a/matlab/examples/Pose2SLAMExample_advanced.m b/matlab/examples/Pose2SLAMExample_advanced.m index fc23d67f1..b496c44e7 100644 --- a/matlab/examples/Pose2SLAMExample_advanced.m +++ b/matlab/examples/Pose2SLAMExample_advanced.m @@ -21,22 +21,22 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAM.Graph; +graph = NonlinearFactorGraph; %% Add prior import gtsam.* % gaussian for prior priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin -graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add odometry import gtsam.* % general noisemodel for odometry odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) -graph.addRelativePose(1, 2, odometry, odometryNoise); -graph.addRelativePose(2, 3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Add measurements import gtsam.* @@ -48,23 +48,23 @@ graph.print('full graph'); %% Initialize to noisy points import gtsam.* -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print('initial estimate'); %% set up solver, choose ordering and optimize -%params = NonlinearOptimizationParameters_newDecreaseThresholds(1e-15, 1e-15); -% -%ord = graph.orderingCOLAMD(initialEstimate); -% -%result = pose2SLAMOptimizer(graph,initialEstimate,ord,params); -%result.print('final result'); +params = DoglegParams; +params.setAbsoluteErrorTol(1e-15); +params.setRelativeErrorTol(1e-15); +params.setVerbosity('ERROR'); +params.setVerbosityDL('VERBOSE'); +params.setOrdering(graph.orderingCOLAMD(initialEstimate)); +optimizer = DoglegOptimizer(graph, initialEstimate, params); -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,1); +result = optimizer.optimizeSafely(); result.print('final result'); %% Get the corresponding dense matrix @@ -78,3 +78,4 @@ Ab=sparse(IJS(1,:),IJS(2,:),IJS(3,:)); A = Ab(:,1:end-1); b = full(Ab(:,end)); spy(A); +title('Non-zero entries in measurement Jacobian'); diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m index 355f1a10e..e16edf9cb 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/examples/Pose2SLAMExample_circle.m @@ -16,33 +16,37 @@ p0 = hexagon.pose(0); p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement -fg = pose2SLAM.Graph; -fg.addPoseConstraint(0, p0); +import gtsam.* +fg = NonlinearFactorGraph; +fg.add(NonlinearEqualityPose2(0, p0)); delta = p0.between(p1); -covariance = gtsam.noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -fg.addRelativePose(0,1, delta, covariance); -fg.addRelativePose(1,2, delta, covariance); -fg.addRelativePose(2,3, delta, covariance); -fg.addRelativePose(3,4, delta, covariance); -fg.addRelativePose(4,5, delta, covariance); -fg.addRelativePose(5,0, delta, covariance); +covariance = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); +fg.add(BetweenFactorPose2(0,1, delta, covariance)); +fg.add(BetweenFactorPose2(1,2, delta, covariance)); +fg.add(BetweenFactorPose2(2,3, delta, covariance)); +fg.add(BetweenFactorPose2(3,4, delta, covariance)); +fg.add(BetweenFactorPose2(4,5, delta, covariance)); +fg.add(BetweenFactorPose2(5,0, delta, covariance)); %% Create initial config -initial = pose2SLAM.Values; -initial.insertPose(0, p0); -initial.insertPose(1, hexagon.pose(1).retract([-0.1, 0.1,-0.1]')); -initial.insertPose(2, hexagon.pose(2).retract([ 0.1,-0.1, 0.1]')); -initial.insertPose(3, hexagon.pose(3).retract([-0.1, 0.1,-0.1]')); -initial.insertPose(4, hexagon.pose(4).retract([ 0.1,-0.1, 0.1]')); -initial.insertPose(5, hexagon.pose(5).retract([-0.1, 0.1,-0.1]')); +initial = Values; +initial.insert(0, p0); +initial.insert(1, hexagon.pose(1).retract([-0.1, 0.1,-0.1]')); +initial.insert(2, hexagon.pose(2).retract([ 0.1,-0.1, 0.1]')); +initial.insert(3, hexagon.pose(3).retract([-0.1, 0.1,-0.1]')); +initial.insert(4, hexagon.pose(4).retract([ 0.1,-0.1, 0.1]')); +initial.insert(5, hexagon.pose(5).retract([-0.1, 0.1,-0.1]')); %% Plot Initial Estimate -figure(1);clf -plot(initial.xs(),initial.ys(),'g-*'); axis equal +cla +plot2DTrajectory(initial, 'g*-'); axis equal %% optimize -result = fg.optimize(initial); +optimizer = DoglegOptimizer(fg, initial); +result = optimizer.optimizeSafely; %% Show Result -hold on; plot(result.xs(),result.ys(),'b-*') +hold on; plot2DTrajectory(result, 'b*-'); +view(2); +axis([-1.5 1.5 -1.5 1.5]); result.print(sprintf('\nFinal result:\n')); diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index ac6d1e317..2cfe900a0 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -10,33 +10,39 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Find data file +datafile = findExampleDataFile('w100-odom.graph'); + %% Initialize graph, initial estimate, and odometry noise import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -[graph,initial]=load2D('../../examples/Data/w100-odom.graph',model); +[graph,initial] = load2D(datafile, model); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); -graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(0, priorMean, priorNoise)); % add directly to graph %% Plot Initial Estimate -figure(1);clf -plot(initial.xs(),initial.ys(),'g-*'); axis equal +cla +plot2DTrajectory(initial, 'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initial); -hold on; plot(result.xs(),result.ys(),'b-*') +optimizer = LevenbergMarquardtOptimizer(graph, initial); +result = optimizer.optimizeSafely; +hold on; plot2DTrajectory(result, 'b-*'); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses -marginals = graph.marginals(result); +marginals = Marginals(graph, result); P={}; for i=1:result.size()-1 - pose_i = result.pose(i); + pose_i = result.at(i); P{i}=marginals.marginalCovariance(i); plotPose2(pose_i,'b',P{i}) end +view(2) +axis([-15 10 -15 10]); axis equal; fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file diff --git a/matlab/examples/Pose2SLAMwSPCG.m b/matlab/examples/Pose2SLAMwSPCG.m index 5db736fab..dca31ac94 100644 --- a/matlab/examples/Pose2SLAMwSPCG.m +++ b/matlab/examples/Pose2SLAMwSPCG.m @@ -17,41 +17,42 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAM.Graph; +graph = NonlinearFactorGraph; %% Add prior import gtsam.* % gaussian for prior priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add odometry import gtsam.* % general noisemodel for odometry odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addRelativePose(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.add(BetweenFactorPose2(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise)); +graph.add(BetweenFactorPose2(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise)); +graph.add(BetweenFactorPose2(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise)); %% Add pose constraint import gtsam.* model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(5, 2, Pose2(2.0, 0.0, pi/2), model); +graph.add(BetweenFactorPose2(5, 2, Pose2(2.0, 0.0, pi/2), model)); % print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2 )); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2 )); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, pi/2)); -initialEstimate.insertPose(4, Pose2(4.0, 2.0, pi )); -initialEstimate.insertPose(5, Pose2(2.1, 2.1,-pi/2)); +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2 )); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2 )); +initialEstimate.insert(3, Pose2(4.1, 0.1, pi/2)); +initialEstimate.insert(4, Pose2(4.0, 2.0, pi )); +initialEstimate.insert(5, Pose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimizeSPCG(initialEstimate); +optimizer = DoglegOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n')); \ No newline at end of file diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/examples/Pose3SLAMExample.m index d4a8baf99..86c5c23c8 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -16,37 +16,38 @@ p0 = hexagon.pose(0); p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement -fg = pose3SLAM.Graph; -fg.addPoseConstraint(0, p0); +import gtsam.* +fg = NonlinearFactorGraph; +fg.add(NonlinearEqualityPose3(0, p0)); delta = p0.between(p1); -covariance = gtsam.noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -fg.addRelativePose(0,1, delta, covariance); -fg.addRelativePose(1,2, delta, covariance); -fg.addRelativePose(2,3, delta, covariance); -fg.addRelativePose(3,4, delta, covariance); -fg.addRelativePose(4,5, delta, covariance); -fg.addRelativePose(5,0, delta, covariance); +covariance = noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +fg.add(BetweenFactorPose3(0,1, delta, covariance)); +fg.add(BetweenFactorPose3(1,2, delta, covariance)); +fg.add(BetweenFactorPose3(2,3, delta, covariance)); +fg.add(BetweenFactorPose3(3,4, delta, covariance)); +fg.add(BetweenFactorPose3(4,5, delta, covariance)); +fg.add(BetweenFactorPose3(5,0, delta, covariance)); %% Create initial config -initial = pose3SLAM.Values; +initial = Values; s = 0.10; -initial.insertPose(0, p0); -initial.insertPose(1, hexagon.pose(1).retract(s*randn(6,1))); -initial.insertPose(2, hexagon.pose(2).retract(s*randn(6,1))); -initial.insertPose(3, hexagon.pose(3).retract(s*randn(6,1))); -initial.insertPose(4, hexagon.pose(4).retract(s*randn(6,1))); -initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); +initial.insert(0, p0); +initial.insert(1, hexagon.pose(1).retract(s*randn(6,1))); +initial.insert(2, hexagon.pose(2).retract(s*randn(6,1))); +initial.insert(3, hexagon.pose(3).retract(s*randn(6,1))); +initial.insert(4, hexagon.pose(4).retract(s*randn(6,1))); +initial.insert(5, hexagon.pose(5).retract(s*randn(6,1))); %% Plot Initial Estimate cla -T=initial.translations(); -plot3(T(:,1),T(:,2),T(:,3),'g-*'); +plot3DTrajectory(initial, 'g-*'); %% optimize -result = fg.optimize(initial,1); +optimizer = DoglegOptimizer(fg, initial); +result = optimizer.optimizeSafely(); %% Show Result -hold on; plot3DTrajectory(result,'b-*', true, 0.3); +hold on; plot3DTrajectory(result, 'b-*', true, 0.3); axis([-2 2 -2 2 -1 1]); axis equal view(-37,40) diff --git a/matlab/examples/Pose3SLAMExample_graph.m b/matlab/examples/Pose3SLAMExample_graph.m index cace357ae..b6a5444a2 100644 --- a/matlab/examples/Pose3SLAMExample_graph.m +++ b/matlab/examples/Pose3SLAMExample_graph.m @@ -10,23 +10,31 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Find data file N = 2500; -% filename = '../../examples/Data/sphere_smallnoise.graph'; -% filename = '../../examples/Data/sphere2500_groundtruth.txt'; -filename = '../../examples/Data/sphere2500.txt'; +% dataset = 'sphere_smallnoise.graph'; +% dataset = 'sphere2500_groundtruth.txt'; +dataset = 'sphere2500.txt'; + +datafile = findExampleDataFile(dataset); %% Initialize graph, initial estimate, and odometry noise -model = gtsam.noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -[graph,initial]=load3D(filename,model,true,N); +import gtsam.* +model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); +[graph,initial]=load3D(datafile,model,true,N); %% Plot Initial Estimate -figure(1);clf -first = initial.pose(0); +cla +first = initial.at(0); plot3(first.x(),first.y(),first.z(),'r*'); hold on plot3DTrajectory(initial,'g-',false); %% Read again, now with all constraints, and optimize -graph = load3D(filename,model,false,N); -graph.addPoseConstraint(0, first); -result = graph.optimize(initial); -plot3DTrajectory(result,'r-',false); axis equal; +import gtsam.* +graph = load3D(datafile, model, false, N); +graph.add(NonlinearEqualityPose3(0, first)); +optimizer = DoglegOptimizer(graph, initial); +result = optimizer.optimizeSafely(); +plot3DTrajectory(result, 'r-', false); axis equal; + +view(0); axis equal; \ No newline at end of file diff --git a/matlab/examples/gtsamExamples.fig b/matlab/examples/gtsamExamples.fig index be72daf9c4674e0533e2c13c720f7edb58c385cf..d0037027882c4ee90461dea6d8bd52368f58de0a 100644 GIT binary patch literal 10455 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 literal 9270 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 Obf{sn$7Pzb-~R)BkGysO diff --git a/matlab/examples/gtsamExamples.m b/matlab/examples/gtsamExamples.m index b3862088a..014885eea 100644 --- a/matlab/examples/gtsamExamples.m +++ b/matlab/examples/gtsamExamples.m @@ -22,7 +22,7 @@ function varargout = gtsamExamples(varargin) % Edit the above text to modify the response to help gtsamExamples -% Last Modified by GUIDE v2.5 13-Jun-2012 08:13:23 +% Last Modified by GUIDE v2.5 23-Jul-2012 13:12:19 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -104,6 +104,20 @@ echo on Pose2SLAMExample echo off +% --- Executes on button press in Pose2SLAMCircle. +function Pose2SLAMCircle_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +Pose2SLAMExample_circle +echo off + +% --- Executes on button press in Pose2SLAMManhattan. +function Pose2SLAMManhattan_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +Pose2SLAMExample_graph +echo off + % --- Executes on button press in Pose3SLAM. function Pose3SLAM_Callback(hObject, eventdata, handles) axes(handles.axes3); @@ -111,6 +125,13 @@ echo on Pose3SLAMExample echo off +% --- Executes on button press in Pose3SLAMSphere. +function Pose3SLAMSphere_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +Pose3SLAMExample_graph +echo off + % --- Executes on button press in PlanarSLAM. function PlanarSLAM_Callback(hObject, eventdata, handles) axes(handles.axes3); @@ -118,6 +139,13 @@ echo on PlanarSLAMExample echo off +% --- Executes on button press in PlanarSLAMSampling. +function PlanarSLAMSampling_Callback(hObject, eventdata, handles) +axes(handles.axes3); +echo on +PlanarSLAMExample_sampling +echo off + % --- Executes on button press in SFM. function SFM_Callback(hObject, eventdata, handles) axes(handles.axes3); @@ -138,7 +166,3 @@ axes(handles.axes3); echo on StereoVOExample echo off - -% --- Executes on button press in Future. -function Future_Callback(hObject, eventdata, handles) -fprintf(1,'Future demo not implemented yet :-)\n'); From ec07bf400bd717db12af7be97a94eb6ac75b3d02 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 19:21:08 +0000 Subject: [PATCH 678/914] In wrap tests, read file in text mode to translate line endings --- wrap/utilities.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 6eb47c55d..9c5d93c76 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -29,7 +29,7 @@ using namespace std; /* ************************************************************************* */ string file_contents(const string& filename, bool skipheader) { - ifstream ifs(filename.c_str(), ios::binary); // Do not do LF/CRLF translation - we always write in binary mode too + ifstream ifs(filename.c_str()); if(!ifs) throw CantOpenFile(filename); // read file into stringstream From c32d1c7e027f4b6dc7505fd6fe3de26a49e09481 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 19:29:52 +0000 Subject: [PATCH 679/914] Fixed dimensions bug in Marginals and added unit test --- gtsam/inference/GenericSequentialSolver-inl.h | 2 +- gtsam/nonlinear/Marginals.cpp | 13 +++-- tests/testMarginals.cpp | 55 +++++++++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/gtsam/inference/GenericSequentialSolver-inl.h b/gtsam/inference/GenericSequentialSolver-inl.h index 53dee3dcd..368aae831 100644 --- a/gtsam/inference/GenericSequentialSolver-inl.h +++ b/gtsam/inference/GenericSequentialSolver-inl.h @@ -88,7 +88,7 @@ namespace gtsam { GenericSequentialSolver::jointFactorGraph( const std::vector& js, Eliminate function) const { - // Compute a COLAMD permutation with the marginal variable constrained to the end. + // Compute a COLAMD permutation with the marginal variables constrained to the end. Permutation::shared_ptr permutation(inference::PermutationCOLAMD(*structure_, js)); Permutation::shared_ptr permutationInverse(permutation->inverse()); diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index f7f1aa00f..52c507374 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -110,11 +110,11 @@ JointMarginal Marginals::jointMarginalInformation(const std::vector& variab return JointMarginal(info, dims, indices); } else { - // Convert keys to linear indices + // Obtain requested variables as ordered indices vector indices(variables.size()); for(size_t i=0; i& variab jointFG = *GaussianSequentialSolver(graph_, true).jointFactorGraph(indices); } - // Conversion from variable keys to position in factor graph variables, + // Build map from variable keys to position in factor graph variables, // which are sorted in index order. Ordering variableConversion; { + // First build map from index to key FastMap usedIndices; for(size_t i=0; i Index_Key; BOOST_FOREACH(const Index_Key& index_key, usedIndices) { @@ -145,8 +147,9 @@ JointMarginal Marginals::jointMarginalInformation(const std::vector& variab // Get dimensions from factor graph std::vector dims(indices.size(), 0); - for(size_t i = 0; i < variables.size(); ++i) - dims[i] = values_.at(variables[i]).dim(); + BOOST_FOREACH(Key key, variables) { + dims[variableConversion[key]] = values_.at(key).dim(); + } // Get information matrix Matrix augmentedInfo = jointFG.denseHessian(); diff --git a/tests/testMarginals.cpp b/tests/testMarginals.cpp index da7157a1e..c9bd43b27 100644 --- a/tests/testMarginals.cpp +++ b/tests/testMarginals.cpp @@ -180,7 +180,62 @@ TEST(Marginals, planarSLAMmarginals) { EXPECT(assert_equal(expectedx1, Matrix(joint_l2x1(x1,x1)), 1e-6)); } +/* ************************************************************************* */ +TEST(Marginals, order) { + NonlinearFactorGraph fg; + fg.add(PriorFactor(0, Pose2(), noiseModel::Unit::Create(3))); + fg.add(BetweenFactor(0, 1, Pose2(1,0,0), noiseModel::Unit::Create(3))); + fg.add(BetweenFactor(1, 2, Pose2(1,0,0), noiseModel::Unit::Create(3))); + fg.add(BetweenFactor(2, 3, Pose2(1,0,0), noiseModel::Unit::Create(3))); + Values vals; + vals.insert(0, Pose2()); + vals.insert(1, Pose2(1,0,0)); + vals.insert(2, Pose2(2,0,0)); + vals.insert(3, Pose2(3,0,0)); + + vals.insert(100, Point2(0,1)); + vals.insert(101, Point2(1,1)); + + fg.add(BearingRangeFactor(0, 100, + vals.at(0).bearing(vals.at(100)), + vals.at(0).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(0, 101, + vals.at(0).bearing(vals.at(101)), + vals.at(0).range(vals.at(101)), noiseModel::Unit::Create(2))); + + fg.add(BearingRangeFactor(1, 100, + vals.at(1).bearing(vals.at(100)), + vals.at(1).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(1, 101, + vals.at(1).bearing(vals.at(101)), + vals.at(1).range(vals.at(101)), noiseModel::Unit::Create(2))); + + fg.add(BearingRangeFactor(2, 100, + vals.at(2).bearing(vals.at(100)), + vals.at(2).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(2, 101, + vals.at(2).bearing(vals.at(101)), + vals.at(2).range(vals.at(101)), noiseModel::Unit::Create(2))); + + fg.add(BearingRangeFactor(3, 100, + vals.at(3).bearing(vals.at(100)), + vals.at(3).range(vals.at(100)), noiseModel::Unit::Create(2))); + fg.add(BearingRangeFactor(3, 101, + vals.at(3).bearing(vals.at(101)), + vals.at(3).range(vals.at(101)), noiseModel::Unit::Create(2))); + + Marginals marginals(fg, vals); + FastVector keys(fg.keys()); + JointMarginal joint = marginals.jointMarginalCovariance(keys); + + LONGS_EQUAL(3, joint(0,0).rows()); + LONGS_EQUAL(3, joint(1,1).rows()); + LONGS_EQUAL(3, joint(2,2).rows()); + LONGS_EQUAL(3, joint(3,3).rows()); + LONGS_EQUAL(2, joint(100,100).rows()); + LONGS_EQUAL(2, joint(101,101).rows()); +} /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr);} From 065b7ee1e6dff19eaf2a6be2cc7e8a6d42f9913c Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 19:29:57 +0000 Subject: [PATCH 680/914] In wrap tests, read file in text mode to translate line endings --- wrap/utilities.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 52ed3c750..973778d71 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -30,7 +30,7 @@ using namespace std; /* ************************************************************************* */ string file_contents(const string& filename, bool skipheader) { - ifstream ifs(filename.c_str(), ios::binary); // Do not do LF/CRLF translation - we always write in binary mode too + ifstream ifs(filename.c_str()); if(!ifs) throw CantOpenFile(filename); // read file into stringstream From 87d1e0a488603d8b1d87965fd63991c8222f5afc Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 21:27:36 +0000 Subject: [PATCH 681/914] Added 'This' keyword in wrap templates to substitute instantiated class --- gtsam.h | 3 +++ wrap/Class.cpp | 32 ++++++++++++++++++--------- wrap/Class.h | 2 +- wrap/TemplateInstantiationTypedef.cpp | 2 +- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/gtsam.h b/gtsam.h index b13bcb092..4e1437f06 100644 --- a/gtsam.h +++ b/gtsam.h @@ -66,6 +66,9 @@ * or with typedefs, e.g. * template class Class2 { ... }; * typedef Class2 MyInstantiatedClass; + * - In the class definition, appearances of the template argument(s) will be replaced with their + * instantiated types, e.g. 'void setValue(const T& value);'. + * - To refer to the instantiation of the template class itself, use 'This', i.e. 'static This Create();' * - To create new instantiations in other modules, you must copy-and-paste the whole class definition * into the new module, but use only your new instantiation types. * - When forward-declaring template instantiations, use the generated/typedefed name, e.g. diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 00fdba011..c1fac2c0b 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -217,7 +217,7 @@ void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wra } /* ************************************************************************* */ -vector expandArgumentListsTemplate(const vector& argLists, const string& templateArg, const vector& instName) { +vector expandArgumentListsTemplate(const vector& argLists, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { vector result; BOOST_FOREACH(const ArgumentList& argList, argLists) { ArgumentList instArgList; @@ -226,6 +226,9 @@ vector expandArgumentListsTemplate(const vector& arg if(arg.type == templateArg) { instArg.namespaces.assign(instName.begin(), instName.end()-1); instArg.type = instName.back(); + } else if(arg.type == "This") { + instArg.namespaces.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); + instArg.type = expandedClassName; } instArgList.push_back(instArg); } @@ -236,23 +239,29 @@ vector expandArgumentListsTemplate(const vector& arg /* ************************************************************************* */ template -map expandMethodTemplate(const map& methods, const string& templateArg, const vector& instName) { +map expandMethodTemplate(const map& methods, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { map result; typedef pair Name_Method; BOOST_FOREACH(const Name_Method& name_method, methods) { const METHOD& method = name_method.second; METHOD instMethod = method; - instMethod.argLists = expandArgumentListsTemplate(method.argLists, templateArg, instName); + instMethod.argLists = expandArgumentListsTemplate(method.argLists, templateArg, instName, expandedClassNamespace, expandedClassName); instMethod.returnVals.clear(); BOOST_FOREACH(const ReturnValue& retVal, method.returnVals) { ReturnValue instRetVal = retVal; if(retVal.type1 == templateArg) { instRetVal.namespaces1.assign(instName.begin(), instName.end()-1); instRetVal.type1 = instName.back(); + } else if(retVal.type1 == "This") { + instRetVal.namespaces1.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); + instRetVal.type1 = expandedClassName; } if(retVal.type2 == templateArg) { instRetVal.namespaces2.assign(instName.begin(), instName.end()-1); instRetVal.type2 = instName.back(); + } else if(retVal.type1 == "This") { + instRetVal.namespaces2.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); + instRetVal.type2 = expandedClassName; } instMethod.returnVals.push_back(instRetVal); } @@ -262,18 +271,18 @@ map expandMethodTemplate(const map& methods, con } /* ************************************************************************* */ -Class expandClassTemplate(const Class& cls, const string& templateArg, const vector& instName) { +Class expandClassTemplate(const Class& cls, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { Class inst; inst.name = cls.name; inst.templateArgs = cls.templateArgs; inst.typedefName = cls.typedefName; inst.isVirtual = cls.isVirtual; inst.qualifiedParent = cls.qualifiedParent; - inst.methods = expandMethodTemplate(cls.methods, templateArg, instName); - inst.static_methods = expandMethodTemplate(cls.static_methods, templateArg, instName); + inst.methods = expandMethodTemplate(cls.methods, templateArg, instName, expandedClassNamespace, expandedClassName); + inst.static_methods = expandMethodTemplate(cls.static_methods, templateArg, instName, expandedClassNamespace, expandedClassName); inst.namespaces = cls.namespaces; inst.constructor = cls.constructor; - inst.constructor.args_list = expandArgumentListsTemplate(cls.constructor.args_list, templateArg, instName); + inst.constructor.args_list = expandArgumentListsTemplate(cls.constructor.args_list, templateArg, instName, expandedClassNamespace, expandedClassName); inst.constructor.name = inst.name; inst.deconstructor = cls.deconstructor; inst.deconstructor.name = inst.name; @@ -285,8 +294,9 @@ Class expandClassTemplate(const Class& cls, const string& templateArg, const vec vector Class::expandTemplate(const string& templateArg, const vector >& instantiations) const { vector result; BOOST_FOREACH(const vector& instName, instantiations) { - Class inst = expandClassTemplate(*this, templateArg, instName); - inst.name = name + instName.back(); + const string expandedName = name + instName.back(); + Class inst = expandClassTemplate(*this, templateArg, instName, this->namespaces, expandedName); + inst.name = expandedName; inst.templateArgs.clear(); inst.typedefName = qualifiedName("::") + "<" + wrap::qualifiedName("::", instName) + ">"; result.push_back(inst); @@ -295,8 +305,8 @@ vector Class::expandTemplate(const string& templateArg, const vector& instantiation) const { - return expandClassTemplate(*this, templateArg, instantiation); +Class Class::expandTemplate(const string& templateArg, const vector& instantiation, const std::vector& expandedClassNamespace, const string& expandedClassName) const { + return expandClassTemplate(*this, templateArg, instantiation, expandedClassNamespace, expandedClassName); } /* ************************************************************************* */ diff --git a/wrap/Class.h b/wrap/Class.h index 2d10d691a..6b60f8219 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -57,7 +57,7 @@ struct Class { std::string qualifiedName(const std::string& delim = "") const; ///< creates a namespace-qualified name, optional delimiter std::vector expandTemplate(const std::string& templateArg, const std::vector >& instantiations) const; - Class expandTemplate(const std::string& templateArg, const std::vector& instantiation) const; + Class expandTemplate(const std::string& templateArg, const std::vector& instantiation, const std::vector& expandedClassNamespace, const std::string& expandedClassName) const; // The typedef line for this class, if this class is a typedef, otherwise returns an empty string. std::string getTypedef() const; diff --git a/wrap/TemplateInstantiationTypedef.cpp b/wrap/TemplateInstantiationTypedef.cpp index da1e8f616..b822f732b 100644 --- a/wrap/TemplateInstantiationTypedef.cpp +++ b/wrap/TemplateInstantiationTypedef.cpp @@ -42,7 +42,7 @@ namespace wrap { // Instantiate it Class classInst = *clsIt; for(size_t i = 0; i < typeList.size(); ++i) - classInst = classInst.expandTemplate(classInst.templateArgs[i], typeList[i]); + classInst = classInst.expandTemplate(classInst.templateArgs[i], typeList[i], namespaces, name); // Fix class properties classInst.name = name; From 0b08923c41a3f4fe1cae7f58e1df915c3fed05f3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 21:27:38 +0000 Subject: [PATCH 682/914] Generated code formatting fix --- wrap/StaticMethod.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 3def66b0f..61b54434c 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -131,8 +131,6 @@ string StaticMethod::wrapper_fragment(FileWriter& file, // unwrap arguments, see Argument.cpp args.matlab_unwrap(file,0); // We start at 0 because there is no self object - file.oss << " "; - // call method with default type and wrap result if (returnVal.type1!="void") returnVal.wrap_result(cppClassName+"::"+name+"("+args.names()+")", file, typeAttributes); From bcad0b661cbb676b85ab421787b1f1a51561e196 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 21:27:40 +0000 Subject: [PATCH 683/914] Added workaround for MSVC limitation on number of consecutive loops --- wrap/Module.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 8c564e92f..229a9810f 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -558,13 +558,15 @@ void Module::WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::st const string cppName = cls.qualifiedName("::"); const string collectorType = "Collector_" + matlabUniqueName; const string collectorName = "collector_" + matlabUniqueName; + // The extra curly-braces around the for loops work around a limitation in MSVC (existing + // since 2005!) preventing more than 248 blocks. wrapperFile.oss << - " for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n" + " { for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n" " iter != " << collectorName << ".end(); ) {\n" " delete *iter;\n" " " << collectorName << ".erase(iter++);\n" " anyDeleted = true;\n" - " }\n"; + " } }\n"; } wrapperFile.oss << " if(anyDeleted)\n" From cd69779754ee0bacc339ddb122be7ef11d7af296 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 21:27:42 +0000 Subject: [PATCH 684/914] Wrapped GeneralSFMFactor and added placeholders for Cal3DS2 once it has a 'calibrate' function --- gtsam.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 4e1437f06..af2dc3a3b 100644 --- a/gtsam.h +++ b/gtsam.h @@ -593,6 +593,43 @@ virtual class SimpleCamera : gtsam::Value { double range(const gtsam::Pose3& point); // FIXME, overload }; +// TODO: Add this back in when Cal3DS2 has a calibrate function +//template +//virtual class PinholeCamera : gtsam::Value { +// // Standard Constructors and Named Constructors +// PinholeCamera(); +// PinholeCamera(const gtsam::Pose3& pose); +// PinholeCamera(const gtsam::Pose3& pose, const gtsam::Cal3DS2& K); +// static This Level(const gtsam::Cal3DS2& K, +// const gtsam::Pose2& pose, double height); +// static This Level(const gtsam::Pose2& pose, double height); // FIXME overload +// static This Lookat(const gtsam::Point3& eye, +// const gtsam::Point3& target, const gtsam::Point3& upVector, +// const gtsam::Cal3DS2& K); +// +// // Testable +// void print(string s) const; +// bool equals(const This& camera, double tol) const; +// +// // Standard Interface +// gtsam::Pose3 pose() const; +// CALIBRATION calibration() const; +// +// // Manifold +// This retract(const Vector& d) const; +// Vector localCoordinates(const This& T2) const; +// size_t dim() const; +// static size_t Dim(); +// +// // Transformations and measurement functions +// static gtsam::Point2 project_to_camera(const gtsam::Point3& cameraPoint); +// pair projectSafe(const gtsam::Point3& pw) const; +// gtsam::Point2 project(const gtsam::Point3& point); +// gtsam::Point3 backproject(const gtsam::Point2& p, double depth) const; +// double range(const gtsam::Point3& point); +// double range(const gtsam::Pose3& point); // FIXME, overload +//}; + //************************************************************************* // inference //************************************************************************* @@ -1388,7 +1425,26 @@ virtual class GenericProjectionFactor : gtsam::NonlinearFactor { CALIBRATION* calibration() const; }; typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3_S2; -typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3DS2; +// FIXME: Add Cal3DS2 when it has a 'calibrate' function +//typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3DS2; + + +#include +template +virtual class GeneralSFMFactor : gtsam::NonlinearFactor { + GeneralSFMFactor(const gtsam::Point2& measured, const gtsam::noiseModel::Base* model, size_t cameraKey, size_t landmarkKey); + gtsam::Point2 measured() const; +}; +typedef gtsam::GeneralSFMFactor GeneralSFMFactorCal3_S2; +// FIXME: Add Cal3DS2 when it has a 'calibrate' function +//typedef gtsam::GeneralSFMFactor GeneralSFMFactorCal3DS2; + +// FIXME: Add Cal3DS2 when it has a 'calibrate' function +template +virtual class GeneralSFMFactor2 : gtsam::NonlinearFactor { + GeneralSFMFactor2(const gtsam::Point2& measured, const gtsam::noiseModel::Base* model, size_t poseKey, size_t landmarkKey, size_t calibKey); + gtsam::Point2 measured() const; +}; } //\namespace gtsam From 1db1663800943cc44e4069e89f8cf1bafcfd7f47 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 21:27:44 +0000 Subject: [PATCH 685/914] Updated MATLAB SBAExample --- matlab/examples/SBAExample.m | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/matlab/examples/SBAExample.m b/matlab/examples/SBAExample.m index a0f003eeb..9d5d22047 100644 --- a/matlab/examples/SBAExample.m +++ b/matlab/examples/SBAExample.m @@ -30,7 +30,8 @@ cameraNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1 ... 0.001*ones(1,5)]'; %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) -graph = sparseBA.Graph; +import gtsam.* +graph = NonlinearFactorGraph; %% Add factors for all measurements @@ -39,7 +40,7 @@ measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; - graph.addSimpleCameraMeasurement(data.Z{i}{k}, measurementNoise, symbol('c',i), symbol('p',j)); + graph.add(GeneralSFMFactorCal3_S2(data.Z{i}{k}, measurementNoise, symbol('c',i), symbol('p',j))); end end @@ -47,10 +48,10 @@ end import gtsam.* cameraPriorNoise = noiseModel.Diagonal.Sigmas(cameraNoiseSigmas); firstCamera = SimpleCamera(truth.cameras{1}.pose, truth.K); -graph.addSimpleCameraPrior(symbol('c',1), firstCamera, cameraPriorNoise); +graph.add(PriorFactorSimpleCamera(symbol('c',1), firstCamera, cameraPriorNoise)); pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); -graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); +graph.add(PriorFactorPoint3(symbol('p',1), truth.points{1}, pointPriorNoise)); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); @@ -58,15 +59,15 @@ graph.print(sprintf('\nFactor graph:\n')); %% Initialize cameras and points close to ground truth in this example import gtsam.* -initialEstimate = sparseBA.Values; +initialEstimate = Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); camera_i = SimpleCamera(pose_i, truth.K); - initialEstimate.insertSimpleCamera(symbol('c',i), camera_i); + initialEstimate.insert(symbol('c',i), camera_i); end for j=1:size(truth.points,2) point_j = truth.points{j}.retract(0.1*randn(3,1)); - initialEstimate.insertPoint(symbol('p',j), point_j); + initialEstimate.insert(symbol('p',j), point_j); end initialEstimate.print(sprintf('\nInitial estimate:\n ')); @@ -77,7 +78,7 @@ parameters = LevenbergMarquardtParams; parameters.setlambdaInitial(1.0); parameters.setVerbosityLM('trylambda'); -optimizer = graph.optimizer(initialEstimate, parameters); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate, parameters); for i=1:5 optimizer.iterate(); From a99595dda8608027319c7c82c4fb3014d077304d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 22:15:05 +0000 Subject: [PATCH 686/914] Updated some MATLAB utility plotting functions --- matlab/examples/PlanarSLAMExample.m | 2 +- matlab/examples/PlanarSLAMExample_sampling.m | 2 +- matlab/examples/Pose3SLAMExample_graph.m | 5 +++-- matlab/load3D.m | 16 +++++++++------- matlab/plot2DPoints.m | 9 ++++++--- matlab/plotPoint2.m | 7 +++---- 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/examples/PlanarSLAMExample.m index f82b3aea4..9b4600578 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/examples/PlanarSLAMExample.m @@ -73,7 +73,7 @@ cla;hold on marginals = Marginals(graph, result); plot2DTrajectory(result, [], marginals); -plot2DPoints(result, marginals); +plot2DPoints(result, [], marginals); plot([result.at(i1).x; result.at(j1).x],[result.at(i1).y; result.at(j1).y], 'c-'); plot([result.at(i2).x; result.at(j1).x],[result.at(i2).y; result.at(j1).y], 'c-'); diff --git a/matlab/examples/PlanarSLAMExample_sampling.m b/matlab/examples/PlanarSLAMExample_sampling.m index 35d3232a1..58686c362 100644 --- a/matlab/examples/PlanarSLAMExample_sampling.m +++ b/matlab/examples/PlanarSLAMExample_sampling.m @@ -51,7 +51,7 @@ cla;hold on marginals = Marginals(graph, sample); plot2DTrajectory(sample, [], marginals); -plot2DPoints(sample, marginals); +plot2DPoints(sample, [], marginals); for j=1:2 key = symbol('l',j); diff --git a/matlab/examples/Pose3SLAMExample_graph.m b/matlab/examples/Pose3SLAMExample_graph.m index b6a5444a2..6efb58199 100644 --- a/matlab/examples/Pose3SLAMExample_graph.m +++ b/matlab/examples/Pose3SLAMExample_graph.m @@ -28,13 +28,14 @@ cla first = initial.at(0); plot3(first.x(),first.y(),first.z(),'r*'); hold on plot3DTrajectory(initial,'g-',false); +drawnow; %% Read again, now with all constraints, and optimize import gtsam.* graph = load3D(datafile, model, false, N); graph.add(NonlinearEqualityPose3(0, first)); -optimizer = DoglegOptimizer(graph, initial); +optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely(); plot3DTrajectory(result, 'r-', false); axis equal; -view(0); axis equal; \ No newline at end of file +view(3); axis equal; \ No newline at end of file diff --git a/matlab/load3D.m b/matlab/load3D.m index 5c9d08146..c0ccd545f 100644 --- a/matlab/load3D.m +++ b/matlab/load3D.m @@ -3,6 +3,8 @@ function [graph,initial] = load3D(filename,model,successive,N) % cannot read noise model from file yet, uses specified model % if [successive] is tru, constructs initial estimate from odometry +import gtsam.* + if nargin<3, successive=false; end fid = fopen(filename); if fid < 0 @@ -15,10 +17,10 @@ fclose(fid); lines=columns{1}; % loop over lines and add vertices -graph = pose3SLAM.Graph; -initial = pose3SLAM.Values; +graph = NonlinearFactorGraph; +initial = Values; origin=gtsam.Pose3; -initial.insertPose(0,origin); +initial.insert(0,origin); n=size(lines,1); if nargin<4, N=n;end @@ -30,7 +32,7 @@ for i=1:n if (~successive && i1i1 - initial.insertPose(i2,initial.pose(i1).compose(dpose)); + initial.insert(i2,initial.at(i1).compose(dpose)); else - initial.insertPose(i1,initial.pose(i2).compose(dpose.inverse)); + initial.insert(i1,initial.at(i2).compose(dpose.inverse)); end end end diff --git a/matlab/plot2DPoints.m b/matlab/plot2DPoints.m index 0065b55c4..d03676699 100644 --- a/matlab/plot2DPoints.m +++ b/matlab/plot2DPoints.m @@ -1,4 +1,4 @@ -function plot2DPoints(values, marginals) +function plot2DPoints(values, linespec, marginals) %PLOT2DPOINTS Plots the Point2's in a values, with optional covariances % Finds all the Point2 objects in the given Values object and plots them. % If a Marginals object is given, this function will also plot marginal @@ -6,6 +6,9 @@ function plot2DPoints(values, marginals) import gtsam.* +if ~exist('linespec', 'var') || isempty(linespec) + linespec = 'g'; +end haveMarginals = exist('marginals', 'var'); keys = KeyVector(values.keys); @@ -19,9 +22,9 @@ for i = 0:keys.size-1 if isa(p, 'gtsam.Point2') if haveMarginals P = marginals.marginalCovariance(key); - plotPoint2(p, 'g', P); + plotPoint2(p, linespec, P); else - plotPoint2(p, 'g'); + plotPoint2(p, linespec); end end end diff --git a/matlab/plotPoint2.m b/matlab/plotPoint2.m index ae45455f6..fcc274d90 100644 --- a/matlab/plotPoint2.m +++ b/matlab/plotPoint2.m @@ -1,11 +1,10 @@ function plotPoint2(p,color,P) -% plotPose2: show a Pose2, possibly with covariance matrix +% plotPoint2: show a Point2, possibly with covariance matrix if size(color,2)==1 plot(p.x,p.y,[color '*']); else plot(p.x,p.y,color); end -if nargin>2 - pPp = P(1:2,1:2); % covariance matrix in pose coordinate frame - covarianceEllipse([p.x;p.y],pPp,color(1)); +if exist('P', 'var') + covarianceEllipse([p.x;p.y],P,color(1)); end \ No newline at end of file From da598b428d10fe905f1d5cafb6ba0651dba25768 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 23 Jul 2012 22:15:08 +0000 Subject: [PATCH 687/914] Updated matlab SFMExample --- matlab/examples/SFMExample.m | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 7c4baa75b..1416fb7e3 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -29,7 +29,8 @@ pointNoiseSigma = 0.1; poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) -graph = visualSLAM.Graph; +import gtsam.* +graph = NonlinearFactorGraph; %% Add factors for all measurements import gtsam.* @@ -37,29 +38,30 @@ measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; - graph.addMeasurement(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('p',j), data.K); + graph.add(GenericProjectionFactorCal3_S2(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('p',j), data.K)); end end %% Add Gaussian priors for a pose and a landmark to constrain the system import gtsam.* posePriorNoise = noiseModel.Diagonal.Sigmas(poseNoiseSigmas); -graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); +graph.add(PriorFactorPose3(symbol('x',1), truth.cameras{1}.pose, posePriorNoise)); pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); -graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); +graph.add(PriorFactorPoint3(symbol('p',1), truth.points{1}, pointPriorNoise)); %% Print the graph graph.print(sprintf('\nFactor graph:\n')); %% Initialize cameras and points close to ground truth in this example -initialEstimate = visualSLAM.Values; +import gtsam.* +initialEstimate = Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); - initialEstimate.insertPose(symbol('x',i), pose_i); + initialEstimate.insert(symbol('x',i), pose_i); end for j=1:size(truth.points,2) point_j = truth.points{j}.retract(0.1*randn(3,1)); - initialEstimate.insertPoint(symbol('p',j), point_j); + initialEstimate.insert(symbol('p',j), point_j); end initialEstimate.print(sprintf('\nInitial estimate:\n ')); @@ -70,7 +72,7 @@ parameters = LevenbergMarquardtParams; parameters.setlambdaInitial(1.0); parameters.setVerbosityLM('trylambda'); -optimizer = graph.optimizer(initialEstimate, parameters); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate, parameters); for i=1:5 optimizer.iterate(); @@ -79,21 +81,14 @@ result = optimizer.values(); result.print(sprintf('\nFinal result:\n ')); %% Plot results with covariance ellipses -marginals = graph.marginals(result); +import gtsam.* +marginals = Marginals(graph, result); cla hold on; -for j=1:result.nrPoints - P = marginals.marginalCovariance(symbol('p',j)); - point_j = result.point(symbol('p',j)); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); -end -for i=1:result.nrPoses - P = marginals.marginalCovariance(symbol('x',i)); - pose_i = result.pose(symbol('x',i)); - plotPose3(pose_i,P,10); -end +plot3DPoints(result, [], marginals); +plot3DTrajectory(result, '*', 1, 8, marginals); + axis([-40 40 -40 40 -10 20]);axis equal view(3) colormap('hot') From f56d9c18e5442d3fbe0b4b0d6679fdec284fe986 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:41:53 +0000 Subject: [PATCH 688/914] Removed SLAM namespace from testDoglegOptimizer --- tests/testDoglegOptimizer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index 9a4f6bf25..3c5409af7 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -15,14 +15,13 @@ * @author Richard Roberts */ -#include #include #include #include #include #include #include -#include +#include #include #include From 0863b4148dc1b6779859a4783f56a2527a69e521 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:42:42 +0000 Subject: [PATCH 689/914] Removed SLAM namespace from testGaussianISAM2 --- tests/testGaussianISAM2.cpp | 106 +++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 50 deletions(-) diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 2c932680d..67fa287d3 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -6,15 +6,21 @@ #include #include +#include +#include #include -#include #include #include #include #include +#include +#include +#include #include +#include +#include +#include #include -#include #include @@ -39,21 +45,21 @@ SharedDiagonal brNoise = noiseModel::Diagonal::Sigmas(Vector_(2, M_PI/100.0, 0.1 ISAM2 createSlamlikeISAM2( boost::optional init_values = boost::none, - boost::optional full_graph = boost::none, + boost::optional full_graph = boost::none, const ISAM2Params& params = ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, true)) { // These variables will be reused and accumulate factors and values ISAM2 isam(params); Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; // i keeps track of the time step size_t i = 0; // Add a prior at time 0 and update isam { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + NonlinearFactorGraph newfactors; + newfactors.add(PriorFactor(0, Pose2(0.0, 0.0, 0.0), odoNoise)); fullgraph.push_back(newfactors); Values init; @@ -65,8 +71,8 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 0 to time 5 for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); fullgraph.push_back(newfactors); Values init; @@ -78,10 +84,10 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 5 to 6 and landmark measurement at time 5 { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); + newfactors.add(BearingRangeFactor(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise)); + newfactors.add(BearingRangeFactor(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise)); fullgraph.push_back(newfactors); Values init; @@ -98,8 +104,8 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 6 to time 10 for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); fullgraph.push_back(newfactors); Values init; @@ -111,10 +117,10 @@ ISAM2 createSlamlikeISAM2( // Add odometry from time 10 to 11 and landmark measurement at time 10 { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); + newfactors.add(BearingRangeFactor(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); + newfactors.add(BearingRangeFactor(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); fullgraph.push_back(newfactors); Values init; @@ -298,8 +304,8 @@ TEST_UNSAFE(ISAM2, ImplRemoveVariables) { // typedef GaussianISAM2::Impl Impl; // // Ordering ordering; ordering += (0), (0), (1); -// planarSLAM::Graph graph; -// graph.addPosePrior((0), Pose2(), noiseModel::Unit::Create(Pose2::dimension)); +// NonlinearFactorGraph graph; +// graph.add(PriorFactor((0), Pose2(), noiseModel::Unit::Create(Pose2::dimension)); // graph.addRange((0), (0), 1.0, noiseModel::Unit::Create(1)); // // FastSet expected; @@ -378,7 +384,7 @@ TEST(ISAM2, optimize2) { } /* ************************************************************************* */ -bool isam_check(const planarSLAM::Graph& fullgraph, const Values& fullinit, const ISAM2& isam, Test& test, TestResult& result) { +bool isam_check(const NonlinearFactorGraph& fullgraph, const Values& fullinit, const ISAM2& isam, Test& test, TestResult& result) { TestResult& result_ = result; const std::string name_ = test.getName(); @@ -439,7 +445,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton) { // These variables will be reused and accumulate factors and values Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); // Compare solutions @@ -451,7 +457,7 @@ TEST(ISAM2, slamlike_solution_dogleg) { // These variables will be reused and accumulate factors and values Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false)); // Compare solutions @@ -463,7 +469,7 @@ TEST(ISAM2, slamlike_solution_gaussnewton_qr) { // These variables will be reused and accumulate factors and values Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false, false, ISAM2Params::QR)); // Compare solutions @@ -475,7 +481,7 @@ TEST(ISAM2, slamlike_solution_dogleg_qr) { // These variables will be reused and accumulate factors and values Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2DoglegParams(1.0), 0.0, 0, false, false, ISAM2Params::QR)); // Compare solutions @@ -584,13 +590,13 @@ TEST(ISAM2, removeFactors) // These variables will be reused and accumulate factors and values Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); // Remove the 2nd measurement on landmark 0 (Key 100) FastVector toRemove; toRemove.push_back(12); - isam.update(planarSLAM::Graph(), Values(), toRemove); + isam.update(NonlinearFactorGraph(), Values(), toRemove); // Remove the factor from the full system fullgraph.remove(12); @@ -604,14 +610,14 @@ TEST_UNSAFE(ISAM2, removeVariables) { // These variables will be reused and accumulate factors and values Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); // Remove the measurement on landmark 0 (Key 100) FastVector toRemove; toRemove.push_back(7); toRemove.push_back(14); - isam.update(planarSLAM::Graph(), Values(), toRemove); + isam.update(NonlinearFactorGraph(), Values(), toRemove); // Remove the factors and variable from the full system fullgraph.remove(7); @@ -629,7 +635,7 @@ TEST_UNSAFE(ISAM2, swapFactors) // then swaps the 2nd-to-last landmark measurement with a different one Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph); // Remove the measurement on landmark 0 and replace with a different one @@ -639,15 +645,15 @@ TEST_UNSAFE(ISAM2, swapFactors) toRemove.push_back(swap_idx); fullgraph.remove(swap_idx); - planarSLAM::Graph swapfactors; -// swapfactors.addBearingRange(10, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); // original factor - swapfactors.addBearingRange(10, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 5.0, brNoise); + NonlinearFactorGraph swapfactors; +// swapfactors.add(BearingRange(10, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); // original factor + swapfactors.add(BearingRangeFactor(10, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 5.0, brNoise)); fullgraph.push_back(swapfactors); isam.update(swapfactors, Values(), toRemove); } // Compare solutions - EXPECT(assert_equal(fullgraph, planarSLAM::Graph(isam.getFactorsUnsafe()))); + EXPECT(assert_equal(fullgraph, NonlinearFactorGraph(isam.getFactorsUnsafe()))); EXPECT(isam_check(fullgraph, fullinit, isam, *this, result_)); // Check gradient at each node @@ -685,7 +691,7 @@ TEST(ISAM2, constrained_ordering) // These variables will be reused and accumulate factors and values ISAM2 isam(ISAM2Params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false)); Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; // We will constrain x3 and x4 to the end FastMap constrained; @@ -697,8 +703,8 @@ TEST(ISAM2, constrained_ordering) // Add a prior at time 0 and update isam { - planarSLAM::Graph newfactors; - newfactors.addPosePrior(0, Pose2(0.0, 0.0, 0.0), odoNoise); + NonlinearFactorGraph newfactors; + newfactors.add(PriorFactor(0, Pose2(0.0, 0.0, 0.0), odoNoise)); fullgraph.push_back(newfactors); Values init; @@ -712,8 +718,8 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 0 to time 5 for( ; i<5; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); fullgraph.push_back(newfactors); Values init; @@ -728,10 +734,10 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 5 to 6 and landmark measurement at time 5 { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); + newfactors.add(BearingRangeFactor(i, 100, Rot2::fromAngle(M_PI/4.0), 5.0, brNoise)); + newfactors.add(BearingRangeFactor(i, 101, Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise)); fullgraph.push_back(newfactors); Values init; @@ -748,8 +754,8 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 6 to time 10 for( ; i<10; ++i) { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); fullgraph.push_back(newfactors); Values init; @@ -761,10 +767,10 @@ TEST(ISAM2, constrained_ordering) // Add odometry from time 10 to 11 and landmark measurement at time 10 { - planarSLAM::Graph newfactors; - newfactors.addRelativePose(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + NonlinearFactorGraph newfactors; + newfactors.add(BetweenFactor(i, i+1, Pose2(1.0, 0.0, 0.0), odoNoise)); + newfactors.add(BearingRangeFactor(i, 100, Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); + newfactors.add(BearingRangeFactor(i, 101, Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); fullgraph.push_back(newfactors); Values init; @@ -816,7 +822,7 @@ TEST(ISAM2, slamlike_solution_partial_relinearization_check) // These variables will be reused and accumulate factors and values Values fullinit; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph fullgraph; ISAM2Params params(ISAM2GaussNewtonParams(0.001), 0.0, 0, false); params.enablePartialRelinearizationCheck = true; ISAM2 isam = createSlamlikeISAM2(fullinit, fullgraph, params); From fb33b8a609d1ca81302d3cf6347d12fcc4eeee59 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:43:17 +0000 Subject: [PATCH 690/914] removed SLAM namespace from testGaussianJunctionTreeB --- tests/testGaussianJunctionTreeB.cpp | 48 ++++++++++++++++------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/tests/testGaussianJunctionTreeB.cpp b/tests/testGaussianJunctionTreeB.cpp index 883011da2..422e52377 100644 --- a/tests/testGaussianJunctionTreeB.cpp +++ b/tests/testGaussianJunctionTreeB.cpp @@ -16,14 +16,18 @@ */ #include -#include -#include +#include +#include +#include +#include +#include #include #include #include #include #include -#include +#include +#include #include #include #include @@ -128,29 +132,29 @@ TEST( GaussianJunctionTreeB, optimizeMultiFrontal2) /* ************************************************************************* */ TEST(GaussianJunctionTreeB, slamlike) { Values init; - planarSLAM::Graph newfactors; - planarSLAM::Graph fullgraph; + NonlinearFactorGraph newfactors; + NonlinearFactorGraph fullgraph; SharedDiagonal odoNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); SharedDiagonal brNoise = noiseModel::Diagonal::Sigmas(Vector_(2, M_PI/100.0, 0.1)); size_t i = 0; - newfactors = planarSLAM::Graph(); - newfactors.addPosePrior(X(0), Pose2(0.0, 0.0, 0.0), odoNoise); + newfactors = NonlinearFactorGraph(); + newfactors.add(PriorFactor(X(0), Pose2(0.0, 0.0, 0.0), odoNoise)); init.insert(X(0), Pose2(0.01, 0.01, 0.01)); fullgraph.push_back(newfactors); for( ; i<5; ++i) { - newfactors = planarSLAM::Graph(); - newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors = NonlinearFactorGraph(); + newfactors.add(BetweenFactor(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } - newfactors = planarSLAM::Graph(); - newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(X(i), L(0), Rot2::fromAngle(M_PI/4.0), 5.0, brNoise); - newfactors.addBearingRange(X(i), L(1), Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise); + newfactors = NonlinearFactorGraph(); + newfactors.add(BetweenFactor(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); + newfactors.add(BearingRangeFactor(X(i), L(0), Rot2::fromAngle(M_PI/4.0), 5.0, brNoise)); + newfactors.add(BearingRangeFactor(X(i), L(1), Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise)); init.insert(X(i+1), Pose2(1.01, 0.01, 0.01)); init.insert(L(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); init.insert(L(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); @@ -158,16 +162,16 @@ TEST(GaussianJunctionTreeB, slamlike) { ++ i; for( ; i<5; ++i) { - newfactors = planarSLAM::Graph(); - newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); + newfactors = NonlinearFactorGraph(); + newfactors.add(BetweenFactor(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); fullgraph.push_back(newfactors); } - newfactors = planarSLAM::Graph(); - newfactors.addRelativePose(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise); - newfactors.addBearingRange(X(i), L(0), Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise); - newfactors.addBearingRange(X(i), L(1), Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise); + newfactors = NonlinearFactorGraph(); + newfactors.add(BetweenFactor(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); + newfactors.add(BearingRangeFactor(X(i), L(0), Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); + newfactors.add(BearingRangeFactor(X(i), L(1), Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); init.insert(X(i+1), Pose2(6.9, 0.1, 0.01)); fullgraph.push_back(newfactors); ++ i; @@ -193,9 +197,9 @@ TEST(GaussianJunctionTreeB, simpleMarginal) { typedef BayesTree GaussianBayesTree; // Create a simple graph - pose2SLAM::Graph fg; - fg.addPosePrior(X(0), Pose2(), noiseModel::Isotropic::Sigma(3, 10.0)); - fg.addRelativePose(X(0), X(1), Pose2(1.0, 0.0, 0.0), noiseModel::Diagonal::Sigmas(Vector_(3, 10.0, 1.0, 1.0))); + NonlinearFactorGraph fg; + fg.add(PriorFactor(X(0), Pose2(), noiseModel::Isotropic::Sigma(3, 10.0))); + fg.add(BetweenFactor(X(0), X(1), Pose2(1.0, 0.0, 0.0), noiseModel::Diagonal::Sigmas(Vector_(3, 10.0, 1.0, 1.0)))); Values init; init.insert(X(0), Pose2()); From a641f599f67e3c7ae635c335ea15e3eed7693a9c Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:44:02 +0000 Subject: [PATCH 691/914] Removed SLAM namespace from testGradientDescentOptimizer --- tests/testGradientDescentOptimizer.cpp | 46 ++++++++++++++------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index fefa2a05f..c72c6f716 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -5,8 +5,12 @@ * @date Jun 11, 2012 */ -#include +#include +#include #include +#include +#include +#include #include @@ -19,34 +23,34 @@ using namespace std; using namespace gtsam; -boost::tuple generateProblem() { +boost::tuple generateProblem() { // 1. Create graph container and add factors to it - pose2SLAM::Graph graph ; + NonlinearFactorGraph graph ; // 2a. Add Gaussian prior Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.addPosePrior(1, priorMean, priorNoise); + graph.add(PriorFactor(1, priorMean, priorNoise)); // 2b. Add odometry factors SharedDiagonal odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); - graph.addRelativePose(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addRelativePose(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); - graph.addRelativePose(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); + graph.add(BetweenFactor(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise)); + graph.add(BetweenFactor(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); // 2c. Add pose constraint SharedDiagonal constraintUncertainty = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.addRelativePose(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty); + graph.add(BetweenFactor(5, 2, Pose2(2.0, 0.0, M_PI_2), constraintUncertainty)); // 3. Create the data structure to hold the initialEstimate estinmate to the solution - pose2SLAM::Values initialEstimate; - Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insertPose(1, x1); - Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insertPose(2, x2); - Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insertPose(3, x3); - Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insertPose(4, x4); - Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insertPose(5, x5); + Values initialEstimate; + Pose2 x1(0.5, 0.0, 0.2 ); initialEstimate.insert(1, x1); + Pose2 x2(2.3, 0.1,-0.2 ); initialEstimate.insert(2, x2); + Pose2 x3(4.1, 0.1, M_PI_2); initialEstimate.insert(3, x3); + Pose2 x4(4.0, 2.0, M_PI ); initialEstimate.insert(4, x4); + Pose2 x5(2.1, 2.1,-M_PI_2); initialEstimate.insert(5, x5); return boost::tie(graph, initialEstimate); } @@ -55,8 +59,8 @@ boost::tuple generateProblem() { /* ************************************************************************* */ TEST(optimize, GradientDescentOptimizer) { - pose2SLAM::Graph graph ; - pose2SLAM::Values initialEstimate; + NonlinearFactorGraph graph; + Values initialEstimate; boost::tie(graph, initialEstimate) = generateProblem(); // cout << "initial error = " << graph.error(initialEstimate) << endl ; @@ -79,8 +83,8 @@ TEST(optimize, GradientDescentOptimizer) { /* ************************************************************************* */ TEST(optimize, ConjugateGradientOptimizer) { - pose2SLAM::Graph graph ; - pose2SLAM::Values initialEstimate; + NonlinearFactorGraph graph; + Values initialEstimate; boost::tie(graph, initialEstimate) = generateProblem(); // cout << "initial error = " << graph.error(initialEstimate) << endl ; @@ -102,8 +106,8 @@ TEST(optimize, ConjugateGradientOptimizer) { /* ************************************************************************* */ TEST(optimize, GradientDescentOptimizer2) { - pose2SLAM::Graph graph ; - pose2SLAM::Values initialEstimate; + NonlinearFactorGraph graph; + Values initialEstimate; boost::tie(graph, initialEstimate) = generateProblem(); // cout << "initial error = " << graph.error(initialEstimate) << endl ; From 2de44904adf3c2f864d9114367d820f5161a484a Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:45:07 +0000 Subject: [PATCH 692/914] Removed SLAM namespace from testGraph --- gtsam/inference/graph.h | 2 ++ tests/testGraph.cpp | 17 +++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/gtsam/inference/graph.h b/gtsam/inference/graph.h index 98d41940b..88ab5d0e8 100644 --- a/gtsam/inference/graph.h +++ b/gtsam/inference/graph.h @@ -108,3 +108,5 @@ namespace gtsam { } // namespace gtsam + +#include diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index 5f99d60c6..93ecd6dbe 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -16,8 +16,10 @@ * @brief unit test for graph-inl.h */ -#include -#include +#include +#include +#include +#include #include @@ -75,13 +77,13 @@ TEST( Graph, predecessorMap2Graph ) /* ************************************************************************* */ TEST( Graph, composePoses ) { - pose2SLAM::Graph graph; + NonlinearFactorGraph graph; SharedNoiseModel cov = noiseModel::Unit::Create(3); Pose2 p1(1.0, 2.0, 0.3), p2(4.0, 5.0, 0.6), p3(7.0, 8.0, 0.9), p4(2.0, 2.0, 2.9); Pose2 p12=p1.between(p2), p23=p2.between(p3), p43=p4.between(p3); - graph.addRelativePose(1,2, p12, cov); - graph.addRelativePose(2,3, p23, cov); - graph.addRelativePose(4,3, p43, cov); + graph.add(BetweenFactor(1,2, p12, cov)); + graph.add(BetweenFactor(2,3, p23, cov)); + graph.add(BetweenFactor(4,3, p43, cov)); PredecessorMap tree; tree.insert(1,2); @@ -91,8 +93,7 @@ TEST( Graph, composePoses ) Pose2 rootPose = p2; - boost::shared_ptr actual = composePoses (graph, tree, rootPose); + boost::shared_ptr actual = composePoses, Pose2, Key> (graph, tree, rootPose); Values expected; expected.insert(1, p1); From 0e6762e5c9eae8269783a5753cecf0f2a6b3309a Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:45:46 +0000 Subject: [PATCH 693/914] Removed SLAM namespace from testInferenceB --- tests/testInferenceB.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/tests/testInferenceB.cpp b/tests/testInferenceB.cpp index 3e68780c4..9b8127473 100644 --- a/tests/testInferenceB.cpp +++ b/tests/testInferenceB.cpp @@ -17,10 +17,17 @@ #include +#include +#include +#include +#include +#include #include #include #include -#include +#include +#include +#include #include @@ -54,16 +61,16 @@ TEST( inference, marginals ) /* ************************************************************************* */ TEST( inference, marginals2) { - planarSLAM::Graph fg; + NonlinearFactorGraph fg; SharedDiagonal poseModel(noiseModel::Isotropic::Sigma(3, 0.1)); SharedDiagonal pointModel(noiseModel::Isotropic::Sigma(3, 0.1)); - fg.addPosePrior(X(0), Pose2(), poseModel); - fg.addRelativePose(X(0), X(1), Pose2(1.0,0.0,0.0), poseModel); - fg.addRelativePose(X(1), X(2), Pose2(1.0,0.0,0.0), poseModel); - fg.addBearingRange(X(0), L(0), Rot2(), 1.0, pointModel); - fg.addBearingRange(X(1), L(0), Rot2(), 1.0, pointModel); - fg.addBearingRange(X(2), L(0), Rot2(), 1.0, pointModel); + fg.add(PriorFactor(X(0), Pose2(), poseModel)); + fg.add(BetweenFactor(X(0), X(1), Pose2(1.0,0.0,0.0), poseModel)); + fg.add(BetweenFactor(X(1), X(2), Pose2(1.0,0.0,0.0), poseModel)); + fg.add(BearingRangeFactor(X(0), L(0), Rot2(), 1.0, pointModel)); + fg.add(BearingRangeFactor(X(1), L(0), Rot2(), 1.0, pointModel)); + fg.add(BearingRangeFactor(X(2), L(0), Rot2(), 1.0, pointModel)); Values init; init.insert(X(0), Pose2(0.0,0.0,0.0)); From c8f3356af5698ad5dbf0fdc9cef482960ef81dec Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:46:21 +0000 Subject: [PATCH 694/914] Removed SLAM namespace from testNonlinearEquality --- tests/testNonlinearEquality.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/testNonlinearEquality.cpp b/tests/testNonlinearEquality.cpp index 1efc40cad..2b580560f 100644 --- a/tests/testNonlinearEquality.cpp +++ b/tests/testNonlinearEquality.cpp @@ -17,12 +17,17 @@ #include #include -#include +#include #include #include #include #include +#include #include +#include +#include +#include +#include #include @@ -510,7 +515,7 @@ static Cal3_S2 K(fov,w,h); static boost::shared_ptr shK(new Cal3_S2(K)); // typedefs for visual SLAM example -typedef visualSLAM::Graph VGraph; +typedef NonlinearFactorGraph VGraph; // factors for visual slam typedef NonlinearEquality2 Point3Equality; @@ -537,13 +542,13 @@ TEST (testNonlinearEqualityConstraint, stereo_constrained ) { VGraph graph; // create equality constraints for poses - graph.addPoseConstraint(x1, camera1.pose()); - graph.addPoseConstraint(x2, camera2.pose()); + graph.add(NonlinearEquality(x1, camera1.pose())); + graph.add(NonlinearEquality(x2, camera2.pose())); // create factors SharedDiagonal vmodel = noiseModel::Unit::Create(3); - graph.addMeasurement(camera1.project(landmark), vmodel, x1, l1, shK); - graph.addMeasurement(camera2.project(landmark), vmodel, x2, l2, shK); + graph.add(GenericProjectionFactor(camera1.project(landmark), vmodel, x1, l1, shK)); + graph.add(GenericProjectionFactor(camera2.project(landmark), vmodel, x2, l2, shK)); // add equality constraint graph.add(Point3Equality(l1, l2)); From 7a0030070c7008d3a6b81b3e486c7dd1e40bf7b3 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:46:55 +0000 Subject: [PATCH 695/914] Removed SLAM namespace from testNonlinearISAM --- tests/testNonlinearISAM.cpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/tests/testNonlinearISAM.cpp b/tests/testNonlinearISAM.cpp index 980ea8033..142fba7eb 100644 --- a/tests/testNonlinearISAM.cpp +++ b/tests/testNonlinearISAM.cpp @@ -5,13 +5,17 @@ #include -#include +#include +#include #include +#include +#include #include -#include +#include +#include + using namespace gtsam; -using namespace planarSLAM; typedef NonlinearISAM PlanarISAM; @@ -27,22 +31,22 @@ TEST(testNonlinearISAM, markov_chain ) { // create initial graph Pose2 cur_pose; // start at origin - Graph start_factors; - start_factors.addPoseConstraint(0, cur_pose); + NonlinearFactorGraph start_factors; + start_factors.add(NonlinearEquality(0, cur_pose)); - planarSLAM::Values init; - planarSLAM::Values expected; - init.insertPose(0, cur_pose); - expected.insertPose(0, cur_pose); + Values init; + Values expected; + init.insert(0, cur_pose); + expected.insert(0, cur_pose); isam.update(start_factors, init); // loop for a period of time to verify memory usage size_t nrPoses = 21; Pose2 z(1.0, 2.0, 0.1); for (size_t i=1; i<=nrPoses; ++i) { - Graph new_factors; - new_factors.addRelativePose(i-1, i, z, model); - planarSLAM::Values new_init; + NonlinearFactorGraph new_factors; + new_factors.add(BetweenFactor(i-1, i, z, model)); + Values new_init; // perform a check on changing orderings if (i == 5) { @@ -60,15 +64,15 @@ TEST(testNonlinearISAM, markov_chain ) { } cur_pose = cur_pose.compose(z); - new_init.insertPose(i, cur_pose.retract(sampler.sample())); - expected.insertPose(i, cur_pose); + new_init.insert(i, cur_pose.retract(sampler.sample())); + expected.insert(i, cur_pose); isam.update(new_factors, new_init); } // verify values - all but the last one should be very close - planarSLAM::Values actual = isam.estimate(); + Values actual = isam.estimate(); for (size_t i=0; i(i), actual.at(i), tol)); } } From 01bcd9e9395ab346ff655a5be2ee9525e7cff51a Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:47:31 +0000 Subject: [PATCH 696/914] Removed SLAM namespace from testNonlinearOptimizer --- tests/testNonlinearOptimizer.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/testNonlinearOptimizer.cpp b/tests/testNonlinearOptimizer.cpp index eb7585420..cb5e8f482 100644 --- a/tests/testNonlinearOptimizer.cpp +++ b/tests/testNonlinearOptimizer.cpp @@ -16,7 +16,10 @@ */ #include -#include +#include +#include +#include +#include #include #include #include @@ -24,6 +27,7 @@ #include #include #include +#include #include #include @@ -174,9 +178,9 @@ TEST( NonlinearOptimizer, Factorization ) config.insert(X(1), Pose2(0.,0.,0.)); config.insert(X(2), Pose2(1.5,0.,0.)); - pose2SLAM::Graph graph; - graph.addPosePrior(X(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); - graph.addRelativePose(X(1),X(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); + NonlinearFactorGraph graph; + graph.add(PriorFactor(X(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10))); + graph.add(BetweenFactor(X(1),X(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1))); Ordering ordering; ordering.push_back(X(1)); From c2daf40c5df71258abb6f498af2ac37be044035f Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:50:21 +0000 Subject: [PATCH 697/914] Removed SLAM namespaces from testSerializationSLAM. Instead of testing each SLAM namespace individually, a single test was created that instanciates all variable-factor combinations. However, there is currently an issue with LieVector that should be resolved. --- tests/testSerializationSLAM.cpp | 525 +++++++++++++++++++++++++------- 1 file changed, 422 insertions(+), 103 deletions(-) diff --git a/tests/testSerializationSLAM.cpp b/tests/testSerializationSLAM.cpp index d9094111e..27f74c222 100644 --- a/tests/testSerializationSLAM.cpp +++ b/tests/testSerializationSLAM.cpp @@ -18,11 +18,31 @@ #include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include @@ -30,17 +50,70 @@ using namespace std; using namespace gtsam; using namespace gtsam::serializationTestHelpers; +// Creating as many permutations of factors as possible +typedef PriorFactor PriorFactorLieVector; +typedef PriorFactor PriorFactorLieMatrix; +typedef PriorFactor PriorFactorPoint2; +typedef PriorFactor PriorFactorStereoPoint2; +typedef PriorFactor PriorFactorPoint3; +typedef PriorFactor PriorFactorRot2; +typedef PriorFactor PriorFactorRot3; +typedef PriorFactor PriorFactorPose2; +typedef PriorFactor PriorFactorPose3; +typedef PriorFactor PriorFactorCal3_S2; +typedef PriorFactor PriorFactorCal3DS2; +typedef PriorFactor PriorFactorCalibratedCamera; +typedef PriorFactor PriorFactorSimpleCamera; + +typedef BetweenFactor BetweenFactorLieVector; +typedef BetweenFactor BetweenFactorLieMatrix; +typedef BetweenFactor BetweenFactorPoint2; +typedef BetweenFactor BetweenFactorPoint3; +typedef BetweenFactor BetweenFactorRot2; +typedef BetweenFactor BetweenFactorRot3; +typedef BetweenFactor BetweenFactorPose2; +typedef BetweenFactor BetweenFactorPose3; + +typedef NonlinearEquality NonlinearEqualityLieVector; +typedef NonlinearEquality NonlinearEqualityLieMatrix; +typedef NonlinearEquality NonlinearEqualityPoint2; +typedef NonlinearEquality NonlinearEqualityStereoPoint2; +typedef NonlinearEquality NonlinearEqualityPoint3; +typedef NonlinearEquality NonlinearEqualityRot2; +typedef NonlinearEquality NonlinearEqualityRot3; +typedef NonlinearEquality NonlinearEqualityPose2; +typedef NonlinearEquality NonlinearEqualityPose3; +typedef NonlinearEquality NonlinearEqualityCal3_S2; +typedef NonlinearEquality NonlinearEqualityCal3DS2; +typedef NonlinearEquality NonlinearEqualityCalibratedCamera; +typedef NonlinearEquality NonlinearEqualitySimpleCamera; + +typedef RangeFactor RangeFactorPosePoint2; +typedef RangeFactor RangeFactorPosePoint3; +typedef RangeFactor RangeFactorPose2; +typedef RangeFactor RangeFactorPose3; +typedef RangeFactor RangeFactorCalibratedCameraPoint; +typedef RangeFactor RangeFactorSimpleCameraPoint; +typedef RangeFactor RangeFactorCalibratedCamera; +typedef RangeFactor RangeFactorSimpleCamera; + +typedef BearingFactor BearingFactor2D; +typedef BearingFactor BearingFactor3D; + +typedef BearingRangeFactor BearingRangeFactor2D; +typedef BearingRangeFactor BearingRangeFactor3D; + +typedef GenericProjectionFactor GenericProjectionFactorCal3_S2; +typedef GenericProjectionFactor GenericProjectionFactorCal3DS2; + + // Convenience for named keys using symbol_shorthand::X; using symbol_shorthand::L; -/* Create GUIDs for factors */ -/* ************************************************************************* */ -BOOST_CLASS_EXPORT_GUID(gtsam::JacobianFactor, "gtsam::JacobianFactor"); -BOOST_CLASS_EXPORT_GUID(gtsam::HessianFactor , "gtsam::HessianFactor"); +/* Create GUIDs for Noisemodels */ /* ************************************************************************* */ -// Export Noisemodels BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Constrained, "gtsam_noiseModel_Constrained"); BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Diagonal, "gtsam_noiseModel_Diagonal"); BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Gaussian, "gtsam_noiseModel_Gaussian"); @@ -50,6 +123,82 @@ BOOST_CLASS_EXPORT_GUID(gtsam::noiseModel::Isotropic, "gtsam_noiseModel_Isotropi BOOST_CLASS_EXPORT_GUID(gtsam::SharedNoiseModel, "gtsam_SharedNoiseModel"); BOOST_CLASS_EXPORT_GUID(gtsam::SharedDiagonal, "gtsam_SharedDiagonal"); +/* Create GUIDs for geometry */ +/* ************************************************************************* */ +BOOST_CLASS_EXPORT(gtsam::LieVector); +BOOST_CLASS_EXPORT(gtsam::LieMatrix); +BOOST_CLASS_EXPORT(gtsam::Point2); +BOOST_CLASS_EXPORT(gtsam::StereoPoint2); +BOOST_CLASS_EXPORT(gtsam::Point3); +BOOST_CLASS_EXPORT(gtsam::Rot2); +BOOST_CLASS_EXPORT(gtsam::Rot3); +BOOST_CLASS_EXPORT(gtsam::Pose2); +BOOST_CLASS_EXPORT(gtsam::Pose3); +BOOST_CLASS_EXPORT(gtsam::Cal3_S2); +BOOST_CLASS_EXPORT(gtsam::Cal3DS2); +BOOST_CLASS_EXPORT(gtsam::CalibratedCamera); +BOOST_CLASS_EXPORT(gtsam::SimpleCamera); + + +/* Create GUIDs for factors */ +/* ************************************************************************* */ +BOOST_CLASS_EXPORT_GUID(gtsam::JacobianFactor, "gtsam::JacobianFactor"); +BOOST_CLASS_EXPORT_GUID(gtsam::HessianFactor , "gtsam::HessianFactor"); + +BOOST_CLASS_EXPORT_GUID(PriorFactorLieVector, "gtsam::PriorFactorLieVector"); +BOOST_CLASS_EXPORT_GUID(PriorFactorLieMatrix, "gtsam::PriorFactorLieMatrix"); +BOOST_CLASS_EXPORT_GUID(PriorFactorPoint2, "gtsam::PriorFactorPoint2"); +BOOST_CLASS_EXPORT_GUID(PriorFactorStereoPoint2, "gtsam::PriorFactorStereoPoint2"); +BOOST_CLASS_EXPORT_GUID(PriorFactorPoint3, "gtsam::PriorFactorPoint3"); +BOOST_CLASS_EXPORT_GUID(PriorFactorRot2, "gtsam::PriorFactorRot2"); +BOOST_CLASS_EXPORT_GUID(PriorFactorRot3, "gtsam::PriorFactorRot3"); +BOOST_CLASS_EXPORT_GUID(PriorFactorPose2, "gtsam::PriorFactorPose2"); +BOOST_CLASS_EXPORT_GUID(PriorFactorPose3, "gtsam::PriorFactorPose3"); +BOOST_CLASS_EXPORT_GUID(PriorFactorCal3_S2, "gtsam::PriorFactorCal3_S2"); +BOOST_CLASS_EXPORT_GUID(PriorFactorCal3DS2, "gtsam::PriorFactorCal3DS2"); +BOOST_CLASS_EXPORT_GUID(PriorFactorCalibratedCamera, "gtsam::PriorFactorCalibratedCamera"); +BOOST_CLASS_EXPORT_GUID(PriorFactorSimpleCamera, "gtsam::PriorFactorSimpleCamera"); + +BOOST_CLASS_EXPORT_GUID(BetweenFactorLieVector, "gtsam::BetweenFactorLieVector"); +BOOST_CLASS_EXPORT_GUID(BetweenFactorLieMatrix, "gtsam::BetweenFactorLieMatrix"); +BOOST_CLASS_EXPORT_GUID(BetweenFactorPoint2, "gtsam::BetweenFactorPoint2"); +BOOST_CLASS_EXPORT_GUID(BetweenFactorPoint3, "gtsam::BetweenFactorPoint3"); +BOOST_CLASS_EXPORT_GUID(BetweenFactorRot2, "gtsam::BetweenFactorRot2"); +BOOST_CLASS_EXPORT_GUID(BetweenFactorRot3, "gtsam::BetweenFactorRot3"); +BOOST_CLASS_EXPORT_GUID(BetweenFactorPose2, "gtsam::BetweenFactorPose2"); +BOOST_CLASS_EXPORT_GUID(BetweenFactorPose3, "gtsam::BetweenFactorPose3"); + +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityLieVector, "gtsam::NonlinearEqualityLieVector"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityLieMatrix, "gtsam::NonlinearEqualityLieMatrix"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityPoint2, "gtsam::NonlinearEqualityPoint2"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityStereoPoint2, "gtsam::NonlinearEqualityStereoPoint2"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityPoint3, "gtsam::NonlinearEqualityPoint3"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityRot2, "gtsam::NonlinearEqualityRot2"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityRot3, "gtsam::NonlinearEqualityRot3"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityPose2, "gtsam::NonlinearEqualityPose2"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityPose3, "gtsam::NonlinearEqualityPose3"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityCal3_S2, "gtsam::NonlinearEqualityCal3_S2"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityCal3DS2, "gtsam::NonlinearEqualityCal3DS2"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityCalibratedCamera, "gtsam::NonlinearEqualityCalibratedCamera"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualitySimpleCamera, "gtsam::NonlinearEqualitySimpleCamera"); + +BOOST_CLASS_EXPORT_GUID(RangeFactorPosePoint2, "gtsam::RangeFactorPosePoint2"); +BOOST_CLASS_EXPORT_GUID(RangeFactorPosePoint3, "gtsam::RangeFactorPosePoint3"); +BOOST_CLASS_EXPORT_GUID(RangeFactorPose2, "gtsam::RangeFactorPose2"); +BOOST_CLASS_EXPORT_GUID(RangeFactorPose3, "gtsam::RangeFactorPose3"); +BOOST_CLASS_EXPORT_GUID(RangeFactorCalibratedCameraPoint, "gtsam::RangeFactorCalibratedCameraPoint"); +BOOST_CLASS_EXPORT_GUID(RangeFactorSimpleCameraPoint, "gtsam::RangeFactorSimpleCameraPoint"); +BOOST_CLASS_EXPORT_GUID(RangeFactorCalibratedCamera, "gtsam::RangeFactorCalibratedCamera"); +BOOST_CLASS_EXPORT_GUID(RangeFactorSimpleCamera, "gtsam::RangeFactorSimpleCamera"); + +BOOST_CLASS_EXPORT_GUID(BearingFactor2D, "gtsam::BearingFactor2D"); + +BOOST_CLASS_EXPORT_GUID(BearingRangeFactor2D, "gtsam::BearingRangeFactor2D"); + +BOOST_CLASS_EXPORT_GUID(GenericProjectionFactorCal3_S2, "gtsam::GenericProjectionFactorCal3_S2"); +BOOST_CLASS_EXPORT_GUID(GenericProjectionFactorCal3DS2, "gtsam::GenericProjectionFactorCal3DS2"); + + /* ************************************************************************* */ TEST (Serialization, smallExample_linear) { using namespace example; @@ -85,12 +234,11 @@ TEST (Serialization, gaussianISAM) { BOOST_CLASS_EXPORT_GUID(simulated2D::Prior, "gtsam::simulated2D::Prior" ) BOOST_CLASS_EXPORT_GUID(simulated2D::Odometry, "gtsam::simulated2D::Odometry" ) BOOST_CLASS_EXPORT_GUID(simulated2D::Measurement, "gtsam::simulated2D::Measurement") -BOOST_CLASS_EXPORT(gtsam::Point2) /* ************************************************************************* */ -TEST (Serialization, smallExample) { +TEST (Serialization, smallExample_nonlinear) { using namespace example; - Graph nfg = createNonlinearFactorGraph(); + NonlinearFactorGraph nfg = createNonlinearFactorGraph(); Values c1 = createValues(); EXPECT(equalsObj(nfg)); EXPECT(equalsXML(nfg)); @@ -100,113 +248,284 @@ TEST (Serialization, smallExample) { } /* ************************************************************************* */ -/* Create GUIDs for factors */ -BOOST_CLASS_EXPORT_GUID(planarSLAM::Prior, "gtsam::planarSLAM::Prior"); -BOOST_CLASS_EXPORT_GUID(planarSLAM::Bearing, "gtsam::planarSLAM::Bearing"); -BOOST_CLASS_EXPORT_GUID(planarSLAM::Range, "gtsam::planarSLAM::Range"); -BOOST_CLASS_EXPORT_GUID(planarSLAM::BearingRange,"gtsam::planarSLAM::BearingRange"); -BOOST_CLASS_EXPORT_GUID(planarSLAM::Odometry, "gtsam::planarSLAM::Odometry"); -BOOST_CLASS_EXPORT_GUID(planarSLAM::Constraint, "gtsam::planarSLAM::Constraint"); +TEST (Serialization, factors) { -BOOST_CLASS_EXPORT(gtsam::Pose2) + LieVector lieVector(4, 1.0, 2.0, 3.0, 4.0); + LieMatrix lieMatrix(2, 3, 1.0, 2.0, 3.0, 4.0, 5.0 ,6.0); + Point2 point2(1.0, 2.0); + StereoPoint2 stereoPoint2(1.0, 2.0, 3.0); + Point3 point3(1.0, 2.0, 3.0); + Rot2 rot2(1.0); + Rot3 rot3(Rot3::RzRyRx(1.0, 2.0, 3.0)); + Pose2 pose2(rot2, point2); + Pose3 pose3(rot3, point3); + Cal3_S2 cal3_s2(1.0, 2.0, 3.0, 4.0, 5.0); + Cal3DS2 cal3ds2(1.0, 2.0, 3.0, 4.0, 5.0,6.0, 7.0, 8.0, 9.0); + CalibratedCamera calibratedCamera(pose3); + SimpleCamera simpleCamera(pose3, cal3_s2); + + + Symbol a01('a',1), a02('a',2), a03('a',3), a04('a',4), a05('a',5), a06('a',6), a07('a',7), a08('a',8), a09('a',9), a10('a',10), a11('a',11), a12('a',12), a13('a',13); + Symbol b01('b',1), b02('b',2), b03('b',3), b04('b',4), b05('b',5), b06('b',6), b07('b',7), b08('b',8), b09('b',9), b10('b',10), b11('b',11), b12('b',12), b13('b',13); + + Values values; +// values.insert(a01, lieVector); +// values.insert(a02, lieMatrix); + values.insert(a03, point2); + values.insert(a04, stereoPoint2); + values.insert(a05, point3); + values.insert(a06, rot2); + values.insert(a07, rot3); + values.insert(a08, pose2); + values.insert(a09, pose3); + values.insert(a10, cal3_s2); + values.insert(a11, cal3ds2); + values.insert(a12, calibratedCamera); + values.insert(a13, simpleCamera); -/* ************************************************************************* */ -TEST (Serialization, planar_system) { - using namespace planarSLAM; - planarSLAM::Values values; - Symbol i2('x',2), i3('x',3), i4('x',4), i9('x',9), j3('l',3), j5('l',5), j9('l',9); - values.insert(j3, Point2(1.0, 2.0)); - values.insert(i4, Pose2(1.0, 2.0, 0.3)); SharedNoiseModel model1 = noiseModel::Isotropic::Sigma(1, 0.3); SharedNoiseModel model2 = noiseModel::Isotropic::Sigma(2, 0.3); SharedNoiseModel model3 = noiseModel::Isotropic::Sigma(3, 0.3); + SharedNoiseModel model4 = noiseModel::Isotropic::Sigma(4, 0.3); + SharedNoiseModel model5 = noiseModel::Isotropic::Sigma(5, 0.3); + SharedNoiseModel model6 = noiseModel::Isotropic::Sigma(6, 0.3); + SharedNoiseModel model9 = noiseModel::Isotropic::Sigma(9, 0.3); + SharedNoiseModel model11 = noiseModel::Isotropic::Sigma(11, 0.3); - Prior prior(i3, Pose2(0.1,-0.3, 0.2), model1); - Bearing bearing(i3, j5, Rot2::fromDegrees(0.5), model1); - Range range(i2, j9, 7.0, model1); - BearingRange bearingRange(i2, j3, Rot2::fromDegrees(0.6), 2.0, model2); - Odometry odometry(i2, i3, Pose2(1.0, 2.0, 0.3), model3); - Constraint constraint(i9, Pose2(2.0,-1.0, 0.2)); - Graph graph; - graph.add(prior); - graph.add(bearing); - graph.add(range); - graph.add(bearingRange); - graph.add(odometry); - graph.add(constraint); + + PriorFactorLieVector priorFactorLieVector(a01, lieVector, model4); + PriorFactorLieMatrix priorFactorLieMatrix(a02, lieMatrix, model6); + PriorFactorPoint2 priorFactorPoint2(a03, point2, model2); + PriorFactorStereoPoint2 priorFactorStereoPoint2(a04, stereoPoint2, model3); + PriorFactorPoint3 priorFactorPoint3(a05, point3, model3); + PriorFactorRot2 priorFactorRot2(a06, rot2, model1); + PriorFactorRot3 priorFactorRot3(a07, rot3, model3); + PriorFactorPose2 priorFactorPose2(a08, pose2, model3); + PriorFactorPose3 priorFactorPose3(a09, pose3, model6); + PriorFactorCal3_S2 priorFactorCal3_S2(a10, cal3_s2, model5); + PriorFactorCal3DS2 priorFactorCal3DS2(a11, cal3ds2, model9); + PriorFactorCalibratedCamera priorFactorCalibratedCamera(a12, calibratedCamera, model6); + PriorFactorSimpleCamera priorFactorSimpleCamera(a13, simpleCamera, model11); + + BetweenFactorLieVector betweenFactorLieVector(a01, b01, lieVector, model4); + BetweenFactorLieMatrix betweenFactorLieMatrix(a02, b02, lieMatrix, model6); + BetweenFactorPoint2 betweenFactorPoint2(a03, b03, point2, model2); + BetweenFactorPoint3 betweenFactorPoint3(a05, b05, point3, model3); + BetweenFactorRot2 betweenFactorRot2(a06, b06, rot2, model1); + BetweenFactorRot3 betweenFactorRot3(a07, b07, rot3, model3); + BetweenFactorPose2 betweenFactorPose2(a08, b08, pose2, model3); + BetweenFactorPose3 betweenFactorPose3(a09, b09, pose3, model6); + + NonlinearEqualityLieVector nonlinearEqualityLieVector(a01, lieVector); + NonlinearEqualityLieMatrix nonlinearEqualityLieMatrix(a02, lieMatrix); + NonlinearEqualityPoint2 nonlinearEqualityPoint2(a03, point2); + NonlinearEqualityStereoPoint2 nonlinearEqualityStereoPoint2(a04, stereoPoint2); + NonlinearEqualityPoint3 nonlinearEqualityPoint3(a05, point3); + NonlinearEqualityRot2 nonlinearEqualityRot2(a06, rot2); + NonlinearEqualityRot3 nonlinearEqualityRot3(a07, rot3); + NonlinearEqualityPose2 nonlinearEqualityPose2(a08, pose2); + NonlinearEqualityPose3 nonlinearEqualityPose3(a09, pose3); + NonlinearEqualityCal3_S2 nonlinearEqualityCal3_S2(a10, cal3_s2); + NonlinearEqualityCal3DS2 nonlinearEqualityCal3DS2(a11, cal3ds2); + NonlinearEqualityCalibratedCamera nonlinearEqualityCalibratedCamera(a12, calibratedCamera); + NonlinearEqualitySimpleCamera nonlinearEqualitySimpleCamera(a13, simpleCamera); + + RangeFactorPosePoint2 rangeFactorPosePoint2(a08, a03, 2.0, model1); + RangeFactorPosePoint3 rangeFactorPosePoint3(a09, a05, 2.0, model1); + RangeFactorPose2 rangeFactorPose2(a08, b08, 2.0, model1); + RangeFactorPose3 rangeFactorPose3(a09, b09, 2.0, model1); + RangeFactorCalibratedCameraPoint rangeFactorCalibratedCameraPoint(a12, a05, 2.0, model1); + RangeFactorSimpleCameraPoint rangeFactorSimpleCameraPoint(a13, a05, 2.0, model1); + RangeFactorCalibratedCamera rangeFactorCalibratedCamera(a12, b12, 2.0, model1); + RangeFactorSimpleCamera rangeFactorSimpleCamera(a13, b13, 2.0, model1); + + BearingFactor2D bearingFactor2D(a08, a03, rot2, model1); + + BearingRangeFactor2D bearingRangeFactor2D(a08, a03, rot2, 2.0, model2); + + GenericProjectionFactorCal3_S2 genericProjectionFactorCal3_S2(point2, model2, a09, a05, boost::make_shared(cal3_s2)); + GenericProjectionFactorCal3DS2 genericProjectionFactorCal3DS2(point2, model2, a09, a05, boost::make_shared(cal3ds2)); + + + + + NonlinearFactorGraph graph; +// graph.add(priorFactorLieVector); +// graph.add(priorFactorLieMatrix); + graph.add(priorFactorPoint2); + graph.add(priorFactorStereoPoint2); + graph.add(priorFactorPoint3); + graph.add(priorFactorRot2); + graph.add(priorFactorRot3); + graph.add(priorFactorPose2); + graph.add(priorFactorPose3); + graph.add(priorFactorCal3_S2); + graph.add(priorFactorCal3_S2); + graph.add(priorFactorCalibratedCamera); + graph.add(priorFactorSimpleCamera); + +// graph.add(betweenFactorLieVector); +// graph.add(betweenFactorLieMatrix); + graph.add(betweenFactorPoint2); + graph.add(betweenFactorPoint3); + graph.add(betweenFactorRot2); + graph.add(betweenFactorRot3); + graph.add(betweenFactorPose2); + graph.add(betweenFactorPose3); + +// graph.add(nonlinearEqualityLieVector); +// graph.add(nonlinearEqualityLieMatrix); + graph.add(nonlinearEqualityPoint2); + graph.add(nonlinearEqualityStereoPoint2); + graph.add(nonlinearEqualityPoint3); + graph.add(nonlinearEqualityRot2); + graph.add(nonlinearEqualityRot3); + graph.add(nonlinearEqualityPose2); + graph.add(nonlinearEqualityPose3); + graph.add(nonlinearEqualityCal3_S2); + graph.add(nonlinearEqualityCal3DS2); + graph.add(nonlinearEqualityCalibratedCamera); + graph.add(nonlinearEqualitySimpleCamera); + + graph.add(rangeFactorPosePoint2); + graph.add(rangeFactorPosePoint3); + graph.add(rangeFactorPose2); + graph.add(rangeFactorPose3); + graph.add(rangeFactorCalibratedCameraPoint); + graph.add(rangeFactorSimpleCameraPoint); + graph.add(rangeFactorCalibratedCamera); + graph.add(rangeFactorSimpleCamera); + + graph.add(bearingFactor2D); + + graph.add(bearingRangeFactor2D); + + graph.add(genericProjectionFactorCal3_S2); + graph.add(genericProjectionFactorCal3DS2); + // text - EXPECT(equalsObj(i2)); - EXPECT(equalsObj(j3)); - EXPECT(equalsObj(values)); - EXPECT(equalsObj(prior)); - EXPECT(equalsObj(bearing)); - EXPECT(equalsObj(bearingRange)); - EXPECT(equalsObj(range)); - EXPECT(equalsObj(odometry)); - EXPECT(equalsObj(constraint)); - EXPECT(equalsObj(graph)); + EXPECT(equalsObj(a01)); + EXPECT(equalsObj(b02)); + EXPECT(equalsObj(values)); + EXPECT(equalsObj(graph)); + +// EXPECT(equalsObj(priorFactorLieVector)); +// EXPECT(equalsObj(priorFactorLieMatrix)); + EXPECT(equalsObj(priorFactorPoint2)); + EXPECT(equalsObj(priorFactorStereoPoint2)); + EXPECT(equalsObj(priorFactorPoint3)); + EXPECT(equalsObj(priorFactorRot2)); + EXPECT(equalsObj(priorFactorRot3)); + EXPECT(equalsObj(priorFactorPose2)); + EXPECT(equalsObj(priorFactorPose3)); + EXPECT(equalsObj(priorFactorCal3_S2)); + EXPECT(equalsObj(priorFactorCal3DS2)); + EXPECT(equalsObj(priorFactorCalibratedCamera)); + EXPECT(equalsObj(priorFactorSimpleCamera)); + +// EXPECT(equalsObj(betweenFactorLieVector)); +// EXPECT(equalsObj(betweenFactorLieMatrix)); + EXPECT(equalsObj(betweenFactorPoint2)); + EXPECT(equalsObj(betweenFactorPoint3)); + EXPECT(equalsObj(betweenFactorRot2)); + EXPECT(equalsObj(betweenFactorRot3)); + EXPECT(equalsObj(betweenFactorPose2)); + EXPECT(equalsObj(betweenFactorPose3)); + +// EXPECT(equalsObj(nonlinearEqualityLieVector)); +// EXPECT(equalsObj(nonlinearEqualityLieMatrix)); + EXPECT(equalsObj(nonlinearEqualityPoint2)); + EXPECT(equalsObj(nonlinearEqualityStereoPoint2)); + EXPECT(equalsObj(nonlinearEqualityPoint3)); + EXPECT(equalsObj(nonlinearEqualityRot2)); + EXPECT(equalsObj(nonlinearEqualityRot3)); + EXPECT(equalsObj(nonlinearEqualityPose2)); + EXPECT(equalsObj(nonlinearEqualityPose3)); + EXPECT(equalsObj(nonlinearEqualityCal3_S2)); + EXPECT(equalsObj(nonlinearEqualityCal3DS2)); + EXPECT(equalsObj(nonlinearEqualityCalibratedCamera)); + EXPECT(equalsObj(nonlinearEqualitySimpleCamera)); + + EXPECT(equalsObj(rangeFactorPosePoint2)); + EXPECT(equalsObj(rangeFactorPosePoint3)); + EXPECT(equalsObj(rangeFactorPose2)); + EXPECT(equalsObj(rangeFactorPose3)); + EXPECT(equalsObj(rangeFactorCalibratedCameraPoint)); + EXPECT(equalsObj(rangeFactorSimpleCameraPoint)); + EXPECT(equalsObj(rangeFactorCalibratedCamera)); + EXPECT(equalsObj(rangeFactorSimpleCamera)); + + EXPECT(equalsObj(bearingFactor2D)); + + EXPECT(equalsObj(bearingRangeFactor2D)); + + EXPECT(equalsObj(genericProjectionFactorCal3_S2)); + EXPECT(equalsObj(genericProjectionFactorCal3DS2)); + // xml - EXPECT(equalsXML(i2)); - EXPECT(equalsXML(j3)); - EXPECT(equalsXML(values)); - EXPECT(equalsXML(prior)); - EXPECT(equalsXML(bearing)); - EXPECT(equalsXML(bearingRange)); - EXPECT(equalsXML(range)); - EXPECT(equalsXML(odometry)); - EXPECT(equalsXML(constraint)); - EXPECT(equalsXML(graph)); + EXPECT(equalsXML(a01)); + EXPECT(equalsXML(b02)); + EXPECT(equalsXML(values)); + EXPECT(equalsXML(graph)); + +// EXPECT(equalsXML(priorFactorLieVector)); +// EXPECT(equalsXML(priorFactorLieMatrix)); + EXPECT(equalsXML(priorFactorPoint2)); + EXPECT(equalsXML(priorFactorStereoPoint2)); + EXPECT(equalsXML(priorFactorPoint3)); + EXPECT(equalsXML(priorFactorRot2)); + EXPECT(equalsXML(priorFactorRot3)); + EXPECT(equalsXML(priorFactorPose2)); + EXPECT(equalsXML(priorFactorPose3)); + EXPECT(equalsXML(priorFactorCal3_S2)); + EXPECT(equalsXML(priorFactorCal3DS2)); + EXPECT(equalsXML(priorFactorCalibratedCamera)); + EXPECT(equalsXML(priorFactorSimpleCamera)); + +// EXPECT(equalsXML(betweenFactorLieVector)); +// EXPECT(equalsXML(betweenFactorLieMatrix)); + EXPECT(equalsXML(betweenFactorPoint2)); + EXPECT(equalsXML(betweenFactorPoint3)); + EXPECT(equalsXML(betweenFactorRot2)); + EXPECT(equalsXML(betweenFactorRot3)); + EXPECT(equalsXML(betweenFactorPose2)); + EXPECT(equalsXML(betweenFactorPose3)); + +// EXPECT(equalsXML(nonlinearEqualityLieVector)); +// EXPECT(equalsXML(nonlinearEqualityLieMatrix)); + EXPECT(equalsXML(nonlinearEqualityPoint2)); + EXPECT(equalsXML(nonlinearEqualityStereoPoint2)); + EXPECT(equalsXML(nonlinearEqualityPoint3)); + EXPECT(equalsXML(nonlinearEqualityRot2)); + EXPECT(equalsXML(nonlinearEqualityRot3)); + EXPECT(equalsXML(nonlinearEqualityPose2)); + EXPECT(equalsXML(nonlinearEqualityPose3)); + EXPECT(equalsXML(nonlinearEqualityCal3_S2)); + EXPECT(equalsXML(nonlinearEqualityCal3DS2)); + EXPECT(equalsXML(nonlinearEqualityCalibratedCamera)); + EXPECT(equalsXML(nonlinearEqualitySimpleCamera)); + + EXPECT(equalsXML(rangeFactorPosePoint2)); + EXPECT(equalsXML(rangeFactorPosePoint3)); + EXPECT(equalsXML(rangeFactorPose2)); + EXPECT(equalsXML(rangeFactorPose3)); + EXPECT(equalsXML(rangeFactorCalibratedCameraPoint)); + EXPECT(equalsXML(rangeFactorSimpleCameraPoint)); + EXPECT(equalsXML(rangeFactorCalibratedCamera)); + EXPECT(equalsXML(rangeFactorSimpleCamera)); + + EXPECT(equalsXML(bearingFactor2D)); + + EXPECT(equalsXML(bearingRangeFactor2D)); + + EXPECT(equalsXML(genericProjectionFactorCal3_S2)); + EXPECT(equalsXML(genericProjectionFactorCal3DS2)); } -/* ************************************************************************* */ -/* Create GUIDs for factors */ -BOOST_CLASS_EXPORT_GUID(visualSLAM::PoseConstraint, "gtsam::visualSLAM::PoseConstraint"); -BOOST_CLASS_EXPORT_GUID(visualSLAM::PointConstraint, "gtsam::visualSLAM::PointConstraint"); -BOOST_CLASS_EXPORT_GUID(visualSLAM::PosePrior, "gtsam::visualSLAM::PosePrior"); -BOOST_CLASS_EXPORT_GUID(visualSLAM::PointPrior, "gtsam::visualSLAM::PointPrior"); -BOOST_CLASS_EXPORT_GUID(visualSLAM::ProjectionFactor,"gtsam::visualSLAM::ProjectionFactor"); -BOOST_CLASS_EXPORT_GUID(visualSLAM::StereoFactor, "gtsam::visualSLAM::StereoFactor"); - -BOOST_CLASS_EXPORT(gtsam::Pose3) -BOOST_CLASS_EXPORT(gtsam::Point3) - -static Point3 pt3(1.0, 2.0, 3.0); -static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0); -static Pose3 pose3(rt3, pt3); -static Cal3_S2 cal1(1.0, 2.0, 0.3, 0.1, 0.5); - -/* ************************************************************************* */ -TEST (Serialization, visual_system) { - using namespace visualSLAM; - visualSLAM::Values values; - Symbol x1('x',1), x2('x',2); - Symbol l1('l',1), l2('l',2); - Pose3 pose1 = pose3, pose2 = pose3.inverse(); - Point3 pt1(1.0, 2.0, 3.0), pt2(4.0, 5.0, 6.0); - values.insert(x1, pose1); - values.insert(l1, pt1); - SharedNoiseModel model2 = noiseModel::Isotropic::Sigma(2, 0.3); - SharedNoiseModel model3 = noiseModel::Isotropic::Sigma(3, 0.3); - SharedNoiseModel model6 = noiseModel::Isotropic::Sigma(6, 0.3); - boost::shared_ptr K(new Cal3_S2(cal1)); - - Graph graph; - graph.addMeasurement(Point2(1.0, 2.0), model2, x1, l1, K); - graph.addPointConstraint(l1, pt1); - graph.addPointPrior(l1, pt2, model3); - graph.addPoseConstraint(x1, pose1); - graph.addPosePrior(x1, pose2, model6); - - EXPECT(equalsObj(values)); - EXPECT(equalsObj(graph)); - - EXPECT(equalsXML(values)); - EXPECT(equalsXML(graph)); -} /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } From e2e780de4d1633a812887e67be19e6cf269115ff Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 23 Jul 2012 22:51:18 +0000 Subject: [PATCH 698/914] Removed SLAM namespaces from testLinearizedFactor --- gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp b/gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp index d15bcd150..9c0438e49 100644 --- a/gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp +++ b/gtsam_unstable/nonlinear/tests/testLinearizedFactor.cpp @@ -6,7 +6,8 @@ #include #include #include -#include +#include +#include #include From 1b935dbdc5aed9279d2da7efd5b27fb981dec5ab Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 24 Jul 2012 13:35:04 +0000 Subject: [PATCH 699/914] Added matlab utility functions for plotting 3D points --- matlab/plot3DPoints.m | 36 ++++++++++++++++++++++++++++++++++++ matlab/plotPoint3.m | 13 +++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 matlab/plot3DPoints.m create mode 100644 matlab/plotPoint3.m diff --git a/matlab/plot3DPoints.m b/matlab/plot3DPoints.m new file mode 100644 index 000000000..264298ef4 --- /dev/null +++ b/matlab/plot3DPoints.m @@ -0,0 +1,36 @@ +function plot3DPoints(values, linespec, marginals) +%PLOT3DPOINTS Plots the Point3's in a values, with optional covariances +% Finds all the Point3 objects in the given Values object and plots them. +% If a Marginals object is given, this function will also plot marginal +% covariance ellipses for each point. + +import gtsam.* + +if ~exist('linespec', 'var') || isempty(linespec) + linespec = 'g'; +end +haveMarginals = exist('marginals', 'var'); +keys = KeyVector(values.keys); + +holdstate = ishold; +hold on + +% Plot points and covariance matrices +for i = 0:keys.size-1 + key = keys.at(i); + p = values.at(key); + if isa(p, 'gtsam.Point3') + if haveMarginals + P = marginals.marginalCovariance(key); + plotPoint3(p, linespec, P); + else + plotPoint3(p, linespec); + end + end +end + +if ~holdstate + hold off +end + +end diff --git a/matlab/plotPoint3.m b/matlab/plotPoint3.m new file mode 100644 index 000000000..89d5613d5 --- /dev/null +++ b/matlab/plotPoint3.m @@ -0,0 +1,13 @@ +function plotPoint3(p, color, P) +%PLOTPOINT3 Plot a Point3 with an optional covariance matrix +if size(color,2)==1 + plot3(p.x,p.y,p.z,[color '*']); +else + plot3(p.x,p.y,p.z,color); +end +if exist('P', 'var') + covarianceEllipse3D([p.x;p.y;p.z],P); +end + +end + From cceebbf41c434d554067cabb00788343e58ce41f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 24 Jul 2012 13:35:11 +0000 Subject: [PATCH 700/914] Moved utility functions that are example-specific to a 'support' namespace inside the examples folder --- matlab/CMakeLists.txt | 6 ++---- matlab/VisualISAM_gui.fig | Bin 9761 -> 0 bytes .../+support}/VisualISAMGenerateData.m | 0 .../+support}/VisualISAMInitialize.m | 3 ++- matlab/{ => examples/+support}/VisualISAMPlot.m | 0 matlab/{ => examples/+support}/VisualISAMStep.m | 0 .../{ => +support}/findExampleDataFile.m | 4 ++-- matlab/examples/Pose2SLAMExample_graph.m | 2 +- matlab/examples/Pose3SLAMExample_graph.m | 2 +- matlab/examples/SBAExample.m | 2 +- matlab/examples/VisualISAMExample.m | 10 +++++----- matlab/examples/VisualISAM_gui.fig | Bin 0 -> 10226 bytes matlab/{ => examples}/VisualISAM_gui.m | 14 +++++++------- 13 files changed, 21 insertions(+), 22 deletions(-) delete mode 100644 matlab/VisualISAM_gui.fig rename matlab/{ => examples/+support}/VisualISAMGenerateData.m (100%) rename matlab/{ => examples/+support}/VisualISAMInitialize.m (93%) rename matlab/{ => examples/+support}/VisualISAMPlot.m (100%) rename matlab/{ => examples/+support}/VisualISAMStep.m (100%) rename matlab/examples/{ => +support}/findExampleDataFile.m (76%) create mode 100644 matlab/examples/VisualISAM_gui.fig rename matlab/{ => examples}/VisualISAM_gui.m (94%) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index 3e77de602..0b07b51b1 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -16,10 +16,8 @@ install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_te # Examples message(STATUS "Installing Matlab Toolbox Examples") # Matlab files: *.m and *.fig -file(GLOB matlab_examples_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.m") -file(GLOB matlab_examples_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/*.fig") -set(matlab_examples ${matlab_examples_m} ${matlab_examples_fig}) -install(FILES ${matlab_examples} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples) +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples" FILES_MATCHING PATTERN "*.m") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples" FILES_MATCHING PATTERN "*.fig") message(STATUS "Installing Matlab Toolbox Examples (Data)") # Data files: *.graph and *.txt diff --git a/matlab/VisualISAM_gui.fig b/matlab/VisualISAM_gui.fig deleted file mode 100644 index 7140cbf7333b38b5712208c676d6da9caadbbf26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9761 zcma)hXEYpK)UFai^d6lMy#^uL=p|Z^=rsu{=56fIs5Fr*Ewgcy`JZkZJ_#6Usa7uMofasK=q}lv#Yz42-gdDM?YsT z9}oF|Hg(;n(jr{yK2DB)PH(xqJmtB}|Mky-o?MbrTu-FrCFSI$|0xoZPq_Yn#hDlH ze+6IHfa;&N#)F3k%11C8c(KXMEC#n4^lJxwOI0C?lIyD=sbW(p7&i~lRM&f|oAE#p zT&)y&AHZVIm!T0l`B?!{uvai1R0$& zLoKuSjF&H1D`Y@U3%|iFM~)mE!FoM1l&Yarp%J7lT|2B3&GF`e9>{F!6(X9v1)9R{ z5EJz#o^w2e%+dtAgZjz?c-L8EdJcuV4E8JHk>->~H9gg0zcm;l;M*g#&^FK--5k;U zzHn|m+9}p$7B$vbwN9O=x%Ej(Lel-Y^6RLJ2d|+y!mvo;7a;5d3W?#FgoklB8j)f= zFMe&yiqB=vaWYne_;n5uV8ZYBV#ie}^OPPyj2bAm+a<%8JGjWoibOx0%5xI$1GAcK zBgvQ88o$aI(y(={^>cNvxoF&7vXWAXpLovn_8}1-smU(s6HscFEp`nOdP!yb;<52g#qf(@ zb{_&^Fpa0W&hzbG@Mu=JtY%5+Zl3a6$i_@?f4Er<`{=fb&oeIHD8nr+6Ca-5QjP=O z2_xpvG{2<-ETWr$a)K&75DE%qd^dRq9Ee9+eu7zaCwD&DfB_E^NbJlP8XsY)G;25& zh`-3Xj2b;WOK;`oW_ah78|ZRF$lEYcQ@%0)3b?t{)$HL~8qEB&f_Ad!%g5)E_*;|e zP?-tTI@z`e*gV8sx4e5aKQKR~B^vs>IH6nURY=vyZ)X3OzsIOmB_?mA^d3)7wi-{4 z3d^S_SkWr59!hPdojT9dqrQaVpwhf&}fOKuxBh=)K`S34X z4I5s;wyqa*Xr|vh*o56ras4Z*ssD1kU9zZb6Lq$tvc=zvy#fs<0-3kEZQD-1kducD zR&`%PJYAYQ<$%wp!agS6btEQ8;yG)+bdtE>8n-HYMDeckz%)A~`%9!1n&<%Ob6avm zTaGUT#)lisS=~7t9({K^`kqME)~feRV&Sf>5Or8^B_i`YA2$)kw)tW0;KEKky4zVP z5DnP_!tjohKm?0;l|@ zb%z*w8Gr@U?xjRaZ5q-u>tho~9@}cE!(7=fn7!|hZS?Xtq}@_VpR|u46kr-jESfb@ zi1(v^2Ri8A3cf!bqcUKg5`o)lF4VUCViquoZX@DMC+Mr=e*mBqbEL`y^T@<(*$z_H zKL#bF#x*H;cxk2H*ZZuVVZQU-QqnDTeLe?9ZKSdN>gPD3%>UPwak;!U0LkdCv?rpT zTFNNuX!sJ#=fy|PLZnb@u)HfZsy<*}q1?Kzo#YG{%QjB^P&oJHlk#w8MbGcoYwzMq zPG#aSwp#jKEFjj_4yVvaw>ux=CRCJ;b^02sTlR5wHER<_xts!eWvHM zXBx+4bFNtq>#}BaUSn#V(QLkeb00CeUwd{ZQ^D~{H}FeSFUm*Q9F(ihLEhu5|L7fu zLzo+RO-s-RK;e`ZN`Ec}CP9*>yvG66O zH_524K)mmm#FZ1j6SzF^JL~DPgF4t`3u2E#1%)Q#(9V;+&kugq6-ER)>(_Xwf)k~3 z%zHSiT;{rDGkWuqkoT20OA-Xta(nWBwQa&*oS|Z^4L4wx!AJ8SA%wbY?jICzi&3Eu z(n8}8<|+CW+_09{loF(`n>v_YqX{~SQUjJiyX49ZrI{iZLb>f1^lLK0$0oeTXOS># zz%hHhh|>ON&eBbNFxO|hwqnggWm4Egm@1f7`EB8Dh}h$kim)Po$ROPrhPA8NJL|jm zdz=ReH}60}8Ki3!GI=911kxN>#P#Pji+e+bMX}Gn{zLqoH*z09ct8OjU`vsz3slKgiXj^;Wjee^z=R@aM!S zcQ-!(+m&%yj8a~2)?9Wyu{=PhxjZ}BJ!ysJ;=DsUfKBhv=I?tu6G!j{Jqn~;H)|Ha zo1`31+I|Z%g}9^L+?~gj`d6pY)!pidFFV}`h#N+2V|}bC$e6cG965-{5{M)$Og)UA zwh|8;muW#_QO z*9L+lDELY=MCg{_mPzZ4DD~|n>!{(Z^2-1Uv(1ym4k<*l5T4${yQTLkeM4sbU(LPY zi!+kGg3UTAm!yxI=7+;?6;}8sO!t!3czlQ>bdb@{5+<|XhP|w>h+n2MHgBnj45WgQ zDTY!UIn?0&_9vv45%H$4xmJE9GpUq}J#f+6TpvPF{PB>8iB9v{(ImKhf?vbuka=(H zdifxgz;UPQdEANh4_!O+#%cU{EJqW9td7NRE~pAdI!z|4w^F>O-`S>pHTrtJb0H|G zF2UC}c-9ZuHfUu3yeG8o^9g!r0CS5GI)J-^DKCAMf}e-@DCHk+*ih|u)qIaJQkZYX zm@3(D>}~Y_GX*}}4z#eYi}C$01X>w``(LbB7na~95e6SKMxL)1BNeCkz-8?%kaX$t%Wx!`8W4;*ltPXdfC&&!|%~*^X4oT zTpTBR_;-7Un*dy8?h3CkUu31c)?j=kY|rpS@bOv)eh3sw!395tGt%3~Dy3%)E-P?N zc5+Nx>rW}vY~i!7Phu+eS>fX^Lfr%dHOEh?L4}^SSY#)eea|(fZ>lYC7_e@EX)wp) zp>u_k@3@q_xHZ9K0(y`H((Xrp_n>LPDbv<7XkEy-oD0Ud=T`9olthZe(gnJrY$kUE zZ^RY1iX}sTY-I!GD?19c)L?jt*s$}a9jEFGagD&}iprv4BATgq`1XPZW%NCOs@W%# zA@1Qs4hZLh(*5bh?lRD`<6^NAvjYE|>8qq6IOhHHP9_HN;f~QgN`DUmVgqF^k^uxZ zdk$PD8`P}}d^dNMS9YDlXf8-&uDb?6^Il>8^cyY$`1Pg>GUn-VRXL~Z@juDZ{W6T} zpl!wA8DNfftq{)`(rL;_4WSl ze$!lk@Wy6ti?U+1%+t0tzBLjZZ9K*8BlmQ3DsCmHWd5rHLbBU6TC0XKf=#olj9nvD zZ259Ubx>c+G;-$A9(8AX66p@1eROO{ue*C_)cyVw34n^H2-tBf*~NE-W2Z(CeJl3< z(LC=+0LZ>~PwE3+%RQ2g%||Z8J`b~Bx#z{Q=_K?Qq2KBHcm+4b+yURyinqEPC#9`& z^3)`!y&4*!?-3Uh-1-KrrgdLldJi{a$W?l~f5&ZP+b~dux-5U%|B_=xF;uWrKyRI+ zJ|h}d;JL0WIH7n`+yvvgL93)<#oAvUbSG;=zr>+*O!@)0)?NR2JGMPyE-`gz7ImTL4U{VT4Mw&_^2w9lg68ycf>pQwM>dqiU7nzV3%;@YI7V%xn_P zDn&8Z@Z`a*{76d1SG<@=Wz;XJfb`Hug+&QV0Yr{f#@(}@(T5Ii0j(wa+Lv(PWf!CN zf?mw!;~thS?A!3I4ki_BhuNL!A8RK}SK_p|>#ce8qP!_~sB+e)*WPTCljoX`tgbGB zMew5VxlwaH)#Oal+Z)jRLc~TD@G}^Ct?s1y_dj;Gg!|*B{pJVJ_W& z-yJzd-yMnnUtU`^q*J9YG{G`_kCU7oh?V@EqG2WTQK40ZgqNCx$P4PHP|gEAejC6z zAS~9smF{vX7)(m%r5}8+dwy^1*gZi0yI<#LHGTdsV}*-K_AapXfL6i3Daw;%PuvX} zs~W+0Rrt_WCu1BWlBAit#hrSDZ;1wYX$) z)H+ziO!~7wL$9cy*YWi#PTd|phqLlmsgWUIhKaH@2+z-#lD1F2sCO@C* zBPOOk{Un7-WS-`39KlJ>%s;7+aegcWD}VUs7Os^BrRx1DC-RAr5^2WUMYGL@i3j}5 zzYy=a(7B3mOP1x|xX@nE9%7}v6ArruRab#&%hzl6Qf6x}Z0@#_zPD~BY3KIf+>{Nw zpzX|j43>%CydUzfX-AEj6Uv{9N`G)-Jtn%G%gulDQ2Mq2>ezLAcQjx;@7!*TJbJzQ zq{@St)-YY}@8;XTF}w9Yv2zHH8Mj|M$#Jf!Zo&6-IYyv}W=%A=4q=1qvxRy+tbhq? zUQjXQWpuWMD&DVxi?kWez@({I!?dF)xypTNe!7o5J+fh;vIS#?=q_8kPH>l*31V=& zz00}Nnbt}#{|cv2U*30dwv;>krv9*NXFWt<4%C%(zo~oL0V)Fn9*%Wne|(0ZINyo?EBq zP1c7RIdxqXu^MKrcTu)=+Kc|#j1Fvg$D=dV#3A6eeDNffZ$fzbR|bQoO0`qip4~BlC6PvxHF2CMf0uoU)%NA`@SK9TPcSWa zp?5puK_{}~#Ud=KBu>{e*DFI~y};q7hiB1x?g$6xX9B%^rF@e2G+0GVU1pxR8Mr?s zkBGhrfClf}u>F-1E`*YjpZw%Ed&omzlS%^UKYJ16bgYU1p-fuQM7hP8UJV*j3WOhSgZIzj(?hwR!n zkx$K#&N*R@NJ#Mj>4#l#%t;$l@IkfaY0S2E!a>$38#EP^ejf7BUMipqg8K>Wptvm> z-_6yvOs$dFX%BdH`&5Uu+5P8Cy<6DJFY4ptm#9~*Ueu#@@7=^fw%p!b+B}9U5fIt| ziiWi<56j(3c%g`A_mtk&;nqOTB$Tu`d))<&ILU1S^fHK_Jb1}#_XzX$Eo>S_^{ovk zIQ(oZCBKQY_b>DZ$0EX@9V5FOgKgJ>GDd?8rcK>@2kSn;2#hl7MiF~ zPXtPi|7Hp37-Y0Z$Z&kXuuwOmxZlH!^nmUDuplfyTS5 z1;w4y=|@cX>HmMnW?3I?JjM6N{4#cU%JQV}1 z-x42bGVYvcjd9NHRBEnYSv?90#Xs_%8y2>tvP0VvuDOQ?v{Rh)<9R)YQ$!p6(VUZ* z?o4*;5IuAoma0JFJw2%Kw(wW}g|7d2qfT?180(dj{!ojo6OCtGW-=hddvWY!%g`uh zk=0g>zEuIgv?&;ptwR!cQujAL^ZkxzBn~Dzk`3J6p1pY&&{4^Y6}g2Nv?t_>rij)g zCaHgt)odm@8+~c9rz+>|{)sG~rgJXe{%>X0Vw8Y(l_oj4=~Ibe9nTY|Lk(@<{mkU> zBzfnBzkI%ViY}vkMnY=DAV?v?KsNS@#Fs4l%jO3hu1;4|WyMj)F^_Kf<#J**#WEhv zbD+C3TrdTnvX`A@hAPPkHPW52wsOx)v zHphXXc1w{IzAZJp@+F^P<~MqI?}cK$#*ITDBTZ59KG8xg#Aa+_Cg3-xex%FTn?_NF zw3r{n10D{Cw%l#D)iNVv%?T;v1}1J2az~GW4=SWYrKI5A4;gk5->*Wt*N7MV5z{=C z#S;!Q%HJ5bj8PG{ihm0ANGgudhWMwZGwCVi6@LsMwRr2F8Hc~M)`u5ehee}(305g_ z=YRslD1cw48=px7Qs(qap!+yC%&_=_Vz~OQL$4yq>Qh{P97gIAwg7l+Z#hl&K^A+H zuKWh4afC4i!wl|r3uUpEhl2qA7ZzTh(od6KQU544AIx zh#;1(9E;(3D8f*LeW)H8Y$wWF^Dp#yuwa~*e0vX;Y{{1h(Z++2N)IW#P^vHgEN&OX zl2{*s+!Z<%3PZ}Cu4bYsK+BK##=R5UZq0A@ zlwubOTQzNfe)<5%r0aOeM45Gs!rmK6DDP z1pL~Gc^roCpC=ywytt*Dm#8()lVaSpS)Zp@Xcs&_ z1ohp0hX$g6bAzkg7k!53j=Z-o+WA8Ew8m0&ump2EuX`W-i+Z)UQi`j+k2e>UY4}QtqsjuYq#Y`AG_y>lo>W4A*%06 z+TQsELR$_h&gU{_vo#0jS5Imn6Uq-xQ)X4+fFzBuO5-ZIg`cD6i%zK%5yGS9x)Ax# zXrk-qH$pcl(oMmGZi9!_L1BddgGNiJ=d=oaK^fIM@V8iVOPVNZ(du^~orW4cypI~M zG#)6B(7F7fl)D_^Aat623>CBVkF!9MqVLhNmSG9VvPgE8q(Dz(nhMIwX_-fJ^Lejs zCqg**-;fkX!iC}v+gBV7bP;qgFB%*K8i#wJ5McFLyNHuvUdcO2@5WeAb}mNQx9!Qf z(ZgH(n3+qP6JRN9m zVP5GK_lv4K+~?rugZZCEtFv2oK*%w*0c3}6Y}D48ROHFd3)aZ^<(xOo5i%S3q50Bi zk_EedweClEQMvaBAQD+^h>{as9AXk2cJH#1|qs6QbPCF$lIO zenO*aB%=;{mtAN)Fv?2lW6cw{@-o`~@11*DTX2N0zeK=?>8q}G_ZKQTB=lFoWew0O zy_dJ8{(DQQY)LYRRt>%{-Z~1qmi_kOyDb`IJK2op93pG)6+5iDeagYiQqgDE^)uyd zQ9I>;_}`W$o)tD@DMBz8=^n0u`7a_3PhXW^E}`u2lP@>+v_3%uIbM@}n1sA&ah}V{ z6OSF=9TBF<%K8Rdm!(^{ge#ggHb#Oesvdd6#4zA~w7M;yH42OMX2QTU<7Vb^<UPwy=U0%d#905 zFQ=m)bUw02&+5)hNhwBvJJi7QUDCV7&&1s*o%HkCcNEu*P*Tw3{%H2_jnqsh#+D;#g+J$P z(&u_5Cl*qQZnT=_C4uDE&2VFN;)-k1i z2iRx4NQyEe9$x;ZB0E8e*ZJuxyo^9A<&XC$9ySUlYhxgPq3>kmahGqsF1kPY&jnB@ z7}70^GaP3F5?08r$colPMp%oez?&+d&2tXq&^Y;BAq$ouKU?-!9zKnY@tn3@wcJ+R zz9N$MISAeZnn;?zRO{l*@ZIiU*lcoAj^VxevemdK9{8oEB;<9#EO)me)v{y8d9MA~ z8}37D*%`$ANfAR#6Q~?6i>Sc`*oQd(%i#vZ>XbQn!F>AeK=AYVYUEi%({(OCFujMW50?DxJ$?|RC6)BCpdTk9R1Wx zQf5L;{JrYLN7v?9F91SN@KC}3?ORu3Y|(RDp~irNnR5Hff&!_XC9;ios=v~=(Ud)$ zCrUjB5 zwR6l4-Gl~B-?kE1505mmvcHoxC~Z6hDL}}8>VK^nuZMU6XNh?zQ$=PBT9FIwkzV`x zq@Y(eHI*~XE9Y8aNW#`&Z`0#l$qt|URqlzkNufY1VGU)ii$T<;+z)u#y!2XGAW7=+ z!h)~<$KA%>45QIyf!M>hHm<@m*tdU!!Qv8#^q)>VV{RGAkKqOJYo|}}50g{gv3q}i zO|^Ig>WRNHP;aRJSr_N0V^F9@j;}CrymzH|PI>+{nF7{hv6dA!CCR?yp)?q((Jj~b-=h2?8YC`J1tyVsbSiijc_8e^(fty60` z27~!;Bt-@_B`=(~d4lljaqynIK469ICDZ225-7t4&vu-HdG_w4PjHgvD8V1yK=P!E*uG80)*~J_8 z`Jpl|A&EMQ^oQ)~>r?sNxT&7CG<31WjOv_XnAP;PIEG!Reg6$CuTA{R-V^eVfql0N zLGBoNz1eFs0-O3wRzV6%D_MV z{Rn~bkG?<+f2lnDRH<%Vw;h^7#@XK;*GJ^Np%$P+O_-(<$%3Q^rswF(M%udXzf9&Q zQeQ|5O9xc0?*pdQ`I#9-h04ur%U4vSRGnT)v-O+3==Lnzn2gQ@u2TJcIMeZ?pq_4L znBnGfr_d?zHe0q0DNog4ICyT|^WG~^{W78>cVZ|2T6~g{9r^J~7$vF=mT;Zu6NM3W zxjH$17IxQy^b2O68CW?zau8MM;7r*-t1ESnYu8T?21_tcaJp>v-Mzj+!>P32WGeba z44=T3OmpQl-RTqt#JqEJuB7zxc_!$XVwK>JyyM#SZMf@b=VK2CDByhF3GD?9fOex` zkF>-E` zWuV8f2;2f+oU?x2lU1Ga`dG65&!HX|Pk42!cck2g)K9nznmjS?(Zg`(U7^R_23;mT z$s=$HD4ozz@temzTiNJz`!l`&XMmla=uwuyg~3eU<50;3I8sywZa2o7|o{y&Z&$iEGxwa)kk?h0f6pMy%g3N0ugha=?_|Tx@X5*2%huJyS%Tq{ zf`O{0h!8h}f`^Tzm(3RjR~HEeU2hwPkKRrU0zwRY;t~QP68xeJ0(|@e4F5k(lnvwm z8m6iS;eV$(RtyZkyfaD-R~q5Pwco0;^Ph@T$cXhY8Qn3p!*nA#CG5ZZ7_c~xvmM9i z<8DzxtM#CM`&SuGnx?7icuz&K)OnwPvDSnPcNp5KVjp4^iuCl}lj`mEzd54}^c|H{ zy=O*Y+^KH0L6ZtmNGA~D=NpXvX>xdfQGcM~R2aoQM<-zJK0)6*A)$m_3HvAnYv)@) z$a^7kSQ=F^u5`?BB&a-vVvGaBhm0hK5$J|Rzee%Bd@S}WH2%*W#rUlCC(Bncq-Fyy zro-Fh}#hQH|JlU=a#8+k5SWZ1W0jNcPo`WNo`1x?U~?i z>-#DGD%!gEdFUNH#dYQAuDFa~$9JU)sHHw_x2x8v>oV|jcxpD! zU$+3ugB8K5U=6SqSPyIj?)e`Fg)A>ZRwgw>q4V|}xrSgk2eC+_%~d7liiYdGoHZ-d zvrRnwF&s;&_MiVy`}%4*C_MbTTQ?(1)b8qSG4-yf;y4LNvU8{#RpF1otkGTnK2^H! zAvcP9KK}am{)=zQ(u>J`^!#Vc$G16wCQ$rU8BLWF9u%CvNWKt^$u&AgDr4m>c_HbF z_i+0C4%LwaopJ7VK|Mr#tBAjQJh`K;TDj2&oNi1%h^vLvF#_zViM6Be$#kIHf#04l zU$taN3N0FK1b>O#?7Z>dig>k*|wsHYFz}EYRni?dOT>eICLJ`22|K`#1 z6HkmO?^IdH(aHxpEDR4m16ncT`OtID#=4B-?+?^g^Z~KWO>{bSc@J5E!yXDLe!c&A z4+@U8FXXa3u*@dIcn=6{$Gvy!=+a`O=?5#NsKqLmQPfM7W!89e}3r>97cHx`sff6?+ATGFTs#f0=M@F0u zV>ees1&;l)5ZOODwPPUJ(~KaF@S|P%SiO|cI^$A6cw_cgsme;cGS`qD=_?WG4_l(g>t-6G9*UrfpFoE;4Xwt47nfMA}`&r+J4 zZYH~=zeW+rtaff+gw$$;B*IUPYaSrzVNnm5=IZkNvIZp&+P$!m8xD(GiTDWwQv0uF0B6pp^S54IM)+7)ZA z8s`Toh(fWIxjVrDIlu;XfD7Oe;_^W6Df3!2m=%eKf${WoW&m_u;3M_L%cY2MVEFC6 zkH6aomVo7D23N!h(c6w&+lUFnNi zZQwGAf)R?kSg|g#Zq-wPr3doS?&6Uq$X?>)*MSH4)^mA2*1#QoialbrL8DVN!v$sz z?}hi?DT33lf8&MYskZ@6(tek$&4%OX3M_iaDCxP(NY9@$ExEMzrv))ccRGZ&g&_YH z{f8%@@IJ5fp58wXg_d^65`HqX@AUT=dI0Fgv{9sC#)EO~=0~&Yn@(TR3A9bVBM){$ z3W*3p3U)5OPX4l4!9sv-!mteYct3R1L`UI!RPd#QM~zVN8S3x=MOt4EpN{kEL&DGA z(JbJy(w$cBQ5m!1TO~vaBsr59_%N+fy`{6{usxMxNVBPOrM3-Dw9PCFJMk;ielrJKLD)Fs=LS0=2sB{w|-YZE-pg3P_$J2v3j z@XJSp|KiBPHO(0$-~n(qapzVW<0+kY!y8VgxxUhzUqRO^JUfKwpqshlo4l)UH6?@u zh^-9S)x|vh*DL*p6hq*DeG(}Qt-7f1p!zQSKAed$;{&dCIj2_p7m?iP>TxzL5shE* z83A_PU4P62Fa5Mz3%`+Ywq0Yxu^%vcZU^7Qw=-U25}kxGKb=v6W)gjeW;DOQw=WR5 z?#}WLMIw=B+i&Gmbgr{AQj*H$XujcH2g^^*jF(mS<<15%UPZ#OF9}}W)w18RDIeu8 zU8fSf)#xj^O}MTpN7W|Ja#4l=s@1Gec;EUB_p7x6 zqw6W-8WJ;*)yKM*6sV^oo9QXTQ;XQU_~?QTdiF0LT)&zpy&mRgd64no%n-oDw)KMa z%wAwpfG(zuhxCR zd5?<~0)u`G3ENilfiAQ@2or)0xAk%4{fij7N;82I9I_K5I?7(@I&Xibg)n%6v|MX*`4H(Y(&8 zti&j4k?|`|V0+xFw>@&vv0c-qPN9(jC}{nvk~x#V*53_ZY?u3+rPL5C@+yH9mcPDU z=KT+X^{&jv=1yAY=7#f)<* ze977V9z(htkYD+{tF|G>uMYQ|z~gVg_yReN_;EK(JIk_C#D%UeLo4H8tKcksob zyc69AaREd9kf`fYcnh?E_7!;qzJJ2e_UMS&nOLPp;qI=EX;6Fu(A|9t9;$V6r8qCC zX^I3wa*K!D8ti2|tw#`z__!n5;!x>{vBrLEJC=X4qP@K&yN-??-6)Y#e{%fYQ%;uO z?;5;@bK94O3E5nP8q(q_8u!oh(nLqVwBx^c8uH1({)X}A>aQEp^V;COI+I!KWOYs+ z&qc(osayiaGcn`Pt}hBA2Z_HcPvIKNyk>xyvtu-cJx#y430e5rwp&Gi=Hjt@STETV z{_5K2H1oV=a{gj@DayBQFbK9}mI?&T2P}+ST~pLRoR|O@u?1CCl~E-!p($5g1$gIt z7KF;fF^NI%wj6tUK2Q6IfeY)VDwIeS2;E+bN1kT?(USW^A{#Qila4hOLmDhI)RX-n){AWdk0qg6t_2y`p!eB z#U3~f>rMg3kN2Pd-ki^*-kiJsKeC$!QY(|vTNg$CSkx+xHD^-e7*tUS3*yl7_?+}c z<2Ugqbp=qWKC<6Co@(a77s%9oVSv)~?!YGzUUhwoQ-M8Y!hnC-i z3SaW&QTjXt|NZJsyP^>4=)BCIoU=zDHfit_05~s)`1tHygG)Q@-N0YI=L`8`G$J19 z&AVL^eGXyu7ACt7^F>nC!m0J+3f$foL@}RV$9a(WZbX8ejvZ^0`?f)xHCcswvQi}Mxi@#Q&RGfzyQO)s zxbWe5sIQb+aA<<@X`mLL@1}@ZiLpTT&(Y3&i>aWp3fT;&aB-t$g{Y93Hjk~*N23`q zW0*j8qAb0a7`f;RPj}$qZcyQ&l|MSc#6t0keCM~P`_gC%l!A${jsMh5=>7{I{TOJB z(ST+pC}`(umi1h@=$9yVjTV-8U9jiN4|lG`kA~BTDh{Kb@+Sb3-Xu=2!)%$?h{d;s zyNcA`>7teLh4D}wW{wjb6#4@7;fmz5_)Jf0Ndb5*c>Ct6&dvjhLbNSBwiVu7xL@x2 z(gDytmxFr)l;Mohfv2D-7DTSxGy`GcXJO_qF zu`IC792}`>yqSM<4SC$@x~=hs%l=<3F_;D}%8?dE9jGbF6Jy2kQ)gmCf7oG4!-~?2 z{1DkbZcicrrd|DLpX>935J-1$_=b=pE;J1Nn&vJUhxiGDAOPlQE@>097VWcw&2rD0 ze(dVIb($**?Xej1N#)8~qxf8smSigvA>@|#xugKZ;Em5p{K~+!s`vNG+oCL@+t0!B zh8Ejrt@h$EWfk>X$4(?V}?SI19>gP*GF zL0|e2t}mgkdt$+|l8(7*BIc?ZUnSfd7py%~#zvcfF)v=kxcMW)&)AYzHHw_%HcF1( znF90-jA#IE8(hQKjGdNm=(t+>q4v|wS+san=H0FDkz6WQ&(64g2swJ9vNt@7=R+DN zlUY;VUF5FhF)fz~STEqIDb}bzjR=Uk>g6z)tN?JO8N@c@Qq2gojjt%+`| z_+~>!+|ey6Xw1=Qd#CE3iUsIjke!6DV=E+k3%oUId}<5F+4wuWx<69zN>#GXG;r^Y zS!Jn8J+U{Ar7u=qJw2ZGZ}Ca=)+z?_AYl{R3~i(x=Ha*L-$UY)&P5q~GqWQ$*>Sqs zG6$K)g%8fR4)3=PL30k*Aw-H*S^IB#SeUr0< zy@cv&r6)d_2>$qZD(I!a9*+KLbDR?|e}GxVHJk$bR6INl1~A3)t7XfOn_WE_}xgv5VGKrix~Lgt`L7JD|hpA#^j)Hfwia@lq+hveu^tAg5!a70UZ$-Pf zo-7r!Chd>zro6HHTgV^k5%?jVe5V|l-FCH}XU4+arz%VuV2pgk`Cr{*Gz}z?CoR0z zlKY^ho@lO~L{GYaMNIOF#*jl^eV_TQc$(0{c`L1vk7$#QjFf*y!c{CA#S=CfCpiGJ zJHf?|#y;u3z~9tdxm}P;&;KHT@`j<{hv&Jlz-gxaq*z01tDaE^W1*G|&LfT9MM9BG zbDpsVR`0Z3@0a7mRsBD)HF@@5e4INEBn(A^g4ASs-&_Uv^=l3AJYsHN%Y;C$%(|HL zcXF?<6v=vH2Sr(WE#O#t1uyO$z0VM&2(dyey2UN}d^(!^WCyyud3}(k{)}b_=vm$2 z-Z|b*Pwg=E<+G8lD{o_gUB_0(c3}kGE~Ty?#;Kyh_T+lt=cfU?Z5?(Q6p~!&dGyjS zFSws=qGsg?KMuRo~yB;xYMJrH|^)RplSHDO0C2zeBD}f&Mk_Xx#wfpc_u? z%zMEfwtf9L$@Et-Gi~rs_6YpPaKZ*y$e%fdZ1;-6?Se&9@MHD+5t-?Gjgn_`d3!%U zjD2qWMya%WRgj{z%K<7%Wd7U}`))Z~eiIjD=^DlUwtp`LYs2Eqna5=ZDq_nvqYbv* z@?LRkSNQu!#VX;=RBDP*je$xHjy$5b@o+k^b)_lVIM#ESa>*aczaVx?AmW%0B}#^6ENTW zQ^;JtPT#KwDH@V`X(oaSqByZDFZ>mP+gtr#Ak#+>!T5YD$7{+HcHCuPg*16hp{QN5 z>tC9upLd@<;o^yvd#~H83(W`f#;U-#g5`kA!U)Y9q+<r;qr97L`AJD=Ga{n)1# zS-vIDSyj4YgAz0<6r~;wr~IFn3n$zfLt_8mQ3lBIKS&q+ZfIU|XkmzFz|iQGcx( zw96{ggk#pFK;=Ulrma7Re&`Jzj+RaoO0kce&Z^DC#Vtc=$)|~&KQ%MX5u?SDAH>+! z>$j(_Fh^UhMMd&EPeTc%j<+vWbo_sBx9<9C2LjlBzV%eY?zdAksRFZ=C7V@SbvdQ& zV#PSO3p)`~$6Q&yu>Z9wzxV2_#0f*Gnh<9p}YbZ^N&Bh+qm*R02^iHR#tFF~oJSgX~04^|qdoHP94;@P6C@_+Q3%HzVW|CE0mw?Lbnvdl1lbkc)JD4!N=!i+#N?5FC5Prizb%li~9O* z`9Z9`3*=8lYX3|6pG;9zR(B=ez1D5d#?EBa?1K3rc|BlO{_42r&0y#yTw-&w&6XZo z+E`qm`%|ZFN_>piVa~Nj`fp%G{gXEqF3_~dko)bi&u=hd-dTx8pUr9DZAE)jjfu@9 z^QIDN;aum)&AZDx*jwB==tXvKmmp-*E?=Y@QCsJkzaL6dag|(h>}7{wYZwEB#j4bn zn=9Tqm?eID8~nk`k&Lq)$CDcyNB zZMe-dZBc|%1GKH4glq4;ZFm$~BeJxQzmf5dc){pXy9jx^vd&ne?r`U$_2cj z2kW!3;ecRtK~DTuZX2ETil?ZgImJqUwcl{@?ywIheQybBW|h5HCX7JHLZMp+CW+rI zD!n98a9_Z@9wfB(PDpbj#n4 znHcLj09AW;m)2l;t$y*38~734?EU*+qP)A$=uwgL;X!_T}oyC<=wgG*Q zydUAysCIzzbvOL>B!S()BBT1KH)tmQP(!T`#PXQE-(U{7zHH*?T6LCW0rjjCP_wv( z@TWvoD{Oo+3e`8$gE__n-H}S(cTZ*peRD``c)z!Ie;2a6_Rq>vI!8rSVDOVl7vaYxuRT+4 zlAMZRPx0WVn~NMy$8kjxB5}+wKU?ii6OjM{t{lyMvo;B;zyRIvyl{Z*EC`ma;U9p=~gzxYd=!J|V0M#)M*X8oV#KlIH1}5;{d$p;b31heN zBfzaLPB}K*Yme)MafF_a&z#=Y0^=LzKVC4V9X(%TqMEjj9~1quFgR%?(U8Go?BS%| zw8)|lJ+#Tupn9(J{d;pmoL~rv6aQb{y@&RjP@+N#VhaE{{pafA_1a34KPeC(WGAO^ z?Cu6)muf<8sjfDWDYWy(VkPH=5O1>PK6#hWZ&^IT%J}ktm&E#UVU9h32QeIq;x94b+a!y|((oHvQf1LL zKtIuxZUXWR9CXXR3J;`oRu4^?GeWU86z|tJAMYmo9z$uS*fD$?E5tFhIC0{3C8~?B z2=|Pxm4r2^PI5C;Qjd>NWeV@o2|m%aA_N!VXzsBCJhvKDw$XeWxt=MDt%uBMd{Od? zn$1FNm>u)@DTt~AlE}8Lh6qlKZRi;K)iEUMj#!~|KX^{}m;TCl=A1a|Ki#1Z2sh&^ zd&CX22oR&|*N#)k6%U43+}34v_+cQtXB`T*r!A2XbaMQ;OzT#6u#{aC)D+hm=+W)2sws8mRU*2{%2^EH%>!rgH z=2uTt+mlHRpsWYSdg=u|INk!`?mgrJQhZcPuQx{MN8Kba7he`{&q|2v$1Ou?k~AS4BkeyAsI0NefFdtVhItTed@s;k#Qq;vyWS7uJf zy2A((G2N->T&t~Z#Fv9dy}w(VzIL+ zzmDW^jO_9Lu)rn&o+a9LB|%uPIdW^#=inNka39{8Gc)Qt^$VJk6%m#lN^sK#N_a^0 zh(vMO!Jrr7p@^0%uOQmR;f>4l&peWy^eO+43er8(%5@7PL41@m^mcm#2&+frE}^n@ zrj%Fs7!z?xyCa9LjJVQbrE4|C)9@nmJ%2-Rh5_>xQdY8>Tp*_D| zwjCJcoK`142MjBAjVOkGD~5&_7rs!G#flGkONyf5fct;C#Va}rEIJ~Wp96#yTf9*0 zdlnx;Mv9{1fO~(sr7k)Wm7jABE8hOkp%4&{1%s=d%d}moCm;f6p;~=vD8^hEa@ujk zZYE0N>?z?!C1e8d$lAA`h5T-Dt@i)9pciKPWcZ#!K{^gkH_7==uWr(NVH*m4B8l69 Rmniz19(Eeppa3VL{{w2`zb^m) literal 0 HcmV?d00001 diff --git a/matlab/VisualISAM_gui.m b/matlab/examples/VisualISAM_gui.m similarity index 94% rename from matlab/VisualISAM_gui.m rename to matlab/examples/VisualISAM_gui.m index cdb2ddbaf..765a6f5ac 100644 --- a/matlab/VisualISAM_gui.m +++ b/matlab/examples/VisualISAM_gui.m @@ -230,12 +230,12 @@ global frame_i truth data noiseModels isam result options initOptions(handles) % Generate Data -[data,truth] = VisualISAMGenerateData(options); +[data,truth] = support.VisualISAMGenerateData(options); % Initialize and plot -[noiseModels,isam,result] = VisualISAMInitialize(data,truth,options); +[noiseModels,isam,result] = support.VisualISAMInitialize(data,truth,options); cla -VisualISAMPlot(truth, data, isam, result, options) +support.VisualISAMPlot(truth, data, isam, result, options) frame_i = 2; showFramei(hObject, handles) @@ -246,10 +246,10 @@ global frame_i truth data noiseModels isam result options while (frame_i Date: Tue, 24 Jul 2012 14:23:36 +0000 Subject: [PATCH 701/914] Wrapped GenericStereoFactor --- gtsam.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gtsam.h b/gtsam.h index af2dc3a3b..869ee6a09 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1446,6 +1446,17 @@ virtual class GeneralSFMFactor2 : gtsam::NonlinearFactor { gtsam::Point2 measured() const; }; + +#include +template +virtual class GenericStereoFactor : gtsam::NonlinearFactor { + GenericStereoFactor(const gtsam::StereoPoint2& measured, const gtsam::noiseModel::Base* noiseModel, + size_t poseKey, size_t landmarkKey, const gtsam::Cal3_S2Stereo* K); + gtsam::StereoPoint2 measured() const; + gtsam::Cal3_S2Stereo* calibration() const; +}; +typedef gtsam::GenericStereoFactor GenericStereoFactor3D; + } //\namespace gtsam //************************************************************************* From b63201b20d50a31785f65407033279cf19068796 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 24 Jul 2012 14:23:39 +0000 Subject: [PATCH 702/914] Updated remaining matlab examples --- matlab/examples/SFMExample.m | 2 +- matlab/examples/StereoVOExample.m | 52 +++++++++++------------- matlab/examples/StereoVOExample_large.m | 48 +++++++++------------- matlab/examples/gtsamExamples.fig | Bin 10455 -> 10561 bytes matlab/examples/gtsamExamples.m | 11 ++--- 5 files changed, 50 insertions(+), 63 deletions(-) diff --git a/matlab/examples/SFMExample.m b/matlab/examples/SFMExample.m index 1416fb7e3..2153ba647 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/examples/SFMExample.m @@ -22,7 +22,7 @@ options.nrCameras = 10; options.showImages = false; %% Generate data -[data,truth] = VisualISAMGenerateData(options); +[data,truth] = support.VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; diff --git a/matlab/examples/StereoVOExample.m b/matlab/examples/StereoVOExample.m index 98e1b5845..468123529 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/examples/StereoVOExample.m @@ -22,12 +22,13 @@ x1 = symbol('x',1); x2 = symbol('x',2); l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); %% Create graph container and add factors to it -graph = visualSLAM.Graph; +import gtsam.* +graph = NonlinearFactorGraph; %% add a constraint on the starting pose import gtsam.* first_pose = Pose3(); -graph.addPoseConstraint(x1, first_pose); +graph.add(NonlinearEqualityPose3(x1, first_pose)); %% Create realistic calibration and measurement noise model % format: fx fy skew cx cy baseline @@ -38,48 +39,41 @@ stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); %% Add measurements import gtsam.* % pose 1 -graph.addStereoMeasurement(StereoPoint2(520, 480, 440), stereo_model, x1, l1, K); -graph.addStereoMeasurement(StereoPoint2(120, 80, 440), stereo_model, x1, l2, K); -graph.addStereoMeasurement(StereoPoint2(320, 280, 140), stereo_model, x1, l3, K); +graph.add(GenericStereoFactor3D(StereoPoint2(520, 480, 440), stereo_model, x1, l1, K)); +graph.add(GenericStereoFactor3D(StereoPoint2(120, 80, 440), stereo_model, x1, l2, K)); +graph.add(GenericStereoFactor3D(StereoPoint2(320, 280, 140), stereo_model, x1, l3, K)); %pose 2 -graph.addStereoMeasurement(StereoPoint2(570, 520, 490), stereo_model, x2, l1, K); -graph.addStereoMeasurement(StereoPoint2( 70, 20, 490), stereo_model, x2, l2, K); -graph.addStereoMeasurement(StereoPoint2(320, 270, 115), stereo_model, x2, l3, K); +graph.add(GenericStereoFactor3D(StereoPoint2(570, 520, 490), stereo_model, x2, l1, K)); +graph.add(GenericStereoFactor3D(StereoPoint2( 70, 20, 490), stereo_model, x2, l2, K)); +graph.add(GenericStereoFactor3D(StereoPoint2(320, 270, 115), stereo_model, x2, l3, K)); %% Create initial estimate for camera poses and landmarks import gtsam.* -initialEstimate = visualSLAM.Values; -initialEstimate.insertPose(x1, first_pose); +initialEstimate = Values; +initialEstimate.insert(x1, first_pose); % noisy estimate for pose 2 -initialEstimate.insertPose(x2, Pose3(Rot3(), Point3(0.1,-.1,1.1))); -initialEstimate.insertPoint(l1, Point3( 1, 1, 5)); -initialEstimate.insertPoint(l2, Point3(-1, 1, 5)); -initialEstimate.insertPoint(l3, Point3( 0,-.5, 5)); +initialEstimate.insert(x2, Pose3(Rot3(), Point3(0.1,-.1,1.1))); +initialEstimate.insert(l1, Point3( 1, 1, 5)); +initialEstimate.insert(l2, Point3(-1, 1, 5)); +initialEstimate.insert(l3, Point3( 0,-.5, 5)); %% optimize fprintf(1,'Optimizing\n'); tic -result = graph.optimize(initialEstimate,1); +import gtsam.* +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); toc %% visualize initial trajectory, final trajectory, and final points cla; hold on; axis normal -axis([-1 6 -2 2 -1.5 1.5]); +axis([-1.5 1.5 -2 2 -1 6]); axis equal view(-38,12) +camup([0;1;0]); -% initial trajectory in red (rotated so Z is up) -T=initialEstimate.translations; -plot3(T(:,3),-T(:,1),-T(:,2), '-*r','LineWidth',2); - -% final trajectory in green (rotated so Z is up) -T=result.translations; -plot3(T(:,3),-T(:,1),-T(:,2), '-*g','LineWidth',2); -xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); - -% optimized 3D points (rotated so Z is up) -P = result.points(); -plot3(P(:,3),-P(:,1),-P(:,2),'*'); - +plot3DTrajectory(initialEstimate, 'r', 1, 0.3); +plot3DTrajectory(result, 'g', 1, 0.3); +plot3DPoints(result); diff --git a/matlab/examples/StereoVOExample_large.m b/matlab/examples/StereoVOExample_large.m index 282f7162c..fb45dd8a7 100644 --- a/matlab/examples/StereoVOExample_large.m +++ b/matlab/examples/StereoVOExample_large.m @@ -13,73 +13,65 @@ %% Load calibration import gtsam.* % format: fx fy skew cx cy baseline -calib = dlmread('../../examples/Data/VO_calibration.txt'); +calib = dlmread(support.findExampleDataFile('VO_calibration.txt')); K = Cal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); %% create empty graph and values -graph = visualSLAM.Graph; -initial = visualSLAM.Values; +graph = NonlinearFactorGraph; +initial = Values; %% load the initial poses from VO % row format: camera_id 4x4 pose (row, major) import gtsam.* fprintf(1,'Reading data\n'); -cameras = dlmread('../../examples/Data/VO_camera_poses_large.txt'); +cameras = dlmread(support.findExampleDataFile('VO_camera_poses_large.txt')); for i=1:size(cameras,1) pose = Pose3(reshape(cameras(i,2:17),4,4)'); - initial.insertPose(symbol('x',cameras(i,1)),pose); + initial.insert(symbol('x',cameras(i,1)),pose); end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z import gtsam.* -measurements = dlmread('../../examples/Data/VO_stereo_factors_large.txt'); +measurements = dlmread(support.findExampleDataFile('VO_stereo_factors_large.txt')); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) sf = measurements(i,:); - graph.addStereoMeasurement(StereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... - symbol('x', sf(1)), symbol('l', sf(2)), K); + graph.add(GenericStereoFactor3D(StereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ... + symbol('x', sf(1)), symbol('l', sf(2)), K)); if ~initial.exists(symbol('l',sf(2))) % 3D landmarks are stored in camera coordinates: transform % to world coordinates using the respective initial pose - pose = initial.pose(symbol('x', sf(1))); + pose = initial.at(symbol('x', sf(1))); world_point = pose.transform_from(Point3(sf(6),sf(7),sf(8))); - initial.insertPoint(symbol('l',sf(2)), world_point); + initial.insert(symbol('l',sf(2)), world_point); end end toc %% add a constraint on the starting pose key = symbol('x',1); -first_pose = initial.pose(key); -graph.addPoseConstraint(key, first_pose); +first_pose = initial.at(key); +graph.add(NonlinearEqualityPose3(key, first_pose)); %% optimize fprintf(1,'Optimizing\n'); tic -result = graph.optimize(initial,1); +optimizer = LevenbergMarquardtOptimizer(graph, initial); +result = optimizer.optimizeSafely(); toc %% visualize initial trajectory, final trajectory, and final points -figure(1); clf; hold on; +cla; hold on; -% initial trajectory in red (rotated so Z is up) -plot3(initial.zs(),-initial.xs(),-initial.ys(), '-*r','LineWidth',2); +plot3DTrajectory(initial, 'r', 1, 0.5); +plot3DTrajectory(result, 'g', 1, 0.5); +plot3DPoints(result); -% final trajectory in green (rotated so Z is up) -plot3(result.zs(),-result.xs(),-result.ys(), '-*g','LineWidth',2); -xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); - -% switch to XZ view -view([0 0]); - -% optimized 3D points (rotated so Z is up) -points = result.points(); -plot3(points(:,3),-points(:,1),-points(:,2),'.'); - -axis([0 100 -20 20 -5 20]); +axis([-5 20 -20 20 0 100]); axis equal view(3) +camup([0;1;0]); diff --git a/matlab/examples/gtsamExamples.fig b/matlab/examples/gtsamExamples.fig index d0037027882c4ee90461dea6d8bd52368f58de0a..e51c23468d21978f6cdd6c9f8d5d4650085db138 100644 GIT binary patch delta 10534 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 delta 10427 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 Date: Tue, 24 Jul 2012 14:50:01 +0000 Subject: [PATCH 703/914] Fixed serialization for LieVector and LieMatrix --- gtsam/base/LieMatrix.h | 14 ++++++++++++ gtsam/base/LieVector.h | 12 ++++++++++ tests/testSerializationSLAM.cpp | 40 ++++++++++++++++----------------- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/gtsam/base/LieMatrix.h b/gtsam/base/LieMatrix.h index 2ab15a054..5844e8201 100644 --- a/gtsam/base/LieMatrix.h +++ b/gtsam/base/LieMatrix.h @@ -22,6 +22,7 @@ #include #include #include +#include namespace gtsam { @@ -135,5 +136,18 @@ struct LieMatrix : public Matrix, public DerivedValue { static inline Vector Logmap(const LieMatrix& p) { return Eigen::Map(&p(0,0), p.dim()); } +private: + + // Serialization function + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("LieMatrix", + boost::serialization::base_object(*this)); + ar & boost::serialization::make_nvp("Matrix", + boost::serialization::base_object(*this)); + + } + }; } // \namespace gtsam diff --git a/gtsam/base/LieVector.h b/gtsam/base/LieVector.h index ef31e93cc..916730fd3 100644 --- a/gtsam/base/LieVector.h +++ b/gtsam/base/LieVector.h @@ -119,5 +119,17 @@ struct LieVector : public Vector, public DerivedValue { /** Logmap around identity - just returns with default cast back */ static inline Vector Logmap(const LieVector& p) { return p; } +private: + + // Serialization function + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("LieVector", + boost::serialization::base_object(*this)); + ar & boost::serialization::make_nvp("Vector", + boost::serialization::base_object(*this)); + } + }; } // \namespace gtsam diff --git a/tests/testSerializationSLAM.cpp b/tests/testSerializationSLAM.cpp index 27f74c222..c0cdb6a93 100644 --- a/tests/testSerializationSLAM.cpp +++ b/tests/testSerializationSLAM.cpp @@ -269,8 +269,8 @@ TEST (Serialization, factors) { Symbol b01('b',1), b02('b',2), b03('b',3), b04('b',4), b05('b',5), b06('b',6), b07('b',7), b08('b',8), b09('b',9), b10('b',10), b11('b',11), b12('b',12), b13('b',13); Values values; -// values.insert(a01, lieVector); -// values.insert(a02, lieMatrix); + values.insert(a01, lieVector); + values.insert(a02, lieMatrix); values.insert(a03, point2); values.insert(a04, stereoPoint2); values.insert(a05, point3); @@ -352,8 +352,8 @@ TEST (Serialization, factors) { NonlinearFactorGraph graph; -// graph.add(priorFactorLieVector); -// graph.add(priorFactorLieMatrix); + graph.add(priorFactorLieVector); + graph.add(priorFactorLieMatrix); graph.add(priorFactorPoint2); graph.add(priorFactorStereoPoint2); graph.add(priorFactorPoint3); @@ -366,8 +366,8 @@ TEST (Serialization, factors) { graph.add(priorFactorCalibratedCamera); graph.add(priorFactorSimpleCamera); -// graph.add(betweenFactorLieVector); -// graph.add(betweenFactorLieMatrix); + graph.add(betweenFactorLieVector); + graph.add(betweenFactorLieMatrix); graph.add(betweenFactorPoint2); graph.add(betweenFactorPoint3); graph.add(betweenFactorRot2); @@ -375,8 +375,8 @@ TEST (Serialization, factors) { graph.add(betweenFactorPose2); graph.add(betweenFactorPose3); -// graph.add(nonlinearEqualityLieVector); -// graph.add(nonlinearEqualityLieMatrix); + graph.add(nonlinearEqualityLieVector); + graph.add(nonlinearEqualityLieMatrix); graph.add(nonlinearEqualityPoint2); graph.add(nonlinearEqualityStereoPoint2); graph.add(nonlinearEqualityPoint3); @@ -412,8 +412,8 @@ TEST (Serialization, factors) { EXPECT(equalsObj(values)); EXPECT(equalsObj(graph)); -// EXPECT(equalsObj(priorFactorLieVector)); -// EXPECT(equalsObj(priorFactorLieMatrix)); + EXPECT(equalsObj(priorFactorLieVector)); + EXPECT(equalsObj(priorFactorLieMatrix)); EXPECT(equalsObj(priorFactorPoint2)); EXPECT(equalsObj(priorFactorStereoPoint2)); EXPECT(equalsObj(priorFactorPoint3)); @@ -426,8 +426,8 @@ TEST (Serialization, factors) { EXPECT(equalsObj(priorFactorCalibratedCamera)); EXPECT(equalsObj(priorFactorSimpleCamera)); -// EXPECT(equalsObj(betweenFactorLieVector)); -// EXPECT(equalsObj(betweenFactorLieMatrix)); + EXPECT(equalsObj(betweenFactorLieVector)); + EXPECT(equalsObj(betweenFactorLieMatrix)); EXPECT(equalsObj(betweenFactorPoint2)); EXPECT(equalsObj(betweenFactorPoint3)); EXPECT(equalsObj(betweenFactorRot2)); @@ -435,8 +435,8 @@ TEST (Serialization, factors) { EXPECT(equalsObj(betweenFactorPose2)); EXPECT(equalsObj(betweenFactorPose3)); -// EXPECT(equalsObj(nonlinearEqualityLieVector)); -// EXPECT(equalsObj(nonlinearEqualityLieMatrix)); + EXPECT(equalsObj(nonlinearEqualityLieVector)); + EXPECT(equalsObj(nonlinearEqualityLieMatrix)); EXPECT(equalsObj(nonlinearEqualityPoint2)); EXPECT(equalsObj(nonlinearEqualityStereoPoint2)); EXPECT(equalsObj(nonlinearEqualityPoint3)); @@ -472,8 +472,8 @@ TEST (Serialization, factors) { EXPECT(equalsXML(values)); EXPECT(equalsXML(graph)); -// EXPECT(equalsXML(priorFactorLieVector)); -// EXPECT(equalsXML(priorFactorLieMatrix)); + EXPECT(equalsXML(priorFactorLieVector)); + EXPECT(equalsXML(priorFactorLieMatrix)); EXPECT(equalsXML(priorFactorPoint2)); EXPECT(equalsXML(priorFactorStereoPoint2)); EXPECT(equalsXML(priorFactorPoint3)); @@ -486,8 +486,8 @@ TEST (Serialization, factors) { EXPECT(equalsXML(priorFactorCalibratedCamera)); EXPECT(equalsXML(priorFactorSimpleCamera)); -// EXPECT(equalsXML(betweenFactorLieVector)); -// EXPECT(equalsXML(betweenFactorLieMatrix)); + EXPECT(equalsXML(betweenFactorLieVector)); + EXPECT(equalsXML(betweenFactorLieMatrix)); EXPECT(equalsXML(betweenFactorPoint2)); EXPECT(equalsXML(betweenFactorPoint3)); EXPECT(equalsXML(betweenFactorRot2)); @@ -495,8 +495,8 @@ TEST (Serialization, factors) { EXPECT(equalsXML(betweenFactorPose2)); EXPECT(equalsXML(betweenFactorPose3)); -// EXPECT(equalsXML(nonlinearEqualityLieVector)); -// EXPECT(equalsXML(nonlinearEqualityLieMatrix)); + EXPECT(equalsXML(nonlinearEqualityLieVector)); + EXPECT(equalsXML(nonlinearEqualityLieMatrix)); EXPECT(equalsXML(nonlinearEqualityPoint2)); EXPECT(equalsXML(nonlinearEqualityStereoPoint2)); EXPECT(equalsXML(nonlinearEqualityPoint3)); From 6bee17b60332a19aabcd36dba64b92011c960d9e Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 24 Jul 2012 15:48:33 +0000 Subject: [PATCH 704/914] Added support for SPCG in matlab wrapper --- gtsam.h | 15 ++++++++ gtsam/nonlinear/DoglegOptimizer.h | 1 + gtsam/nonlinear/EasyFactorGraph.cpp | 2 +- gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 1 + gtsam/nonlinear/NonlinearOptimizer.h | 1 + .../SuccessiveLinearizationOptimizer.h | 35 ++++++++++++++++--- 6 files changed, 49 insertions(+), 6 deletions(-) diff --git a/gtsam.h b/gtsam.h index 869ee6a09..e48ced5ee 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1209,13 +1209,22 @@ virtual class NonlinearOptimizerParams { virtual class SuccessiveLinearizationParams : gtsam::NonlinearOptimizerParams { SuccessiveLinearizationParams(); + string getLinearSolverType() const; + + void setLinearSolverType(string solver); void setOrdering(const gtsam::Ordering& ordering); + bool isMultifrontal() const; bool isSequential() const; bool isCholmod() const; bool isCG() const; }; +#include +virtual class GaussNewtonParams : gtsam::SuccessiveLinearizationParams { + GaussNewtonParams(); +}; + #include virtual class LevenbergMarquardtParams : gtsam::SuccessiveLinearizationParams { LevenbergMarquardtParams(); @@ -1243,6 +1252,7 @@ virtual class DoglegParams : gtsam::SuccessiveLinearizationParams { }; virtual class NonlinearOptimizer { + gtsam::Values optimize(); gtsam::Values optimizeSafely(); double error() const; int iterations() const; @@ -1250,6 +1260,11 @@ virtual class NonlinearOptimizer { void iterate() const; }; +virtual class GaussNewtonOptimizer : gtsam::NonlinearOptimizer { + GaussNewtonOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues); + GaussNewtonOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues, const gtsam::GaussNewtonParams& params); +}; + virtual class DoglegOptimizer : gtsam::NonlinearOptimizer { DoglegOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues); DoglegOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues, const gtsam::DoglegParams& params); diff --git a/gtsam/nonlinear/DoglegOptimizer.h b/gtsam/nonlinear/DoglegOptimizer.h index 8a21dd96e..70d55d192 100644 --- a/gtsam/nonlinear/DoglegOptimizer.h +++ b/gtsam/nonlinear/DoglegOptimizer.h @@ -57,6 +57,7 @@ public: void setDeltaInitial(double deltaInitial) { this->deltaInitial = deltaInitial; } void setVerbosityDL(const std::string& verbosityDL) { this->verbosityDL = verbosityDLTranslator(verbosityDL); } +private: VerbosityDL verbosityDLTranslator(const std::string& verbosityDL) const; std::string verbosityDLTranslator(VerbosityDL verbosityDL) const; }; diff --git a/gtsam/nonlinear/EasyFactorGraph.cpp b/gtsam/nonlinear/EasyFactorGraph.cpp index 28e344efe..5031975f7 100644 --- a/gtsam/nonlinear/EasyFactorGraph.cpp +++ b/gtsam/nonlinear/EasyFactorGraph.cpp @@ -44,7 +44,7 @@ namespace gtsam { size_t verbosity) const { LevenbergMarquardtParams p; p.verbosity = (NonlinearOptimizerParams::Verbosity) verbosity; - p.linearSolverType = SuccessiveLinearizationParams::CG; + p.linearSolverType = SuccessiveLinearizationParams::CONJUGATE_GRADIENT; p.iterativeParams = boost::make_shared(); return optimizer(initialEstimate, p).optimizeSafely(); } diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index 5677f6c08..4b3f8d391 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -61,6 +61,7 @@ public: inline void setlambdaUpperBound(double value) { lambdaUpperBound = value; } inline void setVerbosityLM(const std::string &s) { verbosityLM = verbosityLMTranslator(s); } +private: VerbosityLM verbosityLMTranslator(const std::string &s) const; std::string verbosityLMTranslator(VerbosityLM value) const; }; diff --git a/gtsam/nonlinear/NonlinearOptimizer.h b/gtsam/nonlinear/NonlinearOptimizer.h index 1c071faef..03f3a5e34 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.h +++ b/gtsam/nonlinear/NonlinearOptimizer.h @@ -63,6 +63,7 @@ public: void setErrorTol(double value) { errorTol = value ; } void setVerbosity(const std::string &src) { verbosity = verbosityTranslator(src); } +private: Verbosity verbosityTranslator(const std::string &s) const; std::string verbosityTranslator(Verbosity value) const; }; diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index 2556134c0..b46686fe7 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -31,7 +31,7 @@ public: MULTIFRONTAL_QR, SEQUENTIAL_CHOLESKY, SEQUENTIAL_QR, - CG, /* Experimental Flag */ + CONJUGATE_GRADIENT, /* Experimental Flag */ CHOLMOD, /* Experimental Flag */ }; @@ -61,7 +61,7 @@ public: case CHOLMOD: std::cout << " linear solver type: CHOLMOD\n"; break; - case CG: + case CONJUGATE_GRADIENT: std::cout << " linear solver type: CG\n"; break; default: @@ -85,9 +85,7 @@ public: inline bool isCholmod() const { return (linearSolverType == CHOLMOD); } - inline bool isCG() const { return (linearSolverType == CG); } - - void setOrdering(const Ordering& ordering) { this->ordering = ordering; } + inline bool isCG() const { return (linearSolverType == CONJUGATE_GRADIENT); } GaussianFactorGraph::Eliminate getEliminationFunction() { switch (linearSolverType) { @@ -105,6 +103,33 @@ public: break; } } + + std::string getLinearSolverType() const { return linearSolverTranslator(linearSolverType); } + + void setLinearSolverType(const std::string& solver) { linearSolverType = linearSolverTranslator(solver); } + void setOrdering(const Ordering& ordering) { this->ordering = ordering; } + +private: + std::string linearSolverTranslator(LinearSolverType linearSolverType) const { + switch(linearSolverType) { + case MULTIFRONTAL_CHOLESKY: return "MULTIFRONTAL_CHOLESKY"; + case MULTIFRONTAL_QR: return "MULTIFRONTAL_QR"; + case SEQUENTIAL_CHOLESKY: return "SEQUENTIAL_CHOLESKY"; + case SEQUENTIAL_QR: return "SEQUENTIAL_QR"; + case CONJUGATE_GRADIENT: return "CONJUGATE_GRADIENT"; + case CHOLMOD: return "CHOLMOD"; + default: throw std::invalid_argument("Unknown linear solver type in SuccessiveLinearizationOptimizer"); + } + } + LinearSolverType linearSolverTranslator(const std::string& linearSolverType) const { + if(linearSolverType == "MULTIFRONTAL_CHOLESKY") return MULTIFRONTAL_CHOLESKY; + if(linearSolverType == "MULTIFRONTAL_QR") return MULTIFRONTAL_QR; + if(linearSolverType == "SEQUENTIAL_CHOLESKY") return SEQUENTIAL_CHOLESKY; + if(linearSolverType == "SEQUENTIAL_QR") return SEQUENTIAL_QR; + if(linearSolverType == "CONJUGATE_GRADIENT") return CONJUGATE_GRADIENT; + if(linearSolverType == "CHOLMOD") return CHOLMOD; + throw std::invalid_argument("Unknown linear solver type in SuccessiveLinearizationOptimizer"); + } }; } /* namespace gtsam */ From 1724267c852523e71d27da6dcc9c857388ab94f2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 24 Jul 2012 15:48:39 +0000 Subject: [PATCH 705/914] Updating matlab unit tests --- matlab/tests/testLocalizationExample.m | 37 +++++++++++--------- matlab/tests/testOdometryExample.m | 24 +++++++------ matlab/tests/testPlanarSLAMExample.m | 37 +++++++++++--------- matlab/tests/testPose2SLAMExample.m | 48 ++++++++++++++++---------- matlab/tests/testPose3SLAMExample.m | 35 ++++++++++--------- matlab/tests/testSFMExample.m | 36 +++++++++---------- 6 files changed, 118 insertions(+), 99 deletions(-) diff --git a/matlab/tests/testLocalizationExample.m b/matlab/tests/testLocalizationExample.m index 35c16d85f..bbe91641d 100644 --- a/matlab/tests/testLocalizationExample.m +++ b/matlab/tests/testLocalizationExample.m @@ -11,41 +11,46 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAM.Graph; +import gtsam.* +graph = NonlinearFactorGraph; %% Add two odometry factors import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addRelativePose(1, 2, odometry, odometryNoise); -graph.addRelativePose(2, 3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Add three "GPS" measurements % We use Pose2 Priors here with high variance on theta import gtsam.* -groundTruth = pose2SLAM.Values; -groundTruth.insertPose(1, Pose2(0.0, 0.0, 0.0)); -groundTruth.insertPose(2, Pose2(2.0, 0.0, 0.0)); -groundTruth.insertPose(3, Pose2(4.0, 0.0, 0.0)); +groundTruth = Values; +groundTruth.insert(1, Pose2(0.0, 0.0, 0.0)); +groundTruth.insert(2, Pose2(2.0, 0.0, 0.0)); +groundTruth.insert(3, Pose2(4.0, 0.0, 0.0)); model = noiseModel.Diagonal.Sigmas([0.1; 0.1; 10]); for i=1:3 - graph.addPosePrior(i, groundTruth.pose(i), model); + graph.add(PriorFactorPose2(i, groundTruth.at(i), model)); end %% Initialize to noisy points -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); +import gtsam.* +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,0); +import gtsam.* +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); %% Plot Covariance Ellipses -marginals = graph.marginals(result); +import gtsam.* +marginals = Marginals(graph, result); P={}; for i=1:result.size() - pose_i = result.pose(i); - CHECK('pose_i.equals(groundTruth.pose(i)',pose_i.equals(groundTruth.pose(i),1e-4)); + pose_i = result.at(i); + CHECK('pose_i.equals(groundTruth.pose(i)',pose_i.equals(groundTruth.at(i),1e-4)); P{i}=marginals.marginalCovariance(i); end diff --git a/matlab/tests/testOdometryExample.m b/matlab/tests/testOdometryExample.m index e793df9a8..17b90157a 100644 --- a/matlab/tests/testOdometryExample.m +++ b/matlab/tests/testOdometryExample.m @@ -11,33 +11,35 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = pose2SLAM.Graph; +import gtsam.* +graph = NonlinearFactorGraph; %% Add a Gaussian prior on pose x_1 import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta -graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add two odometry factors import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta -graph.addRelativePose(1, 2, odometry, odometryNoise); -graph.addRelativePose(2, 3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Initialize to noisy points import gtsam.* -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, 0.1)); +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,0); -marginals = graph.marginals(result); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); +marginals = Marginals(graph, result); marginals.marginalCovariance(1); %% Check first pose equality -pose_1 = result.pose(1); +pose_1 = result.at(1); CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); diff --git a/matlab/tests/testPlanarSLAMExample.m b/matlab/tests/testPlanarSLAMExample.m index 4c3e6c9da..c6d4cb352 100644 --- a/matlab/tests/testPlanarSLAMExample.m +++ b/matlab/tests/testPlanarSLAMExample.m @@ -24,49 +24,52 @@ i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); j1 = symbol('l',1); j2 = symbol('l',2); %% Create graph container and add factors to it -graph = planarSLAM.Graph; +import gtsam.* +graph = NonlinearFactorGraph; %% Add prior import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.addPosePrior(i1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(i1, priorMean, priorNoise)); % add directly to graph %% Add odometry import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(i1, i2, odometry, odometryNoise); -graph.addRelativePose(i2, i3, odometry, odometryNoise); +graph.add(BetweenFactorPose2(i1, i2, odometry, odometryNoise)); +graph.add(BetweenFactorPose2(i2, i3, odometry, odometryNoise)); %% Add bearing/range measurement factors import gtsam.* degrees = pi/180; brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); -graph.addBearingRange(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise); -graph.addBearingRange(i2, j1, Rot2(90*degrees), 2, brNoise); -graph.addBearingRange(i3, j2, Rot2(90*degrees), 2, brNoise); +graph.add(BearingRangeFactor2D(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise)); +graph.add(BearingRangeFactor2D(i2, j1, Rot2(90*degrees), 2, brNoise)); +graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); %% Initialize to noisy points import gtsam.* -initialEstimate = planarSLAM.Values; -initialEstimate.insertPose(i1, Pose2(0.5, 0.0, 0.2)); -initialEstimate.insertPose(i2, Pose2(2.3, 0.1,-0.2)); -initialEstimate.insertPose(i3, Pose2(4.1, 0.1, 0.1)); -initialEstimate.insertPoint(j1, Point2(1.8, 2.1)); -initialEstimate.insertPoint(j2, Point2(4.1, 1.8)); +initialEstimate = Values; +initialEstimate.insert(i1, Pose2(0.5, 0.0, 0.2)); +initialEstimate.insert(i2, Pose2(2.3, 0.1,-0.2)); +initialEstimate.insert(i3, Pose2(4.1, 0.1, 0.1)); +initialEstimate.insert(j1, Point2(1.8, 2.1)); +initialEstimate.insert(j2, Point2(4.1, 1.8)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,0); -marginals = graph.marginals(result); +import gtsam.* +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); +marginals = Marginals(graph, result); %% Check first pose and point equality import gtsam.* -pose_1 = result.pose(symbol('x',1)); +pose_1 = result.at(symbol('x',1)); marginals.marginalCovariance(symbol('x',1)); CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); -point_1 = result.point(symbol('l',1)); +point_1 = result.at(symbol('l',1)); marginals.marginalCovariance(symbol('l',1)); CHECK('point_1.equals(Point2(2,2),1e-4)',point_1.equals(Point2(2,2),1e-4)); diff --git a/matlab/tests/testPose2SLAMExample.m b/matlab/tests/testPose2SLAMExample.m index cd778cba3..9d934aab9 100644 --- a/matlab/tests/testPose2SLAMExample.m +++ b/matlab/tests/testPose2SLAMExample.m @@ -19,50 +19,60 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -graph = pose2SLAM.Graph; +import gtsam.* +graph = NonlinearFactorGraph; %% Add prior import gtsam.* % gaussian for prior priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.addPosePrior(1, priorMean, priorNoise); % add directly to graph +graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add odometry % general noisemodel for odometry import gtsam.* odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise); -graph.addRelativePose(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise); -graph.addRelativePose(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise); +graph.add(BetweenFactorPose2(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise)); +graph.add(BetweenFactorPose2(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise)); +graph.add(BetweenFactorPose2(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise)); +graph.add(BetweenFactorPose2(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise)); %% Add pose constraint import gtsam.* model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.addRelativePose(5, 2, Pose2(2.0, 0.0, pi/2), model); +graph.add(BetweenFactorPose2(5, 2, Pose2(2.0, 0.0, pi/2), model)); %% Initialize to noisy points import gtsam.* -initialEstimate = pose2SLAM.Values; -initialEstimate.insertPose(1, Pose2(0.5, 0.0, 0.2 )); -initialEstimate.insertPose(2, Pose2(2.3, 0.1,-0.2 )); -initialEstimate.insertPose(3, Pose2(4.1, 0.1, pi/2)); -initialEstimate.insertPose(4, Pose2(4.0, 2.0, pi )); -initialEstimate.insertPose(5, Pose2(2.1, 2.1,-pi/2)); +initialEstimate = Values; +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2 )); +initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2 )); +initialEstimate.insert(3, Pose2(4.1, 0.1, pi/2)); +initialEstimate.insert(4, Pose2(4.0, 2.0, pi )); +initialEstimate.insert(5, Pose2(2.1, 2.1,-pi/2)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initialEstimate,0); -resultSPCG = graph.optimizeSPCG(initialEstimate,0); +import gtsam.* +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimizeSafely(); + +%% Optimize using SPCG +%import gtsam.* +%params = LevenbergMarquardtParams; +%params.setLinearSolverType('CONJUGATE_GRADIENT'); +%optimizerSPCG = LevenbergMarquardtOptimizer(graph, initialEstimate, params); +%resultSPCG = optimizerSPCG.optimize(); %% Plot Covariance Ellipses -marginals = graph.marginals(result); +import gtsam.* +marginals = Marginals(graph, result); P = marginals.marginalCovariance(1); -pose_1 = result.pose(1); +pose_1 = result.at(1); CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); -poseSPCG_1 = resultSPCG.pose(1); -CHECK('poseSPCG_1.equals(Pose2,1e-4)',poseSPCG_1.equals(Pose2,1e-4)); +%poseSPCG_1 = resultSPCG.at(1); +%CHECK('poseSPCG_1.equals(Pose2,1e-4)',poseSPCG_1.equals(Pose2,1e-4)); diff --git a/matlab/tests/testPose3SLAMExample.m b/matlab/tests/testPose3SLAMExample.m index ac3c0d5bb..0d47990e8 100644 --- a/matlab/tests/testPose3SLAMExample.m +++ b/matlab/tests/testPose3SLAMExample.m @@ -17,31 +17,32 @@ p1 = hexagon.pose(1); %% create a Pose graph with one equality constraint and one measurement import gtsam.* -fg = pose3SLAM.Graph; -fg.addPoseConstraint(0, p0); +fg = NonlinearFactorGraph; +fg.add(NonlinearEqualityPose3(0, p0)); delta = p0.between(p1); covariance = noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -fg.addRelativePose(0,1, delta, covariance); -fg.addRelativePose(1,2, delta, covariance); -fg.addRelativePose(2,3, delta, covariance); -fg.addRelativePose(3,4, delta, covariance); -fg.addRelativePose(4,5, delta, covariance); -fg.addRelativePose(5,0, delta, covariance); +fg.add(BetweenFactorPose3(0,1, delta, covariance)); +fg.add(BetweenFactorPose3(1,2, delta, covariance)); +fg.add(BetweenFactorPose3(2,3, delta, covariance)); +fg.add(BetweenFactorPose3(3,4, delta, covariance)); +fg.add(BetweenFactorPose3(4,5, delta, covariance)); +fg.add(BetweenFactorPose3(5,0, delta, covariance)); %% Create initial config -initial = pose3SLAM.Values; +initial = Values; s = 0.10; -initial.insertPose(0, p0); -initial.insertPose(1, hexagon.pose(1).retract(s*randn(6,1))); -initial.insertPose(2, hexagon.pose(2).retract(s*randn(6,1))); -initial.insertPose(3, hexagon.pose(3).retract(s*randn(6,1))); -initial.insertPose(4, hexagon.pose(4).retract(s*randn(6,1))); -initial.insertPose(5, hexagon.pose(5).retract(s*randn(6,1))); +initial.insert(0, p0); +initial.insert(1, hexagon.pose(1).retract(s*randn(6,1))); +initial.insert(2, hexagon.pose(2).retract(s*randn(6,1))); +initial.insert(3, hexagon.pose(3).retract(s*randn(6,1))); +initial.insert(4, hexagon.pose(4).retract(s*randn(6,1))); +initial.insert(5, hexagon.pose(5).retract(s*randn(6,1))); %% optimize -result = fg.optimize(initial,0); +optimizer = LevenbergMarquardtOptimizer(fg, initial); +result = optimizer.optimizeSafely; -pose_1 = result.pose(1); +pose_1 = result.at(1); CHECK('pose_1.equals(Pose3,1e-4)',pose_1.equals(p1,1e-4)); diff --git a/matlab/tests/testSFMExample.m b/matlab/tests/testSFMExample.m index b3595dc18..d83517c7e 100644 --- a/matlab/tests/testSFMExample.m +++ b/matlab/tests/testSFMExample.m @@ -10,17 +10,19 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + options.triangle = false; options.nrCameras = 10; options.showImages = false; -[data,truth] = VisualISAMGenerateData(options); +[data,truth] = support.VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; -graph = visualSLAM.Graph; +graph = NonlinearFactorGraph; %% Add factors for all measurements import gtsam.* @@ -28,47 +30,43 @@ measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) j = data.J{i}{k}; - graph.addMeasurement(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('p',j), data.K); + graph.add(GenericProjectionFactorCal3_S2(data.Z{i}{k}, measurementNoise, symbol('x',i), symbol('p',j), data.K)); end end posePriorNoise = noiseModel.Diagonal.Sigmas(poseNoiseSigmas); -graph.addPosePrior(symbol('x',1), truth.cameras{1}.pose, posePriorNoise); +graph.add(PriorFactorPose3(symbol('x',1), truth.cameras{1}.pose, posePriorNoise)); pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); -graph.addPointPrior(symbol('p',1), truth.points{1}, pointPriorNoise); +graph.add(PriorFactorPose3(symbol('p',1), truth.points{1}, pointPriorNoise)); %% Initial estimate -initialEstimate = visualSLAM.Values; +initialEstimate = Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose; - initialEstimate.insertPose(symbol('x',i), pose_i); + initialEstimate.insert(symbol('x',i), pose_i); end for j=1:size(truth.points,2) point_j = truth.points{j}; - initialEstimate.insertPoint(symbol('p',j), point_j); + initialEstimate.insert(symbol('p',j), point_j); end %% Optimization import gtsam.* -parameters = LevenbergMarquardtParams; -optimizer = graph.optimizer(initialEstimate, parameters); +optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); for i=1:5 optimizer.iterate(); end result = optimizer.values(); %% Marginalization -marginals = graph.marginals(result); +marginals = Marginals(graph, result); marginals.marginalCovariance(symbol('p',1)); marginals.marginalCovariance(symbol('x',1)); %% Check optimized results, should be equal to ground truth -for i=1:size(truth.cameras,2) - pose_i = result.pose(symbol('x',i)); - CHECK('pose_i.equals(truth.cameras{i}.pose,1e-5)',pose_i.equals(truth.cameras{i}.pose,1e-5)) -end - -for j=1:size(truth.points,2) - point_j = result.point(symbol('p',j)); - CHECK('point_j.equals(truth.points{j},1e-5)',point_j.equals(truth.points{j},1e-5)) +keys = truth.keys; +for i=0:keys.size-1 + truth_i = truth.at(keys.at(i)); + result_i = result.at(keys.at(i)); + CHECK('result_i.equals(truth_i,1e-5)',result_i.equals(truth_i,1e-5)) end From a66a42189cd9bcb6c9a595a7650003e0c85279b4 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 24 Jul 2012 20:44:13 +0000 Subject: [PATCH 706/914] fixes for Boost 1.50 --- CMakeLists.txt | 2 +- gtsam/CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66fc43c50..d94f259f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,7 +109,7 @@ if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() find_package(Boost 1.43 COMPONENTS serialization system filesystem thread date_time regex REQUIRED) -set(GTSAM_BOOST_LIBRARIES ${Boost_SERIALIZATION_LIBRARY}) +set(GTSAM_BOOST_LIBRARIES ${Boost_SERIALIZATION_LIBRARY} ${Boost_SYSTEM_LIBRARY}) # General build settings include_directories( diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 39ae67507..56bce727b 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -85,7 +85,7 @@ message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") if (GTSAM_BUILD_STATIC_LIBRARY) message(STATUS "Building GTSAM - static") add_library(gtsam-static STATIC ${gtsam_srcs}) - target_link_libraries(gtsam-static ${Boost_SERIALIZATION_LIBRARY}) + target_link_libraries(gtsam-static ${GTSAM_BOOST_LIBRARIES}) set_target_properties(gtsam-static PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 @@ -100,7 +100,7 @@ endif (GTSAM_BUILD_STATIC_LIBRARY) if (GTSAM_BUILD_SHARED_LIBRARY) message(STATUS "Building GTSAM - shared") add_library(gtsam-shared SHARED ${gtsam_srcs}) - target_link_libraries(gtsam-shared ${Boost_SERIALIZATION_LIBRARY}) + target_link_libraries(gtsam-shared ${GTSAM_BOOST_LIBRARIES}) set_target_properties(gtsam-shared PROPERTIES OUTPUT_NAME gtsam CLEAN_DIRECT_OUTPUT 1 From 168ddf5457ce57377d49d6aabb42f336f27ca39e Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 24 Jul 2012 21:06:33 +0000 Subject: [PATCH 707/914] add Cal3DS2.calibrate() with fixed point iteration reorg nonlinear conjugate gradient solvers wrapper for the linear solvers --- gtsam/geometry/Cal3DS2.cpp | 30 ++++ gtsam/geometry/Cal3DS2.h | 3 + gtsam/geometry/Cal3_S2.h | 4 +- gtsam/geometry/tests/testCal3DS2.cpp | 10 +- gtsam/nonlinear/GaussNewtonOptimizer.cpp | 20 +-- gtsam/nonlinear/GradientDescentOptimizer.cpp | 138 ------------------ .../nonlinear/LevenbergMarquardtOptimizer.cpp | 35 +---- .../NonlinearConjugateGradientOptimizer.cpp | 64 ++++++++ ... => NonlinearConjugateGradientOptimizer.h} | 114 +++++---------- .../SuccessiveLinearizationOptimizer.cpp | 81 ++++++++++ .../SuccessiveLinearizationOptimizer.h | 42 +----- tests/testGradientDescentOptimizer.cpp | 56 +------ 12 files changed, 236 insertions(+), 361 deletions(-) delete mode 100644 gtsam/nonlinear/GradientDescentOptimizer.cpp create mode 100644 gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp rename gtsam/nonlinear/{GradientDescentOptimizer.h => NonlinearConjugateGradientOptimizer.h} (71%) create mode 100644 gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp diff --git a/gtsam/geometry/Cal3DS2.cpp b/gtsam/geometry/Cal3DS2.cpp index dcb6d6d54..8f15f81d2 100644 --- a/gtsam/geometry/Cal3DS2.cpp +++ b/gtsam/geometry/Cal3DS2.cpp @@ -78,6 +78,36 @@ Point2 Cal3DS2::uncalibrate(const Point2& p, return Point2(fx_* x2 + s_ * y2 + u0_, fy_ * y2 + v0_) ; } +/* ************************************************************************* */ +Point2 Cal3DS2::calibrate(const Point2& pi, const double tol) const { + // Use the following fixed point iteration to invert the radial distortion. + // pn_{t+1} = (inv(K)*pi - dp(pn_{t})) / g(pn_{t}) + + const Point2 invKPi ((1 / fx_) * (pi.x() - u0_ - (s_ / fy_) * (pi.y() - v0_)), + (1 / fy_) * (pi.y() - v0_)); + + // initialize by ignoring the distortion at all, might be problematic for pixels around boundary + Point2 pn = invKPi; + + // iterate until the uncalibrate is close to the actual pixel coordinate + const int maxIterations = 10; + int iteration; + for ( iteration = 0 ; iteration < maxIterations ; ++iteration ) { + if ( uncalibrate(pn).dist(pi) <= tol ) break; + const double x = pn.x(), y = pn.y(), xy = x*y, xx = x*x, yy = y*y ; + const double r = xx + yy ; + const double g = (1+k1_*r+k2_*r*r) ; + const double dx = 2*k3_*xy + k4_*(r+2*xx) ; + const double dy = 2*k4_*xy + k3_*(r+2*yy) ; + pn = (invKPi - Point2(dx,dy))/g ; + } + + if ( iteration >= maxIterations ) + throw std::runtime_error("Cal3DS2::calibrate fails to converge. need a better initialization"); + + return pn; +} + /* ************************************************************************* */ Matrix Cal3DS2::D2d_intrinsic(const Point2& p) const { //const double fx = fx_, fy = fy_, s = s_ ; diff --git a/gtsam/geometry/Cal3DS2.h b/gtsam/geometry/Cal3DS2.h index d26b9a19d..d33b452c1 100644 --- a/gtsam/geometry/Cal3DS2.h +++ b/gtsam/geometry/Cal3DS2.h @@ -96,6 +96,9 @@ public: boost::optional H1 = boost::none, boost::optional H2 = boost::none) const ; + /// Conver a pixel coordinate to ideal coordinate + Point2 calibrate(const Point2& p, const double tol=1e-5) const; + /// Derivative of uncalibrate wrpt intrinsic coordinates Matrix D2d_intrinsic(const Point2& p) const ; diff --git a/gtsam/geometry/Cal3_S2.h b/gtsam/geometry/Cal3_S2.h index 9d6cb4fbf..3c88aaeb2 100644 --- a/gtsam/geometry/Cal3_S2.h +++ b/gtsam/geometry/Cal3_S2.h @@ -136,8 +136,8 @@ namespace gtsam { /// convert image coordinates uv to intrinsic coordinates xy Point2 calibrate(const Point2& p) const { const double u = p.x(), v = p.y(); - return Point2((1 / fx_) * (u - u0_ - (s_ / fy_) * (v - v0_)), (1 / fy_) - * (v - v0_)); + return Point2((1 / fx_) * (u - u0_ - (s_ / fy_) * (v - v0_)), + (1 / fy_) * (v - v0_)); } /// @} diff --git a/gtsam/geometry/tests/testCal3DS2.cpp b/gtsam/geometry/tests/testCal3DS2.cpp index 9f8777e49..c73ae1182 100644 --- a/gtsam/geometry/tests/testCal3DS2.cpp +++ b/gtsam/geometry/tests/testCal3DS2.cpp @@ -29,7 +29,7 @@ static Cal3DS2 K(500, 100, 0.1, 320, 240, 1e-3, 2.0*1e-3, 3.0*1e-3, 4.0*1e-3); static Point2 p(2,3); /* ************************************************************************* */ -TEST( Cal3DS2, calibrate) +TEST( Cal3DS2, uncalibrate) { Vector k = K.k() ; double r = p.x()*p.x() + p.y()*p.y() ; @@ -43,6 +43,14 @@ TEST( Cal3DS2, calibrate) CHECK(assert_equal(q,p_i)); } +TEST( Cal3DS2, calibrate ) +{ + Point2 pn(0.5, 0.5); + Point2 pi = K.uncalibrate(pn); + Point2 pn_hat = K.calibrate(pi); + CHECK( pn.equals(pn_hat, 1e-5)); +} + Point2 uncalibrate_(const Cal3DS2& k, const Point2& pt) { return k.uncalibrate(pt); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/GaussNewtonOptimizer.cpp b/gtsam/nonlinear/GaussNewtonOptimizer.cpp index c447a39e3..05ba56a21 100644 --- a/gtsam/nonlinear/GaussNewtonOptimizer.cpp +++ b/gtsam/nonlinear/GaussNewtonOptimizer.cpp @@ -16,8 +16,6 @@ * @date Feb 26, 2012 */ -#include -#include #include using namespace std; @@ -32,22 +30,8 @@ void GaussNewtonOptimizer::iterate() { // Linearize graph GaussianFactorGraph::shared_ptr linear = graph_.linearize(current.values, *params_.ordering); - // Optimize - VectorValues delta; - { - if ( params_.isMultifrontal() ) { - delta = GaussianJunctionTree(*linear).optimize(params_.getEliminationFunction()); - } - else if ( params_.isSequential() ) { - delta = gtsam::optimize(*EliminationTree::Create(*linear)->eliminate(params_.getEliminationFunction())); - } - else if ( params_.isCG() ) { - throw runtime_error("todo: "); - } - else { - throw runtime_error("Optimization parameter is invalid: GaussNewtonParams::elimination"); - } - } + // Solve Factor Graph + const VectorValues delta = solveGaussianFactorGraph(*linear, params_); // Maybe show output if(params_.verbosity >= NonlinearOptimizerParams::DELTA) delta.print("delta"); diff --git a/gtsam/nonlinear/GradientDescentOptimizer.cpp b/gtsam/nonlinear/GradientDescentOptimizer.cpp deleted file mode 100644 index 4a471de4d..000000000 --- a/gtsam/nonlinear/GradientDescentOptimizer.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/** - * @file GradientDescentOptimizer.cpp - * @brief - * @author ydjian - * @date Jun 11, 2012 - */ - -#include -#include -#include -#include -#include - -#include - -using namespace std; - -namespace gtsam { - -/** - * Return the gradient vector of a nonlinear factor given a linearization point and a variable ordering - * Can be moved to NonlinearFactorGraph.h if desired - */ -void gradientInPlace(const NonlinearFactorGraph &nfg, const Values &values, const Ordering &ordering, VectorValues &g) { - - // Linearize graph - GaussianFactorGraph::shared_ptr linear = nfg.linearize(values, ordering); - FactorGraph jfg; jfg.reserve(linear->size()); - BOOST_FOREACH(const GaussianFactorGraph::sharedFactor& factor, *linear) { - if(boost::shared_ptr jf = boost::dynamic_pointer_cast(factor)) - jfg.push_back((jf)); - else - jfg.push_back(boost::make_shared(*factor)); - } - - // compute the gradient direction - gradientAtZero(jfg, g); -} - - -/* ************************************************************************* */ -void GradientDescentOptimizer::iterate() { - - - // Pull out parameters we'll use - const NonlinearOptimizerParams::Verbosity nloVerbosity = params_.verbosity; - - // compute the gradient vector - gradientInPlace(graph_, state_.values, *ordering_, *gradient_); - - /* normalize it such that it becomes a unit vector */ - const double g = gradient_->vector().norm(); - gradient_->vector() /= g; - - // perform the golden section search algorithm to decide the the optimal step size - // detail refer to http://en.wikipedia.org/wiki/Golden_section_search - VectorValues step = VectorValues::SameStructure(*gradient_); - const double phi = 0.5*(1.0+std::sqrt(5.0)), resphi = 2.0 - phi, tau = 1e-5; - double minStep = -1.0, maxStep = 0, - newStep = minStep + (maxStep-minStep) / (phi+1.0) ; - - step.vector() = newStep * gradient_->vector(); - Values newValues = state_.values.retract(step, *ordering_); - double newError = graph_.error(newValues); - - if ( nloVerbosity ) { - std::cout << "minStep = " << minStep << ", maxStep = " << maxStep << ", newStep = " << newStep << ", newError = " << newError << std::endl; - } - - while (true) { - const bool flag = (maxStep - newStep > newStep - minStep) ? true : false ; - const double testStep = flag ? - newStep + resphi * (maxStep - newStep) : newStep - resphi * (newStep - minStep); - - if ( (maxStep- minStep) < tau * (std::fabs(testStep) + std::fabs(newStep)) ) { - newStep = 0.5*(minStep+maxStep); - step.vector() = newStep * gradient_->vector(); - newValues = state_.values.retract(step, *ordering_); - newError = graph_.error(newValues); - - if ( newError < state_.error ) { - state_.values = state_.values.retract(step, *ordering_); - state_.error = graph_.error(state_.values); - } - - break; - } - - step.vector() = testStep * gradient_->vector(); - const Values testValues = state_.values.retract(step, *ordering_); - const double testError = graph_.error(testValues); - - // update the working range - if ( testError >= newError ) { - if ( flag ) maxStep = testStep; - else minStep = testStep; - } - else { - if ( flag ) { - minStep = newStep; - newStep = testStep; - newError = testError; - } - else { - maxStep = newStep; - newStep = testStep; - newError = testError; - } - } - - if ( nloVerbosity ) { - std::cout << "minStep = " << minStep << ", maxStep = " << maxStep << ", newStep = " << newStep << ", newError = " << newError << std::endl; - } - } - // Increment the iteration counter - ++state_.iterations; -} - -double ConjugateGradientOptimizer::System::error(const State &state) const { - return graph_.error(state); -} - -ConjugateGradientOptimizer::System::Gradient ConjugateGradientOptimizer::System::gradient(const State &state) const { - Gradient result = state.zeroVectors(ordering_); - gradientInPlace(graph_, state, ordering_, result); - return result; -} -ConjugateGradientOptimizer::System::State ConjugateGradientOptimizer::System::advance(const State ¤t, const double alpha, const Gradient &g) const { - Gradient step = g; - step.vector() *= alpha; - return current.retract(step, ordering_); -} - -Values ConjugateGradientOptimizer::optimize() { - return conjugateGradient(System(graph_, *ordering_), initialEstimate_, params_, !cg_); -} - -} /* namespace gtsam */ diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 15c2262fa..256763c59 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -19,12 +19,9 @@ #include #include +#include #include // For NegativeMatrixException -#include -#include -#include -#include #include #include @@ -106,34 +103,8 @@ void LevenbergMarquardtOptimizer::iterate() { // Try solving try { - - // Optimize - VectorValues delta; - if ( params_.isMultifrontal() ) { - delta = GaussianJunctionTree(dampedSystem).optimize(params_.getEliminationFunction()); - } - else if ( params_.isSequential() ) { - delta = gtsam::optimize(*EliminationTree::Create(dampedSystem)->eliminate(params_.getEliminationFunction())); - } - else if ( params_.isCG() ) { - - if ( !params_.iterativeParams ) throw runtime_error("LMSolver: cg parameter has to be assigned ..."); - - if ( boost::dynamic_pointer_cast(params_.iterativeParams)) { - SimpleSPCGSolver solver (dampedSystem, *boost::dynamic_pointer_cast(params_.iterativeParams)); - delta = solver.optimize(); - } - else if ( boost::dynamic_pointer_cast(params_.iterativeParams) ) { - SubgraphSolver solver (dampedSystem, *boost::dynamic_pointer_cast(params_.iterativeParams)); - delta = solver.optimize(); - } - else { - throw runtime_error("LMSolver: special cg parameter type is not handled in LM solver ..."); - } - } - else { - throw runtime_error("Optimization parameter is invalid: LevenbergMarquardtParams::elimination"); - } + // Solve Damped Gaussian Factor Graph + const VectorValues delta = solveGaussianFactorGraph(dampedSystem, params_); if (lmVerbosity >= LevenbergMarquardtParams::TRYLAMBDA) cout << "linear delta norm = " << delta.vector().norm() << endl; if (lmVerbosity >= LevenbergMarquardtParams::TRYDELTA) delta.print("delta"); diff --git a/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp b/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp new file mode 100644 index 000000000..f0b3852ef --- /dev/null +++ b/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp @@ -0,0 +1,64 @@ +/** + * @file GradientDescentOptimizer.cpp + * @brief + * @author ydjian + * @date Jun 11, 2012 + */ + +#include +#include +#include +#include +#include + +#include + +using namespace std; + +namespace gtsam { + +/* Return the gradient vector of a nonlinear factor given a linearization point and a variable ordering + * Can be moved to NonlinearFactorGraph.h if desired */ +void gradientInPlace(const NonlinearFactorGraph &nfg, const Values &values, const Ordering &ordering, VectorValues &g) { + // Linearize graph + GaussianFactorGraph::shared_ptr linear = nfg.linearize(values, ordering); + FactorGraph jfg; jfg.reserve(linear->size()); + BOOST_FOREACH(const GaussianFactorGraph::sharedFactor& factor, *linear) { + if(boost::shared_ptr jf = boost::dynamic_pointer_cast(factor)) + jfg.push_back((jf)); + else + jfg.push_back(boost::make_shared(*factor)); + } + // compute the gradient direction + gradientAtZero(jfg, g); +} + +double NonlinearConjugateGradientOptimizer::System::error(const State &state) const { + return graph_.error(state); +} + +NonlinearConjugateGradientOptimizer::System::Gradient NonlinearConjugateGradientOptimizer::System::gradient(const State &state) const { + Gradient result = state.zeroVectors(ordering_); + gradientInPlace(graph_, state, ordering_, result); + return result; +} +NonlinearConjugateGradientOptimizer::System::State NonlinearConjugateGradientOptimizer::System::advance(const State ¤t, const double alpha, const Gradient &g) const { + Gradient step = g; + step.vector() *= alpha; + return current.retract(step, ordering_); +} + +void NonlinearConjugateGradientOptimizer::iterate() { + size_t dummy ; + boost::tie(state_.values, dummy) = nonlinearConjugateGradient(System(graph_, *ordering_), state_.values, params_, true /* single iterations */); + ++state_.iterations; + state_.error = graph_.error(state_.values); +} + +const Values& NonlinearConjugateGradientOptimizer::optimize() { + boost::tie(state_.values, state_.iterations) = nonlinearConjugateGradient(System(graph_, *ordering_), state_.values, params_, false /* up to convergent */); + state_.error = graph_.error(state_.values); + return state_.values; +} + +} /* namespace gtsam */ diff --git a/gtsam/nonlinear/GradientDescentOptimizer.h b/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.h similarity index 71% rename from gtsam/nonlinear/GradientDescentOptimizer.h rename to gtsam/nonlinear/NonlinearConjugateGradientOptimizer.h index 2407ee39f..5bac11f5e 100644 --- a/gtsam/nonlinear/GradientDescentOptimizer.h +++ b/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.h @@ -1,7 +1,7 @@ /** * @file GradientDescentOptimizer.cpp * @brief - * @author ydjian + * @author Yong-Dian Jian * @date Jun 11, 2012 */ @@ -9,75 +9,31 @@ #include #include +#include namespace gtsam { -/* an implementation of gradient-descent method using the NLO interface */ - -class GradientDescentState : public NonlinearOptimizerState { - +/** An implementation of the nonlinear cg method using the template below */ +class NonlinearConjugateGradientState : public NonlinearOptimizerState { public: - typedef NonlinearOptimizerState Base; - - GradientDescentState(const NonlinearFactorGraph& graph, const Values& values) + NonlinearConjugateGradientState(const NonlinearFactorGraph& graph, const Values& values) : Base(graph, values) {} }; -class GradientDescentOptimizer : public NonlinearOptimizer { - -public: - - typedef boost::shared_ptr shared_ptr; - typedef NonlinearOptimizer Base; - typedef GradientDescentState States; - typedef NonlinearOptimizerParams Parameters; - -protected: - - Parameters params_; - States state_; - Ordering::shared_ptr ordering_; - VectorValues::shared_ptr gradient_; - -public: - - GradientDescentOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, const Parameters& params = Parameters()) - : Base(graph), params_(params), state_(graph, initialValues), - ordering_(initialValues.orderingArbitrary()), - gradient_(new VectorValues(initialValues.zeroVectors(*ordering_))) {} - - virtual ~GradientDescentOptimizer() {} - - virtual void iterate(); - -protected: - - virtual const NonlinearOptimizerState& _state() const { return state_; } - virtual const NonlinearOptimizerParams& _params() const { return params_; } -}; - - -/** - * An implementation of the nonlinear cg method using the template below - */ - -class ConjugateGradientOptimizer { - +class NonlinearConjugateGradientOptimizer : public NonlinearOptimizer { + /* a class for the nonlinearConjugateGradient template */ class System { - public: - typedef Values State; typedef VectorValues Gradient; + typedef NonlinearOptimizerParams Parameters; protected: - - NonlinearFactorGraph graph_; - Ordering ordering_; + const NonlinearFactorGraph &graph_; + const Ordering &ordering_; public: - System(const NonlinearFactorGraph &graph, const Ordering &ordering): graph_(graph), ordering_(ordering) {} double error(const State &state) const ; Gradient gradient(const State &state) const ; @@ -85,35 +41,32 @@ class ConjugateGradientOptimizer { }; public: - + typedef NonlinearOptimizer Base; + typedef NonlinearConjugateGradientState States; typedef NonlinearOptimizerParams Parameters; - typedef boost::shared_ptr shared_ptr; + typedef boost::shared_ptr shared_ptr; protected: - - NonlinearFactorGraph graph_; - Values initialEstimate_; + States state_; Parameters params_; Ordering::shared_ptr ordering_; VectorValues::shared_ptr gradient_; - bool cg_; public: - ConjugateGradientOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, - const Parameters& params = Parameters(), const bool cg = true) - : graph_(graph), initialEstimate_(initialValues), params_(params), - ordering_(initialValues.orderingArbitrary()), - gradient_(new VectorValues(initialValues.zeroVectors(*ordering_))), - cg_(cg) {} + NonlinearConjugateGradientOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, + const Parameters& params = Parameters()) + : Base(graph), state_(graph, initialValues), params_(params), ordering_(initialValues.orderingArbitrary()), + gradient_(new VectorValues(initialValues.zeroVectors(*ordering_))){} - virtual ~ConjugateGradientOptimizer() {} - virtual Values optimize () ; + virtual ~NonlinearConjugateGradientOptimizer() {} + virtual void iterate(); + virtual const Values& optimize (); + virtual const NonlinearOptimizerState& _state() const { return state_; } + virtual const NonlinearOptimizerParams& _params() const { return params_; } }; -/** - * Implement the golden-section line search algorithm - */ +/** Implement the golden-section line search algorithm */ template double lineSearch(const S &system, const V currentValues, const W &gradient) { @@ -171,18 +124,20 @@ double lineSearch(const S &system, const V currentValues, const W &gradient) { * * The last parameter is a switch between gradient-descent and conjugate gradient */ - template -V conjugateGradient(const S &system, const V &initial, const NonlinearOptimizerParams ¶ms, const bool gradientDescent) { +boost::tuple nonlinearConjugateGradient(const S &system, const V &initial, const NonlinearOptimizerParams ¶ms, const bool singleIteration, const bool gradientDescent = false) { - GTSAM_CONCEPT_MANIFOLD_TYPE(V); + // GTSAM_CONCEPT_MANIFOLD_TYPE(V); + + Index iteration = 0; // check if we're already close enough double currentError = system.error(initial); if(currentError <= params.errorTol) { - if (params.verbosity >= NonlinearOptimizerParams::ERROR) + if (params.verbosity >= NonlinearOptimizerParams::ERROR){ std::cout << "Exiting, as error = " << currentError << " < " << params.errorTol << std::endl; - return initial; + } + return boost::tie(initial, iteration); } V currentValues = initial; @@ -194,14 +149,12 @@ V conjugateGradient(const S &system, const V &initial, const NonlinearOptimizerP double alpha = lineSearch(system, currentValues, direction); currentValues = system.advance(prevValues, alpha, direction); currentError = system.error(currentValues); - Index iteration = 0; // Maybe show output if (params.verbosity >= NonlinearOptimizerParams::ERROR) std::cout << "Initial error: " << currentError << std::endl; // Iterative loop do { - if ( gradientDescent == true) { direction = system.gradient(currentValues); } @@ -222,13 +175,14 @@ V conjugateGradient(const S &system, const V &initial, const NonlinearOptimizerP // Maybe show output if(params.verbosity >= NonlinearOptimizerParams::ERROR) std::cout << "currentError: " << currentError << std::endl; } while( ++iteration < params.maxIterations && + !singleIteration && !checkConvergence(params.relativeErrorTol, params.absoluteErrorTol, params.errorTol, prevError, currentError, params.verbosity)); // Printing if verbose if (params.verbosity >= NonlinearOptimizerParams::ERROR && iteration >= params.maxIterations) - std::cout << "Terminating because reached maximum iterations" << std::endl; + std::cout << "nonlinearConjugateGradient: Terminating because reached maximum iterations" << std::endl; - return currentValues; + return boost::tie(currentValues, iteration); } diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp new file mode 100644 index 000000000..0fe0440ae --- /dev/null +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp @@ -0,0 +1,81 @@ +/** + * @file SuccessiveLinearizationOptimizer.cpp + * @brief + * @date Jul 24, 2012 + * @author Yong-Dian Jian + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gtsam { + +void SuccessiveLinearizationParams::print(const std::string& str) const { + NonlinearOptimizerParams::print(str); + switch ( linearSolverType ) { + case MULTIFRONTAL_CHOLESKY: + std::cout << " linear solver type: MULTIFRONTAL CHOLESKY\n"; + break; + case MULTIFRONTAL_QR: + std::cout << " linear solver type: MULTIFRONTAL QR\n"; + break; + case SEQUENTIAL_CHOLESKY: + std::cout << " linear solver type: SEQUENTIAL CHOLESKY\n"; + break; + case SEQUENTIAL_QR: + std::cout << " linear solver type: SEQUENTIAL QR\n"; + break; + case CHOLMOD: + std::cout << " linear solver type: CHOLMOD\n"; + break; + case CG: + std::cout << " linear solver type: CG\n"; + break; + default: + std::cout << " linear solver type: (invalid)\n"; + break; + } + + if(ordering) + std::cout << " ordering: custom\n"; + else + std::cout << " ordering: COLAMD\n"; + + std::cout.flush(); +} + +VectorValues solveGaussianFactorGraph(const GaussianFactorGraph &gfg, const SuccessiveLinearizationParams ¶ms) { + VectorValues delta; + if ( params.isMultifrontal() ) { + delta = GaussianJunctionTree(gfg).optimize(params.getEliminationFunction()); + } + else if ( params.isSequential() ) { + delta = gtsam::optimize(*EliminationTree::Create(gfg)->eliminate(params.getEliminationFunction())); + } + else if ( params.isCG() ) { + if ( !params.iterativeParams ) throw std::runtime_error("solveGaussianFactorGraph: cg parameter has to be assigned ..."); + if ( boost::dynamic_pointer_cast(params.iterativeParams)) { + SimpleSPCGSolver solver (gfg, *boost::dynamic_pointer_cast(params.iterativeParams)); + delta = solver.optimize(); + } + else if ( boost::dynamic_pointer_cast(params.iterativeParams) ) { + SubgraphSolver solver (gfg, *boost::dynamic_pointer_cast(params.iterativeParams)); + delta = solver.optimize(); + } + else { + throw std::runtime_error("solveGaussianFactorGraph: special cg parameter type is not handled in LM solver ..."); + } + } + else { + throw std::runtime_error("solveGaussianFactorGraph: Optimization parameter is invalid"); + } + return delta; +} + +} diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index 7033613ac..be66f37d4 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -40,43 +40,8 @@ public: IterativeOptimizationParameters::shared_ptr iterativeParams; ///< The container for iterativeOptimization parameters. used in CG Solvers. SuccessiveLinearizationParams() : linearSolverType(MULTIFRONTAL_CHOLESKY) {} - virtual ~SuccessiveLinearizationParams() {} - virtual void print(const std::string& str = "") const { - NonlinearOptimizerParams::print(str); - switch ( linearSolverType ) { - case MULTIFRONTAL_CHOLESKY: - std::cout << " linear solver type: MULTIFRONTAL CHOLESKY\n"; - break; - case MULTIFRONTAL_QR: - std::cout << " linear solver type: MULTIFRONTAL QR\n"; - break; - case SEQUENTIAL_CHOLESKY: - std::cout << " linear solver type: SEQUENTIAL CHOLESKY\n"; - break; - case SEQUENTIAL_QR: - std::cout << " linear solver type: SEQUENTIAL QR\n"; - break; - case CHOLMOD: - std::cout << " linear solver type: CHOLMOD\n"; - break; - case CG: - std::cout << " linear solver type: CG\n"; - break; - default: - std::cout << " linear solver type: (invalid)\n"; - break; - } - - if(ordering) - std::cout << " ordering: custom\n"; - else - std::cout << " ordering: COLAMD\n"; - - std::cout.flush(); - } - inline bool isMultifrontal() const { return (linearSolverType == MULTIFRONTAL_CHOLESKY) || (linearSolverType == MULTIFRONTAL_QR); } @@ -93,7 +58,9 @@ public: return (linearSolverType == CG); } - GaussianFactorGraph::Eliminate getEliminationFunction() { + virtual void print(const std::string& str) const; + + GaussianFactorGraph::Eliminate getEliminationFunction() const { switch (linearSolverType) { case MULTIFRONTAL_CHOLESKY: case SEQUENTIAL_CHOLESKY: @@ -111,4 +78,7 @@ public: } }; +/* a wrapper for solving a GaussianFactorGraph according to the parameters */ +VectorValues solveGaussianFactorGraph(const GaussianFactorGraph &gfg, const SuccessiveLinearizationParams ¶ms) ; + } /* namespace gtsam */ diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index fefa2a05f..bb7743bd9 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -6,7 +6,7 @@ */ #include -#include +#include #include @@ -51,31 +51,6 @@ boost::tuple generateProblem() { return boost::tie(graph, initialEstimate); } - -/* ************************************************************************* */ -TEST(optimize, GradientDescentOptimizer) { - - pose2SLAM::Graph graph ; - pose2SLAM::Values initialEstimate; - - boost::tie(graph, initialEstimate) = generateProblem(); - // cout << "initial error = " << graph.error(initialEstimate) << endl ; - - // Single Step Optimization using Levenberg-Marquardt - NonlinearOptimizerParams param; - param.maxIterations = 500; /* requires a larger number of iterations to converge */ - param.verbosity = NonlinearOptimizerParams::SILENT; - - GradientDescentOptimizer optimizer(graph, initialEstimate, param); - Values result = optimizer.optimize(); -// cout << "gd1 solver final error = " << graph.error(result) << endl; - - /* the optimality of the solution is not comparable to the */ - DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); - - CHECK(1); -} - /* ************************************************************************* */ TEST(optimize, ConjugateGradientOptimizer) { @@ -90,8 +65,7 @@ TEST(optimize, ConjugateGradientOptimizer) { param.maxIterations = 500; /* requires a larger number of iterations to converge */ param.verbosity = NonlinearOptimizerParams::SILENT; - - ConjugateGradientOptimizer optimizer(graph, initialEstimate, param, true); + NonlinearConjugateGradientOptimizer optimizer(graph, initialEstimate, param); Values result = optimizer.optimize(); // cout << "cg final error = " << graph.error(result) << endl; @@ -99,32 +73,6 @@ TEST(optimize, ConjugateGradientOptimizer) { DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); } -/* ************************************************************************* */ -TEST(optimize, GradientDescentOptimizer2) { - - pose2SLAM::Graph graph ; - pose2SLAM::Values initialEstimate; - - boost::tie(graph, initialEstimate) = generateProblem(); -// cout << "initial error = " << graph.error(initialEstimate) << endl ; - - // Single Step Optimization using Levenberg-Marquardt - NonlinearOptimizerParams param; - param.maxIterations = 500; /* requires a larger number of iterations to converge */ - param.verbosity = NonlinearOptimizerParams::SILENT; - - - ConjugateGradientOptimizer optimizer(graph, initialEstimate, param, false); - Values result = optimizer.optimize(); -// cout << "gd2 solver final error = " << graph.error(result) << endl; - - /* the optimality of the solution is not comparable to the */ - DOUBLES_EQUAL(0.0, graph.error(result), 1e-2); -} - - - - /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From dff2fc6de2b8446dc1b12c354032067d36728d2d Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 24 Jul 2012 21:08:30 +0000 Subject: [PATCH 708/914] remove files accidentally checked-in before --- .settings/org.eclipse.cdt.core.prefs | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .settings/org.eclipse.cdt.core.prefs diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs deleted file mode 100644 index 3278fdadc..000000000 --- a/.settings/org.eclipse.cdt.core.prefs +++ /dev/null @@ -1,16 +0,0 @@ -eclipse.preferences.version=1 -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/PATH/delimiter=\: -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/PATH/operation=append -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/PATH/value=/home/ydjian/matlab/R2012a/bin -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/append=true -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.127261216/appendContributed=true -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/PATH/delimiter=\: -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/PATH/operation=append -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/PATH/value=/home/ydjian/matlab/R2012a/bin -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/append=true -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544.1441575890/appendContributed=true -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/PATH/delimiter=\: -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/PATH/operation=append -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/PATH/value=/home/ydjian/matlab/R2012a/bin -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/append=true -environment/project/cdt.managedbuild.toolchain.gnu.macosx.base.1359703544/appendContributed=true From a44b602d19367ee546eb1918b61ff9545421434c Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 25 Jul 2012 21:04:00 +0000 Subject: [PATCH 709/914] Changed parameter name from CG to CONJUGATE_GRADIENT --- examples/Pose2SLAMwSPCG.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index 38a2e18e4..240361db7 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -108,7 +108,7 @@ int main(int argc, char** argv) { LevenbergMarquardtParams parameters; parameters.verbosity = NonlinearOptimizerParams::ERROR; parameters.verbosityLM = LevenbergMarquardtParams::LAMBDA; - parameters.linearSolverType = SuccessiveLinearizationParams::CG; + parameters.linearSolverType = SuccessiveLinearizationParams::CONJUGATE_GRADIENT; { parameters.iterativeParams = boost::make_shared(); From 7fc6a622bf9aa15204e8303a767ad10e07776277 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 25 Jul 2012 22:13:22 +0000 Subject: [PATCH 710/914] Added additional factors to the serialization unit test --- gtsam/geometry/StereoCamera.h | 4 +- gtsam/slam/GeneralSFMFactor.h | 5 +++ gtsam/slam/StereoFactor.h | 4 +- tests/testSerializationSLAM.cpp | 76 ++++++++++++++++++++++++++++++--- 4 files changed, 80 insertions(+), 9 deletions(-) diff --git a/gtsam/geometry/StereoCamera.h b/gtsam/geometry/StereoCamera.h index 867844fbb..140ab1bdf 100644 --- a/gtsam/geometry/StereoCamera.h +++ b/gtsam/geometry/StereoCamera.h @@ -141,7 +141,9 @@ private: friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { - ar & BOOST_SERIALIZATION_NVP(leftCamPose_); + ar & boost::serialization::make_nvp("StereoCamera", + boost::serialization::base_object(*this)); + ar & BOOST_SERIALIZATION_NVP(leftCamPose_); ar & BOOST_SERIALIZATION_NVP(K_); } diff --git a/gtsam/slam/GeneralSFMFactor.h b/gtsam/slam/GeneralSFMFactor.h index d94c162af..a9db7dcbe 100644 --- a/gtsam/slam/GeneralSFMFactor.h +++ b/gtsam/slam/GeneralSFMFactor.h @@ -111,6 +111,8 @@ namespace gtsam { friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("NoiseModelFactor2", + boost::serialization::base_object(*this)); ar & BOOST_SERIALIZATION_NVP(measured_); } }; @@ -143,6 +145,7 @@ namespace gtsam { */ GeneralSFMFactor2(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key landmarkKey, Key calibKey) : Base(model, poseKey, landmarkKey, calibKey), measured_(measured) {} + GeneralSFMFactor2():measured_(0.0,0.0) {} ///< default constructor virtual ~GeneralSFMFactor2() {} ///< destructor @@ -197,6 +200,8 @@ namespace gtsam { friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("NoiseModelFactor3", + boost::serialization::base_object(*this)); ar & BOOST_SERIALIZATION_NVP(measured_); } }; diff --git a/gtsam/slam/StereoFactor.h b/gtsam/slam/StereoFactor.h index d0c0bda6a..5be783aaf 100644 --- a/gtsam/slam/StereoFactor.h +++ b/gtsam/slam/StereoFactor.h @@ -74,7 +74,7 @@ public: /** * equals */ - virtual bool equals(const NonlinearFactor& f, double tol) const { + virtual bool equals(const NonlinearFactor& f, double tol = 1e-9) const { const GenericStereoFactor* p = dynamic_cast (&f); return p && Base::equals(f) && measured_.equals(p->measured_, tol); } @@ -102,6 +102,8 @@ private: friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("NoiseModelFactor2", + boost::serialization::base_object(*this)); ar & BOOST_SERIALIZATION_NVP(measured_); ar & BOOST_SERIALIZATION_NVP(K_); } diff --git a/tests/testSerializationSLAM.cpp b/tests/testSerializationSLAM.cpp index c0cdb6a93..4f9664e20 100644 --- a/tests/testSerializationSLAM.cpp +++ b/tests/testSerializationSLAM.cpp @@ -17,13 +17,17 @@ */ #include - -#include -#include +//#include #include -#include #include +#include +//#include +#include +//#include +#include #include +#include +#include #include #include #include @@ -42,6 +46,7 @@ #include #include #include +#include #include #include @@ -64,6 +69,7 @@ typedef PriorFactor PriorFactorCal3_S2; typedef PriorFactor PriorFactorCal3DS2; typedef PriorFactor PriorFactorCalibratedCamera; typedef PriorFactor PriorFactorSimpleCamera; +typedef PriorFactor PriorFactorStereoCamera; typedef BetweenFactor BetweenFactorLieVector; typedef BetweenFactor BetweenFactorLieMatrix; @@ -87,6 +93,7 @@ typedef NonlinearEquality NonlinearEqualityCal3_S2; typedef NonlinearEquality NonlinearEqualityCal3DS2; typedef NonlinearEquality NonlinearEqualityCalibratedCamera; typedef NonlinearEquality NonlinearEqualitySimpleCamera; +typedef NonlinearEquality NonlinearEqualityStereoCamera; typedef RangeFactor RangeFactorPosePoint2; typedef RangeFactor RangeFactorPosePoint3; @@ -106,6 +113,13 @@ typedef BearingRangeFactor BearingRangeFactor3D; typedef GenericProjectionFactor GenericProjectionFactorCal3_S2; typedef GenericProjectionFactor GenericProjectionFactorCal3DS2; +typedef gtsam::GeneralSFMFactor GeneralSFMFactorCal3_S2; +//typedef gtsam::GeneralSFMFactor GeneralSFMFactorCal3DS2; + +typedef gtsam::GeneralSFMFactor2 GeneralSFMFactor2Cal3_S2; + +typedef gtsam::GenericStereoFactor GenericStereoFactor3D; + // Convenience for named keys using symbol_shorthand::X; @@ -136,8 +150,10 @@ BOOST_CLASS_EXPORT(gtsam::Pose2); BOOST_CLASS_EXPORT(gtsam::Pose3); BOOST_CLASS_EXPORT(gtsam::Cal3_S2); BOOST_CLASS_EXPORT(gtsam::Cal3DS2); +BOOST_CLASS_EXPORT(gtsam::Cal3_S2Stereo); BOOST_CLASS_EXPORT(gtsam::CalibratedCamera); BOOST_CLASS_EXPORT(gtsam::SimpleCamera); +BOOST_CLASS_EXPORT(gtsam::StereoCamera); /* Create GUIDs for factors */ @@ -158,6 +174,7 @@ BOOST_CLASS_EXPORT_GUID(PriorFactorCal3_S2, "gtsam::PriorFactorCal3_S2"); BOOST_CLASS_EXPORT_GUID(PriorFactorCal3DS2, "gtsam::PriorFactorCal3DS2"); BOOST_CLASS_EXPORT_GUID(PriorFactorCalibratedCamera, "gtsam::PriorFactorCalibratedCamera"); BOOST_CLASS_EXPORT_GUID(PriorFactorSimpleCamera, "gtsam::PriorFactorSimpleCamera"); +BOOST_CLASS_EXPORT_GUID(PriorFactorStereoCamera, "gtsam::PriorFactorStereoCamera"); BOOST_CLASS_EXPORT_GUID(BetweenFactorLieVector, "gtsam::BetweenFactorLieVector"); BOOST_CLASS_EXPORT_GUID(BetweenFactorLieMatrix, "gtsam::BetweenFactorLieMatrix"); @@ -181,6 +198,7 @@ BOOST_CLASS_EXPORT_GUID(NonlinearEqualityCal3_S2, "gtsam::NonlinearEqualityCal3_ BOOST_CLASS_EXPORT_GUID(NonlinearEqualityCal3DS2, "gtsam::NonlinearEqualityCal3DS2"); BOOST_CLASS_EXPORT_GUID(NonlinearEqualityCalibratedCamera, "gtsam::NonlinearEqualityCalibratedCamera"); BOOST_CLASS_EXPORT_GUID(NonlinearEqualitySimpleCamera, "gtsam::NonlinearEqualitySimpleCamera"); +BOOST_CLASS_EXPORT_GUID(NonlinearEqualityStereoCamera, "gtsam::NonlinearEqualityStereoCamera"); BOOST_CLASS_EXPORT_GUID(RangeFactorPosePoint2, "gtsam::RangeFactorPosePoint2"); BOOST_CLASS_EXPORT_GUID(RangeFactorPosePoint3, "gtsam::RangeFactorPosePoint3"); @@ -198,6 +216,13 @@ BOOST_CLASS_EXPORT_GUID(BearingRangeFactor2D, "gtsam::BearingRangeFactor2D"); BOOST_CLASS_EXPORT_GUID(GenericProjectionFactorCal3_S2, "gtsam::GenericProjectionFactorCal3_S2"); BOOST_CLASS_EXPORT_GUID(GenericProjectionFactorCal3DS2, "gtsam::GenericProjectionFactorCal3DS2"); +BOOST_CLASS_EXPORT_GUID(GeneralSFMFactorCal3_S2, "gtsam::GeneralSFMFactorCal3_S2"); +//BOOST_CLASS_EXPORT_GUID(GeneralSFMFactorCal3DS2, "gtsam::GeneralSFMFactorCal3DS2"); + +BOOST_CLASS_EXPORT_GUID(GeneralSFMFactor2Cal3_S2, "gtsam::GeneralSFMFactor2Cal3_S2"); + +BOOST_CLASS_EXPORT_GUID(GenericStereoFactor3D, "gtsam::GenericStereoFactor3D"); + /* ************************************************************************* */ TEST (Serialization, smallExample_linear) { @@ -261,12 +286,18 @@ TEST (Serialization, factors) { Pose3 pose3(rot3, point3); Cal3_S2 cal3_s2(1.0, 2.0, 3.0, 4.0, 5.0); Cal3DS2 cal3ds2(1.0, 2.0, 3.0, 4.0, 5.0,6.0, 7.0, 8.0, 9.0); + Cal3_S2Stereo cal3_s2stereo(1.0, 2.0, 3.0, 4.0, 5.0, 1.0); CalibratedCamera calibratedCamera(pose3); SimpleCamera simpleCamera(pose3, cal3_s2); + StereoCamera stereoCamera(pose3, boost::make_shared(cal3_s2stereo)); - Symbol a01('a',1), a02('a',2), a03('a',3), a04('a',4), a05('a',5), a06('a',6), a07('a',7), a08('a',8), a09('a',9), a10('a',10), a11('a',11), a12('a',12), a13('a',13); - Symbol b01('b',1), b02('b',2), b03('b',3), b04('b',4), b05('b',5), b06('b',6), b07('b',7), b08('b',8), b09('b',9), b10('b',10), b11('b',11), b12('b',12), b13('b',13); + Symbol a01('a',1), a02('a',2), a03('a',3), a04('a',4), a05('a',5), + a06('a',6), a07('a',7), a08('a',8), a09('a',9), a10('a',10), + a11('a',11), a12('a',12), a13('a',13), a14('a',14), a15('a',15); + Symbol b01('b',1), b02('b',2), b03('b',3), b04('b',4), b05('b',5), + b06('b',6), b07('b',7), b08('b',8), b09('b',9), b10('b',10), + b11('b',11), b12('b',12), b13('b',13), b14('b',14), b15('b',15); Values values; values.insert(a01, lieVector); @@ -282,6 +313,7 @@ TEST (Serialization, factors) { values.insert(a11, cal3ds2); values.insert(a12, calibratedCamera); values.insert(a13, simpleCamera); + values.insert(a14, stereoCamera); SharedNoiseModel model1 = noiseModel::Isotropic::Sigma(1, 0.3); @@ -308,6 +340,7 @@ TEST (Serialization, factors) { PriorFactorCal3DS2 priorFactorCal3DS2(a11, cal3ds2, model9); PriorFactorCalibratedCamera priorFactorCalibratedCamera(a12, calibratedCamera, model6); PriorFactorSimpleCamera priorFactorSimpleCamera(a13, simpleCamera, model11); + PriorFactorStereoCamera priorFactorStereoCamera(a14, stereoCamera, model11); BetweenFactorLieVector betweenFactorLieVector(a01, b01, lieVector, model4); BetweenFactorLieMatrix betweenFactorLieMatrix(a02, b02, lieMatrix, model6); @@ -331,6 +364,7 @@ TEST (Serialization, factors) { NonlinearEqualityCal3DS2 nonlinearEqualityCal3DS2(a11, cal3ds2); NonlinearEqualityCalibratedCamera nonlinearEqualityCalibratedCamera(a12, calibratedCamera); NonlinearEqualitySimpleCamera nonlinearEqualitySimpleCamera(a13, simpleCamera); + NonlinearEqualityStereoCamera nonlinearEqualityStereoCamera(a14, stereoCamera); RangeFactorPosePoint2 rangeFactorPosePoint2(a08, a03, 2.0, model1); RangeFactorPosePoint3 rangeFactorPosePoint3(a09, a05, 2.0, model1); @@ -348,7 +382,11 @@ TEST (Serialization, factors) { GenericProjectionFactorCal3_S2 genericProjectionFactorCal3_S2(point2, model2, a09, a05, boost::make_shared(cal3_s2)); GenericProjectionFactorCal3DS2 genericProjectionFactorCal3DS2(point2, model2, a09, a05, boost::make_shared(cal3ds2)); + GeneralSFMFactorCal3_S2 generalSFMFactorCal3_S2(point2, model2, a13, a05); + GeneralSFMFactor2Cal3_S2 generalSFMFactor2Cal3_S2(point2, model2, a09, a05, a10); + + GenericStereoFactor3D genericStereoFactor3D(stereoPoint2, model3, a09, a05, boost::make_shared(cal3_s2stereo)); NonlinearFactorGraph graph; @@ -362,9 +400,10 @@ TEST (Serialization, factors) { graph.add(priorFactorPose2); graph.add(priorFactorPose3); graph.add(priorFactorCal3_S2); - graph.add(priorFactorCal3_S2); + graph.add(priorFactorCal3DS2); graph.add(priorFactorCalibratedCamera); graph.add(priorFactorSimpleCamera); + graph.add(priorFactorStereoCamera); graph.add(betweenFactorLieVector); graph.add(betweenFactorLieMatrix); @@ -388,6 +427,7 @@ TEST (Serialization, factors) { graph.add(nonlinearEqualityCal3DS2); graph.add(nonlinearEqualityCalibratedCamera); graph.add(nonlinearEqualitySimpleCamera); + graph.add(nonlinearEqualityStereoCamera); graph.add(rangeFactorPosePoint2); graph.add(rangeFactorPosePoint3); @@ -405,6 +445,12 @@ TEST (Serialization, factors) { graph.add(genericProjectionFactorCal3_S2); graph.add(genericProjectionFactorCal3DS2); + graph.add(generalSFMFactorCal3_S2); + + graph.add(generalSFMFactor2Cal3_S2); + + graph.add(genericStereoFactor3D); + // text EXPECT(equalsObj(a01)); @@ -425,6 +471,7 @@ TEST (Serialization, factors) { EXPECT(equalsObj(priorFactorCal3DS2)); EXPECT(equalsObj(priorFactorCalibratedCamera)); EXPECT(equalsObj(priorFactorSimpleCamera)); + EXPECT(equalsObj(priorFactorStereoCamera)); EXPECT(equalsObj(betweenFactorLieVector)); EXPECT(equalsObj(betweenFactorLieMatrix)); @@ -448,6 +495,7 @@ TEST (Serialization, factors) { EXPECT(equalsObj(nonlinearEqualityCal3DS2)); EXPECT(equalsObj(nonlinearEqualityCalibratedCamera)); EXPECT(equalsObj(nonlinearEqualitySimpleCamera)); + EXPECT(equalsObj(nonlinearEqualityStereoCamera)); EXPECT(equalsObj(rangeFactorPosePoint2)); EXPECT(equalsObj(rangeFactorPosePoint3)); @@ -465,6 +513,12 @@ TEST (Serialization, factors) { EXPECT(equalsObj(genericProjectionFactorCal3_S2)); EXPECT(equalsObj(genericProjectionFactorCal3DS2)); + EXPECT(equalsObj(generalSFMFactorCal3_S2)); + + EXPECT(equalsObj(generalSFMFactor2Cal3_S2)); + + EXPECT(equalsObj(genericStereoFactor3D)); + // xml EXPECT(equalsXML(a01)); @@ -485,6 +539,7 @@ TEST (Serialization, factors) { EXPECT(equalsXML(priorFactorCal3DS2)); EXPECT(equalsXML(priorFactorCalibratedCamera)); EXPECT(equalsXML(priorFactorSimpleCamera)); + EXPECT(equalsXML(priorFactorStereoCamera)); EXPECT(equalsXML(betweenFactorLieVector)); EXPECT(equalsXML(betweenFactorLieMatrix)); @@ -508,6 +563,7 @@ TEST (Serialization, factors) { EXPECT(equalsXML(nonlinearEqualityCal3DS2)); EXPECT(equalsXML(nonlinearEqualityCalibratedCamera)); EXPECT(equalsXML(nonlinearEqualitySimpleCamera)); + EXPECT(equalsXML(nonlinearEqualityStereoCamera)); EXPECT(equalsXML(rangeFactorPosePoint2)); EXPECT(equalsXML(rangeFactorPosePoint3)); @@ -524,6 +580,12 @@ TEST (Serialization, factors) { EXPECT(equalsXML(genericProjectionFactorCal3_S2)); EXPECT(equalsXML(genericProjectionFactorCal3DS2)); + + EXPECT(equalsXML(generalSFMFactorCal3_S2)); + + EXPECT(equalsXML(generalSFMFactor2Cal3_S2)); + + EXPECT(equalsXML(genericStereoFactor3D)); } From 29f48e1127e6dde2eab15d049de7bf04010ef604 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 25 Jul 2012 22:15:20 +0000 Subject: [PATCH 711/914] Fixed examples --- matlab/examples/Pose2SLAMExample_circle.m | 8 +++++--- matlab/examples/Pose2SLAMExample_graph.m | 10 ++++++---- matlab/examples/StereoVOExample_large.m | 12 +++++++----- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m index 355f1a10e..8f281d34f 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/examples/Pose2SLAMExample_circle.m @@ -38,11 +38,13 @@ initial.insertPose(5, hexagon.pose(5).retract([-0.1, 0.1,-0.1]')); %% Plot Initial Estimate figure(1);clf -plot(initial.xs(),initial.ys(),'g-*'); axis equal +P=initial.poses; +plot(P(:,1),P(:,2),'g-*'); axis equal %% optimize -result = fg.optimize(initial); +result = fg.optimize(initial,1); %% Show Result -hold on; plot(result.xs(),result.ys(),'b-*') +P=result.poses; +hold on; plot(P(:,1),P(:,2),'b-*') result.print(sprintf('\nFinal result:\n')); diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index ac6d1e317..e3dea348c 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -13,7 +13,7 @@ %% Initialize graph, initial estimate, and odometry noise import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -[graph,initial]=load2D('../../examples/Data/w100-odom.graph',model); +[graph,initial]=load2D('Data/w100-odom.graph',model); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 @@ -24,11 +24,13 @@ graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph %% Plot Initial Estimate figure(1);clf -plot(initial.xs(),initial.ys(),'g-*'); axis equal +P=initial.poses; +plot(P(:,1),P(:,2),'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initial); -hold on; plot(result.xs(),result.ys(),'b-*') +result = graph.optimize(initial,1); +P=result.poses; +hold on; plot(P(:,1),P(:,2),'b-*') result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses diff --git a/matlab/examples/StereoVOExample_large.m b/matlab/examples/StereoVOExample_large.m index 282f7162c..7d670c99c 100644 --- a/matlab/examples/StereoVOExample_large.m +++ b/matlab/examples/StereoVOExample_large.m @@ -13,7 +13,7 @@ %% Load calibration import gtsam.* % format: fx fy skew cx cy baseline -calib = dlmread('../../examples/Data/VO_calibration.txt'); +calib = dlmread('Data/VO_calibration.txt'); K = Cal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); @@ -26,7 +26,7 @@ initial = visualSLAM.Values; % row format: camera_id 4x4 pose (row, major) import gtsam.* fprintf(1,'Reading data\n'); -cameras = dlmread('../../examples/Data/VO_camera_poses_large.txt'); +cameras = dlmread('Data/VO_camera_poses_large.txt'); for i=1:size(cameras,1) pose = Pose3(reshape(cameras(i,2:17),4,4)'); initial.insertPose(symbol('x',cameras(i,1)),pose); @@ -35,7 +35,7 @@ end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z import gtsam.* -measurements = dlmread('../../examples/Data/VO_stereo_factors_large.txt'); +measurements = dlmread('Data/VO_stereo_factors_large.txt'); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) @@ -67,10 +67,12 @@ toc figure(1); clf; hold on; % initial trajectory in red (rotated so Z is up) -plot3(initial.zs(),-initial.xs(),-initial.ys(), '-*r','LineWidth',2); +P = initial.translations; +plot3(P(:,3),-P(:,1),-P(:,2), '-*r','LineWidth',2); % final trajectory in green (rotated so Z is up) -plot3(result.zs(),-result.xs(),-result.ys(), '-*g','LineWidth',2); +P = result.translations; +plot3(P(:,3),-P(:,1),-P(:,2), '-*g','LineWidth',2); xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); % switch to XZ view From 5becf405f8e6e0bd87b1a76dd7feab90d9a1c00d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 26 Jul 2012 01:40:07 +0000 Subject: [PATCH 712/914] load2D wrapped, but pair argument does not work? --- .cproject | 326 +++++++++++++++--------------- examples/Pose2SLAMExample_graph.m | 47 +++++ 2 files changed, 205 insertions(+), 168 deletions(-) create mode 100644 examples/Pose2SLAMExample_graph.m diff --git a/.cproject b/.cproject index 91d9c7689..2439190b6 100644 --- a/.cproject +++ b/.cproject @@ -309,6 +309,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -335,7 +343,6 @@ make - tests/testBayesTree.run true false @@ -343,7 +350,6 @@ make - testBinaryBayesNet.run true false @@ -391,7 +397,6 @@ make - testSymbolicBayesNet.run true false @@ -399,7 +404,6 @@ make - tests/testSymbolicFactor.run true false @@ -407,7 +411,6 @@ make - testSymbolicFactorGraph.run true false @@ -423,20 +426,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -525,22 +519,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -557,6 +535,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -581,26 +575,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -685,26 +679,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -959,7 +953,6 @@ make - testGraph.run true false @@ -967,7 +960,6 @@ make - testJunctionTree.run true false @@ -975,7 +967,6 @@ make - testSymbolicBayesNetB.run true false @@ -1111,7 +1102,6 @@ make - testErrors.run true false @@ -1575,6 +1565,7 @@ make + testSimulated2DOriented.run true false @@ -1614,6 +1605,7 @@ make + testSimulated2D.run true false @@ -1621,6 +1613,7 @@ make + testSimulated3D.run true false @@ -1836,6 +1829,7 @@ make + tests/testGaussianISAM2 true false @@ -1857,14 +1851,110 @@ true true - + make -j2 - install + testRot3.run true true true + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + + + make + -j1 + install + true + false + true + make -j2 @@ -1875,10 +1965,10 @@ make - -j5 + -j1 check true - true + false true @@ -2058,7 +2148,6 @@ cpack - -G DEB true false @@ -2066,7 +2155,6 @@ cpack - -G RPM true false @@ -2074,7 +2162,6 @@ cpack - -G TGZ true false @@ -2082,7 +2169,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2224,98 +2310,34 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2359,38 +2381,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/examples/Pose2SLAMExample_graph.m b/examples/Pose2SLAMExample_graph.m new file mode 100644 index 000000000..65271c053 --- /dev/null +++ b/examples/Pose2SLAMExample_graph.m @@ -0,0 +1,47 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Initialize graph, initial estimate, and odometry noise +import gtsam.* +model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); +maxID = 0; +addNoise = false; +smart = true; +[graph,initial]=load2D('Data/w100-odom.graph',model,maxID,addNoise,smart); +initial.print(sprintf('Initial estimate:\n')); + +%% Add a Gaussian prior on pose x_1 +import gtsam.* +priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); +graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph + +%% Plot Initial Estimate +figure(1);clf +P=initial.poses; +plot(P(:,1),P(:,2),'g-*'); axis equal + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +result = graph.optimize(initial,1); +P=result.poses; +hold on; plot(P(:,1),P(:,2),'b-*') +result.print(sprintf('\nFinal result:\n')); + +%% Plot Covariance Ellipses +marginals = graph.marginals(result); +P={}; +for i=1:result.size()-1 + pose_i = result.pose(i); + P{i}=marginals.marginalCovariance(i); + plotPose2(pose_i,'b',P{i}) +end +fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file From 5c2265419431b8fb0a668522f922f25c7e717d00 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Thu, 26 Jul 2012 01:40:25 +0000 Subject: [PATCH 713/914] load2D wrapped, but pair argument does not work? --- gtsam.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gtsam.h b/gtsam.h index 35975f710..5a331f1e0 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1365,6 +1365,10 @@ virtual class GenericProjectionFactor : gtsam::NonlinearFactor { typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3_S2; typedef gtsam::GenericProjectionFactor GenericProjectionFactorCal3DS2; +#include +pair load2D(string filename, + gtsam::noiseModel::Diagonal* model, int maxID, bool addNoise, bool smart); + } //\namespace gtsam //************************************************************************* From f93760327ea1bac8a6ac61850d28ba9ffd5c2b95 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 26 Jul 2012 13:08:54 +0000 Subject: [PATCH 714/914] Added matlab functions for generating poses in a circle. This replaces the need for the SLAM namespace functions of the same purpose. --- matlab/circlePose2.m | 19 +++++++++++++++++++ matlab/circlePose3.m | 29 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 matlab/circlePose2.m create mode 100644 matlab/circlePose3.m diff --git a/matlab/circlePose2.m b/matlab/circlePose2.m new file mode 100644 index 000000000..4da70f9bf --- /dev/null +++ b/matlab/circlePose2.m @@ -0,0 +1,19 @@ +function values = circlePose2(numPoses, radius, symbolChar) +% circlePose2: generate a set of poses in a circle. This function +% returns those poses inside a gtsam.Values object, with sequential +% keys starting from 1. An optional character may be provided, which +% will be stored in the msb of each key (i.e. gtsam.Symbol). + +if nargin<3,symbolChar=0x00;end +if nargin<2,radius=1.0;end +if nargin<1,numPoses=8;end + +values = gtsam.Values; +theta = 0.0; +dtheta = 2*pi()/numPoses; +for i = 1:numPoses + key = gtsam.Symbol(symbolChar, i); + pose = gtsam.Pose2(radius*cos(theta), radius*sin(theta), pi()/2 + theta); + values.insert(key, pose); + theta = theta + dtheta; +end diff --git a/matlab/circlePose3.m b/matlab/circlePose3.m new file mode 100644 index 000000000..bd102ad78 --- /dev/null +++ b/matlab/circlePose3.m @@ -0,0 +1,29 @@ +function values = circlePose2(numPoses, radius, symbolChar) +% circlePose3: generate a set of poses in a circle. This function +% returns those poses inside a gtsam.Values object, with sequential +% keys starting from 1. An optional character may be provided, which +% will be stored in the msb of each key (i.e. gtsam.Symbol). +% +% We use aerospace/navlab convention, X forward, Y right, Z down +% First pose will be at (R,0,0) +% ^y ^ X +% | | +% z-->xZ--> Y (z pointing towards viewer, Z pointing away from viewer) +% Vehicle at p0 is looking towards y axis (X-axis points towards world y) + +if nargin<3,symbolChar=0x00;end +if nargin<2,radius=1.0;end +if nargin<1,numPoses=8;end + +values = gtsam.Values; +theta = 0.0; +dtheta = 2*pi()/numPoses; +gR0 = gtsam.Rot3(Point3(0, 1, 0), Point3(1, 0, 0), Point3(0, 0, -1)); +for i = 1:numPoses + key = gtsam.Symbol(symbolChar, i); + gti = Point3(radius*cos(theta), radius*sin(theta), 0); + _0Ri = gtsam.Rot3.yaw(-theta); % negative yaw goes counterclockwise, with Z down ! + gTi = gtsam.Pose3(gR0.compose(_0Ri), gti); + values.insert(key, gTi); + theta = theta + dtheta; +end From 078eb1bb4fd8929a07952fd81db339a1a4465de6 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 26 Jul 2012 13:23:04 +0000 Subject: [PATCH 715/914] Added matlab functions for generating poses in a circle. This replaces the need for the SLAM namespace functions of the same purpose. I mean it this time. Edited the wrong copy before committing. --- matlab/circlePose2.m | 19 +++++++++++++++---- matlab/circlePose3.m | 20 ++++++++++++-------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/matlab/circlePose2.m b/matlab/circlePose2.m index 4da70f9bf..7153fc128 100644 --- a/matlab/circlePose2.m +++ b/matlab/circlePose2.m @@ -1,18 +1,29 @@ function values = circlePose2(numPoses, radius, symbolChar) -% circlePose2: generate a set of poses in a circle. This function +% circlePose3: generate a set of poses in a circle. This function % returns those poses inside a gtsam.Values object, with sequential -% keys starting from 1. An optional character may be provided, which +% keys starting from 0. An optional character may be provided, which % will be stored in the msb of each key (i.e. gtsam.Symbol). +% +% We use aerospace/navlab convention, X forward, Y right, Z down +% First pose will be at (R,0,0) +% ^y ^ X +% | | +% z-->xZ--> Y (z pointing towards viewer, Z pointing away from viewer) +% Vehicle at p0 is looking towards y axis (X-axis points towards world y) -if nargin<3,symbolChar=0x00;end +if nargin<3,symbolChar=0;end if nargin<2,radius=1.0;end if nargin<1,numPoses=8;end +% Force symbolChar to be a single character +symbolChar = char(symbolChar); +symbolChar = symbolChar(1); + values = gtsam.Values; theta = 0.0; dtheta = 2*pi()/numPoses; for i = 1:numPoses - key = gtsam.Symbol(symbolChar, i); + key = gtsam.Symbol(symbolChar, i-1).key(); pose = gtsam.Pose2(radius*cos(theta), radius*sin(theta), pi()/2 + theta); values.insert(key, pose); theta = theta + dtheta; diff --git a/matlab/circlePose3.m b/matlab/circlePose3.m index bd102ad78..0e74a2f1b 100644 --- a/matlab/circlePose3.m +++ b/matlab/circlePose3.m @@ -1,7 +1,7 @@ -function values = circlePose2(numPoses, radius, symbolChar) +function values = circlePose3(numPoses, radius, symbolChar) % circlePose3: generate a set of poses in a circle. This function % returns those poses inside a gtsam.Values object, with sequential -% keys starting from 1. An optional character may be provided, which +% keys starting from 0. An optional character may be provided, which % will be stored in the msb of each key (i.e. gtsam.Symbol). % % We use aerospace/navlab convention, X forward, Y right, Z down @@ -11,19 +11,23 @@ function values = circlePose2(numPoses, radius, symbolChar) % z-->xZ--> Y (z pointing towards viewer, Z pointing away from viewer) % Vehicle at p0 is looking towards y axis (X-axis points towards world y) -if nargin<3,symbolChar=0x00;end +if nargin<3,symbolChar=0;end if nargin<2,radius=1.0;end if nargin<1,numPoses=8;end +% Force symbolChar to be a single character +symbolChar = char(symbolChar); +symbolChar = symbolChar(1); + values = gtsam.Values; theta = 0.0; dtheta = 2*pi()/numPoses; -gR0 = gtsam.Rot3(Point3(0, 1, 0), Point3(1, 0, 0), Point3(0, 0, -1)); +gRo = gtsam.Rot3([0, 1, 0 ; 1, 0, 0 ; 0, 0, -1]); for i = 1:numPoses - key = gtsam.Symbol(symbolChar, i); - gti = Point3(radius*cos(theta), radius*sin(theta), 0); - _0Ri = gtsam.Rot3.yaw(-theta); % negative yaw goes counterclockwise, with Z down ! - gTi = gtsam.Pose3(gR0.compose(_0Ri), gti); + key = gtsam.Symbol(symbolChar, i-1).key(); + gti = gtsam.Point3(radius*cos(theta), radius*sin(theta), 0); + oRi = gtsam.Rot3.Yaw(-theta); % negative yaw goes counterclockwise, with Z down ! + gTi = gtsam.Pose3(gRo.compose(oRi), gti); values.insert(key, gTi); theta = theta + dtheta; end From c2935c5dd19ae0e1c58782a56897d97c1d64a29f Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 26 Jul 2012 13:33:40 +0000 Subject: [PATCH 716/914] Replaced calls to the namespace Circle functions with the newly added matlab function --- matlab/examples/Pose2SLAMExample_circle.m | 19 ++++++++++--------- matlab/examples/Pose3SLAMExample.m | 19 ++++++++++--------- matlab/tests/testPose3SLAMExample.m | 19 ++++++++++--------- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/examples/Pose2SLAMExample_circle.m index e16edf9cb..3d2265d76 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/examples/Pose2SLAMExample_circle.m @@ -10,13 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Create a hexagon of poses -hexagon = pose2SLAM.Values.Circle(6,1.0); -p0 = hexagon.pose(0); -p1 = hexagon.pose(1); +hexagon = circlePose2(6,1.0); +p0 = hexagon.at(0); +p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement -import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose2(0, p0)); delta = p0.between(p1); @@ -31,11 +32,11 @@ fg.add(BetweenFactorPose2(5,0, delta, covariance)); %% Create initial config initial = Values; initial.insert(0, p0); -initial.insert(1, hexagon.pose(1).retract([-0.1, 0.1,-0.1]')); -initial.insert(2, hexagon.pose(2).retract([ 0.1,-0.1, 0.1]')); -initial.insert(3, hexagon.pose(3).retract([-0.1, 0.1,-0.1]')); -initial.insert(4, hexagon.pose(4).retract([ 0.1,-0.1, 0.1]')); -initial.insert(5, hexagon.pose(5).retract([-0.1, 0.1,-0.1]')); +initial.insert(1, hexagon.at(1).retract([-0.1, 0.1,-0.1]')); +initial.insert(2, hexagon.at(2).retract([ 0.1,-0.1, 0.1]')); +initial.insert(3, hexagon.at(3).retract([-0.1, 0.1,-0.1]')); +initial.insert(4, hexagon.at(4).retract([ 0.1,-0.1, 0.1]')); +initial.insert(5, hexagon.at(5).retract([-0.1, 0.1,-0.1]')); %% Plot Initial Estimate cla diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/examples/Pose3SLAMExample.m index 86c5c23c8..0d2bd237f 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/examples/Pose3SLAMExample.m @@ -10,13 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Create a hexagon of poses -hexagon = pose3SLAM.Values.Circle(6,1.0); -p0 = hexagon.pose(0); -p1 = hexagon.pose(1); +hexagon = circlePose3(6,1.0); +p0 = hexagon.at(0); +p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement -import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose3(0, p0)); delta = p0.between(p1); @@ -32,11 +33,11 @@ fg.add(BetweenFactorPose3(5,0, delta, covariance)); initial = Values; s = 0.10; initial.insert(0, p0); -initial.insert(1, hexagon.pose(1).retract(s*randn(6,1))); -initial.insert(2, hexagon.pose(2).retract(s*randn(6,1))); -initial.insert(3, hexagon.pose(3).retract(s*randn(6,1))); -initial.insert(4, hexagon.pose(4).retract(s*randn(6,1))); -initial.insert(5, hexagon.pose(5).retract(s*randn(6,1))); +initial.insert(1, hexagon.at(1).retract(s*randn(6,1))); +initial.insert(2, hexagon.at(2).retract(s*randn(6,1))); +initial.insert(3, hexagon.at(3).retract(s*randn(6,1))); +initial.insert(4, hexagon.at(4).retract(s*randn(6,1))); +initial.insert(5, hexagon.at(5).retract(s*randn(6,1))); %% Plot Initial Estimate cla diff --git a/matlab/tests/testPose3SLAMExample.m b/matlab/tests/testPose3SLAMExample.m index 0d47990e8..dafad4e47 100644 --- a/matlab/tests/testPose3SLAMExample.m +++ b/matlab/tests/testPose3SLAMExample.m @@ -10,13 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Create a hexagon of poses -hexagon = pose3SLAM.Values.Circle(6,1.0); -p0 = hexagon.pose(0); -p1 = hexagon.pose(1); +hexagon = circlePose3(6,1.0); +p0 = hexagon.at(0); +p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement -import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose3(0, p0)); delta = p0.between(p1); @@ -32,11 +33,11 @@ fg.add(BetweenFactorPose3(5,0, delta, covariance)); initial = Values; s = 0.10; initial.insert(0, p0); -initial.insert(1, hexagon.pose(1).retract(s*randn(6,1))); -initial.insert(2, hexagon.pose(2).retract(s*randn(6,1))); -initial.insert(3, hexagon.pose(3).retract(s*randn(6,1))); -initial.insert(4, hexagon.pose(4).retract(s*randn(6,1))); -initial.insert(5, hexagon.pose(5).retract(s*randn(6,1))); +initial.insert(1, hexagon.at(1).retract(s*randn(6,1))); +initial.insert(2, hexagon.at(2).retract(s*randn(6,1))); +initial.insert(3, hexagon.at(3).retract(s*randn(6,1))); +initial.insert(4, hexagon.at(4).retract(s*randn(6,1))); +initial.insert(5, hexagon.at(5).retract(s*randn(6,1))); %% optimize optimizer = LevenbergMarquardtOptimizer(fg, initial); From 6a88497a6e1580c91936700a47259d2379fc8e65 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 26 Jul 2012 14:06:33 +0000 Subject: [PATCH 717/914] Made load2D throw exception on error instead of calling 'exit', to allow error handling and not cause matlab to exit --- gtsam/slam/dataset.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index e1c282594..0502bb69b 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -90,10 +90,8 @@ pair load2D( bool addNoise, bool smart) { cout << "Will try to read " << filename << endl; ifstream is(filename.c_str()); - if (!is) { - cout << "load2D: can not find the file!"; - exit(-1); - } + if (!is) + throw std::invalid_argument("load2D: can not find the file!"); pose2SLAM::Values::shared_ptr poses(new pose2SLAM::Values); pose2SLAM::Graph::shared_ptr graph(new pose2SLAM::Graph); From 021641e91260f54e740e931903708cb13208c0be Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 26 Jul 2012 14:06:37 +0000 Subject: [PATCH 718/914] Fixed typo and prevented double-evaluation of function when returning a pair in a wrapped function --- wrap/ReturnValue.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index 37e6b15ff..4f5a030cc 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -19,8 +19,8 @@ using namespace wrap; string ReturnValue::return_type(bool add_ptr, pairing p) const { if (p==pair && isPair) { string str = "pair< " + - maybe_shared_ptr(add_ptr && isPtr1, qualifiedType1("::"), type1) + ", " + - maybe_shared_ptr(add_ptr && isPtr2, qualifiedType2("::"), type2) + " >"; + maybe_shared_ptr(add_ptr || isPtr1, qualifiedType1("::"), type1) + ", " + + maybe_shared_ptr(add_ptr || isPtr2, qualifiedType2("::"), type2) + " >"; return str; } else return maybe_shared_ptr(add_ptr && isPtr1, (p==arg2)? qualifiedType2("::") : qualifiedType1("::"), (p==arg2)? type2 : type1); @@ -52,6 +52,9 @@ void ReturnValue::wrap_result(const string& result, FileWriter& file, const Type string cppType2 = qualifiedType2("::"), matlabType2 = qualifiedType2("."); if (isPair) { + // For a pair, store the returned pair so we do not evaluate the function twice + file.oss << " " << return_type(false, pair) << " pairResult = " << result << ";\n"; + // first return value in pair if (category1 == ReturnValue::CLASS) { // if we are going to make one string objCopy, ptrType; @@ -59,21 +62,21 @@ void ReturnValue::wrap_result(const string& result, FileWriter& file, const Type const bool isVirtual = typeAttributes.at(cppType1).isVirtual; if(isVirtual) { if(isPtr1) - objCopy = result + ".first"; + objCopy = "pairResult.first"; else - objCopy = result + ".first.clone()"; + objCopy = "pairResult.first.clone()"; } else { if(isPtr1) - objCopy = result + ".first"; + objCopy = "pairResult.first"; else - objCopy = ptrType + "(new " + cppType1 + "(" + result + ".first))"; + objCopy = ptrType + "(new " + cppType1 + "(pairResult.first))"; } file.oss << " out[0] = wrap_shared_ptr(" << objCopy << ",\"" << matlabType1 << "\", " << (isVirtual ? "true" : "false") << ");\n"; } else if(isPtr1) { - file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(" << result << ".first);" << endl; + file.oss << " Shared" << type1 <<"* ret = new Shared" << type1 << "(pairResult.first);" << endl; file.oss << " out[0] = wrap_shared_ptr(ret,\"" << matlabType1 << "\", false);\n"; } else // if basis type - file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(" << result << ".first);\n"; + file.oss << " out[0] = wrap< " << return_type(true,arg1) << " >(pairResult.first);\n"; // second return value in pair if (category2 == ReturnValue::CLASS) { // if we are going to make one @@ -82,21 +85,21 @@ void ReturnValue::wrap_result(const string& result, FileWriter& file, const Type const bool isVirtual = typeAttributes.at(cppType2).isVirtual; if(isVirtual) { if(isPtr2) - objCopy = result + ".second"; + objCopy = "pairResult.second"; else - objCopy = result + ".second.clone()"; + objCopy = "pairResult.second.clone()"; } else { if(isPtr2) - objCopy = result + ".second"; + objCopy = "pairResult.second"; else - objCopy = ptrType + "(new " + cppType2 + "(" + result + ".second))"; + objCopy = ptrType + "(new " + cppType2 + "(pairResult.second))"; } - file.oss << " out[0] = wrap_shared_ptr(" << objCopy << ",\"" << matlabType2 << "\", " << (isVirtual ? "true" : "false") << ");\n"; + file.oss << " out[1] = wrap_shared_ptr(" << objCopy << ",\"" << matlabType2 << "\", " << (isVirtual ? "true" : "false") << ");\n"; } else if(isPtr2) { - file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(" << result << ".second);" << endl; + file.oss << " Shared" << type2 <<"* ret = new Shared" << type2 << "(pairResult.second);" << endl; file.oss << " out[1] = wrap_shared_ptr(ret,\"" << matlabType2 << "\");\n"; } else - file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(" << result << ".second);\n"; + file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(pairResult.second);\n"; } else if (category1 == ReturnValue::CLASS){ string objCopy, ptrType; From 40cdab999b17eca78f98fb1bf04806fd1422505c Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 26 Jul 2012 14:48:33 +0000 Subject: [PATCH 719/914] Updated expected files so that testWrap passes --- wrap/tests/expected/geometry_wrapper.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index 93fde1ca4..d18ad2ec1 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -299,8 +299,9 @@ void Test_create_MixedPtrs_22(int nargout, mxArray *out[], int nargin, const mxA typedef boost::shared_ptr Shared; checkArguments("create_MixedPtrs",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); - out[0] = wrap_shared_ptr(SharedTest(new Test(obj->create_MixedPtrs().first)),"Test", false); - out[0] = wrap_shared_ptr(obj->create_MixedPtrs().second,"Test", false); + pair< Test, SharedTest > pairResult = obj->create_MixedPtrs(); + out[0] = wrap_shared_ptr(SharedTest(new Test(pairResult.first)),"Test", false); + out[1] = wrap_shared_ptr(pairResult.second,"Test", false); } void Test_create_ptrs_23(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -310,8 +311,9 @@ void Test_create_ptrs_23(int nargout, mxArray *out[], int nargin, const mxArray typedef boost::shared_ptr Shared; checkArguments("create_ptrs",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); - out[0] = wrap_shared_ptr(obj->create_ptrs().first,"Test", false); - out[0] = wrap_shared_ptr(obj->create_ptrs().second,"Test", false); + pair< SharedTest, SharedTest > pairResult = obj->create_ptrs(); + out[0] = wrap_shared_ptr(pairResult.first,"Test", false); + out[1] = wrap_shared_ptr(pairResult.second,"Test", false); } void Test_print_24(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -413,8 +415,9 @@ void Test_return_pair_34(int nargout, mxArray *out[], int nargin, const mxArray Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); Vector v = unwrap< Vector >(in[1]); Matrix A = unwrap< Matrix >(in[2]); - out[0] = wrap< Vector >(obj->return_pair(v,A).first); - out[1] = wrap< Matrix >(obj->return_pair(v,A).second); + pair< Vector, Matrix > pairResult = obj->return_pair(v,A); + out[0] = wrap< Vector >(pairResult.first); + out[1] = wrap< Matrix >(pairResult.second); } void Test_return_ptrs_35(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -426,8 +429,9 @@ void Test_return_ptrs_35(int nargout, mxArray *out[], int nargin, const mxArray Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "ptr_Test"); - out[0] = wrap_shared_ptr(obj->return_ptrs(p1,p2).first,"Test", false); - out[0] = wrap_shared_ptr(obj->return_ptrs(p1,p2).second,"Test", false); + pair< SharedTest, SharedTest > pairResult = obj->return_ptrs(p1,p2); + out[0] = wrap_shared_ptr(pairResult.first,"Test", false); + out[1] = wrap_shared_ptr(pairResult.second,"Test", false); } void Test_return_size_t_36(int nargout, mxArray *out[], int nargin, const mxArray *in[]) From b32931f8798496c2fcd66c5b88bffa7e22c77804 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 27 Jul 2012 04:44:02 +0000 Subject: [PATCH 720/914] Examples that show rotation-first strategy --- examples/Data/w10000-odom.graph | 80186 ++++++++++++++++++++ matlab/examples/Pose2SLAMExample_graph.m | 10 +- matlab/examples/Pose2SLAMExample_graph1.m | 36 + matlab/examples/Pose2SLAMExample_graph2.m | 52 + 4 files changed, 80281 insertions(+), 3 deletions(-) create mode 100644 examples/Data/w10000-odom.graph create mode 100644 matlab/examples/Pose2SLAMExample_graph1.m create mode 100644 matlab/examples/Pose2SLAMExample_graph2.m diff --git a/examples/Data/w10000-odom.graph b/examples/Data/w10000-odom.graph new file mode 100644 index 000000000..56c385cce --- /dev/null +++ b/examples/Data/w10000-odom.graph @@ -0,0 +1,80186 @@ +VERTEX2 0 0 0 0 +VERTEX2 1 0.995595 0.0837204 0.0146728 +VERTEX2 2 2.0463 0.0352563 -0.0332615 +VERTEX2 3 3.01173 0.00117694 -0.0153904 +VERTEX2 4 4.00973 -0.0790194 -0.02875 +VERTEX2 5 5.0196 -0.0664912 -0.039715 +VERTEX2 6 5.02744 0.934341 1.51768 +VERTEX2 7 5.04775 1.89323 1.51033 +VERTEX2 8 5.15306 2.87418 1.49866 +VERTEX2 9 5.22304 3.87497 1.48364 +VERTEX2 10 5.23596 4.87041 1.47951 +VERTEX2 11 4.24581 4.94796 2.99944 +VERTEX2 12 3.22758 5.09551 2.99492 +VERTEX2 13 2.19142 5.16887 2.98707 +VERTEX2 14 1.1311 5.24329 2.97244 +VERTEX2 15 0.158988 5.30427 2.95438 +VERTEX2 16 -0.12526 4.26995 -1.76551 +VERTEX2 17 -0.25431 3.29165 -1.77099 +VERTEX2 18 -0.413555 2.30595 -1.76019 +VERTEX2 19 -0.536073 1.30685 -1.75991 +VERTEX2 20 -0.808468 0.302589 -1.76466 +VERTEX2 21 0.165652 0.0941948 -0.204681 +VERTEX2 22 1.09464 -0.0109951 -0.196319 +VERTEX2 23 2.15691 -0.187264 -0.20809 +VERTEX2 24 3.19115 -0.448207 -0.192611 +VERTEX2 25 4.13241 -0.636131 -0.162687 +VERTEX2 26 4.34104 0.512161 1.44413 +VERTEX2 27 4.44536 1.59548 1.42312 +VERTEX2 28 4.57241 2.60423 1.37618 +VERTEX2 29 4.86591 3.53433 1.35616 +VERTEX2 30 5.11392 4.4801 1.35985 +VERTEX2 31 4.21358 4.6527 2.91174 +VERTEX2 32 3.22654 4.82431 2.94929 +VERTEX2 33 2.23774 5.00761 2.97485 +VERTEX2 34 1.22736 5.20153 2.98412 +VERTEX2 35 0.123255 5.26802 2.9767 +VERTEX2 36 0.00632935 4.33864 -1.76346 +VERTEX2 37 -0.10879 3.36173 -1.7901 +VERTEX2 38 -0.321951 2.4384 -1.78648 +VERTEX2 39 -0.543773 1.34377 -1.77905 +VERTEX2 40 -0.658597 0.382801 -1.78632 +VERTEX2 41 0.317835 0.0716759 -0.235552 +VERTEX2 42 1.3002 -0.181376 -0.217406 +VERTEX2 43 2.34947 -0.372484 -0.22532 +VERTEX2 44 3.34502 -0.63322 -0.236028 +VERTEX2 45 4.3567 -0.866613 -0.24513 +VERTEX2 46 4.61743 0.074884 1.32649 +VERTEX2 47 4.7283 1.10386 1.31325 +VERTEX2 48 4.88942 2.06218 1.34353 +VERTEX2 49 5.1224 3.05224 1.34 +VERTEX2 50 5.37031 3.89715 1.33962 +VERTEX2 51 4.40295 4.12271 2.91276 +VERTEX2 52 3.40284 4.39024 2.9116 +VERTEX2 53 2.43673 4.61578 2.93887 +VERTEX2 54 1.51408 4.75597 2.91757 +VERTEX2 55 0.505735 4.96923 2.92324 +VERTEX2 56 0.256695 4.01175 -1.78543 +VERTEX2 57 0.0116126 2.99092 -1.79932 +VERTEX2 58 -0.153788 2.07052 -1.80614 +VERTEX2 59 -0.31455 1.12993 -1.83961 +VERTEX2 60 -0.593175 0.109086 -1.83163 +VERTEX2 61 -1.51899 0.241119 2.87633 +VERTEX2 62 -2.44041 0.564876 2.86065 +VERTEX2 63 -3.38567 0.881461 2.88557 +VERTEX2 64 -4.33636 1.15673 2.87003 +VERTEX2 65 -5.3523 1.33309 2.88766 +VERTEX2 66 -5.08987 2.28075 1.31311 +VERTEX2 67 -4.8429 3.23082 1.32403 +VERTEX2 68 -4.59105 4.20251 1.31499 +VERTEX2 69 -4.38824 5.10708 1.32873 +VERTEX2 70 -4.13462 5.98725 1.31402 +VERTEX2 71 -5.15517 6.29412 2.90024 +VERTEX2 72 -6.16852 6.57768 2.91315 +VERTEX2 73 -7.19212 6.7759 2.90733 +VERTEX2 74 -8.19083 6.96321 2.87753 +VERTEX2 75 -9.21776 7.31653 2.85231 +VERTEX2 76 -9.46536 6.44658 -1.86253 +VERTEX2 77 -9.70116 5.60413 -1.86719 +VERTEX2 78 -10.0031 4.63377 -1.8642 +VERTEX2 79 -10.2892 3.70939 -1.85209 +VERTEX2 80 -10.5468 2.73555 -1.86536 +VERTEX2 81 -9.53131 2.42844 -0.348286 +VERTEX2 82 -8.67728 2.03155 -0.326912 +VERTEX2 83 -7.76543 1.7035 -0.340149 +VERTEX2 84 -6.72871 1.23422 -0.332391 +VERTEX2 85 -5.7871 0.960473 -0.298466 +VERTEX2 86 -6.15287 -0.0181319 -1.84594 +VERTEX2 87 -6.48069 -0.957942 -1.82387 +VERTEX2 88 -6.74441 -1.90271 -1.83019 +VERTEX2 89 -6.98263 -2.8633 -1.82672 +VERTEX2 90 -7.25581 -3.79723 -1.7991 +VERTEX2 91 -6.24938 -3.97274 -0.228747 +VERTEX2 92 -5.2193 -4.22592 -0.231118 +VERTEX2 93 -4.2791 -4.41808 -0.244412 +VERTEX2 94 -3.27605 -4.63989 -0.262869 +VERTEX2 95 -2.21195 -4.90921 -0.241867 +VERTEX2 96 -1.9446 -3.94139 1.35224 +VERTEX2 97 -1.7284 -2.88069 1.34979 +VERTEX2 98 -1.4787 -1.9068 1.36613 +VERTEX2 99 -1.32193 -0.941704 1.35348 +VERTEX2 100 -1.07148 -0.0252992 1.35446 +VERTEX2 101 -2.03273 0.228716 2.89508 +VERTEX2 102 -3.03517 0.481399 2.90001 +VERTEX2 103 -4.07831 0.666658 2.88897 +VERTEX2 104 -4.97053 0.927183 2.90999 +VERTEX2 105 -5.95187 1.14752 2.89351 +VERTEX2 106 -5.79719 1.99354 1.32631 +VERTEX2 107 -5.53203 2.9937 1.27327 +VERTEX2 108 -5.18084 3.98453 1.25315 +VERTEX2 109 -4.91489 4.88054 1.23434 +VERTEX2 110 -4.57738 5.85163 1.20528 +VERTEX2 111 -5.51058 6.17551 2.78307 +VERTEX2 112 -6.45034 6.57273 2.79211 +VERTEX2 113 -7.38619 6.90802 2.79463 +VERTEX2 114 -8.36923 7.34601 2.79528 +VERTEX2 115 -9.26885 7.79083 2.77514 +VERTEX2 116 -8.90116 8.77833 1.20582 +VERTEX2 117 -8.51372 9.71101 1.25156 +VERTEX2 118 -8.15017 10.6798 1.22892 +VERTEX2 119 -7.88586 11.5802 1.27389 +VERTEX2 120 -7.64723 12.5462 1.28499 +VERTEX2 121 -8.65477 12.914 2.85116 +VERTEX2 122 -9.64587 13.2092 2.84568 +VERTEX2 123 -10.6661 13.5209 2.85179 +VERTEX2 124 -11.6149 13.7381 2.84877 +VERTEX2 125 -12.5932 13.9995 2.81969 +VERTEX2 126 -12.3159 15.0016 1.24736 +VERTEX2 127 -11.9441 15.9773 1.23889 +VERTEX2 128 -11.6362 16.8814 1.24381 +VERTEX2 129 -11.3895 17.865 1.24911 +VERTEX2 130 -11.1087 18.8247 1.26057 +VERTEX2 131 -11.9256 19.1785 2.85408 +VERTEX2 132 -12.9026 19.352 2.84362 +VERTEX2 133 -13.8659 19.7619 2.79681 +VERTEX2 134 -14.8086 20.1455 2.81274 +VERTEX2 135 -15.7621 20.4734 2.77939 +VERTEX2 136 -15.3236 21.3872 1.2034 +VERTEX2 137 -14.9643 22.3399 1.1969 +VERTEX2 138 -14.6499 23.2974 1.21387 +VERTEX2 139 -14.2421 24.289 1.2444 +VERTEX2 140 -13.9185 25.2302 1.22456 +VERTEX2 141 -14.8985 25.5809 2.79194 +VERTEX2 142 -15.8303 25.9001 2.78248 +VERTEX2 143 -16.7861 26.2595 2.79595 +VERTEX2 144 -17.7704 26.5561 2.80504 +VERTEX2 145 -18.7187 26.8958 2.82832 +VERTEX2 146 -19.0239 25.9966 -1.88734 +VERTEX2 147 -19.3603 25.069 -1.90573 +VERTEX2 148 -19.6805 24.1352 -1.88936 +VERTEX2 149 -20.0969 23.1646 -1.90023 +VERTEX2 150 -20.3997 22.2406 -1.88261 +VERTEX2 151 -21.25 22.551 2.85369 +VERTEX2 152 -22.2785 22.9044 2.86125 +VERTEX2 153 -23.2205 23.2216 2.89262 +VERTEX2 154 -24.181 23.3376 2.86869 +VERTEX2 155 -25.1643 23.665 2.83199 +VERTEX2 156 -24.8169 24.6326 1.23778 +VERTEX2 157 -24.4129 25.6799 1.25887 +VERTEX2 158 -24.1549 26.6661 1.27352 +VERTEX2 159 -23.7919 27.572 1.25285 +VERTEX2 160 -23.4097 28.5401 1.26524 +VERTEX2 161 -24.373 28.8287 2.85514 +VERTEX2 162 -25.322 29.1378 2.84571 +VERTEX2 163 -26.2798 29.4546 2.83014 +VERTEX2 164 -27.1809 29.7961 2.85348 +VERTEX2 165 -28.0934 30.0373 2.85997 +VERTEX2 166 -27.8789 31.0095 1.30777 +VERTEX2 167 -27.6131 31.993 1.31028 +VERTEX2 168 -27.3978 32.9505 1.28446 +VERTEX2 169 -27.2392 33.9482 1.28867 +VERTEX2 170 -27.012 34.8715 1.28123 +VERTEX2 171 -26.0722 34.5849 -0.276286 +VERTEX2 172 -25.1495 34.3415 -0.294066 +VERTEX2 173 -24.2029 34.0333 -0.318192 +VERTEX2 174 -23.2781 33.7646 -0.303061 +VERTEX2 175 -22.381 33.4325 -0.305577 +VERTEX2 176 -22.0966 34.4303 1.28507 +VERTEX2 177 -21.751 35.3871 1.32406 +VERTEX2 178 -21.5548 36.3964 1.29875 +VERTEX2 179 -21.3227 37.3181 1.30108 +VERTEX2 180 -21.1306 38.3562 1.28034 +VERTEX2 181 -22.0873 38.7165 2.854 +VERTEX2 182 -23.0256 38.9093 2.89201 +VERTEX2 183 -24.083 39.1834 2.8999 +VERTEX2 184 -24.995 39.4452 2.89616 +VERTEX2 185 -26.0653 39.7412 2.87677 +VERTEX2 186 -26.3053 38.8001 -1.84742 +VERTEX2 187 -26.5494 37.8211 -1.81656 +VERTEX2 188 -26.732 36.8951 -1.81289 +VERTEX2 189 -27.0311 35.8802 -1.80985 +VERTEX2 190 -27.3215 34.9177 -1.81162 +VERTEX2 191 -26.3781 34.6588 -0.225313 +VERTEX2 192 -25.3852 34.4304 -0.231752 +VERTEX2 193 -24.4088 34.2154 -0.249897 +VERTEX2 194 -23.4685 33.9799 -0.256 +VERTEX2 195 -22.5273 33.7573 -0.211831 +VERTEX2 196 -22.348 34.7571 1.41032 +VERTEX2 197 -22.1829 35.7678 1.39322 +VERTEX2 198 -21.9718 36.7004 1.37121 +VERTEX2 199 -21.7402 37.6626 1.36259 +VERTEX2 200 -21.4603 38.6756 1.35672 +VERTEX2 201 -22.4102 38.8271 2.94661 +VERTEX2 202 -23.4372 38.9585 2.93555 +VERTEX2 203 -24.3272 39.2563 2.89147 +VERTEX2 204 -25.2789 39.4651 2.88153 +VERTEX2 205 -26.2813 39.7413 2.90132 +VERTEX2 206 -26.0078 40.6895 1.34433 +VERTEX2 207 -25.7555 41.7375 1.34567 +VERTEX2 208 -25.5341 42.7266 1.34725 +VERTEX2 209 -25.2228 43.6814 1.31399 +VERTEX2 210 -24.9768 44.7091 1.33749 +VERTEX2 211 -25.8715 44.925 2.88943 +VERTEX2 212 -26.928 45.1303 2.88763 +VERTEX2 213 -27.9305 45.4822 2.88563 +VERTEX2 214 -28.8075 45.6985 2.88182 +VERTEX2 215 -29.8143 45.9419 2.89667 +VERTEX2 216 -30.054 45.0006 -1.80906 +VERTEX2 217 -30.2532 44.0192 -1.80513 +VERTEX2 218 -30.4332 43.0942 -1.79445 +VERTEX2 219 -30.6871 42.0851 -1.76101 +VERTEX2 220 -30.9337 41.1196 -1.77042 +VERTEX2 221 -30.0609 41.0607 -0.162306 +VERTEX2 222 -29.0737 40.9459 -0.179675 +VERTEX2 223 -28.1398 40.7795 -0.185669 +VERTEX2 224 -27.1318 40.6651 -0.210762 +VERTEX2 225 -26.2021 40.5598 -0.215218 +VERTEX2 226 -26.0074 41.474 1.36486 +VERTEX2 227 -25.7507 42.4446 1.38225 +VERTEX2 228 -25.5538 43.399 1.36897 +VERTEX2 229 -25.2516 44.414 1.35733 +VERTEX2 230 -24.9514 45.4053 1.36018 +VERTEX2 231 -24.0443 45.2364 -0.235616 +VERTEX2 232 -23.0857 44.9845 -0.253387 +VERTEX2 233 -22.0878 44.7297 -0.26546 +VERTEX2 234 -21.0676 44.501 -0.287583 +VERTEX2 235 -20.0664 44.2083 -0.326104 +VERTEX2 236 -19.7829 45.2151 1.23532 +VERTEX2 237 -19.4417 46.1221 1.24974 +VERTEX2 238 -19.1661 46.9965 1.22106 +VERTEX2 239 -18.9263 47.9163 1.20355 +VERTEX2 240 -18.5067 48.8172 1.19158 +VERTEX2 241 -19.4189 49.2207 2.73705 +VERTEX2 242 -20.2899 49.6403 2.76965 +VERTEX2 243 -21.3168 50.123 2.77272 +VERTEX2 244 -22.2974 50.5509 2.78988 +VERTEX2 245 -23.2547 50.8764 2.74502 +VERTEX2 246 -23.6524 49.9889 -1.95326 +VERTEX2 247 -24.0379 48.9702 -1.98637 +VERTEX2 248 -24.4585 48.0876 -1.99167 +VERTEX2 249 -24.84 47.2183 -1.99873 +VERTEX2 250 -25.1821 46.3191 -1.97351 +VERTEX2 251 -24.2757 45.9373 -0.376597 +VERTEX2 252 -23.3974 45.5526 -0.379423 +VERTEX2 253 -22.4914 45.2354 -0.371224 +VERTEX2 254 -21.5175 44.9762 -0.388135 +VERTEX2 255 -20.603 44.6158 -0.415691 +VERTEX2 256 -21.0113 43.7242 -1.99609 +VERTEX2 257 -21.4442 42.8264 -1.98491 +VERTEX2 258 -21.8294 41.8567 -1.95626 +VERTEX2 259 -22.2017 40.9184 -1.96824 +VERTEX2 260 -22.6315 39.9435 -1.94643 +VERTEX2 261 -21.6486 39.5893 -0.363441 +VERTEX2 262 -20.7395 39.2552 -0.365742 +VERTEX2 263 -19.8349 38.8461 -0.35389 +VERTEX2 264 -18.9332 38.5655 -0.375271 +VERTEX2 265 -17.9559 38.1493 -0.370244 +VERTEX2 266 -18.3904 37.2921 -1.91684 +VERTEX2 267 -18.721 36.3405 -1.9177 +VERTEX2 268 -19.138 35.4179 -1.92784 +VERTEX2 269 -19.4322 34.4343 -1.92139 +VERTEX2 270 -19.7713 33.5669 -1.90555 +VERTEX2 271 -18.8606 33.1904 -0.29815 +VERTEX2 272 -17.88 32.9234 -0.298845 +VERTEX2 273 -16.9331 32.6438 -0.274779 +VERTEX2 274 -15.9628 32.407 -0.247858 +VERTEX2 275 -15.0836 32.2157 -0.252306 +VERTEX2 276 -14.7753 33.2536 1.31744 +VERTEX2 277 -14.5327 34.1976 1.32878 +VERTEX2 278 -14.3113 35.095 1.34461 +VERTEX2 279 -14.0304 36.0671 1.34851 +VERTEX2 280 -13.7678 37.075 1.36982 +VERTEX2 281 -14.7563 37.2461 2.92596 +VERTEX2 282 -15.7296 37.4685 2.916 +VERTEX2 283 -16.7 37.746 2.88261 +VERTEX2 284 -17.744 37.9982 2.87691 +VERTEX2 285 -18.7522 38.2356 2.85674 +VERTEX2 286 -19.0352 37.3433 -1.86137 +VERTEX2 287 -19.3624 36.4026 -1.83748 +VERTEX2 288 -19.6776 35.4624 -1.85277 +VERTEX2 289 -20.0675 34.5059 -1.87227 +VERTEX2 290 -20.3325 33.4871 -1.87521 +VERTEX2 291 -19.3884 33.2176 -0.339053 +VERTEX2 292 -18.4374 32.924 -0.336411 +VERTEX2 293 -17.4745 32.5773 -0.325113 +VERTEX2 294 -16.5439 32.2316 -0.303294 +VERTEX2 295 -15.6398 31.8362 -0.318577 +VERTEX2 296 -15.3277 32.7585 1.26981 +VERTEX2 297 -15.0473 33.704 1.28355 +VERTEX2 298 -14.7905 34.7517 1.28236 +VERTEX2 299 -14.5228 35.751 1.28641 +VERTEX2 300 -14.2213 36.699 1.28485 +VERTEX2 301 -13.2077 36.3092 -0.318856 +VERTEX2 302 -12.3042 36.0075 -0.312494 +VERTEX2 303 -11.4225 35.687 -0.319939 +VERTEX2 304 -10.5137 35.4147 -0.313426 +VERTEX2 305 -9.45538 35.1233 -0.321963 +VERTEX2 306 -9.7909 34.2226 -1.92684 +VERTEX2 307 -10.1565 33.3304 -1.91452 +VERTEX2 308 -10.5241 32.3545 -1.91797 +VERTEX2 309 -10.8732 31.3376 -1.92723 +VERTEX2 310 -11.1837 30.4706 -1.89662 +VERTEX2 311 -12.1179 30.7944 2.82715 +VERTEX2 312 -13.0638 31.1527 2.86071 +VERTEX2 313 -14.0315 31.4904 2.82928 +VERTEX2 314 -15.0417 31.7356 2.8523 +VERTEX2 315 -16.0322 31.9509 2.84906 +VERTEX2 316 -16.3984 30.9912 -1.89255 +VERTEX2 317 -16.7651 30.0772 -1.90822 +VERTEX2 318 -17.0457 29.103 -1.89048 +VERTEX2 319 -17.3979 28.1649 -1.87927 +VERTEX2 320 -17.6834 27.1439 -1.8939 +VERTEX2 321 -18.6401 27.5299 2.77126 +VERTEX2 322 -19.6147 27.8401 2.78246 +VERTEX2 323 -20.5004 28.2085 2.77971 +VERTEX2 324 -21.4133 28.578 2.78845 +VERTEX2 325 -22.2835 28.9053 2.77508 +VERTEX2 326 -22.5504 27.9067 -1.91959 +VERTEX2 327 -22.8123 26.9518 -1.91532 +VERTEX2 328 -23.174 26.0094 -1.9084 +VERTEX2 329 -23.5476 25.0236 -1.92869 +VERTEX2 330 -23.7985 24.1215 -1.9256 +VERTEX2 331 -22.8583 23.7922 -0.345008 +VERTEX2 332 -21.8583 23.4649 -0.358998 +VERTEX2 333 -20.8569 23.1006 -0.371323 +VERTEX2 334 -19.9834 22.7196 -0.369225 +VERTEX2 335 -19.0585 22.319 -0.376194 +VERTEX2 336 -18.634 23.2053 1.19002 +VERTEX2 337 -18.2617 24.1418 1.19986 +VERTEX2 338 -17.9894 25.0752 1.23256 +VERTEX2 339 -17.6828 26.0077 1.24314 +VERTEX2 340 -17.3351 26.9921 1.21103 +VERTEX2 341 -18.2116 27.3619 2.7653 +VERTEX2 342 -19.144 27.7007 2.78166 +VERTEX2 343 -20.0757 28.065 2.77345 +VERTEX2 344 -20.9293 28.4635 2.81324 +VERTEX2 345 -21.8963 28.8299 2.82458 +VERTEX2 346 -22.1786 27.8751 -1.93268 +VERTEX2 347 -22.5127 26.9779 -1.94886 +VERTEX2 348 -22.828 26.0345 -1.96537 +VERTEX2 349 -23.2289 25.1817 -1.9617 +VERTEX2 350 -23.6294 24.2901 -1.97133 +VERTEX2 351 -24.5391 24.5992 2.73979 +VERTEX2 352 -25.4309 25.013 2.74053 +VERTEX2 353 -26.3734 25.328 2.71417 +VERTEX2 354 -27.2588 25.7573 2.75051 +VERTEX2 355 -28.2459 26.1965 2.76734 +VERTEX2 356 -28.6742 25.2946 -1.95286 +VERTEX2 357 -29.0163 24.3446 -1.93904 +VERTEX2 358 -29.3925 23.384 -1.95777 +VERTEX2 359 -29.7684 22.4639 -1.96179 +VERTEX2 360 -30.1419 21.4981 -1.99236 +VERTEX2 361 -29.2053 21.0274 -0.419895 +VERTEX2 362 -28.3587 20.6403 -0.387469 +VERTEX2 363 -27.4761 20.3164 -0.376801 +VERTEX2 364 -26.4702 20.0618 -0.381542 +VERTEX2 365 -25.5156 19.7201 -0.388107 +VERTEX2 366 -25.09 20.5839 1.19436 +VERTEX2 367 -24.769 21.6187 1.19079 +VERTEX2 368 -24.3914 22.5497 1.22208 +VERTEX2 369 -24.0584 23.5108 1.25873 +VERTEX2 370 -23.7005 24.4922 1.28808 +VERTEX2 371 -24.6986 24.8846 2.88144 +VERTEX2 372 -25.6465 25.2082 2.8878 +VERTEX2 373 -26.6076 25.4374 2.91634 +VERTEX2 374 -27.6151 25.6313 2.91156 +VERTEX2 375 -28.5505 25.8482 2.92837 +VERTEX2 376 -28.3029 26.7594 1.36296 +VERTEX2 377 -28.1199 27.7541 1.34903 +VERTEX2 378 -27.8674 28.7941 1.33028 +VERTEX2 379 -27.6428 29.7534 1.35401 +VERTEX2 380 -27.3438 30.6897 1.34736 +VERTEX2 381 -26.3313 30.4266 -0.242469 +VERTEX2 382 -25.369 30.2281 -0.257587 +VERTEX2 383 -24.3704 30.04 -0.245353 +VERTEX2 384 -23.3959 29.8264 -0.227806 +VERTEX2 385 -22.4431 29.6227 -0.204447 +VERTEX2 386 -22.1877 30.5583 1.39411 +VERTEX2 387 -21.9428 31.5497 1.38656 +VERTEX2 388 -21.7985 32.6262 1.42117 +VERTEX2 389 -21.62 33.6429 1.43928 +VERTEX2 390 -21.4424 34.6363 1.42607 +VERTEX2 391 -20.4783 34.4613 -0.163793 +VERTEX2 392 -19.515 34.4065 -0.185647 +VERTEX2 393 -18.5137 34.232 -0.172033 +VERTEX2 394 -17.4763 34.0636 -0.174621 +VERTEX2 395 -16.4323 33.9721 -0.18919 +VERTEX2 396 -16.249 34.9471 1.39622 +VERTEX2 397 -16.0593 35.9076 1.40199 +VERTEX2 398 -15.8523 36.858 1.40067 +VERTEX2 399 -15.7188 37.8348 1.43222 +VERTEX2 400 -15.6876 38.7977 1.47882 +VERTEX2 401 -16.7085 38.8344 3.0652 +VERTEX2 402 -17.6405 38.8762 3.07312 +VERTEX2 403 -18.6831 38.9395 3.03995 +VERTEX2 404 -19.636 39.0568 3.07563 +VERTEX2 405 -20.6096 39.0536 3.10228 +VERTEX2 406 -20.6611 38.0146 -1.59817 +VERTEX2 407 -20.6602 36.9905 -1.61391 +VERTEX2 408 -20.666 36.0257 -1.61759 +VERTEX2 409 -20.7377 35.0383 -1.62027 +VERTEX2 410 -20.7528 34.0078 -1.62894 +VERTEX2 411 -19.7475 33.9495 -0.0521872 +VERTEX2 412 -18.7921 33.8745 -0.056291 +VERTEX2 413 -17.8845 33.8383 -0.0692387 +VERTEX2 414 -16.9345 33.7772 -0.0626386 +VERTEX2 415 -15.893 33.714 -0.0308337 +VERTEX2 416 -15.9293 32.6855 -1.59268 +VERTEX2 417 -15.9728 31.6386 -1.58004 +VERTEX2 418 -15.9688 30.6634 -1.57192 +VERTEX2 419 -15.9158 29.656 -1.57184 +VERTEX2 420 -15.9716 28.6282 -1.60697 +VERTEX2 421 -17.015 28.6097 3.11305 +VERTEX2 422 -18.0815 28.6471 -3.12371 +VERTEX2 423 -19.1056 28.7267 -3.12006 +VERTEX2 424 -20.1002 28.5618 -3.12378 +VERTEX2 425 -21.1118 28.5738 3.13581 +VERTEX2 426 -21.002 29.557 1.57956 +VERTEX2 427 -21.0645 30.5216 1.58428 +VERTEX2 428 -21.0061 31.5983 1.59068 +VERTEX2 429 -21.0978 32.6637 1.5728 +VERTEX2 430 -21.0999 33.7164 1.56708 +VERTEX2 431 -20.1415 33.7711 -0.00796042 +VERTEX2 432 -19.1367 33.8244 -0.0269536 +VERTEX2 433 -18.1687 33.9017 -0.0206863 +VERTEX2 434 -17.2404 33.8303 -0.00308791 +VERTEX2 435 -16.1908 33.7664 0.0044507 +VERTEX2 436 -16.1697 34.7566 1.57882 +VERTEX2 437 -16.1593 35.6998 1.59318 +VERTEX2 438 -16.1701 36.6987 1.59227 +VERTEX2 439 -16.2103 37.6566 1.59269 +VERTEX2 440 -16.2563 38.6675 1.60529 +VERTEX2 441 -17.2887 38.6577 -3.12015 +VERTEX2 442 -18.2946 38.6139 -3.11699 +VERTEX2 443 -19.3174 38.5031 -3.08179 +VERTEX2 444 -20.2516 38.4505 -3.08456 +VERTEX2 445 -21.2156 38.3987 -3.07697 +VERTEX2 446 -21.2076 37.3547 -1.4834 +VERTEX2 447 -21.0911 36.3677 -1.49234 +VERTEX2 448 -21.0205 35.3987 -1.48586 +VERTEX2 449 -20.8273 34.3143 -1.49041 +VERTEX2 450 -20.6989 33.3054 -1.47538 +VERTEX2 451 -19.6942 33.3338 0.0712095 +VERTEX2 452 -18.7357 33.4346 0.0769025 +VERTEX2 453 -17.8039 33.5266 0.0628561 +VERTEX2 454 -16.8361 33.484 0.0566204 +VERTEX2 455 -15.727 33.5384 0.0505723 +VERTEX2 456 -15.7124 34.5607 1.58273 +VERTEX2 457 -15.7464 35.5518 1.58792 +VERTEX2 458 -15.754 36.5886 1.56447 +VERTEX2 459 -15.6649 37.5279 1.5594 +VERTEX2 460 -15.7398 38.5341 1.58711 +VERTEX2 461 -16.8077 38.5603 -3.11573 +VERTEX2 462 -17.7759 38.4898 -3.07059 +VERTEX2 463 -18.8834 38.4116 -3.07478 +VERTEX2 464 -19.8479 38.3587 -3.09401 +VERTEX2 465 -20.8661 38.2304 -3.10684 +VERTEX2 466 -20.8075 37.2047 -1.52683 +VERTEX2 467 -20.779 36.2848 -1.55015 +VERTEX2 468 -20.6945 35.2877 -1.56995 +VERTEX2 469 -20.6358 34.2614 -1.56458 +VERTEX2 470 -20.6463 33.2925 -1.59838 +VERTEX2 471 -19.5773 33.3107 -0.0447117 +VERTEX2 472 -18.539 33.3718 -0.0347506 +VERTEX2 473 -17.5573 33.3363 -0.026354 +VERTEX2 474 -16.5009 33.4361 -0.0462468 +VERTEX2 475 -15.4892 33.3726 -0.0265261 +VERTEX2 476 -15.4475 34.4479 1.56715 +VERTEX2 477 -15.4307 35.4387 1.56971 +VERTEX2 478 -15.4559 36.4302 1.5765 +VERTEX2 479 -15.4588 37.4202 1.57899 +VERTEX2 480 -15.5089 38.4834 1.57828 +VERTEX2 481 -16.5774 38.4369 3.12989 +VERTEX2 482 -17.5579 38.5364 3.12642 +VERTEX2 483 -18.6101 38.5232 3.13081 +VERTEX2 484 -19.6845 38.5496 3.11261 +VERTEX2 485 -20.6666 38.5573 3.13313 +VERTEX2 486 -20.627 39.5345 1.57895 +VERTEX2 487 -20.6097 40.4498 1.58324 +VERTEX2 488 -20.6518 41.3839 1.60197 +VERTEX2 489 -20.7194 42.4555 1.60489 +VERTEX2 490 -20.7839 43.4675 1.62853 +VERTEX2 491 -21.7812 43.3464 -3.06077 +VERTEX2 492 -22.7651 43.3524 -3.07233 +VERTEX2 493 -23.7137 43.2676 -3.08112 +VERTEX2 494 -24.7108 43.1861 -3.1228 +VERTEX2 495 -25.7169 43.1162 -3.12734 +VERTEX2 496 -25.619 42.0863 -1.55635 +VERTEX2 497 -25.7084 41.0983 -1.57379 +VERTEX2 498 -25.7233 39.9648 -1.59447 +VERTEX2 499 -25.6885 38.8444 -1.62745 +VERTEX2 500 -25.8082 37.826 -1.59967 +VERTEX2 501 -26.8249 37.8904 3.10413 +VERTEX2 502 -27.8383 37.8749 3.1207 +VERTEX2 503 -28.9027 37.8553 3.11469 +VERTEX2 504 -29.9196 37.8782 3.12054 +VERTEX2 505 -30.9371 37.9088 3.11621 +VERTEX2 506 -30.9629 36.9776 -1.58487 +VERTEX2 507 -30.9939 35.9428 -1.57237 +VERTEX2 508 -30.9699 34.8807 -1.55654 +VERTEX2 509 -30.9624 33.8153 -1.5756 +VERTEX2 510 -30.9054 32.7995 -1.56046 +VERTEX2 511 -31.9238 32.8201 3.1276 +VERTEX2 512 -32.92 32.8315 3.13714 +VERTEX2 513 -33.9926 32.8478 3.12515 +VERTEX2 514 -34.9629 32.8578 -3.10501 +VERTEX2 515 -35.9359 32.8872 -3.10831 +VERTEX2 516 -35.8714 31.9253 -1.54071 +VERTEX2 517 -35.8734 30.9232 -1.5386 +VERTEX2 518 -35.8466 29.8972 -1.5636 +VERTEX2 519 -35.9587 28.8379 -1.55838 +VERTEX2 520 -35.927 27.815 -1.56138 +VERTEX2 521 -36.975 27.893 -3.12172 +VERTEX2 522 -38.0207 27.8224 -3.11362 +VERTEX2 523 -38.966 27.787 -3.1181 +VERTEX2 524 -39.9962 27.9022 -3.10857 +VERTEX2 525 -40.9606 27.96 -3.10061 +VERTEX2 526 -40.8989 26.968 -1.53518 +VERTEX2 527 -40.8216 25.9807 -1.51264 +VERTEX2 528 -40.7048 24.9999 -1.49511 +VERTEX2 529 -40.5554 23.9958 -1.45133 +VERTEX2 530 -40.4688 22.9643 -1.46467 +VERTEX2 531 -39.5134 23.1017 0.111118 +VERTEX2 532 -38.606 23.2063 0.0906616 +VERTEX2 533 -37.5833 23.3372 0.109496 +VERTEX2 534 -36.5849 23.4548 0.131992 +VERTEX2 535 -35.6826 23.6008 0.105104 +VERTEX2 536 -35.804 24.5184 1.65318 +VERTEX2 537 -35.9447 25.5368 1.65844 +VERTEX2 538 -35.9628 26.5835 1.68707 +VERTEX2 539 -36.1223 27.6562 1.72951 +VERTEX2 540 -36.3303 28.712 1.72896 +VERTEX2 541 -35.3277 28.824 0.163767 +VERTEX2 542 -34.341 28.9517 0.206348 +VERTEX2 543 -33.428 29.1756 0.185649 +VERTEX2 544 -32.5554 29.4219 0.181183 +VERTEX2 545 -31.5665 29.6919 0.205359 +VERTEX2 546 -31.4265 28.7439 -1.36439 +VERTEX2 547 -31.2645 27.7504 -1.35927 +VERTEX2 548 -31.0016 26.6924 -1.33592 +VERTEX2 549 -30.7484 25.695 -1.33819 +VERTEX2 550 -30.5453 24.7153 -1.35332 +VERTEX2 551 -31.6392 24.5421 -2.94047 +VERTEX2 552 -32.5928 24.2634 -2.93748 +VERTEX2 553 -33.5375 23.9883 -2.95063 +VERTEX2 554 -34.5053 23.7055 -2.95621 +VERTEX2 555 -35.5168 23.5134 -2.93892 +VERTEX2 556 -35.3024 22.5561 -1.38119 +VERTEX2 557 -35.1096 21.6194 -1.36074 +VERTEX2 558 -34.8436 20.5562 -1.3806 +VERTEX2 559 -34.5976 19.5913 -1.40553 +VERTEX2 560 -34.4969 18.5549 -1.43055 +VERTEX2 561 -35.4984 18.4339 -3.00045 +VERTEX2 562 -36.4775 18.3044 -2.9826 +VERTEX2 563 -37.4226 18.1251 -3.00977 +VERTEX2 564 -38.4417 18.0143 -3.00536 +VERTEX2 565 -39.4207 17.8236 -3.02269 +VERTEX2 566 -39.356 16.8019 -1.44369 +VERTEX2 567 -39.2731 15.8434 -1.40812 +VERTEX2 568 -39.1723 14.848 -1.39642 +VERTEX2 569 -38.9924 13.7904 -1.35397 +VERTEX2 570 -38.7902 12.8783 -1.35036 +VERTEX2 571 -39.7912 12.7865 -2.89684 +VERTEX2 572 -40.8111 12.6045 -2.89672 +VERTEX2 573 -41.8832 12.3676 -2.92148 +VERTEX2 574 -42.7849 12.1571 -2.91922 +VERTEX2 575 -43.6555 11.9582 -2.90483 +VERTEX2 576 -43.3581 10.988 -1.32562 +VERTEX2 577 -43.1881 10.0829 -1.31886 +VERTEX2 578 -42.9614 9.145 -1.31429 +VERTEX2 579 -42.6528 8.17221 -1.25377 +VERTEX2 580 -42.3244 7.21948 -1.23804 +VERTEX2 581 -43.3202 6.93211 -2.8157 +VERTEX2 582 -44.2591 6.69289 -2.83828 +VERTEX2 583 -45.1786 6.43882 -2.82063 +VERTEX2 584 -46.2132 6.08163 -2.85554 +VERTEX2 585 -47.1453 5.90572 -2.85541 +VERTEX2 586 -46.907 4.82954 -1.32687 +VERTEX2 587 -46.6772 3.86996 -1.29134 +VERTEX2 588 -46.3498 2.90769 -1.29197 +VERTEX2 589 -46.0623 1.94628 -1.32324 +VERTEX2 590 -45.7736 1.02674 -1.33422 +VERTEX2 591 -46.6854 0.763833 -2.91134 +VERTEX2 592 -47.6583 0.468389 -2.89787 +VERTEX2 593 -48.5857 0.284282 -2.89852 +VERTEX2 594 -49.5594 0.12518 -2.9448 +VERTEX2 595 -50.4984 -0.0739373 -2.93749 +VERTEX2 596 -50.3568 -1.03602 -1.37384 +VERTEX2 597 -50.2183 -2.06684 -1.37834 +VERTEX2 598 -50.0039 -3.05411 -1.39443 +VERTEX2 599 -49.8883 -4.06061 -1.40454 +VERTEX2 600 -49.6528 -5.01397 -1.40687 +VERTEX2 601 -48.6774 -4.86862 0.133456 +VERTEX2 602 -47.7752 -4.75667 0.142568 +VERTEX2 603 -46.76 -4.60527 0.0958657 +VERTEX2 604 -45.8175 -4.48571 0.12711 +VERTEX2 605 -44.6973 -4.30745 0.155031 +VERTEX2 606 -44.5693 -5.26432 -1.41126 +VERTEX2 607 -44.3542 -6.22993 -1.40932 +VERTEX2 608 -44.2066 -7.21197 -1.41567 +VERTEX2 609 -44.1165 -8.10264 -1.41239 +VERTEX2 610 -43.9601 -9.09737 -1.43514 +VERTEX2 611 -44.9516 -9.26971 -3.04093 +VERTEX2 612 -46.0113 -9.30883 -3.06309 +VERTEX2 613 -46.8852 -9.36808 -3.06266 +VERTEX2 614 -47.8935 -9.49085 -3.06295 +VERTEX2 615 -48.8586 -9.59517 -3.05772 +VERTEX2 616 -48.7866 -10.5949 -1.47851 +VERTEX2 617 -48.6953 -11.6065 -1.48143 +VERTEX2 618 -48.5654 -12.5841 -1.50002 +VERTEX2 619 -48.495 -13.4789 -1.49079 +VERTEX2 620 -48.3229 -14.5342 -1.49641 +VERTEX2 621 -49.3584 -14.5726 -3.07087 +VERTEX2 622 -50.3368 -14.6909 -3.08496 +VERTEX2 623 -51.3678 -14.6928 -3.11971 +VERTEX2 624 -52.3266 -14.6801 -3.10734 +VERTEX2 625 -53.314 -14.7485 -3.12081 +VERTEX2 626 -53.2913 -13.7338 1.55877 +VERTEX2 627 -53.2373 -12.7794 1.55096 +VERTEX2 628 -53.2567 -11.7593 1.56609 +VERTEX2 629 -53.2344 -10.7285 1.55205 +VERTEX2 630 -53.2076 -9.73736 1.55954 +VERTEX2 631 -54.1981 -9.65468 3.12434 +VERTEX2 632 -55.173 -9.69023 3.12313 +VERTEX2 633 -56.1151 -9.66489 3.1189 +VERTEX2 634 -57.099 -9.69483 3.10769 +VERTEX2 635 -58.0125 -9.76834 3.10907 +VERTEX2 636 -58.0476 -10.7582 -1.63549 +VERTEX2 637 -58.066 -11.7669 -1.64131 +VERTEX2 638 -58.1335 -12.7881 -1.59849 +VERTEX2 639 -58.1527 -13.7578 -1.56366 +VERTEX2 640 -58.123 -14.7728 -1.54041 +VERTEX2 641 -57.1544 -14.769 0.0180519 +VERTEX2 642 -56.1871 -14.7816 -0.000877353 +VERTEX2 643 -55.213 -14.8962 -0.0289206 +VERTEX2 644 -54.2373 -14.9259 -0.0434696 +VERTEX2 645 -53.2881 -15.0225 -0.0563827 +VERTEX2 646 -53.2514 -14.0714 1.49912 +VERTEX2 647 -53.1507 -13.1166 1.51586 +VERTEX2 648 -53.1326 -12.1812 1.53013 +VERTEX2 649 -53.0836 -11.2239 1.50189 +VERTEX2 650 -53.1576 -10.2684 1.46791 +VERTEX2 651 -54.166 -10.1743 3.01388 +VERTEX2 652 -55.1265 -10.0717 3.01446 +VERTEX2 653 -56.1456 -9.94837 2.99837 +VERTEX2 654 -57.1764 -9.83205 3.03798 +VERTEX2 655 -58.2464 -9.77103 3.04202 +VERTEX2 656 -58.3473 -10.6876 -1.69677 +VERTEX2 657 -58.4882 -11.6211 -1.69785 +VERTEX2 658 -58.6966 -12.5952 -1.69994 +VERTEX2 659 -58.8265 -13.5349 -1.68784 +VERTEX2 660 -58.9994 -14.5065 -1.66331 +VERTEX2 661 -60.0154 -14.4319 3.06632 +VERTEX2 662 -60.9796 -14.3369 3.11079 +VERTEX2 663 -62.0147 -14.3206 3.08177 +VERTEX2 664 -63.0222 -14.2972 3.14141 +VERTEX2 665 -64.0002 -14.3727 3.13898 +VERTEX2 666 -63.9774 -15.4207 -1.54213 +VERTEX2 667 -64.0195 -16.3328 -1.53643 +VERTEX2 668 -64.0644 -17.3227 -1.50278 +VERTEX2 669 -63.9104 -18.3057 -1.53483 +VERTEX2 670 -63.8654 -19.3377 -1.50421 +VERTEX2 671 -62.9445 -19.3485 0.0935826 +VERTEX2 672 -61.9917 -19.1549 0.0930683 +VERTEX2 673 -60.9557 -19.1136 0.120736 +VERTEX2 674 -60.0189 -18.8668 0.139983 +VERTEX2 675 -59.0639 -18.8051 0.131913 +VERTEX2 676 -58.9131 -19.8087 -1.42163 +VERTEX2 677 -58.7475 -20.73 -1.38146 +VERTEX2 678 -58.4682 -21.7642 -1.40073 +VERTEX2 679 -58.3532 -22.785 -1.41669 +VERTEX2 680 -58.209 -23.8232 -1.43306 +VERTEX2 681 -57.1974 -23.6097 0.142638 +VERTEX2 682 -56.2229 -23.5334 0.148882 +VERTEX2 683 -55.18 -23.3441 0.173444 +VERTEX2 684 -54.2083 -23.2107 0.168107 +VERTEX2 685 -53.1447 -23.1096 0.16971 +VERTEX2 686 -52.9543 -24.0955 -1.38573 +VERTEX2 687 -52.7515 -25.0997 -1.36215 +VERTEX2 688 -52.4995 -26.0897 -1.36311 +VERTEX2 689 -52.284 -27.0376 -1.38193 +VERTEX2 690 -52.0978 -28.0231 -1.36593 +VERTEX2 691 -51.1215 -27.7246 0.188524 +VERTEX2 692 -50.1045 -27.5182 0.182094 +VERTEX2 693 -49.1512 -27.3974 0.173912 +VERTEX2 694 -48.1163 -27.2849 0.185823 +VERTEX2 695 -47.2155 -27.0169 0.15977 +VERTEX2 696 -47.1406 -28.0547 -1.43179 +VERTEX2 697 -46.9913 -29.0582 -1.39038 +VERTEX2 698 -46.7801 -30.0848 -1.37639 +VERTEX2 699 -46.6245 -31.0673 -1.37251 +VERTEX2 700 -46.3665 -31.9277 -1.3556 +VERTEX2 701 -47.3876 -32.0831 -2.90824 +VERTEX2 702 -48.4226 -32.3542 -2.94082 +VERTEX2 703 -49.4123 -32.5772 -2.93052 +VERTEX2 704 -50.3365 -32.814 -2.94132 +VERTEX2 705 -51.2611 -33.0185 -2.96166 +VERTEX2 706 -51.1798 -34.0665 -1.38618 +VERTEX2 707 -50.9465 -35.122 -1.36089 +VERTEX2 708 -50.7667 -36.0061 -1.34414 +VERTEX2 709 -50.5097 -37.0147 -1.34478 +VERTEX2 710 -50.2854 -37.9703 -1.36655 +VERTEX2 711 -49.3142 -37.7843 0.203534 +VERTEX2 712 -48.4129 -37.6341 0.193037 +VERTEX2 713 -47.4127 -37.4806 0.133577 +VERTEX2 714 -46.4512 -37.3979 0.109727 +VERTEX2 715 -45.4808 -37.2902 0.0824423 +VERTEX2 716 -45.3962 -38.3382 -1.48105 +VERTEX2 717 -45.2954 -39.3581 -1.47503 +VERTEX2 718 -45.1678 -40.3227 -1.44086 +VERTEX2 719 -45.0369 -41.2922 -1.42559 +VERTEX2 720 -44.8889 -42.2358 -1.45315 +VERTEX2 721 -45.8506 -42.2693 -3.03368 +VERTEX2 722 -46.8411 -42.3338 -3.04579 +VERTEX2 723 -47.7928 -42.4122 -3.06063 +VERTEX2 724 -48.761 -42.5297 -3.02213 +VERTEX2 725 -49.6967 -42.5947 -3.01838 +VERTEX2 726 -49.886 -41.5765 1.6912 +VERTEX2 727 -49.9789 -40.5749 1.68992 +VERTEX2 728 -50.205 -39.5732 1.68282 +VERTEX2 729 -50.28 -38.5962 1.68821 +VERTEX2 730 -50.3821 -37.6855 1.67733 +VERTEX2 731 -49.4115 -37.5508 0.159167 +VERTEX2 732 -48.5278 -37.3818 0.162956 +VERTEX2 733 -47.5244 -37.2027 0.169578 +VERTEX2 734 -46.5208 -37.0035 0.16225 +VERTEX2 735 -45.513 -36.8342 0.132502 +VERTEX2 736 -45.639 -35.781 1.72963 +VERTEX2 737 -45.6825 -34.7923 1.71095 +VERTEX2 738 -45.7812 -33.7404 1.71413 +VERTEX2 739 -45.9814 -32.7149 1.69935 +VERTEX2 740 -46.0593 -31.7922 1.69307 +VERTEX2 741 -45.0466 -31.6887 0.094065 +VERTEX2 742 -44.0813 -31.5333 0.0389496 +VERTEX2 743 -43.0685 -31.563 0.0446127 +VERTEX2 744 -42.0541 -31.4992 0.0405451 +VERTEX2 745 -41.0079 -31.4467 0.0440895 +VERTEX2 746 -41.005 -30.4539 1.58707 +VERTEX2 747 -41.0307 -29.4307 1.61307 +VERTEX2 748 -41.0555 -28.481 1.5931 +VERTEX2 749 -41.1619 -27.543 1.548 +VERTEX2 750 -41.2201 -26.5007 1.5765 +VERTEX2 751 -42.1706 -26.4798 -3.10908 +VERTEX2 752 -43.1754 -26.4553 -3.10302 +VERTEX2 753 -44.2126 -26.508 -3.0898 +VERTEX2 754 -45.2818 -26.5448 -3.11839 +VERTEX2 755 -46.2725 -26.4569 -3.085 +VERTEX2 756 -46.2189 -27.4485 -1.53947 +VERTEX2 757 -46.2638 -28.4456 -1.54449 +VERTEX2 758 -46.2667 -29.4466 -1.52489 +VERTEX2 759 -46.2721 -30.5047 -1.53177 +VERTEX2 760 -46.1916 -31.3934 -1.5403 +VERTEX2 761 -45.1691 -31.3175 0.0347229 +VERTEX2 762 -44.1604 -31.2652 0.0248278 +VERTEX2 763 -43.1477 -31.2965 -0.0129862 +VERTEX2 764 -42.1521 -31.3015 0.0122871 +VERTEX2 765 -41.0612 -31.3234 0.0371727 +VERTEX2 766 -41.1252 -30.2236 1.59303 +VERTEX2 767 -41.1681 -29.179 1.59011 +VERTEX2 768 -41.205 -28.214 1.61905 +VERTEX2 769 -41.2801 -27.2255 1.60797 +VERTEX2 770 -41.3161 -26.2791 1.59926 +VERTEX2 771 -42.2907 -26.3925 -3.09105 +VERTEX2 772 -43.2732 -26.5085 -3.10097 +VERTEX2 773 -44.3234 -26.5203 -3.062 +VERTEX2 774 -45.3136 -26.533 -3.03961 +VERTEX2 775 -46.3421 -26.6032 -3.04092 +VERTEX2 776 -46.3298 -27.616 -1.4592 +VERTEX2 777 -46.2615 -28.5199 -1.461 +VERTEX2 778 -46.1695 -29.5608 -1.47333 +VERTEX2 779 -46.0825 -30.6383 -1.47862 +VERTEX2 780 -46.0067 -31.6322 -1.46551 +VERTEX2 781 -45.0551 -31.534 0.127203 +VERTEX2 782 -44.076 -31.4013 0.155961 +VERTEX2 783 -43.1381 -31.2801 0.150139 +VERTEX2 784 -42.1365 -31.1664 0.149846 +VERTEX2 785 -41.1566 -31.0267 0.171919 +VERTEX2 786 -41.3107 -30.0084 1.75913 +VERTEX2 787 -41.5974 -29.0046 1.71928 +VERTEX2 788 -41.6788 -28.0393 1.72657 +VERTEX2 789 -41.8546 -27.0481 1.73702 +VERTEX2 790 -41.8953 -26.0893 1.72976 +VERTEX2 791 -42.9275 -26.2676 -3.00694 +VERTEX2 792 -43.9022 -26.4284 -2.99154 +VERTEX2 793 -44.8209 -26.6187 -2.99442 +VERTEX2 794 -45.7858 -26.821 -2.98035 +VERTEX2 795 -46.8778 -27.0908 -2.9758 +VERTEX2 796 -46.6883 -28.0147 -1.37381 +VERTEX2 797 -46.4991 -29.0196 -1.40055 +VERTEX2 798 -46.2546 -30.0195 -1.40083 +VERTEX2 799 -46.1811 -31.0212 -1.40848 +VERTEX2 800 -45.9708 -31.9988 -1.40855 +VERTEX2 801 -44.9869 -31.8942 0.155184 +VERTEX2 802 -43.9435 -31.8109 0.189965 +VERTEX2 803 -43.012 -31.6843 0.150502 +VERTEX2 804 -42.0569 -31.5254 0.142 +VERTEX2 805 -41.002 -31.3111 0.153426 +VERTEX2 806 -41.1163 -30.2605 1.71703 +VERTEX2 807 -41.2694 -29.3126 1.712 +VERTEX2 808 -41.3943 -28.3957 1.7574 +VERTEX2 809 -41.5982 -27.4213 1.78392 +VERTEX2 810 -41.8814 -26.4592 1.7908 +VERTEX2 811 -42.932 -26.7759 -2.91207 +VERTEX2 812 -43.8105 -27.0144 -2.94899 +VERTEX2 813 -44.7905 -27.285 -2.97308 +VERTEX2 814 -45.7227 -27.5146 -2.97724 +VERTEX2 815 -46.5868 -27.6841 -3.01087 +VERTEX2 816 -46.5012 -28.7057 -1.477 +VERTEX2 817 -46.4221 -29.6554 -1.49557 +VERTEX2 818 -46.3566 -30.6613 -1.52859 +VERTEX2 819 -46.2271 -31.5902 -1.52562 +VERTEX2 820 -46.0777 -32.5591 -1.4942 +VERTEX2 821 -47.1264 -32.6673 -3.06739 +VERTEX2 822 -48.0976 -32.8121 -3.06231 +VERTEX2 823 -49.0597 -32.9891 -3.03795 +VERTEX2 824 -50.0501 -33.0877 -3.02583 +VERTEX2 825 -51.1178 -33.2044 -3.04899 +VERTEX2 826 -51.2845 -32.174 1.67099 +VERTEX2 827 -51.4472 -31.1992 1.6698 +VERTEX2 828 -51.4847 -30.2989 1.67924 +VERTEX2 829 -51.6615 -29.3071 1.68417 +VERTEX2 830 -51.776 -28.3511 1.66148 +VERTEX2 831 -52.7624 -28.4482 -3.02897 +VERTEX2 832 -53.8126 -28.5665 -3.02928 +VERTEX2 833 -54.7231 -28.6884 -3.00696 +VERTEX2 834 -55.6937 -28.8093 -2.99203 +VERTEX2 835 -56.5269 -28.9746 -2.97884 +VERTEX2 836 -56.3315 -29.9749 -1.38032 +VERTEX2 837 -56.0916 -30.9434 -1.341 +VERTEX2 838 -55.7339 -31.9449 -1.32891 +VERTEX2 839 -55.5442 -32.9801 -1.30645 +VERTEX2 840 -55.2559 -33.9229 -1.26322 +VERTEX2 841 -54.2583 -33.6433 0.29552 +VERTEX2 842 -53.2823 -33.4276 0.327012 +VERTEX2 843 -52.4101 -33.0488 0.315976 +VERTEX2 844 -51.4488 -32.7657 0.327028 +VERTEX2 845 -50.5321 -32.3643 0.324415 +VERTEX2 846 -50.8846 -31.4565 1.86898 +VERTEX2 847 -51.2763 -30.5007 1.88715 +VERTEX2 848 -51.5753 -29.6683 1.92473 +VERTEX2 849 -51.9599 -28.7394 1.91815 +VERTEX2 850 -52.3484 -27.8238 1.94135 +VERTEX2 851 -53.2403 -28.2363 -2.77481 +VERTEX2 852 -54.1741 -28.5632 -2.78717 +VERTEX2 853 -55.0933 -28.96 -2.77415 +VERTEX2 854 -56.0365 -29.4079 -2.74879 +VERTEX2 855 -56.8865 -29.8152 -2.8045 +VERTEX2 856 -56.5049 -30.7189 -1.23077 +VERTEX2 857 -56.1333 -31.6822 -1.21244 +VERTEX2 858 -55.7032 -32.5808 -1.20847 +VERTEX2 859 -55.261 -33.4879 -1.20951 +VERTEX2 860 -54.905 -34.4286 -1.23304 +VERTEX2 861 -53.8712 -34.0987 0.340213 +VERTEX2 862 -52.8867 -33.7226 0.341676 +VERTEX2 863 -51.9358 -33.3584 0.347405 +VERTEX2 864 -50.9128 -33.0302 0.339396 +VERTEX2 865 -49.899 -32.6635 0.320644 +VERTEX2 866 -50.1671 -31.7161 1.88259 +VERTEX2 867 -50.5278 -30.7579 1.87517 +VERTEX2 868 -50.8432 -29.7431 1.87007 +VERTEX2 869 -51.1271 -28.784 1.84815 +VERTEX2 870 -51.51 -27.7791 1.84275 +VERTEX2 871 -50.5276 -27.5106 0.250131 +VERTEX2 872 -49.5089 -27.2804 0.242901 +VERTEX2 873 -48.5517 -26.9564 0.219053 +VERTEX2 874 -47.5772 -26.6977 0.219029 +VERTEX2 875 -46.6059 -26.4966 0.220207 +VERTEX2 876 -46.7725 -25.4971 1.81126 +VERTEX2 877 -47.137 -24.5477 1.8023 +VERTEX2 878 -47.3933 -23.4987 1.78102 +VERTEX2 879 -47.634 -22.5737 1.76535 +VERTEX2 880 -47.8153 -21.636 1.77965 +VERTEX2 881 -48.7405 -21.9137 -2.93829 +VERTEX2 882 -49.7024 -22.1984 -2.90625 +VERTEX2 883 -50.5948 -22.4132 -2.89522 +VERTEX2 884 -51.6221 -22.688 -2.89545 +VERTEX2 885 -52.6071 -22.9121 -2.85769 +VERTEX2 886 -52.3215 -23.878 -1.28161 +VERTEX2 887 -51.946 -24.8252 -1.33027 +VERTEX2 888 -51.7001 -25.8161 -1.33884 +VERTEX2 889 -51.4615 -26.8116 -1.33 +VERTEX2 890 -51.2125 -27.8176 -1.34481 +VERTEX2 891 -52.1894 -28.0153 -2.93216 +VERTEX2 892 -53.148 -28.2006 -2.90732 +VERTEX2 893 -54.053 -28.3511 -2.89383 +VERTEX2 894 -54.9714 -28.5697 -2.88408 +VERTEX2 895 -55.983 -28.7746 -2.90354 +VERTEX2 896 -55.8191 -29.7559 -1.3359 +VERTEX2 897 -55.5912 -30.7189 -1.31434 +VERTEX2 898 -55.2653 -31.6732 -1.32846 +VERTEX2 899 -55.063 -32.6865 -1.30001 +VERTEX2 900 -54.7675 -33.6292 -1.28876 +VERTEX2 901 -53.8611 -33.4391 0.30405 +VERTEX2 902 -52.8953 -33.1895 0.32786 +VERTEX2 903 -51.9618 -32.8179 0.327422 +VERTEX2 904 -51.0337 -32.5871 0.36942 +VERTEX2 905 -50.1608 -32.3126 0.349641 +VERTEX2 906 -50.4731 -31.3731 1.9654 +VERTEX2 907 -50.8221 -30.3556 1.93471 +VERTEX2 908 -51.1331 -29.4476 1.9654 +VERTEX2 909 -51.4183 -28.586 1.9888 +VERTEX2 910 -51.9007 -27.6836 1.99086 +VERTEX2 911 -52.8118 -27.9945 -2.73149 +VERTEX2 912 -53.7042 -28.3872 -2.73903 +VERTEX2 913 -54.583 -28.7241 -2.69694 +VERTEX2 914 -55.5442 -29.0981 -2.70508 +VERTEX2 915 -56.4394 -29.6253 -2.70068 +VERTEX2 916 -56.9223 -28.6658 1.99252 +VERTEX2 917 -57.309 -27.7307 1.98645 +VERTEX2 918 -57.6338 -26.8664 2.00072 +VERTEX2 919 -58.067 -26.0449 2.02427 +VERTEX2 920 -58.5419 -25.1523 2.03954 +VERTEX2 921 -59.3396 -25.6365 -2.68091 +VERTEX2 922 -60.3083 -26.1804 -2.69283 +VERTEX2 923 -61.301 -26.7159 -2.66454 +VERTEX2 924 -62.1897 -27.1857 -2.66943 +VERTEX2 925 -63.0443 -27.6561 -2.6462 +VERTEX2 926 -63.5231 -26.6979 2.06409 +VERTEX2 927 -64.0393 -25.7912 2.06991 +VERTEX2 928 -64.5686 -24.9607 2.06524 +VERTEX2 929 -65.0379 -24.059 2.05544 +VERTEX2 930 -65.5938 -23.1703 2.05223 +VERTEX2 931 -66.4811 -23.6486 -2.64201 +VERTEX2 932 -67.3221 -24.1764 -2.64057 +VERTEX2 933 -68.0905 -24.6127 -2.64591 +VERTEX2 934 -69.0279 -25.0944 -2.6407 +VERTEX2 935 -69.9223 -25.452 -2.64975 +VERTEX2 936 -69.3964 -26.3278 -1.07183 +VERTEX2 937 -68.8552 -27.1891 -1.09627 +VERTEX2 938 -68.4252 -28.0524 -1.0887 +VERTEX2 939 -67.9263 -28.9949 -1.05686 +VERTEX2 940 -67.42 -29.9425 -1.07197 +VERTEX2 941 -68.2736 -30.4658 -2.62982 +VERTEX2 942 -69.1234 -30.9983 -2.64423 +VERTEX2 943 -69.9064 -31.4245 -2.67178 +VERTEX2 944 -70.7599 -31.8603 -2.68683 +VERTEX2 945 -71.6039 -32.3026 -2.67054 +VERTEX2 946 -72.0936 -31.343 2.01316 +VERTEX2 947 -72.4988 -30.4651 2.00223 +VERTEX2 948 -72.9205 -29.5832 2.00777 +VERTEX2 949 -73.2877 -28.6726 1.95489 +VERTEX2 950 -73.6219 -27.7939 1.92139 +VERTEX2 951 -72.721 -27.4954 0.360975 +VERTEX2 952 -71.8368 -27.1807 0.334102 +VERTEX2 953 -70.8957 -26.8733 0.32018 +VERTEX2 954 -69.9494 -26.5969 0.32757 +VERTEX2 955 -68.9972 -26.3267 0.332126 +VERTEX2 956 -69.4289 -25.4182 1.85416 +VERTEX2 957 -69.6799 -24.4795 1.84126 +VERTEX2 958 -69.8788 -23.5483 1.83443 +VERTEX2 959 -70.1015 -22.5639 1.86715 +VERTEX2 960 -70.358 -21.6797 1.82345 +VERTEX2 961 -71.4076 -21.8737 -2.87252 +VERTEX2 962 -72.3761 -22.1929 -2.88627 +VERTEX2 963 -73.2231 -22.438 -2.89079 +VERTEX2 964 -74.2253 -22.6906 -2.89218 +VERTEX2 965 -75.2259 -22.9362 -2.89184 +VERTEX2 966 -74.9121 -23.8615 -1.29509 +VERTEX2 967 -74.6317 -24.8703 -1.30344 +VERTEX2 968 -74.3479 -25.9801 -1.31919 +VERTEX2 969 -74.0064 -26.9517 -1.33442 +VERTEX2 970 -73.7711 -27.879 -1.30531 +VERTEX2 971 -72.8199 -27.5631 0.262946 +VERTEX2 972 -71.8602 -27.3013 0.237186 +VERTEX2 973 -70.9132 -27.2044 0.227828 +VERTEX2 974 -69.9519 -27.0204 0.245565 +VERTEX2 975 -68.9437 -26.8069 0.249194 +VERTEX2 976 -68.732 -27.8165 -1.31728 +VERTEX2 977 -68.5235 -28.7061 -1.33715 +VERTEX2 978 -68.2036 -29.7195 -1.34792 +VERTEX2 979 -67.9145 -30.7449 -1.3309 +VERTEX2 980 -67.6726 -31.7537 -1.32802 +VERTEX2 981 -68.6558 -31.9681 -2.89633 +VERTEX2 982 -69.5619 -32.1256 -2.92181 +VERTEX2 983 -70.6161 -32.38 -2.90058 +VERTEX2 984 -71.5484 -32.5918 -2.86564 +VERTEX2 985 -72.5572 -32.8465 -2.86607 +VERTEX2 986 -72.2227 -33.8353 -1.33771 +VERTEX2 987 -71.922 -34.918 -1.33253 +VERTEX2 988 -71.7014 -35.9253 -1.31295 +VERTEX2 989 -71.4851 -36.9227 -1.30575 +VERTEX2 990 -71.1527 -37.8053 -1.29358 +VERTEX2 991 -70.2153 -37.5577 0.29858 +VERTEX2 992 -69.335 -37.2099 0.324074 +VERTEX2 993 -68.3613 -36.8264 0.325066 +VERTEX2 994 -67.4976 -36.4817 0.319894 +VERTEX2 995 -66.5278 -36.1947 0.323151 +VERTEX2 996 -66.8433 -35.2587 1.88798 +VERTEX2 997 -67.1525 -34.3661 1.8819 +VERTEX2 998 -67.43 -33.4202 1.88487 +VERTEX2 999 -67.7902 -32.3936 1.92548 +VERTEX2 1000 -68.2118 -31.492 1.93779 +VERTEX2 1001 -69.1293 -31.7804 -2.78079 +VERTEX2 1002 -70.1009 -32.1389 -2.74391 +VERTEX2 1003 -71.0562 -32.5691 -2.71405 +VERTEX2 1004 -72.0053 -33.0595 -2.6817 +VERTEX2 1005 -72.9229 -33.4796 -2.66883 +VERTEX2 1006 -72.4757 -34.3573 -1.11183 +VERTEX2 1007 -72.0996 -35.3383 -1.13358 +VERTEX2 1008 -71.6563 -36.3299 -1.14123 +VERTEX2 1009 -71.1694 -37.3516 -1.15245 +VERTEX2 1010 -70.8062 -38.2239 -1.12579 +VERTEX2 1011 -69.8612 -37.7023 0.43034 +VERTEX2 1012 -68.9889 -37.3075 0.460718 +VERTEX2 1013 -68.164 -36.8883 0.477054 +VERTEX2 1014 -67.2459 -36.4386 0.46958 +VERTEX2 1015 -66.3378 -35.9507 0.466449 +VERTEX2 1016 -66.788 -35.1013 2.06204 +VERTEX2 1017 -67.3573 -34.1699 2.00398 +VERTEX2 1018 -67.7263 -33.2593 1.99771 +VERTEX2 1019 -68.257 -32.3084 1.97909 +VERTEX2 1020 -68.5907 -31.4067 1.99991 +VERTEX2 1021 -69.6152 -31.748 -2.73462 +VERTEX2 1022 -70.4249 -32.0491 -2.71972 +VERTEX2 1023 -71.3476 -32.384 -2.72608 +VERTEX2 1024 -72.2842 -32.7249 -2.71989 +VERTEX2 1025 -73.2314 -33.1525 -2.70637 +VERTEX2 1026 -72.7277 -34.075 -1.13556 +VERTEX2 1027 -72.3546 -34.9537 -1.12843 +VERTEX2 1028 -71.9767 -35.9051 -1.12659 +VERTEX2 1029 -71.4882 -36.8391 -1.1462 +VERTEX2 1030 -71.1322 -37.7194 -1.18759 +VERTEX2 1031 -72.0361 -38.1538 -2.78182 +VERTEX2 1032 -72.9318 -38.4659 -2.78114 +VERTEX2 1033 -73.7602 -38.858 -2.76675 +VERTEX2 1034 -74.6869 -39.2583 -2.74717 +VERTEX2 1035 -75.5924 -39.6767 -2.75678 +VERTEX2 1036 -75.2208 -40.4949 -1.17713 +VERTEX2 1037 -74.7484 -41.4087 -1.22111 +VERTEX2 1038 -74.3712 -42.3864 -1.20953 +VERTEX2 1039 -73.9414 -43.2482 -1.22315 +VERTEX2 1040 -73.5299 -44.1987 -1.22857 +VERTEX2 1041 -72.5303 -43.8927 0.320224 +VERTEX2 1042 -71.6161 -43.6171 0.318519 +VERTEX2 1043 -70.5745 -43.3179 0.293971 +VERTEX2 1044 -69.5797 -43.0416 0.31503 +VERTEX2 1045 -68.6391 -42.7046 0.313206 +VERTEX2 1046 -68.904 -41.7668 1.88263 +VERTEX2 1047 -69.2657 -40.8279 1.89802 +VERTEX2 1048 -69.5325 -39.9065 1.9216 +VERTEX2 1049 -69.9021 -38.9655 1.92552 +VERTEX2 1050 -70.322 -38.06 1.90189 +VERTEX2 1051 -69.3663 -37.7577 0.355856 +VERTEX2 1052 -68.5275 -37.3496 0.30476 +VERTEX2 1053 -67.5722 -37.0566 0.318286 +VERTEX2 1054 -66.6777 -36.7488 0.326713 +VERTEX2 1055 -65.6753 -36.4191 0.276532 +VERTEX2 1056 -65.9381 -35.3569 1.85059 +VERTEX2 1057 -66.2145 -34.3614 1.85674 +VERTEX2 1058 -66.502 -33.353 1.8594 +VERTEX2 1059 -66.7508 -32.3769 1.85506 +VERTEX2 1060 -66.9734 -31.4677 1.86348 +VERTEX2 1061 -67.9614 -31.7351 -2.87445 +VERTEX2 1062 -68.9979 -32.0085 -2.86096 +VERTEX2 1063 -69.9315 -32.1955 -2.86146 +VERTEX2 1064 -70.7672 -32.4756 -2.82432 +VERTEX2 1065 -71.6886 -32.7413 -2.82302 +VERTEX2 1066 -71.3673 -33.7353 -1.25541 +VERTEX2 1067 -71.0718 -34.6274 -1.22219 +VERTEX2 1068 -70.77 -35.6248 -1.2282 +VERTEX2 1069 -70.4846 -36.644 -1.26684 +VERTEX2 1070 -70.2047 -37.5394 -1.24929 +VERTEX2 1071 -69.2384 -37.1939 0.308796 +VERTEX2 1072 -68.2025 -36.9306 0.3239 +VERTEX2 1073 -67.1681 -36.5755 0.340437 +VERTEX2 1074 -66.2321 -36.3249 0.352661 +VERTEX2 1075 -65.2885 -35.9877 0.32145 +VERTEX2 1076 -65.0449 -36.972 -1.2467 +VERTEX2 1077 -64.7625 -37.9683 -1.26488 +VERTEX2 1078 -64.4423 -39.0097 -1.26848 +VERTEX2 1079 -64.1742 -39.9412 -1.26505 +VERTEX2 1080 -63.9125 -40.9622 -1.27631 +VERTEX2 1081 -64.7932 -41.1999 -2.8343 +VERTEX2 1082 -65.73 -41.5446 -2.85085 +VERTEX2 1083 -66.7594 -41.8731 -2.86273 +VERTEX2 1084 -67.7751 -42.0815 -2.87523 +VERTEX2 1085 -68.7534 -42.3512 -2.87753 +VERTEX2 1086 -68.4119 -43.2988 -1.30745 +VERTEX2 1087 -68.1767 -44.2725 -1.31227 +VERTEX2 1088 -67.9307 -45.2725 -1.26847 +VERTEX2 1089 -67.6688 -46.2258 -1.26237 +VERTEX2 1090 -67.2788 -47.1752 -1.25009 +VERTEX2 1091 -66.3971 -46.9392 0.336955 +VERTEX2 1092 -65.3899 -46.6712 0.344183 +VERTEX2 1093 -64.4247 -46.3714 0.380699 +VERTEX2 1094 -63.476 -45.9463 0.383932 +VERTEX2 1095 -62.6852 -45.5909 0.398846 +VERTEX2 1096 -62.2836 -46.5308 -1.15326 +VERTEX2 1097 -61.9461 -47.4809 -1.17981 +VERTEX2 1098 -61.5708 -48.4421 -1.19314 +VERTEX2 1099 -61.1138 -49.3424 -1.20079 +VERTEX2 1100 -60.736 -50.2028 -1.1914 +VERTEX2 1101 -59.8419 -49.8569 0.356392 +VERTEX2 1102 -58.9534 -49.5911 0.348887 +VERTEX2 1103 -58.0005 -49.2577 0.306343 +VERTEX2 1104 -56.9998 -48.8046 0.307769 +VERTEX2 1105 -56.0179 -48.4597 0.328204 +VERTEX2 1106 -56.3913 -47.564 1.90112 +VERTEX2 1107 -56.7129 -46.6582 1.90751 +VERTEX2 1108 -56.9924 -45.7642 1.87922 +VERTEX2 1109 -57.368 -44.7052 1.87292 +VERTEX2 1110 -57.667 -43.7303 1.85427 +VERTEX2 1111 -58.5803 -44.007 -2.84876 +VERTEX2 1112 -59.5112 -44.2867 -2.84334 +VERTEX2 1113 -60.3542 -44.5975 -2.8587 +VERTEX2 1114 -61.4497 -44.9022 -2.88554 +VERTEX2 1115 -62.434 -45.2033 -2.89191 +VERTEX2 1116 -62.119 -46.1446 -1.3367 +VERTEX2 1117 -61.8966 -47.2003 -1.36173 +VERTEX2 1118 -61.7103 -48.1477 -1.38419 +VERTEX2 1119 -61.4432 -49.1577 -1.39962 +VERTEX2 1120 -61.2952 -50.2074 -1.37249 +VERTEX2 1121 -60.2119 -50.0389 0.237857 +VERTEX2 1122 -59.2444 -49.8317 0.24237 +VERTEX2 1123 -58.3256 -49.6583 0.246544 +VERTEX2 1124 -57.3425 -49.3613 0.239502 +VERTEX2 1125 -56.4132 -49.1585 0.243942 +VERTEX2 1126 -56.6601 -48.1326 1.7982 +VERTEX2 1127 -56.7755 -47.143 1.8235 +VERTEX2 1128 -57.0455 -46.2765 1.83011 +VERTEX2 1129 -57.3665 -45.2678 1.833 +VERTEX2 1130 -57.5953 -44.1994 1.8086 +VERTEX2 1131 -58.6126 -44.3212 -2.88066 +VERTEX2 1132 -59.5319 -44.5578 -2.86868 +VERTEX2 1133 -60.4052 -44.7799 -2.85541 +VERTEX2 1134 -61.3604 -45.0873 -2.83751 +VERTEX2 1135 -62.3461 -45.4606 -2.86256 +VERTEX2 1136 -62.019 -46.4159 -1.25003 +VERTEX2 1137 -61.766 -47.3667 -1.25545 +VERTEX2 1138 -61.4145 -48.3352 -1.24698 +VERTEX2 1139 -61.1085 -49.3066 -1.22113 +VERTEX2 1140 -60.7862 -50.1874 -1.20595 +VERTEX2 1141 -59.857 -49.7839 0.382092 +VERTEX2 1142 -58.9417 -49.3804 0.367539 +VERTEX2 1143 -57.9582 -49.0592 0.346868 +VERTEX2 1144 -57.0103 -48.8788 0.330614 +VERTEX2 1145 -56.1076 -48.57 0.340901 +VERTEX2 1146 -56.4065 -47.6269 1.91681 +VERTEX2 1147 -56.7297 -46.7269 1.92 +VERTEX2 1148 -57.0014 -45.8217 1.93393 +VERTEX2 1149 -57.4211 -44.8632 1.93289 +VERTEX2 1150 -57.7777 -43.9303 1.93536 +VERTEX2 1151 -56.8074 -43.4954 0.364824 +VERTEX2 1152 -55.9307 -43.1175 0.368146 +VERTEX2 1153 -54.9686 -42.7324 0.356064 +VERTEX2 1154 -54.0238 -42.4132 0.343608 +VERTEX2 1155 -53.1421 -42.1283 0.332853 +VERTEX2 1156 -53.4284 -41.2094 1.91395 +VERTEX2 1157 -53.7371 -40.2601 1.93637 +VERTEX2 1158 -54.154 -39.346 1.8987 +VERTEX2 1159 -54.4407 -38.3675 1.85868 +VERTEX2 1160 -54.7634 -37.4898 1.86876 +VERTEX2 1161 -55.7444 -37.787 -2.79808 +VERTEX2 1162 -56.7058 -38.1263 -2.81976 +VERTEX2 1163 -57.6173 -38.4497 -2.8369 +VERTEX2 1164 -58.6303 -38.7217 -2.80633 +VERTEX2 1165 -59.6086 -39.0791 -2.7948 +VERTEX2 1166 -59.2318 -40.0782 -1.22388 +VERTEX2 1167 -58.9647 -41.0762 -1.21337 +VERTEX2 1168 -58.6317 -42.0238 -1.2026 +VERTEX2 1169 -58.2993 -43.0172 -1.19114 +VERTEX2 1170 -57.9237 -44.0533 -1.16662 +VERTEX2 1171 -57.0472 -43.7138 0.432378 +VERTEX2 1172 -56.124 -43.3698 0.447107 +VERTEX2 1173 -55.2617 -42.9281 0.497175 +VERTEX2 1174 -54.4076 -42.4757 0.480033 +VERTEX2 1175 -53.5351 -41.9402 0.472773 +VERTEX2 1176 -54.0432 -41.0466 2.05881 +VERTEX2 1177 -54.566 -40.2215 2.07713 +VERTEX2 1178 -54.9695 -39.3495 2.05942 +VERTEX2 1179 -55.358 -38.4757 2.08006 +VERTEX2 1180 -55.9008 -37.6467 2.12208 +VERTEX2 1181 -56.826 -38.0866 -2.56997 +VERTEX2 1182 -57.5772 -38.6267 -2.55339 +VERTEX2 1183 -58.4107 -39.2228 -2.52783 +VERTEX2 1184 -59.1656 -39.7765 -2.51529 +VERTEX2 1185 -59.9415 -40.3791 -2.48129 +VERTEX2 1186 -59.3077 -41.1339 -0.9239 +VERTEX2 1187 -58.6858 -41.8659 -0.933771 +VERTEX2 1188 -58.0483 -42.6595 -0.944587 +VERTEX2 1189 -57.503 -43.5579 -0.932869 +VERTEX2 1190 -56.8702 -44.3506 -0.898817 +VERTEX2 1191 -56.1364 -43.6662 0.641224 +VERTEX2 1192 -55.3373 -43.0694 0.661821 +VERTEX2 1193 -54.4995 -42.4876 0.610478 +VERTEX2 1194 -53.6291 -41.8977 0.599757 +VERTEX2 1195 -52.7505 -41.3168 0.611304 +VERTEX2 1196 -53.3787 -40.4967 2.17768 +VERTEX2 1197 -53.9724 -39.701 2.15122 +VERTEX2 1198 -54.5223 -38.8679 2.14446 +VERTEX2 1199 -55.0996 -37.96 2.12693 +VERTEX2 1200 -55.6093 -37.1192 2.13177 +VERTEX2 1201 -54.892 -36.5794 0.592166 +VERTEX2 1202 -54.0735 -35.9631 0.592285 +VERTEX2 1203 -53.265 -35.4193 0.609963 +VERTEX2 1204 -52.5183 -34.8898 0.63631 +VERTEX2 1205 -51.7407 -34.3325 0.660933 +VERTEX2 1206 -51.0577 -35.0484 -0.945359 +VERTEX2 1207 -50.6093 -35.9368 -0.942812 +VERTEX2 1208 -50.1348 -36.7192 -0.924604 +VERTEX2 1209 -49.54 -37.5664 -0.91972 +VERTEX2 1210 -49.0741 -38.302 -0.925063 +VERTEX2 1211 -48.2928 -37.6549 0.637767 +VERTEX2 1212 -47.4862 -36.9983 0.615316 +VERTEX2 1213 -46.5801 -36.4337 0.608442 +VERTEX2 1214 -45.7682 -35.8818 0.60027 +VERTEX2 1215 -44.8918 -35.3659 0.597418 +VERTEX2 1216 -44.3404 -36.2041 -0.971341 +VERTEX2 1217 -43.7334 -37.0834 -0.981005 +VERTEX2 1218 -43.1335 -37.8841 -0.988384 +VERTEX2 1219 -42.5621 -38.7319 -0.98408 +VERTEX2 1220 -41.9695 -39.5394 -0.98083 +VERTEX2 1221 -41.1116 -38.9091 0.606953 +VERTEX2 1222 -40.1986 -38.3506 0.609054 +VERTEX2 1223 -39.4024 -37.7754 0.632375 +VERTEX2 1224 -38.5662 -37.1576 0.62243 +VERTEX2 1225 -37.7982 -36.5172 0.59237 +VERTEX2 1226 -38.3231 -35.6653 2.16972 +VERTEX2 1227 -38.8669 -34.8359 2.16156 +VERTEX2 1228 -39.3228 -34.0637 2.19683 +VERTEX2 1229 -39.9213 -33.2469 2.20187 +VERTEX2 1230 -40.5481 -32.4161 2.17292 +VERTEX2 1231 -39.7331 -31.8105 0.622303 +VERTEX2 1232 -38.8702 -31.1918 0.623522 +VERTEX2 1233 -37.953 -30.6286 0.627637 +VERTEX2 1234 -37.1664 -30.0267 0.612099 +VERTEX2 1235 -36.2841 -29.4417 0.623933 +VERTEX2 1236 -36.8233 -28.6947 2.22018 +VERTEX2 1237 -37.4652 -27.872 2.23635 +VERTEX2 1238 -38.0906 -27.1259 2.2715 +VERTEX2 1239 -38.6968 -26.3537 2.2873 +VERTEX2 1240 -39.375 -25.6316 2.27491 +VERTEX2 1241 -40.1946 -26.2037 -2.47202 +VERTEX2 1242 -40.9571 -26.8904 -2.46032 +VERTEX2 1243 -41.7078 -27.5478 -2.49322 +VERTEX2 1244 -42.4937 -28.1335 -2.48242 +VERTEX2 1245 -43.3623 -28.7023 -2.4647 +VERTEX2 1246 -42.7619 -29.4712 -0.86189 +VERTEX2 1247 -42.1385 -30.2059 -0.861816 +VERTEX2 1248 -41.4565 -31.0072 -0.867068 +VERTEX2 1249 -40.9099 -31.777 -0.862701 +VERTEX2 1250 -40.2722 -32.5266 -0.88709 +VERTEX2 1251 -39.4372 -31.9076 0.681901 +VERTEX2 1252 -38.7291 -31.1889 0.674571 +VERTEX2 1253 -37.9686 -30.5851 0.683954 +VERTEX2 1254 -37.2005 -29.9652 0.680384 +VERTEX2 1255 -36.4156 -29.4314 0.693144 +VERTEX2 1256 -35.8501 -30.1535 -0.863649 +VERTEX2 1257 -35.15 -30.9415 -0.864044 +VERTEX2 1258 -34.5728 -31.6936 -0.830776 +VERTEX2 1259 -33.8489 -32.4044 -0.82408 +VERTEX2 1260 -33.1563 -33.0753 -0.828641 +VERTEX2 1261 -32.434 -32.4337 0.729054 +VERTEX2 1262 -31.6934 -31.7995 0.752871 +VERTEX2 1263 -30.9765 -31.0971 0.792926 +VERTEX2 1264 -30.2322 -30.3589 0.779345 +VERTEX2 1265 -29.6492 -29.6053 0.736366 +VERTEX2 1266 -28.9223 -30.3174 -0.828678 +VERTEX2 1267 -28.172 -30.9983 -0.826349 +VERTEX2 1268 -27.4772 -31.6027 -0.820236 +VERTEX2 1269 -26.7291 -32.3766 -0.804396 +VERTEX2 1270 -26.0122 -33.0445 -0.779936 +VERTEX2 1271 -26.7546 -33.6706 -2.34071 +VERTEX2 1272 -27.3487 -34.4327 -2.36522 +VERTEX2 1273 -28.1361 -35.257 -2.3661 +VERTEX2 1274 -28.9212 -35.9455 -2.33347 +VERTEX2 1275 -29.7219 -36.5321 -2.3363 +VERTEX2 1276 -28.932 -37.2507 -0.740404 +VERTEX2 1277 -28.1685 -37.8793 -0.745064 +VERTEX2 1278 -27.4685 -38.5322 -0.723292 +VERTEX2 1279 -26.7037 -39.1173 -0.704755 +VERTEX2 1280 -25.9075 -39.6978 -0.707003 +VERTEX2 1281 -25.2264 -38.903 0.814425 +VERTEX2 1282 -24.5525 -38.1833 0.819191 +VERTEX2 1283 -23.9043 -37.4894 0.783622 +VERTEX2 1284 -23.2961 -36.7471 0.774321 +VERTEX2 1285 -22.536 -36.049 0.803584 +VERTEX2 1286 -23.1955 -35.3076 2.34407 +VERTEX2 1287 -23.9494 -34.5375 2.33801 +VERTEX2 1288 -24.6235 -33.8367 2.31559 +VERTEX2 1289 -25.3685 -33.1634 2.34086 +VERTEX2 1290 -26.109 -32.5178 2.33233 +VERTEX2 1291 -26.8842 -33.2222 -2.38898 +VERTEX2 1292 -27.6096 -33.8825 -2.41284 +VERTEX2 1293 -28.3221 -34.6222 -2.38239 +VERTEX2 1294 -29.1132 -35.2986 -2.3552 +VERTEX2 1295 -29.8034 -35.9757 -2.35904 +VERTEX2 1296 -29.0164 -36.7433 -0.748253 +VERTEX2 1297 -28.1227 -37.4383 -0.74295 +VERTEX2 1298 -27.3874 -38.1449 -0.726088 +VERTEX2 1299 -26.5478 -38.821 -0.744004 +VERTEX2 1300 -25.8308 -39.4313 -0.764297 +VERTEX2 1301 -25.1668 -38.728 0.81196 +VERTEX2 1302 -24.3909 -38.0661 0.81174 +VERTEX2 1303 -23.5938 -37.2268 0.830066 +VERTEX2 1304 -22.9882 -36.5108 0.826044 +VERTEX2 1305 -22.2847 -35.8559 0.814159 +VERTEX2 1306 -21.6155 -36.5207 -0.754931 +VERTEX2 1307 -20.9004 -37.2402 -0.733467 +VERTEX2 1308 -20.1927 -37.9807 -0.759942 +VERTEX2 1309 -19.5461 -38.7251 -0.749418 +VERTEX2 1310 -18.7585 -39.3998 -0.757656 +VERTEX2 1311 -17.9758 -38.6106 0.826296 +VERTEX2 1312 -17.2783 -37.8995 0.845671 +VERTEX2 1313 -16.6419 -37.1701 0.824692 +VERTEX2 1314 -15.9188 -36.3583 0.839361 +VERTEX2 1315 -15.237 -35.5191 0.843957 +VERTEX2 1316 -15.9723 -34.8469 2.38902 +VERTEX2 1317 -16.6972 -34.1338 2.39541 +VERTEX2 1318 -17.3577 -33.4953 2.41536 +VERTEX2 1319 -18.0835 -32.8337 2.42393 +VERTEX2 1320 -18.812 -32.229 2.45079 +VERTEX2 1321 -18.2877 -31.503 0.888732 +VERTEX2 1322 -17.6863 -30.6689 0.905204 +VERTEX2 1323 -17.0702 -29.8927 0.925658 +VERTEX2 1324 -16.4141 -29.1341 0.964666 +VERTEX2 1325 -15.8348 -28.2892 1.02052 +VERTEX2 1326 -15.0037 -28.7927 -0.537892 +VERTEX2 1327 -14.151 -29.363 -0.534629 +VERTEX2 1328 -13.3573 -29.896 -0.523997 +VERTEX2 1329 -12.4572 -30.5087 -0.553651 +VERTEX2 1330 -11.5583 -31.049 -0.577327 +VERTEX2 1331 -11.0235 -30.2357 0.990317 +VERTEX2 1332 -10.5025 -29.4464 0.96308 +VERTEX2 1333 -9.7875 -28.5262 0.96657 +VERTEX2 1334 -9.20977 -27.7106 0.994843 +VERTEX2 1335 -8.67005 -26.7651 1.01095 +VERTEX2 1336 -9.37241 -26.3081 2.5732 +VERTEX2 1337 -10.2156 -25.82 2.55209 +VERTEX2 1338 -11.1465 -25.2981 2.57129 +VERTEX2 1339 -12.0091 -24.7591 2.55987 +VERTEX2 1340 -12.9083 -24.1966 2.57185 +VERTEX2 1341 -13.4303 -25.0633 -2.11957 +VERTEX2 1342 -13.9598 -25.8772 -2.13438 +VERTEX2 1343 -14.529 -26.7806 -2.16371 +VERTEX2 1344 -15.1269 -27.5758 -2.13985 +VERTEX2 1345 -15.7284 -28.4206 -2.15257 +VERTEX2 1346 -14.8849 -28.833 -0.580397 +VERTEX2 1347 -14.0964 -29.354 -0.605642 +VERTEX2 1348 -13.211 -29.8712 -0.605463 +VERTEX2 1349 -12.3011 -30.4378 -0.632246 +VERTEX2 1350 -11.4894 -30.9982 -0.633634 +VERTEX2 1351 -11.024 -30.2265 0.931627 +VERTEX2 1352 -10.4232 -29.4145 0.949176 +VERTEX2 1353 -9.75056 -28.6363 0.953141 +VERTEX2 1354 -9.18295 -27.8027 0.965247 +VERTEX2 1355 -8.62333 -26.9226 0.944851 +VERTEX2 1356 -9.43601 -26.2733 2.53837 +VERTEX2 1357 -10.2913 -25.6777 2.53915 +VERTEX2 1358 -11.1106 -25.0105 2.55001 +VERTEX2 1359 -12.0151 -24.4696 2.53658 +VERTEX2 1360 -12.8363 -23.9444 2.54198 +VERTEX2 1361 -13.3029 -24.7032 -2.14954 +VERTEX2 1362 -13.8095 -25.5446 -2.171 +VERTEX2 1363 -14.3771 -26.3955 -2.15573 +VERTEX2 1364 -14.9217 -27.2505 -2.1466 +VERTEX2 1365 -15.4032 -28.0788 -2.14292 +VERTEX2 1366 -16.1653 -27.5388 2.59905 +VERTEX2 1367 -17.0073 -26.992 2.63818 +VERTEX2 1368 -17.7674 -26.4618 2.62429 +VERTEX2 1369 -18.538 -25.8999 2.65135 +VERTEX2 1370 -19.3942 -25.4277 2.63125 +VERTEX2 1371 -19.8509 -26.3032 -2.10198 +VERTEX2 1372 -20.3968 -27.1963 -2.10269 +VERTEX2 1373 -20.9059 -28.0671 -2.08996 +VERTEX2 1374 -21.3735 -28.9683 -2.07067 +VERTEX2 1375 -21.7892 -29.8257 -2.0608 +VERTEX2 1376 -22.7527 -29.3094 2.62433 +VERTEX2 1377 -23.618 -28.7428 2.64989 +VERTEX2 1378 -24.4839 -28.2311 2.65901 +VERTEX2 1379 -25.3343 -27.7454 2.68627 +VERTEX2 1380 -26.192 -27.2692 2.72015 +VERTEX2 1381 -25.821 -26.353 1.19113 +VERTEX2 1382 -25.4373 -25.3019 1.18287 +VERTEX2 1383 -24.9894 -24.2444 1.1578 +VERTEX2 1384 -24.5872 -23.3185 1.16071 +VERTEX2 1385 -24.1332 -22.3832 1.16049 +VERTEX2 1386 -25.0835 -22.0569 2.70611 +VERTEX2 1387 -26.0278 -21.5248 2.70727 +VERTEX2 1388 -26.9867 -21.1336 2.71529 +VERTEX2 1389 -27.9696 -20.7066 2.7281 +VERTEX2 1390 -28.8983 -20.3487 2.71083 +VERTEX2 1391 -28.588 -19.358 1.12194 +VERTEX2 1392 -28.0955 -18.4906 1.14292 +VERTEX2 1393 -27.6195 -17.6717 1.10852 +VERTEX2 1394 -27.1987 -16.8437 1.10376 +VERTEX2 1395 -26.8096 -15.8871 1.08926 +VERTEX2 1396 -27.7014 -15.4428 2.65165 +VERTEX2 1397 -28.5598 -15.0463 2.64906 +VERTEX2 1398 -29.4118 -14.538 2.6681 +VERTEX2 1399 -30.2706 -14.0662 2.6693 +VERTEX2 1400 -31.1648 -13.7289 2.69181 +VERTEX2 1401 -31.619 -14.6582 -2.0054 +VERTEX2 1402 -32.0672 -15.6671 -2.01124 +VERTEX2 1403 -32.5065 -16.5122 -2.0126 +VERTEX2 1404 -32.9218 -17.4637 -2.00979 +VERTEX2 1405 -33.3278 -18.4566 -1.98085 +VERTEX2 1406 -32.4294 -18.8553 -0.412657 +VERTEX2 1407 -31.5116 -19.3188 -0.434308 +VERTEX2 1408 -30.5465 -19.6907 -0.437888 +VERTEX2 1409 -29.6331 -20.1218 -0.435707 +VERTEX2 1410 -28.6691 -20.5494 -0.427158 +VERTEX2 1411 -28.2253 -19.5724 1.17926 +VERTEX2 1412 -27.8805 -18.7407 1.16518 +VERTEX2 1413 -27.4324 -17.8128 1.14956 +VERTEX2 1414 -27.0687 -16.8788 1.19523 +VERTEX2 1415 -26.6894 -15.9821 1.20943 +VERTEX2 1416 -27.5496 -15.5895 2.79866 +VERTEX2 1417 -28.5376 -15.269 2.78191 +VERTEX2 1418 -29.4676 -14.8618 2.77575 +VERTEX2 1419 -30.2972 -14.585 2.758 +VERTEX2 1420 -31.1746 -14.148 2.73954 +VERTEX2 1421 -31.6523 -15.0643 -1.98461 +VERTEX2 1422 -32.0506 -16.0156 -1.99676 +VERTEX2 1423 -32.473 -16.9615 -2.00008 +VERTEX2 1424 -32.9505 -17.8955 -2.00641 +VERTEX2 1425 -33.4189 -18.8644 -2.00977 +VERTEX2 1426 -32.5414 -19.2472 -0.427204 +VERTEX2 1427 -31.6705 -19.6343 -0.427739 +VERTEX2 1428 -30.7804 -20.0138 -0.411771 +VERTEX2 1429 -29.8665 -20.391 -0.434422 +VERTEX2 1430 -28.9607 -20.8062 -0.472329 +VERTEX2 1431 -28.5585 -19.805 1.12298 +VERTEX2 1432 -28.1447 -18.9166 1.11982 +VERTEX2 1433 -27.7469 -18.0178 1.09218 +VERTEX2 1434 -27.2992 -17.0809 1.09351 +VERTEX2 1435 -26.8943 -16.2782 1.07703 +VERTEX2 1436 -27.7376 -15.7739 2.65756 +VERTEX2 1437 -28.5974 -15.3145 2.67854 +VERTEX2 1438 -29.5194 -14.8761 2.68898 +VERTEX2 1439 -30.4729 -14.5562 2.70533 +VERTEX2 1440 -31.4306 -14.0929 2.69588 +VERTEX2 1441 -31.8591 -14.9723 -2.05323 +VERTEX2 1442 -32.2743 -15.9043 -2.03621 +VERTEX2 1443 -32.7225 -16.7076 -2.03623 +VERTEX2 1444 -33.1741 -17.693 -2.02667 +VERTEX2 1445 -33.6231 -18.6939 -2.03657 +VERTEX2 1446 -32.6366 -19.1418 -0.464116 +VERTEX2 1447 -31.7346 -19.584 -0.476614 +VERTEX2 1448 -30.8717 -19.9828 -0.486075 +VERTEX2 1449 -30.0348 -20.4463 -0.477968 +VERTEX2 1450 -29.0873 -20.8745 -0.47028 +VERTEX2 1451 -28.7265 -19.9237 1.10079 +VERTEX2 1452 -28.3065 -18.9389 1.1315 +VERTEX2 1453 -27.8637 -17.9892 1.06736 +VERTEX2 1454 -27.4021 -17.1211 1.05133 +VERTEX2 1455 -26.8952 -16.2503 1.05889 +VERTEX2 1456 -26.0142 -16.772 -0.504983 +VERTEX2 1457 -25.1147 -17.3263 -0.507164 +VERTEX2 1458 -24.203 -17.8031 -0.486641 +VERTEX2 1459 -23.2919 -18.2742 -0.451697 +VERTEX2 1460 -22.3281 -18.7046 -0.451939 +VERTEX2 1461 -22.7848 -19.5627 -2.06949 +VERTEX2 1462 -23.2416 -20.4426 -2.06815 +VERTEX2 1463 -23.7188 -21.3262 -2.08126 +VERTEX2 1464 -24.2817 -22.1778 -2.10129 +VERTEX2 1465 -24.8738 -23.0527 -2.08691 +VERTEX2 1466 -24.0955 -23.539 -0.509802 +VERTEX2 1467 -23.2256 -24.0124 -0.532877 +VERTEX2 1468 -22.4608 -24.5677 -0.535807 +VERTEX2 1469 -21.6211 -25.0792 -0.54113 +VERTEX2 1470 -20.7916 -25.5454 -0.53395 +VERTEX2 1471 -20.2522 -24.6911 1.03089 +VERTEX2 1472 -19.817 -23.9484 1.02622 +VERTEX2 1473 -19.3017 -23.1178 1.02424 +VERTEX2 1474 -18.7989 -22.2513 1.03233 +VERTEX2 1475 -18.2406 -21.3755 1.02766 +VERTEX2 1476 -17.3927 -21.8696 -0.529257 +VERTEX2 1477 -16.5787 -22.2972 -0.541957 +VERTEX2 1478 -15.6465 -22.8236 -0.55104 +VERTEX2 1479 -14.823 -23.3218 -0.565452 +VERTEX2 1480 -14.0524 -23.7876 -0.570463 +VERTEX2 1481 -14.6225 -24.6611 -2.18055 +VERTEX2 1482 -15.1677 -25.4643 -2.18225 +VERTEX2 1483 -15.7529 -26.2527 -2.14476 +VERTEX2 1484 -16.2721 -27.0061 -2.11664 +VERTEX2 1485 -16.782 -27.8592 -2.14319 +VERTEX2 1486 -15.9724 -28.5073 -0.556809 +VERTEX2 1487 -15.0895 -28.96 -0.532002 +VERTEX2 1488 -14.209 -29.4872 -0.548555 +VERTEX2 1489 -13.3993 -30.0493 -0.557544 +VERTEX2 1490 -12.4753 -30.4972 -0.544532 +VERTEX2 1491 -12.0788 -29.6562 1.03367 +VERTEX2 1492 -11.55 -28.8163 1.04732 +VERTEX2 1493 -11.081 -28.0152 1.04203 +VERTEX2 1494 -10.6549 -27.1705 1.04417 +VERTEX2 1495 -10.1942 -26.3062 1.06779 +VERTEX2 1496 -11.1017 -25.7899 2.65957 +VERTEX2 1497 -11.978 -25.3415 2.65721 +VERTEX2 1498 -12.9553 -24.9239 2.67568 +VERTEX2 1499 -13.8519 -24.3618 2.64413 +VERTEX2 1500 -14.6693 -23.7757 2.63745 +VERTEX2 1501 -15.1184 -24.6764 -2.06485 +VERTEX2 1502 -15.523 -25.5761 -2.05649 +VERTEX2 1503 -16.0528 -26.356 -2.05085 +VERTEX2 1504 -16.6034 -27.2082 -2.06186 +VERTEX2 1505 -17.1074 -27.9787 -2.06486 +VERTEX2 1506 -17.9041 -27.5209 2.59848 +VERTEX2 1507 -18.7439 -26.9691 2.62276 +VERTEX2 1508 -19.642 -26.4653 2.62205 +VERTEX2 1509 -20.4807 -25.9286 2.61678 +VERTEX2 1510 -21.3586 -25.4227 2.60363 +VERTEX2 1511 -21.9256 -26.2698 -2.09532 +VERTEX2 1512 -22.3674 -27.0911 -2.13303 +VERTEX2 1513 -22.8914 -27.8329 -2.09564 +VERTEX2 1514 -23.3769 -28.6652 -2.1101 +VERTEX2 1515 -23.973 -29.5743 -2.10863 +VERTEX2 1516 -23.1615 -30.1472 -0.511021 +VERTEX2 1517 -22.221 -30.704 -0.541271 +VERTEX2 1518 -21.3686 -31.1661 -0.583211 +VERTEX2 1519 -20.6011 -31.7876 -0.591002 +VERTEX2 1520 -19.8147 -32.3844 -0.601869 +VERTEX2 1521 -19.2706 -31.4836 0.962637 +VERTEX2 1522 -18.7391 -30.6027 0.964911 +VERTEX2 1523 -18.1879 -29.7703 0.941715 +VERTEX2 1524 -17.473 -29.0403 0.962902 +VERTEX2 1525 -16.9047 -28.279 0.940806 +VERTEX2 1526 -17.8072 -27.721 2.52642 +VERTEX2 1527 -18.6255 -27.1699 2.53147 +VERTEX2 1528 -19.4711 -26.6193 2.50533 +VERTEX2 1529 -20.2129 -26.0197 2.50606 +VERTEX2 1530 -21.0224 -25.3489 2.48555 +VERTEX2 1531 -21.6874 -26.2331 -2.20528 +VERTEX2 1532 -22.3565 -27.0208 -2.22694 +VERTEX2 1533 -22.8486 -27.8008 -2.25106 +VERTEX2 1534 -23.5657 -28.6336 -2.23293 +VERTEX2 1535 -24.1249 -29.4019 -2.2369 +VERTEX2 1536 -24.9519 -28.7039 2.4519 +VERTEX2 1537 -25.6431 -28.0743 2.44882 +VERTEX2 1538 -26.4027 -27.476 2.46036 +VERTEX2 1539 -27.2089 -26.8451 2.46499 +VERTEX2 1540 -27.9719 -26.1833 2.47508 +VERTEX2 1541 -28.6051 -26.9181 -2.23498 +VERTEX2 1542 -29.2086 -27.7013 -2.24166 +VERTEX2 1543 -29.8204 -28.4475 -2.2869 +VERTEX2 1544 -30.4718 -29.246 -2.28276 +VERTEX2 1545 -31.092 -29.9666 -2.29163 +VERTEX2 1546 -31.8246 -29.3071 2.37406 +VERTEX2 1547 -32.5802 -28.6611 2.36775 +VERTEX2 1548 -33.2751 -28.0311 2.37066 +VERTEX2 1549 -33.8784 -27.3433 2.36581 +VERTEX2 1550 -34.5422 -26.6034 2.39958 +VERTEX2 1551 -33.894 -25.8878 0.833562 +VERTEX2 1552 -33.3004 -25.1196 0.865997 +VERTEX2 1553 -32.7287 -24.3043 0.881112 +VERTEX2 1554 -32.0421 -23.5629 0.88629 +VERTEX2 1555 -31.4305 -22.803 0.874433 +VERTEX2 1556 -30.6938 -23.4495 -0.66741 +VERTEX2 1557 -29.9013 -24.0216 -0.669915 +VERTEX2 1558 -29.1628 -24.6761 -0.655215 +VERTEX2 1559 -28.3325 -25.2747 -0.639965 +VERTEX2 1560 -27.4924 -25.8257 -0.648412 +VERTEX2 1561 -28.0777 -26.5402 -2.22116 +VERTEX2 1562 -28.7324 -27.3009 -2.20002 +VERTEX2 1563 -29.3926 -28.0456 -2.18446 +VERTEX2 1564 -29.9602 -28.9167 -2.21832 +VERTEX2 1565 -30.6 -29.7495 -2.24973 +VERTEX2 1566 -29.7964 -30.3691 -0.642141 +VERTEX2 1567 -29.041 -30.9663 -0.662329 +VERTEX2 1568 -28.231 -31.5846 -0.663769 +VERTEX2 1569 -27.5072 -32.1604 -0.651372 +VERTEX2 1570 -26.6541 -32.8057 -0.649388 +VERTEX2 1571 -26.0358 -31.9783 0.872722 +VERTEX2 1572 -25.3413 -31.2457 0.850443 +VERTEX2 1573 -24.7405 -30.4628 0.839486 +VERTEX2 1574 -24.0705 -29.6772 0.867456 +VERTEX2 1575 -23.3994 -28.8044 0.878039 +VERTEX2 1576 -24.1733 -28.1536 2.48073 +VERTEX2 1577 -24.9085 -27.5253 2.45149 +VERTEX2 1578 -25.6758 -26.8572 2.46051 +VERTEX2 1579 -26.5238 -26.2078 2.49038 +VERTEX2 1580 -27.4003 -25.5086 2.47998 +VERTEX2 1581 -28.0538 -26.3761 -2.22448 +VERTEX2 1582 -28.6128 -27.1797 -2.22119 +VERTEX2 1583 -29.1845 -27.9312 -2.20076 +VERTEX2 1584 -29.8164 -28.8066 -2.20599 +VERTEX2 1585 -30.4106 -29.5732 -2.21362 +VERTEX2 1586 -29.6088 -30.1042 -0.62272 +VERTEX2 1587 -28.7953 -30.6401 -0.606951 +VERTEX2 1588 -27.9789 -31.1556 -0.611924 +VERTEX2 1589 -27.2266 -31.7636 -0.630514 +VERTEX2 1590 -26.504 -32.3464 -0.658434 +VERTEX2 1591 -25.899 -31.5176 0.922411 +VERTEX2 1592 -25.3131 -30.7407 0.910111 +VERTEX2 1593 -24.6743 -30.0012 0.861931 +VERTEX2 1594 -23.9599 -29.2452 0.836514 +VERTEX2 1595 -23.2705 -28.5065 0.877315 +VERTEX2 1596 -22.5079 -29.0998 -0.657393 +VERTEX2 1597 -21.7194 -29.7079 -0.670279 +VERTEX2 1598 -20.9233 -30.3259 -0.665283 +VERTEX2 1599 -20.0859 -30.9211 -0.674022 +VERTEX2 1600 -19.3147 -31.5289 -0.676165 +VERTEX2 1601 -19.9258 -32.2753 -2.2916 +VERTEX2 1602 -20.4978 -32.9897 -2.26716 +VERTEX2 1603 -21.1577 -33.7299 -2.25482 +VERTEX2 1604 -21.8865 -34.5245 -2.26037 +VERTEX2 1605 -22.5042 -35.2723 -2.24992 +VERTEX2 1606 -21.7507 -35.9088 -0.715588 +VERTEX2 1607 -20.983 -36.5533 -0.742358 +VERTEX2 1608 -20.2872 -37.2357 -0.768375 +VERTEX2 1609 -19.5997 -37.9168 -0.760076 +VERTEX2 1610 -18.8594 -38.6566 -0.767909 +VERTEX2 1611 -18.1667 -38.0338 0.778842 +VERTEX2 1612 -17.4583 -37.2752 0.769236 +VERTEX2 1613 -16.7499 -36.5717 0.766831 +VERTEX2 1614 -15.996 -35.8935 0.748963 +VERTEX2 1615 -15.2298 -35.2739 0.774015 +VERTEX2 1616 -15.9032 -34.5294 2.3414 +VERTEX2 1617 -16.6679 -33.8179 2.36259 +VERTEX2 1618 -17.3281 -33.0576 2.34754 +VERTEX2 1619 -17.9786 -32.2486 2.30063 +VERTEX2 1620 -18.623 -31.5399 2.27667 +VERTEX2 1621 -19.3851 -32.1397 -2.46207 +VERTEX2 1622 -20.2324 -32.7057 -2.47638 +VERTEX2 1623 -20.9672 -33.3009 -2.44523 +VERTEX2 1624 -21.7515 -33.9535 -2.45193 +VERTEX2 1625 -22.5509 -34.5662 -2.45261 +VERTEX2 1626 -21.8989 -35.3378 -0.914747 +VERTEX2 1627 -21.3078 -36.055 -0.905745 +VERTEX2 1628 -20.8115 -36.8798 -0.860012 +VERTEX2 1629 -20.2198 -37.5732 -0.816855 +VERTEX2 1630 -19.5974 -38.2789 -0.824681 +VERTEX2 1631 -18.8249 -37.596 0.733355 +VERTEX2 1632 -18.1394 -36.9731 0.710239 +VERTEX2 1633 -17.4197 -36.2853 0.71942 +VERTEX2 1634 -16.6919 -35.6207 0.697404 +VERTEX2 1635 -15.9001 -34.9385 0.672703 +VERTEX2 1636 -16.4624 -34.1698 2.21386 +VERTEX2 1637 -17.0241 -33.3844 2.20507 +VERTEX2 1638 -17.6646 -32.57 2.20861 +VERTEX2 1639 -18.2182 -31.7753 2.26398 +VERTEX2 1640 -18.8405 -31.0022 2.25059 +VERTEX2 1641 -18.0732 -30.3744 0.663339 +VERTEX2 1642 -17.2762 -29.7538 0.675169 +VERTEX2 1643 -16.5969 -29.1681 0.660773 +VERTEX2 1644 -15.7763 -28.5318 0.636745 +VERTEX2 1645 -14.9898 -27.9624 0.633073 +VERTEX2 1646 -15.5958 -27.1882 2.21031 +VERTEX2 1647 -16.0918 -26.3883 2.1963 +VERTEX2 1648 -16.7133 -25.5154 2.17641 +VERTEX2 1649 -17.2368 -24.6799 2.17854 +VERTEX2 1650 -17.8103 -23.8701 2.1535 +VERTEX2 1651 -18.5527 -24.4763 -2.5608 +VERTEX2 1652 -19.4678 -25.0361 -2.56476 +VERTEX2 1653 -20.2199 -25.5949 -2.59009 +VERTEX2 1654 -21.0612 -26.0641 -2.59479 +VERTEX2 1655 -21.9585 -26.5584 -2.58492 +VERTEX2 1656 -22.4384 -25.7511 2.14912 +VERTEX2 1657 -23.0565 -24.9519 2.13862 +VERTEX2 1658 -23.5791 -24.0198 2.14819 +VERTEX2 1659 -24.2171 -23.1173 2.153 +VERTEX2 1660 -24.8058 -22.3054 2.16006 +VERTEX2 1661 -23.9864 -21.7604 0.602754 +VERTEX2 1662 -23.1527 -21.2465 0.593894 +VERTEX2 1663 -22.3229 -20.6835 0.619583 +VERTEX2 1664 -21.5463 -20.058 0.61978 +VERTEX2 1665 -20.6553 -19.4997 0.598611 +VERTEX2 1666 -20.178 -20.2885 -0.942069 +VERTEX2 1667 -19.5612 -21.1269 -0.930847 +VERTEX2 1668 -18.9527 -21.8871 -0.961611 +VERTEX2 1669 -18.2864 -22.6249 -0.972137 +VERTEX2 1670 -17.7399 -23.4531 -0.96491 +VERTEX2 1671 -16.844 -22.8458 0.610148 +VERTEX2 1672 -16.0647 -22.3337 0.59458 +VERTEX2 1673 -15.2241 -21.7987 0.577687 +VERTEX2 1674 -14.3603 -21.2426 0.563901 +VERTEX2 1675 -13.5391 -20.805 0.543428 +VERTEX2 1676 -13.0162 -21.594 -1.01687 +VERTEX2 1677 -12.4792 -22.3764 -0.992476 +VERTEX2 1678 -11.9576 -23.2345 -0.97087 +VERTEX2 1679 -11.4475 -24.0722 -1.00076 +VERTEX2 1680 -10.8703 -24.8126 -0.985758 +VERTEX2 1681 -10.0485 -24.3565 0.586257 +VERTEX2 1682 -9.25135 -23.8477 0.562049 +VERTEX2 1683 -8.35518 -23.2866 0.559723 +VERTEX2 1684 -7.49595 -22.7646 0.552896 +VERTEX2 1685 -6.58338 -22.2384 0.580383 +VERTEX2 1686 -7.23252 -21.3922 2.16862 +VERTEX2 1687 -7.8635 -20.4812 2.18594 +VERTEX2 1688 -8.46835 -19.6784 2.19382 +VERTEX2 1689 -8.98709 -18.9027 2.2202 +VERTEX2 1690 -9.63098 -18.0651 2.20316 +VERTEX2 1691 -10.3788 -18.6556 -2.52477 +VERTEX2 1692 -11.2275 -19.2346 -2.50655 +VERTEX2 1693 -12.0857 -19.8503 -2.53474 +VERTEX2 1694 -13.0506 -20.3156 -2.57509 +VERTEX2 1695 -13.8355 -20.9631 -2.5797 +VERTEX2 1696 -14.4878 -20.0436 2.14141 +VERTEX2 1697 -15.0257 -19.2155 2.13764 +VERTEX2 1698 -15.6003 -18.377 2.16083 +VERTEX2 1699 -16.1804 -17.5047 2.16672 +VERTEX2 1700 -16.6717 -16.7529 2.16532 +VERTEX2 1701 -17.4428 -17.3773 -2.53916 +VERTEX2 1702 -18.2266 -17.9367 -2.51755 +VERTEX2 1703 -18.9687 -18.5548 -2.50203 +VERTEX2 1704 -19.7341 -19.1513 -2.52578 +VERTEX2 1705 -20.5675 -19.7049 -2.55297 +VERTEX2 1706 -20.0082 -20.5441 -0.973669 +VERTEX2 1707 -19.4632 -21.3999 -0.976789 +VERTEX2 1708 -18.9687 -22.2588 -0.948183 +VERTEX2 1709 -18.4008 -23.1242 -0.956514 +VERTEX2 1710 -17.8453 -23.9237 -0.938451 +VERTEX2 1711 -17.0529 -23.3249 0.675645 +VERTEX2 1712 -16.2447 -22.7508 0.658153 +VERTEX2 1713 -15.505 -22.0796 0.661226 +VERTEX2 1714 -14.7396 -21.598 0.655037 +VERTEX2 1715 -13.9138 -20.883 0.650172 +VERTEX2 1716 -14.4975 -20.1127 2.23312 +VERTEX2 1717 -15.099 -19.3079 2.21558 +VERTEX2 1718 -15.7136 -18.5109 2.2319 +VERTEX2 1719 -16.3677 -17.6507 2.22509 +VERTEX2 1720 -16.9701 -16.8139 2.24219 +VERTEX2 1721 -16.1485 -16.2412 0.667641 +VERTEX2 1722 -15.3431 -15.6389 0.679137 +VERTEX2 1723 -14.4662 -14.9411 0.693538 +VERTEX2 1724 -13.6612 -14.2605 0.686488 +VERTEX2 1725 -12.9106 -13.5991 0.684916 +VERTEX2 1726 -13.5467 -12.8343 2.25902 +VERTEX2 1727 -14.0811 -12.0452 2.25049 +VERTEX2 1728 -14.8079 -11.2551 2.26568 +VERTEX2 1729 -15.3962 -10.4767 2.28856 +VERTEX2 1730 -16.0629 -9.71665 2.25339 +VERTEX2 1731 -16.8698 -10.3596 -2.47206 +VERTEX2 1732 -17.7391 -10.9637 -2.47164 +VERTEX2 1733 -18.4727 -11.5822 -2.50706 +VERTEX2 1734 -19.2867 -12.1524 -2.51149 +VERTEX2 1735 -20.0526 -12.7985 -2.52841 +VERTEX2 1736 -19.551 -13.5558 -0.930125 +VERTEX2 1737 -19.002 -14.3453 -0.915415 +VERTEX2 1738 -18.4249 -15.1608 -0.91936 +VERTEX2 1739 -17.9807 -15.9723 -0.914759 +VERTEX2 1740 -17.4091 -16.7807 -0.895096 +VERTEX2 1741 -16.6178 -16.0911 0.660765 +VERTEX2 1742 -15.8022 -15.4237 0.676256 +VERTEX2 1743 -14.9588 -14.82 0.661067 +VERTEX2 1744 -14.1886 -14.2455 0.683942 +VERTEX2 1745 -13.3996 -13.632 0.655339 +VERTEX2 1746 -14.0416 -12.8826 2.2462 +VERTEX2 1747 -14.6952 -12.1306 2.2589 +VERTEX2 1748 -15.2971 -11.3301 2.27246 +VERTEX2 1749 -15.9586 -10.5695 2.2843 +VERTEX2 1750 -16.503 -9.86706 2.29471 +VERTEX2 1751 -17.2159 -10.5495 -2.4195 +VERTEX2 1752 -17.9587 -11.1469 -2.37475 +VERTEX2 1753 -18.7394 -11.858 -2.36551 +VERTEX2 1754 -19.3946 -12.632 -2.32213 +VERTEX2 1755 -20.0682 -13.3416 -2.34833 +VERTEX2 1756 -20.7278 -12.7104 2.35263 +VERTEX2 1757 -21.4582 -12.0858 2.34171 +VERTEX2 1758 -22.0784 -11.3772 2.34851 +VERTEX2 1759 -22.8428 -10.7184 2.34153 +VERTEX2 1760 -23.5942 -10.023 2.32496 +VERTEX2 1761 -22.8634 -9.43922 0.757747 +VERTEX2 1762 -22.175 -8.7351 0.759375 +VERTEX2 1763 -21.4512 -8.04677 0.782241 +VERTEX2 1764 -20.8051 -7.38493 0.807942 +VERTEX2 1765 -20.1107 -6.60881 0.834204 +VERTEX2 1766 -20.8593 -5.93672 2.40424 +VERTEX2 1767 -21.6709 -5.16399 2.40269 +VERTEX2 1768 -22.4316 -4.45161 2.4176 +VERTEX2 1769 -23.1248 -3.7317 2.38587 +VERTEX2 1770 -23.8206 -3.05635 2.38259 +VERTEX2 1771 -24.5179 -3.74033 -2.30307 +VERTEX2 1772 -25.2316 -4.51238 -2.29041 +VERTEX2 1773 -25.8257 -5.2511 -2.28644 +VERTEX2 1774 -26.508 -6.10307 -2.28916 +VERTEX2 1775 -27.2067 -6.79967 -2.28438 +VERTEX2 1776 -27.964 -6.11537 2.44275 +VERTEX2 1777 -28.6821 -5.44792 2.45539 +VERTEX2 1778 -29.5099 -4.93471 2.47161 +VERTEX2 1779 -30.217 -4.33934 2.43731 +VERTEX2 1780 -30.9445 -3.70293 2.42717 +VERTEX2 1781 -31.6164 -4.44551 -2.29717 +VERTEX2 1782 -32.2448 -5.17655 -2.27517 +VERTEX2 1783 -32.9011 -6.02045 -2.29664 +VERTEX2 1784 -33.4878 -6.66286 -2.2831 +VERTEX2 1785 -34.1656 -7.33022 -2.28505 +VERTEX2 1786 -33.3625 -7.91847 -0.705387 +VERTEX2 1787 -32.4999 -8.66044 -0.72003 +VERTEX2 1788 -31.7289 -9.3466 -0.723926 +VERTEX2 1789 -31.0124 -10.0163 -0.704773 +VERTEX2 1790 -30.2731 -10.7243 -0.719416 +VERTEX2 1791 -30.9196 -11.4516 -2.2598 +VERTEX2 1792 -31.558 -12.1126 -2.29062 +VERTEX2 1793 -32.2043 -12.8838 -2.23317 +VERTEX2 1794 -32.8319 -13.6726 -2.22285 +VERTEX2 1795 -33.4642 -14.5132 -2.24698 +VERTEX2 1796 -32.8405 -15.1128 -0.663123 +VERTEX2 1797 -32.1401 -15.6907 -0.644203 +VERTEX2 1798 -31.3014 -16.3307 -0.626446 +VERTEX2 1799 -30.4211 -16.9382 -0.643502 +VERTEX2 1800 -29.5906 -17.5858 -0.63234 +VERTEX2 1801 -30.169 -18.4499 -2.16765 +VERTEX2 1802 -30.7202 -19.2605 -2.17873 +VERTEX2 1803 -31.3494 -20.0929 -2.18441 +VERTEX2 1804 -31.9708 -20.9043 -2.17644 +VERTEX2 1805 -32.5991 -21.7425 -2.17669 +VERTEX2 1806 -33.4744 -21.0709 2.54616 +VERTEX2 1807 -34.2706 -20.4703 2.56136 +VERTEX2 1808 -35.1602 -19.9477 2.52252 +VERTEX2 1809 -35.9995 -19.3564 2.50991 +VERTEX2 1810 -36.7421 -18.7435 2.53438 +VERTEX2 1811 -37.238 -19.6449 -2.18429 +VERTEX2 1812 -37.7459 -20.4719 -2.19798 +VERTEX2 1813 -38.3067 -21.2784 -2.19815 +VERTEX2 1814 -38.8187 -22.1487 -2.24134 +VERTEX2 1815 -39.4068 -22.9349 -2.22056 +VERTEX2 1816 -38.6124 -23.6454 -0.664463 +VERTEX2 1817 -37.8392 -24.2817 -0.658319 +VERTEX2 1818 -37.0801 -24.9533 -0.693318 +VERTEX2 1819 -36.3927 -25.597 -0.709208 +VERTEX2 1820 -35.6096 -26.3093 -0.709403 +VERTEX2 1821 -34.9287 -25.4568 0.839573 +VERTEX2 1822 -34.2897 -24.7218 0.866981 +VERTEX2 1823 -33.6319 -24.0229 0.851138 +VERTEX2 1824 -32.9353 -23.2493 0.864251 +VERTEX2 1825 -32.3401 -22.4029 0.854936 +VERTEX2 1826 -31.6269 -23.1045 -0.742174 +VERTEX2 1827 -30.9065 -23.7908 -0.703742 +VERTEX2 1828 -30.2304 -24.4652 -0.70505 +VERTEX2 1829 -29.5172 -25.0944 -0.690895 +VERTEX2 1830 -28.7202 -25.6739 -0.69509 +VERTEX2 1831 -28.0683 -24.9075 0.87385 +VERTEX2 1832 -27.3618 -24.0274 0.851411 +VERTEX2 1833 -26.7534 -23.1752 0.877753 +VERTEX2 1834 -26.1168 -22.4537 0.872158 +VERTEX2 1835 -25.4737 -21.6048 0.850915 +VERTEX2 1836 -24.7339 -22.3031 -0.746107 +VERTEX2 1837 -23.9539 -23.0222 -0.756831 +VERTEX2 1838 -23.1544 -23.5938 -0.753258 +VERTEX2 1839 -22.4785 -24.2729 -0.778708 +VERTEX2 1840 -21.7353 -25.0101 -0.794935 +VERTEX2 1841 -22.4349 -25.7353 -2.34079 +VERTEX2 1842 -23.1048 -26.4846 -2.31866 +VERTEX2 1843 -23.8108 -27.2455 -2.32043 +VERTEX2 1844 -24.4294 -27.9666 -2.33145 +VERTEX2 1845 -25.1336 -28.6697 -2.2968 +VERTEX2 1846 -24.3631 -29.2553 -0.755048 +VERTEX2 1847 -23.6716 -29.9192 -0.729415 +VERTEX2 1848 -22.9447 -30.6094 -0.764501 +VERTEX2 1849 -22.1923 -31.3508 -0.769519 +VERTEX2 1850 -21.5055 -32.0934 -0.747277 +VERTEX2 1851 -20.841 -31.4067 0.848889 +VERTEX2 1852 -20.2445 -30.6137 0.816513 +VERTEX2 1853 -19.5109 -29.923 0.844809 +VERTEX2 1854 -18.9394 -29.1714 0.834745 +VERTEX2 1855 -18.2581 -28.3943 0.834602 +VERTEX2 1856 -18.9836 -27.7939 2.42344 +VERTEX2 1857 -19.7667 -27.0741 2.41655 +VERTEX2 1858 -20.5171 -26.3608 2.43385 +VERTEX2 1859 -21.3295 -25.7395 2.45777 +VERTEX2 1860 -22.0859 -25.0961 2.45902 +VERTEX2 1861 -21.4474 -24.2468 0.92125 +VERTEX2 1862 -20.8823 -23.3626 0.920754 +VERTEX2 1863 -20.2738 -22.5851 0.916575 +VERTEX2 1864 -19.6971 -21.7952 0.922186 +VERTEX2 1865 -19.1229 -21.0017 0.88612 +VERTEX2 1866 -18.3613 -21.5821 -0.681138 +VERTEX2 1867 -17.5309 -22.2074 -0.683587 +VERTEX2 1868 -16.7544 -22.7751 -0.668663 +VERTEX2 1869 -16.0565 -23.4456 -0.664723 +VERTEX2 1870 -15.2976 -24.166 -0.644358 +VERTEX2 1871 -14.6298 -23.4312 0.894134 +VERTEX2 1872 -14.0019 -22.6454 0.903438 +VERTEX2 1873 -13.3178 -21.8346 0.872143 +VERTEX2 1874 -12.6238 -21.0724 0.891546 +VERTEX2 1875 -11.9735 -20.3243 0.922297 +VERTEX2 1876 -11.1254 -20.8839 -0.655517 +VERTEX2 1877 -10.3169 -21.4727 -0.651187 +VERTEX2 1878 -9.51188 -22.0804 -0.657657 +VERTEX2 1879 -8.84359 -22.6942 -0.665846 +VERTEX2 1880 -8.10102 -23.3644 -0.674962 +VERTEX2 1881 -7.43126 -22.5407 0.905754 +VERTEX2 1882 -6.80605 -21.6995 0.92617 +VERTEX2 1883 -6.25111 -20.8428 0.939438 +VERTEX2 1884 -5.63712 -20.0496 0.967216 +VERTEX2 1885 -5.18374 -19.1843 0.954024 +VERTEX2 1886 -5.97115 -18.5591 2.54765 +VERTEX2 1887 -6.8875 -18.0187 2.54123 +VERTEX2 1888 -7.72945 -17.5093 2.55233 +VERTEX2 1889 -8.47027 -16.9862 2.55204 +VERTEX2 1890 -9.31132 -16.4367 2.53902 +VERTEX2 1891 -9.89189 -17.2297 -2.19112 +VERTEX2 1892 -10.4662 -18.0129 -2.24815 +VERTEX2 1893 -11.0081 -18.7643 -2.24066 +VERTEX2 1894 -11.6504 -19.5551 -2.25858 +VERTEX2 1895 -12.2863 -20.2679 -2.239 +VERTEX2 1896 -11.5309 -20.9287 -0.688747 +VERTEX2 1897 -10.7389 -21.5586 -0.684495 +VERTEX2 1898 -9.82752 -22.2294 -0.699466 +VERTEX2 1899 -9.21607 -22.8117 -0.697494 +VERTEX2 1900 -8.38509 -23.4905 -0.689835 +VERTEX2 1901 -9.03764 -24.2543 -2.28702 +VERTEX2 1902 -9.56793 -25.0483 -2.26542 +VERTEX2 1903 -10.1992 -25.8617 -2.27163 +VERTEX2 1904 -10.8866 -26.5881 -2.25425 +VERTEX2 1905 -11.5429 -27.3106 -2.23615 +VERTEX2 1906 -10.8075 -27.9262 -0.673796 +VERTEX2 1907 -10.0694 -28.5589 -0.67199 +VERTEX2 1908 -9.29066 -29.204 -0.650459 +VERTEX2 1909 -8.55544 -29.9619 -0.640557 +VERTEX2 1910 -7.76286 -30.5342 -0.659004 +VERTEX2 1911 -7.20392 -29.6879 0.886798 +VERTEX2 1912 -6.57237 -28.9385 0.899406 +VERTEX2 1913 -5.94055 -28.2132 0.8792 +VERTEX2 1914 -5.23984 -27.4192 0.845003 +VERTEX2 1915 -4.5127 -26.7287 0.851558 +VERTEX2 1916 -5.25632 -26.1209 2.43231 +VERTEX2 1917 -5.95843 -25.4283 2.4516 +VERTEX2 1918 -6.75075 -24.8129 2.46554 +VERTEX2 1919 -7.56078 -24.2147 2.48491 +VERTEX2 1920 -8.33813 -23.6062 2.4721 +VERTEX2 1921 -8.97827 -24.4295 -2.22521 +VERTEX2 1922 -9.67589 -25.2943 -2.25164 +VERTEX2 1923 -10.3549 -26.1418 -2.20484 +VERTEX2 1924 -10.9758 -26.9469 -2.21266 +VERTEX2 1925 -11.5534 -27.8312 -2.20524 +VERTEX2 1926 -12.3699 -27.1988 2.50337 +VERTEX2 1927 -13.1703 -26.5279 2.52521 +VERTEX2 1928 -13.9322 -25.963 2.49802 +VERTEX2 1929 -14.7458 -25.3019 2.48766 +VERTEX2 1930 -15.5021 -24.6226 2.47359 +VERTEX2 1931 -14.8719 -23.7581 0.886118 +VERTEX2 1932 -14.1714 -23.0336 0.914319 +VERTEX2 1933 -13.5548 -22.2228 0.913861 +VERTEX2 1934 -12.8986 -21.3576 0.897881 +VERTEX2 1935 -12.2928 -20.6572 0.914581 +VERTEX2 1936 -13.1066 -20.104 2.49444 +VERTEX2 1937 -13.8839 -19.5216 2.52327 +VERTEX2 1938 -14.6985 -18.8737 2.50889 +VERTEX2 1939 -15.4575 -18.2398 2.52894 +VERTEX2 1940 -16.3181 -17.661 2.5463 +VERTEX2 1941 -15.7812 -16.8345 0.981567 +VERTEX2 1942 -15.1941 -15.9873 0.957347 +VERTEX2 1943 -14.7031 -15.1471 0.959161 +VERTEX2 1944 -14.1569 -14.3644 0.95625 +VERTEX2 1945 -13.5081 -13.5671 0.951562 +VERTEX2 1946 -14.3623 -12.9972 2.53324 +VERTEX2 1947 -15.1804 -12.4028 2.54022 +VERTEX2 1948 -16.064 -11.8726 2.54158 +VERTEX2 1949 -16.9386 -11.2522 2.55587 +VERTEX2 1950 -17.7688 -10.6514 2.53888 +VERTEX2 1951 -17.3142 -9.87535 0.970884 +VERTEX2 1952 -16.6391 -8.99717 0.994887 +VERTEX2 1953 -16.052 -8.09752 1.00324 +VERTEX2 1954 -15.499 -7.27829 0.997625 +VERTEX2 1955 -14.9966 -6.49352 1.03828 +VERTEX2 1956 -14.2189 -7.04072 -0.50216 +VERTEX2 1957 -13.3922 -7.48257 -0.520827 +VERTEX2 1958 -12.4671 -7.93988 -0.523926 +VERTEX2 1959 -11.5817 -8.50353 -0.52112 +VERTEX2 1960 -10.7845 -9.03765 -0.533408 +VERTEX2 1961 -10.3059 -8.16529 1.05085 +VERTEX2 1962 -9.81536 -7.35889 1.01406 +VERTEX2 1963 -9.23654 -6.61124 1.00625 +VERTEX2 1964 -8.67337 -5.75492 0.986425 +VERTEX2 1965 -8.10533 -4.91027 0.988049 +VERTEX2 1966 -8.92669 -4.34179 2.53427 +VERTEX2 1967 -9.73585 -3.84462 2.52935 +VERTEX2 1968 -10.4496 -3.20576 2.50325 +VERTEX2 1969 -11.2098 -2.54368 2.54105 +VERTEX2 1970 -12.0563 -1.94925 2.57745 +VERTEX2 1971 -12.6186 -2.74792 -2.12953 +VERTEX2 1972 -13.0917 -3.55547 -2.10329 +VERTEX2 1973 -13.5965 -4.43365 -2.09657 +VERTEX2 1974 -14.1772 -5.30425 -2.0769 +VERTEX2 1975 -14.6373 -6.12375 -2.10567 +VERTEX2 1976 -13.7124 -6.68705 -0.523687 +VERTEX2 1977 -12.8486 -7.21467 -0.513915 +VERTEX2 1978 -11.919 -7.78269 -0.517946 +VERTEX2 1979 -11.073 -8.25196 -0.515317 +VERTEX2 1980 -10.1634 -8.79642 -0.523002 +VERTEX2 1981 -9.67838 -7.9292 1.05418 +VERTEX2 1982 -9.16931 -7.04277 1.04088 +VERTEX2 1983 -8.64161 -6.18388 1.0101 +VERTEX2 1984 -8.1284 -5.27824 0.972486 +VERTEX2 1985 -7.60564 -4.4466 0.939375 +VERTEX2 1986 -8.37477 -3.82735 2.53172 +VERTEX2 1987 -9.24637 -3.21042 2.51859 +VERTEX2 1988 -10.1239 -2.53201 2.51686 +VERTEX2 1989 -10.9978 -1.90917 2.53711 +VERTEX2 1990 -11.7904 -1.32458 2.53019 +VERTEX2 1991 -11.2019 -0.547537 0.935565 +VERTEX2 1992 -10.6479 0.367869 0.903784 +VERTEX2 1993 -10.0651 1.2105 0.939412 +VERTEX2 1994 -9.58936 2.04685 0.940499 +VERTEX2 1995 -9.06279 2.90147 0.945863 +VERTEX2 1996 -9.89438 3.54285 2.51696 +VERTEX2 1997 -10.7308 4.25377 2.50641 +VERTEX2 1998 -11.5248 4.89639 2.5291 +VERTEX2 1999 -12.3735 5.49513 2.54814 +VERTEX2 2000 -13.1858 6.05181 2.56837 +VERTEX2 2001 -13.7254 5.20243 -2.13803 +VERTEX2 2002 -14.303 4.34929 -2.12789 +VERTEX2 2003 -14.8358 3.54221 -2.11683 +VERTEX2 2004 -15.3174 2.61479 -2.1364 +VERTEX2 2005 -15.8708 1.75571 -2.11438 +VERTEX2 2006 -16.7312 2.33768 2.64292 +VERTEX2 2007 -17.756 2.81636 2.63161 +VERTEX2 2008 -18.5427 3.38114 2.63185 +VERTEX2 2009 -19.3776 3.85182 2.64118 +VERTEX2 2010 -20.2769 4.31245 2.63063 +VERTEX2 2011 -20.8093 3.41714 -2.05642 +VERTEX2 2012 -21.2706 2.48159 -2.06253 +VERTEX2 2013 -21.785 1.61342 -2.06938 +VERTEX2 2014 -22.3067 0.708392 -2.0648 +VERTEX2 2015 -22.7477 -0.205162 -2.04491 +VERTEX2 2016 -23.6065 0.220195 2.64611 +VERTEX2 2017 -24.4118 0.646133 2.65944 +VERTEX2 2018 -25.3491 1.1358 2.63823 +VERTEX2 2019 -26.2181 1.62761 2.62657 +VERTEX2 2020 -27.1521 2.02316 2.62949 +VERTEX2 2021 -27.7253 1.15037 -2.0559 +VERTEX2 2022 -28.2086 0.227182 -2.07296 +VERTEX2 2023 -28.6903 -0.652161 -2.09523 +VERTEX2 2024 -29.0654 -1.42402 -2.16137 +VERTEX2 2025 -29.6166 -2.28225 -2.18079 +VERTEX2 2026 -28.6674 -2.86207 -0.588607 +VERTEX2 2027 -27.8149 -3.435 -0.616415 +VERTEX2 2028 -26.9482 -4.00403 -0.615424 +VERTEX2 2029 -26.036 -4.57714 -0.62106 +VERTEX2 2030 -25.2044 -5.19623 -0.607567 +VERTEX2 2031 -25.8372 -5.99281 -2.16588 +VERTEX2 2032 -26.4207 -6.86355 -2.17939 +VERTEX2 2033 -26.9598 -7.73235 -2.13798 +VERTEX2 2034 -27.502 -8.46839 -2.12125 +VERTEX2 2035 -27.971 -9.27159 -2.12391 +VERTEX2 2036 -28.7577 -8.79364 2.57767 +VERTEX2 2037 -29.6329 -8.25547 2.56932 +VERTEX2 2038 -30.5034 -7.7022 2.55739 +VERTEX2 2039 -31.3124 -7.15419 2.53878 +VERTEX2 2040 -32.1247 -6.57191 2.54189 +VERTEX2 2041 -32.6112 -7.42001 -2.13348 +VERTEX2 2042 -33.1577 -8.33656 -2.15162 +VERTEX2 2043 -33.7306 -9.21045 -2.11544 +VERTEX2 2044 -34.2267 -10.0978 -2.10724 +VERTEX2 2045 -34.7069 -11.003 -2.10261 +VERTEX2 2046 -33.7354 -11.517 -0.534625 +VERTEX2 2047 -32.7904 -11.9902 -0.556246 +VERTEX2 2048 -31.9486 -12.5884 -0.588572 +VERTEX2 2049 -31.2023 -13.1683 -0.606238 +VERTEX2 2050 -30.4003 -13.7656 -0.606872 +VERTEX2 2051 -29.8986 -12.9785 0.987095 +VERTEX2 2052 -29.355 -12.1568 1.00284 +VERTEX2 2053 -28.8506 -11.3303 1.049 +VERTEX2 2054 -28.3425 -10.4988 1.04881 +VERTEX2 2055 -27.7883 -9.58358 1.05609 +VERTEX2 2056 -26.9352 -10.1118 -0.481473 +VERTEX2 2057 -26.0783 -10.6248 -0.487299 +VERTEX2 2058 -25.2562 -11.1446 -0.500472 +VERTEX2 2059 -24.3735 -11.5983 -0.528523 +VERTEX2 2060 -23.5693 -12.184 -0.545103 +VERTEX2 2061 -22.9831 -11.3448 1.00278 +VERTEX2 2062 -22.3528 -10.5443 0.997694 +VERTEX2 2063 -21.7934 -9.68397 0.969025 +VERTEX2 2064 -21.2668 -8.85816 0.970404 +VERTEX2 2065 -20.7295 -8.12832 0.949282 +VERTEX2 2066 -21.5472 -7.53264 2.4971 +VERTEX2 2067 -22.3832 -6.92191 2.52433 +VERTEX2 2068 -23.1194 -6.29834 2.51284 +VERTEX2 2069 -23.9581 -5.66369 2.53207 +VERTEX2 2070 -24.8043 -5.02537 2.53625 +VERTEX2 2071 -24.2609 -4.23558 0.962738 +VERTEX2 2072 -23.6213 -3.49659 0.970915 +VERTEX2 2073 -23.11 -2.73717 0.974565 +VERTEX2 2074 -22.5917 -1.82451 0.985269 +VERTEX2 2075 -22.0662 -1.00574 0.983252 +VERTEX2 2076 -22.7727 -0.469014 2.55678 +VERTEX2 2077 -23.683 0.0589224 2.57231 +VERTEX2 2078 -24.5088 0.503269 2.54792 +VERTEX2 2079 -25.3691 1.08725 2.53073 +VERTEX2 2080 -26.1567 1.66746 2.55723 +VERTEX2 2081 -25.5762 2.49301 0.957204 +VERTEX2 2082 -25.015 3.35093 0.96005 +VERTEX2 2083 -24.5735 4.19608 0.953901 +VERTEX2 2084 -23.9056 5.01438 0.965834 +VERTEX2 2085 -23.406 5.782 0.98094 +VERTEX2 2086 -24.2753 6.28793 2.56502 +VERTEX2 2087 -25.1378 6.82137 2.53164 +VERTEX2 2088 -25.8501 7.4199 2.52859 +VERTEX2 2089 -26.6978 8.07985 2.5427 +VERTEX2 2090 -27.5519 8.62362 2.53009 +VERTEX2 2091 -28.1088 7.70734 -2.20413 +VERTEX2 2092 -28.6905 6.90155 -2.19502 +VERTEX2 2093 -29.1875 6.06336 -2.20768 +VERTEX2 2094 -29.6536 5.2986 -2.21744 +VERTEX2 2095 -30.333 4.49178 -2.21156 +VERTEX2 2096 -29.3937 3.89549 -0.626496 +VERTEX2 2097 -28.5772 3.32012 -0.635275 +VERTEX2 2098 -27.726 2.70237 -0.619608 +VERTEX2 2099 -26.9067 2.08766 -0.605263 +VERTEX2 2100 -26.0629 1.48325 -0.600737 +VERTEX2 2101 -26.6391 0.704716 -2.18615 +VERTEX2 2102 -27.1682 -0.130507 -2.21152 +VERTEX2 2103 -27.6473 -1.0611 -2.19987 +VERTEX2 2104 -28.2201 -1.79037 -2.21438 +VERTEX2 2105 -28.8641 -2.68801 -2.22821 +VERTEX2 2106 -28.0551 -3.32534 -0.663399 +VERTEX2 2107 -27.3101 -3.97092 -0.624348 +VERTEX2 2108 -26.4342 -4.54411 -0.654327 +VERTEX2 2109 -25.6517 -5.14787 -0.6677 +VERTEX2 2110 -24.8888 -5.72625 -0.653872 +VERTEX2 2111 -25.5439 -6.45124 -2.24218 +VERTEX2 2112 -26.1975 -7.27307 -2.20786 +VERTEX2 2113 -26.8211 -8.18751 -2.19779 +VERTEX2 2114 -27.4536 -8.98686 -2.22102 +VERTEX2 2115 -28.0369 -9.87707 -2.24284 +VERTEX2 2116 -27.1609 -10.4543 -0.685432 +VERTEX2 2117 -26.3717 -11.1443 -0.721439 +VERTEX2 2118 -25.5635 -11.906 -0.718893 +VERTEX2 2119 -24.8135 -12.5356 -0.710716 +VERTEX2 2120 -23.9764 -13.2468 -0.73881 +VERTEX2 2121 -23.3059 -12.4772 0.843023 +VERTEX2 2122 -22.6118 -11.7645 0.846578 +VERTEX2 2123 -21.9392 -10.9583 0.868428 +VERTEX2 2124 -21.3477 -10.1932 0.873793 +VERTEX2 2125 -20.7556 -9.3369 0.858069 +VERTEX2 2126 -21.4612 -8.66028 2.44629 +VERTEX2 2127 -22.1667 -8.06307 2.45537 +VERTEX2 2128 -22.8807 -7.38723 2.45954 +VERTEX2 2129 -23.6776 -6.80166 2.47321 +VERTEX2 2130 -24.5002 -6.20744 2.49398 +VERTEX2 2131 -25.1418 -6.96574 -2.21875 +VERTEX2 2132 -25.6689 -7.68038 -2.20986 +VERTEX2 2133 -26.2608 -8.43573 -2.22144 +VERTEX2 2134 -26.8168 -9.30165 -2.21022 +VERTEX2 2135 -27.5304 -10.0437 -2.20374 +VERTEX2 2136 -26.7704 -10.7377 -0.636977 +VERTEX2 2137 -26.039 -11.4077 -0.65251 +VERTEX2 2138 -25.1794 -11.9859 -0.642455 +VERTEX2 2139 -24.3208 -12.6492 -0.621864 +VERTEX2 2140 -23.4488 -13.2009 -0.615664 +VERTEX2 2141 -22.8822 -12.3145 0.951564 +VERTEX2 2142 -22.244 -11.4794 0.961323 +VERTEX2 2143 -21.7157 -10.653 0.938636 +VERTEX2 2144 -21.081 -9.79632 0.958144 +VERTEX2 2145 -20.4894 -9.00313 0.920603 +VERTEX2 2146 -21.3927 -8.36448 2.48162 +VERTEX2 2147 -22.1786 -7.66541 2.47875 +VERTEX2 2148 -23.0015 -7.10452 2.51599 +VERTEX2 2149 -23.8125 -6.53038 2.5057 +VERTEX2 2150 -24.562 -5.98111 2.51526 +VERTEX2 2151 -25.1892 -6.75962 -2.18565 +VERTEX2 2152 -25.6882 -7.58118 -2.20649 +VERTEX2 2153 -26.3974 -8.36855 -2.20635 +VERTEX2 2154 -26.9587 -9.12922 -2.17593 +VERTEX2 2155 -27.5366 -9.94961 -2.18439 +VERTEX2 2156 -26.6838 -10.516 -0.607257 +VERTEX2 2157 -25.7623 -11.0583 -0.604699 +VERTEX2 2158 -24.8792 -11.6515 -0.626468 +VERTEX2 2159 -24.0912 -12.2041 -0.630329 +VERTEX2 2160 -23.3286 -12.8397 -0.628378 +VERTEX2 2161 -23.9658 -13.6198 -2.19345 +VERTEX2 2162 -24.4868 -14.4062 -2.20956 +VERTEX2 2163 -25.0733 -15.1925 -2.22215 +VERTEX2 2164 -25.7098 -15.9446 -2.22048 +VERTEX2 2165 -26.3042 -16.6879 -2.24152 +VERTEX2 2166 -25.5009 -17.3489 -0.653259 +VERTEX2 2167 -24.7159 -17.8276 -0.655044 +VERTEX2 2168 -23.9684 -18.4093 -0.674743 +VERTEX2 2169 -23.204 -19.111 -0.673918 +VERTEX2 2170 -22.4332 -19.7771 -0.670034 +VERTEX2 2171 -21.863 -18.9192 0.879588 +VERTEX2 2172 -21.2026 -18.104 0.874673 +VERTEX2 2173 -20.5809 -17.2586 0.914196 +VERTEX2 2174 -19.8904 -16.4094 0.915505 +VERTEX2 2175 -19.4149 -15.5275 0.932563 +VERTEX2 2176 -20.249 -14.9853 2.55042 +VERTEX2 2177 -21.0522 -14.3575 2.53571 +VERTEX2 2178 -21.8388 -13.8141 2.5139 +VERTEX2 2179 -22.6623 -13.2553 2.49682 +VERTEX2 2180 -23.4326 -12.6347 2.53839 +VERTEX2 2181 -23.9894 -13.5079 -2.16712 +VERTEX2 2182 -24.6176 -14.2683 -2.13606 +VERTEX2 2183 -25.1897 -15.0004 -2.15797 +VERTEX2 2184 -25.6321 -15.7831 -2.14273 +VERTEX2 2185 -26.181 -16.6671 -2.17722 +VERTEX2 2186 -27.0013 -16.088 2.53197 +VERTEX2 2187 -27.7709 -15.5447 2.53494 +VERTEX2 2188 -28.5741 -14.9675 2.53602 +VERTEX2 2189 -29.3081 -14.32 2.50663 +VERTEX2 2190 -30.154 -13.7639 2.4766 +VERTEX2 2191 -30.6543 -14.5978 -2.22116 +VERTEX2 2192 -31.2886 -15.391 -2.21063 +VERTEX2 2193 -31.8007 -16.1688 -2.19769 +VERTEX2 2194 -32.3317 -16.9836 -2.17219 +VERTEX2 2195 -32.9376 -17.75 -2.18386 +VERTEX2 2196 -33.7844 -17.2085 2.52065 +VERTEX2 2197 -34.6497 -16.5663 2.51936 +VERTEX2 2198 -35.4348 -15.9605 2.53905 +VERTEX2 2199 -36.1693 -15.4125 2.55635 +VERTEX2 2200 -37.0325 -14.9048 2.56901 +VERTEX2 2201 -36.4435 -14.1046 1.03327 +VERTEX2 2202 -35.9213 -13.1721 1.02941 +VERTEX2 2203 -35.3895 -12.2847 1.02558 +VERTEX2 2204 -34.9545 -11.3824 1.04973 +VERTEX2 2205 -34.4925 -10.6416 1.06115 +VERTEX2 2206 -35.3675 -10.183 2.60082 +VERTEX2 2207 -36.2565 -9.62341 2.60892 +VERTEX2 2208 -37.1225 -9.08297 2.5513 +VERTEX2 2209 -37.9327 -8.56056 2.5388 +VERTEX2 2210 -38.7484 -7.95265 2.52645 +VERTEX2 2211 -39.3102 -8.80905 -2.17795 +VERTEX2 2212 -39.8796 -9.64383 -2.17619 +VERTEX2 2213 -40.4735 -10.4379 -2.13187 +VERTEX2 2214 -41.041 -11.2786 -2.12226 +VERTEX2 2215 -41.5158 -12.0566 -2.11717 +VERTEX2 2216 -40.781 -12.5638 -0.512498 +VERTEX2 2217 -39.9317 -13.0609 -0.524896 +VERTEX2 2218 -39.1071 -13.5879 -0.499367 +VERTEX2 2219 -38.3063 -14.0355 -0.503208 +VERTEX2 2220 -37.4806 -14.4758 -0.501131 +VERTEX2 2221 -37.9239 -15.2852 -2.08402 +VERTEX2 2222 -38.4773 -16.1905 -2.05655 +VERTEX2 2223 -38.9962 -17.1532 -2.07652 +VERTEX2 2224 -39.4514 -17.9958 -2.05771 +VERTEX2 2225 -39.8788 -18.879 -2.04049 +VERTEX2 2226 -38.9521 -19.3226 -0.497408 +VERTEX2 2227 -38.0803 -19.7753 -0.459916 +VERTEX2 2228 -37.1701 -20.232 -0.456251 +VERTEX2 2229 -36.2538 -20.6137 -0.435612 +VERTEX2 2230 -35.3352 -21.0428 -0.431071 +VERTEX2 2231 -35.7111 -22.0294 -1.97421 +VERTEX2 2232 -36.2346 -22.983 -1.99973 +VERTEX2 2233 -36.6503 -23.8879 -1.99935 +VERTEX2 2234 -37.0321 -24.7392 -1.9945 +VERTEX2 2235 -37.3942 -25.7124 -2.00447 +VERTEX2 2236 -36.4421 -26.0936 -0.435866 +VERTEX2 2237 -35.55 -26.501 -0.441485 +VERTEX2 2238 -34.6831 -26.8881 -0.418416 +VERTEX2 2239 -33.7655 -27.2646 -0.409625 +VERTEX2 2240 -32.8315 -27.6445 -0.387139 +VERTEX2 2241 -32.512 -26.7598 1.2072 +VERTEX2 2242 -32.1095 -25.8618 1.21865 +VERTEX2 2243 -31.7325 -24.9363 1.21474 +VERTEX2 2244 -31.4823 -24.0091 1.19711 +VERTEX2 2245 -31.1358 -23.0297 1.1934 +VERTEX2 2246 -32.1219 -22.7172 2.76142 +VERTEX2 2247 -33.0688 -22.2976 2.74747 +VERTEX2 2248 -33.9768 -21.9563 2.74634 +VERTEX2 2249 -34.9101 -21.5646 2.72761 +VERTEX2 2250 -35.7966 -21.1516 2.72037 +VERTEX2 2251 -36.2454 -22.0484 -1.97143 +VERTEX2 2252 -36.6175 -22.9107 -1.9614 +VERTEX2 2253 -37.0174 -23.8998 -1.95746 +VERTEX2 2254 -37.3406 -24.821 -1.93136 +VERTEX2 2255 -37.7077 -25.63 -1.91047 +VERTEX2 2256 -38.5678 -25.3125 2.81307 +VERTEX2 2257 -39.4402 -24.9817 2.80715 +VERTEX2 2258 -40.3626 -24.6784 2.81993 +VERTEX2 2259 -41.2252 -24.3846 2.82848 +VERTEX2 2260 -42.1342 -24.1117 2.82969 +VERTEX2 2261 -41.8758 -23.1873 1.26742 +VERTEX2 2262 -41.6054 -22.1488 1.26115 +VERTEX2 2263 -41.2861 -21.2409 1.25011 +VERTEX2 2264 -41.0156 -20.281 1.19773 +VERTEX2 2265 -40.667 -19.4155 1.20909 +VERTEX2 2266 -39.715 -19.7785 -0.372112 +VERTEX2 2267 -38.7845 -20.1383 -0.352734 +VERTEX2 2268 -37.847 -20.3997 -0.388552 +VERTEX2 2269 -36.9708 -20.7717 -0.385009 +VERTEX2 2270 -36.0478 -21.2278 -0.383865 +VERTEX2 2271 -36.4142 -22.0456 -1.96685 +VERTEX2 2272 -36.7618 -23.0732 -1.93711 +VERTEX2 2273 -37.0612 -24.0331 -1.93075 +VERTEX2 2274 -37.544 -24.9229 -1.93567 +VERTEX2 2275 -37.9336 -25.8534 -1.92962 +VERTEX2 2276 -37.0026 -26.2414 -0.372766 +VERTEX2 2277 -36.0369 -26.6698 -0.360565 +VERTEX2 2278 -35.015 -27.0449 -0.336394 +VERTEX2 2279 -34.1497 -27.3216 -0.339998 +VERTEX2 2280 -33.2014 -27.6523 -0.319565 +VERTEX2 2281 -33.5277 -28.7016 -1.91669 +VERTEX2 2282 -33.8475 -29.6743 -1.84037 +VERTEX2 2283 -34.0536 -30.6509 -1.84725 +VERTEX2 2284 -34.4019 -31.5602 -1.87424 +VERTEX2 2285 -34.718 -32.5281 -1.87137 +VERTEX2 2286 -33.7819 -32.8437 -0.308141 +VERTEX2 2287 -32.7798 -33.13 -0.298199 +VERTEX2 2288 -31.8827 -33.3868 -0.323123 +VERTEX2 2289 -30.8996 -33.6619 -0.330815 +VERTEX2 2290 -30.017 -34.0523 -0.344846 +VERTEX2 2291 -29.6917 -33.1115 1.21449 +VERTEX2 2292 -29.3558 -32.1726 1.19236 +VERTEX2 2293 -29.0412 -31.1717 1.24183 +VERTEX2 2294 -28.8044 -30.2805 1.2222 +VERTEX2 2295 -28.4341 -29.2729 1.2082 +VERTEX2 2296 -27.4503 -29.6487 -0.355111 +VERTEX2 2297 -26.5215 -29.9691 -0.3395 +VERTEX2 2298 -25.5891 -30.2204 -0.356269 +VERTEX2 2299 -24.5751 -30.5563 -0.366286 +VERTEX2 2300 -23.6683 -30.8981 -0.385414 +VERTEX2 2301 -23.3999 -30.004 1.19367 +VERTEX2 2302 -23.0173 -29.0969 1.16718 +VERTEX2 2303 -22.6358 -28.1247 1.16355 +VERTEX2 2304 -22.2515 -27.2197 1.17386 +VERTEX2 2305 -21.8756 -26.393 1.17452 +VERTEX2 2306 -20.9509 -26.7247 -0.35336 +VERTEX2 2307 -20.0106 -27.0473 -0.378832 +VERTEX2 2308 -19.0683 -27.5058 -0.382466 +VERTEX2 2309 -18.0705 -27.802 -0.401091 +VERTEX2 2310 -17.0876 -28.2221 -0.451426 +VERTEX2 2311 -16.5943 -27.4158 1.10528 +VERTEX2 2312 -16.2118 -26.4637 1.11467 +VERTEX2 2313 -15.7059 -25.6516 1.11652 +VERTEX2 2314 -15.2734 -24.7502 1.13692 +VERTEX2 2315 -14.8031 -23.8919 1.11878 +VERTEX2 2316 -13.8245 -24.3139 -0.45076 +VERTEX2 2317 -12.8472 -24.7878 -0.456486 +VERTEX2 2318 -11.9863 -25.2511 -0.452594 +VERTEX2 2319 -11.069 -25.7242 -0.478989 +VERTEX2 2320 -10.1818 -26.2064 -0.471158 +VERTEX2 2321 -9.68834 -25.3479 1.09159 +VERTEX2 2322 -9.29535 -24.4975 1.11634 +VERTEX2 2323 -8.89155 -23.6023 1.10694 +VERTEX2 2324 -8.49713 -22.6783 1.07153 +VERTEX2 2325 -8.04387 -21.8401 1.02528 +VERTEX2 2326 -8.83289 -21.2797 2.59188 +VERTEX2 2327 -9.72456 -20.8289 2.5701 +VERTEX2 2328 -10.5205 -20.2305 2.58728 +VERTEX2 2329 -11.3982 -19.6921 2.59312 +VERTEX2 2330 -12.2359 -19.1236 2.60946 +VERTEX2 2331 -12.7798 -19.9478 -2.10877 +VERTEX2 2332 -13.3223 -20.8657 -2.1221 +VERTEX2 2333 -13.887 -21.6555 -2.11644 +VERTEX2 2334 -14.464 -22.4477 -2.10716 +VERTEX2 2335 -14.9601 -23.3144 -2.12529 +VERTEX2 2336 -14.0838 -23.8282 -0.570339 +VERTEX2 2337 -13.2978 -24.3679 -0.554771 +VERTEX2 2338 -12.3715 -24.8486 -0.553468 +VERTEX2 2339 -11.5362 -25.3581 -0.552068 +VERTEX2 2340 -10.6397 -25.9214 -0.575576 +VERTEX2 2341 -10.1158 -25.0409 1.00289 +VERTEX2 2342 -9.51028 -24.1688 1.03 +VERTEX2 2343 -8.98458 -23.3574 1.04997 +VERTEX2 2344 -8.40522 -22.4467 1.06041 +VERTEX2 2345 -7.86278 -21.4712 1.05563 +VERTEX2 2346 -8.76203 -21.0752 2.6037 +VERTEX2 2347 -9.56329 -20.5418 2.62576 +VERTEX2 2348 -10.4473 -20.0065 2.6287 +VERTEX2 2349 -11.357 -19.5296 2.62521 +VERTEX2 2350 -12.2439 -19.0943 2.65625 +VERTEX2 2351 -12.7505 -19.9998 -2.01738 +VERTEX2 2352 -13.169 -20.9537 -2.00239 +VERTEX2 2353 -13.5909 -21.8865 -1.97365 +VERTEX2 2354 -13.9482 -22.8126 -1.99133 +VERTEX2 2355 -14.3289 -23.7914 -2.01507 +VERTEX2 2356 -13.4189 -24.2655 -0.421258 +VERTEX2 2357 -12.4875 -24.666 -0.424967 +VERTEX2 2358 -11.5601 -25.1885 -0.439404 +VERTEX2 2359 -10.6944 -25.5704 -0.43627 +VERTEX2 2360 -9.75193 -25.9761 -0.439088 +VERTEX2 2361 -9.31848 -24.9976 1.11305 +VERTEX2 2362 -8.84573 -24.1326 1.1176 +VERTEX2 2363 -8.41144 -23.2164 1.1093 +VERTEX2 2364 -8.03092 -22.3069 1.09651 +VERTEX2 2365 -7.56054 -21.3758 1.07655 +VERTEX2 2366 -8.43766 -20.9353 2.65537 +VERTEX2 2367 -9.32789 -20.5327 2.6764 +VERTEX2 2368 -10.1997 -20.0642 2.63471 +VERTEX2 2369 -11.0622 -19.5972 2.65018 +VERTEX2 2370 -11.9216 -19.1081 2.64713 +VERTEX2 2371 -12.3199 -19.9991 -2.10022 +VERTEX2 2372 -12.7155 -20.9256 -2.12139 +VERTEX2 2373 -13.2757 -21.6853 -2.10506 +VERTEX2 2374 -13.857 -22.5994 -2.16328 +VERTEX2 2375 -14.3854 -23.3855 -2.16031 +VERTEX2 2376 -15.1792 -22.8311 2.53554 +VERTEX2 2377 -15.9528 -22.2613 2.54789 +VERTEX2 2378 -16.754 -21.5979 2.5628 +VERTEX2 2379 -17.5198 -21.0529 2.51825 +VERTEX2 2380 -18.3446 -20.482 2.5204 +VERTEX2 2381 -18.9648 -21.4231 -2.17414 +VERTEX2 2382 -19.5172 -22.3 -2.17344 +VERTEX2 2383 -20.1083 -23.178 -2.21344 +VERTEX2 2384 -20.7071 -24.0157 -2.19119 +VERTEX2 2385 -21.2197 -24.8152 -2.20018 +VERTEX2 2386 -20.4134 -25.3802 -0.616646 +VERTEX2 2387 -19.5312 -25.9444 -0.662074 +VERTEX2 2388 -18.7791 -26.579 -0.629692 +VERTEX2 2389 -17.9768 -27.1977 -0.612873 +VERTEX2 2390 -17.2249 -27.7359 -0.619769 +VERTEX2 2391 -16.6275 -26.8813 0.99477 +VERTEX2 2392 -16.1142 -26.0338 1.00881 +VERTEX2 2393 -15.5605 -25.2138 1.01179 +VERTEX2 2394 -14.9678 -24.4266 0.983231 +VERTEX2 2395 -14.3873 -23.5127 0.979656 +VERTEX2 2396 -15.2127 -22.9787 2.5639 +VERTEX2 2397 -16.0107 -22.43 2.59215 +VERTEX2 2398 -16.8217 -21.929 2.61083 +VERTEX2 2399 -17.6443 -21.3857 2.59251 +VERTEX2 2400 -18.4827 -20.9233 2.57175 +VERTEX2 2401 -19.0407 -21.7484 -2.12268 +VERTEX2 2402 -19.5708 -22.5553 -2.15062 +VERTEX2 2403 -20.0582 -23.4187 -2.12693 +VERTEX2 2404 -20.6605 -24.2957 -2.13112 +VERTEX2 2405 -21.1341 -25.1221 -2.13948 +VERTEX2 2406 -21.9925 -24.5713 2.57396 +VERTEX2 2407 -22.8641 -24.0865 2.57712 +VERTEX2 2408 -23.6683 -23.5462 2.59267 +VERTEX2 2409 -24.5336 -23.0902 2.6045 +VERTEX2 2410 -25.405 -22.6415 2.55225 +VERTEX2 2411 -25.9143 -23.3661 -2.14748 +VERTEX2 2412 -26.4315 -24.167 -2.1677 +VERTEX2 2413 -27.0319 -24.9714 -2.16657 +VERTEX2 2414 -27.6065 -25.7748 -2.15258 +VERTEX2 2415 -28.0883 -26.5872 -2.17344 +VERTEX2 2416 -27.2247 -27.1466 -0.620395 +VERTEX2 2417 -26.4797 -27.796 -0.598217 +VERTEX2 2418 -25.6084 -28.292 -0.58629 +VERTEX2 2419 -24.7388 -28.8608 -0.58783 +VERTEX2 2420 -23.9883 -29.4851 -0.567712 +VERTEX2 2421 -23.5397 -28.6226 0.991672 +VERTEX2 2422 -22.9749 -27.822 0.990172 +VERTEX2 2423 -22.4503 -27.0441 1.01418 +VERTEX2 2424 -21.876 -26.2313 1.02697 +VERTEX2 2425 -21.3437 -25.391 1.03747 +VERTEX2 2426 -22.1908 -24.824 2.58869 +VERTEX2 2427 -23.071 -24.3492 2.59435 +VERTEX2 2428 -23.9809 -23.8076 2.59421 +VERTEX2 2429 -24.823 -23.3505 2.60617 +VERTEX2 2430 -25.6464 -22.8732 2.61576 +VERTEX2 2431 -26.0975 -23.7416 -2.10175 +VERTEX2 2432 -26.6436 -24.5503 -2.10552 +VERTEX2 2433 -27.1422 -25.4722 -2.09374 +VERTEX2 2434 -27.6508 -26.3413 -2.09784 +VERTEX2 2435 -28.1259 -27.1989 -2.11277 +VERTEX2 2436 -27.3061 -27.6844 -0.560213 +VERTEX2 2437 -26.4484 -28.2073 -0.565251 +VERTEX2 2438 -25.6338 -28.7248 -0.528987 +VERTEX2 2439 -24.8567 -29.185 -0.512503 +VERTEX2 2440 -24.0686 -29.6356 -0.512995 +VERTEX2 2441 -24.5434 -30.4599 -2.10883 +VERTEX2 2442 -25.0641 -31.3473 -2.15061 +VERTEX2 2443 -25.6155 -32.1275 -2.13686 +VERTEX2 2444 -26.0502 -32.9739 -2.14633 +VERTEX2 2445 -26.5055 -33.7926 -2.15372 +VERTEX2 2446 -27.342 -33.2311 2.56079 +VERTEX2 2447 -28.1285 -32.6676 2.57321 +VERTEX2 2448 -28.9924 -32.1105 2.57337 +VERTEX2 2449 -29.7763 -31.5591 2.60126 +VERTEX2 2450 -30.6846 -30.9454 2.60809 +VERTEX2 2451 -30.2266 -30.0577 1.05633 +VERTEX2 2452 -29.657 -29.1622 1.07866 +VERTEX2 2453 -29.1833 -28.2876 1.08763 +VERTEX2 2454 -28.7217 -27.4084 1.10875 +VERTEX2 2455 -28.2672 -26.565 1.10379 +VERTEX2 2456 -29.239 -26.0387 2.71738 +VERTEX2 2457 -30.1939 -25.6119 2.73684 +VERTEX2 2458 -31.2061 -25.2156 2.79259 +VERTEX2 2459 -32.1548 -24.7615 2.80345 +VERTEX2 2460 -33.0812 -24.4187 2.80202 +VERTEX2 2461 -33.4531 -25.3385 -1.89814 +VERTEX2 2462 -33.791 -26.2718 -1.89486 +VERTEX2 2463 -34.1956 -27.1443 -1.90619 +VERTEX2 2464 -34.4357 -28.0297 -1.92497 +VERTEX2 2465 -34.7219 -28.9175 -1.91876 +VERTEX2 2466 -33.695 -29.2361 -0.353491 +VERTEX2 2467 -32.7103 -29.6075 -0.391096 +VERTEX2 2468 -31.7583 -29.9897 -0.378117 +VERTEX2 2469 -30.8519 -30.2957 -0.381076 +VERTEX2 2470 -29.9163 -30.7149 -0.390999 +VERTEX2 2471 -30.2902 -31.6154 -1.9381 +VERTEX2 2472 -30.6188 -32.5348 -1.94721 +VERTEX2 2473 -30.9833 -33.5063 -1.94006 +VERTEX2 2474 -31.4296 -34.4417 -1.91612 +VERTEX2 2475 -31.7388 -35.3817 -1.93224 +VERTEX2 2476 -30.7554 -35.7818 -0.347614 +VERTEX2 2477 -29.8016 -36.1616 -0.370215 +VERTEX2 2478 -28.8712 -36.5138 -0.362155 +VERTEX2 2479 -27.997 -36.848 -0.383551 +VERTEX2 2480 -27.0368 -37.2706 -0.36755 +VERTEX2 2481 -26.6498 -36.3555 1.22138 +VERTEX2 2482 -26.2698 -35.4834 1.20491 +VERTEX2 2483 -25.8836 -34.5515 1.2003 +VERTEX2 2484 -25.5038 -33.6074 1.22036 +VERTEX2 2485 -25.1692 -32.6677 1.26118 +VERTEX2 2486 -26.08 -32.2727 2.84137 +VERTEX2 2487 -27.1318 -32.0088 2.82205 +VERTEX2 2488 -28.007 -31.6899 2.83196 +VERTEX2 2489 -28.9196 -31.3178 2.82458 +VERTEX2 2490 -29.8873 -30.9801 2.82505 +VERTEX2 2491 -29.4602 -29.9773 1.25633 +VERTEX2 2492 -29.1304 -29.0982 1.24568 +VERTEX2 2493 -28.7452 -28.1753 1.25039 +VERTEX2 2494 -28.3885 -27.2255 1.24078 +VERTEX2 2495 -28.077 -26.3271 1.25654 +VERTEX2 2496 -27.1167 -26.5908 -0.31735 +VERTEX2 2497 -26.1466 -26.9299 -0.342127 +VERTEX2 2498 -25.2583 -27.2878 -0.348879 +VERTEX2 2499 -24.2968 -27.5356 -0.355607 +VERTEX2 2500 -23.2773 -27.8961 -0.381776 +VERTEX2 2501 -23.6333 -28.8156 -1.94389 +VERTEX2 2502 -24.034 -29.7916 -1.94874 +VERTEX2 2503 -24.4693 -30.7072 -1.95834 +VERTEX2 2504 -24.8448 -31.6432 -1.9963 +VERTEX2 2505 -25.2186 -32.5584 -1.9928 +VERTEX2 2506 -24.3207 -32.9687 -0.426081 +VERTEX2 2507 -23.4171 -33.3201 -0.42228 +VERTEX2 2508 -22.5321 -33.7405 -0.430997 +VERTEX2 2509 -21.6394 -34.1332 -0.41702 +VERTEX2 2510 -20.7447 -34.5519 -0.394973 +VERTEX2 2511 -20.2902 -33.6572 1.18093 +VERTEX2 2512 -19.9085 -32.756 1.17389 +VERTEX2 2513 -19.5004 -31.8605 1.20777 +VERTEX2 2514 -19.1714 -30.7936 1.2051 +VERTEX2 2515 -18.8558 -29.8982 1.19398 +VERTEX2 2516 -19.7746 -29.4994 2.75333 +VERTEX2 2517 -20.7694 -29.1249 2.75461 +VERTEX2 2518 -21.7721 -28.7545 2.7657 +VERTEX2 2519 -22.8013 -28.4467 2.77482 +VERTEX2 2520 -23.7657 -28.0375 2.75922 +VERTEX2 2521 -23.3587 -27.1222 1.18116 +VERTEX2 2522 -23.0541 -26.2512 1.19699 +VERTEX2 2523 -22.6705 -25.2859 1.18692 +VERTEX2 2524 -22.3468 -24.3286 1.18626 +VERTEX2 2525 -21.9796 -23.4182 1.19207 +VERTEX2 2526 -22.9261 -23.0209 2.78514 +VERTEX2 2527 -23.8444 -22.6995 2.79842 +VERTEX2 2528 -24.7161 -22.264 2.77681 +VERTEX2 2529 -25.7252 -21.8951 2.79095 +VERTEX2 2530 -26.715 -21.5836 2.77701 +VERTEX2 2531 -27.0719 -22.5343 -1.90485 +VERTEX2 2532 -27.3692 -23.4605 -1.89295 +VERTEX2 2533 -27.7318 -24.3987 -1.88327 +VERTEX2 2534 -27.9819 -25.3675 -1.87838 +VERTEX2 2535 -28.3241 -26.4076 -1.92167 +VERTEX2 2536 -27.256 -26.7828 -0.343817 +VERTEX2 2537 -26.303 -27.0463 -0.308177 +VERTEX2 2538 -25.3712 -27.3905 -0.295279 +VERTEX2 2539 -24.3506 -27.6686 -0.291842 +VERTEX2 2540 -23.4788 -27.9164 -0.299395 +VERTEX2 2541 -23.1549 -26.9929 1.25184 +VERTEX2 2542 -22.8039 -26.0171 1.25908 +VERTEX2 2543 -22.5819 -24.9926 1.26449 +VERTEX2 2544 -22.2733 -24.048 1.23244 +VERTEX2 2545 -21.9417 -23.0649 1.21465 +VERTEX2 2546 -22.9331 -22.797 2.79961 +VERTEX2 2547 -23.8736 -22.4165 2.81528 +VERTEX2 2548 -24.8036 -22.1505 2.8264 +VERTEX2 2549 -25.7154 -21.7523 2.83877 +VERTEX2 2550 -26.698 -21.5224 2.81014 +VERTEX2 2551 -26.9713 -22.469 -1.9054 +VERTEX2 2552 -27.2941 -23.4711 -1.92259 +VERTEX2 2553 -27.6028 -24.3908 -1.91862 +VERTEX2 2554 -28.061 -25.3385 -1.92855 +VERTEX2 2555 -28.4327 -26.35 -1.91635 +VERTEX2 2556 -27.5402 -26.6885 -0.345991 +VERTEX2 2557 -26.5367 -27.1207 -0.336904 +VERTEX2 2558 -25.6581 -27.3617 -0.31612 +VERTEX2 2559 -24.7705 -27.7002 -0.349702 +VERTEX2 2560 -23.8092 -27.9968 -0.359288 +VERTEX2 2561 -23.4138 -27.1153 1.21405 +VERTEX2 2562 -23.1105 -26.211 1.23518 +VERTEX2 2563 -22.8615 -25.297 1.22502 +VERTEX2 2564 -22.5183 -24.323 1.23576 +VERTEX2 2565 -22.1852 -23.3676 1.26185 +VERTEX2 2566 -23.114 -23.023 2.82806 +VERTEX2 2567 -24.0706 -22.8022 2.83913 +VERTEX2 2568 -24.9935 -22.5557 2.8474 +VERTEX2 2569 -25.8756 -22.2741 2.88136 +VERTEX2 2570 -26.9139 -22.0806 2.86748 +VERTEX2 2571 -27.0952 -23.0106 -1.869 +VERTEX2 2572 -27.4316 -24.0166 -1.88607 +VERTEX2 2573 -27.7542 -25.0163 -1.88487 +VERTEX2 2574 -28.0682 -25.9408 -1.81692 +VERTEX2 2575 -28.3871 -26.9564 -1.84229 +VERTEX2 2576 -27.4262 -27.1508 -0.264573 +VERTEX2 2577 -26.3957 -27.5128 -0.246965 +VERTEX2 2578 -25.4172 -27.7944 -0.246542 +VERTEX2 2579 -24.3751 -28.038 -0.242891 +VERTEX2 2580 -23.2739 -28.219 -0.297315 +VERTEX2 2581 -22.962 -27.2715 1.24824 +VERTEX2 2582 -22.6668 -26.3124 1.22476 +VERTEX2 2583 -22.2452 -25.3272 1.27213 +VERTEX2 2584 -21.9641 -24.3802 1.30025 +VERTEX2 2585 -21.7194 -23.4281 1.30056 +VERTEX2 2586 -22.6295 -23.1857 2.87724 +VERTEX2 2587 -23.5972 -22.9308 2.89775 +VERTEX2 2588 -24.543 -22.7198 2.88521 +VERTEX2 2589 -25.4064 -22.5207 2.87612 +VERTEX2 2590 -26.3416 -22.2 2.8634 +VERTEX2 2591 -26.58 -23.1729 -1.84178 +VERTEX2 2592 -26.8356 -24.1881 -1.85741 +VERTEX2 2593 -27.0815 -25.2401 -1.85518 +VERTEX2 2594 -27.4368 -26.1103 -1.89494 +VERTEX2 2595 -27.728 -27.0412 -1.88667 +VERTEX2 2596 -26.7972 -27.3669 -0.333168 +VERTEX2 2597 -25.816 -27.7036 -0.361839 +VERTEX2 2598 -24.8415 -28.0816 -0.378019 +VERTEX2 2599 -23.8742 -28.4311 -0.385182 +VERTEX2 2600 -22.826 -28.8795 -0.365727 +VERTEX2 2601 -23.2468 -29.8362 -1.94721 +VERTEX2 2602 -23.6099 -30.8218 -1.94975 +VERTEX2 2603 -24.0542 -31.7343 -1.94374 +VERTEX2 2604 -24.3723 -32.7065 -1.96492 +VERTEX2 2605 -24.6995 -33.5767 -1.98512 +VERTEX2 2606 -23.741 -34.0259 -0.442919 +VERTEX2 2607 -22.7988 -34.4959 -0.443727 +VERTEX2 2608 -21.823 -34.926 -0.456324 +VERTEX2 2609 -20.8962 -35.3297 -0.445513 +VERTEX2 2610 -19.994 -35.7102 -0.399951 +VERTEX2 2611 -20.3751 -36.6333 -1.98945 +VERTEX2 2612 -20.777 -37.4894 -1.96655 +VERTEX2 2613 -21.2143 -38.3526 -1.96677 +VERTEX2 2614 -21.6148 -39.2974 -1.97026 +VERTEX2 2615 -21.9669 -40.2353 -1.97713 +VERTEX2 2616 -21.0271 -40.6894 -0.375224 +VERTEX2 2617 -20.1178 -41.1404 -0.389164 +VERTEX2 2618 -19.2545 -41.5972 -0.403961 +VERTEX2 2619 -18.3653 -41.9871 -0.414622 +VERTEX2 2620 -17.4261 -42.3506 -0.39385 +VERTEX2 2621 -16.9975 -41.5478 1.18698 +VERTEX2 2622 -16.6039 -40.5925 1.24024 +VERTEX2 2623 -16.2074 -39.7299 1.23187 +VERTEX2 2624 -15.8867 -38.7996 1.26161 +VERTEX2 2625 -15.5748 -37.8758 1.25961 +VERTEX2 2626 -16.5181 -37.5456 2.8458 +VERTEX2 2627 -17.4839 -37.2355 2.83471 +VERTEX2 2628 -18.411 -36.9925 2.85624 +VERTEX2 2629 -19.3177 -36.7236 2.84137 +VERTEX2 2630 -20.2838 -36.4414 2.84131 +VERTEX2 2631 -19.8906 -35.4809 1.26002 +VERTEX2 2632 -19.5462 -34.5051 1.23442 +VERTEX2 2633 -19.2501 -33.5618 1.24463 +VERTEX2 2634 -18.9182 -32.6291 1.26563 +VERTEX2 2635 -18.6296 -31.6173 1.29806 +VERTEX2 2636 -19.6106 -31.305 2.84472 +VERTEX2 2637 -20.4287 -30.9515 2.86267 +VERTEX2 2638 -21.4389 -30.7761 2.84948 +VERTEX2 2639 -22.4406 -30.4389 2.86605 +VERTEX2 2640 -23.5275 -30.0406 2.8445 +VERTEX2 2641 -23.8453 -30.9887 -1.89355 +VERTEX2 2642 -24.1873 -31.8797 -1.87544 +VERTEX2 2643 -24.4768 -32.8567 -1.85868 +VERTEX2 2644 -24.8023 -33.8572 -1.82986 +VERTEX2 2645 -25.0081 -34.7402 -1.85974 +VERTEX2 2646 -24.0622 -35.085 -0.314366 +VERTEX2 2647 -22.9886 -35.4407 -0.297729 +VERTEX2 2648 -22.0521 -35.6785 -0.274254 +VERTEX2 2649 -21.1344 -35.8976 -0.249412 +VERTEX2 2650 -20.1474 -36.1297 -0.251985 +VERTEX2 2651 -19.8581 -35.2829 1.314 +VERTEX2 2652 -19.5833 -34.2911 1.31175 +VERTEX2 2653 -19.4026 -33.2923 1.30644 +VERTEX2 2654 -19.1143 -32.3097 1.31368 +VERTEX2 2655 -18.7673 -31.3691 1.34603 +VERTEX2 2656 -19.7473 -31.1537 2.93506 +VERTEX2 2657 -20.7553 -30.8698 2.91615 +VERTEX2 2658 -21.6891 -30.6294 2.92108 +VERTEX2 2659 -22.6131 -30.308 2.90762 +VERTEX2 2660 -23.609 -30.0863 2.90561 +VERTEX2 2661 -23.8214 -31.1361 -1.8263 +VERTEX2 2662 -24.0621 -32.0801 -1.84721 +VERTEX2 2663 -24.3889 -33.0325 -1.83052 +VERTEX2 2664 -24.6034 -34.005 -1.85546 +VERTEX2 2665 -24.8502 -34.9255 -1.84298 +VERTEX2 2666 -23.911 -35.2049 -0.237531 +VERTEX2 2667 -22.9235 -35.4246 -0.238358 +VERTEX2 2668 -21.9367 -35.5324 -0.265313 +VERTEX2 2669 -21.0397 -35.7657 -0.271456 +VERTEX2 2670 -20.0646 -36.0396 -0.281029 +VERTEX2 2671 -20.2769 -36.9697 -1.86172 +VERTEX2 2672 -20.6311 -38.0099 -1.88022 +VERTEX2 2673 -20.9016 -38.9321 -1.85936 +VERTEX2 2674 -21.1395 -39.9375 -1.84357 +VERTEX2 2675 -21.3719 -40.8039 -1.81956 +VERTEX2 2676 -20.4649 -41.0601 -0.253828 +VERTEX2 2677 -19.4911 -41.3312 -0.290256 +VERTEX2 2678 -18.5243 -41.5768 -0.282263 +VERTEX2 2679 -17.5054 -41.8684 -0.283837 +VERTEX2 2680 -16.4948 -42.1093 -0.228867 +VERTEX2 2681 -16.171 -41.0962 1.35947 +VERTEX2 2682 -15.9159 -40.2189 1.40057 +VERTEX2 2683 -15.7401 -39.2364 1.38602 +VERTEX2 2684 -15.5852 -38.2321 1.37356 +VERTEX2 2685 -15.4171 -37.2725 1.40373 +VERTEX2 2686 -16.3484 -37.137 2.95481 +VERTEX2 2687 -17.3781 -36.8634 2.94015 +VERTEX2 2688 -18.3328 -36.5428 2.92516 +VERTEX2 2689 -19.2736 -36.3575 2.9255 +VERTEX2 2690 -20.2444 -36.0416 2.91847 +VERTEX2 2691 -20.4433 -37.004 -1.81588 +VERTEX2 2692 -20.6966 -37.9454 -1.8281 +VERTEX2 2693 -20.9617 -38.8488 -1.83455 +VERTEX2 2694 -21.2969 -39.834 -1.82745 +VERTEX2 2695 -21.5856 -40.8325 -1.82373 +VERTEX2 2696 -20.6447 -41.1118 -0.25309 +VERTEX2 2697 -19.6519 -41.361 -0.274745 +VERTEX2 2698 -18.5768 -41.6496 -0.271284 +VERTEX2 2699 -17.6562 -41.9283 -0.271901 +VERTEX2 2700 -16.6722 -42.2576 -0.306082 +VERTEX2 2701 -16.9155 -43.2245 -1.89859 +VERTEX2 2702 -17.254 -44.1562 -1.87924 +VERTEX2 2703 -17.5631 -45.1295 -1.90958 +VERTEX2 2704 -17.967 -46.1753 -1.89687 +VERTEX2 2705 -18.2978 -47.1382 -1.9271 +VERTEX2 2706 -19.236 -46.7538 2.77481 +VERTEX2 2707 -20.2102 -46.4267 2.80841 +VERTEX2 2708 -21.093 -46.0472 2.85498 +VERTEX2 2709 -22.1015 -45.7857 2.85108 +VERTEX2 2710 -23.0543 -45.4733 2.80853 +VERTEX2 2711 -23.2846 -46.4498 -1.92918 +VERTEX2 2712 -23.5789 -47.3374 -1.91299 +VERTEX2 2713 -23.8966 -48.2338 -1.95576 +VERTEX2 2714 -24.3438 -49.1778 -1.9226 +VERTEX2 2715 -24.6762 -50.1188 -1.92983 +VERTEX2 2716 -23.6955 -50.4448 -0.35722 +VERTEX2 2717 -22.8584 -50.7635 -0.338034 +VERTEX2 2718 -21.9235 -51.1599 -0.326066 +VERTEX2 2719 -20.9953 -51.4883 -0.368125 +VERTEX2 2720 -20.0045 -51.9621 -0.343661 +VERTEX2 2721 -20.3006 -52.8663 -1.90866 +VERTEX2 2722 -20.6225 -53.8257 -1.9222 +VERTEX2 2723 -20.8982 -54.7618 -1.8961 +VERTEX2 2724 -21.1873 -55.6086 -1.86639 +VERTEX2 2725 -21.472 -56.4822 -1.86321 +VERTEX2 2726 -20.4905 -56.8745 -0.302995 +VERTEX2 2727 -19.5742 -57.1757 -0.294271 +VERTEX2 2728 -18.6411 -57.5033 -0.287681 +VERTEX2 2729 -17.6628 -57.685 -0.321528 +VERTEX2 2730 -16.6583 -58.1409 -0.317124 +VERTEX2 2731 -16.2938 -57.1446 1.23961 +VERTEX2 2732 -15.9701 -56.1873 1.25709 +VERTEX2 2733 -15.6853 -55.2065 1.27766 +VERTEX2 2734 -15.33 -54.3545 1.22795 +VERTEX2 2735 -15.0398 -53.3882 1.22483 +VERTEX2 2736 -16.0365 -53.0406 2.80397 +VERTEX2 2737 -17.0013 -52.6643 2.78287 +VERTEX2 2738 -17.9536 -52.2645 2.78344 +VERTEX2 2739 -18.8781 -51.8587 2.76804 +VERTEX2 2740 -19.7991 -51.5307 2.73988 +VERTEX2 2741 -19.4603 -50.5494 1.20325 +VERTEX2 2742 -19.1216 -49.644 1.2083 +VERTEX2 2743 -18.7745 -48.7045 1.1964 +VERTEX2 2744 -18.4268 -47.6655 1.18606 +VERTEX2 2745 -18.0506 -46.6832 1.15879 +VERTEX2 2746 -17.167 -47.0991 -0.413825 +VERTEX2 2747 -16.2117 -47.5408 -0.396105 +VERTEX2 2748 -15.3021 -47.9956 -0.356049 +VERTEX2 2749 -14.3924 -48.3484 -0.388069 +VERTEX2 2750 -13.445 -48.6694 -0.377877 +VERTEX2 2751 -13.0307 -47.6515 1.21848 +VERTEX2 2752 -12.7047 -46.7542 1.21813 +VERTEX2 2753 -12.3148 -45.7457 1.2197 +VERTEX2 2754 -11.8852 -44.81 1.21972 +VERTEX2 2755 -11.5049 -43.8524 1.20932 +VERTEX2 2756 -12.3426 -43.5119 2.75327 +VERTEX2 2757 -13.3058 -43.1812 2.72148 +VERTEX2 2758 -14.1969 -42.738 2.71583 +VERTEX2 2759 -15.0525 -42.3579 2.69824 +VERTEX2 2760 -15.8249 -41.9627 2.68529 +VERTEX2 2761 -15.3919 -40.9845 1.11909 +VERTEX2 2762 -14.9419 -40.0517 1.12024 +VERTEX2 2763 -14.5139 -39.1142 1.11826 +VERTEX2 2764 -14.1066 -38.1923 1.13843 +VERTEX2 2765 -13.6643 -37.2608 1.15693 +VERTEX2 2766 -14.6502 -36.8331 2.69319 +VERTEX2 2767 -15.5288 -36.3611 2.70272 +VERTEX2 2768 -16.5283 -35.9277 2.7235 +VERTEX2 2769 -17.5553 -35.4737 2.68674 +VERTEX2 2770 -18.4509 -35.0542 2.65867 +VERTEX2 2771 -18.9758 -36.0164 -2.07243 +VERTEX2 2772 -19.4256 -36.9606 -2.05742 +VERTEX2 2773 -19.9622 -37.8479 -2.04533 +VERTEX2 2774 -20.4422 -38.7586 -2.04936 +VERTEX2 2775 -20.8487 -39.5947 -2.01794 +VERTEX2 2776 -19.8941 -40.0543 -0.44766 +VERTEX2 2777 -18.9525 -40.6139 -0.48371 +VERTEX2 2778 -18.1232 -41.0985 -0.490695 +VERTEX2 2779 -17.273 -41.6595 -0.502014 +VERTEX2 2780 -16.3951 -42.1209 -0.503078 +VERTEX2 2781 -15.942 -41.2803 1.08697 +VERTEX2 2782 -15.4405 -40.3834 1.09071 +VERTEX2 2783 -14.9173 -39.431 1.11059 +VERTEX2 2784 -14.4195 -38.5663 1.12837 +VERTEX2 2785 -14.0537 -37.6721 1.14486 +VERTEX2 2786 -13.2197 -38.0277 -0.431162 +VERTEX2 2787 -12.2501 -38.3429 -0.413892 +VERTEX2 2788 -11.3425 -38.7468 -0.399285 +VERTEX2 2789 -10.3831 -39.1453 -0.405403 +VERTEX2 2790 -9.47242 -39.5279 -0.408892 +VERTEX2 2791 -9.00384 -38.5621 1.12635 +VERTEX2 2792 -8.55766 -37.5854 1.11233 +VERTEX2 2793 -8.19206 -36.6531 1.12757 +VERTEX2 2794 -7.84855 -35.7634 1.12001 +VERTEX2 2795 -7.36983 -34.9048 1.12414 +VERTEX2 2796 -8.19268 -34.51 2.647 +VERTEX2 2797 -9.01833 -34.0265 2.62912 +VERTEX2 2798 -9.89652 -33.5341 2.593 +VERTEX2 2799 -10.7056 -33.0901 2.59153 +VERTEX2 2800 -11.6006 -32.5646 2.61292 +VERTEX2 2801 -12.1325 -33.4021 -2.08799 +VERTEX2 2802 -12.6975 -34.2679 -2.10236 +VERTEX2 2803 -13.2602 -35.1766 -2.09351 +VERTEX2 2804 -13.7975 -36.0526 -2.10839 +VERTEX2 2805 -14.3218 -36.9233 -2.1258 +VERTEX2 2806 -13.4483 -37.4872 -0.54242 +VERTEX2 2807 -12.5686 -38.0181 -0.547472 +VERTEX2 2808 -11.6836 -38.5052 -0.517194 +VERTEX2 2809 -10.7981 -39.1133 -0.49285 +VERTEX2 2810 -9.96589 -39.7 -0.485632 +VERTEX2 2811 -9.46133 -38.7988 1.08424 +VERTEX2 2812 -8.98675 -37.9395 1.10024 +VERTEX2 2813 -8.51415 -37.0579 1.13235 +VERTEX2 2814 -8.0854 -36.1765 1.12997 +VERTEX2 2815 -7.63846 -35.2818 1.06993 +VERTEX2 2816 -8.51232 -34.8418 2.58461 +VERTEX2 2817 -9.33375 -34.3041 2.59928 +VERTEX2 2818 -10.1841 -33.8515 2.61685 +VERTEX2 2819 -11.0461 -33.3913 2.61353 +VERTEX2 2820 -11.8786 -32.879 2.6209 +VERTEX2 2821 -11.3704 -31.9603 1.04345 +VERTEX2 2822 -10.8405 -31.0632 1.0718 +VERTEX2 2823 -10.3001 -30.1553 1.05044 +VERTEX2 2824 -9.87264 -29.2969 1.04452 +VERTEX2 2825 -9.32978 -28.3496 1.07696 +VERTEX2 2826 -10.3087 -27.8687 2.63978 +VERTEX2 2827 -11.2607 -27.4008 2.60738 +VERTEX2 2828 -12.1828 -26.8459 2.60036 +VERTEX2 2829 -13.0717 -26.3102 2.58649 +VERTEX2 2830 -13.8965 -25.8033 2.56936 +VERTEX2 2831 -14.4396 -26.6634 -2.10133 +VERTEX2 2832 -14.927 -27.52 -2.07808 +VERTEX2 2833 -15.4598 -28.3386 -2.09913 +VERTEX2 2834 -15.9532 -29.2309 -2.08913 +VERTEX2 2835 -16.4207 -30.1693 -2.08939 +VERTEX2 2836 -15.6017 -30.694 -0.547913 +VERTEX2 2837 -14.7882 -31.247 -0.547135 +VERTEX2 2838 -13.8276 -31.6968 -0.548037 +VERTEX2 2839 -12.9855 -32.2829 -0.539558 +VERTEX2 2840 -12.0891 -32.7565 -0.543648 +VERTEX2 2841 -12.5504 -33.6681 -2.10692 +VERTEX2 2842 -13.0603 -34.5298 -2.14022 +VERTEX2 2843 -13.6356 -35.4267 -2.15085 +VERTEX2 2844 -14.1828 -36.2071 -2.12461 +VERTEX2 2845 -14.6023 -37.0382 -2.14033 +VERTEX2 2846 -15.4404 -36.4183 2.5603 +VERTEX2 2847 -16.2035 -35.8765 2.59562 +VERTEX2 2848 -17.0783 -35.3311 2.62218 +VERTEX2 2849 -17.9036 -34.9216 2.62009 +VERTEX2 2850 -18.6716 -34.4158 2.64902 +VERTEX2 2851 -19.2373 -35.3173 -2.05159 +VERTEX2 2852 -19.7629 -36.1834 -2.07561 +VERTEX2 2853 -20.295 -37.0219 -2.08729 +VERTEX2 2854 -20.7719 -37.8428 -2.1076 +VERTEX2 2855 -21.2972 -38.7807 -2.10346 +VERTEX2 2856 -20.4316 -39.3212 -0.563636 +VERTEX2 2857 -19.6121 -39.8162 -0.590462 +VERTEX2 2858 -18.7547 -40.4003 -0.583574 +VERTEX2 2859 -17.9243 -40.9735 -0.549948 +VERTEX2 2860 -16.9402 -41.3892 -0.561515 +VERTEX2 2861 -17.4505 -42.2829 -2.09646 +VERTEX2 2862 -17.9621 -43.112 -2.08566 +VERTEX2 2863 -18.526 -44.0735 -2.09503 +VERTEX2 2864 -19.0736 -45.0047 -2.08363 +VERTEX2 2865 -19.5933 -45.8919 -2.10339 +VERTEX2 2866 -18.7058 -46.294 -0.560232 +VERTEX2 2867 -17.7671 -46.7814 -0.555401 +VERTEX2 2868 -16.976 -47.3055 -0.600293 +VERTEX2 2869 -16.2088 -47.8898 -0.596974 +VERTEX2 2870 -15.3713 -48.4501 -0.589764 +VERTEX2 2871 -14.8726 -47.5898 0.971941 +VERTEX2 2872 -14.2755 -46.8279 0.981412 +VERTEX2 2873 -13.7507 -46.1151 1.0109 +VERTEX2 2874 -13.2589 -45.3608 1.00549 +VERTEX2 2875 -12.7714 -44.437 1.00782 +VERTEX2 2876 -13.5987 -43.8573 2.57402 +VERTEX2 2877 -14.4272 -43.3102 2.59091 +VERTEX2 2878 -15.1792 -42.8382 2.60641 +VERTEX2 2879 -16.037 -42.3699 2.60057 +VERTEX2 2880 -16.9673 -41.818 2.62547 +VERTEX2 2881 -17.4771 -42.6754 -2.07564 +VERTEX2 2882 -17.9132 -43.5648 -2.08394 +VERTEX2 2883 -18.3798 -44.3486 -2.09708 +VERTEX2 2884 -18.9139 -45.1395 -2.08617 +VERTEX2 2885 -19.3338 -46.0442 -2.11983 +VERTEX2 2886 -18.3099 -46.5148 -0.579694 +VERTEX2 2887 -17.5143 -47.0774 -0.580585 +VERTEX2 2888 -16.6376 -47.6341 -0.571391 +VERTEX2 2889 -15.8098 -48.179 -0.542218 +VERTEX2 2890 -14.9257 -48.6465 -0.524414 +VERTEX2 2891 -15.4518 -49.5229 -2.10206 +VERTEX2 2892 -15.9513 -50.4021 -2.10846 +VERTEX2 2893 -16.5156 -51.2364 -2.07595 +VERTEX2 2894 -17.0032 -52.0913 -2.0482 +VERTEX2 2895 -17.4216 -52.9832 -2.01853 +VERTEX2 2896 -16.4599 -53.3903 -0.464055 +VERTEX2 2897 -15.6257 -53.8473 -0.500543 +VERTEX2 2898 -14.8067 -54.4 -0.457741 +VERTEX2 2899 -13.8106 -54.8992 -0.447225 +VERTEX2 2900 -12.8767 -55.4054 -0.45621 +VERTEX2 2901 -12.4499 -54.4975 1.13101 +VERTEX2 2902 -12.0409 -53.5444 1.14 +VERTEX2 2903 -11.5313 -52.6763 1.11054 +VERTEX2 2904 -11.0504 -51.7974 1.1103 +VERTEX2 2905 -10.6138 -50.9608 1.15274 +VERTEX2 2906 -9.67524 -51.3668 -0.407568 +VERTEX2 2907 -8.82028 -51.8208 -0.435599 +VERTEX2 2908 -7.93593 -52.2294 -0.467912 +VERTEX2 2909 -7.01943 -52.6859 -0.475681 +VERTEX2 2910 -6.18984 -53.0876 -0.497638 +VERTEX2 2911 -5.76569 -52.1687 1.12654 +VERTEX2 2912 -5.38265 -51.3065 1.11279 +VERTEX2 2913 -4.9448 -50.4061 1.07604 +VERTEX2 2914 -4.48191 -49.5403 1.06928 +VERTEX2 2915 -3.93707 -48.6624 1.06929 +VERTEX2 2916 -4.78151 -48.2852 2.6308 +VERTEX2 2917 -5.56239 -47.7985 2.65777 +VERTEX2 2918 -6.50971 -47.3409 2.64266 +VERTEX2 2919 -7.40246 -46.9535 2.64894 +VERTEX2 2920 -8.29168 -46.4751 2.64919 +VERTEX2 2921 -8.7822 -47.3049 -2.08451 +VERTEX2 2922 -9.35829 -48.1045 -2.0851 +VERTEX2 2923 -9.82392 -48.9884 -2.099 +VERTEX2 2924 -10.3061 -49.7909 -2.0727 +VERTEX2 2925 -10.7881 -50.7096 -2.06642 +VERTEX2 2926 -11.615 -50.1368 2.63086 +VERTEX2 2927 -12.5119 -49.6317 2.61999 +VERTEX2 2928 -13.3992 -49.0904 2.61763 +VERTEX2 2929 -14.2755 -48.5216 2.59164 +VERTEX2 2930 -15.1581 -47.9799 2.57516 +VERTEX2 2931 -15.57 -48.7904 -2.1603 +VERTEX2 2932 -16.123 -49.566 -2.17813 +VERTEX2 2933 -16.7234 -50.3688 -2.18366 +VERTEX2 2934 -17.3287 -51.1357 -2.18991 +VERTEX2 2935 -17.9015 -51.9854 -2.21984 +VERTEX2 2936 -17.1286 -52.6775 -0.648309 +VERTEX2 2937 -16.2315 -53.3151 -0.626341 +VERTEX2 2938 -15.4279 -53.9321 -0.613473 +VERTEX2 2939 -14.5283 -54.4835 -0.633401 +VERTEX2 2940 -13.6371 -55.0509 -0.613156 +VERTEX2 2941 -13.1444 -54.2499 0.950969 +VERTEX2 2942 -12.502 -53.4135 0.947186 +VERTEX2 2943 -11.836 -52.6034 0.936511 +VERTEX2 2944 -11.1493 -51.789 0.892796 +VERTEX2 2945 -10.5661 -51.1869 0.886057 +VERTEX2 2946 -11.3536 -50.4927 2.46297 +VERTEX2 2947 -12.1024 -49.8785 2.46994 +VERTEX2 2948 -12.9769 -49.2409 2.47783 +VERTEX2 2949 -13.8254 -48.6827 2.47727 +VERTEX2 2950 -14.6011 -48.116 2.4882 +VERTEX2 2951 -13.8918 -47.3925 0.916217 +VERTEX2 2952 -13.3599 -46.5148 0.896132 +VERTEX2 2953 -12.7069 -45.7356 0.91466 +VERTEX2 2954 -12.0618 -44.9053 0.914272 +VERTEX2 2955 -11.4972 -44.0934 0.927937 +VERTEX2 2956 -12.2314 -43.4843 2.49062 +VERTEX2 2957 -12.9299 -42.9327 2.47768 +VERTEX2 2958 -13.7813 -42.2914 2.44872 +VERTEX2 2959 -14.5551 -41.6801 2.45589 +VERTEX2 2960 -15.3189 -41.1437 2.45425 +VERTEX2 2961 -15.8891 -41.8977 -2.2934 +VERTEX2 2962 -16.509 -42.6174 -2.30341 +VERTEX2 2963 -17.1698 -43.4099 -2.29876 +VERTEX2 2964 -17.8296 -44.1723 -2.29126 +VERTEX2 2965 -18.5023 -44.9691 -2.27897 +VERTEX2 2966 -19.2733 -44.3108 2.45186 +VERTEX2 2967 -20.0994 -43.5932 2.44675 +VERTEX2 2968 -20.9418 -42.9371 2.41812 +VERTEX2 2969 -21.6409 -42.3125 2.41158 +VERTEX2 2970 -22.3726 -41.68 2.39635 +VERTEX2 2971 -21.8044 -40.9145 0.818375 +VERTEX2 2972 -21.1529 -40.1643 0.801654 +VERTEX2 2973 -20.3897 -39.4411 0.763369 +VERTEX2 2974 -19.6448 -38.6641 0.74845 +VERTEX2 2975 -18.8929 -37.9462 0.755358 +VERTEX2 2976 -19.5809 -37.1468 2.33072 +VERTEX2 2977 -20.3402 -36.4783 2.35982 +VERTEX2 2978 -21.069 -35.7544 2.33622 +VERTEX2 2979 -21.6935 -34.9637 2.32539 +VERTEX2 2980 -22.3082 -34.1754 2.32529 +VERTEX2 2981 -21.5618 -33.5843 0.740005 +VERTEX2 2982 -20.7859 -32.9032 0.736726 +VERTEX2 2983 -20.0365 -32.1847 0.716998 +VERTEX2 2984 -19.2582 -31.5418 0.717721 +VERTEX2 2985 -18.5055 -30.9612 0.740479 +VERTEX2 2986 -19.0947 -30.1827 2.30833 +VERTEX2 2987 -19.7557 -29.547 2.31076 +VERTEX2 2988 -20.356 -28.8128 2.29521 +VERTEX2 2989 -20.9934 -28.1337 2.28454 +VERTEX2 2990 -21.6472 -27.4156 2.26719 +VERTEX2 2991 -22.3561 -28.0443 -2.39666 +VERTEX2 2992 -23.092 -28.7186 -2.42085 +VERTEX2 2993 -23.8699 -29.3098 -2.4349 +VERTEX2 2994 -24.6479 -29.9718 -2.43987 +VERTEX2 2995 -25.3535 -30.63 -2.44865 +VERTEX2 2996 -24.7219 -31.4043 -0.865583 +VERTEX2 2997 -24.1074 -32.1396 -0.818497 +VERTEX2 2998 -23.4882 -32.9184 -0.82693 +VERTEX2 2999 -22.8453 -33.6667 -0.802909 +VERTEX2 3000 -22.0588 -34.4285 -0.780887 +VERTEX2 3001 -22.8692 -35.0764 -2.35161 +VERTEX2 3002 -23.6305 -35.7631 -2.34271 +VERTEX2 3003 -24.3 -36.4938 -2.29908 +VERTEX2 3004 -25.048 -37.2423 -2.31012 +VERTEX2 3005 -25.7236 -38.069 -2.32393 +VERTEX2 3006 -24.9533 -38.7115 -0.784098 +VERTEX2 3007 -24.2847 -39.4937 -0.750434 +VERTEX2 3008 -23.5825 -40.2378 -0.766631 +VERTEX2 3009 -22.8395 -40.957 -0.759088 +VERTEX2 3010 -22.0231 -41.5906 -0.793118 +VERTEX2 3011 -22.8199 -42.2844 -2.39466 +VERTEX2 3012 -23.5841 -42.9609 -2.40444 +VERTEX2 3013 -24.3151 -43.6012 -2.41025 +VERTEX2 3014 -25.0562 -44.1497 -2.41625 +VERTEX2 3015 -25.7728 -44.775 -2.42222 +VERTEX2 3016 -26.5017 -44.1103 2.31559 +VERTEX2 3017 -27.1492 -43.3612 2.32182 +VERTEX2 3018 -27.917 -42.6186 2.22664 +VERTEX2 3019 -28.6179 -41.7215 2.21911 +VERTEX2 3020 -29.2598 -40.9673 2.21657 +VERTEX2 3021 -30.0509 -41.6163 -2.51534 +VERTEX2 3022 -30.9178 -42.172 -2.55063 +VERTEX2 3023 -31.7269 -42.8365 -2.53303 +VERTEX2 3024 -32.5272 -43.5409 -2.5481 +VERTEX2 3025 -33.2919 -44.131 -2.55268 +VERTEX2 3026 -33.8597 -43.2816 2.16897 +VERTEX2 3027 -34.4778 -42.464 2.17806 +VERTEX2 3028 -35.1008 -41.6205 2.17464 +VERTEX2 3029 -35.6483 -40.7593 2.20449 +VERTEX2 3030 -36.3133 -39.927 2.22323 +VERTEX2 3031 -37.0836 -40.5492 -2.50432 +VERTEX2 3032 -37.8472 -41.0856 -2.49308 +VERTEX2 3033 -38.633 -41.6634 -2.47639 +VERTEX2 3034 -39.3572 -42.2777 -2.48224 +VERTEX2 3035 -40.1965 -42.8762 -2.463 +VERTEX2 3036 -39.4713 -43.6648 -0.900686 +VERTEX2 3037 -38.8841 -44.451 -0.919767 +VERTEX2 3038 -38.2929 -45.2029 -0.906573 +VERTEX2 3039 -37.4998 -46.0215 -0.909308 +VERTEX2 3040 -36.9126 -46.8608 -0.92324 +VERTEX2 3041 -36.0822 -46.3066 0.615279 +VERTEX2 3042 -35.3291 -45.7347 0.6259 +VERTEX2 3043 -34.5502 -45.2153 0.596301 +VERTEX2 3044 -33.7418 -44.7395 0.587871 +VERTEX2 3045 -32.9105 -44.1913 0.59495 +VERTEX2 3046 -33.4942 -43.398 2.13865 +VERTEX2 3047 -34.062 -42.5567 2.13146 +VERTEX2 3048 -34.6029 -41.7075 2.11685 +VERTEX2 3049 -35.1098 -40.8901 2.10202 +VERTEX2 3050 -35.6059 -39.9908 2.08872 +VERTEX2 3051 -36.5208 -40.5492 -2.60385 +VERTEX2 3052 -37.4022 -41.0575 -2.61552 +VERTEX2 3053 -38.2836 -41.5095 -2.61255 +VERTEX2 3054 -39.14 -41.9884 -2.60291 +VERTEX2 3055 -40.06 -42.464 -2.58753 +VERTEX2 3056 -40.6184 -41.5739 2.14611 +VERTEX2 3057 -41.1297 -40.6519 2.12424 +VERTEX2 3058 -41.6578 -39.8365 2.12804 +VERTEX2 3059 -42.1498 -39.1148 2.10892 +VERTEX2 3060 -42.6602 -38.2722 2.12632 +VERTEX2 3061 -41.7885 -37.7348 0.56346 +VERTEX2 3062 -41.0222 -37.1912 0.546774 +VERTEX2 3063 -40.1803 -36.7134 0.538004 +VERTEX2 3064 -39.251 -36.1502 0.547315 +VERTEX2 3065 -38.3826 -35.6443 0.538066 +VERTEX2 3066 -38.819 -34.918 2.13981 +VERTEX2 3067 -39.3469 -34.0315 2.14865 +VERTEX2 3068 -39.9409 -33.1405 2.15203 +VERTEX2 3069 -40.4856 -32.2196 2.16017 +VERTEX2 3070 -41.0148 -31.452 2.15055 +VERTEX2 3071 -41.888 -31.9782 -2.55482 +VERTEX2 3072 -42.7751 -32.5084 -2.54844 +VERTEX2 3073 -43.5742 -33.0178 -2.54241 +VERTEX2 3074 -44.3311 -33.5593 -2.5243 +VERTEX2 3075 -45.1031 -34.1968 -2.51756 +VERTEX2 3076 -44.5376 -35.0396 -0.91238 +VERTEX2 3077 -44.0082 -35.7736 -0.935902 +VERTEX2 3078 -43.3909 -36.5504 -0.963174 +VERTEX2 3079 -42.7627 -37.4391 -0.953475 +VERTEX2 3080 -42.137 -38.2343 -0.948785 +VERTEX2 3081 -41.2774 -37.6348 0.636727 +VERTEX2 3082 -40.4316 -37.0324 0.627797 +VERTEX2 3083 -39.6821 -36.3832 0.637235 +VERTEX2 3084 -38.8724 -35.7136 0.632375 +VERTEX2 3085 -38.0913 -35.0979 0.618928 +VERTEX2 3086 -37.5273 -35.9416 -0.948382 +VERTEX2 3087 -36.9238 -36.7913 -0.972878 +VERTEX2 3088 -36.3786 -37.6533 -0.948408 +VERTEX2 3089 -35.8456 -38.5087 -0.956107 +VERTEX2 3090 -35.2872 -39.3517 -0.966738 +VERTEX2 3091 -34.3769 -38.7069 0.623481 +VERTEX2 3092 -33.5119 -38.0102 0.627482 +VERTEX2 3093 -32.6671 -37.4857 0.62422 +VERTEX2 3094 -31.8998 -36.9107 0.605798 +VERTEX2 3095 -31.1601 -36.362 0.609098 +VERTEX2 3096 -31.7607 -35.5335 2.20613 +VERTEX2 3097 -32.3727 -34.7732 2.18114 +VERTEX2 3098 -32.9353 -34.0377 2.14911 +VERTEX2 3099 -33.408 -33.2104 2.15881 +VERTEX2 3100 -34.0367 -32.3543 2.16281 +VERTEX2 3101 -34.8425 -32.8817 -2.56332 +VERTEX2 3102 -35.8069 -33.3701 -2.57927 +VERTEX2 3103 -36.6654 -33.851 -2.57985 +VERTEX2 3104 -37.4283 -34.376 -2.579 +VERTEX2 3105 -38.3799 -35.025 -2.6173 +VERTEX2 3106 -37.9263 -35.9395 -1.07337 +VERTEX2 3107 -37.4415 -36.8088 -1.04993 +VERTEX2 3108 -36.9927 -37.6488 -1.02898 +VERTEX2 3109 -36.4496 -38.5393 -0.998291 +VERTEX2 3110 -35.8209 -39.3731 -0.979385 +VERTEX2 3111 -34.9817 -38.7452 0.633569 +VERTEX2 3112 -34.1258 -38.1803 0.638656 +VERTEX2 3113 -33.3473 -37.5713 0.609397 +VERTEX2 3114 -32.5973 -36.9879 0.616801 +VERTEX2 3115 -31.7884 -36.4205 0.600285 +VERTEX2 3116 -32.3061 -35.595 2.15014 +VERTEX2 3117 -32.7246 -34.7489 2.15388 +VERTEX2 3118 -33.2944 -33.8911 2.16313 +VERTEX2 3119 -33.9245 -33.065 2.17388 +VERTEX2 3120 -34.5004 -32.1955 2.21501 +VERTEX2 3121 -35.3227 -32.8342 -2.55308 +VERTEX2 3122 -36.1921 -33.4151 -2.53031 +VERTEX2 3123 -37.0183 -33.8957 -2.52599 +VERTEX2 3124 -37.862 -34.4259 -2.56594 +VERTEX2 3125 -38.6841 -34.8363 -2.55967 +VERTEX2 3126 -38.1431 -35.6342 -0.974434 +VERTEX2 3127 -37.5806 -36.4239 -0.953324 +VERTEX2 3128 -36.9774 -37.2735 -0.951489 +VERTEX2 3129 -36.4612 -37.9916 -0.923694 +VERTEX2 3130 -35.8563 -38.7838 -0.906454 +VERTEX2 3131 -35.1071 -38.1398 0.676924 +VERTEX2 3132 -34.3528 -37.535 0.647965 +VERTEX2 3133 -33.5758 -36.8596 0.638478 +VERTEX2 3134 -32.8081 -36.3184 0.645615 +VERTEX2 3135 -31.9729 -35.784 0.646626 +VERTEX2 3136 -32.6012 -35.0075 2.22424 +VERTEX2 3137 -33.2163 -34.1776 2.19726 +VERTEX2 3138 -33.8343 -33.3073 2.23088 +VERTEX2 3139 -34.5068 -32.5803 2.21074 +VERTEX2 3140 -35.0617 -31.8393 2.19529 +VERTEX2 3141 -35.8239 -32.4935 -2.50763 +VERTEX2 3142 -36.6172 -33.0881 -2.51121 +VERTEX2 3143 -37.4694 -33.7423 -2.49767 +VERTEX2 3144 -38.3593 -34.397 -2.49967 +VERTEX2 3145 -39.13 -34.9852 -2.49403 +VERTEX2 3146 -39.7525 -34.2347 2.22456 +VERTEX2 3147 -40.3202 -33.3507 2.23639 +VERTEX2 3148 -40.9386 -32.4925 2.22582 +VERTEX2 3149 -41.492 -31.6676 2.2397 +VERTEX2 3150 -42.107 -30.873 2.23323 +VERTEX2 3151 -42.9631 -31.5054 -2.47453 +VERTEX2 3152 -43.7568 -32.1241 -2.44627 +VERTEX2 3153 -44.5098 -32.6537 -2.4234 +VERTEX2 3154 -45.2223 -33.3121 -2.40659 +VERTEX2 3155 -45.9711 -33.9434 -2.4194 +VERTEX2 3156 -45.3296 -34.7285 -0.848681 +VERTEX2 3157 -44.6314 -35.4763 -0.84216 +VERTEX2 3158 -43.9605 -36.1745 -0.853905 +VERTEX2 3159 -43.3439 -36.8749 -0.84289 +VERTEX2 3160 -42.6056 -37.6794 -0.860842 +VERTEX2 3161 -41.8723 -37.1105 0.745135 +VERTEX2 3162 -41.1261 -36.3679 0.764883 +VERTEX2 3163 -40.4175 -35.6774 0.773105 +VERTEX2 3164 -39.6093 -34.9596 0.75295 +VERTEX2 3165 -38.9105 -34.2061 0.742011 +VERTEX2 3166 -38.2741 -34.9727 -0.845552 +VERTEX2 3167 -37.6231 -35.7488 -0.836643 +VERTEX2 3168 -36.9722 -36.5054 -0.848792 +VERTEX2 3169 -36.3407 -37.2956 -0.858397 +VERTEX2 3170 -35.6733 -38.1023 -0.881387 +VERTEX2 3171 -34.871 -37.4155 0.704852 +VERTEX2 3172 -34.0989 -36.7587 0.697499 +VERTEX2 3173 -33.2613 -36.1041 0.675136 +VERTEX2 3174 -32.4305 -35.5358 0.677451 +VERTEX2 3175 -31.648 -34.9173 0.678384 +VERTEX2 3176 -31.0653 -35.7046 -0.924754 +VERTEX2 3177 -30.4709 -36.4325 -0.93365 +VERTEX2 3178 -29.8986 -37.2862 -0.916638 +VERTEX2 3179 -29.2741 -37.9844 -0.8902 +VERTEX2 3180 -28.616 -38.7911 -0.92877 +VERTEX2 3181 -27.8933 -38.1852 0.660684 +VERTEX2 3182 -27.1459 -37.583 0.645166 +VERTEX2 3183 -26.2806 -37.0629 0.668061 +VERTEX2 3184 -25.5026 -36.4162 0.670448 +VERTEX2 3185 -24.763 -35.7238 0.656008 +VERTEX2 3186 -25.2656 -34.908 2.22413 +VERTEX2 3187 -25.8578 -34.1087 2.2577 +VERTEX2 3188 -26.4487 -33.2878 2.26341 +VERTEX2 3189 -27.1252 -32.4845 2.25624 +VERTEX2 3190 -27.8172 -31.8087 2.24745 +VERTEX2 3191 -27.0598 -31.2289 0.658198 +VERTEX2 3192 -26.2987 -30.5701 0.621981 +VERTEX2 3193 -25.4837 -29.8815 0.679671 +VERTEX2 3194 -24.6765 -29.2899 0.712244 +VERTEX2 3195 -23.968 -28.6296 0.729297 +VERTEX2 3196 -24.7104 -27.9969 2.31263 +VERTEX2 3197 -25.3597 -27.2955 2.32108 +VERTEX2 3198 -26.0435 -26.5913 2.36615 +VERTEX2 3199 -26.7149 -25.9001 2.35993 +VERTEX2 3200 -27.4784 -25.2331 2.39516 +VERTEX2 3201 -28.1657 -25.995 -2.30351 +VERTEX2 3202 -28.9521 -26.7799 -2.35827 +VERTEX2 3203 -29.6467 -27.4882 -2.33904 +VERTEX2 3204 -30.3537 -28.1969 -2.33993 +VERTEX2 3205 -31.034 -28.9224 -2.3029 +VERTEX2 3206 -30.2792 -29.6108 -0.698967 +VERTEX2 3207 -29.5514 -30.2953 -0.677585 +VERTEX2 3208 -28.7559 -30.8549 -0.691351 +VERTEX2 3209 -28.0415 -31.4511 -0.69625 +VERTEX2 3210 -27.2789 -32.079 -0.71834 +VERTEX2 3211 -26.6234 -31.3791 0.85186 +VERTEX2 3212 -25.9102 -30.5869 0.868106 +VERTEX2 3213 -25.1811 -29.8467 0.859066 +VERTEX2 3214 -24.522 -29.0614 0.862275 +VERTEX2 3215 -23.8712 -28.3237 0.879383 +VERTEX2 3216 -24.6723 -27.6734 2.44498 +VERTEX2 3217 -25.4047 -26.9811 2.4132 +VERTEX2 3218 -26.1628 -26.2334 2.42133 +VERTEX2 3219 -26.8679 -25.5364 2.40751 +VERTEX2 3220 -27.5789 -24.8061 2.42346 +VERTEX2 3221 -28.2725 -25.5299 -2.24888 +VERTEX2 3222 -28.8571 -26.2757 -2.25986 +VERTEX2 3223 -29.4991 -27.0055 -2.23933 +VERTEX2 3224 -30.0706 -27.8171 -2.25229 +VERTEX2 3225 -30.749 -28.4689 -2.23464 +VERTEX2 3226 -29.9379 -29.1417 -0.683048 +VERTEX2 3227 -29.2097 -29.8001 -0.678036 +VERTEX2 3228 -28.4744 -30.3664 -0.693831 +VERTEX2 3229 -27.651 -31.0986 -0.677988 +VERTEX2 3230 -26.8578 -31.6696 -0.700298 +VERTEX2 3231 -26.1934 -30.9214 0.861185 +VERTEX2 3232 -25.5637 -30.1687 0.861242 +VERTEX2 3233 -24.8682 -29.5003 0.838461 +VERTEX2 3234 -24.1659 -28.7436 0.854245 +VERTEX2 3235 -23.5014 -27.9966 0.838183 +VERTEX2 3236 -22.7307 -28.6127 -0.765355 +VERTEX2 3237 -22.0013 -29.2093 -0.763768 +VERTEX2 3238 -21.2957 -30.0023 -0.761024 +VERTEX2 3239 -20.5967 -30.6715 -0.755088 +VERTEX2 3240 -19.8717 -31.3132 -0.747084 +VERTEX2 3241 -19.3035 -30.4984 0.775386 +VERTEX2 3242 -18.4877 -29.7705 0.739188 +VERTEX2 3243 -17.7817 -29.1477 0.755286 +VERTEX2 3244 -17.0542 -28.4756 0.751336 +VERTEX2 3245 -16.2692 -27.7731 0.762471 +VERTEX2 3246 -16.9636 -27.1113 2.32367 +VERTEX2 3247 -17.6283 -26.38 2.32584 +VERTEX2 3248 -18.3534 -25.633 2.34384 +VERTEX2 3249 -19.0794 -24.9021 2.32761 +VERTEX2 3250 -19.7731 -24.144 2.33675 +VERTEX2 3251 -20.5401 -24.7472 -2.3603 +VERTEX2 3252 -21.1354 -25.4428 -2.37927 +VERTEX2 3253 -22.0075 -26.1437 -2.38545 +VERTEX2 3254 -22.77 -26.8794 -2.40122 +VERTEX2 3255 -23.5213 -27.5646 -2.40551 +VERTEX2 3256 -22.8458 -28.3092 -0.81064 +VERTEX2 3257 -22.1409 -29.0258 -0.836625 +VERTEX2 3258 -21.4925 -29.7232 -0.799573 +VERTEX2 3259 -20.7924 -30.4844 -0.808 +VERTEX2 3260 -20.1387 -31.2898 -0.849119 +VERTEX2 3261 -20.827 -31.921 -2.42816 +VERTEX2 3262 -21.6286 -32.5595 -2.44259 +VERTEX2 3263 -22.2721 -33.1882 -2.46923 +VERTEX2 3264 -23.0623 -33.7822 -2.48135 +VERTEX2 3265 -23.8832 -34.4115 -2.5193 +VERTEX2 3266 -23.3558 -35.17 -0.968726 +VERTEX2 3267 -22.8026 -35.9866 -0.963983 +VERTEX2 3268 -22.2324 -36.8648 -0.909305 +VERTEX2 3269 -21.6172 -37.6045 -0.898894 +VERTEX2 3270 -20.9601 -38.3168 -0.906137 +VERTEX2 3271 -20.2343 -37.7023 0.664923 +VERTEX2 3272 -19.4414 -37.0826 0.69231 +VERTEX2 3273 -18.646 -36.4788 0.707477 +VERTEX2 3274 -17.8809 -35.8093 0.705924 +VERTEX2 3275 -17.0956 -35.1496 0.705123 +VERTEX2 3276 -17.7399 -34.36 2.28304 +VERTEX2 3277 -18.3623 -33.6433 2.2846 +VERTEX2 3278 -19.0419 -32.9342 2.28016 +VERTEX2 3279 -19.743 -32.1681 2.29648 +VERTEX2 3280 -20.4533 -31.3391 2.31 +VERTEX2 3281 -21.2096 -32.0738 -2.40781 +VERTEX2 3282 -21.9788 -32.7615 -2.41174 +VERTEX2 3283 -22.6766 -33.4501 -2.40066 +VERTEX2 3284 -23.4049 -34.1549 -2.40602 +VERTEX2 3285 -24.2045 -34.7762 -2.365 +VERTEX2 3286 -23.5159 -35.5748 -0.749741 +VERTEX2 3287 -22.7611 -36.2541 -0.755739 +VERTEX2 3288 -22.1086 -36.9365 -0.799153 +VERTEX2 3289 -21.4456 -37.6161 -0.795331 +VERTEX2 3290 -20.7344 -38.2697 -0.819607 +VERTEX2 3291 -20.035 -37.5421 0.722556 +VERTEX2 3292 -19.3153 -36.862 0.700014 +VERTEX2 3293 -18.4336 -36.239 0.707114 +VERTEX2 3294 -17.7482 -35.5887 0.692952 +VERTEX2 3295 -16.9208 -34.9598 0.688099 +VERTEX2 3296 -17.497 -34.1771 2.26955 +VERTEX2 3297 -18.1681 -33.4124 2.26564 +VERTEX2 3298 -18.873 -32.5927 2.25174 +VERTEX2 3299 -19.4539 -31.8683 2.2829 +VERTEX2 3300 -20.1174 -31.1274 2.29611 +VERTEX2 3301 -19.3628 -30.425 0.76482 +VERTEX2 3302 -18.6393 -29.7646 0.755035 +VERTEX2 3303 -17.9916 -29.0364 0.731377 +VERTEX2 3304 -17.202 -28.3951 0.759366 +VERTEX2 3305 -16.4469 -27.6866 0.7446 +VERTEX2 3306 -17.1749 -26.8612 2.36394 +VERTEX2 3307 -17.9211 -26.153 2.38772 +VERTEX2 3308 -18.6425 -25.5196 2.41524 +VERTEX2 3309 -19.4166 -24.9462 2.4105 +VERTEX2 3310 -20.0867 -24.2524 2.40222 +VERTEX2 3311 -19.4213 -23.465 0.849383 +VERTEX2 3312 -18.8028 -22.6091 0.866433 +VERTEX2 3313 -18.2734 -21.9601 0.884437 +VERTEX2 3314 -17.5737 -21.2954 0.899373 +VERTEX2 3315 -16.9942 -20.4941 0.866239 +VERTEX2 3316 -17.6527 -19.8772 2.45771 +VERTEX2 3317 -18.3647 -19.2831 2.42643 +VERTEX2 3318 -19.1994 -18.5623 2.45427 +VERTEX2 3319 -19.957 -17.8781 2.45317 +VERTEX2 3320 -20.757 -17.2062 2.49261 +VERTEX2 3321 -21.3545 -17.9781 -2.22785 +VERTEX2 3322 -21.9812 -18.7723 -2.23591 +VERTEX2 3323 -22.5798 -19.5727 -2.18967 +VERTEX2 3324 -23.1881 -20.4245 -2.16494 +VERTEX2 3325 -23.6732 -21.2413 -2.14631 +VERTEX2 3326 -24.4609 -20.6872 2.5782 +VERTEX2 3327 -25.3559 -20.1879 2.57273 +VERTEX2 3328 -26.1735 -19.6623 2.57952 +VERTEX2 3329 -26.9721 -19.1386 2.60854 +VERTEX2 3330 -27.9074 -18.7655 2.62467 +VERTEX2 3331 -28.3865 -19.6181 -2.07807 +VERTEX2 3332 -28.8085 -20.5733 -2.07559 +VERTEX2 3333 -29.3529 -21.3734 -2.12258 +VERTEX2 3334 -29.9317 -22.2287 -2.15031 +VERTEX2 3335 -30.4618 -23.1345 -2.11263 +VERTEX2 3336 -29.605 -23.6243 -0.537053 +VERTEX2 3337 -28.7514 -24.1715 -0.547308 +VERTEX2 3338 -27.9227 -24.6529 -0.571046 +VERTEX2 3339 -27.0326 -25.1552 -0.579911 +VERTEX2 3340 -26.1637 -25.6818 -0.562082 +VERTEX2 3341 -25.7031 -24.8684 1.00929 +VERTEX2 3342 -25.0915 -24.0717 0.964733 +VERTEX2 3343 -24.5378 -23.0902 0.945094 +VERTEX2 3344 -23.9507 -22.2853 0.927192 +VERTEX2 3345 -23.3968 -21.4474 0.960168 +VERTEX2 3346 -24.1711 -20.8668 2.53617 +VERTEX2 3347 -24.9825 -20.2381 2.52172 +VERTEX2 3348 -25.7688 -19.6113 2.53326 +VERTEX2 3349 -26.5946 -19.101 2.50838 +VERTEX2 3350 -27.3591 -18.411 2.49599 +VERTEX2 3351 -27.9484 -19.1885 -2.19805 +VERTEX2 3352 -28.4895 -20.0883 -2.24264 +VERTEX2 3353 -29.1032 -20.868 -2.2472 +VERTEX2 3354 -29.7169 -21.6428 -2.22847 +VERTEX2 3355 -30.3433 -22.4778 -2.22651 +VERTEX2 3356 -29.499 -23.1418 -0.69337 +VERTEX2 3357 -28.7228 -23.7907 -0.701177 +VERTEX2 3358 -27.9165 -24.4173 -0.739212 +VERTEX2 3359 -27.2477 -25.0795 -0.768568 +VERTEX2 3360 -26.4751 -25.7699 -0.801348 +VERTEX2 3361 -27.2193 -26.485 -2.37177 +VERTEX2 3362 -27.9053 -27.183 -2.34487 +VERTEX2 3363 -28.6187 -27.9012 -2.34916 +VERTEX2 3364 -29.2732 -28.4909 -2.35594 +VERTEX2 3365 -29.9613 -29.1547 -2.38305 +VERTEX2 3366 -29.2443 -29.8762 -0.809506 +VERTEX2 3367 -28.5667 -30.6184 -0.797388 +VERTEX2 3368 -27.8873 -31.3654 -0.75821 +VERTEX2 3369 -27.0895 -32.0357 -0.790594 +VERTEX2 3370 -26.3837 -32.7519 -0.7835 +VERTEX2 3371 -27.0379 -33.4485 -2.35153 +VERTEX2 3372 -27.7147 -34.1306 -2.34641 +VERTEX2 3373 -28.479 -34.8094 -2.36429 +VERTEX2 3374 -29.2237 -35.4669 -2.30921 +VERTEX2 3375 -29.8945 -36.1357 -2.27985 +VERTEX2 3376 -30.5697 -35.4926 2.41319 +VERTEX2 3377 -31.3583 -34.755 2.40652 +VERTEX2 3378 -32.003 -34.118 2.41713 +VERTEX2 3379 -32.7357 -33.3973 2.41639 +VERTEX2 3380 -33.4822 -32.5952 2.39529 +VERTEX2 3381 -34.1756 -33.2785 -2.31585 +VERTEX2 3382 -34.8506 -34.0314 -2.30342 +VERTEX2 3383 -35.5405 -34.8447 -2.28709 +VERTEX2 3384 -36.1165 -35.6343 -2.29434 +VERTEX2 3385 -36.7832 -36.1816 -2.28301 +VERTEX2 3386 -37.5381 -35.4767 2.43986 +VERTEX2 3387 -38.33 -34.7912 2.4277 +VERTEX2 3388 -39.0731 -34.2294 2.44723 +VERTEX2 3389 -39.7666 -33.62 2.41835 +VERTEX2 3390 -40.4525 -32.9733 2.42841 +VERTEX2 3391 -39.7667 -32.166 0.814477 +VERTEX2 3392 -39.089 -31.4541 0.7917 +VERTEX2 3393 -38.3506 -30.7286 0.776895 +VERTEX2 3394 -37.6604 -30.0491 0.768927 +VERTEX2 3395 -36.9114 -29.406 0.74592 +VERTEX2 3396 -37.5673 -28.7153 2.31318 +VERTEX2 3397 -38.2886 -28.0361 2.33636 +VERTEX2 3398 -39.0274 -27.3615 2.35091 +VERTEX2 3399 -39.7462 -26.5256 2.33636 +VERTEX2 3400 -40.5469 -25.7683 2.32208 +VERTEX2 3401 -41.2476 -26.4669 -2.38296 +VERTEX2 3402 -41.9837 -27.156 -2.40357 +VERTEX2 3403 -42.6347 -27.8143 -2.40258 +VERTEX2 3404 -43.4975 -28.523 -2.40648 +VERTEX2 3405 -44.2297 -29.2297 -2.37475 +VERTEX2 3406 -43.3955 -29.8992 -0.816952 +VERTEX2 3407 -42.6392 -30.633 -0.799875 +VERTEX2 3408 -41.8432 -31.2846 -0.78677 +VERTEX2 3409 -41.1504 -32.0515 -0.784428 +VERTEX2 3410 -40.4395 -32.7594 -0.797671 +VERTEX2 3411 -39.7296 -32.1434 0.786507 +VERTEX2 3412 -39.0368 -31.4823 0.760096 +VERTEX2 3413 -38.3643 -30.7169 0.760428 +VERTEX2 3414 -37.5978 -30.0769 0.772823 +VERTEX2 3415 -36.9107 -29.3343 0.772118 +VERTEX2 3416 -36.2056 -30.0539 -0.857863 +VERTEX2 3417 -35.5538 -30.8236 -0.837387 +VERTEX2 3418 -34.8776 -31.5909 -0.834493 +VERTEX2 3419 -34.237 -32.4112 -0.843917 +VERTEX2 3420 -33.5212 -33.1281 -0.866362 +VERTEX2 3421 -32.799 -32.4117 0.698661 +VERTEX2 3422 -32.0681 -31.7862 0.70358 +VERTEX2 3423 -31.2835 -31.2012 0.682445 +VERTEX2 3424 -30.5211 -30.5846 0.696647 +VERTEX2 3425 -29.7049 -29.9152 0.687744 +VERTEX2 3426 -30.3609 -29.2122 2.26662 +VERTEX2 3427 -31.0189 -28.448 2.23999 +VERTEX2 3428 -31.6444 -27.6145 2.2143 +VERTEX2 3429 -32.2198 -26.6828 2.2388 +VERTEX2 3430 -32.8145 -25.9198 2.27101 +VERTEX2 3431 -33.6048 -26.6042 -2.42504 +VERTEX2 3432 -34.4103 -27.2419 -2.4567 +VERTEX2 3433 -35.167 -27.8717 -2.46572 +VERTEX2 3434 -35.9526 -28.5252 -2.48864 +VERTEX2 3435 -36.7676 -29.0854 -2.52613 +VERTEX2 3436 -36.2479 -29.8716 -0.978204 +VERTEX2 3437 -35.6774 -30.7102 -0.986583 +VERTEX2 3438 -35.129 -31.58 -0.997788 +VERTEX2 3439 -34.6155 -32.4015 -1.00883 +VERTEX2 3440 -34.0114 -33.3158 -1.01124 +VERTEX2 3441 -33.2333 -32.7865 0.560475 +VERTEX2 3442 -32.3517 -32.2172 0.560392 +VERTEX2 3443 -31.4999 -31.6832 0.549941 +VERTEX2 3444 -30.6549 -31.1247 0.544182 +VERTEX2 3445 -29.7496 -30.6291 0.591273 +VERTEX2 3446 -30.3384 -29.8261 2.14696 +VERTEX2 3447 -30.8261 -29.0208 2.19562 +VERTEX2 3448 -31.429 -28.2261 2.16333 +VERTEX2 3449 -31.9427 -27.4424 2.16412 +VERTEX2 3450 -32.5055 -26.5355 2.17858 +VERTEX2 3451 -31.619 -25.9749 0.591103 +VERTEX2 3452 -30.8883 -25.4534 0.579761 +VERTEX2 3453 -30.0984 -24.9425 0.580302 +VERTEX2 3454 -29.1831 -24.3688 0.554457 +VERTEX2 3455 -28.3302 -23.9489 0.558815 +VERTEX2 3456 -27.8229 -24.8158 -1.02786 +VERTEX2 3457 -27.3516 -25.7264 -1.04562 +VERTEX2 3458 -26.8315 -26.6911 -1.04278 +VERTEX2 3459 -26.2386 -27.6438 -1.02088 +VERTEX2 3460 -25.7536 -28.5332 -1.01781 +VERTEX2 3461 -26.5489 -29.0936 -2.59909 +VERTEX2 3462 -27.3401 -29.6138 -2.61871 +VERTEX2 3463 -28.1463 -30.1636 -2.61543 +VERTEX2 3464 -29.0046 -30.6799 -2.62524 +VERTEX2 3465 -29.8461 -31.1798 -2.62576 +VERTEX2 3466 -29.445 -31.9913 -1.03125 +VERTEX2 3467 -29.0045 -32.8564 -1.03233 +VERTEX2 3468 -28.4134 -33.6997 -1.0665 +VERTEX2 3469 -27.9216 -34.6107 -1.05348 +VERTEX2 3470 -27.4255 -35.5243 -1.07277 +VERTEX2 3471 -28.351 -36.0338 -2.61608 +VERTEX2 3472 -29.1337 -36.4862 -2.63849 +VERTEX2 3473 -29.9988 -36.9397 -2.63066 +VERTEX2 3474 -30.8614 -37.4605 -2.6539 +VERTEX2 3475 -31.7997 -38.0759 -2.65371 +VERTEX2 3476 -32.175 -37.1719 2.08338 +VERTEX2 3477 -32.6914 -36.2471 2.11137 +VERTEX2 3478 -33.1593 -35.3824 2.12215 +VERTEX2 3479 -33.6321 -34.5895 2.12374 +VERTEX2 3480 -34.1338 -33.7639 2.12056 +VERTEX2 3481 -34.9523 -34.2868 -2.55531 +VERTEX2 3482 -35.8827 -34.8399 -2.55956 +VERTEX2 3483 -36.7988 -35.3996 -2.58851 +VERTEX2 3484 -37.5839 -35.914 -2.5744 +VERTEX2 3485 -38.4566 -36.5001 -2.5988 +VERTEX2 3486 -37.9495 -37.3414 -1.01709 +VERTEX2 3487 -37.4619 -38.2011 -1.04391 +VERTEX2 3488 -36.9133 -39.1434 -1.0433 +VERTEX2 3489 -36.4442 -40.1003 -1.02827 +VERTEX2 3490 -35.9094 -40.9675 -1.04787 +VERTEX2 3491 -35.031 -40.4319 0.503302 +VERTEX2 3492 -34.162 -39.9328 0.495939 +VERTEX2 3493 -33.2152 -39.4586 0.523036 +VERTEX2 3494 -32.3648 -38.8964 0.503896 +VERTEX2 3495 -31.4631 -38.3788 0.482098 +VERTEX2 3496 -31.0649 -39.2388 -1.08513 +VERTEX2 3497 -30.512 -40.0251 -1.05959 +VERTEX2 3498 -30.0192 -40.8977 -1.06535 +VERTEX2 3499 -29.493 -41.6977 -1.071 +VERTEX2 3500 -29.0341 -42.5508 -1.06255 +VERTEX2 3501 -30.0233 -43.0076 -2.58722 +VERTEX2 3502 -30.8462 -43.5177 -2.582 +VERTEX2 3503 -31.7877 -44.0794 -2.58976 +VERTEX2 3504 -32.7092 -44.5229 -2.59062 +VERTEX2 3505 -33.4653 -45.0117 -2.61018 +VERTEX2 3506 -32.9131 -45.9149 -1.04321 +VERTEX2 3507 -32.3908 -46.8072 -1.05136 +VERTEX2 3508 -31.9682 -47.685 -1.06493 +VERTEX2 3509 -31.4742 -48.6175 -1.08109 +VERTEX2 3510 -31.0399 -49.5038 -1.09449 +VERTEX2 3511 -30.0105 -48.9675 0.486233 +VERTEX2 3512 -29.168 -48.453 0.47294 +VERTEX2 3513 -28.2849 -48.0489 0.471923 +VERTEX2 3514 -27.4367 -47.6732 0.449334 +VERTEX2 3515 -26.676 -47.1934 0.445164 +VERTEX2 3516 -26.2085 -48.0934 -1.11936 +VERTEX2 3517 -25.8071 -49.016 -1.12805 +VERTEX2 3518 -25.2616 -49.8681 -1.10478 +VERTEX2 3519 -24.8068 -50.7439 -1.10466 +VERTEX2 3520 -24.3139 -51.6024 -1.11695 +VERTEX2 3521 -25.2501 -52.0711 -2.72999 +VERTEX2 3522 -26.1461 -52.5299 -2.74277 +VERTEX2 3523 -27.0848 -52.8801 -2.71841 +VERTEX2 3524 -27.9529 -53.2124 -2.66026 +VERTEX2 3525 -28.8695 -53.5832 -2.61776 +VERTEX2 3526 -28.4088 -54.38 -1.03263 +VERTEX2 3527 -27.9232 -55.2307 -1.04367 +VERTEX2 3528 -27.4283 -56.1189 -1.02067 +VERTEX2 3529 -26.9083 -56.8851 -1.02243 +VERTEX2 3530 -26.3249 -57.7412 -1.01927 +VERTEX2 3531 -27.182 -58.3362 -2.59819 +VERTEX2 3532 -28.038 -58.8486 -2.59993 +VERTEX2 3533 -28.8965 -59.3972 -2.56867 +VERTEX2 3534 -29.7212 -60.0434 -2.57748 +VERTEX2 3535 -30.642 -60.5649 -2.57894 +VERTEX2 3536 -30.0985 -61.4687 -1.01501 +VERTEX2 3537 -29.5748 -62.3496 -1.0215 +VERTEX2 3538 -29.0252 -63.1634 -1.01897 +VERTEX2 3539 -28.5229 -64.048 -0.987639 +VERTEX2 3540 -27.9396 -64.8491 -0.980498 +VERTEX2 3541 -27.1238 -64.2955 0.584693 +VERTEX2 3542 -26.343 -63.8485 0.571065 +VERTEX2 3543 -25.5301 -63.3565 0.570801 +VERTEX2 3544 -24.732 -62.7826 0.568064 +VERTEX2 3545 -23.8477 -62.2982 0.560865 +VERTEX2 3546 -23.3074 -63.0829 -1.02311 +VERTEX2 3547 -22.757 -63.9685 -1.07441 +VERTEX2 3548 -22.2679 -64.8599 -1.0817 +VERTEX2 3549 -21.8664 -65.7882 -1.06163 +VERTEX2 3550 -21.3318 -66.7048 -1.0479 +VERTEX2 3551 -20.5513 -66.2514 0.520326 +VERTEX2 3552 -19.6954 -65.7 0.515088 +VERTEX2 3553 -18.8346 -65.2006 0.49412 +VERTEX2 3554 -17.9437 -64.6731 0.484435 +VERTEX2 3555 -17.0709 -64.2889 0.511897 +VERTEX2 3556 -16.6054 -65.1267 -1.05098 +VERTEX2 3557 -16.1314 -66.0195 -1.05056 +VERTEX2 3558 -15.6258 -66.8915 -1.07183 +VERTEX2 3559 -15.1683 -67.8221 -1.11162 +VERTEX2 3560 -14.713 -68.7373 -1.05917 +VERTEX2 3561 -13.7635 -68.1254 0.495773 +VERTEX2 3562 -12.8771 -67.6061 0.490564 +VERTEX2 3563 -11.9627 -67.0728 0.506436 +VERTEX2 3564 -11.1239 -66.7119 0.506557 +VERTEX2 3565 -10.1972 -66.1444 0.504897 +VERTEX2 3566 -10.6864 -65.298 2.04472 +VERTEX2 3567 -11.1241 -64.3431 2.0415 +VERTEX2 3568 -11.6478 -63.4579 2.06351 +VERTEX2 3569 -12.1292 -62.6443 2.0809 +VERTEX2 3570 -12.6647 -61.8031 2.08192 +VERTEX2 3571 -11.8016 -61.2483 0.511334 +VERTEX2 3572 -10.9515 -60.8326 0.504032 +VERTEX2 3573 -10.0979 -60.3607 0.465894 +VERTEX2 3574 -9.16939 -59.9329 0.448307 +VERTEX2 3575 -8.22911 -59.4905 0.472666 +VERTEX2 3576 -8.63734 -58.568 2.06238 +VERTEX2 3577 -9.11939 -57.6713 2.03285 +VERTEX2 3578 -9.56268 -56.8421 2.05266 +VERTEX2 3579 -9.98075 -56.0089 2.04614 +VERTEX2 3580 -10.4662 -55.1205 2.06138 +VERTEX2 3581 -11.4255 -55.408 -2.58148 +VERTEX2 3582 -12.2675 -55.9728 -2.61083 +VERTEX2 3583 -13.1021 -56.5422 -2.56164 +VERTEX2 3584 -13.9522 -57.0508 -2.55716 +VERTEX2 3585 -14.8499 -57.6571 -2.56324 +VERTEX2 3586 -14.3471 -58.4976 -1.01993 +VERTEX2 3587 -13.884 -59.3368 -1.03149 +VERTEX2 3588 -13.3192 -60.1198 -1.02635 +VERTEX2 3589 -12.7883 -60.9044 -1.00174 +VERTEX2 3590 -12.2231 -61.739 -1.02374 +VERTEX2 3591 -11.3913 -61.2775 0.584694 +VERTEX2 3592 -10.5075 -60.724 0.612878 +VERTEX2 3593 -9.68051 -60.1315 0.63144 +VERTEX2 3594 -8.86118 -59.5659 0.639426 +VERTEX2 3595 -8.10936 -59.0305 0.63025 +VERTEX2 3596 -7.53152 -59.8469 -0.898749 +VERTEX2 3597 -6.86991 -60.6005 -0.885277 +VERTEX2 3598 -6.27699 -61.3676 -0.902913 +VERTEX2 3599 -5.56136 -62.074 -0.904822 +VERTEX2 3600 -4.92284 -62.834 -0.883778 +VERTEX2 3601 -4.09914 -62.2517 0.700943 +VERTEX2 3602 -3.31274 -61.6156 0.68462 +VERTEX2 3603 -2.60227 -60.9657 0.666217 +VERTEX2 3604 -1.75485 -60.3468 0.682593 +VERTEX2 3605 -0.887085 -59.7575 0.652787 +VERTEX2 3606 -0.20737 -60.5392 -0.902163 +VERTEX2 3607 0.364382 -61.3775 -0.89352 +VERTEX2 3608 1.00042 -62.1913 -0.887525 +VERTEX2 3609 1.65391 -62.9668 -0.911938 +VERTEX2 3610 2.29061 -63.7196 -0.927356 +VERTEX2 3611 3.15342 -63.1393 0.634465 +VERTEX2 3612 4.02556 -62.4626 0.606671 +VERTEX2 3613 4.86727 -61.9794 0.617403 +VERTEX2 3614 5.65656 -61.351 0.611493 +VERTEX2 3615 6.41616 -60.7496 0.605174 +VERTEX2 3616 6.9735 -61.6423 -0.95242 +VERTEX2 3617 7.57965 -62.507 -0.96699 +VERTEX2 3618 8.1299 -63.2813 -0.95671 +VERTEX2 3619 8.65247 -63.9802 -0.946907 +VERTEX2 3620 9.21899 -64.8061 -0.921747 +VERTEX2 3621 8.43589 -65.4326 -2.46968 +VERTEX2 3622 7.66371 -66.0101 -2.50379 +VERTEX2 3623 6.86427 -66.6621 -2.50937 +VERTEX2 3624 6.07567 -67.2607 -2.47574 +VERTEX2 3625 5.20228 -67.9049 -2.47625 +VERTEX2 3626 4.57841 -67.1408 2.21156 +VERTEX2 3627 3.88392 -66.378 2.20795 +VERTEX2 3628 3.28159 -65.6319 2.23271 +VERTEX2 3629 2.70138 -64.8604 2.24036 +VERTEX2 3630 2.03278 -64.047 2.22597 +VERTEX2 3631 1.24268 -64.6276 -2.49519 +VERTEX2 3632 0.492973 -65.1992 -2.50666 +VERTEX2 3633 -0.367872 -65.8175 -2.48323 +VERTEX2 3634 -1.12589 -66.51 -2.42377 +VERTEX2 3635 -1.96649 -67.1346 -2.42738 +VERTEX2 3636 -2.63716 -66.3634 2.28813 +VERTEX2 3637 -3.3139 -65.6957 2.30185 +VERTEX2 3638 -4.03088 -64.9623 2.30602 +VERTEX2 3639 -4.76092 -64.1766 2.32134 +VERTEX2 3640 -5.40785 -63.4812 2.30604 +VERTEX2 3641 -6.17246 -64.1466 -2.41433 +VERTEX2 3642 -6.90151 -64.6938 -2.42875 +VERTEX2 3643 -7.6031 -65.3214 -2.43087 +VERTEX2 3644 -8.39167 -65.9116 -2.40078 +VERTEX2 3645 -9.09285 -66.6112 -2.38858 +VERTEX2 3646 -8.46075 -67.3264 -0.820151 +VERTEX2 3647 -7.72413 -68.0398 -0.809661 +VERTEX2 3648 -6.95657 -68.7536 -0.85032 +VERTEX2 3649 -6.32861 -69.5295 -0.875768 +VERTEX2 3650 -5.60911 -70.2586 -0.890709 +VERTEX2 3651 -4.84498 -69.6623 0.677092 +VERTEX2 3652 -4.13558 -69.0331 0.708735 +VERTEX2 3653 -3.3911 -68.3822 0.703453 +VERTEX2 3654 -2.6354 -67.6146 0.709527 +VERTEX2 3655 -1.92646 -66.9226 0.714665 +VERTEX2 3656 -2.6115 -66.1262 2.29511 +VERTEX2 3657 -3.27193 -65.3519 2.2407 +VERTEX2 3658 -3.85391 -64.6214 2.23851 +VERTEX2 3659 -4.53897 -63.8277 2.21635 +VERTEX2 3660 -5.19433 -63.0018 2.22557 +VERTEX2 3661 -6.03075 -63.5822 -2.48341 +VERTEX2 3662 -6.84393 -64.2354 -2.46287 +VERTEX2 3663 -7.5489 -64.8514 -2.48207 +VERTEX2 3664 -8.38936 -65.3778 -2.46679 +VERTEX2 3665 -9.21023 -66.0118 -2.4739 +VERTEX2 3666 -8.55468 -66.8899 -0.917499 +VERTEX2 3667 -7.83952 -67.6539 -0.904467 +VERTEX2 3668 -7.2085 -68.4506 -0.913709 +VERTEX2 3669 -6.62685 -69.3153 -0.935356 +VERTEX2 3670 -6.00726 -70.2155 -0.93413 +VERTEX2 3671 -5.23727 -69.7015 0.630879 +VERTEX2 3672 -4.49231 -69.1076 0.634921 +VERTEX2 3673 -3.59823 -68.5703 0.623512 +VERTEX2 3674 -2.81227 -68.0693 0.621737 +VERTEX2 3675 -2.07453 -67.486 0.616697 +VERTEX2 3676 -2.72045 -66.6217 2.17704 +VERTEX2 3677 -3.26724 -65.7424 2.17226 +VERTEX2 3678 -3.8583 -64.9536 2.15512 +VERTEX2 3679 -4.42546 -64.0737 2.14867 +VERTEX2 3680 -4.98105 -63.2373 2.15638 +VERTEX2 3681 -5.7986 -63.8418 -2.56133 +VERTEX2 3682 -6.61032 -64.3411 -2.54976 +VERTEX2 3683 -7.482 -64.9289 -2.56998 +VERTEX2 3684 -8.27423 -65.4261 -2.60355 +VERTEX2 3685 -9.16308 -65.813 -2.5866 +VERTEX2 3686 -9.69613 -64.9459 2.14077 +VERTEX2 3687 -10.22 -64.1234 2.14339 +VERTEX2 3688 -10.757 -63.2352 2.14406 +VERTEX2 3689 -11.2946 -62.3368 2.1451 +VERTEX2 3690 -11.8401 -61.4664 2.138 +VERTEX2 3691 -12.7144 -62.0029 -2.55913 +VERTEX2 3692 -13.5889 -62.5641 -2.5282 +VERTEX2 3693 -14.4273 -63.1325 -2.50349 +VERTEX2 3694 -15.186 -63.7598 -2.51232 +VERTEX2 3695 -16.0359 -64.2682 -2.52048 +VERTEX2 3696 -15.4641 -65.0513 -0.918937 +VERTEX2 3697 -14.9751 -65.8727 -0.905703 +VERTEX2 3698 -14.3151 -66.691 -0.928576 +VERTEX2 3699 -13.7949 -67.5749 -0.913049 +VERTEX2 3700 -13.2511 -68.3934 -0.923553 +VERTEX2 3701 -14.1503 -69.0782 -2.48474 +VERTEX2 3702 -14.931 -69.7524 -2.53698 +VERTEX2 3703 -15.8425 -70.3009 -2.52749 +VERTEX2 3704 -16.6157 -70.8602 -2.50701 +VERTEX2 3705 -17.3267 -71.4279 -2.52692 +VERTEX2 3706 -16.7375 -72.2725 -0.996792 +VERTEX2 3707 -16.1922 -73.0511 -1.03366 +VERTEX2 3708 -15.6979 -73.9845 -1.02309 +VERTEX2 3709 -15.1304 -74.8491 -1.01191 +VERTEX2 3710 -14.6348 -75.6993 -0.983427 +VERTEX2 3711 -13.813 -75.1496 0.62572 +VERTEX2 3712 -13.0749 -74.4971 0.629215 +VERTEX2 3713 -12.3055 -73.9263 0.651685 +VERTEX2 3714 -11.4542 -73.3338 0.652071 +VERTEX2 3715 -10.7338 -72.7205 0.625755 +VERTEX2 3716 -11.3543 -71.8981 2.19917 +VERTEX2 3717 -11.8916 -71.0315 2.23214 +VERTEX2 3718 -12.4413 -70.2258 2.25874 +VERTEX2 3719 -13.0916 -69.5043 2.27056 +VERTEX2 3720 -13.7679 -68.7041 2.2846 +VERTEX2 3721 -13.0021 -67.9419 0.704194 +VERTEX2 3722 -12.3286 -67.2148 0.702807 +VERTEX2 3723 -11.5246 -66.625 0.72134 +VERTEX2 3724 -10.693 -65.9327 0.7454 +VERTEX2 3725 -9.96196 -65.3242 0.706813 +VERTEX2 3726 -10.6006 -64.5717 2.30132 +VERTEX2 3727 -11.3609 -63.8235 2.26766 +VERTEX2 3728 -11.9418 -62.9954 2.25287 +VERTEX2 3729 -12.6128 -62.226 2.25978 +VERTEX2 3730 -13.1665 -61.5167 2.26123 +VERTEX2 3731 -12.4324 -60.9066 0.676199 +VERTEX2 3732 -11.6445 -60.2155 0.689919 +VERTEX2 3733 -10.8818 -59.5848 0.703366 +VERTEX2 3734 -10.1623 -58.9094 0.75441 +VERTEX2 3735 -9.41567 -58.259 0.745174 +VERTEX2 3736 -10.0715 -57.587 2.32684 +VERTEX2 3737 -10.7179 -56.8903 2.31512 +VERTEX2 3738 -11.4902 -56.2631 2.28932 +VERTEX2 3739 -12.1462 -55.5206 2.31512 +VERTEX2 3740 -12.8551 -54.7994 2.30885 +VERTEX2 3741 -13.5549 -55.4805 -2.39524 +VERTEX2 3742 -14.2556 -56.1488 -2.39316 +VERTEX2 3743 -14.9615 -56.8181 -2.38357 +VERTEX2 3744 -15.6181 -57.5764 -2.36302 +VERTEX2 3745 -16.3816 -58.2381 -2.36044 +VERTEX2 3746 -15.7884 -58.9477 -0.80699 +VERTEX2 3747 -15.1109 -59.7003 -0.817834 +VERTEX2 3748 -14.496 -60.4608 -0.787239 +VERTEX2 3749 -13.8001 -61.0631 -0.781152 +VERTEX2 3750 -13.0738 -61.6803 -0.786878 +VERTEX2 3751 -12.3569 -60.9384 0.799736 +VERTEX2 3752 -11.6072 -60.2227 0.77668 +VERTEX2 3753 -10.8084 -59.5798 0.793409 +VERTEX2 3754 -10.1246 -58.9197 0.786001 +VERTEX2 3755 -9.47792 -58.2049 0.813018 +VERTEX2 3756 -8.74569 -58.91 -0.778021 +VERTEX2 3757 -8.07223 -59.6468 -0.805991 +VERTEX2 3758 -7.4252 -60.3961 -0.823365 +VERTEX2 3759 -6.86358 -61.1419 -0.840175 +VERTEX2 3760 -6.08587 -61.9763 -0.834647 +VERTEX2 3761 -6.86721 -62.7421 -2.38585 +VERTEX2 3762 -7.64513 -63.407 -2.42049 +VERTEX2 3763 -8.35857 -64.0444 -2.43974 +VERTEX2 3764 -9.20243 -64.6376 -2.4579 +VERTEX2 3765 -9.93776 -65.314 -2.45447 +VERTEX2 3766 -10.5851 -64.6105 2.26963 +VERTEX2 3767 -11.2103 -63.7451 2.27756 +VERTEX2 3768 -11.8558 -63.0231 2.23932 +VERTEX2 3769 -12.474 -62.2395 2.28606 +VERTEX2 3770 -13.1398 -61.4687 2.24276 +VERTEX2 3771 -14.0496 -62.1573 -2.49716 +VERTEX2 3772 -14.8436 -62.8233 -2.50445 +VERTEX2 3773 -15.5589 -63.378 -2.47423 +VERTEX2 3774 -16.2873 -63.9467 -2.48313 +VERTEX2 3775 -17.0156 -64.4441 -2.46192 +VERTEX2 3776 -16.3763 -65.2499 -0.887162 +VERTEX2 3777 -15.7904 -66.0911 -0.872404 +VERTEX2 3778 -15.0977 -66.9498 -0.882512 +VERTEX2 3779 -14.4763 -67.7386 -0.877044 +VERTEX2 3780 -13.794 -68.5305 -0.867254 +VERTEX2 3781 -14.4757 -69.1777 -2.45115 +VERTEX2 3782 -15.2381 -69.7854 -2.45331 +VERTEX2 3783 -15.9682 -70.4935 -2.45009 +VERTEX2 3784 -16.7765 -71.1082 -2.4222 +VERTEX2 3785 -17.575 -71.8191 -2.42139 +VERTEX2 3786 -16.9362 -72.563 -0.903453 +VERTEX2 3787 -16.331 -73.3589 -0.895358 +VERTEX2 3788 -15.6723 -74.189 -0.913082 +VERTEX2 3789 -15.0402 -74.9643 -0.914733 +VERTEX2 3790 -14.4137 -75.7544 -0.902806 +VERTEX2 3791 -13.5584 -75.1214 0.670368 +VERTEX2 3792 -12.726 -74.453 0.659451 +VERTEX2 3793 -11.9326 -73.7867 0.688193 +VERTEX2 3794 -11.2077 -73.0202 0.666427 +VERTEX2 3795 -10.4756 -72.5078 0.692238 +VERTEX2 3796 -9.77422 -73.3066 -0.865418 +VERTEX2 3797 -9.24238 -74.079 -0.882343 +VERTEX2 3798 -8.68443 -74.8887 -0.897124 +VERTEX2 3799 -8.04958 -75.6475 -0.881265 +VERTEX2 3800 -7.42199 -76.4425 -0.903152 +VERTEX2 3801 -6.68009 -75.8561 0.671282 +VERTEX2 3802 -5.84873 -75.1505 0.689135 +VERTEX2 3803 -5.07681 -74.5111 0.686075 +VERTEX2 3804 -4.34527 -73.8815 0.667336 +VERTEX2 3805 -3.58575 -73.3295 0.677886 +VERTEX2 3806 -4.23139 -72.6095 2.20604 +VERTEX2 3807 -4.78686 -71.7912 2.25537 +VERTEX2 3808 -5.42118 -71.0271 2.26445 +VERTEX2 3809 -6.12105 -70.2791 2.26086 +VERTEX2 3810 -6.79975 -69.4963 2.24323 +VERTEX2 3811 -5.97586 -68.8055 0.673767 +VERTEX2 3812 -5.27781 -68.1557 0.679409 +VERTEX2 3813 -4.43355 -67.584 0.676367 +VERTEX2 3814 -3.61636 -66.97 0.668188 +VERTEX2 3815 -2.78245 -66.3501 0.687119 +VERTEX2 3816 -3.36077 -65.5761 2.23803 +VERTEX2 3817 -3.96996 -64.7965 2.23545 +VERTEX2 3818 -4.67706 -64.0161 2.22232 +VERTEX2 3819 -5.24576 -63.2465 2.23924 +VERTEX2 3820 -5.93029 -62.4919 2.24089 +VERTEX2 3821 -6.67523 -63.0938 -2.5291 +VERTEX2 3822 -7.53791 -63.6265 -2.51602 +VERTEX2 3823 -8.31946 -64.1913 -2.47565 +VERTEX2 3824 -9.08914 -64.8521 -2.44008 +VERTEX2 3825 -9.87591 -65.4737 -2.42941 +VERTEX2 3826 -9.20948 -66.2818 -0.875175 +VERTEX2 3827 -8.61902 -67.0668 -0.872143 +VERTEX2 3828 -7.96984 -67.823 -0.875092 +VERTEX2 3829 -7.27859 -68.6216 -0.905575 +VERTEX2 3830 -6.69393 -69.4246 -0.875576 +VERTEX2 3831 -7.42294 -70.1673 -2.44353 +VERTEX2 3832 -8.23989 -70.7729 -2.43465 +VERTEX2 3833 -8.977 -71.445 -2.44118 +VERTEX2 3834 -9.74719 -72.1417 -2.4629 +VERTEX2 3835 -10.5392 -72.8599 -2.48764 +VERTEX2 3836 -9.90263 -73.7569 -0.913461 +VERTEX2 3837 -9.25324 -74.4984 -0.917176 +VERTEX2 3838 -8.66237 -75.2604 -0.905843 +VERTEX2 3839 -7.94197 -76.0125 -0.916912 +VERTEX2 3840 -7.32912 -76.7806 -0.90132 +VERTEX2 3841 -8.07863 -77.4204 -2.45597 +VERTEX2 3842 -8.79679 -78.0411 -2.47235 +VERTEX2 3843 -9.52965 -78.678 -2.47019 +VERTEX2 3844 -10.3546 -79.2362 -2.48852 +VERTEX2 3845 -11.1536 -79.7734 -2.51669 +VERTEX2 3846 -10.5542 -80.5726 -0.937391 +VERTEX2 3847 -9.95772 -81.3675 -0.925315 +VERTEX2 3848 -9.40204 -82.2102 -0.9532 +VERTEX2 3849 -8.81863 -82.9993 -0.944451 +VERTEX2 3850 -8.20746 -83.8361 -0.957512 +VERTEX2 3851 -7.37516 -83.2876 0.61306 +VERTEX2 3852 -6.67261 -82.6584 0.615763 +VERTEX2 3853 -5.90046 -81.9931 0.580251 +VERTEX2 3854 -5.00203 -81.4447 0.586448 +VERTEX2 3855 -4.19838 -80.8928 0.605017 +VERTEX2 3856 -3.59225 -81.6849 -0.962632 +VERTEX2 3857 -2.98793 -82.5104 -0.970011 +VERTEX2 3858 -2.48214 -83.3386 -0.974685 +VERTEX2 3859 -1.88006 -84.2263 -0.949535 +VERTEX2 3860 -1.418 -85.0496 -0.970402 +VERTEX2 3861 -0.682755 -84.4796 0.60532 +VERTEX2 3862 0.110004 -83.8491 0.579704 +VERTEX2 3863 0.956662 -83.2432 0.58469 +VERTEX2 3864 1.84295 -82.7166 0.609857 +VERTEX2 3865 2.67429 -82.0535 0.618373 +VERTEX2 3866 2.0874 -81.2206 2.1601 +VERTEX2 3867 1.5006 -80.428 2.18177 +VERTEX2 3868 0.940155 -79.608 2.19402 +VERTEX2 3869 0.417151 -78.8629 2.22061 +VERTEX2 3870 -0.117896 -78.0601 2.20188 +VERTEX2 3871 -0.919274 -78.6169 -2.49635 +VERTEX2 3872 -1.68427 -79.1786 -2.48083 +VERTEX2 3873 -2.46634 -79.7105 -2.4773 +VERTEX2 3874 -3.23581 -80.2912 -2.45965 +VERTEX2 3875 -3.99693 -80.9275 -2.45612 +VERTEX2 3876 -3.39362 -81.7474 -0.892957 +VERTEX2 3877 -2.81487 -82.5924 -0.921916 +VERTEX2 3878 -2.15573 -83.3753 -0.945758 +VERTEX2 3879 -1.60091 -84.2615 -0.946362 +VERTEX2 3880 -0.987231 -85.0648 -0.953333 +VERTEX2 3881 -1.6989 -85.6118 -2.53959 +VERTEX2 3882 -2.50089 -86.1414 -2.51134 +VERTEX2 3883 -3.3563 -86.7079 -2.48408 +VERTEX2 3884 -4.15381 -87.3265 -2.44675 +VERTEX2 3885 -4.89891 -87.9482 -2.49276 +VERTEX2 3886 -4.29257 -88.8272 -0.901978 +VERTEX2 3887 -3.67461 -89.632 -0.906942 +VERTEX2 3888 -3.03574 -90.3579 -0.902191 +VERTEX2 3889 -2.47001 -91.1689 -0.913474 +VERTEX2 3890 -1.88143 -91.9182 -0.93737 +VERTEX2 3891 -2.68112 -92.4647 -2.46335 +VERTEX2 3892 -3.43995 -93.1125 -2.46539 +VERTEX2 3893 -4.29267 -93.7621 -2.47327 +VERTEX2 3894 -5.12522 -94.3584 -2.47861 +VERTEX2 3895 -5.96316 -94.9677 -2.4809 +VERTEX2 3896 -5.3539 -95.734 -0.878204 +VERTEX2 3897 -4.67401 -96.5391 -0.894994 +VERTEX2 3898 -4.03742 -97.3209 -0.903392 +VERTEX2 3899 -3.40508 -98.1112 -0.926326 +VERTEX2 3900 -2.71852 -98.925 -0.958402 +VERTEX2 3901 -1.88891 -98.3861 0.618374 +VERTEX2 3902 -1.05469 -97.8451 0.633383 +VERTEX2 3903 -0.247498 -97.1859 0.626089 +VERTEX2 3904 0.569451 -96.5648 0.638391 +VERTEX2 3905 1.39516 -95.9556 0.644303 +VERTEX2 3906 1.98228 -96.831 -0.931413 +VERTEX2 3907 2.59903 -97.6478 -0.940871 +VERTEX2 3908 3.13024 -98.4818 -0.921571 +VERTEX2 3909 3.82424 -99.2221 -0.922453 +VERTEX2 3910 4.50013 -100.033 -0.907473 +VERTEX2 3911 5.31397 -99.339 0.628642 +VERTEX2 3912 6.04441 -98.7931 0.622459 +VERTEX2 3913 6.84031 -98.2833 0.612244 +VERTEX2 3914 7.72935 -97.8493 0.641332 +VERTEX2 3915 8.45306 -97.3259 0.673871 +VERTEX2 3916 7.76135 -96.4754 2.24803 +VERTEX2 3917 7.1229 -95.7206 2.2183 +VERTEX2 3918 6.49876 -94.9162 2.21717 +VERTEX2 3919 5.92581 -94.1163 2.2205 +VERTEX2 3920 5.34878 -93.3359 2.20967 +VERTEX2 3921 4.50785 -94.0289 -2.49505 +VERTEX2 3922 3.64601 -94.5767 -2.4721 +VERTEX2 3923 2.81413 -95.1113 -2.48868 +VERTEX2 3924 2.08649 -95.7182 -2.48501 +VERTEX2 3925 1.25686 -96.3221 -2.48908 +VERTEX2 3926 1.89718 -97.0592 -0.93708 +VERTEX2 3927 2.52483 -97.6925 -0.926969 +VERTEX2 3928 3.10668 -98.4005 -0.897007 +VERTEX2 3929 3.68634 -99.1788 -0.883064 +VERTEX2 3930 4.32838 -100.003 -0.853714 +VERTEX2 3931 5.12134 -99.3019 0.698283 +VERTEX2 3932 5.9475 -98.7079 0.713086 +VERTEX2 3933 6.67132 -98.0082 0.685894 +VERTEX2 3934 7.5273 -97.3526 0.659775 +VERTEX2 3935 8.32202 -96.7432 0.667728 +VERTEX2 3936 7.74615 -95.8917 2.24262 +VERTEX2 3937 7.10775 -95.0972 2.24805 +VERTEX2 3938 6.48238 -94.3233 2.24803 +VERTEX2 3939 5.95336 -93.6188 2.24954 +VERTEX2 3940 5.37268 -92.753 2.21288 +VERTEX2 3941 4.5164 -93.3466 -2.48777 +VERTEX2 3942 3.73364 -93.9713 -2.47696 +VERTEX2 3943 2.92893 -94.5989 -2.47078 +VERTEX2 3944 2.14342 -95.2362 -2.44645 +VERTEX2 3945 1.32127 -95.8467 -2.44114 +VERTEX2 3946 1.96365 -96.6379 -0.880897 +VERTEX2 3947 2.50593 -97.3854 -0.875679 +VERTEX2 3948 3.23037 -98.0444 -0.889863 +VERTEX2 3949 3.90709 -98.8465 -0.897562 +VERTEX2 3950 4.53814 -99.6659 -0.906848 +VERTEX2 3951 3.71925 -100.287 -2.46129 +VERTEX2 3952 2.92444 -100.835 -2.51523 +VERTEX2 3953 2.17175 -101.368 -2.54766 +VERTEX2 3954 1.36194 -101.917 -2.52049 +VERTEX2 3955 0.565552 -102.478 -2.52471 +VERTEX2 3956 1.1278 -103.368 -0.94905 +VERTEX2 3957 1.76398 -104.191 -0.938164 +VERTEX2 3958 2.31701 -105.086 -0.962281 +VERTEX2 3959 2.7919 -105.975 -0.933018 +VERTEX2 3960 3.33168 -106.779 -0.881925 +VERTEX2 3961 4.10216 -106.167 0.687561 +VERTEX2 3962 4.93768 -105.511 0.723628 +VERTEX2 3963 5.68452 -104.827 0.691407 +VERTEX2 3964 6.56205 -104.146 0.719913 +VERTEX2 3965 7.37194 -103.401 0.719343 +VERTEX2 3966 6.72946 -102.631 2.25952 +VERTEX2 3967 6.0074 -101.847 2.26282 +VERTEX2 3968 5.34747 -101.074 2.24893 +VERTEX2 3969 4.77616 -100.315 2.22899 +VERTEX2 3970 4.12852 -99.5516 2.22466 +VERTEX2 3971 4.96869 -98.9596 0.621348 +VERTEX2 3972 5.75831 -98.3993 0.583546 +VERTEX2 3973 6.57081 -97.8276 0.590802 +VERTEX2 3974 7.40801 -97.1567 0.587971 +VERTEX2 3975 8.27648 -96.571 0.579419 +VERTEX2 3976 8.82609 -97.3877 -1.0039 +VERTEX2 3977 9.42479 -98.3177 -1.02136 +VERTEX2 3978 9.84828 -99.1066 -1.05113 +VERTEX2 3979 10.3262 -100.006 -1.03301 +VERTEX2 3980 10.7717 -100.822 -1.04246 +VERTEX2 3981 11.6321 -100.381 0.509295 +VERTEX2 3982 12.5118 -99.9496 0.541504 +VERTEX2 3983 13.3761 -99.521 0.522883 +VERTEX2 3984 14.3181 -99.0588 0.520121 +VERTEX2 3985 15.1504 -98.5308 0.488724 +VERTEX2 3986 14.7656 -97.6955 2.06761 +VERTEX2 3987 14.3332 -96.8451 2.07632 +VERTEX2 3988 13.8803 -95.9173 2.07534 +VERTEX2 3989 13.4501 -95.0738 2.06665 +VERTEX2 3990 13.0001 -94.213 2.07567 +VERTEX2 3991 12.1518 -94.6956 -2.62979 +VERTEX2 3992 11.3437 -95.1661 -2.64212 +VERTEX2 3993 10.5543 -95.6568 -2.65371 +VERTEX2 3994 9.8271 -96.1552 -2.64845 +VERTEX2 3995 8.96308 -96.5443 -2.66863 +VERTEX2 3996 9.42234 -97.4286 -1.11612 +VERTEX2 3997 9.89278 -98.4181 -1.11663 +VERTEX2 3998 10.2175 -99.3838 -1.1116 +VERTEX2 3999 10.6058 -100.28 -1.139 +VERTEX2 4000 11.0339 -101.207 -1.13454 +VERTEX2 4001 11.8953 -100.835 0.430658 +VERTEX2 4002 12.791 -100.468 0.432513 +VERTEX2 4003 13.6369 -100.004 0.448537 +VERTEX2 4004 14.5412 -99.5044 0.453174 +VERTEX2 4005 15.4216 -99.0446 0.426668 +VERTEX2 4006 14.9919 -98.0867 2.04058 +VERTEX2 4007 14.5356 -97.1678 2.02742 +VERTEX2 4008 14.1734 -96.2414 2.05906 +VERTEX2 4009 13.6344 -95.3699 2.05555 +VERTEX2 4010 13.2023 -94.5747 2.04922 +VERTEX2 4011 12.3913 -95.015 -2.6654 +VERTEX2 4012 11.5327 -95.5075 -2.65629 +VERTEX2 4013 10.6005 -95.9643 -2.65951 +VERTEX2 4014 9.70228 -96.4672 -2.64621 +VERTEX2 4015 8.86813 -96.8247 -2.62974 +VERTEX2 4016 9.36165 -97.618 -1.04637 +VERTEX2 4017 9.82283 -98.4884 -1.03831 +VERTEX2 4018 10.2534 -99.4255 -1.0307 +VERTEX2 4019 10.7021 -100.275 -1.01242 +VERTEX2 4020 11.2768 -101.165 -1.02943 +VERTEX2 4021 10.355 -101.65 -2.60263 +VERTEX2 4022 9.51348 -102.129 -2.61594 +VERTEX2 4023 8.66693 -102.644 -2.6363 +VERTEX2 4024 7.80305 -103.134 -2.65097 +VERTEX2 4025 7.04621 -103.646 -2.63963 +VERTEX2 4026 7.54727 -104.538 -1.07005 +VERTEX2 4027 8.07505 -105.435 -1.07445 +VERTEX2 4028 8.50372 -106.289 -1.08665 +VERTEX2 4029 8.98092 -107.155 -1.10985 +VERTEX2 4030 9.35698 -108.052 -1.10619 +VERTEX2 4031 8.50786 -108.499 -2.70922 +VERTEX2 4032 7.69726 -108.925 -2.70755 +VERTEX2 4033 6.84555 -109.33 -2.73785 +VERTEX2 4034 5.90808 -109.774 -2.71015 +VERTEX2 4035 4.92201 -110.225 -2.7231 +VERTEX2 4036 4.56094 -109.277 1.9785 +VERTEX2 4037 4.1382 -108.303 1.9531 +VERTEX2 4038 3.79681 -107.337 1.91479 +VERTEX2 4039 3.51696 -106.394 1.89619 +VERTEX2 4040 3.17829 -105.509 1.92189 +VERTEX2 4041 2.22045 -105.937 -2.78066 +VERTEX2 4042 1.33372 -106.18 -2.76153 +VERTEX2 4043 0.387854 -106.556 -2.74155 +VERTEX2 4044 -0.505439 -107.042 -2.74851 +VERTEX2 4045 -1.38735 -107.462 -2.73527 +VERTEX2 4046 -1.71378 -106.592 1.98285 +VERTEX2 4047 -2.01682 -105.71 1.95052 +VERTEX2 4048 -2.39973 -104.721 1.94823 +VERTEX2 4049 -2.75669 -103.757 1.94322 +VERTEX2 4050 -3.12144 -102.819 1.93552 +VERTEX2 4051 -4.04926 -103.102 -2.7778 +VERTEX2 4052 -4.93811 -103.442 -2.7547 +VERTEX2 4053 -5.94705 -103.81 -2.77334 +VERTEX2 4054 -6.87527 -104.192 -2.77125 +VERTEX2 4055 -7.88181 -104.584 -2.7573 +VERTEX2 4056 -7.60849 -105.528 -1.17792 +VERTEX2 4057 -7.20554 -106.362 -1.20114 +VERTEX2 4058 -6.81187 -107.352 -1.21341 +VERTEX2 4059 -6.53421 -108.323 -1.20721 +VERTEX2 4060 -6.29073 -109.274 -1.18904 +VERTEX2 4061 -5.42436 -108.827 0.40619 +VERTEX2 4062 -4.56549 -108.438 0.409479 +VERTEX2 4063 -3.7187 -107.982 0.422998 +VERTEX2 4064 -2.7768 -107.518 0.398341 +VERTEX2 4065 -1.81723 -107.165 0.387552 +VERTEX2 4066 -2.16271 -106.236 1.97739 +VERTEX2 4067 -2.56246 -105.265 1.95592 +VERTEX2 4068 -2.97051 -104.277 1.942 +VERTEX2 4069 -3.31736 -103.265 1.92981 +VERTEX2 4070 -3.65831 -102.404 1.94928 +VERTEX2 4071 -2.69073 -102.104 0.350189 +VERTEX2 4072 -1.69154 -101.675 0.364174 +VERTEX2 4073 -0.691775 -101.288 0.359036 +VERTEX2 4074 0.271095 -100.924 0.341739 +VERTEX2 4075 1.16552 -100.591 0.345762 +VERTEX2 4076 1.52102 -101.572 -1.19775 +VERTEX2 4077 1.92212 -102.466 -1.20274 +VERTEX2 4078 2.24903 -103.347 -1.24286 +VERTEX2 4079 2.60309 -104.356 -1.2417 +VERTEX2 4080 2.91977 -105.3 -1.21401 +VERTEX2 4081 3.84454 -104.837 0.356036 +VERTEX2 4082 4.74313 -104.467 0.353114 +VERTEX2 4083 5.62309 -104.146 0.34398 +VERTEX2 4084 6.57166 -103.809 0.342925 +VERTEX2 4085 7.61886 -103.493 0.365769 +VERTEX2 4086 7.95999 -104.354 -1.18374 +VERTEX2 4087 8.37428 -105.273 -1.17848 +VERTEX2 4088 8.76004 -106.271 -1.17638 +VERTEX2 4089 9.15481 -107.269 -1.17639 +VERTEX2 4090 9.53933 -108.173 -1.19088 +VERTEX2 4091 10.5598 -107.777 0.376915 +VERTEX2 4092 11.4415 -107.358 0.389259 +VERTEX2 4093 12.3714 -106.962 0.400535 +VERTEX2 4094 13.2375 -106.645 0.403786 +VERTEX2 4095 14.1693 -106.263 0.386722 +VERTEX2 4096 13.8004 -105.365 1.93096 +VERTEX2 4097 13.4568 -104.424 1.92292 +VERTEX2 4098 13.0691 -103.57 1.90976 +VERTEX2 4099 12.7206 -102.626 1.92753 +VERTEX2 4100 12.3975 -101.703 1.94955 +VERTEX2 4101 11.4926 -102.044 -2.7665 +VERTEX2 4102 10.6202 -102.427 -2.7664 +VERTEX2 4103 9.69202 -102.873 -2.7687 +VERTEX2 4104 8.7677 -103.253 -2.78921 +VERTEX2 4105 7.81826 -103.536 -2.78212 +VERTEX2 4106 7.50902 -102.552 1.94601 +VERTEX2 4107 7.22704 -101.706 1.96265 +VERTEX2 4108 6.78395 -100.822 1.92919 +VERTEX2 4109 6.50309 -99.8415 1.9126 +VERTEX2 4110 6.12623 -98.8253 1.92333 +VERTEX2 4111 7.01612 -98.606 0.35978 +VERTEX2 4112 7.96185 -98.2406 0.360472 +VERTEX2 4113 8.87712 -97.8584 0.298596 +VERTEX2 4114 9.80047 -97.4886 0.314341 +VERTEX2 4115 10.7435 -97.1815 0.34131 +VERTEX2 4116 10.3212 -96.2656 1.92396 +VERTEX2 4117 10.0207 -95.3113 1.9448 +VERTEX2 4118 9.66054 -94.3484 1.94777 +VERTEX2 4119 9.27958 -93.5031 1.92184 +VERTEX2 4120 8.9267 -92.5689 1.88138 +VERTEX2 4121 7.95338 -92.8476 -2.8342 +VERTEX2 4122 6.98013 -93.1357 -2.84174 +VERTEX2 4123 6.02088 -93.481 -2.85729 +VERTEX2 4124 5.03468 -93.8117 -2.83446 +VERTEX2 4125 4.12256 -94.1583 -2.81515 +VERTEX2 4126 3.7838 -93.1248 1.90093 +VERTEX2 4127 3.49481 -92.1522 1.91696 +VERTEX2 4128 3.12572 -91.1592 1.90169 +VERTEX2 4129 2.79332 -90.2332 1.89061 +VERTEX2 4130 2.48851 -89.2993 1.88503 +VERTEX2 4131 1.45711 -89.5845 -2.83774 +VERTEX2 4132 0.539588 -89.8362 -2.84523 +VERTEX2 4133 -0.462595 -90.0025 -2.84558 +VERTEX2 4134 -1.34282 -90.3335 -2.82937 +VERTEX2 4135 -2.27482 -90.5564 -2.84277 +VERTEX2 4136 -2.64892 -89.5789 1.88109 +VERTEX2 4137 -2.94114 -88.6716 1.90093 +VERTEX2 4138 -3.21515 -87.7194 1.90456 +VERTEX2 4139 -3.63571 -86.7247 1.87293 +VERTEX2 4140 -3.90362 -85.8036 1.85623 +VERTEX2 4141 -2.93822 -85.4822 0.255328 +VERTEX2 4142 -1.9937 -85.241 0.275381 +VERTEX2 4143 -1.06742 -84.9037 0.261421 +VERTEX2 4144 -0.181589 -84.6248 0.267461 +VERTEX2 4145 0.781101 -84.411 0.277872 +VERTEX2 4146 1.01002 -85.4218 -1.27925 +VERTEX2 4147 1.21656 -86.4577 -1.26198 +VERTEX2 4148 1.54079 -87.3843 -1.26489 +VERTEX2 4149 1.88811 -88.3919 -1.26779 +VERTEX2 4150 2.28226 -89.2906 -1.29672 +VERTEX2 4151 1.26334 -89.5865 -2.8679 +VERTEX2 4152 0.268039 -89.9413 -2.853 +VERTEX2 4153 -0.659405 -90.1659 -2.84753 +VERTEX2 4154 -1.57347 -90.4237 -2.86009 +VERTEX2 4155 -2.54624 -90.6656 -2.8646 +VERTEX2 4156 -2.26263 -91.6154 -1.3193 +VERTEX2 4157 -2.03087 -92.5199 -1.28035 +VERTEX2 4158 -1.7797 -93.4808 -1.29457 +VERTEX2 4159 -1.48088 -94.5122 -1.31922 +VERTEX2 4160 -1.2508 -95.5048 -1.3121 +VERTEX2 4161 -0.287675 -95.1736 0.245953 +VERTEX2 4162 0.698767 -94.9522 0.267939 +VERTEX2 4163 1.59581 -94.6859 0.230845 +VERTEX2 4164 2.63523 -94.4851 0.271077 +VERTEX2 4165 3.62383 -94.1381 0.255817 +VERTEX2 4166 3.36166 -93.1744 1.84578 +VERTEX2 4167 3.10274 -92.2963 1.86683 +VERTEX2 4168 2.87062 -91.3438 1.86218 +VERTEX2 4169 2.50534 -90.4217 1.85713 +VERTEX2 4170 2.13188 -89.4959 1.8578 +VERTEX2 4171 3.20948 -89.1494 0.297032 +VERTEX2 4172 4.0675 -88.8733 0.306087 +VERTEX2 4173 4.93121 -88.6059 0.286942 +VERTEX2 4174 5.82418 -88.3343 0.288789 +VERTEX2 4175 6.82635 -88.07 0.264336 +VERTEX2 4176 6.53347 -87.1218 1.86856 +VERTEX2 4177 6.17539 -86.1929 1.88209 +VERTEX2 4178 5.88312 -85.2585 1.93205 +VERTEX2 4179 5.48653 -84.2461 1.92602 +VERTEX2 4180 5.12127 -83.3023 1.94795 +VERTEX2 4181 4.11038 -83.6455 -2.79509 +VERTEX2 4182 3.17313 -84.0254 -2.7625 +VERTEX2 4183 2.23544 -84.3163 -2.76059 +VERTEX2 4184 1.32836 -84.688 -2.77507 +VERTEX2 4185 0.391999 -85.0536 -2.8107 +VERTEX2 4186 0.0284533 -84.0971 1.90995 +VERTEX2 4187 -0.262683 -83.1211 1.90747 +VERTEX2 4188 -0.606494 -82.1306 1.91284 +VERTEX2 4189 -1.06829 -81.1547 1.91877 +VERTEX2 4190 -1.49932 -80.2437 1.89069 +VERTEX2 4191 -2.47445 -80.5176 -2.82767 +VERTEX2 4192 -3.39951 -80.8151 -2.81371 +VERTEX2 4193 -4.26647 -81.0065 -2.79349 +VERTEX2 4194 -5.21659 -81.3236 -2.79363 +VERTEX2 4195 -6.18188 -81.6565 -2.77693 +VERTEX2 4196 -5.83488 -82.6112 -1.19102 +VERTEX2 4197 -5.42829 -83.6037 -1.22829 +VERTEX2 4198 -4.97925 -84.5635 -1.23469 +VERTEX2 4199 -4.58494 -85.5392 -1.23309 +VERTEX2 4200 -4.16462 -86.4532 -1.24124 +VERTEX2 4201 -3.18134 -86.1421 0.342265 +VERTEX2 4202 -2.27613 -85.8109 0.341304 +VERTEX2 4203 -1.3256 -85.4109 0.349184 +VERTEX2 4204 -0.27409 -85.0539 0.30881 +VERTEX2 4205 0.583239 -84.7872 0.322863 +VERTEX2 4206 0.921009 -85.7598 -1.27498 +VERTEX2 4207 1.19309 -86.6705 -1.26059 +VERTEX2 4208 1.49643 -87.6377 -1.24723 +VERTEX2 4209 1.83848 -88.6708 -1.23531 +VERTEX2 4210 2.22941 -89.678 -1.22875 +VERTEX2 4211 3.18019 -89.2378 0.330905 +VERTEX2 4212 4.10321 -88.988 0.336744 +VERTEX2 4213 5.0511 -88.6316 0.347583 +VERTEX2 4214 6.04039 -88.2664 0.386671 +VERTEX2 4215 7.01561 -87.8396 0.372637 +VERTEX2 4216 6.65123 -86.9028 1.93534 +VERTEX2 4217 6.29185 -85.9455 1.98571 +VERTEX2 4218 5.88124 -85.0931 1.96825 +VERTEX2 4219 5.51546 -84.2145 1.96125 +VERTEX2 4220 5.04763 -83.2833 1.96945 +VERTEX2 4221 4.173 -83.649 -2.72829 +VERTEX2 4222 3.23736 -84.1651 -2.76005 +VERTEX2 4223 2.30434 -84.5172 -2.7605 +VERTEX2 4224 1.35043 -84.9193 -2.766 +VERTEX2 4225 0.338076 -85.228 -2.74087 +VERTEX2 4226 0.68751 -86.1425 -1.16568 +VERTEX2 4227 1.15072 -87.0688 -1.16512 +VERTEX2 4228 1.56438 -88.0697 -1.20349 +VERTEX2 4229 1.97942 -88.9305 -1.20714 +VERTEX2 4230 2.36055 -89.8642 -1.17086 +VERTEX2 4231 3.31547 -89.3928 0.396534 +VERTEX2 4232 4.2045 -88.9506 0.393159 +VERTEX2 4233 5.14622 -88.5171 0.386902 +VERTEX2 4234 6.14593 -88.2724 0.381238 +VERTEX2 4235 7.03815 -87.868 0.398789 +VERTEX2 4236 7.42003 -88.7306 -1.16705 +VERTEX2 4237 7.85541 -89.5992 -1.14692 +VERTEX2 4238 8.18492 -90.564 -1.12838 +VERTEX2 4239 8.62829 -91.4815 -1.13673 +VERTEX2 4240 8.9182 -92.3665 -1.12436 +VERTEX2 4241 8.01872 -92.83 -2.68906 +VERTEX2 4242 7.09856 -93.3654 -2.69496 +VERTEX2 4243 6.16999 -93.7917 -2.69646 +VERTEX2 4244 5.27527 -94.1683 -2.69211 +VERTEX2 4245 4.46189 -94.5888 -2.65189 +VERTEX2 4246 4.97802 -95.4385 -1.09414 +VERTEX2 4247 5.41531 -96.2824 -1.08629 +VERTEX2 4248 5.84042 -97.2755 -1.08282 +VERTEX2 4249 6.31441 -98.1396 -1.05641 +VERTEX2 4250 6.77359 -99.009 -1.04221 +VERTEX2 4251 7.62738 -98.4536 0.51917 +VERTEX2 4252 8.51587 -97.9754 0.531314 +VERTEX2 4253 9.44534 -97.4974 0.490924 +VERTEX2 4254 10.307 -97.0585 0.513768 +VERTEX2 4255 11.2764 -96.5335 0.505003 +VERTEX2 4256 10.7473 -95.6467 2.08322 +VERTEX2 4257 10.3125 -94.7615 2.12454 +VERTEX2 4258 9.77026 -93.943 2.12318 +VERTEX2 4259 9.33255 -93.187 2.0905 +VERTEX2 4260 8.86877 -92.3883 2.1128 +VERTEX2 4261 7.95877 -92.899 -2.59764 +VERTEX2 4262 7.13528 -93.4641 -2.58635 +VERTEX2 4263 6.25819 -93.8698 -2.58432 +VERTEX2 4264 5.41901 -94.314 -2.57417 +VERTEX2 4265 4.52308 -94.8564 -2.59694 +VERTEX2 4266 5.08588 -95.711 -1.01907 +VERTEX2 4267 5.65196 -96.5783 -1.00825 +VERTEX2 4268 6.30734 -97.362 -0.990779 +VERTEX2 4269 6.88218 -98.1717 -0.971306 +VERTEX2 4270 7.52206 -99.0718 -0.965925 +VERTEX2 4271 8.24205 -98.5042 0.613853 +VERTEX2 4272 9.04074 -97.9306 0.611217 +VERTEX2 4273 9.91454 -97.3771 0.611853 +VERTEX2 4274 10.7415 -96.869 0.599664 +VERTEX2 4275 11.6195 -96.3191 0.62716 +VERTEX2 4276 11.02 -95.4573 2.23003 +VERTEX2 4277 10.3875 -94.6222 2.192 +VERTEX2 4278 9.79038 -93.7801 2.18081 +VERTEX2 4279 9.21522 -92.9891 2.20362 +VERTEX2 4280 8.60146 -92.2721 2.19445 +VERTEX2 4281 9.40156 -91.5961 0.658475 +VERTEX2 4282 10.0776 -90.925 0.669435 +VERTEX2 4283 10.8513 -90.2995 0.688447 +VERTEX2 4284 11.65 -89.7585 0.72952 +VERTEX2 4285 12.4083 -89.2457 0.713624 +VERTEX2 4286 11.7723 -88.4673 2.24493 +VERTEX2 4287 11.1503 -87.7263 2.26755 +VERTEX2 4288 10.6002 -86.8848 2.27298 +VERTEX2 4289 10.0284 -86.0893 2.27107 +VERTEX2 4290 9.37908 -85.3867 2.26399 +VERTEX2 4291 8.58902 -85.9747 -2.45311 +VERTEX2 4292 7.88861 -86.5958 -2.4419 +VERTEX2 4293 7.10913 -87.2899 -2.4248 +VERTEX2 4294 6.30882 -87.8874 -2.40631 +VERTEX2 4295 5.62478 -88.5979 -2.41427 +VERTEX2 4296 4.96851 -87.8709 2.30197 +VERTEX2 4297 4.32276 -87.1904 2.32085 +VERTEX2 4298 3.68978 -86.4505 2.33235 +VERTEX2 4299 3.01675 -85.7685 2.34585 +VERTEX2 4300 2.35887 -84.9908 2.33641 +VERTEX2 4301 1.62969 -85.7082 -2.38363 +VERTEX2 4302 0.89503 -86.478 -2.35728 +VERTEX2 4303 0.18775 -87.1592 -2.37732 +VERTEX2 4304 -0.485212 -87.9028 -2.3314 +VERTEX2 4305 -1.21608 -88.5651 -2.30511 +VERTEX2 4306 -0.462514 -89.3208 -0.751247 +VERTEX2 4307 0.403964 -90.0105 -0.747236 +VERTEX2 4308 1.08535 -90.6308 -0.77963 +VERTEX2 4309 1.8261 -91.3146 -0.767918 +VERTEX2 4310 2.62011 -91.9461 -0.756759 +VERTEX2 4311 3.22076 -91.2945 0.824923 +VERTEX2 4312 3.90869 -90.5421 0.847942 +VERTEX2 4313 4.56863 -89.7051 0.82879 +VERTEX2 4314 5.25626 -88.9943 0.818239 +VERTEX2 4315 5.8431 -88.2353 0.82193 +VERTEX2 4316 5.10848 -87.5259 2.40099 +VERTEX2 4317 4.37199 -86.8011 2.42479 +VERTEX2 4318 3.63545 -86.1376 2.43298 +VERTEX2 4319 2.80227 -85.4457 2.4381 +VERTEX2 4320 2.06158 -84.8426 2.44721 +VERTEX2 4321 1.30198 -85.5888 -2.24846 +VERTEX2 4322 0.727359 -86.3837 -2.28933 +VERTEX2 4323 0.109017 -87.0932 -2.28406 +VERTEX2 4324 -0.564139 -87.9046 -2.31827 +VERTEX2 4325 -1.26637 -88.6867 -2.34668 +VERTEX2 4326 -2.05515 -87.9253 2.37013 +VERTEX2 4327 -2.74888 -87.1727 2.36642 +VERTEX2 4328 -3.5697 -86.5601 2.35255 +VERTEX2 4329 -4.30114 -85.8399 2.36078 +VERTEX2 4330 -5.01063 -85.0407 2.38937 +VERTEX2 4331 -5.71463 -85.748 -2.3396 +VERTEX2 4332 -6.41131 -86.4935 -2.35302 +VERTEX2 4333 -7.06696 -87.1583 -2.3414 +VERTEX2 4334 -7.84341 -87.8378 -2.32662 +VERTEX2 4335 -8.59485 -88.6093 -2.33525 +VERTEX2 4336 -9.24856 -87.8728 2.39153 +VERTEX2 4337 -9.83217 -87.2025 2.41207 +VERTEX2 4338 -10.6296 -86.5197 2.42239 +VERTEX2 4339 -11.4633 -85.7246 2.4121 +VERTEX2 4340 -12.2561 -85.0453 2.42276 +VERTEX2 4341 -12.8987 -85.8523 -2.27369 +VERTEX2 4342 -13.4473 -86.4706 -2.25223 +VERTEX2 4343 -14.0267 -87.2492 -2.23834 +VERTEX2 4344 -14.5577 -88.0308 -2.24772 +VERTEX2 4345 -15.127 -88.8191 -2.25392 +VERTEX2 4346 -15.8565 -88.1958 2.48235 +VERTEX2 4347 -16.686 -87.5854 2.46426 +VERTEX2 4348 -17.4979 -87.0893 2.48645 +VERTEX2 4349 -18.2754 -86.486 2.48658 +VERTEX2 4350 -19.0217 -85.9422 2.46921 +VERTEX2 4351 -19.6487 -86.7947 -2.21498 +VERTEX2 4352 -20.334 -87.5726 -2.22773 +VERTEX2 4353 -20.9657 -88.332 -2.21283 +VERTEX2 4354 -21.5936 -89.1862 -2.20099 +VERTEX2 4355 -22.2981 -89.9134 -2.19149 +VERTEX2 4356 -23.0541 -89.403 2.55096 +VERTEX2 4357 -23.9333 -88.8433 2.52375 +VERTEX2 4358 -24.8204 -88.3087 2.50389 +VERTEX2 4359 -25.6103 -87.647 2.4996 +VERTEX2 4360 -26.3355 -87.0564 2.48105 +VERTEX2 4361 -25.7077 -86.3193 0.929429 +VERTEX2 4362 -25.136 -85.493 0.883106 +VERTEX2 4363 -24.4458 -84.7713 0.889992 +VERTEX2 4364 -23.8026 -84.0007 0.900489 +VERTEX2 4365 -23.1109 -83.1484 0.899093 +VERTEX2 4366 -23.9679 -82.5619 2.46642 +VERTEX2 4367 -24.7243 -81.9263 2.44996 +VERTEX2 4368 -25.5471 -81.246 2.44544 +VERTEX2 4369 -26.2885 -80.5392 2.42306 +VERTEX2 4370 -27.041 -79.909 2.41211 +VERTEX2 4371 -27.728 -80.6118 -2.29117 +VERTEX2 4372 -28.386 -81.3526 -2.28625 +VERTEX2 4373 -29.1451 -82.1677 -2.24683 +VERTEX2 4374 -29.8031 -83.0342 -2.23712 +VERTEX2 4375 -30.4423 -83.7003 -2.22648 +VERTEX2 4376 -31.1632 -83.1297 2.50247 +VERTEX2 4377 -31.9739 -82.5583 2.51233 +VERTEX2 4378 -32.7923 -81.8852 2.52998 +VERTEX2 4379 -33.6472 -81.345 2.50102 +VERTEX2 4380 -34.5276 -80.7915 2.49164 +VERTEX2 4381 -33.9439 -80.0165 0.882741 +VERTEX2 4382 -33.3345 -79.2049 0.876718 +VERTEX2 4383 -32.7233 -78.4807 0.909036 +VERTEX2 4384 -32.1509 -77.7265 0.874825 +VERTEX2 4385 -31.4408 -76.9431 0.837321 +VERTEX2 4386 -30.6713 -77.7285 -0.754688 +VERTEX2 4387 -29.9842 -78.457 -0.734021 +VERTEX2 4388 -29.1688 -79.1786 -0.696043 +VERTEX2 4389 -28.3825 -79.7228 -0.678586 +VERTEX2 4390 -27.4683 -80.4443 -0.68881 +VERTEX2 4391 -28.1011 -81.26 -2.27404 +VERTEX2 4392 -28.7587 -81.9953 -2.28221 +VERTEX2 4393 -29.4152 -82.7701 -2.30103 +VERTEX2 4394 -30.0295 -83.4412 -2.29654 +VERTEX2 4395 -30.6438 -84.1743 -2.29001 +VERTEX2 4396 -31.3691 -83.5564 2.41231 +VERTEX2 4397 -32.0733 -82.9044 2.41075 +VERTEX2 4398 -32.7996 -82.2719 2.40232 +VERTEX2 4399 -33.4681 -81.5871 2.39213 +VERTEX2 4400 -34.1906 -80.8955 2.38138 +VERTEX2 4401 -34.821 -81.5795 -2.32454 +VERTEX2 4402 -35.4117 -82.291 -2.34623 +VERTEX2 4403 -36.193 -83.0053 -2.32109 +VERTEX2 4404 -36.9463 -83.719 -2.35975 +VERTEX2 4405 -37.6289 -84.536 -2.36403 +VERTEX2 4406 -36.8903 -85.2766 -0.78333 +VERTEX2 4407 -36.2034 -86.0543 -0.809139 +VERTEX2 4408 -35.558 -86.7535 -0.801363 +VERTEX2 4409 -34.9376 -87.4975 -0.778788 +VERTEX2 4410 -34.2025 -88.1883 -0.757113 +VERTEX2 4411 -33.4872 -87.4905 0.853393 +VERTEX2 4412 -32.7637 -86.6054 0.86628 +VERTEX2 4413 -32.1735 -85.882 0.860267 +VERTEX2 4414 -31.5111 -85.097 0.874001 +VERTEX2 4415 -30.8915 -84.3057 0.875594 +VERTEX2 4416 -31.5659 -83.6311 2.45972 +VERTEX2 4417 -32.369 -83.0899 2.48185 +VERTEX2 4418 -33.2184 -82.6183 2.50677 +VERTEX2 4419 -34.0402 -82.0229 2.47857 +VERTEX2 4420 -34.8646 -81.409 2.49854 +VERTEX2 4421 -35.4548 -82.1907 -2.21126 +VERTEX2 4422 -36.0803 -82.9734 -2.2038 +VERTEX2 4423 -36.7219 -83.8545 -2.20445 +VERTEX2 4424 -37.2561 -84.7594 -2.19964 +VERTEX2 4425 -37.7739 -85.5244 -2.24439 +VERTEX2 4426 -36.9607 -86.1485 -0.667296 +VERTEX2 4427 -36.198 -86.7599 -0.651894 +VERTEX2 4428 -35.4394 -87.3129 -0.659286 +VERTEX2 4429 -34.6431 -87.934 -0.705557 +VERTEX2 4430 -33.8762 -88.5981 -0.733869 +VERTEX2 4431 -33.1988 -87.8646 0.86895 +VERTEX2 4432 -32.5464 -87.1383 0.889119 +VERTEX2 4433 -31.8964 -86.4221 0.888804 +VERTEX2 4434 -31.3156 -85.6033 0.912915 +VERTEX2 4435 -30.7111 -84.8058 0.960829 +VERTEX2 4436 -29.9011 -85.4549 -0.61827 +VERTEX2 4437 -29.1028 -86.0122 -0.657102 +VERTEX2 4438 -28.366 -86.5642 -0.675631 +VERTEX2 4439 -27.6508 -87.1536 -0.660583 +VERTEX2 4440 -26.8169 -87.7239 -0.626031 +VERTEX2 4441 -26.1922 -86.845 0.949637 +VERTEX2 4442 -25.6282 -86.077 0.982729 +VERTEX2 4443 -25.0624 -85.2538 0.973405 +VERTEX2 4444 -24.4665 -84.3658 0.955661 +VERTEX2 4445 -23.8254 -83.5533 0.932448 +VERTEX2 4446 -23.0373 -84.1331 -0.627916 +VERTEX2 4447 -22.2069 -84.7 -0.638808 +VERTEX2 4448 -21.4235 -85.2074 -0.676238 +VERTEX2 4449 -20.6463 -85.8148 -0.648836 +VERTEX2 4450 -19.8714 -86.4137 -0.645543 +VERTEX2 4451 -20.4372 -87.1496 -2.2565 +VERTEX2 4452 -21.0244 -87.8806 -2.27524 +VERTEX2 4453 -21.676 -88.7181 -2.2501 +VERTEX2 4454 -22.2917 -89.5528 -2.25354 +VERTEX2 4455 -22.9411 -90.3666 -2.24594 +VERTEX2 4456 -22.1057 -90.94 -0.671131 +VERTEX2 4457 -21.3782 -91.5657 -0.700522 +VERTEX2 4458 -20.6756 -92.2474 -0.718426 +VERTEX2 4459 -19.9266 -92.9952 -0.694664 +VERTEX2 4460 -19.1453 -93.6324 -0.685634 +VERTEX2 4461 -18.4888 -92.8716 0.891202 +VERTEX2 4462 -17.9032 -92.0658 0.884984 +VERTEX2 4463 -17.3114 -91.3184 0.885472 +VERTEX2 4464 -16.612 -90.5106 0.844376 +VERTEX2 4465 -15.9585 -89.776 0.846947 +VERTEX2 4466 -16.7882 -89.1362 2.4145 +VERTEX2 4467 -17.6244 -88.4992 2.45267 +VERTEX2 4468 -18.3253 -87.8937 2.44814 +VERTEX2 4469 -19.0911 -87.2282 2.44502 +VERTEX2 4470 -19.9093 -86.5802 2.41475 +VERTEX2 4471 -19.1785 -85.7612 0.848357 +VERTEX2 4472 -18.536 -84.9885 0.866611 +VERTEX2 4473 -17.9044 -84.1825 0.851944 +VERTEX2 4474 -17.1702 -83.4962 0.874874 +VERTEX2 4475 -16.5514 -82.6481 0.900679 +VERTEX2 4476 -17.3041 -82.0512 2.4753 +VERTEX2 4477 -18.0929 -81.4199 2.48019 +VERTEX2 4478 -18.8407 -80.7553 2.41496 +VERTEX2 4479 -19.5926 -80.057 2.41239 +VERTEX2 4480 -20.3524 -79.3377 2.44073 +VERTEX2 4481 -21.0267 -80.0357 -2.24404 +VERTEX2 4482 -21.702 -80.7936 -2.25694 +VERTEX2 4483 -22.3518 -81.5841 -2.28341 +VERTEX2 4484 -22.9831 -82.2936 -2.3281 +VERTEX2 4485 -23.6108 -83.0155 -2.31269 +VERTEX2 4486 -22.8831 -83.7177 -0.731144 +VERTEX2 4487 -22.123 -84.4521 -0.733046 +VERTEX2 4488 -21.3828 -85.1336 -0.762781 +VERTEX2 4489 -20.5874 -85.7406 -0.767872 +VERTEX2 4490 -19.9267 -86.5296 -0.754326 +VERTEX2 4491 -19.2601 -85.8061 0.788398 +VERTEX2 4492 -18.4964 -85.0614 0.783814 +VERTEX2 4493 -17.8372 -84.3895 0.785605 +VERTEX2 4494 -17.0443 -83.7015 0.763778 +VERTEX2 4495 -16.3756 -82.9965 0.731184 +VERTEX2 4496 -15.6813 -83.7187 -0.840228 +VERTEX2 4497 -15.0338 -84.5237 -0.834691 +VERTEX2 4498 -14.4394 -85.2566 -0.829752 +VERTEX2 4499 -13.7896 -86.0582 -0.845836 +VERTEX2 4500 -13.1752 -86.8999 -0.842329 +VERTEX2 4501 -12.4178 -86.1555 0.725955 +VERTEX2 4502 -11.6068 -85.5296 0.737093 +VERTEX2 4503 -10.8475 -84.8579 0.74376 +VERTEX2 4504 -10.1545 -84.0743 0.758851 +VERTEX2 4505 -9.44265 -83.4179 0.746445 +VERTEX2 4506 -8.76199 -84.1969 -0.827657 +VERTEX2 4507 -8.09574 -84.9174 -0.819086 +VERTEX2 4508 -7.48481 -85.6927 -0.856849 +VERTEX2 4509 -6.8467 -86.456 -0.836673 +VERTEX2 4510 -6.30098 -87.1256 -0.852309 +VERTEX2 4511 -5.46384 -86.4435 0.697375 +VERTEX2 4512 -4.66831 -85.8281 0.706946 +VERTEX2 4513 -3.84537 -85.1985 0.681985 +VERTEX2 4514 -3.10259 -84.5965 0.682802 +VERTEX2 4515 -2.3751 -83.9193 0.700893 +VERTEX2 4516 -1.70433 -84.7274 -0.841533 +VERTEX2 4517 -1.12295 -85.51 -0.884854 +VERTEX2 4518 -0.544769 -86.2382 -0.858699 +VERTEX2 4519 0.0824264 -86.9886 -0.870519 +VERTEX2 4520 0.731336 -87.7728 -0.892907 +VERTEX2 4521 1.55816 -87.1204 0.679078 +VERTEX2 4522 2.33454 -86.5235 0.716889 +VERTEX2 4523 3.06102 -85.8896 0.685068 +VERTEX2 4524 3.79424 -85.2264 0.695751 +VERTEX2 4525 4.57751 -84.5995 0.639292 +VERTEX2 4526 3.92726 -83.7977 2.18447 +VERTEX2 4527 3.38379 -82.9252 2.17486 +VERTEX2 4528 2.82601 -82.1096 2.15452 +VERTEX2 4529 2.27309 -81.2597 2.1669 +VERTEX2 4530 1.75381 -80.5234 2.1772 +VERTEX2 4531 0.927351 -81.1598 -2.53054 +VERTEX2 4532 0.130743 -81.6842 -2.5539 +VERTEX2 4533 -0.715718 -82.3209 -2.56492 +VERTEX2 4534 -1.54744 -82.8071 -2.54899 +VERTEX2 4535 -2.31324 -83.3792 -2.5413 +VERTEX2 4536 -2.89855 -82.3762 2.16221 +VERTEX2 4537 -3.47839 -81.4749 2.12722 +VERTEX2 4538 -3.98716 -80.655 2.11293 +VERTEX2 4539 -4.49994 -79.8067 2.09354 +VERTEX2 4540 -4.96523 -79.0444 2.12367 +VERTEX2 4541 -4.19679 -78.5371 0.584331 +VERTEX2 4542 -3.46732 -77.977 0.553321 +VERTEX2 4543 -2.62207 -77.4658 0.602283 +VERTEX2 4544 -1.78578 -76.9461 0.606245 +VERTEX2 4545 -0.93947 -76.3551 0.638649 +VERTEX2 4546 -0.264753 -77.1137 -0.909252 +VERTEX2 4547 0.292116 -77.949 -0.897573 +VERTEX2 4548 0.894728 -78.771 -0.890128 +VERTEX2 4549 1.54349 -79.5354 -0.877406 +VERTEX2 4550 2.1873 -80.2603 -0.889359 +VERTEX2 4551 2.96231 -79.7069 0.67384 +VERTEX2 4552 3.77783 -79.0339 0.663122 +VERTEX2 4553 4.51526 -78.4837 0.661175 +VERTEX2 4554 5.30474 -77.9054 0.657046 +VERTEX2 4555 6.17931 -77.2552 0.641877 +VERTEX2 4556 5.64363 -76.3852 2.19992 +VERTEX2 4557 5.12521 -75.6291 2.19172 +VERTEX2 4558 4.61508 -74.7973 2.18288 +VERTEX2 4559 3.97906 -74.0987 2.16264 +VERTEX2 4560 3.38282 -73.2845 2.17069 +VERTEX2 4561 4.15522 -72.7005 0.600738 +VERTEX2 4562 4.9692 -72.0952 0.601081 +VERTEX2 4563 5.84279 -71.6241 0.619497 +VERTEX2 4564 6.71578 -71.018 0.563748 +VERTEX2 4565 7.59933 -70.4636 0.518723 +VERTEX2 4566 7.08161 -69.6054 2.08534 +VERTEX2 4567 6.61062 -68.736 2.07305 +VERTEX2 4568 6.07694 -67.8982 2.04921 +VERTEX2 4569 5.58968 -66.9754 2.03158 +VERTEX2 4570 5.13362 -66.0713 2.06391 +VERTEX2 4571 6.0895 -65.5258 0.502978 +VERTEX2 4572 6.93286 -65.0568 0.498812 +VERTEX2 4573 7.81205 -64.5499 0.506541 +VERTEX2 4574 8.84211 -64.1457 0.512971 +VERTEX2 4575 9.70149 -63.6385 0.491431 +VERTEX2 4576 9.28143 -62.7869 2.04309 +VERTEX2 4577 8.83192 -61.974 2.02953 +VERTEX2 4578 8.38138 -61.0625 1.99308 +VERTEX2 4579 7.89798 -60.1395 1.998 +VERTEX2 4580 7.43134 -59.2112 1.95176 +VERTEX2 4581 6.46858 -59.5543 -2.74253 +VERTEX2 4582 5.58059 -59.9543 -2.73008 +VERTEX2 4583 4.69768 -60.3711 -2.6992 +VERTEX2 4584 3.82068 -60.6714 -2.69089 +VERTEX2 4585 2.90371 -61.1851 -2.67772 +VERTEX2 4586 2.39628 -60.3054 2.01744 +VERTEX2 4587 1.87578 -59.4554 1.99571 +VERTEX2 4588 1.41844 -58.4666 1.96094 +VERTEX2 4589 0.993352 -57.5218 1.93309 +VERTEX2 4590 0.675446 -56.4727 1.92149 +VERTEX2 4591 -0.16024 -56.7913 -2.77123 +VERTEX2 4592 -1.11711 -57.2123 -2.75393 +VERTEX2 4593 -2.13043 -57.6608 -2.75768 +VERTEX2 4594 -2.97284 -57.9603 -2.77372 +VERTEX2 4595 -3.90578 -58.2854 -2.76705 +VERTEX2 4596 -4.29221 -57.4706 1.90668 +VERTEX2 4597 -4.61886 -56.585 1.89944 +VERTEX2 4598 -5.0126 -55.6382 1.91289 +VERTEX2 4599 -5.3695 -54.6343 1.90099 +VERTEX2 4600 -5.69238 -53.7316 1.93618 +VERTEX2 4601 -4.71613 -53.4057 0.385605 +VERTEX2 4602 -3.75691 -53.0574 0.370093 +VERTEX2 4603 -2.84302 -52.7619 0.382025 +VERTEX2 4604 -1.87573 -52.5004 0.367617 +VERTEX2 4605 -0.977609 -52.1337 0.404191 +VERTEX2 4606 -1.41656 -51.2672 1.95543 +VERTEX2 4607 -1.78541 -50.3929 1.94483 +VERTEX2 4608 -2.15439 -49.5345 1.96078 +VERTEX2 4609 -2.56918 -48.5546 1.93573 +VERTEX2 4610 -2.9886 -47.6302 1.95354 +VERTEX2 4611 -3.83921 -48.0021 -2.76442 +VERTEX2 4612 -4.81848 -48.4525 -2.75438 +VERTEX2 4613 -5.8616 -48.8571 -2.76066 +VERTEX2 4614 -6.72558 -49.253 -2.7615 +VERTEX2 4615 -7.71275 -49.5686 -2.73956 +VERTEX2 4616 -7.27194 -50.5351 -1.18605 +VERTEX2 4617 -6.99526 -51.4742 -1.17441 +VERTEX2 4618 -6.49719 -52.3786 -1.14518 +VERTEX2 4619 -6.21371 -53.3982 -1.16007 +VERTEX2 4620 -5.84352 -54.3833 -1.15768 +VERTEX2 4621 -4.89847 -54.0185 0.436467 +VERTEX2 4622 -3.99105 -53.5821 0.430282 +VERTEX2 4623 -3.05184 -53.1625 0.42224 +VERTEX2 4624 -2.1167 -52.7544 0.426447 +VERTEX2 4625 -1.2584 -52.2731 0.401427 +VERTEX2 4626 -0.858725 -53.2118 -1.18909 +VERTEX2 4627 -0.469725 -54.1355 -1.18166 +VERTEX2 4628 -0.0816834 -55.0376 -1.1496 +VERTEX2 4629 0.309221 -55.9694 -1.142 +VERTEX2 4630 0.671203 -56.8424 -1.12314 +VERTEX2 4631 -0.296558 -57.263 -2.70041 +VERTEX2 4632 -1.25238 -57.6645 -2.68943 +VERTEX2 4633 -2.11817 -58.0963 -2.69178 +VERTEX2 4634 -3.01174 -58.656 -2.68904 +VERTEX2 4635 -3.9144 -59.111 -2.69954 +VERTEX2 4636 -3.51493 -59.9935 -1.1483 +VERTEX2 4637 -2.97555 -60.9252 -1.18528 +VERTEX2 4638 -2.56582 -61.8597 -1.20914 +VERTEX2 4639 -2.18361 -62.7722 -1.17114 +VERTEX2 4640 -1.73034 -63.804 -1.15689 +VERTEX2 4641 -0.909525 -63.462 0.414082 +VERTEX2 4642 -0.04002 -63.0987 0.390082 +VERTEX2 4643 0.887549 -62.6675 0.414766 +VERTEX2 4644 1.7798 -62.2152 0.421196 +VERTEX2 4645 2.74545 -61.7821 0.426104 +VERTEX2 4646 2.32959 -60.8933 2.03886 +VERTEX2 4647 1.90849 -59.986 2.03219 +VERTEX2 4648 1.45972 -58.9989 2.02045 +VERTEX2 4649 1.05339 -58.1347 2.005 +VERTEX2 4650 0.703692 -57.3257 2.00976 +VERTEX2 4651 -0.239886 -57.7882 -2.7159 +VERTEX2 4652 -1.2038 -58.1971 -2.70411 +VERTEX2 4653 -2.16989 -58.6247 -2.70869 +VERTEX2 4654 -3.06354 -59.0183 -2.70637 +VERTEX2 4655 -3.91195 -59.4154 -2.68448 +VERTEX2 4656 -3.62848 -60.282 -1.0932 +VERTEX2 4657 -3.0935 -61.1895 -1.10202 +VERTEX2 4658 -2.69546 -62.1105 -1.11488 +VERTEX2 4659 -2.29465 -62.9886 -1.1056 +VERTEX2 4660 -1.94673 -63.9662 -1.13359 +VERTEX2 4661 -1.03186 -63.6483 0.438671 +VERTEX2 4662 -0.245867 -63.196 0.445162 +VERTEX2 4663 0.749226 -62.8264 0.452546 +VERTEX2 4664 1.70221 -62.3752 0.467176 +VERTEX2 4665 2.57127 -61.9144 0.431775 +VERTEX2 4666 2.98338 -62.8286 -1.13456 +VERTEX2 4667 3.42339 -63.7427 -1.14293 +VERTEX2 4668 3.85253 -64.5892 -1.08924 +VERTEX2 4669 4.3217 -65.436 -1.07383 +VERTEX2 4670 4.78402 -66.3795 -1.05524 +VERTEX2 4671 5.62355 -65.8151 0.52958 +VERTEX2 4672 6.4842 -65.2995 0.544705 +VERTEX2 4673 7.41305 -64.8096 0.554843 +VERTEX2 4674 8.30044 -64.3197 0.550927 +VERTEX2 4675 9.11053 -63.7371 0.520576 +VERTEX2 4676 8.56385 -62.8893 2.08083 +VERTEX2 4677 8.1226 -61.993 2.10643 +VERTEX2 4678 7.60934 -61.1674 2.12334 +VERTEX2 4679 7.00699 -60.3809 2.11486 +VERTEX2 4680 6.50064 -59.5698 2.10874 +VERTEX2 4681 5.61198 -60.0808 -2.58517 +VERTEX2 4682 4.76397 -60.6674 -2.58208 +VERTEX2 4683 3.92567 -61.1387 -2.59254 +VERTEX2 4684 3.07833 -61.6221 -2.61705 +VERTEX2 4685 2.25405 -62.1226 -2.61103 +VERTEX2 4686 2.62805 -62.963 -1.037 +VERTEX2 4687 3.15716 -63.8296 -1.02195 +VERTEX2 4688 3.72116 -64.7134 -1.03469 +VERTEX2 4689 4.27108 -65.6426 -1.04093 +VERTEX2 4690 4.75841 -66.5534 -1.01918 +VERTEX2 4691 5.49935 -65.9898 0.554139 +VERTEX2 4692 6.3196 -65.4473 0.571166 +VERTEX2 4693 7.21672 -64.9016 0.535356 +VERTEX2 4694 8.14301 -64.4705 0.537786 +VERTEX2 4695 8.95996 -63.8646 0.563509 +VERTEX2 4696 8.35403 -63.0158 2.14957 +VERTEX2 4697 7.7547 -62.1122 2.13501 +VERTEX2 4698 7.28118 -61.3217 2.10564 +VERTEX2 4699 6.77312 -60.5619 2.10465 +VERTEX2 4700 6.19015 -59.7586 2.10337 +VERTEX2 4701 5.29959 -60.2797 -2.61252 +VERTEX2 4702 4.49123 -60.8251 -2.62773 +VERTEX2 4703 3.56332 -61.3688 -2.63495 +VERTEX2 4704 2.67247 -61.9215 -2.64297 +VERTEX2 4705 1.79411 -62.4124 -2.62452 +VERTEX2 4706 1.27678 -61.6332 2.07761 +VERTEX2 4707 0.698814 -60.6849 2.11911 +VERTEX2 4708 0.201039 -59.8621 2.10618 +VERTEX2 4709 -0.261157 -58.9968 2.11423 +VERTEX2 4710 -0.779909 -58.1206 2.14341 +VERTEX2 4711 0.0479509 -57.6472 0.595683 +VERTEX2 4712 0.899512 -57.1176 0.624674 +VERTEX2 4713 1.73052 -56.4797 0.596791 +VERTEX2 4714 2.58559 -55.8811 0.592237 +VERTEX2 4715 3.513 -55.292 0.587109 +VERTEX2 4716 2.95882 -54.5077 2.15108 +VERTEX2 4717 2.3639 -53.6557 2.15476 +VERTEX2 4718 1.82969 -52.7473 2.17347 +VERTEX2 4719 1.31028 -51.8695 2.1875 +VERTEX2 4720 0.635333 -51.1004 2.2158 +VERTEX2 4721 1.43785 -50.5294 0.645777 +VERTEX2 4722 2.35269 -49.9218 0.626871 +VERTEX2 4723 3.20017 -49.3471 0.612349 +VERTEX2 4724 4.03635 -48.8068 0.617581 +VERTEX2 4725 4.77278 -48.2046 0.593099 +VERTEX2 4726 4.22959 -47.3837 2.15867 +VERTEX2 4727 3.6987 -46.527 2.19207 +VERTEX2 4728 3.13249 -45.6757 2.20497 +VERTEX2 4729 2.58012 -44.8136 2.19131 +VERTEX2 4730 2.00264 -44.0223 2.1977 +VERTEX2 4731 1.19752 -44.6038 -2.51277 +VERTEX2 4732 0.375092 -45.1516 -2.53075 +VERTEX2 4733 -0.36446 -45.6968 -2.53352 +VERTEX2 4734 -1.21002 -46.3134 -2.54622 +VERTEX2 4735 -2.02643 -46.8075 -2.55997 +VERTEX2 4736 -2.55473 -46.002 2.16764 +VERTEX2 4737 -3.11306 -45.1966 2.13837 +VERTEX2 4738 -3.70263 -44.3496 2.16416 +VERTEX2 4739 -4.30107 -43.5139 2.17585 +VERTEX2 4740 -4.86705 -42.6886 2.21817 +VERTEX2 4741 -5.63988 -43.3227 -2.50503 +VERTEX2 4742 -6.50902 -43.8631 -2.5172 +VERTEX2 4743 -7.34817 -44.4365 -2.53151 +VERTEX2 4744 -8.16539 -44.9684 -2.52552 +VERTEX2 4745 -9.00938 -45.5048 -2.50075 +VERTEX2 4746 -8.49057 -46.2803 -0.919025 +VERTEX2 4747 -7.93722 -47.0818 -0.906064 +VERTEX2 4748 -7.33856 -47.8939 -0.925139 +VERTEX2 4749 -6.71571 -48.6997 -0.884337 +VERTEX2 4750 -6.03973 -49.4607 -0.910685 +VERTEX2 4751 -5.25421 -48.8406 0.696258 +VERTEX2 4752 -4.47401 -48.2067 0.691408 +VERTEX2 4753 -3.64071 -47.5385 0.681243 +VERTEX2 4754 -2.86022 -46.8322 0.669474 +VERTEX2 4755 -2.05962 -46.1932 0.688112 +VERTEX2 4756 -1.46789 -47.0605 -0.869649 +VERTEX2 4757 -0.785849 -47.9092 -0.904679 +VERTEX2 4758 -0.210626 -48.6906 -0.894866 +VERTEX2 4759 0.494879 -49.476 -0.913067 +VERTEX2 4760 1.17655 -50.2543 -0.926645 +VERTEX2 4761 1.9042 -49.6826 0.662213 +VERTEX2 4762 2.65657 -49.0963 0.661173 +VERTEX2 4763 3.44721 -48.5402 0.683902 +VERTEX2 4764 4.15708 -47.8568 0.702786 +VERTEX2 4765 4.90126 -47.2595 0.676911 +VERTEX2 4766 5.6409 -48.0444 -0.927351 +VERTEX2 4767 6.15561 -48.7672 -0.893006 +VERTEX2 4768 6.85517 -49.5343 -0.861239 +VERTEX2 4769 7.46924 -50.32 -0.83282 +VERTEX2 4770 8.09461 -51.0328 -0.856446 +VERTEX2 4771 8.83177 -50.3451 0.739283 +VERTEX2 4772 9.6306 -49.6535 0.744455 +VERTEX2 4773 10.3428 -48.9323 0.754012 +VERTEX2 4774 11.0089 -48.2896 0.732999 +VERTEX2 4775 11.7535 -47.6744 0.708544 +VERTEX2 4776 12.4033 -48.3204 -0.856677 +VERTEX2 4777 13.0846 -49.1147 -0.894237 +VERTEX2 4778 13.6779 -49.9275 -0.892589 +VERTEX2 4779 14.3553 -50.7347 -0.903454 +VERTEX2 4780 14.9957 -51.5874 -0.911216 +VERTEX2 4781 14.1731 -52.2515 -2.48903 +VERTEX2 4782 13.3637 -52.8489 -2.46244 +VERTEX2 4783 12.5443 -53.4838 -2.48074 +VERTEX2 4784 11.7015 -54.0938 -2.48646 +VERTEX2 4785 10.8393 -54.6026 -2.47534 +VERTEX2 4786 11.524 -55.4737 -0.888157 +VERTEX2 4787 12.1474 -56.2861 -0.90858 +VERTEX2 4788 12.7742 -57.1483 -0.948152 +VERTEX2 4789 13.2866 -57.9439 -0.959259 +VERTEX2 4790 13.8149 -58.7279 -0.972061 +VERTEX2 4791 14.7029 -58.1544 0.608171 +VERTEX2 4792 15.6157 -57.5859 0.592592 +VERTEX2 4793 16.4004 -57.0504 0.607535 +VERTEX2 4794 17.2573 -56.4905 0.621936 +VERTEX2 4795 18.0024 -55.8826 0.613564 +VERTEX2 4796 17.425 -55.0492 2.18607 +VERTEX2 4797 16.8428 -54.1825 2.17231 +VERTEX2 4798 16.2475 -53.3699 2.21069 +VERTEX2 4799 15.6443 -52.5837 2.19949 +VERTEX2 4800 15.0764 -51.7869 2.20251 +VERTEX2 4801 14.336 -52.3636 -2.53969 +VERTEX2 4802 13.5083 -52.8175 -2.53837 +VERTEX2 4803 12.7584 -53.3159 -2.54003 +VERTEX2 4804 11.9161 -53.8939 -2.50387 +VERTEX2 4805 11.1222 -54.4864 -2.53169 +VERTEX2 4806 10.5512 -53.6959 2.1776 +VERTEX2 4807 10.0935 -52.9434 2.21271 +VERTEX2 4808 9.44955 -52.1659 2.23726 +VERTEX2 4809 8.87601 -51.4052 2.22694 +VERTEX2 4810 8.29738 -50.6236 2.25878 +VERTEX2 4811 7.4936 -51.3214 -2.46511 +VERTEX2 4812 6.73383 -52.0244 -2.47772 +VERTEX2 4813 5.91676 -52.6173 -2.46022 +VERTEX2 4814 5.07058 -53.2566 -2.44164 +VERTEX2 4815 4.35167 -53.9258 -2.40112 +VERTEX2 4816 4.99035 -54.7474 -0.820758 +VERTEX2 4817 5.74207 -55.5495 -0.808265 +VERTEX2 4818 6.40362 -56.2297 -0.814156 +VERTEX2 4819 7.12629 -56.876 -0.826015 +VERTEX2 4820 7.773 -57.6642 -0.815631 +VERTEX2 4821 8.54097 -56.9821 0.771491 +VERTEX2 4822 9.2545 -56.218 0.810141 +VERTEX2 4823 9.90638 -55.5055 0.812337 +VERTEX2 4824 10.6525 -54.7186 0.845559 +VERTEX2 4825 11.2934 -53.9233 0.852013 +VERTEX2 4826 10.5366 -53.2577 2.37933 +VERTEX2 4827 9.87136 -52.5955 2.37858 +VERTEX2 4828 9.19526 -51.884 2.3642 +VERTEX2 4829 8.4794 -51.1127 2.38033 +VERTEX2 4830 7.7473 -50.4371 2.37968 +VERTEX2 4831 7.01943 -51.2374 -2.36331 +VERTEX2 4832 6.32621 -51.9363 -2.36098 +VERTEX2 4833 5.6162 -52.638 -2.36282 +VERTEX2 4834 4.83736 -53.3799 -2.37781 +VERTEX2 4835 4.0728 -54.0309 -2.35909 +VERTEX2 4836 4.74362 -54.6586 -0.790894 +VERTEX2 4837 5.46125 -55.4099 -0.805391 +VERTEX2 4838 6.21003 -56.0923 -0.754499 +VERTEX2 4839 6.95445 -56.8041 -0.784107 +VERTEX2 4840 7.67127 -57.4187 -0.814865 +VERTEX2 4841 8.44327 -56.7499 0.73045 +VERTEX2 4842 9.21262 -56.0658 0.719707 +VERTEX2 4843 9.96986 -55.3688 0.72289 +VERTEX2 4844 10.7518 -54.6678 0.748912 +VERTEX2 4845 11.4991 -53.9967 0.763222 +VERTEX2 4846 12.1644 -54.6979 -0.7675 +VERTEX2 4847 12.7978 -55.365 -0.789533 +VERTEX2 4848 13.5096 -56.092 -0.782393 +VERTEX2 4849 14.1761 -56.819 -0.792532 +VERTEX2 4850 14.8756 -57.4984 -0.770318 +VERTEX2 4851 15.5855 -56.7424 0.799679 +VERTEX2 4852 16.2774 -55.9265 0.811588 +VERTEX2 4853 16.9787 -55.2942 0.815129 +VERTEX2 4854 17.6456 -54.5679 0.795801 +VERTEX2 4855 18.3976 -53.9441 0.779372 +VERTEX2 4856 17.6262 -53.2248 2.35983 +VERTEX2 4857 16.9013 -52.4722 2.33466 +VERTEX2 4858 16.1557 -51.6838 2.3481 +VERTEX2 4859 15.5043 -51.0347 2.37583 +VERTEX2 4860 14.8168 -50.2671 2.35819 +VERTEX2 4861 14.0758 -50.9493 -2.35564 +VERTEX2 4862 13.337 -51.6124 -2.36779 +VERTEX2 4863 12.5821 -52.3466 -2.34866 +VERTEX2 4864 11.8866 -52.9859 -2.37673 +VERTEX2 4865 11.1095 -53.6224 -2.3669 +VERTEX2 4866 11.8939 -54.2818 -0.803851 +VERTEX2 4867 12.6386 -54.9983 -0.790404 +VERTEX2 4868 13.4255 -55.7502 -0.775933 +VERTEX2 4869 14.1933 -56.4216 -0.769147 +VERTEX2 4870 14.8903 -57.1517 -0.773201 +VERTEX2 4871 14.2664 -57.9339 -2.36323 +VERTEX2 4872 13.5362 -58.6011 -2.32607 +VERTEX2 4873 12.7933 -59.3927 -2.34812 +VERTEX2 4874 12.1507 -60.1339 -2.33059 +VERTEX2 4875 11.4792 -60.8643 -2.34039 +VERTEX2 4876 12.2381 -61.5774 -0.76354 +VERTEX2 4877 12.9886 -62.2329 -0.747171 +VERTEX2 4878 13.8296 -63.0406 -0.715293 +VERTEX2 4879 14.5753 -63.7217 -0.693861 +VERTEX2 4880 15.3301 -64.3163 -0.7109 +VERTEX2 4881 14.6914 -65.1827 -2.29213 +VERTEX2 4882 14.0124 -65.9288 -2.3208 +VERTEX2 4883 13.3391 -66.7998 -2.32574 +VERTEX2 4884 12.7042 -67.562 -2.29706 +VERTEX2 4885 11.9699 -68.2611 -2.30849 +VERTEX2 4886 12.7165 -69.0068 -0.673402 +VERTEX2 4887 13.5273 -69.6107 -0.643014 +VERTEX2 4888 14.3173 -70.2111 -0.668204 +VERTEX2 4889 15.1107 -70.7841 -0.671282 +VERTEX2 4890 15.9031 -71.393 -0.660835 +VERTEX2 4891 15.2899 -72.1894 -2.25604 +VERTEX2 4892 14.6854 -72.9398 -2.31585 +VERTEX2 4893 13.9562 -73.6439 -2.2587 +VERTEX2 4894 13.3157 -74.4473 -2.24353 +VERTEX2 4895 12.7538 -75.1825 -2.24875 +VERTEX2 4896 13.5174 -75.7447 -0.687845 +VERTEX2 4897 14.3185 -76.3201 -0.716183 +VERTEX2 4898 15.0618 -76.943 -0.766858 +VERTEX2 4899 15.7312 -77.5594 -0.761389 +VERTEX2 4900 16.3313 -78.2741 -0.753417 +VERTEX2 4901 16.9718 -77.5701 0.810697 +VERTEX2 4902 17.5923 -76.8853 0.805013 +VERTEX2 4903 18.2682 -76.2076 0.804338 +VERTEX2 4904 18.8912 -75.4582 0.783004 +VERTEX2 4905 19.6447 -74.7628 0.806646 +VERTEX2 4906 18.8884 -74.0384 2.39374 +VERTEX2 4907 18.1568 -73.3609 2.38183 +VERTEX2 4908 17.4838 -72.6642 2.37408 +VERTEX2 4909 16.75 -72.0101 2.42599 +VERTEX2 4910 15.8738 -71.3182 2.42204 +VERTEX2 4911 15.1884 -72.0494 -2.24403 +VERTEX2 4912 14.5607 -72.7873 -2.24378 +VERTEX2 4913 13.9142 -73.6338 -2.25969 +VERTEX2 4914 13.3024 -74.5031 -2.25152 +VERTEX2 4915 12.6795 -75.2931 -2.244 +VERTEX2 4916 13.5128 -75.9703 -0.672879 +VERTEX2 4917 14.2837 -76.5983 -0.709836 +VERTEX2 4918 15.0288 -77.2288 -0.691293 +VERTEX2 4919 15.8209 -77.9745 -0.689756 +VERTEX2 4920 16.6453 -78.6214 -0.679345 +VERTEX2 4921 17.2156 -77.7642 0.855711 +VERTEX2 4922 17.8305 -76.9711 0.845869 +VERTEX2 4923 18.48 -76.2347 0.835899 +VERTEX2 4924 19.0382 -75.5453 0.773258 +VERTEX2 4925 19.7402 -74.8596 0.747387 +VERTEX2 4926 19.0624 -74.0739 2.33313 +VERTEX2 4927 18.4133 -73.3469 2.31249 +VERTEX2 4928 17.6773 -72.6191 2.33796 +VERTEX2 4929 16.9719 -71.9275 2.31645 +VERTEX2 4930 16.3365 -71.1128 2.29565 +VERTEX2 4931 15.6137 -71.7684 -2.4215 +VERTEX2 4932 14.8418 -72.3501 -2.43113 +VERTEX2 4933 14.108 -72.9687 -2.4366 +VERTEX2 4934 13.2787 -73.5287 -2.42939 +VERTEX2 4935 12.5675 -74.2118 -2.43457 +VERTEX2 4936 11.889 -73.394 2.28259 +VERTEX2 4937 11.3164 -72.7038 2.29553 +VERTEX2 4938 10.6509 -72.03 2.28307 +VERTEX2 4939 9.9583 -71.244 2.28957 +VERTEX2 4940 9.32599 -70.5192 2.31843 +VERTEX2 4941 10.0578 -69.881 0.732102 +VERTEX2 4942 10.78 -69.2654 0.715239 +VERTEX2 4943 11.5758 -68.6487 0.712107 +VERTEX2 4944 12.3211 -68.0512 0.72646 +VERTEX2 4945 13.0364 -67.3567 0.693861 +VERTEX2 4946 13.675 -68.0862 -0.885859 +VERTEX2 4947 14.3026 -68.8195 -0.900957 +VERTEX2 4948 14.9256 -69.567 -0.89932 +VERTEX2 4949 15.5379 -70.4349 -0.917236 +VERTEX2 4950 16.2334 -71.2196 -0.933464 +VERTEX2 4951 17.0628 -70.611 0.650604 +VERTEX2 4952 17.8291 -69.8847 0.63282 +VERTEX2 4953 18.5583 -69.2884 0.604401 +VERTEX2 4954 19.3546 -68.725 0.640839 +VERTEX2 4955 20.1355 -68.1448 0.64548 +VERTEX2 4956 19.591 -67.3443 2.21779 +VERTEX2 4957 18.9368 -66.5824 2.24477 +VERTEX2 4958 18.3027 -65.7732 2.2227 +VERTEX2 4959 17.6861 -65.0218 2.20357 +VERTEX2 4960 17.1119 -64.2069 2.22626 +VERTEX2 4961 16.2168 -64.821 -2.47028 +VERTEX2 4962 15.4265 -65.491 -2.46023 +VERTEX2 4963 14.6418 -66.0524 -2.45151 +VERTEX2 4964 13.897 -66.6124 -2.47358 +VERTEX2 4965 13.0842 -67.2021 -2.46765 +VERTEX2 4966 12.4399 -66.4183 2.26325 +VERTEX2 4967 11.794 -65.622 2.24364 +VERTEX2 4968 11.2032 -64.8729 2.21493 +VERTEX2 4969 10.6942 -64.0653 2.20831 +VERTEX2 4970 10.055 -63.2202 2.20567 +VERTEX2 4971 10.8565 -62.5952 0.648626 +VERTEX2 4972 11.5761 -61.9939 0.613353 +VERTEX2 4973 12.3223 -61.3803 0.614904 +VERTEX2 4974 13.035 -60.7238 0.607027 +VERTEX2 4975 13.8212 -60.1202 0.615421 +VERTEX2 4976 13.2356 -59.3269 2.18068 +VERTEX2 4977 12.6449 -58.5696 2.19652 +VERTEX2 4978 12.1183 -57.6956 2.18731 +VERTEX2 4979 11.6052 -56.917 2.17333 +VERTEX2 4980 11.0666 -56.0699 2.1977 +VERTEX2 4981 10.2989 -56.6212 -2.50158 +VERTEX2 4982 9.50476 -57.1915 -2.50382 +VERTEX2 4983 8.79153 -57.7131 -2.50885 +VERTEX2 4984 7.97961 -58.2768 -2.50877 +VERTEX2 4985 7.15881 -58.9477 -2.50233 +VERTEX2 4986 6.50519 -58.2517 2.23269 +VERTEX2 4987 5.85992 -57.4072 2.2456 +VERTEX2 4988 5.23486 -56.522 2.26271 +VERTEX2 4989 4.5299 -55.7709 2.24907 +VERTEX2 4990 3.9361 -54.971 2.25064 +VERTEX2 4991 3.11353 -55.6356 -2.50876 +VERTEX2 4992 2.26549 -56.2341 -2.49398 +VERTEX2 4993 1.44627 -56.82 -2.48962 +VERTEX2 4994 0.688531 -57.3415 -2.48786 +VERTEX2 4995 -0.13343 -57.8988 -2.47913 +VERTEX2 4996 0.551213 -58.7567 -0.932949 +VERTEX2 4997 1.10131 -59.4832 -0.926021 +VERTEX2 4998 1.55728 -60.2744 -0.954977 +VERTEX2 4999 2.27321 -61.0033 -0.917979 +VERTEX2 5000 2.8533 -61.7671 -0.925571 +VERTEX2 5001 3.6778 -61.1884 0.649814 +VERTEX2 5002 4.53225 -60.6833 0.663814 +VERTEX2 5003 5.24538 -60.0464 0.662342 +VERTEX2 5004 6.04476 -59.4385 0.654399 +VERTEX2 5005 6.79361 -58.7574 0.677668 +VERTEX2 5006 7.42803 -59.5221 -0.930746 +VERTEX2 5007 8.04681 -60.2788 -0.933136 +VERTEX2 5008 8.76955 -61.1032 -0.887246 +VERTEX2 5009 9.34863 -61.8157 -0.897623 +VERTEX2 5010 10.0189 -62.6573 -0.901867 +VERTEX2 5011 10.8352 -62.0043 0.672716 +VERTEX2 5012 11.5926 -61.4527 0.664797 +VERTEX2 5013 12.3765 -60.9171 0.632973 +VERTEX2 5014 13.1547 -60.2651 0.634288 +VERTEX2 5015 13.9635 -59.6521 0.638012 +VERTEX2 5016 13.3546 -58.891 2.2052 +VERTEX2 5017 12.7439 -58.0651 2.2166 +VERTEX2 5018 12.2337 -57.2706 2.2103 +VERTEX2 5019 11.5824 -56.5188 2.19982 +VERTEX2 5020 10.878 -55.6943 2.17544 +VERTEX2 5021 9.9591 -56.2748 -2.54185 +VERTEX2 5022 9.11242 -56.81 -2.58056 +VERTEX2 5023 8.21724 -57.3071 -2.57699 +VERTEX2 5024 7.38639 -57.8446 -2.59371 +VERTEX2 5025 6.65167 -58.3137 -2.58626 +VERTEX2 5026 6.16101 -57.4939 2.10942 +VERTEX2 5027 5.68711 -56.5643 2.05671 +VERTEX2 5028 5.28765 -55.7294 2.05187 +VERTEX2 5029 4.85949 -54.8503 2.03083 +VERTEX2 5030 4.48141 -53.8812 2.01017 +VERTEX2 5031 3.65193 -54.2256 -2.7053 +VERTEX2 5032 2.6278 -54.682 -2.71054 +VERTEX2 5033 1.67608 -55.0312 -2.70487 +VERTEX2 5034 0.697763 -55.4993 -2.67245 +VERTEX2 5035 -0.237826 -55.8948 -2.66455 +VERTEX2 5036 0.117862 -56.8203 -1.09804 +VERTEX2 5037 0.5763 -57.7286 -1.09672 +VERTEX2 5038 1.06593 -58.579 -1.10353 +VERTEX2 5039 1.48284 -59.42 -1.0822 +VERTEX2 5040 1.87752 -60.2884 -1.11134 +VERTEX2 5041 2.83406 -59.8548 0.477361 +VERTEX2 5042 3.71752 -59.4033 0.479488 +VERTEX2 5043 4.6171 -58.9568 0.492269 +VERTEX2 5044 5.45719 -58.4617 0.501039 +VERTEX2 5045 6.22352 -57.9992 0.48338 +VERTEX2 5046 5.83108 -57.1023 2.05161 +VERTEX2 5047 5.30874 -56.2962 2.04542 +VERTEX2 5048 4.84579 -55.3531 2.05571 +VERTEX2 5049 4.26974 -54.4719 2.05569 +VERTEX2 5050 3.8181 -53.4941 2.04186 +VERTEX2 5051 2.91681 -53.849 -2.6758 +VERTEX2 5052 1.99999 -54.3158 -2.6755 +VERTEX2 5053 1.11403 -54.8233 -2.68864 +VERTEX2 5054 0.224667 -55.3299 -2.67647 +VERTEX2 5055 -0.693033 -55.8644 -2.69626 +VERTEX2 5056 -0.252401 -56.7585 -1.10845 +VERTEX2 5057 0.220464 -57.7084 -1.10836 +VERTEX2 5058 0.725857 -58.702 -1.10928 +VERTEX2 5059 1.16702 -59.5535 -1.10224 +VERTEX2 5060 1.5499 -60.469 -1.10192 +VERTEX2 5061 2.37383 -59.9148 0.452606 +VERTEX2 5062 3.26551 -59.4402 0.460283 +VERTEX2 5063 4.10098 -59.0242 0.463289 +VERTEX2 5064 5.07182 -58.5684 0.457477 +VERTEX2 5065 6.02809 -58.1249 0.461979 +VERTEX2 5066 6.45629 -59.0236 -1.14406 +VERTEX2 5067 6.81709 -59.9271 -1.17194 +VERTEX2 5068 7.24216 -60.7963 -1.14443 +VERTEX2 5069 7.6622 -61.7217 -1.15424 +VERTEX2 5070 8.04508 -62.6144 -1.16832 +VERTEX2 5071 8.94801 -62.284 0.405336 +VERTEX2 5072 9.95382 -61.8347 0.431883 +VERTEX2 5073 10.8634 -61.3819 0.441658 +VERTEX2 5074 11.8546 -60.9632 0.466718 +VERTEX2 5075 12.7488 -60.4878 0.468593 +VERTEX2 5076 13.197 -61.2921 -1.11971 +VERTEX2 5077 13.6615 -62.2188 -1.12413 +VERTEX2 5078 14.0456 -63.0749 -1.13543 +VERTEX2 5079 14.4748 -63.9771 -1.11874 +VERTEX2 5080 14.8725 -64.8523 -1.11739 +VERTEX2 5081 15.6613 -64.3677 0.474751 +VERTEX2 5082 16.5124 -63.8878 0.485436 +VERTEX2 5083 17.399 -63.3995 0.505104 +VERTEX2 5084 18.3012 -62.943 0.484434 +VERTEX2 5085 19.2233 -62.4287 0.471356 +VERTEX2 5086 18.8012 -61.5645 2.03011 +VERTEX2 5087 18.3327 -60.6754 2.03297 +VERTEX2 5088 17.933 -59.7146 2.0374 +VERTEX2 5089 17.408 -58.8273 2.08809 +VERTEX2 5090 16.9361 -57.8785 2.08827 +VERTEX2 5091 17.7807 -57.4093 0.532814 +VERTEX2 5092 18.6081 -56.9586 0.530842 +VERTEX2 5093 19.4939 -56.4625 0.538829 +VERTEX2 5094 20.3594 -55.9607 0.544952 +VERTEX2 5095 21.2885 -55.3936 0.531396 +VERTEX2 5096 20.8032 -54.5173 2.12038 +VERTEX2 5097 20.2474 -53.7582 2.12813 +VERTEX2 5098 19.7729 -52.7935 2.12658 +VERTEX2 5099 19.2862 -51.8976 2.15092 +VERTEX2 5100 18.7813 -51.04 2.16296 +VERTEX2 5101 17.8953 -51.5497 -2.55606 +VERTEX2 5102 17.0433 -52.1224 -2.56112 +VERTEX2 5103 16.1616 -52.6536 -2.5812 +VERTEX2 5104 15.2876 -53.24 -2.55826 +VERTEX2 5105 14.367 -53.7054 -2.62608 +VERTEX2 5106 14.8485 -54.5074 -1.09338 +VERTEX2 5107 15.3695 -55.3995 -1.0707 +VERTEX2 5108 15.8102 -56.2145 -1.1024 +VERTEX2 5109 16.3023 -57.1641 -1.13103 +VERTEX2 5110 16.6529 -58.0812 -1.09236 +VERTEX2 5111 17.5421 -57.6137 0.444075 +VERTEX2 5112 18.4457 -57.2429 0.42371 +VERTEX2 5113 19.414 -56.8383 0.447015 +VERTEX2 5114 20.3305 -56.4917 0.431146 +VERTEX2 5115 21.2229 -56.1061 0.422809 +VERTEX2 5116 21.6926 -56.9208 -1.12527 +VERTEX2 5117 22.1493 -57.748 -1.09981 +VERTEX2 5118 22.5769 -58.672 -1.08605 +VERTEX2 5119 23.1006 -59.5399 -1.0454 +VERTEX2 5120 23.6247 -60.3659 -1.06763 +VERTEX2 5121 24.5107 -59.8432 0.507138 +VERTEX2 5122 25.4375 -59.3354 0.527482 +VERTEX2 5123 26.2886 -58.8817 0.548296 +VERTEX2 5124 27.1807 -58.3557 0.563265 +VERTEX2 5125 28.0098 -57.8734 0.568303 +VERTEX2 5126 27.4637 -57.0586 2.13348 +VERTEX2 5127 26.973 -56.142 2.11837 +VERTEX2 5128 26.4582 -55.2911 2.12094 +VERTEX2 5129 25.9707 -54.4083 2.10876 +VERTEX2 5130 25.3829 -53.7011 2.1546 +VERTEX2 5131 24.5596 -54.2746 -2.54701 +VERTEX2 5132 23.7384 -54.7926 -2.54554 +VERTEX2 5133 22.8738 -55.3931 -2.52673 +VERTEX2 5134 21.9996 -55.9463 -2.54453 +VERTEX2 5135 21.2219 -56.5404 -2.55121 +VERTEX2 5136 20.676 -55.6796 2.19046 +VERTEX2 5137 20.1158 -54.8246 2.18479 +VERTEX2 5138 19.5725 -53.9507 2.21319 +VERTEX2 5139 18.9164 -53.1277 2.19157 +VERTEX2 5140 18.2696 -52.4009 2.18325 +VERTEX2 5141 17.5097 -52.9245 -2.51782 +VERTEX2 5142 16.7134 -53.5159 -2.55477 +VERTEX2 5143 15.8501 -54.0073 -2.5318 +VERTEX2 5144 14.9684 -54.5984 -2.5719 +VERTEX2 5145 14.1205 -55.2551 -2.59282 +VERTEX2 5146 14.6137 -56.0884 -0.996661 +VERTEX2 5147 15.0905 -56.941 -0.983541 +VERTEX2 5148 15.6879 -57.7605 -0.981511 +VERTEX2 5149 16.2318 -58.5985 -1.00648 +VERTEX2 5150 16.8238 -59.3949 -0.99481 +VERTEX2 5151 17.6487 -58.8154 0.579106 +VERTEX2 5152 18.5168 -58.3005 0.534854 +VERTEX2 5153 19.3869 -57.8063 0.5057 +VERTEX2 5154 20.14 -57.2397 0.503887 +VERTEX2 5155 21.1175 -56.7255 0.508323 +VERTEX2 5156 20.682 -55.8323 2.08413 +VERTEX2 5157 20.1761 -54.9766 2.11738 +VERTEX2 5158 19.6691 -54.1525 2.14498 +VERTEX2 5159 19.0847 -53.2775 2.16736 +VERTEX2 5160 18.4616 -52.4442 2.19244 +VERTEX2 5161 19.2183 -51.9363 0.636296 +VERTEX2 5162 20.0305 -51.3913 0.638798 +VERTEX2 5163 20.8207 -50.8001 0.65211 +VERTEX2 5164 21.6191 -50.1217 0.639714 +VERTEX2 5165 22.4506 -49.4262 0.672179 +VERTEX2 5166 23.0877 -50.2876 -0.85461 +VERTEX2 5167 23.8446 -50.9783 -0.836466 +VERTEX2 5168 24.5407 -51.7009 -0.860448 +VERTEX2 5169 25.1843 -52.5372 -0.904741 +VERTEX2 5170 25.8959 -53.2671 -0.866374 +VERTEX2 5171 26.6028 -52.568 0.709843 +VERTEX2 5172 27.2948 -51.8906 0.689844 +VERTEX2 5173 28.0927 -51.2303 0.659767 +VERTEX2 5174 28.8638 -50.5343 0.663098 +VERTEX2 5175 29.588 -49.9973 0.658137 +VERTEX2 5176 30.2303 -50.6521 -0.91766 +VERTEX2 5177 30.8341 -51.4776 -0.912771 +VERTEX2 5178 31.4519 -52.2893 -0.92422 +VERTEX2 5179 31.9834 -53.0707 -0.924689 +VERTEX2 5180 32.6078 -53.9642 -0.910857 +VERTEX2 5181 33.373 -53.3311 0.672085 +VERTEX2 5182 34.1654 -52.7649 0.643956 +VERTEX2 5183 34.9008 -52.1252 0.674701 +VERTEX2 5184 35.6299 -51.5813 0.674542 +VERTEX2 5185 36.4729 -50.9261 0.687491 +VERTEX2 5186 35.7625 -50.2289 2.25241 +VERTEX2 5187 35.1933 -49.4426 2.26558 +VERTEX2 5188 34.5436 -48.6978 2.30003 +VERTEX2 5189 33.8595 -47.9264 2.30285 +VERTEX2 5190 33.1609 -47.1657 2.27892 +VERTEX2 5191 32.3696 -47.7933 -2.45005 +VERTEX2 5192 31.5636 -48.3545 -2.44927 +VERTEX2 5193 30.7573 -49.0331 -2.45287 +VERTEX2 5194 29.9527 -49.6562 -2.45622 +VERTEX2 5195 29.1217 -50.2181 -2.46536 +VERTEX2 5196 29.7201 -50.8884 -0.903007 +VERTEX2 5197 30.2958 -51.6511 -0.90348 +VERTEX2 5198 30.9055 -52.4189 -0.926583 +VERTEX2 5199 31.5672 -53.2526 -0.928863 +VERTEX2 5200 32.2312 -54.1135 -0.932249 +VERTEX2 5201 33.0567 -53.5213 0.630502 +VERTEX2 5202 33.9014 -52.9015 0.600752 +VERTEX2 5203 34.712 -52.3313 0.597881 +VERTEX2 5204 35.5661 -51.7192 0.605347 +VERTEX2 5205 36.4439 -51.2478 0.634483 +VERTEX2 5206 35.8348 -50.4147 2.16991 +VERTEX2 5207 35.2179 -49.598 2.14944 +VERTEX2 5208 34.5907 -48.7906 2.15595 +VERTEX2 5209 34.1072 -47.8951 2.17479 +VERTEX2 5210 33.5526 -47.0086 2.17682 +VERTEX2 5211 32.7741 -47.5261 -2.5245 +VERTEX2 5212 31.9571 -48.1101 -2.53771 +VERTEX2 5213 31.1117 -48.6028 -2.53391 +VERTEX2 5214 30.3024 -49.1743 -2.54626 +VERTEX2 5215 29.5549 -49.7494 -2.5214 +VERTEX2 5216 28.9586 -48.9273 2.17834 +VERTEX2 5217 28.316 -48.043 2.20522 +VERTEX2 5218 27.7377 -47.2807 2.19904 +VERTEX2 5219 27.1633 -46.5688 2.22185 +VERTEX2 5220 26.4828 -45.7238 2.20444 +VERTEX2 5221 25.6793 -46.2269 -2.47634 +VERTEX2 5222 24.921 -46.8066 -2.48976 +VERTEX2 5223 24.0872 -47.4109 -2.48839 +VERTEX2 5224 23.3081 -48.0329 -2.46365 +VERTEX2 5225 22.4416 -48.6465 -2.45619 +VERTEX2 5226 21.7899 -47.8544 2.26129 +VERTEX2 5227 21.0476 -47.1553 2.27207 +VERTEX2 5228 20.453 -46.3569 2.29958 +VERTEX2 5229 19.7946 -45.5432 2.33525 +VERTEX2 5230 19.1635 -44.8031 2.35841 +VERTEX2 5231 19.9233 -44.0717 0.798498 +VERTEX2 5232 20.6216 -43.2897 0.786405 +VERTEX2 5233 21.3238 -42.6238 0.824428 +VERTEX2 5234 21.9119 -41.9289 0.818723 +VERTEX2 5235 22.5769 -41.178 0.793992 +VERTEX2 5236 21.8124 -40.5012 2.34555 +VERTEX2 5237 21.0733 -39.7432 2.32683 +VERTEX2 5238 20.4801 -38.9671 2.32903 +VERTEX2 5239 19.7543 -38.2199 2.32909 +VERTEX2 5240 19.0587 -37.4915 2.2874 +VERTEX2 5241 18.3819 -38.1307 -2.42026 +VERTEX2 5242 17.5907 -38.6923 -2.41483 +VERTEX2 5243 16.8768 -39.4066 -2.4077 +VERTEX2 5244 16.1083 -40.1117 -2.40173 +VERTEX2 5245 15.3697 -40.8573 -2.40163 +VERTEX2 5246 16.0719 -41.567 -0.833528 +VERTEX2 5247 16.9033 -42.3673 -0.853071 +VERTEX2 5248 17.4404 -43.1779 -0.870649 +VERTEX2 5249 18.0506 -43.9501 -0.866601 +VERTEX2 5250 18.6831 -44.6963 -0.870933 +VERTEX2 5251 19.4872 -44.0499 0.689968 +VERTEX2 5252 20.2358 -43.4303 0.72517 +VERTEX2 5253 21.0391 -42.7993 0.709845 +VERTEX2 5254 21.753 -42.0749 0.7303 +VERTEX2 5255 22.5544 -41.4569 0.731534 +VERTEX2 5256 23.2163 -42.2302 -0.81977 +VERTEX2 5257 23.9125 -42.8803 -0.828714 +VERTEX2 5258 24.5134 -43.6257 -0.829183 +VERTEX2 5259 25.1681 -44.4343 -0.859932 +VERTEX2 5260 25.8455 -45.2851 -0.862443 +VERTEX2 5261 25.0115 -45.8859 -2.47343 +VERTEX2 5262 24.2945 -46.4733 -2.48466 +VERTEX2 5263 23.4813 -47.03 -2.50459 +VERTEX2 5264 22.6208 -47.6724 -2.49216 +VERTEX2 5265 21.7909 -48.3729 -2.51834 +VERTEX2 5266 22.4105 -49.1454 -0.945124 +VERTEX2 5267 23.0486 -49.8805 -0.925485 +VERTEX2 5268 23.7042 -50.543 -0.892167 +VERTEX2 5269 24.3147 -51.3629 -0.907544 +VERTEX2 5270 24.9619 -52.2227 -0.924486 +VERTEX2 5271 25.7498 -51.6072 0.628993 +VERTEX2 5272 26.4823 -50.9847 0.632859 +VERTEX2 5273 27.3161 -50.3887 0.625573 +VERTEX2 5274 28.0343 -49.7944 0.643618 +VERTEX2 5275 28.8056 -49.225 0.660884 +VERTEX2 5276 28.2434 -48.4885 2.21142 +VERTEX2 5277 27.6807 -47.775 2.22379 +VERTEX2 5278 27.1289 -47.0138 2.23523 +VERTEX2 5279 26.583 -46.1913 2.20782 +VERTEX2 5280 25.9959 -45.429 2.2196 +VERTEX2 5281 25.2107 -46.0178 -2.48952 +VERTEX2 5282 24.4097 -46.6193 -2.50031 +VERTEX2 5283 23.6956 -47.1851 -2.46497 +VERTEX2 5284 22.997 -47.8589 -2.47616 +VERTEX2 5285 22.2926 -48.4383 -2.46002 +VERTEX2 5286 22.9639 -49.2606 -0.860456 +VERTEX2 5287 23.6242 -50.065 -0.866074 +VERTEX2 5288 24.2374 -50.8681 -0.853407 +VERTEX2 5289 24.9184 -51.6618 -0.88285 +VERTEX2 5290 25.6032 -52.5128 -0.914106 +VERTEX2 5291 26.3385 -51.907 0.671935 +VERTEX2 5292 27.1618 -51.2359 0.653954 +VERTEX2 5293 27.8954 -50.6979 0.655867 +VERTEX2 5294 28.6853 -50.0789 0.656417 +VERTEX2 5295 29.4446 -49.5525 0.644098 +VERTEX2 5296 28.8684 -48.6843 2.20715 +VERTEX2 5297 28.266 -47.8655 2.18583 +VERTEX2 5298 27.6471 -46.9523 2.15254 +VERTEX2 5299 27.1355 -46.2676 2.17497 +VERTEX2 5300 26.514 -45.5127 2.18546 +VERTEX2 5301 27.2821 -45.0246 0.595726 +VERTEX2 5302 28.2185 -44.3933 0.58769 +VERTEX2 5303 29.1064 -43.9073 0.55446 +VERTEX2 5304 29.9569 -43.3437 0.590725 +VERTEX2 5305 30.7575 -42.8088 0.59359 +VERTEX2 5306 30.198 -41.995 2.15999 +VERTEX2 5307 29.5977 -41.069 2.19613 +VERTEX2 5308 28.9979 -40.334 2.1811 +VERTEX2 5309 28.4174 -39.5401 2.17811 +VERTEX2 5310 27.774 -38.7326 2.219 +VERTEX2 5311 26.9544 -39.3306 -2.49614 +VERTEX2 5312 26.1231 -39.9 -2.46364 +VERTEX2 5313 25.3296 -40.552 -2.45551 +VERTEX2 5314 24.5767 -41.1852 -2.46935 +VERTEX2 5315 23.845 -41.8369 -2.45778 +VERTEX2 5316 23.2706 -40.9771 2.25749 +VERTEX2 5317 22.5758 -40.1955 2.2513 +VERTEX2 5318 22.026 -39.3989 2.25789 +VERTEX2 5319 21.3995 -38.5252 2.2709 +VERTEX2 5320 20.6788 -37.7863 2.24343 +VERTEX2 5321 19.8765 -38.4169 -2.46364 +VERTEX2 5322 18.9908 -39.0289 -2.45386 +VERTEX2 5323 18.1559 -39.601 -2.43026 +VERTEX2 5324 17.358 -40.2174 -2.43479 +VERTEX2 5325 16.6067 -40.8186 -2.40988 +VERTEX2 5326 15.922 -40.1023 2.29284 +VERTEX2 5327 15.2509 -39.4067 2.27704 +VERTEX2 5328 14.5944 -38.7101 2.30233 +VERTEX2 5329 13.9065 -38.0524 2.31773 +VERTEX2 5330 13.2392 -37.3103 2.30504 +VERTEX2 5331 12.5581 -38.0054 -2.37346 +VERTEX2 5332 11.7823 -38.7634 -2.3858 +VERTEX2 5333 11.0727 -39.4436 -2.37791 +VERTEX2 5334 10.356 -40.1111 -2.33705 +VERTEX2 5335 9.73764 -40.7658 -2.33468 +VERTEX2 5336 9.00048 -40.0305 2.35875 +VERTEX2 5337 8.40914 -39.2532 2.34639 +VERTEX2 5338 7.68762 -38.4699 2.33427 +VERTEX2 5339 7.01771 -37.7664 2.37651 +VERTEX2 5340 6.34379 -37.1328 2.40257 +VERTEX2 5341 6.97547 -36.3759 0.809712 +VERTEX2 5342 7.71887 -35.6899 0.799167 +VERTEX2 5343 8.40156 -34.9025 0.802586 +VERTEX2 5344 9.16506 -34.2311 0.810185 +VERTEX2 5345 9.85417 -33.5278 0.836192 +VERTEX2 5346 9.16265 -32.8473 2.36448 +VERTEX2 5347 8.41518 -32.0816 2.36127 +VERTEX2 5348 7.56959 -31.447 2.35891 +VERTEX2 5349 6.80744 -30.7157 2.3743 +VERTEX2 5350 6.20923 -29.9574 2.38818 +VERTEX2 5351 5.52584 -30.7266 -2.33038 +VERTEX2 5352 4.89138 -31.4623 -2.30181 +VERTEX2 5353 4.24469 -32.1874 -2.30568 +VERTEX2 5354 3.5503 -32.9849 -2.30854 +VERTEX2 5355 2.90314 -33.7039 -2.34163 +VERTEX2 5356 3.60999 -34.3626 -0.76903 +VERTEX2 5357 4.32119 -35.0778 -0.787564 +VERTEX2 5358 5.07922 -35.7817 -0.808837 +VERTEX2 5359 5.6973 -36.5794 -0.816603 +VERTEX2 5360 6.34497 -37.3026 -0.817438 +VERTEX2 5361 7.11802 -36.6993 0.74778 +VERTEX2 5362 7.86105 -36.0566 0.738145 +VERTEX2 5363 8.53165 -35.3311 0.748702 +VERTEX2 5364 9.28891 -34.6008 0.757551 +VERTEX2 5365 10.0023 -33.9216 0.752301 +VERTEX2 5366 9.29631 -33.1439 2.30477 +VERTEX2 5367 8.53909 -32.3522 2.31053 +VERTEX2 5368 7.79853 -31.5068 2.303 +VERTEX2 5369 7.17393 -30.7137 2.2577 +VERTEX2 5370 6.54051 -30.015 2.26031 +VERTEX2 5371 5.77894 -30.7016 -2.44628 +VERTEX2 5372 4.97436 -31.3154 -2.46417 +VERTEX2 5373 4.14944 -31.9511 -2.49152 +VERTEX2 5374 3.37781 -32.5662 -2.48797 +VERTEX2 5375 2.60011 -33.0823 -2.50593 +VERTEX2 5376 3.30177 -33.9023 -0.929871 +VERTEX2 5377 3.8877 -34.7219 -0.931907 +VERTEX2 5378 4.47545 -35.5596 -0.959311 +VERTEX2 5379 5.03274 -36.3398 -0.930857 +VERTEX2 5380 5.61207 -37.1963 -0.939776 +VERTEX2 5381 6.45073 -36.5198 0.635023 +VERTEX2 5382 7.28523 -35.8739 0.625549 +VERTEX2 5383 8.10731 -35.3026 0.635418 +VERTEX2 5384 8.90086 -34.6768 0.674559 +VERTEX2 5385 9.59194 -34.0442 0.681378 +VERTEX2 5386 9.01499 -33.3505 2.25455 +VERTEX2 5387 8.3576 -32.6362 2.27242 +VERTEX2 5388 7.76982 -31.8579 2.24275 +VERTEX2 5389 7.15826 -31.0781 2.23065 +VERTEX2 5390 6.52887 -30.3094 2.21879 +VERTEX2 5391 5.68148 -30.9278 -2.50897 +VERTEX2 5392 4.90532 -31.466 -2.54483 +VERTEX2 5393 4.18371 -31.9771 -2.54909 +VERTEX2 5394 3.32274 -32.567 -2.54984 +VERTEX2 5395 2.48991 -33.0962 -2.53966 +VERTEX2 5396 2.90834 -34.0048 -0.995535 +VERTEX2 5397 3.44309 -34.8125 -1.02059 +VERTEX2 5398 3.90781 -35.719 -1.04953 +VERTEX2 5399 4.37334 -36.5576 -1.057 +VERTEX2 5400 4.93633 -37.4842 -1.04765 +VERTEX2 5401 4.01933 -37.9799 -2.63198 +VERTEX2 5402 3.05174 -38.4988 -2.62908 +VERTEX2 5403 2.18468 -38.9502 -2.61243 +VERTEX2 5404 1.26887 -39.4884 -2.61526 +VERTEX2 5405 0.316709 -39.9615 -2.58893 +VERTEX2 5406 0.786928 -40.8459 -1.00714 +VERTEX2 5407 1.31927 -41.6566 -0.983764 +VERTEX2 5408 1.8055 -42.5124 -0.97469 +VERTEX2 5409 2.41724 -43.3181 -0.972532 +VERTEX2 5410 2.98628 -44.1722 -0.980885 +VERTEX2 5411 2.09566 -44.7321 -2.5463 +VERTEX2 5412 1.19032 -45.311 -2.59234 +VERTEX2 5413 0.326785 -45.6888 -2.60517 +VERTEX2 5414 -0.421539 -46.1928 -2.60903 +VERTEX2 5415 -1.33782 -46.6993 -2.61687 +VERTEX2 5416 -1.79572 -45.797 2.10304 +VERTEX2 5417 -2.3356 -45.0063 2.10163 +VERTEX2 5418 -2.83249 -44.169 2.12753 +VERTEX2 5419 -3.4022 -43.3527 2.12961 +VERTEX2 5420 -3.98925 -42.4868 2.13155 +VERTEX2 5421 -4.83381 -43.0466 -2.56925 +VERTEX2 5422 -5.67037 -43.618 -2.55941 +VERTEX2 5423 -6.49957 -44.1619 -2.52817 +VERTEX2 5424 -7.33054 -44.7354 -2.48731 +VERTEX2 5425 -8.10117 -45.3925 -2.49336 +VERTEX2 5426 -8.76533 -44.4925 2.23984 +VERTEX2 5427 -9.44143 -43.6965 2.25714 +VERTEX2 5428 -10.0687 -42.9068 2.24923 +VERTEX2 5429 -10.7227 -42.0601 2.26903 +VERTEX2 5430 -11.3696 -41.3474 2.26747 +VERTEX2 5431 -12.1334 -41.9318 -2.46555 +VERTEX2 5432 -12.9248 -42.5681 -2.42033 +VERTEX2 5433 -13.566 -43.1993 -2.40409 +VERTEX2 5434 -14.2719 -43.8502 -2.39087 +VERTEX2 5435 -14.9674 -44.4436 -2.41461 +VERTEX2 5436 -14.2784 -45.2969 -0.865458 +VERTEX2 5437 -13.6233 -46.1276 -0.834683 +VERTEX2 5438 -12.9182 -46.9648 -0.813929 +VERTEX2 5439 -12.2535 -47.6483 -0.811643 +VERTEX2 5440 -11.6008 -48.3454 -0.804951 +VERTEX2 5441 -12.3598 -49.0271 -2.32935 +VERTEX2 5442 -13.0695 -49.7293 -2.34356 +VERTEX2 5443 -13.8326 -50.4982 -2.36446 +VERTEX2 5444 -14.4827 -51.2262 -2.31523 +VERTEX2 5445 -15.1206 -52.0228 -2.31259 +VERTEX2 5446 -15.8201 -51.3249 2.44284 +VERTEX2 5447 -16.6074 -50.7092 2.43453 +VERTEX2 5448 -17.3826 -50.0433 2.45169 +VERTEX2 5449 -18.1158 -49.3626 2.46777 +VERTEX2 5450 -18.8875 -48.7385 2.44914 +VERTEX2 5451 -19.5496 -49.5463 -2.25541 +VERTEX2 5452 -20.2309 -50.2674 -2.27682 +VERTEX2 5453 -20.8304 -51.0412 -2.30576 +VERTEX2 5454 -21.4434 -51.9181 -2.29559 +VERTEX2 5455 -22.0727 -52.6238 -2.31344 +VERTEX2 5456 -21.3277 -53.3258 -0.758775 +VERTEX2 5457 -20.6589 -54.0025 -0.763709 +VERTEX2 5458 -19.9395 -54.6738 -0.778762 +VERTEX2 5459 -19.2492 -55.334 -0.761228 +VERTEX2 5460 -18.5363 -56.021 -0.73632 +VERTEX2 5461 -19.1463 -56.7996 -2.29517 +VERTEX2 5462 -19.8219 -57.5799 -2.28485 +VERTEX2 5463 -20.4593 -58.2179 -2.26491 +VERTEX2 5464 -21.1437 -59.0578 -2.26378 +VERTEX2 5465 -21.8247 -59.8226 -2.25845 +VERTEX2 5466 -21.0469 -60.3502 -0.665473 +VERTEX2 5467 -20.2971 -61.0465 -0.619157 +VERTEX2 5468 -19.4428 -61.5491 -0.586575 +VERTEX2 5469 -18.6247 -62.076 -0.594066 +VERTEX2 5470 -17.7791 -62.7032 -0.587471 +VERTEX2 5471 -18.3604 -63.6434 -2.15179 +VERTEX2 5472 -18.8965 -64.4249 -2.1507 +VERTEX2 5473 -19.5151 -65.2707 -2.13799 +VERTEX2 5474 -20.0828 -66.124 -2.12696 +VERTEX2 5475 -20.4913 -67.0272 -2.10346 +VERTEX2 5476 -19.6122 -67.5551 -0.510832 +VERTEX2 5477 -18.7463 -68.0407 -0.444021 +VERTEX2 5478 -17.7907 -68.4652 -0.460865 +VERTEX2 5479 -16.9075 -68.9376 -0.454915 +VERTEX2 5480 -16.0369 -69.3879 -0.454255 +VERTEX2 5481 -15.6432 -68.4893 1.11661 +VERTEX2 5482 -15.1667 -67.5949 1.10504 +VERTEX2 5483 -14.7532 -66.7355 1.12045 +VERTEX2 5484 -14.3114 -65.8546 1.12726 +VERTEX2 5485 -13.8651 -64.9689 1.15214 +VERTEX2 5486 -14.7461 -64.6297 2.72592 +VERTEX2 5487 -15.6499 -64.2034 2.71873 +VERTEX2 5488 -16.5027 -63.8168 2.7113 +VERTEX2 5489 -17.5351 -63.4342 2.71176 +VERTEX2 5490 -18.3622 -62.9075 2.7478 +VERTEX2 5491 -18.7638 -63.883 -1.93901 +VERTEX2 5492 -19.0928 -64.7444 -1.92364 +VERTEX2 5493 -19.4138 -65.7189 -1.93698 +VERTEX2 5494 -19.8109 -66.6506 -1.91558 +VERTEX2 5495 -20.1819 -67.4585 -1.92053 +VERTEX2 5496 -21.0857 -67.1565 2.79947 +VERTEX2 5497 -21.9781 -66.8034 2.79268 +VERTEX2 5498 -22.8332 -66.5116 2.80715 +VERTEX2 5499 -23.7637 -66.2263 2.80371 +VERTEX2 5500 -24.7294 -65.895 2.78902 +VERTEX2 5501 -25.1104 -66.8128 -1.94356 +VERTEX2 5502 -25.5029 -67.7323 -1.91728 +VERTEX2 5503 -25.8365 -68.6717 -1.95214 +VERTEX2 5504 -26.2339 -69.6282 -1.97278 +VERTEX2 5505 -26.571 -70.512 -1.96561 +VERTEX2 5506 -25.5612 -70.8734 -0.39921 +VERTEX2 5507 -24.7554 -71.1599 -0.418421 +VERTEX2 5508 -23.8411 -71.7385 -0.418351 +VERTEX2 5509 -22.9338 -72.1147 -0.43897 +VERTEX2 5510 -22.0135 -72.5938 -0.434726 +VERTEX2 5511 -22.5004 -73.544 -1.99954 +VERTEX2 5512 -22.9958 -74.3611 -1.98784 +VERTEX2 5513 -23.424 -75.3159 -2.01202 +VERTEX2 5514 -23.8397 -76.1152 -1.99672 +VERTEX2 5515 -24.2491 -77.001 -2.01191 +VERTEX2 5516 -23.3336 -77.4141 -0.437996 +VERTEX2 5517 -22.4338 -77.8107 -0.434282 +VERTEX2 5518 -21.6025 -78.1786 -0.427972 +VERTEX2 5519 -20.8028 -78.6588 -0.408697 +VERTEX2 5520 -19.8233 -79.0225 -0.455644 +VERTEX2 5521 -19.3431 -78.2092 1.11931 +VERTEX2 5522 -18.982 -77.2332 1.11303 +VERTEX2 5523 -18.5051 -76.3669 1.16659 +VERTEX2 5524 -18.0979 -75.4406 1.20558 +VERTEX2 5525 -17.6662 -74.6241 1.22828 +VERTEX2 5526 -18.5819 -74.2678 2.78422 +VERTEX2 5527 -19.6333 -73.8765 2.77312 +VERTEX2 5528 -20.5704 -73.4782 2.75311 +VERTEX2 5529 -21.4075 -73.102 2.72786 +VERTEX2 5530 -22.3402 -72.81 2.7454 +VERTEX2 5531 -22.7873 -73.6421 -1.98467 +VERTEX2 5532 -23.2707 -74.6169 -1.9943 +VERTEX2 5533 -23.7202 -75.5118 -1.99573 +VERTEX2 5534 -24.1342 -76.4032 -1.98542 +VERTEX2 5535 -24.4722 -77.2922 -1.99296 +VERTEX2 5536 -23.5569 -77.6525 -0.436495 +VERTEX2 5537 -22.6805 -78.0444 -0.424937 +VERTEX2 5538 -21.7993 -78.4595 -0.403034 +VERTEX2 5539 -20.9355 -78.8637 -0.406641 +VERTEX2 5540 -19.9696 -79.2527 -0.398705 +VERTEX2 5541 -20.3803 -80.1677 -1.9597 +VERTEX2 5542 -20.8131 -81.1027 -1.9459 +VERTEX2 5543 -21.1551 -82.0111 -1.92997 +VERTEX2 5544 -21.4381 -82.91 -1.96934 +VERTEX2 5545 -21.8378 -83.8343 -2.00169 +VERTEX2 5546 -22.5794 -83.3976 2.69382 +VERTEX2 5547 -23.514 -82.9723 2.69875 +VERTEX2 5548 -24.4351 -82.6225 2.6827 +VERTEX2 5549 -25.3145 -82.1758 2.65606 +VERTEX2 5550 -26.2524 -81.7331 2.70302 +VERTEX2 5551 -25.7601 -80.8071 1.1297 +VERTEX2 5552 -25.2725 -79.9894 1.13228 +VERTEX2 5553 -24.8881 -79.1185 1.13408 +VERTEX2 5554 -24.4942 -78.2609 1.15487 +VERTEX2 5555 -24.1262 -77.4038 1.15264 +VERTEX2 5556 -23.127 -77.7938 -0.422485 +VERTEX2 5557 -22.1543 -78.1831 -0.443991 +VERTEX2 5558 -21.2886 -78.6359 -0.470216 +VERTEX2 5559 -20.3087 -79.0389 -0.462826 +VERTEX2 5560 -19.4277 -79.5676 -0.457744 +VERTEX2 5561 -18.9472 -78.6553 1.07794 +VERTEX2 5562 -18.4054 -77.7805 1.03566 +VERTEX2 5563 -18.0267 -76.9886 1.01532 +VERTEX2 5564 -17.5379 -76.1087 1.03197 +VERTEX2 5565 -17.0112 -75.2752 1.01359 +VERTEX2 5566 -17.8826 -74.7128 2.58347 +VERTEX2 5567 -18.7295 -74.0921 2.59639 +VERTEX2 5568 -19.5354 -73.5895 2.57265 +VERTEX2 5569 -20.2732 -72.9972 2.56936 +VERTEX2 5570 -21.0702 -72.5182 2.53686 +VERTEX2 5571 -21.6153 -73.277 -2.15339 +VERTEX2 5572 -22.1707 -74.0639 -2.15715 +VERTEX2 5573 -22.6587 -74.9481 -2.18993 +VERTEX2 5574 -23.1735 -75.7027 -2.2053 +VERTEX2 5575 -23.7685 -76.4725 -2.21321 +VERTEX2 5576 -24.5502 -75.8285 2.50665 +VERTEX2 5577 -25.3277 -75.2669 2.48891 +VERTEX2 5578 -26.0648 -74.6958 2.4803 +VERTEX2 5579 -26.9216 -74.0931 2.49459 +VERTEX2 5580 -27.6749 -73.5731 2.47739 +VERTEX2 5581 -28.2756 -74.4596 -2.22567 +VERTEX2 5582 -28.9694 -75.1819 -2.22902 +VERTEX2 5583 -29.6356 -76.0083 -2.22667 +VERTEX2 5584 -30.3092 -76.8419 -2.2386 +VERTEX2 5585 -30.9027 -77.5931 -2.20783 +VERTEX2 5586 -30.1519 -78.2269 -0.670443 +VERTEX2 5587 -29.4012 -78.9147 -0.688203 +VERTEX2 5588 -28.5873 -79.5708 -0.651261 +VERTEX2 5589 -27.7436 -80.2168 -0.656827 +VERTEX2 5590 -26.9987 -80.8359 -0.695153 +VERTEX2 5591 -26.2663 -80.0463 0.880183 +VERTEX2 5592 -25.6379 -79.2221 0.868641 +VERTEX2 5593 -24.9706 -78.5076 0.875201 +VERTEX2 5594 -24.3458 -77.7257 0.877597 +VERTEX2 5595 -23.7119 -76.8559 0.904122 +VERTEX2 5596 -22.962 -77.4502 -0.666278 +VERTEX2 5597 -22.2162 -78.05 -0.654604 +VERTEX2 5598 -21.4675 -78.6112 -0.656381 +VERTEX2 5599 -20.636 -79.2756 -0.639838 +VERTEX2 5600 -19.831 -79.8682 -0.618839 +VERTEX2 5601 -19.292 -79.0473 0.927276 +VERTEX2 5602 -18.7625 -78.194 0.932024 +VERTEX2 5603 -18.1649 -77.3871 0.947583 +VERTEX2 5604 -17.559 -76.6271 0.94527 +VERTEX2 5605 -16.9203 -75.786 0.941992 +VERTEX2 5606 -17.5814 -75.2662 2.50228 +VERTEX2 5607 -18.4871 -74.6215 2.50668 +VERTEX2 5608 -19.2805 -74.0822 2.52557 +VERTEX2 5609 -20.1497 -73.5203 2.54346 +VERTEX2 5610 -21.0098 -73.0083 2.53598 +VERTEX2 5611 -21.666 -73.8066 -2.19078 +VERTEX2 5612 -22.3051 -74.7042 -2.17543 +VERTEX2 5613 -22.9078 -75.5123 -2.18148 +VERTEX2 5614 -23.4685 -76.415 -2.17255 +VERTEX2 5615 -24.0468 -77.085 -2.20293 +VERTEX2 5616 -24.8336 -76.5642 2.49308 +VERTEX2 5617 -25.6494 -75.9382 2.51669 +VERTEX2 5618 -26.5558 -75.3383 2.5502 +VERTEX2 5619 -27.3766 -74.8125 2.55869 +VERTEX2 5620 -28.1831 -74.2825 2.55043 +VERTEX2 5621 -28.7035 -75.1296 -2.16806 +VERTEX2 5622 -29.232 -75.9213 -2.15599 +VERTEX2 5623 -29.7811 -76.7245 -2.15169 +VERTEX2 5624 -30.2942 -77.6049 -2.14534 +VERTEX2 5625 -30.8282 -78.4246 -2.12633 +VERTEX2 5626 -31.6091 -77.8907 2.60828 +VERTEX2 5627 -32.3695 -77.4399 2.61152 +VERTEX2 5628 -33.2228 -76.9318 2.61005 +VERTEX2 5629 -34.0274 -76.4239 2.6166 +VERTEX2 5630 -34.8735 -75.8826 2.6232 +VERTEX2 5631 -34.4541 -75.0239 1.05602 +VERTEX2 5632 -33.9784 -74.2003 1.02279 +VERTEX2 5633 -33.4668 -73.2765 1.01999 +VERTEX2 5634 -32.9798 -72.4998 0.99926 +VERTEX2 5635 -32.3714 -71.643 0.990251 +VERTEX2 5636 -33.1983 -71.1389 2.54171 +VERTEX2 5637 -33.9899 -70.5241 2.53846 +VERTEX2 5638 -34.8243 -69.918 2.52743 +VERTEX2 5639 -35.6336 -69.3423 2.52738 +VERTEX2 5640 -36.4188 -68.7491 2.5439 +VERTEX2 5641 -35.833 -67.9378 0.986254 +VERTEX2 5642 -35.2948 -67.0134 0.981133 +VERTEX2 5643 -34.6711 -66.1736 0.954496 +VERTEX2 5644 -33.9831 -65.4243 0.933698 +VERTEX2 5645 -33.3331 -64.6262 0.95277 +VERTEX2 5646 -32.471 -65.1625 -0.616855 +VERTEX2 5647 -31.6244 -65.7478 -0.615705 +VERTEX2 5648 -30.7471 -66.3364 -0.611854 +VERTEX2 5649 -29.9343 -66.8831 -0.625546 +VERTEX2 5650 -29.1785 -67.4256 -0.594202 +VERTEX2 5651 -28.6505 -66.5869 1.00061 +VERTEX2 5652 -28.1197 -65.8318 1.01113 +VERTEX2 5653 -27.5806 -65.067 1.01614 +VERTEX2 5654 -27.0969 -64.2397 1.02959 +VERTEX2 5655 -26.5893 -63.3486 1.05139 +VERTEX2 5656 -27.4709 -62.8504 2.63829 +VERTEX2 5657 -28.365 -62.2933 2.66673 +VERTEX2 5658 -29.2176 -61.8584 2.69271 +VERTEX2 5659 -30.1827 -61.4766 2.68155 +VERTEX2 5660 -31.008 -61.1012 2.67828 +VERTEX2 5661 -31.4288 -62.0327 -2.0101 +VERTEX2 5662 -31.871 -62.9432 -2.02678 +VERTEX2 5663 -32.2678 -63.836 -2.02236 +VERTEX2 5664 -32.7646 -64.74 -2.04617 +VERTEX2 5665 -33.2189 -65.6506 -2.00068 +VERTEX2 5666 -32.3829 -66.1334 -0.443177 +VERTEX2 5667 -31.479 -66.5631 -0.440493 +VERTEX2 5668 -30.6038 -66.8785 -0.431885 +VERTEX2 5669 -29.7039 -67.2881 -0.426945 +VERTEX2 5670 -28.8684 -67.6912 -0.422484 +VERTEX2 5671 -29.2849 -68.637 -1.98201 +VERTEX2 5672 -29.7372 -69.575 -1.98312 +VERTEX2 5673 -30.0971 -70.4969 -1.99688 +VERTEX2 5674 -30.5211 -71.4368 -1.9877 +VERTEX2 5675 -30.8944 -72.2617 -1.94136 +VERTEX2 5676 -31.7235 -71.9288 2.79248 +VERTEX2 5677 -32.6624 -71.6595 2.81748 +VERTEX2 5678 -33.5932 -71.3557 2.84532 +VERTEX2 5679 -34.5354 -71.1027 2.87103 +VERTEX2 5680 -35.4266 -70.9044 2.8673 +VERTEX2 5681 -35.6841 -71.8961 -1.82396 +VERTEX2 5682 -36.0013 -72.8578 -1.80386 +VERTEX2 5683 -36.1997 -73.8147 -1.83864 +VERTEX2 5684 -36.6071 -74.7712 -1.81442 +VERTEX2 5685 -36.8545 -75.7675 -1.77325 +VERTEX2 5686 -35.7858 -75.9691 -0.198391 +VERTEX2 5687 -34.7908 -76.2183 -0.161977 +VERTEX2 5688 -33.8648 -76.348 -0.171452 +VERTEX2 5689 -32.8412 -76.5497 -0.176861 +VERTEX2 5690 -31.9104 -76.7642 -0.203602 +VERTEX2 5691 -31.7434 -75.8638 1.35527 +VERTEX2 5692 -31.5409 -74.8863 1.3474 +VERTEX2 5693 -31.3542 -73.8649 1.35172 +VERTEX2 5694 -31.1124 -72.8326 1.34968 +VERTEX2 5695 -30.8956 -71.8244 1.3585 +VERTEX2 5696 -31.8856 -71.6629 2.91312 +VERTEX2 5697 -32.8845 -71.4519 2.91003 +VERTEX2 5698 -33.8307 -71.185 2.93905 +VERTEX2 5699 -34.7419 -70.9648 2.95099 +VERTEX2 5700 -35.6968 -70.7917 2.92599 +VERTEX2 5701 -35.903 -71.7002 -1.76967 +VERTEX2 5702 -36.1343 -72.7133 -1.78791 +VERTEX2 5703 -36.319 -73.6573 -1.80073 +VERTEX2 5704 -36.6285 -74.6275 -1.76028 +VERTEX2 5705 -36.8628 -75.6828 -1.7781 +VERTEX2 5706 -35.8377 -75.8945 -0.162393 +VERTEX2 5707 -34.7252 -76.1215 -0.147863 +VERTEX2 5708 -33.8901 -76.2804 -0.132776 +VERTEX2 5709 -32.9813 -76.3629 -0.140186 +VERTEX2 5710 -31.8661 -76.5658 -0.122736 +VERTEX2 5711 -31.7728 -75.5266 1.43156 +VERTEX2 5712 -31.6726 -74.4917 1.41373 +VERTEX2 5713 -31.5692 -73.5573 1.39144 +VERTEX2 5714 -31.4079 -72.5409 1.41654 +VERTEX2 5715 -31.25 -71.5862 1.3767 +VERTEX2 5716 -32.2855 -71.4233 2.93707 +VERTEX2 5717 -33.292 -71.1783 2.9624 +VERTEX2 5718 -34.2658 -70.9403 2.95801 +VERTEX2 5719 -35.1581 -70.6886 2.95185 +VERTEX2 5720 -36.0867 -70.5836 2.92379 +VERTEX2 5721 -36.2429 -71.5473 -1.7684 +VERTEX2 5722 -36.3357 -72.5849 -1.76606 +VERTEX2 5723 -36.5168 -73.5952 -1.75674 +VERTEX2 5724 -36.7068 -74.5832 -1.773 +VERTEX2 5725 -36.8251 -75.5985 -1.74433 +VERTEX2 5726 -37.9322 -75.4015 2.96761 +VERTEX2 5727 -38.9794 -75.1803 2.99521 +VERTEX2 5728 -39.9756 -74.949 2.99603 +VERTEX2 5729 -40.9793 -74.8089 2.95936 +VERTEX2 5730 -41.9232 -74.6596 2.9608 +VERTEX2 5731 -42.0669 -75.681 -1.7683 +VERTEX2 5732 -42.2411 -76.6556 -1.74296 +VERTEX2 5733 -42.3726 -77.647 -1.75541 +VERTEX2 5734 -42.5459 -78.6084 -1.75924 +VERTEX2 5735 -42.756 -79.5282 -1.73985 +VERTEX2 5736 -41.8032 -79.7263 -0.191261 +VERTEX2 5737 -40.8112 -79.9543 -0.187674 +VERTEX2 5738 -39.869 -80.0883 -0.215503 +VERTEX2 5739 -38.8283 -80.2891 -0.202249 +VERTEX2 5740 -37.8251 -80.4333 -0.159871 +VERTEX2 5741 -37.6436 -79.5216 1.40583 +VERTEX2 5742 -37.5391 -78.5508 1.41712 +VERTEX2 5743 -37.3777 -77.6553 1.40676 +VERTEX2 5744 -37.1945 -76.6202 1.39793 +VERTEX2 5745 -37.0445 -75.6478 1.36934 +VERTEX2 5746 -36.1062 -75.871 -0.164692 +VERTEX2 5747 -35.0909 -75.9939 -0.14685 +VERTEX2 5748 -34.1575 -76.1426 -0.144486 +VERTEX2 5749 -33.2397 -76.2757 -0.143986 +VERTEX2 5750 -32.242 -76.4385 -0.116509 +VERTEX2 5751 -32.085 -75.4164 1.44454 +VERTEX2 5752 -31.941 -74.5737 1.45495 +VERTEX2 5753 -31.8497 -73.5829 1.46093 +VERTEX2 5754 -31.6456 -72.6889 1.46693 +VERTEX2 5755 -31.5919 -71.7312 1.44901 +VERTEX2 5756 -30.6339 -71.8574 -0.121113 +VERTEX2 5757 -29.6035 -71.9326 -0.135719 +VERTEX2 5758 -28.6102 -72.1052 -0.141299 +VERTEX2 5759 -27.6364 -72.2292 -0.139233 +VERTEX2 5760 -26.6031 -72.385 -0.140406 +VERTEX2 5761 -26.5621 -71.4554 1.43016 +VERTEX2 5762 -26.4334 -70.4907 1.43588 +VERTEX2 5763 -26.3153 -69.5446 1.43096 +VERTEX2 5764 -26.1039 -68.5802 1.44533 +VERTEX2 5765 -25.9817 -67.5707 1.46931 +VERTEX2 5766 -26.9288 -67.5002 3.05517 +VERTEX2 5767 -27.911 -67.4817 3.09272 +VERTEX2 5768 -28.9335 -67.4032 3.09399 +VERTEX2 5769 -29.9334 -67.3247 3.0986 +VERTEX2 5770 -30.9441 -67.3144 3.12365 +VERTEX2 5771 -30.9537 -66.3701 1.5813 +VERTEX2 5772 -30.929 -65.3849 1.56301 +VERTEX2 5773 -30.9426 -64.4778 1.58481 +VERTEX2 5774 -30.9618 -63.5413 1.59381 +VERTEX2 5775 -30.9982 -62.5389 1.63217 +VERTEX2 5776 -32.0611 -62.5603 -3.07954 +VERTEX2 5777 -33.1185 -62.5599 -3.07121 +VERTEX2 5778 -34.136 -62.6449 -3.04909 +VERTEX2 5779 -35.1215 -62.6985 -3.03885 +VERTEX2 5780 -36.1002 -62.7855 -3.01918 +VERTEX2 5781 -36.1278 -61.8217 1.64536 +VERTEX2 5782 -36.2636 -60.7319 1.66255 +VERTEX2 5783 -36.3323 -59.7388 1.68582 +VERTEX2 5784 -36.483 -58.7478 1.68665 +VERTEX2 5785 -36.581 -57.7619 1.6671 +VERTEX2 5786 -37.6033 -57.8551 -3.0452 +VERTEX2 5787 -38.6076 -57.9762 -3.04804 +VERTEX2 5788 -39.5884 -58.09 -3.044 +VERTEX2 5789 -40.5303 -58.129 -3.03658 +VERTEX2 5790 -41.4606 -58.3423 -3.08229 +VERTEX2 5791 -41.3515 -59.2931 -1.46855 +VERTEX2 5792 -41.2207 -60.2187 -1.47804 +VERTEX2 5793 -41.1419 -61.2208 -1.46449 +VERTEX2 5794 -41.0603 -62.1781 -1.48083 +VERTEX2 5795 -40.9617 -63.1436 -1.49464 +VERTEX2 5796 -40.0059 -63.1137 0.101979 +VERTEX2 5797 -39.0088 -62.987 0.0883737 +VERTEX2 5798 -38.032 -62.8987 0.0882457 +VERTEX2 5799 -36.9687 -62.8173 0.0712693 +VERTEX2 5800 -36.0163 -62.8055 0.0606248 +VERTEX2 5801 -36.1703 -61.7432 1.61968 +VERTEX2 5802 -36.3005 -60.6513 1.65479 +VERTEX2 5803 -36.4251 -59.644 1.66318 +VERTEX2 5804 -36.4775 -58.6629 1.65305 +VERTEX2 5805 -36.4711 -57.744 1.63815 +VERTEX2 5806 -37.41 -57.7882 -3.04779 +VERTEX2 5807 -38.4 -57.824 -3.03565 +VERTEX2 5808 -39.3333 -57.8481 -3.03173 +VERTEX2 5809 -40.2705 -57.9603 -3.01452 +VERTEX2 5810 -41.2535 -58.1527 -3.05584 +VERTEX2 5811 -41.2971 -57.2131 1.61013 +VERTEX2 5812 -41.3093 -56.3304 1.61768 +VERTEX2 5813 -41.3577 -55.3977 1.5896 +VERTEX2 5814 -41.3602 -54.4374 1.56531 +VERTEX2 5815 -41.3452 -53.4971 1.56518 +VERTEX2 5816 -42.3252 -53.42 -3.1393 +VERTEX2 5817 -43.3583 -53.5337 3.12931 +VERTEX2 5818 -44.3415 -53.5092 3.1382 +VERTEX2 5819 -45.3682 -53.4975 3.13695 +VERTEX2 5820 -46.5138 -53.4677 3.12723 +VERTEX2 5821 -46.6278 -54.4679 -1.53096 +VERTEX2 5822 -46.6362 -55.4521 -1.53973 +VERTEX2 5823 -46.6398 -56.4724 -1.53093 +VERTEX2 5824 -46.5704 -57.4099 -1.5562 +VERTEX2 5825 -46.5298 -58.3989 -1.55472 +VERTEX2 5826 -45.4969 -58.5047 0.0312615 +VERTEX2 5827 -44.4476 -58.4857 0.0386397 +VERTEX2 5828 -43.467 -58.4284 0.0566954 +VERTEX2 5829 -42.4152 -58.3328 0.0590274 +VERTEX2 5830 -41.4611 -58.2712 0.0274288 +VERTEX2 5831 -41.5269 -57.2034 1.61461 +VERTEX2 5832 -41.6058 -56.2116 1.62442 +VERTEX2 5833 -41.6807 -55.1434 1.63069 +VERTEX2 5834 -41.7254 -54.1863 1.65177 +VERTEX2 5835 -41.8276 -53.1412 1.65184 +VERTEX2 5836 -42.7825 -53.2285 -3.08047 +VERTEX2 5837 -43.7581 -53.329 -3.10017 +VERTEX2 5838 -44.7572 -53.4218 -3.12149 +VERTEX2 5839 -45.7863 -53.4497 3.13466 +VERTEX2 5840 -46.824 -53.4751 -3.11402 +VERTEX2 5841 -46.8411 -54.4186 -1.54543 +VERTEX2 5842 -46.7762 -55.3735 -1.55303 +VERTEX2 5843 -46.7848 -56.3563 -1.51189 +VERTEX2 5844 -46.647 -57.3902 -1.50419 +VERTEX2 5845 -46.5101 -58.3795 -1.49642 +VERTEX2 5846 -45.4944 -58.3442 0.08029 +VERTEX2 5847 -44.5224 -58.2592 0.0832147 +VERTEX2 5848 -43.4487 -58.2089 0.0855484 +VERTEX2 5849 -42.4137 -58.0249 0.0682927 +VERTEX2 5850 -41.4469 -57.9705 0.036255 +VERTEX2 5851 -41.3115 -58.9025 -1.53781 +VERTEX2 5852 -41.31 -59.9096 -1.50937 +VERTEX2 5853 -41.3021 -60.8642 -1.53577 +VERTEX2 5854 -41.2171 -61.9283 -1.58059 +VERTEX2 5855 -41.1795 -62.8487 -1.55979 +VERTEX2 5856 -42.1765 -62.8764 3.13508 +VERTEX2 5857 -43.1115 -62.9361 3.13474 +VERTEX2 5858 -44.1236 -62.9494 -3.12501 +VERTEX2 5859 -45.0716 -62.8533 -3.09459 +VERTEX2 5860 -46.1025 -62.9289 -3.10381 +VERTEX2 5861 -46.0588 -63.9321 -1.51584 +VERTEX2 5862 -45.9204 -64.9394 -1.50097 +VERTEX2 5863 -45.8462 -65.9416 -1.51026 +VERTEX2 5864 -45.8008 -66.963 -1.48914 +VERTEX2 5865 -45.7509 -67.9909 -1.45537 +VERTEX2 5866 -44.675 -67.8904 0.138128 +VERTEX2 5867 -43.674 -67.7912 0.134104 +VERTEX2 5868 -42.7006 -67.6655 0.11225 +VERTEX2 5869 -41.7136 -67.6298 0.130831 +VERTEX2 5870 -40.6843 -67.5629 0.121457 +VERTEX2 5871 -40.7285 -66.5694 1.65518 +VERTEX2 5872 -40.8674 -65.6316 1.65927 +VERTEX2 5873 -40.8796 -64.6384 1.64729 +VERTEX2 5874 -41.0442 -63.6896 1.62866 +VERTEX2 5875 -41.147 -62.5928 1.61383 +VERTEX2 5876 -42.1677 -62.6231 -3.11128 +VERTEX2 5877 -43.1223 -62.6869 -3.11025 +VERTEX2 5878 -44.092 -62.7412 -3.08922 +VERTEX2 5879 -45.1515 -62.7301 -3.09467 +VERTEX2 5880 -46.1562 -62.8561 -3.11196 +VERTEX2 5881 -46.1864 -61.7833 1.58219 +VERTEX2 5882 -46.1963 -60.7985 1.58763 +VERTEX2 5883 -46.2993 -59.8219 1.61239 +VERTEX2 5884 -46.3584 -58.8403 1.63441 +VERTEX2 5885 -46.362 -57.8317 1.65795 +VERTEX2 5886 -47.3844 -57.8997 -3.05999 +VERTEX2 5887 -48.3608 -57.9429 -3.09377 +VERTEX2 5888 -49.3532 -58.0557 -3.11547 +VERTEX2 5889 -50.4295 -58.0499 -3.102 +VERTEX2 5890 -51.4845 -58.1195 -3.09555 +VERTEX2 5891 -51.5108 -57.0642 1.60793 +VERTEX2 5892 -51.5454 -56.0847 1.64345 +VERTEX2 5893 -51.6078 -55.0994 1.63992 +VERTEX2 5894 -51.5664 -54.069 1.61118 +VERTEX2 5895 -51.5685 -53.0275 1.63519 +VERTEX2 5896 -52.5398 -53.0412 -3.06222 +VERTEX2 5897 -53.5604 -53.1416 -3.05826 +VERTEX2 5898 -54.5502 -53.3308 -3.05911 +VERTEX2 5899 -55.5577 -53.515 -3.05002 +VERTEX2 5900 -56.5558 -53.6025 -3.07147 +VERTEX2 5901 -56.6275 -52.642 1.64427 +VERTEX2 5902 -56.7066 -51.6352 1.67204 +VERTEX2 5903 -56.8069 -50.65 1.67464 +VERTEX2 5904 -56.9876 -49.6333 1.67614 +VERTEX2 5905 -57.0046 -48.6265 1.67058 +VERTEX2 5906 -57.9677 -48.7617 -2.96896 +VERTEX2 5907 -58.929 -48.9138 -2.97456 +VERTEX2 5908 -59.905 -49.1086 -2.9706 +VERTEX2 5909 -60.8242 -49.4115 -2.99404 +VERTEX2 5910 -61.8121 -49.5411 -2.99214 +VERTEX2 5911 -61.9722 -48.5035 1.71437 +VERTEX2 5912 -62.1814 -47.581 1.70621 +VERTEX2 5913 -62.3074 -46.5995 1.70371 +VERTEX2 5914 -62.4346 -45.6838 1.72236 +VERTEX2 5915 -62.5792 -44.7384 1.72998 +VERTEX2 5916 -63.5445 -44.934 -3.02634 +VERTEX2 5917 -64.5562 -45.1102 -3.03481 +VERTEX2 5918 -65.5306 -45.1981 -3.02827 +VERTEX2 5919 -66.6364 -45.2351 -3.01458 +VERTEX2 5920 -67.6676 -45.4345 -3.01723 +VERTEX2 5921 -67.5887 -46.3468 -1.42484 +VERTEX2 5922 -67.4639 -47.3214 -1.45133 +VERTEX2 5923 -67.3315 -48.2787 -1.43117 +VERTEX2 5924 -67.1755 -49.2221 -1.42849 +VERTEX2 5925 -67.0641 -50.1989 -1.43549 +VERTEX2 5926 -66.0974 -50.0926 0.140372 +VERTEX2 5927 -65.0901 -49.9019 0.172699 +VERTEX2 5928 -64.2278 -49.7854 0.16467 +VERTEX2 5929 -63.3163 -49.627 0.162851 +VERTEX2 5930 -62.3338 -49.4081 0.161035 +VERTEX2 5931 -62.4057 -48.3969 1.70678 +VERTEX2 5932 -62.5664 -47.4175 1.71793 +VERTEX2 5933 -62.759 -46.4515 1.71056 +VERTEX2 5934 -62.9286 -45.492 1.69702 +VERTEX2 5935 -62.937 -44.5067 1.69182 +VERTEX2 5936 -61.9943 -44.4657 0.118624 +VERTEX2 5937 -61.0042 -44.336 0.124906 +VERTEX2 5938 -60.0901 -44.3169 0.126715 +VERTEX2 5939 -59.1422 -44.1011 0.132897 +VERTEX2 5940 -58.1579 -43.9847 0.119271 +VERTEX2 5941 -58.0228 -45.0239 -1.43355 +VERTEX2 5942 -57.8398 -46.0277 -1.4335 +VERTEX2 5943 -57.7397 -47.0303 -1.44731 +VERTEX2 5944 -57.5441 -47.9907 -1.48937 +VERTEX2 5945 -57.5481 -49.0308 -1.50896 +VERTEX2 5946 -56.5739 -48.9638 0.0403406 +VERTEX2 5947 -55.6517 -48.9114 0.03191 +VERTEX2 5948 -54.6771 -48.951 0.0312414 +VERTEX2 5949 -53.6488 -48.9516 0.0325338 +VERTEX2 5950 -52.5922 -48.9789 0.0393461 +VERTEX2 5951 -52.6152 -47.9764 1.56555 +VERTEX2 5952 -52.5637 -46.9369 1.54269 +VERTEX2 5953 -52.5442 -45.9627 1.54407 +VERTEX2 5954 -52.5517 -44.9533 1.53767 +VERTEX2 5955 -52.5899 -43.9737 1.55301 +VERTEX2 5956 -53.5786 -43.9327 3.11315 +VERTEX2 5957 -54.6108 -43.9565 -3.13933 +VERTEX2 5958 -55.5674 -43.8866 -3.12827 +VERTEX2 5959 -56.6354 -43.8797 -3.09276 +VERTEX2 5960 -57.7587 -43.955 -3.07797 +VERTEX2 5961 -57.6605 -44.9842 -1.47775 +VERTEX2 5962 -57.5696 -45.9716 -1.47467 +VERTEX2 5963 -57.4051 -46.9645 -1.46411 +VERTEX2 5964 -57.3131 -48.0382 -1.47601 +VERTEX2 5965 -57.2591 -49.0223 -1.46312 +VERTEX2 5966 -56.2352 -48.9785 0.168822 +VERTEX2 5967 -55.2615 -48.8233 0.150368 +VERTEX2 5968 -54.2683 -48.7145 0.152869 +VERTEX2 5969 -53.2465 -48.58 0.150575 +VERTEX2 5970 -52.3986 -48.421 0.159202 +VERTEX2 5971 -52.5621 -47.4549 1.75261 +VERTEX2 5972 -52.7495 -46.5216 1.71682 +VERTEX2 5973 -52.7987 -45.5982 1.71184 +VERTEX2 5974 -52.9402 -44.5955 1.73327 +VERTEX2 5975 -53.1464 -43.6915 1.75671 +VERTEX2 5976 -54.1878 -43.8874 -2.95257 +VERTEX2 5977 -55.1055 -44.1057 -2.9432 +VERTEX2 5978 -56.1664 -44.3267 -2.95529 +VERTEX2 5979 -57.1609 -44.4712 -2.95968 +VERTEX2 5980 -58.1567 -44.6271 -2.93659 +VERTEX2 5981 -57.971 -45.5957 -1.3548 +VERTEX2 5982 -57.6651 -46.492 -1.33283 +VERTEX2 5983 -57.4657 -47.4395 -1.35674 +VERTEX2 5984 -57.2019 -48.4169 -1.33848 +VERTEX2 5985 -57.0059 -49.3489 -1.35078 +VERTEX2 5986 -56.0487 -49.1498 0.24016 +VERTEX2 5987 -55.0555 -48.9756 0.229313 +VERTEX2 5988 -54.0455 -48.7971 0.244565 +VERTEX2 5989 -53.1649 -48.5164 0.231506 +VERTEX2 5990 -52.1908 -48.2994 0.19471 +VERTEX2 5991 -52.398 -47.323 1.74781 +VERTEX2 5992 -52.493 -46.2984 1.74953 +VERTEX2 5993 -52.6445 -45.3405 1.75655 +VERTEX2 5994 -52.8235 -44.4794 1.74345 +VERTEX2 5995 -53.006 -43.4739 1.75411 +VERTEX2 5996 -53.9238 -43.6444 -2.95834 +VERTEX2 5997 -54.8825 -43.7825 -2.91812 +VERTEX2 5998 -55.8029 -44.0081 -2.91078 +VERTEX2 5999 -56.7349 -44.2661 -2.89639 +VERTEX2 6000 -57.7452 -44.5657 -2.88949 +VERTEX2 6001 -58.0381 -43.5073 1.84546 +VERTEX2 6002 -58.3982 -42.4673 1.82684 +VERTEX2 6003 -58.7451 -41.4613 1.81834 +VERTEX2 6004 -59.01 -40.5082 1.84117 +VERTEX2 6005 -59.31 -39.5958 1.83541 +VERTEX2 6006 -60.2331 -39.8249 -2.87844 +VERTEX2 6007 -61.2152 -40.0717 -2.89911 +VERTEX2 6008 -62.2282 -40.3617 -2.88548 +VERTEX2 6009 -63.1848 -40.5879 -2.89997 +VERTEX2 6010 -64.1532 -40.8271 -2.93035 +VERTEX2 6011 -63.8737 -41.8089 -1.33056 +VERTEX2 6012 -63.6672 -42.8284 -1.31465 +VERTEX2 6013 -63.4319 -43.7807 -1.2938 +VERTEX2 6014 -63.0436 -44.7931 -1.34298 +VERTEX2 6015 -62.8032 -45.8095 -1.33544 +VERTEX2 6016 -63.7529 -46.0349 -2.91884 +VERTEX2 6017 -64.6523 -46.2566 -2.93053 +VERTEX2 6018 -65.6629 -46.528 -2.93917 +VERTEX2 6019 -66.6349 -46.6679 -2.94873 +VERTEX2 6020 -67.5676 -46.9496 -2.95011 +VERTEX2 6021 -67.8127 -45.9438 1.74948 +VERTEX2 6022 -68.0321 -44.9557 1.76399 +VERTEX2 6023 -68.152 -44.0065 1.74879 +VERTEX2 6024 -68.2919 -43.0338 1.75337 +VERTEX2 6025 -68.4806 -42.0034 1.75103 +VERTEX2 6026 -69.5224 -42.1025 -2.97673 +VERTEX2 6027 -70.5099 -42.2458 -2.93789 +VERTEX2 6028 -71.4053 -42.5336 -2.94061 +VERTEX2 6029 -72.3808 -42.768 -2.91569 +VERTEX2 6030 -73.3857 -43.0142 -2.95115 +VERTEX2 6031 -73.5859 -42.0316 1.74147 +VERTEX2 6032 -73.7374 -41.0661 1.77591 +VERTEX2 6033 -73.9636 -40.1359 1.80814 +VERTEX2 6034 -74.263 -39.2253 1.81443 +VERTEX2 6035 -74.456 -38.238 1.82168 +VERTEX2 6036 -75.5208 -38.4767 -2.89697 +VERTEX2 6037 -76.39 -38.7177 -2.8801 +VERTEX2 6038 -77.3367 -39.0823 -2.84313 +VERTEX2 6039 -78.3216 -39.3714 -2.8582 +VERTEX2 6040 -79.2534 -39.7143 -2.90317 +VERTEX2 6041 -78.9413 -40.6972 -1.35042 +VERTEX2 6042 -78.7206 -41.6933 -1.32029 +VERTEX2 6043 -78.4731 -42.6423 -1.3362 +VERTEX2 6044 -78.1795 -43.6102 -1.3542 +VERTEX2 6045 -77.9681 -44.5838 -1.3513 +VERTEX2 6046 -76.9291 -44.3338 0.204646 +VERTEX2 6047 -75.8826 -44.2057 0.225223 +VERTEX2 6048 -74.9309 -43.9332 0.214877 +VERTEX2 6049 -73.9911 -43.7257 0.211112 +VERTEX2 6050 -72.9428 -43.4839 0.231382 +VERTEX2 6051 -73.2118 -42.535 1.79298 +VERTEX2 6052 -73.4453 -41.5059 1.7796 +VERTEX2 6053 -73.6771 -40.4777 1.75498 +VERTEX2 6054 -73.885 -39.3911 1.76689 +VERTEX2 6055 -74.1176 -38.3197 1.74156 +VERTEX2 6056 -75.0765 -38.4887 -2.98938 +VERTEX2 6057 -76.0526 -38.7068 -2.96215 +VERTEX2 6058 -76.9626 -38.837 -2.97429 +VERTEX2 6059 -77.9795 -38.9843 -2.96043 +VERTEX2 6060 -78.9808 -39.2107 -2.98848 +VERTEX2 6061 -78.8013 -40.1409 -1.42957 +VERTEX2 6062 -78.6937 -41.1427 -1.41945 +VERTEX2 6063 -78.4213 -42.131 -1.44403 +VERTEX2 6064 -78.3093 -43.2059 -1.43928 +VERTEX2 6065 -78.1635 -44.2296 -1.43063 +VERTEX2 6066 -77.1835 -44.0971 0.118524 +VERTEX2 6067 -76.2682 -44.0452 0.105789 +VERTEX2 6068 -75.2577 -43.9752 0.120976 +VERTEX2 6069 -74.3079 -43.9204 0.140365 +VERTEX2 6070 -73.2968 -43.7315 0.152085 +VERTEX2 6071 -73.4638 -42.7375 1.70137 +VERTEX2 6072 -73.5945 -41.7759 1.69128 +VERTEX2 6073 -73.7942 -40.7647 1.69397 +VERTEX2 6074 -73.9441 -39.775 1.68755 +VERTEX2 6075 -74.0675 -38.7664 1.69227 +VERTEX2 6076 -75.1154 -38.9332 -3.01783 +VERTEX2 6077 -76.1932 -39.0176 -3.01083 +VERTEX2 6078 -77.2111 -39.1216 -3.01052 +VERTEX2 6079 -78.2096 -39.2433 -3.00937 +VERTEX2 6080 -79.1647 -39.3175 -2.97164 +VERTEX2 6081 -79.1135 -40.2779 -1.39108 +VERTEX2 6082 -78.9942 -41.2888 -1.38156 +VERTEX2 6083 -78.8271 -42.3401 -1.38643 +VERTEX2 6084 -78.5956 -43.3457 -1.38232 +VERTEX2 6085 -78.4069 -44.5079 -1.40309 +VERTEX2 6086 -77.4161 -44.2991 0.152464 +VERTEX2 6087 -76.4139 -44.1634 0.180468 +VERTEX2 6088 -75.4565 -44.0331 0.156176 +VERTEX2 6089 -74.4823 -43.8973 0.177685 +VERTEX2 6090 -73.5424 -43.797 0.163824 +VERTEX2 6091 -73.6823 -42.7674 1.68024 +VERTEX2 6092 -73.8378 -41.7065 1.67394 +VERTEX2 6093 -73.9223 -40.694 1.6983 +VERTEX2 6094 -74.012 -39.6846 1.68773 +VERTEX2 6095 -74.1525 -38.6727 1.67719 +VERTEX2 6096 -75.2253 -38.83 -3.02616 +VERTEX2 6097 -76.1954 -38.902 -3.04347 +VERTEX2 6098 -77.1237 -38.9804 -3.0287 +VERTEX2 6099 -78.1749 -39.0375 -3.04072 +VERTEX2 6100 -79.1269 -39.1641 -3.06023 +VERTEX2 6101 -79.2012 -38.1441 1.64933 +VERTEX2 6102 -79.2516 -37.1718 1.65598 +VERTEX2 6103 -79.3525 -36.1777 1.61522 +VERTEX2 6104 -79.4065 -35.159 1.62157 +VERTEX2 6105 -79.4211 -34.1932 1.64192 +VERTEX2 6106 -80.4102 -34.177 -3.06582 +VERTEX2 6107 -81.3861 -34.2881 -3.10696 +VERTEX2 6108 -82.4505 -34.3553 -3.09016 +VERTEX2 6109 -83.4386 -34.4113 -3.08828 +VERTEX2 6110 -84.4656 -34.5137 -3.06663 +VERTEX2 6111 -84.6001 -33.6007 1.66636 +VERTEX2 6112 -84.6303 -32.5688 1.67337 +VERTEX2 6113 -84.7575 -31.6476 1.68848 +VERTEX2 6114 -84.9315 -30.6354 1.67717 +VERTEX2 6115 -85.0937 -29.6091 1.65881 +VERTEX2 6116 -86.1153 -29.8257 -3.04155 +VERTEX2 6117 -86.991 -30.013 -3.0208 +VERTEX2 6118 -87.951 -30.1285 -2.99815 +VERTEX2 6119 -88.9005 -30.2933 -2.97906 +VERTEX2 6120 -89.9103 -30.4828 -2.97951 +VERTEX2 6121 -89.7295 -31.4677 -1.39791 +VERTEX2 6122 -89.5072 -32.341 -1.38874 +VERTEX2 6123 -89.3757 -33.3075 -1.35789 +VERTEX2 6124 -89.1448 -34.2268 -1.34795 +VERTEX2 6125 -88.9364 -35.2538 -1.34535 +VERTEX2 6126 -89.8248 -35.4571 -2.90936 +VERTEX2 6127 -90.8418 -35.6565 -2.94219 +VERTEX2 6128 -91.7928 -35.8379 -2.94773 +VERTEX2 6129 -92.7119 -35.9749 -2.92064 +VERTEX2 6130 -93.7047 -36.0964 -2.91227 +VERTEX2 6131 -93.9323 -35.1819 1.75968 +VERTEX2 6132 -94.1093 -34.207 1.74528 +VERTEX2 6133 -94.2198 -33.2167 1.7611 +VERTEX2 6134 -94.4067 -32.2991 1.76983 +VERTEX2 6135 -94.5558 -31.2995 1.77133 +VERTEX2 6136 -95.4972 -31.4702 -2.92351 +VERTEX2 6137 -96.4786 -31.675 -2.93419 +VERTEX2 6138 -97.4072 -31.8412 -2.95235 +VERTEX2 6139 -98.3249 -32.0116 -2.97248 +VERTEX2 6140 -99.2546 -32.1915 -2.95972 +VERTEX2 6141 -99.0905 -33.1146 -1.3574 +VERTEX2 6142 -98.8731 -34.0318 -1.35845 +VERTEX2 6143 -98.7239 -35.0531 -1.37679 +VERTEX2 6144 -98.5401 -36.0235 -1.37185 +VERTEX2 6145 -98.3508 -36.9776 -1.37152 +VERTEX2 6146 -97.3613 -36.7991 0.179453 +VERTEX2 6147 -96.3592 -36.6174 0.164649 +VERTEX2 6148 -95.385 -36.4116 0.186623 +VERTEX2 6149 -94.4531 -36.1755 0.174273 +VERTEX2 6150 -93.3753 -35.8894 0.173969 +VERTEX2 6151 -93.1646 -36.8555 -1.37798 +VERTEX2 6152 -93.0083 -37.8615 -1.33032 +VERTEX2 6153 -92.7527 -38.814 -1.34278 +VERTEX2 6154 -92.4733 -39.7993 -1.35482 +VERTEX2 6155 -92.3467 -40.756 -1.33463 +VERTEX2 6156 -91.3817 -40.548 0.238223 +VERTEX2 6157 -90.3875 -40.41 0.26063 +VERTEX2 6158 -89.3857 -40.0783 0.225299 +VERTEX2 6159 -88.4019 -39.8958 0.210709 +VERTEX2 6160 -87.4648 -39.64 0.185376 +VERTEX2 6161 -87.6864 -38.6585 1.74065 +VERTEX2 6162 -87.8203 -37.6252 1.75048 +VERTEX2 6163 -88.0046 -36.5149 1.75994 +VERTEX2 6164 -88.1661 -35.4833 1.77098 +VERTEX2 6165 -88.3358 -34.4038 1.74969 +VERTEX2 6166 -87.3229 -34.1485 0.189996 +VERTEX2 6167 -86.2783 -33.9518 0.206331 +VERTEX2 6168 -85.332 -33.7135 0.175411 +VERTEX2 6169 -84.299 -33.5708 0.189777 +VERTEX2 6170 -83.261 -33.3565 0.141259 +VERTEX2 6171 -83.4446 -32.3577 1.7099 +VERTEX2 6172 -83.5591 -31.3062 1.73088 +VERTEX2 6173 -83.8199 -30.3827 1.71968 +VERTEX2 6174 -83.9757 -29.3722 1.73136 +VERTEX2 6175 -84.1307 -28.369 1.73554 +VERTEX2 6176 -85.0521 -28.5358 -3.00048 +VERTEX2 6177 -86.1456 -28.6526 -3.02406 +VERTEX2 6178 -87.125 -28.7801 -3.04941 +VERTEX2 6179 -88.1082 -28.8841 -3.04819 +VERTEX2 6180 -89.1593 -28.9495 -3.07139 +VERTEX2 6181 -89.0874 -29.8637 -1.46533 +VERTEX2 6182 -89.0002 -30.7991 -1.46222 +VERTEX2 6183 -88.913 -31.7602 -1.48485 +VERTEX2 6184 -88.8451 -32.7264 -1.49734 +VERTEX2 6185 -88.7448 -33.8531 -1.54486 +VERTEX2 6186 -87.7007 -33.8395 0.0119257 +VERTEX2 6187 -86.7482 -33.9121 0.040341 +VERTEX2 6188 -85.7973 -33.7874 0.0761346 +VERTEX2 6189 -84.7897 -33.7446 0.0823012 +VERTEX2 6190 -83.7453 -33.6302 0.0611603 +VERTEX2 6191 -83.6232 -34.5434 -1.54021 +VERTEX2 6192 -83.5505 -35.5708 -1.54185 +VERTEX2 6193 -83.5471 -36.6465 -1.53798 +VERTEX2 6194 -83.5285 -37.6574 -1.54157 +VERTEX2 6195 -83.4396 -38.6243 -1.55108 +VERTEX2 6196 -82.3636 -38.6124 0.00114447 +VERTEX2 6197 -81.3599 -38.654 -0.014088 +VERTEX2 6198 -80.3182 -38.628 -0.0237824 +VERTEX2 6199 -79.3417 -38.6184 -0.0103398 +VERTEX2 6200 -78.3167 -38.7345 0.00489277 +VERTEX2 6201 -78.4205 -37.766 1.60293 +VERTEX2 6202 -78.3716 -36.8396 1.57927 +VERTEX2 6203 -78.325 -35.8026 1.58379 +VERTEX2 6204 -78.2861 -34.7781 1.57777 +VERTEX2 6205 -78.3163 -33.7326 1.58306 +VERTEX2 6206 -79.3284 -33.8457 -3.12665 +VERTEX2 6207 -80.3381 -33.8674 -3.11087 +VERTEX2 6208 -81.3532 -33.9217 -3.11416 +VERTEX2 6209 -82.4095 -33.9648 -3.12289 +VERTEX2 6210 -83.3925 -33.9499 -3.12064 +VERTEX2 6211 -83.3782 -34.8871 -1.53779 +VERTEX2 6212 -83.3948 -35.9505 -1.56596 +VERTEX2 6213 -83.3417 -36.8587 -1.59067 +VERTEX2 6214 -83.3629 -37.8522 -1.61199 +VERTEX2 6215 -83.3725 -38.8657 -1.63095 +VERTEX2 6216 -82.3715 -38.9874 -0.0968905 +VERTEX2 6217 -81.3608 -39.0697 -0.0957888 +VERTEX2 6218 -80.3449 -39.1142 -0.0682555 +VERTEX2 6219 -79.3549 -39.171 -0.0665884 +VERTEX2 6220 -78.3741 -39.2377 -0.0595807 +VERTEX2 6221 -78.4933 -40.2601 -1.63903 +VERTEX2 6222 -78.4962 -41.2499 -1.63065 +VERTEX2 6223 -78.5563 -42.305 -1.64318 +VERTEX2 6224 -78.7141 -43.4019 -1.6253 +VERTEX2 6225 -78.7601 -44.4476 -1.62657 +VERTEX2 6226 -79.8458 -44.5049 3.05265 +VERTEX2 6227 -80.8571 -44.4509 3.04279 +VERTEX2 6228 -81.8285 -44.2622 3.00635 +VERTEX2 6229 -82.7429 -44.1189 2.98968 +VERTEX2 6230 -83.7174 -43.9565 2.97341 +VERTEX2 6231 -83.883 -44.9419 -1.7511 +VERTEX2 6232 -84.0974 -45.8703 -1.71434 +VERTEX2 6233 -84.3247 -46.8147 -1.73895 +VERTEX2 6234 -84.4857 -47.8404 -1.73238 +VERTEX2 6235 -84.5617 -48.7517 -1.70166 +VERTEX2 6236 -83.553 -48.925 -0.130756 +VERTEX2 6237 -82.5569 -49.0847 -0.138437 +VERTEX2 6238 -81.6643 -49.1752 -0.143211 +VERTEX2 6239 -80.5517 -49.3322 -0.123588 +VERTEX2 6240 -79.502 -49.4209 -0.120967 +VERTEX2 6241 -79.3676 -48.3457 1.46946 +VERTEX2 6242 -79.1932 -47.3198 1.45892 +VERTEX2 6243 -79.0688 -46.3361 1.43922 +VERTEX2 6244 -78.9478 -45.3624 1.43943 +VERTEX2 6245 -78.8163 -44.4738 1.44013 +VERTEX2 6246 -77.9294 -44.5614 -0.104276 +VERTEX2 6247 -77.0001 -44.6719 -0.133839 +VERTEX2 6248 -76.0019 -44.9316 -0.174378 +VERTEX2 6249 -75.0696 -45.0598 -0.196733 +VERTEX2 6250 -74.1112 -45.3041 -0.190011 +VERTEX2 6251 -73.8488 -44.4066 1.37139 +VERTEX2 6252 -73.6917 -43.4398 1.36677 +VERTEX2 6253 -73.4903 -42.4536 1.37385 +VERTEX2 6254 -73.3114 -41.5234 1.3897 +VERTEX2 6255 -73.1623 -40.5684 1.38046 +VERTEX2 6256 -74.198 -40.386 2.94178 +VERTEX2 6257 -75.1505 -40.134 2.93764 +VERTEX2 6258 -76.0919 -39.9699 2.96587 +VERTEX2 6259 -77.1504 -39.8113 2.98654 +VERTEX2 6260 -78.1107 -39.6496 3.00005 +VERTEX2 6261 -78.2664 -40.6823 -1.74126 +VERTEX2 6262 -78.4225 -41.6121 -1.71968 +VERTEX2 6263 -78.6102 -42.5622 -1.72136 +VERTEX2 6264 -78.7108 -43.6243 -1.68367 +VERTEX2 6265 -78.8194 -44.5088 -1.7022 +VERTEX2 6266 -79.824 -44.3907 3.01863 +VERTEX2 6267 -80.8663 -44.226 3.00441 +VERTEX2 6268 -81.8111 -44.0337 3.04574 +VERTEX2 6269 -82.7709 -43.9158 3.06826 +VERTEX2 6270 -83.7136 -43.8313 3.10321 +VERTEX2 6271 -83.7786 -44.8335 -1.62473 +VERTEX2 6272 -83.8375 -45.8761 -1.61866 +VERTEX2 6273 -83.8505 -46.8644 -1.63344 +VERTEX2 6274 -83.8413 -47.9346 -1.5807 +VERTEX2 6275 -83.8125 -48.9409 -1.56779 +VERTEX2 6276 -84.7963 -48.9764 -3.1157 +VERTEX2 6277 -85.8226 -48.9975 -3.1181 +VERTEX2 6278 -86.8095 -48.9751 -3.09576 +VERTEX2 6279 -87.8054 -48.9137 -3.12569 +VERTEX2 6280 -88.7846 -48.9212 -3.10644 +VERTEX2 6281 -88.8198 -47.9435 1.60069 +VERTEX2 6282 -88.8367 -46.9002 1.5749 +VERTEX2 6283 -88.8632 -45.9582 1.55103 +VERTEX2 6284 -88.8784 -44.991 1.56185 +VERTEX2 6285 -88.8212 -44.0061 1.56744 +VERTEX2 6286 -89.7787 -44.0267 3.13614 +VERTEX2 6287 -90.8275 -43.983 3.11473 +VERTEX2 6288 -91.8505 -44.0507 3.12595 +VERTEX2 6289 -92.9116 -44.0093 -3.13812 +VERTEX2 6290 -93.8986 -43.944 -3.13528 +VERTEX2 6291 -93.9473 -44.8748 -1.58523 +VERTEX2 6292 -93.9498 -45.8453 -1.59358 +VERTEX2 6293 -94.0137 -46.8399 -1.59079 +VERTEX2 6294 -93.9834 -47.9159 -1.61317 +VERTEX2 6295 -93.9661 -48.891 -1.61285 +VERTEX2 6296 -92.9645 -48.9471 0.00222777 +VERTEX2 6297 -91.9506 -48.8678 -0.0281307 +VERTEX2 6298 -90.9594 -48.8478 -0.0359985 +VERTEX2 6299 -89.9132 -48.8644 -0.0223417 +VERTEX2 6300 -88.9157 -48.8376 -0.00144769 +VERTEX2 6301 -88.8609 -49.7789 -1.57084 +VERTEX2 6302 -88.7949 -50.7268 -1.5975 +VERTEX2 6303 -88.7977 -51.7309 -1.61782 +VERTEX2 6304 -88.8657 -52.6986 -1.6165 +VERTEX2 6305 -88.8715 -53.7499 -1.59657 +VERTEX2 6306 -87.8591 -53.7889 -0.03719 +VERTEX2 6307 -86.8916 -53.7886 -0.0287355 +VERTEX2 6308 -85.8467 -53.8445 -0.0357096 +VERTEX2 6309 -84.8972 -53.8845 -0.0425316 +VERTEX2 6310 -83.9602 -53.9199 -0.0366193 +VERTEX2 6311 -83.937 -52.879 1.5541 +VERTEX2 6312 -83.9094 -51.8145 1.52229 +VERTEX2 6313 -83.8888 -50.7096 1.53695 +VERTEX2 6314 -83.7941 -49.6871 1.50824 +VERTEX2 6315 -83.7923 -48.7213 1.53751 +VERTEX2 6316 -84.7812 -48.764 3.10597 +VERTEX2 6317 -85.8269 -48.73 3.09449 +VERTEX2 6318 -86.8144 -48.7004 3.09916 +VERTEX2 6319 -87.8922 -48.6374 3.09952 +VERTEX2 6320 -88.8559 -48.6685 3.09399 +VERTEX2 6321 -88.8435 -47.7146 1.53973 +VERTEX2 6322 -88.7826 -46.7029 1.53209 +VERTEX2 6323 -88.6367 -45.6484 1.50425 +VERTEX2 6324 -88.6036 -44.6576 1.5001 +VERTEX2 6325 -88.5374 -43.6216 1.49711 +VERTEX2 6326 -89.5318 -43.5294 3.06476 +VERTEX2 6327 -90.564 -43.4707 3.05586 +VERTEX2 6328 -91.6068 -43.3762 3.00837 +VERTEX2 6329 -92.6297 -43.2215 3.00658 +VERTEX2 6330 -93.6316 -43.0298 3.04442 +VERTEX2 6331 -93.5448 -41.9843 1.46243 +VERTEX2 6332 -93.447 -40.9204 1.47446 +VERTEX2 6333 -93.4074 -39.867 1.46389 +VERTEX2 6334 -93.3628 -38.8357 1.49223 +VERTEX2 6335 -93.259 -37.8511 1.50759 +VERTEX2 6336 -94.2235 -37.7072 3.09374 +VERTEX2 6337 -95.2014 -37.7497 3.10198 +VERTEX2 6338 -96.2094 -37.6571 3.08897 +VERTEX2 6339 -97.1761 -37.5135 3.10791 +VERTEX2 6340 -98.285 -37.5618 3.07644 +VERTEX2 6341 -98.1987 -36.5922 1.50587 +VERTEX2 6342 -98.1079 -35.5781 1.48886 +VERTEX2 6343 -98.03 -34.5473 1.50777 +VERTEX2 6344 -97.8941 -33.509 1.52018 +VERTEX2 6345 -97.8331 -32.5724 1.49926 +VERTEX2 6346 -98.8297 -32.55 3.03244 +VERTEX2 6347 -99.7692 -32.5238 3.02735 +VERTEX2 6348 -100.8 -32.4002 3.04141 +VERTEX2 6349 -101.7 -32.2598 3.06044 +VERTEX2 6350 -102.671 -32.16 3.0669 +VERTEX2 6351 -102.783 -33.0727 -1.67166 +VERTEX2 6352 -102.829 -34.0325 -1.68169 +VERTEX2 6353 -102.931 -35.0109 -1.68602 +VERTEX2 6354 -103.16 -36 -1.68007 +VERTEX2 6355 -103.284 -37.0661 -1.69407 +VERTEX2 6356 -104.243 -36.883 3.03613 +VERTEX2 6357 -105.229 -36.7552 3.03295 +VERTEX2 6358 -106.215 -36.7327 3.05036 +VERTEX2 6359 -107.239 -36.6979 3.05293 +VERTEX2 6360 -108.285 -36.6504 3.06755 +VERTEX2 6361 -108.347 -37.6408 -1.61707 +VERTEX2 6362 -108.403 -38.5931 -1.6455 +VERTEX2 6363 -108.433 -39.5314 -1.65248 +VERTEX2 6364 -108.469 -40.4617 -1.63698 +VERTEX2 6365 -108.693 -41.418 -1.60678 +VERTEX2 6366 -107.693 -41.3618 -0.00842936 +VERTEX2 6367 -106.678 -41.4622 0.00565403 +VERTEX2 6368 -105.753 -41.5342 -0.0244463 +VERTEX2 6369 -104.74 -41.5365 -0.0127125 +VERTEX2 6370 -103.681 -41.4573 0.0109387 +VERTEX2 6371 -103.587 -40.4239 1.61081 +VERTEX2 6372 -103.5 -39.4052 1.65598 +VERTEX2 6373 -103.569 -38.3412 1.69895 +VERTEX2 6374 -103.678 -37.2788 1.67389 +VERTEX2 6375 -103.892 -36.243 1.67615 +VERTEX2 6376 -102.89 -36.1853 0.0985972 +VERTEX2 6377 -101.903 -36.0864 0.0786757 +VERTEX2 6378 -100.88 -36.0515 0.0759905 +VERTEX2 6379 -99.9317 -36.0217 0.0733796 +VERTEX2 6380 -99.0022 -35.9607 0.081027 +VERTEX2 6381 -98.901 -36.9139 -1.49353 +VERTEX2 6382 -98.9247 -37.8999 -1.48123 +VERTEX2 6383 -98.8459 -38.9023 -1.47607 +VERTEX2 6384 -98.7025 -39.8171 -1.48961 +VERTEX2 6385 -98.6509 -40.8246 -1.48929 +VERTEX2 6386 -97.6038 -40.784 0.0651093 +VERTEX2 6387 -96.6264 -40.7695 0.0558695 +VERTEX2 6388 -95.6397 -40.7406 0.0572899 +VERTEX2 6389 -94.6501 -40.6994 0.0613327 +VERTEX2 6390 -93.6972 -40.5482 0.0694693 +VERTEX2 6391 -93.7692 -39.5536 1.61592 +VERTEX2 6392 -93.8343 -38.5279 1.59025 +VERTEX2 6393 -93.81 -37.4395 1.59124 +VERTEX2 6394 -93.879 -36.4361 1.59227 +VERTEX2 6395 -93.8111 -35.4199 1.62927 +VERTEX2 6396 -92.8643 -35.3441 0.0166728 +VERTEX2 6397 -91.8779 -35.3867 -0.00839612 +VERTEX2 6398 -90.7986 -35.3865 -0.0132777 +VERTEX2 6399 -89.8082 -35.4247 -0.0107773 +VERTEX2 6400 -88.8307 -35.4021 -0.0195343 +VERTEX2 6401 -88.7956 -36.337 -1.61861 +VERTEX2 6402 -88.9589 -37.3102 -1.63209 +VERTEX2 6403 -89.0043 -38.2905 -1.65564 +VERTEX2 6404 -89.1429 -39.2778 -1.66597 +VERTEX2 6405 -89.3124 -40.2387 -1.64357 +VERTEX2 6406 -90.3022 -40.0742 3.01989 +VERTEX2 6407 -91.3108 -40.0004 3.0579 +VERTEX2 6408 -92.2323 -39.9434 3.0561 +VERTEX2 6409 -93.3541 -39.8828 3.0403 +VERTEX2 6410 -94.334 -39.7738 3.01437 +VERTEX2 6411 -94.5162 -40.7556 -1.69472 +VERTEX2 6412 -94.7474 -41.7704 -1.73533 +VERTEX2 6413 -94.9009 -42.7347 -1.71283 +VERTEX2 6414 -95.0477 -43.8077 -1.72473 +VERTEX2 6415 -95.2187 -44.8173 -1.72541 +VERTEX2 6416 -96.1707 -44.587 2.99989 +VERTEX2 6417 -97.2145 -44.4282 3.02808 +VERTEX2 6418 -98.1843 -44.2723 3.01402 +VERTEX2 6419 -99.1851 -44.164 3.01046 +VERTEX2 6420 -100.13 -43.9849 3.00899 +VERTEX2 6421 -100.282 -44.9458 -1.67089 +VERTEX2 6422 -100.424 -45.9631 -1.65025 +VERTEX2 6423 -100.482 -46.9527 -1.6862 +VERTEX2 6424 -100.523 -47.8978 -1.67239 +VERTEX2 6425 -100.531 -48.8468 -1.67511 +VERTEX2 6426 -99.5733 -48.8612 -0.0835822 +VERTEX2 6427 -98.6279 -48.9539 -0.0494284 +VERTEX2 6428 -97.6489 -48.9233 -0.046855 +VERTEX2 6429 -96.7124 -48.9084 -0.0279074 +VERTEX2 6430 -95.6672 -48.9508 -0.0158817 +VERTEX2 6431 -95.7512 -47.9396 1.5692 +VERTEX2 6432 -95.746 -46.8687 1.57533 +VERTEX2 6433 -95.7107 -45.854 1.58456 +VERTEX2 6434 -95.7491 -44.9341 1.56815 +VERTEX2 6435 -95.7204 -43.9265 1.55897 +VERTEX2 6436 -96.7773 -43.8196 3.13104 +VERTEX2 6437 -97.7767 -43.8563 -3.11063 +VERTEX2 6438 -98.7525 -43.8688 -3.10964 +VERTEX2 6439 -99.7553 -43.8896 -3.08813 +VERTEX2 6440 -100.75 -43.9514 -3.11633 +VERTEX2 6441 -100.701 -44.9781 -1.57522 +VERTEX2 6442 -100.709 -46.0783 -1.5592 +VERTEX2 6443 -100.701 -47.1151 -1.58237 +VERTEX2 6444 -100.686 -48.0548 -1.62464 +VERTEX2 6445 -100.743 -49.0291 -1.62687 +VERTEX2 6446 -99.8433 -49.0824 -0.0643356 +VERTEX2 6447 -98.8798 -49.1661 -0.0394945 +VERTEX2 6448 -97.8727 -49.2252 -0.0236482 +VERTEX2 6449 -96.8446 -49.2192 0.027166 +VERTEX2 6450 -95.7737 -49.197 -0.0126856 +VERTEX2 6451 -95.7496 -48.1841 1.54409 +VERTEX2 6452 -95.7336 -47.224 1.51124 +VERTEX2 6453 -95.6625 -46.2938 1.53225 +VERTEX2 6454 -95.5721 -45.3232 1.53901 +VERTEX2 6455 -95.5636 -44.4075 1.52552 +VERTEX2 6456 -96.5397 -44.3867 3.11699 +VERTEX2 6457 -97.5894 -44.357 -3.13138 +VERTEX2 6458 -98.5593 -44.4008 3.13212 +VERTEX2 6459 -99.5784 -44.3792 3.14075 +VERTEX2 6460 -100.501 -44.3829 -3.13105 +VERTEX2 6461 -100.536 -45.3547 -1.54156 +VERTEX2 6462 -100.477 -46.4448 -1.55683 +VERTEX2 6463 -100.448 -47.44 -1.51934 +VERTEX2 6464 -100.279 -48.3664 -1.54131 +VERTEX2 6465 -100.302 -49.4504 -1.52185 +VERTEX2 6466 -99.2989 -49.41 0.0354043 +VERTEX2 6467 -98.3601 -49.3202 0.0423868 +VERTEX2 6468 -97.3218 -49.2453 0.0596215 +VERTEX2 6469 -96.2895 -49.1896 0.0771093 +VERTEX2 6470 -95.3295 -49.1244 0.0709682 +VERTEX2 6471 -95.3718 -50.1276 -1.51089 +VERTEX2 6472 -95.3383 -51.1494 -1.47426 +VERTEX2 6473 -95.2895 -52.17 -1.46504 +VERTEX2 6474 -95.2151 -53.1187 -1.435 +VERTEX2 6475 -95.1736 -54.0551 -1.42472 +VERTEX2 6476 -94.2108 -53.8318 0.14928 +VERTEX2 6477 -93.167 -53.6973 0.152449 +VERTEX2 6478 -92.1964 -53.6397 0.134872 +VERTEX2 6479 -91.2066 -53.4346 0.146403 +VERTEX2 6480 -90.1622 -53.3423 0.128697 +VERTEX2 6481 -90.2393 -52.4041 1.73859 +VERTEX2 6482 -90.4221 -51.4034 1.72972 +VERTEX2 6483 -90.506 -50.4925 1.74593 +VERTEX2 6484 -90.6605 -49.5094 1.73429 +VERTEX2 6485 -90.896 -48.5173 1.7117 +VERTEX2 6486 -91.8643 -48.6732 -2.98106 +VERTEX2 6487 -92.8315 -48.8108 -2.95817 +VERTEX2 6488 -93.7456 -48.9019 -2.92117 +VERTEX2 6489 -94.7305 -49.1403 -2.9249 +VERTEX2 6490 -95.7157 -49.3453 -2.92078 +VERTEX2 6491 -95.5081 -50.3351 -1.32906 +VERTEX2 6492 -95.2999 -51.3107 -1.32659 +VERTEX2 6493 -95.0451 -52.3757 -1.32459 +VERTEX2 6494 -94.8115 -53.3751 -1.34213 +VERTEX2 6495 -94.5383 -54.3792 -1.33593 +VERTEX2 6496 -93.4344 -54.0372 0.223976 +VERTEX2 6497 -92.4883 -53.8199 0.193522 +VERTEX2 6498 -91.5195 -53.5997 0.200993 +VERTEX2 6499 -90.4578 -53.3649 0.200161 +VERTEX2 6500 -89.6088 -53.1573 0.18122 +VERTEX2 6501 -89.6904 -52.167 1.74446 +VERTEX2 6502 -89.9046 -51.1389 1.74031 +VERTEX2 6503 -90.0382 -50.1289 1.70003 +VERTEX2 6504 -90.2226 -49.2017 1.68502 +VERTEX2 6505 -90.3334 -48.125 1.67217 +VERTEX2 6506 -91.2338 -48.2719 -3.06584 +VERTEX2 6507 -92.3344 -48.3239 -3.03582 +VERTEX2 6508 -93.4328 -48.4828 -3.02993 +VERTEX2 6509 -94.4664 -48.5822 -3.05327 +VERTEX2 6510 -95.434 -48.7224 -3.07682 +VERTEX2 6511 -95.3694 -49.7042 -1.50764 +VERTEX2 6512 -95.3021 -50.7269 -1.53654 +VERTEX2 6513 -95.1587 -51.7554 -1.53983 +VERTEX2 6514 -95.1187 -52.7355 -1.51026 +VERTEX2 6515 -95.0588 -53.7052 -1.55068 +VERTEX2 6516 -96.0224 -53.6817 -3.13405 +VERTEX2 6517 -97.0858 -53.7483 3.14159 +VERTEX2 6518 -98.0857 -53.7381 -3.11039 +VERTEX2 6519 -99.0897 -53.7632 -3.1234 +VERTEX2 6520 -100.039 -53.7574 -3.13403 +VERTEX2 6521 -100.014 -54.7467 -1.5764 +VERTEX2 6522 -100.107 -55.7493 -1.60469 +VERTEX2 6523 -100.141 -56.684 -1.57013 +VERTEX2 6524 -100.122 -57.6244 -1.56537 +VERTEX2 6525 -100.014 -58.6573 -1.57128 +VERTEX2 6526 -101.033 -58.7465 3.12797 +VERTEX2 6527 -102.13 -58.7435 3.13827 +VERTEX2 6528 -103.141 -58.7492 -3.12456 +VERTEX2 6529 -104.165 -58.7483 3.14155 +VERTEX2 6530 -105.23 -58.7341 3.1053 +VERTEX2 6531 -105.194 -59.6881 -1.60419 +VERTEX2 6532 -105.243 -60.6534 -1.60673 +VERTEX2 6533 -105.378 -61.6587 -1.58128 +VERTEX2 6534 -105.32 -62.6707 -1.57936 +VERTEX2 6535 -105.247 -63.633 -1.60964 +VERTEX2 6536 -104.265 -63.6819 -0.0237791 +VERTEX2 6537 -103.245 -63.7135 -0.0481741 +VERTEX2 6538 -102.301 -63.8168 -0.0568929 +VERTEX2 6539 -101.292 -63.9079 -0.0609568 +VERTEX2 6540 -100.299 -63.9586 -0.0490849 +VERTEX2 6541 -100.271 -64.9398 -1.62309 +VERTEX2 6542 -100.346 -66.0226 -1.58307 +VERTEX2 6543 -100.364 -66.984 -1.56682 +VERTEX2 6544 -100.362 -68.0238 -1.5504 +VERTEX2 6545 -100.356 -69.0232 -1.56565 +VERTEX2 6546 -101.252 -68.9643 -3.1334 +VERTEX2 6547 -102.184 -68.972 -3.10631 +VERTEX2 6548 -103.201 -69.0137 -3.13771 +VERTEX2 6549 -104.201 -68.9797 3.12802 +VERTEX2 6550 -105.026 -68.9795 3.11077 +VERTEX2 6551 -105.05 -69.9605 -1.63076 +VERTEX2 6552 -105.083 -70.9715 -1.65785 +VERTEX2 6553 -105.202 -71.9314 -1.66734 +VERTEX2 6554 -105.275 -72.94 -1.65421 +VERTEX2 6555 -105.342 -73.8947 -1.65435 +VERTEX2 6556 -104.239 -73.895 -0.0725565 +VERTEX2 6557 -103.257 -73.9362 -0.0447162 +VERTEX2 6558 -102.253 -73.8788 -0.0620724 +VERTEX2 6559 -101.211 -73.9343 -0.0619649 +VERTEX2 6560 -100.173 -74.0048 -0.0299364 +VERTEX2 6561 -100.134 -72.9187 1.50767 +VERTEX2 6562 -100.134 -72.022 1.45429 +VERTEX2 6563 -100.032 -71.0362 1.45871 +VERTEX2 6564 -99.9317 -70.0452 1.46029 +VERTEX2 6565 -99.8936 -69.0624 1.43798 +VERTEX2 6566 -100.888 -68.9126 3.00099 +VERTEX2 6567 -101.899 -68.7522 2.99074 +VERTEX2 6568 -102.909 -68.5745 3.02372 +VERTEX2 6569 -103.886 -68.4317 3.0306 +VERTEX2 6570 -104.882 -68.3201 3.02741 +VERTEX2 6571 -104.998 -69.2836 -1.7057 +VERTEX2 6572 -105.093 -70.3169 -1.68263 +VERTEX2 6573 -105.169 -71.2491 -1.6858 +VERTEX2 6574 -105.237 -72.1902 -1.68018 +VERTEX2 6575 -105.347 -73.1367 -1.68323 +VERTEX2 6576 -104.309 -73.2041 -0.0784054 +VERTEX2 6577 -103.267 -73.2789 -0.0862606 +VERTEX2 6578 -102.24 -73.3255 -0.125255 +VERTEX2 6579 -101.21 -73.4175 -0.115629 +VERTEX2 6580 -100.203 -73.6281 -0.0830754 +VERTEX2 6581 -100.046 -72.6823 1.47611 +VERTEX2 6582 -99.9229 -71.7443 1.46364 +VERTEX2 6583 -99.8195 -70.7598 1.47171 +VERTEX2 6584 -99.7728 -69.7371 1.44658 +VERTEX2 6585 -99.6032 -68.7345 1.45004 +VERTEX2 6586 -100.625 -68.7341 3.02777 +VERTEX2 6587 -101.619 -68.651 3.02072 +VERTEX2 6588 -102.661 -68.5207 3.04633 +VERTEX2 6589 -103.733 -68.4573 3.00955 +VERTEX2 6590 -104.805 -68.358 3.02314 +VERTEX2 6591 -104.667 -67.3859 1.43963 +VERTEX2 6592 -104.552 -66.4973 1.46176 +VERTEX2 6593 -104.461 -65.5085 1.44541 +VERTEX2 6594 -104.295 -64.464 1.48237 +VERTEX2 6595 -104.161 -63.542 1.47522 +VERTEX2 6596 -105.173 -63.4167 3.07516 +VERTEX2 6597 -106.232 -63.382 3.05905 +VERTEX2 6598 -107.261 -63.1845 3.00764 +VERTEX2 6599 -108.233 -62.9393 2.9865 +VERTEX2 6600 -109.165 -62.7824 2.95999 +VERTEX2 6601 -108.988 -61.731 1.40044 +VERTEX2 6602 -108.777 -60.7831 1.41561 +VERTEX2 6603 -108.584 -59.818 1.40456 +VERTEX2 6604 -108.454 -58.8597 1.41875 +VERTEX2 6605 -108.324 -57.9287 1.44937 +VERTEX2 6606 -109.235 -57.833 3.037 +VERTEX2 6607 -110.274 -57.8101 3.06861 +VERTEX2 6608 -111.195 -57.7293 3.07983 +VERTEX2 6609 -112.276 -57.6486 3.09012 +VERTEX2 6610 -113.272 -57.7022 3.10023 +VERTEX2 6611 -113.259 -58.5997 -1.59979 +VERTEX2 6612 -113.238 -59.6138 -1.61541 +VERTEX2 6613 -113.305 -60.6226 -1.60036 +VERTEX2 6614 -113.381 -61.5492 -1.59074 +VERTEX2 6615 -113.47 -62.5296 -1.55178 +VERTEX2 6616 -112.475 -62.4943 0.0315598 +VERTEX2 6617 -111.541 -62.4322 0.0465775 +VERTEX2 6618 -110.506 -62.4513 0.045891 +VERTEX2 6619 -109.575 -62.3474 0.0574613 +VERTEX2 6620 -108.609 -62.2963 0.069921 +VERTEX2 6621 -108.512 -63.325 -1.526 +VERTEX2 6622 -108.463 -64.3559 -1.53244 +VERTEX2 6623 -108.393 -65.3489 -1.5471 +VERTEX2 6624 -108.418 -66.3442 -1.56909 +VERTEX2 6625 -108.397 -67.3326 -1.58594 +VERTEX2 6626 -107.377 -67.3702 -0.0181997 +VERTEX2 6627 -106.341 -67.2485 -0.014525 +VERTEX2 6628 -105.342 -67.2703 -0.0576866 +VERTEX2 6629 -104.371 -67.3512 -0.100681 +VERTEX2 6630 -103.29 -67.3334 -0.0811012 +VERTEX2 6631 -103.332 -66.3863 1.48381 +VERTEX2 6632 -103.246 -65.3104 1.47477 +VERTEX2 6633 -103.076 -64.3952 1.46287 +VERTEX2 6634 -102.989 -63.417 1.43489 +VERTEX2 6635 -102.827 -62.3526 1.4227 +VERTEX2 6636 -103.849 -62.228 2.99233 +VERTEX2 6637 -104.743 -62.0101 3.03497 +VERTEX2 6638 -105.629 -61.9372 3.03333 +VERTEX2 6639 -106.522 -61.7991 3.06498 +VERTEX2 6640 -107.494 -61.67 3.04849 +VERTEX2 6641 -107.536 -62.6649 -1.64674 +VERTEX2 6642 -107.629 -63.6236 -1.63912 +VERTEX2 6643 -107.683 -64.6102 -1.6509 +VERTEX2 6644 -107.745 -65.6398 -1.67496 +VERTEX2 6645 -107.93 -66.5673 -1.66076 +VERTEX2 6646 -106.97 -66.7233 -0.0928057 +VERTEX2 6647 -105.999 -66.8608 -0.0780668 +VERTEX2 6648 -105.008 -66.9634 -0.0913592 +VERTEX2 6649 -103.949 -67.0488 -0.0923287 +VERTEX2 6650 -102.954 -67.1391 -0.0938945 +VERTEX2 6651 -102.772 -66.1208 1.46548 +VERTEX2 6652 -102.678 -65.1065 1.4905 +VERTEX2 6653 -102.581 -64.0713 1.49183 +VERTEX2 6654 -102.554 -63.0498 1.47874 +VERTEX2 6655 -102.435 -61.9914 1.49073 +VERTEX2 6656 -101.475 -62.0985 -0.0748341 +VERTEX2 6657 -100.48 -62.2172 -0.103901 +VERTEX2 6658 -99.4742 -62.2113 -0.108843 +VERTEX2 6659 -98.5623 -62.3381 -0.0850021 +VERTEX2 6660 -97.5249 -62.3756 -0.0712402 +VERTEX2 6661 -97.506 -61.3598 1.5003 +VERTEX2 6662 -97.4266 -60.4153 1.53233 +VERTEX2 6663 -97.4149 -59.3817 1.54115 +VERTEX2 6664 -97.4645 -58.3458 1.53864 +VERTEX2 6665 -97.38 -57.2739 1.56365 +VERTEX2 6666 -98.3402 -57.3762 -3.13751 +VERTEX2 6667 -99.2558 -57.4007 3.12097 +VERTEX2 6668 -100.28 -57.3624 3.14102 +VERTEX2 6669 -101.295 -57.3609 3.13123 +VERTEX2 6670 -102.312 -57.3014 -3.14012 +VERTEX2 6671 -102.296 -58.3297 -1.58197 +VERTEX2 6672 -102.361 -59.2678 -1.58595 +VERTEX2 6673 -102.369 -60.2866 -1.59346 +VERTEX2 6674 -102.413 -61.2642 -1.58538 +VERTEX2 6675 -102.366 -62.2993 -1.5697 +VERTEX2 6676 -103.427 -62.3094 -3.13891 +VERTEX2 6677 -104.362 -62.335 -3.12506 +VERTEX2 6678 -105.416 -62.2898 -3.12763 +VERTEX2 6679 -106.516 -62.336 3.12738 +VERTEX2 6680 -107.509 -62.2771 3.1332 +VERTEX2 6681 -107.483 -63.2535 -1.5859 +VERTEX2 6682 -107.527 -64.3214 -1.58436 +VERTEX2 6683 -107.54 -65.2555 -1.57528 +VERTEX2 6684 -107.498 -66.2178 -1.55426 +VERTEX2 6685 -107.465 -67.2308 -1.54504 +VERTEX2 6686 -106.416 -67.1771 0.0181466 +VERTEX2 6687 -105.346 -67.1205 0.0216812 +VERTEX2 6688 -104.318 -67.0908 0.0186813 +VERTEX2 6689 -103.273 -67.095 0.00113823 +VERTEX2 6690 -102.288 -67.1369 0.0215079 +VERTEX2 6691 -102.243 -68.1001 -1.52769 +VERTEX2 6692 -102.225 -69.1282 -1.53315 +VERTEX2 6693 -102.214 -70.1379 -1.53735 +VERTEX2 6694 -102.192 -71.1392 -1.53379 +VERTEX2 6695 -102.062 -72.1986 -1.54335 +VERTEX2 6696 -103.052 -72.2054 -3.09392 +VERTEX2 6697 -104.15 -72.2958 -3.08061 +VERTEX2 6698 -105.136 -72.3093 -3.09269 +VERTEX2 6699 -106.106 -72.3524 -3.07149 +VERTEX2 6700 -107.134 -72.4292 -3.05714 +VERTEX2 6701 -107.018 -73.4688 -1.50688 +VERTEX2 6702 -106.867 -74.4503 -1.46632 +VERTEX2 6703 -106.635 -75.4215 -1.4631 +VERTEX2 6704 -106.496 -76.5479 -1.46203 +VERTEX2 6705 -106.484 -77.6055 -1.46631 +VERTEX2 6706 -105.502 -77.5059 0.105828 +VERTEX2 6707 -104.55 -77.3477 0.148933 +VERTEX2 6708 -103.527 -77.2112 0.186381 +VERTEX2 6709 -102.522 -77.0226 0.20275 +VERTEX2 6710 -101.433 -76.7085 0.197262 +VERTEX2 6711 -101.211 -77.6428 -1.38152 +VERTEX2 6712 -101.003 -78.7137 -1.40659 +VERTEX2 6713 -100.878 -79.6478 -1.38364 +VERTEX2 6714 -100.751 -80.5889 -1.3686 +VERTEX2 6715 -100.461 -81.6324 -1.39081 +VERTEX2 6716 -101.46 -81.8424 -2.96053 +VERTEX2 6717 -102.449 -82.0844 -2.9698 +VERTEX2 6718 -103.423 -82.2518 -2.98125 +VERTEX2 6719 -104.382 -82.3526 -2.98251 +VERTEX2 6720 -105.408 -82.528 -2.9693 +VERTEX2 6721 -105.238 -83.5967 -1.3927 +VERTEX2 6722 -105.061 -84.694 -1.40902 +VERTEX2 6723 -104.95 -85.6832 -1.40929 +VERTEX2 6724 -104.821 -86.6727 -1.40584 +VERTEX2 6725 -104.632 -87.6575 -1.41215 +VERTEX2 6726 -103.637 -87.3764 0.142355 +VERTEX2 6727 -102.75 -87.2346 0.11597 +VERTEX2 6728 -101.673 -87.1418 0.107584 +VERTEX2 6729 -100.714 -87.0685 0.105684 +VERTEX2 6730 -99.743 -87.0447 0.0868742 +VERTEX2 6731 -99.7692 -85.9888 1.66668 +VERTEX2 6732 -99.8644 -84.9353 1.66308 +VERTEX2 6733 -99.8526 -83.8664 1.66052 +VERTEX2 6734 -99.8831 -82.9146 1.68151 +VERTEX2 6735 -99.9861 -81.8937 1.68269 +VERTEX2 6736 -100.958 -81.991 -3.04732 +VERTEX2 6737 -101.956 -82.0951 -3.07211 +VERTEX2 6738 -102.954 -82.2478 -3.08901 +VERTEX2 6739 -103.909 -82.3205 -3.07924 +VERTEX2 6740 -104.848 -82.4495 -3.03822 +VERTEX2 6741 -104.922 -81.5015 1.65244 +VERTEX2 6742 -105.015 -80.3963 1.67283 +VERTEX2 6743 -105.047 -79.444 1.67681 +VERTEX2 6744 -105.226 -78.4333 1.68223 +VERTEX2 6745 -105.304 -77.4282 1.70206 +VERTEX2 6746 -106.312 -77.5909 -2.98774 +VERTEX2 6747 -107.2 -77.7573 -2.98451 +VERTEX2 6748 -108.213 -77.8853 -3.04457 +VERTEX2 6749 -109.185 -77.9627 -3.06618 +VERTEX2 6750 -110.206 -78.013 -3.04518 +VERTEX2 6751 -110.393 -76.9709 1.61682 +VERTEX2 6752 -110.436 -76.0587 1.59915 +VERTEX2 6753 -110.507 -75.0535 1.60663 +VERTEX2 6754 -110.507 -74.0683 1.57492 +VERTEX2 6755 -110.46 -73.1052 1.58903 +VERTEX2 6756 -111.564 -73.1228 -3.11485 +VERTEX2 6757 -112.591 -73.2062 3.13318 +VERTEX2 6758 -113.623 -73.1758 3.12287 +VERTEX2 6759 -114.665 -73.0865 -3.13622 +VERTEX2 6760 -115.625 -73.0505 -3.11596 +VERTEX2 6761 -115.553 -74.0628 -1.57515 +VERTEX2 6762 -115.596 -75.0356 -1.55251 +VERTEX2 6763 -115.647 -75.9606 -1.55042 +VERTEX2 6764 -115.602 -76.9382 -1.56834 +VERTEX2 6765 -115.707 -77.9713 -1.60451 +VERTEX2 6766 -116.721 -77.9921 3.09612 +VERTEX2 6767 -117.745 -77.9981 3.11279 +VERTEX2 6768 -118.789 -77.9169 3.09958 +VERTEX2 6769 -119.831 -77.8464 3.09895 +VERTEX2 6770 -120.802 -77.7875 3.10884 +VERTEX2 6771 -120.823 -78.7233 -1.60535 +VERTEX2 6772 -120.844 -79.7078 -1.62295 +VERTEX2 6773 -120.901 -80.6941 -1.61446 +VERTEX2 6774 -120.989 -81.7231 -1.6335 +VERTEX2 6775 -121.109 -82.6657 -1.64764 +VERTEX2 6776 -120.139 -82.7202 -0.0675466 +VERTEX2 6777 -119.154 -82.7114 -0.08861 +VERTEX2 6778 -118.233 -82.7937 -0.105165 +VERTEX2 6779 -117.246 -82.9355 -0.112463 +VERTEX2 6780 -116.363 -83.0717 -0.124517 +VERTEX2 6781 -116.18 -82.0273 1.45555 +VERTEX2 6782 -116.091 -81.0523 1.45521 +VERTEX2 6783 -115.997 -80.0374 1.46921 +VERTEX2 6784 -115.974 -79.0184 1.51229 +VERTEX2 6785 -115.879 -78.15 1.52721 +VERTEX2 6786 -116.838 -78.1811 3.11883 +VERTEX2 6787 -117.773 -78.0823 3.13807 +VERTEX2 6788 -118.843 -77.9935 -3.10897 +VERTEX2 6789 -119.831 -78.0245 -3.06146 +VERTEX2 6790 -120.796 -78.0867 -3.09 +VERTEX2 6791 -120.797 -79.1296 -1.48442 +VERTEX2 6792 -120.676 -80.1401 -1.50205 +VERTEX2 6793 -120.66 -81.2109 -1.52281 +VERTEX2 6794 -120.618 -82.2556 -1.52777 +VERTEX2 6795 -120.577 -83.2318 -1.49381 +VERTEX2 6796 -119.558 -83.1726 0.0639852 +VERTEX2 6797 -118.588 -83.0885 0.05005 +VERTEX2 6798 -117.623 -83.1056 0.0756003 +VERTEX2 6799 -116.652 -83.0848 0.0829253 +VERTEX2 6800 -115.536 -83.0085 0.105952 +VERTEX2 6801 -115.437 -83.9876 -1.46363 +VERTEX2 6802 -115.319 -84.9782 -1.4631 +VERTEX2 6803 -115.228 -85.9235 -1.46538 +VERTEX2 6804 -115.085 -86.8758 -1.493 +VERTEX2 6805 -114.944 -87.8443 -1.48972 +VERTEX2 6806 -113.934 -87.7856 0.0718585 +VERTEX2 6807 -112.939 -87.6955 0.0591272 +VERTEX2 6808 -112.028 -87.6307 0.0679771 +VERTEX2 6809 -111.009 -87.5891 0.0482791 +VERTEX2 6810 -109.999 -87.6095 0.0436897 +VERTEX2 6811 -109.999 -86.5725 1.60748 +VERTEX2 6812 -110.102 -85.5678 1.59516 +VERTEX2 6813 -110.134 -84.439 1.57569 +VERTEX2 6814 -110.109 -83.4891 1.55628 +VERTEX2 6815 -110.002 -82.4726 1.53571 +VERTEX2 6816 -111.108 -82.4568 3.12237 +VERTEX2 6817 -112.126 -82.4386 3.13292 +VERTEX2 6818 -113.051 -82.5551 3.10667 +VERTEX2 6819 -114.093 -82.4066 3.12691 +VERTEX2 6820 -115.1 -82.3655 -3.11068 +VERTEX2 6821 -115.092 -83.3372 -1.54466 +VERTEX2 6822 -114.945 -84.3975 -1.5437 +VERTEX2 6823 -114.864 -85.483 -1.52607 +VERTEX2 6824 -114.72 -86.4513 -1.53829 +VERTEX2 6825 -114.666 -87.424 -1.55412 +VERTEX2 6826 -113.59 -87.4821 0.00788443 +VERTEX2 6827 -112.587 -87.5072 0.0205695 +VERTEX2 6828 -111.594 -87.5162 0.0287946 +VERTEX2 6829 -110.489 -87.5102 0.0156364 +VERTEX2 6830 -109.458 -87.5642 0.0045405 +VERTEX2 6831 -109.534 -86.6546 1.56394 +VERTEX2 6832 -109.519 -85.678 1.5424 +VERTEX2 6833 -109.514 -84.7127 1.56178 +VERTEX2 6834 -109.612 -83.6929 1.54985 +VERTEX2 6835 -109.547 -82.7104 1.55142 +VERTEX2 6836 -108.524 -82.6345 -0.00576659 +VERTEX2 6837 -107.533 -82.6124 0.0243778 +VERTEX2 6838 -106.518 -82.5697 0.0324679 +VERTEX2 6839 -105.545 -82.6001 0.017922 +VERTEX2 6840 -104.544 -82.5 0.0115211 +VERTEX2 6841 -104.502 -81.5569 1.54984 +VERTEX2 6842 -104.458 -80.6047 1.52804 +VERTEX2 6843 -104.429 -79.5703 1.54468 +VERTEX2 6844 -104.457 -78.546 1.53778 +VERTEX2 6845 -104.401 -77.6133 1.54417 +VERTEX2 6846 -105.426 -77.5435 3.09564 +VERTEX2 6847 -106.375 -77.5536 3.10232 +VERTEX2 6848 -107.29 -77.5012 3.10471 +VERTEX2 6849 -108.3 -77.4074 3.1115 +VERTEX2 6850 -109.292 -77.3862 3.08281 +VERTEX2 6851 -109.348 -78.3682 -1.61916 +VERTEX2 6852 -109.388 -79.3468 -1.59474 +VERTEX2 6853 -109.38 -80.3343 -1.59229 +VERTEX2 6854 -109.437 -81.3348 -1.59357 +VERTEX2 6855 -109.545 -82.3256 -1.59763 +VERTEX2 6856 -110.528 -82.3137 3.11472 +VERTEX2 6857 -111.389 -82.2496 3.11277 +VERTEX2 6858 -112.462 -82.2556 3.1118 +VERTEX2 6859 -113.449 -82.2154 3.10767 +VERTEX2 6860 -114.467 -82.1453 3.10295 +VERTEX2 6861 -114.529 -83.2174 -1.61941 +VERTEX2 6862 -114.586 -84.1785 -1.62146 +VERTEX2 6863 -114.645 -85.0973 -1.62256 +VERTEX2 6864 -114.682 -86.1527 -1.62635 +VERTEX2 6865 -114.731 -87.1524 -1.63831 +VERTEX2 6866 -115.731 -87.0801 3.08089 +VERTEX2 6867 -116.712 -87.1331 3.07265 +VERTEX2 6868 -117.784 -87.0671 3.05225 +VERTEX2 6869 -118.733 -86.9806 3.06949 +VERTEX2 6870 -119.724 -86.8899 3.13094 +VERTEX2 6871 -119.785 -85.9012 1.56442 +VERTEX2 6872 -119.783 -84.9882 1.58417 +VERTEX2 6873 -119.839 -84.0324 1.54979 +VERTEX2 6874 -119.747 -83.048 1.54924 +VERTEX2 6875 -119.697 -82.0928 1.54144 +VERTEX2 6876 -120.676 -82.0732 3.10977 +VERTEX2 6877 -121.709 -81.9965 3.1076 +VERTEX2 6878 -122.741 -81.9578 3.10828 +VERTEX2 6879 -123.858 -81.8332 3.08849 +VERTEX2 6880 -124.873 -81.7278 3.11434 +VERTEX2 6881 -124.904 -82.8154 -1.64613 +VERTEX2 6882 -124.931 -83.7883 -1.6254 +VERTEX2 6883 -125.012 -84.8038 -1.63151 +VERTEX2 6884 -125.093 -85.7868 -1.63705 +VERTEX2 6885 -125.107 -86.7178 -1.61366 +VERTEX2 6886 -124.188 -86.8267 -0.0554178 +VERTEX2 6887 -123.253 -86.8866 -0.0647836 +VERTEX2 6888 -122.239 -86.9712 -0.0730096 +VERTEX2 6889 -121.242 -87.0963 -0.0621278 +VERTEX2 6890 -120.225 -87.0975 -0.0466834 +VERTEX2 6891 -120.23 -88.0685 -1.62004 +VERTEX2 6892 -120.287 -89.0788 -1.62296 +VERTEX2 6893 -120.361 -90.1313 -1.61026 +VERTEX2 6894 -120.403 -91.1467 -1.59416 +VERTEX2 6895 -120.398 -92.1393 -1.59327 +VERTEX2 6896 -119.489 -92.0592 -0.0405167 +VERTEX2 6897 -118.493 -92.0227 -0.0335985 +VERTEX2 6898 -117.526 -92.0522 -0.0500058 +VERTEX2 6899 -116.575 -92.1361 -0.03198 +VERTEX2 6900 -115.591 -92.174 -0.0228332 +VERTEX2 6901 -115.522 -91.2274 1.53283 +VERTEX2 6902 -115.502 -90.153 1.55865 +VERTEX2 6903 -115.507 -89.0749 1.55505 +VERTEX2 6904 -115.411 -88.1203 1.53758 +VERTEX2 6905 -115.355 -87.1137 1.52295 +VERTEX2 6906 -116.402 -87.0355 3.09542 +VERTEX2 6907 -117.395 -86.9537 3.10085 +VERTEX2 6908 -118.455 -86.9622 3.09151 +VERTEX2 6909 -119.401 -86.8789 3.11747 +VERTEX2 6910 -120.381 -86.8143 3.12854 +VERTEX2 6911 -120.389 -87.8544 -1.61627 +VERTEX2 6912 -120.488 -88.9421 -1.58248 +VERTEX2 6913 -120.583 -89.9959 -1.59098 +VERTEX2 6914 -120.629 -91.0086 -1.58327 +VERTEX2 6915 -120.66 -92.0846 -1.5659 +VERTEX2 6916 -121.687 -92.0816 -3.13727 +VERTEX2 6917 -122.648 -92.0717 -3.10501 +VERTEX2 6918 -123.651 -92.2564 -3.11443 +VERTEX2 6919 -124.7 -92.2241 -3.11067 +VERTEX2 6920 -125.727 -92.2245 -3.12099 +VERTEX2 6921 -125.63 -93.2988 -1.54476 +VERTEX2 6922 -125.645 -94.3377 -1.50133 +VERTEX2 6923 -125.562 -95.3478 -1.50388 +VERTEX2 6924 -125.365 -96.429 -1.53541 +VERTEX2 6925 -125.423 -97.501 -1.52629 +VERTEX2 6926 -124.435 -97.3835 0.0530061 +VERTEX2 6927 -123.46 -97.3397 -0.0207878 +VERTEX2 6928 -122.496 -97.34 0.00096932 +VERTEX2 6929 -121.582 -97.3877 -0.0130099 +VERTEX2 6930 -120.545 -97.397 -0.037277 +VERTEX2 6931 -120.586 -98.4802 -1.63061 +VERTEX2 6932 -120.608 -99.4899 -1.6301 +VERTEX2 6933 -120.661 -100.448 -1.64124 +VERTEX2 6934 -120.689 -101.396 -1.61724 +VERTEX2 6935 -120.717 -102.36 -1.63832 +VERTEX2 6936 -119.61 -102.427 -0.0671792 +VERTEX2 6937 -118.696 -102.52 -0.0781918 +VERTEX2 6938 -117.749 -102.679 -0.0961668 +VERTEX2 6939 -116.709 -102.83 -0.0662185 +VERTEX2 6940 -115.772 -102.94 -0.00255246 +VERTEX2 6941 -115.763 -102.009 1.56039 +VERTEX2 6942 -115.776 -101.053 1.56817 +VERTEX2 6943 -115.807 -100.113 1.55428 +VERTEX2 6944 -115.803 -99.1328 1.54419 +VERTEX2 6945 -115.698 -98.2268 1.55079 +VERTEX2 6946 -116.68 -98.3287 3.12781 +VERTEX2 6947 -117.754 -98.263 3.13245 +VERTEX2 6948 -118.844 -98.242 3.1355 +VERTEX2 6949 -119.796 -98.2084 3.10119 +VERTEX2 6950 -120.764 -98.1698 3.06617 +VERTEX2 6951 -120.695 -97.1514 1.49311 +VERTEX2 6952 -120.623 -96.1034 1.48874 +VERTEX2 6953 -120.591 -95.0866 1.47567 +VERTEX2 6954 -120.44 -94.1093 1.46706 +VERTEX2 6955 -120.286 -93.1368 1.49518 +VERTEX2 6956 -121.354 -93.0963 3.07146 +VERTEX2 6957 -122.366 -93.025 3.09532 +VERTEX2 6958 -123.276 -92.9841 3.10361 +VERTEX2 6959 -124.359 -92.9894 3.12245 +VERTEX2 6960 -125.334 -92.9248 3.10543 +VERTEX2 6961 -125.297 -91.917 1.52377 +VERTEX2 6962 -125.206 -90.8501 1.52563 +VERTEX2 6963 -125.202 -89.8356 1.53128 +VERTEX2 6964 -125.247 -88.874 1.51795 +VERTEX2 6965 -125.195 -87.8814 1.53968 +VERTEX2 6966 -124.086 -87.9056 -0.0181705 +VERTEX2 6967 -123.131 -87.9143 -0.00937919 +VERTEX2 6968 -122.066 -87.8632 -0.022796 +VERTEX2 6969 -121.1 -87.818 -0.0372232 +VERTEX2 6970 -120.044 -87.8992 -0.01482 +VERTEX2 6971 -119.931 -86.8774 1.56431 +VERTEX2 6972 -119.931 -85.8754 1.5369 +VERTEX2 6973 -119.88 -84.9367 1.49301 +VERTEX2 6974 -119.786 -83.9396 1.47156 +VERTEX2 6975 -119.688 -82.95 1.49138 +VERTEX2 6976 -120.653 -82.8664 3.08674 +VERTEX2 6977 -121.702 -82.881 3.04777 +VERTEX2 6978 -122.706 -82.7608 3.0566 +VERTEX2 6979 -123.672 -82.7112 3.07518 +VERTEX2 6980 -124.762 -82.6077 3.07917 +VERTEX2 6981 -124.653 -81.5925 1.51478 +VERTEX2 6982 -124.661 -80.5672 1.52523 +VERTEX2 6983 -124.648 -79.6192 1.51006 +VERTEX2 6984 -124.582 -78.5991 1.49794 +VERTEX2 6985 -124.511 -77.5937 1.49583 +VERTEX2 6986 -125.491 -77.544 3.04721 +VERTEX2 6987 -126.498 -77.4925 3.03521 +VERTEX2 6988 -127.506 -77.4418 3.0353 +VERTEX2 6989 -128.517 -77.4099 3.0256 +VERTEX2 6990 -129.508 -77.211 3.06391 +VERTEX2 6991 -129.494 -76.1366 1.51156 +VERTEX2 6992 -129.363 -75.2171 1.50288 +VERTEX2 6993 -129.256 -74.2164 1.47137 +VERTEX2 6994 -129.104 -73.2059 1.43737 +VERTEX2 6995 -129 -72.3715 1.46639 +VERTEX2 6996 -128.041 -72.5204 -0.110358 +VERTEX2 6997 -127.131 -72.5464 -0.111097 +VERTEX2 6998 -126.029 -72.6404 -0.151441 +VERTEX2 6999 -125.007 -72.8343 -0.146496 +VERTEX2 7000 -124.059 -73.0266 -0.150994 +VERTEX2 7001 -123.877 -71.9623 1.39171 +VERTEX2 7002 -123.661 -70.8974 1.40237 +VERTEX2 7003 -123.547 -69.959 1.40277 +VERTEX2 7004 -123.39 -69.0135 1.43013 +VERTEX2 7005 -123.231 -68.0186 1.4254 +VERTEX2 7006 -124.317 -67.9137 3.00178 +VERTEX2 7007 -125.333 -67.7235 2.99739 +VERTEX2 7008 -126.286 -67.5703 3.03474 +VERTEX2 7009 -127.252 -67.3977 3.00321 +VERTEX2 7010 -128.237 -67.2299 3.02506 +VERTEX2 7011 -128.532 -68.236 -1.69619 +VERTEX2 7012 -128.68 -69.2916 -1.69644 +VERTEX2 7013 -128.774 -70.2981 -1.69446 +VERTEX2 7014 -129.023 -71.2469 -1.71019 +VERTEX2 7015 -129.148 -72.1595 -1.72172 +VERTEX2 7016 -128.186 -72.2596 -0.151856 +VERTEX2 7017 -127.283 -72.3906 -0.180587 +VERTEX2 7018 -126.284 -72.4999 -0.14583 +VERTEX2 7019 -125.245 -72.6743 -0.173778 +VERTEX2 7020 -124.211 -72.8117 -0.168973 +VERTEX2 7021 -124.071 -71.8615 1.39123 +VERTEX2 7022 -123.89 -70.8447 1.34801 +VERTEX2 7023 -123.682 -69.8133 1.3506 +VERTEX2 7024 -123.521 -68.8214 1.34202 +VERTEX2 7025 -123.299 -67.9516 1.34307 +VERTEX2 7026 -124.298 -67.7904 2.91538 +VERTEX2 7027 -125.247 -67.6424 2.87946 +VERTEX2 7028 -126.181 -67.428 2.88752 +VERTEX2 7029 -127.203 -67.1964 2.8725 +VERTEX2 7030 -128.149 -66.937 2.89567 +VERTEX2 7031 -128.419 -67.9238 -1.77705 +VERTEX2 7032 -128.639 -68.8328 -1.75106 +VERTEX2 7033 -128.677 -69.7497 -1.76966 +VERTEX2 7034 -128.936 -70.7626 -1.8064 +VERTEX2 7035 -129.209 -71.8015 -1.79512 +VERTEX2 7036 -128.193 -71.9299 -0.251292 +VERTEX2 7037 -127.253 -72.1514 -0.223522 +VERTEX2 7038 -126.34 -72.3952 -0.229947 +VERTEX2 7039 -125.444 -72.6949 -0.224938 +VERTEX2 7040 -124.502 -72.9345 -0.229447 +VERTEX2 7041 -124.31 -71.9497 1.31356 +VERTEX2 7042 -124.032 -70.9974 1.28997 +VERTEX2 7043 -123.718 -70.0044 1.29905 +VERTEX2 7044 -123.38 -69.0428 1.31093 +VERTEX2 7045 -123.153 -68.118 1.32211 +VERTEX2 7046 -124.188 -67.8758 2.86331 +VERTEX2 7047 -125.104 -67.6213 2.84458 +VERTEX2 7048 -126.045 -67.3416 2.86154 +VERTEX2 7049 -127.033 -67.0781 2.84525 +VERTEX2 7050 -127.925 -66.7941 2.84092 +VERTEX2 7051 -127.631 -65.8746 1.29631 +VERTEX2 7052 -127.382 -64.9499 1.26244 +VERTEX2 7053 -127.169 -63.9466 1.27128 +VERTEX2 7054 -126.845 -63.0358 1.29013 +VERTEX2 7055 -126.609 -62.0529 1.29296 +VERTEX2 7056 -127.613 -61.8554 2.84097 +VERTEX2 7057 -128.524 -61.5035 2.79622 +VERTEX2 7058 -129.495 -61.207 2.81173 +VERTEX2 7059 -130.44 -60.8589 2.80995 +VERTEX2 7060 -131.286 -60.5605 2.77142 +VERTEX2 7061 -130.879 -59.6795 1.21352 +VERTEX2 7062 -130.517 -58.7479 1.21227 +VERTEX2 7063 -130.213 -57.8631 1.23135 +VERTEX2 7064 -129.915 -56.953 1.21644 +VERTEX2 7065 -129.58 -56.0762 1.23481 +VERTEX2 7066 -130.495 -55.7726 2.82161 +VERTEX2 7067 -131.455 -55.4542 2.81836 +VERTEX2 7068 -132.35 -55.0874 2.80466 +VERTEX2 7069 -133.286 -54.7619 2.79183 +VERTEX2 7070 -134.219 -54.4466 2.78259 +VERTEX2 7071 -133.829 -53.4627 1.22916 +VERTEX2 7072 -133.456 -52.5299 1.22539 +VERTEX2 7073 -133.083 -51.6352 1.2137 +VERTEX2 7074 -132.706 -50.7336 1.223 +VERTEX2 7075 -132.398 -49.8848 1.24691 +VERTEX2 7076 -133.334 -49.5568 2.8423 +VERTEX2 7077 -134.256 -49.3265 2.87404 +VERTEX2 7078 -135.241 -49.1052 2.89309 +VERTEX2 7079 -136.235 -48.7579 2.89736 +VERTEX2 7080 -137.266 -48.4646 2.88557 +VERTEX2 7081 -137.531 -49.4236 -1.82822 +VERTEX2 7082 -137.781 -50.2874 -1.84906 +VERTEX2 7083 -138.047 -51.1216 -1.81782 +VERTEX2 7084 -138.213 -52.0385 -1.83476 +VERTEX2 7085 -138.562 -52.9548 -1.84569 +VERTEX2 7086 -137.607 -53.2389 -0.300297 +VERTEX2 7087 -136.549 -53.4943 -0.296233 +VERTEX2 7088 -135.582 -53.7608 -0.298386 +VERTEX2 7089 -134.576 -53.9654 -0.283985 +VERTEX2 7090 -133.661 -54.2851 -0.277666 +VERTEX2 7091 -133.934 -55.2478 -1.79913 +VERTEX2 7092 -134.139 -56.2211 -1.82833 +VERTEX2 7093 -134.347 -57.1667 -1.80663 +VERTEX2 7094 -134.585 -58.0757 -1.81044 +VERTEX2 7095 -134.815 -59.0519 -1.80585 +VERTEX2 7096 -133.771 -59.2846 -0.222661 +VERTEX2 7097 -132.795 -59.4097 -0.231386 +VERTEX2 7098 -131.82 -59.6035 -0.225253 +VERTEX2 7099 -130.867 -59.8089 -0.194812 +VERTEX2 7100 -129.819 -60.0674 -0.196981 +VERTEX2 7101 -129.643 -59.1207 1.39039 +VERTEX2 7102 -129.437 -58.14 1.36058 +VERTEX2 7103 -129.121 -57.1449 1.3391 +VERTEX2 7104 -128.889 -56.1823 1.32002 +VERTEX2 7105 -128.686 -55.2392 1.37352 +VERTEX2 7106 -127.669 -55.4353 -0.193456 +VERTEX2 7107 -126.615 -55.539 -0.210001 +VERTEX2 7108 -125.636 -55.7374 -0.207716 +VERTEX2 7109 -124.689 -55.9535 -0.198503 +VERTEX2 7110 -123.603 -56.2218 -0.238771 +VERTEX2 7111 -123.428 -55.2677 1.31721 +VERTEX2 7112 -123.144 -54.2256 1.29671 +VERTEX2 7113 -122.901 -53.3099 1.31281 +VERTEX2 7114 -122.542 -52.3583 1.32463 +VERTEX2 7115 -122.299 -51.4145 1.33458 +VERTEX2 7116 -123.33 -51.1041 2.87238 +VERTEX2 7117 -124.313 -50.8705 2.83989 +VERTEX2 7118 -125.217 -50.6502 2.86389 +VERTEX2 7119 -126.19 -50.3355 2.85333 +VERTEX2 7120 -127.112 -50.0745 2.85406 +VERTEX2 7121 -127.424 -50.958 -1.83353 +VERTEX2 7122 -127.727 -51.9035 -1.84256 +VERTEX2 7123 -127.928 -52.8452 -1.833 +VERTEX2 7124 -128.278 -53.7548 -1.82239 +VERTEX2 7125 -128.514 -54.7417 -1.80976 +VERTEX2 7126 -127.577 -54.9483 -0.249655 +VERTEX2 7127 -126.684 -55.1842 -0.261806 +VERTEX2 7128 -125.674 -55.4192 -0.254041 +VERTEX2 7129 -124.725 -55.6447 -0.259982 +VERTEX2 7130 -123.733 -55.9093 -0.243384 +VERTEX2 7131 -123.495 -54.9256 1.31298 +VERTEX2 7132 -123.335 -53.9525 1.30753 +VERTEX2 7133 -123.062 -53.057 1.31345 +VERTEX2 7134 -122.83 -52.1558 1.32514 +VERTEX2 7135 -122.586 -51.1754 1.33243 +VERTEX2 7136 -123.627 -50.9382 2.92123 +VERTEX2 7137 -124.668 -50.7134 2.91954 +VERTEX2 7138 -125.633 -50.4963 2.95116 +VERTEX2 7139 -126.586 -50.3004 2.92344 +VERTEX2 7140 -127.498 -50.0982 2.92295 +VERTEX2 7141 -127.298 -49.0799 1.34217 +VERTEX2 7142 -126.986 -48.1003 1.3332 +VERTEX2 7143 -126.651 -47.1592 1.30543 +VERTEX2 7144 -126.378 -46.1911 1.31554 +VERTEX2 7145 -126.014 -45.1598 1.32523 +VERTEX2 7146 -127.046 -44.9647 2.89306 +VERTEX2 7147 -127.956 -44.7517 2.91255 +VERTEX2 7148 -128.927 -44.5356 2.89466 +VERTEX2 7149 -129.952 -44.2794 2.90803 +VERTEX2 7150 -130.894 -44.0242 2.913 +VERTEX2 7151 -131.154 -44.9167 -1.79998 +VERTEX2 7152 -131.481 -45.8791 -1.8162 +VERTEX2 7153 -131.683 -46.7901 -1.83081 +VERTEX2 7154 -131.947 -47.7988 -1.80822 +VERTEX2 7155 -132.11 -48.7378 -1.80684 +VERTEX2 7156 -131.081 -48.974 -0.224551 +VERTEX2 7157 -130.138 -49.1895 -0.231782 +VERTEX2 7158 -129.204 -49.4605 -0.24374 +VERTEX2 7159 -128.261 -49.7181 -0.234687 +VERTEX2 7160 -127.284 -49.9138 -0.245303 +VERTEX2 7161 -127.093 -49.0168 1.35984 +VERTEX2 7162 -126.877 -47.9752 1.38522 +VERTEX2 7163 -126.65 -46.8919 1.37189 +VERTEX2 7164 -126.404 -45.9244 1.40606 +VERTEX2 7165 -126.266 -44.9913 1.41735 +VERTEX2 7166 -125.358 -45.1406 -0.160199 +VERTEX2 7167 -124.342 -45.2606 -0.181945 +VERTEX2 7168 -123.343 -45.3699 -0.163069 +VERTEX2 7169 -122.406 -45.5199 -0.128061 +VERTEX2 7170 -121.406 -45.6941 -0.122743 +VERTEX2 7171 -121.611 -46.7349 -1.68293 +VERTEX2 7172 -121.678 -47.6966 -1.69954 +VERTEX2 7173 -121.707 -48.571 -1.66069 +VERTEX2 7174 -121.693 -49.5965 -1.6666 +VERTEX2 7175 -121.86 -50.6743 -1.67017 +VERTEX2 7176 -120.792 -50.7619 -0.12419 +VERTEX2 7177 -119.744 -50.8549 -0.0915942 +VERTEX2 7178 -118.775 -50.9459 -0.0923109 +VERTEX2 7179 -117.716 -51.0297 -0.0988942 +VERTEX2 7180 -116.681 -51.1295 -0.0881777 +VERTEX2 7181 -116.648 -50.1538 1.46654 +VERTEX2 7182 -116.584 -49.2277 1.49388 +VERTEX2 7183 -116.463 -48.1693 1.55334 +VERTEX2 7184 -116.438 -47.1731 1.54018 +VERTEX2 7185 -116.413 -46.1385 1.5199 +VERTEX2 7186 -115.499 -46.2661 -0.0398051 +VERTEX2 7187 -114.506 -46.2693 -0.0289453 +VERTEX2 7188 -113.498 -46.2955 -0.0252874 +VERTEX2 7189 -112.493 -46.3203 -0.0239326 +VERTEX2 7190 -111.522 -46.4006 -0.0306392 +VERTEX2 7191 -111.696 -47.4546 -1.59821 +VERTEX2 7192 -111.746 -48.4706 -1.58704 +VERTEX2 7193 -111.77 -49.5104 -1.60411 +VERTEX2 7194 -111.818 -50.4651 -1.59838 +VERTEX2 7195 -111.847 -51.4158 -1.59737 +VERTEX2 7196 -110.869 -51.4795 -0.0203797 +VERTEX2 7197 -109.876 -51.5976 -0.00847247 +VERTEX2 7198 -108.76 -51.6297 -0.031108 +VERTEX2 7199 -107.789 -51.5685 -0.0289861 +VERTEX2 7200 -106.792 -51.6359 -0.0260686 +VERTEX2 7201 -106.856 -52.6843 -1.60902 +VERTEX2 7202 -106.997 -53.7266 -1.59146 +VERTEX2 7203 -106.979 -54.8235 -1.55839 +VERTEX2 7204 -106.945 -55.8103 -1.58432 +VERTEX2 7205 -106.95 -56.8896 -1.56438 +VERTEX2 7206 -105.937 -56.9083 0.0297384 +VERTEX2 7207 -104.939 -56.9125 0.0351546 +VERTEX2 7208 -103.883 -56.8672 0.0497035 +VERTEX2 7209 -102.894 -56.7456 0.055923 +VERTEX2 7210 -101.851 -56.6667 0.0760431 +VERTEX2 7211 -101.919 -55.6343 1.63142 +VERTEX2 7212 -101.959 -54.5873 1.63246 +VERTEX2 7213 -102.088 -53.5399 1.61285 +VERTEX2 7214 -102.159 -52.5233 1.57393 +VERTEX2 7215 -102.142 -51.4801 1.58514 +VERTEX2 7216 -103.103 -51.5394 -3.1338 +VERTEX2 7217 -104.072 -51.5349 -3.12127 +VERTEX2 7218 -105.189 -51.5278 -3.09333 +VERTEX2 7219 -106.243 -51.5618 -3.12903 +VERTEX2 7220 -107.186 -51.5382 -3.12677 +VERTEX2 7221 -107.185 -52.6214 -1.55408 +VERTEX2 7222 -107.174 -53.5581 -1.54711 +VERTEX2 7223 -107.191 -54.5487 -1.56537 +VERTEX2 7224 -107.192 -55.5384 -1.53508 +VERTEX2 7225 -107.053 -56.5541 -1.53702 +VERTEX2 7226 -108.064 -56.5606 -3.13895 +VERTEX2 7227 -109.004 -56.5217 3.11979 +VERTEX2 7228 -110.1 -56.5686 3.10582 +VERTEX2 7229 -111.124 -56.5834 3.12614 +VERTEX2 7230 -112.007 -56.5519 3.12755 +VERTEX2 7231 -112.109 -57.49 -1.58808 +VERTEX2 7232 -112.127 -58.4803 -1.57043 +VERTEX2 7233 -112.105 -59.4891 -1.55838 +VERTEX2 7234 -112.106 -60.5154 -1.52403 +VERTEX2 7235 -111.951 -61.5089 -1.53258 +VERTEX2 7236 -112.978 -61.647 -3.10374 +VERTEX2 7237 -114.019 -61.6882 -3.10316 +VERTEX2 7238 -115.029 -61.6785 -3.121 +VERTEX2 7239 -116.041 -61.771 3.12202 +VERTEX2 7240 -117.008 -61.7426 3.10655 +VERTEX2 7241 -117.015 -60.8177 1.53836 +VERTEX2 7242 -116.954 -59.8477 1.50858 +VERTEX2 7243 -116.967 -58.871 1.50998 +VERTEX2 7244 -116.842 -57.863 1.50523 +VERTEX2 7245 -116.817 -56.8917 1.49291 +VERTEX2 7246 -117.837 -56.7968 3.05237 +VERTEX2 7247 -118.853 -56.6011 3.06546 +VERTEX2 7248 -119.865 -56.5189 3.05075 +VERTEX2 7249 -120.8 -56.4614 3.03351 +VERTEX2 7250 -121.873 -56.3681 3.06225 +VERTEX2 7251 -121.711 -55.3282 1.47296 +VERTEX2 7252 -121.585 -54.3164 1.49311 +VERTEX2 7253 -121.535 -53.2556 1.51275 +VERTEX2 7254 -121.551 -52.2099 1.51436 +VERTEX2 7255 -121.551 -51.3235 1.53235 +VERTEX2 7256 -122.605 -51.2691 3.11086 +VERTEX2 7257 -123.655 -51.2784 3.09801 +VERTEX2 7258 -124.751 -51.3019 3.13108 +VERTEX2 7259 -125.771 -51.2431 3.11065 +VERTEX2 7260 -126.742 -51.2431 3.10168 +VERTEX2 7261 -126.764 -52.2782 -1.62653 +VERTEX2 7262 -126.839 -53.1511 -1.60432 +VERTEX2 7263 -126.877 -54.2017 -1.59287 +VERTEX2 7264 -126.825 -55.197 -1.57408 +VERTEX2 7265 -126.825 -56.1345 -1.5472 +VERTEX2 7266 -125.849 -56.0679 0.0241168 +VERTEX2 7267 -124.913 -55.972 -0.0103136 +VERTEX2 7268 -123.983 -56.0677 0.0126762 +VERTEX2 7269 -123.008 -56.0554 0.0249546 +VERTEX2 7270 -122.048 -56.0556 0.021812 +VERTEX2 7271 -122.115 -55.1244 1.59653 +VERTEX2 7272 -122.118 -54.1298 1.60828 +VERTEX2 7273 -122.107 -53.166 1.61001 +VERTEX2 7274 -122.207 -52.1208 1.60677 +VERTEX2 7275 -122.301 -51.1444 1.61925 +VERTEX2 7276 -121.292 -51.0015 0.00997543 +VERTEX2 7277 -120.303 -51.0714 0.00529427 +VERTEX2 7278 -119.182 -51.1419 0.0506201 +VERTEX2 7279 -118.24 -51.1267 0.037245 +VERTEX2 7280 -117.211 -51.1269 0.00165641 +VERTEX2 7281 -117.241 -50.1951 1.55467 +VERTEX2 7282 -117.22 -49.2197 1.54575 +VERTEX2 7283 -117.14 -48.2626 1.53447 +VERTEX2 7284 -117.135 -47.2967 1.52885 +VERTEX2 7285 -117.1 -46.3435 1.52447 +VERTEX2 7286 -118.033 -46.3342 3.11932 +VERTEX2 7287 -118.999 -46.4474 3.11192 +VERTEX2 7288 -120.032 -46.5142 -3.12826 +VERTEX2 7289 -120.962 -46.5087 -3.13277 +VERTEX2 7290 -121.901 -46.4691 -3.12405 +VERTEX2 7291 -121.875 -47.5065 -1.60713 +VERTEX2 7292 -121.937 -48.5423 -1.62928 +VERTEX2 7293 -121.992 -49.6212 -1.61592 +VERTEX2 7294 -122.057 -50.6397 -1.59695 +VERTEX2 7295 -122.133 -51.6565 -1.58158 +VERTEX2 7296 -121.088 -51.6527 -0.0150209 +VERTEX2 7297 -120.119 -51.6438 -0.022545 +VERTEX2 7298 -119.198 -51.5977 -0.0448837 +VERTEX2 7299 -118.253 -51.6422 -0.0312476 +VERTEX2 7300 -117.215 -51.708 -0.0425471 +VERTEX2 7301 -117.15 -50.6956 1.513 +VERTEX2 7302 -117.1 -49.7006 1.4984 +VERTEX2 7303 -117.022 -48.7311 1.46728 +VERTEX2 7304 -116.959 -47.8363 1.45986 +VERTEX2 7305 -116.825 -46.7761 1.44447 +VERTEX2 7306 -117.746 -46.6177 3.00818 +VERTEX2 7307 -118.763 -46.5006 3.01415 +VERTEX2 7308 -119.782 -46.3717 3.00155 +VERTEX2 7309 -120.808 -46.2223 2.98802 +VERTEX2 7310 -121.835 -46.0687 2.93323 +VERTEX2 7311 -122.019 -47.0122 -1.80361 +VERTEX2 7312 -122.24 -47.9386 -1.79133 +VERTEX2 7313 -122.44 -48.9606 -1.77397 +VERTEX2 7314 -122.658 -49.9456 -1.76555 +VERTEX2 7315 -122.822 -50.9501 -1.78555 +VERTEX2 7316 -121.762 -51.1542 -0.187852 +VERTEX2 7317 -120.753 -51.3761 -0.196833 +VERTEX2 7318 -119.744 -51.6225 -0.199532 +VERTEX2 7319 -118.716 -51.8744 -0.200801 +VERTEX2 7320 -117.735 -52.0369 -0.226709 +VERTEX2 7321 -117.537 -50.9465 1.34405 +VERTEX2 7322 -117.346 -49.9392 1.31786 +VERTEX2 7323 -117.005 -48.9308 1.31311 +VERTEX2 7324 -116.756 -47.9867 1.32073 +VERTEX2 7325 -116.531 -47.0076 1.29167 +VERTEX2 7326 -117.483 -46.7377 2.84961 +VERTEX2 7327 -118.473 -46.4477 2.86145 +VERTEX2 7328 -119.452 -46.1196 2.87786 +VERTEX2 7329 -120.303 -45.7658 2.8451 +VERTEX2 7330 -121.335 -45.4525 2.79664 +VERTEX2 7331 -121.658 -46.408 -1.91662 +VERTEX2 7332 -121.936 -47.3836 -1.92829 +VERTEX2 7333 -122.323 -48.2822 -1.95447 +VERTEX2 7334 -122.689 -49.2084 -1.9551 +VERTEX2 7335 -123.005 -50.1715 -1.94235 +VERTEX2 7336 -122.091 -50.4884 -0.347364 +VERTEX2 7337 -121.127 -50.7829 -0.345071 +VERTEX2 7338 -120.228 -51.1428 -0.314479 +VERTEX2 7339 -119.224 -51.5157 -0.336249 +VERTEX2 7340 -118.257 -51.8785 -0.367908 +VERTEX2 7341 -117.928 -50.9353 1.22477 +VERTEX2 7342 -117.543 -49.9756 1.24655 +VERTEX2 7343 -117.199 -49.0575 1.2575 +VERTEX2 7344 -116.942 -48.1123 1.27322 +VERTEX2 7345 -116.739 -47.185 1.29671 +VERTEX2 7346 -117.769 -46.9352 2.86601 +VERTEX2 7347 -118.646 -46.6375 2.84373 +VERTEX2 7348 -119.659 -46.3008 2.81374 +VERTEX2 7349 -120.645 -45.9083 2.8024 +VERTEX2 7350 -121.598 -45.4955 2.82991 +VERTEX2 7351 -121.881 -46.4958 -1.86644 +VERTEX2 7352 -122.14 -47.4968 -1.87397 +VERTEX2 7353 -122.439 -48.4551 -1.8932 +VERTEX2 7354 -122.795 -49.4087 -1.89142 +VERTEX2 7355 -123.111 -50.2876 -1.87133 +VERTEX2 7356 -122.09 -50.5593 -0.280037 +VERTEX2 7357 -121.079 -50.8638 -0.291344 +VERTEX2 7358 -120.187 -51.1656 -0.317781 +VERTEX2 7359 -119.229 -51.4593 -0.338535 +VERTEX2 7360 -118.3 -51.8 -0.326067 +VERTEX2 7361 -117.995 -50.8196 1.25644 +VERTEX2 7362 -117.635 -49.8239 1.23983 +VERTEX2 7363 -117.355 -48.8528 1.25505 +VERTEX2 7364 -117.084 -47.9719 1.2655 +VERTEX2 7365 -116.819 -46.9843 1.28839 +VERTEX2 7366 -115.865 -47.2566 -0.317772 +VERTEX2 7367 -114.887 -47.4988 -0.31315 +VERTEX2 7368 -113.926 -47.7338 -0.274014 +VERTEX2 7369 -112.892 -48.0063 -0.266873 +VERTEX2 7370 -111.865 -48.2721 -0.245983 +VERTEX2 7371 -111.629 -47.2475 1.34581 +VERTEX2 7372 -111.406 -46.2085 1.34903 +VERTEX2 7373 -111.214 -45.2515 1.33309 +VERTEX2 7374 -110.972 -44.2986 1.32217 +VERTEX2 7375 -110.722 -43.2461 1.29452 +VERTEX2 7376 -111.673 -43.0344 2.8897 +VERTEX2 7377 -112.585 -42.8419 2.88462 +VERTEX2 7378 -113.505 -42.6208 2.91749 +VERTEX2 7379 -114.491 -42.5162 2.93981 +VERTEX2 7380 -115.494 -42.3351 2.94248 +VERTEX2 7381 -115.253 -41.3592 1.39044 +VERTEX2 7382 -115.107 -40.3806 1.38859 +VERTEX2 7383 -114.915 -39.3663 1.36488 +VERTEX2 7384 -114.766 -38.3194 1.34858 +VERTEX2 7385 -114.452 -37.3523 1.38332 +VERTEX2 7386 -115.412 -37.2102 2.95976 +VERTEX2 7387 -116.468 -36.9755 2.98364 +VERTEX2 7388 -117.43 -36.8695 2.98298 +VERTEX2 7389 -118.38 -36.7051 2.95464 +VERTEX2 7390 -119.363 -36.4991 2.9532 +VERTEX2 7391 -119.531 -37.5709 -1.75561 +VERTEX2 7392 -119.688 -38.5381 -1.77029 +VERTEX2 7393 -119.885 -39.5941 -1.77496 +VERTEX2 7394 -119.998 -40.505 -1.79234 +VERTEX2 7395 -120.259 -41.5503 -1.75941 +VERTEX2 7396 -121.253 -41.3907 2.97327 +VERTEX2 7397 -122.296 -41.2403 2.95351 +VERTEX2 7398 -123.26 -41.0476 2.93384 +VERTEX2 7399 -124.258 -40.8447 2.94132 +VERTEX2 7400 -125.228 -40.6536 2.94691 +VERTEX2 7401 -125.454 -41.6828 -1.74259 +VERTEX2 7402 -125.561 -42.5921 -1.72437 +VERTEX2 7403 -125.681 -43.5588 -1.73603 +VERTEX2 7404 -125.753 -44.5066 -1.74494 +VERTEX2 7405 -125.956 -45.4852 -1.72142 +VERTEX2 7406 -126.993 -45.2611 2.99295 +VERTEX2 7407 -127.992 -45.112 3.02027 +VERTEX2 7408 -129.007 -44.9767 2.99738 +VERTEX2 7409 -129.935 -44.8666 3.00163 +VERTEX2 7410 -130.965 -44.7693 2.98904 +VERTEX2 7411 -131.119 -45.8016 -1.68102 +VERTEX2 7412 -131.276 -46.8996 -1.68803 +VERTEX2 7413 -131.353 -47.9034 -1.73076 +VERTEX2 7414 -131.392 -48.9074 -1.69492 +VERTEX2 7415 -131.489 -49.9008 -1.7067 +VERTEX2 7416 -130.479 -50.0606 -0.0980373 +VERTEX2 7417 -129.613 -50.2104 -0.107165 +VERTEX2 7418 -128.653 -50.367 -0.121291 +VERTEX2 7419 -127.693 -50.4968 -0.134858 +VERTEX2 7420 -126.8 -50.5548 -0.151702 +VERTEX2 7421 -126.957 -51.6415 -1.72435 +VERTEX2 7422 -127.084 -52.667 -1.72892 +VERTEX2 7423 -127.283 -53.5875 -1.7238 +VERTEX2 7424 -127.451 -54.581 -1.71282 +VERTEX2 7425 -127.627 -55.5795 -1.72398 +VERTEX2 7426 -126.602 -55.7122 -0.174798 +VERTEX2 7427 -125.698 -55.9105 -0.190432 +VERTEX2 7428 -124.674 -56.1579 -0.190644 +VERTEX2 7429 -123.629 -56.332 -0.174151 +VERTEX2 7430 -122.715 -56.5028 -0.164077 +VERTEX2 7431 -122.615 -55.5173 1.41431 +VERTEX2 7432 -122.449 -54.4762 1.4217 +VERTEX2 7433 -122.271 -53.5408 1.42906 +VERTEX2 7434 -122.17 -52.4895 1.4263 +VERTEX2 7435 -121.926 -51.4494 1.39245 +VERTEX2 7436 -122.911 -51.2867 2.9991 +VERTEX2 7437 -123.928 -51.085 3.00989 +VERTEX2 7438 -124.826 -50.9793 2.99517 +VERTEX2 7439 -125.815 -50.833 2.97027 +VERTEX2 7440 -126.819 -50.6488 3.00178 +VERTEX2 7441 -126.667 -49.5949 1.40949 +VERTEX2 7442 -126.457 -48.6283 1.45081 +VERTEX2 7443 -126.323 -47.6593 1.44385 +VERTEX2 7444 -126.225 -46.722 1.41258 +VERTEX2 7445 -126.1 -45.7437 1.42519 +VERTEX2 7446 -125.2 -45.9687 -0.165978 +VERTEX2 7447 -124.182 -46.1686 -0.152182 +VERTEX2 7448 -123.253 -46.2994 -0.143395 +VERTEX2 7449 -122.334 -46.4532 -0.140618 +VERTEX2 7450 -121.304 -46.5587 -0.154023 +VERTEX2 7451 -121.108 -45.6269 1.43475 +VERTEX2 7452 -120.991 -44.6213 1.44194 +VERTEX2 7453 -120.941 -43.6759 1.47449 +VERTEX2 7454 -120.812 -42.6431 1.48257 +VERTEX2 7455 -120.709 -41.6821 1.49853 +VERTEX2 7456 -119.709 -41.7768 -0.110946 +VERTEX2 7457 -118.684 -41.7913 -0.125272 +VERTEX2 7458 -117.721 -41.9501 -0.109347 +VERTEX2 7459 -116.674 -42.0632 -0.106314 +VERTEX2 7460 -115.723 -42.1963 -0.0837022 +VERTEX2 7461 -115.645 -41.2344 1.47226 +VERTEX2 7462 -115.597 -40.2216 1.4967 +VERTEX2 7463 -115.388 -39.1582 1.48256 +VERTEX2 7464 -115.356 -38.1696 1.49449 +VERTEX2 7465 -115.221 -37.2252 1.52699 +VERTEX2 7466 -116.355 -37.3029 3.07199 +VERTEX2 7467 -117.41 -37.2011 3.03739 +VERTEX2 7468 -118.383 -37.1235 3.03362 +VERTEX2 7469 -119.398 -37.017 3.03704 +VERTEX2 7470 -120.385 -36.7133 3.01709 +VERTEX2 7471 -120.473 -37.701 -1.68872 +VERTEX2 7472 -120.58 -38.7561 -1.68169 +VERTEX2 7473 -120.626 -39.7136 -1.66253 +VERTEX2 7474 -120.648 -40.7617 -1.66332 +VERTEX2 7475 -120.724 -41.6568 -1.66579 +VERTEX2 7476 -121.653 -41.4762 3.04913 +VERTEX2 7477 -122.642 -41.3474 3.02005 +VERTEX2 7478 -123.614 -41.2475 2.98174 +VERTEX2 7479 -124.56 -41.1278 2.98682 +VERTEX2 7480 -125.578 -40.9106 2.97945 +VERTEX2 7481 -125.369 -40.0052 1.41541 +VERTEX2 7482 -125.277 -39.0977 1.40942 +VERTEX2 7483 -124.939 -38.1057 1.41759 +VERTEX2 7484 -124.762 -37.1725 1.40662 +VERTEX2 7485 -124.661 -36.1707 1.39315 +VERTEX2 7486 -125.631 -35.952 2.97554 +VERTEX2 7487 -126.635 -35.7816 2.96843 +VERTEX2 7488 -127.605 -35.5849 2.98387 +VERTEX2 7489 -128.618 -35.4626 2.97721 +VERTEX2 7490 -129.599 -35.3747 2.99464 +VERTEX2 7491 -129.753 -36.4573 -1.71509 +VERTEX2 7492 -129.908 -37.4806 -1.76794 +VERTEX2 7493 -130.118 -38.414 -1.79219 +VERTEX2 7494 -130.345 -39.4161 -1.79017 +VERTEX2 7495 -130.604 -40.4072 -1.81297 +VERTEX2 7496 -129.625 -40.6289 -0.238355 +VERTEX2 7497 -128.68 -40.9304 -0.256957 +VERTEX2 7498 -127.712 -41.1498 -0.237674 +VERTEX2 7499 -126.769 -41.4094 -0.255246 +VERTEX2 7500 -125.786 -41.7414 -0.251413 +VERTEX2 7501 -126.018 -42.6714 -1.86065 +VERTEX2 7502 -126.33 -43.6641 -1.87548 +VERTEX2 7503 -126.609 -44.5877 -1.87091 +VERTEX2 7504 -126.933 -45.5068 -1.87679 +VERTEX2 7505 -127.203 -46.5213 -1.8797 +VERTEX2 7506 -126.229 -46.7892 -0.324904 +VERTEX2 7507 -125.248 -47.1925 -0.344678 +VERTEX2 7508 -124.229 -47.5512 -0.348738 +VERTEX2 7509 -123.217 -47.8301 -0.345459 +VERTEX2 7510 -122.245 -48.2034 -0.38076 +VERTEX2 7511 -121.862 -47.3089 1.18551 +VERTEX2 7512 -121.483 -46.4182 1.19482 +VERTEX2 7513 -121.089 -45.4965 1.20892 +VERTEX2 7514 -120.728 -44.5581 1.24177 +VERTEX2 7515 -120.455 -43.6285 1.26422 +VERTEX2 7516 -119.594 -44.0172 -0.282713 +VERTEX2 7517 -118.613 -44.3584 -0.317787 +VERTEX2 7518 -117.669 -44.6268 -0.29029 +VERTEX2 7519 -116.77 -44.966 -0.294421 +VERTEX2 7520 -115.796 -45.2501 -0.308279 +VERTEX2 7521 -116.127 -46.1849 -1.88259 +VERTEX2 7522 -116.426 -47.1908 -1.90392 +VERTEX2 7523 -116.719 -48.0838 -1.93261 +VERTEX2 7524 -117.179 -49.0028 -1.90926 +VERTEX2 7525 -117.512 -50.0176 -1.91918 +VERTEX2 7526 -118.399 -49.6111 2.8278 +VERTEX2 7527 -119.401 -49.2779 2.80709 +VERTEX2 7528 -120.408 -49.0504 2.84143 +VERTEX2 7529 -121.362 -48.6894 2.85005 +VERTEX2 7530 -122.328 -48.4556 2.82812 +VERTEX2 7531 -122.051 -47.5277 1.25588 +VERTEX2 7532 -121.732 -46.6817 1.27354 +VERTEX2 7533 -121.46 -45.742 1.30527 +VERTEX2 7534 -121.18 -44.8019 1.29502 +VERTEX2 7535 -120.953 -43.8272 1.28782 +VERTEX2 7536 -120.019 -44.0727 -0.301441 +VERTEX2 7537 -118.965 -44.5013 -0.356258 +VERTEX2 7538 -118.056 -44.84 -0.354594 +VERTEX2 7539 -117.147 -45.245 -0.35795 +VERTEX2 7540 -116.255 -45.5911 -0.359959 +VERTEX2 7541 -115.893 -44.6454 1.2289 +VERTEX2 7542 -115.581 -43.664 1.20553 +VERTEX2 7543 -115.237 -42.7764 1.23457 +VERTEX2 7544 -114.853 -41.8133 1.23664 +VERTEX2 7545 -114.52 -40.8248 1.26424 +VERTEX2 7546 -115.492 -40.5204 2.82667 +VERTEX2 7547 -116.473 -40.2448 2.81596 +VERTEX2 7548 -117.424 -39.9018 2.79975 +VERTEX2 7549 -118.319 -39.6188 2.80535 +VERTEX2 7550 -119.16 -39.2648 2.81534 +VERTEX2 7551 -119.452 -40.1698 -1.90251 +VERTEX2 7552 -119.779 -41.1317 -1.90225 +VERTEX2 7553 -120.183 -42.0585 -1.89843 +VERTEX2 7554 -120.501 -43.103 -1.89274 +VERTEX2 7555 -120.755 -44.0149 -1.86855 +VERTEX2 7556 -119.813 -44.2879 -0.294308 +VERTEX2 7557 -118.847 -44.5956 -0.329827 +VERTEX2 7558 -117.896 -44.9174 -0.368299 +VERTEX2 7559 -117.012 -45.2701 -0.411796 +VERTEX2 7560 -116.174 -45.5851 -0.418241 +VERTEX2 7561 -115.75 -44.6207 1.14411 +VERTEX2 7562 -115.317 -43.6866 1.14051 +VERTEX2 7563 -114.804 -42.8047 1.17107 +VERTEX2 7564 -114.382 -41.933 1.12601 +VERTEX2 7565 -113.907 -41.11 1.14198 +VERTEX2 7566 -114.827 -40.71 2.72756 +VERTEX2 7567 -115.734 -40.3833 2.71779 +VERTEX2 7568 -116.699 -39.963 2.72652 +VERTEX2 7569 -117.605 -39.5662 2.70281 +VERTEX2 7570 -118.453 -39.1336 2.67312 +VERTEX2 7571 -118.879 -40.0332 -2.05153 +VERTEX2 7572 -119.355 -40.8724 -2.06652 +VERTEX2 7573 -119.813 -41.6451 -2.07392 +VERTEX2 7574 -120.298 -42.5017 -2.04076 +VERTEX2 7575 -120.721 -43.3897 -2.05148 +VERTEX2 7576 -119.878 -43.9196 -0.465373 +VERTEX2 7577 -118.931 -44.3514 -0.451387 +VERTEX2 7578 -118.074 -44.8158 -0.448738 +VERTEX2 7579 -117.176 -45.3445 -0.441407 +VERTEX2 7580 -116.319 -45.7924 -0.432 +VERTEX2 7581 -115.965 -44.915 1.12354 +VERTEX2 7582 -115.489 -44.026 1.13735 +VERTEX2 7583 -115.101 -43.1793 1.12852 +VERTEX2 7584 -114.654 -42.2597 1.10617 +VERTEX2 7585 -114.332 -41.4273 1.12321 +VERTEX2 7586 -113.343 -41.8029 -0.466537 +VERTEX2 7587 -112.494 -42.1638 -0.460484 +VERTEX2 7588 -111.581 -42.7056 -0.482564 +VERTEX2 7589 -110.73 -43.1408 -0.507033 +VERTEX2 7590 -109.925 -43.6005 -0.546902 +VERTEX2 7591 -110.483 -44.4007 -2.11652 +VERTEX2 7592 -111.028 -45.302 -2.11448 +VERTEX2 7593 -111.507 -46.2012 -2.1086 +VERTEX2 7594 -112.044 -47.0606 -2.11453 +VERTEX2 7595 -112.597 -47.9068 -2.11868 +VERTEX2 7596 -111.732 -48.481 -0.538461 +VERTEX2 7597 -110.907 -48.9508 -0.50964 +VERTEX2 7598 -109.987 -49.4849 -0.531825 +VERTEX2 7599 -109.043 -50.0262 -0.543785 +VERTEX2 7600 -108.129 -50.5974 -0.521677 +VERTEX2 7601 -108.698 -51.396 -2.0779 +VERTEX2 7602 -109.207 -52.2999 -2.05659 +VERTEX2 7603 -109.674 -53.1427 -2.03948 +VERTEX2 7604 -110.15 -54.129 -2.02978 +VERTEX2 7605 -110.692 -55.0591 -2.02806 +VERTEX2 7606 -109.787 -55.5798 -0.456223 +VERTEX2 7607 -108.898 -56.0252 -0.468343 +VERTEX2 7608 -108.055 -56.4346 -0.453555 +VERTEX2 7609 -107.19 -56.8514 -0.449977 +VERTEX2 7610 -106.368 -57.3709 -0.43566 +VERTEX2 7611 -106.007 -56.4965 1.12994 +VERTEX2 7612 -105.503 -55.566 1.09749 +VERTEX2 7613 -104.96 -54.6226 1.08407 +VERTEX2 7614 -104.513 -53.7393 1.1019 +VERTEX2 7615 -104.07 -52.9298 1.09872 +VERTEX2 7616 -105.007 -52.4425 2.6698 +VERTEX2 7617 -105.848 -52.0518 2.67312 +VERTEX2 7618 -106.714 -51.5689 2.68426 +VERTEX2 7619 -107.548 -51.1548 2.64932 +VERTEX2 7620 -108.43 -50.64 2.64322 +VERTEX2 7621 -108.974 -51.4581 -2.03981 +VERTEX2 7622 -109.315 -52.2979 -2.06101 +VERTEX2 7623 -109.809 -53.1869 -2.06413 +VERTEX2 7624 -110.372 -54.0826 -2.06158 +VERTEX2 7625 -110.791 -54.9772 -2.10529 +VERTEX2 7626 -111.717 -54.417 2.61961 +VERTEX2 7627 -112.599 -54.0494 2.61404 +VERTEX2 7628 -113.511 -53.5367 2.62459 +VERTEX2 7629 -114.33 -53.0362 2.62739 +VERTEX2 7630 -115.287 -52.6581 2.6128 +VERTEX2 7631 -114.746 -51.7915 1.04547 +VERTEX2 7632 -114.239 -50.9099 1.02946 +VERTEX2 7633 -113.677 -49.9791 1.06705 +VERTEX2 7634 -113.2 -49.1553 1.05014 +VERTEX2 7635 -112.771 -48.3369 1.01957 +VERTEX2 7636 -111.912 -48.8738 -0.543226 +VERTEX2 7637 -111.052 -49.4524 -0.499608 +VERTEX2 7638 -110.132 -49.931 -0.48195 +VERTEX2 7639 -109.254 -50.384 -0.486471 +VERTEX2 7640 -108.422 -50.7807 -0.51918 +VERTEX2 7641 -107.822 -49.9687 1.05247 +VERTEX2 7642 -107.365 -49.171 1.03253 +VERTEX2 7643 -106.762 -48.3889 1.04403 +VERTEX2 7644 -106.225 -47.5519 1.04979 +VERTEX2 7645 -105.774 -46.7158 1.04129 +VERTEX2 7646 -104.959 -47.2495 -0.529572 +VERTEX2 7647 -103.995 -47.688 -0.523794 +VERTEX2 7648 -103.238 -48.1428 -0.533321 +VERTEX2 7649 -102.387 -48.6336 -0.549929 +VERTEX2 7650 -101.563 -49.1253 -0.540833 +VERTEX2 7651 -101.047 -48.2711 0.990846 +VERTEX2 7652 -100.527 -47.409 0.986443 +VERTEX2 7653 -99.9386 -46.5157 0.989084 +VERTEX2 7654 -99.4032 -45.764 1.00429 +VERTEX2 7655 -98.9284 -44.8979 0.992435 +VERTEX2 7656 -98.0969 -45.4562 -0.602928 +VERTEX2 7657 -97.3228 -46.1333 -0.616628 +VERTEX2 7658 -96.5682 -46.6491 -0.600372 +VERTEX2 7659 -95.7268 -47.2914 -0.610301 +VERTEX2 7660 -94.729 -47.8867 -0.635449 +VERTEX2 7661 -95.3545 -48.6994 -2.18875 +VERTEX2 7662 -95.9375 -49.5046 -2.16894 +VERTEX2 7663 -96.4543 -50.3096 -2.19383 +VERTEX2 7664 -97.0064 -51.0506 -2.18535 +VERTEX2 7665 -97.6674 -51.8651 -2.16322 +VERTEX2 7666 -96.8093 -52.4497 -0.560369 +VERTEX2 7667 -95.8903 -52.9632 -0.558339 +VERTEX2 7668 -94.9959 -53.4794 -0.564269 +VERTEX2 7669 -94.1984 -54.0534 -0.583679 +VERTEX2 7670 -93.3835 -54.6688 -0.584668 +VERTEX2 7671 -92.7806 -53.9333 0.955206 +VERTEX2 7672 -92.228 -53.1275 0.942366 +VERTEX2 7673 -91.7051 -52.2898 0.929582 +VERTEX2 7674 -91.131 -51.4425 0.898809 +VERTEX2 7675 -90.5136 -50.6228 0.864514 +VERTEX2 7676 -91.2638 -49.9858 2.42874 +VERTEX2 7677 -92.0377 -49.2361 2.41505 +VERTEX2 7678 -92.6567 -48.5793 2.41118 +VERTEX2 7679 -93.4478 -47.8991 2.38207 +VERTEX2 7680 -94.0867 -47.2481 2.38295 +VERTEX2 7681 -94.7221 -47.9576 -2.34084 +VERTEX2 7682 -95.4247 -48.7079 -2.3028 +VERTEX2 7683 -96.1001 -49.4451 -2.29436 +VERTEX2 7684 -96.7283 -50.1294 -2.30489 +VERTEX2 7685 -97.3806 -50.8995 -2.31095 +VERTEX2 7686 -96.576 -51.6706 -0.748531 +VERTEX2 7687 -95.8906 -52.4749 -0.747765 +VERTEX2 7688 -95.1418 -53.2023 -0.750619 +VERTEX2 7689 -94.3144 -53.8464 -0.755589 +VERTEX2 7690 -93.5541 -54.4277 -0.725823 +VERTEX2 7691 -94.2223 -55.1673 -2.31191 +VERTEX2 7692 -94.8866 -55.9372 -2.30174 +VERTEX2 7693 -95.6183 -56.6328 -2.30923 +VERTEX2 7694 -96.2954 -57.3722 -2.31856 +VERTEX2 7695 -97.0788 -58.0542 -2.33174 +VERTEX2 7696 -97.9039 -57.3986 2.36619 +VERTEX2 7697 -98.6139 -56.7655 2.368 +VERTEX2 7698 -99.2954 -56.0815 2.37591 +VERTEX2 7699 -100.016 -55.449 2.39184 +VERTEX2 7700 -100.71 -54.7917 2.39031 +VERTEX2 7701 -101.42 -55.524 -2.29701 +VERTEX2 7702 -102.137 -56.2292 -2.34639 +VERTEX2 7703 -102.844 -56.9479 -2.35464 +VERTEX2 7704 -103.539 -57.6766 -2.3742 +VERTEX2 7705 -104.26 -58.2706 -2.36269 +VERTEX2 7706 -103.581 -58.9399 -0.789786 +VERTEX2 7707 -102.951 -59.7025 -0.783855 +VERTEX2 7708 -102.3 -60.4886 -0.784411 +VERTEX2 7709 -101.645 -61.1175 -0.751341 +VERTEX2 7710 -100.866 -61.7831 -0.732705 +VERTEX2 7711 -100.188 -61.114 0.837975 +VERTEX2 7712 -99.4151 -60.3567 0.821669 +VERTEX2 7713 -98.7576 -59.6496 0.811388 +VERTEX2 7714 -98.0835 -58.9105 0.814732 +VERTEX2 7715 -97.4166 -58.1751 0.831505 +VERTEX2 7716 -98.1959 -57.4133 2.38133 +VERTEX2 7717 -98.9971 -56.7069 2.40115 +VERTEX2 7718 -99.7227 -55.9971 2.37628 +VERTEX2 7719 -100.423 -55.3106 2.36834 +VERTEX2 7720 -101.049 -54.5885 2.37728 +VERTEX2 7721 -101.688 -55.3081 -2.35036 +VERTEX2 7722 -102.311 -56.0578 -2.34478 +VERTEX2 7723 -103.008 -56.8285 -2.34158 +VERTEX2 7724 -103.657 -57.517 -2.33764 +VERTEX2 7725 -104.338 -58.1941 -2.29661 +VERTEX2 7726 -105.184 -57.5948 2.42647 +VERTEX2 7727 -105.883 -56.9826 2.42924 +VERTEX2 7728 -106.58 -56.3064 2.41715 +VERTEX2 7729 -107.34 -55.6397 2.40528 +VERTEX2 7730 -108.121 -54.9447 2.40936 +VERTEX2 7731 -108.791 -55.6489 -2.2966 +VERTEX2 7732 -109.387 -56.4704 -2.31346 +VERTEX2 7733 -110.06 -57.1805 -2.33449 +VERTEX2 7734 -110.739 -57.9434 -2.33366 +VERTEX2 7735 -111.381 -58.6365 -2.33474 +VERTEX2 7736 -112.142 -57.9472 2.40942 +VERTEX2 7737 -112.78 -57.3049 2.41559 +VERTEX2 7738 -113.493 -56.6332 2.41675 +VERTEX2 7739 -114.255 -55.9657 2.41186 +VERTEX2 7740 -114.975 -55.2121 2.4113 +VERTEX2 7741 -115.664 -55.9071 -2.27559 +VERTEX2 7742 -116.24 -56.6864 -2.28638 +VERTEX2 7743 -117.002 -57.4645 -2.3211 +VERTEX2 7744 -117.629 -58.2183 -2.333 +VERTEX2 7745 -118.357 -58.8911 -2.34447 +VERTEX2 7746 -118.979 -58.2028 2.42757 +VERTEX2 7747 -119.801 -57.6012 2.4059 +VERTEX2 7748 -120.518 -56.8864 2.39948 +VERTEX2 7749 -121.189 -56.107 2.40139 +VERTEX2 7750 -121.873 -55.3744 2.41739 +VERTEX2 7751 -122.551 -56.0483 -2.25611 +VERTEX2 7752 -123.085 -56.7241 -2.25103 +VERTEX2 7753 -123.692 -57.4968 -2.25892 +VERTEX2 7754 -124.394 -58.2458 -2.26005 +VERTEX2 7755 -125.114 -59.0515 -2.27076 +VERTEX2 7756 -125.936 -58.4206 2.50214 +VERTEX2 7757 -126.675 -57.7605 2.48347 +VERTEX2 7758 -127.46 -57.2523 2.48298 +VERTEX2 7759 -128.307 -56.6716 2.48417 +VERTEX2 7760 -129.086 -56.0743 2.48865 +VERTEX2 7761 -129.602 -56.8198 -2.23065 +VERTEX2 7762 -130.238 -57.5875 -2.21629 +VERTEX2 7763 -131.023 -58.4873 -2.20368 +VERTEX2 7764 -131.623 -59.2704 -2.21745 +VERTEX2 7765 -132.208 -60.0735 -2.21307 +VERTEX2 7766 -133.021 -59.5694 2.49704 +VERTEX2 7767 -133.865 -58.9294 2.51021 +VERTEX2 7768 -134.642 -58.3565 2.51933 +VERTEX2 7769 -135.492 -57.7867 2.5338 +VERTEX2 7770 -136.338 -57.225 2.53258 +VERTEX2 7771 -136.857 -58.112 -2.19618 +VERTEX2 7772 -137.46 -58.9136 -2.18018 +VERTEX2 7773 -138.077 -59.7697 -2.16251 +VERTEX2 7774 -138.6 -60.6774 -2.20094 +VERTEX2 7775 -139.303 -61.4537 -2.2015 +VERTEX2 7776 -138.515 -62.0612 -0.628211 +VERTEX2 7777 -137.673 -62.615 -0.640061 +VERTEX2 7778 -136.949 -63.2013 -0.653212 +VERTEX2 7779 -136.131 -63.856 -0.635541 +VERTEX2 7780 -135.317 -64.4611 -0.648934 +VERTEX2 7781 -134.701 -63.6097 0.909767 +VERTEX2 7782 -134.13 -62.8148 0.906057 +VERTEX2 7783 -133.491 -62.0196 0.894511 +VERTEX2 7784 -132.94 -61.2449 0.88775 +VERTEX2 7785 -132.27 -60.5607 0.869049 +VERTEX2 7786 -133.004 -60.0394 2.44769 +VERTEX2 7787 -133.751 -59.422 2.44964 +VERTEX2 7788 -134.469 -58.7301 2.45462 +VERTEX2 7789 -135.193 -58.1282 2.46686 +VERTEX2 7790 -135.93 -57.5611 2.4785 +VERTEX2 7791 -136.556 -58.3038 -2.24855 +VERTEX2 7792 -137.148 -59.0153 -2.24765 +VERTEX2 7793 -137.775 -59.8679 -2.23542 +VERTEX2 7794 -138.428 -60.6446 -2.23788 +VERTEX2 7795 -139.014 -61.4722 -2.21936 +VERTEX2 7796 -139.896 -60.9662 2.53112 +VERTEX2 7797 -140.608 -60.4179 2.5259 +VERTEX2 7798 -141.54 -59.8766 2.50673 +VERTEX2 7799 -142.379 -59.3301 2.48905 +VERTEX2 7800 -143.194 -58.7437 2.48116 +VERTEX2 7801 -142.515 -58.055 0.914242 +VERTEX2 7802 -141.834 -57.2023 0.924688 +VERTEX2 7803 -141.162 -56.4147 0.894439 +VERTEX2 7804 -140.433 -55.6441 0.887952 +VERTEX2 7805 -139.818 -54.7621 0.883496 +VERTEX2 7806 -139.049 -55.4078 -0.6922 +VERTEX2 7807 -138.326 -56.0466 -0.71523 +VERTEX2 7808 -137.553 -56.7482 -0.668435 +VERTEX2 7809 -136.788 -57.3504 -0.678431 +VERTEX2 7810 -136.01 -58.0093 -0.661708 +VERTEX2 7811 -135.335 -57.1738 0.916685 +VERTEX2 7812 -134.799 -56.3197 0.911849 +VERTEX2 7813 -134.277 -55.4386 0.931854 +VERTEX2 7814 -133.637 -54.6461 0.910689 +VERTEX2 7815 -133.035 -53.9249 0.889933 +VERTEX2 7816 -133.803 -53.3233 2.46782 +VERTEX2 7817 -134.633 -52.6655 2.47009 +VERTEX2 7818 -135.482 -51.9867 2.47878 +VERTEX2 7819 -136.323 -51.4146 2.47774 +VERTEX2 7820 -137.181 -50.8064 2.48648 +VERTEX2 7821 -137.822 -51.5488 -2.22662 +VERTEX2 7822 -138.381 -52.3383 -2.23481 +VERTEX2 7823 -139.048 -53.1329 -2.22832 +VERTEX2 7824 -139.681 -53.8902 -2.21777 +VERTEX2 7825 -140.299 -54.6766 -2.21588 +VERTEX2 7826 -139.521 -55.2669 -0.633071 +VERTEX2 7827 -138.755 -55.8546 -0.65281 +VERTEX2 7828 -137.917 -56.5047 -0.662035 +VERTEX2 7829 -137.117 -57.0837 -0.688913 +VERTEX2 7830 -136.221 -57.7035 -0.685608 +VERTEX2 7831 -135.636 -56.8619 0.909667 +VERTEX2 7832 -135.019 -56.2145 0.914355 +VERTEX2 7833 -134.463 -55.4474 0.909668 +VERTEX2 7834 -133.84 -54.7458 0.915436 +VERTEX2 7835 -133.266 -53.9239 0.913839 +VERTEX2 7836 -134.025 -53.2799 2.47462 +VERTEX2 7837 -134.851 -52.6535 2.51019 +VERTEX2 7838 -135.694 -52.057 2.48855 +VERTEX2 7839 -136.458 -51.4456 2.4752 +VERTEX2 7840 -137.175 -50.7977 2.49124 +VERTEX2 7841 -137.779 -51.5646 -2.2347 +VERTEX2 7842 -138.351 -52.3819 -2.2351 +VERTEX2 7843 -138.969 -53.1739 -2.22176 +VERTEX2 7844 -139.595 -53.988 -2.20392 +VERTEX2 7845 -140.212 -54.8589 -2.18947 +VERTEX2 7846 -139.387 -55.4144 -0.595682 +VERTEX2 7847 -138.577 -55.9747 -0.58149 +VERTEX2 7848 -137.796 -56.4914 -0.578625 +VERTEX2 7849 -136.958 -56.95 -0.581794 +VERTEX2 7850 -136.1 -57.4853 -0.579337 +VERTEX2 7851 -135.558 -56.6595 0.973728 +VERTEX2 7852 -134.958 -55.8027 0.973085 +VERTEX2 7853 -134.347 -54.846 0.938682 +VERTEX2 7854 -133.778 -54.1553 0.952426 +VERTEX2 7855 -133.254 -53.2747 0.964267 +VERTEX2 7856 -132.44 -53.8581 -0.58655 +VERTEX2 7857 -131.504 -54.4732 -0.576999 +VERTEX2 7858 -130.705 -55.0701 -0.566149 +VERTEX2 7859 -129.84 -55.6089 -0.569918 +VERTEX2 7860 -129.029 -56.1582 -0.574193 +VERTEX2 7861 -128.324 -55.427 0.986394 +VERTEX2 7862 -127.673 -54.6107 0.955569 +VERTEX2 7863 -127.089 -53.7935 0.933405 +VERTEX2 7864 -126.434 -53.0415 0.928305 +VERTEX2 7865 -125.887 -52.2499 0.968261 +VERTEX2 7866 -126.692 -51.6192 2.52139 +VERTEX2 7867 -127.588 -51.0706 2.52151 +VERTEX2 7868 -128.312 -50.535 2.52724 +VERTEX2 7869 -129.18 -49.9162 2.48999 +VERTEX2 7870 -129.953 -49.3343 2.48687 +VERTEX2 7871 -130.544 -50.1101 -2.25373 +VERTEX2 7872 -131.165 -50.7704 -2.25302 +VERTEX2 7873 -131.76 -51.4497 -2.22547 +VERTEX2 7874 -132.326 -52.153 -2.20912 +VERTEX2 7875 -132.911 -53.0459 -2.20544 +VERTEX2 7876 -132.126 -53.685 -0.610331 +VERTEX2 7877 -131.254 -54.2145 -0.643217 +VERTEX2 7878 -130.494 -54.7982 -0.654534 +VERTEX2 7879 -129.669 -55.3572 -0.647919 +VERTEX2 7880 -128.94 -56.0083 -0.659071 +VERTEX2 7881 -128.262 -55.3233 0.915149 +VERTEX2 7882 -127.721 -54.4999 0.874252 +VERTEX2 7883 -127.154 -53.8066 0.863113 +VERTEX2 7884 -126.515 -53.1544 0.847916 +VERTEX2 7885 -125.828 -52.3901 0.858842 +VERTEX2 7886 -125.159 -52.972 -0.705011 +VERTEX2 7887 -124.387 -53.6644 -0.727214 +VERTEX2 7888 -123.598 -54.2733 -0.709415 +VERTEX2 7889 -122.841 -54.9778 -0.708861 +VERTEX2 7890 -122.067 -55.5831 -0.704262 +VERTEX2 7891 -121.424 -54.8214 0.88248 +VERTEX2 7892 -120.795 -54.0634 0.86065 +VERTEX2 7893 -120.032 -53.252 0.892034 +VERTEX2 7894 -119.429 -52.4946 0.881405 +VERTEX2 7895 -118.82 -51.7241 0.900622 +VERTEX2 7896 -119.624 -51.1331 2.49616 +VERTEX2 7897 -120.428 -50.5292 2.48319 +VERTEX2 7898 -121.259 -49.7788 2.46021 +VERTEX2 7899 -122.025 -49.1852 2.48897 +VERTEX2 7900 -122.921 -48.5766 2.50739 +VERTEX2 7901 -123.502 -49.321 -2.23006 +VERTEX2 7902 -124.169 -50.0033 -2.22878 +VERTEX2 7903 -124.736 -50.7147 -2.22702 +VERTEX2 7904 -125.339 -51.4725 -2.20839 +VERTEX2 7905 -125.922 -52.2212 -2.22661 +VERTEX2 7906 -125.14 -52.8367 -0.657432 +VERTEX2 7907 -124.375 -53.4331 -0.624694 +VERTEX2 7908 -123.442 -54.0542 -0.643871 +VERTEX2 7909 -122.577 -54.718 -0.650815 +VERTEX2 7910 -121.759 -55.3381 -0.669283 +VERTEX2 7911 -121.082 -54.5685 0.865957 +VERTEX2 7912 -120.416 -53.7862 0.854376 +VERTEX2 7913 -119.802 -53.0399 0.841406 +VERTEX2 7914 -119.038 -52.3109 0.875382 +VERTEX2 7915 -118.37 -51.4417 0.881478 +VERTEX2 7916 -119.13 -50.7768 2.44998 +VERTEX2 7917 -119.93 -50.0595 2.45901 +VERTEX2 7918 -120.711 -49.3925 2.43644 +VERTEX2 7919 -121.445 -48.6943 2.45369 +VERTEX2 7920 -122.169 -48.0748 2.45325 +VERTEX2 7921 -121.542 -47.2879 0.900246 +VERTEX2 7922 -120.943 -46.4343 0.897081 +VERTEX2 7923 -120.328 -45.6766 0.928847 +VERTEX2 7924 -119.714 -44.8873 0.905272 +VERTEX2 7925 -119.003 -44.1014 0.924782 +VERTEX2 7926 -119.804 -43.463 2.48127 +VERTEX2 7927 -120.664 -42.7702 2.48467 +VERTEX2 7928 -121.422 -42.237 2.47125 +VERTEX2 7929 -122.165 -41.56 2.45178 +VERTEX2 7930 -122.938 -40.9783 2.46039 +VERTEX2 7931 -122.353 -40.1773 0.885227 +VERTEX2 7932 -121.736 -39.43 0.869733 +VERTEX2 7933 -121.046 -38.683 0.868709 +VERTEX2 7934 -120.441 -37.9436 0.878956 +VERTEX2 7935 -119.786 -37.1801 0.88408 +VERTEX2 7936 -119.032 -37.8621 -0.691384 +VERTEX2 7937 -118.222 -38.4539 -0.67719 +VERTEX2 7938 -117.351 -39.0998 -0.670783 +VERTEX2 7939 -116.524 -39.724 -0.691187 +VERTEX2 7940 -115.779 -40.3895 -0.703487 +VERTEX2 7941 -116.36 -41.2001 -2.29153 +VERTEX2 7942 -116.948 -41.9993 -2.30793 +VERTEX2 7943 -117.656 -42.7668 -2.31349 +VERTEX2 7944 -118.387 -43.4579 -2.3216 +VERTEX2 7945 -119.019 -44.2291 -2.30662 +VERTEX2 7946 -119.76 -43.527 2.41903 +VERTEX2 7947 -120.439 -42.8865 2.40137 +VERTEX2 7948 -121.151 -42.2078 2.43357 +VERTEX2 7949 -121.866 -41.535 2.42555 +VERTEX2 7950 -122.717 -40.9287 2.43093 +VERTEX2 7951 -122.085 -40.1532 0.81519 +VERTEX2 7952 -121.435 -39.5273 0.830045 +VERTEX2 7953 -120.741 -38.7373 0.857284 +VERTEX2 7954 -120.086 -37.9567 0.873384 +VERTEX2 7955 -119.484 -37.1725 0.910118 +VERTEX2 7956 -118.72 -37.8037 -0.675496 +VERTEX2 7957 -117.938 -38.381 -0.687221 +VERTEX2 7958 -117.155 -39.0487 -0.685216 +VERTEX2 7959 -116.396 -39.6847 -0.671466 +VERTEX2 7960 -115.678 -40.2768 -0.67743 +VERTEX2 7961 -115.018 -39.4997 0.907079 +VERTEX2 7962 -114.456 -38.6516 0.928433 +VERTEX2 7963 -113.933 -37.9099 0.914413 +VERTEX2 7964 -113.385 -37.1193 0.920367 +VERTEX2 7965 -112.808 -36.3877 0.909246 +VERTEX2 7966 -112.026 -36.8904 -0.671851 +VERTEX2 7967 -111.191 -37.4879 -0.674283 +VERTEX2 7968 -110.458 -38.1412 -0.692124 +VERTEX2 7969 -109.594 -38.7259 -0.685877 +VERTEX2 7970 -108.78 -39.3884 -0.695014 +VERTEX2 7971 -109.528 -40.0979 -2.27293 +VERTEX2 7972 -110.159 -40.889 -2.27826 +VERTEX2 7973 -110.861 -41.6714 -2.30271 +VERTEX2 7974 -111.585 -42.3955 -2.29557 +VERTEX2 7975 -112.317 -43.183 -2.2828 +VERTEX2 7976 -111.543 -43.798 -0.726083 +VERTEX2 7977 -110.767 -44.5273 -0.737574 +VERTEX2 7978 -109.99 -45.1911 -0.737965 +VERTEX2 7979 -109.192 -45.8338 -0.745915 +VERTEX2 7980 -108.436 -46.4933 -0.777616 +VERTEX2 7981 -107.742 -45.805 0.808863 +VERTEX2 7982 -106.993 -45.1458 0.786875 +VERTEX2 7983 -106.227 -44.465 0.782076 +VERTEX2 7984 -105.474 -43.7773 0.796622 +VERTEX2 7985 -104.811 -43.0047 0.810561 +VERTEX2 7986 -104.013 -43.6648 -0.74156 +VERTEX2 7987 -103.239 -44.2932 -0.754054 +VERTEX2 7988 -102.564 -45.0074 -0.796835 +VERTEX2 7989 -101.855 -45.7849 -0.804638 +VERTEX2 7990 -101.19 -46.5163 -0.811553 +VERTEX2 7991 -100.409 -45.8089 0.805453 +VERTEX2 7992 -99.7738 -45.082 0.821269 +VERTEX2 7993 -99.1852 -44.409 0.800176 +VERTEX2 7994 -98.6024 -43.7163 0.783828 +VERTEX2 7995 -97.8756 -42.9772 0.795163 +VERTEX2 7996 -97.2215 -43.712 -0.758685 +VERTEX2 7997 -96.5641 -44.4642 -0.784483 +VERTEX2 7998 -95.852 -45.1827 -0.781343 +VERTEX2 7999 -95.1596 -45.9476 -0.771641 +VERTEX2 8000 -94.4011 -46.6197 -0.764742 +VERTEX2 8001 -95.0143 -47.4523 -2.37362 +VERTEX2 8002 -95.656 -48.1853 -2.37693 +VERTEX2 8003 -96.3184 -48.9161 -2.38961 +VERTEX2 8004 -97.0425 -49.62 -2.40045 +VERTEX2 8005 -97.8322 -50.26 -2.38977 +VERTEX2 8006 -97.1231 -51.0356 -0.815726 +VERTEX2 8007 -96.3458 -51.7414 -0.839094 +VERTEX2 8008 -95.7092 -52.4829 -0.870487 +VERTEX2 8009 -95.1057 -53.2375 -0.868287 +VERTEX2 8010 -94.4498 -53.9261 -0.844195 +VERTEX2 8011 -95.2278 -54.628 -2.44497 +VERTEX2 8012 -95.9492 -55.2388 -2.47191 +VERTEX2 8013 -96.6731 -55.8329 -2.45671 +VERTEX2 8014 -97.4193 -56.5328 -2.48543 +VERTEX2 8015 -98.3068 -57.1858 -2.47444 +VERTEX2 8016 -97.5924 -57.8738 -0.897712 +VERTEX2 8017 -97.0257 -58.6595 -0.90968 +VERTEX2 8018 -96.3814 -59.5018 -0.93116 +VERTEX2 8019 -95.8153 -60.2804 -0.93027 +VERTEX2 8020 -95.3247 -61.0863 -0.966874 +VERTEX2 8021 -94.5581 -60.5462 0.598429 +VERTEX2 8022 -93.7093 -59.881 0.576666 +VERTEX2 8023 -92.8972 -59.301 0.576662 +VERTEX2 8024 -91.9683 -58.7851 0.577921 +VERTEX2 8025 -91.1288 -58.2774 0.614589 +VERTEX2 8026 -91.6613 -57.5212 2.17043 +VERTEX2 8027 -92.2433 -56.687 2.19051 +VERTEX2 8028 -92.7931 -55.8038 2.15915 +VERTEX2 8029 -93.3392 -54.9476 2.14033 +VERTEX2 8030 -94.0332 -54.0784 2.18828 +VERTEX2 8031 -94.735 -54.7064 -2.50882 +VERTEX2 8032 -95.5624 -55.292 -2.49265 +VERTEX2 8033 -96.4199 -55.8484 -2.46661 +VERTEX2 8034 -97.2331 -56.4479 -2.46389 +VERTEX2 8035 -98.0569 -57.0872 -2.48129 +VERTEX2 8036 -98.6837 -56.2796 2.22253 +VERTEX2 8037 -99.2561 -55.4624 2.22948 +VERTEX2 8038 -99.8209 -54.6379 2.22916 +VERTEX2 8039 -100.458 -53.7777 2.24823 +VERTEX2 8040 -101.11 -52.9795 2.25524 +VERTEX2 8041 -101.828 -53.5755 -2.48249 +VERTEX2 8042 -102.633 -54.2098 -2.46736 +VERTEX2 8043 -103.393 -54.9208 -2.46477 +VERTEX2 8044 -104.205 -55.4821 -2.46226 +VERTEX2 8045 -105.063 -56.158 -2.44666 +VERTEX2 8046 -104.394 -56.9365 -0.873307 +VERTEX2 8047 -103.715 -57.7305 -0.897192 +VERTEX2 8048 -103.01 -58.5043 -0.889218 +VERTEX2 8049 -102.315 -59.299 -0.907438 +VERTEX2 8050 -101.72 -60.104 -0.917175 +VERTEX2 8051 -102.523 -60.6905 -2.49045 +VERTEX2 8052 -103.222 -61.2891 -2.50633 +VERTEX2 8053 -104.035 -61.8877 -2.5016 +VERTEX2 8054 -104.869 -62.484 -2.51063 +VERTEX2 8055 -105.68 -63.1526 -2.50224 +VERTEX2 8056 -106.285 -62.406 2.19509 +VERTEX2 8057 -106.803 -61.6384 2.20959 +VERTEX2 8058 -107.369 -60.9457 2.20614 +VERTEX2 8059 -107.962 -60.1173 2.19646 +VERTEX2 8060 -108.523 -59.2279 2.22142 +VERTEX2 8061 -109.341 -59.8499 -2.5094 +VERTEX2 8062 -110.132 -60.53 -2.5271 +VERTEX2 8063 -110.895 -61.0263 -2.5447 +VERTEX2 8064 -111.767 -61.5989 -2.58305 +VERTEX2 8065 -112.601 -62.0793 -2.59204 +VERTEX2 8066 -112.025 -62.877 -1.00286 +VERTEX2 8067 -111.547 -63.674 -0.988555 +VERTEX2 8068 -110.967 -64.4605 -0.929826 +VERTEX2 8069 -110.378 -65.2291 -0.946176 +VERTEX2 8070 -109.735 -66.1142 -0.97141 +VERTEX2 8071 -108.922 -65.5237 0.597156 +VERTEX2 8072 -108.036 -64.8707 0.619513 +VERTEX2 8073 -107.168 -64.2592 0.624611 +VERTEX2 8074 -106.244 -63.5695 0.640054 +VERTEX2 8075 -105.48 -62.9721 0.619273 +VERTEX2 8076 -104.899 -63.7929 -0.912583 +VERTEX2 8077 -104.313 -64.5797 -0.940542 +VERTEX2 8078 -103.815 -65.3225 -0.946929 +VERTEX2 8079 -103.175 -66.1425 -0.917163 +VERTEX2 8080 -102.591 -66.9258 -0.931596 +VERTEX2 8081 -103.424 -67.498 -2.49304 +VERTEX2 8082 -104.269 -68.0981 -2.48101 +VERTEX2 8083 -105.065 -68.628 -2.51125 +VERTEX2 8084 -105.85 -69.2112 -2.49622 +VERTEX2 8085 -106.655 -69.8559 -2.50306 +VERTEX2 8086 -106.001 -70.5982 -0.951359 +VERTEX2 8087 -105.36 -71.4066 -0.932005 +VERTEX2 8088 -104.787 -72.1553 -0.907651 +VERTEX2 8089 -104.235 -73.0065 -0.941177 +VERTEX2 8090 -103.67 -73.8233 -0.920966 +VERTEX2 8091 -102.909 -73.288 0.660019 +VERTEX2 8092 -102.111 -72.7241 0.666756 +VERTEX2 8093 -101.384 -72.0933 0.651137 +VERTEX2 8094 -100.691 -71.4734 0.62789 +VERTEX2 8095 -99.8451 -70.8949 0.627407 +VERTEX2 8096 -99.2595 -71.7015 -0.891951 +VERTEX2 8097 -98.6046 -72.4595 -0.899535 +VERTEX2 8098 -98.041 -73.171 -0.916527 +VERTEX2 8099 -97.5037 -73.9914 -0.928489 +VERTEX2 8100 -96.899 -74.8684 -0.905509 +VERTEX2 8101 -97.7426 -75.5291 -2.49574 +VERTEX2 8102 -98.5868 -76.117 -2.54383 +VERTEX2 8103 -99.4975 -76.6512 -2.52304 +VERTEX2 8104 -100.264 -77.2102 -2.50344 +VERTEX2 8105 -101.096 -77.7795 -2.52253 +VERTEX2 8106 -101.75 -76.9567 2.1846 +VERTEX2 8107 -102.315 -76.161 2.17631 +VERTEX2 8108 -102.829 -75.4043 2.17668 +VERTEX2 8109 -103.385 -74.4307 2.2061 +VERTEX2 8110 -103.904 -73.6392 2.17127 +VERTEX2 8111 -104.659 -74.2103 -2.54383 +VERTEX2 8112 -105.467 -74.7153 -2.54399 +VERTEX2 8113 -106.242 -75.3128 -2.56251 +VERTEX2 8114 -107.09 -75.8671 -2.51674 +VERTEX2 8115 -107.976 -76.5042 -2.53717 +VERTEX2 8116 -107.387 -77.2761 -0.977741 +VERTEX2 8117 -106.865 -78.1598 -0.956034 +VERTEX2 8118 -106.319 -78.9926 -0.899977 +VERTEX2 8119 -105.699 -79.7921 -0.91421 +VERTEX2 8120 -105.079 -80.5658 -0.908609 +VERTEX2 8121 -104.203 -79.9977 0.665855 +VERTEX2 8122 -103.389 -79.3269 0.64262 +VERTEX2 8123 -102.612 -78.6594 0.623244 +VERTEX2 8124 -101.754 -78.111 0.614849 +VERTEX2 8125 -100.945 -77.5362 0.593844 +VERTEX2 8126 -100.396 -78.2668 -0.991407 +VERTEX2 8127 -99.7998 -79.1566 -1.00508 +VERTEX2 8128 -99.2356 -80.0461 -1.00459 +VERTEX2 8129 -98.75 -80.8951 -0.973868 +VERTEX2 8130 -98.192 -81.6921 -0.973064 +VERTEX2 8131 -97.3372 -81.1264 0.605885 +VERTEX2 8132 -96.5242 -80.5332 0.598151 +VERTEX2 8133 -95.751 -79.9411 0.616352 +VERTEX2 8134 -94.9486 -79.1921 0.593796 +VERTEX2 8135 -94.1655 -78.6502 0.634717 +VERTEX2 8136 -94.7887 -77.8352 2.18829 +VERTEX2 8137 -95.2767 -77.0513 2.21247 +VERTEX2 8138 -95.8261 -76.2018 2.19342 +VERTEX2 8139 -96.4513 -75.3201 2.19331 +VERTEX2 8140 -97.0532 -74.5457 2.17606 +VERTEX2 8141 -97.8814 -75.1374 -2.50777 +VERTEX2 8142 -98.6967 -75.7216 -2.49524 +VERTEX2 8143 -99.4317 -76.2764 -2.48333 +VERTEX2 8144 -100.085 -76.8954 -2.48295 +VERTEX2 8145 -100.918 -77.4481 -2.45697 +VERTEX2 8146 -100.313 -78.2136 -0.888653 +VERTEX2 8147 -99.6205 -79.012 -0.859498 +VERTEX2 8148 -98.8625 -79.7513 -0.830007 +VERTEX2 8149 -98.1983 -80.4268 -0.843278 +VERTEX2 8150 -97.5359 -81.1669 -0.826611 +VERTEX2 8151 -96.7694 -80.5107 0.744068 +VERTEX2 8152 -95.9941 -79.8041 0.747935 +VERTEX2 8153 -95.2943 -79.172 0.755128 +VERTEX2 8154 -94.4187 -78.4326 0.745261 +VERTEX2 8155 -93.6174 -77.7318 0.734454 +VERTEX2 8156 -94.1893 -76.9666 2.29138 +VERTEX2 8157 -94.8435 -76.1838 2.28 +VERTEX2 8158 -95.4465 -75.3882 2.24584 +VERTEX2 8159 -96.1389 -74.6016 2.24623 +VERTEX2 8160 -96.8358 -73.8394 2.27078 +VERTEX2 8161 -97.5025 -74.3628 -2.40517 +VERTEX2 8162 -98.2978 -75.0927 -2.42979 +VERTEX2 8163 -99.0626 -75.6885 -2.3934 +VERTEX2 8164 -99.808 -76.3217 -2.37906 +VERTEX2 8165 -100.562 -76.9908 -2.41511 +VERTEX2 8166 -99.8769 -77.8499 -0.813795 +VERTEX2 8167 -99.1205 -78.5865 -0.803976 +VERTEX2 8168 -98.4701 -79.3871 -0.774872 +VERTEX2 8169 -97.7432 -80.0782 -0.778751 +VERTEX2 8170 -97.001 -80.7714 -0.787048 +VERTEX2 8171 -97.6977 -81.5681 -2.37828 +VERTEX2 8172 -98.3459 -82.2008 -2.4062 +VERTEX2 8173 -99.0637 -82.9078 -2.3651 +VERTEX2 8174 -99.7846 -83.6457 -2.35405 +VERTEX2 8175 -100.525 -84.314 -2.33813 +VERTEX2 8176 -99.8239 -84.9988 -0.760898 +VERTEX2 8177 -99.0643 -85.6711 -0.755109 +VERTEX2 8178 -98.341 -86.369 -0.754544 +VERTEX2 8179 -97.5569 -87.0883 -0.708855 +VERTEX2 8180 -96.8132 -87.8208 -0.707104 +VERTEX2 8181 -97.5642 -88.5612 -2.23157 +VERTEX2 8182 -98.2254 -89.3538 -2.26356 +VERTEX2 8183 -98.8663 -90.1157 -2.27797 +VERTEX2 8184 -99.4512 -90.8985 -2.27122 +VERTEX2 8185 -100.126 -91.6579 -2.25675 +VERTEX2 8186 -99.4247 -92.3028 -0.673516 +VERTEX2 8187 -98.6111 -92.9101 -0.689518 +VERTEX2 8188 -97.7743 -93.5119 -0.680566 +VERTEX2 8189 -96.8901 -94.2195 -0.651008 +VERTEX2 8190 -96.0754 -94.8001 -0.645913 +VERTEX2 8191 -96.6677 -95.6457 -2.19979 +VERTEX2 8192 -97.2337 -96.4621 -2.18345 +VERTEX2 8193 -97.8783 -97.2169 -2.22078 +VERTEX2 8194 -98.4345 -97.9534 -2.20207 +VERTEX2 8195 -99.0271 -98.7345 -2.16477 +VERTEX2 8196 -98.1894 -99.2376 -0.609153 +VERTEX2 8197 -97.3077 -99.7033 -0.580712 +VERTEX2 8198 -96.5361 -100.237 -0.578126 +VERTEX2 8199 -95.6173 -100.743 -0.551544 +VERTEX2 8200 -94.8409 -101.215 -0.554045 +VERTEX2 8201 -95.3621 -102.05 -2.14084 +VERTEX2 8202 -95.8931 -102.916 -2.14457 +VERTEX2 8203 -96.4616 -103.73 -2.15845 +VERTEX2 8204 -97.0233 -104.593 -2.14768 +VERTEX2 8205 -97.4916 -105.368 -2.13059 +VERTEX2 8206 -96.5917 -105.959 -0.549339 +VERTEX2 8207 -95.7282 -106.455 -0.572517 +VERTEX2 8208 -94.948 -107.032 -0.563887 +VERTEX2 8209 -94.1304 -107.604 -0.560338 +VERTEX2 8210 -93.2654 -108.102 -0.593294 +VERTEX2 8211 -92.7496 -107.332 0.954063 +VERTEX2 8212 -92.1508 -106.449 0.952984 +VERTEX2 8213 -91.6025 -105.566 0.955166 +VERTEX2 8214 -90.9831 -104.739 0.933778 +VERTEX2 8215 -90.3746 -103.962 0.920049 +VERTEX2 8216 -91.1795 -103.319 2.49745 +VERTEX2 8217 -92.0009 -102.697 2.44305 +VERTEX2 8218 -92.8118 -102.016 2.47245 +VERTEX2 8219 -93.5916 -101.41 2.47769 +VERTEX2 8220 -94.3482 -100.718 2.46909 +VERTEX2 8221 -94.9541 -101.495 -2.21762 +VERTEX2 8222 -95.5026 -102.278 -2.20152 +VERTEX2 8223 -96.1129 -103.092 -2.16445 +VERTEX2 8224 -96.785 -103.845 -2.14106 +VERTEX2 8225 -97.4685 -104.691 -2.1398 +VERTEX2 8226 -96.573 -105.238 -0.580005 +VERTEX2 8227 -95.7077 -105.798 -0.576535 +VERTEX2 8228 -94.9905 -106.367 -0.561695 +VERTEX2 8229 -94.1715 -106.928 -0.537636 +VERTEX2 8230 -93.3269 -107.404 -0.576539 +VERTEX2 8231 -92.8459 -106.51 1.01704 +VERTEX2 8232 -92.339 -105.594 1.01471 +VERTEX2 8233 -91.7871 -104.849 0.979887 +VERTEX2 8234 -91.1325 -104.027 0.988085 +VERTEX2 8235 -90.5435 -103.241 0.996155 +VERTEX2 8236 -91.415 -102.748 2.55167 +VERTEX2 8237 -92.2719 -102.136 2.55211 +VERTEX2 8238 -93.0769 -101.629 2.53084 +VERTEX2 8239 -93.9068 -101.127 2.53758 +VERTEX2 8240 -94.754 -100.552 2.56411 +VERTEX2 8241 -95.2342 -101.441 -2.13372 +VERTEX2 8242 -95.674 -102.274 -2.1211 +VERTEX2 8243 -96.1855 -103.041 -2.15542 +VERTEX2 8244 -96.7066 -103.849 -2.15451 +VERTEX2 8245 -97.2235 -104.679 -2.12664 +VERTEX2 8246 -96.3907 -105.29 -0.591869 +VERTEX2 8247 -95.6349 -105.823 -0.608248 +VERTEX2 8248 -94.7702 -106.428 -0.637884 +VERTEX2 8249 -93.9442 -106.998 -0.62368 +VERTEX2 8250 -93.1159 -107.651 -0.644111 +VERTEX2 8251 -92.4634 -106.724 0.921459 +VERTEX2 8252 -91.8154 -105.838 0.909975 +VERTEX2 8253 -91.2023 -105.074 0.908572 +VERTEX2 8254 -90.6248 -104.226 0.90476 +VERTEX2 8255 -90.0191 -103.467 0.91011 +VERTEX2 8256 -90.7475 -102.826 2.52401 +VERTEX2 8257 -91.6565 -102.195 2.52 +VERTEX2 8258 -92.4923 -101.649 2.51647 +VERTEX2 8259 -93.2302 -101.038 2.51112 +VERTEX2 8260 -94.0087 -100.454 2.54342 +VERTEX2 8261 -94.6552 -101.235 -2.1946 +VERTEX2 8262 -95.2268 -102.077 -2.17711 +VERTEX2 8263 -95.767 -102.718 -2.17138 +VERTEX2 8264 -96.3654 -103.559 -2.15547 +VERTEX2 8265 -96.9232 -104.431 -2.17395 +VERTEX2 8266 -97.7699 -103.814 2.53895 +VERTEX2 8267 -98.5474 -103.298 2.54208 +VERTEX2 8268 -99.2997 -102.65 2.56171 +VERTEX2 8269 -100.18 -102.08 2.57624 +VERTEX2 8270 -101.052 -101.527 2.56102 +VERTEX2 8271 -101.654 -102.352 -2.17278 +VERTEX2 8272 -102.246 -103.216 -2.18931 +VERTEX2 8273 -102.823 -104.065 -2.18405 +VERTEX2 8274 -103.462 -104.927 -2.18588 +VERTEX2 8275 -103.981 -105.737 -2.17962 +VERTEX2 8276 -103.093 -106.293 -0.652405 +VERTEX2 8277 -102.276 -106.934 -0.646707 +VERTEX2 8278 -101.472 -107.563 -0.64439 +VERTEX2 8279 -100.783 -108.132 -0.662192 +VERTEX2 8280 -100.092 -108.737 -0.675378 +VERTEX2 8281 -100.69 -109.449 -2.22957 +VERTEX2 8282 -101.367 -110.176 -2.26103 +VERTEX2 8283 -102.019 -110.988 -2.24529 +VERTEX2 8284 -102.58 -111.674 -2.22907 +VERTEX2 8285 -103.291 -112.406 -2.23652 +VERTEX2 8286 -102.471 -113.087 -0.699177 +VERTEX2 8287 -101.765 -113.86 -0.711969 +VERTEX2 8288 -100.989 -114.501 -0.724848 +VERTEX2 8289 -100.151 -115.114 -0.747956 +VERTEX2 8290 -99.3733 -115.83 -0.724866 +VERTEX2 8291 -100.091 -116.5 -2.29379 +VERTEX2 8292 -100.695 -117.286 -2.27378 +VERTEX2 8293 -101.35 -118.054 -2.26808 +VERTEX2 8294 -101.994 -118.828 -2.26815 +VERTEX2 8295 -102.592 -119.603 -2.24813 +VERTEX2 8296 -101.84 -120.295 -0.673172 +VERTEX2 8297 -101.023 -120.845 -0.689328 +VERTEX2 8298 -100.264 -121.452 -0.704721 +VERTEX2 8299 -99.4775 -122.141 -0.683964 +VERTEX2 8300 -98.7161 -122.746 -0.700982 +VERTEX2 8301 -98.1252 -121.924 0.881231 +VERTEX2 8302 -97.5502 -121.152 0.887317 +VERTEX2 8303 -96.9203 -120.352 0.882734 +VERTEX2 8304 -96.2135 -119.552 0.867596 +VERTEX2 8305 -95.6816 -118.831 0.871757 +VERTEX2 8306 -94.8598 -119.506 -0.691027 +VERTEX2 8307 -94.021 -120.044 -0.709383 +VERTEX2 8308 -93.2025 -120.682 -0.716292 +VERTEX2 8309 -92.4146 -121.329 -0.732386 +VERTEX2 8310 -91.5962 -121.984 -0.706955 +VERTEX2 8311 -90.9608 -121.227 0.847955 +VERTEX2 8312 -90.2811 -120.497 0.879678 +VERTEX2 8313 -89.6364 -119.77 0.903019 +VERTEX2 8314 -88.982 -119.033 0.916171 +VERTEX2 8315 -88.3573 -118.197 0.873512 +VERTEX2 8316 -87.584 -118.954 -0.687417 +VERTEX2 8317 -86.8687 -119.673 -0.691017 +VERTEX2 8318 -86.0936 -120.284 -0.698631 +VERTEX2 8319 -85.3951 -120.945 -0.705281 +VERTEX2 8320 -84.5852 -121.565 -0.74065 +VERTEX2 8321 -83.8595 -120.914 0.806741 +VERTEX2 8322 -83.1974 -120.182 0.789618 +VERTEX2 8323 -82.3916 -119.583 0.765776 +VERTEX2 8324 -81.7537 -118.87 0.76325 +VERTEX2 8325 -81.0458 -118.269 0.780361 +VERTEX2 8326 -81.745 -117.626 2.3473 +VERTEX2 8327 -82.4545 -116.844 2.3453 +VERTEX2 8328 -83.1841 -116.202 2.3443 +VERTEX2 8329 -83.8471 -115.522 2.36325 +VERTEX2 8330 -84.4907 -114.891 2.33183 +VERTEX2 8331 -83.7939 -114.2 0.74364 +VERTEX2 8332 -82.9523 -113.464 0.719504 +VERTEX2 8333 -82.1605 -112.723 0.72186 +VERTEX2 8334 -81.3001 -112.04 0.69919 +VERTEX2 8335 -80.49 -111.421 0.683961 +VERTEX2 8336 -79.8278 -112.197 -0.894365 +VERTEX2 8337 -79.223 -113.046 -0.867216 +VERTEX2 8338 -78.5188 -113.782 -0.875662 +VERTEX2 8339 -77.8736 -114.6 -0.868728 +VERTEX2 8340 -77.2974 -115.423 -0.876429 +VERTEX2 8341 -76.5968 -114.78 0.68733 +VERTEX2 8342 -75.9034 -114.135 0.710598 +VERTEX2 8343 -75.1477 -113.469 0.676954 +VERTEX2 8344 -74.3133 -112.822 0.690841 +VERTEX2 8345 -73.4859 -112.142 0.657002 +VERTEX2 8346 -72.82 -112.908 -0.955624 +VERTEX2 8347 -72.284 -113.753 -0.939883 +VERTEX2 8348 -71.7338 -114.549 -0.944033 +VERTEX2 8349 -71.1486 -115.301 -0.962131 +VERTEX2 8350 -70.588 -116.157 -0.957412 +VERTEX2 8351 -69.7495 -115.556 0.588408 +VERTEX2 8352 -69.0122 -114.973 0.60575 +VERTEX2 8353 -68.1437 -114.377 0.627816 +VERTEX2 8354 -67.2986 -113.759 0.636965 +VERTEX2 8355 -66.3956 -113.177 0.61713 +VERTEX2 8356 -67.0125 -112.376 2.18092 +VERTEX2 8357 -67.642 -111.549 2.182 +VERTEX2 8358 -68.3121 -110.679 2.18585 +VERTEX2 8359 -68.9351 -109.929 2.20031 +VERTEX2 8360 -69.5257 -109.03 2.21291 +VERTEX2 8361 -68.7149 -108.488 0.664238 +VERTEX2 8362 -67.959 -107.878 0.668962 +VERTEX2 8363 -67.2345 -107.269 0.65101 +VERTEX2 8364 -66.3982 -106.574 0.608381 +VERTEX2 8365 -65.5613 -105.912 0.601445 +VERTEX2 8366 -66.2071 -105.121 2.1551 +VERTEX2 8367 -66.7554 -104.245 2.12694 +VERTEX2 8368 -67.2061 -103.351 2.08829 +VERTEX2 8369 -67.7469 -102.501 2.09309 +VERTEX2 8370 -68.255 -101.694 2.07662 +VERTEX2 8371 -69.0446 -102.284 -2.59912 +VERTEX2 8372 -69.8327 -102.734 -2.56566 +VERTEX2 8373 -70.7718 -103.221 -2.59286 +VERTEX2 8374 -71.6865 -103.711 -2.60809 +VERTEX2 8375 -72.4996 -104.271 -2.60328 +VERTEX2 8376 -71.974 -105.116 -1.05604 +VERTEX2 8377 -71.4702 -106.067 -1.08402 +VERTEX2 8378 -71.074 -106.915 -1.09006 +VERTEX2 8379 -70.6163 -107.761 -1.14377 +VERTEX2 8380 -70.1844 -108.717 -1.16929 +VERTEX2 8381 -69.2623 -108.279 0.401431 +VERTEX2 8382 -68.3806 -107.989 0.426394 +VERTEX2 8383 -67.443 -107.564 0.393496 +VERTEX2 8384 -66.5882 -107.168 0.357389 +VERTEX2 8385 -65.626 -106.816 0.378038 +VERTEX2 8386 -65.2415 -107.696 -1.1862 +VERTEX2 8387 -64.846 -108.596 -1.17146 +VERTEX2 8388 -64.4708 -109.535 -1.14868 +VERTEX2 8389 -64.0351 -110.48 -1.16596 +VERTEX2 8390 -63.6795 -111.334 -1.17532 +VERTEX2 8391 -64.6425 -111.76 -2.75825 +VERTEX2 8392 -65.5614 -112.228 -2.73998 +VERTEX2 8393 -66.4019 -112.58 -2.76276 +VERTEX2 8394 -67.2861 -112.97 -2.77057 +VERTEX2 8395 -68.1996 -113.297 -2.80018 +VERTEX2 8396 -68.5469 -112.427 1.9188 +VERTEX2 8397 -68.8567 -111.489 1.92009 +VERTEX2 8398 -69.2202 -110.627 1.91531 +VERTEX2 8399 -69.5573 -109.708 1.93609 +VERTEX2 8400 -69.8698 -108.815 1.88911 +VERTEX2 8401 -70.827 -109.12 -2.84331 +VERTEX2 8402 -71.8016 -109.313 -2.84408 +VERTEX2 8403 -72.7703 -109.685 -2.82719 +VERTEX2 8404 -73.6519 -109.913 -2.82708 +VERTEX2 8405 -74.5705 -110.126 -2.8252 +VERTEX2 8406 -74.2153 -111.11 -1.23166 +VERTEX2 8407 -73.9686 -112.093 -1.24857 +VERTEX2 8408 -73.7434 -113.105 -1.23334 +VERTEX2 8409 -73.3451 -114.15 -1.23795 +VERTEX2 8410 -73.0001 -115.13 -1.25236 +VERTEX2 8411 -72.0671 -114.809 0.331798 +VERTEX2 8412 -71.1762 -114.516 0.357441 +VERTEX2 8413 -70.228 -114.151 0.380684 +VERTEX2 8414 -69.3425 -113.938 0.390978 +VERTEX2 8415 -68.358 -113.549 0.4054 +VERTEX2 8416 -68.7345 -112.578 2.00525 +VERTEX2 8417 -69.2146 -111.72 2.04455 +VERTEX2 8418 -69.7232 -110.855 1.98878 +VERTEX2 8419 -70.1867 -109.912 1.96193 +VERTEX2 8420 -70.5219 -108.952 1.96037 +VERTEX2 8421 -69.6192 -108.6 0.408419 +VERTEX2 8422 -68.6565 -108.172 0.434571 +VERTEX2 8423 -67.8308 -107.714 0.431657 +VERTEX2 8424 -67.022 -107.169 0.466941 +VERTEX2 8425 -66.069 -106.743 0.419053 +VERTEX2 8426 -66.4988 -105.816 1.97182 +VERTEX2 8427 -66.9368 -104.927 1.96905 +VERTEX2 8428 -67.306 -104.064 1.91899 +VERTEX2 8429 -67.635 -103.221 1.91933 +VERTEX2 8430 -68.0688 -102.202 1.90859 +VERTEX2 8431 -67.1197 -101.902 0.350262 +VERTEX2 8432 -66.0623 -101.481 0.330283 +VERTEX2 8433 -65.0808 -101.168 0.340375 +VERTEX2 8434 -64.1748 -100.805 0.277505 +VERTEX2 8435 -63.1108 -100.547 0.279622 +VERTEX2 8436 -63.3705 -99.5948 1.8685 +VERTEX2 8437 -63.678 -98.6914 1.83628 +VERTEX2 8438 -63.8946 -97.6914 1.8284 +VERTEX2 8439 -64.1273 -96.6502 1.81943 +VERTEX2 8440 -64.3399 -95.726 1.7814 +VERTEX2 8441 -65.342 -95.9694 -2.96544 +VERTEX2 8442 -66.2911 -96.2198 -2.99721 +VERTEX2 8443 -67.2542 -96.463 -2.96399 +VERTEX2 8444 -68.3488 -96.6757 -2.99831 +VERTEX2 8445 -69.3034 -96.7848 -2.97743 +VERTEX2 8446 -69.4462 -95.7597 1.74808 +VERTEX2 8447 -69.5693 -94.8015 1.76214 +VERTEX2 8448 -69.7528 -93.8571 1.74161 +VERTEX2 8449 -69.9339 -92.8543 1.75778 +VERTEX2 8450 -70.0624 -91.8571 1.77214 +VERTEX2 8451 -70.9253 -91.9912 -2.95604 +VERTEX2 8452 -71.9079 -92.1521 -2.97847 +VERTEX2 8453 -72.8984 -92.2564 -2.96069 +VERTEX2 8454 -73.926 -92.3515 -2.93363 +VERTEX2 8455 -74.9152 -92.4986 -2.96047 +VERTEX2 8456 -74.7096 -93.4913 -1.44584 +VERTEX2 8457 -74.5681 -94.4941 -1.43518 +VERTEX2 8458 -74.3327 -95.4608 -1.4731 +VERTEX2 8459 -74.1715 -96.388 -1.4744 +VERTEX2 8460 -73.9935 -97.3268 -1.47708 +VERTEX2 8461 -72.9796 -97.2104 0.119673 +VERTEX2 8462 -71.922 -97.1132 0.135968 +VERTEX2 8463 -70.9683 -96.9888 0.127262 +VERTEX2 8464 -70.0333 -96.8568 0.0895558 +VERTEX2 8465 -68.9514 -96.7867 0.0911054 +VERTEX2 8466 -68.8148 -97.7956 -1.48258 +VERTEX2 8467 -68.6003 -98.8774 -1.48267 +VERTEX2 8468 -68.6035 -99.8096 -1.47945 +VERTEX2 8469 -68.5705 -100.786 -1.48634 +VERTEX2 8470 -68.5132 -101.707 -1.45459 +VERTEX2 8471 -69.4272 -101.854 -3.05925 +VERTEX2 8472 -70.4887 -101.943 -3.0504 +VERTEX2 8473 -71.5598 -101.972 -3.03864 +VERTEX2 8474 -72.5565 -102.037 -3.03116 +VERTEX2 8475 -73.5823 -102.207 -3.02761 +VERTEX2 8476 -73.4762 -103.245 -1.44465 +VERTEX2 8477 -73.3379 -104.192 -1.43769 +VERTEX2 8478 -73.1854 -105.123 -1.47314 +VERTEX2 8479 -73.0754 -106.124 -1.45181 +VERTEX2 8480 -72.9253 -107.08 -1.47795 +VERTEX2 8481 -71.9129 -106.974 0.0753511 +VERTEX2 8482 -70.9262 -106.927 0.0846558 +VERTEX2 8483 -69.9381 -106.897 0.0969547 +VERTEX2 8484 -68.8947 -106.78 0.0762663 +VERTEX2 8485 -67.8361 -106.713 0.0844611 +VERTEX2 8486 -67.6701 -107.692 -1.49246 +VERTEX2 8487 -67.5928 -108.697 -1.52798 +VERTEX2 8488 -67.5156 -109.773 -1.50073 +VERTEX2 8489 -67.504 -110.81 -1.53546 +VERTEX2 8490 -67.4297 -111.753 -1.55895 +VERTEX2 8491 -66.2733 -111.721 -0.00392687 +VERTEX2 8492 -65.2522 -111.708 -0.0203961 +VERTEX2 8493 -64.1505 -111.637 -0.0149033 +VERTEX2 8494 -63.1024 -111.601 -0.0353848 +VERTEX2 8495 -62.0445 -111.511 -0.0547877 +VERTEX2 8496 -61.94 -110.503 1.48711 +VERTEX2 8497 -61.8772 -109.495 1.46414 +VERTEX2 8498 -61.78 -108.473 1.44627 +VERTEX2 8499 -61.6793 -107.443 1.45772 +VERTEX2 8500 -61.5428 -106.395 1.44061 +VERTEX2 8501 -60.5825 -106.507 -0.145345 +VERTEX2 8502 -59.5701 -106.752 -0.0827655 +VERTEX2 8503 -58.5165 -106.808 -0.0571406 +VERTEX2 8504 -57.5159 -106.792 -0.0696611 +VERTEX2 8505 -56.4986 -106.882 -0.0785507 +VERTEX2 8506 -56.5517 -107.923 -1.65151 +VERTEX2 8507 -56.6373 -109.012 -1.64849 +VERTEX2 8508 -56.6668 -110.024 -1.64196 +VERTEX2 8509 -56.7526 -110.935 -1.62832 +VERTEX2 8510 -56.8177 -111.885 -1.68147 +VERTEX2 8511 -57.7346 -111.75 3.02404 +VERTEX2 8512 -58.8043 -111.573 2.99653 +VERTEX2 8513 -59.8548 -111.377 2.96563 +VERTEX2 8514 -60.814 -111.142 2.95475 +VERTEX2 8515 -61.92 -110.945 2.93241 +VERTEX2 8516 -62.1294 -111.956 -1.76719 +VERTEX2 8517 -62.37 -112.901 -1.75787 +VERTEX2 8518 -62.5153 -113.928 -1.75733 +VERTEX2 8519 -62.8128 -114.943 -1.73415 +VERTEX2 8520 -62.9654 -115.931 -1.74784 +VERTEX2 8521 -61.8938 -116.126 -0.139653 +VERTEX2 8522 -60.9372 -116.271 -0.150531 +VERTEX2 8523 -59.8725 -116.349 -0.157866 +VERTEX2 8524 -58.8345 -116.595 -0.151077 +VERTEX2 8525 -57.755 -116.721 -0.173259 +VERTEX2 8526 -57.9659 -117.752 -1.73119 +VERTEX2 8527 -58.0891 -118.767 -1.74608 +VERTEX2 8528 -58.2001 -119.791 -1.75293 +VERTEX2 8529 -58.387 -120.787 -1.71655 +VERTEX2 8530 -58.5641 -121.813 -1.70037 +VERTEX2 8531 -59.5976 -121.717 3.01306 +VERTEX2 8532 -60.5883 -121.613 3.02456 +VERTEX2 8533 -61.5502 -121.561 3.03067 +VERTEX2 8534 -62.5019 -121.52 3.02489 +VERTEX2 8535 -63.436 -121.513 3.01458 +VERTEX2 8536 -63.324 -120.517 1.44622 +VERTEX2 8537 -63.1214 -119.534 1.45487 +VERTEX2 8538 -63.007 -118.549 1.45868 +VERTEX2 8539 -62.9317 -117.519 1.48852 +VERTEX2 8540 -62.7608 -116.539 1.51103 +VERTEX2 8541 -63.7443 -116.571 3.11623 +VERTEX2 8542 -64.7172 -116.504 3.12203 +VERTEX2 8543 -65.7014 -116.485 3.09379 +VERTEX2 8544 -66.7039 -116.297 3.09341 +VERTEX2 8545 -67.6488 -116.279 3.07125 +VERTEX2 8546 -67.6023 -115.343 1.50243 +VERTEX2 8547 -67.5407 -114.398 1.52683 +VERTEX2 8548 -67.4553 -113.418 1.48828 +VERTEX2 8549 -67.3943 -112.438 1.48681 +VERTEX2 8550 -67.3099 -111.411 1.47892 +VERTEX2 8551 -68.2275 -111.265 3.05452 +VERTEX2 8552 -69.2543 -111.1 3.04878 +VERTEX2 8553 -70.2399 -111.023 3.0433 +VERTEX2 8554 -71.2476 -110.946 3.08839 +VERTEX2 8555 -72.1698 -110.902 3.09824 +VERTEX2 8556 -72.3456 -111.924 -1.564 +VERTEX2 8557 -72.3579 -112.939 -1.5485 +VERTEX2 8558 -72.2758 -113.935 -1.56096 +VERTEX2 8559 -72.3587 -114.877 -1.58198 +VERTEX2 8560 -72.3866 -115.846 -1.57461 +VERTEX2 8561 -71.3952 -115.778 -0.0065147 +VERTEX2 8562 -70.4011 -115.711 0.0517799 +VERTEX2 8563 -69.3815 -115.712 0.0700085 +VERTEX2 8564 -68.4662 -115.645 0.0887423 +VERTEX2 8565 -67.5898 -115.48 0.106141 +VERTEX2 8566 -67.7297 -114.488 1.67213 +VERTEX2 8567 -67.7612 -113.465 1.65638 +VERTEX2 8568 -67.8176 -112.51 1.67704 +VERTEX2 8569 -67.8526 -111.562 1.66517 +VERTEX2 8570 -67.9594 -110.527 1.68422 +VERTEX2 8571 -66.8857 -110.451 0.118329 +VERTEX2 8572 -65.9038 -110.338 0.128883 +VERTEX2 8573 -64.8687 -110.253 0.134321 +VERTEX2 8574 -63.9872 -110.109 0.126839 +VERTEX2 8575 -63.0099 -110.021 0.0979401 +VERTEX2 8576 -63.1571 -109.025 1.6446 +VERTEX2 8577 -63.2383 -108.004 1.6286 +VERTEX2 8578 -63.269 -107.043 1.63181 +VERTEX2 8579 -63.2816 -106.046 1.62858 +VERTEX2 8580 -63.3482 -104.989 1.64479 +VERTEX2 8581 -62.3528 -104.931 0.0737824 +VERTEX2 8582 -61.423 -104.891 0.0724339 +VERTEX2 8583 -60.425 -104.821 0.0765569 +VERTEX2 8584 -59.4755 -104.767 0.067676 +VERTEX2 8585 -58.5193 -104.769 0.0605341 +VERTEX2 8586 -58.5635 -103.811 1.60166 +VERTEX2 8587 -58.6406 -102.829 1.59326 +VERTEX2 8588 -58.5551 -101.778 1.57504 +VERTEX2 8589 -58.6254 -100.795 1.5549 +VERTEX2 8590 -58.6085 -99.7478 1.53476 +VERTEX2 8591 -59.4881 -99.7863 3.07478 +VERTEX2 8592 -60.4865 -99.7167 3.09559 +VERTEX2 8593 -61.5082 -99.7146 3.07126 +VERTEX2 8594 -62.3897 -99.5904 3.05122 +VERTEX2 8595 -63.3668 -99.5054 3.00701 +VERTEX2 8596 -63.1821 -98.594 1.41044 +VERTEX2 8597 -62.9773 -97.5167 1.39024 +VERTEX2 8598 -62.8297 -96.4919 1.42992 +VERTEX2 8599 -62.6891 -95.4913 1.42858 +VERTEX2 8600 -62.5574 -94.5265 1.42326 +VERTEX2 8601 -63.5378 -94.367 3.03354 +VERTEX2 8602 -64.5108 -94.2234 3.03573 +VERTEX2 8603 -65.524 -94.1803 3.03843 +VERTEX2 8604 -66.5912 -94.1092 3.02725 +VERTEX2 8605 -67.6041 -93.9386 3.01068 +VERTEX2 8606 -67.7324 -94.9401 -1.68755 +VERTEX2 8607 -67.9026 -96.0267 -1.68364 +VERTEX2 8608 -68.1118 -97.0379 -1.69188 +VERTEX2 8609 -68.2553 -98.0218 -1.70278 +VERTEX2 8610 -68.3331 -98.9708 -1.70039 +VERTEX2 8611 -69.2659 -98.9001 2.98341 +VERTEX2 8612 -70.2537 -98.7421 2.97086 +VERTEX2 8613 -71.1835 -98.6539 2.95693 +VERTEX2 8614 -72.1981 -98.5098 2.98199 +VERTEX2 8615 -73.2309 -98.2772 2.96372 +VERTEX2 8616 -73.4109 -99.3025 -1.73297 +VERTEX2 8617 -73.6728 -100.288 -1.74694 +VERTEX2 8618 -73.8368 -101.309 -1.74854 +VERTEX2 8619 -74.055 -102.259 -1.73568 +VERTEX2 8620 -74.2706 -103.304 -1.7379 +VERTEX2 8621 -73.2165 -103.398 -0.176439 +VERTEX2 8622 -72.1801 -103.653 -0.158086 +VERTEX2 8623 -71.1734 -103.772 -0.155723 +VERTEX2 8624 -70.2296 -103.871 -0.171627 +VERTEX2 8625 -69.2796 -104.039 -0.166137 +VERTEX2 8626 -69.1024 -103.07 1.43991 +VERTEX2 8627 -68.9939 -102.103 1.43951 +VERTEX2 8628 -68.853 -101.158 1.46337 +VERTEX2 8629 -68.6887 -100.165 1.44543 +VERTEX2 8630 -68.5273 -99.2377 1.42369 +VERTEX2 8631 -69.477 -99.0412 2.99036 +VERTEX2 8632 -70.4436 -98.9174 3.00843 +VERTEX2 8633 -71.4395 -98.7505 3.01745 +VERTEX2 8634 -72.382 -98.5839 3.01845 +VERTEX2 8635 -73.2339 -98.4527 3.03542 +VERTEX2 8636 -72.9965 -97.3656 1.45706 +VERTEX2 8637 -72.8849 -96.3867 1.46444 +VERTEX2 8638 -72.7478 -95.3828 1.4788 +VERTEX2 8639 -72.6685 -94.3998 1.47805 +VERTEX2 8640 -72.5449 -93.4439 1.4383 +VERTEX2 8641 -73.5897 -93.348 3.03866 +VERTEX2 8642 -74.5566 -93.2585 3.03211 +VERTEX2 8643 -75.5305 -93.0167 3.04086 +VERTEX2 8644 -76.5582 -92.8552 3.01677 +VERTEX2 8645 -77.5851 -92.6919 3.0528 +VERTEX2 8646 -77.7146 -93.638 -1.64168 +VERTEX2 8647 -77.8394 -94.6329 -1.607 +VERTEX2 8648 -77.8484 -95.6563 -1.6012 +VERTEX2 8649 -77.8139 -96.6779 -1.60682 +VERTEX2 8650 -77.7893 -97.676 -1.59562 +VERTEX2 8651 -76.8045 -97.7272 -0.0569162 +VERTEX2 8652 -75.7327 -97.8198 -0.0634174 +VERTEX2 8653 -74.7302 -97.8301 -0.12158 +VERTEX2 8654 -73.7929 -97.9179 -0.0811746 +VERTEX2 8655 -72.9103 -97.9523 -0.115139 +VERTEX2 8656 -72.9421 -98.8911 -1.70731 +VERTEX2 8657 -73.1284 -99.9558 -1.69814 +VERTEX2 8658 -73.3007 -100.881 -1.68236 +VERTEX2 8659 -73.3773 -101.836 -1.67521 +VERTEX2 8660 -73.3785 -102.798 -1.68838 +VERTEX2 8661 -74.3753 -102.621 3.03094 +VERTEX2 8662 -75.3438 -102.469 3.04242 +VERTEX2 8663 -76.3183 -102.385 3.01734 +VERTEX2 8664 -77.2913 -102.205 3.04286 +VERTEX2 8665 -78.3196 -102.115 3.04618 +VERTEX2 8666 -78.4377 -103.149 -1.65767 +VERTEX2 8667 -78.5099 -104.127 -1.66551 +VERTEX2 8668 -78.5532 -105.182 -1.66659 +VERTEX2 8669 -78.6186 -106.118 -1.70072 +VERTEX2 8670 -78.7832 -107.054 -1.69073 +VERTEX2 8671 -77.9018 -107.199 -0.105898 +VERTEX2 8672 -76.9625 -107.31 -0.141014 +VERTEX2 8673 -75.9926 -107.422 -0.129859 +VERTEX2 8674 -75.0061 -107.587 -0.171686 +VERTEX2 8675 -74.0533 -107.787 -0.205336 +VERTEX2 8676 -73.8139 -106.738 1.34268 +VERTEX2 8677 -73.6015 -105.776 1.33913 +VERTEX2 8678 -73.343 -104.942 1.35656 +VERTEX2 8679 -73.0824 -103.965 1.36728 +VERTEX2 8680 -72.8903 -102.932 1.3582 +VERTEX2 8681 -73.9242 -102.754 2.90066 +VERTEX2 8682 -74.92 -102.552 2.92829 +VERTEX2 8683 -75.8949 -102.304 2.93781 +VERTEX2 8684 -76.8829 -102.097 2.96703 +VERTEX2 8685 -77.8581 -101.95 2.94935 +VERTEX2 8686 -77.6292 -100.951 1.39142 +VERTEX2 8687 -77.4957 -99.9774 1.40847 +VERTEX2 8688 -77.2584 -98.9711 1.42369 +VERTEX2 8689 -77.1327 -98.0102 1.40773 +VERTEX2 8690 -76.9965 -97.0477 1.39893 +VERTEX2 8691 -77.9366 -96.9478 2.98189 +VERTEX2 8692 -78.9389 -96.7382 2.96931 +VERTEX2 8693 -80.0072 -96.5496 2.99642 +VERTEX2 8694 -80.9935 -96.4742 3.0408 +VERTEX2 8695 -81.984 -96.3975 3.01535 +VERTEX2 8696 -82.1297 -97.3304 -1.71087 +VERTEX2 8697 -82.3008 -98.4481 -1.71224 +VERTEX2 8698 -82.413 -99.4565 -1.71008 +VERTEX2 8699 -82.6048 -100.493 -1.72917 +VERTEX2 8700 -82.7581 -101.517 -1.71661 +VERTEX2 8701 -81.7896 -101.556 -0.138905 +VERTEX2 8702 -80.7222 -101.63 -0.161398 +VERTEX2 8703 -79.8445 -101.803 -0.176031 +VERTEX2 8704 -78.9057 -101.982 -0.17919 +VERTEX2 8705 -77.9595 -102.246 -0.184549 +VERTEX2 8706 -78.1493 -103.208 -1.76798 +VERTEX2 8707 -78.4181 -104.183 -1.76156 +VERTEX2 8708 -78.6337 -105.167 -1.79228 +VERTEX2 8709 -78.8307 -106.1 -1.78598 +VERTEX2 8710 -79.0428 -107.116 -1.7791 +VERTEX2 8711 -78.1054 -107.387 -0.191322 +VERTEX2 8712 -77.1476 -107.575 -0.185706 +VERTEX2 8713 -76.1661 -107.721 -0.186128 +VERTEX2 8714 -75.1687 -107.908 -0.193072 +VERTEX2 8715 -74.2001 -108.127 -0.211777 +VERTEX2 8716 -74.0094 -107.048 1.36135 +VERTEX2 8717 -73.7451 -106.036 1.39004 +VERTEX2 8718 -73.5 -105.078 1.40377 +VERTEX2 8719 -73.2924 -104.007 1.4274 +VERTEX2 8720 -73.1504 -103.027 1.45157 +VERTEX2 8721 -74.2395 -102.893 2.9971 +VERTEX2 8722 -75.2806 -102.72 2.98426 +VERTEX2 8723 -76.1974 -102.535 2.97913 +VERTEX2 8724 -77.2491 -102.368 2.97339 +VERTEX2 8725 -78.2524 -102.184 2.96329 +VERTEX2 8726 -78.4799 -103.116 -1.73534 +VERTEX2 8727 -78.7219 -104.094 -1.74739 +VERTEX2 8728 -78.8488 -105.151 -1.7716 +VERTEX2 8729 -79.0002 -106.099 -1.78051 +VERTEX2 8730 -79.2694 -107.042 -1.78435 +VERTEX2 8731 -78.26 -107.254 -0.184554 +VERTEX2 8732 -77.2879 -107.384 -0.203132 +VERTEX2 8733 -76.292 -107.547 -0.225016 +VERTEX2 8734 -75.2514 -107.741 -0.252495 +VERTEX2 8735 -74.3761 -108 -0.284197 +VERTEX2 8736 -74.1162 -107.019 1.27841 +VERTEX2 8737 -73.8579 -106.14 1.31496 +VERTEX2 8738 -73.5963 -105.199 1.31236 +VERTEX2 8739 -73.3698 -104.31 1.32864 +VERTEX2 8740 -73.0741 -103.35 1.35769 +VERTEX2 8741 -72.121 -103.609 -0.214078 +VERTEX2 8742 -71.1878 -103.926 -0.189959 +VERTEX2 8743 -70.2871 -104.106 -0.166539 +VERTEX2 8744 -69.313 -104.248 -0.164858 +VERTEX2 8745 -68.3342 -104.362 -0.146386 +VERTEX2 8746 -68.2379 -103.354 1.43285 +VERTEX2 8747 -68.1299 -102.35 1.43681 +VERTEX2 8748 -67.9288 -101.334 1.44119 +VERTEX2 8749 -67.7301 -100.409 1.46882 +VERTEX2 8750 -67.6722 -99.3661 1.48425 +VERTEX2 8751 -66.7048 -99.507 -0.065134 +VERTEX2 8752 -65.6313 -99.6044 -0.0515136 +VERTEX2 8753 -64.5988 -99.6582 -0.053663 +VERTEX2 8754 -63.5491 -99.7423 -0.073788 +VERTEX2 8755 -62.5379 -99.8306 -0.0986922 +VERTEX2 8756 -62.3866 -98.8457 1.52075 +VERTEX2 8757 -62.3502 -97.8327 1.53217 +VERTEX2 8758 -62.3373 -96.8203 1.53693 +VERTEX2 8759 -62.292 -95.7624 1.518 +VERTEX2 8760 -62.2741 -94.7477 1.53387 +VERTEX2 8761 -61.2705 -94.7739 -0.0293375 +VERTEX2 8762 -60.3117 -94.7281 -0.0116905 +VERTEX2 8763 -59.2252 -94.7375 -0.0239569 +VERTEX2 8764 -58.2507 -94.7572 -0.0474456 +VERTEX2 8765 -57.1619 -94.783 -0.0536103 +VERTEX2 8766 -57.158 -93.8189 1.52384 +VERTEX2 8767 -57.0615 -92.8632 1.55214 +VERTEX2 8768 -57.0382 -91.8943 1.56428 +VERTEX2 8769 -57.0469 -90.8408 1.55397 +VERTEX2 8770 -57.0425 -89.8731 1.54889 +VERTEX2 8771 -58.1456 -89.7309 3.10454 +VERTEX2 8772 -59.1671 -89.6277 3.10454 +VERTEX2 8773 -60.1152 -89.6162 3.11351 +VERTEX2 8774 -61.0791 -89.5791 3.11665 +VERTEX2 8775 -62.0643 -89.4895 3.10933 +VERTEX2 8776 -62.0117 -90.3992 -1.63159 +VERTEX2 8777 -62.0803 -91.4775 -1.60977 +VERTEX2 8778 -62.1532 -92.4449 -1.60528 +VERTEX2 8779 -62.1516 -93.5121 -1.59293 +VERTEX2 8780 -62.2027 -94.4924 -1.60308 +VERTEX2 8781 -61.193 -94.4523 -0.0506986 +VERTEX2 8782 -60.2462 -94.4931 -0.0589714 +VERTEX2 8783 -59.2205 -94.5249 -0.030266 +VERTEX2 8784 -58.1811 -94.5868 -0.0176461 +VERTEX2 8785 -57.2552 -94.7072 -0.023265 +VERTEX2 8786 -57.2318 -93.6682 1.56695 +VERTEX2 8787 -57.2039 -92.7306 1.58093 +VERTEX2 8788 -57.197 -91.6381 1.55443 +VERTEX2 8789 -57.2312 -90.6138 1.5554 +VERTEX2 8790 -57.1712 -89.6613 1.56362 +VERTEX2 8791 -58.1833 -89.5845 -3.11001 +VERTEX2 8792 -59.2077 -89.5982 -3.08954 +VERTEX2 8793 -60.2395 -89.6886 -3.12228 +VERTEX2 8794 -61.2177 -89.7583 -3.12186 +VERTEX2 8795 -62.2017 -89.665 -3.13119 +VERTEX2 8796 -62.1474 -88.6801 1.56415 +VERTEX2 8797 -62.2019 -87.6934 1.56287 +VERTEX2 8798 -62.2716 -86.7322 1.57361 +VERTEX2 8799 -62.261 -85.7292 1.57244 +VERTEX2 8800 -62.3308 -84.7823 1.5699 +VERTEX2 8801 -63.3946 -84.797 -3.12468 +VERTEX2 8802 -64.4514 -84.8854 -3.11549 +VERTEX2 8803 -65.4572 -84.9417 -3.09131 +VERTEX2 8804 -66.4773 -85.0393 -3.11474 +VERTEX2 8805 -67.4499 -85.0761 -3.1201 +VERTEX2 8806 -67.4946 -86.1434 -1.5441 +VERTEX2 8807 -67.4095 -87.1267 -1.54681 +VERTEX2 8808 -67.3384 -88.0598 -1.53305 +VERTEX2 8809 -67.3248 -89.0221 -1.51726 +VERTEX2 8810 -67.2608 -89.9704 -1.51579 +VERTEX2 8811 -66.2817 -89.9139 0.0803264 +VERTEX2 8812 -65.2502 -89.9094 0.0608903 +VERTEX2 8813 -64.1727 -89.9426 0.0582652 +VERTEX2 8814 -63.1801 -89.8531 0.0813548 +VERTEX2 8815 -62.174 -89.805 0.086275 +VERTEX2 8816 -62.3193 -88.7999 1.67926 +VERTEX2 8817 -62.3815 -87.93 1.68251 +VERTEX2 8818 -62.6093 -86.9422 1.62421 +VERTEX2 8819 -62.6075 -85.9362 1.62589 +VERTEX2 8820 -62.628 -84.8973 1.58155 +VERTEX2 8821 -61.7091 -84.8897 0.0233991 +VERTEX2 8822 -60.6636 -84.8489 -0.00203481 +VERTEX2 8823 -59.5967 -84.949 0.00330084 +VERTEX2 8824 -58.6326 -85.037 -0.0279889 +VERTEX2 8825 -57.6491 -85.1214 -0.0254917 +VERTEX2 8826 -57.6831 -84.2097 1.49314 +VERTEX2 8827 -57.589 -83.181 1.47566 +VERTEX2 8828 -57.5503 -82.2336 1.43628 +VERTEX2 8829 -57.355 -81.1675 1.43156 +VERTEX2 8830 -57.1832 -80.1317 1.42191 +VERTEX2 8831 -58.1723 -80.0132 2.99408 +VERTEX2 8832 -59.206 -79.8026 2.97076 +VERTEX2 8833 -60.2039 -79.5778 2.98114 +VERTEX2 8834 -61.1945 -79.4135 2.96609 +VERTEX2 8835 -62.1294 -79.2553 2.94646 +VERTEX2 8836 -62.3371 -80.286 -1.77099 +VERTEX2 8837 -62.6074 -81.2868 -1.79591 +VERTEX2 8838 -62.8853 -82.3701 -1.79909 +VERTEX2 8839 -63.0728 -83.3496 -1.8234 +VERTEX2 8840 -63.3172 -84.374 -1.81721 +VERTEX2 8841 -62.3474 -84.6462 -0.25101 +VERTEX2 8842 -61.2996 -84.7802 -0.219171 +VERTEX2 8843 -60.3166 -84.9765 -0.249683 +VERTEX2 8844 -59.3714 -85.2029 -0.283549 +VERTEX2 8845 -58.3707 -85.4936 -0.318883 +VERTEX2 8846 -58.6557 -86.4555 -1.88407 +VERTEX2 8847 -58.9706 -87.3999 -1.83042 +VERTEX2 8848 -59.2549 -88.4097 -1.81653 +VERTEX2 8849 -59.4484 -89.4921 -1.82993 +VERTEX2 8850 -59.7057 -90.4499 -1.84423 +VERTEX2 8851 -58.7074 -90.7723 -0.270867 +VERTEX2 8852 -57.705 -91.1084 -0.267467 +VERTEX2 8853 -56.7804 -91.4652 -0.283876 +VERTEX2 8854 -55.8533 -91.7902 -0.291672 +VERTEX2 8855 -54.8781 -92.1549 -0.333326 +VERTEX2 8856 -54.6081 -91.2209 1.25813 +VERTEX2 8857 -54.2224 -90.3187 1.23843 +VERTEX2 8858 -53.9039 -89.4258 1.24091 +VERTEX2 8859 -53.4871 -88.5487 1.21848 +VERTEX2 8860 -53.1474 -87.6139 1.16537 +VERTEX2 8861 -52.2266 -87.9826 -0.404522 +VERTEX2 8862 -51.3772 -88.4511 -0.400477 +VERTEX2 8863 -50.3858 -88.8102 -0.398715 +VERTEX2 8864 -49.4239 -89.1102 -0.401278 +VERTEX2 8865 -48.5444 -89.464 -0.398398 +VERTEX2 8866 -48.1688 -88.6445 1.16732 +VERTEX2 8867 -47.8464 -87.747 1.18686 +VERTEX2 8868 -47.3957 -86.8141 1.18419 +VERTEX2 8869 -47.0231 -85.9116 1.16804 +VERTEX2 8870 -46.648 -85.0497 1.22878 +VERTEX2 8871 -47.5164 -84.6943 2.77775 +VERTEX2 8872 -48.4708 -84.41 2.76343 +VERTEX2 8873 -49.3924 -84.1632 2.73932 +VERTEX2 8874 -50.3574 -83.7057 2.7274 +VERTEX2 8875 -51.374 -83.2784 2.74421 +VERTEX2 8876 -50.9555 -82.4077 1.19342 +VERTEX2 8877 -50.6262 -81.4225 1.18946 +VERTEX2 8878 -50.2633 -80.4386 1.18764 +VERTEX2 8879 -49.9498 -79.5397 1.20836 +VERTEX2 8880 -49.621 -78.6485 1.20851 +VERTEX2 8881 -50.5676 -78.2695 2.79279 +VERTEX2 8882 -51.5294 -77.8713 2.78335 +VERTEX2 8883 -52.39 -77.5728 2.79849 +VERTEX2 8884 -53.2811 -77.3468 2.80203 +VERTEX2 8885 -54.2689 -76.9219 2.75961 +VERTEX2 8886 -53.8697 -75.9801 1.20034 +VERTEX2 8887 -53.474 -75.0992 1.20961 +VERTEX2 8888 -53.1056 -74.1196 1.23567 +VERTEX2 8889 -52.6829 -73.2404 1.22417 +VERTEX2 8890 -52.2791 -72.3012 1.23002 +VERTEX2 8891 -53.2123 -71.9943 2.82861 +VERTEX2 8892 -54.2186 -71.6824 2.79919 +VERTEX2 8893 -55.2024 -71.3759 2.79936 +VERTEX2 8894 -56.197 -71.0421 2.78887 +VERTEX2 8895 -57.1806 -70.6997 2.77926 +VERTEX2 8896 -57.527 -71.6624 -1.92533 +VERTEX2 8897 -57.9118 -72.5993 -1.95752 +VERTEX2 8898 -58.3048 -73.613 -1.95379 +VERTEX2 8899 -58.6169 -74.5409 -1.99091 +VERTEX2 8900 -59.0938 -75.4751 -1.9647 +VERTEX2 8901 -58.1485 -75.8488 -0.400769 +VERTEX2 8902 -57.2636 -76.2223 -0.416185 +VERTEX2 8903 -56.3337 -76.654 -0.390312 +VERTEX2 8904 -55.402 -77.0065 -0.381874 +VERTEX2 8905 -54.4908 -77.4682 -0.400137 +VERTEX2 8906 -54.1407 -76.5608 1.15069 +VERTEX2 8907 -53.7254 -75.6869 1.14733 +VERTEX2 8908 -53.3059 -74.6695 1.15691 +VERTEX2 8909 -52.9207 -73.8234 1.17251 +VERTEX2 8910 -52.4772 -72.8699 1.17473 +VERTEX2 8911 -53.3609 -72.5205 2.75494 +VERTEX2 8912 -54.2765 -72.1506 2.77776 +VERTEX2 8913 -55.2348 -71.8151 2.81387 +VERTEX2 8914 -56.2137 -71.4802 2.78484 +VERTEX2 8915 -57.1257 -71.0949 2.75274 +VERTEX2 8916 -57.5454 -72.054 -1.95584 +VERTEX2 8917 -57.951 -72.8848 -1.9821 +VERTEX2 8918 -58.369 -73.8513 -1.98666 +VERTEX2 8919 -58.8376 -74.7813 -1.98568 +VERTEX2 8920 -59.2186 -75.6431 -1.97617 +VERTEX2 8921 -58.2992 -76.0403 -0.405082 +VERTEX2 8922 -57.3954 -76.5088 -0.400181 +VERTEX2 8923 -56.4389 -76.8903 -0.417625 +VERTEX2 8924 -55.4253 -77.3637 -0.409449 +VERTEX2 8925 -54.484 -77.786 -0.453618 +VERTEX2 8926 -54.9493 -78.6624 -2.05524 +VERTEX2 8927 -55.4044 -79.5473 -2.10261 +VERTEX2 8928 -55.9081 -80.4608 -2.10011 +VERTEX2 8929 -56.4642 -81.3214 -2.06385 +VERTEX2 8930 -56.9234 -82.0652 -2.06554 +VERTEX2 8931 -56.0722 -82.5719 -0.491079 +VERTEX2 8932 -55.2566 -83.1154 -0.432428 +VERTEX2 8933 -54.3214 -83.678 -0.423449 +VERTEX2 8934 -53.317 -84.1388 -0.425717 +VERTEX2 8935 -52.4292 -84.6158 -0.408381 +VERTEX2 8936 -52.0059 -83.7473 1.17007 +VERTEX2 8937 -51.6147 -82.8257 1.16866 +VERTEX2 8938 -51.2295 -81.8871 1.18521 +VERTEX2 8939 -50.7679 -81.0432 1.18748 +VERTEX2 8940 -50.4774 -80.1684 1.1498 +VERTEX2 8941 -49.6322 -80.5498 -0.40961 +VERTEX2 8942 -48.7555 -80.9546 -0.407508 +VERTEX2 8943 -47.7948 -81.366 -0.414014 +VERTEX2 8944 -46.9044 -81.7804 -0.413663 +VERTEX2 8945 -46.1497 -82.2705 -0.406507 +VERTEX2 8946 -46.5311 -83.1681 -1.99723 +VERTEX2 8947 -46.9911 -84.1 -1.98852 +VERTEX2 8948 -47.4168 -85.0376 -1.99114 +VERTEX2 8949 -47.7732 -85.9265 -1.97927 +VERTEX2 8950 -48.1183 -86.9106 -2.01308 +VERTEX2 8951 -47.18 -87.3552 -0.419856 +VERTEX2 8952 -46.2959 -87.6823 -0.422057 +VERTEX2 8953 -45.4111 -88.1008 -0.428144 +VERTEX2 8954 -44.5035 -88.5176 -0.426252 +VERTEX2 8955 -43.6208 -88.9645 -0.409817 +VERTEX2 8956 -43.2137 -88.1489 1.15856 +VERTEX2 8957 -42.8153 -87.2155 1.1689 +VERTEX2 8958 -42.4622 -86.2344 1.17818 +VERTEX2 8959 -42.0456 -85.2527 1.17207 +VERTEX2 8960 -41.715 -84.3732 1.15236 +VERTEX2 8961 -42.622 -83.9627 2.71895 +VERTEX2 8962 -43.5114 -83.5435 2.72398 +VERTEX2 8963 -44.4068 -83.1407 2.7395 +VERTEX2 8964 -45.3157 -82.8693 2.74101 +VERTEX2 8965 -46.2166 -82.4624 2.76052 +VERTEX2 8966 -45.8631 -81.5282 1.22159 +VERTEX2 8967 -45.5393 -80.6098 1.19527 +VERTEX2 8968 -45.1904 -79.6777 1.20295 +VERTEX2 8969 -44.7563 -78.7843 1.21786 +VERTEX2 8970 -44.3028 -77.8366 1.26734 +VERTEX2 8971 -45.1789 -77.6542 2.8304 +VERTEX2 8972 -46.1559 -77.3067 2.80366 +VERTEX2 8973 -47.1036 -76.9997 2.8164 +VERTEX2 8974 -48.0987 -76.6058 2.81617 +VERTEX2 8975 -49.0633 -76.33 2.80784 +VERTEX2 8976 -48.8167 -75.4011 1.24127 +VERTEX2 8977 -48.5524 -74.5001 1.21705 +VERTEX2 8978 -48.3006 -73.5285 1.23245 +VERTEX2 8979 -47.9722 -72.6307 1.2303 +VERTEX2 8980 -47.6051 -71.6747 1.26032 +VERTEX2 8981 -48.5372 -71.4408 2.85443 +VERTEX2 8982 -49.5236 -71.1439 2.86969 +VERTEX2 8983 -50.494 -70.8964 2.88809 +VERTEX2 8984 -51.4096 -70.6265 2.88115 +VERTEX2 8985 -52.3997 -70.3867 2.86426 +VERTEX2 8986 -52.5967 -71.385 -1.86454 +VERTEX2 8987 -53.0434 -72.3279 -1.85099 +VERTEX2 8988 -53.2301 -73.3285 -1.86947 +VERTEX2 8989 -53.5487 -74.3036 -1.88626 +VERTEX2 8990 -53.7782 -75.2708 -1.90118 +VERTEX2 8991 -54.7031 -74.9019 2.78731 +VERTEX2 8992 -55.6642 -74.6034 2.80056 +VERTEX2 8993 -56.5694 -74.2348 2.77403 +VERTEX2 8994 -57.4879 -73.913 2.74799 +VERTEX2 8995 -58.3994 -73.6353 2.77543 +VERTEX2 8996 -58.0063 -72.7395 1.17884 +VERTEX2 8997 -57.5867 -71.85 1.1904 +VERTEX2 8998 -57.2225 -70.9474 1.19128 +VERTEX2 8999 -56.9041 -70.0017 1.18748 +VERTEX2 9000 -56.5398 -69.081 1.22388 +VERTEX2 9001 -57.4509 -68.7059 2.76651 +VERTEX2 9002 -58.3842 -68.4142 2.72557 +VERTEX2 9003 -59.2889 -67.9718 2.73508 +VERTEX2 9004 -60.1935 -67.5505 2.72417 +VERTEX2 9005 -61.1276 -67.1549 2.7205 +VERTEX2 9006 -61.4491 -68.0658 -2.00107 +VERTEX2 9007 -61.8374 -69.0442 -2.01965 +VERTEX2 9008 -62.2641 -69.9078 -2.00079 +VERTEX2 9009 -62.7547 -70.8121 -1.9968 +VERTEX2 9010 -63.1016 -71.8179 -2.00714 +VERTEX2 9011 -62.1485 -72.2873 -0.433925 +VERTEX2 9012 -61.2582 -72.7728 -0.44368 +VERTEX2 9013 -60.2955 -73.1642 -0.445253 +VERTEX2 9014 -59.4564 -73.6238 -0.459347 +VERTEX2 9015 -58.6147 -74.0003 -0.465377 +VERTEX2 9016 -59.1375 -74.7576 -2.05763 +VERTEX2 9017 -59.6242 -75.6725 -2.04685 +VERTEX2 9018 -60.0257 -76.6099 -2.00775 +VERTEX2 9019 -60.4514 -77.5457 -1.99969 +VERTEX2 9020 -60.9557 -78.4081 -2.02063 +VERTEX2 9021 -60.0262 -78.7657 -0.4374 +VERTEX2 9022 -59.1239 -79.178 -0.46377 +VERTEX2 9023 -58.2229 -79.5893 -0.479523 +VERTEX2 9024 -57.2969 -79.9963 -0.488531 +VERTEX2 9025 -56.38 -80.4484 -0.516283 +VERTEX2 9026 -55.8717 -79.5424 1.08835 +VERTEX2 9027 -55.4622 -78.6456 1.10708 +VERTEX2 9028 -54.8751 -77.7605 1.14622 +VERTEX2 9029 -54.5547 -76.8861 1.12961 +VERTEX2 9030 -54.1062 -75.9298 1.11259 +VERTEX2 9031 -55.0161 -75.4947 2.67937 +VERTEX2 9032 -55.9321 -74.9568 2.66537 +VERTEX2 9033 -56.7637 -74.5775 2.61889 +VERTEX2 9034 -57.597 -74.0448 2.64221 +VERTEX2 9035 -58.4461 -73.5927 2.61107 +VERTEX2 9036 -59.0334 -74.4838 -2.1141 +VERTEX2 9037 -59.6473 -75.3548 -2.10178 +VERTEX2 9038 -60.0793 -76.1813 -2.11553 +VERTEX2 9039 -60.5903 -77.0476 -2.10548 +VERTEX2 9040 -61.0973 -77.8416 -2.10192 +VERTEX2 9041 -60.2554 -78.3217 -0.509912 +VERTEX2 9042 -59.4282 -78.7924 -0.527282 +VERTEX2 9043 -58.5127 -79.3102 -0.499706 +VERTEX2 9044 -57.6383 -79.8248 -0.507831 +VERTEX2 9045 -56.7578 -80.3617 -0.466997 +VERTEX2 9046 -56.291 -79.4275 1.10733 +VERTEX2 9047 -55.8311 -78.489 1.1216 +VERTEX2 9048 -55.3869 -77.5296 1.11974 +VERTEX2 9049 -54.9298 -76.5501 1.12583 +VERTEX2 9050 -54.4906 -75.6328 1.13813 +VERTEX2 9051 -55.4255 -75.1655 2.71433 +VERTEX2 9052 -56.2911 -74.7732 2.6855 +VERTEX2 9053 -57.1917 -74.3246 2.68415 +VERTEX2 9054 -58.0324 -73.7589 2.70914 +VERTEX2 9055 -58.8881 -73.3239 2.68567 +VERTEX2 9056 -59.372 -74.1821 -2.01232 +VERTEX2 9057 -59.7842 -75.0966 -2.04682 +VERTEX2 9058 -60.2784 -75.9919 -2.03513 +VERTEX2 9059 -60.6424 -76.887 -2.05605 +VERTEX2 9060 -61.0554 -77.7089 -2.09932 +VERTEX2 9061 -61.9459 -77.2952 2.61539 +VERTEX2 9062 -62.8169 -76.7837 2.58186 +VERTEX2 9063 -63.7257 -76.2532 2.59711 +VERTEX2 9064 -64.6355 -75.7158 2.58943 +VERTEX2 9065 -65.453 -75.1682 2.57163 +VERTEX2 9066 -64.9766 -74.2704 1.01256 +VERTEX2 9067 -64.4597 -73.3052 1.02821 +VERTEX2 9068 -63.938 -72.4211 1.03251 +VERTEX2 9069 -63.4761 -71.5796 1.02213 +VERTEX2 9070 -62.8883 -70.8236 0.999017 +VERTEX2 9071 -63.7223 -70.3094 2.56228 +VERTEX2 9072 -64.4694 -69.742 2.56602 +VERTEX2 9073 -65.2448 -69.2512 2.55972 +VERTEX2 9074 -66.1155 -68.6494 2.57328 +VERTEX2 9075 -67.02 -68.097 2.58339 +VERTEX2 9076 -66.4654 -67.211 0.993777 +VERTEX2 9077 -65.8168 -66.2368 1.011 +VERTEX2 9078 -65.2189 -65.4246 1.01045 +VERTEX2 9079 -64.755 -64.5984 1.00767 +VERTEX2 9080 -64.2143 -63.7345 1.0007 +VERTEX2 9081 -65.1012 -63.1936 2.54589 +VERTEX2 9082 -65.891 -62.5405 2.56394 +VERTEX2 9083 -66.761 -62.0022 2.56381 +VERTEX2 9084 -67.6244 -61.3979 2.58521 +VERTEX2 9085 -68.5073 -60.822 2.58845 +VERTEX2 9086 -69.1272 -61.6975 -2.1208 +VERTEX2 9087 -69.5462 -62.5441 -2.17671 +VERTEX2 9088 -70.202 -63.3096 -2.1768 +VERTEX2 9089 -70.7506 -64.0404 -2.21557 +VERTEX2 9090 -71.3495 -64.8116 -2.18732 +VERTEX2 9091 -70.4973 -65.3936 -0.642047 +VERTEX2 9092 -69.6484 -66.071 -0.644653 +VERTEX2 9093 -68.8148 -66.6646 -0.606731 +VERTEX2 9094 -68.0137 -67.2981 -0.598451 +VERTEX2 9095 -67.1201 -67.864 -0.596624 +VERTEX2 9096 -66.6024 -67.0555 0.968684 +VERTEX2 9097 -66.0547 -66.2543 0.941428 +VERTEX2 9098 -65.5265 -65.4768 0.92583 +VERTEX2 9099 -64.9295 -64.6325 0.90761 +VERTEX2 9100 -64.3168 -63.8485 0.924221 +VERTEX2 9101 -65.1825 -63.2656 2.46436 +VERTEX2 9102 -65.9076 -62.645 2.49096 +VERTEX2 9103 -66.6038 -62.142 2.4721 +VERTEX2 9104 -67.4319 -61.4795 2.45482 +VERTEX2 9105 -68.2127 -60.7722 2.45635 +VERTEX2 9106 -67.5396 -59.9742 0.894254 +VERTEX2 9107 -66.8944 -59.1794 0.906661 +VERTEX2 9108 -66.3061 -58.3809 0.892937 +VERTEX2 9109 -65.7195 -57.6941 0.920669 +VERTEX2 9110 -65.0465 -56.8575 0.921549 +VERTEX2 9111 -65.7762 -56.408 2.50178 +VERTEX2 9112 -66.5313 -55.8101 2.51438 +VERTEX2 9113 -67.3428 -55.1487 2.53448 +VERTEX2 9114 -68.1685 -54.6024 2.54749 +VERTEX2 9115 -69.0691 -53.985 2.55415 +VERTEX2 9116 -68.4379 -53.2893 0.966097 +VERTEX2 9117 -67.9178 -52.4312 0.987591 +VERTEX2 9118 -67.3929 -51.6644 0.97655 +VERTEX2 9119 -66.7279 -50.7917 0.989801 +VERTEX2 9120 -66.1944 -49.9321 0.966598 +VERTEX2 9121 -66.9916 -49.2867 2.51154 +VERTEX2 9122 -67.8299 -48.6367 2.51446 +VERTEX2 9123 -68.588 -48.0444 2.50183 +VERTEX2 9124 -69.3253 -47.4255 2.48541 +VERTEX2 9125 -70.0828 -46.8536 2.48175 +VERTEX2 9126 -70.7149 -47.6629 -2.24521 +VERTEX2 9127 -71.281 -48.4417 -2.27578 +VERTEX2 9128 -71.8587 -49.1928 -2.24009 +VERTEX2 9129 -72.5739 -50.0741 -2.26259 +VERTEX2 9130 -73.2541 -50.8239 -2.2443 +VERTEX2 9131 -74.0689 -50.1968 2.46447 +VERTEX2 9132 -74.9393 -49.6108 2.45743 +VERTEX2 9133 -75.6985 -48.9326 2.47118 +VERTEX2 9134 -76.4 -48.3835 2.45615 +VERTEX2 9135 -77.2963 -47.6916 2.46587 +VERTEX2 9136 -77.8937 -48.4557 -2.2531 +VERTEX2 9137 -78.5312 -49.2348 -2.20968 +VERTEX2 9138 -79.1356 -50.0738 -2.21398 +VERTEX2 9139 -79.7088 -50.8007 -2.18736 +VERTEX2 9140 -80.2522 -51.5674 -2.16815 +VERTEX2 9141 -81.0035 -50.9624 2.52511 +VERTEX2 9142 -81.7831 -50.4105 2.54089 +VERTEX2 9143 -82.6081 -49.8698 2.57213 +VERTEX2 9144 -83.4984 -49.3777 2.59355 +VERTEX2 9145 -84.3002 -48.8697 2.60811 +VERTEX2 9146 -84.8273 -49.7335 -2.11085 +VERTEX2 9147 -85.3178 -50.5627 -2.10947 +VERTEX2 9148 -85.7956 -51.4578 -2.13946 +VERTEX2 9149 -86.2815 -52.2846 -2.1192 +VERTEX2 9150 -86.8741 -53.0883 -2.1167 +VERTEX2 9151 -85.9732 -53.6074 -0.538522 +VERTEX2 9152 -85.0734 -54.1168 -0.497932 +VERTEX2 9153 -84.1564 -54.5057 -0.535244 +VERTEX2 9154 -83.2034 -54.9951 -0.519251 +VERTEX2 9155 -82.3487 -55.5176 -0.517094 +VERTEX2 9156 -82.8138 -56.3009 -2.1183 +VERTEX2 9157 -83.3608 -57.1852 -2.11422 +VERTEX2 9158 -83.918 -57.9799 -2.11025 +VERTEX2 9159 -84.4421 -58.8589 -2.1196 +VERTEX2 9160 -85.0334 -59.6714 -2.12631 +VERTEX2 9161 -84.1785 -60.1929 -0.542101 +VERTEX2 9162 -83.2813 -60.6713 -0.524484 +VERTEX2 9163 -82.4528 -61.1659 -0.535525 +VERTEX2 9164 -81.5871 -61.6722 -0.541288 +VERTEX2 9165 -80.7108 -62.2921 -0.536353 +VERTEX2 9166 -80.2468 -61.399 1.04897 +VERTEX2 9167 -79.7449 -60.5086 1.05727 +VERTEX2 9168 -79.2822 -59.612 1.09034 +VERTEX2 9169 -78.8484 -58.7485 1.09347 +VERTEX2 9170 -78.4556 -57.8399 1.09718 +VERTEX2 9171 -77.6049 -58.3428 -0.504538 +VERTEX2 9172 -76.7081 -58.8096 -0.524736 +VERTEX2 9173 -75.8913 -59.3728 -0.548498 +VERTEX2 9174 -74.9921 -59.8508 -0.52513 +VERTEX2 9175 -74.1025 -60.2924 -0.509048 +VERTEX2 9176 -73.6258 -59.3401 1.09698 +VERTEX2 9177 -73.1869 -58.3844 1.08989 +VERTEX2 9178 -72.7926 -57.517 1.09961 +VERTEX2 9179 -72.2001 -56.613 1.10551 +VERTEX2 9180 -71.7301 -55.7102 1.12646 +VERTEX2 9181 -72.5712 -55.2473 2.67373 +VERTEX2 9182 -73.4448 -54.8112 2.66629 +VERTEX2 9183 -74.3738 -54.2992 2.69422 +VERTEX2 9184 -75.2778 -53.8311 2.70742 +VERTEX2 9185 -76.1904 -53.3548 2.71214 +VERTEX2 9186 -76.571 -54.3057 -1.97618 +VERTEX2 9187 -77.0239 -55.141 -1.98198 +VERTEX2 9188 -77.4641 -56.0753 -2.00792 +VERTEX2 9189 -77.8492 -56.9801 -1.97937 +VERTEX2 9190 -78.2909 -57.925 -1.97751 +VERTEX2 9191 -77.4493 -58.3189 -0.363523 +VERTEX2 9192 -76.5192 -58.6351 -0.362147 +VERTEX2 9193 -75.6665 -58.9396 -0.367759 +VERTEX2 9194 -74.7457 -59.2716 -0.359586 +VERTEX2 9195 -73.7814 -59.667 -0.360969 +VERTEX2 9196 -74.1215 -60.5858 -1.93576 +VERTEX2 9197 -74.521 -61.5617 -1.9409 +VERTEX2 9198 -74.7902 -62.46 -1.93491 +VERTEX2 9199 -75.0605 -63.3301 -1.96247 +VERTEX2 9200 -75.4163 -64.2511 -1.98073 +VERTEX2 9201 -74.516 -64.6523 -0.406283 +VERTEX2 9202 -73.5754 -65.0908 -0.395649 +VERTEX2 9203 -72.6351 -65.5173 -0.407254 +VERTEX2 9204 -71.7109 -65.944 -0.38779 +VERTEX2 9205 -70.8245 -66.3097 -0.429072 +VERTEX2 9206 -71.2125 -67.2225 -1.99507 +VERTEX2 9207 -71.6191 -68.1411 -1.9645 +VERTEX2 9208 -72.0762 -69.0288 -1.96146 +VERTEX2 9209 -72.3986 -70.0296 -1.93574 +VERTEX2 9210 -72.8536 -70.8721 -1.94182 +VERTEX2 9211 -71.9383 -71.2015 -0.362501 +VERTEX2 9212 -70.943 -71.5474 -0.346292 +VERTEX2 9213 -69.9068 -71.8941 -0.357453 +VERTEX2 9214 -68.9686 -72.2794 -0.35891 +VERTEX2 9215 -67.965 -72.6966 -0.362294 +VERTEX2 9216 -67.6393 -71.8209 1.18846 +VERTEX2 9217 -67.268 -70.9763 1.15275 +VERTEX2 9218 -66.8364 -70.0245 1.14789 +VERTEX2 9219 -66.4414 -69.1259 1.13482 +VERTEX2 9220 -65.9924 -68.2287 1.15706 +VERTEX2 9221 -66.8617 -67.8682 2.66685 +VERTEX2 9222 -67.6856 -67.4741 2.66977 +VERTEX2 9223 -68.4631 -67.0415 2.68485 +VERTEX2 9224 -69.32 -66.6261 2.69047 +VERTEX2 9225 -70.2793 -66.0567 2.69399 +VERTEX2 9226 -69.849 -65.2083 1.11392 +VERTEX2 9227 -69.4461 -64.2516 1.09115 +VERTEX2 9228 -68.973 -63.3756 1.11093 +VERTEX2 9229 -68.5338 -62.392 1.12561 +VERTEX2 9230 -68.2017 -61.4682 1.13578 +VERTEX2 9231 -69.1681 -61.082 2.68999 +VERTEX2 9232 -70.0359 -60.6115 2.69291 +VERTEX2 9233 -70.9962 -60.2166 2.66173 +VERTEX2 9234 -71.9146 -59.7895 2.65114 +VERTEX2 9235 -72.8925 -59.3757 2.66465 +VERTEX2 9236 -72.511 -58.545 1.08304 +VERTEX2 9237 -72.0338 -57.5645 1.05934 +VERTEX2 9238 -71.5694 -56.721 1.08738 +VERTEX2 9239 -71.0357 -55.747 1.06613 +VERTEX2 9240 -70.5217 -54.857 1.0687 +VERTEX2 9241 -71.4091 -54.2333 2.66047 +VERTEX2 9242 -72.299 -53.8499 2.62361 +VERTEX2 9243 -73.1535 -53.3401 2.66199 +VERTEX2 9244 -74.0398 -52.864 2.68368 +VERTEX2 9245 -74.9117 -52.3822 2.67519 +VERTEX2 9246 -75.4049 -53.2981 -2.03606 +VERTEX2 9247 -75.8774 -54.1608 -2.03631 +VERTEX2 9248 -76.2624 -55.0962 -2.05382 +VERTEX2 9249 -76.8363 -55.9514 -2.04624 +VERTEX2 9250 -77.3518 -56.8553 -2.0152 +VERTEX2 9251 -76.5011 -57.2538 -0.424411 +VERTEX2 9252 -75.5927 -57.6277 -0.421061 +VERTEX2 9253 -74.6741 -58.0473 -0.410814 +VERTEX2 9254 -73.7949 -58.369 -0.434598 +VERTEX2 9255 -73.0528 -58.7177 -0.442616 +VERTEX2 9256 -72.6609 -57.7202 1.09329 +VERTEX2 9257 -72.2846 -56.7639 1.09469 +VERTEX2 9258 -71.8636 -55.9127 1.10667 +VERTEX2 9259 -71.4839 -55.0919 1.09955 +VERTEX2 9260 -70.8974 -54.1908 1.11467 +VERTEX2 9261 -70.004 -54.6779 -0.451455 +VERTEX2 9262 -69.0476 -55.127 -0.45997 +VERTEX2 9263 -68.1126 -55.6056 -0.511682 +VERTEX2 9264 -67.1829 -56.2476 -0.533485 +VERTEX2 9265 -66.2818 -56.7362 -0.528075 +VERTEX2 9266 -66.8163 -57.5882 -2.10506 +VERTEX2 9267 -67.3291 -58.4587 -2.12503 +VERTEX2 9268 -67.7224 -59.3404 -2.11921 +VERTEX2 9269 -68.2417 -60.1749 -2.10904 +VERTEX2 9270 -68.7365 -60.9638 -2.12952 +VERTEX2 9271 -67.9284 -61.4073 -0.581209 +VERTEX2 9272 -67.0278 -61.9291 -0.559851 +VERTEX2 9273 -66.2673 -62.482 -0.573062 +VERTEX2 9274 -65.476 -62.96 -0.570113 +VERTEX2 9275 -64.7166 -63.4721 -0.581585 +VERTEX2 9276 -64.1586 -62.6602 1.00027 +VERTEX2 9277 -63.5118 -61.7992 1.0005 +VERTEX2 9278 -62.9805 -60.866 1.00426 +VERTEX2 9279 -62.37 -59.9655 1.02957 +VERTEX2 9280 -61.8759 -59.1362 1.02967 +VERTEX2 9281 -62.6544 -58.6126 2.60929 +VERTEX2 9282 -63.4543 -58.0871 2.59994 +VERTEX2 9283 -64.3097 -57.5513 2.55929 +VERTEX2 9284 -65.2299 -57.0908 2.57014 +VERTEX2 9285 -66.0786 -56.4855 2.59455 +VERTEX2 9286 -66.5854 -57.3429 -2.08435 +VERTEX2 9287 -67.1117 -58.2658 -2.09592 +VERTEX2 9288 -67.6537 -59.1026 -2.09152 +VERTEX2 9289 -68.1974 -59.9909 -2.0977 +VERTEX2 9290 -68.7093 -60.8331 -2.1313 +VERTEX2 9291 -67.8945 -61.2883 -0.561224 +VERTEX2 9292 -67.0151 -61.8351 -0.5665 +VERTEX2 9293 -66.1604 -62.4491 -0.552672 +VERTEX2 9294 -65.3597 -63.0001 -0.579472 +VERTEX2 9295 -64.4568 -63.5123 -0.556801 +VERTEX2 9296 -63.9548 -62.6304 1.01635 +VERTEX2 9297 -63.4878 -61.8583 1.00742 +VERTEX2 9298 -63.0091 -61.0131 0.998204 +VERTEX2 9299 -62.4663 -60.0798 0.994634 +VERTEX2 9300 -62.0455 -59.3102 0.970151 +VERTEX2 9301 -62.8624 -58.7879 2.52139 +VERTEX2 9302 -63.6241 -58.2017 2.54286 +VERTEX2 9303 -64.4926 -57.6269 2.54534 +VERTEX2 9304 -65.3457 -57.0835 2.54838 +VERTEX2 9305 -66.1321 -56.5436 2.55622 +VERTEX2 9306 -66.6539 -57.3334 -2.13504 +VERTEX2 9307 -67.216 -58.1788 -2.14746 +VERTEX2 9308 -67.656 -58.9849 -2.11657 +VERTEX2 9309 -68.2399 -59.7883 -2.12426 +VERTEX2 9310 -68.7651 -60.7072 -2.13176 +VERTEX2 9311 -68.0034 -61.252 -0.53409 +VERTEX2 9312 -67.1217 -61.8202 -0.51899 +VERTEX2 9313 -66.2473 -62.404 -0.511047 +VERTEX2 9314 -65.4419 -62.8928 -0.524173 +VERTEX2 9315 -64.6409 -63.4312 -0.517432 +VERTEX2 9316 -64.2143 -62.5735 1.05901 +VERTEX2 9317 -63.6387 -61.7246 1.08027 +VERTEX2 9318 -63.1321 -60.901 1.09138 +VERTEX2 9319 -62.6929 -60.043 1.10362 +VERTEX2 9320 -62.2254 -59.1584 1.13127 +VERTEX2 9321 -63.1942 -58.6996 2.70184 +VERTEX2 9322 -64.1012 -58.2678 2.69296 +VERTEX2 9323 -65.0033 -57.7947 2.7018 +VERTEX2 9324 -65.949 -57.3377 2.69202 +VERTEX2 9325 -66.8652 -56.8756 2.67226 +VERTEX2 9326 -66.4076 -55.9926 1.08716 +VERTEX2 9327 -65.9505 -55.0704 1.07364 +VERTEX2 9328 -65.4731 -54.055 1.08177 +VERTEX2 9329 -64.9703 -53.0968 1.08391 +VERTEX2 9330 -64.3934 -52.2737 1.0706 +VERTEX2 9331 -63.4744 -52.6778 -0.481347 +VERTEX2 9332 -62.4968 -53.2168 -0.446259 +VERTEX2 9333 -61.6236 -53.6987 -0.415312 +VERTEX2 9334 -60.6446 -54.1373 -0.403672 +VERTEX2 9335 -59.7645 -54.5727 -0.415358 +VERTEX2 9336 -59.3141 -53.6132 1.13205 +VERTEX2 9337 -58.7894 -52.7277 1.13029 +VERTEX2 9338 -58.4131 -51.8333 1.17544 +VERTEX2 9339 -57.9985 -50.9483 1.16272 +VERTEX2 9340 -57.5307 -50.0926 1.14642 +VERTEX2 9341 -56.6771 -50.4572 -0.404181 +VERTEX2 9342 -55.8467 -50.8157 -0.389459 +VERTEX2 9343 -54.9869 -51.2431 -0.371721 +VERTEX2 9344 -54.1252 -51.6283 -0.380194 +VERTEX2 9345 -53.1598 -51.9424 -0.365315 +VERTEX2 9346 -52.6883 -51.0002 1.21018 +VERTEX2 9347 -52.2853 -50.0914 1.22361 +VERTEX2 9348 -51.9134 -49.1872 1.22453 +VERTEX2 9349 -51.6064 -48.3132 1.22231 +VERTEX2 9350 -51.246 -47.3266 1.21124 +VERTEX2 9351 -52.1681 -47.0059 2.7833 +VERTEX2 9352 -53.0663 -46.745 2.76029 +VERTEX2 9353 -53.8709 -46.3175 2.73811 +VERTEX2 9354 -54.8435 -45.8954 2.74989 +VERTEX2 9355 -55.767 -45.4918 2.75815 +VERTEX2 9356 -55.4527 -44.4891 1.20922 +VERTEX2 9357 -55.0867 -43.5406 1.20989 +VERTEX2 9358 -54.7828 -42.5803 1.21199 +VERTEX2 9359 -54.3892 -41.582 1.22804 +VERTEX2 9360 -54.132 -40.6773 1.20692 +VERTEX2 9361 -55.0815 -40.2783 2.78286 +VERTEX2 9362 -56.0326 -39.8971 2.78995 +VERTEX2 9363 -56.9752 -39.4969 2.79235 +VERTEX2 9364 -57.8676 -39.1791 2.75426 +VERTEX2 9365 -58.854 -38.8141 2.75394 +VERTEX2 9366 -58.5562 -37.9852 1.19936 +VERTEX2 9367 -58.189 -37.0259 1.19209 +VERTEX2 9368 -57.925 -36.1423 1.19418 +VERTEX2 9369 -57.5589 -35.2305 1.16921 +VERTEX2 9370 -57.2047 -34.2613 1.20938 +VERTEX2 9371 -58.106 -33.9693 2.81272 +VERTEX2 9372 -59.0748 -33.6456 2.82464 +VERTEX2 9373 -59.9528 -33.3251 2.82805 +VERTEX2 9374 -60.8794 -33.0741 2.8188 +VERTEX2 9375 -61.7877 -32.8432 2.83957 +VERTEX2 9376 -61.4796 -31.8484 1.28213 +VERTEX2 9377 -61.1687 -30.9236 1.30411 +VERTEX2 9378 -60.9686 -29.9965 1.27423 +VERTEX2 9379 -60.7073 -28.9687 1.26902 +VERTEX2 9380 -60.3784 -28.0813 1.25725 +VERTEX2 9381 -59.3906 -28.369 -0.315651 +VERTEX2 9382 -58.4725 -28.7511 -0.352368 +VERTEX2 9383 -57.5554 -29.1182 -0.351512 +VERTEX2 9384 -56.5615 -29.4922 -0.361775 +VERTEX2 9385 -55.6601 -29.865 -0.394949 +VERTEX2 9386 -56.1295 -30.8728 -1.97126 +VERTEX2 9387 -56.5214 -31.692 -1.98243 +VERTEX2 9388 -56.9253 -32.6101 -1.99436 +VERTEX2 9389 -57.3144 -33.5617 -1.94844 +VERTEX2 9390 -57.7583 -34.4693 -1.9847 +VERTEX2 9391 -56.8111 -34.8538 -0.424279 +VERTEX2 9392 -55.8453 -35.2902 -0.401781 +VERTEX2 9393 -54.871 -35.6177 -0.397755 +VERTEX2 9394 -53.9667 -35.9785 -0.390515 +VERTEX2 9395 -53.1622 -36.3314 -0.368239 +VERTEX2 9396 -53.4978 -37.1829 -1.93165 +VERTEX2 9397 -53.9183 -38.1651 -1.94417 +VERTEX2 9398 -54.197 -39.0877 -1.9521 +VERTEX2 9399 -54.5128 -39.9961 -1.93292 +VERTEX2 9400 -54.9671 -40.9328 -1.91037 +VERTEX2 9401 -53.8883 -41.2358 -0.366274 +VERTEX2 9402 -52.8488 -41.687 -0.392106 +VERTEX2 9403 -51.9462 -42.0876 -0.416578 +VERTEX2 9404 -51.0307 -42.5405 -0.451682 +VERTEX2 9405 -50.0664 -42.9514 -0.441824 +VERTEX2 9406 -49.5579 -42.0013 1.11977 +VERTEX2 9407 -49.1526 -41.0923 1.10283 +VERTEX2 9408 -48.7596 -40.1318 1.1264 +VERTEX2 9409 -48.2813 -39.2452 1.15736 +VERTEX2 9410 -47.8559 -38.3676 1.1379 +VERTEX2 9411 -46.8927 -38.7152 -0.452801 +VERTEX2 9412 -45.9325 -39.1015 -0.445611 +VERTEX2 9413 -45.0514 -39.5624 -0.431436 +VERTEX2 9414 -44.1387 -39.9887 -0.419526 +VERTEX2 9415 -43.2851 -40.4164 -0.405281 +VERTEX2 9416 -42.8681 -39.4523 1.17476 +VERTEX2 9417 -42.5786 -38.5922 1.14418 +VERTEX2 9418 -42.2017 -37.709 1.11786 +VERTEX2 9419 -41.7698 -36.8426 1.12458 +VERTEX2 9420 -41.3809 -35.9075 1.12974 +VERTEX2 9421 -40.4664 -36.4944 -0.441424 +VERTEX2 9422 -39.4877 -36.9528 -0.451492 +VERTEX2 9423 -38.5596 -37.3806 -0.468242 +VERTEX2 9424 -37.6023 -37.8752 -0.485299 +VERTEX2 9425 -36.6951 -38.3257 -0.51642 +VERTEX2 9426 -36.1956 -37.4296 1.07681 +VERTEX2 9427 -35.7618 -36.5092 1.07917 +VERTEX2 9428 -35.3027 -35.5862 1.12869 +VERTEX2 9429 -34.9205 -34.5867 1.13948 +VERTEX2 9430 -34.5808 -33.7381 1.09855 +VERTEX2 9431 -33.6688 -34.1296 -0.456071 +VERTEX2 9432 -32.6631 -34.5062 -0.447532 +VERTEX2 9433 -31.7626 -34.934 -0.474197 +VERTEX2 9434 -30.9097 -35.3403 -0.481574 +VERTEX2 9435 -30.0318 -35.8065 -0.486126 +VERTEX2 9436 -29.5181 -34.9009 1.06773 +VERTEX2 9437 -29.0775 -33.9674 1.07182 +VERTEX2 9438 -28.6011 -33.0529 1.1286 +VERTEX2 9439 -28.1424 -32.1714 1.14928 +VERTEX2 9440 -27.6855 -31.2532 1.14935 +VERTEX2 9441 -28.5804 -30.8047 2.72888 +VERTEX2 9442 -29.4779 -30.4084 2.72299 +VERTEX2 9443 -30.3716 -30.0522 2.73931 +VERTEX2 9444 -31.2971 -29.6889 2.75167 +VERTEX2 9445 -32.1655 -29.3262 2.74442 +VERTEX2 9446 -32.5291 -30.2507 -1.94664 +VERTEX2 9447 -32.8769 -31.2166 -1.92003 +VERTEX2 9448 -33.2364 -32.1798 -1.91657 +VERTEX2 9449 -33.5235 -33.1991 -1.91736 +VERTEX2 9450 -33.8335 -34.1553 -1.91356 +VERTEX2 9451 -32.8121 -34.4341 -0.337317 +VERTEX2 9452 -31.7948 -34.7349 -0.354098 +VERTEX2 9453 -30.8353 -35.0741 -0.351223 +VERTEX2 9454 -29.8354 -35.4552 -0.361859 +VERTEX2 9455 -28.9439 -35.8 -0.365401 +VERTEX2 9456 -28.5668 -34.7826 1.19972 +VERTEX2 9457 -28.1786 -33.8465 1.20538 +VERTEX2 9458 -27.7625 -32.9658 1.21298 +VERTEX2 9459 -27.3621 -32.0112 1.21455 +VERTEX2 9460 -27.0749 -31.0909 1.18594 +VERTEX2 9461 -28.0374 -30.7063 2.74972 +VERTEX2 9462 -29.0601 -30.3232 2.75281 +VERTEX2 9463 -29.8901 -29.8815 2.73701 +VERTEX2 9464 -30.8234 -29.4738 2.73058 +VERTEX2 9465 -31.6776 -29.0815 2.73371 +VERTEX2 9466 -31.3476 -28.1914 1.17747 +VERTEX2 9467 -31.01 -27.3152 1.18086 +VERTEX2 9468 -30.6287 -26.4624 1.16559 +VERTEX2 9469 -30.3046 -25.6162 1.19491 +VERTEX2 9470 -29.8987 -24.7228 1.20796 +VERTEX2 9471 -30.7876 -24.3914 2.82157 +VERTEX2 9472 -31.7806 -24.0591 2.83097 +VERTEX2 9473 -32.6754 -23.8021 2.82915 +VERTEX2 9474 -33.7028 -23.5182 2.87402 +VERTEX2 9475 -34.7317 -23.2922 2.87737 +VERTEX2 9476 -34.9409 -24.2504 -1.8103 +VERTEX2 9477 -35.125 -25.1853 -1.83035 +VERTEX2 9478 -35.3976 -26.1906 -1.81867 +VERTEX2 9479 -35.6545 -27.2495 -1.82135 +VERTEX2 9480 -35.9444 -28.1808 -1.88634 +VERTEX2 9481 -36.9739 -27.9229 2.77706 +VERTEX2 9482 -37.9376 -27.612 2.77722 +VERTEX2 9483 -38.8966 -27.2507 2.77681 +VERTEX2 9484 -39.812 -26.9513 2.76901 +VERTEX2 9485 -40.7739 -26.6258 2.77045 +VERTEX2 9486 -40.4832 -25.6883 1.22628 +VERTEX2 9487 -40.1395 -24.8168 1.22782 +VERTEX2 9488 -39.867 -23.8897 1.26993 +VERTEX2 9489 -39.4917 -22.9824 1.25371 +VERTEX2 9490 -39.1349 -21.9361 1.25244 +VERTEX2 9491 -40.0215 -21.65 2.80504 +VERTEX2 9492 -41.034 -21.317 2.80321 +VERTEX2 9493 -41.9317 -20.96 2.77208 +VERTEX2 9494 -42.8517 -20.5404 2.7541 +VERTEX2 9495 -43.7403 -20.2171 2.74494 +VERTEX2 9496 -43.4179 -19.2699 1.17921 +VERTEX2 9497 -42.9636 -18.4557 1.19602 +VERTEX2 9498 -42.6449 -17.5081 1.19799 +VERTEX2 9499 -42.3087 -16.577 1.18867 +VERTEX2 9500 -41.8581 -15.6197 1.20505 +VERTEX2 9501 -42.8483 -15.3136 2.73041 +VERTEX2 9502 -43.7457 -14.8167 2.74958 +VERTEX2 9503 -44.6542 -14.4487 2.77013 +VERTEX2 9504 -45.5324 -14.0539 2.74197 +VERTEX2 9505 -46.4969 -13.6515 2.7174 +VERTEX2 9506 -46.1308 -12.6877 1.12399 +VERTEX2 9507 -45.702 -11.7954 1.11849 +VERTEX2 9508 -45.2973 -10.8829 1.16598 +VERTEX2 9509 -45.0018 -9.9433 1.15375 +VERTEX2 9510 -44.6324 -9.03942 1.17407 +VERTEX2 9511 -45.5827 -8.64687 2.73772 +VERTEX2 9512 -46.5058 -8.27573 2.73823 +VERTEX2 9513 -47.3873 -7.85054 2.72409 +VERTEX2 9514 -48.2885 -7.36677 2.73007 +VERTEX2 9515 -49.1387 -7.06198 2.72024 +VERTEX2 9516 -49.5461 -7.93529 -1.99354 +VERTEX2 9517 -50.0204 -8.83276 -1.96096 +VERTEX2 9518 -50.3524 -9.73583 -1.96151 +VERTEX2 9519 -50.693 -10.581 -1.92098 +VERTEX2 9520 -50.9872 -11.4834 -1.94079 +VERTEX2 9521 -49.9998 -11.8354 -0.355381 +VERTEX2 9522 -49.0262 -12.1845 -0.325624 +VERTEX2 9523 -48.0006 -12.4856 -0.308807 +VERTEX2 9524 -47.0794 -12.7457 -0.339237 +VERTEX2 9525 -46.1031 -13.0821 -0.317385 +VERTEX2 9526 -46.4001 -13.968 -1.94482 +VERTEX2 9527 -46.7723 -14.9045 -1.94527 +VERTEX2 9528 -47.0342 -15.824 -1.91332 +VERTEX2 9529 -47.4401 -16.779 -1.91975 +VERTEX2 9530 -47.7551 -17.6917 -1.93156 +VERTEX2 9531 -48.6011 -17.4304 2.73419 +VERTEX2 9532 -49.4633 -17.1131 2.72609 +VERTEX2 9533 -50.3732 -16.7565 2.74109 +VERTEX2 9534 -51.2819 -16.4237 2.72156 +VERTEX2 9535 -52.1841 -15.9201 2.7188 +VERTEX2 9536 -51.7843 -15.117 1.14129 +VERTEX2 9537 -51.3902 -14.1509 1.14242 +VERTEX2 9538 -50.9815 -13.2986 1.09817 +VERTEX2 9539 -50.5791 -12.3454 1.10336 +VERTEX2 9540 -50.1171 -11.4108 1.0734 +VERTEX2 9541 -50.984 -10.9895 2.61461 +VERTEX2 9542 -51.8663 -10.4649 2.63961 +VERTEX2 9543 -52.75 -10.0386 2.66738 +VERTEX2 9544 -53.6316 -9.546 2.63184 +VERTEX2 9545 -54.5102 -9.03855 2.64304 +VERTEX2 9546 -54.1109 -8.13389 1.05544 +VERTEX2 9547 -53.7054 -7.30686 1.047 +VERTEX2 9548 -53.319 -6.40738 1.03601 +VERTEX2 9549 -52.8421 -5.44987 1.03266 +VERTEX2 9550 -52.3469 -4.48373 1.01054 +VERTEX2 9551 -53.1721 -3.94687 2.59329 +VERTEX2 9552 -54.0831 -3.46268 2.61626 +VERTEX2 9553 -54.9118 -3.01851 2.60254 +VERTEX2 9554 -55.7722 -2.54902 2.60151 +VERTEX2 9555 -56.6285 -2.05732 2.6347 +VERTEX2 9556 -56.1732 -1.12842 1.08177 +VERTEX2 9557 -55.6124 -0.200081 1.05251 +VERTEX2 9558 -55.1561 0.679245 1.03558 +VERTEX2 9559 -54.6464 1.66726 1.06057 +VERTEX2 9560 -54.1456 2.58303 1.08122 +VERTEX2 9561 -55.0217 3.092 2.65487 +VERTEX2 9562 -55.9336 3.59868 2.65328 +VERTEX2 9563 -56.7943 4.0174 2.68532 +VERTEX2 9564 -57.7334 4.52428 2.67612 +VERTEX2 9565 -58.6737 5.06317 2.65393 +VERTEX2 9566 -58.1859 5.90803 1.06992 +VERTEX2 9567 -57.7664 6.75566 1.04065 +VERTEX2 9568 -57.328 7.70053 1.03329 +VERTEX2 9569 -56.8125 8.61371 1.01291 +VERTEX2 9570 -56.2323 9.51586 1.01771 +VERTEX2 9571 -57.0367 9.98244 2.57836 +VERTEX2 9572 -57.9077 10.5519 2.59103 +VERTEX2 9573 -58.7175 11.1525 2.54058 +VERTEX2 9574 -59.5449 11.7253 2.54824 +VERTEX2 9575 -60.3568 12.2442 2.54279 +VERTEX2 9576 -60.9678 11.347 -2.16691 +VERTEX2 9577 -61.4604 10.4803 -2.18825 +VERTEX2 9578 -62.1053 9.60359 -2.20962 +VERTEX2 9579 -62.702 8.80002 -2.20534 +VERTEX2 9580 -63.3041 8.14086 -2.20585 +VERTEX2 9581 -62.5135 7.48486 -0.633567 +VERTEX2 9582 -61.7142 6.8944 -0.625361 +VERTEX2 9583 -60.9622 6.29721 -0.640831 +VERTEX2 9584 -60.1281 5.77962 -0.633172 +VERTEX2 9585 -59.3137 5.1866 -0.638377 +VERTEX2 9586 -58.7678 6.02055 0.918988 +VERTEX2 9587 -58.1583 6.86004 0.910689 +VERTEX2 9588 -57.5345 7.61451 0.909708 +VERTEX2 9589 -56.9363 8.34343 0.930774 +VERTEX2 9590 -56.3227 9.17995 0.931932 +VERTEX2 9591 -57.1359 9.74999 2.53411 +VERTEX2 9592 -57.9834 10.32 2.52247 +VERTEX2 9593 -58.828 11.0379 2.51671 +VERTEX2 9594 -59.6248 11.5934 2.53314 +VERTEX2 9595 -60.3464 12.1352 2.54134 +VERTEX2 9596 -60.8448 11.2894 -2.17063 +VERTEX2 9597 -61.3453 10.4988 -2.14663 +VERTEX2 9598 -61.9365 9.6161 -2.15201 +VERTEX2 9599 -62.5582 8.81769 -2.17117 +VERTEX2 9600 -63.0792 7.99016 -2.18062 +VERTEX2 9601 -62.239 7.44184 -0.599021 +VERTEX2 9602 -61.4192 6.89673 -0.598518 +VERTEX2 9603 -60.6214 6.2986 -0.617356 +VERTEX2 9604 -59.8508 5.84879 -0.613612 +VERTEX2 9605 -59.0698 5.20677 -0.593845 +VERTEX2 9606 -59.5518 4.43627 -2.20749 +VERTEX2 9607 -60.1528 3.67243 -2.19336 +VERTEX2 9608 -60.7239 2.86509 -2.18673 +VERTEX2 9609 -61.4575 2.04561 -2.20469 +VERTEX2 9610 -62.1031 1.26312 -2.2209 +VERTEX2 9611 -62.8231 1.88101 2.49338 +VERTEX2 9612 -63.5878 2.48968 2.48369 +VERTEX2 9613 -64.4429 3.04738 2.47499 +VERTEX2 9614 -65.2087 3.70233 2.47817 +VERTEX2 9615 -66.0254 4.38946 2.49075 +VERTEX2 9616 -66.5482 3.65351 -2.21244 +VERTEX2 9617 -67.161 2.8023 -2.19077 +VERTEX2 9618 -67.6603 2.01811 -2.20792 +VERTEX2 9619 -68.2207 1.21193 -2.19169 +VERTEX2 9620 -68.8062 0.345485 -2.1729 +VERTEX2 9621 -69.7077 0.848849 2.52562 +VERTEX2 9622 -70.5286 1.47844 2.51755 +VERTEX2 9623 -71.377 2.11433 2.49766 +VERTEX2 9624 -72.2186 2.72087 2.50637 +VERTEX2 9625 -73.0308 3.30217 2.4922 +VERTEX2 9626 -73.6566 2.58909 -2.21078 +VERTEX2 9627 -74.1528 1.79072 -2.19058 +VERTEX2 9628 -74.7099 1.01597 -2.1894 +VERTEX2 9629 -75.2303 0.275335 -2.21413 +VERTEX2 9630 -75.7655 -0.53385 -2.20907 +VERTEX2 9631 -74.8993 -1.09522 -0.656072 +VERTEX2 9632 -74.0658 -1.80718 -0.678376 +VERTEX2 9633 -73.3196 -2.43858 -0.632732 +VERTEX2 9634 -72.4229 -2.99058 -0.591391 +VERTEX2 9635 -71.6124 -3.49842 -0.589624 +VERTEX2 9636 -71.0036 -2.66709 0.97251 +VERTEX2 9637 -70.3072 -1.90061 0.961768 +VERTEX2 9638 -69.7592 -1.09372 0.999047 +VERTEX2 9639 -69.2203 -0.271436 0.973781 +VERTEX2 9640 -68.6513 0.434672 1.0095 +VERTEX2 9641 -69.5056 0.972509 2.58496 +VERTEX2 9642 -70.3478 1.55278 2.57687 +VERTEX2 9643 -71.1512 2.07607 2.61622 +VERTEX2 9644 -71.9308 2.58463 2.60988 +VERTEX2 9645 -72.883 3.09164 2.64882 +VERTEX2 9646 -73.3496 2.1768 -2.07369 +VERTEX2 9647 -73.8301 1.23199 -2.03394 +VERTEX2 9648 -74.3193 0.28181 -2.02375 +VERTEX2 9649 -74.7731 -0.616936 -2.03063 +VERTEX2 9650 -75.1224 -1.48016 -2.04942 +VERTEX2 9651 -74.3377 -2.03622 -0.486489 +VERTEX2 9652 -73.4498 -2.45191 -0.467222 +VERTEX2 9653 -72.568 -2.99474 -0.483896 +VERTEX2 9654 -71.5984 -3.41095 -0.476057 +VERTEX2 9655 -70.7112 -3.82275 -0.458749 +VERTEX2 9656 -71.2752 -4.74546 -2.041 +VERTEX2 9657 -71.6945 -5.597 -2.0604 +VERTEX2 9658 -72.1833 -6.49556 -2.05493 +VERTEX2 9659 -72.7462 -7.30773 -2.05606 +VERTEX2 9660 -73.3287 -8.16813 -2.02486 +VERTEX2 9661 -72.522 -8.54694 -0.448595 +VERTEX2 9662 -71.6574 -8.99362 -0.444837 +VERTEX2 9663 -70.7336 -9.43917 -0.403802 +VERTEX2 9664 -69.7967 -9.79378 -0.434594 +VERTEX2 9665 -68.8978 -10.1997 -0.449426 +VERTEX2 9666 -69.3082 -11.0664 -1.99862 +VERTEX2 9667 -69.7856 -11.9757 -2.00442 +VERTEX2 9668 -70.1879 -12.9402 -1.97863 +VERTEX2 9669 -70.5398 -13.9082 -1.94992 +VERTEX2 9670 -70.93 -14.7614 -1.9735 +VERTEX2 9671 -71.8081 -14.4027 2.73224 +VERTEX2 9672 -72.7201 -14.0757 2.73199 +VERTEX2 9673 -73.6643 -13.6658 2.73646 +VERTEX2 9674 -74.5337 -13.3195 2.76912 +VERTEX2 9675 -75.3659 -12.9776 2.75409 +VERTEX2 9676 -75.7077 -13.9423 -1.99077 +VERTEX2 9677 -76.1029 -14.9001 -2.00871 +VERTEX2 9678 -76.6753 -15.7832 -1.99848 +VERTEX2 9679 -77.0149 -16.6494 -2.01119 +VERTEX2 9680 -77.4147 -17.5499 -2.03548 +VERTEX2 9681 -78.2205 -17.055 2.74786 +VERTEX2 9682 -79.1026 -16.6567 2.7398 +VERTEX2 9683 -79.9919 -16.3686 2.75057 +VERTEX2 9684 -80.9315 -16.0648 2.72081 +VERTEX2 9685 -81.8174 -15.7306 2.75436 +VERTEX2 9686 -82.1282 -16.6166 -1.9879 +VERTEX2 9687 -82.5426 -17.6299 -2.02609 +VERTEX2 9688 -82.9816 -18.5656 -2.01324 +VERTEX2 9689 -83.4328 -19.4347 -2.0447 +VERTEX2 9690 -84.0025 -20.3736 -2.07497 +VERTEX2 9691 -83.274 -20.9144 -0.511507 +VERTEX2 9692 -82.3986 -21.4201 -0.533494 +VERTEX2 9693 -81.4739 -22.0096 -0.510679 +VERTEX2 9694 -80.5177 -22.4944 -0.507358 +VERTEX2 9695 -79.6941 -23.0298 -0.530213 +VERTEX2 9696 -79.1225 -22.2481 1.0976 +VERTEX2 9697 -78.5999 -21.3848 1.12467 +VERTEX2 9698 -78.2058 -20.486 1.12673 +VERTEX2 9699 -77.6792 -19.475 1.1281 +VERTEX2 9700 -77.1845 -18.5831 1.1347 +VERTEX2 9701 -78.0552 -18.1588 2.70761 +VERTEX2 9702 -78.9475 -17.7588 2.6946 +VERTEX2 9703 -79.7991 -17.3124 2.68794 +VERTEX2 9704 -80.6405 -16.8856 2.67935 +VERTEX2 9705 -81.5049 -16.3667 2.66358 +VERTEX2 9706 -81.9754 -17.2318 -2.02395 +VERTEX2 9707 -82.2982 -18.1182 -2.03776 +VERTEX2 9708 -82.7521 -18.9743 -2.0403 +VERTEX2 9709 -83.257 -19.8747 -2.0132 +VERTEX2 9710 -83.7275 -20.7895 -1.99738 +VERTEX2 9711 -82.8018 -21.2419 -0.417237 +VERTEX2 9712 -81.9864 -21.6279 -0.408187 +VERTEX2 9713 -81.1748 -21.9031 -0.378632 +VERTEX2 9714 -80.1609 -22.2387 -0.407001 +VERTEX2 9715 -79.2056 -22.6814 -0.419057 +VERTEX2 9716 -79.614 -23.6166 -1.96772 +VERTEX2 9717 -79.9754 -24.5642 -1.95071 +VERTEX2 9718 -80.3854 -25.4327 -1.95149 +VERTEX2 9719 -80.8061 -26.3536 -1.94678 +VERTEX2 9720 -81.2114 -27.1948 -1.9285 +VERTEX2 9721 -82.1097 -26.9005 2.77675 +VERTEX2 9722 -83.0718 -26.5792 2.81552 +VERTEX2 9723 -84.107 -26.2884 2.77881 +VERTEX2 9724 -85.043 -25.9829 2.75425 +VERTEX2 9725 -85.9894 -25.5635 2.75377 +VERTEX2 9726 -86.4315 -26.5174 -1.95192 +VERTEX2 9727 -86.8481 -27.4276 -1.94769 +VERTEX2 9728 -87.1986 -28.2971 -1.96212 +VERTEX2 9729 -87.6034 -29.1969 -1.97921 +VERTEX2 9730 -88.0464 -30.0924 -2.00679 +VERTEX2 9731 -88.9344 -29.7385 2.6656 +VERTEX2 9732 -89.9369 -29.3066 2.65945 +VERTEX2 9733 -90.8597 -28.7857 2.67488 +VERTEX2 9734 -91.7387 -28.3978 2.69664 +VERTEX2 9735 -92.5797 -27.8845 2.70472 +VERTEX2 9736 -92.15 -26.9434 1.13575 +VERTEX2 9737 -91.8571 -26.0755 1.11661 +VERTEX2 9738 -91.4318 -25.2022 1.12683 +VERTEX2 9739 -91.0374 -24.2795 1.16793 +VERTEX2 9740 -90.7002 -23.3864 1.1479 +VERTEX2 9741 -91.5674 -23.0107 2.71989 +VERTEX2 9742 -92.3902 -22.5679 2.70772 +VERTEX2 9743 -93.3005 -22.2093 2.71107 +VERTEX2 9744 -94.2267 -21.8826 2.69034 +VERTEX2 9745 -95.1207 -21.3817 2.66918 +VERTEX2 9746 -94.7069 -20.4726 1.09153 +VERTEX2 9747 -94.1871 -19.5646 1.08799 +VERTEX2 9748 -93.7557 -18.6681 1.10031 +VERTEX2 9749 -93.291 -17.7633 1.13076 +VERTEX2 9750 -92.8068 -16.7126 1.1472 +VERTEX2 9751 -93.6963 -16.3227 2.68632 +VERTEX2 9752 -94.5259 -15.8846 2.66355 +VERTEX2 9753 -95.3701 -15.5004 2.69398 +VERTEX2 9754 -96.2664 -15.0261 2.69279 +VERTEX2 9755 -97.1773 -14.6332 2.68454 +VERTEX2 9756 -97.6683 -15.6148 -2.04345 +VERTEX2 9757 -98.0611 -16.4122 -2.04468 +VERTEX2 9758 -98.508 -17.2925 -2.0601 +VERTEX2 9759 -98.9702 -18.1779 -2.05595 +VERTEX2 9760 -99.4449 -19.0333 -2.04569 +VERTEX2 9761 -100.276 -18.5424 2.65808 +VERTEX2 9762 -101.24 -18.0451 2.66014 +VERTEX2 9763 -102.193 -17.6439 2.62449 +VERTEX2 9764 -103.007 -17.1274 2.6087 +VERTEX2 9765 -103.812 -16.6509 2.63764 +VERTEX2 9766 -104.267 -17.4466 -2.05141 +VERTEX2 9767 -104.643 -18.2967 -2.05943 +VERTEX2 9768 -105.065 -19.115 -2.06871 +VERTEX2 9769 -105.659 -20.0096 -2.07859 +VERTEX2 9770 -106.113 -20.9569 -2.05031 +VERTEX2 9771 -105.26 -21.5171 -0.505926 +VERTEX2 9772 -104.328 -22.0166 -0.517928 +VERTEX2 9773 -103.456 -22.6262 -0.49946 +VERTEX2 9774 -102.702 -22.9834 -0.505761 +VERTEX2 9775 -101.868 -23.4451 -0.485276 +VERTEX2 9776 -101.331 -22.5763 1.07114 +VERTEX2 9777 -100.786 -21.6943 1.07648 +VERTEX2 9778 -100.307 -20.8636 1.0656 +VERTEX2 9779 -99.796 -20.1238 1.0679 +VERTEX2 9780 -99.3826 -19.3021 1.0652 +VERTEX2 9781 -100.271 -18.7283 2.62488 +VERTEX2 9782 -101.127 -18.2172 2.64615 +VERTEX2 9783 -101.968 -17.7918 2.63941 +VERTEX2 9784 -102.882 -17.1475 2.62893 +VERTEX2 9785 -103.694 -16.5912 2.63727 +VERTEX2 9786 -104.188 -17.5575 -2.0872 +VERTEX2 9787 -104.656 -18.4438 -2.07018 +VERTEX2 9788 -105.168 -19.356 -2.07849 +VERTEX2 9789 -105.647 -20.1555 -2.12265 +VERTEX2 9790 -106.158 -20.9995 -2.11475 +VERTEX2 9791 -105.332 -21.6029 -0.538615 +VERTEX2 9792 -104.509 -21.9902 -0.530094 +VERTEX2 9793 -103.651 -22.5156 -0.537692 +VERTEX2 9794 -102.905 -23.0383 -0.568266 +VERTEX2 9795 -102.014 -23.5902 -0.529897 +VERTEX2 9796 -101.501 -22.7426 1.0426 +VERTEX2 9797 -100.967 -21.8545 1.06315 +VERTEX2 9798 -100.516 -21.0031 1.03978 +VERTEX2 9799 -99.9875 -20.132 1.04838 +VERTEX2 9800 -99.4642 -19.3199 1.05906 +VERTEX2 9801 -100.291 -18.8906 2.60231 +VERTEX2 9802 -101.149 -18.3418 2.60159 +VERTEX2 9803 -101.998 -17.837 2.58178 +VERTEX2 9804 -102.836 -17.2993 2.56749 +VERTEX2 9805 -103.683 -16.7119 2.58311 +VERTEX2 9806 -104.195 -17.607 -2.09043 +VERTEX2 9807 -104.751 -18.5348 -2.12012 +VERTEX2 9808 -105.269 -19.3316 -2.09252 +VERTEX2 9809 -105.785 -20.2218 -2.08341 +VERTEX2 9810 -106.229 -21.0305 -2.07029 +VERTEX2 9811 -107.175 -20.5826 2.61759 +VERTEX2 9812 -108.039 -20.0552 2.60669 +VERTEX2 9813 -108.937 -19.5805 2.61296 +VERTEX2 9814 -109.834 -19.0781 2.60897 +VERTEX2 9815 -110.701 -18.6199 2.6197 +VERTEX2 9816 -111.129 -19.4499 -2.05656 +VERTEX2 9817 -111.605 -20.3904 -2.0973 +VERTEX2 9818 -112.201 -21.3117 -2.09592 +VERTEX2 9819 -112.765 -22.2341 -2.11126 +VERTEX2 9820 -113.279 -23.1111 -2.11554 +VERTEX2 9821 -114.084 -22.5949 2.5818 +VERTEX2 9822 -114.825 -22.0525 2.55511 +VERTEX2 9823 -115.697 -21.4534 2.56566 +VERTEX2 9824 -116.505 -20.9033 2.53447 +VERTEX2 9825 -117.426 -20.3824 2.52764 +VERTEX2 9826 -117.952 -21.2943 -2.14148 +VERTEX2 9827 -118.48 -21.9753 -2.1373 +VERTEX2 9828 -118.906 -22.8273 -2.16106 +VERTEX2 9829 -119.46 -23.6309 -2.12835 +VERTEX2 9830 -120.048 -24.3723 -2.13192 +VERTEX2 9831 -119.205 -24.817 -0.541663 +VERTEX2 9832 -118.348 -25.3573 -0.519136 +VERTEX2 9833 -117.428 -25.9292 -0.498784 +VERTEX2 9834 -116.592 -26.2934 -0.506281 +VERTEX2 9835 -115.687 -26.668 -0.51749 +VERTEX2 9836 -115.235 -25.7741 1.04371 +VERTEX2 9837 -114.723 -24.9241 1.0563 +VERTEX2 9838 -114.257 -24.1249 1.04077 +VERTEX2 9839 -113.78 -23.2309 1.04757 +VERTEX2 9840 -113.376 -22.3593 1.05508 +VERTEX2 9841 -112.52 -22.843 -0.504899 +VERTEX2 9842 -111.544 -23.3322 -0.508822 +VERTEX2 9843 -110.724 -23.8004 -0.484292 +VERTEX2 9844 -109.909 -24.3225 -0.529217 +VERTEX2 9845 -108.981 -24.7237 -0.534152 +VERTEX2 9846 -108.494 -23.9351 1.05237 +VERTEX2 9847 -108.006 -23.0099 1.04108 +VERTEX2 9848 -107.539 -22.1394 1.05633 +VERTEX2 9849 -106.995 -21.258 1.06771 +VERTEX2 9850 -106.497 -20.3817 1.06554 +VERTEX2 9851 -105.642 -20.8353 -0.50741 +VERTEX2 9852 -104.836 -21.373 -0.475294 +VERTEX2 9853 -103.88 -21.8858 -0.48749 +VERTEX2 9854 -102.931 -22.3112 -0.447867 +VERTEX2 9855 -102.039 -22.7058 -0.481411 +VERTEX2 9856 -101.618 -21.6727 1.10176 +VERTEX2 9857 -101.187 -20.853 1.08957 +VERTEX2 9858 -100.734 -20.0138 1.12211 +VERTEX2 9859 -100.381 -19.179 1.14188 +VERTEX2 9860 -100.098 -18.2819 1.12144 +VERTEX2 9861 -101.026 -17.7828 2.69529 +VERTEX2 9862 -101.858 -17.3516 2.67889 +VERTEX2 9863 -102.777 -16.9013 2.67371 +VERTEX2 9864 -103.608 -16.4306 2.65846 +VERTEX2 9865 -104.541 -16.0159 2.6598 +VERTEX2 9866 -104.061 -15.1076 1.06196 +VERTEX2 9867 -103.583 -14.3092 1.05684 +VERTEX2 9868 -103.106 -13.4989 1.05039 +VERTEX2 9869 -102.61 -12.7087 1.06332 +VERTEX2 9870 -102.064 -11.8143 1.04812 +VERTEX2 9871 -102.873 -11.3375 2.65608 +VERTEX2 9872 -103.817 -10.8468 2.64686 +VERTEX2 9873 -104.772 -10.3049 2.66349 +VERTEX2 9874 -105.649 -9.83927 2.63909 +VERTEX2 9875 -106.542 -9.28355 2.62154 +VERTEX2 9876 -106.987 -10.178 -2.09781 +VERTEX2 9877 -107.431 -11.0046 -2.07634 +VERTEX2 9878 -107.864 -11.9194 -2.07816 +VERTEX2 9879 -108.338 -12.8386 -2.09721 +VERTEX2 9880 -108.906 -13.7851 -2.05364 +VERTEX2 9881 -109.833 -13.2854 2.63036 +VERTEX2 9882 -110.627 -12.857 2.67907 +VERTEX2 9883 -111.499 -12.4176 2.6469 +VERTEX2 9884 -112.384 -11.9465 2.65263 +VERTEX2 9885 -113.291 -11.4366 2.63514 +VERTEX2 9886 -113.71 -12.3272 -2.07991 +VERTEX2 9887 -114.178 -13.184 -2.06835 +VERTEX2 9888 -114.749 -14.0485 -2.04521 +VERTEX2 9889 -115.22 -14.8576 -2.04545 +VERTEX2 9890 -115.697 -15.7259 -2.0215 +VERTEX2 9891 -116.534 -15.2802 2.69909 +VERTEX2 9892 -117.387 -14.8026 2.71265 +VERTEX2 9893 -118.272 -14.4015 2.66865 +VERTEX2 9894 -119.234 -13.9692 2.62826 +VERTEX2 9895 -120.174 -13.4036 2.61861 +VERTEX2 9896 -120.633 -14.2198 -2.10738 +VERTEX2 9897 -121.123 -15.1745 -2.12083 +VERTEX2 9898 -121.743 -16.0618 -2.11786 +VERTEX2 9899 -122.249 -16.9518 -2.13819 +VERTEX2 9900 -122.844 -17.7822 -2.11904 +VERTEX2 9901 -122.039 -18.3767 -0.563011 +VERTEX2 9902 -121.205 -18.9165 -0.580563 +VERTEX2 9903 -120.376 -19.4427 -0.582493 +VERTEX2 9904 -119.549 -20.0472 -0.576526 +VERTEX2 9905 -118.697 -20.5564 -0.593904 +VERTEX2 9906 -118.07 -19.756 0.996773 +VERTEX2 9907 -117.543 -18.8783 0.993455 +VERTEX2 9908 -117.002 -18.0861 0.976775 +VERTEX2 9909 -116.44 -17.2417 0.975208 +VERTEX2 9910 -115.847 -16.3862 1.00672 +VERTEX2 9911 -116.773 -15.8736 2.6092 +VERTEX2 9912 -117.623 -15.3695 2.6338 +VERTEX2 9913 -118.376 -14.8312 2.60374 +VERTEX2 9914 -119.192 -14.2517 2.60757 +VERTEX2 9915 -119.977 -13.7437 2.60683 +VERTEX2 9916 -119.459 -12.9072 1.02562 +VERTEX2 9917 -118.924 -12.0078 1.03625 +VERTEX2 9918 -118.442 -11.1409 1.04472 +VERTEX2 9919 -117.942 -10.2114 1.00869 +VERTEX2 9920 -117.423 -9.28902 1.05695 +VERTEX2 9921 -118.224 -8.69913 2.64704 +VERTEX2 9922 -119.118 -8.22835 2.63877 +VERTEX2 9923 -120.023 -7.69814 2.64821 +VERTEX2 9924 -121.005 -7.23081 2.65649 +VERTEX2 9925 -121.917 -6.74438 2.68871 +VERTEX2 9926 -121.485 -5.76996 1.13221 +VERTEX2 9927 -121.063 -4.8439 1.14157 +VERTEX2 9928 -120.646 -4.01191 1.12897 +VERTEX2 9929 -120.191 -3.09373 1.15789 +VERTEX2 9930 -119.883 -2.09537 1.16123 +VERTEX2 9931 -118.978 -2.5337 -0.410907 +VERTEX2 9932 -118.065 -2.89183 -0.41776 +VERTEX2 9933 -117.114 -3.19784 -0.431993 +VERTEX2 9934 -116.213 -3.68608 -0.427199 +VERTEX2 9935 -115.337 -4.13683 -0.415923 +VERTEX2 9936 -114.936 -3.24999 1.1557 +VERTEX2 9937 -114.545 -2.36608 1.16673 +VERTEX2 9938 -114.149 -1.47994 1.14636 +VERTEX2 9939 -113.815 -0.517612 1.11143 +VERTEX2 9940 -113.328 0.399331 1.10847 +VERTEX2 9941 -114.246 0.848741 2.68025 +VERTEX2 9942 -115.213 1.26668 2.7165 +VERTEX2 9943 -116.142 1.63806 2.70825 +VERTEX2 9944 -116.991 2.04597 2.69658 +VERTEX2 9945 -117.906 2.50108 2.72286 +VERTEX2 9946 -118.361 1.50093 -1.99167 +VERTEX2 9947 -118.799 0.467395 -2.01856 +VERTEX2 9948 -119.208 -0.363331 -2.01314 +VERTEX2 9949 -119.626 -1.27171 -2.0389 +VERTEX2 9950 -120.113 -2.24123 -2.05252 +VERTEX2 9951 -119.23 -2.70465 -0.481905 +VERTEX2 9952 -118.44 -3.20417 -0.497544 +VERTEX2 9953 -117.661 -3.71983 -0.519583 +VERTEX2 9954 -116.766 -4.19731 -0.519563 +VERTEX2 9955 -115.869 -4.65086 -0.529339 +VERTEX2 9956 -115.289 -3.77101 1.00828 +VERTEX2 9957 -114.803 -2.97706 0.995194 +VERTEX2 9958 -114.278 -2.13619 1.00679 +VERTEX2 9959 -113.754 -1.22926 0.978576 +VERTEX2 9960 -113.236 -0.480462 0.974536 +VERTEX2 9961 -114.13 0.0403742 2.51385 +VERTEX2 9962 -115.055 0.663267 2.49462 +VERTEX2 9963 -115.907 1.22613 2.49843 +VERTEX2 9964 -116.603 1.77325 2.51697 +VERTEX2 9965 -117.399 2.44093 2.51813 +VERTEX2 9966 -117.971 1.70098 -2.20697 +VERTEX2 9967 -118.525 0.826003 -2.21572 +VERTEX2 9968 -119.119 0.024998 -2.23607 +VERTEX2 9969 -119.724 -0.676423 -2.21458 +VERTEX2 9970 -120.299 -1.52814 -2.23129 +VERTEX2 9971 -119.479 -2.15754 -0.643099 +VERTEX2 9972 -118.58 -2.78546 -0.62909 +VERTEX2 9973 -117.728 -3.39823 -0.635238 +VERTEX2 9974 -116.999 -4.00366 -0.665793 +VERTEX2 9975 -116.242 -4.59085 -0.601455 +VERTEX2 9976 -115.573 -3.70784 0.983081 +VERTEX2 9977 -115.052 -2.92623 0.968719 +VERTEX2 9978 -114.566 -2.12187 0.991841 +VERTEX2 9979 -113.991 -1.31041 1.01622 +VERTEX2 9980 -113.44 -0.457234 1.03988 +VERTEX2 9981 -114.286 0.0671307 2.61418 +VERTEX2 9982 -115.205 0.554771 2.61969 +VERTEX2 9983 -116.027 1.08787 2.60848 +VERTEX2 9984 -116.831 1.67035 2.64272 +VERTEX2 9985 -117.738 2.10518 2.61843 +VERTEX2 9986 -118.203 1.25094 -2.09909 +VERTEX2 9987 -118.752 0.389027 -2.12476 +VERTEX2 9988 -119.294 -0.55898 -2.12047 +VERTEX2 9989 -119.812 -1.43536 -2.14774 +VERTEX2 9990 -120.388 -2.32302 -2.17611 +VERTEX2 9991 -119.576 -2.86576 -0.574045 +VERTEX2 9992 -118.74 -3.44061 -0.577672 +VERTEX2 9993 -117.874 -4.03335 -0.577067 +VERTEX2 9994 -116.984 -4.53922 -0.591014 +VERTEX2 9995 -116.144 -5.06775 -0.567995 +VERTEX2 9996 -116.715 -5.76917 -2.1293 +VERTEX2 9997 -117.27 -6.59472 -2.10929 +VERTEX2 9998 -117.826 -7.43123 -2.08772 +VERTEX2 9999 -118.333 -8.3691 -2.09906 +EDGE2 1 0 -0.99879 0.0417574 -0.00818381 1 0 1 1 0 0 +EDGE2 2 1 -1.00336 0.0235924 -0.0056968 1 0 1 1 0 0 +EDGE2 3 2 -0.972181 0.0502932 -0.0342992 1 0 1 1 0 0 +EDGE2 4 3 -1.03801 0.00907053 -0.0116629 1 0 1 1 0 0 +EDGE2 5 4 -0.993225 0.0522372 0.00915452 1 0 1 1 0 0 +EDGE2 6 5 -1.1127 0.00877534 -1.55251 1 0 1 1 0 0 +EDGE2 7 6 -1.02681 0.0465162 -0.0118557 1 0 1 1 0 0 +EDGE2 8 7 -0.917358 0.0291951 -0.0343225 1 0 1 1 0 0 +EDGE2 9 8 -1.05727 -0.00948761 -0.0459367 1 0 1 1 0 0 +EDGE2 10 9 -0.989284 0.0306925 -0.000322391 1 0 1 1 0 0 +EDGE2 11 10 -0.997544 0.0340262 -1.59025 1 0 1 1 0 0 +EDGE2 12 11 -0.900141 -0.0311005 0.0198686 1 0 1 1 0 0 +EDGE2 13 12 -0.934983 -0.0793681 -0.00127435 1 0 1 1 0 0 +EDGE2 14 13 -0.885324 -0.0619103 0.0131666 1 0 1 1 0 0 +EDGE2 15 14 -0.90106 -0.0376226 -0.0082473 1 0 1 1 0 0 +EDGE2 16 15 -0.992517 0.00499859 -1.61534 1 0 1 1 0 0 +EDGE2 17 16 -0.975795 0.00721342 -0.00783327 1 0 1 1 0 0 +EDGE2 18 17 -0.997573 0.0333984 0.0275033 1 0 1 1 0 0 +EDGE2 19 18 -1.01687 0.04722 -0.0197328 1 0 1 1 0 0 +EDGE2 19 0 0.973663 0.0205486 1.57776 1 0 1 1 0 0 +EDGE2 20 19 -1.02103 0.00401273 0.0118729 1 0 1 1 0 0 +EDGE2 20 1 0.050153 0.95087 1.5776 1 0 1 1 0 0 +EDGE2 20 0 0.0746671 0.0345259 1.54892 1 0 1 1 0 0 +EDGE2 21 2 1.04442 -0.0648639 0.0369546 1 0 1 1 0 0 +EDGE2 21 1 -0.060912 -0.0429049 0.0281134 1 0 1 1 0 0 +EDGE2 21 0 -1.03635 -0.0239619 0.0119243 1 0 1 1 0 0 +EDGE2 21 20 -0.993726 -0.0523398 -1.58635 1 0 1 1 0 0 +EDGE2 22 2 0.0369633 -0.0141374 0.0250929 1 0 1 1 0 0 +EDGE2 22 3 1.06863 0.0015984 0.00161736 1 0 1 1 0 0 +EDGE2 22 1 -0.998706 0.0305766 0.0318395 1 0 1 1 0 0 +EDGE2 22 21 -1.03575 -0.0195948 0.0195394 1 0 1 1 0 0 +EDGE2 23 4 1.02992 0.127035 -0.0346718 1 0 1 1 0 0 +EDGE2 23 2 -0.969735 -0.0376916 -0.00768099 1 0 1 1 0 0 +EDGE2 23 3 -0.0191715 -0.0462526 0.0191143 1 0 1 1 0 0 +EDGE2 23 22 -0.923346 0.0731681 -0.0296362 1 0 1 1 0 0 +EDGE2 24 5 0.947991 -0.0175548 -0.0253511 1 0 1 1 0 0 +EDGE2 24 4 -0.0109939 0.0915607 -0.0086247 1 0 1 1 0 0 +EDGE2 24 3 -1.14502 0.0593321 -0.00746596 1 0 1 1 0 0 +EDGE2 24 23 -1.01657 -0.115682 0.0089996 1 0 1 1 0 0 +EDGE2 25 6 -0.0597013 1.02123 1.59642 1 0 1 1 0 0 +EDGE2 25 24 -1.09573 0.0614943 0.0261947 1 0 1 1 0 0 +EDGE2 25 5 -0.0734935 -0.0017356 -0.00885563 1 0 1 1 0 0 +EDGE2 25 4 -1.00036 -0.0171662 0.0202356 1 0 1 1 0 0 +EDGE2 26 7 1.00531 0.00107148 0.0302732 1 0 1 1 0 0 +EDGE2 26 25 -0.979494 0.0230425 -1.59852 1 0 1 1 0 0 +EDGE2 26 6 -0.00315216 -0.0685196 0.0109497 1 0 1 1 0 0 +EDGE2 26 5 -0.972334 0.0191047 -1.57567 1 0 1 1 0 0 +EDGE2 27 8 0.898284 -0.0536875 0.0186598 1 0 1 1 0 0 +EDGE2 27 7 0.0724439 -0.00529359 -0.000353825 1 0 1 1 0 0 +EDGE2 27 6 -1.05569 0.0767555 -0.00615115 1 0 1 1 0 0 +EDGE2 27 26 -0.967053 0.019671 0.00377432 1 0 1 1 0 0 +EDGE2 28 9 1.01666 -0.0683645 -0.023268 1 0 1 1 0 0 +EDGE2 28 27 -0.934108 -0.101065 0.00574705 1 0 1 1 0 0 +EDGE2 28 8 0.00153443 -0.0194617 0.00533619 1 0 1 1 0 0 +EDGE2 28 7 -1.0055 -0.0583432 -0.0150068 1 0 1 1 0 0 +EDGE2 29 10 1.08105 0.00811641 -0.0127997 1 0 1 1 0 0 +EDGE2 29 9 0.000458911 -0.119207 0.0094008 1 0 1 1 0 0 +EDGE2 29 8 -1.03153 0.0730486 -0.00615654 1 0 1 1 0 0 +EDGE2 29 28 -0.967347 0.0195529 -0.0185565 1 0 1 1 0 0 +EDGE2 30 10 -0.0111261 -0.0223523 -0.0275291 1 0 1 1 0 0 +EDGE2 30 11 0.0777909 0.988987 1.57983 1 0 1 1 0 0 +EDGE2 30 29 -1.04043 0.0504065 0.0370536 1 0 1 1 0 0 +EDGE2 30 9 -0.984437 -0.00337167 0.0067686 1 0 1 1 0 0 +EDGE2 31 10 -0.988697 0.0379451 -1.55557 1 0 1 1 0 0 +EDGE2 31 30 -1.00276 -0.102334 -1.55246 1 0 1 1 0 0 +EDGE2 31 11 -0.0363097 0.0438826 0.00956678 1 0 1 1 0 0 +EDGE2 31 12 1.07396 -0.0654312 -0.012633 1 0 1 1 0 0 +EDGE2 32 31 -1.07853 -0.0168996 0.00213085 1 0 1 1 0 0 +EDGE2 32 11 -1.01502 -0.0432938 -0.0288545 1 0 1 1 0 0 +EDGE2 32 12 -0.00161924 -0.0369144 0.0119887 1 0 1 1 0 0 +EDGE2 32 13 1.04694 0.02334 -0.0125276 1 0 1 1 0 0 +EDGE2 33 32 -1.04882 -0.0552537 0.046005 1 0 1 1 0 0 +EDGE2 33 12 -1.04043 -0.0558011 -0.0162327 1 0 1 1 0 0 +EDGE2 33 13 0.0562588 0.104327 0.00415458 1 0 1 1 0 0 +EDGE2 33 14 0.977863 0.0186884 0.0127758 1 0 1 1 0 0 +EDGE2 34 33 -0.994151 0.0271125 -0.0029927 1 0 1 1 0 0 +EDGE2 34 13 -0.992533 0.0446083 0.0139962 1 0 1 1 0 0 +EDGE2 34 14 0.0338907 0.00424032 0.0260941 1 0 1 1 0 0 +EDGE2 34 15 0.967129 -0.0598619 -0.0205361 1 0 1 1 0 0 +EDGE2 35 14 -0.992147 -0.0193694 -0.0208901 1 0 1 1 0 0 +EDGE2 35 34 -0.977902 0.0673003 0.0245254 1 0 1 1 0 0 +EDGE2 35 15 0.0688948 0.0729152 -0.0423015 1 0 1 1 0 0 +EDGE2 35 16 -0.0108759 0.943493 1.58518 1 0 1 1 0 0 +EDGE2 36 35 -0.974289 -0.034236 -1.59368 1 0 1 1 0 0 +EDGE2 36 15 -1.00822 0.00249408 -1.57297 1 0 1 1 0 0 +EDGE2 36 16 -0.00217215 0.103762 -0.003117 1 0 1 1 0 0 +EDGE2 36 17 1.0238 -0.0222964 0.0129001 1 0 1 1 0 0 +EDGE2 37 36 -1.01533 -0.00862644 -0.0058424 1 0 1 1 0 0 +EDGE2 37 16 -1.01359 -0.0613493 -0.0122542 1 0 1 1 0 0 +EDGE2 37 18 1.03711 0.0426359 0.00482447 1 0 1 1 0 0 +EDGE2 37 17 -0.0242366 0.0142009 -0.00533508 1 0 1 1 0 0 +EDGE2 38 18 0.0345562 0.021662 -0.0131412 1 0 1 1 0 0 +EDGE2 38 37 -0.981448 0.0523343 -0.0417572 1 0 1 1 0 0 +EDGE2 38 17 -0.961596 0.00213889 -0.00047585 1 0 1 1 0 0 +EDGE2 38 19 1.0594 -0.0430789 0.0123265 1 0 1 1 0 0 +EDGE2 39 38 -1.04804 -0.036889 -0.0235853 1 0 1 1 0 0 +EDGE2 39 18 -1.03632 -0.0536162 0.048128 1 0 1 1 0 0 +EDGE2 39 19 0.0361672 -0.0534412 -0.00346497 1 0 1 1 0 0 +EDGE2 39 0 1.00175 0.0276332 1.57543 1 0 1 1 0 0 +EDGE2 39 20 0.964769 0.103526 -0.00735911 1 0 1 1 0 0 +EDGE2 40 39 -1.03933 0.097229 0.0136057 1 0 1 1 0 0 +EDGE2 40 19 -1.02893 -0.0692033 0.00855088 1 0 1 1 0 0 +EDGE2 40 1 0.0574661 1.07674 1.54189 1 0 1 1 0 0 +EDGE2 40 21 0.0696538 0.998274 1.58379 1 0 1 1 0 0 +EDGE2 40 0 -0.03593 0.00262297 1.5732 1 0 1 1 0 0 +EDGE2 40 20 0.0769078 -0.0463276 -0.0240456 1 0 1 1 0 0 +EDGE2 41 40 -1.07316 0.00254372 -1.56145 1 0 1 1 0 0 +EDGE2 41 2 0.97152 -0.00150084 -0.0165972 1 0 1 1 0 0 +EDGE2 41 22 0.93936 -0.00378253 0.0077679 1 0 1 1 0 0 +EDGE2 41 1 0.0512203 -0.0531063 -0.0128993 1 0 1 1 0 0 +EDGE2 41 21 0.0969106 -0.00304953 -0.00537574 1 0 1 1 0 0 +EDGE2 41 0 -1.0034 -0.025292 -0.00388085 1 0 1 1 0 0 +EDGE2 41 20 -1.05749 0.0115896 -1.58133 1 0 1 1 0 0 +EDGE2 42 2 0.0235949 0.00811449 -0.00358233 1 0 1 1 0 0 +EDGE2 42 3 0.991071 -0.0286072 0.0236739 1 0 1 1 0 0 +EDGE2 42 23 1.05311 0.0104005 -0.00518416 1 0 1 1 0 0 +EDGE2 42 22 -0.0455836 0.0249413 -0.011739 1 0 1 1 0 0 +EDGE2 42 1 -1.01015 -0.014061 -0.0169645 1 0 1 1 0 0 +EDGE2 42 21 -0.892462 -0.0125915 0.0271967 1 0 1 1 0 0 +EDGE2 42 41 -1.03813 0.0163744 0.00425822 1 0 1 1 0 0 +EDGE2 43 24 0.932658 0.079441 0.00305436 1 0 1 1 0 0 +EDGE2 43 4 1.04656 0.04523 -0.0109827 1 0 1 1 0 0 +EDGE2 43 2 -1.01747 0.0488344 -0.00688551 1 0 1 1 0 0 +EDGE2 43 42 -0.988066 -0.0104386 0.0502105 1 0 1 1 0 0 +EDGE2 43 3 -0.0201045 -0.059931 0.0208538 1 0 1 1 0 0 +EDGE2 43 23 0.0121089 0.0411716 0.0274525 1 0 1 1 0 0 +EDGE2 43 22 -1.06541 0.00647669 -0.0152333 1 0 1 1 0 0 +EDGE2 44 43 -1.06111 -0.0138941 -0.0151349 1 0 1 1 0 0 +EDGE2 44 25 0.907841 -0.0585735 -0.0156694 1 0 1 1 0 0 +EDGE2 44 24 0.080514 0.0102301 -0.000739134 1 0 1 1 0 0 +EDGE2 44 5 0.994756 0.106482 -0.0329364 1 0 1 1 0 0 +EDGE2 44 4 0.0336562 0.0350477 -0.0134209 1 0 1 1 0 0 +EDGE2 44 3 -0.977117 0.0175205 0.0431175 1 0 1 1 0 0 +EDGE2 44 23 -0.995286 0.0403712 0.0311094 1 0 1 1 0 0 +EDGE2 45 25 0.086721 0.0210672 -0.01128 1 0 1 1 0 0 +EDGE2 45 6 -0.00964881 0.917532 1.58991 1 0 1 1 0 0 +EDGE2 45 26 -0.107945 1.00294 1.60674 1 0 1 1 0 0 +EDGE2 45 24 -1.06401 0.0985536 0.00301256 1 0 1 1 0 0 +EDGE2 45 44 -1.11052 0.0279259 0.0194036 1 0 1 1 0 0 +EDGE2 45 5 0.00693003 -0.107152 0.0347982 1 0 1 1 0 0 +EDGE2 45 4 -0.975055 0.00541385 0.00019082 1 0 1 1 0 0 +EDGE2 46 27 0.957182 -0.0308347 0.0232143 1 0 1 1 0 0 +EDGE2 46 7 1.08788 0.0127277 -0.00918705 1 0 1 1 0 0 +EDGE2 46 25 -1.07359 0.0262712 -1.59817 1 0 1 1 0 0 +EDGE2 46 6 0.0251908 0.0703469 -0.0114448 1 0 1 1 0 0 +EDGE2 46 26 -0.0555992 -0.0169743 -0.0141156 1 0 1 1 0 0 +EDGE2 46 45 -1.06391 0.0367663 -1.53 1 0 1 1 0 0 +EDGE2 46 5 -0.997558 0.013946 -1.56515 1 0 1 1 0 0 +EDGE2 47 27 -0.00659155 0.0206818 0.0308512 1 0 1 1 0 0 +EDGE2 47 8 0.932297 0.0905773 0.0189001 1 0 1 1 0 0 +EDGE2 47 28 1.01628 -0.0421346 0.06175 1 0 1 1 0 0 +EDGE2 47 7 -0.0838918 0.100573 -0.00623043 1 0 1 1 0 0 +EDGE2 47 6 -1.09254 -3.79076e-05 0.00973934 1 0 1 1 0 0 +EDGE2 47 26 -0.969367 0.0109812 0.0193835 1 0 1 1 0 0 +EDGE2 47 46 -0.968302 -0.0552186 0.0358645 1 0 1 1 0 0 +EDGE2 48 29 1.07313 -0.148712 0.00196928 1 0 1 1 0 0 +EDGE2 48 9 1.0849 0.0223434 0.00590472 1 0 1 1 0 0 +EDGE2 48 27 -0.914726 -0.0647734 -0.0173613 1 0 1 1 0 0 +EDGE2 48 8 0.0426816 -0.042649 -0.0177828 1 0 1 1 0 0 +EDGE2 48 28 0.0379321 -0.0109102 -0.0102417 1 0 1 1 0 0 +EDGE2 48 47 -1.06887 -0.0121303 -0.0489097 1 0 1 1 0 0 +EDGE2 48 7 -0.965107 -0.034685 -0.000290141 1 0 1 1 0 0 +EDGE2 49 10 1.12226 -0.0111233 -0.007791 1 0 1 1 0 0 +EDGE2 49 30 0.989907 -0.0123868 0.019701 1 0 1 1 0 0 +EDGE2 49 29 -0.0472499 0.0649252 -0.0229459 1 0 1 1 0 0 +EDGE2 49 9 -0.0543329 0.00135195 0.015534 1 0 1 1 0 0 +EDGE2 49 8 -0.989154 0.0177114 -0.00459804 1 0 1 1 0 0 +EDGE2 49 28 -0.904061 0.0569324 0.0300751 1 0 1 1 0 0 +EDGE2 49 48 -0.973676 0.051129 -0.0317589 1 0 1 1 0 0 +EDGE2 50 31 0.0033669 0.916796 1.58905 1 0 1 1 0 0 +EDGE2 50 10 -0.0446702 0.0139044 -0.0111686 1 0 1 1 0 0 +EDGE2 50 30 0.000176756 0.0422134 0.00416723 1 0 1 1 0 0 +EDGE2 50 11 0.0535292 0.975834 1.58092 1 0 1 1 0 0 +EDGE2 50 29 -0.944412 -0.113794 -0.0170506 1 0 1 1 0 0 +EDGE2 50 49 -1.02827 0.0163842 -0.0269791 1 0 1 1 0 0 +EDGE2 50 9 -0.979417 -0.0710258 -0.00133216 1 0 1 1 0 0 +EDGE2 51 31 -0.0518575 0.0249306 -0.00251684 1 0 1 1 0 0 +EDGE2 51 10 -1.07854 0.0248414 -1.59534 1 0 1 1 0 0 +EDGE2 51 30 -1.03347 0.0253831 -1.58701 1 0 1 1 0 0 +EDGE2 51 50 -1.04958 0.0503268 -1.58131 1 0 1 1 0 0 +EDGE2 51 32 1.00485 0.0028486 0.0195914 1 0 1 1 0 0 +EDGE2 51 11 0.0349253 -0.0171134 0.00953402 1 0 1 1 0 0 +EDGE2 51 12 1.00549 0.0628512 -0.0162726 1 0 1 1 0 0 +EDGE2 52 31 -0.982801 -0.0303748 -0.00113303 1 0 1 1 0 0 +EDGE2 52 51 -0.953712 -0.0847509 0.00541592 1 0 1 1 0 0 +EDGE2 52 32 -0.0729728 -0.0432622 0.0151166 1 0 1 1 0 0 +EDGE2 52 11 -0.994905 -0.0296327 -0.0114404 1 0 1 1 0 0 +EDGE2 52 12 -0.108004 -0.0318606 0.0170936 1 0 1 1 0 0 +EDGE2 52 33 0.918793 0.0285272 0.00925295 1 0 1 1 0 0 +EDGE2 52 13 0.992951 0.0318294 -0.007191 1 0 1 1 0 0 +EDGE2 53 32 -0.986992 -0.0026008 0.00451185 1 0 1 1 0 0 +EDGE2 53 52 -0.960158 -0.0578602 0.0212446 1 0 1 1 0 0 +EDGE2 53 12 -0.938384 0.0130893 0.0177479 1 0 1 1 0 0 +EDGE2 53 33 -0.00487972 0.0802647 -0.0156472 1 0 1 1 0 0 +EDGE2 53 13 -0.0429264 -0.0121861 0.0191245 1 0 1 1 0 0 +EDGE2 53 14 0.972309 0.0374106 -0.0227226 1 0 1 1 0 0 +EDGE2 53 34 0.920651 -0.0381205 0.00156026 1 0 1 1 0 0 +EDGE2 54 35 1.02746 -0.0232173 -0.00733268 1 0 1 1 0 0 +EDGE2 54 53 -1.03388 0.0605877 -0.0242274 1 0 1 1 0 0 +EDGE2 54 33 -0.953977 -0.0238591 0.0112294 1 0 1 1 0 0 +EDGE2 54 13 -1.01876 0.000850867 0.023767 1 0 1 1 0 0 +EDGE2 54 14 0.0142706 0.0568535 0.0156199 1 0 1 1 0 0 +EDGE2 54 34 0.029565 0.110446 -0.0176974 1 0 1 1 0 0 +EDGE2 54 15 1.08373 0.101394 0.0117167 1 0 1 1 0 0 +EDGE2 55 35 -0.0483156 -0.0176008 0.0190501 1 0 1 1 0 0 +EDGE2 55 54 -1.05102 -0.0108082 -0.0129526 1 0 1 1 0 0 +EDGE2 55 14 -1.00768 0.0938761 0.0063347 1 0 1 1 0 0 +EDGE2 55 34 -1.01362 0.020014 -0.00713884 1 0 1 1 0 0 +EDGE2 55 15 0.0386252 0.0479351 -0.000568738 1 0 1 1 0 0 +EDGE2 55 36 -0.00378631 0.992718 1.59098 1 0 1 1 0 0 +EDGE2 55 16 0.0886423 1.02733 1.62359 1 0 1 1 0 0 +EDGE2 56 35 -0.974585 -0.0699549 -1.57271 1 0 1 1 0 0 +EDGE2 56 55 -1.05595 -0.00465349 -1.60392 1 0 1 1 0 0 +EDGE2 56 15 -0.928016 -0.00655726 -1.55364 1 0 1 1 0 0 +EDGE2 56 36 0.0437675 -0.00458342 -0.011688 1 0 1 1 0 0 +EDGE2 56 16 0.024268 -0.090309 -0.00528886 1 0 1 1 0 0 +EDGE2 56 37 0.949795 -0.0460936 0.0143859 1 0 1 1 0 0 +EDGE2 56 17 0.962006 0.0477689 -0.00212384 1 0 1 1 0 0 +EDGE2 57 36 -1.08411 0.0570905 -0.015367 1 0 1 1 0 0 +EDGE2 57 56 -0.983438 -0.000514897 -0.005883 1 0 1 1 0 0 +EDGE2 57 16 -0.973679 0.00432404 -0.00761843 1 0 1 1 0 0 +EDGE2 57 38 0.907871 -0.109092 -0.00238144 1 0 1 1 0 0 +EDGE2 57 18 1.00501 0.0775972 0.00722838 1 0 1 1 0 0 +EDGE2 57 37 0.00880416 -0.0508718 0.0130591 1 0 1 1 0 0 +EDGE2 57 17 0.000245102 0.0241579 0.0127276 1 0 1 1 0 0 +EDGE2 58 57 -0.991164 0.0516127 0.0222056 1 0 1 1 0 0 +EDGE2 58 38 -0.0687829 0.0653377 -0.00943642 1 0 1 1 0 0 +EDGE2 58 18 -0.0626875 -0.108306 -0.00969368 1 0 1 1 0 0 +EDGE2 58 37 -0.941803 0.0279259 0.0445915 1 0 1 1 0 0 +EDGE2 58 17 -1.05002 -0.0131603 -0.0219704 1 0 1 1 0 0 +EDGE2 58 39 0.902028 -0.0456874 0.0293116 1 0 1 1 0 0 +EDGE2 58 19 1.05936 0.100124 -0.010211 1 0 1 1 0 0 +EDGE2 59 38 -1.02644 -0.0343746 0.00425898 1 0 1 1 0 0 +EDGE2 59 58 -0.850528 -0.00749867 0.0421351 1 0 1 1 0 0 +EDGE2 59 18 -0.885152 0.00873652 -0.00819438 1 0 1 1 0 0 +EDGE2 59 39 -0.0649969 -0.0533229 -0.0304834 1 0 1 1 0 0 +EDGE2 59 19 0.0817007 0.0632502 -0.00511583 1 0 1 1 0 0 +EDGE2 59 40 1.00694 -0.114722 0.0220379 1 0 1 1 0 0 +EDGE2 59 0 0.937874 0.0125331 1.55639 1 0 1 1 0 0 +EDGE2 59 20 0.983498 0.0680913 -0.0101281 1 0 1 1 0 0 +EDGE2 60 59 -1.0258 -0.02312 0.0206348 1 0 1 1 0 0 +EDGE2 60 39 -0.871643 -0.0291038 0.00245518 1 0 1 1 0 0 +EDGE2 60 19 -0.991389 -0.0174307 0.00265999 1 0 1 1 0 0 +EDGE2 60 40 -0.0639512 0.0351714 0.00972188 1 0 1 1 0 0 +EDGE2 60 1 0.0945945 0.903081 1.5947 1 0 1 1 0 0 +EDGE2 60 21 -0.0395067 0.984867 1.57746 1 0 1 1 0 0 +EDGE2 60 41 -0.0961783 1.01885 1.59479 1 0 1 1 0 0 +EDGE2 60 0 0.0351455 -0.0494314 1.58969 1 0 1 1 0 0 +EDGE2 60 20 -0.10896 0.00568799 -0.00742316 1 0 1 1 0 0 +EDGE2 61 40 -1.02371 -0.0384713 1.56846 1 0 1 1 0 0 +EDGE2 61 60 -1.00157 0.013005 1.56099 1 0 1 1 0 0 +EDGE2 61 0 -0.999539 -0.0815131 -3.11522 1 0 1 1 0 0 +EDGE2 61 20 -1.05417 -0.0432731 1.57241 1 0 1 1 0 0 +EDGE2 62 61 -1.06614 -0.0518437 0.0210032 1 0 1 1 0 0 +EDGE2 63 62 -1.00226 0.0602444 0.013051 1 0 1 1 0 0 +EDGE2 64 63 -1.04961 0.0446695 0.0205524 1 0 1 1 0 0 +EDGE2 65 64 -1.01538 -0.0917619 -0.00399046 1 0 1 1 0 0 +EDGE2 66 65 -1.06092 -0.0548153 1.59301 1 0 1 1 0 0 +EDGE2 67 66 -1.01683 -0.0120376 -0.0043823 1 0 1 1 0 0 +EDGE2 68 67 -1.00712 -0.0263215 -0.00660172 1 0 1 1 0 0 +EDGE2 69 68 -1.02908 0.012488 -0.0426752 1 0 1 1 0 0 +EDGE2 70 69 -0.933982 0.0175617 -0.00804355 1 0 1 1 0 0 +EDGE2 71 70 -0.951899 0.105287 -1.5595 1 0 1 1 0 0 +EDGE2 72 71 -0.990263 -0.0891221 -0.0303282 1 0 1 1 0 0 +EDGE2 73 72 -1.00818 0.0534858 0.0341473 1 0 1 1 0 0 +EDGE2 74 73 -0.927587 0.0355366 0.0278978 1 0 1 1 0 0 +EDGE2 75 74 -1.00835 0.0200616 -0.00325495 1 0 1 1 0 0 +EDGE2 76 75 -0.911527 -0.0580256 -1.56211 1 0 1 1 0 0 +EDGE2 77 76 -1.0866 -0.0563987 -0.0305906 1 0 1 1 0 0 +EDGE2 78 77 -1.02909 0.0703149 0.0223702 1 0 1 1 0 0 +EDGE2 79 78 -1.0709 0.00915469 0.0140786 1 0 1 1 0 0 +EDGE2 80 79 -1.02792 0.0686446 0.027726 1 0 1 1 0 0 +EDGE2 81 80 -0.959181 -0.0396398 -1.571 1 0 1 1 0 0 +EDGE2 82 81 -1.04191 0.0577756 0.00427146 1 0 1 1 0 0 +EDGE2 83 82 -0.936917 -0.0584888 0.00552186 1 0 1 1 0 0 +EDGE2 84 65 0.951358 0.0212743 -3.15858 1 0 1 1 0 0 +EDGE2 84 83 -1.01061 -0.0528576 -0.0203836 1 0 1 1 0 0 +EDGE2 85 65 0.124357 0.0505873 -3.15701 1 0 1 1 0 0 +EDGE2 85 66 -0.0270947 1.02244 1.57347 1 0 1 1 0 0 +EDGE2 85 64 1.02493 0.016563 -3.16695 1 0 1 1 0 0 +EDGE2 85 84 -0.987886 0.00451597 0.00269797 1 0 1 1 0 0 +EDGE2 86 65 -1.02735 -0.0704468 -1.56691 1 0 1 1 0 0 +EDGE2 86 85 -0.972762 -0.0528197 1.57225 1 0 1 1 0 0 +EDGE2 87 86 -0.91883 0.0375303 -0.0123346 1 0 1 1 0 0 +EDGE2 88 87 -1.08097 -0.104538 0.0061549 1 0 1 1 0 0 +EDGE2 89 88 -1.00986 -0.0113462 -0.00742318 1 0 1 1 0 0 +EDGE2 90 89 -1.03219 -0.0165154 -0.00181226 1 0 1 1 0 0 +EDGE2 91 90 -0.940739 0.0240986 -1.5619 1 0 1 1 0 0 +EDGE2 92 91 -1.15555 -0.0727788 -0.00855884 1 0 1 1 0 0 +EDGE2 93 92 -1.04254 0.083779 0.034681 1 0 1 1 0 0 +EDGE2 94 93 -1.07811 0.0709857 -0.00287562 1 0 1 1 0 0 +EDGE2 95 94 -0.916162 0.0464945 -0.0109007 1 0 1 1 0 0 +EDGE2 96 95 -0.983042 -0.10662 -1.57228 1 0 1 1 0 0 +EDGE2 97 96 -0.933411 0.024514 0.0124052 1 0 1 1 0 0 +EDGE2 98 97 -1.03384 0.0366015 -0.00108394 1 0 1 1 0 0 +EDGE2 99 40 0.949815 -0.0200951 -3.15597 1 0 1 1 0 0 +EDGE2 99 60 0.982217 0.038669 -3.1331 1 0 1 1 0 0 +EDGE2 99 0 1.14879 0.0129747 -1.57804 1 0 1 1 0 0 +EDGE2 99 20 1.00089 0.0504254 -3.15355 1 0 1 1 0 0 +EDGE2 99 98 -1.00067 -0.053216 -0.0254751 1 0 1 1 0 0 +EDGE2 100 59 1.08069 -0.0518308 -3.08916 1 0 1 1 0 0 +EDGE2 100 39 1.00289 0.0114224 -3.1693 1 0 1 1 0 0 +EDGE2 100 19 0.941169 0.00648842 -3.14301 1 0 1 1 0 0 +EDGE2 100 40 0.0434694 -0.0711626 -3.1681 1 0 1 1 0 0 +EDGE2 100 1 -0.0395844 -1.07477 -1.54184 1 0 1 1 0 0 +EDGE2 100 21 -0.0119089 -0.930649 -1.56973 1 0 1 1 0 0 +EDGE2 100 41 0.0252901 -1.08523 -1.60047 1 0 1 1 0 0 +EDGE2 100 60 0.0228941 0.0411609 -3.12517 1 0 1 1 0 0 +EDGE2 100 0 0.00043468 -0.0820808 -1.59425 1 0 1 1 0 0 +EDGE2 100 20 -0.0367136 0.0129785 -3.13676 1 0 1 1 0 0 +EDGE2 100 61 -0.00509627 0.949855 1.58568 1 0 1 1 0 0 +EDGE2 100 99 -1.04611 0.0261828 -0.0203352 1 0 1 1 0 0 +EDGE2 101 40 -0.936743 -0.0306572 1.5594 1 0 1 1 0 0 +EDGE2 101 60 -1.01889 0.0163602 1.56356 1 0 1 1 0 0 +EDGE2 101 0 -0.982408 -0.0108775 -3.13026 1 0 1 1 0 0 +EDGE2 101 20 -0.964797 0.0791721 1.58449 1 0 1 1 0 0 +EDGE2 101 62 1.00931 0.0661434 0.000850871 1 0 1 1 0 0 +EDGE2 101 61 0.0383635 0.00863977 -0.00410465 1 0 1 1 0 0 +EDGE2 101 100 -0.951439 0.061399 -1.56335 1 0 1 1 0 0 +EDGE2 102 63 1.06284 -0.0161768 0.0123056 1 0 1 1 0 0 +EDGE2 102 62 -0.0464663 -0.000333223 -0.00933395 1 0 1 1 0 0 +EDGE2 102 61 -1.00955 0.0454655 -0.015992 1 0 1 1 0 0 +EDGE2 102 101 -1.00596 -0.069805 0.0285064 1 0 1 1 0 0 +EDGE2 103 63 -0.0052412 0.0221839 -0.00956066 1 0 1 1 0 0 +EDGE2 103 62 -1.07058 -0.0249889 -0.00156066 1 0 1 1 0 0 +EDGE2 103 64 0.979706 0.00875307 0.00622216 1 0 1 1 0 0 +EDGE2 103 102 -0.931748 0.0291063 -0.00791128 1 0 1 1 0 0 +EDGE2 104 65 1.02059 -0.014294 -0.00507548 1 0 1 1 0 0 +EDGE2 104 63 -0.995401 -0.0265148 0.00999989 1 0 1 1 0 0 +EDGE2 104 64 -0.069825 -0.0781554 -0.0124915 1 0 1 1 0 0 +EDGE2 104 103 -0.94416 0.0173656 -0.00580989 1 0 1 1 0 0 +EDGE2 104 85 0.995603 0.0718037 -3.14198 1 0 1 1 0 0 +EDGE2 105 65 0.0543914 -0.0332879 0.0129441 1 0 1 1 0 0 +EDGE2 105 66 0.0519486 -0.994342 -1.55742 1 0 1 1 0 0 +EDGE2 105 64 -0.943196 -0.0362649 -0.00409268 1 0 1 1 0 0 +EDGE2 105 86 0.0894104 1.00641 1.56174 1 0 1 1 0 0 +EDGE2 105 85 -0.0233592 -0.0525133 -3.11994 1 0 1 1 0 0 +EDGE2 105 104 -1.02195 -0.0283723 0.00407205 1 0 1 1 0 0 +EDGE2 105 84 0.94002 0.0110819 -3.14322 1 0 1 1 0 0 +EDGE2 106 67 1.02553 -0.0151586 -0.0265549 1 0 1 1 0 0 +EDGE2 106 65 -0.928377 0.0149873 1.5799 1 0 1 1 0 0 +EDGE2 106 66 -0.0565539 0.000293982 -0.0109146 1 0 1 1 0 0 +EDGE2 106 85 -1.02622 0.0155542 -1.55916 1 0 1 1 0 0 +EDGE2 106 105 -1.0249 0.0694939 1.58011 1 0 1 1 0 0 +EDGE2 107 68 0.980127 -0.0152544 0.00440178 1 0 1 1 0 0 +EDGE2 107 67 0.00900461 -0.0355515 0.0073384 1 0 1 1 0 0 +EDGE2 107 66 -1.01824 -0.0416522 0.0109807 1 0 1 1 0 0 +EDGE2 107 106 -0.990058 0.00886643 0.0113334 1 0 1 1 0 0 +EDGE2 108 69 1.02795 0.0133817 -0.0131252 1 0 1 1 0 0 +EDGE2 108 68 0.0724491 0.0505481 0.0187089 1 0 1 1 0 0 +EDGE2 108 67 -1.04492 0.00833801 -0.0148086 1 0 1 1 0 0 +EDGE2 108 107 -1.00102 -0.069685 -0.00961719 1 0 1 1 0 0 +EDGE2 109 69 -0.0591468 -0.10349 -0.0178891 1 0 1 1 0 0 +EDGE2 109 70 1.04036 -0.0171813 0.00730525 1 0 1 1 0 0 +EDGE2 109 68 -1.0184 -0.0795368 -0.0041462 1 0 1 1 0 0 +EDGE2 109 108 -0.986294 -0.051136 0.00788157 1 0 1 1 0 0 +EDGE2 110 69 -1.03047 -0.0100597 -0.000634834 1 0 1 1 0 0 +EDGE2 110 71 -0.00481601 1.00192 1.55541 1 0 1 1 0 0 +EDGE2 110 70 -0.0261569 0.0127655 0.0154567 1 0 1 1 0 0 +EDGE2 110 109 -1.00699 0.0570053 -0.00434957 1 0 1 1 0 0 +EDGE2 111 71 -0.0205872 0.0147246 0.0175177 1 0 1 1 0 0 +EDGE2 111 110 -0.994884 -0.00691826 -1.60454 1 0 1 1 0 0 +EDGE2 111 70 -0.898778 0.0227439 -1.61915 1 0 1 1 0 0 +EDGE2 111 72 1.03192 0.0718435 0.0321249 1 0 1 1 0 0 +EDGE2 112 71 -1.10392 -0.0904298 0.000977932 1 0 1 1 0 0 +EDGE2 112 111 -1.06299 0.0133559 0.0132728 1 0 1 1 0 0 +EDGE2 112 73 1.02496 0.0349469 -0.00961043 1 0 1 1 0 0 +EDGE2 112 72 -0.00646788 0.0348682 0.0201003 1 0 1 1 0 0 +EDGE2 113 74 0.97682 0.0163576 0.00987597 1 0 1 1 0 0 +EDGE2 113 73 0.0255101 -0.000958362 0.0341606 1 0 1 1 0 0 +EDGE2 113 72 -0.98796 -0.0937562 0.00616208 1 0 1 1 0 0 +EDGE2 113 112 -0.96479 -0.0765335 -0.0142661 1 0 1 1 0 0 +EDGE2 114 74 0.0241845 -0.0590674 -0.0483164 1 0 1 1 0 0 +EDGE2 114 73 -1.06184 -0.0240754 -0.0248072 1 0 1 1 0 0 +EDGE2 114 75 0.94812 0.012904 -0.0146337 1 0 1 1 0 0 +EDGE2 114 113 -1.05439 -0.0236046 0.0356974 1 0 1 1 0 0 +EDGE2 115 74 -1.02348 0.0153997 0.000778446 1 0 1 1 0 0 +EDGE2 115 75 0.0673953 0.0161745 -0.0209363 1 0 1 1 0 0 +EDGE2 115 114 -1.05982 -0.00631774 -0.00393088 1 0 1 1 0 0 +EDGE2 115 76 -0.0251311 1.00852 1.57845 1 0 1 1 0 0 +EDGE2 116 75 -0.911709 0.0668855 1.59908 1 0 1 1 0 0 +EDGE2 116 115 -1.06028 0.0413526 1.55704 1 0 1 1 0 0 +EDGE2 117 116 -1.04836 0.0137675 -0.00743944 1 0 1 1 0 0 +EDGE2 118 117 -0.95632 -0.130118 0.0164283 1 0 1 1 0 0 +EDGE2 119 118 -0.982604 -0.052321 -0.0116922 1 0 1 1 0 0 +EDGE2 120 119 -0.97268 0.0698862 -0.0119169 1 0 1 1 0 0 +EDGE2 121 120 -1.05245 0.0410851 -1.59706 1 0 1 1 0 0 +EDGE2 122 121 -1.07422 -0.0155499 -0.0520292 1 0 1 1 0 0 +EDGE2 123 122 -1.01002 -0.0231877 0.0130629 1 0 1 1 0 0 +EDGE2 124 123 -0.970452 -0.0955207 -0.0114429 1 0 1 1 0 0 +EDGE2 125 124 -1.04915 0.0492259 0.012681 1 0 1 1 0 0 +EDGE2 126 125 -0.987687 0.08958 1.55662 1 0 1 1 0 0 +EDGE2 127 126 -1.03036 0.059023 0.0151419 1 0 1 1 0 0 +EDGE2 128 127 -1.11517 -0.0334584 -0.0248465 1 0 1 1 0 0 +EDGE2 129 128 -1.03712 0.0163988 -0.0160573 1 0 1 1 0 0 +EDGE2 130 129 -1.0124 -0.0136151 -0.0132044 1 0 1 1 0 0 +EDGE2 131 130 -0.995958 -0.0761961 -1.57788 1 0 1 1 0 0 +EDGE2 132 131 -1.02023 -0.0142924 0.00810813 1 0 1 1 0 0 +EDGE2 133 132 -0.994567 0.0646623 0.0329302 1 0 1 1 0 0 +EDGE2 134 133 -0.919542 0.0383419 -0.0178644 1 0 1 1 0 0 +EDGE2 135 134 -0.994196 -0.0395168 -0.0249434 1 0 1 1 0 0 +EDGE2 136 135 -0.989945 -0.0154472 1.55901 1 0 1 1 0 0 +EDGE2 137 136 -1.03119 -0.0579728 0.0218175 1 0 1 1 0 0 +EDGE2 138 137 -0.995916 -0.00149311 -0.0269163 1 0 1 1 0 0 +EDGE2 139 138 -0.963011 0.0620535 0.0222719 1 0 1 1 0 0 +EDGE2 140 139 -1.06907 -0.108741 0.0103155 1 0 1 1 0 0 +EDGE2 141 140 -1.05765 0.02653 -1.61527 1 0 1 1 0 0 +EDGE2 142 141 -1.02827 0.0417719 -0.0173821 1 0 1 1 0 0 +EDGE2 143 142 -0.991576 -0.0598364 0.009055 1 0 1 1 0 0 +EDGE2 144 143 -0.975219 -0.0325853 -0.00870101 1 0 1 1 0 0 +EDGE2 145 144 -0.933869 -0.0438419 0.0170074 1 0 1 1 0 0 +EDGE2 146 145 -0.907595 -0.0103871 -1.54872 1 0 1 1 0 0 +EDGE2 147 146 -0.984972 -0.0543603 -0.0412944 1 0 1 1 0 0 +EDGE2 148 147 -1.03655 -0.00443375 0.00698945 1 0 1 1 0 0 +EDGE2 149 148 -0.980461 0.00985135 -0.023863 1 0 1 1 0 0 +EDGE2 150 149 -0.963237 0.0537277 -0.00768305 1 0 1 1 0 0 +EDGE2 151 150 -1.03792 -0.0713551 1.58335 1 0 1 1 0 0 +EDGE2 152 151 -0.98401 0.0393048 0.0140481 1 0 1 1 0 0 +EDGE2 153 152 -1.05464 0.0166463 0.0065766 1 0 1 1 0 0 +EDGE2 154 153 -0.921597 -0.0026144 -0.0273713 1 0 1 1 0 0 +EDGE2 155 154 -1.08959 0.00678529 0.00215644 1 0 1 1 0 0 +EDGE2 156 155 -0.982119 -0.0413002 1.58927 1 0 1 1 0 0 +EDGE2 157 156 -0.968007 0.0505392 0.0256908 1 0 1 1 0 0 +EDGE2 158 157 -1.00428 0.0217146 -0.0285127 1 0 1 1 0 0 +EDGE2 159 158 -0.907848 -0.0575078 -0.00431097 1 0 1 1 0 0 +EDGE2 160 159 -1.13983 0.00744323 0.0536954 1 0 1 1 0 0 +EDGE2 161 160 -0.931787 0.00862255 -1.58192 1 0 1 1 0 0 +EDGE2 162 161 -1.07203 0.0636929 -0.00225791 1 0 1 1 0 0 +EDGE2 163 162 -1.09178 0.00106748 0.0200127 1 0 1 1 0 0 +EDGE2 164 163 -0.920722 0.00053977 -0.0204136 1 0 1 1 0 0 +EDGE2 165 164 -0.990861 0.0360437 -0.00630758 1 0 1 1 0 0 +EDGE2 166 165 -1.05273 0.0432619 1.60489 1 0 1 1 0 0 +EDGE2 167 166 -0.998162 -0.0314142 0.0100183 1 0 1 1 0 0 +EDGE2 168 167 -1.01873 -0.0616856 0.0247476 1 0 1 1 0 0 +EDGE2 169 168 -0.959539 0.0464371 0.010262 1 0 1 1 0 0 +EDGE2 170 169 -0.933987 0.00235417 -0.0206218 1 0 1 1 0 0 +EDGE2 171 170 -1.04668 -0.00238392 1.55744 1 0 1 1 0 0 +EDGE2 172 171 -1.03956 -0.0382585 -0.0235603 1 0 1 1 0 0 +EDGE2 173 172 -0.943841 0.0473052 0.00626678 1 0 1 1 0 0 +EDGE2 174 173 -1.05422 -0.060546 -0.0109376 1 0 1 1 0 0 +EDGE2 175 174 -1.02763 0.0801065 -0.0409022 1 0 1 1 0 0 +EDGE2 176 175 -1.04252 -0.067188 -1.57359 1 0 1 1 0 0 +EDGE2 177 176 -1.01383 0.0558712 -0.025645 1 0 1 1 0 0 +EDGE2 178 177 -1.05076 0.050172 -0.0205854 1 0 1 1 0 0 +EDGE2 179 178 -1.05678 0.0158702 0.043573 1 0 1 1 0 0 +EDGE2 180 179 -1.00334 0.0586563 0.0184129 1 0 1 1 0 0 +EDGE2 181 180 -1.04878 -0.09556 -1.59051 1 0 1 1 0 0 +EDGE2 182 181 -0.980983 -0.00188589 -0.0109944 1 0 1 1 0 0 +EDGE2 183 182 -0.942531 0.0575713 0.0115697 1 0 1 1 0 0 +EDGE2 184 183 -0.974943 -0.00890103 0.00502544 1 0 1 1 0 0 +EDGE2 185 184 -0.968407 -0.0650878 -0.0143496 1 0 1 1 0 0 +EDGE2 186 185 -1.04111 0.0943249 -1.56153 1 0 1 1 0 0 +EDGE2 187 186 -0.98931 0.00213439 0.0170415 1 0 1 1 0 0 +EDGE2 188 187 -1.0663 0.0157609 0.00678287 1 0 1 1 0 0 +EDGE2 189 188 -0.997789 -0.0497433 0.000977651 1 0 1 1 0 0 +EDGE2 189 170 1.03535 -0.0404705 -3.16051 1 0 1 1 0 0 +EDGE2 190 171 -0.0062713 1.00493 1.57318 1 0 1 1 0 0 +EDGE2 190 189 -1.03106 -0.0673417 0.00834556 1 0 1 1 0 0 +EDGE2 190 170 0.0386733 -0.0021765 -3.14408 1 0 1 1 0 0 +EDGE2 190 169 0.982889 -0.00536033 -3.14445 1 0 1 1 0 0 +EDGE2 191 171 -0.066673 0.0328661 0.00676244 1 0 1 1 0 0 +EDGE2 191 172 1.0198 -0.000573872 -0.0219424 1 0 1 1 0 0 +EDGE2 191 170 -0.962367 -0.0306386 1.5716 1 0 1 1 0 0 +EDGE2 191 190 -0.940714 0.0456371 -1.56356 1 0 1 1 0 0 +EDGE2 192 171 -1.0273 -0.0316163 0.00859611 1 0 1 1 0 0 +EDGE2 192 173 1.10096 -0.0147177 -0.00971001 1 0 1 1 0 0 +EDGE2 192 172 -0.0536856 -0.0705937 -0.00350799 1 0 1 1 0 0 +EDGE2 192 191 -1.02697 0.0214852 0.0120515 1 0 1 1 0 0 +EDGE2 193 173 0.0372571 0.0153201 -0.0208635 1 0 1 1 0 0 +EDGE2 193 174 1.01233 0.0223852 -0.00101308 1 0 1 1 0 0 +EDGE2 193 172 -0.987408 0.0104096 0.0149688 1 0 1 1 0 0 +EDGE2 193 192 -0.979711 0.00830695 0.00164064 1 0 1 1 0 0 +EDGE2 194 175 1.01286 0.0321114 0.00475335 1 0 1 1 0 0 +EDGE2 194 173 -1.05398 -0.0326516 0.0311913 1 0 1 1 0 0 +EDGE2 194 174 0.0474337 -0.088264 -0.00206216 1 0 1 1 0 0 +EDGE2 194 193 -1.0178 0.0683059 0.00761931 1 0 1 1 0 0 +EDGE2 195 176 -0.00568681 0.907567 1.572 1 0 1 1 0 0 +EDGE2 195 175 -0.0265028 -0.00612291 -0.0174273 1 0 1 1 0 0 +EDGE2 195 174 -0.985193 -0.0522823 0.0126794 1 0 1 1 0 0 +EDGE2 195 194 -1.00986 -0.0376365 0.0140058 1 0 1 1 0 0 +EDGE2 196 177 0.985217 -0.0670152 0.0260563 1 0 1 1 0 0 +EDGE2 196 176 0.0932871 0.0031972 -0.00508134 1 0 1 1 0 0 +EDGE2 196 175 -0.985945 -0.0325072 -1.57716 1 0 1 1 0 0 +EDGE2 196 195 -0.985636 -0.105162 -1.56769 1 0 1 1 0 0 +EDGE2 197 177 -0.0289772 -0.0501712 -0.0116356 1 0 1 1 0 0 +EDGE2 197 178 1.01479 0.0364353 -0.00160233 1 0 1 1 0 0 +EDGE2 197 196 -0.956498 -0.0113133 -0.00612639 1 0 1 1 0 0 +EDGE2 197 176 -1.02106 0.0402531 -0.012531 1 0 1 1 0 0 +EDGE2 198 179 0.975695 -0.0434756 0.0291572 1 0 1 1 0 0 +EDGE2 198 177 -0.95851 0.0351441 -0.0199634 1 0 1 1 0 0 +EDGE2 198 178 0.0147153 -0.0514171 -0.00117641 1 0 1 1 0 0 +EDGE2 198 197 -0.905375 0.0320393 0.00608291 1 0 1 1 0 0 +EDGE2 199 198 -1.02072 0.1152 -0.00268652 1 0 1 1 0 0 +EDGE2 199 180 1.00369 -0.0808598 0.0136348 1 0 1 1 0 0 +EDGE2 199 179 -0.00846365 -0.00203881 -0.0442484 1 0 1 1 0 0 +EDGE2 199 178 -1.00235 -0.0106746 -0.0502239 1 0 1 1 0 0 +EDGE2 200 181 0.0316305 1.03939 1.60591 1 0 1 1 0 0 +EDGE2 200 180 -0.112838 0.0723116 0.0301603 1 0 1 1 0 0 +EDGE2 200 199 -1.00464 0.0533918 -0.00229157 1 0 1 1 0 0 +EDGE2 200 179 -0.990547 0.0124142 0.00377485 1 0 1 1 0 0 +EDGE2 201 181 -0.0631899 0.0626786 -0.00344802 1 0 1 1 0 0 +EDGE2 201 180 -0.928777 0.0229898 -1.54095 1 0 1 1 0 0 +EDGE2 201 200 -0.935974 0.0434445 -1.56446 1 0 1 1 0 0 +EDGE2 201 182 1.02305 0.0620905 -0.00947462 1 0 1 1 0 0 +EDGE2 202 181 -0.98559 -0.0678782 -0.00987621 1 0 1 1 0 0 +EDGE2 202 201 -0.978584 -0.000260867 -0.00880832 1 0 1 1 0 0 +EDGE2 202 182 -0.0373631 0.0144921 -4.34129e-05 1 0 1 1 0 0 +EDGE2 202 183 1.0634 -0.0317077 0.00605129 1 0 1 1 0 0 +EDGE2 203 202 -1.06009 -0.0110486 0.00618185 1 0 1 1 0 0 +EDGE2 203 182 -0.98423 0.0163906 0.0144674 1 0 1 1 0 0 +EDGE2 203 184 0.998633 -0.0400373 -0.000444741 1 0 1 1 0 0 +EDGE2 203 183 -0.0509773 -0.0172349 0.0103442 1 0 1 1 0 0 +EDGE2 204 184 -0.0410936 -0.0161087 0.0105868 1 0 1 1 0 0 +EDGE2 204 183 -1.03795 -0.00342323 -0.00702916 1 0 1 1 0 0 +EDGE2 204 203 -0.976414 0.0177453 0.00961665 1 0 1 1 0 0 +EDGE2 204 185 1.00198 -0.0499327 -0.019744 1 0 1 1 0 0 +EDGE2 205 184 -0.966934 -0.0455641 0.0516675 1 0 1 1 0 0 +EDGE2 205 204 -1.06771 -0.0299423 -0.0322938 1 0 1 1 0 0 +EDGE2 205 185 0.0172648 0.145607 -0.0143245 1 0 1 1 0 0 +EDGE2 205 186 -0.0540167 0.956486 1.55287 1 0 1 1 0 0 +EDGE2 206 205 -1.04106 0.00631527 1.56379 1 0 1 1 0 0 +EDGE2 206 185 -0.920689 -0.141123 1.54969 1 0 1 1 0 0 +EDGE2 207 206 -1.01559 -0.0205942 -0.00658617 1 0 1 1 0 0 +EDGE2 208 207 -1.13857 -0.0209236 0.0358307 1 0 1 1 0 0 +EDGE2 209 208 -1.01263 -0.0680235 -0.0203744 1 0 1 1 0 0 +EDGE2 210 209 -0.971016 -0.0299733 -0.0208929 1 0 1 1 0 0 +EDGE2 211 210 -1.01846 -0.0495481 -1.57097 1 0 1 1 0 0 +EDGE2 212 211 -1.00682 -0.0700291 0.0428093 1 0 1 1 0 0 +EDGE2 213 212 -0.995889 0.0434515 -0.00933083 1 0 1 1 0 0 +EDGE2 214 213 -1.11417 -0.0110297 -0.0102234 1 0 1 1 0 0 +EDGE2 215 214 -0.997737 -0.0302179 0.00145048 1 0 1 1 0 0 +EDGE2 216 215 -1.06941 -0.0541744 -1.58616 1 0 1 1 0 0 +EDGE2 217 216 -0.918235 0.0194373 -0.00297036 1 0 1 1 0 0 +EDGE2 218 217 -0.999078 -0.068366 -0.021023 1 0 1 1 0 0 +EDGE2 219 218 -1.07978 -0.0215746 0.0344501 1 0 1 1 0 0 +EDGE2 220 219 -0.943583 -0.0738134 0.014349 1 0 1 1 0 0 +EDGE2 221 220 -0.939321 0.00971984 -1.57648 1 0 1 1 0 0 +EDGE2 222 221 -0.968802 0.0605812 0.00170538 1 0 1 1 0 0 +EDGE2 223 222 -1.0161 0.00118843 0.00270329 1 0 1 1 0 0 +EDGE2 224 205 0.948493 -0.0230449 -3.15329 1 0 1 1 0 0 +EDGE2 224 223 -1.00416 -0.0273871 0.00388937 1 0 1 1 0 0 +EDGE2 224 185 1.0389 0.0861245 -3.14681 1 0 1 1 0 0 +EDGE2 225 206 0.00587987 0.990648 1.58715 1 0 1 1 0 0 +EDGE2 225 205 0.111332 0.00296517 -3.20679 1 0 1 1 0 0 +EDGE2 225 184 1.06616 -0.0446999 -3.15684 1 0 1 1 0 0 +EDGE2 225 204 0.953396 -0.0373338 -3.19154 1 0 1 1 0 0 +EDGE2 225 224 -1.0142 0.0313331 0.0218264 1 0 1 1 0 0 +EDGE2 225 185 -0.0208037 0.0363499 -3.12198 1 0 1 1 0 0 +EDGE2 225 186 -0.0223746 -0.996794 -1.58359 1 0 1 1 0 0 +EDGE2 226 206 0.0887687 0.0153149 -0.00688865 1 0 1 1 0 0 +EDGE2 226 207 1.05185 -0.0473262 -0.00721103 1 0 1 1 0 0 +EDGE2 226 205 -0.943987 -0.0335662 1.58524 1 0 1 1 0 0 +EDGE2 226 225 -1.05062 -0.0703611 -1.53931 1 0 1 1 0 0 +EDGE2 226 185 -1.02155 -0.0434301 1.59061 1 0 1 1 0 0 +EDGE2 227 208 1.00002 0.0080054 0.0171411 1 0 1 1 0 0 +EDGE2 227 206 -1.03412 -0.0293964 -0.011109 1 0 1 1 0 0 +EDGE2 227 207 0.0361208 -0.0222127 0.0158397 1 0 1 1 0 0 +EDGE2 227 226 -1.13309 0.0166796 -0.0541074 1 0 1 1 0 0 +EDGE2 228 209 0.988608 0.0572882 0.0448466 1 0 1 1 0 0 +EDGE2 228 208 0.0287596 -0.0120215 0.00651466 1 0 1 1 0 0 +EDGE2 228 207 -1.06988 0.00953783 0.015785 1 0 1 1 0 0 +EDGE2 228 227 -0.997221 -0.00444556 0.0072668 1 0 1 1 0 0 +EDGE2 229 228 -0.97076 0.0103909 0.00744336 1 0 1 1 0 0 +EDGE2 229 210 0.907425 -0.0108908 0.00871227 1 0 1 1 0 0 +EDGE2 229 209 0.0678344 0.0149309 0.00915945 1 0 1 1 0 0 +EDGE2 229 208 -0.960102 0.0636842 -0.00719953 1 0 1 1 0 0 +EDGE2 230 210 -0.0368707 0.0641839 0.00445594 1 0 1 1 0 0 +EDGE2 230 209 -0.997215 -0.00468012 0.0048537 1 0 1 1 0 0 +EDGE2 230 229 -0.948788 0.0610043 -0.0358728 1 0 1 1 0 0 +EDGE2 230 211 0.0190307 0.982278 1.5721 1 0 1 1 0 0 +EDGE2 231 210 -0.925208 -0.0691993 1.55098 1 0 1 1 0 0 +EDGE2 231 230 -0.969448 -0.0399664 1.54905 1 0 1 1 0 0 +EDGE2 232 231 -1.0027 0.0385524 -0.023788 1 0 1 1 0 0 +EDGE2 233 232 -1.00871 -0.120173 -0.0106568 1 0 1 1 0 0 +EDGE2 234 233 -0.972536 0.0585087 0.0167705 1 0 1 1 0 0 +EDGE2 235 234 -0.990329 -0.00707986 -0.0131082 1 0 1 1 0 0 +EDGE2 236 235 -0.959518 -0.0519359 -1.62451 1 0 1 1 0 0 +EDGE2 237 236 -1.03543 0.0645172 -9.45212e-05 1 0 1 1 0 0 +EDGE2 238 237 -1.01129 0.0686573 0.00162668 1 0 1 1 0 0 +EDGE2 239 238 -1.01294 0.0199432 0.0077918 1 0 1 1 0 0 +EDGE2 240 239 -0.980688 0.0785878 -0.0246631 1 0 1 1 0 0 +EDGE2 241 240 -1.0686 -0.0621547 -1.5682 1 0 1 1 0 0 +EDGE2 242 241 -1.0764 0.0293462 -0.00285832 1 0 1 1 0 0 +EDGE2 243 242 -0.892695 0.00173381 -0.00185319 1 0 1 1 0 0 +EDGE2 244 243 -0.967948 0.0271711 0.00949542 1 0 1 1 0 0 +EDGE2 245 244 -1.11763 0.0115506 0.0182625 1 0 1 1 0 0 +EDGE2 246 245 -0.957183 0.0163728 -1.57739 1 0 1 1 0 0 +EDGE2 247 246 -1.03748 -0.0103326 -0.0277392 1 0 1 1 0 0 +EDGE2 248 247 -1.10262 -0.0887786 0.0100498 1 0 1 1 0 0 +EDGE2 249 248 -1.02023 -0.0560576 -0.0189541 1 0 1 1 0 0 +EDGE2 249 210 1.03499 -0.0111154 -3.13944 1 0 1 1 0 0 +EDGE2 249 230 1.02141 -0.0304403 -3.15897 1 0 1 1 0 0 +EDGE2 250 231 0.0149354 1.01743 1.59735 1 0 1 1 0 0 +EDGE2 250 249 -1.00181 0.0845188 0.00661741 1 0 1 1 0 0 +EDGE2 250 210 0.0119669 0.0154293 -3.16778 1 0 1 1 0 0 +EDGE2 250 230 0.0259334 0.105739 -3.14393 1 0 1 1 0 0 +EDGE2 250 209 1.02724 -0.0440954 -3.17573 1 0 1 1 0 0 +EDGE2 250 229 1.01281 -0.08787 -3.10588 1 0 1 1 0 0 +EDGE2 250 211 0.0258623 -1.04557 -1.56419 1 0 1 1 0 0 +EDGE2 251 231 0.0329668 0.0116104 0.0371017 1 0 1 1 0 0 +EDGE2 251 232 1.07213 -0.0387592 0.0129117 1 0 1 1 0 0 +EDGE2 251 210 -0.971202 0.015651 1.58791 1 0 1 1 0 0 +EDGE2 251 230 -0.939574 0.0525149 1.60058 1 0 1 1 0 0 +EDGE2 251 250 -0.988965 -0.0444915 -1.59945 1 0 1 1 0 0 +EDGE2 252 231 -0.950215 -0.11724 -0.0158416 1 0 1 1 0 0 +EDGE2 252 233 1.00764 -0.0143232 0.0172258 1 0 1 1 0 0 +EDGE2 252 232 0.012579 -0.00835223 0.0157861 1 0 1 1 0 0 +EDGE2 252 251 -0.932464 -0.00991313 0.0172123 1 0 1 1 0 0 +EDGE2 253 234 1.02374 0.0506844 0.0304058 1 0 1 1 0 0 +EDGE2 253 233 0.0524403 -0.0709678 -0.0100597 1 0 1 1 0 0 +EDGE2 253 232 -0.957406 -0.0472771 0.0095734 1 0 1 1 0 0 +EDGE2 253 252 -1.07259 -0.0132071 -0.0320015 1 0 1 1 0 0 +EDGE2 254 235 1.01283 -0.0100882 -0.0126825 1 0 1 1 0 0 +EDGE2 254 253 -0.995641 -0.0807042 0.0189131 1 0 1 1 0 0 +EDGE2 254 234 0.0539201 0.0760808 0.0129775 1 0 1 1 0 0 +EDGE2 254 233 -1.03412 0.0279614 -0.00386827 1 0 1 1 0 0 +EDGE2 255 236 0.000867593 0.967132 1.56496 1 0 1 1 0 0 +EDGE2 255 235 -0.0386367 -0.0445356 0.00546656 1 0 1 1 0 0 +EDGE2 255 234 -1.03332 0.0743762 0.0113581 1 0 1 1 0 0 +EDGE2 255 254 -0.996568 0.0879913 0.0108378 1 0 1 1 0 0 +EDGE2 256 235 -1.02585 0.0152894 1.58934 1 0 1 1 0 0 +EDGE2 256 255 -1.06724 -0.0274454 1.58138 1 0 1 1 0 0 +EDGE2 257 256 -1.0348 0.0664905 -0.00699347 1 0 1 1 0 0 +EDGE2 258 257 -1.0104 -0.0474854 -0.000285067 1 0 1 1 0 0 +EDGE2 259 258 -0.936043 0.0469796 0.0135325 1 0 1 1 0 0 +EDGE2 259 180 0.933242 0.0264844 -3.1783 1 0 1 1 0 0 +EDGE2 259 200 0.970732 0.0632373 -3.1441 1 0 1 1 0 0 +EDGE2 260 181 -0.0186429 -1.02795 -1.55346 1 0 1 1 0 0 +EDGE2 260 259 -0.960586 -0.0873867 -0.00254107 1 0 1 1 0 0 +EDGE2 260 180 0.0388058 -0.015754 -3.13253 1 0 1 1 0 0 +EDGE2 260 200 -0.0663094 -0.0274282 -3.14012 1 0 1 1 0 0 +EDGE2 260 201 -0.067914 -1.01313 -1.57938 1 0 1 1 0 0 +EDGE2 260 199 0.968053 0.0670202 -3.11935 1 0 1 1 0 0 +EDGE2 260 179 0.981526 0.020732 -3.13716 1 0 1 1 0 0 +EDGE2 261 260 -0.97771 -0.0120342 -1.5368 1 0 1 1 0 0 +EDGE2 261 180 -0.98886 0.0866971 1.59592 1 0 1 1 0 0 +EDGE2 261 200 -0.989408 -0.0185871 1.57069 1 0 1 1 0 0 +EDGE2 262 261 -0.995051 -0.0128923 0.0215409 1 0 1 1 0 0 +EDGE2 263 262 -1.08017 0.104448 0.00196789 1 0 1 1 0 0 +EDGE2 264 263 -0.996187 0.0243206 -0.0188593 1 0 1 1 0 0 +EDGE2 265 264 -1.01424 0.0210914 -0.0192807 1 0 1 1 0 0 +EDGE2 266 265 -0.991202 0.0517045 1.56968 1 0 1 1 0 0 +EDGE2 267 266 -1.06701 -0.00427451 0.0423659 1 0 1 1 0 0 +EDGE2 268 267 -0.966821 -0.00862653 0.0105035 1 0 1 1 0 0 +EDGE2 269 268 -0.983899 -0.0620666 -0.031424 1 0 1 1 0 0 +EDGE2 270 269 -1.05732 0.0133452 0.0411046 1 0 1 1 0 0 +EDGE2 271 270 -0.978235 -0.00814872 -1.58104 1 0 1 1 0 0 +EDGE2 272 271 -0.928061 0.0193911 0.02364 1 0 1 1 0 0 +EDGE2 273 272 -1.04978 0.0341459 0.0157441 1 0 1 1 0 0 +EDGE2 274 273 -1.00565 -0.00115033 0.00283776 1 0 1 1 0 0 +EDGE2 275 274 -0.931256 0.0562279 0.0117425 1 0 1 1 0 0 +EDGE2 276 275 -1.0689 -0.0647808 -1.55895 1 0 1 1 0 0 +EDGE2 277 276 -0.958975 0.033834 0.00722896 1 0 1 1 0 0 +EDGE2 278 277 -0.96274 0.0235955 0.0219001 1 0 1 1 0 0 +EDGE2 279 278 -1.03937 0.00834043 0.00987821 1 0 1 1 0 0 +EDGE2 280 279 -1.0858 0.0383681 0.0154221 1 0 1 1 0 0 +EDGE2 281 280 -0.983883 0.080184 -1.56751 1 0 1 1 0 0 +EDGE2 282 281 -1.0417 0.082632 -0.0495892 1 0 1 1 0 0 +EDGE2 283 282 -1.02361 -0.0672171 0.0283386 1 0 1 1 0 0 +EDGE2 284 283 -0.993906 0.0296932 -0.0424879 1 0 1 1 0 0 +EDGE2 284 265 0.997532 0.055114 -3.11528 1 0 1 1 0 0 +EDGE2 285 284 -1.08097 0.122903 -0.0138224 1 0 1 1 0 0 +EDGE2 285 265 0.0233629 0.0340438 -3.14102 1 0 1 1 0 0 +EDGE2 285 264 1.03221 0.0361538 -3.17221 1 0 1 1 0 0 +EDGE2 285 266 0.051391 0.963301 1.57958 1 0 1 1 0 0 +EDGE2 286 265 -0.987556 -0.0854594 1.5753 1 0 1 1 0 0 +EDGE2 286 285 -1.03622 0.0556515 -1.59248 1 0 1 1 0 0 +EDGE2 286 266 0.0224708 0.0284241 0.0144112 1 0 1 1 0 0 +EDGE2 286 267 0.984305 0.00297155 -0.0301031 1 0 1 1 0 0 +EDGE2 287 266 -0.986472 -0.0258566 0.0211849 1 0 1 1 0 0 +EDGE2 287 286 -1.09165 0.0420513 -0.000807378 1 0 1 1 0 0 +EDGE2 287 267 0.0234069 -0.0554699 -0.00959709 1 0 1 1 0 0 +EDGE2 287 268 0.982102 -0.0543667 0.0217029 1 0 1 1 0 0 +EDGE2 288 287 -1.02756 -0.0347395 -0.00301245 1 0 1 1 0 0 +EDGE2 288 267 -1.00235 -0.0218035 -0.0011993 1 0 1 1 0 0 +EDGE2 288 269 0.951188 0.0104908 -0.0134197 1 0 1 1 0 0 +EDGE2 288 268 -0.00180451 -0.0153683 0.0341868 1 0 1 1 0 0 +EDGE2 289 269 0.0272258 0.0112407 -0.000770791 1 0 1 1 0 0 +EDGE2 289 268 -1.02344 0.00722098 -0.0298748 1 0 1 1 0 0 +EDGE2 289 288 -1.06998 -0.0613446 -0.0130324 1 0 1 1 0 0 +EDGE2 289 270 1.01959 -0.096506 0.0267945 1 0 1 1 0 0 +EDGE2 290 269 -1.01026 0.040431 -0.0297377 1 0 1 1 0 0 +EDGE2 290 289 -1.04994 0.0422135 -0.00794733 1 0 1 1 0 0 +EDGE2 290 271 -0.0389291 1.00913 1.59656 1 0 1 1 0 0 +EDGE2 290 270 0.0313199 0.0559041 -0.00696959 1 0 1 1 0 0 +EDGE2 291 272 0.887269 -0.00513299 0.0146811 1 0 1 1 0 0 +EDGE2 291 271 0.0193715 -0.00590938 0.0301476 1 0 1 1 0 0 +EDGE2 291 270 -1.04391 -0.00242755 -1.58628 1 0 1 1 0 0 +EDGE2 291 290 -1.09121 0.0502871 -1.56782 1 0 1 1 0 0 +EDGE2 292 291 -0.999759 -0.0211813 0.0354644 1 0 1 1 0 0 +EDGE2 292 273 1.03036 0.0511473 -0.0126404 1 0 1 1 0 0 +EDGE2 292 272 -0.0157977 -0.0271064 0.00872994 1 0 1 1 0 0 +EDGE2 292 271 -0.996396 -0.0321903 0.00165275 1 0 1 1 0 0 +EDGE2 293 274 1.04037 -0.0149463 -0.0131203 1 0 1 1 0 0 +EDGE2 293 273 0.0481857 -0.0775935 0.00522886 1 0 1 1 0 0 +EDGE2 293 292 -0.974797 -0.0705898 0.0126775 1 0 1 1 0 0 +EDGE2 293 272 -1.03932 -0.0267565 -0.0117164 1 0 1 1 0 0 +EDGE2 294 275 0.980519 -0.06543 -0.0172807 1 0 1 1 0 0 +EDGE2 294 274 0.0689434 -0.0136945 0.0148159 1 0 1 1 0 0 +EDGE2 294 273 -0.990998 0.00128949 0.0179971 1 0 1 1 0 0 +EDGE2 294 293 -1.04861 -0.0174061 -0.00569592 1 0 1 1 0 0 +EDGE2 295 276 -0.00562866 1.03868 1.55219 1 0 1 1 0 0 +EDGE2 295 275 -0.0166408 0.063865 -0.00327191 1 0 1 1 0 0 +EDGE2 295 294 -0.943583 0.0100689 0.0118891 1 0 1 1 0 0 +EDGE2 295 274 -0.934709 0.0351985 0.0149186 1 0 1 1 0 0 +EDGE2 296 277 0.998313 0.0228161 -0.00865922 1 0 1 1 0 0 +EDGE2 296 276 0.0684484 0.00536779 -0.0124965 1 0 1 1 0 0 +EDGE2 296 275 -1.03411 0.110379 -1.57708 1 0 1 1 0 0 +EDGE2 296 295 -0.917205 0.0103311 -1.57031 1 0 1 1 0 0 +EDGE2 297 278 0.978852 0.0017514 0.0195057 1 0 1 1 0 0 +EDGE2 297 277 0.0737525 0.00120277 -0.0189685 1 0 1 1 0 0 +EDGE2 297 296 -1.02704 -0.0785475 -0.00482635 1 0 1 1 0 0 +EDGE2 297 276 -1.07338 0.0468344 0.030906 1 0 1 1 0 0 +EDGE2 298 279 0.947647 0.0257525 0.0039442 1 0 1 1 0 0 +EDGE2 298 278 -0.0741288 -0.0127093 0.00238615 1 0 1 1 0 0 +EDGE2 298 277 -1.02749 -0.0296649 0.013374 1 0 1 1 0 0 +EDGE2 298 297 -1.05576 0.0627335 0.0467369 1 0 1 1 0 0 +EDGE2 299 280 1.01126 -0.00417437 -0.0233659 1 0 1 1 0 0 +EDGE2 299 279 -0.0280618 -0.108907 0.0131081 1 0 1 1 0 0 +EDGE2 299 298 -1.04242 0.0358523 0.0217988 1 0 1 1 0 0 +EDGE2 299 278 -1.09331 -0.030841 0.00968742 1 0 1 1 0 0 +EDGE2 300 280 0.0219769 0.020666 0.0157306 1 0 1 1 0 0 +EDGE2 300 281 -0.0412772 1.02 1.57021 1 0 1 1 0 0 +EDGE2 300 299 -1.02038 0.0431214 -0.0228237 1 0 1 1 0 0 +EDGE2 300 279 -1.06756 0.0140752 0.023178 1 0 1 1 0 0 +EDGE2 301 300 -1.00455 -0.00438501 1.58529 1 0 1 1 0 0 +EDGE2 301 280 -0.99337 0.0608578 1.56392 1 0 1 1 0 0 +EDGE2 302 301 -0.983609 -0.0955402 -0.013492 1 0 1 1 0 0 +EDGE2 303 302 -0.931797 -0.000540591 0.0191314 1 0 1 1 0 0 +EDGE2 304 303 -1.02079 0.0470907 -0.0185606 1 0 1 1 0 0 +EDGE2 305 304 -0.957944 -0.0125841 -0.0144769 1 0 1 1 0 0 +EDGE2 306 305 -1.04676 0.046431 1.54188 1 0 1 1 0 0 +EDGE2 307 306 -1.04168 -0.0123813 0.0483307 1 0 1 1 0 0 +EDGE2 308 307 -1.04785 0.0560082 0.0201868 1 0 1 1 0 0 +EDGE2 309 308 -1.00568 0.0699202 -0.0277523 1 0 1 1 0 0 +EDGE2 310 309 -0.99312 -0.0202349 0.00578647 1 0 1 1 0 0 +EDGE2 311 310 -0.951967 0.016229 1.57099 1 0 1 1 0 0 +EDGE2 312 311 -1.01346 0.0992812 -0.0134632 1 0 1 1 0 0 +EDGE2 313 312 -1.05588 0.00434816 0.00969748 1 0 1 1 0 0 +EDGE2 314 313 -0.985718 0.0938375 0.00937384 1 0 1 1 0 0 +EDGE2 314 275 0.997855 0.0082961 -3.14015 1 0 1 1 0 0 +EDGE2 314 295 0.999757 0.0647507 -3.15954 1 0 1 1 0 0 +EDGE2 315 314 -1.01291 -0.0286651 0.00585106 1 0 1 1 0 0 +EDGE2 315 296 -0.0606997 -1.00209 -1.55264 1 0 1 1 0 0 +EDGE2 315 276 -0.0634739 -0.981278 -1.5733 1 0 1 1 0 0 +EDGE2 315 275 -0.0617715 -0.0307556 -3.10594 1 0 1 1 0 0 +EDGE2 315 295 -0.0101674 0.0273863 -3.11625 1 0 1 1 0 0 +EDGE2 315 294 1.02967 0.0408111 -3.17912 1 0 1 1 0 0 +EDGE2 315 274 1.04323 -0.00589104 -3.12935 1 0 1 1 0 0 +EDGE2 316 315 -1.00802 -0.0354128 -1.56564 1 0 1 1 0 0 +EDGE2 316 275 -0.991259 0.09735 1.54275 1 0 1 1 0 0 +EDGE2 316 295 -1.10293 -0.0569836 1.55237 1 0 1 1 0 0 +EDGE2 317 316 -1.05607 0.0242599 -0.0264643 1 0 1 1 0 0 +EDGE2 318 317 -1.04449 0.0413409 -0.00157362 1 0 1 1 0 0 +EDGE2 319 318 -1.11341 -0.00169401 -0.00631167 1 0 1 1 0 0 +EDGE2 319 140 0.985414 -0.02363 -3.1861 1 0 1 1 0 0 +EDGE2 320 141 -0.0351018 -0.995731 -1.5855 1 0 1 1 0 0 +EDGE2 320 319 -0.916618 0.00743586 0.00346085 1 0 1 1 0 0 +EDGE2 320 140 0.0550555 0.0871761 -3.17551 1 0 1 1 0 0 +EDGE2 320 139 1.09049 0.0137958 -3.17065 1 0 1 1 0 0 +EDGE2 321 141 -0.00692556 -0.108443 0.0158813 1 0 1 1 0 0 +EDGE2 321 320 -0.970383 0.0406494 1.60498 1 0 1 1 0 0 +EDGE2 321 140 -1.00251 0.0392201 -1.57829 1 0 1 1 0 0 +EDGE2 321 142 0.980676 -0.00947623 0.0131915 1 0 1 1 0 0 +EDGE2 322 141 -1.0076 -0.0755406 -0.0530275 1 0 1 1 0 0 +EDGE2 322 321 -0.887534 -0.0328373 -0.0137991 1 0 1 1 0 0 +EDGE2 322 142 -0.0933923 0.00253918 -0.00924363 1 0 1 1 0 0 +EDGE2 322 143 0.940437 0.0341087 0.0163465 1 0 1 1 0 0 +EDGE2 323 322 -1.03941 0.0690387 -0.0500789 1 0 1 1 0 0 +EDGE2 323 142 -1.02173 -0.00750776 -0.0179098 1 0 1 1 0 0 +EDGE2 323 143 -0.0438918 -0.0753381 0.0242969 1 0 1 1 0 0 +EDGE2 323 144 1.01537 0.0738324 0.0161831 1 0 1 1 0 0 +EDGE2 324 323 -0.957244 -0.0659361 -0.0426594 1 0 1 1 0 0 +EDGE2 324 143 -1.03345 0.0200791 0.0289815 1 0 1 1 0 0 +EDGE2 324 145 0.944403 -0.0172994 -0.0111807 1 0 1 1 0 0 +EDGE2 324 144 -0.0359069 0.00413178 0.0255016 1 0 1 1 0 0 +EDGE2 325 146 -0.01496 0.983688 1.57773 1 0 1 1 0 0 +EDGE2 325 145 -0.0109934 0.00201261 0.0154798 1 0 1 1 0 0 +EDGE2 325 144 -1.03602 -0.0167051 0.0026791 1 0 1 1 0 0 +EDGE2 325 324 -1.05993 0.0230482 0.0019306 1 0 1 1 0 0 +EDGE2 326 146 -0.0314091 0.0136968 -0.0149681 1 0 1 1 0 0 +EDGE2 326 145 -0.96241 0.0208298 -1.58365 1 0 1 1 0 0 +EDGE2 326 325 -1.16188 0.0371223 -1.55627 1 0 1 1 0 0 +EDGE2 326 147 0.979322 -0.0182966 0.0178328 1 0 1 1 0 0 +EDGE2 327 146 -1.04449 -0.0228833 0.0180027 1 0 1 1 0 0 +EDGE2 327 326 -0.938473 -0.0623385 -0.00510423 1 0 1 1 0 0 +EDGE2 327 147 -0.0528446 0.0136248 0.0108673 1 0 1 1 0 0 +EDGE2 327 148 1.04131 0.00217537 0.0363522 1 0 1 1 0 0 +EDGE2 328 149 1.03568 0.0763655 -0.0156121 1 0 1 1 0 0 +EDGE2 328 147 -0.942284 0.0303029 0.00764426 1 0 1 1 0 0 +EDGE2 328 327 -1.02434 -0.00991295 0.0300128 1 0 1 1 0 0 +EDGE2 328 148 0.0123132 -0.0271774 -0.00811093 1 0 1 1 0 0 +EDGE2 329 149 -0.0198851 0.0329202 0.00309058 1 0 1 1 0 0 +EDGE2 329 328 -1.03502 0.121245 -0.00683712 1 0 1 1 0 0 +EDGE2 329 148 -1.0584 -0.0108499 -0.0149064 1 0 1 1 0 0 +EDGE2 329 150 0.978032 0.0192173 -0.000825661 1 0 1 1 0 0 +EDGE2 330 149 -1.00878 0.0178434 -0.0114125 1 0 1 1 0 0 +EDGE2 330 329 -0.972702 0.0343284 -0.00462873 1 0 1 1 0 0 +EDGE2 330 150 0.00238211 -0.0747704 0.0142853 1 0 1 1 0 0 +EDGE2 330 151 -0.0884636 -0.972508 -1.55956 1 0 1 1 0 0 +EDGE2 331 150 -0.960109 0.0194813 -1.58192 1 0 1 1 0 0 +EDGE2 331 330 -1.07232 0.0198178 -1.5987 1 0 1 1 0 0 +EDGE2 332 331 -0.960055 -0.066207 0.0382957 1 0 1 1 0 0 +EDGE2 333 332 -1.04408 -0.00871841 -0.00288772 1 0 1 1 0 0 +EDGE2 334 333 -0.986677 0.0947757 0.00433876 1 0 1 1 0 0 +EDGE2 334 135 0.974813 0.0334172 -3.10785 1 0 1 1 0 0 +EDGE2 335 334 -0.973856 -0.0491621 -0.00017424 1 0 1 1 0 0 +EDGE2 335 136 -0.101665 1.10777 1.56092 1 0 1 1 0 0 +EDGE2 335 134 0.997497 0.0181477 -3.10418 1 0 1 1 0 0 +EDGE2 335 135 -0.0750477 0.0879573 -3.16388 1 0 1 1 0 0 +EDGE2 336 137 1.05601 -0.0744381 0.0081098 1 0 1 1 0 0 +EDGE2 336 335 -1.09524 0.0587924 -1.58397 1 0 1 1 0 0 +EDGE2 336 136 0.0343041 -0.106787 0.00975101 1 0 1 1 0 0 +EDGE2 336 135 -1.03941 0.0719973 1.5321 1 0 1 1 0 0 +EDGE2 337 138 1.04537 0.00832492 0.00692063 1 0 1 1 0 0 +EDGE2 337 137 -0.00694995 0.0665459 -0.0113134 1 0 1 1 0 0 +EDGE2 337 336 -1.02171 0.0876837 0.00628278 1 0 1 1 0 0 +EDGE2 337 136 -1.00001 -0.00626509 -0.000986147 1 0 1 1 0 0 +EDGE2 338 139 0.99748 -0.0576202 0.0275536 1 0 1 1 0 0 +EDGE2 338 138 0.0851323 0.00875204 0.00359782 1 0 1 1 0 0 +EDGE2 338 137 -0.987765 0.0100882 0.0236557 1 0 1 1 0 0 +EDGE2 338 337 -1.02737 0.0199432 -0.00134054 1 0 1 1 0 0 +EDGE2 339 320 0.944519 0.0412678 -3.16056 1 0 1 1 0 0 +EDGE2 339 140 1.09737 -0.101809 -0.0245942 1 0 1 1 0 0 +EDGE2 339 139 -0.0497592 -0.0225318 -0.0109802 1 0 1 1 0 0 +EDGE2 339 138 -0.936329 -0.117928 -0.00356715 1 0 1 1 0 0 +EDGE2 339 338 -0.901996 -0.0181948 -0.00325328 1 0 1 1 0 0 +EDGE2 340 141 0.0347745 0.99591 1.57966 1 0 1 1 0 0 +EDGE2 340 320 -0.00726923 -0.0214086 -3.16084 1 0 1 1 0 0 +EDGE2 340 319 0.963882 0.0153726 -3.13961 1 0 1 1 0 0 +EDGE2 340 140 0.0376022 0.0258391 0.00846876 1 0 1 1 0 0 +EDGE2 340 321 0.0442825 0.998575 1.56057 1 0 1 1 0 0 +EDGE2 340 339 -1.02888 -0.000629263 0.0147428 1 0 1 1 0 0 +EDGE2 340 139 -0.996673 0.0100372 -0.0188653 1 0 1 1 0 0 +EDGE2 341 141 -0.0204612 -0.00684656 0.0235285 1 0 1 1 0 0 +EDGE2 341 320 -0.953831 0.00958725 1.55211 1 0 1 1 0 0 +EDGE2 341 340 -1.00831 0.0597172 -1.55984 1 0 1 1 0 0 +EDGE2 341 140 -1.05212 -0.0572095 -1.58293 1 0 1 1 0 0 +EDGE2 341 321 -0.0433574 -0.0358681 -0.0165584 1 0 1 1 0 0 +EDGE2 341 322 0.997416 0.0182547 0.0126865 1 0 1 1 0 0 +EDGE2 341 142 1.05229 -0.0282593 0.0315944 1 0 1 1 0 0 +EDGE2 342 141 -1.03748 0.0409462 -0.00828443 1 0 1 1 0 0 +EDGE2 342 341 -0.933354 -0.0541994 0.000705127 1 0 1 1 0 0 +EDGE2 342 321 -0.959753 0.00756849 0.019942 1 0 1 1 0 0 +EDGE2 342 322 0.0523934 -0.0262233 0.0241918 1 0 1 1 0 0 +EDGE2 342 142 -0.0180132 0.00366763 0.00234914 1 0 1 1 0 0 +EDGE2 342 323 0.981047 0.0216761 -0.000179713 1 0 1 1 0 0 +EDGE2 342 143 1.01676 0.0713003 0.00835713 1 0 1 1 0 0 +EDGE2 343 322 -1.05765 0.0845533 0.0193414 1 0 1 1 0 0 +EDGE2 343 342 -0.96719 0.0397655 0.0515457 1 0 1 1 0 0 +EDGE2 343 142 -1.00005 0.0362951 0.000189687 1 0 1 1 0 0 +EDGE2 343 323 0.0276855 0.00137953 0.00984422 1 0 1 1 0 0 +EDGE2 343 143 0.00215755 0.0281899 0.00235529 1 0 1 1 0 0 +EDGE2 343 144 1.03089 0.00384179 0.0450656 1 0 1 1 0 0 +EDGE2 343 324 1.10736 0.0680282 -0.00177145 1 0 1 1 0 0 +EDGE2 344 323 -0.912318 0.0980387 0.00308913 1 0 1 1 0 0 +EDGE2 344 343 -1.03864 -0.00764176 -0.046609 1 0 1 1 0 0 +EDGE2 344 143 -0.992085 0.0337518 -0.0346263 1 0 1 1 0 0 +EDGE2 344 145 1.03539 -0.0792257 -0.0162485 1 0 1 1 0 0 +EDGE2 344 144 0.0228107 0.00801491 -0.00497929 1 0 1 1 0 0 +EDGE2 344 324 0.0335927 0.0218513 -0.00631766 1 0 1 1 0 0 +EDGE2 344 325 1.01494 -0.0592503 -0.0393743 1 0 1 1 0 0 +EDGE2 345 146 -0.0561875 1.03904 1.54852 1 0 1 1 0 0 +EDGE2 345 145 0.0321541 0.00850545 -0.000485773 1 0 1 1 0 0 +EDGE2 345 144 -0.966716 -0.0126625 0.0102553 1 0 1 1 0 0 +EDGE2 345 324 -0.938704 0.000678928 0.0066252 1 0 1 1 0 0 +EDGE2 345 344 -0.937717 0.0485604 0.0348205 1 0 1 1 0 0 +EDGE2 345 325 -0.0593075 -0.0321066 0.0139647 1 0 1 1 0 0 +EDGE2 345 326 0.0240737 1.03969 1.57582 1 0 1 1 0 0 +EDGE2 346 146 -0.0404803 0.0149644 0.0167848 1 0 1 1 0 0 +EDGE2 346 145 -1.02157 -0.0152007 -1.55049 1 0 1 1 0 0 +EDGE2 346 325 -1.06425 0.0415451 -1.57956 1 0 1 1 0 0 +EDGE2 346 345 -0.976201 -0.0110188 -1.6132 1 0 1 1 0 0 +EDGE2 346 326 -0.0818485 0.00263273 -0.00987404 1 0 1 1 0 0 +EDGE2 346 147 0.944304 -0.0785785 0.027773 1 0 1 1 0 0 +EDGE2 346 327 1.04324 -0.00367249 0.0190487 1 0 1 1 0 0 +EDGE2 347 146 -1.06337 -0.0589152 -0.0209029 1 0 1 1 0 0 +EDGE2 347 346 -0.969295 0.0255736 -0.00700173 1 0 1 1 0 0 +EDGE2 347 326 -0.977572 0.0327162 0.00167604 1 0 1 1 0 0 +EDGE2 347 328 1.02218 0.046691 -0.0237782 1 0 1 1 0 0 +EDGE2 347 147 -0.00406939 -0.00253152 -0.0186197 1 0 1 1 0 0 +EDGE2 347 327 0.041444 0.0266505 0.00320486 1 0 1 1 0 0 +EDGE2 347 148 1.03603 -0.0139795 0.00545512 1 0 1 1 0 0 +EDGE2 348 149 1.01118 0.0304839 -0.00304702 1 0 1 1 0 0 +EDGE2 348 328 -0.105139 -0.0664387 0.00372921 1 0 1 1 0 0 +EDGE2 348 147 -1.07808 -0.0335986 -0.0488093 1 0 1 1 0 0 +EDGE2 348 347 -0.99897 -0.069158 0.00123947 1 0 1 1 0 0 +EDGE2 348 327 -1.0809 0.0520311 -0.00370497 1 0 1 1 0 0 +EDGE2 348 148 -0.0408177 0.0226147 0.0561296 1 0 1 1 0 0 +EDGE2 348 329 1.00681 -0.112233 -0.036587 1 0 1 1 0 0 +EDGE2 349 149 -0.0682059 0.00828495 0.0226214 1 0 1 1 0 0 +EDGE2 349 328 -1.01888 -0.036682 0.0457323 1 0 1 1 0 0 +EDGE2 349 348 -0.954991 0.0884074 -0.0239535 1 0 1 1 0 0 +EDGE2 349 148 -1.00734 0.012494 0.0332182 1 0 1 1 0 0 +EDGE2 349 329 -0.00604733 0.0309048 0.0135306 1 0 1 1 0 0 +EDGE2 349 150 1.01787 0.00225654 0.0202799 1 0 1 1 0 0 +EDGE2 349 330 1.03753 0.013359 0.0209852 1 0 1 1 0 0 +EDGE2 350 149 -0.976861 0.00534047 0.00577345 1 0 1 1 0 0 +EDGE2 350 349 -1.0454 -0.0677234 -0.0034093 1 0 1 1 0 0 +EDGE2 350 329 -1.05177 -0.0191826 -0.00802369 1 0 1 1 0 0 +EDGE2 350 150 -0.0268314 -0.0701461 0.0130155 1 0 1 1 0 0 +EDGE2 350 331 -0.0629594 1.01945 1.55341 1 0 1 1 0 0 +EDGE2 350 330 -0.0519318 0.0312789 0.0118928 1 0 1 1 0 0 +EDGE2 350 151 -0.0135905 -1.0535 -1.56467 1 0 1 1 0 0 +EDGE2 351 150 -0.996949 -0.0257942 1.56956 1 0 1 1 0 0 +EDGE2 351 350 -1.05026 0.0322168 1.57729 1 0 1 1 0 0 +EDGE2 351 330 -0.973476 0.0389424 1.55412 1 0 1 1 0 0 +EDGE2 351 151 0.0117874 -0.0380698 -0.00487154 1 0 1 1 0 0 +EDGE2 351 152 0.920963 0.0317809 -0.00262497 1 0 1 1 0 0 +EDGE2 352 151 -0.967231 -0.0110297 -0.00739797 1 0 1 1 0 0 +EDGE2 352 351 -0.895923 0.0208458 0.00609653 1 0 1 1 0 0 +EDGE2 352 152 -0.0370196 0.0877795 -0.0203233 1 0 1 1 0 0 +EDGE2 352 153 0.992413 -0.0347192 0.0298697 1 0 1 1 0 0 +EDGE2 353 152 -1.00405 0.0826277 0.00188123 1 0 1 1 0 0 +EDGE2 353 352 -0.950188 -0.0582715 0.0198057 1 0 1 1 0 0 +EDGE2 353 153 0.00705353 -0.0323646 -0.00339335 1 0 1 1 0 0 +EDGE2 353 154 0.996013 0.100394 -0.0140073 1 0 1 1 0 0 +EDGE2 354 353 -0.951646 0.000487337 -0.00206691 1 0 1 1 0 0 +EDGE2 354 153 -0.983527 -0.0101225 0.0172418 1 0 1 1 0 0 +EDGE2 354 154 -0.0648475 0.0844686 -0.0061613 1 0 1 1 0 0 +EDGE2 354 155 0.937738 -0.0163485 0.00629075 1 0 1 1 0 0 +EDGE2 355 156 0.0278 -0.941368 -1.58824 1 0 1 1 0 0 +EDGE2 355 154 -1.07828 -0.0392567 -0.034315 1 0 1 1 0 0 +EDGE2 355 354 -1.02488 0.103705 0.00565897 1 0 1 1 0 0 +EDGE2 355 155 0.0718132 0.0989572 -0.0034898 1 0 1 1 0 0 +EDGE2 356 355 -0.924034 0.000898823 -1.55676 1 0 1 1 0 0 +EDGE2 356 155 -0.993433 0.067184 -1.55047 1 0 1 1 0 0 +EDGE2 357 356 -0.989553 0.0222139 0.0314838 1 0 1 1 0 0 +EDGE2 358 357 -1.00913 0.00670377 -0.00172544 1 0 1 1 0 0 +EDGE2 359 358 -1.00241 0.0844381 0.00649201 1 0 1 1 0 0 +EDGE2 360 359 -0.971081 0.0414071 -0.0292567 1 0 1 1 0 0 +EDGE2 361 360 -0.995405 0.0911711 -1.56488 1 0 1 1 0 0 +EDGE2 362 361 -0.85653 -0.00351448 0.00624414 1 0 1 1 0 0 +EDGE2 363 362 -0.985225 0.0104997 5.48901e-05 1 0 1 1 0 0 +EDGE2 364 363 -1.00975 -0.00503642 -0.0194504 1 0 1 1 0 0 +EDGE2 365 364 -1.00038 -0.0174668 0.0277579 1 0 1 1 0 0 +EDGE2 366 365 -1.03705 -0.0438083 -1.5895 1 0 1 1 0 0 +EDGE2 367 366 -0.957106 0.0692229 0.0145349 1 0 1 1 0 0 +EDGE2 368 367 -1.03525 0.0592008 -0.0293899 1 0 1 1 0 0 +EDGE2 369 150 1.02724 0.0240689 -3.11527 1 0 1 1 0 0 +EDGE2 369 350 0.977025 0.0302814 -3.12328 1 0 1 1 0 0 +EDGE2 369 330 0.986311 0.00475614 -3.16452 1 0 1 1 0 0 +EDGE2 369 368 -0.992414 -0.136385 -0.00034604 1 0 1 1 0 0 +EDGE2 370 149 1.09863 0.0140768 -3.14156 1 0 1 1 0 0 +EDGE2 370 349 1.03748 -0.0714949 -3.13086 1 0 1 1 0 0 +EDGE2 370 329 1.04033 0.00145687 -3.15534 1 0 1 1 0 0 +EDGE2 370 150 -0.058043 0.047886 -3.15723 1 0 1 1 0 0 +EDGE2 370 350 -0.000477295 0.0712746 -3.11498 1 0 1 1 0 0 +EDGE2 370 331 -0.028781 -0.930131 -1.57076 1 0 1 1 0 0 +EDGE2 370 330 -0.0457607 0.0153778 -3.14173 1 0 1 1 0 0 +EDGE2 370 151 -0.00182855 1.05103 1.56559 1 0 1 1 0 0 +EDGE2 370 351 0.0303107 0.91779 1.58761 1 0 1 1 0 0 +EDGE2 370 369 -0.941208 0.00374797 -0.0168333 1 0 1 1 0 0 +EDGE2 371 150 -0.995769 -0.00164086 1.5841 1 0 1 1 0 0 +EDGE2 371 350 -0.990687 0.0162268 1.57364 1 0 1 1 0 0 +EDGE2 371 370 -0.992139 0.0875104 -1.58452 1 0 1 1 0 0 +EDGE2 371 330 -0.915135 -0.0573733 1.57229 1 0 1 1 0 0 +EDGE2 371 151 0.00613103 0.0164656 -0.00955548 1 0 1 1 0 0 +EDGE2 371 351 0.00997757 0.0607516 0.0252572 1 0 1 1 0 0 +EDGE2 371 152 0.94855 -0.00106908 0.0441771 1 0 1 1 0 0 +EDGE2 371 352 0.981372 0.00661065 -0.002385 1 0 1 1 0 0 +EDGE2 372 353 1.04874 0.00275383 -0.0212458 1 0 1 1 0 0 +EDGE2 372 151 -1.09577 -0.0136383 -0.0280671 1 0 1 1 0 0 +EDGE2 372 371 -0.989506 0.00334604 -0.0157864 1 0 1 1 0 0 +EDGE2 372 351 -0.987243 -0.0433526 0.0136213 1 0 1 1 0 0 +EDGE2 372 152 -0.0369599 0.0663101 -0.00940498 1 0 1 1 0 0 +EDGE2 372 352 0.0202793 0.044036 -0.0379086 1 0 1 1 0 0 +EDGE2 372 153 0.9849 -0.0465307 -0.00867665 1 0 1 1 0 0 +EDGE2 373 353 0.06041 0.0409817 0.0178866 1 0 1 1 0 0 +EDGE2 373 152 -1.0306 -0.00622101 0.00747908 1 0 1 1 0 0 +EDGE2 373 352 -0.92901 0.0204433 0.0277354 1 0 1 1 0 0 +EDGE2 373 372 -0.967763 -0.00676442 0.0293944 1 0 1 1 0 0 +EDGE2 373 153 -0.0390506 0.0204675 0.0494969 1 0 1 1 0 0 +EDGE2 373 154 1.02389 0.0583921 -0.00951179 1 0 1 1 0 0 +EDGE2 373 354 0.995704 -0.0377234 -0.00470782 1 0 1 1 0 0 +EDGE2 374 353 -0.949283 -0.00733675 -0.0114433 1 0 1 1 0 0 +EDGE2 374 373 -1.02063 -0.0189697 -0.0113492 1 0 1 1 0 0 +EDGE2 374 153 -0.96191 0.0134475 0.0218271 1 0 1 1 0 0 +EDGE2 374 355 1.00487 0.0258561 0.00328116 1 0 1 1 0 0 +EDGE2 374 154 0.0328216 0.0591291 0.003098 1 0 1 1 0 0 +EDGE2 374 354 0.020052 -0.0756487 0.00617022 1 0 1 1 0 0 +EDGE2 374 155 1.03414 0.0353636 -0.00325564 1 0 1 1 0 0 +EDGE2 375 156 0.00234572 -0.998589 -1.54844 1 0 1 1 0 0 +EDGE2 375 355 0.0473998 0.0408317 0.000485781 1 0 1 1 0 0 +EDGE2 375 154 -1.0097 -0.00471492 -0.0579508 1 0 1 1 0 0 +EDGE2 375 354 -0.966546 -0.00754192 0.0174466 1 0 1 1 0 0 +EDGE2 375 374 -1.03845 0.0485415 -0.0122152 1 0 1 1 0 0 +EDGE2 375 356 0.0494355 1.00023 1.59567 1 0 1 1 0 0 +EDGE2 375 155 0.0676031 -0.0484884 -6.61484e-05 1 0 1 1 0 0 +EDGE2 376 157 1.12555 0.0418621 -0.00569736 1 0 1 1 0 0 +EDGE2 376 156 -0.0710516 0.000353013 0.00260649 1 0 1 1 0 0 +EDGE2 376 355 -1.00044 0.0509481 1.59829 1 0 1 1 0 0 +EDGE2 376 375 -0.934833 -0.00943084 1.55943 1 0 1 1 0 0 +EDGE2 376 155 -1.0068 0.0637036 1.57172 1 0 1 1 0 0 +EDGE2 377 158 1.08265 0.0107028 -0.0183686 1 0 1 1 0 0 +EDGE2 377 157 -0.043601 -0.00663302 0.00732368 1 0 1 1 0 0 +EDGE2 377 156 -0.957511 -0.0214601 -0.0065632 1 0 1 1 0 0 +EDGE2 377 376 -0.992438 0.0274093 0.0182011 1 0 1 1 0 0 +EDGE2 378 159 1.04462 0.0297478 -0.00528026 1 0 1 1 0 0 +EDGE2 378 158 0.0239728 0.0367374 -0.000437012 1 0 1 1 0 0 +EDGE2 378 157 -1.05469 -0.0240482 -0.00828235 1 0 1 1 0 0 +EDGE2 378 377 -1.00914 -0.0209924 -0.025891 1 0 1 1 0 0 +EDGE2 379 160 1.02213 -0.0642854 -0.0153511 1 0 1 1 0 0 +EDGE2 379 378 -0.913692 -0.155683 0.0344828 1 0 1 1 0 0 +EDGE2 379 159 0.053886 0.0936253 0.00792927 1 0 1 1 0 0 +EDGE2 379 158 -0.924317 -0.0316439 -0.0045375 1 0 1 1 0 0 +EDGE2 380 161 -0.0327835 1.00669 1.55491 1 0 1 1 0 0 +EDGE2 380 160 -0.0505177 0.0813357 0.0120065 1 0 1 1 0 0 +EDGE2 380 159 -1.0458 0.00557244 -0.00104859 1 0 1 1 0 0 +EDGE2 380 379 -0.94741 -0.0215038 -0.0133243 1 0 1 1 0 0 +EDGE2 381 380 -0.981683 0.0530795 1.56173 1 0 1 1 0 0 +EDGE2 381 160 -1.05167 0.116331 1.5904 1 0 1 1 0 0 +EDGE2 382 381 -0.950499 -0.00770337 0.00227682 1 0 1 1 0 0 +EDGE2 383 382 -0.877725 -0.01241 -0.00664537 1 0 1 1 0 0 +EDGE2 384 145 0.953264 -0.0954296 -3.12083 1 0 1 1 0 0 +EDGE2 384 325 1.00269 -0.0374514 -3.16579 1 0 1 1 0 0 +EDGE2 384 345 0.976224 0.00943881 -3.17002 1 0 1 1 0 0 +EDGE2 384 383 -0.921704 0.0164399 0.0020997 1 0 1 1 0 0 +EDGE2 385 146 0.0736793 -1.0307 -1.56248 1 0 1 1 0 0 +EDGE2 385 145 -0.0287288 0.0418859 -3.14081 1 0 1 1 0 0 +EDGE2 385 144 0.994597 -0.00217362 -3.135 1 0 1 1 0 0 +EDGE2 385 324 1.02065 0.084161 -3.16687 1 0 1 1 0 0 +EDGE2 385 344 1.04314 -0.0190637 -3.1098 1 0 1 1 0 0 +EDGE2 385 325 0.0558943 -0.0217213 -3.11998 1 0 1 1 0 0 +EDGE2 385 345 0.00400304 -0.0795216 -3.14342 1 0 1 1 0 0 +EDGE2 385 384 -0.937222 -0.049328 0.0194805 1 0 1 1 0 0 +EDGE2 385 346 -0.0173012 -1.01034 -1.56834 1 0 1 1 0 0 +EDGE2 385 326 -0.0404751 -1.04363 -1.56053 1 0 1 1 0 0 +EDGE2 386 145 -1.02541 -0.0334882 1.59454 1 0 1 1 0 0 +EDGE2 386 385 -1.05425 -0.0728097 -1.55538 1 0 1 1 0 0 +EDGE2 386 325 -0.977568 -0.0424052 1.58704 1 0 1 1 0 0 +EDGE2 386 345 -0.91585 -0.0088905 1.58359 1 0 1 1 0 0 +EDGE2 387 386 -0.991249 0.0530245 0.0138695 1 0 1 1 0 0 +EDGE2 388 387 -0.985075 -0.000350093 0.0203779 1 0 1 1 0 0 +EDGE2 389 270 0.96207 -0.0488674 -3.1361 1 0 1 1 0 0 +EDGE2 389 290 0.990992 -0.0372821 -3.1266 1 0 1 1 0 0 +EDGE2 389 388 -0.991371 0.0481841 0.00614784 1 0 1 1 0 0 +EDGE2 390 291 0.0139418 -0.993395 -1.56786 1 0 1 1 0 0 +EDGE2 390 269 0.988069 0.114884 -3.13025 1 0 1 1 0 0 +EDGE2 390 289 1.03555 0.0220209 -3.14591 1 0 1 1 0 0 +EDGE2 390 271 -0.00725568 -1.01953 -1.56742 1 0 1 1 0 0 +EDGE2 390 270 0.0153693 0.027026 -3.1414 1 0 1 1 0 0 +EDGE2 390 290 -0.0397651 0.00710437 -3.12226 1 0 1 1 0 0 +EDGE2 390 389 -1.01488 -0.0552564 -0.0221756 1 0 1 1 0 0 +EDGE2 391 291 0.00143168 -0.0420049 0.00955847 1 0 1 1 0 0 +EDGE2 391 292 1.08159 -0.0181252 0.00874637 1 0 1 1 0 0 +EDGE2 391 272 0.965937 -0.0189699 -0.0287797 1 0 1 1 0 0 +EDGE2 391 271 0.00733498 -0.0755732 0.00749357 1 0 1 1 0 0 +EDGE2 391 270 -1.00297 -0.056683 -1.55761 1 0 1 1 0 0 +EDGE2 391 290 -0.942902 -0.0476502 -1.5751 1 0 1 1 0 0 +EDGE2 391 390 -0.937487 -0.0179805 1.57593 1 0 1 1 0 0 +EDGE2 392 291 -0.987978 -0.0253143 0.0127575 1 0 1 1 0 0 +EDGE2 392 273 1.0282 -0.0394227 0.0123766 1 0 1 1 0 0 +EDGE2 392 293 0.99784 -0.0301356 0.038116 1 0 1 1 0 0 +EDGE2 392 292 -0.00248789 0.0632831 -0.00270278 1 0 1 1 0 0 +EDGE2 392 272 0.0610707 -0.00360162 0.0181424 1 0 1 1 0 0 +EDGE2 392 391 -0.958686 -0.0984037 -0.0314874 1 0 1 1 0 0 +EDGE2 392 271 -1.0025 -0.0475829 0.0450633 1 0 1 1 0 0 +EDGE2 393 294 0.969538 -0.0141526 -0.0132133 1 0 1 1 0 0 +EDGE2 393 274 1.06757 0.00774765 -0.0253892 1 0 1 1 0 0 +EDGE2 393 273 -0.00368196 -0.000783919 -0.0260801 1 0 1 1 0 0 +EDGE2 393 293 0.0230733 0.00879816 -0.0304785 1 0 1 1 0 0 +EDGE2 393 292 -1.01183 -0.0906332 -0.0243033 1 0 1 1 0 0 +EDGE2 393 392 -1.0015 -0.00876961 -0.0186097 1 0 1 1 0 0 +EDGE2 393 272 -1.01257 -0.00366692 -0.0187185 1 0 1 1 0 0 +EDGE2 394 393 -0.963741 -0.0262988 -0.0347051 1 0 1 1 0 0 +EDGE2 394 315 0.932492 -0.0378351 -3.16234 1 0 1 1 0 0 +EDGE2 394 275 1.02288 -0.0282636 -0.0356328 1 0 1 1 0 0 +EDGE2 394 295 0.992465 0.11558 0.0417468 1 0 1 1 0 0 +EDGE2 394 294 0.0673369 0.0455908 -0.011152 1 0 1 1 0 0 +EDGE2 394 274 -0.0258534 -0.0276761 -0.00690655 1 0 1 1 0 0 +EDGE2 394 273 -0.958047 0.0750083 -0.0110016 1 0 1 1 0 0 +EDGE2 394 293 -0.99065 0.0142468 0.0151325 1 0 1 1 0 0 +EDGE2 395 314 0.990476 -0.0596721 -3.14332 1 0 1 1 0 0 +EDGE2 395 296 -0.0982759 0.956943 1.53902 1 0 1 1 0 0 +EDGE2 395 276 0.0459252 1.06409 1.55013 1 0 1 1 0 0 +EDGE2 395 315 -0.000110456 -8.84263e-05 -3.14365 1 0 1 1 0 0 +EDGE2 395 275 0.00305935 -0.00865493 -0.0340535 1 0 1 1 0 0 +EDGE2 395 295 0.0122091 -0.102376 0.0274174 1 0 1 1 0 0 +EDGE2 395 294 -0.973697 -0.00738927 0.0333712 1 0 1 1 0 0 +EDGE2 395 394 -1.03117 0.0611183 -0.0067367 1 0 1 1 0 0 +EDGE2 395 274 -1.01239 -0.0537659 0.00386308 1 0 1 1 0 0 +EDGE2 395 316 -0.00770119 -1.01791 -1.56759 1 0 1 1 0 0 +EDGE2 396 277 1.03807 0.037971 -0.00933334 1 0 1 1 0 0 +EDGE2 396 297 1.00057 -0.0453342 -0.00907743 1 0 1 1 0 0 +EDGE2 396 296 0.118825 -0.108928 0.015271 1 0 1 1 0 0 +EDGE2 396 276 0.0238572 -0.0524425 -0.0121166 1 0 1 1 0 0 +EDGE2 396 315 -1.00848 0.0101279 1.55233 1 0 1 1 0 0 +EDGE2 396 395 -0.985861 -0.0187637 -1.5586 1 0 1 1 0 0 +EDGE2 396 275 -0.984653 0.0116726 -1.56425 1 0 1 1 0 0 +EDGE2 396 295 -0.956267 -0.035933 -1.59047 1 0 1 1 0 0 +EDGE2 397 298 0.965909 0.0394194 -0.0277357 1 0 1 1 0 0 +EDGE2 397 278 1.00364 -0.0758156 0.0294329 1 0 1 1 0 0 +EDGE2 397 277 -0.0420576 0.00782648 0.0166643 1 0 1 1 0 0 +EDGE2 397 297 -0.0759503 -0.0527378 0.0155635 1 0 1 1 0 0 +EDGE2 397 296 -0.985929 0.0231642 0.000433182 1 0 1 1 0 0 +EDGE2 397 396 -0.93422 -0.0258763 -0.00815082 1 0 1 1 0 0 +EDGE2 397 276 -0.969872 -0.0137338 0.0477529 1 0 1 1 0 0 +EDGE2 398 299 0.969004 -0.0489374 0.00162505 1 0 1 1 0 0 +EDGE2 398 279 0.950668 -0.0310186 -0.0402736 1 0 1 1 0 0 +EDGE2 398 298 0.0222554 -0.022611 0.00440518 1 0 1 1 0 0 +EDGE2 398 278 0.067119 -0.118914 -0.00302677 1 0 1 1 0 0 +EDGE2 398 277 -1.01946 0.0805687 -0.0134116 1 0 1 1 0 0 +EDGE2 398 297 -1.02483 -0.0172231 -0.042952 1 0 1 1 0 0 +EDGE2 398 397 -0.987823 -0.0286812 -0.0176777 1 0 1 1 0 0 +EDGE2 399 300 1.05642 -0.0467444 0.0143938 1 0 1 1 0 0 +EDGE2 399 280 1.05891 -0.0235513 0.00838631 1 0 1 1 0 0 +EDGE2 399 299 0.0603464 0.000595639 0.00845742 1 0 1 1 0 0 +EDGE2 399 279 -0.0662669 -0.0504379 -0.00148319 1 0 1 1 0 0 +EDGE2 399 298 -0.964816 0.0822421 -0.0167203 1 0 1 1 0 0 +EDGE2 399 398 -0.99516 -0.0532776 -0.0196761 1 0 1 1 0 0 +EDGE2 399 278 -1.01657 -0.0206543 -0.00732686 1 0 1 1 0 0 +EDGE2 400 301 -0.00769194 -1.07002 -1.52345 1 0 1 1 0 0 +EDGE2 400 300 -0.0588222 -0.027229 0.018227 1 0 1 1 0 0 +EDGE2 400 280 -0.0514894 -0.0590976 -0.0194785 1 0 1 1 0 0 +EDGE2 400 281 -0.00631447 0.992758 1.57559 1 0 1 1 0 0 +EDGE2 400 299 -1.0863 0.0215277 0.00410338 1 0 1 1 0 0 +EDGE2 400 399 -0.988756 0.0709737 -0.00664373 1 0 1 1 0 0 +EDGE2 400 279 -1.04386 0.063806 -0.0147586 1 0 1 1 0 0 +EDGE2 401 300 -1.02039 -0.117326 -1.55106 1 0 1 1 0 0 +EDGE2 401 400 -0.996828 -0.0485079 -1.54549 1 0 1 1 0 0 +EDGE2 401 280 -0.924051 -0.102498 -1.54676 1 0 1 1 0 0 +EDGE2 401 281 -0.00830927 -0.0302051 0.0175871 1 0 1 1 0 0 +EDGE2 401 282 1.03595 0.0226039 0.00271425 1 0 1 1 0 0 +EDGE2 402 401 -1.06241 -0.0172928 -0.0420496 1 0 1 1 0 0 +EDGE2 402 281 -1.00809 0.059007 0.0314411 1 0 1 1 0 0 +EDGE2 402 282 0.109501 -0.0508234 0.000640207 1 0 1 1 0 0 +EDGE2 402 283 0.979544 0.00597726 0.00377608 1 0 1 1 0 0 +EDGE2 403 402 -0.975695 -0.0193793 0.0323733 1 0 1 1 0 0 +EDGE2 403 282 -1.04533 -0.0731718 -0.0218801 1 0 1 1 0 0 +EDGE2 403 283 0.0701018 0.0140047 0.0212082 1 0 1 1 0 0 +EDGE2 403 284 0.92545 0.0144972 -0.0403596 1 0 1 1 0 0 +EDGE2 404 403 -1.04233 0.0419434 -0.0280921 1 0 1 1 0 0 +EDGE2 404 283 -0.973112 -0.0152834 0.0214656 1 0 1 1 0 0 +EDGE2 404 284 0.0295888 0.029396 -0.0211266 1 0 1 1 0 0 +EDGE2 404 265 1.03593 -0.0455672 -3.15484 1 0 1 1 0 0 +EDGE2 404 285 1.0287 0.0555355 -0.00126819 1 0 1 1 0 0 +EDGE2 405 404 -0.961626 -0.0283054 0.0048833 1 0 1 1 0 0 +EDGE2 405 284 -0.989718 -0.0588675 0.0262578 1 0 1 1 0 0 +EDGE2 405 265 -0.000434581 0.0815604 -3.1312 1 0 1 1 0 0 +EDGE2 405 285 0.0844701 0.0174903 0.0266762 1 0 1 1 0 0 +EDGE2 405 264 1.07777 0.0697797 -3.13994 1 0 1 1 0 0 +EDGE2 405 266 0.0639083 1.02362 1.58372 1 0 1 1 0 0 +EDGE2 405 286 0.0013909 1.04571 1.57553 1 0 1 1 0 0 +EDGE2 406 265 -0.93499 0.111172 1.57294 1 0 1 1 0 0 +EDGE2 406 405 -1.04006 -0.0534447 -1.54906 1 0 1 1 0 0 +EDGE2 406 285 -1.03347 -0.001634 -1.58179 1 0 1 1 0 0 +EDGE2 406 266 -0.0792315 -0.0129972 0.00780597 1 0 1 1 0 0 +EDGE2 406 286 -0.0763399 -0.0672026 -0.0343862 1 0 1 1 0 0 +EDGE2 406 287 0.946716 0.00630445 -0.00487778 1 0 1 1 0 0 +EDGE2 406 267 1.04409 -0.0143213 0.0072643 1 0 1 1 0 0 +EDGE2 407 266 -0.976063 -0.0220643 -0.0100104 1 0 1 1 0 0 +EDGE2 407 286 -0.992783 -0.0227853 -0.00567047 1 0 1 1 0 0 +EDGE2 407 406 -1.00749 -0.0281447 -0.0382447 1 0 1 1 0 0 +EDGE2 407 287 0.0356504 -0.055142 0.00861543 1 0 1 1 0 0 +EDGE2 407 267 0.0251154 0.0671007 -0.0245662 1 0 1 1 0 0 +EDGE2 407 268 1.02945 0.0857917 0.0160796 1 0 1 1 0 0 +EDGE2 407 288 1.04303 -0.0305692 0.000871149 1 0 1 1 0 0 +EDGE2 408 287 -0.95197 0.010936 -0.0151983 1 0 1 1 0 0 +EDGE2 408 407 -1.00367 0.0866996 -0.00630845 1 0 1 1 0 0 +EDGE2 408 267 -0.946167 0.0366834 -0.0210108 1 0 1 1 0 0 +EDGE2 408 269 1.03767 -0.0435419 -0.000416206 1 0 1 1 0 0 +EDGE2 408 268 -0.037118 0.0371986 0.020695 1 0 1 1 0 0 +EDGE2 408 288 -0.0404548 0.0517828 0.0137088 1 0 1 1 0 0 +EDGE2 408 289 1.00428 -0.0166745 0.00872011 1 0 1 1 0 0 +EDGE2 409 269 0.0320748 0.0448723 -0.00428824 1 0 1 1 0 0 +EDGE2 409 268 -0.985953 -0.0173314 0.0270149 1 0 1 1 0 0 +EDGE2 409 408 -1.00629 -0.0647396 0.0229831 1 0 1 1 0 0 +EDGE2 409 288 -0.987059 0.0727707 -0.0198976 1 0 1 1 0 0 +EDGE2 409 289 -0.0105562 -0.0570495 -0.00602649 1 0 1 1 0 0 +EDGE2 409 270 0.926415 -0.0230645 0.0250978 1 0 1 1 0 0 +EDGE2 409 290 0.958863 -0.0457894 0.0115589 1 0 1 1 0 0 +EDGE2 409 390 0.951704 -0.0112857 -3.12417 1 0 1 1 0 0 +EDGE2 410 291 -0.00817069 1.03715 1.55268 1 0 1 1 0 0 +EDGE2 410 391 -0.11099 0.930196 1.59229 1 0 1 1 0 0 +EDGE2 410 269 -1.02226 -0.057801 -0.00369232 1 0 1 1 0 0 +EDGE2 410 409 -0.967249 0.0771033 -0.00626901 1 0 1 1 0 0 +EDGE2 410 289 -0.998982 0.0124947 -0.00279266 1 0 1 1 0 0 +EDGE2 410 271 -0.0941339 0.999089 1.57488 1 0 1 1 0 0 +EDGE2 410 270 -0.0335496 -0.0103659 0.0177094 1 0 1 1 0 0 +EDGE2 410 290 0.00763521 -0.0265706 -0.0211899 1 0 1 1 0 0 +EDGE2 410 390 0.0224986 0.00141077 -3.13901 1 0 1 1 0 0 +EDGE2 410 389 0.941409 -0.0241968 -3.11166 1 0 1 1 0 0 +EDGE2 411 291 0.0638323 -0.0370818 0.00972919 1 0 1 1 0 0 +EDGE2 411 292 1.01343 0.0604151 -0.0135533 1 0 1 1 0 0 +EDGE2 411 392 0.970575 -0.0408039 -0.00355515 1 0 1 1 0 0 +EDGE2 411 272 0.960021 -0.0761845 0.0374773 1 0 1 1 0 0 +EDGE2 411 391 0.0746437 0.0734977 -0.00742588 1 0 1 1 0 0 +EDGE2 411 410 -0.985818 0.011017 -1.54929 1 0 1 1 0 0 +EDGE2 411 271 0.00734958 0.0263961 0.0163084 1 0 1 1 0 0 +EDGE2 411 270 -1.03614 0.0569313 -1.56637 1 0 1 1 0 0 +EDGE2 411 290 -1.05664 -0.0450869 -1.56302 1 0 1 1 0 0 +EDGE2 411 390 -0.956331 0.0379009 1.56015 1 0 1 1 0 0 +EDGE2 412 291 -0.982371 0.0668362 0.00933447 1 0 1 1 0 0 +EDGE2 412 393 1.02941 -0.00649172 -0.0126765 1 0 1 1 0 0 +EDGE2 412 273 1.03903 -0.00926258 -0.0280532 1 0 1 1 0 0 +EDGE2 412 293 0.992544 0.0510683 -0.00898946 1 0 1 1 0 0 +EDGE2 412 292 -0.0281516 -0.00856799 0.044246 1 0 1 1 0 0 +EDGE2 412 392 -0.0994081 -0.0218833 0.0178213 1 0 1 1 0 0 +EDGE2 412 272 0.0257364 0.0410079 0.00554306 1 0 1 1 0 0 +EDGE2 412 411 -0.944627 0.00409748 0.00516683 1 0 1 1 0 0 +EDGE2 412 391 -0.978216 0.0328626 -0.00168747 1 0 1 1 0 0 +EDGE2 412 271 -0.997363 -0.092394 0.00347311 1 0 1 1 0 0 +EDGE2 413 393 -0.0209156 -0.00629927 -0.046631 1 0 1 1 0 0 +EDGE2 413 294 0.932864 0.0323975 -0.00951648 1 0 1 1 0 0 +EDGE2 413 394 0.963944 -0.00108685 0.00299376 1 0 1 1 0 0 +EDGE2 413 274 1.04437 -0.0182894 -0.0153135 1 0 1 1 0 0 +EDGE2 413 273 0.13751 -0.0298871 -0.0339254 1 0 1 1 0 0 +EDGE2 413 293 0.00385683 -0.155331 0.0205533 1 0 1 1 0 0 +EDGE2 413 292 -0.999877 -0.0385669 0.00325125 1 0 1 1 0 0 +EDGE2 413 392 -1.09881 -0.0412981 0.0110831 1 0 1 1 0 0 +EDGE2 413 412 -1.03872 0.0113587 -0.022807 1 0 1 1 0 0 +EDGE2 413 272 -1.03476 0.112331 -0.0305 1 0 1 1 0 0 +EDGE2 414 393 -0.953012 -0.0674484 0.0105198 1 0 1 1 0 0 +EDGE2 414 315 1.0019 -0.102071 -3.19994 1 0 1 1 0 0 +EDGE2 414 395 0.977541 -0.0706743 0.0274817 1 0 1 1 0 0 +EDGE2 414 275 0.999539 0.0883581 -0.0256082 1 0 1 1 0 0 +EDGE2 414 295 0.983793 0.0341411 -0.0194073 1 0 1 1 0 0 +EDGE2 414 294 -0.0265015 -0.0281529 0.0581888 1 0 1 1 0 0 +EDGE2 414 394 0.0260455 0.0259189 0.0135711 1 0 1 1 0 0 +EDGE2 414 274 -0.0557284 0.0470036 0.0216889 1 0 1 1 0 0 +EDGE2 414 413 -1.013 0.00908506 -0.0125998 1 0 1 1 0 0 +EDGE2 414 273 -1.01609 -0.0639205 -0.0351377 1 0 1 1 0 0 +EDGE2 414 293 -1.10821 -0.0646373 -0.0137291 1 0 1 1 0 0 +EDGE2 415 314 1.0321 -0.0125572 -3.14208 1 0 1 1 0 0 +EDGE2 415 296 0.0201452 1.06607 1.57959 1 0 1 1 0 0 +EDGE2 415 396 0.00443425 0.965096 1.58422 1 0 1 1 0 0 +EDGE2 415 276 -0.0160463 1.03444 1.56369 1 0 1 1 0 0 +EDGE2 415 315 0.0459492 0.0355525 -3.15915 1 0 1 1 0 0 +EDGE2 415 395 0.00306508 0.0260917 0.0288994 1 0 1 1 0 0 +EDGE2 415 275 0.0508721 -0.00248724 -0.0249373 1 0 1 1 0 0 +EDGE2 415 295 0.118033 -0.0684033 0.00816212 1 0 1 1 0 0 +EDGE2 415 294 -0.971544 0.0381312 0.00988649 1 0 1 1 0 0 +EDGE2 415 394 -1.10066 -0.153602 -0.0146702 1 0 1 1 0 0 +EDGE2 415 414 -0.960781 -0.0417653 0.0306394 1 0 1 1 0 0 +EDGE2 415 274 -1.00521 -0.0762882 0.00296146 1 0 1 1 0 0 +EDGE2 415 316 -0.0208013 -1.05187 -1.56629 1 0 1 1 0 0 +EDGE2 416 315 -0.98353 -0.04459 -1.57497 1 0 1 1 0 0 +EDGE2 416 415 -1.04585 -0.00487034 1.56824 1 0 1 1 0 0 +EDGE2 416 395 -1.02327 -0.0500214 1.5662 1 0 1 1 0 0 +EDGE2 416 275 -0.922334 0.0870901 1.58121 1 0 1 1 0 0 +EDGE2 416 295 -1.08655 -0.0594535 1.59119 1 0 1 1 0 0 +EDGE2 416 317 1.05598 0.0930426 0.0207128 1 0 1 1 0 0 +EDGE2 416 316 0.078691 0.0425304 -0.0408022 1 0 1 1 0 0 +EDGE2 417 318 1.0254 -0.0976616 0.0219228 1 0 1 1 0 0 +EDGE2 417 416 -1.03329 -3.44934e-05 0.0167236 1 0 1 1 0 0 +EDGE2 417 317 -0.00314238 -0.0100424 0.00591819 1 0 1 1 0 0 +EDGE2 417 316 -1.05092 0.00220485 -0.031245 1 0 1 1 0 0 +EDGE2 418 318 -0.0381456 0.0110592 0.00804189 1 0 1 1 0 0 +EDGE2 418 317 -1.02643 -0.0899828 0.00580289 1 0 1 1 0 0 +EDGE2 418 417 -1.07691 -0.0447119 0.0188413 1 0 1 1 0 0 +EDGE2 418 319 0.979284 -0.0659658 0.0211492 1 0 1 1 0 0 +EDGE2 419 318 -1.08833 0.0020639 -0.00803414 1 0 1 1 0 0 +EDGE2 419 418 -0.930667 0.0258017 -0.0371241 1 0 1 1 0 0 +EDGE2 419 320 1.08297 -0.000673799 -0.00141634 1 0 1 1 0 0 +EDGE2 419 319 6.66251e-05 -0.0302387 0.0152627 1 0 1 1 0 0 +EDGE2 419 340 1.04013 0.0111132 -3.12769 1 0 1 1 0 0 +EDGE2 419 140 1.01266 -0.0448346 -3.15983 1 0 1 1 0 0 +EDGE2 420 141 0.00115599 -0.975248 -1.57386 1 0 1 1 0 0 +EDGE2 420 320 0.010862 0.067464 -0.0229988 1 0 1 1 0 0 +EDGE2 420 319 -0.990425 -0.00986783 0.0364771 1 0 1 1 0 0 +EDGE2 420 419 -1.01431 0.145655 0.0277826 1 0 1 1 0 0 +EDGE2 420 340 -0.0933427 0.0232274 -3.15484 1 0 1 1 0 0 +EDGE2 420 341 0.00775605 -0.961198 -1.5795 1 0 1 1 0 0 +EDGE2 420 140 0.0473573 0.0505227 -3.1759 1 0 1 1 0 0 +EDGE2 420 321 0.0534989 -1.0127 -1.55849 1 0 1 1 0 0 +EDGE2 420 339 1.03163 -0.0222373 -3.14767 1 0 1 1 0 0 +EDGE2 420 139 0.933672 0.032437 -3.15462 1 0 1 1 0 0 +EDGE2 421 141 -0.0753104 0.0633365 -0.00784697 1 0 1 1 0 0 +EDGE2 421 320 -0.95288 0.0255982 1.56321 1 0 1 1 0 0 +EDGE2 421 420 -0.994866 0.033491 1.56391 1 0 1 1 0 0 +EDGE2 421 340 -1.05143 0.0333671 -1.58425 1 0 1 1 0 0 +EDGE2 421 341 0.0443769 -0.0737338 -0.0289412 1 0 1 1 0 0 +EDGE2 421 140 -0.974181 -0.0208728 -1.56287 1 0 1 1 0 0 +EDGE2 421 321 0.0217976 -0.0830984 -0.0281338 1 0 1 1 0 0 +EDGE2 421 322 1.09642 -0.0775574 -0.0274123 1 0 1 1 0 0 +EDGE2 421 342 0.963119 -0.0202452 -0.00738238 1 0 1 1 0 0 +EDGE2 421 142 1.04695 -0.0413328 -0.02413 1 0 1 1 0 0 +EDGE2 422 141 -1.00581 0.0222474 0.0104856 1 0 1 1 0 0 +EDGE2 422 341 -1.0922 0.0584691 -0.0204582 1 0 1 1 0 0 +EDGE2 422 421 -1.00321 -0.0253556 -0.0345875 1 0 1 1 0 0 +EDGE2 422 321 -1.00448 -0.0212989 -0.000557705 1 0 1 1 0 0 +EDGE2 422 322 0.00227711 0.0326635 -0.00173474 1 0 1 1 0 0 +EDGE2 422 342 0.0295293 0.0105346 -0.00246967 1 0 1 1 0 0 +EDGE2 422 142 0.0610281 -0.00849926 0.0218131 1 0 1 1 0 0 +EDGE2 422 323 1.06342 -0.0220861 0.0281676 1 0 1 1 0 0 +EDGE2 422 343 1.06055 0.0751652 -0.0201539 1 0 1 1 0 0 +EDGE2 422 143 0.984537 -0.0155865 -0.0246457 1 0 1 1 0 0 +EDGE2 423 322 -0.92311 0.0662331 -0.0193578 1 0 1 1 0 0 +EDGE2 423 342 -1.11051 0.0208088 0.0267235 1 0 1 1 0 0 +EDGE2 423 422 -0.912277 0.0182846 -0.0135295 1 0 1 1 0 0 +EDGE2 423 142 -1.06553 -0.00272166 -0.0190838 1 0 1 1 0 0 +EDGE2 423 323 -0.00305581 0.0781719 -0.0109294 1 0 1 1 0 0 +EDGE2 423 343 -0.00988634 0.0632553 0.0183724 1 0 1 1 0 0 +EDGE2 423 143 0.0136251 -0.000180105 -0.0190177 1 0 1 1 0 0 +EDGE2 423 144 0.956043 -0.0405788 -0.0344956 1 0 1 1 0 0 +EDGE2 423 324 1.06309 0.025011 0.0094149 1 0 1 1 0 0 +EDGE2 423 344 1.03922 -0.0469242 -0.0145056 1 0 1 1 0 0 +EDGE2 424 423 -0.985002 0.0570452 -0.0263372 1 0 1 1 0 0 +EDGE2 424 323 -1.00079 0.0585445 0.0108254 1 0 1 1 0 0 +EDGE2 424 343 -0.943133 0.0210539 -0.0143774 1 0 1 1 0 0 +EDGE2 424 143 -0.977883 0.0274548 -0.0204391 1 0 1 1 0 0 +EDGE2 424 145 1.04106 0.00541972 0.000561592 1 0 1 1 0 0 +EDGE2 424 385 0.943302 0.0109976 -3.14573 1 0 1 1 0 0 +EDGE2 424 144 0.0150208 0.0295538 0.0123307 1 0 1 1 0 0 +EDGE2 424 324 -0.0243331 -0.101958 0.0175719 1 0 1 1 0 0 +EDGE2 424 344 -0.0286902 0.0282225 -0.00165669 1 0 1 1 0 0 +EDGE2 424 325 1.08791 -0.0500762 0.0161541 1 0 1 1 0 0 +EDGE2 424 345 1.03481 -0.00295701 -0.0339705 1 0 1 1 0 0 +EDGE2 425 424 -0.937653 0.00741667 0.00554876 1 0 1 1 0 0 +EDGE2 425 386 0.0483192 -1.04517 -1.56714 1 0 1 1 0 0 +EDGE2 425 146 0.0113296 1.10938 1.60171 1 0 1 1 0 0 +EDGE2 425 145 0.0339705 -0.0655518 -0.0036138 1 0 1 1 0 0 +EDGE2 425 385 0.0320938 -0.0756513 -3.13152 1 0 1 1 0 0 +EDGE2 425 144 -1.05808 0.0189543 -0.00161667 1 0 1 1 0 0 +EDGE2 425 324 -0.881631 -0.0132843 0.0142901 1 0 1 1 0 0 +EDGE2 425 344 -0.994641 -0.044348 -0.0204806 1 0 1 1 0 0 +EDGE2 425 325 -0.00800763 0.0126933 0.00261598 1 0 1 1 0 0 +EDGE2 425 345 -0.0255809 -0.0543475 -0.0451564 1 0 1 1 0 0 +EDGE2 425 384 1.0095 0.0237787 -3.1304 1 0 1 1 0 0 +EDGE2 425 346 0.0116731 1.03138 1.5719 1 0 1 1 0 0 +EDGE2 425 326 -0.00575737 0.920077 1.56513 1 0 1 1 0 0 +EDGE2 426 387 0.951208 0.00853007 -0.000373422 1 0 1 1 0 0 +EDGE2 426 386 -0.00331965 0.0077678 0.0221017 1 0 1 1 0 0 +EDGE2 426 145 -0.988662 0.024096 1.57814 1 0 1 1 0 0 +EDGE2 426 385 -0.977278 -0.0355083 -1.56445 1 0 1 1 0 0 +EDGE2 426 425 -0.950093 -0.014241 1.54989 1 0 1 1 0 0 +EDGE2 426 325 -1.02956 -0.00916487 1.56273 1 0 1 1 0 0 +EDGE2 426 345 -0.967347 -0.0177166 1.56184 1 0 1 1 0 0 +EDGE2 427 387 -0.082561 0.0069733 -0.00473986 1 0 1 1 0 0 +EDGE2 427 388 0.994141 0.0430846 -0.0516436 1 0 1 1 0 0 +EDGE2 427 386 -0.995803 -0.0982427 0.0218289 1 0 1 1 0 0 +EDGE2 427 426 -1.06865 0.117396 -0.00261297 1 0 1 1 0 0 +EDGE2 428 389 1.05279 -0.0606238 -0.0206395 1 0 1 1 0 0 +EDGE2 428 387 -0.978446 -0.00129109 -0.0100595 1 0 1 1 0 0 +EDGE2 428 388 -0.0383529 -0.0476912 0.0114217 1 0 1 1 0 0 +EDGE2 428 427 -0.993522 0.0560569 -0.0139039 1 0 1 1 0 0 +EDGE2 429 410 0.954027 0.0462855 -3.1415 1 0 1 1 0 0 +EDGE2 429 270 0.944692 0.0325477 -3.11726 1 0 1 1 0 0 +EDGE2 429 290 0.980579 0.0279955 -3.1392 1 0 1 1 0 0 +EDGE2 429 390 0.989336 0.0610925 0.0208771 1 0 1 1 0 0 +EDGE2 429 389 -0.0532412 -0.0604126 -0.0464942 1 0 1 1 0 0 +EDGE2 429 388 -1.08369 -0.0153959 0.00644926 1 0 1 1 0 0 +EDGE2 429 428 -0.951417 0.0428014 -0.0315984 1 0 1 1 0 0 +EDGE2 430 291 0.0536281 -1.06207 -1.52951 1 0 1 1 0 0 +EDGE2 430 411 -0.0261892 -1.06065 -1.56709 1 0 1 1 0 0 +EDGE2 430 391 -0.0190288 -1.00103 -1.58286 1 0 1 1 0 0 +EDGE2 430 269 1.06603 -0.0481866 -3.16148 1 0 1 1 0 0 +EDGE2 430 409 1.00626 -0.00164712 -3.1632 1 0 1 1 0 0 +EDGE2 430 289 0.953803 0.0664871 -3.15403 1 0 1 1 0 0 +EDGE2 430 410 0.0315166 0.0955379 -3.12464 1 0 1 1 0 0 +EDGE2 430 271 0.0429293 -1.04667 -1.5766 1 0 1 1 0 0 +EDGE2 430 270 0.0956272 -0.0465573 -3.15111 1 0 1 1 0 0 +EDGE2 430 290 -0.0678121 -0.00725409 -3.14838 1 0 1 1 0 0 +EDGE2 430 390 -0.0138044 -0.0289291 0.00274291 1 0 1 1 0 0 +EDGE2 430 389 -0.982039 0.0480142 0.00230263 1 0 1 1 0 0 +EDGE2 430 429 -1.06662 0.0100184 -0.022387 1 0 1 1 0 0 +EDGE2 431 291 -0.0146081 -0.0676071 -0.00894301 1 0 1 1 0 0 +EDGE2 431 292 1.00329 0.0589661 -0.0113483 1 0 1 1 0 0 +EDGE2 431 392 0.983933 -0.00466383 -0.00889187 1 0 1 1 0 0 +EDGE2 431 412 0.967611 -0.0135121 0.0210574 1 0 1 1 0 0 +EDGE2 431 272 1.02146 0.0222625 0.0188772 1 0 1 1 0 0 +EDGE2 431 411 -0.00711455 0.0395357 0.0137749 1 0 1 1 0 0 +EDGE2 431 391 0.0241157 0.0109988 0.0290978 1 0 1 1 0 0 +EDGE2 431 410 -0.976602 0.049946 -1.58533 1 0 1 1 0 0 +EDGE2 431 271 -0.0302079 -0.0394397 0.0140468 1 0 1 1 0 0 +EDGE2 431 430 -0.994052 0.0856247 1.56779 1 0 1 1 0 0 +EDGE2 431 270 -0.9968 -0.00228166 -1.54349 1 0 1 1 0 0 +EDGE2 431 290 -1.01572 -0.0703041 -1.58509 1 0 1 1 0 0 +EDGE2 431 390 -0.953979 -0.0595501 1.59855 1 0 1 1 0 0 +EDGE2 432 291 -0.994697 0.0633445 -0.00559648 1 0 1 1 0 0 +EDGE2 432 393 0.97625 -0.0160676 0.0247749 1 0 1 1 0 0 +EDGE2 432 413 1.00659 0.048552 -0.0154007 1 0 1 1 0 0 +EDGE2 432 273 0.992259 -0.0662628 0.0463762 1 0 1 1 0 0 +EDGE2 432 293 1.02112 -0.173164 -0.010645 1 0 1 1 0 0 +EDGE2 432 292 -0.0119793 -0.0502029 0.0278385 1 0 1 1 0 0 +EDGE2 432 392 -0.0470653 -0.00689562 0.0387982 1 0 1 1 0 0 +EDGE2 432 412 -0.0443229 0.0103538 -0.0354382 1 0 1 1 0 0 +EDGE2 432 272 0.00692605 -0.0044565 -0.0464933 1 0 1 1 0 0 +EDGE2 432 411 -1.01337 -0.0183429 0.00275541 1 0 1 1 0 0 +EDGE2 432 431 -1.01848 0.00789801 -0.0143994 1 0 1 1 0 0 +EDGE2 432 391 -1.04085 0.0128069 0.00176517 1 0 1 1 0 0 +EDGE2 432 271 -1.1308 -0.0380164 0.0166144 1 0 1 1 0 0 +EDGE2 433 393 0.0228745 0.0571573 -0.00786634 1 0 1 1 0 0 +EDGE2 433 294 0.997543 -0.0086591 -0.00507047 1 0 1 1 0 0 +EDGE2 433 394 0.922443 -0.0503574 0.0412534 1 0 1 1 0 0 +EDGE2 433 414 0.974876 0.0041872 0.00120395 1 0 1 1 0 0 +EDGE2 433 274 1.04563 -0.00809485 0.00244944 1 0 1 1 0 0 +EDGE2 433 413 0.0496567 -0.0219755 0.0244117 1 0 1 1 0 0 +EDGE2 433 432 -1.11421 0.0321778 0.00613244 1 0 1 1 0 0 +EDGE2 433 273 -0.0186047 0.106428 0.00120338 1 0 1 1 0 0 +EDGE2 433 293 0.00484888 -0.00513634 -0.00898195 1 0 1 1 0 0 +EDGE2 433 292 -0.973858 0.0162031 0.00832047 1 0 1 1 0 0 +EDGE2 433 392 -1.04281 -0.0129204 0.048678 1 0 1 1 0 0 +EDGE2 433 412 -0.960465 0.0740139 -0.0533772 1 0 1 1 0 0 +EDGE2 433 272 -0.992142 -0.000712389 0.0127361 1 0 1 1 0 0 +EDGE2 434 393 -1.06783 -0.0473128 0.00329004 1 0 1 1 0 0 +EDGE2 434 315 0.989285 -0.0680893 -3.1291 1 0 1 1 0 0 +EDGE2 434 415 0.944833 0.091274 0.0122416 1 0 1 1 0 0 +EDGE2 434 395 0.859213 -0.0679104 0.00253849 1 0 1 1 0 0 +EDGE2 434 275 0.985762 0.108017 0.00652878 1 0 1 1 0 0 +EDGE2 434 295 1.02425 0.023922 -0.00637856 1 0 1 1 0 0 +EDGE2 434 294 -0.0627739 0.0427211 -0.00676333 1 0 1 1 0 0 +EDGE2 434 394 -0.00773736 -0.00536491 0.000716177 1 0 1 1 0 0 +EDGE2 434 414 0.0177597 -0.0516485 0.0081864 1 0 1 1 0 0 +EDGE2 434 274 0.0598589 -0.00505446 0.031619 1 0 1 1 0 0 +EDGE2 434 433 -0.977727 0.0571677 -0.0358187 1 0 1 1 0 0 +EDGE2 434 413 -0.848457 -0.0450688 -0.0233585 1 0 1 1 0 0 +EDGE2 434 273 -1.04143 0.0505249 0.00762339 1 0 1 1 0 0 +EDGE2 434 293 -1.02352 0.0122544 0.00523087 1 0 1 1 0 0 +EDGE2 435 314 1.01015 -0.0390475 -3.13322 1 0 1 1 0 0 +EDGE2 435 296 0.0147992 1.01844 1.53964 1 0 1 1 0 0 +EDGE2 435 396 -0.0668458 0.967524 1.57215 1 0 1 1 0 0 +EDGE2 435 276 0.0184569 1.01481 1.55592 1 0 1 1 0 0 +EDGE2 435 434 -1.02283 -0.00606474 0.0102586 1 0 1 1 0 0 +EDGE2 435 315 -0.0306231 0.0445257 -3.12718 1 0 1 1 0 0 +EDGE2 435 415 -0.0114773 0.0349867 0.000305147 1 0 1 1 0 0 +EDGE2 435 395 0.0260434 0.00126814 -0.0184081 1 0 1 1 0 0 +EDGE2 435 275 -0.123343 0.0336792 0.0046584 1 0 1 1 0 0 +EDGE2 435 295 0.0533129 0.00184641 0.027792 1 0 1 1 0 0 +EDGE2 435 294 -1.03695 -0.00962191 -0.0275406 1 0 1 1 0 0 +EDGE2 435 394 -1.04338 -0.103554 -0.00964694 1 0 1 1 0 0 +EDGE2 435 414 -1.08269 -0.0033356 0.00557513 1 0 1 1 0 0 +EDGE2 435 274 -0.938282 0.0189882 0.0245234 1 0 1 1 0 0 +EDGE2 435 416 -0.0158179 -1.03966 -1.59999 1 0 1 1 0 0 +EDGE2 435 316 -0.0539843 -0.958963 -1.5369 1 0 1 1 0 0 +EDGE2 436 277 0.98589 -0.0985355 0.0130161 1 0 1 1 0 0 +EDGE2 436 297 0.99197 -0.0245561 -0.0299764 1 0 1 1 0 0 +EDGE2 436 397 1.03279 0.0511763 0.0113872 1 0 1 1 0 0 +EDGE2 436 296 0.0308333 -0.0181116 -0.00811917 1 0 1 1 0 0 +EDGE2 436 396 -0.0354694 -0.0371159 -0.0100388 1 0 1 1 0 0 +EDGE2 436 276 -0.049159 0.0115672 0.00254273 1 0 1 1 0 0 +EDGE2 436 315 -1.04306 -0.017637 1.59929 1 0 1 1 0 0 +EDGE2 436 415 -0.973477 0.0232618 -1.59082 1 0 1 1 0 0 +EDGE2 436 435 -1.02124 -0.0549841 -1.59673 1 0 1 1 0 0 +EDGE2 436 395 -1.06808 0.0789837 -1.5703 1 0 1 1 0 0 +EDGE2 436 275 -1.06147 0.0210697 -1.60362 1 0 1 1 0 0 +EDGE2 436 295 -1.056 0.0292779 -1.59128 1 0 1 1 0 0 +EDGE2 437 298 0.94604 0.0659307 -0.0261681 1 0 1 1 0 0 +EDGE2 437 398 1.03009 -0.0255218 0.032508 1 0 1 1 0 0 +EDGE2 437 278 0.967233 0.00650196 0.0154004 1 0 1 1 0 0 +EDGE2 437 277 0.0234142 0.0033455 0.0181259 1 0 1 1 0 0 +EDGE2 437 297 -0.0136114 0.0831849 -0.0169448 1 0 1 1 0 0 +EDGE2 437 397 0.0101294 -0.048933 -0.0150437 1 0 1 1 0 0 +EDGE2 437 296 -1.02182 -0.0346532 0.00616141 1 0 1 1 0 0 +EDGE2 437 396 -1.01013 0.0425121 0.00690023 1 0 1 1 0 0 +EDGE2 437 436 -1.05851 0.0628964 -0.0285682 1 0 1 1 0 0 +EDGE2 437 276 -0.964115 -0.00508621 -0.0147671 1 0 1 1 0 0 +EDGE2 438 299 1.02536 -0.0660064 -0.0174449 1 0 1 1 0 0 +EDGE2 438 399 0.986677 0.0485557 -0.0367935 1 0 1 1 0 0 +EDGE2 438 279 1.07563 -0.0376673 -0.0284502 1 0 1 1 0 0 +EDGE2 438 298 -0.0345315 0.0340381 -0.0139469 1 0 1 1 0 0 +EDGE2 438 398 0.0735976 -0.0293694 0.0253549 1 0 1 1 0 0 +EDGE2 438 278 0.0149988 0.0358383 -0.014479 1 0 1 1 0 0 +EDGE2 438 437 -0.944354 0.0425956 -0.0175225 1 0 1 1 0 0 +EDGE2 438 277 -0.958002 -0.00583431 0.0019279 1 0 1 1 0 0 +EDGE2 438 297 -1.05103 -0.0342949 0.0202915 1 0 1 1 0 0 +EDGE2 438 397 -0.960981 0.0848987 0.0227999 1 0 1 1 0 0 +EDGE2 439 300 1.02346 -0.130475 0.0203307 1 0 1 1 0 0 +EDGE2 439 400 0.982896 -0.00284861 0.02846 1 0 1 1 0 0 +EDGE2 439 280 0.914478 0.0170343 0.0261958 1 0 1 1 0 0 +EDGE2 439 299 -0.0073332 -0.00499894 -0.00429119 1 0 1 1 0 0 +EDGE2 439 399 0.0142246 0.024772 0.0328883 1 0 1 1 0 0 +EDGE2 439 279 0.0424859 0.0343019 -0.0349778 1 0 1 1 0 0 +EDGE2 439 298 -0.995718 -0.0364842 0.00111827 1 0 1 1 0 0 +EDGE2 439 398 -0.906182 -0.0038096 -0.000730397 1 0 1 1 0 0 +EDGE2 439 438 -1.02327 0.00922843 -0.00860043 1 0 1 1 0 0 +EDGE2 439 278 -0.96485 -0.00220345 0.014672 1 0 1 1 0 0 +EDGE2 440 301 0.0573375 -1.00792 -1.59007 1 0 1 1 0 0 +EDGE2 440 300 -0.0396594 0.0485781 0.0204187 1 0 1 1 0 0 +EDGE2 440 400 -0.0284198 -0.0883054 -0.027303 1 0 1 1 0 0 +EDGE2 440 280 0.0126398 -0.0256312 -0.0252277 1 0 1 1 0 0 +EDGE2 440 401 -0.14479 0.968109 1.56857 1 0 1 1 0 0 +EDGE2 440 281 -0.0724136 1.07618 1.56109 1 0 1 1 0 0 +EDGE2 440 299 -1.02543 0.164132 -0.0230271 1 0 1 1 0 0 +EDGE2 440 439 -1.05389 -0.0797206 -0.0060049 1 0 1 1 0 0 +EDGE2 440 399 -1.02208 -0.0125319 -0.0125868 1 0 1 1 0 0 +EDGE2 440 279 -1.12328 -0.00349084 -0.0344985 1 0 1 1 0 0 +EDGE2 441 300 -1.00936 -0.0121015 -1.54848 1 0 1 1 0 0 +EDGE2 441 400 -1.05231 -0.0378777 -1.59915 1 0 1 1 0 0 +EDGE2 441 440 -0.952447 0.0518874 -1.58936 1 0 1 1 0 0 +EDGE2 441 280 -1.04992 -0.0652287 -1.51724 1 0 1 1 0 0 +EDGE2 441 401 -0.0255912 -0.0397475 -0.000813028 1 0 1 1 0 0 +EDGE2 441 281 0.0589014 -0.0100261 0.00109426 1 0 1 1 0 0 +EDGE2 441 402 1.1541 -0.0189278 -0.0361903 1 0 1 1 0 0 +EDGE2 441 282 1.01384 0.00593399 0.0129759 1 0 1 1 0 0 +EDGE2 442 401 -0.993581 0.0663918 -0.0180726 1 0 1 1 0 0 +EDGE2 442 441 -1.02164 0.00474917 0.0254024 1 0 1 1 0 0 +EDGE2 442 281 -1.02781 0.0241164 -0.0214398 1 0 1 1 0 0 +EDGE2 442 402 -0.0572684 0.0498375 0.00736485 1 0 1 1 0 0 +EDGE2 442 282 -0.00953964 -0.0526534 0.00552118 1 0 1 1 0 0 +EDGE2 442 403 0.973225 -0.00421226 0.0165581 1 0 1 1 0 0 +EDGE2 442 283 0.973804 -0.0154394 -0.0159052 1 0 1 1 0 0 +EDGE2 443 402 -0.959622 -0.0312431 -0.0142844 1 0 1 1 0 0 +EDGE2 443 442 -1.01872 0.00139436 -0.0256598 1 0 1 1 0 0 +EDGE2 443 282 -1.01859 -0.0613935 0.0124112 1 0 1 1 0 0 +EDGE2 443 403 -0.0664919 0.00566359 -0.00573984 1 0 1 1 0 0 +EDGE2 443 283 0.0756211 -0.0115424 -0.00872566 1 0 1 1 0 0 +EDGE2 443 404 0.95004 0.040971 0.0106283 1 0 1 1 0 0 +EDGE2 443 284 1.0291 -0.00429323 0.00206426 1 0 1 1 0 0 +EDGE2 444 403 -0.969641 -0.145183 -0.0189881 1 0 1 1 0 0 +EDGE2 444 443 -1.01481 -0.0387605 0.0321155 1 0 1 1 0 0 +EDGE2 444 283 -1.15457 -0.00682001 -0.0479224 1 0 1 1 0 0 +EDGE2 444 404 0.0224797 -0.0376684 -0.00367627 1 0 1 1 0 0 +EDGE2 444 284 0.0389047 0.0284941 0.0256765 1 0 1 1 0 0 +EDGE2 444 265 1.01891 -0.03295 -3.08872 1 0 1 1 0 0 +EDGE2 444 405 1.05638 -0.042438 -0.0242875 1 0 1 1 0 0 +EDGE2 444 285 1.00787 0.00337815 -0.0195872 1 0 1 1 0 0 +EDGE2 445 404 -0.978702 -0.104544 0.00580469 1 0 1 1 0 0 +EDGE2 445 444 -0.976324 -0.0798205 -0.00186007 1 0 1 1 0 0 +EDGE2 445 284 -0.987009 0.0305191 -0.00162716 1 0 1 1 0 0 +EDGE2 445 265 0.0465159 -0.013797 -3.12586 1 0 1 1 0 0 +EDGE2 445 405 -0.00286836 0.0361794 0.00659384 1 0 1 1 0 0 +EDGE2 445 285 0.0654935 -0.0635299 0.0201743 1 0 1 1 0 0 +EDGE2 445 264 1.10239 -0.0624895 -3.14982 1 0 1 1 0 0 +EDGE2 445 266 0.0788387 0.972397 1.5582 1 0 1 1 0 0 +EDGE2 445 286 0.0226877 1.00838 1.5599 1 0 1 1 0 0 +EDGE2 445 406 0.0396642 0.968138 1.54456 1 0 1 1 0 0 +EDGE2 446 265 -0.914044 0.0391305 1.58302 1 0 1 1 0 0 +EDGE2 446 405 -1.0494 0.121821 -1.52482 1 0 1 1 0 0 +EDGE2 446 445 -0.974621 0.0981328 -1.5604 1 0 1 1 0 0 +EDGE2 446 285 -1.01463 -0.0697148 -1.5558 1 0 1 1 0 0 +EDGE2 446 266 -0.0993909 -0.0368063 0.0223707 1 0 1 1 0 0 +EDGE2 446 286 0.0412377 -0.0430771 0.018153 1 0 1 1 0 0 +EDGE2 446 406 0.104578 -0.0334413 -0.0433217 1 0 1 1 0 0 +EDGE2 446 287 0.979397 0.0411971 -0.0116117 1 0 1 1 0 0 +EDGE2 446 407 0.9123 0.0518003 0.00333906 1 0 1 1 0 0 +EDGE2 446 267 0.97172 0.0496714 0.0131113 1 0 1 1 0 0 +EDGE2 447 446 -0.946238 0.0231346 0.0229653 1 0 1 1 0 0 +EDGE2 447 266 -0.98548 0.0168695 0.0124102 1 0 1 1 0 0 +EDGE2 447 286 -0.940676 0.0673863 -0.00562532 1 0 1 1 0 0 +EDGE2 447 406 -0.997892 -0.039334 -0.0180806 1 0 1 1 0 0 +EDGE2 447 287 -0.0989935 -0.0459611 0.0303817 1 0 1 1 0 0 +EDGE2 447 407 -0.0252861 -0.00298777 0.00821911 1 0 1 1 0 0 +EDGE2 447 267 -0.0149836 -0.0218368 -0.0150936 1 0 1 1 0 0 +EDGE2 447 268 0.993936 0.0535412 0.0448617 1 0 1 1 0 0 +EDGE2 447 408 1.02496 0.011659 -0.00321333 1 0 1 1 0 0 +EDGE2 447 288 1.00291 0.024498 0.0213873 1 0 1 1 0 0 +EDGE2 448 447 -1.1006 0.0197051 -0.00401132 1 0 1 1 0 0 +EDGE2 448 287 -0.980404 0.0164247 -0.0107556 1 0 1 1 0 0 +EDGE2 448 407 -1.0126 0.0537179 0.00248022 1 0 1 1 0 0 +EDGE2 448 267 -0.94535 0.0164369 -0.00981474 1 0 1 1 0 0 +EDGE2 448 269 1.0363 -0.0416107 -0.0196509 1 0 1 1 0 0 +EDGE2 448 268 -0.00491624 0.0817633 -0.0147776 1 0 1 1 0 0 +EDGE2 448 408 -0.0338841 0.064255 0.0172306 1 0 1 1 0 0 +EDGE2 448 288 -0.104642 0.0265867 0.00389304 1 0 1 1 0 0 +EDGE2 448 409 0.991006 0.0541615 -0.0015326 1 0 1 1 0 0 +EDGE2 448 289 0.949224 -0.0233163 0.000721575 1 0 1 1 0 0 +EDGE2 449 269 0.00997954 0.00147049 -0.0128378 1 0 1 1 0 0 +EDGE2 449 268 -1.07732 0.0111604 0.0141952 1 0 1 1 0 0 +EDGE2 449 408 -0.987315 0.0570572 0.0236416 1 0 1 1 0 0 +EDGE2 449 448 -0.931627 0.017677 -0.0204723 1 0 1 1 0 0 +EDGE2 449 288 -0.992418 0.00373589 0.0036468 1 0 1 1 0 0 +EDGE2 449 409 0.0699501 0.0593266 -0.0198273 1 0 1 1 0 0 +EDGE2 449 289 0.0148607 -0.0246144 -0.0254969 1 0 1 1 0 0 +EDGE2 449 410 0.994995 0.0642083 -0.0121872 1 0 1 1 0 0 +EDGE2 449 430 0.993001 0.00575354 -3.15917 1 0 1 1 0 0 +EDGE2 449 270 0.92033 -0.0166392 -0.00179165 1 0 1 1 0 0 +EDGE2 449 290 1.0344 -0.020889 0.0299289 1 0 1 1 0 0 +EDGE2 449 390 1.08714 -0.0425582 -3.159 1 0 1 1 0 0 +EDGE2 450 291 -0.0139498 0.972067 1.53983 1 0 1 1 0 0 +EDGE2 450 411 0.0343607 0.996031 1.58653 1 0 1 1 0 0 +EDGE2 450 431 -0.0598316 0.98606 1.59394 1 0 1 1 0 0 +EDGE2 450 391 0.0142032 0.975114 1.58819 1 0 1 1 0 0 +EDGE2 450 269 -1.08466 0.0465378 0.00409747 1 0 1 1 0 0 +EDGE2 450 409 -0.99529 -0.0240022 -0.0464369 1 0 1 1 0 0 +EDGE2 450 449 -0.931005 0.045658 -0.0115396 1 0 1 1 0 0 +EDGE2 450 289 -0.92776 -0.078995 0.0101649 1 0 1 1 0 0 +EDGE2 450 410 0.0354544 0.0447424 -0.0138109 1 0 1 1 0 0 +EDGE2 450 271 0.124915 0.976054 1.56215 1 0 1 1 0 0 +EDGE2 450 430 0.0700707 0.0575565 -3.19232 1 0 1 1 0 0 +EDGE2 450 270 -0.00982212 -0.0313794 0.0243646 1 0 1 1 0 0 +EDGE2 450 290 0.0717302 -0.105942 -0.00728967 1 0 1 1 0 0 +EDGE2 450 390 -0.0023405 0.0307134 -3.12669 1 0 1 1 0 0 +EDGE2 450 389 1.05646 0.0557127 -3.15666 1 0 1 1 0 0 +EDGE2 450 429 1.10605 0.124821 -3.12674 1 0 1 1 0 0 +EDGE2 451 291 -0.0543524 -0.0304121 -0.05023 1 0 1 1 0 0 +EDGE2 451 432 0.955625 0.0528316 -0.0139686 1 0 1 1 0 0 +EDGE2 451 292 1.02784 0.0406631 0.00946834 1 0 1 1 0 0 +EDGE2 451 392 0.9912 -0.0508126 0.0113504 1 0 1 1 0 0 +EDGE2 451 412 1.03069 0.0083757 0.0109676 1 0 1 1 0 0 +EDGE2 451 272 1.04646 0.0283593 -0.0116831 1 0 1 1 0 0 +EDGE2 451 411 -0.10653 0.066406 -0.00813945 1 0 1 1 0 0 +EDGE2 451 431 -0.0680615 0.0342112 -0.046031 1 0 1 1 0 0 +EDGE2 451 391 0.100471 0.0463599 0.0147048 1 0 1 1 0 0 +EDGE2 451 410 -0.884662 -0.101548 -1.56083 1 0 1 1 0 0 +EDGE2 451 450 -0.94901 0.0121964 -1.55377 1 0 1 1 0 0 +EDGE2 451 271 -0.0678393 0.0508904 0.012011 1 0 1 1 0 0 +EDGE2 451 430 -0.881038 0.036266 1.53562 1 0 1 1 0 0 +EDGE2 451 270 -0.990492 0.0504411 -1.58303 1 0 1 1 0 0 +EDGE2 451 290 -1.05002 -0.00409603 -1.53019 1 0 1 1 0 0 +EDGE2 451 390 -0.941722 0.024229 1.56678 1 0 1 1 0 0 +EDGE2 452 291 -0.946259 -0.00784109 0.0045821 1 0 1 1 0 0 +EDGE2 452 393 0.881875 -0.051469 0.0117054 1 0 1 1 0 0 +EDGE2 452 433 1.05059 0.157634 0.0104151 1 0 1 1 0 0 +EDGE2 452 413 0.985202 0.140465 0.00861688 1 0 1 1 0 0 +EDGE2 452 432 0.0282481 -0.0156812 0.0110931 1 0 1 1 0 0 +EDGE2 452 273 0.902279 0.0840588 -0.00828748 1 0 1 1 0 0 +EDGE2 452 293 0.975106 0.0335735 0.00838324 1 0 1 1 0 0 +EDGE2 452 292 0.0598055 0.011177 -0.0108461 1 0 1 1 0 0 +EDGE2 452 392 -0.0687317 -0.0158611 -0.0283537 1 0 1 1 0 0 +EDGE2 452 412 -0.0113906 -0.0973188 0.0254799 1 0 1 1 0 0 +EDGE2 452 272 0.00366288 -0.0305013 -0.0230223 1 0 1 1 0 0 +EDGE2 452 411 -1.03797 -0.00269094 -0.0190708 1 0 1 1 0 0 +EDGE2 452 431 -1.03687 0.0409927 -0.0424022 1 0 1 1 0 0 +EDGE2 452 451 -1.06447 0.0287356 -0.0272743 1 0 1 1 0 0 +EDGE2 452 391 -0.984328 -0.0231213 -0.031986 1 0 1 1 0 0 +EDGE2 452 271 -0.994481 0.0128304 -0.00467299 1 0 1 1 0 0 +EDGE2 453 393 -0.0508333 0.0254504 0.00423258 1 0 1 1 0 0 +EDGE2 453 434 1.0315 -0.0224388 -0.0447323 1 0 1 1 0 0 +EDGE2 453 294 0.937827 0.0214568 -0.00776117 1 0 1 1 0 0 +EDGE2 453 394 0.946796 -0.0533932 -0.0388368 1 0 1 1 0 0 +EDGE2 453 414 0.913857 0.0400399 0.00406507 1 0 1 1 0 0 +EDGE2 453 274 0.959527 -0.0403285 -0.00704045 1 0 1 1 0 0 +EDGE2 453 433 0.0213519 0.00591115 0.00966202 1 0 1 1 0 0 +EDGE2 453 413 -0.0304088 -0.0941508 -0.0200581 1 0 1 1 0 0 +EDGE2 453 432 -0.948722 -0.0334506 0.0312313 1 0 1 1 0 0 +EDGE2 453 273 -0.0289974 0.0318105 -0.00387149 1 0 1 1 0 0 +EDGE2 453 293 -0.0118367 -0.072431 -0.0209731 1 0 1 1 0 0 +EDGE2 453 452 -0.975467 -0.000111772 -0.0217065 1 0 1 1 0 0 +EDGE2 453 292 -1.05274 0.0150901 -0.014655 1 0 1 1 0 0 +EDGE2 453 392 -0.978456 0.0897502 -0.00700076 1 0 1 1 0 0 +EDGE2 453 412 -0.978461 0.00711817 -0.00646627 1 0 1 1 0 0 +EDGE2 453 272 -1.04439 -0.0590973 -0.00838662 1 0 1 1 0 0 +EDGE2 454 393 -1.03328 -0.0812428 -0.0334823 1 0 1 1 0 0 +EDGE2 454 434 -0.100402 0.0650093 -0.00324144 1 0 1 1 0 0 +EDGE2 454 315 0.935342 -0.0752239 -3.15195 1 0 1 1 0 0 +EDGE2 454 415 0.997644 -0.07038 0.0245577 1 0 1 1 0 0 +EDGE2 454 435 0.976659 -0.0365201 -0.0328801 1 0 1 1 0 0 +EDGE2 454 395 1.05595 0.0054849 0.0116693 1 0 1 1 0 0 +EDGE2 454 275 0.96225 0.0504466 -0.024911 1 0 1 1 0 0 +EDGE2 454 295 0.93705 0.00384831 0.0265144 1 0 1 1 0 0 +EDGE2 454 294 0.0308718 -0.0839611 0.0103412 1 0 1 1 0 0 +EDGE2 454 394 -0.0173086 -0.0521367 0.0237207 1 0 1 1 0 0 +EDGE2 454 414 0.0666142 -0.0490736 0.00824899 1 0 1 1 0 0 +EDGE2 454 274 -0.0618978 -0.0938965 -0.0183516 1 0 1 1 0 0 +EDGE2 454 433 -1.02622 0.0428118 0.0141776 1 0 1 1 0 0 +EDGE2 454 453 -0.904911 -0.0284013 -0.00685749 1 0 1 1 0 0 +EDGE2 454 413 -1.04766 0.0687508 -0.00757832 1 0 1 1 0 0 +EDGE2 454 273 -0.978144 0.0134332 -0.00833443 1 0 1 1 0 0 +EDGE2 454 293 -1.07525 0.0597829 -0.0249159 1 0 1 1 0 0 +EDGE2 455 314 0.977014 -0.0177927 -3.15981 1 0 1 1 0 0 +EDGE2 455 296 -0.084225 0.982105 1.62819 1 0 1 1 0 0 +EDGE2 455 396 0.00613465 1.01223 1.55202 1 0 1 1 0 0 +EDGE2 455 436 0.0740437 1.07937 1.59054 1 0 1 1 0 0 +EDGE2 455 276 -0.00386972 1.04777 1.59381 1 0 1 1 0 0 +EDGE2 455 434 -1.05247 -0.0155408 0.0139703 1 0 1 1 0 0 +EDGE2 455 315 -0.037836 0.035477 -3.10942 1 0 1 1 0 0 +EDGE2 455 415 0.0713599 0.00613067 -0.0127512 1 0 1 1 0 0 +EDGE2 455 435 -0.000435465 -0.00320765 0.028608 1 0 1 1 0 0 +EDGE2 455 395 -0.010936 0.0482571 0.00535934 1 0 1 1 0 0 +EDGE2 455 275 -0.00825978 -0.00999726 0.040209 1 0 1 1 0 0 +EDGE2 455 295 -0.0418579 0.00196469 0.0287798 1 0 1 1 0 0 +EDGE2 455 454 -1.03611 -0.0167848 -0.0232015 1 0 1 1 0 0 +EDGE2 455 294 -0.963855 0.10805 -0.0115365 1 0 1 1 0 0 +EDGE2 455 394 -1.04106 0.136844 0.028868 1 0 1 1 0 0 +EDGE2 455 414 -0.957749 -0.0411543 0.00568492 1 0 1 1 0 0 +EDGE2 455 274 -0.986012 -0.00521992 -0.0480792 1 0 1 1 0 0 +EDGE2 455 416 0.0332467 -0.985601 -1.56319 1 0 1 1 0 0 +EDGE2 455 316 0.00837276 -0.995626 -1.58838 1 0 1 1 0 0 +EDGE2 456 437 1.01116 0.123053 0.00584504 1 0 1 1 0 0 +EDGE2 456 277 1.02988 0.0223239 -0.00537706 1 0 1 1 0 0 +EDGE2 456 297 1.11657 0.0366122 -0.0195261 1 0 1 1 0 0 +EDGE2 456 397 0.928558 -0.00679591 -0.00676148 1 0 1 1 0 0 +EDGE2 456 296 -0.108006 0.00532281 -0.0034934 1 0 1 1 0 0 +EDGE2 456 396 -0.0480721 -0.0356933 -0.010856 1 0 1 1 0 0 +EDGE2 456 436 0.0265332 0.0233809 -0.00848364 1 0 1 1 0 0 +EDGE2 456 276 -0.0593907 -0.000785935 -0.0299645 1 0 1 1 0 0 +EDGE2 456 315 -1.04345 0.0157653 1.54224 1 0 1 1 0 0 +EDGE2 456 415 -0.975751 -0.0182842 -1.56484 1 0 1 1 0 0 +EDGE2 456 435 -0.912843 -0.0280867 -1.60664 1 0 1 1 0 0 +EDGE2 456 455 -1.04386 -0.0347579 -1.57823 1 0 1 1 0 0 +EDGE2 456 395 -1.0497 0.00767642 -1.57718 1 0 1 1 0 0 +EDGE2 456 275 -1.00996 -0.0160247 -1.56881 1 0 1 1 0 0 +EDGE2 456 295 -0.939041 0.00460357 -1.56498 1 0 1 1 0 0 +EDGE2 457 298 1.0533 0.0557931 0.0173787 1 0 1 1 0 0 +EDGE2 457 398 0.996591 -0.0481043 -0.0103921 1 0 1 1 0 0 +EDGE2 457 438 1.03814 0.0819158 -0.00417219 1 0 1 1 0 0 +EDGE2 457 278 0.935274 -0.0236598 -0.00813967 1 0 1 1 0 0 +EDGE2 457 437 -0.00298801 0.0906385 -0.0128929 1 0 1 1 0 0 +EDGE2 457 456 -0.94768 0.0666331 -0.0169531 1 0 1 1 0 0 +EDGE2 457 277 -0.0148038 0.0104062 0.0117937 1 0 1 1 0 0 +EDGE2 457 297 -0.0217267 -0.0243733 -0.0215781 1 0 1 1 0 0 +EDGE2 457 397 -0.0231766 0.0625431 -0.0112556 1 0 1 1 0 0 +EDGE2 457 296 -1.04841 -0.0904273 0.0148037 1 0 1 1 0 0 +EDGE2 457 396 -1.10614 -0.018008 0.0108172 1 0 1 1 0 0 +EDGE2 457 436 -1.00157 0.0410241 -0.0384012 1 0 1 1 0 0 +EDGE2 457 276 -1.04828 -0.0416803 0.0445214 1 0 1 1 0 0 +EDGE2 458 299 1.04774 0.0408617 -0.000178218 1 0 1 1 0 0 +EDGE2 458 439 1.06962 0.0485683 0.0127536 1 0 1 1 0 0 +EDGE2 458 399 1.02505 0.0502376 0.00249366 1 0 1 1 0 0 +EDGE2 458 279 0.883094 0.0505864 -0.00811908 1 0 1 1 0 0 +EDGE2 458 298 0.0321745 -0.0239452 0.000914406 1 0 1 1 0 0 +EDGE2 458 398 0.00169623 0.0135407 0.000656995 1 0 1 1 0 0 +EDGE2 458 438 0.0148311 0.0929293 0.00137246 1 0 1 1 0 0 +EDGE2 458 278 0.0841982 -0.052914 -0.00794753 1 0 1 1 0 0 +EDGE2 458 437 -1.01272 -0.0191958 -1.42409e-06 1 0 1 1 0 0 +EDGE2 458 457 -1.03891 -0.0565493 0.0325851 1 0 1 1 0 0 +EDGE2 458 277 -0.976864 0.022198 -0.0413125 1 0 1 1 0 0 +EDGE2 458 297 -1.00247 0.00573847 -0.011486 1 0 1 1 0 0 +EDGE2 458 397 -1.04369 -0.0128407 -0.0207529 1 0 1 1 0 0 +EDGE2 459 300 0.945818 0.0445222 -0.0202485 1 0 1 1 0 0 +EDGE2 459 400 0.986487 -0.00389061 -0.0159207 1 0 1 1 0 0 +EDGE2 459 440 0.98921 -0.0268321 0.0451162 1 0 1 1 0 0 +EDGE2 459 280 0.953689 -0.0309408 0.0166567 1 0 1 1 0 0 +EDGE2 459 299 0.0930543 -0.0673066 -0.00636594 1 0 1 1 0 0 +EDGE2 459 439 0.0342127 -0.00866239 0.0183817 1 0 1 1 0 0 +EDGE2 459 399 -0.0205745 -0.0010823 -0.0116276 1 0 1 1 0 0 +EDGE2 459 458 -1.05789 -0.0321739 0.00823277 1 0 1 1 0 0 +EDGE2 459 279 -0.0252691 -0.0772359 -0.0422733 1 0 1 1 0 0 +EDGE2 459 298 -0.980786 0.0129743 0.0226611 1 0 1 1 0 0 +EDGE2 459 398 -1.01185 -0.000656116 0.012387 1 0 1 1 0 0 +EDGE2 459 438 -1.05657 0.0361667 0.00465037 1 0 1 1 0 0 +EDGE2 459 278 -1.0594 0.00741261 0.00954283 1 0 1 1 0 0 +EDGE2 460 301 -0.0228636 -0.982149 -1.57267 1 0 1 1 0 0 +EDGE2 460 300 -0.0451319 -0.0181321 -0.00822093 1 0 1 1 0 0 +EDGE2 460 400 0.0715627 0.0522051 0.00514346 1 0 1 1 0 0 +EDGE2 460 440 -0.0149126 0.0445466 -0.0218992 1 0 1 1 0 0 +EDGE2 460 280 0.0683299 -0.0901113 0.00197348 1 0 1 1 0 0 +EDGE2 460 401 0.0417833 1.03434 1.54534 1 0 1 1 0 0 +EDGE2 460 441 0.00469808 0.979823 1.56612 1 0 1 1 0 0 +EDGE2 460 281 -0.0329069 0.994251 1.58427 1 0 1 1 0 0 +EDGE2 460 299 -0.94783 0.0775178 -0.0126183 1 0 1 1 0 0 +EDGE2 460 439 -1.06609 -0.0061966 -0.00597096 1 0 1 1 0 0 +EDGE2 460 459 -1.00967 -0.0102919 0.00119164 1 0 1 1 0 0 +EDGE2 460 399 -0.969981 -0.0603318 -0.00432435 1 0 1 1 0 0 +EDGE2 460 279 -1.06263 0.0369641 -0.0387038 1 0 1 1 0 0 +EDGE2 461 460 -0.949521 0.056313 -1.57608 1 0 1 1 0 0 +EDGE2 461 300 -1.00116 -0.0358253 -1.58204 1 0 1 1 0 0 +EDGE2 461 400 -0.933871 -0.0800557 -1.54344 1 0 1 1 0 0 +EDGE2 461 440 -0.967457 -0.162591 -1.58688 1 0 1 1 0 0 +EDGE2 461 280 -0.937467 0.0789501 -1.59424 1 0 1 1 0 0 +EDGE2 461 401 0.0423324 -0.0169667 0.00808183 1 0 1 1 0 0 +EDGE2 461 441 -0.0471237 -0.0814521 0.00685223 1 0 1 1 0 0 +EDGE2 461 281 0.0267028 -0.034531 -0.000858758 1 0 1 1 0 0 +EDGE2 461 402 0.991432 0.0476524 0.00489405 1 0 1 1 0 0 +EDGE2 461 442 1.04422 0.0697523 -0.00499551 1 0 1 1 0 0 +EDGE2 461 282 0.956296 -0.0307464 0.0371193 1 0 1 1 0 0 +EDGE2 462 401 -0.959848 -0.0696206 -0.0161519 1 0 1 1 0 0 +EDGE2 462 441 -0.992621 0.0208658 -0.00457866 1 0 1 1 0 0 +EDGE2 462 461 -1.02283 -0.0176359 -0.00533183 1 0 1 1 0 0 +EDGE2 462 281 -1.01969 0.0193841 -0.0211096 1 0 1 1 0 0 +EDGE2 462 402 0.0127213 0.100405 -0.0379552 1 0 1 1 0 0 +EDGE2 462 442 0.00732981 0.0988542 0.00199412 1 0 1 1 0 0 +EDGE2 462 282 -0.0154315 0.0836612 -0.0108402 1 0 1 1 0 0 +EDGE2 462 403 1.01918 -0.0161587 -0.011123 1 0 1 1 0 0 +EDGE2 462 443 0.981998 0.0276664 0.0444079 1 0 1 1 0 0 +EDGE2 462 283 0.95792 -0.0230966 0.0137257 1 0 1 1 0 0 +EDGE2 463 402 -0.990636 0.0575992 -0.00474659 1 0 1 1 0 0 +EDGE2 463 442 -0.970288 0.0467768 0.0258911 1 0 1 1 0 0 +EDGE2 463 462 -1.01585 0.0168002 -0.00871378 1 0 1 1 0 0 +EDGE2 463 282 -1.04381 0.0857311 -0.0114768 1 0 1 1 0 0 +EDGE2 463 403 -0.0475471 -0.0034545 -0.00495041 1 0 1 1 0 0 +EDGE2 463 443 0.0296623 0.10299 -0.00583251 1 0 1 1 0 0 +EDGE2 463 283 -0.0417287 -0.0321915 0.0245837 1 0 1 1 0 0 +EDGE2 463 404 0.985739 0.0141753 -0.0172072 1 0 1 1 0 0 +EDGE2 463 444 1.01136 0.0149302 0.0182147 1 0 1 1 0 0 +EDGE2 463 284 1.06383 -0.0101195 0.0224506 1 0 1 1 0 0 +EDGE2 464 403 -1.15938 0.0878801 0.0423359 1 0 1 1 0 0 +EDGE2 464 443 -1.03561 0.0821227 0.0203304 1 0 1 1 0 0 +EDGE2 464 463 -0.975611 0.00138531 0.0189329 1 0 1 1 0 0 +EDGE2 464 283 -0.980535 0.0468369 0.0159172 1 0 1 1 0 0 +EDGE2 464 404 -0.0408218 -0.00052347 0.0369182 1 0 1 1 0 0 +EDGE2 464 444 0.00354073 -0.0441877 -0.0162696 1 0 1 1 0 0 +EDGE2 464 284 -0.0589381 0.0348686 0.0114881 1 0 1 1 0 0 +EDGE2 464 265 0.988641 -0.0432346 -3.10145 1 0 1 1 0 0 +EDGE2 464 405 1.06804 0.00913849 -0.00929745 1 0 1 1 0 0 +EDGE2 464 445 0.91568 -0.0632628 -0.0244015 1 0 1 1 0 0 +EDGE2 464 285 0.963251 0.0249322 -0.0282253 1 0 1 1 0 0 +EDGE2 465 404 -0.974989 0.0604704 -0.00106462 1 0 1 1 0 0 +EDGE2 465 444 -1.00362 -0.0408974 -0.0391572 1 0 1 1 0 0 +EDGE2 465 464 -0.935101 0.0311859 -0.00296031 1 0 1 1 0 0 +EDGE2 465 284 -1.05281 -0.0530008 -0.00220624 1 0 1 1 0 0 +EDGE2 465 265 -0.0400663 0.0370705 -3.16196 1 0 1 1 0 0 +EDGE2 465 405 0.0290833 0.0568207 -0.0201128 1 0 1 1 0 0 +EDGE2 465 445 0.0265374 -0.012954 -0.00769419 1 0 1 1 0 0 +EDGE2 465 285 0.035511 0.0403715 -0.0068923 1 0 1 1 0 0 +EDGE2 465 264 1.02638 -0.00145169 -3.10798 1 0 1 1 0 0 +EDGE2 465 446 0.00793022 1.00666 1.5522 1 0 1 1 0 0 +EDGE2 465 266 -0.0591526 1.05107 1.59316 1 0 1 1 0 0 +EDGE2 465 286 0.0312542 1.02421 1.58407 1 0 1 1 0 0 +EDGE2 465 406 -0.00709496 1.01447 1.5581 1 0 1 1 0 0 +EDGE2 466 265 -1.04247 0.0385332 1.5818 1 0 1 1 0 0 +EDGE2 466 405 -0.937267 0.0411085 -1.57831 1 0 1 1 0 0 +EDGE2 466 445 -0.984603 -0.0143891 -1.56555 1 0 1 1 0 0 +EDGE2 466 465 -0.93862 0.0501904 -1.57971 1 0 1 1 0 0 +EDGE2 466 285 -0.957533 0.0235038 -1.53652 1 0 1 1 0 0 +EDGE2 466 446 -0.0246011 0.0484461 -0.00544587 1 0 1 1 0 0 +EDGE2 466 447 1.0322 -0.0592713 -0.013437 1 0 1 1 0 0 +EDGE2 466 266 0.0353521 -0.0262699 -0.0116705 1 0 1 1 0 0 +EDGE2 466 286 -0.00327816 0.0643384 -0.0195055 1 0 1 1 0 0 +EDGE2 466 406 0.00273727 0.0138327 0.0206918 1 0 1 1 0 0 +EDGE2 466 287 0.955387 -0.0234368 0.00560468 1 0 1 1 0 0 +EDGE2 466 407 1.01396 -0.0403135 0.00679029 1 0 1 1 0 0 +EDGE2 466 267 1.02944 0.0769644 0.0183013 1 0 1 1 0 0 +EDGE2 467 446 -1.03498 0.0182346 0.0241207 1 0 1 1 0 0 +EDGE2 467 466 -1.00475 0.0576656 0.018113 1 0 1 1 0 0 +EDGE2 467 447 -0.0998229 -0.0192592 -0.0113992 1 0 1 1 0 0 +EDGE2 467 266 -0.994529 -0.0631555 0.017978 1 0 1 1 0 0 +EDGE2 467 286 -1.01967 0.0323307 -0.00423457 1 0 1 1 0 0 +EDGE2 467 406 -1.0625 -0.0119716 -0.0369315 1 0 1 1 0 0 +EDGE2 467 287 0.0245008 0.000631678 -0.00218975 1 0 1 1 0 0 +EDGE2 467 407 -0.0079272 0.000415408 -0.0208193 1 0 1 1 0 0 +EDGE2 467 267 0.00111181 -0.0391881 -0.0112085 1 0 1 1 0 0 +EDGE2 467 268 0.848536 -0.0952945 0.0313758 1 0 1 1 0 0 +EDGE2 467 408 1.05931 0.0338294 -0.014211 1 0 1 1 0 0 +EDGE2 467 448 0.983933 0.0982608 0.0119677 1 0 1 1 0 0 +EDGE2 467 288 0.970401 -0.0128628 0.00557446 1 0 1 1 0 0 +EDGE2 468 447 -0.962397 -0.024461 0.022835 1 0 1 1 0 0 +EDGE2 468 467 -1.07503 0.0251469 -0.00785563 1 0 1 1 0 0 +EDGE2 468 287 -1.02307 0.0856082 -0.0497683 1 0 1 1 0 0 +EDGE2 468 407 -0.981723 0.0182746 0.0318029 1 0 1 1 0 0 +EDGE2 468 267 -0.979747 -0.00554669 0.00791403 1 0 1 1 0 0 +EDGE2 468 269 0.946665 0.0222098 -0.0227217 1 0 1 1 0 0 +EDGE2 468 268 0.0975434 -0.0135999 -0.01039 1 0 1 1 0 0 +EDGE2 468 408 -0.0235311 -0.0581779 0.0199354 1 0 1 1 0 0 +EDGE2 468 448 -0.0757718 -0.035996 0.0127887 1 0 1 1 0 0 +EDGE2 468 288 -0.0150015 -0.00134915 -0.0171586 1 0 1 1 0 0 +EDGE2 468 409 1.03421 -0.0321739 0.0244194 1 0 1 1 0 0 +EDGE2 468 449 1.05503 -0.0469719 0.0111984 1 0 1 1 0 0 +EDGE2 468 289 1.03268 -0.0436331 -0.0155993 1 0 1 1 0 0 +EDGE2 469 269 0.0496559 0.0243708 -0.0199295 1 0 1 1 0 0 +EDGE2 469 268 -1.03082 -0.0368617 0.0112512 1 0 1 1 0 0 +EDGE2 469 408 -0.957467 0.0147947 -0.0175395 1 0 1 1 0 0 +EDGE2 469 448 -0.947371 0.0223921 0.00996149 1 0 1 1 0 0 +EDGE2 469 468 -0.942361 -0.011829 0.00187586 1 0 1 1 0 0 +EDGE2 469 288 -0.950225 0.0377636 -0.00212469 1 0 1 1 0 0 +EDGE2 469 409 0.00673086 0.0523558 -0.034059 1 0 1 1 0 0 +EDGE2 469 449 -0.0253244 -0.0608044 -0.0234926 1 0 1 1 0 0 +EDGE2 469 289 -0.0172071 0.0366618 0.00867695 1 0 1 1 0 0 +EDGE2 469 410 1.00331 0.00749529 -0.00450637 1 0 1 1 0 0 +EDGE2 469 450 1.00174 -0.00845049 0.0131021 1 0 1 1 0 0 +EDGE2 469 430 0.932652 -0.0281243 -3.12877 1 0 1 1 0 0 +EDGE2 469 270 0.999693 -0.0742293 0.0258551 1 0 1 1 0 0 +EDGE2 469 290 0.899609 0.0326675 -0.00768527 1 0 1 1 0 0 +EDGE2 469 390 1.00372 0.122102 -3.17103 1 0 1 1 0 0 +EDGE2 470 291 -0.0424295 0.989026 1.5992 1 0 1 1 0 0 +EDGE2 470 411 -0.0557664 1.01875 1.54589 1 0 1 1 0 0 +EDGE2 470 431 -0.100466 0.972939 1.58591 1 0 1 1 0 0 +EDGE2 470 451 -0.059384 1.02132 1.58652 1 0 1 1 0 0 +EDGE2 470 391 0.0434088 0.994949 1.57216 1 0 1 1 0 0 +EDGE2 470 269 -1.02091 -0.0180459 -0.0175484 1 0 1 1 0 0 +EDGE2 470 409 -0.972908 -0.00469047 0.0180961 1 0 1 1 0 0 +EDGE2 470 449 -0.999695 -0.022553 -0.00875391 1 0 1 1 0 0 +EDGE2 470 469 -1.01066 -0.00844905 -0.00340292 1 0 1 1 0 0 +EDGE2 470 289 -0.971827 0.0257057 -0.00672011 1 0 1 1 0 0 +EDGE2 470 410 0.0423763 0.0399283 -0.00231213 1 0 1 1 0 0 +EDGE2 470 450 -0.00142802 0.00325471 -0.00475928 1 0 1 1 0 0 +EDGE2 470 271 -0.177817 0.9578 1.57652 1 0 1 1 0 0 +EDGE2 470 430 0.0795338 0.0109479 -3.12308 1 0 1 1 0 0 +EDGE2 470 270 -0.0440563 0.0149 -0.0298246 1 0 1 1 0 0 +EDGE2 470 290 -0.0343542 0.035285 0.015186 1 0 1 1 0 0 +EDGE2 470 390 -0.029324 -0.0396446 -3.1402 1 0 1 1 0 0 +EDGE2 470 389 0.97101 0.0549752 -3.13479 1 0 1 1 0 0 +EDGE2 470 429 0.994642 0.00768394 -3.11532 1 0 1 1 0 0 +EDGE2 471 291 -0.0112068 -0.043905 0.0134064 1 0 1 1 0 0 +EDGE2 471 432 1.01209 -0.0519289 0.00604219 1 0 1 1 0 0 +EDGE2 471 452 1.03264 -0.042553 0.0232581 1 0 1 1 0 0 +EDGE2 471 292 1.02185 0.0614232 0.0157095 1 0 1 1 0 0 +EDGE2 471 392 0.952195 0.00836238 0.0180609 1 0 1 1 0 0 +EDGE2 471 412 1.03729 -0.0578447 -0.0202007 1 0 1 1 0 0 +EDGE2 471 272 1.03986 -0.0529961 0.0113765 1 0 1 1 0 0 +EDGE2 471 411 -0.0142089 0.030141 -0.00542021 1 0 1 1 0 0 +EDGE2 471 431 0.0670465 0.0159208 -0.00184464 1 0 1 1 0 0 +EDGE2 471 451 0.0936825 -0.0401677 -0.00261365 1 0 1 1 0 0 +EDGE2 471 391 0.0213469 -0.0581333 -0.0138763 1 0 1 1 0 0 +EDGE2 471 410 -1.01312 -0.0522006 -1.54924 1 0 1 1 0 0 +EDGE2 471 450 -1.00306 0.0412276 -1.55017 1 0 1 1 0 0 +EDGE2 471 470 -1.01923 0.00424218 -1.54711 1 0 1 1 0 0 +EDGE2 471 271 -0.0162646 -0.0341463 -0.0252498 1 0 1 1 0 0 +EDGE2 471 430 -1.02681 0.0335858 1.5836 1 0 1 1 0 0 +EDGE2 471 270 -1.06382 -0.00254261 -1.59269 1 0 1 1 0 0 +EDGE2 471 290 -1.01617 0.0359257 -1.55655 1 0 1 1 0 0 +EDGE2 471 390 -1.0447 0.00339461 1.60172 1 0 1 1 0 0 +EDGE2 472 291 -0.997192 0.0106704 0.0187919 1 0 1 1 0 0 +EDGE2 472 393 1.00146 0.0133485 0.00049167 1 0 1 1 0 0 +EDGE2 472 433 0.855407 0.0170123 0.0392604 1 0 1 1 0 0 +EDGE2 472 453 0.991886 0.0701678 0.028299 1 0 1 1 0 0 +EDGE2 472 413 0.993028 -0.084349 -0.0241932 1 0 1 1 0 0 +EDGE2 472 432 -0.117428 0.0116048 -0.0269305 1 0 1 1 0 0 +EDGE2 472 273 1.07018 -0.010739 0.0296578 1 0 1 1 0 0 +EDGE2 472 293 1.03721 0.0476352 0.004412 1 0 1 1 0 0 +EDGE2 472 452 -0.0169409 -0.0580461 0.00946819 1 0 1 1 0 0 +EDGE2 472 471 -0.954836 0.00802338 0.0118941 1 0 1 1 0 0 +EDGE2 472 292 -0.00699131 -0.00310301 -0.0282666 1 0 1 1 0 0 +EDGE2 472 392 -0.0566612 -0.0168737 0.000373502 1 0 1 1 0 0 +EDGE2 472 412 -0.019789 0.0043086 -0.00796988 1 0 1 1 0 0 +EDGE2 472 272 0.0757115 -0.0450337 -0.00325482 1 0 1 1 0 0 +EDGE2 472 411 -0.948893 -0.0937957 0.00103927 1 0 1 1 0 0 +EDGE2 472 431 -1.02453 0.0344506 -0.0171145 1 0 1 1 0 0 +EDGE2 472 451 -1.01577 -0.0146478 0.0119913 1 0 1 1 0 0 +EDGE2 472 391 -1.06674 -0.04798 0.0267172 1 0 1 1 0 0 +EDGE2 472 271 -1.01284 0.0432578 -0.00408537 1 0 1 1 0 0 +EDGE2 473 393 -0.00175316 -0.0017165 -0.0156984 1 0 1 1 0 0 +EDGE2 473 434 0.963613 -0.0168149 0.00905676 1 0 1 1 0 0 +EDGE2 473 454 0.974721 -0.0247152 -0.0182222 1 0 1 1 0 0 +EDGE2 473 294 0.994245 -0.0750885 -0.00402765 1 0 1 1 0 0 +EDGE2 473 394 1.00398 -0.0567483 0.0351891 1 0 1 1 0 0 +EDGE2 473 414 0.9862 0.000518724 -0.0117314 1 0 1 1 0 0 +EDGE2 473 274 0.988873 -0.0986844 0.0165392 1 0 1 1 0 0 +EDGE2 473 433 0.0364973 0.00538556 0.00107193 1 0 1 1 0 0 +EDGE2 473 453 0.106368 0.0939753 -0.0318478 1 0 1 1 0 0 +EDGE2 473 413 -0.0550907 0.0605685 -0.0136222 1 0 1 1 0 0 +EDGE2 473 432 -1.08731 0.0750837 -0.0237217 1 0 1 1 0 0 +EDGE2 473 472 -0.924186 -0.0662142 0.018707 1 0 1 1 0 0 +EDGE2 473 273 0.0673133 -0.0671535 0.0285006 1 0 1 1 0 0 +EDGE2 473 293 -0.0170619 0.0482936 -0.0244456 1 0 1 1 0 0 +EDGE2 473 452 -0.956123 0.0283782 0.0119942 1 0 1 1 0 0 +EDGE2 473 292 -0.903159 0.043719 0.0161696 1 0 1 1 0 0 +EDGE2 473 392 -0.929871 -0.0824524 0.0351541 1 0 1 1 0 0 +EDGE2 473 412 -0.966728 -0.0360701 0.00866717 1 0 1 1 0 0 +EDGE2 473 272 -0.964821 -0.042749 0.0192073 1 0 1 1 0 0 +EDGE2 474 393 -0.897924 -0.000966299 0.03115 1 0 1 1 0 0 +EDGE2 474 434 0.0584854 0.0347169 0.0244887 1 0 1 1 0 0 +EDGE2 474 315 1.00998 -0.00142355 -3.12681 1 0 1 1 0 0 +EDGE2 474 415 0.937564 -0.041871 -0.0200194 1 0 1 1 0 0 +EDGE2 474 435 0.985038 0.0774031 -0.00609844 1 0 1 1 0 0 +EDGE2 474 455 1.01459 -0.0602027 -0.0221085 1 0 1 1 0 0 +EDGE2 474 395 0.996247 0.00190237 0.00415711 1 0 1 1 0 0 +EDGE2 474 275 0.994578 -0.0582238 0.0095167 1 0 1 1 0 0 +EDGE2 474 295 0.948507 0.0104601 -0.0253773 1 0 1 1 0 0 +EDGE2 474 454 0.0150149 -0.0606835 -0.0110646 1 0 1 1 0 0 +EDGE2 474 473 -0.965042 0.0839223 -0.0238122 1 0 1 1 0 0 +EDGE2 474 294 -0.057992 -0.0222618 -0.00332165 1 0 1 1 0 0 +EDGE2 474 394 0.0140196 -0.110806 0.0151999 1 0 1 1 0 0 +EDGE2 474 414 -0.0282921 -0.0427622 -0.0100574 1 0 1 1 0 0 +EDGE2 474 274 -0.00743815 -0.0784496 0.00138919 1 0 1 1 0 0 +EDGE2 474 433 -0.949951 -0.0507464 -0.0147915 1 0 1 1 0 0 +EDGE2 474 453 -0.889484 0.0293951 0.0167891 1 0 1 1 0 0 +EDGE2 474 413 -1.00341 -0.0260931 0.0207753 1 0 1 1 0 0 +EDGE2 474 273 -1.02157 0.0634681 0.0155196 1 0 1 1 0 0 +EDGE2 474 293 -1.04415 0.0772072 -0.0102169 1 0 1 1 0 0 +EDGE2 475 314 1.02249 -0.0707876 -3.13354 1 0 1 1 0 0 +EDGE2 475 456 -0.0122575 1.02573 1.56462 1 0 1 1 0 0 +EDGE2 475 296 0.00953503 1.02268 1.58997 1 0 1 1 0 0 +EDGE2 475 396 0.0229536 0.971829 1.55102 1 0 1 1 0 0 +EDGE2 475 436 0.127841 0.956552 1.59383 1 0 1 1 0 0 +EDGE2 475 276 -0.0932707 0.949109 1.54957 1 0 1 1 0 0 +EDGE2 475 434 -1.03381 -0.00926303 0.00118727 1 0 1 1 0 0 +EDGE2 475 315 0.0559905 -0.0442583 -3.13754 1 0 1 1 0 0 +EDGE2 475 415 -0.0485529 -0.0238094 0.00440616 1 0 1 1 0 0 +EDGE2 475 435 -0.00911078 -0.0061932 -0.00472915 1 0 1 1 0 0 +EDGE2 475 455 -0.0373551 -0.0274354 0.00429621 1 0 1 1 0 0 +EDGE2 475 395 -0.0656847 -0.109181 0.00757409 1 0 1 1 0 0 +EDGE2 475 474 -0.927643 0.000667365 0.00206026 1 0 1 1 0 0 +EDGE2 475 275 0.0201825 0.0819931 0.000719349 1 0 1 1 0 0 +EDGE2 475 295 -0.0246632 -0.00965259 -0.0113642 1 0 1 1 0 0 +EDGE2 475 454 -1.06675 0.0168114 -0.0217368 1 0 1 1 0 0 +EDGE2 475 294 -0.924139 0.0317479 -0.0101379 1 0 1 1 0 0 +EDGE2 475 394 -0.930753 -0.0599537 0.0260956 1 0 1 1 0 0 +EDGE2 475 414 -0.959054 -0.00589602 -0.0426929 1 0 1 1 0 0 +EDGE2 475 274 -0.921229 -0.00256315 0.00170298 1 0 1 1 0 0 +EDGE2 475 416 -0.0235212 -0.970116 -1.58927 1 0 1 1 0 0 +EDGE2 475 316 0.030039 -1.01161 -1.58457 1 0 1 1 0 0 +EDGE2 476 475 -0.973966 -0.0398036 -1.54972 1 0 1 1 0 0 +EDGE2 476 437 1.01512 0.0143135 -0.00037515 1 0 1 1 0 0 +EDGE2 476 457 0.955843 0.0949638 -0.000782172 1 0 1 1 0 0 +EDGE2 476 456 -0.064566 -0.14938 0.00331514 1 0 1 1 0 0 +EDGE2 476 277 0.903127 -0.0433315 0.0333742 1 0 1 1 0 0 +EDGE2 476 297 0.944897 0.0649062 0.0325128 1 0 1 1 0 0 +EDGE2 476 397 1.04678 0.019977 -0.0112282 1 0 1 1 0 0 +EDGE2 476 296 -0.0541652 0.0229532 0.0401401 1 0 1 1 0 0 +EDGE2 476 396 0.00939557 -0.0356356 0.0332762 1 0 1 1 0 0 +EDGE2 476 436 0.0718407 0.0351477 0.0225459 1 0 1 1 0 0 +EDGE2 476 276 0.0509931 0.0746218 0.0210632 1 0 1 1 0 0 +EDGE2 476 315 -0.994918 -0.0157421 1.59179 1 0 1 1 0 0 +EDGE2 476 415 -1.00189 -0.00572981 -1.53201 1 0 1 1 0 0 +EDGE2 476 435 -1.04361 -0.0245676 -1.56586 1 0 1 1 0 0 +EDGE2 476 455 -0.984354 -0.0330616 -1.57273 1 0 1 1 0 0 +EDGE2 476 395 -1.00608 -0.0366693 -1.58574 1 0 1 1 0 0 +EDGE2 476 275 -0.997513 0.092469 -1.55958 1 0 1 1 0 0 +EDGE2 476 295 -1.02925 -0.00764188 -1.58316 1 0 1 1 0 0 +EDGE2 477 458 1.04512 0.000302705 0.00322349 1 0 1 1 0 0 +EDGE2 477 298 0.969222 -0.0720818 -0.0134213 1 0 1 1 0 0 +EDGE2 477 398 1.01861 -0.0647477 0.0287707 1 0 1 1 0 0 +EDGE2 477 438 0.951517 -0.000254983 -0.00230401 1 0 1 1 0 0 +EDGE2 477 278 1.03698 -0.0640462 0.00245127 1 0 1 1 0 0 +EDGE2 477 437 0.0455015 -0.0102436 0.0197156 1 0 1 1 0 0 +EDGE2 477 457 0.0120349 0.0319431 -0.00728526 1 0 1 1 0 0 +EDGE2 477 456 -0.960503 -0.0219684 0.0119775 1 0 1 1 0 0 +EDGE2 477 277 0.0779401 -0.0341038 -0.00475485 1 0 1 1 0 0 +EDGE2 477 297 -0.094242 0.0962671 0.00304293 1 0 1 1 0 0 +EDGE2 477 397 -0.104403 -0.0038786 0.00786937 1 0 1 1 0 0 +EDGE2 477 476 -1.01883 -0.037257 0.0192876 1 0 1 1 0 0 +EDGE2 477 296 -1.04918 0.0818154 -0.0271837 1 0 1 1 0 0 +EDGE2 477 396 -1.00216 0.0281094 0.0135248 1 0 1 1 0 0 +EDGE2 477 436 -0.958554 0.0460128 0.0252001 1 0 1 1 0 0 +EDGE2 477 276 -1.01979 0.0176681 -0.0295772 1 0 1 1 0 0 +EDGE2 478 299 1.03365 -0.0359898 -0.0265083 1 0 1 1 0 0 +EDGE2 478 439 0.986151 0.0195507 -0.00666842 1 0 1 1 0 0 +EDGE2 478 459 1.07413 0.0989139 -0.0336736 1 0 1 1 0 0 +EDGE2 478 399 0.965832 -0.0154359 0.0106558 1 0 1 1 0 0 +EDGE2 478 458 -0.0393824 -0.0333484 -0.0555988 1 0 1 1 0 0 +EDGE2 478 279 0.969251 -0.0149867 0.0284293 1 0 1 1 0 0 +EDGE2 478 298 -0.0302717 0.0054658 -0.0060246 1 0 1 1 0 0 +EDGE2 478 398 -0.0467226 0.0359803 0.00945619 1 0 1 1 0 0 +EDGE2 478 438 0.0333808 0.00249297 0.00261465 1 0 1 1 0 0 +EDGE2 478 278 0.0599204 -0.0840888 -0.00730821 1 0 1 1 0 0 +EDGE2 478 437 -1.04729 -0.0864298 0.0147217 1 0 1 1 0 0 +EDGE2 478 457 -0.851928 0.00709118 -0.035431 1 0 1 1 0 0 +EDGE2 478 477 -1.03471 -0.0342743 -0.0398784 1 0 1 1 0 0 +EDGE2 478 277 -0.929116 0.0659802 0.030891 1 0 1 1 0 0 +EDGE2 478 297 -0.907049 0.0133831 -0.0259583 1 0 1 1 0 0 +EDGE2 478 397 -1.01374 -0.0354279 -0.027386 1 0 1 1 0 0 +EDGE2 479 460 0.998283 0.0153403 0.0178504 1 0 1 1 0 0 +EDGE2 479 300 0.99906 0.0789934 -0.0152939 1 0 1 1 0 0 +EDGE2 479 400 0.995943 -0.0459008 -0.0147038 1 0 1 1 0 0 +EDGE2 479 440 1.00101 -0.0172547 -0.047408 1 0 1 1 0 0 +EDGE2 479 280 0.956941 0.0706587 -0.017533 1 0 1 1 0 0 +EDGE2 479 299 0.0970622 0.0369721 -0.0277379 1 0 1 1 0 0 +EDGE2 479 439 -0.0198138 0.00319115 -0.0245588 1 0 1 1 0 0 +EDGE2 479 459 -0.0375258 0.0437292 0.0109187 1 0 1 1 0 0 +EDGE2 479 399 -0.0844005 -0.00709333 -0.0595156 1 0 1 1 0 0 +EDGE2 479 458 -0.969317 0.0107982 -0.00749786 1 0 1 1 0 0 +EDGE2 479 279 -0.0808747 -0.00058557 -0.0183366 1 0 1 1 0 0 +EDGE2 479 478 -1.00805 0.0361777 -0.0232312 1 0 1 1 0 0 +EDGE2 479 298 -0.96864 -0.02412 -0.00619998 1 0 1 1 0 0 +EDGE2 479 398 -0.97611 -0.0123476 -0.00655501 1 0 1 1 0 0 +EDGE2 479 438 -1.03145 -0.0220788 -0.00441324 1 0 1 1 0 0 +EDGE2 479 278 -1.02405 -0.110459 -0.0134206 1 0 1 1 0 0 +EDGE2 480 460 -0.109717 -0.0278172 -0.0094034 1 0 1 1 0 0 +EDGE2 480 301 -0.0142325 -0.96553 -1.5993 1 0 1 1 0 0 +EDGE2 480 300 0.00140788 0.00914676 0.0040194 1 0 1 1 0 0 +EDGE2 480 400 0.0214309 -0.0277473 -0.0282461 1 0 1 1 0 0 +EDGE2 480 440 -0.0607245 0.00470836 0.0141087 1 0 1 1 0 0 +EDGE2 480 280 0.0513232 0.0682216 -0.00280067 1 0 1 1 0 0 +EDGE2 480 401 0.0546746 0.934682 1.53219 1 0 1 1 0 0 +EDGE2 480 441 -0.0665939 0.981514 1.58699 1 0 1 1 0 0 +EDGE2 480 461 0.0212377 0.938122 1.57327 1 0 1 1 0 0 +EDGE2 480 281 0.067726 0.963712 1.56751 1 0 1 1 0 0 +EDGE2 480 299 -1.00747 0.053364 0.0180442 1 0 1 1 0 0 +EDGE2 480 439 -0.995913 0.0687687 0.0172756 1 0 1 1 0 0 +EDGE2 480 459 -0.997053 -0.0605633 -0.036283 1 0 1 1 0 0 +EDGE2 480 479 -1.09279 -0.0450622 -0.0342868 1 0 1 1 0 0 +EDGE2 480 399 -1.02771 0.00542945 -0.00775711 1 0 1 1 0 0 +EDGE2 480 279 -0.957087 0.0488371 0.0124225 1 0 1 1 0 0 +EDGE2 481 460 -1.01387 -0.0271654 -1.57232 1 0 1 1 0 0 +EDGE2 481 480 -0.969262 0.0180452 -1.55287 1 0 1 1 0 0 +EDGE2 481 300 -0.968035 0.0804712 -1.57731 1 0 1 1 0 0 +EDGE2 481 400 -1.16194 -0.0405169 -1.58915 1 0 1 1 0 0 +EDGE2 481 440 -1.0611 0.0132606 -1.52626 1 0 1 1 0 0 +EDGE2 481 280 -0.989905 -0.076804 -1.56065 1 0 1 1 0 0 +EDGE2 481 401 0.0032874 0.00171203 0.0172824 1 0 1 1 0 0 +EDGE2 481 441 0.0200814 -0.0331508 0.0262313 1 0 1 1 0 0 +EDGE2 481 461 -0.0382333 0.00490823 0.0182962 1 0 1 1 0 0 +EDGE2 481 281 -0.0975046 -0.0128084 0.0296062 1 0 1 1 0 0 +EDGE2 481 402 0.920474 -0.0393793 0.00385348 1 0 1 1 0 0 +EDGE2 481 442 1.01499 -0.0251889 0.0106213 1 0 1 1 0 0 +EDGE2 481 462 0.984214 -0.0658664 0.0245405 1 0 1 1 0 0 +EDGE2 481 282 1.00015 -0.06121 0.0083731 1 0 1 1 0 0 +EDGE2 482 481 -1.02314 -0.0274808 -0.0016445 1 0 1 1 0 0 +EDGE2 482 401 -1.06689 0.0865762 -0.0132356 1 0 1 1 0 0 +EDGE2 482 441 -1.00082 -0.00143207 0.0171891 1 0 1 1 0 0 +EDGE2 482 461 -1.01285 -0.0756753 0.0284893 1 0 1 1 0 0 +EDGE2 482 281 -0.982618 0.0155841 0.0190378 1 0 1 1 0 0 +EDGE2 482 402 0.0750345 -0.0352563 -0.00683578 1 0 1 1 0 0 +EDGE2 482 442 -0.00701584 0.0368343 -0.00806421 1 0 1 1 0 0 +EDGE2 482 462 -0.00153082 0.113895 0.0148763 1 0 1 1 0 0 +EDGE2 482 282 0.0948792 -0.0691473 0.0134294 1 0 1 1 0 0 +EDGE2 482 403 0.972399 0.0235831 -0.0223898 1 0 1 1 0 0 +EDGE2 482 443 0.925097 -0.0764838 -0.00457198 1 0 1 1 0 0 +EDGE2 482 463 1.0071 0.0556113 -0.000287828 1 0 1 1 0 0 +EDGE2 482 283 0.991 -0.111587 -0.0337423 1 0 1 1 0 0 +EDGE2 483 482 -1.0309 -0.0583025 0.00919916 1 0 1 1 0 0 +EDGE2 483 402 -1.053 -0.0201875 0.00977608 1 0 1 1 0 0 +EDGE2 483 442 -0.945368 -0.125329 -0.0376517 1 0 1 1 0 0 +EDGE2 483 462 -1.02574 0.00326289 0.00374313 1 0 1 1 0 0 +EDGE2 483 282 -1.03712 0.0127246 0.0124758 1 0 1 1 0 0 +EDGE2 483 403 -0.0756291 0.0747963 0.0156165 1 0 1 1 0 0 +EDGE2 483 443 -0.00918607 0.0329442 0.0161801 1 0 1 1 0 0 +EDGE2 483 463 0.0141551 0.096843 0.00629651 1 0 1 1 0 0 +EDGE2 483 283 -0.0764608 -0.0778914 0.00678409 1 0 1 1 0 0 +EDGE2 483 404 1.00334 0.0194766 -0.0147213 1 0 1 1 0 0 +EDGE2 483 444 0.960018 -0.0746014 0.0084987 1 0 1 1 0 0 +EDGE2 483 464 0.874492 0.0014948 -0.000736655 1 0 1 1 0 0 +EDGE2 483 284 0.950913 -0.00402423 0.0135045 1 0 1 1 0 0 +EDGE2 484 483 -1.01052 0.120879 0.00592377 1 0 1 1 0 0 +EDGE2 484 403 -0.927732 -0.0435103 -0.019429 1 0 1 1 0 0 +EDGE2 484 443 -0.96827 0.00471318 -0.0084982 1 0 1 1 0 0 +EDGE2 484 463 -1.00044 -0.0225631 -0.000280423 1 0 1 1 0 0 +EDGE2 484 283 -0.992424 0.0185516 -0.0274077 1 0 1 1 0 0 +EDGE2 484 404 -0.0047034 -0.0294269 -0.0276659 1 0 1 1 0 0 +EDGE2 484 444 0.0383978 0.0754218 0.0219984 1 0 1 1 0 0 +EDGE2 484 464 0.0346627 0.0323142 -0.00569008 1 0 1 1 0 0 +EDGE2 484 284 -0.0274275 -0.145985 -0.0579133 1 0 1 1 0 0 +EDGE2 484 265 1.07336 0.00546554 -3.14975 1 0 1 1 0 0 +EDGE2 484 405 1.05761 0.0305455 -0.0131946 1 0 1 1 0 0 +EDGE2 484 445 0.990242 -0.0403448 -0.00322655 1 0 1 1 0 0 +EDGE2 484 465 0.995854 0.0154167 -0.0150945 1 0 1 1 0 0 +EDGE2 484 285 0.951632 0.0258851 -0.0185209 1 0 1 1 0 0 +EDGE2 485 484 -1.0014 0.0181538 0.0136348 1 0 1 1 0 0 +EDGE2 485 404 -1.05103 -0.100205 0.0147438 1 0 1 1 0 0 +EDGE2 485 444 -1.02386 -0.053115 -0.0144264 1 0 1 1 0 0 +EDGE2 485 464 -0.963188 0.0103985 0.0061402 1 0 1 1 0 0 +EDGE2 485 284 -1.06069 -0.0822353 0.0168732 1 0 1 1 0 0 +EDGE2 485 265 -0.0517051 0.0229581 -3.16908 1 0 1 1 0 0 +EDGE2 485 405 -0.0497025 -0.0541812 0.0271796 1 0 1 1 0 0 +EDGE2 485 445 0.0477291 0.00719213 -0.00792194 1 0 1 1 0 0 +EDGE2 485 465 0.064704 0.0727057 -0.00581452 1 0 1 1 0 0 +EDGE2 485 285 0.0322093 -0.0652035 0.00777655 1 0 1 1 0 0 +EDGE2 485 264 1.05909 -0.0836 -3.15089 1 0 1 1 0 0 +EDGE2 485 446 -0.0490789 1.06137 1.58882 1 0 1 1 0 0 +EDGE2 485 466 0.107971 0.964196 1.6 1 0 1 1 0 0 +EDGE2 485 266 -0.0210737 1.0437 1.58416 1 0 1 1 0 0 +EDGE2 485 286 -0.00811129 1.03179 1.57405 1 0 1 1 0 0 +EDGE2 485 406 -0.0770458 0.945526 1.55923 1 0 1 1 0 0 +EDGE2 486 485 -1.02238 -0.0735558 1.57021 1 0 1 1 0 0 +EDGE2 486 265 -1.08388 -0.0162621 -1.61934 1 0 1 1 0 0 +EDGE2 486 405 -1.09049 -0.0541697 1.59895 1 0 1 1 0 0 +EDGE2 486 445 -0.8142 -0.0531846 1.59528 1 0 1 1 0 0 +EDGE2 486 465 -1.00593 0.00735507 1.56347 1 0 1 1 0 0 +EDGE2 486 285 -0.9055 0.00116245 1.5925 1 0 1 1 0 0 +EDGE2 487 486 -1.00535 -0.00791997 0.0286408 1 0 1 1 0 0 +EDGE2 488 487 -1.03463 0.017866 -0.00406235 1 0 1 1 0 0 +EDGE2 489 488 -1.01795 -0.0795122 -0.0320585 1 0 1 1 0 0 +EDGE2 490 489 -1.03006 -0.0211822 -0.0121362 1 0 1 1 0 0 +EDGE2 491 490 -0.951142 -0.0318751 -1.58194 1 0 1 1 0 0 +EDGE2 492 491 -1.04447 -0.00932117 -0.0255116 1 0 1 1 0 0 +EDGE2 493 492 -1.05462 -0.0447479 -0.00313592 1 0 1 1 0 0 +EDGE2 494 493 -1.0393 -0.0107586 0.0231477 1 0 1 1 0 0 +EDGE2 494 235 0.964774 -0.0341111 -3.171 1 0 1 1 0 0 +EDGE2 494 255 0.970031 -0.0204866 -3.16799 1 0 1 1 0 0 +EDGE2 495 236 -0.00454494 -1.06161 -1.53248 1 0 1 1 0 0 +EDGE2 495 494 -0.914948 -0.0290772 0.00546252 1 0 1 1 0 0 +EDGE2 495 235 -0.0320556 0.00939473 -3.11881 1 0 1 1 0 0 +EDGE2 495 255 -0.0695434 0.00229568 -3.12298 1 0 1 1 0 0 +EDGE2 495 234 1.02434 0.00188746 -3.11881 1 0 1 1 0 0 +EDGE2 495 254 0.961661 0.0724544 -3.12948 1 0 1 1 0 0 +EDGE2 495 256 -0.0187795 1.02852 1.54924 1 0 1 1 0 0 +EDGE2 496 235 -0.97216 -0.0167394 1.56344 1 0 1 1 0 0 +EDGE2 496 495 -0.947996 0.0395238 -1.58155 1 0 1 1 0 0 +EDGE2 496 255 -1.00456 0.0415557 1.61014 1 0 1 1 0 0 +EDGE2 496 256 0.000307388 -0.071926 0.0271152 1 0 1 1 0 0 +EDGE2 496 257 1.06698 -0.00492717 0.00591191 1 0 1 1 0 0 +EDGE2 497 256 -0.942352 0.00729536 -0.0036228 1 0 1 1 0 0 +EDGE2 497 496 -1.03374 0.125805 -0.0200408 1 0 1 1 0 0 +EDGE2 497 257 0.0878932 0.0380665 0.0175887 1 0 1 1 0 0 +EDGE2 497 258 1.01831 0.0529339 -0.0207086 1 0 1 1 0 0 +EDGE2 498 497 -1.02109 -0.064761 -0.000484933 1 0 1 1 0 0 +EDGE2 498 257 -0.933012 0.0213369 0.0165448 1 0 1 1 0 0 +EDGE2 498 259 0.948607 -0.00489278 0.00685088 1 0 1 1 0 0 +EDGE2 498 258 -0.0180849 -0.000972713 -0.0131651 1 0 1 1 0 0 +EDGE2 499 498 -0.970178 -0.124541 0.00483687 1 0 1 1 0 0 +EDGE2 499 260 0.96367 -0.0259453 0.0154973 1 0 1 1 0 0 +EDGE2 499 259 -0.0292831 -0.0178072 0.00706534 1 0 1 1 0 0 +EDGE2 499 258 -0.926559 0.0464272 0.00520492 1 0 1 1 0 0 +EDGE2 499 180 0.998884 -0.0135414 -3.15804 1 0 1 1 0 0 +EDGE2 499 200 1.04471 -0.0808421 -3.12808 1 0 1 1 0 0 +EDGE2 500 261 0.0160997 0.956863 1.54328 1 0 1 1 0 0 +EDGE2 500 181 0.0754474 -1.0046 -1.60796 1 0 1 1 0 0 +EDGE2 500 260 -0.00792807 0.0164927 0.00459836 1 0 1 1 0 0 +EDGE2 500 259 -0.99343 0.0296209 0.00377084 1 0 1 1 0 0 +EDGE2 500 499 -1.13055 0.0925854 0.00623478 1 0 1 1 0 0 +EDGE2 500 180 -0.0485776 -0.041463 -3.12752 1 0 1 1 0 0 +EDGE2 500 200 0.0161158 -0.0257235 -3.15147 1 0 1 1 0 0 +EDGE2 500 201 0.018415 -1.01018 -1.5786 1 0 1 1 0 0 +EDGE2 500 199 1.0089 0.00238883 -3.18126 1 0 1 1 0 0 +EDGE2 500 179 0.980409 -0.0210936 -3.16869 1 0 1 1 0 0 +EDGE2 501 181 -0.0353461 -8.89785e-05 -0.0217552 1 0 1 1 0 0 +EDGE2 501 260 -0.952599 -0.00952052 1.58047 1 0 1 1 0 0 +EDGE2 501 500 -1.02052 0.0428347 1.5507 1 0 1 1 0 0 +EDGE2 501 180 -1.06139 0.0388865 -1.58971 1 0 1 1 0 0 +EDGE2 501 200 -0.987905 -0.0239371 -1.58259 1 0 1 1 0 0 +EDGE2 501 201 0.0473333 0.010707 -0.00688763 1 0 1 1 0 0 +EDGE2 501 202 1.0601 -0.0305978 -0.0169601 1 0 1 1 0 0 +EDGE2 501 182 1.07722 -0.0408317 -0.0176547 1 0 1 1 0 0 +EDGE2 502 181 -1.033 0.00661366 -0.0279949 1 0 1 1 0 0 +EDGE2 502 501 -0.988975 0.0413063 0.00236082 1 0 1 1 0 0 +EDGE2 502 201 -1.02292 0.0362645 0.00915368 1 0 1 1 0 0 +EDGE2 502 202 -0.035679 0.0210624 0.0290058 1 0 1 1 0 0 +EDGE2 502 182 -0.0498411 0.0155559 -0.0216979 1 0 1 1 0 0 +EDGE2 502 183 0.913702 0.00510418 -0.0160678 1 0 1 1 0 0 +EDGE2 502 203 1.00525 0.0124584 0.000879497 1 0 1 1 0 0 +EDGE2 503 202 -0.952278 -0.0398661 -0.0141552 1 0 1 1 0 0 +EDGE2 503 502 -0.974357 0.0097152 0.00826377 1 0 1 1 0 0 +EDGE2 503 182 -0.973693 -0.0276422 -0.0148811 1 0 1 1 0 0 +EDGE2 503 184 0.987521 0.0476063 0.0273545 1 0 1 1 0 0 +EDGE2 503 183 -0.014398 0.0231094 0.0177927 1 0 1 1 0 0 +EDGE2 503 203 0.0200698 0.0228167 0.00265295 1 0 1 1 0 0 +EDGE2 503 204 0.909255 0.0104182 -0.0379422 1 0 1 1 0 0 +EDGE2 504 503 -1.01938 -0.0348542 0.00127008 1 0 1 1 0 0 +EDGE2 504 205 1.04609 -0.00924191 0.00658939 1 0 1 1 0 0 +EDGE2 504 184 0.147114 -0.120259 -0.0161357 1 0 1 1 0 0 +EDGE2 504 183 -1.02533 -0.0115228 -0.0130319 1 0 1 1 0 0 +EDGE2 504 203 -1.06587 -0.00464738 -0.0334309 1 0 1 1 0 0 +EDGE2 504 204 -0.0462717 0.0495209 0.056959 1 0 1 1 0 0 +EDGE2 504 225 0.977212 0.088224 -3.14424 1 0 1 1 0 0 +EDGE2 504 185 1.06463 -0.00522272 0.0131284 1 0 1 1 0 0 +EDGE2 505 206 -0.0081 -0.984164 -1.59343 1 0 1 1 0 0 +EDGE2 505 226 -0.0549435 -1.00217 -1.5858 1 0 1 1 0 0 +EDGE2 505 205 -0.0319772 -0.0973236 -0.000366967 1 0 1 1 0 0 +EDGE2 505 184 -1.00734 -0.067063 -0.00500227 1 0 1 1 0 0 +EDGE2 505 504 -1.11743 -0.0016288 0.0397323 1 0 1 1 0 0 +EDGE2 505 204 -1.03326 -0.107329 0.0274827 1 0 1 1 0 0 +EDGE2 505 225 -0.0827982 0.00541027 -3.12969 1 0 1 1 0 0 +EDGE2 505 224 1.00553 -0.0324515 -3.177 1 0 1 1 0 0 +EDGE2 505 185 0.0254884 0.0445508 0.0220277 1 0 1 1 0 0 +EDGE2 505 186 0.0996275 1.01014 1.60252 1 0 1 1 0 0 +EDGE2 506 205 -1.02788 0.077249 -1.56035 1 0 1 1 0 0 +EDGE2 506 225 -1.09946 -0.0513587 1.55728 1 0 1 1 0 0 +EDGE2 506 505 -1.05498 -0.0188075 -1.58105 1 0 1 1 0 0 +EDGE2 506 185 -1.01027 0.080079 -1.56337 1 0 1 1 0 0 +EDGE2 506 186 -0.0271034 -0.108137 0.0041481 1 0 1 1 0 0 +EDGE2 506 187 0.920232 0.0789263 -0.00471004 1 0 1 1 0 0 +EDGE2 507 506 -1.02867 -0.0104695 -0.00288147 1 0 1 1 0 0 +EDGE2 507 186 -1.0036 0.00592774 0.0326462 1 0 1 1 0 0 +EDGE2 507 187 -0.00382982 -0.0161205 0.0409264 1 0 1 1 0 0 +EDGE2 507 188 0.984049 -0.0142432 0.00996592 1 0 1 1 0 0 +EDGE2 508 187 -1.0278 -0.0376901 0.013774 1 0 1 1 0 0 +EDGE2 508 507 -0.973508 0.0173161 -0.0249008 1 0 1 1 0 0 +EDGE2 508 188 -0.0211646 -0.0444734 0.0169101 1 0 1 1 0 0 +EDGE2 508 189 1.02117 -0.0809903 -0.0385228 1 0 1 1 0 0 +EDGE2 509 188 -0.972675 -0.0302115 0.00750226 1 0 1 1 0 0 +EDGE2 509 508 -1.03935 0.0283427 -0.0143866 1 0 1 1 0 0 +EDGE2 509 189 0.0626875 -0.0254435 0.0443421 1 0 1 1 0 0 +EDGE2 509 170 1.01925 -0.117869 -3.1751 1 0 1 1 0 0 +EDGE2 509 190 0.997568 0.0794002 -0.00877242 1 0 1 1 0 0 +EDGE2 510 171 0.000268239 0.936776 1.60005 1 0 1 1 0 0 +EDGE2 510 509 -0.997868 0.0418759 0.0273363 1 0 1 1 0 0 +EDGE2 510 189 -0.999578 -0.0478644 0.0444043 1 0 1 1 0 0 +EDGE2 510 191 0.0755985 0.971601 1.53978 1 0 1 1 0 0 +EDGE2 510 170 0.0632574 -0.0169063 -3.12058 1 0 1 1 0 0 +EDGE2 510 190 0.0828727 0.0183962 0.00179275 1 0 1 1 0 0 +EDGE2 510 169 0.980673 0.0473167 -3.1182 1 0 1 1 0 0 +EDGE2 511 170 -1.06956 0.0700442 -1.55182 1 0 1 1 0 0 +EDGE2 511 190 -0.995703 -0.0232225 1.55949 1 0 1 1 0 0 +EDGE2 511 510 -1.01955 0.0483228 1.56928 1 0 1 1 0 0 +EDGE2 512 511 -0.928297 -0.0149373 0.00802283 1 0 1 1 0 0 +EDGE2 513 512 -1.04654 0.0213121 -0.00829566 1 0 1 1 0 0 +EDGE2 514 513 -1.03325 -0.0159228 -0.00166793 1 0 1 1 0 0 +EDGE2 515 514 -0.936104 -0.0536365 -0.0156087 1 0 1 1 0 0 +EDGE2 516 515 -1.01317 0.0151175 -1.5438 1 0 1 1 0 0 +EDGE2 517 516 -1.05499 -0.0042139 -0.0107244 1 0 1 1 0 0 +EDGE2 518 517 -0.993755 -0.0797857 0.0115435 1 0 1 1 0 0 +EDGE2 519 518 -1.00802 -0.0222472 -0.0228397 1 0 1 1 0 0 +EDGE2 520 519 -0.986852 0.0186222 0.000964726 1 0 1 1 0 0 +EDGE2 521 520 -0.892176 -0.0217093 1.58758 1 0 1 1 0 0 +EDGE2 522 521 -1.01409 0.0325784 0.000544756 1 0 1 1 0 0 +EDGE2 523 522 -0.980095 0.0311644 -0.022426 1 0 1 1 0 0 +EDGE2 524 523 -1.03481 -0.025868 0.0348324 1 0 1 1 0 0 +EDGE2 525 524 -1.00879 -0.0063681 -0.0105593 1 0 1 1 0 0 +EDGE2 526 525 -0.963032 0.0550979 -1.5557 1 0 1 1 0 0 +EDGE2 527 526 -0.940257 0.0371392 -0.0264358 1 0 1 1 0 0 +EDGE2 528 527 -0.994954 0.0167585 -0.043028 1 0 1 1 0 0 +EDGE2 529 528 -1.0362 -0.110076 -0.00226272 1 0 1 1 0 0 +EDGE2 530 529 -1.02223 -0.0109656 0.0289831 1 0 1 1 0 0 +EDGE2 531 530 -1.06108 -0.121089 -1.54673 1 0 1 1 0 0 +EDGE2 532 531 -0.904769 0.0153188 -0.0184056 1 0 1 1 0 0 +EDGE2 533 532 -1.10531 -0.0139675 -0.00758959 1 0 1 1 0 0 +EDGE2 534 533 -1.03614 -0.0203644 0.0107839 1 0 1 1 0 0 +EDGE2 535 534 -0.938554 -0.095887 -0.00786866 1 0 1 1 0 0 +EDGE2 536 535 -0.975843 -0.0291868 -1.52103 1 0 1 1 0 0 +EDGE2 537 536 -0.973229 -0.0187179 0.0292916 1 0 1 1 0 0 +EDGE2 538 537 -1.03159 0.0135272 0.000887605 1 0 1 1 0 0 +EDGE2 539 520 1.0421 -0.00825265 -3.16913 1 0 1 1 0 0 +EDGE2 539 538 -0.965005 -0.00919667 0.00192367 1 0 1 1 0 0 +EDGE2 540 519 0.961684 0.0397209 -3.13763 1 0 1 1 0 0 +EDGE2 540 520 -0.00715438 0.0723713 -3.15493 1 0 1 1 0 0 +EDGE2 540 521 0.056701 0.972703 1.54567 1 0 1 1 0 0 +EDGE2 540 539 -1.02619 -0.0176533 0.00671587 1 0 1 1 0 0 +EDGE2 541 520 -1.05163 -0.0364537 -1.5775 1 0 1 1 0 0 +EDGE2 541 540 -1.03828 -0.0531352 1.56929 1 0 1 1 0 0 +EDGE2 542 541 -0.991512 0.0108359 0.0175491 1 0 1 1 0 0 +EDGE2 543 542 -1.04454 -0.0108814 -0.00342393 1 0 1 1 0 0 +EDGE2 544 165 0.986842 -0.036631 -3.15431 1 0 1 1 0 0 +EDGE2 544 543 -0.960533 -0.0370758 -0.0242235 1 0 1 1 0 0 +EDGE2 545 166 0.0580216 1.06007 1.58831 1 0 1 1 0 0 +EDGE2 545 544 -0.928276 0.00945314 -0.0195721 1 0 1 1 0 0 +EDGE2 545 164 0.987094 0.0217007 -3.11826 1 0 1 1 0 0 +EDGE2 545 165 -0.0120158 -0.00845003 -3.11893 1 0 1 1 0 0 +EDGE2 546 545 -1.06474 0.0527217 1.61323 1 0 1 1 0 0 +EDGE2 546 165 -0.964153 -0.0418414 -1.5273 1 0 1 1 0 0 +EDGE2 547 546 -1.05462 -0.00850539 -0.00659933 1 0 1 1 0 0 +EDGE2 548 547 -0.956535 0.0583722 0.000777076 1 0 1 1 0 0 +EDGE2 549 548 -1.06415 -0.0459027 0.0240779 1 0 1 1 0 0 +EDGE2 550 549 -0.972956 0.113231 -0.0172359 1 0 1 1 0 0 +EDGE2 551 550 -1.0015 0.0461091 1.58124 1 0 1 1 0 0 +EDGE2 552 551 -1.03081 0.0160035 -0.0227768 1 0 1 1 0 0 +EDGE2 553 552 -0.966144 0.0145637 0.0172355 1 0 1 1 0 0 +EDGE2 554 553 -0.958508 -0.11264 -0.0122259 1 0 1 1 0 0 +EDGE2 554 535 0.981297 -0.0581086 -3.11864 1 0 1 1 0 0 +EDGE2 555 534 0.962727 0.0187884 -3.15886 1 0 1 1 0 0 +EDGE2 555 536 -0.0548614 -0.91522 -1.60499 1 0 1 1 0 0 +EDGE2 555 554 -1.01411 -0.0369302 0.0230123 1 0 1 1 0 0 +EDGE2 555 535 -0.0123034 -0.000247839 -3.09805 1 0 1 1 0 0 +EDGE2 556 555 -0.973452 0.0169942 -1.54551 1 0 1 1 0 0 +EDGE2 556 535 -1.02838 0.0309447 1.62588 1 0 1 1 0 0 +EDGE2 557 556 -0.951603 0.0696264 0.0359682 1 0 1 1 0 0 +EDGE2 558 557 -1.01973 -0.0332312 -0.032132 1 0 1 1 0 0 +EDGE2 559 558 -0.928251 -0.0383098 0.000114499 1 0 1 1 0 0 +EDGE2 560 559 -0.956301 0.000682173 -0.00127682 1 0 1 1 0 0 +EDGE2 561 560 -0.980265 0.01057 1.56806 1 0 1 1 0 0 +EDGE2 562 561 -1.00541 0.0126667 0.00673411 1 0 1 1 0 0 +EDGE2 563 562 -1.03235 -0.0381457 -0.0148413 1 0 1 1 0 0 +EDGE2 564 563 -0.988362 -0.0113643 -0.00223228 1 0 1 1 0 0 +EDGE2 565 564 -0.963205 0.0655898 -0.015864 1 0 1 1 0 0 +EDGE2 566 565 -0.936971 -0.0805397 -1.61019 1 0 1 1 0 0 +EDGE2 567 566 -0.97164 0.0679178 0.0493468 1 0 1 1 0 0 +EDGE2 568 567 -0.917506 -0.0735887 0.0182816 1 0 1 1 0 0 +EDGE2 569 568 -0.999179 -0.0569117 0.00585808 1 0 1 1 0 0 +EDGE2 570 569 -0.953564 -0.0201128 -0.00253602 1 0 1 1 0 0 +EDGE2 571 570 -0.978685 -0.119068 1.56326 1 0 1 1 0 0 +EDGE2 572 571 -0.997879 -0.0160949 -0.00322153 1 0 1 1 0 0 +EDGE2 573 572 -0.987697 -0.000482517 -0.006304 1 0 1 1 0 0 +EDGE2 574 573 -0.888846 -0.0665069 0.00462262 1 0 1 1 0 0 +EDGE2 575 574 -0.991761 0.0169261 0.0125815 1 0 1 1 0 0 +EDGE2 576 575 -1.02182 0.0457307 -1.57597 1 0 1 1 0 0 +EDGE2 577 576 -1.0497 -0.00981091 0.0160578 1 0 1 1 0 0 +EDGE2 578 577 -0.979055 -0.0536499 -0.00266357 1 0 1 1 0 0 +EDGE2 579 578 -1.0897 -0.0259836 -0.00322182 1 0 1 1 0 0 +EDGE2 580 579 -1.08443 -0.0353979 0.034935 1 0 1 1 0 0 +EDGE2 581 580 -0.992486 0.0546998 1.54469 1 0 1 1 0 0 +EDGE2 582 581 -1.03336 0.0296225 -0.0181571 1 0 1 1 0 0 +EDGE2 583 582 -0.996487 0.0803869 -0.00241479 1 0 1 1 0 0 +EDGE2 584 583 -1.02789 0.0011751 -0.00881189 1 0 1 1 0 0 +EDGE2 585 584 -1.00175 -0.0060586 8.4945e-05 1 0 1 1 0 0 +EDGE2 586 585 -1.03683 0.00805738 -1.56397 1 0 1 1 0 0 +EDGE2 587 586 -0.970478 0.0595809 -0.00373618 1 0 1 1 0 0 +EDGE2 588 587 -1.05555 0.00881011 -0.0178818 1 0 1 1 0 0 +EDGE2 589 588 -1.01246 0.0567415 0.0257734 1 0 1 1 0 0 +EDGE2 590 589 -0.996627 -0.114209 0.0272816 1 0 1 1 0 0 +EDGE2 591 590 -1.04882 -0.0325469 1.58328 1 0 1 1 0 0 +EDGE2 592 591 -1.00487 0.0368769 -0.0158748 1 0 1 1 0 0 +EDGE2 593 592 -0.997364 -0.0444423 0.00232855 1 0 1 1 0 0 +EDGE2 594 593 -0.997976 -0.0326796 -0.00203239 1 0 1 1 0 0 +EDGE2 595 594 -0.909422 0.0245871 0.0578041 1 0 1 1 0 0 +EDGE2 596 595 -0.941734 -0.00794109 -1.60395 1 0 1 1 0 0 +EDGE2 597 596 -0.924003 0.00435161 0.0119912 1 0 1 1 0 0 +EDGE2 598 597 -1.00558 0.0511262 0.00683494 1 0 1 1 0 0 +EDGE2 599 598 -1.07572 -0.000378858 0.0247963 1 0 1 1 0 0 +EDGE2 600 599 -0.98284 0.0204911 0.0116805 1 0 1 1 0 0 +EDGE2 601 600 -0.997194 0.107949 -1.58561 1 0 1 1 0 0 +EDGE2 602 601 -1.03733 -3.96711e-05 -0.0102578 1 0 1 1 0 0 +EDGE2 603 602 -0.936612 -0.0547512 -0.00905842 1 0 1 1 0 0 +EDGE2 604 603 -1.02209 -0.0168496 0.00351108 1 0 1 1 0 0 +EDGE2 605 604 -1.07245 -0.137739 -0.0474661 1 0 1 1 0 0 +EDGE2 606 605 -0.954856 -0.035981 1.58022 1 0 1 1 0 0 +EDGE2 607 606 -1.05225 -0.0603187 0.00976099 1 0 1 1 0 0 +EDGE2 608 607 -0.997264 0.0584897 -0.0128574 1 0 1 1 0 0 +EDGE2 609 608 -1.01041 0.0155689 0.0390507 1 0 1 1 0 0 +EDGE2 610 609 -0.954143 0.0169681 -0.0151077 1 0 1 1 0 0 +EDGE2 611 610 -1.02713 -0.0138027 1.56423 1 0 1 1 0 0 +EDGE2 612 611 -0.997517 -0.0326425 -0.0174774 1 0 1 1 0 0 +EDGE2 613 612 -0.969019 -0.0174928 0.00771469 1 0 1 1 0 0 +EDGE2 614 613 -0.979477 -0.0586305 0.0116687 1 0 1 1 0 0 +EDGE2 615 614 -1.03418 0.0570392 -0.029252 1 0 1 1 0 0 +EDGE2 616 615 -1.03465 0.0185912 -1.57145 1 0 1 1 0 0 +EDGE2 617 616 -1.01096 0.0512759 -0.0197068 1 0 1 1 0 0 +EDGE2 618 617 -0.969197 0.0299786 -0.0023761 1 0 1 1 0 0 +EDGE2 619 618 -1.01784 0.0280199 -0.0145759 1 0 1 1 0 0 +EDGE2 620 619 -1.01844 -0.0309336 -0.0113745 1 0 1 1 0 0 +EDGE2 621 620 -0.906225 0.0105585 1.55172 1 0 1 1 0 0 +EDGE2 622 621 -0.954389 -0.0435734 -0.0326502 1 0 1 1 0 0 +EDGE2 623 622 -1.00767 0.00928202 -0.0140941 1 0 1 1 0 0 +EDGE2 624 623 -1.08794 -0.00655902 -0.0067322 1 0 1 1 0 0 +EDGE2 625 624 -0.983258 0.000832694 0.0231347 1 0 1 1 0 0 +EDGE2 626 625 -1.00122 0.0347913 1.57471 1 0 1 1 0 0 +EDGE2 627 626 -0.988076 -0.0142133 -0.0274332 1 0 1 1 0 0 +EDGE2 628 627 -1.0042 -0.0184629 -0.00625932 1 0 1 1 0 0 +EDGE2 629 628 -0.968824 -0.0914319 0.0212604 1 0 1 1 0 0 +EDGE2 630 629 -1.02371 0.0581906 -0.00420895 1 0 1 1 0 0 +EDGE2 631 630 -0.970616 0.000883726 -1.60432 1 0 1 1 0 0 +EDGE2 632 631 -0.973259 -0.039159 0.00789895 1 0 1 1 0 0 +EDGE2 633 632 -1.01838 -0.0100946 -0.00496689 1 0 1 1 0 0 +EDGE2 634 633 -0.977497 -0.0167645 0.0403412 1 0 1 1 0 0 +EDGE2 635 634 -0.926055 0.0882788 -0.00641983 1 0 1 1 0 0 +EDGE2 636 635 -0.983999 0.0797255 -1.58574 1 0 1 1 0 0 +EDGE2 637 636 -1.00117 0.0159726 0.00929688 1 0 1 1 0 0 +EDGE2 638 637 -1.00007 0.0117785 0.00851935 1 0 1 1 0 0 +EDGE2 639 638 -0.984878 -0.0630311 0.000878265 1 0 1 1 0 0 +EDGE2 640 639 -1.00375 0.0277419 -0.0167835 1 0 1 1 0 0 +EDGE2 641 640 -1.11628 0.00744241 -1.57375 1 0 1 1 0 0 +EDGE2 642 641 -0.987699 -0.00498387 0.0106514 1 0 1 1 0 0 +EDGE2 643 642 -1.02145 0.0486377 0.020507 1 0 1 1 0 0 +EDGE2 644 625 1.05889 -0.0422569 -3.14282 1 0 1 1 0 0 +EDGE2 644 643 -0.940927 -0.0202611 0.0397781 1 0 1 1 0 0 +EDGE2 645 624 0.953489 0.0118819 -3.15125 1 0 1 1 0 0 +EDGE2 645 626 0.0437742 0.908902 1.56371 1 0 1 1 0 0 +EDGE2 645 644 -0.993425 0.0162602 0.0288982 1 0 1 1 0 0 +EDGE2 645 625 -0.0260627 0.00757731 -3.16404 1 0 1 1 0 0 +EDGE2 646 626 -0.000874505 -3.68194e-05 0.0365181 1 0 1 1 0 0 +EDGE2 646 627 1.05827 -0.111291 0.00445057 1 0 1 1 0 0 +EDGE2 646 625 -1.01658 -0.0232441 1.56316 1 0 1 1 0 0 +EDGE2 646 645 -0.947437 -0.00892872 -1.54027 1 0 1 1 0 0 +EDGE2 647 626 -1.00872 -0.0274974 -0.00247032 1 0 1 1 0 0 +EDGE2 647 627 -0.075166 -0.00797096 -0.00741248 1 0 1 1 0 0 +EDGE2 647 628 0.928059 -0.0223918 0.000762217 1 0 1 1 0 0 +EDGE2 647 646 -1.05425 -0.0088557 -0.0198645 1 0 1 1 0 0 +EDGE2 648 629 0.92806 0.0825324 0.00592717 1 0 1 1 0 0 +EDGE2 648 627 -0.972383 0.0262558 -0.00618544 1 0 1 1 0 0 +EDGE2 648 647 -1.03157 -0.00991503 -0.00805822 1 0 1 1 0 0 +EDGE2 648 628 -0.0327143 0.00407262 -0.0132481 1 0 1 1 0 0 +EDGE2 649 630 1.06695 -0.0313366 -0.00164922 1 0 1 1 0 0 +EDGE2 649 648 -1.08144 0.0839391 -0.00608744 1 0 1 1 0 0 +EDGE2 649 629 -0.0255995 -0.0243674 0.00956789 1 0 1 1 0 0 +EDGE2 649 628 -1.02575 -0.138373 0.0131143 1 0 1 1 0 0 +EDGE2 650 630 -0.0245217 -0.053649 -0.00793558 1 0 1 1 0 0 +EDGE2 650 631 -0.00401838 0.962542 1.59119 1 0 1 1 0 0 +EDGE2 650 649 -0.96559 -0.00461982 0.00226287 1 0 1 1 0 0 +EDGE2 650 629 -1.00072 0.0888196 -0.0145956 1 0 1 1 0 0 +EDGE2 651 630 -0.959541 0.0687554 -1.57285 1 0 1 1 0 0 +EDGE2 651 650 -1.05319 -0.0701524 -1.55699 1 0 1 1 0 0 +EDGE2 651 631 -0.0152516 0.0405165 0.0165062 1 0 1 1 0 0 +EDGE2 651 632 1.07595 0.0465982 -0.022415 1 0 1 1 0 0 +EDGE2 652 651 -1.0277 0.0392475 -0.0390359 1 0 1 1 0 0 +EDGE2 652 631 -0.990541 -0.0211265 -0.0193188 1 0 1 1 0 0 +EDGE2 652 632 0.063636 -0.0753537 0.00214301 1 0 1 1 0 0 +EDGE2 652 633 0.997008 -0.00819416 -0.00100117 1 0 1 1 0 0 +EDGE2 653 652 -0.962776 -0.0751585 0.0219434 1 0 1 1 0 0 +EDGE2 653 632 -1.1116 -0.0766149 -0.0190175 1 0 1 1 0 0 +EDGE2 653 633 -0.0229445 -0.0195848 0.00481797 1 0 1 1 0 0 +EDGE2 653 634 1.02721 -0.0268188 0.00410987 1 0 1 1 0 0 +EDGE2 654 633 -0.87571 0.0824644 0.00390929 1 0 1 1 0 0 +EDGE2 654 653 -0.983768 0.00739539 0.0252459 1 0 1 1 0 0 +EDGE2 654 635 1.06847 -0.0457621 -0.0130272 1 0 1 1 0 0 +EDGE2 654 634 -0.00590258 0.00372929 -0.00967701 1 0 1 1 0 0 +EDGE2 655 635 0.00900248 0.034073 0.0172406 1 0 1 1 0 0 +EDGE2 655 634 -1.00005 -0.0474622 -0.0124335 1 0 1 1 0 0 +EDGE2 655 654 -1.00606 -0.0392174 -0.028934 1 0 1 1 0 0 +EDGE2 655 636 -0.00125612 1.05144 1.55502 1 0 1 1 0 0 +EDGE2 656 635 -0.982396 0.00435962 -1.54905 1 0 1 1 0 0 +EDGE2 656 655 -1.01898 0.0023445 -1.60132 1 0 1 1 0 0 +EDGE2 656 636 -0.0460716 -0.0402886 0.00756754 1 0 1 1 0 0 +EDGE2 656 637 1.0181 0.0375902 0.0191897 1 0 1 1 0 0 +EDGE2 657 656 -1.01923 -0.0475655 -0.0159199 1 0 1 1 0 0 +EDGE2 657 636 -0.985646 0.0374246 -0.02675 1 0 1 1 0 0 +EDGE2 657 637 0.0647302 0.0440874 -0.0042493 1 0 1 1 0 0 +EDGE2 657 638 1.02641 0.0417719 0.0180921 1 0 1 1 0 0 +EDGE2 658 657 -0.967164 -0.0970801 0.00981033 1 0 1 1 0 0 +EDGE2 658 637 -0.922757 -0.0121902 0.0259288 1 0 1 1 0 0 +EDGE2 658 638 -0.0425697 0.0249097 0.0323066 1 0 1 1 0 0 +EDGE2 658 639 0.987146 0.0307473 0.000216141 1 0 1 1 0 0 +EDGE2 659 658 -0.950514 -0.113432 0.0185846 1 0 1 1 0 0 +EDGE2 659 638 -0.937444 -0.0294359 0.0171358 1 0 1 1 0 0 +EDGE2 659 639 0.0228938 0.0221863 0.000872867 1 0 1 1 0 0 +EDGE2 659 640 0.979276 0.0384537 0.0207422 1 0 1 1 0 0 +EDGE2 660 639 -0.96637 0.0454004 -0.0262165 1 0 1 1 0 0 +EDGE2 660 659 -0.985441 -0.0101839 -0.0330751 1 0 1 1 0 0 +EDGE2 660 641 -0.00676604 0.985479 1.58256 1 0 1 1 0 0 +EDGE2 660 640 0.0292292 -0.0134136 -0.00456404 1 0 1 1 0 0 +EDGE2 661 640 -0.937427 0.0155962 1.5909 1 0 1 1 0 0 +EDGE2 661 660 -0.913285 0.0575382 1.5817 1 0 1 1 0 0 +EDGE2 662 661 -1.02957 0.00439684 0.00629337 1 0 1 1 0 0 +EDGE2 663 662 -0.925736 0.0441923 0.00244613 1 0 1 1 0 0 +EDGE2 664 663 -0.923863 0.0432385 -0.000432792 1 0 1 1 0 0 +EDGE2 665 664 -1.01639 0.0578353 -0.0303297 1 0 1 1 0 0 +EDGE2 666 665 -1.03093 0.072076 -1.5942 1 0 1 1 0 0 +EDGE2 667 666 -1.04806 0.000323751 0.0187504 1 0 1 1 0 0 +EDGE2 668 667 -0.900708 0.00341668 -0.0161888 1 0 1 1 0 0 +EDGE2 669 668 -0.994383 0.0109776 -0.0134472 1 0 1 1 0 0 +EDGE2 670 669 -1.0486 -0.0292462 0.00530722 1 0 1 1 0 0 +EDGE2 671 670 -1.05013 -0.0524251 -1.54584 1 0 1 1 0 0 +EDGE2 672 671 -1.09904 0.057232 -0.00868276 1 0 1 1 0 0 +EDGE2 673 672 -1.06033 -0.0733947 -0.00894376 1 0 1 1 0 0 +EDGE2 674 673 -1.0099 0.00320383 0.0109273 1 0 1 1 0 0 +EDGE2 675 674 -0.990679 0.0109315 0.0244224 1 0 1 1 0 0 +EDGE2 676 675 -1.00317 -0.0478957 1.58966 1 0 1 1 0 0 +EDGE2 677 676 -1.01812 -0.0443062 0.00536246 1 0 1 1 0 0 +EDGE2 678 677 -0.988363 -0.117057 0.0100022 1 0 1 1 0 0 +EDGE2 679 678 -1.04432 0.111225 -0.0159544 1 0 1 1 0 0 +EDGE2 680 679 -0.983458 -0.0115513 0.00148164 1 0 1 1 0 0 +EDGE2 681 680 -0.96006 0.00799815 -1.56426 1 0 1 1 0 0 +EDGE2 682 681 -1.00968 0.144007 0.0108645 1 0 1 1 0 0 +EDGE2 683 682 -0.995907 0.0206061 -0.018501 1 0 1 1 0 0 +EDGE2 684 683 -0.881375 -0.00865935 -0.0158057 1 0 1 1 0 0 +EDGE2 685 684 -0.939971 -0.00104398 -0.0129528 1 0 1 1 0 0 +EDGE2 686 685 -1.0209 -0.000880124 1.59486 1 0 1 1 0 0 +EDGE2 687 686 -0.920266 -0.197516 -0.0161772 1 0 1 1 0 0 +EDGE2 688 687 -1.02781 -0.0268124 -0.0336947 1 0 1 1 0 0 +EDGE2 689 688 -0.976848 0.0210124 -0.0494787 1 0 1 1 0 0 +EDGE2 690 689 -0.940515 -0.0321993 0.0283898 1 0 1 1 0 0 +EDGE2 691 690 -1.03223 -0.0232673 -1.55617 1 0 1 1 0 0 +EDGE2 692 691 -1.08233 0.013857 -0.00205678 1 0 1 1 0 0 +EDGE2 693 692 -0.952635 -0.0386177 -0.016556 1 0 1 1 0 0 +EDGE2 694 693 -1.00056 0.0652274 0.0421877 1 0 1 1 0 0 +EDGE2 695 694 -1.07205 -0.0421465 0.0142559 1 0 1 1 0 0 +EDGE2 696 695 -0.923733 -0.025709 1.5548 1 0 1 1 0 0 +EDGE2 697 696 -0.980837 0.0458146 0.000989911 1 0 1 1 0 0 +EDGE2 698 697 -1.05045 -0.0605976 0.00205651 1 0 1 1 0 0 +EDGE2 699 698 -1.10007 -0.0010042 -0.00254479 1 0 1 1 0 0 +EDGE2 700 699 -1.03322 -0.027048 0.0321946 1 0 1 1 0 0 +EDGE2 701 700 -0.967786 -0.0373999 1.58527 1 0 1 1 0 0 +EDGE2 702 701 -0.991789 0.0251844 0.024998 1 0 1 1 0 0 +EDGE2 703 702 -1.09424 -0.0551738 0.0129698 1 0 1 1 0 0 +EDGE2 704 703 -0.958703 -0.0482951 -0.0177369 1 0 1 1 0 0 +EDGE2 705 704 -0.992727 0.00209999 -0.0216804 1 0 1 1 0 0 +EDGE2 706 705 -1.00634 0.0216091 -1.59915 1 0 1 1 0 0 +EDGE2 707 706 -1.0273 0.0769383 0.00892962 1 0 1 1 0 0 +EDGE2 708 707 -0.975951 0.00128981 0.0100573 1 0 1 1 0 0 +EDGE2 709 708 -1.00312 -0.107949 -0.00298962 1 0 1 1 0 0 +EDGE2 710 709 -0.972231 -0.063297 0.0159068 1 0 1 1 0 0 +EDGE2 711 710 -0.968124 0.141295 -1.58313 1 0 1 1 0 0 +EDGE2 712 711 -0.968526 0.0261574 -0.00866988 1 0 1 1 0 0 +EDGE2 713 712 -0.953389 -0.00864359 0.0456326 1 0 1 1 0 0 +EDGE2 714 713 -1.04157 -0.0109008 -0.016396 1 0 1 1 0 0 +EDGE2 715 714 -1.04317 -0.0411538 0.0317176 1 0 1 1 0 0 +EDGE2 716 715 -0.983698 0.0775507 1.55721 1 0 1 1 0 0 +EDGE2 717 716 -1.00108 -0.0595939 0.0251503 1 0 1 1 0 0 +EDGE2 718 717 -1.00833 -0.0356875 -0.0593475 1 0 1 1 0 0 +EDGE2 719 718 -0.995637 -0.00225268 0.00522465 1 0 1 1 0 0 +EDGE2 720 719 -1.00865 0.00789439 0.0133314 1 0 1 1 0 0 +EDGE2 721 720 -1.00546 -0.0172746 1.56764 1 0 1 1 0 0 +EDGE2 722 721 -0.973793 0.0532386 -0.0193509 1 0 1 1 0 0 +EDGE2 723 722 -1.06582 0.0253653 -0.0374447 1 0 1 1 0 0 +EDGE2 724 723 -1.04346 0.00234407 0.0368518 1 0 1 1 0 0 +EDGE2 725 724 -1.04701 0.126912 -0.0243688 1 0 1 1 0 0 +EDGE2 726 725 -0.964941 -0.0694076 1.59025 1 0 1 1 0 0 +EDGE2 727 726 -0.95116 -0.00292344 -0.00361513 1 0 1 1 0 0 +EDGE2 728 727 -0.939548 0.00982116 0.00398849 1 0 1 1 0 0 +EDGE2 729 710 0.959136 -0.0856371 -3.16376 1 0 1 1 0 0 +EDGE2 729 728 -1.04468 0.0624824 0.0403656 1 0 1 1 0 0 +EDGE2 730 711 0.00045214 -1.10474 -1.54627 1 0 1 1 0 0 +EDGE2 730 709 0.978944 0.00215415 -3.14687 1 0 1 1 0 0 +EDGE2 730 710 0.0475644 0.0304379 -3.17289 1 0 1 1 0 0 +EDGE2 730 729 -1.00398 -0.116512 -0.0127278 1 0 1 1 0 0 +EDGE2 731 712 0.962698 -0.0703452 -0.00427963 1 0 1 1 0 0 +EDGE2 731 711 -0.00824934 0.00391569 -0.00714246 1 0 1 1 0 0 +EDGE2 731 730 -1.07361 0.0674765 1.60031 1 0 1 1 0 0 +EDGE2 731 710 -0.936873 0.0343109 -1.58101 1 0 1 1 0 0 +EDGE2 732 713 1.0677 -0.0213076 0.00198463 1 0 1 1 0 0 +EDGE2 732 712 0.112246 0.0229474 -0.0271135 1 0 1 1 0 0 +EDGE2 732 711 -1.00235 -0.0667512 -0.0117727 1 0 1 1 0 0 +EDGE2 732 731 -0.970158 0.0764007 -0.00588552 1 0 1 1 0 0 +EDGE2 733 714 1.06308 -0.0437486 0.00675792 1 0 1 1 0 0 +EDGE2 733 732 -1.04436 0.0374579 -0.0322735 1 0 1 1 0 0 +EDGE2 733 713 0.0294812 0.0379291 -0.0126546 1 0 1 1 0 0 +EDGE2 733 712 -0.960954 -0.0233677 0.0020163 1 0 1 1 0 0 +EDGE2 734 715 1.04934 0.0893481 -0.00224197 1 0 1 1 0 0 +EDGE2 734 714 -0.00541271 -0.0512887 -0.0268494 1 0 1 1 0 0 +EDGE2 734 713 -0.932874 3.74228e-05 0.0203538 1 0 1 1 0 0 +EDGE2 734 733 -0.998547 -0.0256871 -0.040342 1 0 1 1 0 0 +EDGE2 735 715 -0.0703776 0.0896383 0.0286872 1 0 1 1 0 0 +EDGE2 735 734 -0.947035 0.0274127 0.0130504 1 0 1 1 0 0 +EDGE2 735 714 -1.01051 0.0174734 0.0204335 1 0 1 1 0 0 +EDGE2 735 716 0.0592184 -1.04014 -1.56241 1 0 1 1 0 0 +EDGE2 736 715 -1.0114 -0.00703803 -1.54533 1 0 1 1 0 0 +EDGE2 736 735 -1.0666 -0.027026 -1.60594 1 0 1 1 0 0 +EDGE2 737 736 -0.9247 -0.0603988 0.0148156 1 0 1 1 0 0 +EDGE2 738 737 -1.02361 0.0354577 -0.0223621 1 0 1 1 0 0 +EDGE2 739 700 1.01754 -0.0411377 -3.14393 1 0 1 1 0 0 +EDGE2 739 738 -0.965077 -0.0210721 0.0178123 1 0 1 1 0 0 +EDGE2 740 699 0.937839 -0.026811 -3.12831 1 0 1 1 0 0 +EDGE2 740 701 0.0527722 0.913615 1.5517 1 0 1 1 0 0 +EDGE2 740 700 0.0613353 0.0421203 -3.14213 1 0 1 1 0 0 +EDGE2 740 739 -1.00177 -0.0113285 -0.0230735 1 0 1 1 0 0 +EDGE2 741 740 -1.04643 -0.0126065 1.58807 1 0 1 1 0 0 +EDGE2 741 700 -0.983279 -0.0924941 -1.55236 1 0 1 1 0 0 +EDGE2 742 741 -1.02831 0.0429155 -0.00393242 1 0 1 1 0 0 +EDGE2 743 742 -1.04038 -0.0712543 -0.00710013 1 0 1 1 0 0 +EDGE2 744 743 -0.946173 0.0466632 -0.00792238 1 0 1 1 0 0 +EDGE2 745 744 -1.08433 -0.0748837 -0.00265877 1 0 1 1 0 0 +EDGE2 746 745 -0.99496 0.0427488 -1.58318 1 0 1 1 0 0 +EDGE2 747 746 -0.891524 0.0321667 -0.00743283 1 0 1 1 0 0 +EDGE2 748 747 -0.904813 -0.104277 -0.00773778 1 0 1 1 0 0 +EDGE2 749 748 -1.07379 -0.0111954 -0.0188928 1 0 1 1 0 0 +EDGE2 750 749 -1.084 -0.0510539 -0.00335897 1 0 1 1 0 0 +EDGE2 751 750 -0.95036 0.0351272 -1.55368 1 0 1 1 0 0 +EDGE2 752 751 -1.0423 -0.00687769 -0.0069372 1 0 1 1 0 0 +EDGE2 753 752 -0.971493 0.0817314 -0.0111361 1 0 1 1 0 0 +EDGE2 754 753 -1.09749 -0.0228554 -0.0169722 1 0 1 1 0 0 +EDGE2 754 695 0.95068 0.0409714 -3.14276 1 0 1 1 0 0 +EDGE2 755 754 -0.981828 -0.109469 -0.00274513 1 0 1 1 0 0 +EDGE2 755 695 -0.0241496 0.0259232 -3.12695 1 0 1 1 0 0 +EDGE2 755 694 0.926642 -0.073467 -3.15864 1 0 1 1 0 0 +EDGE2 755 696 0.0333959 0.977849 1.59312 1 0 1 1 0 0 +EDGE2 756 755 -1.00288 0.0210612 -1.59874 1 0 1 1 0 0 +EDGE2 756 695 -1.05106 -0.0602973 1.54164 1 0 1 1 0 0 +EDGE2 756 696 -0.0823829 0.0992133 -0.000460847 1 0 1 1 0 0 +EDGE2 756 697 1.03183 0.0130372 -0.0630813 1 0 1 1 0 0 +EDGE2 757 696 -0.972892 -0.0500716 0.0108794 1 0 1 1 0 0 +EDGE2 757 756 -0.956968 0.00565824 0.00020081 1 0 1 1 0 0 +EDGE2 757 697 -0.0406109 0.0187117 0.00870317 1 0 1 1 0 0 +EDGE2 757 698 0.971764 0.0244966 0.029816 1 0 1 1 0 0 +EDGE2 758 697 -1.06005 0.00145507 0.0285224 1 0 1 1 0 0 +EDGE2 758 757 -0.988311 -0.0629633 0.0214712 1 0 1 1 0 0 +EDGE2 758 699 1.05978 0.0549405 0.00323451 1 0 1 1 0 0 +EDGE2 758 698 0.0209663 0.00837549 -0.00958378 1 0 1 1 0 0 +EDGE2 759 699 0.0263932 0.0571089 0.0189157 1 0 1 1 0 0 +EDGE2 759 698 -1.07818 0.0859264 -0.033076 1 0 1 1 0 0 +EDGE2 759 758 -1.06075 0.0245802 -0.00466319 1 0 1 1 0 0 +EDGE2 759 740 0.999714 0.040985 -3.13044 1 0 1 1 0 0 +EDGE2 759 700 0.962386 -0.0719336 -0.0600847 1 0 1 1 0 0 +EDGE2 760 741 -0.0415869 0.941422 1.60205 1 0 1 1 0 0 +EDGE2 760 699 -1.0221 -0.108199 -0.00717357 1 0 1 1 0 0 +EDGE2 760 759 -0.926451 0.0884662 0.0188234 1 0 1 1 0 0 +EDGE2 760 701 -0.0366523 -0.991905 -1.57276 1 0 1 1 0 0 +EDGE2 760 740 0.0247152 0.036449 -3.15295 1 0 1 1 0 0 +EDGE2 760 700 0.0617225 0.031826 0.0103596 1 0 1 1 0 0 +EDGE2 760 739 0.932042 -0.0278908 -3.16765 1 0 1 1 0 0 +EDGE2 761 742 1.01508 0.0463249 0.0145304 1 0 1 1 0 0 +EDGE2 761 741 -0.0434163 -0.0487798 -0.0209588 1 0 1 1 0 0 +EDGE2 761 740 -0.95795 -0.0306477 1.54745 1 0 1 1 0 0 +EDGE2 761 760 -1.0293 0.0335944 -1.585 1 0 1 1 0 0 +EDGE2 761 700 -1.01673 -0.0396814 -1.58711 1 0 1 1 0 0 +EDGE2 762 743 1.00836 0.0410871 -0.00755715 1 0 1 1 0 0 +EDGE2 762 742 -0.0478164 -0.0327616 -0.00244362 1 0 1 1 0 0 +EDGE2 762 761 -1.02283 -0.000612128 0.0100208 1 0 1 1 0 0 +EDGE2 762 741 -0.963701 -0.0499529 -0.0280892 1 0 1 1 0 0 +EDGE2 763 744 0.988468 -0.0191716 0.0390592 1 0 1 1 0 0 +EDGE2 763 743 -0.0255309 -0.0178804 -0.0152352 1 0 1 1 0 0 +EDGE2 763 742 -0.95904 0.0313035 -0.038442 1 0 1 1 0 0 +EDGE2 763 762 -1.02675 -0.00570407 0.00292028 1 0 1 1 0 0 +EDGE2 764 745 0.95632 0.0741453 0.0389059 1 0 1 1 0 0 +EDGE2 764 744 -0.029882 -0.101369 -0.0138121 1 0 1 1 0 0 +EDGE2 764 743 -0.985654 -0.060529 -0.00363996 1 0 1 1 0 0 +EDGE2 764 763 -1.03522 -0.067251 -0.00746115 1 0 1 1 0 0 +EDGE2 765 746 -0.0844506 0.962217 1.58368 1 0 1 1 0 0 +EDGE2 765 745 -0.0914276 0.0253166 -0.0180878 1 0 1 1 0 0 +EDGE2 765 744 -1.01823 -0.0280852 0.0287274 1 0 1 1 0 0 +EDGE2 765 764 -1.02529 -0.0348961 0.00553351 1 0 1 1 0 0 +EDGE2 766 747 1.00632 -0.111375 0.000868971 1 0 1 1 0 0 +EDGE2 766 746 0.0226791 0.0718034 -0.03084 1 0 1 1 0 0 +EDGE2 766 745 -0.990243 -0.0357588 -1.56461 1 0 1 1 0 0 +EDGE2 766 765 -0.944517 -0.015835 -1.59558 1 0 1 1 0 0 +EDGE2 767 748 0.980846 -0.0171443 -0.0340626 1 0 1 1 0 0 +EDGE2 767 747 -0.0383844 -0.0242943 0.00363031 1 0 1 1 0 0 +EDGE2 767 766 -0.973476 -0.0145345 0.0210438 1 0 1 1 0 0 +EDGE2 767 746 -0.976382 -0.050832 -0.00810513 1 0 1 1 0 0 +EDGE2 768 748 0.0149381 0.0202372 -0.0106515 1 0 1 1 0 0 +EDGE2 768 749 1.02822 -0.0320591 0.0124047 1 0 1 1 0 0 +EDGE2 768 747 -0.997351 0.0167644 -0.0014984 1 0 1 1 0 0 +EDGE2 768 767 -1.02348 -0.013994 0.0163326 1 0 1 1 0 0 +EDGE2 769 750 0.997916 0.104185 0.0114018 1 0 1 1 0 0 +EDGE2 769 748 -1.02079 -0.0719576 0.0278814 1 0 1 1 0 0 +EDGE2 769 749 0.0190556 -0.00587863 -0.00227208 1 0 1 1 0 0 +EDGE2 769 768 -0.987651 -0.0361177 0.00898215 1 0 1 1 0 0 +EDGE2 770 750 -0.0046039 -0.0584291 -0.0403329 1 0 1 1 0 0 +EDGE2 770 751 -0.0110648 0.983008 1.5276 1 0 1 1 0 0 +EDGE2 770 769 -0.950187 0.0239842 -0.0167714 1 0 1 1 0 0 +EDGE2 770 749 -0.982662 0.139484 0.00274097 1 0 1 1 0 0 +EDGE2 771 750 -0.983925 0.0270589 -1.57232 1 0 1 1 0 0 +EDGE2 771 770 -1.02924 -0.0582928 -1.58199 1 0 1 1 0 0 +EDGE2 771 751 -0.0081418 -0.0175873 -0.0239668 1 0 1 1 0 0 +EDGE2 771 752 1.03613 -0.0180946 -0.0362081 1 0 1 1 0 0 +EDGE2 772 753 1.04825 -0.0611242 -0.00936108 1 0 1 1 0 0 +EDGE2 772 751 -1.04901 0.0476314 -0.0250211 1 0 1 1 0 0 +EDGE2 772 771 -1.06234 -0.0124299 -0.00886503 1 0 1 1 0 0 +EDGE2 772 752 0.000411605 -0.00225703 -0.0229377 1 0 1 1 0 0 +EDGE2 773 753 0.0322486 0.0477918 -0.0145925 1 0 1 1 0 0 +EDGE2 773 772 -0.983464 -0.0748822 0.0284379 1 0 1 1 0 0 +EDGE2 773 752 -0.97287 -0.0318943 0.0255716 1 0 1 1 0 0 +EDGE2 773 754 1.01804 0.0522617 0.0199032 1 0 1 1 0 0 +EDGE2 774 753 -0.990002 -0.0491987 -0.023005 1 0 1 1 0 0 +EDGE2 774 773 -0.954897 -0.0347871 -0.0318406 1 0 1 1 0 0 +EDGE2 774 754 0.0130273 -0.15004 -0.0283093 1 0 1 1 0 0 +EDGE2 774 755 0.944177 0.0166763 0.00401937 1 0 1 1 0 0 +EDGE2 774 695 0.95894 0.00113461 -3.11624 1 0 1 1 0 0 +EDGE2 775 774 -0.966553 -0.0102313 -0.00830092 1 0 1 1 0 0 +EDGE2 775 754 -1.01824 0.00913137 0.0285258 1 0 1 1 0 0 +EDGE2 775 755 0.0901227 -0.0106094 0.0107649 1 0 1 1 0 0 +EDGE2 775 695 0.00541622 0.0907119 -3.11521 1 0 1 1 0 0 +EDGE2 775 694 0.903425 -0.00379821 -3.14928 1 0 1 1 0 0 +EDGE2 775 696 0.015595 0.994584 1.55447 1 0 1 1 0 0 +EDGE2 775 756 0.0585711 0.928181 1.56931 1 0 1 1 0 0 +EDGE2 776 755 -0.951638 0.0735579 -1.59051 1 0 1 1 0 0 +EDGE2 776 775 -1.02144 0.0950504 -1.56382 1 0 1 1 0 0 +EDGE2 776 695 -0.983532 -0.0673357 1.58827 1 0 1 1 0 0 +EDGE2 776 696 -0.0202387 -0.0383134 -0.0382491 1 0 1 1 0 0 +EDGE2 776 756 0.058741 0.0365399 0.0227981 1 0 1 1 0 0 +EDGE2 776 697 1.02237 0.0539624 -0.00203027 1 0 1 1 0 0 +EDGE2 776 757 1.05245 0.0756108 -0.0102627 1 0 1 1 0 0 +EDGE2 777 696 -0.979467 -0.0952123 0.00504312 1 0 1 1 0 0 +EDGE2 777 756 -1.08146 0.00207824 0.0151534 1 0 1 1 0 0 +EDGE2 777 776 -0.971971 0.0320272 0.0194683 1 0 1 1 0 0 +EDGE2 777 697 0.0969372 0.000662133 -0.0220726 1 0 1 1 0 0 +EDGE2 777 757 0.0114701 -0.0547442 0.00846731 1 0 1 1 0 0 +EDGE2 777 698 0.977336 0.00614617 -0.0333864 1 0 1 1 0 0 +EDGE2 777 758 1.08924 -0.090955 -0.000162902 1 0 1 1 0 0 +EDGE2 778 697 -1.01263 -0.115887 -0.00685933 1 0 1 1 0 0 +EDGE2 778 777 -0.990637 -0.0204391 0.00960252 1 0 1 1 0 0 +EDGE2 778 757 -0.978415 -0.0348127 0.0108944 1 0 1 1 0 0 +EDGE2 778 699 1.0514 0.00876609 -0.0318796 1 0 1 1 0 0 +EDGE2 778 698 0.0557964 -0.0183774 0.0112573 1 0 1 1 0 0 +EDGE2 778 758 0.064999 -0.0102684 -0.00733513 1 0 1 1 0 0 +EDGE2 778 759 0.943179 -0.0452356 0.0419783 1 0 1 1 0 0 +EDGE2 779 778 -1.01009 -0.0131991 0.0102417 1 0 1 1 0 0 +EDGE2 779 699 -0.0177675 0.0734852 -0.0200635 1 0 1 1 0 0 +EDGE2 779 698 -0.981665 -0.0487769 0.0107646 1 0 1 1 0 0 +EDGE2 779 758 -1.01661 -0.0231555 -0.0153242 1 0 1 1 0 0 +EDGE2 779 759 0.00841311 -0.0508409 0.0290534 1 0 1 1 0 0 +EDGE2 779 740 0.994922 0.0420993 -3.14835 1 0 1 1 0 0 +EDGE2 779 760 1.07764 -0.0103075 0.0185056 1 0 1 1 0 0 +EDGE2 779 700 1.11111 -0.0455199 -0.0263302 1 0 1 1 0 0 +EDGE2 780 761 -0.0959072 1.05619 1.56164 1 0 1 1 0 0 +EDGE2 780 741 0.120141 1.00444 1.53223 1 0 1 1 0 0 +EDGE2 780 699 -0.981406 0.00341151 -0.0179042 1 0 1 1 0 0 +EDGE2 780 779 -0.973196 -0.0844058 -0.00912292 1 0 1 1 0 0 +EDGE2 780 759 -1.0527 -0.0224332 -0.0246707 1 0 1 1 0 0 +EDGE2 780 701 -0.00221844 -1.02984 -1.56074 1 0 1 1 0 0 +EDGE2 780 740 0.019395 0.0211032 -3.08041 1 0 1 1 0 0 +EDGE2 780 760 0.0142936 -0.211514 0.00363883 1 0 1 1 0 0 +EDGE2 780 700 0.00753328 -0.057629 -0.0206489 1 0 1 1 0 0 +EDGE2 780 739 0.95259 -0.0368792 -3.14321 1 0 1 1 0 0 +EDGE2 781 742 0.986374 -0.0270265 0.0117488 1 0 1 1 0 0 +EDGE2 781 762 0.980777 -0.0393889 -0.0119025 1 0 1 1 0 0 +EDGE2 781 761 -0.0170363 0.0689773 -0.0102456 1 0 1 1 0 0 +EDGE2 781 741 -0.0404152 -0.0616136 0.00865806 1 0 1 1 0 0 +EDGE2 781 740 -0.991962 0.101415 1.62789 1 0 1 1 0 0 +EDGE2 781 760 -0.954965 -0.111066 -1.5437 1 0 1 1 0 0 +EDGE2 781 780 -0.96798 -0.00684487 -1.56175 1 0 1 1 0 0 +EDGE2 781 700 -1.0924 0.0362311 -1.57881 1 0 1 1 0 0 +EDGE2 782 743 0.965798 0.0109473 0.029139 1 0 1 1 0 0 +EDGE2 782 763 1.00194 -0.0171923 0.0237784 1 0 1 1 0 0 +EDGE2 782 742 0.0160821 -0.0343777 0.00371269 1 0 1 1 0 0 +EDGE2 782 762 0.0357173 -0.0107261 0.00634092 1 0 1 1 0 0 +EDGE2 782 761 -1.06159 0.0190499 0.0311637 1 0 1 1 0 0 +EDGE2 782 781 -1.07553 0.063208 0.0020158 1 0 1 1 0 0 +EDGE2 782 741 -0.88987 -0.0023928 0.0228761 1 0 1 1 0 0 +EDGE2 783 744 0.885942 0.0692614 0.0209088 1 0 1 1 0 0 +EDGE2 783 764 1.04097 0.0030946 0.00447576 1 0 1 1 0 0 +EDGE2 783 743 -0.0789369 -0.0336273 0.00214631 1 0 1 1 0 0 +EDGE2 783 763 -0.0327004 -0.00232553 0.0369717 1 0 1 1 0 0 +EDGE2 783 742 -1.01399 0.0356836 0.00205706 1 0 1 1 0 0 +EDGE2 783 762 -0.983609 -0.0506575 -0.00663771 1 0 1 1 0 0 +EDGE2 783 782 -0.904263 0.0542629 0.0316493 1 0 1 1 0 0 +EDGE2 784 783 -1.04432 -0.0220638 0.00174262 1 0 1 1 0 0 +EDGE2 784 745 1.14506 -0.0264805 0.0272718 1 0 1 1 0 0 +EDGE2 784 765 0.987577 -0.0247393 -0.00304576 1 0 1 1 0 0 +EDGE2 784 744 0.0468506 0.0033516 -0.038333 1 0 1 1 0 0 +EDGE2 784 764 0.00548664 -0.0771346 -0.00623979 1 0 1 1 0 0 +EDGE2 784 743 -1.00904 0.0171596 -0.0263855 1 0 1 1 0 0 +EDGE2 784 763 -1.0072 0.0877783 -0.0442696 1 0 1 1 0 0 +EDGE2 785 766 0.0492692 1.01657 1.5911 1 0 1 1 0 0 +EDGE2 785 746 -0.0236657 1.04993 1.58753 1 0 1 1 0 0 +EDGE2 785 784 -1.00507 -0.000743948 0.00226544 1 0 1 1 0 0 +EDGE2 785 745 0.0033934 -0.0545785 0.0160743 1 0 1 1 0 0 +EDGE2 785 765 0.00966567 -0.0320677 0.0118754 1 0 1 1 0 0 +EDGE2 785 744 -0.98733 -0.000988692 0.00158509 1 0 1 1 0 0 +EDGE2 785 764 -1.03776 0.00579071 0.0228497 1 0 1 1 0 0 +EDGE2 786 747 1.04054 -0.00837314 -0.0496825 1 0 1 1 0 0 +EDGE2 786 767 0.958569 -0.14347 -0.00933504 1 0 1 1 0 0 +EDGE2 786 766 -0.0192061 -0.0615674 -0.0281948 1 0 1 1 0 0 +EDGE2 786 746 0.0300326 -0.0540153 -0.00141842 1 0 1 1 0 0 +EDGE2 786 785 -0.938781 -0.0146541 -1.56455 1 0 1 1 0 0 +EDGE2 786 745 -1.09216 -0.0289125 -1.5227 1 0 1 1 0 0 +EDGE2 786 765 -0.956495 0.0295481 -1.58532 1 0 1 1 0 0 +EDGE2 787 748 0.921714 -0.0114155 0.0399162 1 0 1 1 0 0 +EDGE2 787 768 1.04493 0.0406316 0.00012003 1 0 1 1 0 0 +EDGE2 787 747 -0.0545229 0.0976536 0.0104077 1 0 1 1 0 0 +EDGE2 787 767 0.0476312 0.0526108 -0.00926028 1 0 1 1 0 0 +EDGE2 787 766 -0.983335 -0.088021 -0.0305627 1 0 1 1 0 0 +EDGE2 787 786 -1.08361 -0.0796197 0.00893827 1 0 1 1 0 0 +EDGE2 787 746 -0.965077 0.0359752 -0.0159086 1 0 1 1 0 0 +EDGE2 788 748 0.00761577 0.0282271 -0.0256275 1 0 1 1 0 0 +EDGE2 788 769 0.969662 0.0342265 0.030045 1 0 1 1 0 0 +EDGE2 788 749 1.06812 -0.0521467 0.00282403 1 0 1 1 0 0 +EDGE2 788 768 0.0148826 -0.0379116 0.00719719 1 0 1 1 0 0 +EDGE2 788 747 -1.02127 -0.048075 0.00398954 1 0 1 1 0 0 +EDGE2 788 767 -1.01097 0.0080239 -0.0212781 1 0 1 1 0 0 +EDGE2 788 787 -0.991579 0.020201 -0.0385081 1 0 1 1 0 0 +EDGE2 789 750 1.0556 0.00143597 0.00355825 1 0 1 1 0 0 +EDGE2 789 770 0.964718 -0.0193736 -0.00336014 1 0 1 1 0 0 +EDGE2 789 748 -1.07495 0.0171385 -0.033177 1 0 1 1 0 0 +EDGE2 789 788 -1.05394 0.00460183 -0.0132693 1 0 1 1 0 0 +EDGE2 789 769 0.0340267 -0.0179468 -0.0210643 1 0 1 1 0 0 +EDGE2 789 749 -0.0457809 0.0791756 0.0138161 1 0 1 1 0 0 +EDGE2 789 768 -1.04282 -0.00942719 0.00548468 1 0 1 1 0 0 +EDGE2 790 750 -0.0573882 0.00723652 -0.00103019 1 0 1 1 0 0 +EDGE2 790 770 -0.0300421 0.0259961 0.00208385 1 0 1 1 0 0 +EDGE2 790 751 -0.0172474 1.06181 1.56699 1 0 1 1 0 0 +EDGE2 790 771 -0.035928 0.992262 1.56022 1 0 1 1 0 0 +EDGE2 790 769 -1.03081 -0.0595617 -0.0175535 1 0 1 1 0 0 +EDGE2 790 789 -0.987093 0.0923595 0.00198459 1 0 1 1 0 0 +EDGE2 790 749 -1.00729 -0.000295252 0.00311554 1 0 1 1 0 0 +EDGE2 791 790 -0.930619 -0.0726054 -1.58967 1 0 1 1 0 0 +EDGE2 791 750 -1.04762 -0.026758 -1.58548 1 0 1 1 0 0 +EDGE2 791 770 -1.02411 -0.1009 -1.55715 1 0 1 1 0 0 +EDGE2 791 751 0.00236446 0.00764961 -0.0161274 1 0 1 1 0 0 +EDGE2 791 771 0.0928759 -0.0610241 -0.00847713 1 0 1 1 0 0 +EDGE2 791 772 0.975384 -0.118621 0.016222 1 0 1 1 0 0 +EDGE2 791 752 0.978114 0.033435 0.000866243 1 0 1 1 0 0 +EDGE2 792 753 1.06716 -0.0192473 0.0241841 1 0 1 1 0 0 +EDGE2 792 751 -1.0205 -0.0280145 0.0112469 1 0 1 1 0 0 +EDGE2 792 771 -1.02311 0.013799 0.000412431 1 0 1 1 0 0 +EDGE2 792 791 -0.975987 0.129821 0.00442615 1 0 1 1 0 0 +EDGE2 792 772 0.113782 0.0212209 0.0356254 1 0 1 1 0 0 +EDGE2 792 752 -0.0431008 -0.00528655 -0.000318923 1 0 1 1 0 0 +EDGE2 792 773 0.98804 0.0342203 0.0138879 1 0 1 1 0 0 +EDGE2 793 753 -0.00331738 0.0632209 -0.0115048 1 0 1 1 0 0 +EDGE2 793 772 -0.966708 -0.0158909 -0.00827282 1 0 1 1 0 0 +EDGE2 793 792 -1.11606 -0.0410341 0.0325328 1 0 1 1 0 0 +EDGE2 793 752 -1.10671 -0.0424795 0.0400871 1 0 1 1 0 0 +EDGE2 793 773 -0.0631455 0.0312638 0.0120144 1 0 1 1 0 0 +EDGE2 793 774 1.0112 -0.0482049 -0.0169747 1 0 1 1 0 0 +EDGE2 793 754 1.05609 -0.0185935 0.00265937 1 0 1 1 0 0 +EDGE2 794 753 -1.08369 0.0245752 -0.00740541 1 0 1 1 0 0 +EDGE2 794 793 -0.988099 0.101214 -0.00603192 1 0 1 1 0 0 +EDGE2 794 773 -1.02049 -0.0810915 0.0160455 1 0 1 1 0 0 +EDGE2 794 774 0.0339789 0.00683116 0.0101352 1 0 1 1 0 0 +EDGE2 794 754 0.0518301 0.0111522 -0.00255571 1 0 1 1 0 0 +EDGE2 794 755 1.00352 -0.0275281 -0.00539363 1 0 1 1 0 0 +EDGE2 794 775 0.961943 -0.0111905 -0.0222888 1 0 1 1 0 0 +EDGE2 794 695 0.916861 0.00321587 -3.15374 1 0 1 1 0 0 +EDGE2 795 774 -1.06227 0.0848736 -0.00586585 1 0 1 1 0 0 +EDGE2 795 794 -1.02882 0.0755159 0.00329013 1 0 1 1 0 0 +EDGE2 795 754 -1.03159 -0.00339597 -0.00739033 1 0 1 1 0 0 +EDGE2 795 755 -0.0356031 -0.00775627 0.0151891 1 0 1 1 0 0 +EDGE2 795 775 -0.102524 -0.0660802 -0.0265301 1 0 1 1 0 0 +EDGE2 795 695 0.0656927 -0.0185435 -3.15117 1 0 1 1 0 0 +EDGE2 795 694 0.921048 0.0676737 -3.15551 1 0 1 1 0 0 +EDGE2 795 696 -0.00183142 1.03371 1.543 1 0 1 1 0 0 +EDGE2 795 756 0.0203703 0.966509 1.57522 1 0 1 1 0 0 +EDGE2 795 776 0.060838 1.06305 1.55591 1 0 1 1 0 0 +EDGE2 796 795 -1.11269 0.0263227 -1.5657 1 0 1 1 0 0 +EDGE2 796 755 -1.03312 0.0443324 -1.54373 1 0 1 1 0 0 +EDGE2 796 775 -1.02974 -0.0435421 -1.5817 1 0 1 1 0 0 +EDGE2 796 695 -0.965519 0.0363703 1.56636 1 0 1 1 0 0 +EDGE2 796 696 -0.0797495 -0.0537146 -0.00894928 1 0 1 1 0 0 +EDGE2 796 756 -0.0106439 0.0472992 0.00725682 1 0 1 1 0 0 +EDGE2 796 776 0.0777264 -0.0307729 -0.0461913 1 0 1 1 0 0 +EDGE2 796 697 1.03432 0.0569119 0.029666 1 0 1 1 0 0 +EDGE2 796 777 0.969809 0.0391346 0.00181032 1 0 1 1 0 0 +EDGE2 796 757 1.05159 0.00950265 0.00625448 1 0 1 1 0 0 +EDGE2 797 796 -1.03701 -0.072702 -0.0274906 1 0 1 1 0 0 +EDGE2 797 696 -1.01765 0.0579301 0.0131045 1 0 1 1 0 0 +EDGE2 797 756 -0.95286 0.0639122 -0.00305674 1 0 1 1 0 0 +EDGE2 797 776 -1.0355 0.0162186 -0.0206883 1 0 1 1 0 0 +EDGE2 797 778 1.00328 0.0195963 -0.0380814 1 0 1 1 0 0 +EDGE2 797 697 -0.0135987 -0.0755971 -0.00769618 1 0 1 1 0 0 +EDGE2 797 777 -0.00378211 -0.0263322 0.0135486 1 0 1 1 0 0 +EDGE2 797 757 0.00769998 0.0439459 -0.00392169 1 0 1 1 0 0 +EDGE2 797 698 1.05665 -0.00290598 -0.0142703 1 0 1 1 0 0 +EDGE2 797 758 0.997977 -0.0529411 -0.00744234 1 0 1 1 0 0 +EDGE2 798 778 0.013772 0.0203429 0.0254169 1 0 1 1 0 0 +EDGE2 798 697 -0.97322 -0.00228386 -0.00107562 1 0 1 1 0 0 +EDGE2 798 777 -0.994801 -0.0436442 0.016946 1 0 1 1 0 0 +EDGE2 798 797 -0.967526 0.0028346 0.0228478 1 0 1 1 0 0 +EDGE2 798 757 -1.01481 0.0659121 0.0581935 1 0 1 1 0 0 +EDGE2 798 699 0.97289 -0.107863 -0.0211483 1 0 1 1 0 0 +EDGE2 798 698 0.00574767 -0.043513 0.00529804 1 0 1 1 0 0 +EDGE2 798 758 0.162836 0.015796 0.0175577 1 0 1 1 0 0 +EDGE2 798 779 0.963525 -0.0669723 -0.00523552 1 0 1 1 0 0 +EDGE2 798 759 0.903821 0.0192668 0.0118072 1 0 1 1 0 0 +EDGE2 799 778 -0.930436 -0.0283504 0.0159403 1 0 1 1 0 0 +EDGE2 799 798 -1.0498 -0.0281891 0.0143681 1 0 1 1 0 0 +EDGE2 799 699 -0.000595376 -0.0738818 -0.00892371 1 0 1 1 0 0 +EDGE2 799 698 -0.978054 -0.0216575 0.00619601 1 0 1 1 0 0 +EDGE2 799 758 -1.00615 -0.0314984 -0.0452747 1 0 1 1 0 0 +EDGE2 799 779 -0.0300849 -0.0157609 0.00735326 1 0 1 1 0 0 +EDGE2 799 759 0.0499262 -0.0879212 -0.0128653 1 0 1 1 0 0 +EDGE2 799 740 0.991034 0.0155753 -3.14032 1 0 1 1 0 0 +EDGE2 799 760 1.02277 0.0122308 -0.00545669 1 0 1 1 0 0 +EDGE2 799 780 1.0586 -0.00365443 0.00892973 1 0 1 1 0 0 +EDGE2 799 700 0.927963 0.0446336 0.0316951 1 0 1 1 0 0 +EDGE2 800 761 -0.020447 0.969174 1.57224 1 0 1 1 0 0 +EDGE2 800 781 -0.0847001 0.921932 1.59377 1 0 1 1 0 0 +EDGE2 800 741 0.0812587 1.01401 1.58579 1 0 1 1 0 0 +EDGE2 800 699 -1.01686 0.0567562 0.0223215 1 0 1 1 0 0 +EDGE2 800 779 -1.03309 -0.0863035 -0.01568 1 0 1 1 0 0 +EDGE2 800 799 -0.988693 -0.0773858 -0.0141345 1 0 1 1 0 0 +EDGE2 800 759 -1.0205 0.0577023 0.00335687 1 0 1 1 0 0 +EDGE2 800 701 -0.0591197 -1.08798 -1.52181 1 0 1 1 0 0 +EDGE2 800 740 0.0257779 -0.12736 -3.12047 1 0 1 1 0 0 +EDGE2 800 760 -0.0473434 0.0701085 0.016627 1 0 1 1 0 0 +EDGE2 800 780 -0.0157244 0.0309232 -0.014627 1 0 1 1 0 0 +EDGE2 800 700 -0.000613296 -0.00552041 -0.0126691 1 0 1 1 0 0 +EDGE2 800 739 0.99136 0.0629251 -3.17271 1 0 1 1 0 0 +EDGE2 801 742 0.966846 -0.0398038 0.0352258 1 0 1 1 0 0 +EDGE2 801 762 1.04969 0.0238282 -0.010676 1 0 1 1 0 0 +EDGE2 801 782 0.997974 0.044537 0.00465831 1 0 1 1 0 0 +EDGE2 801 761 0.0245601 -0.0173136 -0.0132664 1 0 1 1 0 0 +EDGE2 801 781 0.0143607 0.00970446 0.0225793 1 0 1 1 0 0 +EDGE2 801 741 -0.0163724 -0.0276663 -0.00970724 1 0 1 1 0 0 +EDGE2 801 800 -1.07654 -0.00986216 -1.57698 1 0 1 1 0 0 +EDGE2 801 740 -0.94406 0.0996514 1.5675 1 0 1 1 0 0 +EDGE2 801 760 -1.01741 0.0477121 -1.57379 1 0 1 1 0 0 +EDGE2 801 780 -0.950409 -0.0187753 -1.56785 1 0 1 1 0 0 +EDGE2 801 700 -1.02626 -0.00129566 -1.55179 1 0 1 1 0 0 +EDGE2 802 783 0.973316 0.0495612 0.0244814 1 0 1 1 0 0 +EDGE2 802 743 0.899102 0.0174185 0.0161328 1 0 1 1 0 0 +EDGE2 802 763 1.01586 0.0563452 -0.0121101 1 0 1 1 0 0 +EDGE2 802 801 -0.942411 0.0549756 -0.0160253 1 0 1 1 0 0 +EDGE2 802 742 0.0428278 -0.0261868 0.0117766 1 0 1 1 0 0 +EDGE2 802 762 0.0250792 0.0699136 0.011192 1 0 1 1 0 0 +EDGE2 802 782 -0.0167721 -0.00312908 -0.0452875 1 0 1 1 0 0 +EDGE2 802 761 -1.02669 0.0874319 -0.0227616 1 0 1 1 0 0 +EDGE2 802 781 -0.882351 0.0387703 -0.00132995 1 0 1 1 0 0 +EDGE2 802 741 -0.926512 0.0344303 -0.0102779 1 0 1 1 0 0 +EDGE2 803 783 -0.0378831 0.0040744 0.00704723 1 0 1 1 0 0 +EDGE2 803 784 1.13457 -0.00857724 -0.0437888 1 0 1 1 0 0 +EDGE2 803 744 0.916576 -0.0447449 -0.00463708 1 0 1 1 0 0 +EDGE2 803 764 0.981539 -0.0182368 0.00378892 1 0 1 1 0 0 +EDGE2 803 802 -0.969786 0.0387018 0.0278023 1 0 1 1 0 0 +EDGE2 803 743 0.0152952 0.0229119 0.00547623 1 0 1 1 0 0 +EDGE2 803 763 -0.149745 0.0327024 -0.0310143 1 0 1 1 0 0 +EDGE2 803 742 -1.04554 -0.0576502 0.0281776 1 0 1 1 0 0 +EDGE2 803 762 -0.980374 0.00177391 0.0117805 1 0 1 1 0 0 +EDGE2 803 782 -0.998091 0.0605595 0.0246865 1 0 1 1 0 0 +EDGE2 804 783 -1.04961 0.0863004 -0.0117988 1 0 1 1 0 0 +EDGE2 804 785 1.02185 0.0134669 0.00187314 1 0 1 1 0 0 +EDGE2 804 784 -0.0384091 -0.032251 -0.0100946 1 0 1 1 0 0 +EDGE2 804 745 1.08352 -0.0641453 -0.002014 1 0 1 1 0 0 +EDGE2 804 765 1.09882 -0.125711 0.00289668 1 0 1 1 0 0 +EDGE2 804 744 -0.0437885 -0.0149 0.00541822 1 0 1 1 0 0 +EDGE2 804 764 -0.0448815 -0.0602458 -0.0164396 1 0 1 1 0 0 +EDGE2 804 803 -0.996766 0.0471135 0.0373941 1 0 1 1 0 0 +EDGE2 804 743 -1.00669 -0.0418651 -0.0276891 1 0 1 1 0 0 +EDGE2 804 763 -0.993617 0.0511871 0.00864273 1 0 1 1 0 0 +EDGE2 805 766 0.0453714 1.02748 1.57237 1 0 1 1 0 0 +EDGE2 805 786 -0.0755194 1.00073 1.60861 1 0 1 1 0 0 +EDGE2 805 746 -0.0377459 1.0033 1.57546 1 0 1 1 0 0 +EDGE2 805 785 0.0131132 0.0773405 -0.0145719 1 0 1 1 0 0 +EDGE2 805 784 -0.926073 -0.00836085 0.00632249 1 0 1 1 0 0 +EDGE2 805 745 -0.0515813 -0.00136924 -0.0112436 1 0 1 1 0 0 +EDGE2 805 765 -0.0445328 0.0101536 -0.0297386 1 0 1 1 0 0 +EDGE2 805 804 -0.954184 -0.0211462 -0.0186997 1 0 1 1 0 0 +EDGE2 805 744 -1.04822 0.0596664 0.00254553 1 0 1 1 0 0 +EDGE2 805 764 -0.9598 0.0210443 0.0128347 1 0 1 1 0 0 +EDGE2 806 747 0.987044 0.0152253 -0.00149507 1 0 1 1 0 0 +EDGE2 806 767 0.953354 -0.0631837 0.0196087 1 0 1 1 0 0 +EDGE2 806 787 0.961443 0.000958078 -0.0140894 1 0 1 1 0 0 +EDGE2 806 766 -0.000935401 -0.0390183 -0.0275112 1 0 1 1 0 0 +EDGE2 806 786 0.0243566 0.00402544 -0.0128604 1 0 1 1 0 0 +EDGE2 806 746 -0.014662 -0.0488332 0.00384814 1 0 1 1 0 0 +EDGE2 806 785 -1.05692 -0.0353633 -1.58845 1 0 1 1 0 0 +EDGE2 806 805 -1.00586 0.0501538 -1.5823 1 0 1 1 0 0 +EDGE2 806 745 -1.02601 0.0116754 -1.56907 1 0 1 1 0 0 +EDGE2 806 765 -0.983521 -0.103509 -1.55975 1 0 1 1 0 0 +EDGE2 807 748 1.06963 0.0240274 0.0110535 1 0 1 1 0 0 +EDGE2 807 788 1.03627 0.0518115 -0.00563421 1 0 1 1 0 0 +EDGE2 807 768 1.11113 -0.0271707 0.018994 1 0 1 1 0 0 +EDGE2 807 747 -0.0232075 -0.000628486 0.00690185 1 0 1 1 0 0 +EDGE2 807 767 0.155264 -0.0431184 -0.0339789 1 0 1 1 0 0 +EDGE2 807 787 -0.064845 0.0101985 0.00386474 1 0 1 1 0 0 +EDGE2 807 806 -0.998508 0.012269 -0.00573898 1 0 1 1 0 0 +EDGE2 807 766 -0.967641 0.0563961 0.0182037 1 0 1 1 0 0 +EDGE2 807 786 -0.966058 0.0373333 -0.0233538 1 0 1 1 0 0 +EDGE2 807 746 -1.09334 -0.0394715 -0.00228229 1 0 1 1 0 0 +EDGE2 808 748 -0.0976673 -0.0928808 0.0409899 1 0 1 1 0 0 +EDGE2 808 788 -0.0806465 -0.00634904 0.025308 1 0 1 1 0 0 +EDGE2 808 769 1.04512 0.128302 0.0239434 1 0 1 1 0 0 +EDGE2 808 789 0.867671 0.0561619 0.00839428 1 0 1 1 0 0 +EDGE2 808 749 1.00058 0.0774607 -0.0210665 1 0 1 1 0 0 +EDGE2 808 768 0.0607909 -0.100904 -0.0129611 1 0 1 1 0 0 +EDGE2 808 747 -0.997766 0.00114718 0.0523903 1 0 1 1 0 0 +EDGE2 808 767 -1.05007 0.0106902 -0.0179353 1 0 1 1 0 0 +EDGE2 808 807 -0.957306 0.0334001 0.0234708 1 0 1 1 0 0 +EDGE2 808 787 -1.06773 0.0112824 0.00922021 1 0 1 1 0 0 +EDGE2 809 790 0.97623 0.00284268 0.00556048 1 0 1 1 0 0 +EDGE2 809 750 0.951101 0.0423368 0.0298782 1 0 1 1 0 0 +EDGE2 809 770 0.886231 -0.000950579 0.0271239 1 0 1 1 0 0 +EDGE2 809 748 -1.048 0.0862337 -0.00705839 1 0 1 1 0 0 +EDGE2 809 788 -0.933936 -0.0484341 -0.00595489 1 0 1 1 0 0 +EDGE2 809 769 -0.00171226 0.0793109 -0.0213587 1 0 1 1 0 0 +EDGE2 809 789 0.042832 0.00940114 0.0258001 1 0 1 1 0 0 +EDGE2 809 749 0.0357872 -0.0306725 0.0063226 1 0 1 1 0 0 +EDGE2 809 808 -0.953789 -0.0450174 -0.00419149 1 0 1 1 0 0 +EDGE2 809 768 -0.969188 -0.0258493 -0.0133509 1 0 1 1 0 0 +EDGE2 810 790 -0.0122585 -0.0216024 0.0186 1 0 1 1 0 0 +EDGE2 810 750 0.0227622 0.0517501 -0.00117182 1 0 1 1 0 0 +EDGE2 810 770 -0.00864875 0.0925505 -0.0371576 1 0 1 1 0 0 +EDGE2 810 751 -0.0269424 0.943157 1.57269 1 0 1 1 0 0 +EDGE2 810 771 0.0404512 1.01569 1.62849 1 0 1 1 0 0 +EDGE2 810 791 0.0405047 0.940561 1.57818 1 0 1 1 0 0 +EDGE2 810 769 -1.01808 -0.0562672 -0.0155925 1 0 1 1 0 0 +EDGE2 810 809 -0.950903 0.0199004 0.0242109 1 0 1 1 0 0 +EDGE2 810 789 -0.944193 -0.0135094 0.00437276 1 0 1 1 0 0 +EDGE2 810 749 -1.00736 0.00547075 -0.00766446 1 0 1 1 0 0 +EDGE2 811 790 -1.01713 -0.095858 -1.53541 1 0 1 1 0 0 +EDGE2 811 810 -1.02847 0.0435656 -1.6078 1 0 1 1 0 0 +EDGE2 811 750 -1.05901 -0.0229092 -1.58521 1 0 1 1 0 0 +EDGE2 811 770 -1.07548 -0.0283729 -1.54734 1 0 1 1 0 0 +EDGE2 811 751 -0.00729584 -0.0279965 -0.0250336 1 0 1 1 0 0 +EDGE2 811 771 0.0529656 0.053226 0.0336164 1 0 1 1 0 0 +EDGE2 811 791 0.0120026 -0.0571493 -0.0231786 1 0 1 1 0 0 +EDGE2 811 772 0.98965 -0.0016767 -0.0285347 1 0 1 1 0 0 +EDGE2 811 792 1.07815 0.0582232 0.00772741 1 0 1 1 0 0 +EDGE2 811 752 0.969787 -0.0152433 -0.0167735 1 0 1 1 0 0 +EDGE2 812 753 1.01974 -0.0250387 0.00117895 1 0 1 1 0 0 +EDGE2 812 811 -0.977796 0.0193161 0.0143867 1 0 1 1 0 0 +EDGE2 812 751 -1.0334 0.0095691 -0.0337364 1 0 1 1 0 0 +EDGE2 812 771 -1.06396 0.0459771 0.0380859 1 0 1 1 0 0 +EDGE2 812 791 -1.01553 0.00495014 -0.00424323 1 0 1 1 0 0 +EDGE2 812 772 -0.0187653 -0.0821531 0.0272405 1 0 1 1 0 0 +EDGE2 812 792 0.0332675 -0.00489123 -0.00133577 1 0 1 1 0 0 +EDGE2 812 752 0.0057256 0.00889728 0.0185038 1 0 1 1 0 0 +EDGE2 812 793 1.05627 0.0274031 -0.0373734 1 0 1 1 0 0 +EDGE2 812 773 0.94278 -0.0458899 -0.0224899 1 0 1 1 0 0 +EDGE2 813 753 -0.00215283 -0.0565752 -0.00202249 1 0 1 1 0 0 +EDGE2 813 772 -1.07941 -0.034716 -0.00265135 1 0 1 1 0 0 +EDGE2 813 792 -1.03836 -0.00439031 0.00200766 1 0 1 1 0 0 +EDGE2 813 812 -0.961321 -0.0904921 -0.0173465 1 0 1 1 0 0 +EDGE2 813 752 -0.939873 -0.0465623 0.029804 1 0 1 1 0 0 +EDGE2 813 793 -0.0578126 -0.0797778 0.00846834 1 0 1 1 0 0 +EDGE2 813 773 -0.0366963 -0.0558735 -0.00332387 1 0 1 1 0 0 +EDGE2 813 774 0.941482 -0.00151663 -0.0139085 1 0 1 1 0 0 +EDGE2 813 794 0.991089 -0.054219 -0.0245203 1 0 1 1 0 0 +EDGE2 813 754 1.169 0.0286578 0.00225729 1 0 1 1 0 0 +EDGE2 814 753 -0.947241 -0.0410611 -0.0074678 1 0 1 1 0 0 +EDGE2 814 793 -0.921536 0.0255402 -0.0241219 1 0 1 1 0 0 +EDGE2 814 813 -0.936156 -0.0341541 -0.0048646 1 0 1 1 0 0 +EDGE2 814 773 -1.03893 0.0312313 0.00946083 1 0 1 1 0 0 +EDGE2 814 774 -0.0692638 -0.0213185 -0.00823063 1 0 1 1 0 0 +EDGE2 814 794 0.0156812 0.0498521 0.0127561 1 0 1 1 0 0 +EDGE2 814 754 0.0296691 -0.0494056 -0.0102882 1 0 1 1 0 0 +EDGE2 814 795 1.04457 -0.0106423 -0.024683 1 0 1 1 0 0 +EDGE2 814 755 0.996171 0.0171519 -0.00984798 1 0 1 1 0 0 +EDGE2 814 775 0.937131 -0.00293841 -0.00407849 1 0 1 1 0 0 +EDGE2 814 695 1.08975 0.00832974 -3.14652 1 0 1 1 0 0 +EDGE2 815 774 -0.95754 0.00810496 -0.00106438 1 0 1 1 0 0 +EDGE2 815 814 -0.988288 0.0449267 0.0460616 1 0 1 1 0 0 +EDGE2 815 794 -0.993167 -0.0207654 -0.00742238 1 0 1 1 0 0 +EDGE2 815 754 -1.03463 -0.00963355 -0.0269215 1 0 1 1 0 0 +EDGE2 815 795 0.0661292 0.00657259 0.00893932 1 0 1 1 0 0 +EDGE2 815 755 -0.033201 0.0230421 0.00179832 1 0 1 1 0 0 +EDGE2 815 775 0.0667151 0.00191474 0.0157571 1 0 1 1 0 0 +EDGE2 815 695 -0.0482213 0.077356 -3.16298 1 0 1 1 0 0 +EDGE2 815 694 0.949164 0.0142394 -3.14143 1 0 1 1 0 0 +EDGE2 815 796 -0.0659435 0.970486 1.54714 1 0 1 1 0 0 +EDGE2 815 696 -0.0308067 1.00502 1.5748 1 0 1 1 0 0 +EDGE2 815 756 0.00237489 1.01228 1.56934 1 0 1 1 0 0 +EDGE2 815 776 0.110895 1.077 1.53624 1 0 1 1 0 0 +EDGE2 816 795 -0.940969 -0.017107 -1.55582 1 0 1 1 0 0 +EDGE2 816 815 -0.883724 -0.0458668 -1.57222 1 0 1 1 0 0 +EDGE2 816 755 -0.922669 -0.0663832 -1.57754 1 0 1 1 0 0 +EDGE2 816 775 -0.991802 -0.0304565 -1.57507 1 0 1 1 0 0 +EDGE2 816 695 -1.01716 0.0317729 1.58309 1 0 1 1 0 0 +EDGE2 816 796 -0.00680266 0.0148579 -3.14701e-05 1 0 1 1 0 0 +EDGE2 816 696 0.0469768 0.0948592 0.0102615 1 0 1 1 0 0 +EDGE2 816 756 -0.0197941 0.0200558 0.00831007 1 0 1 1 0 0 +EDGE2 816 776 0.00435361 0.0328703 -0.05514 1 0 1 1 0 0 +EDGE2 816 697 1.03085 0.0491204 -0.00812052 1 0 1 1 0 0 +EDGE2 816 777 0.946377 -0.0453745 0.0441082 1 0 1 1 0 0 +EDGE2 816 797 1.00883 -0.0995486 0.0215698 1 0 1 1 0 0 +EDGE2 816 757 0.979205 0.0180431 -0.0133759 1 0 1 1 0 0 +EDGE2 817 796 -1.07128 -0.0435003 -0.0315111 1 0 1 1 0 0 +EDGE2 817 816 -0.987976 -0.00951846 -0.04347 1 0 1 1 0 0 +EDGE2 817 696 -1.04284 0.0670384 0.0132268 1 0 1 1 0 0 +EDGE2 817 756 -1.04452 -0.0206982 0.00263337 1 0 1 1 0 0 +EDGE2 817 776 -1.05009 -0.0424609 0.009517 1 0 1 1 0 0 +EDGE2 817 778 0.99062 0.140956 0.012558 1 0 1 1 0 0 +EDGE2 817 798 1.05622 -0.0075242 0.0221799 1 0 1 1 0 0 +EDGE2 817 697 0.0229822 0.02396 -0.0593369 1 0 1 1 0 0 +EDGE2 817 777 -0.00925412 0.0178866 -0.0149127 1 0 1 1 0 0 +EDGE2 817 797 0.0210812 0.0139777 -0.016276 1 0 1 1 0 0 +EDGE2 817 757 -0.0214433 0.0360557 0.0334033 1 0 1 1 0 0 +EDGE2 817 698 0.978083 0.0794401 -0.00149067 1 0 1 1 0 0 +EDGE2 817 758 1.03746 0.0271093 0.0243719 1 0 1 1 0 0 +EDGE2 818 778 0.0107607 0.087805 -0.0313223 1 0 1 1 0 0 +EDGE2 818 798 0.0479949 0.00505924 -0.00428713 1 0 1 1 0 0 +EDGE2 818 697 -1.06728 0.0172405 0.00166497 1 0 1 1 0 0 +EDGE2 818 777 -0.944994 -0.0126745 -0.0272247 1 0 1 1 0 0 +EDGE2 818 797 -0.983017 0.0240628 -0.008099 1 0 1 1 0 0 +EDGE2 818 817 -1.02543 0.0176397 -0.0213907 1 0 1 1 0 0 +EDGE2 818 757 -1.0038 -0.0106597 0.0118849 1 0 1 1 0 0 +EDGE2 818 699 1.01265 -0.057671 -0.0319554 1 0 1 1 0 0 +EDGE2 818 698 -0.0423617 0.0166022 0.0317134 1 0 1 1 0 0 +EDGE2 818 758 0.0416154 0.0404235 -0.0150649 1 0 1 1 0 0 +EDGE2 818 779 1.05078 0.0176987 0.0104275 1 0 1 1 0 0 +EDGE2 818 799 0.999678 0.0214985 0.00747441 1 0 1 1 0 0 +EDGE2 818 759 0.937872 0.0329887 0.028268 1 0 1 1 0 0 +EDGE2 819 800 0.969199 -0.0384163 0.0107979 1 0 1 1 0 0 +EDGE2 819 778 -0.986577 -0.0494247 0.00945691 1 0 1 1 0 0 +EDGE2 819 798 -1.01362 -0.0967884 0.0438443 1 0 1 1 0 0 +EDGE2 819 818 -1.02008 -0.00124976 0.00998101 1 0 1 1 0 0 +EDGE2 819 699 -0.0353199 -0.035449 -0.0190641 1 0 1 1 0 0 +EDGE2 819 698 -1.01671 0.0718203 -0.011803 1 0 1 1 0 0 +EDGE2 819 758 -1.04207 0.0830447 -0.0109691 1 0 1 1 0 0 +EDGE2 819 779 0.00774577 0.0414226 0.0337031 1 0 1 1 0 0 +EDGE2 819 799 -0.0079257 -0.0237311 0.00561056 1 0 1 1 0 0 +EDGE2 819 759 0.0106848 0.00896775 0.00806073 1 0 1 1 0 0 +EDGE2 819 740 0.995485 0.0364221 -3.10467 1 0 1 1 0 0 +EDGE2 819 760 0.986384 -0.012264 -0.0257265 1 0 1 1 0 0 +EDGE2 819 780 0.953145 0.00963716 9.49367e-05 1 0 1 1 0 0 +EDGE2 819 700 0.914779 0.000604879 -0.0122665 1 0 1 1 0 0 +EDGE2 820 801 0.00953978 1.00995 1.56154 1 0 1 1 0 0 +EDGE2 820 761 0.0484179 1.03191 1.62169 1 0 1 1 0 0 +EDGE2 820 781 -0.0274896 0.99004 1.56379 1 0 1 1 0 0 +EDGE2 820 741 -0.0337639 1.02068 1.55471 1 0 1 1 0 0 +EDGE2 820 800 -0.0180462 0.00647928 0.0231376 1 0 1 1 0 0 +EDGE2 820 699 -0.991341 0.0203264 -0.005042 1 0 1 1 0 0 +EDGE2 820 779 -0.991435 -0.00153461 -0.0174387 1 0 1 1 0 0 +EDGE2 820 799 -0.920475 0.0776701 0.0251659 1 0 1 1 0 0 +EDGE2 820 819 -0.93502 -0.0176407 -0.00229029 1 0 1 1 0 0 +EDGE2 820 759 -1.04048 0.00458119 0.0187034 1 0 1 1 0 0 +EDGE2 820 701 -0.0357072 -0.887573 -1.61406 1 0 1 1 0 0 +EDGE2 820 740 -0.0464821 -0.0306901 -3.11526 1 0 1 1 0 0 +EDGE2 820 760 -0.0671983 -0.0170574 0.0424408 1 0 1 1 0 0 +EDGE2 820 780 -0.0268278 0.00805165 -0.0409946 1 0 1 1 0 0 +EDGE2 820 700 0.0753336 0.0290462 0.0106882 1 0 1 1 0 0 +EDGE2 820 739 0.949294 0.0180977 -3.15898 1 0 1 1 0 0 +EDGE2 821 800 -0.968717 -0.00470601 1.56716 1 0 1 1 0 0 +EDGE2 821 820 -1.04407 -0.0836935 1.56595 1 0 1 1 0 0 +EDGE2 821 701 0.0738686 -0.0820613 -0.00771267 1 0 1 1 0 0 +EDGE2 821 740 -1.08234 0.0427682 -1.56292 1 0 1 1 0 0 +EDGE2 821 760 -1.02631 0.0269241 1.55261 1 0 1 1 0 0 +EDGE2 821 780 -0.921764 0.0344935 1.54685 1 0 1 1 0 0 +EDGE2 821 700 -0.978355 0.0137548 1.61148 1 0 1 1 0 0 +EDGE2 821 702 0.932189 0.0324497 0.0441169 1 0 1 1 0 0 +EDGE2 822 701 -0.956813 0.0286999 -0.00330353 1 0 1 1 0 0 +EDGE2 822 821 -0.932635 0.0033721 0.0348856 1 0 1 1 0 0 +EDGE2 822 702 0.00728502 -0.0230496 0.00163964 1 0 1 1 0 0 +EDGE2 822 703 0.915955 0.0302994 -0.0215955 1 0 1 1 0 0 +EDGE2 823 822 -0.973657 0.0214371 0.00357261 1 0 1 1 0 0 +EDGE2 823 702 -0.993437 -0.0913822 -0.00484421 1 0 1 1 0 0 +EDGE2 823 703 -0.0377296 0.0441724 0.00110443 1 0 1 1 0 0 +EDGE2 823 704 1.01972 0.0235761 -0.0312152 1 0 1 1 0 0 +EDGE2 824 703 -0.983399 -0.0992243 -0.0401465 1 0 1 1 0 0 +EDGE2 824 823 -1.06841 -0.0427316 0.0284634 1 0 1 1 0 0 +EDGE2 824 704 0.072603 -0.028402 0.0409458 1 0 1 1 0 0 +EDGE2 824 705 1.04314 0.0589478 -0.0279559 1 0 1 1 0 0 +EDGE2 825 824 -0.960196 -0.0266913 -0.0249421 1 0 1 1 0 0 +EDGE2 825 704 -1.07369 -0.16007 0.0290263 1 0 1 1 0 0 +EDGE2 825 705 0.00155394 0.0302624 -0.00480086 1 0 1 1 0 0 +EDGE2 825 706 -0.0426297 0.936279 1.56537 1 0 1 1 0 0 +EDGE2 826 705 -0.972688 -0.0604336 1.58039 1 0 1 1 0 0 +EDGE2 826 825 -1.03055 3.29166e-05 1.56392 1 0 1 1 0 0 +EDGE2 827 826 -0.997685 0.0639734 0.020761 1 0 1 1 0 0 +EDGE2 828 827 -1.02785 0.0603507 -0.00558162 1 0 1 1 0 0 +EDGE2 829 690 1.00585 0.0115895 -3.14963 1 0 1 1 0 0 +EDGE2 829 828 -0.941542 0.037669 0.00166524 1 0 1 1 0 0 +EDGE2 830 691 0.0255241 -1.07092 -1.57038 1 0 1 1 0 0 +EDGE2 830 690 0.0353803 0.0281199 -3.17336 1 0 1 1 0 0 +EDGE2 830 689 1.04153 -0.0717463 -3.18143 1 0 1 1 0 0 +EDGE2 830 829 -0.958588 0.105568 0.0132798 1 0 1 1 0 0 +EDGE2 831 690 -0.948055 -0.00635831 1.57289 1 0 1 1 0 0 +EDGE2 831 830 -1.05061 0.0304232 -1.57066 1 0 1 1 0 0 +EDGE2 832 831 -0.998523 -0.0422728 -0.0103438 1 0 1 1 0 0 +EDGE2 833 832 -1.01376 0.0217491 -0.0137042 1 0 1 1 0 0 +EDGE2 834 833 -0.942125 -0.0406953 -0.0232405 1 0 1 1 0 0 +EDGE2 835 834 -1.0163 9.62191e-05 0.00663761 1 0 1 1 0 0 +EDGE2 836 835 -0.939549 -0.0359051 -1.61331 1 0 1 1 0 0 +EDGE2 837 836 -0.921513 -0.0275404 0.00716833 1 0 1 1 0 0 +EDGE2 838 837 -1.01849 0.0480591 -0.0168816 1 0 1 1 0 0 +EDGE2 839 838 -0.998105 -0.0444815 -0.0241785 1 0 1 1 0 0 +EDGE2 840 839 -1.0044 0.0387885 0.0165438 1 0 1 1 0 0 +EDGE2 841 840 -0.857325 -0.0316675 -1.57013 1 0 1 1 0 0 +EDGE2 842 841 -0.925773 0.0286151 0.0121278 1 0 1 1 0 0 +EDGE2 843 842 -1.03657 -0.011697 0.0131785 1 0 1 1 0 0 +EDGE2 844 705 1.03099 -0.00693443 -3.189 1 0 1 1 0 0 +EDGE2 844 825 0.915183 -0.00880792 -3.12249 1 0 1 1 0 0 +EDGE2 844 843 -1.03769 -0.0292703 0.0284987 1 0 1 1 0 0 +EDGE2 845 824 1.04695 0.0262252 -3.15281 1 0 1 1 0 0 +EDGE2 845 704 1.0229 0.0162803 -3.1538 1 0 1 1 0 0 +EDGE2 845 826 0.0388456 0.99473 1.59576 1 0 1 1 0 0 +EDGE2 845 705 0.0452062 0.0646702 -3.12103 1 0 1 1 0 0 +EDGE2 845 825 -0.0158379 0.0394008 -3.1085 1 0 1 1 0 0 +EDGE2 845 844 -0.888741 -0.0337898 -0.0219288 1 0 1 1 0 0 +EDGE2 845 706 -0.0246858 -0.980284 -1.57889 1 0 1 1 0 0 +EDGE2 846 827 0.946933 -0.0341665 0.0139755 1 0 1 1 0 0 +EDGE2 846 826 0.118155 0.0652906 -0.0190718 1 0 1 1 0 0 +EDGE2 846 705 -1.05225 0.0244503 1.57255 1 0 1 1 0 0 +EDGE2 846 825 -0.915597 -0.0465881 1.56256 1 0 1 1 0 0 +EDGE2 846 845 -1.02967 -0.0342215 -1.58325 1 0 1 1 0 0 +EDGE2 847 828 1.06973 -0.016352 0.00198496 1 0 1 1 0 0 +EDGE2 847 827 -0.0110826 -0.00871104 -0.00358268 1 0 1 1 0 0 +EDGE2 847 826 -0.963145 -0.0245967 0.012544 1 0 1 1 0 0 +EDGE2 847 846 -1.03027 0.0341937 0.00871591 1 0 1 1 0 0 +EDGE2 848 829 1.07862 -0.00684003 -0.0322395 1 0 1 1 0 0 +EDGE2 848 828 0.0344772 0.0232808 0.00907853 1 0 1 1 0 0 +EDGE2 848 847 -1.01769 0.110744 -0.0143496 1 0 1 1 0 0 +EDGE2 848 827 -1.01265 -0.0349736 -0.0200383 1 0 1 1 0 0 +EDGE2 849 690 0.97235 -0.0238068 -3.17186 1 0 1 1 0 0 +EDGE2 849 830 0.995704 -0.000177135 -0.0090856 1 0 1 1 0 0 +EDGE2 849 829 0.0221116 0.0141517 0.0111971 1 0 1 1 0 0 +EDGE2 849 828 -1.00489 -0.0262829 -0.0317681 1 0 1 1 0 0 +EDGE2 849 848 -1.02836 -0.124876 0.0241288 1 0 1 1 0 0 +EDGE2 850 691 -0.0862483 -0.957478 -1.55816 1 0 1 1 0 0 +EDGE2 850 690 0.0417354 0.00320767 -3.11411 1 0 1 1 0 0 +EDGE2 850 689 0.951732 0.00302232 -3.13283 1 0 1 1 0 0 +EDGE2 850 830 0.0289408 0.0244065 0.00720574 1 0 1 1 0 0 +EDGE2 850 831 -0.0130204 0.967537 1.55665 1 0 1 1 0 0 +EDGE2 850 829 -0.901517 -0.0551703 -0.0302245 1 0 1 1 0 0 +EDGE2 850 849 -0.989879 0.0779723 -0.0325541 1 0 1 1 0 0 +EDGE2 851 690 -1.01249 -0.0517811 1.57356 1 0 1 1 0 0 +EDGE2 851 850 -1.05591 -0.135006 -1.57321 1 0 1 1 0 0 +EDGE2 851 830 -0.970539 -0.0577691 -1.55271 1 0 1 1 0 0 +EDGE2 851 831 -0.053058 -0.0295675 -0.00656916 1 0 1 1 0 0 +EDGE2 851 832 1.05096 -0.0264416 0.00477779 1 0 1 1 0 0 +EDGE2 852 851 -1.04077 -0.0459349 0.00392616 1 0 1 1 0 0 +EDGE2 852 831 -1.06458 -0.036946 0.0270636 1 0 1 1 0 0 +EDGE2 852 832 -0.0783534 0.0860933 -0.00958949 1 0 1 1 0 0 +EDGE2 852 833 1.07845 0.00106833 -0.00224604 1 0 1 1 0 0 +EDGE2 853 832 -1.00913 0.0356147 0.00408096 1 0 1 1 0 0 +EDGE2 853 852 -0.95907 0.00942069 -0.00523938 1 0 1 1 0 0 +EDGE2 853 833 -0.0353214 -0.0674333 -0.00802346 1 0 1 1 0 0 +EDGE2 853 834 1.03065 0.0547557 -0.0108023 1 0 1 1 0 0 +EDGE2 854 833 -0.887005 -0.0140385 0.0192685 1 0 1 1 0 0 +EDGE2 854 853 -1.01895 0.0340336 0.0183916 1 0 1 1 0 0 +EDGE2 854 834 -0.0581471 0.0397678 -0.00104398 1 0 1 1 0 0 +EDGE2 854 835 0.955918 -0.0350617 -0.0420454 1 0 1 1 0 0 +EDGE2 855 834 -0.966496 -0.00921949 -0.00280609 1 0 1 1 0 0 +EDGE2 855 854 -1.05623 0.0899103 -0.0141769 1 0 1 1 0 0 +EDGE2 855 835 0.0942495 0.0186176 -0.0271727 1 0 1 1 0 0 +EDGE2 855 836 -0.0326112 0.927523 1.56184 1 0 1 1 0 0 +EDGE2 856 855 -0.95295 0.0371157 -1.61452 1 0 1 1 0 0 +EDGE2 856 835 -1.06621 0.0638966 -1.55379 1 0 1 1 0 0 +EDGE2 856 836 0.044631 0.0171689 -0.0414255 1 0 1 1 0 0 +EDGE2 856 837 1.14073 0.0259785 -0.044621 1 0 1 1 0 0 +EDGE2 857 856 -1.05665 0.0201597 0.0270844 1 0 1 1 0 0 +EDGE2 857 836 -1.07606 -0.0740837 0.0369179 1 0 1 1 0 0 +EDGE2 857 837 0.0387385 0.0251476 -0.00390476 1 0 1 1 0 0 +EDGE2 857 838 0.963934 -0.00253434 0.00882741 1 0 1 1 0 0 +EDGE2 858 857 -1.0031 0.0168313 -0.0124767 1 0 1 1 0 0 +EDGE2 858 837 -1.02304 -0.0270217 -0.0197189 1 0 1 1 0 0 +EDGE2 858 838 -0.0351691 -0.0135052 -0.0252139 1 0 1 1 0 0 +EDGE2 858 839 1.05169 0.0120064 -0.0397277 1 0 1 1 0 0 +EDGE2 859 858 -1.02767 -0.065047 -0.0364427 1 0 1 1 0 0 +EDGE2 859 838 -1.055 -0.0435416 -0.0203191 1 0 1 1 0 0 +EDGE2 859 839 -0.0234983 -0.0608665 -0.0560718 1 0 1 1 0 0 +EDGE2 859 840 0.986598 0.0153298 0.00796953 1 0 1 1 0 0 +EDGE2 860 839 -0.991546 0.00119273 -0.0247775 1 0 1 1 0 0 +EDGE2 860 859 -1.01802 0.0180341 -0.0192704 1 0 1 1 0 0 +EDGE2 860 841 0.0206616 1.0164 1.54547 1 0 1 1 0 0 +EDGE2 860 840 0.0640798 0.0295103 -0.0191 1 0 1 1 0 0 +EDGE2 861 842 1.03288 0.00606485 0.0286593 1 0 1 1 0 0 +EDGE2 861 841 0.0411912 0.00663197 -0.0129649 1 0 1 1 0 0 +EDGE2 861 840 -1.02897 0.0295763 -1.55244 1 0 1 1 0 0 +EDGE2 861 860 -0.995273 -0.00127546 -1.58206 1 0 1 1 0 0 +EDGE2 862 843 1.03261 0.00922297 0.0263826 1 0 1 1 0 0 +EDGE2 862 842 -0.054954 0.0159458 -0.0121906 1 0 1 1 0 0 +EDGE2 862 841 -0.984516 0.0407704 0.0225816 1 0 1 1 0 0 +EDGE2 862 861 -1.01971 -0.0190689 -0.00442791 1 0 1 1 0 0 +EDGE2 863 844 0.954161 -0.00954517 0.014347 1 0 1 1 0 0 +EDGE2 863 843 -0.0620428 -0.0258212 0.0139153 1 0 1 1 0 0 +EDGE2 863 842 -0.981308 -0.0336837 -0.0254372 1 0 1 1 0 0 +EDGE2 863 862 -1.06365 0.0454177 -0.0246521 1 0 1 1 0 0 +EDGE2 864 705 0.900709 0.0324458 -3.16577 1 0 1 1 0 0 +EDGE2 864 825 1.0584 0.00532619 -3.15657 1 0 1 1 0 0 +EDGE2 864 845 0.991379 0.00330885 0.0272754 1 0 1 1 0 0 +EDGE2 864 844 0.00682781 0.0219995 -0.0149469 1 0 1 1 0 0 +EDGE2 864 863 -1.03187 0.0542825 0.0154673 1 0 1 1 0 0 +EDGE2 864 843 -1.03576 -0.107112 0.0138726 1 0 1 1 0 0 +EDGE2 865 824 1.09309 -0.00139686 -3.09611 1 0 1 1 0 0 +EDGE2 865 704 1.04603 -0.0471786 -3.14001 1 0 1 1 0 0 +EDGE2 865 826 0.0334411 1.02733 1.60611 1 0 1 1 0 0 +EDGE2 865 846 0.0200124 1.05386 1.55064 1 0 1 1 0 0 +EDGE2 865 864 -1.05958 -0.0530779 -0.00907755 1 0 1 1 0 0 +EDGE2 865 705 -0.0418266 -0.131487 -3.13969 1 0 1 1 0 0 +EDGE2 865 825 0.0400518 0.0356685 -3.13917 1 0 1 1 0 0 +EDGE2 865 845 -0.0668286 -0.0352914 0.00247561 1 0 1 1 0 0 +EDGE2 865 844 -0.994077 0.0255992 -0.0301023 1 0 1 1 0 0 +EDGE2 865 706 0.0708384 -1.03913 -1.57128 1 0 1 1 0 0 +EDGE2 866 865 -1.05907 0.0469949 -1.57079 1 0 1 1 0 0 +EDGE2 866 847 0.943365 0.00430772 0.000775776 1 0 1 1 0 0 +EDGE2 866 827 0.927998 -0.0401914 0.0140703 1 0 1 1 0 0 +EDGE2 866 826 0.0724062 0.0347607 -0.0242336 1 0 1 1 0 0 +EDGE2 866 846 -0.136624 -0.00648025 0.00803768 1 0 1 1 0 0 +EDGE2 866 705 -0.967977 -0.00532707 1.54871 1 0 1 1 0 0 +EDGE2 866 825 -1.03248 -0.119999 1.58566 1 0 1 1 0 0 +EDGE2 866 845 -0.98346 -0.000751954 -1.56334 1 0 1 1 0 0 +EDGE2 867 828 0.988866 0.0523059 -0.0337011 1 0 1 1 0 0 +EDGE2 867 848 1.02786 0.0424659 -0.00398885 1 0 1 1 0 0 +EDGE2 867 847 0.061017 -0.00360069 -0.00132826 1 0 1 1 0 0 +EDGE2 867 827 -0.00561299 0.0307039 0.01797 1 0 1 1 0 0 +EDGE2 867 826 -0.983931 0.0185811 0.0219328 1 0 1 1 0 0 +EDGE2 867 866 -1.07379 0.00724418 0.00284524 1 0 1 1 0 0 +EDGE2 867 846 -1.04819 -0.0591448 -0.0135869 1 0 1 1 0 0 +EDGE2 868 829 0.99405 0.0131436 -0.0163163 1 0 1 1 0 0 +EDGE2 868 849 1.02062 0.045099 0.0204533 1 0 1 1 0 0 +EDGE2 868 828 -0.000792677 0.0787423 0.0223775 1 0 1 1 0 0 +EDGE2 868 848 0.0502005 0.0347936 0.000340937 1 0 1 1 0 0 +EDGE2 868 847 -1.02903 -0.0428279 0.00880318 1 0 1 1 0 0 +EDGE2 868 867 -0.972602 -0.00836861 0.00778216 1 0 1 1 0 0 +EDGE2 868 827 -0.982466 -0.0625614 0.0332364 1 0 1 1 0 0 +EDGE2 869 690 0.977039 0.0567404 -3.12744 1 0 1 1 0 0 +EDGE2 869 850 0.972779 -0.017379 0.010007 1 0 1 1 0 0 +EDGE2 869 830 0.990969 -0.0391452 -0.00800224 1 0 1 1 0 0 +EDGE2 869 829 0.0893417 -0.0142081 0.01367 1 0 1 1 0 0 +EDGE2 869 849 -0.0877129 -0.0738329 0.00550637 1 0 1 1 0 0 +EDGE2 869 828 -1.00596 -0.066576 0.0243074 1 0 1 1 0 0 +EDGE2 869 848 -1.09474 -0.00793776 0.0113374 1 0 1 1 0 0 +EDGE2 869 868 -0.975563 -0.0373911 0.0195671 1 0 1 1 0 0 +EDGE2 870 691 0.00717831 -1.0568 -1.59396 1 0 1 1 0 0 +EDGE2 870 690 -0.00038441 0.0169201 -3.11308 1 0 1 1 0 0 +EDGE2 870 689 0.949571 -0.00961048 -3.09597 1 0 1 1 0 0 +EDGE2 870 850 -0.06589 -0.0349811 0.00677169 1 0 1 1 0 0 +EDGE2 870 830 4.39718e-05 -0.0284744 -0.0303508 1 0 1 1 0 0 +EDGE2 870 851 0.0577917 0.914374 1.60889 1 0 1 1 0 0 +EDGE2 870 831 -0.0459557 0.995892 1.57654 1 0 1 1 0 0 +EDGE2 870 869 -1.05601 0.00426648 -0.0191827 1 0 1 1 0 0 +EDGE2 870 829 -1.07081 -0.045912 0.00229477 1 0 1 1 0 0 +EDGE2 870 849 -1.02314 -0.0268422 0.00404809 1 0 1 1 0 0 +EDGE2 871 692 0.957585 0.0255973 -0.00270184 1 0 1 1 0 0 +EDGE2 871 691 0.0659912 -0.00360959 0.02144 1 0 1 1 0 0 +EDGE2 871 690 -1.05528 0.00624702 -1.55826 1 0 1 1 0 0 +EDGE2 871 850 -1.00299 0.00130585 1.55781 1 0 1 1 0 0 +EDGE2 871 870 -0.98135 0.018816 1.55499 1 0 1 1 0 0 +EDGE2 871 830 -1.00513 -0.0293304 1.57107 1 0 1 1 0 0 +EDGE2 872 693 0.947413 0.0219862 0.00820313 1 0 1 1 0 0 +EDGE2 872 692 -0.01994 0.13077 -0.00103771 1 0 1 1 0 0 +EDGE2 872 691 -0.979995 0.0325607 -0.0174887 1 0 1 1 0 0 +EDGE2 872 871 -1.04773 0.021468 -0.0145539 1 0 1 1 0 0 +EDGE2 873 693 0.0399207 -0.0777956 0.0103178 1 0 1 1 0 0 +EDGE2 873 694 1.06575 0.0686032 0.0255898 1 0 1 1 0 0 +EDGE2 873 872 -0.917642 0.0362768 0.0207243 1 0 1 1 0 0 +EDGE2 873 692 -0.968248 0.03481 0.00058303 1 0 1 1 0 0 +EDGE2 874 795 0.998567 -0.067231 -3.15641 1 0 1 1 0 0 +EDGE2 874 815 0.985444 -0.0844719 -3.14591 1 0 1 1 0 0 +EDGE2 874 755 0.976006 0.0247596 -3.14483 1 0 1 1 0 0 +EDGE2 874 775 0.938879 0.0203284 -3.15561 1 0 1 1 0 0 +EDGE2 874 695 0.933613 -0.0711211 -0.000904665 1 0 1 1 0 0 +EDGE2 874 693 -1.06431 -0.0105101 0.00410995 1 0 1 1 0 0 +EDGE2 874 694 0.0317375 -0.0167542 -0.00740625 1 0 1 1 0 0 +EDGE2 874 873 -0.999209 -0.0337563 0.0401005 1 0 1 1 0 0 +EDGE2 875 774 0.994418 0.0205578 -3.14625 1 0 1 1 0 0 +EDGE2 875 814 0.954916 0.0207979 -3.13467 1 0 1 1 0 0 +EDGE2 875 794 0.983173 -0.0924748 -3.14615 1 0 1 1 0 0 +EDGE2 875 754 1.00655 -0.0104981 -3.15722 1 0 1 1 0 0 +EDGE2 875 795 -0.0288457 -0.0552889 -3.14718 1 0 1 1 0 0 +EDGE2 875 815 0.0420927 -0.037816 -3.10936 1 0 1 1 0 0 +EDGE2 875 755 -0.0523265 0.0164389 -3.11863 1 0 1 1 0 0 +EDGE2 875 775 -0.0834078 -0.0180757 -3.17158 1 0 1 1 0 0 +EDGE2 875 695 0.0241434 0.0740341 -0.000100456 1 0 1 1 0 0 +EDGE2 875 874 -1.01268 0.0338158 -0.000311194 1 0 1 1 0 0 +EDGE2 875 694 -1.11247 0.0380293 -0.00827001 1 0 1 1 0 0 +EDGE2 875 796 -0.0446962 -0.969339 -1.5719 1 0 1 1 0 0 +EDGE2 875 816 0.00470411 -0.907753 -1.5698 1 0 1 1 0 0 +EDGE2 875 696 0.0352418 -0.969213 -1.56008 1 0 1 1 0 0 +EDGE2 875 756 0.00280667 -0.957128 -1.53776 1 0 1 1 0 0 +EDGE2 875 776 0.038149 -0.974206 -1.57275 1 0 1 1 0 0 +EDGE2 876 795 -0.93654 -0.00973697 1.56104 1 0 1 1 0 0 +EDGE2 876 875 -0.959493 -0.0471528 -1.53589 1 0 1 1 0 0 +EDGE2 876 815 -1.05054 0.0505937 1.57556 1 0 1 1 0 0 +EDGE2 876 755 -1.06466 -0.0283842 1.5485 1 0 1 1 0 0 +EDGE2 876 775 -0.982965 0.0873326 1.54769 1 0 1 1 0 0 +EDGE2 876 695 -0.907838 0.0816715 -1.58763 1 0 1 1 0 0 +EDGE2 877 876 -1.02716 0.0139386 0.00532697 1 0 1 1 0 0 +EDGE2 878 877 -0.948332 -0.0489823 0.0186053 1 0 1 1 0 0 +EDGE2 879 878 -0.99124 0.0115367 0.00989167 1 0 1 1 0 0 +EDGE2 880 879 -1.06108 -0.0607787 -0.00135534 1 0 1 1 0 0 +EDGE2 881 880 -1.01362 -0.0671638 -1.61385 1 0 1 1 0 0 +EDGE2 882 881 -0.959321 -0.0251326 0.0274314 1 0 1 1 0 0 +EDGE2 883 882 -1.07026 0.0162418 -0.0212049 1 0 1 1 0 0 +EDGE2 884 883 -1.12593 0.0178338 -0.0333323 1 0 1 1 0 0 +EDGE2 884 685 1.015 -0.0536852 -3.15664 1 0 1 1 0 0 +EDGE2 885 884 -0.956129 0.031659 0.0073168 1 0 1 1 0 0 +EDGE2 885 685 0.00507871 -0.053856 -3.1551 1 0 1 1 0 0 +EDGE2 885 684 1.10326 0.0296604 -3.13216 1 0 1 1 0 0 +EDGE2 885 686 -0.100032 0.930506 1.5584 1 0 1 1 0 0 +EDGE2 886 885 -0.966525 0.0662208 -1.57224 1 0 1 1 0 0 +EDGE2 886 685 -0.992575 -0.070562 1.5592 1 0 1 1 0 0 +EDGE2 886 686 -0.0385127 -0.00129991 0.0422185 1 0 1 1 0 0 +EDGE2 886 687 1.00812 0.00427218 -0.00625937 1 0 1 1 0 0 +EDGE2 887 686 -0.928656 0.104003 0.00194908 1 0 1 1 0 0 +EDGE2 887 886 -1.0547 -0.0331058 0.0097778 1 0 1 1 0 0 +EDGE2 887 687 -0.108899 -0.0191306 0.00937911 1 0 1 1 0 0 +EDGE2 887 688 1.00927 -0.00335979 -0.0334347 1 0 1 1 0 0 +EDGE2 888 687 -0.987358 -0.0909836 0.0141794 1 0 1 1 0 0 +EDGE2 888 887 -0.989591 -0.057147 -0.00420915 1 0 1 1 0 0 +EDGE2 888 688 -0.0147532 -0.0635823 -0.0117171 1 0 1 1 0 0 +EDGE2 888 689 0.99457 0.0291348 0.0330578 1 0 1 1 0 0 +EDGE2 889 690 0.956407 -0.085326 -0.0201425 1 0 1 1 0 0 +EDGE2 889 888 -1.0861 -0.0875542 -0.0302447 1 0 1 1 0 0 +EDGE2 889 688 -1.05859 0.0139985 -0.0321801 1 0 1 1 0 0 +EDGE2 889 689 0.0400561 -0.0597096 -0.0036498 1 0 1 1 0 0 +EDGE2 889 850 1.03428 0.00876086 -3.12389 1 0 1 1 0 0 +EDGE2 889 870 0.98169 0.00107488 -3.17592 1 0 1 1 0 0 +EDGE2 889 830 0.964476 -0.04727 -3.08357 1 0 1 1 0 0 +EDGE2 890 691 0.0290975 1.05439 1.57727 1 0 1 1 0 0 +EDGE2 890 871 -0.0603978 0.965158 1.58222 1 0 1 1 0 0 +EDGE2 890 690 0.00974994 0.0125762 -0.00438846 1 0 1 1 0 0 +EDGE2 890 689 -0.917019 0.0834739 -0.0063404 1 0 1 1 0 0 +EDGE2 890 889 -1.01356 0.0834046 -0.00323848 1 0 1 1 0 0 +EDGE2 890 850 -0.0359816 0.0300143 -3.14299 1 0 1 1 0 0 +EDGE2 890 870 -0.0407012 0.0158593 -3.10111 1 0 1 1 0 0 +EDGE2 890 830 -0.0736267 0.0412232 -3.13049 1 0 1 1 0 0 +EDGE2 890 851 -0.0192016 -1.0911 -1.56464 1 0 1 1 0 0 +EDGE2 890 831 -0.0555932 -0.97149 -1.5701 1 0 1 1 0 0 +EDGE2 890 869 0.918664 -0.0219169 -3.16153 1 0 1 1 0 0 +EDGE2 890 829 1.07343 -0.00874186 -3.122 1 0 1 1 0 0 +EDGE2 890 849 0.984496 -0.0210631 -3.16524 1 0 1 1 0 0 +EDGE2 891 690 -1.03082 0.100734 1.57204 1 0 1 1 0 0 +EDGE2 891 850 -0.983367 0.0552491 -1.59677 1 0 1 1 0 0 +EDGE2 891 870 -0.952426 0.0950074 -1.562 1 0 1 1 0 0 +EDGE2 891 890 -1.00922 -0.0107702 1.58592 1 0 1 1 0 0 +EDGE2 891 830 -1.09518 0.0241018 -1.57586 1 0 1 1 0 0 +EDGE2 891 851 0.0177616 0.00557783 -0.000952939 1 0 1 1 0 0 +EDGE2 891 831 0.100908 -0.0122865 -0.0267784 1 0 1 1 0 0 +EDGE2 891 832 0.990343 -0.091267 0.0187165 1 0 1 1 0 0 +EDGE2 891 852 1.02977 0.0172976 0.0338453 1 0 1 1 0 0 +EDGE2 892 851 -0.993556 -0.0575712 -0.0121992 1 0 1 1 0 0 +EDGE2 892 891 -1.05405 0.00668297 -0.0190062 1 0 1 1 0 0 +EDGE2 892 831 -0.887075 -0.0529647 -0.00903956 1 0 1 1 0 0 +EDGE2 892 832 0.00919078 0.0242506 -0.00182692 1 0 1 1 0 0 +EDGE2 892 852 -0.00412503 -0.0675655 0.0183463 1 0 1 1 0 0 +EDGE2 892 833 1.05071 0.0184103 -0.00210815 1 0 1 1 0 0 +EDGE2 892 853 1.08734 -0.00866286 -0.0164343 1 0 1 1 0 0 +EDGE2 893 892 -1.05816 -0.0639719 0.0197601 1 0 1 1 0 0 +EDGE2 893 832 -1.04222 -0.0246653 -0.0117419 1 0 1 1 0 0 +EDGE2 893 852 -1.00583 -0.038781 0.0195356 1 0 1 1 0 0 +EDGE2 893 833 0.0380022 -0.0421054 0.00404506 1 0 1 1 0 0 +EDGE2 893 853 -0.0307495 -0.043111 0.016943 1 0 1 1 0 0 +EDGE2 893 834 0.8939 0.0306243 -0.0186642 1 0 1 1 0 0 +EDGE2 893 854 0.961663 -0.0571882 -0.00736278 1 0 1 1 0 0 +EDGE2 894 833 -1.00326 0.0668795 0.028913 1 0 1 1 0 0 +EDGE2 894 853 -1.02568 -0.00661951 -0.0212235 1 0 1 1 0 0 +EDGE2 894 893 -0.978537 -0.0107605 0.00233368 1 0 1 1 0 0 +EDGE2 894 834 0.0269017 -0.0327761 -0.011621 1 0 1 1 0 0 +EDGE2 894 854 -0.0447086 0.0340028 -0.0129379 1 0 1 1 0 0 +EDGE2 894 855 1.07065 0.0153488 0.0501778 1 0 1 1 0 0 +EDGE2 894 835 0.981148 0.0341945 0.0012649 1 0 1 1 0 0 +EDGE2 895 894 -1.01309 -0.00483226 -0.0078708 1 0 1 1 0 0 +EDGE2 895 834 -0.97175 -0.0221542 -0.002417 1 0 1 1 0 0 +EDGE2 895 854 -1.03091 -0.0228055 -0.0194096 1 0 1 1 0 0 +EDGE2 895 855 0.0851141 0.126152 -0.0121077 1 0 1 1 0 0 +EDGE2 895 835 -0.000536968 -0.0613781 0.0226209 1 0 1 1 0 0 +EDGE2 895 856 0.0270898 1.00947 1.52985 1 0 1 1 0 0 +EDGE2 895 836 0.0396865 1.01144 1.56452 1 0 1 1 0 0 +EDGE2 896 855 -1.10967 0.0549772 -1.59724 1 0 1 1 0 0 +EDGE2 896 895 -0.917662 0.0774445 -1.54868 1 0 1 1 0 0 +EDGE2 896 835 -1.00943 -0.0704072 -1.5311 1 0 1 1 0 0 +EDGE2 896 856 -0.0256298 0.106181 -0.0289041 1 0 1 1 0 0 +EDGE2 896 836 0.0630494 0.00954366 0.0184046 1 0 1 1 0 0 +EDGE2 896 857 0.997752 -0.0657967 -0.0184563 1 0 1 1 0 0 +EDGE2 896 837 1.00795 0.109025 0.00789337 1 0 1 1 0 0 +EDGE2 897 856 -1.14399 0.0568389 0.0198937 1 0 1 1 0 0 +EDGE2 897 896 -1.00995 -0.0923935 0.0188998 1 0 1 1 0 0 +EDGE2 897 836 -1.05392 0.0242294 0.0341908 1 0 1 1 0 0 +EDGE2 897 857 0.0639257 -0.123154 0.00359687 1 0 1 1 0 0 +EDGE2 897 837 0.0152073 0.0418086 0.0297244 1 0 1 1 0 0 +EDGE2 897 858 0.990511 -0.0721041 0.00962168 1 0 1 1 0 0 +EDGE2 897 838 0.931703 0.000594986 0.0233115 1 0 1 1 0 0 +EDGE2 898 857 -0.906155 -0.0223185 -0.0158804 1 0 1 1 0 0 +EDGE2 898 897 -1.04935 -0.0299751 -0.00291762 1 0 1 1 0 0 +EDGE2 898 837 -0.862993 0.00196863 -0.0344989 1 0 1 1 0 0 +EDGE2 898 858 -0.0731157 -0.0115522 0.00347256 1 0 1 1 0 0 +EDGE2 898 838 -0.00948227 -0.000183224 -0.0266787 1 0 1 1 0 0 +EDGE2 898 839 1.00529 0.0543846 0.0297195 1 0 1 1 0 0 +EDGE2 898 859 1.06027 0.0835859 0.009057 1 0 1 1 0 0 +EDGE2 899 858 -1.0102 0.0361343 0.0111263 1 0 1 1 0 0 +EDGE2 899 898 -1.02862 -0.0208845 0.00163311 1 0 1 1 0 0 +EDGE2 899 838 -1.04688 -0.0467605 -0.00741631 1 0 1 1 0 0 +EDGE2 899 839 0.171652 0.00151654 -0.0148602 1 0 1 1 0 0 +EDGE2 899 859 -0.0622642 0.0296366 -0.00399908 1 0 1 1 0 0 +EDGE2 899 840 0.993498 -0.0328455 0.0239867 1 0 1 1 0 0 +EDGE2 899 860 1.04048 -0.0320258 -0.00466713 1 0 1 1 0 0 +EDGE2 900 839 -1.09168 -0.00798499 -0.00261169 1 0 1 1 0 0 +EDGE2 900 899 -1.01665 0.0121159 -0.00894035 1 0 1 1 0 0 +EDGE2 900 859 -1.03707 0.0533154 0.0114659 1 0 1 1 0 0 +EDGE2 900 841 -0.0143609 0.963163 1.56134 1 0 1 1 0 0 +EDGE2 900 861 -0.0682991 1.00072 1.59023 1 0 1 1 0 0 +EDGE2 900 840 0.00817475 0.00359902 -0.0341111 1 0 1 1 0 0 +EDGE2 900 860 -0.0236251 -0.0384745 -0.0124209 1 0 1 1 0 0 +EDGE2 901 842 0.943512 -0.0804361 0.00473316 1 0 1 1 0 0 +EDGE2 901 862 0.876028 -0.0361846 -0.0276825 1 0 1 1 0 0 +EDGE2 901 841 -0.0100744 0.0433135 -0.0130661 1 0 1 1 0 0 +EDGE2 901 861 -0.0449161 0.135831 -0.00360959 1 0 1 1 0 0 +EDGE2 901 900 -0.957768 -0.0664954 -1.58458 1 0 1 1 0 0 +EDGE2 901 840 -1.01321 0.0380619 -1.56782 1 0 1 1 0 0 +EDGE2 901 860 -0.963209 0.0428227 -1.5548 1 0 1 1 0 0 +EDGE2 902 863 0.951217 0.0471363 0.0108117 1 0 1 1 0 0 +EDGE2 902 843 0.998884 0.0454096 0.000321951 1 0 1 1 0 0 +EDGE2 902 842 0.0145446 -0.0437175 0.0173691 1 0 1 1 0 0 +EDGE2 902 862 0.0134683 -0.106174 0.0229981 1 0 1 1 0 0 +EDGE2 902 841 -0.987752 0.0165474 -0.019934 1 0 1 1 0 0 +EDGE2 902 901 -1.04972 0.010881 -0.0432603 1 0 1 1 0 0 +EDGE2 902 861 -1.04043 -0.00977666 -0.0123371 1 0 1 1 0 0 +EDGE2 903 864 1.01266 -0.0848883 0.00556878 1 0 1 1 0 0 +EDGE2 903 844 0.94822 0.0510042 -0.00678164 1 0 1 1 0 0 +EDGE2 903 863 -0.0336771 -0.0105223 0.0196227 1 0 1 1 0 0 +EDGE2 903 843 -0.0622652 -0.025932 -0.0200463 1 0 1 1 0 0 +EDGE2 903 902 -1.04627 -0.0105956 -0.00658728 1 0 1 1 0 0 +EDGE2 903 842 -1.0047 0.0722693 -0.00548405 1 0 1 1 0 0 +EDGE2 903 862 -1.05471 0.0431132 0.00419548 1 0 1 1 0 0 +EDGE2 904 865 1.01322 -0.0983309 0.00290026 1 0 1 1 0 0 +EDGE2 904 864 0.0438849 0.00171579 0.0365952 1 0 1 1 0 0 +EDGE2 904 705 0.940478 -0.08013 -3.14129 1 0 1 1 0 0 +EDGE2 904 825 1.02553 0.0466159 -3.13021 1 0 1 1 0 0 +EDGE2 904 845 0.897663 -0.0158356 -0.00407256 1 0 1 1 0 0 +EDGE2 904 844 0.0362087 -0.0299863 -0.0193743 1 0 1 1 0 0 +EDGE2 904 863 -0.972795 0.0289689 0.0270503 1 0 1 1 0 0 +EDGE2 904 903 -0.946301 0.0386082 -0.0188662 1 0 1 1 0 0 +EDGE2 904 843 -0.98029 0.0199033 -0.000979501 1 0 1 1 0 0 +EDGE2 905 824 0.992263 0.047337 -3.14504 1 0 1 1 0 0 +EDGE2 905 704 0.986539 0.0776203 -3.14283 1 0 1 1 0 0 +EDGE2 905 865 -0.0176075 -0.0319301 0.0148228 1 0 1 1 0 0 +EDGE2 905 826 0.0258485 1.00253 1.56888 1 0 1 1 0 0 +EDGE2 905 866 -0.0312333 0.95775 1.55623 1 0 1 1 0 0 +EDGE2 905 846 0.0466651 0.995999 1.57452 1 0 1 1 0 0 +EDGE2 905 864 -0.978134 0.0196048 0.00285575 1 0 1 1 0 0 +EDGE2 905 705 -0.0417524 -0.0458884 -3.12844 1 0 1 1 0 0 +EDGE2 905 825 -0.0171428 0.0111138 -3.13906 1 0 1 1 0 0 +EDGE2 905 845 -0.0525425 0.028095 0.00128178 1 0 1 1 0 0 +EDGE2 905 904 -0.983409 0.0651049 -0.00919656 1 0 1 1 0 0 +EDGE2 905 844 -1.01859 0.0129523 0.0338911 1 0 1 1 0 0 +EDGE2 905 706 -0.034708 -1.02259 -1.55328 1 0 1 1 0 0 +EDGE2 906 865 -1.00365 -0.00671527 -1.5833 1 0 1 1 0 0 +EDGE2 906 847 1.05738 -0.0257266 -0.0245761 1 0 1 1 0 0 +EDGE2 906 867 1.00089 0.0855922 -0.00386637 1 0 1 1 0 0 +EDGE2 906 827 1.00048 0.0100423 0.0180939 1 0 1 1 0 0 +EDGE2 906 826 0.0184391 -0.000457008 0.0182964 1 0 1 1 0 0 +EDGE2 906 866 0.00677949 -0.00575764 0.0111488 1 0 1 1 0 0 +EDGE2 906 846 0.0229726 -0.0682188 0.0176103 1 0 1 1 0 0 +EDGE2 906 905 -1.07779 -0.0114615 -1.52339 1 0 1 1 0 0 +EDGE2 906 705 -0.96249 0.0709903 1.60217 1 0 1 1 0 0 +EDGE2 906 825 -1.06988 -0.115759 1.57127 1 0 1 1 0 0 +EDGE2 906 845 -0.967826 0.0746671 -1.57019 1 0 1 1 0 0 +EDGE2 907 828 1.06155 0.0861464 -0.0176254 1 0 1 1 0 0 +EDGE2 907 848 0.946601 0.0399376 0.00358673 1 0 1 1 0 0 +EDGE2 907 868 0.998458 -0.0926816 -0.0630019 1 0 1 1 0 0 +EDGE2 907 847 0.00880527 0.0267376 -0.0128776 1 0 1 1 0 0 +EDGE2 907 867 -0.0524926 -0.0930973 0.00605724 1 0 1 1 0 0 +EDGE2 907 827 -0.0488557 -0.052694 0.0114541 1 0 1 1 0 0 +EDGE2 907 826 -1.01987 -0.00327621 0.0356739 1 0 1 1 0 0 +EDGE2 907 866 -0.960431 0.0197732 0.013329 1 0 1 1 0 0 +EDGE2 907 906 -0.96403 0.0180786 -0.0102046 1 0 1 1 0 0 +EDGE2 907 846 -1.07635 0.0913645 -0.0112666 1 0 1 1 0 0 +EDGE2 908 869 1.05652 0.00922741 -0.0236702 1 0 1 1 0 0 +EDGE2 908 829 1.05073 0.0520907 -0.00502499 1 0 1 1 0 0 +EDGE2 908 849 1.01515 -0.0926229 0.0115194 1 0 1 1 0 0 +EDGE2 908 828 0.0714971 0.0633133 -0.00469015 1 0 1 1 0 0 +EDGE2 908 848 0.0503876 0.0295351 -0.0229744 1 0 1 1 0 0 +EDGE2 908 868 -0.0905768 -0.044094 -0.00292197 1 0 1 1 0 0 +EDGE2 908 847 -0.980615 0.0253758 -0.0210109 1 0 1 1 0 0 +EDGE2 908 867 -1.02588 -0.0822777 0.000559789 1 0 1 1 0 0 +EDGE2 908 907 -1.07347 0.0283254 0.0100021 1 0 1 1 0 0 +EDGE2 908 827 -0.959358 0.00341306 -0.00904992 1 0 1 1 0 0 +EDGE2 909 908 -0.982179 0.0141092 0.0109816 1 0 1 1 0 0 +EDGE2 909 690 1.03576 -0.0218463 -3.11939 1 0 1 1 0 0 +EDGE2 909 850 1.00285 0.169291 -0.0201441 1 0 1 1 0 0 +EDGE2 909 870 0.99652 -0.00463257 0.00693162 1 0 1 1 0 0 +EDGE2 909 890 1.0266 -0.0244167 -3.19381 1 0 1 1 0 0 +EDGE2 909 830 1.03036 0.0281795 0.00318596 1 0 1 1 0 0 +EDGE2 909 869 0.0446423 0.00992175 0.0157609 1 0 1 1 0 0 +EDGE2 909 829 -0.0354661 0.0203821 -0.0153243 1 0 1 1 0 0 +EDGE2 909 849 -0.0185017 -0.0762808 -0.0321464 1 0 1 1 0 0 +EDGE2 909 828 -1.00102 -0.0738436 -0.0177072 1 0 1 1 0 0 +EDGE2 909 848 -1.01091 -0.00883845 0.000601518 1 0 1 1 0 0 +EDGE2 909 868 -1.0248 -0.0100176 -0.0128622 1 0 1 1 0 0 +EDGE2 910 691 -0.0844799 -0.973636 -1.57062 1 0 1 1 0 0 +EDGE2 910 871 -0.00343708 -0.859125 -1.58605 1 0 1 1 0 0 +EDGE2 910 690 0.0926545 -0.0235565 -3.15771 1 0 1 1 0 0 +EDGE2 910 689 0.939334 -0.096067 -3.12162 1 0 1 1 0 0 +EDGE2 910 889 1.00502 0.0781228 -3.12873 1 0 1 1 0 0 +EDGE2 910 850 0.00842661 -0.112204 0.00442082 1 0 1 1 0 0 +EDGE2 910 870 -0.060005 0.0540003 -0.0167584 1 0 1 1 0 0 +EDGE2 910 890 -0.0120497 0.0169972 -3.13217 1 0 1 1 0 0 +EDGE2 910 830 -0.0584674 0.0106562 0.0138426 1 0 1 1 0 0 +EDGE2 910 851 0.0437491 1.01952 1.59507 1 0 1 1 0 0 +EDGE2 910 891 -0.0394817 0.970219 1.59427 1 0 1 1 0 0 +EDGE2 910 831 -0.0900954 0.944261 1.5468 1 0 1 1 0 0 +EDGE2 910 869 -0.932952 -0.0309857 0.00813536 1 0 1 1 0 0 +EDGE2 910 909 -1.06153 0.0334359 0.00715396 1 0 1 1 0 0 +EDGE2 910 829 -1.02009 0.00795546 0.0111611 1 0 1 1 0 0 +EDGE2 910 849 -0.975188 0.074356 0.00869346 1 0 1 1 0 0 +EDGE2 911 690 -0.987384 -0.0269868 1.60089 1 0 1 1 0 0 +EDGE2 911 910 -1.05761 0.00897193 -1.55571 1 0 1 1 0 0 +EDGE2 911 850 -1.01637 0.00492615 -1.57168 1 0 1 1 0 0 +EDGE2 911 870 -1.00169 -0.0589325 -1.54059 1 0 1 1 0 0 +EDGE2 911 890 -1.02854 -0.0186757 1.58593 1 0 1 1 0 0 +EDGE2 911 830 -0.960917 0.048429 -1.58848 1 0 1 1 0 0 +EDGE2 911 892 0.977947 -0.0160095 0.00544519 1 0 1 1 0 0 +EDGE2 911 851 -0.0402474 0.0667169 0.0159774 1 0 1 1 0 0 +EDGE2 911 891 -0.00348838 -0.06209 -0.0100549 1 0 1 1 0 0 +EDGE2 911 831 -0.0100638 -0.0561004 -0.0158466 1 0 1 1 0 0 +EDGE2 911 832 1.02548 -0.0382921 0.00378124 1 0 1 1 0 0 +EDGE2 911 852 0.991889 0.0363745 -0.00815736 1 0 1 1 0 0 +EDGE2 912 892 -0.00258509 0.0333988 0.00838269 1 0 1 1 0 0 +EDGE2 912 851 -0.963511 0.0423943 0.00066693 1 0 1 1 0 0 +EDGE2 912 911 -1.00382 0.0722158 -0.0129311 1 0 1 1 0 0 +EDGE2 912 891 -1.06133 0.138986 -0.0115952 1 0 1 1 0 0 +EDGE2 912 831 -0.954413 0.0264051 -0.0178952 1 0 1 1 0 0 +EDGE2 912 832 0.0451103 -0.0698406 0.0128655 1 0 1 1 0 0 +EDGE2 912 852 -0.0165521 0.0428279 0.00557638 1 0 1 1 0 0 +EDGE2 912 833 0.983753 0.0116593 -0.0403109 1 0 1 1 0 0 +EDGE2 912 853 0.979666 -0.069051 0.0114609 1 0 1 1 0 0 +EDGE2 912 893 1.03366 0.0334244 -0.0082806 1 0 1 1 0 0 +EDGE2 913 892 -0.939647 0.139202 -0.0100166 1 0 1 1 0 0 +EDGE2 913 912 -0.961021 0.0826365 0.00251685 1 0 1 1 0 0 +EDGE2 913 832 -0.954665 -0.0959584 -0.0278318 1 0 1 1 0 0 +EDGE2 913 852 -1.05614 -0.0888685 0.0107048 1 0 1 1 0 0 +EDGE2 913 833 -0.00719488 0.0384691 -0.0165447 1 0 1 1 0 0 +EDGE2 913 853 -0.052398 -0.0621433 0.0140464 1 0 1 1 0 0 +EDGE2 913 893 -0.00561206 -0.00534206 0.0646817 1 0 1 1 0 0 +EDGE2 913 894 0.977976 -0.0366812 0.0232567 1 0 1 1 0 0 +EDGE2 913 834 0.941145 0.00680004 -0.0188724 1 0 1 1 0 0 +EDGE2 913 854 0.99472 -0.00786641 -0.000877347 1 0 1 1 0 0 +EDGE2 914 913 -1.02529 0.11396 0.0196124 1 0 1 1 0 0 +EDGE2 914 833 -0.956977 0.0563183 0.00565992 1 0 1 1 0 0 +EDGE2 914 853 -0.968813 0.0573539 0.0381273 1 0 1 1 0 0 +EDGE2 914 893 -0.941347 0.036218 -0.0143136 1 0 1 1 0 0 +EDGE2 914 894 -0.00797192 0.056419 0.000489045 1 0 1 1 0 0 +EDGE2 914 834 0.0164954 -0.0714753 0.0359449 1 0 1 1 0 0 +EDGE2 914 854 0.0553129 -0.0453064 0.00799841 1 0 1 1 0 0 +EDGE2 914 855 0.992733 -0.0189951 -0.0311882 1 0 1 1 0 0 +EDGE2 914 895 1.10902 0.00212252 -0.000628178 1 0 1 1 0 0 +EDGE2 914 835 1.02755 0.0081674 -0.000530975 1 0 1 1 0 0 +EDGE2 915 894 -0.961548 -0.0364167 -0.0146245 1 0 1 1 0 0 +EDGE2 915 914 -1.01703 0.0433098 -0.036829 1 0 1 1 0 0 +EDGE2 915 834 -0.891259 -0.0236212 -0.0152533 1 0 1 1 0 0 +EDGE2 915 854 -0.993243 0.0325995 -0.0108864 1 0 1 1 0 0 +EDGE2 915 855 0.0403732 -0.00743977 0.0188377 1 0 1 1 0 0 +EDGE2 915 895 -0.0346951 0.0320465 -0.0152241 1 0 1 1 0 0 +EDGE2 915 835 4.23963e-06 -0.0764835 0.00368946 1 0 1 1 0 0 +EDGE2 915 856 0.0239179 1.00148 1.57414 1 0 1 1 0 0 +EDGE2 915 896 0.0264491 0.888466 1.5772 1 0 1 1 0 0 +EDGE2 915 836 0.0269818 0.913693 1.56358 1 0 1 1 0 0 +EDGE2 916 855 -1.00524 0.019876 1.58309 1 0 1 1 0 0 +EDGE2 916 895 -0.993739 0.0161521 1.58746 1 0 1 1 0 0 +EDGE2 916 915 -1.04571 0.0434773 1.54541 1 0 1 1 0 0 +EDGE2 916 835 -1.04827 0.0424732 1.58869 1 0 1 1 0 0 +EDGE2 917 916 -0.97968 0.0514389 0.0258899 1 0 1 1 0 0 +EDGE2 918 917 -0.932333 -0.0964718 0.0161639 1 0 1 1 0 0 +EDGE2 919 680 0.968118 -0.00406942 -3.13773 1 0 1 1 0 0 +EDGE2 919 918 -1.01737 0.0158307 0.00853316 1 0 1 1 0 0 +EDGE2 920 679 1.02703 0.100202 -3.12807 1 0 1 1 0 0 +EDGE2 920 681 0.0520503 -1.08008 -1.56843 1 0 1 1 0 0 +EDGE2 920 680 0.01105 -0.0334833 -3.18846 1 0 1 1 0 0 +EDGE2 920 919 -1.0823 -0.0509026 -0.0056902 1 0 1 1 0 0 +EDGE2 921 920 -0.905716 0.0376476 -1.53966 1 0 1 1 0 0 +EDGE2 921 680 -1.00018 -0.00760417 1.55855 1 0 1 1 0 0 +EDGE2 922 921 -0.973587 -0.0226256 -0.0206155 1 0 1 1 0 0 +EDGE2 923 922 -0.959623 -0.0222361 0.0159034 1 0 1 1 0 0 +EDGE2 924 923 -0.945913 -0.00436779 0.0247846 1 0 1 1 0 0 +EDGE2 925 924 -0.955602 0.0192923 0.0100684 1 0 1 1 0 0 +EDGE2 926 925 -1.1116 0.0278474 1.59952 1 0 1 1 0 0 +EDGE2 927 926 -0.947537 -0.0127535 0.0225582 1 0 1 1 0 0 +EDGE2 928 927 -0.936744 0.0421605 0.0321072 1 0 1 1 0 0 +EDGE2 929 670 0.944634 0.10631 -3.15763 1 0 1 1 0 0 +EDGE2 929 928 -0.999431 0.0174395 0.0128387 1 0 1 1 0 0 +EDGE2 930 669 0.941204 0.0745641 -3.17359 1 0 1 1 0 0 +EDGE2 930 671 0.0564955 -0.993383 -1.54192 1 0 1 1 0 0 +EDGE2 930 670 0.018377 0.000868804 -3.14119 1 0 1 1 0 0 +EDGE2 930 929 -1.04104 -0.0727195 -0.0087291 1 0 1 1 0 0 +EDGE2 931 930 -0.957474 -0.0518303 -1.52972 1 0 1 1 0 0 +EDGE2 931 670 -0.930989 -0.0358368 1.57122 1 0 1 1 0 0 +EDGE2 932 931 -1.07094 -0.096542 0.0180498 1 0 1 1 0 0 +EDGE2 933 932 -1.00023 0.0458422 0.0322128 1 0 1 1 0 0 +EDGE2 934 933 -1.01465 -0.0271594 -0.0221211 1 0 1 1 0 0 +EDGE2 935 934 -0.99067 -0.0363635 0.0227909 1 0 1 1 0 0 +EDGE2 936 935 -0.931038 -0.0578901 -1.56012 1 0 1 1 0 0 +EDGE2 937 936 -1.03561 -0.0550052 0.00237643 1 0 1 1 0 0 +EDGE2 938 937 -1.09719 -0.0251288 0.0145619 1 0 1 1 0 0 +EDGE2 939 938 -0.999348 0.0011848 -0.0021124 1 0 1 1 0 0 +EDGE2 940 939 -0.964326 -0.11414 -0.0378396 1 0 1 1 0 0 +EDGE2 941 940 -1.02444 0.046198 1.58532 1 0 1 1 0 0 +EDGE2 942 941 -0.948728 -0.0393091 -0.0013065 1 0 1 1 0 0 +EDGE2 943 942 -1.07315 0.0594671 -0.00509695 1 0 1 1 0 0 +EDGE2 944 943 -0.97263 0.0485469 0.00767309 1 0 1 1 0 0 +EDGE2 945 944 -1.04753 0.0353044 -0.0299609 1 0 1 1 0 0 +EDGE2 946 945 -1.10091 -0.0381692 1.53439 1 0 1 1 0 0 +EDGE2 947 946 -0.934713 0.0587927 0.0280197 1 0 1 1 0 0 +EDGE2 948 947 -0.919381 0.0254598 -0.00901029 1 0 1 1 0 0 +EDGE2 949 948 -1.04227 0.0392386 0.0338427 1 0 1 1 0 0 +EDGE2 950 949 -0.96768 -0.022937 -0.000672899 1 0 1 1 0 0 +EDGE2 951 950 -1.03701 0.0903099 1.56411 1 0 1 1 0 0 +EDGE2 952 951 -1.11222 0.0983579 0.00640553 1 0 1 1 0 0 +EDGE2 953 952 -1.04335 -0.0664931 0.0112784 1 0 1 1 0 0 +EDGE2 954 953 -1.08869 -0.0462722 0.00295753 1 0 1 1 0 0 +EDGE2 954 935 1.0239 -0.0503345 -3.13246 1 0 1 1 0 0 +EDGE2 955 936 -0.050187 -1.01743 -1.55969 1 0 1 1 0 0 +EDGE2 955 934 0.968946 -0.0536194 -3.15437 1 0 1 1 0 0 +EDGE2 955 954 -1.05907 -0.0270214 -0.0257329 1 0 1 1 0 0 +EDGE2 955 935 0.0407667 -0.0195033 -3.14092 1 0 1 1 0 0 +EDGE2 956 955 -0.907421 -0.104439 -1.57324 1 0 1 1 0 0 +EDGE2 956 935 -0.947242 -0.0512266 1.58504 1 0 1 1 0 0 +EDGE2 957 956 -0.969087 0.0210552 -0.000914483 1 0 1 1 0 0 +EDGE2 958 957 -1.03617 0.0682115 -0.0165694 1 0 1 1 0 0 +EDGE2 959 958 -0.944913 0.0195752 0.0107571 1 0 1 1 0 0 +EDGE2 960 959 -1.00173 0.065316 0.0159579 1 0 1 1 0 0 +EDGE2 961 960 -1.06426 0.0758305 -1.54208 1 0 1 1 0 0 +EDGE2 962 961 -0.91583 0.0500287 -0.0350901 1 0 1 1 0 0 +EDGE2 963 962 -1.03856 -0.00408722 -0.00584628 1 0 1 1 0 0 +EDGE2 964 963 -1.08673 0.00439003 0.00422153 1 0 1 1 0 0 +EDGE2 965 964 -1.08361 -0.021102 -0.00328771 1 0 1 1 0 0 +EDGE2 966 965 -0.938589 -0.0395725 -1.60471 1 0 1 1 0 0 +EDGE2 967 966 -1.01188 -0.0488286 0.00215492 1 0 1 1 0 0 +EDGE2 968 967 -1.01251 -0.0753209 -0.0208824 1 0 1 1 0 0 +EDGE2 969 968 -1.02523 -0.0139428 0.0266718 1 0 1 1 0 0 +EDGE2 969 950 0.967665 0.012244 -3.16639 1 0 1 1 0 0 +EDGE2 970 969 -0.982381 0.0256053 -0.00260956 1 0 1 1 0 0 +EDGE2 970 950 0.0305291 -0.0319476 -3.18002 1 0 1 1 0 0 +EDGE2 970 951 0.026685 1.0307 1.56366 1 0 1 1 0 0 +EDGE2 970 949 0.998108 -0.0564999 -3.17054 1 0 1 1 0 0 +EDGE2 971 952 1.00822 -0.0239069 -0.0866108 1 0 1 1 0 0 +EDGE2 971 950 -0.935928 0.0484774 1.5753 1 0 1 1 0 0 +EDGE2 971 951 -0.00263458 0.0429201 0.023518 1 0 1 1 0 0 +EDGE2 971 970 -0.851968 -0.039497 -1.57073 1 0 1 1 0 0 +EDGE2 972 953 1.03613 -0.0112196 -0.00735768 1 0 1 1 0 0 +EDGE2 972 952 0.018121 0.0744458 0.0491468 1 0 1 1 0 0 +EDGE2 972 951 -0.979864 -0.0124253 0.00152907 1 0 1 1 0 0 +EDGE2 972 971 -1.01026 0.0130869 -0.0219865 1 0 1 1 0 0 +EDGE2 973 953 0.0087829 -0.047995 -0.0172233 1 0 1 1 0 0 +EDGE2 973 954 0.946956 0.0204926 8.57879e-05 1 0 1 1 0 0 +EDGE2 973 952 -0.968943 0.0661456 0.0106625 1 0 1 1 0 0 +EDGE2 973 972 -0.989193 -0.0372875 0.00929928 1 0 1 1 0 0 +EDGE2 974 955 0.952564 0.132046 -0.0102648 1 0 1 1 0 0 +EDGE2 974 953 -0.944035 0.0022862 0.00422868 1 0 1 1 0 0 +EDGE2 974 954 0.117818 -0.0372904 0.0169735 1 0 1 1 0 0 +EDGE2 974 935 1.03544 -0.0920407 -3.1608 1 0 1 1 0 0 +EDGE2 974 973 -1.00245 0.0476167 0.011707 1 0 1 1 0 0 +EDGE2 975 956 -0.0268342 0.966534 1.55088 1 0 1 1 0 0 +EDGE2 975 936 -0.0376432 -1.08256 -1.5741 1 0 1 1 0 0 +EDGE2 975 955 -0.0483092 0.000982282 -0.013849 1 0 1 1 0 0 +EDGE2 975 934 0.975119 -0.0357594 -3.14398 1 0 1 1 0 0 +EDGE2 975 954 -0.909023 -0.0159799 -0.00379655 1 0 1 1 0 0 +EDGE2 975 974 -1.02286 -0.0875301 -0.00914051 1 0 1 1 0 0 +EDGE2 975 935 0.0335795 -0.0230505 -3.14579 1 0 1 1 0 0 +EDGE2 976 936 0.032521 0.0253995 0.00765828 1 0 1 1 0 0 +EDGE2 976 955 -0.990765 0.0518272 1.58179 1 0 1 1 0 0 +EDGE2 976 975 -1.05891 -0.0542199 1.5402 1 0 1 1 0 0 +EDGE2 976 935 -1.08526 0.0552679 -1.56104 1 0 1 1 0 0 +EDGE2 976 937 1.03259 -0.0160948 -0.00806004 1 0 1 1 0 0 +EDGE2 977 936 -0.933965 0.00651289 0.0170676 1 0 1 1 0 0 +EDGE2 977 976 -1.07707 -0.0389604 -0.0204131 1 0 1 1 0 0 +EDGE2 977 938 0.990141 -0.0468987 -0.00383651 1 0 1 1 0 0 +EDGE2 977 937 -0.0548959 0.085561 0.000873219 1 0 1 1 0 0 +EDGE2 978 938 0.110564 0.0769748 0.0196664 1 0 1 1 0 0 +EDGE2 978 937 -1.00011 0.0107879 0.0264799 1 0 1 1 0 0 +EDGE2 978 977 -1.01612 -0.00383331 0.013402 1 0 1 1 0 0 +EDGE2 978 939 0.982209 0.028837 0.0142889 1 0 1 1 0 0 +EDGE2 979 938 -1.01973 -0.0117055 -0.00816315 1 0 1 1 0 0 +EDGE2 979 978 -0.956492 -0.117969 -0.028637 1 0 1 1 0 0 +EDGE2 979 939 -0.0186568 0.0033323 -0.0142241 1 0 1 1 0 0 +EDGE2 979 940 0.920205 -0.0388615 -0.0220165 1 0 1 1 0 0 +EDGE2 980 979 -0.981043 0.000899238 -0.00140754 1 0 1 1 0 0 +EDGE2 980 939 -0.969802 0.0032247 -0.00828181 1 0 1 1 0 0 +EDGE2 980 940 0.0175008 0.0959944 -0.0185673 1 0 1 1 0 0 +EDGE2 980 941 -0.0314804 -0.988605 -1.54567 1 0 1 1 0 0 +EDGE2 981 942 0.934908 0.0417524 -0.000655518 1 0 1 1 0 0 +EDGE2 981 980 -1.11387 0.0109565 1.59079 1 0 1 1 0 0 +EDGE2 981 940 -1.03359 -0.0264439 1.57078 1 0 1 1 0 0 +EDGE2 981 941 -0.0291666 -0.000384554 -0.0172331 1 0 1 1 0 0 +EDGE2 982 942 0.0162139 0.034592 -0.00619801 1 0 1 1 0 0 +EDGE2 982 941 -0.971779 0.0300779 0.0427992 1 0 1 1 0 0 +EDGE2 982 981 -1.03288 -0.0110317 0.00791639 1 0 1 1 0 0 +EDGE2 982 943 1.0397 -0.0145627 -0.0229614 1 0 1 1 0 0 +EDGE2 983 942 -1.02307 -0.0383581 0.0171098 1 0 1 1 0 0 +EDGE2 983 982 -1.05138 -0.0213517 -0.0193237 1 0 1 1 0 0 +EDGE2 983 943 0.151262 0.014014 0.0200592 1 0 1 1 0 0 +EDGE2 983 944 0.991156 0.0454297 0.0204632 1 0 1 1 0 0 +EDGE2 984 983 -1.07083 -0.0383071 -0.00896294 1 0 1 1 0 0 +EDGE2 984 943 -1.02238 -0.0280286 -0.0279471 1 0 1 1 0 0 +EDGE2 984 944 0.0381643 0.0835564 0.0189547 1 0 1 1 0 0 +EDGE2 984 945 0.926129 -0.0267968 0.0481569 1 0 1 1 0 0 +EDGE2 985 946 -0.0931568 -0.884885 -1.61889 1 0 1 1 0 0 +EDGE2 985 944 -0.975691 0.0179223 -0.026511 1 0 1 1 0 0 +EDGE2 985 984 -1.00177 0.0671173 0.00694588 1 0 1 1 0 0 +EDGE2 985 945 0.00872974 -0.0364739 -0.0119838 1 0 1 1 0 0 +EDGE2 986 945 -1.0223 0.0865732 -1.61067 1 0 1 1 0 0 +EDGE2 986 985 -1.09162 0.0188673 -1.55448 1 0 1 1 0 0 +EDGE2 987 986 -0.972263 -0.0293235 -0.0189127 1 0 1 1 0 0 +EDGE2 988 987 -1.02367 0.0994816 0.00133232 1 0 1 1 0 0 +EDGE2 989 988 -1.05113 0.0144571 0.0193891 1 0 1 1 0 0 +EDGE2 990 989 -1.05268 0.00950794 0.0323801 1 0 1 1 0 0 +EDGE2 991 990 -0.964307 -0.0845936 -1.5634 1 0 1 1 0 0 +EDGE2 992 991 -1.0419 0.00821899 -0.000360675 1 0 1 1 0 0 +EDGE2 993 992 -0.971907 0.0285206 -0.036179 1 0 1 1 0 0 +EDGE2 994 993 -1.05718 -0.00378994 -0.024076 1 0 1 1 0 0 +EDGE2 995 994 -0.969877 0.0820477 0.00486393 1 0 1 1 0 0 +EDGE2 996 995 -1.02268 -0.0101529 -1.55619 1 0 1 1 0 0 +EDGE2 997 996 -1.00723 -0.0557638 0.0399748 1 0 1 1 0 0 +EDGE2 998 997 -1.04229 0.0720804 -0.0388277 1 0 1 1 0 0 +EDGE2 999 980 0.993441 -0.0441473 -3.18735 1 0 1 1 0 0 +EDGE2 999 940 1.05311 0.0337276 -3.15086 1 0 1 1 0 0 +EDGE2 999 998 -0.99269 -0.0596223 -0.00419028 1 0 1 1 0 0 +EDGE2 1000 979 1.00546 -0.0307203 -3.15748 1 0 1 1 0 0 +EDGE2 1000 939 0.953905 0.0244746 -3.14726 1 0 1 1 0 0 +EDGE2 1000 980 -0.127526 0.0426767 -3.14022 1 0 1 1 0 0 +EDGE2 1000 940 -0.00207764 0.104509 -3.14454 1 0 1 1 0 0 +EDGE2 1000 941 0.0316453 0.988128 1.56619 1 0 1 1 0 0 +EDGE2 1000 981 -0.0342577 0.896526 1.5881 1 0 1 1 0 0 +EDGE2 1000 999 -0.964344 0.00199524 -0.0161703 1 0 1 1 0 0 +EDGE2 1001 942 1.07597 -0.0567102 0.0115588 1 0 1 1 0 0 +EDGE2 1001 980 -1.12278 0.0231203 1.56771 1 0 1 1 0 0 +EDGE2 1001 1000 -0.98345 0.0277882 -1.56029 1 0 1 1 0 0 +EDGE2 1001 940 -1.00745 -0.018321 1.57027 1 0 1 1 0 0 +EDGE2 1001 941 0.000207974 0.00980271 -0.0143632 1 0 1 1 0 0 +EDGE2 1001 981 -0.0589104 -0.0395849 0.0039964 1 0 1 1 0 0 +EDGE2 1001 982 1.05094 -0.0269482 -0.0321988 1 0 1 1 0 0 +EDGE2 1002 942 0.0743688 -0.0121334 0.0448948 1 0 1 1 0 0 +EDGE2 1002 1001 -1.02098 0.100738 0.0169181 1 0 1 1 0 0 +EDGE2 1002 941 -0.997028 0.0565863 -0.0198248 1 0 1 1 0 0 +EDGE2 1002 981 -0.999483 0.0194362 -0.0239212 1 0 1 1 0 0 +EDGE2 1002 982 -0.0937673 0.0081885 0.024172 1 0 1 1 0 0 +EDGE2 1002 983 0.991241 -0.0283247 -0.0227181 1 0 1 1 0 0 +EDGE2 1002 943 1.0419 -0.0217992 -0.0255545 1 0 1 1 0 0 +EDGE2 1003 942 -0.867884 -0.00944142 -0.0204113 1 0 1 1 0 0 +EDGE2 1003 982 -1.03183 -0.0227616 0.0406141 1 0 1 1 0 0 +EDGE2 1003 1002 -1.0124 -0.00953939 -0.0615147 1 0 1 1 0 0 +EDGE2 1003 983 0.00173833 0.115102 -0.0245993 1 0 1 1 0 0 +EDGE2 1003 943 0.0479079 0.0235266 0.00383131 1 0 1 1 0 0 +EDGE2 1003 944 1.09222 0.0537162 0.0308269 1 0 1 1 0 0 +EDGE2 1003 984 1.02109 -0.0337322 0.0205667 1 0 1 1 0 0 +EDGE2 1004 983 -1.04437 -0.0567163 0.0071636 1 0 1 1 0 0 +EDGE2 1004 1003 -1.01965 -0.0662665 0.0107955 1 0 1 1 0 0 +EDGE2 1004 943 -1.04046 -0.0506245 0.017791 1 0 1 1 0 0 +EDGE2 1004 944 0.00194488 0.0749197 -0.014285 1 0 1 1 0 0 +EDGE2 1004 984 -0.0631932 -0.0276023 0.00777034 1 0 1 1 0 0 +EDGE2 1004 945 0.979168 0.0659021 0.0225975 1 0 1 1 0 0 +EDGE2 1004 985 1.00616 0.0217371 0.0530872 1 0 1 1 0 0 +EDGE2 1005 946 0.00444184 -1.01267 -1.55435 1 0 1 1 0 0 +EDGE2 1005 1004 -1.05799 -0.00369371 -0.00812627 1 0 1 1 0 0 +EDGE2 1005 944 -1.0463 0.00566981 -0.0222132 1 0 1 1 0 0 +EDGE2 1005 984 -1.00531 -0.0400067 -0.0236004 1 0 1 1 0 0 +EDGE2 1005 945 0.0273047 -0.0283773 -0.0115514 1 0 1 1 0 0 +EDGE2 1005 985 -0.0237535 -0.0390678 0.0329638 1 0 1 1 0 0 +EDGE2 1005 986 -0.05714 1.002 1.56566 1 0 1 1 0 0 +EDGE2 1006 945 -0.958335 -0.0210759 -1.61919 1 0 1 1 0 0 +EDGE2 1006 985 -0.901543 -0.0807483 -1.53471 1 0 1 1 0 0 +EDGE2 1006 1005 -1.03614 0.0455943 -1.54528 1 0 1 1 0 0 +EDGE2 1006 987 0.928741 -0.0124934 -0.000524384 1 0 1 1 0 0 +EDGE2 1006 986 -0.0139076 -0.0471595 -0.0134555 1 0 1 1 0 0 +EDGE2 1007 987 -0.0410816 -0.018071 0.0184361 1 0 1 1 0 0 +EDGE2 1007 986 -1.11166 0.0453993 0.0171823 1 0 1 1 0 0 +EDGE2 1007 1006 -1.03748 0.0554618 -0.0259281 1 0 1 1 0 0 +EDGE2 1007 988 1.15704 -0.0422556 -0.00627648 1 0 1 1 0 0 +EDGE2 1008 987 -0.954198 0.0387609 0.00275646 1 0 1 1 0 0 +EDGE2 1008 1007 -1.01458 -0.0908723 -0.00135614 1 0 1 1 0 0 +EDGE2 1008 988 0.0088263 0.0209628 -0.0627932 1 0 1 1 0 0 +EDGE2 1008 989 0.983705 -0.00966779 0.015633 1 0 1 1 0 0 +EDGE2 1009 988 -1.00218 0.0987582 -0.0204007 1 0 1 1 0 0 +EDGE2 1009 1008 -0.95401 0.0702969 0.00221482 1 0 1 1 0 0 +EDGE2 1009 989 -0.0549976 0.0946067 0.0118182 1 0 1 1 0 0 +EDGE2 1009 990 0.96206 0.0176835 0.0307713 1 0 1 1 0 0 +EDGE2 1010 989 -0.967248 0.0147757 0.0558768 1 0 1 1 0 0 +EDGE2 1010 1009 -0.981797 -0.021677 -0.0100961 1 0 1 1 0 0 +EDGE2 1010 991 0.0503447 0.998717 1.54646 1 0 1 1 0 0 +EDGE2 1010 990 0.00620379 0.0342158 0.0112622 1 0 1 1 0 0 +EDGE2 1011 992 0.956753 -0.052996 0.0263961 1 0 1 1 0 0 +EDGE2 1011 1010 -1.03002 -0.0194549 -1.57013 1 0 1 1 0 0 +EDGE2 1011 991 -0.0237562 -0.0723335 0.0115736 1 0 1 1 0 0 +EDGE2 1011 990 -1.01024 0.0406171 -1.54897 1 0 1 1 0 0 +EDGE2 1012 992 0.0606279 -0.0334448 0.00145616 1 0 1 1 0 0 +EDGE2 1012 993 0.944039 -0.0548563 -0.0112319 1 0 1 1 0 0 +EDGE2 1012 1011 -1.00714 -0.0643748 0.00289751 1 0 1 1 0 0 +EDGE2 1012 991 -0.988932 0.0413032 -0.00550353 1 0 1 1 0 0 +EDGE2 1013 994 0.969603 -0.0241584 0.0121122 1 0 1 1 0 0 +EDGE2 1013 992 -1.00137 -0.0165484 -0.000532906 1 0 1 1 0 0 +EDGE2 1013 993 0.0896585 0.0182117 0.00961195 1 0 1 1 0 0 +EDGE2 1013 1012 -1.05013 0.0515895 -0.0370971 1 0 1 1 0 0 +EDGE2 1014 995 1.01792 0.0535566 0.00783332 1 0 1 1 0 0 +EDGE2 1014 994 0.0515918 -0.055467 0.00121684 1 0 1 1 0 0 +EDGE2 1014 993 -0.96317 -0.0286386 0.0202736 1 0 1 1 0 0 +EDGE2 1014 1013 -1.01254 -0.0352111 0.00673137 1 0 1 1 0 0 +EDGE2 1015 996 -0.102104 0.998448 1.59853 1 0 1 1 0 0 +EDGE2 1015 995 -0.0718542 0.00421794 -0.000452234 1 0 1 1 0 0 +EDGE2 1015 1014 -1.01881 0.0431626 -0.0174742 1 0 1 1 0 0 +EDGE2 1015 994 -1.08446 -0.0498336 -0.000414759 1 0 1 1 0 0 +EDGE2 1016 997 0.968964 0.0594152 -0.00495365 1 0 1 1 0 0 +EDGE2 1016 996 0.138879 0.0211307 -0.0165333 1 0 1 1 0 0 +EDGE2 1016 995 -1.0255 0.0428177 -1.60916 1 0 1 1 0 0 +EDGE2 1016 1015 -0.996191 0.00117435 -1.57026 1 0 1 1 0 0 +EDGE2 1017 998 0.987053 -0.0478456 0.0236419 1 0 1 1 0 0 +EDGE2 1017 997 -0.0243354 0.0240686 0.0212267 1 0 1 1 0 0 +EDGE2 1017 1016 -1.00421 -0.0285701 -0.014093 1 0 1 1 0 0 +EDGE2 1017 996 -1.07759 0.00799997 -0.0446859 1 0 1 1 0 0 +EDGE2 1018 999 0.897258 0.0390224 0.0183312 1 0 1 1 0 0 +EDGE2 1018 998 -0.00325317 -0.0109766 0.0175323 1 0 1 1 0 0 +EDGE2 1018 997 -0.990664 0.030368 -0.00936783 1 0 1 1 0 0 +EDGE2 1018 1017 -1.00653 0.0239907 -0.023513 1 0 1 1 0 0 +EDGE2 1019 980 1.04432 0.00465281 -3.1154 1 0 1 1 0 0 +EDGE2 1019 1000 1.10415 0.00893306 -0.0130339 1 0 1 1 0 0 +EDGE2 1019 940 1.05987 -0.0363674 -3.15681 1 0 1 1 0 0 +EDGE2 1019 999 -0.0832928 -0.00924794 -0.00910333 1 0 1 1 0 0 +EDGE2 1019 998 -1.03324 -0.0908629 -0.0173371 1 0 1 1 0 0 +EDGE2 1019 1018 -0.975619 0.0990846 0.0142333 1 0 1 1 0 0 +EDGE2 1020 979 0.923529 0.0631258 -3.14585 1 0 1 1 0 0 +EDGE2 1020 939 0.963204 0.14151 -3.12364 1 0 1 1 0 0 +EDGE2 1020 980 0.00705054 -0.0327451 -3.14963 1 0 1 1 0 0 +EDGE2 1020 1000 0.015652 -0.00846921 -0.00677122 1 0 1 1 0 0 +EDGE2 1020 1001 0.0376572 1.00118 1.57171 1 0 1 1 0 0 +EDGE2 1020 940 0.0594175 0.0448935 -3.1423 1 0 1 1 0 0 +EDGE2 1020 941 -0.0633775 0.897716 1.55944 1 0 1 1 0 0 +EDGE2 1020 981 -0.0569466 1.03009 1.54047 1 0 1 1 0 0 +EDGE2 1020 1019 -0.977585 -0.0567536 -0.00588804 1 0 1 1 0 0 +EDGE2 1020 999 -1.09565 0.00870477 -0.00408045 1 0 1 1 0 0 +EDGE2 1021 942 0.963432 0.082417 -0.00344811 1 0 1 1 0 0 +EDGE2 1021 980 -0.966646 0.00212081 1.57908 1 0 1 1 0 0 +EDGE2 1021 1020 -0.958088 0.0532486 -1.57931 1 0 1 1 0 0 +EDGE2 1021 1000 -1.02252 0.0114857 -1.56391 1 0 1 1 0 0 +EDGE2 1021 1001 -0.0381938 -0.0321693 -0.00290127 1 0 1 1 0 0 +EDGE2 1021 940 -0.979658 -0.00198417 1.57519 1 0 1 1 0 0 +EDGE2 1021 941 0.0526992 -0.102332 -0.0189765 1 0 1 1 0 0 +EDGE2 1021 981 0.0242129 -0.059495 0.0233055 1 0 1 1 0 0 +EDGE2 1021 982 1.00802 -0.0813568 0.0297476 1 0 1 1 0 0 +EDGE2 1021 1002 0.984 -0.149852 -0.01055 1 0 1 1 0 0 +EDGE2 1022 942 0.0187137 -0.0186309 -0.00636367 1 0 1 1 0 0 +EDGE2 1022 1001 -1.02001 -0.039507 -0.0209421 1 0 1 1 0 0 +EDGE2 1022 1021 -0.982263 0.0100831 -0.0160671 1 0 1 1 0 0 +EDGE2 1022 941 -0.919193 0.0331998 -0.00934679 1 0 1 1 0 0 +EDGE2 1022 981 -0.979951 -0.031334 -0.0226215 1 0 1 1 0 0 +EDGE2 1022 982 -0.00348579 0.0478651 0.00341135 1 0 1 1 0 0 +EDGE2 1022 1002 -0.00939372 -0.0189508 0.0125183 1 0 1 1 0 0 +EDGE2 1022 983 1.00231 -0.0470554 -0.0255212 1 0 1 1 0 0 +EDGE2 1022 1003 0.965892 -0.042398 0.00346269 1 0 1 1 0 0 +EDGE2 1022 943 1.05865 -0.0967454 0.0129742 1 0 1 1 0 0 +EDGE2 1023 942 -1.00136 0.000481824 0.0129047 1 0 1 1 0 0 +EDGE2 1023 1022 -1.02802 0.0630178 0.0120674 1 0 1 1 0 0 +EDGE2 1023 982 -1.01553 0.0131369 -0.0165046 1 0 1 1 0 0 +EDGE2 1023 1002 -0.998023 0.0931728 0.0163591 1 0 1 1 0 0 +EDGE2 1023 1004 1.02969 0.0763272 -0.0209236 1 0 1 1 0 0 +EDGE2 1023 983 -0.0106603 -0.0073841 -0.00100982 1 0 1 1 0 0 +EDGE2 1023 1003 -0.0708034 0.095609 -0.0011059 1 0 1 1 0 0 +EDGE2 1023 943 -0.0810058 0.0587046 0.0057128 1 0 1 1 0 0 +EDGE2 1023 944 0.960824 -0.0682975 0.0166714 1 0 1 1 0 0 +EDGE2 1023 984 1.02706 -0.0207805 0.0179998 1 0 1 1 0 0 +EDGE2 1024 1004 0.00266369 -0.00488877 0.0253356 1 0 1 1 0 0 +EDGE2 1024 983 -1.02163 0.0102825 0.00992696 1 0 1 1 0 0 +EDGE2 1024 1023 -1.02809 0.0823306 -0.0378968 1 0 1 1 0 0 +EDGE2 1024 1003 -1.01682 -0.0222069 -0.0227514 1 0 1 1 0 0 +EDGE2 1024 943 -0.95165 0.0210903 -0.000845787 1 0 1 1 0 0 +EDGE2 1024 944 0.0763698 -0.0550741 0.0131411 1 0 1 1 0 0 +EDGE2 1024 984 0.0410714 0.0832388 -0.0173444 1 0 1 1 0 0 +EDGE2 1024 945 1.06069 -0.0220994 0.0116283 1 0 1 1 0 0 +EDGE2 1024 985 1.05993 0.0768538 -0.0142811 1 0 1 1 0 0 +EDGE2 1024 1005 1.05615 0.0443954 0.00968481 1 0 1 1 0 0 +EDGE2 1025 946 -0.0317051 -0.969414 -1.56773 1 0 1 1 0 0 +EDGE2 1025 1004 -0.971113 -0.0202332 0.0282868 1 0 1 1 0 0 +EDGE2 1025 1024 -1.03622 -0.0277218 -0.00380654 1 0 1 1 0 0 +EDGE2 1025 944 -1.05196 0.0344575 0.0325925 1 0 1 1 0 0 +EDGE2 1025 984 -0.985642 -0.0728193 -0.00259936 1 0 1 1 0 0 +EDGE2 1025 945 -0.0284427 0.00720386 0.0386575 1 0 1 1 0 0 +EDGE2 1025 985 0.0443087 0.000627705 0.0308173 1 0 1 1 0 0 +EDGE2 1025 1005 7.81953e-05 -0.0987247 -0.000201891 1 0 1 1 0 0 +EDGE2 1025 986 0.0271954 1.0017 1.57177 1 0 1 1 0 0 +EDGE2 1025 1006 -0.0463767 1.02288 1.60586 1 0 1 1 0 0 +EDGE2 1026 1025 -0.99945 0.0783502 -1.58232 1 0 1 1 0 0 +EDGE2 1026 945 -0.870795 -0.0686006 -1.57611 1 0 1 1 0 0 +EDGE2 1026 985 -0.981647 0.0843805 -1.58261 1 0 1 1 0 0 +EDGE2 1026 1005 -1.02235 0.0079509 -1.57221 1 0 1 1 0 0 +EDGE2 1026 987 1.06377 0.0643344 -0.0135968 1 0 1 1 0 0 +EDGE2 1026 986 0.0909136 0.00779592 -0.00860451 1 0 1 1 0 0 +EDGE2 1026 1006 0.0135915 -0.101508 0.0288164 1 0 1 1 0 0 +EDGE2 1026 1007 0.822912 0.0399959 -0.0172445 1 0 1 1 0 0 +EDGE2 1027 987 0.0301297 -0.0111361 -0.0334167 1 0 1 1 0 0 +EDGE2 1027 986 -0.976411 0.0199427 -0.0108125 1 0 1 1 0 0 +EDGE2 1027 1026 -0.936102 0.064112 -0.0147667 1 0 1 1 0 0 +EDGE2 1027 1006 -0.979875 0.0308329 -0.0198501 1 0 1 1 0 0 +EDGE2 1027 1007 -0.0263805 -0.0871881 0.00324842 1 0 1 1 0 0 +EDGE2 1027 988 0.97274 -0.0273723 -0.0301622 1 0 1 1 0 0 +EDGE2 1027 1008 1.08481 0.0319818 0.0128257 1 0 1 1 0 0 +EDGE2 1028 987 -0.993961 0.0203007 -0.0138591 1 0 1 1 0 0 +EDGE2 1028 1027 -0.935439 0.0194175 -0.0171018 1 0 1 1 0 0 +EDGE2 1028 1007 -1.00828 -0.0364726 0.0147682 1 0 1 1 0 0 +EDGE2 1028 988 0.026815 0.0498539 -0.0327486 1 0 1 1 0 0 +EDGE2 1028 1008 0.0642084 0.0635178 -0.0124198 1 0 1 1 0 0 +EDGE2 1028 989 0.987402 0.0562934 0.00670304 1 0 1 1 0 0 +EDGE2 1028 1009 1.06634 -0.00648252 -0.00848386 1 0 1 1 0 0 +EDGE2 1029 1028 -1.00992 -0.0160123 -0.0163771 1 0 1 1 0 0 +EDGE2 1029 988 -1.13214 0.0259112 -0.0148223 1 0 1 1 0 0 +EDGE2 1029 1008 -0.978058 -0.00593397 -0.0157687 1 0 1 1 0 0 +EDGE2 1029 989 -0.0256917 0.0700019 -0.00854434 1 0 1 1 0 0 +EDGE2 1029 1009 -0.0708843 0.0442537 0.0041158 1 0 1 1 0 0 +EDGE2 1029 1010 1.01174 0.0127568 -7.41563e-06 1 0 1 1 0 0 +EDGE2 1029 990 0.878244 -0.0183636 0.0175704 1 0 1 1 0 0 +EDGE2 1030 989 -0.967993 0.0327147 0.012276 1 0 1 1 0 0 +EDGE2 1030 1009 -0.937489 0.0736679 -0.0119411 1 0 1 1 0 0 +EDGE2 1030 1029 -1.04225 -0.0463066 -0.00178594 1 0 1 1 0 0 +EDGE2 1030 1010 0.0130686 0.00178729 0.0166506 1 0 1 1 0 0 +EDGE2 1030 1011 0.0243782 1.07164 1.57998 1 0 1 1 0 0 +EDGE2 1030 991 -0.00992736 1.04818 1.54164 1 0 1 1 0 0 +EDGE2 1030 990 -0.0728752 0.00414887 0.0239975 1 0 1 1 0 0 +EDGE2 1031 1010 -1.01674 -0.0402785 1.59342 1 0 1 1 0 0 +EDGE2 1031 1030 -1.0244 0.0493419 1.55017 1 0 1 1 0 0 +EDGE2 1031 990 -0.980553 -0.0237493 1.58892 1 0 1 1 0 0 +EDGE2 1032 1031 -1.00558 0.0447635 0.0138061 1 0 1 1 0 0 +EDGE2 1033 1032 -1.05335 0.0410064 0.01459 1 0 1 1 0 0 +EDGE2 1034 1033 -1.05513 0.0839897 0.0199007 1 0 1 1 0 0 +EDGE2 1035 1034 -0.947056 -0.0121421 0.026075 1 0 1 1 0 0 +EDGE2 1036 1035 -0.96334 0.0727271 -1.57394 1 0 1 1 0 0 +EDGE2 1037 1036 -0.943764 0.00138846 -0.00355015 1 0 1 1 0 0 +EDGE2 1038 1037 -1.04431 -0.00859947 -0.000520739 1 0 1 1 0 0 +EDGE2 1039 1038 -1.09333 0.0807222 -0.015424 1 0 1 1 0 0 +EDGE2 1040 1039 -0.986166 0.0360471 -0.0504076 1 0 1 1 0 0 +EDGE2 1041 1040 -1.00307 0.0484578 -1.56145 1 0 1 1 0 0 +EDGE2 1042 1041 -0.970566 0.0603995 0.0261469 1 0 1 1 0 0 +EDGE2 1043 1042 -0.965206 0.118057 0.00118929 1 0 1 1 0 0 +EDGE2 1044 1043 -0.981476 -0.0420124 0.0158303 1 0 1 1 0 0 +EDGE2 1045 1044 -1.00853 0.0148847 -0.0325634 1 0 1 1 0 0 +EDGE2 1046 1045 -0.921575 -0.102358 -1.59264 1 0 1 1 0 0 +EDGE2 1047 1046 -0.996778 -0.0172957 -0.00887872 1 0 1 1 0 0 +EDGE2 1048 1047 -1.06039 -0.0386055 0.0237857 1 0 1 1 0 0 +EDGE2 1049 1010 1.05581 0.0245894 -3.16306 1 0 1 1 0 0 +EDGE2 1049 1030 1.04055 0.00585336 -3.14849 1 0 1 1 0 0 +EDGE2 1049 990 1.0511 0.0498739 -3.1451 1 0 1 1 0 0 +EDGE2 1049 1048 -0.960037 -0.0179185 -0.00402692 1 0 1 1 0 0 +EDGE2 1050 989 0.952893 -0.0139339 -3.12575 1 0 1 1 0 0 +EDGE2 1050 1009 1.05125 -0.0360159 -3.08876 1 0 1 1 0 0 +EDGE2 1050 1029 0.914694 0.0712105 -3.1369 1 0 1 1 0 0 +EDGE2 1050 1010 0.0589132 0.0315604 -3.14193 1 0 1 1 0 0 +EDGE2 1050 1011 -0.0751629 -1.01013 -1.56596 1 0 1 1 0 0 +EDGE2 1050 991 -0.0577571 -0.984038 -1.55865 1 0 1 1 0 0 +EDGE2 1050 1030 0.0213334 0.0748341 -3.15553 1 0 1 1 0 0 +EDGE2 1050 1031 -0.0407718 1.03042 1.58536 1 0 1 1 0 0 +EDGE2 1050 990 0.0289468 -0.0664425 -3.14751 1 0 1 1 0 0 +EDGE2 1050 1049 -1.0071 0.0457972 0.00141871 1 0 1 1 0 0 +EDGE2 1051 992 0.931218 -0.0276294 0.0367234 1 0 1 1 0 0 +EDGE2 1051 1012 0.989006 -0.0242505 0.038484 1 0 1 1 0 0 +EDGE2 1051 1010 -1.04457 -0.0143469 -1.5773 1 0 1 1 0 0 +EDGE2 1051 1011 0.0147458 -0.0117398 0.0168582 1 0 1 1 0 0 +EDGE2 1051 991 0.0270961 -0.00154761 0.0069914 1 0 1 1 0 0 +EDGE2 1051 1050 -0.991023 -0.0242348 1.57992 1 0 1 1 0 0 +EDGE2 1051 1030 -0.994932 -0.0348607 -1.62516 1 0 1 1 0 0 +EDGE2 1051 990 -1.01227 0.0480276 -1.58302 1 0 1 1 0 0 +EDGE2 1052 992 -0.0325624 0.106584 -0.00641506 1 0 1 1 0 0 +EDGE2 1052 993 1.02662 0.0213131 -0.00883696 1 0 1 1 0 0 +EDGE2 1052 1013 0.996501 -0.0169042 0.0184249 1 0 1 1 0 0 +EDGE2 1052 1012 0.0157826 -0.121368 0.0110941 1 0 1 1 0 0 +EDGE2 1052 1011 -0.998868 -0.0141408 -0.00975918 1 0 1 1 0 0 +EDGE2 1052 1051 -0.955257 0.00366439 -0.0105638 1 0 1 1 0 0 +EDGE2 1052 991 -1.00275 0.0662239 0.0180915 1 0 1 1 0 0 +EDGE2 1053 1014 1.05688 0.0265671 -0.022724 1 0 1 1 0 0 +EDGE2 1053 994 1.046 -0.061232 -0.00332114 1 0 1 1 0 0 +EDGE2 1053 992 -0.998199 -0.0372258 0.0145398 1 0 1 1 0 0 +EDGE2 1053 993 -0.00615266 -0.0525688 -0.00518726 1 0 1 1 0 0 +EDGE2 1053 1013 -0.0679154 -0.0582047 -0.000563388 1 0 1 1 0 0 +EDGE2 1053 1052 -0.942377 0.0883199 -0.0170387 1 0 1 1 0 0 +EDGE2 1053 1012 -0.96206 0.0402721 -0.0127703 1 0 1 1 0 0 +EDGE2 1054 995 1.01276 0.0022468 0.00701521 1 0 1 1 0 0 +EDGE2 1054 1015 1.10554 0.0168843 -0.00107465 1 0 1 1 0 0 +EDGE2 1054 1014 -0.0138225 -0.0916124 0.0159678 1 0 1 1 0 0 +EDGE2 1054 994 -0.0582489 -0.00597715 -0.0247593 1 0 1 1 0 0 +EDGE2 1054 993 -1.00635 -0.0900722 0.0112426 1 0 1 1 0 0 +EDGE2 1054 1053 -0.919386 -0.00700205 -0.000385872 1 0 1 1 0 0 +EDGE2 1054 1013 -1.00519 0.0251149 -0.027932 1 0 1 1 0 0 +EDGE2 1055 1016 -0.028831 0.98498 1.56745 1 0 1 1 0 0 +EDGE2 1055 996 -0.0437478 0.973229 1.53004 1 0 1 1 0 0 +EDGE2 1055 995 -0.0129783 0.024684 -0.0215906 1 0 1 1 0 0 +EDGE2 1055 1015 0.126247 -0.0238476 0.00904253 1 0 1 1 0 0 +EDGE2 1055 1014 -0.978139 -0.0134194 0.0137069 1 0 1 1 0 0 +EDGE2 1055 1054 -0.995935 0.0181987 -0.0099862 1 0 1 1 0 0 +EDGE2 1055 994 -1.06594 0.00790993 0.00847648 1 0 1 1 0 0 +EDGE2 1056 997 0.931626 -0.0223277 0.0140797 1 0 1 1 0 0 +EDGE2 1056 1017 1.13628 -0.0638924 -0.0139652 1 0 1 1 0 0 +EDGE2 1056 1016 0.0408481 0.00462323 0.0274313 1 0 1 1 0 0 +EDGE2 1056 996 -0.0125919 -0.0297824 -0.0032825 1 0 1 1 0 0 +EDGE2 1056 995 -1.07542 -0.0593637 -1.61421 1 0 1 1 0 0 +EDGE2 1056 1015 -1.03028 -0.0272064 -1.58156 1 0 1 1 0 0 +EDGE2 1056 1055 -1.09141 0.0355252 -1.56007 1 0 1 1 0 0 +EDGE2 1057 998 1.02453 0.0732532 0.0059207 1 0 1 1 0 0 +EDGE2 1057 1018 1.01308 0.0510909 0.0101307 1 0 1 1 0 0 +EDGE2 1057 997 0.050836 0.0665394 -0.0117355 1 0 1 1 0 0 +EDGE2 1057 1017 -0.0166266 0.124174 -0.0148118 1 0 1 1 0 0 +EDGE2 1057 1016 -1.04381 -0.0773507 0.00577109 1 0 1 1 0 0 +EDGE2 1057 1056 -0.954194 -0.120995 -0.0273501 1 0 1 1 0 0 +EDGE2 1057 996 -0.967248 -0.0403861 -0.0094339 1 0 1 1 0 0 +EDGE2 1058 1019 1.04659 -0.0480755 -0.0177936 1 0 1 1 0 0 +EDGE2 1058 999 1.01227 0.000511504 -0.0260898 1 0 1 1 0 0 +EDGE2 1058 998 -0.0170363 0.0546673 -0.0124071 1 0 1 1 0 0 +EDGE2 1058 1018 -0.0535514 0.0478684 0.0137303 1 0 1 1 0 0 +EDGE2 1058 997 -0.850412 -0.0970359 -0.0436937 1 0 1 1 0 0 +EDGE2 1058 1057 -0.995044 -0.0403198 -0.0150928 1 0 1 1 0 0 +EDGE2 1058 1017 -0.979535 -0.0623762 -0.0140761 1 0 1 1 0 0 +EDGE2 1059 980 0.999945 0.00107163 -3.11585 1 0 1 1 0 0 +EDGE2 1059 1020 0.986329 -0.0237009 0.0026751 1 0 1 1 0 0 +EDGE2 1059 1000 1.02742 -0.014299 0.0368437 1 0 1 1 0 0 +EDGE2 1059 940 1.07479 0.00537245 -3.1452 1 0 1 1 0 0 +EDGE2 1059 1019 0.0294589 -0.000816517 -0.00209669 1 0 1 1 0 0 +EDGE2 1059 999 0.0398092 -0.0379324 0.0219234 1 0 1 1 0 0 +EDGE2 1059 998 -1.0451 0.0335285 -0.00491482 1 0 1 1 0 0 +EDGE2 1059 1018 -0.926181 0.0405656 0.0141637 1 0 1 1 0 0 +EDGE2 1059 1058 -0.960739 -0.016447 -0.00522564 1 0 1 1 0 0 +EDGE2 1060 979 1.03715 -0.0974519 -3.10537 1 0 1 1 0 0 +EDGE2 1060 939 1.05227 0.00578969 -3.11954 1 0 1 1 0 0 +EDGE2 1060 980 0.0321777 0.0475952 -3.17038 1 0 1 1 0 0 +EDGE2 1060 1020 0.0549921 0.0126464 -0.0232456 1 0 1 1 0 0 +EDGE2 1060 1000 -0.0555888 -0.0651641 0.000472558 1 0 1 1 0 0 +EDGE2 1060 1001 -0.041933 0.949036 1.592 1 0 1 1 0 0 +EDGE2 1060 940 0.0544187 0.0335306 -3.17925 1 0 1 1 0 0 +EDGE2 1060 1021 0.0355932 1.04802 1.56351 1 0 1 1 0 0 +EDGE2 1060 941 0.0308555 0.945238 1.55938 1 0 1 1 0 0 +EDGE2 1060 981 -0.0306901 0.95403 1.55954 1 0 1 1 0 0 +EDGE2 1060 1019 -0.959017 -0.0619414 0.0368373 1 0 1 1 0 0 +EDGE2 1060 1059 -1.00544 -0.0542943 -0.0192528 1 0 1 1 0 0 +EDGE2 1060 999 -0.985067 -0.00469769 -0.0175745 1 0 1 1 0 0 +EDGE2 1061 942 1.05931 0.0465422 0.0198675 1 0 1 1 0 0 +EDGE2 1061 1022 0.982409 -0.00126211 -0.0244773 1 0 1 1 0 0 +EDGE2 1061 980 -1.06224 0.0422935 1.52131 1 0 1 1 0 0 +EDGE2 1061 1020 -0.915619 -0.0406552 -1.5476 1 0 1 1 0 0 +EDGE2 1061 1060 -1.02603 -0.0519574 -1.56956 1 0 1 1 0 0 +EDGE2 1061 1000 -1.12533 -0.00497285 -1.58159 1 0 1 1 0 0 +EDGE2 1061 1001 0.0122199 0.0370432 0.0107592 1 0 1 1 0 0 +EDGE2 1061 940 -0.953543 0.0267307 1.55551 1 0 1 1 0 0 +EDGE2 1061 1021 -0.0660965 0.0210975 0.00908774 1 0 1 1 0 0 +EDGE2 1061 941 -0.00299844 0.0426951 0.0203029 1 0 1 1 0 0 +EDGE2 1061 981 -0.11837 0.0530549 -0.00444325 1 0 1 1 0 0 +EDGE2 1061 982 1.01493 0.0620364 0.0155927 1 0 1 1 0 0 +EDGE2 1061 1002 1.0572 0.0464287 0.0300072 1 0 1 1 0 0 +EDGE2 1062 942 0.0142086 0.0698627 0.0167046 1 0 1 1 0 0 +EDGE2 1062 1022 0.0281051 -0.0226547 -0.0284909 1 0 1 1 0 0 +EDGE2 1062 1001 -1.04197 0.0903647 -0.0627292 1 0 1 1 0 0 +EDGE2 1062 1061 -0.974417 0.0352929 0.0146066 1 0 1 1 0 0 +EDGE2 1062 1021 -0.983938 -0.0136018 -0.0451653 1 0 1 1 0 0 +EDGE2 1062 941 -0.981295 -0.0920884 0.0176425 1 0 1 1 0 0 +EDGE2 1062 981 -0.898286 -0.0480471 0.0105047 1 0 1 1 0 0 +EDGE2 1062 982 0.0744287 0.00408771 -0.0204356 1 0 1 1 0 0 +EDGE2 1062 1002 -0.0977625 -0.056056 0.00103255 1 0 1 1 0 0 +EDGE2 1062 983 0.988902 0.026583 0.000614258 1 0 1 1 0 0 +EDGE2 1062 1023 1.02445 0.0512015 -0.0228062 1 0 1 1 0 0 +EDGE2 1062 1003 0.932517 -0.0481134 0.0406478 1 0 1 1 0 0 +EDGE2 1062 943 0.969184 -0.0565945 0.0325942 1 0 1 1 0 0 +EDGE2 1063 942 -1.07769 0.0577802 0.00147318 1 0 1 1 0 0 +EDGE2 1063 1022 -1.02574 0.0164762 0.0265464 1 0 1 1 0 0 +EDGE2 1063 1062 -1.03494 0.0348922 -0.0358039 1 0 1 1 0 0 +EDGE2 1063 982 -0.948085 -0.0194664 -0.0136742 1 0 1 1 0 0 +EDGE2 1063 1002 -0.937098 0.0076519 -0.0155281 1 0 1 1 0 0 +EDGE2 1063 1004 0.930385 -0.0436074 -0.0144966 1 0 1 1 0 0 +EDGE2 1063 983 -0.0988181 -0.116508 -0.00241554 1 0 1 1 0 0 +EDGE2 1063 1023 0.0293286 -0.0401697 -0.00295472 1 0 1 1 0 0 +EDGE2 1063 1003 0.0286295 -0.026802 0.0120922 1 0 1 1 0 0 +EDGE2 1063 943 0.0487015 -0.0756494 0.0212512 1 0 1 1 0 0 +EDGE2 1063 1024 1.03735 -0.0840931 -0.000406475 1 0 1 1 0 0 +EDGE2 1063 944 0.977063 0.0218672 0.00246213 1 0 1 1 0 0 +EDGE2 1063 984 1.03885 -0.0552235 -0.0108615 1 0 1 1 0 0 +EDGE2 1064 1004 0.010377 0.00581721 -0.0108852 1 0 1 1 0 0 +EDGE2 1064 983 -1.02553 0.03442 -0.00798945 1 0 1 1 0 0 +EDGE2 1064 1023 -0.944734 0.0134972 0.0147927 1 0 1 1 0 0 +EDGE2 1064 1063 -1.07093 -0.0662578 -0.0129553 1 0 1 1 0 0 +EDGE2 1064 1003 -1.01758 -0.0162933 -0.0152383 1 0 1 1 0 0 +EDGE2 1064 943 -1.05854 -0.0610649 -0.00417071 1 0 1 1 0 0 +EDGE2 1064 1024 -0.0820726 0.0489591 -0.00412821 1 0 1 1 0 0 +EDGE2 1064 1025 0.963413 -0.0876176 0.0106264 1 0 1 1 0 0 +EDGE2 1064 944 -0.0160276 0.0280243 -0.000618529 1 0 1 1 0 0 +EDGE2 1064 984 -0.0309504 -0.0271456 -0.0299551 1 0 1 1 0 0 +EDGE2 1064 945 0.969048 -0.0776969 -0.020331 1 0 1 1 0 0 +EDGE2 1064 985 1.00399 -0.0766627 -0.00404938 1 0 1 1 0 0 +EDGE2 1064 1005 0.997376 -0.0120427 -0.0215007 1 0 1 1 0 0 +EDGE2 1065 946 -0.0776767 -0.985824 -1.53317 1 0 1 1 0 0 +EDGE2 1065 1004 -1.00753 0.00649623 -0.0128414 1 0 1 1 0 0 +EDGE2 1065 1064 -0.962069 0.0154567 -0.0165971 1 0 1 1 0 0 +EDGE2 1065 1024 -1.02829 -0.0433503 -0.0351855 1 0 1 1 0 0 +EDGE2 1065 1025 -0.0591486 0.0246372 0.010051 1 0 1 1 0 0 +EDGE2 1065 944 -0.958798 0.126478 0.0044691 1 0 1 1 0 0 +EDGE2 1065 984 -0.935308 -0.00860992 0.00600603 1 0 1 1 0 0 +EDGE2 1065 945 -0.0686543 -0.0239903 0.000105116 1 0 1 1 0 0 +EDGE2 1065 985 -0.0208583 -0.106547 0.00638786 1 0 1 1 0 0 +EDGE2 1065 1005 0.0595202 -0.000853624 0.0334572 1 0 1 1 0 0 +EDGE2 1065 986 -0.0885678 1.00426 1.56184 1 0 1 1 0 0 +EDGE2 1065 1026 0.0189754 1.08275 1.58343 1 0 1 1 0 0 +EDGE2 1065 1006 -0.0752023 0.937491 1.55935 1 0 1 1 0 0 +EDGE2 1066 1025 -1.01411 0.0893193 -1.53019 1 0 1 1 0 0 +EDGE2 1066 1065 -1.03369 0.00300743 -1.56226 1 0 1 1 0 0 +EDGE2 1066 945 -1.00223 0.0342196 -1.53324 1 0 1 1 0 0 +EDGE2 1066 985 -0.968583 -0.0221038 -1.57035 1 0 1 1 0 0 +EDGE2 1066 1005 -1.05174 -0.0414502 -1.55794 1 0 1 1 0 0 +EDGE2 1066 987 1.05731 0.0289389 -0.0454891 1 0 1 1 0 0 +EDGE2 1066 986 -0.0208231 0.0212768 0.0262145 1 0 1 1 0 0 +EDGE2 1066 1026 -0.0961368 -0.0171316 -0.00692551 1 0 1 1 0 0 +EDGE2 1066 1006 -0.0183553 -0.0297348 -0.00210775 1 0 1 1 0 0 +EDGE2 1066 1027 0.961031 -0.00433022 -0.00166999 1 0 1 1 0 0 +EDGE2 1066 1007 0.967146 0.00911287 -0.000590849 1 0 1 1 0 0 +EDGE2 1067 1028 1.00173 -0.0376519 0.00851124 1 0 1 1 0 0 +EDGE2 1067 987 0.0774535 0.00582349 0.0189478 1 0 1 1 0 0 +EDGE2 1067 986 -0.947196 -0.0478626 -0.0375648 1 0 1 1 0 0 +EDGE2 1067 1026 -0.992552 -0.0403379 -0.0223988 1 0 1 1 0 0 +EDGE2 1067 1066 -1.0007 0.00529877 -0.00461091 1 0 1 1 0 0 +EDGE2 1067 1006 -0.930863 -0.089873 -0.00918493 1 0 1 1 0 0 +EDGE2 1067 1027 -0.0100658 -0.0820327 0.00441176 1 0 1 1 0 0 +EDGE2 1067 1007 -0.105123 -0.010351 0.0114283 1 0 1 1 0 0 +EDGE2 1067 988 1.01787 0.0597328 0.0243515 1 0 1 1 0 0 +EDGE2 1067 1008 1.03173 0.0265831 0.00860431 1 0 1 1 0 0 +EDGE2 1068 1028 0.0624751 -0.0619691 -0.00418415 1 0 1 1 0 0 +EDGE2 1068 987 -1.02896 -0.0278188 0.00219228 1 0 1 1 0 0 +EDGE2 1068 1027 -1.00077 -0.00632839 0.00984175 1 0 1 1 0 0 +EDGE2 1068 1067 -0.949161 -0.059135 -0.0296668 1 0 1 1 0 0 +EDGE2 1068 1007 -1.01068 0.0113455 0.00948695 1 0 1 1 0 0 +EDGE2 1068 988 -0.0546044 -0.0270745 -0.0107443 1 0 1 1 0 0 +EDGE2 1068 1008 -0.0122852 0.0945689 -0.011486 1 0 1 1 0 0 +EDGE2 1068 989 1.02576 -0.000980161 0.00156206 1 0 1 1 0 0 +EDGE2 1068 1009 1.00727 -0.00580781 -0.0405884 1 0 1 1 0 0 +EDGE2 1068 1029 1.02135 -0.0450047 -0.0216466 1 0 1 1 0 0 +EDGE2 1069 1028 -0.987155 -0.0026152 -0.0199557 1 0 1 1 0 0 +EDGE2 1069 1068 -1.03919 -0.0487194 0.00701154 1 0 1 1 0 0 +EDGE2 1069 988 -1.09155 -0.0611221 0.0295885 1 0 1 1 0 0 +EDGE2 1069 1008 -0.986456 -0.0804835 -0.0261054 1 0 1 1 0 0 +EDGE2 1069 989 -0.115765 -0.033259 -0.0107029 1 0 1 1 0 0 +EDGE2 1069 1009 -0.059534 -0.0219465 -0.0258807 1 0 1 1 0 0 +EDGE2 1069 1029 0.0246743 0.0486575 -0.00267358 1 0 1 1 0 0 +EDGE2 1069 1010 0.977075 0.0266177 0.00925802 1 0 1 1 0 0 +EDGE2 1069 1050 1.03126 0.037131 -3.13473 1 0 1 1 0 0 +EDGE2 1069 1030 0.976609 0.00598033 0.0141115 1 0 1 1 0 0 +EDGE2 1069 990 0.97053 0.0284031 0.0241213 1 0 1 1 0 0 +EDGE2 1070 1069 -1.00374 0.130683 -0.0193324 1 0 1 1 0 0 +EDGE2 1070 989 -1.06632 0.034984 0.0143803 1 0 1 1 0 0 +EDGE2 1070 1009 -0.998827 -0.0279817 0.0046189 1 0 1 1 0 0 +EDGE2 1070 1029 -1.00699 -0.0246916 -0.00136701 1 0 1 1 0 0 +EDGE2 1070 1010 0.0202522 -0.00580549 0.00724647 1 0 1 1 0 0 +EDGE2 1070 1011 0.0695034 0.961314 1.54965 1 0 1 1 0 0 +EDGE2 1070 1051 -0.092872 0.958747 1.57056 1 0 1 1 0 0 +EDGE2 1070 991 -0.00318637 0.963838 1.56204 1 0 1 1 0 0 +EDGE2 1070 1050 -0.000392127 0.0320506 -3.12699 1 0 1 1 0 0 +EDGE2 1070 1030 0.0157867 0.0126187 0.0181152 1 0 1 1 0 0 +EDGE2 1070 1031 -0.0431499 -0.86673 -1.5574 1 0 1 1 0 0 +EDGE2 1070 990 0.0788171 -0.0378302 0.012775 1 0 1 1 0 0 +EDGE2 1070 1049 0.959155 -0.0193992 -3.14448 1 0 1 1 0 0 +EDGE2 1071 992 1.01101 -0.0134486 0.024731 1 0 1 1 0 0 +EDGE2 1071 1052 0.988089 -0.105815 -7.02791e-05 1 0 1 1 0 0 +EDGE2 1071 1012 0.92714 -0.0301622 -0.019532 1 0 1 1 0 0 +EDGE2 1071 1010 -0.989302 -0.12195 -1.54327 1 0 1 1 0 0 +EDGE2 1071 1011 -0.0843825 -0.0681112 0.00882589 1 0 1 1 0 0 +EDGE2 1071 1051 -0.0181575 0.0659377 0.00336544 1 0 1 1 0 0 +EDGE2 1071 991 0.00700843 0.0242473 -0.0402475 1 0 1 1 0 0 +EDGE2 1071 1050 -1.01677 -0.00764211 1.58143 1 0 1 1 0 0 +EDGE2 1071 1070 -0.983243 0.0490481 -1.57248 1 0 1 1 0 0 +EDGE2 1071 1030 -0.951597 -0.0649554 -1.55285 1 0 1 1 0 0 +EDGE2 1071 990 -0.940347 -0.0247192 -1.5508 1 0 1 1 0 0 +EDGE2 1072 992 -0.0384828 0.00750125 -0.00220428 1 0 1 1 0 0 +EDGE2 1072 993 1.03074 -0.135556 0.0128283 1 0 1 1 0 0 +EDGE2 1072 1053 0.994055 -0.0596873 -0.037039 1 0 1 1 0 0 +EDGE2 1072 1013 1.05599 -0.0749432 -0.00833985 1 0 1 1 0 0 +EDGE2 1072 1052 -0.0192932 -0.0433656 -0.0218323 1 0 1 1 0 0 +EDGE2 1072 1012 -0.0521044 0.00983492 0.0250003 1 0 1 1 0 0 +EDGE2 1072 1011 -0.99713 -0.0720318 -0.0308652 1 0 1 1 0 0 +EDGE2 1072 1051 -0.958734 -0.0451624 -0.0295889 1 0 1 1 0 0 +EDGE2 1072 1071 -1.01794 0.0459697 -0.0576234 1 0 1 1 0 0 +EDGE2 1072 991 -0.994815 0.0374461 -0.0260447 1 0 1 1 0 0 +EDGE2 1073 1014 0.902684 0.0159753 0.0188405 1 0 1 1 0 0 +EDGE2 1073 1054 0.946067 0.0319596 -0.0170226 1 0 1 1 0 0 +EDGE2 1073 994 1.01835 0.00847842 0.0417066 1 0 1 1 0 0 +EDGE2 1073 992 -0.939951 0.0112912 -0.0304571 1 0 1 1 0 0 +EDGE2 1073 993 0.0262498 -0.0263603 0.00824878 1 0 1 1 0 0 +EDGE2 1073 1053 -0.0810397 -0.0231415 -0.0377694 1 0 1 1 0 0 +EDGE2 1073 1013 0.0608257 -0.0299907 -0.0208805 1 0 1 1 0 0 +EDGE2 1073 1052 -1.03759 0.0103367 -0.0368066 1 0 1 1 0 0 +EDGE2 1073 1072 -0.992097 -0.0354054 0.00718856 1 0 1 1 0 0 +EDGE2 1073 1012 -1.01376 0.0672626 0.0269529 1 0 1 1 0 0 +EDGE2 1074 995 0.945023 -0.0397368 0.0284554 1 0 1 1 0 0 +EDGE2 1074 1015 0.982486 -0.0115206 -0.0307121 1 0 1 1 0 0 +EDGE2 1074 1055 0.961949 0.0342348 0.00344454 1 0 1 1 0 0 +EDGE2 1074 1014 0.0309822 0.0727599 -0.0209403 1 0 1 1 0 0 +EDGE2 1074 1054 0.148171 0.0229911 0.00606895 1 0 1 1 0 0 +EDGE2 1074 994 0.00702448 0.0436482 -0.0036852 1 0 1 1 0 0 +EDGE2 1074 993 -0.959972 0.0166627 -0.0116809 1 0 1 1 0 0 +EDGE2 1074 1053 -1.03054 -0.0555769 -0.0108636 1 0 1 1 0 0 +EDGE2 1074 1073 -0.920961 -0.0740239 0.000504567 1 0 1 1 0 0 +EDGE2 1074 1013 -0.968445 0.0101841 -0.0123218 1 0 1 1 0 0 +EDGE2 1075 1016 -0.00168789 1.01744 1.56124 1 0 1 1 0 0 +EDGE2 1075 1056 0.0475776 0.95985 1.56139 1 0 1 1 0 0 +EDGE2 1075 996 -0.0126655 0.857283 1.60892 1 0 1 1 0 0 +EDGE2 1075 1074 -0.986424 0.00725679 -0.0169577 1 0 1 1 0 0 +EDGE2 1075 995 0.107021 0.0583557 -0.00590859 1 0 1 1 0 0 +EDGE2 1075 1015 -0.0668398 -0.0403658 0.00114078 1 0 1 1 0 0 +EDGE2 1075 1055 0.010868 0.035844 0.0266746 1 0 1 1 0 0 +EDGE2 1075 1014 -1.02522 0.0158524 0.00597484 1 0 1 1 0 0 +EDGE2 1075 1054 -1.10132 0.0231667 0.0175332 1 0 1 1 0 0 +EDGE2 1075 994 -0.931152 0.0122868 0.0234074 1 0 1 1 0 0 +EDGE2 1076 1075 -1.00803 -0.0415834 1.58965 1 0 1 1 0 0 +EDGE2 1076 995 -0.969797 -0.0119702 1.55417 1 0 1 1 0 0 +EDGE2 1076 1015 -1.06066 -0.0173352 1.54049 1 0 1 1 0 0 +EDGE2 1076 1055 -1.04017 -0.0904978 1.60709 1 0 1 1 0 0 +EDGE2 1077 1076 -0.953819 -0.0469416 -0.0187363 1 0 1 1 0 0 +EDGE2 1078 1077 -1.00741 -0.0176012 -0.00939691 1 0 1 1 0 0 +EDGE2 1079 1078 -0.970195 0.0655073 -0.00972464 1 0 1 1 0 0 +EDGE2 1080 1079 -0.95435 -0.115668 0.00252989 1 0 1 1 0 0 +EDGE2 1081 1080 -1.00619 0.0802861 1.56939 1 0 1 1 0 0 +EDGE2 1082 1081 -0.991976 0.00579715 0.0144207 1 0 1 1 0 0 +EDGE2 1083 1082 -1.02915 0.0329474 0.021786 1 0 1 1 0 0 +EDGE2 1084 1083 -0.966243 0.00120752 0.00641523 1 0 1 1 0 0 +EDGE2 1084 1045 0.925997 0.00689346 -3.1576 1 0 1 1 0 0 +EDGE2 1085 1046 0.00757295 -1.08465 -1.55636 1 0 1 1 0 0 +EDGE2 1085 1084 -1.01483 -0.0268856 0.0062347 1 0 1 1 0 0 +EDGE2 1085 1045 -0.00146313 0.0442658 -3.16012 1 0 1 1 0 0 +EDGE2 1085 1044 0.958674 0.0153889 -3.1179 1 0 1 1 0 0 +EDGE2 1086 1045 -0.940156 0.0205519 1.56458 1 0 1 1 0 0 +EDGE2 1086 1085 -1.0009 -0.0227162 -1.60877 1 0 1 1 0 0 +EDGE2 1087 1086 -1.00951 0.0483465 0.0256346 1 0 1 1 0 0 +EDGE2 1088 1087 -0.90193 -0.00578616 -0.0288502 1 0 1 1 0 0 +EDGE2 1089 1088 -0.939811 -0.0128221 0.0235596 1 0 1 1 0 0 +EDGE2 1090 1089 -0.890474 -0.0401153 0.0212967 1 0 1 1 0 0 +EDGE2 1091 1090 -1.06638 -0.0649572 -1.54923 1 0 1 1 0 0 +EDGE2 1092 1091 -0.932372 -0.0543076 0.0145839 1 0 1 1 0 0 +EDGE2 1093 1092 -1.08019 0.0755822 -0.0150698 1 0 1 1 0 0 +EDGE2 1094 1093 -0.999189 0.0132399 -0.00329838 1 0 1 1 0 0 +EDGE2 1095 1094 -1.08372 0.0413435 -0.00791576 1 0 1 1 0 0 +EDGE2 1096 1095 -0.93381 -0.0412914 1.57155 1 0 1 1 0 0 +EDGE2 1097 1096 -0.99286 -0.0318585 0.0102865 1 0 1 1 0 0 +EDGE2 1098 1097 -0.996345 -0.0140266 0.00412922 1 0 1 1 0 0 +EDGE2 1099 1098 -0.977299 0.006911 0.000986264 1 0 1 1 0 0 +EDGE2 1100 1099 -1.09089 0.0650734 -0.0172227 1 0 1 1 0 0 +EDGE2 1101 1100 -0.962523 0.00753408 -1.52074 1 0 1 1 0 0 +EDGE2 1102 1101 -0.942763 -0.0555638 0.0157456 1 0 1 1 0 0 +EDGE2 1103 1102 -0.900352 -0.0163688 0.00843162 1 0 1 1 0 0 +EDGE2 1104 1103 -0.969199 0.0500178 0.00730102 1 0 1 1 0 0 +EDGE2 1105 1104 -1.03705 -0.0292763 -0.00959089 1 0 1 1 0 0 +EDGE2 1106 1105 -1.00182 0.0590847 -1.60646 1 0 1 1 0 0 +EDGE2 1107 1106 -1.04685 0.0368894 0.0165634 1 0 1 1 0 0 +EDGE2 1108 1107 -1.05095 0.0504131 -0.0204906 1 0 1 1 0 0 +EDGE2 1109 1108 -1.13039 -0.0312571 0.0293861 1 0 1 1 0 0 +EDGE2 1110 1109 -1.06438 -0.0689312 0.00499668 1 0 1 1 0 0 +EDGE2 1111 1110 -1.08188 0.0251012 -1.54218 1 0 1 1 0 0 +EDGE2 1112 1111 -1.00347 -0.0402016 -0.0173525 1 0 1 1 0 0 +EDGE2 1113 1112 -1.01692 -0.00174499 0.0448692 1 0 1 1 0 0 +EDGE2 1114 1113 -0.916426 -0.0770817 -0.00979002 1 0 1 1 0 0 +EDGE2 1114 1095 0.904907 0.0594226 -3.13393 1 0 1 1 0 0 +EDGE2 1115 1114 -1.01234 -0.0566104 -0.0309108 1 0 1 1 0 0 +EDGE2 1115 1095 0.0678551 -0.0146182 -3.15709 1 0 1 1 0 0 +EDGE2 1115 1094 1.05897 0.011605 -3.14302 1 0 1 1 0 0 +EDGE2 1115 1096 -0.0436361 0.960896 1.57953 1 0 1 1 0 0 +EDGE2 1116 1095 -0.938599 -0.0111146 1.59934 1 0 1 1 0 0 +EDGE2 1116 1115 -0.960169 0.0555473 -1.55733 1 0 1 1 0 0 +EDGE2 1116 1096 0.00537442 -0.0112035 0.0116015 1 0 1 1 0 0 +EDGE2 1116 1097 0.98613 -0.0542521 0.0156751 1 0 1 1 0 0 +EDGE2 1117 1116 -0.899864 -0.0289327 0.00198855 1 0 1 1 0 0 +EDGE2 1117 1096 -0.956105 -0.00509945 -0.00452015 1 0 1 1 0 0 +EDGE2 1117 1097 -0.0107355 0.0281841 0.000246855 1 0 1 1 0 0 +EDGE2 1117 1098 0.958747 -0.0840273 -0.00224167 1 0 1 1 0 0 +EDGE2 1118 1097 -0.959256 0.0485208 -0.0107393 1 0 1 1 0 0 +EDGE2 1118 1117 -0.981394 0.0233949 0.0234845 1 0 1 1 0 0 +EDGE2 1118 1098 0.0287857 0.0897 0.0376641 1 0 1 1 0 0 +EDGE2 1118 1099 0.895148 -0.0186909 -0.000892149 1 0 1 1 0 0 +EDGE2 1119 1118 -1.03106 0.0576954 0.00663081 1 0 1 1 0 0 +EDGE2 1119 1098 -1.02759 0.060341 0.0024341 1 0 1 1 0 0 +EDGE2 1119 1099 0.00570896 -0.00998899 -0.0317577 1 0 1 1 0 0 +EDGE2 1119 1100 1.06216 -0.0132563 0.038766 1 0 1 1 0 0 +EDGE2 1120 1099 -0.941444 -0.0663453 0.0219376 1 0 1 1 0 0 +EDGE2 1120 1119 -0.982529 0.041566 -0.00882843 1 0 1 1 0 0 +EDGE2 1120 1101 -0.00967019 1.03787 1.57966 1 0 1 1 0 0 +EDGE2 1120 1100 0.010995 0.0328634 -0.000733859 1 0 1 1 0 0 +EDGE2 1121 1102 1.04731 0.0139407 0.0028396 1 0 1 1 0 0 +EDGE2 1121 1101 0.0403751 0.0868196 0.0334372 1 0 1 1 0 0 +EDGE2 1121 1100 -0.968349 0.0376719 -1.58944 1 0 1 1 0 0 +EDGE2 1121 1120 -0.937387 0.0610169 -1.53881 1 0 1 1 0 0 +EDGE2 1122 1103 0.984597 -0.0141061 -0.0155566 1 0 1 1 0 0 +EDGE2 1122 1102 -0.0656816 -0.0391292 -0.0166919 1 0 1 1 0 0 +EDGE2 1122 1121 -0.94126 -0.0620068 0.0193185 1 0 1 1 0 0 +EDGE2 1122 1101 -1.0601 -0.0376588 -0.0141013 1 0 1 1 0 0 +EDGE2 1123 1104 1.04563 -0.040886 -0.000174131 1 0 1 1 0 0 +EDGE2 1123 1103 -0.0747477 -0.0734481 -0.00352109 1 0 1 1 0 0 +EDGE2 1123 1102 -1.04989 0.0583185 -0.00827815 1 0 1 1 0 0 +EDGE2 1123 1122 -0.933512 -0.0319038 -0.0125581 1 0 1 1 0 0 +EDGE2 1124 1123 -1.0277 0.0131069 -0.0282939 1 0 1 1 0 0 +EDGE2 1124 1105 1.00733 -0.0385507 0.0030704 1 0 1 1 0 0 +EDGE2 1124 1104 -0.0609983 -0.0543834 0.0156172 1 0 1 1 0 0 +EDGE2 1124 1103 -0.939783 -0.0381441 0.00549783 1 0 1 1 0 0 +EDGE2 1125 1106 0.0533246 0.949666 1.53388 1 0 1 1 0 0 +EDGE2 1125 1105 -0.000909019 0.020346 -0.0081364 1 0 1 1 0 0 +EDGE2 1125 1124 -1.01675 -0.0508575 -0.00752841 1 0 1 1 0 0 +EDGE2 1125 1104 -0.972817 -0.0465531 -0.00787353 1 0 1 1 0 0 +EDGE2 1126 1107 0.990879 0.0624939 0.0163638 1 0 1 1 0 0 +EDGE2 1126 1106 -0.0059113 -0.00590377 -0.022228 1 0 1 1 0 0 +EDGE2 1126 1105 -1.04759 -0.00277056 -1.57909 1 0 1 1 0 0 +EDGE2 1126 1125 -1.02548 0.0183902 -1.59843 1 0 1 1 0 0 +EDGE2 1127 1108 0.98522 0.0225679 0.0150926 1 0 1 1 0 0 +EDGE2 1127 1107 0.0297758 -0.0492515 -0.0247646 1 0 1 1 0 0 +EDGE2 1127 1126 -1.00823 0.139134 0.0148505 1 0 1 1 0 0 +EDGE2 1127 1106 -1.0692 -0.086646 0.0209877 1 0 1 1 0 0 +EDGE2 1128 1109 1.06805 -0.0282627 -0.0325225 1 0 1 1 0 0 +EDGE2 1128 1108 0.0544371 -0.0610827 0.0070346 1 0 1 1 0 0 +EDGE2 1128 1127 -0.92346 -0.0604935 -0.0138185 1 0 1 1 0 0 +EDGE2 1128 1107 -0.971294 0.0915143 0.013429 1 0 1 1 0 0 +EDGE2 1129 1110 1.03073 -0.0183164 -0.0192939 1 0 1 1 0 0 +EDGE2 1129 1109 -0.0159029 -0.0319165 0.00507987 1 0 1 1 0 0 +EDGE2 1129 1108 -1.00041 0.0563966 0.0355999 1 0 1 1 0 0 +EDGE2 1129 1128 -0.934468 -0.0163853 0.0344368 1 0 1 1 0 0 +EDGE2 1130 1110 0.114614 -0.00269332 0.0159919 1 0 1 1 0 0 +EDGE2 1130 1109 -1.04185 0.0202654 -0.0137773 1 0 1 1 0 0 +EDGE2 1130 1129 -0.978438 -0.044332 0.0050958 1 0 1 1 0 0 +EDGE2 1130 1111 0.0169614 1.02539 1.57949 1 0 1 1 0 0 +EDGE2 1131 1130 -0.967118 0.054647 -1.59435 1 0 1 1 0 0 +EDGE2 1131 1110 -0.96811 0.0116541 -1.59074 1 0 1 1 0 0 +EDGE2 1131 1111 -0.104431 0.0556877 0.00550616 1 0 1 1 0 0 +EDGE2 1131 1112 0.942067 0.0533407 -0.0039136 1 0 1 1 0 0 +EDGE2 1132 1111 -0.958164 0.0106155 -0.0224248 1 0 1 1 0 0 +EDGE2 1132 1131 -0.982379 0.0147166 -0.0135633 1 0 1 1 0 0 +EDGE2 1132 1112 0.042345 -0.00703821 -0.0533274 1 0 1 1 0 0 +EDGE2 1132 1113 1.06075 -0.0623827 -0.00515848 1 0 1 1 0 0 +EDGE2 1133 1112 -0.965263 -0.0373211 -0.015154 1 0 1 1 0 0 +EDGE2 1133 1132 -1.11163 -0.057891 -0.0075378 1 0 1 1 0 0 +EDGE2 1133 1113 0.0854185 -0.00834304 -0.00548103 1 0 1 1 0 0 +EDGE2 1133 1114 0.973353 -0.0280031 -0.00578557 1 0 1 1 0 0 +EDGE2 1134 1133 -1.0045 -0.0892585 -7.38604e-05 1 0 1 1 0 0 +EDGE2 1134 1113 -0.994537 0.0161688 0.0103343 1 0 1 1 0 0 +EDGE2 1134 1114 -0.0402821 -0.0262729 -0.00405525 1 0 1 1 0 0 +EDGE2 1134 1095 1.09525 0.00768595 -3.12552 1 0 1 1 0 0 +EDGE2 1134 1115 0.945602 0.0161562 -0.0655984 1 0 1 1 0 0 +EDGE2 1135 1134 -0.998892 0.00315411 0.0395276 1 0 1 1 0 0 +EDGE2 1135 1114 -0.997456 -0.0333468 -0.0450835 1 0 1 1 0 0 +EDGE2 1135 1095 0.0218115 -0.0729437 -3.15331 1 0 1 1 0 0 +EDGE2 1135 1115 -0.00535582 -0.0797579 -0.0376224 1 0 1 1 0 0 +EDGE2 1135 1094 0.985647 -0.0558872 -3.16933 1 0 1 1 0 0 +EDGE2 1135 1116 -0.0501301 0.971369 1.54113 1 0 1 1 0 0 +EDGE2 1135 1096 -0.04338 1.12124 1.56927 1 0 1 1 0 0 +EDGE2 1136 1095 -0.953979 0.0715125 1.58752 1 0 1 1 0 0 +EDGE2 1136 1115 -1.01397 -0.00467143 -1.58356 1 0 1 1 0 0 +EDGE2 1136 1135 -0.936159 -0.146096 -1.566 1 0 1 1 0 0 +EDGE2 1136 1116 0.0124607 0.0237998 -0.0071446 1 0 1 1 0 0 +EDGE2 1136 1096 0.0236016 -0.047047 0.0164513 1 0 1 1 0 0 +EDGE2 1136 1097 1.02805 -0.0575251 0.0235607 1 0 1 1 0 0 +EDGE2 1136 1117 1.09779 0.0376695 0.0109181 1 0 1 1 0 0 +EDGE2 1137 1118 1.06494 -0.014291 -0.0154031 1 0 1 1 0 0 +EDGE2 1137 1116 -1.0518 0.118192 0.0119549 1 0 1 1 0 0 +EDGE2 1137 1136 -0.975092 -0.0122212 -0.0105867 1 0 1 1 0 0 +EDGE2 1137 1096 -0.909883 -0.00169648 0.0172481 1 0 1 1 0 0 +EDGE2 1137 1097 0.0585994 0.0587597 -0.0297018 1 0 1 1 0 0 +EDGE2 1137 1117 0.0422932 -0.0452762 0.0069081 1 0 1 1 0 0 +EDGE2 1137 1098 1.07114 0.0727465 -0.000641124 1 0 1 1 0 0 +EDGE2 1138 1118 0.052475 0.0462268 -0.0219227 1 0 1 1 0 0 +EDGE2 1138 1097 -1.03404 0.0164157 -0.0284605 1 0 1 1 0 0 +EDGE2 1138 1137 -1.00867 -0.0391411 0.0109278 1 0 1 1 0 0 +EDGE2 1138 1117 -0.967355 0.0243253 -0.00379572 1 0 1 1 0 0 +EDGE2 1138 1098 0.0571055 0.0445796 0.0487149 1 0 1 1 0 0 +EDGE2 1138 1099 1.15181 -0.0162817 -0.00785981 1 0 1 1 0 0 +EDGE2 1138 1119 1.01084 -0.0244254 0.0293256 1 0 1 1 0 0 +EDGE2 1139 1118 -0.979962 -0.0596953 -0.00317481 1 0 1 1 0 0 +EDGE2 1139 1138 -1.0352 -0.0262567 0.00471076 1 0 1 1 0 0 +EDGE2 1139 1098 -1.1149 -0.0486301 0.00201304 1 0 1 1 0 0 +EDGE2 1139 1099 0.0423651 0.00389615 -0.0103157 1 0 1 1 0 0 +EDGE2 1139 1119 0.0267836 0.0514633 0.04317 1 0 1 1 0 0 +EDGE2 1139 1100 1.04958 -0.0300106 -0.0139576 1 0 1 1 0 0 +EDGE2 1139 1120 0.988692 0.098354 -0.00977337 1 0 1 1 0 0 +EDGE2 1140 1139 -0.995305 -0.0231821 -0.00527266 1 0 1 1 0 0 +EDGE2 1140 1099 -1.00226 -0.0927439 0.046111 1 0 1 1 0 0 +EDGE2 1140 1119 -0.95422 0.0621168 -0.014994 1 0 1 1 0 0 +EDGE2 1140 1121 -0.0558501 1.02332 1.59293 1 0 1 1 0 0 +EDGE2 1140 1101 -0.0180109 1.02577 1.5811 1 0 1 1 0 0 +EDGE2 1140 1100 -0.0164563 0.0403747 -0.0208042 1 0 1 1 0 0 +EDGE2 1140 1120 0.0443951 0.0592597 0.0307267 1 0 1 1 0 0 +EDGE2 1141 1102 0.961819 -0.0485854 -0.0411943 1 0 1 1 0 0 +EDGE2 1141 1122 1.04513 0.0312578 0.0201538 1 0 1 1 0 0 +EDGE2 1141 1121 -0.0658714 -0.0134749 0.0146594 1 0 1 1 0 0 +EDGE2 1141 1101 0.0798558 -0.0957195 -0.0320866 1 0 1 1 0 0 +EDGE2 1141 1100 -0.947437 -0.0358329 -1.62187 1 0 1 1 0 0 +EDGE2 1141 1140 -0.955745 0.0191591 -1.55392 1 0 1 1 0 0 +EDGE2 1141 1120 -0.92955 0.0192999 -1.55355 1 0 1 1 0 0 +EDGE2 1142 1123 1.02284 -0.0044966 -0.0460331 1 0 1 1 0 0 +EDGE2 1142 1103 0.97679 0.0789935 0.00634502 1 0 1 1 0 0 +EDGE2 1142 1102 0.0445142 -0.00295541 -0.0174022 1 0 1 1 0 0 +EDGE2 1142 1122 0.046706 -0.0471623 0.00777693 1 0 1 1 0 0 +EDGE2 1142 1121 -0.972523 0.0309401 -0.00242604 1 0 1 1 0 0 +EDGE2 1142 1141 -0.997398 0.0365095 -0.0117278 1 0 1 1 0 0 +EDGE2 1142 1101 -0.983383 0.118003 -0.00741169 1 0 1 1 0 0 +EDGE2 1143 1123 0.00748795 -0.046983 -0.0500494 1 0 1 1 0 0 +EDGE2 1143 1124 0.975119 0.0319138 0.0297646 1 0 1 1 0 0 +EDGE2 1143 1104 1.02282 -0.0320891 0.0160785 1 0 1 1 0 0 +EDGE2 1143 1103 0.00759767 -0.0275952 0.00981467 1 0 1 1 0 0 +EDGE2 1143 1102 -1.01927 0.00995095 0.00345524 1 0 1 1 0 0 +EDGE2 1143 1122 -0.994554 0.0468118 0.00716385 1 0 1 1 0 0 +EDGE2 1143 1142 -0.828525 -0.0382348 -0.0391907 1 0 1 1 0 0 +EDGE2 1144 1123 -1.02518 -0.0308602 -0.0343565 1 0 1 1 0 0 +EDGE2 1144 1105 0.945741 -0.0366624 0.00505111 1 0 1 1 0 0 +EDGE2 1144 1125 0.953029 -0.0326472 0.00117005 1 0 1 1 0 0 +EDGE2 1144 1124 -0.00988499 -0.116513 0.042657 1 0 1 1 0 0 +EDGE2 1144 1104 -0.0381126 -0.0107413 -0.0286765 1 0 1 1 0 0 +EDGE2 1144 1143 -0.982086 0.032428 -0.0145175 1 0 1 1 0 0 +EDGE2 1144 1103 -0.983652 0.0964151 0.000569466 1 0 1 1 0 0 +EDGE2 1145 1126 0.0334788 1.04603 1.58857 1 0 1 1 0 0 +EDGE2 1145 1106 -0.0826138 1.00375 1.57188 1 0 1 1 0 0 +EDGE2 1145 1105 -0.0365954 -0.0395735 4.387e-05 1 0 1 1 0 0 +EDGE2 1145 1125 -0.00421179 0.0697895 -0.000518276 1 0 1 1 0 0 +EDGE2 1145 1124 -0.968306 -0.0292691 -0.00508092 1 0 1 1 0 0 +EDGE2 1145 1144 -1.05295 -0.0253353 0.00473972 1 0 1 1 0 0 +EDGE2 1145 1104 -1.06469 -0.0438224 0.0164499 1 0 1 1 0 0 +EDGE2 1146 1127 0.974166 -0.00544734 0.00819975 1 0 1 1 0 0 +EDGE2 1146 1107 1.08282 0.00688928 -0.00561674 1 0 1 1 0 0 +EDGE2 1146 1126 -0.141504 -0.0418489 -0.0100605 1 0 1 1 0 0 +EDGE2 1146 1106 -0.0409138 -0.0560976 -0.0226649 1 0 1 1 0 0 +EDGE2 1146 1145 -0.911352 -0.09971 -1.58671 1 0 1 1 0 0 +EDGE2 1146 1105 -0.995959 0.0259286 -1.54314 1 0 1 1 0 0 +EDGE2 1146 1125 -0.962222 -0.0422354 -1.57573 1 0 1 1 0 0 +EDGE2 1147 1108 1.00333 0.00185959 0.00394245 1 0 1 1 0 0 +EDGE2 1147 1128 1.00331 -0.0167775 -0.0251704 1 0 1 1 0 0 +EDGE2 1147 1127 0.0285959 -0.0272884 -0.00528847 1 0 1 1 0 0 +EDGE2 1147 1107 -0.0194978 -0.0468263 0.0313715 1 0 1 1 0 0 +EDGE2 1147 1126 -1.03441 0.0312463 0.0170705 1 0 1 1 0 0 +EDGE2 1147 1146 -0.998958 -0.00167786 -0.0207311 1 0 1 1 0 0 +EDGE2 1147 1106 -1.0699 -0.0228176 -0.0138508 1 0 1 1 0 0 +EDGE2 1148 1109 1.03301 -0.00187769 0.02301 1 0 1 1 0 0 +EDGE2 1148 1129 0.901649 -0.0105334 -0.0251669 1 0 1 1 0 0 +EDGE2 1148 1108 -0.0555722 0.061161 0.00770113 1 0 1 1 0 0 +EDGE2 1148 1128 0.0784912 -0.0286635 0.00728633 1 0 1 1 0 0 +EDGE2 1148 1127 -1.02563 -0.00919771 0.00581445 1 0 1 1 0 0 +EDGE2 1148 1147 -0.935956 -0.0125124 0.0167638 1 0 1 1 0 0 +EDGE2 1148 1107 -0.988979 -0.0109133 0.0073717 1 0 1 1 0 0 +EDGE2 1149 1130 0.917824 -0.101376 0.00353755 1 0 1 1 0 0 +EDGE2 1149 1110 1.00166 0.0429431 -0.00694487 1 0 1 1 0 0 +EDGE2 1149 1109 -0.00117271 -0.000408451 -0.00453138 1 0 1 1 0 0 +EDGE2 1149 1129 0.0793386 -0.0316723 -0.0225647 1 0 1 1 0 0 +EDGE2 1149 1108 -0.985413 0.0342451 0.0351939 1 0 1 1 0 0 +EDGE2 1149 1128 -0.943183 0.0350964 -0.000225397 1 0 1 1 0 0 +EDGE2 1149 1148 -0.98653 0.0407083 -0.0153286 1 0 1 1 0 0 +EDGE2 1150 1130 -0.0260927 0.0878647 0.0109656 1 0 1 1 0 0 +EDGE2 1150 1110 0.0621785 -0.0589143 -0.0102605 1 0 1 1 0 0 +EDGE2 1150 1109 -1.03074 -0.0274325 0.00528673 1 0 1 1 0 0 +EDGE2 1150 1149 -1.03558 0.0180899 0.0241275 1 0 1 1 0 0 +EDGE2 1150 1129 -0.945725 -0.0547425 0.0134435 1 0 1 1 0 0 +EDGE2 1150 1111 0.0164758 1.05754 1.58216 1 0 1 1 0 0 +EDGE2 1150 1131 0.00149604 1.02204 1.56605 1 0 1 1 0 0 +EDGE2 1151 1130 -0.935446 -0.090309 1.543 1 0 1 1 0 0 +EDGE2 1151 1150 -1.08751 0.033144 1.56367 1 0 1 1 0 0 +EDGE2 1151 1110 -0.989272 0.0496541 1.56165 1 0 1 1 0 0 +EDGE2 1152 1151 -1.01847 -0.0362935 0.0226516 1 0 1 1 0 0 +EDGE2 1153 1152 -0.944532 0.138298 -0.00930584 1 0 1 1 0 0 +EDGE2 1154 1153 -0.885656 0.0618073 0.0141498 1 0 1 1 0 0 +EDGE2 1155 1154 -1.06447 -0.0301065 0.0260712 1 0 1 1 0 0 +EDGE2 1156 1155 -0.989886 -0.000214804 -1.55924 1 0 1 1 0 0 +EDGE2 1157 1156 -0.952207 0.00794755 -0.0151497 1 0 1 1 0 0 +EDGE2 1158 1157 -1.01724 -0.0452767 -0.0013415 1 0 1 1 0 0 +EDGE2 1159 900 1.01413 -0.0177949 -3.1286 1 0 1 1 0 0 +EDGE2 1159 840 0.986091 0.0260455 -3.16043 1 0 1 1 0 0 +EDGE2 1159 860 1.01127 0.0667956 -3.15888 1 0 1 1 0 0 +EDGE2 1159 1158 -0.997074 -0.00174962 0.00149081 1 0 1 1 0 0 +EDGE2 1160 839 0.973052 -0.0733101 -3.16261 1 0 1 1 0 0 +EDGE2 1160 899 0.93159 -0.0774525 -3.16865 1 0 1 1 0 0 +EDGE2 1160 859 0.920994 -0.0772195 -3.1515 1 0 1 1 0 0 +EDGE2 1160 841 -0.0324181 -0.961249 -1.55918 1 0 1 1 0 0 +EDGE2 1160 901 -0.00560131 -1.06051 -1.60354 1 0 1 1 0 0 +EDGE2 1160 861 -0.0312958 -0.995227 -1.57253 1 0 1 1 0 0 +EDGE2 1160 900 -0.0587365 0.0175844 -3.14348 1 0 1 1 0 0 +EDGE2 1160 840 -0.00897391 0.00332706 -3.11991 1 0 1 1 0 0 +EDGE2 1160 860 0.0167241 0.0547583 -3.13381 1 0 1 1 0 0 +EDGE2 1160 1159 -0.957164 0.00634945 -0.0438004 1 0 1 1 0 0 +EDGE2 1161 1160 -0.9034 0.136301 -1.56042 1 0 1 1 0 0 +EDGE2 1161 900 -0.950853 -0.0367001 1.54832 1 0 1 1 0 0 +EDGE2 1161 840 -0.966451 -0.0751241 1.56938 1 0 1 1 0 0 +EDGE2 1161 860 -0.98613 0.0273921 1.55659 1 0 1 1 0 0 +EDGE2 1162 1161 -1.02054 -0.0704776 0.0320188 1 0 1 1 0 0 +EDGE2 1163 1162 -1.05178 0.0418089 -0.00974198 1 0 1 1 0 0 +EDGE2 1164 1163 -1.03208 0.0349261 -0.0255557 1 0 1 1 0 0 +EDGE2 1165 1164 -0.983886 0.00220235 -0.00340825 1 0 1 1 0 0 +EDGE2 1166 1165 -1.04362 0.00884145 -1.56146 1 0 1 1 0 0 +EDGE2 1167 1166 -1.07066 -0.132083 -0.00552904 1 0 1 1 0 0 +EDGE2 1168 1167 -1.02015 -0.0304837 -0.0402924 1 0 1 1 0 0 +EDGE2 1169 1168 -1.02061 -0.078227 0.016502 1 0 1 1 0 0 +EDGE2 1169 1130 0.976149 -0.0561336 -3.1346 1 0 1 1 0 0 +EDGE2 1169 1150 1.00725 -0.00282408 -3.11643 1 0 1 1 0 0 +EDGE2 1169 1110 1.06385 0.104699 -3.129 1 0 1 1 0 0 +EDGE2 1170 1169 -1.01062 0.0381148 -0.0203573 1 0 1 1 0 0 +EDGE2 1170 1151 -0.0237317 1.03592 1.56764 1 0 1 1 0 0 +EDGE2 1170 1130 -0.0154803 0.00909483 -3.09945 1 0 1 1 0 0 +EDGE2 1170 1150 0.0277993 -0.0839234 -3.10681 1 0 1 1 0 0 +EDGE2 1170 1110 -0.00810487 -0.0307529 -3.16153 1 0 1 1 0 0 +EDGE2 1170 1109 0.939869 0.0807409 -3.14535 1 0 1 1 0 0 +EDGE2 1170 1149 0.947936 -0.0153382 -3.14829 1 0 1 1 0 0 +EDGE2 1170 1129 0.972968 -0.0378912 -3.12937 1 0 1 1 0 0 +EDGE2 1170 1111 -0.106065 -0.985363 -1.54482 1 0 1 1 0 0 +EDGE2 1170 1131 0.0867664 -0.956417 -1.56366 1 0 1 1 0 0 +EDGE2 1171 1152 0.9629 0.0298285 0.0513896 1 0 1 1 0 0 +EDGE2 1171 1151 -0.0414483 -0.00493765 0.0100949 1 0 1 1 0 0 +EDGE2 1171 1130 -0.937818 0.0113792 1.5828 1 0 1 1 0 0 +EDGE2 1171 1170 -1.05293 -0.050294 -1.60427 1 0 1 1 0 0 +EDGE2 1171 1150 -0.998687 -0.0131952 1.54897 1 0 1 1 0 0 +EDGE2 1171 1110 -1.05142 -0.0266488 1.58009 1 0 1 1 0 0 +EDGE2 1172 1153 1.0211 0.119291 0.0197522 1 0 1 1 0 0 +EDGE2 1172 1152 0.0598601 -0.0845316 0.0326005 1 0 1 1 0 0 +EDGE2 1172 1151 -1.0593 0.0317344 0.02046 1 0 1 1 0 0 +EDGE2 1172 1171 -1.05201 0.0847665 0.0259405 1 0 1 1 0 0 +EDGE2 1173 1154 0.954801 0.0449158 0.0158666 1 0 1 1 0 0 +EDGE2 1173 1153 0.00725146 0.0512952 0.0490788 1 0 1 1 0 0 +EDGE2 1173 1152 -0.893592 -0.0279991 0.00920244 1 0 1 1 0 0 +EDGE2 1173 1172 -1.0745 -0.0213327 -0.0360335 1 0 1 1 0 0 +EDGE2 1174 1173 -0.941029 0.00496247 -0.0445802 1 0 1 1 0 0 +EDGE2 1174 1155 1.03461 -0.00703766 -0.00553743 1 0 1 1 0 0 +EDGE2 1174 1154 0.047561 -0.0220463 0.0437265 1 0 1 1 0 0 +EDGE2 1174 1153 -0.981975 0.0288135 0.0181515 1 0 1 1 0 0 +EDGE2 1175 1156 0.0253885 1.00848 1.55247 1 0 1 1 0 0 +EDGE2 1175 1174 -1.06249 0.0309059 -0.0291859 1 0 1 1 0 0 +EDGE2 1175 1155 -0.0578378 0.0562336 -0.00754014 1 0 1 1 0 0 +EDGE2 1175 1154 -1.02248 0.0415008 -0.0172865 1 0 1 1 0 0 +EDGE2 1176 1157 0.983907 0.0194257 -0.012758 1 0 1 1 0 0 +EDGE2 1176 1156 0.0426759 -0.0494849 0.0248235 1 0 1 1 0 0 +EDGE2 1176 1175 -1.04867 0.00363956 -1.57506 1 0 1 1 0 0 +EDGE2 1176 1155 -1.06511 0.0198954 -1.53018 1 0 1 1 0 0 +EDGE2 1177 1158 1.0296 0.025894 0.0141262 1 0 1 1 0 0 +EDGE2 1177 1157 -0.028461 -0.0208609 0.00549574 1 0 1 1 0 0 +EDGE2 1177 1156 -0.913245 -0.0498746 0.00879702 1 0 1 1 0 0 +EDGE2 1177 1176 -1.00917 -0.0530424 -0.0144272 1 0 1 1 0 0 +EDGE2 1178 1159 1.10603 -0.0291 0.0187053 1 0 1 1 0 0 +EDGE2 1178 1158 0.026756 0.085763 -0.0295126 1 0 1 1 0 0 +EDGE2 1178 1177 -1.0676 0.0135854 -0.0178677 1 0 1 1 0 0 +EDGE2 1178 1157 -0.950283 0.0391696 -0.00280985 1 0 1 1 0 0 +EDGE2 1179 1160 0.966625 0.000734832 0.00478651 1 0 1 1 0 0 +EDGE2 1179 900 1.01962 -0.0485612 -3.1255 1 0 1 1 0 0 +EDGE2 1179 840 0.915552 -0.042012 -3.13125 1 0 1 1 0 0 +EDGE2 1179 860 0.99725 -0.0157316 -3.11923 1 0 1 1 0 0 +EDGE2 1179 1159 0.03008 0.0085912 -0.00554991 1 0 1 1 0 0 +EDGE2 1179 1178 -0.9353 0.00269256 0.0103557 1 0 1 1 0 0 +EDGE2 1179 1158 -1.00242 -0.038264 0.00127076 1 0 1 1 0 0 +EDGE2 1180 839 1.02596 -0.0218697 -3.13803 1 0 1 1 0 0 +EDGE2 1180 899 0.996102 -0.0551352 -3.14231 1 0 1 1 0 0 +EDGE2 1180 859 1.08836 -0.00318179 -3.12634 1 0 1 1 0 0 +EDGE2 1180 841 0.0216079 -0.913477 -1.54908 1 0 1 1 0 0 +EDGE2 1180 901 0.0107484 -0.966706 -1.56175 1 0 1 1 0 0 +EDGE2 1180 861 0.0311548 -0.984023 -1.55822 1 0 1 1 0 0 +EDGE2 1180 1160 -0.0126647 0.0024199 -0.0240405 1 0 1 1 0 0 +EDGE2 1180 900 0.0265312 -0.0563831 -3.16637 1 0 1 1 0 0 +EDGE2 1180 840 0.00861778 -0.0376559 -3.12108 1 0 1 1 0 0 +EDGE2 1180 860 0.0130697 -0.0962347 -3.13532 1 0 1 1 0 0 +EDGE2 1180 1161 0.0105248 1.05172 1.59752 1 0 1 1 0 0 +EDGE2 1180 1179 -1.01284 0.0538025 -0.0191527 1 0 1 1 0 0 +EDGE2 1180 1159 -0.959491 0.0596703 3.09844e-05 1 0 1 1 0 0 +EDGE2 1181 1160 -0.992061 -0.0548079 -1.5963 1 0 1 1 0 0 +EDGE2 1181 1180 -0.993269 0.0620203 -1.57942 1 0 1 1 0 0 +EDGE2 1181 900 -1.05407 -0.0289274 1.5577 1 0 1 1 0 0 +EDGE2 1181 840 -1.02324 0.0316341 1.54427 1 0 1 1 0 0 +EDGE2 1181 860 -1.02422 -0.0276308 1.60146 1 0 1 1 0 0 +EDGE2 1181 1161 -0.00990439 -0.0398719 -0.00996934 1 0 1 1 0 0 +EDGE2 1181 1162 1.01134 0.0335108 -0.0401446 1 0 1 1 0 0 +EDGE2 1182 1161 -0.935989 0.0357373 -0.029858 1 0 1 1 0 0 +EDGE2 1182 1181 -1.0337 -0.0575098 0.0266432 1 0 1 1 0 0 +EDGE2 1182 1162 -0.0565809 -0.0357298 -0.0409714 1 0 1 1 0 0 +EDGE2 1182 1163 1.0498 0.0809028 0.030922 1 0 1 1 0 0 +EDGE2 1183 1182 -0.988086 -0.0687255 -0.0209661 1 0 1 1 0 0 +EDGE2 1183 1162 -0.964942 -0.00085728 -0.0294386 1 0 1 1 0 0 +EDGE2 1183 1163 -0.0489278 -0.0508442 -0.017419 1 0 1 1 0 0 +EDGE2 1183 1164 0.947178 0.129591 -0.0307669 1 0 1 1 0 0 +EDGE2 1184 1163 -1.03525 -0.0510436 0.0119566 1 0 1 1 0 0 +EDGE2 1184 1183 -1.02579 -0.0378332 -0.0043413 1 0 1 1 0 0 +EDGE2 1184 1164 -0.0809172 0.12598 0.00257861 1 0 1 1 0 0 +EDGE2 1184 1165 1.00424 0.03471 -0.0281595 1 0 1 1 0 0 +EDGE2 1185 1184 -1.01964 0.0766591 -0.0050879 1 0 1 1 0 0 +EDGE2 1185 1164 -1.01683 0.0935253 -0.0323153 1 0 1 1 0 0 +EDGE2 1185 1165 0.0399324 -0.0638178 -0.00409528 1 0 1 1 0 0 +EDGE2 1185 1166 0.0267349 1.0037 1.55084 1 0 1 1 0 0 +EDGE2 1186 1185 -1.07325 0.0190383 -1.58055 1 0 1 1 0 0 +EDGE2 1186 1165 -0.897757 0.0139123 -1.54629 1 0 1 1 0 0 +EDGE2 1186 1166 0.0258285 -0.0167329 -0.000499041 1 0 1 1 0 0 +EDGE2 1186 1167 1.01235 0.054555 -0.00569283 1 0 1 1 0 0 +EDGE2 1187 1166 -0.983836 0.0406202 -0.000452344 1 0 1 1 0 0 +EDGE2 1187 1186 -0.976948 0.00826114 -0.016337 1 0 1 1 0 0 +EDGE2 1187 1167 0.0402373 0.00786856 0.00970219 1 0 1 1 0 0 +EDGE2 1187 1168 1.05703 0.0375864 0.00715448 1 0 1 1 0 0 +EDGE2 1188 1187 -1.08454 0.0197491 -0.0212402 1 0 1 1 0 0 +EDGE2 1188 1167 -1.01992 -0.0217607 -0.00337316 1 0 1 1 0 0 +EDGE2 1188 1168 0.0469766 -0.0311505 -0.00145998 1 0 1 1 0 0 +EDGE2 1188 1169 0.967318 0.0350832 -0.00892937 1 0 1 1 0 0 +EDGE2 1189 1188 -0.911109 -0.0527827 0.0137447 1 0 1 1 0 0 +EDGE2 1189 1168 -1.08612 -0.00707714 -0.0296185 1 0 1 1 0 0 +EDGE2 1189 1169 0.00498313 0.0316683 0.00129932 1 0 1 1 0 0 +EDGE2 1189 1130 0.940894 0.00345189 -3.11653 1 0 1 1 0 0 +EDGE2 1189 1170 1.0476 0.0736472 -0.0253732 1 0 1 1 0 0 +EDGE2 1189 1150 1.0483 -0.0136015 -3.16193 1 0 1 1 0 0 +EDGE2 1189 1110 1.0385 -0.00136009 -3.16746 1 0 1 1 0 0 +EDGE2 1190 1189 -1.03323 0.0547432 -0.0244021 1 0 1 1 0 0 +EDGE2 1190 1169 -1.00452 -0.0564465 0.00679477 1 0 1 1 0 0 +EDGE2 1190 1151 0.0604921 0.969632 1.59272 1 0 1 1 0 0 +EDGE2 1190 1171 0.0786549 1.05256 1.56644 1 0 1 1 0 0 +EDGE2 1190 1130 -0.0592529 0.00284728 -3.15801 1 0 1 1 0 0 +EDGE2 1190 1170 0.0723414 0.064608 0.00537523 1 0 1 1 0 0 +EDGE2 1190 1150 -0.0159348 0.00484851 -3.11839 1 0 1 1 0 0 +EDGE2 1190 1110 -0.0251869 0.0694775 -3.11774 1 0 1 1 0 0 +EDGE2 1190 1109 0.949958 0.088525 -3.1297 1 0 1 1 0 0 +EDGE2 1190 1149 1.00463 0.0647463 -3.16381 1 0 1 1 0 0 +EDGE2 1190 1129 0.95677 0.0573307 -3.13676 1 0 1 1 0 0 +EDGE2 1190 1111 0.0579658 -0.974121 -1.58141 1 0 1 1 0 0 +EDGE2 1190 1131 -0.013744 -0.959332 -1.57747 1 0 1 1 0 0 +EDGE2 1191 1152 0.988929 0.0971558 0.0167982 1 0 1 1 0 0 +EDGE2 1191 1172 0.932422 0.0635644 0.0130379 1 0 1 1 0 0 +EDGE2 1191 1151 0.0260974 0.0628829 -0.0141727 1 0 1 1 0 0 +EDGE2 1191 1171 -0.0088031 0.0729026 0.0109698 1 0 1 1 0 0 +EDGE2 1191 1130 -0.925192 0.033735 1.59697 1 0 1 1 0 0 +EDGE2 1191 1170 -0.946602 0.120641 -1.59062 1 0 1 1 0 0 +EDGE2 1191 1190 -0.979563 0.0344444 -1.57514 1 0 1 1 0 0 +EDGE2 1191 1150 -1.07797 0.0060621 1.5555 1 0 1 1 0 0 +EDGE2 1191 1110 -0.955038 0.0129174 1.57363 1 0 1 1 0 0 +EDGE2 1192 1173 0.872405 0.00799994 0.0227604 1 0 1 1 0 0 +EDGE2 1192 1153 0.97703 0.0497198 0.00388377 1 0 1 1 0 0 +EDGE2 1192 1152 -0.0349921 0.042559 -0.0170964 1 0 1 1 0 0 +EDGE2 1192 1172 -0.0525162 0.0168091 -0.0264719 1 0 1 1 0 0 +EDGE2 1192 1151 -1.01136 -0.00143342 -0.00358625 1 0 1 1 0 0 +EDGE2 1192 1191 -0.942077 0.0121125 0.000868138 1 0 1 1 0 0 +EDGE2 1192 1171 -1.01687 -0.0164469 0.01289 1 0 1 1 0 0 +EDGE2 1193 1173 -0.0581385 0.0214059 -0.0210999 1 0 1 1 0 0 +EDGE2 1193 1174 0.926347 -0.0192864 0.0259249 1 0 1 1 0 0 +EDGE2 1193 1154 0.930362 0.0520672 0.0152572 1 0 1 1 0 0 +EDGE2 1193 1153 -0.0283735 0.0114813 -0.00433252 1 0 1 1 0 0 +EDGE2 1193 1152 -0.937444 0.0239704 -0.0151644 1 0 1 1 0 0 +EDGE2 1193 1172 -0.96191 0.0705472 0.00319657 1 0 1 1 0 0 +EDGE2 1193 1192 -1.00802 -0.0578941 -0.0701231 1 0 1 1 0 0 +EDGE2 1194 1173 -1.00103 -0.0138098 -0.0284055 1 0 1 1 0 0 +EDGE2 1194 1174 0.00719316 0.0157824 0.0212927 1 0 1 1 0 0 +EDGE2 1194 1175 0.952063 0.0440049 0.0110513 1 0 1 1 0 0 +EDGE2 1194 1155 1.01557 0.02606 0.0502831 1 0 1 1 0 0 +EDGE2 1194 1154 0.0660777 0.0341599 -0.0194771 1 0 1 1 0 0 +EDGE2 1194 1193 -0.930811 -0.00630328 0.00775914 1 0 1 1 0 0 +EDGE2 1194 1153 -0.9115 -0.0123546 0.00301687 1 0 1 1 0 0 +EDGE2 1195 1156 -0.00985799 0.978909 1.57683 1 0 1 1 0 0 +EDGE2 1195 1176 -0.0519733 0.972911 1.58826 1 0 1 1 0 0 +EDGE2 1195 1174 -1.08033 0.0313249 0.00503886 1 0 1 1 0 0 +EDGE2 1195 1175 0.0392426 -0.0428098 -0.0195189 1 0 1 1 0 0 +EDGE2 1195 1155 -0.0275963 -0.100413 0.00315894 1 0 1 1 0 0 +EDGE2 1195 1194 -0.98689 0.0136092 -0.0341996 1 0 1 1 0 0 +EDGE2 1195 1154 -1.04105 0.0100976 -0.015566 1 0 1 1 0 0 +EDGE2 1196 1177 1.05317 0.00246495 -0.000820624 1 0 1 1 0 0 +EDGE2 1196 1157 1.03489 0.00544431 0.0178529 1 0 1 1 0 0 +EDGE2 1196 1156 -0.0260599 -0.045643 -0.0145567 1 0 1 1 0 0 +EDGE2 1196 1176 0.0127161 -0.00639225 -0.0110187 1 0 1 1 0 0 +EDGE2 1196 1175 -0.931389 -0.0739496 -1.55699 1 0 1 1 0 0 +EDGE2 1196 1195 -1.03536 -0.0653625 -1.52004 1 0 1 1 0 0 +EDGE2 1196 1155 -1.07635 -0.038679 -1.56401 1 0 1 1 0 0 +EDGE2 1197 1178 1.0154 0.0342623 -0.00446868 1 0 1 1 0 0 +EDGE2 1197 1158 0.932348 0.0416367 -0.0102302 1 0 1 1 0 0 +EDGE2 1197 1177 0.000369503 0.0329202 0.013355 1 0 1 1 0 0 +EDGE2 1197 1157 -0.00868907 -0.0577241 0.0130492 1 0 1 1 0 0 +EDGE2 1197 1196 -0.984239 -0.0822309 -0.000782977 1 0 1 1 0 0 +EDGE2 1197 1156 -0.964949 -0.0351826 0.0188813 1 0 1 1 0 0 +EDGE2 1197 1176 -0.979326 -0.0333592 0.00660933 1 0 1 1 0 0 +EDGE2 1198 1197 -0.981376 0.00817555 0.00431434 1 0 1 1 0 0 +EDGE2 1198 1179 0.956243 0.0120096 -0.0337386 1 0 1 1 0 0 +EDGE2 1198 1159 1.01579 -0.0278324 0.00793509 1 0 1 1 0 0 +EDGE2 1198 1178 -0.0717289 0.00919392 0.022565 1 0 1 1 0 0 +EDGE2 1198 1158 0.123417 -0.0151073 0.0384782 1 0 1 1 0 0 +EDGE2 1198 1177 -0.925289 0.0402583 0.0205986 1 0 1 1 0 0 +EDGE2 1198 1157 -0.968375 0.00936408 0.00871336 1 0 1 1 0 0 +EDGE2 1199 1160 0.939368 0.00329496 0.000679303 1 0 1 1 0 0 +EDGE2 1199 1180 1.00172 0.0423475 0.0435751 1 0 1 1 0 0 +EDGE2 1199 900 1.00413 0.0830321 -3.1435 1 0 1 1 0 0 +EDGE2 1199 840 1.00628 -0.0567556 -3.16601 1 0 1 1 0 0 +EDGE2 1199 860 1.01092 -0.0299405 -3.16665 1 0 1 1 0 0 +EDGE2 1199 1179 0.0768407 -0.00606305 0.0136534 1 0 1 1 0 0 +EDGE2 1199 1159 0.0147743 -0.0672847 -0.0067066 1 0 1 1 0 0 +EDGE2 1199 1178 -0.970375 0.0329349 0.0100241 1 0 1 1 0 0 +EDGE2 1199 1198 -0.967338 0.0104792 -0.0427058 1 0 1 1 0 0 +EDGE2 1199 1158 -0.998881 -0.00186241 0.0025615 1 0 1 1 0 0 +EDGE2 1200 839 1.05385 0.000636092 -3.16329 1 0 1 1 0 0 +EDGE2 1200 899 0.977931 0.0442219 -3.14775 1 0 1 1 0 0 +EDGE2 1200 859 1.00396 -0.0500624 -3.15502 1 0 1 1 0 0 +EDGE2 1200 841 0.0761787 -1.1146 -1.52572 1 0 1 1 0 0 +EDGE2 1200 901 0.0315086 -0.951674 -1.56216 1 0 1 1 0 0 +EDGE2 1200 861 -0.0311486 -0.969088 -1.55395 1 0 1 1 0 0 +EDGE2 1200 1160 -0.0487631 0.0630128 -0.00782963 1 0 1 1 0 0 +EDGE2 1200 1180 0.022297 -0.070963 0.0249577 1 0 1 1 0 0 +EDGE2 1200 900 0.0708977 0.0813618 -3.15781 1 0 1 1 0 0 +EDGE2 1200 840 -0.0413407 0.0827199 -3.16032 1 0 1 1 0 0 +EDGE2 1200 860 0.0361076 -0.0567568 -3.10337 1 0 1 1 0 0 +EDGE2 1200 1161 -0.0678133 1.08674 1.59444 1 0 1 1 0 0 +EDGE2 1200 1181 0.00857111 0.977986 1.54291 1 0 1 1 0 0 +EDGE2 1200 1179 -0.99874 0.0138441 -0.0235479 1 0 1 1 0 0 +EDGE2 1200 1199 -0.877005 -0.0153022 0.0122137 1 0 1 1 0 0 +EDGE2 1200 1159 -0.954953 0.0342476 -0.00373364 1 0 1 1 0 0 +EDGE2 1201 902 0.965023 0.0160967 0.0108749 1 0 1 1 0 0 +EDGE2 1201 842 0.955023 0.0750154 -0.000330985 1 0 1 1 0 0 +EDGE2 1201 862 1.05666 -0.0690953 0.0187579 1 0 1 1 0 0 +EDGE2 1201 841 0.00747102 -0.040172 0.00767508 1 0 1 1 0 0 +EDGE2 1201 901 -0.053002 0.0104632 -0.0220098 1 0 1 1 0 0 +EDGE2 1201 861 0.023435 0.0178716 0.0313492 1 0 1 1 0 0 +EDGE2 1201 1160 -0.933854 -0.0837926 1.5737 1 0 1 1 0 0 +EDGE2 1201 1200 -1.09254 0.0926322 1.59399 1 0 1 1 0 0 +EDGE2 1201 1180 -0.94782 -0.0225762 1.62918 1 0 1 1 0 0 +EDGE2 1201 900 -1.0349 -0.0290992 -1.57022 1 0 1 1 0 0 +EDGE2 1201 840 -1.06048 0.067082 -1.60144 1 0 1 1 0 0 +EDGE2 1201 860 -1.01755 0.00669806 -1.56318 1 0 1 1 0 0 +EDGE2 1202 863 1.04287 -0.0776635 0.0198956 1 0 1 1 0 0 +EDGE2 1202 903 0.983623 -0.0100431 0.0236346 1 0 1 1 0 0 +EDGE2 1202 843 0.971223 0.105905 -0.0253166 1 0 1 1 0 0 +EDGE2 1202 902 -0.0463424 -0.0272673 0.0222864 1 0 1 1 0 0 +EDGE2 1202 842 -0.0335439 -0.055347 -0.0098529 1 0 1 1 0 0 +EDGE2 1202 862 0.0237621 -0.0153109 -0.0348294 1 0 1 1 0 0 +EDGE2 1202 841 -1.04962 -0.00282735 -0.0337137 1 0 1 1 0 0 +EDGE2 1202 901 -0.947146 0.00498813 0.0123562 1 0 1 1 0 0 +EDGE2 1202 1201 -0.942714 0.107762 0.00630756 1 0 1 1 0 0 +EDGE2 1202 861 -0.91508 0.00762637 0.0111901 1 0 1 1 0 0 +EDGE2 1203 864 1.01246 -0.0300822 0.0196152 1 0 1 1 0 0 +EDGE2 1203 904 1.03039 -0.0434474 -0.00143917 1 0 1 1 0 0 +EDGE2 1203 844 1.03324 -0.0226024 0.0227594 1 0 1 1 0 0 +EDGE2 1203 863 0.00972062 -0.0745695 0.0202197 1 0 1 1 0 0 +EDGE2 1203 903 0.0987071 -0.0554281 -0.0224923 1 0 1 1 0 0 +EDGE2 1203 843 0.054069 -0.059671 0.0136409 1 0 1 1 0 0 +EDGE2 1203 902 -1.02562 -0.0380838 -0.0133717 1 0 1 1 0 0 +EDGE2 1203 1202 -0.982562 -0.104314 -0.027791 1 0 1 1 0 0 +EDGE2 1203 842 -1.05742 0.0655115 0.0024543 1 0 1 1 0 0 +EDGE2 1203 862 -0.978452 -0.103693 0.0541816 1 0 1 1 0 0 +EDGE2 1204 865 1.01038 -0.0502808 0.028921 1 0 1 1 0 0 +EDGE2 1204 905 0.994732 0.0248563 0.0289685 1 0 1 1 0 0 +EDGE2 1204 864 0.0446102 -0.0389932 -0.00685319 1 0 1 1 0 0 +EDGE2 1204 705 1.03296 0.0523754 -3.12296 1 0 1 1 0 0 +EDGE2 1204 825 1.0253 0.0498079 -3.13932 1 0 1 1 0 0 +EDGE2 1204 845 1.07318 -0.0608037 -0.0159436 1 0 1 1 0 0 +EDGE2 1204 904 -0.102606 0.0120838 0.00185651 1 0 1 1 0 0 +EDGE2 1204 844 -0.0142098 -0.0101479 0.0134005 1 0 1 1 0 0 +EDGE2 1204 863 -0.954272 0.0248137 -0.00238542 1 0 1 1 0 0 +EDGE2 1204 903 -1.02953 -0.0451765 -0.00491876 1 0 1 1 0 0 +EDGE2 1204 1203 -1.04352 -0.0523981 0.0193726 1 0 1 1 0 0 +EDGE2 1204 843 -0.904461 -0.0284807 -0.022222 1 0 1 1 0 0 +EDGE2 1205 824 0.9644 -0.0646534 -3.14341 1 0 1 1 0 0 +EDGE2 1205 704 0.969896 0.0331387 -3.11933 1 0 1 1 0 0 +EDGE2 1205 865 -0.0202909 0.00196541 -0.00203194 1 0 1 1 0 0 +EDGE2 1205 826 0.0867243 1.04067 1.614 1 0 1 1 0 0 +EDGE2 1205 866 0.0843953 0.991973 1.5858 1 0 1 1 0 0 +EDGE2 1205 906 -0.0235402 1.04002 1.56968 1 0 1 1 0 0 +EDGE2 1205 846 0.0406399 0.854825 1.54176 1 0 1 1 0 0 +EDGE2 1205 905 0.10225 0.0160863 0.0354145 1 0 1 1 0 0 +EDGE2 1205 864 -0.870077 0.0176715 -0.017572 1 0 1 1 0 0 +EDGE2 1205 705 0.0736525 -0.02964 -3.14504 1 0 1 1 0 0 +EDGE2 1205 825 0.0210271 -0.013964 -3.16634 1 0 1 1 0 0 +EDGE2 1205 845 -0.0647615 -0.0178973 0.0404592 1 0 1 1 0 0 +EDGE2 1205 1204 -0.998285 0.0227568 0.0123917 1 0 1 1 0 0 +EDGE2 1205 904 -1.0428 -0.00381185 -0.0164242 1 0 1 1 0 0 +EDGE2 1205 844 -0.986724 0.0576382 0.0110438 1 0 1 1 0 0 +EDGE2 1205 706 -0.0931865 -1.08234 -1.56459 1 0 1 1 0 0 +EDGE2 1206 865 -1.04621 -0.0605112 1.5168 1 0 1 1 0 0 +EDGE2 1206 1205 -0.98896 0.0369481 1.57553 1 0 1 1 0 0 +EDGE2 1206 905 -0.990436 0.0171944 1.57387 1 0 1 1 0 0 +EDGE2 1206 705 -0.916916 -0.0339761 -1.60515 1 0 1 1 0 0 +EDGE2 1206 825 -0.962377 0.0127444 -1.55486 1 0 1 1 0 0 +EDGE2 1206 845 -1.02171 0.0266939 1.54819 1 0 1 1 0 0 +EDGE2 1206 706 -0.0414703 0.00356656 -0.0198716 1 0 1 1 0 0 +EDGE2 1206 707 0.983398 -0.040721 -0.0280415 1 0 1 1 0 0 +EDGE2 1207 1206 -0.957552 -0.06616 0.0181065 1 0 1 1 0 0 +EDGE2 1207 706 -0.896585 -0.0267054 -0.0233504 1 0 1 1 0 0 +EDGE2 1207 707 0.0260419 -0.0249393 -0.00813253 1 0 1 1 0 0 +EDGE2 1207 708 0.916117 0.00566959 0.0179439 1 0 1 1 0 0 +EDGE2 1208 1207 -1.06293 0.00141453 -0.0200418 1 0 1 1 0 0 +EDGE2 1208 707 -0.976729 0.0065623 0.00468852 1 0 1 1 0 0 +EDGE2 1208 708 -0.0430081 0.111672 -0.0212195 1 0 1 1 0 0 +EDGE2 1208 709 1.0118 0.0478151 0.00525968 1 0 1 1 0 0 +EDGE2 1209 708 -1.02398 -0.05786 0.00819505 1 0 1 1 0 0 +EDGE2 1209 1208 -1.00635 0.037349 0.0322099 1 0 1 1 0 0 +EDGE2 1209 709 0.028738 -0.00436805 0.00882131 1 0 1 1 0 0 +EDGE2 1209 730 0.964419 0.0421057 -3.13542 1 0 1 1 0 0 +EDGE2 1209 710 1.03386 0.0179708 0.02211 1 0 1 1 0 0 +EDGE2 1210 711 -0.00736637 1.02003 1.56398 1 0 1 1 0 0 +EDGE2 1210 731 -0.0499744 1.01421 1.58219 1 0 1 1 0 0 +EDGE2 1210 1209 -0.953979 -0.0295495 0.0263917 1 0 1 1 0 0 +EDGE2 1210 709 -1.06227 -0.015838 -0.0249739 1 0 1 1 0 0 +EDGE2 1210 730 -0.0168699 -0.00414325 -3.12161 1 0 1 1 0 0 +EDGE2 1210 710 0.107995 -0.046419 0.0152759 1 0 1 1 0 0 +EDGE2 1210 729 1.05946 0.127402 -3.16021 1 0 1 1 0 0 +EDGE2 1211 732 0.983776 0.0109913 -0.0315732 1 0 1 1 0 0 +EDGE2 1211 712 0.980054 -0.026474 -0.0168355 1 0 1 1 0 0 +EDGE2 1211 711 -0.0753582 -0.0510743 0.000872924 1 0 1 1 0 0 +EDGE2 1211 731 -0.0231779 0.078167 -0.00177108 1 0 1 1 0 0 +EDGE2 1211 730 -1.07408 0.0638282 1.59478 1 0 1 1 0 0 +EDGE2 1211 1210 -0.984534 0.0366719 -1.57757 1 0 1 1 0 0 +EDGE2 1211 710 -0.9896 -0.00631405 -1.57981 1 0 1 1 0 0 +EDGE2 1212 732 0.0228577 -0.0230045 0.00861946 1 0 1 1 0 0 +EDGE2 1212 713 1.01608 -0.0181052 0.0212241 1 0 1 1 0 0 +EDGE2 1212 733 1.02846 0.0209257 0.0327517 1 0 1 1 0 0 +EDGE2 1212 1211 -0.926843 0.0750025 -0.0155459 1 0 1 1 0 0 +EDGE2 1212 712 0.0268585 -0.0321084 0.000501698 1 0 1 1 0 0 +EDGE2 1212 711 -1.03101 0.0414849 0.0133154 1 0 1 1 0 0 +EDGE2 1212 731 -0.95506 -0.0406714 -0.0014609 1 0 1 1 0 0 +EDGE2 1213 734 1.06889 -0.0318421 0.0157699 1 0 1 1 0 0 +EDGE2 1213 714 0.968855 0.0726148 -0.0107055 1 0 1 1 0 0 +EDGE2 1213 732 -1.01733 -0.0389879 -0.0120817 1 0 1 1 0 0 +EDGE2 1213 713 -0.0113563 0.0584184 0.0194304 1 0 1 1 0 0 +EDGE2 1213 733 -0.0555955 0.0843058 0.0300108 1 0 1 1 0 0 +EDGE2 1213 1212 -1.0148 -0.0899633 0.00637374 1 0 1 1 0 0 +EDGE2 1213 712 -1.01404 0.0124184 0.00862658 1 0 1 1 0 0 +EDGE2 1214 715 0.949428 0.0595407 -0.00898498 1 0 1 1 0 0 +EDGE2 1214 735 1.07082 0.0318285 -0.0207447 1 0 1 1 0 0 +EDGE2 1214 734 0.0157621 -0.046028 -0.00827101 1 0 1 1 0 0 +EDGE2 1214 714 0.0865754 -0.0048193 0.0301509 1 0 1 1 0 0 +EDGE2 1214 713 -1.07649 0.0443065 -0.0209691 1 0 1 1 0 0 +EDGE2 1214 1213 -1.02471 0.0948794 -0.00581881 1 0 1 1 0 0 +EDGE2 1214 733 -0.996348 0.0587418 0.0320128 1 0 1 1 0 0 +EDGE2 1215 736 -0.125513 1.00381 1.53308 1 0 1 1 0 0 +EDGE2 1215 715 -0.0282808 0.0486756 -0.0129348 1 0 1 1 0 0 +EDGE2 1215 735 0.0106551 -0.0413377 0.0128351 1 0 1 1 0 0 +EDGE2 1215 734 -1.09734 0.0306314 -0.015027 1 0 1 1 0 0 +EDGE2 1215 1214 -0.983838 -0.0276811 -0.00799445 1 0 1 1 0 0 +EDGE2 1215 714 -1.023 -0.0620491 -0.00772324 1 0 1 1 0 0 +EDGE2 1215 716 -0.0654519 -1.1091 -1.57381 1 0 1 1 0 0 +EDGE2 1216 715 -0.97735 0.0489631 1.58957 1 0 1 1 0 0 +EDGE2 1216 735 -0.986161 -0.0388575 1.56935 1 0 1 1 0 0 +EDGE2 1216 1215 -0.927931 -0.0286927 1.55271 1 0 1 1 0 0 +EDGE2 1216 716 -0.00974133 0.0354721 0.0177937 1 0 1 1 0 0 +EDGE2 1216 717 1.08063 0.0604315 0.00280502 1 0 1 1 0 0 +EDGE2 1217 1216 -0.954778 -0.0385421 0.000372732 1 0 1 1 0 0 +EDGE2 1217 716 -0.937689 -0.0331855 0.0345149 1 0 1 1 0 0 +EDGE2 1217 717 -0.00466761 0.0149718 0.0111016 1 0 1 1 0 0 +EDGE2 1217 718 1.02095 -0.00728376 -0.0273627 1 0 1 1 0 0 +EDGE2 1218 1217 -1.00666 -0.0467026 0.0112544 1 0 1 1 0 0 +EDGE2 1218 717 -0.986253 0.00512083 0.00164366 1 0 1 1 0 0 +EDGE2 1218 718 -0.0208088 0.0343748 0.0190977 1 0 1 1 0 0 +EDGE2 1218 719 0.958848 -0.0122527 -0.00481312 1 0 1 1 0 0 +EDGE2 1219 1218 -1.07093 0.108075 0.0135835 1 0 1 1 0 0 +EDGE2 1219 718 -0.970792 -0.00997616 -0.00644055 1 0 1 1 0 0 +EDGE2 1219 719 -0.0792663 0.00473221 -0.0119652 1 0 1 1 0 0 +EDGE2 1219 720 1.11295 -0.0352996 -0.035754 1 0 1 1 0 0 +EDGE2 1220 719 -1.08248 0.023902 -0.00302658 1 0 1 1 0 0 +EDGE2 1220 1219 -1.02413 -0.010249 -0.0100249 1 0 1 1 0 0 +EDGE2 1220 720 -0.0088893 0.0355056 -0.0172094 1 0 1 1 0 0 +EDGE2 1220 721 0.0337678 -0.996345 -1.58721 1 0 1 1 0 0 +EDGE2 1221 1220 -1.02726 0.0779541 -1.53486 1 0 1 1 0 0 +EDGE2 1221 720 -0.951297 -0.0196629 -1.5616 1 0 1 1 0 0 +EDGE2 1222 1221 -0.965533 -0.0200983 0.0235707 1 0 1 1 0 0 +EDGE2 1223 1222 -0.949825 0.013063 -0.00582171 1 0 1 1 0 0 +EDGE2 1224 1223 -1.00084 -0.0127336 -0.00950812 1 0 1 1 0 0 +EDGE2 1225 1224 -0.976818 -0.0738489 0.0115777 1 0 1 1 0 0 +EDGE2 1226 1225 -0.919396 -0.0238091 -1.59677 1 0 1 1 0 0 +EDGE2 1227 1226 -0.953632 -0.00560897 -0.00199413 1 0 1 1 0 0 +EDGE2 1228 1227 -1.05391 0.0928995 0.00480528 1 0 1 1 0 0 +EDGE2 1229 1228 -0.995469 -0.0402326 0.0197788 1 0 1 1 0 0 +EDGE2 1230 1229 -0.956068 -0.0359301 -0.0200028 1 0 1 1 0 0 +EDGE2 1231 1230 -1.00522 0.0144265 1.58084 1 0 1 1 0 0 +EDGE2 1232 1231 -1.02019 -0.00529826 0.00747219 1 0 1 1 0 0 +EDGE2 1233 1232 -0.987717 0.106755 -0.00771771 1 0 1 1 0 0 +EDGE2 1234 1233 -1.02603 0.104576 0.0166746 1 0 1 1 0 0 +EDGE2 1235 1234 -1.02459 0.00429574 -0.00735051 1 0 1 1 0 0 +EDGE2 1236 1235 -0.987815 0.0428412 -1.58036 1 0 1 1 0 0 +EDGE2 1237 1236 -0.921707 0.0463312 -0.0251561 1 0 1 1 0 0 +EDGE2 1238 1237 -1.06158 0.0587768 -0.0371789 1 0 1 1 0 0 +EDGE2 1239 1238 -0.958335 -0.0187039 -0.0168379 1 0 1 1 0 0 +EDGE2 1240 1239 -1.03491 -0.0416053 -0.0202818 1 0 1 1 0 0 +EDGE2 1241 1240 -1.02722 -0.0258531 -1.56659 1 0 1 1 0 0 +EDGE2 1242 1241 -1.00398 0.028799 0.00233828 1 0 1 1 0 0 +EDGE2 1243 1242 -0.998618 0.0201218 0.0114475 1 0 1 1 0 0 +EDGE2 1244 1243 -0.946784 -0.0498072 -0.0216779 1 0 1 1 0 0 +EDGE2 1244 785 0.923911 0.0049422 -3.1572 1 0 1 1 0 0 +EDGE2 1244 805 0.944005 0.0963412 -3.15383 1 0 1 1 0 0 +EDGE2 1244 745 1.05742 -0.0226408 -3.18555 1 0 1 1 0 0 +EDGE2 1244 765 0.96462 0.0377301 -3.15456 1 0 1 1 0 0 +EDGE2 1245 806 -0.0293562 -0.881239 -1.58751 1 0 1 1 0 0 +EDGE2 1245 766 0.0179169 -0.967211 -1.56561 1 0 1 1 0 0 +EDGE2 1245 786 -0.0526993 -1.03148 -1.58718 1 0 1 1 0 0 +EDGE2 1245 746 0.0268619 -1.06947 -1.57685 1 0 1 1 0 0 +EDGE2 1245 785 -0.0772941 -0.0318734 -3.14594 1 0 1 1 0 0 +EDGE2 1245 1244 -1.02022 -0.0165834 -0.0476381 1 0 1 1 0 0 +EDGE2 1245 805 0.00450729 -0.0391773 -3.1578 1 0 1 1 0 0 +EDGE2 1245 784 1.06558 -0.0875606 -3.12724 1 0 1 1 0 0 +EDGE2 1245 745 -0.0387961 0.0932772 -3.15754 1 0 1 1 0 0 +EDGE2 1245 765 0.0692255 0.0714386 -3.15321 1 0 1 1 0 0 +EDGE2 1245 804 0.97347 0.0166608 -3.13321 1 0 1 1 0 0 +EDGE2 1245 744 1.03641 -0.0481707 -3.17426 1 0 1 1 0 0 +EDGE2 1245 764 1.09649 -0.0679922 -3.14269 1 0 1 1 0 0 +EDGE2 1246 785 -0.955528 -0.0405685 1.55266 1 0 1 1 0 0 +EDGE2 1246 1245 -1.08362 0.0172066 -1.54933 1 0 1 1 0 0 +EDGE2 1246 805 -0.930254 0.0079152 1.57754 1 0 1 1 0 0 +EDGE2 1246 745 -1.14939 -0.014766 1.55072 1 0 1 1 0 0 +EDGE2 1246 765 -1.03277 0.0506184 1.56031 1 0 1 1 0 0 +EDGE2 1247 1246 -0.971231 0.0611377 0.0117009 1 0 1 1 0 0 +EDGE2 1248 1247 -0.981163 0.0534722 0.0260592 1 0 1 1 0 0 +EDGE2 1249 1248 -1.04105 -0.0354816 0.0123977 1 0 1 1 0 0 +EDGE2 1249 1230 0.981703 0.00306385 -3.15963 1 0 1 1 0 0 +EDGE2 1250 1249 -1.0407 -0.0118614 0.0167268 1 0 1 1 0 0 +EDGE2 1250 1231 0.0876401 1.02155 1.5644 1 0 1 1 0 0 +EDGE2 1250 1230 0.00955658 -0.107719 -3.11499 1 0 1 1 0 0 +EDGE2 1250 1229 1.05419 -0.0265379 -3.15084 1 0 1 1 0 0 +EDGE2 1251 1232 1.06051 -0.0636282 -0.0196603 1 0 1 1 0 0 +EDGE2 1251 1250 -0.958758 0.000533781 -1.54625 1 0 1 1 0 0 +EDGE2 1251 1231 0.0567422 0.0320722 0.020086 1 0 1 1 0 0 +EDGE2 1251 1230 -1.06013 -0.165135 1.53884 1 0 1 1 0 0 +EDGE2 1252 1233 0.956157 -0.00499519 -0.0157927 1 0 1 1 0 0 +EDGE2 1252 1232 -0.0785609 0.0734495 -0.00925372 1 0 1 1 0 0 +EDGE2 1252 1231 -1.09758 -0.00195688 0.025372 1 0 1 1 0 0 +EDGE2 1252 1251 -1.00576 0.000985731 -0.0131137 1 0 1 1 0 0 +EDGE2 1253 1234 1.01697 0.0549137 0.0176009 1 0 1 1 0 0 +EDGE2 1253 1233 0.103807 0.0163999 -0.00559272 1 0 1 1 0 0 +EDGE2 1253 1252 -1.0491 0.0217093 0.0111627 1 0 1 1 0 0 +EDGE2 1253 1232 -1.05303 -0.00923893 -0.0408745 1 0 1 1 0 0 +EDGE2 1254 1235 0.898496 -0.000739711 -0.0154572 1 0 1 1 0 0 +EDGE2 1254 1234 0.0277388 0.0429572 0.00374568 1 0 1 1 0 0 +EDGE2 1254 1233 -1.07563 -0.0384748 0.00415663 1 0 1 1 0 0 +EDGE2 1254 1253 -0.996194 -0.074808 0.00979893 1 0 1 1 0 0 +EDGE2 1255 1236 0.10556 1.00943 1.58875 1 0 1 1 0 0 +EDGE2 1255 1235 0.0328191 0.0291438 0.00515721 1 0 1 1 0 0 +EDGE2 1255 1254 -0.991398 0.00111205 0.0169022 1 0 1 1 0 0 +EDGE2 1255 1234 -0.931115 0.0631935 0.0194646 1 0 1 1 0 0 +EDGE2 1256 1235 -0.99466 0.0101579 1.5864 1 0 1 1 0 0 +EDGE2 1256 1255 -1.0928 -0.0253181 1.57606 1 0 1 1 0 0 +EDGE2 1257 1256 -0.993123 0.0177316 -0.00862068 1 0 1 1 0 0 +EDGE2 1258 1257 -1.06766 -0.0501905 -0.0236543 1 0 1 1 0 0 +EDGE2 1259 1258 -0.963731 0.0120464 -0.0103772 1 0 1 1 0 0 +EDGE2 1260 1259 -0.904082 0.0234269 0.00325525 1 0 1 1 0 0 +EDGE2 1261 1260 -1.02198 0.0219347 -1.58547 1 0 1 1 0 0 +EDGE2 1262 1261 -1.00848 -0.0376843 0.0036532 1 0 1 1 0 0 +EDGE2 1263 1262 -1.00909 -0.0869138 0.0120721 1 0 1 1 0 0 +EDGE2 1264 1263 -1.00886 -0.0112995 0.042789 1 0 1 1 0 0 +EDGE2 1265 1264 -1.06926 0.0465166 0.00325251 1 0 1 1 0 0 +EDGE2 1266 1265 -0.962662 0.0557897 1.59385 1 0 1 1 0 0 +EDGE2 1267 1266 -0.88301 -0.0426062 -0.00888307 1 0 1 1 0 0 +EDGE2 1268 1267 -0.913922 0.0252518 0.0218239 1 0 1 1 0 0 +EDGE2 1269 1268 -1.02281 -0.0159798 0.0206622 1 0 1 1 0 0 +EDGE2 1270 1269 -1.05562 -0.0371841 -0.0296889 1 0 1 1 0 0 +EDGE2 1271 1270 -0.947461 0.010245 1.59718 1 0 1 1 0 0 +EDGE2 1272 1271 -0.993213 0.0517024 -0.00232349 1 0 1 1 0 0 +EDGE2 1273 1272 -0.953877 -0.070659 -0.0269017 1 0 1 1 0 0 +EDGE2 1274 1273 -1.06434 0.0240494 0.0118004 1 0 1 1 0 0 +EDGE2 1275 1274 -1.01477 -0.0367259 -0.0125387 1 0 1 1 0 0 +EDGE2 1276 1275 -0.983829 0.101495 -1.60209 1 0 1 1 0 0 +EDGE2 1277 1276 -1.01347 0.0622532 0.0156585 1 0 1 1 0 0 +EDGE2 1278 1277 -1.0055 -0.0163052 -0.00412888 1 0 1 1 0 0 +EDGE2 1279 1278 -1.00166 -0.0262756 -0.00926237 1 0 1 1 0 0 +EDGE2 1280 1279 -1.00535 0.0668116 0.0295937 1 0 1 1 0 0 +EDGE2 1281 1280 -1.11317 -0.0564045 -1.56578 1 0 1 1 0 0 +EDGE2 1282 1281 -1.02591 -0.0221856 0.00609211 1 0 1 1 0 0 +EDGE2 1283 1282 -1.0265 0.0850324 -0.0251474 1 0 1 1 0 0 +EDGE2 1284 1283 -1.02846 -0.0124962 0.0148672 1 0 1 1 0 0 +EDGE2 1285 1284 -1.04499 0.0363279 -0.00407588 1 0 1 1 0 0 +EDGE2 1286 1285 -1.01605 0.0660389 -1.59129 1 0 1 1 0 0 +EDGE2 1287 1286 -1.01624 0.0560402 -0.0132879 1 0 1 1 0 0 +EDGE2 1288 1287 -0.984751 -0.0108849 0.0143504 1 0 1 1 0 0 +EDGE2 1289 1270 1.02562 -0.0657454 -3.17275 1 0 1 1 0 0 +EDGE2 1289 1288 -0.957668 -0.102919 0.00478266 1 0 1 1 0 0 +EDGE2 1290 1269 0.956249 -0.00928648 -3.15931 1 0 1 1 0 0 +EDGE2 1290 1270 -0.00838489 0.0181643 -3.15931 1 0 1 1 0 0 +EDGE2 1290 1271 -0.088188 1.04557 1.58024 1 0 1 1 0 0 +EDGE2 1290 1289 -1.03691 -0.00446685 0.0388916 1 0 1 1 0 0 +EDGE2 1291 1270 -1.02785 -0.0471841 1.53085 1 0 1 1 0 0 +EDGE2 1291 1290 -1.04285 -0.0591366 -1.55538 1 0 1 1 0 0 +EDGE2 1291 1271 -0.0765278 -0.0397412 0.0121767 1 0 1 1 0 0 +EDGE2 1291 1272 1.08194 -0.0947258 0.0221858 1 0 1 1 0 0 +EDGE2 1292 1273 1.03537 -0.0045628 -0.00014444 1 0 1 1 0 0 +EDGE2 1292 1291 -1.02101 -0.0615204 0.0280583 1 0 1 1 0 0 +EDGE2 1292 1271 -0.939642 0.0352233 0.0385476 1 0 1 1 0 0 +EDGE2 1292 1272 0.0279292 -0.0114218 0.012397 1 0 1 1 0 0 +EDGE2 1293 1273 -0.042922 0.0871251 -0.0134312 1 0 1 1 0 0 +EDGE2 1293 1292 -0.967931 0.0338533 -0.0408642 1 0 1 1 0 0 +EDGE2 1293 1272 -1.01974 0.111923 -0.00978702 1 0 1 1 0 0 +EDGE2 1293 1274 0.978731 -0.034913 -0.0117876 1 0 1 1 0 0 +EDGE2 1294 1273 -1.04603 0.0512521 0.0293677 1 0 1 1 0 0 +EDGE2 1294 1293 -1.02206 0.0821514 -0.00743214 1 0 1 1 0 0 +EDGE2 1294 1274 -0.000895846 -0.0704164 0.0159411 1 0 1 1 0 0 +EDGE2 1294 1275 1.02073 0.0251831 -0.00572445 1 0 1 1 0 0 +EDGE2 1295 1274 -1.01617 -0.0552393 -0.0125892 1 0 1 1 0 0 +EDGE2 1295 1294 -1.10367 0.0319705 0.0191134 1 0 1 1 0 0 +EDGE2 1295 1275 -0.0856354 0.0629875 -0.0104094 1 0 1 1 0 0 +EDGE2 1295 1276 -0.00481409 1.02011 1.5631 1 0 1 1 0 0 +EDGE2 1296 1295 -1.03498 0.0413666 -1.56218 1 0 1 1 0 0 +EDGE2 1296 1275 -1.01973 0.0210484 -1.56562 1 0 1 1 0 0 +EDGE2 1296 1276 0.0647043 0.041633 -0.0163977 1 0 1 1 0 0 +EDGE2 1296 1277 1.00947 0.0133073 -0.00942349 1 0 1 1 0 0 +EDGE2 1297 1296 -0.923379 0.0663967 0.0174796 1 0 1 1 0 0 +EDGE2 1297 1276 -0.895077 -0.00185955 0.0192734 1 0 1 1 0 0 +EDGE2 1297 1278 1.08446 -0.0441055 0.0144701 1 0 1 1 0 0 +EDGE2 1297 1277 -0.0152036 -0.130006 -0.0106248 1 0 1 1 0 0 +EDGE2 1298 1278 -0.0383894 -0.0175648 -0.0047295 1 0 1 1 0 0 +EDGE2 1298 1277 -1.03662 -0.00300422 -0.0124066 1 0 1 1 0 0 +EDGE2 1298 1297 -0.929933 -0.00770452 0.00514966 1 0 1 1 0 0 +EDGE2 1298 1279 0.972063 -0.00293766 -0.0198113 1 0 1 1 0 0 +EDGE2 1299 1278 -0.973071 -0.0148769 0.0100474 1 0 1 1 0 0 +EDGE2 1299 1298 -1.09466 -0.021354 0.0462745 1 0 1 1 0 0 +EDGE2 1299 1279 0.0162131 0.0664756 -0.0254896 1 0 1 1 0 0 +EDGE2 1299 1280 0.908116 -0.08319 0.0234634 1 0 1 1 0 0 +EDGE2 1300 1299 -1.05058 0.00504212 -0.0291127 1 0 1 1 0 0 +EDGE2 1300 1279 -1.05432 0.0884407 0.00186975 1 0 1 1 0 0 +EDGE2 1300 1281 0.11511 0.990294 1.54535 1 0 1 1 0 0 +EDGE2 1300 1280 0.0177556 0.00145577 0.0142503 1 0 1 1 0 0 +EDGE2 1301 1282 1.00029 -0.0304358 -0.0103006 1 0 1 1 0 0 +EDGE2 1301 1281 -0.0238066 -0.0506135 0.00522814 1 0 1 1 0 0 +EDGE2 1301 1300 -1.06437 -0.0130464 -1.56672 1 0 1 1 0 0 +EDGE2 1301 1280 -0.997234 0.0165766 -1.55265 1 0 1 1 0 0 +EDGE2 1302 1283 0.902533 -0.0606606 -0.00588698 1 0 1 1 0 0 +EDGE2 1302 1282 0.0912985 0.0245243 0.00708679 1 0 1 1 0 0 +EDGE2 1302 1281 -1.01152 -0.0229933 -0.0049624 1 0 1 1 0 0 +EDGE2 1302 1301 -1.03722 -0.0490094 -1.70037e-05 1 0 1 1 0 0 +EDGE2 1303 1284 0.98082 -0.0289642 0.00837949 1 0 1 1 0 0 +EDGE2 1303 1302 -0.953318 -0.0520686 0.0131677 1 0 1 1 0 0 +EDGE2 1303 1283 -0.025674 -0.0413467 0.0262033 1 0 1 1 0 0 +EDGE2 1303 1282 -1.1085 0.0183149 -0.00157826 1 0 1 1 0 0 +EDGE2 1304 1303 -0.877227 0.00561841 0.00286066 1 0 1 1 0 0 +EDGE2 1304 1285 0.995133 -0.0231667 0.0354908 1 0 1 1 0 0 +EDGE2 1304 1284 0.0271038 0.127426 0.0107461 1 0 1 1 0 0 +EDGE2 1304 1283 -1.03006 0.026649 0.00520358 1 0 1 1 0 0 +EDGE2 1305 1304 -1.0447 -0.0208013 -0.0140763 1 0 1 1 0 0 +EDGE2 1305 1286 0.00437427 0.944903 1.56751 1 0 1 1 0 0 +EDGE2 1305 1285 0.00346995 -0.0932063 0.0113121 1 0 1 1 0 0 +EDGE2 1305 1284 -0.995703 0.0479902 -0.0177929 1 0 1 1 0 0 +EDGE2 1306 1285 -1.05958 0.0738314 1.58389 1 0 1 1 0 0 +EDGE2 1306 1305 -1.01689 0.0280222 1.54481 1 0 1 1 0 0 +EDGE2 1307 1306 -0.998002 0.0258337 0.00705902 1 0 1 1 0 0 +EDGE2 1308 1307 -0.913524 0.036245 -0.0253566 1 0 1 1 0 0 +EDGE2 1309 1308 -1.0792 -0.0219855 -0.0386577 1 0 1 1 0 0 +EDGE2 1310 1309 -0.900168 0.0105322 -0.00773817 1 0 1 1 0 0 +EDGE2 1311 1310 -1.07678 0.0558806 -1.59561 1 0 1 1 0 0 +EDGE2 1312 1311 -1.00556 0.0386834 -0.0125337 1 0 1 1 0 0 +EDGE2 1313 1312 -1.02178 0.00991733 0.0270311 1 0 1 1 0 0 +EDGE2 1314 1313 -0.953064 0.00457294 -0.00378178 1 0 1 1 0 0 +EDGE2 1315 1314 -1.02659 -0.00334088 0.00358176 1 0 1 1 0 0 +EDGE2 1316 1315 -1.0129 -0.0081812 -1.57679 1 0 1 1 0 0 +EDGE2 1317 1316 -1.01794 -0.0166643 -0.0306864 1 0 1 1 0 0 +EDGE2 1318 1317 -1.00807 0.0225211 -0.0201849 1 0 1 1 0 0 +EDGE2 1319 1318 -0.934565 -0.00490922 -0.0149655 1 0 1 1 0 0 +EDGE2 1320 1319 -0.973219 0.0177417 -0.0175316 1 0 1 1 0 0 +EDGE2 1321 1320 -1.04061 0.0242679 1.56943 1 0 1 1 0 0 +EDGE2 1322 1321 -1.01395 0.0348408 0.01551 1 0 1 1 0 0 +EDGE2 1323 1322 -1.01518 -0.020291 -0.00543139 1 0 1 1 0 0 +EDGE2 1324 1323 -0.929009 0.0474709 -0.0379966 1 0 1 1 0 0 +EDGE2 1325 1324 -0.986292 0.0309375 0.0120332 1 0 1 1 0 0 +EDGE2 1326 1325 -1.04808 -0.0388319 1.58762 1 0 1 1 0 0 +EDGE2 1327 1326 -1.04096 -0.0647614 -0.016395 1 0 1 1 0 0 +EDGE2 1328 1327 -0.998002 0.0185409 0.015181 1 0 1 1 0 0 +EDGE2 1329 1328 -0.880581 0.0713252 -0.0063803 1 0 1 1 0 0 +EDGE2 1330 1329 -0.949889 -0.0256134 0.0107546 1 0 1 1 0 0 +EDGE2 1331 1330 -1.07245 -0.00287284 -1.56439 1 0 1 1 0 0 +EDGE2 1332 1331 -1.06003 -0.0351636 0.00481686 1 0 1 1 0 0 +EDGE2 1333 1332 -0.934493 0.0143094 -0.00329225 1 0 1 1 0 0 +EDGE2 1334 1333 -1.08852 -0.0439092 0.0383159 1 0 1 1 0 0 +EDGE2 1335 1334 -0.978056 -0.0828671 0.012717 1 0 1 1 0 0 +EDGE2 1336 1335 -1.03952 0.021556 -1.59663 1 0 1 1 0 0 +EDGE2 1337 1336 -0.982531 -0.0696169 0.0118796 1 0 1 1 0 0 +EDGE2 1338 1337 -1.04294 0.0208141 -0.0405447 1 0 1 1 0 0 +EDGE2 1339 1338 -1.00319 0.0106848 0.00172351 1 0 1 1 0 0 +EDGE2 1340 1339 -0.97579 -0.011836 0.0077563 1 0 1 1 0 0 +EDGE2 1341 1340 -0.994057 -0.0075998 -1.59024 1 0 1 1 0 0 +EDGE2 1342 1341 -0.974226 -0.0250961 0.02775 1 0 1 1 0 0 +EDGE2 1343 1342 -1.03154 0.0546996 0.0148903 1 0 1 1 0 0 +EDGE2 1344 1343 -0.996771 0.0394928 -0.00154414 1 0 1 1 0 0 +EDGE2 1344 1325 1.04822 -0.0392246 -3.13049 1 0 1 1 0 0 +EDGE2 1345 1344 -1.03573 0.0229721 0.00352092 1 0 1 1 0 0 +EDGE2 1345 1325 0.0501157 -0.133333 -3.15242 1 0 1 1 0 0 +EDGE2 1345 1324 1.04854 -0.041186 -3.15314 1 0 1 1 0 0 +EDGE2 1345 1326 -0.0197953 0.921164 1.55266 1 0 1 1 0 0 +EDGE2 1346 1345 -0.995624 -0.0389939 -1.58237 1 0 1 1 0 0 +EDGE2 1346 1325 -1.01243 -0.126872 1.59091 1 0 1 1 0 0 +EDGE2 1346 1327 0.963695 0.0114909 -0.0190989 1 0 1 1 0 0 +EDGE2 1346 1326 0.0249382 -0.0427409 -0.000707319 1 0 1 1 0 0 +EDGE2 1347 1327 0.059019 0.0460568 0.00270853 1 0 1 1 0 0 +EDGE2 1347 1326 -0.927082 -0.0163373 -0.00800912 1 0 1 1 0 0 +EDGE2 1347 1346 -1.02247 0.0777766 -0.0290529 1 0 1 1 0 0 +EDGE2 1347 1328 1.07449 0.0561931 -0.020526 1 0 1 1 0 0 +EDGE2 1348 1327 -1.04603 0.0342391 -0.0193265 1 0 1 1 0 0 +EDGE2 1348 1347 -0.959718 0.00915572 -0.00817475 1 0 1 1 0 0 +EDGE2 1348 1328 -0.0236457 -0.0469175 0.00233462 1 0 1 1 0 0 +EDGE2 1348 1329 0.97967 0.0369753 -0.0134402 1 0 1 1 0 0 +EDGE2 1349 1348 -1.04546 -0.0228939 -0.0169614 1 0 1 1 0 0 +EDGE2 1349 1328 -0.94586 -0.0100832 0.00104271 1 0 1 1 0 0 +EDGE2 1349 1329 0.00733568 -0.00352353 0.00889541 1 0 1 1 0 0 +EDGE2 1349 1330 1.04602 -0.0039329 0.00197006 1 0 1 1 0 0 +EDGE2 1350 1349 -0.937378 0.0811747 0.0201027 1 0 1 1 0 0 +EDGE2 1350 1329 -0.998397 -0.0592215 0.00748063 1 0 1 1 0 0 +EDGE2 1350 1331 -0.0577339 0.951047 1.58865 1 0 1 1 0 0 +EDGE2 1350 1330 0.0751998 0.042378 0.00918842 1 0 1 1 0 0 +EDGE2 1351 1332 1.00559 0.0314839 0.0350335 1 0 1 1 0 0 +EDGE2 1351 1331 0.00569124 0.000593134 0.0128801 1 0 1 1 0 0 +EDGE2 1351 1330 -0.947401 0.0446627 -1.52908 1 0 1 1 0 0 +EDGE2 1351 1350 -1.00275 0.0343804 -1.56712 1 0 1 1 0 0 +EDGE2 1352 1333 0.944919 -0.0231685 -0.0139634 1 0 1 1 0 0 +EDGE2 1352 1332 -0.135432 -0.0300424 -0.0074848 1 0 1 1 0 0 +EDGE2 1352 1331 -0.943396 -0.0296817 -0.00542777 1 0 1 1 0 0 +EDGE2 1352 1351 -1.04029 0.00126786 -0.0513892 1 0 1 1 0 0 +EDGE2 1353 1333 -0.0728487 0.0176585 -0.0277569 1 0 1 1 0 0 +EDGE2 1353 1334 0.952166 -0.0210342 -0.0257619 1 0 1 1 0 0 +EDGE2 1353 1352 -0.956735 0.0802878 -0.00479265 1 0 1 1 0 0 +EDGE2 1353 1332 -1.04113 -0.0269612 -0.0044539 1 0 1 1 0 0 +EDGE2 1354 1333 -0.919576 -0.00719264 0.0235486 1 0 1 1 0 0 +EDGE2 1354 1335 0.980334 0.0280101 -0.0162286 1 0 1 1 0 0 +EDGE2 1354 1334 -0.0160647 0.0594651 -0.0107289 1 0 1 1 0 0 +EDGE2 1354 1353 -1.00603 0.0602598 -0.019145 1 0 1 1 0 0 +EDGE2 1355 1336 0.0856151 0.953179 1.59341 1 0 1 1 0 0 +EDGE2 1355 1335 0.0750055 -0.0141627 -0.0199108 1 0 1 1 0 0 +EDGE2 1355 1334 -0.930388 0.0072835 0.0140821 1 0 1 1 0 0 +EDGE2 1355 1354 -1.0504 -0.0178273 -0.0138611 1 0 1 1 0 0 +EDGE2 1356 1336 0.0236094 -0.0140295 0.0202114 1 0 1 1 0 0 +EDGE2 1356 1337 0.990918 0.0442237 0.0108398 1 0 1 1 0 0 +EDGE2 1356 1355 -1.00911 0.0407671 -1.54886 1 0 1 1 0 0 +EDGE2 1356 1335 -1.0451 -0.0906945 -1.56966 1 0 1 1 0 0 +EDGE2 1357 1336 -0.907753 -0.0621581 0.00164152 1 0 1 1 0 0 +EDGE2 1357 1338 1.08187 0.0448476 0.0227921 1 0 1 1 0 0 +EDGE2 1357 1337 -0.0633525 0.0624514 -0.00135408 1 0 1 1 0 0 +EDGE2 1357 1356 -1.06332 0.0238446 -0.0279529 1 0 1 1 0 0 +EDGE2 1358 1339 0.98042 -0.0304644 0.00126019 1 0 1 1 0 0 +EDGE2 1358 1338 -0.0255201 -0.0149754 -0.0149456 1 0 1 1 0 0 +EDGE2 1358 1357 -0.876029 0.0402264 -0.00447355 1 0 1 1 0 0 +EDGE2 1358 1337 -1.05511 0.115566 0.00231503 1 0 1 1 0 0 +EDGE2 1359 1340 0.969493 0.079968 -0.0175553 1 0 1 1 0 0 +EDGE2 1359 1339 0.0982374 0.116912 -0.0260436 1 0 1 1 0 0 +EDGE2 1359 1358 -1.06755 0.0167541 -0.0130485 1 0 1 1 0 0 +EDGE2 1359 1338 -1.02105 0.039925 -0.00384795 1 0 1 1 0 0 +EDGE2 1360 1340 0.0135307 0.0671947 -0.000154066 1 0 1 1 0 0 +EDGE2 1360 1341 -0.00412353 1.03662 1.55529 1 0 1 1 0 0 +EDGE2 1360 1359 -0.978527 -0.00440941 0.00195384 1 0 1 1 0 0 +EDGE2 1360 1339 -0.874904 0.0642204 -0.0124994 1 0 1 1 0 0 +EDGE2 1361 1360 -0.95865 -0.0279406 -1.59054 1 0 1 1 0 0 +EDGE2 1361 1340 -0.999718 -0.0126395 -1.56696 1 0 1 1 0 0 +EDGE2 1361 1341 -0.0468171 -0.0647529 -0.0217002 1 0 1 1 0 0 +EDGE2 1361 1342 1.07777 -0.0100965 -0.0235072 1 0 1 1 0 0 +EDGE2 1362 1341 -1.02101 0.015146 -0.0268308 1 0 1 1 0 0 +EDGE2 1362 1361 -0.937815 0.055212 0.00541863 1 0 1 1 0 0 +EDGE2 1362 1342 -0.019019 -0.0036166 0.0150366 1 0 1 1 0 0 +EDGE2 1362 1343 0.967714 0.0579941 -0.0152468 1 0 1 1 0 0 +EDGE2 1363 1342 -0.9068 0.0588464 -0.0320384 1 0 1 1 0 0 +EDGE2 1363 1362 -1.00118 -0.0696141 0.0290736 1 0 1 1 0 0 +EDGE2 1363 1343 -0.0414892 0.0165952 0.0279354 1 0 1 1 0 0 +EDGE2 1363 1344 0.944044 0.0587566 -0.0307836 1 0 1 1 0 0 +EDGE2 1364 1345 0.977588 0.00453713 0.0223072 1 0 1 1 0 0 +EDGE2 1364 1363 -0.976966 0.00400062 -0.0124806 1 0 1 1 0 0 +EDGE2 1364 1343 -1.08433 -0.0425973 0.0187873 1 0 1 1 0 0 +EDGE2 1364 1344 0.0372683 -0.00744931 0.0150595 1 0 1 1 0 0 +EDGE2 1364 1325 0.9639 0.102991 -3.11879 1 0 1 1 0 0 +EDGE2 1365 1345 -0.0325098 0.00240627 -0.00189106 1 0 1 1 0 0 +EDGE2 1365 1344 -0.935776 0.0502503 -0.0164652 1 0 1 1 0 0 +EDGE2 1365 1364 -1.00152 -0.00777685 -0.0321487 1 0 1 1 0 0 +EDGE2 1365 1325 0.0309097 -0.0082156 -3.09045 1 0 1 1 0 0 +EDGE2 1365 1324 0.94348 0.0150096 -3.17209 1 0 1 1 0 0 +EDGE2 1365 1326 0.0753759 1.03153 1.57787 1 0 1 1 0 0 +EDGE2 1365 1346 0.0428676 0.953898 1.55087 1 0 1 1 0 0 +EDGE2 1366 1345 -1.0705 0.0232024 1.54844 1 0 1 1 0 0 +EDGE2 1366 1365 -1.00715 -0.0215865 1.58189 1 0 1 1 0 0 +EDGE2 1366 1325 -1.05393 0.0313154 -1.57588 1 0 1 1 0 0 +EDGE2 1367 1366 -0.988482 -0.0692858 0.0379232 1 0 1 1 0 0 +EDGE2 1368 1367 -0.948032 -0.0155759 0.00909279 1 0 1 1 0 0 +EDGE2 1369 1368 -1.07398 -0.0775139 -0.0259039 1 0 1 1 0 0 +EDGE2 1370 1369 -0.963019 -0.0233238 -0.0138377 1 0 1 1 0 0 +EDGE2 1371 1370 -1.05918 -0.0720216 -1.5203 1 0 1 1 0 0 +EDGE2 1372 1371 -1.00661 -0.0148252 -0.0188618 1 0 1 1 0 0 +EDGE2 1373 1372 -1.02922 0.0383245 -0.0357035 1 0 1 1 0 0 +EDGE2 1374 1373 -0.987145 -0.00322017 -0.0113097 1 0 1 1 0 0 +EDGE2 1375 1374 -0.9856 0.0191343 0.00434768 1 0 1 1 0 0 +EDGE2 1376 1375 -1.04229 -0.0103536 1.62253 1 0 1 1 0 0 +EDGE2 1377 1376 -0.97322 -0.146426 -0.056472 1 0 1 1 0 0 +EDGE2 1378 1377 -0.951448 0.0619607 0.012181 1 0 1 1 0 0 +EDGE2 1379 1378 -1.0052 0.0269726 -0.0249931 1 0 1 1 0 0 +EDGE2 1380 1379 -1.00242 -0.0397082 0.0202346 1 0 1 1 0 0 +EDGE2 1381 1380 -1.03778 0.0585509 1.58863 1 0 1 1 0 0 +EDGE2 1382 1381 -0.978873 -0.100375 -0.0436636 1 0 1 1 0 0 +EDGE2 1383 1382 -0.963163 -0.00820939 0.00938163 1 0 1 1 0 0 +EDGE2 1384 1383 -1.0966 0.0259232 0.0292737 1 0 1 1 0 0 +EDGE2 1385 1384 -1.04202 0.0102956 0.0215729 1 0 1 1 0 0 +EDGE2 1386 1385 -0.972017 0.000931471 -1.56483 1 0 1 1 0 0 +EDGE2 1387 1386 -0.941773 0.0533096 -0.0108815 1 0 1 1 0 0 +EDGE2 1388 1387 -1.05946 -0.0935919 -0.0471441 1 0 1 1 0 0 +EDGE2 1389 1388 -1.02696 0.0142874 0.0226167 1 0 1 1 0 0 +EDGE2 1390 1389 -0.969166 0.0577507 -0.00360282 1 0 1 1 0 0 +EDGE2 1391 1390 -0.994529 0.0167784 1.5839 1 0 1 1 0 0 +EDGE2 1392 1391 -0.941035 -0.000869934 -0.0123756 1 0 1 1 0 0 +EDGE2 1393 1392 -0.98814 0.0311047 0.017603 1 0 1 1 0 0 +EDGE2 1394 1393 -1.03987 -0.0556172 -0.036493 1 0 1 1 0 0 +EDGE2 1395 1394 -1.03678 -0.0668154 -0.0015821 1 0 1 1 0 0 +EDGE2 1396 1395 -1.01845 -0.0397121 -1.57863 1 0 1 1 0 0 +EDGE2 1397 1396 -1.02852 -0.0139834 -0.0150747 1 0 1 1 0 0 +EDGE2 1398 1397 -0.950331 -0.0218189 -0.000791031 1 0 1 1 0 0 +EDGE2 1399 1398 -0.981681 0.0242888 0.0043108 1 0 1 1 0 0 +EDGE2 1400 1399 -0.944484 -0.00485922 -0.0058725 1 0 1 1 0 0 +EDGE2 1401 1400 -1.05207 -0.0591262 -1.56514 1 0 1 1 0 0 +EDGE2 1402 1401 -1.06099 0.0289075 0.00586313 1 0 1 1 0 0 +EDGE2 1403 1402 -1.0522 -0.00112635 0.00614812 1 0 1 1 0 0 +EDGE2 1404 1403 -0.943919 -0.0784776 -0.000224858 1 0 1 1 0 0 +EDGE2 1405 1404 -1.00607 0.114993 -0.0104835 1 0 1 1 0 0 +EDGE2 1406 1405 -0.999647 -0.0212516 -1.55289 1 0 1 1 0 0 +EDGE2 1407 1406 -0.943968 0.0301946 -0.0266111 1 0 1 1 0 0 +EDGE2 1408 1407 -1.0032 -0.0230962 0.00186317 1 0 1 1 0 0 +EDGE2 1409 1408 -1.06701 0.0361972 -0.0172226 1 0 1 1 0 0 +EDGE2 1409 1390 0.944767 -0.0367235 -3.14664 1 0 1 1 0 0 +EDGE2 1410 1409 -0.927642 -0.0147163 -0.0111467 1 0 1 1 0 0 +EDGE2 1410 1391 -0.123433 0.961469 1.55341 1 0 1 1 0 0 +EDGE2 1410 1390 -0.0472256 0.107962 -3.11276 1 0 1 1 0 0 +EDGE2 1410 1389 0.997338 0.0486915 -3.13651 1 0 1 1 0 0 +EDGE2 1411 1392 0.996841 -0.0344636 -0.000122099 1 0 1 1 0 0 +EDGE2 1411 1391 0.0704502 -0.026375 0.0113458 1 0 1 1 0 0 +EDGE2 1411 1390 -1.07727 -0.118589 1.52618 1 0 1 1 0 0 +EDGE2 1411 1410 -1.05865 -0.0584611 -1.54294 1 0 1 1 0 0 +EDGE2 1412 1393 1.02186 0.00390471 -0.0194022 1 0 1 1 0 0 +EDGE2 1412 1392 0.0475201 0.0391997 0.00995014 1 0 1 1 0 0 +EDGE2 1412 1391 -1.01796 -0.0314441 -0.0478106 1 0 1 1 0 0 +EDGE2 1412 1411 -1.00927 0.0308382 -0.0194501 1 0 1 1 0 0 +EDGE2 1413 1394 1.06972 -0.041274 0.0283313 1 0 1 1 0 0 +EDGE2 1413 1393 0.0180982 0.0220153 -0.012737 1 0 1 1 0 0 +EDGE2 1413 1392 -1.04545 -0.0337083 -0.00430344 1 0 1 1 0 0 +EDGE2 1413 1412 -1.06394 -0.05382 0.0022654 1 0 1 1 0 0 +EDGE2 1414 1395 0.954364 -0.0221866 -0.00782713 1 0 1 1 0 0 +EDGE2 1414 1394 0.0571956 0.0140559 0.0054142 1 0 1 1 0 0 +EDGE2 1414 1393 -1.0216 0.0821867 0.0283721 1 0 1 1 0 0 +EDGE2 1414 1413 -0.984621 -0.050949 -0.00740644 1 0 1 1 0 0 +EDGE2 1415 1396 0.0302759 1.02703 1.56547 1 0 1 1 0 0 +EDGE2 1415 1395 -0.0312893 0.0379327 0.0132925 1 0 1 1 0 0 +EDGE2 1415 1394 -1.07302 -0.0421265 0.0311092 1 0 1 1 0 0 +EDGE2 1415 1414 -1.03723 -0.0308033 -0.00799769 1 0 1 1 0 0 +EDGE2 1416 1397 0.989796 -0.0283192 0.029782 1 0 1 1 0 0 +EDGE2 1416 1396 -0.0621585 0.000816006 -0.0410375 1 0 1 1 0 0 +EDGE2 1416 1395 -1.04961 0.0288564 -1.60932 1 0 1 1 0 0 +EDGE2 1416 1415 -0.993021 0.0305793 -1.5272 1 0 1 1 0 0 +EDGE2 1417 1398 1.08587 -0.0337934 0.00534367 1 0 1 1 0 0 +EDGE2 1417 1416 -0.972662 -0.0193098 0.0353256 1 0 1 1 0 0 +EDGE2 1417 1397 0.041372 -0.0496154 -0.0111693 1 0 1 1 0 0 +EDGE2 1417 1396 -0.908292 0.0257168 -0.000779434 1 0 1 1 0 0 +EDGE2 1418 1417 -0.96216 0.0307232 -0.00114849 1 0 1 1 0 0 +EDGE2 1418 1399 1.05869 0.0412261 0.00580127 1 0 1 1 0 0 +EDGE2 1418 1398 0.00171288 -0.106843 0.00948127 1 0 1 1 0 0 +EDGE2 1418 1397 -0.970813 -0.08622 -0.0303142 1 0 1 1 0 0 +EDGE2 1419 1400 0.947322 0.00721523 -0.0275982 1 0 1 1 0 0 +EDGE2 1419 1399 0.00898819 -0.0948318 -0.0326965 1 0 1 1 0 0 +EDGE2 1419 1398 -1.02109 0.0157848 -0.0258109 1 0 1 1 0 0 +EDGE2 1419 1418 -0.888345 -0.0342643 0.0149746 1 0 1 1 0 0 +EDGE2 1420 1400 0.0179432 -0.0294689 0.0195101 1 0 1 1 0 0 +EDGE2 1420 1401 -0.0737493 1.05823 1.59391 1 0 1 1 0 0 +EDGE2 1420 1419 -0.948091 0.0391133 -0.00307353 1 0 1 1 0 0 +EDGE2 1420 1399 -0.988484 -0.125854 0.0216857 1 0 1 1 0 0 +EDGE2 1421 1420 -0.902021 0.000994707 -1.60465 1 0 1 1 0 0 +EDGE2 1421 1400 -0.95056 0.0604537 -1.57474 1 0 1 1 0 0 +EDGE2 1421 1401 0.00875136 -0.00677837 0.000414187 1 0 1 1 0 0 +EDGE2 1421 1402 0.944908 0.050263 0.0271172 1 0 1 1 0 0 +EDGE2 1422 1421 -1.07596 0.0131098 -0.0353202 1 0 1 1 0 0 +EDGE2 1422 1401 -1.04881 0.0688295 0.0243572 1 0 1 1 0 0 +EDGE2 1422 1402 0.0218581 -0.076914 0.00666758 1 0 1 1 0 0 +EDGE2 1422 1403 0.916945 -0.110691 -0.0125234 1 0 1 1 0 0 +EDGE2 1423 1422 -1.07233 -0.0371105 -0.00594416 1 0 1 1 0 0 +EDGE2 1423 1402 -1.06311 0.0477995 -0.0147959 1 0 1 1 0 0 +EDGE2 1423 1403 -0.0607796 0.0703621 -0.00907161 1 0 1 1 0 0 +EDGE2 1423 1404 0.92779 -0.0603331 0.00909589 1 0 1 1 0 0 +EDGE2 1424 1423 -1.05177 -0.0294616 0.0150152 1 0 1 1 0 0 +EDGE2 1424 1403 -1.07714 0.0213732 0.0165281 1 0 1 1 0 0 +EDGE2 1424 1404 -0.110418 0.0103907 -0.00462103 1 0 1 1 0 0 +EDGE2 1424 1405 1.04536 -0.114819 0.0563655 1 0 1 1 0 0 +EDGE2 1425 1424 -1.08063 0.13883 0.0438057 1 0 1 1 0 0 +EDGE2 1425 1404 -0.997207 -0.062562 0.0134781 1 0 1 1 0 0 +EDGE2 1425 1405 0.00506186 0.0370806 0.0142071 1 0 1 1 0 0 +EDGE2 1425 1406 0.0373999 1.05798 1.58722 1 0 1 1 0 0 +EDGE2 1426 1425 -0.917228 -0.0371072 -1.54197 1 0 1 1 0 0 +EDGE2 1426 1405 -0.952534 -0.0119537 -1.59986 1 0 1 1 0 0 +EDGE2 1426 1406 0.0580174 0.00907748 -0.00170692 1 0 1 1 0 0 +EDGE2 1426 1407 1.04253 -0.0953457 -0.052206 1 0 1 1 0 0 +EDGE2 1427 1426 -1.01072 0.0669964 -0.003476 1 0 1 1 0 0 +EDGE2 1427 1406 -0.952187 -0.0136245 -0.0512969 1 0 1 1 0 0 +EDGE2 1427 1407 0.0266039 -0.0349699 0.0402138 1 0 1 1 0 0 +EDGE2 1427 1408 1.01231 0.0595043 0.016695 1 0 1 1 0 0 +EDGE2 1428 1427 -1.09557 0.0862934 0.0038267 1 0 1 1 0 0 +EDGE2 1428 1407 -1.0687 0.00415598 -0.00153509 1 0 1 1 0 0 +EDGE2 1428 1408 -0.0412662 0.0255022 -0.0244777 1 0 1 1 0 0 +EDGE2 1428 1409 1.04809 -0.0880203 -0.0287118 1 0 1 1 0 0 +EDGE2 1429 1428 -1.00597 0.0666684 0.00447724 1 0 1 1 0 0 +EDGE2 1429 1408 -0.971979 0.00639482 -0.0269593 1 0 1 1 0 0 +EDGE2 1429 1409 0.015765 -0.0698861 -0.028796 1 0 1 1 0 0 +EDGE2 1429 1390 0.949844 0.0817035 -3.12115 1 0 1 1 0 0 +EDGE2 1429 1410 1.00944 -0.0262732 -0.0193393 1 0 1 1 0 0 +EDGE2 1430 1429 -1.02699 0.0529341 0.020478 1 0 1 1 0 0 +EDGE2 1430 1409 -1.10325 -0.0166073 -0.0355365 1 0 1 1 0 0 +EDGE2 1430 1391 0.129183 0.932736 1.55083 1 0 1 1 0 0 +EDGE2 1430 1411 0.122019 1.04511 1.5561 1 0 1 1 0 0 +EDGE2 1430 1390 -0.0931846 0.00903895 -3.11528 1 0 1 1 0 0 +EDGE2 1430 1410 0.03029 0.0581652 0.0268903 1 0 1 1 0 0 +EDGE2 1430 1389 0.870844 -0.0610926 -3.13091 1 0 1 1 0 0 +EDGE2 1431 1392 0.917702 0.0430793 0.0124016 1 0 1 1 0 0 +EDGE2 1431 1412 1.0362 -0.0423208 0.00306961 1 0 1 1 0 0 +EDGE2 1431 1391 0.0764833 -0.0439417 0.0219651 1 0 1 1 0 0 +EDGE2 1431 1411 0.0406721 0.0908839 -0.0265842 1 0 1 1 0 0 +EDGE2 1431 1390 -0.911523 -0.104346 1.56287 1 0 1 1 0 0 +EDGE2 1431 1410 -1.03622 -0.0325102 -1.60142 1 0 1 1 0 0 +EDGE2 1431 1430 -0.958509 0.0152587 -1.56831 1 0 1 1 0 0 +EDGE2 1432 1393 1.04074 0.086363 -0.00579808 1 0 1 1 0 0 +EDGE2 1432 1413 1.04406 -0.0464985 -0.00739889 1 0 1 1 0 0 +EDGE2 1432 1392 0.0984707 0.0562948 0.0191231 1 0 1 1 0 0 +EDGE2 1432 1412 -0.0642717 -0.053982 -0.0134026 1 0 1 1 0 0 +EDGE2 1432 1391 -1.09252 -0.0421273 0.00788659 1 0 1 1 0 0 +EDGE2 1432 1411 -1.01774 -0.0850906 0.0173714 1 0 1 1 0 0 +EDGE2 1432 1431 -0.892495 0.00469868 -0.0114108 1 0 1 1 0 0 +EDGE2 1433 1394 1.08645 -0.0414362 -0.0081335 1 0 1 1 0 0 +EDGE2 1433 1414 0.953066 -0.0719693 -0.00189212 1 0 1 1 0 0 +EDGE2 1433 1432 -0.999421 0.0568748 -0.00949472 1 0 1 1 0 0 +EDGE2 1433 1393 0.0214907 0.0316983 0.00371922 1 0 1 1 0 0 +EDGE2 1433 1413 0.0157398 -0.00391103 0.0118984 1 0 1 1 0 0 +EDGE2 1433 1392 -0.893914 -0.049281 -0.010336 1 0 1 1 0 0 +EDGE2 1433 1412 -1.04601 -0.000208887 0.0213236 1 0 1 1 0 0 +EDGE2 1434 1433 -1.04012 -0.0355851 -0.0149737 1 0 1 1 0 0 +EDGE2 1434 1395 1.0556 0.0397592 -0.0123556 1 0 1 1 0 0 +EDGE2 1434 1415 0.99812 -0.0222638 -0.0221763 1 0 1 1 0 0 +EDGE2 1434 1394 0.0527497 -0.0638121 0.00759312 1 0 1 1 0 0 +EDGE2 1434 1414 0.043526 0.105016 0.0122982 1 0 1 1 0 0 +EDGE2 1434 1393 -1.00873 -0.00230292 0.0208638 1 0 1 1 0 0 +EDGE2 1434 1413 -0.984007 0.0583332 0.0124564 1 0 1 1 0 0 +EDGE2 1435 1416 -0.0696512 1.02483 1.54463 1 0 1 1 0 0 +EDGE2 1435 1396 -0.0330313 0.957257 1.57418 1 0 1 1 0 0 +EDGE2 1435 1434 -0.978669 0.0162581 -0.0221339 1 0 1 1 0 0 +EDGE2 1435 1395 0.0262498 0.102004 -0.0130479 1 0 1 1 0 0 +EDGE2 1435 1415 0.0923454 -0.0579428 -0.00989165 1 0 1 1 0 0 +EDGE2 1435 1394 -1.03552 0.00500888 0.00222638 1 0 1 1 0 0 +EDGE2 1435 1414 -0.959028 0.0116371 -0.030827 1 0 1 1 0 0 +EDGE2 1436 1417 0.936879 0.0721455 -0.0156758 1 0 1 1 0 0 +EDGE2 1436 1435 -0.947618 -0.0558031 -1.55739 1 0 1 1 0 0 +EDGE2 1436 1416 -0.0524748 -0.0265368 0.00416359 1 0 1 1 0 0 +EDGE2 1436 1397 1.00456 0.0382765 -0.0178174 1 0 1 1 0 0 +EDGE2 1436 1396 0.0264257 0.0221418 -0.00817294 1 0 1 1 0 0 +EDGE2 1436 1395 -1.02947 -0.0355655 -1.61942 1 0 1 1 0 0 +EDGE2 1436 1415 -1.00143 0.0200883 -1.60356 1 0 1 1 0 0 +EDGE2 1437 1417 0.0468833 0.0937302 -0.00215076 1 0 1 1 0 0 +EDGE2 1437 1398 1.06362 -0.132037 -0.0219956 1 0 1 1 0 0 +EDGE2 1437 1418 1.00995 -0.103521 0.0325923 1 0 1 1 0 0 +EDGE2 1437 1416 -1.00987 -0.0233992 0.00403165 1 0 1 1 0 0 +EDGE2 1437 1397 0.0438405 0.0732055 0.00828089 1 0 1 1 0 0 +EDGE2 1437 1436 -0.958355 -0.0400843 0.0239915 1 0 1 1 0 0 +EDGE2 1437 1396 -1.01411 0.0284715 0.0151197 1 0 1 1 0 0 +EDGE2 1438 1417 -1.01238 -0.0434399 0.0203436 1 0 1 1 0 0 +EDGE2 1438 1419 0.963762 -0.0398303 -0.00138025 1 0 1 1 0 0 +EDGE2 1438 1399 0.9761 -0.0077305 -0.00969676 1 0 1 1 0 0 +EDGE2 1438 1398 0.0265989 0.0652574 -0.0361125 1 0 1 1 0 0 +EDGE2 1438 1418 -0.0406613 0.00527645 0.00606838 1 0 1 1 0 0 +EDGE2 1438 1437 -1.03318 -0.0501932 0.00547655 1 0 1 1 0 0 +EDGE2 1438 1397 -1.03569 0.053879 0.0206183 1 0 1 1 0 0 +EDGE2 1439 1420 0.934352 -0.0143428 -0.00244171 1 0 1 1 0 0 +EDGE2 1439 1400 1.0336 0.0715235 -0.011632 1 0 1 1 0 0 +EDGE2 1439 1419 0.0321902 0.075002 -0.0133982 1 0 1 1 0 0 +EDGE2 1439 1399 -0.00202495 -0.0654425 0.00355319 1 0 1 1 0 0 +EDGE2 1439 1398 -1.01681 0.0146615 -0.00506847 1 0 1 1 0 0 +EDGE2 1439 1438 -0.990099 -0.0131808 -0.00493333 1 0 1 1 0 0 +EDGE2 1439 1418 -1.06558 -0.0106914 -0.0209555 1 0 1 1 0 0 +EDGE2 1440 1420 0.0610393 0.100228 -0.00422258 1 0 1 1 0 0 +EDGE2 1440 1400 0.0053484 -0.0331247 0.00392034 1 0 1 1 0 0 +EDGE2 1440 1421 0.0144177 0.950941 1.58763 1 0 1 1 0 0 +EDGE2 1440 1401 0.0268327 0.96357 1.56208 1 0 1 1 0 0 +EDGE2 1440 1419 -0.951733 0.0764858 -0.000484885 1 0 1 1 0 0 +EDGE2 1440 1439 -0.993694 0.0061807 -0.0193929 1 0 1 1 0 0 +EDGE2 1440 1399 -1.00402 0.00662138 -0.0106126 1 0 1 1 0 0 +EDGE2 1441 1422 1.00761 -0.0793607 -0.0183926 1 0 1 1 0 0 +EDGE2 1441 1420 -0.959345 -0.0302215 -1.57421 1 0 1 1 0 0 +EDGE2 1441 1440 -0.966801 0.0641459 -1.5747 1 0 1 1 0 0 +EDGE2 1441 1400 -1.00563 0.00691543 -1.58316 1 0 1 1 0 0 +EDGE2 1441 1421 0.0145529 0.00963328 -0.0371885 1 0 1 1 0 0 +EDGE2 1441 1401 0.00383964 -0.0250168 -0.0203657 1 0 1 1 0 0 +EDGE2 1441 1402 0.991091 -0.0243981 0.0376495 1 0 1 1 0 0 +EDGE2 1442 1422 0.0016409 -0.0109985 -0.0106503 1 0 1 1 0 0 +EDGE2 1442 1421 -1.02305 0.0740068 0.0107457 1 0 1 1 0 0 +EDGE2 1442 1441 -1.01773 -0.0148015 -0.0351793 1 0 1 1 0 0 +EDGE2 1442 1401 -1.01783 0.00544769 0.00625273 1 0 1 1 0 0 +EDGE2 1442 1423 1.09905 0.0639859 -0.00827853 1 0 1 1 0 0 +EDGE2 1442 1402 -0.0418372 0.0257429 -0.0115882 1 0 1 1 0 0 +EDGE2 1442 1403 1.01829 0.0200915 -0.0515216 1 0 1 1 0 0 +EDGE2 1443 1422 -0.94146 0.0594625 -0.00418781 1 0 1 1 0 0 +EDGE2 1443 1442 -1.05926 -0.051974 -0.00985434 1 0 1 1 0 0 +EDGE2 1443 1423 0.00998992 -0.0705581 -0.00582875 1 0 1 1 0 0 +EDGE2 1443 1402 -1.01725 0.0418858 -0.00058508 1 0 1 1 0 0 +EDGE2 1443 1424 1.01025 -0.0197274 -0.0206359 1 0 1 1 0 0 +EDGE2 1443 1403 -0.00836615 -0.0206752 -0.000790697 1 0 1 1 0 0 +EDGE2 1443 1404 0.999804 0.030764 -0.00217182 1 0 1 1 0 0 +EDGE2 1444 1423 -0.990644 0.0573816 -0.0147483 1 0 1 1 0 0 +EDGE2 1444 1443 -0.951547 -0.0368273 0.0113029 1 0 1 1 0 0 +EDGE2 1444 1425 1.02407 0.0517736 0.00122166 1 0 1 1 0 0 +EDGE2 1444 1424 -0.0357991 -0.0451129 0.0277591 1 0 1 1 0 0 +EDGE2 1444 1403 -1.06242 0.0312884 0.00495345 1 0 1 1 0 0 +EDGE2 1444 1404 -0.0383649 0.00593117 0.0117277 1 0 1 1 0 0 +EDGE2 1444 1405 0.96633 -0.0495388 0.0146108 1 0 1 1 0 0 +EDGE2 1445 1425 -0.039544 -0.00392778 -0.0170054 1 0 1 1 0 0 +EDGE2 1445 1424 -1.03837 0.048822 0.00245508 1 0 1 1 0 0 +EDGE2 1445 1444 -0.970755 -0.00514329 0.0216378 1 0 1 1 0 0 +EDGE2 1445 1404 -0.953685 -0.0129753 -0.0373018 1 0 1 1 0 0 +EDGE2 1445 1405 0.130496 -0.00628971 -0.0216959 1 0 1 1 0 0 +EDGE2 1445 1426 0.00226478 1.02787 1.60333 1 0 1 1 0 0 +EDGE2 1445 1406 0.0359525 0.979474 1.57403 1 0 1 1 0 0 +EDGE2 1446 1425 -1.09221 0.0738035 -1.58195 1 0 1 1 0 0 +EDGE2 1446 1445 -1.03228 0.0282603 -1.58961 1 0 1 1 0 0 +EDGE2 1446 1405 -0.97903 -0.00767078 -1.57669 1 0 1 1 0 0 +EDGE2 1446 1426 -0.0466636 -0.0644427 -0.046166 1 0 1 1 0 0 +EDGE2 1446 1406 0.0219177 0.0778148 0.0156409 1 0 1 1 0 0 +EDGE2 1446 1427 1.03002 -0.00908111 -0.000255576 1 0 1 1 0 0 +EDGE2 1446 1407 0.98644 0.0750513 0.00201343 1 0 1 1 0 0 +EDGE2 1447 1426 -1.00175 0.0270809 0.00268331 1 0 1 1 0 0 +EDGE2 1447 1446 -1.02515 -0.104543 -0.00595696 1 0 1 1 0 0 +EDGE2 1447 1406 -1.01613 -0.0322862 -0.0017824 1 0 1 1 0 0 +EDGE2 1447 1427 0.00839241 0.0290578 0.0310686 1 0 1 1 0 0 +EDGE2 1447 1407 -0.0533239 0.0234152 0.0337634 1 0 1 1 0 0 +EDGE2 1447 1428 0.976701 -0.00971964 0.00843971 1 0 1 1 0 0 +EDGE2 1447 1408 1.04934 -0.0619349 -0.0334817 1 0 1 1 0 0 +EDGE2 1448 1427 -1.0235 -0.0115406 0.00284483 1 0 1 1 0 0 +EDGE2 1448 1447 -1.0258 -0.121594 -0.00256067 1 0 1 1 0 0 +EDGE2 1448 1407 -1.02679 -0.0599981 -0.0200526 1 0 1 1 0 0 +EDGE2 1448 1428 -0.133699 -0.00269992 -0.0295002 1 0 1 1 0 0 +EDGE2 1448 1408 -0.0521084 0.0263955 -0.00974242 1 0 1 1 0 0 +EDGE2 1448 1429 1.01133 0.0377233 0.00599614 1 0 1 1 0 0 +EDGE2 1448 1409 1.02124 -0.0384333 -0.0241879 1 0 1 1 0 0 +EDGE2 1449 1428 -0.966149 0.0121067 0.0193942 1 0 1 1 0 0 +EDGE2 1449 1448 -0.93826 -0.0580755 -0.00568555 1 0 1 1 0 0 +EDGE2 1449 1408 -0.985445 -0.0176348 -0.0214872 1 0 1 1 0 0 +EDGE2 1449 1429 -0.0606425 0.0353216 0.0135928 1 0 1 1 0 0 +EDGE2 1449 1409 0.058242 -0.0348412 -0.00709394 1 0 1 1 0 0 +EDGE2 1449 1390 1.0875 0.0538165 -3.1343 1 0 1 1 0 0 +EDGE2 1449 1410 1.02833 0.094118 -0.00177337 1 0 1 1 0 0 +EDGE2 1449 1430 0.981959 -0.0574138 -0.00541794 1 0 1 1 0 0 +EDGE2 1450 1429 -0.994057 -0.0127088 0.00877562 1 0 1 1 0 0 +EDGE2 1450 1449 -1.0545 0.00369397 -0.0145408 1 0 1 1 0 0 +EDGE2 1450 1409 -1.00664 -0.0576477 0.0096285 1 0 1 1 0 0 +EDGE2 1450 1391 -0.0144596 1.07443 1.5588 1 0 1 1 0 0 +EDGE2 1450 1411 -0.0102173 0.997255 1.58788 1 0 1 1 0 0 +EDGE2 1450 1431 -0.0603176 0.923885 1.60186 1 0 1 1 0 0 +EDGE2 1450 1390 -0.0939015 -0.0170977 -3.15271 1 0 1 1 0 0 +EDGE2 1450 1410 0.00272003 -0.0445664 0.00733956 1 0 1 1 0 0 +EDGE2 1450 1430 0.188776 -0.00547713 0.00831065 1 0 1 1 0 0 +EDGE2 1450 1389 1.04346 -0.0690771 -3.13711 1 0 1 1 0 0 +EDGE2 1451 1432 1.01112 0.0158725 0.00206386 1 0 1 1 0 0 +EDGE2 1451 1392 1.00372 0.00178802 0.0098921 1 0 1 1 0 0 +EDGE2 1451 1412 0.975696 -0.0408669 0.0187743 1 0 1 1 0 0 +EDGE2 1451 1450 -0.979951 -0.0370772 -1.54764 1 0 1 1 0 0 +EDGE2 1451 1391 -0.0380789 -0.0189009 -0.0193612 1 0 1 1 0 0 +EDGE2 1451 1411 -0.0945491 -0.0632134 -0.0195496 1 0 1 1 0 0 +EDGE2 1451 1431 0.0639935 -0.041385 -0.0346729 1 0 1 1 0 0 +EDGE2 1451 1390 -1.00092 0.0452582 1.54288 1 0 1 1 0 0 +EDGE2 1451 1410 -1.11316 -0.0141491 -1.58235 1 0 1 1 0 0 +EDGE2 1451 1430 -0.964461 -0.00996794 -1.55728 1 0 1 1 0 0 +EDGE2 1452 1451 -0.963168 0.0642619 -0.00298169 1 0 1 1 0 0 +EDGE2 1452 1433 1.16092 -0.0257638 -0.0138811 1 0 1 1 0 0 +EDGE2 1452 1432 0.0595954 0.0242095 0.025111 1 0 1 1 0 0 +EDGE2 1452 1393 0.95748 -0.107475 -0.0178845 1 0 1 1 0 0 +EDGE2 1452 1413 1.0051 0.037234 0.00823419 1 0 1 1 0 0 +EDGE2 1452 1392 -0.0809704 0.0259018 -0.0460732 1 0 1 1 0 0 +EDGE2 1452 1412 0.0251018 -0.0045393 0.0128932 1 0 1 1 0 0 +EDGE2 1452 1391 -1.01649 0.0261694 -0.0145 1 0 1 1 0 0 +EDGE2 1452 1411 -1.00513 -0.0466797 -0.00270675 1 0 1 1 0 0 +EDGE2 1452 1431 -1.0266 -0.101842 0.043689 1 0 1 1 0 0 +EDGE2 1453 1433 -0.0653559 0.0123233 0.0136941 1 0 1 1 0 0 +EDGE2 1453 1434 0.999952 -0.0674294 0.00488594 1 0 1 1 0 0 +EDGE2 1453 1394 0.968669 -0.0317601 0.00486547 1 0 1 1 0 0 +EDGE2 1453 1414 1.061 -0.0255017 0.0462007 1 0 1 1 0 0 +EDGE2 1453 1432 -1.00518 -0.0721908 0.00877087 1 0 1 1 0 0 +EDGE2 1453 1393 0.0335128 -0.0397498 -0.00966472 1 0 1 1 0 0 +EDGE2 1453 1413 0.0793236 0.0072354 0.000727376 1 0 1 1 0 0 +EDGE2 1453 1452 -0.976097 0.0163926 0.0366382 1 0 1 1 0 0 +EDGE2 1453 1392 -1.06543 0.0626283 -0.0325124 1 0 1 1 0 0 +EDGE2 1453 1412 -1.06422 0.015575 0.00312972 1 0 1 1 0 0 +EDGE2 1454 1435 0.98579 0.00323905 0.00277697 1 0 1 1 0 0 +EDGE2 1454 1433 -1.10612 -0.0165811 0.00127847 1 0 1 1 0 0 +EDGE2 1454 1434 0.0263016 -0.0598339 0.0188309 1 0 1 1 0 0 +EDGE2 1454 1395 1.05013 -0.0462893 0.0252744 1 0 1 1 0 0 +EDGE2 1454 1415 0.880036 0.0525337 0.021577 1 0 1 1 0 0 +EDGE2 1454 1394 -0.0015872 -0.0121929 -0.00949182 1 0 1 1 0 0 +EDGE2 1454 1414 0.0362545 -0.00959178 0.0268519 1 0 1 1 0 0 +EDGE2 1454 1453 -0.923971 -0.0405206 -0.0252663 1 0 1 1 0 0 +EDGE2 1454 1393 -1.17012 -0.14967 0.0388214 1 0 1 1 0 0 +EDGE2 1454 1413 -1.01516 -0.0221861 0.00803145 1 0 1 1 0 0 +EDGE2 1455 1435 0.0451709 -0.00968431 0.00492025 1 0 1 1 0 0 +EDGE2 1455 1416 0.0198009 1.08985 1.57581 1 0 1 1 0 0 +EDGE2 1455 1436 0.0327616 1.16443 1.54337 1 0 1 1 0 0 +EDGE2 1455 1396 0.0147145 1.02118 1.56011 1 0 1 1 0 0 +EDGE2 1455 1434 -1.008 0.0719912 0.015671 1 0 1 1 0 0 +EDGE2 1455 1395 0.0261442 -0.0103065 -0.0206529 1 0 1 1 0 0 +EDGE2 1455 1415 0.0213857 -0.0817363 -0.0156583 1 0 1 1 0 0 +EDGE2 1455 1454 -0.976802 0.0131998 -0.0194688 1 0 1 1 0 0 +EDGE2 1455 1394 -1.0707 -0.000889939 -0.0172369 1 0 1 1 0 0 +EDGE2 1455 1414 -0.989037 -0.0205396 0.0116914 1 0 1 1 0 0 +EDGE2 1456 1435 -1.01033 -0.06476 1.55398 1 0 1 1 0 0 +EDGE2 1456 1455 -0.925906 0.0041833 1.57752 1 0 1 1 0 0 +EDGE2 1456 1395 -1.00605 -0.0169842 1.55414 1 0 1 1 0 0 +EDGE2 1456 1415 -0.946212 0.082494 1.5543 1 0 1 1 0 0 +EDGE2 1457 1456 -0.934021 0.0411462 0.0240927 1 0 1 1 0 0 +EDGE2 1458 1457 -1.00197 -0.053531 -0.0501063 1 0 1 1 0 0 +EDGE2 1459 1458 -1.00651 0.0423305 -0.0109674 1 0 1 1 0 0 +EDGE2 1460 1459 -1.10742 0.029416 0.00997911 1 0 1 1 0 0 +EDGE2 1461 1460 -0.975895 -0.0638793 1.57495 1 0 1 1 0 0 +EDGE2 1462 1461 -1.03826 0.0330489 -0.0146662 1 0 1 1 0 0 +EDGE2 1463 1462 -0.990055 0.00411477 -0.00710688 1 0 1 1 0 0 +EDGE2 1464 1463 -0.948641 0.0441538 -0.0330818 1 0 1 1 0 0 +EDGE2 1464 1385 0.998296 -0.00126853 -3.14649 1 0 1 1 0 0 +EDGE2 1465 1386 -0.135297 -1.00182 -1.58095 1 0 1 1 0 0 +EDGE2 1465 1464 -1.00043 -0.097872 0.0269186 1 0 1 1 0 0 +EDGE2 1465 1385 0.0162934 -0.0451138 -3.14271 1 0 1 1 0 0 +EDGE2 1465 1384 0.978255 -0.0323176 -3.17623 1 0 1 1 0 0 +EDGE2 1466 1385 -0.978773 -0.0156858 1.57299 1 0 1 1 0 0 +EDGE2 1466 1465 -1.0008 0.0061414 -1.55412 1 0 1 1 0 0 +EDGE2 1467 1466 -0.982991 -0.00642121 -0.00846475 1 0 1 1 0 0 +EDGE2 1468 1467 -0.935436 -0.0985475 -0.0171448 1 0 1 1 0 0 +EDGE2 1469 1468 -1.01442 0.103587 0.0217626 1 0 1 1 0 0 +EDGE2 1469 1370 1.12327 -0.0542387 -3.14604 1 0 1 1 0 0 +EDGE2 1470 1469 -1.06557 0.0516219 0.0139888 1 0 1 1 0 0 +EDGE2 1470 1370 -0.00931647 -0.125727 -3.14938 1 0 1 1 0 0 +EDGE2 1470 1371 -0.0493432 -0.966014 -1.55415 1 0 1 1 0 0 +EDGE2 1470 1369 1.01137 0.136325 -3.15014 1 0 1 1 0 0 +EDGE2 1471 1470 -1.15729 0.0402897 -1.59325 1 0 1 1 0 0 +EDGE2 1471 1370 -0.912769 0.0532937 1.60857 1 0 1 1 0 0 +EDGE2 1472 1471 -0.997481 0.0769557 -0.0225578 1 0 1 1 0 0 +EDGE2 1473 1472 -1.02694 0.0392098 0.00184765 1 0 1 1 0 0 +EDGE2 1474 1473 -0.995158 0.0270905 0.00290354 1 0 1 1 0 0 +EDGE2 1475 1474 -0.917806 -0.0729607 -0.0118978 1 0 1 1 0 0 +EDGE2 1476 1475 -0.940316 -0.0602826 1.57592 1 0 1 1 0 0 +EDGE2 1477 1476 -1.00532 0.0467327 -0.00914547 1 0 1 1 0 0 +EDGE2 1478 1477 -0.941142 -0.0297715 0.0310275 1 0 1 1 0 0 +EDGE2 1479 1478 -0.989199 0.0328251 0.0106019 1 0 1 1 0 0 +EDGE2 1479 1360 1.03465 0.0485249 -3.11663 1 0 1 1 0 0 +EDGE2 1479 1340 0.864841 -0.0499372 -3.14668 1 0 1 1 0 0 +EDGE2 1480 1360 0.0881081 0.00732066 -3.11534 1 0 1 1 0 0 +EDGE2 1480 1479 -0.996629 0.00654223 0.0107694 1 0 1 1 0 0 +EDGE2 1480 1340 -0.0475778 -0.0268024 -3.13994 1 0 1 1 0 0 +EDGE2 1480 1341 -0.0238054 -0.953005 -1.58377 1 0 1 1 0 0 +EDGE2 1480 1361 -0.031133 -0.999395 -1.58051 1 0 1 1 0 0 +EDGE2 1480 1359 1.06286 -0.0971957 -3.1371 1 0 1 1 0 0 +EDGE2 1480 1339 0.922558 0.0279759 -3.13693 1 0 1 1 0 0 +EDGE2 1481 1360 -1.02619 0.00667421 -1.58607 1 0 1 1 0 0 +EDGE2 1481 1480 -0.95742 -0.0699437 1.59137 1 0 1 1 0 0 +EDGE2 1481 1340 -1.04578 -0.0516835 -1.55078 1 0 1 1 0 0 +EDGE2 1481 1341 0.0877786 0.0214267 0.0485011 1 0 1 1 0 0 +EDGE2 1481 1361 0.0405758 -0.0278559 0.0144046 1 0 1 1 0 0 +EDGE2 1481 1342 0.984593 0.029347 -0.00595053 1 0 1 1 0 0 +EDGE2 1481 1362 0.888675 -0.110708 0.00711509 1 0 1 1 0 0 +EDGE2 1482 1481 -0.91361 -0.0147872 -0.0149159 1 0 1 1 0 0 +EDGE2 1482 1341 -1.04603 0.021455 0.0238936 1 0 1 1 0 0 +EDGE2 1482 1361 -0.986815 -0.0672935 0.00707003 1 0 1 1 0 0 +EDGE2 1482 1342 0.0719496 0.0305393 -0.00313778 1 0 1 1 0 0 +EDGE2 1482 1362 -0.0129005 -0.0540676 -0.0100062 1 0 1 1 0 0 +EDGE2 1482 1363 0.961012 0.0116366 -0.0350238 1 0 1 1 0 0 +EDGE2 1482 1343 1.02497 0.0440075 0.0167483 1 0 1 1 0 0 +EDGE2 1483 1342 -0.996979 0.0187549 -0.0408229 1 0 1 1 0 0 +EDGE2 1483 1362 -1.05038 -0.0257098 -0.0209761 1 0 1 1 0 0 +EDGE2 1483 1482 -1.04089 -0.0767666 0.0161934 1 0 1 1 0 0 +EDGE2 1483 1363 -0.0499466 -0.0368713 -0.00147964 1 0 1 1 0 0 +EDGE2 1483 1343 0.04333 0.00274031 0.0154039 1 0 1 1 0 0 +EDGE2 1483 1344 0.995913 -0.0911829 0.0333302 1 0 1 1 0 0 +EDGE2 1483 1364 1.00275 0.044654 0.0190997 1 0 1 1 0 0 +EDGE2 1484 1345 0.924374 -0.0327527 -0.000457382 1 0 1 1 0 0 +EDGE2 1484 1363 -0.978037 -0.0353071 0.0159152 1 0 1 1 0 0 +EDGE2 1484 1483 -0.92903 0.0268831 -0.0201811 1 0 1 1 0 0 +EDGE2 1484 1343 -0.998358 0.0590811 0.0135277 1 0 1 1 0 0 +EDGE2 1484 1344 -0.071825 0.0337738 -0.0229687 1 0 1 1 0 0 +EDGE2 1484 1364 -0.0263768 0.00692072 -0.00287641 1 0 1 1 0 0 +EDGE2 1484 1365 0.978305 -0.0523701 0.00784062 1 0 1 1 0 0 +EDGE2 1484 1325 0.968239 0.099999 -3.13308 1 0 1 1 0 0 +EDGE2 1485 1345 -0.0148392 -0.0373513 0.000294961 1 0 1 1 0 0 +EDGE2 1485 1366 0.133906 -0.947632 -1.5602 1 0 1 1 0 0 +EDGE2 1485 1344 -0.981517 -0.0687294 0.00186234 1 0 1 1 0 0 +EDGE2 1485 1484 -1.02717 0.0437295 0.014048 1 0 1 1 0 0 +EDGE2 1485 1364 -0.996191 0.0903753 0.0137956 1 0 1 1 0 0 +EDGE2 1485 1365 -0.0677235 -0.0175548 -0.0510388 1 0 1 1 0 0 +EDGE2 1485 1325 0.0392124 -0.0261567 -3.15894 1 0 1 1 0 0 +EDGE2 1485 1324 1.09134 -0.0483739 -3.14697 1 0 1 1 0 0 +EDGE2 1485 1326 -0.0151049 0.976352 1.56762 1 0 1 1 0 0 +EDGE2 1485 1346 0.0836309 0.901271 1.56353 1 0 1 1 0 0 +EDGE2 1486 1345 -0.955553 0.0358454 -1.56577 1 0 1 1 0 0 +EDGE2 1486 1485 -1.02155 -0.0215253 -1.59164 1 0 1 1 0 0 +EDGE2 1486 1365 -1.03523 -0.0421213 -1.53225 1 0 1 1 0 0 +EDGE2 1486 1325 -1.06877 0.00230485 1.55366 1 0 1 1 0 0 +EDGE2 1486 1327 0.981786 -0.00526716 -0.0404644 1 0 1 1 0 0 +EDGE2 1486 1326 0.0159369 0.0348503 -0.00800128 1 0 1 1 0 0 +EDGE2 1486 1346 -0.00520987 0.000500701 0.0142329 1 0 1 1 0 0 +EDGE2 1486 1347 1.02565 -0.0113978 0.00106761 1 0 1 1 0 0 +EDGE2 1487 1327 0.0359206 -0.00884684 -0.000398893 1 0 1 1 0 0 +EDGE2 1487 1486 -0.888348 0.0798109 0.00805023 1 0 1 1 0 0 +EDGE2 1487 1326 -0.97444 -0.0221509 0.0204537 1 0 1 1 0 0 +EDGE2 1487 1346 -1.04768 0.0470469 -0.0128215 1 0 1 1 0 0 +EDGE2 1487 1347 -0.00294071 0.0905017 0.0171303 1 0 1 1 0 0 +EDGE2 1487 1348 1.0069 -0.00352116 0.0164423 1 0 1 1 0 0 +EDGE2 1487 1328 1.02483 -0.00216996 -0.0286887 1 0 1 1 0 0 +EDGE2 1488 1327 -0.920626 0.0191356 -0.0126988 1 0 1 1 0 0 +EDGE2 1488 1487 -0.936826 -0.0023147 -0.0186652 1 0 1 1 0 0 +EDGE2 1488 1347 -0.983847 0.0743785 0.0634151 1 0 1 1 0 0 +EDGE2 1488 1348 -0.0616318 -0.00825476 0.0355534 1 0 1 1 0 0 +EDGE2 1488 1328 0.0423008 0.0320478 0.0101801 1 0 1 1 0 0 +EDGE2 1488 1349 1.07888 0.0228671 0.00897162 1 0 1 1 0 0 +EDGE2 1488 1329 0.966647 -0.0245744 -0.00267182 1 0 1 1 0 0 +EDGE2 1489 1348 -1.09413 -0.00821366 -0.0232869 1 0 1 1 0 0 +EDGE2 1489 1488 -0.912992 0.0550606 -0.0117738 1 0 1 1 0 0 +EDGE2 1489 1328 -0.998652 0.0669824 0.00103163 1 0 1 1 0 0 +EDGE2 1489 1349 0.00555756 -0.0930914 -0.00412938 1 0 1 1 0 0 +EDGE2 1489 1329 0.0125033 -0.0233323 -0.0268922 1 0 1 1 0 0 +EDGE2 1489 1330 0.955778 -0.0698191 -0.0184421 1 0 1 1 0 0 +EDGE2 1489 1350 0.931622 -0.070517 -0.0233207 1 0 1 1 0 0 +EDGE2 1490 1349 -0.959938 0.0207453 -0.0310064 1 0 1 1 0 0 +EDGE2 1490 1489 -1.02207 -0.0210836 0.016373 1 0 1 1 0 0 +EDGE2 1490 1329 -1.10368 -0.0540824 0.0264731 1 0 1 1 0 0 +EDGE2 1490 1331 0.0067316 1.03047 1.59226 1 0 1 1 0 0 +EDGE2 1490 1351 -0.0335636 0.9118 1.60751 1 0 1 1 0 0 +EDGE2 1490 1330 0.0164201 -0.0217046 -0.0160382 1 0 1 1 0 0 +EDGE2 1490 1350 0.0130894 -0.0361681 0.00193 1 0 1 1 0 0 +EDGE2 1491 1352 0.958482 -0.0653974 0.0121837 1 0 1 1 0 0 +EDGE2 1491 1332 1.06832 0.0870172 -0.0205165 1 0 1 1 0 0 +EDGE2 1491 1331 -0.0477742 -0.0789088 0.0168827 1 0 1 1 0 0 +EDGE2 1491 1351 -0.0156028 -0.0497276 0.0231173 1 0 1 1 0 0 +EDGE2 1491 1330 -0.965963 0.127309 -1.54301 1 0 1 1 0 0 +EDGE2 1491 1350 -0.999658 -0.064361 -1.60192 1 0 1 1 0 0 +EDGE2 1491 1490 -0.939311 0.0469591 -1.55539 1 0 1 1 0 0 +EDGE2 1492 1333 1.05167 -0.0616073 0.0465015 1 0 1 1 0 0 +EDGE2 1492 1353 0.975749 -0.0167683 -0.00336271 1 0 1 1 0 0 +EDGE2 1492 1352 -0.0355625 -0.0261774 0.0225897 1 0 1 1 0 0 +EDGE2 1492 1332 0.0233501 -0.0581717 -0.0261522 1 0 1 1 0 0 +EDGE2 1492 1331 -0.932736 0.0446262 0.0200266 1 0 1 1 0 0 +EDGE2 1492 1351 -0.98367 0.0675931 -0.021885 1 0 1 1 0 0 +EDGE2 1492 1491 -1.00512 0.0639153 -0.00606975 1 0 1 1 0 0 +EDGE2 1493 1333 -0.0376768 0.00681894 0.00810843 1 0 1 1 0 0 +EDGE2 1493 1334 0.980552 -0.0179406 0.0378755 1 0 1 1 0 0 +EDGE2 1493 1354 1.05156 -0.0655653 0.00578074 1 0 1 1 0 0 +EDGE2 1493 1353 -0.0301483 0.0337579 -0.0141994 1 0 1 1 0 0 +EDGE2 1493 1352 -0.996734 -0.0172622 0.0124988 1 0 1 1 0 0 +EDGE2 1493 1492 -1.01111 0.0263373 0.0126501 1 0 1 1 0 0 +EDGE2 1493 1332 -0.987738 0.0497119 0.00501922 1 0 1 1 0 0 +EDGE2 1494 1333 -1.05693 0.0270731 0.0326382 1 0 1 1 0 0 +EDGE2 1494 1493 -1.03967 0.0813074 -0.000268309 1 0 1 1 0 0 +EDGE2 1494 1355 0.918136 -0.0149375 -0.0252615 1 0 1 1 0 0 +EDGE2 1494 1335 1.01501 0.0380009 -0.0173773 1 0 1 1 0 0 +EDGE2 1494 1334 0.0269822 -0.036596 -0.0132978 1 0 1 1 0 0 +EDGE2 1494 1354 0.0224767 0.0686616 -0.00576691 1 0 1 1 0 0 +EDGE2 1494 1353 -1.01825 0.039288 -0.00636481 1 0 1 1 0 0 +EDGE2 1495 1336 -0.0477545 0.926352 1.58237 1 0 1 1 0 0 +EDGE2 1495 1356 -0.049979 1.00646 1.58513 1 0 1 1 0 0 +EDGE2 1495 1355 0.102724 0.0222962 0.0423483 1 0 1 1 0 0 +EDGE2 1495 1335 -0.0166103 0.0225727 0.036262 1 0 1 1 0 0 +EDGE2 1495 1334 -1.03644 -0.0528309 0.0334762 1 0 1 1 0 0 +EDGE2 1495 1354 -1.11433 0.068033 0.0122736 1 0 1 1 0 0 +EDGE2 1495 1494 -0.980752 0.0875295 -0.00686417 1 0 1 1 0 0 +EDGE2 1496 1336 -0.0260534 0.0352746 -0.00972498 1 0 1 1 0 0 +EDGE2 1496 1357 0.98505 -0.0245662 0.00772981 1 0 1 1 0 0 +EDGE2 1496 1337 1.0745 0.104818 0.00615317 1 0 1 1 0 0 +EDGE2 1496 1356 -0.047732 -0.0873635 -0.0356753 1 0 1 1 0 0 +EDGE2 1496 1355 -1.0333 0.079494 -1.56047 1 0 1 1 0 0 +EDGE2 1496 1495 -1.03506 -0.027641 -1.57802 1 0 1 1 0 0 +EDGE2 1496 1335 -0.989876 -0.0654147 -1.54963 1 0 1 1 0 0 +EDGE2 1497 1336 -0.973776 0.0463971 -0.00368008 1 0 1 1 0 0 +EDGE2 1497 1358 1.02134 0.0314591 0.00570226 1 0 1 1 0 0 +EDGE2 1497 1338 1.006 0.00234409 -0.000166383 1 0 1 1 0 0 +EDGE2 1497 1357 -0.141503 0.00509374 -0.0286266 1 0 1 1 0 0 +EDGE2 1497 1337 0.00572465 -0.0230369 -0.0101363 1 0 1 1 0 0 +EDGE2 1497 1496 -1.00932 0.0471224 -0.00538576 1 0 1 1 0 0 +EDGE2 1497 1356 -0.974671 0.0485606 0.0215234 1 0 1 1 0 0 +EDGE2 1498 1359 0.966864 0.00429312 0.00759932 1 0 1 1 0 0 +EDGE2 1498 1339 1.08369 -0.103074 0.00284703 1 0 1 1 0 0 +EDGE2 1498 1358 -0.0608617 0.0194759 -0.00283589 1 0 1 1 0 0 +EDGE2 1498 1338 0.0217097 0.102207 0.0159411 1 0 1 1 0 0 +EDGE2 1498 1357 -0.90733 -0.0311293 0.0426723 1 0 1 1 0 0 +EDGE2 1498 1497 -1.03306 -0.0422975 -0.0245196 1 0 1 1 0 0 +EDGE2 1498 1337 -0.973401 0.0133753 0.0289678 1 0 1 1 0 0 +EDGE2 1499 1360 0.965155 0.0486708 0.0133557 1 0 1 1 0 0 +EDGE2 1499 1480 0.943156 -0.0601599 -3.14017 1 0 1 1 0 0 +EDGE2 1499 1340 1.02552 -0.0535392 -0.00497061 1 0 1 1 0 0 +EDGE2 1499 1359 -0.0363009 -0.0615293 0.00792173 1 0 1 1 0 0 +EDGE2 1499 1339 0.00215867 -0.0985262 -0.0112006 1 0 1 1 0 0 +EDGE2 1499 1358 -1.04795 -0.0748567 -0.0412958 1 0 1 1 0 0 +EDGE2 1499 1498 -0.981609 -0.0285085 -0.00770723 1 0 1 1 0 0 +EDGE2 1499 1338 -0.994569 -0.0737452 -0.00530188 1 0 1 1 0 0 +EDGE2 1500 1360 0.0940535 0.0283402 -0.00344168 1 0 1 1 0 0 +EDGE2 1500 1479 1.01143 0.0226888 -3.12088 1 0 1 1 0 0 +EDGE2 1500 1480 -0.0708359 -0.060186 -3.1487 1 0 1 1 0 0 +EDGE2 1500 1481 0.00640743 0.936497 1.56124 1 0 1 1 0 0 +EDGE2 1500 1340 -0.0147448 0.0432959 -0.00578344 1 0 1 1 0 0 +EDGE2 1500 1341 0.0362334 1.04743 1.56817 1 0 1 1 0 0 +EDGE2 1500 1361 -0.0728754 0.920944 1.54224 1 0 1 1 0 0 +EDGE2 1500 1359 -1.05061 -0.0551713 -0.0285484 1 0 1 1 0 0 +EDGE2 1500 1499 -1.00937 0.000769307 -0.0287457 1 0 1 1 0 0 +EDGE2 1500 1339 -1.11738 0.0217309 -0.011516 1 0 1 1 0 0 +EDGE2 1501 1360 -1.07751 -0.00720671 -1.53271 1 0 1 1 0 0 +EDGE2 1501 1500 -1.00389 0.00644942 -1.55994 1 0 1 1 0 0 +EDGE2 1501 1480 -1.00881 0.00496088 1.56066 1 0 1 1 0 0 +EDGE2 1501 1481 -0.00814676 -0.08553 0.022699 1 0 1 1 0 0 +EDGE2 1501 1340 -0.994072 0.0179393 -1.58852 1 0 1 1 0 0 +EDGE2 1501 1341 0.110726 -0.0195533 -0.00431811 1 0 1 1 0 0 +EDGE2 1501 1361 0.0343326 -0.0181183 0.0366241 1 0 1 1 0 0 +EDGE2 1501 1342 0.962596 0.0240717 0.0200572 1 0 1 1 0 0 +EDGE2 1501 1362 0.932447 0.0500748 -0.0028643 1 0 1 1 0 0 +EDGE2 1501 1482 0.916326 -0.00979606 -0.00912266 1 0 1 1 0 0 +EDGE2 1502 1481 -1.05443 -0.0502985 -0.00284885 1 0 1 1 0 0 +EDGE2 1502 1501 -0.92481 0.0563628 0.0505267 1 0 1 1 0 0 +EDGE2 1502 1341 -1.00706 -0.0229934 0.0153553 1 0 1 1 0 0 +EDGE2 1502 1361 -0.936004 -0.0632356 -0.0115893 1 0 1 1 0 0 +EDGE2 1502 1342 0.00388723 0.0218902 0.0123619 1 0 1 1 0 0 +EDGE2 1502 1362 -0.0411176 -0.0283064 6.47829e-05 1 0 1 1 0 0 +EDGE2 1502 1482 -0.012078 0.0239517 -0.0178174 1 0 1 1 0 0 +EDGE2 1502 1363 1.02585 0.0738546 -0.0374478 1 0 1 1 0 0 +EDGE2 1502 1483 0.925561 -0.0876588 -0.0267192 1 0 1 1 0 0 +EDGE2 1502 1343 1.04244 0.00167137 0.00937003 1 0 1 1 0 0 +EDGE2 1503 1502 -0.935115 0.0428508 0.0347835 1 0 1 1 0 0 +EDGE2 1503 1342 -1.002 -0.0222081 0.00557633 1 0 1 1 0 0 +EDGE2 1503 1362 -0.934706 -0.000253619 0.00497152 1 0 1 1 0 0 +EDGE2 1503 1482 -1.00277 0.0645663 -0.00582145 1 0 1 1 0 0 +EDGE2 1503 1363 -0.0102794 -0.000824727 0.00522998 1 0 1 1 0 0 +EDGE2 1503 1483 -0.00206825 -0.0164495 -0.0235056 1 0 1 1 0 0 +EDGE2 1503 1343 -0.0168369 0.0237579 -0.00679215 1 0 1 1 0 0 +EDGE2 1503 1344 0.962018 0.0189651 0.00790145 1 0 1 1 0 0 +EDGE2 1503 1484 1.0389 0.0392381 -0.0157686 1 0 1 1 0 0 +EDGE2 1503 1364 0.95638 0.0211102 0.0178891 1 0 1 1 0 0 +EDGE2 1504 1345 0.981902 0.0302395 -0.0196893 1 0 1 1 0 0 +EDGE2 1504 1363 -1.00411 0.0798513 -0.0138276 1 0 1 1 0 0 +EDGE2 1504 1483 -0.956395 0.00812948 0.0249197 1 0 1 1 0 0 +EDGE2 1504 1503 -1.01328 0.0318347 0.0108241 1 0 1 1 0 0 +EDGE2 1504 1343 -1.00184 -0.00364298 0.0120982 1 0 1 1 0 0 +EDGE2 1504 1344 -0.0814656 -0.0654313 -0.0137848 1 0 1 1 0 0 +EDGE2 1504 1484 -0.0174148 -0.000232011 0.02669 1 0 1 1 0 0 +EDGE2 1504 1364 -0.0901814 0.0135903 -0.0181016 1 0 1 1 0 0 +EDGE2 1504 1485 1.0559 0.0725422 -0.00169174 1 0 1 1 0 0 +EDGE2 1504 1365 1.0239 -0.0532863 0.0172962 1 0 1 1 0 0 +EDGE2 1504 1325 1.01199 0.0223378 -3.13477 1 0 1 1 0 0 +EDGE2 1505 1345 0.0221429 -0.055176 -0.00713296 1 0 1 1 0 0 +EDGE2 1505 1366 0.0491638 -1.03114 -1.57237 1 0 1 1 0 0 +EDGE2 1505 1344 -1.02543 0.0183303 -0.0110473 1 0 1 1 0 0 +EDGE2 1505 1484 -1.08978 -0.0136375 -0.0125342 1 0 1 1 0 0 +EDGE2 1505 1504 -0.994451 0.0212436 0.00626249 1 0 1 1 0 0 +EDGE2 1505 1364 -1.00022 -0.0315597 -0.00344204 1 0 1 1 0 0 +EDGE2 1505 1485 -0.012467 0.0190882 0.0402627 1 0 1 1 0 0 +EDGE2 1505 1365 0.0535655 -0.0609963 0.0121269 1 0 1 1 0 0 +EDGE2 1505 1325 0.0603812 -0.00415469 -3.14541 1 0 1 1 0 0 +EDGE2 1505 1324 1.0211 0.043827 -3.14647 1 0 1 1 0 0 +EDGE2 1505 1486 -0.0262201 1.03055 1.5861 1 0 1 1 0 0 +EDGE2 1505 1326 -0.0121192 1.04856 1.57068 1 0 1 1 0 0 +EDGE2 1505 1346 -0.0107154 1.03463 1.58316 1 0 1 1 0 0 +EDGE2 1506 1345 -1.07433 0.066254 1.56501 1 0 1 1 0 0 +EDGE2 1506 1367 1.01516 0.0373237 -0.0359723 1 0 1 1 0 0 +EDGE2 1506 1366 0.0080196 0.0566254 -0.0165966 1 0 1 1 0 0 +EDGE2 1506 1485 -0.960652 -0.0708724 1.59374 1 0 1 1 0 0 +EDGE2 1506 1505 -0.915255 -0.0153683 1.57964 1 0 1 1 0 0 +EDGE2 1506 1365 -0.995769 0.018498 1.57944 1 0 1 1 0 0 +EDGE2 1506 1325 -0.97048 0.072439 -1.54808 1 0 1 1 0 0 +EDGE2 1507 1368 0.951465 0.0219947 -0.0208616 1 0 1 1 0 0 +EDGE2 1507 1367 -0.0191345 0.106233 0.00609005 1 0 1 1 0 0 +EDGE2 1507 1366 -0.991659 -0.0235348 0.01272 1 0 1 1 0 0 +EDGE2 1507 1506 -1.00598 -0.0200634 -0.00131176 1 0 1 1 0 0 +EDGE2 1508 1369 0.990115 -0.00247705 -0.0238508 1 0 1 1 0 0 +EDGE2 1508 1368 -0.061406 0.0327937 0.00176321 1 0 1 1 0 0 +EDGE2 1508 1507 -0.99147 0.0188488 -0.00613596 1 0 1 1 0 0 +EDGE2 1508 1367 -1.04616 0.0579992 0.0146231 1 0 1 1 0 0 +EDGE2 1509 1470 1.04338 0.00189917 -3.143 1 0 1 1 0 0 +EDGE2 1509 1370 0.988178 -0.0131228 0.0174036 1 0 1 1 0 0 +EDGE2 1509 1369 0.0196663 -0.00117102 0.0307854 1 0 1 1 0 0 +EDGE2 1509 1368 -1.03256 -0.0254619 -0.0169731 1 0 1 1 0 0 +EDGE2 1509 1508 -0.990265 -0.0212123 0.0072172 1 0 1 1 0 0 +EDGE2 1510 1469 1.01867 -0.0127654 -3.15198 1 0 1 1 0 0 +EDGE2 1510 1471 0.00677882 -0.883929 -1.53711 1 0 1 1 0 0 +EDGE2 1510 1470 0.0490684 -0.0247903 -3.15756 1 0 1 1 0 0 +EDGE2 1510 1370 0.0372206 -0.0144359 0.0150519 1 0 1 1 0 0 +EDGE2 1510 1371 0.0638504 0.994942 1.57213 1 0 1 1 0 0 +EDGE2 1510 1509 -0.982784 0.0731365 0.00125014 1 0 1 1 0 0 +EDGE2 1510 1369 -0.967103 -0.0227948 0.0014741 1 0 1 1 0 0 +EDGE2 1511 1470 -1.01836 0.00317883 1.56301 1 0 1 1 0 0 +EDGE2 1511 1510 -0.97056 0.0678099 -1.58629 1 0 1 1 0 0 +EDGE2 1511 1370 -1.01502 -0.00263134 -1.574 1 0 1 1 0 0 +EDGE2 1511 1371 0.116009 -0.0425554 0.0148651 1 0 1 1 0 0 +EDGE2 1511 1372 1.02508 0.052457 -0.0482738 1 0 1 1 0 0 +EDGE2 1512 1371 -0.985809 0.00826469 -0.0205149 1 0 1 1 0 0 +EDGE2 1512 1511 -0.998266 -0.0228744 -0.0205707 1 0 1 1 0 0 +EDGE2 1512 1372 0.0509984 0.0419521 0.0412694 1 0 1 1 0 0 +EDGE2 1512 1373 1.03041 0.0478532 -0.0213181 1 0 1 1 0 0 +EDGE2 1513 1512 -0.941254 0.0512129 -1.53677e-05 1 0 1 1 0 0 +EDGE2 1513 1372 -0.958624 0.00409056 0.0447348 1 0 1 1 0 0 +EDGE2 1513 1373 0.0410752 0.0867794 -0.00256762 1 0 1 1 0 0 +EDGE2 1513 1374 1.0906 -0.00252837 0.000636272 1 0 1 1 0 0 +EDGE2 1514 1513 -1.04459 -0.0123558 -0.0204152 1 0 1 1 0 0 +EDGE2 1514 1373 -1.0957 -0.0104689 -0.0107647 1 0 1 1 0 0 +EDGE2 1514 1374 0.069011 0.102437 -0.0108635 1 0 1 1 0 0 +EDGE2 1514 1375 0.992392 -0.055003 0.0470783 1 0 1 1 0 0 +EDGE2 1515 1376 0.024495 -1.05402 -1.58285 1 0 1 1 0 0 +EDGE2 1515 1514 -0.975755 -0.128026 -0.0281808 1 0 1 1 0 0 +EDGE2 1515 1374 -1.10135 -0.0119401 0.0061743 1 0 1 1 0 0 +EDGE2 1515 1375 0.0015285 0.0283168 0.0113172 1 0 1 1 0 0 +EDGE2 1516 1375 -1.0479 -0.0883353 -1.57317 1 0 1 1 0 0 +EDGE2 1516 1515 -0.999956 -0.0385793 -1.55566 1 0 1 1 0 0 +EDGE2 1517 1516 -0.977512 0.00882926 -0.0034214 1 0 1 1 0 0 +EDGE2 1518 1517 -0.914197 -0.00773293 0.0100587 1 0 1 1 0 0 +EDGE2 1519 1518 -1.02851 0.0408228 -0.0146325 1 0 1 1 0 0 +EDGE2 1519 1320 0.990267 0.021558 -3.14036 1 0 1 1 0 0 +EDGE2 1520 1519 -1.00456 0.0403394 0.0390831 1 0 1 1 0 0 +EDGE2 1520 1321 0.00524749 1.0098 1.5383 1 0 1 1 0 0 +EDGE2 1520 1320 -0.0282394 -0.0276833 -3.14439 1 0 1 1 0 0 +EDGE2 1520 1319 0.938908 -0.0363837 -3.14333 1 0 1 1 0 0 +EDGE2 1521 1322 0.982557 0.0306852 -0.023203 1 0 1 1 0 0 +EDGE2 1521 1321 0.066982 0.0998144 0.0250399 1 0 1 1 0 0 +EDGE2 1521 1520 -1.04448 -0.0185516 -1.54253 1 0 1 1 0 0 +EDGE2 1521 1320 -1.01523 -0.0232885 1.54768 1 0 1 1 0 0 +EDGE2 1522 1323 0.95834 -0.075258 0.0074613 1 0 1 1 0 0 +EDGE2 1522 1322 -0.0572986 -0.0703495 0.0411268 1 0 1 1 0 0 +EDGE2 1522 1521 -0.977804 0.0590263 -0.0172258 1 0 1 1 0 0 +EDGE2 1522 1321 -1.1033 -0.0535047 0.0113406 1 0 1 1 0 0 +EDGE2 1523 1324 0.959414 0.0665134 -0.0343772 1 0 1 1 0 0 +EDGE2 1523 1323 -0.0443279 -0.00596574 -0.00481337 1 0 1 1 0 0 +EDGE2 1523 1322 -0.963096 -0.0346723 -0.00827909 1 0 1 1 0 0 +EDGE2 1523 1522 -0.963416 0.0709033 -0.0178535 1 0 1 1 0 0 +EDGE2 1524 1345 0.951752 0.0534083 -3.13151 1 0 1 1 0 0 +EDGE2 1524 1485 1.0157 -0.0229023 -3.17204 1 0 1 1 0 0 +EDGE2 1524 1505 0.94308 0.0340732 -3.14533 1 0 1 1 0 0 +EDGE2 1524 1365 0.994822 0.0753471 -3.12246 1 0 1 1 0 0 +EDGE2 1524 1325 1.09977 -0.00381359 0.00858704 1 0 1 1 0 0 +EDGE2 1524 1324 -0.0244919 -0.0149456 -0.00375653 1 0 1 1 0 0 +EDGE2 1524 1323 -1.00494 -0.00465708 0.000334254 1 0 1 1 0 0 +EDGE2 1524 1523 -0.956868 -0.106598 -0.01005 1 0 1 1 0 0 +EDGE2 1525 1345 0.0363695 -0.0549527 -3.14776 1 0 1 1 0 0 +EDGE2 1525 1366 -0.017025 0.938846 1.5474 1 0 1 1 0 0 +EDGE2 1525 1506 -0.0112932 1.00549 1.53718 1 0 1 1 0 0 +EDGE2 1525 1344 1.06701 -0.0220082 -3.16597 1 0 1 1 0 0 +EDGE2 1525 1484 0.972206 0.010041 -3.15952 1 0 1 1 0 0 +EDGE2 1525 1504 0.925764 -0.0635743 -3.15599 1 0 1 1 0 0 +EDGE2 1525 1364 1.00768 0.0751415 -3.13235 1 0 1 1 0 0 +EDGE2 1525 1485 0.0724216 -0.0418176 -3.132 1 0 1 1 0 0 +EDGE2 1525 1505 0.0435576 -5.63273e-05 -3.12828 1 0 1 1 0 0 +EDGE2 1525 1365 -0.023397 -0.045412 -3.15538 1 0 1 1 0 0 +EDGE2 1525 1325 -0.041704 0.030912 -0.00870859 1 0 1 1 0 0 +EDGE2 1525 1524 -1.03954 -0.0299968 0.00311977 1 0 1 1 0 0 +EDGE2 1525 1324 -0.990712 -0.0085255 -0.0233706 1 0 1 1 0 0 +EDGE2 1525 1486 -0.0756336 -1.06502 -1.54822 1 0 1 1 0 0 +EDGE2 1525 1326 -0.0278692 -0.920374 -1.60009 1 0 1 1 0 0 +EDGE2 1525 1346 0.0485097 -1.12721 -1.58891 1 0 1 1 0 0 +EDGE2 1526 1345 -0.938481 0.010962 1.55745 1 0 1 1 0 0 +EDGE2 1526 1507 0.949122 0.0138954 0.0363385 1 0 1 1 0 0 +EDGE2 1526 1367 1.02545 -0.00147962 -0.0369418 1 0 1 1 0 0 +EDGE2 1526 1366 -0.027827 0.050695 -0.0424398 1 0 1 1 0 0 +EDGE2 1526 1506 0.0598687 -0.0857334 -0.0131576 1 0 1 1 0 0 +EDGE2 1526 1525 -0.972444 0.181138 -1.55165 1 0 1 1 0 0 +EDGE2 1526 1485 -1.02121 0.000619006 1.58025 1 0 1 1 0 0 +EDGE2 1526 1505 -1.00995 -0.0220222 1.55756 1 0 1 1 0 0 +EDGE2 1526 1365 -0.982019 -0.00728277 1.62161 1 0 1 1 0 0 +EDGE2 1526 1325 -0.9808 0.0433953 -1.55117 1 0 1 1 0 0 +EDGE2 1527 1368 1.01276 0.0259672 0.00573525 1 0 1 1 0 0 +EDGE2 1527 1508 1.03276 0.0169914 -0.0277222 1 0 1 1 0 0 +EDGE2 1527 1526 -1.03929 0.0355641 0.0145388 1 0 1 1 0 0 +EDGE2 1527 1507 0.0129584 -0.019754 0.0098632 1 0 1 1 0 0 +EDGE2 1527 1367 -0.0377452 -0.0129063 -0.0202247 1 0 1 1 0 0 +EDGE2 1527 1366 -1.08206 0.0896748 0.00986254 1 0 1 1 0 0 +EDGE2 1527 1506 -0.985029 -0.027294 -0.00334168 1 0 1 1 0 0 +EDGE2 1528 1509 1.01763 0.0722001 -0.0370166 1 0 1 1 0 0 +EDGE2 1528 1369 1.01023 0.0192341 0.0105523 1 0 1 1 0 0 +EDGE2 1528 1368 -0.0274562 0.0767992 0.0118077 1 0 1 1 0 0 +EDGE2 1528 1508 -0.0137565 0.00425765 -0.00906579 1 0 1 1 0 0 +EDGE2 1528 1507 -1.06312 0.0616479 -0.0383418 1 0 1 1 0 0 +EDGE2 1528 1527 -1.00538 0.0321025 0.0263502 1 0 1 1 0 0 +EDGE2 1528 1367 -0.931129 -0.0786885 0.030679 1 0 1 1 0 0 +EDGE2 1529 1470 0.989542 -0.027435 -3.13941 1 0 1 1 0 0 +EDGE2 1529 1510 1.03114 0.111102 0.00522162 1 0 1 1 0 0 +EDGE2 1529 1370 0.950028 -0.0550404 0.0091586 1 0 1 1 0 0 +EDGE2 1529 1509 -0.00140461 0.110804 -0.021065 1 0 1 1 0 0 +EDGE2 1529 1369 -0.0485119 0.0198971 -0.021734 1 0 1 1 0 0 +EDGE2 1529 1368 -1.03227 -0.11332 0.00786906 1 0 1 1 0 0 +EDGE2 1529 1508 -0.963209 0.140324 0.0313308 1 0 1 1 0 0 +EDGE2 1529 1528 -0.985545 0.0807875 0.00723963 1 0 1 1 0 0 +EDGE2 1530 1469 0.922275 -0.00487102 -3.1503 1 0 1 1 0 0 +EDGE2 1530 1471 0.0342868 -1.00771 -1.57814 1 0 1 1 0 0 +EDGE2 1530 1470 -0.0543989 0.0212323 -3.13713 1 0 1 1 0 0 +EDGE2 1530 1510 0.010523 -0.0207864 -0.0130595 1 0 1 1 0 0 +EDGE2 1530 1370 -0.0298415 0.0723204 -0.00465531 1 0 1 1 0 0 +EDGE2 1530 1371 -0.00473549 0.990559 1.57292 1 0 1 1 0 0 +EDGE2 1530 1511 -0.0190854 0.998478 1.56698 1 0 1 1 0 0 +EDGE2 1530 1509 -1.02745 0.152772 0.01046 1 0 1 1 0 0 +EDGE2 1530 1529 -0.930382 0.0393703 -0.0199647 1 0 1 1 0 0 +EDGE2 1530 1369 -1.06823 0.0791159 0.00788486 1 0 1 1 0 0 +EDGE2 1531 1470 -0.989607 0.0480515 1.55811 1 0 1 1 0 0 +EDGE2 1531 1510 -0.977897 -0.028415 -1.5466 1 0 1 1 0 0 +EDGE2 1531 1530 -1.04265 0.0511875 -1.56509 1 0 1 1 0 0 +EDGE2 1531 1370 -1.07552 -0.0664256 -1.56316 1 0 1 1 0 0 +EDGE2 1531 1371 -0.0259463 0.0599051 0.00327201 1 0 1 1 0 0 +EDGE2 1531 1511 0.0513008 0.0402723 -0.0158861 1 0 1 1 0 0 +EDGE2 1531 1512 0.948428 -0.0394089 -0.000934406 1 0 1 1 0 0 +EDGE2 1531 1372 0.99853 0.0816466 -0.0222803 1 0 1 1 0 0 +EDGE2 1532 1371 -0.998538 -0.0754161 -0.00441322 1 0 1 1 0 0 +EDGE2 1532 1531 -0.957859 0.0321765 0.0178802 1 0 1 1 0 0 +EDGE2 1532 1511 -1.01376 0.0495915 -0.024126 1 0 1 1 0 0 +EDGE2 1532 1512 0.0801459 -0.134542 0.0087022 1 0 1 1 0 0 +EDGE2 1532 1372 0.0839091 0.0548235 -0.0181382 1 0 1 1 0 0 +EDGE2 1532 1513 1.04808 0.107932 -0.0229273 1 0 1 1 0 0 +EDGE2 1532 1373 0.998235 -0.0114001 0.00902718 1 0 1 1 0 0 +EDGE2 1533 1512 -0.996246 -0.0678177 -0.0115736 1 0 1 1 0 0 +EDGE2 1533 1532 -0.994874 -0.00429691 0.039603 1 0 1 1 0 0 +EDGE2 1533 1372 -0.99915 0.0147318 -0.00892969 1 0 1 1 0 0 +EDGE2 1533 1513 0.0257813 -0.0251059 0.0498592 1 0 1 1 0 0 +EDGE2 1533 1373 0.0559517 -0.0863514 0.0112033 1 0 1 1 0 0 +EDGE2 1533 1514 0.969661 -0.0368467 -0.0497023 1 0 1 1 0 0 +EDGE2 1533 1374 0.894187 0.0481043 -0.00328641 1 0 1 1 0 0 +EDGE2 1534 1513 -0.935012 0.0569446 -0.0239115 1 0 1 1 0 0 +EDGE2 1534 1533 -0.958357 0.0112787 0.0201246 1 0 1 1 0 0 +EDGE2 1534 1373 -0.969629 0.0678964 -0.00633318 1 0 1 1 0 0 +EDGE2 1534 1514 0.037258 0.00345783 0.00470081 1 0 1 1 0 0 +EDGE2 1534 1374 -0.0498703 0.107827 -0.0316547 1 0 1 1 0 0 +EDGE2 1534 1375 0.980674 0.013524 -0.0388074 1 0 1 1 0 0 +EDGE2 1534 1515 1.02658 0.0180557 -0.029653 1 0 1 1 0 0 +EDGE2 1535 1376 0.0299742 -1.01156 -1.56321 1 0 1 1 0 0 +EDGE2 1535 1514 -0.886671 0.0248011 -0.0229196 1 0 1 1 0 0 +EDGE2 1535 1534 -0.944678 0.0132322 0.00614075 1 0 1 1 0 0 +EDGE2 1535 1374 -0.973255 -0.0843277 -0.00945096 1 0 1 1 0 0 +EDGE2 1535 1375 0.0385851 -0.0500797 -0.0156681 1 0 1 1 0 0 +EDGE2 1535 1515 0.0145328 -0.121514 -0.00753622 1 0 1 1 0 0 +EDGE2 1535 1516 -0.0481297 1.01777 1.60571 1 0 1 1 0 0 +EDGE2 1536 1377 0.993927 0.00672776 0.020989 1 0 1 1 0 0 +EDGE2 1536 1376 0.0768938 -0.0776289 -0.00552338 1 0 1 1 0 0 +EDGE2 1536 1535 -1.03293 -0.049924 1.59843 1 0 1 1 0 0 +EDGE2 1536 1375 -0.978147 0.00494625 1.56949 1 0 1 1 0 0 +EDGE2 1536 1515 -0.936429 0.0179082 1.59161 1 0 1 1 0 0 +EDGE2 1537 1378 1.05959 -0.00712989 -0.0189265 1 0 1 1 0 0 +EDGE2 1537 1377 -0.023744 -0.0130504 0.0049208 1 0 1 1 0 0 +EDGE2 1537 1536 -0.984334 0.0672913 0.0124089 1 0 1 1 0 0 +EDGE2 1537 1376 -0.970841 -0.0364452 0.0056398 1 0 1 1 0 0 +EDGE2 1538 1378 0.0591841 -0.0442636 0.034056 1 0 1 1 0 0 +EDGE2 1538 1379 0.952136 0.0939081 0.0360684 1 0 1 1 0 0 +EDGE2 1538 1537 -0.904382 0.0575038 0.00775273 1 0 1 1 0 0 +EDGE2 1538 1377 -1.02234 -0.0322821 -0.0261255 1 0 1 1 0 0 +EDGE2 1539 1380 0.989267 0.0677739 -0.0120794 1 0 1 1 0 0 +EDGE2 1539 1378 -1.06161 -0.0586363 -0.0075404 1 0 1 1 0 0 +EDGE2 1539 1379 0.0199698 -0.0219476 -0.0188085 1 0 1 1 0 0 +EDGE2 1539 1538 -1.01622 -0.0376782 -0.0281139 1 0 1 1 0 0 +EDGE2 1540 1381 -0.0987679 -0.96395 -1.57449 1 0 1 1 0 0 +EDGE2 1540 1380 0.090934 -0.00563287 0.0253988 1 0 1 1 0 0 +EDGE2 1540 1379 -1.02073 -0.020861 -0.0282136 1 0 1 1 0 0 +EDGE2 1540 1539 -0.917077 0.0304177 0.00442418 1 0 1 1 0 0 +EDGE2 1541 1540 -0.986293 0.0335579 -1.56952 1 0 1 1 0 0 +EDGE2 1541 1380 -0.97477 -0.056852 -1.58034 1 0 1 1 0 0 +EDGE2 1542 1541 -0.997324 0.0297301 -0.0328498 1 0 1 1 0 0 +EDGE2 1543 1542 -0.966953 0.0234021 -0.00617276 1 0 1 1 0 0 +EDGE2 1544 1543 -1.07372 0.0538354 0.0152759 1 0 1 1 0 0 +EDGE2 1544 1265 1.02397 -0.0221384 -3.15893 1 0 1 1 0 0 +EDGE2 1545 1544 -0.897591 0.0353678 -0.041832 1 0 1 1 0 0 +EDGE2 1545 1265 0.0488156 0.0287218 -3.14375 1 0 1 1 0 0 +EDGE2 1545 1264 1.0117 -0.000364189 -3.15517 1 0 1 1 0 0 +EDGE2 1545 1266 -0.0554037 0.961205 1.56608 1 0 1 1 0 0 +EDGE2 1546 1265 -0.95377 -0.037038 -1.56897 1 0 1 1 0 0 +EDGE2 1546 1545 -0.990523 -0.0108807 1.56969 1 0 1 1 0 0 +EDGE2 1547 1546 -0.967411 0.102969 -0.0152053 1 0 1 1 0 0 +EDGE2 1548 1547 -0.970927 -0.0203463 -0.013711 1 0 1 1 0 0 +EDGE2 1549 1548 -1.00365 0.00238775 -0.0107602 1 0 1 1 0 0 +EDGE2 1550 1549 -1.0172 0.0355309 0.0145891 1 0 1 1 0 0 +EDGE2 1551 1550 -1.13994 -0.0493901 1.54187 1 0 1 1 0 0 +EDGE2 1552 1551 -0.997973 0.118287 -0.0346207 1 0 1 1 0 0 +EDGE2 1553 1552 -0.998942 0.0409519 0.00305164 1 0 1 1 0 0 +EDGE2 1554 1553 -0.953708 -0.107032 -0.0268156 1 0 1 1 0 0 +EDGE2 1555 1554 -1.08093 -0.0234978 -0.00641012 1 0 1 1 0 0 +EDGE2 1556 1555 -1.00401 -0.0524975 1.54253 1 0 1 1 0 0 +EDGE2 1557 1556 -1.04282 0.0207868 -0.0294613 1 0 1 1 0 0 +EDGE2 1558 1557 -0.962736 -0.0127187 0.00382453 1 0 1 1 0 0 +EDGE2 1559 1558 -1.05198 0.0425601 0.0580416 1 0 1 1 0 0 +EDGE2 1559 1540 0.943279 0.105075 -3.15834 1 0 1 1 0 0 +EDGE2 1559 1380 1.00694 0.0347308 -3.12603 1 0 1 1 0 0 +EDGE2 1560 1559 -1.06383 0.128019 0.0206437 1 0 1 1 0 0 +EDGE2 1560 1540 0.00832713 -0.0627341 -3.11195 1 0 1 1 0 0 +EDGE2 1560 1381 -0.000858121 1.05644 1.58174 1 0 1 1 0 0 +EDGE2 1560 1380 -0.0691283 -0.0152813 -3.14939 1 0 1 1 0 0 +EDGE2 1560 1541 0.018928 -1.04595 -1.57268 1 0 1 1 0 0 +EDGE2 1560 1379 0.983513 -0.031097 -3.16892 1 0 1 1 0 0 +EDGE2 1560 1539 1.07243 -0.0796315 -3.19602 1 0 1 1 0 0 +EDGE2 1561 1540 -0.97351 -0.013635 -1.57048 1 0 1 1 0 0 +EDGE2 1561 1560 -0.923969 -0.00472079 1.55802 1 0 1 1 0 0 +EDGE2 1561 1380 -0.997743 0.0087833 -1.57221 1 0 1 1 0 0 +EDGE2 1561 1541 0.032306 -0.0216921 0.0150207 1 0 1 1 0 0 +EDGE2 1561 1542 0.950801 -0.0105196 -0.0191069 1 0 1 1 0 0 +EDGE2 1562 1543 0.964484 0.00862364 0.0318284 1 0 1 1 0 0 +EDGE2 1562 1541 -1.04975 -0.0595355 -0.0172012 1 0 1 1 0 0 +EDGE2 1562 1561 -1.09886 -0.0367361 -6.32336e-05 1 0 1 1 0 0 +EDGE2 1562 1542 0.0784394 0.11942 -0.00930195 1 0 1 1 0 0 +EDGE2 1563 1543 0.0543342 -0.0345436 0.0250634 1 0 1 1 0 0 +EDGE2 1563 1542 -1.01519 0.0335638 -0.00983081 1 0 1 1 0 0 +EDGE2 1563 1562 -0.951351 0.0880205 -0.0160933 1 0 1 1 0 0 +EDGE2 1563 1544 1.0806 -0.0268779 -0.00018521 1 0 1 1 0 0 +EDGE2 1564 1543 -0.945249 0.00662202 -0.019002 1 0 1 1 0 0 +EDGE2 1564 1563 -0.924095 -0.00692859 0.00199167 1 0 1 1 0 0 +EDGE2 1564 1544 0.0794567 -0.0619636 0.0316608 1 0 1 1 0 0 +EDGE2 1564 1265 0.979542 -0.0275903 -3.14528 1 0 1 1 0 0 +EDGE2 1564 1545 1.10364 0.0391505 0.00425081 1 0 1 1 0 0 +EDGE2 1565 1564 -0.980756 -0.0778799 0.0274253 1 0 1 1 0 0 +EDGE2 1565 1544 -0.996651 0.0307349 0.0340727 1 0 1 1 0 0 +EDGE2 1565 1546 -0.000796522 -1.00582 -1.56728 1 0 1 1 0 0 +EDGE2 1565 1265 0.0124692 0.0306462 -3.0992 1 0 1 1 0 0 +EDGE2 1565 1545 0.0426569 0.0255532 -0.0150675 1 0 1 1 0 0 +EDGE2 1565 1264 0.971843 0.0222347 -3.16325 1 0 1 1 0 0 +EDGE2 1565 1266 0.0166349 1.11432 1.56466 1 0 1 1 0 0 +EDGE2 1566 1265 -1.08515 -0.0612297 1.59771 1 0 1 1 0 0 +EDGE2 1566 1565 -0.991336 -0.0619448 -1.57218 1 0 1 1 0 0 +EDGE2 1566 1545 -0.959735 -0.0221706 -1.60964 1 0 1 1 0 0 +EDGE2 1566 1266 0.0478685 -0.0153978 0.00694392 1 0 1 1 0 0 +EDGE2 1566 1267 1.02834 -0.0248816 0.00710534 1 0 1 1 0 0 +EDGE2 1567 1566 -0.930324 -0.102068 -0.00620404 1 0 1 1 0 0 +EDGE2 1567 1266 -1.027 0.0265736 -0.00241729 1 0 1 1 0 0 +EDGE2 1567 1267 0.0054549 -0.0257946 -0.017053 1 0 1 1 0 0 +EDGE2 1567 1268 0.971122 -0.079396 -0.00164197 1 0 1 1 0 0 +EDGE2 1568 1567 -1.03537 0.0483907 0.00302998 1 0 1 1 0 0 +EDGE2 1568 1267 -1.04882 -0.0430421 0.00947773 1 0 1 1 0 0 +EDGE2 1568 1268 0.0262047 -0.0800605 -0.00239821 1 0 1 1 0 0 +EDGE2 1568 1269 0.933022 -0.0717543 -0.0237159 1 0 1 1 0 0 +EDGE2 1569 1268 -1.00237 -0.0133558 0.00411017 1 0 1 1 0 0 +EDGE2 1569 1568 -0.988428 -0.00232952 0.00449877 1 0 1 1 0 0 +EDGE2 1569 1269 0.000393326 0.0597871 0.00841404 1 0 1 1 0 0 +EDGE2 1569 1270 1.03221 -0.0072949 0.020801 1 0 1 1 0 0 +EDGE2 1569 1290 0.933404 -0.0116882 -3.13915 1 0 1 1 0 0 +EDGE2 1570 1569 -0.990557 0.00614659 -0.021092 1 0 1 1 0 0 +EDGE2 1570 1269 -1.0118 0.0478137 0.0263046 1 0 1 1 0 0 +EDGE2 1570 1291 -0.0597051 -0.982741 -1.59161 1 0 1 1 0 0 +EDGE2 1570 1270 -0.0108401 -0.0724633 0.00324936 1 0 1 1 0 0 +EDGE2 1570 1290 0.028248 -0.0541128 -3.17924 1 0 1 1 0 0 +EDGE2 1570 1271 0.0210134 -0.915779 -1.57266 1 0 1 1 0 0 +EDGE2 1570 1289 0.999105 0.0728339 -3.13622 1 0 1 1 0 0 +EDGE2 1571 1270 -0.947387 0.00346885 -1.57016 1 0 1 1 0 0 +EDGE2 1571 1290 -1.01457 -0.0651768 1.56805 1 0 1 1 0 0 +EDGE2 1571 1570 -1.01295 -0.00712875 -1.57749 1 0 1 1 0 0 +EDGE2 1572 1571 -0.969273 -0.025005 0.0149398 1 0 1 1 0 0 +EDGE2 1573 1572 -0.950246 0.0520635 -0.000377807 1 0 1 1 0 0 +EDGE2 1574 1535 1.07369 -0.0305889 -3.17608 1 0 1 1 0 0 +EDGE2 1574 1375 0.958285 -0.047978 -3.15079 1 0 1 1 0 0 +EDGE2 1574 1515 0.920591 0.031208 -3.16479 1 0 1 1 0 0 +EDGE2 1574 1573 -1.01059 0.00801164 0.00781292 1 0 1 1 0 0 +EDGE2 1575 1536 0.0467751 1.02992 1.52577 1 0 1 1 0 0 +EDGE2 1575 1376 0.0427412 0.936497 1.55621 1 0 1 1 0 0 +EDGE2 1575 1535 -0.0769185 -0.0357678 -3.09041 1 0 1 1 0 0 +EDGE2 1575 1514 0.946363 0.0701604 -3.14925 1 0 1 1 0 0 +EDGE2 1575 1534 1.05804 -0.0508353 -3.12869 1 0 1 1 0 0 +EDGE2 1575 1374 0.986858 0.0380591 -3.15107 1 0 1 1 0 0 +EDGE2 1575 1375 -0.0196651 0.0335944 -3.13633 1 0 1 1 0 0 +EDGE2 1575 1515 0.0235777 -0.00492734 -3.18678 1 0 1 1 0 0 +EDGE2 1575 1574 -0.99125 0.0458419 -0.00353757 1 0 1 1 0 0 +EDGE2 1575 1516 0.0680623 -0.997716 -1.53665 1 0 1 1 0 0 +EDGE2 1576 1537 0.97205 -0.0254029 0.00816327 1 0 1 1 0 0 +EDGE2 1576 1377 1.09317 0.0242658 -0.0165043 1 0 1 1 0 0 +EDGE2 1576 1536 -0.0389871 0.105831 0.0239523 1 0 1 1 0 0 +EDGE2 1576 1376 -0.0527492 -0.0137462 0.0185031 1 0 1 1 0 0 +EDGE2 1576 1535 -0.970571 0.000783456 1.58173 1 0 1 1 0 0 +EDGE2 1576 1575 -1.01421 0.0595228 -1.557 1 0 1 1 0 0 +EDGE2 1576 1375 -1.10616 -0.115187 1.58331 1 0 1 1 0 0 +EDGE2 1576 1515 -0.940275 -0.0540962 1.54505 1 0 1 1 0 0 +EDGE2 1577 1378 0.984443 -0.0141387 -0.0135195 1 0 1 1 0 0 +EDGE2 1577 1538 1.01707 0.0135644 0.0020957 1 0 1 1 0 0 +EDGE2 1577 1537 0.0909074 0.00988348 -0.031346 1 0 1 1 0 0 +EDGE2 1577 1377 0.0873439 0.0486424 0.0347546 1 0 1 1 0 0 +EDGE2 1577 1536 -1.05031 -0.0253183 -0.0234897 1 0 1 1 0 0 +EDGE2 1577 1576 -1.04789 -0.0103114 -0.0262623 1 0 1 1 0 0 +EDGE2 1577 1376 -0.985575 0.0624761 0.00343147 1 0 1 1 0 0 +EDGE2 1578 1378 -0.0319134 -0.0725017 0.0328907 1 0 1 1 0 0 +EDGE2 1578 1379 0.896946 0.0128243 0.000619975 1 0 1 1 0 0 +EDGE2 1578 1539 1.04138 0.0352528 0.0173291 1 0 1 1 0 0 +EDGE2 1578 1538 0.00424228 0.0106367 -0.0033628 1 0 1 1 0 0 +EDGE2 1578 1537 -0.942709 -0.01073 0.0207947 1 0 1 1 0 0 +EDGE2 1578 1577 -1.0402 -0.000115518 -0.00529507 1 0 1 1 0 0 +EDGE2 1578 1377 -1.07956 -0.00383602 -0.0230854 1 0 1 1 0 0 +EDGE2 1579 1540 1.09357 0.0181946 0.00246861 1 0 1 1 0 0 +EDGE2 1579 1560 0.950913 0.114619 -3.16778 1 0 1 1 0 0 +EDGE2 1579 1380 1.00506 -0.0305701 -0.0151363 1 0 1 1 0 0 +EDGE2 1579 1378 -0.960938 -0.0814831 -0.0102066 1 0 1 1 0 0 +EDGE2 1579 1379 -0.0155053 0.0485556 0.0261837 1 0 1 1 0 0 +EDGE2 1579 1539 0.0264058 0.0527659 -0.0418415 1 0 1 1 0 0 +EDGE2 1579 1578 -1.03061 0.0474269 0.00768551 1 0 1 1 0 0 +EDGE2 1579 1538 -0.972384 -0.101286 0.02387 1 0 1 1 0 0 +EDGE2 1580 1559 0.992714 0.0426245 -3.1568 1 0 1 1 0 0 +EDGE2 1580 1540 -0.146546 0.0169367 0.0109865 1 0 1 1 0 0 +EDGE2 1580 1381 -0.0297205 -1.01971 -1.55366 1 0 1 1 0 0 +EDGE2 1580 1560 -0.0246134 0.0149363 -3.12909 1 0 1 1 0 0 +EDGE2 1580 1380 -0.0546935 0.032977 0.0115675 1 0 1 1 0 0 +EDGE2 1580 1541 -0.0925749 1.10727 1.56022 1 0 1 1 0 0 +EDGE2 1580 1561 -0.058619 0.969065 1.57526 1 0 1 1 0 0 +EDGE2 1580 1579 -1.02217 -0.00609928 -0.00339922 1 0 1 1 0 0 +EDGE2 1580 1379 -1.06505 0.0187621 -0.0136926 1 0 1 1 0 0 +EDGE2 1580 1539 -0.96985 0.0889473 -0.0243913 1 0 1 1 0 0 +EDGE2 1581 1540 -0.923336 0.0289265 -1.57457 1 0 1 1 0 0 +EDGE2 1581 1580 -1.0323 -0.062877 -1.58177 1 0 1 1 0 0 +EDGE2 1581 1560 -1.00597 0.0284202 1.55385 1 0 1 1 0 0 +EDGE2 1581 1380 -1.08446 -0.0559931 -1.59355 1 0 1 1 0 0 +EDGE2 1581 1541 0.0747049 0.018459 -0.0295766 1 0 1 1 0 0 +EDGE2 1581 1561 -0.0144857 -0.0682208 0.0182426 1 0 1 1 0 0 +EDGE2 1581 1542 0.980056 -0.0286669 0.0110755 1 0 1 1 0 0 +EDGE2 1581 1562 1.02153 0.00691188 -0.0114141 1 0 1 1 0 0 +EDGE2 1582 1543 1.03338 0.0157025 -0.0198944 1 0 1 1 0 0 +EDGE2 1582 1581 -0.940471 0.000855629 -0.0118204 1 0 1 1 0 0 +EDGE2 1582 1541 -1.05732 0.101412 0.00556449 1 0 1 1 0 0 +EDGE2 1582 1561 -1.05734 -0.0142202 0.00397282 1 0 1 1 0 0 +EDGE2 1582 1542 0.0609308 0.0309382 0.0152844 1 0 1 1 0 0 +EDGE2 1582 1562 0.035971 0.00684082 -0.0288598 1 0 1 1 0 0 +EDGE2 1582 1563 0.979021 0.00845721 -0.00849208 1 0 1 1 0 0 +EDGE2 1583 1543 0.104589 -0.0277985 0.0301864 1 0 1 1 0 0 +EDGE2 1583 1542 -1.06108 -0.154677 -0.000181687 1 0 1 1 0 0 +EDGE2 1583 1562 -0.929336 0.123511 0.0046069 1 0 1 1 0 0 +EDGE2 1583 1582 -0.994919 0.0184751 -0.00202844 1 0 1 1 0 0 +EDGE2 1583 1563 -0.0228506 0.0230823 -0.0288065 1 0 1 1 0 0 +EDGE2 1583 1564 0.95911 -0.00969564 0.0440612 1 0 1 1 0 0 +EDGE2 1583 1544 0.991132 0.00276944 0.00795167 1 0 1 1 0 0 +EDGE2 1584 1543 -0.96483 -0.0468803 -0.0242083 1 0 1 1 0 0 +EDGE2 1584 1583 -1.05729 -0.0189942 -0.0117119 1 0 1 1 0 0 +EDGE2 1584 1563 -1.02991 0.019565 0.0144663 1 0 1 1 0 0 +EDGE2 1584 1564 0.0617901 -0.00302118 -0.0286058 1 0 1 1 0 0 +EDGE2 1584 1544 0.0136698 -0.0413149 0.0180527 1 0 1 1 0 0 +EDGE2 1584 1265 1.06549 -0.0131322 -3.16325 1 0 1 1 0 0 +EDGE2 1584 1565 1.0221 0.0211559 -0.00918689 1 0 1 1 0 0 +EDGE2 1584 1545 0.982346 -0.0676358 -0.0254559 1 0 1 1 0 0 +EDGE2 1585 1564 -0.886083 0.028759 -0.00708903 1 0 1 1 0 0 +EDGE2 1585 1584 -0.970488 0.0237527 -0.00383226 1 0 1 1 0 0 +EDGE2 1585 1544 -0.913188 -0.0232795 -0.00795966 1 0 1 1 0 0 +EDGE2 1585 1546 0.0231243 -1.08217 -1.55976 1 0 1 1 0 0 +EDGE2 1585 1265 -0.0569658 0.0365229 -3.14525 1 0 1 1 0 0 +EDGE2 1585 1565 -0.0290219 0.0479039 0.0317619 1 0 1 1 0 0 +EDGE2 1585 1545 -0.021251 -0.0600933 -0.0147056 1 0 1 1 0 0 +EDGE2 1585 1264 0.98673 0.0841298 -3.12746 1 0 1 1 0 0 +EDGE2 1585 1566 -0.0137251 1.01364 1.57993 1 0 1 1 0 0 +EDGE2 1585 1266 -0.0114419 0.963215 1.56585 1 0 1 1 0 0 +EDGE2 1586 1265 -1.0134 0.0454527 1.54209 1 0 1 1 0 0 +EDGE2 1586 1565 -1.06058 0.0377854 -1.59454 1 0 1 1 0 0 +EDGE2 1586 1585 -0.989226 0.0552506 -1.59523 1 0 1 1 0 0 +EDGE2 1586 1545 -1.00957 0.0333521 -1.58432 1 0 1 1 0 0 +EDGE2 1586 1567 1.02036 0.0072956 -0.013464 1 0 1 1 0 0 +EDGE2 1586 1566 0.0663643 -0.0383064 -0.0041537 1 0 1 1 0 0 +EDGE2 1586 1266 0.0216786 -0.0430941 -0.01063 1 0 1 1 0 0 +EDGE2 1586 1267 0.941789 0.0720361 0.00480705 1 0 1 1 0 0 +EDGE2 1587 1567 -0.00370613 0.0280019 -0.0477553 1 0 1 1 0 0 +EDGE2 1587 1566 -0.94312 -0.00260862 0.00788809 1 0 1 1 0 0 +EDGE2 1587 1586 -1.01486 -0.0535984 0.0123773 1 0 1 1 0 0 +EDGE2 1587 1266 -0.975094 -0.0538486 0.0363392 1 0 1 1 0 0 +EDGE2 1587 1267 -0.00724188 0.0538497 -0.0205661 1 0 1 1 0 0 +EDGE2 1587 1268 0.919504 0.0451571 -0.00308389 1 0 1 1 0 0 +EDGE2 1587 1568 1.01628 0.0229681 0.0152766 1 0 1 1 0 0 +EDGE2 1588 1567 -1.06855 -0.0344215 0.00332796 1 0 1 1 0 0 +EDGE2 1588 1587 -0.973197 0.0341305 0.0188395 1 0 1 1 0 0 +EDGE2 1588 1267 -1.05039 0.0297612 0.0222635 1 0 1 1 0 0 +EDGE2 1588 1268 0.0323642 -0.0107766 0.0221099 1 0 1 1 0 0 +EDGE2 1588 1568 -0.0108455 -0.00956403 -0.0158575 1 0 1 1 0 0 +EDGE2 1588 1569 0.952921 -0.0612923 -0.0230997 1 0 1 1 0 0 +EDGE2 1588 1269 0.96118 -0.0825878 0.00641881 1 0 1 1 0 0 +EDGE2 1589 1588 -0.922362 0.0177805 0.00705552 1 0 1 1 0 0 +EDGE2 1589 1268 -1.00491 0.00697699 -0.0108031 1 0 1 1 0 0 +EDGE2 1589 1568 -0.975954 0.0344061 -0.00516902 1 0 1 1 0 0 +EDGE2 1589 1569 -0.00990128 0.0365555 0.00606394 1 0 1 1 0 0 +EDGE2 1589 1269 0.0904051 0.0459621 -0.011066 1 0 1 1 0 0 +EDGE2 1589 1270 1.01871 -0.0317899 0.00219733 1 0 1 1 0 0 +EDGE2 1589 1290 1.03701 -0.0798342 -3.11138 1 0 1 1 0 0 +EDGE2 1589 1570 1.06747 0.0713127 0.00817498 1 0 1 1 0 0 +EDGE2 1590 1571 -0.0206362 1.03526 1.54943 1 0 1 1 0 0 +EDGE2 1590 1569 -1.02112 0.0427806 -0.0223931 1 0 1 1 0 0 +EDGE2 1590 1589 -1.0025 0.0767175 0.0420111 1 0 1 1 0 0 +EDGE2 1590 1269 -0.94222 0.0499369 0.00221005 1 0 1 1 0 0 +EDGE2 1590 1291 0.0905069 -1.04366 -1.57683 1 0 1 1 0 0 +EDGE2 1590 1270 -0.0143602 -0.0184412 0.00356429 1 0 1 1 0 0 +EDGE2 1590 1290 -0.0048563 -0.0363301 -3.12325 1 0 1 1 0 0 +EDGE2 1590 1570 -0.0219315 -0.0825649 0.0250344 1 0 1 1 0 0 +EDGE2 1590 1271 -0.0113878 -0.973006 -1.61018 1 0 1 1 0 0 +EDGE2 1590 1289 1.02301 0.0608648 -3.129 1 0 1 1 0 0 +EDGE2 1591 1572 1.02118 0.0715328 0.0561255 1 0 1 1 0 0 +EDGE2 1591 1571 -0.0404198 0.0262469 0.0202422 1 0 1 1 0 0 +EDGE2 1591 1590 -0.977759 0.00257338 -1.5797 1 0 1 1 0 0 +EDGE2 1591 1270 -0.896711 0.0486628 -1.54198 1 0 1 1 0 0 +EDGE2 1591 1290 -1.04054 -0.0145952 1.51445 1 0 1 1 0 0 +EDGE2 1591 1570 -0.999703 0.0840214 -1.57667 1 0 1 1 0 0 +EDGE2 1592 1573 1.00888 -0.000328791 0.0124622 1 0 1 1 0 0 +EDGE2 1592 1572 -0.0461863 0.0348143 0.0434131 1 0 1 1 0 0 +EDGE2 1592 1571 -1.03023 -0.0568488 0.00969918 1 0 1 1 0 0 +EDGE2 1592 1591 -0.984872 -0.00799931 -0.0204658 1 0 1 1 0 0 +EDGE2 1593 1574 1.02149 0.0153378 0.0208649 1 0 1 1 0 0 +EDGE2 1593 1573 -0.052736 -0.0881248 0.00361073 1 0 1 1 0 0 +EDGE2 1593 1572 -0.997335 0.0210049 0.0233959 1 0 1 1 0 0 +EDGE2 1593 1592 -0.959754 0.00588165 0.0158964 1 0 1 1 0 0 +EDGE2 1594 1535 1.01732 -0.0196311 -3.13378 1 0 1 1 0 0 +EDGE2 1594 1575 1.04234 -0.0543668 0.0542082 1 0 1 1 0 0 +EDGE2 1594 1375 1.0517 0.00214967 -3.15519 1 0 1 1 0 0 +EDGE2 1594 1515 0.980248 0.0442265 -3.14626 1 0 1 1 0 0 +EDGE2 1594 1574 0.0403723 -0.0629767 0.0159347 1 0 1 1 0 0 +EDGE2 1594 1573 -0.912429 -0.0137949 -0.0242331 1 0 1 1 0 0 +EDGE2 1594 1593 -1.07313 -0.00517169 0.0446036 1 0 1 1 0 0 +EDGE2 1595 1536 -0.00260473 0.996343 1.55778 1 0 1 1 0 0 +EDGE2 1595 1576 0.0315809 1.00731 1.57919 1 0 1 1 0 0 +EDGE2 1595 1376 0.0339841 1.0723 1.59008 1 0 1 1 0 0 +EDGE2 1595 1535 -0.0733642 -0.0329133 -3.1224 1 0 1 1 0 0 +EDGE2 1595 1514 0.951268 -0.0254799 -3.12764 1 0 1 1 0 0 +EDGE2 1595 1534 1.02424 0.028912 -3.15993 1 0 1 1 0 0 +EDGE2 1595 1374 0.965771 -0.0139057 -3.12173 1 0 1 1 0 0 +EDGE2 1595 1575 0.0802838 0.0146524 0.0158563 1 0 1 1 0 0 +EDGE2 1595 1375 0.066618 -0.164985 -3.12012 1 0 1 1 0 0 +EDGE2 1595 1515 0.0847022 0.0146082 -3.13645 1 0 1 1 0 0 +EDGE2 1595 1574 -0.974262 -0.0259626 -0.00815266 1 0 1 1 0 0 +EDGE2 1595 1594 -1.01245 0.0170883 0.0131175 1 0 1 1 0 0 +EDGE2 1595 1516 -0.0398571 -1.00081 -1.60441 1 0 1 1 0 0 +EDGE2 1596 1535 -0.9861 0.0135499 -1.61888 1 0 1 1 0 0 +EDGE2 1596 1595 -0.971382 0.0431656 1.57948 1 0 1 1 0 0 +EDGE2 1596 1575 -1.02158 0.0570501 1.5474 1 0 1 1 0 0 +EDGE2 1596 1375 -0.918617 -0.0299496 -1.57459 1 0 1 1 0 0 +EDGE2 1596 1515 -1.10936 0.00318421 -1.53486 1 0 1 1 0 0 +EDGE2 1596 1516 0.0207464 0.0349544 -0.0356443 1 0 1 1 0 0 +EDGE2 1596 1517 0.970484 -0.0163003 -0.00956165 1 0 1 1 0 0 +EDGE2 1597 1516 -1.05919 0.0429477 -0.0296523 1 0 1 1 0 0 +EDGE2 1597 1596 -0.89685 0.0124917 -0.00757807 1 0 1 1 0 0 +EDGE2 1597 1517 -0.00269626 -0.0527999 -0.00566491 1 0 1 1 0 0 +EDGE2 1597 1518 0.947336 -0.0587779 -0.00875934 1 0 1 1 0 0 +EDGE2 1598 1597 -0.997568 -0.00658319 -0.000344372 1 0 1 1 0 0 +EDGE2 1598 1517 -0.839753 0.0856651 0.0512814 1 0 1 1 0 0 +EDGE2 1598 1518 0.00819214 0.0612391 0.0342922 1 0 1 1 0 0 +EDGE2 1598 1519 1.02795 0.0273694 -0.0027864 1 0 1 1 0 0 +EDGE2 1599 1598 -0.959165 0.00417581 -0.0173368 1 0 1 1 0 0 +EDGE2 1599 1518 -1.00939 0.025257 0.01765 1 0 1 1 0 0 +EDGE2 1599 1519 0.0121901 0.0282868 0.00668403 1 0 1 1 0 0 +EDGE2 1599 1520 1.05911 0.0255184 0.0151633 1 0 1 1 0 0 +EDGE2 1599 1320 1.04498 -0.0217478 -3.15308 1 0 1 1 0 0 +EDGE2 1600 1599 -0.923989 -0.0405822 0.00964956 1 0 1 1 0 0 +EDGE2 1600 1519 -1.02938 -0.0808119 -0.013963 1 0 1 1 0 0 +EDGE2 1600 1521 -0.0966594 0.981371 1.57022 1 0 1 1 0 0 +EDGE2 1600 1321 0.018802 1.01399 1.56032 1 0 1 1 0 0 +EDGE2 1600 1520 -0.0125332 -0.0564813 0.00494674 1 0 1 1 0 0 +EDGE2 1600 1320 -0.024782 0.0243645 -3.14244 1 0 1 1 0 0 +EDGE2 1600 1319 0.981408 0.0140957 -3.13538 1 0 1 1 0 0 +EDGE2 1601 1520 -1.00444 -0.0293968 1.57148 1 0 1 1 0 0 +EDGE2 1601 1600 -0.946618 -0.00327489 1.54767 1 0 1 1 0 0 +EDGE2 1601 1320 -0.914811 -0.0472765 -1.55992 1 0 1 1 0 0 +EDGE2 1602 1601 -1.04562 0.0135212 0.00742855 1 0 1 1 0 0 +EDGE2 1603 1602 -0.95986 -0.049322 -0.0149249 1 0 1 1 0 0 +EDGE2 1604 1603 -1.00899 0.0530905 -0.0228563 1 0 1 1 0 0 +EDGE2 1604 1285 0.999027 0.0346185 -3.16442 1 0 1 1 0 0 +EDGE2 1604 1305 1.0703 0.0348399 -3.17158 1 0 1 1 0 0 +EDGE2 1605 1604 -1.01776 0.0128165 0.0352993 1 0 1 1 0 0 +EDGE2 1605 1304 0.908138 -0.0111781 -3.11423 1 0 1 1 0 0 +EDGE2 1605 1286 0.0369958 -0.96187 -1.5996 1 0 1 1 0 0 +EDGE2 1605 1285 -0.0835396 0.00894127 -3.15322 1 0 1 1 0 0 +EDGE2 1605 1305 0.0291716 0.0113967 -3.14361 1 0 1 1 0 0 +EDGE2 1605 1284 1.01866 -0.0367441 -3.15893 1 0 1 1 0 0 +EDGE2 1605 1306 -0.0138039 0.95224 1.54761 1 0 1 1 0 0 +EDGE2 1606 1285 -1.00876 0.0198849 1.55472 1 0 1 1 0 0 +EDGE2 1606 1305 -0.989861 0.0765128 1.57358 1 0 1 1 0 0 +EDGE2 1606 1605 -1.02203 0.0146046 -1.58407 1 0 1 1 0 0 +EDGE2 1606 1306 0.0706319 0.069377 0.0319261 1 0 1 1 0 0 +EDGE2 1606 1307 0.953249 -0.0351506 0.0346104 1 0 1 1 0 0 +EDGE2 1607 1606 -0.989634 0.0356497 0.00357177 1 0 1 1 0 0 +EDGE2 1607 1306 -0.999881 0.0636562 0.00801241 1 0 1 1 0 0 +EDGE2 1607 1307 0.0397367 0.0499318 0.0150518 1 0 1 1 0 0 +EDGE2 1607 1308 0.953026 -0.0383766 -0.0116329 1 0 1 1 0 0 +EDGE2 1608 1607 -0.950854 -0.0371873 0.00472649 1 0 1 1 0 0 +EDGE2 1608 1307 -0.959585 0.0220469 0.00640002 1 0 1 1 0 0 +EDGE2 1608 1308 0.0174585 -0.0874588 -0.00117845 1 0 1 1 0 0 +EDGE2 1608 1309 1.06456 0.060341 0.0112295 1 0 1 1 0 0 +EDGE2 1609 1308 -0.955001 0.0586282 0.0493958 1 0 1 1 0 0 +EDGE2 1609 1608 -0.991212 -0.0256484 -0.013711 1 0 1 1 0 0 +EDGE2 1609 1309 -0.0304246 -0.0659111 0.0496198 1 0 1 1 0 0 +EDGE2 1609 1310 1.10723 -0.0083176 0.0122814 1 0 1 1 0 0 +EDGE2 1610 1609 -1.05389 -0.11482 0.0106612 1 0 1 1 0 0 +EDGE2 1610 1309 -1.08465 0.0198379 -0.00196858 1 0 1 1 0 0 +EDGE2 1610 1311 -0.00498878 0.919738 1.58348 1 0 1 1 0 0 +EDGE2 1610 1310 -0.0129731 0.0272523 0.018648 1 0 1 1 0 0 +EDGE2 1611 1312 0.908253 -0.00895117 0.00164015 1 0 1 1 0 0 +EDGE2 1611 1311 -0.0048247 0.0418877 0.0141045 1 0 1 1 0 0 +EDGE2 1611 1610 -0.937016 0.00402919 -1.56498 1 0 1 1 0 0 +EDGE2 1611 1310 -1.07317 0.000901116 -1.5796 1 0 1 1 0 0 +EDGE2 1612 1313 1.04429 -0.0789496 -0.0213236 1 0 1 1 0 0 +EDGE2 1612 1611 -1.06031 0.0299292 0.0156017 1 0 1 1 0 0 +EDGE2 1612 1312 0.00279988 -0.0253004 -0.000230509 1 0 1 1 0 0 +EDGE2 1612 1311 -0.996031 -0.0466933 0.00359547 1 0 1 1 0 0 +EDGE2 1613 1314 1.01561 0.0480295 -0.00312836 1 0 1 1 0 0 +EDGE2 1613 1612 -1.12779 0.0522755 0.0146068 1 0 1 1 0 0 +EDGE2 1613 1313 0.0451869 -0.0113797 -0.0160222 1 0 1 1 0 0 +EDGE2 1613 1312 -1.02417 0.0413036 0.00251255 1 0 1 1 0 0 +EDGE2 1614 1314 0.0022987 0.019051 -0.0209346 1 0 1 1 0 0 +EDGE2 1614 1315 1.04657 0.106364 -0.0117313 1 0 1 1 0 0 +EDGE2 1614 1313 -1.03194 0.0349942 -0.00643938 1 0 1 1 0 0 +EDGE2 1614 1613 -1.09686 -0.0372694 0.0110831 1 0 1 1 0 0 +EDGE2 1615 1316 -0.029203 1.01041 1.57296 1 0 1 1 0 0 +EDGE2 1615 1314 -0.950914 -0.0274035 0.0157671 1 0 1 1 0 0 +EDGE2 1615 1315 0.00815083 -0.00810061 0.0193771 1 0 1 1 0 0 +EDGE2 1615 1614 -0.945884 0.0586748 0.0119063 1 0 1 1 0 0 +EDGE2 1616 1317 0.985358 0.00373158 0.01459 1 0 1 1 0 0 +EDGE2 1616 1316 0.0239635 -0.00604969 -0.0052593 1 0 1 1 0 0 +EDGE2 1616 1315 -0.99372 0.0716838 -1.53642 1 0 1 1 0 0 +EDGE2 1616 1615 -0.948482 0.0199059 -1.56999 1 0 1 1 0 0 +EDGE2 1617 1318 0.894013 -0.0812967 -0.0123561 1 0 1 1 0 0 +EDGE2 1617 1317 -0.002884 -0.0101384 0.0150852 1 0 1 1 0 0 +EDGE2 1617 1316 -0.954654 0.0496996 -0.00193943 1 0 1 1 0 0 +EDGE2 1617 1616 -1.00367 -0.048098 -0.0109529 1 0 1 1 0 0 +EDGE2 1618 1319 1.02952 -0.0883008 0.0274562 1 0 1 1 0 0 +EDGE2 1618 1318 -0.0254402 -0.0312806 -0.00755312 1 0 1 1 0 0 +EDGE2 1618 1617 -1.06167 -0.0172683 0.0305058 1 0 1 1 0 0 +EDGE2 1618 1317 -1.00719 0.00651844 -0.00897972 1 0 1 1 0 0 +EDGE2 1619 1520 0.878609 -0.019092 -3.12292 1 0 1 1 0 0 +EDGE2 1619 1600 1.08153 0.127723 -3.14382 1 0 1 1 0 0 +EDGE2 1619 1320 0.963471 0.00194926 0.00861743 1 0 1 1 0 0 +EDGE2 1619 1319 -0.000234003 0.0325795 -0.00183761 1 0 1 1 0 0 +EDGE2 1619 1618 -1.04272 -0.0119224 -0.0366441 1 0 1 1 0 0 +EDGE2 1619 1318 -0.999898 -0.078749 -0.0239429 1 0 1 1 0 0 +EDGE2 1620 1599 1.01673 0.0258962 -3.1512 1 0 1 1 0 0 +EDGE2 1620 1519 0.981192 0.0625997 -3.09472 1 0 1 1 0 0 +EDGE2 1620 1521 -0.0053469 -0.863814 -1.58389 1 0 1 1 0 0 +EDGE2 1620 1321 0.0370372 -0.972584 -1.58786 1 0 1 1 0 0 +EDGE2 1620 1520 -0.0740498 0.070403 -3.15 1 0 1 1 0 0 +EDGE2 1620 1600 0.00711809 0.00880487 -3.15192 1 0 1 1 0 0 +EDGE2 1620 1320 -0.0484777 0.00613673 0.00586072 1 0 1 1 0 0 +EDGE2 1620 1601 -0.0160208 1.05851 1.59868 1 0 1 1 0 0 +EDGE2 1620 1619 -1.00602 -0.0150449 -0.0144674 1 0 1 1 0 0 +EDGE2 1620 1319 -0.990158 -0.0319351 -0.0371256 1 0 1 1 0 0 +EDGE2 1621 1520 -0.963003 0.0474132 1.5697 1 0 1 1 0 0 +EDGE2 1621 1620 -1.03 -0.0425094 -1.6016 1 0 1 1 0 0 +EDGE2 1621 1600 -0.998273 -0.0386675 1.58736 1 0 1 1 0 0 +EDGE2 1621 1320 -1.00084 -0.0213352 -1.5805 1 0 1 1 0 0 +EDGE2 1621 1601 0.0234227 -0.0497801 0.0118788 1 0 1 1 0 0 +EDGE2 1621 1602 1.01915 -0.0304016 0.0356016 1 0 1 1 0 0 +EDGE2 1622 1621 -0.989931 0.0980639 -0.0205722 1 0 1 1 0 0 +EDGE2 1622 1601 -1.08052 0.0835642 0.0151448 1 0 1 1 0 0 +EDGE2 1622 1603 1.08639 -0.0324819 -0.0114645 1 0 1 1 0 0 +EDGE2 1622 1602 0.0369932 -0.0522769 0.00836928 1 0 1 1 0 0 +EDGE2 1623 1603 0.0610245 -0.037187 -0.0310452 1 0 1 1 0 0 +EDGE2 1623 1602 -0.937111 -0.0252802 -0.0162373 1 0 1 1 0 0 +EDGE2 1623 1622 -1.00919 -0.0461108 0.00962802 1 0 1 1 0 0 +EDGE2 1623 1604 0.942808 -0.0206905 0.00695622 1 0 1 1 0 0 +EDGE2 1624 1603 -0.997135 -0.0708418 0.0189924 1 0 1 1 0 0 +EDGE2 1624 1623 -1.00158 0.00782766 -0.0182102 1 0 1 1 0 0 +EDGE2 1624 1604 0.136236 -0.0374852 -0.000482381 1 0 1 1 0 0 +EDGE2 1624 1285 0.93908 -0.000154052 -3.11446 1 0 1 1 0 0 +EDGE2 1624 1305 0.969686 0.0280776 -3.17049 1 0 1 1 0 0 +EDGE2 1624 1605 0.987409 0.041138 -0.00117055 1 0 1 1 0 0 +EDGE2 1625 1624 -0.992671 -0.0370447 -0.0221206 1 0 1 1 0 0 +EDGE2 1625 1604 -0.984949 0.121455 -0.0026487 1 0 1 1 0 0 +EDGE2 1625 1304 1.025 -0.00314103 -3.1742 1 0 1 1 0 0 +EDGE2 1625 1286 -0.0483567 -0.899084 -1.57666 1 0 1 1 0 0 +EDGE2 1625 1285 0.000153546 0.0537582 -3.18306 1 0 1 1 0 0 +EDGE2 1625 1305 -0.045038 -0.0462829 -3.129 1 0 1 1 0 0 +EDGE2 1625 1605 0.0144592 0.117102 -0.0152928 1 0 1 1 0 0 +EDGE2 1625 1284 0.944524 0.0813845 -3.11767 1 0 1 1 0 0 +EDGE2 1625 1606 0.063646 1.02889 1.57662 1 0 1 1 0 0 +EDGE2 1625 1306 -0.00595172 0.973877 1.57205 1 0 1 1 0 0 +EDGE2 1626 1625 -1.03151 -0.0109989 -1.61183 1 0 1 1 0 0 +EDGE2 1626 1285 -0.940519 -0.0355687 1.56699 1 0 1 1 0 0 +EDGE2 1626 1305 -1.01174 -0.01378 1.58323 1 0 1 1 0 0 +EDGE2 1626 1605 -1.00569 -0.0510569 -1.56963 1 0 1 1 0 0 +EDGE2 1626 1606 0.0395925 -0.00644632 -0.00163448 1 0 1 1 0 0 +EDGE2 1626 1306 0.000248395 0.100896 -0.000935972 1 0 1 1 0 0 +EDGE2 1626 1607 1.0493 -0.0240224 -0.00364625 1 0 1 1 0 0 +EDGE2 1626 1307 1.03287 0.059511 -0.0034698 1 0 1 1 0 0 +EDGE2 1627 1606 -1.05891 -0.0117809 -0.027113 1 0 1 1 0 0 +EDGE2 1627 1626 -1.04631 0.0264587 0.00897071 1 0 1 1 0 0 +EDGE2 1627 1306 -1.00012 -0.0522813 0.0370744 1 0 1 1 0 0 +EDGE2 1627 1607 0.0819122 -0.00447614 -0.0131441 1 0 1 1 0 0 +EDGE2 1627 1307 0.0513903 -0.0332111 0.0183045 1 0 1 1 0 0 +EDGE2 1627 1308 0.958841 0.0381741 -0.0210549 1 0 1 1 0 0 +EDGE2 1627 1608 1.07026 -0.12849 0.0223818 1 0 1 1 0 0 +EDGE2 1628 1607 -0.986156 0.0267067 -0.037843 1 0 1 1 0 0 +EDGE2 1628 1627 -0.976695 0.0197826 0.0151526 1 0 1 1 0 0 +EDGE2 1628 1307 -0.962917 -0.0267194 0.0357442 1 0 1 1 0 0 +EDGE2 1628 1609 0.966216 -0.0231165 -0.00304434 1 0 1 1 0 0 +EDGE2 1628 1308 -0.0540575 -0.0147217 0.00762955 1 0 1 1 0 0 +EDGE2 1628 1608 0.0222547 -0.062415 0.0209593 1 0 1 1 0 0 +EDGE2 1628 1309 1.00913 -0.00280347 -0.00676518 1 0 1 1 0 0 +EDGE2 1629 1609 0.0309071 -0.00202461 -0.0239603 1 0 1 1 0 0 +EDGE2 1629 1308 -1.02163 0.0504479 -0.0242733 1 0 1 1 0 0 +EDGE2 1629 1608 -1.00712 -0.0244914 0.0192678 1 0 1 1 0 0 +EDGE2 1629 1628 -1.06427 0.0611028 0.0415672 1 0 1 1 0 0 +EDGE2 1629 1309 0.0916664 -0.0048312 -0.00669274 1 0 1 1 0 0 +EDGE2 1629 1610 0.944574 -0.0496442 -0.00068335 1 0 1 1 0 0 +EDGE2 1629 1310 0.974196 -0.0379939 -0.00999963 1 0 1 1 0 0 +EDGE2 1630 1609 -1.02881 -0.0682493 -0.0205833 1 0 1 1 0 0 +EDGE2 1630 1629 -0.974294 0.034264 -0.0205262 1 0 1 1 0 0 +EDGE2 1630 1309 -1.05897 -0.0793468 -0.00911742 1 0 1 1 0 0 +EDGE2 1630 1611 0.0525539 0.955256 1.59447 1 0 1 1 0 0 +EDGE2 1630 1311 0.0365542 1.04627 1.57484 1 0 1 1 0 0 +EDGE2 1630 1610 -0.0213859 -0.0527692 -0.0114188 1 0 1 1 0 0 +EDGE2 1630 1310 0.0283301 -0.0248729 -0.0101272 1 0 1 1 0 0 +EDGE2 1631 1612 0.999852 0.0286347 0.0174447 1 0 1 1 0 0 +EDGE2 1631 1611 -0.0227019 0.0338522 0.0225095 1 0 1 1 0 0 +EDGE2 1631 1312 1.06438 0.0390513 0.0120383 1 0 1 1 0 0 +EDGE2 1631 1311 0.0542182 0.0207649 0.020844 1 0 1 1 0 0 +EDGE2 1631 1610 -0.992991 -0.0161134 -1.58235 1 0 1 1 0 0 +EDGE2 1631 1630 -0.967424 0.0534863 -1.59281 1 0 1 1 0 0 +EDGE2 1631 1310 -0.969446 -0.0324859 -1.55168 1 0 1 1 0 0 +EDGE2 1632 1612 -0.0204631 0.0140457 0.0226559 1 0 1 1 0 0 +EDGE2 1632 1313 0.964793 -0.0111321 0.00109514 1 0 1 1 0 0 +EDGE2 1632 1613 1.01579 0.116947 0.00258262 1 0 1 1 0 0 +EDGE2 1632 1611 -0.958809 0.0750882 -0.0389354 1 0 1 1 0 0 +EDGE2 1632 1631 -0.994237 0.0501949 0.010079 1 0 1 1 0 0 +EDGE2 1632 1312 -0.00143849 0.00972271 -0.0149959 1 0 1 1 0 0 +EDGE2 1632 1311 -0.995754 -0.0981236 -0.0291946 1 0 1 1 0 0 +EDGE2 1633 1314 0.952188 0.0187662 0.0304267 1 0 1 1 0 0 +EDGE2 1633 1614 0.984312 -0.0818593 -0.0212657 1 0 1 1 0 0 +EDGE2 1633 1612 -1.08517 -0.0208003 -0.00594321 1 0 1 1 0 0 +EDGE2 1633 1313 -0.0544111 0.00539292 -0.0321823 1 0 1 1 0 0 +EDGE2 1633 1613 -0.0446563 -0.0467626 -0.00931591 1 0 1 1 0 0 +EDGE2 1633 1632 -1.01582 0.0554477 0.0346391 1 0 1 1 0 0 +EDGE2 1633 1312 -1.1096 0.0279508 0.00758014 1 0 1 1 0 0 +EDGE2 1634 1314 -0.0806684 -0.0318738 0.0100973 1 0 1 1 0 0 +EDGE2 1634 1315 1.01403 0.00883096 -0.00738123 1 0 1 1 0 0 +EDGE2 1634 1615 0.963282 0.0854146 -0.0151082 1 0 1 1 0 0 +EDGE2 1634 1614 -0.0142417 0.00311057 0.0142365 1 0 1 1 0 0 +EDGE2 1634 1313 -1.00165 0.0723355 0.0134921 1 0 1 1 0 0 +EDGE2 1634 1613 -1.02033 -0.00181217 0.00715645 1 0 1 1 0 0 +EDGE2 1634 1633 -1.09527 0.0408291 0.0305015 1 0 1 1 0 0 +EDGE2 1635 1316 0.017234 1.09017 1.5864 1 0 1 1 0 0 +EDGE2 1635 1616 -0.00855584 1.04421 1.53953 1 0 1 1 0 0 +EDGE2 1635 1314 -1.04137 -0.0792534 -0.0133265 1 0 1 1 0 0 +EDGE2 1635 1634 -1.08711 -0.0744749 0.0286048 1 0 1 1 0 0 +EDGE2 1635 1315 0.0259802 -0.049066 0.00402127 1 0 1 1 0 0 +EDGE2 1635 1615 0.0145412 -0.0039525 -0.00693511 1 0 1 1 0 0 +EDGE2 1635 1614 -1.00677 -0.0525132 -0.0107631 1 0 1 1 0 0 +EDGE2 1636 1635 -1.02998 0.0268397 -1.61205 1 0 1 1 0 0 +EDGE2 1636 1617 1.03967 -0.0468483 0.0148104 1 0 1 1 0 0 +EDGE2 1636 1317 0.933765 -0.00576809 0.00576687 1 0 1 1 0 0 +EDGE2 1636 1316 -0.0267424 -0.0953566 -0.0159807 1 0 1 1 0 0 +EDGE2 1636 1616 -0.00126627 0.0123791 0.0214618 1 0 1 1 0 0 +EDGE2 1636 1315 -1.03044 0.128335 -1.58136 1 0 1 1 0 0 +EDGE2 1636 1615 -0.956471 -0.0884103 -1.58388 1 0 1 1 0 0 +EDGE2 1637 1618 1.05365 0.0523746 -0.0152222 1 0 1 1 0 0 +EDGE2 1637 1318 1.06919 0.00503473 -0.0155387 1 0 1 1 0 0 +EDGE2 1637 1617 -0.0324907 0.0523524 0.0157019 1 0 1 1 0 0 +EDGE2 1637 1317 -0.0215162 -0.112674 0.00742103 1 0 1 1 0 0 +EDGE2 1637 1316 -1.02315 -0.0478965 0.0463034 1 0 1 1 0 0 +EDGE2 1637 1616 -0.978775 -0.0267656 0.00498746 1 0 1 1 0 0 +EDGE2 1637 1636 -0.990818 0.0433057 0.0168563 1 0 1 1 0 0 +EDGE2 1638 1619 0.928491 -0.0040853 -0.0344238 1 0 1 1 0 0 +EDGE2 1638 1319 1.02434 -0.0260013 -0.00807287 1 0 1 1 0 0 +EDGE2 1638 1618 0.0171819 0.0341222 -0.0191518 1 0 1 1 0 0 +EDGE2 1638 1318 0.140781 -0.102416 0.0160815 1 0 1 1 0 0 +EDGE2 1638 1617 -0.946313 -0.011321 -0.00326487 1 0 1 1 0 0 +EDGE2 1638 1637 -1.0684 -0.0533231 0.0518837 1 0 1 1 0 0 +EDGE2 1638 1317 -0.926749 -0.088329 0.00900316 1 0 1 1 0 0 +EDGE2 1639 1520 0.997486 0.00204753 -3.14907 1 0 1 1 0 0 +EDGE2 1639 1620 1.03781 -0.0436231 -0.0163936 1 0 1 1 0 0 +EDGE2 1639 1600 1.0095 0.0382441 -3.17421 1 0 1 1 0 0 +EDGE2 1639 1320 1.0362 0.00959185 0.0383226 1 0 1 1 0 0 +EDGE2 1639 1619 -0.0720977 0.00405986 -0.0261705 1 0 1 1 0 0 +EDGE2 1639 1319 0.0709821 -0.0512392 0.018147 1 0 1 1 0 0 +EDGE2 1639 1618 -1.0744 -0.0390878 -0.00580143 1 0 1 1 0 0 +EDGE2 1639 1638 -0.912519 0.0232774 -0.00877687 1 0 1 1 0 0 +EDGE2 1639 1318 -1.00435 -0.0223352 -0.0147487 1 0 1 1 0 0 +EDGE2 1640 1599 0.945025 0.0916639 -3.13838 1 0 1 1 0 0 +EDGE2 1640 1519 1.0293 -0.0409119 -3.14091 1 0 1 1 0 0 +EDGE2 1640 1521 0.0752815 -0.939091 -1.5713 1 0 1 1 0 0 +EDGE2 1640 1321 0.00946703 -1.00107 -1.57425 1 0 1 1 0 0 +EDGE2 1640 1520 -0.0241188 -0.047693 -3.16395 1 0 1 1 0 0 +EDGE2 1640 1620 -0.034985 0.0263694 0.00991467 1 0 1 1 0 0 +EDGE2 1640 1600 -0.102056 0.100439 -3.17336 1 0 1 1 0 0 +EDGE2 1640 1621 0.00153387 1.00361 1.56437 1 0 1 1 0 0 +EDGE2 1640 1320 0.00602425 -0.0311119 -0.0500597 1 0 1 1 0 0 +EDGE2 1640 1601 0.0287667 0.95522 1.56083 1 0 1 1 0 0 +EDGE2 1640 1619 -1.00491 0.0220227 -0.00940384 1 0 1 1 0 0 +EDGE2 1640 1639 -0.997782 0.0188614 -0.016972 1 0 1 1 0 0 +EDGE2 1640 1319 -1.01778 -0.00222988 0.0276787 1 0 1 1 0 0 +EDGE2 1641 1322 0.903389 0.0422429 -0.0217257 1 0 1 1 0 0 +EDGE2 1641 1522 0.922677 -0.0803943 0.0553488 1 0 1 1 0 0 +EDGE2 1641 1521 0.116841 0.0493664 -0.028709 1 0 1 1 0 0 +EDGE2 1641 1321 0.0126967 0.0163337 0.000777103 1 0 1 1 0 0 +EDGE2 1641 1520 -0.964085 -0.0361686 -1.5445 1 0 1 1 0 0 +EDGE2 1641 1620 -0.970334 0.00592546 1.59432 1 0 1 1 0 0 +EDGE2 1641 1640 -1.01693 -0.0381593 1.56217 1 0 1 1 0 0 +EDGE2 1641 1600 -0.997867 0.0251219 -1.58996 1 0 1 1 0 0 +EDGE2 1641 1320 -0.983573 0.00144335 1.5814 1 0 1 1 0 0 +EDGE2 1642 1323 0.99659 0.0226236 -0.00358541 1 0 1 1 0 0 +EDGE2 1642 1523 1.07838 0.043481 -0.00234416 1 0 1 1 0 0 +EDGE2 1642 1322 0.0241612 -0.0449499 -0.0119563 1 0 1 1 0 0 +EDGE2 1642 1522 0.0912598 -0.0410435 -0.0286664 1 0 1 1 0 0 +EDGE2 1642 1521 -0.896061 0.000110077 -0.00215465 1 0 1 1 0 0 +EDGE2 1642 1641 -0.97554 -0.0345444 0.00330745 1 0 1 1 0 0 +EDGE2 1642 1321 -1.04526 0.0439882 -0.00057724 1 0 1 1 0 0 +EDGE2 1643 1524 0.988429 0.0393282 0.000625374 1 0 1 1 0 0 +EDGE2 1643 1324 0.948423 0.0541887 0.029315 1 0 1 1 0 0 +EDGE2 1643 1323 -0.042292 0.0440796 0.0374554 1 0 1 1 0 0 +EDGE2 1643 1523 0.0354452 -0.0316976 0.0167606 1 0 1 1 0 0 +EDGE2 1643 1322 -1.02519 0.0545389 -0.0117639 1 0 1 1 0 0 +EDGE2 1643 1642 -1.06365 0.0263953 -0.0343142 1 0 1 1 0 0 +EDGE2 1643 1522 -0.939491 -0.0628232 -0.0148213 1 0 1 1 0 0 +EDGE2 1644 1345 0.988499 0.0147736 -3.16425 1 0 1 1 0 0 +EDGE2 1644 1525 1.05004 0.0524565 -0.00916659 1 0 1 1 0 0 +EDGE2 1644 1485 1.08038 0.0859782 -3.17901 1 0 1 1 0 0 +EDGE2 1644 1505 1.04485 -0.0168207 -3.14939 1 0 1 1 0 0 +EDGE2 1644 1365 1.00975 0.0441353 -3.15194 1 0 1 1 0 0 +EDGE2 1644 1325 1.05549 -0.0322014 -0.0309649 1 0 1 1 0 0 +EDGE2 1644 1524 0.0335684 0.0271821 0.0138741 1 0 1 1 0 0 +EDGE2 1644 1324 -0.00913993 0.00872453 0.00962923 1 0 1 1 0 0 +EDGE2 1644 1323 -0.972734 0.0515954 -0.00521913 1 0 1 1 0 0 +EDGE2 1644 1643 -0.99081 0.0097156 0.00345114 1 0 1 1 0 0 +EDGE2 1644 1523 -1.07289 0.042588 -0.0453491 1 0 1 1 0 0 +EDGE2 1645 1345 0.0230485 -0.0370086 -3.14022 1 0 1 1 0 0 +EDGE2 1645 1526 0.0617404 0.989111 1.57802 1 0 1 1 0 0 +EDGE2 1645 1366 0.0638675 1.05975 1.57174 1 0 1 1 0 0 +EDGE2 1645 1506 0.0470736 1.06287 1.61956 1 0 1 1 0 0 +EDGE2 1645 1344 0.939908 0.0531478 -3.16323 1 0 1 1 0 0 +EDGE2 1645 1484 1.01587 -0.0252931 -3.1647 1 0 1 1 0 0 +EDGE2 1645 1504 0.974138 0.0517561 -3.14966 1 0 1 1 0 0 +EDGE2 1645 1364 1.00039 -0.0471777 -3.16848 1 0 1 1 0 0 +EDGE2 1645 1525 0.00400493 0.0114378 0.0188184 1 0 1 1 0 0 +EDGE2 1645 1485 -0.0142167 -0.047065 -3.13903 1 0 1 1 0 0 +EDGE2 1645 1505 0.0491068 0.0113157 -3.11946 1 0 1 1 0 0 +EDGE2 1645 1365 0.0452446 -0.00677487 -3.14632 1 0 1 1 0 0 +EDGE2 1645 1325 0.00518966 0.028395 -0.0300411 1 0 1 1 0 0 +EDGE2 1645 1524 -0.974694 0.0685774 0.0194154 1 0 1 1 0 0 +EDGE2 1645 1644 -1.02188 0.0253928 -0.00970953 1 0 1 1 0 0 +EDGE2 1645 1324 -0.964774 -0.0645348 0.0351594 1 0 1 1 0 0 +EDGE2 1645 1486 0.0569053 -1.02447 -1.57768 1 0 1 1 0 0 +EDGE2 1645 1326 -0.0617616 -1.00405 -1.58012 1 0 1 1 0 0 +EDGE2 1645 1346 0.070123 -0.950912 -1.5843 1 0 1 1 0 0 +EDGE2 1646 1345 -1.04309 -0.0302751 1.55962 1 0 1 1 0 0 +EDGE2 1646 1526 0.00547904 0.0697215 -0.0153318 1 0 1 1 0 0 +EDGE2 1646 1507 1.03234 0.0723245 -0.00961771 1 0 1 1 0 0 +EDGE2 1646 1527 0.889563 0.00219624 0.0124818 1 0 1 1 0 0 +EDGE2 1646 1367 0.879982 0.0328065 -0.0114255 1 0 1 1 0 0 +EDGE2 1646 1366 0.0621861 0.000104194 -0.0223063 1 0 1 1 0 0 +EDGE2 1646 1506 -0.0176282 0.097733 -0.00765692 1 0 1 1 0 0 +EDGE2 1646 1525 -0.992767 -0.0704168 -1.56762 1 0 1 1 0 0 +EDGE2 1646 1645 -1.04082 -0.00879628 -1.55302 1 0 1 1 0 0 +EDGE2 1646 1485 -0.974855 -0.0160973 1.57256 1 0 1 1 0 0 +EDGE2 1646 1505 -0.956639 0.0871685 1.57136 1 0 1 1 0 0 +EDGE2 1646 1365 -1.01087 -0.0708811 1.55114 1 0 1 1 0 0 +EDGE2 1646 1325 -0.968222 -0.0375185 -1.57775 1 0 1 1 0 0 +EDGE2 1647 1368 0.948405 0.00765425 0.0200501 1 0 1 1 0 0 +EDGE2 1647 1508 0.928772 0.0477742 0.00100871 1 0 1 1 0 0 +EDGE2 1647 1528 1.01949 0.0356041 -0.0100408 1 0 1 1 0 0 +EDGE2 1647 1526 -0.946059 -0.0771333 -0.000585571 1 0 1 1 0 0 +EDGE2 1647 1507 0.0345513 0.0615782 0.00355154 1 0 1 1 0 0 +EDGE2 1647 1527 0.0503094 -0.0231311 0.00443835 1 0 1 1 0 0 +EDGE2 1647 1367 0.0295602 0.00727191 0.0241065 1 0 1 1 0 0 +EDGE2 1647 1646 -0.990501 0.0301404 -0.00457963 1 0 1 1 0 0 +EDGE2 1647 1366 -1.02189 0.100873 0.0104816 1 0 1 1 0 0 +EDGE2 1647 1506 -1.04258 0.024515 0.014306 1 0 1 1 0 0 +EDGE2 1648 1509 1.0268 -0.105248 0.0131284 1 0 1 1 0 0 +EDGE2 1648 1529 1.01193 0.00825199 0.00138849 1 0 1 1 0 0 +EDGE2 1648 1369 1.03364 0.0647476 0.0330955 1 0 1 1 0 0 +EDGE2 1648 1368 -0.140565 0.0346326 0.0149108 1 0 1 1 0 0 +EDGE2 1648 1508 -0.0429968 0.00354677 0.0243058 1 0 1 1 0 0 +EDGE2 1648 1528 -0.00643563 0.00442938 0.00973222 1 0 1 1 0 0 +EDGE2 1648 1507 -1.03744 -0.0124225 -0.0172622 1 0 1 1 0 0 +EDGE2 1648 1527 -1.05786 -0.0144313 0.0110745 1 0 1 1 0 0 +EDGE2 1648 1647 -0.937731 -0.0125895 -0.0177582 1 0 1 1 0 0 +EDGE2 1648 1367 -0.999623 0.0114231 0.0185544 1 0 1 1 0 0 +EDGE2 1649 1470 0.950676 -0.0671104 -3.15897 1 0 1 1 0 0 +EDGE2 1649 1510 1.0206 0.093823 0.0117954 1 0 1 1 0 0 +EDGE2 1649 1530 1.00518 0.00612942 -0.0221265 1 0 1 1 0 0 +EDGE2 1649 1370 1.028 0.027886 0.0210813 1 0 1 1 0 0 +EDGE2 1649 1509 0.164411 -0.104946 0.0354529 1 0 1 1 0 0 +EDGE2 1649 1529 -0.0231721 -0.110512 -0.013128 1 0 1 1 0 0 +EDGE2 1649 1369 -0.0158394 -0.127289 0.0140374 1 0 1 1 0 0 +EDGE2 1649 1648 -1.00727 0.0264383 0.00567339 1 0 1 1 0 0 +EDGE2 1649 1368 -1.00268 0.00852951 0.0169043 1 0 1 1 0 0 +EDGE2 1649 1508 -1.02168 -0.0165923 0.0219664 1 0 1 1 0 0 +EDGE2 1649 1528 -1.13968 0.0142142 -0.0467061 1 0 1 1 0 0 +EDGE2 1650 1469 0.951866 0.027325 -3.12396 1 0 1 1 0 0 +EDGE2 1650 1471 0.0232766 -1.0412 -1.57176 1 0 1 1 0 0 +EDGE2 1650 1470 -0.0550515 0.0609424 -3.1373 1 0 1 1 0 0 +EDGE2 1650 1510 0.0108944 0.00218453 -0.00112569 1 0 1 1 0 0 +EDGE2 1650 1530 -0.0420554 -0.0303945 0.0032948 1 0 1 1 0 0 +EDGE2 1650 1370 -0.041332 -0.0659239 -0.000822438 1 0 1 1 0 0 +EDGE2 1650 1371 0.090277 0.94397 1.55766 1 0 1 1 0 0 +EDGE2 1650 1531 -0.0414104 0.991142 1.54818 1 0 1 1 0 0 +EDGE2 1650 1511 0.0588156 1.06817 1.56812 1 0 1 1 0 0 +EDGE2 1650 1509 -0.960645 0.0146301 0.0301096 1 0 1 1 0 0 +EDGE2 1650 1649 -1.02926 -0.0359754 -0.0217906 1 0 1 1 0 0 +EDGE2 1650 1529 -0.967409 -0.0519583 -0.00852305 1 0 1 1 0 0 +EDGE2 1650 1369 -0.967926 0.026599 -0.00508503 1 0 1 1 0 0 +EDGE2 1651 1650 -1.02269 0.0435178 -1.54369 1 0 1 1 0 0 +EDGE2 1651 1470 -1.10199 0.0249127 1.57394 1 0 1 1 0 0 +EDGE2 1651 1510 -1.00104 -0.0117375 -1.5693 1 0 1 1 0 0 +EDGE2 1651 1530 -1.0726 -0.0296264 -1.56113 1 0 1 1 0 0 +EDGE2 1651 1370 -0.99002 -0.0370232 -1.53811 1 0 1 1 0 0 +EDGE2 1651 1371 0.0286009 -0.0189468 0.025639 1 0 1 1 0 0 +EDGE2 1651 1531 -0.0590218 -0.0389323 -0.00383802 1 0 1 1 0 0 +EDGE2 1651 1511 -0.00576976 -0.00802555 -0.00826819 1 0 1 1 0 0 +EDGE2 1651 1512 1.09081 0.0131463 -0.00778403 1 0 1 1 0 0 +EDGE2 1651 1532 0.997606 -0.0406402 0.0157338 1 0 1 1 0 0 +EDGE2 1651 1372 1.0644 -0.0291423 0.00101253 1 0 1 1 0 0 +EDGE2 1652 1371 -1.1099 0.050766 -0.022306 1 0 1 1 0 0 +EDGE2 1652 1531 -1.01616 0.0327394 -0.0228776 1 0 1 1 0 0 +EDGE2 1652 1651 -0.921563 -0.00109132 -0.0149906 1 0 1 1 0 0 +EDGE2 1652 1511 -1.06785 -0.0351711 -0.0112061 1 0 1 1 0 0 +EDGE2 1652 1512 0.0223434 -0.0185734 -0.00841309 1 0 1 1 0 0 +EDGE2 1652 1532 0.0113292 0.00442265 0.0137341 1 0 1 1 0 0 +EDGE2 1652 1372 0.0111725 -0.0469858 0.0367002 1 0 1 1 0 0 +EDGE2 1652 1513 1.06238 0.0177325 -0.0151123 1 0 1 1 0 0 +EDGE2 1652 1533 1.04262 0.0229882 -0.00984102 1 0 1 1 0 0 +EDGE2 1652 1373 1.02749 0.0919467 -0.0139428 1 0 1 1 0 0 +EDGE2 1653 1512 -1.08019 0.00226306 0.0017451 1 0 1 1 0 0 +EDGE2 1653 1652 -1.06198 -0.0382007 0.0251548 1 0 1 1 0 0 +EDGE2 1653 1532 -1.03599 0.060361 0.000113509 1 0 1 1 0 0 +EDGE2 1653 1372 -1.01838 0.00240443 0.00503989 1 0 1 1 0 0 +EDGE2 1653 1513 0.0549058 -0.0628144 -0.0192923 1 0 1 1 0 0 +EDGE2 1653 1533 0.0116799 0.023934 0.0128743 1 0 1 1 0 0 +EDGE2 1653 1373 -0.0312055 0.0738497 -0.0167385 1 0 1 1 0 0 +EDGE2 1653 1514 0.976706 0.0865758 0.00295527 1 0 1 1 0 0 +EDGE2 1653 1534 0.988721 0.0435273 0.0281618 1 0 1 1 0 0 +EDGE2 1653 1374 0.989204 -0.0277793 0.0169305 1 0 1 1 0 0 +EDGE2 1654 1535 0.955157 0.00651774 0.0266706 1 0 1 1 0 0 +EDGE2 1654 1513 -1.02903 0.00359335 0.0219724 1 0 1 1 0 0 +EDGE2 1654 1653 -0.952525 0.0670643 -0.0135454 1 0 1 1 0 0 +EDGE2 1654 1533 -0.975694 -0.0635169 0.0285196 1 0 1 1 0 0 +EDGE2 1654 1373 -0.991173 -0.00133465 -0.0418016 1 0 1 1 0 0 +EDGE2 1654 1514 0.0680466 -0.0215614 -0.0199551 1 0 1 1 0 0 +EDGE2 1654 1534 -0.000599194 0.00628671 -0.0253752 1 0 1 1 0 0 +EDGE2 1654 1374 0.0401506 -0.0581243 -0.00514325 1 0 1 1 0 0 +EDGE2 1654 1595 1.04193 -0.0226353 -3.16149 1 0 1 1 0 0 +EDGE2 1654 1575 0.939264 -0.0244151 -3.14372 1 0 1 1 0 0 +EDGE2 1654 1375 1.07576 -0.0330437 0.00715361 1 0 1 1 0 0 +EDGE2 1654 1515 1.02807 -0.0197469 0.0122875 1 0 1 1 0 0 +EDGE2 1655 1536 0.0144628 -1.08241 -1.57988 1 0 1 1 0 0 +EDGE2 1655 1576 0.0482069 -0.965093 -1.56941 1 0 1 1 0 0 +EDGE2 1655 1376 -0.0376512 -0.97755 -1.57968 1 0 1 1 0 0 +EDGE2 1655 1535 0.0813806 -0.00541617 0.0156823 1 0 1 1 0 0 +EDGE2 1655 1514 -0.985489 -0.0810402 -0.0138542 1 0 1 1 0 0 +EDGE2 1655 1654 -1.0316 0.0391953 0.0216909 1 0 1 1 0 0 +EDGE2 1655 1534 -1.08268 -0.0286286 -0.0127092 1 0 1 1 0 0 +EDGE2 1655 1374 -1.04066 0.0806919 -0.0119007 1 0 1 1 0 0 +EDGE2 1655 1595 -0.00463964 0.000478161 -3.17282 1 0 1 1 0 0 +EDGE2 1655 1575 0.01145 -0.0699801 -3.10944 1 0 1 1 0 0 +EDGE2 1655 1375 0.0608588 0.122622 0.0182199 1 0 1 1 0 0 +EDGE2 1655 1515 -0.0136591 0.00181202 0.00343092 1 0 1 1 0 0 +EDGE2 1655 1574 1.04186 0.00380927 -3.13917 1 0 1 1 0 0 +EDGE2 1655 1594 1.03761 0.0327048 -3.16561 1 0 1 1 0 0 +EDGE2 1655 1516 -0.0147154 1.02854 1.57911 1 0 1 1 0 0 +EDGE2 1655 1596 -0.0687364 0.987749 1.58137 1 0 1 1 0 0 +EDGE2 1656 1537 1.06707 0.0272793 0.00965205 1 0 1 1 0 0 +EDGE2 1656 1577 1.0126 0.0307176 0.0387542 1 0 1 1 0 0 +EDGE2 1656 1377 0.972972 -0.0292756 -0.0178643 1 0 1 1 0 0 +EDGE2 1656 1536 -0.00965616 -0.127306 -0.0333371 1 0 1 1 0 0 +EDGE2 1656 1576 -0.0371899 -0.00842524 -0.010308 1 0 1 1 0 0 +EDGE2 1656 1376 0.0561564 -0.0187816 -0.0191484 1 0 1 1 0 0 +EDGE2 1656 1535 -1.04982 -0.0684614 1.58505 1 0 1 1 0 0 +EDGE2 1656 1595 -1.06141 -0.0104656 -1.59432 1 0 1 1 0 0 +EDGE2 1656 1655 -0.965776 -0.0069592 1.58401 1 0 1 1 0 0 +EDGE2 1656 1575 -0.988318 -0.0952976 -1.56455 1 0 1 1 0 0 +EDGE2 1656 1375 -0.979624 0.0571002 1.57311 1 0 1 1 0 0 +EDGE2 1656 1515 -0.983996 0.00257152 1.57641 1 0 1 1 0 0 +EDGE2 1657 1378 0.989351 -0.0462835 -0.0312459 1 0 1 1 0 0 +EDGE2 1657 1578 1.06812 -0.0531985 0.01483 1 0 1 1 0 0 +EDGE2 1657 1538 1.05894 0.0819718 -0.0367063 1 0 1 1 0 0 +EDGE2 1657 1537 -0.00712407 -0.042891 -0.00879898 1 0 1 1 0 0 +EDGE2 1657 1577 0.0415587 0.0521806 -0.0292933 1 0 1 1 0 0 +EDGE2 1657 1656 -1.11694 -0.0266108 -0.00735343 1 0 1 1 0 0 +EDGE2 1657 1377 -0.0209915 0.00925333 -0.0375458 1 0 1 1 0 0 +EDGE2 1657 1536 -0.985662 -0.00399423 0.02293 1 0 1 1 0 0 +EDGE2 1657 1576 -1.00617 -0.114944 -0.0368288 1 0 1 1 0 0 +EDGE2 1657 1376 -1.00227 0.0151055 -0.0265297 1 0 1 1 0 0 +EDGE2 1658 1378 0.0400483 0.0130843 0.00840358 1 0 1 1 0 0 +EDGE2 1658 1579 1.0583 0.0321538 -0.00610184 1 0 1 1 0 0 +EDGE2 1658 1379 0.950697 -0.0647519 0.000740012 1 0 1 1 0 0 +EDGE2 1658 1539 0.99355 -0.0529336 -0.00484373 1 0 1 1 0 0 +EDGE2 1658 1578 0.060859 0.0462338 -0.00576692 1 0 1 1 0 0 +EDGE2 1658 1538 0.0233999 -0.051762 -0.0117028 1 0 1 1 0 0 +EDGE2 1658 1537 -0.99815 -0.00784495 0.00207348 1 0 1 1 0 0 +EDGE2 1658 1577 -0.982982 -0.0209198 -0.00186013 1 0 1 1 0 0 +EDGE2 1658 1657 -0.992322 0.0446576 -0.0284125 1 0 1 1 0 0 +EDGE2 1658 1377 -0.930148 0.068385 -0.0572098 1 0 1 1 0 0 +EDGE2 1659 1540 0.953738 0.00719711 -0.0302548 1 0 1 1 0 0 +EDGE2 1659 1580 0.985728 -0.00193594 -0.0228046 1 0 1 1 0 0 +EDGE2 1659 1560 0.999572 -0.0105569 -3.17593 1 0 1 1 0 0 +EDGE2 1659 1380 0.9991 -0.0353716 -0.0175976 1 0 1 1 0 0 +EDGE2 1659 1378 -1.08997 0.00412903 -0.0143839 1 0 1 1 0 0 +EDGE2 1659 1579 0.0473665 0.0451716 -0.00665468 1 0 1 1 0 0 +EDGE2 1659 1379 -0.0281696 -0.0516987 0.0452357 1 0 1 1 0 0 +EDGE2 1659 1539 -0.047847 0.0666641 0.0130048 1 0 1 1 0 0 +EDGE2 1659 1578 -0.96924 -0.0141717 0.00286864 1 0 1 1 0 0 +EDGE2 1659 1658 -0.990475 0.0463567 0.0173953 1 0 1 1 0 0 +EDGE2 1659 1538 -0.966105 -0.0441351 -0.0496573 1 0 1 1 0 0 +EDGE2 1660 1559 1.03231 0.100643 -3.1327 1 0 1 1 0 0 +EDGE2 1660 1540 0.0120526 0.0514138 -0.00404476 1 0 1 1 0 0 +EDGE2 1660 1381 0.00778069 -1.06666 -1.59875 1 0 1 1 0 0 +EDGE2 1660 1580 -0.0195828 -0.050681 -0.00471934 1 0 1 1 0 0 +EDGE2 1660 1560 0.0458424 0.0334858 -3.1308 1 0 1 1 0 0 +EDGE2 1660 1581 -0.0420815 1.06768 1.54802 1 0 1 1 0 0 +EDGE2 1660 1380 -0.029873 -0.00369341 -0.00039689 1 0 1 1 0 0 +EDGE2 1660 1541 -0.0583239 0.969746 1.56348 1 0 1 1 0 0 +EDGE2 1660 1561 0.0965025 1.02022 1.5616 1 0 1 1 0 0 +EDGE2 1660 1579 -0.982807 0.0471452 -0.0178547 1 0 1 1 0 0 +EDGE2 1660 1659 -1.03109 0.0014085 -0.0266198 1 0 1 1 0 0 +EDGE2 1660 1379 -0.98295 0.0226743 -0.0607296 1 0 1 1 0 0 +EDGE2 1660 1539 -0.936275 -0.0840579 -0.00328577 1 0 1 1 0 0 +EDGE2 1661 1540 -0.971459 -0.0345682 1.6036 1 0 1 1 0 0 +EDGE2 1661 1382 0.904696 0.034826 0.0376123 1 0 1 1 0 0 +EDGE2 1661 1381 -0.0485362 -0.00718458 -0.00917177 1 0 1 1 0 0 +EDGE2 1661 1580 -1.02212 0.00712657 1.57612 1 0 1 1 0 0 +EDGE2 1661 1660 -0.976792 0.0196623 1.55846 1 0 1 1 0 0 +EDGE2 1661 1560 -1.01132 0.0479461 -1.56832 1 0 1 1 0 0 +EDGE2 1661 1380 -0.98115 0.0493036 1.54273 1 0 1 1 0 0 +EDGE2 1662 1383 1.00738 -0.124571 -0.0091251 1 0 1 1 0 0 +EDGE2 1662 1382 0.0440752 -0.0205766 0.0242754 1 0 1 1 0 0 +EDGE2 1662 1381 -1.05613 -0.0537507 -0.00177715 1 0 1 1 0 0 +EDGE2 1662 1661 -0.986381 0.0392927 0.0150311 1 0 1 1 0 0 +EDGE2 1663 1384 1.01611 -0.0672361 -0.00732126 1 0 1 1 0 0 +EDGE2 1663 1662 -1.04188 0.0435012 0.000222597 1 0 1 1 0 0 +EDGE2 1663 1383 0.00310481 -0.00847256 -0.00573274 1 0 1 1 0 0 +EDGE2 1663 1382 -1.03304 -0.070404 0.0138595 1 0 1 1 0 0 +EDGE2 1664 1385 0.943481 -0.047532 -0.00610128 1 0 1 1 0 0 +EDGE2 1664 1465 0.93136 -0.00681998 -3.18583 1 0 1 1 0 0 +EDGE2 1664 1663 -0.987829 0.0179536 -0.00593102 1 0 1 1 0 0 +EDGE2 1664 1384 0.00981311 0.0604731 0.00351453 1 0 1 1 0 0 +EDGE2 1664 1383 -1.02775 0.0383356 0.00432782 1 0 1 1 0 0 +EDGE2 1665 1386 0.00878857 0.920413 1.57346 1 0 1 1 0 0 +EDGE2 1665 1464 0.968622 0.0108367 -3.17452 1 0 1 1 0 0 +EDGE2 1665 1385 0.0385595 -0.00276127 -0.00926675 1 0 1 1 0 0 +EDGE2 1665 1465 0.0965048 0.024905 -3.14293 1 0 1 1 0 0 +EDGE2 1665 1466 -0.0364301 -0.945978 -1.57733 1 0 1 1 0 0 +EDGE2 1665 1384 -0.950458 -0.0481411 -0.0110074 1 0 1 1 0 0 +EDGE2 1665 1664 -0.951033 -0.102543 0.00799039 1 0 1 1 0 0 +EDGE2 1666 1665 -0.991785 0.0396038 1.57209 1 0 1 1 0 0 +EDGE2 1666 1385 -0.957447 0.0180209 1.58441 1 0 1 1 0 0 +EDGE2 1666 1465 -1.02874 -0.0395801 -1.56427 1 0 1 1 0 0 +EDGE2 1666 1466 0.023104 -0.00505015 0.00312301 1 0 1 1 0 0 +EDGE2 1666 1467 1.01072 0.00358259 -0.0218026 1 0 1 1 0 0 +EDGE2 1667 1468 1.01542 0.0425163 -0.00497521 1 0 1 1 0 0 +EDGE2 1667 1666 -0.935481 -0.033241 -0.0142818 1 0 1 1 0 0 +EDGE2 1667 1466 -0.939846 0.0220635 -0.00918821 1 0 1 1 0 0 +EDGE2 1667 1467 0.0212495 -0.0116234 0.0136194 1 0 1 1 0 0 +EDGE2 1668 1468 -0.0712344 -0.0612789 0.00949023 1 0 1 1 0 0 +EDGE2 1668 1667 -1.09085 0.0202365 0.0252597 1 0 1 1 0 0 +EDGE2 1668 1467 -1.03756 0.017055 0.0160139 1 0 1 1 0 0 +EDGE2 1668 1469 1.04812 0.0349201 0.019555 1 0 1 1 0 0 +EDGE2 1669 1468 -0.937909 0.0369129 0.0169289 1 0 1 1 0 0 +EDGE2 1669 1668 -0.966102 0.00346807 0.00639633 1 0 1 1 0 0 +EDGE2 1669 1469 -0.0289711 0.0015371 -0.0229876 1 0 1 1 0 0 +EDGE2 1669 1650 1.04021 0.064755 -3.13337 1 0 1 1 0 0 +EDGE2 1669 1470 1.04543 -0.0505626 -0.0148085 1 0 1 1 0 0 +EDGE2 1669 1510 0.985185 -0.0273292 -3.14219 1 0 1 1 0 0 +EDGE2 1669 1530 1.04046 -0.0683205 -3.14083 1 0 1 1 0 0 +EDGE2 1669 1370 0.932829 -0.053049 -3.13593 1 0 1 1 0 0 +EDGE2 1670 1669 -0.993026 -0.000968192 -0.0468824 1 0 1 1 0 0 +EDGE2 1670 1469 -1.00168 -0.0168238 0.0249233 1 0 1 1 0 0 +EDGE2 1670 1471 -0.0215114 1.02159 1.55519 1 0 1 1 0 0 +EDGE2 1670 1650 0.0467845 -0.0713583 -3.16683 1 0 1 1 0 0 +EDGE2 1670 1470 0.065296 -0.0308679 0.0104761 1 0 1 1 0 0 +EDGE2 1670 1510 -0.01408 -0.0768072 -3.13479 1 0 1 1 0 0 +EDGE2 1670 1530 0.050612 -0.0292756 -3.15128 1 0 1 1 0 0 +EDGE2 1670 1370 -0.00521331 -0.11553 -3.14627 1 0 1 1 0 0 +EDGE2 1670 1371 -0.00230802 -1.03252 -1.58874 1 0 1 1 0 0 +EDGE2 1670 1531 0.0270033 -1.05948 -1.54444 1 0 1 1 0 0 +EDGE2 1670 1651 0.0527061 -0.984694 -1.53069 1 0 1 1 0 0 +EDGE2 1670 1511 0.0605238 -1.01198 -1.57468 1 0 1 1 0 0 +EDGE2 1670 1509 0.896262 0.0316147 -3.14932 1 0 1 1 0 0 +EDGE2 1670 1649 1.00527 -0.0206279 -3.15216 1 0 1 1 0 0 +EDGE2 1670 1529 1.03116 -0.0433283 -3.11087 1 0 1 1 0 0 +EDGE2 1670 1369 0.960481 -0.022489 -3.13377 1 0 1 1 0 0 +EDGE2 1671 1472 0.958747 0.0686675 0.0160433 1 0 1 1 0 0 +EDGE2 1671 1471 -0.0188549 -0.0247653 0.0145173 1 0 1 1 0 0 +EDGE2 1671 1650 -0.982666 -0.143184 1.57662 1 0 1 1 0 0 +EDGE2 1671 1670 -0.957329 0.0149475 -1.53768 1 0 1 1 0 0 +EDGE2 1671 1470 -0.955979 0.0181639 -1.6094 1 0 1 1 0 0 +EDGE2 1671 1510 -0.993793 0.0381683 1.56703 1 0 1 1 0 0 +EDGE2 1671 1530 -0.926566 -0.0456411 1.58408 1 0 1 1 0 0 +EDGE2 1671 1370 -1.11354 0.0109404 1.55211 1 0 1 1 0 0 +EDGE2 1672 1473 0.891152 0.0512546 0.00618327 1 0 1 1 0 0 +EDGE2 1672 1472 0.0694709 0.0751838 0.0179245 1 0 1 1 0 0 +EDGE2 1672 1671 -1.05652 0.00996902 -0.0259609 1 0 1 1 0 0 +EDGE2 1672 1471 -1.03206 -0.0369534 -0.0123292 1 0 1 1 0 0 +EDGE2 1673 1474 0.855157 -0.0487676 0.0437437 1 0 1 1 0 0 +EDGE2 1673 1473 0.026395 0.0107844 -0.00586486 1 0 1 1 0 0 +EDGE2 1673 1672 -1.03689 -0.041013 -0.00490431 1 0 1 1 0 0 +EDGE2 1673 1472 -0.977432 0.0622424 -0.0342156 1 0 1 1 0 0 +EDGE2 1674 1475 0.904825 0.0076384 0.0292324 1 0 1 1 0 0 +EDGE2 1674 1474 0.00620301 0.0290023 0.0434319 1 0 1 1 0 0 +EDGE2 1674 1473 -0.986529 0.00622346 -0.00790602 1 0 1 1 0 0 +EDGE2 1674 1673 -1.00212 -0.0223055 0.0253866 1 0 1 1 0 0 +EDGE2 1675 1475 0.0664613 0.0432944 -0.00212919 1 0 1 1 0 0 +EDGE2 1675 1474 -1.07288 0.0692385 0.00664348 1 0 1 1 0 0 +EDGE2 1675 1674 -0.990509 0.0654322 -0.00489659 1 0 1 1 0 0 +EDGE2 1675 1476 0.0821108 -1.07119 -1.55894 1 0 1 1 0 0 +EDGE2 1676 1475 -1.0162 0.0575425 1.59133 1 0 1 1 0 0 +EDGE2 1676 1675 -1.02067 0.0548529 1.58061 1 0 1 1 0 0 +EDGE2 1676 1476 0.0121001 0.0365854 0.00910663 1 0 1 1 0 0 +EDGE2 1676 1477 1.12096 0.00299136 0.014578 1 0 1 1 0 0 +EDGE2 1677 1676 -1.11315 -0.0410359 -0.0130999 1 0 1 1 0 0 +EDGE2 1677 1476 -0.985653 0.00446199 -0.0381262 1 0 1 1 0 0 +EDGE2 1677 1477 -0.0373583 0.00271603 -0.0307275 1 0 1 1 0 0 +EDGE2 1677 1478 0.99567 -0.0661116 0.00421266 1 0 1 1 0 0 +EDGE2 1678 1677 -1.07493 0.0304263 -0.00380064 1 0 1 1 0 0 +EDGE2 1678 1477 -0.982051 0.0435613 0.0147138 1 0 1 1 0 0 +EDGE2 1678 1478 0.00292866 0.0260704 -0.0325045 1 0 1 1 0 0 +EDGE2 1678 1479 0.994631 -0.0118808 0.00229976 1 0 1 1 0 0 +EDGE2 1679 1678 -1.00172 -0.0126161 0.00405577 1 0 1 1 0 0 +EDGE2 1679 1478 -1.03921 -0.0225026 -0.00436515 1 0 1 1 0 0 +EDGE2 1679 1360 0.868377 -0.117457 -3.15988 1 0 1 1 0 0 +EDGE2 1679 1479 -0.0454503 0.024397 0.00796636 1 0 1 1 0 0 +EDGE2 1679 1500 0.997337 -0.00484764 -3.13292 1 0 1 1 0 0 +EDGE2 1679 1480 1.09093 -0.0369132 0.00755057 1 0 1 1 0 0 +EDGE2 1679 1340 1.09876 -0.00211819 -3.16767 1 0 1 1 0 0 +EDGE2 1680 1360 -0.0405272 0.0953423 -3.12044 1 0 1 1 0 0 +EDGE2 1680 1679 -1.01522 -0.026121 0.00253147 1 0 1 1 0 0 +EDGE2 1680 1479 -0.962724 -0.0544145 0.00365367 1 0 1 1 0 0 +EDGE2 1680 1500 0.0256893 -0.00432218 -3.12523 1 0 1 1 0 0 +EDGE2 1680 1480 0.0478867 0.0143478 0.00770106 1 0 1 1 0 0 +EDGE2 1680 1481 -0.0187709 -0.998732 -1.56822 1 0 1 1 0 0 +EDGE2 1680 1340 0.0142515 0.00561371 -3.10848 1 0 1 1 0 0 +EDGE2 1680 1501 -0.00818043 -0.983906 -1.52646 1 0 1 1 0 0 +EDGE2 1680 1341 -0.00446725 -1.0675 -1.59532 1 0 1 1 0 0 +EDGE2 1680 1361 0.0335802 -1.01548 -1.57602 1 0 1 1 0 0 +EDGE2 1680 1359 1.00005 -0.0103876 -3.17772 1 0 1 1 0 0 +EDGE2 1680 1499 1.12367 0.0750905 -3.12663 1 0 1 1 0 0 +EDGE2 1680 1339 1.05638 0.05645 -3.15622 1 0 1 1 0 0 +EDGE2 1681 1360 -0.97023 0.025983 1.55937 1 0 1 1 0 0 +EDGE2 1681 1500 -0.994155 0.00542635 1.54898 1 0 1 1 0 0 +EDGE2 1681 1680 -1.07039 0.0279771 -1.5599 1 0 1 1 0 0 +EDGE2 1681 1480 -0.939317 0.0683763 -1.57705 1 0 1 1 0 0 +EDGE2 1681 1340 -1.06262 -0.0555264 1.54891 1 0 1 1 0 0 +EDGE2 1682 1681 -1.04756 0.0153988 -0.0239518 1 0 1 1 0 0 +EDGE2 1683 1682 -1.00609 0.0142039 0.021239 1 0 1 1 0 0 +EDGE2 1684 1683 -0.983967 -0.0555853 -0.00338785 1 0 1 1 0 0 +EDGE2 1685 1684 -1.01855 0.0218844 0.00965785 1 0 1 1 0 0 +EDGE2 1686 1685 -0.922347 -0.0271618 -1.56115 1 0 1 1 0 0 +EDGE2 1687 1686 -0.954508 -0.028872 0.00515418 1 0 1 1 0 0 +EDGE2 1688 1687 -1.03018 0.032646 0.00570482 1 0 1 1 0 0 +EDGE2 1689 1688 -1.00113 -0.025312 -0.00123617 1 0 1 1 0 0 +EDGE2 1690 1689 -0.988311 -0.0850289 -0.0146286 1 0 1 1 0 0 +EDGE2 1691 1690 -0.942697 -0.109891 -1.56121 1 0 1 1 0 0 +EDGE2 1692 1691 -0.972323 0.0290407 -0.000745383 1 0 1 1 0 0 +EDGE2 1693 1692 -1.06833 0.042365 0.0362044 1 0 1 1 0 0 +EDGE2 1694 1693 -1.03463 -0.0540186 -0.0337268 1 0 1 1 0 0 +EDGE2 1694 1475 1.07145 0.0396781 -3.11899 1 0 1 1 0 0 +EDGE2 1694 1675 0.958752 0.03653 -3.10747 1 0 1 1 0 0 +EDGE2 1695 1694 -1.01584 -0.0620422 -0.0262693 1 0 1 1 0 0 +EDGE2 1695 1475 0.0515816 0.0186382 -3.14293 1 0 1 1 0 0 +EDGE2 1695 1675 -0.0287831 -0.0423771 -3.13311 1 0 1 1 0 0 +EDGE2 1695 1474 1.01684 0.0834139 -3.1271 1 0 1 1 0 0 +EDGE2 1695 1674 1.00257 -0.00201711 -3.13791 1 0 1 1 0 0 +EDGE2 1695 1676 0.014436 0.973007 1.59103 1 0 1 1 0 0 +EDGE2 1695 1476 -0.0285808 0.913425 1.56864 1 0 1 1 0 0 +EDGE2 1696 1475 -1.05893 0.0317048 -1.54479 1 0 1 1 0 0 +EDGE2 1696 1675 -1.06127 -0.126531 -1.59412 1 0 1 1 0 0 +EDGE2 1696 1695 -1.07617 0.136365 1.605 1 0 1 1 0 0 +EDGE2 1697 1696 -0.98496 -0.0250464 0.00785228 1 0 1 1 0 0 +EDGE2 1698 1697 -1.01213 -0.0345911 -0.0601122 1 0 1 1 0 0 +EDGE2 1699 1460 0.992458 -0.000816359 -3.11183 1 0 1 1 0 0 +EDGE2 1699 1698 -0.996513 -0.0951151 0.012445 1 0 1 1 0 0 +EDGE2 1700 1459 0.98779 0.0547944 -3.13002 1 0 1 1 0 0 +EDGE2 1700 1460 0.00628238 -0.0314443 -3.13365 1 0 1 1 0 0 +EDGE2 1700 1461 0.0157798 0.966515 1.55169 1 0 1 1 0 0 +EDGE2 1700 1699 -1.01439 0.0153828 -0.026812 1 0 1 1 0 0 +EDGE2 1701 1700 -0.944915 -0.0170281 -1.57877 1 0 1 1 0 0 +EDGE2 1701 1460 -0.964178 -0.0910832 1.57515 1 0 1 1 0 0 +EDGE2 1701 1462 0.959398 -0.017691 -0.00461716 1 0 1 1 0 0 +EDGE2 1701 1461 0.00858063 0.0404255 -0.0575135 1 0 1 1 0 0 +EDGE2 1702 1701 -0.969694 0.0110107 -0.00266821 1 0 1 1 0 0 +EDGE2 1702 1463 1.02872 -0.0103369 -0.0197271 1 0 1 1 0 0 +EDGE2 1702 1462 -0.00196191 -0.0834074 -0.00182904 1 0 1 1 0 0 +EDGE2 1702 1461 -0.931555 -0.00804872 -0.0313168 1 0 1 1 0 0 +EDGE2 1703 1463 0.059993 0.130921 -0.034219 1 0 1 1 0 0 +EDGE2 1703 1462 -0.917434 0.0276886 0.0277932 1 0 1 1 0 0 +EDGE2 1703 1702 -1.01475 -0.00848573 0.0366302 1 0 1 1 0 0 +EDGE2 1703 1464 0.990628 0.00737912 -0.0064231 1 0 1 1 0 0 +EDGE2 1704 1665 1.08699 0.070021 -3.13011 1 0 1 1 0 0 +EDGE2 1704 1463 -0.970606 0.0103332 0.0134675 1 0 1 1 0 0 +EDGE2 1704 1703 -0.949537 -0.0712182 -0.0206881 1 0 1 1 0 0 +EDGE2 1704 1464 0.0332514 0.0174963 0.0116456 1 0 1 1 0 0 +EDGE2 1704 1385 0.897265 0.0357343 -3.14486 1 0 1 1 0 0 +EDGE2 1704 1465 1.04246 -0.0589156 0.0107727 1 0 1 1 0 0 +EDGE2 1705 1386 -0.0893558 -0.978269 -1.54265 1 0 1 1 0 0 +EDGE2 1705 1665 -0.0608443 -0.00101728 -3.12052 1 0 1 1 0 0 +EDGE2 1705 1464 -1.01554 -0.009813 -0.0311121 1 0 1 1 0 0 +EDGE2 1705 1704 -1.02661 -0.0313076 -0.0236301 1 0 1 1 0 0 +EDGE2 1705 1385 0.0818596 -0.0445983 -3.15534 1 0 1 1 0 0 +EDGE2 1705 1465 -0.0100547 0.00601945 -0.0271071 1 0 1 1 0 0 +EDGE2 1705 1666 -0.0117211 0.981144 1.5806 1 0 1 1 0 0 +EDGE2 1705 1466 0.0331466 1.03656 1.58125 1 0 1 1 0 0 +EDGE2 1705 1384 1.01498 -0.0280921 -3.16229 1 0 1 1 0 0 +EDGE2 1705 1664 0.898933 -0.00680103 -3.16609 1 0 1 1 0 0 +EDGE2 1706 1665 -0.95011 0.0265001 1.53764 1 0 1 1 0 0 +EDGE2 1706 1705 -0.995217 0.114106 -1.56038 1 0 1 1 0 0 +EDGE2 1706 1385 -1.01401 -0.0248586 1.56974 1 0 1 1 0 0 +EDGE2 1706 1465 -0.991968 0.0215617 -1.56925 1 0 1 1 0 0 +EDGE2 1706 1666 -0.0399199 -0.00915928 -0.0264005 1 0 1 1 0 0 +EDGE2 1706 1466 0.00386859 0.0296542 -0.0094682 1 0 1 1 0 0 +EDGE2 1706 1667 1.03015 -0.0384024 -0.0193362 1 0 1 1 0 0 +EDGE2 1706 1467 0.917048 -0.024729 -0.0173025 1 0 1 1 0 0 +EDGE2 1707 1468 1.03539 0.0144518 -0.0136667 1 0 1 1 0 0 +EDGE2 1707 1666 -1.00798 -0.0159125 -0.0228699 1 0 1 1 0 0 +EDGE2 1707 1706 -0.942643 0.0926023 -0.0313075 1 0 1 1 0 0 +EDGE2 1707 1466 -0.982507 -0.0144504 0.00422717 1 0 1 1 0 0 +EDGE2 1707 1667 -0.0407017 -0.00909076 0.00390143 1 0 1 1 0 0 +EDGE2 1707 1467 -0.00661715 -0.0387627 -0.0192157 1 0 1 1 0 0 +EDGE2 1707 1668 0.998437 0.0376231 0.000887619 1 0 1 1 0 0 +EDGE2 1708 1468 -0.0193327 -0.105905 -0.00299637 1 0 1 1 0 0 +EDGE2 1708 1667 -0.960872 -0.0878309 -0.0348958 1 0 1 1 0 0 +EDGE2 1708 1707 -0.917603 -0.0341034 0.00857691 1 0 1 1 0 0 +EDGE2 1708 1467 -1.06283 -0.0372177 -0.00510135 1 0 1 1 0 0 +EDGE2 1708 1668 0.0248843 -0.0164381 -0.00507249 1 0 1 1 0 0 +EDGE2 1708 1669 1.01396 0.00279288 -0.016681 1 0 1 1 0 0 +EDGE2 1708 1469 0.979279 -0.0160391 -0.0224195 1 0 1 1 0 0 +EDGE2 1709 1468 -0.98729 -0.0432689 0.0292945 1 0 1 1 0 0 +EDGE2 1709 1668 -0.920244 0.0291881 -0.0267743 1 0 1 1 0 0 +EDGE2 1709 1708 -0.974703 0.0233527 0.00104704 1 0 1 1 0 0 +EDGE2 1709 1669 -0.0791277 -0.013287 -0.00697651 1 0 1 1 0 0 +EDGE2 1709 1469 -0.0326168 -0.0498431 0.0322929 1 0 1 1 0 0 +EDGE2 1709 1650 1.0103 -0.000418205 -3.11886 1 0 1 1 0 0 +EDGE2 1709 1670 1.0447 0.0126031 -0.00751387 1 0 1 1 0 0 +EDGE2 1709 1470 1.0152 -0.0143505 -0.00934201 1 0 1 1 0 0 +EDGE2 1709 1510 1.05024 -0.0224763 -3.10909 1 0 1 1 0 0 +EDGE2 1709 1530 1.02524 -0.111783 -3.10809 1 0 1 1 0 0 +EDGE2 1709 1370 0.939634 0.0441125 -3.10436 1 0 1 1 0 0 +EDGE2 1710 1669 -1.00949 0.088407 -0.00436347 1 0 1 1 0 0 +EDGE2 1710 1709 -0.847625 -0.0297336 0.00367361 1 0 1 1 0 0 +EDGE2 1710 1469 -1.01797 -0.000261182 0.0109831 1 0 1 1 0 0 +EDGE2 1710 1671 -0.0521991 0.992093 1.61043 1 0 1 1 0 0 +EDGE2 1710 1471 0.00508492 0.994602 1.55422 1 0 1 1 0 0 +EDGE2 1710 1650 0.0209116 -0.101125 -3.13392 1 0 1 1 0 0 +EDGE2 1710 1670 0.0925755 0.00283529 -0.0391523 1 0 1 1 0 0 +EDGE2 1710 1470 -0.0824985 -0.00984156 0.00732718 1 0 1 1 0 0 +EDGE2 1710 1510 0.000959947 0.100678 -3.13706 1 0 1 1 0 0 +EDGE2 1710 1530 0.0633025 -0.0257767 -3.12645 1 0 1 1 0 0 +EDGE2 1710 1370 -0.0190316 0.015268 -3.14776 1 0 1 1 0 0 +EDGE2 1710 1371 0.0579365 -1.03824 -1.58454 1 0 1 1 0 0 +EDGE2 1710 1531 -0.0171104 -1.0735 -1.57373 1 0 1 1 0 0 +EDGE2 1710 1651 0.105938 -1.09286 -1.57553 1 0 1 1 0 0 +EDGE2 1710 1511 -0.0195286 -0.982148 -1.59405 1 0 1 1 0 0 +EDGE2 1710 1509 1.00838 0.0515301 -3.14412 1 0 1 1 0 0 +EDGE2 1710 1649 0.999809 -0.073883 -3.15263 1 0 1 1 0 0 +EDGE2 1710 1529 1.04815 -0.00209461 -3.14277 1 0 1 1 0 0 +EDGE2 1710 1369 0.956018 0.0681084 -3.12894 1 0 1 1 0 0 +EDGE2 1711 1672 1.00975 0.0859968 -0.0012973 1 0 1 1 0 0 +EDGE2 1711 1472 1.11511 0.0303882 0.00603277 1 0 1 1 0 0 +EDGE2 1711 1671 -0.14599 0.0768709 -0.0145152 1 0 1 1 0 0 +EDGE2 1711 1471 0.0548964 0.0312573 -0.0118417 1 0 1 1 0 0 +EDGE2 1711 1650 -1.00947 0.0130487 1.5664 1 0 1 1 0 0 +EDGE2 1711 1710 -0.948243 0.0658947 -1.55045 1 0 1 1 0 0 +EDGE2 1711 1670 -1.05083 -0.0860721 -1.58316 1 0 1 1 0 0 +EDGE2 1711 1470 -0.947283 -0.0365125 -1.63302 1 0 1 1 0 0 +EDGE2 1711 1510 -0.947664 0.0312153 1.58579 1 0 1 1 0 0 +EDGE2 1711 1530 -1.07286 -0.0232596 1.56535 1 0 1 1 0 0 +EDGE2 1711 1370 -1.01032 0.0454676 1.5556 1 0 1 1 0 0 +EDGE2 1712 1473 1.01037 -0.0791901 -0.0103254 1 0 1 1 0 0 +EDGE2 1712 1673 0.992401 -0.0276751 0.00180124 1 0 1 1 0 0 +EDGE2 1712 1672 0.0220343 -0.0339555 0.00768293 1 0 1 1 0 0 +EDGE2 1712 1472 0.0722145 -0.0336128 -0.0348601 1 0 1 1 0 0 +EDGE2 1712 1671 -1.02812 0.0715213 0.0236353 1 0 1 1 0 0 +EDGE2 1712 1711 -1.06607 0.0808474 0.0130654 1 0 1 1 0 0 +EDGE2 1712 1471 -1.03677 -0.0141107 0.012739 1 0 1 1 0 0 +EDGE2 1713 1474 0.975488 -0.0228544 -0.0373391 1 0 1 1 0 0 +EDGE2 1713 1674 1.1421 0.0226315 -0.0382227 1 0 1 1 0 0 +EDGE2 1713 1473 -0.0204815 0.0353151 0.0137669 1 0 1 1 0 0 +EDGE2 1713 1673 -0.0269967 -0.10199 -0.0250946 1 0 1 1 0 0 +EDGE2 1713 1672 -0.944816 0.0129053 0.00971609 1 0 1 1 0 0 +EDGE2 1713 1712 -0.955961 -0.0368553 -0.0202125 1 0 1 1 0 0 +EDGE2 1713 1472 -0.948936 0.00364312 -0.0213692 1 0 1 1 0 0 +EDGE2 1714 1475 1.03236 -0.0402238 -0.015231 1 0 1 1 0 0 +EDGE2 1714 1675 1.03425 0.0383322 0.00987473 1 0 1 1 0 0 +EDGE2 1714 1695 0.982155 0.0483719 -3.14453 1 0 1 1 0 0 +EDGE2 1714 1474 -0.0156002 0.0366455 0.0363715 1 0 1 1 0 0 +EDGE2 1714 1674 0.016927 0.0150712 -0.0264534 1 0 1 1 0 0 +EDGE2 1714 1473 -1.03909 -0.0262446 -0.0105507 1 0 1 1 0 0 +EDGE2 1714 1673 -1.0324 -0.000666586 0.00492835 1 0 1 1 0 0 +EDGE2 1714 1713 -1.04108 0.0576398 0.0110476 1 0 1 1 0 0 +EDGE2 1715 1694 0.978976 0.0225822 -3.17246 1 0 1 1 0 0 +EDGE2 1715 1696 0.0313023 0.903879 1.57692 1 0 1 1 0 0 +EDGE2 1715 1475 0.0196595 0.0698572 -0.032827 1 0 1 1 0 0 +EDGE2 1715 1675 0.0333427 0.0207781 0.0253928 1 0 1 1 0 0 +EDGE2 1715 1695 0.0936996 -0.0453172 -3.16184 1 0 1 1 0 0 +EDGE2 1715 1474 -1.05316 -0.0678102 -0.00745565 1 0 1 1 0 0 +EDGE2 1715 1674 -0.952465 -0.0115097 -0.0338474 1 0 1 1 0 0 +EDGE2 1715 1714 -0.928789 0.0485623 0.00656821 1 0 1 1 0 0 +EDGE2 1715 1676 -0.0242872 -1.04619 -1.57281 1 0 1 1 0 0 +EDGE2 1715 1476 -0.0332441 -0.881316 -1.57927 1 0 1 1 0 0 +EDGE2 1716 1697 0.889828 0.0271098 -0.00831154 1 0 1 1 0 0 +EDGE2 1716 1715 -0.954272 0.0748673 -1.55004 1 0 1 1 0 0 +EDGE2 1716 1696 0.0343976 0.0457179 0.00495177 1 0 1 1 0 0 +EDGE2 1716 1475 -1.12921 0.0214726 -1.6136 1 0 1 1 0 0 +EDGE2 1716 1675 -0.988155 0.0153992 -1.55899 1 0 1 1 0 0 +EDGE2 1716 1695 -0.973689 0.0177774 1.57203 1 0 1 1 0 0 +EDGE2 1717 1697 0.0135847 -0.0727946 -0.00945506 1 0 1 1 0 0 +EDGE2 1717 1698 0.948304 -0.0533905 -0.0185046 1 0 1 1 0 0 +EDGE2 1717 1716 -0.985711 -0.00747774 -0.0106678 1 0 1 1 0 0 +EDGE2 1717 1696 -0.978555 0.0937579 -0.00252555 1 0 1 1 0 0 +EDGE2 1718 1697 -1.02163 0.00318612 0.0161422 1 0 1 1 0 0 +EDGE2 1718 1699 0.969641 -0.0806915 -0.00644086 1 0 1 1 0 0 +EDGE2 1718 1698 -0.153748 0.00896689 0.00534623 1 0 1 1 0 0 +EDGE2 1718 1717 -1.06524 0.129855 -0.00154185 1 0 1 1 0 0 +EDGE2 1719 1700 1.03195 0.0790089 -0.0153438 1 0 1 1 0 0 +EDGE2 1719 1460 1.04034 -0.00893325 -3.13425 1 0 1 1 0 0 +EDGE2 1719 1699 0.0328523 -0.0507079 0.00437449 1 0 1 1 0 0 +EDGE2 1719 1698 -0.9937 0.0302729 0.0160123 1 0 1 1 0 0 +EDGE2 1719 1718 -0.887165 -0.0493707 -0.016478 1 0 1 1 0 0 +EDGE2 1720 1459 0.975337 0.0778401 -3.13177 1 0 1 1 0 0 +EDGE2 1720 1701 -0.01626 0.955322 1.54472 1 0 1 1 0 0 +EDGE2 1720 1700 -0.0153994 0.0499125 -0.00402537 1 0 1 1 0 0 +EDGE2 1720 1460 0.0055812 -0.0292477 -3.13223 1 0 1 1 0 0 +EDGE2 1720 1461 0.0463234 1.01448 1.57424 1 0 1 1 0 0 +EDGE2 1720 1719 -1.12781 -0.0231259 0.00851536 1 0 1 1 0 0 +EDGE2 1720 1699 -1.0536 0.0165756 0.0196879 1 0 1 1 0 0 +EDGE2 1721 1700 -1.04052 -0.000500321 1.57075 1 0 1 1 0 0 +EDGE2 1721 1720 -0.90381 -0.0062244 1.5956 1 0 1 1 0 0 +EDGE2 1721 1460 -0.835971 0.0358078 -1.57334 1 0 1 1 0 0 +EDGE2 1722 1721 -1.01351 -0.0105791 0.00653074 1 0 1 1 0 0 +EDGE2 1723 1722 -1.06103 0.0189213 0.0378219 1 0 1 1 0 0 +EDGE2 1724 1723 -0.953809 -0.0859451 -0.012152 1 0 1 1 0 0 +EDGE2 1725 1724 -0.966531 0.0217708 -0.0197067 1 0 1 1 0 0 +EDGE2 1726 1725 -0.925087 0.0175235 -1.56596 1 0 1 1 0 0 +EDGE2 1727 1726 -0.962707 -0.0181979 0.0204686 1 0 1 1 0 0 +EDGE2 1728 1727 -0.848172 0.00612076 -0.00971558 1 0 1 1 0 0 +EDGE2 1729 1728 -0.973756 -0.108032 0.0145812 1 0 1 1 0 0 +EDGE2 1730 1729 -0.920458 0.019168 -0.0204795 1 0 1 1 0 0 +EDGE2 1731 1730 -1.02184 0.00696869 -1.53093 1 0 1 1 0 0 +EDGE2 1732 1731 -0.961321 0.0358816 -0.00723911 1 0 1 1 0 0 +EDGE2 1733 1732 -0.895199 -0.102786 0.00913009 1 0 1 1 0 0 +EDGE2 1734 1733 -0.952735 -0.0330041 -0.0130295 1 0 1 1 0 0 +EDGE2 1734 1435 1.09226 0.145635 -3.12459 1 0 1 1 0 0 +EDGE2 1734 1455 0.997121 0.138473 -3.12614 1 0 1 1 0 0 +EDGE2 1734 1395 0.96046 0.0250838 -3.19178 1 0 1 1 0 0 +EDGE2 1734 1415 0.841459 -0.0120961 -3.11335 1 0 1 1 0 0 +EDGE2 1735 1734 -1.01916 -0.0136621 0.0295642 1 0 1 1 0 0 +EDGE2 1735 1435 -0.0761909 0.0486891 -3.11398 1 0 1 1 0 0 +EDGE2 1735 1455 -0.0366189 -0.0482753 -3.15843 1 0 1 1 0 0 +EDGE2 1735 1416 0.0526787 -1.02415 -1.55948 1 0 1 1 0 0 +EDGE2 1735 1436 0.0416842 -1.08321 -1.53978 1 0 1 1 0 0 +EDGE2 1735 1396 0.00368405 -0.966646 -1.52511 1 0 1 1 0 0 +EDGE2 1735 1434 1.03892 -0.0695688 -3.1041 1 0 1 1 0 0 +EDGE2 1735 1395 0.00367013 0.0083803 -3.15233 1 0 1 1 0 0 +EDGE2 1735 1415 -0.0857404 -0.00196628 -3.15883 1 0 1 1 0 0 +EDGE2 1735 1454 1.04315 0.0537834 -3.13487 1 0 1 1 0 0 +EDGE2 1735 1394 0.960575 -0.0054366 -3.13904 1 0 1 1 0 0 +EDGE2 1735 1414 1.0288 0.0287359 -3.15393 1 0 1 1 0 0 +EDGE2 1735 1456 -0.0226973 0.992062 1.58873 1 0 1 1 0 0 +EDGE2 1736 1435 -0.929119 -0.0324927 1.5475 1 0 1 1 0 0 +EDGE2 1736 1455 -0.987755 0.0169966 1.56586 1 0 1 1 0 0 +EDGE2 1736 1735 -0.986576 -0.0351779 -1.58786 1 0 1 1 0 0 +EDGE2 1736 1395 -0.913641 -0.0565734 1.57236 1 0 1 1 0 0 +EDGE2 1736 1415 -1.04517 0.0115941 1.5974 1 0 1 1 0 0 +EDGE2 1736 1456 -0.107704 0.00441206 0.0267005 1 0 1 1 0 0 +EDGE2 1736 1457 0.974304 0.010426 -0.040006 1 0 1 1 0 0 +EDGE2 1737 1456 -0.954452 0.000185428 -0.0363888 1 0 1 1 0 0 +EDGE2 1737 1736 -0.990856 0.00526393 -0.00664286 1 0 1 1 0 0 +EDGE2 1737 1457 -0.0810215 -0.0608003 -0.0134799 1 0 1 1 0 0 +EDGE2 1737 1458 0.978298 0.0916338 -0.0101352 1 0 1 1 0 0 +EDGE2 1738 1457 -0.988258 -0.0392665 -0.0181782 1 0 1 1 0 0 +EDGE2 1738 1737 -0.96864 -0.0352487 -0.00165071 1 0 1 1 0 0 +EDGE2 1738 1458 0.0551195 -0.0883081 0.0221466 1 0 1 1 0 0 +EDGE2 1738 1459 1.03699 -0.010299 -0.0205172 1 0 1 1 0 0 +EDGE2 1739 1738 -1.0083 -0.0779575 0.0117439 1 0 1 1 0 0 +EDGE2 1739 1458 -0.940954 -0.045744 -0.00027824 1 0 1 1 0 0 +EDGE2 1739 1459 0.00499884 0.0352563 -0.0261503 1 0 1 1 0 0 +EDGE2 1739 1700 1.00719 -0.0208248 -3.12619 1 0 1 1 0 0 +EDGE2 1739 1720 0.977476 0.0425138 -3.13876 1 0 1 1 0 0 +EDGE2 1739 1460 0.979832 -0.0417847 0.00656358 1 0 1 1 0 0 +EDGE2 1740 1739 -0.986578 -0.0312301 0.0132728 1 0 1 1 0 0 +EDGE2 1740 1459 -0.939769 -0.100187 -0.0179547 1 0 1 1 0 0 +EDGE2 1740 1701 0.0220657 -0.998982 -1.60213 1 0 1 1 0 0 +EDGE2 1740 1721 -0.0429028 0.994135 1.55976 1 0 1 1 0 0 +EDGE2 1740 1700 0.0468383 -0.00481849 -3.1628 1 0 1 1 0 0 +EDGE2 1740 1720 0.015836 -0.0715705 -3.17474 1 0 1 1 0 0 +EDGE2 1740 1460 0.00690364 0.0626093 -0.00748114 1 0 1 1 0 0 +EDGE2 1740 1461 -0.0595777 -0.950148 -1.58447 1 0 1 1 0 0 +EDGE2 1740 1719 0.964812 -0.0236322 -3.13235 1 0 1 1 0 0 +EDGE2 1740 1699 1.04258 -0.00881925 -3.11213 1 0 1 1 0 0 +EDGE2 1741 1722 0.977794 0.00254628 -0.0148835 1 0 1 1 0 0 +EDGE2 1741 1721 -0.0685973 0.0521723 -0.00324089 1 0 1 1 0 0 +EDGE2 1741 1700 -1.04407 -0.0990192 1.6178 1 0 1 1 0 0 +EDGE2 1741 1720 -1.02436 -0.0227093 1.58719 1 0 1 1 0 0 +EDGE2 1741 1740 -1.00106 0.0262555 -1.56184 1 0 1 1 0 0 +EDGE2 1741 1460 -1.01408 -0.0569288 -1.56742 1 0 1 1 0 0 +EDGE2 1742 1723 0.952535 -0.0384179 -0.032069 1 0 1 1 0 0 +EDGE2 1742 1741 -0.92379 -0.0318466 -0.00901759 1 0 1 1 0 0 +EDGE2 1742 1722 -0.0221907 0.0172027 -0.00387114 1 0 1 1 0 0 +EDGE2 1742 1721 -0.970998 0.00997003 -0.00508154 1 0 1 1 0 0 +EDGE2 1743 1742 -0.94104 -0.0604458 -0.00372477 1 0 1 1 0 0 +EDGE2 1743 1724 1.04382 -0.0308953 -0.0249906 1 0 1 1 0 0 +EDGE2 1743 1723 -0.0235884 -0.0314415 0.00946307 1 0 1 1 0 0 +EDGE2 1743 1722 -0.969631 0.0260183 0.0150551 1 0 1 1 0 0 +EDGE2 1744 1725 1.0581 0.0202833 -0.0247566 1 0 1 1 0 0 +EDGE2 1744 1724 -0.0596084 0.0531418 -0.0046911 1 0 1 1 0 0 +EDGE2 1744 1723 -1.06726 -0.113585 -0.000503498 1 0 1 1 0 0 +EDGE2 1744 1743 -1.03186 -0.030678 -0.00707704 1 0 1 1 0 0 +EDGE2 1745 1726 0.0394848 0.989234 1.58248 1 0 1 1 0 0 +EDGE2 1745 1744 -0.983434 -0.0273915 0.0218821 1 0 1 1 0 0 +EDGE2 1745 1725 0.00980626 -0.0916809 0.0226112 1 0 1 1 0 0 +EDGE2 1745 1724 -1.00102 0.0253634 -0.0113758 1 0 1 1 0 0 +EDGE2 1746 1727 1.06611 -0.0904445 -0.0100513 1 0 1 1 0 0 +EDGE2 1746 1726 -0.0470343 0.0427941 0.000145724 1 0 1 1 0 0 +EDGE2 1746 1745 -1.02204 -0.022817 -1.5597 1 0 1 1 0 0 +EDGE2 1746 1725 -0.948606 -0.063554 -1.54393 1 0 1 1 0 0 +EDGE2 1747 1727 0.0441845 -0.00721912 -0.000998539 1 0 1 1 0 0 +EDGE2 1747 1728 1.0077 0.0429387 -0.00503922 1 0 1 1 0 0 +EDGE2 1747 1746 -1.0561 0.0462622 0.023867 1 0 1 1 0 0 +EDGE2 1747 1726 -1.04039 0.0112284 0.0442614 1 0 1 1 0 0 +EDGE2 1748 1729 0.952496 -0.0427048 -0.0290358 1 0 1 1 0 0 +EDGE2 1748 1727 -0.957718 -0.0433175 -0.00408708 1 0 1 1 0 0 +EDGE2 1748 1728 0.0506513 0.0054087 -0.00329642 1 0 1 1 0 0 +EDGE2 1748 1747 -1.05538 0.0435047 0.0311514 1 0 1 1 0 0 +EDGE2 1749 1730 1.06807 -0.0183539 -0.00460339 1 0 1 1 0 0 +EDGE2 1749 1729 -0.00334573 -0.0693601 0.00660514 1 0 1 1 0 0 +EDGE2 1749 1728 -1.00637 -0.0155023 0.0125204 1 0 1 1 0 0 +EDGE2 1749 1748 -0.981729 -0.0305076 0.0388075 1 0 1 1 0 0 +EDGE2 1750 1730 0.0164425 -0.0131687 -0.0154104 1 0 1 1 0 0 +EDGE2 1750 1731 -0.0268117 1.0315 1.58643 1 0 1 1 0 0 +EDGE2 1750 1749 -0.972737 0.0531262 0.000754353 1 0 1 1 0 0 +EDGE2 1750 1729 -0.985051 0.00743412 0.00562015 1 0 1 1 0 0 +EDGE2 1751 1750 -0.994874 0.0788926 -1.57951 1 0 1 1 0 0 +EDGE2 1751 1730 -0.926477 -0.0525958 -1.55991 1 0 1 1 0 0 +EDGE2 1751 1731 -0.0426429 -0.0353546 -0.00139997 1 0 1 1 0 0 +EDGE2 1751 1732 1.08209 0.0543339 -0.0228801 1 0 1 1 0 0 +EDGE2 1752 1731 -0.947559 -0.0456012 0.0181589 1 0 1 1 0 0 +EDGE2 1752 1751 -1.00051 -0.06153 0.025133 1 0 1 1 0 0 +EDGE2 1752 1732 -0.0297022 0.0647418 -0.00282238 1 0 1 1 0 0 +EDGE2 1752 1733 1.01524 0.019508 -0.0274406 1 0 1 1 0 0 +EDGE2 1753 1734 0.978419 -0.0487163 0.00785314 1 0 1 1 0 0 +EDGE2 1753 1752 -1.02155 -0.038644 0.00722513 1 0 1 1 0 0 +EDGE2 1753 1732 -0.942703 0.0140154 0.0157944 1 0 1 1 0 0 +EDGE2 1753 1733 -0.0716454 -0.010519 0.0240197 1 0 1 1 0 0 +EDGE2 1754 1734 0.0296803 -0.130899 0.00492835 1 0 1 1 0 0 +EDGE2 1754 1753 -1.02342 0.0836671 -0.0156657 1 0 1 1 0 0 +EDGE2 1754 1733 -0.969413 -0.0178785 0.0118955 1 0 1 1 0 0 +EDGE2 1754 1435 0.983068 -0.0119193 -3.13769 1 0 1 1 0 0 +EDGE2 1754 1455 0.847609 0.00314876 -3.11771 1 0 1 1 0 0 +EDGE2 1754 1735 1.00894 -0.0683804 -0.00833777 1 0 1 1 0 0 +EDGE2 1754 1395 0.970984 0.0150838 -3.12712 1 0 1 1 0 0 +EDGE2 1754 1415 0.979411 -0.00977544 -3.1697 1 0 1 1 0 0 +EDGE2 1755 1734 -0.986219 0.0508284 0.0152933 1 0 1 1 0 0 +EDGE2 1755 1754 -1.00471 0.0433731 -0.0158943 1 0 1 1 0 0 +EDGE2 1755 1435 -0.0301904 0.0652932 -3.12131 1 0 1 1 0 0 +EDGE2 1755 1455 0.0400519 0.00410355 -3.11557 1 0 1 1 0 0 +EDGE2 1755 1416 -0.0852544 -0.974534 -1.54571 1 0 1 1 0 0 +EDGE2 1755 1436 0.0492138 -0.977108 -1.5793 1 0 1 1 0 0 +EDGE2 1755 1396 -0.0249719 -0.979908 -1.57283 1 0 1 1 0 0 +EDGE2 1755 1735 0.0295669 -0.00728954 0.0382418 1 0 1 1 0 0 +EDGE2 1755 1434 0.922354 -0.042621 -3.18316 1 0 1 1 0 0 +EDGE2 1755 1395 0.0665227 -0.118274 -3.13677 1 0 1 1 0 0 +EDGE2 1755 1415 0.0302487 -0.0514111 -3.14339 1 0 1 1 0 0 +EDGE2 1755 1454 1.06109 0.0155599 -3.13348 1 0 1 1 0 0 +EDGE2 1755 1394 0.983073 -0.0133484 -3.1239 1 0 1 1 0 0 +EDGE2 1755 1414 1.00405 -0.00833904 -3.10087 1 0 1 1 0 0 +EDGE2 1755 1456 -0.0547316 1.05964 1.56471 1 0 1 1 0 0 +EDGE2 1755 1736 0.0425472 1.05929 1.56626 1 0 1 1 0 0 +EDGE2 1756 1417 1.03869 -0.0455756 0.0118797 1 0 1 1 0 0 +EDGE2 1756 1437 1.03921 -0.00542353 0.0180696 1 0 1 1 0 0 +EDGE2 1756 1435 -0.929832 0.0472195 -1.60982 1 0 1 1 0 0 +EDGE2 1756 1455 -1.00892 0.0438835 -1.56357 1 0 1 1 0 0 +EDGE2 1756 1416 0.00368062 0.0259908 -0.0162995 1 0 1 1 0 0 +EDGE2 1756 1397 0.970294 -0.0476115 0.044127 1 0 1 1 0 0 +EDGE2 1756 1436 0.0416186 0.00865094 0.00264478 1 0 1 1 0 0 +EDGE2 1756 1755 -0.924521 -0.0506806 1.58976 1 0 1 1 0 0 +EDGE2 1756 1396 0.0324749 0.0346219 0.00427853 1 0 1 1 0 0 +EDGE2 1756 1735 -0.994455 0.0313884 1.55866 1 0 1 1 0 0 +EDGE2 1756 1395 -0.978591 0.04553 -1.57032 1 0 1 1 0 0 +EDGE2 1756 1415 -0.98294 0.018394 -1.55129 1 0 1 1 0 0 +EDGE2 1757 1417 -0.0363955 -0.00399282 0.0145003 1 0 1 1 0 0 +EDGE2 1757 1398 0.947051 0.0145561 0.0118459 1 0 1 1 0 0 +EDGE2 1757 1438 1.04122 -0.0213953 -0.0127666 1 0 1 1 0 0 +EDGE2 1757 1418 1.10155 0.0518909 -0.008761 1 0 1 1 0 0 +EDGE2 1757 1437 -0.0450822 0.0338031 -0.0235222 1 0 1 1 0 0 +EDGE2 1757 1416 -1.03554 0.024876 -0.0228613 1 0 1 1 0 0 +EDGE2 1757 1756 -0.929091 -0.0580911 -0.0168028 1 0 1 1 0 0 +EDGE2 1757 1397 -0.032154 0.0104569 0.00384149 1 0 1 1 0 0 +EDGE2 1757 1436 -0.969659 -0.0214452 -0.0282365 1 0 1 1 0 0 +EDGE2 1757 1396 -0.994181 0.0107796 -0.0147396 1 0 1 1 0 0 +EDGE2 1758 1417 -0.966233 0.123183 -0.00898175 1 0 1 1 0 0 +EDGE2 1758 1419 1.01218 0.0240166 -0.00618159 1 0 1 1 0 0 +EDGE2 1758 1439 0.951326 0.0926088 0.0028164 1 0 1 1 0 0 +EDGE2 1758 1399 0.929451 0.0557562 -0.0161013 1 0 1 1 0 0 +EDGE2 1758 1398 -0.0215533 0.0403033 0.0125407 1 0 1 1 0 0 +EDGE2 1758 1438 -0.0241785 0.023467 0.000685383 1 0 1 1 0 0 +EDGE2 1758 1418 -0.073771 -0.0430769 -0.00952807 1 0 1 1 0 0 +EDGE2 1758 1757 -1.02573 0.0407081 0.0256324 1 0 1 1 0 0 +EDGE2 1758 1437 -1.03751 0.0126459 -0.00183303 1 0 1 1 0 0 +EDGE2 1758 1397 -1.06987 -0.0567116 -0.011078 1 0 1 1 0 0 +EDGE2 1759 1420 0.953937 -0.00883027 0.0181797 1 0 1 1 0 0 +EDGE2 1759 1440 1.00305 -0.0860679 0.000883561 1 0 1 1 0 0 +EDGE2 1759 1400 0.971983 -0.00622008 -0.000881174 1 0 1 1 0 0 +EDGE2 1759 1758 -0.991982 -0.0131932 -0.0119794 1 0 1 1 0 0 +EDGE2 1759 1419 0.0387577 0.00172778 -0.030334 1 0 1 1 0 0 +EDGE2 1759 1439 -0.000151747 0.0773407 0.00763936 1 0 1 1 0 0 +EDGE2 1759 1399 0.00986664 -0.085379 -0.0285671 1 0 1 1 0 0 +EDGE2 1759 1398 -1.03734 -0.000705074 -0.0081091 1 0 1 1 0 0 +EDGE2 1759 1438 -1.00991 0.0401524 0.0410316 1 0 1 1 0 0 +EDGE2 1759 1418 -1.06479 -0.0109514 0.00744985 1 0 1 1 0 0 +EDGE2 1760 1420 0.00722047 0.0625341 -0.0135427 1 0 1 1 0 0 +EDGE2 1760 1440 0.0519206 -0.109328 -0.021476 1 0 1 1 0 0 +EDGE2 1760 1400 -0.00654235 0.00295744 -0.0312855 1 0 1 1 0 0 +EDGE2 1760 1421 -0.0289012 0.976646 1.56376 1 0 1 1 0 0 +EDGE2 1760 1441 -0.0710696 0.990354 1.55849 1 0 1 1 0 0 +EDGE2 1760 1401 0.0201362 0.977209 1.53792 1 0 1 1 0 0 +EDGE2 1760 1419 -1.03983 -0.00837059 0.00750489 1 0 1 1 0 0 +EDGE2 1760 1759 -0.98537 -0.0251281 -0.00814901 1 0 1 1 0 0 +EDGE2 1760 1439 -0.94444 -0.0654075 -0.00701959 1 0 1 1 0 0 +EDGE2 1760 1399 -1.01638 0.000633325 0.00867832 1 0 1 1 0 0 +EDGE2 1761 1420 -1.01878 0.0295263 1.54553 1 0 1 1 0 0 +EDGE2 1761 1440 -1.03075 0.0269113 1.56999 1 0 1 1 0 0 +EDGE2 1761 1760 -0.965747 0.0825667 1.55213 1 0 1 1 0 0 +EDGE2 1761 1400 -0.985987 -0.0162509 1.6039 1 0 1 1 0 0 +EDGE2 1762 1761 -1.06414 0.0358796 0.0246496 1 0 1 1 0 0 +EDGE2 1763 1762 -1.02982 0.00311456 -0.0157439 1 0 1 1 0 0 +EDGE2 1764 1763 -0.958786 -0.0211756 0.00154463 1 0 1 1 0 0 +EDGE2 1765 1764 -1.04226 0.041719 -0.0203671 1 0 1 1 0 0 +EDGE2 1766 1765 -1.05419 0.00552114 -1.56861 1 0 1 1 0 0 +EDGE2 1767 1766 -0.890442 -0.0448705 0.0332973 1 0 1 1 0 0 +EDGE2 1768 1767 -1.01911 -0.0326281 0.0364023 1 0 1 1 0 0 +EDGE2 1769 1768 -0.986585 -0.0688984 -0.0282087 1 0 1 1 0 0 +EDGE2 1770 1769 -1.02578 0.0510036 0.0248669 1 0 1 1 0 0 +EDGE2 1771 1770 -1.00571 0.0996475 -1.56775 1 0 1 1 0 0 +EDGE2 1772 1771 -0.941326 -0.0109818 0.00980481 1 0 1 1 0 0 +EDGE2 1773 1772 -1.00015 0.0706337 -0.00122474 1 0 1 1 0 0 +EDGE2 1774 1773 -1.05167 0.0222706 0.0417447 1 0 1 1 0 0 +EDGE2 1775 1774 -1.00043 -0.0834554 0.00354699 1 0 1 1 0 0 +EDGE2 1776 1775 -0.936593 0.0257475 1.5563 1 0 1 1 0 0 +EDGE2 1777 1776 -1.06192 -0.0378385 0.00291171 1 0 1 1 0 0 +EDGE2 1778 1777 -1.03587 0.00957418 -0.0147598 1 0 1 1 0 0 +EDGE2 1779 1778 -0.980431 -0.0726444 0.0208313 1 0 1 1 0 0 +EDGE2 1780 1779 -0.979741 0.0584931 -0.0203344 1 0 1 1 0 0 +EDGE2 1781 1780 -1.08911 0.0116695 -1.54279 1 0 1 1 0 0 +EDGE2 1782 1781 -1.00329 -0.0104042 0.0467171 1 0 1 1 0 0 +EDGE2 1783 1782 -0.913191 -0.000209996 0.0147564 1 0 1 1 0 0 +EDGE2 1784 1783 -1.06532 0.017519 0.00480274 1 0 1 1 0 0 +EDGE2 1785 1784 -0.999118 0.0190973 0.0347354 1 0 1 1 0 0 +EDGE2 1786 1785 -1.00108 -0.0592665 -1.5904 1 0 1 1 0 0 +EDGE2 1787 1786 -1.03097 0.0194396 -0.00796239 1 0 1 1 0 0 +EDGE2 1788 1787 -0.958425 -0.0203202 -0.0119737 1 0 1 1 0 0 +EDGE2 1789 1788 -1.00863 0.0734663 0.0226284 1 0 1 1 0 0 +EDGE2 1790 1789 -0.983744 -0.0583527 0.0112796 1 0 1 1 0 0 +EDGE2 1791 1790 -0.992059 -0.00338365 1.56025 1 0 1 1 0 0 +EDGE2 1792 1791 -1.02872 0.0984246 -0.0129905 1 0 1 1 0 0 +EDGE2 1793 1792 -0.946384 0.0293469 -0.000100013 1 0 1 1 0 0 +EDGE2 1794 1793 -1.0169 -0.0787635 0.0231304 1 0 1 1 0 0 +EDGE2 1795 1794 -0.917768 0.0438206 0.00368484 1 0 1 1 0 0 +EDGE2 1796 1795 -1.01809 -0.0290006 -1.55935 1 0 1 1 0 0 +EDGE2 1797 1796 -0.956898 -0.0292088 0.0163033 1 0 1 1 0 0 +EDGE2 1798 1797 -1.07327 0.0873902 -0.00941638 1 0 1 1 0 0 +EDGE2 1799 1798 -0.941449 0.00258215 0.00363096 1 0 1 1 0 0 +EDGE2 1800 1799 -0.993449 0.0482699 0.0298521 1 0 1 1 0 0 +EDGE2 1801 1800 -0.98474 0.0201617 1.60871 1 0 1 1 0 0 +EDGE2 1802 1801 -1.06605 -0.0449889 0.026951 1 0 1 1 0 0 +EDGE2 1803 1802 -0.985242 -0.0795706 0.0126441 1 0 1 1 0 0 +EDGE2 1804 1803 -0.953381 -0.0430394 0.0224042 1 0 1 1 0 0 +EDGE2 1805 1804 -0.984574 0.0174869 -0.00201194 1 0 1 1 0 0 +EDGE2 1806 1805 -1.03376 0.018441 1.55898 1 0 1 1 0 0 +EDGE2 1807 1806 -0.985644 -0.0636222 -0.0192788 1 0 1 1 0 0 +EDGE2 1808 1807 -0.992907 -0.00308542 0.0143267 1 0 1 1 0 0 +EDGE2 1809 1808 -0.976808 0.0422245 0.0465524 1 0 1 1 0 0 +EDGE2 1810 1809 -0.95447 -0.053218 -0.0484707 1 0 1 1 0 0 +EDGE2 1811 1810 -1.02369 -0.00409252 -1.56315 1 0 1 1 0 0 +EDGE2 1812 1811 -1.06865 0.0679294 0.0237491 1 0 1 1 0 0 +EDGE2 1813 1812 -0.969226 0.0718063 -0.00062935 1 0 1 1 0 0 +EDGE2 1814 1813 -1.05726 0.0651111 -0.00776797 1 0 1 1 0 0 +EDGE2 1815 1814 -0.977047 -0.0502861 0.00490413 1 0 1 1 0 0 +EDGE2 1816 1815 -0.980208 0.0144712 -1.54595 1 0 1 1 0 0 +EDGE2 1817 1816 -0.933921 -0.0168769 -0.0139943 1 0 1 1 0 0 +EDGE2 1818 1817 -1.05422 -0.00992057 -0.0058032 1 0 1 1 0 0 +EDGE2 1819 1818 -1.09568 0.00338542 0.0157961 1 0 1 1 0 0 +EDGE2 1819 1240 1.02754 -0.00458761 -3.16858 1 0 1 1 0 0 +EDGE2 1820 1819 -0.989484 0.0541617 0.00253305 1 0 1 1 0 0 +EDGE2 1820 1240 -0.0291675 0.0283962 -3.13204 1 0 1 1 0 0 +EDGE2 1820 1241 -0.00268493 -1.08427 -1.55779 1 0 1 1 0 0 +EDGE2 1820 1239 1.03117 -0.033865 -3.12304 1 0 1 1 0 0 +EDGE2 1821 1820 -1.07258 -0.0173016 -1.56428 1 0 1 1 0 0 +EDGE2 1821 1240 -0.978654 0.021683 1.61878 1 0 1 1 0 0 +EDGE2 1822 1821 -1.00557 0.0666826 -0.0226608 1 0 1 1 0 0 +EDGE2 1823 1822 -1.12813 0.045157 0.0337651 1 0 1 1 0 0 +EDGE2 1824 1805 0.999176 0.0744814 -3.19913 1 0 1 1 0 0 +EDGE2 1824 1823 -1.09756 -0.0128835 -0.0227179 1 0 1 1 0 0 +EDGE2 1825 1805 -0.102324 0.00750036 -3.1768 1 0 1 1 0 0 +EDGE2 1825 1806 0.0119736 0.952701 1.5781 1 0 1 1 0 0 +EDGE2 1825 1804 0.953964 -0.0289958 -3.1462 1 0 1 1 0 0 +EDGE2 1825 1824 -1.03057 0.0414847 0.0219241 1 0 1 1 0 0 +EDGE2 1826 1805 -1.01856 -0.0544771 -1.58356 1 0 1 1 0 0 +EDGE2 1826 1825 -0.90666 0.0638844 1.58 1 0 1 1 0 0 +EDGE2 1827 1826 -0.94268 -0.0475434 0.0156346 1 0 1 1 0 0 +EDGE2 1828 1827 -1.0699 -0.0375872 -0.0350514 1 0 1 1 0 0 +EDGE2 1829 1828 -0.965227 -0.00421246 0.0315346 1 0 1 1 0 0 +EDGE2 1829 1550 1.00695 0.0115789 -3.15673 1 0 1 1 0 0 +EDGE2 1830 1829 -1.0494 -0.0013746 0.00726546 1 0 1 1 0 0 +EDGE2 1830 1551 -0.060495 1.02571 1.55403 1 0 1 1 0 0 +EDGE2 1830 1550 -0.00693375 -0.0346213 -3.13176 1 0 1 1 0 0 +EDGE2 1830 1549 1.08624 0.0092139 -3.12265 1 0 1 1 0 0 +EDGE2 1831 1552 1.0064 0.0169061 0.00584278 1 0 1 1 0 0 +EDGE2 1831 1551 -0.053709 0.00375646 0.0155941 1 0 1 1 0 0 +EDGE2 1831 1550 -0.934917 0.000339262 1.58727 1 0 1 1 0 0 +EDGE2 1831 1830 -0.956445 -0.0104551 -1.56429 1 0 1 1 0 0 +EDGE2 1832 1553 0.95767 0.139311 0.00310845 1 0 1 1 0 0 +EDGE2 1832 1831 -0.930243 0.0318859 -0.0218538 1 0 1 1 0 0 +EDGE2 1832 1552 -0.0535843 -0.0439395 0.0216301 1 0 1 1 0 0 +EDGE2 1832 1551 -0.952169 -0.0397966 0.00072455 1 0 1 1 0 0 +EDGE2 1833 1553 0.0461927 0.00281975 0.0281081 1 0 1 1 0 0 +EDGE2 1833 1554 0.91474 0.00617235 -0.0136204 1 0 1 1 0 0 +EDGE2 1833 1552 -1.02021 -0.02697 -0.0207838 1 0 1 1 0 0 +EDGE2 1833 1832 -1.03581 0.0673291 -0.000746802 1 0 1 1 0 0 +EDGE2 1834 1553 -1.13117 0.00934277 0.0340973 1 0 1 1 0 0 +EDGE2 1834 1554 0.0230355 -0.0554773 0.0100709 1 0 1 1 0 0 +EDGE2 1834 1555 1.03275 -0.0840839 0.0146116 1 0 1 1 0 0 +EDGE2 1834 1833 -0.992306 0.0463948 -0.00790176 1 0 1 1 0 0 +EDGE2 1835 1554 -0.961879 0.0783419 -0.00331369 1 0 1 1 0 0 +EDGE2 1835 1834 -1.02791 0.0349251 -0.0122877 1 0 1 1 0 0 +EDGE2 1835 1555 0.00667194 0.0382393 0.0394659 1 0 1 1 0 0 +EDGE2 1835 1556 -0.0497783 -0.968986 -1.5748 1 0 1 1 0 0 +EDGE2 1836 1835 -1.04262 0.0432454 1.52773 1 0 1 1 0 0 +EDGE2 1836 1555 -0.966582 -0.0247982 1.5337 1 0 1 1 0 0 +EDGE2 1836 1556 -0.0851726 -0.0772884 -0.0114017 1 0 1 1 0 0 +EDGE2 1836 1557 0.915797 0.0198569 0.00996152 1 0 1 1 0 0 +EDGE2 1837 1556 -0.912622 0.029063 0.0111826 1 0 1 1 0 0 +EDGE2 1837 1836 -1.01659 -0.0182153 -0.0144029 1 0 1 1 0 0 +EDGE2 1837 1557 0.0233659 -0.0405956 0.000417774 1 0 1 1 0 0 +EDGE2 1837 1558 0.982992 -0.020732 0.0140981 1 0 1 1 0 0 +EDGE2 1838 1837 -0.991547 -0.0811422 -0.0115465 1 0 1 1 0 0 +EDGE2 1838 1557 -1.01906 -0.0460387 0.0163711 1 0 1 1 0 0 +EDGE2 1838 1558 0.0702821 -0.0228148 -0.00530333 1 0 1 1 0 0 +EDGE2 1838 1559 1.05277 -0.00799026 0.0378259 1 0 1 1 0 0 +EDGE2 1839 1838 -0.995524 -0.01582 0.00152201 1 0 1 1 0 0 +EDGE2 1839 1558 -1.04816 0.0458107 -0.010932 1 0 1 1 0 0 +EDGE2 1839 1559 -0.0857284 0.0499565 -0.0154501 1 0 1 1 0 0 +EDGE2 1839 1540 1.05316 0.00079117 -3.13181 1 0 1 1 0 0 +EDGE2 1839 1580 1.0087 0.0138343 -3.14335 1 0 1 1 0 0 +EDGE2 1839 1660 0.957279 -0.0396038 -3.13792 1 0 1 1 0 0 +EDGE2 1839 1560 0.985222 0.0769259 0.0163295 1 0 1 1 0 0 +EDGE2 1839 1380 1.03097 -0.0273588 -3.1095 1 0 1 1 0 0 +EDGE2 1840 1839 -1.04091 -0.00995429 -0.00860943 1 0 1 1 0 0 +EDGE2 1840 1559 -0.996814 -0.00110505 -0.00428874 1 0 1 1 0 0 +EDGE2 1840 1540 0.0109393 -0.0406461 -3.15844 1 0 1 1 0 0 +EDGE2 1840 1381 -0.0553239 0.938736 1.56671 1 0 1 1 0 0 +EDGE2 1840 1661 0.0210331 1.02789 1.56416 1 0 1 1 0 0 +EDGE2 1840 1580 -0.0380002 -0.0763625 -3.12448 1 0 1 1 0 0 +EDGE2 1840 1660 0.0196063 0.0406822 -3.15495 1 0 1 1 0 0 +EDGE2 1840 1560 -0.0193059 -0.0472755 -0.00726537 1 0 1 1 0 0 +EDGE2 1840 1581 -0.00834975 -1.11168 -1.60008 1 0 1 1 0 0 +EDGE2 1840 1380 0.00475606 -0.00221196 -3.17517 1 0 1 1 0 0 +EDGE2 1840 1541 0.0140365 -0.991458 -1.59252 1 0 1 1 0 0 +EDGE2 1840 1561 0.0419368 -0.989957 -1.58502 1 0 1 1 0 0 +EDGE2 1840 1579 0.995887 -0.0822768 -3.15898 1 0 1 1 0 0 +EDGE2 1840 1659 1.08904 0.00687002 -3.16861 1 0 1 1 0 0 +EDGE2 1840 1379 0.944643 0.0991976 -3.13518 1 0 1 1 0 0 +EDGE2 1840 1539 1.00563 0.0259304 -3.13797 1 0 1 1 0 0 +EDGE2 1841 1540 -0.918513 -0.105738 -1.5427 1 0 1 1 0 0 +EDGE2 1841 1580 -0.94633 0.0209167 -1.55036 1 0 1 1 0 0 +EDGE2 1841 1660 -0.885542 -0.0366506 -1.58424 1 0 1 1 0 0 +EDGE2 1841 1840 -0.940895 0.0225156 1.57605 1 0 1 1 0 0 +EDGE2 1841 1560 -1.02455 -0.0237381 1.56858 1 0 1 1 0 0 +EDGE2 1841 1581 0.00516278 0.0407763 -0.0318295 1 0 1 1 0 0 +EDGE2 1841 1380 -1.00188 -0.011373 -1.53459 1 0 1 1 0 0 +EDGE2 1841 1541 -0.000365119 0.0502111 -0.00964153 1 0 1 1 0 0 +EDGE2 1841 1561 0.080164 -0.058686 -0.0115544 1 0 1 1 0 0 +EDGE2 1841 1542 1.04307 0.0256763 0.00441615 1 0 1 1 0 0 +EDGE2 1841 1562 1.00468 -0.00874671 0.00951185 1 0 1 1 0 0 +EDGE2 1841 1582 0.973164 -0.0132659 0.00539355 1 0 1 1 0 0 +EDGE2 1842 1543 0.936918 0.0181662 -0.0343955 1 0 1 1 0 0 +EDGE2 1842 1581 -1.09127 -0.00122315 0.00896923 1 0 1 1 0 0 +EDGE2 1842 1841 -1.07358 -0.0486141 -0.0308208 1 0 1 1 0 0 +EDGE2 1842 1541 -0.955834 0.0351923 0.0253584 1 0 1 1 0 0 +EDGE2 1842 1561 -0.938015 1.85062e-05 -0.00297624 1 0 1 1 0 0 +EDGE2 1842 1542 0.0380643 -0.0315712 -0.0206277 1 0 1 1 0 0 +EDGE2 1842 1562 0.0147068 -0.046848 0.0300195 1 0 1 1 0 0 +EDGE2 1842 1582 -0.0132782 0.0861021 0.0207302 1 0 1 1 0 0 +EDGE2 1842 1583 0.978335 -0.0227218 -0.00724177 1 0 1 1 0 0 +EDGE2 1842 1563 1.00711 0.0102407 0.00777992 1 0 1 1 0 0 +EDGE2 1843 1543 -0.032702 -0.0165485 0.0333736 1 0 1 1 0 0 +EDGE2 1843 1842 -0.934651 -0.0239881 0.0185926 1 0 1 1 0 0 +EDGE2 1843 1542 -0.959052 0.00394788 -0.0140583 1 0 1 1 0 0 +EDGE2 1843 1562 -0.880643 0.032085 -0.00210908 1 0 1 1 0 0 +EDGE2 1843 1582 -1.01779 -0.0125494 0.00243276 1 0 1 1 0 0 +EDGE2 1843 1583 -0.0662673 -0.0669446 -0.0142811 1 0 1 1 0 0 +EDGE2 1843 1563 -0.116534 -0.0753912 -0.0247328 1 0 1 1 0 0 +EDGE2 1843 1564 0.864381 -0.0496131 0.0320176 1 0 1 1 0 0 +EDGE2 1843 1584 1.03267 0.00727893 0.00606454 1 0 1 1 0 0 +EDGE2 1843 1544 1.01336 -0.0415886 0.0304835 1 0 1 1 0 0 +EDGE2 1844 1543 -0.983049 0.0301974 -0.0162543 1 0 1 1 0 0 +EDGE2 1844 1583 -1.04223 0.0143546 0.0186046 1 0 1 1 0 0 +EDGE2 1844 1843 -0.914828 0.0293216 0.00688225 1 0 1 1 0 0 +EDGE2 1844 1563 -0.939559 0.0427671 -0.00861096 1 0 1 1 0 0 +EDGE2 1844 1564 -0.0030454 -0.114887 -0.00394196 1 0 1 1 0 0 +EDGE2 1844 1584 0.0568292 -0.00874554 0.00717312 1 0 1 1 0 0 +EDGE2 1844 1544 -0.0359837 0.0659724 -0.0340769 1 0 1 1 0 0 +EDGE2 1844 1265 1.01736 0.0193334 -3.13983 1 0 1 1 0 0 +EDGE2 1844 1565 1.01917 0.0580885 0.0143582 1 0 1 1 0 0 +EDGE2 1844 1585 0.977996 0.00838258 -0.0067849 1 0 1 1 0 0 +EDGE2 1844 1545 1.04795 0.0334212 0.00633931 1 0 1 1 0 0 +EDGE2 1845 1564 -0.980295 -0.0233677 0.0253491 1 0 1 1 0 0 +EDGE2 1845 1844 -1.05851 -0.0474599 0.0404748 1 0 1 1 0 0 +EDGE2 1845 1584 -1.08527 -0.00221443 -0.00777359 1 0 1 1 0 0 +EDGE2 1845 1544 -1.07076 0.027982 0.00836323 1 0 1 1 0 0 +EDGE2 1845 1546 0.00245245 -0.926646 -1.5764 1 0 1 1 0 0 +EDGE2 1845 1265 -0.0287193 0.0624284 -3.14845 1 0 1 1 0 0 +EDGE2 1845 1565 0.0422954 -0.00784214 -0.00647506 1 0 1 1 0 0 +EDGE2 1845 1585 -0.0104678 -0.00491132 -0.0128561 1 0 1 1 0 0 +EDGE2 1845 1545 0.0976677 0.0210641 0.0165269 1 0 1 1 0 0 +EDGE2 1845 1264 1.03246 -0.0429349 -3.12407 1 0 1 1 0 0 +EDGE2 1845 1566 0.0180115 1.05382 1.59157 1 0 1 1 0 0 +EDGE2 1845 1586 0.0246011 1.03495 1.58898 1 0 1 1 0 0 +EDGE2 1845 1266 -0.0114106 1.03138 1.58593 1 0 1 1 0 0 +EDGE2 1846 1265 -1.03974 -0.0053552 1.57232 1 0 1 1 0 0 +EDGE2 1846 1565 -0.981566 0.0928217 -1.60193 1 0 1 1 0 0 +EDGE2 1846 1585 -1.0674 -0.044284 -1.59294 1 0 1 1 0 0 +EDGE2 1846 1845 -0.996936 0.0153628 -1.56701 1 0 1 1 0 0 +EDGE2 1846 1545 -1.03295 -0.0126195 -1.55652 1 0 1 1 0 0 +EDGE2 1846 1567 0.993874 -0.0132321 -0.0130054 1 0 1 1 0 0 +EDGE2 1846 1587 0.990848 -0.0751477 0.00633755 1 0 1 1 0 0 +EDGE2 1846 1566 -0.0443704 -0.0257379 -0.0426255 1 0 1 1 0 0 +EDGE2 1846 1586 0.0549074 0.0672338 0.00681567 1 0 1 1 0 0 +EDGE2 1846 1266 -0.0104559 0.0247954 0.00723361 1 0 1 1 0 0 +EDGE2 1846 1267 0.932071 -0.0108854 -0.0188023 1 0 1 1 0 0 +EDGE2 1847 1567 0.00329178 0.0750598 -0.00693233 1 0 1 1 0 0 +EDGE2 1847 1587 0.0332957 -0.0831819 -0.008481 1 0 1 1 0 0 +EDGE2 1847 1566 -0.962778 -0.0372946 0.0222982 1 0 1 1 0 0 +EDGE2 1847 1846 -0.995073 -0.109649 -0.0360952 1 0 1 1 0 0 +EDGE2 1847 1586 -0.92294 -0.0494611 -0.0345836 1 0 1 1 0 0 +EDGE2 1847 1266 -0.949573 -0.0609456 0.0162417 1 0 1 1 0 0 +EDGE2 1847 1588 0.97343 -0.00201425 0.00116469 1 0 1 1 0 0 +EDGE2 1847 1267 0.041077 0.036274 -0.00983392 1 0 1 1 0 0 +EDGE2 1847 1268 0.986856 0.0887638 -0.00450295 1 0 1 1 0 0 +EDGE2 1847 1568 1.01971 0.0469114 0.00930247 1 0 1 1 0 0 +EDGE2 1848 1567 -0.961098 0.046775 0.0158919 1 0 1 1 0 0 +EDGE2 1848 1587 -1.02448 0.0550488 -0.0244326 1 0 1 1 0 0 +EDGE2 1848 1847 -0.942677 -0.0533586 0.0177988 1 0 1 1 0 0 +EDGE2 1848 1588 0.000793431 -0.00617221 0.010677 1 0 1 1 0 0 +EDGE2 1848 1267 -0.991783 0.00740079 -0.0102024 1 0 1 1 0 0 +EDGE2 1848 1268 0.00583321 -0.00950397 0.0238714 1 0 1 1 0 0 +EDGE2 1848 1568 0.0464653 -0.0720025 0.00438823 1 0 1 1 0 0 +EDGE2 1848 1569 1.0898 0.0445177 -0.0195553 1 0 1 1 0 0 +EDGE2 1848 1589 0.96376 0.00459661 0.00233809 1 0 1 1 0 0 +EDGE2 1848 1269 0.970159 -0.0239527 -0.00824734 1 0 1 1 0 0 +EDGE2 1849 1588 -0.989281 0.045325 -0.0139961 1 0 1 1 0 0 +EDGE2 1849 1848 -0.998326 0.0426785 0.0114635 1 0 1 1 0 0 +EDGE2 1849 1268 -0.974514 0.0163349 -0.00501742 1 0 1 1 0 0 +EDGE2 1849 1568 -0.977565 0.0427885 -0.0168542 1 0 1 1 0 0 +EDGE2 1849 1569 -0.0155549 -0.00579784 -0.0220447 1 0 1 1 0 0 +EDGE2 1849 1589 -0.0428342 -0.00499485 0.00613491 1 0 1 1 0 0 +EDGE2 1849 1269 0.0555027 0.00705857 0.0104593 1 0 1 1 0 0 +EDGE2 1849 1590 0.96271 0.00092184 -0.0156373 1 0 1 1 0 0 +EDGE2 1849 1270 1.06362 0.138203 -0.00361022 1 0 1 1 0 0 +EDGE2 1849 1290 0.931747 0.0515371 -3.11604 1 0 1 1 0 0 +EDGE2 1849 1570 0.885217 0.00778672 0.0126495 1 0 1 1 0 0 +EDGE2 1850 1571 -0.102078 1.10234 1.58612 1 0 1 1 0 0 +EDGE2 1850 1591 -0.111519 1.00646 1.57587 1 0 1 1 0 0 +EDGE2 1850 1849 -1.02353 0.0302037 -0.00922779 1 0 1 1 0 0 +EDGE2 1850 1569 -0.976459 0.0212079 -0.00181894 1 0 1 1 0 0 +EDGE2 1850 1589 -0.975196 0.0898924 -0.0225773 1 0 1 1 0 0 +EDGE2 1850 1269 -1.13281 0.00901857 0.02441 1 0 1 1 0 0 +EDGE2 1850 1291 -0.018063 -0.965134 -1.57287 1 0 1 1 0 0 +EDGE2 1850 1590 -0.0140785 0.0222596 0.0234546 1 0 1 1 0 0 +EDGE2 1850 1270 0.019778 -0.0123199 -0.0204253 1 0 1 1 0 0 +EDGE2 1850 1290 -0.0317595 0.0122443 -3.1459 1 0 1 1 0 0 +EDGE2 1850 1570 -0.0360341 -0.0563959 0.00645196 1 0 1 1 0 0 +EDGE2 1850 1271 0.124372 -1.06294 -1.57338 1 0 1 1 0 0 +EDGE2 1850 1289 1.00642 -0.0851859 -3.12293 1 0 1 1 0 0 +EDGE2 1851 1572 0.983022 0.0675087 0.0388214 1 0 1 1 0 0 +EDGE2 1851 1592 0.968976 -0.0294603 0.0163143 1 0 1 1 0 0 +EDGE2 1851 1571 0.0610465 -0.108598 -0.021643 1 0 1 1 0 0 +EDGE2 1851 1591 -0.0167764 -0.038794 -0.0125274 1 0 1 1 0 0 +EDGE2 1851 1590 -1.02794 -0.029401 -1.56193 1 0 1 1 0 0 +EDGE2 1851 1850 -0.992256 0.0364166 -1.60565 1 0 1 1 0 0 +EDGE2 1851 1270 -0.974846 -0.0515983 -1.59005 1 0 1 1 0 0 +EDGE2 1851 1290 -0.957378 -0.00842469 1.57643 1 0 1 1 0 0 +EDGE2 1851 1570 -0.968746 -0.0541305 -1.59523 1 0 1 1 0 0 +EDGE2 1852 1851 -0.993372 0.00188867 -0.00697929 1 0 1 1 0 0 +EDGE2 1852 1573 0.95723 -0.0250576 0.0107473 1 0 1 1 0 0 +EDGE2 1852 1593 0.964854 0.0704673 0.0251062 1 0 1 1 0 0 +EDGE2 1852 1572 -0.109714 -0.0171784 0.0235528 1 0 1 1 0 0 +EDGE2 1852 1592 -0.00905406 -0.0167579 0.0248938 1 0 1 1 0 0 +EDGE2 1852 1571 -1.036 -0.00174212 -0.0169282 1 0 1 1 0 0 +EDGE2 1852 1591 -0.998413 0.0864167 -0.0325973 1 0 1 1 0 0 +EDGE2 1853 1574 1.02765 -0.0789233 0.0334493 1 0 1 1 0 0 +EDGE2 1853 1594 1.06074 -0.0139275 -0.0258019 1 0 1 1 0 0 +EDGE2 1853 1852 -0.961345 0.0652038 0.00187372 1 0 1 1 0 0 +EDGE2 1853 1573 -0.128551 0.0222769 -0.0386553 1 0 1 1 0 0 +EDGE2 1853 1593 -0.0280147 0.0170815 -0.0277765 1 0 1 1 0 0 +EDGE2 1853 1572 -0.99485 0.0264579 0.0070852 1 0 1 1 0 0 +EDGE2 1853 1592 -0.991551 -0.0222593 0.00684877 1 0 1 1 0 0 +EDGE2 1854 1535 1.03715 -0.0833603 -3.11505 1 0 1 1 0 0 +EDGE2 1854 1595 1.05505 -0.0514901 -0.00773579 1 0 1 1 0 0 +EDGE2 1854 1655 1.08623 -0.0670245 -3.13727 1 0 1 1 0 0 +EDGE2 1854 1575 1.04427 -0.049145 0.0121348 1 0 1 1 0 0 +EDGE2 1854 1853 -1.05752 -0.0867821 -0.0118541 1 0 1 1 0 0 +EDGE2 1854 1375 1.01204 0.044313 -3.12914 1 0 1 1 0 0 +EDGE2 1854 1515 0.920631 -0.0599501 -3.15085 1 0 1 1 0 0 +EDGE2 1854 1574 -0.0810433 0.0468572 -0.0149181 1 0 1 1 0 0 +EDGE2 1854 1594 -0.0554327 -0.0280195 -0.0102848 1 0 1 1 0 0 +EDGE2 1854 1573 -0.904814 0.00321352 0.0272847 1 0 1 1 0 0 +EDGE2 1854 1593 -1.03246 0.0717936 -0.0269556 1 0 1 1 0 0 +EDGE2 1855 1656 -0.00251381 0.897752 1.58507 1 0 1 1 0 0 +EDGE2 1855 1536 0.0735972 1.01062 1.59748 1 0 1 1 0 0 +EDGE2 1855 1576 0.0117634 1.09982 1.58885 1 0 1 1 0 0 +EDGE2 1855 1376 -0.0160692 0.901659 1.56919 1 0 1 1 0 0 +EDGE2 1855 1535 -0.0541173 0.0256098 -3.12886 1 0 1 1 0 0 +EDGE2 1855 1514 1.05523 -0.0255513 -3.11054 1 0 1 1 0 0 +EDGE2 1855 1654 0.996733 -0.0613712 -3.12065 1 0 1 1 0 0 +EDGE2 1855 1534 1.02196 0.0421986 -3.11129 1 0 1 1 0 0 +EDGE2 1855 1374 1.00326 0.0249665 -3.16581 1 0 1 1 0 0 +EDGE2 1855 1595 -0.00972231 -0.0238908 0.0174594 1 0 1 1 0 0 +EDGE2 1855 1655 -0.0416076 -0.0220697 -3.12798 1 0 1 1 0 0 +EDGE2 1855 1575 -0.0656843 -0.0593751 -0.014308 1 0 1 1 0 0 +EDGE2 1855 1854 -1.02292 0.0185846 0.0200665 1 0 1 1 0 0 +EDGE2 1855 1375 -0.0412334 -0.083985 -3.15742 1 0 1 1 0 0 +EDGE2 1855 1515 -0.00162717 -0.00569471 -3.13398 1 0 1 1 0 0 +EDGE2 1855 1574 -0.944245 -0.0496047 0.0456031 1 0 1 1 0 0 +EDGE2 1855 1594 -1.05802 0.054329 0.010288 1 0 1 1 0 0 +EDGE2 1855 1516 -0.00889856 -1.08463 -1.52759 1 0 1 1 0 0 +EDGE2 1855 1596 0.00221248 -1.07773 -1.58293 1 0 1 1 0 0 +EDGE2 1856 1537 1.00049 0.0478364 0.00305523 1 0 1 1 0 0 +EDGE2 1856 1577 0.963811 -0.0211933 0.0134821 1 0 1 1 0 0 +EDGE2 1856 1657 0.965301 0.042594 0.00763333 1 0 1 1 0 0 +EDGE2 1856 1656 0.007226 -0.0595336 0.024262 1 0 1 1 0 0 +EDGE2 1856 1377 0.836409 0.100429 0.0118492 1 0 1 1 0 0 +EDGE2 1856 1536 0.0695772 0.000314033 -0.00859828 1 0 1 1 0 0 +EDGE2 1856 1576 -0.0254516 0.0505011 -0.0144829 1 0 1 1 0 0 +EDGE2 1856 1376 -0.0557375 0.00923563 0.0231962 1 0 1 1 0 0 +EDGE2 1856 1535 -0.987433 0.00939854 1.55882 1 0 1 1 0 0 +EDGE2 1856 1855 -1.00806 -0.0218593 -1.5633 1 0 1 1 0 0 +EDGE2 1856 1595 -1.03933 0.000109717 -1.51324 1 0 1 1 0 0 +EDGE2 1856 1655 -0.997082 -0.0431431 1.55395 1 0 1 1 0 0 +EDGE2 1856 1575 -0.995979 0.0661448 -1.57924 1 0 1 1 0 0 +EDGE2 1856 1375 -1.05831 0.0189589 1.56082 1 0 1 1 0 0 +EDGE2 1856 1515 -1.00362 -0.00778524 1.57376 1 0 1 1 0 0 +EDGE2 1857 1378 0.957542 0.0547013 0.0177423 1 0 1 1 0 0 +EDGE2 1857 1578 1.06352 -0.0177309 -0.0118178 1 0 1 1 0 0 +EDGE2 1857 1658 1.02607 -0.0210644 -0.0116525 1 0 1 1 0 0 +EDGE2 1857 1538 0.902226 0.000734294 -0.0117302 1 0 1 1 0 0 +EDGE2 1857 1537 -0.0320699 -0.00293952 -0.00552311 1 0 1 1 0 0 +EDGE2 1857 1577 0.126507 0.00525199 0.021598 1 0 1 1 0 0 +EDGE2 1857 1657 0.0289176 -0.00367912 0.0125488 1 0 1 1 0 0 +EDGE2 1857 1656 -1.02105 -0.0795422 -0.0177023 1 0 1 1 0 0 +EDGE2 1857 1377 0.0308658 0.0564364 0.0119501 1 0 1 1 0 0 +EDGE2 1857 1856 -0.97379 0.0593877 0.0163635 1 0 1 1 0 0 +EDGE2 1857 1536 -0.913881 0.132903 -0.0109358 1 0 1 1 0 0 +EDGE2 1857 1576 -1.02382 -0.0311217 0.0294866 1 0 1 1 0 0 +EDGE2 1857 1376 -1.00552 0.00301907 -0.0280279 1 0 1 1 0 0 +EDGE2 1858 1378 -0.0434514 0.0916069 -0.018364 1 0 1 1 0 0 +EDGE2 1858 1579 1.07875 0.0821788 -0.0128725 1 0 1 1 0 0 +EDGE2 1858 1659 0.958387 -0.0345512 -0.0148857 1 0 1 1 0 0 +EDGE2 1858 1379 1.08819 -0.110785 -0.0362781 1 0 1 1 0 0 +EDGE2 1858 1539 0.989627 -0.0116234 -0.0381095 1 0 1 1 0 0 +EDGE2 1858 1578 0.0329558 0.0325223 -0.00653812 1 0 1 1 0 0 +EDGE2 1858 1658 0.0125067 -0.0348455 -0.00949993 1 0 1 1 0 0 +EDGE2 1858 1538 0.0796212 0.0358197 0.0139449 1 0 1 1 0 0 +EDGE2 1858 1537 -1.02615 0.114103 -0.0407959 1 0 1 1 0 0 +EDGE2 1858 1577 -1.00527 0.0394906 -0.0228938 1 0 1 1 0 0 +EDGE2 1858 1857 -1.05718 0.0500496 0.00776668 1 0 1 1 0 0 +EDGE2 1858 1657 -1.06135 0.133255 0.0169609 1 0 1 1 0 0 +EDGE2 1858 1377 -1.02931 0.00124414 -0.025298 1 0 1 1 0 0 +EDGE2 1859 1540 0.982721 0.0203357 -0.0242638 1 0 1 1 0 0 +EDGE2 1859 1580 1.03202 -0.0295673 -0.0135363 1 0 1 1 0 0 +EDGE2 1859 1660 1.04647 0.0347442 -0.0391969 1 0 1 1 0 0 +EDGE2 1859 1840 1.00556 -0.0141465 -3.116 1 0 1 1 0 0 +EDGE2 1859 1560 1.0134 0.0290453 -3.15413 1 0 1 1 0 0 +EDGE2 1859 1380 0.930944 -0.0375019 -0.00548376 1 0 1 1 0 0 +EDGE2 1859 1378 -1.00607 -0.0408665 0.0114891 1 0 1 1 0 0 +EDGE2 1859 1858 -1.03589 0.0518924 -0.0074357 1 0 1 1 0 0 +EDGE2 1859 1579 0.0356025 -0.0289843 -0.0401353 1 0 1 1 0 0 +EDGE2 1859 1659 -0.0323817 -0.0216723 -0.00735806 1 0 1 1 0 0 +EDGE2 1859 1379 -0.0352651 -0.0171819 -0.0172051 1 0 1 1 0 0 +EDGE2 1859 1539 0.000412169 0.0469507 -0.0247828 1 0 1 1 0 0 +EDGE2 1859 1578 -1.05141 0.0195608 0.00189707 1 0 1 1 0 0 +EDGE2 1859 1658 -0.944097 -0.0363249 -0.00882897 1 0 1 1 0 0 +EDGE2 1859 1538 -0.99274 -0.0412683 -0.0441188 1 0 1 1 0 0 +EDGE2 1860 1839 0.999716 -0.01428 -3.15231 1 0 1 1 0 0 +EDGE2 1860 1559 1.0531 0.00310745 -3.12933 1 0 1 1 0 0 +EDGE2 1860 1540 -0.0153616 -0.0428188 -0.0204084 1 0 1 1 0 0 +EDGE2 1860 1381 0.0625866 -0.895797 -1.57074 1 0 1 1 0 0 +EDGE2 1860 1661 0.0186205 -0.991961 -1.57632 1 0 1 1 0 0 +EDGE2 1860 1580 0.0282861 -0.10066 -0.00533014 1 0 1 1 0 0 +EDGE2 1860 1660 -0.0265334 -0.0724486 -0.00149381 1 0 1 1 0 0 +EDGE2 1860 1840 -0.0114574 0.0794791 -3.12551 1 0 1 1 0 0 +EDGE2 1860 1560 0.012183 -0.0628413 -3.15175 1 0 1 1 0 0 +EDGE2 1860 1581 0.0258245 0.990695 1.58652 1 0 1 1 0 0 +EDGE2 1860 1380 0.0449796 -0.0820296 0.00747141 1 0 1 1 0 0 +EDGE2 1860 1841 0.067055 0.918148 1.58029 1 0 1 1 0 0 +EDGE2 1860 1541 0.0256496 1.00815 1.5763 1 0 1 1 0 0 +EDGE2 1860 1561 -0.0312211 0.992418 1.58147 1 0 1 1 0 0 +EDGE2 1860 1579 -1.00748 0.02016 -0.0159179 1 0 1 1 0 0 +EDGE2 1860 1859 -1.06544 0.105531 0.0152794 1 0 1 1 0 0 +EDGE2 1860 1659 -1.03527 0.0126371 0.0560873 1 0 1 1 0 0 +EDGE2 1860 1379 -1.03983 -0.0286122 -0.00565348 1 0 1 1 0 0 +EDGE2 1860 1539 -1.04577 0.080454 0.0371526 1 0 1 1 0 0 +EDGE2 1861 1540 -0.947841 -0.025265 1.574 1 0 1 1 0 0 +EDGE2 1861 1662 0.989249 -0.115698 0.0445495 1 0 1 1 0 0 +EDGE2 1861 1382 1.07167 0.0397341 0.0139681 1 0 1 1 0 0 +EDGE2 1861 1860 -0.980342 -0.017495 1.57011 1 0 1 1 0 0 +EDGE2 1861 1381 0.144929 -0.126877 -0.0156529 1 0 1 1 0 0 +EDGE2 1861 1661 -0.0452709 -0.0318623 0.00352302 1 0 1 1 0 0 +EDGE2 1861 1580 -0.958794 -0.0714379 1.60479 1 0 1 1 0 0 +EDGE2 1861 1660 -1.01394 -0.0954709 1.60415 1 0 1 1 0 0 +EDGE2 1861 1840 -1.07262 0.00438499 -1.55238 1 0 1 1 0 0 +EDGE2 1861 1560 -1.00554 -0.00611692 -1.54451 1 0 1 1 0 0 +EDGE2 1861 1380 -1.09091 -0.013192 1.57172 1 0 1 1 0 0 +EDGE2 1862 1861 -0.960317 0.107115 0.024251 1 0 1 1 0 0 +EDGE2 1862 1663 1.0226 -0.0342615 -0.032342 1 0 1 1 0 0 +EDGE2 1862 1662 -0.0745043 -0.097562 -0.0260048 1 0 1 1 0 0 +EDGE2 1862 1383 0.974705 0.0160442 -0.00175295 1 0 1 1 0 0 +EDGE2 1862 1382 -0.00350574 0.0114831 -0.00495718 1 0 1 1 0 0 +EDGE2 1862 1381 -1.06812 0.0658491 -0.0107244 1 0 1 1 0 0 +EDGE2 1862 1661 -1.00335 0.0685799 0.0134195 1 0 1 1 0 0 +EDGE2 1863 1663 0.00316345 0.0232278 0.0226405 1 0 1 1 0 0 +EDGE2 1863 1384 1.04128 -0.0700233 -0.0163782 1 0 1 1 0 0 +EDGE2 1863 1664 1.04742 -0.0176801 -0.00498765 1 0 1 1 0 0 +EDGE2 1863 1662 -1.11608 -0.0156545 -0.00207484 1 0 1 1 0 0 +EDGE2 1863 1862 -0.973637 -0.00525541 -0.0120268 1 0 1 1 0 0 +EDGE2 1863 1383 0.0133684 0.09154 0.00688986 1 0 1 1 0 0 +EDGE2 1863 1382 -0.936106 0.0816108 -0.0147482 1 0 1 1 0 0 +EDGE2 1864 1665 1.00083 0.0495689 0.0216308 1 0 1 1 0 0 +EDGE2 1864 1705 1.08873 0.034001 -3.1277 1 0 1 1 0 0 +EDGE2 1864 1385 1.02532 0.0334736 -0.0102219 1 0 1 1 0 0 +EDGE2 1864 1465 0.942952 0.028284 -3.14497 1 0 1 1 0 0 +EDGE2 1864 1663 -0.836641 -0.0325496 -0.0205787 1 0 1 1 0 0 +EDGE2 1864 1384 -0.0457942 0.0462903 -0.00623033 1 0 1 1 0 0 +EDGE2 1864 1664 -0.105647 -0.023247 -0.0303848 1 0 1 1 0 0 +EDGE2 1864 1863 -0.977125 0.0609437 0.00353448 1 0 1 1 0 0 +EDGE2 1864 1383 -0.970832 0.0556185 -0.00792572 1 0 1 1 0 0 +EDGE2 1865 1386 -0.0235276 0.990527 1.55156 1 0 1 1 0 0 +EDGE2 1865 1665 0.00113215 -0.0607221 0.0214288 1 0 1 1 0 0 +EDGE2 1865 1464 1.00213 0.0485791 -3.14631 1 0 1 1 0 0 +EDGE2 1865 1704 0.933017 0.0729576 -3.11296 1 0 1 1 0 0 +EDGE2 1865 1705 0.0338518 -0.0154532 -3.16166 1 0 1 1 0 0 +EDGE2 1865 1385 -0.0695257 0.0112903 0.0363455 1 0 1 1 0 0 +EDGE2 1865 1465 -0.0328261 0.0396209 -3.18502 1 0 1 1 0 0 +EDGE2 1865 1666 0.0323956 -1.05374 -1.56075 1 0 1 1 0 0 +EDGE2 1865 1706 -0.00108135 -0.993369 -1.58207 1 0 1 1 0 0 +EDGE2 1865 1466 -0.0600003 -1.00701 -1.56893 1 0 1 1 0 0 +EDGE2 1865 1384 -0.96025 -0.0296025 -0.0197114 1 0 1 1 0 0 +EDGE2 1865 1664 -1.03812 -0.00150767 0.0355842 1 0 1 1 0 0 +EDGE2 1865 1864 -1.04094 -0.0526429 0.0253199 1 0 1 1 0 0 +EDGE2 1866 1665 -0.944201 0.0977973 1.60281 1 0 1 1 0 0 +EDGE2 1866 1865 -0.991235 0.0427716 1.56227 1 0 1 1 0 0 +EDGE2 1866 1705 -1.02653 -0.0185215 -1.58996 1 0 1 1 0 0 +EDGE2 1866 1385 -0.936059 0.00125656 1.5845 1 0 1 1 0 0 +EDGE2 1866 1465 -0.960841 0.0141267 -1.52879 1 0 1 1 0 0 +EDGE2 1866 1666 -0.00766574 -0.0764504 0.0232638 1 0 1 1 0 0 +EDGE2 1866 1706 -0.0179972 0.010009 0.00406508 1 0 1 1 0 0 +EDGE2 1866 1466 -0.129122 0.0840185 -0.00846705 1 0 1 1 0 0 +EDGE2 1866 1667 0.911664 0.0746059 0.00447383 1 0 1 1 0 0 +EDGE2 1866 1707 0.966794 -0.0245127 -0.00749821 1 0 1 1 0 0 +EDGE2 1866 1467 1.00394 -0.0160103 0.00925617 1 0 1 1 0 0 +EDGE2 1867 1468 1.00157 -0.00444715 -0.00782044 1 0 1 1 0 0 +EDGE2 1867 1666 -0.92697 0.00226057 -0.0144243 1 0 1 1 0 0 +EDGE2 1867 1706 -0.986366 0.00637233 0.0234935 1 0 1 1 0 0 +EDGE2 1867 1866 -1.0597 -0.0479154 -0.000756825 1 0 1 1 0 0 +EDGE2 1867 1466 -0.962032 -0.0253453 0.035626 1 0 1 1 0 0 +EDGE2 1867 1667 -0.039706 0.0510128 -0.0592839 1 0 1 1 0 0 +EDGE2 1867 1707 -0.0272126 -0.0389185 -0.000352117 1 0 1 1 0 0 +EDGE2 1867 1467 0.0304237 -0.00446088 0.0228756 1 0 1 1 0 0 +EDGE2 1867 1668 0.918502 -0.0215329 -0.0135156 1 0 1 1 0 0 +EDGE2 1867 1708 1.09309 0.0377381 -0.0145779 1 0 1 1 0 0 +EDGE2 1868 1468 -0.0115121 0.0413869 0.00330109 1 0 1 1 0 0 +EDGE2 1868 1867 -0.911234 0.0269444 -0.0259375 1 0 1 1 0 0 +EDGE2 1868 1667 -1.00069 0.00915725 -0.00582483 1 0 1 1 0 0 +EDGE2 1868 1707 -1.10679 -0.031379 0.0247105 1 0 1 1 0 0 +EDGE2 1868 1467 -0.931467 -0.019578 0.0125217 1 0 1 1 0 0 +EDGE2 1868 1668 0.0141303 -0.0197726 -0.0209058 1 0 1 1 0 0 +EDGE2 1868 1708 -0.0492632 0.0136256 0.017664 1 0 1 1 0 0 +EDGE2 1868 1669 0.990685 0.072112 0.0377727 1 0 1 1 0 0 +EDGE2 1868 1709 1.01696 -0.0309936 -0.0208302 1 0 1 1 0 0 +EDGE2 1868 1469 1.00161 -0.0015395 0.0156968 1 0 1 1 0 0 +EDGE2 1869 1468 -0.957698 -0.0525579 -0.0281741 1 0 1 1 0 0 +EDGE2 1869 1668 -1.00614 0.076522 -0.00972092 1 0 1 1 0 0 +EDGE2 1869 1708 -1.04699 0.0152561 0.0070788 1 0 1 1 0 0 +EDGE2 1869 1868 -0.952055 0.0936132 0.0375035 1 0 1 1 0 0 +EDGE2 1869 1669 -0.0165761 0.0965821 -0.0311711 1 0 1 1 0 0 +EDGE2 1869 1709 -0.0264506 -0.0290805 -0.0180161 1 0 1 1 0 0 +EDGE2 1869 1469 0.028684 0.0406039 0.0145903 1 0 1 1 0 0 +EDGE2 1869 1650 0.948749 -0.120375 -3.10936 1 0 1 1 0 0 +EDGE2 1869 1710 0.975276 -0.0154303 0.0225341 1 0 1 1 0 0 +EDGE2 1869 1670 0.95917 0.00594354 -0.00452563 1 0 1 1 0 0 +EDGE2 1869 1470 0.998445 -0.070051 0.0147008 1 0 1 1 0 0 +EDGE2 1869 1510 1.05035 -0.0454702 -3.16809 1 0 1 1 0 0 +EDGE2 1869 1530 1.03787 0.0183909 -3.13838 1 0 1 1 0 0 +EDGE2 1869 1370 1.03816 0.0477929 -3.16509 1 0 1 1 0 0 +EDGE2 1870 1669 -1.09049 -0.0347881 0.00981755 1 0 1 1 0 0 +EDGE2 1870 1709 -1.01251 0.0429645 -0.0170652 1 0 1 1 0 0 +EDGE2 1870 1869 -1.02507 -0.0423457 0.00728725 1 0 1 1 0 0 +EDGE2 1870 1469 -1.03675 0.0257908 0.00667109 1 0 1 1 0 0 +EDGE2 1870 1671 0.0532973 1.01261 1.58303 1 0 1 1 0 0 +EDGE2 1870 1711 0.0103487 1.0612 1.57483 1 0 1 1 0 0 +EDGE2 1870 1471 0.0167495 0.997188 1.5632 1 0 1 1 0 0 +EDGE2 1870 1650 0.134389 0.00814119 -3.14281 1 0 1 1 0 0 +EDGE2 1870 1710 0.00713784 0.0695956 -0.0154536 1 0 1 1 0 0 +EDGE2 1870 1670 0.0983772 0.0227988 0.0146449 1 0 1 1 0 0 +EDGE2 1870 1470 0.0499556 0.0266077 -0.0141751 1 0 1 1 0 0 +EDGE2 1870 1510 0.0395715 -0.0369922 -3.122 1 0 1 1 0 0 +EDGE2 1870 1530 -0.0885191 -0.0535681 -3.12528 1 0 1 1 0 0 +EDGE2 1870 1370 0.00483162 0.161824 -3.15159 1 0 1 1 0 0 +EDGE2 1870 1371 -0.0650023 -1.0302 -1.51542 1 0 1 1 0 0 +EDGE2 1870 1531 0.0423845 -1.11101 -1.57692 1 0 1 1 0 0 +EDGE2 1870 1651 0.014134 -0.932778 -1.57658 1 0 1 1 0 0 +EDGE2 1870 1511 0.0633869 -0.932949 -1.58173 1 0 1 1 0 0 +EDGE2 1870 1509 0.959755 -0.00972655 -3.17186 1 0 1 1 0 0 +EDGE2 1870 1649 0.941503 0.0156704 -3.13253 1 0 1 1 0 0 +EDGE2 1870 1529 1.04747 0.00550378 -3.10685 1 0 1 1 0 0 +EDGE2 1870 1369 1.07856 0.01796 -3.12286 1 0 1 1 0 0 +EDGE2 1871 1672 1.02156 -0.0566066 -0.00543366 1 0 1 1 0 0 +EDGE2 1871 1712 1.05603 0.0981161 0.0301131 1 0 1 1 0 0 +EDGE2 1871 1472 1.03711 -0.0447046 -0.0045173 1 0 1 1 0 0 +EDGE2 1871 1671 -0.0831891 0.0690795 -0.0276093 1 0 1 1 0 0 +EDGE2 1871 1711 -0.0480038 -0.0472705 0.00582883 1 0 1 1 0 0 +EDGE2 1871 1471 -0.0547439 -0.0391059 0.0245802 1 0 1 1 0 0 +EDGE2 1871 1650 -1.07175 0.0581521 1.60485 1 0 1 1 0 0 +EDGE2 1871 1710 -0.982822 -0.0306757 -1.57719 1 0 1 1 0 0 +EDGE2 1871 1870 -1.07279 0.112251 -1.60754 1 0 1 1 0 0 +EDGE2 1871 1670 -0.909432 0.0309468 -1.54709 1 0 1 1 0 0 +EDGE2 1871 1470 -1.03847 -0.0954324 -1.59948 1 0 1 1 0 0 +EDGE2 1871 1510 -1.00589 -0.0501958 1.59329 1 0 1 1 0 0 +EDGE2 1871 1530 -1.03337 -0.0133385 1.57902 1 0 1 1 0 0 +EDGE2 1871 1370 -0.995726 0.0288622 1.57178 1 0 1 1 0 0 +EDGE2 1872 1473 1.05381 0.0274587 -0.0107446 1 0 1 1 0 0 +EDGE2 1872 1673 0.978033 -0.0109223 -0.00535797 1 0 1 1 0 0 +EDGE2 1872 1713 0.984867 -0.00882377 0.00460359 1 0 1 1 0 0 +EDGE2 1872 1672 -0.0381526 0.0125341 -0.0183247 1 0 1 1 0 0 +EDGE2 1872 1712 0.0607236 0.0772223 0.00412958 1 0 1 1 0 0 +EDGE2 1872 1472 -0.0405882 0.0300488 -0.00215947 1 0 1 1 0 0 +EDGE2 1872 1671 -0.988838 0.0276405 -0.00973415 1 0 1 1 0 0 +EDGE2 1872 1711 -1.01944 -0.000122641 0.0311416 1 0 1 1 0 0 +EDGE2 1872 1871 -0.948505 0.104121 -0.00361087 1 0 1 1 0 0 +EDGE2 1872 1471 -0.853381 -0.0333231 -0.027981 1 0 1 1 0 0 +EDGE2 1873 1474 1.10244 -0.0783347 -0.0056528 1 0 1 1 0 0 +EDGE2 1873 1674 1.0172 0.0434031 0.00958939 1 0 1 1 0 0 +EDGE2 1873 1714 0.930966 -0.0198029 -0.0145831 1 0 1 1 0 0 +EDGE2 1873 1872 -0.950468 -0.0104991 0.00529731 1 0 1 1 0 0 +EDGE2 1873 1473 0.0151591 -0.0424398 -0.00729276 1 0 1 1 0 0 +EDGE2 1873 1673 -0.0586579 0.00238692 -0.0329452 1 0 1 1 0 0 +EDGE2 1873 1713 -0.0196715 0.121287 -0.0237862 1 0 1 1 0 0 +EDGE2 1873 1672 -0.995023 0.00181645 0.0556351 1 0 1 1 0 0 +EDGE2 1873 1712 -0.940937 0.0136242 0.0298446 1 0 1 1 0 0 +EDGE2 1873 1472 -1.00989 -0.0656599 -0.0423247 1 0 1 1 0 0 +EDGE2 1874 1715 0.99866 0.0773303 0.0459534 1 0 1 1 0 0 +EDGE2 1874 1873 -1.03501 -0.00867377 0.0199933 1 0 1 1 0 0 +EDGE2 1874 1475 0.964667 0.0475014 -4.62987e-05 1 0 1 1 0 0 +EDGE2 1874 1675 1.01747 -0.0282103 -0.00525959 1 0 1 1 0 0 +EDGE2 1874 1695 0.990067 -0.0226052 -3.1884 1 0 1 1 0 0 +EDGE2 1874 1474 -0.0661506 0.0671187 -0.00468931 1 0 1 1 0 0 +EDGE2 1874 1674 0.052745 0.0109423 -0.00295708 1 0 1 1 0 0 +EDGE2 1874 1714 -0.0352432 0.0150568 -0.00895816 1 0 1 1 0 0 +EDGE2 1874 1473 -1.03431 -0.0159282 0.00464737 1 0 1 1 0 0 +EDGE2 1874 1673 -0.993851 -0.0753085 -0.0496797 1 0 1 1 0 0 +EDGE2 1874 1713 -1.03801 -0.059425 0.0107744 1 0 1 1 0 0 +EDGE2 1875 1715 0.010791 0.0599869 0.00509533 1 0 1 1 0 0 +EDGE2 1875 1694 0.954523 0.0329341 -3.13686 1 0 1 1 0 0 +EDGE2 1875 1716 0.0299968 1.01707 1.53172 1 0 1 1 0 0 +EDGE2 1875 1696 0.0161272 1.01107 1.56832 1 0 1 1 0 0 +EDGE2 1875 1874 -1.0914 0.0685111 -0.0547278 1 0 1 1 0 0 +EDGE2 1875 1475 0.0926919 0.0241574 -0.00886854 1 0 1 1 0 0 +EDGE2 1875 1675 -0.010917 0.0674368 -0.0071736 1 0 1 1 0 0 +EDGE2 1875 1695 -0.0409373 -0.066094 -3.14065 1 0 1 1 0 0 +EDGE2 1875 1474 -1.0531 -0.0655329 0.0077605 1 0 1 1 0 0 +EDGE2 1875 1674 -1.0722 0.0201561 0.0259097 1 0 1 1 0 0 +EDGE2 1875 1714 -0.995085 -0.0176456 0.0190283 1 0 1 1 0 0 +EDGE2 1875 1676 -0.0550981 -0.981882 -1.56375 1 0 1 1 0 0 +EDGE2 1875 1476 -0.0084526 -1.01394 -1.55854 1 0 1 1 0 0 +EDGE2 1876 1715 -0.965601 -0.0455158 1.54363 1 0 1 1 0 0 +EDGE2 1876 1875 -0.966863 -0.0535332 1.55642 1 0 1 1 0 0 +EDGE2 1876 1475 -1.10331 -0.0587764 1.57769 1 0 1 1 0 0 +EDGE2 1876 1675 -0.957235 0.0319771 1.55186 1 0 1 1 0 0 +EDGE2 1876 1695 -0.97638 0.00613395 -1.56403 1 0 1 1 0 0 +EDGE2 1876 1676 0.00526169 0.0217062 0.00583998 1 0 1 1 0 0 +EDGE2 1876 1476 0.0647258 -0.0254436 -0.0231493 1 0 1 1 0 0 +EDGE2 1876 1677 1.00854 -0.057791 -0.0063746 1 0 1 1 0 0 +EDGE2 1876 1477 1.00635 0.0573916 0.0515605 1 0 1 1 0 0 +EDGE2 1877 1676 -0.960549 -0.013006 -0.0189578 1 0 1 1 0 0 +EDGE2 1877 1876 -0.977749 0.158078 -0.0022528 1 0 1 1 0 0 +EDGE2 1877 1476 -0.998178 0.0307309 0.00421687 1 0 1 1 0 0 +EDGE2 1877 1677 -0.0145258 0.0287662 -0.0262434 1 0 1 1 0 0 +EDGE2 1877 1477 0.0242115 0.0078866 0.00393758 1 0 1 1 0 0 +EDGE2 1877 1678 1.06878 -0.0020559 0.0298236 1 0 1 1 0 0 +EDGE2 1877 1478 0.999434 -0.0181454 0.00560009 1 0 1 1 0 0 +EDGE2 1878 1677 -1.02022 -0.0262144 0.00144612 1 0 1 1 0 0 +EDGE2 1878 1877 -1.02961 0.0330304 0.0262339 1 0 1 1 0 0 +EDGE2 1878 1477 -1.12027 -0.0602932 0.00306279 1 0 1 1 0 0 +EDGE2 1878 1678 0.0342103 0.0998852 -0.0104891 1 0 1 1 0 0 +EDGE2 1878 1478 0.118267 -0.0399514 0.0218695 1 0 1 1 0 0 +EDGE2 1878 1679 0.949868 -0.0213037 0.0477391 1 0 1 1 0 0 +EDGE2 1878 1479 0.966641 -0.072816 0.0298572 1 0 1 1 0 0 +EDGE2 1879 1678 -1.07449 0.0199033 0.0251897 1 0 1 1 0 0 +EDGE2 1879 1878 -1.04524 0.0515023 0.0232411 1 0 1 1 0 0 +EDGE2 1879 1478 -0.975465 -0.0121166 0.00943856 1 0 1 1 0 0 +EDGE2 1879 1360 0.954734 -0.0605826 -3.1276 1 0 1 1 0 0 +EDGE2 1879 1679 -0.0842558 -0.0403958 -0.011988 1 0 1 1 0 0 +EDGE2 1879 1479 0.0748822 0.0999593 0.0306313 1 0 1 1 0 0 +EDGE2 1879 1500 1.10688 0.0179888 -3.12074 1 0 1 1 0 0 +EDGE2 1879 1680 0.979372 -0.0252568 0.0300307 1 0 1 1 0 0 +EDGE2 1879 1480 1.06084 0.0169609 0.0266483 1 0 1 1 0 0 +EDGE2 1879 1340 1.06155 0.101829 -3.14265 1 0 1 1 0 0 +EDGE2 1880 1360 -0.0125226 0.0279514 -3.15903 1 0 1 1 0 0 +EDGE2 1880 1679 -1.03225 -0.111843 -0.00429228 1 0 1 1 0 0 +EDGE2 1880 1879 -1.05477 0.0423433 -0.00504578 1 0 1 1 0 0 +EDGE2 1880 1479 -1.00902 -0.0618212 0.0327488 1 0 1 1 0 0 +EDGE2 1880 1681 0.0153582 0.980427 1.55824 1 0 1 1 0 0 +EDGE2 1880 1500 0.0181105 -0.057043 -3.12566 1 0 1 1 0 0 +EDGE2 1880 1680 -0.117435 0.0164904 -0.011976 1 0 1 1 0 0 +EDGE2 1880 1480 -0.0608975 0.0114584 -0.0254099 1 0 1 1 0 0 +EDGE2 1880 1481 0.0188844 -0.940271 -1.57804 1 0 1 1 0 0 +EDGE2 1880 1340 0.0359639 -0.0979209 -3.14185 1 0 1 1 0 0 +EDGE2 1880 1501 -0.0627002 -1.03378 -1.58043 1 0 1 1 0 0 +EDGE2 1880 1341 -0.00110855 -1.02948 -1.57222 1 0 1 1 0 0 +EDGE2 1880 1361 -0.0275901 -0.994456 -1.54012 1 0 1 1 0 0 +EDGE2 1880 1359 1.11294 -0.0712245 -3.12971 1 0 1 1 0 0 +EDGE2 1880 1499 1.05062 -0.0956269 -3.15288 1 0 1 1 0 0 +EDGE2 1880 1339 1.01723 -0.021193 -3.16158 1 0 1 1 0 0 +EDGE2 1881 1360 -1.00732 -0.0282216 1.578 1 0 1 1 0 0 +EDGE2 1881 1681 0.0166386 0.0979139 -0.00993231 1 0 1 1 0 0 +EDGE2 1881 1682 0.948685 0.0833979 -0.0152665 1 0 1 1 0 0 +EDGE2 1881 1880 -0.9177 -0.00373364 -1.54682 1 0 1 1 0 0 +EDGE2 1881 1500 -1.05822 0.0576166 1.53312 1 0 1 1 0 0 +EDGE2 1881 1680 -0.989456 -0.00578804 -1.60825 1 0 1 1 0 0 +EDGE2 1881 1480 -0.95734 -0.0196621 -1.57474 1 0 1 1 0 0 +EDGE2 1881 1340 -0.989292 0.0141358 1.56483 1 0 1 1 0 0 +EDGE2 1882 1681 -1.00796 -0.0193165 -0.0435438 1 0 1 1 0 0 +EDGE2 1882 1682 0.055367 0.0359405 -0.00141953 1 0 1 1 0 0 +EDGE2 1882 1683 0.989582 0.0296149 0.0208108 1 0 1 1 0 0 +EDGE2 1882 1881 -0.968428 0.0302511 0.00371931 1 0 1 1 0 0 +EDGE2 1883 1684 0.927021 -0.0832617 -0.00884942 1 0 1 1 0 0 +EDGE2 1883 1682 -0.937216 0.0151095 0.00763666 1 0 1 1 0 0 +EDGE2 1883 1882 -1.01848 -0.0636796 0.00560133 1 0 1 1 0 0 +EDGE2 1883 1683 -0.0587378 -0.0227073 0.0232806 1 0 1 1 0 0 +EDGE2 1884 1883 -0.962154 -0.0246764 0.0165284 1 0 1 1 0 0 +EDGE2 1884 1685 1.01773 -0.0105938 -0.0272677 1 0 1 1 0 0 +EDGE2 1884 1684 0.0681752 -0.0881443 0.00452822 1 0 1 1 0 0 +EDGE2 1884 1683 -1.00934 0.035925 0.0044444 1 0 1 1 0 0 +EDGE2 1885 1686 0.14707 1.05494 1.5724 1 0 1 1 0 0 +EDGE2 1885 1884 -1.01421 0.0267397 -0.0580377 1 0 1 1 0 0 +EDGE2 1885 1685 -0.121632 0.0140824 0.0168212 1 0 1 1 0 0 +EDGE2 1885 1684 -1.04493 -0.0307151 0.0386042 1 0 1 1 0 0 +EDGE2 1886 1687 0.959425 0.0530225 0.00500863 1 0 1 1 0 0 +EDGE2 1886 1686 0.0416782 -0.0705308 0.000144036 1 0 1 1 0 0 +EDGE2 1886 1685 -1.07045 5.50722e-05 -1.5657 1 0 1 1 0 0 +EDGE2 1886 1885 -1.06884 0.0118612 -1.58505 1 0 1 1 0 0 +EDGE2 1887 1688 1.06926 -0.073562 0.0161615 1 0 1 1 0 0 +EDGE2 1887 1687 0.0399724 0.0346274 -0.0142831 1 0 1 1 0 0 +EDGE2 1887 1686 -0.983688 -0.0272461 -0.00875671 1 0 1 1 0 0 +EDGE2 1887 1886 -1.04097 0.0250703 0.00820986 1 0 1 1 0 0 +EDGE2 1888 1689 0.975624 -0.0181868 -0.0136266 1 0 1 1 0 0 +EDGE2 1888 1688 -0.0077997 0.0477161 0.0540398 1 0 1 1 0 0 +EDGE2 1888 1687 -0.991542 -0.00650793 0.0142517 1 0 1 1 0 0 +EDGE2 1888 1887 -1.04204 0.0632118 -0.00303115 1 0 1 1 0 0 +EDGE2 1889 1690 0.997046 -0.037586 -0.0282705 1 0 1 1 0 0 +EDGE2 1889 1689 -0.000986756 0.0514422 0.000680807 1 0 1 1 0 0 +EDGE2 1889 1688 -1.03482 -0.0158123 0.00141571 1 0 1 1 0 0 +EDGE2 1889 1888 -1.0182 -0.0249554 0.0119227 1 0 1 1 0 0 +EDGE2 1890 1690 -0.0741305 0.00165429 0.0111416 1 0 1 1 0 0 +EDGE2 1890 1691 -0.0340834 0.980899 1.58929 1 0 1 1 0 0 +EDGE2 1890 1689 -1.02217 0.043226 -0.00525138 1 0 1 1 0 0 +EDGE2 1890 1889 -0.925519 -0.0125762 -0.0271348 1 0 1 1 0 0 +EDGE2 1891 1690 -1.04811 -0.00401163 -1.56774 1 0 1 1 0 0 +EDGE2 1891 1890 -0.986505 -0.0802796 -1.55616 1 0 1 1 0 0 +EDGE2 1891 1691 -0.0140025 -0.0182732 0.0123785 1 0 1 1 0 0 +EDGE2 1891 1692 1.04347 0.0436296 0.01015 1 0 1 1 0 0 +EDGE2 1892 1891 -1.00371 -0.0360549 0.0274439 1 0 1 1 0 0 +EDGE2 1892 1691 -1.03211 -0.0338071 0.0107949 1 0 1 1 0 0 +EDGE2 1892 1693 1.00493 0.0187777 -0.00110607 1 0 1 1 0 0 +EDGE2 1892 1692 0.075415 -0.0423887 -0.0155371 1 0 1 1 0 0 +EDGE2 1893 1694 0.95791 0.0826797 -0.00539482 1 0 1 1 0 0 +EDGE2 1893 1892 -1.01645 0.0479573 -0.0237346 1 0 1 1 0 0 +EDGE2 1893 1693 -0.0436825 0.078083 0.0193031 1 0 1 1 0 0 +EDGE2 1893 1692 -1.00642 -0.0653748 0.0156154 1 0 1 1 0 0 +EDGE2 1894 1715 0.989811 0.118064 -3.14279 1 0 1 1 0 0 +EDGE2 1894 1694 0.049629 -0.0359979 -0.00195851 1 0 1 1 0 0 +EDGE2 1894 1693 -0.988163 -0.0258442 -0.0278471 1 0 1 1 0 0 +EDGE2 1894 1893 -0.929848 -0.13658 0.00146095 1 0 1 1 0 0 +EDGE2 1894 1875 0.926246 0.0489152 -3.13869 1 0 1 1 0 0 +EDGE2 1894 1475 0.944145 0.0160933 -3.15698 1 0 1 1 0 0 +EDGE2 1894 1675 1.02525 -0.0495538 -3.15008 1 0 1 1 0 0 +EDGE2 1894 1695 0.979937 0.0104064 -0.028675 1 0 1 1 0 0 +EDGE2 1895 1715 0.0251303 0.00967679 -3.15022 1 0 1 1 0 0 +EDGE2 1895 1694 -0.936929 0.0246543 0.0509861 1 0 1 1 0 0 +EDGE2 1895 1894 -0.97373 -0.0128923 0.00335984 1 0 1 1 0 0 +EDGE2 1895 1716 0.0184164 -1.03276 -1.54685 1 0 1 1 0 0 +EDGE2 1895 1696 -0.00555911 -1.00749 -1.55582 1 0 1 1 0 0 +EDGE2 1895 1875 0.0336354 0.0713931 -3.13093 1 0 1 1 0 0 +EDGE2 1895 1874 0.910821 -0.0282599 -3.14765 1 0 1 1 0 0 +EDGE2 1895 1475 0.0133759 0.0788267 -3.13036 1 0 1 1 0 0 +EDGE2 1895 1675 0.011247 -0.0445166 -3.15141 1 0 1 1 0 0 +EDGE2 1895 1695 -0.00784897 -0.0517794 -0.0112943 1 0 1 1 0 0 +EDGE2 1895 1474 1.02722 0.0499115 -3.13948 1 0 1 1 0 0 +EDGE2 1895 1674 1.03101 0.0302889 -3.1509 1 0 1 1 0 0 +EDGE2 1895 1714 0.904772 0.0388476 -3.11754 1 0 1 1 0 0 +EDGE2 1895 1676 -0.0268394 1.02962 1.59904 1 0 1 1 0 0 +EDGE2 1895 1876 -0.0146616 1.08293 1.56577 1 0 1 1 0 0 +EDGE2 1895 1476 0.00826501 1.02383 1.56349 1 0 1 1 0 0 +EDGE2 1896 1715 -0.950775 -0.00433382 1.60027 1 0 1 1 0 0 +EDGE2 1896 1895 -1.03085 0.0345103 -1.56886 1 0 1 1 0 0 +EDGE2 1896 1875 -0.985925 0.0218156 1.59004 1 0 1 1 0 0 +EDGE2 1896 1475 -0.991169 0.0384924 1.58441 1 0 1 1 0 0 +EDGE2 1896 1675 -0.936655 0.0415276 1.53468 1 0 1 1 0 0 +EDGE2 1896 1695 -1.05712 -0.061534 -1.53247 1 0 1 1 0 0 +EDGE2 1896 1676 0.0733897 0.0117915 -0.017789 1 0 1 1 0 0 +EDGE2 1896 1876 0.0652043 -0.0239889 -0.0140644 1 0 1 1 0 0 +EDGE2 1896 1476 0.0539797 0.0485251 -0.000666986 1 0 1 1 0 0 +EDGE2 1896 1677 0.959772 -0.07191 -0.000481865 1 0 1 1 0 0 +EDGE2 1896 1877 0.989488 -0.0454059 0.0194648 1 0 1 1 0 0 +EDGE2 1896 1477 1.05149 -0.0321547 0.00272736 1 0 1 1 0 0 +EDGE2 1897 1676 -1.00851 -0.0541347 -0.026484 1 0 1 1 0 0 +EDGE2 1897 1876 -1.02396 -0.0329572 0.0260452 1 0 1 1 0 0 +EDGE2 1897 1896 -0.962634 -0.00603303 0.000405932 1 0 1 1 0 0 +EDGE2 1897 1476 -1.00802 -0.0546639 -0.02716 1 0 1 1 0 0 +EDGE2 1897 1677 0.0208319 0.0770924 0.00687542 1 0 1 1 0 0 +EDGE2 1897 1877 0.0195329 0.0587986 -0.0268994 1 0 1 1 0 0 +EDGE2 1897 1477 0.101331 -0.029171 -0.000147888 1 0 1 1 0 0 +EDGE2 1897 1678 0.992287 -0.0218699 -0.0122087 1 0 1 1 0 0 +EDGE2 1897 1878 1.00981 -0.057737 -0.00145811 1 0 1 1 0 0 +EDGE2 1897 1478 0.897134 -0.0552361 0.0143031 1 0 1 1 0 0 +EDGE2 1898 1677 -0.959838 0.0194479 -0.0149605 1 0 1 1 0 0 +EDGE2 1898 1877 -0.948119 0.0480274 -0.00643821 1 0 1 1 0 0 +EDGE2 1898 1897 -0.960179 0.0903966 0.0230294 1 0 1 1 0 0 +EDGE2 1898 1477 -0.928817 0.0135641 -0.00456533 1 0 1 1 0 0 +EDGE2 1898 1678 -0.067321 0.0912718 0.030956 1 0 1 1 0 0 +EDGE2 1898 1878 -2.71094e-05 0.0486798 0.0141511 1 0 1 1 0 0 +EDGE2 1898 1478 0.0272221 -0.0890261 0.00458896 1 0 1 1 0 0 +EDGE2 1898 1679 0.928115 -0.0699871 -0.0458507 1 0 1 1 0 0 +EDGE2 1898 1879 1.01343 0.00733051 -0.0428463 1 0 1 1 0 0 +EDGE2 1898 1479 0.985353 0.0145294 -0.00834303 1 0 1 1 0 0 +EDGE2 1899 1678 -0.951151 0.0189413 0.00187891 1 0 1 1 0 0 +EDGE2 1899 1878 -1.00819 -0.0108395 -0.00048171 1 0 1 1 0 0 +EDGE2 1899 1898 -0.9867 -0.0561423 -0.0119351 1 0 1 1 0 0 +EDGE2 1899 1478 -1.04438 0.0797328 -0.0288927 1 0 1 1 0 0 +EDGE2 1899 1360 0.913515 0.0016177 -3.13114 1 0 1 1 0 0 +EDGE2 1899 1679 -0.0288531 -0.0241599 0.0162991 1 0 1 1 0 0 +EDGE2 1899 1879 -0.119664 0.0527786 0.0264284 1 0 1 1 0 0 +EDGE2 1899 1479 -0.0691726 -0.0792941 -0.00121704 1 0 1 1 0 0 +EDGE2 1899 1880 1.0501 -0.0120866 -0.000994483 1 0 1 1 0 0 +EDGE2 1899 1500 0.990793 -0.0179662 -3.10301 1 0 1 1 0 0 +EDGE2 1899 1680 0.961937 0.0976311 -0.0234612 1 0 1 1 0 0 +EDGE2 1899 1480 1.0441 0.0499696 0.00859077 1 0 1 1 0 0 +EDGE2 1899 1340 1.00036 -0.0136038 -3.1228 1 0 1 1 0 0 +EDGE2 1900 1360 0.0450834 -0.0210247 -3.11074 1 0 1 1 0 0 +EDGE2 1900 1679 -1.03806 -0.0278741 -0.0247182 1 0 1 1 0 0 +EDGE2 1900 1879 -1.00316 0.0230734 0.0328218 1 0 1 1 0 0 +EDGE2 1900 1899 -0.999046 0.049923 -0.0159153 1 0 1 1 0 0 +EDGE2 1900 1479 -1.09179 -0.0680921 0.0250442 1 0 1 1 0 0 +EDGE2 1900 1681 -0.00109868 0.91809 1.56426 1 0 1 1 0 0 +EDGE2 1900 1881 0.0392943 0.998165 1.56536 1 0 1 1 0 0 +EDGE2 1900 1880 0.0448499 0.0175378 -0.0186165 1 0 1 1 0 0 +EDGE2 1900 1500 -0.00323031 -0.144646 -3.14951 1 0 1 1 0 0 +EDGE2 1900 1680 -0.0136024 0.0377204 0.0194533 1 0 1 1 0 0 +EDGE2 1900 1480 -0.010213 -0.0681116 0.00422122 1 0 1 1 0 0 +EDGE2 1900 1481 -0.0590108 -0.983565 -1.56026 1 0 1 1 0 0 +EDGE2 1900 1340 -0.0631401 -0.00239222 -3.15941 1 0 1 1 0 0 +EDGE2 1900 1501 -0.0175421 -1.00432 -1.5756 1 0 1 1 0 0 +EDGE2 1900 1341 -0.0513126 -0.947812 -1.56244 1 0 1 1 0 0 +EDGE2 1900 1361 -0.0623401 -0.971206 -1.55722 1 0 1 1 0 0 +EDGE2 1900 1359 0.926392 0.0320424 -3.15011 1 0 1 1 0 0 +EDGE2 1900 1499 1.1512 -0.0682526 -3.15104 1 0 1 1 0 0 +EDGE2 1900 1339 0.93489 -0.000215138 -3.13707 1 0 1 1 0 0 +EDGE2 1901 1360 -0.967146 0.0598749 -1.55971 1 0 1 1 0 0 +EDGE2 1901 1880 -1.06546 0.0709813 1.57048 1 0 1 1 0 0 +EDGE2 1901 1900 -1.03896 -0.0293679 1.55397 1 0 1 1 0 0 +EDGE2 1901 1500 -1.00161 0.0299262 -1.53385 1 0 1 1 0 0 +EDGE2 1901 1680 -1.00267 0.0122414 1.54652 1 0 1 1 0 0 +EDGE2 1901 1480 -0.957425 0.0512065 1.56464 1 0 1 1 0 0 +EDGE2 1901 1502 1.02112 0.0510559 0.00097945 1 0 1 1 0 0 +EDGE2 1901 1481 -0.00887439 0.0373893 -0.00560167 1 0 1 1 0 0 +EDGE2 1901 1340 -1.04897 0.0628111 -1.51518 1 0 1 1 0 0 +EDGE2 1901 1501 -0.038652 -0.0854515 0.011932 1 0 1 1 0 0 +EDGE2 1901 1341 -0.0664002 0.0162535 -0.0039314 1 0 1 1 0 0 +EDGE2 1901 1361 0.00973935 0.0662465 -0.0250122 1 0 1 1 0 0 +EDGE2 1901 1342 0.999744 0.110194 0.0135088 1 0 1 1 0 0 +EDGE2 1901 1362 0.977679 0.0417809 0.0248169 1 0 1 1 0 0 +EDGE2 1901 1482 0.961518 -0.0118749 0.00579325 1 0 1 1 0 0 +EDGE2 1902 1502 -0.0066355 -0.000246315 0.015696 1 0 1 1 0 0 +EDGE2 1902 1481 -1.00795 0.0127635 -0.0098817 1 0 1 1 0 0 +EDGE2 1902 1901 -1.00911 0.0583746 -0.0108131 1 0 1 1 0 0 +EDGE2 1902 1501 -0.929995 0.0230291 -0.0202166 1 0 1 1 0 0 +EDGE2 1902 1341 -1.0277 -0.00122539 -0.0289202 1 0 1 1 0 0 +EDGE2 1902 1361 -1.04881 0.00690023 -0.00628218 1 0 1 1 0 0 +EDGE2 1902 1342 0.0557239 -0.00662694 -0.00859158 1 0 1 1 0 0 +EDGE2 1902 1362 0.00344901 -0.0308585 -0.0117801 1 0 1 1 0 0 +EDGE2 1902 1482 -0.101887 0.0307895 0.0317266 1 0 1 1 0 0 +EDGE2 1902 1363 1.05399 -0.0834402 -0.0114662 1 0 1 1 0 0 +EDGE2 1902 1483 1.05349 -0.0556215 0.0249988 1 0 1 1 0 0 +EDGE2 1902 1503 0.960028 -0.00812087 -0.0146683 1 0 1 1 0 0 +EDGE2 1902 1343 1.04651 0.0510764 0.00880554 1 0 1 1 0 0 +EDGE2 1903 1502 -1.07382 -0.118708 0.00658131 1 0 1 1 0 0 +EDGE2 1903 1902 -0.989284 0.00416819 0.00889366 1 0 1 1 0 0 +EDGE2 1903 1342 -1.10234 0.0614746 -0.0283962 1 0 1 1 0 0 +EDGE2 1903 1362 -1.02367 0.010151 -0.0154745 1 0 1 1 0 0 +EDGE2 1903 1482 -0.989223 0.0263308 0.0468187 1 0 1 1 0 0 +EDGE2 1903 1363 -0.0642568 0.0236993 -0.0286546 1 0 1 1 0 0 +EDGE2 1903 1483 -0.0423828 -0.0437762 -0.00287937 1 0 1 1 0 0 +EDGE2 1903 1503 -0.000946849 0.0510719 -0.00884651 1 0 1 1 0 0 +EDGE2 1903 1343 0.0183524 0.0465669 0.0209383 1 0 1 1 0 0 +EDGE2 1903 1344 1.04736 0.0261118 -0.0263076 1 0 1 1 0 0 +EDGE2 1903 1484 0.995822 0.0753266 -0.00175736 1 0 1 1 0 0 +EDGE2 1903 1504 0.974177 -0.0571182 -0.0382808 1 0 1 1 0 0 +EDGE2 1903 1364 1.02266 0.0153154 -0.00132957 1 0 1 1 0 0 +EDGE2 1904 1345 1.01816 0.0190473 -0.0302167 1 0 1 1 0 0 +EDGE2 1904 1903 -1.03247 0.0214679 -0.00518993 1 0 1 1 0 0 +EDGE2 1904 1363 -1.00417 -0.0998988 0.0159507 1 0 1 1 0 0 +EDGE2 1904 1483 -1.03755 0.00322782 0.0154376 1 0 1 1 0 0 +EDGE2 1904 1503 -1.0482 -0.00624673 -0.000305412 1 0 1 1 0 0 +EDGE2 1904 1343 -1.01392 -0.05151 0.0417982 1 0 1 1 0 0 +EDGE2 1904 1344 -0.0669076 -0.021675 0.00111373 1 0 1 1 0 0 +EDGE2 1904 1484 0.0158149 0.0124011 0.00815616 1 0 1 1 0 0 +EDGE2 1904 1504 0.0496327 0.0210003 0.015192 1 0 1 1 0 0 +EDGE2 1904 1364 -0.0620187 -0.04493 0.0455277 1 0 1 1 0 0 +EDGE2 1904 1525 0.983455 -0.0368919 -3.11242 1 0 1 1 0 0 +EDGE2 1904 1645 1.0702 0.0486564 -3.14239 1 0 1 1 0 0 +EDGE2 1904 1485 1.00538 -0.128851 0.0134726 1 0 1 1 0 0 +EDGE2 1904 1505 0.91638 0.03024 -0.00890098 1 0 1 1 0 0 +EDGE2 1904 1365 1.01143 -0.0651241 -0.0140051 1 0 1 1 0 0 +EDGE2 1904 1325 1.04858 -0.053296 -3.16386 1 0 1 1 0 0 +EDGE2 1905 1345 -0.0435084 0.0160142 -0.0215533 1 0 1 1 0 0 +EDGE2 1905 1526 -0.00157542 -0.994755 -1.5661 1 0 1 1 0 0 +EDGE2 1905 1646 0.0401044 -0.982157 -1.57741 1 0 1 1 0 0 +EDGE2 1905 1366 0.0552336 -1.06807 -1.55884 1 0 1 1 0 0 +EDGE2 1905 1506 0.0212679 -0.957962 -1.59934 1 0 1 1 0 0 +EDGE2 1905 1344 -1.05452 0.0489708 -0.00242335 1 0 1 1 0 0 +EDGE2 1905 1484 -0.995521 0.00190796 -0.0106514 1 0 1 1 0 0 +EDGE2 1905 1504 -0.99922 0.0447849 -0.0238246 1 0 1 1 0 0 +EDGE2 1905 1904 -1.00582 -0.0542721 0.000163418 1 0 1 1 0 0 +EDGE2 1905 1364 -0.969034 -0.0718099 -0.0143159 1 0 1 1 0 0 +EDGE2 1905 1525 -0.0394263 0.035819 -3.13546 1 0 1 1 0 0 +EDGE2 1905 1645 -0.0529968 0.0117916 -3.13658 1 0 1 1 0 0 +EDGE2 1905 1485 0.0595015 -0.0058011 0.0299875 1 0 1 1 0 0 +EDGE2 1905 1505 -0.00479177 0.00478304 -0.00388123 1 0 1 1 0 0 +EDGE2 1905 1365 -0.105944 -0.0468497 0.0270065 1 0 1 1 0 0 +EDGE2 1905 1325 -0.0367647 0.0198009 -3.17141 1 0 1 1 0 0 +EDGE2 1905 1524 1.00468 0.0471853 -3.15604 1 0 1 1 0 0 +EDGE2 1905 1644 1.07906 0.0197685 -3.11669 1 0 1 1 0 0 +EDGE2 1905 1324 1.01083 0.0546488 -3.1368 1 0 1 1 0 0 +EDGE2 1905 1486 -0.0216567 1.02142 1.53491 1 0 1 1 0 0 +EDGE2 1905 1326 0.0346338 1.01126 1.56606 1 0 1 1 0 0 +EDGE2 1905 1346 0.0433574 1.10062 1.59456 1 0 1 1 0 0 +EDGE2 1906 1345 -0.907764 -0.00928414 -1.58002 1 0 1 1 0 0 +EDGE2 1906 1525 -0.981652 4.01711e-05 1.55312 1 0 1 1 0 0 +EDGE2 1906 1905 -1.01433 0.0317521 -1.58081 1 0 1 1 0 0 +EDGE2 1906 1645 -0.890409 -0.0569844 1.57312 1 0 1 1 0 0 +EDGE2 1906 1485 -0.948231 0.0293 -1.56081 1 0 1 1 0 0 +EDGE2 1906 1505 -1.07022 -0.0178963 -1.5412 1 0 1 1 0 0 +EDGE2 1906 1365 -0.993842 0.126621 -1.57457 1 0 1 1 0 0 +EDGE2 1906 1325 -0.9917 0.0168113 1.56836 1 0 1 1 0 0 +EDGE2 1906 1327 0.977446 -0.00184213 -0.0130059 1 0 1 1 0 0 +EDGE2 1906 1486 -0.000687588 0.0216665 0.0105288 1 0 1 1 0 0 +EDGE2 1906 1326 -0.00226587 0.0330126 0.0281029 1 0 1 1 0 0 +EDGE2 1906 1346 0.0258922 -0.0234399 0.005047 1 0 1 1 0 0 +EDGE2 1906 1487 1.06574 -0.00480421 -0.0083914 1 0 1 1 0 0 +EDGE2 1906 1347 0.961514 -0.011219 -0.00870564 1 0 1 1 0 0 +EDGE2 1907 1327 0.0371637 -0.0585024 -0.00151287 1 0 1 1 0 0 +EDGE2 1907 1486 -0.982735 0.0157164 -0.0061832 1 0 1 1 0 0 +EDGE2 1907 1906 -0.95283 -0.0213273 -0.00911058 1 0 1 1 0 0 +EDGE2 1907 1326 -1.03115 0.0554891 0.0160261 1 0 1 1 0 0 +EDGE2 1907 1346 -0.999942 -0.051279 -0.0236375 1 0 1 1 0 0 +EDGE2 1907 1487 0.0161606 -0.0782003 -0.0406353 1 0 1 1 0 0 +EDGE2 1907 1347 0.0205633 -0.00807319 -0.0339019 1 0 1 1 0 0 +EDGE2 1907 1348 0.991724 0.0490854 -0.00110807 1 0 1 1 0 0 +EDGE2 1907 1488 0.999021 -0.107186 -0.037307 1 0 1 1 0 0 +EDGE2 1907 1328 1.04008 0.0186324 -0.029547 1 0 1 1 0 0 +EDGE2 1908 1327 -1.01519 -0.0270352 0.00031972 1 0 1 1 0 0 +EDGE2 1908 1487 -1.09108 -0.00925165 -0.00791325 1 0 1 1 0 0 +EDGE2 1908 1907 -1.03859 -0.0931354 0.0337715 1 0 1 1 0 0 +EDGE2 1908 1347 -0.993331 0.0251804 -0.0120795 1 0 1 1 0 0 +EDGE2 1908 1348 -0.0214777 0.0999227 0.00430978 1 0 1 1 0 0 +EDGE2 1908 1488 -0.0740363 -0.0344282 0.0131218 1 0 1 1 0 0 +EDGE2 1908 1328 -0.013644 0.00381439 -0.00387109 1 0 1 1 0 0 +EDGE2 1908 1349 1.07476 -0.0895183 -0.00606147 1 0 1 1 0 0 +EDGE2 1908 1489 0.983781 -0.0657923 -0.0229843 1 0 1 1 0 0 +EDGE2 1908 1329 0.982098 -0.0613466 -0.0106129 1 0 1 1 0 0 +EDGE2 1909 1348 -1.00143 -0.0149413 -0.00510488 1 0 1 1 0 0 +EDGE2 1909 1908 -0.97994 0.0490155 0.0287251 1 0 1 1 0 0 +EDGE2 1909 1488 -1.01079 0.000774653 0.00699173 1 0 1 1 0 0 +EDGE2 1909 1328 -0.943937 0.0165072 -0.0206067 1 0 1 1 0 0 +EDGE2 1909 1349 -0.0640357 0.0289163 0.0131585 1 0 1 1 0 0 +EDGE2 1909 1489 -0.0723411 -0.00781387 -0.0202516 1 0 1 1 0 0 +EDGE2 1909 1329 -0.01846 0.0452349 0.0171447 1 0 1 1 0 0 +EDGE2 1909 1330 0.959768 0.0460434 0.0356619 1 0 1 1 0 0 +EDGE2 1909 1350 1.03144 0.0721021 -0.0136056 1 0 1 1 0 0 +EDGE2 1909 1490 1.04833 0.084968 0.00376496 1 0 1 1 0 0 +EDGE2 1910 1349 -0.945823 -0.0201547 -0.0173787 1 0 1 1 0 0 +EDGE2 1910 1489 -0.918313 0.0319601 0.0267407 1 0 1 1 0 0 +EDGE2 1910 1909 -0.93315 0.0246033 -0.0230003 1 0 1 1 0 0 +EDGE2 1910 1329 -1.07971 0.014625 0.00789946 1 0 1 1 0 0 +EDGE2 1910 1331 0.0566765 1.04697 1.56181 1 0 1 1 0 0 +EDGE2 1910 1351 -0.0516781 0.976657 1.56076 1 0 1 1 0 0 +EDGE2 1910 1491 -0.00871628 0.983276 1.56268 1 0 1 1 0 0 +EDGE2 1910 1330 -0.0726417 -0.0478235 0.0208833 1 0 1 1 0 0 +EDGE2 1910 1350 -0.00736148 0.013896 -0.0171273 1 0 1 1 0 0 +EDGE2 1910 1490 0.0774294 -0.0294022 0.0199397 1 0 1 1 0 0 +EDGE2 1911 1910 -1.06714 0.127387 -1.56633 1 0 1 1 0 0 +EDGE2 1911 1352 0.977803 0.118028 -0.0335632 1 0 1 1 0 0 +EDGE2 1911 1492 0.977149 -0.0557515 0.00739755 1 0 1 1 0 0 +EDGE2 1911 1332 1.0288 -0.0725984 0.0216403 1 0 1 1 0 0 +EDGE2 1911 1331 0.0907532 -0.0297051 0.012502 1 0 1 1 0 0 +EDGE2 1911 1351 0.0955422 0.00816488 -0.0159552 1 0 1 1 0 0 +EDGE2 1911 1491 -0.00657895 0.0129876 -0.0158686 1 0 1 1 0 0 +EDGE2 1911 1330 -0.998533 -0.0508329 -1.56372 1 0 1 1 0 0 +EDGE2 1911 1350 -1.12363 0.0317721 -1.54871 1 0 1 1 0 0 +EDGE2 1911 1490 -0.956459 -0.0951994 -1.59212 1 0 1 1 0 0 +EDGE2 1912 1333 0.931832 -0.0733181 0.0173498 1 0 1 1 0 0 +EDGE2 1912 1493 0.985765 -0.0969316 -0.0229455 1 0 1 1 0 0 +EDGE2 1912 1353 0.994051 -0.0598935 -0.0293146 1 0 1 1 0 0 +EDGE2 1912 1911 -0.991928 0.0341474 0.0227417 1 0 1 1 0 0 +EDGE2 1912 1352 -0.00565234 0.00494957 0.00650486 1 0 1 1 0 0 +EDGE2 1912 1492 0.0442078 -0.0174505 0.0198357 1 0 1 1 0 0 +EDGE2 1912 1332 -0.0245676 0.0203844 -0.0358877 1 0 1 1 0 0 +EDGE2 1912 1331 -1.02917 0.0124311 0.011921 1 0 1 1 0 0 +EDGE2 1912 1351 -0.964883 0.0176451 0.0153456 1 0 1 1 0 0 +EDGE2 1912 1491 -1.05899 -0.0226629 0.0281741 1 0 1 1 0 0 +EDGE2 1913 1333 0.0606389 -0.0543289 0.0295142 1 0 1 1 0 0 +EDGE2 1913 1493 -0.00335043 0.0208121 -0.0189162 1 0 1 1 0 0 +EDGE2 1913 1334 0.950806 -0.0390399 -0.0111364 1 0 1 1 0 0 +EDGE2 1913 1354 0.964897 -0.142315 0.0347054 1 0 1 1 0 0 +EDGE2 1913 1494 0.952245 0.00893093 -0.0192538 1 0 1 1 0 0 +EDGE2 1913 1353 0.042571 0.0429979 -0.0224693 1 0 1 1 0 0 +EDGE2 1913 1352 -0.983761 -0.00722892 -0.0121016 1 0 1 1 0 0 +EDGE2 1913 1492 -0.955963 -0.00936076 0.0118616 1 0 1 1 0 0 +EDGE2 1913 1912 -0.998558 0.0829994 0.000596553 1 0 1 1 0 0 +EDGE2 1913 1332 -0.994568 0.034176 -0.0209693 1 0 1 1 0 0 +EDGE2 1914 1333 -0.976021 -0.0599487 -0.000601515 1 0 1 1 0 0 +EDGE2 1914 1493 -0.997079 0.0342887 0.0044761 1 0 1 1 0 0 +EDGE2 1914 1355 1.0215 0.0772865 0.00958523 1 0 1 1 0 0 +EDGE2 1914 1495 0.971736 -0.0329029 0.0125134 1 0 1 1 0 0 +EDGE2 1914 1335 0.948625 0.0404333 -0.00988333 1 0 1 1 0 0 +EDGE2 1914 1334 -0.0712501 -0.0889091 -0.00883667 1 0 1 1 0 0 +EDGE2 1914 1354 -0.0414203 -0.0763997 -0.0483378 1 0 1 1 0 0 +EDGE2 1914 1494 -0.0486474 0.0491279 -0.0224326 1 0 1 1 0 0 +EDGE2 1914 1913 -1.00975 -0.0708526 -3.01417e-05 1 0 1 1 0 0 +EDGE2 1914 1353 -0.976782 0.0138048 -0.022334 1 0 1 1 0 0 +EDGE2 1915 1336 0.0577545 1.01108 1.57716 1 0 1 1 0 0 +EDGE2 1915 1496 0.045109 1.00492 1.54997 1 0 1 1 0 0 +EDGE2 1915 1356 0.061588 1.0194 1.57461 1 0 1 1 0 0 +EDGE2 1915 1914 -1.02785 -0.0860362 0.0120333 1 0 1 1 0 0 +EDGE2 1915 1355 -0.0424053 0.0132799 -0.00657399 1 0 1 1 0 0 +EDGE2 1915 1495 -0.0309377 -0.049331 0.00168956 1 0 1 1 0 0 +EDGE2 1915 1335 0.030773 0.0578116 -0.00651656 1 0 1 1 0 0 +EDGE2 1915 1334 -0.984301 0.0940648 -0.0168163 1 0 1 1 0 0 +EDGE2 1915 1354 -1.08349 0.0458102 0.0253183 1 0 1 1 0 0 +EDGE2 1915 1494 -1.0254 -0.0591656 -0.04361 1 0 1 1 0 0 +EDGE2 1916 1336 -0.0437854 -0.043152 0.000783226 1 0 1 1 0 0 +EDGE2 1916 1357 0.968522 0.0138541 -0.0117507 1 0 1 1 0 0 +EDGE2 1916 1497 0.979404 0.0571398 -0.000254501 1 0 1 1 0 0 +EDGE2 1916 1337 1.01751 -0.108011 0.00600383 1 0 1 1 0 0 +EDGE2 1916 1496 0.00446813 0.0233023 -0.0354526 1 0 1 1 0 0 +EDGE2 1916 1356 0.0439002 -0.04981 0.0298852 1 0 1 1 0 0 +EDGE2 1916 1355 -0.944836 0.0242928 -1.58502 1 0 1 1 0 0 +EDGE2 1916 1495 -1.01613 -0.0161941 -1.5787 1 0 1 1 0 0 +EDGE2 1916 1915 -0.973228 -0.011092 -1.5546 1 0 1 1 0 0 +EDGE2 1916 1335 -1.05451 0.000634918 -1.59697 1 0 1 1 0 0 +EDGE2 1917 1336 -1.01519 -0.0139128 -0.0122404 1 0 1 1 0 0 +EDGE2 1917 1358 0.979764 0.0545134 -0.00451147 1 0 1 1 0 0 +EDGE2 1917 1498 1.01797 0.043976 0.0248938 1 0 1 1 0 0 +EDGE2 1917 1338 1.01669 -0.0900804 0.0152916 1 0 1 1 0 0 +EDGE2 1917 1357 -0.00676643 0.0352258 -0.0268113 1 0 1 1 0 0 +EDGE2 1917 1497 0.0387675 0.0288929 -0.0290946 1 0 1 1 0 0 +EDGE2 1917 1337 0.0188911 -0.083841 0.00288229 1 0 1 1 0 0 +EDGE2 1917 1496 -1.08789 -0.0390438 0.0185384 1 0 1 1 0 0 +EDGE2 1917 1916 -1.07193 0.0365374 0.00437836 1 0 1 1 0 0 +EDGE2 1917 1356 -1.07274 0.00840235 0.00743897 1 0 1 1 0 0 +EDGE2 1918 1359 1.00335 -0.00784696 0.00572433 1 0 1 1 0 0 +EDGE2 1918 1499 1.04974 -0.0691516 -0.0257793 1 0 1 1 0 0 +EDGE2 1918 1339 0.983887 -0.0329811 0.000691236 1 0 1 1 0 0 +EDGE2 1918 1358 -0.00127223 0.105106 -0.0121302 1 0 1 1 0 0 +EDGE2 1918 1498 0.028976 0.0348489 0.00283682 1 0 1 1 0 0 +EDGE2 1918 1338 0.0167556 0.0914713 0.04954 1 0 1 1 0 0 +EDGE2 1918 1357 -1.00884 0.0122578 -0.0288409 1 0 1 1 0 0 +EDGE2 1918 1497 -1.06191 -0.0164885 -0.00439015 1 0 1 1 0 0 +EDGE2 1918 1917 -0.922776 0.0429535 0.0367332 1 0 1 1 0 0 +EDGE2 1918 1337 -0.947149 -0.0596232 0.00113275 1 0 1 1 0 0 +EDGE2 1919 1360 1.0251 0.000298531 -0.00695356 1 0 1 1 0 0 +EDGE2 1919 1880 1.03919 0.0639893 -3.13778 1 0 1 1 0 0 +EDGE2 1919 1900 1.06863 0.0507684 -3.15105 1 0 1 1 0 0 +EDGE2 1919 1500 0.998729 -0.0115194 -0.00364977 1 0 1 1 0 0 +EDGE2 1919 1680 0.968992 0.0251194 -3.14835 1 0 1 1 0 0 +EDGE2 1919 1480 0.957597 -0.0786979 -3.15853 1 0 1 1 0 0 +EDGE2 1919 1340 1.02076 -0.0263488 0.00543907 1 0 1 1 0 0 +EDGE2 1919 1359 -0.00283972 -0.0566118 2.05473e-05 1 0 1 1 0 0 +EDGE2 1919 1499 -0.0284414 -0.0362667 -0.00701144 1 0 1 1 0 0 +EDGE2 1919 1339 -0.0186725 -0.0675883 0.02824 1 0 1 1 0 0 +EDGE2 1919 1358 -1.10436 -0.0240285 0.0143308 1 0 1 1 0 0 +EDGE2 1919 1498 -0.989168 0.0308876 -0.0223436 1 0 1 1 0 0 +EDGE2 1919 1918 -0.961076 0.00920183 -0.00655415 1 0 1 1 0 0 +EDGE2 1919 1338 -0.978904 0.10946 -0.0185478 1 0 1 1 0 0 +EDGE2 1920 1360 -0.0613266 0.000643278 -0.00327164 1 0 1 1 0 0 +EDGE2 1920 1679 0.989564 0.0010716 -3.14924 1 0 1 1 0 0 +EDGE2 1920 1879 1.02614 0.0489042 -3.14796 1 0 1 1 0 0 +EDGE2 1920 1899 1.00436 -0.0153875 -3.16858 1 0 1 1 0 0 +EDGE2 1920 1479 0.999878 -0.0178885 -3.13176 1 0 1 1 0 0 +EDGE2 1920 1681 -0.0621641 -0.980859 -1.55799 1 0 1 1 0 0 +EDGE2 1920 1881 0.0180241 -1.04068 -1.58496 1 0 1 1 0 0 +EDGE2 1920 1880 0.0126195 0.0325452 -3.14674 1 0 1 1 0 0 +EDGE2 1920 1900 0.0369557 0.0345905 -3.10934 1 0 1 1 0 0 +EDGE2 1920 1500 -0.00859568 -0.0817584 -0.00079599 1 0 1 1 0 0 +EDGE2 1920 1680 0.0481086 0.0171 -3.16837 1 0 1 1 0 0 +EDGE2 1920 1480 0.103174 -0.0905274 -3.13281 1 0 1 1 0 0 +EDGE2 1920 1481 0.0232888 0.962639 1.57988 1 0 1 1 0 0 +EDGE2 1920 1901 -0.0206851 0.953671 1.56254 1 0 1 1 0 0 +EDGE2 1920 1340 -0.0590092 -0.0427801 0.00065928 1 0 1 1 0 0 +EDGE2 1920 1501 0.0122652 1.08353 1.5879 1 0 1 1 0 0 +EDGE2 1920 1341 0.137693 1.0934 1.54812 1 0 1 1 0 0 +EDGE2 1920 1361 0.00861972 0.93736 1.56913 1 0 1 1 0 0 +EDGE2 1920 1359 -1.06393 0.0324429 -0.0109339 1 0 1 1 0 0 +EDGE2 1920 1499 -0.995283 0.0184281 -0.00881957 1 0 1 1 0 0 +EDGE2 1920 1919 -0.953832 0.0550287 -0.00390318 1 0 1 1 0 0 +EDGE2 1920 1339 -0.983896 -0.0212069 -0.0114655 1 0 1 1 0 0 +EDGE2 1921 1360 -0.944673 0.00326866 -1.57341 1 0 1 1 0 0 +EDGE2 1921 1880 -1.06789 -0.0530023 1.57779 1 0 1 1 0 0 +EDGE2 1921 1920 -1.0448 -0.0248486 -1.57104 1 0 1 1 0 0 +EDGE2 1921 1900 -0.97041 0.0094995 1.57816 1 0 1 1 0 0 +EDGE2 1921 1500 -1.02298 0.00116022 -1.59026 1 0 1 1 0 0 +EDGE2 1921 1680 -1.06942 -0.0328709 1.57143 1 0 1 1 0 0 +EDGE2 1921 1480 -0.945856 -0.0021635 1.59449 1 0 1 1 0 0 +EDGE2 1921 1502 1.00871 -0.00588035 0.0347317 1 0 1 1 0 0 +EDGE2 1921 1481 -0.0323927 0.0551046 0.0253285 1 0 1 1 0 0 +EDGE2 1921 1901 -0.101486 0.0495563 0.00495831 1 0 1 1 0 0 +EDGE2 1921 1340 -1.07468 -0.0462988 -1.57833 1 0 1 1 0 0 +EDGE2 1921 1501 -0.00929866 0.0158611 0.0125594 1 0 1 1 0 0 +EDGE2 1921 1341 0.0374267 0.0452721 -0.00685207 1 0 1 1 0 0 +EDGE2 1921 1361 -0.0977258 -0.00820433 0.033922 1 0 1 1 0 0 +EDGE2 1921 1902 1.02242 -0.0202983 0.00218177 1 0 1 1 0 0 +EDGE2 1921 1342 0.9394 -0.0109797 -0.0313308 1 0 1 1 0 0 +EDGE2 1921 1362 1.02489 0.0480309 0.00472705 1 0 1 1 0 0 +EDGE2 1921 1482 1.04872 -0.0454935 0.0123623 1 0 1 1 0 0 +EDGE2 1922 1502 -0.0126479 -0.0415579 0.00351958 1 0 1 1 0 0 +EDGE2 1922 1481 -1.02582 0.0295552 -0.0134238 1 0 1 1 0 0 +EDGE2 1922 1901 -0.994026 0.0549693 0.00907988 1 0 1 1 0 0 +EDGE2 1922 1921 -1.03108 -0.0069971 0.00521013 1 0 1 1 0 0 +EDGE2 1922 1501 -1.01479 0.012016 0.0360223 1 0 1 1 0 0 +EDGE2 1922 1341 -1.02524 0.0751513 -0.0232293 1 0 1 1 0 0 +EDGE2 1922 1361 -1.002 0.0256568 0.0317156 1 0 1 1 0 0 +EDGE2 1922 1902 -0.0563773 0.0111879 0.0212718 1 0 1 1 0 0 +EDGE2 1922 1903 0.959043 -0.0580862 -0.00563584 1 0 1 1 0 0 +EDGE2 1922 1342 0.0566429 -0.0199478 0.0140852 1 0 1 1 0 0 +EDGE2 1922 1362 0.0694748 -0.0346404 -0.0213263 1 0 1 1 0 0 +EDGE2 1922 1482 -0.0663108 0.014695 0.0295498 1 0 1 1 0 0 +EDGE2 1922 1363 0.986255 -0.00268518 -0.0198081 1 0 1 1 0 0 +EDGE2 1922 1483 0.947245 0.0804325 0.013132 1 0 1 1 0 0 +EDGE2 1922 1503 1.05569 -0.0439387 0.0239189 1 0 1 1 0 0 +EDGE2 1922 1343 1.04178 -0.0369059 0.000753125 1 0 1 1 0 0 +EDGE2 1923 1502 -0.942774 0.0265573 0.014858 1 0 1 1 0 0 +EDGE2 1923 1922 -0.97784 0.0535285 0.0369206 1 0 1 1 0 0 +EDGE2 1923 1902 -1.05157 -0.0446256 -0.0247212 1 0 1 1 0 0 +EDGE2 1923 1903 -0.0515634 -0.0352521 0.0127026 1 0 1 1 0 0 +EDGE2 1923 1342 -0.986882 -0.0198084 0.00356175 1 0 1 1 0 0 +EDGE2 1923 1362 -1.01602 -0.0463349 0.00460559 1 0 1 1 0 0 +EDGE2 1923 1482 -1.02401 0.0509595 -0.00689174 1 0 1 1 0 0 +EDGE2 1923 1363 -0.000428817 0.0134689 -0.00216034 1 0 1 1 0 0 +EDGE2 1923 1483 -0.0326522 0.102898 -0.0150769 1 0 1 1 0 0 +EDGE2 1923 1503 -0.00148042 -0.00335235 -0.00704298 1 0 1 1 0 0 +EDGE2 1923 1343 0.0168073 -0.0170633 -0.0364767 1 0 1 1 0 0 +EDGE2 1923 1344 0.941326 -0.0876719 -0.0263885 1 0 1 1 0 0 +EDGE2 1923 1484 0.966547 0.0675115 0.0208625 1 0 1 1 0 0 +EDGE2 1923 1504 0.977803 0.0496312 0.0144426 1 0 1 1 0 0 +EDGE2 1923 1904 1.04741 -0.0304399 0.00212736 1 0 1 1 0 0 +EDGE2 1923 1364 1.03749 -0.0674306 0.0025357 1 0 1 1 0 0 +EDGE2 1924 1345 1.02499 0.0913708 0.024124 1 0 1 1 0 0 +EDGE2 1924 1903 -0.961285 -0.00713156 -0.0462119 1 0 1 1 0 0 +EDGE2 1924 1923 -1.00823 -0.0663444 -0.0146487 1 0 1 1 0 0 +EDGE2 1924 1363 -0.979154 -0.0111048 -0.0216112 1 0 1 1 0 0 +EDGE2 1924 1483 -1.0023 0.0316609 0.00744754 1 0 1 1 0 0 +EDGE2 1924 1503 -1.06498 0.0795478 0.0173792 1 0 1 1 0 0 +EDGE2 1924 1343 -0.934273 0.0127517 -0.0202089 1 0 1 1 0 0 +EDGE2 1924 1344 0.0479136 0.0159307 0.00831286 1 0 1 1 0 0 +EDGE2 1924 1484 -0.0708825 -0.0125296 0.0142826 1 0 1 1 0 0 +EDGE2 1924 1504 0.041128 -0.0120209 -0.0242446 1 0 1 1 0 0 +EDGE2 1924 1904 0.0927567 -0.00594958 0.00858608 1 0 1 1 0 0 +EDGE2 1924 1364 0.00731296 0.112036 0.0204088 1 0 1 1 0 0 +EDGE2 1924 1525 1.04269 0.0397186 -3.11705 1 0 1 1 0 0 +EDGE2 1924 1905 0.88703 -0.0899499 0.0163723 1 0 1 1 0 0 +EDGE2 1924 1645 0.994546 0.00696027 -3.14971 1 0 1 1 0 0 +EDGE2 1924 1485 0.981254 -0.0463748 0.0072504 1 0 1 1 0 0 +EDGE2 1924 1505 0.925258 0.0498853 -0.00336086 1 0 1 1 0 0 +EDGE2 1924 1365 0.928863 0.0233349 0.00193224 1 0 1 1 0 0 +EDGE2 1924 1325 0.995603 0.00914253 -3.1341 1 0 1 1 0 0 +EDGE2 1925 1345 0.0326526 0.0441939 0.0197377 1 0 1 1 0 0 +EDGE2 1925 1526 0.050018 -1.09132 -1.5801 1 0 1 1 0 0 +EDGE2 1925 1646 0.00188437 -0.925716 -1.58052 1 0 1 1 0 0 +EDGE2 1925 1366 -0.00655033 -0.973036 -1.58969 1 0 1 1 0 0 +EDGE2 1925 1506 -0.0171501 -1.01624 -1.56669 1 0 1 1 0 0 +EDGE2 1925 1924 -1.04873 -0.0406532 0.0231565 1 0 1 1 0 0 +EDGE2 1925 1344 -0.939519 -0.000819951 -0.0124833 1 0 1 1 0 0 +EDGE2 1925 1484 -1.01596 -0.0704059 0.000206336 1 0 1 1 0 0 +EDGE2 1925 1504 -0.921028 0.0286292 0.0220964 1 0 1 1 0 0 +EDGE2 1925 1904 -1.05044 0.035268 0.0146573 1 0 1 1 0 0 +EDGE2 1925 1364 -1.09112 0.0362413 -0.0213048 1 0 1 1 0 0 +EDGE2 1925 1525 -0.0746072 -0.0769178 -3.12804 1 0 1 1 0 0 +EDGE2 1925 1905 0.00808193 -0.0327699 0.00218092 1 0 1 1 0 0 +EDGE2 1925 1645 0.00784978 -0.0240662 -3.12916 1 0 1 1 0 0 +EDGE2 1925 1485 0.0883881 -0.0331715 0.0187473 1 0 1 1 0 0 +EDGE2 1925 1505 -0.101371 0.0543886 -0.00931636 1 0 1 1 0 0 +EDGE2 1925 1365 0.0231411 -0.0291304 0.0191285 1 0 1 1 0 0 +EDGE2 1925 1325 0.0632302 -0.0647082 -3.14489 1 0 1 1 0 0 +EDGE2 1925 1524 1.03742 -0.0036676 -3.15437 1 0 1 1 0 0 +EDGE2 1925 1644 1.02195 -0.111937 -3.13973 1 0 1 1 0 0 +EDGE2 1925 1324 0.930818 0.015278 -3.15928 1 0 1 1 0 0 +EDGE2 1925 1486 0.0479892 1.03951 1.55823 1 0 1 1 0 0 +EDGE2 1925 1906 0.0962932 0.999711 1.598 1 0 1 1 0 0 +EDGE2 1925 1326 0.0216972 1.0644 1.56615 1 0 1 1 0 0 +EDGE2 1925 1346 0.00186423 0.908698 1.59737 1 0 1 1 0 0 +EDGE2 1926 1345 -0.946023 -0.00889775 1.55853 1 0 1 1 0 0 +EDGE2 1926 1526 0.0408744 0.0533576 -0.00516767 1 0 1 1 0 0 +EDGE2 1926 1507 1.03979 -0.00757356 0.0361578 1 0 1 1 0 0 +EDGE2 1926 1527 0.969525 -0.0253599 0.0063938 1 0 1 1 0 0 +EDGE2 1926 1647 1.05649 0.0912232 0.001141 1 0 1 1 0 0 +EDGE2 1926 1367 0.993554 -0.00732757 0.020302 1 0 1 1 0 0 +EDGE2 1926 1646 -0.0221794 -0.00820338 0.0127201 1 0 1 1 0 0 +EDGE2 1926 1366 0.0563478 0.0806374 -0.00116458 1 0 1 1 0 0 +EDGE2 1926 1506 -0.0201741 -0.071916 -0.0266853 1 0 1 1 0 0 +EDGE2 1926 1525 -1.00512 0.000783238 -1.56324 1 0 1 1 0 0 +EDGE2 1926 1905 -1.0474 -0.0469627 1.55661 1 0 1 1 0 0 +EDGE2 1926 1925 -1.03516 0.0162233 1.57937 1 0 1 1 0 0 +EDGE2 1926 1645 -0.982266 0.0316559 -1.54752 1 0 1 1 0 0 +EDGE2 1926 1485 -1.0502 -0.00804113 1.57054 1 0 1 1 0 0 +EDGE2 1926 1505 -1.10973 0.0393432 1.59489 1 0 1 1 0 0 +EDGE2 1926 1365 -1.04683 -0.0131508 1.60852 1 0 1 1 0 0 +EDGE2 1926 1325 -0.960531 -0.0214905 -1.60925 1 0 1 1 0 0 +EDGE2 1927 1648 0.933731 -0.115913 -0.00350672 1 0 1 1 0 0 +EDGE2 1927 1368 0.981671 0.0701361 0.00680852 1 0 1 1 0 0 +EDGE2 1927 1508 1.03955 -0.0107658 -0.00107903 1 0 1 1 0 0 +EDGE2 1927 1528 1.03518 0.00876097 -0.00235397 1 0 1 1 0 0 +EDGE2 1927 1526 -1.04918 -0.0274085 -0.0166483 1 0 1 1 0 0 +EDGE2 1927 1507 0.0149452 0.0915524 -0.0447211 1 0 1 1 0 0 +EDGE2 1927 1527 0.0398536 -0.000940338 -0.00592045 1 0 1 1 0 0 +EDGE2 1927 1647 0.0693633 0.0275918 -0.0392715 1 0 1 1 0 0 +EDGE2 1927 1367 0.0471152 0.0105449 0.00829287 1 0 1 1 0 0 +EDGE2 1927 1926 -0.936487 -0.0180098 -0.00895083 1 0 1 1 0 0 +EDGE2 1927 1646 -1.10923 0.0700709 0.0419977 1 0 1 1 0 0 +EDGE2 1927 1366 -1.02572 -0.00134996 -0.0125451 1 0 1 1 0 0 +EDGE2 1927 1506 -1.02771 -0.0147067 -0.015888 1 0 1 1 0 0 +EDGE2 1928 1509 0.984241 -0.0313617 0.00251376 1 0 1 1 0 0 +EDGE2 1928 1649 0.909234 0.12653 0.00215458 1 0 1 1 0 0 +EDGE2 1928 1529 1.04818 -0.0652808 -0.00384624 1 0 1 1 0 0 +EDGE2 1928 1369 0.935847 0.0175466 0.0317745 1 0 1 1 0 0 +EDGE2 1928 1648 0.0142586 0.0301668 0.0424222 1 0 1 1 0 0 +EDGE2 1928 1368 -0.031812 -0.0466325 0.0496814 1 0 1 1 0 0 +EDGE2 1928 1508 -0.0454259 -0.0132046 0.0133768 1 0 1 1 0 0 +EDGE2 1928 1528 -0.000614644 0.010382 0.0237269 1 0 1 1 0 0 +EDGE2 1928 1507 -1.0129 -0.0483348 -0.0171306 1 0 1 1 0 0 +EDGE2 1928 1527 -1.0421 0.0509869 0.00266875 1 0 1 1 0 0 +EDGE2 1928 1647 -1.06577 -0.000331678 -0.0190397 1 0 1 1 0 0 +EDGE2 1928 1927 -0.99986 0.141486 0.00346934 1 0 1 1 0 0 +EDGE2 1928 1367 -1.02192 -0.0248335 -0.0238515 1 0 1 1 0 0 +EDGE2 1929 1650 1.035 0.00552517 -0.00367858 1 0 1 1 0 0 +EDGE2 1929 1710 0.986524 -0.0563593 -3.15767 1 0 1 1 0 0 +EDGE2 1929 1870 0.982325 -0.0157898 -3.14987 1 0 1 1 0 0 +EDGE2 1929 1670 1.12961 0.0122504 -3.12631 1 0 1 1 0 0 +EDGE2 1929 1470 0.981267 0.0453936 -3.10595 1 0 1 1 0 0 +EDGE2 1929 1510 1.03099 -3.67613e-06 0.00226581 1 0 1 1 0 0 +EDGE2 1929 1530 1.09429 -0.0481022 -0.0339342 1 0 1 1 0 0 +EDGE2 1929 1370 0.915433 -0.0421856 0.00382214 1 0 1 1 0 0 +EDGE2 1929 1509 -0.00798813 -0.0159478 0.00697559 1 0 1 1 0 0 +EDGE2 1929 1649 0.0233463 0.00396669 0.0177237 1 0 1 1 0 0 +EDGE2 1929 1529 -0.0702881 0.00273256 0.0509124 1 0 1 1 0 0 +EDGE2 1929 1369 -0.0232394 -0.0472523 0.0325185 1 0 1 1 0 0 +EDGE2 1929 1648 -1.04786 0.0523444 0.0345407 1 0 1 1 0 0 +EDGE2 1929 1928 -0.980475 0.0718548 -0.0345145 1 0 1 1 0 0 +EDGE2 1929 1368 -1.04349 0.000440483 0.0103178 1 0 1 1 0 0 +EDGE2 1929 1508 -0.92013 0.0566838 0.0042127 1 0 1 1 0 0 +EDGE2 1929 1528 -1.02711 0.0617186 -0.00139552 1 0 1 1 0 0 +EDGE2 1930 1669 0.992208 0.101793 -3.1262 1 0 1 1 0 0 +EDGE2 1930 1709 1.01752 0.0242608 -3.13054 1 0 1 1 0 0 +EDGE2 1930 1869 1.00505 0.0228497 -3.14726 1 0 1 1 0 0 +EDGE2 1930 1469 1.00587 -0.0942514 -3.13441 1 0 1 1 0 0 +EDGE2 1930 1671 0.0371668 -1.08918 -1.57361 1 0 1 1 0 0 +EDGE2 1930 1711 0.039076 -0.973308 -1.56802 1 0 1 1 0 0 +EDGE2 1930 1871 -0.0121484 -0.852154 -1.58939 1 0 1 1 0 0 +EDGE2 1930 1471 0.0109775 -1.02089 -1.56046 1 0 1 1 0 0 +EDGE2 1930 1650 -0.0694669 -0.0118536 0.0236796 1 0 1 1 0 0 +EDGE2 1930 1710 0.00334032 -0.0875787 -3.1329 1 0 1 1 0 0 +EDGE2 1930 1870 0.0489006 0.0129886 -3.15228 1 0 1 1 0 0 +EDGE2 1930 1670 0.00640147 0.113393 -3.13018 1 0 1 1 0 0 +EDGE2 1930 1470 0.0731746 -0.00974561 -3.14225 1 0 1 1 0 0 +EDGE2 1930 1510 -0.0254346 -0.00512014 -0.00610561 1 0 1 1 0 0 +EDGE2 1930 1530 -0.0661993 0.0134298 -0.0201893 1 0 1 1 0 0 +EDGE2 1930 1370 0.0073481 -0.0249184 0.0240037 1 0 1 1 0 0 +EDGE2 1930 1371 -0.0986071 1.01418 1.58027 1 0 1 1 0 0 +EDGE2 1930 1531 0.0258226 0.981698 1.59234 1 0 1 1 0 0 +EDGE2 1930 1651 0.0305577 0.950806 1.6015 1 0 1 1 0 0 +EDGE2 1930 1511 0.0263469 0.990409 1.55188 1 0 1 1 0 0 +EDGE2 1930 1509 -1.04051 -0.0555789 -0.0213137 1 0 1 1 0 0 +EDGE2 1930 1649 -1.05262 0.0289954 -0.00125596 1 0 1 1 0 0 +EDGE2 1930 1929 -1.04199 -0.0538462 -0.0182036 1 0 1 1 0 0 +EDGE2 1930 1529 -1.03861 0.0419143 0.0111443 1 0 1 1 0 0 +EDGE2 1930 1369 -0.91365 -0.0551283 0.011519 1 0 1 1 0 0 +EDGE2 1931 1872 1.04746 -0.00653092 0.0437383 1 0 1 1 0 0 +EDGE2 1931 1672 0.934309 -0.0178322 0.0255706 1 0 1 1 0 0 +EDGE2 1931 1712 0.953154 -0.0518308 0.00128186 1 0 1 1 0 0 +EDGE2 1931 1472 1.01587 -0.127458 -0.0162898 1 0 1 1 0 0 +EDGE2 1931 1671 -0.0260868 -0.0429042 0.0188764 1 0 1 1 0 0 +EDGE2 1931 1711 -0.110892 0.0412966 -0.00552373 1 0 1 1 0 0 +EDGE2 1931 1871 0.0156599 -0.0372949 -0.000689601 1 0 1 1 0 0 +EDGE2 1931 1471 -0.0586721 0.0410617 -0.012478 1 0 1 1 0 0 +EDGE2 1931 1650 -0.958774 0.055045 1.56441 1 0 1 1 0 0 +EDGE2 1931 1710 -0.931106 0.0626128 -1.55378 1 0 1 1 0 0 +EDGE2 1931 1870 -0.912305 -0.0418819 -1.58984 1 0 1 1 0 0 +EDGE2 1931 1930 -0.970215 -0.0464159 1.56517 1 0 1 1 0 0 +EDGE2 1931 1670 -1.03502 -0.0031821 -1.56117 1 0 1 1 0 0 +EDGE2 1931 1470 -1.02313 -0.0362519 -1.55718 1 0 1 1 0 0 +EDGE2 1931 1510 -0.999106 0.0256453 1.57218 1 0 1 1 0 0 +EDGE2 1931 1530 -1.0135 0.0343861 1.5778 1 0 1 1 0 0 +EDGE2 1931 1370 -0.962713 -0.0356623 1.57378 1 0 1 1 0 0 +EDGE2 1932 1931 -0.912905 -0.0741969 0.0184383 1 0 1 1 0 0 +EDGE2 1932 1873 0.953148 0.0400551 -0.0105957 1 0 1 1 0 0 +EDGE2 1932 1872 -0.0500024 0.0359666 -0.0315131 1 0 1 1 0 0 +EDGE2 1932 1473 0.983568 -0.0204425 0.0162382 1 0 1 1 0 0 +EDGE2 1932 1673 0.917149 -0.0413293 -0.00850215 1 0 1 1 0 0 +EDGE2 1932 1713 1.03839 0.0533624 0.009614 1 0 1 1 0 0 +EDGE2 1932 1672 0.032106 0.00110091 0.00324305 1 0 1 1 0 0 +EDGE2 1932 1712 -0.00872175 0.0503224 -0.0223919 1 0 1 1 0 0 +EDGE2 1932 1472 0.0860583 0.00206293 0.0250278 1 0 1 1 0 0 +EDGE2 1932 1671 -0.944415 0.00176693 -0.0324026 1 0 1 1 0 0 +EDGE2 1932 1711 -0.982815 -0.0304583 0.0221234 1 0 1 1 0 0 +EDGE2 1932 1871 -1.00768 0.0734698 -0.0312126 1 0 1 1 0 0 +EDGE2 1932 1471 -1.09083 -0.0294396 -0.037372 1 0 1 1 0 0 +EDGE2 1933 1873 -0.0705527 -0.0220601 -0.0277464 1 0 1 1 0 0 +EDGE2 1933 1874 1.01673 0.0664542 -0.024889 1 0 1 1 0 0 +EDGE2 1933 1474 1.1018 0.102789 0.0201816 1 0 1 1 0 0 +EDGE2 1933 1674 1.02279 0.0283712 0.0029263 1 0 1 1 0 0 +EDGE2 1933 1714 1.07429 -0.0155718 -0.0248046 1 0 1 1 0 0 +EDGE2 1933 1872 -1.01143 -0.00961289 0.0122478 1 0 1 1 0 0 +EDGE2 1933 1473 -0.00951103 -0.0047307 -0.0136639 1 0 1 1 0 0 +EDGE2 1933 1673 -0.0561011 -0.00320525 -0.00789272 1 0 1 1 0 0 +EDGE2 1933 1713 -0.0192388 0.0448963 0.00820746 1 0 1 1 0 0 +EDGE2 1933 1932 -0.990881 0.00171628 0.00146682 1 0 1 1 0 0 +EDGE2 1933 1672 -0.999862 -0.0532867 0.0354498 1 0 1 1 0 0 +EDGE2 1933 1712 -0.938587 0.0178127 0.0338959 1 0 1 1 0 0 +EDGE2 1933 1472 -1.06872 0.117652 0.0275472 1 0 1 1 0 0 +EDGE2 1934 1715 1.08122 -0.0304904 -0.0394568 1 0 1 1 0 0 +EDGE2 1934 1895 0.990511 0.0633266 -3.14203 1 0 1 1 0 0 +EDGE2 1934 1875 0.984554 0.0110221 -0.00293273 1 0 1 1 0 0 +EDGE2 1934 1873 -0.953388 0.0477524 -0.00383329 1 0 1 1 0 0 +EDGE2 1934 1874 0.0559124 0.0117542 -0.0344552 1 0 1 1 0 0 +EDGE2 1934 1475 1.0238 0.155461 -0.029924 1 0 1 1 0 0 +EDGE2 1934 1675 0.947324 -0.00852081 -0.0150878 1 0 1 1 0 0 +EDGE2 1934 1695 1.10042 -0.0814414 -3.12801 1 0 1 1 0 0 +EDGE2 1934 1474 0.0148178 -0.110744 0.0282529 1 0 1 1 0 0 +EDGE2 1934 1674 -0.0429776 -0.0119989 0.0208425 1 0 1 1 0 0 +EDGE2 1934 1714 0.107079 -0.0557314 0.0111421 1 0 1 1 0 0 +EDGE2 1934 1933 -0.940417 -0.00404717 0.00727145 1 0 1 1 0 0 +EDGE2 1934 1473 -1.09454 0.0256614 0.00492747 1 0 1 1 0 0 +EDGE2 1934 1673 -1.00033 -0.0365396 -0.0280731 1 0 1 1 0 0 +EDGE2 1934 1713 -1.0199 -0.0360094 0.0128371 1 0 1 1 0 0 +EDGE2 1935 1715 0.0206601 -0.0146246 -0.0444208 1 0 1 1 0 0 +EDGE2 1935 1694 1.02723 0.0350161 -3.12466 1 0 1 1 0 0 +EDGE2 1935 1894 1.03663 0.00948197 -3.15303 1 0 1 1 0 0 +EDGE2 1935 1716 -0.00747953 1.00336 1.56145 1 0 1 1 0 0 +EDGE2 1935 1895 -0.0311425 -0.0430011 -3.10469 1 0 1 1 0 0 +EDGE2 1935 1696 0.0435838 0.978316 1.53406 1 0 1 1 0 0 +EDGE2 1935 1875 -0.0716446 -0.0193538 0.012288 1 0 1 1 0 0 +EDGE2 1935 1874 -0.982332 -0.0771142 -0.0138233 1 0 1 1 0 0 +EDGE2 1935 1475 0.100887 0.0423166 0.0261313 1 0 1 1 0 0 +EDGE2 1935 1675 -0.0420122 -0.0365289 -0.00853737 1 0 1 1 0 0 +EDGE2 1935 1695 0.106353 0.0555404 -3.12033 1 0 1 1 0 0 +EDGE2 1935 1934 -0.982869 -0.0773053 0.00987587 1 0 1 1 0 0 +EDGE2 1935 1474 -0.981825 0.0416583 0.0215274 1 0 1 1 0 0 +EDGE2 1935 1674 -1.03332 0.0999827 0.0167462 1 0 1 1 0 0 +EDGE2 1935 1714 -1.01686 -0.0227035 0.00112562 1 0 1 1 0 0 +EDGE2 1935 1676 -0.0539864 -1.06051 -1.59802 1 0 1 1 0 0 +EDGE2 1935 1876 -0.0409053 -0.90539 -1.55609 1 0 1 1 0 0 +EDGE2 1935 1896 0.066823 -1.08034 -1.56265 1 0 1 1 0 0 +EDGE2 1935 1476 -0.0312984 -1.04219 -1.60459 1 0 1 1 0 0 +EDGE2 1936 1697 1.05978 0.0265078 -0.0145038 1 0 1 1 0 0 +EDGE2 1936 1717 1.04741 -0.0679905 0.00251439 1 0 1 1 0 0 +EDGE2 1936 1715 -0.963093 0.0755849 -1.56914 1 0 1 1 0 0 +EDGE2 1936 1716 -0.0396706 0.0487279 0.00715935 1 0 1 1 0 0 +EDGE2 1936 1895 -1.02401 -0.0204004 1.57103 1 0 1 1 0 0 +EDGE2 1936 1935 -1.02082 -0.0471691 -1.5686 1 0 1 1 0 0 +EDGE2 1936 1696 -0.00215785 0.0112091 0.0250213 1 0 1 1 0 0 +EDGE2 1936 1875 -1.02918 0.00868284 -1.5533 1 0 1 1 0 0 +EDGE2 1936 1475 -1.02202 -0.0522315 -1.58473 1 0 1 1 0 0 +EDGE2 1936 1675 -1.02729 0.0550184 -1.58422 1 0 1 1 0 0 +EDGE2 1936 1695 -0.943835 -0.0356032 1.57346 1 0 1 1 0 0 +EDGE2 1937 1697 0.0379193 -0.0062103 -0.0117896 1 0 1 1 0 0 +EDGE2 1937 1698 0.964343 0.02413 -0.0196475 1 0 1 1 0 0 +EDGE2 1937 1718 0.962617 0.034807 0.0219559 1 0 1 1 0 0 +EDGE2 1937 1717 -0.00510248 -0.0191322 -0.000328571 1 0 1 1 0 0 +EDGE2 1937 1716 -1.00826 0.00762777 -0.0034826 1 0 1 1 0 0 +EDGE2 1937 1936 -1.04937 0.00248544 -0.0288146 1 0 1 1 0 0 +EDGE2 1937 1696 -0.95813 -0.0301638 0.0084713 1 0 1 1 0 0 +EDGE2 1938 1697 -1.00039 0.00846896 -0.00413268 1 0 1 1 0 0 +EDGE2 1938 1719 0.966791 0.0618737 -0.00385868 1 0 1 1 0 0 +EDGE2 1938 1699 1.05336 0.0215789 0.00563811 1 0 1 1 0 0 +EDGE2 1938 1937 -1.05201 -0.0190692 -0.00175843 1 0 1 1 0 0 +EDGE2 1938 1698 -0.0447003 0.0606133 0.0130288 1 0 1 1 0 0 +EDGE2 1938 1718 0.0500238 -0.0112341 -0.0214177 1 0 1 1 0 0 +EDGE2 1938 1717 -1.00256 0.0537978 0.0153208 1 0 1 1 0 0 +EDGE2 1939 1700 0.979582 0.0259882 -0.0508762 1 0 1 1 0 0 +EDGE2 1939 1720 0.93096 -0.0400002 0.00786158 1 0 1 1 0 0 +EDGE2 1939 1740 0.972545 0.104263 -3.13756 1 0 1 1 0 0 +EDGE2 1939 1460 0.968649 -0.050253 -3.16199 1 0 1 1 0 0 +EDGE2 1939 1938 -1.03022 -0.0153314 0.0221298 1 0 1 1 0 0 +EDGE2 1939 1719 0.0589367 0.044269 0.035121 1 0 1 1 0 0 +EDGE2 1939 1699 0.0971381 0.0245175 0.0463572 1 0 1 1 0 0 +EDGE2 1939 1698 -1.01578 -0.0190258 -0.0581155 1 0 1 1 0 0 +EDGE2 1939 1718 -0.988268 -0.0454941 -0.000120059 1 0 1 1 0 0 +EDGE2 1940 1739 1.03187 0.0208339 -3.12805 1 0 1 1 0 0 +EDGE2 1940 1459 0.914214 -0.0131432 -3.14093 1 0 1 1 0 0 +EDGE2 1940 1701 0.0403988 1.08904 1.57204 1 0 1 1 0 0 +EDGE2 1940 1741 -0.0490469 -0.984587 -1.55392 1 0 1 1 0 0 +EDGE2 1940 1721 0.124352 -1.04108 -1.57582 1 0 1 1 0 0 +EDGE2 1940 1700 0.0116281 0.0993578 -0.0102082 1 0 1 1 0 0 +EDGE2 1940 1720 -0.0245387 -0.0221942 -0.0235424 1 0 1 1 0 0 +EDGE2 1940 1740 0.0492673 0.0722759 -3.17219 1 0 1 1 0 0 +EDGE2 1940 1460 -0.0426789 -0.0507494 -3.13017 1 0 1 1 0 0 +EDGE2 1940 1461 -0.13582 0.955406 1.52179 1 0 1 1 0 0 +EDGE2 1940 1719 -0.940341 -0.00614897 -0.00977855 1 0 1 1 0 0 +EDGE2 1940 1939 -1.06332 -0.00700492 -0.0142188 1 0 1 1 0 0 +EDGE2 1940 1699 -0.977971 0.0570568 0.0463126 1 0 1 1 0 0 +EDGE2 1941 1742 0.9166 0.0455438 -0.00281198 1 0 1 1 0 0 +EDGE2 1941 1940 -0.932483 0.0706479 1.58152 1 0 1 1 0 0 +EDGE2 1941 1741 -0.0177832 -0.0163406 0.00271883 1 0 1 1 0 0 +EDGE2 1941 1722 1.04815 0.0326636 -0.00693261 1 0 1 1 0 0 +EDGE2 1941 1721 0.0178443 -0.00989616 0.030542 1 0 1 1 0 0 +EDGE2 1941 1700 -1.10257 -0.0311705 1.59143 1 0 1 1 0 0 +EDGE2 1941 1720 -1.01559 0.0581611 1.57857 1 0 1 1 0 0 +EDGE2 1941 1740 -0.978107 -0.0632292 -1.54931 1 0 1 1 0 0 +EDGE2 1941 1460 -0.963574 0.0164426 -1.57193 1 0 1 1 0 0 +EDGE2 1942 1742 0.0362251 -0.0162346 -0.0160384 1 0 1 1 0 0 +EDGE2 1942 1723 1.0266 -0.00523751 -0.0308562 1 0 1 1 0 0 +EDGE2 1942 1743 1.00178 -0.0442399 0.0323575 1 0 1 1 0 0 +EDGE2 1942 1741 -1.13368 0.0599982 0.0179641 1 0 1 1 0 0 +EDGE2 1942 1941 -0.950484 0.05123 -0.0187543 1 0 1 1 0 0 +EDGE2 1942 1722 0.109837 0.0962231 -0.00681835 1 0 1 1 0 0 +EDGE2 1942 1721 -0.991135 -0.0428786 0.00333721 1 0 1 1 0 0 +EDGE2 1943 1742 -1.0091 -0.0144612 0.0155337 1 0 1 1 0 0 +EDGE2 1943 1744 1.07834 -0.0525364 0.0201693 1 0 1 1 0 0 +EDGE2 1943 1724 1.05104 0.0101483 0.00011197 1 0 1 1 0 0 +EDGE2 1943 1723 -0.0099691 -0.087424 0.0381181 1 0 1 1 0 0 +EDGE2 1943 1743 0.106004 0.0723469 -0.00581399 1 0 1 1 0 0 +EDGE2 1943 1942 -0.936872 0.047842 0.0124432 1 0 1 1 0 0 +EDGE2 1943 1722 -1.03097 0.111263 0.00187455 1 0 1 1 0 0 +EDGE2 1944 1745 1.05954 0.0532014 0.0475307 1 0 1 1 0 0 +EDGE2 1944 1943 -1.0113 0.0549972 0.0182784 1 0 1 1 0 0 +EDGE2 1944 1744 -0.0259137 0.0196609 0.00589767 1 0 1 1 0 0 +EDGE2 1944 1725 1.00211 -0.0969017 0.0143581 1 0 1 1 0 0 +EDGE2 1944 1724 0.0107431 0.0144517 -0.0603633 1 0 1 1 0 0 +EDGE2 1944 1723 -0.99582 -0.079623 -0.00186937 1 0 1 1 0 0 +EDGE2 1944 1743 -1.0559 -0.0489055 -0.0570636 1 0 1 1 0 0 +EDGE2 1945 1746 0.0328817 0.917474 1.57951 1 0 1 1 0 0 +EDGE2 1945 1726 0.00502576 1.03875 1.58201 1 0 1 1 0 0 +EDGE2 1945 1745 -0.0238766 -0.0466072 0.0155758 1 0 1 1 0 0 +EDGE2 1945 1744 -1.03177 -0.0950939 0.0146745 1 0 1 1 0 0 +EDGE2 1945 1944 -1.08911 -0.0393698 -0.000274343 1 0 1 1 0 0 +EDGE2 1945 1725 0.0329463 0.0205138 0.0255857 1 0 1 1 0 0 +EDGE2 1945 1724 -0.989239 -0.0724414 0.00578542 1 0 1 1 0 0 +EDGE2 1946 1727 1.0669 -0.01524 0.0176557 1 0 1 1 0 0 +EDGE2 1946 1747 0.90362 0.133978 -0.0164479 1 0 1 1 0 0 +EDGE2 1946 1746 -0.00506293 -0.0339215 0.0134331 1 0 1 1 0 0 +EDGE2 1946 1726 0.0128006 0.0253146 0.0231588 1 0 1 1 0 0 +EDGE2 1946 1745 -0.931773 -0.0910893 -1.64313 1 0 1 1 0 0 +EDGE2 1946 1945 -0.960055 -0.100114 -1.55956 1 0 1 1 0 0 +EDGE2 1946 1725 -1.02632 0.0902186 -1.55526 1 0 1 1 0 0 +EDGE2 1947 1727 0.042112 -0.045823 0.00606999 1 0 1 1 0 0 +EDGE2 1947 1728 1.00372 -0.0767748 0.00828399 1 0 1 1 0 0 +EDGE2 1947 1748 0.989853 -0.0507537 0.0111542 1 0 1 1 0 0 +EDGE2 1947 1747 0.0254995 0.0205662 -0.0132315 1 0 1 1 0 0 +EDGE2 1947 1746 -0.921138 0.00548209 0.0245406 1 0 1 1 0 0 +EDGE2 1947 1946 -1.03869 0.0204681 -0.0228178 1 0 1 1 0 0 +EDGE2 1947 1726 -0.946322 0.00390248 -0.0117262 1 0 1 1 0 0 +EDGE2 1948 1749 1.02771 0.0236449 -0.0156386 1 0 1 1 0 0 +EDGE2 1948 1729 1.01239 -0.0155394 -0.00113215 1 0 1 1 0 0 +EDGE2 1948 1727 -0.970799 0.0225408 -0.00876162 1 0 1 1 0 0 +EDGE2 1948 1947 -1.0536 0.0564209 -0.011933 1 0 1 1 0 0 +EDGE2 1948 1728 0.0341724 -0.0465192 -0.00217459 1 0 1 1 0 0 +EDGE2 1948 1748 0.0449377 -0.0240675 -0.00680101 1 0 1 1 0 0 +EDGE2 1948 1747 -1.01795 0.047013 0.0549715 1 0 1 1 0 0 +EDGE2 1949 1948 -1.04201 0.0193283 0.00806039 1 0 1 1 0 0 +EDGE2 1949 1750 0.996837 0.0317135 0.00892525 1 0 1 1 0 0 +EDGE2 1949 1730 1.00664 0.00569943 0.00483779 1 0 1 1 0 0 +EDGE2 1949 1749 -0.0433132 -0.00669647 -0.0312158 1 0 1 1 0 0 +EDGE2 1949 1729 0.062398 0.0163671 -0.00208004 1 0 1 1 0 0 +EDGE2 1949 1728 -1.00679 0.0210522 0.0148563 1 0 1 1 0 0 +EDGE2 1949 1748 -1.03802 -0.0473024 -0.0150728 1 0 1 1 0 0 +EDGE2 1950 1750 -0.00459823 0.0406054 -0.0255372 1 0 1 1 0 0 +EDGE2 1950 1949 -1.00524 0.00857809 -0.0138023 1 0 1 1 0 0 +EDGE2 1950 1730 -0.101284 0.137102 0.0288636 1 0 1 1 0 0 +EDGE2 1950 1731 -0.0686287 1.0647 1.5711 1 0 1 1 0 0 +EDGE2 1950 1751 -0.00266126 0.986564 1.55767 1 0 1 1 0 0 +EDGE2 1950 1749 -1.01301 0.0292874 0.0032008 1 0 1 1 0 0 +EDGE2 1950 1729 -1.01234 0.0443516 0.0352338 1 0 1 1 0 0 +EDGE2 1951 1750 -0.959169 0.0275384 1.55596 1 0 1 1 0 0 +EDGE2 1951 1950 -1.03189 0.0470438 1.57812 1 0 1 1 0 0 +EDGE2 1951 1730 -1.08012 -0.0438711 1.55656 1 0 1 1 0 0 +EDGE2 1952 1951 -1.0225 -0.00128052 -0.0215143 1 0 1 1 0 0 +EDGE2 1953 1952 -0.943011 0.0709763 0.00281239 1 0 1 1 0 0 +EDGE2 1954 1953 -1.05417 0.00142752 0.0283419 1 0 1 1 0 0 +EDGE2 1955 1954 -1.06581 0.0927918 0.0287701 1 0 1 1 0 0 +EDGE2 1956 1955 -1.01682 0.0252341 1.5651 1 0 1 1 0 0 +EDGE2 1957 1956 -1.03777 0.0180557 0.0156521 1 0 1 1 0 0 +EDGE2 1958 1957 -0.906424 -0.0434791 -0.00809637 1 0 1 1 0 0 +EDGE2 1959 1958 -0.924016 -0.0355233 0.0261924 1 0 1 1 0 0 +EDGE2 1960 1959 -1.0605 -0.00812216 0.0268935 1 0 1 1 0 0 +EDGE2 1961 1960 -0.964846 -0.0931329 -1.55245 1 0 1 1 0 0 +EDGE2 1962 1961 -1.05809 -0.0414948 0.0105518 1 0 1 1 0 0 +EDGE2 1963 1962 -0.993888 -0.0589607 -0.0370754 1 0 1 1 0 0 +EDGE2 1964 1963 -0.966421 -0.0306585 -0.0240633 1 0 1 1 0 0 +EDGE2 1965 1964 -0.994873 -0.00466666 0.0224142 1 0 1 1 0 0 +EDGE2 1966 1965 -1.0033 0.00377487 -1.58998 1 0 1 1 0 0 +EDGE2 1967 1966 -0.971765 0.0319893 -0.00646729 1 0 1 1 0 0 +EDGE2 1968 1967 -0.946994 0.00991469 -0.00483266 1 0 1 1 0 0 +EDGE2 1969 1968 -0.93351 0.0334612 0.00776193 1 0 1 1 0 0 +EDGE2 1970 1969 -0.915027 -0.00921922 0.0389372 1 0 1 1 0 0 +EDGE2 1971 1970 -1.04248 -0.0188794 -1.5627 1 0 1 1 0 0 +EDGE2 1972 1971 -0.988714 0.0426255 -0.00833797 1 0 1 1 0 0 +EDGE2 1973 1972 -0.923307 -0.00502572 0.0160189 1 0 1 1 0 0 +EDGE2 1974 1973 -0.96362 0.0269859 0.0183691 1 0 1 1 0 0 +EDGE2 1974 1955 0.98267 -0.0587952 -3.16323 1 0 1 1 0 0 +EDGE2 1975 1954 1.06649 0.0363914 -3.16319 1 0 1 1 0 0 +EDGE2 1975 1974 -0.96762 -0.001388 0.00169247 1 0 1 1 0 0 +EDGE2 1975 1955 0.0431246 -0.024315 -3.13667 1 0 1 1 0 0 +EDGE2 1975 1956 -0.0451835 0.994651 1.61509 1 0 1 1 0 0 +EDGE2 1976 1975 -0.986738 -0.0104457 -1.55557 1 0 1 1 0 0 +EDGE2 1976 1955 -0.978853 0.0634217 1.61061 1 0 1 1 0 0 +EDGE2 1976 1956 -0.00423246 -0.050154 -0.0162084 1 0 1 1 0 0 +EDGE2 1976 1957 0.992492 0.044839 0.000239347 1 0 1 1 0 0 +EDGE2 1977 1956 -0.996629 -0.108151 -0.0454251 1 0 1 1 0 0 +EDGE2 1977 1976 -1.04692 -0.0243873 -0.00703196 1 0 1 1 0 0 +EDGE2 1977 1957 -0.0144798 -0.00277489 0.0273135 1 0 1 1 0 0 +EDGE2 1977 1958 0.967213 -0.0691074 -0.00575115 1 0 1 1 0 0 +EDGE2 1978 1977 -1.08013 0.0333463 0.0102876 1 0 1 1 0 0 +EDGE2 1978 1957 -0.987933 -0.0058788 -0.0171579 1 0 1 1 0 0 +EDGE2 1978 1958 0.0444829 0.0833283 -0.0577801 1 0 1 1 0 0 +EDGE2 1978 1959 0.966877 0.0235905 0.00500637 1 0 1 1 0 0 +EDGE2 1979 1978 -0.952346 -0.0401466 0.0123793 1 0 1 1 0 0 +EDGE2 1979 1958 -1.01589 0.0054175 -0.0215536 1 0 1 1 0 0 +EDGE2 1979 1959 -0.0389842 -0.0862518 -0.0169288 1 0 1 1 0 0 +EDGE2 1979 1960 0.975895 -0.0495453 0.0197864 1 0 1 1 0 0 +EDGE2 1980 1979 -1.00598 0.0532653 0.0216999 1 0 1 1 0 0 +EDGE2 1980 1959 -1.02501 0.0344823 -0.0127801 1 0 1 1 0 0 +EDGE2 1980 1960 -0.0471652 0.0863481 0.0062378 1 0 1 1 0 0 +EDGE2 1980 1961 0.00901442 1.03347 1.57827 1 0 1 1 0 0 +EDGE2 1981 1962 0.940742 0.00341825 0.0168041 1 0 1 1 0 0 +EDGE2 1981 1960 -1.00015 0.0438103 -1.53363 1 0 1 1 0 0 +EDGE2 1981 1980 -0.958201 0.02756 -1.58033 1 0 1 1 0 0 +EDGE2 1981 1961 0.0170745 0.0725172 -0.00124512 1 0 1 1 0 0 +EDGE2 1982 1981 -1.01578 -0.0214548 0.0311474 1 0 1 1 0 0 +EDGE2 1982 1963 1.05768 -0.0226734 0.017436 1 0 1 1 0 0 +EDGE2 1982 1962 -0.0532055 0.045735 -0.028132 1 0 1 1 0 0 +EDGE2 1982 1961 -1.03548 -0.0648484 -0.0257451 1 0 1 1 0 0 +EDGE2 1983 1964 1.00276 -0.00835625 -0.0055426 1 0 1 1 0 0 +EDGE2 1983 1982 -0.969956 -0.0322649 -0.00018619 1 0 1 1 0 0 +EDGE2 1983 1963 0.0564916 0.0369334 0.00443873 1 0 1 1 0 0 +EDGE2 1983 1962 -0.985286 0.0122176 -0.0124195 1 0 1 1 0 0 +EDGE2 1984 1964 0.0717805 0.000804701 0.000489767 1 0 1 1 0 0 +EDGE2 1984 1965 0.895167 0.0815251 -0.009058 1 0 1 1 0 0 +EDGE2 1984 1963 -0.982849 -0.0757825 -0.0479688 1 0 1 1 0 0 +EDGE2 1984 1983 -1.05478 -0.0364054 -0.0194313 1 0 1 1 0 0 +EDGE2 1985 1964 -0.999001 0.0168539 0.00163576 1 0 1 1 0 0 +EDGE2 1985 1965 -0.0197151 -0.048047 -0.0300131 1 0 1 1 0 0 +EDGE2 1985 1966 0.031442 0.977049 1.60526 1 0 1 1 0 0 +EDGE2 1985 1984 -0.949048 -0.0212716 -0.0366859 1 0 1 1 0 0 +EDGE2 1986 1967 0.937513 0.0493326 0.0199668 1 0 1 1 0 0 +EDGE2 1986 1965 -0.913676 0.02738 -1.57373 1 0 1 1 0 0 +EDGE2 1986 1985 -1.00978 0.0450655 -1.53487 1 0 1 1 0 0 +EDGE2 1986 1966 0.0626167 0.0246417 0.0179191 1 0 1 1 0 0 +EDGE2 1987 1968 0.971278 -0.0317633 0.02737 1 0 1 1 0 0 +EDGE2 1987 1986 -1.07877 -0.0756139 -0.0266188 1 0 1 1 0 0 +EDGE2 1987 1967 0.0208396 -0.0404893 -0.0377407 1 0 1 1 0 0 +EDGE2 1987 1966 -0.969448 -0.0362498 0.00101759 1 0 1 1 0 0 +EDGE2 1988 1969 1.01257 -0.0335056 0.0145992 1 0 1 1 0 0 +EDGE2 1988 1968 -0.0622395 -0.0165413 -0.00719098 1 0 1 1 0 0 +EDGE2 1988 1967 -0.993366 -0.0737222 -0.0367186 1 0 1 1 0 0 +EDGE2 1988 1987 -0.963401 0.0261517 -0.00716377 1 0 1 1 0 0 +EDGE2 1989 1970 0.948275 -0.0146619 0.0318573 1 0 1 1 0 0 +EDGE2 1989 1969 -0.0171098 -0.0273623 0.00880636 1 0 1 1 0 0 +EDGE2 1989 1968 -0.979076 -0.0709008 0.00710372 1 0 1 1 0 0 +EDGE2 1989 1988 -1.04271 -0.0833517 0.0264933 1 0 1 1 0 0 +EDGE2 1990 1970 -0.00689206 0.0189439 -0.00670274 1 0 1 1 0 0 +EDGE2 1990 1971 -0.0331747 1.01305 1.61178 1 0 1 1 0 0 +EDGE2 1990 1969 -1.03999 -0.0194879 -0.0191377 1 0 1 1 0 0 +EDGE2 1990 1989 -0.970665 -0.0273407 0.00485176 1 0 1 1 0 0 +EDGE2 1991 1970 -0.986906 0.0371399 1.55516 1 0 1 1 0 0 +EDGE2 1991 1990 -1.0075 0.030087 1.60491 1 0 1 1 0 0 +EDGE2 1992 1991 -0.889089 0.00876667 -0.0115424 1 0 1 1 0 0 +EDGE2 1993 1992 -0.979778 -0.0577887 -0.0228168 1 0 1 1 0 0 +EDGE2 1994 1993 -1.003 -0.0523314 -0.0176558 1 0 1 1 0 0 +EDGE2 1995 1994 -1.0749 -0.00669704 0.00311574 1 0 1 1 0 0 +EDGE2 1996 1995 -1.07875 0.0332414 -1.55955 1 0 1 1 0 0 +EDGE2 1997 1996 -0.973014 -0.0101613 -0.00368584 1 0 1 1 0 0 +EDGE2 1998 1997 -0.994255 -0.0436559 -0.00811794 1 0 1 1 0 0 +EDGE2 1999 1998 -0.999811 0.0197544 0.0182535 1 0 1 1 0 0 +EDGE2 2000 1999 -0.947696 -0.0869239 0.0102297 1 0 1 1 0 0 +EDGE2 2001 2000 -0.973752 0.0691682 -1.60947 1 0 1 1 0 0 +EDGE2 2002 2001 -1.05464 0.123964 0.0183274 1 0 1 1 0 0 +EDGE2 2003 2002 -1.0143 0.0423181 -0.00525544 1 0 1 1 0 0 +EDGE2 2004 2003 -1.09083 -0.0351689 0.00792952 1 0 1 1 0 0 +EDGE2 2005 2004 -0.908782 -0.0254165 -0.0143975 1 0 1 1 0 0 +EDGE2 2006 2005 -1.01976 -0.0331941 1.56854 1 0 1 1 0 0 +EDGE2 2007 2006 -1.0568 0.0397136 0.0251142 1 0 1 1 0 0 +EDGE2 2008 2007 -0.958366 0.00878078 -0.0209455 1 0 1 1 0 0 +EDGE2 2009 2008 -0.965193 0.01105 -0.00803488 1 0 1 1 0 0 +EDGE2 2010 2009 -0.976531 0.0809394 0.00656133 1 0 1 1 0 0 +EDGE2 2011 2010 -1.07244 0.0756217 -1.58931 1 0 1 1 0 0 +EDGE2 2012 2011 -0.953108 0.0135975 0.0299713 1 0 1 1 0 0 +EDGE2 2013 2012 -1.08004 0.0101901 -0.0191886 1 0 1 1 0 0 +EDGE2 2014 2013 -0.896443 0.0700767 -0.0157352 1 0 1 1 0 0 +EDGE2 2015 2014 -1.01383 0.00596184 -0.00901969 1 0 1 1 0 0 +EDGE2 2016 2015 -1.05566 -0.0720228 1.57461 1 0 1 1 0 0 +EDGE2 2017 2016 -0.996657 -0.0580298 0.0212475 1 0 1 1 0 0 +EDGE2 2018 2017 -1.02126 -0.0525167 -0.00246928 1 0 1 1 0 0 +EDGE2 2019 2018 -1.07095 0.00424662 -0.000571737 1 0 1 1 0 0 +EDGE2 2020 2019 -0.974978 0.0683737 0.0115495 1 0 1 1 0 0 +EDGE2 2021 2020 -1.0224 0.00545924 -1.55022 1 0 1 1 0 0 +EDGE2 2022 2021 -0.93369 -0.0720647 -0.0111007 1 0 1 1 0 0 +EDGE2 2023 2022 -0.891795 0.0678456 -0.0134894 1 0 1 1 0 0 +EDGE2 2024 2023 -0.92219 0.0205852 0.0148953 1 0 1 1 0 0 +EDGE2 2025 2024 -0.989427 -0.0474381 -0.0113209 1 0 1 1 0 0 +EDGE2 2026 2025 -1.06307 0.00217862 -1.58854 1 0 1 1 0 0 +EDGE2 2027 2026 -1.03087 0.0852776 0.0164415 1 0 1 1 0 0 +EDGE2 2028 2027 -1.04948 -0.0192385 0.0214181 1 0 1 1 0 0 +EDGE2 2029 2028 -1.07877 -0.0576971 -0.00977899 1 0 1 1 0 0 +EDGE2 2029 1770 0.967999 0.068146 -3.1459 1 0 1 1 0 0 +EDGE2 2030 2029 -1.0711 0.0793798 0.00827537 1 0 1 1 0 0 +EDGE2 2030 1770 -0.123098 0.0633544 -3.16166 1 0 1 1 0 0 +EDGE2 2030 1771 0.0515934 -1.04544 -1.55233 1 0 1 1 0 0 +EDGE2 2030 1769 1.04109 -0.0316559 -3.13415 1 0 1 1 0 0 +EDGE2 2031 1770 -1.07055 -0.0662899 -1.5828 1 0 1 1 0 0 +EDGE2 2031 2030 -0.995306 0.0415322 1.56804 1 0 1 1 0 0 +EDGE2 2031 1771 -0.00946214 -0.0364417 0.0106513 1 0 1 1 0 0 +EDGE2 2031 1772 1.06457 0.0331958 0.00722261 1 0 1 1 0 0 +EDGE2 2032 2031 -1.1349 -0.0164872 0.00476837 1 0 1 1 0 0 +EDGE2 2032 1771 -1.06965 -0.0186978 -0.00491418 1 0 1 1 0 0 +EDGE2 2032 1772 -0.0388556 0.0117188 0.0207303 1 0 1 1 0 0 +EDGE2 2032 1773 1.05593 -0.0637715 0.00746517 1 0 1 1 0 0 +EDGE2 2033 2032 -0.874984 0.0170643 0.0221874 1 0 1 1 0 0 +EDGE2 2033 1772 -1.02996 -0.0163435 -0.0235294 1 0 1 1 0 0 +EDGE2 2033 1773 -0.0274608 -0.00322703 0.0251846 1 0 1 1 0 0 +EDGE2 2033 1774 0.980111 -0.0052702 0.00889805 1 0 1 1 0 0 +EDGE2 2034 2033 -0.963029 -0.0441092 0.0523526 1 0 1 1 0 0 +EDGE2 2034 1773 -1.01845 -0.0505867 0.0507416 1 0 1 1 0 0 +EDGE2 2034 1774 0.0279049 -0.0178085 -0.02987 1 0 1 1 0 0 +EDGE2 2034 1775 1.0264 -0.0355689 -0.000497515 1 0 1 1 0 0 +EDGE2 2035 1776 -0.0640509 -0.902337 -1.57023 1 0 1 1 0 0 +EDGE2 2035 2034 -1.02106 -0.070849 0.0246275 1 0 1 1 0 0 +EDGE2 2035 1774 -1.01843 -0.0134186 -8.64777e-05 1 0 1 1 0 0 +EDGE2 2035 1775 -0.0290819 0.0280257 0.0198529 1 0 1 1 0 0 +EDGE2 2036 1777 0.953461 0.0236675 0.00596518 1 0 1 1 0 0 +EDGE2 2036 1776 0.00339603 0.0654598 -0.0181787 1 0 1 1 0 0 +EDGE2 2036 1775 -1.14822 -0.0929821 1.59057 1 0 1 1 0 0 +EDGE2 2036 2035 -0.995973 0.00665597 1.55615 1 0 1 1 0 0 +EDGE2 2037 1777 -0.0535354 0.113399 0.0242554 1 0 1 1 0 0 +EDGE2 2037 1778 0.942548 0.036213 0.0104191 1 0 1 1 0 0 +EDGE2 2037 2036 -0.96758 -0.0425252 -0.06032 1 0 1 1 0 0 +EDGE2 2037 1776 -1.03944 -0.00510044 -0.0159673 1 0 1 1 0 0 +EDGE2 2038 1779 0.957235 0.0325813 -0.00633615 1 0 1 1 0 0 +EDGE2 2038 1777 -0.987534 -0.0566181 -0.0150573 1 0 1 1 0 0 +EDGE2 2038 1778 -0.0754735 -0.000374015 -0.00628783 1 0 1 1 0 0 +EDGE2 2038 2037 -0.963496 0.0665324 -0.0143932 1 0 1 1 0 0 +EDGE2 2039 1780 1.01735 0.023788 -0.011127 1 0 1 1 0 0 +EDGE2 2039 1779 0.0365986 0.0654214 -0.0100751 1 0 1 1 0 0 +EDGE2 2039 1778 -1.02529 0.031823 -0.0307551 1 0 1 1 0 0 +EDGE2 2039 2038 -0.908965 -0.0479803 0.0120974 1 0 1 1 0 0 +EDGE2 2040 1780 -0.0310481 0.0546532 0.0196571 1 0 1 1 0 0 +EDGE2 2040 1781 0.0211393 0.842227 1.54761 1 0 1 1 0 0 +EDGE2 2040 2039 -0.967474 0.0271121 -0.0244794 1 0 1 1 0 0 +EDGE2 2040 1779 -1.05953 -0.0104829 0.0132364 1 0 1 1 0 0 +EDGE2 2041 2040 -1.00599 0.0236894 -1.59488 1 0 1 1 0 0 +EDGE2 2041 1780 -0.982786 0.0306551 -1.58377 1 0 1 1 0 0 +EDGE2 2041 1782 1.03618 0.0308659 0.0238998 1 0 1 1 0 0 +EDGE2 2041 1781 0.000614444 -0.100052 -0.00943012 1 0 1 1 0 0 +EDGE2 2042 2041 -1.0258 0.00400385 -0.00537019 1 0 1 1 0 0 +EDGE2 2042 1783 1.00123 -0.0177265 -0.000172465 1 0 1 1 0 0 +EDGE2 2042 1782 0.00375248 0.0720451 0.0629422 1 0 1 1 0 0 +EDGE2 2042 1781 -1.04939 0.067213 -0.035484 1 0 1 1 0 0 +EDGE2 2043 1783 0.0561227 0.0280287 -0.0276663 1 0 1 1 0 0 +EDGE2 2043 1782 -1.04549 0.00232141 -0.0155548 1 0 1 1 0 0 +EDGE2 2043 2042 -1.03689 0.0724666 0.0275124 1 0 1 1 0 0 +EDGE2 2043 1784 1.01978 0.075081 -0.0103745 1 0 1 1 0 0 +EDGE2 2044 1785 0.980821 0.012924 -0.0241203 1 0 1 1 0 0 +EDGE2 2044 1783 -0.993741 -0.0969244 0.018102 1 0 1 1 0 0 +EDGE2 2044 2043 -0.985662 -0.0827185 0.00706955 1 0 1 1 0 0 +EDGE2 2044 1784 0.0831068 0.0541412 0.0233084 1 0 1 1 0 0 +EDGE2 2045 1785 -0.0335675 0.0403073 0.00334599 1 0 1 1 0 0 +EDGE2 2045 1784 -0.948263 0.058277 0.0180606 1 0 1 1 0 0 +EDGE2 2045 2044 -0.994602 -0.0850844 0.0123895 1 0 1 1 0 0 +EDGE2 2045 1786 -0.0294208 0.987414 1.57833 1 0 1 1 0 0 +EDGE2 2046 1785 -1.0343 0.00223982 -1.5811 1 0 1 1 0 0 +EDGE2 2046 2045 -0.997694 0.0583974 -1.56846 1 0 1 1 0 0 +EDGE2 2046 1786 0.173562 0.000890702 -0.043669 1 0 1 1 0 0 +EDGE2 2046 1787 1.00324 -0.0592487 -0.000878246 1 0 1 1 0 0 +EDGE2 2047 2046 -1.03217 -0.0497853 0.0140985 1 0 1 1 0 0 +EDGE2 2047 1786 -0.998089 0.00841728 -0.0122077 1 0 1 1 0 0 +EDGE2 2047 1787 -0.0603566 0.0187924 -0.0444903 1 0 1 1 0 0 +EDGE2 2047 1788 0.997145 -0.0253479 -0.00454542 1 0 1 1 0 0 +EDGE2 2048 2047 -0.975925 0.00988346 -0.00535406 1 0 1 1 0 0 +EDGE2 2048 1787 -0.940616 0.0442035 0.0207154 1 0 1 1 0 0 +EDGE2 2048 1788 -0.0342827 0.0211036 0.0244036 1 0 1 1 0 0 +EDGE2 2048 1789 0.975748 0.0754369 -0.0120463 1 0 1 1 0 0 +EDGE2 2049 1788 -0.835679 0.0597856 0.0192458 1 0 1 1 0 0 +EDGE2 2049 2048 -1.09447 0.0201956 0.0384902 1 0 1 1 0 0 +EDGE2 2049 1789 0.0543556 0.0448541 0.020531 1 0 1 1 0 0 +EDGE2 2049 1790 1.02458 -0.0285454 0.0282421 1 0 1 1 0 0 +EDGE2 2050 2049 -1.02097 0.0695105 -0.013078 1 0 1 1 0 0 +EDGE2 2050 1789 -1.0275 -0.13845 -0.0451069 1 0 1 1 0 0 +EDGE2 2050 1790 -0.097085 -0.0397978 -0.0247852 1 0 1 1 0 0 +EDGE2 2050 1791 0.0612813 -0.987131 -1.56313 1 0 1 1 0 0 +EDGE2 2051 1790 -0.915634 -0.0355756 -1.5353 1 0 1 1 0 0 +EDGE2 2051 2050 -1.00488 0.146157 -1.55822 1 0 1 1 0 0 +EDGE2 2052 2051 -0.991211 -0.00747156 -0.0112594 1 0 1 1 0 0 +EDGE2 2053 2052 -0.922185 -0.0289034 -0.00241388 1 0 1 1 0 0 +EDGE2 2054 1775 0.958119 -0.0154867 -3.16906 1 0 1 1 0 0 +EDGE2 2054 2035 1.02775 -0.0786035 -3.118 1 0 1 1 0 0 +EDGE2 2054 2053 -1.08205 0.0196614 0.00947661 1 0 1 1 0 0 +EDGE2 2055 2036 -0.0148165 0.917164 1.58725 1 0 1 1 0 0 +EDGE2 2055 1776 0.0238426 1.00587 1.57361 1 0 1 1 0 0 +EDGE2 2055 2034 1.03926 -0.0309316 -3.12616 1 0 1 1 0 0 +EDGE2 2055 1774 1.04248 0.0593676 -3.14517 1 0 1 1 0 0 +EDGE2 2055 1775 -0.0165248 -0.00121127 -3.14973 1 0 1 1 0 0 +EDGE2 2055 2035 0.028645 0.0467519 -3.11392 1 0 1 1 0 0 +EDGE2 2055 2054 -1.01589 -0.019704 0.0218409 1 0 1 1 0 0 +EDGE2 2056 2055 -1.01486 0.0358103 1.56314 1 0 1 1 0 0 +EDGE2 2056 1775 -0.991707 0.0514897 -1.59705 1 0 1 1 0 0 +EDGE2 2056 2035 -1.0401 -0.00222917 -1.56289 1 0 1 1 0 0 +EDGE2 2057 2056 -0.939123 -0.0226298 0.00308783 1 0 1 1 0 0 +EDGE2 2058 2057 -0.969267 -0.0067039 0.0288785 1 0 1 1 0 0 +EDGE2 2059 2058 -0.889201 -0.0291386 -0.022108 1 0 1 1 0 0 +EDGE2 2059 1420 1.06908 -0.0164726 -3.16386 1 0 1 1 0 0 +EDGE2 2059 1440 1.14583 0.119619 -3.14532 1 0 1 1 0 0 +EDGE2 2059 1760 1.05482 0.00124285 -3.14953 1 0 1 1 0 0 +EDGE2 2059 1400 1.03361 -0.0139075 -3.13343 1 0 1 1 0 0 +EDGE2 2060 2059 -0.985138 -0.0620855 -0.00221214 1 0 1 1 0 0 +EDGE2 2060 1761 0.0629754 1.01857 1.56725 1 0 1 1 0 0 +EDGE2 2060 1420 0.0140972 -0.0740095 -3.12269 1 0 1 1 0 0 +EDGE2 2060 1440 -0.0478367 0.0884543 -3.17249 1 0 1 1 0 0 +EDGE2 2060 1760 -0.0454953 -0.0243298 -3.12816 1 0 1 1 0 0 +EDGE2 2060 1400 -0.070771 -0.0379852 -3.12716 1 0 1 1 0 0 +EDGE2 2060 1421 0.0768222 -0.988457 -1.56769 1 0 1 1 0 0 +EDGE2 2060 1441 -0.0324256 -0.963688 -1.57423 1 0 1 1 0 0 +EDGE2 2060 1401 0.0207538 -0.997749 -1.59414 1 0 1 1 0 0 +EDGE2 2060 1419 1.00729 -0.0517186 -3.14537 1 0 1 1 0 0 +EDGE2 2060 1759 1.10585 -0.0242619 -3.13363 1 0 1 1 0 0 +EDGE2 2060 1439 0.920979 0.0155862 -3.1729 1 0 1 1 0 0 +EDGE2 2060 1399 1.00389 0.0943357 -3.16566 1 0 1 1 0 0 +EDGE2 2061 2060 -1.03449 -0.0398276 -1.5722 1 0 1 1 0 0 +EDGE2 2061 1761 -0.0115611 0.0270517 0.0291157 1 0 1 1 0 0 +EDGE2 2061 1762 0.997926 0.0813552 -0.0128885 1 0 1 1 0 0 +EDGE2 2061 1420 -1.0343 0.00257509 1.58862 1 0 1 1 0 0 +EDGE2 2061 1440 -1.00197 0.135559 1.58379 1 0 1 1 0 0 +EDGE2 2061 1760 -0.990688 -0.0451239 1.54473 1 0 1 1 0 0 +EDGE2 2061 1400 -0.940917 -0.0326099 1.59143 1 0 1 1 0 0 +EDGE2 2062 1763 0.967165 0.00451729 -0.0170611 1 0 1 1 0 0 +EDGE2 2062 1761 -1.06771 -0.0470619 0.00766485 1 0 1 1 0 0 +EDGE2 2062 1762 0.0137865 0.0426439 -0.00735555 1 0 1 1 0 0 +EDGE2 2062 2061 -1.05584 0.0180965 0.00971573 1 0 1 1 0 0 +EDGE2 2063 2062 -1.05063 -0.00297552 -0.00807575 1 0 1 1 0 0 +EDGE2 2063 1764 1.07555 -0.0183806 -0.0101581 1 0 1 1 0 0 +EDGE2 2063 1763 -0.060543 -0.0764637 0.0258011 1 0 1 1 0 0 +EDGE2 2063 1762 -0.907638 0.0115591 0.0191108 1 0 1 1 0 0 +EDGE2 2064 1765 1.03686 0.0500381 0.0010458 1 0 1 1 0 0 +EDGE2 2064 2063 -1.08182 -0.0656002 0.0326008 1 0 1 1 0 0 +EDGE2 2064 1764 0.026534 -0.0194485 0.0205132 1 0 1 1 0 0 +EDGE2 2064 1763 -1.02745 -0.0435062 0.00220158 1 0 1 1 0 0 +EDGE2 2065 1766 -0.0477212 1.06117 1.52948 1 0 1 1 0 0 +EDGE2 2065 1765 -0.106607 0.0630137 -0.0146243 1 0 1 1 0 0 +EDGE2 2065 1764 -0.965799 0.0502871 -0.0298033 1 0 1 1 0 0 +EDGE2 2065 2064 -0.958347 -0.00109041 0.0311193 1 0 1 1 0 0 +EDGE2 2066 1767 0.993505 0.039821 0.000415005 1 0 1 1 0 0 +EDGE2 2066 1766 -0.0662006 0.0555204 -0.018927 1 0 1 1 0 0 +EDGE2 2066 1765 -0.983816 -0.0566976 -1.55691 1 0 1 1 0 0 +EDGE2 2066 2065 -1.01138 0.0872851 -1.56971 1 0 1 1 0 0 +EDGE2 2067 1768 0.99253 0.0337096 0.0135959 1 0 1 1 0 0 +EDGE2 2067 2066 -1.02827 -0.0442953 -0.0153743 1 0 1 1 0 0 +EDGE2 2067 1767 -0.0233624 0.0363088 0.0351678 1 0 1 1 0 0 +EDGE2 2067 1766 -1.02767 0.0829028 0.0221758 1 0 1 1 0 0 +EDGE2 2068 1768 -0.0332521 0.0327259 -0.0116608 1 0 1 1 0 0 +EDGE2 2068 1769 0.915822 0.027828 -0.00593092 1 0 1 1 0 0 +EDGE2 2068 1767 -1.00888 -0.0579279 -0.0119738 1 0 1 1 0 0 +EDGE2 2068 2067 -0.9876 -0.0337532 0.00619463 1 0 1 1 0 0 +EDGE2 2069 1770 1.02642 -0.0018706 0.0256941 1 0 1 1 0 0 +EDGE2 2069 2030 1.03917 -0.0340685 -3.09948 1 0 1 1 0 0 +EDGE2 2069 1768 -0.9268 -0.114679 0.00281193 1 0 1 1 0 0 +EDGE2 2069 1769 0.0297113 0.101166 -0.0111856 1 0 1 1 0 0 +EDGE2 2069 2068 -1.03303 -0.0696943 0.0156443 1 0 1 1 0 0 +EDGE2 2070 2031 -0.0603162 0.903253 1.56407 1 0 1 1 0 0 +EDGE2 2070 2029 1.04505 0.0185718 -3.17918 1 0 1 1 0 0 +EDGE2 2070 1770 0.0797658 -0.0609547 -0.00789907 1 0 1 1 0 0 +EDGE2 2070 2030 -0.0227819 0.0249908 -3.17037 1 0 1 1 0 0 +EDGE2 2070 1771 -0.0495957 0.986278 1.55011 1 0 1 1 0 0 +EDGE2 2070 1769 -0.978248 0.0501513 -0.0124575 1 0 1 1 0 0 +EDGE2 2070 2069 -0.945721 -0.0356467 -0.0359115 1 0 1 1 0 0 +EDGE2 2071 1770 -1.02439 -0.0379379 1.60636 1 0 1 1 0 0 +EDGE2 2071 2070 -1.02528 -0.0261553 1.57218 1 0 1 1 0 0 +EDGE2 2071 2030 -1.03825 -0.0309083 -1.57313 1 0 1 1 0 0 +EDGE2 2072 2071 -1.06459 -0.0247827 0.0572766 1 0 1 1 0 0 +EDGE2 2073 2072 -1.02415 -0.0219612 -0.0137681 1 0 1 1 0 0 +EDGE2 2074 2015 0.946428 0.0858099 -3.14087 1 0 1 1 0 0 +EDGE2 2074 2073 -0.995779 0.0602983 -0.0126323 1 0 1 1 0 0 +EDGE2 2075 2016 0.0452614 1.00445 1.57075 1 0 1 1 0 0 +EDGE2 2075 2015 -0.02969 0.0232956 -3.1257 1 0 1 1 0 0 +EDGE2 2075 2014 0.949928 -0.0776795 -3.16554 1 0 1 1 0 0 +EDGE2 2075 2074 -1.00756 -0.00994239 -0.0130642 1 0 1 1 0 0 +EDGE2 2076 2016 0.0106835 0.0152889 -0.00761726 1 0 1 1 0 0 +EDGE2 2076 2017 0.938967 0.0835077 -0.0154862 1 0 1 1 0 0 +EDGE2 2076 2015 -1.03568 -0.0040363 1.55059 1 0 1 1 0 0 +EDGE2 2076 2075 -1.00416 0.0240805 -1.57658 1 0 1 1 0 0 +EDGE2 2077 2018 1.01641 0.0942926 -0.0104861 1 0 1 1 0 0 +EDGE2 2077 2016 -1.07138 0.0139981 -0.0053017 1 0 1 1 0 0 +EDGE2 2077 2076 -1.0347 0.0640575 0.0247952 1 0 1 1 0 0 +EDGE2 2077 2017 0.00443803 0.0303773 -0.0126026 1 0 1 1 0 0 +EDGE2 2078 2019 1.05588 0.0480312 0.0109495 1 0 1 1 0 0 +EDGE2 2078 2077 -1.04494 -0.0312114 0.0188329 1 0 1 1 0 0 +EDGE2 2078 2018 -0.0475315 0.00977904 0.0140201 1 0 1 1 0 0 +EDGE2 2078 2017 -1.0194 0.0108486 0.00119066 1 0 1 1 0 0 +EDGE2 2079 2020 0.969797 0.0118314 -0.0319542 1 0 1 1 0 0 +EDGE2 2079 2019 0.0544526 0.00637056 -0.0113196 1 0 1 1 0 0 +EDGE2 2079 2018 -0.938811 0.0959782 -0.00454566 1 0 1 1 0 0 +EDGE2 2079 2078 -0.983424 -0.00109953 0.00967375 1 0 1 1 0 0 +EDGE2 2080 2020 0.0382977 -0.0487556 -0.00282434 1 0 1 1 0 0 +EDGE2 2080 2021 -0.0508546 1.09183 1.58755 1 0 1 1 0 0 +EDGE2 2080 2019 -0.995685 -0.0663734 -0.0358309 1 0 1 1 0 0 +EDGE2 2080 2079 -0.982326 0.0640078 0.0103493 1 0 1 1 0 0 +EDGE2 2081 2080 -1.04442 0.0452242 1.57636 1 0 1 1 0 0 +EDGE2 2081 2020 -0.993922 -0.0187882 1.62775 1 0 1 1 0 0 +EDGE2 2082 2081 -1.0596 0.010659 0.011535 1 0 1 1 0 0 +EDGE2 2083 2082 -0.906978 -0.000653896 -0.013822 1 0 1 1 0 0 +EDGE2 2084 2083 -1.00137 -0.0431951 -0.000280403 1 0 1 1 0 0 +EDGE2 2085 2084 -0.997526 0.0715798 -0.0102786 1 0 1 1 0 0 +EDGE2 2086 2085 -0.949443 -0.0803269 -1.54672 1 0 1 1 0 0 +EDGE2 2087 2086 -0.983397 0.0289306 0.000320479 1 0 1 1 0 0 +EDGE2 2088 2087 -1.01432 -0.0149881 -0.00430255 1 0 1 1 0 0 +EDGE2 2089 2088 -1.04001 -0.104707 0.038126 1 0 1 1 0 0 +EDGE2 2090 2089 -1.01943 -0.0182081 0.0111493 1 0 1 1 0 0 +EDGE2 2091 2090 -1.03675 -0.0136034 -1.58693 1 0 1 1 0 0 +EDGE2 2092 2091 -0.997326 0.0530856 0.019151 1 0 1 1 0 0 +EDGE2 2093 2092 -0.978746 0.0130074 0.00309445 1 0 1 1 0 0 +EDGE2 2094 2093 -0.97374 0.0602275 0.00545233 1 0 1 1 0 0 +EDGE2 2095 2094 -0.977473 0.0365923 0.0130362 1 0 1 1 0 0 +EDGE2 2096 2095 -1.02878 -0.0058538 -1.58979 1 0 1 1 0 0 +EDGE2 2097 2096 -1.05116 0.0535416 0.0150216 1 0 1 1 0 0 +EDGE2 2098 2097 -1.05758 -0.0377664 -0.00478365 1 0 1 1 0 0 +EDGE2 2099 2098 -0.921447 0.0907143 -0.0431315 1 0 1 1 0 0 +EDGE2 2099 2080 1.04098 0.0958132 -3.15192 1 0 1 1 0 0 +EDGE2 2099 2020 1.03273 0.0284017 -3.12157 1 0 1 1 0 0 +EDGE2 2100 2099 -1.0209 -0.0533693 0.00107134 1 0 1 1 0 0 +EDGE2 2100 2081 -0.00318037 1.00612 1.57035 1 0 1 1 0 0 +EDGE2 2100 2080 0.0315764 0.0228992 -3.14217 1 0 1 1 0 0 +EDGE2 2100 2020 -0.0158957 0.00581737 -3.15852 1 0 1 1 0 0 +EDGE2 2100 2021 0.0668871 -0.999669 -1.57278 1 0 1 1 0 0 +EDGE2 2100 2019 0.893119 -0.0868503 -3.18094 1 0 1 1 0 0 +EDGE2 2100 2079 0.990828 0.0960552 -3.15223 1 0 1 1 0 0 +EDGE2 2101 2100 -1.0187 0.0558712 1.57662 1 0 1 1 0 0 +EDGE2 2101 2080 -1.00299 0.00951651 -1.5843 1 0 1 1 0 0 +EDGE2 2101 2020 -1.07329 -0.00712989 -1.57938 1 0 1 1 0 0 +EDGE2 2101 2021 0.0789636 -0.0324057 -0.0145084 1 0 1 1 0 0 +EDGE2 2101 2022 1.0175 0.0443666 0.0333774 1 0 1 1 0 0 +EDGE2 2102 2101 -1.0428 0.0550618 -0.0160629 1 0 1 1 0 0 +EDGE2 2102 2021 -0.899866 0.0469046 0.00370307 1 0 1 1 0 0 +EDGE2 2102 2023 1.06493 0.00435909 0.0119902 1 0 1 1 0 0 +EDGE2 2102 2022 -0.0712344 0.0416546 -0.0254352 1 0 1 1 0 0 +EDGE2 2103 2102 -1.00432 0.0165683 0.021372 1 0 1 1 0 0 +EDGE2 2103 2024 1.00618 0.0563597 0.00507582 1 0 1 1 0 0 +EDGE2 2103 2023 -0.0189139 0.0696508 0.012861 1 0 1 1 0 0 +EDGE2 2103 2022 -1.0132 -0.0960378 -0.00568916 1 0 1 1 0 0 +EDGE2 2104 2024 0.000929314 -0.0960501 0.00342037 1 0 1 1 0 0 +EDGE2 2104 2023 -1.03131 0.0262795 -0.0384026 1 0 1 1 0 0 +EDGE2 2104 2103 -0.999082 -0.0785599 0.00135257 1 0 1 1 0 0 +EDGE2 2104 2025 0.985822 -0.0321817 -0.012578 1 0 1 1 0 0 +EDGE2 2105 2024 -1.07171 0.0105375 0.00323863 1 0 1 1 0 0 +EDGE2 2105 2104 -1.05713 0.129464 -0.00697857 1 0 1 1 0 0 +EDGE2 2105 2025 -0.0459595 -0.00309112 -0.00659904 1 0 1 1 0 0 +EDGE2 2105 2026 -0.0613073 0.972987 1.58181 1 0 1 1 0 0 +EDGE2 2106 2025 -1.05568 0.0461021 -1.57687 1 0 1 1 0 0 +EDGE2 2106 2105 -0.906828 -0.0416259 -1.5522 1 0 1 1 0 0 +EDGE2 2106 2026 0.0261111 -0.0549369 0.00629152 1 0 1 1 0 0 +EDGE2 2106 2027 0.992279 0.0263013 0.00583394 1 0 1 1 0 0 +EDGE2 2107 2026 -1.07114 0.078895 -0.0365612 1 0 1 1 0 0 +EDGE2 2107 2106 -1.05631 0.0398823 0.0150475 1 0 1 1 0 0 +EDGE2 2107 2027 0.0850887 -0.0135173 0.0181402 1 0 1 1 0 0 +EDGE2 2107 2028 1.03558 0.0497051 -0.00868987 1 0 1 1 0 0 +EDGE2 2108 2107 -1.04433 -0.0324162 -0.0152061 1 0 1 1 0 0 +EDGE2 2108 2027 -1.05473 -0.0915844 0.0232383 1 0 1 1 0 0 +EDGE2 2108 2028 -0.0185194 -0.000138477 0.00516703 1 0 1 1 0 0 +EDGE2 2108 2029 1.06182 0.0770012 0.0444138 1 0 1 1 0 0 +EDGE2 2109 2108 -0.962206 0.0186153 -0.0558167 1 0 1 1 0 0 +EDGE2 2109 2028 -0.994119 0.00618134 -0.000843716 1 0 1 1 0 0 +EDGE2 2109 2029 0.0464099 0.0144496 -0.0267033 1 0 1 1 0 0 +EDGE2 2109 1770 0.988552 -0.0133305 -3.13171 1 0 1 1 0 0 +EDGE2 2109 2070 1.03989 0.00807797 -3.11479 1 0 1 1 0 0 +EDGE2 2109 2030 1.02089 -0.0153217 0.0326151 1 0 1 1 0 0 +EDGE2 2110 2031 0.0258275 -1.03771 -1.55293 1 0 1 1 0 0 +EDGE2 2110 2029 -1.06614 0.00313968 0.0260195 1 0 1 1 0 0 +EDGE2 2110 2109 -1.02282 -0.0505576 0.00717995 1 0 1 1 0 0 +EDGE2 2110 2071 0.0611085 1.04181 1.60337 1 0 1 1 0 0 +EDGE2 2110 1770 0.0105189 -0.0288034 -3.12218 1 0 1 1 0 0 +EDGE2 2110 2070 -0.00847093 0.0297351 -3.16236 1 0 1 1 0 0 +EDGE2 2110 2030 -0.0508154 -0.0178504 -0.00910175 1 0 1 1 0 0 +EDGE2 2110 1771 -0.072305 -0.920753 -1.59436 1 0 1 1 0 0 +EDGE2 2110 1769 1.00332 0.0777116 -3.15547 1 0 1 1 0 0 +EDGE2 2110 2069 0.92056 0.00548391 -3.18558 1 0 1 1 0 0 +EDGE2 2111 2031 -0.0430175 -0.0292216 -0.036832 1 0 1 1 0 0 +EDGE2 2111 1770 -0.996328 -0.0247599 -1.55214 1 0 1 1 0 0 +EDGE2 2111 2070 -1.0053 0.0323561 -1.53532 1 0 1 1 0 0 +EDGE2 2111 2110 -1.01301 -0.0697333 1.55577 1 0 1 1 0 0 +EDGE2 2111 2030 -0.959948 0.0140808 1.56886 1 0 1 1 0 0 +EDGE2 2111 2032 1.04136 -0.0580931 -0.011089 1 0 1 1 0 0 +EDGE2 2111 1771 -0.0431852 0.000138957 -0.0368417 1 0 1 1 0 0 +EDGE2 2111 1772 1.0177 -0.0353598 0.00886801 1 0 1 1 0 0 +EDGE2 2112 2031 -1.02295 -0.000123469 -0.00125891 1 0 1 1 0 0 +EDGE2 2112 2111 -0.97377 0.0656096 0.0260466 1 0 1 1 0 0 +EDGE2 2112 2033 1.00376 0.0893618 0.0234729 1 0 1 1 0 0 +EDGE2 2112 2032 0.0948292 0.0332026 -0.0711405 1 0 1 1 0 0 +EDGE2 2112 1771 -0.95973 -0.0411265 0.0288917 1 0 1 1 0 0 +EDGE2 2112 1772 0.0221755 0.016046 0.00997619 1 0 1 1 0 0 +EDGE2 2112 1773 1.01112 -0.0152292 -0.039941 1 0 1 1 0 0 +EDGE2 2113 2033 0.0214689 -0.0218814 -0.0264728 1 0 1 1 0 0 +EDGE2 2113 2032 -1.08412 -0.00182486 0.00476743 1 0 1 1 0 0 +EDGE2 2113 2112 -1.00054 0.0446813 -0.0117084 1 0 1 1 0 0 +EDGE2 2113 1772 -0.965657 0.00663901 0.0202458 1 0 1 1 0 0 +EDGE2 2113 2034 0.957448 0.0699906 -0.00202312 1 0 1 1 0 0 +EDGE2 2113 1773 0.0415163 -0.0424298 0.00485451 1 0 1 1 0 0 +EDGE2 2113 1774 1.07321 -0.0192271 -0.0143044 1 0 1 1 0 0 +EDGE2 2114 2055 1.04904 -0.0207354 -3.12047 1 0 1 1 0 0 +EDGE2 2114 2033 -0.946869 0.0062116 -0.00686742 1 0 1 1 0 0 +EDGE2 2114 2113 -1.00167 -0.0568069 -0.0161574 1 0 1 1 0 0 +EDGE2 2114 2034 0.0424024 0.0492294 -0.00336042 1 0 1 1 0 0 +EDGE2 2114 1773 -0.950496 -0.0380122 -0.0219629 1 0 1 1 0 0 +EDGE2 2114 1774 -0.0735037 0.0364226 0.0183374 1 0 1 1 0 0 +EDGE2 2114 1775 0.978579 0.0248006 0.0315569 1 0 1 1 0 0 +EDGE2 2114 2035 0.996272 -0.0556722 0.0036541 1 0 1 1 0 0 +EDGE2 2115 2036 -0.0392524 -1.03163 -1.57703 1 0 1 1 0 0 +EDGE2 2115 1776 0.0848339 -0.952973 -1.57008 1 0 1 1 0 0 +EDGE2 2115 2055 -0.0728618 -0.00111868 -3.16889 1 0 1 1 0 0 +EDGE2 2115 2034 -1.05858 0.0617278 -0.0313116 1 0 1 1 0 0 +EDGE2 2115 2114 -1.06255 0.0117029 0.00134959 1 0 1 1 0 0 +EDGE2 2115 1774 -1.01801 -0.0505351 0.00356831 1 0 1 1 0 0 +EDGE2 2115 1775 0.0379211 0.00148825 0.0261973 1 0 1 1 0 0 +EDGE2 2115 2035 -0.00327963 0.0484166 -0.00645236 1 0 1 1 0 0 +EDGE2 2115 2056 0.0168224 0.98751 1.59045 1 0 1 1 0 0 +EDGE2 2115 2054 0.942327 -0.0209194 -3.12021 1 0 1 1 0 0 +EDGE2 2116 2055 -0.979648 0.000118157 1.59241 1 0 1 1 0 0 +EDGE2 2116 2115 -1.0621 0.0303404 -1.59426 1 0 1 1 0 0 +EDGE2 2116 1775 -0.957428 -0.011067 -1.54968 1 0 1 1 0 0 +EDGE2 2116 2035 -1.019 0.00419893 -1.56731 1 0 1 1 0 0 +EDGE2 2116 2056 -0.0323181 0.0827865 0.00496588 1 0 1 1 0 0 +EDGE2 2116 2057 0.968697 0.00522441 0.000371984 1 0 1 1 0 0 +EDGE2 2117 2116 -1.02897 0.0507525 -3.15061e-05 1 0 1 1 0 0 +EDGE2 2117 2056 -1.06016 0.0472808 -0.0131717 1 0 1 1 0 0 +EDGE2 2117 2057 0.0877517 -0.0109193 0.0122564 1 0 1 1 0 0 +EDGE2 2117 2058 1.06836 0.00910208 -0.0110186 1 0 1 1 0 0 +EDGE2 2118 2117 -0.963754 0.095809 0.0132844 1 0 1 1 0 0 +EDGE2 2118 2057 -0.957014 -0.00407833 -0.00268461 1 0 1 1 0 0 +EDGE2 2118 2058 -0.0335061 0.00153255 0.0137327 1 0 1 1 0 0 +EDGE2 2118 2059 0.998088 0.0796098 0.00790634 1 0 1 1 0 0 +EDGE2 2119 2118 -1.0618 -0.00793034 0.0322613 1 0 1 1 0 0 +EDGE2 2119 2058 -1.03658 -0.0245791 -0.0106727 1 0 1 1 0 0 +EDGE2 2119 2059 0.00747888 0.0768782 -0.0342538 1 0 1 1 0 0 +EDGE2 2119 2060 0.952697 -0.0333444 -0.0163433 1 0 1 1 0 0 +EDGE2 2119 1420 1.02695 0.0623987 -3.16454 1 0 1 1 0 0 +EDGE2 2119 1440 1.11282 0.085876 -3.13355 1 0 1 1 0 0 +EDGE2 2119 1760 1.03036 -0.0279408 -3.13564 1 0 1 1 0 0 +EDGE2 2119 1400 1.01036 -0.0248991 -3.16753 1 0 1 1 0 0 +EDGE2 2120 2119 -0.995385 0.0212753 -0.00523411 1 0 1 1 0 0 +EDGE2 2120 2059 -1.02647 0.0276763 0.0233169 1 0 1 1 0 0 +EDGE2 2120 2060 0.0233956 -0.010295 -0.0386243 1 0 1 1 0 0 +EDGE2 2120 1761 0.0143282 1.02949 1.56184 1 0 1 1 0 0 +EDGE2 2120 2061 0.129479 1.00342 1.60582 1 0 1 1 0 0 +EDGE2 2120 1420 -0.0445815 -0.0314426 -3.13767 1 0 1 1 0 0 +EDGE2 2120 1440 0.0751796 -0.0173639 -3.11964 1 0 1 1 0 0 +EDGE2 2120 1760 -0.0672784 0.0624051 -3.17418 1 0 1 1 0 0 +EDGE2 2120 1400 0.0623975 -0.0766294 -3.15116 1 0 1 1 0 0 +EDGE2 2120 1421 0.0678818 -1.11881 -1.57456 1 0 1 1 0 0 +EDGE2 2120 1441 -0.00699511 -0.984132 -1.56019 1 0 1 1 0 0 +EDGE2 2120 1401 0.0148432 -1.01822 -1.57649 1 0 1 1 0 0 +EDGE2 2120 1419 0.956802 -0.0478142 -3.1864 1 0 1 1 0 0 +EDGE2 2120 1759 1.01996 -0.0871324 -3.12208 1 0 1 1 0 0 +EDGE2 2120 1439 0.970511 -0.0368245 -3.17482 1 0 1 1 0 0 +EDGE2 2120 1399 0.922125 0.00692366 -3.10654 1 0 1 1 0 0 +EDGE2 2121 2062 0.95723 -0.0609666 -0.0107413 1 0 1 1 0 0 +EDGE2 2121 2060 -0.966137 0.0890762 -1.56605 1 0 1 1 0 0 +EDGE2 2121 1761 -0.0448875 -0.0962443 0.0239125 1 0 1 1 0 0 +EDGE2 2121 1762 0.994271 -0.0274739 0.00553838 1 0 1 1 0 0 +EDGE2 2121 2061 -0.0509815 -0.00675293 0.0140137 1 0 1 1 0 0 +EDGE2 2121 2120 -0.95302 0.0525633 -1.57497 1 0 1 1 0 0 +EDGE2 2121 1420 -1.0363 0.022528 1.5727 1 0 1 1 0 0 +EDGE2 2121 1440 -0.959391 0.00647622 1.54375 1 0 1 1 0 0 +EDGE2 2121 1760 -0.985105 -0.0846348 1.55716 1 0 1 1 0 0 +EDGE2 2121 1400 -0.990121 -0.0427813 1.57858 1 0 1 1 0 0 +EDGE2 2122 2062 -0.00543367 0.014351 -0.00562405 1 0 1 1 0 0 +EDGE2 2122 2063 1.08436 -0.00116884 0.00804677 1 0 1 1 0 0 +EDGE2 2122 1763 0.93943 0.00791176 -0.00751305 1 0 1 1 0 0 +EDGE2 2122 1761 -1.11114 -0.00443181 0.0306857 1 0 1 1 0 0 +EDGE2 2122 2121 -0.989952 -0.0288564 -0.0121534 1 0 1 1 0 0 +EDGE2 2122 1762 -0.0255395 0.0356069 0.015911 1 0 1 1 0 0 +EDGE2 2122 2061 -0.956105 0.00166083 -0.0417194 1 0 1 1 0 0 +EDGE2 2123 2062 -0.967028 0.0955054 0.0115402 1 0 1 1 0 0 +EDGE2 2123 2063 0.027001 -0.0495244 -0.0348709 1 0 1 1 0 0 +EDGE2 2123 1764 1.01779 0.109508 0.00541058 1 0 1 1 0 0 +EDGE2 2123 2064 0.957778 0.0313455 0.00103415 1 0 1 1 0 0 +EDGE2 2123 1763 0.0902569 0.0148158 0.0177371 1 0 1 1 0 0 +EDGE2 2123 2122 -0.96683 0.0122463 -0.00843763 1 0 1 1 0 0 +EDGE2 2123 1762 -0.935369 -0.0520348 0.00316514 1 0 1 1 0 0 +EDGE2 2124 1765 1.01253 0.0223597 0.0368958 1 0 1 1 0 0 +EDGE2 2124 2065 0.925291 -0.0188363 -0.0219726 1 0 1 1 0 0 +EDGE2 2124 2063 -1.03918 -0.002176 0.0368266 1 0 1 1 0 0 +EDGE2 2124 1764 0.0165955 -0.0692185 0.0154578 1 0 1 1 0 0 +EDGE2 2124 2064 -0.0329459 -0.0342488 -0.00163604 1 0 1 1 0 0 +EDGE2 2124 2123 -0.955951 -0.000906907 0.0198795 1 0 1 1 0 0 +EDGE2 2124 1763 -1.02947 0.0167777 -0.0313413 1 0 1 1 0 0 +EDGE2 2125 2066 -0.0840417 1.07117 1.54974 1 0 1 1 0 0 +EDGE2 2125 1766 -0.114318 0.96385 1.59608 1 0 1 1 0 0 +EDGE2 2125 2124 -1.07324 -0.0631846 -0.0142491 1 0 1 1 0 0 +EDGE2 2125 1765 0.0438516 -0.00331334 0.0344422 1 0 1 1 0 0 +EDGE2 2125 2065 -0.0390183 0.0292667 -0.0105669 1 0 1 1 0 0 +EDGE2 2125 1764 -0.994799 -0.0420432 -0.00251607 1 0 1 1 0 0 +EDGE2 2125 2064 -1.00337 0.0421382 -0.0204242 1 0 1 1 0 0 +EDGE2 2126 2066 0.0662128 0.0036597 0.030812 1 0 1 1 0 0 +EDGE2 2126 1767 1.00205 0.0393167 -0.0143622 1 0 1 1 0 0 +EDGE2 2126 2067 1.0682 -0.00248275 -0.0210313 1 0 1 1 0 0 +EDGE2 2126 1766 0.0261344 0.0288732 -0.0066177 1 0 1 1 0 0 +EDGE2 2126 1765 -0.96919 -0.00459971 -1.57841 1 0 1 1 0 0 +EDGE2 2126 2065 -0.993917 0.0992482 -1.55037 1 0 1 1 0 0 +EDGE2 2126 2125 -1.02876 -0.00537504 -1.60091 1 0 1 1 0 0 +EDGE2 2127 1768 0.971738 -0.0555182 0.0059376 1 0 1 1 0 0 +EDGE2 2127 2068 0.958961 -0.0566217 0.0279767 1 0 1 1 0 0 +EDGE2 2127 2066 -0.949012 -0.0658096 0.00589561 1 0 1 1 0 0 +EDGE2 2127 1767 -0.0447977 0.0604895 -0.0377962 1 0 1 1 0 0 +EDGE2 2127 2067 0.0228432 0.127512 0.0267901 1 0 1 1 0 0 +EDGE2 2127 2126 -1.05871 0.0347504 0.00131928 1 0 1 1 0 0 +EDGE2 2127 1766 -0.956018 -0.0317041 -0.0392394 1 0 1 1 0 0 +EDGE2 2128 1768 0.039142 -0.0773551 0.00850324 1 0 1 1 0 0 +EDGE2 2128 1769 1.02833 0.0824695 0.0502969 1 0 1 1 0 0 +EDGE2 2128 2069 1.02413 0.0473882 0.0233597 1 0 1 1 0 0 +EDGE2 2128 2068 0.0421494 0.0125335 0.0344858 1 0 1 1 0 0 +EDGE2 2128 1767 -1.03278 0.0175283 0.0242706 1 0 1 1 0 0 +EDGE2 2128 2127 -1.02746 -0.0697398 -0.0245693 1 0 1 1 0 0 +EDGE2 2128 2067 -0.989312 -0.0524644 -0.0186746 1 0 1 1 0 0 +EDGE2 2129 1770 0.946032 -0.0192594 0.0198042 1 0 1 1 0 0 +EDGE2 2129 2070 0.944347 -0.0523335 0.00211984 1 0 1 1 0 0 +EDGE2 2129 2110 0.90482 0.0201957 -3.14969 1 0 1 1 0 0 +EDGE2 2129 2030 1.02265 0.0396286 -3.1282 1 0 1 1 0 0 +EDGE2 2129 1768 -0.913199 0.0261001 -0.0347171 1 0 1 1 0 0 +EDGE2 2129 1769 0.146684 0.0415503 -0.0291998 1 0 1 1 0 0 +EDGE2 2129 2069 -0.0446853 -0.0650026 -0.0278136 1 0 1 1 0 0 +EDGE2 2129 2128 -0.994113 -0.0564965 0.0191885 1 0 1 1 0 0 +EDGE2 2129 2068 -1.02525 -0.0452652 -0.0285952 1 0 1 1 0 0 +EDGE2 2130 2031 0.00644329 1.08883 1.5448 1 0 1 1 0 0 +EDGE2 2130 2029 0.967655 0.0431124 -3.1433 1 0 1 1 0 0 +EDGE2 2130 2109 1.02156 -0.0581716 -3.13797 1 0 1 1 0 0 +EDGE2 2130 2071 0.0504805 -0.923154 -1.56987 1 0 1 1 0 0 +EDGE2 2130 1770 -0.0137817 0.0688501 -0.00492827 1 0 1 1 0 0 +EDGE2 2130 2070 0.0407453 0.0600664 -0.00426472 1 0 1 1 0 0 +EDGE2 2130 2110 -0.00226706 -0.0067987 -3.13729 1 0 1 1 0 0 +EDGE2 2130 2030 0.00972412 -0.00980523 -3.1627 1 0 1 1 0 0 +EDGE2 2130 2111 0.0509911 0.968896 1.58433 1 0 1 1 0 0 +EDGE2 2130 1771 -0.0116382 1.00651 1.56959 1 0 1 1 0 0 +EDGE2 2130 1769 -0.979921 -0.0519056 0.01661 1 0 1 1 0 0 +EDGE2 2130 2129 -1.03442 0.0191067 -0.0108855 1 0 1 1 0 0 +EDGE2 2130 2069 -1.03083 -0.00635786 -0.00601349 1 0 1 1 0 0 +EDGE2 2131 2031 0.05051 0.0218263 -0.00941524 1 0 1 1 0 0 +EDGE2 2131 1770 -0.934832 0.0399018 -1.58242 1 0 1 1 0 0 +EDGE2 2131 2070 -1.06498 -0.0496941 -1.59843 1 0 1 1 0 0 +EDGE2 2131 2110 -1.00315 0.00619677 1.56114 1 0 1 1 0 0 +EDGE2 2131 2130 -0.981242 -0.0584842 -1.5942 1 0 1 1 0 0 +EDGE2 2131 2030 -0.988207 -0.0568867 1.60395 1 0 1 1 0 0 +EDGE2 2131 2111 0.0241523 -0.0160355 0.00620322 1 0 1 1 0 0 +EDGE2 2131 2032 1.02296 0.0189532 0.010691 1 0 1 1 0 0 +EDGE2 2131 1771 0.0176606 0.0770694 -0.0171339 1 0 1 1 0 0 +EDGE2 2131 2112 0.973104 0.0404452 0.020003 1 0 1 1 0 0 +EDGE2 2131 1772 1.05882 0.127897 -0.00330267 1 0 1 1 0 0 +EDGE2 2132 2031 -1.13615 -0.0246521 -0.00559443 1 0 1 1 0 0 +EDGE2 2132 2131 -0.981372 -0.0423817 0.0195945 1 0 1 1 0 0 +EDGE2 2132 2111 -1.02737 0.0673695 -0.0297265 1 0 1 1 0 0 +EDGE2 2132 2033 1.02888 -0.00219127 0.0342471 1 0 1 1 0 0 +EDGE2 2132 2032 0.00648185 0.0224511 0.00855231 1 0 1 1 0 0 +EDGE2 2132 1771 -0.984248 0.0393846 -0.011714 1 0 1 1 0 0 +EDGE2 2132 2112 -0.0565508 0.0177493 -0.00200871 1 0 1 1 0 0 +EDGE2 2132 1772 0.0098627 0.00794153 0.0224302 1 0 1 1 0 0 +EDGE2 2132 2113 0.94897 0.00199076 0.0114176 1 0 1 1 0 0 +EDGE2 2132 1773 1.02058 -0.00572451 -0.0376892 1 0 1 1 0 0 +EDGE2 2133 2033 -0.0180411 0.0180678 0.00274969 1 0 1 1 0 0 +EDGE2 2133 2032 -1.0638 -0.0116489 0.0122665 1 0 1 1 0 0 +EDGE2 2133 2132 -0.953872 0.0401365 0.00237034 1 0 1 1 0 0 +EDGE2 2133 2112 -0.984206 0.022041 0.0116049 1 0 1 1 0 0 +EDGE2 2133 1772 -1.0004 0.0599585 0.00137104 1 0 1 1 0 0 +EDGE2 2133 2113 0.0155654 0.0172569 -0.0228548 1 0 1 1 0 0 +EDGE2 2133 2034 1.05618 0.0493705 0.0203457 1 0 1 1 0 0 +EDGE2 2133 1773 -0.0688041 -0.0512704 0.00616447 1 0 1 1 0 0 +EDGE2 2133 2114 1.05011 -0.0132926 -0.0180479 1 0 1 1 0 0 +EDGE2 2133 1774 0.9573 0.0597761 0.00951757 1 0 1 1 0 0 +EDGE2 2134 2055 0.935601 -0.0531536 -3.16639 1 0 1 1 0 0 +EDGE2 2134 2033 -0.97281 -0.0429713 -0.0154164 1 0 1 1 0 0 +EDGE2 2134 2133 -0.988288 -0.0327684 0.0265888 1 0 1 1 0 0 +EDGE2 2134 2113 -0.93359 0.0297447 0.00456672 1 0 1 1 0 0 +EDGE2 2134 2034 0.0302459 0.0217298 -0.00176522 1 0 1 1 0 0 +EDGE2 2134 1773 -0.990388 0.063863 -0.0084871 1 0 1 1 0 0 +EDGE2 2134 2114 -0.011403 0.0205443 0.0124145 1 0 1 1 0 0 +EDGE2 2134 1774 0.041707 0.0570125 -0.0122849 1 0 1 1 0 0 +EDGE2 2134 2115 1.02664 -0.0136897 -0.0155646 1 0 1 1 0 0 +EDGE2 2134 1775 1.03299 0.0113838 -0.0154616 1 0 1 1 0 0 +EDGE2 2134 2035 0.955011 0.144081 -0.0143669 1 0 1 1 0 0 +EDGE2 2135 2036 -0.0317956 -0.974603 -1.53248 1 0 1 1 0 0 +EDGE2 2135 1776 0.0491819 -0.985891 -1.57114 1 0 1 1 0 0 +EDGE2 2135 2055 0.00858784 -0.0115934 -3.14643 1 0 1 1 0 0 +EDGE2 2135 2034 -1.04092 0.084666 -0.0255083 1 0 1 1 0 0 +EDGE2 2135 2134 -0.926256 0.0327771 0.0332607 1 0 1 1 0 0 +EDGE2 2135 2114 -1.08279 -0.0543691 -0.00685658 1 0 1 1 0 0 +EDGE2 2135 1774 -1.04035 -0.0235174 0.0229116 1 0 1 1 0 0 +EDGE2 2135 2115 0.0310311 0.0108819 -0.0181542 1 0 1 1 0 0 +EDGE2 2135 2116 -0.0437798 1.00845 1.58777 1 0 1 1 0 0 +EDGE2 2135 1775 -0.0632006 -0.0088647 -0.00242807 1 0 1 1 0 0 +EDGE2 2135 2035 0.00947675 -0.0501069 0.0363812 1 0 1 1 0 0 +EDGE2 2135 2056 -0.0526073 0.989391 1.58935 1 0 1 1 0 0 +EDGE2 2135 2054 1.02071 -0.0102113 -3.15348 1 0 1 1 0 0 +EDGE2 2136 2117 0.985712 -0.0429884 0.0215282 1 0 1 1 0 0 +EDGE2 2136 2055 -1.0727 -0.0156858 1.538 1 0 1 1 0 0 +EDGE2 2136 2135 -1.0753 0.0314819 -1.58821 1 0 1 1 0 0 +EDGE2 2136 2115 -0.988884 -0.01292 -1.53819 1 0 1 1 0 0 +EDGE2 2136 2116 0.0233877 0.025507 -0.00665764 1 0 1 1 0 0 +EDGE2 2136 1775 -0.968255 -0.0344263 -1.57516 1 0 1 1 0 0 +EDGE2 2136 2035 -1.05087 0.0290139 -1.55421 1 0 1 1 0 0 +EDGE2 2136 2056 -0.0187041 0.0398392 -0.00965872 1 0 1 1 0 0 +EDGE2 2136 2057 0.931922 0.0448532 -0.0125544 1 0 1 1 0 0 +EDGE2 2137 2117 -0.0794599 -0.0513178 -0.00443321 1 0 1 1 0 0 +EDGE2 2137 2116 -1.11167 0.0480245 -0.0327877 1 0 1 1 0 0 +EDGE2 2137 2136 -1.02245 -0.00598409 -0.0226187 1 0 1 1 0 0 +EDGE2 2137 2056 -1.03937 0.0598943 -0.0270745 1 0 1 1 0 0 +EDGE2 2137 2057 -0.0240558 0.0124696 0.0191601 1 0 1 1 0 0 +EDGE2 2137 2118 1.02511 0.0437808 0.0029782 1 0 1 1 0 0 +EDGE2 2137 2058 1.01896 -0.0267783 -0.0089259 1 0 1 1 0 0 +EDGE2 2138 2117 -0.981585 0.0434842 0.00094317 1 0 1 1 0 0 +EDGE2 2138 2137 -0.945581 0.0939661 0.0213716 1 0 1 1 0 0 +EDGE2 2138 2057 -1.0264 0.042036 -0.0100941 1 0 1 1 0 0 +EDGE2 2138 2118 -0.0208841 0.0360138 0.00613906 1 0 1 1 0 0 +EDGE2 2138 2058 -0.0761977 -0.0497238 0.0101612 1 0 1 1 0 0 +EDGE2 2138 2119 0.914283 0.0123164 0.0203723 1 0 1 1 0 0 +EDGE2 2138 2059 1.06456 0.0484995 0.00410986 1 0 1 1 0 0 +EDGE2 2139 2118 -0.989125 0.0629565 -0.0147081 1 0 1 1 0 0 +EDGE2 2139 2138 -1.01333 -0.0368171 -0.00417494 1 0 1 1 0 0 +EDGE2 2139 2058 -1.01661 0.0114938 0.00554392 1 0 1 1 0 0 +EDGE2 2139 2119 0.0532085 0.0452969 0.0386636 1 0 1 1 0 0 +EDGE2 2139 2059 0.040179 0.0222588 -0.0173383 1 0 1 1 0 0 +EDGE2 2139 2060 0.935669 0.0262909 -0.00738662 1 0 1 1 0 0 +EDGE2 2139 2120 1.0041 0.0507642 -0.0292668 1 0 1 1 0 0 +EDGE2 2139 1420 1.00434 0.0570851 -3.12593 1 0 1 1 0 0 +EDGE2 2139 1440 1.03349 -0.0382724 -3.16017 1 0 1 1 0 0 +EDGE2 2139 1760 0.956614 0.0414972 -3.1647 1 0 1 1 0 0 +EDGE2 2139 1400 1.03375 -0.0190431 -3.12039 1 0 1 1 0 0 +EDGE2 2140 2119 -1.05177 -0.0348297 -0.00151519 1 0 1 1 0 0 +EDGE2 2140 2139 -1.02082 -0.0577717 -0.0082233 1 0 1 1 0 0 +EDGE2 2140 2059 -0.977615 -0.0537744 -0.0250101 1 0 1 1 0 0 +EDGE2 2140 2060 0.057373 0.0967994 -0.0292126 1 0 1 1 0 0 +EDGE2 2140 1761 0.00630683 1.00233 1.54678 1 0 1 1 0 0 +EDGE2 2140 2121 0.0120936 1.02809 1.58273 1 0 1 1 0 0 +EDGE2 2140 2061 -0.0314984 1.00206 1.58063 1 0 1 1 0 0 +EDGE2 2140 2120 -0.00889272 -0.0381287 0.027195 1 0 1 1 0 0 +EDGE2 2140 1420 0.0606329 -0.0227663 -3.1392 1 0 1 1 0 0 +EDGE2 2140 1440 -0.030841 0.0489055 -3.14178 1 0 1 1 0 0 +EDGE2 2140 1760 0.00617007 -0.020092 -3.14895 1 0 1 1 0 0 +EDGE2 2140 1400 -0.0382925 0.0355926 -3.116 1 0 1 1 0 0 +EDGE2 2140 1421 -0.0436642 -1.033 -1.5631 1 0 1 1 0 0 +EDGE2 2140 1441 -0.048517 -1.00822 -1.55992 1 0 1 1 0 0 +EDGE2 2140 1401 -0.0319911 -1.03078 -1.59618 1 0 1 1 0 0 +EDGE2 2140 1419 1.05643 -0.0339835 -3.12093 1 0 1 1 0 0 +EDGE2 2140 1759 0.998243 -0.0212021 -3.16627 1 0 1 1 0 0 +EDGE2 2140 1439 1.01572 0.0335978 -3.10909 1 0 1 1 0 0 +EDGE2 2140 1399 0.918345 0.00782832 -3.15577 1 0 1 1 0 0 +EDGE2 2141 2062 0.919043 -0.0990335 -0.00332162 1 0 1 1 0 0 +EDGE2 2141 2122 0.968348 0.0185552 0.018825 1 0 1 1 0 0 +EDGE2 2141 2060 -0.940843 -0.0451073 -1.56021 1 0 1 1 0 0 +EDGE2 2141 1761 -0.0652839 0.0695102 -0.02094 1 0 1 1 0 0 +EDGE2 2141 2121 0.0423214 0.0112048 0.0234356 1 0 1 1 0 0 +EDGE2 2141 1762 1.0925 0.00605762 0.0269634 1 0 1 1 0 0 +EDGE2 2141 2061 0.0739603 -0.0735255 0.000177775 1 0 1 1 0 0 +EDGE2 2141 2140 -1.01477 -0.0160286 -1.57313 1 0 1 1 0 0 +EDGE2 2141 2120 -0.987545 -0.0151765 -1.56482 1 0 1 1 0 0 +EDGE2 2141 1420 -1.00946 0.0333799 1.55832 1 0 1 1 0 0 +EDGE2 2141 1440 -0.99205 0.145742 1.55324 1 0 1 1 0 0 +EDGE2 2141 1760 -1.08217 0.0731162 1.59015 1 0 1 1 0 0 +EDGE2 2141 1400 -0.986446 -0.0721182 1.60813 1 0 1 1 0 0 +EDGE2 2142 2062 0.0274019 0.0953217 0.0104806 1 0 1 1 0 0 +EDGE2 2142 2063 0.972991 -0.0623394 -0.0216414 1 0 1 1 0 0 +EDGE2 2142 2123 0.979189 -0.0208516 0.00728185 1 0 1 1 0 0 +EDGE2 2142 1763 1.07914 0.0279393 -0.031546 1 0 1 1 0 0 +EDGE2 2142 2122 -0.0051291 0.0123718 -0.0120194 1 0 1 1 0 0 +EDGE2 2142 1761 -0.93769 0.0720888 -0.00784004 1 0 1 1 0 0 +EDGE2 2142 2121 -1.01191 -0.00859257 -0.00999056 1 0 1 1 0 0 +EDGE2 2142 2141 -0.942976 0.00992733 0.0386113 1 0 1 1 0 0 +EDGE2 2142 1762 -0.0670512 -0.00388939 -0.0263189 1 0 1 1 0 0 +EDGE2 2142 2061 -0.957107 0.0479833 -0.0151287 1 0 1 1 0 0 +EDGE2 2143 2062 -1.04618 -0.0193152 -0.00905739 1 0 1 1 0 0 +EDGE2 2143 2124 0.958291 0.000963069 0.00580546 1 0 1 1 0 0 +EDGE2 2143 2063 0.0494016 -0.053348 -0.0385155 1 0 1 1 0 0 +EDGE2 2143 1764 0.975717 -0.0664229 0.0104597 1 0 1 1 0 0 +EDGE2 2143 2064 0.997768 -0.0447196 -0.00448337 1 0 1 1 0 0 +EDGE2 2143 2123 -0.0039596 -0.0258277 0.0121204 1 0 1 1 0 0 +EDGE2 2143 2142 -1.06191 -0.00729354 -0.00389805 1 0 1 1 0 0 +EDGE2 2143 1763 -0.0145879 0.00305901 0.0329244 1 0 1 1 0 0 +EDGE2 2143 2122 -0.979698 -0.00137356 -0.0438078 1 0 1 1 0 0 +EDGE2 2143 1762 -0.970178 0.0187638 0.0107331 1 0 1 1 0 0 +EDGE2 2144 2124 0.0026569 0.00511299 -0.0163317 1 0 1 1 0 0 +EDGE2 2144 1765 0.982977 -0.0235982 -0.0120299 1 0 1 1 0 0 +EDGE2 2144 2065 0.969918 -0.000255854 -0.00367856 1 0 1 1 0 0 +EDGE2 2144 2125 1.0164 0.072227 -0.0460538 1 0 1 1 0 0 +EDGE2 2144 2063 -1.0384 0.0414788 -0.0073614 1 0 1 1 0 0 +EDGE2 2144 2143 -1.01022 0.134819 0.0430942 1 0 1 1 0 0 +EDGE2 2144 1764 -0.0169396 0.0522081 0.0104241 1 0 1 1 0 0 +EDGE2 2144 2064 -0.00843171 0.0272033 -0.025827 1 0 1 1 0 0 +EDGE2 2144 2123 -0.938382 -0.0609824 -0.0107155 1 0 1 1 0 0 +EDGE2 2144 1763 -1.02678 0.0464617 0.00413197 1 0 1 1 0 0 +EDGE2 2145 2066 -0.0281287 1.03151 1.58547 1 0 1 1 0 0 +EDGE2 2145 2126 0.0288166 1.04823 1.55683 1 0 1 1 0 0 +EDGE2 2145 1766 -0.00194843 0.931142 1.63222 1 0 1 1 0 0 +EDGE2 2145 2124 -1.12298 -0.0148346 0.024851 1 0 1 1 0 0 +EDGE2 2145 1765 0.0205137 0.0569806 0.00325317 1 0 1 1 0 0 +EDGE2 2145 2065 -0.0324178 -0.0744966 -0.0251125 1 0 1 1 0 0 +EDGE2 2145 2125 -0.00741265 -0.0469085 0.0176661 1 0 1 1 0 0 +EDGE2 2145 2144 -0.980218 -0.00920543 0.0173801 1 0 1 1 0 0 +EDGE2 2145 1764 -1.01789 -0.0915957 0.0482522 1 0 1 1 0 0 +EDGE2 2145 2064 -1.01378 -0.0342162 -0.0242909 1 0 1 1 0 0 +EDGE2 2146 2066 -0.0416859 -0.00445669 -0.0219009 1 0 1 1 0 0 +EDGE2 2146 1767 0.99087 0.049725 0.0195482 1 0 1 1 0 0 +EDGE2 2146 2127 0.995027 -0.0259581 0.00679813 1 0 1 1 0 0 +EDGE2 2146 2067 0.957839 -0.0730827 0.00651767 1 0 1 1 0 0 +EDGE2 2146 2126 -0.0291707 0.0101312 -0.02727 1 0 1 1 0 0 +EDGE2 2146 1766 -0.0171773 -0.0614932 0.00510234 1 0 1 1 0 0 +EDGE2 2146 2145 -0.924126 -0.00338023 -1.58238 1 0 1 1 0 0 +EDGE2 2146 1765 -0.982637 -0.0151409 -1.60107 1 0 1 1 0 0 +EDGE2 2146 2065 -1.01824 0.0830237 -1.61355 1 0 1 1 0 0 +EDGE2 2146 2125 -1.01436 -0.0199971 -1.55902 1 0 1 1 0 0 +EDGE2 2147 1768 0.999137 0.114562 0.0246687 1 0 1 1 0 0 +EDGE2 2147 2128 0.985815 -0.00472245 -0.0108413 1 0 1 1 0 0 +EDGE2 2147 2068 0.995126 0.00232037 0.00110351 1 0 1 1 0 0 +EDGE2 2147 2066 -0.965356 0.0270971 -0.0354506 1 0 1 1 0 0 +EDGE2 2147 1767 -0.0133459 0.0295678 0.0171941 1 0 1 1 0 0 +EDGE2 2147 2127 -0.0913134 -0.0303879 -0.0161037 1 0 1 1 0 0 +EDGE2 2147 2067 -0.0374851 0.0448755 -0.0158587 1 0 1 1 0 0 +EDGE2 2147 2126 -1.05096 -0.0127667 0.0429862 1 0 1 1 0 0 +EDGE2 2147 2146 -0.983925 0.041369 0.00775468 1 0 1 1 0 0 +EDGE2 2147 1766 -1.01457 -0.0209982 0.0402171 1 0 1 1 0 0 +EDGE2 2148 1768 -0.0765663 -0.0430005 -0.0368574 1 0 1 1 0 0 +EDGE2 2148 1769 0.954126 0.130841 -0.00834334 1 0 1 1 0 0 +EDGE2 2148 2129 0.972108 0.0870903 -0.0102388 1 0 1 1 0 0 +EDGE2 2148 2069 0.996129 -0.00689945 -0.0431852 1 0 1 1 0 0 +EDGE2 2148 2128 0.0441863 0.016278 0.0185926 1 0 1 1 0 0 +EDGE2 2148 2068 0.000964008 -0.00456855 0.0310087 1 0 1 1 0 0 +EDGE2 2148 1767 -0.904377 0.0449246 -0.0123226 1 0 1 1 0 0 +EDGE2 2148 2127 -0.951134 0.0606908 0.0470292 1 0 1 1 0 0 +EDGE2 2148 2147 -1.0713 -0.00997429 0.00568354 1 0 1 1 0 0 +EDGE2 2148 2067 -1.01741 0.0656124 0.0268899 1 0 1 1 0 0 +EDGE2 2149 1770 1.01249 -0.142513 -0.0108624 1 0 1 1 0 0 +EDGE2 2149 2070 1.0431 -0.025551 -0.0147354 1 0 1 1 0 0 +EDGE2 2149 2110 0.900655 0.00986393 -3.10194 1 0 1 1 0 0 +EDGE2 2149 2130 1.00749 -0.0354626 -0.017853 1 0 1 1 0 0 +EDGE2 2149 2030 0.964912 -0.0171075 -3.15339 1 0 1 1 0 0 +EDGE2 2149 1768 -0.998561 -0.000491829 0.0120647 1 0 1 1 0 0 +EDGE2 2149 1769 0.024981 -0.0153941 0.0183681 1 0 1 1 0 0 +EDGE2 2149 2129 0.11085 0.0504977 0.0128851 1 0 1 1 0 0 +EDGE2 2149 2069 0.0607463 -0.0976818 -0.00866014 1 0 1 1 0 0 +EDGE2 2149 2128 -0.955171 -0.0463886 0.00753196 1 0 1 1 0 0 +EDGE2 2149 2148 -0.983603 0.115327 0.0390148 1 0 1 1 0 0 +EDGE2 2149 2068 -0.985828 -0.0225632 0.0383619 1 0 1 1 0 0 +EDGE2 2150 2031 0.0779402 1.01442 1.56007 1 0 1 1 0 0 +EDGE2 2150 2029 0.982819 0.129393 -3.11634 1 0 1 1 0 0 +EDGE2 2150 2109 0.971696 -0.00842702 -3.15046 1 0 1 1 0 0 +EDGE2 2150 2071 -0.0505193 -0.922037 -1.55886 1 0 1 1 0 0 +EDGE2 2150 1770 -0.00156449 0.0711679 0.00148242 1 0 1 1 0 0 +EDGE2 2150 2070 0.0388335 -0.0717624 0.0175031 1 0 1 1 0 0 +EDGE2 2150 2110 0.055015 0.0014011 -3.11114 1 0 1 1 0 0 +EDGE2 2150 2130 0.0550182 0.0293224 0.0245622 1 0 1 1 0 0 +EDGE2 2150 2030 -0.0187848 -0.00936618 -3.1378 1 0 1 1 0 0 +EDGE2 2150 2131 -0.0363553 0.955636 1.55898 1 0 1 1 0 0 +EDGE2 2150 2111 0.0124872 1.01398 1.54783 1 0 1 1 0 0 +EDGE2 2150 1771 -0.057691 1.02705 1.56704 1 0 1 1 0 0 +EDGE2 2150 1769 -1.01294 0.0349429 0.0149898 1 0 1 1 0 0 +EDGE2 2150 2129 -1.09127 -0.00483189 -0.0337149 1 0 1 1 0 0 +EDGE2 2150 2149 -0.916494 -0.0111012 -0.0243648 1 0 1 1 0 0 +EDGE2 2150 2069 -0.995101 0.0308637 -0.0145533 1 0 1 1 0 0 +EDGE2 2151 2031 0.0383566 0.00558518 0.0109489 1 0 1 1 0 0 +EDGE2 2151 2150 -0.962209 0.0347526 -1.59014 1 0 1 1 0 0 +EDGE2 2151 1770 -1.06269 -0.0463538 -1.58458 1 0 1 1 0 0 +EDGE2 2151 2070 -0.962176 0.0015052 -1.5909 1 0 1 1 0 0 +EDGE2 2151 2110 -1.01297 -0.150565 1.56985 1 0 1 1 0 0 +EDGE2 2151 2130 -1.03496 -0.00284747 -1.56765 1 0 1 1 0 0 +EDGE2 2151 2030 -0.988159 -0.0302927 1.60518 1 0 1 1 0 0 +EDGE2 2151 2131 -0.0277533 0.0499653 0.0346786 1 0 1 1 0 0 +EDGE2 2151 2111 -0.00889112 0.0478691 -0.00874927 1 0 1 1 0 0 +EDGE2 2151 2032 0.943815 -0.000267299 -0.0220528 1 0 1 1 0 0 +EDGE2 2151 2132 0.945164 0.0169028 0.0237803 1 0 1 1 0 0 +EDGE2 2151 1771 0.00770296 -0.0212146 0.00204412 1 0 1 1 0 0 +EDGE2 2151 2112 0.983723 -0.0558071 -0.0423173 1 0 1 1 0 0 +EDGE2 2151 1772 1.05941 -0.0560329 0.00515916 1 0 1 1 0 0 +EDGE2 2152 2031 -0.97255 0.0812907 0.0161338 1 0 1 1 0 0 +EDGE2 2152 2131 -1.07235 -0.0175878 -0.00609396 1 0 1 1 0 0 +EDGE2 2152 2151 -0.964006 0.00915322 -0.011781 1 0 1 1 0 0 +EDGE2 2152 2111 -0.949178 0.047174 -0.00410907 1 0 1 1 0 0 +EDGE2 2152 2033 1.00374 -0.057827 0.000693533 1 0 1 1 0 0 +EDGE2 2152 2032 -0.107185 0.0132926 -0.0386537 1 0 1 1 0 0 +EDGE2 2152 2132 0.041485 0.11101 0.0429635 1 0 1 1 0 0 +EDGE2 2152 1771 -1.03739 0.0457296 -0.0273784 1 0 1 1 0 0 +EDGE2 2152 2112 0.0123759 -0.0533267 0.0352847 1 0 1 1 0 0 +EDGE2 2152 2133 0.981366 -0.0833606 -0.0121508 1 0 1 1 0 0 +EDGE2 2152 1772 -0.0907211 0.0165932 -0.0253797 1 0 1 1 0 0 +EDGE2 2152 2113 0.918696 -0.0503031 0.00493612 1 0 1 1 0 0 +EDGE2 2152 1773 1.07347 0.0588579 -0.0458253 1 0 1 1 0 0 +EDGE2 2153 2033 -0.0327026 -0.0135233 0.0184951 1 0 1 1 0 0 +EDGE2 2153 2032 -1.01087 -0.0351265 0.039465 1 0 1 1 0 0 +EDGE2 2153 2132 -1.04432 -0.0180234 -0.0024872 1 0 1 1 0 0 +EDGE2 2153 2152 -0.996689 -0.0794339 -0.0120804 1 0 1 1 0 0 +EDGE2 2153 2112 -1.01849 -0.00168807 0.0222188 1 0 1 1 0 0 +EDGE2 2153 2133 -0.00571872 -0.0271016 0.0127416 1 0 1 1 0 0 +EDGE2 2153 1772 -0.950697 -0.0331099 -0.0273368 1 0 1 1 0 0 +EDGE2 2153 2113 0.0451084 -0.000485517 -0.0215513 1 0 1 1 0 0 +EDGE2 2153 2034 1.0031 0.0119146 0.0138802 1 0 1 1 0 0 +EDGE2 2153 2134 1.07738 0.0253669 -0.00794568 1 0 1 1 0 0 +EDGE2 2153 1773 -0.035697 -0.0584871 -0.0106129 1 0 1 1 0 0 +EDGE2 2153 2114 0.981247 -0.013623 -0.0226365 1 0 1 1 0 0 +EDGE2 2153 1774 1.00017 -0.085448 -0.0570329 1 0 1 1 0 0 +EDGE2 2154 2055 1.10186 0.0122557 -3.14063 1 0 1 1 0 0 +EDGE2 2154 2033 -0.967002 -0.0623595 -0.00131179 1 0 1 1 0 0 +EDGE2 2154 2133 -0.913073 -0.043056 6.04156e-05 1 0 1 1 0 0 +EDGE2 2154 2153 -1.0058 -0.104584 -0.024797 1 0 1 1 0 0 +EDGE2 2154 2113 -0.994807 0.104614 0.0195563 1 0 1 1 0 0 +EDGE2 2154 2034 0.0412066 0.131224 -0.00556407 1 0 1 1 0 0 +EDGE2 2154 2134 -0.0637556 0.093065 -0.00858285 1 0 1 1 0 0 +EDGE2 2154 1773 -0.956062 -0.0802569 0.00480149 1 0 1 1 0 0 +EDGE2 2154 2114 -0.0600149 -0.0433362 0.0452994 1 0 1 1 0 0 +EDGE2 2154 2135 1.06493 0.00548445 0.00981909 1 0 1 1 0 0 +EDGE2 2154 1774 -0.0836456 0.0548278 0.000812056 1 0 1 1 0 0 +EDGE2 2154 2115 1.04703 -0.0120987 0.0123449 1 0 1 1 0 0 +EDGE2 2154 1775 0.990395 -0.0159136 0.0192883 1 0 1 1 0 0 +EDGE2 2154 2035 0.971709 -0.00595075 -0.0280341 1 0 1 1 0 0 +EDGE2 2155 2036 -0.0131398 -0.999248 -1.61036 1 0 1 1 0 0 +EDGE2 2155 1776 0.0307315 -1.03328 -1.57951 1 0 1 1 0 0 +EDGE2 2155 2055 -0.0121844 -0.0267689 -3.1449 1 0 1 1 0 0 +EDGE2 2155 2034 -1.09017 -0.0782261 -0.0383449 1 0 1 1 0 0 +EDGE2 2155 2134 -0.944689 -0.0382336 -0.0232296 1 0 1 1 0 0 +EDGE2 2155 2154 -1.01717 -0.021274 -0.0445014 1 0 1 1 0 0 +EDGE2 2155 2114 -1.09619 -0.0673838 0.0101295 1 0 1 1 0 0 +EDGE2 2155 2135 -0.0252368 0.00109343 0.0413344 1 0 1 1 0 0 +EDGE2 2155 1774 -1.02066 -0.0280212 0.00696114 1 0 1 1 0 0 +EDGE2 2155 2115 -0.0399096 0.0139647 -0.0260379 1 0 1 1 0 0 +EDGE2 2155 2116 0.0391872 0.981119 1.53893 1 0 1 1 0 0 +EDGE2 2155 1775 -0.0795056 -0.056011 -0.0189584 1 0 1 1 0 0 +EDGE2 2155 2035 0.00617699 -0.0534773 0.01508 1 0 1 1 0 0 +EDGE2 2155 2136 -0.0109961 0.891476 1.56983 1 0 1 1 0 0 +EDGE2 2155 2056 0.0734421 0.935821 1.57445 1 0 1 1 0 0 +EDGE2 2155 2054 0.970232 -0.0945339 -3.18381 1 0 1 1 0 0 +EDGE2 2156 2117 1.02219 -0.00308621 0.00806564 1 0 1 1 0 0 +EDGE2 2156 2055 -1.08137 -0.122963 1.59782 1 0 1 1 0 0 +EDGE2 2156 2135 -0.925095 -0.0372533 -1.55697 1 0 1 1 0 0 +EDGE2 2156 2155 -1.05244 -0.0354571 -1.58522 1 0 1 1 0 0 +EDGE2 2156 2115 -1.02161 -0.0231534 -1.58255 1 0 1 1 0 0 +EDGE2 2156 2116 -0.0207834 -0.0471509 -0.025427 1 0 1 1 0 0 +EDGE2 2156 1775 -0.900254 0.0259227 -1.58229 1 0 1 1 0 0 +EDGE2 2156 2035 -0.926598 0.0649076 -1.57367 1 0 1 1 0 0 +EDGE2 2156 2136 -0.0110056 -0.0676493 0.0114276 1 0 1 1 0 0 +EDGE2 2156 2056 0.0377565 0.0873145 0.0186249 1 0 1 1 0 0 +EDGE2 2156 2137 0.93683 0.00526891 -0.0128303 1 0 1 1 0 0 +EDGE2 2156 2057 0.916954 0.0260657 0.00674878 1 0 1 1 0 0 +EDGE2 2157 2117 -0.0116672 -0.0734999 -0.0018203 1 0 1 1 0 0 +EDGE2 2157 2116 -0.938876 -0.0425026 -0.0220027 1 0 1 1 0 0 +EDGE2 2157 2156 -1.0458 -0.038232 0.0119803 1 0 1 1 0 0 +EDGE2 2157 2136 -1.05811 0.00401652 0.00361491 1 0 1 1 0 0 +EDGE2 2157 2056 -1.01383 0.107717 0.0170109 1 0 1 1 0 0 +EDGE2 2157 2137 -0.0157515 -0.00643121 -0.00887667 1 0 1 1 0 0 +EDGE2 2157 2057 -0.0377315 0.00348972 0.0202597 1 0 1 1 0 0 +EDGE2 2157 2118 0.938411 0.0657364 0.0768158 1 0 1 1 0 0 +EDGE2 2157 2138 1.02366 0.00707999 -0.0158587 1 0 1 1 0 0 +EDGE2 2157 2058 1.13596 0.026482 0.00855017 1 0 1 1 0 0 +EDGE2 2158 2117 -0.987921 0.0698489 -0.0121112 1 0 1 1 0 0 +EDGE2 2158 2157 -0.945042 0.0280148 0.00900763 1 0 1 1 0 0 +EDGE2 2158 2137 -0.910104 -0.0766604 0.0168465 1 0 1 1 0 0 +EDGE2 2158 2057 -0.985554 -0.0084293 -0.0179406 1 0 1 1 0 0 +EDGE2 2158 2118 -0.0505681 -0.0526429 0.0259383 1 0 1 1 0 0 +EDGE2 2158 2138 0.013704 -0.0173082 0.00277606 1 0 1 1 0 0 +EDGE2 2158 2058 -0.00117117 -0.0260766 0.00254365 1 0 1 1 0 0 +EDGE2 2158 2119 1.04599 -0.026415 -0.0213984 1 0 1 1 0 0 +EDGE2 2158 2139 1.05706 -0.00246163 0.00786481 1 0 1 1 0 0 +EDGE2 2158 2059 0.973486 -0.0830937 0.0226076 1 0 1 1 0 0 +EDGE2 2159 2118 -0.962761 -0.10109 -0.0103992 1 0 1 1 0 0 +EDGE2 2159 2138 -0.991052 0.00164175 -0.00533341 1 0 1 1 0 0 +EDGE2 2159 2158 -0.957929 -0.0241907 -0.00854185 1 0 1 1 0 0 +EDGE2 2159 2058 -1.02649 0.0424568 0.0199016 1 0 1 1 0 0 +EDGE2 2159 2119 0.034583 0.019147 -0.0349373 1 0 1 1 0 0 +EDGE2 2159 2139 0.00336203 0.0535123 -0.0283343 1 0 1 1 0 0 +EDGE2 2159 2059 0.0771458 -0.0810224 0.00762926 1 0 1 1 0 0 +EDGE2 2159 2060 0.971299 0.0181986 -0.00906204 1 0 1 1 0 0 +EDGE2 2159 2140 1.02054 0.00806835 0.0107156 1 0 1 1 0 0 +EDGE2 2159 2120 1.03932 -0.00430184 0.00339393 1 0 1 1 0 0 +EDGE2 2159 1420 1.10362 -0.00947109 -3.12417 1 0 1 1 0 0 +EDGE2 2159 1440 1.03449 0.0909414 -3.13243 1 0 1 1 0 0 +EDGE2 2159 1760 0.981366 0.0748872 -3.1659 1 0 1 1 0 0 +EDGE2 2159 1400 0.961723 0.0168108 -3.14428 1 0 1 1 0 0 +EDGE2 2160 2119 -0.923066 0.0302641 0.00616334 1 0 1 1 0 0 +EDGE2 2160 2139 -1.00457 0.0489027 -0.0308056 1 0 1 1 0 0 +EDGE2 2160 2159 -0.948492 0.0286304 0.00420153 1 0 1 1 0 0 +EDGE2 2160 2059 -1.07113 0.0388267 0.0040935 1 0 1 1 0 0 +EDGE2 2160 2060 0.0240412 -0.0608532 -0.01071 1 0 1 1 0 0 +EDGE2 2160 1761 0.0316742 0.956432 1.60667 1 0 1 1 0 0 +EDGE2 2160 2121 -0.0243597 0.995726 1.56615 1 0 1 1 0 0 +EDGE2 2160 2141 -0.0767397 1.08493 1.57418 1 0 1 1 0 0 +EDGE2 2160 2061 0.12063 0.928251 1.58681 1 0 1 1 0 0 +EDGE2 2160 2140 0.0382808 -0.0895761 0.0134341 1 0 1 1 0 0 +EDGE2 2160 2120 0.117579 -0.0399614 -0.0181253 1 0 1 1 0 0 +EDGE2 2160 1420 -0.0621775 0.010681 -3.14914 1 0 1 1 0 0 +EDGE2 2160 1440 -0.0347934 -0.0409953 -3.14206 1 0 1 1 0 0 +EDGE2 2160 1760 0.0256843 0.00491113 -3.1327 1 0 1 1 0 0 +EDGE2 2160 1400 0.00560932 -0.0016794 -3.1256 1 0 1 1 0 0 +EDGE2 2160 1421 -0.0363902 -0.961125 -1.56688 1 0 1 1 0 0 +EDGE2 2160 1441 -0.0941894 -0.93257 -1.5811 1 0 1 1 0 0 +EDGE2 2160 1401 -0.0443448 -1.09755 -1.57577 1 0 1 1 0 0 +EDGE2 2160 1419 1.06765 0.0735164 -3.14617 1 0 1 1 0 0 +EDGE2 2160 1759 0.940133 -0.0442674 -3.14698 1 0 1 1 0 0 +EDGE2 2160 1439 0.942638 0.0558055 -3.1332 1 0 1 1 0 0 +EDGE2 2160 1399 1.09494 -0.00694803 -3.10761 1 0 1 1 0 0 +EDGE2 2161 1422 1.05322 -0.0202488 -0.00805645 1 0 1 1 0 0 +EDGE2 2161 2060 -1.05484 -0.047882 1.57594 1 0 1 1 0 0 +EDGE2 2161 2140 -1.06624 0.0111216 1.57065 1 0 1 1 0 0 +EDGE2 2161 2160 -0.953976 -0.00562038 1.55331 1 0 1 1 0 0 +EDGE2 2161 2120 -0.966058 0.0974957 1.5916 1 0 1 1 0 0 +EDGE2 2161 1420 -1.03026 0.00334177 -1.55871 1 0 1 1 0 0 +EDGE2 2161 1440 -1.02657 -0.0728393 -1.58679 1 0 1 1 0 0 +EDGE2 2161 1760 -1.05927 0.0171542 -1.55942 1 0 1 1 0 0 +EDGE2 2161 1400 -0.977024 -0.00448279 -1.51963 1 0 1 1 0 0 +EDGE2 2161 1421 -0.0483206 -0.0526077 0.0158146 1 0 1 1 0 0 +EDGE2 2161 1441 -0.0662035 -0.053088 0.00449469 1 0 1 1 0 0 +EDGE2 2161 1401 -0.0430731 -0.0484491 0.00268215 1 0 1 1 0 0 +EDGE2 2161 1442 0.961352 0.0598923 0.0199952 1 0 1 1 0 0 +EDGE2 2161 1402 1.07897 0.00830086 0.000203994 1 0 1 1 0 0 +EDGE2 2162 1422 0.035141 0.0404635 -0.0161564 1 0 1 1 0 0 +EDGE2 2162 1421 -0.95937 -0.0282445 -0.00289045 1 0 1 1 0 0 +EDGE2 2162 1441 -1.01811 0.0273954 -0.0252841 1 0 1 1 0 0 +EDGE2 2162 2161 -0.974164 -0.0128088 0.00275781 1 0 1 1 0 0 +EDGE2 2162 1401 -0.977128 -0.00936804 -0.0182806 1 0 1 1 0 0 +EDGE2 2162 1442 0.0735056 0.0369394 -0.0331195 1 0 1 1 0 0 +EDGE2 2162 1423 0.995687 0.0157335 0.00632665 1 0 1 1 0 0 +EDGE2 2162 1402 0.00633081 -0.00800988 0.00769924 1 0 1 1 0 0 +EDGE2 2162 1443 1.0093 0.0175616 -0.0193062 1 0 1 1 0 0 +EDGE2 2162 1403 0.979577 -0.014709 0.0112541 1 0 1 1 0 0 +EDGE2 2163 1422 -1.01238 -0.00618147 0.0199013 1 0 1 1 0 0 +EDGE2 2163 1442 -0.984638 0.00877279 -0.00649107 1 0 1 1 0 0 +EDGE2 2163 2162 -0.968746 0.0730391 0.00606215 1 0 1 1 0 0 +EDGE2 2163 1423 0.0281758 0.0423529 0.0104906 1 0 1 1 0 0 +EDGE2 2163 1402 -0.963266 0.00964569 -0.0249387 1 0 1 1 0 0 +EDGE2 2163 1443 0.0370779 -0.015244 0.0089714 1 0 1 1 0 0 +EDGE2 2163 1424 1.11559 0.0523575 0.0656686 1 0 1 1 0 0 +EDGE2 2163 1403 -0.0573297 0.0102892 -0.0290027 1 0 1 1 0 0 +EDGE2 2163 1444 1.04195 0.0469309 -0.00934369 1 0 1 1 0 0 +EDGE2 2163 1404 1.04719 -0.00808132 0.0349614 1 0 1 1 0 0 +EDGE2 2164 1423 -1.05208 0.0909107 0.0259358 1 0 1 1 0 0 +EDGE2 2164 2163 -0.968113 -0.0113096 0.0340009 1 0 1 1 0 0 +EDGE2 2164 1443 -1.05182 -0.0974489 -0.0148713 1 0 1 1 0 0 +EDGE2 2164 1425 0.937111 0.0312961 -0.0178452 1 0 1 1 0 0 +EDGE2 2164 1424 -0.031647 -0.042553 0.0060932 1 0 1 1 0 0 +EDGE2 2164 1403 -0.921542 0.00126014 0.00552526 1 0 1 1 0 0 +EDGE2 2164 1444 -0.135943 -0.0760855 0.00213706 1 0 1 1 0 0 +EDGE2 2164 1404 -0.0656478 -0.0397019 0.0386858 1 0 1 1 0 0 +EDGE2 2164 1445 0.961993 -0.0257562 -0.0320363 1 0 1 1 0 0 +EDGE2 2164 1405 0.972242 0.0955003 0.000961515 1 0 1 1 0 0 +EDGE2 2165 1425 0.0289239 0.0542867 -0.00394483 1 0 1 1 0 0 +EDGE2 2165 1424 -1.02387 0.0145243 0.0154385 1 0 1 1 0 0 +EDGE2 2165 2164 -1.04521 -0.0880307 0.0287398 1 0 1 1 0 0 +EDGE2 2165 1444 -0.979355 -0.0669125 0.00616113 1 0 1 1 0 0 +EDGE2 2165 1404 -0.888178 -0.0297084 -0.00978513 1 0 1 1 0 0 +EDGE2 2165 1445 0.00850152 -0.0610517 -0.0105915 1 0 1 1 0 0 +EDGE2 2165 1405 0.0471483 0.0526353 -0.0152785 1 0 1 1 0 0 +EDGE2 2165 1426 0.0664428 0.924722 1.55364 1 0 1 1 0 0 +EDGE2 2165 1446 -0.00838977 0.948636 1.59147 1 0 1 1 0 0 +EDGE2 2165 1406 -0.029718 0.999764 1.62789 1 0 1 1 0 0 +EDGE2 2166 1425 -1.02601 0.00404923 -1.59466 1 0 1 1 0 0 +EDGE2 2166 2165 -1.04663 0.0775792 -1.57337 1 0 1 1 0 0 +EDGE2 2166 1445 -0.999771 -0.0788388 -1.60569 1 0 1 1 0 0 +EDGE2 2166 1405 -0.982212 0.086481 -1.56669 1 0 1 1 0 0 +EDGE2 2166 1426 0.0142755 0.00948727 -0.025432 1 0 1 1 0 0 +EDGE2 2166 1446 -0.0959932 0.0329353 0.0061126 1 0 1 1 0 0 +EDGE2 2166 1406 -0.00839402 0.0529874 0.00146941 1 0 1 1 0 0 +EDGE2 2166 1427 1.02439 -0.0519323 -0.0222825 1 0 1 1 0 0 +EDGE2 2166 1447 0.907376 0.0865611 -0.0115074 1 0 1 1 0 0 +EDGE2 2166 1407 0.953863 0.0721782 -0.0145765 1 0 1 1 0 0 +EDGE2 2167 1426 -0.902573 0.000639396 -0.0117158 1 0 1 1 0 0 +EDGE2 2167 1446 -1.07324 0.00784171 -0.0331629 1 0 1 1 0 0 +EDGE2 2167 2166 -1.03158 0.134319 -0.0164046 1 0 1 1 0 0 +EDGE2 2167 1406 -0.93714 0.00395199 -0.0195102 1 0 1 1 0 0 +EDGE2 2167 1427 -0.0905608 0.0172765 -0.00704601 1 0 1 1 0 0 +EDGE2 2167 1447 0.0325023 -0.0130422 -0.0266763 1 0 1 1 0 0 +EDGE2 2167 1407 -0.0151982 -0.0188946 0.0148205 1 0 1 1 0 0 +EDGE2 2167 1428 0.987887 0.0860047 0.0254344 1 0 1 1 0 0 +EDGE2 2167 1448 1.02447 0.0236799 0.0180739 1 0 1 1 0 0 +EDGE2 2167 1408 0.94656 0.0201841 -0.0123951 1 0 1 1 0 0 +EDGE2 2168 1427 -1.02305 -0.020687 0.0085091 1 0 1 1 0 0 +EDGE2 2168 1447 -0.928862 0.0405912 -0.0251089 1 0 1 1 0 0 +EDGE2 2168 2167 -0.973974 0.0211974 -0.00324583 1 0 1 1 0 0 +EDGE2 2168 1407 -1.05249 -0.00231193 0.0138735 1 0 1 1 0 0 +EDGE2 2168 1428 -0.0470197 0.00840883 -0.0206992 1 0 1 1 0 0 +EDGE2 2168 1448 0.0948541 -0.0723114 0.0264621 1 0 1 1 0 0 +EDGE2 2168 1408 0.0337609 0.124462 0.0398613 1 0 1 1 0 0 +EDGE2 2168 1429 0.99246 -0.0562804 -0.00575124 1 0 1 1 0 0 +EDGE2 2168 1449 1.00612 0.039361 0.0245283 1 0 1 1 0 0 +EDGE2 2168 1409 0.916712 -0.0204006 -0.00509082 1 0 1 1 0 0 +EDGE2 2169 1428 -0.971735 -0.0198201 0.0235252 1 0 1 1 0 0 +EDGE2 2169 1448 -1.01786 0.112455 -0.0147199 1 0 1 1 0 0 +EDGE2 2169 2168 -1.02411 0.0179391 -0.00934958 1 0 1 1 0 0 +EDGE2 2169 1408 -1.05639 0.0526352 0.0293486 1 0 1 1 0 0 +EDGE2 2169 1429 -0.0596775 0.0456905 0.00321963 1 0 1 1 0 0 +EDGE2 2169 1449 0.0327979 0.0131643 0.0368713 1 0 1 1 0 0 +EDGE2 2169 1409 -0.0233443 -0.0116006 -0.00151069 1 0 1 1 0 0 +EDGE2 2169 1450 0.94985 -0.0851454 -0.00624386 1 0 1 1 0 0 +EDGE2 2169 1390 1.00807 -0.0729407 -3.12328 1 0 1 1 0 0 +EDGE2 2169 1410 0.957417 0.0944105 0.0525542 1 0 1 1 0 0 +EDGE2 2169 1430 0.965164 0.0438492 -0.0463758 1 0 1 1 0 0 +EDGE2 2170 1451 0.00275783 0.98345 1.57502 1 0 1 1 0 0 +EDGE2 2170 1429 -1.05873 0.0609948 0.00444902 1 0 1 1 0 0 +EDGE2 2170 1449 -0.972035 0.00545974 0.0011272 1 0 1 1 0 0 +EDGE2 2170 2169 -0.954611 0.0261287 -0.00233453 1 0 1 1 0 0 +EDGE2 2170 1409 -0.910225 0.0317837 -0.0326608 1 0 1 1 0 0 +EDGE2 2170 1450 -0.0204794 0.113675 0.0080621 1 0 1 1 0 0 +EDGE2 2170 1391 -0.0146248 0.974574 1.57375 1 0 1 1 0 0 +EDGE2 2170 1411 -0.0364264 1.04669 1.56945 1 0 1 1 0 0 +EDGE2 2170 1431 0.0146668 1.02177 1.56619 1 0 1 1 0 0 +EDGE2 2170 1390 0.0845061 0.079856 -3.13686 1 0 1 1 0 0 +EDGE2 2170 1410 0.0146693 -0.0722215 -0.0122847 1 0 1 1 0 0 +EDGE2 2170 1430 -0.0019128 0.0173506 0.016401 1 0 1 1 0 0 +EDGE2 2170 1389 1.02108 0.0461242 -3.15037 1 0 1 1 0 0 +EDGE2 2171 1451 -0.0139317 -0.109101 0.0175989 1 0 1 1 0 0 +EDGE2 2171 1432 0.92098 0.010979 -0.0232751 1 0 1 1 0 0 +EDGE2 2171 1452 0.976232 -0.024777 -0.0145933 1 0 1 1 0 0 +EDGE2 2171 1392 0.986655 -0.0326097 0.0189926 1 0 1 1 0 0 +EDGE2 2171 1412 1.01705 -0.115416 -0.0207827 1 0 1 1 0 0 +EDGE2 2171 1450 -1.03227 -0.017942 -1.56911 1 0 1 1 0 0 +EDGE2 2171 1391 -0.0802767 -0.00266092 0.0179575 1 0 1 1 0 0 +EDGE2 2171 1411 -0.029655 -0.0431536 0.0475622 1 0 1 1 0 0 +EDGE2 2171 1431 0.0338169 -0.055676 0.0361138 1 0 1 1 0 0 +EDGE2 2171 2170 -0.926041 -0.0961336 -1.54127 1 0 1 1 0 0 +EDGE2 2171 1390 -1.09591 -0.0668351 1.55906 1 0 1 1 0 0 +EDGE2 2171 1410 -0.932307 0.0501725 -1.58762 1 0 1 1 0 0 +EDGE2 2171 1430 -1.08176 -0.03448 -1.54456 1 0 1 1 0 0 +EDGE2 2172 1451 -0.939022 0.028084 -0.0166975 1 0 1 1 0 0 +EDGE2 2172 1433 0.915193 0.0356339 -0.00159994 1 0 1 1 0 0 +EDGE2 2172 1453 0.910186 -0.0676577 -0.00649151 1 0 1 1 0 0 +EDGE2 2172 1432 -0.0233764 0.042577 0.0320593 1 0 1 1 0 0 +EDGE2 2172 1393 0.962657 0.0622476 -0.00684217 1 0 1 1 0 0 +EDGE2 2172 1413 0.939624 -0.0221383 -0.00826404 1 0 1 1 0 0 +EDGE2 2172 1452 -0.0259795 0.0636276 -0.012006 1 0 1 1 0 0 +EDGE2 2172 1392 0.0506376 -0.0497304 -0.0304454 1 0 1 1 0 0 +EDGE2 2172 1412 -0.01872 0.068387 -0.0157592 1 0 1 1 0 0 +EDGE2 2172 2171 -1.08722 0.0476598 -0.0204218 1 0 1 1 0 0 +EDGE2 2172 1391 -1.10307 -0.0057483 0.0168448 1 0 1 1 0 0 +EDGE2 2172 1411 -1.05311 0.028209 0.00215334 1 0 1 1 0 0 +EDGE2 2172 1431 -0.937945 -0.0656981 0.0286257 1 0 1 1 0 0 +EDGE2 2173 1433 0.0470904 0.0207899 0.00280038 1 0 1 1 0 0 +EDGE2 2173 1434 1.05641 -0.0418486 0.0269649 1 0 1 1 0 0 +EDGE2 2173 1454 0.938874 0.0582747 -0.0386677 1 0 1 1 0 0 +EDGE2 2173 1394 0.929915 0.11887 0.00747146 1 0 1 1 0 0 +EDGE2 2173 1414 1.01394 0.0092012 0.0217883 1 0 1 1 0 0 +EDGE2 2173 1453 0.095334 0.00710744 -0.00845368 1 0 1 1 0 0 +EDGE2 2173 1432 -1.00797 0.029218 -0.013047 1 0 1 1 0 0 +EDGE2 2173 2172 -0.943391 -0.065826 0.00707673 1 0 1 1 0 0 +EDGE2 2173 1393 0.0208308 0.0344136 -0.0318077 1 0 1 1 0 0 +EDGE2 2173 1413 0.0347848 0.0269486 -0.0138188 1 0 1 1 0 0 +EDGE2 2173 1452 -1.02869 -0.0232956 0.000208084 1 0 1 1 0 0 +EDGE2 2173 1392 -1.06217 -0.0425506 -0.000326003 1 0 1 1 0 0 +EDGE2 2173 1412 -1.00014 -0.0476692 0.0185272 1 0 1 1 0 0 +EDGE2 2174 1435 1.00351 0.0127174 0.00954696 1 0 1 1 0 0 +EDGE2 2174 1455 0.986299 -0.0378007 -0.0139524 1 0 1 1 0 0 +EDGE2 2174 1755 0.931442 0.0554107 -3.15064 1 0 1 1 0 0 +EDGE2 2174 1735 1.00896 -0.0318516 -3.15636 1 0 1 1 0 0 +EDGE2 2174 1433 -1.04268 0.00982017 -0.0153145 1 0 1 1 0 0 +EDGE2 2174 1434 0.00283637 -0.0196887 -0.0283833 1 0 1 1 0 0 +EDGE2 2174 1395 1.04924 -0.00770247 0.0202528 1 0 1 1 0 0 +EDGE2 2174 1415 1.01224 -0.0274906 -0.000732876 1 0 1 1 0 0 +EDGE2 2174 1454 0.0639598 0.0573265 -0.0326466 1 0 1 1 0 0 +EDGE2 2174 2173 -1.10089 0.0225205 -0.0214009 1 0 1 1 0 0 +EDGE2 2174 1394 0.0968998 -0.0331922 -0.0199345 1 0 1 1 0 0 +EDGE2 2174 1414 -0.0662713 0.0148373 -0.00617601 1 0 1 1 0 0 +EDGE2 2174 1453 -1.0574 -0.0350358 -0.00932643 1 0 1 1 0 0 +EDGE2 2174 1393 -1.04563 0.0891931 -0.031951 1 0 1 1 0 0 +EDGE2 2174 1413 -1.0776 -0.00858707 0.020352 1 0 1 1 0 0 +EDGE2 2175 1734 0.935188 -0.030937 -3.14704 1 0 1 1 0 0 +EDGE2 2175 1754 0.975311 0.110923 -3.14948 1 0 1 1 0 0 +EDGE2 2175 1435 0.0218965 -0.0404234 0.0314053 1 0 1 1 0 0 +EDGE2 2175 1455 -0.0262788 -0.0414213 -0.019305 1 0 1 1 0 0 +EDGE2 2175 1416 -0.0565657 1.02302 1.57933 1 0 1 1 0 0 +EDGE2 2175 1756 0.00102216 0.990549 1.53951 1 0 1 1 0 0 +EDGE2 2175 1436 0.0680999 1.06416 1.59277 1 0 1 1 0 0 +EDGE2 2175 1755 -0.146519 0.0256236 -3.09465 1 0 1 1 0 0 +EDGE2 2175 1396 -0.0250842 1.06664 1.57877 1 0 1 1 0 0 +EDGE2 2175 1735 -0.0138891 -0.104851 -3.15426 1 0 1 1 0 0 +EDGE2 2175 1434 -1.0431 0.0483901 0.00836917 1 0 1 1 0 0 +EDGE2 2175 2174 -1.04346 0.0404417 -0.0233866 1 0 1 1 0 0 +EDGE2 2175 1395 0.0138117 -0.0187471 0.0206363 1 0 1 1 0 0 +EDGE2 2175 1415 -0.0377849 -0.066931 0.00380256 1 0 1 1 0 0 +EDGE2 2175 1454 -0.948671 0.0236793 -0.0168033 1 0 1 1 0 0 +EDGE2 2175 1394 -1.00718 0.0132586 0.011156 1 0 1 1 0 0 +EDGE2 2175 1414 -1.02761 0.154384 -0.00495521 1 0 1 1 0 0 +EDGE2 2175 1456 -0.0608586 -1.00859 -1.55847 1 0 1 1 0 0 +EDGE2 2175 1736 -0.0418557 -0.934679 -1.57278 1 0 1 1 0 0 +EDGE2 2176 1417 1.01374 -0.0144572 -0.00365631 1 0 1 1 0 0 +EDGE2 2176 1757 1.02493 0.0500275 0.0277699 1 0 1 1 0 0 +EDGE2 2176 1437 0.967014 -0.0507085 -0.00552081 1 0 1 1 0 0 +EDGE2 2176 1435 -1.05727 -0.0569473 -1.55289 1 0 1 1 0 0 +EDGE2 2176 1455 -1.02378 0.0355363 -1.57541 1 0 1 1 0 0 +EDGE2 2176 1416 0.000366036 -0.12459 0.0414368 1 0 1 1 0 0 +EDGE2 2176 1756 0.0169987 -0.0453958 -0.0113034 1 0 1 1 0 0 +EDGE2 2176 1397 1.03133 -0.00297457 -0.0140056 1 0 1 1 0 0 +EDGE2 2176 1436 0.087574 0.0436427 0.0172756 1 0 1 1 0 0 +EDGE2 2176 1755 -0.95333 0.0676606 1.5521 1 0 1 1 0 0 +EDGE2 2176 2175 -1.02263 -0.0433011 -1.53233 1 0 1 1 0 0 +EDGE2 2176 1396 -0.0100082 0.0310993 -0.0150863 1 0 1 1 0 0 +EDGE2 2176 1735 -0.97081 -0.0326683 1.60064 1 0 1 1 0 0 +EDGE2 2176 1395 -1.0263 0.0371929 -1.57759 1 0 1 1 0 0 +EDGE2 2176 1415 -0.957627 -0.0299261 -1.57631 1 0 1 1 0 0 +EDGE2 2177 1417 -0.0416173 -0.0887367 0.0271824 1 0 1 1 0 0 +EDGE2 2177 1758 0.986847 -0.0123899 -0.0134056 1 0 1 1 0 0 +EDGE2 2177 1398 0.993085 0.078246 -0.0252534 1 0 1 1 0 0 +EDGE2 2177 1438 1.04587 -0.0591013 -0.00905132 1 0 1 1 0 0 +EDGE2 2177 1418 0.999997 0.0389547 0.0288537 1 0 1 1 0 0 +EDGE2 2177 1757 0.00995343 -0.056312 -0.0499771 1 0 1 1 0 0 +EDGE2 2177 1437 0.0225704 0.0356753 -0.0316616 1 0 1 1 0 0 +EDGE2 2177 1416 -1.05899 -0.0882499 0.0100207 1 0 1 1 0 0 +EDGE2 2177 1756 -0.904457 -0.0471421 -0.0472831 1 0 1 1 0 0 +EDGE2 2177 2176 -0.992375 0.030789 -0.00619644 1 0 1 1 0 0 +EDGE2 2177 1397 -0.00194014 0.0220497 0.00364324 1 0 1 1 0 0 +EDGE2 2177 1436 -1.02347 0.011747 -0.00113962 1 0 1 1 0 0 +EDGE2 2177 1396 -0.913628 -0.0303645 -0.0143641 1 0 1 1 0 0 +EDGE2 2178 1417 -1.10322 -0.028607 0.00108362 1 0 1 1 0 0 +EDGE2 2178 1758 0.0520138 -0.0357845 -0.020726 1 0 1 1 0 0 +EDGE2 2178 1419 1.00333 0.0469166 0.0258957 1 0 1 1 0 0 +EDGE2 2178 1759 0.966825 0.0128351 -0.00269254 1 0 1 1 0 0 +EDGE2 2178 1439 1.0275 0.0582378 0.00490917 1 0 1 1 0 0 +EDGE2 2178 1399 1.0354 -0.085349 0.00174072 1 0 1 1 0 0 +EDGE2 2178 1398 -0.0334166 0.0410899 0.0249786 1 0 1 1 0 0 +EDGE2 2178 1438 0.0209738 0.0727165 -0.00930652 1 0 1 1 0 0 +EDGE2 2178 1418 -0.0185307 -0.0100416 0.00619548 1 0 1 1 0 0 +EDGE2 2178 1757 -1.10454 0.00373757 0.0162183 1 0 1 1 0 0 +EDGE2 2178 2177 -1.04413 0.0138097 0.014911 1 0 1 1 0 0 +EDGE2 2178 1437 -0.963261 -0.0893631 0.0294062 1 0 1 1 0 0 +EDGE2 2178 1397 -0.955729 -0.0622119 -0.00293302 1 0 1 1 0 0 +EDGE2 2179 2060 0.897285 0.0112347 -3.13733 1 0 1 1 0 0 +EDGE2 2179 2140 1.0037 0.0385328 -3.13125 1 0 1 1 0 0 +EDGE2 2179 2160 0.967067 0.0128808 -3.10506 1 0 1 1 0 0 +EDGE2 2179 2120 0.929576 0.0234331 -3.14166 1 0 1 1 0 0 +EDGE2 2179 1420 0.951821 -0.0153585 -0.0165936 1 0 1 1 0 0 +EDGE2 2179 1440 1.01537 -0.0549417 0.00144972 1 0 1 1 0 0 +EDGE2 2179 1760 1.0216 0.0647576 0.00571276 1 0 1 1 0 0 +EDGE2 2179 1400 0.974346 -0.105354 0.0133036 1 0 1 1 0 0 +EDGE2 2179 1758 -0.990972 -0.0858514 -0.020801 1 0 1 1 0 0 +EDGE2 2179 1419 0.104123 0.050242 -0.0263571 1 0 1 1 0 0 +EDGE2 2179 1759 0.0191357 0.0459923 0.014073 1 0 1 1 0 0 +EDGE2 2179 1439 -0.0258528 -0.00223342 0.0113439 1 0 1 1 0 0 +EDGE2 2179 2178 -0.999787 0.021889 -0.0133011 1 0 1 1 0 0 +EDGE2 2179 1399 0.0489365 -0.0257986 0.0138414 1 0 1 1 0 0 +EDGE2 2179 1398 -0.982995 0.0692225 -0.00609271 1 0 1 1 0 0 +EDGE2 2179 1438 -1.06279 -0.0545077 -0.0205672 1 0 1 1 0 0 +EDGE2 2179 1418 -0.988098 -0.0529106 -0.00675838 1 0 1 1 0 0 +EDGE2 2180 2119 0.954654 0.0710265 -3.11706 1 0 1 1 0 0 +EDGE2 2180 2139 1.04379 -0.0378412 -3.12786 1 0 1 1 0 0 +EDGE2 2180 2159 1.01163 -0.0406897 -3.13998 1 0 1 1 0 0 +EDGE2 2180 2059 0.914056 0.00412228 -3.15295 1 0 1 1 0 0 +EDGE2 2180 2060 -0.0948626 -0.0196899 -3.11782 1 0 1 1 0 0 +EDGE2 2180 1761 0.043392 -1.02823 -1.58112 1 0 1 1 0 0 +EDGE2 2180 2121 0.0734414 -1.05424 -1.57453 1 0 1 1 0 0 +EDGE2 2180 2141 0.00235159 -1.0646 -1.55059 1 0 1 1 0 0 +EDGE2 2180 2061 -0.0224966 -1.00138 -1.55381 1 0 1 1 0 0 +EDGE2 2180 2140 -0.00833545 -0.0993956 -3.12956 1 0 1 1 0 0 +EDGE2 2180 2160 -0.0351611 0.00675803 -3.15312 1 0 1 1 0 0 +EDGE2 2180 2120 -0.00164531 -0.0372959 -3.11872 1 0 1 1 0 0 +EDGE2 2180 1420 0.0338075 -0.0213172 0.00813993 1 0 1 1 0 0 +EDGE2 2180 1440 0.0525534 0.0128701 -0.0113227 1 0 1 1 0 0 +EDGE2 2180 1760 -0.0713215 -0.000531802 -0.000911128 1 0 1 1 0 0 +EDGE2 2180 1400 -0.0033474 0.0159566 -0.0103069 1 0 1 1 0 0 +EDGE2 2180 1421 0.0748204 0.959735 1.5921 1 0 1 1 0 0 +EDGE2 2180 1441 -0.0131848 0.978508 1.5733 1 0 1 1 0 0 +EDGE2 2180 2161 0.0418288 0.933013 1.56717 1 0 1 1 0 0 +EDGE2 2180 1401 -0.0644859 1.08422 1.61699 1 0 1 1 0 0 +EDGE2 2180 1419 -1.07923 -0.0766671 0.00230673 1 0 1 1 0 0 +EDGE2 2180 1759 -0.985099 0.0718979 -0.00906212 1 0 1 1 0 0 +EDGE2 2180 2179 -0.956433 -0.0132132 -0.00861031 1 0 1 1 0 0 +EDGE2 2180 1439 -1.04162 -0.0358767 0.0351547 1 0 1 1 0 0 +EDGE2 2180 1399 -1.02728 0.00611809 -0.0396808 1 0 1 1 0 0 +EDGE2 2181 1422 1.03889 0.0320414 -0.0217837 1 0 1 1 0 0 +EDGE2 2181 2060 -0.880509 -0.0726758 1.56544 1 0 1 1 0 0 +EDGE2 2181 2140 -0.883551 -0.00817901 1.5899 1 0 1 1 0 0 +EDGE2 2181 2160 -0.924055 -0.0238153 1.5645 1 0 1 1 0 0 +EDGE2 2181 2180 -0.989412 0.0216186 -1.54248 1 0 1 1 0 0 +EDGE2 2181 2120 -1.044 -0.0820733 1.57231 1 0 1 1 0 0 +EDGE2 2181 1420 -0.969531 -0.0151049 -1.57395 1 0 1 1 0 0 +EDGE2 2181 1440 -1.01787 0.024962 -1.58095 1 0 1 1 0 0 +EDGE2 2181 1760 -1.03571 -0.0376793 -1.55921 1 0 1 1 0 0 +EDGE2 2181 1400 -0.959929 -0.00941574 -1.56052 1 0 1 1 0 0 +EDGE2 2181 1421 0.0870644 0.000864871 0.00510808 1 0 1 1 0 0 +EDGE2 2181 1441 -0.0595351 -0.0569711 0.0110196 1 0 1 1 0 0 +EDGE2 2181 2161 0.0731673 0.00920308 0.0114171 1 0 1 1 0 0 +EDGE2 2181 1401 -0.0277142 0.0381049 -0.0153805 1 0 1 1 0 0 +EDGE2 2181 1442 0.951041 -0.0453643 0.014388 1 0 1 1 0 0 +EDGE2 2181 2162 1.03373 -0.0557148 0.0173836 1 0 1 1 0 0 +EDGE2 2181 1402 1.01276 -0.0289262 -0.0268784 1 0 1 1 0 0 +EDGE2 2182 1422 -0.0543826 0.00782201 0.0592131 1 0 1 1 0 0 +EDGE2 2182 2181 -1.00626 -0.067705 0.0183327 1 0 1 1 0 0 +EDGE2 2182 1421 -0.992036 -0.0954678 0.00973197 1 0 1 1 0 0 +EDGE2 2182 1441 -1.08432 -0.0128314 -0.00554434 1 0 1 1 0 0 +EDGE2 2182 2161 -1.04976 -0.00996168 0.00249958 1 0 1 1 0 0 +EDGE2 2182 1401 -1.04892 0.00719151 -0.0221932 1 0 1 1 0 0 +EDGE2 2182 1442 -0.0156651 -0.0880728 -0.0383723 1 0 1 1 0 0 +EDGE2 2182 2162 0.0370736 -0.0194386 -0.00294003 1 0 1 1 0 0 +EDGE2 2182 1423 0.923874 0.00953701 -0.0506806 1 0 1 1 0 0 +EDGE2 2182 2163 0.98186 0.0240462 0.00269037 1 0 1 1 0 0 +EDGE2 2182 1402 0.00623126 -0.0257622 0.0106131 1 0 1 1 0 0 +EDGE2 2182 1443 0.980441 0.0361469 -0.0100435 1 0 1 1 0 0 +EDGE2 2182 1403 1.03125 -0.0111131 0.00779674 1 0 1 1 0 0 +EDGE2 2183 1422 -0.972551 -0.0244959 0.0189524 1 0 1 1 0 0 +EDGE2 2183 2182 -1.04107 -0.00131453 -0.00483585 1 0 1 1 0 0 +EDGE2 2183 1442 -0.993362 0.0172301 0.0172795 1 0 1 1 0 0 +EDGE2 2183 2162 -0.943666 0.0564983 -0.00317975 1 0 1 1 0 0 +EDGE2 2183 1423 -0.0845097 -0.0294212 0.00139713 1 0 1 1 0 0 +EDGE2 2183 2163 0.0242921 0.087572 -0.0215206 1 0 1 1 0 0 +EDGE2 2183 1402 -1.03978 -0.106216 0.00140953 1 0 1 1 0 0 +EDGE2 2183 1443 0.00858685 -0.00523451 0.0175468 1 0 1 1 0 0 +EDGE2 2183 1424 0.944634 -0.0759116 0.0260261 1 0 1 1 0 0 +EDGE2 2183 2164 1.01686 -0.0834614 -0.00254076 1 0 1 1 0 0 +EDGE2 2183 1403 -0.014354 0.0506272 0.0205474 1 0 1 1 0 0 +EDGE2 2183 1444 0.903401 0.0290439 -0.0134621 1 0 1 1 0 0 +EDGE2 2183 1404 1.0091 0.00681291 -0.00360477 1 0 1 1 0 0 +EDGE2 2184 1423 -1.04878 -0.0215708 -3.33116e-05 1 0 1 1 0 0 +EDGE2 2184 2163 -1.06437 0.0937028 0.0479207 1 0 1 1 0 0 +EDGE2 2184 2183 -0.997657 -0.0355402 -0.00576653 1 0 1 1 0 0 +EDGE2 2184 1443 -0.978708 0.0314818 0.0341623 1 0 1 1 0 0 +EDGE2 2184 1425 0.966145 0.00929622 -0.0279077 1 0 1 1 0 0 +EDGE2 2184 1424 -0.072626 0.0318602 -0.0294825 1 0 1 1 0 0 +EDGE2 2184 2164 0.0658596 -0.0922437 -0.00723288 1 0 1 1 0 0 +EDGE2 2184 1403 -1.00786 0.0274992 0.0115305 1 0 1 1 0 0 +EDGE2 2184 1444 0.0120609 -0.0401694 -0.00513384 1 0 1 1 0 0 +EDGE2 2184 2165 1.06819 -0.0232264 -0.0298429 1 0 1 1 0 0 +EDGE2 2184 1404 -0.0216494 -0.0415635 -0.00585614 1 0 1 1 0 0 +EDGE2 2184 1445 0.934506 -0.0854857 0.0257269 1 0 1 1 0 0 +EDGE2 2184 1405 0.999862 -0.0959842 -0.0193207 1 0 1 1 0 0 +EDGE2 2185 1425 0.0923291 0.125453 -0.0237248 1 0 1 1 0 0 +EDGE2 2185 1424 -1.03006 0.0004755 0.00753839 1 0 1 1 0 0 +EDGE2 2185 2164 -1.028 -0.0341 -0.00191103 1 0 1 1 0 0 +EDGE2 2185 2184 -1.01814 -0.0676239 0.0129221 1 0 1 1 0 0 +EDGE2 2185 1444 -1.06233 0.0538436 -0.0313218 1 0 1 1 0 0 +EDGE2 2185 2165 -0.0556345 -0.0455121 0.0106658 1 0 1 1 0 0 +EDGE2 2185 1404 -0.950283 -0.0120488 0.0174735 1 0 1 1 0 0 +EDGE2 2185 1445 -0.0221831 -0.00201257 -0.00234343 1 0 1 1 0 0 +EDGE2 2185 1405 0.0887945 0.0533982 -0.0100952 1 0 1 1 0 0 +EDGE2 2185 1426 -0.0642847 0.984826 1.58416 1 0 1 1 0 0 +EDGE2 2185 1446 -0.0175258 0.949181 1.5731 1 0 1 1 0 0 +EDGE2 2185 2166 -0.0118313 0.975391 1.57496 1 0 1 1 0 0 +EDGE2 2185 1406 -0.033847 1.00471 1.56513 1 0 1 1 0 0 +EDGE2 2186 1425 -0.896147 0.0481932 1.55446 1 0 1 1 0 0 +EDGE2 2186 2165 -1.10377 -0.0665918 1.5909 1 0 1 1 0 0 +EDGE2 2186 2185 -1.01599 -0.0173334 1.58737 1 0 1 1 0 0 +EDGE2 2186 1445 -1.02395 -0.0318941 1.59324 1 0 1 1 0 0 +EDGE2 2186 1405 -1.06642 0.0288155 1.56573 1 0 1 1 0 0 +EDGE2 2187 2186 -0.992988 0.083076 0.0100594 1 0 1 1 0 0 +EDGE2 2188 2187 -1.04896 0.0578093 -0.0251365 1 0 1 1 0 0 +EDGE2 2189 1790 0.969248 -0.0497689 -3.15415 1 0 1 1 0 0 +EDGE2 2189 2050 1.01046 -0.075706 -3.18863 1 0 1 1 0 0 +EDGE2 2189 2188 -1.00837 -0.00385855 -0.0310049 1 0 1 1 0 0 +EDGE2 2190 2049 1.04884 -0.0317418 -3.12243 1 0 1 1 0 0 +EDGE2 2190 1789 0.962467 -0.0645758 -3.14224 1 0 1 1 0 0 +EDGE2 2190 2051 -0.0488412 -1.01008 -1.57221 1 0 1 1 0 0 +EDGE2 2190 1790 0.0493555 -0.00609352 -3.15869 1 0 1 1 0 0 +EDGE2 2190 2050 0.0780072 0.0177905 -3.1728 1 0 1 1 0 0 +EDGE2 2190 1791 0.0772045 0.853087 1.58233 1 0 1 1 0 0 +EDGE2 2190 2189 -1.15743 -0.00234355 -0.0133109 1 0 1 1 0 0 +EDGE2 2191 2190 -1.02529 -0.0282563 -1.55479 1 0 1 1 0 0 +EDGE2 2191 1790 -1.0631 0.0122197 1.59419 1 0 1 1 0 0 +EDGE2 2191 2050 -0.937157 0.0307331 1.55503 1 0 1 1 0 0 +EDGE2 2191 1791 0.0367043 0.0270711 -0.00367781 1 0 1 1 0 0 +EDGE2 2191 1792 0.977954 0.0420549 -0.0167213 1 0 1 1 0 0 +EDGE2 2192 2191 -0.967204 0.0263267 -0.0342351 1 0 1 1 0 0 +EDGE2 2192 1791 -0.986703 0.0233637 0.0299736 1 0 1 1 0 0 +EDGE2 2192 1792 0.0181997 0.00285782 -0.0449398 1 0 1 1 0 0 +EDGE2 2192 1793 0.949876 -0.0245773 -0.000384924 1 0 1 1 0 0 +EDGE2 2193 2192 -0.961564 0.0302504 -1.65408e-05 1 0 1 1 0 0 +EDGE2 2193 1792 -1.04611 -0.0653375 -0.0103747 1 0 1 1 0 0 +EDGE2 2193 1793 -0.00561917 -0.027699 -0.0210584 1 0 1 1 0 0 +EDGE2 2193 1794 1.04293 0.0309926 -0.0146176 1 0 1 1 0 0 +EDGE2 2194 2193 -1.0431 -0.0656662 0.0106075 1 0 1 1 0 0 +EDGE2 2194 1793 -0.966104 -0.0225551 0.0589684 1 0 1 1 0 0 +EDGE2 2194 1794 0.00173657 -0.00997574 -0.00190855 1 0 1 1 0 0 +EDGE2 2194 1795 1.06088 0.0308372 -0.0150368 1 0 1 1 0 0 +EDGE2 2195 2194 -0.962456 -0.00664463 -0.010253 1 0 1 1 0 0 +EDGE2 2195 1794 -0.938939 -0.0254766 0.0270911 1 0 1 1 0 0 +EDGE2 2195 1795 0.0240659 -0.0849868 -0.0338022 1 0 1 1 0 0 +EDGE2 2195 1796 0.00539704 1.03566 1.58173 1 0 1 1 0 0 +EDGE2 2196 2195 -0.995448 0.0980084 1.59678 1 0 1 1 0 0 +EDGE2 2196 1795 -0.982372 -0.0166543 1.5753 1 0 1 1 0 0 +EDGE2 2197 2196 -0.99984 0.0736154 0.00177205 1 0 1 1 0 0 +EDGE2 2198 2197 -1.02575 0.0202262 0.000461052 1 0 1 1 0 0 +EDGE2 2199 2198 -1.02163 -0.0395936 -0.0141716 1 0 1 1 0 0 +EDGE2 2200 2199 -1.00407 -0.0590026 -0.0144651 1 0 1 1 0 0 +EDGE2 2201 2200 -0.979192 -0.0543442 1.53603 1 0 1 1 0 0 +EDGE2 2202 2201 -1.07273 0.017045 -0.00468813 1 0 1 1 0 0 +EDGE2 2203 2202 -0.940669 0.0704567 0.000849279 1 0 1 1 0 0 +EDGE2 2204 1785 1.01271 -0.037945 -3.12584 1 0 1 1 0 0 +EDGE2 2204 2045 0.999426 -0.0184158 -3.14595 1 0 1 1 0 0 +EDGE2 2204 2203 -1.00415 -0.0251315 -0.00360985 1 0 1 1 0 0 +EDGE2 2205 2046 0.0147106 -0.917316 -1.55608 1 0 1 1 0 0 +EDGE2 2205 1785 0.0153126 0.0616142 -3.15344 1 0 1 1 0 0 +EDGE2 2205 1784 1.01545 -0.0139545 -3.15039 1 0 1 1 0 0 +EDGE2 2205 2044 0.979683 0.0356822 -3.17474 1 0 1 1 0 0 +EDGE2 2205 2045 0.0200051 0.0287686 -3.16402 1 0 1 1 0 0 +EDGE2 2205 2204 -0.978458 -0.028867 -0.0050807 1 0 1 1 0 0 +EDGE2 2205 1786 -0.00754414 -0.950161 -1.59542 1 0 1 1 0 0 +EDGE2 2206 1785 -0.980034 0.010794 1.53513 1 0 1 1 0 0 +EDGE2 2206 2205 -1.03588 0.0421834 -1.54638 1 0 1 1 0 0 +EDGE2 2206 2045 -1.09311 -0.0301418 1.57767 1 0 1 1 0 0 +EDGE2 2207 2206 -1.06871 0.000501531 -0.000749082 1 0 1 1 0 0 +EDGE2 2208 2207 -1.02861 -0.0190341 0.00513373 1 0 1 1 0 0 +EDGE2 2209 2208 -0.956376 -0.0834457 -0.000875387 1 0 1 1 0 0 +EDGE2 2210 2209 -1.01017 0.023664 0.017762 1 0 1 1 0 0 +EDGE2 2211 2210 -0.902452 0.0234987 -1.5722 1 0 1 1 0 0 +EDGE2 2212 2211 -0.998166 -0.0355796 -0.0119089 1 0 1 1 0 0 +EDGE2 2213 2212 -0.987716 0.0293255 0.0248976 1 0 1 1 0 0 +EDGE2 2214 2213 -0.912834 -0.106959 0.000960611 1 0 1 1 0 0 +EDGE2 2215 2214 -0.998556 0.0833323 0.0226073 1 0 1 1 0 0 +EDGE2 2216 2215 -0.980913 0.0101927 -1.55954 1 0 1 1 0 0 +EDGE2 2217 2216 -0.990428 0.00109724 -0.0120515 1 0 1 1 0 0 +EDGE2 2218 2217 -1.05896 0.0159169 -0.0278579 1 0 1 1 0 0 +EDGE2 2219 2218 -0.950234 0.0621747 -0.0482245 1 0 1 1 0 0 +EDGE2 2219 2200 0.866943 -0.0165007 -3.15058 1 0 1 1 0 0 +EDGE2 2220 2219 -1.05135 -0.0222841 -0.000121729 1 0 1 1 0 0 +EDGE2 2220 2201 0.00968592 0.974881 1.59624 1 0 1 1 0 0 +EDGE2 2220 2200 -0.076765 -0.00763856 -3.11147 1 0 1 1 0 0 +EDGE2 2220 2199 0.933738 -0.0409065 -3.12548 1 0 1 1 0 0 +EDGE2 2221 2200 -1.01386 -0.0166158 -1.56709 1 0 1 1 0 0 +EDGE2 2221 2220 -1.01962 0.0629319 1.60639 1 0 1 1 0 0 +EDGE2 2222 2221 -1.02742 -0.047289 -0.0263962 1 0 1 1 0 0 +EDGE2 2223 2222 -0.985796 -0.0250537 -0.0241682 1 0 1 1 0 0 +EDGE2 2224 2223 -0.940008 -0.0491287 -0.00339472 1 0 1 1 0 0 +EDGE2 2225 2224 -0.993908 -0.0684599 0.0173383 1 0 1 1 0 0 +EDGE2 2226 2225 -0.987591 0.0180776 -1.57381 1 0 1 1 0 0 +EDGE2 2227 2226 -0.977113 -0.0442372 0.04251 1 0 1 1 0 0 +EDGE2 2228 2227 -1.11938 0.0786999 -0.0134007 1 0 1 1 0 0 +EDGE2 2229 2228 -0.935866 -0.0408408 0.00287699 1 0 1 1 0 0 +EDGE2 2229 1810 0.981498 0.0316527 -3.14264 1 0 1 1 0 0 +EDGE2 2230 2229 -0.935261 -0.0170677 -0.0213083 1 0 1 1 0 0 +EDGE2 2230 1810 -0.0973341 0.0255385 -3.12896 1 0 1 1 0 0 +EDGE2 2230 1811 -0.00186838 -1.02557 -1.58791 1 0 1 1 0 0 +EDGE2 2230 1809 1.0269 0.0495208 -3.14422 1 0 1 1 0 0 +EDGE2 2231 1810 -0.919156 0.0217323 -1.60131 1 0 1 1 0 0 +EDGE2 2231 2230 -0.961825 9.51495e-05 1.58921 1 0 1 1 0 0 +EDGE2 2231 1811 0.0589507 0.040168 -0.000502909 1 0 1 1 0 0 +EDGE2 2231 1812 1.00439 0.0227712 0.00290161 1 0 1 1 0 0 +EDGE2 2232 2231 -1.00216 -0.0908075 0.0272264 1 0 1 1 0 0 +EDGE2 2232 1811 -1.05 -0.0220479 -0.0340585 1 0 1 1 0 0 +EDGE2 2232 1812 -0.0521485 -0.0202906 -0.00190847 1 0 1 1 0 0 +EDGE2 2232 1813 1.04299 0.00600606 0.0488324 1 0 1 1 0 0 +EDGE2 2233 1812 -0.994068 -0.0338151 0.0214558 1 0 1 1 0 0 +EDGE2 2233 2232 -0.962631 -0.0124822 -0.00714006 1 0 1 1 0 0 +EDGE2 2233 1813 -0.0655957 0.0166774 0.00720525 1 0 1 1 0 0 +EDGE2 2233 1814 0.948846 0.0522389 -0.00126824 1 0 1 1 0 0 +EDGE2 2234 1813 -0.984018 -0.00845452 -0.0105727 1 0 1 1 0 0 +EDGE2 2234 2233 -0.974382 -0.0210266 0.0173431 1 0 1 1 0 0 +EDGE2 2234 1814 0.0615544 -0.0292107 0.0249075 1 0 1 1 0 0 +EDGE2 2234 1815 0.962326 -0.0344142 0.0178285 1 0 1 1 0 0 +EDGE2 2235 2234 -0.911326 0.0320809 0.0100203 1 0 1 1 0 0 +EDGE2 2235 1814 -0.982545 0.0791267 0.0137085 1 0 1 1 0 0 +EDGE2 2235 1815 -0.0284333 -0.0587497 0.040644 1 0 1 1 0 0 +EDGE2 2235 1816 -0.0364036 0.954751 1.57415 1 0 1 1 0 0 +EDGE2 2236 2235 -1.05967 0.0207741 -1.56145 1 0 1 1 0 0 +EDGE2 2236 1815 -0.952067 0.0568114 -1.55016 1 0 1 1 0 0 +EDGE2 2236 1816 0.0470602 0.0082977 -0.0362904 1 0 1 1 0 0 +EDGE2 2236 1817 0.982596 0.0306546 0.00583324 1 0 1 1 0 0 +EDGE2 2237 1816 -0.998984 0.0315525 0.00164735 1 0 1 1 0 0 +EDGE2 2237 2236 -0.964224 0.0571551 -0.00354015 1 0 1 1 0 0 +EDGE2 2237 1817 0.00618513 0.0534451 0.0197818 1 0 1 1 0 0 +EDGE2 2237 1818 0.999486 0.00726764 0.0357258 1 0 1 1 0 0 +EDGE2 2238 2237 -1.0361 0.0316472 0.00524252 1 0 1 1 0 0 +EDGE2 2238 1817 -0.993579 -0.00141216 0.0201416 1 0 1 1 0 0 +EDGE2 2238 1818 -0.0704455 0.00784236 -0.0209088 1 0 1 1 0 0 +EDGE2 2238 1819 1.02704 -0.0368111 0.0187475 1 0 1 1 0 0 +EDGE2 2239 2238 -1.00584 0.00581569 0.0160898 1 0 1 1 0 0 +EDGE2 2239 1818 -1.05335 0.0643557 0.0271207 1 0 1 1 0 0 +EDGE2 2239 1819 0.0118783 0.0411003 0.0214704 1 0 1 1 0 0 +EDGE2 2239 1820 0.921448 0.0489993 -0.0152416 1 0 1 1 0 0 +EDGE2 2239 1240 0.94281 0.0923984 -3.17065 1 0 1 1 0 0 +EDGE2 2240 2239 -1.02113 0.00416257 -0.00977465 1 0 1 1 0 0 +EDGE2 2240 1819 -0.946715 0.0598838 0.0127978 1 0 1 1 0 0 +EDGE2 2240 1821 -0.0737684 1.08539 1.57587 1 0 1 1 0 0 +EDGE2 2240 1820 -0.0495917 0.0674565 0.0137116 1 0 1 1 0 0 +EDGE2 2240 1240 0.122908 -0.0629923 -3.12208 1 0 1 1 0 0 +EDGE2 2240 1241 -0.0518896 -1.06607 -1.59971 1 0 1 1 0 0 +EDGE2 2240 1239 1.07575 0.00537076 -3.14172 1 0 1 1 0 0 +EDGE2 2241 1821 -0.00827236 0.0178409 0.0302914 1 0 1 1 0 0 +EDGE2 2241 1822 0.979094 0.0702065 -0.00479287 1 0 1 1 0 0 +EDGE2 2241 1820 -1.06369 0.052777 -1.55733 1 0 1 1 0 0 +EDGE2 2241 2240 -1.02334 0.0115801 -1.59757 1 0 1 1 0 0 +EDGE2 2241 1240 -1.12251 -0.0396515 1.55758 1 0 1 1 0 0 +EDGE2 2242 1823 1.0024 0.00634102 0.024658 1 0 1 1 0 0 +EDGE2 2242 1821 -1.01886 -0.0199512 0.00813317 1 0 1 1 0 0 +EDGE2 2242 2241 -1.00463 0.0137905 -0.0127072 1 0 1 1 0 0 +EDGE2 2242 1822 -0.0464618 -0.0500091 -0.00173833 1 0 1 1 0 0 +EDGE2 2243 2242 -1.01059 -0.0382833 0.000173557 1 0 1 1 0 0 +EDGE2 2243 1824 0.971327 -0.118992 -0.00253553 1 0 1 1 0 0 +EDGE2 2243 1823 0.0288452 -0.0151128 -0.0270904 1 0 1 1 0 0 +EDGE2 2243 1822 -1.01681 -0.00914453 -0.0120744 1 0 1 1 0 0 +EDGE2 2244 1805 1.01236 -0.0691229 -3.15729 1 0 1 1 0 0 +EDGE2 2244 1825 0.93987 0.122967 -0.0145253 1 0 1 1 0 0 +EDGE2 2244 2243 -0.964134 -0.0166506 0.0197035 1 0 1 1 0 0 +EDGE2 2244 1824 -0.0125981 0.115562 0.0100693 1 0 1 1 0 0 +EDGE2 2244 1823 -1.02898 0.0419815 -0.036612 1 0 1 1 0 0 +EDGE2 2245 1805 0.00202461 0.0829931 -3.13649 1 0 1 1 0 0 +EDGE2 2245 1806 0.00712901 0.94657 1.60428 1 0 1 1 0 0 +EDGE2 2245 1804 1.04725 0.0851976 -3.1762 1 0 1 1 0 0 +EDGE2 2245 1825 -0.0363504 0.0542909 8.12935e-05 1 0 1 1 0 0 +EDGE2 2245 1824 -1.05851 -0.0426968 0.027242 1 0 1 1 0 0 +EDGE2 2245 2244 -1.00991 0.0118014 0.0019055 1 0 1 1 0 0 +EDGE2 2245 1826 0.092312 -0.964149 -1.61005 1 0 1 1 0 0 +EDGE2 2246 1805 -1.00519 -0.0169705 1.56474 1 0 1 1 0 0 +EDGE2 2246 1807 0.900014 -0.0429377 -0.0241006 1 0 1 1 0 0 +EDGE2 2246 1806 -0.0198883 -0.0233319 0.00350834 1 0 1 1 0 0 +EDGE2 2246 2245 -1.10038 -0.00736328 -1.57097 1 0 1 1 0 0 +EDGE2 2246 1825 -1.01514 0.0260051 -1.56092 1 0 1 1 0 0 +EDGE2 2247 1808 0.973321 0.0280216 -0.00911399 1 0 1 1 0 0 +EDGE2 2247 1807 -0.0293415 -0.0904575 0.023395 1 0 1 1 0 0 +EDGE2 2247 2246 -1.01068 -0.028558 -0.0211754 1 0 1 1 0 0 +EDGE2 2247 1806 -1.04537 0.0978448 0.0213238 1 0 1 1 0 0 +EDGE2 2248 1809 1.05598 0.0240239 0.00678473 1 0 1 1 0 0 +EDGE2 2248 1808 -0.0571487 0.032591 0.00177662 1 0 1 1 0 0 +EDGE2 2248 1807 -0.977004 -0.00429029 -0.0015959 1 0 1 1 0 0 +EDGE2 2248 2247 -1.0847 0.0562862 -0.0222751 1 0 1 1 0 0 +EDGE2 2249 1810 1.06001 -0.0325586 0.00451264 1 0 1 1 0 0 +EDGE2 2249 2230 1.01231 -0.0619056 -3.1213 1 0 1 1 0 0 +EDGE2 2249 1809 0.0108681 0.00630155 -0.0197925 1 0 1 1 0 0 +EDGE2 2249 2248 -0.892826 0.0366822 0.0192289 1 0 1 1 0 0 +EDGE2 2249 1808 -1.14696 0.0110914 0.000609394 1 0 1 1 0 0 +EDGE2 2250 2229 0.945452 0.014711 -3.14447 1 0 1 1 0 0 +EDGE2 2250 1810 -0.0449264 -0.0459565 0.0144516 1 0 1 1 0 0 +EDGE2 2250 2230 -0.0315215 0.047602 -3.16539 1 0 1 1 0 0 +EDGE2 2250 2231 0.0617815 1.03709 1.53764 1 0 1 1 0 0 +EDGE2 2250 1811 0.00374681 1.0704 1.57839 1 0 1 1 0 0 +EDGE2 2250 2249 -1.01742 -0.0131065 0.0255309 1 0 1 1 0 0 +EDGE2 2250 1809 -1.06886 -0.0624344 -0.00395313 1 0 1 1 0 0 +EDGE2 2251 1810 -0.947204 0.0428707 -1.55232 1 0 1 1 0 0 +EDGE2 2251 2250 -1.06411 -0.0499018 -1.56723 1 0 1 1 0 0 +EDGE2 2251 2230 -0.937661 -0.00918312 1.54996 1 0 1 1 0 0 +EDGE2 2251 2231 0.114605 0.0123217 -0.0277718 1 0 1 1 0 0 +EDGE2 2251 1811 0.0291856 0.0324308 -0.0285044 1 0 1 1 0 0 +EDGE2 2251 1812 0.937239 0.0631008 0.0341404 1 0 1 1 0 0 +EDGE2 2251 2232 1.00434 0.0209418 0.0315095 1 0 1 1 0 0 +EDGE2 2252 2231 -1.03336 -0.0090041 0.00717995 1 0 1 1 0 0 +EDGE2 2252 2251 -1.00437 0.0275256 -0.00143166 1 0 1 1 0 0 +EDGE2 2252 1811 -0.95417 -0.0137557 0.00753428 1 0 1 1 0 0 +EDGE2 2252 1812 0.0491979 -0.0792169 -0.000560784 1 0 1 1 0 0 +EDGE2 2252 2232 0.0246512 -0.031773 0.00287362 1 0 1 1 0 0 +EDGE2 2252 1813 1.0165 -0.0399217 -0.0023022 1 0 1 1 0 0 +EDGE2 2252 2233 1.12365 0.0708566 -0.00846054 1 0 1 1 0 0 +EDGE2 2253 2234 0.929335 0.0632164 -0.0375949 1 0 1 1 0 0 +EDGE2 2253 1812 -1.00351 0.0460695 0.00662813 1 0 1 1 0 0 +EDGE2 2253 2232 -0.997109 -0.0974173 0.000733697 1 0 1 1 0 0 +EDGE2 2253 2252 -0.995527 -0.0567923 0.00194569 1 0 1 1 0 0 +EDGE2 2253 1813 0.00554064 -0.00477075 -0.0161343 1 0 1 1 0 0 +EDGE2 2253 2233 0.0326677 0.0942047 -0.0442064 1 0 1 1 0 0 +EDGE2 2253 1814 0.993789 0.0498965 0.0260198 1 0 1 1 0 0 +EDGE2 2254 2234 0.00965922 -0.104301 0.0156682 1 0 1 1 0 0 +EDGE2 2254 2253 -1.03334 -0.0641178 -0.0231453 1 0 1 1 0 0 +EDGE2 2254 1813 -1.0385 -0.0111062 -0.00021707 1 0 1 1 0 0 +EDGE2 2254 2233 -1.06735 0.0175275 0.00862042 1 0 1 1 0 0 +EDGE2 2254 1814 -0.0303251 -0.00906965 -0.0331739 1 0 1 1 0 0 +EDGE2 2254 2235 0.970963 -0.0137603 0.00935207 1 0 1 1 0 0 +EDGE2 2254 1815 1.05565 0.0140442 0.0164555 1 0 1 1 0 0 +EDGE2 2255 2234 -1.08696 -0.00665773 0.00961381 1 0 1 1 0 0 +EDGE2 2255 2254 -1.06486 -0.0465214 0.024059 1 0 1 1 0 0 +EDGE2 2255 1814 -0.997831 -0.0626928 0.00313905 1 0 1 1 0 0 +EDGE2 2255 2235 -0.0270471 0.0395227 -0.00239377 1 0 1 1 0 0 +EDGE2 2255 1815 0.0794167 -0.0687751 0.0167401 1 0 1 1 0 0 +EDGE2 2255 1816 0.0595161 0.979383 1.58522 1 0 1 1 0 0 +EDGE2 2255 2236 0.0258562 1.03949 1.57843 1 0 1 1 0 0 +EDGE2 2256 2235 -1.00278 -0.0210231 1.55103 1 0 1 1 0 0 +EDGE2 2256 2255 -0.977899 0.00670128 1.58707 1 0 1 1 0 0 +EDGE2 2256 1815 -1.00312 -0.058147 1.58385 1 0 1 1 0 0 +EDGE2 2257 2256 -1.0476 -0.0304371 0.00239068 1 0 1 1 0 0 +EDGE2 2258 2257 -0.986032 -0.0245986 -0.0011378 1 0 1 1 0 0 +EDGE2 2259 2258 -0.963523 -0.0567753 -0.033095 1 0 1 1 0 0 +EDGE2 2260 2259 -0.968169 0.0102012 0.0229242 1 0 1 1 0 0 +EDGE2 2261 2260 -0.968096 0.0601889 1.55966 1 0 1 1 0 0 +EDGE2 2262 2261 -1.0846 0.0186602 0.0145632 1 0 1 1 0 0 +EDGE2 2263 2262 -1.10091 -0.0401625 -0.0260163 1 0 1 1 0 0 +EDGE2 2264 2225 0.960863 -0.00213127 -3.14225 1 0 1 1 0 0 +EDGE2 2264 2263 -0.983672 0.066609 -0.0201821 1 0 1 1 0 0 +EDGE2 2265 2264 -0.895279 -0.00336886 0.0327365 1 0 1 1 0 0 +EDGE2 2265 2224 0.90607 -0.00970558 -3.12999 1 0 1 1 0 0 +EDGE2 2265 2225 -0.059645 0.0227574 -3.11858 1 0 1 1 0 0 +EDGE2 2265 2226 -0.0800687 -0.989239 -1.60255 1 0 1 1 0 0 +EDGE2 2266 2265 -0.940563 -0.0329862 1.55499 1 0 1 1 0 0 +EDGE2 2266 2225 -0.914928 0.0839846 -1.55909 1 0 1 1 0 0 +EDGE2 2266 2227 1.07918 0.0190052 0.0331152 1 0 1 1 0 0 +EDGE2 2266 2226 -0.0196707 -0.047381 -0.0199326 1 0 1 1 0 0 +EDGE2 2267 2227 -0.0185762 -0.00177945 -0.0130186 1 0 1 1 0 0 +EDGE2 2267 2226 -0.958507 0.00110046 0.0443282 1 0 1 1 0 0 +EDGE2 2267 2266 -1.02037 -0.00753881 -0.015324 1 0 1 1 0 0 +EDGE2 2267 2228 1.0511 -0.00840435 -0.0398634 1 0 1 1 0 0 +EDGE2 2268 2227 -1.0522 0.0604045 -0.0178527 1 0 1 1 0 0 +EDGE2 2268 2267 -1.08649 0.0137838 0.0101768 1 0 1 1 0 0 +EDGE2 2268 2228 -0.00686648 0.0482542 -0.0276338 1 0 1 1 0 0 +EDGE2 2268 2229 1.02332 -0.0225749 -0.0211639 1 0 1 1 0 0 +EDGE2 2269 2228 -0.974532 0.0105026 0.0026515 1 0 1 1 0 0 +EDGE2 2269 2268 -0.984665 0.050507 -0.024153 1 0 1 1 0 0 +EDGE2 2269 2229 0.0248123 -0.0346554 0.0214357 1 0 1 1 0 0 +EDGE2 2269 1810 1.07067 0.124732 -3.13117 1 0 1 1 0 0 +EDGE2 2269 2250 1.04439 0.0569933 -3.14773 1 0 1 1 0 0 +EDGE2 2269 2230 1.03494 -0.0109421 -0.0310119 1 0 1 1 0 0 +EDGE2 2270 2229 -1.03231 -0.00995102 0.0103883 1 0 1 1 0 0 +EDGE2 2270 2269 -1.02714 0.0226655 -0.0176492 1 0 1 1 0 0 +EDGE2 2270 1810 0.0121422 -0.0447394 -3.16672 1 0 1 1 0 0 +EDGE2 2270 2250 0.0228857 0.0296903 -3.1752 1 0 1 1 0 0 +EDGE2 2270 2230 0.0472937 0.0528689 -0.00108403 1 0 1 1 0 0 +EDGE2 2270 2231 0.046254 -0.851615 -1.55783 1 0 1 1 0 0 +EDGE2 2270 2251 -0.0242514 -1.0428 -1.58145 1 0 1 1 0 0 +EDGE2 2270 1811 -0.0184344 -1.01341 -1.5907 1 0 1 1 0 0 +EDGE2 2270 2249 0.972717 0.00104047 -3.1653 1 0 1 1 0 0 +EDGE2 2270 1809 0.929447 0.00363994 -3.12643 1 0 1 1 0 0 +EDGE2 2271 1810 -0.963009 -0.0272647 -1.55616 1 0 1 1 0 0 +EDGE2 2271 2250 -0.962462 -0.00362632 -1.55671 1 0 1 1 0 0 +EDGE2 2271 2270 -1.01761 -0.0330804 1.58628 1 0 1 1 0 0 +EDGE2 2271 2230 -0.893662 -0.0742078 1.5561 1 0 1 1 0 0 +EDGE2 2271 2231 0.100971 0.138306 -0.0319037 1 0 1 1 0 0 +EDGE2 2271 2251 -0.0599893 -0.0828281 -0.00787724 1 0 1 1 0 0 +EDGE2 2271 1811 0.0486521 0.0371603 0.0180612 1 0 1 1 0 0 +EDGE2 2271 1812 1.02256 -0.00684749 0.0302622 1 0 1 1 0 0 +EDGE2 2271 2232 0.934767 -0.0356368 -0.0121952 1 0 1 1 0 0 +EDGE2 2271 2252 0.989478 0.063831 -0.027007 1 0 1 1 0 0 +EDGE2 2272 2231 -0.951766 0.00223019 0.00280961 1 0 1 1 0 0 +EDGE2 2272 2251 -1.02117 0.0109921 0.00836634 1 0 1 1 0 0 +EDGE2 2272 2271 -0.998294 0.0166325 -0.0362877 1 0 1 1 0 0 +EDGE2 2272 1811 -0.989729 -0.120176 -0.0124737 1 0 1 1 0 0 +EDGE2 2272 2253 1.01171 0.0211435 0.00323757 1 0 1 1 0 0 +EDGE2 2272 1812 0.0417556 0.0354387 -0.0467723 1 0 1 1 0 0 +EDGE2 2272 2232 -0.0352983 -0.126181 0.00760715 1 0 1 1 0 0 +EDGE2 2272 2252 0.0240976 -0.0120517 -0.0299283 1 0 1 1 0 0 +EDGE2 2272 1813 0.949963 -0.00728336 0.0370116 1 0 1 1 0 0 +EDGE2 2272 2233 1.03756 -0.0542714 -0.0153967 1 0 1 1 0 0 +EDGE2 2273 2234 1.0396 -0.0282857 -0.0130267 1 0 1 1 0 0 +EDGE2 2273 2272 -1.04725 0.010381 0.00292502 1 0 1 1 0 0 +EDGE2 2273 2253 0.0558459 -0.0168724 -0.00129994 1 0 1 1 0 0 +EDGE2 2273 1812 -1.09222 0.0186869 0.000795469 1 0 1 1 0 0 +EDGE2 2273 2232 -1.11485 -0.0303011 -0.00249442 1 0 1 1 0 0 +EDGE2 2273 2252 -1.04091 0.0852524 0.0149513 1 0 1 1 0 0 +EDGE2 2273 1813 0.0969013 0.0737523 0.00786206 1 0 1 1 0 0 +EDGE2 2273 2233 0.0911658 0.0237914 -0.0205169 1 0 1 1 0 0 +EDGE2 2273 2254 1.01289 0.0017883 0.00266575 1 0 1 1 0 0 +EDGE2 2273 1814 0.95942 0.0671514 -0.00919886 1 0 1 1 0 0 +EDGE2 2274 2234 -0.0369592 0.0559076 -0.0190215 1 0 1 1 0 0 +EDGE2 2274 2253 -0.956241 0.0819798 -0.00348315 1 0 1 1 0 0 +EDGE2 2274 2273 -1.03422 -0.0826559 -0.000473425 1 0 1 1 0 0 +EDGE2 2274 1813 -0.981878 -0.0787058 0.0159252 1 0 1 1 0 0 +EDGE2 2274 2233 -1.02767 -0.0740127 0.0237645 1 0 1 1 0 0 +EDGE2 2274 2254 0.0740861 -0.0145099 -0.0123906 1 0 1 1 0 0 +EDGE2 2274 1814 0.0131371 0.0302494 -0.0111284 1 0 1 1 0 0 +EDGE2 2274 2235 1.01626 0.0338599 -0.0206287 1 0 1 1 0 0 +EDGE2 2274 2255 0.947244 0.0974983 -0.0143302 1 0 1 1 0 0 +EDGE2 2274 1815 0.949121 0.0743842 0.0139098 1 0 1 1 0 0 +EDGE2 2275 2256 -0.0807985 -1.01716 -1.57605 1 0 1 1 0 0 +EDGE2 2275 2234 -1.05647 0.051909 0.00198063 1 0 1 1 0 0 +EDGE2 2275 2274 -0.983683 -0.0224888 0.00729944 1 0 1 1 0 0 +EDGE2 2275 2254 -0.982162 0.0848683 -0.0177289 1 0 1 1 0 0 +EDGE2 2275 1814 -0.982186 0.0888906 -0.00349178 1 0 1 1 0 0 +EDGE2 2275 2235 -0.0838311 0.0583761 0.00333937 1 0 1 1 0 0 +EDGE2 2275 2255 0.0322842 -0.0772128 0.00769518 1 0 1 1 0 0 +EDGE2 2275 1815 -0.0596747 -0.0156397 0.0249712 1 0 1 1 0 0 +EDGE2 2275 1816 -0.110026 1.01502 1.574 1 0 1 1 0 0 +EDGE2 2275 2236 0.0408007 0.946335 1.60179 1 0 1 1 0 0 +EDGE2 2276 2237 0.933095 0.0420039 -0.0111283 1 0 1 1 0 0 +EDGE2 2276 2235 -0.993946 0.0553599 -1.56416 1 0 1 1 0 0 +EDGE2 2276 2255 -1.03535 -0.00963307 -1.55271 1 0 1 1 0 0 +EDGE2 2276 2275 -0.978926 -0.0500461 -1.54469 1 0 1 1 0 0 +EDGE2 2276 1815 -1.00242 -0.0337453 -1.53865 1 0 1 1 0 0 +EDGE2 2276 1816 -0.0122941 0.0152987 -0.0161468 1 0 1 1 0 0 +EDGE2 2276 2236 -0.052465 0.00170467 0.0328627 1 0 1 1 0 0 +EDGE2 2276 1817 1.02695 -0.12472 -0.042141 1 0 1 1 0 0 +EDGE2 2277 2237 0.0596316 -0.0262159 0.0150429 1 0 1 1 0 0 +EDGE2 2277 2276 -1.10937 0.0381148 -0.0173387 1 0 1 1 0 0 +EDGE2 2277 1816 -0.964018 -0.0768243 -0.00934771 1 0 1 1 0 0 +EDGE2 2277 2236 -0.987172 0.0287585 -0.00325411 1 0 1 1 0 0 +EDGE2 2277 2238 1.05858 -0.0554789 0.0309569 1 0 1 1 0 0 +EDGE2 2277 1817 0.0401997 -0.00998459 -0.0526985 1 0 1 1 0 0 +EDGE2 2277 1818 0.955415 -0.0597753 -0.0349623 1 0 1 1 0 0 +EDGE2 2278 2237 -1.08602 -0.103778 -0.0100091 1 0 1 1 0 0 +EDGE2 2278 2277 -0.998321 0.0428621 -0.00907977 1 0 1 1 0 0 +EDGE2 2278 2238 0.00704264 0.0104476 0.0257719 1 0 1 1 0 0 +EDGE2 2278 1817 -0.969142 -0.00419166 -0.0206018 1 0 1 1 0 0 +EDGE2 2278 1818 0.00127857 0.101764 0.0333333 1 0 1 1 0 0 +EDGE2 2278 2239 1.06236 0.00817676 -0.00570875 1 0 1 1 0 0 +EDGE2 2278 1819 0.966867 -0.022063 -0.0111273 1 0 1 1 0 0 +EDGE2 2279 2238 -0.96296 -0.0835958 0.00865964 1 0 1 1 0 0 +EDGE2 2279 2278 -1.0005 0.0449264 0.0289258 1 0 1 1 0 0 +EDGE2 2279 1818 -1.00892 -0.00745888 0.00740139 1 0 1 1 0 0 +EDGE2 2279 2239 0.00697077 0.0813547 0.0275011 1 0 1 1 0 0 +EDGE2 2279 1819 -0.0318121 -0.00774699 -0.0107294 1 0 1 1 0 0 +EDGE2 2279 1820 0.980275 0.00376905 0.00752574 1 0 1 1 0 0 +EDGE2 2279 2240 1.01793 -0.00555429 -0.0244158 1 0 1 1 0 0 +EDGE2 2279 1240 1.03414 0.021729 -3.16744 1 0 1 1 0 0 +EDGE2 2280 2239 -1.07657 -0.0814787 0.010715 1 0 1 1 0 0 +EDGE2 2280 2279 -0.98289 -0.0737404 -0.034179 1 0 1 1 0 0 +EDGE2 2280 1819 -1.01616 0.0143114 0.00620327 1 0 1 1 0 0 +EDGE2 2280 1821 0.0200342 1.02519 1.54334 1 0 1 1 0 0 +EDGE2 2280 2241 0.0629961 1.05904 1.53002 1 0 1 1 0 0 +EDGE2 2280 1820 -0.0155947 0.0258245 -0.00770861 1 0 1 1 0 0 +EDGE2 2280 2240 0.0472931 -0.0280696 0.00344105 1 0 1 1 0 0 +EDGE2 2280 1240 0.0458152 -0.0460163 -3.13385 1 0 1 1 0 0 +EDGE2 2280 1241 0.0211229 -1.03334 -1.5777 1 0 1 1 0 0 +EDGE2 2280 1239 0.957433 0.0154356 -3.13387 1 0 1 1 0 0 +EDGE2 2281 1820 -0.89213 0.0306666 1.56333 1 0 1 1 0 0 +EDGE2 2281 2240 -0.970757 -0.0561205 1.55454 1 0 1 1 0 0 +EDGE2 2281 2280 -0.996229 0.0309959 1.56215 1 0 1 1 0 0 +EDGE2 2281 1240 -1.04925 -0.0549671 -1.57359 1 0 1 1 0 0 +EDGE2 2281 1241 0.0212086 0.0293083 -0.00183858 1 0 1 1 0 0 +EDGE2 2281 1242 1.00059 0.0668551 -0.0158178 1 0 1 1 0 0 +EDGE2 2282 1241 -1.08105 0.0792927 -0.0109765 1 0 1 1 0 0 +EDGE2 2282 2281 -0.942796 -0.0947966 0.00878802 1 0 1 1 0 0 +EDGE2 2282 1242 0.0537988 0.0296124 0.00605862 1 0 1 1 0 0 +EDGE2 2282 1243 1.06893 0.0525892 -0.000983481 1 0 1 1 0 0 +EDGE2 2283 1242 -0.98475 0.054795 -0.0161837 1 0 1 1 0 0 +EDGE2 2283 2282 -1.0793 -0.0922273 0.00324085 1 0 1 1 0 0 +EDGE2 2283 1243 -0.0874858 0.161514 -0.0210681 1 0 1 1 0 0 +EDGE2 2283 1244 0.965371 -0.0273335 0.00547419 1 0 1 1 0 0 +EDGE2 2284 2283 -0.950329 0.00843254 0.0116506 1 0 1 1 0 0 +EDGE2 2284 1243 -1.01225 -0.0530397 0.0456016 1 0 1 1 0 0 +EDGE2 2284 785 1.02253 -0.0138766 -3.15117 1 0 1 1 0 0 +EDGE2 2284 1244 -0.0735341 -0.0459956 -0.00844892 1 0 1 1 0 0 +EDGE2 2284 1245 1.01832 -0.0399263 -0.00156963 1 0 1 1 0 0 +EDGE2 2284 805 1.04497 0.000938478 -3.1618 1 0 1 1 0 0 +EDGE2 2284 745 1.0371 -0.0173101 -3.11918 1 0 1 1 0 0 +EDGE2 2284 765 1.00424 -0.0243382 -3.13475 1 0 1 1 0 0 +EDGE2 2285 806 -0.0466841 -0.953856 -1.55884 1 0 1 1 0 0 +EDGE2 2285 766 0.0344037 -1.02421 -1.55847 1 0 1 1 0 0 +EDGE2 2285 786 0.0231583 -0.946073 -1.57542 1 0 1 1 0 0 +EDGE2 2285 746 -0.10401 -0.969899 -1.59823 1 0 1 1 0 0 +EDGE2 2285 785 -0.0268831 -0.0214488 -3.17219 1 0 1 1 0 0 +EDGE2 2285 1244 -0.980164 0.0376489 0.0143762 1 0 1 1 0 0 +EDGE2 2285 2284 -0.989564 9.29562e-05 0.0160882 1 0 1 1 0 0 +EDGE2 2285 1245 0.00296324 0.0731533 0.0250152 1 0 1 1 0 0 +EDGE2 2285 805 0.0316345 -0.013167 -3.12251 1 0 1 1 0 0 +EDGE2 2285 784 1.00124 0.0640096 -3.17416 1 0 1 1 0 0 +EDGE2 2285 745 -0.0455377 0.0181995 -3.14588 1 0 1 1 0 0 +EDGE2 2285 765 -0.0195367 0.0703545 -3.14446 1 0 1 1 0 0 +EDGE2 2285 804 0.973724 0.0710036 -3.12398 1 0 1 1 0 0 +EDGE2 2285 744 0.983835 -0.00768286 -3.11018 1 0 1 1 0 0 +EDGE2 2285 764 0.988874 -0.0223829 -3.13261 1 0 1 1 0 0 +EDGE2 2285 1246 0.0103725 0.966634 1.56816 1 0 1 1 0 0 +EDGE2 2286 785 -0.994234 -0.0160254 1.58647 1 0 1 1 0 0 +EDGE2 2286 1245 -1.00559 -0.00738669 -1.53221 1 0 1 1 0 0 +EDGE2 2286 2285 -0.96473 -0.0368428 -1.58194 1 0 1 1 0 0 +EDGE2 2286 805 -1.03361 -0.0010633 1.56271 1 0 1 1 0 0 +EDGE2 2286 745 -1.00426 -0.032343 1.55253 1 0 1 1 0 0 +EDGE2 2286 765 -0.909038 -0.0622023 1.56715 1 0 1 1 0 0 +EDGE2 2286 1246 0.0873612 0.00428744 -0.0159144 1 0 1 1 0 0 +EDGE2 2286 1247 0.975543 0.0343692 0.0264226 1 0 1 1 0 0 +EDGE2 2287 2286 -0.996834 0.0270702 -0.00179421 1 0 1 1 0 0 +EDGE2 2287 1246 -1.04176 -0.0940255 -0.00718277 1 0 1 1 0 0 +EDGE2 2287 1247 -0.029441 0.0423608 -0.0239459 1 0 1 1 0 0 +EDGE2 2287 1248 0.996669 -0.130681 -0.0110616 1 0 1 1 0 0 +EDGE2 2288 2287 -0.943297 0.0153034 0.0172121 1 0 1 1 0 0 +EDGE2 2288 1247 -0.985845 0.00481571 -0.0067036 1 0 1 1 0 0 +EDGE2 2288 1248 -0.0702964 0.0342906 -0.00589051 1 0 1 1 0 0 +EDGE2 2288 1249 1.00992 0.0618102 0.0500466 1 0 1 1 0 0 +EDGE2 2289 1248 -1.024 0.0765231 -0.00952158 1 0 1 1 0 0 +EDGE2 2289 2288 -0.997352 0.0133563 0.035315 1 0 1 1 0 0 +EDGE2 2289 1249 0.0713266 0.0322968 0.00180736 1 0 1 1 0 0 +EDGE2 2289 1250 1.01194 -0.0757634 -0.00329619 1 0 1 1 0 0 +EDGE2 2289 1230 1.08123 -0.0490101 -3.10295 1 0 1 1 0 0 +EDGE2 2290 2289 -1.06603 0.0335219 -0.00854999 1 0 1 1 0 0 +EDGE2 2290 1249 -0.957038 0.0266563 -0.00576693 1 0 1 1 0 0 +EDGE2 2290 1250 -0.0485286 -0.000598961 -0.00113809 1 0 1 1 0 0 +EDGE2 2290 1231 0.0904417 1.01302 1.56809 1 0 1 1 0 0 +EDGE2 2290 1251 0.0488141 1.02946 1.56329 1 0 1 1 0 0 +EDGE2 2290 1230 -0.071802 -0.0288665 -3.15953 1 0 1 1 0 0 +EDGE2 2290 1229 0.953934 0.0614912 -3.11927 1 0 1 1 0 0 +EDGE2 2291 1252 0.986391 0.058489 0.0358377 1 0 1 1 0 0 +EDGE2 2291 1232 0.811776 -0.0445922 0.00869736 1 0 1 1 0 0 +EDGE2 2291 1250 -0.951343 0.0276403 -1.55571 1 0 1 1 0 0 +EDGE2 2291 1231 0.115714 -0.0926148 0.00304753 1 0 1 1 0 0 +EDGE2 2291 1251 -0.0163286 0.108095 0.0346141 1 0 1 1 0 0 +EDGE2 2291 2290 -1.08251 -0.0335936 -1.57475 1 0 1 1 0 0 +EDGE2 2291 1230 -0.972194 0.040447 1.57824 1 0 1 1 0 0 +EDGE2 2292 1233 1.06448 -0.0237124 -0.0250224 1 0 1 1 0 0 +EDGE2 2292 1253 0.977298 0.0241714 -0.0505921 1 0 1 1 0 0 +EDGE2 2292 2291 -1.00941 0.0311682 0.0126912 1 0 1 1 0 0 +EDGE2 2292 1252 -0.0324447 -0.0393413 -0.00653611 1 0 1 1 0 0 +EDGE2 2292 1232 -0.0263144 0.0664707 -0.00215553 1 0 1 1 0 0 +EDGE2 2292 1231 -1.02083 -0.016991 -0.000342024 1 0 1 1 0 0 +EDGE2 2292 1251 -0.973777 0.0642029 -0.00828764 1 0 1 1 0 0 +EDGE2 2293 2292 -0.953938 -0.0240107 -0.00509774 1 0 1 1 0 0 +EDGE2 2293 1254 0.952885 0.00110267 -0.0197184 1 0 1 1 0 0 +EDGE2 2293 1234 1.08885 -0.0683997 8.20106e-05 1 0 1 1 0 0 +EDGE2 2293 1233 0.0867173 -0.0282964 0.0352712 1 0 1 1 0 0 +EDGE2 2293 1253 0.0820596 0.0452022 -0.0261033 1 0 1 1 0 0 +EDGE2 2293 1252 -0.988487 -0.0511214 -0.0402486 1 0 1 1 0 0 +EDGE2 2293 1232 -1.06503 0.109573 -0.00228797 1 0 1 1 0 0 +EDGE2 2294 2293 -1.02987 0.0307655 -0.0349329 1 0 1 1 0 0 +EDGE2 2294 1235 1.01629 0.0150959 -0.0031048 1 0 1 1 0 0 +EDGE2 2294 1255 0.954571 -0.00682478 -0.00501158 1 0 1 1 0 0 +EDGE2 2294 1254 -0.0224362 0.0543859 0.00659038 1 0 1 1 0 0 +EDGE2 2294 1234 -0.0450462 0.0239867 0.0287165 1 0 1 1 0 0 +EDGE2 2294 1233 -0.950929 0.00560298 -7.34372e-06 1 0 1 1 0 0 +EDGE2 2294 1253 -0.99947 0.00396566 0.0144976 1 0 1 1 0 0 +EDGE2 2295 1236 -0.016591 1.04154 1.53619 1 0 1 1 0 0 +EDGE2 2295 1235 -0.011577 0.000287964 0.000261736 1 0 1 1 0 0 +EDGE2 2295 1255 0.00669328 0.0482423 -0.0173641 1 0 1 1 0 0 +EDGE2 2295 1254 -1.09815 -0.0526241 -0.0179137 1 0 1 1 0 0 +EDGE2 2295 2294 -0.931626 -0.0590529 -0.011338 1 0 1 1 0 0 +EDGE2 2295 1234 -1.05915 -0.0428021 -0.00615836 1 0 1 1 0 0 +EDGE2 2295 1256 0.00355746 -1.0134 -1.54961 1 0 1 1 0 0 +EDGE2 2296 1235 -1.00153 0.0394404 1.58534 1 0 1 1 0 0 +EDGE2 2296 2295 -1.02101 0.0758413 1.60152 1 0 1 1 0 0 +EDGE2 2296 1255 -1.02283 -0.00173317 1.58738 1 0 1 1 0 0 +EDGE2 2296 1256 -0.0135442 -0.0432622 -0.00664639 1 0 1 1 0 0 +EDGE2 2296 1257 0.950158 -0.0211152 -0.0118443 1 0 1 1 0 0 +EDGE2 2297 1256 -0.978759 -0.0546255 -0.0114661 1 0 1 1 0 0 +EDGE2 2297 2296 -0.932992 -0.0958459 -0.000915376 1 0 1 1 0 0 +EDGE2 2297 1257 0.031124 -0.0144095 -0.0125253 1 0 1 1 0 0 +EDGE2 2297 1258 0.951526 0.0346518 -0.00581342 1 0 1 1 0 0 +EDGE2 2298 2297 -0.918679 0.0457111 -0.00221142 1 0 1 1 0 0 +EDGE2 2298 1257 -0.918943 0.0299872 -0.0424073 1 0 1 1 0 0 +EDGE2 2298 1258 -0.043694 0.0300648 0.0369877 1 0 1 1 0 0 +EDGE2 2298 1259 0.993748 -0.0481177 -0.00272488 1 0 1 1 0 0 +EDGE2 2299 2298 -1.02252 -0.0488316 -0.0394554 1 0 1 1 0 0 +EDGE2 2299 1258 -1.08922 -0.0381856 0.00590415 1 0 1 1 0 0 +EDGE2 2299 1259 0.0264868 -0.0290887 -0.0157489 1 0 1 1 0 0 +EDGE2 2299 1260 0.971086 0.066224 0.0070838 1 0 1 1 0 0 +EDGE2 2300 1261 0.000679175 0.980745 1.57038 1 0 1 1 0 0 +EDGE2 2300 2299 -0.952792 -0.0464553 0.00805982 1 0 1 1 0 0 +EDGE2 2300 1259 -1.03025 -0.0208093 -0.0380997 1 0 1 1 0 0 +EDGE2 2300 1260 -0.0212231 0.0535073 -0.025192 1 0 1 1 0 0 +EDGE2 2301 1262 0.973119 0.0337715 0.00431338 1 0 1 1 0 0 +EDGE2 2301 1261 -0.0389315 0.0594071 -0.0305668 1 0 1 1 0 0 +EDGE2 2301 2300 -1.01633 -0.00122001 -1.55815 1 0 1 1 0 0 +EDGE2 2301 1260 -1.00508 -0.0907368 -1.59828 1 0 1 1 0 0 +EDGE2 2302 1263 0.935773 0.0408394 -0.0159596 1 0 1 1 0 0 +EDGE2 2302 1262 -0.108275 0.0089081 0.0258675 1 0 1 1 0 0 +EDGE2 2302 2301 -0.900742 -0.0177196 0.0572032 1 0 1 1 0 0 +EDGE2 2302 1261 -1.02505 -0.0183387 -0.0210575 1 0 1 1 0 0 +EDGE2 2303 1264 1.00837 -0.0367522 0.00856362 1 0 1 1 0 0 +EDGE2 2303 2302 -1.02742 0.0254297 -0.00412399 1 0 1 1 0 0 +EDGE2 2303 1263 -0.00367063 0.0474429 0.0216899 1 0 1 1 0 0 +EDGE2 2303 1262 -1.04124 0.0591984 -0.0609174 1 0 1 1 0 0 +EDGE2 2304 1265 1.038 -0.0605345 0.000297023 1 0 1 1 0 0 +EDGE2 2304 1565 0.845558 -0.013559 -3.13911 1 0 1 1 0 0 +EDGE2 2304 1585 1.0286 -0.0725465 -3.16535 1 0 1 1 0 0 +EDGE2 2304 1845 0.996837 -0.0215148 -3.15206 1 0 1 1 0 0 +EDGE2 2304 1545 0.970015 -0.00692949 -3.16529 1 0 1 1 0 0 +EDGE2 2304 1264 -0.0763537 -0.107153 -0.0347525 1 0 1 1 0 0 +EDGE2 2304 2303 -0.95635 0.0288484 0.0254835 1 0 1 1 0 0 +EDGE2 2304 1263 -0.979656 -0.0534436 0.0107118 1 0 1 1 0 0 +EDGE2 2305 1564 0.980014 -0.00556851 -3.19705 1 0 1 1 0 0 +EDGE2 2305 1844 0.944699 -0.00142102 -3.12531 1 0 1 1 0 0 +EDGE2 2305 1584 1.02854 0.0351661 -3.16252 1 0 1 1 0 0 +EDGE2 2305 1544 1.03619 0.0179263 -3.15982 1 0 1 1 0 0 +EDGE2 2305 1546 0.00803287 0.977603 1.59569 1 0 1 1 0 0 +EDGE2 2305 1265 -0.0328491 0.0665597 0.0256264 1 0 1 1 0 0 +EDGE2 2305 1565 -0.119813 -0.0151399 -3.14405 1 0 1 1 0 0 +EDGE2 2305 1585 -0.0460685 -0.0407985 -3.12012 1 0 1 1 0 0 +EDGE2 2305 1845 0.0492564 -0.0350624 -3.1679 1 0 1 1 0 0 +EDGE2 2305 1545 -0.0467493 -0.0047818 -3.15945 1 0 1 1 0 0 +EDGE2 2305 1264 -0.944001 -0.0374771 -0.0225072 1 0 1 1 0 0 +EDGE2 2305 2304 -0.977843 -0.0167068 -0.00144829 1 0 1 1 0 0 +EDGE2 2305 1566 0.014011 -1.00116 -1.58179 1 0 1 1 0 0 +EDGE2 2305 1846 0.00679061 -0.978924 -1.57406 1 0 1 1 0 0 +EDGE2 2305 1586 0.0263921 -0.997853 -1.53575 1 0 1 1 0 0 +EDGE2 2305 1266 0.0429512 -0.992628 -1.57579 1 0 1 1 0 0 +EDGE2 2306 1265 -0.972145 0.0429318 1.59735 1 0 1 1 0 0 +EDGE2 2306 2305 -1.01102 -0.00253553 1.53446 1 0 1 1 0 0 +EDGE2 2306 1565 -1.02304 -0.00590917 -1.57176 1 0 1 1 0 0 +EDGE2 2306 1585 -0.938706 -0.00120406 -1.60119 1 0 1 1 0 0 +EDGE2 2306 1845 -0.998634 -0.0350056 -1.54821 1 0 1 1 0 0 +EDGE2 2306 1545 -1.04114 -0.0288949 -1.5907 1 0 1 1 0 0 +EDGE2 2306 1567 1.0344 -0.0430537 0.0356184 1 0 1 1 0 0 +EDGE2 2306 1587 0.990568 0.0583289 -0.0368308 1 0 1 1 0 0 +EDGE2 2306 1566 0.0189961 0.015013 0.0208599 1 0 1 1 0 0 +EDGE2 2306 1846 -0.00747922 -0.0678984 0.00723936 1 0 1 1 0 0 +EDGE2 2306 1586 0.048874 0.0429494 -0.0020508 1 0 1 1 0 0 +EDGE2 2306 1266 0.0434973 -0.017446 0.0114342 1 0 1 1 0 0 +EDGE2 2306 1847 0.99927 -0.0245754 -0.0306979 1 0 1 1 0 0 +EDGE2 2306 1267 0.997252 -0.032706 -0.00178968 1 0 1 1 0 0 +EDGE2 2307 1567 0.0150097 0.0538267 0.0242705 1 0 1 1 0 0 +EDGE2 2307 1587 0.0529162 0.0259437 0.0207199 1 0 1 1 0 0 +EDGE2 2307 1566 -0.910494 -0.0133521 -0.0187671 1 0 1 1 0 0 +EDGE2 2307 1846 -0.956738 -0.0393337 0.00798678 1 0 1 1 0 0 +EDGE2 2307 2306 -0.917006 -0.0104554 -0.016613 1 0 1 1 0 0 +EDGE2 2307 1586 -1.04386 0.040976 0.0489173 1 0 1 1 0 0 +EDGE2 2307 1266 -1.04411 0.0514959 -0.000965115 1 0 1 1 0 0 +EDGE2 2307 1847 0.0752599 0.035265 -0.0174102 1 0 1 1 0 0 +EDGE2 2307 1588 1.03184 -0.0047991 -0.0558124 1 0 1 1 0 0 +EDGE2 2307 1267 0.0377517 -0.0513204 0.0107571 1 0 1 1 0 0 +EDGE2 2307 1848 1.00917 0.107668 0.0137563 1 0 1 1 0 0 +EDGE2 2307 1268 1.17867 -0.0050377 0.0291315 1 0 1 1 0 0 +EDGE2 2307 1568 1.0191 0.0268793 -0.0132053 1 0 1 1 0 0 +EDGE2 2308 1567 -1.01819 -0.0706616 -0.00344801 1 0 1 1 0 0 +EDGE2 2308 1587 -1.02545 0.0130972 -0.00122149 1 0 1 1 0 0 +EDGE2 2308 2307 -0.926734 -0.0123968 0.00379213 1 0 1 1 0 0 +EDGE2 2308 1847 -1.1464 0.0123659 0.0235258 1 0 1 1 0 0 +EDGE2 2308 1849 0.940154 -0.000438426 -0.0109708 1 0 1 1 0 0 +EDGE2 2308 1588 0.0354584 -0.0169309 0.0293351 1 0 1 1 0 0 +EDGE2 2308 1267 -0.979473 0.00176881 -0.0108332 1 0 1 1 0 0 +EDGE2 2308 1848 0.0527921 0.0318219 -0.0056478 1 0 1 1 0 0 +EDGE2 2308 1268 0.0198723 -0.0514746 0.00459369 1 0 1 1 0 0 +EDGE2 2308 1568 -0.00473731 0.0122894 -0.0188757 1 0 1 1 0 0 +EDGE2 2308 1569 1.0545 0.0706566 -0.00181258 1 0 1 1 0 0 +EDGE2 2308 1589 1.0533 -0.00799771 0.00289958 1 0 1 1 0 0 +EDGE2 2308 1269 1.04532 0.0721634 0.0193798 1 0 1 1 0 0 +EDGE2 2309 1849 0.123529 0.00645597 0.00819517 1 0 1 1 0 0 +EDGE2 2309 1588 -1.00397 -0.0186109 0.0186316 1 0 1 1 0 0 +EDGE2 2309 2308 -0.948619 -0.00280652 -0.00809197 1 0 1 1 0 0 +EDGE2 2309 1848 -0.995089 0.026757 0.00726521 1 0 1 1 0 0 +EDGE2 2309 1268 -0.982973 0.00779727 0.0273274 1 0 1 1 0 0 +EDGE2 2309 1568 -1.02307 -0.084185 -0.0369971 1 0 1 1 0 0 +EDGE2 2309 1569 0.0195786 -0.0197713 -0.00472322 1 0 1 1 0 0 +EDGE2 2309 1589 -0.0211842 -0.0244076 -0.0089295 1 0 1 1 0 0 +EDGE2 2309 1269 -0.0735596 -0.0158389 -0.00162032 1 0 1 1 0 0 +EDGE2 2309 1590 1.03587 0.0844523 0.0109911 1 0 1 1 0 0 +EDGE2 2309 1850 0.933139 -0.0111081 -0.0150953 1 0 1 1 0 0 +EDGE2 2309 1270 0.968688 -0.0257364 -0.0205233 1 0 1 1 0 0 +EDGE2 2309 1290 0.99227 -0.0605299 -3.10863 1 0 1 1 0 0 +EDGE2 2309 1570 1.07066 -0.0842309 0.00456073 1 0 1 1 0 0 +EDGE2 2310 1851 0.00245614 0.975319 1.5918 1 0 1 1 0 0 +EDGE2 2310 1571 0.0580556 0.967362 1.5945 1 0 1 1 0 0 +EDGE2 2310 1591 0.0714705 0.965981 1.57002 1 0 1 1 0 0 +EDGE2 2310 1849 -1.04543 0.030159 -0.0107918 1 0 1 1 0 0 +EDGE2 2310 2309 -0.976015 -0.0811867 0.0105248 1 0 1 1 0 0 +EDGE2 2310 1569 -0.984657 0.057357 -0.0236883 1 0 1 1 0 0 +EDGE2 2310 1589 -0.991426 0.0419789 -0.0383638 1 0 1 1 0 0 +EDGE2 2310 1269 -0.970008 -0.012483 -0.00351345 1 0 1 1 0 0 +EDGE2 2310 1291 -0.0117229 -0.956719 -1.57176 1 0 1 1 0 0 +EDGE2 2310 1590 0.0126368 0.0704599 0.00819683 1 0 1 1 0 0 +EDGE2 2310 1850 -0.0520006 -0.0085177 -8.08305e-05 1 0 1 1 0 0 +EDGE2 2310 1270 -0.0276749 0.0150729 -0.0229271 1 0 1 1 0 0 +EDGE2 2310 1290 0.00695759 -0.0426871 -3.11986 1 0 1 1 0 0 +EDGE2 2310 1570 0.117504 0.079667 -0.013795 1 0 1 1 0 0 +EDGE2 2310 1271 0.0725427 -0.991949 -1.52324 1 0 1 1 0 0 +EDGE2 2310 1289 0.998774 -0.0364363 -3.13351 1 0 1 1 0 0 +EDGE2 2311 1851 0.0210626 0.000702955 -0.00294098 1 0 1 1 0 0 +EDGE2 2311 1852 1.04947 0.122094 0.012644 1 0 1 1 0 0 +EDGE2 2311 1572 1.00723 0.0665485 -0.0192633 1 0 1 1 0 0 +EDGE2 2311 1592 1.03669 0.036314 0.0163737 1 0 1 1 0 0 +EDGE2 2311 1571 0.0293622 0.0672679 0.00137832 1 0 1 1 0 0 +EDGE2 2311 1591 -0.0437962 -0.0413055 0.00359373 1 0 1 1 0 0 +EDGE2 2311 1590 -1.10609 -0.117709 -1.55326 1 0 1 1 0 0 +EDGE2 2311 2310 -1.05429 0.0347009 -1.58543 1 0 1 1 0 0 +EDGE2 2311 1850 -1.01611 -0.0397139 -1.56995 1 0 1 1 0 0 +EDGE2 2311 1270 -0.967076 0.0415639 -1.58441 1 0 1 1 0 0 +EDGE2 2311 1290 -1.01098 0.0616318 1.56762 1 0 1 1 0 0 +EDGE2 2311 1570 -0.928844 -0.0921217 -1.55565 1 0 1 1 0 0 +EDGE2 2312 1851 -1.04281 -0.00822592 -0.0443714 1 0 1 1 0 0 +EDGE2 2312 1853 1.00825 -0.0733084 0.00688546 1 0 1 1 0 0 +EDGE2 2312 1852 0.0445934 -0.0341847 -0.0167182 1 0 1 1 0 0 +EDGE2 2312 1573 0.977833 -0.0380096 -0.00181154 1 0 1 1 0 0 +EDGE2 2312 1593 1.01076 -0.00689968 0.0172399 1 0 1 1 0 0 +EDGE2 2312 1572 0.00110451 0.0242433 0.00913925 1 0 1 1 0 0 +EDGE2 2312 1592 0.0257191 -0.0262674 0.00410719 1 0 1 1 0 0 +EDGE2 2312 2311 -1.01313 -0.00574756 -0.0290886 1 0 1 1 0 0 +EDGE2 2312 1571 -1.05659 -0.0153523 -0.0141039 1 0 1 1 0 0 +EDGE2 2312 1591 -1.00638 0.151622 -0.0181014 1 0 1 1 0 0 +EDGE2 2313 1853 0.0270935 -0.0680472 -0.000717323 1 0 1 1 0 0 +EDGE2 2313 1854 1.00536 0.0927596 -0.0271453 1 0 1 1 0 0 +EDGE2 2313 1574 0.905325 0.0596693 -0.000481459 1 0 1 1 0 0 +EDGE2 2313 1594 0.877715 -0.049566 -0.00376044 1 0 1 1 0 0 +EDGE2 2313 1852 -1.01835 0.027968 -0.0161285 1 0 1 1 0 0 +EDGE2 2313 1573 -0.00299058 -0.0720915 0.0105658 1 0 1 1 0 0 +EDGE2 2313 1593 -0.0297982 -0.0528574 -0.0287274 1 0 1 1 0 0 +EDGE2 2313 2312 -0.94983 -0.0715598 0.0119405 1 0 1 1 0 0 +EDGE2 2313 1572 -1.0059 0.00698471 0.00878028 1 0 1 1 0 0 +EDGE2 2313 1592 -0.961172 -0.0117521 0.0109365 1 0 1 1 0 0 +EDGE2 2314 1535 0.962772 -0.0312145 -3.13105 1 0 1 1 0 0 +EDGE2 2314 1855 0.995269 0.0217447 0.0346518 1 0 1 1 0 0 +EDGE2 2314 1595 1.05543 -0.0323051 -0.0026387 1 0 1 1 0 0 +EDGE2 2314 1655 0.921007 0.0317547 -3.14998 1 0 1 1 0 0 +EDGE2 2314 1575 0.934214 -0.0484596 0.00608045 1 0 1 1 0 0 +EDGE2 2314 1853 -0.980961 -0.00307375 0.0382101 1 0 1 1 0 0 +EDGE2 2314 1854 0.0362911 -0.0303286 -0.0142494 1 0 1 1 0 0 +EDGE2 2314 1375 1.07038 -0.0044111 -3.16244 1 0 1 1 0 0 +EDGE2 2314 1515 1.00395 -0.0564526 -3.11138 1 0 1 1 0 0 +EDGE2 2314 1574 -0.0257981 0.0152941 0.0309614 1 0 1 1 0 0 +EDGE2 2314 1594 -0.00313021 -0.0599932 0.0205385 1 0 1 1 0 0 +EDGE2 2314 2313 -0.925752 -0.0717818 0.00754021 1 0 1 1 0 0 +EDGE2 2314 1573 -0.995494 -0.00706012 -0.0357747 1 0 1 1 0 0 +EDGE2 2314 1593 -1.03118 0.019589 0.00327269 1 0 1 1 0 0 +EDGE2 2315 1656 0.0321642 1.01029 1.56473 1 0 1 1 0 0 +EDGE2 2315 1856 0.0415677 1.00678 1.59177 1 0 1 1 0 0 +EDGE2 2315 1536 0.00228734 0.983228 1.5536 1 0 1 1 0 0 +EDGE2 2315 1576 0.0461966 0.866706 1.57396 1 0 1 1 0 0 +EDGE2 2315 1376 -0.0661908 1.09067 1.57561 1 0 1 1 0 0 +EDGE2 2315 1535 0.0230992 -0.0127592 -3.1331 1 0 1 1 0 0 +EDGE2 2315 1514 0.924866 0.00245059 -3.13299 1 0 1 1 0 0 +EDGE2 2315 1654 0.907211 -0.0613618 -3.1092 1 0 1 1 0 0 +EDGE2 2315 1534 0.926573 -0.0313705 -3.1151 1 0 1 1 0 0 +EDGE2 2315 1374 1.0361 -0.0171119 -3.13638 1 0 1 1 0 0 +EDGE2 2315 1855 -0.0295673 -0.0933436 -0.0198556 1 0 1 1 0 0 +EDGE2 2315 1595 0.0285219 0.0604185 -0.00171031 1 0 1 1 0 0 +EDGE2 2315 1655 0.047046 0.00804752 -3.15618 1 0 1 1 0 0 +EDGE2 2315 1575 -0.035135 -0.0381993 0.0166181 1 0 1 1 0 0 +EDGE2 2315 1854 -1.03632 0.0484529 -0.0159674 1 0 1 1 0 0 +EDGE2 2315 1375 -0.108554 0.0491528 -3.13446 1 0 1 1 0 0 +EDGE2 2315 1515 0.0324709 0.0341347 -3.1464 1 0 1 1 0 0 +EDGE2 2315 2314 -0.978895 0.0126063 0.00722248 1 0 1 1 0 0 +EDGE2 2315 1574 -0.912284 -0.0293629 0.0274428 1 0 1 1 0 0 +EDGE2 2315 1594 -0.960653 0.0169973 -0.0226203 1 0 1 1 0 0 +EDGE2 2315 1516 0.0650626 -0.98438 -1.55687 1 0 1 1 0 0 +EDGE2 2315 1596 0.0855636 -0.970138 -1.53698 1 0 1 1 0 0 +EDGE2 2316 1535 -0.947125 0.0509977 -1.60673 1 0 1 1 0 0 +EDGE2 2316 1855 -0.989283 0.0182791 1.544 1 0 1 1 0 0 +EDGE2 2316 2315 -1.01835 -0.0558138 1.56585 1 0 1 1 0 0 +EDGE2 2316 1595 -1.0446 0.12506 1.56327 1 0 1 1 0 0 +EDGE2 2316 1655 -0.913998 0.0393121 -1.56025 1 0 1 1 0 0 +EDGE2 2316 1575 -0.97734 6.72566e-05 1.57973 1 0 1 1 0 0 +EDGE2 2316 1375 -0.814314 0.0175117 -1.56402 1 0 1 1 0 0 +EDGE2 2316 1515 -0.95788 0.0195189 -1.57354 1 0 1 1 0 0 +EDGE2 2316 1516 -0.0194679 -0.00103516 -0.00168446 1 0 1 1 0 0 +EDGE2 2316 1596 -0.0106961 -0.00113066 0.00641737 1 0 1 1 0 0 +EDGE2 2316 1597 0.933541 0.0520136 -0.0368912 1 0 1 1 0 0 +EDGE2 2316 1517 1.01805 0.0169824 -0.00958318 1 0 1 1 0 0 +EDGE2 2317 1516 -0.973166 0.0222883 0.0267451 1 0 1 1 0 0 +EDGE2 2317 1596 -1.02515 -0.04573 -0.0345262 1 0 1 1 0 0 +EDGE2 2317 2316 -1.04656 -0.0194527 0.00608194 1 0 1 1 0 0 +EDGE2 2317 1597 -0.0592268 -0.0757192 -0.0417627 1 0 1 1 0 0 +EDGE2 2317 1517 0.0070036 0.0106187 -0.0430078 1 0 1 1 0 0 +EDGE2 2317 1598 1.03518 0.036892 0.0192392 1 0 1 1 0 0 +EDGE2 2317 1518 1.03699 0.0253103 0.000750984 1 0 1 1 0 0 +EDGE2 2318 1597 -1.01099 0.0553005 -0.00472447 1 0 1 1 0 0 +EDGE2 2318 2317 -1.07962 0.126934 0.0533126 1 0 1 1 0 0 +EDGE2 2318 1517 -0.948814 -0.00502686 -0.00829731 1 0 1 1 0 0 +EDGE2 2318 1598 0.0223156 -0.00183106 -0.0168558 1 0 1 1 0 0 +EDGE2 2318 1518 -0.014814 -0.0419225 -0.019339 1 0 1 1 0 0 +EDGE2 2318 1599 0.906223 0.0261311 0.00956973 1 0 1 1 0 0 +EDGE2 2318 1519 1.04294 0.0222238 0.0224358 1 0 1 1 0 0 +EDGE2 2319 1598 -1.0656 -0.0706686 0.0483851 1 0 1 1 0 0 +EDGE2 2319 2318 -0.967122 0.00596335 -0.0250944 1 0 1 1 0 0 +EDGE2 2319 1518 -0.999417 0.0525536 -0.0301278 1 0 1 1 0 0 +EDGE2 2319 1599 0.132307 -0.096248 0.0299923 1 0 1 1 0 0 +EDGE2 2319 1519 0.0270413 0.0332422 0.00845524 1 0 1 1 0 0 +EDGE2 2319 1520 1.06729 0.0203329 0.0326521 1 0 1 1 0 0 +EDGE2 2319 1620 1.00711 -0.0160482 -3.13817 1 0 1 1 0 0 +EDGE2 2319 1640 1.08284 0.0130007 -3.13916 1 0 1 1 0 0 +EDGE2 2319 1600 0.982427 -0.0127114 0.0174518 1 0 1 1 0 0 +EDGE2 2319 1320 1.00672 0.0180795 -3.14363 1 0 1 1 0 0 +EDGE2 2320 1599 -0.990867 -0.00550522 -0.0284896 1 0 1 1 0 0 +EDGE2 2320 2319 -1.04674 -0.0337076 0.0122502 1 0 1 1 0 0 +EDGE2 2320 1519 -1.07016 -0.086242 0.0153222 1 0 1 1 0 0 +EDGE2 2320 1521 0.114532 0.990934 1.57875 1 0 1 1 0 0 +EDGE2 2320 1641 0.0327883 0.982359 1.55517 1 0 1 1 0 0 +EDGE2 2320 1321 0.0464333 1.06427 1.61291 1 0 1 1 0 0 +EDGE2 2320 1520 0.0216386 -0.0179292 0.00301867 1 0 1 1 0 0 +EDGE2 2320 1620 -0.0295271 -0.0318911 -3.16845 1 0 1 1 0 0 +EDGE2 2320 1640 0.0113679 -0.0143026 -3.14486 1 0 1 1 0 0 +EDGE2 2320 1600 0.0251609 -0.0385843 0.0114057 1 0 1 1 0 0 +EDGE2 2320 1621 -0.00920159 -1.01173 -1.56029 1 0 1 1 0 0 +EDGE2 2320 1320 -0.0602577 -0.0806227 -3.1817 1 0 1 1 0 0 +EDGE2 2320 1601 0.00495171 -0.933156 -1.55285 1 0 1 1 0 0 +EDGE2 2320 1619 1.0249 -0.0188566 -3.11838 1 0 1 1 0 0 +EDGE2 2320 1639 0.984203 -0.0214042 -3.12296 1 0 1 1 0 0 +EDGE2 2320 1319 0.932497 -0.0037438 -3.15252 1 0 1 1 0 0 +EDGE2 2321 1322 0.909927 -0.000698878 0.0364409 1 0 1 1 0 0 +EDGE2 2321 1642 1.00356 0.0102963 0.0396656 1 0 1 1 0 0 +EDGE2 2321 1522 0.931168 -0.0947409 0.0205696 1 0 1 1 0 0 +EDGE2 2321 1521 0.0351178 0.0644435 0.0583464 1 0 1 1 0 0 +EDGE2 2321 1641 0.00626456 -0.000966798 -0.00791992 1 0 1 1 0 0 +EDGE2 2321 1321 0.00649261 -0.0486355 0.00615781 1 0 1 1 0 0 +EDGE2 2321 1520 -1.01292 -0.00200915 -1.59093 1 0 1 1 0 0 +EDGE2 2321 1620 -0.958297 -0.0159085 1.57558 1 0 1 1 0 0 +EDGE2 2321 1640 -1.01058 -0.00704422 1.60103 1 0 1 1 0 0 +EDGE2 2321 2320 -1.09156 -0.0468556 -1.59569 1 0 1 1 0 0 +EDGE2 2321 1600 -0.928865 -0.0261049 -1.57251 1 0 1 1 0 0 +EDGE2 2321 1320 -1.02616 -0.131582 1.58456 1 0 1 1 0 0 +EDGE2 2322 1323 1.01927 -0.0695526 0.0233045 1 0 1 1 0 0 +EDGE2 2322 1643 1.06618 -0.00940044 -0.0212448 1 0 1 1 0 0 +EDGE2 2322 1523 0.976743 0.0405378 -0.016492 1 0 1 1 0 0 +EDGE2 2322 1322 0.00634972 0.0489311 0.0122897 1 0 1 1 0 0 +EDGE2 2322 1642 0.0860584 -0.0130948 -0.00486107 1 0 1 1 0 0 +EDGE2 2322 1522 -0.0604162 -0.0306504 -0.00244046 1 0 1 1 0 0 +EDGE2 2322 1521 -0.989867 0.00882731 0.0402896 1 0 1 1 0 0 +EDGE2 2322 1641 -0.980983 0.130555 0.0102763 1 0 1 1 0 0 +EDGE2 2322 2321 -0.985482 -0.0419972 -0.00513515 1 0 1 1 0 0 +EDGE2 2322 1321 -0.995323 -0.0121308 0.0519101 1 0 1 1 0 0 +EDGE2 2323 1524 1.01383 0.0110372 0.0193177 1 0 1 1 0 0 +EDGE2 2323 1644 0.975682 -0.00547791 -0.000229869 1 0 1 1 0 0 +EDGE2 2323 1324 1.0234 0.0988168 -0.00133026 1 0 1 1 0 0 +EDGE2 2323 1323 -0.0256091 -0.0447572 -0.0514566 1 0 1 1 0 0 +EDGE2 2323 1643 0.104276 0.00882661 -0.00691356 1 0 1 1 0 0 +EDGE2 2323 1523 0.00525047 0.00738195 0.0518323 1 0 1 1 0 0 +EDGE2 2323 1322 -0.921056 0.0720166 0.0266728 1 0 1 1 0 0 +EDGE2 2323 1642 -0.98426 0.0734663 -0.0192563 1 0 1 1 0 0 +EDGE2 2323 2322 -0.986549 0.151582 -0.0124045 1 0 1 1 0 0 +EDGE2 2323 1522 -0.996338 0.017901 -0.00114477 1 0 1 1 0 0 +EDGE2 2324 1345 0.992384 0.0118178 -3.13929 1 0 1 1 0 0 +EDGE2 2324 1525 0.944521 -0.0253519 0.0153202 1 0 1 1 0 0 +EDGE2 2324 1905 0.926701 0.000981021 -3.14655 1 0 1 1 0 0 +EDGE2 2324 1925 1.03155 0.0401244 -3.12799 1 0 1 1 0 0 +EDGE2 2324 1645 0.949588 -0.0475185 -0.0169193 1 0 1 1 0 0 +EDGE2 2324 1485 1.04711 0.0311911 -3.14074 1 0 1 1 0 0 +EDGE2 2324 1505 1.08123 0.0183751 -3.13959 1 0 1 1 0 0 +EDGE2 2324 1365 1.03317 -0.0100865 -3.14495 1 0 1 1 0 0 +EDGE2 2324 1325 1.05985 -0.0594189 -0.0178761 1 0 1 1 0 0 +EDGE2 2324 1524 -0.0497548 0.0626769 -0.0114302 1 0 1 1 0 0 +EDGE2 2324 1644 -0.0374948 0.0657164 -0.0107755 1 0 1 1 0 0 +EDGE2 2324 1324 -0.000966176 0.00544833 0.0292376 1 0 1 1 0 0 +EDGE2 2324 1323 -1.02912 0.0344644 0.0523848 1 0 1 1 0 0 +EDGE2 2324 1643 -1.06826 0.00073217 0.0155318 1 0 1 1 0 0 +EDGE2 2324 2323 -0.960489 -0.0253323 0.00917573 1 0 1 1 0 0 +EDGE2 2324 1523 -0.943093 -0.0384004 0.00485456 1 0 1 1 0 0 +EDGE2 2325 1345 -0.0148334 -0.0242278 -3.14988 1 0 1 1 0 0 +EDGE2 2325 1526 0.00237261 0.97707 1.55281 1 0 1 1 0 0 +EDGE2 2325 1926 -0.0512425 0.916844 1.57856 1 0 1 1 0 0 +EDGE2 2325 1646 -0.0455893 1.04977 1.56254 1 0 1 1 0 0 +EDGE2 2325 1366 0.0351134 0.936249 1.57257 1 0 1 1 0 0 +EDGE2 2325 1506 -0.0108162 1.02081 1.56834 1 0 1 1 0 0 +EDGE2 2325 1924 0.982472 0.120081 -3.13893 1 0 1 1 0 0 +EDGE2 2325 1344 1.01353 0.00464408 -3.16247 1 0 1 1 0 0 +EDGE2 2325 1484 0.985054 -0.0467229 -3.13411 1 0 1 1 0 0 +EDGE2 2325 1504 0.956388 -0.00433153 -3.13968 1 0 1 1 0 0 +EDGE2 2325 1904 1.05614 -0.0196309 -3.14405 1 0 1 1 0 0 +EDGE2 2325 1364 0.976104 0.0285974 -3.12867 1 0 1 1 0 0 +EDGE2 2325 1525 0.115235 0.10489 -0.0300198 1 0 1 1 0 0 +EDGE2 2325 1905 -0.013415 -0.0547567 -3.16382 1 0 1 1 0 0 +EDGE2 2325 1925 -0.0154124 0.00428224 -3.14986 1 0 1 1 0 0 +EDGE2 2325 1645 0.117803 -0.0761512 -0.00207321 1 0 1 1 0 0 +EDGE2 2325 1485 0.0282252 0.0166928 -3.13834 1 0 1 1 0 0 +EDGE2 2325 1505 0.0101323 0.0481602 -3.15505 1 0 1 1 0 0 +EDGE2 2325 1365 -0.0865378 0.0684433 -3.13854 1 0 1 1 0 0 +EDGE2 2325 1325 0.0690279 0.0299121 -0.0299165 1 0 1 1 0 0 +EDGE2 2325 1524 -0.992665 0.0909917 -0.011293 1 0 1 1 0 0 +EDGE2 2325 2324 -1.06714 -0.0308649 -0.0206759 1 0 1 1 0 0 +EDGE2 2325 1644 -1.00159 0.00712973 0.0161157 1 0 1 1 0 0 +EDGE2 2325 1324 -0.921286 0.0278215 -0.0215956 1 0 1 1 0 0 +EDGE2 2325 1486 -0.0587229 -0.961548 -1.59645 1 0 1 1 0 0 +EDGE2 2325 1906 -0.0274539 -0.956293 -1.59263 1 0 1 1 0 0 +EDGE2 2325 1326 -0.00190233 -0.970086 -1.55302 1 0 1 1 0 0 +EDGE2 2325 1346 -0.147281 -0.996815 -1.58374 1 0 1 1 0 0 +EDGE2 2326 1345 -0.957905 -0.0296943 1.57624 1 0 1 1 0 0 +EDGE2 2326 1526 0.0620964 0.0160033 -0.018867 1 0 1 1 0 0 +EDGE2 2326 1507 1.02718 -0.0658021 0.0294665 1 0 1 1 0 0 +EDGE2 2326 1527 0.971264 -0.0198367 -0.0128572 1 0 1 1 0 0 +EDGE2 2326 1647 1.06154 0.0306286 -0.00474325 1 0 1 1 0 0 +EDGE2 2326 1927 0.966207 0.0186354 0.024419 1 0 1 1 0 0 +EDGE2 2326 1367 1.02244 0.0888521 -0.0384416 1 0 1 1 0 0 +EDGE2 2326 1926 -0.0345376 0.0400858 -0.000895235 1 0 1 1 0 0 +EDGE2 2326 1646 0.0470975 0.0583924 0.00706154 1 0 1 1 0 0 +EDGE2 2326 1366 0.0150312 0.0597576 0.0298308 1 0 1 1 0 0 +EDGE2 2326 1506 -0.0345721 0.062834 -0.00872531 1 0 1 1 0 0 +EDGE2 2326 1525 -1.01107 0.0142641 -1.59189 1 0 1 1 0 0 +EDGE2 2326 1905 -1.0266 -0.00131588 1.57852 1 0 1 1 0 0 +EDGE2 2326 1925 -0.993564 0.00822934 1.56146 1 0 1 1 0 0 +EDGE2 2326 2325 -0.974448 -0.0362021 -1.55668 1 0 1 1 0 0 +EDGE2 2326 1645 -0.962131 0.0228113 -1.59786 1 0 1 1 0 0 +EDGE2 2326 1485 -0.987706 -0.0280885 1.55286 1 0 1 1 0 0 +EDGE2 2326 1505 -0.955654 0.028861 1.54623 1 0 1 1 0 0 +EDGE2 2326 1365 -1.06026 0.0550088 1.59015 1 0 1 1 0 0 +EDGE2 2326 1325 -1.02288 0.0528273 -1.58278 1 0 1 1 0 0 +EDGE2 2327 1648 0.87298 -0.0329104 0.0213118 1 0 1 1 0 0 +EDGE2 2327 1928 1.01056 -0.0337899 0.00111395 1 0 1 1 0 0 +EDGE2 2327 1368 0.989973 -0.0615544 0.00646193 1 0 1 1 0 0 +EDGE2 2327 1508 0.962944 -0.0344659 0.00367171 1 0 1 1 0 0 +EDGE2 2327 1528 0.986525 -0.0128619 0.0165171 1 0 1 1 0 0 +EDGE2 2327 1526 -1.02123 -0.0853497 -0.0317421 1 0 1 1 0 0 +EDGE2 2327 1507 0.0722434 -0.0752185 0.0322902 1 0 1 1 0 0 +EDGE2 2327 1527 -0.0501136 0.132574 0.0156778 1 0 1 1 0 0 +EDGE2 2327 1647 -0.0267462 -0.0332533 -0.00974089 1 0 1 1 0 0 +EDGE2 2327 1927 0.0313113 -0.0561484 0.000785635 1 0 1 1 0 0 +EDGE2 2327 1367 0.0671313 -0.0524953 0.0125365 1 0 1 1 0 0 +EDGE2 2327 1926 -0.983791 0.0160672 -0.000487557 1 0 1 1 0 0 +EDGE2 2327 2326 -1.01933 -0.0119352 -0.00975648 1 0 1 1 0 0 +EDGE2 2327 1646 -1.00741 -0.029262 -0.011463 1 0 1 1 0 0 +EDGE2 2327 1366 -1.06637 0.0519558 0.020992 1 0 1 1 0 0 +EDGE2 2327 1506 -1.00315 0.0393873 -0.00314441 1 0 1 1 0 0 +EDGE2 2328 2327 -1.04545 -0.0338351 -0.000939274 1 0 1 1 0 0 +EDGE2 2328 1509 0.962968 -0.0563407 0.0198877 1 0 1 1 0 0 +EDGE2 2328 1649 0.983067 0.035855 -0.0368844 1 0 1 1 0 0 +EDGE2 2328 1929 0.935388 0.0862144 0.0384782 1 0 1 1 0 0 +EDGE2 2328 1529 1.00474 -0.0605942 -0.00522142 1 0 1 1 0 0 +EDGE2 2328 1369 1.03201 0.0874929 0.0284333 1 0 1 1 0 0 +EDGE2 2328 1648 -0.0168518 0.0297725 -0.0118319 1 0 1 1 0 0 +EDGE2 2328 1928 -0.0138468 -0.039769 -0.000685798 1 0 1 1 0 0 +EDGE2 2328 1368 -0.00664057 -0.0519016 0.00615917 1 0 1 1 0 0 +EDGE2 2328 1508 0.124877 0.00144318 -0.0120067 1 0 1 1 0 0 +EDGE2 2328 1528 -0.0347599 0.0222008 -0.0027322 1 0 1 1 0 0 +EDGE2 2328 1507 -0.963751 0.0509355 -0.0200255 1 0 1 1 0 0 +EDGE2 2328 1527 -1.01905 0.106277 -0.0293248 1 0 1 1 0 0 +EDGE2 2328 1647 -0.97979 0.00491558 0.00140415 1 0 1 1 0 0 +EDGE2 2328 1927 -0.887087 -0.0601685 0.0115318 1 0 1 1 0 0 +EDGE2 2328 1367 -0.925114 0.0585819 -0.0302302 1 0 1 1 0 0 +EDGE2 2329 1650 1.06194 -0.0147421 -0.0186593 1 0 1 1 0 0 +EDGE2 2329 1710 1.03773 -0.0549877 -3.13792 1 0 1 1 0 0 +EDGE2 2329 1870 0.995437 0.0482224 -3.13166 1 0 1 1 0 0 +EDGE2 2329 1930 1.03348 -0.00772396 0.0197281 1 0 1 1 0 0 +EDGE2 2329 1670 0.908386 0.00513215 -3.13999 1 0 1 1 0 0 +EDGE2 2329 1470 1.02461 0.121318 -3.1709 1 0 1 1 0 0 +EDGE2 2329 1510 1.03264 -0.01671 0.0212825 1 0 1 1 0 0 +EDGE2 2329 1530 1.05841 0.0455094 -0.00496324 1 0 1 1 0 0 +EDGE2 2329 1370 1.06155 0.027806 0.000659932 1 0 1 1 0 0 +EDGE2 2329 1509 0.0175148 0.0385937 -0.0519713 1 0 1 1 0 0 +EDGE2 2329 1649 0.0337994 -0.0708433 0.0269863 1 0 1 1 0 0 +EDGE2 2329 1929 -0.100347 -0.0497911 0.00132854 1 0 1 1 0 0 +EDGE2 2329 1529 -0.0267476 0.0192384 0.0217433 1 0 1 1 0 0 +EDGE2 2329 1369 -0.093361 -0.0349826 0.00753749 1 0 1 1 0 0 +EDGE2 2329 1648 -1.07211 -0.0167457 0.0232614 1 0 1 1 0 0 +EDGE2 2329 1928 -0.94146 -0.00283871 0.000139407 1 0 1 1 0 0 +EDGE2 2329 2328 -1.03183 -0.0902934 -0.043417 1 0 1 1 0 0 +EDGE2 2329 1368 -1.03211 -0.0329813 0.00417471 1 0 1 1 0 0 +EDGE2 2329 1508 -1.03859 -0.0168646 -0.00139132 1 0 1 1 0 0 +EDGE2 2329 1528 -0.984656 -0.0215083 -0.00310365 1 0 1 1 0 0 +EDGE2 2330 1931 -0.0500384 -0.935075 -1.58349 1 0 1 1 0 0 +EDGE2 2330 1669 1.00733 -0.0263626 -3.14318 1 0 1 1 0 0 +EDGE2 2330 1709 0.994357 -0.0293264 -3.12052 1 0 1 1 0 0 +EDGE2 2330 1869 1.03422 0.0146589 -3.14528 1 0 1 1 0 0 +EDGE2 2330 1469 0.945106 -0.00971415 -3.16402 1 0 1 1 0 0 +EDGE2 2330 1671 -0.0780067 -1.03619 -1.54418 1 0 1 1 0 0 +EDGE2 2330 1711 0.0684923 -0.993521 -1.56168 1 0 1 1 0 0 +EDGE2 2330 1871 -0.00207575 -1.08536 -1.56839 1 0 1 1 0 0 +EDGE2 2330 1471 0.0349002 -1.03984 -1.55041 1 0 1 1 0 0 +EDGE2 2330 1650 -0.00908462 -0.0841157 0.0271951 1 0 1 1 0 0 +EDGE2 2330 1710 0.0158627 0.0233514 -3.13886 1 0 1 1 0 0 +EDGE2 2330 1870 0.0190736 0.02709 -3.15865 1 0 1 1 0 0 +EDGE2 2330 1930 0.0739615 -0.00155005 0.019948 1 0 1 1 0 0 +EDGE2 2330 1670 -0.0555822 -0.0918662 -3.1276 1 0 1 1 0 0 +EDGE2 2330 1470 0.0278917 -0.0688881 -3.12992 1 0 1 1 0 0 +EDGE2 2330 1510 -0.0627668 -0.0739149 0.00776917 1 0 1 1 0 0 +EDGE2 2330 1530 0.0214006 -0.0084206 -0.0407541 1 0 1 1 0 0 +EDGE2 2330 1370 0.0126815 -0.110088 0.0137075 1 0 1 1 0 0 +EDGE2 2330 1371 -0.000450182 0.925652 1.55605 1 0 1 1 0 0 +EDGE2 2330 1531 -0.0669701 0.928977 1.5915 1 0 1 1 0 0 +EDGE2 2330 1651 -0.0367707 1.06219 1.59039 1 0 1 1 0 0 +EDGE2 2330 1511 -0.0347359 0.946578 1.53542 1 0 1 1 0 0 +EDGE2 2330 1509 -0.922773 0.00190479 0.00345791 1 0 1 1 0 0 +EDGE2 2330 1649 -0.947414 -0.043911 0.00128802 1 0 1 1 0 0 +EDGE2 2330 1929 -0.929845 -0.00301705 0.0364543 1 0 1 1 0 0 +EDGE2 2330 2329 -0.975461 -0.00245337 -0.00130115 1 0 1 1 0 0 +EDGE2 2330 1529 -0.943586 0.0559801 0.00104389 1 0 1 1 0 0 +EDGE2 2330 1369 -1.05919 -0.0424447 0.0350253 1 0 1 1 0 0 +EDGE2 2331 2330 -1.0146 0.0185095 -1.52255 1 0 1 1 0 0 +EDGE2 2331 1650 -0.957293 0.109135 -1.5423 1 0 1 1 0 0 +EDGE2 2331 1710 -1.01145 -0.0485501 1.56944 1 0 1 1 0 0 +EDGE2 2331 1870 -0.887807 -0.0777505 1.57168 1 0 1 1 0 0 +EDGE2 2331 1930 -1.01055 -0.0471916 -1.57913 1 0 1 1 0 0 +EDGE2 2331 1670 -0.96999 -0.0372129 1.58339 1 0 1 1 0 0 +EDGE2 2331 1470 -0.969558 0.00782227 1.56796 1 0 1 1 0 0 +EDGE2 2331 1510 -1.03306 0.0288557 -1.54866 1 0 1 1 0 0 +EDGE2 2331 1530 -0.910417 -0.0751939 -1.58285 1 0 1 1 0 0 +EDGE2 2331 1370 -1.03105 -0.0432376 -1.54884 1 0 1 1 0 0 +EDGE2 2331 1371 -0.0181444 0.05962 0.0280386 1 0 1 1 0 0 +EDGE2 2331 1531 -0.0394306 0.0308802 -0.0173764 1 0 1 1 0 0 +EDGE2 2331 1651 -0.0345631 -0.00430035 0.0256157 1 0 1 1 0 0 +EDGE2 2331 1511 -0.0477561 0.0496499 -0.019622 1 0 1 1 0 0 +EDGE2 2331 1512 0.973054 -0.0210726 -0.00641973 1 0 1 1 0 0 +EDGE2 2331 1652 1.05811 0.106341 -0.019894 1 0 1 1 0 0 +EDGE2 2331 1532 1.07245 0.0723858 0.0109016 1 0 1 1 0 0 +EDGE2 2331 1372 1.00749 -0.0259199 0.00308539 1 0 1 1 0 0 +EDGE2 2332 1371 -1.0538 0.0171499 -0.00997131 1 0 1 1 0 0 +EDGE2 2332 1531 -1.00205 0.0217857 -0.0336501 1 0 1 1 0 0 +EDGE2 2332 1651 -0.989633 0.0196064 0.00723151 1 0 1 1 0 0 +EDGE2 2332 2331 -1.002 -0.0722019 0.00617944 1 0 1 1 0 0 +EDGE2 2332 1511 -0.931657 0.0337535 -0.00600096 1 0 1 1 0 0 +EDGE2 2332 1512 -0.0387538 0.029736 0.0291228 1 0 1 1 0 0 +EDGE2 2332 1652 -0.0827008 0.0279352 0.0308783 1 0 1 1 0 0 +EDGE2 2332 1532 -0.0302364 0.0040669 0.0164853 1 0 1 1 0 0 +EDGE2 2332 1372 0.0671233 -0.0989766 0.00614918 1 0 1 1 0 0 +EDGE2 2332 1513 0.957535 0.104368 -0.00328876 1 0 1 1 0 0 +EDGE2 2332 1653 0.953065 0.075886 0.0107447 1 0 1 1 0 0 +EDGE2 2332 1533 0.931597 -0.00295554 0.0106094 1 0 1 1 0 0 +EDGE2 2332 1373 1.02344 -0.0473049 0.0206228 1 0 1 1 0 0 +EDGE2 2333 1512 -1.02945 -0.0242352 -0.00881047 1 0 1 1 0 0 +EDGE2 2333 1652 -0.99066 0.0883205 0.00729854 1 0 1 1 0 0 +EDGE2 2333 2332 -0.983539 0.067879 0.0108958 1 0 1 1 0 0 +EDGE2 2333 1532 -1.06283 -0.0586052 -0.0055103 1 0 1 1 0 0 +EDGE2 2333 1372 -1.04301 0.00957538 0.0164005 1 0 1 1 0 0 +EDGE2 2333 1513 -0.000932422 0.0517335 -0.00419027 1 0 1 1 0 0 +EDGE2 2333 1653 0.0227249 -0.0404817 0.0341561 1 0 1 1 0 0 +EDGE2 2333 1533 0.0747827 -0.00296059 -0.0094202 1 0 1 1 0 0 +EDGE2 2333 1373 -0.0565169 0.0153714 -0.00381397 1 0 1 1 0 0 +EDGE2 2333 1514 1.01992 -0.0191835 0.00420711 1 0 1 1 0 0 +EDGE2 2333 1654 1.05973 -0.0167797 -0.0120177 1 0 1 1 0 0 +EDGE2 2333 1534 1.01184 -0.0213393 0.0424298 1 0 1 1 0 0 +EDGE2 2333 1374 0.960544 -0.0121894 0.0173899 1 0 1 1 0 0 +EDGE2 2334 1535 1.06686 0.0226669 -0.0399967 1 0 1 1 0 0 +EDGE2 2334 1513 -1.04107 -0.0535392 0.00681102 1 0 1 1 0 0 +EDGE2 2334 1653 -0.989225 0.0580143 0.0155319 1 0 1 1 0 0 +EDGE2 2334 2333 -0.992608 -0.0468962 -0.0163665 1 0 1 1 0 0 +EDGE2 2334 1533 -0.985697 0.016881 -0.0161322 1 0 1 1 0 0 +EDGE2 2334 1373 -1.01528 0.000789677 -0.00498323 1 0 1 1 0 0 +EDGE2 2334 1514 0.0456507 0.0132038 0.00936528 1 0 1 1 0 0 +EDGE2 2334 1654 0.099044 0.0102407 0.0238653 1 0 1 1 0 0 +EDGE2 2334 1534 -0.0365652 -0.0533053 0.0216475 1 0 1 1 0 0 +EDGE2 2334 1374 -0.10255 -0.0409734 0.00182119 1 0 1 1 0 0 +EDGE2 2334 1855 1.05927 0.0918034 -3.12569 1 0 1 1 0 0 +EDGE2 2334 2315 0.960361 0.0517343 -3.12203 1 0 1 1 0 0 +EDGE2 2334 1595 1.01237 -0.0349958 -3.1558 1 0 1 1 0 0 +EDGE2 2334 1655 1.04298 0.00705874 0.00320333 1 0 1 1 0 0 +EDGE2 2334 1575 1.00308 -0.0120654 -3.10326 1 0 1 1 0 0 +EDGE2 2334 1375 1.01512 -0.0644738 0.0353436 1 0 1 1 0 0 +EDGE2 2334 1515 0.93648 -0.0670433 -0.000987272 1 0 1 1 0 0 +EDGE2 2335 1656 -0.01525 -1.03137 -1.53956 1 0 1 1 0 0 +EDGE2 2335 1856 0.0775563 -0.954847 -1.58065 1 0 1 1 0 0 +EDGE2 2335 1536 -0.0472256 -0.946022 -1.58555 1 0 1 1 0 0 +EDGE2 2335 1576 -0.0352706 -0.952944 -1.59036 1 0 1 1 0 0 +EDGE2 2335 1376 0.0127604 -0.972867 -1.52157 1 0 1 1 0 0 +EDGE2 2335 1535 0.0464013 0.0284156 0.0224606 1 0 1 1 0 0 +EDGE2 2335 1514 -1.10137 -0.0362997 0.00202513 1 0 1 1 0 0 +EDGE2 2335 1654 -1.04482 0.0109861 -0.0173683 1 0 1 1 0 0 +EDGE2 2335 2334 -0.989931 -0.0710587 0.0147591 1 0 1 1 0 0 +EDGE2 2335 1534 -0.97148 0.123345 0.0265476 1 0 1 1 0 0 +EDGE2 2335 1374 -1.0051 -0.0388642 -0.0153378 1 0 1 1 0 0 +EDGE2 2335 1855 0.0798048 0.026515 -3.1425 1 0 1 1 0 0 +EDGE2 2335 2315 0.0094599 0.00684951 -3.17868 1 0 1 1 0 0 +EDGE2 2335 1595 0.0117231 -0.0392116 -3.13939 1 0 1 1 0 0 +EDGE2 2335 1655 0.0407818 0.0865699 0.0153086 1 0 1 1 0 0 +EDGE2 2335 1575 0.000124704 0.0611299 -3.17076 1 0 1 1 0 0 +EDGE2 2335 1854 0.942902 -0.0133248 -3.14144 1 0 1 1 0 0 +EDGE2 2335 1375 -0.0347017 -0.0630808 -0.0202447 1 0 1 1 0 0 +EDGE2 2335 1515 -0.030419 0.024446 0.0158909 1 0 1 1 0 0 +EDGE2 2335 2314 0.945887 -0.0417279 -3.14892 1 0 1 1 0 0 +EDGE2 2335 1574 1.0328 0.00132825 -3.14204 1 0 1 1 0 0 +EDGE2 2335 1594 0.997952 0.0498493 -3.13333 1 0 1 1 0 0 +EDGE2 2335 1516 0.0580468 1.00151 1.56616 1 0 1 1 0 0 +EDGE2 2335 1596 -0.00376782 0.884593 1.58985 1 0 1 1 0 0 +EDGE2 2335 2316 0.0185097 0.980627 1.5626 1 0 1 1 0 0 +EDGE2 2336 1535 -0.995788 -0.067201 -1.55309 1 0 1 1 0 0 +EDGE2 2336 1855 -0.963627 -0.0117732 1.56571 1 0 1 1 0 0 +EDGE2 2336 2335 -1.0565 0.0219569 -1.55671 1 0 1 1 0 0 +EDGE2 2336 2315 -1.11499 -0.0569874 1.57852 1 0 1 1 0 0 +EDGE2 2336 1595 -0.944355 -0.013772 1.59226 1 0 1 1 0 0 +EDGE2 2336 1655 -1.02422 0.0338476 -1.62396 1 0 1 1 0 0 +EDGE2 2336 1575 -0.95924 0.0133979 1.58278 1 0 1 1 0 0 +EDGE2 2336 1375 -0.994192 0.0183168 -1.53285 1 0 1 1 0 0 +EDGE2 2336 1515 -0.981829 -0.0053444 -1.55125 1 0 1 1 0 0 +EDGE2 2336 1516 -0.0868868 -0.1066 -0.00138905 1 0 1 1 0 0 +EDGE2 2336 1596 -0.0386718 -0.00376588 0.00701749 1 0 1 1 0 0 +EDGE2 2336 2316 -0.0494744 0.0219411 -0.00256145 1 0 1 1 0 0 +EDGE2 2336 1597 0.934236 -0.0565222 -0.00366725 1 0 1 1 0 0 +EDGE2 2336 2317 1.01647 -0.00510625 -0.00454612 1 0 1 1 0 0 +EDGE2 2336 1517 1.00644 -0.000502314 -0.000294366 1 0 1 1 0 0 +EDGE2 2337 2336 -1.03707 -0.0385512 -0.0141066 1 0 1 1 0 0 +EDGE2 2337 1516 -1.00232 -0.0232682 -0.0214572 1 0 1 1 0 0 +EDGE2 2337 1596 -0.977876 -0.00908124 0.0154294 1 0 1 1 0 0 +EDGE2 2337 2316 -0.90824 0.0509789 -0.0346524 1 0 1 1 0 0 +EDGE2 2337 1597 -0.029477 0.0498502 0.0161619 1 0 1 1 0 0 +EDGE2 2337 2317 0.023694 -0.0649108 0.00614899 1 0 1 1 0 0 +EDGE2 2337 1517 -0.00762993 -0.0317524 0.0106118 1 0 1 1 0 0 +EDGE2 2337 1598 0.984621 -0.0330929 -0.0115316 1 0 1 1 0 0 +EDGE2 2337 2318 1.06706 -0.0333609 0.0160494 1 0 1 1 0 0 +EDGE2 2337 1518 1.03671 0.0387888 -0.0276409 1 0 1 1 0 0 +EDGE2 2338 2337 -0.99544 0.0718438 0.0188573 1 0 1 1 0 0 +EDGE2 2338 1597 -1.01501 0.0432265 -0.00861763 1 0 1 1 0 0 +EDGE2 2338 2317 -1.02953 0.0735836 0.00209366 1 0 1 1 0 0 +EDGE2 2338 1517 -1.01856 0.0455565 -0.0392343 1 0 1 1 0 0 +EDGE2 2338 1598 -0.0209802 0.0697235 -0.015089 1 0 1 1 0 0 +EDGE2 2338 2318 -0.00406316 -0.0259255 -0.0074135 1 0 1 1 0 0 +EDGE2 2338 1518 -0.042973 0.0161553 0.0235308 1 0 1 1 0 0 +EDGE2 2338 1599 0.992 0.00286107 0.0141807 1 0 1 1 0 0 +EDGE2 2338 2319 1.00957 0.0683905 -0.0174383 1 0 1 1 0 0 +EDGE2 2338 1519 1.02116 0.0246091 -0.00580206 1 0 1 1 0 0 +EDGE2 2339 1598 -1.01453 0.116329 -0.0321902 1 0 1 1 0 0 +EDGE2 2339 2338 -0.984895 0.0197365 0.00139872 1 0 1 1 0 0 +EDGE2 2339 2318 -1.03646 0.0009091 0.0323512 1 0 1 1 0 0 +EDGE2 2339 1518 -1.12375 0.00128026 0.0183014 1 0 1 1 0 0 +EDGE2 2339 1599 0.0202965 -0.0177755 0.00465473 1 0 1 1 0 0 +EDGE2 2339 2319 0.0485671 0.0181112 0.00901104 1 0 1 1 0 0 +EDGE2 2339 1519 0.00184232 0.0562923 0.0096121 1 0 1 1 0 0 +EDGE2 2339 1520 0.943841 0.0960495 -0.00457071 1 0 1 1 0 0 +EDGE2 2339 1620 1.00242 0.0167723 -3.15183 1 0 1 1 0 0 +EDGE2 2339 1640 1.14084 0.0426115 -3.15163 1 0 1 1 0 0 +EDGE2 2339 2320 0.95315 -0.0291167 0.000276147 1 0 1 1 0 0 +EDGE2 2339 1600 1.00779 0.0252645 -0.0174049 1 0 1 1 0 0 +EDGE2 2339 1320 0.972327 0.0361221 -3.14705 1 0 1 1 0 0 +EDGE2 2340 1599 -0.98119 -0.0241017 -0.0292346 1 0 1 1 0 0 +EDGE2 2340 2319 -0.95186 -0.0187962 -0.00759367 1 0 1 1 0 0 +EDGE2 2340 2339 -0.983068 -0.0227056 0.00145176 1 0 1 1 0 0 +EDGE2 2340 1519 -1.00192 0.015418 0.00726146 1 0 1 1 0 0 +EDGE2 2340 1521 0.0112692 0.995114 1.56917 1 0 1 1 0 0 +EDGE2 2340 1641 0.0449136 0.9864 1.53954 1 0 1 1 0 0 +EDGE2 2340 2321 -0.0361435 0.977437 1.58094 1 0 1 1 0 0 +EDGE2 2340 1321 -0.0452161 1.02777 1.60209 1 0 1 1 0 0 +EDGE2 2340 1520 -0.0168966 -0.025092 0.0207685 1 0 1 1 0 0 +EDGE2 2340 1620 -0.0113004 -0.053711 -3.12028 1 0 1 1 0 0 +EDGE2 2340 1640 -0.00373339 0.0461966 -3.15621 1 0 1 1 0 0 +EDGE2 2340 2320 -0.0148618 -0.00943767 0.0177802 1 0 1 1 0 0 +EDGE2 2340 1600 -0.0169315 0.0731619 0.0602113 1 0 1 1 0 0 +EDGE2 2340 1621 -0.0938167 -0.997644 -1.60531 1 0 1 1 0 0 +EDGE2 2340 1320 0.0134271 0.0605544 -3.16928 1 0 1 1 0 0 +EDGE2 2340 1601 -0.0444775 -0.989585 -1.55469 1 0 1 1 0 0 +EDGE2 2340 1619 0.969328 -0.0336226 -3.17901 1 0 1 1 0 0 +EDGE2 2340 1639 0.947136 -0.0312285 -3.12938 1 0 1 1 0 0 +EDGE2 2340 1319 0.993276 0.0328665 -3.15984 1 0 1 1 0 0 +EDGE2 2341 2340 -0.928263 0.0278636 -1.57638 1 0 1 1 0 0 +EDGE2 2341 1322 0.949404 -0.0428409 0.00618358 1 0 1 1 0 0 +EDGE2 2341 1642 0.963277 0.0150012 0.0114521 1 0 1 1 0 0 +EDGE2 2341 2322 1.07313 -0.0296855 -0.00850599 1 0 1 1 0 0 +EDGE2 2341 1522 1.0894 0.0360862 -0.063483 1 0 1 1 0 0 +EDGE2 2341 1521 -0.00385596 -0.00021301 0.0176213 1 0 1 1 0 0 +EDGE2 2341 1641 -0.0373337 0.0102376 0.0216391 1 0 1 1 0 0 +EDGE2 2341 2321 0.0400082 0.04282 -0.0106887 1 0 1 1 0 0 +EDGE2 2341 1321 -0.0686452 -0.0287096 -0.0301452 1 0 1 1 0 0 +EDGE2 2341 1520 -0.997227 -0.0300526 -1.60116 1 0 1 1 0 0 +EDGE2 2341 1620 -1.01643 0.0331114 1.5814 1 0 1 1 0 0 +EDGE2 2341 1640 -0.921009 -0.0173699 1.6008 1 0 1 1 0 0 +EDGE2 2341 2320 -1.00692 -0.12951 -1.57671 1 0 1 1 0 0 +EDGE2 2341 1600 -1.05854 0.0511181 -1.56768 1 0 1 1 0 0 +EDGE2 2341 1320 -0.936271 0.0191929 1.60573 1 0 1 1 0 0 +EDGE2 2342 1323 0.911385 0.0422864 0.00874231 1 0 1 1 0 0 +EDGE2 2342 1643 1.07069 -0.0335351 -0.0078329 1 0 1 1 0 0 +EDGE2 2342 2323 0.968752 0.0561053 0.0174792 1 0 1 1 0 0 +EDGE2 2342 1523 0.989194 -0.0404554 0.0301272 1 0 1 1 0 0 +EDGE2 2342 2341 -0.987269 -0.00272272 -0.0334978 1 0 1 1 0 0 +EDGE2 2342 1322 -0.0299704 0.0314564 -0.0580563 1 0 1 1 0 0 +EDGE2 2342 1642 0.0770023 0.00443084 0.00468106 1 0 1 1 0 0 +EDGE2 2342 2322 0.0328485 -0.0292435 0.00248366 1 0 1 1 0 0 +EDGE2 2342 1522 0.0201999 0.0523579 -0.0297751 1 0 1 1 0 0 +EDGE2 2342 1521 -0.989224 -0.0642041 0.00667835 1 0 1 1 0 0 +EDGE2 2342 1641 -0.978995 0.0280652 -0.0170862 1 0 1 1 0 0 +EDGE2 2342 2321 -1.01895 -0.0846934 -0.0173151 1 0 1 1 0 0 +EDGE2 2342 1321 -0.922265 0.034689 0.00416088 1 0 1 1 0 0 +EDGE2 2343 1524 1.00821 0.0602351 0.0149572 1 0 1 1 0 0 +EDGE2 2343 2324 1.00907 -0.0114267 0.00894808 1 0 1 1 0 0 +EDGE2 2343 1644 0.957188 -0.0147342 0.0077098 1 0 1 1 0 0 +EDGE2 2343 1324 1.01937 -0.0194084 0.00707865 1 0 1 1 0 0 +EDGE2 2343 1323 -0.0302133 -0.0147202 -0.00929763 1 0 1 1 0 0 +EDGE2 2343 1643 0.0236762 0.0825196 0.0111222 1 0 1 1 0 0 +EDGE2 2343 2323 0.0734556 0.000523805 -0.00131575 1 0 1 1 0 0 +EDGE2 2343 1523 -0.0683987 -0.0126481 0.00134469 1 0 1 1 0 0 +EDGE2 2343 1322 -1.02784 0.0410061 0.0269284 1 0 1 1 0 0 +EDGE2 2343 1642 -1.01612 0.0340012 -0.00440194 1 0 1 1 0 0 +EDGE2 2343 2322 -1.03401 0.0471737 -0.0446596 1 0 1 1 0 0 +EDGE2 2343 2342 -1.12977 -0.0429308 -0.0187501 1 0 1 1 0 0 +EDGE2 2343 1522 -1.0041 0.0484499 -0.0126666 1 0 1 1 0 0 +EDGE2 2344 1345 1.08126 -0.0222521 -3.13184 1 0 1 1 0 0 +EDGE2 2344 1525 1.0004 -0.0811339 0.02221 1 0 1 1 0 0 +EDGE2 2344 1905 0.94487 0.082767 -3.12694 1 0 1 1 0 0 +EDGE2 2344 1925 0.906615 -0.0038905 -3.13098 1 0 1 1 0 0 +EDGE2 2344 2325 0.945595 -0.0153711 0.0231301 1 0 1 1 0 0 +EDGE2 2344 1645 0.989514 0.0456243 -0.0152884 1 0 1 1 0 0 +EDGE2 2344 1485 1.07909 0.0597533 -3.17839 1 0 1 1 0 0 +EDGE2 2344 1505 1.02772 -0.0455658 -3.13292 1 0 1 1 0 0 +EDGE2 2344 1365 0.928953 -0.0217237 -3.14195 1 0 1 1 0 0 +EDGE2 2344 1325 1.00666 -0.156317 0.0103404 1 0 1 1 0 0 +EDGE2 2344 1524 0.0745197 -0.0265458 0.000143812 1 0 1 1 0 0 +EDGE2 2344 2324 0.0364684 -0.0415495 0.0303595 1 0 1 1 0 0 +EDGE2 2344 1644 0.00848446 -0.00780669 -0.00319134 1 0 1 1 0 0 +EDGE2 2344 1324 -0.0569417 0.0311511 0.0133405 1 0 1 1 0 0 +EDGE2 2344 1323 -1.06448 0.0155985 -0.00387202 1 0 1 1 0 0 +EDGE2 2344 1643 -0.992294 -0.0772276 0.00887025 1 0 1 1 0 0 +EDGE2 2344 2323 -0.97915 -0.0146632 0.0310526 1 0 1 1 0 0 +EDGE2 2344 2343 -0.99398 0.0220012 0.0402435 1 0 1 1 0 0 +EDGE2 2344 1523 -1.01821 -0.138132 0.0254999 1 0 1 1 0 0 +EDGE2 2345 1345 0.0488821 0.015242 -3.12395 1 0 1 1 0 0 +EDGE2 2345 1526 -0.0533797 1.06095 1.55129 1 0 1 1 0 0 +EDGE2 2345 1926 -0.0036372 1.02387 1.58879 1 0 1 1 0 0 +EDGE2 2345 2326 -0.0225178 0.988686 1.54112 1 0 1 1 0 0 +EDGE2 2345 1646 -0.0336749 1.01151 1.55477 1 0 1 1 0 0 +EDGE2 2345 1366 -0.0321557 0.98653 1.59496 1 0 1 1 0 0 +EDGE2 2345 1506 -0.0196963 0.987276 1.55021 1 0 1 1 0 0 +EDGE2 2345 1924 0.988143 -0.100616 -3.12649 1 0 1 1 0 0 +EDGE2 2345 1344 1.06255 0.0700035 -3.14989 1 0 1 1 0 0 +EDGE2 2345 1484 0.897136 0.0398293 -3.14267 1 0 1 1 0 0 +EDGE2 2345 1504 0.947326 0.0696707 -3.10759 1 0 1 1 0 0 +EDGE2 2345 1904 1.02333 0.0397371 -3.16124 1 0 1 1 0 0 +EDGE2 2345 1364 0.940617 0.0312824 -3.11266 1 0 1 1 0 0 +EDGE2 2345 1525 -0.0117551 0.031417 -0.00413602 1 0 1 1 0 0 +EDGE2 2345 1905 -0.0827404 -0.00629459 -3.14809 1 0 1 1 0 0 +EDGE2 2345 1925 0.00355936 0.0446128 -3.15187 1 0 1 1 0 0 +EDGE2 2345 2325 -0.0262311 0.0550394 -0.00721521 1 0 1 1 0 0 +EDGE2 2345 1645 -0.10114 0.0743022 -0.00962984 1 0 1 1 0 0 +EDGE2 2345 1485 -0.0308638 0.0556211 -3.14796 1 0 1 1 0 0 +EDGE2 2345 1505 0.0835371 0.00161833 -3.13945 1 0 1 1 0 0 +EDGE2 2345 1365 0.0519941 -0.0329302 -3.11537 1 0 1 1 0 0 +EDGE2 2345 1325 -0.00533905 0.0371301 0.00433699 1 0 1 1 0 0 +EDGE2 2345 1524 -0.948752 -0.02129 0.00667192 1 0 1 1 0 0 +EDGE2 2345 2324 -0.940797 -0.0251334 -0.0271005 1 0 1 1 0 0 +EDGE2 2345 2344 -0.957151 -0.0464023 -0.0125287 1 0 1 1 0 0 +EDGE2 2345 1644 -1.12147 -0.0174215 0.0192604 1 0 1 1 0 0 +EDGE2 2345 1324 -1.01548 -0.00583156 0.00592259 1 0 1 1 0 0 +EDGE2 2345 1486 -0.0176867 -0.96199 -1.60427 1 0 1 1 0 0 +EDGE2 2345 1906 0.103516 -1.00375 -1.59088 1 0 1 1 0 0 +EDGE2 2345 1326 0.0173215 -1.07192 -1.58452 1 0 1 1 0 0 +EDGE2 2345 1346 0.124634 -1.08203 -1.61991 1 0 1 1 0 0 +EDGE2 2346 2327 1.07896 -0.0699963 0.0164385 1 0 1 1 0 0 +EDGE2 2346 1345 -0.937682 0.0130073 1.55974 1 0 1 1 0 0 +EDGE2 2346 1526 0.035746 0.014778 0.02639 1 0 1 1 0 0 +EDGE2 2346 1507 0.939358 0.0188668 0.0342072 1 0 1 1 0 0 +EDGE2 2346 1527 0.979162 -0.0490507 -0.0171235 1 0 1 1 0 0 +EDGE2 2346 1647 1.12785 0.0539079 -0.0203266 1 0 1 1 0 0 +EDGE2 2346 1927 0.954268 0.0581234 -0.0117851 1 0 1 1 0 0 +EDGE2 2346 1367 0.996196 0.0773242 0.0229511 1 0 1 1 0 0 +EDGE2 2346 1926 0.0670667 -0.131661 0.0291608 1 0 1 1 0 0 +EDGE2 2346 2326 -0.002799 -0.0540353 0.00304038 1 0 1 1 0 0 +EDGE2 2346 1646 -0.044944 -0.00951436 0.0411339 1 0 1 1 0 0 +EDGE2 2346 1366 0.00653995 -0.0559229 -0.0210578 1 0 1 1 0 0 +EDGE2 2346 1506 0.0113133 -0.0187427 0.00427759 1 0 1 1 0 0 +EDGE2 2346 2345 -0.946421 -0.0167714 -1.55044 1 0 1 1 0 0 +EDGE2 2346 1525 -1.03108 -0.0440046 -1.59148 1 0 1 1 0 0 +EDGE2 2346 1905 -0.976564 0.0205308 1.5631 1 0 1 1 0 0 +EDGE2 2346 1925 -0.984314 0.0482715 1.54504 1 0 1 1 0 0 +EDGE2 2346 2325 -0.98258 0.0107161 -1.56602 1 0 1 1 0 0 +EDGE2 2346 1645 -1.03607 -0.0469752 -1.58072 1 0 1 1 0 0 +EDGE2 2346 1485 -0.971671 -0.0112021 1.60822 1 0 1 1 0 0 +EDGE2 2346 1505 -0.953671 -0.0154661 1.55714 1 0 1 1 0 0 +EDGE2 2346 1365 -1.13475 0.0152728 1.55159 1 0 1 1 0 0 +EDGE2 2346 1325 -0.986062 0.00922927 -1.55052 1 0 1 1 0 0 +EDGE2 2347 2327 -0.0374528 -0.067111 0.0386892 1 0 1 1 0 0 +EDGE2 2347 1648 1.01848 0.0786479 0.000878503 1 0 1 1 0 0 +EDGE2 2347 1928 1.0655 -0.0468269 -0.00995607 1 0 1 1 0 0 +EDGE2 2347 2328 0.976475 -0.00111002 0.0249197 1 0 1 1 0 0 +EDGE2 2347 1368 0.971889 0.0218669 0.0166972 1 0 1 1 0 0 +EDGE2 2347 1508 1.06316 -0.0538422 -0.00574332 1 0 1 1 0 0 +EDGE2 2347 1528 0.984947 -0.0588763 -0.0105115 1 0 1 1 0 0 +EDGE2 2347 1526 -0.984338 -0.0844731 -0.0120877 1 0 1 1 0 0 +EDGE2 2347 1507 -0.0363208 -0.0186616 0.0219234 1 0 1 1 0 0 +EDGE2 2347 1527 0.099935 0.130568 -0.0163946 1 0 1 1 0 0 +EDGE2 2347 1647 0.0135394 0.0214818 -0.0140308 1 0 1 1 0 0 +EDGE2 2347 1927 -0.0247211 -0.0219474 0.00260868 1 0 1 1 0 0 +EDGE2 2347 1367 -0.0168069 0.10102 0.037023 1 0 1 1 0 0 +EDGE2 2347 1926 -1.01224 -0.0281967 0.0179372 1 0 1 1 0 0 +EDGE2 2347 2326 -1.05015 0.0721451 -0.0278465 1 0 1 1 0 0 +EDGE2 2347 2346 -0.963487 -0.0287413 0.0196628 1 0 1 1 0 0 +EDGE2 2347 1646 -0.993739 -0.0580721 -0.0189001 1 0 1 1 0 0 +EDGE2 2347 1366 -1.0777 0.0877139 0.000221284 1 0 1 1 0 0 +EDGE2 2347 1506 -1.00969 0.103893 -0.00291378 1 0 1 1 0 0 +EDGE2 2348 2327 -1.03438 -0.0176169 -0.0194496 1 0 1 1 0 0 +EDGE2 2348 1509 1.00672 -0.0272816 0.0212601 1 0 1 1 0 0 +EDGE2 2348 1649 0.946787 -0.0645932 0.0216465 1 0 1 1 0 0 +EDGE2 2348 1929 0.996626 -0.120157 0.0189485 1 0 1 1 0 0 +EDGE2 2348 2329 0.976862 -0.00640177 -0.00293783 1 0 1 1 0 0 +EDGE2 2348 1529 0.988672 -0.00895805 -0.00671282 1 0 1 1 0 0 +EDGE2 2348 1369 0.99617 -0.00571891 -0.012987 1 0 1 1 0 0 +EDGE2 2348 1648 -0.00582723 -0.0140054 0.0221316 1 0 1 1 0 0 +EDGE2 2348 1928 -0.0442691 0.0910677 0.00862866 1 0 1 1 0 0 +EDGE2 2348 2328 0.0544147 0.0339442 0.0483915 1 0 1 1 0 0 +EDGE2 2348 1368 -0.0142081 -0.0529267 0.0139866 1 0 1 1 0 0 +EDGE2 2348 1508 0.00919715 0.0396146 0.025132 1 0 1 1 0 0 +EDGE2 2348 1528 0.0362508 0.0211055 0.0233975 1 0 1 1 0 0 +EDGE2 2348 2347 -0.971393 -0.0543569 -0.00192845 1 0 1 1 0 0 +EDGE2 2348 1507 -1.00395 -0.0476232 -0.0229768 1 0 1 1 0 0 +EDGE2 2348 1527 -1.02111 0.00695088 0.000780386 1 0 1 1 0 0 +EDGE2 2348 1647 -1.0878 -0.0132221 0.00607505 1 0 1 1 0 0 +EDGE2 2348 1927 -1.00013 -0.0281714 -0.000302052 1 0 1 1 0 0 +EDGE2 2348 1367 -0.991204 0.0189669 -0.0218252 1 0 1 1 0 0 +EDGE2 2349 2330 1.01105 0.00484139 -0.00846343 1 0 1 1 0 0 +EDGE2 2349 1650 1.10855 0.0232125 0.0478661 1 0 1 1 0 0 +EDGE2 2349 1710 1.02309 -0.0381128 -3.15036 1 0 1 1 0 0 +EDGE2 2349 1870 1.03267 -0.0112539 -3.13347 1 0 1 1 0 0 +EDGE2 2349 1930 0.990881 -0.0168162 -0.00795647 1 0 1 1 0 0 +EDGE2 2349 1670 1.02336 0.00971973 -3.1513 1 0 1 1 0 0 +EDGE2 2349 1470 1.08373 -0.0405774 -3.15432 1 0 1 1 0 0 +EDGE2 2349 1510 0.930065 -0.01304 -0.0194303 1 0 1 1 0 0 +EDGE2 2349 1530 1.00057 0.00269798 0.018397 1 0 1 1 0 0 +EDGE2 2349 1370 0.919045 0.030261 -0.00961013 1 0 1 1 0 0 +EDGE2 2349 1509 -0.0736905 0.0205061 -0.00979026 1 0 1 1 0 0 +EDGE2 2349 1649 0.000492325 -0.0238101 0.0332386 1 0 1 1 0 0 +EDGE2 2349 1929 0.0405134 0.0388989 0.00673913 1 0 1 1 0 0 +EDGE2 2349 2329 -0.0184864 0.0472664 -0.0324841 1 0 1 1 0 0 +EDGE2 2349 1529 0.0423154 -0.0394617 0.0098782 1 0 1 1 0 0 +EDGE2 2349 1369 0.0331981 -0.0719245 0.00721221 1 0 1 1 0 0 +EDGE2 2349 1648 -1.05219 0.0973667 0.0171913 1 0 1 1 0 0 +EDGE2 2349 1928 -1.00884 -0.0320332 -0.00824423 1 0 1 1 0 0 +EDGE2 2349 2328 -1.03187 0.057815 0.00334962 1 0 1 1 0 0 +EDGE2 2349 2348 -1.02274 -0.0953678 0.024962 1 0 1 1 0 0 +EDGE2 2349 1368 -1.01625 -0.000527289 0.0386032 1 0 1 1 0 0 +EDGE2 2349 1508 -0.983739 0.0625694 0.0133014 1 0 1 1 0 0 +EDGE2 2349 1528 -1.04687 -0.00734346 0.0108224 1 0 1 1 0 0 +EDGE2 2350 1931 -0.0289812 -1.01751 -1.5492 1 0 1 1 0 0 +EDGE2 2350 1669 1.0228 -0.000305323 -3.09979 1 0 1 1 0 0 +EDGE2 2350 1709 0.98182 -0.0147426 -3.15526 1 0 1 1 0 0 +EDGE2 2350 1869 0.973839 -0.0215832 -3.13472 1 0 1 1 0 0 +EDGE2 2350 1469 1.05821 0.0296756 -3.12363 1 0 1 1 0 0 +EDGE2 2350 2330 -0.00136377 0.0706605 -0.0164102 1 0 1 1 0 0 +EDGE2 2350 1671 -0.0421415 -0.875181 -1.58971 1 0 1 1 0 0 +EDGE2 2350 1711 -0.0404354 -0.948124 -1.6095 1 0 1 1 0 0 +EDGE2 2350 1871 0.0214423 -1.00671 -1.56775 1 0 1 1 0 0 +EDGE2 2350 1471 -0.0351864 -0.952867 -1.5569 1 0 1 1 0 0 +EDGE2 2350 1650 -0.0194166 -0.0283721 0.0111327 1 0 1 1 0 0 +EDGE2 2350 1710 -0.0878749 0.0155878 -3.13245 1 0 1 1 0 0 +EDGE2 2350 1870 0.0729521 -0.0861669 -3.14543 1 0 1 1 0 0 +EDGE2 2350 1930 0.0374068 0.0481704 -0.0232676 1 0 1 1 0 0 +EDGE2 2350 1670 -0.0309292 0.0305915 -3.14614 1 0 1 1 0 0 +EDGE2 2350 1470 -0.0580429 -0.0757841 -3.16816 1 0 1 1 0 0 +EDGE2 2350 1510 -0.0832057 -0.0262212 -0.000859797 1 0 1 1 0 0 +EDGE2 2350 1530 -0.0493103 -0.0366388 -0.0228256 1 0 1 1 0 0 +EDGE2 2350 1370 0.00964993 0.0543988 -0.0270614 1 0 1 1 0 0 +EDGE2 2350 1371 -0.0107619 1.0109 1.55419 1 0 1 1 0 0 +EDGE2 2350 1531 -0.0820824 1.0737 1.5822 1 0 1 1 0 0 +EDGE2 2350 1651 -0.0952278 0.991728 1.58041 1 0 1 1 0 0 +EDGE2 2350 2331 0.0540689 0.983961 1.55417 1 0 1 1 0 0 +EDGE2 2350 1511 -0.0198012 0.937783 1.54421 1 0 1 1 0 0 +EDGE2 2350 2349 -1.02247 -0.0314479 -0.0234645 1 0 1 1 0 0 +EDGE2 2350 1509 -1.03168 -0.0646736 0.0123273 1 0 1 1 0 0 +EDGE2 2350 1649 -0.959755 0.0413415 0.00321613 1 0 1 1 0 0 +EDGE2 2350 1929 -0.996666 -0.0327338 -0.0218777 1 0 1 1 0 0 +EDGE2 2350 2329 -0.906671 -0.0287449 0.0285961 1 0 1 1 0 0 +EDGE2 2350 1529 -1.0246 0.0101917 -0.0121057 1 0 1 1 0 0 +EDGE2 2350 1369 -1.01247 -0.0478466 0.000514107 1 0 1 1 0 0 +EDGE2 2351 2330 -0.954357 0.00440403 -1.55591 1 0 1 1 0 0 +EDGE2 2351 2350 -1.00702 0.0218081 -1.53892 1 0 1 1 0 0 +EDGE2 2351 1650 -1.04645 0.0197988 -1.54192 1 0 1 1 0 0 +EDGE2 2351 1710 -0.998202 0.0558514 1.52921 1 0 1 1 0 0 +EDGE2 2351 1870 -0.963145 0.0014924 1.56762 1 0 1 1 0 0 +EDGE2 2351 1930 -0.938979 -0.0176323 -1.53878 1 0 1 1 0 0 +EDGE2 2351 1670 -0.964389 0.0258706 1.57758 1 0 1 1 0 0 +EDGE2 2351 1470 -0.9812 -0.00365037 1.60564 1 0 1 1 0 0 +EDGE2 2351 1510 -1.01608 0.0162946 -1.53818 1 0 1 1 0 0 +EDGE2 2351 1530 -1.02467 0.0871985 -1.57297 1 0 1 1 0 0 +EDGE2 2351 1370 -1.04094 0.0741533 -1.57513 1 0 1 1 0 0 +EDGE2 2351 1371 0.0762903 -0.107249 -0.00698474 1 0 1 1 0 0 +EDGE2 2351 1531 0.071327 -0.106709 0.0121494 1 0 1 1 0 0 +EDGE2 2351 1651 -0.0292031 0.0537998 0.0238088 1 0 1 1 0 0 +EDGE2 2351 2331 -0.0978264 0.0580301 -0.0171751 1 0 1 1 0 0 +EDGE2 2351 1511 -0.0572018 -0.0527483 0.000131485 1 0 1 1 0 0 +EDGE2 2351 1512 1.08574 0.0547264 -0.00911074 1 0 1 1 0 0 +EDGE2 2351 1652 0.961683 -0.0505626 0.0242673 1 0 1 1 0 0 +EDGE2 2351 2332 1.03601 0.0226423 0.00206825 1 0 1 1 0 0 +EDGE2 2351 1532 1.02904 -0.0271971 -0.0136221 1 0 1 1 0 0 +EDGE2 2351 1372 1.04326 -0.049315 -0.0138398 1 0 1 1 0 0 +EDGE2 2352 2351 -0.994297 -0.038022 -0.0337396 1 0 1 1 0 0 +EDGE2 2352 1371 -1.04472 -0.00300438 -0.0185998 1 0 1 1 0 0 +EDGE2 2352 1531 -1.02083 0.0401924 0.00376845 1 0 1 1 0 0 +EDGE2 2352 1651 -1.01281 -0.0203028 0.0249092 1 0 1 1 0 0 +EDGE2 2352 2331 -0.90959 0.107879 0.0497347 1 0 1 1 0 0 +EDGE2 2352 1511 -0.908959 0.0380787 -0.0126202 1 0 1 1 0 0 +EDGE2 2352 1512 -0.0920599 0.0350782 -0.00584269 1 0 1 1 0 0 +EDGE2 2352 1652 -0.00812756 0.0479399 -0.0209349 1 0 1 1 0 0 +EDGE2 2352 2332 -0.081667 0.0161778 0.0141186 1 0 1 1 0 0 +EDGE2 2352 1532 0.0890215 0.0163709 0.00927402 1 0 1 1 0 0 +EDGE2 2352 1372 -0.0190124 -0.0243517 -0.0369276 1 0 1 1 0 0 +EDGE2 2352 1513 0.96837 0.0268121 -0.0313454 1 0 1 1 0 0 +EDGE2 2352 1653 1.0341 0.0352891 -0.0486202 1 0 1 1 0 0 +EDGE2 2352 2333 1.01388 0.0627096 -0.0080449 1 0 1 1 0 0 +EDGE2 2352 1533 1.08652 0.0760844 -0.0208374 1 0 1 1 0 0 +EDGE2 2352 1373 1.04796 0.106202 0.0267679 1 0 1 1 0 0 +EDGE2 2353 1512 -0.943023 -0.0809686 -0.0220818 1 0 1 1 0 0 +EDGE2 2353 1652 -1.02768 -0.00445306 0.0337898 1 0 1 1 0 0 +EDGE2 2353 2332 -1.01334 0.0316242 0.0408957 1 0 1 1 0 0 +EDGE2 2353 2352 -1.0051 -0.0128848 0.0219362 1 0 1 1 0 0 +EDGE2 2353 1532 -0.973012 -0.0246021 0.0354441 1 0 1 1 0 0 +EDGE2 2353 1372 -1.03092 0.079698 0.0149177 1 0 1 1 0 0 +EDGE2 2353 1513 -0.0301608 -0.0419909 -0.0179065 1 0 1 1 0 0 +EDGE2 2353 1653 -0.00147731 -0.0125857 -0.00160892 1 0 1 1 0 0 +EDGE2 2353 2333 0.00158818 -0.0774691 0.0218431 1 0 1 1 0 0 +EDGE2 2353 1533 -0.114897 -0.0239543 -0.00840123 1 0 1 1 0 0 +EDGE2 2353 1373 -0.0628211 0.016253 -0.0194247 1 0 1 1 0 0 +EDGE2 2353 1514 0.935157 0.0184012 0.0216955 1 0 1 1 0 0 +EDGE2 2353 1654 0.968692 -0.0498512 -0.0197651 1 0 1 1 0 0 +EDGE2 2353 2334 0.96182 -0.0488 0.00702018 1 0 1 1 0 0 +EDGE2 2353 1534 0.956744 -0.0661707 -0.002728 1 0 1 1 0 0 +EDGE2 2353 1374 1.06901 0.0859252 -0.0368023 1 0 1 1 0 0 +EDGE2 2354 1535 0.980684 -0.0329766 -0.016708 1 0 1 1 0 0 +EDGE2 2354 1513 -1.00373 0.0446702 0.002549 1 0 1 1 0 0 +EDGE2 2354 1653 -0.978148 0.0110126 0.0208103 1 0 1 1 0 0 +EDGE2 2354 2333 -1.06184 0.0135224 0.0196608 1 0 1 1 0 0 +EDGE2 2354 2353 -0.914844 -0.00933781 0.00535877 1 0 1 1 0 0 +EDGE2 2354 1533 -0.953445 0.0289557 0.0244385 1 0 1 1 0 0 +EDGE2 2354 1373 -1.01757 0.0163792 0.00358143 1 0 1 1 0 0 +EDGE2 2354 1514 -0.0196189 0.013184 -0.00289315 1 0 1 1 0 0 +EDGE2 2354 1654 -0.0431429 0.035453 -0.0208168 1 0 1 1 0 0 +EDGE2 2354 2334 0.0237643 0.0209447 -0.00582559 1 0 1 1 0 0 +EDGE2 2354 1534 0.0672453 -0.00923232 -0.0180123 1 0 1 1 0 0 +EDGE2 2354 1374 -0.0423302 0.0250151 0.0121227 1 0 1 1 0 0 +EDGE2 2354 1855 1.02172 0.0234181 -3.13787 1 0 1 1 0 0 +EDGE2 2354 2335 1.0102 -0.00816557 0.00536735 1 0 1 1 0 0 +EDGE2 2354 2315 0.986184 0.0358756 -3.15367 1 0 1 1 0 0 +EDGE2 2354 1595 1.07221 -0.0539862 -3.10548 1 0 1 1 0 0 +EDGE2 2354 1655 1.05213 -0.0355577 0.0321353 1 0 1 1 0 0 +EDGE2 2354 1575 1.05904 0.0833456 -3.12597 1 0 1 1 0 0 +EDGE2 2354 1375 0.908025 -0.0381473 -0.00538319 1 0 1 1 0 0 +EDGE2 2354 1515 0.970318 -0.00830192 -0.00422047 1 0 1 1 0 0 +EDGE2 2355 1656 0.00121251 -1.05228 -1.56651 1 0 1 1 0 0 +EDGE2 2355 1856 -0.0504288 -1.01058 -1.50021 1 0 1 1 0 0 +EDGE2 2355 1536 0.0596521 -0.939897 -1.56884 1 0 1 1 0 0 +EDGE2 2355 1576 -0.0376334 -0.934221 -1.56328 1 0 1 1 0 0 +EDGE2 2355 1376 -0.0232162 -0.982014 -1.56597 1 0 1 1 0 0 +EDGE2 2355 1535 0.0941178 0.0312359 -0.00697012 1 0 1 1 0 0 +EDGE2 2355 1514 -1.09973 -0.035984 0.0191539 1 0 1 1 0 0 +EDGE2 2355 1654 -1.03766 -0.0269744 -0.0447637 1 0 1 1 0 0 +EDGE2 2355 2334 -0.898712 0.0350229 -0.00116185 1 0 1 1 0 0 +EDGE2 2355 2354 -1.06727 0.0750219 -0.00143126 1 0 1 1 0 0 +EDGE2 2355 1534 -1.03931 0.0714202 -0.00180403 1 0 1 1 0 0 +EDGE2 2355 1374 -0.996596 -0.0221779 -0.0200936 1 0 1 1 0 0 +EDGE2 2355 1855 -0.0821804 -0.070284 -3.18499 1 0 1 1 0 0 +EDGE2 2355 2335 0.00647827 -0.0249283 0.000837027 1 0 1 1 0 0 +EDGE2 2355 2315 -0.130747 -0.0972613 -3.10751 1 0 1 1 0 0 +EDGE2 2355 1595 0.0242696 0.0799602 -3.13581 1 0 1 1 0 0 +EDGE2 2355 1655 0.0723331 0.0526111 0.0218399 1 0 1 1 0 0 +EDGE2 2355 1575 -0.0407641 0.0619287 -3.10956 1 0 1 1 0 0 +EDGE2 2355 1854 0.935445 -0.0363754 -3.14816 1 0 1 1 0 0 +EDGE2 2355 1375 0.0663342 0.0202009 0.0216192 1 0 1 1 0 0 +EDGE2 2355 1515 -0.0111357 -0.0292808 0.00290894 1 0 1 1 0 0 +EDGE2 2355 2314 0.92479 -0.0292384 -3.14352 1 0 1 1 0 0 +EDGE2 2355 1574 0.966832 0.0206127 -3.17344 1 0 1 1 0 0 +EDGE2 2355 1594 1.05445 -0.0840552 -3.12313 1 0 1 1 0 0 +EDGE2 2355 2336 0.075271 1.03997 1.55074 1 0 1 1 0 0 +EDGE2 2355 1516 -0.0365071 0.979231 1.59585 1 0 1 1 0 0 +EDGE2 2355 1596 0.0236272 1.01426 1.59194 1 0 1 1 0 0 +EDGE2 2355 2316 0.0571022 1.01794 1.53919 1 0 1 1 0 0 +EDGE2 2356 1535 -1.02297 0.000958336 -1.56369 1 0 1 1 0 0 +EDGE2 2356 1855 -1.06481 -0.0973796 1.57039 1 0 1 1 0 0 +EDGE2 2356 2335 -0.985557 -0.00414002 -1.58336 1 0 1 1 0 0 +EDGE2 2356 2355 -1.03689 -0.0571786 -1.5449 1 0 1 1 0 0 +EDGE2 2356 2315 -1.05224 -0.052582 1.56574 1 0 1 1 0 0 +EDGE2 2356 1595 -0.99433 0.0477855 1.54154 1 0 1 1 0 0 +EDGE2 2356 1655 -0.986498 -0.047731 -1.55394 1 0 1 1 0 0 +EDGE2 2356 1575 -0.963038 0.0665605 1.57805 1 0 1 1 0 0 +EDGE2 2356 1375 -0.983266 -0.0225834 -1.5788 1 0 1 1 0 0 +EDGE2 2356 1515 -0.947828 0.055114 -1.58172 1 0 1 1 0 0 +EDGE2 2356 2336 -0.00288884 -0.0149047 -0.000686926 1 0 1 1 0 0 +EDGE2 2356 1516 -0.0313138 0.0624717 -0.0151754 1 0 1 1 0 0 +EDGE2 2356 1596 0.00696149 -0.0722521 -0.0232396 1 0 1 1 0 0 +EDGE2 2356 2316 -0.0869023 0.00492803 -0.00820589 1 0 1 1 0 0 +EDGE2 2356 2337 1.06429 -0.11848 0.0272349 1 0 1 1 0 0 +EDGE2 2356 1597 0.947781 -0.00354765 -0.0117334 1 0 1 1 0 0 +EDGE2 2356 2317 0.909198 0.0796866 0.00488614 1 0 1 1 0 0 +EDGE2 2356 1517 0.978068 -0.0121529 0.00147984 1 0 1 1 0 0 +EDGE2 2357 2336 -0.995789 -0.0022544 0.0332644 1 0 1 1 0 0 +EDGE2 2357 2356 -0.97315 -0.0518012 0.00815711 1 0 1 1 0 0 +EDGE2 2357 1516 -1.00806 -0.0614451 -0.00793818 1 0 1 1 0 0 +EDGE2 2357 1596 -0.970607 -0.0780168 -0.02568 1 0 1 1 0 0 +EDGE2 2357 2316 -0.908879 -0.0546122 -0.0142166 1 0 1 1 0 0 +EDGE2 2357 2337 0.0097474 -0.0699079 0.014465 1 0 1 1 0 0 +EDGE2 2357 1597 0.0170953 0.0124459 0.00747407 1 0 1 1 0 0 +EDGE2 2357 2317 -0.0190261 0.0144317 -0.0178179 1 0 1 1 0 0 +EDGE2 2357 1517 0.0138938 0.0287162 -0.00779669 1 0 1 1 0 0 +EDGE2 2357 1598 0.98928 -0.00901947 0.00798654 1 0 1 1 0 0 +EDGE2 2357 2338 1.0692 0.092407 0.0175026 1 0 1 1 0 0 +EDGE2 2357 2318 1.04248 0.0282683 0.0262914 1 0 1 1 0 0 +EDGE2 2357 1518 1.05017 0.0231493 0.00737786 1 0 1 1 0 0 +EDGE2 2358 2337 -1.0062 0.0811474 0.0165643 1 0 1 1 0 0 +EDGE2 2358 2357 -1.00638 0.0237627 -0.00466261 1 0 1 1 0 0 +EDGE2 2358 1597 -1.01161 -0.0271081 0.0028726 1 0 1 1 0 0 +EDGE2 2358 2317 -0.932027 0.00752387 -0.0226597 1 0 1 1 0 0 +EDGE2 2358 1517 -0.962084 -0.00896991 -0.0164057 1 0 1 1 0 0 +EDGE2 2358 1598 0.0992266 -0.0526034 0.0219472 1 0 1 1 0 0 +EDGE2 2358 2338 -0.0247971 -0.0159381 -0.00586818 1 0 1 1 0 0 +EDGE2 2358 2318 0.00161264 0.0282281 0.023009 1 0 1 1 0 0 +EDGE2 2358 1518 -0.106561 -0.0858775 0.00585127 1 0 1 1 0 0 +EDGE2 2358 1599 1.00261 -0.0347833 0.0120975 1 0 1 1 0 0 +EDGE2 2358 2319 1.05101 -0.0277259 0.0102474 1 0 1 1 0 0 +EDGE2 2358 2339 1.02606 -0.0301889 -0.0159133 1 0 1 1 0 0 +EDGE2 2358 1519 0.929673 -0.0154968 -0.0142397 1 0 1 1 0 0 +EDGE2 2359 1598 -1.03457 -0.00818857 0.0296809 1 0 1 1 0 0 +EDGE2 2359 2338 -0.976664 -0.00120259 0.047143 1 0 1 1 0 0 +EDGE2 2359 2358 -1.05411 0.068919 -0.00376641 1 0 1 1 0 0 +EDGE2 2359 2318 -0.889288 -0.0317583 -0.00262364 1 0 1 1 0 0 +EDGE2 2359 1518 -1.01866 0.0279128 -0.023906 1 0 1 1 0 0 +EDGE2 2359 1599 -0.0239175 0.0479452 -0.00329053 1 0 1 1 0 0 +EDGE2 2359 2319 0.0205953 -0.04458 -0.00410284 1 0 1 1 0 0 +EDGE2 2359 2339 0.037797 -0.00170414 0.0227867 1 0 1 1 0 0 +EDGE2 2359 1519 0.0568374 0.0396361 -0.00684011 1 0 1 1 0 0 +EDGE2 2359 2340 0.93446 0.00531861 -0.0306833 1 0 1 1 0 0 +EDGE2 2359 1520 1.02088 0.0715912 -0.0279984 1 0 1 1 0 0 +EDGE2 2359 1620 0.957112 0.0347553 -3.13551 1 0 1 1 0 0 +EDGE2 2359 1640 1.03144 0.00670615 -3.13466 1 0 1 1 0 0 +EDGE2 2359 2320 0.838629 0.0195448 -0.0077181 1 0 1 1 0 0 +EDGE2 2359 1600 0.930161 0.0286983 0.0179035 1 0 1 1 0 0 +EDGE2 2359 1320 1.01494 -0.00553162 -3.16403 1 0 1 1 0 0 +EDGE2 2360 2359 -0.975033 0.0421254 0.0121198 1 0 1 1 0 0 +EDGE2 2360 1599 -0.955133 0.0505189 0.0117976 1 0 1 1 0 0 +EDGE2 2360 2319 -0.986234 -0.0493817 0.00409482 1 0 1 1 0 0 +EDGE2 2360 2339 -0.996152 -0.0268007 0.0178249 1 0 1 1 0 0 +EDGE2 2360 1519 -1.08995 0.0593834 0.00486757 1 0 1 1 0 0 +EDGE2 2360 2340 0.000705517 0.0487214 -0.0012314 1 0 1 1 0 0 +EDGE2 2360 2341 0.0749391 1.0307 1.57261 1 0 1 1 0 0 +EDGE2 2360 1521 0.037626 1.02072 1.57793 1 0 1 1 0 0 +EDGE2 2360 1641 0.0296464 0.975972 1.54368 1 0 1 1 0 0 +EDGE2 2360 2321 -0.00366829 0.992231 1.56062 1 0 1 1 0 0 +EDGE2 2360 1321 -0.0350231 1.00898 1.59951 1 0 1 1 0 0 +EDGE2 2360 1520 -0.0303004 0.00364921 0.00586986 1 0 1 1 0 0 +EDGE2 2360 1620 0.104481 0.00919635 -3.17843 1 0 1 1 0 0 +EDGE2 2360 1640 0.00373789 0.094318 -3.14692 1 0 1 1 0 0 +EDGE2 2360 2320 0.02668 0.0290858 0.0209885 1 0 1 1 0 0 +EDGE2 2360 1600 0.01418 0.0474975 0.0122978 1 0 1 1 0 0 +EDGE2 2360 1621 -0.0667934 -0.999262 -1.59319 1 0 1 1 0 0 +EDGE2 2360 1320 0.0138543 -0.0661195 -3.11824 1 0 1 1 0 0 +EDGE2 2360 1601 -0.0459138 -1.05547 -1.56526 1 0 1 1 0 0 +EDGE2 2360 1619 0.9877 0.116926 -3.15303 1 0 1 1 0 0 +EDGE2 2360 1639 0.991627 0.0364139 -3.15079 1 0 1 1 0 0 +EDGE2 2360 1319 0.993012 -0.0470136 -3.12906 1 0 1 1 0 0 +EDGE2 2361 2340 -1.06701 -0.0161207 -1.58213 1 0 1 1 0 0 +EDGE2 2361 2341 -0.0291331 -0.0062104 0.034501 1 0 1 1 0 0 +EDGE2 2361 1322 0.927245 0.00217121 -0.0251799 1 0 1 1 0 0 +EDGE2 2361 1642 1.01027 -0.0964976 -0.00954934 1 0 1 1 0 0 +EDGE2 2361 2322 0.982058 -0.0514302 -0.00165495 1 0 1 1 0 0 +EDGE2 2361 2342 1.07228 0.122704 -0.00754256 1 0 1 1 0 0 +EDGE2 2361 1522 0.984006 -0.0311713 -0.00621639 1 0 1 1 0 0 +EDGE2 2361 1521 -0.0349308 0.0609055 0.0228142 1 0 1 1 0 0 +EDGE2 2361 1641 0.0230547 -0.0314275 0.000701293 1 0 1 1 0 0 +EDGE2 2361 2321 -0.0159228 0.0333421 -0.00730226 1 0 1 1 0 0 +EDGE2 2361 1321 0.0393063 -0.0239221 0.024378 1 0 1 1 0 0 +EDGE2 2361 2360 -0.966589 0.0177875 -1.57289 1 0 1 1 0 0 +EDGE2 2361 1520 -1.08071 -0.0272928 -1.53685 1 0 1 1 0 0 +EDGE2 2361 1620 -1.03487 -0.0242144 1.56632 1 0 1 1 0 0 +EDGE2 2361 1640 -1.12036 -0.0332013 1.56812 1 0 1 1 0 0 +EDGE2 2361 2320 -0.953921 0.00931171 -1.60665 1 0 1 1 0 0 +EDGE2 2361 1600 -0.991498 0.0164543 -1.60152 1 0 1 1 0 0 +EDGE2 2361 1320 -0.968877 -0.0645445 1.55823 1 0 1 1 0 0 +EDGE2 2362 1323 0.983513 -0.00729631 0.0216849 1 0 1 1 0 0 +EDGE2 2362 1643 1.02214 0.0187303 0.0139073 1 0 1 1 0 0 +EDGE2 2362 2323 1.03786 0.0455361 0.00925684 1 0 1 1 0 0 +EDGE2 2362 2343 1.01428 -0.00659485 0.0190545 1 0 1 1 0 0 +EDGE2 2362 1523 0.983937 0.0187377 0.00686595 1 0 1 1 0 0 +EDGE2 2362 2341 -1.07057 0.0189407 -0.0140982 1 0 1 1 0 0 +EDGE2 2362 1322 0.0300752 -0.0141122 0.0236799 1 0 1 1 0 0 +EDGE2 2362 1642 0.0294113 -0.0475481 0.0198334 1 0 1 1 0 0 +EDGE2 2362 2322 -0.109315 -0.0575546 0.00211494 1 0 1 1 0 0 +EDGE2 2362 2342 -0.0755024 -0.0061069 0.00311514 1 0 1 1 0 0 +EDGE2 2362 1522 0.022944 0.0107856 0.00522323 1 0 1 1 0 0 +EDGE2 2362 2361 -1.04529 0.0722098 -0.0318068 1 0 1 1 0 0 +EDGE2 2362 1521 -1.01279 0.0241865 0.0170191 1 0 1 1 0 0 +EDGE2 2362 1641 -0.941395 -0.0627208 0.0501962 1 0 1 1 0 0 +EDGE2 2362 2321 -0.997171 -0.080985 0.0411295 1 0 1 1 0 0 +EDGE2 2362 1321 -1.09035 0.085428 0.0157571 1 0 1 1 0 0 +EDGE2 2363 2362 -1.03773 0.0051291 -0.00492387 1 0 1 1 0 0 +EDGE2 2363 1524 1.03282 -0.0667968 0.0026397 1 0 1 1 0 0 +EDGE2 2363 2324 0.930518 -0.113744 -0.00510176 1 0 1 1 0 0 +EDGE2 2363 2344 1.06336 -0.0197662 0.00667574 1 0 1 1 0 0 +EDGE2 2363 1644 1.04418 0.0657673 0.0193235 1 0 1 1 0 0 +EDGE2 2363 1324 0.973412 0.0294277 -0.0129445 1 0 1 1 0 0 +EDGE2 2363 1323 0.058593 -0.0163061 0.0243003 1 0 1 1 0 0 +EDGE2 2363 1643 -0.0215389 -0.0262668 0.000769844 1 0 1 1 0 0 +EDGE2 2363 2323 0.0331641 -0.01424 0.00408845 1 0 1 1 0 0 +EDGE2 2363 2343 0.0211387 -0.055759 0.0249903 1 0 1 1 0 0 +EDGE2 2363 1523 -0.04014 -0.0821157 0.0223761 1 0 1 1 0 0 +EDGE2 2363 1322 -1.03351 0.0767593 0.00263055 1 0 1 1 0 0 +EDGE2 2363 1642 -1.08257 0.0356939 -0.0215119 1 0 1 1 0 0 +EDGE2 2363 2322 -0.962963 0.100419 0.00213639 1 0 1 1 0 0 +EDGE2 2363 2342 -0.987711 -0.0240691 -0.00845852 1 0 1 1 0 0 +EDGE2 2363 1522 -0.968051 0.0029591 0.00746454 1 0 1 1 0 0 +EDGE2 2364 1345 1.04252 0.0674004 -3.16673 1 0 1 1 0 0 +EDGE2 2364 2345 0.966562 0.0287715 0.0173616 1 0 1 1 0 0 +EDGE2 2364 1525 0.925932 0.0365541 -0.00982304 1 0 1 1 0 0 +EDGE2 2364 1905 0.996358 0.00332069 -3.11116 1 0 1 1 0 0 +EDGE2 2364 1925 1.02454 -0.0749792 -3.11307 1 0 1 1 0 0 +EDGE2 2364 2325 1.02474 0.0536128 -0.035214 1 0 1 1 0 0 +EDGE2 2364 1645 0.981985 0.00798523 0.0119766 1 0 1 1 0 0 +EDGE2 2364 1485 0.99383 0.0471049 -3.15817 1 0 1 1 0 0 +EDGE2 2364 1505 1.02014 -0.0580081 -3.17383 1 0 1 1 0 0 +EDGE2 2364 1365 1.07705 0.00170568 -3.14553 1 0 1 1 0 0 +EDGE2 2364 1325 0.957249 0.0366433 -0.0247724 1 0 1 1 0 0 +EDGE2 2364 2363 -0.976762 -0.0340733 0.000826526 1 0 1 1 0 0 +EDGE2 2364 1524 0.00184582 -0.0199428 0.00228319 1 0 1 1 0 0 +EDGE2 2364 2324 -0.0773584 -0.0173777 -0.0336605 1 0 1 1 0 0 +EDGE2 2364 2344 -0.000824809 -0.0139473 -0.00508765 1 0 1 1 0 0 +EDGE2 2364 1644 0.0530387 -0.0400245 -0.00536217 1 0 1 1 0 0 +EDGE2 2364 1324 0.000557784 -0.00623088 -0.01792 1 0 1 1 0 0 +EDGE2 2364 1323 -1.04185 -0.0204997 0.000202699 1 0 1 1 0 0 +EDGE2 2364 1643 -0.99836 -0.093288 0.0203935 1 0 1 1 0 0 +EDGE2 2364 2323 -1.0357 -0.0395749 0.0203349 1 0 1 1 0 0 +EDGE2 2364 2343 -1.07315 -0.0239737 -0.0253996 1 0 1 1 0 0 +EDGE2 2364 1523 -1.03421 0.0251952 -0.0182473 1 0 1 1 0 0 +EDGE2 2365 1345 0.114942 0.129832 -3.09822 1 0 1 1 0 0 +EDGE2 2365 1526 0.042614 1.11441 1.55761 1 0 1 1 0 0 +EDGE2 2365 1926 -0.0638654 0.952974 1.58723 1 0 1 1 0 0 +EDGE2 2365 2326 -0.0059713 1.00979 1.56644 1 0 1 1 0 0 +EDGE2 2365 2346 0.0498625 0.972388 1.57342 1 0 1 1 0 0 +EDGE2 2365 1646 0.0254052 1.00278 1.57618 1 0 1 1 0 0 +EDGE2 2365 1366 0.0248356 0.986036 1.56812 1 0 1 1 0 0 +EDGE2 2365 1506 -0.0307989 1.06171 1.55339 1 0 1 1 0 0 +EDGE2 2365 1924 1.1297 0.0111048 -3.15514 1 0 1 1 0 0 +EDGE2 2365 2345 0.0334391 -0.00904063 0.0246872 1 0 1 1 0 0 +EDGE2 2365 1344 1.04123 0.00299953 -3.16828 1 0 1 1 0 0 +EDGE2 2365 1484 1.06744 -0.0243192 -3.14087 1 0 1 1 0 0 +EDGE2 2365 1504 1.03495 -0.0212726 -3.13904 1 0 1 1 0 0 +EDGE2 2365 1904 1.02671 -0.0283437 -3.14613 1 0 1 1 0 0 +EDGE2 2365 1364 1.0166 -0.043249 -3.15265 1 0 1 1 0 0 +EDGE2 2365 1525 -0.083936 -0.0320183 0.0234542 1 0 1 1 0 0 +EDGE2 2365 1905 -0.0210981 0.0862897 -3.14768 1 0 1 1 0 0 +EDGE2 2365 1925 0.0674745 0.018071 -3.16666 1 0 1 1 0 0 +EDGE2 2365 2325 -0.125498 -0.0488184 0.00343893 1 0 1 1 0 0 +EDGE2 2365 1645 0.00893464 0.0171793 0.00900349 1 0 1 1 0 0 +EDGE2 2365 1485 0.000751843 0.00970778 -3.14948 1 0 1 1 0 0 +EDGE2 2365 1505 0.0355513 0.110788 -3.17032 1 0 1 1 0 0 +EDGE2 2365 1365 -0.049308 0.069884 -3.14998 1 0 1 1 0 0 +EDGE2 2365 1325 -0.061593 0.014882 -0.0110414 1 0 1 1 0 0 +EDGE2 2365 1524 -1.06653 0.0062178 -0.00422881 1 0 1 1 0 0 +EDGE2 2365 2324 -1.0085 -0.0270343 -0.0174786 1 0 1 1 0 0 +EDGE2 2365 2344 -1.01454 -0.00646446 -0.0376203 1 0 1 1 0 0 +EDGE2 2365 2364 -0.982618 -0.00757604 -0.0145685 1 0 1 1 0 0 +EDGE2 2365 1644 -0.972793 0.0482775 -0.0260529 1 0 1 1 0 0 +EDGE2 2365 1324 -0.989828 -0.0191355 0.0149836 1 0 1 1 0 0 +EDGE2 2365 1486 -0.00964685 -1.06772 -1.57367 1 0 1 1 0 0 +EDGE2 2365 1906 -0.0459064 -1.05447 -1.5834 1 0 1 1 0 0 +EDGE2 2365 1326 -0.032974 -0.992135 -1.54964 1 0 1 1 0 0 +EDGE2 2365 1346 0.0609728 -0.945296 -1.59018 1 0 1 1 0 0 +EDGE2 2366 2327 1.02782 -0.0376064 0.00679726 1 0 1 1 0 0 +EDGE2 2366 2347 1.02693 0.0932982 0.0092537 1 0 1 1 0 0 +EDGE2 2366 1345 -1.02824 0.115036 1.56239 1 0 1 1 0 0 +EDGE2 2366 1526 0.0061565 0.016377 -0.0117797 1 0 1 1 0 0 +EDGE2 2366 1507 1.00546 -0.0378656 0.00606565 1 0 1 1 0 0 +EDGE2 2366 1527 1.0365 -0.0249533 0.0174248 1 0 1 1 0 0 +EDGE2 2366 1647 1.05529 -0.0602007 -0.00472264 1 0 1 1 0 0 +EDGE2 2366 1927 0.984495 0.0671996 0.0177186 1 0 1 1 0 0 +EDGE2 2366 1367 0.979224 0.0182125 0.0110974 1 0 1 1 0 0 +EDGE2 2366 1926 0.0276203 0.025605 0.00131745 1 0 1 1 0 0 +EDGE2 2366 2326 0.0098411 0.0253462 -0.036887 1 0 1 1 0 0 +EDGE2 2366 2346 0.00457375 -0.0265882 -0.00665926 1 0 1 1 0 0 +EDGE2 2366 1646 0.00318477 -0.0322762 -0.0180245 1 0 1 1 0 0 +EDGE2 2366 1366 0.00933086 0.0252172 -0.00417571 1 0 1 1 0 0 +EDGE2 2366 1506 -0.011287 -0.0131216 -0.0128846 1 0 1 1 0 0 +EDGE2 2366 2345 -1.04455 0.0101332 -1.59953 1 0 1 1 0 0 +EDGE2 2366 2365 -0.983033 -0.0811804 -1.59494 1 0 1 1 0 0 +EDGE2 2366 1525 -1.10442 0.0189178 -1.61681 1 0 1 1 0 0 +EDGE2 2366 1905 -0.990965 -0.0919576 1.57424 1 0 1 1 0 0 +EDGE2 2366 1925 -1.09431 -0.0785735 1.60471 1 0 1 1 0 0 +EDGE2 2366 2325 -0.897002 -0.0266413 -1.5679 1 0 1 1 0 0 +EDGE2 2366 1645 -1.07372 0.00208186 -1.54603 1 0 1 1 0 0 +EDGE2 2366 1485 -0.929617 0.0382432 1.59966 1 0 1 1 0 0 +EDGE2 2366 1505 -0.890714 0.0758377 1.59376 1 0 1 1 0 0 +EDGE2 2366 1365 -1.06007 -0.0131166 1.5798 1 0 1 1 0 0 +EDGE2 2366 1325 -1.07583 0.0225257 -1.53981 1 0 1 1 0 0 +EDGE2 2367 2327 0.0297256 -0.0597085 -0.0277869 1 0 1 1 0 0 +EDGE2 2367 1648 0.980436 -0.0175052 -0.0442635 1 0 1 1 0 0 +EDGE2 2367 1928 1.07995 0.00545068 0.00148162 1 0 1 1 0 0 +EDGE2 2367 2328 0.978142 -0.0056107 0.0110015 1 0 1 1 0 0 +EDGE2 2367 2348 1.01578 0.00859585 0.00971666 1 0 1 1 0 0 +EDGE2 2367 1368 1.00768 0.00546226 0.00740903 1 0 1 1 0 0 +EDGE2 2367 1508 1.03722 0.074327 -0.00684381 1 0 1 1 0 0 +EDGE2 2367 1528 1.02797 -0.0599163 -0.0352493 1 0 1 1 0 0 +EDGE2 2367 2347 -0.0359403 -0.0189914 -0.0256537 1 0 1 1 0 0 +EDGE2 2367 1526 -1.05933 -0.0527264 -0.0378333 1 0 1 1 0 0 +EDGE2 2367 1507 0.0163573 0.029164 0.0303487 1 0 1 1 0 0 +EDGE2 2367 1527 0.0767499 -0.0279343 -0.0427188 1 0 1 1 0 0 +EDGE2 2367 1647 -0.0118597 -0.0669387 0.0184903 1 0 1 1 0 0 +EDGE2 2367 1927 0.0173748 0.022393 0.0147436 1 0 1 1 0 0 +EDGE2 2367 2366 -0.9344 -0.0272444 -0.0342659 1 0 1 1 0 0 +EDGE2 2367 1367 -0.017476 -0.103548 0.00898542 1 0 1 1 0 0 +EDGE2 2367 1926 -0.953726 0.0151045 0.0222981 1 0 1 1 0 0 +EDGE2 2367 2326 -1.11957 -0.0575145 0.0066669 1 0 1 1 0 0 +EDGE2 2367 2346 -1.00421 -0.014811 -0.0299584 1 0 1 1 0 0 +EDGE2 2367 1646 -0.971635 -0.0410338 0.0197678 1 0 1 1 0 0 +EDGE2 2367 1366 -0.963437 -0.066115 -0.004566 1 0 1 1 0 0 +EDGE2 2367 1506 -1.04214 0.0205405 0.0301999 1 0 1 1 0 0 +EDGE2 2368 2327 -0.960747 -0.00319232 -0.0125201 1 0 1 1 0 0 +EDGE2 2368 2349 0.92029 0.0427402 0.00357142 1 0 1 1 0 0 +EDGE2 2368 1509 0.977926 0.0249099 0.0200725 1 0 1 1 0 0 +EDGE2 2368 1649 1.00382 -0.0761222 0.00442991 1 0 1 1 0 0 +EDGE2 2368 1929 1.05961 -0.074313 0.00947247 1 0 1 1 0 0 +EDGE2 2368 2329 0.947308 -0.145152 0.0249499 1 0 1 1 0 0 +EDGE2 2368 1529 1.0377 -0.0598074 -0.0224977 1 0 1 1 0 0 +EDGE2 2368 1369 0.970579 -0.100353 -0.0127021 1 0 1 1 0 0 +EDGE2 2368 1648 0.0857169 0.0406641 -0.0127918 1 0 1 1 0 0 +EDGE2 2368 1928 -0.0237481 0.00545918 0.0235001 1 0 1 1 0 0 +EDGE2 2368 2328 -0.0289532 0.0311895 -0.0232209 1 0 1 1 0 0 +EDGE2 2368 2348 -0.0564515 -0.00340367 -0.0280031 1 0 1 1 0 0 +EDGE2 2368 1368 -0.0111263 0.012284 0.026959 1 0 1 1 0 0 +EDGE2 2368 1508 0.0294481 0.0802211 0.0113867 1 0 1 1 0 0 +EDGE2 2368 1528 0.0582826 -0.172723 0.00612343 1 0 1 1 0 0 +EDGE2 2368 2367 -0.989865 0.11027 0.00252764 1 0 1 1 0 0 +EDGE2 2368 2347 -0.947354 -0.034158 0.0151236 1 0 1 1 0 0 +EDGE2 2368 1507 -0.928575 0.0560431 0.0192337 1 0 1 1 0 0 +EDGE2 2368 1527 -0.980857 0.0102852 -0.0032298 1 0 1 1 0 0 +EDGE2 2368 1647 -1.01273 -0.0460968 -0.0442736 1 0 1 1 0 0 +EDGE2 2368 1927 -0.929412 -0.0129313 0.0156534 1 0 1 1 0 0 +EDGE2 2368 1367 -1.03096 -0.0334772 -0.0200317 1 0 1 1 0 0 +EDGE2 2369 2330 1.05731 0.0549712 0.00336664 1 0 1 1 0 0 +EDGE2 2369 2350 0.96696 0.0303445 -0.00561736 1 0 1 1 0 0 +EDGE2 2369 1650 0.992409 -0.0167298 -0.00545877 1 0 1 1 0 0 +EDGE2 2369 1710 1.01806 -0.0169517 -3.11291 1 0 1 1 0 0 +EDGE2 2369 1870 1.07383 0.0272088 -3.14721 1 0 1 1 0 0 +EDGE2 2369 1930 0.981136 -0.0704442 -0.00463429 1 0 1 1 0 0 +EDGE2 2369 1670 1.05904 -0.00268904 -3.11801 1 0 1 1 0 0 +EDGE2 2369 1470 1.04482 0.0858386 -3.17083 1 0 1 1 0 0 +EDGE2 2369 1510 1.0254 -0.00498243 0.00115968 1 0 1 1 0 0 +EDGE2 2369 1530 0.888474 0.0409477 0.0290751 1 0 1 1 0 0 +EDGE2 2369 1370 1.04085 -0.0250699 -0.0164745 1 0 1 1 0 0 +EDGE2 2369 2368 -1.00042 -0.0767672 0.0239455 1 0 1 1 0 0 +EDGE2 2369 2349 0.0834798 -0.0292128 0.0287083 1 0 1 1 0 0 +EDGE2 2369 1509 0.0184299 0.018325 0.00913636 1 0 1 1 0 0 +EDGE2 2369 1649 0.0336043 0.0783117 0.0122426 1 0 1 1 0 0 +EDGE2 2369 1929 -0.0130981 -0.00971509 0.0205297 1 0 1 1 0 0 +EDGE2 2369 2329 -0.0701436 -0.0398587 -0.0166578 1 0 1 1 0 0 +EDGE2 2369 1529 -0.0406855 -0.0383969 0.0191699 1 0 1 1 0 0 +EDGE2 2369 1369 -0.00125 0.0557154 -0.00792382 1 0 1 1 0 0 +EDGE2 2369 1648 -0.880847 -0.0428381 -0.0395011 1 0 1 1 0 0 +EDGE2 2369 1928 -1.1203 0.0406844 -0.0124161 1 0 1 1 0 0 +EDGE2 2369 2328 -0.888241 0.00878633 -0.0073282 1 0 1 1 0 0 +EDGE2 2369 2348 -1.00692 0.07598 -0.0278681 1 0 1 1 0 0 +EDGE2 2369 1368 -1.00876 -0.0394399 0.00321385 1 0 1 1 0 0 +EDGE2 2369 1508 -1.03108 0.120153 0.0335168 1 0 1 1 0 0 +EDGE2 2369 1528 -0.875329 0.0373993 -0.0261994 1 0 1 1 0 0 +EDGE2 2370 1931 -0.00450511 -0.987491 -1.58298 1 0 1 1 0 0 +EDGE2 2370 1669 0.942209 0.0736852 -3.16372 1 0 1 1 0 0 +EDGE2 2370 1709 0.851899 0.0156411 -3.14628 1 0 1 1 0 0 +EDGE2 2370 1869 0.969937 0.0449557 -3.10785 1 0 1 1 0 0 +EDGE2 2370 1469 0.977225 -0.0297321 -3.14195 1 0 1 1 0 0 +EDGE2 2370 2330 -0.047651 -0.0177726 -0.00437119 1 0 1 1 0 0 +EDGE2 2370 1671 0.0165642 -1.0108 -1.56659 1 0 1 1 0 0 +EDGE2 2370 1711 -0.0239837 -0.957137 -1.58502 1 0 1 1 0 0 +EDGE2 2370 1871 0.0508808 -1.02345 -1.572 1 0 1 1 0 0 +EDGE2 2370 1471 -0.0456031 -0.979106 -1.56409 1 0 1 1 0 0 +EDGE2 2370 2350 -0.0154184 -0.00881735 0.0104921 1 0 1 1 0 0 +EDGE2 2370 1650 -0.0488379 -0.0193531 -0.0182845 1 0 1 1 0 0 +EDGE2 2370 1710 0.0153937 -0.0206477 -3.13829 1 0 1 1 0 0 +EDGE2 2370 1870 -0.0246639 0.0138674 -3.13271 1 0 1 1 0 0 +EDGE2 2370 1930 0.00661179 -0.0445279 0.0148274 1 0 1 1 0 0 +EDGE2 2370 1670 -0.0838774 -0.0553978 -3.15509 1 0 1 1 0 0 +EDGE2 2370 1470 0.0809731 0.0298821 -3.12819 1 0 1 1 0 0 +EDGE2 2370 1510 -0.0308581 -0.0351147 0.00737871 1 0 1 1 0 0 +EDGE2 2370 1530 0.116507 0.0118051 0.014333 1 0 1 1 0 0 +EDGE2 2370 1370 0.0462222 0.0219774 0.0164417 1 0 1 1 0 0 +EDGE2 2370 2351 0.0439636 0.986569 1.57956 1 0 1 1 0 0 +EDGE2 2370 1371 -0.0733425 0.927232 1.59748 1 0 1 1 0 0 +EDGE2 2370 1531 0.0916152 1.00101 1.5707 1 0 1 1 0 0 +EDGE2 2370 1651 0.0489835 0.999039 1.57875 1 0 1 1 0 0 +EDGE2 2370 2331 0.0187923 1.03358 1.60093 1 0 1 1 0 0 +EDGE2 2370 1511 -0.0522771 0.989589 1.55419 1 0 1 1 0 0 +EDGE2 2370 2349 -0.928608 -0.0190539 0.0204268 1 0 1 1 0 0 +EDGE2 2370 2369 -1.01576 0.0617763 -0.0228985 1 0 1 1 0 0 +EDGE2 2370 1509 -1.02095 -0.044762 -0.00587869 1 0 1 1 0 0 +EDGE2 2370 1649 -0.935713 0.0397592 0.0244563 1 0 1 1 0 0 +EDGE2 2370 1929 -0.945728 -0.0253168 0.0587976 1 0 1 1 0 0 +EDGE2 2370 2329 -1.05682 -0.0131869 -0.000533478 1 0 1 1 0 0 +EDGE2 2370 1529 -0.909858 0.0224391 -0.0206072 1 0 1 1 0 0 +EDGE2 2370 1369 -0.947759 0.0402984 0.00311078 1 0 1 1 0 0 +EDGE2 2371 2330 -1.02961 0.0367522 -1.56413 1 0 1 1 0 0 +EDGE2 2371 2370 -0.989095 -0.118626 -1.58429 1 0 1 1 0 0 +EDGE2 2371 2350 -1.09698 -0.00506869 -1.57151 1 0 1 1 0 0 +EDGE2 2371 1650 -0.98792 0.0175551 -1.56628 1 0 1 1 0 0 +EDGE2 2371 1710 -1.026 -0.0715343 1.59552 1 0 1 1 0 0 +EDGE2 2371 1870 -1.12729 0.0457374 1.59301 1 0 1 1 0 0 +EDGE2 2371 1930 -0.915127 0.0607396 -1.55968 1 0 1 1 0 0 +EDGE2 2371 1670 -0.947279 -0.00212294 1.56055 1 0 1 1 0 0 +EDGE2 2371 1470 -1.04668 -0.0156034 1.58649 1 0 1 1 0 0 +EDGE2 2371 1510 -1.04949 -0.00468756 -1.59329 1 0 1 1 0 0 +EDGE2 2371 1530 -0.976622 -0.0186945 -1.58486 1 0 1 1 0 0 +EDGE2 2371 1370 -0.98116 -0.0145141 -1.55765 1 0 1 1 0 0 +EDGE2 2371 2351 -0.069648 0.0829461 0.00835277 1 0 1 1 0 0 +EDGE2 2371 1371 0.000643404 -0.052732 0.015665 1 0 1 1 0 0 +EDGE2 2371 1531 -0.0130277 0.0520402 -0.00352872 1 0 1 1 0 0 +EDGE2 2371 1651 0.0164396 -0.00736319 0.0516024 1 0 1 1 0 0 +EDGE2 2371 2331 0.0779126 0.0271947 -0.000465005 1 0 1 1 0 0 +EDGE2 2371 1511 0.0417577 -0.0574156 -0.00419058 1 0 1 1 0 0 +EDGE2 2371 1512 0.984089 0.0536457 -0.00585102 1 0 1 1 0 0 +EDGE2 2371 1652 1.11592 0.0509049 -0.0126642 1 0 1 1 0 0 +EDGE2 2371 2332 0.973691 0.0386696 -0.00063196 1 0 1 1 0 0 +EDGE2 2371 2352 0.940394 0.0317378 -0.00501484 1 0 1 1 0 0 +EDGE2 2371 1532 1.07982 -0.00192017 -0.00106921 1 0 1 1 0 0 +EDGE2 2371 1372 0.986032 0.106191 0.0199622 1 0 1 1 0 0 +EDGE2 2372 2351 -1.04669 0.0284106 -0.00882605 1 0 1 1 0 0 +EDGE2 2372 2371 -1.07669 -0.0365208 0.00283105 1 0 1 1 0 0 +EDGE2 2372 1371 -0.923133 0.0188055 -0.0283065 1 0 1 1 0 0 +EDGE2 2372 1531 -0.941631 -0.0297138 -0.0252098 1 0 1 1 0 0 +EDGE2 2372 1651 -1.04446 0.020784 0.0150664 1 0 1 1 0 0 +EDGE2 2372 2331 -0.989842 0.0475617 -0.014389 1 0 1 1 0 0 +EDGE2 2372 1511 -1.00547 -0.0869307 0.0196679 1 0 1 1 0 0 +EDGE2 2372 1512 0.0113523 -0.0127015 0.00389609 1 0 1 1 0 0 +EDGE2 2372 1652 -0.00946342 -0.036482 -0.00419451 1 0 1 1 0 0 +EDGE2 2372 2332 0.0219142 -0.0381476 -0.0113241 1 0 1 1 0 0 +EDGE2 2372 2352 -0.0360868 -0.00837544 0.00310144 1 0 1 1 0 0 +EDGE2 2372 1532 0.0189627 0.0616967 -0.04349 1 0 1 1 0 0 +EDGE2 2372 1372 0.00562751 0.111733 -0.00160547 1 0 1 1 0 0 +EDGE2 2372 1513 0.992286 0.00892053 -0.00865527 1 0 1 1 0 0 +EDGE2 2372 1653 0.976246 -0.0500945 0.0280845 1 0 1 1 0 0 +EDGE2 2372 2333 0.986134 0.0107461 0.0292186 1 0 1 1 0 0 +EDGE2 2372 2353 1.05636 0.0840043 0.0241481 1 0 1 1 0 0 +EDGE2 2372 1533 0.953769 0.0608139 0.00263066 1 0 1 1 0 0 +EDGE2 2372 1373 0.985463 -0.0918392 -0.0205899 1 0 1 1 0 0 +EDGE2 2373 2372 -0.979145 -0.0209819 0.000531799 1 0 1 1 0 0 +EDGE2 2373 1512 -1.06676 -0.0193625 -0.0160591 1 0 1 1 0 0 +EDGE2 2373 1652 -0.997544 0.00504918 -0.0260103 1 0 1 1 0 0 +EDGE2 2373 2332 -0.941775 -0.00798676 0.00518478 1 0 1 1 0 0 +EDGE2 2373 2352 -1.09336 0.0417426 0.0196771 1 0 1 1 0 0 +EDGE2 2373 1532 -1.00702 0.0090766 -0.00205743 1 0 1 1 0 0 +EDGE2 2373 1372 -1.0208 0.061133 0.0192046 1 0 1 1 0 0 +EDGE2 2373 1513 -0.0136909 0.0281742 0.0288162 1 0 1 1 0 0 +EDGE2 2373 1653 0.0136119 -0.0296658 -0.0103374 1 0 1 1 0 0 +EDGE2 2373 2333 -0.00205052 0.00115064 0.00896431 1 0 1 1 0 0 +EDGE2 2373 2353 -0.0278721 -0.0515494 -0.00738004 1 0 1 1 0 0 +EDGE2 2373 1533 0.035249 0.0247409 -0.0143494 1 0 1 1 0 0 +EDGE2 2373 1373 0.0336044 0.0805898 0.0228673 1 0 1 1 0 0 +EDGE2 2373 1514 0.94724 -0.0182076 0.0198373 1 0 1 1 0 0 +EDGE2 2373 1654 0.999532 -0.0238794 0.0381061 1 0 1 1 0 0 +EDGE2 2373 2334 1.00047 0.0437425 0.003726 1 0 1 1 0 0 +EDGE2 2373 2354 0.993297 0.0145614 -0.0018059 1 0 1 1 0 0 +EDGE2 2373 1534 0.939613 -0.0313374 0.0167074 1 0 1 1 0 0 +EDGE2 2373 1374 1.02836 -0.025327 0.00147074 1 0 1 1 0 0 +EDGE2 2374 1535 0.94976 -0.0194067 0.0304826 1 0 1 1 0 0 +EDGE2 2374 2373 -0.974969 0.0343653 0.030335 1 0 1 1 0 0 +EDGE2 2374 1513 -0.963028 -0.0654295 0.006982 1 0 1 1 0 0 +EDGE2 2374 1653 -0.981856 0.058487 0.00759129 1 0 1 1 0 0 +EDGE2 2374 2333 -0.977956 -0.0704319 0.000209918 1 0 1 1 0 0 +EDGE2 2374 2353 -1.02727 -0.0231595 0.00589235 1 0 1 1 0 0 +EDGE2 2374 1533 -0.920393 0.0524272 0.0270403 1 0 1 1 0 0 +EDGE2 2374 1373 -1.025 0.083314 -0.00863096 1 0 1 1 0 0 +EDGE2 2374 1514 0.0131688 0.013225 -0.00949885 1 0 1 1 0 0 +EDGE2 2374 1654 -0.0701167 0.025165 -0.00553503 1 0 1 1 0 0 +EDGE2 2374 2334 -0.0158021 0.0748873 0.0273846 1 0 1 1 0 0 +EDGE2 2374 2354 0.0492621 -0.0244272 0.0110614 1 0 1 1 0 0 +EDGE2 2374 1534 -0.0416667 0.0222152 0.00441179 1 0 1 1 0 0 +EDGE2 2374 1374 -0.0487068 0.00254653 0.0105551 1 0 1 1 0 0 +EDGE2 2374 1855 1.0216 0.0590445 -3.15895 1 0 1 1 0 0 +EDGE2 2374 2335 1.04488 -0.090181 0.0130989 1 0 1 1 0 0 +EDGE2 2374 2355 0.960111 -0.0725648 -0.0144669 1 0 1 1 0 0 +EDGE2 2374 2315 1.02929 -0.047906 -3.13114 1 0 1 1 0 0 +EDGE2 2374 1595 1.01759 0.0511768 -3.13216 1 0 1 1 0 0 +EDGE2 2374 1655 0.91916 -0.0122974 -0.0252157 1 0 1 1 0 0 +EDGE2 2374 1575 0.993183 0.035684 -3.15729 1 0 1 1 0 0 +EDGE2 2374 1375 0.982606 -0.0207742 -0.0122376 1 0 1 1 0 0 +EDGE2 2374 1515 0.996105 -0.0715753 0.0317736 1 0 1 1 0 0 +EDGE2 2375 1656 0.0370193 -0.955726 -1.57496 1 0 1 1 0 0 +EDGE2 2375 1856 0.0362859 -0.951656 -1.56894 1 0 1 1 0 0 +EDGE2 2375 1536 0.0546335 -0.952612 -1.63388 1 0 1 1 0 0 +EDGE2 2375 1576 -0.0302808 -1.01585 -1.59234 1 0 1 1 0 0 +EDGE2 2375 1376 0.039411 -0.961876 -1.57193 1 0 1 1 0 0 +EDGE2 2375 1535 0.0151161 -0.0937992 0.0276862 1 0 1 1 0 0 +EDGE2 2375 2374 -0.957417 0.0446119 0.00585935 1 0 1 1 0 0 +EDGE2 2375 1514 -0.938051 -0.0124205 0.0177189 1 0 1 1 0 0 +EDGE2 2375 1654 -1.04235 -0.0598646 -0.0195206 1 0 1 1 0 0 +EDGE2 2375 2334 -1.0391 -0.0197455 -0.00349675 1 0 1 1 0 0 +EDGE2 2375 2354 -0.993538 0.0284739 -0.0196445 1 0 1 1 0 0 +EDGE2 2375 1534 -0.997419 -0.0103878 0.016839 1 0 1 1 0 0 +EDGE2 2375 1374 -0.941502 -0.00598922 0.022248 1 0 1 1 0 0 +EDGE2 2375 1855 -0.0885252 0.0413286 -3.15259 1 0 1 1 0 0 +EDGE2 2375 2335 -0.0252085 0.0385925 0.000162912 1 0 1 1 0 0 +EDGE2 2375 2355 -0.0361976 0.0745198 0.00105327 1 0 1 1 0 0 +EDGE2 2375 2315 -0.016611 0.0314001 -3.09422 1 0 1 1 0 0 +EDGE2 2375 1595 -0.0379587 -0.0711787 -3.16099 1 0 1 1 0 0 +EDGE2 2375 1655 -0.0418966 0.0560108 0.000753956 1 0 1 1 0 0 +EDGE2 2375 1575 0.00329583 -0.0604783 -3.14857 1 0 1 1 0 0 +EDGE2 2375 1854 0.948672 -0.0798787 -3.14448 1 0 1 1 0 0 +EDGE2 2375 1375 0.00821777 0.0268617 -0.0165754 1 0 1 1 0 0 +EDGE2 2375 1515 0.0627411 -0.0019077 -0.0198943 1 0 1 1 0 0 +EDGE2 2375 2314 1.05409 0.0091675 -3.12593 1 0 1 1 0 0 +EDGE2 2375 1574 1.06314 0.000122885 -3.13167 1 0 1 1 0 0 +EDGE2 2375 1594 1.00703 -0.0301863 -3.13559 1 0 1 1 0 0 +EDGE2 2375 2336 -0.00693022 0.989792 1.5755 1 0 1 1 0 0 +EDGE2 2375 2356 0.0319639 0.991238 1.58994 1 0 1 1 0 0 +EDGE2 2375 1516 0.053838 0.967547 1.59928 1 0 1 1 0 0 +EDGE2 2375 1596 0.0344651 0.982857 1.56636 1 0 1 1 0 0 +EDGE2 2375 2316 -0.0193845 1.02665 1.56745 1 0 1 1 0 0 +EDGE2 2376 1537 0.958584 -0.0237903 -0.00737528 1 0 1 1 0 0 +EDGE2 2376 1577 0.929436 -0.00828665 -0.00596266 1 0 1 1 0 0 +EDGE2 2376 1857 0.985132 0.0502635 0.0165527 1 0 1 1 0 0 +EDGE2 2376 1657 0.936151 0.0341944 -0.0155449 1 0 1 1 0 0 +EDGE2 2376 1656 0.0275226 0.00867642 0.0253784 1 0 1 1 0 0 +EDGE2 2376 1377 0.982112 -0.0808649 -0.0126096 1 0 1 1 0 0 +EDGE2 2376 1856 0.0889388 -0.0206891 0.00717926 1 0 1 1 0 0 +EDGE2 2376 1536 0.00687024 0.0673298 0.000803417 1 0 1 1 0 0 +EDGE2 2376 1576 0.0607088 0.102593 0.00564546 1 0 1 1 0 0 +EDGE2 2376 1376 -0.0332201 -0.0637939 -0.0113117 1 0 1 1 0 0 +EDGE2 2376 1535 -1.01804 0.025812 1.5968 1 0 1 1 0 0 +EDGE2 2376 1855 -0.992997 -0.0289929 -1.56641 1 0 1 1 0 0 +EDGE2 2376 2335 -1.04713 -0.0213303 1.58919 1 0 1 1 0 0 +EDGE2 2376 2355 -0.975632 -0.0755704 1.56236 1 0 1 1 0 0 +EDGE2 2376 2375 -0.92045 -0.0299274 1.55932 1 0 1 1 0 0 +EDGE2 2376 2315 -0.980957 0.0159567 -1.58088 1 0 1 1 0 0 +EDGE2 2376 1595 -1.03337 0.0357172 -1.57343 1 0 1 1 0 0 +EDGE2 2376 1655 -1.00166 -0.0680566 1.57472 1 0 1 1 0 0 +EDGE2 2376 1575 -1.02472 0.0109947 -1.531 1 0 1 1 0 0 +EDGE2 2376 1375 -1.01913 -0.00733721 1.59663 1 0 1 1 0 0 +EDGE2 2376 1515 -1.08638 -0.014205 1.54965 1 0 1 1 0 0 +EDGE2 2377 1378 1.07822 0.0154802 0.0153292 1 0 1 1 0 0 +EDGE2 2377 1858 1.08263 0.0133047 -0.00118644 1 0 1 1 0 0 +EDGE2 2377 1578 0.977684 0.0123598 -0.0102902 1 0 1 1 0 0 +EDGE2 2377 1658 0.977235 0.0217652 0.0140323 1 0 1 1 0 0 +EDGE2 2377 1538 0.994216 -0.0728698 -0.0278466 1 0 1 1 0 0 +EDGE2 2377 1537 0.101785 -0.017781 0.0340697 1 0 1 1 0 0 +EDGE2 2377 1577 0.0383872 0.0203677 -0.00900936 1 0 1 1 0 0 +EDGE2 2377 1857 -0.0365318 0.0511443 0.00532012 1 0 1 1 0 0 +EDGE2 2377 1657 0.0126955 -0.0702239 0.0121462 1 0 1 1 0 0 +EDGE2 2377 1656 -0.978072 -0.00367145 0.0200682 1 0 1 1 0 0 +EDGE2 2377 2376 -0.987489 0.0587731 -0.0157541 1 0 1 1 0 0 +EDGE2 2377 1377 0.0492766 -0.101422 -0.0339822 1 0 1 1 0 0 +EDGE2 2377 1856 -1.02931 -0.0848416 -0.0217073 1 0 1 1 0 0 +EDGE2 2377 1536 -1.06828 0.00135596 0.0102207 1 0 1 1 0 0 +EDGE2 2377 1576 -1.0548 0.0815518 -0.00870457 1 0 1 1 0 0 +EDGE2 2377 1376 -0.992176 0.0823959 -0.028022 1 0 1 1 0 0 +EDGE2 2378 1378 -0.0702374 0.0403042 0.0137974 1 0 1 1 0 0 +EDGE2 2378 1858 -0.0284737 -0.0318304 -0.0192144 1 0 1 1 0 0 +EDGE2 2378 1579 1.03481 0.113911 0.021654 1 0 1 1 0 0 +EDGE2 2378 1859 0.943517 0.0546224 -0.00361161 1 0 1 1 0 0 +EDGE2 2378 1659 0.942809 -0.0252024 -0.0145064 1 0 1 1 0 0 +EDGE2 2378 1379 0.963669 -0.0127508 0.00398484 1 0 1 1 0 0 +EDGE2 2378 1539 1.09831 -0.00271769 0.0400735 1 0 1 1 0 0 +EDGE2 2378 1578 0.0483365 -0.118599 -0.00906933 1 0 1 1 0 0 +EDGE2 2378 1658 0.00465301 0.0763969 -0.00129301 1 0 1 1 0 0 +EDGE2 2378 1538 -0.0337743 -0.0685182 0.00367476 1 0 1 1 0 0 +EDGE2 2378 1537 -1.02183 -0.00386423 0.00541953 1 0 1 1 0 0 +EDGE2 2378 1577 -0.923192 -0.0228758 0.0105599 1 0 1 1 0 0 +EDGE2 2378 1857 -1.03111 0.0283831 0.0155114 1 0 1 1 0 0 +EDGE2 2378 2377 -1.01112 -0.0372106 -0.0102423 1 0 1 1 0 0 +EDGE2 2378 1657 -1.00627 0.00506705 0.00324555 1 0 1 1 0 0 +EDGE2 2378 1377 -1.05085 0.0515837 0.0254548 1 0 1 1 0 0 +EDGE2 2379 1540 0.997027 -0.0280121 0.0178795 1 0 1 1 0 0 +EDGE2 2379 1860 0.969085 0.0115576 0.0156168 1 0 1 1 0 0 +EDGE2 2379 1580 0.937373 0.0458839 -0.00210666 1 0 1 1 0 0 +EDGE2 2379 1660 0.967456 0.0638934 -0.00143759 1 0 1 1 0 0 +EDGE2 2379 1840 0.999516 0.0134455 -3.15324 1 0 1 1 0 0 +EDGE2 2379 1560 0.967827 -0.0178021 -3.09738 1 0 1 1 0 0 +EDGE2 2379 1380 0.985753 0.0861285 -0.00113707 1 0 1 1 0 0 +EDGE2 2379 1378 -0.972064 -0.0244244 -0.0100871 1 0 1 1 0 0 +EDGE2 2379 1858 -1.03072 -0.0553834 -0.0102931 1 0 1 1 0 0 +EDGE2 2379 1579 0.0408504 -0.0258858 0.0228988 1 0 1 1 0 0 +EDGE2 2379 1859 -0.0242943 0.06525 -0.00859588 1 0 1 1 0 0 +EDGE2 2379 1659 0.0014628 0.0122308 -0.027063 1 0 1 1 0 0 +EDGE2 2379 1379 0.0307658 0.0199815 0.00703471 1 0 1 1 0 0 +EDGE2 2379 1539 0.000374957 -0.11317 -0.0180407 1 0 1 1 0 0 +EDGE2 2379 2378 -1.05049 0.0377305 -0.00490407 1 0 1 1 0 0 +EDGE2 2379 1578 -0.994652 0.0333492 0.0123814 1 0 1 1 0 0 +EDGE2 2379 1658 -1.01028 0.0438672 0.00120468 1 0 1 1 0 0 +EDGE2 2379 1538 -1.03747 -0.0213513 -0.00620801 1 0 1 1 0 0 +EDGE2 2380 1839 0.973254 -0.00399004 -3.13225 1 0 1 1 0 0 +EDGE2 2380 1559 0.971733 0.0141032 -3.14126 1 0 1 1 0 0 +EDGE2 2380 1540 -0.0379979 0.0220023 0.0161559 1 0 1 1 0 0 +EDGE2 2380 1861 0.0475599 -0.995613 -1.58021 1 0 1 1 0 0 +EDGE2 2380 1860 0.0920734 0.0364186 -0.00690137 1 0 1 1 0 0 +EDGE2 2380 1381 -0.0475661 -0.99537 -1.57199 1 0 1 1 0 0 +EDGE2 2380 1661 0.0710219 -1.00783 -1.58932 1 0 1 1 0 0 +EDGE2 2380 1580 -0.112312 0.126293 -0.0130383 1 0 1 1 0 0 +EDGE2 2380 1660 -0.0223193 -0.0940541 -0.0158134 1 0 1 1 0 0 +EDGE2 2380 1840 -0.0431337 0.0238067 -3.1507 1 0 1 1 0 0 +EDGE2 2380 1560 0.011821 0.0482029 -3.13316 1 0 1 1 0 0 +EDGE2 2380 1581 -0.0206278 0.954409 1.56503 1 0 1 1 0 0 +EDGE2 2380 1380 0.0117481 -0.109964 -0.0139801 1 0 1 1 0 0 +EDGE2 2380 1841 0.0282924 0.998443 1.56474 1 0 1 1 0 0 +EDGE2 2380 1541 0.0450651 1.0019 1.57304 1 0 1 1 0 0 +EDGE2 2380 1561 0.0741636 1.00488 1.57155 1 0 1 1 0 0 +EDGE2 2380 1579 -0.974067 -0.0174755 -0.0046164 1 0 1 1 0 0 +EDGE2 2380 1859 -1.07806 0.0988177 -0.0078994 1 0 1 1 0 0 +EDGE2 2380 2379 -1.06223 0.0832331 -0.0118806 1 0 1 1 0 0 +EDGE2 2380 1659 -1.01879 -0.0676268 -0.0198624 1 0 1 1 0 0 +EDGE2 2380 1379 -0.975281 -0.141855 0.0102306 1 0 1 1 0 0 +EDGE2 2380 1539 -0.973357 -0.0425771 -0.0247797 1 0 1 1 0 0 +EDGE2 2381 1540 -1.05637 0.0585167 -1.56169 1 0 1 1 0 0 +EDGE2 2381 1860 -0.929436 -0.00327382 -1.54055 1 0 1 1 0 0 +EDGE2 2381 2380 -1.01145 -0.0467151 -1.57714 1 0 1 1 0 0 +EDGE2 2381 1580 -1.07451 0.0462158 -1.59558 1 0 1 1 0 0 +EDGE2 2381 1660 -0.997876 0.0143438 -1.58147 1 0 1 1 0 0 +EDGE2 2381 1840 -1.0222 0.094048 1.59828 1 0 1 1 0 0 +EDGE2 2381 1560 -1.0699 -0.0564656 1.57495 1 0 1 1 0 0 +EDGE2 2381 1842 1.05671 -0.00211993 -0.00173279 1 0 1 1 0 0 +EDGE2 2381 1581 -0.0140211 0.0593724 -0.00932294 1 0 1 1 0 0 +EDGE2 2381 1380 -0.951117 0.0514948 -1.55988 1 0 1 1 0 0 +EDGE2 2381 1841 -0.0203619 -0.00816411 -0.00155823 1 0 1 1 0 0 +EDGE2 2381 1541 -0.0102792 -0.00499536 -0.0239562 1 0 1 1 0 0 +EDGE2 2381 1561 0.0352827 0.0168626 0.00952737 1 0 1 1 0 0 +EDGE2 2381 1542 1.0199 -0.0570937 -4.79744e-05 1 0 1 1 0 0 +EDGE2 2381 1562 1.02394 -0.0660079 -0.0278135 1 0 1 1 0 0 +EDGE2 2381 1582 0.993386 0.0332881 -0.0180132 1 0 1 1 0 0 +EDGE2 2382 1543 1.04751 -0.00840101 0.00252693 1 0 1 1 0 0 +EDGE2 2382 1842 -0.0723912 0.052139 -0.0120086 1 0 1 1 0 0 +EDGE2 2382 1581 -1.04975 0.0913226 -0.00403821 1 0 1 1 0 0 +EDGE2 2382 2381 -0.969115 9.91778e-05 0.00891288 1 0 1 1 0 0 +EDGE2 2382 1841 -1.0432 0.00863989 -0.0108755 1 0 1 1 0 0 +EDGE2 2382 1541 -0.940206 -0.0902821 -0.0105616 1 0 1 1 0 0 +EDGE2 2382 1561 -0.972467 -0.0792014 0.0218057 1 0 1 1 0 0 +EDGE2 2382 1542 -0.0618839 0.0336737 -0.0494318 1 0 1 1 0 0 +EDGE2 2382 1562 0.0476832 0.0710953 0.00526841 1 0 1 1 0 0 +EDGE2 2382 1582 0.0945759 -0.00318978 0.0353851 1 0 1 1 0 0 +EDGE2 2382 1583 0.916926 -0.0294449 -0.0141194 1 0 1 1 0 0 +EDGE2 2382 1843 1.08825 0.0426892 0.0140508 1 0 1 1 0 0 +EDGE2 2382 1563 1.02428 0.01277 -0.0124701 1 0 1 1 0 0 +EDGE2 2383 1543 -0.00143274 -0.0609602 0.00966635 1 0 1 1 0 0 +EDGE2 2383 1842 -1.00912 -0.076886 -0.0204841 1 0 1 1 0 0 +EDGE2 2383 2382 -0.964164 -0.000801941 0.0332422 1 0 1 1 0 0 +EDGE2 2383 1542 -1.05409 -0.0143155 -0.00686602 1 0 1 1 0 0 +EDGE2 2383 1562 -0.929766 0.0217503 0.0164381 1 0 1 1 0 0 +EDGE2 2383 1582 -0.96761 -0.0518449 -0.0212148 1 0 1 1 0 0 +EDGE2 2383 1583 0.0132857 -0.0319354 0.00967816 1 0 1 1 0 0 +EDGE2 2383 1843 0.0534239 0.0177551 0.0185937 1 0 1 1 0 0 +EDGE2 2383 1563 -0.0262201 -0.106366 -0.00280729 1 0 1 1 0 0 +EDGE2 2383 1564 0.981409 0.0308028 -0.0052502 1 0 1 1 0 0 +EDGE2 2383 1844 1.02964 0.0840331 -0.0325978 1 0 1 1 0 0 +EDGE2 2383 1584 0.973601 0.061537 0.0155023 1 0 1 1 0 0 +EDGE2 2383 1544 0.876565 0.0231573 0.0257279 1 0 1 1 0 0 +EDGE2 2384 1543 -1.02121 -0.0119624 -0.0201811 1 0 1 1 0 0 +EDGE2 2384 2383 -1.10713 -0.00370564 0.0193024 1 0 1 1 0 0 +EDGE2 2384 1583 -1.00524 -0.0268634 0.00203235 1 0 1 1 0 0 +EDGE2 2384 1843 -0.971831 0.0323656 -0.0292413 1 0 1 1 0 0 +EDGE2 2384 1563 -1.05972 -0.041709 0.00474851 1 0 1 1 0 0 +EDGE2 2384 1564 0.00216702 -0.00424939 -0.0130074 1 0 1 1 0 0 +EDGE2 2384 1844 0.00532503 0.00825624 0.0257287 1 0 1 1 0 0 +EDGE2 2384 1584 -0.0646308 0.0811334 0.0106559 1 0 1 1 0 0 +EDGE2 2384 1544 0.0202978 0.0415301 0.0269562 1 0 1 1 0 0 +EDGE2 2384 1265 1.04005 -0.0158453 -3.15851 1 0 1 1 0 0 +EDGE2 2384 2305 1.02752 -0.0632356 -3.12777 1 0 1 1 0 0 +EDGE2 2384 1565 0.932368 0.0289863 -0.016 1 0 1 1 0 0 +EDGE2 2384 1585 1.03822 0.0102471 0.000996162 1 0 1 1 0 0 +EDGE2 2384 1845 1.0036 -0.0570092 -0.038763 1 0 1 1 0 0 +EDGE2 2384 1545 0.949728 -0.0427416 0.0219593 1 0 1 1 0 0 +EDGE2 2385 1564 -1.0731 -0.00959608 0.00704406 1 0 1 1 0 0 +EDGE2 2385 1844 -0.969694 0.0323594 -0.0023644 1 0 1 1 0 0 +EDGE2 2385 2384 -0.948781 -0.0680201 -0.00544962 1 0 1 1 0 0 +EDGE2 2385 1584 -1.00375 -0.0354681 0.00722791 1 0 1 1 0 0 +EDGE2 2385 1544 -0.955245 -0.0869276 -0.00942865 1 0 1 1 0 0 +EDGE2 2385 1546 0.0764131 -0.949275 -1.56445 1 0 1 1 0 0 +EDGE2 2385 1265 -0.0295796 0.0400732 -3.16208 1 0 1 1 0 0 +EDGE2 2385 2305 -0.00211017 -0.00923364 -3.17901 1 0 1 1 0 0 +EDGE2 2385 1565 -0.0502585 -0.00434719 0.0185195 1 0 1 1 0 0 +EDGE2 2385 1585 -0.0408593 0.0903246 0.000364885 1 0 1 1 0 0 +EDGE2 2385 1845 0.0829997 0.0162355 -0.0457216 1 0 1 1 0 0 +EDGE2 2385 1545 -0.0468549 0.0707942 0.0108461 1 0 1 1 0 0 +EDGE2 2385 1264 1.10857 -0.0338281 -3.13113 1 0 1 1 0 0 +EDGE2 2385 2304 1.02063 0.033175 -3.11825 1 0 1 1 0 0 +EDGE2 2385 1566 0.0179797 0.883314 1.58884 1 0 1 1 0 0 +EDGE2 2385 1846 -0.00801094 1.02941 1.52792 1 0 1 1 0 0 +EDGE2 2385 2306 0.0213484 1.11418 1.58797 1 0 1 1 0 0 +EDGE2 2385 1586 -0.0528012 0.990094 1.56265 1 0 1 1 0 0 +EDGE2 2385 1266 -0.00145097 1.06247 1.58875 1 0 1 1 0 0 +EDGE2 2386 1265 -0.939987 0.0113021 1.57264 1 0 1 1 0 0 +EDGE2 2386 2305 -1.04921 -0.0158491 1.55998 1 0 1 1 0 0 +EDGE2 2386 2385 -1.04054 0.0095242 -1.59156 1 0 1 1 0 0 +EDGE2 2386 1565 -0.983922 0.00709654 -1.58032 1 0 1 1 0 0 +EDGE2 2386 1585 -0.998635 -0.0974602 -1.57492 1 0 1 1 0 0 +EDGE2 2386 1845 -1.00789 0.0112642 -1.57582 1 0 1 1 0 0 +EDGE2 2386 1545 -0.946344 0.0133603 -1.54351 1 0 1 1 0 0 +EDGE2 2386 1567 0.988978 0.0718342 0.0286606 1 0 1 1 0 0 +EDGE2 2386 1587 0.954622 0.0153857 0.0193482 1 0 1 1 0 0 +EDGE2 2386 1566 0.0265775 -0.00247813 -0.0287274 1 0 1 1 0 0 +EDGE2 2386 1846 0.0214904 -0.0173431 0.0113494 1 0 1 1 0 0 +EDGE2 2386 2306 0.0196192 -0.00401697 -0.00101757 1 0 1 1 0 0 +EDGE2 2386 1586 0.097173 0.0312755 -0.0147113 1 0 1 1 0 0 +EDGE2 2386 2307 0.973699 -0.0514613 -0.0133889 1 0 1 1 0 0 +EDGE2 2386 1266 0.0092314 -0.114041 0.059955 1 0 1 1 0 0 +EDGE2 2386 1847 1.04724 -0.0542602 0.00671811 1 0 1 1 0 0 +EDGE2 2386 1267 0.985423 0.0141719 -0.00960471 1 0 1 1 0 0 +EDGE2 2387 1567 0.0503286 -0.0598975 0.0103995 1 0 1 1 0 0 +EDGE2 2387 1587 0.0223091 -0.0238499 0.0242878 1 0 1 1 0 0 +EDGE2 2387 1566 -0.935134 0.0296541 0.00856228 1 0 1 1 0 0 +EDGE2 2387 1846 -1.03352 0.00479235 0.013995 1 0 1 1 0 0 +EDGE2 2387 2306 -0.931083 0.011373 0.0325595 1 0 1 1 0 0 +EDGE2 2387 2386 -0.896089 0.0440399 -0.0131317 1 0 1 1 0 0 +EDGE2 2387 1586 -0.98344 0.020027 -0.00126945 1 0 1 1 0 0 +EDGE2 2387 2307 -0.0147662 0.0382069 0.010345 1 0 1 1 0 0 +EDGE2 2387 1266 -1.07061 -0.0643283 -0.0174235 1 0 1 1 0 0 +EDGE2 2387 1847 0.0711124 0.0122235 0.00146655 1 0 1 1 0 0 +EDGE2 2387 1588 0.964595 0.00202301 0.0161844 1 0 1 1 0 0 +EDGE2 2387 2308 0.966437 0.0222684 -0.0297273 1 0 1 1 0 0 +EDGE2 2387 1267 0.0346284 -0.0452354 0.0228449 1 0 1 1 0 0 +EDGE2 2387 1848 0.988981 0.131925 -0.0196189 1 0 1 1 0 0 +EDGE2 2387 1268 0.989488 0.0266251 -0.000216445 1 0 1 1 0 0 +EDGE2 2387 1568 0.946978 0.061692 -0.00505501 1 0 1 1 0 0 +EDGE2 2388 1567 -1.00849 -0.0670826 0.0241346 1 0 1 1 0 0 +EDGE2 2388 1587 -0.991589 -0.0787976 0.0122964 1 0 1 1 0 0 +EDGE2 2388 2307 -0.976868 -0.0161672 -0.0308049 1 0 1 1 0 0 +EDGE2 2388 2387 -0.945913 0.0120621 0.0109252 1 0 1 1 0 0 +EDGE2 2388 1847 -0.93611 -0.0149608 -0.0572838 1 0 1 1 0 0 +EDGE2 2388 1849 0.972261 0.0502562 0.0159563 1 0 1 1 0 0 +EDGE2 2388 1588 0.0024876 0.0564915 0.0443418 1 0 1 1 0 0 +EDGE2 2388 2308 0.0529878 0.0343369 -0.0205135 1 0 1 1 0 0 +EDGE2 2388 1267 -0.965445 0.00202201 0.0194159 1 0 1 1 0 0 +EDGE2 2388 1848 -0.0389562 -0.128274 -0.00500993 1 0 1 1 0 0 +EDGE2 2388 1268 0.0164649 -0.0107445 -0.012818 1 0 1 1 0 0 +EDGE2 2388 1568 0.0270652 -0.042805 0.0371069 1 0 1 1 0 0 +EDGE2 2388 2309 0.920375 0.0505386 -0.00870181 1 0 1 1 0 0 +EDGE2 2388 1569 0.98149 0.055689 -0.0452822 1 0 1 1 0 0 +EDGE2 2388 1589 0.927168 0.030609 -0.0118625 1 0 1 1 0 0 +EDGE2 2388 1269 0.94925 0.0320432 0.0112748 1 0 1 1 0 0 +EDGE2 2389 1849 -0.0506489 -0.050004 -0.0127372 1 0 1 1 0 0 +EDGE2 2389 1588 -0.914359 0.0598146 0.00798362 1 0 1 1 0 0 +EDGE2 2389 2308 -0.942879 -0.0346935 0.0213906 1 0 1 1 0 0 +EDGE2 2389 2388 -0.989412 0.0121372 0.0105798 1 0 1 1 0 0 +EDGE2 2389 1848 -0.976819 -0.0125698 -0.0236687 1 0 1 1 0 0 +EDGE2 2389 1268 -1.03315 0.0139573 0.0149237 1 0 1 1 0 0 +EDGE2 2389 1568 -0.960857 -0.0550564 0.00519577 1 0 1 1 0 0 +EDGE2 2389 2309 0.0469744 0.0205694 0.0174141 1 0 1 1 0 0 +EDGE2 2389 1569 0.00900939 -0.129923 -0.0162427 1 0 1 1 0 0 +EDGE2 2389 1589 -0.053486 0.124397 0.0248568 1 0 1 1 0 0 +EDGE2 2389 1269 -0.0107948 -0.0246164 0.0252185 1 0 1 1 0 0 +EDGE2 2389 1590 0.896693 0.0563754 -0.00358007 1 0 1 1 0 0 +EDGE2 2389 2310 0.963091 -0.0484651 -0.0147016 1 0 1 1 0 0 +EDGE2 2389 1850 0.99915 0.0582759 -0.00303117 1 0 1 1 0 0 +EDGE2 2389 1270 0.992268 -0.0616883 -0.00929214 1 0 1 1 0 0 +EDGE2 2389 1290 0.977093 0.106017 -3.12098 1 0 1 1 0 0 +EDGE2 2389 1570 1.0298 0.106856 -0.0124377 1 0 1 1 0 0 +EDGE2 2390 1851 0.0330902 1.06401 1.59755 1 0 1 1 0 0 +EDGE2 2390 2311 -0.0338699 1.03282 1.5847 1 0 1 1 0 0 +EDGE2 2390 1571 0.10819 1.06463 1.52832 1 0 1 1 0 0 +EDGE2 2390 1591 -0.0683434 1.0041 1.58545 1 0 1 1 0 0 +EDGE2 2390 1849 -0.968058 -0.0404104 -0.0230583 1 0 1 1 0 0 +EDGE2 2390 2389 -0.981225 0.0861706 0.00246122 1 0 1 1 0 0 +EDGE2 2390 2309 -0.992513 0.0758461 0.0235366 1 0 1 1 0 0 +EDGE2 2390 1569 -0.960247 -0.000917412 -0.0200846 1 0 1 1 0 0 +EDGE2 2390 1589 -0.964675 0.163215 0.0186527 1 0 1 1 0 0 +EDGE2 2390 1269 -1.04419 0.0260801 0.0224601 1 0 1 1 0 0 +EDGE2 2390 1291 -0.104972 -1.00429 -1.56222 1 0 1 1 0 0 +EDGE2 2390 1590 -0.00567791 0.000652253 0.0222611 1 0 1 1 0 0 +EDGE2 2390 2310 -0.0739637 -0.0406385 0.0161991 1 0 1 1 0 0 +EDGE2 2390 1850 0.0356376 -0.0519353 0.0286556 1 0 1 1 0 0 +EDGE2 2390 1270 -0.00505755 0.0529568 -0.00259651 1 0 1 1 0 0 +EDGE2 2390 1290 -0.0280966 -0.0308044 -3.13298 1 0 1 1 0 0 +EDGE2 2390 1570 -0.0260954 -0.0855044 -0.017352 1 0 1 1 0 0 +EDGE2 2390 1271 -0.00112601 -1.02441 -1.57706 1 0 1 1 0 0 +EDGE2 2390 1289 1.07766 0.0709595 -3.14639 1 0 1 1 0 0 +EDGE2 2391 1851 0.101947 -0.00881176 0.0255062 1 0 1 1 0 0 +EDGE2 2391 1852 0.959143 -0.0759465 -0.0114051 1 0 1 1 0 0 +EDGE2 2391 2312 1.00122 0.000283611 -0.0294758 1 0 1 1 0 0 +EDGE2 2391 1572 0.988049 0.0233194 -0.0118062 1 0 1 1 0 0 +EDGE2 2391 1592 0.960333 0.00721548 0.00490303 1 0 1 1 0 0 +EDGE2 2391 2311 0.0738081 -0.0314794 0.00695077 1 0 1 1 0 0 +EDGE2 2391 1571 -0.0716957 -0.0353004 0.0319077 1 0 1 1 0 0 +EDGE2 2391 1591 -0.00652866 0.0354511 -0.00159735 1 0 1 1 0 0 +EDGE2 2391 1590 -1.03296 -0.0248882 -1.57615 1 0 1 1 0 0 +EDGE2 2391 2310 -0.974285 -0.0175457 -1.61339 1 0 1 1 0 0 +EDGE2 2391 2390 -1.0231 -0.0198375 -1.6058 1 0 1 1 0 0 +EDGE2 2391 1850 -0.987557 -0.0149654 -1.53027 1 0 1 1 0 0 +EDGE2 2391 1270 -0.986074 -0.0247749 -1.55169 1 0 1 1 0 0 +EDGE2 2391 1290 -0.946385 -0.0194589 1.53577 1 0 1 1 0 0 +EDGE2 2391 1570 -1.03195 -0.0708472 -1.54875 1 0 1 1 0 0 +EDGE2 2392 1851 -0.917796 0.00281805 -0.0260238 1 0 1 1 0 0 +EDGE2 2392 1853 1.0004 0.0501078 -0.00111445 1 0 1 1 0 0 +EDGE2 2392 2313 0.975448 -0.102212 -0.0272703 1 0 1 1 0 0 +EDGE2 2392 1852 0.0997747 -0.0269675 -0.0195161 1 0 1 1 0 0 +EDGE2 2392 1573 0.964179 -0.00595387 -0.00397685 1 0 1 1 0 0 +EDGE2 2392 1593 0.982892 0.0193419 0.0440259 1 0 1 1 0 0 +EDGE2 2392 2312 -0.037703 -0.0277178 0.0395395 1 0 1 1 0 0 +EDGE2 2392 2391 -1.05517 -0.0770409 -0.0206754 1 0 1 1 0 0 +EDGE2 2392 1572 -0.00735567 -0.040408 -0.0121176 1 0 1 1 0 0 +EDGE2 2392 1592 0.0011617 0.0438351 0.039649 1 0 1 1 0 0 +EDGE2 2392 2311 -1.03491 -0.0742613 0.0241093 1 0 1 1 0 0 +EDGE2 2392 1571 -0.990652 -0.031952 0.00726092 1 0 1 1 0 0 +EDGE2 2392 1591 -0.963234 0.0542514 0.00819224 1 0 1 1 0 0 +EDGE2 2393 1853 0.0387524 0.0478426 0.0121498 1 0 1 1 0 0 +EDGE2 2393 1854 0.991962 -0.0309579 0.0376455 1 0 1 1 0 0 +EDGE2 2393 2314 1.04406 -0.0390563 -0.0120822 1 0 1 1 0 0 +EDGE2 2393 1574 1.01446 -0.0680324 0.00213535 1 0 1 1 0 0 +EDGE2 2393 1594 1.02172 0.0707466 -0.0314013 1 0 1 1 0 0 +EDGE2 2393 2313 -0.0208049 0.00645414 0.00690839 1 0 1 1 0 0 +EDGE2 2393 1852 -1.03543 0.0151927 -0.0124897 1 0 1 1 0 0 +EDGE2 2393 2392 -1.01173 0.0572912 -0.013371 1 0 1 1 0 0 +EDGE2 2393 1573 0.0876483 -0.00631769 -0.0129774 1 0 1 1 0 0 +EDGE2 2393 1593 0.0330577 0.0224985 0.00251144 1 0 1 1 0 0 +EDGE2 2393 2312 -0.977824 -0.016767 0.0185135 1 0 1 1 0 0 +EDGE2 2393 1572 -0.947151 -0.00462807 0.00225287 1 0 1 1 0 0 +EDGE2 2393 1592 -1.01586 -0.0318648 -0.0102607 1 0 1 1 0 0 +EDGE2 2394 1535 1.05928 0.0675457 -3.1234 1 0 1 1 0 0 +EDGE2 2394 1855 0.954358 0.0242292 0.00657731 1 0 1 1 0 0 +EDGE2 2394 2335 1.07885 -0.0279493 -3.11664 1 0 1 1 0 0 +EDGE2 2394 2355 0.90477 0.028656 -3.14848 1 0 1 1 0 0 +EDGE2 2394 2375 1.00734 0.0138355 -3.14225 1 0 1 1 0 0 +EDGE2 2394 2315 0.947423 0.0149227 -0.0128318 1 0 1 1 0 0 +EDGE2 2394 1595 0.908538 0.0844196 -0.0255104 1 0 1 1 0 0 +EDGE2 2394 1655 0.971138 -0.0297192 -3.16556 1 0 1 1 0 0 +EDGE2 2394 1575 0.950304 -0.0113146 -0.0187138 1 0 1 1 0 0 +EDGE2 2394 1853 -1.00828 -0.00493741 -0.00135654 1 0 1 1 0 0 +EDGE2 2394 1854 0.00626232 0.0197688 -0.0136064 1 0 1 1 0 0 +EDGE2 2394 1375 0.988898 0.0141663 -3.13306 1 0 1 1 0 0 +EDGE2 2394 1515 0.991973 -0.0635145 -3.13554 1 0 1 1 0 0 +EDGE2 2394 2314 0.0753907 -0.0377877 0.00340207 1 0 1 1 0 0 +EDGE2 2394 2393 -1.02188 0.0399472 -0.00799346 1 0 1 1 0 0 +EDGE2 2394 1574 0.0174209 -0.00211556 0.006066 1 0 1 1 0 0 +EDGE2 2394 1594 0.0475293 -0.0397498 -0.00959103 1 0 1 1 0 0 +EDGE2 2394 2313 -0.997054 -0.0302071 0.00796807 1 0 1 1 0 0 +EDGE2 2394 1573 -0.974171 0.00937922 -0.0145582 1 0 1 1 0 0 +EDGE2 2394 1593 -1.04282 -0.008131 -0.0185751 1 0 1 1 0 0 +EDGE2 2395 1656 0.0302946 1.07901 1.60372 1 0 1 1 0 0 +EDGE2 2395 2376 -0.107767 0.97096 1.58531 1 0 1 1 0 0 +EDGE2 2395 1856 -0.026681 1.04192 1.54147 1 0 1 1 0 0 +EDGE2 2395 1536 -0.0630215 0.974499 1.57672 1 0 1 1 0 0 +EDGE2 2395 1576 0.00356043 0.920218 1.56753 1 0 1 1 0 0 +EDGE2 2395 1376 0.0374092 1.09634 1.59375 1 0 1 1 0 0 +EDGE2 2395 1535 -0.0435825 0.0102213 -3.13591 1 0 1 1 0 0 +EDGE2 2395 2374 0.995935 0.035162 -3.18408 1 0 1 1 0 0 +EDGE2 2395 1514 1.08326 0.00938021 -3.13925 1 0 1 1 0 0 +EDGE2 2395 1654 0.879593 0.0235164 -3.12762 1 0 1 1 0 0 +EDGE2 2395 2334 0.985591 -0.025086 -3.09678 1 0 1 1 0 0 +EDGE2 2395 2354 0.996452 -0.0260832 -3.1822 1 0 1 1 0 0 +EDGE2 2395 1534 0.99399 0.0493158 -3.16196 1 0 1 1 0 0 +EDGE2 2395 1374 1.027 0.0284388 -3.11439 1 0 1 1 0 0 +EDGE2 2395 1855 0.0293679 -0.0487539 0.0164309 1 0 1 1 0 0 +EDGE2 2395 2335 -0.0172061 0.0911249 -3.11969 1 0 1 1 0 0 +EDGE2 2395 2355 0.0343489 -0.014331 -3.1284 1 0 1 1 0 0 +EDGE2 2395 2375 0.0231639 0.0761543 -3.10548 1 0 1 1 0 0 +EDGE2 2395 2315 -0.00424742 -0.0195304 0.00679231 1 0 1 1 0 0 +EDGE2 2395 1595 -0.0303925 0.0172193 0.00976834 1 0 1 1 0 0 +EDGE2 2395 1655 -0.0299204 -0.0793242 -3.18143 1 0 1 1 0 0 +EDGE2 2395 1575 0.0750926 -0.0015455 0.0170776 1 0 1 1 0 0 +EDGE2 2395 1854 -1.05488 -0.0314191 0.0136046 1 0 1 1 0 0 +EDGE2 2395 2394 -1.07525 -0.0678872 -0.0173945 1 0 1 1 0 0 +EDGE2 2395 1375 0.00322459 0.00499422 -3.1287 1 0 1 1 0 0 +EDGE2 2395 1515 -0.119119 -0.00832315 -3.14143 1 0 1 1 0 0 +EDGE2 2395 2314 -0.918214 -0.0776362 0.00134394 1 0 1 1 0 0 +EDGE2 2395 1574 -1.01629 -0.096146 -0.00222365 1 0 1 1 0 0 +EDGE2 2395 1594 -1.04468 -0.0173774 0.00919533 1 0 1 1 0 0 +EDGE2 2395 2336 0.159471 -0.965701 -1.60971 1 0 1 1 0 0 +EDGE2 2395 2356 0.0423915 -0.985103 -1.58234 1 0 1 1 0 0 +EDGE2 2395 1516 -0.00391209 -0.992216 -1.596 1 0 1 1 0 0 +EDGE2 2395 1596 -0.0281045 -0.976649 -1.55861 1 0 1 1 0 0 +EDGE2 2395 2316 -0.0538384 -1.00357 -1.56528 1 0 1 1 0 0 +EDGE2 2396 1537 1.02907 -0.0246481 0.0170104 1 0 1 1 0 0 +EDGE2 2396 1577 1.06624 -0.00737617 -0.000765843 1 0 1 1 0 0 +EDGE2 2396 1857 1.00857 0.0181599 0.0429103 1 0 1 1 0 0 +EDGE2 2396 2377 1.04399 0.0263306 -0.0087439 1 0 1 1 0 0 +EDGE2 2396 1657 0.933 0.0607545 0.0302739 1 0 1 1 0 0 +EDGE2 2396 1656 0.0330492 -0.0664552 -0.016285 1 0 1 1 0 0 +EDGE2 2396 2376 0.0203238 -0.0363412 -0.0110114 1 0 1 1 0 0 +EDGE2 2396 1377 1.10858 -0.0220117 -0.0088089 1 0 1 1 0 0 +EDGE2 2396 1856 0.044976 -0.058915 -0.0343044 1 0 1 1 0 0 +EDGE2 2396 1536 0.0491307 -0.0488838 -0.016919 1 0 1 1 0 0 +EDGE2 2396 1576 0.107733 0.059193 -0.00197859 1 0 1 1 0 0 +EDGE2 2396 1376 -0.0465586 -0.0373708 -0.0128417 1 0 1 1 0 0 +EDGE2 2396 1535 -0.988303 0.0287562 1.57065 1 0 1 1 0 0 +EDGE2 2396 2395 -0.959109 -0.0159201 -1.57866 1 0 1 1 0 0 +EDGE2 2396 1855 -0.968144 -0.0554403 -1.60426 1 0 1 1 0 0 +EDGE2 2396 2335 -0.965975 -0.0145937 1.58157 1 0 1 1 0 0 +EDGE2 2396 2355 -0.931874 -0.0865054 1.56589 1 0 1 1 0 0 +EDGE2 2396 2375 -1.00674 -0.0198078 1.55506 1 0 1 1 0 0 +EDGE2 2396 2315 -1.08499 -0.0676418 -1.58388 1 0 1 1 0 0 +EDGE2 2396 1595 -1.11708 -0.0107192 -1.56883 1 0 1 1 0 0 +EDGE2 2396 1655 -1.06997 -0.00175638 1.57209 1 0 1 1 0 0 +EDGE2 2396 1575 -1.0728 -0.00901616 -1.57776 1 0 1 1 0 0 +EDGE2 2396 1375 -0.87618 -0.0155131 1.5568 1 0 1 1 0 0 +EDGE2 2396 1515 -1.0966 -0.0356505 1.57369 1 0 1 1 0 0 +EDGE2 2397 1378 1.08535 -0.0798522 -0.00935212 1 0 1 1 0 0 +EDGE2 2397 1858 0.990433 -0.0299629 0.00426848 1 0 1 1 0 0 +EDGE2 2397 2378 1.06059 0.00274902 0.00422912 1 0 1 1 0 0 +EDGE2 2397 1578 1.01751 0.0511089 0.00268571 1 0 1 1 0 0 +EDGE2 2397 1658 0.931421 -0.0311834 0.000958581 1 0 1 1 0 0 +EDGE2 2397 1538 1.0343 0.0626698 -0.00963566 1 0 1 1 0 0 +EDGE2 2397 1537 0.0248646 0.00176925 0.00840089 1 0 1 1 0 0 +EDGE2 2397 1577 -0.0589373 -0.0341619 -0.0231407 1 0 1 1 0 0 +EDGE2 2397 1857 0.0998572 0.0268699 0.0155345 1 0 1 1 0 0 +EDGE2 2397 2377 0.0554122 0.0569485 0.00860491 1 0 1 1 0 0 +EDGE2 2397 1657 -0.00982145 -0.0575368 -0.0271135 1 0 1 1 0 0 +EDGE2 2397 1656 -1.03129 -0.0305101 0.00695739 1 0 1 1 0 0 +EDGE2 2397 2376 -0.96232 -0.0248927 -0.0287409 1 0 1 1 0 0 +EDGE2 2397 2396 -1.02711 0.0568764 -0.00406097 1 0 1 1 0 0 +EDGE2 2397 1377 0.0554539 -0.00625204 -0.0406036 1 0 1 1 0 0 +EDGE2 2397 1856 -1.0176 -0.0278254 -0.0132688 1 0 1 1 0 0 +EDGE2 2397 1536 -0.961484 0.0197782 -0.0200803 1 0 1 1 0 0 +EDGE2 2397 1576 -1.08144 -0.0107364 -0.000107199 1 0 1 1 0 0 +EDGE2 2397 1376 -1.07137 -0.0164479 0.0278943 1 0 1 1 0 0 +EDGE2 2398 1378 -0.059428 -0.096083 -0.0490602 1 0 1 1 0 0 +EDGE2 2398 1858 -0.0419216 0.0310763 -0.0124924 1 0 1 1 0 0 +EDGE2 2398 1579 1.06304 -0.0194133 0.0116068 1 0 1 1 0 0 +EDGE2 2398 1859 1.02936 -0.0143329 0.0118656 1 0 1 1 0 0 +EDGE2 2398 2379 1.00574 0.000411998 0.00727229 1 0 1 1 0 0 +EDGE2 2398 1659 1.00373 -0.00376695 0.0106385 1 0 1 1 0 0 +EDGE2 2398 1379 0.914024 -0.00441478 0.0196719 1 0 1 1 0 0 +EDGE2 2398 1539 1.04111 -0.0312874 -0.00364943 1 0 1 1 0 0 +EDGE2 2398 2378 0.037837 0.0300574 0.0151709 1 0 1 1 0 0 +EDGE2 2398 1578 0.0361748 0.0789649 -0.0337195 1 0 1 1 0 0 +EDGE2 2398 1658 -0.0246221 0.00350093 0.00228956 1 0 1 1 0 0 +EDGE2 2398 1538 0.0491247 0.0427576 0.0263309 1 0 1 1 0 0 +EDGE2 2398 1537 -0.973626 -0.0131474 0.00457374 1 0 1 1 0 0 +EDGE2 2398 1577 -0.951963 -0.0339853 -0.0307505 1 0 1 1 0 0 +EDGE2 2398 1857 -0.913806 -0.0795033 0.00972204 1 0 1 1 0 0 +EDGE2 2398 2377 -0.950945 -0.0284507 -0.00670477 1 0 1 1 0 0 +EDGE2 2398 2397 -0.931987 -0.119718 0.0204991 1 0 1 1 0 0 +EDGE2 2398 1657 -0.973567 0.0179061 -0.0141911 1 0 1 1 0 0 +EDGE2 2398 1377 -1.04512 0.00350641 0.0110294 1 0 1 1 0 0 +EDGE2 2399 1540 1.00209 0.0748733 -0.0226208 1 0 1 1 0 0 +EDGE2 2399 1860 1.00923 -0.066758 0.0265693 1 0 1 1 0 0 +EDGE2 2399 2380 0.939983 0.00217375 -0.00663733 1 0 1 1 0 0 +EDGE2 2399 1580 1.02982 0.0423269 0.00250432 1 0 1 1 0 0 +EDGE2 2399 1660 0.989324 0.00902591 -0.00828789 1 0 1 1 0 0 +EDGE2 2399 1840 0.972618 -0.0604655 -3.15405 1 0 1 1 0 0 +EDGE2 2399 1560 1.08999 0.0127697 -3.15235 1 0 1 1 0 0 +EDGE2 2399 1380 0.982092 -0.0484391 -0.00576979 1 0 1 1 0 0 +EDGE2 2399 1378 -0.9487 -0.0237281 -0.00403917 1 0 1 1 0 0 +EDGE2 2399 1858 -1.04532 -0.0685744 -0.0272305 1 0 1 1 0 0 +EDGE2 2399 1579 -0.0387036 -0.0179382 -0.0285807 1 0 1 1 0 0 +EDGE2 2399 1859 0.072352 -0.0336579 -0.0095589 1 0 1 1 0 0 +EDGE2 2399 2379 0.0715832 0.0162653 -0.0280648 1 0 1 1 0 0 +EDGE2 2399 1659 -0.00763328 0.0746282 0.0284705 1 0 1 1 0 0 +EDGE2 2399 2398 -1.03974 -0.0455657 -0.0152171 1 0 1 1 0 0 +EDGE2 2399 1379 -0.0300987 -0.0160483 0.0186254 1 0 1 1 0 0 +EDGE2 2399 1539 -0.0705405 0.000301599 0.00055094 1 0 1 1 0 0 +EDGE2 2399 2378 -0.99451 -0.0554148 0.0101593 1 0 1 1 0 0 +EDGE2 2399 1578 -0.950833 0.0512465 0.0255479 1 0 1 1 0 0 +EDGE2 2399 1658 -0.997216 -0.00533487 -0.00583225 1 0 1 1 0 0 +EDGE2 2399 1538 -0.931449 -0.0089348 0.0202201 1 0 1 1 0 0 +EDGE2 2400 1839 0.978084 -0.0164126 -3.15478 1 0 1 1 0 0 +EDGE2 2400 1559 0.995109 -0.0697785 -3.1649 1 0 1 1 0 0 +EDGE2 2400 1540 0.0358508 0.0127269 -0.000729533 1 0 1 1 0 0 +EDGE2 2400 1861 0.00988716 -1.09181 -1.53297 1 0 1 1 0 0 +EDGE2 2400 1860 0.0376826 -0.0641522 -0.0219424 1 0 1 1 0 0 +EDGE2 2400 1381 -0.0240404 -1.06701 -1.59614 1 0 1 1 0 0 +EDGE2 2400 1661 -0.0049967 -0.924546 -1.57098 1 0 1 1 0 0 +EDGE2 2400 2380 0.0204855 -0.0070662 -0.0157544 1 0 1 1 0 0 +EDGE2 2400 1580 0.014013 -0.0126222 -0.0126041 1 0 1 1 0 0 +EDGE2 2400 1660 0.0708887 0.00256261 0.0357357 1 0 1 1 0 0 +EDGE2 2400 1840 -0.0655158 0.025612 -3.19083 1 0 1 1 0 0 +EDGE2 2400 1560 0.0325171 -0.00928004 -3.16718 1 0 1 1 0 0 +EDGE2 2400 1581 0.0682929 0.923457 1.59208 1 0 1 1 0 0 +EDGE2 2400 2381 0.0360985 0.976235 1.5598 1 0 1 1 0 0 +EDGE2 2400 1380 0.0187348 0.00368589 0.00767399 1 0 1 1 0 0 +EDGE2 2400 1841 0.018303 1.01011 1.5837 1 0 1 1 0 0 +EDGE2 2400 1541 0.0761353 1.00644 1.578 1 0 1 1 0 0 +EDGE2 2400 1561 0.0879009 0.923811 1.56144 1 0 1 1 0 0 +EDGE2 2400 1579 -1.00122 -0.00863699 -0.00706349 1 0 1 1 0 0 +EDGE2 2400 1859 -1.07933 -0.0447881 0.0340223 1 0 1 1 0 0 +EDGE2 2400 2379 -1.09105 -0.0288467 0.0129455 1 0 1 1 0 0 +EDGE2 2400 2399 -0.994374 0.0108394 -0.00373848 1 0 1 1 0 0 +EDGE2 2400 1659 -0.996269 -0.0153779 -0.0416441 1 0 1 1 0 0 +EDGE2 2400 1379 -0.895278 0.0366617 0.00962019 1 0 1 1 0 0 +EDGE2 2400 1539 -1.04775 0.000953042 0.0314333 1 0 1 1 0 0 +EDGE2 2401 1540 -1.02708 0.00595839 -1.58297 1 0 1 1 0 0 +EDGE2 2401 1860 -0.974884 -0.0238777 -1.54266 1 0 1 1 0 0 +EDGE2 2401 2400 -1.01725 -0.067642 -1.58606 1 0 1 1 0 0 +EDGE2 2401 2380 -1.08167 -0.0441985 -1.58645 1 0 1 1 0 0 +EDGE2 2401 1580 -1.02169 -0.046678 -1.56448 1 0 1 1 0 0 +EDGE2 2401 1660 -0.967775 -0.0121329 -1.58034 1 0 1 1 0 0 +EDGE2 2401 1840 -0.921154 0.00718246 1.58416 1 0 1 1 0 0 +EDGE2 2401 1560 -1.0083 -0.105794 1.56081 1 0 1 1 0 0 +EDGE2 2401 1842 0.934609 -0.0507412 0.00324922 1 0 1 1 0 0 +EDGE2 2401 1581 0.0571953 -0.0263342 -0.0336445 1 0 1 1 0 0 +EDGE2 2401 2381 -0.0344821 -0.024629 -0.0234929 1 0 1 1 0 0 +EDGE2 2401 1380 -1.06737 0.0470824 -1.58446 1 0 1 1 0 0 +EDGE2 2401 1841 0.00984764 0.153752 0.00578085 1 0 1 1 0 0 +EDGE2 2401 1541 -0.0108372 -0.023341 -0.0164609 1 0 1 1 0 0 +EDGE2 2401 1561 -0.0250805 -0.0641489 -0.0282362 1 0 1 1 0 0 +EDGE2 2401 2382 0.957928 0.000355682 -0.0222827 1 0 1 1 0 0 +EDGE2 2401 1542 1.01485 0.0443052 -0.0309321 1 0 1 1 0 0 +EDGE2 2401 1562 0.9922 -0.00160143 -0.0049046 1 0 1 1 0 0 +EDGE2 2401 1582 0.957033 0.0432814 0.0121261 1 0 1 1 0 0 +EDGE2 2402 1543 0.946099 -0.0045424 -0.0226851 1 0 1 1 0 0 +EDGE2 2402 1842 0.0257252 0.0394292 0.0218447 1 0 1 1 0 0 +EDGE2 2402 1581 -1.01033 0.00168522 -0.00186155 1 0 1 1 0 0 +EDGE2 2402 2381 -1.0618 -0.0379455 -0.00820582 1 0 1 1 0 0 +EDGE2 2402 2401 -0.987191 0.066663 -0.00980797 1 0 1 1 0 0 +EDGE2 2402 1841 -0.944521 -0.0140391 -0.0171739 1 0 1 1 0 0 +EDGE2 2402 1541 -0.936632 0.0302033 -0.0282614 1 0 1 1 0 0 +EDGE2 2402 1561 -0.973451 0.0135341 -0.0150963 1 0 1 1 0 0 +EDGE2 2402 2382 0.0415448 0.00526467 -0.015265 1 0 1 1 0 0 +EDGE2 2402 2383 1.09212 -0.0225186 0.00852503 1 0 1 1 0 0 +EDGE2 2402 1542 -0.0577683 -0.0403969 0.0128925 1 0 1 1 0 0 +EDGE2 2402 1562 0.00455347 -0.0582823 -0.00503599 1 0 1 1 0 0 +EDGE2 2402 1582 0.0852932 -0.0512606 -0.000351796 1 0 1 1 0 0 +EDGE2 2402 1583 1.04925 0.0080381 -0.0103021 1 0 1 1 0 0 +EDGE2 2402 1843 0.985744 0.0669997 0.0102843 1 0 1 1 0 0 +EDGE2 2402 1563 0.99249 -0.0483029 0.0234191 1 0 1 1 0 0 +EDGE2 2403 1543 -0.035427 0.0521133 -0.0107253 1 0 1 1 0 0 +EDGE2 2403 1842 -0.973924 0.0110258 0.0164841 1 0 1 1 0 0 +EDGE2 2403 2402 -0.957959 0.0221753 0.0163602 1 0 1 1 0 0 +EDGE2 2403 2382 -0.991216 -0.0297647 0.0344786 1 0 1 1 0 0 +EDGE2 2403 2383 0.00901847 -0.00517911 0.0109611 1 0 1 1 0 0 +EDGE2 2403 1542 -0.943917 0.0888054 -0.0150842 1 0 1 1 0 0 +EDGE2 2403 1562 -1.05219 -0.0244696 -0.00524748 1 0 1 1 0 0 +EDGE2 2403 1582 -0.955141 -0.0365527 0.00913247 1 0 1 1 0 0 +EDGE2 2403 1583 -0.032204 0.0339898 0.0150085 1 0 1 1 0 0 +EDGE2 2403 1843 0.0126506 0.0337612 0.0282647 1 0 1 1 0 0 +EDGE2 2403 1563 0.00932781 0.041139 -0.020993 1 0 1 1 0 0 +EDGE2 2403 1564 0.975031 -0.0341358 -0.0133222 1 0 1 1 0 0 +EDGE2 2403 1844 0.965344 0.0431945 -0.00959581 1 0 1 1 0 0 +EDGE2 2403 2384 1.06158 0.0871833 0.0205159 1 0 1 1 0 0 +EDGE2 2403 1584 1.01879 -0.0094325 0.066824 1 0 1 1 0 0 +EDGE2 2403 1544 1.03621 -0.0424536 -0.0131331 1 0 1 1 0 0 +EDGE2 2404 1543 -1.06258 -0.0798233 0.00699461 1 0 1 1 0 0 +EDGE2 2404 2383 -1.05661 0.00527616 -0.0167989 1 0 1 1 0 0 +EDGE2 2404 2403 -1.03385 -0.0422396 0.000507157 1 0 1 1 0 0 +EDGE2 2404 1583 -1.09641 0.0363274 0.0413926 1 0 1 1 0 0 +EDGE2 2404 1843 -0.877555 -0.0675184 0.00844957 1 0 1 1 0 0 +EDGE2 2404 1563 -0.931653 0.0426184 0.0222252 1 0 1 1 0 0 +EDGE2 2404 1564 -0.0982339 -0.0316277 -0.0422869 1 0 1 1 0 0 +EDGE2 2404 1844 -0.0273206 -0.0325594 -0.00485554 1 0 1 1 0 0 +EDGE2 2404 2384 -0.0210139 0.0114116 0.0178552 1 0 1 1 0 0 +EDGE2 2404 1584 0.0281713 0.0905142 -0.0143618 1 0 1 1 0 0 +EDGE2 2404 1544 0.0419831 -0.0118398 0.028638 1 0 1 1 0 0 +EDGE2 2404 1265 1.10448 -0.0288383 -3.1403 1 0 1 1 0 0 +EDGE2 2404 2305 1.06358 -0.0504425 -3.14803 1 0 1 1 0 0 +EDGE2 2404 2385 1.04929 0.0070215 0.0233552 1 0 1 1 0 0 +EDGE2 2404 1565 0.947926 0.0371822 -0.015267 1 0 1 1 0 0 +EDGE2 2404 1585 1.05022 0.0187651 0.0208739 1 0 1 1 0 0 +EDGE2 2404 1845 1.06464 -0.0926506 0.000547599 1 0 1 1 0 0 +EDGE2 2404 1545 0.950787 -0.112828 -0.0282827 1 0 1 1 0 0 +EDGE2 2405 1564 -1.00092 -0.0285278 -0.0185568 1 0 1 1 0 0 +EDGE2 2405 1844 -1.00267 0.0610798 -0.00957143 1 0 1 1 0 0 +EDGE2 2405 2384 -1.01781 0.0188919 -0.0109115 1 0 1 1 0 0 +EDGE2 2405 2404 -1.03284 0.027461 -0.0100225 1 0 1 1 0 0 +EDGE2 2405 1584 -1.04496 -0.0245506 0.00738629 1 0 1 1 0 0 +EDGE2 2405 1544 -0.976529 -0.0215697 0.0060617 1 0 1 1 0 0 +EDGE2 2405 1546 0.00250149 -1.10088 -1.58972 1 0 1 1 0 0 +EDGE2 2405 1265 0.017079 -0.0365995 -3.1617 1 0 1 1 0 0 +EDGE2 2405 2305 -0.0293489 -0.0433864 -3.12464 1 0 1 1 0 0 +EDGE2 2405 2385 -0.0465823 -0.0271182 0.0102915 1 0 1 1 0 0 +EDGE2 2405 1565 0.0875429 -0.0345041 0.00798047 1 0 1 1 0 0 +EDGE2 2405 1585 -0.0815344 -0.0242586 -0.0101171 1 0 1 1 0 0 +EDGE2 2405 1845 -0.0833671 0.051768 -0.0181398 1 0 1 1 0 0 +EDGE2 2405 1545 -0.0861139 -0.041454 0.00713794 1 0 1 1 0 0 +EDGE2 2405 1264 1.0506 -0.0412008 -3.1356 1 0 1 1 0 0 +EDGE2 2405 2304 0.927236 0.0451562 -3.14817 1 0 1 1 0 0 +EDGE2 2405 1566 0.0412204 1.01498 1.56551 1 0 1 1 0 0 +EDGE2 2405 1846 -0.0110169 0.972912 1.57278 1 0 1 1 0 0 +EDGE2 2405 2306 0.0322945 0.936012 1.5496 1 0 1 1 0 0 +EDGE2 2405 2386 0.0266415 0.911928 1.56838 1 0 1 1 0 0 +EDGE2 2405 1586 -0.00662257 1.04647 1.59025 1 0 1 1 0 0 +EDGE2 2405 1266 0.0276592 1.08132 1.56958 1 0 1 1 0 0 +EDGE2 2406 1547 1.01475 0.022729 -0.0327664 1 0 1 1 0 0 +EDGE2 2406 1546 -0.0476568 0.0228552 0.0144306 1 0 1 1 0 0 +EDGE2 2406 1265 -1.04491 -0.0584429 -1.53975 1 0 1 1 0 0 +EDGE2 2406 2305 -1.01787 0.00377335 -1.57236 1 0 1 1 0 0 +EDGE2 2406 2405 -0.992399 -0.0638354 1.61354 1 0 1 1 0 0 +EDGE2 2406 2385 -1.07981 -0.165309 1.55594 1 0 1 1 0 0 +EDGE2 2406 1565 -0.948926 -0.0476893 1.56088 1 0 1 1 0 0 +EDGE2 2406 1585 -0.99991 -0.0466557 1.58167 1 0 1 1 0 0 +EDGE2 2406 1845 -1.12642 0.00854357 1.53393 1 0 1 1 0 0 +EDGE2 2406 1545 -0.993026 0.0403561 1.55997 1 0 1 1 0 0 +EDGE2 2407 1548 0.896438 -0.0385336 -0.0243288 1 0 1 1 0 0 +EDGE2 2407 1547 0.0110438 0.0411422 0.000808119 1 0 1 1 0 0 +EDGE2 2407 2406 -0.933228 -0.0795813 0.0628233 1 0 1 1 0 0 +EDGE2 2407 1546 -1.00995 0.00405866 -0.00898252 1 0 1 1 0 0 +EDGE2 2408 1549 1.01606 0.0421242 0.0131199 1 0 1 1 0 0 +EDGE2 2408 1548 0.0580843 -0.0290646 -0.00163342 1 0 1 1 0 0 +EDGE2 2408 1547 -1.01581 0.0068028 -0.0065745 1 0 1 1 0 0 +EDGE2 2408 2407 -0.982059 -0.010456 -0.0284735 1 0 1 1 0 0 +EDGE2 2409 1550 0.999596 -0.000343102 0.0125361 1 0 1 1 0 0 +EDGE2 2409 1830 0.939953 -0.0406548 -3.12134 1 0 1 1 0 0 +EDGE2 2409 1549 -0.0388712 0.0012861 -0.0011524 1 0 1 1 0 0 +EDGE2 2409 1548 -0.909126 0.0133965 -0.0308238 1 0 1 1 0 0 +EDGE2 2409 2408 -1.02619 -0.0357629 0.0211143 1 0 1 1 0 0 +EDGE2 2410 1829 1.02269 0.00325084 -3.09508 1 0 1 1 0 0 +EDGE2 2410 1831 0.0353951 -0.959921 -1.56447 1 0 1 1 0 0 +EDGE2 2410 1551 0.0221476 -0.980918 -1.59797 1 0 1 1 0 0 +EDGE2 2410 1550 0.00158908 0.0664778 0.00267586 1 0 1 1 0 0 +EDGE2 2410 1830 -0.0100475 0.0536997 -3.14475 1 0 1 1 0 0 +EDGE2 2410 1549 -1.03502 -0.0553792 -0.00668095 1 0 1 1 0 0 +EDGE2 2410 2409 -0.950672 -0.0348841 -0.0406503 1 0 1 1 0 0 +EDGE2 2411 1550 -0.924354 0.0672994 -1.59666 1 0 1 1 0 0 +EDGE2 2411 1830 -0.923152 -0.0306007 1.55056 1 0 1 1 0 0 +EDGE2 2411 2410 -1.03912 0.0643034 -1.6057 1 0 1 1 0 0 +EDGE2 2412 2411 -1.07287 -0.00224615 0.00963858 1 0 1 1 0 0 +EDGE2 2413 2412 -0.951812 -0.0121879 -0.0116914 1 0 1 1 0 0 +EDGE2 2414 2413 -1.02159 -0.0389736 -0.0148101 1 0 1 1 0 0 +EDGE2 2414 1235 0.984634 0.0611816 -3.16125 1 0 1 1 0 0 +EDGE2 2414 2295 1.08767 0.0312509 -3.11 1 0 1 1 0 0 +EDGE2 2414 1255 1.038 -0.00246415 -3.1649 1 0 1 1 0 0 +EDGE2 2415 1236 0.0228305 -1.01013 -1.59697 1 0 1 1 0 0 +EDGE2 2415 2414 -1.08304 -0.0185295 0.000454202 1 0 1 1 0 0 +EDGE2 2415 1235 -0.0620878 -0.0810883 -3.17053 1 0 1 1 0 0 +EDGE2 2415 2295 -0.0341192 0.0683666 -3.13114 1 0 1 1 0 0 +EDGE2 2415 1255 0.00185228 0.00197267 -3.12296 1 0 1 1 0 0 +EDGE2 2415 1254 0.945733 -0.076843 -3.16433 1 0 1 1 0 0 +EDGE2 2415 2294 0.945716 -0.0301248 -3.11438 1 0 1 1 0 0 +EDGE2 2415 1234 0.966482 -0.0173509 -3.14487 1 0 1 1 0 0 +EDGE2 2415 1256 -0.0521495 0.952365 1.54911 1 0 1 1 0 0 +EDGE2 2415 2296 -0.0696439 0.872548 1.54758 1 0 1 1 0 0 +EDGE2 2416 1235 -1.0292 -0.0062313 1.60136 1 0 1 1 0 0 +EDGE2 2416 2295 -1.05962 -0.0431031 1.5727 1 0 1 1 0 0 +EDGE2 2416 2415 -1.05711 -0.0139515 -1.57631 1 0 1 1 0 0 +EDGE2 2416 1255 -1.02234 0.0240556 1.58487 1 0 1 1 0 0 +EDGE2 2416 1256 -0.083322 -0.0885841 0.00569625 1 0 1 1 0 0 +EDGE2 2416 2296 0.00656796 -0.0151071 0.0220605 1 0 1 1 0 0 +EDGE2 2416 2297 1.02819 0.111781 0.0509567 1 0 1 1 0 0 +EDGE2 2416 1257 0.985126 -0.0347159 -0.00635324 1 0 1 1 0 0 +EDGE2 2417 2416 -0.921605 -0.089339 0.0322234 1 0 1 1 0 0 +EDGE2 2417 1256 -1.03909 0.0841839 0.00894962 1 0 1 1 0 0 +EDGE2 2417 2296 -0.966985 0.0163125 0.00211888 1 0 1 1 0 0 +EDGE2 2417 2297 0.0131426 -0.0352465 -0.0221697 1 0 1 1 0 0 +EDGE2 2417 1257 0.0274626 -0.015396 0.0217498 1 0 1 1 0 0 +EDGE2 2417 2298 1.01419 -0.0236659 0.0149152 1 0 1 1 0 0 +EDGE2 2417 1258 1.0295 0.0676832 -0.00224571 1 0 1 1 0 0 +EDGE2 2418 2297 -1.00514 0.0816707 -0.0112738 1 0 1 1 0 0 +EDGE2 2418 2417 -0.97405 0.0300584 -0.00282912 1 0 1 1 0 0 +EDGE2 2418 1257 -0.993242 -0.0434524 -0.0138367 1 0 1 1 0 0 +EDGE2 2418 2298 -0.00840909 -0.00903428 0.0286844 1 0 1 1 0 0 +EDGE2 2418 1258 0.0685339 0.078326 -0.0130377 1 0 1 1 0 0 +EDGE2 2418 2299 0.970277 0.105176 0.0215863 1 0 1 1 0 0 +EDGE2 2418 1259 0.986899 -0.0048209 -0.0215474 1 0 1 1 0 0 +EDGE2 2419 2298 -0.979491 -0.0077452 0.0237194 1 0 1 1 0 0 +EDGE2 2419 2418 -0.971511 -0.0415662 0.00510188 1 0 1 1 0 0 +EDGE2 2419 1258 -1.03268 0.00146858 -0.0108773 1 0 1 1 0 0 +EDGE2 2419 2299 0.01359 -0.0167288 0.00425997 1 0 1 1 0 0 +EDGE2 2419 1259 -0.0523759 -0.0284766 0.0173583 1 0 1 1 0 0 +EDGE2 2419 2300 0.986309 -0.072376 0.0102223 1 0 1 1 0 0 +EDGE2 2419 1260 1.04102 -0.0264988 0.0168872 1 0 1 1 0 0 +EDGE2 2420 2301 0.0347579 0.94612 1.5644 1 0 1 1 0 0 +EDGE2 2420 1261 -0.0131414 1.03204 1.58301 1 0 1 1 0 0 +EDGE2 2420 2299 -0.893393 -0.00779703 -0.0120082 1 0 1 1 0 0 +EDGE2 2420 2419 -1.00861 -0.0333561 0.0198375 1 0 1 1 0 0 +EDGE2 2420 1259 -0.926672 -0.0798282 0.00533915 1 0 1 1 0 0 +EDGE2 2420 2300 0.0318712 0.00662662 -0.0422296 1 0 1 1 0 0 +EDGE2 2420 1260 -0.0571867 -0.041485 0.00358942 1 0 1 1 0 0 +EDGE2 2421 2302 1.06255 -0.123748 0.0192139 1 0 1 1 0 0 +EDGE2 2421 1262 0.931844 -0.0726036 -0.0201297 1 0 1 1 0 0 +EDGE2 2421 2301 0.0629422 0.105522 0.0155863 1 0 1 1 0 0 +EDGE2 2421 1261 -0.0196893 -0.0373171 0.00799886 1 0 1 1 0 0 +EDGE2 2421 2420 -1.01559 0.0727216 -1.53893 1 0 1 1 0 0 +EDGE2 2421 2300 -1.02953 0.0757471 -1.59503 1 0 1 1 0 0 +EDGE2 2421 1260 -1.02235 0.0443955 -1.58542 1 0 1 1 0 0 +EDGE2 2422 2302 0.0516071 -0.004231 0.00473957 1 0 1 1 0 0 +EDGE2 2422 2303 0.941217 0.0720014 0.0112141 1 0 1 1 0 0 +EDGE2 2422 1263 0.948219 -0.0334493 0.0203627 1 0 1 1 0 0 +EDGE2 2422 1262 -0.0204909 0.0361166 0.0228058 1 0 1 1 0 0 +EDGE2 2422 2301 -1.04377 -0.0873252 0.0280713 1 0 1 1 0 0 +EDGE2 2422 2421 -0.947715 -0.0621831 -0.0013717 1 0 1 1 0 0 +EDGE2 2422 1261 -0.94308 0.00322951 -0.015217 1 0 1 1 0 0 +EDGE2 2423 1264 1.05409 -0.0414326 0.0257867 1 0 1 1 0 0 +EDGE2 2423 2304 1.05422 0.0874765 0.0243137 1 0 1 1 0 0 +EDGE2 2423 2302 -0.94851 0.0490327 -0.0227111 1 0 1 1 0 0 +EDGE2 2423 2303 -0.0319492 0.0876242 0.0309922 1 0 1 1 0 0 +EDGE2 2423 1263 0.00413525 0.0846837 0.027576 1 0 1 1 0 0 +EDGE2 2423 2422 -1.00559 0.0361286 -0.00624554 1 0 1 1 0 0 +EDGE2 2423 1262 -0.902125 -0.016233 -0.0097183 1 0 1 1 0 0 +EDGE2 2424 1265 0.98232 0.0135017 0.00524286 1 0 1 1 0 0 +EDGE2 2424 2305 0.974889 -0.0564468 0.0110715 1 0 1 1 0 0 +EDGE2 2424 2405 1.01082 0.00993466 -3.15127 1 0 1 1 0 0 +EDGE2 2424 2385 1.00078 0.0017444 -3.16869 1 0 1 1 0 0 +EDGE2 2424 1565 1.03489 -0.0431009 -3.14762 1 0 1 1 0 0 +EDGE2 2424 1585 1.02077 -0.0269206 -3.19313 1 0 1 1 0 0 +EDGE2 2424 1845 0.939521 -0.0157437 -3.17288 1 0 1 1 0 0 +EDGE2 2424 1545 1.05441 0.0258812 -3.12577 1 0 1 1 0 0 +EDGE2 2424 1264 0.0438163 0.0242262 0.0265897 1 0 1 1 0 0 +EDGE2 2424 2304 -0.0831885 0.0679398 -0.0100325 1 0 1 1 0 0 +EDGE2 2424 2303 -0.96849 0.0699523 0.00464069 1 0 1 1 0 0 +EDGE2 2424 2423 -0.968835 -0.0361217 -0.0197593 1 0 1 1 0 0 +EDGE2 2424 1263 -0.992626 -0.0318103 3.98428e-05 1 0 1 1 0 0 +EDGE2 2425 1564 0.969636 -0.047673 -3.14901 1 0 1 1 0 0 +EDGE2 2425 1844 1.00054 -0.0138333 -3.11835 1 0 1 1 0 0 +EDGE2 2425 2384 0.963301 -0.0423874 -3.15321 1 0 1 1 0 0 +EDGE2 2425 2404 0.952577 0.0139362 -3.14457 1 0 1 1 0 0 +EDGE2 2425 1584 1.00941 0.043262 -3.10915 1 0 1 1 0 0 +EDGE2 2425 1544 0.970671 0.00717468 -3.16331 1 0 1 1 0 0 +EDGE2 2425 2406 0.00358402 0.950617 1.56587 1 0 1 1 0 0 +EDGE2 2425 1546 -0.0324695 1.00607 1.55374 1 0 1 1 0 0 +EDGE2 2425 1265 0.0612147 -0.0371988 0.0236533 1 0 1 1 0 0 +EDGE2 2425 2305 0.0229812 -0.0481087 0.0150887 1 0 1 1 0 0 +EDGE2 2425 2405 0.0705961 0.0137384 -3.13969 1 0 1 1 0 0 +EDGE2 2425 2385 0.099512 0.02259 -3.14625 1 0 1 1 0 0 +EDGE2 2425 1565 0.0330802 -0.10013 -3.14296 1 0 1 1 0 0 +EDGE2 2425 1585 -0.119357 0.0758326 -3.14557 1 0 1 1 0 0 +EDGE2 2425 1845 -0.0730254 -0.115658 -3.16042 1 0 1 1 0 0 +EDGE2 2425 1545 -0.00443723 0.0465753 -3.15199 1 0 1 1 0 0 +EDGE2 2425 2424 -0.938652 0.0503575 0.0205197 1 0 1 1 0 0 +EDGE2 2425 1264 -0.982937 -0.0520357 0.0126648 1 0 1 1 0 0 +EDGE2 2425 2304 -0.97064 -0.019618 -0.0169389 1 0 1 1 0 0 +EDGE2 2425 1566 -0.0020356 -0.991422 -1.58267 1 0 1 1 0 0 +EDGE2 2425 1846 -0.0989733 -0.95306 -1.56687 1 0 1 1 0 0 +EDGE2 2425 2306 -0.0384086 -1.03172 -1.55702 1 0 1 1 0 0 +EDGE2 2425 2386 -0.00620158 -0.948283 -1.5467 1 0 1 1 0 0 +EDGE2 2425 1586 -0.00996961 -0.996151 -1.58067 1 0 1 1 0 0 +EDGE2 2425 1266 0.0110736 -1.0071 -1.58615 1 0 1 1 0 0 +EDGE2 2426 1547 0.96472 -0.0558874 -0.00224381 1 0 1 1 0 0 +EDGE2 2426 2407 1.05155 0.0560527 -0.00296483 1 0 1 1 0 0 +EDGE2 2426 2406 0.0517998 -0.0558268 0.0225435 1 0 1 1 0 0 +EDGE2 2426 1546 0.0466361 0.0173233 -0.00382591 1 0 1 1 0 0 +EDGE2 2426 1265 -1.00189 -0.00767171 -1.61224 1 0 1 1 0 0 +EDGE2 2426 2305 -0.94646 0.0257469 -1.57635 1 0 1 1 0 0 +EDGE2 2426 2405 -0.982402 -0.0746178 1.5721 1 0 1 1 0 0 +EDGE2 2426 2425 -0.952967 -0.00885029 -1.57667 1 0 1 1 0 0 +EDGE2 2426 2385 -0.973426 0.0683586 1.59427 1 0 1 1 0 0 +EDGE2 2426 1565 -0.975931 -0.0816998 1.57771 1 0 1 1 0 0 +EDGE2 2426 1585 -0.930248 0.0620819 1.53353 1 0 1 1 0 0 +EDGE2 2426 1845 -0.990775 -0.0122394 1.56767 1 0 1 1 0 0 +EDGE2 2426 1545 -0.961825 0.0100488 1.56149 1 0 1 1 0 0 +EDGE2 2427 1548 1.02498 -0.00441963 0.0232481 1 0 1 1 0 0 +EDGE2 2427 2408 0.979936 -0.0536512 -0.048269 1 0 1 1 0 0 +EDGE2 2427 2426 -1.00852 -0.0715195 -0.0173488 1 0 1 1 0 0 +EDGE2 2427 1547 -0.103202 0.0300479 0.0336044 1 0 1 1 0 0 +EDGE2 2427 2407 0.030314 -0.0591352 0.0257165 1 0 1 1 0 0 +EDGE2 2427 2406 -0.968998 0.0134923 0.00378236 1 0 1 1 0 0 +EDGE2 2427 1546 -0.949122 -0.0474716 -0.0297231 1 0 1 1 0 0 +EDGE2 2428 1549 1.06173 -0.0900732 -0.0118194 1 0 1 1 0 0 +EDGE2 2428 2409 0.958081 -0.00842744 0.0119024 1 0 1 1 0 0 +EDGE2 2428 1548 -0.0372016 -0.0607302 -0.0313105 1 0 1 1 0 0 +EDGE2 2428 2408 0.129802 0.0518569 -0.004379 1 0 1 1 0 0 +EDGE2 2428 1547 -1.10037 -0.0834377 0.0270603 1 0 1 1 0 0 +EDGE2 2428 2427 -0.963059 0.11474 -0.0187124 1 0 1 1 0 0 +EDGE2 2428 2407 -1.06246 -0.0182409 -0.0130859 1 0 1 1 0 0 +EDGE2 2429 1550 1.02568 0.00637306 0.0210465 1 0 1 1 0 0 +EDGE2 2429 1830 1.11883 0.0035261 -3.14025 1 0 1 1 0 0 +EDGE2 2429 2410 0.982275 0.0055467 -0.0129884 1 0 1 1 0 0 +EDGE2 2429 1549 -0.0318536 0.0797195 -0.020737 1 0 1 1 0 0 +EDGE2 2429 2409 -0.0119535 -0.0495044 0.0196497 1 0 1 1 0 0 +EDGE2 2429 1548 -0.980639 0.019426 -0.0102683 1 0 1 1 0 0 +EDGE2 2429 2408 -1.03195 0.0558491 -0.0210113 1 0 1 1 0 0 +EDGE2 2429 2428 -0.969437 -0.0026918 0.0179042 1 0 1 1 0 0 +EDGE2 2430 1829 1.00747 -0.00170531 -3.16572 1 0 1 1 0 0 +EDGE2 2430 1831 -0.0575325 -0.962933 -1.54975 1 0 1 1 0 0 +EDGE2 2430 1551 -0.0236767 -0.962254 -1.60894 1 0 1 1 0 0 +EDGE2 2430 2411 0.0650208 1.11761 1.56278 1 0 1 1 0 0 +EDGE2 2430 1550 -0.0533948 0.0685661 0.0378655 1 0 1 1 0 0 +EDGE2 2430 1830 -0.0224119 -0.0713966 -3.13787 1 0 1 1 0 0 +EDGE2 2430 2410 -0.0902297 0.0866167 0.0099185 1 0 1 1 0 0 +EDGE2 2430 2429 -0.998897 0.00727804 0.0210425 1 0 1 1 0 0 +EDGE2 2430 1549 -1.04753 0.00680693 0.00434605 1 0 1 1 0 0 +EDGE2 2430 2409 -0.979751 0.00766507 0.0198997 1 0 1 1 0 0 +EDGE2 2431 2411 0.021414 0.00575095 0.00357579 1 0 1 1 0 0 +EDGE2 2431 2430 -0.969093 0.00810813 -1.56117 1 0 1 1 0 0 +EDGE2 2431 1550 -1.03477 -0.116776 -1.54477 1 0 1 1 0 0 +EDGE2 2431 1830 -1.00503 -0.0587068 1.55379 1 0 1 1 0 0 +EDGE2 2431 2410 -0.897765 -0.0119405 -1.56597 1 0 1 1 0 0 +EDGE2 2431 2412 1.01259 0.032181 0.0352551 1 0 1 1 0 0 +EDGE2 2432 2411 -1.01869 0.0264328 -0.0111084 1 0 1 1 0 0 +EDGE2 2432 2431 -1.02649 -0.055893 0.0183944 1 0 1 1 0 0 +EDGE2 2432 2412 -0.00694946 -0.0341427 -0.0156559 1 0 1 1 0 0 +EDGE2 2432 2413 1.05028 -0.0260819 0.00217541 1 0 1 1 0 0 +EDGE2 2433 2432 -1.00027 0.0418403 0.0193167 1 0 1 1 0 0 +EDGE2 2433 2412 -0.887121 -0.0318981 0.0125325 1 0 1 1 0 0 +EDGE2 2433 2413 0.0074995 -0.0549049 -0.00424631 1 0 1 1 0 0 +EDGE2 2433 2414 1.06961 -0.042631 -0.00128757 1 0 1 1 0 0 +EDGE2 2434 2413 -0.999515 0.182567 -0.0117054 1 0 1 1 0 0 +EDGE2 2434 2433 -0.999911 0.0197396 -0.0148355 1 0 1 1 0 0 +EDGE2 2434 2414 -0.0329494 -0.00761274 0.0216325 1 0 1 1 0 0 +EDGE2 2434 1235 1.07814 -0.00678314 -3.16263 1 0 1 1 0 0 +EDGE2 2434 2295 0.987877 -0.0321378 -3.1584 1 0 1 1 0 0 +EDGE2 2434 2415 0.965317 -0.0626393 -0.0155244 1 0 1 1 0 0 +EDGE2 2434 1255 1.06474 -0.0254579 -3.15624 1 0 1 1 0 0 +EDGE2 2435 2416 -0.0142287 1.01829 1.54578 1 0 1 1 0 0 +EDGE2 2435 1236 -0.0426594 -0.95463 -1.57419 1 0 1 1 0 0 +EDGE2 2435 2414 -0.985209 -0.0769775 -0.0028775 1 0 1 1 0 0 +EDGE2 2435 2434 -1.06454 0.076625 -0.0118517 1 0 1 1 0 0 +EDGE2 2435 1235 -0.018122 0.0530577 -3.12804 1 0 1 1 0 0 +EDGE2 2435 2295 0.00746301 0.0265387 -3.10328 1 0 1 1 0 0 +EDGE2 2435 2415 0.00289384 -0.100706 -0.00297588 1 0 1 1 0 0 +EDGE2 2435 1255 0.0244112 -0.0706415 -3.12694 1 0 1 1 0 0 +EDGE2 2435 1254 1.04211 0.0654109 -3.12055 1 0 1 1 0 0 +EDGE2 2435 2294 1.10507 0.0451652 -3.1839 1 0 1 1 0 0 +EDGE2 2435 1234 0.960578 -0.0662833 -3.15981 1 0 1 1 0 0 +EDGE2 2435 1256 0.0491723 0.969242 1.58413 1 0 1 1 0 0 +EDGE2 2435 2296 0.109328 1.04251 1.54823 1 0 1 1 0 0 +EDGE2 2436 2416 0.0250594 0.0231296 0.00643084 1 0 1 1 0 0 +EDGE2 2436 1235 -1.05098 -0.0754596 1.55357 1 0 1 1 0 0 +EDGE2 2436 2295 -1.05761 0.0708639 1.58099 1 0 1 1 0 0 +EDGE2 2436 2415 -1.04004 0.0167765 -1.56468 1 0 1 1 0 0 +EDGE2 2436 2435 -0.949825 0.053666 -1.58909 1 0 1 1 0 0 +EDGE2 2436 1255 -0.997226 0.0544077 1.56597 1 0 1 1 0 0 +EDGE2 2436 1256 0.0109532 -0.0218179 -0.0235131 1 0 1 1 0 0 +EDGE2 2436 2296 -0.02211 -0.00710728 -0.0380941 1 0 1 1 0 0 +EDGE2 2436 2297 1.04486 0.0123418 -0.0111215 1 0 1 1 0 0 +EDGE2 2436 2417 0.959831 -0.0477888 0.0332462 1 0 1 1 0 0 +EDGE2 2436 1257 1.02209 -0.0349228 0.01142 1 0 1 1 0 0 +EDGE2 2437 2416 -0.967829 -0.0819249 -0.0297588 1 0 1 1 0 0 +EDGE2 2437 2436 -1.00731 0.114734 0.0155873 1 0 1 1 0 0 +EDGE2 2437 1256 -0.905641 -0.0150344 0.0141738 1 0 1 1 0 0 +EDGE2 2437 2296 -0.973572 0.0228904 -0.00564323 1 0 1 1 0 0 +EDGE2 2437 2297 0.0149085 -0.10812 0.0189654 1 0 1 1 0 0 +EDGE2 2437 2417 0.00414667 0.00495354 0.0464912 1 0 1 1 0 0 +EDGE2 2437 1257 0.0300312 -0.0697385 0.0597397 1 0 1 1 0 0 +EDGE2 2437 2298 0.992462 -0.0938103 0.0387302 1 0 1 1 0 0 +EDGE2 2437 2418 1.0385 -0.0159299 -0.0318052 1 0 1 1 0 0 +EDGE2 2437 1258 1.05253 -0.0129007 -0.0165492 1 0 1 1 0 0 +EDGE2 2438 2297 -0.947768 0.00742366 -0.0252476 1 0 1 1 0 0 +EDGE2 2438 2417 -1.0186 0.0160848 -0.0213364 1 0 1 1 0 0 +EDGE2 2438 2437 -0.988773 -0.0133418 0.0153587 1 0 1 1 0 0 +EDGE2 2438 1257 -0.985123 -0.0122204 0.00210268 1 0 1 1 0 0 +EDGE2 2438 2298 -0.0189314 -0.0793257 -0.00420747 1 0 1 1 0 0 +EDGE2 2438 2418 -0.0574611 -0.0263804 0.0177603 1 0 1 1 0 0 +EDGE2 2438 1258 0.0325694 -0.00764251 -0.00602278 1 0 1 1 0 0 +EDGE2 2438 2299 1.03251 0.06251 -0.0202103 1 0 1 1 0 0 +EDGE2 2438 2419 0.907427 0.0180781 -0.00903443 1 0 1 1 0 0 +EDGE2 2438 1259 0.955872 0.11035 0.00720773 1 0 1 1 0 0 +EDGE2 2439 2298 -1.08614 -0.0723293 0.0301781 1 0 1 1 0 0 +EDGE2 2439 2418 -0.926997 -0.0220689 -0.00684835 1 0 1 1 0 0 +EDGE2 2439 2438 -0.935239 -0.0127126 -0.00881816 1 0 1 1 0 0 +EDGE2 2439 1258 -0.937171 -0.00312629 0.0127468 1 0 1 1 0 0 +EDGE2 2439 2299 0.00553323 -0.0156923 0.00547479 1 0 1 1 0 0 +EDGE2 2439 2419 0.0188118 0.0106116 -0.00709643 1 0 1 1 0 0 +EDGE2 2439 1259 0.0133969 0.0245363 -0.0043593 1 0 1 1 0 0 +EDGE2 2439 2420 1.03774 0.00485986 0.00536431 1 0 1 1 0 0 +EDGE2 2439 2300 0.986925 0.0125946 0.00128316 1 0 1 1 0 0 +EDGE2 2439 1260 0.976853 -0.023055 0.0331913 1 0 1 1 0 0 +EDGE2 2440 2301 -0.0215396 1.04543 1.551 1 0 1 1 0 0 +EDGE2 2440 2421 -0.00989405 1.09194 1.56218 1 0 1 1 0 0 +EDGE2 2440 1261 -0.00418143 0.98959 1.59018 1 0 1 1 0 0 +EDGE2 2440 2299 -1.11078 0.0439989 -0.0452211 1 0 1 1 0 0 +EDGE2 2440 2419 -0.988981 -0.0327458 0.00584911 1 0 1 1 0 0 +EDGE2 2440 2439 -1.01645 -0.0425137 -0.00905095 1 0 1 1 0 0 +EDGE2 2440 1259 -1.02736 0.00881384 -0.00943056 1 0 1 1 0 0 +EDGE2 2440 2420 -0.00514173 -0.0180559 0.0219504 1 0 1 1 0 0 +EDGE2 2440 2300 -0.0597372 -0.0136443 0.00119541 1 0 1 1 0 0 +EDGE2 2440 1260 -0.0477989 0.0465001 0.0101334 1 0 1 1 0 0 +EDGE2 2441 2420 -0.953198 -0.0385767 1.5661 1 0 1 1 0 0 +EDGE2 2441 2440 -0.97421 -0.0156183 1.53018 1 0 1 1 0 0 +EDGE2 2441 2300 -1.08753 0.0616755 1.53703 1 0 1 1 0 0 +EDGE2 2441 1260 -0.86174 0.0128982 1.55203 1 0 1 1 0 0 +EDGE2 2442 2441 -0.946538 -0.00687919 0.00489251 1 0 1 1 0 0 +EDGE2 2443 2442 -0.987134 -0.0129858 -0.00456288 1 0 1 1 0 0 +EDGE2 2444 2443 -1.00363 -0.0482368 -0.00509877 1 0 1 1 0 0 +EDGE2 2444 1225 1.05045 0.022598 -3.11834 1 0 1 1 0 0 +EDGE2 2445 1226 -0.0297718 -0.931691 -1.55291 1 0 1 1 0 0 +EDGE2 2445 2444 -0.971473 -0.0195698 -0.023893 1 0 1 1 0 0 +EDGE2 2445 1225 -0.08675 0.0482106 -3.15527 1 0 1 1 0 0 +EDGE2 2445 1224 1.08518 -0.0105757 -3.17258 1 0 1 1 0 0 +EDGE2 2446 1227 0.927995 -0.027947 0.0118505 1 0 1 1 0 0 +EDGE2 2446 1226 -0.0863865 0.0443745 0.0260092 1 0 1 1 0 0 +EDGE2 2446 1225 -0.953698 -0.0511443 -1.57397 1 0 1 1 0 0 +EDGE2 2446 2445 -0.969561 0.0239703 1.60825 1 0 1 1 0 0 +EDGE2 2447 1228 1.00735 0.00385063 0.0234345 1 0 1 1 0 0 +EDGE2 2447 1227 -0.00604213 0.0602925 -0.0328502 1 0 1 1 0 0 +EDGE2 2447 2446 -0.939568 -0.0838343 0.0407637 1 0 1 1 0 0 +EDGE2 2447 1226 -1.11631 -0.0222113 0.0161213 1 0 1 1 0 0 +EDGE2 2448 1229 1.02327 -0.0517493 -0.00578126 1 0 1 1 0 0 +EDGE2 2448 1228 -0.0194744 -0.0210896 0.0226693 1 0 1 1 0 0 +EDGE2 2448 1227 -1.1501 0.0465958 0.0133793 1 0 1 1 0 0 +EDGE2 2448 2447 -0.972798 -0.0240371 -0.0100629 1 0 1 1 0 0 +EDGE2 2449 1250 1.11541 0.029033 -3.11216 1 0 1 1 0 0 +EDGE2 2449 2290 0.979721 -0.119721 -3.13546 1 0 1 1 0 0 +EDGE2 2449 1230 1.01065 0.0857195 -0.00577561 1 0 1 1 0 0 +EDGE2 2449 1229 0.0105023 0.164058 -0.0123113 1 0 1 1 0 0 +EDGE2 2449 1228 -1.06915 0.0227244 -0.00258918 1 0 1 1 0 0 +EDGE2 2449 2448 -0.976461 -0.0234813 -0.0133003 1 0 1 1 0 0 +EDGE2 2450 2291 -0.0163675 -1.00177 -1.53329 1 0 1 1 0 0 +EDGE2 2450 2289 1.04636 -0.00224981 -3.16018 1 0 1 1 0 0 +EDGE2 2450 1249 0.972032 -0.0398704 -3.17813 1 0 1 1 0 0 +EDGE2 2450 1250 0.0198304 0.000220323 -3.14511 1 0 1 1 0 0 +EDGE2 2450 1231 0.0303744 -0.991391 -1.543 1 0 1 1 0 0 +EDGE2 2450 1251 0.0399568 -1.0177 -1.54586 1 0 1 1 0 0 +EDGE2 2450 2290 -0.0658763 -0.00673333 -3.12035 1 0 1 1 0 0 +EDGE2 2450 1230 -0.0432411 -0.027253 -0.00454197 1 0 1 1 0 0 +EDGE2 2450 2449 -0.978649 -0.091482 0.0124306 1 0 1 1 0 0 +EDGE2 2450 1229 -1.05709 -0.0315113 -0.00874821 1 0 1 1 0 0 +EDGE2 2451 2292 0.9621 -0.046923 -0.0269575 1 0 1 1 0 0 +EDGE2 2451 2291 0.0220614 0.101873 0.0123148 1 0 1 1 0 0 +EDGE2 2451 1252 0.923521 -0.0657811 0.00762392 1 0 1 1 0 0 +EDGE2 2451 1232 1.01039 -0.0341862 0.00287588 1 0 1 1 0 0 +EDGE2 2451 1250 -0.864218 0.000624912 -1.54681 1 0 1 1 0 0 +EDGE2 2451 1231 -0.0669092 0.0218298 0.0137918 1 0 1 1 0 0 +EDGE2 2451 1251 -0.0417396 -0.0389278 -0.0010005 1 0 1 1 0 0 +EDGE2 2451 2450 -1.08527 0.086311 1.52662 1 0 1 1 0 0 +EDGE2 2451 2290 -0.96272 -0.124923 -1.58078 1 0 1 1 0 0 +EDGE2 2451 1230 -0.970191 0.0123677 1.55767 1 0 1 1 0 0 +EDGE2 2452 2292 -0.0708644 -0.0714873 0.055965 1 0 1 1 0 0 +EDGE2 2452 2293 0.991195 0.070854 -0.0256816 1 0 1 1 0 0 +EDGE2 2452 1233 0.99673 -0.0158554 -0.0142491 1 0 1 1 0 0 +EDGE2 2452 1253 1.05033 -0.106394 -0.0218525 1 0 1 1 0 0 +EDGE2 2452 2291 -0.991617 -0.026103 -0.00607626 1 0 1 1 0 0 +EDGE2 2452 1252 0.0629131 -0.0138165 0.00308646 1 0 1 1 0 0 +EDGE2 2452 1232 0.060803 -0.0654615 -0.0158608 1 0 1 1 0 0 +EDGE2 2452 2451 -1.00033 -0.048564 -0.0218221 1 0 1 1 0 0 +EDGE2 2452 1231 -1.13097 -0.0278928 0.0200744 1 0 1 1 0 0 +EDGE2 2452 1251 -0.943758 0.016767 -0.021133 1 0 1 1 0 0 +EDGE2 2453 2292 -1.02135 0.0205601 0.0159478 1 0 1 1 0 0 +EDGE2 2453 2293 -0.0512949 -0.0790973 0.0121761 1 0 1 1 0 0 +EDGE2 2453 1254 0.975454 -0.112558 -0.0165287 1 0 1 1 0 0 +EDGE2 2453 2294 0.881166 0.0336268 0.023301 1 0 1 1 0 0 +EDGE2 2453 1234 0.950897 -0.0226296 -0.00593538 1 0 1 1 0 0 +EDGE2 2453 2452 -1.00943 0.00884429 -0.0193628 1 0 1 1 0 0 +EDGE2 2453 1233 -0.0431308 0.113673 -0.00108508 1 0 1 1 0 0 +EDGE2 2453 1253 -0.0513898 -0.0313533 0.00627752 1 0 1 1 0 0 +EDGE2 2453 1252 -0.988961 -0.0575863 0.0143022 1 0 1 1 0 0 +EDGE2 2453 1232 -0.900602 -0.0656257 -0.0251437 1 0 1 1 0 0 +EDGE2 2454 2293 -0.970524 0.00581817 0.0213941 1 0 1 1 0 0 +EDGE2 2454 1235 0.985262 -0.0113638 0.000956148 1 0 1 1 0 0 +EDGE2 2454 2295 1.0169 0.0149715 0.0313399 1 0 1 1 0 0 +EDGE2 2454 2415 1.00378 0.0699089 -3.15955 1 0 1 1 0 0 +EDGE2 2454 2435 0.929636 -0.00674611 -3.16454 1 0 1 1 0 0 +EDGE2 2454 1255 1.03952 0.0033477 -0.0270315 1 0 1 1 0 0 +EDGE2 2454 1254 -0.0264361 0.010576 -0.0196203 1 0 1 1 0 0 +EDGE2 2454 2294 -0.0161742 -0.0420059 0.00120281 1 0 1 1 0 0 +EDGE2 2454 1234 -0.0720715 0.0359249 0.00773392 1 0 1 1 0 0 +EDGE2 2454 2453 -1.00828 0.116585 0.0190753 1 0 1 1 0 0 +EDGE2 2454 1233 -0.936619 0.0683554 -0.0194969 1 0 1 1 0 0 +EDGE2 2454 1253 -1.04323 0.0387948 -0.029842 1 0 1 1 0 0 +EDGE2 2455 2416 -0.00337327 -1.00665 -1.55827 1 0 1 1 0 0 +EDGE2 2455 1236 -0.0630913 1.03955 1.56767 1 0 1 1 0 0 +EDGE2 2455 2414 1.00564 -0.0403293 -3.15546 1 0 1 1 0 0 +EDGE2 2455 2434 0.942086 -0.00329729 -3.15232 1 0 1 1 0 0 +EDGE2 2455 1235 -0.0280913 -0.112454 0.0290572 1 0 1 1 0 0 +EDGE2 2455 2295 0.0552241 -0.0478916 0.0271106 1 0 1 1 0 0 +EDGE2 2455 2415 -0.0754413 -0.0827538 -3.14522 1 0 1 1 0 0 +EDGE2 2455 2435 0.0813208 0.0122358 -3.1236 1 0 1 1 0 0 +EDGE2 2455 1255 -0.051607 0.0961583 0.0138092 1 0 1 1 0 0 +EDGE2 2455 1254 -1.01259 0.0454653 -0.0160498 1 0 1 1 0 0 +EDGE2 2455 2454 -0.977681 0.0335817 -0.0167419 1 0 1 1 0 0 +EDGE2 2455 2294 -1.02065 -0.0267872 -0.00516332 1 0 1 1 0 0 +EDGE2 2455 1234 -0.972234 -0.00828072 0.0303889 1 0 1 1 0 0 +EDGE2 2455 2436 0.0454851 -0.994078 -1.56842 1 0 1 1 0 0 +EDGE2 2455 1256 0.0538796 -1.02024 -1.58808 1 0 1 1 0 0 +EDGE2 2455 2296 0.00535409 -1.03126 -1.60297 1 0 1 1 0 0 +EDGE2 2456 1237 1.02082 -0.00310247 0.0238323 1 0 1 1 0 0 +EDGE2 2456 1236 -0.00137414 -0.0326381 0.00643813 1 0 1 1 0 0 +EDGE2 2456 1235 -1.10013 0.00585649 -1.58132 1 0 1 1 0 0 +EDGE2 2456 2455 -0.9366 -0.0305422 -1.54069 1 0 1 1 0 0 +EDGE2 2456 2295 -1.00382 -0.0752345 -1.57467 1 0 1 1 0 0 +EDGE2 2456 2415 -1.02258 -0.0690469 1.55601 1 0 1 1 0 0 +EDGE2 2456 2435 -0.962081 -0.0685277 1.57037 1 0 1 1 0 0 +EDGE2 2456 1255 -1.00577 0.00190503 -1.58481 1 0 1 1 0 0 +EDGE2 2457 1238 0.92607 0.0435191 -0.00106337 1 0 1 1 0 0 +EDGE2 2457 2456 -0.92911 0.0443393 0.0290557 1 0 1 1 0 0 +EDGE2 2457 1237 -0.0440031 0.0165659 0.0191756 1 0 1 1 0 0 +EDGE2 2457 1236 -0.933746 -0.0488338 -0.0254841 1 0 1 1 0 0 +EDGE2 2458 1239 0.973925 0.00492143 0.024822 1 0 1 1 0 0 +EDGE2 2458 1238 0.0102007 -0.0108625 0.00538162 1 0 1 1 0 0 +EDGE2 2458 1237 -1.06065 0.0102441 0.0114051 1 0 1 1 0 0 +EDGE2 2458 2457 -0.966763 -0.0230656 -0.0240864 1 0 1 1 0 0 +EDGE2 2459 1820 0.982828 -0.0299352 -3.09574 1 0 1 1 0 0 +EDGE2 2459 2240 1.04356 -0.0277815 -3.16479 1 0 1 1 0 0 +EDGE2 2459 2280 1.04503 0.023016 -3.16662 1 0 1 1 0 0 +EDGE2 2459 1240 1.01002 0.0578016 -0.00433578 1 0 1 1 0 0 +EDGE2 2459 1239 0.0655979 -0.0834775 0.0111 1 0 1 1 0 0 +EDGE2 2459 2458 -1.04455 0.0035729 0.020523 1 0 1 1 0 0 +EDGE2 2459 1238 -0.990879 0.0948045 -0.0016681 1 0 1 1 0 0 +EDGE2 2460 2239 1.08543 0.0532223 -3.14703 1 0 1 1 0 0 +EDGE2 2460 2279 1.02777 0.112449 -3.1364 1 0 1 1 0 0 +EDGE2 2460 1819 0.973672 -0.0850953 -3.11927 1 0 1 1 0 0 +EDGE2 2460 1821 0.0238537 -1.07266 -1.60035 1 0 1 1 0 0 +EDGE2 2460 2241 -0.00961681 -1.05381 -1.55448 1 0 1 1 0 0 +EDGE2 2460 1820 -0.0605152 0.0118335 -3.16106 1 0 1 1 0 0 +EDGE2 2460 2240 -0.090283 0.0984557 -3.13729 1 0 1 1 0 0 +EDGE2 2460 2280 -0.00564034 0.0196628 -3.13539 1 0 1 1 0 0 +EDGE2 2460 1240 0.00148712 0.109412 -0.0212915 1 0 1 1 0 0 +EDGE2 2460 1241 -0.0368167 1.00842 1.54268 1 0 1 1 0 0 +EDGE2 2460 2281 0.0644236 0.995673 1.56268 1 0 1 1 0 0 +EDGE2 2460 1239 -0.97509 -0.0785858 0.03623 1 0 1 1 0 0 +EDGE2 2460 2459 -0.963824 0.0335849 0.0195406 1 0 1 1 0 0 +EDGE2 2461 2460 -1.03146 -0.0792961 -1.53212 1 0 1 1 0 0 +EDGE2 2461 1820 -1.09208 -0.0273659 1.60875 1 0 1 1 0 0 +EDGE2 2461 2240 -1.05373 0.0768932 1.56603 1 0 1 1 0 0 +EDGE2 2461 2280 -0.942121 -0.080102 1.58167 1 0 1 1 0 0 +EDGE2 2461 1240 -1.04736 0.0112514 -1.57773 1 0 1 1 0 0 +EDGE2 2461 1241 0.0139903 -0.14099 0.0261832 1 0 1 1 0 0 +EDGE2 2461 2281 0.0323029 0.0364132 -0.014498 1 0 1 1 0 0 +EDGE2 2461 1242 0.970647 0.0263542 -0.0426446 1 0 1 1 0 0 +EDGE2 2461 2282 1.03305 -0.10352 -0.00609886 1 0 1 1 0 0 +EDGE2 2462 1241 -1.05179 0.0360648 -0.0275395 1 0 1 1 0 0 +EDGE2 2462 2281 -1.16913 -0.00650935 -0.000272433 1 0 1 1 0 0 +EDGE2 2462 2461 -0.903338 0.0645053 0.0105396 1 0 1 1 0 0 +EDGE2 2462 1242 0.0316375 -0.00358116 0.0125705 1 0 1 1 0 0 +EDGE2 2462 2282 0.0600483 -0.0399734 0.0203021 1 0 1 1 0 0 +EDGE2 2462 2283 0.987066 0.106708 0.0146146 1 0 1 1 0 0 +EDGE2 2462 1243 1.05592 -0.0769309 0.000520707 1 0 1 1 0 0 +EDGE2 2463 2462 -1.01272 -0.0690261 0.00191126 1 0 1 1 0 0 +EDGE2 2463 1242 -0.994879 0.0152569 -0.00646807 1 0 1 1 0 0 +EDGE2 2463 2282 -0.972182 -0.029187 0.0296932 1 0 1 1 0 0 +EDGE2 2463 2283 0.00267374 0.0140353 -0.0167084 1 0 1 1 0 0 +EDGE2 2463 1243 0.0436323 -0.020751 -0.0325168 1 0 1 1 0 0 +EDGE2 2463 1244 1.08806 0.0440145 0.0292887 1 0 1 1 0 0 +EDGE2 2463 2284 0.935191 0.0516339 -0.00359334 1 0 1 1 0 0 +EDGE2 2464 2283 -1.08538 0.0240731 -0.00108235 1 0 1 1 0 0 +EDGE2 2464 2463 -0.94437 0.0106857 0.0150489 1 0 1 1 0 0 +EDGE2 2464 1243 -1.0157 0.082881 0.0110402 1 0 1 1 0 0 +EDGE2 2464 785 0.953611 0.0202886 -3.1735 1 0 1 1 0 0 +EDGE2 2464 1244 -0.0253123 0.0219676 -0.0214075 1 0 1 1 0 0 +EDGE2 2464 2284 0.148454 -0.0121008 0.00895055 1 0 1 1 0 0 +EDGE2 2464 1245 1.02329 -0.00873504 -0.0143049 1 0 1 1 0 0 +EDGE2 2464 2285 1.05219 -0.00951993 -0.0228982 1 0 1 1 0 0 +EDGE2 2464 805 1.01722 0.0226048 -3.14315 1 0 1 1 0 0 +EDGE2 2464 745 1.05015 0.0201925 -3.12966 1 0 1 1 0 0 +EDGE2 2464 765 0.959616 0.0821176 -3.12094 1 0 1 1 0 0 +EDGE2 2465 806 -0.0772877 -0.938853 -1.57076 1 0 1 1 0 0 +EDGE2 2465 766 0.067852 -1.04008 -1.58109 1 0 1 1 0 0 +EDGE2 2465 786 0.0760877 -1.05397 -1.58692 1 0 1 1 0 0 +EDGE2 2465 746 -0.0441249 -0.995777 -1.54749 1 0 1 1 0 0 +EDGE2 2465 785 0.0292162 -0.0334825 -3.14485 1 0 1 1 0 0 +EDGE2 2465 1244 -0.970094 -0.0205976 0.000611334 1 0 1 1 0 0 +EDGE2 2465 2284 -0.96097 0.00821543 0.0157495 1 0 1 1 0 0 +EDGE2 2465 2464 -1.03571 -0.0947016 -0.0390594 1 0 1 1 0 0 +EDGE2 2465 1245 -0.00389524 0.00341185 0.00609843 1 0 1 1 0 0 +EDGE2 2465 2285 -0.0425584 -0.0660734 0.00519771 1 0 1 1 0 0 +EDGE2 2465 805 0.0680871 -0.00675577 -3.13314 1 0 1 1 0 0 +EDGE2 2465 784 0.996222 -0.0356947 -3.11718 1 0 1 1 0 0 +EDGE2 2465 745 -0.101115 -0.0478546 -3.11455 1 0 1 1 0 0 +EDGE2 2465 765 0.0621426 -0.0516576 -3.13581 1 0 1 1 0 0 +EDGE2 2465 804 0.985697 -0.0627955 -3.16673 1 0 1 1 0 0 +EDGE2 2465 744 1.01883 0.0594486 -3.13747 1 0 1 1 0 0 +EDGE2 2465 764 0.961043 -0.000935227 -3.12212 1 0 1 1 0 0 +EDGE2 2465 2286 0.0316778 0.968108 1.57238 1 0 1 1 0 0 +EDGE2 2465 1246 0.0250605 0.941188 1.54131 1 0 1 1 0 0 +EDGE2 2466 785 -0.951784 -0.00181444 1.58146 1 0 1 1 0 0 +EDGE2 2466 1245 -0.886142 0.0124306 -1.57802 1 0 1 1 0 0 +EDGE2 2466 2285 -0.975833 0.0504703 -1.59762 1 0 1 1 0 0 +EDGE2 2466 2465 -0.917871 -0.0565933 -1.55223 1 0 1 1 0 0 +EDGE2 2466 805 -0.942684 0.0183317 1.61295 1 0 1 1 0 0 +EDGE2 2466 745 -1.04178 -0.0196278 1.57919 1 0 1 1 0 0 +EDGE2 2466 765 -1.06324 0.136055 1.53 1 0 1 1 0 0 +EDGE2 2466 2286 -0.0250289 -0.00169364 0.00138414 1 0 1 1 0 0 +EDGE2 2466 2287 0.945761 -0.0148045 0.00389921 1 0 1 1 0 0 +EDGE2 2466 1246 0.0260503 -0.0309736 0.00451807 1 0 1 1 0 0 +EDGE2 2466 1247 1.02952 -0.0713999 -0.013257 1 0 1 1 0 0 +EDGE2 2467 2286 -0.965601 -0.0425896 -0.0179687 1 0 1 1 0 0 +EDGE2 2467 2466 -0.953694 -0.0671787 -7.02487e-06 1 0 1 1 0 0 +EDGE2 2467 2287 -0.00881683 0.0262953 0.0186054 1 0 1 1 0 0 +EDGE2 2467 1246 -1.03793 0.0437289 -0.0117854 1 0 1 1 0 0 +EDGE2 2467 1247 -0.0121208 0.0489833 0.00412268 1 0 1 1 0 0 +EDGE2 2467 1248 0.975137 0.0792655 0.00664304 1 0 1 1 0 0 +EDGE2 2467 2288 1.01796 -0.144657 -0.0239313 1 0 1 1 0 0 +EDGE2 2468 2287 -0.89362 -0.0980299 0.00983841 1 0 1 1 0 0 +EDGE2 2468 2467 -0.966431 0.0557176 0.011971 1 0 1 1 0 0 +EDGE2 2468 1247 -0.96824 0.0267242 0.0379662 1 0 1 1 0 0 +EDGE2 2468 2289 0.988754 0.0582538 -0.029575 1 0 1 1 0 0 +EDGE2 2468 1248 -0.042071 0.0304533 -0.0186119 1 0 1 1 0 0 +EDGE2 2468 2288 -0.00436854 -0.0276745 -0.00960482 1 0 1 1 0 0 +EDGE2 2468 1249 0.954185 -0.0174687 -0.0169564 1 0 1 1 0 0 +EDGE2 2469 2289 -0.026599 0.0288982 -0.0337626 1 0 1 1 0 0 +EDGE2 2469 1248 -0.979728 0.0292642 0.00217004 1 0 1 1 0 0 +EDGE2 2469 2288 -0.926431 -0.0536226 0.0191795 1 0 1 1 0 0 +EDGE2 2469 2468 -1.03523 0.0132271 0.0067361 1 0 1 1 0 0 +EDGE2 2469 1249 0.0179782 0.0600289 0.00518158 1 0 1 1 0 0 +EDGE2 2469 1250 0.916176 0.0835205 0.00538417 1 0 1 1 0 0 +EDGE2 2469 2450 0.966058 -0.05392 -3.13967 1 0 1 1 0 0 +EDGE2 2469 2290 1.08117 -0.00474052 -0.00122768 1 0 1 1 0 0 +EDGE2 2469 1230 1.03183 -0.124285 -3.15231 1 0 1 1 0 0 +EDGE2 2470 2291 -0.0265179 1.0654 1.57161 1 0 1 1 0 0 +EDGE2 2470 2289 -1.02905 0.0188213 0.024538 1 0 1 1 0 0 +EDGE2 2470 2469 -0.963831 0.0546955 0.00860828 1 0 1 1 0 0 +EDGE2 2470 2451 -0.0142006 0.981674 1.53786 1 0 1 1 0 0 +EDGE2 2470 1249 -1.00985 -0.00177242 0.017504 1 0 1 1 0 0 +EDGE2 2470 1250 -0.0999251 -0.0037764 -0.023477 1 0 1 1 0 0 +EDGE2 2470 1231 0.00355189 0.942124 1.56441 1 0 1 1 0 0 +EDGE2 2470 1251 -0.00894397 0.995255 1.59157 1 0 1 1 0 0 +EDGE2 2470 2450 0.0603909 0.0461776 -3.14104 1 0 1 1 0 0 +EDGE2 2470 2290 0.0698515 -0.0328309 0.00448352 1 0 1 1 0 0 +EDGE2 2470 1230 -0.0305628 -0.0288768 -3.12096 1 0 1 1 0 0 +EDGE2 2470 2449 1.05865 0.0273572 -3.13475 1 0 1 1 0 0 +EDGE2 2470 1229 1.0043 -0.037136 -3.13769 1 0 1 1 0 0 +EDGE2 2471 1250 -1.06464 -0.11206 1.57699 1 0 1 1 0 0 +EDGE2 2471 2450 -1.07961 -0.0388191 -1.56219 1 0 1 1 0 0 +EDGE2 2471 2470 -1.0199 0.00836507 1.54275 1 0 1 1 0 0 +EDGE2 2471 2290 -1.06196 -0.0288779 1.55501 1 0 1 1 0 0 +EDGE2 2471 1230 -1.03987 0.00207815 -1.60397 1 0 1 1 0 0 +EDGE2 2472 2471 -0.889439 0.0190064 -0.00422027 1 0 1 1 0 0 +EDGE2 2473 2472 -1.03017 -0.0333184 -0.0180904 1 0 1 1 0 0 +EDGE2 2474 2473 -0.980756 0.0866499 0.00735478 1 0 1 1 0 0 +EDGE2 2474 715 0.929689 -0.00910312 -3.15403 1 0 1 1 0 0 +EDGE2 2474 735 1.05191 -0.0818933 -3.12378 1 0 1 1 0 0 +EDGE2 2474 1215 1.03751 0.0331671 -3.10465 1 0 1 1 0 0 +EDGE2 2475 736 0.00147344 -1.0592 -1.56135 1 0 1 1 0 0 +EDGE2 2475 2474 -1.02625 -0.0749122 -0.0118502 1 0 1 1 0 0 +EDGE2 2475 715 0.000717196 0.0190149 -3.11049 1 0 1 1 0 0 +EDGE2 2475 735 -0.0626963 -0.0340428 -3.12644 1 0 1 1 0 0 +EDGE2 2475 1215 0.0704655 0.023675 -3.16168 1 0 1 1 0 0 +EDGE2 2475 734 1.01395 0.0178649 -3.13481 1 0 1 1 0 0 +EDGE2 2475 1214 1.01992 -0.0517666 -3.15565 1 0 1 1 0 0 +EDGE2 2475 714 1.05047 0.0738977 -3.1756 1 0 1 1 0 0 +EDGE2 2475 1216 0.0300292 0.992146 1.54462 1 0 1 1 0 0 +EDGE2 2475 716 0.0373169 0.975881 1.54202 1 0 1 1 0 0 +EDGE2 2476 2475 -1.03984 0.0548714 -1.5555 1 0 1 1 0 0 +EDGE2 2476 715 -1.02175 -0.0279355 1.60507 1 0 1 1 0 0 +EDGE2 2476 735 -0.972164 -0.0569087 1.59389 1 0 1 1 0 0 +EDGE2 2476 1215 -1.04293 0.0389562 1.55665 1 0 1 1 0 0 +EDGE2 2476 1216 0.0563307 0.0962234 -0.0212374 1 0 1 1 0 0 +EDGE2 2476 716 -0.0315471 0.0663383 -0.025256 1 0 1 1 0 0 +EDGE2 2476 1217 0.979977 -0.0313462 0.0233579 1 0 1 1 0 0 +EDGE2 2476 717 0.935175 -0.0178792 0.00443213 1 0 1 1 0 0 +EDGE2 2477 1218 0.958121 0.0420965 0.010652 1 0 1 1 0 0 +EDGE2 2477 1216 -0.862997 -0.00420376 0.0108962 1 0 1 1 0 0 +EDGE2 2477 2476 -1.05457 -0.0244596 0.0401448 1 0 1 1 0 0 +EDGE2 2477 716 -1.00542 -0.0189783 0.0387129 1 0 1 1 0 0 +EDGE2 2477 1217 -0.000252644 0.0576165 -0.00837067 1 0 1 1 0 0 +EDGE2 2477 717 0.0637894 0.0224021 0.0363686 1 0 1 1 0 0 +EDGE2 2477 718 1.00467 0.0555282 -0.0116255 1 0 1 1 0 0 +EDGE2 2478 1218 -0.0525964 -0.0365286 -0.00717312 1 0 1 1 0 0 +EDGE2 2478 1217 -0.943169 0.00580067 0.00466373 1 0 1 1 0 0 +EDGE2 2478 2477 -0.928911 -0.0315336 0.0269751 1 0 1 1 0 0 +EDGE2 2478 717 -0.979656 -0.0302436 0.00732679 1 0 1 1 0 0 +EDGE2 2478 718 -0.0141935 -0.0271571 -0.0453434 1 0 1 1 0 0 +EDGE2 2478 719 0.975396 0.0339999 0.0283199 1 0 1 1 0 0 +EDGE2 2478 1219 0.963476 0.0528441 0.0161497 1 0 1 1 0 0 +EDGE2 2479 1218 -1.00987 0.0850289 -0.0048297 1 0 1 1 0 0 +EDGE2 2479 2478 -0.988317 0.0117893 -0.00709539 1 0 1 1 0 0 +EDGE2 2479 718 -1.03513 0.060098 0.0340218 1 0 1 1 0 0 +EDGE2 2479 719 0.0517513 0.087432 -0.0127089 1 0 1 1 0 0 +EDGE2 2479 1219 -0.0846242 0.0806826 0.0255527 1 0 1 1 0 0 +EDGE2 2479 1220 0.99285 -0.0617586 0.00342124 1 0 1 1 0 0 +EDGE2 2479 720 1.03627 0.0693674 -0.00192939 1 0 1 1 0 0 +EDGE2 2480 2479 -1.08794 -0.00414136 -0.00433004 1 0 1 1 0 0 +EDGE2 2480 719 -0.936229 -0.0837793 0.00253693 1 0 1 1 0 0 +EDGE2 2480 1219 -0.982323 0.0615183 0.00988639 1 0 1 1 0 0 +EDGE2 2480 1221 0.00431717 1.01737 1.58493 1 0 1 1 0 0 +EDGE2 2480 1220 -0.0392929 0.00668882 -0.019205 1 0 1 1 0 0 +EDGE2 2480 720 -0.00695567 0.0267009 0.00452185 1 0 1 1 0 0 +EDGE2 2480 721 0.0125422 -1.08439 -1.57349 1 0 1 1 0 0 +EDGE2 2481 1221 -0.0573901 0.104847 0.0174605 1 0 1 1 0 0 +EDGE2 2481 1222 0.975678 0.030233 -0.0275717 1 0 1 1 0 0 +EDGE2 2481 1220 -1.01637 0.00650268 -1.55069 1 0 1 1 0 0 +EDGE2 2481 2480 -0.977448 0.0938964 -1.57041 1 0 1 1 0 0 +EDGE2 2481 720 -0.986614 -0.0658037 -1.61002 1 0 1 1 0 0 +EDGE2 2482 1221 -0.990596 -0.0544754 0.0152769 1 0 1 1 0 0 +EDGE2 2482 1223 0.995831 -0.0219377 0.0068099 1 0 1 1 0 0 +EDGE2 2482 1222 0.0253884 -0.0212053 0.0324737 1 0 1 1 0 0 +EDGE2 2482 2481 -0.986272 0.077136 -0.0346166 1 0 1 1 0 0 +EDGE2 2483 1223 -0.0794304 0.0823714 -0.0238381 1 0 1 1 0 0 +EDGE2 2483 1224 0.90496 0.00218656 -0.0385325 1 0 1 1 0 0 +EDGE2 2483 1222 -1.05074 0.0249777 -0.00272648 1 0 1 1 0 0 +EDGE2 2483 2482 -0.993703 0.0262627 0.0205647 1 0 1 1 0 0 +EDGE2 2484 1225 0.961802 -0.00756886 -0.00119496 1 0 1 1 0 0 +EDGE2 2484 2445 0.926297 0.0214852 -3.11139 1 0 1 1 0 0 +EDGE2 2484 1223 -1.02675 -0.0367805 -0.0344693 1 0 1 1 0 0 +EDGE2 2484 1224 -0.0778123 0.00881313 -0.00536896 1 0 1 1 0 0 +EDGE2 2484 2483 -0.97334 0.0595747 -0.00517111 1 0 1 1 0 0 +EDGE2 2485 2446 0.119315 1.00077 1.576 1 0 1 1 0 0 +EDGE2 2485 1226 0.0122347 0.890656 1.60708 1 0 1 1 0 0 +EDGE2 2485 2444 0.886234 -0.0532201 -3.13318 1 0 1 1 0 0 +EDGE2 2485 1225 0.00568215 0.0211364 0.0225206 1 0 1 1 0 0 +EDGE2 2485 2445 0.0382532 -0.0202548 -3.13886 1 0 1 1 0 0 +EDGE2 2485 1224 -0.938676 -0.00675635 -0.00254881 1 0 1 1 0 0 +EDGE2 2485 2484 -0.96142 -0.0287222 -0.00536899 1 0 1 1 0 0 +EDGE2 2486 1227 0.992515 -0.063337 0.00697337 1 0 1 1 0 0 +EDGE2 2486 2447 0.924073 -0.0175347 -0.0211896 1 0 1 1 0 0 +EDGE2 2486 2446 -0.0176248 -0.0227926 -0.0252118 1 0 1 1 0 0 +EDGE2 2486 1226 -0.0622366 0.0312073 0.00296691 1 0 1 1 0 0 +EDGE2 2486 1225 -1.02729 0.0225429 -1.5767 1 0 1 1 0 0 +EDGE2 2486 2485 -0.896838 0.0138736 -1.5671 1 0 1 1 0 0 +EDGE2 2486 2445 -0.901107 0.085123 1.55771 1 0 1 1 0 0 +EDGE2 2487 1228 0.998993 -0.00289293 -0.0103992 1 0 1 1 0 0 +EDGE2 2487 2448 1.02072 0.00307038 -0.0217677 1 0 1 1 0 0 +EDGE2 2487 1227 -0.0272764 0.067136 -0.0150167 1 0 1 1 0 0 +EDGE2 2487 2447 0.0688955 -0.0657161 0.00727321 1 0 1 1 0 0 +EDGE2 2487 2446 -0.975636 0.101193 0.00123297 1 0 1 1 0 0 +EDGE2 2487 2486 -0.990391 -0.0371682 -0.0366585 1 0 1 1 0 0 +EDGE2 2487 1226 -1.03953 0.0205062 0.0143818 1 0 1 1 0 0 +EDGE2 2488 2449 1.01123 -0.112808 0.0285566 1 0 1 1 0 0 +EDGE2 2488 1229 0.920304 0.0474349 0.0123575 1 0 1 1 0 0 +EDGE2 2488 1228 -0.00293741 -0.00769308 -0.00764752 1 0 1 1 0 0 +EDGE2 2488 2448 -0.023299 0.0344955 -0.000507899 1 0 1 1 0 0 +EDGE2 2488 1227 -0.937607 -0.00208332 0.0478564 1 0 1 1 0 0 +EDGE2 2488 2487 -0.994423 0.0183431 -0.000910802 1 0 1 1 0 0 +EDGE2 2488 2447 -0.996974 0.134815 -0.0328511 1 0 1 1 0 0 +EDGE2 2489 1250 0.925746 -0.0434877 -3.11485 1 0 1 1 0 0 +EDGE2 2489 2450 1.04637 -0.0314147 0.0196489 1 0 1 1 0 0 +EDGE2 2489 2470 0.984538 0.106738 -3.13465 1 0 1 1 0 0 +EDGE2 2489 2290 0.98082 -0.132981 -3.14267 1 0 1 1 0 0 +EDGE2 2489 1230 1.13251 -0.113563 0.0247474 1 0 1 1 0 0 +EDGE2 2489 2488 -1.01422 0.0659677 -0.0365073 1 0 1 1 0 0 +EDGE2 2489 2449 -0.117414 -0.0104233 -0.0009726 1 0 1 1 0 0 +EDGE2 2489 1229 0.0160146 -0.0222837 0.010008 1 0 1 1 0 0 +EDGE2 2489 1228 -0.963968 -0.0579213 0.00408479 1 0 1 1 0 0 +EDGE2 2489 2448 -0.959826 -0.0257294 0.00582599 1 0 1 1 0 0 +EDGE2 2490 2291 -0.0815478 -0.988595 -1.56397 1 0 1 1 0 0 +EDGE2 2490 2289 1.0005 -0.0390356 -3.10838 1 0 1 1 0 0 +EDGE2 2490 2469 1.00344 0.00706864 -3.13991 1 0 1 1 0 0 +EDGE2 2490 2451 0.0126962 -1.06251 -1.56701 1 0 1 1 0 0 +EDGE2 2490 1249 0.996001 0.00740308 -3.13843 1 0 1 1 0 0 +EDGE2 2490 1250 -0.0122251 0.00323796 -3.19306 1 0 1 1 0 0 +EDGE2 2490 1231 0.0106867 -1.01743 -1.56519 1 0 1 1 0 0 +EDGE2 2490 1251 0.0293263 -1.03635 -1.54525 1 0 1 1 0 0 +EDGE2 2490 2450 0.0255277 0.0145671 -0.00501698 1 0 1 1 0 0 +EDGE2 2490 2470 -0.0465992 -0.0435109 -3.12093 1 0 1 1 0 0 +EDGE2 2490 2290 -0.00487172 0.0620664 -3.12922 1 0 1 1 0 0 +EDGE2 2490 1230 -0.0639728 0.0278153 -0.033484 1 0 1 1 0 0 +EDGE2 2490 2471 -0.0875887 1.01292 1.5595 1 0 1 1 0 0 +EDGE2 2490 2449 -1.02453 -0.0404896 -0.0215441 1 0 1 1 0 0 +EDGE2 2490 2489 -0.981932 -0.0196352 0.00144499 1 0 1 1 0 0 +EDGE2 2490 1229 -1.06726 0.000659238 -0.0371268 1 0 1 1 0 0 +EDGE2 2491 2292 0.999081 -0.0440589 0.006986 1 0 1 1 0 0 +EDGE2 2491 2452 0.983193 -0.0121173 -0.0021128 1 0 1 1 0 0 +EDGE2 2491 2291 0.107276 0.0519415 0.00706722 1 0 1 1 0 0 +EDGE2 2491 1252 0.941269 0.0317396 -0.0383914 1 0 1 1 0 0 +EDGE2 2491 1232 1.04854 0.00899812 -0.00432553 1 0 1 1 0 0 +EDGE2 2491 2451 -0.0760036 0.0965045 -0.000925061 1 0 1 1 0 0 +EDGE2 2491 1250 -1.0047 0.0212972 -1.56463 1 0 1 1 0 0 +EDGE2 2491 1231 -0.0846938 0.00268349 0.0153535 1 0 1 1 0 0 +EDGE2 2491 1251 0.0615432 0.0271134 0.0160153 1 0 1 1 0 0 +EDGE2 2491 2450 -1.01749 0.0323552 1.56573 1 0 1 1 0 0 +EDGE2 2491 2470 -1.04592 -0.0538401 -1.5666 1 0 1 1 0 0 +EDGE2 2491 2490 -0.955829 0.0188591 1.56584 1 0 1 1 0 0 +EDGE2 2491 2290 -1.00047 0.0151558 -1.61503 1 0 1 1 0 0 +EDGE2 2491 1230 -1.00915 -0.0659114 1.56215 1 0 1 1 0 0 +EDGE2 2492 2292 -0.0818981 0.0461235 -0.028017 1 0 1 1 0 0 +EDGE2 2492 2293 0.961173 0.025349 -0.0441442 1 0 1 1 0 0 +EDGE2 2492 2453 1.07222 -0.0419144 -0.0329068 1 0 1 1 0 0 +EDGE2 2492 2452 -0.0105411 -0.0485417 0.0386746 1 0 1 1 0 0 +EDGE2 2492 1233 1.01286 -0.0198476 -0.0445874 1 0 1 1 0 0 +EDGE2 2492 1253 0.940619 0.0155488 -0.0337422 1 0 1 1 0 0 +EDGE2 2492 2291 -0.97452 0.0873724 0.00703009 1 0 1 1 0 0 +EDGE2 2492 1252 0.051738 0.102862 0.0423721 1 0 1 1 0 0 +EDGE2 2492 2491 -0.975882 0.0212925 0.0143899 1 0 1 1 0 0 +EDGE2 2492 1232 -0.0608478 0.00964225 0.0309385 1 0 1 1 0 0 +EDGE2 2492 2451 -0.981117 -0.132549 0.0214689 1 0 1 1 0 0 +EDGE2 2492 1231 -0.87324 -0.055265 -0.00173 1 0 1 1 0 0 +EDGE2 2492 1251 -0.99265 -0.019842 0.0253757 1 0 1 1 0 0 +EDGE2 2493 2292 -0.988664 0.0602414 0.0152766 1 0 1 1 0 0 +EDGE2 2493 2293 -0.0399292 0.0662848 -0.0307655 1 0 1 1 0 0 +EDGE2 2493 1254 0.837918 -0.032209 0.0284855 1 0 1 1 0 0 +EDGE2 2493 2454 0.903236 0.00134121 0.000287183 1 0 1 1 0 0 +EDGE2 2493 2294 1.03821 -0.0128005 0.00881732 1 0 1 1 0 0 +EDGE2 2493 1234 0.961214 0.0595532 0.00845709 1 0 1 1 0 0 +EDGE2 2493 2453 0.0316429 -0.0294459 -0.0348476 1 0 1 1 0 0 +EDGE2 2493 2452 -1.06128 0.00553693 0.0058088 1 0 1 1 0 0 +EDGE2 2493 1233 0.0790159 0.0384073 0.0266143 1 0 1 1 0 0 +EDGE2 2493 1253 -0.00148797 -0.00471323 -0.000684766 1 0 1 1 0 0 +EDGE2 2493 2492 -0.973879 0.0234084 0.0645466 1 0 1 1 0 0 +EDGE2 2493 1252 -1.05818 0.00934411 0.00523452 1 0 1 1 0 0 +EDGE2 2493 1232 -1.08531 0.0462407 0.0286438 1 0 1 1 0 0 +EDGE2 2494 2293 -0.991589 -0.0416281 0.00310954 1 0 1 1 0 0 +EDGE2 2494 1235 0.979968 -0.0442858 0.0475402 1 0 1 1 0 0 +EDGE2 2494 2455 1.01539 0.0474379 -0.010912 1 0 1 1 0 0 +EDGE2 2494 2295 0.92655 0.0115923 -0.00228973 1 0 1 1 0 0 +EDGE2 2494 2415 0.979015 -0.096093 -3.16707 1 0 1 1 0 0 +EDGE2 2494 2435 1.04852 0.0282475 -3.12007 1 0 1 1 0 0 +EDGE2 2494 1255 0.983514 -0.0796659 -0.0349713 1 0 1 1 0 0 +EDGE2 2494 1254 -0.0325755 -0.114095 0.0255199 1 0 1 1 0 0 +EDGE2 2494 2454 0.0499014 -0.00100106 -0.00556805 1 0 1 1 0 0 +EDGE2 2494 2294 -0.0635404 0.050901 -0.0078307 1 0 1 1 0 0 +EDGE2 2494 2493 -0.95561 -0.0126884 -0.00925269 1 0 1 1 0 0 +EDGE2 2494 1234 -0.0041525 0.0596515 0.0187137 1 0 1 1 0 0 +EDGE2 2494 2453 -1.02201 -0.0204926 0.0362133 1 0 1 1 0 0 +EDGE2 2494 1233 -0.897005 0.041334 0.00135658 1 0 1 1 0 0 +EDGE2 2494 1253 -0.922822 -0.0467016 0.00783151 1 0 1 1 0 0 +EDGE2 2495 2416 -0.0333389 -0.97667 -1.56996 1 0 1 1 0 0 +EDGE2 2495 2456 -0.0944812 1.01079 1.5729 1 0 1 1 0 0 +EDGE2 2495 1236 0.0499369 1.11684 1.60418 1 0 1 1 0 0 +EDGE2 2495 2414 1.02241 0.0327369 -3.1473 1 0 1 1 0 0 +EDGE2 2495 2434 0.99978 0.0095414 -3.12001 1 0 1 1 0 0 +EDGE2 2495 1235 0.0112018 -0.0601681 0.0135669 1 0 1 1 0 0 +EDGE2 2495 2455 0.0455502 0.0580823 -0.0121326 1 0 1 1 0 0 +EDGE2 2495 2295 -0.00191591 0.00370641 -0.0165951 1 0 1 1 0 0 +EDGE2 2495 2415 0.0946108 0.0652089 -3.13637 1 0 1 1 0 0 +EDGE2 2495 2435 0.0200504 -0.0315489 -3.14972 1 0 1 1 0 0 +EDGE2 2495 1255 0.106075 -0.0763725 0.0085197 1 0 1 1 0 0 +EDGE2 2495 1254 -0.963008 -0.0947342 -0.00557743 1 0 1 1 0 0 +EDGE2 2495 2454 -0.926628 0.0103464 0.0158661 1 0 1 1 0 0 +EDGE2 2495 2494 -1.04963 0.0154624 0.0461673 1 0 1 1 0 0 +EDGE2 2495 2294 -0.970234 0.00141385 -0.00790221 1 0 1 1 0 0 +EDGE2 2495 1234 -1.07515 0.0185639 -0.0121964 1 0 1 1 0 0 +EDGE2 2495 2436 0.0531943 -1.04021 -1.55688 1 0 1 1 0 0 +EDGE2 2495 1256 -0.0261737 -1.08359 -1.54873 1 0 1 1 0 0 +EDGE2 2495 2296 -0.0278137 -0.993164 -1.58672 1 0 1 1 0 0 +EDGE2 2496 2416 -0.0438322 -0.00125263 -0.0321816 1 0 1 1 0 0 +EDGE2 2496 1235 -1.08908 -0.103236 1.56325 1 0 1 1 0 0 +EDGE2 2496 2455 -1.02439 -0.0610698 1.55864 1 0 1 1 0 0 +EDGE2 2496 2495 -1.00168 -0.0254712 1.56978 1 0 1 1 0 0 +EDGE2 2496 2295 -0.96866 -0.0286932 1.57735 1 0 1 1 0 0 +EDGE2 2496 2415 -1.00724 0.0158309 -1.59217 1 0 1 1 0 0 +EDGE2 2496 2435 -0.917728 0.0102536 -1.54309 1 0 1 1 0 0 +EDGE2 2496 1255 -0.962474 0.00533476 1.58137 1 0 1 1 0 0 +EDGE2 2496 2436 -0.0775357 0.0620691 0.0173981 1 0 1 1 0 0 +EDGE2 2496 1256 -0.0345089 -0.00838532 0.0113818 1 0 1 1 0 0 +EDGE2 2496 2296 -0.0108089 0.030445 -0.00154132 1 0 1 1 0 0 +EDGE2 2496 2297 0.963673 -0.047619 0.00258712 1 0 1 1 0 0 +EDGE2 2496 2417 1.01719 0.0425751 0.00140913 1 0 1 1 0 0 +EDGE2 2496 2437 1.02815 -0.0330312 0.00278958 1 0 1 1 0 0 +EDGE2 2496 1257 0.998982 0.0369014 -0.00845543 1 0 1 1 0 0 +EDGE2 2497 2416 -0.961855 0.020249 0.0133226 1 0 1 1 0 0 +EDGE2 2497 2496 -1.05742 0.0579792 -0.0201813 1 0 1 1 0 0 +EDGE2 2497 2436 -1.01636 0.0291184 -0.0293915 1 0 1 1 0 0 +EDGE2 2497 1256 -0.983578 0.0583248 0.00799599 1 0 1 1 0 0 +EDGE2 2497 2296 -0.968691 0.0747911 -0.0132624 1 0 1 1 0 0 +EDGE2 2497 2297 0.0426795 -0.0277162 -0.0300862 1 0 1 1 0 0 +EDGE2 2497 2417 0.0727245 -0.00668208 -0.021636 1 0 1 1 0 0 +EDGE2 2497 2437 -0.0583058 0.0215306 -0.0126943 1 0 1 1 0 0 +EDGE2 2497 1257 0.0214934 -0.0458827 -0.0224576 1 0 1 1 0 0 +EDGE2 2497 2298 0.996853 -0.0660222 -0.0128428 1 0 1 1 0 0 +EDGE2 2497 2418 1.001 0.0223373 -0.0171756 1 0 1 1 0 0 +EDGE2 2497 2438 1.01607 0.0201441 0.0228104 1 0 1 1 0 0 +EDGE2 2497 1258 0.996873 0.0872509 -0.00920578 1 0 1 1 0 0 +EDGE2 2498 2497 -0.984644 -0.126086 -0.00262801 1 0 1 1 0 0 +EDGE2 2498 2297 -0.923131 -0.0623348 0.0105756 1 0 1 1 0 0 +EDGE2 2498 2417 -1.04817 0.0185815 -0.00348238 1 0 1 1 0 0 +EDGE2 2498 2437 -1.08375 0.0102112 0.0227587 1 0 1 1 0 0 +EDGE2 2498 1257 -1.03089 0.014439 0.00838597 1 0 1 1 0 0 +EDGE2 2498 2298 0.00817686 0.0307305 -0.0164789 1 0 1 1 0 0 +EDGE2 2498 2418 -0.0300935 0.0246417 0.000745748 1 0 1 1 0 0 +EDGE2 2498 2438 0.0309457 -0.00636765 -0.0345891 1 0 1 1 0 0 +EDGE2 2498 1258 -0.0423187 0.0482152 0.0328184 1 0 1 1 0 0 +EDGE2 2498 2299 1.03955 0.0146232 -0.0158202 1 0 1 1 0 0 +EDGE2 2498 2419 0.981553 -0.00317462 0.00728133 1 0 1 1 0 0 +EDGE2 2498 2439 0.946619 -0.0227201 0.00608471 1 0 1 1 0 0 +EDGE2 2498 1259 1.00252 -0.076281 0.0195976 1 0 1 1 0 0 +EDGE2 2499 2498 -1.04556 -0.00396939 0.0126523 1 0 1 1 0 0 +EDGE2 2499 2298 -0.95427 0.0523002 -0.0367787 1 0 1 1 0 0 +EDGE2 2499 2418 -1.00302 0.00801322 -0.011055 1 0 1 1 0 0 +EDGE2 2499 2438 -1.04815 0.0640604 0.0201783 1 0 1 1 0 0 +EDGE2 2499 1258 -0.970397 -0.0473459 0.00766455 1 0 1 1 0 0 +EDGE2 2499 2299 -0.00588154 0.00815253 -0.00921315 1 0 1 1 0 0 +EDGE2 2499 2419 -0.0494285 -0.0130961 0.000109346 1 0 1 1 0 0 +EDGE2 2499 2439 0.0418413 -0.0736902 0.0183071 1 0 1 1 0 0 +EDGE2 2499 1259 -0.0928285 0.0330261 0.0125738 1 0 1 1 0 0 +EDGE2 2499 2420 0.922857 0.0146453 0.0276947 1 0 1 1 0 0 +EDGE2 2499 2440 1.04895 -0.0592561 0.00738374 1 0 1 1 0 0 +EDGE2 2499 2300 1.03906 0.0215838 -0.00245603 1 0 1 1 0 0 +EDGE2 2499 1260 1.01951 0.0224558 0.00388594 1 0 1 1 0 0 +EDGE2 2500 2441 -0.0204381 -0.941463 -1.58059 1 0 1 1 0 0 +EDGE2 2500 2301 -0.0566379 0.979697 1.54812 1 0 1 1 0 0 +EDGE2 2500 2421 -0.0463217 1.05902 1.53683 1 0 1 1 0 0 +EDGE2 2500 1261 0.0787511 0.948901 1.54998 1 0 1 1 0 0 +EDGE2 2500 2499 -1.05517 -0.0405942 0.0106244 1 0 1 1 0 0 +EDGE2 2500 2299 -1.03401 0.0211384 0.000277897 1 0 1 1 0 0 +EDGE2 2500 2419 -1.0595 -0.0294704 -0.00121702 1 0 1 1 0 0 +EDGE2 2500 2439 -1.01454 -0.0014686 0.00525789 1 0 1 1 0 0 +EDGE2 2500 1259 -0.960102 0.101747 -0.0254703 1 0 1 1 0 0 +EDGE2 2500 2420 0.00417434 -0.000539614 -0.0184175 1 0 1 1 0 0 +EDGE2 2500 2440 -0.0587183 -0.0476058 0.023175 1 0 1 1 0 0 +EDGE2 2500 2300 0.0295344 -0.0230555 -0.00497462 1 0 1 1 0 0 +EDGE2 2500 1260 0.02078 0.00214727 -0.00872958 1 0 1 1 0 0 +EDGE2 2501 2441 0.0767531 0.00907741 0.0178406 1 0 1 1 0 0 +EDGE2 2501 2420 -0.958467 -0.0392126 1.6067 1 0 1 1 0 0 +EDGE2 2501 2500 -0.905136 -0.0299385 1.57477 1 0 1 1 0 0 +EDGE2 2501 2440 -0.990077 0.0577003 1.56923 1 0 1 1 0 0 +EDGE2 2501 2300 -1.03857 -0.120893 1.56491 1 0 1 1 0 0 +EDGE2 2501 1260 -1.0297 -0.0304566 1.57153 1 0 1 1 0 0 +EDGE2 2501 2442 0.973274 0.00331883 -0.0428233 1 0 1 1 0 0 +EDGE2 2502 2441 -0.910892 -0.0244066 0.0148042 1 0 1 1 0 0 +EDGE2 2502 2501 -0.982969 0.00176451 -0.033908 1 0 1 1 0 0 +EDGE2 2502 2443 0.949689 0.00313332 -0.0150407 1 0 1 1 0 0 +EDGE2 2502 2442 -0.0140305 0.0265597 0.0119586 1 0 1 1 0 0 +EDGE2 2503 2443 0.0387641 0.0693209 0.0200612 1 0 1 1 0 0 +EDGE2 2503 2442 -0.946838 0.0174961 0.0133181 1 0 1 1 0 0 +EDGE2 2503 2502 -0.956086 -0.00670747 0.0598263 1 0 1 1 0 0 +EDGE2 2503 2444 1.09585 0.108842 -0.000302232 1 0 1 1 0 0 +EDGE2 2504 2443 -1.05342 -0.0463295 -0.0208915 1 0 1 1 0 0 +EDGE2 2504 2503 -0.960115 0.0312214 -0.0192505 1 0 1 1 0 0 +EDGE2 2504 2444 -0.0452337 -0.047608 0.0173467 1 0 1 1 0 0 +EDGE2 2504 1225 1.02839 -0.0407784 -3.13166 1 0 1 1 0 0 +EDGE2 2504 2485 0.974257 -0.082864 -3.12407 1 0 1 1 0 0 +EDGE2 2504 2445 0.97845 -0.022487 0.0466163 1 0 1 1 0 0 +EDGE2 2505 2446 -0.0557702 -1.01314 -1.5661 1 0 1 1 0 0 +EDGE2 2505 2486 0.053055 -0.978868 -1.5813 1 0 1 1 0 0 +EDGE2 2505 1226 -0.0220142 -1.00726 -1.55046 1 0 1 1 0 0 +EDGE2 2505 2444 -1.02226 -0.00575924 -0.00459313 1 0 1 1 0 0 +EDGE2 2505 2504 -1.04719 -0.081742 0.00614273 1 0 1 1 0 0 +EDGE2 2505 1225 -0.0384154 0.00429214 -3.17959 1 0 1 1 0 0 +EDGE2 2505 2485 -0.000401938 -0.0259913 -3.14569 1 0 1 1 0 0 +EDGE2 2505 2445 0.013804 0.010537 -0.0415617 1 0 1 1 0 0 +EDGE2 2505 1224 0.973081 -0.0292651 -3.13565 1 0 1 1 0 0 +EDGE2 2505 2484 1.00801 0.0388086 -3.13315 1 0 1 1 0 0 +EDGE2 2506 1225 -0.962832 -0.00777461 1.61098 1 0 1 1 0 0 +EDGE2 2506 2485 -0.975805 -0.0108983 1.58567 1 0 1 1 0 0 +EDGE2 2506 2505 -1.10891 -0.0303371 -1.58696 1 0 1 1 0 0 +EDGE2 2506 2445 -1.02 -0.0117353 -1.55316 1 0 1 1 0 0 +EDGE2 2507 2506 -0.935171 -0.0281697 -0.0110743 1 0 1 1 0 0 +EDGE2 2508 2507 -1.03633 0.000419304 0.031771 1 0 1 1 0 0 +EDGE2 2509 2508 -0.959097 -0.0379371 0.00534489 1 0 1 1 0 0 +EDGE2 2510 2509 -1.00315 -0.0392183 -0.0062275 1 0 1 1 0 0 +EDGE2 2511 2510 -1.07157 0.0595082 -1.58634 1 0 1 1 0 0 +EDGE2 2512 2511 -0.9191 0.0492141 0.022253 1 0 1 1 0 0 +EDGE2 2513 2512 -0.998167 0.0558812 -0.00241926 1 0 1 1 0 0 +EDGE2 2514 1295 0.94274 -0.0753611 -3.15892 1 0 1 1 0 0 +EDGE2 2514 1275 1.05341 -0.0158355 -3.15252 1 0 1 1 0 0 +EDGE2 2514 2513 -0.980155 -0.0588873 0.00602629 1 0 1 1 0 0 +EDGE2 2515 1274 0.959218 -0.00498217 -3.16323 1 0 1 1 0 0 +EDGE2 2515 1294 0.958651 0.0232793 -3.12705 1 0 1 1 0 0 +EDGE2 2515 1295 -0.0160574 -0.0730153 -3.14522 1 0 1 1 0 0 +EDGE2 2515 1275 -0.0646171 0.0888208 -3.11461 1 0 1 1 0 0 +EDGE2 2515 2514 -1.07125 0.00654499 0.0200356 1 0 1 1 0 0 +EDGE2 2515 1296 0.0276212 -0.953394 -1.54414 1 0 1 1 0 0 +EDGE2 2515 1276 0.0331039 -1.05162 -1.53908 1 0 1 1 0 0 +EDGE2 2516 1295 -1.02443 -0.0728775 1.59655 1 0 1 1 0 0 +EDGE2 2516 2515 -0.997237 0.00104503 -1.5882 1 0 1 1 0 0 +EDGE2 2516 1275 -0.967647 0.0197916 1.59604 1 0 1 1 0 0 +EDGE2 2517 2516 -0.975442 -0.0342579 0.0271175 1 0 1 1 0 0 +EDGE2 2518 2517 -0.915198 -0.0580817 0.00876991 1 0 1 1 0 0 +EDGE2 2519 2420 1.00232 0.0312008 -3.12876 1 0 1 1 0 0 +EDGE2 2519 2500 1.03786 0.0326398 -3.15348 1 0 1 1 0 0 +EDGE2 2519 2440 0.920838 0.0546179 -3.13435 1 0 1 1 0 0 +EDGE2 2519 2300 0.987055 0.0263861 -3.17362 1 0 1 1 0 0 +EDGE2 2519 1260 0.96422 -0.0960264 -3.13388 1 0 1 1 0 0 +EDGE2 2519 2518 -0.953204 0.0342608 0.0503007 1 0 1 1 0 0 +EDGE2 2520 2441 0.000885963 1.0848 1.56367 1 0 1 1 0 0 +EDGE2 2520 2301 -0.0295547 -0.98153 -1.57873 1 0 1 1 0 0 +EDGE2 2520 2421 -0.0288586 -0.959257 -1.60231 1 0 1 1 0 0 +EDGE2 2520 1261 0.0168255 -0.870965 -1.53687 1 0 1 1 0 0 +EDGE2 2520 2499 0.922375 0.0167465 -3.14178 1 0 1 1 0 0 +EDGE2 2520 2299 0.943922 0.0179561 -3.11377 1 0 1 1 0 0 +EDGE2 2520 2419 1.0324 -0.0379954 -3.1328 1 0 1 1 0 0 +EDGE2 2520 2439 1.06963 0.0505573 -3.10985 1 0 1 1 0 0 +EDGE2 2520 1259 0.949507 0.084914 -3.1461 1 0 1 1 0 0 +EDGE2 2520 2420 0.00893668 0.064712 -3.13887 1 0 1 1 0 0 +EDGE2 2520 2500 -0.0754503 -0.0710023 -3.17293 1 0 1 1 0 0 +EDGE2 2520 2440 -0.0620527 -0.0148075 -3.15322 1 0 1 1 0 0 +EDGE2 2520 2300 -0.0368951 0.0133933 -3.15318 1 0 1 1 0 0 +EDGE2 2520 1260 -0.0229471 0.0680788 -3.12392 1 0 1 1 0 0 +EDGE2 2520 2501 -0.0531934 1.00199 1.55112 1 0 1 1 0 0 +EDGE2 2520 2519 -0.9985 0.0114741 -0.0255686 1 0 1 1 0 0 +EDGE2 2521 2302 0.969007 -0.168129 0.00432846 1 0 1 1 0 0 +EDGE2 2521 2422 1.0642 0.0724632 -0.0307748 1 0 1 1 0 0 +EDGE2 2521 1262 0.963907 0.0545465 0.0197306 1 0 1 1 0 0 +EDGE2 2521 2301 0.0142676 0.0465934 -0.0348275 1 0 1 1 0 0 +EDGE2 2521 2421 0.0558902 0.0345354 0.00674918 1 0 1 1 0 0 +EDGE2 2521 1261 -0.061545 0.0472601 -0.0171532 1 0 1 1 0 0 +EDGE2 2521 2420 -1.01258 -0.0238011 -1.56557 1 0 1 1 0 0 +EDGE2 2521 2500 -1.02382 0.035958 -1.57962 1 0 1 1 0 0 +EDGE2 2521 2520 -1.03069 -0.00358348 1.5585 1 0 1 1 0 0 +EDGE2 2521 2440 -0.946521 0.0571982 -1.56613 1 0 1 1 0 0 +EDGE2 2521 2300 -0.99667 -0.0353976 -1.55874 1 0 1 1 0 0 +EDGE2 2521 1260 -0.986892 -0.0386437 -1.56481 1 0 1 1 0 0 +EDGE2 2522 2302 -0.0399922 0.0334934 -0.0323487 1 0 1 1 0 0 +EDGE2 2522 2303 0.991362 0.107688 -0.00313956 1 0 1 1 0 0 +EDGE2 2522 2423 1.0196 -0.08717 0.00830188 1 0 1 1 0 0 +EDGE2 2522 1263 0.935859 0.0469635 0.00569803 1 0 1 1 0 0 +EDGE2 2522 2422 0.0377263 0.0716299 0.0158464 1 0 1 1 0 0 +EDGE2 2522 2521 -1.00528 -0.0543831 0.0410933 1 0 1 1 0 0 +EDGE2 2522 1262 -0.0159265 -0.0573769 9.69697e-05 1 0 1 1 0 0 +EDGE2 2522 2301 -0.969014 0.0613393 -0.0129794 1 0 1 1 0 0 +EDGE2 2522 2421 -1.01986 -0.00950435 -0.00872108 1 0 1 1 0 0 +EDGE2 2522 1261 -0.995316 0.0332309 0.0339808 1 0 1 1 0 0 +EDGE2 2523 2424 1.04371 -0.00664775 0.0342744 1 0 1 1 0 0 +EDGE2 2523 1264 1.00904 -0.0591245 0.00929289 1 0 1 1 0 0 +EDGE2 2523 2304 0.998223 0.00984897 0.0203282 1 0 1 1 0 0 +EDGE2 2523 2302 -1.04307 0.0365811 -0.00166842 1 0 1 1 0 0 +EDGE2 2523 2303 0.0960928 -0.0379724 -0.0223532 1 0 1 1 0 0 +EDGE2 2523 2423 0.0333925 0.027225 0.0223292 1 0 1 1 0 0 +EDGE2 2523 1263 0.0379532 -0.057563 0.00109589 1 0 1 1 0 0 +EDGE2 2523 2522 -0.895364 0.0471555 -0.0384403 1 0 1 1 0 0 +EDGE2 2523 2422 -1.00854 0.0299381 0.00650282 1 0 1 1 0 0 +EDGE2 2523 1262 -0.941862 -0.0593972 0.0290586 1 0 1 1 0 0 +EDGE2 2524 1265 1.0564 0.0213522 -0.00104654 1 0 1 1 0 0 +EDGE2 2524 2305 0.979921 -0.0744142 0.0174935 1 0 1 1 0 0 +EDGE2 2524 2405 1.04929 -0.0160213 -3.17292 1 0 1 1 0 0 +EDGE2 2524 2425 0.944662 0.0202194 -6.30652e-05 1 0 1 1 0 0 +EDGE2 2524 2385 1.03047 0.042326 -3.12018 1 0 1 1 0 0 +EDGE2 2524 1565 0.962697 -0.0728722 -3.15177 1 0 1 1 0 0 +EDGE2 2524 1585 0.998169 0.0253096 -3.10491 1 0 1 1 0 0 +EDGE2 2524 1845 1.02656 -0.0088568 -3.14805 1 0 1 1 0 0 +EDGE2 2524 1545 1.00667 0.0154092 -3.17508 1 0 1 1 0 0 +EDGE2 2524 2424 0.0398784 -0.0549014 0.0251599 1 0 1 1 0 0 +EDGE2 2524 1264 0.0586502 -0.00130365 0.015366 1 0 1 1 0 0 +EDGE2 2524 2304 0.0700342 0.0294717 0.0199496 1 0 1 1 0 0 +EDGE2 2524 2303 -0.981673 0.029065 0.00328903 1 0 1 1 0 0 +EDGE2 2524 2423 -1.0257 0.0664421 0.0235911 1 0 1 1 0 0 +EDGE2 2524 2523 -1.02936 0.049426 -0.0291203 1 0 1 1 0 0 +EDGE2 2524 1263 -0.963215 0.050038 -0.0064925 1 0 1 1 0 0 +EDGE2 2525 1564 1.06559 0.0465515 -3.11279 1 0 1 1 0 0 +EDGE2 2525 1844 0.986376 -0.0485117 -3.12913 1 0 1 1 0 0 +EDGE2 2525 2384 1.01408 -0.0183881 -3.16427 1 0 1 1 0 0 +EDGE2 2525 2404 1.00302 0.0324275 -3.18349 1 0 1 1 0 0 +EDGE2 2525 1584 0.975625 0.0670827 -3.10773 1 0 1 1 0 0 +EDGE2 2525 1544 1.02735 0.00238341 -3.11108 1 0 1 1 0 0 +EDGE2 2525 2426 -0.023842 1.08184 1.58685 1 0 1 1 0 0 +EDGE2 2525 2406 0.0231333 0.997744 1.57446 1 0 1 1 0 0 +EDGE2 2525 1546 0.0244219 0.95249 1.56022 1 0 1 1 0 0 +EDGE2 2525 1265 -0.0358195 0.0359892 0.00751866 1 0 1 1 0 0 +EDGE2 2525 2305 -0.0969857 0.0829672 -0.0036106 1 0 1 1 0 0 +EDGE2 2525 2405 0.0422103 -0.026605 -3.15369 1 0 1 1 0 0 +EDGE2 2525 2425 -0.0446868 -0.0418935 -0.0198441 1 0 1 1 0 0 +EDGE2 2525 2385 0.0246905 0.0433878 -3.12412 1 0 1 1 0 0 +EDGE2 2525 1565 0.052921 -0.00504012 -3.2072 1 0 1 1 0 0 +EDGE2 2525 1585 -0.0215646 0.0182975 -3.14932 1 0 1 1 0 0 +EDGE2 2525 1845 -0.0479125 0.0763477 -3.18055 1 0 1 1 0 0 +EDGE2 2525 1545 -0.0628887 0.0446983 -3.13842 1 0 1 1 0 0 +EDGE2 2525 2424 -1.02742 0.0303971 -0.0357175 1 0 1 1 0 0 +EDGE2 2525 2524 -0.923388 -0.039765 -0.0166953 1 0 1 1 0 0 +EDGE2 2525 1264 -1.02784 0.0111519 -0.00389098 1 0 1 1 0 0 +EDGE2 2525 2304 -1.00542 0.0870596 -0.0103345 1 0 1 1 0 0 +EDGE2 2525 1566 0.0613972 -0.935593 -1.55076 1 0 1 1 0 0 +EDGE2 2525 1846 -0.0315683 -0.994234 -1.58921 1 0 1 1 0 0 +EDGE2 2525 2306 0.0714461 -1.02885 -1.57363 1 0 1 1 0 0 +EDGE2 2525 2386 -0.035311 -0.971967 -1.57689 1 0 1 1 0 0 +EDGE2 2525 1586 -0.118207 -1.01825 -1.53365 1 0 1 1 0 0 +EDGE2 2525 1266 -0.0298252 -0.979997 -1.56856 1 0 1 1 0 0 +EDGE2 2526 2426 0.00536219 -0.0936933 -0.00815851 1 0 1 1 0 0 +EDGE2 2526 1547 1.05557 0.0331423 0.0208593 1 0 1 1 0 0 +EDGE2 2526 2427 0.962867 -0.0143474 0.00790015 1 0 1 1 0 0 +EDGE2 2526 2407 1.00948 0.0945251 0.0291731 1 0 1 1 0 0 +EDGE2 2526 2406 -0.140303 -0.025931 -0.0393037 1 0 1 1 0 0 +EDGE2 2526 1546 0.0125734 0.113547 -0.0222479 1 0 1 1 0 0 +EDGE2 2526 1265 -1.10093 -0.0305387 -1.56903 1 0 1 1 0 0 +EDGE2 2526 2305 -0.978914 -0.05584 -1.55237 1 0 1 1 0 0 +EDGE2 2526 2405 -1.07259 0.00611699 1.55093 1 0 1 1 0 0 +EDGE2 2526 2425 -1.04757 -0.0729928 -1.57655 1 0 1 1 0 0 +EDGE2 2526 2525 -1.02215 0.0427627 -1.56639 1 0 1 1 0 0 +EDGE2 2526 2385 -0.965914 -0.00541304 1.54918 1 0 1 1 0 0 +EDGE2 2526 1565 -1.0053 0.0273969 1.55978 1 0 1 1 0 0 +EDGE2 2526 1585 -0.958835 0.0418304 1.55921 1 0 1 1 0 0 +EDGE2 2526 1845 -0.996947 -0.13886 1.56141 1 0 1 1 0 0 +EDGE2 2526 1545 -0.862615 0.0814423 1.56711 1 0 1 1 0 0 +EDGE2 2527 1548 0.935046 0.0160518 -0.0508905 1 0 1 1 0 0 +EDGE2 2527 2408 1.01193 0.00961778 -0.00168979 1 0 1 1 0 0 +EDGE2 2527 2428 0.961502 0.175653 0.0179969 1 0 1 1 0 0 +EDGE2 2527 2426 -1.08249 -0.00211407 -0.0074917 1 0 1 1 0 0 +EDGE2 2527 1547 0.0701254 0.0280005 0.0107875 1 0 1 1 0 0 +EDGE2 2527 2427 -0.0365004 0.072244 -0.00806596 1 0 1 1 0 0 +EDGE2 2527 2407 -0.1015 -0.0333849 -0.0134653 1 0 1 1 0 0 +EDGE2 2527 2526 -0.944064 -0.0693983 -0.0150362 1 0 1 1 0 0 +EDGE2 2527 2406 -1.00979 0.0357484 -0.0220913 1 0 1 1 0 0 +EDGE2 2527 1546 -1.01777 -0.142287 -0.0371222 1 0 1 1 0 0 +EDGE2 2528 2429 1.03261 -0.011533 -0.039673 1 0 1 1 0 0 +EDGE2 2528 1549 1.0378 -0.0544313 0.0102832 1 0 1 1 0 0 +EDGE2 2528 2409 0.942064 -0.0730588 -0.0252771 1 0 1 1 0 0 +EDGE2 2528 1548 0.00356724 0.00537635 0.00665763 1 0 1 1 0 0 +EDGE2 2528 2408 0.0324397 -0.0220223 -0.0142768 1 0 1 1 0 0 +EDGE2 2528 2428 0.0178507 0.00402848 0.00876093 1 0 1 1 0 0 +EDGE2 2528 1547 -1.0378 -0.0140383 0.0216043 1 0 1 1 0 0 +EDGE2 2528 2427 -0.940561 -0.0788959 0.0164 1 0 1 1 0 0 +EDGE2 2528 2527 -0.990156 0.00473824 0.0234642 1 0 1 1 0 0 +EDGE2 2528 2407 -0.924862 -0.00468669 0.023436 1 0 1 1 0 0 +EDGE2 2529 2430 0.939773 -0.0649991 0.0327481 1 0 1 1 0 0 +EDGE2 2529 1550 0.939344 -0.0539372 -0.00431655 1 0 1 1 0 0 +EDGE2 2529 1830 1.00973 -0.0671934 -3.14046 1 0 1 1 0 0 +EDGE2 2529 2410 0.94045 -0.0038669 0.0276709 1 0 1 1 0 0 +EDGE2 2529 2429 0.0444077 0.0190917 -0.038191 1 0 1 1 0 0 +EDGE2 2529 1549 -0.00622704 0.0183899 -0.0259082 1 0 1 1 0 0 +EDGE2 2529 2409 0.0294469 0.0342799 0.00275305 1 0 1 1 0 0 +EDGE2 2529 2528 -1.05081 -0.0164341 0.00673551 1 0 1 1 0 0 +EDGE2 2529 1548 -1.04945 -0.0562202 -0.021776 1 0 1 1 0 0 +EDGE2 2529 2408 -1.02256 -0.0766646 0.00118813 1 0 1 1 0 0 +EDGE2 2529 2428 -0.971646 -0.00336716 0.0307367 1 0 1 1 0 0 +EDGE2 2530 1829 0.985591 0.0138528 -3.16688 1 0 1 1 0 0 +EDGE2 2530 1831 0.038606 -1.03797 -1.57414 1 0 1 1 0 0 +EDGE2 2530 1551 0.0213209 -1.00991 -1.57886 1 0 1 1 0 0 +EDGE2 2530 2411 0.0265975 1.06069 1.55848 1 0 1 1 0 0 +EDGE2 2530 2430 -0.014938 0.0287302 -0.013417 1 0 1 1 0 0 +EDGE2 2530 1550 -0.0854952 -0.0489979 0.0120129 1 0 1 1 0 0 +EDGE2 2530 1830 -0.0187366 0.11272 -3.1405 1 0 1 1 0 0 +EDGE2 2530 2410 -0.0403252 -0.00563314 -0.00767995 1 0 1 1 0 0 +EDGE2 2530 2431 0.0322249 0.982769 1.59818 1 0 1 1 0 0 +EDGE2 2530 2429 -0.976376 -0.0681596 -0.00357574 1 0 1 1 0 0 +EDGE2 2530 2529 -0.935767 -0.0233605 0.0228083 1 0 1 1 0 0 +EDGE2 2530 1549 -0.988511 0.0269612 0.017382 1 0 1 1 0 0 +EDGE2 2530 2409 -1.00664 0.0804799 0.00989624 1 0 1 1 0 0 +EDGE2 2531 2411 0.0801105 0.026742 -0.00345957 1 0 1 1 0 0 +EDGE2 2531 2430 -1.0688 -0.0414971 -1.59202 1 0 1 1 0 0 +EDGE2 2531 2530 -1.07305 0.036246 -1.59968 1 0 1 1 0 0 +EDGE2 2531 1550 -1.07636 -0.00525978 -1.59391 1 0 1 1 0 0 +EDGE2 2531 1830 -1.0114 0.0310442 1.6021 1 0 1 1 0 0 +EDGE2 2531 2410 -0.986356 -0.0385374 -1.55221 1 0 1 1 0 0 +EDGE2 2531 2431 -0.0548192 -0.0503457 -0.00671817 1 0 1 1 0 0 +EDGE2 2531 2432 1.03192 0.0470551 -0.00285137 1 0 1 1 0 0 +EDGE2 2531 2412 0.999972 -0.0112164 0.0212846 1 0 1 1 0 0 +EDGE2 2532 2411 -0.929686 0.0019451 -0.0105601 1 0 1 1 0 0 +EDGE2 2532 2531 -1.07393 0.0622535 0.00876766 1 0 1 1 0 0 +EDGE2 2532 2431 -0.995439 -0.0168227 -0.0148668 1 0 1 1 0 0 +EDGE2 2532 2432 0.00843602 0.060993 0.000853454 1 0 1 1 0 0 +EDGE2 2532 2412 -0.0333574 -0.0502596 -0.0159046 1 0 1 1 0 0 +EDGE2 2532 2413 1.02546 -0.0316741 0.0104829 1 0 1 1 0 0 +EDGE2 2532 2433 0.902287 0.0325522 -0.0269173 1 0 1 1 0 0 +EDGE2 2533 2432 -0.998546 0.0115883 0.0104405 1 0 1 1 0 0 +EDGE2 2533 2532 -0.978018 -0.0470591 0.00657349 1 0 1 1 0 0 +EDGE2 2533 2412 -0.953539 -0.00957438 -0.0398165 1 0 1 1 0 0 +EDGE2 2533 2413 0.0447039 0.0484397 -0.0201544 1 0 1 1 0 0 +EDGE2 2533 2433 -0.0026756 0.0250937 0.00625509 1 0 1 1 0 0 +EDGE2 2533 2414 0.957415 -0.107043 0.00479517 1 0 1 1 0 0 +EDGE2 2533 2434 1.02317 -0.0303433 -0.00520236 1 0 1 1 0 0 +EDGE2 2534 2533 -1.06461 -0.046612 -0.0118266 1 0 1 1 0 0 +EDGE2 2534 2413 -1.00012 -0.00260565 -0.0106851 1 0 1 1 0 0 +EDGE2 2534 2433 -0.937123 0.0404106 0.00615672 1 0 1 1 0 0 +EDGE2 2534 2414 -0.0630831 0.00237944 -0.00339549 1 0 1 1 0 0 +EDGE2 2534 2434 -0.0621179 -0.0214685 0.0230035 1 0 1 1 0 0 +EDGE2 2534 1235 0.939751 -0.0176326 -3.11009 1 0 1 1 0 0 +EDGE2 2534 2455 0.981933 -0.0270363 -3.1188 1 0 1 1 0 0 +EDGE2 2534 2495 1.01377 -0.0149728 -3.1441 1 0 1 1 0 0 +EDGE2 2534 2295 0.944884 -0.0750905 -3.14233 1 0 1 1 0 0 +EDGE2 2534 2415 0.941738 -0.0599888 -0.00319181 1 0 1 1 0 0 +EDGE2 2534 2435 1.06628 0.0205825 -0.00766086 1 0 1 1 0 0 +EDGE2 2534 1255 0.997903 0.0331594 -3.14067 1 0 1 1 0 0 +EDGE2 2535 2416 0.0266321 0.98282 1.56788 1 0 1 1 0 0 +EDGE2 2535 2456 0.0229412 -0.965731 -1.57664 1 0 1 1 0 0 +EDGE2 2535 1236 0.0670029 -1.00201 -1.58203 1 0 1 1 0 0 +EDGE2 2535 2414 -0.945176 -0.00625145 0.0229292 1 0 1 1 0 0 +EDGE2 2535 2434 -1.04357 0.0360372 -0.0138747 1 0 1 1 0 0 +EDGE2 2535 2534 -0.851132 0.0232927 -0.0207949 1 0 1 1 0 0 +EDGE2 2535 1235 -0.0467061 0.0322438 -3.14571 1 0 1 1 0 0 +EDGE2 2535 2455 0.00242985 -0.0099577 -3.1233 1 0 1 1 0 0 +EDGE2 2535 2495 -0.0371745 0.0419845 -3.16238 1 0 1 1 0 0 +EDGE2 2535 2295 -0.132391 -0.0143338 -3.14779 1 0 1 1 0 0 +EDGE2 2535 2415 -0.107713 -0.0302638 0.0239207 1 0 1 1 0 0 +EDGE2 2535 2435 0.0606848 -0.00709912 -0.00569674 1 0 1 1 0 0 +EDGE2 2535 1255 -0.054962 0.00596775 -3.14977 1 0 1 1 0 0 +EDGE2 2535 1254 1.06164 -0.0164682 -3.11885 1 0 1 1 0 0 +EDGE2 2535 2454 1.05494 -0.0741045 -3.12037 1 0 1 1 0 0 +EDGE2 2535 2494 1.04405 -0.0146847 -3.17029 1 0 1 1 0 0 +EDGE2 2535 2294 0.988132 -0.0481355 -3.14234 1 0 1 1 0 0 +EDGE2 2535 1234 1.02792 0.0747126 -3.12884 1 0 1 1 0 0 +EDGE2 2535 2496 0.0704125 0.981709 1.60459 1 0 1 1 0 0 +EDGE2 2535 2436 -0.0173571 1.04566 1.60294 1 0 1 1 0 0 +EDGE2 2535 1256 0.0127926 1.07993 1.6084 1 0 1 1 0 0 +EDGE2 2535 2296 0.063066 1.05406 1.53207 1 0 1 1 0 0 +EDGE2 2536 2416 0.054107 -0.0224582 -0.00967473 1 0 1 1 0 0 +EDGE2 2536 1235 -0.987579 -0.066211 1.58054 1 0 1 1 0 0 +EDGE2 2536 2455 -1.00235 -0.0308829 1.62413 1 0 1 1 0 0 +EDGE2 2536 2535 -0.930932 -0.0729289 -1.59143 1 0 1 1 0 0 +EDGE2 2536 2495 -1.04363 -0.0524982 1.58674 1 0 1 1 0 0 +EDGE2 2536 2295 -1.0246 0.0487454 1.59098 1 0 1 1 0 0 +EDGE2 2536 2415 -0.983597 -0.16434 -1.57674 1 0 1 1 0 0 +EDGE2 2536 2435 -0.990023 -0.0136204 -1.62283 1 0 1 1 0 0 +EDGE2 2536 1255 -0.96872 0.00282633 1.54994 1 0 1 1 0 0 +EDGE2 2536 2496 -0.107849 0.0448942 0.0344309 1 0 1 1 0 0 +EDGE2 2536 2436 0.0124781 0.00111031 -0.0165331 1 0 1 1 0 0 +EDGE2 2536 1256 -0.0155363 0.0263349 0.0218742 1 0 1 1 0 0 +EDGE2 2536 2296 0.0401218 0.0467663 -0.013495 1 0 1 1 0 0 +EDGE2 2536 2497 0.999702 0.0194941 -0.0183855 1 0 1 1 0 0 +EDGE2 2536 2297 1.01991 -0.0275969 0.0150548 1 0 1 1 0 0 +EDGE2 2536 2417 0.969912 -0.108541 -0.00861214 1 0 1 1 0 0 +EDGE2 2536 2437 0.940569 0.00499973 -0.0198723 1 0 1 1 0 0 +EDGE2 2536 1257 0.960322 -0.0738467 0.00972063 1 0 1 1 0 0 +EDGE2 2537 2416 -0.939979 -0.0762865 -0.000556058 1 0 1 1 0 0 +EDGE2 2537 2496 -1.00068 -0.124889 0.00989611 1 0 1 1 0 0 +EDGE2 2537 2536 -1.03961 0.106755 0.00377672 1 0 1 1 0 0 +EDGE2 2537 2436 -0.965841 -0.11132 0.0180109 1 0 1 1 0 0 +EDGE2 2537 2498 0.906929 -0.063115 -0.00746378 1 0 1 1 0 0 +EDGE2 2537 1256 -0.918708 0.00341965 -0.00185427 1 0 1 1 0 0 +EDGE2 2537 2296 -1.08598 0.00751973 -0.0144586 1 0 1 1 0 0 +EDGE2 2537 2497 -0.0123605 -0.0400288 -0.041274 1 0 1 1 0 0 +EDGE2 2537 2297 -0.0119471 0.0600088 0.0206612 1 0 1 1 0 0 +EDGE2 2537 2417 -0.0453966 0.0143185 -0.0208752 1 0 1 1 0 0 +EDGE2 2537 2437 0.0681922 0.00649681 -0.00240151 1 0 1 1 0 0 +EDGE2 2537 1257 -0.0432651 0.0464351 -0.0319967 1 0 1 1 0 0 +EDGE2 2537 2298 1.03178 0.0114236 -0.0111692 1 0 1 1 0 0 +EDGE2 2537 2418 0.952626 0.0249058 0.00262315 1 0 1 1 0 0 +EDGE2 2537 2438 1.03447 0.0362659 -0.0166567 1 0 1 1 0 0 +EDGE2 2537 1258 0.989513 0.0381986 0.00692882 1 0 1 1 0 0 +EDGE2 2538 2498 0.0219707 -0.0455602 -0.00114487 1 0 1 1 0 0 +EDGE2 2538 2497 -0.969917 -0.0532357 -0.00496537 1 0 1 1 0 0 +EDGE2 2538 2537 -0.907599 -0.0213788 -0.00198699 1 0 1 1 0 0 +EDGE2 2538 2297 -0.978525 -0.01038 0.0138954 1 0 1 1 0 0 +EDGE2 2538 2417 -0.978382 -0.00362497 0.0232083 1 0 1 1 0 0 +EDGE2 2538 2437 -0.925654 -0.00515748 0.0316497 1 0 1 1 0 0 +EDGE2 2538 1257 -0.996958 -0.0371336 0.019203 1 0 1 1 0 0 +EDGE2 2538 2298 0.0186478 -0.0172701 -0.0138121 1 0 1 1 0 0 +EDGE2 2538 2418 -0.065448 -0.00960927 0.00791643 1 0 1 1 0 0 +EDGE2 2538 2438 -0.0469373 0.0260058 0.0185672 1 0 1 1 0 0 +EDGE2 2538 1258 0.0249692 0.0157414 0.00434212 1 0 1 1 0 0 +EDGE2 2538 2499 1.02442 -0.056582 0.0121005 1 0 1 1 0 0 +EDGE2 2538 2299 1.10641 -0.0254252 0.0089975 1 0 1 1 0 0 +EDGE2 2538 2419 0.989468 0.0265867 -0.00419933 1 0 1 1 0 0 +EDGE2 2538 2439 0.961622 -0.0464053 -0.0293185 1 0 1 1 0 0 +EDGE2 2538 1259 0.971708 -0.0138227 -0.0156665 1 0 1 1 0 0 +EDGE2 2539 2498 -1.03707 0.045853 -0.00839321 1 0 1 1 0 0 +EDGE2 2539 2538 -0.971519 0.000477951 0.0267101 1 0 1 1 0 0 +EDGE2 2539 2298 -1.05223 -0.109053 -0.045022 1 0 1 1 0 0 +EDGE2 2539 2418 -0.979914 0.00621185 -0.0187934 1 0 1 1 0 0 +EDGE2 2539 2438 -1.06108 0.0757264 -0.0430187 1 0 1 1 0 0 +EDGE2 2539 1258 -1.02724 -0.0805587 0.00651441 1 0 1 1 0 0 +EDGE2 2539 2499 -0.0594863 0.051413 -0.00304802 1 0 1 1 0 0 +EDGE2 2539 2299 -0.00123184 0.090068 0.0222752 1 0 1 1 0 0 +EDGE2 2539 2419 -0.0367413 -0.0338813 0.0278927 1 0 1 1 0 0 +EDGE2 2539 2439 -0.021177 0.0461495 0.0151698 1 0 1 1 0 0 +EDGE2 2539 1259 0.0300208 -0.0315435 0.00631842 1 0 1 1 0 0 +EDGE2 2539 2420 1.01801 0.0133921 0.00709366 1 0 1 1 0 0 +EDGE2 2539 2500 1.04752 -0.04296 0.0444333 1 0 1 1 0 0 +EDGE2 2539 2520 1.0202 -0.00128362 -3.15475 1 0 1 1 0 0 +EDGE2 2539 2440 1.05163 0.0436619 0.00843231 1 0 1 1 0 0 +EDGE2 2539 2300 0.945463 0.0741464 0.0269335 1 0 1 1 0 0 +EDGE2 2539 1260 0.975377 0.0100672 0.0144299 1 0 1 1 0 0 +EDGE2 2540 2441 0.0215497 -1.08429 -1.57515 1 0 1 1 0 0 +EDGE2 2540 2521 -0.053685 1.05638 1.5581 1 0 1 1 0 0 +EDGE2 2540 2301 -0.0489043 1.0132 1.54237 1 0 1 1 0 0 +EDGE2 2540 2421 -0.00623292 0.94522 1.62129 1 0 1 1 0 0 +EDGE2 2540 1261 -0.08748 1.0833 1.54924 1 0 1 1 0 0 +EDGE2 2540 2499 -1.02053 -0.0222205 -0.0104341 1 0 1 1 0 0 +EDGE2 2540 2539 -1.08696 -0.00224922 0.0265422 1 0 1 1 0 0 +EDGE2 2540 2299 -0.991109 -0.0283383 0.0203294 1 0 1 1 0 0 +EDGE2 2540 2419 -1.01084 0.0612285 0.0111224 1 0 1 1 0 0 +EDGE2 2540 2439 -1.01685 0.100734 -0.0125095 1 0 1 1 0 0 +EDGE2 2540 1259 -1.09583 0.0508058 0.00471344 1 0 1 1 0 0 +EDGE2 2540 2420 0.0558197 0.00850123 -0.0226879 1 0 1 1 0 0 +EDGE2 2540 2500 0.0346282 -0.047107 -0.00267267 1 0 1 1 0 0 +EDGE2 2540 2520 -0.0281909 0.0212514 -3.17342 1 0 1 1 0 0 +EDGE2 2540 2440 0.0440022 -0.030495 0.000754111 1 0 1 1 0 0 +EDGE2 2540 2300 -0.0614165 0.0521251 0.013072 1 0 1 1 0 0 +EDGE2 2540 1260 -0.0355948 -0.0159111 -0.00973072 1 0 1 1 0 0 +EDGE2 2540 2501 -0.0109099 -1.05144 -1.5422 1 0 1 1 0 0 +EDGE2 2540 2519 1.01128 0.0273367 -3.17247 1 0 1 1 0 0 +EDGE2 2541 2302 0.891998 -0.0572252 -0.0051755 1 0 1 1 0 0 +EDGE2 2541 2522 0.982431 0.0571979 -0.0270599 1 0 1 1 0 0 +EDGE2 2541 2422 1.04268 -0.0343251 0.0249966 1 0 1 1 0 0 +EDGE2 2541 2521 0.0577659 0.0421691 4.06926e-05 1 0 1 1 0 0 +EDGE2 2541 1262 0.954541 0.0659767 0.00541469 1 0 1 1 0 0 +EDGE2 2541 2301 -0.0596475 0.0319371 -0.0151721 1 0 1 1 0 0 +EDGE2 2541 2421 -0.00528379 0.00922792 -0.00110432 1 0 1 1 0 0 +EDGE2 2541 1261 -0.019622 0.0226943 0.00316364 1 0 1 1 0 0 +EDGE2 2541 2420 -1.03511 -0.00876243 -1.57779 1 0 1 1 0 0 +EDGE2 2541 2500 -1.00942 -0.0240186 -1.57066 1 0 1 1 0 0 +EDGE2 2541 2520 -0.9761 -0.052723 1.56848 1 0 1 1 0 0 +EDGE2 2541 2540 -1.01315 -0.0482762 -1.57461 1 0 1 1 0 0 +EDGE2 2541 2440 -0.996772 0.0708342 -1.55253 1 0 1 1 0 0 +EDGE2 2541 2300 -0.98354 0.0107787 -1.59605 1 0 1 1 0 0 +EDGE2 2541 1260 -0.988574 0.0446167 -1.53882 1 0 1 1 0 0 +EDGE2 2542 2302 -0.117792 0.0264508 -0.0322241 1 0 1 1 0 0 +EDGE2 2542 2303 0.991434 0.0118609 0.0124872 1 0 1 1 0 0 +EDGE2 2542 2423 1.02292 -0.0299741 0.00979463 1 0 1 1 0 0 +EDGE2 2542 2523 1.04778 -0.0452398 0.00202893 1 0 1 1 0 0 +EDGE2 2542 1263 1.02303 0.05781 0.000168264 1 0 1 1 0 0 +EDGE2 2542 2522 0.00719525 -0.0841537 -0.0136979 1 0 1 1 0 0 +EDGE2 2542 2422 0.0394767 0.101681 0.0235788 1 0 1 1 0 0 +EDGE2 2542 2521 -0.966066 -0.0546282 -0.0143886 1 0 1 1 0 0 +EDGE2 2542 1262 0.088513 0.0203589 -0.0272041 1 0 1 1 0 0 +EDGE2 2542 2541 -0.920294 -0.0539592 -0.00576223 1 0 1 1 0 0 +EDGE2 2542 2301 -0.944483 0.0416421 -0.0268491 1 0 1 1 0 0 +EDGE2 2542 2421 -1.00815 0.0140571 -0.0216298 1 0 1 1 0 0 +EDGE2 2542 1261 -0.889449 0.0469076 0.0177392 1 0 1 1 0 0 +EDGE2 2543 2424 1.05802 -0.0263335 -0.00588355 1 0 1 1 0 0 +EDGE2 2543 2524 1.0224 -0.0799845 0.0108712 1 0 1 1 0 0 +EDGE2 2543 1264 1.06213 0.0810266 0.021091 1 0 1 1 0 0 +EDGE2 2543 2304 0.94261 -0.0397383 -0.0199973 1 0 1 1 0 0 +EDGE2 2543 2302 -1.01342 -0.000370133 0.00770573 1 0 1 1 0 0 +EDGE2 2543 2303 0.0140174 0.0085418 -0.00137078 1 0 1 1 0 0 +EDGE2 2543 2423 0.0462754 0.0123689 -0.00128136 1 0 1 1 0 0 +EDGE2 2543 2523 0.0855607 0.0561316 0.0155772 1 0 1 1 0 0 +EDGE2 2543 1263 -0.0401444 0.0203716 0.0442767 1 0 1 1 0 0 +EDGE2 2543 2522 -1.08544 0.00845843 -0.0015088 1 0 1 1 0 0 +EDGE2 2543 2542 -0.963385 -0.0375363 -0.0225477 1 0 1 1 0 0 +EDGE2 2543 2422 -1.0099 -0.02312 0.0103153 1 0 1 1 0 0 +EDGE2 2543 1262 -0.927675 0.0984661 0.00251799 1 0 1 1 0 0 +EDGE2 2544 2543 -0.953203 -0.0759382 0.016884 1 0 1 1 0 0 +EDGE2 2544 1265 1.05871 0.0364411 0.0315329 1 0 1 1 0 0 +EDGE2 2544 2305 0.994473 0.0611102 -0.0254507 1 0 1 1 0 0 +EDGE2 2544 2405 0.932396 -0.0911944 -3.13794 1 0 1 1 0 0 +EDGE2 2544 2425 0.974035 -0.0159021 0.00509318 1 0 1 1 0 0 +EDGE2 2544 2525 0.955702 -0.107591 0.0125377 1 0 1 1 0 0 +EDGE2 2544 2385 0.960881 -0.00438963 -3.13139 1 0 1 1 0 0 +EDGE2 2544 1565 1.09107 -0.0105218 -3.16929 1 0 1 1 0 0 +EDGE2 2544 1585 1.05258 -0.0341032 -3.12408 1 0 1 1 0 0 +EDGE2 2544 1845 0.980448 0.0248374 -3.14447 1 0 1 1 0 0 +EDGE2 2544 1545 0.991251 -0.0277155 -3.13168 1 0 1 1 0 0 +EDGE2 2544 2424 -0.0164739 0.0540936 0.014694 1 0 1 1 0 0 +EDGE2 2544 2524 -0.0413088 0.0498606 0.000407164 1 0 1 1 0 0 +EDGE2 2544 1264 0.0376489 -0.0123568 0.02671 1 0 1 1 0 0 +EDGE2 2544 2304 0.0496115 -9.76821e-05 0.0344623 1 0 1 1 0 0 +EDGE2 2544 2303 -0.992356 0.0152689 -0.00182293 1 0 1 1 0 0 +EDGE2 2544 2423 -0.988348 0.0436839 0.0110911 1 0 1 1 0 0 +EDGE2 2544 2523 -1.04866 -0.0513853 -0.0304044 1 0 1 1 0 0 +EDGE2 2544 1263 -1.04307 0.0126586 -0.0330676 1 0 1 1 0 0 +EDGE2 2545 1564 1.00901 0.0864002 -3.1477 1 0 1 1 0 0 +EDGE2 2545 1844 0.979981 0.0508946 -3.14828 1 0 1 1 0 0 +EDGE2 2545 2384 1.00324 0.00472717 -3.14051 1 0 1 1 0 0 +EDGE2 2545 2404 0.950253 0.0753873 -3.16876 1 0 1 1 0 0 +EDGE2 2545 1584 1.03654 -0.0452513 -3.14751 1 0 1 1 0 0 +EDGE2 2545 1544 1.03891 0.0582973 -3.15411 1 0 1 1 0 0 +EDGE2 2545 2426 0.00668488 0.946023 1.61 1 0 1 1 0 0 +EDGE2 2545 2526 -0.0222731 1.00308 1.55597 1 0 1 1 0 0 +EDGE2 2545 2406 -0.0623078 0.968566 1.55674 1 0 1 1 0 0 +EDGE2 2545 1546 -0.0276321 0.949765 1.54075 1 0 1 1 0 0 +EDGE2 2545 1265 0.0154241 0.0261651 -0.0174676 1 0 1 1 0 0 +EDGE2 2545 2305 0.0101393 -0.0465558 -0.000199468 1 0 1 1 0 0 +EDGE2 2545 2405 -0.00596581 -0.125897 -3.12814 1 0 1 1 0 0 +EDGE2 2545 2425 0.0425566 -0.0119404 0.011301 1 0 1 1 0 0 +EDGE2 2545 2525 -0.0352011 -0.00889524 0.0120973 1 0 1 1 0 0 +EDGE2 2545 2385 -0.105697 -0.0735503 -3.13411 1 0 1 1 0 0 +EDGE2 2545 1565 0.0249478 0.0217869 -3.15497 1 0 1 1 0 0 +EDGE2 2545 1585 -0.0816246 -0.0138402 -3.13977 1 0 1 1 0 0 +EDGE2 2545 1845 0.0730118 -0.071896 -3.14614 1 0 1 1 0 0 +EDGE2 2545 1545 -0.00464939 0.00500998 -3.15015 1 0 1 1 0 0 +EDGE2 2545 2424 -0.987624 0.0521841 -0.0187675 1 0 1 1 0 0 +EDGE2 2545 2544 -1.05016 0.0299389 -0.00691071 1 0 1 1 0 0 +EDGE2 2545 2524 -1.03211 0.0394065 -0.015778 1 0 1 1 0 0 +EDGE2 2545 1264 -1.00007 -0.0560072 -0.0521724 1 0 1 1 0 0 +EDGE2 2545 2304 -0.993522 0.0459549 -0.0405776 1 0 1 1 0 0 +EDGE2 2545 1566 -0.0234081 -1.0306 -1.5765 1 0 1 1 0 0 +EDGE2 2545 1846 -0.00344824 -0.928374 -1.5664 1 0 1 1 0 0 +EDGE2 2545 2306 -0.0485252 -1.05388 -1.55311 1 0 1 1 0 0 +EDGE2 2545 2386 -0.00899486 -1.00462 -1.58172 1 0 1 1 0 0 +EDGE2 2545 1586 0.00155821 -1.02256 -1.5672 1 0 1 1 0 0 +EDGE2 2545 1266 -3.50206e-05 -1.07637 -1.56943 1 0 1 1 0 0 +EDGE2 2546 2545 -1.06519 -0.0749338 -1.56878 1 0 1 1 0 0 +EDGE2 2546 2426 0.0423849 -0.0574211 -0.00118118 1 0 1 1 0 0 +EDGE2 2546 1547 1.00366 -0.0354535 -0.0131463 1 0 1 1 0 0 +EDGE2 2546 2427 1.04686 -0.0940904 -0.0246486 1 0 1 1 0 0 +EDGE2 2546 2527 0.945408 -0.00257882 -0.0361843 1 0 1 1 0 0 +EDGE2 2546 2407 0.980172 -0.133171 -0.0124777 1 0 1 1 0 0 +EDGE2 2546 2526 -0.0159263 0.0194593 0.0253472 1 0 1 1 0 0 +EDGE2 2546 2406 0.0020506 0.0672303 -0.0345149 1 0 1 1 0 0 +EDGE2 2546 1546 -0.0269455 -0.00644217 0.00110453 1 0 1 1 0 0 +EDGE2 2546 1265 -1.0534 0.0447113 -1.59795 1 0 1 1 0 0 +EDGE2 2546 2305 -0.966035 0.051704 -1.54056 1 0 1 1 0 0 +EDGE2 2546 2405 -1.12744 -0.0425858 1.56765 1 0 1 1 0 0 +EDGE2 2546 2425 -1.06146 -0.0492002 -1.57776 1 0 1 1 0 0 +EDGE2 2546 2525 -1.04738 0.0497664 -1.54742 1 0 1 1 0 0 +EDGE2 2546 2385 -0.950756 -0.0288258 1.56304 1 0 1 1 0 0 +EDGE2 2546 1565 -1.05923 0.0606904 1.57152 1 0 1 1 0 0 +EDGE2 2546 1585 -0.97476 -0.0260747 1.564 1 0 1 1 0 0 +EDGE2 2546 1845 -0.997883 0.0148904 1.57256 1 0 1 1 0 0 +EDGE2 2546 1545 -0.928989 -0.096134 1.57138 1 0 1 1 0 0 +EDGE2 2547 2528 0.936202 -0.0351365 0.0329981 1 0 1 1 0 0 +EDGE2 2547 1548 0.954788 -0.0381199 -0.0440514 1 0 1 1 0 0 +EDGE2 2547 2408 1.00945 0.017088 -0.00108726 1 0 1 1 0 0 +EDGE2 2547 2428 1.06216 0.00683445 -0.0236453 1 0 1 1 0 0 +EDGE2 2547 2426 -0.905186 -0.00343334 -0.000726435 1 0 1 1 0 0 +EDGE2 2547 1547 -0.118478 0.0134776 -0.0263008 1 0 1 1 0 0 +EDGE2 2547 2427 0.0197472 -0.0329174 -0.00283622 1 0 1 1 0 0 +EDGE2 2547 2527 -0.0719174 -0.00507568 0.0106121 1 0 1 1 0 0 +EDGE2 2547 2407 -0.0394017 0.0464209 -0.0227669 1 0 1 1 0 0 +EDGE2 2547 2546 -1.03218 -0.0080962 0.00454397 1 0 1 1 0 0 +EDGE2 2547 2526 -1.01659 -0.0229358 0.0199239 1 0 1 1 0 0 +EDGE2 2547 2406 -1.06114 0.05705 0.00474136 1 0 1 1 0 0 +EDGE2 2547 1546 -1.05148 0.0227891 0.0156218 1 0 1 1 0 0 +EDGE2 2548 2429 0.946939 0.0286815 -0.0230529 1 0 1 1 0 0 +EDGE2 2548 2529 0.986341 0.00155029 0.0329087 1 0 1 1 0 0 +EDGE2 2548 1549 0.9512 -0.0384716 -0.0143453 1 0 1 1 0 0 +EDGE2 2548 2409 1.05065 0.00682456 -0.00682856 1 0 1 1 0 0 +EDGE2 2548 2528 -0.0157986 0.00951852 -0.00210805 1 0 1 1 0 0 +EDGE2 2548 1548 -0.0822393 0.0540224 0.0148315 1 0 1 1 0 0 +EDGE2 2548 2408 -0.0401712 0.00976199 -0.0365492 1 0 1 1 0 0 +EDGE2 2548 2428 0.00504025 0.0337067 0.00271404 1 0 1 1 0 0 +EDGE2 2548 1547 -1.08159 0.030933 -0.00694835 1 0 1 1 0 0 +EDGE2 2548 2427 -0.984124 -0.0364076 -0.00475097 1 0 1 1 0 0 +EDGE2 2548 2527 -1.00365 -0.0373503 0.00411756 1 0 1 1 0 0 +EDGE2 2548 2547 -1.05708 -0.0447357 0.00650056 1 0 1 1 0 0 +EDGE2 2548 2407 -0.993831 -0.0714687 -0.0453448 1 0 1 1 0 0 +EDGE2 2549 2430 0.964356 0.0520312 -0.00823009 1 0 1 1 0 0 +EDGE2 2549 2530 1.07087 0.0873972 -0.0242092 1 0 1 1 0 0 +EDGE2 2549 1550 1.00307 0.0579961 -0.0211728 1 0 1 1 0 0 +EDGE2 2549 1830 0.995074 -0.00708291 -3.13504 1 0 1 1 0 0 +EDGE2 2549 2410 0.928633 0.0125243 0.0164854 1 0 1 1 0 0 +EDGE2 2549 2429 -0.0247893 -0.00310018 -0.0298005 1 0 1 1 0 0 +EDGE2 2549 2529 0.0114142 0.0746476 -0.0109421 1 0 1 1 0 0 +EDGE2 2549 1549 -0.00165791 -0.0126478 -0.0132888 1 0 1 1 0 0 +EDGE2 2549 2409 -0.0652263 0.0605397 -0.0326221 1 0 1 1 0 0 +EDGE2 2549 2528 -0.963269 -0.00329506 -0.0134604 1 0 1 1 0 0 +EDGE2 2549 2548 -1.01649 -0.0566943 -0.0209089 1 0 1 1 0 0 +EDGE2 2549 1548 -0.957991 0.0736048 0.0517629 1 0 1 1 0 0 +EDGE2 2549 2408 -1.03058 -0.00627945 0.0140465 1 0 1 1 0 0 +EDGE2 2549 2428 -1.03861 0.0139041 -0.0166583 1 0 1 1 0 0 +EDGE2 2550 1829 1.0269 -0.134614 -3.17096 1 0 1 1 0 0 +EDGE2 2550 1831 0.144369 -0.946292 -1.58471 1 0 1 1 0 0 +EDGE2 2550 1551 0.0471152 -1.0731 -1.55991 1 0 1 1 0 0 +EDGE2 2550 2411 0.00492035 0.985084 1.5966 1 0 1 1 0 0 +EDGE2 2550 2430 -0.0782613 0.0315518 -0.00617201 1 0 1 1 0 0 +EDGE2 2550 2530 -0.0542941 -0.025237 -0.0239909 1 0 1 1 0 0 +EDGE2 2550 1550 0.0552424 -0.0120565 0.0160871 1 0 1 1 0 0 +EDGE2 2550 1830 0.00209454 0.0323572 -3.14864 1 0 1 1 0 0 +EDGE2 2550 2410 -0.127341 0.0458105 0.0176135 1 0 1 1 0 0 +EDGE2 2550 2531 0.0479133 0.918086 1.56804 1 0 1 1 0 0 +EDGE2 2550 2431 0.0531173 1.03578 1.57245 1 0 1 1 0 0 +EDGE2 2550 2429 -1.06817 -0.0460493 -0.0295066 1 0 1 1 0 0 +EDGE2 2550 2549 -1.0064 -0.0776244 0.00293612 1 0 1 1 0 0 +EDGE2 2550 2529 -0.887088 0.00867952 -0.00616555 1 0 1 1 0 0 +EDGE2 2550 1549 -0.973511 -0.0164582 -0.00216976 1 0 1 1 0 0 +EDGE2 2550 2409 -1.04097 -0.102983 -0.00723673 1 0 1 1 0 0 +EDGE2 2551 2411 0.00259162 0.0227842 -0.00247004 1 0 1 1 0 0 +EDGE2 2551 2430 -0.869617 0.0324865 -1.59465 1 0 1 1 0 0 +EDGE2 2551 2550 -0.995973 0.0384505 -1.56378 1 0 1 1 0 0 +EDGE2 2551 2530 -0.972673 0.022346 -1.58121 1 0 1 1 0 0 +EDGE2 2551 1550 -0.967193 -0.0827464 -1.57692 1 0 1 1 0 0 +EDGE2 2551 1830 -0.972144 0.0553984 1.59562 1 0 1 1 0 0 +EDGE2 2551 2410 -1.01774 0.0386333 -1.55758 1 0 1 1 0 0 +EDGE2 2551 2531 0.0966814 -0.0173303 0.0151208 1 0 1 1 0 0 +EDGE2 2551 2431 -0.00491521 0.0274015 -0.0123184 1 0 1 1 0 0 +EDGE2 2551 2432 1.04807 -0.0163064 -0.0091745 1 0 1 1 0 0 +EDGE2 2551 2532 1.05135 0.0979476 0.019349 1 0 1 1 0 0 +EDGE2 2551 2412 0.980611 -0.0320789 -0.00774764 1 0 1 1 0 0 +EDGE2 2552 2411 -0.881478 -0.0325014 0.0401638 1 0 1 1 0 0 +EDGE2 2552 2531 -0.9583 0.0116157 -0.00210734 1 0 1 1 0 0 +EDGE2 2552 2551 -0.987065 -0.102948 -0.0248205 1 0 1 1 0 0 +EDGE2 2552 2431 -1.04656 -0.0261404 0.0378919 1 0 1 1 0 0 +EDGE2 2552 2533 1.04667 -0.011359 -0.00793694 1 0 1 1 0 0 +EDGE2 2552 2432 0.0892738 0.0726807 -0.0215527 1 0 1 1 0 0 +EDGE2 2552 2532 0.000481581 -0.0726082 0.00705562 1 0 1 1 0 0 +EDGE2 2552 2412 -0.070767 0.0319288 -0.00146363 1 0 1 1 0 0 +EDGE2 2552 2413 0.994458 0.0088129 0.0237455 1 0 1 1 0 0 +EDGE2 2552 2433 1.06628 -0.124252 -0.00171723 1 0 1 1 0 0 +EDGE2 2553 2533 -0.00804348 -0.0121101 0.00760156 1 0 1 1 0 0 +EDGE2 2553 2432 -1.00031 -0.00708705 -0.0181583 1 0 1 1 0 0 +EDGE2 2553 2552 -0.976643 -0.0529838 0.0163751 1 0 1 1 0 0 +EDGE2 2553 2532 -1.04312 -0.0362125 0.00738084 1 0 1 1 0 0 +EDGE2 2553 2412 -1.04156 0.035608 -0.00926434 1 0 1 1 0 0 +EDGE2 2553 2413 -0.0242872 -0.0164795 -0.0117179 1 0 1 1 0 0 +EDGE2 2553 2433 0.0169973 0.0642172 0.00663482 1 0 1 1 0 0 +EDGE2 2553 2414 0.972246 0.0195927 0.0053799 1 0 1 1 0 0 +EDGE2 2553 2434 1.03481 0.00622586 -0.0392316 1 0 1 1 0 0 +EDGE2 2553 2534 0.998 0.000729493 0.0195029 1 0 1 1 0 0 +EDGE2 2554 2533 -0.987153 0.0167217 0.00328224 1 0 1 1 0 0 +EDGE2 2554 2553 -1.01971 0.0632213 -0.00105091 1 0 1 1 0 0 +EDGE2 2554 2413 -0.993241 -0.0235685 -0.032634 1 0 1 1 0 0 +EDGE2 2554 2433 -0.966537 0.0306771 -0.0190035 1 0 1 1 0 0 +EDGE2 2554 2414 0.0231982 -0.0227713 -0.000632763 1 0 1 1 0 0 +EDGE2 2554 2434 -0.0867903 0.0150824 0.0188651 1 0 1 1 0 0 +EDGE2 2554 2534 -0.0299627 0.0337895 -0.00697852 1 0 1 1 0 0 +EDGE2 2554 1235 1.04782 0.0383506 -3.14622 1 0 1 1 0 0 +EDGE2 2554 2455 1.01732 -0.0471631 -3.12309 1 0 1 1 0 0 +EDGE2 2554 2535 1.04859 -0.0519571 0.00196892 1 0 1 1 0 0 +EDGE2 2554 2495 0.974866 0.00764957 -3.16813 1 0 1 1 0 0 +EDGE2 2554 2295 0.925244 0.0651518 -3.10317 1 0 1 1 0 0 +EDGE2 2554 2415 0.963931 0.145632 0.000827798 1 0 1 1 0 0 +EDGE2 2554 2435 0.992703 -0.00134289 0.0161161 1 0 1 1 0 0 +EDGE2 2554 1255 0.998629 -0.0254502 -3.12674 1 0 1 1 0 0 +EDGE2 2555 2416 -0.00473328 0.964394 1.56189 1 0 1 1 0 0 +EDGE2 2555 2456 0.0721937 -1.06818 -1.59101 1 0 1 1 0 0 +EDGE2 2555 1236 -0.0363141 -0.941511 -1.58358 1 0 1 1 0 0 +EDGE2 2555 2554 -0.945895 0.0394347 -0.0231331 1 0 1 1 0 0 +EDGE2 2555 2414 -1.02352 -0.0127826 0.00222604 1 0 1 1 0 0 +EDGE2 2555 2434 -0.985006 -0.0333892 -0.0233517 1 0 1 1 0 0 +EDGE2 2555 2534 -1.0053 0.124795 -0.0212906 1 0 1 1 0 0 +EDGE2 2555 1235 0.00120718 0.0490519 -3.14886 1 0 1 1 0 0 +EDGE2 2555 2455 0.0273531 -0.0624413 -3.11255 1 0 1 1 0 0 +EDGE2 2555 2535 0.0568118 -0.0335214 -0.00484788 1 0 1 1 0 0 +EDGE2 2555 2495 0.0184103 0.00267258 -3.13537 1 0 1 1 0 0 +EDGE2 2555 2295 -0.0693984 -0.0223257 -3.1455 1 0 1 1 0 0 +EDGE2 2555 2415 -0.00628365 -0.0410133 -0.0182005 1 0 1 1 0 0 +EDGE2 2555 2435 -0.00574731 -0.0948795 0.0132605 1 0 1 1 0 0 +EDGE2 2555 1255 0.100682 -0.0135209 -3.14005 1 0 1 1 0 0 +EDGE2 2555 1254 0.967452 3.3751e-05 -3.12419 1 0 1 1 0 0 +EDGE2 2555 2454 0.982511 0.0397105 -3.1465 1 0 1 1 0 0 +EDGE2 2555 2494 0.902206 0.00655198 -3.1663 1 0 1 1 0 0 +EDGE2 2555 2294 0.94889 -0.115335 -3.12567 1 0 1 1 0 0 +EDGE2 2555 1234 0.972052 0.0246615 -3.1291 1 0 1 1 0 0 +EDGE2 2555 2496 0.0114985 0.987785 1.57409 1 0 1 1 0 0 +EDGE2 2555 2536 -0.0188123 1.08826 1.58861 1 0 1 1 0 0 +EDGE2 2555 2436 0.0394085 0.999529 1.55037 1 0 1 1 0 0 +EDGE2 2555 1256 -0.0926408 0.922884 1.56697 1 0 1 1 0 0 +EDGE2 2555 2296 0.0330024 1.02186 1.56331 1 0 1 1 0 0 +EDGE2 2556 2416 0.0528375 -0.0172115 0.0353663 1 0 1 1 0 0 +EDGE2 2556 1235 -0.98181 0.0734487 1.5963 1 0 1 1 0 0 +EDGE2 2556 2455 -1.06125 -0.0127722 1.55928 1 0 1 1 0 0 +EDGE2 2556 2535 -1.01951 0.044111 -1.57147 1 0 1 1 0 0 +EDGE2 2556 2555 -0.991137 0.0436072 -1.57279 1 0 1 1 0 0 +EDGE2 2556 2495 -1.04189 -0.061051 1.5683 1 0 1 1 0 0 +EDGE2 2556 2295 -1.06179 -0.0142879 1.58083 1 0 1 1 0 0 +EDGE2 2556 2415 -1.05475 0.0712224 -1.56636 1 0 1 1 0 0 +EDGE2 2556 2435 -1.04666 0.0650503 -1.55845 1 0 1 1 0 0 +EDGE2 2556 1255 -1.00355 -0.0162355 1.57904 1 0 1 1 0 0 +EDGE2 2556 2496 -0.0805683 0.00385612 0.0097899 1 0 1 1 0 0 +EDGE2 2556 2536 0.0238925 0.0325761 -0.0164253 1 0 1 1 0 0 +EDGE2 2556 2436 0.0259278 0.0405103 0.011066 1 0 1 1 0 0 +EDGE2 2556 1256 0.00677122 0.0721684 -0.0121769 1 0 1 1 0 0 +EDGE2 2556 2296 0.0591294 -0.0359728 0.0167039 1 0 1 1 0 0 +EDGE2 2556 2497 1.01349 -0.0632471 0.00177981 1 0 1 1 0 0 +EDGE2 2556 2537 1.00951 0.0965335 0.0131027 1 0 1 1 0 0 +EDGE2 2556 2297 0.84603 0.0308532 -0.00098498 1 0 1 1 0 0 +EDGE2 2556 2417 1.00878 0.0589427 -0.00380744 1 0 1 1 0 0 +EDGE2 2556 2437 0.977623 -0.057064 -0.0054924 1 0 1 1 0 0 +EDGE2 2556 1257 1.02017 -0.0184366 0.0119509 1 0 1 1 0 0 +EDGE2 2557 2416 -1.01522 -0.0613794 0.0150532 1 0 1 1 0 0 +EDGE2 2557 2556 -1.02523 -0.0439606 -0.016043 1 0 1 1 0 0 +EDGE2 2557 2496 -0.949598 0.0188225 -0.0251908 1 0 1 1 0 0 +EDGE2 2557 2536 -0.981482 0.0180321 -0.016087 1 0 1 1 0 0 +EDGE2 2557 2436 -1.01095 -0.0272698 -0.0416738 1 0 1 1 0 0 +EDGE2 2557 2498 1.03507 0.106918 -0.0118198 1 0 1 1 0 0 +EDGE2 2557 1256 -1.09194 -0.0205 -0.0137524 1 0 1 1 0 0 +EDGE2 2557 2296 -1.03697 0.0245118 -0.0238218 1 0 1 1 0 0 +EDGE2 2557 2497 0.083572 -0.0242862 0.0470472 1 0 1 1 0 0 +EDGE2 2557 2537 0.0169595 -0.0187841 -0.00873064 1 0 1 1 0 0 +EDGE2 2557 2297 -0.0185816 -0.115389 -0.0123341 1 0 1 1 0 0 +EDGE2 2557 2417 -0.0145479 0.0175346 -0.0112985 1 0 1 1 0 0 +EDGE2 2557 2437 0.0168327 -0.0605902 -0.0329731 1 0 1 1 0 0 +EDGE2 2557 1257 -0.0308203 0.0188361 0.036444 1 0 1 1 0 0 +EDGE2 2557 2538 1.02786 0.0434114 -0.0287811 1 0 1 1 0 0 +EDGE2 2557 2298 0.936416 -0.0507954 -0.0125344 1 0 1 1 0 0 +EDGE2 2557 2418 0.908093 0.046501 -0.0120278 1 0 1 1 0 0 +EDGE2 2557 2438 0.922425 0.00370166 -0.0319373 1 0 1 1 0 0 +EDGE2 2557 1258 0.991086 -0.0200805 0.0011257 1 0 1 1 0 0 +EDGE2 2558 2498 0.00770537 0.0180313 -0.0151724 1 0 1 1 0 0 +EDGE2 2558 2497 -0.935302 0.119144 -0.00746679 1 0 1 1 0 0 +EDGE2 2558 2557 -1.09143 0.0478856 0.00646059 1 0 1 1 0 0 +EDGE2 2558 2537 -0.935233 0.0287329 0.00309892 1 0 1 1 0 0 +EDGE2 2558 2297 -0.904335 -0.00609692 -0.0246679 1 0 1 1 0 0 +EDGE2 2558 2417 -1.02672 0.00647289 -0.0186975 1 0 1 1 0 0 +EDGE2 2558 2437 -0.905075 0.0320751 -0.0169951 1 0 1 1 0 0 +EDGE2 2558 1257 -1.05958 -0.0327069 -0.0349226 1 0 1 1 0 0 +EDGE2 2558 2538 0.0656529 0.0406066 -0.037562 1 0 1 1 0 0 +EDGE2 2558 2298 -0.0180398 -0.0147553 -0.00940893 1 0 1 1 0 0 +EDGE2 2558 2418 -0.0468791 -0.0279145 0.0300154 1 0 1 1 0 0 +EDGE2 2558 2438 -0.0465262 -0.0631837 0.00153906 1 0 1 1 0 0 +EDGE2 2558 1258 -0.0131349 -0.00271907 -0.0330706 1 0 1 1 0 0 +EDGE2 2558 2499 1.1607 0.0378439 0.0270929 1 0 1 1 0 0 +EDGE2 2558 2539 0.973085 -0.0386814 0.00267662 1 0 1 1 0 0 +EDGE2 2558 2299 1.08347 0.0528558 0.00841165 1 0 1 1 0 0 +EDGE2 2558 2419 0.897655 -0.000923693 0.0304288 1 0 1 1 0 0 +EDGE2 2558 2439 1.02161 0.0119419 -0.0181129 1 0 1 1 0 0 +EDGE2 2558 1259 0.983972 0.0210918 -0.017514 1 0 1 1 0 0 +EDGE2 2559 2498 -0.991091 -0.0794283 0.0148291 1 0 1 1 0 0 +EDGE2 2559 2558 -0.986554 -0.0356921 -0.00160189 1 0 1 1 0 0 +EDGE2 2559 2538 -0.990349 -0.140054 -0.0228025 1 0 1 1 0 0 +EDGE2 2559 2298 -1.0182 0.0054974 -0.0125889 1 0 1 1 0 0 +EDGE2 2559 2418 -1.01339 -0.0392102 0.0199832 1 0 1 1 0 0 +EDGE2 2559 2438 -0.981261 0.0251703 0.0276438 1 0 1 1 0 0 +EDGE2 2559 1258 -1.02449 -0.0177474 -0.00544702 1 0 1 1 0 0 +EDGE2 2559 2499 0.00831716 0.012264 0.00369113 1 0 1 1 0 0 +EDGE2 2559 2539 -0.0268989 -0.0923215 -0.000580734 1 0 1 1 0 0 +EDGE2 2559 2299 0.0234801 0.0170004 0.0165155 1 0 1 1 0 0 +EDGE2 2559 2419 -0.0307841 0.0534468 -0.0122629 1 0 1 1 0 0 +EDGE2 2559 2439 0.00857657 0.0896909 0.0264191 1 0 1 1 0 0 +EDGE2 2559 1259 0.017233 0.03031 -0.0147284 1 0 1 1 0 0 +EDGE2 2559 2420 1.0111 -0.021335 0.0344112 1 0 1 1 0 0 +EDGE2 2559 2500 1.05377 -0.0469632 -0.00499667 1 0 1 1 0 0 +EDGE2 2559 2520 0.886385 0.112535 -3.13648 1 0 1 1 0 0 +EDGE2 2559 2540 0.907621 0.0370872 -0.0185839 1 0 1 1 0 0 +EDGE2 2559 2440 1.01156 0.023357 -0.0156578 1 0 1 1 0 0 +EDGE2 2559 2300 0.919976 0.100897 -0.00356039 1 0 1 1 0 0 +EDGE2 2559 1260 0.950181 -0.0452441 0.0349384 1 0 1 1 0 0 +EDGE2 2560 2441 -0.0252458 -0.990232 -1.56545 1 0 1 1 0 0 +EDGE2 2560 2521 -0.0432115 0.921082 1.5715 1 0 1 1 0 0 +EDGE2 2560 2541 0.0662711 1.01945 1.59359 1 0 1 1 0 0 +EDGE2 2560 2301 0.022669 0.926798 1.60842 1 0 1 1 0 0 +EDGE2 2560 2421 -0.0477585 0.983374 1.56213 1 0 1 1 0 0 +EDGE2 2560 1261 -0.0341983 1.02743 1.58805 1 0 1 1 0 0 +EDGE2 2560 2499 -0.965231 -0.0183876 6.63165e-05 1 0 1 1 0 0 +EDGE2 2560 2559 -1.01052 -0.0505203 -0.0246634 1 0 1 1 0 0 +EDGE2 2560 2539 -0.931951 -0.0619249 -0.00202945 1 0 1 1 0 0 +EDGE2 2560 2299 -1.06491 0.070522 -0.010109 1 0 1 1 0 0 +EDGE2 2560 2419 -0.971344 0.0533395 0.0123187 1 0 1 1 0 0 +EDGE2 2560 2439 -0.959933 0.0146875 -0.00748741 1 0 1 1 0 0 +EDGE2 2560 1259 -0.884657 -0.0972193 -0.00727478 1 0 1 1 0 0 +EDGE2 2560 2420 0.0112091 -0.0396865 0.0261684 1 0 1 1 0 0 +EDGE2 2560 2500 -0.022207 0.0295186 -0.00885356 1 0 1 1 0 0 +EDGE2 2560 2520 -0.0518783 0.00956001 -3.15572 1 0 1 1 0 0 +EDGE2 2560 2540 0.000228631 -0.063116 -0.0188889 1 0 1 1 0 0 +EDGE2 2560 2440 0.0183049 0.00182903 0.0126695 1 0 1 1 0 0 +EDGE2 2560 2300 -0.0188267 -0.0216718 0.00487271 1 0 1 1 0 0 +EDGE2 2560 1260 -0.0399195 -0.0972935 -0.00540179 1 0 1 1 0 0 +EDGE2 2560 2501 -0.0179897 -0.951896 -1.56049 1 0 1 1 0 0 +EDGE2 2560 2519 1.05099 0.0565163 -3.16942 1 0 1 1 0 0 +EDGE2 2561 2302 1.02568 -0.0606873 -0.00807666 1 0 1 1 0 0 +EDGE2 2561 2522 1.03557 0.0846611 -0.000398577 1 0 1 1 0 0 +EDGE2 2561 2542 0.991517 0.0649309 0.0357327 1 0 1 1 0 0 +EDGE2 2561 2422 0.972175 -0.082397 -0.000388228 1 0 1 1 0 0 +EDGE2 2561 2521 -0.018652 0.11248 0.00860215 1 0 1 1 0 0 +EDGE2 2561 1262 0.982511 -0.0429325 0.00235335 1 0 1 1 0 0 +EDGE2 2561 2541 -0.0737482 -0.059694 -0.00871608 1 0 1 1 0 0 +EDGE2 2561 2301 0.0298543 -0.0657306 -0.0167853 1 0 1 1 0 0 +EDGE2 2561 2421 0.0159378 0.0253755 0.0432384 1 0 1 1 0 0 +EDGE2 2561 1261 0.0674489 -0.0277913 -0.0290287 1 0 1 1 0 0 +EDGE2 2561 2420 -0.953823 0.0336383 -1.57589 1 0 1 1 0 0 +EDGE2 2561 2560 -1.02963 -0.0221099 -1.55636 1 0 1 1 0 0 +EDGE2 2561 2500 -1.04882 -0.128277 -1.55539 1 0 1 1 0 0 +EDGE2 2561 2520 -0.96881 0.0147633 1.56887 1 0 1 1 0 0 +EDGE2 2561 2540 -0.94146 -0.0823474 -1.56815 1 0 1 1 0 0 +EDGE2 2561 2440 -1.00777 0.0511454 -1.5795 1 0 1 1 0 0 +EDGE2 2561 2300 -0.957264 0.0105704 -1.57216 1 0 1 1 0 0 +EDGE2 2561 1260 -0.975515 -0.0342786 -1.57485 1 0 1 1 0 0 +EDGE2 2562 2543 1.02677 0.0144258 0.00714854 1 0 1 1 0 0 +EDGE2 2562 2302 0.0760598 0.0101262 0.00756751 1 0 1 1 0 0 +EDGE2 2562 2303 1.01357 0.112586 0.0191157 1 0 1 1 0 0 +EDGE2 2562 2423 1.00187 0.0397462 -0.00633918 1 0 1 1 0 0 +EDGE2 2562 2523 1.04869 -0.025396 -0.0205624 1 0 1 1 0 0 +EDGE2 2562 1263 0.96201 0.0356199 -0.0303494 1 0 1 1 0 0 +EDGE2 2562 2522 -0.00712265 -0.105553 -0.0364356 1 0 1 1 0 0 +EDGE2 2562 2542 0.0482088 -0.0638791 -0.0197365 1 0 1 1 0 0 +EDGE2 2562 2422 -0.0714038 -0.03495 0.0184257 1 0 1 1 0 0 +EDGE2 2562 2521 -0.983385 -0.0208925 0.0337257 1 0 1 1 0 0 +EDGE2 2562 2561 -0.985971 -0.0382112 0.0284997 1 0 1 1 0 0 +EDGE2 2562 1262 -0.00967674 -0.0384936 0.0284946 1 0 1 1 0 0 +EDGE2 2562 2541 -1.03329 0.0516674 0.0115778 1 0 1 1 0 0 +EDGE2 2562 2301 -0.9686 -0.0024199 0.0163821 1 0 1 1 0 0 +EDGE2 2562 2421 -1.04796 0.0108699 -0.01816 1 0 1 1 0 0 +EDGE2 2562 1261 -1.13652 -0.0220594 0.00198525 1 0 1 1 0 0 +EDGE2 2563 2543 -0.017795 -0.110815 0.0281105 1 0 1 1 0 0 +EDGE2 2563 2424 0.977392 0.0283578 0.0197914 1 0 1 1 0 0 +EDGE2 2563 2544 1.02017 -0.0737328 -0.037849 1 0 1 1 0 0 +EDGE2 2563 2524 0.948809 -0.0448436 0.00207905 1 0 1 1 0 0 +EDGE2 2563 1264 1.01371 -0.0174671 -0.0114771 1 0 1 1 0 0 +EDGE2 2563 2304 1.06762 0.0183871 0.0017382 1 0 1 1 0 0 +EDGE2 2563 2302 -1.0385 -0.138208 -0.00503238 1 0 1 1 0 0 +EDGE2 2563 2303 0.0526657 0.007221 -0.0124151 1 0 1 1 0 0 +EDGE2 2563 2423 0.0436146 -0.0549787 -0.0201935 1 0 1 1 0 0 +EDGE2 2563 2523 0.0215837 0.0487083 0.032065 1 0 1 1 0 0 +EDGE2 2563 1263 0.0336489 -0.00635496 0.00718847 1 0 1 1 0 0 +EDGE2 2563 2522 -0.966863 0.0305076 -0.0033965 1 0 1 1 0 0 +EDGE2 2563 2542 -0.97672 -0.0419087 0.0154436 1 0 1 1 0 0 +EDGE2 2563 2562 -1.01316 0.0938343 -0.0194915 1 0 1 1 0 0 +EDGE2 2563 2422 -0.946274 0.0189793 -0.00939767 1 0 1 1 0 0 +EDGE2 2563 1262 -1.00808 -0.0151063 -0.0295779 1 0 1 1 0 0 +EDGE2 2564 2545 0.976232 -0.0192138 0.0305994 1 0 1 1 0 0 +EDGE2 2564 2543 -1.019 0.0253553 -0.0174246 1 0 1 1 0 0 +EDGE2 2564 1265 0.960165 0.0324757 -0.0058936 1 0 1 1 0 0 +EDGE2 2564 2305 0.988285 0.0595321 0.00873472 1 0 1 1 0 0 +EDGE2 2564 2405 1.02728 -0.00465567 -3.14211 1 0 1 1 0 0 +EDGE2 2564 2425 0.978013 -0.140599 -0.0118684 1 0 1 1 0 0 +EDGE2 2564 2525 1.03583 0.0601499 0.0260014 1 0 1 1 0 0 +EDGE2 2564 2385 0.971114 -0.0373467 -3.11544 1 0 1 1 0 0 +EDGE2 2564 1565 0.997961 -0.0332475 -3.1574 1 0 1 1 0 0 +EDGE2 2564 1585 0.96606 0.0830891 -3.14409 1 0 1 1 0 0 +EDGE2 2564 1845 1.12208 0.0680894 -3.14064 1 0 1 1 0 0 +EDGE2 2564 1545 1.05146 0.0558906 -3.15692 1 0 1 1 0 0 +EDGE2 2564 2424 0.0229917 -0.0122479 0.0119798 1 0 1 1 0 0 +EDGE2 2564 2544 0.00567969 -0.0314746 -0.00919851 1 0 1 1 0 0 +EDGE2 2564 2524 -0.0504434 0.0301687 -0.00234823 1 0 1 1 0 0 +EDGE2 2564 1264 0.00974315 0.00281105 -0.00554285 1 0 1 1 0 0 +EDGE2 2564 2304 0.00349643 -0.0038683 0.0140934 1 0 1 1 0 0 +EDGE2 2564 2563 -1.02764 -0.0395767 -0.0253765 1 0 1 1 0 0 +EDGE2 2564 2303 -1.01496 0.0480903 0.0280557 1 0 1 1 0 0 +EDGE2 2564 2423 -1.0551 -0.0518438 0.00219398 1 0 1 1 0 0 +EDGE2 2564 2523 -1.00941 0.0737155 0.00802812 1 0 1 1 0 0 +EDGE2 2564 1263 -0.954976 -0.0851995 -0.0245888 1 0 1 1 0 0 +EDGE2 2565 1564 1.04179 0.0764655 -3.09806 1 0 1 1 0 0 +EDGE2 2565 1844 0.950835 0.00894462 -3.15661 1 0 1 1 0 0 +EDGE2 2565 2384 0.982926 0.0289216 -3.14206 1 0 1 1 0 0 +EDGE2 2565 2404 1.01353 -0.0600899 -3.12414 1 0 1 1 0 0 +EDGE2 2565 1584 0.980568 0.0458953 -3.13504 1 0 1 1 0 0 +EDGE2 2565 1544 1.08609 0.00892471 -3.11593 1 0 1 1 0 0 +EDGE2 2565 2545 -0.0166939 0.0112994 -0.0059066 1 0 1 1 0 0 +EDGE2 2565 2426 0.098912 1.00813 1.58594 1 0 1 1 0 0 +EDGE2 2565 2546 0.0675973 0.977197 1.59179 1 0 1 1 0 0 +EDGE2 2565 2526 -0.0225482 0.972485 1.56428 1 0 1 1 0 0 +EDGE2 2565 2406 -0.0158094 0.925684 1.54361 1 0 1 1 0 0 +EDGE2 2565 1546 0.061389 1.02503 1.5879 1 0 1 1 0 0 +EDGE2 2565 1265 -0.0211814 -0.0856778 0.0240191 1 0 1 1 0 0 +EDGE2 2565 2305 0.0693917 -0.0422062 0.0113148 1 0 1 1 0 0 +EDGE2 2565 2405 0.00582835 0.00994996 -3.15075 1 0 1 1 0 0 +EDGE2 2565 2425 0.0238894 -0.00739583 0.00202745 1 0 1 1 0 0 +EDGE2 2565 2525 0.0495487 -0.0574394 0.0169865 1 0 1 1 0 0 +EDGE2 2565 2385 -0.0403955 0.0321086 -3.141 1 0 1 1 0 0 +EDGE2 2565 1565 0.0869156 0.0924641 -3.12905 1 0 1 1 0 0 +EDGE2 2565 1585 0.016632 -0.0312559 -3.17826 1 0 1 1 0 0 +EDGE2 2565 1845 0.0190169 -0.0485266 -3.12734 1 0 1 1 0 0 +EDGE2 2565 1545 -0.131222 0.00735236 -3.12335 1 0 1 1 0 0 +EDGE2 2565 2424 -1.01715 0.036073 0.0149079 1 0 1 1 0 0 +EDGE2 2565 2544 -1.01158 0.0198178 -0.0181394 1 0 1 1 0 0 +EDGE2 2565 2564 -1.08335 -0.0460859 -0.00100504 1 0 1 1 0 0 +EDGE2 2565 2524 -0.997584 0.0435944 -0.0369224 1 0 1 1 0 0 +EDGE2 2565 1264 -1.07691 -0.0407974 0.0153548 1 0 1 1 0 0 +EDGE2 2565 2304 -1.03578 0.0267373 0.0485433 1 0 1 1 0 0 +EDGE2 2565 1566 -0.0489457 -0.968764 -1.5889 1 0 1 1 0 0 +EDGE2 2565 1846 -0.0372003 -1.00166 -1.54026 1 0 1 1 0 0 +EDGE2 2565 2306 0.00837324 -1.01483 -1.55619 1 0 1 1 0 0 +EDGE2 2565 2386 -0.0943032 -1.01084 -1.58156 1 0 1 1 0 0 +EDGE2 2565 1586 0.0206379 -0.955487 -1.54539 1 0 1 1 0 0 +EDGE2 2565 1266 -0.000203359 -1.06286 -1.58568 1 0 1 1 0 0 +EDGE2 2566 2545 -0.957907 -0.0238439 -1.54873 1 0 1 1 0 0 +EDGE2 2566 2426 0.0558956 -0.0618234 -0.0110857 1 0 1 1 0 0 +EDGE2 2566 1547 0.947025 -0.104969 0.0121637 1 0 1 1 0 0 +EDGE2 2566 2427 1.01174 0.0384815 -0.0154465 1 0 1 1 0 0 +EDGE2 2566 2527 1.02469 -0.0918933 -0.0125457 1 0 1 1 0 0 +EDGE2 2566 2547 1.03653 0.00909035 0.0135776 1 0 1 1 0 0 +EDGE2 2566 2407 0.977595 0.0431959 0.00329607 1 0 1 1 0 0 +EDGE2 2566 2546 -0.0125928 -0.0716496 0.000189966 1 0 1 1 0 0 +EDGE2 2566 2526 -0.00449655 0.0421891 -0.0165915 1 0 1 1 0 0 +EDGE2 2566 2406 0.0976321 -0.00502825 0.0425948 1 0 1 1 0 0 +EDGE2 2566 1546 0.0720233 -0.0137566 -0.0248856 1 0 1 1 0 0 +EDGE2 2566 2565 -0.996677 0.00650686 -1.54554 1 0 1 1 0 0 +EDGE2 2566 1265 -1.05519 -0.0517018 -1.5966 1 0 1 1 0 0 +EDGE2 2566 2305 -1.03049 -0.0735956 -1.56067 1 0 1 1 0 0 +EDGE2 2566 2405 -0.986119 -0.00496431 1.54667 1 0 1 1 0 0 +EDGE2 2566 2425 -1.02596 -0.0258573 -1.60055 1 0 1 1 0 0 +EDGE2 2566 2525 -0.956919 0.0158826 -1.5797 1 0 1 1 0 0 +EDGE2 2566 2385 -1.02227 -0.031902 1.56557 1 0 1 1 0 0 +EDGE2 2566 1565 -0.921336 0.105453 1.58128 1 0 1 1 0 0 +EDGE2 2566 1585 -1.07717 -0.0432233 1.57567 1 0 1 1 0 0 +EDGE2 2566 1845 -0.973739 -0.00426771 1.57118 1 0 1 1 0 0 +EDGE2 2566 1545 -0.994725 -0.016048 1.54589 1 0 1 1 0 0 +EDGE2 2567 2528 0.957729 0.0355652 -0.0157223 1 0 1 1 0 0 +EDGE2 2567 2548 1.03272 0.0410147 0.00441744 1 0 1 1 0 0 +EDGE2 2567 1548 1.08053 -0.0128474 0.0190367 1 0 1 1 0 0 +EDGE2 2567 2408 1.05444 0.0511674 -0.0367889 1 0 1 1 0 0 +EDGE2 2567 2428 1.0289 0.0661129 0.00390335 1 0 1 1 0 0 +EDGE2 2567 2426 -0.99541 -0.0723295 0.0177973 1 0 1 1 0 0 +EDGE2 2567 1547 -0.0226081 -0.0774808 0.0219014 1 0 1 1 0 0 +EDGE2 2567 2427 -0.0036139 -0.0164558 0.00277269 1 0 1 1 0 0 +EDGE2 2567 2527 0.0495012 -0.00549422 -0.000196028 1 0 1 1 0 0 +EDGE2 2567 2547 0.095831 -0.100182 -0.00477836 1 0 1 1 0 0 +EDGE2 2567 2407 -0.023027 0.00662108 0.0219656 1 0 1 1 0 0 +EDGE2 2567 2546 -0.924014 -0.0212188 -0.0456088 1 0 1 1 0 0 +EDGE2 2567 2566 -1.10882 0.027359 0.0319491 1 0 1 1 0 0 +EDGE2 2567 2526 -0.932838 -0.0909722 -0.0230458 1 0 1 1 0 0 +EDGE2 2567 2406 -0.969548 -0.0273995 -0.0244866 1 0 1 1 0 0 +EDGE2 2567 1546 -0.914903 -0.0567456 0.000667337 1 0 1 1 0 0 +EDGE2 2568 2429 1.03893 0.118529 -0.0197389 1 0 1 1 0 0 +EDGE2 2568 2549 1.089 0.0707807 -0.0241381 1 0 1 1 0 0 +EDGE2 2568 2529 0.955177 -0.0194004 -0.0205388 1 0 1 1 0 0 +EDGE2 2568 1549 0.978477 -0.0624612 0.00588906 1 0 1 1 0 0 +EDGE2 2568 2409 0.956094 -0.0239288 -0.023479 1 0 1 1 0 0 +EDGE2 2568 2567 -1.03394 -0.0500585 -0.000365682 1 0 1 1 0 0 +EDGE2 2568 2528 -0.090992 0.0289405 -0.0031262 1 0 1 1 0 0 +EDGE2 2568 2548 0.0010444 -0.059365 0.00764534 1 0 1 1 0 0 +EDGE2 2568 1548 -0.0260419 0.0890369 -0.0139447 1 0 1 1 0 0 +EDGE2 2568 2408 -0.0735464 0.0060781 -0.0325556 1 0 1 1 0 0 +EDGE2 2568 2428 -0.0929287 0.0398317 0.00112124 1 0 1 1 0 0 +EDGE2 2568 1547 -1.01216 0.0206042 0.0174367 1 0 1 1 0 0 +EDGE2 2568 2427 -0.962752 0.00941012 0.0220114 1 0 1 1 0 0 +EDGE2 2568 2527 -1.00075 0.00726183 -0.0175529 1 0 1 1 0 0 +EDGE2 2568 2547 -1.04898 -0.0430281 -0.00215369 1 0 1 1 0 0 +EDGE2 2568 2407 -0.984394 -0.0609067 0.0145599 1 0 1 1 0 0 +EDGE2 2569 2430 1.0269 0.00424533 -0.0481785 1 0 1 1 0 0 +EDGE2 2569 2550 1.02324 -0.107482 0.0263596 1 0 1 1 0 0 +EDGE2 2569 2530 1.0795 -0.00514702 -0.00660521 1 0 1 1 0 0 +EDGE2 2569 1550 0.959905 -0.0779766 -0.00104276 1 0 1 1 0 0 +EDGE2 2569 1830 0.89713 -0.131532 -3.12799 1 0 1 1 0 0 +EDGE2 2569 2410 0.953437 0.0281417 0.011485 1 0 1 1 0 0 +EDGE2 2569 2429 -0.00317511 0.0490495 0.00651667 1 0 1 1 0 0 +EDGE2 2569 2549 -0.0322959 0.0378016 0.0114291 1 0 1 1 0 0 +EDGE2 2569 2529 -0.00845061 -0.0329349 0.0199758 1 0 1 1 0 0 +EDGE2 2569 1549 0.0668703 0.0104383 -0.00423395 1 0 1 1 0 0 +EDGE2 2569 2409 0.0295532 -0.0977325 -0.00820398 1 0 1 1 0 0 +EDGE2 2569 2528 -1.09768 0.00398479 -0.0164696 1 0 1 1 0 0 +EDGE2 2569 2568 -0.941355 -0.0229245 0.0416326 1 0 1 1 0 0 +EDGE2 2569 2548 -0.987135 0.0634503 -0.0338039 1 0 1 1 0 0 +EDGE2 2569 1548 -1.00776 0.000350406 0.00566461 1 0 1 1 0 0 +EDGE2 2569 2408 -1.08299 -0.0255334 0.0199419 1 0 1 1 0 0 +EDGE2 2569 2428 -1.04207 -0.00552745 -0.0252998 1 0 1 1 0 0 +EDGE2 2570 1829 1.04196 0.0190535 -3.17813 1 0 1 1 0 0 +EDGE2 2570 1831 -0.0599741 -1.08538 -1.54497 1 0 1 1 0 0 +EDGE2 2570 1551 0.0545259 -1.02087 -1.57877 1 0 1 1 0 0 +EDGE2 2570 2411 0.0363462 0.965251 1.57618 1 0 1 1 0 0 +EDGE2 2570 2430 0.0644547 -0.0691387 0.027196 1 0 1 1 0 0 +EDGE2 2570 2550 0.0159973 0.0730285 0.00662848 1 0 1 1 0 0 +EDGE2 2570 2530 0.0371412 -0.050232 0.00995007 1 0 1 1 0 0 +EDGE2 2570 1550 -0.015217 -0.0700971 -0.0243479 1 0 1 1 0 0 +EDGE2 2570 1830 0.0721096 0.0320244 -3.12757 1 0 1 1 0 0 +EDGE2 2570 2410 -0.093217 0.0351046 0.00388474 1 0 1 1 0 0 +EDGE2 2570 2531 -0.0371013 1.03096 1.57109 1 0 1 1 0 0 +EDGE2 2570 2551 0.102324 0.93788 1.59117 1 0 1 1 0 0 +EDGE2 2570 2431 0.00420963 1.00029 1.56498 1 0 1 1 0 0 +EDGE2 2570 2429 -0.974474 -0.0337261 -0.0157577 1 0 1 1 0 0 +EDGE2 2570 2549 -0.884774 -0.0371004 -0.00254633 1 0 1 1 0 0 +EDGE2 2570 2569 -1.08052 -0.0271607 -0.00738838 1 0 1 1 0 0 +EDGE2 2570 2529 -0.975336 0.041227 -0.00638258 1 0 1 1 0 0 +EDGE2 2570 1549 -0.994838 0.0192442 -0.0211923 1 0 1 1 0 0 +EDGE2 2570 2409 -0.962238 -0.0257617 0.0102688 1 0 1 1 0 0 +EDGE2 2571 2411 -0.0940279 0.0155172 0.0266366 1 0 1 1 0 0 +EDGE2 2571 2430 -0.938819 -0.0137089 -1.54871 1 0 1 1 0 0 +EDGE2 2571 2550 -0.903325 -0.0118539 -1.57897 1 0 1 1 0 0 +EDGE2 2571 2570 -0.991011 0.0014186 -1.55602 1 0 1 1 0 0 +EDGE2 2571 2530 -0.965145 -0.00237443 -1.55915 1 0 1 1 0 0 +EDGE2 2571 1550 -1.02678 -0.0567163 -1.56814 1 0 1 1 0 0 +EDGE2 2571 1830 -0.887366 -0.0966116 1.56451 1 0 1 1 0 0 +EDGE2 2571 2410 -1.08118 0.0165077 -1.55616 1 0 1 1 0 0 +EDGE2 2571 2531 -0.00781897 -0.0345699 0.012319 1 0 1 1 0 0 +EDGE2 2571 2551 0.0209534 -0.0535327 0.00565479 1 0 1 1 0 0 +EDGE2 2571 2431 -0.0507623 -0.0433796 0.0160477 1 0 1 1 0 0 +EDGE2 2571 2432 0.979123 0.0112123 0.0392645 1 0 1 1 0 0 +EDGE2 2571 2552 1.03234 -0.00109356 -0.0138155 1 0 1 1 0 0 +EDGE2 2571 2532 1.05028 0.0360339 0.00680189 1 0 1 1 0 0 +EDGE2 2571 2412 0.953955 0.0661025 -0.0144166 1 0 1 1 0 0 +EDGE2 2572 2411 -1.04313 -0.0346277 -0.0309153 1 0 1 1 0 0 +EDGE2 2572 2571 -0.915621 0.0617612 0.00103746 1 0 1 1 0 0 +EDGE2 2572 2531 -1.04371 -0.0233013 0.00773627 1 0 1 1 0 0 +EDGE2 2572 2551 -0.985804 -0.0644272 -0.0117843 1 0 1 1 0 0 +EDGE2 2572 2431 -0.975668 0.060472 0.0082006 1 0 1 1 0 0 +EDGE2 2572 2533 0.995599 0.0476148 0.0115753 1 0 1 1 0 0 +EDGE2 2572 2432 0.0910504 0.00933122 0.00720407 1 0 1 1 0 0 +EDGE2 2572 2552 -0.0428782 -0.0597484 -0.00255324 1 0 1 1 0 0 +EDGE2 2572 2532 0.0310272 -0.0555599 -0.0194281 1 0 1 1 0 0 +EDGE2 2572 2412 -0.00106876 0.0422285 0.00431843 1 0 1 1 0 0 +EDGE2 2572 2553 1.03622 0.0510779 0.0361244 1 0 1 1 0 0 +EDGE2 2572 2413 1.02318 0.033339 0.0107181 1 0 1 1 0 0 +EDGE2 2572 2433 1.07231 -0.0229288 0.00269638 1 0 1 1 0 0 +EDGE2 2573 2533 0.0291535 -0.042766 0.0197672 1 0 1 1 0 0 +EDGE2 2573 2432 -0.961521 0.0394451 0.00992961 1 0 1 1 0 0 +EDGE2 2573 2552 -1.019 0.0374498 -0.0103181 1 0 1 1 0 0 +EDGE2 2573 2572 -1.016 -0.0382814 -0.00332682 1 0 1 1 0 0 +EDGE2 2573 2532 -1.04972 0.0699133 -0.00441435 1 0 1 1 0 0 +EDGE2 2573 2412 -0.98715 -0.0423339 -0.036543 1 0 1 1 0 0 +EDGE2 2573 2553 0.0593969 -0.0528437 0.0207327 1 0 1 1 0 0 +EDGE2 2573 2554 0.961384 -0.0211735 0.00671393 1 0 1 1 0 0 +EDGE2 2573 2413 -0.0101595 0.00448043 0.0386186 1 0 1 1 0 0 +EDGE2 2573 2433 -0.0719408 -0.00823896 0.00377616 1 0 1 1 0 0 +EDGE2 2573 2414 0.967438 -0.00957937 0.0136021 1 0 1 1 0 0 +EDGE2 2573 2434 0.950024 -0.0138619 0.0339787 1 0 1 1 0 0 +EDGE2 2573 2534 1.10387 0.0319988 0.0131672 1 0 1 1 0 0 +EDGE2 2574 2533 -0.958966 0.0453825 -0.0134643 1 0 1 1 0 0 +EDGE2 2574 2573 -0.947049 -0.00381317 0.0134353 1 0 1 1 0 0 +EDGE2 2574 2553 -1.1413 -0.0351082 -0.0180677 1 0 1 1 0 0 +EDGE2 2574 2554 -0.0433468 0.0404916 -0.0220939 1 0 1 1 0 0 +EDGE2 2574 2413 -0.999335 0.032534 0.0311299 1 0 1 1 0 0 +EDGE2 2574 2433 -0.950864 0.0588324 -0.0121057 1 0 1 1 0 0 +EDGE2 2574 2414 0.044654 -0.118006 -0.0197944 1 0 1 1 0 0 +EDGE2 2574 2434 0.13513 0.0167391 0.0279528 1 0 1 1 0 0 +EDGE2 2574 2534 0.00150647 -0.0820404 -0.0107809 1 0 1 1 0 0 +EDGE2 2574 1235 1.04847 0.036846 -3.13272 1 0 1 1 0 0 +EDGE2 2574 2455 1.08024 0.040877 -3.13478 1 0 1 1 0 0 +EDGE2 2574 2535 1.12612 0.0202904 -0.00564559 1 0 1 1 0 0 +EDGE2 2574 2555 0.914873 -0.0444865 0.01028 1 0 1 1 0 0 +EDGE2 2574 2495 0.918324 -0.0155237 -3.15531 1 0 1 1 0 0 +EDGE2 2574 2295 1.01444 -0.00518132 -3.15853 1 0 1 1 0 0 +EDGE2 2574 2415 1.03882 0.000772671 -0.0146777 1 0 1 1 0 0 +EDGE2 2574 2435 1.04997 0.0198024 -0.0232151 1 0 1 1 0 0 +EDGE2 2574 1255 1.00101 0.000940851 -3.10608 1 0 1 1 0 0 +EDGE2 2575 2416 0.0142277 1.02881 1.57626 1 0 1 1 0 0 +EDGE2 2575 2456 -0.0544829 -1.04424 -1.5774 1 0 1 1 0 0 +EDGE2 2575 1236 0.0345602 -1.03324 -1.57008 1 0 1 1 0 0 +EDGE2 2575 2554 -0.986429 -0.00485312 -0.00607564 1 0 1 1 0 0 +EDGE2 2575 2574 -1.01046 -0.0542799 -0.00758799 1 0 1 1 0 0 +EDGE2 2575 2414 -0.966738 -0.0620336 0.00564801 1 0 1 1 0 0 +EDGE2 2575 2434 -1.01758 0.0838862 0.0134198 1 0 1 1 0 0 +EDGE2 2575 2534 -0.989235 -0.0769816 -0.0179203 1 0 1 1 0 0 +EDGE2 2575 1235 -0.0315922 -0.0604015 -3.1532 1 0 1 1 0 0 +EDGE2 2575 2455 0.0669046 -0.0487339 -3.13076 1 0 1 1 0 0 +EDGE2 2575 2535 -0.0570577 0.0101141 0.0363443 1 0 1 1 0 0 +EDGE2 2575 2555 0.0239673 0.00842408 -0.0189698 1 0 1 1 0 0 +EDGE2 2575 2495 -0.0184433 0.0244209 -3.15245 1 0 1 1 0 0 +EDGE2 2575 2295 -0.0345736 -0.0734848 -3.15081 1 0 1 1 0 0 +EDGE2 2575 2415 0.0998866 0.032147 -0.00288992 1 0 1 1 0 0 +EDGE2 2575 2435 -0.052606 0.0298978 0.00685655 1 0 1 1 0 0 +EDGE2 2575 1255 -0.00521872 0.0304778 -3.14594 1 0 1 1 0 0 +EDGE2 2575 1254 1.03163 -0.0359631 -3.12408 1 0 1 1 0 0 +EDGE2 2575 2454 1.06083 0.0647311 -3.14668 1 0 1 1 0 0 +EDGE2 2575 2494 1.00694 0.0333567 -3.12602 1 0 1 1 0 0 +EDGE2 2575 2294 1.02747 -0.0508401 -3.12707 1 0 1 1 0 0 +EDGE2 2575 1234 1.04585 0.0379038 -3.16239 1 0 1 1 0 0 +EDGE2 2575 2556 -0.0491057 1.0732 1.53157 1 0 1 1 0 0 +EDGE2 2575 2496 -0.030669 0.990511 1.55354 1 0 1 1 0 0 +EDGE2 2575 2536 0.0407463 0.991907 1.57335 1 0 1 1 0 0 +EDGE2 2575 2436 0.0324389 1.03382 1.57169 1 0 1 1 0 0 +EDGE2 2575 1256 0.0199701 0.990595 1.5613 1 0 1 1 0 0 +EDGE2 2575 2296 -0.0293088 1.03616 1.59291 1 0 1 1 0 0 +EDGE2 2576 2416 -0.0266866 0.0757334 -0.0438879 1 0 1 1 0 0 +EDGE2 2576 1235 -1.00578 -0.021959 1.59712 1 0 1 1 0 0 +EDGE2 2576 2455 -0.961828 -0.0135772 1.59073 1 0 1 1 0 0 +EDGE2 2576 2535 -1.09607 -0.0334285 -1.55244 1 0 1 1 0 0 +EDGE2 2576 2555 -0.952646 0.0693502 -1.53858 1 0 1 1 0 0 +EDGE2 2576 2575 -0.856438 -0.000168859 -1.55223 1 0 1 1 0 0 +EDGE2 2576 2495 -0.976453 -0.0954645 1.55652 1 0 1 1 0 0 +EDGE2 2576 2295 -0.954079 -0.00830169 1.56216 1 0 1 1 0 0 +EDGE2 2576 2415 -0.995666 -0.028902 -1.58859 1 0 1 1 0 0 +EDGE2 2576 2435 -0.969589 -0.0535342 -1.57133 1 0 1 1 0 0 +EDGE2 2576 1255 -0.94652 0.040716 1.5879 1 0 1 1 0 0 +EDGE2 2576 2556 0.0890157 -0.0827251 -0.0106955 1 0 1 1 0 0 +EDGE2 2576 2496 -0.0466541 0.011618 -0.00339304 1 0 1 1 0 0 +EDGE2 2576 2536 -0.026567 -0.0398505 0.00186239 1 0 1 1 0 0 +EDGE2 2576 2436 0.0328902 0.0607192 -0.0530372 1 0 1 1 0 0 +EDGE2 2576 1256 -0.049621 -0.0508107 -0.0109369 1 0 1 1 0 0 +EDGE2 2576 2296 0.00401599 -0.087439 0.0128159 1 0 1 1 0 0 +EDGE2 2576 2497 1.01328 -0.0331152 -0.00805727 1 0 1 1 0 0 +EDGE2 2576 2557 0.945709 -0.0293818 -0.02432 1 0 1 1 0 0 +EDGE2 2576 2537 0.950988 -0.0827928 0.0284242 1 0 1 1 0 0 +EDGE2 2576 2297 1.06452 0.0214623 0.0407569 1 0 1 1 0 0 +EDGE2 2576 2417 0.96677 -0.00832468 -0.017278 1 0 1 1 0 0 +EDGE2 2576 2437 0.981266 -0.0141908 0.0167529 1 0 1 1 0 0 +EDGE2 2576 1257 1.0194 -0.0493678 0.0156117 1 0 1 1 0 0 +EDGE2 2577 2416 -0.959722 0.0101471 0.0184411 1 0 1 1 0 0 +EDGE2 2577 2556 -0.968592 -0.0418163 -0.0174761 1 0 1 1 0 0 +EDGE2 2577 2576 -1.07267 -0.0397986 -0.0145192 1 0 1 1 0 0 +EDGE2 2577 2496 -0.930015 0.0437191 -0.0144136 1 0 1 1 0 0 +EDGE2 2577 2536 -1.00546 -0.0234836 0.0199145 1 0 1 1 0 0 +EDGE2 2577 2436 -0.961418 0.0120327 0.036477 1 0 1 1 0 0 +EDGE2 2577 2498 0.957709 -0.0086688 0.0132742 1 0 1 1 0 0 +EDGE2 2577 1256 -1.08531 0.00514491 -0.0223568 1 0 1 1 0 0 +EDGE2 2577 2296 -0.978081 -0.0923345 -0.00484936 1 0 1 1 0 0 +EDGE2 2577 2497 -0.0395746 -0.0022492 -0.0140778 1 0 1 1 0 0 +EDGE2 2577 2557 -0.0559742 0.0142185 0.00899163 1 0 1 1 0 0 +EDGE2 2577 2537 0.0487516 0.0149556 -0.00235477 1 0 1 1 0 0 +EDGE2 2577 2297 0.109532 0.0668368 0.00122162 1 0 1 1 0 0 +EDGE2 2577 2417 0.0419137 0.0054674 -0.0236775 1 0 1 1 0 0 +EDGE2 2577 2437 0.0356543 0.08114 0.00524322 1 0 1 1 0 0 +EDGE2 2577 1257 0.0517875 -0.0475828 -0.00577904 1 0 1 1 0 0 +EDGE2 2577 2558 0.952234 -0.0685536 -0.00259254 1 0 1 1 0 0 +EDGE2 2577 2538 0.954041 -0.0811703 -0.0104586 1 0 1 1 0 0 +EDGE2 2577 2298 1.10857 -0.0294563 -0.016368 1 0 1 1 0 0 +EDGE2 2577 2418 1.05501 0.094024 -0.0140661 1 0 1 1 0 0 +EDGE2 2577 2438 0.976416 0.0853781 0.0270265 1 0 1 1 0 0 +EDGE2 2577 1258 0.947366 -0.0437606 0.00747547 1 0 1 1 0 0 +EDGE2 2578 2498 -0.0279467 0.0683047 -0.0458342 1 0 1 1 0 0 +EDGE2 2578 2497 -0.960713 -0.0269486 0.0243662 1 0 1 1 0 0 +EDGE2 2578 2557 -0.90004 -0.0567094 0.00301432 1 0 1 1 0 0 +EDGE2 2578 2577 -0.96271 -0.100074 0.0118687 1 0 1 1 0 0 +EDGE2 2578 2537 -1.00152 -0.0552505 -0.00439704 1 0 1 1 0 0 +EDGE2 2578 2297 -0.973599 -0.0411405 -0.0166138 1 0 1 1 0 0 +EDGE2 2578 2417 -0.991415 0.0509317 -0.0322605 1 0 1 1 0 0 +EDGE2 2578 2437 -0.972022 0.0450714 0.0271705 1 0 1 1 0 0 +EDGE2 2578 1257 -1.02887 0.0592435 -0.00550882 1 0 1 1 0 0 +EDGE2 2578 2558 0.062143 0.0269779 0.0121321 1 0 1 1 0 0 +EDGE2 2578 2538 -0.0666983 0.0321883 0.00484133 1 0 1 1 0 0 +EDGE2 2578 2298 0.0193181 0.0919155 0.0209457 1 0 1 1 0 0 +EDGE2 2578 2418 -0.0683433 0.103451 -0.0261278 1 0 1 1 0 0 +EDGE2 2578 2438 -0.0332959 0.026437 -0.00304434 1 0 1 1 0 0 +EDGE2 2578 1258 -0.0564848 0.0094783 0.00975023 1 0 1 1 0 0 +EDGE2 2578 2499 1.04519 -0.0394381 -0.0100705 1 0 1 1 0 0 +EDGE2 2578 2559 0.919705 -0.0626558 -0.0344184 1 0 1 1 0 0 +EDGE2 2578 2539 0.957629 0.00507445 0.0031454 1 0 1 1 0 0 +EDGE2 2578 2299 1.00638 -0.0595971 0.0019392 1 0 1 1 0 0 +EDGE2 2578 2419 0.986898 -0.0648192 0.0186099 1 0 1 1 0 0 +EDGE2 2578 2439 0.972289 -0.00867563 0.0107662 1 0 1 1 0 0 +EDGE2 2578 1259 1.02231 0.0545287 0.0112826 1 0 1 1 0 0 +EDGE2 2579 2498 -1.01254 0.0485681 0.00896088 1 0 1 1 0 0 +EDGE2 2579 2558 -0.98681 0.0287117 0.00452548 1 0 1 1 0 0 +EDGE2 2579 2578 -0.959124 -0.111093 -0.00894856 1 0 1 1 0 0 +EDGE2 2579 2538 -1.0881 -0.0789328 0.0295035 1 0 1 1 0 0 +EDGE2 2579 2298 -0.936443 -0.0352767 -0.0359507 1 0 1 1 0 0 +EDGE2 2579 2418 -0.94054 0.031652 0.0164024 1 0 1 1 0 0 +EDGE2 2579 2438 -1.08828 0.0708867 0.0356407 1 0 1 1 0 0 +EDGE2 2579 1258 -1.03966 0.0658811 -0.013699 1 0 1 1 0 0 +EDGE2 2579 2499 0.0197015 -0.0149665 -0.00170159 1 0 1 1 0 0 +EDGE2 2579 2559 -0.00879233 -0.00204662 -0.0295035 1 0 1 1 0 0 +EDGE2 2579 2539 -0.00568224 -0.0713467 -0.000897094 1 0 1 1 0 0 +EDGE2 2579 2299 0.0247625 -0.0240044 0.0040598 1 0 1 1 0 0 +EDGE2 2579 2419 -0.0599939 -0.0707548 0.0132755 1 0 1 1 0 0 +EDGE2 2579 2439 0.110075 0.0180104 0.0111823 1 0 1 1 0 0 +EDGE2 2579 1259 0.029015 0.0221092 -0.00791365 1 0 1 1 0 0 +EDGE2 2579 2420 1.02321 -0.0220505 -0.0113512 1 0 1 1 0 0 +EDGE2 2579 2560 0.980853 0.0649176 -0.0171851 1 0 1 1 0 0 +EDGE2 2579 2500 1.05409 -0.0585901 0.00881 1 0 1 1 0 0 +EDGE2 2579 2520 0.920971 -0.0619257 -3.11949 1 0 1 1 0 0 +EDGE2 2579 2540 0.993315 -0.0717786 -0.0228071 1 0 1 1 0 0 +EDGE2 2579 2440 0.992019 -0.01766 0.0111198 1 0 1 1 0 0 +EDGE2 2579 2300 1.05552 0.0179186 0.0198647 1 0 1 1 0 0 +EDGE2 2579 1260 1.05369 -0.0607185 -0.0239632 1 0 1 1 0 0 +EDGE2 2580 2441 0.0398329 -0.974798 -1.55577 1 0 1 1 0 0 +EDGE2 2580 2521 -0.0782642 0.961928 1.57623 1 0 1 1 0 0 +EDGE2 2580 2561 -0.0402553 1.08073 1.58278 1 0 1 1 0 0 +EDGE2 2580 2541 0.0746004 0.920706 1.57077 1 0 1 1 0 0 +EDGE2 2580 2301 -0.00848423 1.0729 1.57991 1 0 1 1 0 0 +EDGE2 2580 2421 0.0423762 0.992176 1.57201 1 0 1 1 0 0 +EDGE2 2580 1261 0.0010364 1.04474 1.60415 1 0 1 1 0 0 +EDGE2 2580 2499 -1.07216 -0.0586296 -0.0096666 1 0 1 1 0 0 +EDGE2 2580 2559 -1.03105 -0.112049 0.0239944 1 0 1 1 0 0 +EDGE2 2580 2579 -1.00206 -0.0548437 -0.0293528 1 0 1 1 0 0 +EDGE2 2580 2539 -0.977474 -0.00695897 0.0106319 1 0 1 1 0 0 +EDGE2 2580 2299 -0.991643 0.0318381 -0.0195703 1 0 1 1 0 0 +EDGE2 2580 2419 -1.03326 -0.0675165 0.0123416 1 0 1 1 0 0 +EDGE2 2580 2439 -1.01694 0.0508272 -0.0296185 1 0 1 1 0 0 +EDGE2 2580 1259 -0.946896 -0.0426347 0.00198687 1 0 1 1 0 0 +EDGE2 2580 2420 0.0202553 0.0685075 -0.0118058 1 0 1 1 0 0 +EDGE2 2580 2560 0.00651341 -0.0313355 0.00677915 1 0 1 1 0 0 +EDGE2 2580 2500 -0.0516893 0.0748953 0.0032923 1 0 1 1 0 0 +EDGE2 2580 2520 -0.0295163 -0.00421343 -3.15387 1 0 1 1 0 0 +EDGE2 2580 2540 0.0508304 -0.116587 -0.020759 1 0 1 1 0 0 +EDGE2 2580 2440 -0.00427169 0.0353136 -0.00218297 1 0 1 1 0 0 +EDGE2 2580 2300 0.123144 0.0710551 0.00474007 1 0 1 1 0 0 +EDGE2 2580 1260 -0.0594178 0.0577415 -0.0182235 1 0 1 1 0 0 +EDGE2 2580 2501 -0.0326331 -1.04427 -1.65435 1 0 1 1 0 0 +EDGE2 2580 2519 1.04199 -0.11 -3.12013 1 0 1 1 0 0 +EDGE2 2581 2302 0.91719 -0.0050491 -0.0581948 1 0 1 1 0 0 +EDGE2 2581 2522 1.01972 -0.0636304 0.0157759 1 0 1 1 0 0 +EDGE2 2581 2542 1.03389 0.0175214 0.00571173 1 0 1 1 0 0 +EDGE2 2581 2562 1.11431 0.0322477 0.00101444 1 0 1 1 0 0 +EDGE2 2581 2422 1.01632 -0.0505946 -0.0401941 1 0 1 1 0 0 +EDGE2 2581 2521 0.0844785 0.0849101 0.0389684 1 0 1 1 0 0 +EDGE2 2581 2561 0.0144434 -0.117649 -0.0176301 1 0 1 1 0 0 +EDGE2 2581 1262 0.9791 0.0741205 -0.00878798 1 0 1 1 0 0 +EDGE2 2581 2541 -0.0940987 0.0811996 0.00633002 1 0 1 1 0 0 +EDGE2 2581 2301 0.00224307 -0.0597653 0.0144323 1 0 1 1 0 0 +EDGE2 2581 2421 0.0458435 -0.0164319 0.00545051 1 0 1 1 0 0 +EDGE2 2581 1261 0.0559107 0.00938595 -0.0242317 1 0 1 1 0 0 +EDGE2 2581 2420 -1.03081 0.0530954 -1.61243 1 0 1 1 0 0 +EDGE2 2581 2560 -1.02778 -0.0211815 -1.57164 1 0 1 1 0 0 +EDGE2 2581 2580 -0.974072 0.0259514 -1.53674 1 0 1 1 0 0 +EDGE2 2581 2500 -0.963329 -0.0429357 -1.58673 1 0 1 1 0 0 +EDGE2 2581 2520 -0.953491 0.0255923 1.53728 1 0 1 1 0 0 +EDGE2 2581 2540 -1.07227 0.0187681 -1.52054 1 0 1 1 0 0 +EDGE2 2581 2440 -1.05129 0.0420925 -1.5362 1 0 1 1 0 0 +EDGE2 2581 2300 -0.99285 -0.0673838 -1.53632 1 0 1 1 0 0 +EDGE2 2581 1260 -0.981752 0.0475322 -1.57603 1 0 1 1 0 0 +EDGE2 2582 2543 0.910892 0.0647208 -0.0516149 1 0 1 1 0 0 +EDGE2 2582 2563 0.979967 -0.0494902 -0.0263 1 0 1 1 0 0 +EDGE2 2582 2302 -0.00794516 0.0477764 0.00638008 1 0 1 1 0 0 +EDGE2 2582 2303 0.977101 0.0673142 0.0157787 1 0 1 1 0 0 +EDGE2 2582 2423 0.958016 0.00155888 -0.00570182 1 0 1 1 0 0 +EDGE2 2582 2523 1.15079 0.0488129 0.01038 1 0 1 1 0 0 +EDGE2 2582 1263 1.04137 -0.0293691 -0.0234187 1 0 1 1 0 0 +EDGE2 2582 2522 -0.0699699 0.0649904 -0.0289846 1 0 1 1 0 0 +EDGE2 2582 2542 0.0444579 0.0458396 -0.0101797 1 0 1 1 0 0 +EDGE2 2582 2562 -0.0253849 -0.00366945 0.00408734 1 0 1 1 0 0 +EDGE2 2582 2422 0.00644031 0.0480413 -0.0145874 1 0 1 1 0 0 +EDGE2 2582 2521 -1.06116 -0.0620333 0.00307967 1 0 1 1 0 0 +EDGE2 2582 2561 -1.06903 -0.105836 0.0050717 1 0 1 1 0 0 +EDGE2 2582 2581 -0.98609 -0.00538875 0.0226724 1 0 1 1 0 0 +EDGE2 2582 1262 0.00788761 -0.0488395 0.0234283 1 0 1 1 0 0 +EDGE2 2582 2541 -0.869277 -0.0403744 -0.023272 1 0 1 1 0 0 +EDGE2 2582 2301 -1.00155 -0.0125169 -0.0324442 1 0 1 1 0 0 +EDGE2 2582 2421 -0.984159 0.0273524 -0.0052507 1 0 1 1 0 0 +EDGE2 2582 1261 -0.998184 -0.00151493 -0.00190486 1 0 1 1 0 0 +EDGE2 2583 2543 0.000758686 0.0200517 -0.0297443 1 0 1 1 0 0 +EDGE2 2583 2424 1.05669 -0.00665904 0.00452761 1 0 1 1 0 0 +EDGE2 2583 2544 0.975964 -0.0326673 0.035062 1 0 1 1 0 0 +EDGE2 2583 2564 1.02753 -0.0521962 0.00543237 1 0 1 1 0 0 +EDGE2 2583 2524 0.994781 0.0847783 0.0354287 1 0 1 1 0 0 +EDGE2 2583 1264 1.016 -0.00161042 -0.00475009 1 0 1 1 0 0 +EDGE2 2583 2304 0.960254 0.0610918 0.0188636 1 0 1 1 0 0 +EDGE2 2583 2563 0.0203734 0.042551 -0.034792 1 0 1 1 0 0 +EDGE2 2583 2302 -0.973652 0.0469727 0.00518059 1 0 1 1 0 0 +EDGE2 2583 2582 -0.956506 0.0231201 -0.0311089 1 0 1 1 0 0 +EDGE2 2583 2303 0.00974715 -0.0308729 0.00605923 1 0 1 1 0 0 +EDGE2 2583 2423 0.0471338 0.0519693 0.0202641 1 0 1 1 0 0 +EDGE2 2583 2523 -0.011473 0.0487447 0.0111749 1 0 1 1 0 0 +EDGE2 2583 1263 0.0230104 0.0211422 -0.0279528 1 0 1 1 0 0 +EDGE2 2583 2522 -0.972294 -0.0416501 0.0200077 1 0 1 1 0 0 +EDGE2 2583 2542 -1.00922 -0.00586221 -0.00870221 1 0 1 1 0 0 +EDGE2 2583 2562 -0.997196 -0.1047 -0.0422285 1 0 1 1 0 0 +EDGE2 2583 2422 -1.00328 0.0703383 0.014586 1 0 1 1 0 0 +EDGE2 2583 1262 -1.03293 0.017865 -0.0236263 1 0 1 1 0 0 +EDGE2 2584 2545 0.91244 0.0354739 0.0299849 1 0 1 1 0 0 +EDGE2 2584 2565 0.920382 -0.0171746 -0.0319545 1 0 1 1 0 0 +EDGE2 2584 2543 -0.968886 0.00587737 -0.0202599 1 0 1 1 0 0 +EDGE2 2584 1265 1.03546 0.0369269 0.0262984 1 0 1 1 0 0 +EDGE2 2584 2305 0.979034 0.0236599 -0.0186938 1 0 1 1 0 0 +EDGE2 2584 2405 1.0698 -0.00491018 -3.16865 1 0 1 1 0 0 +EDGE2 2584 2425 1.01447 0.0225485 -0.00725056 1 0 1 1 0 0 +EDGE2 2584 2525 1.03395 0.0306414 0.00771751 1 0 1 1 0 0 +EDGE2 2584 2385 0.969912 -0.0444522 -3.14058 1 0 1 1 0 0 +EDGE2 2584 1565 0.950042 -0.0694009 -3.12597 1 0 1 1 0 0 +EDGE2 2584 1585 0.956825 -0.0373336 -3.11578 1 0 1 1 0 0 +EDGE2 2584 1845 1.03808 0.0388175 -3.14691 1 0 1 1 0 0 +EDGE2 2584 1545 0.957745 0.0444172 -3.16914 1 0 1 1 0 0 +EDGE2 2584 2424 -0.0173151 -0.0118447 0.0576116 1 0 1 1 0 0 +EDGE2 2584 2544 -0.0154998 -0.0128075 0.0104306 1 0 1 1 0 0 +EDGE2 2584 2564 -0.0256103 -0.0174904 0.00873232 1 0 1 1 0 0 +EDGE2 2584 2524 -0.0602712 0.0607259 -0.0242403 1 0 1 1 0 0 +EDGE2 2584 2583 -1.06002 0.0476255 0.0014769 1 0 1 1 0 0 +EDGE2 2584 1264 -0.057342 -0.00910286 -0.0103989 1 0 1 1 0 0 +EDGE2 2584 2304 0.0230323 -0.0510612 0.0134151 1 0 1 1 0 0 +EDGE2 2584 2563 -0.940381 0.0451434 -0.0200141 1 0 1 1 0 0 +EDGE2 2584 2303 -1.0087 -0.0288862 -0.000397114 1 0 1 1 0 0 +EDGE2 2584 2423 -0.986404 0.00680455 0.0421855 1 0 1 1 0 0 +EDGE2 2584 2523 -0.978468 -0.0420103 0.0106549 1 0 1 1 0 0 +EDGE2 2584 1263 -0.955631 -0.113918 0.0161573 1 0 1 1 0 0 +EDGE2 2585 1564 1.06425 0.00772061 -3.10777 1 0 1 1 0 0 +EDGE2 2585 1844 0.83782 -0.033863 -3.17499 1 0 1 1 0 0 +EDGE2 2585 2384 1.00858 0.061254 -3.1362 1 0 1 1 0 0 +EDGE2 2585 2404 0.958947 -0.0159946 -3.11019 1 0 1 1 0 0 +EDGE2 2585 1584 0.938886 0.0437297 -3.11927 1 0 1 1 0 0 +EDGE2 2585 1544 1.00414 0.0961585 -3.15477 1 0 1 1 0 0 +EDGE2 2585 2545 -0.0313571 -0.0509439 -0.0136301 1 0 1 1 0 0 +EDGE2 2585 2426 -0.091773 1.09736 1.56326 1 0 1 1 0 0 +EDGE2 2585 2546 0.0154293 1.01536 1.58543 1 0 1 1 0 0 +EDGE2 2585 2566 -0.0224715 1.00561 1.56732 1 0 1 1 0 0 +EDGE2 2585 2526 0.0590084 1.00755 1.54533 1 0 1 1 0 0 +EDGE2 2585 2406 -0.038489 0.934427 1.57625 1 0 1 1 0 0 +EDGE2 2585 1546 0.0391217 1.03185 1.6008 1 0 1 1 0 0 +EDGE2 2585 2565 0.0958596 0.0237844 -0.0302329 1 0 1 1 0 0 +EDGE2 2585 1265 0.0304807 0.0748747 0.00273259 1 0 1 1 0 0 +EDGE2 2585 2305 -0.0254866 0.0386094 -0.0240839 1 0 1 1 0 0 +EDGE2 2585 2405 0.0437638 -0.0167539 -3.1504 1 0 1 1 0 0 +EDGE2 2585 2425 0.0149235 -0.0473428 -0.0042666 1 0 1 1 0 0 +EDGE2 2585 2525 -0.136351 -0.0278386 0.0110859 1 0 1 1 0 0 +EDGE2 2585 2385 -0.025622 -0.0697746 -3.12186 1 0 1 1 0 0 +EDGE2 2585 1565 0.0212782 0.0224392 -3.14743 1 0 1 1 0 0 +EDGE2 2585 1585 -0.0365868 -0.069758 -3.14035 1 0 1 1 0 0 +EDGE2 2585 1845 -0.0228862 -0.0141837 -3.14642 1 0 1 1 0 0 +EDGE2 2585 1545 -0.0482059 0.0148138 -3.13289 1 0 1 1 0 0 +EDGE2 2585 2424 -0.930983 0.0205722 0.00457741 1 0 1 1 0 0 +EDGE2 2585 2544 -0.992685 0.00546861 -0.0156881 1 0 1 1 0 0 +EDGE2 2585 2564 -0.889863 -0.0294237 0.0135965 1 0 1 1 0 0 +EDGE2 2585 2584 -0.923041 0.0564924 0.00117467 1 0 1 1 0 0 +EDGE2 2585 2524 -0.900579 -0.0155015 -0.000687801 1 0 1 1 0 0 +EDGE2 2585 1264 -0.995897 -0.0133746 -0.0595575 1 0 1 1 0 0 +EDGE2 2585 2304 -0.921284 0.115894 0.0023767 1 0 1 1 0 0 +EDGE2 2585 1566 0.0331639 -0.979337 -1.57395 1 0 1 1 0 0 +EDGE2 2585 1846 0.0403651 -1.02 -1.58694 1 0 1 1 0 0 +EDGE2 2585 2306 -0.0758482 -1.00118 -1.57937 1 0 1 1 0 0 +EDGE2 2585 2386 0.0133481 -0.959319 -1.57627 1 0 1 1 0 0 +EDGE2 2585 1586 -0.0452993 -1.02113 -1.53894 1 0 1 1 0 0 +EDGE2 2585 1266 -0.0985264 -0.992609 -1.58009 1 0 1 1 0 0 +EDGE2 2586 2545 -0.941105 -0.0206797 -1.57886 1 0 1 1 0 0 +EDGE2 2586 2567 0.980389 0.0229471 0.0113735 1 0 1 1 0 0 +EDGE2 2586 2426 0.00167817 0.0211115 0.00405882 1 0 1 1 0 0 +EDGE2 2586 1547 1.02079 -0.121894 0.00892962 1 0 1 1 0 0 +EDGE2 2586 2427 0.962746 0.0406904 0.0168763 1 0 1 1 0 0 +EDGE2 2586 2527 1.01504 -0.0370795 0.00221216 1 0 1 1 0 0 +EDGE2 2586 2547 0.971034 -0.084912 -0.0415456 1 0 1 1 0 0 +EDGE2 2586 2407 1.01572 0.0405541 0.00677944 1 0 1 1 0 0 +EDGE2 2586 2546 0.0161129 0.0154417 -0.0149897 1 0 1 1 0 0 +EDGE2 2586 2566 -0.112662 -0.0490779 0.022208 1 0 1 1 0 0 +EDGE2 2586 2526 -0.0790745 0.0625222 0.0137259 1 0 1 1 0 0 +EDGE2 2586 2406 -0.00972562 -0.0924268 -0.0142981 1 0 1 1 0 0 +EDGE2 2586 2585 -0.938022 0.0545583 -1.57386 1 0 1 1 0 0 +EDGE2 2586 1546 0.029543 0.0536212 -0.00161234 1 0 1 1 0 0 +EDGE2 2586 2565 -0.996894 -0.0866763 -1.57365 1 0 1 1 0 0 +EDGE2 2586 1265 -1.01218 -0.00523191 -1.57248 1 0 1 1 0 0 +EDGE2 2586 2305 -0.938297 0.0302373 -1.55898 1 0 1 1 0 0 +EDGE2 2586 2405 -0.972073 -0.0270034 1.56661 1 0 1 1 0 0 +EDGE2 2586 2425 -1.13236 -0.0280197 -1.56284 1 0 1 1 0 0 +EDGE2 2586 2525 -0.938104 0.0102126 -1.59121 1 0 1 1 0 0 +EDGE2 2586 2385 -1.01219 0.0882872 1.58799 1 0 1 1 0 0 +EDGE2 2586 1565 -0.912642 -0.0298071 1.57487 1 0 1 1 0 0 +EDGE2 2586 1585 -1.01194 -0.0175031 1.56812 1 0 1 1 0 0 +EDGE2 2586 1845 -1.06364 0.0957725 1.57405 1 0 1 1 0 0 +EDGE2 2586 1545 -0.874874 0.0194852 1.62567 1 0 1 1 0 0 +EDGE2 2587 2567 -0.0132222 0.0767874 0.0184357 1 0 1 1 0 0 +EDGE2 2587 2528 0.972407 0.0127262 -0.00127608 1 0 1 1 0 0 +EDGE2 2587 2568 0.976173 0.00535667 0.0251076 1 0 1 1 0 0 +EDGE2 2587 2548 0.891149 -0.0585224 0.000807558 1 0 1 1 0 0 +EDGE2 2587 1548 0.965189 0.0322458 0.0238146 1 0 1 1 0 0 +EDGE2 2587 2408 1.05279 0.0339034 0.0182713 1 0 1 1 0 0 +EDGE2 2587 2428 0.988916 -0.00112056 0.00383983 1 0 1 1 0 0 +EDGE2 2587 2426 -1.00372 0.00452523 -0.00759885 1 0 1 1 0 0 +EDGE2 2587 1547 -0.0689954 0.02156 -0.0199667 1 0 1 1 0 0 +EDGE2 2587 2427 0.015325 0.0682013 0.025335 1 0 1 1 0 0 +EDGE2 2587 2527 0.0123794 -0.0285431 0.0211888 1 0 1 1 0 0 +EDGE2 2587 2547 -0.00695403 -0.0301863 -0.0349029 1 0 1 1 0 0 +EDGE2 2587 2407 0.0124198 0.0366279 -0.0156682 1 0 1 1 0 0 +EDGE2 2587 2546 -0.97243 -0.0664492 -0.00253345 1 0 1 1 0 0 +EDGE2 2587 2566 -1.07382 -0.016416 -0.0149692 1 0 1 1 0 0 +EDGE2 2587 2586 -1.0622 0.0233195 0.00929877 1 0 1 1 0 0 +EDGE2 2587 2526 -0.985449 -0.0329688 0.0249189 1 0 1 1 0 0 +EDGE2 2587 2406 -1.05606 0.124206 -0.018648 1 0 1 1 0 0 +EDGE2 2587 1546 -0.993545 -0.0668465 0.00352395 1 0 1 1 0 0 +EDGE2 2588 2429 1.08081 -0.017497 0.00257311 1 0 1 1 0 0 +EDGE2 2588 2549 0.908912 -0.00328916 -0.00606916 1 0 1 1 0 0 +EDGE2 2588 2569 0.969479 -0.04719 0.0201166 1 0 1 1 0 0 +EDGE2 2588 2529 1.09041 -0.052964 0.0197067 1 0 1 1 0 0 +EDGE2 2588 1549 0.947931 0.0468847 -0.00474365 1 0 1 1 0 0 +EDGE2 2588 2409 0.983576 0.0459179 -0.00625121 1 0 1 1 0 0 +EDGE2 2588 2567 -1.06632 -0.0330416 -0.00240303 1 0 1 1 0 0 +EDGE2 2588 2528 -0.0427188 0.0276499 0.0656344 1 0 1 1 0 0 +EDGE2 2588 2568 0.0339603 0.0812426 0.0555073 1 0 1 1 0 0 +EDGE2 2588 2548 -0.114486 -0.0262968 0.00863983 1 0 1 1 0 0 +EDGE2 2588 1548 0.00585206 0.0293711 0.0227011 1 0 1 1 0 0 +EDGE2 2588 2408 0.036856 -0.016058 0.010918 1 0 1 1 0 0 +EDGE2 2588 2428 -0.0786176 -0.0253855 -0.00347958 1 0 1 1 0 0 +EDGE2 2588 2587 -0.929782 -0.0346253 -0.00438318 1 0 1 1 0 0 +EDGE2 2588 1547 -0.934479 -0.07992 -3.31824e-06 1 0 1 1 0 0 +EDGE2 2588 2427 -1.05819 -0.0149098 0.0210762 1 0 1 1 0 0 +EDGE2 2588 2527 -0.971724 0.0850942 0.00784142 1 0 1 1 0 0 +EDGE2 2588 2547 -0.964157 0.0553656 -0.00108004 1 0 1 1 0 0 +EDGE2 2588 2407 -1.08162 -0.0641896 0.0116907 1 0 1 1 0 0 +EDGE2 2589 2430 1.01627 -0.0581354 -0.00439018 1 0 1 1 0 0 +EDGE2 2589 2550 0.987181 -0.0111286 0.0138105 1 0 1 1 0 0 +EDGE2 2589 2570 0.979549 -0.010091 0.00744374 1 0 1 1 0 0 +EDGE2 2589 2530 0.97416 -0.00551692 0.0411036 1 0 1 1 0 0 +EDGE2 2589 1550 1.0572 -0.0213385 0.0099175 1 0 1 1 0 0 +EDGE2 2589 1830 0.885294 -0.0301136 -3.1326 1 0 1 1 0 0 +EDGE2 2589 2410 1.09619 0.0471502 0.0132894 1 0 1 1 0 0 +EDGE2 2589 2429 -0.0244004 0.00105923 0.0132839 1 0 1 1 0 0 +EDGE2 2589 2549 0.0238735 -0.0372498 -0.0264763 1 0 1 1 0 0 +EDGE2 2589 2569 0.0122907 0.0401812 -0.0268128 1 0 1 1 0 0 +EDGE2 2589 2529 -0.0425476 0.057406 0.0071645 1 0 1 1 0 0 +EDGE2 2589 1549 -0.0876375 0.0935625 -0.034519 1 0 1 1 0 0 +EDGE2 2589 2409 -0.125006 -0.033074 0.0110125 1 0 1 1 0 0 +EDGE2 2589 2528 -0.975818 0.0373003 0.0179788 1 0 1 1 0 0 +EDGE2 2589 2568 -0.929258 0.0860188 -0.00812786 1 0 1 1 0 0 +EDGE2 2589 2588 -1.09425 -0.0593398 -0.0216363 1 0 1 1 0 0 +EDGE2 2589 2548 -0.987902 -0.120293 0.00394857 1 0 1 1 0 0 +EDGE2 2589 1548 -0.948922 0.0334892 0.00644923 1 0 1 1 0 0 +EDGE2 2589 2408 -0.971127 0.0103084 4.01542e-05 1 0 1 1 0 0 +EDGE2 2589 2428 -0.921304 0.0397287 0.0101508 1 0 1 1 0 0 +EDGE2 2590 1829 0.982215 0.0205628 -3.19445 1 0 1 1 0 0 +EDGE2 2590 1831 -0.0892204 -1.09959 -1.5957 1 0 1 1 0 0 +EDGE2 2590 1551 -0.00324496 -0.989727 -1.53847 1 0 1 1 0 0 +EDGE2 2590 2411 0.0420287 1.01915 1.55661 1 0 1 1 0 0 +EDGE2 2590 2571 -0.0133874 1.05214 1.58499 1 0 1 1 0 0 +EDGE2 2590 2430 -0.0703168 -0.0616335 0.0321884 1 0 1 1 0 0 +EDGE2 2590 2550 0.0848331 -0.0461621 -0.0128894 1 0 1 1 0 0 +EDGE2 2590 2570 -0.0288078 0.105071 -0.00554793 1 0 1 1 0 0 +EDGE2 2590 2530 -0.134888 -0.0483258 -0.0272114 1 0 1 1 0 0 +EDGE2 2590 1550 0.00996356 0.0509708 -0.0144798 1 0 1 1 0 0 +EDGE2 2590 1830 0.00697895 0.00311975 -3.15243 1 0 1 1 0 0 +EDGE2 2590 2410 0.0983116 -0.0510087 -0.00964141 1 0 1 1 0 0 +EDGE2 2590 2531 -0.0304039 1.03045 1.59246 1 0 1 1 0 0 +EDGE2 2590 2551 -0.00630457 1.06512 1.59531 1 0 1 1 0 0 +EDGE2 2590 2431 0.0301367 0.971991 1.56711 1 0 1 1 0 0 +EDGE2 2590 2429 -1.00778 0.0333639 0.0169946 1 0 1 1 0 0 +EDGE2 2590 2549 -0.954609 -0.00270886 0.0459862 1 0 1 1 0 0 +EDGE2 2590 2569 -0.986232 -0.00907706 -0.00329232 1 0 1 1 0 0 +EDGE2 2590 2589 -0.950695 -0.065195 0.010974 1 0 1 1 0 0 +EDGE2 2590 2529 -0.983177 -0.0387638 -0.0182886 1 0 1 1 0 0 +EDGE2 2590 1549 -1.02308 -0.00573899 -0.0288164 1 0 1 1 0 0 +EDGE2 2590 2409 -1.10943 -0.00942042 0.00570991 1 0 1 1 0 0 +EDGE2 2591 2411 0.00893156 0.0818829 -0.00374359 1 0 1 1 0 0 +EDGE2 2591 2571 -0.0699491 -0.0235187 -0.051115 1 0 1 1 0 0 +EDGE2 2591 2430 -0.972583 -0.0530672 -1.57782 1 0 1 1 0 0 +EDGE2 2591 2550 -0.994718 0.0330976 -1.56784 1 0 1 1 0 0 +EDGE2 2591 2570 -1.00797 -0.00589353 -1.55379 1 0 1 1 0 0 +EDGE2 2591 2590 -0.966311 -0.0182308 -1.55887 1 0 1 1 0 0 +EDGE2 2591 2530 -0.900921 -0.0635022 -1.54869 1 0 1 1 0 0 +EDGE2 2591 1550 -0.939487 0.0288122 -1.57475 1 0 1 1 0 0 +EDGE2 2591 1830 -0.963474 0.011872 1.5498 1 0 1 1 0 0 +EDGE2 2591 2410 -0.886222 -0.0348804 -1.58802 1 0 1 1 0 0 +EDGE2 2591 2531 0.0402163 0.0878394 0.0144205 1 0 1 1 0 0 +EDGE2 2591 2551 -0.0358339 0.00819039 -0.0238276 1 0 1 1 0 0 +EDGE2 2591 2431 0.0173852 0.0234111 -0.0235444 1 0 1 1 0 0 +EDGE2 2591 2432 1.05032 0.00490108 0.00779503 1 0 1 1 0 0 +EDGE2 2591 2552 0.908251 -0.00642067 0.00579632 1 0 1 1 0 0 +EDGE2 2591 2572 1.01598 0.0246466 -0.032961 1 0 1 1 0 0 +EDGE2 2591 2532 1.02253 0.0503309 0.0521596 1 0 1 1 0 0 +EDGE2 2591 2412 0.998537 -0.134056 -0.00863142 1 0 1 1 0 0 +EDGE2 2592 2411 -1.05871 0.0639024 -0.0303337 1 0 1 1 0 0 +EDGE2 2592 2571 -0.973247 0.0840482 -0.0446157 1 0 1 1 0 0 +EDGE2 2592 2591 -1.00339 0.00892344 -0.00454005 1 0 1 1 0 0 +EDGE2 2592 2531 -0.997582 0.00206554 0.0441362 1 0 1 1 0 0 +EDGE2 2592 2551 -1.03748 0.0314438 0.00865066 1 0 1 1 0 0 +EDGE2 2592 2431 -1.03253 0.0360194 0.01103 1 0 1 1 0 0 +EDGE2 2592 2533 0.863224 -0.00994821 0.0332311 1 0 1 1 0 0 +EDGE2 2592 2432 -0.00282132 0.0275096 0.0235865 1 0 1 1 0 0 +EDGE2 2592 2552 0.011516 -0.0523002 0.0209282 1 0 1 1 0 0 +EDGE2 2592 2572 0.0452469 -0.0787996 -0.00203382 1 0 1 1 0 0 +EDGE2 2592 2532 -0.0715573 -0.0328677 0.00881502 1 0 1 1 0 0 +EDGE2 2592 2573 1.01258 0.0442549 -0.0128676 1 0 1 1 0 0 +EDGE2 2592 2412 -0.0707489 0.0670843 0.00644422 1 0 1 1 0 0 +EDGE2 2592 2553 0.994214 0.0397251 0.0498758 1 0 1 1 0 0 +EDGE2 2592 2413 0.989741 -0.049127 -0.00703392 1 0 1 1 0 0 +EDGE2 2592 2433 0.927972 -0.00828896 0.0107176 1 0 1 1 0 0 +EDGE2 2593 2533 -0.00428848 -0.0561805 0.00497638 1 0 1 1 0 0 +EDGE2 2593 2432 -0.984005 0.00458689 -0.00223066 1 0 1 1 0 0 +EDGE2 2593 2552 -0.993503 0.0256307 -0.00829069 1 0 1 1 0 0 +EDGE2 2593 2572 -1.09619 -0.0761637 0.0137229 1 0 1 1 0 0 +EDGE2 2593 2592 -0.907446 -0.16466 0.0167099 1 0 1 1 0 0 +EDGE2 2593 2532 -0.976099 -0.000144133 -0.0219858 1 0 1 1 0 0 +EDGE2 2593 2573 0.0250722 0.0365791 0.000415354 1 0 1 1 0 0 +EDGE2 2593 2412 -0.959414 -0.0331255 -0.000884351 1 0 1 1 0 0 +EDGE2 2593 2553 0.0674293 -0.034894 0.022737 1 0 1 1 0 0 +EDGE2 2593 2554 1.08209 -0.0459451 -0.0147502 1 0 1 1 0 0 +EDGE2 2593 2413 -0.0340355 0.0230051 -0.000104555 1 0 1 1 0 0 +EDGE2 2593 2433 -0.0419021 -0.059022 -0.00971205 1 0 1 1 0 0 +EDGE2 2593 2574 0.972966 0.0241092 0.00319399 1 0 1 1 0 0 +EDGE2 2593 2414 1.06334 -0.0588683 0.0214278 1 0 1 1 0 0 +EDGE2 2593 2434 1.06619 0.0727792 0.0114947 1 0 1 1 0 0 +EDGE2 2593 2534 0.956066 0.0512023 -0.00206983 1 0 1 1 0 0 +EDGE2 2594 2533 -0.985298 0.0750643 -0.00825289 1 0 1 1 0 0 +EDGE2 2594 2573 -0.973167 -0.0121582 -0.0356224 1 0 1 1 0 0 +EDGE2 2594 2593 -0.994094 -0.0640839 0.0149561 1 0 1 1 0 0 +EDGE2 2594 2553 -0.977021 -0.0791456 -0.0307377 1 0 1 1 0 0 +EDGE2 2594 2554 0.00738678 -0.0516981 -0.00983653 1 0 1 1 0 0 +EDGE2 2594 2413 -1.01118 -0.00485484 0.0507574 1 0 1 1 0 0 +EDGE2 2594 2433 -0.904693 -0.0097961 0.0022681 1 0 1 1 0 0 +EDGE2 2594 2574 -0.00452022 -0.0420467 0.00930154 1 0 1 1 0 0 +EDGE2 2594 2414 0.0305626 0.00669963 -0.00325961 1 0 1 1 0 0 +EDGE2 2594 2434 0.0746606 0.0714135 0.00232182 1 0 1 1 0 0 +EDGE2 2594 2534 0.00659166 0.0514749 -0.009584 1 0 1 1 0 0 +EDGE2 2594 1235 1.01687 -0.0678515 -3.13396 1 0 1 1 0 0 +EDGE2 2594 2455 1.01471 -0.0453167 -3.12315 1 0 1 1 0 0 +EDGE2 2594 2535 1.0455 -0.0142519 -0.0157628 1 0 1 1 0 0 +EDGE2 2594 2555 0.969271 -0.0366111 -0.0272035 1 0 1 1 0 0 +EDGE2 2594 2575 0.955114 0.0502292 0.0179996 1 0 1 1 0 0 +EDGE2 2594 2495 1.06353 -0.00751143 -3.15876 1 0 1 1 0 0 +EDGE2 2594 2295 1.01743 0.0277733 -3.13952 1 0 1 1 0 0 +EDGE2 2594 2415 0.942801 0.0099583 -0.000447901 1 0 1 1 0 0 +EDGE2 2594 2435 1.0233 -0.060705 0.0272348 1 0 1 1 0 0 +EDGE2 2594 1255 0.981966 0.10094 -3.17201 1 0 1 1 0 0 +EDGE2 2595 2416 -0.00279237 1.01903 1.5816 1 0 1 1 0 0 +EDGE2 2595 2456 0.0237631 -0.957562 -1.56753 1 0 1 1 0 0 +EDGE2 2595 1236 -0.00156727 -0.979547 -1.55345 1 0 1 1 0 0 +EDGE2 2595 2554 -0.982862 0.0596737 -0.0252047 1 0 1 1 0 0 +EDGE2 2595 2594 -1.0124 -0.0271227 -0.0409285 1 0 1 1 0 0 +EDGE2 2595 2574 -0.932781 0.0986418 0.00333756 1 0 1 1 0 0 +EDGE2 2595 2414 -0.977582 0.037005 0.00379578 1 0 1 1 0 0 +EDGE2 2595 2434 -1.05137 0.0543579 -0.00301324 1 0 1 1 0 0 +EDGE2 2595 2534 -1.06022 -0.0840562 0.0364039 1 0 1 1 0 0 +EDGE2 2595 1235 0.0188073 0.00262249 -3.14454 1 0 1 1 0 0 +EDGE2 2595 2455 0.00703353 -0.0809366 -3.1586 1 0 1 1 0 0 +EDGE2 2595 2535 -0.0237188 -0.00919924 0.0200544 1 0 1 1 0 0 +EDGE2 2595 2555 0.00339028 0.0285782 -0.00660569 1 0 1 1 0 0 +EDGE2 2595 2575 0.0147845 0.0126341 0.00784344 1 0 1 1 0 0 +EDGE2 2595 2495 -0.0235686 -0.0161567 -3.15052 1 0 1 1 0 0 +EDGE2 2595 2295 -0.0323145 0.00257754 -3.13846 1 0 1 1 0 0 +EDGE2 2595 2415 0.100002 -0.0304659 0.00287064 1 0 1 1 0 0 +EDGE2 2595 2435 -0.00843806 0.0134332 -0.02287 1 0 1 1 0 0 +EDGE2 2595 1255 0.0799708 0.0354358 -3.15708 1 0 1 1 0 0 +EDGE2 2595 1254 0.985649 -0.0264627 -3.15789 1 0 1 1 0 0 +EDGE2 2595 2454 0.891564 -0.034378 -3.12534 1 0 1 1 0 0 +EDGE2 2595 2494 0.99866 0.0190685 -3.16917 1 0 1 1 0 0 +EDGE2 2595 2294 0.921457 -0.015829 -3.16522 1 0 1 1 0 0 +EDGE2 2595 1234 0.959476 -0.0504552 -3.13051 1 0 1 1 0 0 +EDGE2 2595 2556 -0.0750366 1.02598 1.54289 1 0 1 1 0 0 +EDGE2 2595 2576 0.0410542 0.935964 1.57872 1 0 1 1 0 0 +EDGE2 2595 2496 -0.0161547 0.952351 1.56971 1 0 1 1 0 0 +EDGE2 2595 2536 -0.0590788 0.945108 1.5763 1 0 1 1 0 0 +EDGE2 2595 2436 0.0334962 1.10902 1.56805 1 0 1 1 0 0 +EDGE2 2595 1256 -0.0166289 0.990494 1.56793 1 0 1 1 0 0 +EDGE2 2595 2296 0.0645589 0.926686 1.55667 1 0 1 1 0 0 +EDGE2 2596 2416 0.00797672 0.0800465 -0.00575188 1 0 1 1 0 0 +EDGE2 2596 2595 -1.04625 0.0542257 -1.5501 1 0 1 1 0 0 +EDGE2 2596 1235 -1.01272 -0.0536359 1.57311 1 0 1 1 0 0 +EDGE2 2596 2455 -1.01491 0.0180525 1.55245 1 0 1 1 0 0 +EDGE2 2596 2535 -1.04267 0.0337789 -1.54668 1 0 1 1 0 0 +EDGE2 2596 2555 -1.00667 0.0434324 -1.56848 1 0 1 1 0 0 +EDGE2 2596 2575 -1.11946 -0.00767662 -1.59165 1 0 1 1 0 0 +EDGE2 2596 2495 -0.920676 0.041754 1.57199 1 0 1 1 0 0 +EDGE2 2596 2295 -1.06631 -0.0476706 1.52866 1 0 1 1 0 0 +EDGE2 2596 2415 -1.04096 -0.0217405 -1.55189 1 0 1 1 0 0 +EDGE2 2596 2435 -1.01005 -0.0205206 -1.58269 1 0 1 1 0 0 +EDGE2 2596 1255 -1.00374 0.0641612 1.53388 1 0 1 1 0 0 +EDGE2 2596 2556 0.0843985 -0.0307401 0.012683 1 0 1 1 0 0 +EDGE2 2596 2576 0.0432591 -0.0394416 -0.0218955 1 0 1 1 0 0 +EDGE2 2596 2496 -0.126134 0.063203 -0.0055608 1 0 1 1 0 0 +EDGE2 2596 2536 -0.0832704 -0.137999 2.56298e-05 1 0 1 1 0 0 +EDGE2 2596 2436 0.0497937 -0.0668613 0.0148285 1 0 1 1 0 0 +EDGE2 2596 1256 0.0975503 -0.0289472 0.0151784 1 0 1 1 0 0 +EDGE2 2596 2296 0.0343254 0.0132061 -0.0108544 1 0 1 1 0 0 +EDGE2 2596 2497 1.02166 -0.0556865 -0.0346692 1 0 1 1 0 0 +EDGE2 2596 2557 1.03435 0.0681806 0.020775 1 0 1 1 0 0 +EDGE2 2596 2577 1.01666 0.0157925 0.000509035 1 0 1 1 0 0 +EDGE2 2596 2537 1.00871 0.0274997 -0.0204863 1 0 1 1 0 0 +EDGE2 2596 2297 0.989302 0.0803955 0.0146024 1 0 1 1 0 0 +EDGE2 2596 2417 0.996414 0.0393852 0.018416 1 0 1 1 0 0 +EDGE2 2596 2437 1.0561 -0.0110855 -0.00980867 1 0 1 1 0 0 +EDGE2 2596 1257 0.939884 -0.0219047 0.0344229 1 0 1 1 0 0 +EDGE2 2597 2416 -1.01681 0.0139838 0.0279598 1 0 1 1 0 0 +EDGE2 2597 2556 -0.985491 -0.0169087 0.0200582 1 0 1 1 0 0 +EDGE2 2597 2596 -1.02359 0.0221521 0.00464781 1 0 1 1 0 0 +EDGE2 2597 2576 -0.994917 0.0569067 0.000437554 1 0 1 1 0 0 +EDGE2 2597 2496 -1.05458 -0.0316992 -0.0127434 1 0 1 1 0 0 +EDGE2 2597 2536 -0.865598 -0.0500125 -0.0117157 1 0 1 1 0 0 +EDGE2 2597 2436 -1.04444 -0.000934066 0.0277194 1 0 1 1 0 0 +EDGE2 2597 2498 0.871805 -0.0450022 -0.0261328 1 0 1 1 0 0 +EDGE2 2597 1256 -0.930769 -0.0234437 -0.00784066 1 0 1 1 0 0 +EDGE2 2597 2296 -0.945417 -0.00385595 0.0134334 1 0 1 1 0 0 +EDGE2 2597 2497 0.0435357 -0.0302358 -0.0164516 1 0 1 1 0 0 +EDGE2 2597 2557 -0.0420877 0.0263117 -0.00346769 1 0 1 1 0 0 +EDGE2 2597 2577 -0.0409796 0.0207262 0.000839384 1 0 1 1 0 0 +EDGE2 2597 2537 -0.0553665 0.0275838 -0.00146641 1 0 1 1 0 0 +EDGE2 2597 2297 0.0224183 -0.0041205 -0.0108822 1 0 1 1 0 0 +EDGE2 2597 2417 -0.00192861 0.0422615 0.0371675 1 0 1 1 0 0 +EDGE2 2597 2437 -0.00958662 0.0170941 -0.0445696 1 0 1 1 0 0 +EDGE2 2597 1257 0.00178601 0.0592559 -0.00550958 1 0 1 1 0 0 +EDGE2 2597 2558 1.04698 0.0084739 0.0148857 1 0 1 1 0 0 +EDGE2 2597 2578 0.961953 -0.0108915 0.0177494 1 0 1 1 0 0 +EDGE2 2597 2538 0.98703 -0.101422 -0.0302707 1 0 1 1 0 0 +EDGE2 2597 2298 1.08191 -0.0324116 -0.00235696 1 0 1 1 0 0 +EDGE2 2597 2418 0.99335 -0.0323487 0.00872981 1 0 1 1 0 0 +EDGE2 2597 2438 0.97504 0.00922077 -0.011256 1 0 1 1 0 0 +EDGE2 2597 1258 1.06762 -0.0182755 0.0118631 1 0 1 1 0 0 +EDGE2 2598 2498 -0.0565549 0.0566249 0.00609088 1 0 1 1 0 0 +EDGE2 2598 2497 -1.00637 -0.0617156 0.00812346 1 0 1 1 0 0 +EDGE2 2598 2557 -1.08981 0.0835239 -0.00720105 1 0 1 1 0 0 +EDGE2 2598 2577 -1.00236 0.00250348 0.0238245 1 0 1 1 0 0 +EDGE2 2598 2597 -0.923692 -0.0354415 0.0193996 1 0 1 1 0 0 +EDGE2 2598 2537 -1.04474 0.00694051 0.0090599 1 0 1 1 0 0 +EDGE2 2598 2297 -1.05306 -0.0157254 -0.0194654 1 0 1 1 0 0 +EDGE2 2598 2417 -1.03823 0.0856523 0.0101123 1 0 1 1 0 0 +EDGE2 2598 2437 -1.02493 -0.0606189 0.0213852 1 0 1 1 0 0 +EDGE2 2598 1257 -0.990825 0.00546702 -0.00951895 1 0 1 1 0 0 +EDGE2 2598 2558 -0.0416052 -0.0153637 0.0306843 1 0 1 1 0 0 +EDGE2 2598 2578 -0.00409806 -0.000658939 0.0245941 1 0 1 1 0 0 +EDGE2 2598 2538 0.067618 0.0361138 -0.0361675 1 0 1 1 0 0 +EDGE2 2598 2298 -0.062665 0.0358831 -0.00408354 1 0 1 1 0 0 +EDGE2 2598 2418 0.0136541 0.0398945 0.00265545 1 0 1 1 0 0 +EDGE2 2598 2438 0.00403876 0.048811 -0.0106804 1 0 1 1 0 0 +EDGE2 2598 1258 0.0561501 -0.0859444 0.000935447 1 0 1 1 0 0 +EDGE2 2598 2499 0.92777 -0.0790916 -0.0156282 1 0 1 1 0 0 +EDGE2 2598 2559 1.01887 -0.0729952 -0.0243199 1 0 1 1 0 0 +EDGE2 2598 2579 1.00743 -0.0186585 0.0336255 1 0 1 1 0 0 +EDGE2 2598 2539 0.957295 0.0435604 -0.0128268 1 0 1 1 0 0 +EDGE2 2598 2299 0.996998 -0.0376136 -0.01391 1 0 1 1 0 0 +EDGE2 2598 2419 0.918715 0.00789078 0.0164301 1 0 1 1 0 0 +EDGE2 2598 2439 1.02528 0.029453 -0.0526657 1 0 1 1 0 0 +EDGE2 2598 1259 0.999358 -0.0271865 -0.0225054 1 0 1 1 0 0 +EDGE2 2599 2498 -1.00055 -3.60761e-06 -0.00351788 1 0 1 1 0 0 +EDGE2 2599 2558 -1.01653 -0.0579061 0.000921046 1 0 1 1 0 0 +EDGE2 2599 2578 -1.00247 0.0126231 -0.00110447 1 0 1 1 0 0 +EDGE2 2599 2598 -0.971962 -0.0146544 -0.00878493 1 0 1 1 0 0 +EDGE2 2599 2538 -1.03474 -0.0367271 0.0100738 1 0 1 1 0 0 +EDGE2 2599 2298 -0.99918 0.0531245 0.00593221 1 0 1 1 0 0 +EDGE2 2599 2418 -1.03174 0.00571604 -0.0146751 1 0 1 1 0 0 +EDGE2 2599 2438 -0.906825 -0.0388645 -0.038621 1 0 1 1 0 0 +EDGE2 2599 1258 -0.930221 0.0152085 -0.00387 1 0 1 1 0 0 +EDGE2 2599 2499 0.0877108 0.0114279 0.0123772 1 0 1 1 0 0 +EDGE2 2599 2559 0.0528102 0.0915527 0.0139396 1 0 1 1 0 0 +EDGE2 2599 2579 -0.0649432 -0.0464635 0.00368416 1 0 1 1 0 0 +EDGE2 2599 2539 0.0653159 0.0721474 -0.0150849 1 0 1 1 0 0 +EDGE2 2599 2299 -0.0299017 -0.064835 0.00305864 1 0 1 1 0 0 +EDGE2 2599 2419 0.0518465 0.0156092 0.00419024 1 0 1 1 0 0 +EDGE2 2599 2439 -0.0890284 0.0904695 0.00638109 1 0 1 1 0 0 +EDGE2 2599 1259 -0.0650459 0.0162928 0.00546289 1 0 1 1 0 0 +EDGE2 2599 2420 0.993793 0.0225432 0.021706 1 0 1 1 0 0 +EDGE2 2599 2560 1.01742 -0.0197515 -0.0310831 1 0 1 1 0 0 +EDGE2 2599 2580 1.00013 0.0119254 0.0107537 1 0 1 1 0 0 +EDGE2 2599 2500 0.93008 0.0817546 0.0198219 1 0 1 1 0 0 +EDGE2 2599 2520 1.02205 0.0235474 -3.11374 1 0 1 1 0 0 +EDGE2 2599 2540 0.962636 -0.10576 0.00801713 1 0 1 1 0 0 +EDGE2 2599 2440 0.990524 0.00591119 0.00627306 1 0 1 1 0 0 +EDGE2 2599 2300 0.909562 0.0332284 -0.0101197 1 0 1 1 0 0 +EDGE2 2599 1260 1.13595 0.00418515 0.00104584 1 0 1 1 0 0 +EDGE2 2600 2441 -0.0125989 -1.07777 -1.58783 1 0 1 1 0 0 +EDGE2 2600 2521 0.0277174 0.997555 1.57416 1 0 1 1 0 0 +EDGE2 2600 2561 0.0161086 0.995299 1.6099 1 0 1 1 0 0 +EDGE2 2600 2581 -0.0109169 1.0679 1.5958 1 0 1 1 0 0 +EDGE2 2600 2541 0.00904422 1.003 1.57792 1 0 1 1 0 0 +EDGE2 2600 2301 0.0381017 0.941729 1.6125 1 0 1 1 0 0 +EDGE2 2600 2421 -0.0139373 1.00346 1.58384 1 0 1 1 0 0 +EDGE2 2600 1261 0.0409637 1.08212 1.57544 1 0 1 1 0 0 +EDGE2 2600 2499 -1.03954 0.0832311 0.00263434 1 0 1 1 0 0 +EDGE2 2600 2559 -0.994625 -0.0558421 -0.0116507 1 0 1 1 0 0 +EDGE2 2600 2579 -0.995554 0.00321834 -0.0132756 1 0 1 1 0 0 +EDGE2 2600 2599 -0.933432 -0.0549095 -0.0429203 1 0 1 1 0 0 +EDGE2 2600 2539 -0.997499 -0.0307681 -0.0251575 1 0 1 1 0 0 +EDGE2 2600 2299 -1.00827 0.00707725 -0.0161864 1 0 1 1 0 0 +EDGE2 2600 2419 -0.975361 -0.0727455 -0.0239576 1 0 1 1 0 0 +EDGE2 2600 2439 -0.91282 -0.020467 -0.0466117 1 0 1 1 0 0 +EDGE2 2600 1259 -0.984822 0.0310479 -0.00847476 1 0 1 1 0 0 +EDGE2 2600 2420 0.0190235 0.0851673 -0.0287364 1 0 1 1 0 0 +EDGE2 2600 2560 0.0278305 0.0788086 -0.024363 1 0 1 1 0 0 +EDGE2 2600 2580 -0.0528246 0.0724391 0.0424171 1 0 1 1 0 0 +EDGE2 2600 2500 -0.0216012 0.0284871 -0.0209014 1 0 1 1 0 0 +EDGE2 2600 2520 -0.058937 -0.0234909 -3.1455 1 0 1 1 0 0 +EDGE2 2600 2540 -0.0711638 -0.0270424 0.00189296 1 0 1 1 0 0 +EDGE2 2600 2440 0.0360635 0.027926 -0.020965 1 0 1 1 0 0 +EDGE2 2600 2300 -0.00807465 -0.029893 -0.0103562 1 0 1 1 0 0 +EDGE2 2600 1260 -0.0427322 -0.0609557 0.0055766 1 0 1 1 0 0 +EDGE2 2600 2501 0.0152187 -0.998857 -1.58093 1 0 1 1 0 0 +EDGE2 2600 2519 0.957425 -0.0136789 -3.14538 1 0 1 1 0 0 +EDGE2 2601 2441 0.015395 -0.102316 0.00146164 1 0 1 1 0 0 +EDGE2 2601 2420 -1.04064 -0.0104697 1.55325 1 0 1 1 0 0 +EDGE2 2601 2560 -1.00742 0.0235109 1.55415 1 0 1 1 0 0 +EDGE2 2601 2600 -1.03625 0.0392677 1.54572 1 0 1 1 0 0 +EDGE2 2601 2580 -1.02548 0.0646476 1.57836 1 0 1 1 0 0 +EDGE2 2601 2500 -1.02872 -0.0247328 1.5588 1 0 1 1 0 0 +EDGE2 2601 2520 -0.952468 0.0954306 -1.55771 1 0 1 1 0 0 +EDGE2 2601 2540 -0.87633 0.00324021 1.59501 1 0 1 1 0 0 +EDGE2 2601 2440 -1.01906 0.0250661 1.56059 1 0 1 1 0 0 +EDGE2 2601 2300 -1.13552 0.0403083 1.55718 1 0 1 1 0 0 +EDGE2 2601 1260 -1.02132 0.0136885 1.55166 1 0 1 1 0 0 +EDGE2 2601 2501 -0.0266855 -0.0166229 -0.0256275 1 0 1 1 0 0 +EDGE2 2601 2442 1.03863 -0.033703 0.0180333 1 0 1 1 0 0 +EDGE2 2601 2502 0.987963 0.0183543 -0.00810308 1 0 1 1 0 0 +EDGE2 2602 2441 -1.00323 0.0558768 -0.0203932 1 0 1 1 0 0 +EDGE2 2602 2601 -0.930315 0.0420798 0.00264122 1 0 1 1 0 0 +EDGE2 2602 2501 -1.00976 0.0346476 -0.00662365 1 0 1 1 0 0 +EDGE2 2602 2443 1.0464 -0.0328245 0.0097628 1 0 1 1 0 0 +EDGE2 2602 2442 -0.0374381 0.0595827 -0.0151342 1 0 1 1 0 0 +EDGE2 2602 2502 0.0839227 0.0442506 -0.0132263 1 0 1 1 0 0 +EDGE2 2602 2503 0.997538 -0.0174924 -0.00549483 1 0 1 1 0 0 +EDGE2 2603 2443 -0.0686885 0.0115505 -0.00286479 1 0 1 1 0 0 +EDGE2 2603 2442 -0.989626 0.0212311 -0.00264154 1 0 1 1 0 0 +EDGE2 2603 2602 -0.95858 0.0769357 0.00350891 1 0 1 1 0 0 +EDGE2 2603 2502 -1.01134 0.0442469 0.0141505 1 0 1 1 0 0 +EDGE2 2603 2503 -0.0216942 0.011338 -0.00901802 1 0 1 1 0 0 +EDGE2 2603 2444 1.01059 -0.0202332 0.00624208 1 0 1 1 0 0 +EDGE2 2603 2504 1.07209 0.0567767 0.0312855 1 0 1 1 0 0 +EDGE2 2604 2443 -1.04918 -0.0154608 0.0187948 1 0 1 1 0 0 +EDGE2 2604 2603 -0.946277 0.0128252 -0.0294269 1 0 1 1 0 0 +EDGE2 2604 2503 -1.06851 -0.0410828 -0.00654015 1 0 1 1 0 0 +EDGE2 2604 2444 -0.0108119 -0.0203385 -0.032626 1 0 1 1 0 0 +EDGE2 2604 2504 -0.0941684 -0.0612994 0.0288835 1 0 1 1 0 0 +EDGE2 2604 1225 0.999738 -0.0357109 -3.16924 1 0 1 1 0 0 +EDGE2 2604 2485 1.07478 -0.0717778 -3.15665 1 0 1 1 0 0 +EDGE2 2604 2505 1.03237 0.0395107 0.010409 1 0 1 1 0 0 +EDGE2 2604 2445 1.05713 -0.00120234 0.00562791 1 0 1 1 0 0 +EDGE2 2605 2446 -0.0130781 -1.03412 -1.55798 1 0 1 1 0 0 +EDGE2 2605 2486 0.0181444 -1.06767 -1.58283 1 0 1 1 0 0 +EDGE2 2605 1226 0.00326464 -1.01204 -1.5706 1 0 1 1 0 0 +EDGE2 2605 2444 -0.996634 -0.121046 -0.00244635 1 0 1 1 0 0 +EDGE2 2605 2604 -0.987905 0.0360316 -0.0308895 1 0 1 1 0 0 +EDGE2 2605 2504 -1.01376 0.11189 -0.00928453 1 0 1 1 0 0 +EDGE2 2605 1225 0.0286265 -0.0228468 -3.10492 1 0 1 1 0 0 +EDGE2 2605 2485 0.0384022 -0.0370128 -3.1356 1 0 1 1 0 0 +EDGE2 2605 2505 -0.0358542 0.0381692 0.00238037 1 0 1 1 0 0 +EDGE2 2605 2445 0.0142381 -0.0358898 0.00374613 1 0 1 1 0 0 +EDGE2 2605 1224 1.07975 0.0043281 -3.14476 1 0 1 1 0 0 +EDGE2 2605 2484 1.01043 0.0360285 -3.15631 1 0 1 1 0 0 +EDGE2 2605 2506 0.0362673 1.07411 1.54373 1 0 1 1 0 0 +EDGE2 2606 1225 -1.01215 -0.0538854 1.58424 1 0 1 1 0 0 +EDGE2 2606 2485 -0.968942 0.0941166 1.57179 1 0 1 1 0 0 +EDGE2 2606 2505 -1.01421 0.0912837 -1.55649 1 0 1 1 0 0 +EDGE2 2606 2605 -1.04033 -0.0558567 -1.58823 1 0 1 1 0 0 +EDGE2 2606 2445 -1.02226 -0.0144153 -1.58395 1 0 1 1 0 0 +EDGE2 2606 2506 0.074767 -0.0472209 -0.0182421 1 0 1 1 0 0 +EDGE2 2606 2507 1.02607 -0.0255053 0.014893 1 0 1 1 0 0 +EDGE2 2607 2506 -1.02627 0.0259209 0.0276052 1 0 1 1 0 0 +EDGE2 2607 2606 -1.00492 0.0574312 -0.0262059 1 0 1 1 0 0 +EDGE2 2607 2507 0.0434013 0.0355055 -0.0474223 1 0 1 1 0 0 +EDGE2 2607 2508 1.01191 -0.0232408 -0.0164531 1 0 1 1 0 0 +EDGE2 2608 2607 -0.963625 0.0229001 0.0322533 1 0 1 1 0 0 +EDGE2 2608 2507 -1.03398 0.00010022 -0.0298986 1 0 1 1 0 0 +EDGE2 2608 2508 0.0611784 0.0474047 0.0073258 1 0 1 1 0 0 +EDGE2 2608 2509 0.95797 0.0393459 -0.0119357 1 0 1 1 0 0 +EDGE2 2609 2508 -0.925739 -0.0487793 0.00692279 1 0 1 1 0 0 +EDGE2 2609 2608 -0.934665 -0.0442076 0.017111 1 0 1 1 0 0 +EDGE2 2609 2509 -0.0546066 0.0103935 -0.0162956 1 0 1 1 0 0 +EDGE2 2609 2510 0.91877 -0.015646 -0.0304995 1 0 1 1 0 0 +EDGE2 2610 2609 -0.981492 0.0516744 -0.0152169 1 0 1 1 0 0 +EDGE2 2610 2509 -0.876044 0.0642551 0.0124894 1 0 1 1 0 0 +EDGE2 2610 2511 -0.00251734 0.981729 1.56125 1 0 1 1 0 0 +EDGE2 2610 2510 -0.0521515 -0.020013 0.00206061 1 0 1 1 0 0 +EDGE2 2611 2510 -0.961243 0.0146107 1.56622 1 0 1 1 0 0 +EDGE2 2611 2610 -1.03314 0.0139709 1.57517 1 0 1 1 0 0 +EDGE2 2612 2611 -1.01624 0.00925606 0.008761 1 0 1 1 0 0 +EDGE2 2613 2612 -1.04452 0.0239113 0.0199168 1 0 1 1 0 0 +EDGE2 2614 2613 -1.02509 0.0413119 -0.0101375 1 0 1 1 0 0 +EDGE2 2615 2614 -1.0003 -0.110041 -0.0502442 1 0 1 1 0 0 +EDGE2 2616 2615 -1.01774 0.00634131 -1.55444 1 0 1 1 0 0 +EDGE2 2617 2616 -1.01877 -0.0486028 0.0169337 1 0 1 1 0 0 +EDGE2 2618 2617 -1.0178 -0.0719207 0.0130989 1 0 1 1 0 0 +EDGE2 2619 2618 -0.968557 0.0562836 0.0104629 1 0 1 1 0 0 +EDGE2 2620 2619 -0.92132 0.0424003 -0.0182671 1 0 1 1 0 0 +EDGE2 2621 2620 -0.992215 0.0310544 -1.55431 1 0 1 1 0 0 +EDGE2 2622 2621 -1.03807 0.000394342 0.00213406 1 0 1 1 0 0 +EDGE2 2623 2622 -0.966565 -0.0105088 -0.0283699 1 0 1 1 0 0 +EDGE2 2624 2623 -0.901256 -0.00466457 -0.0130446 1 0 1 1 0 0 +EDGE2 2625 2624 -0.986039 -0.133776 -0.0334206 1 0 1 1 0 0 +EDGE2 2626 2625 -0.918482 0.0467157 -1.60094 1 0 1 1 0 0 +EDGE2 2627 2626 -0.975588 -0.0283175 0.012449 1 0 1 1 0 0 +EDGE2 2628 2627 -0.976033 -0.0487543 0.00366299 1 0 1 1 0 0 +EDGE2 2629 2510 1.05915 -0.0616106 -3.15166 1 0 1 1 0 0 +EDGE2 2629 2610 1.03316 0.0062006 -3.13939 1 0 1 1 0 0 +EDGE2 2629 2628 -0.938003 -0.00444316 -0.0218632 1 0 1 1 0 0 +EDGE2 2630 2609 0.981295 0.0647251 -3.13334 1 0 1 1 0 0 +EDGE2 2630 2509 1.00842 0.126294 -3.13665 1 0 1 1 0 0 +EDGE2 2630 2511 0.00572135 -0.974786 -1.54142 1 0 1 1 0 0 +EDGE2 2630 2510 0.0244432 -0.0226504 -3.13856 1 0 1 1 0 0 +EDGE2 2630 2610 -0.0599169 -0.0103201 -3.12395 1 0 1 1 0 0 +EDGE2 2630 2629 -1.00968 0.00911591 -0.01373 1 0 1 1 0 0 +EDGE2 2630 2611 -0.0246418 1.00442 1.55064 1 0 1 1 0 0 +EDGE2 2631 2512 1.00149 0.00905945 0.00516155 1 0 1 1 0 0 +EDGE2 2631 2511 -0.0178875 -0.00376698 -0.0198079 1 0 1 1 0 0 +EDGE2 2631 2510 -1.05067 -0.0928289 -1.59434 1 0 1 1 0 0 +EDGE2 2631 2630 -0.997073 -0.0103506 1.54498 1 0 1 1 0 0 +EDGE2 2631 2610 -0.976462 0.0817134 -1.52193 1 0 1 1 0 0 +EDGE2 2632 2631 -0.889729 -0.00556378 -0.0235908 1 0 1 1 0 0 +EDGE2 2632 2513 0.997355 -0.00292191 -0.00477625 1 0 1 1 0 0 +EDGE2 2632 2512 0.0401761 -0.020301 0.0246968 1 0 1 1 0 0 +EDGE2 2632 2511 -0.880054 0.0276417 0.0142827 1 0 1 1 0 0 +EDGE2 2633 2513 0.101562 -0.0244484 -0.0180106 1 0 1 1 0 0 +EDGE2 2633 2514 1.02365 0.0383279 -0.0320371 1 0 1 1 0 0 +EDGE2 2633 2512 -0.975558 -0.0103168 0.0138421 1 0 1 1 0 0 +EDGE2 2633 2632 -0.959143 0.123337 -0.00668109 1 0 1 1 0 0 +EDGE2 2634 1295 0.999038 -0.0338814 -3.14275 1 0 1 1 0 0 +EDGE2 2634 2515 0.961459 -0.0434193 -0.011908 1 0 1 1 0 0 +EDGE2 2634 1275 0.985922 0.0431732 -3.12739 1 0 1 1 0 0 +EDGE2 2634 2513 -1.05041 -0.05235 -0.00681694 1 0 1 1 0 0 +EDGE2 2634 2514 0.0299514 0.0125874 -0.0196749 1 0 1 1 0 0 +EDGE2 2634 2633 -0.945921 0.0200587 0.0270212 1 0 1 1 0 0 +EDGE2 2635 2516 0.0203985 0.907877 1.55581 1 0 1 1 0 0 +EDGE2 2635 1274 0.957723 0.0896926 -3.13827 1 0 1 1 0 0 +EDGE2 2635 1294 0.97424 0.0387257 -3.12767 1 0 1 1 0 0 +EDGE2 2635 1295 0.119355 0.127853 -3.1342 1 0 1 1 0 0 +EDGE2 2635 2515 0.0429114 -0.0132745 0.00327927 1 0 1 1 0 0 +EDGE2 2635 1275 0.0788386 -0.0948164 -3.13355 1 0 1 1 0 0 +EDGE2 2635 2514 -0.946997 -0.00877969 0.0148052 1 0 1 1 0 0 +EDGE2 2635 2634 -1.07767 0.0225922 -0.0269582 1 0 1 1 0 0 +EDGE2 2635 1296 0.022464 -0.922329 -1.53586 1 0 1 1 0 0 +EDGE2 2635 1276 0.0305133 -0.974941 -1.55759 1 0 1 1 0 0 +EDGE2 2636 2517 1.11929 -0.0216355 -0.0484228 1 0 1 1 0 0 +EDGE2 2636 2516 0.0160088 -0.00114859 0.0139048 1 0 1 1 0 0 +EDGE2 2636 1295 -0.968431 0.104913 1.53311 1 0 1 1 0 0 +EDGE2 2636 2515 -1.0088 -0.0288229 -1.58009 1 0 1 1 0 0 +EDGE2 2636 2635 -0.957313 -0.0336717 -1.543 1 0 1 1 0 0 +EDGE2 2636 1275 -0.983528 -0.0533716 1.57137 1 0 1 1 0 0 +EDGE2 2637 2518 1.00857 0.0342167 -0.00597339 1 0 1 1 0 0 +EDGE2 2637 2517 -0.0665581 -0.0194558 0.00967833 1 0 1 1 0 0 +EDGE2 2637 2516 -1.05417 0.133297 0.00641172 1 0 1 1 0 0 +EDGE2 2637 2636 -1.03737 0.0308891 0.0146742 1 0 1 1 0 0 +EDGE2 2638 2519 1.03774 0.0649014 -0.0112759 1 0 1 1 0 0 +EDGE2 2638 2637 -0.945659 -0.0625795 -0.0196416 1 0 1 1 0 0 +EDGE2 2638 2518 -0.00309392 -0.0530745 -0.00784875 1 0 1 1 0 0 +EDGE2 2638 2517 -1.01263 -0.0889441 -0.0167943 1 0 1 1 0 0 +EDGE2 2639 2420 1.0373 0.0602631 -3.12986 1 0 1 1 0 0 +EDGE2 2639 2560 1.01677 0.104586 -3.13965 1 0 1 1 0 0 +EDGE2 2639 2600 1.11163 -0.0324289 -3.12986 1 0 1 1 0 0 +EDGE2 2639 2580 1.09742 0.0394412 -3.15062 1 0 1 1 0 0 +EDGE2 2639 2500 0.9728 -0.0969051 -3.16299 1 0 1 1 0 0 +EDGE2 2639 2520 0.929294 -0.0882461 -0.00172781 1 0 1 1 0 0 +EDGE2 2639 2540 1.07398 0.149962 -3.1121 1 0 1 1 0 0 +EDGE2 2639 2440 1.07007 0.0323235 -3.14946 1 0 1 1 0 0 +EDGE2 2639 2300 0.984746 -0.041679 -3.13197 1 0 1 1 0 0 +EDGE2 2639 1260 1.04885 0.0171009 -3.11819 1 0 1 1 0 0 +EDGE2 2639 2519 0.132868 -0.0360873 -0.0181793 1 0 1 1 0 0 +EDGE2 2639 2518 -1.00183 -0.075306 0.0177544 1 0 1 1 0 0 +EDGE2 2639 2638 -0.9931 -0.0605764 0.0289555 1 0 1 1 0 0 +EDGE2 2640 2441 0.0288916 0.943928 1.57803 1 0 1 1 0 0 +EDGE2 2640 2521 0.0535596 -0.975233 -1.5558 1 0 1 1 0 0 +EDGE2 2640 2561 0.00214564 -1.04065 -1.54939 1 0 1 1 0 0 +EDGE2 2640 2581 -0.0449299 -1.04877 -1.57616 1 0 1 1 0 0 +EDGE2 2640 2541 0.0628795 -1.00951 -1.54439 1 0 1 1 0 0 +EDGE2 2640 2301 0.0345544 -0.88914 -1.60493 1 0 1 1 0 0 +EDGE2 2640 2421 0.0258837 -1.00109 -1.58736 1 0 1 1 0 0 +EDGE2 2640 1261 -0.028926 -1.07519 -1.59195 1 0 1 1 0 0 +EDGE2 2640 2499 0.965715 0.021762 -3.13677 1 0 1 1 0 0 +EDGE2 2640 2559 0.986142 -0.0135545 -3.15737 1 0 1 1 0 0 +EDGE2 2640 2579 0.955888 -0.0358023 -3.1177 1 0 1 1 0 0 +EDGE2 2640 2599 0.96647 0.0467398 -3.11297 1 0 1 1 0 0 +EDGE2 2640 2539 1.01197 0.0938772 -3.12629 1 0 1 1 0 0 +EDGE2 2640 2299 0.950889 -0.00335601 -3.17482 1 0 1 1 0 0 +EDGE2 2640 2419 0.990957 0.0216311 -3.13419 1 0 1 1 0 0 +EDGE2 2640 2439 0.914389 0.0225885 -3.15833 1 0 1 1 0 0 +EDGE2 2640 1259 0.996882 0.0307842 -3.1721 1 0 1 1 0 0 +EDGE2 2640 2420 -0.0219522 -0.105493 -3.15348 1 0 1 1 0 0 +EDGE2 2640 2560 -0.0312777 0.0615125 -3.13956 1 0 1 1 0 0 +EDGE2 2640 2600 -0.0499977 0.036172 -3.15068 1 0 1 1 0 0 +EDGE2 2640 2580 0.0864678 0.0576018 -3.13156 1 0 1 1 0 0 +EDGE2 2640 2500 -0.0294712 -0.0164578 -3.16757 1 0 1 1 0 0 +EDGE2 2640 2520 0.00270328 0.0168268 0.0297194 1 0 1 1 0 0 +EDGE2 2640 2540 -0.0197273 0.0695367 -3.17431 1 0 1 1 0 0 +EDGE2 2640 2440 0.00307808 -0.0560503 -3.09564 1 0 1 1 0 0 +EDGE2 2640 2300 -0.0124559 0.096095 -3.12574 1 0 1 1 0 0 +EDGE2 2640 1260 -0.0215143 -0.0179314 -3.16904 1 0 1 1 0 0 +EDGE2 2640 2601 0.0999454 0.99852 1.6064 1 0 1 1 0 0 +EDGE2 2640 2501 0.0049995 0.936461 1.54519 1 0 1 1 0 0 +EDGE2 2640 2639 -1.03516 0.000294276 0.0439599 1 0 1 1 0 0 +EDGE2 2640 2519 -0.988731 0.0328474 0.0392131 1 0 1 1 0 0 +EDGE2 2641 2441 -0.022702 -0.0180371 -0.0196553 1 0 1 1 0 0 +EDGE2 2641 2420 -0.904481 0.150731 1.59454 1 0 1 1 0 0 +EDGE2 2641 2560 -1.05089 -0.0598694 1.5621 1 0 1 1 0 0 +EDGE2 2641 2600 -0.894727 0.0538044 1.58994 1 0 1 1 0 0 +EDGE2 2641 2640 -0.997752 -0.100851 -1.55193 1 0 1 1 0 0 +EDGE2 2641 2580 -0.964219 -0.0485051 1.54707 1 0 1 1 0 0 +EDGE2 2641 2500 -0.963783 -0.0305169 1.58915 1 0 1 1 0 0 +EDGE2 2641 2520 -0.935972 -0.038568 -1.57587 1 0 1 1 0 0 +EDGE2 2641 2540 -1.01541 -0.0461146 1.55182 1 0 1 1 0 0 +EDGE2 2641 2440 -1.04742 -0.0245307 1.56195 1 0 1 1 0 0 +EDGE2 2641 2300 -0.985605 -0.0266066 1.58481 1 0 1 1 0 0 +EDGE2 2641 1260 -1.09277 0.134583 1.55288 1 0 1 1 0 0 +EDGE2 2641 2601 0.0451214 0.0559481 0.00102115 1 0 1 1 0 0 +EDGE2 2641 2501 -0.0336473 0.00606243 0.0404062 1 0 1 1 0 0 +EDGE2 2641 2442 1.02992 0.0325797 0.0228787 1 0 1 1 0 0 +EDGE2 2641 2602 1.00624 -0.0623064 -0.0285836 1 0 1 1 0 0 +EDGE2 2641 2502 1.03748 -0.0226345 -0.0358077 1 0 1 1 0 0 +EDGE2 2642 2441 -0.997102 -0.0628039 -0.00590753 1 0 1 1 0 0 +EDGE2 2642 2601 -1.07915 -0.0102633 0.0116102 1 0 1 1 0 0 +EDGE2 2642 2641 -1.03506 0.0106698 0.0163545 1 0 1 1 0 0 +EDGE2 2642 2501 -1.01313 0.0347931 -0.0224638 1 0 1 1 0 0 +EDGE2 2642 2443 1.01259 0.113226 0.0160884 1 0 1 1 0 0 +EDGE2 2642 2442 0.0394605 0.0516145 0.0327605 1 0 1 1 0 0 +EDGE2 2642 2602 0.0275185 -0.0799256 -0.0356131 1 0 1 1 0 0 +EDGE2 2642 2502 -0.121724 0.0292317 0.00812121 1 0 1 1 0 0 +EDGE2 2642 2603 0.969189 -0.0550325 -0.00657553 1 0 1 1 0 0 +EDGE2 2642 2503 0.998919 -0.0534832 -0.00867091 1 0 1 1 0 0 +EDGE2 2643 2443 0.0322676 -0.0422987 0.0217656 1 0 1 1 0 0 +EDGE2 2643 2442 -1.03608 0.0042405 -0.0302408 1 0 1 1 0 0 +EDGE2 2643 2602 -0.914375 -0.0617627 -0.0134132 1 0 1 1 0 0 +EDGE2 2643 2642 -0.980661 -0.032317 0.0093673 1 0 1 1 0 0 +EDGE2 2643 2502 -0.919755 0.020822 0.0236995 1 0 1 1 0 0 +EDGE2 2643 2603 -0.0525835 0.033282 -0.00964505 1 0 1 1 0 0 +EDGE2 2643 2503 -0.0197244 0.0405963 -0.0254438 1 0 1 1 0 0 +EDGE2 2643 2444 1.03727 0.0162358 0.0179872 1 0 1 1 0 0 +EDGE2 2643 2604 0.878494 0.0421628 -0.0151938 1 0 1 1 0 0 +EDGE2 2643 2504 0.955546 -0.0658979 -0.0153948 1 0 1 1 0 0 +EDGE2 2644 2443 -1.01435 -0.050132 -0.00430458 1 0 1 1 0 0 +EDGE2 2644 2603 -0.94692 -0.0197853 -0.0608866 1 0 1 1 0 0 +EDGE2 2644 2643 -0.936954 -0.0966963 -0.022032 1 0 1 1 0 0 +EDGE2 2644 2503 -1.02811 0.0337036 -0.0131478 1 0 1 1 0 0 +EDGE2 2644 2444 0.0403921 -0.0502738 -0.0228945 1 0 1 1 0 0 +EDGE2 2644 2604 0.0168407 -0.0341626 0.0102217 1 0 1 1 0 0 +EDGE2 2644 2504 0.0519216 -0.0173723 0.0137773 1 0 1 1 0 0 +EDGE2 2644 1225 1.04448 -0.0921797 -3.15145 1 0 1 1 0 0 +EDGE2 2644 2485 1.06046 -0.0302488 -3.11327 1 0 1 1 0 0 +EDGE2 2644 2505 1.00639 0.0784309 0.00526645 1 0 1 1 0 0 +EDGE2 2644 2605 0.920049 0.0562204 -0.0510155 1 0 1 1 0 0 +EDGE2 2644 2445 1.0512 0.0207439 0.012046 1 0 1 1 0 0 +EDGE2 2645 2446 -0.0214127 -1.00159 -1.54164 1 0 1 1 0 0 +EDGE2 2645 2486 0.00929627 -0.977044 -1.53772 1 0 1 1 0 0 +EDGE2 2645 1226 0.0698834 -1.03292 -1.58902 1 0 1 1 0 0 +EDGE2 2645 2444 -1.07213 -0.00612474 -0.0270668 1 0 1 1 0 0 +EDGE2 2645 2604 -0.947577 -0.115303 0.00170984 1 0 1 1 0 0 +EDGE2 2645 2644 -0.972406 0.0307382 -0.0179188 1 0 1 1 0 0 +EDGE2 2645 2504 -0.954586 -0.00177133 -0.00534399 1 0 1 1 0 0 +EDGE2 2645 1225 -0.0299924 -0.0283113 -3.13604 1 0 1 1 0 0 +EDGE2 2645 2485 0.0421714 -0.0388445 -3.15419 1 0 1 1 0 0 +EDGE2 2645 2505 0.130953 0.0170898 0.0251767 1 0 1 1 0 0 +EDGE2 2645 2605 -0.047206 0.0226715 -0.00747357 1 0 1 1 0 0 +EDGE2 2645 2445 -0.0713531 0.016576 0.00209218 1 0 1 1 0 0 +EDGE2 2645 1224 1.03493 -0.011621 -3.10682 1 0 1 1 0 0 +EDGE2 2645 2484 1.06468 0.0328559 -3.15468 1 0 1 1 0 0 +EDGE2 2645 2506 0.0278409 1.06632 1.57934 1 0 1 1 0 0 +EDGE2 2645 2606 -0.10062 1.00824 1.58615 1 0 1 1 0 0 +EDGE2 2646 2645 -0.985682 -0.037475 -1.57729 1 0 1 1 0 0 +EDGE2 2646 1225 -0.985803 0.0142192 1.55862 1 0 1 1 0 0 +EDGE2 2646 2485 -1.00165 0.0382314 1.57181 1 0 1 1 0 0 +EDGE2 2646 2505 -1.04276 0.0657856 -1.54699 1 0 1 1 0 0 +EDGE2 2646 2605 -0.962925 -0.014944 -1.5803 1 0 1 1 0 0 +EDGE2 2646 2445 -1.01526 0.0778804 -1.54535 1 0 1 1 0 0 +EDGE2 2646 2506 0.0298286 0.0554883 0.00710651 1 0 1 1 0 0 +EDGE2 2646 2606 -0.0201973 -0.114714 0.0423523 1 0 1 1 0 0 +EDGE2 2646 2607 0.933119 -0.00134283 0.0037084 1 0 1 1 0 0 +EDGE2 2646 2507 1.00764 0.0596436 -0.00541543 1 0 1 1 0 0 +EDGE2 2647 2506 -1.0541 0.00496039 -0.0149236 1 0 1 1 0 0 +EDGE2 2647 2606 -1.0351 0.0585972 -0.00305315 1 0 1 1 0 0 +EDGE2 2647 2646 -1.01645 0.0667724 0.0404683 1 0 1 1 0 0 +EDGE2 2647 2607 -0.0154234 -0.0124143 0.00353021 1 0 1 1 0 0 +EDGE2 2647 2507 -0.0648934 0.0670987 0.0435261 1 0 1 1 0 0 +EDGE2 2647 2508 1.02722 -0.0236631 0.00352006 1 0 1 1 0 0 +EDGE2 2647 2608 1.11515 -0.0212511 0.00064335 1 0 1 1 0 0 +EDGE2 2648 2607 -0.895313 -0.092544 0.0265031 1 0 1 1 0 0 +EDGE2 2648 2647 -1.00685 -0.025416 0.00998011 1 0 1 1 0 0 +EDGE2 2648 2507 -0.979574 0.0277594 -0.00971547 1 0 1 1 0 0 +EDGE2 2648 2508 0.075231 0.0667953 0.0106067 1 0 1 1 0 0 +EDGE2 2648 2608 0.024785 0.0947693 -0.0357189 1 0 1 1 0 0 +EDGE2 2648 2609 0.971304 -0.0288994 0.0108412 1 0 1 1 0 0 +EDGE2 2648 2509 1.01404 0.015957 -0.040054 1 0 1 1 0 0 +EDGE2 2649 2508 -1.02543 0.0591614 -0.0311289 1 0 1 1 0 0 +EDGE2 2649 2648 -0.976642 0.0631268 -0.0302453 1 0 1 1 0 0 +EDGE2 2649 2608 -0.952379 -0.043213 0.0123371 1 0 1 1 0 0 +EDGE2 2649 2609 -0.0371087 -0.00973197 0.0127173 1 0 1 1 0 0 +EDGE2 2649 2509 -0.110299 -0.0711101 0.00130045 1 0 1 1 0 0 +EDGE2 2649 2510 0.992689 0.0164782 0.0109413 1 0 1 1 0 0 +EDGE2 2649 2630 0.969226 0.0638408 -3.16168 1 0 1 1 0 0 +EDGE2 2649 2610 0.973835 0.0361105 0.0480387 1 0 1 1 0 0 +EDGE2 2650 2609 -0.995713 0.00777847 0.0175958 1 0 1 1 0 0 +EDGE2 2650 2649 -0.973677 -0.0197494 0.0431094 1 0 1 1 0 0 +EDGE2 2650 2509 -1.07015 0.0254703 -0.0350092 1 0 1 1 0 0 +EDGE2 2650 2631 0.0712162 0.923772 1.54853 1 0 1 1 0 0 +EDGE2 2650 2511 -0.038047 1.02341 1.59491 1 0 1 1 0 0 +EDGE2 2650 2510 0.00480586 -0.0808468 -0.0415472 1 0 1 1 0 0 +EDGE2 2650 2630 0.0288097 0.00809279 -3.14531 1 0 1 1 0 0 +EDGE2 2650 2610 0.00955406 -0.0717137 0.0200537 1 0 1 1 0 0 +EDGE2 2650 2629 0.997232 -0.00646082 -3.14305 1 0 1 1 0 0 +EDGE2 2650 2611 -0.0996895 -0.99732 -1.57581 1 0 1 1 0 0 +EDGE2 2651 2631 0.0182946 0.0404662 -0.00220673 1 0 1 1 0 0 +EDGE2 2651 2512 0.906336 -0.0348513 0.0251134 1 0 1 1 0 0 +EDGE2 2651 2632 1.03158 0.0675403 -0.0583335 1 0 1 1 0 0 +EDGE2 2651 2511 -0.0191849 -0.0368916 -0.0285357 1 0 1 1 0 0 +EDGE2 2651 2510 -1.00401 0.0485025 -1.56811 1 0 1 1 0 0 +EDGE2 2651 2630 -0.977119 -0.0401671 1.54479 1 0 1 1 0 0 +EDGE2 2651 2650 -0.875607 0.0426358 -1.57522 1 0 1 1 0 0 +EDGE2 2651 2610 -0.969121 0.0672789 -1.56606 1 0 1 1 0 0 +EDGE2 2652 2631 -0.980119 0.0359129 -0.0137579 1 0 1 1 0 0 +EDGE2 2652 2513 1.01324 1.55589e-05 -0.00814233 1 0 1 1 0 0 +EDGE2 2652 2633 1.05002 -0.159215 0.0215786 1 0 1 1 0 0 +EDGE2 2652 2512 -0.057643 0.105865 -0.01219 1 0 1 1 0 0 +EDGE2 2652 2632 -0.067296 -0.0196397 -0.0207631 1 0 1 1 0 0 +EDGE2 2652 2651 -1.04135 0.0403556 -0.0120204 1 0 1 1 0 0 +EDGE2 2652 2511 -1.076 -0.0346972 0.0477329 1 0 1 1 0 0 +EDGE2 2653 2513 -0.081212 -0.0989487 0.0103971 1 0 1 1 0 0 +EDGE2 2653 2514 1.03203 0.0204952 0.0103973 1 0 1 1 0 0 +EDGE2 2653 2634 1.02998 -0.0460794 -0.0253093 1 0 1 1 0 0 +EDGE2 2653 2633 -0.00182654 -0.0628784 -0.00811875 1 0 1 1 0 0 +EDGE2 2653 2512 -0.996964 -0.0216287 -0.0165545 1 0 1 1 0 0 +EDGE2 2653 2632 -1.07781 -0.0197338 0.0155786 1 0 1 1 0 0 +EDGE2 2653 2652 -0.92362 -0.0352079 0.00418399 1 0 1 1 0 0 +EDGE2 2654 1295 1.00412 -0.0145755 -3.12046 1 0 1 1 0 0 +EDGE2 2654 2515 1.0013 -0.0595189 -0.0191406 1 0 1 1 0 0 +EDGE2 2654 2635 0.986624 -0.0792602 0.00981431 1 0 1 1 0 0 +EDGE2 2654 1275 1.05809 0.071313 -3.13745 1 0 1 1 0 0 +EDGE2 2654 2513 -1.01798 0.0266781 0.0131461 1 0 1 1 0 0 +EDGE2 2654 2653 -0.97086 0.0068758 -0.0361809 1 0 1 1 0 0 +EDGE2 2654 2514 -0.0721305 0.031041 0.00856202 1 0 1 1 0 0 +EDGE2 2654 2634 0.0652982 0.0183563 0.0227467 1 0 1 1 0 0 +EDGE2 2654 2633 -0.972435 -0.0140208 0.00760409 1 0 1 1 0 0 +EDGE2 2655 2516 0.025505 1.02429 1.53471 1 0 1 1 0 0 +EDGE2 2655 2636 0.0224967 0.982858 1.57006 1 0 1 1 0 0 +EDGE2 2655 2654 -0.973062 -0.00540365 -0.0262801 1 0 1 1 0 0 +EDGE2 2655 1274 0.942361 -0.0614262 -3.16851 1 0 1 1 0 0 +EDGE2 2655 1294 0.971512 0.0644568 -3.15594 1 0 1 1 0 0 +EDGE2 2655 1295 -0.0480008 0.0263116 -3.14125 1 0 1 1 0 0 +EDGE2 2655 2515 0.00702938 -0.0484473 0.0210939 1 0 1 1 0 0 +EDGE2 2655 2635 0.144779 0.0436226 0.0611621 1 0 1 1 0 0 +EDGE2 2655 1275 -0.0630063 0.0109075 -3.13625 1 0 1 1 0 0 +EDGE2 2655 2514 -1.00311 -0.0226201 0.00541876 1 0 1 1 0 0 +EDGE2 2655 2634 -0.95231 -0.0280127 0.00697525 1 0 1 1 0 0 +EDGE2 2655 1296 0.0366036 -0.989025 -1.5888 1 0 1 1 0 0 +EDGE2 2655 1276 0.0297912 -0.973456 -1.56567 1 0 1 1 0 0 +EDGE2 2656 2637 0.91762 -0.034077 0.0277376 1 0 1 1 0 0 +EDGE2 2656 2517 0.922128 -0.0130503 0.0107581 1 0 1 1 0 0 +EDGE2 2656 2516 -0.0363173 -0.0102526 -0.0595376 1 0 1 1 0 0 +EDGE2 2656 2636 -0.00777357 0.0409714 -0.00430812 1 0 1 1 0 0 +EDGE2 2656 2655 -0.971249 -0.0371881 -1.59435 1 0 1 1 0 0 +EDGE2 2656 1295 -0.963609 -0.0777488 1.56287 1 0 1 1 0 0 +EDGE2 2656 2515 -1.02754 -0.0231977 -1.57431 1 0 1 1 0 0 +EDGE2 2656 2635 -1.0277 -0.0741882 -1.55789 1 0 1 1 0 0 +EDGE2 2656 1275 -0.969486 0.0111909 1.60733 1 0 1 1 0 0 +EDGE2 2657 2656 -0.952881 -0.00983474 -0.0104922 1 0 1 1 0 0 +EDGE2 2657 2637 -0.0940211 0.0223149 -0.0118429 1 0 1 1 0 0 +EDGE2 2657 2518 0.907712 0.0332515 -0.00188777 1 0 1 1 0 0 +EDGE2 2657 2638 1.04286 -0.0294199 0.00165184 1 0 1 1 0 0 +EDGE2 2657 2517 0.0133167 0.0548225 -0.00835958 1 0 1 1 0 0 +EDGE2 2657 2516 -0.948744 0.0353933 0.0178831 1 0 1 1 0 0 +EDGE2 2657 2636 -0.964796 0.00705981 -0.0155802 1 0 1 1 0 0 +EDGE2 2658 2639 1.03314 -0.125333 0.010066 1 0 1 1 0 0 +EDGE2 2658 2519 0.957393 -0.00734613 0.0151538 1 0 1 1 0 0 +EDGE2 2658 2637 -0.997009 -0.0245537 -0.0028054 1 0 1 1 0 0 +EDGE2 2658 2518 0.0400751 0.0762606 -0.0336904 1 0 1 1 0 0 +EDGE2 2658 2638 -0.0145435 -0.0537265 0.00429133 1 0 1 1 0 0 +EDGE2 2658 2657 -1.02628 -0.00603842 0.00967705 1 0 1 1 0 0 +EDGE2 2658 2517 -0.972855 -0.0250015 0.0415596 1 0 1 1 0 0 +EDGE2 2659 2420 1.01763 0.024438 -3.16649 1 0 1 1 0 0 +EDGE2 2659 2560 0.927635 -0.000721339 -3.13388 1 0 1 1 0 0 +EDGE2 2659 2600 1.06621 0.0166876 -3.13017 1 0 1 1 0 0 +EDGE2 2659 2640 0.966213 0.0898217 -0.038974 1 0 1 1 0 0 +EDGE2 2659 2580 1.00864 -0.0122471 -3.15341 1 0 1 1 0 0 +EDGE2 2659 2500 1.05021 0.048685 -3.15582 1 0 1 1 0 0 +EDGE2 2659 2520 0.979091 -0.00654346 0.0491886 1 0 1 1 0 0 +EDGE2 2659 2540 1.01417 0.00772653 -3.14869 1 0 1 1 0 0 +EDGE2 2659 2440 1.00682 -0.0195691 -3.14256 1 0 1 1 0 0 +EDGE2 2659 2300 0.938294 -0.0339871 -3.15522 1 0 1 1 0 0 +EDGE2 2659 1260 0.975011 -0.00928376 -3.1639 1 0 1 1 0 0 +EDGE2 2659 2639 -0.130884 0.0398127 0.00487229 1 0 1 1 0 0 +EDGE2 2659 2519 -0.0831503 0.0882603 0.0179906 1 0 1 1 0 0 +EDGE2 2659 2518 -1.03665 0.0359223 0.00742822 1 0 1 1 0 0 +EDGE2 2659 2638 -0.95773 0.0333267 -0.00208011 1 0 1 1 0 0 +EDGE2 2659 2658 -0.926582 0.0637752 -0.00249297 1 0 1 1 0 0 +EDGE2 2660 2441 -0.0363902 1.06661 1.57581 1 0 1 1 0 0 +EDGE2 2660 2521 0.0055758 -1.07562 -1.58314 1 0 1 1 0 0 +EDGE2 2660 2561 -0.00761258 -0.962127 -1.58747 1 0 1 1 0 0 +EDGE2 2660 2581 -0.0164679 -1.04316 -1.56393 1 0 1 1 0 0 +EDGE2 2660 2541 -0.000728678 -0.943464 -1.56239 1 0 1 1 0 0 +EDGE2 2660 2301 0.0114873 -1.08567 -1.56955 1 0 1 1 0 0 +EDGE2 2660 2421 0.0284327 -1.02466 -1.5654 1 0 1 1 0 0 +EDGE2 2660 1261 0.0395921 -1.0729 -1.54904 1 0 1 1 0 0 +EDGE2 2660 2499 0.942423 -0.112491 -3.16383 1 0 1 1 0 0 +EDGE2 2660 2559 0.987766 0.0614728 -3.16553 1 0 1 1 0 0 +EDGE2 2660 2579 0.944785 0.00735742 -3.11582 1 0 1 1 0 0 +EDGE2 2660 2599 0.960964 0.0432007 -3.13315 1 0 1 1 0 0 +EDGE2 2660 2539 1.02271 0.0365468 -3.13011 1 0 1 1 0 0 +EDGE2 2660 2299 1.05615 0.0118158 -3.13137 1 0 1 1 0 0 +EDGE2 2660 2419 0.970276 0.0387435 -3.12546 1 0 1 1 0 0 +EDGE2 2660 2439 1.06711 0.0537289 -3.13144 1 0 1 1 0 0 +EDGE2 2660 1259 1.00434 0.010982 -3.17609 1 0 1 1 0 0 +EDGE2 2660 2420 0.0693975 -0.00771477 -3.1496 1 0 1 1 0 0 +EDGE2 2660 2560 0.152331 -0.000531482 -3.15023 1 0 1 1 0 0 +EDGE2 2660 2600 -0.00268191 -0.103434 -3.14154 1 0 1 1 0 0 +EDGE2 2660 2640 -0.0284842 -0.0624705 -0.00860309 1 0 1 1 0 0 +EDGE2 2660 2580 -0.0264664 0.0113419 -3.14915 1 0 1 1 0 0 +EDGE2 2660 2500 0.089784 0.0404344 -3.1615 1 0 1 1 0 0 +EDGE2 2660 2520 0.0729702 -0.00635134 -0.0061622 1 0 1 1 0 0 +EDGE2 2660 2540 0.0060364 0.0664655 -3.12472 1 0 1 1 0 0 +EDGE2 2660 2440 -0.109067 -0.0811995 -3.09738 1 0 1 1 0 0 +EDGE2 2660 2300 -0.0594858 -0.0512606 -3.14493 1 0 1 1 0 0 +EDGE2 2660 1260 0.0206505 0.0330802 -3.15325 1 0 1 1 0 0 +EDGE2 2660 2601 0.0764017 0.985248 1.58402 1 0 1 1 0 0 +EDGE2 2660 2641 -0.0642383 0.936621 1.59767 1 0 1 1 0 0 +EDGE2 2660 2501 0.0724772 1.03308 1.59082 1 0 1 1 0 0 +EDGE2 2660 2639 -0.909428 0.00443317 -0.0180759 1 0 1 1 0 0 +EDGE2 2660 2659 -0.9933 0.0492231 0.00295254 1 0 1 1 0 0 +EDGE2 2660 2519 -0.88032 0.00110986 -0.00355195 1 0 1 1 0 0 +EDGE2 2661 2441 0.0080674 -0.0607818 0.0408938 1 0 1 1 0 0 +EDGE2 2661 2420 -1.02169 0.0118745 1.55532 1 0 1 1 0 0 +EDGE2 2661 2560 -1.02287 0.0287181 1.5706 1 0 1 1 0 0 +EDGE2 2661 2600 -1.06975 -0.0621409 1.57191 1 0 1 1 0 0 +EDGE2 2661 2640 -0.975805 -0.0234778 -1.56972 1 0 1 1 0 0 +EDGE2 2661 2660 -0.889065 0.0581592 -1.60303 1 0 1 1 0 0 +EDGE2 2661 2580 -1.03433 0.0371501 1.56802 1 0 1 1 0 0 +EDGE2 2661 2500 -0.982413 -0.105049 1.56537 1 0 1 1 0 0 +EDGE2 2661 2520 -1.06598 0.0347217 -1.60981 1 0 1 1 0 0 +EDGE2 2661 2540 -1.04561 -0.0586733 1.57379 1 0 1 1 0 0 +EDGE2 2661 2440 -1.05057 0.0478578 1.6017 1 0 1 1 0 0 +EDGE2 2661 2300 -0.999686 0.0338698 1.57125 1 0 1 1 0 0 +EDGE2 2661 1260 -0.966413 -0.0275124 1.57672 1 0 1 1 0 0 +EDGE2 2661 2601 -0.0157464 0.0105952 -0.0279611 1 0 1 1 0 0 +EDGE2 2661 2641 0.00954532 -0.0341255 0.0194891 1 0 1 1 0 0 +EDGE2 2661 2501 0.0382529 0.0214779 -0.031383 1 0 1 1 0 0 +EDGE2 2661 2442 1.07306 -0.0358989 -0.0204893 1 0 1 1 0 0 +EDGE2 2661 2602 1.07011 0.033572 -0.0130607 1 0 1 1 0 0 +EDGE2 2661 2642 0.980589 -0.0146757 -0.00103353 1 0 1 1 0 0 +EDGE2 2661 2502 1.06665 -0.034226 -0.00288534 1 0 1 1 0 0 +EDGE2 2662 2441 -0.99296 -0.0314121 -0.00462864 1 0 1 1 0 0 +EDGE2 2662 2661 -1.01181 -0.0542265 0.00624613 1 0 1 1 0 0 +EDGE2 2662 2601 -0.984243 -0.0405539 0.0245522 1 0 1 1 0 0 +EDGE2 2662 2641 -1.05203 -0.0259587 0.00666969 1 0 1 1 0 0 +EDGE2 2662 2501 -0.974445 0.0529855 -0.00965869 1 0 1 1 0 0 +EDGE2 2662 2443 0.898297 0.112534 8.59292e-05 1 0 1 1 0 0 +EDGE2 2662 2442 0.0415316 0.0607056 -0.0215883 1 0 1 1 0 0 +EDGE2 2662 2602 0.00245399 -0.0386745 0.0277775 1 0 1 1 0 0 +EDGE2 2662 2642 0.0300588 -0.0423036 0.0231923 1 0 1 1 0 0 +EDGE2 2662 2502 -0.0546526 -0.0364177 0.0249985 1 0 1 1 0 0 +EDGE2 2662 2603 0.995856 0.0197837 -0.00229261 1 0 1 1 0 0 +EDGE2 2662 2643 0.953085 -0.00419695 -0.0106318 1 0 1 1 0 0 +EDGE2 2662 2503 1.02026 0.0112874 0.00246234 1 0 1 1 0 0 +EDGE2 2663 2443 -0.0397071 0.072651 0.0135847 1 0 1 1 0 0 +EDGE2 2663 2442 -0.907809 0.0729657 -0.0291088 1 0 1 1 0 0 +EDGE2 2663 2602 -1.01383 0.0611731 0.0218482 1 0 1 1 0 0 +EDGE2 2663 2642 -0.97487 0.0368096 0.00696151 1 0 1 1 0 0 +EDGE2 2663 2662 -1.06875 -0.0570615 0.013794 1 0 1 1 0 0 +EDGE2 2663 2502 -1.00481 -0.00940187 -0.00305265 1 0 1 1 0 0 +EDGE2 2663 2603 -0.0980225 0.0393503 -0.00826919 1 0 1 1 0 0 +EDGE2 2663 2643 0.0917472 -0.138392 0.0120401 1 0 1 1 0 0 +EDGE2 2663 2503 0.00643489 0.0444725 0.00279426 1 0 1 1 0 0 +EDGE2 2663 2444 1.01752 0.0554451 -0.013434 1 0 1 1 0 0 +EDGE2 2663 2604 0.956901 0.0382013 -0.0182943 1 0 1 1 0 0 +EDGE2 2663 2644 0.906734 -0.0418222 0.0195755 1 0 1 1 0 0 +EDGE2 2663 2504 0.981088 -0.00192256 0.0256179 1 0 1 1 0 0 +EDGE2 2664 2645 1.05119 -0.028136 -0.0238943 1 0 1 1 0 0 +EDGE2 2664 2443 -0.993849 -0.0353476 -0.0124768 1 0 1 1 0 0 +EDGE2 2664 2603 -0.911561 0.0321159 0.0108787 1 0 1 1 0 0 +EDGE2 2664 2643 -0.931172 0.105619 0.013194 1 0 1 1 0 0 +EDGE2 2664 2663 -1.00699 0.0149767 -0.0407581 1 0 1 1 0 0 +EDGE2 2664 2503 -0.957879 -0.090904 -0.0183255 1 0 1 1 0 0 +EDGE2 2664 2444 0.0318898 -0.0639061 0.0138103 1 0 1 1 0 0 +EDGE2 2664 2604 -0.0656893 0.00276389 -0.00236849 1 0 1 1 0 0 +EDGE2 2664 2644 -0.0120611 -0.0207612 0.0229198 1 0 1 1 0 0 +EDGE2 2664 2504 0.0482651 -0.0236334 -0.0515974 1 0 1 1 0 0 +EDGE2 2664 1225 1.07226 -0.0124353 -3.14866 1 0 1 1 0 0 +EDGE2 2664 2485 1.02549 0.00678048 -3.14348 1 0 1 1 0 0 +EDGE2 2664 2505 1.02498 0.061644 -0.0063339 1 0 1 1 0 0 +EDGE2 2664 2605 0.983313 -0.0472376 -0.0165994 1 0 1 1 0 0 +EDGE2 2664 2445 1.00875 0.0488213 -0.0107201 1 0 1 1 0 0 +EDGE2 2665 2446 0.0198384 -1.02463 -1.55328 1 0 1 1 0 0 +EDGE2 2665 2486 0.0016217 -0.957321 -1.56609 1 0 1 1 0 0 +EDGE2 2665 1226 0.0183581 -1.02806 -1.5815 1 0 1 1 0 0 +EDGE2 2665 2645 0.0102728 -0.0693381 0.0491581 1 0 1 1 0 0 +EDGE2 2665 2444 -1.00257 -0.0484439 -0.0238993 1 0 1 1 0 0 +EDGE2 2665 2604 -0.950466 0.0311623 0.0325704 1 0 1 1 0 0 +EDGE2 2665 2644 -0.953483 0.128212 -0.0169724 1 0 1 1 0 0 +EDGE2 2665 2664 -1.01336 0.0837715 -0.022818 1 0 1 1 0 0 +EDGE2 2665 2504 -1.05047 0.0102802 0.0130898 1 0 1 1 0 0 +EDGE2 2665 1225 0.0573527 0.0302586 -3.11323 1 0 1 1 0 0 +EDGE2 2665 2485 -0.0177741 0.00631492 -3.09945 1 0 1 1 0 0 +EDGE2 2665 2505 0.00893233 0.0278152 0.024405 1 0 1 1 0 0 +EDGE2 2665 2605 -0.0292503 0.0555242 -0.0111639 1 0 1 1 0 0 +EDGE2 2665 2445 -0.0286339 0.0392348 0.00684826 1 0 1 1 0 0 +EDGE2 2665 1224 1.02277 -0.000733013 -3.13996 1 0 1 1 0 0 +EDGE2 2665 2484 1.02864 -0.0170807 -3.12744 1 0 1 1 0 0 +EDGE2 2665 2506 0.0188652 0.99592 1.58213 1 0 1 1 0 0 +EDGE2 2665 2606 0.00266655 0.989301 1.57869 1 0 1 1 0 0 +EDGE2 2665 2646 0.0418885 1.0066 1.57231 1 0 1 1 0 0 +EDGE2 2666 2645 -0.946381 -0.00603279 -1.59881 1 0 1 1 0 0 +EDGE2 2666 2665 -1.0061 -0.073034 -1.56665 1 0 1 1 0 0 +EDGE2 2666 1225 -0.87955 -0.13255 1.58163 1 0 1 1 0 0 +EDGE2 2666 2485 -1.06418 -0.041878 1.58697 1 0 1 1 0 0 +EDGE2 2666 2505 -1.00893 -0.0504694 -1.55937 1 0 1 1 0 0 +EDGE2 2666 2605 -0.99694 -0.00314404 -1.55612 1 0 1 1 0 0 +EDGE2 2666 2445 -1.05189 0.0130124 -1.56818 1 0 1 1 0 0 +EDGE2 2666 2506 -0.0451679 0.0431748 0.00178411 1 0 1 1 0 0 +EDGE2 2666 2606 0.0802418 0.0246165 0.000200832 1 0 1 1 0 0 +EDGE2 2666 2646 0.049905 -0.00426883 1.60478e-05 1 0 1 1 0 0 +EDGE2 2666 2607 1.01224 -0.0722099 -0.000603637 1 0 1 1 0 0 +EDGE2 2666 2647 0.915963 0.0373418 0.00728845 1 0 1 1 0 0 +EDGE2 2666 2507 0.9073 0.00451874 -0.00656241 1 0 1 1 0 0 +EDGE2 2667 2666 -1.03585 0.0512481 -0.000306569 1 0 1 1 0 0 +EDGE2 2667 2506 -1.02965 -0.0485363 -0.0276543 1 0 1 1 0 0 +EDGE2 2667 2606 -1.00441 -0.0391755 0.0299888 1 0 1 1 0 0 +EDGE2 2667 2646 -0.916428 -0.0223196 -0.0074071 1 0 1 1 0 0 +EDGE2 2667 2607 -0.0743645 0.040156 -0.0160867 1 0 1 1 0 0 +EDGE2 2667 2647 0.0010501 -0.0746487 0.0147876 1 0 1 1 0 0 +EDGE2 2667 2507 -0.0504178 0.0198204 0.00697136 1 0 1 1 0 0 +EDGE2 2667 2508 0.972079 0.0782869 0.0307891 1 0 1 1 0 0 +EDGE2 2667 2648 1.04423 0.0142433 -0.0280971 1 0 1 1 0 0 +EDGE2 2667 2608 0.891851 0.00608432 -0.0156473 1 0 1 1 0 0 +EDGE2 2668 2607 -0.921047 0.0348624 0.0583277 1 0 1 1 0 0 +EDGE2 2668 2647 -0.983538 -0.0485716 -0.042751 1 0 1 1 0 0 +EDGE2 2668 2667 -0.995982 0.0382289 0.0081627 1 0 1 1 0 0 +EDGE2 2668 2507 -0.875015 0.0625553 0.0301464 1 0 1 1 0 0 +EDGE2 2668 2508 0.00644753 -0.0372946 0.027703 1 0 1 1 0 0 +EDGE2 2668 2648 -0.0593702 0.0291688 0.0283631 1 0 1 1 0 0 +EDGE2 2668 2608 -0.0473641 -0.0602192 0.0206146 1 0 1 1 0 0 +EDGE2 2668 2609 0.96308 -0.110853 0.00917459 1 0 1 1 0 0 +EDGE2 2668 2649 1.01882 -0.0914226 0.00758028 1 0 1 1 0 0 +EDGE2 2668 2509 1.00434 0.0476495 -0.00723666 1 0 1 1 0 0 +EDGE2 2669 2508 -1.00838 -0.0037424 0.0378689 1 0 1 1 0 0 +EDGE2 2669 2648 -1.06082 0.0246845 0.000757402 1 0 1 1 0 0 +EDGE2 2669 2668 -1.04602 -0.0348692 -0.01114 1 0 1 1 0 0 +EDGE2 2669 2608 -0.988228 0.0295847 -0.0262449 1 0 1 1 0 0 +EDGE2 2669 2609 0.00842882 0.0163231 0.00994225 1 0 1 1 0 0 +EDGE2 2669 2649 -0.0207497 -0.0482504 -0.00117578 1 0 1 1 0 0 +EDGE2 2669 2509 0.00719518 -0.0143356 0.00415475 1 0 1 1 0 0 +EDGE2 2669 2510 1.07009 0.0415156 -0.0251863 1 0 1 1 0 0 +EDGE2 2669 2630 0.981437 -0.00529376 -3.10213 1 0 1 1 0 0 +EDGE2 2669 2650 0.959207 -0.0783037 0.0242917 1 0 1 1 0 0 +EDGE2 2669 2610 1.0775 0.0908333 0.0242739 1 0 1 1 0 0 +EDGE2 2670 2609 -0.911157 -0.0233713 -0.0248299 1 0 1 1 0 0 +EDGE2 2670 2649 -1.09801 0.00309262 0.0521048 1 0 1 1 0 0 +EDGE2 2670 2669 -1.06565 -0.00700747 0.0173163 1 0 1 1 0 0 +EDGE2 2670 2509 -0.985333 0.0512584 -0.006719 1 0 1 1 0 0 +EDGE2 2670 2631 -0.0153471 1.00014 1.61162 1 0 1 1 0 0 +EDGE2 2670 2651 -0.0483104 0.978593 1.57912 1 0 1 1 0 0 +EDGE2 2670 2511 0.0317278 0.946113 1.59569 1 0 1 1 0 0 +EDGE2 2670 2510 -0.0601512 -0.0380808 0.0207956 1 0 1 1 0 0 +EDGE2 2670 2630 0.0206793 0.0228519 -3.13302 1 0 1 1 0 0 +EDGE2 2670 2650 -0.00945527 0.00670982 -0.00900162 1 0 1 1 0 0 +EDGE2 2670 2610 0.0043734 -0.0387528 -0.0106784 1 0 1 1 0 0 +EDGE2 2670 2629 0.940747 0.00737718 -3.15433 1 0 1 1 0 0 +EDGE2 2670 2611 0.048101 -1.06863 -1.57549 1 0 1 1 0 0 +EDGE2 2671 2510 -1.052 -0.0398384 1.56952 1 0 1 1 0 0 +EDGE2 2671 2630 -0.95192 0.0419342 -1.57046 1 0 1 1 0 0 +EDGE2 2671 2650 -0.86487 0.0324866 1.58958 1 0 1 1 0 0 +EDGE2 2671 2670 -0.959566 -0.0449467 1.53057 1 0 1 1 0 0 +EDGE2 2671 2610 -0.999293 -0.029739 1.5686 1 0 1 1 0 0 +EDGE2 2671 2611 0.00731958 -0.0175304 0.0260409 1 0 1 1 0 0 +EDGE2 2671 2612 1.06468 0.0119536 0.00353039 1 0 1 1 0 0 +EDGE2 2672 2671 -1.02232 0.0130663 -0.0221564 1 0 1 1 0 0 +EDGE2 2672 2611 -1.00421 0.0232704 -0.0234473 1 0 1 1 0 0 +EDGE2 2672 2612 0.102509 0.0271383 -0.00293989 1 0 1 1 0 0 +EDGE2 2672 2613 0.977407 0.00129268 0.051672 1 0 1 1 0 0 +EDGE2 2673 2612 -1.02846 0.0297889 0.00959624 1 0 1 1 0 0 +EDGE2 2673 2672 -0.938148 -0.0735516 0.0027472 1 0 1 1 0 0 +EDGE2 2673 2613 0.0592042 0.0223868 0.00876871 1 0 1 1 0 0 +EDGE2 2673 2614 1.02695 0.00527329 0.00958741 1 0 1 1 0 0 +EDGE2 2674 2613 -1.05432 0.0241965 -0.0106643 1 0 1 1 0 0 +EDGE2 2674 2673 -1.01102 -0.0402349 0.0114816 1 0 1 1 0 0 +EDGE2 2674 2614 0.0816127 -0.0366536 0.0229436 1 0 1 1 0 0 +EDGE2 2674 2615 1.00738 0.0146309 0.00354427 1 0 1 1 0 0 +EDGE2 2675 2674 -0.974157 0.0254227 -0.00672437 1 0 1 1 0 0 +EDGE2 2675 2614 -0.973212 -0.127654 -0.0379263 1 0 1 1 0 0 +EDGE2 2675 2615 -0.0456942 -0.0107288 0.0195209 1 0 1 1 0 0 +EDGE2 2675 2616 -0.110005 0.995077 1.59307 1 0 1 1 0 0 +EDGE2 2676 2615 -0.9716 -0.0282077 -1.62103 1 0 1 1 0 0 +EDGE2 2676 2675 -1.03763 -0.0345859 -1.57569 1 0 1 1 0 0 +EDGE2 2676 2616 -0.0178935 0.0770843 0.0107427 1 0 1 1 0 0 +EDGE2 2676 2617 1.01101 0.039906 0.0153268 1 0 1 1 0 0 +EDGE2 2677 2676 -0.971635 -0.00764254 -0.0157845 1 0 1 1 0 0 +EDGE2 2677 2616 -0.96693 0.0393413 0.00225399 1 0 1 1 0 0 +EDGE2 2677 2617 0.0176426 0.0680309 -0.0151293 1 0 1 1 0 0 +EDGE2 2677 2618 0.963776 -0.00377647 -0.0244113 1 0 1 1 0 0 +EDGE2 2678 2677 -1.0424 0.0831583 0.0169169 1 0 1 1 0 0 +EDGE2 2678 2617 -1.00925 0.0279644 0.0145854 1 0 1 1 0 0 +EDGE2 2678 2618 0.00297737 -0.0839614 0.00410215 1 0 1 1 0 0 +EDGE2 2678 2619 0.979162 -0.0230902 0.0282215 1 0 1 1 0 0 +EDGE2 2679 2618 -1.09957 0.0716446 0.00674875 1 0 1 1 0 0 +EDGE2 2679 2678 -1.02117 -0.0710832 0.00331428 1 0 1 1 0 0 +EDGE2 2679 2619 -0.0599353 0.0279639 -0.00776587 1 0 1 1 0 0 +EDGE2 2679 2620 0.938315 0.0144086 -0.0174816 1 0 1 1 0 0 +EDGE2 2680 2619 -0.923044 -0.0526957 0.0419846 1 0 1 1 0 0 +EDGE2 2680 2679 -1.04536 0.0230266 0.00579088 1 0 1 1 0 0 +EDGE2 2680 2621 0.00961686 1.02351 1.57537 1 0 1 1 0 0 +EDGE2 2680 2620 0.0581255 0.0221122 -0.000630466 1 0 1 1 0 0 +EDGE2 2681 2622 0.94321 -0.0182924 -0.0156501 1 0 1 1 0 0 +EDGE2 2681 2621 -0.0594632 0.0562038 0.0102362 1 0 1 1 0 0 +EDGE2 2681 2620 -1.08154 0.00538127 -1.58651 1 0 1 1 0 0 +EDGE2 2681 2680 -1.03653 -0.0196484 -1.56839 1 0 1 1 0 0 +EDGE2 2682 2622 0.0369054 -0.0933434 -0.00627089 1 0 1 1 0 0 +EDGE2 2682 2623 1.02614 0.054329 0.00931016 1 0 1 1 0 0 +EDGE2 2682 2681 -0.942844 -0.00277384 -0.0212628 1 0 1 1 0 0 +EDGE2 2682 2621 -0.982076 -0.0688069 -0.0238593 1 0 1 1 0 0 +EDGE2 2683 2624 0.997165 -0.0336586 -0.0160027 1 0 1 1 0 0 +EDGE2 2683 2622 -0.988466 -0.0307702 -0.0529437 1 0 1 1 0 0 +EDGE2 2683 2623 -0.00982706 -0.0812861 0.00450896 1 0 1 1 0 0 +EDGE2 2683 2682 -1.06898 0.045132 -0.0218358 1 0 1 1 0 0 +EDGE2 2684 2624 -0.104299 0.0158977 -0.0150439 1 0 1 1 0 0 +EDGE2 2684 2625 0.964462 -0.0353575 8.37278e-05 1 0 1 1 0 0 +EDGE2 2684 2683 -1.00003 0.0486234 -0.00341527 1 0 1 1 0 0 +EDGE2 2684 2623 -0.994565 -0.084253 0.0302553 1 0 1 1 0 0 +EDGE2 2685 2626 0.0173533 0.85087 1.5702 1 0 1 1 0 0 +EDGE2 2685 2624 -0.942646 -0.0420412 -0.0205426 1 0 1 1 0 0 +EDGE2 2685 2625 0.0116361 0.106812 0.0220387 1 0 1 1 0 0 +EDGE2 2685 2684 -1.03179 -0.0459893 0.0150605 1 0 1 1 0 0 +EDGE2 2686 2627 1.06791 -0.04129 -0.0340634 1 0 1 1 0 0 +EDGE2 2686 2626 0.0621584 0.0377453 -0.0269686 1 0 1 1 0 0 +EDGE2 2686 2685 -0.972573 0.0353471 -1.56951 1 0 1 1 0 0 +EDGE2 2686 2625 -1.09022 0.0380995 -1.56103 1 0 1 1 0 0 +EDGE2 2687 2628 1.01785 -0.00288337 -0.00286055 1 0 1 1 0 0 +EDGE2 2687 2627 -0.0609814 0.0843138 0.00867711 1 0 1 1 0 0 +EDGE2 2687 2686 -0.945343 0.0233977 0.0197959 1 0 1 1 0 0 +EDGE2 2687 2626 -1.14213 -0.00022183 -0.0147071 1 0 1 1 0 0 +EDGE2 2688 2687 -0.955884 -0.0193248 -0.0108526 1 0 1 1 0 0 +EDGE2 2688 2629 0.987076 -0.0598084 -0.0355372 1 0 1 1 0 0 +EDGE2 2688 2628 -0.0086316 0.0729863 0.00202232 1 0 1 1 0 0 +EDGE2 2688 2627 -1.03806 0.00117687 -0.0334876 1 0 1 1 0 0 +EDGE2 2689 2510 1.06347 -0.0983366 -3.1587 1 0 1 1 0 0 +EDGE2 2689 2630 0.981085 -0.0798979 -0.0069771 1 0 1 1 0 0 +EDGE2 2689 2650 1.01693 -0.0271228 -3.12452 1 0 1 1 0 0 +EDGE2 2689 2670 0.95192 0.00970286 -3.16308 1 0 1 1 0 0 +EDGE2 2689 2610 1.03598 0.00336354 -3.12538 1 0 1 1 0 0 +EDGE2 2689 2688 -1.00183 -0.0341912 -0.0204659 1 0 1 1 0 0 +EDGE2 2689 2629 -0.0364193 0.0171965 0.0233487 1 0 1 1 0 0 +EDGE2 2689 2628 -1.08971 -0.0139892 -0.0152939 1 0 1 1 0 0 +EDGE2 2690 2609 0.913376 -0.059235 -3.15426 1 0 1 1 0 0 +EDGE2 2690 2649 0.999786 0.033628 -3.13347 1 0 1 1 0 0 +EDGE2 2690 2669 0.964508 0.0322744 -3.17666 1 0 1 1 0 0 +EDGE2 2690 2509 0.894296 -0.00664716 -3.15454 1 0 1 1 0 0 +EDGE2 2690 2689 -0.907419 0.0261866 0.00292356 1 0 1 1 0 0 +EDGE2 2690 2631 0.00475442 -0.962608 -1.58043 1 0 1 1 0 0 +EDGE2 2690 2651 -0.0655303 -0.950264 -1.56078 1 0 1 1 0 0 +EDGE2 2690 2511 -0.0408765 -0.942417 -1.54903 1 0 1 1 0 0 +EDGE2 2690 2510 0.00750237 0.0470329 -3.11024 1 0 1 1 0 0 +EDGE2 2690 2630 -0.0303683 -0.0433469 0.0050118 1 0 1 1 0 0 +EDGE2 2690 2650 0.00250559 0.0135818 -3.1367 1 0 1 1 0 0 +EDGE2 2690 2670 -0.0241027 0.050371 -3.12214 1 0 1 1 0 0 +EDGE2 2690 2610 0.0218876 -0.024688 -3.14368 1 0 1 1 0 0 +EDGE2 2690 2629 -0.963514 0.0244347 -0.00404947 1 0 1 1 0 0 +EDGE2 2690 2671 0.0973764 1.03007 1.51898 1 0 1 1 0 0 +EDGE2 2690 2611 -0.133732 1.11925 1.59686 1 0 1 1 0 0 +EDGE2 2691 2690 -1.04859 0.10852 -1.58802 1 0 1 1 0 0 +EDGE2 2691 2510 -0.986116 -0.0533667 1.58495 1 0 1 1 0 0 +EDGE2 2691 2630 -0.96427 -0.0195233 -1.55747 1 0 1 1 0 0 +EDGE2 2691 2650 -0.990374 0.0591533 1.58319 1 0 1 1 0 0 +EDGE2 2691 2670 -1.00231 -0.000337798 1.57423 1 0 1 1 0 0 +EDGE2 2691 2610 -1.06051 0.0528744 1.56949 1 0 1 1 0 0 +EDGE2 2691 2671 0.0127816 -0.0176207 -0.0100735 1 0 1 1 0 0 +EDGE2 2691 2611 0.0204984 -0.0405091 0.0148508 1 0 1 1 0 0 +EDGE2 2691 2612 0.981409 -0.0379734 0.019387 1 0 1 1 0 0 +EDGE2 2691 2672 1.03388 -0.0520962 -0.00145332 1 0 1 1 0 0 +EDGE2 2692 2671 -0.914271 -0.0488585 -0.0229366 1 0 1 1 0 0 +EDGE2 2692 2691 -0.967473 0.0119048 -0.0319789 1 0 1 1 0 0 +EDGE2 2692 2611 -0.958471 -0.048852 -0.0195663 1 0 1 1 0 0 +EDGE2 2692 2612 0.0433823 0.0241757 -0.0215802 1 0 1 1 0 0 +EDGE2 2692 2672 -0.0498288 0.021891 0.00527099 1 0 1 1 0 0 +EDGE2 2692 2613 0.972187 -0.0248076 -0.0269731 1 0 1 1 0 0 +EDGE2 2692 2673 0.982681 -0.0491283 0.0184614 1 0 1 1 0 0 +EDGE2 2693 2692 -0.998272 0.0705862 0.0154331 1 0 1 1 0 0 +EDGE2 2693 2612 -1.05576 -0.0034739 -0.00298352 1 0 1 1 0 0 +EDGE2 2693 2672 -0.972971 0.0372606 0.00414746 1 0 1 1 0 0 +EDGE2 2693 2613 -0.020662 -0.0977229 0.0209913 1 0 1 1 0 0 +EDGE2 2693 2673 0.0208205 -0.0759895 0.0111325 1 0 1 1 0 0 +EDGE2 2693 2674 1.02919 0.0166473 0.00508345 1 0 1 1 0 0 +EDGE2 2693 2614 0.986936 0.076317 0.0238361 1 0 1 1 0 0 +EDGE2 2694 2613 -1.06632 -0.0119292 -0.00729465 1 0 1 1 0 0 +EDGE2 2694 2673 -1.02064 0.0781728 0.017803 1 0 1 1 0 0 +EDGE2 2694 2693 -0.933408 -0.101417 -0.0601489 1 0 1 1 0 0 +EDGE2 2694 2674 0.0241681 0.0258623 -0.0354006 1 0 1 1 0 0 +EDGE2 2694 2614 -0.0655781 0.0934369 -0.0168028 1 0 1 1 0 0 +EDGE2 2694 2615 0.987005 0.0070016 -0.00337641 1 0 1 1 0 0 +EDGE2 2694 2675 0.956473 -0.0586434 -0.0209852 1 0 1 1 0 0 +EDGE2 2695 2674 -0.975349 0.00208146 -0.0203413 1 0 1 1 0 0 +EDGE2 2695 2694 -0.916976 0.0217165 0.0021697 1 0 1 1 0 0 +EDGE2 2695 2614 -0.928048 -0.0111487 0.016593 1 0 1 1 0 0 +EDGE2 2695 2615 0.0466374 0.0559661 0.0352451 1 0 1 1 0 0 +EDGE2 2695 2675 0.0572729 -0.053767 0.0341413 1 0 1 1 0 0 +EDGE2 2695 2676 3.77627e-05 1.0496 1.54385 1 0 1 1 0 0 +EDGE2 2695 2616 0.0283061 0.953677 1.52529 1 0 1 1 0 0 +EDGE2 2696 2615 -1.07714 -0.0480082 -1.54424 1 0 1 1 0 0 +EDGE2 2696 2675 -0.982045 0.00252516 -1.57084 1 0 1 1 0 0 +EDGE2 2696 2695 -1.04142 0.0310417 -1.58831 1 0 1 1 0 0 +EDGE2 2696 2677 1.03928 0.00642315 -0.0103982 1 0 1 1 0 0 +EDGE2 2696 2676 -0.0133826 -0.00390895 0.0283361 1 0 1 1 0 0 +EDGE2 2696 2616 -0.0464862 -0.0317691 -0.0111381 1 0 1 1 0 0 +EDGE2 2696 2617 0.950335 0.0735726 0.0191544 1 0 1 1 0 0 +EDGE2 2697 2677 -0.0316509 0.00584248 0.0141355 1 0 1 1 0 0 +EDGE2 2697 2676 -1.04454 0.0136895 0.0023162 1 0 1 1 0 0 +EDGE2 2697 2696 -1.02187 0.0200453 -0.00900511 1 0 1 1 0 0 +EDGE2 2697 2616 -1.03199 0.0279828 0.0248553 1 0 1 1 0 0 +EDGE2 2697 2617 -0.0197105 -0.0325495 -0.0179132 1 0 1 1 0 0 +EDGE2 2697 2618 0.976743 0.0211445 0.0271831 1 0 1 1 0 0 +EDGE2 2697 2678 0.914196 -0.0234659 0.00963201 1 0 1 1 0 0 +EDGE2 2698 2677 -1.00323 0.00999265 0.0165204 1 0 1 1 0 0 +EDGE2 2698 2697 -0.94435 0.0592735 -0.0143077 1 0 1 1 0 0 +EDGE2 2698 2617 -1.01252 0.138346 -0.016222 1 0 1 1 0 0 +EDGE2 2698 2618 -0.0389459 -0.0791953 -0.0111353 1 0 1 1 0 0 +EDGE2 2698 2678 0.0246733 0.00728546 -0.0238555 1 0 1 1 0 0 +EDGE2 2698 2619 0.991048 0.0052561 -0.0196746 1 0 1 1 0 0 +EDGE2 2698 2679 0.978665 -0.00281384 0.0259407 1 0 1 1 0 0 +EDGE2 2699 2698 -0.955363 -0.0109065 0.0302731 1 0 1 1 0 0 +EDGE2 2699 2618 -1.01547 0.0401989 -0.0215449 1 0 1 1 0 0 +EDGE2 2699 2678 -0.997538 0.0370703 0.011511 1 0 1 1 0 0 +EDGE2 2699 2619 6.11367e-05 -0.0737345 -0.00183931 1 0 1 1 0 0 +EDGE2 2699 2679 -0.0637186 0.059075 0.00365635 1 0 1 1 0 0 +EDGE2 2699 2620 0.900754 -0.00301882 0.0257707 1 0 1 1 0 0 +EDGE2 2699 2680 0.921269 -0.0591911 -0.0382972 1 0 1 1 0 0 +EDGE2 2700 2699 -0.987238 0.0449683 -0.00120033 1 0 1 1 0 0 +EDGE2 2700 2619 -0.97319 0.063048 -0.0015539 1 0 1 1 0 0 +EDGE2 2700 2679 -0.989443 0.0261768 0.0270309 1 0 1 1 0 0 +EDGE2 2700 2681 -0.0268131 0.858354 1.60318 1 0 1 1 0 0 +EDGE2 2700 2621 -0.0860971 1.12944 1.58181 1 0 1 1 0 0 +EDGE2 2700 2620 -0.073912 -0.0262301 -0.0060144 1 0 1 1 0 0 +EDGE2 2700 2680 0.0218486 -0.00394849 0.0121921 1 0 1 1 0 0 +EDGE2 2701 2620 -1.02323 -0.0281435 1.5701 1 0 1 1 0 0 +EDGE2 2701 2680 -1.02205 -0.0485596 1.56504 1 0 1 1 0 0 +EDGE2 2701 2700 -0.970982 -0.0381155 1.57781 1 0 1 1 0 0 +EDGE2 2702 2701 -1.04933 0.0058474 0.00687145 1 0 1 1 0 0 +EDGE2 2703 2702 -1.00747 0.0212534 0.0243666 1 0 1 1 0 0 +EDGE2 2704 2703 -1.05994 -0.0016094 -0.0192818 1 0 1 1 0 0 +EDGE2 2705 2704 -1.05336 0.0687373 0.0285919 1 0 1 1 0 0 +EDGE2 2706 2705 -0.940355 0.0370083 1.59533 1 0 1 1 0 0 +EDGE2 2707 2706 -0.962262 0.0567134 -0.0016275 1 0 1 1 0 0 +EDGE2 2708 2707 -1.01167 -0.0527763 0.0435653 1 0 1 1 0 0 +EDGE2 2709 2708 -0.98526 -0.0401149 0.0111527 1 0 1 1 0 0 +EDGE2 2710 2709 -0.990077 -0.0222317 0.00819535 1 0 1 1 0 0 +EDGE2 2711 2710 -0.996624 0.0444945 -1.56373 1 0 1 1 0 0 +EDGE2 2712 2711 -0.967929 -0.0619393 -0.00850168 1 0 1 1 0 0 +EDGE2 2713 2712 -0.924909 0.0870831 0.0399372 1 0 1 1 0 0 +EDGE2 2714 2713 -0.995654 -0.0176097 0.00502599 1 0 1 1 0 0 +EDGE2 2715 2714 -0.983346 -0.141023 -0.00479146 1 0 1 1 0 0 +EDGE2 2716 2715 -0.909777 -0.00420445 -1.59053 1 0 1 1 0 0 +EDGE2 2717 2716 -0.978846 -0.0208924 -0.00327404 1 0 1 1 0 0 +EDGE2 2718 2717 -0.965277 -0.0190059 0.0194238 1 0 1 1 0 0 +EDGE2 2719 2718 -1.0489 -0.0212239 -0.0389103 1 0 1 1 0 0 +EDGE2 2720 2719 -0.89343 -0.0382599 -0.0109788 1 0 1 1 0 0 +EDGE2 2721 2720 -1.09321 0.0275368 1.58914 1 0 1 1 0 0 +EDGE2 2722 2721 -1.0832 -0.0405012 -0.0260416 1 0 1 1 0 0 +EDGE2 2723 2722 -0.957618 -0.045648 0.0543759 1 0 1 1 0 0 +EDGE2 2724 2723 -1.00028 0.0385187 0.00584177 1 0 1 1 0 0 +EDGE2 2725 2724 -1.01366 -0.0293026 0.0255213 1 0 1 1 0 0 +EDGE2 2726 2725 -1.11109 -0.026718 -1.60284 1 0 1 1 0 0 +EDGE2 2727 2726 -1.00185 0.0755163 -0.00716906 1 0 1 1 0 0 +EDGE2 2728 2727 -0.982381 0.00272517 0.0202504 1 0 1 1 0 0 +EDGE2 2729 2728 -1.05817 -0.0167146 -0.00555376 1 0 1 1 0 0 +EDGE2 2730 2729 -1.08607 0.00910683 0.00699674 1 0 1 1 0 0 +EDGE2 2731 2730 -0.988977 -0.0281134 -1.52408 1 0 1 1 0 0 +EDGE2 2732 2731 -0.967875 -0.00348912 -0.0208334 1 0 1 1 0 0 +EDGE2 2733 2732 -1.02372 0.0369897 -0.00948243 1 0 1 1 0 0 +EDGE2 2734 2733 -1.01351 0.0115825 -0.0250794 1 0 1 1 0 0 +EDGE2 2735 2734 -1.02795 -0.0974423 0.00306546 1 0 1 1 0 0 +EDGE2 2736 2735 -1.04254 -0.0387815 -1.60415 1 0 1 1 0 0 +EDGE2 2737 2736 -0.955835 0.0478092 -0.0231995 1 0 1 1 0 0 +EDGE2 2738 2737 -0.998124 0.131098 -0.0156421 1 0 1 1 0 0 +EDGE2 2739 2720 1.00913 -0.0256403 -3.11599 1 0 1 1 0 0 +EDGE2 2739 2738 -1.0729 -0.0348149 0.0338077 1 0 1 1 0 0 +EDGE2 2740 2719 1.00895 0.00186842 -3.13479 1 0 1 1 0 0 +EDGE2 2740 2721 0.0696791 0.963427 1.56039 1 0 1 1 0 0 +EDGE2 2740 2720 0.0583487 -0.0263048 -3.15262 1 0 1 1 0 0 +EDGE2 2740 2739 -1.03994 0.0704365 -0.014424 1 0 1 1 0 0 +EDGE2 2741 2720 -1.05111 0.0382398 -1.56774 1 0 1 1 0 0 +EDGE2 2741 2740 -0.981905 -0.0439605 1.58966 1 0 1 1 0 0 +EDGE2 2742 2741 -1.01596 0.0301616 0.000798523 1 0 1 1 0 0 +EDGE2 2743 2742 -1.00934 0.0337007 0.00848568 1 0 1 1 0 0 +EDGE2 2744 2705 0.964707 -0.0422003 -3.15219 1 0 1 1 0 0 +EDGE2 2744 2743 -0.986041 0.0125357 0.0122473 1 0 1 1 0 0 +EDGE2 2745 2704 1.00773 -0.0169923 -3.15411 1 0 1 1 0 0 +EDGE2 2745 2706 0.0681619 1.10905 1.57421 1 0 1 1 0 0 +EDGE2 2745 2705 0.0792355 -0.00419365 -3.13115 1 0 1 1 0 0 +EDGE2 2745 2744 -0.990239 -0.116083 0.053199 1 0 1 1 0 0 +EDGE2 2746 2705 -1.05906 0.00761669 -1.55307 1 0 1 1 0 0 +EDGE2 2746 2745 -0.976471 -0.00692215 1.55202 1 0 1 1 0 0 +EDGE2 2747 2746 -0.942849 -0.0178964 -0.0369644 1 0 1 1 0 0 +EDGE2 2748 2747 -1.03299 0.00342216 0.0143387 1 0 1 1 0 0 +EDGE2 2749 2748 -1.04981 -0.0255224 -0.00818716 1 0 1 1 0 0 +EDGE2 2750 2749 -0.922282 -0.0195458 0.0230433 1 0 1 1 0 0 +EDGE2 2751 2750 -1.01638 -0.00495422 -1.54693 1 0 1 1 0 0 +EDGE2 2752 2751 -1.06504 -0.00387503 0.0350136 1 0 1 1 0 0 +EDGE2 2753 2752 -0.937601 0.00147884 -0.0155493 1 0 1 1 0 0 +EDGE2 2754 2753 -1.04113 0.00776299 0.00734027 1 0 1 1 0 0 +EDGE2 2755 2754 -0.9494 -0.0504206 0.00150026 1 0 1 1 0 0 +EDGE2 2756 2755 -1.03675 -0.0636242 -1.56006 1 0 1 1 0 0 +EDGE2 2757 2756 -1.01603 0.0289621 -0.0341599 1 0 1 1 0 0 +EDGE2 2758 2757 -1.01949 -0.0633417 0.0156001 1 0 1 1 0 0 +EDGE2 2759 2620 0.924734 0.0349746 -3.15371 1 0 1 1 0 0 +EDGE2 2759 2680 0.993998 0.0027753 -3.15388 1 0 1 1 0 0 +EDGE2 2759 2700 1.00374 0.0330089 -3.15354 1 0 1 1 0 0 +EDGE2 2759 2758 -1.09883 0.158225 0.0290958 1 0 1 1 0 0 +EDGE2 2760 2699 0.999435 0.0266757 -3.11685 1 0 1 1 0 0 +EDGE2 2760 2619 0.972667 -0.0211199 -3.13075 1 0 1 1 0 0 +EDGE2 2760 2679 0.984862 -0.0332529 -3.18107 1 0 1 1 0 0 +EDGE2 2760 2681 0.00174912 -0.936577 -1.56616 1 0 1 1 0 0 +EDGE2 2760 2621 0.0421695 -1.00173 -1.58547 1 0 1 1 0 0 +EDGE2 2760 2620 -0.0965614 -0.0978197 -3.14845 1 0 1 1 0 0 +EDGE2 2760 2680 -0.0436768 0.0347412 -3.12913 1 0 1 1 0 0 +EDGE2 2760 2700 -0.0214001 -0.0107476 -3.18063 1 0 1 1 0 0 +EDGE2 2760 2701 0.0528361 0.96627 1.58752 1 0 1 1 0 0 +EDGE2 2760 2759 -1.03784 -0.0518021 -0.0175968 1 0 1 1 0 0 +EDGE2 2761 2760 -1.00865 -0.0657816 1.5746 1 0 1 1 0 0 +EDGE2 2761 2622 0.936222 0.0385996 0.00383371 1 0 1 1 0 0 +EDGE2 2761 2682 0.97265 -0.0203137 0.0272969 1 0 1 1 0 0 +EDGE2 2761 2681 -0.064424 -0.0182682 -0.0393652 1 0 1 1 0 0 +EDGE2 2761 2621 -0.0694129 -0.0153819 -0.0269416 1 0 1 1 0 0 +EDGE2 2761 2620 -0.988511 0.00279875 -1.60694 1 0 1 1 0 0 +EDGE2 2761 2680 -1.06715 0.0175233 -1.54487 1 0 1 1 0 0 +EDGE2 2761 2700 -0.94768 -0.00623384 -1.53318 1 0 1 1 0 0 +EDGE2 2762 2622 0.0699461 0.0434758 -0.017829 1 0 1 1 0 0 +EDGE2 2762 2683 0.976991 0.00779727 -0.00564171 1 0 1 1 0 0 +EDGE2 2762 2623 1.05592 0.0540559 -0.0244164 1 0 1 1 0 0 +EDGE2 2762 2682 0.0160058 -0.0192002 0.0368934 1 0 1 1 0 0 +EDGE2 2762 2681 -0.990831 -0.0658016 -0.0036922 1 0 1 1 0 0 +EDGE2 2762 2761 -0.934861 0.0322316 -0.0314069 1 0 1 1 0 0 +EDGE2 2762 2621 -1.01448 0.0269524 -0.0107464 1 0 1 1 0 0 +EDGE2 2763 2624 0.983482 -0.031569 -0.0172698 1 0 1 1 0 0 +EDGE2 2763 2684 1.03571 0.0380066 -0.0116703 1 0 1 1 0 0 +EDGE2 2763 2622 -1.11885 0.0700036 -0.026253 1 0 1 1 0 0 +EDGE2 2763 2683 -0.0302024 -0.0309294 0.0115896 1 0 1 1 0 0 +EDGE2 2763 2623 -0.0318913 0.0432476 0.0158204 1 0 1 1 0 0 +EDGE2 2763 2682 -0.979836 0.114825 0.00908489 1 0 1 1 0 0 +EDGE2 2763 2762 -1.04739 0.0302374 0.019277 1 0 1 1 0 0 +EDGE2 2764 2624 -0.0726615 -0.0128805 0.00657688 1 0 1 1 0 0 +EDGE2 2764 2685 0.975855 -0.0623898 -0.00642513 1 0 1 1 0 0 +EDGE2 2764 2625 1.01472 0.00848066 0.00266836 1 0 1 1 0 0 +EDGE2 2764 2684 -0.0431222 0.0232584 -0.00210504 1 0 1 1 0 0 +EDGE2 2764 2683 -0.986129 0.0407643 0.0089783 1 0 1 1 0 0 +EDGE2 2764 2763 -0.960193 -0.0523693 0.0122716 1 0 1 1 0 0 +EDGE2 2764 2623 -1.01073 -0.0326173 0.0258925 1 0 1 1 0 0 +EDGE2 2765 2686 -0.0439944 1.01134 1.58183 1 0 1 1 0 0 +EDGE2 2765 2626 0.0465596 0.968805 1.55974 1 0 1 1 0 0 +EDGE2 2765 2624 -1.06132 0.0382559 0.0116962 1 0 1 1 0 0 +EDGE2 2765 2685 0.0754581 -0.0264211 0.0196246 1 0 1 1 0 0 +EDGE2 2765 2764 -1.04298 0.0460073 -0.00612511 1 0 1 1 0 0 +EDGE2 2765 2625 0.0424909 -0.0423905 -0.0337196 1 0 1 1 0 0 +EDGE2 2765 2684 -0.993504 0.0349715 -0.0273842 1 0 1 1 0 0 +EDGE2 2766 2687 1.0266 -0.0837533 0.017655 1 0 1 1 0 0 +EDGE2 2766 2627 1.09141 0.0126062 0.0149671 1 0 1 1 0 0 +EDGE2 2766 2686 -0.0593934 -0.0422868 0.0218365 1 0 1 1 0 0 +EDGE2 2766 2626 -0.0570195 0.0708805 -0.00921697 1 0 1 1 0 0 +EDGE2 2766 2685 -1.03312 0.0795882 -1.60348 1 0 1 1 0 0 +EDGE2 2766 2765 -1.03061 -0.0586105 -1.61402 1 0 1 1 0 0 +EDGE2 2766 2625 -1.0882 0.0282495 -1.56615 1 0 1 1 0 0 +EDGE2 2767 2766 -0.953019 -0.0361217 0.0227164 1 0 1 1 0 0 +EDGE2 2767 2687 -0.0163683 0.0412532 -0.0184866 1 0 1 1 0 0 +EDGE2 2767 2688 1.00315 0.00142085 -0.0150642 1 0 1 1 0 0 +EDGE2 2767 2628 1.00407 0.0312945 0.00603081 1 0 1 1 0 0 +EDGE2 2767 2627 -0.0909219 0.0171606 -0.0198435 1 0 1 1 0 0 +EDGE2 2767 2686 -1.03057 0.0757276 -0.0128237 1 0 1 1 0 0 +EDGE2 2767 2626 -1.00961 0.0768232 -0.00245614 1 0 1 1 0 0 +EDGE2 2768 2689 0.977123 -0.0633366 -0.0178694 1 0 1 1 0 0 +EDGE2 2768 2687 -1.10041 0.032241 -0.0024185 1 0 1 1 0 0 +EDGE2 2768 2688 -0.0134136 0.000961403 -0.00371784 1 0 1 1 0 0 +EDGE2 2768 2629 0.993731 -0.029619 -0.0149451 1 0 1 1 0 0 +EDGE2 2768 2628 0.113497 0.0177521 0.0120974 1 0 1 1 0 0 +EDGE2 2768 2767 -1.05627 0.015976 -0.0199812 1 0 1 1 0 0 +EDGE2 2768 2627 -0.984703 -0.00334289 0.0173627 1 0 1 1 0 0 +EDGE2 2769 2689 0.0575293 0.0360173 -0.0153764 1 0 1 1 0 0 +EDGE2 2769 2690 1.05346 -0.0364805 -0.026439 1 0 1 1 0 0 +EDGE2 2769 2510 1.08486 0.0589534 -3.139 1 0 1 1 0 0 +EDGE2 2769 2630 0.983728 0.0300409 -0.018886 1 0 1 1 0 0 +EDGE2 2769 2650 1.10986 0.000282326 -3.14173 1 0 1 1 0 0 +EDGE2 2769 2670 1.0586 -0.0145057 -3.1124 1 0 1 1 0 0 +EDGE2 2769 2610 1.0069 -0.0885331 -3.14522 1 0 1 1 0 0 +EDGE2 2769 2688 -1.03161 0.00371712 0.00425186 1 0 1 1 0 0 +EDGE2 2769 2629 0.00359893 -0.0150402 0.00721516 1 0 1 1 0 0 +EDGE2 2769 2768 -0.921 0.0225861 0.0043197 1 0 1 1 0 0 +EDGE2 2769 2628 -0.973211 -0.0253734 -0.027304 1 0 1 1 0 0 +EDGE2 2770 2609 1.04109 0.0075693 -3.11924 1 0 1 1 0 0 +EDGE2 2770 2649 0.966333 -0.00657336 -3.14396 1 0 1 1 0 0 +EDGE2 2770 2669 0.999194 -0.0495427 -3.15606 1 0 1 1 0 0 +EDGE2 2770 2509 0.956077 -0.00694635 -3.1467 1 0 1 1 0 0 +EDGE2 2770 2689 -0.974526 0.050334 -0.0311042 1 0 1 1 0 0 +EDGE2 2770 2631 -0.0824455 -0.918884 -1.57786 1 0 1 1 0 0 +EDGE2 2770 2651 0.0459109 -0.955838 -1.54659 1 0 1 1 0 0 +EDGE2 2770 2690 -0.0716227 0.00355872 0.0191858 1 0 1 1 0 0 +EDGE2 2770 2511 -0.00446184 -0.968819 -1.61175 1 0 1 1 0 0 +EDGE2 2770 2510 0.0242325 0.0792222 -3.13378 1 0 1 1 0 0 +EDGE2 2770 2630 -0.0307035 0.0248839 0.0223953 1 0 1 1 0 0 +EDGE2 2770 2650 0.0297579 0.038615 -3.136 1 0 1 1 0 0 +EDGE2 2770 2670 -0.00284658 -0.0275438 -3.10069 1 0 1 1 0 0 +EDGE2 2770 2610 0.0150806 0.0524678 -3.13717 1 0 1 1 0 0 +EDGE2 2770 2769 -0.93477 0.108181 -0.000881741 1 0 1 1 0 0 +EDGE2 2770 2629 -0.999039 0.0532526 0.0019942 1 0 1 1 0 0 +EDGE2 2770 2671 0.0301207 0.970574 1.57459 1 0 1 1 0 0 +EDGE2 2770 2691 -0.0725076 0.946128 1.59114 1 0 1 1 0 0 +EDGE2 2770 2611 0.0892828 0.92287 1.51259 1 0 1 1 0 0 +EDGE2 2771 2690 -0.992696 0.0177515 -1.59007 1 0 1 1 0 0 +EDGE2 2771 2770 -0.978674 -0.0155193 -1.6048 1 0 1 1 0 0 +EDGE2 2771 2510 -1.0409 0.0385529 1.58175 1 0 1 1 0 0 +EDGE2 2771 2630 -0.995339 0.00556947 -1.57249 1 0 1 1 0 0 +EDGE2 2771 2650 -0.960024 -0.00500457 1.5559 1 0 1 1 0 0 +EDGE2 2771 2670 -1.0215 -0.0454807 1.56058 1 0 1 1 0 0 +EDGE2 2771 2610 -0.965695 -0.0474068 1.53903 1 0 1 1 0 0 +EDGE2 2771 2692 1.00011 -0.0132656 -0.000367904 1 0 1 1 0 0 +EDGE2 2771 2671 0.0656326 -0.0801424 -6.33583e-05 1 0 1 1 0 0 +EDGE2 2771 2691 0.00574884 0.0271202 -0.0521299 1 0 1 1 0 0 +EDGE2 2771 2611 0.00870345 0.020376 -0.0187223 1 0 1 1 0 0 +EDGE2 2771 2612 1.06752 -0.0763488 0.0050325 1 0 1 1 0 0 +EDGE2 2771 2672 0.910095 0.0549098 -0.0196555 1 0 1 1 0 0 +EDGE2 2772 2692 0.0118513 0.0352835 0.00635329 1 0 1 1 0 0 +EDGE2 2772 2671 -1.0436 0.0209401 0.0295532 1 0 1 1 0 0 +EDGE2 2772 2771 -0.986025 -0.0174028 0.00487706 1 0 1 1 0 0 +EDGE2 2772 2691 -1.01941 0.00627972 -0.020341 1 0 1 1 0 0 +EDGE2 2772 2611 -1.0168 -0.0713094 0.00181664 1 0 1 1 0 0 +EDGE2 2772 2612 -0.0678395 0.0639647 0.00814849 1 0 1 1 0 0 +EDGE2 2772 2672 0.0276143 -0.0119188 0.0390237 1 0 1 1 0 0 +EDGE2 2772 2613 1.0597 -0.08307 0.0145123 1 0 1 1 0 0 +EDGE2 2772 2673 1.02194 0.00595382 -0.0175251 1 0 1 1 0 0 +EDGE2 2772 2693 1.00212 -0.0208964 0.0115043 1 0 1 1 0 0 +EDGE2 2773 2692 -0.985719 0.0719659 0.0252444 1 0 1 1 0 0 +EDGE2 2773 2772 -0.967313 -0.110331 -0.00644386 1 0 1 1 0 0 +EDGE2 2773 2612 -1.01823 0.0205951 0.0329743 1 0 1 1 0 0 +EDGE2 2773 2672 -1.0296 0.00948671 -0.0197795 1 0 1 1 0 0 +EDGE2 2773 2613 -0.0188636 0.0441202 0.0326859 1 0 1 1 0 0 +EDGE2 2773 2673 0.0678064 -0.0171847 -0.0130705 1 0 1 1 0 0 +EDGE2 2773 2693 0.0310414 0.0908835 0.00473786 1 0 1 1 0 0 +EDGE2 2773 2674 0.906754 0.0528519 -0.00411969 1 0 1 1 0 0 +EDGE2 2773 2694 1.02843 -0.083429 0.00688741 1 0 1 1 0 0 +EDGE2 2773 2614 1.01382 -0.0022046 -0.0141644 1 0 1 1 0 0 +EDGE2 2774 2773 -1.01179 -0.00235084 -0.0170807 1 0 1 1 0 0 +EDGE2 2774 2613 -0.984209 0.00377656 -0.00600736 1 0 1 1 0 0 +EDGE2 2774 2673 -0.935561 -0.0397016 0.00168 1 0 1 1 0 0 +EDGE2 2774 2693 -1.04317 0.0603541 0.0125987 1 0 1 1 0 0 +EDGE2 2774 2674 0.00199567 -0.0559145 -0.0146383 1 0 1 1 0 0 +EDGE2 2774 2694 -0.0357612 0.0901308 0.00240026 1 0 1 1 0 0 +EDGE2 2774 2614 0.107193 0.043028 0.0044494 1 0 1 1 0 0 +EDGE2 2774 2615 1.03967 -0.00383509 -0.0270093 1 0 1 1 0 0 +EDGE2 2774 2675 0.992029 0.0581579 -0.00988133 1 0 1 1 0 0 +EDGE2 2774 2695 0.962476 -0.0445221 0.018041 1 0 1 1 0 0 +EDGE2 2775 2674 -1.07438 0.0430592 -0.00282978 1 0 1 1 0 0 +EDGE2 2775 2694 -1.05679 -0.0294919 0.0121604 1 0 1 1 0 0 +EDGE2 2775 2774 -1.0223 -0.0478751 0.0394831 1 0 1 1 0 0 +EDGE2 2775 2614 -0.973512 -0.0372927 0.00473448 1 0 1 1 0 0 +EDGE2 2775 2615 0.0221231 -0.0206125 -0.000274821 1 0 1 1 0 0 +EDGE2 2775 2675 -0.0251663 0.0952801 -0.00900028 1 0 1 1 0 0 +EDGE2 2775 2695 0.0111251 -0.0195403 -0.029762 1 0 1 1 0 0 +EDGE2 2775 2676 -0.0168239 0.977122 1.5808 1 0 1 1 0 0 +EDGE2 2775 2696 -0.00334073 1.00458 1.54355 1 0 1 1 0 0 +EDGE2 2775 2616 0.0358895 1.03313 1.56329 1 0 1 1 0 0 +EDGE2 2776 2775 -0.959607 -0.0149197 -1.532 1 0 1 1 0 0 +EDGE2 2776 2615 -0.916893 -0.00427664 -1.569 1 0 1 1 0 0 +EDGE2 2776 2675 -1.02277 0.00582534 -1.58691 1 0 1 1 0 0 +EDGE2 2776 2695 -1.02049 -0.0175 -1.57563 1 0 1 1 0 0 +EDGE2 2776 2677 0.979612 0.0378394 0.0150747 1 0 1 1 0 0 +EDGE2 2776 2697 1.07184 0.00490785 0.0165575 1 0 1 1 0 0 +EDGE2 2776 2676 0.0455628 0.0115243 0.0226692 1 0 1 1 0 0 +EDGE2 2776 2696 0.0353961 -0.00841567 0.00115833 1 0 1 1 0 0 +EDGE2 2776 2616 0.00416153 -0.00406299 -0.0390447 1 0 1 1 0 0 +EDGE2 2776 2617 1.04204 0.0168396 0.0155758 1 0 1 1 0 0 +EDGE2 2777 2677 0.0836123 0.0141255 0.0349771 1 0 1 1 0 0 +EDGE2 2777 2697 -0.0266644 0.040891 0.00226225 1 0 1 1 0 0 +EDGE2 2777 2676 -1.03266 -0.0172852 0.00803429 1 0 1 1 0 0 +EDGE2 2777 2776 -1.01334 -0.0690135 0.00762021 1 0 1 1 0 0 +EDGE2 2777 2696 -0.966292 -0.127233 0.0311971 1 0 1 1 0 0 +EDGE2 2777 2616 -0.939648 -0.0266413 0.0146247 1 0 1 1 0 0 +EDGE2 2777 2698 0.984458 -0.0821199 -0.00277543 1 0 1 1 0 0 +EDGE2 2777 2617 -0.0525035 0.0437848 -0.0118963 1 0 1 1 0 0 +EDGE2 2777 2618 1.10134 0.0716491 -0.0280724 1 0 1 1 0 0 +EDGE2 2777 2678 1.06611 0.0751508 -0.0163455 1 0 1 1 0 0 +EDGE2 2778 2677 -0.943509 0.0197842 0.0129341 1 0 1 1 0 0 +EDGE2 2778 2697 -0.986759 0.0491927 -0.0312605 1 0 1 1 0 0 +EDGE2 2778 2777 -1.00665 -0.0452124 0.015047 1 0 1 1 0 0 +EDGE2 2778 2698 0.0370112 0.0740454 0.0403353 1 0 1 1 0 0 +EDGE2 2778 2617 -0.985855 0.00698641 0.00674448 1 0 1 1 0 0 +EDGE2 2778 2618 -0.00876737 0.0531245 0.000543002 1 0 1 1 0 0 +EDGE2 2778 2678 -0.0499773 -0.0758558 0.0199289 1 0 1 1 0 0 +EDGE2 2778 2699 0.955582 -0.0244498 0.0399518 1 0 1 1 0 0 +EDGE2 2778 2619 1.14152 0.0528825 0.023032 1 0 1 1 0 0 +EDGE2 2778 2679 0.917975 0.0386386 0.00881878 1 0 1 1 0 0 +EDGE2 2779 2698 -1.04123 -0.000966037 0.0321333 1 0 1 1 0 0 +EDGE2 2779 2778 -0.926429 -0.0322808 0.00592622 1 0 1 1 0 0 +EDGE2 2779 2618 -1.05059 -0.00318182 -0.0213636 1 0 1 1 0 0 +EDGE2 2779 2678 -1.03047 -0.017249 -0.0117622 1 0 1 1 0 0 +EDGE2 2779 2699 0.0132155 -0.0857881 0.0293141 1 0 1 1 0 0 +EDGE2 2779 2619 -0.0187599 0.0268334 0.0136895 1 0 1 1 0 0 +EDGE2 2779 2679 0.0941598 -0.0451991 0.0098214 1 0 1 1 0 0 +EDGE2 2779 2760 1.00141 0.0436151 -3.1478 1 0 1 1 0 0 +EDGE2 2779 2620 1.01522 0.0471292 -0.00322323 1 0 1 1 0 0 +EDGE2 2779 2680 1.02131 0.0539217 0.0410505 1 0 1 1 0 0 +EDGE2 2779 2700 1.02282 -0.01015 0.0124414 1 0 1 1 0 0 +EDGE2 2780 2699 -1.07018 -0.0428142 0.00626611 1 0 1 1 0 0 +EDGE2 2780 2779 -0.972385 -0.0042682 0.00438588 1 0 1 1 0 0 +EDGE2 2780 2619 -1.03383 -0.0266284 -0.00635099 1 0 1 1 0 0 +EDGE2 2780 2679 -0.946413 -0.00844737 0.00455789 1 0 1 1 0 0 +EDGE2 2780 2760 -0.00514068 -0.0874457 -3.13097 1 0 1 1 0 0 +EDGE2 2780 2681 0.0405025 0.973235 1.55214 1 0 1 1 0 0 +EDGE2 2780 2761 -0.0819405 0.933524 1.57359 1 0 1 1 0 0 +EDGE2 2780 2621 -0.00525033 1.02171 1.57913 1 0 1 1 0 0 +EDGE2 2780 2620 0.0352951 0.0144349 -0.0108208 1 0 1 1 0 0 +EDGE2 2780 2680 -0.0279009 0.00612596 0.00887163 1 0 1 1 0 0 +EDGE2 2780 2700 0.0370882 -0.0530349 -0.0123401 1 0 1 1 0 0 +EDGE2 2780 2701 -0.0924002 -0.994034 -1.55869 1 0 1 1 0 0 +EDGE2 2780 2759 1.10731 0.0191173 -3.15837 1 0 1 1 0 0 +EDGE2 2781 2760 -1.00804 0.065637 1.5581 1 0 1 1 0 0 +EDGE2 2781 2622 1.00906 0.067913 -0.0244973 1 0 1 1 0 0 +EDGE2 2781 2682 1.0811 -0.0145634 0.0300157 1 0 1 1 0 0 +EDGE2 2781 2762 1.02828 -0.032431 -0.0120137 1 0 1 1 0 0 +EDGE2 2781 2681 0.155667 -0.0600234 -0.00548826 1 0 1 1 0 0 +EDGE2 2781 2761 -0.0303404 0.0117754 0.0111794 1 0 1 1 0 0 +EDGE2 2781 2621 0.0422816 0.0743083 -0.0109318 1 0 1 1 0 0 +EDGE2 2781 2780 -0.931999 -0.0966273 -1.54877 1 0 1 1 0 0 +EDGE2 2781 2620 -0.985408 -0.0340744 -1.55046 1 0 1 1 0 0 +EDGE2 2781 2680 -0.951331 -0.0844175 -1.52897 1 0 1 1 0 0 +EDGE2 2781 2700 -0.969579 0.0464696 -1.58465 1 0 1 1 0 0 +EDGE2 2782 2622 -0.0108373 0.121697 0.00551295 1 0 1 1 0 0 +EDGE2 2782 2683 0.933331 -0.0900296 -0.0133519 1 0 1 1 0 0 +EDGE2 2782 2763 1.02372 -0.0634117 -0.00804635 1 0 1 1 0 0 +EDGE2 2782 2623 1.04256 0.016219 -0.0102004 1 0 1 1 0 0 +EDGE2 2782 2682 0.0368953 -0.081592 0.00872592 1 0 1 1 0 0 +EDGE2 2782 2762 0.00987631 -0.0801009 -0.0211465 1 0 1 1 0 0 +EDGE2 2782 2681 -1.08338 0.0693478 0.00636751 1 0 1 1 0 0 +EDGE2 2782 2761 -0.976435 0.0406731 0.0134363 1 0 1 1 0 0 +EDGE2 2782 2781 -1.04445 -0.00700831 0.0101278 1 0 1 1 0 0 +EDGE2 2782 2621 -0.940837 0.0437257 0.0163924 1 0 1 1 0 0 +EDGE2 2783 2624 1.01024 0.0154103 -0.0099898 1 0 1 1 0 0 +EDGE2 2783 2764 0.994292 -0.0174306 0.0085121 1 0 1 1 0 0 +EDGE2 2783 2684 1.06158 -0.011016 -0.0424622 1 0 1 1 0 0 +EDGE2 2783 2622 -1.00073 0.000709779 0.00960719 1 0 1 1 0 0 +EDGE2 2783 2782 -1.09874 -0.103479 0.00632777 1 0 1 1 0 0 +EDGE2 2783 2683 0.0692092 -0.0554429 0.0226959 1 0 1 1 0 0 +EDGE2 2783 2763 0.0905682 -0.090494 -0.0198023 1 0 1 1 0 0 +EDGE2 2783 2623 0.0781707 -0.000294263 -0.00162125 1 0 1 1 0 0 +EDGE2 2783 2682 -1.0805 -0.0844236 0.00761277 1 0 1 1 0 0 +EDGE2 2783 2762 -1.00536 0.0614883 0.010534 1 0 1 1 0 0 +EDGE2 2784 2624 -0.0137265 -0.0585436 0.0168181 1 0 1 1 0 0 +EDGE2 2784 2685 1.0449 0.0438801 -0.00118306 1 0 1 1 0 0 +EDGE2 2784 2765 0.919127 -0.0622488 -0.0108948 1 0 1 1 0 0 +EDGE2 2784 2764 -0.0309938 -0.0359423 -0.0182171 1 0 1 1 0 0 +EDGE2 2784 2625 0.976219 -0.045659 -0.01083 1 0 1 1 0 0 +EDGE2 2784 2684 0.080752 0.039291 -0.0177445 1 0 1 1 0 0 +EDGE2 2784 2683 -1.09362 -0.02704 0.0132305 1 0 1 1 0 0 +EDGE2 2784 2763 -1.06726 -0.0419958 -0.0208246 1 0 1 1 0 0 +EDGE2 2784 2783 -0.973193 -0.0204756 0.00490548 1 0 1 1 0 0 +EDGE2 2784 2623 -0.982309 -0.0306663 -0.0278804 1 0 1 1 0 0 +EDGE2 2785 2766 0.00632757 0.994383 1.58847 1 0 1 1 0 0 +EDGE2 2785 2686 0.00601071 1.02267 1.55012 1 0 1 1 0 0 +EDGE2 2785 2626 0.0332988 1.07406 1.60904 1 0 1 1 0 0 +EDGE2 2785 2624 -1.00494 0.0253788 0.0162339 1 0 1 1 0 0 +EDGE2 2785 2685 -0.00597987 -0.0213758 0.00488144 1 0 1 1 0 0 +EDGE2 2785 2765 0.0587286 0.0487912 0.0202267 1 0 1 1 0 0 +EDGE2 2785 2764 -1.0717 0.0312648 0.0153787 1 0 1 1 0 0 +EDGE2 2785 2784 -1.0949 0.00835269 0.0244189 1 0 1 1 0 0 +EDGE2 2785 2625 -0.00582269 0.0264668 -0.0171071 1 0 1 1 0 0 +EDGE2 2785 2684 -1.12575 -0.00902482 0.021988 1 0 1 1 0 0 +EDGE2 2786 2685 -0.959487 -0.022635 1.56332 1 0 1 1 0 0 +EDGE2 2786 2785 -1.05936 -0.0123426 1.5773 1 0 1 1 0 0 +EDGE2 2786 2765 -1.0189 0.0448283 1.59436 1 0 1 1 0 0 +EDGE2 2786 2625 -1.0606 0.0366784 1.63206 1 0 1 1 0 0 +EDGE2 2787 2786 -1.12522 0.00614432 0.0180492 1 0 1 1 0 0 +EDGE2 2788 2787 -0.956858 -0.00139296 0.0113545 1 0 1 1 0 0 +EDGE2 2789 2788 -0.954828 -0.00239187 -0.0371977 1 0 1 1 0 0 +EDGE2 2790 2789 -0.989956 0.00105379 0.0318355 1 0 1 1 0 0 +EDGE2 2791 2790 -0.968242 -0.0106604 -1.59395 1 0 1 1 0 0 +EDGE2 2792 2791 -1.04234 -0.0486955 -0.015036 1 0 1 1 0 0 +EDGE2 2793 2792 -0.988311 0.0159998 0.0223343 1 0 1 1 0 0 +EDGE2 2794 2793 -0.922503 0.0519646 -0.00802815 1 0 1 1 0 0 +EDGE2 2795 2794 -1.03584 0.0240813 -0.0070478 1 0 1 1 0 0 +EDGE2 2796 2795 -1.0106 0.0245268 -1.55976 1 0 1 1 0 0 +EDGE2 2797 2796 -1.06482 0.100631 0.0150834 1 0 1 1 0 0 +EDGE2 2798 2797 -0.986145 -0.0526439 0.00333641 1 0 1 1 0 0 +EDGE2 2799 1300 1.01937 0.0888692 -3.12441 1 0 1 1 0 0 +EDGE2 2799 1280 1.02958 -0.00958589 -3.13285 1 0 1 1 0 0 +EDGE2 2799 2798 -0.987343 -0.0530342 0.00631952 1 0 1 1 0 0 +EDGE2 2800 1299 1.01773 0.00644509 -3.15003 1 0 1 1 0 0 +EDGE2 2800 1279 1.00877 -0.0110648 -3.13616 1 0 1 1 0 0 +EDGE2 2800 1281 0.0308786 -1.0732 -1.55248 1 0 1 1 0 0 +EDGE2 2800 1301 -0.0772275 -0.961141 -1.56672 1 0 1 1 0 0 +EDGE2 2800 1300 0.046408 0.0833824 -3.12667 1 0 1 1 0 0 +EDGE2 2800 1280 0.020816 -0.0195207 -3.13615 1 0 1 1 0 0 +EDGE2 2800 2799 -1.00874 -0.0176709 0.0498901 1 0 1 1 0 0 +EDGE2 2801 1300 -1.01957 0.0415979 1.56354 1 0 1 1 0 0 +EDGE2 2801 2800 -1.0587 -0.0248494 -1.57251 1 0 1 1 0 0 +EDGE2 2801 1280 -0.986852 0.0100019 1.55337 1 0 1 1 0 0 +EDGE2 2802 2801 -1.02216 -0.0148139 0.00487422 1 0 1 1 0 0 +EDGE2 2803 2802 -1.0573 -0.0280037 0.0143688 1 0 1 1 0 0 +EDGE2 2804 2803 -0.938685 -0.0897579 -0.0164507 1 0 1 1 0 0 +EDGE2 2804 2685 0.967047 0.000565975 -3.1454 1 0 1 1 0 0 +EDGE2 2804 2785 1.13158 0.0666739 -3.12575 1 0 1 1 0 0 +EDGE2 2804 2765 0.975345 -0.0706265 -3.11351 1 0 1 1 0 0 +EDGE2 2804 2625 0.976595 -0.0285376 -3.16532 1 0 1 1 0 0 +EDGE2 2805 2766 0.00222328 -0.980926 -1.58957 1 0 1 1 0 0 +EDGE2 2805 2686 -0.0364808 -1.01659 -1.62738 1 0 1 1 0 0 +EDGE2 2805 2626 -0.0361344 -0.98515 -1.57163 1 0 1 1 0 0 +EDGE2 2805 2786 -0.0449063 1.04021 1.5547 1 0 1 1 0 0 +EDGE2 2805 2624 0.945744 -0.0642792 -3.14328 1 0 1 1 0 0 +EDGE2 2805 2804 -1.07357 -0.0461174 0.00230119 1 0 1 1 0 0 +EDGE2 2805 2685 0.0165195 -0.0476786 -3.10808 1 0 1 1 0 0 +EDGE2 2805 2785 0.11331 -0.0327447 -3.12829 1 0 1 1 0 0 +EDGE2 2805 2765 0.041322 0.0844448 -3.14818 1 0 1 1 0 0 +EDGE2 2805 2764 0.968496 -0.0296012 -3.17683 1 0 1 1 0 0 +EDGE2 2805 2784 0.964547 0.00824185 -3.11937 1 0 1 1 0 0 +EDGE2 2805 2625 0.0800642 0.0140577 -3.11906 1 0 1 1 0 0 +EDGE2 2805 2684 0.943392 0.0826337 -3.1317 1 0 1 1 0 0 +EDGE2 2806 2786 0.0194916 0.0712921 0.0116862 1 0 1 1 0 0 +EDGE2 2806 2685 -0.978178 -0.0116521 1.55897 1 0 1 1 0 0 +EDGE2 2806 2785 -0.942608 -0.048311 1.5734 1 0 1 1 0 0 +EDGE2 2806 2805 -1.02536 -0.00811961 -1.56799 1 0 1 1 0 0 +EDGE2 2806 2765 -0.985086 0.0157636 1.57368 1 0 1 1 0 0 +EDGE2 2806 2625 -0.973726 0.00206936 1.57922 1 0 1 1 0 0 +EDGE2 2806 2787 0.983643 -0.0379146 -0.00778975 1 0 1 1 0 0 +EDGE2 2807 2786 -0.973588 -0.0527561 0.00596523 1 0 1 1 0 0 +EDGE2 2807 2806 -0.986798 0.0297112 -0.00190994 1 0 1 1 0 0 +EDGE2 2807 2787 0.0265231 0.0827423 0.0182103 1 0 1 1 0 0 +EDGE2 2807 2788 0.988534 0.0100854 -0.0350496 1 0 1 1 0 0 +EDGE2 2808 2787 -1.1126 0.0756324 -0.0150744 1 0 1 1 0 0 +EDGE2 2808 2807 -1.04692 -0.0116845 -0.0230515 1 0 1 1 0 0 +EDGE2 2808 2789 1.03813 0.0681878 0.0419626 1 0 1 1 0 0 +EDGE2 2808 2788 0.00241646 -0.0320125 -0.0370006 1 0 1 1 0 0 +EDGE2 2809 2789 -0.0765336 -0.0525879 0.0153853 1 0 1 1 0 0 +EDGE2 2809 2788 -0.972629 -0.0189847 0.0264176 1 0 1 1 0 0 +EDGE2 2809 2808 -1.0346 -0.0115015 0.0236543 1 0 1 1 0 0 +EDGE2 2809 2790 1.0603 -0.0129159 0.00846642 1 0 1 1 0 0 +EDGE2 2810 2791 0.0156396 1.05536 1.55591 1 0 1 1 0 0 +EDGE2 2810 2789 -1.13149 -0.0171619 -0.00625448 1 0 1 1 0 0 +EDGE2 2810 2809 -0.98304 0.0146401 0.038234 1 0 1 1 0 0 +EDGE2 2810 2790 -0.010991 0.0518996 -0.00752835 1 0 1 1 0 0 +EDGE2 2811 2792 1.03252 -0.0967123 -0.00179046 1 0 1 1 0 0 +EDGE2 2811 2791 0.00226996 0.0869498 -0.0298119 1 0 1 1 0 0 +EDGE2 2811 2810 -0.971688 -0.0105587 -1.56076 1 0 1 1 0 0 +EDGE2 2811 2790 -1.0472 0.0653343 -1.57856 1 0 1 1 0 0 +EDGE2 2812 2793 1.00969 0.0564231 -0.00378223 1 0 1 1 0 0 +EDGE2 2812 2811 -1.03038 -0.0603715 -0.0146096 1 0 1 1 0 0 +EDGE2 2812 2792 -0.0993264 -0.0378051 0.00286155 1 0 1 1 0 0 +EDGE2 2812 2791 -1.03122 0.0159486 0.0157118 1 0 1 1 0 0 +EDGE2 2813 2793 0.0791147 0.035225 -0.0275201 1 0 1 1 0 0 +EDGE2 2813 2794 0.987925 0.00960883 -0.00340542 1 0 1 1 0 0 +EDGE2 2813 2812 -1.0902 0.0301205 0.00398556 1 0 1 1 0 0 +EDGE2 2813 2792 -1.02381 0.0645016 0.00124802 1 0 1 1 0 0 +EDGE2 2814 2793 -1.03116 -0.0332932 0.00714 1 0 1 1 0 0 +EDGE2 2814 2795 1.0251 0.00548812 -0.0211815 1 0 1 1 0 0 +EDGE2 2814 2794 0.0407127 -0.0111813 -0.0060932 1 0 1 1 0 0 +EDGE2 2814 2813 -0.999387 0.0447306 0.00761249 1 0 1 1 0 0 +EDGE2 2815 2796 -0.0140443 1.04744 1.56584 1 0 1 1 0 0 +EDGE2 2815 2814 -0.996667 -0.0704463 -0.00868204 1 0 1 1 0 0 +EDGE2 2815 2795 0.0254222 0.022764 0.0111237 1 0 1 1 0 0 +EDGE2 2815 2794 -1.03368 0.00873382 0.00249583 1 0 1 1 0 0 +EDGE2 2816 2797 0.971451 -0.0470062 0.0115602 1 0 1 1 0 0 +EDGE2 2816 2796 -0.0106332 0.0353605 0.0386631 1 0 1 1 0 0 +EDGE2 2816 2815 -0.95173 -0.0575409 -1.61161 1 0 1 1 0 0 +EDGE2 2816 2795 -1.02192 -0.025512 -1.51622 1 0 1 1 0 0 +EDGE2 2817 2798 0.980542 -0.00164891 0.0129909 1 0 1 1 0 0 +EDGE2 2817 2797 0.0235859 -0.064347 -0.00544989 1 0 1 1 0 0 +EDGE2 2817 2816 -1.15896 0.0408811 0.0111608 1 0 1 1 0 0 +EDGE2 2817 2796 -0.977838 -0.00465296 0.0305079 1 0 1 1 0 0 +EDGE2 2818 2799 0.970759 -0.02878 -0.0213812 1 0 1 1 0 0 +EDGE2 2818 2798 -0.0408233 0.0103008 -0.0223091 1 0 1 1 0 0 +EDGE2 2818 2817 -1.10167 -0.00414552 -0.0210568 1 0 1 1 0 0 +EDGE2 2818 2797 -1.0151 -0.0119805 0.0535751 1 0 1 1 0 0 +EDGE2 2819 1300 1.024 0.0588483 -3.14704 1 0 1 1 0 0 +EDGE2 2819 2800 0.967862 -0.00669551 -0.013687 1 0 1 1 0 0 +EDGE2 2819 1280 0.970291 -0.0498846 -3.1676 1 0 1 1 0 0 +EDGE2 2819 2799 -0.0868461 0.0369316 -0.00517844 1 0 1 1 0 0 +EDGE2 2819 2818 -1.00895 0.0194585 0.036865 1 0 1 1 0 0 +EDGE2 2819 2798 -1.02728 -0.0445335 0.0100199 1 0 1 1 0 0 +EDGE2 2820 1299 1.02285 -0.0133663 -3.16651 1 0 1 1 0 0 +EDGE2 2820 1279 0.932935 0.066972 -3.12761 1 0 1 1 0 0 +EDGE2 2820 1281 -0.00420482 -1.03246 -1.57747 1 0 1 1 0 0 +EDGE2 2820 1301 0.0350679 -0.971199 -1.58816 1 0 1 1 0 0 +EDGE2 2820 1300 0.0280645 -0.0268533 -3.13172 1 0 1 1 0 0 +EDGE2 2820 2800 0.0290801 0.0776731 -0.00409963 1 0 1 1 0 0 +EDGE2 2820 1280 -0.035593 -0.0554762 -3.12539 1 0 1 1 0 0 +EDGE2 2820 2801 -0.053271 1.0652 1.56683 1 0 1 1 0 0 +EDGE2 2820 2819 -1.02786 0.0290009 -0.0100626 1 0 1 1 0 0 +EDGE2 2820 2799 -1.05034 -0.0182355 -0.00947452 1 0 1 1 0 0 +EDGE2 2821 1302 1.06897 0.0486729 -0.0286083 1 0 1 1 0 0 +EDGE2 2821 1282 0.990185 0.018248 0.00266276 1 0 1 1 0 0 +EDGE2 2821 1281 0.0343587 0.112719 0.0203033 1 0 1 1 0 0 +EDGE2 2821 1301 0.0493573 0.0586668 -0.0136044 1 0 1 1 0 0 +EDGE2 2821 1300 -1.06811 0.0181912 -1.57417 1 0 1 1 0 0 +EDGE2 2821 2800 -0.963888 0.0395664 1.57997 1 0 1 1 0 0 +EDGE2 2821 2820 -0.992015 -0.0559641 1.56409 1 0 1 1 0 0 +EDGE2 2821 1280 -0.966633 -0.0136068 -1.6027 1 0 1 1 0 0 +EDGE2 2822 1303 0.979896 -0.0287452 0.0246216 1 0 1 1 0 0 +EDGE2 2822 2821 -1.02171 0.0626856 -0.00551702 1 0 1 1 0 0 +EDGE2 2822 1302 -0.0219489 0.0174325 0.0165887 1 0 1 1 0 0 +EDGE2 2822 1283 0.965355 0.00480025 -0.0166345 1 0 1 1 0 0 +EDGE2 2822 1282 -0.0294409 -0.00355655 0.0119332 1 0 1 1 0 0 +EDGE2 2822 1281 -0.931507 -0.0107374 0.0117279 1 0 1 1 0 0 +EDGE2 2822 1301 -1.08669 0.0560521 -0.00589422 1 0 1 1 0 0 +EDGE2 2823 1303 -0.0298163 0.0169877 -0.0021899 1 0 1 1 0 0 +EDGE2 2823 1304 0.945635 0.00429239 0.000281203 1 0 1 1 0 0 +EDGE2 2823 1284 0.964942 -0.0472179 0.00809678 1 0 1 1 0 0 +EDGE2 2823 1302 -1.04651 0.00713451 -0.0410283 1 0 1 1 0 0 +EDGE2 2823 2822 -0.995238 -0.0604567 -0.0102938 1 0 1 1 0 0 +EDGE2 2823 1283 0.0303871 -0.0919001 0.00160703 1 0 1 1 0 0 +EDGE2 2823 1282 -1.00454 0.00539776 0.0317914 1 0 1 1 0 0 +EDGE2 2824 1303 -0.960673 -0.0814094 0.0148675 1 0 1 1 0 0 +EDGE2 2824 1304 0.0122505 -0.00503596 -0.019187 1 0 1 1 0 0 +EDGE2 2824 1625 1.07036 0.00310323 -3.14083 1 0 1 1 0 0 +EDGE2 2824 1285 1.06716 0.120517 -0.0259876 1 0 1 1 0 0 +EDGE2 2824 1305 1.06294 0.10326 0.0169756 1 0 1 1 0 0 +EDGE2 2824 1605 1.079 -0.0196549 -3.12504 1 0 1 1 0 0 +EDGE2 2824 1284 0.0300886 -0.0646803 0.00563235 1 0 1 1 0 0 +EDGE2 2824 2823 -1.01213 0.010337 8.97944e-05 1 0 1 1 0 0 +EDGE2 2824 1283 -1.00159 0.0377164 0.0486856 1 0 1 1 0 0 +EDGE2 2825 1624 0.973715 0.0617558 -3.17864 1 0 1 1 0 0 +EDGE2 2825 1604 1.00121 0.054293 -3.18183 1 0 1 1 0 0 +EDGE2 2825 1304 -1.0442 0.0177861 -0.0286937 1 0 1 1 0 0 +EDGE2 2825 1625 0.0644052 0.0882818 -3.09707 1 0 1 1 0 0 +EDGE2 2825 1286 0.0452224 0.980209 1.59762 1 0 1 1 0 0 +EDGE2 2825 1285 0.115766 0.0963471 -0.00699495 1 0 1 1 0 0 +EDGE2 2825 1305 0.00280643 0.0585314 -0.0395007 1 0 1 1 0 0 +EDGE2 2825 1605 0.0718736 0.0633394 -3.13829 1 0 1 1 0 0 +EDGE2 2825 2824 -0.977665 -0.0259509 -0.035091 1 0 1 1 0 0 +EDGE2 2825 1284 -0.998912 0.0483703 -0.0150611 1 0 1 1 0 0 +EDGE2 2825 1606 -0.00725248 -1.0637 -1.59751 1 0 1 1 0 0 +EDGE2 2825 1626 -0.0113564 -1.01644 -1.58465 1 0 1 1 0 0 +EDGE2 2825 1306 -0.101164 -1.04267 -1.57502 1 0 1 1 0 0 +EDGE2 2826 1287 1.0287 -0.0362655 -0.02093 1 0 1 1 0 0 +EDGE2 2826 1625 -0.998147 0.00980382 1.60974 1 0 1 1 0 0 +EDGE2 2826 1286 0.06016 -0.0607284 0.00691999 1 0 1 1 0 0 +EDGE2 2826 2825 -1.10769 -0.0454288 -1.52642 1 0 1 1 0 0 +EDGE2 2826 1285 -1.01424 0.0591398 -1.59453 1 0 1 1 0 0 +EDGE2 2826 1305 -0.958194 -0.0210184 -1.56624 1 0 1 1 0 0 +EDGE2 2826 1605 -1.08049 0.0347551 1.5714 1 0 1 1 0 0 +EDGE2 2827 1288 0.976255 -0.0165633 0.00215707 1 0 1 1 0 0 +EDGE2 2827 1287 -0.028419 -0.0672955 -0.00211978 1 0 1 1 0 0 +EDGE2 2827 1286 -0.94706 -0.000376264 -0.0111466 1 0 1 1 0 0 +EDGE2 2827 2826 -0.950439 -0.0875314 -0.0184378 1 0 1 1 0 0 +EDGE2 2828 1289 0.961271 -0.0385672 0.0176248 1 0 1 1 0 0 +EDGE2 2828 1288 0.00986845 0.0375562 -0.00297155 1 0 1 1 0 0 +EDGE2 2828 1287 -1.02825 -0.0255258 0.0273557 1 0 1 1 0 0 +EDGE2 2828 2827 -0.900606 0.0085421 -0.00777254 1 0 1 1 0 0 +EDGE2 2829 1590 0.99848 -0.0395181 -3.14443 1 0 1 1 0 0 +EDGE2 2829 2310 1.13606 0.0339345 -3.15224 1 0 1 1 0 0 +EDGE2 2829 2390 1.02522 -0.00165136 -3.13221 1 0 1 1 0 0 +EDGE2 2829 1850 0.977412 0.0360079 -3.11709 1 0 1 1 0 0 +EDGE2 2829 1270 0.967871 0.0170951 -3.14456 1 0 1 1 0 0 +EDGE2 2829 1290 0.864771 -0.0345203 0.00616769 1 0 1 1 0 0 +EDGE2 2829 1570 1.04825 -0.00145551 -3.12699 1 0 1 1 0 0 +EDGE2 2829 1289 0.0356631 0.053873 0.0224921 1 0 1 1 0 0 +EDGE2 2829 1288 -0.996728 0.00518812 -0.00197289 1 0 1 1 0 0 +EDGE2 2829 2828 -0.929105 -0.0354533 -8.80073e-05 1 0 1 1 0 0 +EDGE2 2830 1851 -0.0192535 -0.955396 -1.55478 1 0 1 1 0 0 +EDGE2 2830 2391 0.0490733 -1.02499 -1.56953 1 0 1 1 0 0 +EDGE2 2830 2311 -0.0841351 -1.00986 -1.53583 1 0 1 1 0 0 +EDGE2 2830 1571 0.00550474 -0.913355 -1.60922 1 0 1 1 0 0 +EDGE2 2830 1591 -0.00300042 -1.01311 -1.54026 1 0 1 1 0 0 +EDGE2 2830 1849 1.00588 0.0326601 -3.14504 1 0 1 1 0 0 +EDGE2 2830 2389 0.938724 -0.0613432 -3.16122 1 0 1 1 0 0 +EDGE2 2830 2309 0.932591 0.0512336 -3.15339 1 0 1 1 0 0 +EDGE2 2830 1569 1.03928 -0.0136395 -3.15038 1 0 1 1 0 0 +EDGE2 2830 1589 0.99321 -0.0830474 -3.17728 1 0 1 1 0 0 +EDGE2 2830 1269 1.02709 0.0877105 -3.12796 1 0 1 1 0 0 +EDGE2 2830 1291 0.0151374 0.988245 1.57241 1 0 1 1 0 0 +EDGE2 2830 1590 0.00785334 0.048134 -3.15102 1 0 1 1 0 0 +EDGE2 2830 2310 -0.0607431 0.0419293 -3.1158 1 0 1 1 0 0 +EDGE2 2830 2390 0.00737705 0.027478 -3.12051 1 0 1 1 0 0 +EDGE2 2830 1850 0.0287235 -0.0413362 -3.09909 1 0 1 1 0 0 +EDGE2 2830 1270 0.0679497 0.0445319 -3.14764 1 0 1 1 0 0 +EDGE2 2830 1290 -0.0037485 0.00863564 -0.0229895 1 0 1 1 0 0 +EDGE2 2830 1570 0.0156291 0.0104503 -3.14563 1 0 1 1 0 0 +EDGE2 2830 1271 -0.018484 0.946911 1.56473 1 0 1 1 0 0 +EDGE2 2830 2829 -1.04999 -0.0906491 -0.00363806 1 0 1 1 0 0 +EDGE2 2830 1289 -1.0338 0.0726339 -0.0104857 1 0 1 1 0 0 +EDGE2 2831 1291 0.114652 -0.0444557 -0.0230273 1 0 1 1 0 0 +EDGE2 2831 1590 -1.0079 -0.0459891 1.60087 1 0 1 1 0 0 +EDGE2 2831 2310 -0.989912 -0.0670097 1.55864 1 0 1 1 0 0 +EDGE2 2831 2390 -1.02568 -0.0276863 1.57834 1 0 1 1 0 0 +EDGE2 2831 2830 -1.00561 -0.105427 -1.58713 1 0 1 1 0 0 +EDGE2 2831 1850 -0.988322 -0.01665 1.49831 1 0 1 1 0 0 +EDGE2 2831 1270 -1.01949 0.0204079 1.53235 1 0 1 1 0 0 +EDGE2 2831 1290 -1.015 -0.0235834 -1.60493 1 0 1 1 0 0 +EDGE2 2831 1570 -1.03625 0.00208714 1.58609 1 0 1 1 0 0 +EDGE2 2831 1292 1.01518 0.0638538 0.00928326 1 0 1 1 0 0 +EDGE2 2831 1271 0.0546575 0.0370674 0.0216593 1 0 1 1 0 0 +EDGE2 2831 1272 0.966953 0.0140845 -0.00184085 1 0 1 1 0 0 +EDGE2 2832 1273 0.994689 0.0299127 -0.0293707 1 0 1 1 0 0 +EDGE2 2832 1291 -0.923234 0.034291 -0.0108837 1 0 1 1 0 0 +EDGE2 2832 2831 -1.0424 0.0297918 -0.0232226 1 0 1 1 0 0 +EDGE2 2832 1292 -0.0319078 0.0134707 0.0371073 1 0 1 1 0 0 +EDGE2 2832 1271 -1.03995 0.0289763 0.0055259 1 0 1 1 0 0 +EDGE2 2832 1272 0.0200891 0.0480849 -0.00186849 1 0 1 1 0 0 +EDGE2 2832 1293 1.06139 -0.0187284 -0.0229717 1 0 1 1 0 0 +EDGE2 2833 1273 -0.0291082 -0.00625823 0.00924995 1 0 1 1 0 0 +EDGE2 2833 1292 -1.01824 0.0493811 -0.0150702 1 0 1 1 0 0 +EDGE2 2833 2832 -1.01641 -0.00863825 0.0182257 1 0 1 1 0 0 +EDGE2 2833 1272 -0.961438 -0.0649219 -0.0154153 1 0 1 1 0 0 +EDGE2 2833 1293 -0.0520062 -0.0604512 -0.0243416 1 0 1 1 0 0 +EDGE2 2833 1274 1.00052 -0.0480384 -0.0268794 1 0 1 1 0 0 +EDGE2 2833 1294 1.01754 -0.0396792 0.0113658 1 0 1 1 0 0 +EDGE2 2834 1273 -1.0301 0.0420643 -0.0184181 1 0 1 1 0 0 +EDGE2 2834 2833 -1.01285 0.0187695 -0.0137207 1 0 1 1 0 0 +EDGE2 2834 1293 -0.974766 -0.00130584 -0.0147503 1 0 1 1 0 0 +EDGE2 2834 2655 1.01163 0.00762259 -3.16523 1 0 1 1 0 0 +EDGE2 2834 1274 -0.0023453 -0.00517344 0.0181371 1 0 1 1 0 0 +EDGE2 2834 1294 -0.0710241 -0.00977861 -0.000726 1 0 1 1 0 0 +EDGE2 2834 1295 1.11726 0.0638031 -0.0083076 1 0 1 1 0 0 +EDGE2 2834 2515 1.00737 0.00476765 -3.1639 1 0 1 1 0 0 +EDGE2 2834 2635 0.953507 -0.0346866 -3.11035 1 0 1 1 0 0 +EDGE2 2834 1275 0.976295 -0.017286 -0.0175734 1 0 1 1 0 0 +EDGE2 2835 2656 0.0383384 -1.04624 -1.57142 1 0 1 1 0 0 +EDGE2 2835 2516 -0.112825 -1.01407 -1.55578 1 0 1 1 0 0 +EDGE2 2835 2636 0.0197902 -0.97886 -1.58752 1 0 1 1 0 0 +EDGE2 2835 2654 0.977091 0.0140951 -3.14062 1 0 1 1 0 0 +EDGE2 2835 2655 0.0242939 -0.0399521 -3.16032 1 0 1 1 0 0 +EDGE2 2835 1274 -1.03204 0.0345293 -0.0412247 1 0 1 1 0 0 +EDGE2 2835 1294 -1.04056 0.0371442 -0.0018641 1 0 1 1 0 0 +EDGE2 2835 2834 -1.01016 0.0381033 -0.00292897 1 0 1 1 0 0 +EDGE2 2835 1295 -0.00823118 0.0468445 0.0247078 1 0 1 1 0 0 +EDGE2 2835 2515 0.0686395 -0.00485516 -3.13775 1 0 1 1 0 0 +EDGE2 2835 2635 -0.0863847 0.053988 -3.1293 1 0 1 1 0 0 +EDGE2 2835 1275 -0.0304143 -0.00972633 0.02163 1 0 1 1 0 0 +EDGE2 2835 2514 0.925525 0.0477246 -3.0899 1 0 1 1 0 0 +EDGE2 2835 2634 1.06364 -0.041801 -3.1684 1 0 1 1 0 0 +EDGE2 2835 1296 0.0325471 0.946343 1.54837 1 0 1 1 0 0 +EDGE2 2835 1276 0.0223148 0.930417 1.56163 1 0 1 1 0 0 +EDGE2 2836 2655 -0.953284 -0.0118867 1.59745 1 0 1 1 0 0 +EDGE2 2836 2835 -1.00663 0.0713141 -1.57462 1 0 1 1 0 0 +EDGE2 2836 1295 -0.934528 -0.0069394 -1.56081 1 0 1 1 0 0 +EDGE2 2836 2515 -1.03681 -0.0408289 1.57128 1 0 1 1 0 0 +EDGE2 2836 2635 -0.98938 0.0191158 1.5564 1 0 1 1 0 0 +EDGE2 2836 1275 -0.98626 -0.0660922 -1.55465 1 0 1 1 0 0 +EDGE2 2836 1296 0.0559013 -0.0480257 0.0089802 1 0 1 1 0 0 +EDGE2 2836 1276 -0.0648737 0.0951238 0.00132109 1 0 1 1 0 0 +EDGE2 2836 1277 0.979547 -0.00876985 -0.0119669 1 0 1 1 0 0 +EDGE2 2836 1297 0.990429 0.0809015 -0.0249183 1 0 1 1 0 0 +EDGE2 2837 1296 -0.966632 0.0547931 0.0146748 1 0 1 1 0 0 +EDGE2 2837 2836 -0.994408 -0.0919898 0.00574937 1 0 1 1 0 0 +EDGE2 2837 1276 -0.967717 -0.0413782 -0.00941105 1 0 1 1 0 0 +EDGE2 2837 1278 0.991007 -0.134422 -0.00967933 1 0 1 1 0 0 +EDGE2 2837 1277 0.00211539 0.107747 0.0394956 1 0 1 1 0 0 +EDGE2 2837 1297 -0.0273097 0.0111661 -0.00362304 1 0 1 1 0 0 +EDGE2 2837 1298 0.855795 0.0446835 -0.000446626 1 0 1 1 0 0 +EDGE2 2838 1278 0.0184174 -0.0178362 -0.00381503 1 0 1 1 0 0 +EDGE2 2838 1277 -0.989267 0.0262251 0.00821645 1 0 1 1 0 0 +EDGE2 2838 2837 -1.05366 -0.0227475 6.69512e-05 1 0 1 1 0 0 +EDGE2 2838 1297 -1.04809 0.00530672 0.0208826 1 0 1 1 0 0 +EDGE2 2838 1298 0.064953 0.103286 -0.0129071 1 0 1 1 0 0 +EDGE2 2838 1299 1.01429 -0.0347714 0.00912789 1 0 1 1 0 0 +EDGE2 2838 1279 1.05469 0.0231602 0.0167407 1 0 1 1 0 0 +EDGE2 2839 1278 -1.06063 -0.00317138 0.00287025 1 0 1 1 0 0 +EDGE2 2839 2838 -1.06826 0.0360315 0.0160661 1 0 1 1 0 0 +EDGE2 2839 1298 -0.995452 0.037306 -0.00026678 1 0 1 1 0 0 +EDGE2 2839 1299 0.04831 -0.00847778 -0.00438891 1 0 1 1 0 0 +EDGE2 2839 1279 -0.0154656 -0.0063663 -0.0044628 1 0 1 1 0 0 +EDGE2 2839 1300 1.00212 -0.0137403 -0.0052965 1 0 1 1 0 0 +EDGE2 2839 2800 0.989002 -0.0310054 -3.10568 1 0 1 1 0 0 +EDGE2 2839 2820 0.989699 -0.0586248 -3.12846 1 0 1 1 0 0 +EDGE2 2839 1280 1.04809 0.0510639 -0.0348916 1 0 1 1 0 0 +EDGE2 2840 1299 -1.0073 -0.104079 0.0308407 1 0 1 1 0 0 +EDGE2 2840 2839 -0.965247 -0.0762147 -0.0545231 1 0 1 1 0 0 +EDGE2 2840 1279 -1.02674 0.0357673 -0.0155811 1 0 1 1 0 0 +EDGE2 2840 2821 0.0772224 0.981956 1.5526 1 0 1 1 0 0 +EDGE2 2840 1281 -0.0709159 0.970105 1.56466 1 0 1 1 0 0 +EDGE2 2840 1301 -0.00335393 0.962779 1.5832 1 0 1 1 0 0 +EDGE2 2840 1300 0.0518565 0.0216668 -0.0103209 1 0 1 1 0 0 +EDGE2 2840 2800 -0.105333 0.00866279 -3.16492 1 0 1 1 0 0 +EDGE2 2840 2820 0.0196938 0.0136321 -3.15215 1 0 1 1 0 0 +EDGE2 2840 1280 -0.0667894 0.0754592 -0.0140731 1 0 1 1 0 0 +EDGE2 2840 2801 -0.0531247 -0.954562 -1.60182 1 0 1 1 0 0 +EDGE2 2840 2819 1.01031 0.0163605 -3.09839 1 0 1 1 0 0 +EDGE2 2840 2799 1.01476 -0.056085 -3.15323 1 0 1 1 0 0 +EDGE2 2841 2840 -0.883524 -0.0173759 1.57473 1 0 1 1 0 0 +EDGE2 2841 1300 -1.03801 0.153595 1.58929 1 0 1 1 0 0 +EDGE2 2841 2800 -1.00115 -0.0693325 -1.5793 1 0 1 1 0 0 +EDGE2 2841 2820 -0.968588 -0.0421228 -1.56908 1 0 1 1 0 0 +EDGE2 2841 1280 -0.917558 0.0489813 1.58846 1 0 1 1 0 0 +EDGE2 2841 2801 -0.000534455 -0.0225782 0.0102175 1 0 1 1 0 0 +EDGE2 2841 2802 1.03623 -0.0900481 0.0254544 1 0 1 1 0 0 +EDGE2 2842 2801 -0.982325 -0.0503502 -0.00219833 1 0 1 1 0 0 +EDGE2 2842 2841 -1.09214 0.0241641 -0.0306792 1 0 1 1 0 0 +EDGE2 2842 2802 0.0158192 0.0165444 0.00893468 1 0 1 1 0 0 +EDGE2 2842 2803 1.01829 0.00390547 0.00425413 1 0 1 1 0 0 +EDGE2 2843 2802 -1.0288 -0.0304982 0.0195658 1 0 1 1 0 0 +EDGE2 2843 2842 -1.02753 0.0329787 -0.0234083 1 0 1 1 0 0 +EDGE2 2843 2803 -0.0700358 0.00186748 0.0020847 1 0 1 1 0 0 +EDGE2 2843 2804 1.1106 -0.068213 -0.0282589 1 0 1 1 0 0 +EDGE2 2844 2843 -0.956792 -0.115708 0.00594907 1 0 1 1 0 0 +EDGE2 2844 2803 -0.867869 0.0649713 0.0132664 1 0 1 1 0 0 +EDGE2 2844 2804 0.0371666 -0.0240386 -0.00583084 1 0 1 1 0 0 +EDGE2 2844 2685 1.04533 -0.0172587 -3.13878 1 0 1 1 0 0 +EDGE2 2844 2785 0.997262 0.037117 -3.12939 1 0 1 1 0 0 +EDGE2 2844 2805 1.01141 0.0538475 -0.0181419 1 0 1 1 0 0 +EDGE2 2844 2765 1.02171 0.0179583 -3.14927 1 0 1 1 0 0 +EDGE2 2844 2625 0.942086 0.0261664 -3.13082 1 0 1 1 0 0 +EDGE2 2845 2766 0.0382481 -0.970337 -1.57212 1 0 1 1 0 0 +EDGE2 2845 2686 0.0556964 -1.04119 -1.55145 1 0 1 1 0 0 +EDGE2 2845 2626 0.0549265 -0.930828 -1.61656 1 0 1 1 0 0 +EDGE2 2845 2786 -0.0272409 1.02209 1.56823 1 0 1 1 0 0 +EDGE2 2845 2624 1.03224 0.0401061 -3.13569 1 0 1 1 0 0 +EDGE2 2845 2804 -1.05485 0.00176681 0.0156305 1 0 1 1 0 0 +EDGE2 2845 2844 -1.0162 -0.109557 0.00962174 1 0 1 1 0 0 +EDGE2 2845 2685 -0.0703299 -0.0818503 -3.1638 1 0 1 1 0 0 +EDGE2 2845 2785 0.00478719 -0.0179465 -3.16114 1 0 1 1 0 0 +EDGE2 2845 2805 0.0830927 0.100152 -0.00518948 1 0 1 1 0 0 +EDGE2 2845 2765 0.0262282 0.0099625 -3.13506 1 0 1 1 0 0 +EDGE2 2845 2764 0.950922 -0.020865 -3.11569 1 0 1 1 0 0 +EDGE2 2845 2784 0.932995 0.0340866 -3.19248 1 0 1 1 0 0 +EDGE2 2845 2625 -0.0120895 0.049963 -3.11964 1 0 1 1 0 0 +EDGE2 2845 2684 1.01839 0.087205 -3.12619 1 0 1 1 0 0 +EDGE2 2845 2806 -0.00847292 0.948723 1.57759 1 0 1 1 0 0 +EDGE2 2846 2766 -0.0960842 -0.0429074 0.00652834 1 0 1 1 0 0 +EDGE2 2846 2687 0.993802 -0.0966122 -0.00504184 1 0 1 1 0 0 +EDGE2 2846 2767 1.00289 0.0560324 0.000476655 1 0 1 1 0 0 +EDGE2 2846 2627 0.995222 0.00378301 0.0163011 1 0 1 1 0 0 +EDGE2 2846 2686 0.0465703 0.0597643 -0.00336766 1 0 1 1 0 0 +EDGE2 2846 2626 -0.00573585 0.0423401 -0.0211436 1 0 1 1 0 0 +EDGE2 2846 2685 -1.02021 -0.02006 -1.55587 1 0 1 1 0 0 +EDGE2 2846 2785 -0.996404 0.0447512 -1.58681 1 0 1 1 0 0 +EDGE2 2846 2805 -1.01436 -0.117092 1.58173 1 0 1 1 0 0 +EDGE2 2846 2845 -1.01945 0.0323423 1.57521 1 0 1 1 0 0 +EDGE2 2846 2765 -0.952443 0.0255662 -1.5642 1 0 1 1 0 0 +EDGE2 2846 2625 -0.973944 -0.0360233 -1.61173 1 0 1 1 0 0 +EDGE2 2847 2766 -0.988621 -0.0528349 -0.0068931 1 0 1 1 0 0 +EDGE2 2847 2687 0.0533852 0.0535859 -0.0283645 1 0 1 1 0 0 +EDGE2 2847 2688 0.932913 0.00515003 -0.0218576 1 0 1 1 0 0 +EDGE2 2847 2768 1.02161 0.0467785 -0.0122768 1 0 1 1 0 0 +EDGE2 2847 2628 1.0374 -0.00450042 -0.0117363 1 0 1 1 0 0 +EDGE2 2847 2767 0.0976207 0.0228053 -0.00709075 1 0 1 1 0 0 +EDGE2 2847 2627 0.039148 0.0478945 0.015361 1 0 1 1 0 0 +EDGE2 2847 2846 -1.07051 0.033344 -0.00551012 1 0 1 1 0 0 +EDGE2 2847 2686 -1.014 -0.0221337 -0.000457709 1 0 1 1 0 0 +EDGE2 2847 2626 -0.994678 -0.0129918 -0.0135898 1 0 1 1 0 0 +EDGE2 2848 2689 0.970903 -0.0201117 -0.0337381 1 0 1 1 0 0 +EDGE2 2848 2769 0.95698 0.0212125 -0.0332056 1 0 1 1 0 0 +EDGE2 2848 2687 -1.05035 0.0141227 -0.00628359 1 0 1 1 0 0 +EDGE2 2848 2688 -0.0252069 -0.0664204 -0.0344163 1 0 1 1 0 0 +EDGE2 2848 2629 0.961668 -0.0154774 -0.00392402 1 0 1 1 0 0 +EDGE2 2848 2768 0.113265 0.0168052 0.0297695 1 0 1 1 0 0 +EDGE2 2848 2847 -0.995566 0.0357688 -0.0148838 1 0 1 1 0 0 +EDGE2 2848 2628 0.0463208 -0.0617772 -0.038797 1 0 1 1 0 0 +EDGE2 2848 2767 -1.07338 0.0345872 0.00697613 1 0 1 1 0 0 +EDGE2 2848 2627 -1.03432 -0.0370354 -0.00264011 1 0 1 1 0 0 +EDGE2 2849 2689 0.0134264 -0.0316779 0.0173882 1 0 1 1 0 0 +EDGE2 2849 2690 1.06027 -0.0155597 0.00155137 1 0 1 1 0 0 +EDGE2 2849 2770 0.999564 -0.080865 -0.0303907 1 0 1 1 0 0 +EDGE2 2849 2510 0.919969 0.0532817 -3.12182 1 0 1 1 0 0 +EDGE2 2849 2630 1.09543 0.00883367 -0.00557015 1 0 1 1 0 0 +EDGE2 2849 2650 1.02402 -0.0175468 -3.14056 1 0 1 1 0 0 +EDGE2 2849 2670 0.96039 0.092913 -3.13416 1 0 1 1 0 0 +EDGE2 2849 2610 0.895534 -0.00988631 -3.12867 1 0 1 1 0 0 +EDGE2 2849 2769 0.0408942 0.00370776 -0.0270954 1 0 1 1 0 0 +EDGE2 2849 2688 -0.905231 -0.0203801 0.00941922 1 0 1 1 0 0 +EDGE2 2849 2848 -0.962611 0.000962739 -0.0143794 1 0 1 1 0 0 +EDGE2 2849 2629 -0.0240166 0.00114038 -0.0103978 1 0 1 1 0 0 +EDGE2 2849 2768 -1.01217 0.123301 0.00419422 1 0 1 1 0 0 +EDGE2 2849 2628 -1.00583 -0.0410726 -0.016045 1 0 1 1 0 0 +EDGE2 2850 2609 1.08897 -0.0672213 -3.13529 1 0 1 1 0 0 +EDGE2 2850 2649 0.956465 -0.00622276 -3.15007 1 0 1 1 0 0 +EDGE2 2850 2669 0.959387 -0.0883403 -3.14142 1 0 1 1 0 0 +EDGE2 2850 2509 1.04788 -0.0361465 -3.15468 1 0 1 1 0 0 +EDGE2 2850 2689 -1.02277 -0.0233844 -0.016657 1 0 1 1 0 0 +EDGE2 2850 2631 -0.0161368 -0.952407 -1.54408 1 0 1 1 0 0 +EDGE2 2850 2651 0.0231123 -0.883732 -1.55742 1 0 1 1 0 0 +EDGE2 2850 2690 0.108133 -0.0057512 -0.00505408 1 0 1 1 0 0 +EDGE2 2850 2511 0.0306515 -0.93281 -1.53788 1 0 1 1 0 0 +EDGE2 2850 2770 -0.0115244 0.0407992 0.00812034 1 0 1 1 0 0 +EDGE2 2850 2510 0.0382321 -0.0747184 -3.15451 1 0 1 1 0 0 +EDGE2 2850 2630 -0.108935 0.0345586 0.0305163 1 0 1 1 0 0 +EDGE2 2850 2650 0.00360889 -0.0323584 -3.1089 1 0 1 1 0 0 +EDGE2 2850 2670 -0.0291842 0.0531027 -3.10578 1 0 1 1 0 0 +EDGE2 2850 2610 -0.142689 0.093655 -3.1431 1 0 1 1 0 0 +EDGE2 2850 2849 -1.02861 0.0367764 -0.0234608 1 0 1 1 0 0 +EDGE2 2850 2769 -0.942675 0.0317648 0.00952884 1 0 1 1 0 0 +EDGE2 2850 2629 -1.02992 0.0823281 -0.00723602 1 0 1 1 0 0 +EDGE2 2850 2671 -0.00324098 0.970859 1.5605 1 0 1 1 0 0 +EDGE2 2850 2771 -0.013741 1.01511 1.5799 1 0 1 1 0 0 +EDGE2 2850 2691 0.102581 1.07773 1.57752 1 0 1 1 0 0 +EDGE2 2850 2611 0.0216389 1.12416 1.56263 1 0 1 1 0 0 +EDGE2 2851 2690 -1.04832 0.0882682 -1.56211 1 0 1 1 0 0 +EDGE2 2851 2850 -1.0385 0.0657439 -1.56966 1 0 1 1 0 0 +EDGE2 2851 2770 -1.03092 -0.0663615 -1.59067 1 0 1 1 0 0 +EDGE2 2851 2510 -1.01909 0.0536607 1.55669 1 0 1 1 0 0 +EDGE2 2851 2630 -1.01318 0.00780296 -1.54842 1 0 1 1 0 0 +EDGE2 2851 2650 -1.06076 -0.0141099 1.60915 1 0 1 1 0 0 +EDGE2 2851 2670 -1.07281 0.0536207 1.53593 1 0 1 1 0 0 +EDGE2 2851 2610 -1.02393 0.060753 1.56069 1 0 1 1 0 0 +EDGE2 2851 2692 0.978667 0.0432758 -0.00233952 1 0 1 1 0 0 +EDGE2 2851 2671 0.00443256 0.00795467 0.00418906 1 0 1 1 0 0 +EDGE2 2851 2771 0.0407678 -0.0453809 -0.0322678 1 0 1 1 0 0 +EDGE2 2851 2691 0.181013 0.0255853 0.00310176 1 0 1 1 0 0 +EDGE2 2851 2611 0.0765326 0.075096 0.0292945 1 0 1 1 0 0 +EDGE2 2851 2772 1.01706 -0.0161142 -0.000337895 1 0 1 1 0 0 +EDGE2 2851 2612 0.952006 0.0511786 -0.0181889 1 0 1 1 0 0 +EDGE2 2851 2672 0.961949 0.0473056 -0.00729855 1 0 1 1 0 0 +EDGE2 2852 2692 -0.0208105 -0.104816 -0.00239991 1 0 1 1 0 0 +EDGE2 2852 2671 -1.13992 -0.0758357 0.00115456 1 0 1 1 0 0 +EDGE2 2852 2771 -1.0271 -0.0553122 0.0149759 1 0 1 1 0 0 +EDGE2 2852 2851 -1.02363 -0.0134627 0.00122331 1 0 1 1 0 0 +EDGE2 2852 2691 -0.943005 0.0181757 0.00870401 1 0 1 1 0 0 +EDGE2 2852 2611 -1.04056 0.0529983 0.0321858 1 0 1 1 0 0 +EDGE2 2852 2772 -0.0427825 0.0823607 -0.028458 1 0 1 1 0 0 +EDGE2 2852 2773 1.05777 -0.0482256 -0.00753336 1 0 1 1 0 0 +EDGE2 2852 2612 -0.0247089 0.0173968 -0.0284019 1 0 1 1 0 0 +EDGE2 2852 2672 -0.0324758 -0.12377 0.0223847 1 0 1 1 0 0 +EDGE2 2852 2613 0.937694 0.0430537 0.0198729 1 0 1 1 0 0 +EDGE2 2852 2673 1.01495 0.00365511 -0.0444131 1 0 1 1 0 0 +EDGE2 2852 2693 1.00209 0.0496102 -0.020907 1 0 1 1 0 0 +EDGE2 2853 2692 -0.965528 -0.0342686 0.00201941 1 0 1 1 0 0 +EDGE2 2853 2852 -1.02569 0.0334289 0.0291722 1 0 1 1 0 0 +EDGE2 2853 2772 -0.978249 -0.0339512 0.0112992 1 0 1 1 0 0 +EDGE2 2853 2773 -0.0140724 -0.0709166 -0.00257551 1 0 1 1 0 0 +EDGE2 2853 2612 -0.977822 -0.0295454 -0.000755059 1 0 1 1 0 0 +EDGE2 2853 2672 -1.01514 -0.0113153 0.005522 1 0 1 1 0 0 +EDGE2 2853 2613 -0.00794919 0.078819 0.0232799 1 0 1 1 0 0 +EDGE2 2853 2673 0.0111756 -0.0126165 0.0219939 1 0 1 1 0 0 +EDGE2 2853 2693 -0.0483683 -0.0577785 0.00689589 1 0 1 1 0 0 +EDGE2 2853 2674 0.990684 -0.048474 0.0159894 1 0 1 1 0 0 +EDGE2 2853 2694 1.02926 0.0763665 -0.0156966 1 0 1 1 0 0 +EDGE2 2853 2774 1.03412 0.0620892 0.0197665 1 0 1 1 0 0 +EDGE2 2853 2614 1.01556 -0.0491274 -0.0088099 1 0 1 1 0 0 +EDGE2 2854 2773 -1.06058 0.0278339 -0.0278009 1 0 1 1 0 0 +EDGE2 2854 2853 -1.01299 -0.0215424 0.02228 1 0 1 1 0 0 +EDGE2 2854 2613 -1.00538 0.0233548 0.0178058 1 0 1 1 0 0 +EDGE2 2854 2673 -0.994186 -0.074829 0.0161518 1 0 1 1 0 0 +EDGE2 2854 2693 -1.0673 -0.0716975 0.0634562 1 0 1 1 0 0 +EDGE2 2854 2775 1.01186 -0.00527138 -0.00593613 1 0 1 1 0 0 +EDGE2 2854 2674 -0.0034599 0.0389668 0.0103244 1 0 1 1 0 0 +EDGE2 2854 2694 -0.0146282 -0.14022 0.0168913 1 0 1 1 0 0 +EDGE2 2854 2774 0.0212829 -0.0444341 -0.0314804 1 0 1 1 0 0 +EDGE2 2854 2614 -0.0573369 0.0624412 0.00214147 1 0 1 1 0 0 +EDGE2 2854 2615 1.00578 -0.0455141 -0.0197802 1 0 1 1 0 0 +EDGE2 2854 2675 0.956088 -0.0963545 -0.0133663 1 0 1 1 0 0 +EDGE2 2854 2695 0.942075 -0.00181171 -0.00215135 1 0 1 1 0 0 +EDGE2 2855 2854 -0.974316 -0.0557353 -0.0045746 1 0 1 1 0 0 +EDGE2 2855 2775 -0.0690183 0.03958 0.00205676 1 0 1 1 0 0 +EDGE2 2855 2674 -1.00045 -0.0779908 0.00862147 1 0 1 1 0 0 +EDGE2 2855 2694 -1.0122 0.0351756 -0.0331223 1 0 1 1 0 0 +EDGE2 2855 2774 -1.02335 0.0109897 0.0145203 1 0 1 1 0 0 +EDGE2 2855 2614 -1.02072 0.0886948 -0.00598838 1 0 1 1 0 0 +EDGE2 2855 2615 -0.0275592 0.0163882 -0.0149332 1 0 1 1 0 0 +EDGE2 2855 2675 -0.00680533 -0.00261736 0.00366036 1 0 1 1 0 0 +EDGE2 2855 2695 0.0157975 0.032046 -0.0122644 1 0 1 1 0 0 +EDGE2 2855 2676 0.102338 0.976403 1.55432 1 0 1 1 0 0 +EDGE2 2855 2776 0.0442303 1.10054 1.56231 1 0 1 1 0 0 +EDGE2 2855 2696 0.0336064 1.01061 1.59259 1 0 1 1 0 0 +EDGE2 2855 2616 0.0577685 0.977438 1.55289 1 0 1 1 0 0 +EDGE2 2856 2775 -0.940304 -0.00483224 -1.56574 1 0 1 1 0 0 +EDGE2 2856 2855 -0.980325 -0.102202 -1.58073 1 0 1 1 0 0 +EDGE2 2856 2615 -1.05772 -0.00905629 -1.5471 1 0 1 1 0 0 +EDGE2 2856 2675 -0.978338 -0.0413508 -1.5578 1 0 1 1 0 0 +EDGE2 2856 2695 -1.07929 -0.00083512 -1.61467 1 0 1 1 0 0 +EDGE2 2856 2677 0.94719 0.0589706 -0.00368802 1 0 1 1 0 0 +EDGE2 2856 2697 0.949767 -0.0399452 -0.00823756 1 0 1 1 0 0 +EDGE2 2856 2676 0.0689616 -0.0657475 -0.0109198 1 0 1 1 0 0 +EDGE2 2856 2776 -0.025511 -0.0813267 -0.0121718 1 0 1 1 0 0 +EDGE2 2856 2696 0.0348215 -0.0504404 -0.0287899 1 0 1 1 0 0 +EDGE2 2856 2616 0.0203588 0.0165823 -0.00106558 1 0 1 1 0 0 +EDGE2 2856 2777 1.02472 -0.0183463 0.0113603 1 0 1 1 0 0 +EDGE2 2856 2617 0.995706 -0.0361037 -0.00145885 1 0 1 1 0 0 +EDGE2 2857 2677 -0.0616078 -0.0111618 -0.0061901 1 0 1 1 0 0 +EDGE2 2857 2697 0.0295516 -0.0730637 -0.00160257 1 0 1 1 0 0 +EDGE2 2857 2676 -0.99095 -0.00216111 0.0114775 1 0 1 1 0 0 +EDGE2 2857 2776 -1.01107 0.100434 0.00240823 1 0 1 1 0 0 +EDGE2 2857 2856 -0.967947 -0.026187 -0.00691237 1 0 1 1 0 0 +EDGE2 2857 2696 -0.906155 0.0407784 -0.0321363 1 0 1 1 0 0 +EDGE2 2857 2616 -0.932381 -0.0350637 0.0248956 1 0 1 1 0 0 +EDGE2 2857 2777 -0.000602579 0.0598577 0.0240542 1 0 1 1 0 0 +EDGE2 2857 2698 1.07732 -0.0165247 -0.00925723 1 0 1 1 0 0 +EDGE2 2857 2617 0.0367135 0.0459979 -0.00494669 1 0 1 1 0 0 +EDGE2 2857 2778 1.00506 0.0609017 0.0130108 1 0 1 1 0 0 +EDGE2 2857 2618 1.08831 -0.0809479 0.00324105 1 0 1 1 0 0 +EDGE2 2857 2678 0.979126 -0.0230505 -0.0378097 1 0 1 1 0 0 +EDGE2 2858 2677 -1.02565 0.0177283 0.0146208 1 0 1 1 0 0 +EDGE2 2858 2697 -0.918026 -0.0387151 0.010234 1 0 1 1 0 0 +EDGE2 2858 2857 -0.979428 -0.0189791 -0.0265109 1 0 1 1 0 0 +EDGE2 2858 2777 -0.927839 -0.0609056 -0.0281716 1 0 1 1 0 0 +EDGE2 2858 2698 0.00157984 -0.00896417 -0.0156656 1 0 1 1 0 0 +EDGE2 2858 2617 -0.93437 0.0243983 -0.0349321 1 0 1 1 0 0 +EDGE2 2858 2778 0.0588448 -0.0246803 -0.0192464 1 0 1 1 0 0 +EDGE2 2858 2618 -0.0434905 -0.000129202 0.00189958 1 0 1 1 0 0 +EDGE2 2858 2678 -0.06741 -0.0187358 -0.00898545 1 0 1 1 0 0 +EDGE2 2858 2699 0.993915 -0.00632367 0.00924149 1 0 1 1 0 0 +EDGE2 2858 2779 0.898133 0.0257636 0.0294997 1 0 1 1 0 0 +EDGE2 2858 2619 1.0051 0.0502011 -0.0208503 1 0 1 1 0 0 +EDGE2 2858 2679 0.966971 -0.00864527 -0.0150834 1 0 1 1 0 0 +EDGE2 2859 2698 -1.10449 0.0189625 0.0311373 1 0 1 1 0 0 +EDGE2 2859 2858 -0.991526 0.0113168 -0.00148025 1 0 1 1 0 0 +EDGE2 2859 2778 -0.981408 0.0363068 0.0252301 1 0 1 1 0 0 +EDGE2 2859 2618 -0.968962 -0.0565024 0.0162074 1 0 1 1 0 0 +EDGE2 2859 2678 -1.03036 -0.0527459 -0.00790208 1 0 1 1 0 0 +EDGE2 2859 2699 -0.012382 0.00948875 0.0182323 1 0 1 1 0 0 +EDGE2 2859 2779 -0.0700353 -0.00961237 -0.0299426 1 0 1 1 0 0 +EDGE2 2859 2619 -0.0286271 -0.014247 0.0172016 1 0 1 1 0 0 +EDGE2 2859 2679 -0.0338941 0.0995336 -0.034648 1 0 1 1 0 0 +EDGE2 2859 2760 1.09423 -0.00988219 -3.14135 1 0 1 1 0 0 +EDGE2 2859 2780 1.0072 -0.0484146 -0.00715741 1 0 1 1 0 0 +EDGE2 2859 2620 0.985428 0.0364811 -0.00755678 1 0 1 1 0 0 +EDGE2 2859 2680 0.945128 -0.0576768 0.00732884 1 0 1 1 0 0 +EDGE2 2859 2700 0.943456 -0.047008 -0.00747108 1 0 1 1 0 0 +EDGE2 2860 2699 -0.984472 -0.0459373 0.00293693 1 0 1 1 0 0 +EDGE2 2860 2859 -0.956127 -0.0178825 0.0362477 1 0 1 1 0 0 +EDGE2 2860 2779 -1.05362 0.0076228 -0.0132148 1 0 1 1 0 0 +EDGE2 2860 2619 -0.974097 -0.0720224 0.0232816 1 0 1 1 0 0 +EDGE2 2860 2679 -1.07611 -0.0547478 -0.00712288 1 0 1 1 0 0 +EDGE2 2860 2760 0.0261512 -0.0149977 -3.127 1 0 1 1 0 0 +EDGE2 2860 2681 -0.0279874 1.04271 1.56114 1 0 1 1 0 0 +EDGE2 2860 2761 -0.0378586 1.03699 1.58344 1 0 1 1 0 0 +EDGE2 2860 2781 0.0303545 1.05412 1.5559 1 0 1 1 0 0 +EDGE2 2860 2621 0.0458318 0.978654 1.58014 1 0 1 1 0 0 +EDGE2 2860 2780 0.0612051 0.11773 -0.0254312 1 0 1 1 0 0 +EDGE2 2860 2620 0.0367649 -0.0988336 -0.0139865 1 0 1 1 0 0 +EDGE2 2860 2680 -0.0287902 0.0426701 -0.0122738 1 0 1 1 0 0 +EDGE2 2860 2700 -0.0210214 -0.0244042 -0.0444029 1 0 1 1 0 0 +EDGE2 2860 2701 -0.0378558 -1.01713 -1.59227 1 0 1 1 0 0 +EDGE2 2860 2759 1.03192 -0.0998704 -3.11699 1 0 1 1 0 0 +EDGE2 2861 2760 -0.936114 -0.0613924 -1.57148 1 0 1 1 0 0 +EDGE2 2861 2860 -0.989762 0.0597582 1.58362 1 0 1 1 0 0 +EDGE2 2861 2780 -0.985724 0.107592 1.58735 1 0 1 1 0 0 +EDGE2 2861 2620 -1.01722 0.0432537 1.58348 1 0 1 1 0 0 +EDGE2 2861 2680 -0.99204 0.00060075 1.55284 1 0 1 1 0 0 +EDGE2 2861 2700 -1.03724 0.0591413 1.57823 1 0 1 1 0 0 +EDGE2 2861 2701 -0.0342676 0.0131481 0.0570779 1 0 1 1 0 0 +EDGE2 2861 2702 1.01454 -0.0317382 0.0102029 1 0 1 1 0 0 +EDGE2 2862 2701 -1.05589 0.0103207 -0.0111133 1 0 1 1 0 0 +EDGE2 2862 2861 -1.0156 -0.0237322 -0.0096865 1 0 1 1 0 0 +EDGE2 2862 2702 0.0234377 0.0413731 -0.0343691 1 0 1 1 0 0 +EDGE2 2862 2703 0.928111 0.0246564 -0.012265 1 0 1 1 0 0 +EDGE2 2863 2702 -1.03495 0.0149571 0.0255662 1 0 1 1 0 0 +EDGE2 2863 2862 -0.992849 0.0216528 -0.0052363 1 0 1 1 0 0 +EDGE2 2863 2703 0.00927474 -0.0792158 -0.0129023 1 0 1 1 0 0 +EDGE2 2863 2704 1.04143 0.0191179 -0.00649178 1 0 1 1 0 0 +EDGE2 2864 2703 -0.914627 -0.0148797 -0.0132948 1 0 1 1 0 0 +EDGE2 2864 2863 -0.963561 -0.005421 0.00452554 1 0 1 1 0 0 +EDGE2 2864 2704 0.0780975 -0.0279247 -0.00409492 1 0 1 1 0 0 +EDGE2 2864 2705 1.03352 -0.0653842 -0.0337728 1 0 1 1 0 0 +EDGE2 2864 2745 1.05774 0.0498387 -3.11714 1 0 1 1 0 0 +EDGE2 2865 2704 -1.04618 0.0512708 0.00808632 1 0 1 1 0 0 +EDGE2 2865 2864 -0.949018 0.0126803 0.0102132 1 0 1 1 0 0 +EDGE2 2865 2706 -0.0151041 -1.05994 -1.56601 1 0 1 1 0 0 +EDGE2 2865 2705 0.00172662 0.10399 -0.0412264 1 0 1 1 0 0 +EDGE2 2865 2745 -0.0379109 0.0251448 -3.14453 1 0 1 1 0 0 +EDGE2 2865 2746 0.0232848 0.907885 1.58128 1 0 1 1 0 0 +EDGE2 2865 2744 1.0665 -0.017522 -3.14035 1 0 1 1 0 0 +EDGE2 2866 2705 -0.960371 0.00258309 -1.56859 1 0 1 1 0 0 +EDGE2 2866 2865 -1.0323 0.0284789 -1.5831 1 0 1 1 0 0 +EDGE2 2866 2745 -0.980983 0.0532404 1.56203 1 0 1 1 0 0 +EDGE2 2866 2746 -0.0335538 0.0677003 0.0155986 1 0 1 1 0 0 +EDGE2 2866 2747 0.99029 0.0156527 -0.0381779 1 0 1 1 0 0 +EDGE2 2867 2746 -0.966791 0.0370535 -0.0222304 1 0 1 1 0 0 +EDGE2 2867 2866 -1.03586 0.012033 -0.00985286 1 0 1 1 0 0 +EDGE2 2867 2747 0.05387 -0.033623 -0.00747539 1 0 1 1 0 0 +EDGE2 2867 2748 0.963488 -0.0257851 -0.0104843 1 0 1 1 0 0 +EDGE2 2868 2867 -1.01555 0.0259822 -0.0137194 1 0 1 1 0 0 +EDGE2 2868 2747 -1.09163 0.0304065 -0.000779454 1 0 1 1 0 0 +EDGE2 2868 2748 -0.0854731 -0.00464271 -0.0144391 1 0 1 1 0 0 +EDGE2 2868 2749 0.920401 0.0273278 -0.00941155 1 0 1 1 0 0 +EDGE2 2869 2748 -0.998916 -0.0180827 0.0354802 1 0 1 1 0 0 +EDGE2 2869 2868 -0.959297 -0.00192606 -6.47042e-05 1 0 1 1 0 0 +EDGE2 2869 2749 -0.103786 -0.0910808 0.0207683 1 0 1 1 0 0 +EDGE2 2869 2750 0.981062 0.0711565 0.00862006 1 0 1 1 0 0 +EDGE2 2870 2751 -0.0006891 0.987989 1.56831 1 0 1 1 0 0 +EDGE2 2870 2869 -1.01903 0.017964 0.0472309 1 0 1 1 0 0 +EDGE2 2870 2749 -1.08946 0.0375848 0.00296016 1 0 1 1 0 0 +EDGE2 2870 2750 -0.0754818 -0.00606549 -0.023317 1 0 1 1 0 0 +EDGE2 2871 2752 1.0204 0.00481794 -0.0217298 1 0 1 1 0 0 +EDGE2 2871 2751 0.0610854 0.0517315 -0.0151561 1 0 1 1 0 0 +EDGE2 2871 2870 -0.977736 -0.00605582 -1.56085 1 0 1 1 0 0 +EDGE2 2871 2750 -0.968725 -0.0575967 -1.57286 1 0 1 1 0 0 +EDGE2 2872 2753 0.968617 -0.0428233 0.0289539 1 0 1 1 0 0 +EDGE2 2872 2871 -0.961854 -0.0582198 0.00409925 1 0 1 1 0 0 +EDGE2 2872 2752 -0.0406489 0.00156968 0.000121841 1 0 1 1 0 0 +EDGE2 2872 2751 -1.05992 -0.0622938 -0.0148004 1 0 1 1 0 0 +EDGE2 2873 2754 0.994966 0.0558457 -0.0316725 1 0 1 1 0 0 +EDGE2 2873 2872 -1.07748 -0.0136207 -0.00147714 1 0 1 1 0 0 +EDGE2 2873 2753 -0.0199759 -0.0171446 -0.0078254 1 0 1 1 0 0 +EDGE2 2873 2752 -0.961433 -0.0277629 0.0215485 1 0 1 1 0 0 +EDGE2 2874 2754 0.0253151 0.100833 0.00525132 1 0 1 1 0 0 +EDGE2 2874 2755 0.98113 -0.0369347 0.0157993 1 0 1 1 0 0 +EDGE2 2874 2753 -0.984074 -0.0393587 0.0316713 1 0 1 1 0 0 +EDGE2 2874 2873 -1.0125 -0.0642706 0.00835442 1 0 1 1 0 0 +EDGE2 2875 2756 -0.000423179 1.02494 1.57235 1 0 1 1 0 0 +EDGE2 2875 2754 -1.03438 0.0328643 0.0232302 1 0 1 1 0 0 +EDGE2 2875 2874 -0.98532 -0.0508401 -0.00711602 1 0 1 1 0 0 +EDGE2 2875 2755 0.025825 0.0414715 0.00203656 1 0 1 1 0 0 +EDGE2 2876 2875 -1.02883 -0.053244 -1.55712 1 0 1 1 0 0 +EDGE2 2876 2757 1.06205 -0.113142 0.0589121 1 0 1 1 0 0 +EDGE2 2876 2756 -0.000837625 0.0428912 -0.0170934 1 0 1 1 0 0 +EDGE2 2876 2755 -0.998936 0.0530358 -1.58403 1 0 1 1 0 0 +EDGE2 2877 2758 1.05093 -0.0245636 0.00755492 1 0 1 1 0 0 +EDGE2 2877 2757 0.0701588 -0.0844318 -0.00890607 1 0 1 1 0 0 +EDGE2 2877 2876 -1.04135 0.00966021 0.00546092 1 0 1 1 0 0 +EDGE2 2877 2756 -0.997041 0.0229739 -0.0184975 1 0 1 1 0 0 +EDGE2 2878 2759 1.00961 0.0452524 0.0152839 1 0 1 1 0 0 +EDGE2 2878 2877 -0.92284 -0.0538243 -0.00222744 1 0 1 1 0 0 +EDGE2 2878 2758 0.0700999 -0.0134205 0.00705259 1 0 1 1 0 0 +EDGE2 2878 2757 -0.972927 0.0558556 -0.0306844 1 0 1 1 0 0 +EDGE2 2879 2760 1.05593 -0.0444066 0.0144719 1 0 1 1 0 0 +EDGE2 2879 2860 0.933812 -0.0889844 -3.12416 1 0 1 1 0 0 +EDGE2 2879 2780 1.06521 0.0184689 -3.15657 1 0 1 1 0 0 +EDGE2 2879 2620 1.06388 -0.0597642 -3.13178 1 0 1 1 0 0 +EDGE2 2879 2680 0.95044 0.00682697 -3.12334 1 0 1 1 0 0 +EDGE2 2879 2700 0.995153 0.0603573 -3.11332 1 0 1 1 0 0 +EDGE2 2879 2878 -0.946363 0.0353457 -0.00537134 1 0 1 1 0 0 +EDGE2 2879 2759 -0.0643138 -0.0334746 -0.00496216 1 0 1 1 0 0 +EDGE2 2879 2758 -1.05683 -0.00536982 -0.0115217 1 0 1 1 0 0 +EDGE2 2880 2699 0.977735 0.042525 -3.13336 1 0 1 1 0 0 +EDGE2 2880 2859 0.976234 -0.00520561 -3.169 1 0 1 1 0 0 +EDGE2 2880 2779 1.03445 0.0503183 -3.14892 1 0 1 1 0 0 +EDGE2 2880 2619 0.965918 -0.0476223 -3.17592 1 0 1 1 0 0 +EDGE2 2880 2679 0.958942 0.00414776 -3.10716 1 0 1 1 0 0 +EDGE2 2880 2760 0.0138583 0.0589076 0.00469443 1 0 1 1 0 0 +EDGE2 2880 2681 0.0930058 -0.98506 -1.5511 1 0 1 1 0 0 +EDGE2 2880 2761 0.0560486 -0.937191 -1.5608 1 0 1 1 0 0 +EDGE2 2880 2781 0.0683898 -0.942913 -1.55131 1 0 1 1 0 0 +EDGE2 2880 2621 0.0957698 -0.960766 -1.55387 1 0 1 1 0 0 +EDGE2 2880 2860 0.0454521 0.0640405 -3.14109 1 0 1 1 0 0 +EDGE2 2880 2780 -0.0459477 0.108575 -3.11299 1 0 1 1 0 0 +EDGE2 2880 2620 0.0105063 0.023245 -3.13445 1 0 1 1 0 0 +EDGE2 2880 2680 -0.0181186 0.00447032 -3.14231 1 0 1 1 0 0 +EDGE2 2880 2700 -0.0380512 0.0479811 -3.15283 1 0 1 1 0 0 +EDGE2 2880 2701 0.0384215 1.01786 1.58691 1 0 1 1 0 0 +EDGE2 2880 2861 -0.106523 1.04416 1.60536 1 0 1 1 0 0 +EDGE2 2880 2759 -1.00605 -0.0172615 0.00288563 1 0 1 1 0 0 +EDGE2 2880 2879 -0.964782 -0.0208042 -0.0361667 1 0 1 1 0 0 +EDGE2 2881 2760 -1.05412 0.0835149 -1.54519 1 0 1 1 0 0 +EDGE2 2881 2860 -0.965563 0.11315 1.56963 1 0 1 1 0 0 +EDGE2 2881 2880 -0.968123 0.00557352 -1.5914 1 0 1 1 0 0 +EDGE2 2881 2780 -1.03988 0.05345 1.55121 1 0 1 1 0 0 +EDGE2 2881 2620 -1.01934 0.0260054 1.59209 1 0 1 1 0 0 +EDGE2 2881 2680 -0.991468 -0.0402234 1.56058 1 0 1 1 0 0 +EDGE2 2881 2700 -1.03569 0.0189937 1.60334 1 0 1 1 0 0 +EDGE2 2881 2701 -0.0538554 0.0998946 -0.0106912 1 0 1 1 0 0 +EDGE2 2881 2861 -0.014623 -0.0830183 -0.0444033 1 0 1 1 0 0 +EDGE2 2881 2702 1.07482 0.0332781 -0.00896786 1 0 1 1 0 0 +EDGE2 2881 2862 0.889416 0.0926927 0.021439 1 0 1 1 0 0 +EDGE2 2882 2701 -0.983299 -0.0177576 -0.00832402 1 0 1 1 0 0 +EDGE2 2882 2861 -0.91567 -0.0783193 -0.0129899 1 0 1 1 0 0 +EDGE2 2882 2881 -0.997778 0.0150417 -0.0050494 1 0 1 1 0 0 +EDGE2 2882 2702 0.0813825 0.0174581 0.0163926 1 0 1 1 0 0 +EDGE2 2882 2862 -0.00672224 0.00820269 0.0641268 1 0 1 1 0 0 +EDGE2 2882 2703 0.961884 -0.0620136 0.0213153 1 0 1 1 0 0 +EDGE2 2882 2863 0.966256 0.0971554 0.00655754 1 0 1 1 0 0 +EDGE2 2883 2702 -1.00511 0.000726761 0.0264299 1 0 1 1 0 0 +EDGE2 2883 2862 -0.911862 -0.0107183 0.00279105 1 0 1 1 0 0 +EDGE2 2883 2882 -1.03917 0.0411226 -0.00421338 1 0 1 1 0 0 +EDGE2 2883 2703 0.0689225 0.100802 0.00126675 1 0 1 1 0 0 +EDGE2 2883 2863 -0.124362 -0.0222337 -0.0215249 1 0 1 1 0 0 +EDGE2 2883 2704 1.11174 0.0553988 0.00527768 1 0 1 1 0 0 +EDGE2 2883 2864 0.942671 0.0318832 0.006238 1 0 1 1 0 0 +EDGE2 2884 2703 -1.13331 0.0507357 0.000705292 1 0 1 1 0 0 +EDGE2 2884 2863 -1.07539 0.084723 0.0322247 1 0 1 1 0 0 +EDGE2 2884 2883 -0.905994 -0.113744 0.00742825 1 0 1 1 0 0 +EDGE2 2884 2704 0.0453438 -0.0457919 0.0147223 1 0 1 1 0 0 +EDGE2 2884 2864 -0.00273001 -0.0316947 0.0167042 1 0 1 1 0 0 +EDGE2 2884 2705 1.05009 0.0484222 -0.0184788 1 0 1 1 0 0 +EDGE2 2884 2865 1.06459 0.0192515 0.0182476 1 0 1 1 0 0 +EDGE2 2884 2745 0.998018 0.0480315 -3.16621 1 0 1 1 0 0 +EDGE2 2885 2704 -0.957712 -0.0165332 0.0025847 1 0 1 1 0 0 +EDGE2 2885 2864 -0.971386 0.0681431 -0.00708101 1 0 1 1 0 0 +EDGE2 2885 2884 -1.02408 0.0529924 0.0165833 1 0 1 1 0 0 +EDGE2 2885 2706 0.000603042 -1.02381 -1.56506 1 0 1 1 0 0 +EDGE2 2885 2705 0.0212193 -0.0599519 0.0196118 1 0 1 1 0 0 +EDGE2 2885 2865 0.062702 0.0145071 0.0203681 1 0 1 1 0 0 +EDGE2 2885 2745 -0.00774571 0.0781716 -3.16718 1 0 1 1 0 0 +EDGE2 2885 2746 -0.0413288 1.05848 1.5753 1 0 1 1 0 0 +EDGE2 2885 2866 0.0739071 0.945647 1.57303 1 0 1 1 0 0 +EDGE2 2885 2744 1.00507 -0.038714 -3.18222 1 0 1 1 0 0 +EDGE2 2886 2867 0.840361 0.0606686 0.0213274 1 0 1 1 0 0 +EDGE2 2886 2705 -0.928585 0.0659503 -1.55276 1 0 1 1 0 0 +EDGE2 2886 2865 -1.06817 -0.00139007 -1.54754 1 0 1 1 0 0 +EDGE2 2886 2885 -0.981755 -0.0258329 -1.55946 1 0 1 1 0 0 +EDGE2 2886 2745 -1.05293 -0.0785246 1.59331 1 0 1 1 0 0 +EDGE2 2886 2746 -0.0584232 -0.0210071 0.0215871 1 0 1 1 0 0 +EDGE2 2886 2866 -0.0507382 0.0168067 0.00842195 1 0 1 1 0 0 +EDGE2 2886 2747 0.974937 -0.0603361 0.046759 1 0 1 1 0 0 +EDGE2 2887 2867 0.0522808 -0.0197766 0.0022057 1 0 1 1 0 0 +EDGE2 2887 2746 -0.991725 -0.0596035 -0.0150337 1 0 1 1 0 0 +EDGE2 2887 2866 -0.94313 -0.0110046 -0.00359426 1 0 1 1 0 0 +EDGE2 2887 2886 -0.990347 -0.0312441 0.0229274 1 0 1 1 0 0 +EDGE2 2887 2747 0.0219064 0.00440154 -0.0100378 1 0 1 1 0 0 +EDGE2 2887 2748 1.11051 -0.0735168 -0.0284511 1 0 1 1 0 0 +EDGE2 2887 2868 0.965084 0.047705 -0.0138097 1 0 1 1 0 0 +EDGE2 2888 2869 0.942955 -0.00428854 0.00190908 1 0 1 1 0 0 +EDGE2 2888 2867 -1.01606 -0.0708934 -0.00419221 1 0 1 1 0 0 +EDGE2 2888 2887 -0.943729 -0.0848666 0.0246625 1 0 1 1 0 0 +EDGE2 2888 2747 -1.02012 -0.0313234 0.013679 1 0 1 1 0 0 +EDGE2 2888 2748 0.0787137 0.0602124 -0.014015 1 0 1 1 0 0 +EDGE2 2888 2868 0.0906154 0.0365465 -0.0206296 1 0 1 1 0 0 +EDGE2 2888 2749 0.982117 0.0444405 0.00894653 1 0 1 1 0 0 +EDGE2 2889 2869 -0.00316831 -0.0163964 0.0101116 1 0 1 1 0 0 +EDGE2 2889 2748 -0.969017 -0.0707954 -0.0228555 1 0 1 1 0 0 +EDGE2 2889 2868 -1.01384 -0.0163982 0.0197951 1 0 1 1 0 0 +EDGE2 2889 2888 -0.978434 0.0409867 0.00202169 1 0 1 1 0 0 +EDGE2 2889 2870 1.06901 -0.0689442 0.0117091 1 0 1 1 0 0 +EDGE2 2889 2749 -0.00151808 0.0735536 -0.00863308 1 0 1 1 0 0 +EDGE2 2889 2750 0.919551 -0.0609033 -0.0225118 1 0 1 1 0 0 +EDGE2 2890 2871 -0.072629 0.952539 1.54854 1 0 1 1 0 0 +EDGE2 2890 2751 0.0379133 1.04939 1.57821 1 0 1 1 0 0 +EDGE2 2890 2869 -0.957356 0.041765 -0.0148878 1 0 1 1 0 0 +EDGE2 2890 2889 -1.00447 -0.0455349 0.0357465 1 0 1 1 0 0 +EDGE2 2890 2870 -0.0404122 0.0523943 0.00465939 1 0 1 1 0 0 +EDGE2 2890 2749 -0.934606 -0.0132821 0.00778328 1 0 1 1 0 0 +EDGE2 2890 2750 -0.0746233 0.0260091 0.0146273 1 0 1 1 0 0 +EDGE2 2891 2870 -0.942634 -0.0752954 1.57813 1 0 1 1 0 0 +EDGE2 2891 2890 -0.985109 -0.0304414 1.58071 1 0 1 1 0 0 +EDGE2 2891 2750 -0.937784 -0.0308362 1.56183 1 0 1 1 0 0 +EDGE2 2892 2891 -1.01583 0.0362801 0.0125058 1 0 1 1 0 0 +EDGE2 2893 2892 -1.01115 -0.0472983 0.00148796 1 0 1 1 0 0 +EDGE2 2894 2893 -0.912289 -0.0117277 0.00722778 1 0 1 1 0 0 +EDGE2 2894 2735 0.938569 -0.0165726 -3.15744 1 0 1 1 0 0 +EDGE2 2895 2894 -1.06482 0.0307568 0.00275502 1 0 1 1 0 0 +EDGE2 2895 2734 0.911252 0.103932 -3.14386 1 0 1 1 0 0 +EDGE2 2895 2736 0.024568 -0.968236 -1.58881 1 0 1 1 0 0 +EDGE2 2895 2735 0.0478826 0.0220138 -3.11871 1 0 1 1 0 0 +EDGE2 2896 2895 -0.955357 -0.0544606 -1.56222 1 0 1 1 0 0 +EDGE2 2896 2735 -1.11966 0.0884091 1.56527 1 0 1 1 0 0 +EDGE2 2897 2896 -0.988272 0.0398329 0.0119851 1 0 1 1 0 0 +EDGE2 2898 2897 -0.964394 -0.0650143 -0.0295667 1 0 1 1 0 0 +EDGE2 2899 2898 -0.952993 0.0554917 0.00566352 1 0 1 1 0 0 +EDGE2 2900 2899 -0.979606 -0.0310784 0.0131514 1 0 1 1 0 0 +EDGE2 2901 2900 -1.04055 -0.0459866 -1.52999 1 0 1 1 0 0 +EDGE2 2902 2901 -0.931317 0.0502599 0.0137017 1 0 1 1 0 0 +EDGE2 2903 2902 -1.06874 0.00645282 -0.0101336 1 0 1 1 0 0 +EDGE2 2904 2903 -1.12361 -0.0156375 7.1839e-06 1 0 1 1 0 0 +EDGE2 2905 2904 -1.02829 0.015688 0.0174044 1 0 1 1 0 0 +EDGE2 2906 2905 -1.06141 0.0446355 1.53861 1 0 1 1 0 0 +EDGE2 2907 2906 -0.974082 -0.0254203 -0.003194 1 0 1 1 0 0 +EDGE2 2908 2907 -1.03106 0.0015619 -0.0217995 1 0 1 1 0 0 +EDGE2 2909 2908 -1.01723 -0.0117199 -0.0015095 1 0 1 1 0 0 +EDGE2 2910 2909 -0.947971 0.0143845 0.0143365 1 0 1 1 0 0 +EDGE2 2911 2910 -0.932979 -0.0243991 -1.58565 1 0 1 1 0 0 +EDGE2 2912 2911 -0.983491 0.0903428 -0.0133308 1 0 1 1 0 0 +EDGE2 2913 2912 -0.948706 -0.0475379 0.033087 1 0 1 1 0 0 +EDGE2 2914 2913 -0.975143 0.00195319 -0.0107076 1 0 1 1 0 0 +EDGE2 2915 2914 -0.969466 -0.0431074 -0.0224459 1 0 1 1 0 0 +EDGE2 2916 2915 -1.01361 0.0241689 -1.55752 1 0 1 1 0 0 +EDGE2 2917 2916 -1.12981 0.0145235 -0.0300428 1 0 1 1 0 0 +EDGE2 2918 2917 -0.901367 0.0045566 -0.0248091 1 0 1 1 0 0 +EDGE2 2919 2918 -1.06949 0.0312426 0.0242354 1 0 1 1 0 0 +EDGE2 2920 2919 -0.950312 -0.0151093 0.0106056 1 0 1 1 0 0 +EDGE2 2921 2920 -0.962598 0.00167253 -1.57756 1 0 1 1 0 0 +EDGE2 2922 2921 -1.01837 0.0536716 -0.00485659 1 0 1 1 0 0 +EDGE2 2923 2922 -1.08621 0.152584 0.0419466 1 0 1 1 0 0 +EDGE2 2924 2923 -1.07411 0.0558219 -0.0222368 1 0 1 1 0 0 +EDGE2 2924 2905 0.954216 0.0529952 -3.09226 1 0 1 1 0 0 +EDGE2 2925 2924 -1.06802 -0.0637089 0.00830712 1 0 1 1 0 0 +EDGE2 2925 2904 1.01116 -0.0825314 -3.14566 1 0 1 1 0 0 +EDGE2 2925 2905 0.0390475 0.0536526 -3.12897 1 0 1 1 0 0 +EDGE2 2925 2906 0.0200991 1.02252 1.60813 1 0 1 1 0 0 +EDGE2 2926 2905 -0.948583 -0.0145496 -1.55215 1 0 1 1 0 0 +EDGE2 2926 2925 -1.02663 0.0714696 1.62251 1 0 1 1 0 0 +EDGE2 2927 2926 -0.911473 0.0578543 0.00669424 1 0 1 1 0 0 +EDGE2 2928 2927 -0.967757 0.0155365 -0.0312713 1 0 1 1 0 0 +EDGE2 2929 2928 -1.00533 0.0171032 0.00953728 1 0 1 1 0 0 +EDGE2 2929 2870 1.02119 -0.020656 -3.15969 1 0 1 1 0 0 +EDGE2 2929 2890 1.00395 -0.0215611 -3.12344 1 0 1 1 0 0 +EDGE2 2929 2750 0.945212 -0.079514 -3.12447 1 0 1 1 0 0 +EDGE2 2930 2871 0.0657157 -1.04291 -1.52204 1 0 1 1 0 0 +EDGE2 2930 2751 -0.026837 -1.04494 -1.55612 1 0 1 1 0 0 +EDGE2 2930 2869 1.00787 -0.0134386 -3.15844 1 0 1 1 0 0 +EDGE2 2930 2889 1.00887 0.0524128 -3.13388 1 0 1 1 0 0 +EDGE2 2930 2870 -0.0462158 -0.0402215 -3.12826 1 0 1 1 0 0 +EDGE2 2930 2749 1.0505 0.0254126 -3.1563 1 0 1 1 0 0 +EDGE2 2930 2890 0.0604679 0.0328542 -3.14535 1 0 1 1 0 0 +EDGE2 2930 2929 -0.987734 0.0545757 0.00847771 1 0 1 1 0 0 +EDGE2 2930 2750 0.0643898 0.0581175 -3.14997 1 0 1 1 0 0 +EDGE2 2930 2891 -0.0506763 0.953461 1.60766 1 0 1 1 0 0 +EDGE2 2931 2870 -0.954338 0.0670306 1.59334 1 0 1 1 0 0 +EDGE2 2931 2930 -0.926958 -0.0116571 -1.58398 1 0 1 1 0 0 +EDGE2 2931 2890 -1.01712 -0.0273327 1.58987 1 0 1 1 0 0 +EDGE2 2931 2750 -1.10279 -0.0439138 1.59044 1 0 1 1 0 0 +EDGE2 2931 2891 -0.0118182 -0.0331337 0.0134705 1 0 1 1 0 0 +EDGE2 2931 2892 0.968439 -0.0420899 -0.000235329 1 0 1 1 0 0 +EDGE2 2932 2891 -1.00322 0.0385124 0.0254911 1 0 1 1 0 0 +EDGE2 2932 2931 -0.869881 0.0622654 -0.029099 1 0 1 1 0 0 +EDGE2 2932 2892 0.0533872 0.0684968 -0.00507925 1 0 1 1 0 0 +EDGE2 2932 2893 0.998384 0.0928533 0.00136886 1 0 1 1 0 0 +EDGE2 2933 2932 -0.948703 -0.0563026 -0.0173492 1 0 1 1 0 0 +EDGE2 2933 2892 -0.979081 0.051316 0.022647 1 0 1 1 0 0 +EDGE2 2933 2893 -0.0444739 -0.0167247 -0.00606824 1 0 1 1 0 0 +EDGE2 2933 2894 0.98335 -0.0451666 -0.0145318 1 0 1 1 0 0 +EDGE2 2934 2933 -1.08767 -0.0902248 -0.0181928 1 0 1 1 0 0 +EDGE2 2934 2893 -1.03312 0.00276596 -0.0343257 1 0 1 1 0 0 +EDGE2 2934 2894 0.0853257 0.0613419 -0.00284798 1 0 1 1 0 0 +EDGE2 2934 2895 1.02336 -0.0364133 0.0056111 1 0 1 1 0 0 +EDGE2 2934 2735 1.04075 -0.0685522 -3.13314 1 0 1 1 0 0 +EDGE2 2935 2934 -0.995998 -0.0231996 -0.0258758 1 0 1 1 0 0 +EDGE2 2935 2894 -0.964777 -0.000853392 -0.0372125 1 0 1 1 0 0 +EDGE2 2935 2734 0.967881 0.0803549 -3.14287 1 0 1 1 0 0 +EDGE2 2935 2895 -0.100412 0.108239 -0.00562287 1 0 1 1 0 0 +EDGE2 2935 2736 0.0143472 -0.910974 -1.56728 1 0 1 1 0 0 +EDGE2 2935 2735 0.0136986 0.0527515 -3.17474 1 0 1 1 0 0 +EDGE2 2935 2896 -0.0809266 1.03763 1.56511 1 0 1 1 0 0 +EDGE2 2936 2895 -1.05308 0.0299117 -1.57643 1 0 1 1 0 0 +EDGE2 2936 2935 -1.08328 -0.0222041 -1.53897 1 0 1 1 0 0 +EDGE2 2936 2735 -1.02262 -0.0264201 1.55395 1 0 1 1 0 0 +EDGE2 2936 2896 0.00221701 0.0650962 0.00293872 1 0 1 1 0 0 +EDGE2 2936 2897 0.980042 -0.0543739 -0.00567572 1 0 1 1 0 0 +EDGE2 2937 2936 -1.00698 -0.0358714 -0.00615104 1 0 1 1 0 0 +EDGE2 2937 2896 -1.04206 0.126437 -0.0279923 1 0 1 1 0 0 +EDGE2 2937 2898 0.922246 -0.0361275 0.0148367 1 0 1 1 0 0 +EDGE2 2937 2897 0.00937924 0.0378735 -0.00278491 1 0 1 1 0 0 +EDGE2 2938 2937 -0.978562 -0.0257653 0.0143083 1 0 1 1 0 0 +EDGE2 2938 2899 1.07492 -0.0678063 -0.00969353 1 0 1 1 0 0 +EDGE2 2938 2898 -0.0217489 0.0869596 -0.0232093 1 0 1 1 0 0 +EDGE2 2938 2897 -1.00332 0.00807212 -0.00981349 1 0 1 1 0 0 +EDGE2 2939 2899 0.0277521 0.037348 -0.00467612 1 0 1 1 0 0 +EDGE2 2939 2898 -1.02874 0.113597 0.0470776 1 0 1 1 0 0 +EDGE2 2939 2938 -1.03073 0.0336137 -0.0100875 1 0 1 1 0 0 +EDGE2 2939 2900 0.950285 0.0365155 0.011774 1 0 1 1 0 0 +EDGE2 2940 2899 -0.95166 -0.0478141 -0.0287015 1 0 1 1 0 0 +EDGE2 2940 2939 -0.983023 -0.0135961 0.0203631 1 0 1 1 0 0 +EDGE2 2940 2901 -0.0236067 1.0334 1.55744 1 0 1 1 0 0 +EDGE2 2940 2900 -0.031507 0.0662726 -0.00103044 1 0 1 1 0 0 +EDGE2 2941 2940 -1.0197 -0.0712659 -1.56903 1 0 1 1 0 0 +EDGE2 2941 2902 1.04191 -0.0188671 0.0173628 1 0 1 1 0 0 +EDGE2 2941 2901 0.0570101 0.0497457 -0.00135395 1 0 1 1 0 0 +EDGE2 2941 2900 -1.04855 -0.010812 -1.53804 1 0 1 1 0 0 +EDGE2 2942 2941 -0.99736 0.0154938 0.00856895 1 0 1 1 0 0 +EDGE2 2942 2903 1.06362 -0.0142536 0.0115681 1 0 1 1 0 0 +EDGE2 2942 2902 0.0510134 -0.065467 0.00872835 1 0 1 1 0 0 +EDGE2 2942 2901 -0.927599 -0.0654273 0.00652707 1 0 1 1 0 0 +EDGE2 2943 2904 1.02114 -0.0234295 -0.00997845 1 0 1 1 0 0 +EDGE2 2943 2942 -0.988374 -0.0293424 0.00820266 1 0 1 1 0 0 +EDGE2 2943 2903 -0.0808775 0.0568905 0.0103541 1 0 1 1 0 0 +EDGE2 2943 2902 -0.970999 -0.104864 -0.0522986 1 0 1 1 0 0 +EDGE2 2944 2904 0.0910159 0.0516051 0.010586 1 0 1 1 0 0 +EDGE2 2944 2905 1.00109 -0.0032635 0.0298481 1 0 1 1 0 0 +EDGE2 2944 2925 0.966147 0.0306981 -3.17973 1 0 1 1 0 0 +EDGE2 2944 2903 -1.0281 0.0294518 0.00593824 1 0 1 1 0 0 +EDGE2 2944 2943 -1.05537 -0.0265872 0.00311321 1 0 1 1 0 0 +EDGE2 2945 2924 1.02894 0.00333426 -3.1651 1 0 1 1 0 0 +EDGE2 2945 2904 -1.07276 0.0997972 -0.0250221 1 0 1 1 0 0 +EDGE2 2945 2926 0.0227235 1.07229 1.59589 1 0 1 1 0 0 +EDGE2 2945 2905 -0.00374369 -0.0159573 0.0156487 1 0 1 1 0 0 +EDGE2 2945 2925 -0.0505955 -0.0716753 -3.15462 1 0 1 1 0 0 +EDGE2 2945 2944 -0.976301 -0.0030467 0.0270329 1 0 1 1 0 0 +EDGE2 2945 2906 0.0490928 -0.998562 -1.55216 1 0 1 1 0 0 +EDGE2 2946 2927 0.939271 0.02156 0.0101801 1 0 1 1 0 0 +EDGE2 2946 2926 -0.007919 -0.0179841 -0.0202131 1 0 1 1 0 0 +EDGE2 2946 2905 -1.03355 0.0461548 -1.57791 1 0 1 1 0 0 +EDGE2 2946 2925 -0.970469 -0.0563155 1.58541 1 0 1 1 0 0 +EDGE2 2946 2945 -1.05213 -0.09044 -1.56812 1 0 1 1 0 0 +EDGE2 2947 2928 1.09688 0.0171881 -0.0295997 1 0 1 1 0 0 +EDGE2 2947 2946 -0.946683 -0.000454731 0.0032371 1 0 1 1 0 0 +EDGE2 2947 2927 0.0145766 -0.048808 -0.0288964 1 0 1 1 0 0 +EDGE2 2947 2926 -0.976094 0.0249485 -3.445e-05 1 0 1 1 0 0 +EDGE2 2948 2928 -0.0172976 -0.0737999 0.00115925 1 0 1 1 0 0 +EDGE2 2948 2929 1.10828 0.0126004 0.0311577 1 0 1 1 0 0 +EDGE2 2948 2927 -1.09297 0.00930311 0.0342952 1 0 1 1 0 0 +EDGE2 2948 2947 -0.941675 0.0213232 -0.0391761 1 0 1 1 0 0 +EDGE2 2949 2928 -1.07534 0.0366002 0.0158868 1 0 1 1 0 0 +EDGE2 2949 2870 1.02994 -0.0281668 -3.10351 1 0 1 1 0 0 +EDGE2 2949 2930 1.04895 -0.114586 -0.0150805 1 0 1 1 0 0 +EDGE2 2949 2890 1.10804 0.0316168 -3.12305 1 0 1 1 0 0 +EDGE2 2949 2929 0.0353588 0.0805355 -0.0200345 1 0 1 1 0 0 +EDGE2 2949 2750 0.982192 0.0401209 -3.1532 1 0 1 1 0 0 +EDGE2 2949 2948 -1.00819 0.0449932 -0.00821513 1 0 1 1 0 0 +EDGE2 2950 2871 -0.0609221 -0.926203 -1.57825 1 0 1 1 0 0 +EDGE2 2950 2751 -0.0509942 -1.06586 -1.58783 1 0 1 1 0 0 +EDGE2 2950 2869 1.02901 0.0415738 -3.12868 1 0 1 1 0 0 +EDGE2 2950 2889 0.988713 0.129143 -3.13349 1 0 1 1 0 0 +EDGE2 2950 2870 -0.0565183 -0.0607824 -3.15046 1 0 1 1 0 0 +EDGE2 2950 2930 -0.00879769 0.00168869 0.00878355 1 0 1 1 0 0 +EDGE2 2950 2749 1.00826 0.075479 -3.1194 1 0 1 1 0 0 +EDGE2 2950 2890 0.0131584 0.0199866 -3.14223 1 0 1 1 0 0 +EDGE2 2950 2929 -0.984628 -0.0799471 1.22011e-05 1 0 1 1 0 0 +EDGE2 2950 2949 -1.054 0.0503625 -0.0215838 1 0 1 1 0 0 +EDGE2 2950 2750 -0.00773049 0.0164878 -3.13765 1 0 1 1 0 0 +EDGE2 2950 2891 -0.10357 0.951738 1.55306 1 0 1 1 0 0 +EDGE2 2950 2931 0.0269286 1.10192 1.58627 1 0 1 1 0 0 +EDGE2 2951 2872 0.967298 0.00601851 -0.0045429 1 0 1 1 0 0 +EDGE2 2951 2871 -0.0693396 0.0499651 0.0143614 1 0 1 1 0 0 +EDGE2 2951 2752 1.03782 0.0679991 -0.00909641 1 0 1 1 0 0 +EDGE2 2951 2751 0.0500152 0.0156845 0.00834194 1 0 1 1 0 0 +EDGE2 2951 2870 -0.972924 0.0491439 -1.59445 1 0 1 1 0 0 +EDGE2 2951 2930 -0.975478 0.0172821 1.5674 1 0 1 1 0 0 +EDGE2 2951 2950 -0.925288 0.0185044 1.56936 1 0 1 1 0 0 +EDGE2 2951 2890 -1.08061 0.073735 -1.56517 1 0 1 1 0 0 +EDGE2 2951 2750 -0.99489 -0.0814769 -1.55099 1 0 1 1 0 0 +EDGE2 2952 2872 0.000255065 0.0493561 -0.0398085 1 0 1 1 0 0 +EDGE2 2952 2753 1.01943 4.70868e-05 -0.0230458 1 0 1 1 0 0 +EDGE2 2952 2873 0.883752 -0.0195192 0.0352815 1 0 1 1 0 0 +EDGE2 2952 2871 -0.985048 -0.0299658 -0.0261675 1 0 1 1 0 0 +EDGE2 2952 2951 -0.979103 -0.0361399 0.0299047 1 0 1 1 0 0 +EDGE2 2952 2752 0.0389415 -0.0256102 -0.0101117 1 0 1 1 0 0 +EDGE2 2952 2751 -0.973564 -0.0339267 -0.0153967 1 0 1 1 0 0 +EDGE2 2953 2754 1.03565 -0.045925 -0.00713411 1 0 1 1 0 0 +EDGE2 2953 2874 0.94766 0.0345658 0.00726066 1 0 1 1 0 0 +EDGE2 2953 2872 -1.02138 -0.0632599 -0.0089532 1 0 1 1 0 0 +EDGE2 2953 2753 0.0709984 0.0903396 0.0225286 1 0 1 1 0 0 +EDGE2 2953 2873 0.0195665 -0.0277122 -0.0235944 1 0 1 1 0 0 +EDGE2 2953 2952 -1.034 -0.00370278 -0.0122619 1 0 1 1 0 0 +EDGE2 2953 2752 -0.952354 0.0428836 0.0365889 1 0 1 1 0 0 +EDGE2 2954 2875 0.942641 0.00350984 -0.0250377 1 0 1 1 0 0 +EDGE2 2954 2754 -0.0468865 0.0245005 -0.000406709 1 0 1 1 0 0 +EDGE2 2954 2874 -0.00234111 0.0362364 0.00868695 1 0 1 1 0 0 +EDGE2 2954 2755 1.0006 0.0138534 0.014213 1 0 1 1 0 0 +EDGE2 2954 2753 -1.00393 0.021342 -0.028787 1 0 1 1 0 0 +EDGE2 2954 2873 -1.04537 0.0685373 -0.00380028 1 0 1 1 0 0 +EDGE2 2954 2953 -0.963917 0.139678 -0.0258514 1 0 1 1 0 0 +EDGE2 2955 2875 -0.0348541 -0.016574 -0.00607422 1 0 1 1 0 0 +EDGE2 2955 2876 -0.023017 0.990451 1.59676 1 0 1 1 0 0 +EDGE2 2955 2756 0.0453304 0.932953 1.57293 1 0 1 1 0 0 +EDGE2 2955 2754 -0.949734 0.000114317 3.29429e-05 1 0 1 1 0 0 +EDGE2 2955 2874 -0.988226 -0.0492822 0.0289451 1 0 1 1 0 0 +EDGE2 2955 2954 -1.01467 0.0114718 0.00052414 1 0 1 1 0 0 +EDGE2 2955 2755 0.0059196 0.0711168 -0.0010259 1 0 1 1 0 0 +EDGE2 2956 2875 -0.919945 -0.107824 -1.56152 1 0 1 1 0 0 +EDGE2 2956 2877 0.989094 -0.00253206 -0.0380012 1 0 1 1 0 0 +EDGE2 2956 2757 1.10677 -0.00505775 -0.0194347 1 0 1 1 0 0 +EDGE2 2956 2876 0.059978 -0.0151275 -0.00291555 1 0 1 1 0 0 +EDGE2 2956 2756 0.0224225 0.0474717 -1.63281e-05 1 0 1 1 0 0 +EDGE2 2956 2955 -0.964023 0.00158314 -1.58473 1 0 1 1 0 0 +EDGE2 2956 2755 -0.929678 -0.0956218 -1.56057 1 0 1 1 0 0 +EDGE2 2957 2956 -1.03823 -0.0480632 -0.0219744 1 0 1 1 0 0 +EDGE2 2957 2878 1.02026 -0.0573953 0.000896682 1 0 1 1 0 0 +EDGE2 2957 2877 -0.0497253 -0.0141394 -0.0127787 1 0 1 1 0 0 +EDGE2 2957 2758 1.00896 0.0233845 0.00737735 1 0 1 1 0 0 +EDGE2 2957 2757 -0.0321909 -0.0150734 -0.043673 1 0 1 1 0 0 +EDGE2 2957 2876 -0.958265 -0.00829729 0.000890016 1 0 1 1 0 0 +EDGE2 2957 2756 -0.942083 0.00193301 -0.0229905 1 0 1 1 0 0 +EDGE2 2958 2878 0.0199706 -0.0364156 0.0236408 1 0 1 1 0 0 +EDGE2 2958 2759 0.96349 -0.0500673 0.0261141 1 0 1 1 0 0 +EDGE2 2958 2879 1.0636 0.0147786 -0.0229409 1 0 1 1 0 0 +EDGE2 2958 2877 -1.02244 0.00182945 0.00638714 1 0 1 1 0 0 +EDGE2 2958 2957 -1.05344 0.0237982 0.0123216 1 0 1 1 0 0 +EDGE2 2958 2758 0.109999 -0.0187427 -0.0139943 1 0 1 1 0 0 +EDGE2 2958 2757 -0.983229 -0.0272778 0.00319992 1 0 1 1 0 0 +EDGE2 2959 2760 1.00748 -0.0457483 0.00116975 1 0 1 1 0 0 +EDGE2 2959 2860 0.968069 -0.0581301 -3.09777 1 0 1 1 0 0 +EDGE2 2959 2880 0.999087 0.0276089 0.00344412 1 0 1 1 0 0 +EDGE2 2959 2780 0.927758 -0.0120253 -3.16208 1 0 1 1 0 0 +EDGE2 2959 2620 0.981229 -0.0187452 -3.15095 1 0 1 1 0 0 +EDGE2 2959 2680 1.01412 0.107155 -3.15424 1 0 1 1 0 0 +EDGE2 2959 2700 1.00849 -0.0535741 -3.1387 1 0 1 1 0 0 +EDGE2 2959 2878 -1.01102 -0.000327764 0.014732 1 0 1 1 0 0 +EDGE2 2959 2759 0.102658 0.0586562 0.0211609 1 0 1 1 0 0 +EDGE2 2959 2879 -0.007575 -0.0128868 -0.00388639 1 0 1 1 0 0 +EDGE2 2959 2958 -1.0165 0.0139642 -0.0187812 1 0 1 1 0 0 +EDGE2 2959 2758 -0.940565 -0.0363462 0.00340551 1 0 1 1 0 0 +EDGE2 2960 2699 1.03141 -0.00575919 -3.14343 1 0 1 1 0 0 +EDGE2 2960 2859 0.888619 -0.0566487 -3.15926 1 0 1 1 0 0 +EDGE2 2960 2779 1.04225 -0.0537008 -3.14079 1 0 1 1 0 0 +EDGE2 2960 2619 1.06719 -0.0321175 -3.15276 1 0 1 1 0 0 +EDGE2 2960 2679 1.00902 -0.00717935 -3.14433 1 0 1 1 0 0 +EDGE2 2960 2760 -0.0211946 0.0533178 0.0140053 1 0 1 1 0 0 +EDGE2 2960 2681 -0.0213086 -0.972814 -1.58511 1 0 1 1 0 0 +EDGE2 2960 2761 -0.0533834 -0.963871 -1.57786 1 0 1 1 0 0 +EDGE2 2960 2781 -0.0144083 -0.920966 -1.56529 1 0 1 1 0 0 +EDGE2 2960 2621 -0.0586031 -1.04936 -1.55298 1 0 1 1 0 0 +EDGE2 2960 2860 0.0788926 0.0224201 -3.14917 1 0 1 1 0 0 +EDGE2 2960 2880 -0.0763004 -0.0628843 -0.00244725 1 0 1 1 0 0 +EDGE2 2960 2780 0.00743088 -0.0913463 -3.1549 1 0 1 1 0 0 +EDGE2 2960 2620 -0.000347751 0.0169951 -3.17592 1 0 1 1 0 0 +EDGE2 2960 2680 -0.039289 0.0484291 -3.11396 1 0 1 1 0 0 +EDGE2 2960 2700 0.032485 0.059039 -3.13547 1 0 1 1 0 0 +EDGE2 2960 2701 -0.101446 1.00073 1.5999 1 0 1 1 0 0 +EDGE2 2960 2861 0.0390064 0.931687 1.58588 1 0 1 1 0 0 +EDGE2 2960 2881 -0.059353 1.00151 1.56351 1 0 1 1 0 0 +EDGE2 2960 2759 -0.985908 0.000338574 -0.0214277 1 0 1 1 0 0 +EDGE2 2960 2879 -0.961386 0.0363646 0.0205638 1 0 1 1 0 0 +EDGE2 2960 2959 -0.983224 0.02131 0.0045029 1 0 1 1 0 0 +EDGE2 2961 2760 -0.94249 -0.0745802 -1.56323 1 0 1 1 0 0 +EDGE2 2961 2860 -1.0956 -0.0341179 1.58419 1 0 1 1 0 0 +EDGE2 2961 2880 -0.984856 -0.00769242 -1.56026 1 0 1 1 0 0 +EDGE2 2961 2960 -0.942999 0.0364139 -1.57895 1 0 1 1 0 0 +EDGE2 2961 2780 -0.966994 -0.0119907 1.57897 1 0 1 1 0 0 +EDGE2 2961 2620 -0.937953 -0.0611736 1.58295 1 0 1 1 0 0 +EDGE2 2961 2680 -1.03837 -0.0423342 1.56282 1 0 1 1 0 0 +EDGE2 2961 2700 -1.00277 0.0207119 1.5626 1 0 1 1 0 0 +EDGE2 2961 2701 0.0168541 0.0229041 0.0104198 1 0 1 1 0 0 +EDGE2 2961 2861 -0.0480591 0.0472651 -0.00730196 1 0 1 1 0 0 +EDGE2 2961 2881 -0.0369628 -0.0863548 -0.0115695 1 0 1 1 0 0 +EDGE2 2961 2702 1.02646 0.0389885 0.0155543 1 0 1 1 0 0 +EDGE2 2961 2862 1.0015 -0.00108368 0.0083989 1 0 1 1 0 0 +EDGE2 2961 2882 1.02017 -0.00174139 0.00840212 1 0 1 1 0 0 +EDGE2 2962 2961 -1.07763 0.0519404 0.00991546 1 0 1 1 0 0 +EDGE2 2962 2701 -0.892244 0.00500587 -0.0193818 1 0 1 1 0 0 +EDGE2 2962 2861 -1.13865 0.0315152 -0.00460726 1 0 1 1 0 0 +EDGE2 2962 2881 -1.05297 -0.0307072 0.0127266 1 0 1 1 0 0 +EDGE2 2962 2702 0.0536065 -0.0239086 0.0108813 1 0 1 1 0 0 +EDGE2 2962 2862 -0.00174808 0.120536 -0.0231313 1 0 1 1 0 0 +EDGE2 2962 2882 0.00615831 -0.0495978 0.0101553 1 0 1 1 0 0 +EDGE2 2962 2703 1.0593 -0.00827847 -0.0397375 1 0 1 1 0 0 +EDGE2 2962 2863 0.94151 -0.0122655 0.0219242 1 0 1 1 0 0 +EDGE2 2962 2883 0.928411 -0.00402426 -0.0100377 1 0 1 1 0 0 +EDGE2 2963 2962 -0.988515 -0.0123151 0.00617007 1 0 1 1 0 0 +EDGE2 2963 2702 -1.02095 -0.0129163 -0.00231346 1 0 1 1 0 0 +EDGE2 2963 2862 -1.00032 0.0178855 -0.0404724 1 0 1 1 0 0 +EDGE2 2963 2882 -0.972929 -0.0514716 0.0166759 1 0 1 1 0 0 +EDGE2 2963 2703 -0.0198345 0.0375908 0.0303661 1 0 1 1 0 0 +EDGE2 2963 2863 0.0182693 -0.0653576 0.0240968 1 0 1 1 0 0 +EDGE2 2963 2883 0.00664127 -0.00496913 0.0011899 1 0 1 1 0 0 +EDGE2 2963 2704 1.04859 0.0305521 0.0493387 1 0 1 1 0 0 +EDGE2 2963 2864 0.917173 -0.0985134 -0.0093535 1 0 1 1 0 0 +EDGE2 2963 2884 0.968529 -0.0358599 -0.0258524 1 0 1 1 0 0 +EDGE2 2964 2963 -0.885948 0.0558508 0.0484898 1 0 1 1 0 0 +EDGE2 2964 2703 -1.03773 -0.107239 -0.00208148 1 0 1 1 0 0 +EDGE2 2964 2863 -1.00059 -0.0941605 0.0135572 1 0 1 1 0 0 +EDGE2 2964 2883 -1.0464 -0.0392266 -0.0528364 1 0 1 1 0 0 +EDGE2 2964 2704 -0.0682516 0.025741 -0.0390819 1 0 1 1 0 0 +EDGE2 2964 2864 -0.0431246 -0.0697964 0.00397962 1 0 1 1 0 0 +EDGE2 2964 2884 -0.0108629 -0.0187034 0.0300143 1 0 1 1 0 0 +EDGE2 2964 2705 1.01046 0.0899273 -0.00311415 1 0 1 1 0 0 +EDGE2 2964 2865 0.994208 -0.0163372 -0.0350896 1 0 1 1 0 0 +EDGE2 2964 2885 1.07468 0.0417071 -0.0234088 1 0 1 1 0 0 +EDGE2 2964 2745 0.927548 -0.0545435 -3.14239 1 0 1 1 0 0 +EDGE2 2965 2964 -0.958882 0.0194591 0.0615051 1 0 1 1 0 0 +EDGE2 2965 2704 -1.06985 0.061552 0.00914728 1 0 1 1 0 0 +EDGE2 2965 2864 -0.996496 -0.00454528 0.0130026 1 0 1 1 0 0 +EDGE2 2965 2884 -1.00486 0.0031035 -0.00189604 1 0 1 1 0 0 +EDGE2 2965 2706 0.0942519 -0.980365 -1.60134 1 0 1 1 0 0 +EDGE2 2965 2705 0.0171898 -0.018835 -0.0284219 1 0 1 1 0 0 +EDGE2 2965 2865 0.0244471 0.00776619 -0.000163557 1 0 1 1 0 0 +EDGE2 2965 2885 0.0929639 0.0369511 0.0243674 1 0 1 1 0 0 +EDGE2 2965 2745 -0.0224303 0.0556717 -3.12577 1 0 1 1 0 0 +EDGE2 2965 2746 -0.00364336 1.01407 1.56345 1 0 1 1 0 0 +EDGE2 2965 2866 0.0341091 1.00198 1.58204 1 0 1 1 0 0 +EDGE2 2965 2886 -0.000389 1.13741 1.54983 1 0 1 1 0 0 +EDGE2 2965 2744 1.10067 0.0234456 -3.1048 1 0 1 1 0 0 +EDGE2 2966 2706 0.0450693 -0.0210178 0.00945488 1 0 1 1 0 0 +EDGE2 2966 2707 1.00925 -0.0766449 0.00309926 1 0 1 1 0 0 +EDGE2 2966 2705 -0.981948 0.00749882 1.55314 1 0 1 1 0 0 +EDGE2 2966 2865 -1.04911 -0.0398341 1.59389 1 0 1 1 0 0 +EDGE2 2966 2885 -1.04105 0.0966175 1.60743 1 0 1 1 0 0 +EDGE2 2966 2965 -1.04079 -0.0067037 1.56928 1 0 1 1 0 0 +EDGE2 2966 2745 -0.979075 0.0227018 -1.59104 1 0 1 1 0 0 +EDGE2 2967 2706 -0.945217 0.0218827 0.0243355 1 0 1 1 0 0 +EDGE2 2967 2707 0.0390158 0.0365401 -0.011037 1 0 1 1 0 0 +EDGE2 2967 2708 1.03602 -0.059599 0.00539933 1 0 1 1 0 0 +EDGE2 2967 2966 -0.938756 -0.0134427 0.0221873 1 0 1 1 0 0 +EDGE2 2968 2709 0.967564 -0.0262405 -0.0329353 1 0 1 1 0 0 +EDGE2 2968 2707 -1.1021 -0.0178503 0.00203483 1 0 1 1 0 0 +EDGE2 2968 2967 -1.05865 -0.0658519 0.0391699 1 0 1 1 0 0 +EDGE2 2968 2708 0.0834142 -0.0255477 -0.0149628 1 0 1 1 0 0 +EDGE2 2969 2710 1.03832 -0.0163979 0.0293238 1 0 1 1 0 0 +EDGE2 2969 2968 -0.98191 0.0011442 0.0171804 1 0 1 1 0 0 +EDGE2 2969 2709 -0.0616257 -0.0287457 0.00875824 1 0 1 1 0 0 +EDGE2 2969 2708 -0.990031 0.0799092 -0.012645 1 0 1 1 0 0 +EDGE2 2970 2711 -0.0041126 0.977786 1.56362 1 0 1 1 0 0 +EDGE2 2970 2710 -0.0336452 0.0284324 0.00879808 1 0 1 1 0 0 +EDGE2 2970 2969 -0.939076 0.0187293 0.0126014 1 0 1 1 0 0 +EDGE2 2970 2709 -1.05161 0.0781523 -0.0236717 1 0 1 1 0 0 +EDGE2 2971 2970 -0.961848 -0.0238982 1.58164 1 0 1 1 0 0 +EDGE2 2971 2710 -1.07867 -0.0503786 1.57265 1 0 1 1 0 0 +EDGE2 2972 2971 -1.00945 0.0625325 0.0355261 1 0 1 1 0 0 +EDGE2 2973 2972 -1.0038 0.00911579 -0.0216447 1 0 1 1 0 0 +EDGE2 2974 2973 -0.983067 -0.0784001 0.00990003 1 0 1 1 0 0 +EDGE2 2974 2775 1.02005 -0.00526091 -3.15366 1 0 1 1 0 0 +EDGE2 2974 2855 0.962447 0.0730431 -3.16428 1 0 1 1 0 0 +EDGE2 2974 2615 1.01775 -0.0865293 -3.12648 1 0 1 1 0 0 +EDGE2 2974 2675 0.98315 -0.0470148 -3.1375 1 0 1 1 0 0 +EDGE2 2974 2695 1.06684 -0.119989 -3.13315 1 0 1 1 0 0 +EDGE2 2975 2854 1.03992 -0.032557 -3.1519 1 0 1 1 0 0 +EDGE2 2975 2775 0.027236 0.0540269 -3.15532 1 0 1 1 0 0 +EDGE2 2975 2674 0.978244 0.00308495 -3.16127 1 0 1 1 0 0 +EDGE2 2975 2694 0.917113 -0.038409 -3.15302 1 0 1 1 0 0 +EDGE2 2975 2774 1.10367 -0.0871657 -3.12086 1 0 1 1 0 0 +EDGE2 2975 2614 0.972491 0.0597676 -3.16322 1 0 1 1 0 0 +EDGE2 2975 2855 0.017111 0.0530796 -3.14651 1 0 1 1 0 0 +EDGE2 2975 2615 -0.0130908 -0.061121 -3.17023 1 0 1 1 0 0 +EDGE2 2975 2675 0.0186613 0.0273159 -3.14712 1 0 1 1 0 0 +EDGE2 2975 2695 0.00119076 0.000239488 -3.13201 1 0 1 1 0 0 +EDGE2 2975 2974 -0.971956 0.0415815 -0.000349687 1 0 1 1 0 0 +EDGE2 2975 2676 -0.0279748 -1.02626 -1.58669 1 0 1 1 0 0 +EDGE2 2975 2776 0.00217535 -1.04114 -1.5959 1 0 1 1 0 0 +EDGE2 2975 2856 -0.0408904 -1.07909 -1.56958 1 0 1 1 0 0 +EDGE2 2975 2696 0.0333315 -0.998526 -1.55782 1 0 1 1 0 0 +EDGE2 2975 2616 -0.00915981 -1.00578 -1.56343 1 0 1 1 0 0 +EDGE2 2976 2775 -0.967843 -0.000744924 1.55411 1 0 1 1 0 0 +EDGE2 2976 2975 -1.02216 0.0232867 -1.53778 1 0 1 1 0 0 +EDGE2 2976 2855 -0.918349 0.0186672 1.59031 1 0 1 1 0 0 +EDGE2 2976 2615 -0.932181 -0.0372978 1.56796 1 0 1 1 0 0 +EDGE2 2976 2675 -0.916251 -0.05395 1.56794 1 0 1 1 0 0 +EDGE2 2976 2695 -0.980934 0.0655081 1.53836 1 0 1 1 0 0 +EDGE2 2977 2976 -1.0205 -0.00564491 -0.00752433 1 0 1 1 0 0 +EDGE2 2978 2977 -0.954344 -0.00508814 0.0047269 1 0 1 1 0 0 +EDGE2 2979 1220 1.04055 -0.0255178 -3.14532 1 0 1 1 0 0 +EDGE2 2979 2480 1.10618 -0.0518485 -3.15531 1 0 1 1 0 0 +EDGE2 2979 720 0.972137 0.0108501 -3.14625 1 0 1 1 0 0 +EDGE2 2979 2978 -1.00998 -0.00267883 0.00517113 1 0 1 1 0 0 +EDGE2 2980 2479 1.00176 -0.00842147 -3.12814 1 0 1 1 0 0 +EDGE2 2980 719 1.02387 -0.00498827 -3.12079 1 0 1 1 0 0 +EDGE2 2980 1219 1.06786 -0.0404744 -3.13391 1 0 1 1 0 0 +EDGE2 2980 1221 0.0741987 -0.941137 -1.58766 1 0 1 1 0 0 +EDGE2 2980 2481 0.0405262 -0.942024 -1.57495 1 0 1 1 0 0 +EDGE2 2980 1220 -0.00985117 -0.0620292 -3.13836 1 0 1 1 0 0 +EDGE2 2980 2480 -0.0313349 -0.0168644 -3.13152 1 0 1 1 0 0 +EDGE2 2980 720 0.00950837 0.0536188 -3.1498 1 0 1 1 0 0 +EDGE2 2980 721 0.0201918 1.01288 1.58597 1 0 1 1 0 0 +EDGE2 2980 2979 -1.03737 0.0509255 -0.0203784 1 0 1 1 0 0 +EDGE2 2981 1221 -0.0313757 0.00433393 0.00870217 1 0 1 1 0 0 +EDGE2 2981 1222 1.0626 0.0785766 -0.0141999 1 0 1 1 0 0 +EDGE2 2981 2482 0.992207 -0.0380017 -0.0109584 1 0 1 1 0 0 +EDGE2 2981 2481 0.0341914 0.0326993 -0.00135733 1 0 1 1 0 0 +EDGE2 2981 1220 -0.971754 -0.0224252 -1.60648 1 0 1 1 0 0 +EDGE2 2981 2480 -0.877573 0.0865394 -1.54798 1 0 1 1 0 0 +EDGE2 2981 2980 -0.968858 0.00729501 1.54547 1 0 1 1 0 0 +EDGE2 2981 720 -1.02407 -0.0306099 -1.59153 1 0 1 1 0 0 +EDGE2 2982 1221 -1.06381 0.0383245 -0.00222046 1 0 1 1 0 0 +EDGE2 2982 1223 1.04197 -0.00923996 0.029088 1 0 1 1 0 0 +EDGE2 2982 2483 0.933759 -0.0212442 -0.0114693 1 0 1 1 0 0 +EDGE2 2982 1222 -0.0272589 -0.032169 0.0147611 1 0 1 1 0 0 +EDGE2 2982 2482 -0.00897834 0.0197325 0.0317308 1 0 1 1 0 0 +EDGE2 2982 2981 -0.944311 -0.0735005 -0.0103963 1 0 1 1 0 0 +EDGE2 2982 2481 -1.06842 -0.0389573 0.0211437 1 0 1 1 0 0 +EDGE2 2983 1223 -0.0147703 -0.0423914 0.0145257 1 0 1 1 0 0 +EDGE2 2983 1224 1.03528 0.0272037 0.0111937 1 0 1 1 0 0 +EDGE2 2983 2484 0.986785 0.062443 0.0193472 1 0 1 1 0 0 +EDGE2 2983 2483 -0.0366397 0.0915067 -0.012845 1 0 1 1 0 0 +EDGE2 2983 1222 -0.974343 -0.0189405 -0.00196087 1 0 1 1 0 0 +EDGE2 2983 2982 -0.995065 -0.0532754 -0.0308067 1 0 1 1 0 0 +EDGE2 2983 2482 -1.04633 0.0357082 -0.0002439 1 0 1 1 0 0 +EDGE2 2984 2645 0.967836 0.0303905 -3.17497 1 0 1 1 0 0 +EDGE2 2984 2665 1.02247 -0.0685178 -3.16435 1 0 1 1 0 0 +EDGE2 2984 1225 0.951965 0.0183404 -0.0167113 1 0 1 1 0 0 +EDGE2 2984 2485 0.933234 0.0102567 0.00968423 1 0 1 1 0 0 +EDGE2 2984 2505 0.946135 -0.0230937 -3.14176 1 0 1 1 0 0 +EDGE2 2984 2605 1.07129 0.0149303 -3.11515 1 0 1 1 0 0 +EDGE2 2984 2445 0.981983 0.0010807 -3.16054 1 0 1 1 0 0 +EDGE2 2984 1223 -1.09616 0.0475952 0.022648 1 0 1 1 0 0 +EDGE2 2984 1224 0.0327768 0.0954402 -0.00477212 1 0 1 1 0 0 +EDGE2 2984 2484 -0.0120022 0.0494955 -0.00710155 1 0 1 1 0 0 +EDGE2 2984 2983 -0.957036 0.0446948 -0.00620508 1 0 1 1 0 0 +EDGE2 2984 2483 -1.01244 -0.0187075 0.0233306 1 0 1 1 0 0 +EDGE2 2985 2446 0.0690957 0.929224 1.56244 1 0 1 1 0 0 +EDGE2 2985 2486 -0.0200654 0.959635 1.63513 1 0 1 1 0 0 +EDGE2 2985 1226 0.00863033 0.949685 1.53584 1 0 1 1 0 0 +EDGE2 2985 2666 0.0516388 -1.00994 -1.5654 1 0 1 1 0 0 +EDGE2 2985 2645 -0.149945 -0.00990223 -3.14828 1 0 1 1 0 0 +EDGE2 2985 2444 1.04734 0.00694231 -3.11876 1 0 1 1 0 0 +EDGE2 2985 2604 0.977727 -0.0269406 -3.11226 1 0 1 1 0 0 +EDGE2 2985 2644 1.06472 0.0427249 -3.10953 1 0 1 1 0 0 +EDGE2 2985 2664 0.997214 -0.115491 -3.15412 1 0 1 1 0 0 +EDGE2 2985 2504 1.09277 0.0575852 -3.16334 1 0 1 1 0 0 +EDGE2 2985 2665 0.0177224 -0.00195903 -3.19202 1 0 1 1 0 0 +EDGE2 2985 1225 0.0127206 -0.0387092 -0.0331782 1 0 1 1 0 0 +EDGE2 2985 2485 -0.0626914 0.0226109 0.0449134 1 0 1 1 0 0 +EDGE2 2985 2505 0.076907 -0.0440222 -3.16225 1 0 1 1 0 0 +EDGE2 2985 2605 -0.0103463 -0.0683577 -3.13612 1 0 1 1 0 0 +EDGE2 2985 2445 -0.0473287 0.00262537 -3.1357 1 0 1 1 0 0 +EDGE2 2985 1224 -0.943438 -0.0585248 -0.0146837 1 0 1 1 0 0 +EDGE2 2985 2984 -1.00327 0.034609 0.0238604 1 0 1 1 0 0 +EDGE2 2985 2484 -0.97527 -0.0485856 -0.00625578 1 0 1 1 0 0 +EDGE2 2985 2506 -0.0534431 -1.00347 -1.56764 1 0 1 1 0 0 +EDGE2 2985 2606 0.00638198 -1.00266 -1.55913 1 0 1 1 0 0 +EDGE2 2985 2646 -0.0541588 -0.980344 -1.5489 1 0 1 1 0 0 +EDGE2 2986 1227 0.961812 0.00659816 -0.00775254 1 0 1 1 0 0 +EDGE2 2986 2487 0.898075 -0.00985099 -0.00458336 1 0 1 1 0 0 +EDGE2 2986 2447 1.08911 -0.0612443 0.0171271 1 0 1 1 0 0 +EDGE2 2986 2446 -0.0531494 0.0718245 -0.00595378 1 0 1 1 0 0 +EDGE2 2986 2486 0.00646787 0.0231152 3.7851e-05 1 0 1 1 0 0 +EDGE2 2986 1226 -0.0281026 0.0137552 -0.00225054 1 0 1 1 0 0 +EDGE2 2986 2645 -0.994903 0.00689826 1.56271 1 0 1 1 0 0 +EDGE2 2986 2985 -0.997772 -0.0216346 -1.57793 1 0 1 1 0 0 +EDGE2 2986 2665 -0.948877 -0.0246095 1.58046 1 0 1 1 0 0 +EDGE2 2986 1225 -0.972283 -0.0582592 -1.54719 1 0 1 1 0 0 +EDGE2 2986 2485 -1.00962 0.0596944 -1.57248 1 0 1 1 0 0 +EDGE2 2986 2505 -1.04534 -0.0500576 1.56676 1 0 1 1 0 0 +EDGE2 2986 2605 -1.05151 0.018271 1.55088 1 0 1 1 0 0 +EDGE2 2986 2445 -0.943004 0.0123492 1.5953 1 0 1 1 0 0 +EDGE2 2987 2488 0.901735 0.0224798 -0.0137367 1 0 1 1 0 0 +EDGE2 2987 1228 1.08966 -0.0147498 -0.00481311 1 0 1 1 0 0 +EDGE2 2987 2448 0.987751 -0.0116744 0.042224 1 0 1 1 0 0 +EDGE2 2987 1227 -0.0764591 0.0274161 -0.0168766 1 0 1 1 0 0 +EDGE2 2987 2487 0.0430232 0.00678872 -0.00339399 1 0 1 1 0 0 +EDGE2 2987 2447 0.0350382 -0.0521758 0.0142355 1 0 1 1 0 0 +EDGE2 2987 2446 -0.981975 0.0501833 -0.00500356 1 0 1 1 0 0 +EDGE2 2987 2986 -1.0011 -0.0375182 0.0111608 1 0 1 1 0 0 +EDGE2 2987 2486 -0.901707 -0.0273716 -0.0050028 1 0 1 1 0 0 +EDGE2 2987 1226 -0.985624 -0.00348791 -0.0205383 1 0 1 1 0 0 +EDGE2 2988 2488 -0.00969648 -0.000322492 0.0131058 1 0 1 1 0 0 +EDGE2 2988 2449 1.07899 0.0597088 0.011525 1 0 1 1 0 0 +EDGE2 2988 2489 1.06396 0.0508338 0.048376 1 0 1 1 0 0 +EDGE2 2988 1229 1.04519 -0.00800102 -0.0239357 1 0 1 1 0 0 +EDGE2 2988 1228 0.021175 0.0382381 0.00317941 1 0 1 1 0 0 +EDGE2 2988 2448 0.000480253 -0.0961783 0.0153215 1 0 1 1 0 0 +EDGE2 2988 1227 -1.03562 -0.00140793 0.0258034 1 0 1 1 0 0 +EDGE2 2988 2487 -1.0704 0.0254739 -0.000724889 1 0 1 1 0 0 +EDGE2 2988 2987 -1.01736 0.0114051 -0.00643638 1 0 1 1 0 0 +EDGE2 2988 2447 -1.08858 -0.0789158 -0.00425339 1 0 1 1 0 0 +EDGE2 2989 1250 1.02993 0.0192078 -3.14464 1 0 1 1 0 0 +EDGE2 2989 2450 0.8885 0.0553844 0.0175328 1 0 1 1 0 0 +EDGE2 2989 2470 1.02348 0.0686035 -3.13934 1 0 1 1 0 0 +EDGE2 2989 2490 1.03094 0.0478169 -0.00297972 1 0 1 1 0 0 +EDGE2 2989 2290 1.04764 -0.076937 -3.10499 1 0 1 1 0 0 +EDGE2 2989 1230 1.05495 -0.00352877 0.010892 1 0 1 1 0 0 +EDGE2 2989 2488 -1.08505 0.0676637 0.0202441 1 0 1 1 0 0 +EDGE2 2989 2449 -0.0506817 -0.0267324 0.0281387 1 0 1 1 0 0 +EDGE2 2989 2489 -0.0425674 0.0319534 0.00832847 1 0 1 1 0 0 +EDGE2 2989 1229 0.0113624 -0.0322977 0.0156325 1 0 1 1 0 0 +EDGE2 2989 2988 -1.01663 0.0419492 -0.000244635 1 0 1 1 0 0 +EDGE2 2989 1228 -0.999834 0.0856498 -0.03074 1 0 1 1 0 0 +EDGE2 2989 2448 -0.986294 0.071169 0.00458226 1 0 1 1 0 0 +EDGE2 2990 2291 -0.0228669 -1.03767 -1.60121 1 0 1 1 0 0 +EDGE2 2990 2289 1.01352 -0.00221058 -3.13672 1 0 1 1 0 0 +EDGE2 2990 2469 0.950037 -0.0255328 -3.13779 1 0 1 1 0 0 +EDGE2 2990 2491 -0.0329893 -0.931078 -1.58979 1 0 1 1 0 0 +EDGE2 2990 2451 0.0642544 -0.99139 -1.53813 1 0 1 1 0 0 +EDGE2 2990 1249 1.06198 0.0183153 -3.12508 1 0 1 1 0 0 +EDGE2 2990 1250 -0.0374557 0.0112044 -3.10662 1 0 1 1 0 0 +EDGE2 2990 1231 -0.105983 -1.01056 -1.55952 1 0 1 1 0 0 +EDGE2 2990 1251 -0.00444354 -0.955278 -1.56563 1 0 1 1 0 0 +EDGE2 2990 2450 -0.0394707 0.0960375 0.00557502 1 0 1 1 0 0 +EDGE2 2990 2470 0.0394086 0.0294282 -3.18392 1 0 1 1 0 0 +EDGE2 2990 2490 -0.0441713 0.00961554 0.0070973 1 0 1 1 0 0 +EDGE2 2990 2290 0.0470074 -0.0996458 -3.13061 1 0 1 1 0 0 +EDGE2 2990 1230 0.0822284 -0.0880757 -0.0529405 1 0 1 1 0 0 +EDGE2 2990 2471 -0.0558887 1.07012 1.5762 1 0 1 1 0 0 +EDGE2 2990 2449 -1.04838 -0.0466137 -0.0210613 1 0 1 1 0 0 +EDGE2 2990 2989 -0.99621 0.0543219 -0.0239902 1 0 1 1 0 0 +EDGE2 2990 2489 -1.02222 0.090309 0.00191505 1 0 1 1 0 0 +EDGE2 2990 1229 -0.935931 -0.00488459 0.0134979 1 0 1 1 0 0 +EDGE2 2991 1250 -1.07208 0.0393923 1.56804 1 0 1 1 0 0 +EDGE2 2991 2990 -0.916875 0.0623759 -1.58038 1 0 1 1 0 0 +EDGE2 2991 2450 -1.08358 -0.0354044 -1.56565 1 0 1 1 0 0 +EDGE2 2991 2470 -1.04708 -0.0112066 1.56276 1 0 1 1 0 0 +EDGE2 2991 2490 -1.10114 -0.0982815 -1.60462 1 0 1 1 0 0 +EDGE2 2991 2290 -1.00023 -0.00633458 1.56642 1 0 1 1 0 0 +EDGE2 2991 1230 -1.07598 -0.0818597 -1.55667 1 0 1 1 0 0 +EDGE2 2991 2471 0.0125749 -0.0252572 0.00431398 1 0 1 1 0 0 +EDGE2 2991 2472 1.01766 -0.0103052 0.0137892 1 0 1 1 0 0 +EDGE2 2992 2991 -0.965387 -0.109883 0.00706957 1 0 1 1 0 0 +EDGE2 2992 2471 -0.941644 0.0292792 0.0325899 1 0 1 1 0 0 +EDGE2 2992 2472 0.122513 0.0757094 0.0109801 1 0 1 1 0 0 +EDGE2 2992 2473 0.961317 -0.0550556 0.0162061 1 0 1 1 0 0 +EDGE2 2993 2472 -0.987961 0.0676216 -0.0305195 1 0 1 1 0 0 +EDGE2 2993 2992 -0.92396 0.0455941 0.00496726 1 0 1 1 0 0 +EDGE2 2993 2473 -0.0239644 0.00666953 0.0123152 1 0 1 1 0 0 +EDGE2 2993 2474 0.983275 0.0238572 -0.00160375 1 0 1 1 0 0 +EDGE2 2994 2993 -1.0236 0.0503291 0.00886139 1 0 1 1 0 0 +EDGE2 2994 2475 0.966296 -0.0202971 0.0105338 1 0 1 1 0 0 +EDGE2 2994 2473 -0.969477 0.00693352 -0.03905 1 0 1 1 0 0 +EDGE2 2994 2474 -0.00838835 0.0501481 -0.0133559 1 0 1 1 0 0 +EDGE2 2994 715 1.0365 0.0929844 -3.12201 1 0 1 1 0 0 +EDGE2 2994 735 0.954059 -0.0502381 -3.16188 1 0 1 1 0 0 +EDGE2 2994 1215 0.997272 0.00358651 -3.16285 1 0 1 1 0 0 +EDGE2 2995 736 -0.0227062 -0.989619 -1.55769 1 0 1 1 0 0 +EDGE2 2995 2475 -0.055688 -0.0271032 -0.00858854 1 0 1 1 0 0 +EDGE2 2995 2994 -1.01992 -0.0483802 -0.00730962 1 0 1 1 0 0 +EDGE2 2995 2474 -1.09215 -0.0342409 -0.00991713 1 0 1 1 0 0 +EDGE2 2995 715 0.0371844 -0.0290246 -3.14551 1 0 1 1 0 0 +EDGE2 2995 735 0.0104412 0.0409841 -3.1618 1 0 1 1 0 0 +EDGE2 2995 1215 0.0943488 -0.0481109 -3.11611 1 0 1 1 0 0 +EDGE2 2995 734 0.971107 0.0561353 -3.11793 1 0 1 1 0 0 +EDGE2 2995 1214 1.00834 -0.00773073 -3.16267 1 0 1 1 0 0 +EDGE2 2995 714 1.00709 0.0561532 -3.18372 1 0 1 1 0 0 +EDGE2 2995 1216 0.0373796 0.940422 1.56251 1 0 1 1 0 0 +EDGE2 2995 2476 -0.0298395 1.01691 1.57355 1 0 1 1 0 0 +EDGE2 2995 716 0.0638162 1.02392 1.57746 1 0 1 1 0 0 +EDGE2 2996 2475 -0.941609 0.0576019 -1.59887 1 0 1 1 0 0 +EDGE2 2996 2995 -1.01634 -0.0318256 -1.58698 1 0 1 1 0 0 +EDGE2 2996 715 -1.03561 -0.0778693 1.57806 1 0 1 1 0 0 +EDGE2 2996 735 -0.954327 0.00679992 1.57553 1 0 1 1 0 0 +EDGE2 2996 1215 -1.06475 0.0617618 1.57264 1 0 1 1 0 0 +EDGE2 2996 1216 0.0143244 -0.0508912 -0.0333426 1 0 1 1 0 0 +EDGE2 2996 2476 -0.0681407 0.00596185 0.0368517 1 0 1 1 0 0 +EDGE2 2996 716 -0.0435213 -0.00531762 -0.0109826 1 0 1 1 0 0 +EDGE2 2996 1217 1.06564 -0.0310203 0.0201625 1 0 1 1 0 0 +EDGE2 2996 2477 1.06159 -0.0315091 -0.0112805 1 0 1 1 0 0 +EDGE2 2996 717 0.891772 -0.0518953 0.016819 1 0 1 1 0 0 +EDGE2 2997 1218 1.0202 -0.00393007 -0.0131606 1 0 1 1 0 0 +EDGE2 2997 1216 -1.02206 0.0199202 -0.0139157 1 0 1 1 0 0 +EDGE2 2997 2996 -0.952428 0.00401698 -0.0157803 1 0 1 1 0 0 +EDGE2 2997 2476 -0.888395 -0.0156303 -0.0223204 1 0 1 1 0 0 +EDGE2 2997 716 -1.04511 0.083744 0.0204726 1 0 1 1 0 0 +EDGE2 2997 1217 -0.0223571 0.0972733 -0.011717 1 0 1 1 0 0 +EDGE2 2997 2477 -0.0711285 -0.0443573 0.0351297 1 0 1 1 0 0 +EDGE2 2997 717 0.0249348 0.0131455 0.0136187 1 0 1 1 0 0 +EDGE2 2997 2478 0.944487 0.0109848 0.0147786 1 0 1 1 0 0 +EDGE2 2997 718 0.988129 0.0106763 0.0174175 1 0 1 1 0 0 +EDGE2 2998 1218 -0.00741426 -0.0303703 0.0212009 1 0 1 1 0 0 +EDGE2 2998 1217 -0.930623 -0.0071607 0.0149068 1 0 1 1 0 0 +EDGE2 2998 2477 -0.908158 0.0110458 -0.0512573 1 0 1 1 0 0 +EDGE2 2998 2997 -1.00708 -0.106064 0.0179294 1 0 1 1 0 0 +EDGE2 2998 717 -1.04348 0.132058 0.00409695 1 0 1 1 0 0 +EDGE2 2998 2478 0.0726735 0.00621832 -0.0504767 1 0 1 1 0 0 +EDGE2 2998 2479 1.03547 -0.054466 0.00171704 1 0 1 1 0 0 +EDGE2 2998 718 -0.0561726 -0.0790469 0.0140764 1 0 1 1 0 0 +EDGE2 2998 719 0.950598 0.0642266 0.00420602 1 0 1 1 0 0 +EDGE2 2998 1219 1.0126 -0.0702074 0.0296794 1 0 1 1 0 0 +EDGE2 2999 1218 -0.942357 -0.0358591 0.0180106 1 0 1 1 0 0 +EDGE2 2999 2998 -0.965776 0.0177975 -0.00664199 1 0 1 1 0 0 +EDGE2 2999 2478 -1.04371 0.0472838 -0.0131212 1 0 1 1 0 0 +EDGE2 2999 2479 0.0626572 0.0382045 -0.0102864 1 0 1 1 0 0 +EDGE2 2999 718 -0.965579 -0.0188711 0.00168208 1 0 1 1 0 0 +EDGE2 2999 719 -0.0533325 0.00526094 0.0372521 1 0 1 1 0 0 +EDGE2 2999 1219 -0.059329 0.0112557 0.00357799 1 0 1 1 0 0 +EDGE2 2999 1220 1.07552 0.0672971 0.0129958 1 0 1 1 0 0 +EDGE2 2999 2480 1.07676 -0.00219251 -0.00681745 1 0 1 1 0 0 +EDGE2 2999 2980 0.978283 -0.0216878 -3.11104 1 0 1 1 0 0 +EDGE2 2999 720 1.00535 0.027087 -0.0256432 1 0 1 1 0 0 +EDGE2 3000 2479 -1.08787 -0.0581847 -0.000855104 1 0 1 1 0 0 +EDGE2 3000 2999 -0.945374 0.0266075 -0.00127226 1 0 1 1 0 0 +EDGE2 3000 719 -0.971905 -0.134418 -0.0240752 1 0 1 1 0 0 +EDGE2 3000 1219 -1.0547 -0.000995709 -0.0180703 1 0 1 1 0 0 +EDGE2 3000 1221 -0.0751389 1.01639 1.5764 1 0 1 1 0 0 +EDGE2 3000 2981 0.0553605 0.955844 1.60637 1 0 1 1 0 0 +EDGE2 3000 2481 -0.0304038 0.957899 1.54985 1 0 1 1 0 0 +EDGE2 3000 1220 -0.0211391 -0.00143202 0.0164482 1 0 1 1 0 0 +EDGE2 3000 2480 0.0333199 -2.17313e-05 0.00313527 1 0 1 1 0 0 +EDGE2 3000 2980 0.00160022 -0.0077093 -3.14221 1 0 1 1 0 0 +EDGE2 3000 720 -0.0498871 0.010654 -0.0264937 1 0 1 1 0 0 +EDGE2 3000 721 0.0155534 -1.05458 -1.56579 1 0 1 1 0 0 +EDGE2 3000 2979 1.07946 0.0189748 -3.13839 1 0 1 1 0 0 +EDGE2 3001 3000 -0.970364 0.0390948 1.56367 1 0 1 1 0 0 +EDGE2 3001 1220 -0.932438 0.0203891 1.59142 1 0 1 1 0 0 +EDGE2 3001 2480 -1.11368 0.00941788 1.57159 1 0 1 1 0 0 +EDGE2 3001 2980 -1.04957 0.015487 -1.5467 1 0 1 1 0 0 +EDGE2 3001 720 -0.906632 0.0831996 1.57119 1 0 1 1 0 0 +EDGE2 3001 721 -0.00958457 -0.0258596 -0.00590877 1 0 1 1 0 0 +EDGE2 3001 722 0.943166 0.010489 -0.0192446 1 0 1 1 0 0 +EDGE2 3002 721 -1.04697 0.014135 0.0370294 1 0 1 1 0 0 +EDGE2 3002 3001 -1.07006 -0.004012 0.0194263 1 0 1 1 0 0 +EDGE2 3002 722 0.0381852 0.0551108 -0.00826952 1 0 1 1 0 0 +EDGE2 3002 723 0.934573 0.0107997 -0.0280165 1 0 1 1 0 0 +EDGE2 3003 722 -0.926559 -0.050759 0.0058013 1 0 1 1 0 0 +EDGE2 3003 3002 -0.966427 -0.0128488 0.023717 1 0 1 1 0 0 +EDGE2 3003 723 0.0459304 0.0181003 0.0138475 1 0 1 1 0 0 +EDGE2 3003 724 0.945078 -0.0410549 -0.00238971 1 0 1 1 0 0 +EDGE2 3004 723 -0.900565 -0.0110797 -0.0156058 1 0 1 1 0 0 +EDGE2 3004 3003 -1.0728 0.0158079 0.0437759 1 0 1 1 0 0 +EDGE2 3004 724 -0.0307314 0.071833 0.0166535 1 0 1 1 0 0 +EDGE2 3004 725 0.976231 -0.00428851 -0.000656556 1 0 1 1 0 0 +EDGE2 3005 3004 -0.910654 0.0210975 -0.0051522 1 0 1 1 0 0 +EDGE2 3005 724 -1.07236 0.123306 0.025438 1 0 1 1 0 0 +EDGE2 3005 726 -0.0751737 -1.06131 -1.57343 1 0 1 1 0 0 +EDGE2 3005 725 -0.0433134 -0.033679 -0.00757534 1 0 1 1 0 0 +EDGE2 3006 3005 -0.940868 0.00786502 -1.56248 1 0 1 1 0 0 +EDGE2 3006 725 -0.920567 -0.0669809 -1.58441 1 0 1 1 0 0 +EDGE2 3007 3006 -1.07555 -0.00352454 0.00474254 1 0 1 1 0 0 +EDGE2 3008 3007 -1.03329 0.0567766 0.0228827 1 0 1 1 0 0 +EDGE2 3009 3008 -0.993541 0.0811547 -0.00168831 1 0 1 1 0 0 +EDGE2 3009 2970 1.03768 0.0175723 -3.1348 1 0 1 1 0 0 +EDGE2 3009 2710 0.972921 0.00199252 -3.1531 1 0 1 1 0 0 +EDGE2 3010 2971 0.0910232 1.0502 1.55207 1 0 1 1 0 0 +EDGE2 3010 2711 0.0036063 -1.03154 -1.58285 1 0 1 1 0 0 +EDGE2 3010 3009 -0.978903 0.106241 0.0140117 1 0 1 1 0 0 +EDGE2 3010 2970 -0.0532269 0.0376889 -3.14206 1 0 1 1 0 0 +EDGE2 3010 2710 0.0210543 -0.104886 -3.11943 1 0 1 1 0 0 +EDGE2 3010 2969 1.0117 -0.0313888 -3.13982 1 0 1 1 0 0 +EDGE2 3010 2709 1.10139 0.0312487 -3.16626 1 0 1 1 0 0 +EDGE2 3011 2711 -0.0554414 -0.00659599 -0.0330832 1 0 1 1 0 0 +EDGE2 3011 2970 -1.06734 0.00693016 -1.56899 1 0 1 1 0 0 +EDGE2 3011 3010 -1.01223 -0.0546669 1.56554 1 0 1 1 0 0 +EDGE2 3011 2710 -1.03761 -0.0951105 -1.56875 1 0 1 1 0 0 +EDGE2 3011 2712 1.02993 -0.0348107 0.0180301 1 0 1 1 0 0 +EDGE2 3012 2711 -1.11015 -0.0579153 -0.0063849 1 0 1 1 0 0 +EDGE2 3012 3011 -0.98772 0.0491739 0.0120515 1 0 1 1 0 0 +EDGE2 3012 2713 0.898232 -0.0771773 0.0157382 1 0 1 1 0 0 +EDGE2 3012 2712 -0.00888998 -0.0365752 0.013859 1 0 1 1 0 0 +EDGE2 3013 3012 -1.08384 -0.0757696 0.0011411 1 0 1 1 0 0 +EDGE2 3013 2713 0.0962081 0.0176468 0.0151051 1 0 1 1 0 0 +EDGE2 3013 2712 -1.03565 -0.021054 -0.000138214 1 0 1 1 0 0 +EDGE2 3013 2714 1.00671 -0.0475124 0.0154536 1 0 1 1 0 0 +EDGE2 3014 2713 -1.01046 0.0368207 0.0166691 1 0 1 1 0 0 +EDGE2 3014 3013 -0.936591 -0.0242373 -0.0109794 1 0 1 1 0 0 +EDGE2 3014 2714 0.032063 -0.00461632 -0.000831744 1 0 1 1 0 0 +EDGE2 3014 2715 1.01889 0.00237127 0.0184801 1 0 1 1 0 0 +EDGE2 3015 3014 -1.01102 -0.0268967 -0.00109612 1 0 1 1 0 0 +EDGE2 3015 2714 -1.02813 -0.00481809 -0.00775035 1 0 1 1 0 0 +EDGE2 3015 2715 0.0512543 -0.0558038 0.0372279 1 0 1 1 0 0 +EDGE2 3015 2716 -0.0302486 0.980367 1.56262 1 0 1 1 0 0 +EDGE2 3016 2715 -1.08376 0.008975 1.58876 1 0 1 1 0 0 +EDGE2 3016 3015 -0.950477 0.0334934 1.56757 1 0 1 1 0 0 +EDGE2 3017 3016 -1.01763 0.0166361 0.00403119 1 0 1 1 0 0 +EDGE2 3018 3017 -1.08026 -0.00639789 0.0274569 1 0 1 1 0 0 +EDGE2 3019 3018 -1.01656 0.0170746 0.0251582 1 0 1 1 0 0 +EDGE2 3020 3019 -1.01679 0.0889718 -0.0249108 1 0 1 1 0 0 +EDGE2 3021 3020 -1.01848 0.0635242 -1.53638 1 0 1 1 0 0 +EDGE2 3022 3021 -0.974258 0.0270379 0.0141198 1 0 1 1 0 0 +EDGE2 3023 3022 -0.936524 -0.0455733 -0.0154358 1 0 1 1 0 0 +EDGE2 3024 3023 -0.996641 0.0549542 0.0396778 1 0 1 1 0 0 +EDGE2 3024 1145 0.958959 -0.075931 -3.11939 1 0 1 1 0 0 +EDGE2 3024 1105 1.05518 0.118973 -3.15608 1 0 1 1 0 0 +EDGE2 3024 1125 0.940629 0.101413 -3.15687 1 0 1 1 0 0 +EDGE2 3025 3024 -0.948498 0.105046 0.0253832 1 0 1 1 0 0 +EDGE2 3025 1126 0.00229494 -1.00854 -1.57175 1 0 1 1 0 0 +EDGE2 3025 1146 0.0203731 -0.985815 -1.55734 1 0 1 1 0 0 +EDGE2 3025 1106 -0.0559122 -1.01172 -1.59606 1 0 1 1 0 0 +EDGE2 3025 1145 -0.0307698 0.0433806 -3.11036 1 0 1 1 0 0 +EDGE2 3025 1105 -0.0584529 0.0142135 -3.16337 1 0 1 1 0 0 +EDGE2 3025 1125 -0.0269773 -0.0882034 -3.16319 1 0 1 1 0 0 +EDGE2 3025 1124 0.992632 0.00265282 -3.15708 1 0 1 1 0 0 +EDGE2 3025 1144 0.95812 0.00900659 -3.12534 1 0 1 1 0 0 +EDGE2 3025 1104 0.991977 -0.0929787 -3.11324 1 0 1 1 0 0 +EDGE2 3026 1127 1.03137 -0.0398058 0.00789779 1 0 1 1 0 0 +EDGE2 3026 1147 1.11049 -0.00890326 0.0469691 1 0 1 1 0 0 +EDGE2 3026 1107 1.06865 -0.0408514 0.0296323 1 0 1 1 0 0 +EDGE2 3026 1126 -0.0182843 -0.0937893 0.000671907 1 0 1 1 0 0 +EDGE2 3026 1146 0.037332 0.0157403 -0.0167679 1 0 1 1 0 0 +EDGE2 3026 1106 -0.0434545 0.0373401 -0.0227535 1 0 1 1 0 0 +EDGE2 3026 1145 -1.06445 -0.041733 -1.57721 1 0 1 1 0 0 +EDGE2 3026 3025 -0.921199 -0.00855994 1.60159 1 0 1 1 0 0 +EDGE2 3026 1105 -0.946273 0.0349951 -1.55934 1 0 1 1 0 0 +EDGE2 3026 1125 -0.961007 -0.0295282 -1.59542 1 0 1 1 0 0 +EDGE2 3027 1108 0.97122 0.022018 0.00643691 1 0 1 1 0 0 +EDGE2 3027 1128 1.00667 -0.038186 -0.00264715 1 0 1 1 0 0 +EDGE2 3027 1148 0.965113 0.0330072 0.000492431 1 0 1 1 0 0 +EDGE2 3027 1127 -0.0401249 0.00445944 0.0110771 1 0 1 1 0 0 +EDGE2 3027 1147 -0.0189302 0.00289255 0.030296 1 0 1 1 0 0 +EDGE2 3027 1107 -0.0265539 0.00305582 -0.0295926 1 0 1 1 0 0 +EDGE2 3027 1126 -1.0301 0.0617673 0.038068 1 0 1 1 0 0 +EDGE2 3027 1146 -1.02229 0.0742934 0.0142172 1 0 1 1 0 0 +EDGE2 3027 3026 -1.01344 -0.0704517 0.00877678 1 0 1 1 0 0 +EDGE2 3027 1106 -1.06383 0.0237514 -0.00143748 1 0 1 1 0 0 +EDGE2 3028 3027 -1.01606 0.00961975 0.0312049 1 0 1 1 0 0 +EDGE2 3028 1109 0.992087 0.0193695 -0.00544837 1 0 1 1 0 0 +EDGE2 3028 1149 1.10727 0.0449172 -0.00938622 1 0 1 1 0 0 +EDGE2 3028 1129 1.02886 0.0259063 0.00469324 1 0 1 1 0 0 +EDGE2 3028 1108 0.0434811 0.109746 -0.0111086 1 0 1 1 0 0 +EDGE2 3028 1128 0.0108384 0.0640043 -0.00148589 1 0 1 1 0 0 +EDGE2 3028 1148 -0.0874228 -0.142528 -0.0144574 1 0 1 1 0 0 +EDGE2 3028 1127 -0.94142 0.0804724 0.0158853 1 0 1 1 0 0 +EDGE2 3028 1147 -0.976798 0.0166828 -0.0167575 1 0 1 1 0 0 +EDGE2 3028 1107 -1.03252 -0.0607155 0.0121523 1 0 1 1 0 0 +EDGE2 3029 1130 1.02307 0.080497 0.0104859 1 0 1 1 0 0 +EDGE2 3029 1170 1.025 -0.0364355 -3.16989 1 0 1 1 0 0 +EDGE2 3029 1190 0.982196 -0.0173291 -3.14333 1 0 1 1 0 0 +EDGE2 3029 1150 0.911636 0.00383781 -0.0100091 1 0 1 1 0 0 +EDGE2 3029 1110 0.966245 -0.0197439 0.0136581 1 0 1 1 0 0 +EDGE2 3029 1109 -0.056035 -0.124386 -0.0250635 1 0 1 1 0 0 +EDGE2 3029 1149 -0.0411742 -0.099841 -0.0176898 1 0 1 1 0 0 +EDGE2 3029 1129 0.0688077 0.0454851 0.0136251 1 0 1 1 0 0 +EDGE2 3029 3028 -0.930716 -0.0256022 0.0356338 1 0 1 1 0 0 +EDGE2 3029 1108 -1.0204 -0.0442699 -0.0134383 1 0 1 1 0 0 +EDGE2 3029 1128 -0.956482 0.0525291 0.00177363 1 0 1 1 0 0 +EDGE2 3029 1148 -0.950985 -0.0312642 0.0101702 1 0 1 1 0 0 +EDGE2 3030 1189 1.07355 0.0194019 -3.12452 1 0 1 1 0 0 +EDGE2 3030 1169 1.02606 -0.0615475 -3.13698 1 0 1 1 0 0 +EDGE2 3030 1151 0.0799935 -0.989183 -1.58253 1 0 1 1 0 0 +EDGE2 3030 1191 -0.0312989 -0.920208 -1.58607 1 0 1 1 0 0 +EDGE2 3030 1171 0.103334 -0.995922 -1.56703 1 0 1 1 0 0 +EDGE2 3030 1130 -0.0989277 0.0347078 -0.00174717 1 0 1 1 0 0 +EDGE2 3030 1170 0.0154297 -0.0537736 -3.1399 1 0 1 1 0 0 +EDGE2 3030 1190 -0.054923 0.0713489 -3.14041 1 0 1 1 0 0 +EDGE2 3030 1150 -0.0564035 0.00866644 -0.0139717 1 0 1 1 0 0 +EDGE2 3030 1110 0.0529487 0.0609084 -0.05178 1 0 1 1 0 0 +EDGE2 3030 1109 -1.05853 0.0947883 0.00143972 1 0 1 1 0 0 +EDGE2 3030 1149 -1.01001 -0.00960997 -0.0172492 1 0 1 1 0 0 +EDGE2 3030 3029 -0.960184 -0.0114166 -0.00732516 1 0 1 1 0 0 +EDGE2 3030 1129 -1.02719 -0.0420713 0.008058 1 0 1 1 0 0 +EDGE2 3030 1111 -0.0172615 0.930544 1.57182 1 0 1 1 0 0 +EDGE2 3030 1131 -0.0543723 0.943043 1.5565 1 0 1 1 0 0 +EDGE2 3031 1130 -0.926169 -0.013916 -1.57334 1 0 1 1 0 0 +EDGE2 3031 1170 -0.991083 0.0083878 1.59524 1 0 1 1 0 0 +EDGE2 3031 1190 -0.91769 -0.0839155 1.57421 1 0 1 1 0 0 +EDGE2 3031 3030 -1.03258 -0.0204639 -1.54369 1 0 1 1 0 0 +EDGE2 3031 1150 -0.956633 0.0199194 -1.56545 1 0 1 1 0 0 +EDGE2 3031 1110 -0.969713 0.0186837 -1.59361 1 0 1 1 0 0 +EDGE2 3031 1111 -0.035923 0.0171136 0.0309078 1 0 1 1 0 0 +EDGE2 3031 1131 -0.0284761 0.0601778 -0.0158699 1 0 1 1 0 0 +EDGE2 3031 1112 0.920335 -0.024117 -0.00517051 1 0 1 1 0 0 +EDGE2 3031 1132 0.973888 -0.01516 0.0096882 1 0 1 1 0 0 +EDGE2 3032 1133 1.03529 -0.0581342 0.0169889 1 0 1 1 0 0 +EDGE2 3032 1111 -0.988244 -0.0050378 0.0375078 1 0 1 1 0 0 +EDGE2 3032 3031 -1.00995 -0.0184763 0.00501308 1 0 1 1 0 0 +EDGE2 3032 1131 -0.954285 0.0513803 -0.0182644 1 0 1 1 0 0 +EDGE2 3032 1112 0.0351917 -0.048659 -0.0476235 1 0 1 1 0 0 +EDGE2 3032 1132 0.00649837 0.0228879 -0.0174001 1 0 1 1 0 0 +EDGE2 3032 1113 1.03809 -0.0572665 0.0115441 1 0 1 1 0 0 +EDGE2 3033 1133 -0.0273256 0.00514117 0.00238762 1 0 1 1 0 0 +EDGE2 3033 1112 -1.02375 -0.0824306 -0.00923655 1 0 1 1 0 0 +EDGE2 3033 1132 -1.04422 -0.0553036 -0.0259745 1 0 1 1 0 0 +EDGE2 3033 3032 -0.986625 -0.0541856 0.0129546 1 0 1 1 0 0 +EDGE2 3033 1113 0.089249 0.0146094 0.00243683 1 0 1 1 0 0 +EDGE2 3033 1134 0.8738 0.00366726 -0.00386231 1 0 1 1 0 0 +EDGE2 3033 1114 0.971513 0.0155876 0.0187715 1 0 1 1 0 0 +EDGE2 3034 1133 -1.05737 0.0655713 0.00878763 1 0 1 1 0 0 +EDGE2 3034 3033 -0.984425 -0.0246621 -0.00454266 1 0 1 1 0 0 +EDGE2 3034 1113 -0.958127 0.0101675 0.0153759 1 0 1 1 0 0 +EDGE2 3034 1134 0.00592006 -0.0226095 0.0249702 1 0 1 1 0 0 +EDGE2 3034 1114 -0.0555375 0.0405396 0.0519164 1 0 1 1 0 0 +EDGE2 3034 1095 1.03824 -0.061426 -3.1739 1 0 1 1 0 0 +EDGE2 3034 1115 1.013 0.0329315 -0.0328165 1 0 1 1 0 0 +EDGE2 3034 1135 1.00438 0.0656325 -0.0375591 1 0 1 1 0 0 +EDGE2 3035 1134 -0.995914 -0.0622661 0.0247458 1 0 1 1 0 0 +EDGE2 3035 3034 -0.992855 -0.0407167 0.00553797 1 0 1 1 0 0 +EDGE2 3035 1114 -1.03607 0.0644346 -0.00475213 1 0 1 1 0 0 +EDGE2 3035 1095 0.0247148 -0.0142478 -3.13264 1 0 1 1 0 0 +EDGE2 3035 1115 -0.0940664 -0.00448047 -0.0149803 1 0 1 1 0 0 +EDGE2 3035 1135 0.0194213 0.0505606 0.00661287 1 0 1 1 0 0 +EDGE2 3035 1094 0.992018 0.067869 -3.12983 1 0 1 1 0 0 +EDGE2 3035 1116 0.0034206 1.01887 1.59424 1 0 1 1 0 0 +EDGE2 3035 1136 0.0271305 1.06483 1.55289 1 0 1 1 0 0 +EDGE2 3035 1096 -0.0450623 0.986557 1.55379 1 0 1 1 0 0 +EDGE2 3036 3035 -0.943682 0.00344364 -1.56498 1 0 1 1 0 0 +EDGE2 3036 1095 -0.950639 -0.00113082 1.56313 1 0 1 1 0 0 +EDGE2 3036 1115 -1.04945 -0.0311628 -1.55741 1 0 1 1 0 0 +EDGE2 3036 1135 -1.01956 -0.0308525 -1.57632 1 0 1 1 0 0 +EDGE2 3036 1116 0.0115861 0.0166542 -0.0374681 1 0 1 1 0 0 +EDGE2 3036 1136 -0.003378 -0.00660252 0.00998471 1 0 1 1 0 0 +EDGE2 3036 1096 -0.0971154 0.00147977 0.00974298 1 0 1 1 0 0 +EDGE2 3036 1097 1.01259 -0.0169534 0.0114596 1 0 1 1 0 0 +EDGE2 3036 1137 1.00084 -0.0608885 0.0214782 1 0 1 1 0 0 +EDGE2 3036 1117 1.06279 0.0100864 0.0338176 1 0 1 1 0 0 +EDGE2 3037 1118 0.913343 0.171759 -0.00548669 1 0 1 1 0 0 +EDGE2 3037 1116 -1.00352 -0.00129986 -0.00827908 1 0 1 1 0 0 +EDGE2 3037 3036 -1.04868 -0.146269 0.0161135 1 0 1 1 0 0 +EDGE2 3037 1136 -0.979257 0.0190304 0.0117248 1 0 1 1 0 0 +EDGE2 3037 1096 -0.977299 0.0624026 0.000146092 1 0 1 1 0 0 +EDGE2 3037 1097 -0.055762 0.0126061 -0.0321432 1 0 1 1 0 0 +EDGE2 3037 1137 0.116418 0.0969026 -0.00352059 1 0 1 1 0 0 +EDGE2 3037 1117 0.0413382 0.00745999 -0.00820869 1 0 1 1 0 0 +EDGE2 3037 1138 1.04695 0.0884059 0.00559548 1 0 1 1 0 0 +EDGE2 3037 1098 1.01743 0.024671 0.00369346 1 0 1 1 0 0 +EDGE2 3038 1118 0.00833734 0.0202703 -0.0033879 1 0 1 1 0 0 +EDGE2 3038 1097 -1.06053 0.0302997 0.0103746 1 0 1 1 0 0 +EDGE2 3038 1137 -1.05113 0.00275842 0.00112728 1 0 1 1 0 0 +EDGE2 3038 3037 -0.987792 0.017904 0.011696 1 0 1 1 0 0 +EDGE2 3038 1117 -1.05238 -0.0458971 -0.0144852 1 0 1 1 0 0 +EDGE2 3038 1138 -0.0236947 0.0939479 0.000980925 1 0 1 1 0 0 +EDGE2 3038 1139 1.01738 0.00692462 -0.0193465 1 0 1 1 0 0 +EDGE2 3038 1098 -0.0289555 -0.03229 0.0151101 1 0 1 1 0 0 +EDGE2 3038 1099 1.06213 0.125886 0.0188851 1 0 1 1 0 0 +EDGE2 3038 1119 0.96639 -0.084607 -0.00697897 1 0 1 1 0 0 +EDGE2 3039 1118 -0.933203 -0.00613918 -0.0121601 1 0 1 1 0 0 +EDGE2 3039 3038 -1.00058 0.0220854 0.0165631 1 0 1 1 0 0 +EDGE2 3039 1138 -1.01358 0.00517974 0.00848251 1 0 1 1 0 0 +EDGE2 3039 1139 -0.0783548 0.0181574 0.00510571 1 0 1 1 0 0 +EDGE2 3039 1098 -1.01 -0.0803538 -0.0210851 1 0 1 1 0 0 +EDGE2 3039 1099 0.0233326 -0.0578746 0.0161111 1 0 1 1 0 0 +EDGE2 3039 1119 0.0364307 -0.0216498 0.0071773 1 0 1 1 0 0 +EDGE2 3039 1100 0.938892 0.0379198 -0.0137158 1 0 1 1 0 0 +EDGE2 3039 1140 0.891884 0.0448667 -0.0267833 1 0 1 1 0 0 +EDGE2 3039 1120 1.00671 -0.0511669 -0.00322735 1 0 1 1 0 0 +EDGE2 3040 1139 -0.915607 -0.157333 -0.0199085 1 0 1 1 0 0 +EDGE2 3040 3039 -1.01996 0.0955717 -0.0308285 1 0 1 1 0 0 +EDGE2 3040 1099 -1.06218 -0.0387013 0.00814607 1 0 1 1 0 0 +EDGE2 3040 1119 -0.943697 0.0450158 -0.0286627 1 0 1 1 0 0 +EDGE2 3040 1121 -0.0271248 0.998826 1.56559 1 0 1 1 0 0 +EDGE2 3040 1141 0.0798918 0.97973 1.56867 1 0 1 1 0 0 +EDGE2 3040 1101 0.0162454 0.968702 1.56241 1 0 1 1 0 0 +EDGE2 3040 1100 -0.0925779 -0.107701 0.0193537 1 0 1 1 0 0 +EDGE2 3040 1140 -0.0219881 -0.112834 0.001821 1 0 1 1 0 0 +EDGE2 3040 1120 0.0202719 0.0669435 -0.00114757 1 0 1 1 0 0 +EDGE2 3041 1102 0.941072 0.00827445 -0.000884906 1 0 1 1 0 0 +EDGE2 3041 1122 0.923364 -0.0322121 -0.0126002 1 0 1 1 0 0 +EDGE2 3041 1142 1.04774 0.0626599 -0.0310314 1 0 1 1 0 0 +EDGE2 3041 1121 0.0061249 0.0556035 0.00802587 1 0 1 1 0 0 +EDGE2 3041 1141 0.054407 -0.0579178 0.038057 1 0 1 1 0 0 +EDGE2 3041 1101 0.0831065 0.016773 -0.00547449 1 0 1 1 0 0 +EDGE2 3041 1100 -0.996203 -0.0614387 -1.54939 1 0 1 1 0 0 +EDGE2 3041 1140 -0.929613 0.029144 -1.55437 1 0 1 1 0 0 +EDGE2 3041 3040 -1.03999 0.0136908 -1.54129 1 0 1 1 0 0 +EDGE2 3041 1120 -0.903231 0.0383318 -1.57591 1 0 1 1 0 0 +EDGE2 3042 1123 0.955002 -0.0135247 -0.0271201 1 0 1 1 0 0 +EDGE2 3042 1143 0.95209 -0.00492564 0.0292776 1 0 1 1 0 0 +EDGE2 3042 1103 1.07625 0.00996055 -0.024951 1 0 1 1 0 0 +EDGE2 3042 1102 0.0282877 -0.0177352 0.0147878 1 0 1 1 0 0 +EDGE2 3042 1122 0.0295316 -0.00949979 0.00294016 1 0 1 1 0 0 +EDGE2 3042 1142 0.0564411 0.0219371 0.00900578 1 0 1 1 0 0 +EDGE2 3042 1121 -0.968302 -0.0774542 0.015376 1 0 1 1 0 0 +EDGE2 3042 3041 -0.977207 -0.0885745 -0.0525154 1 0 1 1 0 0 +EDGE2 3042 1141 -1.07351 -0.00615756 0.00159596 1 0 1 1 0 0 +EDGE2 3042 1101 -0.940546 -0.0158752 0.0096927 1 0 1 1 0 0 +EDGE2 3043 1123 -0.101711 0.0708582 -0.0230766 1 0 1 1 0 0 +EDGE2 3043 1124 0.980849 -0.141808 0.0279212 1 0 1 1 0 0 +EDGE2 3043 1144 1.02661 -0.0362528 -0.0180885 1 0 1 1 0 0 +EDGE2 3043 1104 0.927611 0.00070537 0.0182644 1 0 1 1 0 0 +EDGE2 3043 1143 0.0909508 0.0243546 0.0124911 1 0 1 1 0 0 +EDGE2 3043 3042 -1.00401 -0.0534109 -0.000894919 1 0 1 1 0 0 +EDGE2 3043 1103 0.0475418 0.0749784 -0.00566595 1 0 1 1 0 0 +EDGE2 3043 1102 -1.03308 -0.0351153 -0.0252307 1 0 1 1 0 0 +EDGE2 3043 1122 -0.936251 -0.0348272 0.0109609 1 0 1 1 0 0 +EDGE2 3043 1142 -1.00134 -0.0160903 -0.00856194 1 0 1 1 0 0 +EDGE2 3044 1123 -0.923962 0.0464861 0.0167357 1 0 1 1 0 0 +EDGE2 3044 1145 1.02829 -0.0276495 -0.0242865 1 0 1 1 0 0 +EDGE2 3044 3025 0.997016 0.0618451 -3.14788 1 0 1 1 0 0 +EDGE2 3044 1105 0.969383 0.00746806 -0.0148558 1 0 1 1 0 0 +EDGE2 3044 1125 0.894565 -0.0204959 -0.00428417 1 0 1 1 0 0 +EDGE2 3044 1124 -0.0365584 0.0558826 0.000283918 1 0 1 1 0 0 +EDGE2 3044 1144 -0.0507787 -0.0329003 0.0128126 1 0 1 1 0 0 +EDGE2 3044 1104 0.0495668 -0.0649814 -0.00614168 1 0 1 1 0 0 +EDGE2 3044 3043 -1.08739 0.060256 0.0059947 1 0 1 1 0 0 +EDGE2 3044 1143 -1.0402 0.0443378 -0.00851128 1 0 1 1 0 0 +EDGE2 3044 1103 -0.926203 0.0971324 0.00901822 1 0 1 1 0 0 +EDGE2 3045 3024 1.03107 -0.094264 -3.13176 1 0 1 1 0 0 +EDGE2 3045 1126 -0.0797879 1.06583 1.57273 1 0 1 1 0 0 +EDGE2 3045 1146 -0.0931442 0.892092 1.57756 1 0 1 1 0 0 +EDGE2 3045 3026 0.0421663 0.934193 1.56713 1 0 1 1 0 0 +EDGE2 3045 1106 -0.00316886 1.02842 1.56626 1 0 1 1 0 0 +EDGE2 3045 1145 0.0527308 0.0389432 -0.0159946 1 0 1 1 0 0 +EDGE2 3045 3025 0.00310333 0.0130284 -3.10767 1 0 1 1 0 0 +EDGE2 3045 1105 -0.0417517 0.0078191 -0.00241868 1 0 1 1 0 0 +EDGE2 3045 1125 -0.00578996 0.0306426 0.00255877 1 0 1 1 0 0 +EDGE2 3045 1124 -1.00567 0.025366 -0.00446876 1 0 1 1 0 0 +EDGE2 3045 1144 -1.06079 0.0394709 -0.0103026 1 0 1 1 0 0 +EDGE2 3045 3044 -1.02779 0.0152199 0.00332287 1 0 1 1 0 0 +EDGE2 3045 1104 -1.05586 -0.0036673 -0.00183993 1 0 1 1 0 0 +EDGE2 3046 3027 0.931649 0.0232815 0.0148592 1 0 1 1 0 0 +EDGE2 3046 1127 1.00939 -0.0478597 -0.0127127 1 0 1 1 0 0 +EDGE2 3046 1147 0.985608 0.0228137 -0.0330828 1 0 1 1 0 0 +EDGE2 3046 1107 1.00143 -0.0238286 0.0507098 1 0 1 1 0 0 +EDGE2 3046 1126 -0.0190279 0.0200303 0.011226 1 0 1 1 0 0 +EDGE2 3046 1146 -0.050372 -0.0259231 -0.0222308 1 0 1 1 0 0 +EDGE2 3046 3026 -0.0819688 -0.00591529 -0.0524055 1 0 1 1 0 0 +EDGE2 3046 1106 -0.0372199 0.0259981 -0.0296387 1 0 1 1 0 0 +EDGE2 3046 1145 -1.05053 0.111102 -1.54124 1 0 1 1 0 0 +EDGE2 3046 3045 -0.931801 -0.00578687 -1.54055 1 0 1 1 0 0 +EDGE2 3046 3025 -0.963522 -0.0837599 1.60731 1 0 1 1 0 0 +EDGE2 3046 1105 -1.00683 -0.0952923 -1.57284 1 0 1 1 0 0 +EDGE2 3046 1125 -0.978598 0.00162579 -1.5626 1 0 1 1 0 0 +EDGE2 3047 3027 0.0293434 -0.0954219 0.00195066 1 0 1 1 0 0 +EDGE2 3047 3028 0.954288 0.0804789 -0.0041118 1 0 1 1 0 0 +EDGE2 3047 1108 1.02399 -0.0313828 -0.00353867 1 0 1 1 0 0 +EDGE2 3047 1128 0.936387 0.0144999 0.00755603 1 0 1 1 0 0 +EDGE2 3047 1148 1.04036 -0.00394177 0.0131154 1 0 1 1 0 0 +EDGE2 3047 1127 0.0666253 0.0826049 0.0215742 1 0 1 1 0 0 +EDGE2 3047 1147 -0.0446211 -0.0620548 0.00678971 1 0 1 1 0 0 +EDGE2 3047 1107 0.0624248 -0.027588 0.0488496 1 0 1 1 0 0 +EDGE2 3047 3046 -0.983005 -0.0530968 -0.0139265 1 0 1 1 0 0 +EDGE2 3047 1126 -1.08875 -0.0169969 0.014706 1 0 1 1 0 0 +EDGE2 3047 1146 -1.01092 0.0209277 0.00363206 1 0 1 1 0 0 +EDGE2 3047 3026 -1.03433 -0.0271508 0.000765307 1 0 1 1 0 0 +EDGE2 3047 1106 -0.954907 0.104141 0.00961525 1 0 1 1 0 0 +EDGE2 3048 3027 -1.06178 0.123787 0.00564543 1 0 1 1 0 0 +EDGE2 3048 1109 1.06216 0.00231239 -0.0170026 1 0 1 1 0 0 +EDGE2 3048 1149 1.02728 0.0216549 0.0115311 1 0 1 1 0 0 +EDGE2 3048 3029 0.949445 -0.0327039 0.00306034 1 0 1 1 0 0 +EDGE2 3048 1129 1.00193 0.0345762 -0.0424645 1 0 1 1 0 0 +EDGE2 3048 3028 0.044621 -0.0628231 -0.0382556 1 0 1 1 0 0 +EDGE2 3048 1108 -0.00446849 0.066222 0.00243661 1 0 1 1 0 0 +EDGE2 3048 1128 -0.0267004 -0.0133563 0.00505134 1 0 1 1 0 0 +EDGE2 3048 1148 0.000123704 -0.0503782 -0.0061395 1 0 1 1 0 0 +EDGE2 3048 3047 -0.941857 0.0506452 -0.0111052 1 0 1 1 0 0 +EDGE2 3048 1127 -0.973012 0.0446646 -0.0179873 1 0 1 1 0 0 +EDGE2 3048 1147 -0.99394 0.0311895 -0.0114004 1 0 1 1 0 0 +EDGE2 3048 1107 -0.940662 0.00448364 0.0101174 1 0 1 1 0 0 +EDGE2 3049 3048 -1.01133 -0.0613064 0.017419 1 0 1 1 0 0 +EDGE2 3049 1130 1.03821 0.0240507 -0.00612849 1 0 1 1 0 0 +EDGE2 3049 1170 0.974529 -0.0730865 -3.13641 1 0 1 1 0 0 +EDGE2 3049 1190 0.999947 -0.0159061 -3.18167 1 0 1 1 0 0 +EDGE2 3049 3030 1.01889 0.0243157 -0.0125411 1 0 1 1 0 0 +EDGE2 3049 1150 1.08435 -0.000939947 0.0222907 1 0 1 1 0 0 +EDGE2 3049 1110 0.85182 -0.00786729 -0.0134298 1 0 1 1 0 0 +EDGE2 3049 1109 -0.0169135 0.0568976 0.0152168 1 0 1 1 0 0 +EDGE2 3049 1149 -0.0204933 0.0501573 0.00800148 1 0 1 1 0 0 +EDGE2 3049 3029 -0.0436801 0.0343764 -0.0255111 1 0 1 1 0 0 +EDGE2 3049 1129 0.0186647 0.0201051 -0.0142306 1 0 1 1 0 0 +EDGE2 3049 3028 -0.992892 -0.060413 0.0151696 1 0 1 1 0 0 +EDGE2 3049 1108 -0.997731 -0.114532 -0.00293117 1 0 1 1 0 0 +EDGE2 3049 1128 -0.988346 0.0295333 -0.0373603 1 0 1 1 0 0 +EDGE2 3049 1148 -0.956656 0.0569556 0.0312369 1 0 1 1 0 0 +EDGE2 3050 1189 0.907336 -0.0261852 -3.15024 1 0 1 1 0 0 +EDGE2 3050 1169 1.02196 -0.036589 -3.12289 1 0 1 1 0 0 +EDGE2 3050 1151 0.00703949 -1.00116 -1.5521 1 0 1 1 0 0 +EDGE2 3050 1191 0.0384241 -0.914757 -1.60836 1 0 1 1 0 0 +EDGE2 3050 1171 -0.00419981 -1.00208 -1.5745 1 0 1 1 0 0 +EDGE2 3050 1130 -0.0110157 0.0130926 0.00642257 1 0 1 1 0 0 +EDGE2 3050 1170 0.0142484 0.105089 -3.13312 1 0 1 1 0 0 +EDGE2 3050 1190 -0.0276418 -0.0343393 -3.15331 1 0 1 1 0 0 +EDGE2 3050 3030 0.150505 0.0305083 0.0171566 1 0 1 1 0 0 +EDGE2 3050 1150 0.0518698 0.00521375 -0.00629201 1 0 1 1 0 0 +EDGE2 3050 1110 0.0197152 0.0354796 0.00174329 1 0 1 1 0 0 +EDGE2 3050 1109 -1.08833 0.00657179 -0.00122882 1 0 1 1 0 0 +EDGE2 3050 1149 -1.0203 0.000211895 0.0147669 1 0 1 1 0 0 +EDGE2 3050 3029 -1.06916 0.0236663 0.0167017 1 0 1 1 0 0 +EDGE2 3050 3049 -1.08707 0.0486816 0.0378709 1 0 1 1 0 0 +EDGE2 3050 1129 -0.965557 0.0187485 -0.00513664 1 0 1 1 0 0 +EDGE2 3050 1111 0.0258097 0.987083 1.59481 1 0 1 1 0 0 +EDGE2 3050 3031 0.0285446 0.987164 1.59095 1 0 1 1 0 0 +EDGE2 3050 1131 0.0399016 0.907097 1.60407 1 0 1 1 0 0 +EDGE2 3051 3050 -0.929472 -0.0268906 -1.57063 1 0 1 1 0 0 +EDGE2 3051 1130 -0.887784 -0.0184884 -1.57322 1 0 1 1 0 0 +EDGE2 3051 1170 -1.02938 0.0434284 1.54776 1 0 1 1 0 0 +EDGE2 3051 1190 -1.03515 -0.0236514 1.57857 1 0 1 1 0 0 +EDGE2 3051 3030 -0.995408 0.023199 -1.56166 1 0 1 1 0 0 +EDGE2 3051 1150 -1.03099 0.0241611 -1.5823 1 0 1 1 0 0 +EDGE2 3051 1110 -1.04448 0.0414822 -1.54892 1 0 1 1 0 0 +EDGE2 3051 1111 0.0224559 -0.100209 0.0398612 1 0 1 1 0 0 +EDGE2 3051 3031 -0.0137583 -0.0345416 0.0382984 1 0 1 1 0 0 +EDGE2 3051 1131 -0.0573054 0.077299 0.00926393 1 0 1 1 0 0 +EDGE2 3051 1112 1.01864 -0.0782976 0.00265154 1 0 1 1 0 0 +EDGE2 3051 1132 1.05969 -0.00368827 -0.00563579 1 0 1 1 0 0 +EDGE2 3051 3032 0.993763 0.0557244 0.00888461 1 0 1 1 0 0 +EDGE2 3052 1133 1.01171 -0.0627118 0.00184686 1 0 1 1 0 0 +EDGE2 3052 1111 -1.04052 -0.0596161 -0.0204038 1 0 1 1 0 0 +EDGE2 3052 3031 -0.961055 0.0707214 -0.00240476 1 0 1 1 0 0 +EDGE2 3052 3051 -0.982148 0.0381141 -0.0035873 1 0 1 1 0 0 +EDGE2 3052 1131 -0.97948 0.00424638 -0.0125643 1 0 1 1 0 0 +EDGE2 3052 1112 0.017259 0.0251287 -0.0164603 1 0 1 1 0 0 +EDGE2 3052 1132 -0.0459052 -0.0575499 0.0205798 1 0 1 1 0 0 +EDGE2 3052 3032 -0.0410573 0.00642054 0.0257655 1 0 1 1 0 0 +EDGE2 3052 3033 1.06462 0.0143937 -0.0287579 1 0 1 1 0 0 +EDGE2 3052 1113 1.03293 0.0151466 -0.00350994 1 0 1 1 0 0 +EDGE2 3053 1133 -0.0166371 -0.0600402 0.00641114 1 0 1 1 0 0 +EDGE2 3053 3052 -1.0093 0.0511757 0.0209041 1 0 1 1 0 0 +EDGE2 3053 1112 -1.03548 -0.0229691 0.00335094 1 0 1 1 0 0 +EDGE2 3053 1132 -0.979215 -0.0472439 0.0175405 1 0 1 1 0 0 +EDGE2 3053 3032 -0.928356 0.0347027 0.0280918 1 0 1 1 0 0 +EDGE2 3053 3033 -0.0141581 -0.0384506 -0.00706249 1 0 1 1 0 0 +EDGE2 3053 1113 0.0505106 0.00781498 -0.0203566 1 0 1 1 0 0 +EDGE2 3053 1134 0.98365 0.0179661 -0.0062283 1 0 1 1 0 0 +EDGE2 3053 3034 0.962421 0.0887399 -0.0162772 1 0 1 1 0 0 +EDGE2 3053 1114 1.03771 -0.0423763 -0.00499591 1 0 1 1 0 0 +EDGE2 3054 1133 -0.995445 0.00650677 -0.00464462 1 0 1 1 0 0 +EDGE2 3054 3053 -0.872707 0.0318457 0.0170987 1 0 1 1 0 0 +EDGE2 3054 3033 -0.939588 0.0213138 0.0334317 1 0 1 1 0 0 +EDGE2 3054 1113 -1.01416 0.0667424 -0.012847 1 0 1 1 0 0 +EDGE2 3054 1134 -0.0785369 -0.0129207 -0.00335702 1 0 1 1 0 0 +EDGE2 3054 3034 -0.0344365 -0.0345169 0.00538518 1 0 1 1 0 0 +EDGE2 3054 1114 0.0830661 -0.0469926 0.00775827 1 0 1 1 0 0 +EDGE2 3054 3035 1.01856 0.0549326 0.0414228 1 0 1 1 0 0 +EDGE2 3054 1095 0.971292 0.0793856 -3.17255 1 0 1 1 0 0 +EDGE2 3054 1115 1.01968 -0.0318833 -0.0157224 1 0 1 1 0 0 +EDGE2 3054 1135 0.964816 -0.033129 0.0195645 1 0 1 1 0 0 +EDGE2 3055 1134 -0.90444 -0.0101049 0.00941255 1 0 1 1 0 0 +EDGE2 3055 3034 -1.04677 0.0260393 -0.0253518 1 0 1 1 0 0 +EDGE2 3055 3054 -0.947398 0.0146088 -0.00950881 1 0 1 1 0 0 +EDGE2 3055 1114 -0.993721 -0.127413 0.0303606 1 0 1 1 0 0 +EDGE2 3055 3035 -0.0412391 -0.01819 0.027046 1 0 1 1 0 0 +EDGE2 3055 1095 0.0746111 0.0137486 -3.14428 1 0 1 1 0 0 +EDGE2 3055 1115 -0.0418029 0.022969 0.00480275 1 0 1 1 0 0 +EDGE2 3055 1135 -0.000388307 -0.0438026 0.0184036 1 0 1 1 0 0 +EDGE2 3055 1094 1.01414 -0.0143486 -3.1114 1 0 1 1 0 0 +EDGE2 3055 1116 -0.0635885 0.93638 1.55228 1 0 1 1 0 0 +EDGE2 3055 3036 -0.0882334 1.04 1.54494 1 0 1 1 0 0 +EDGE2 3055 1136 0.0232598 1.00729 1.59815 1 0 1 1 0 0 +EDGE2 3055 1096 0.00918463 0.973042 1.56274 1 0 1 1 0 0 +EDGE2 3056 3035 -0.949349 0.0838519 1.54512 1 0 1 1 0 0 +EDGE2 3056 3055 -0.907032 -0.0918042 1.58088 1 0 1 1 0 0 +EDGE2 3056 1095 -1.01211 0.0370418 -1.61987 1 0 1 1 0 0 +EDGE2 3056 1115 -0.972966 0.0287545 1.57429 1 0 1 1 0 0 +EDGE2 3056 1135 -0.960953 -0.0143981 1.60274 1 0 1 1 0 0 +EDGE2 3057 3056 -1.06661 -0.013874 0.0180635 1 0 1 1 0 0 +EDGE2 3058 3057 -0.986596 0.0479624 -0.0227862 1 0 1 1 0 0 +EDGE2 3059 1080 0.93044 0.0493226 -3.12715 1 0 1 1 0 0 +EDGE2 3059 3058 -1.03958 -0.0167875 0.00515353 1 0 1 1 0 0 +EDGE2 3060 1079 0.922252 0.102731 -3.12377 1 0 1 1 0 0 +EDGE2 3060 1080 -0.0363129 0.0723394 -3.16701 1 0 1 1 0 0 +EDGE2 3060 1081 -0.00397575 1.02455 1.55777 1 0 1 1 0 0 +EDGE2 3060 3059 -1.03734 0.0334322 -0.00375644 1 0 1 1 0 0 +EDGE2 3061 3060 -0.982859 -0.0253789 1.60079 1 0 1 1 0 0 +EDGE2 3061 1080 -1.1742 -0.0880958 -1.59741 1 0 1 1 0 0 +EDGE2 3062 3061 -1.05326 0.0176529 0.00989325 1 0 1 1 0 0 +EDGE2 3063 3062 -0.991883 -0.112389 0.00458893 1 0 1 1 0 0 +EDGE2 3064 1185 1.05249 -0.00161844 -3.14966 1 0 1 1 0 0 +EDGE2 3064 1165 0.991516 0.0255964 -3.12518 1 0 1 1 0 0 +EDGE2 3064 3063 -1.02205 0.000183535 0.00969213 1 0 1 1 0 0 +EDGE2 3065 1184 0.971234 0.00657272 -3.13331 1 0 1 1 0 0 +EDGE2 3065 1164 1.06237 -0.0244457 -3.11398 1 0 1 1 0 0 +EDGE2 3065 1185 0.0487287 0.018083 -3.15695 1 0 1 1 0 0 +EDGE2 3065 1165 0.004775 -0.0558089 -3.16052 1 0 1 1 0 0 +EDGE2 3065 1166 -0.000866551 -1.03729 -1.57429 1 0 1 1 0 0 +EDGE2 3065 1186 0.0238252 -0.979933 -1.55301 1 0 1 1 0 0 +EDGE2 3065 3064 -0.952247 0.0136743 0.0262571 1 0 1 1 0 0 +EDGE2 3066 1185 -0.998104 -0.067982 1.58078 1 0 1 1 0 0 +EDGE2 3066 3065 -1.00378 0.00370588 -1.56311 1 0 1 1 0 0 +EDGE2 3066 1165 -0.957218 0.137314 1.56517 1 0 1 1 0 0 +EDGE2 3067 3066 -1.04554 -0.0455984 0.00181002 1 0 1 1 0 0 +EDGE2 3068 3067 -1.03629 -0.0225694 -0.0112732 1 0 1 1 0 0 +EDGE2 3069 3068 -1.14145 -0.0274715 -0.00422502 1 0 1 1 0 0 +EDGE2 3070 3069 -0.990038 0.0433292 -0.0266733 1 0 1 1 0 0 +EDGE2 3071 3070 -1.05515 0.0288407 -1.55305 1 0 1 1 0 0 +EDGE2 3072 3071 -1.01408 0.0447685 0.0184456 1 0 1 1 0 0 +EDGE2 3073 3072 -0.933699 0.00325745 -0.0244789 1 0 1 1 0 0 +EDGE2 3074 3073 -1.01554 0.0662405 0.0176512 1 0 1 1 0 0 +EDGE2 3074 1075 1.0582 -0.032731 -3.15791 1 0 1 1 0 0 +EDGE2 3074 995 1.07019 -0.122672 -3.17142 1 0 1 1 0 0 +EDGE2 3074 1015 0.947527 0.0395685 -3.16644 1 0 1 1 0 0 +EDGE2 3074 1055 0.972434 0.0712253 -3.13018 1 0 1 1 0 0 +EDGE2 3075 1016 -0.0939885 -1.02189 -1.58643 1 0 1 1 0 0 +EDGE2 3075 1056 -0.00570426 -0.997424 -1.57788 1 0 1 1 0 0 +EDGE2 3075 996 0.000892714 -0.936181 -1.5564 1 0 1 1 0 0 +EDGE2 3075 1075 0.0979365 0.00454591 -3.15741 1 0 1 1 0 0 +EDGE2 3075 3074 -1.02234 -0.0428226 0.0228957 1 0 1 1 0 0 +EDGE2 3075 1074 1.00911 0.063424 -3.16981 1 0 1 1 0 0 +EDGE2 3075 995 0.0480369 0.0177481 -3.12808 1 0 1 1 0 0 +EDGE2 3075 1015 -0.0632225 -0.100562 -3.18505 1 0 1 1 0 0 +EDGE2 3075 1055 -0.00177064 -0.00923196 -3.1613 1 0 1 1 0 0 +EDGE2 3075 1014 1.03358 -0.00631783 -3.13787 1 0 1 1 0 0 +EDGE2 3075 1054 0.995886 0.00552966 -3.1388 1 0 1 1 0 0 +EDGE2 3075 994 1.01632 -0.0121724 -3.15791 1 0 1 1 0 0 +EDGE2 3075 1076 -0.012837 0.880157 1.60011 1 0 1 1 0 0 +EDGE2 3076 1075 -1.03816 0.0343503 1.57745 1 0 1 1 0 0 +EDGE2 3076 3075 -1.07147 0.0607068 -1.58258 1 0 1 1 0 0 +EDGE2 3076 995 -1.02278 0.0205818 1.58905 1 0 1 1 0 0 +EDGE2 3076 1015 -0.98268 -0.0520369 1.57206 1 0 1 1 0 0 +EDGE2 3076 1055 -1.06595 0.00125687 1.57512 1 0 1 1 0 0 +EDGE2 3076 1076 0.0393627 0.0393579 0.0288406 1 0 1 1 0 0 +EDGE2 3076 1077 0.973985 -0.0151443 -0.0352255 1 0 1 1 0 0 +EDGE2 3077 1076 -1.07871 -0.0649345 0.0153581 1 0 1 1 0 0 +EDGE2 3077 3076 -0.996853 0.0504884 -0.0450311 1 0 1 1 0 0 +EDGE2 3077 1077 -0.0544632 -0.0381383 -0.020975 1 0 1 1 0 0 +EDGE2 3077 1078 0.990311 0.0634147 -0.0187642 1 0 1 1 0 0 +EDGE2 3078 3077 -0.961825 -0.0592251 -0.00651113 1 0 1 1 0 0 +EDGE2 3078 1077 -0.983057 -0.0504397 0.00888394 1 0 1 1 0 0 +EDGE2 3078 1078 0.0354869 -0.0189248 -0.0201116 1 0 1 1 0 0 +EDGE2 3078 1079 1.00075 0.0202722 -0.0022245 1 0 1 1 0 0 +EDGE2 3079 3078 -1.15634 0.0481887 0.0239994 1 0 1 1 0 0 +EDGE2 3079 1078 -0.967949 0.0088668 -0.00835549 1 0 1 1 0 0 +EDGE2 3079 1079 -0.0257471 0.0573683 -0.00744324 1 0 1 1 0 0 +EDGE2 3079 3060 0.96373 0.0129559 -3.11748 1 0 1 1 0 0 +EDGE2 3079 1080 0.977529 0.0666756 -0.00560202 1 0 1 1 0 0 +EDGE2 3080 3079 -0.962157 -0.00954427 -0.0055359 1 0 1 1 0 0 +EDGE2 3080 1079 -1.05165 -0.0172264 -0.00937576 1 0 1 1 0 0 +EDGE2 3080 3061 0.00518387 0.961291 1.5444 1 0 1 1 0 0 +EDGE2 3080 3060 -0.051656 0.0878918 -3.11979 1 0 1 1 0 0 +EDGE2 3080 1080 0.0483772 0.0257315 -0.0254003 1 0 1 1 0 0 +EDGE2 3080 1081 -0.0354921 -1.09603 -1.56753 1 0 1 1 0 0 +EDGE2 3080 3059 1.03806 -0.0116176 -3.16304 1 0 1 1 0 0 +EDGE2 3081 3062 0.908235 -0.0204881 -0.00465949 1 0 1 1 0 0 +EDGE2 3081 3061 0.0778428 0.071087 0.00963098 1 0 1 1 0 0 +EDGE2 3081 3060 -0.964848 0.0681388 1.54691 1 0 1 1 0 0 +EDGE2 3081 3080 -0.993092 0.00296588 -1.54091 1 0 1 1 0 0 +EDGE2 3081 1080 -1.01936 -0.0105286 -1.59033 1 0 1 1 0 0 +EDGE2 3082 3063 1.05857 -0.0179526 -0.0220565 1 0 1 1 0 0 +EDGE2 3082 3062 -0.0502157 -0.0402329 -0.00810283 1 0 1 1 0 0 +EDGE2 3082 3081 -0.949449 0.102054 -0.0394733 1 0 1 1 0 0 +EDGE2 3082 3061 -1.00963 -0.0739814 0.00133532 1 0 1 1 0 0 +EDGE2 3083 3064 1.07548 -0.12363 0.0127331 1 0 1 1 0 0 +EDGE2 3083 3063 -0.0645456 -0.0294034 -0.0236175 1 0 1 1 0 0 +EDGE2 3083 3082 -0.939647 0.00418103 0.0118391 1 0 1 1 0 0 +EDGE2 3083 3062 -0.945673 -0.0686039 -0.0153612 1 0 1 1 0 0 +EDGE2 3084 1185 1.03937 0.0823574 -3.16213 1 0 1 1 0 0 +EDGE2 3084 3065 0.995251 0.0400534 -0.00131486 1 0 1 1 0 0 +EDGE2 3084 1165 1.06595 -0.0109416 -3.12011 1 0 1 1 0 0 +EDGE2 3084 3064 0.0226156 0.0191445 -0.00250575 1 0 1 1 0 0 +EDGE2 3084 3083 -1.14263 0.00153724 0.0245211 1 0 1 1 0 0 +EDGE2 3084 3063 -0.929305 0.0218044 -0.0216038 1 0 1 1 0 0 +EDGE2 3085 3066 0.0584401 1.01096 1.57694 1 0 1 1 0 0 +EDGE2 3085 1184 0.956698 -0.0730364 -3.14658 1 0 1 1 0 0 +EDGE2 3085 1164 1.03531 -0.022675 -3.15656 1 0 1 1 0 0 +EDGE2 3085 1185 -0.125735 -0.0121206 -3.12547 1 0 1 1 0 0 +EDGE2 3085 3065 -0.109075 0.0488535 0.00165341 1 0 1 1 0 0 +EDGE2 3085 1165 0.0234139 -0.0528743 -3.13836 1 0 1 1 0 0 +EDGE2 3085 1166 0.0121511 -1.0671 -1.58327 1 0 1 1 0 0 +EDGE2 3085 1186 -0.0512145 -0.999007 -1.56723 1 0 1 1 0 0 +EDGE2 3085 3064 -1.04069 0.0751321 0.0098982 1 0 1 1 0 0 +EDGE2 3085 3084 -1.01173 0.0778597 0.0153192 1 0 1 1 0 0 +EDGE2 3086 1185 -1.03327 0.0622625 -1.58851 1 0 1 1 0 0 +EDGE2 3086 3065 -0.912883 0.0410579 1.56493 1 0 1 1 0 0 +EDGE2 3086 3085 -0.990909 -0.0200502 1.56618 1 0 1 1 0 0 +EDGE2 3086 1165 -1.04352 0.0132367 -1.56699 1 0 1 1 0 0 +EDGE2 3086 1166 0.0497577 0.103831 0.0275584 1 0 1 1 0 0 +EDGE2 3086 1186 -0.0138452 -0.0476211 -0.0128129 1 0 1 1 0 0 +EDGE2 3086 1187 1.02685 -0.0567486 -0.00488534 1 0 1 1 0 0 +EDGE2 3086 1167 1.0033 -0.0166434 -0.00706148 1 0 1 1 0 0 +EDGE2 3087 1166 -0.982151 0.0577116 0.0141313 1 0 1 1 0 0 +EDGE2 3087 3086 -1.04528 -0.0153892 0.021 1 0 1 1 0 0 +EDGE2 3087 1186 -0.997216 -0.0228266 -0.0286856 1 0 1 1 0 0 +EDGE2 3087 1187 0.0344595 -0.0271008 0.00961052 1 0 1 1 0 0 +EDGE2 3087 1167 0.0613774 -0.0349328 0.00203929 1 0 1 1 0 0 +EDGE2 3087 1188 1.05952 0.081305 -0.00248445 1 0 1 1 0 0 +EDGE2 3087 1168 1.02251 -0.106995 -0.0104205 1 0 1 1 0 0 +EDGE2 3088 1187 -0.944603 0.0647825 0.0305684 1 0 1 1 0 0 +EDGE2 3088 3087 -0.943021 -0.131267 0.00297872 1 0 1 1 0 0 +EDGE2 3088 1167 -1.08958 0.00376819 -0.00189263 1 0 1 1 0 0 +EDGE2 3088 1188 0.0238703 0.0520689 0.00269522 1 0 1 1 0 0 +EDGE2 3088 1168 0.0468054 0.0281949 0.00379947 1 0 1 1 0 0 +EDGE2 3088 1189 1.00914 -0.0122049 -0.0133469 1 0 1 1 0 0 +EDGE2 3088 1169 0.945222 -0.0224847 -0.0149405 1 0 1 1 0 0 +EDGE2 3089 1188 -1.08753 -0.0125554 0.00890468 1 0 1 1 0 0 +EDGE2 3089 3088 -0.988818 0.02186 -0.0292773 1 0 1 1 0 0 +EDGE2 3089 1168 -0.891667 -0.00646317 0.0321589 1 0 1 1 0 0 +EDGE2 3089 1189 0.0713228 -0.0046697 -0.00182478 1 0 1 1 0 0 +EDGE2 3089 1169 -0.0358539 -0.0459424 0.00741328 1 0 1 1 0 0 +EDGE2 3089 3050 0.948253 -0.0259816 -3.15324 1 0 1 1 0 0 +EDGE2 3089 1130 1.00633 -0.0443162 -3.15367 1 0 1 1 0 0 +EDGE2 3089 1170 0.977161 0.0560428 -0.00645488 1 0 1 1 0 0 +EDGE2 3089 1190 0.97369 0.0272884 0.00718913 1 0 1 1 0 0 +EDGE2 3089 3030 1.03638 -0.00568189 -3.13726 1 0 1 1 0 0 +EDGE2 3089 1150 0.958167 -0.00908655 -3.14167 1 0 1 1 0 0 +EDGE2 3089 1110 0.971926 -0.0289642 -3.14134 1 0 1 1 0 0 +EDGE2 3090 1189 -0.983949 -0.0540241 -0.00447386 1 0 1 1 0 0 +EDGE2 3090 3089 -0.986 -0.00464262 -0.00241532 1 0 1 1 0 0 +EDGE2 3090 1169 -1.00153 0.0261406 0.0202546 1 0 1 1 0 0 +EDGE2 3090 3050 0.0235286 -0.0573071 -3.15086 1 0 1 1 0 0 +EDGE2 3090 1151 -0.0720398 0.939191 1.61869 1 0 1 1 0 0 +EDGE2 3090 1191 0.0151244 1.02651 1.57241 1 0 1 1 0 0 +EDGE2 3090 1171 0.0169334 0.950568 1.55419 1 0 1 1 0 0 +EDGE2 3090 1130 0.0613071 0.00755717 -3.16163 1 0 1 1 0 0 +EDGE2 3090 1170 -0.0329842 -0.0229571 -0.00415748 1 0 1 1 0 0 +EDGE2 3090 1190 -0.0374228 0.104288 -0.0257372 1 0 1 1 0 0 +EDGE2 3090 3030 0.026719 -0.0073156 -3.12728 1 0 1 1 0 0 +EDGE2 3090 1150 0.0115748 -0.0638332 -3.17123 1 0 1 1 0 0 +EDGE2 3090 1110 0.0156724 0.0141394 -3.13864 1 0 1 1 0 0 +EDGE2 3090 1109 0.968427 -0.0304632 -3.15037 1 0 1 1 0 0 +EDGE2 3090 1149 1.08495 0.0222814 -3.13562 1 0 1 1 0 0 +EDGE2 3090 3029 0.997198 0.00913949 -3.13038 1 0 1 1 0 0 +EDGE2 3090 3049 1.04249 0.0634668 -3.1546 1 0 1 1 0 0 +EDGE2 3090 1129 1.04306 0.0347154 -3.08768 1 0 1 1 0 0 +EDGE2 3090 1111 0.0888144 -1.01669 -1.57659 1 0 1 1 0 0 +EDGE2 3090 3031 0.0537517 -1.0464 -1.56164 1 0 1 1 0 0 +EDGE2 3090 3051 -0.0445354 -0.966857 -1.54511 1 0 1 1 0 0 +EDGE2 3090 1131 0.0643418 -0.992834 -1.56856 1 0 1 1 0 0 +EDGE2 3091 3050 -0.973147 0.00231955 1.54196 1 0 1 1 0 0 +EDGE2 3091 1152 0.919673 -0.0539116 0.000668497 1 0 1 1 0 0 +EDGE2 3091 1172 1.04979 0.0293151 0.00119683 1 0 1 1 0 0 +EDGE2 3091 1192 1.08903 0.00504847 0.00919581 1 0 1 1 0 0 +EDGE2 3091 1151 0.0196515 -0.0622991 -0.0238993 1 0 1 1 0 0 +EDGE2 3091 1191 -0.0193521 -0.0724525 0.0052227 1 0 1 1 0 0 +EDGE2 3091 1171 0.0101395 -0.0908025 0.0261026 1 0 1 1 0 0 +EDGE2 3091 3090 -0.992857 -0.00567414 -1.56459 1 0 1 1 0 0 +EDGE2 3091 1130 -0.982068 0.0328963 1.62158 1 0 1 1 0 0 +EDGE2 3091 1170 -1.02475 -0.0344746 -1.54575 1 0 1 1 0 0 +EDGE2 3091 1190 -1.05605 -0.0345832 -1.55905 1 0 1 1 0 0 +EDGE2 3091 3030 -1.00994 -0.146858 1.58788 1 0 1 1 0 0 +EDGE2 3091 1150 -0.937668 -0.0535759 1.59031 1 0 1 1 0 0 +EDGE2 3091 1110 -0.941538 -0.0296928 1.58517 1 0 1 1 0 0 +EDGE2 3092 1173 1.04187 -0.0453905 0.0345811 1 0 1 1 0 0 +EDGE2 3092 1193 1.04771 0.0527588 -0.00960301 1 0 1 1 0 0 +EDGE2 3092 1153 1.01885 0.0653837 0.0434027 1 0 1 1 0 0 +EDGE2 3092 1152 0.000507847 0.0631582 0.00262897 1 0 1 1 0 0 +EDGE2 3092 1172 0.0507785 -0.0723196 0.013071 1 0 1 1 0 0 +EDGE2 3092 1192 -0.0721027 0.0105713 0.0368106 1 0 1 1 0 0 +EDGE2 3092 1151 -0.917731 0.0874933 -0.00955853 1 0 1 1 0 0 +EDGE2 3092 1191 -0.984866 -0.0458646 0.0214391 1 0 1 1 0 0 +EDGE2 3092 3091 -0.960647 0.00334207 0.0400716 1 0 1 1 0 0 +EDGE2 3092 1171 -0.966117 0.0474042 -0.00636561 1 0 1 1 0 0 +EDGE2 3093 1173 0.0127896 0.0684499 -0.046234 1 0 1 1 0 0 +EDGE2 3093 1174 0.997359 0.0443933 0.0125676 1 0 1 1 0 0 +EDGE2 3093 1194 0.930885 -0.0319788 -0.0166502 1 0 1 1 0 0 +EDGE2 3093 1154 0.958345 -0.0492887 -0.0177245 1 0 1 1 0 0 +EDGE2 3093 1193 0.101082 -0.087233 -0.0133721 1 0 1 1 0 0 +EDGE2 3093 3092 -1.00262 -0.0814731 0.0345821 1 0 1 1 0 0 +EDGE2 3093 1153 -0.0144257 -0.0285359 -0.00664043 1 0 1 1 0 0 +EDGE2 3093 1152 -0.945754 0.0457133 -0.00710289 1 0 1 1 0 0 +EDGE2 3093 1172 -0.956576 0.0537581 0.0210936 1 0 1 1 0 0 +EDGE2 3093 1192 -0.971015 -0.025433 0.0173016 1 0 1 1 0 0 +EDGE2 3094 1173 -1.00776 -0.0236531 0.00839544 1 0 1 1 0 0 +EDGE2 3094 1174 0.0155291 0.0214868 0.00727392 1 0 1 1 0 0 +EDGE2 3094 1175 1.02692 0.0285956 0.00428951 1 0 1 1 0 0 +EDGE2 3094 1195 1.03906 0.0819442 0.011957 1 0 1 1 0 0 +EDGE2 3094 1155 1.02924 0.0319121 -0.0256019 1 0 1 1 0 0 +EDGE2 3094 1194 -0.0638625 -0.0155844 0.01286 1 0 1 1 0 0 +EDGE2 3094 1154 -0.0268734 -0.000196428 0.012275 1 0 1 1 0 0 +EDGE2 3094 3093 -0.942989 0.0423255 -0.0342887 1 0 1 1 0 0 +EDGE2 3094 1193 -0.981437 0.0485802 0.0295484 1 0 1 1 0 0 +EDGE2 3094 1153 -0.987842 -0.0551509 -0.0127895 1 0 1 1 0 0 +EDGE2 3095 1196 0.157542 1.04339 1.62332 1 0 1 1 0 0 +EDGE2 3095 1156 0.0367188 1.00409 1.56244 1 0 1 1 0 0 +EDGE2 3095 1176 0.0318854 1.04486 1.57642 1 0 1 1 0 0 +EDGE2 3095 1174 -0.979463 0.121318 -0.00653829 1 0 1 1 0 0 +EDGE2 3095 1175 -0.00592488 0.0678059 -0.00164637 1 0 1 1 0 0 +EDGE2 3095 1195 0.131512 0.083671 0.0202998 1 0 1 1 0 0 +EDGE2 3095 1155 0.012923 -0.00253917 -0.0414224 1 0 1 1 0 0 +EDGE2 3095 3094 -0.887939 -0.0434667 -0.0296108 1 0 1 1 0 0 +EDGE2 3095 1194 -0.96251 0.0125372 -0.00459349 1 0 1 1 0 0 +EDGE2 3095 1154 -1.04258 0.0367397 0.0340782 1 0 1 1 0 0 +EDGE2 3096 1197 1.01868 -0.0592238 -0.0259912 1 0 1 1 0 0 +EDGE2 3096 1177 0.959479 0.0569005 0.0141631 1 0 1 1 0 0 +EDGE2 3096 1157 0.996794 -0.0551485 0.00533833 1 0 1 1 0 0 +EDGE2 3096 1196 0.103331 -0.0243821 -0.0232058 1 0 1 1 0 0 +EDGE2 3096 1156 0.006658 0.115092 -0.0212321 1 0 1 1 0 0 +EDGE2 3096 1176 -0.0413561 0.035 -0.00514409 1 0 1 1 0 0 +EDGE2 3096 1175 -0.990101 0.0305886 -1.60162 1 0 1 1 0 0 +EDGE2 3096 1195 -0.934368 0.0138232 -1.60028 1 0 1 1 0 0 +EDGE2 3096 3095 -0.981758 -0.0163301 -1.59405 1 0 1 1 0 0 +EDGE2 3096 1155 -0.998028 0.0136409 -1.57209 1 0 1 1 0 0 +EDGE2 3097 1197 -0.0340608 0.0173635 0.00585798 1 0 1 1 0 0 +EDGE2 3097 1178 1.02572 0.0458067 -0.000303534 1 0 1 1 0 0 +EDGE2 3097 1198 1.02689 -0.0213581 -0.0319302 1 0 1 1 0 0 +EDGE2 3097 1158 0.995624 0.00821438 0.0342216 1 0 1 1 0 0 +EDGE2 3097 1177 0.0211894 -0.0636039 -0.029161 1 0 1 1 0 0 +EDGE2 3097 1157 -0.000246507 0.053405 -0.0179707 1 0 1 1 0 0 +EDGE2 3097 1196 -1.08107 0.0752563 -0.0149464 1 0 1 1 0 0 +EDGE2 3097 3096 -1.03899 -0.0735089 0.0109537 1 0 1 1 0 0 +EDGE2 3097 1156 -0.947963 -0.0129169 -0.0251517 1 0 1 1 0 0 +EDGE2 3097 1176 -1.02882 0.127374 -0.00741876 1 0 1 1 0 0 +EDGE2 3098 1197 -1.05286 -0.0110063 0.00394602 1 0 1 1 0 0 +EDGE2 3098 1179 1.03032 -0.0516505 -0.0124396 1 0 1 1 0 0 +EDGE2 3098 1199 0.992759 0.0764537 -0.0236857 1 0 1 1 0 0 +EDGE2 3098 1159 1.07088 0.0686631 0.0306746 1 0 1 1 0 0 +EDGE2 3098 1178 0.0203425 0.0139172 -0.019894 1 0 1 1 0 0 +EDGE2 3098 1198 0.0247953 -0.0414587 -0.00180047 1 0 1 1 0 0 +EDGE2 3098 1158 -0.0564859 -0.0407519 -0.0160513 1 0 1 1 0 0 +EDGE2 3098 3097 -1.00423 0.0612533 -0.00593049 1 0 1 1 0 0 +EDGE2 3098 1177 -0.95643 -0.0137584 -0.0207416 1 0 1 1 0 0 +EDGE2 3098 1157 -1.05822 -0.0301033 -0.0553781 1 0 1 1 0 0 +EDGE2 3099 1160 0.967946 -0.0187009 -0.00580507 1 0 1 1 0 0 +EDGE2 3099 1200 0.961129 -0.00556012 0.0067149 1 0 1 1 0 0 +EDGE2 3099 1180 1.02275 0.03005 0.0234468 1 0 1 1 0 0 +EDGE2 3099 900 0.986857 0.100114 -3.1364 1 0 1 1 0 0 +EDGE2 3099 840 1.06132 0.0715917 -3.13392 1 0 1 1 0 0 +EDGE2 3099 860 1.07397 -0.0445559 -3.13754 1 0 1 1 0 0 +EDGE2 3099 1179 0.0238751 -0.123462 0.0237994 1 0 1 1 0 0 +EDGE2 3099 1199 -0.00763695 0.0567786 -0.0168996 1 0 1 1 0 0 +EDGE2 3099 1159 -0.0506272 0.000976274 0.00358113 1 0 1 1 0 0 +EDGE2 3099 3098 -0.91725 0.0238662 0.011595 1 0 1 1 0 0 +EDGE2 3099 1178 -0.971156 -0.0126607 -0.00236778 1 0 1 1 0 0 +EDGE2 3099 1198 -0.908378 -0.0138423 -0.0168722 1 0 1 1 0 0 +EDGE2 3099 1158 -0.958229 -0.0571034 0.0160256 1 0 1 1 0 0 +EDGE2 3100 839 0.967302 0.0413415 -3.15963 1 0 1 1 0 0 +EDGE2 3100 899 0.948509 0.00278587 -3.14333 1 0 1 1 0 0 +EDGE2 3100 859 0.93927 0.00161825 -3.14605 1 0 1 1 0 0 +EDGE2 3100 841 -0.0175972 -1.05754 -1.59502 1 0 1 1 0 0 +EDGE2 3100 901 -0.0493852 -1.02522 -1.54245 1 0 1 1 0 0 +EDGE2 3100 1201 -0.0485418 -1.00424 -1.58204 1 0 1 1 0 0 +EDGE2 3100 861 0.00909206 -1.06479 -1.5852 1 0 1 1 0 0 +EDGE2 3100 1160 0.0179405 -0.00403023 -0.0247911 1 0 1 1 0 0 +EDGE2 3100 1200 0.0205007 0.0328038 -0.017107 1 0 1 1 0 0 +EDGE2 3100 1180 0.00285206 0.0255513 0.0131356 1 0 1 1 0 0 +EDGE2 3100 900 0.0330244 0.069159 -3.14706 1 0 1 1 0 0 +EDGE2 3100 840 0.00134377 -0.0210334 -3.12422 1 0 1 1 0 0 +EDGE2 3100 860 0.0345909 -0.0208496 -3.13401 1 0 1 1 0 0 +EDGE2 3100 1161 -0.0561465 1.08427 1.56886 1 0 1 1 0 0 +EDGE2 3100 1181 0.0544678 0.972283 1.57696 1 0 1 1 0 0 +EDGE2 3100 1179 -1.08083 -0.00103398 0.00830417 1 0 1 1 0 0 +EDGE2 3100 1199 -1.05129 -0.106847 0.0176819 1 0 1 1 0 0 +EDGE2 3100 3099 -0.921114 -0.0844277 0.0291092 1 0 1 1 0 0 +EDGE2 3100 1159 -1.07178 0.00818128 0.00429923 1 0 1 1 0 0 +EDGE2 3101 1160 -1.00686 0.0472408 -1.54789 1 0 1 1 0 0 +EDGE2 3101 1200 -1.09627 -0.01425 -1.57171 1 0 1 1 0 0 +EDGE2 3101 3100 -0.995075 -0.0241601 -1.61144 1 0 1 1 0 0 +EDGE2 3101 1180 -0.991038 -0.0872785 -1.55141 1 0 1 1 0 0 +EDGE2 3101 900 -0.980101 0.00512881 1.55635 1 0 1 1 0 0 +EDGE2 3101 840 -1.00377 0.038111 1.57585 1 0 1 1 0 0 +EDGE2 3101 860 -1.10311 0.00330589 1.53871 1 0 1 1 0 0 +EDGE2 3101 1161 -0.0301685 -0.129278 0.000360821 1 0 1 1 0 0 +EDGE2 3101 1181 0.00659722 0.0236773 0.0361325 1 0 1 1 0 0 +EDGE2 3101 1182 0.991317 -0.0132472 -0.000390671 1 0 1 1 0 0 +EDGE2 3101 1162 0.955517 -0.0292355 -0.0227099 1 0 1 1 0 0 +EDGE2 3102 3101 -1.01406 0.0757047 -0.00313844 1 0 1 1 0 0 +EDGE2 3102 1161 -1.0337 -0.051785 -0.0396938 1 0 1 1 0 0 +EDGE2 3102 1181 -0.964465 0.00976594 0.0276291 1 0 1 1 0 0 +EDGE2 3102 1182 0.0508854 0.0304604 0.015852 1 0 1 1 0 0 +EDGE2 3102 1162 -0.0157895 -0.0527391 -0.0181781 1 0 1 1 0 0 +EDGE2 3102 1163 0.97235 0.036975 -0.0142576 1 0 1 1 0 0 +EDGE2 3102 1183 1.10851 -0.0782056 -0.0184999 1 0 1 1 0 0 +EDGE2 3103 1182 -0.966997 -0.052801 0.0124282 1 0 1 1 0 0 +EDGE2 3103 3102 -1.03 0.00747153 0.0102929 1 0 1 1 0 0 +EDGE2 3103 1162 -1.02359 0.0769489 -0.0151316 1 0 1 1 0 0 +EDGE2 3103 1163 0.0198947 0.0668569 0.00218166 1 0 1 1 0 0 +EDGE2 3103 1183 -0.0430412 -0.00961242 -0.00345774 1 0 1 1 0 0 +EDGE2 3103 1184 1.03964 -0.0238375 -0.0123048 1 0 1 1 0 0 +EDGE2 3103 1164 1.01715 -0.0490097 -0.00217706 1 0 1 1 0 0 +EDGE2 3104 1163 -1.11672 -0.0486939 -0.0246394 1 0 1 1 0 0 +EDGE2 3104 3103 -0.946461 0.026732 0.0583211 1 0 1 1 0 0 +EDGE2 3104 1183 -0.995325 0.0126126 0.00525733 1 0 1 1 0 0 +EDGE2 3104 1184 -0.0358379 -0.0433704 0.0370345 1 0 1 1 0 0 +EDGE2 3104 1164 0.0115547 0.0604403 -0.0203125 1 0 1 1 0 0 +EDGE2 3104 1185 1.06496 0.0504441 0.0301483 1 0 1 1 0 0 +EDGE2 3104 3065 0.955799 -0.033706 -3.14383 1 0 1 1 0 0 +EDGE2 3104 3085 1.01886 -0.00980625 -3.1474 1 0 1 1 0 0 +EDGE2 3104 1165 0.949009 -0.0991859 0.00290146 1 0 1 1 0 0 +EDGE2 3105 3066 0.00892546 -1.01649 -1.56762 1 0 1 1 0 0 +EDGE2 3105 1184 -0.976119 0.0286646 0.0324987 1 0 1 1 0 0 +EDGE2 3105 3104 -1.00045 0.00150275 0.00720515 1 0 1 1 0 0 +EDGE2 3105 1164 -0.950768 -0.104465 -0.0273997 1 0 1 1 0 0 +EDGE2 3105 1185 -0.00288628 0.0371622 0.0265641 1 0 1 1 0 0 +EDGE2 3105 3065 0.0409526 -0.0398921 -3.13404 1 0 1 1 0 0 +EDGE2 3105 3085 0.0703875 0.0158603 -3.12538 1 0 1 1 0 0 +EDGE2 3105 1165 -0.0330288 0.0833478 -0.0269459 1 0 1 1 0 0 +EDGE2 3105 1166 0.0229257 0.945512 1.55842 1 0 1 1 0 0 +EDGE2 3105 3086 -0.016235 0.93874 1.56492 1 0 1 1 0 0 +EDGE2 3105 1186 0.033138 0.981097 1.57177 1 0 1 1 0 0 +EDGE2 3105 3064 1.03866 -0.0539031 -3.17394 1 0 1 1 0 0 +EDGE2 3105 3084 1.04229 0.022192 -3.1529 1 0 1 1 0 0 +EDGE2 3106 3105 -0.97019 0.00797012 -1.5645 1 0 1 1 0 0 +EDGE2 3106 1185 -0.986657 0.0177953 -1.59075 1 0 1 1 0 0 +EDGE2 3106 3065 -0.959879 0.0351229 1.59323 1 0 1 1 0 0 +EDGE2 3106 3085 -1.02645 -0.0591773 1.55192 1 0 1 1 0 0 +EDGE2 3106 1165 -1.07284 0.0572691 -1.57462 1 0 1 1 0 0 +EDGE2 3106 1166 0.00863789 -0.0434479 -0.0169679 1 0 1 1 0 0 +EDGE2 3106 3086 -0.0342219 -0.0807856 -0.0183285 1 0 1 1 0 0 +EDGE2 3106 1186 0.0399505 0.0195237 0.0106088 1 0 1 1 0 0 +EDGE2 3106 1187 1.06646 -0.0025929 -0.00420703 1 0 1 1 0 0 +EDGE2 3106 3087 1.0077 0.0623467 0.0497312 1 0 1 1 0 0 +EDGE2 3106 1167 0.953345 -0.0238474 -0.0169691 1 0 1 1 0 0 +EDGE2 3107 1166 -0.94058 0.0021907 0.00906879 1 0 1 1 0 0 +EDGE2 3107 3086 -0.998576 0.0533085 -0.00458331 1 0 1 1 0 0 +EDGE2 3107 3106 -1.07834 -0.0181374 -0.033381 1 0 1 1 0 0 +EDGE2 3107 1186 -1.02676 -0.0474887 0.0322109 1 0 1 1 0 0 +EDGE2 3107 1187 0.0167885 0.120417 -0.014834 1 0 1 1 0 0 +EDGE2 3107 3087 0.0174171 0.102239 0.0171578 1 0 1 1 0 0 +EDGE2 3107 1167 -0.0834879 -0.0892445 -0.0228989 1 0 1 1 0 0 +EDGE2 3107 1188 1.04123 -0.0513084 -0.00248044 1 0 1 1 0 0 +EDGE2 3107 3088 0.918377 -0.0541066 0.0131257 1 0 1 1 0 0 +EDGE2 3107 1168 0.889459 -0.0169931 0.0111136 1 0 1 1 0 0 +EDGE2 3108 3107 -0.934995 -0.0190092 -0.0142443 1 0 1 1 0 0 +EDGE2 3108 1187 -1.04942 -0.00272168 0.0210955 1 0 1 1 0 0 +EDGE2 3108 3087 -0.91189 0.0663636 -0.013949 1 0 1 1 0 0 +EDGE2 3108 1167 -1.02344 0.052543 -0.0267302 1 0 1 1 0 0 +EDGE2 3108 1188 0.0275972 -0.0376452 0.0189309 1 0 1 1 0 0 +EDGE2 3108 3088 -0.0244833 0.0321696 0.00361934 1 0 1 1 0 0 +EDGE2 3108 1168 0.111904 0.067331 0.0174366 1 0 1 1 0 0 +EDGE2 3108 1189 1.09163 -0.0528998 -0.0171287 1 0 1 1 0 0 +EDGE2 3108 3089 0.995665 -0.0138284 0.0248478 1 0 1 1 0 0 +EDGE2 3108 1169 0.942041 0.0219776 -0.0150842 1 0 1 1 0 0 +EDGE2 3109 1188 -1.02059 0.00134042 0.0161431 1 0 1 1 0 0 +EDGE2 3109 3088 -1.07223 0.0501938 0.00361988 1 0 1 1 0 0 +EDGE2 3109 3108 -0.958085 0.0563125 -0.00841435 1 0 1 1 0 0 +EDGE2 3109 1168 -1.01382 -0.0431947 -0.00604946 1 0 1 1 0 0 +EDGE2 3109 1189 0.0908053 -0.0153635 -0.0157482 1 0 1 1 0 0 +EDGE2 3109 3089 0.0618048 -0.0216802 0.00786065 1 0 1 1 0 0 +EDGE2 3109 1169 -0.0336538 -0.0129769 0.0199379 1 0 1 1 0 0 +EDGE2 3109 3050 0.938548 -0.025525 -3.10191 1 0 1 1 0 0 +EDGE2 3109 3090 1.10162 -0.0202715 -0.00469542 1 0 1 1 0 0 +EDGE2 3109 1130 1.09234 -0.00359096 -3.18355 1 0 1 1 0 0 +EDGE2 3109 1170 0.874289 -0.0435002 -0.004653 1 0 1 1 0 0 +EDGE2 3109 1190 0.994809 -0.0658848 0.0135781 1 0 1 1 0 0 +EDGE2 3109 3030 1.02495 -0.0226812 -3.13037 1 0 1 1 0 0 +EDGE2 3109 1150 1.05277 -0.0615464 -3.1547 1 0 1 1 0 0 +EDGE2 3109 1110 1.0249 0.0110262 -3.12302 1 0 1 1 0 0 +EDGE2 3110 3109 -1.06233 0.0171569 -0.0178721 1 0 1 1 0 0 +EDGE2 3110 1189 -1.0026 -0.0370548 0.0253896 1 0 1 1 0 0 +EDGE2 3110 3089 -0.985955 -0.0299236 -0.0267348 1 0 1 1 0 0 +EDGE2 3110 1169 -1.06935 0.0242999 -0.0240707 1 0 1 1 0 0 +EDGE2 3110 3050 -0.0305532 0.0224852 -3.15488 1 0 1 1 0 0 +EDGE2 3110 1151 -0.0284924 1.0518 1.57385 1 0 1 1 0 0 +EDGE2 3110 1191 0.0412828 0.940949 1.58256 1 0 1 1 0 0 +EDGE2 3110 3091 0.0454887 1.03987 1.55211 1 0 1 1 0 0 +EDGE2 3110 1171 -0.029389 0.991712 1.56351 1 0 1 1 0 0 +EDGE2 3110 3090 0.038174 0.00328615 -0.00578051 1 0 1 1 0 0 +EDGE2 3110 1130 -0.0412217 -0.0144942 -3.11482 1 0 1 1 0 0 +EDGE2 3110 1170 0.0468997 -0.0614012 0.00139156 1 0 1 1 0 0 +EDGE2 3110 1190 0.0287982 -0.0124609 0.0276729 1 0 1 1 0 0 +EDGE2 3110 3030 0.0394699 0.168999 -3.15618 1 0 1 1 0 0 +EDGE2 3110 1150 -0.0753284 -0.0158889 -3.13345 1 0 1 1 0 0 +EDGE2 3110 1110 -0.0200618 -0.0391233 -3.14663 1 0 1 1 0 0 +EDGE2 3110 1109 1.07463 -0.0232502 -3.11226 1 0 1 1 0 0 +EDGE2 3110 1149 1.00549 0.0431261 -3.16744 1 0 1 1 0 0 +EDGE2 3110 3029 0.965136 -0.0404671 -3.14626 1 0 1 1 0 0 +EDGE2 3110 3049 0.999371 -0.0611991 -3.11723 1 0 1 1 0 0 +EDGE2 3110 1129 0.941469 -0.0030549 -3.15722 1 0 1 1 0 0 +EDGE2 3110 1111 0.0310714 -0.95945 -1.57338 1 0 1 1 0 0 +EDGE2 3110 3031 -0.00513653 -0.980388 -1.53667 1 0 1 1 0 0 +EDGE2 3110 3051 0.0741846 -1.02152 -1.57209 1 0 1 1 0 0 +EDGE2 3110 1131 -0.0321571 -0.978216 -1.57181 1 0 1 1 0 0 +EDGE2 3111 3050 -1.018 0.0785962 1.58231 1 0 1 1 0 0 +EDGE2 3111 3092 0.995913 0.112447 0.00375162 1 0 1 1 0 0 +EDGE2 3111 1152 1.03897 -0.0485982 0.0104464 1 0 1 1 0 0 +EDGE2 3111 1172 1.01014 -0.0290582 0.016711 1 0 1 1 0 0 +EDGE2 3111 1192 1.04331 0.0871235 0.00116069 1 0 1 1 0 0 +EDGE2 3111 1151 -0.0389311 -0.0200617 0.0182905 1 0 1 1 0 0 +EDGE2 3111 1191 -0.0462513 0.0191637 0.00609917 1 0 1 1 0 0 +EDGE2 3111 3091 0.0325535 -0.034262 -0.0354646 1 0 1 1 0 0 +EDGE2 3111 1171 -0.1512 0.0135055 0.0537108 1 0 1 1 0 0 +EDGE2 3111 3110 -0.963347 -0.0687729 -1.57271 1 0 1 1 0 0 +EDGE2 3111 3090 -0.943677 0.0833386 -1.56499 1 0 1 1 0 0 +EDGE2 3111 1130 -1.03073 -0.0195407 1.5628 1 0 1 1 0 0 +EDGE2 3111 1170 -0.946164 -0.0576484 -1.57773 1 0 1 1 0 0 +EDGE2 3111 1190 -0.9914 0.0622166 -1.59434 1 0 1 1 0 0 +EDGE2 3111 3030 -1.03474 0.0861608 1.53884 1 0 1 1 0 0 +EDGE2 3111 1150 -1.08336 -0.0424713 1.56721 1 0 1 1 0 0 +EDGE2 3111 1110 -0.951012 0.0827274 1.57188 1 0 1 1 0 0 +EDGE2 3112 1173 0.911983 -0.0474635 0.0206382 1 0 1 1 0 0 +EDGE2 3112 3093 1.11919 0.0176769 0.00951169 1 0 1 1 0 0 +EDGE2 3112 1193 1.02532 -0.06596 0.00517107 1 0 1 1 0 0 +EDGE2 3112 3092 -0.0354732 -0.00660467 0.0276268 1 0 1 1 0 0 +EDGE2 3112 1153 1.0702 -0.0354886 -0.0112029 1 0 1 1 0 0 +EDGE2 3112 1152 0.0813867 -0.000535176 0.0298133 1 0 1 1 0 0 +EDGE2 3112 1172 0.0985987 0.0514143 -0.0223995 1 0 1 1 0 0 +EDGE2 3112 1192 -0.0493254 0.0661358 -0.0154296 1 0 1 1 0 0 +EDGE2 3112 1151 -1.00244 -0.0486912 0.00848904 1 0 1 1 0 0 +EDGE2 3112 1191 -0.983077 -0.03805 -0.0251621 1 0 1 1 0 0 +EDGE2 3112 3091 -0.983913 0.0191976 -0.0138881 1 0 1 1 0 0 +EDGE2 3112 3111 -1.0076 -0.0426435 0.0142881 1 0 1 1 0 0 +EDGE2 3112 1171 -1.0656 -0.102595 0.0234113 1 0 1 1 0 0 +EDGE2 3113 1173 0.0562955 -0.0243383 -0.0501801 1 0 1 1 0 0 +EDGE2 3113 1174 0.955768 -0.0523505 0.0126629 1 0 1 1 0 0 +EDGE2 3113 3094 1.03463 -0.0653844 0.00122404 1 0 1 1 0 0 +EDGE2 3113 1194 0.986091 0.02738 -0.00810587 1 0 1 1 0 0 +EDGE2 3113 1154 0.899866 -0.0797705 -0.034914 1 0 1 1 0 0 +EDGE2 3113 3093 0.0787939 0.036774 0.0194001 1 0 1 1 0 0 +EDGE2 3113 1193 0.0242403 0.08249 0.0156479 1 0 1 1 0 0 +EDGE2 3113 3092 -0.929656 0.00384296 0.0010555 1 0 1 1 0 0 +EDGE2 3113 1153 0.0454454 -0.0503186 0.0130166 1 0 1 1 0 0 +EDGE2 3113 3112 -1.008 -0.0507475 -0.0156419 1 0 1 1 0 0 +EDGE2 3113 1152 -1.05568 0.021031 0.00263811 1 0 1 1 0 0 +EDGE2 3113 1172 -1.00145 0.0699327 0.00520434 1 0 1 1 0 0 +EDGE2 3113 1192 -0.961586 0.0336492 -0.00509031 1 0 1 1 0 0 +EDGE2 3114 1173 -1.03053 -0.109215 0.0344654 1 0 1 1 0 0 +EDGE2 3114 1174 0.0120286 -0.0236746 -0.00574253 1 0 1 1 0 0 +EDGE2 3114 1175 0.958557 0.0200061 0.00594851 1 0 1 1 0 0 +EDGE2 3114 1195 0.927096 -0.058992 -0.0211691 1 0 1 1 0 0 +EDGE2 3114 3095 1.02876 -0.0321567 0.00239331 1 0 1 1 0 0 +EDGE2 3114 1155 1.05206 -0.123876 -0.0186931 1 0 1 1 0 0 +EDGE2 3114 3094 0.052378 -0.0366011 -0.000798307 1 0 1 1 0 0 +EDGE2 3114 1194 0.0379686 0.043289 -0.0331013 1 0 1 1 0 0 +EDGE2 3114 1154 0.0522094 -0.0190383 0.00756299 1 0 1 1 0 0 +EDGE2 3114 3093 -1.02622 0.0396815 -0.00477609 1 0 1 1 0 0 +EDGE2 3114 3113 -0.988763 -0.0331146 0.000566837 1 0 1 1 0 0 +EDGE2 3114 1193 -0.923779 -0.00410977 -0.0297842 1 0 1 1 0 0 +EDGE2 3114 1153 -0.89861 0.0347261 0.00149107 1 0 1 1 0 0 +EDGE2 3115 1196 0.0221881 1.04557 1.58621 1 0 1 1 0 0 +EDGE2 3115 3096 -0.0672617 1.06068 1.55357 1 0 1 1 0 0 +EDGE2 3115 1156 -0.0434656 1.00782 1.58159 1 0 1 1 0 0 +EDGE2 3115 1176 0.0143365 1.05049 1.56062 1 0 1 1 0 0 +EDGE2 3115 1174 -1.01953 0.0119418 0.0228959 1 0 1 1 0 0 +EDGE2 3115 1175 -0.0453715 0.0697018 -0.0290348 1 0 1 1 0 0 +EDGE2 3115 1195 0.112689 0.0430602 0.0024131 1 0 1 1 0 0 +EDGE2 3115 3095 0.0881637 0.00922612 -0.00565684 1 0 1 1 0 0 +EDGE2 3115 1155 0.027469 0.0497469 0.0114778 1 0 1 1 0 0 +EDGE2 3115 3094 -1.0201 -0.0453873 0.0639202 1 0 1 1 0 0 +EDGE2 3115 3114 -0.948245 0.0278849 -0.00568105 1 0 1 1 0 0 +EDGE2 3115 1194 -1.02722 -0.00759152 0.00141071 1 0 1 1 0 0 +EDGE2 3115 1154 -0.929366 0.0104069 -0.0112362 1 0 1 1 0 0 +EDGE2 3116 1197 0.99373 0.0259592 0.000474762 1 0 1 1 0 0 +EDGE2 3116 3097 1.02901 0.0470884 0.0164487 1 0 1 1 0 0 +EDGE2 3116 1177 0.950819 -0.0861272 0.0121911 1 0 1 1 0 0 +EDGE2 3116 1157 1.05251 -0.021895 -0.00387878 1 0 1 1 0 0 +EDGE2 3116 1196 0.0316992 0.0144156 -0.0119746 1 0 1 1 0 0 +EDGE2 3116 3096 -0.104009 -0.0193272 -0.00127889 1 0 1 1 0 0 +EDGE2 3116 1156 -0.0571 -0.14385 -0.0328438 1 0 1 1 0 0 +EDGE2 3116 1176 0.0751001 -0.0277397 0.00941097 1 0 1 1 0 0 +EDGE2 3116 3115 -1.10836 0.0343072 -1.58779 1 0 1 1 0 0 +EDGE2 3116 1175 -1.00984 0.012743 -1.56334 1 0 1 1 0 0 +EDGE2 3116 1195 -0.93785 -0.0459517 -1.56692 1 0 1 1 0 0 +EDGE2 3116 3095 -0.986929 -0.0493737 -1.56189 1 0 1 1 0 0 +EDGE2 3116 1155 -1.02168 -0.0506353 -1.56006 1 0 1 1 0 0 +EDGE2 3117 1197 0.0178288 0.0677439 0.00720916 1 0 1 1 0 0 +EDGE2 3117 3098 0.996953 -0.00516243 -0.0195154 1 0 1 1 0 0 +EDGE2 3117 1178 1.01546 -0.0308173 -0.00444374 1 0 1 1 0 0 +EDGE2 3117 1198 1.03736 0.0162059 -0.00608741 1 0 1 1 0 0 +EDGE2 3117 1158 1.07814 0.0553648 0.0112028 1 0 1 1 0 0 +EDGE2 3117 3097 0.107206 0.0364197 -0.0300232 1 0 1 1 0 0 +EDGE2 3117 1177 0.00312569 0.0608378 -0.0124206 1 0 1 1 0 0 +EDGE2 3117 1157 0.0247387 0.00865508 -0.0466943 1 0 1 1 0 0 +EDGE2 3117 1196 -0.969827 -0.00868567 0.0149701 1 0 1 1 0 0 +EDGE2 3117 3116 -0.988853 -0.10916 0.00430862 1 0 1 1 0 0 +EDGE2 3117 3096 -0.952681 0.047506 -0.00142801 1 0 1 1 0 0 +EDGE2 3117 1156 -0.959266 -0.00243299 0.0160096 1 0 1 1 0 0 +EDGE2 3117 1176 -0.967662 0.0964807 -0.0237655 1 0 1 1 0 0 +EDGE2 3118 1197 -0.964915 -0.0510603 0.00235582 1 0 1 1 0 0 +EDGE2 3118 1179 1.04477 -0.11509 0.010951 1 0 1 1 0 0 +EDGE2 3118 1199 1.07539 0.0684151 0.0394542 1 0 1 1 0 0 +EDGE2 3118 3099 1.02625 -0.0296782 0.000252762 1 0 1 1 0 0 +EDGE2 3118 1159 1.0429 0.0246644 0.0218469 1 0 1 1 0 0 +EDGE2 3118 3098 -0.10849 0.0127467 0.0243744 1 0 1 1 0 0 +EDGE2 3118 1178 0.0307191 -0.0536017 -0.00490415 1 0 1 1 0 0 +EDGE2 3118 1198 -0.00792886 0.0257709 0.0073868 1 0 1 1 0 0 +EDGE2 3118 1158 0.0023482 -0.00457716 0.0250593 1 0 1 1 0 0 +EDGE2 3118 3117 -1.08535 0.100796 0.00760697 1 0 1 1 0 0 +EDGE2 3118 3097 -0.954287 -0.00519788 0.0239196 1 0 1 1 0 0 +EDGE2 3118 1177 -0.951575 -0.075063 -0.0259154 1 0 1 1 0 0 +EDGE2 3118 1157 -0.917067 -0.0298407 -0.0184497 1 0 1 1 0 0 +EDGE2 3119 1160 0.989095 -0.0279076 0.0175832 1 0 1 1 0 0 +EDGE2 3119 1200 0.997787 0.0901369 -0.0136127 1 0 1 1 0 0 +EDGE2 3119 3100 1.04275 -0.0761648 -0.00908033 1 0 1 1 0 0 +EDGE2 3119 1180 1.05277 -0.013735 -0.0137829 1 0 1 1 0 0 +EDGE2 3119 900 0.934817 -0.00230977 -3.1653 1 0 1 1 0 0 +EDGE2 3119 840 0.880125 -0.0480607 -3.13671 1 0 1 1 0 0 +EDGE2 3119 860 1.01927 0.0855644 -3.12787 1 0 1 1 0 0 +EDGE2 3119 1179 0.0144053 0.0797615 0.0292446 1 0 1 1 0 0 +EDGE2 3119 1199 0.0187628 -0.0342803 0.00495375 1 0 1 1 0 0 +EDGE2 3119 3099 -0.0233893 0.0283964 -0.00768742 1 0 1 1 0 0 +EDGE2 3119 1159 -0.0366943 -0.0257906 -0.0280278 1 0 1 1 0 0 +EDGE2 3119 3098 -1.06481 -0.0592129 -0.0124916 1 0 1 1 0 0 +EDGE2 3119 3118 -1.03686 0.010655 -0.00464438 1 0 1 1 0 0 +EDGE2 3119 1178 -1.08858 -0.0214717 -0.00356703 1 0 1 1 0 0 +EDGE2 3119 1198 -0.94408 -0.0313032 -0.00213634 1 0 1 1 0 0 +EDGE2 3119 1158 -1.05325 -0.014167 0.0210083 1 0 1 1 0 0 +EDGE2 3120 839 1.02751 -0.0102759 -3.14341 1 0 1 1 0 0 +EDGE2 3120 899 0.969988 0.0322653 -3.11401 1 0 1 1 0 0 +EDGE2 3120 859 0.993279 0.112143 -3.13926 1 0 1 1 0 0 +EDGE2 3120 841 0.0268279 -0.98291 -1.59504 1 0 1 1 0 0 +EDGE2 3120 901 0.0122613 -1.05024 -1.62019 1 0 1 1 0 0 +EDGE2 3120 1201 0.0418986 -1.10485 -1.59016 1 0 1 1 0 0 +EDGE2 3120 861 -0.0258095 -1.02663 -1.57696 1 0 1 1 0 0 +EDGE2 3120 1160 0.0360442 0.0183554 -0.0178251 1 0 1 1 0 0 +EDGE2 3120 1200 0.0348346 -0.116199 -0.0201784 1 0 1 1 0 0 +EDGE2 3120 3100 0.00303965 -0.0255633 -0.0133267 1 0 1 1 0 0 +EDGE2 3120 1180 0.107549 -0.0310374 -0.00523389 1 0 1 1 0 0 +EDGE2 3120 900 -0.00232401 -0.0376086 -3.14225 1 0 1 1 0 0 +EDGE2 3120 840 -0.0216549 0.0369359 -3.17792 1 0 1 1 0 0 +EDGE2 3120 860 -0.0881176 -0.0196455 -3.1502 1 0 1 1 0 0 +EDGE2 3120 3101 -0.00189529 0.960711 1.58304 1 0 1 1 0 0 +EDGE2 3120 1161 -0.0166885 1.05106 1.54571 1 0 1 1 0 0 +EDGE2 3120 1181 -0.0510605 1.02928 1.57226 1 0 1 1 0 0 +EDGE2 3120 3119 -1.03974 0.0457358 -0.0036394 1 0 1 1 0 0 +EDGE2 3120 1179 -0.983852 -0.0699978 -0.0363231 1 0 1 1 0 0 +EDGE2 3120 1199 -0.970236 0.0682092 -0.00733641 1 0 1 1 0 0 +EDGE2 3120 3099 -1.0943 -0.000995106 -0.0236104 1 0 1 1 0 0 +EDGE2 3120 1159 -1.02004 0.00398814 -0.0126969 1 0 1 1 0 0 +EDGE2 3121 1160 -1.06019 0.010738 -1.56323 1 0 1 1 0 0 +EDGE2 3121 1200 -1.03216 -0.0400793 -1.52869 1 0 1 1 0 0 +EDGE2 3121 3100 -1.01372 -0.0478061 -1.53573 1 0 1 1 0 0 +EDGE2 3121 3120 -1.01343 0.0198925 -1.52944 1 0 1 1 0 0 +EDGE2 3121 1180 -0.981813 -0.0586939 -1.57882 1 0 1 1 0 0 +EDGE2 3121 900 -1.00676 0.0062135 1.51522 1 0 1 1 0 0 +EDGE2 3121 840 -1.01642 -0.0750733 1.57721 1 0 1 1 0 0 +EDGE2 3121 860 -1.0116 -0.0173777 1.56509 1 0 1 1 0 0 +EDGE2 3121 3101 0.0271673 -0.0106526 -0.00456223 1 0 1 1 0 0 +EDGE2 3121 1161 0.033353 0.117581 0.0518625 1 0 1 1 0 0 +EDGE2 3121 1181 -0.0471596 -0.0225176 0.0118436 1 0 1 1 0 0 +EDGE2 3121 1182 0.980934 -0.0957617 -0.0112116 1 0 1 1 0 0 +EDGE2 3121 3102 0.954114 -0.027107 -0.00541264 1 0 1 1 0 0 +EDGE2 3121 1162 0.954727 0.0424147 0.0112503 1 0 1 1 0 0 +EDGE2 3122 3101 -1.07935 0.0915747 0.0230716 1 0 1 1 0 0 +EDGE2 3122 3121 -0.90975 -0.0149324 -0.00928054 1 0 1 1 0 0 +EDGE2 3122 1161 -0.993126 -0.110417 0.00559819 1 0 1 1 0 0 +EDGE2 3122 1181 -0.890646 -0.0381185 -0.0165698 1 0 1 1 0 0 +EDGE2 3122 1182 0.0316008 -0.0277489 -0.00887899 1 0 1 1 0 0 +EDGE2 3122 3102 0.0293815 -0.015994 0.0315507 1 0 1 1 0 0 +EDGE2 3122 1162 -0.022269 -0.0477091 -0.0125805 1 0 1 1 0 0 +EDGE2 3122 1163 0.99949 -0.0462141 0.0125372 1 0 1 1 0 0 +EDGE2 3122 3103 1.031 -0.0434075 -0.0155225 1 0 1 1 0 0 +EDGE2 3122 1183 1.05802 0.0521398 0.00907839 1 0 1 1 0 0 +EDGE2 3123 1182 -0.993678 0.0118279 0.0349979 1 0 1 1 0 0 +EDGE2 3123 3122 -0.998793 -0.0935022 0.0276741 1 0 1 1 0 0 +EDGE2 3123 3102 -1.04761 0.0553716 -0.019802 1 0 1 1 0 0 +EDGE2 3123 1162 -1.03379 0.00404264 -0.0394664 1 0 1 1 0 0 +EDGE2 3123 1163 0.095131 0.0489952 -0.00743518 1 0 1 1 0 0 +EDGE2 3123 3103 -0.0143787 -0.0843403 0.00381996 1 0 1 1 0 0 +EDGE2 3123 1183 -0.042384 -0.0786441 0.00372969 1 0 1 1 0 0 +EDGE2 3123 1184 0.982216 0.066314 0.023506 1 0 1 1 0 0 +EDGE2 3123 3104 1.00229 0.00352307 -0.00617379 1 0 1 1 0 0 +EDGE2 3123 1164 1.04669 0.04281 0.00976274 1 0 1 1 0 0 +EDGE2 3124 1163 -0.989362 0.0127551 -0.00403122 1 0 1 1 0 0 +EDGE2 3124 3103 -0.980982 0.0952451 0.0132965 1 0 1 1 0 0 +EDGE2 3124 3123 -1.12035 0.0522287 -0.0326056 1 0 1 1 0 0 +EDGE2 3124 1183 -1.06702 0.0316611 0.0218686 1 0 1 1 0 0 +EDGE2 3124 1184 0.0603992 -0.0458181 -0.0345422 1 0 1 1 0 0 +EDGE2 3124 3104 -0.101611 -0.0131772 -0.0417038 1 0 1 1 0 0 +EDGE2 3124 1164 -0.0351926 -0.0235927 -0.0204965 1 0 1 1 0 0 +EDGE2 3124 3105 1.02303 -0.0926638 -0.00560288 1 0 1 1 0 0 +EDGE2 3124 1185 1.06002 -0.0130216 0.017411 1 0 1 1 0 0 +EDGE2 3124 3065 1.04968 0.0696148 -3.13082 1 0 1 1 0 0 +EDGE2 3124 3085 0.973967 0.0483003 -3.10661 1 0 1 1 0 0 +EDGE2 3124 1165 1.00005 0.0202447 -0.00262598 1 0 1 1 0 0 +EDGE2 3125 3066 0.0194748 -1.02893 -1.53997 1 0 1 1 0 0 +EDGE2 3125 1184 -0.995751 -0.00836636 -0.00451641 1 0 1 1 0 0 +EDGE2 3125 3104 -1.01002 0.0996397 -0.0179686 1 0 1 1 0 0 +EDGE2 3125 3124 -0.97611 0.072688 0.0115827 1 0 1 1 0 0 +EDGE2 3125 1164 -0.933165 0.0077076 0.0195119 1 0 1 1 0 0 +EDGE2 3125 3105 -0.010676 0.0416314 0.00968116 1 0 1 1 0 0 +EDGE2 3125 1185 0.0332638 0.112689 -0.0394115 1 0 1 1 0 0 +EDGE2 3125 3065 0.00150287 0.0436195 -3.12611 1 0 1 1 0 0 +EDGE2 3125 3085 0.0227535 -0.0810096 -3.14005 1 0 1 1 0 0 +EDGE2 3125 1165 -0.0378721 0.0124836 -0.00138683 1 0 1 1 0 0 +EDGE2 3125 1166 0.0302327 0.99901 1.59668 1 0 1 1 0 0 +EDGE2 3125 3086 -0.0702403 0.988163 1.60044 1 0 1 1 0 0 +EDGE2 3125 3106 0.0167334 0.991941 1.56738 1 0 1 1 0 0 +EDGE2 3125 1186 0.0263846 0.933301 1.54069 1 0 1 1 0 0 +EDGE2 3125 3064 0.952647 -0.0384023 -3.12982 1 0 1 1 0 0 +EDGE2 3125 3084 1.0323 -0.0102948 -3.18122 1 0 1 1 0 0 +EDGE2 3126 3105 -0.944711 0.0400928 -1.60916 1 0 1 1 0 0 +EDGE2 3126 3125 -1.03713 0.0108146 -1.56308 1 0 1 1 0 0 +EDGE2 3126 1185 -0.928322 -0.00970455 -1.58103 1 0 1 1 0 0 +EDGE2 3126 3065 -1.04368 0.0741889 1.54337 1 0 1 1 0 0 +EDGE2 3126 3085 -0.987104 0.0170723 1.56612 1 0 1 1 0 0 +EDGE2 3126 1165 -0.966621 0.0114877 -1.60784 1 0 1 1 0 0 +EDGE2 3126 1166 0.0184218 0.0345507 -0.00962431 1 0 1 1 0 0 +EDGE2 3126 3086 -0.0308171 0.0315904 0.0296735 1 0 1 1 0 0 +EDGE2 3126 3106 0.0406459 0.0045858 -0.015407 1 0 1 1 0 0 +EDGE2 3126 1186 -0.0946038 0.0129804 -0.000830378 1 0 1 1 0 0 +EDGE2 3126 3107 1.04273 0.0743278 -0.0125829 1 0 1 1 0 0 +EDGE2 3126 1187 1.07383 -0.026228 0.0351005 1 0 1 1 0 0 +EDGE2 3126 3087 0.981147 -0.0345578 0.00966289 1 0 1 1 0 0 +EDGE2 3126 1167 0.991323 -0.0180386 0.0172106 1 0 1 1 0 0 +EDGE2 3127 1166 -0.944212 -0.0250174 -0.0295022 1 0 1 1 0 0 +EDGE2 3127 3086 -0.992274 0.0272208 0.0163592 1 0 1 1 0 0 +EDGE2 3127 3106 -1.0091 -0.051224 0.00624001 1 0 1 1 0 0 +EDGE2 3127 3126 -1.0194 0.0154246 0.00961704 1 0 1 1 0 0 +EDGE2 3127 1186 -0.957659 -0.0753391 -0.0273118 1 0 1 1 0 0 +EDGE2 3127 3107 -0.0750053 -0.0374304 -0.022933 1 0 1 1 0 0 +EDGE2 3127 1187 -0.0489214 0.0225845 0.0401 1 0 1 1 0 0 +EDGE2 3127 3087 -0.0385123 -0.0273449 -0.0113088 1 0 1 1 0 0 +EDGE2 3127 1167 -0.00285325 -0.0200077 -0.00137817 1 0 1 1 0 0 +EDGE2 3127 1188 1.00691 -0.0149467 0.0212226 1 0 1 1 0 0 +EDGE2 3127 3088 0.905113 0.07593 0.0272492 1 0 1 1 0 0 +EDGE2 3127 3108 0.995186 0.085851 -0.0381591 1 0 1 1 0 0 +EDGE2 3127 1168 0.960132 0.0275303 0.0253565 1 0 1 1 0 0 +EDGE2 3128 3107 -1.0718 0.0165392 -0.00906955 1 0 1 1 0 0 +EDGE2 3128 3127 -1.06898 -0.064265 -0.0051855 1 0 1 1 0 0 +EDGE2 3128 1187 -0.95369 -0.0432548 0.0145039 1 0 1 1 0 0 +EDGE2 3128 3087 -1.06987 0.00596899 -0.00943717 1 0 1 1 0 0 +EDGE2 3128 1167 -0.99384 0.0311391 0.0194755 1 0 1 1 0 0 +EDGE2 3128 1188 0.058943 0.0830823 -0.00972217 1 0 1 1 0 0 +EDGE2 3128 3088 0.0177874 0.0559672 -0.0151092 1 0 1 1 0 0 +EDGE2 3128 3108 0.0554936 -0.0946607 0.006422 1 0 1 1 0 0 +EDGE2 3128 1168 -0.11731 0.0479724 -0.0180084 1 0 1 1 0 0 +EDGE2 3128 3109 0.969419 0.0604235 -0.0243453 1 0 1 1 0 0 +EDGE2 3128 1189 1.12858 -0.0534679 -0.0268624 1 0 1 1 0 0 +EDGE2 3128 3089 0.950828 -0.0571597 -0.0106298 1 0 1 1 0 0 +EDGE2 3128 1169 1.03052 -0.0163312 -0.0120466 1 0 1 1 0 0 +EDGE2 3129 3128 -1.0054 0.100632 0.00636166 1 0 1 1 0 0 +EDGE2 3129 1188 -0.936623 -0.0606035 -0.00125869 1 0 1 1 0 0 +EDGE2 3129 3088 -0.992329 -0.0585897 -0.0201746 1 0 1 1 0 0 +EDGE2 3129 3108 -1.08807 -0.0117253 -0.011201 1 0 1 1 0 0 +EDGE2 3129 1168 -1.01841 -0.0281282 -0.0121133 1 0 1 1 0 0 +EDGE2 3129 3109 -0.00954854 0.0105625 -0.0134556 1 0 1 1 0 0 +EDGE2 3129 1189 -0.0445446 0.00342225 0.0115984 1 0 1 1 0 0 +EDGE2 3129 3089 0.0676914 0.0466039 0.00911422 1 0 1 1 0 0 +EDGE2 3129 1169 0.0414441 -0.0388691 0.0290614 1 0 1 1 0 0 +EDGE2 3129 3050 1.06726 -0.0450261 -3.13975 1 0 1 1 0 0 +EDGE2 3129 3110 0.969117 0.076804 -0.00920447 1 0 1 1 0 0 +EDGE2 3129 3090 1.01115 0.0434521 -0.0286297 1 0 1 1 0 0 +EDGE2 3129 1130 1.01221 -0.0537799 -3.13937 1 0 1 1 0 0 +EDGE2 3129 1170 1.03531 0.00202708 0.0115244 1 0 1 1 0 0 +EDGE2 3129 1190 0.996012 0.00526323 -0.0201239 1 0 1 1 0 0 +EDGE2 3129 3030 1.01331 -0.0457346 -3.14119 1 0 1 1 0 0 +EDGE2 3129 1150 1.02959 0.00861098 -3.13102 1 0 1 1 0 0 +EDGE2 3129 1110 1.01551 -0.0722797 -3.14092 1 0 1 1 0 0 +EDGE2 3130 3109 -0.977195 -0.0283372 0.0161079 1 0 1 1 0 0 +EDGE2 3130 3129 -0.997707 -0.00274413 0.00845607 1 0 1 1 0 0 +EDGE2 3130 1189 -0.95822 -0.0457154 -0.0374439 1 0 1 1 0 0 +EDGE2 3130 3089 -0.929256 0.0116379 -0.00701744 1 0 1 1 0 0 +EDGE2 3130 1169 -0.925819 0.00583516 0.00505212 1 0 1 1 0 0 +EDGE2 3130 3050 -0.0199485 -0.0559828 -3.16304 1 0 1 1 0 0 +EDGE2 3130 1151 -0.0143319 1.0504 1.57641 1 0 1 1 0 0 +EDGE2 3130 1191 0.0049524 1.11044 1.53683 1 0 1 1 0 0 +EDGE2 3130 3091 -0.00816951 0.981069 1.5527 1 0 1 1 0 0 +EDGE2 3130 3111 0.00991611 0.950974 1.58786 1 0 1 1 0 0 +EDGE2 3130 1171 -0.0522767 0.970922 1.55863 1 0 1 1 0 0 +EDGE2 3130 3110 0.0181992 0.0214174 -0.0134395 1 0 1 1 0 0 +EDGE2 3130 3090 -0.00264718 -0.00620777 0.00771418 1 0 1 1 0 0 +EDGE2 3130 1130 -0.000609776 -0.0258726 -3.12248 1 0 1 1 0 0 +EDGE2 3130 1170 -0.00685022 -0.0630756 -0.0110562 1 0 1 1 0 0 +EDGE2 3130 1190 -0.0437906 -0.0299226 0.0111087 1 0 1 1 0 0 +EDGE2 3130 3030 -0.0127011 0.00358311 -3.1651 1 0 1 1 0 0 +EDGE2 3130 1150 0.0416021 -0.0860006 -3.14005 1 0 1 1 0 0 +EDGE2 3130 1110 -0.0508128 -0.0324971 -3.13997 1 0 1 1 0 0 +EDGE2 3130 1109 1.09393 -0.0207763 -3.11171 1 0 1 1 0 0 +EDGE2 3130 1149 0.973852 -0.0167574 -3.16532 1 0 1 1 0 0 +EDGE2 3130 3029 1.04631 0.0753653 -3.14268 1 0 1 1 0 0 +EDGE2 3130 3049 0.998468 0.00514361 -3.11159 1 0 1 1 0 0 +EDGE2 3130 1129 1.04695 -0.0483523 -3.12652 1 0 1 1 0 0 +EDGE2 3130 1111 -0.00454149 -0.996032 -1.56018 1 0 1 1 0 0 +EDGE2 3130 3031 0.0756336 -0.941916 -1.6008 1 0 1 1 0 0 +EDGE2 3130 3051 -0.0487522 -1.02634 -1.52254 1 0 1 1 0 0 +EDGE2 3130 1131 -0.01037 -1.0247 -1.60264 1 0 1 1 0 0 +EDGE2 3131 3050 -1.00388 0.0901811 1.55598 1 0 1 1 0 0 +EDGE2 3131 3092 1.00916 -0.0139336 -0.0148385 1 0 1 1 0 0 +EDGE2 3131 3112 1.0769 0.0705461 0.025143 1 0 1 1 0 0 +EDGE2 3131 1152 1.00164 0.0295926 -0.0174126 1 0 1 1 0 0 +EDGE2 3131 1172 1.0973 -0.0105627 -0.0118172 1 0 1 1 0 0 +EDGE2 3131 1192 0.932216 0.0651645 0.0126816 1 0 1 1 0 0 +EDGE2 3131 1151 -0.0168145 -0.0448161 -0.0357083 1 0 1 1 0 0 +EDGE2 3131 1191 -0.040154 -0.0552648 -0.0122936 1 0 1 1 0 0 +EDGE2 3131 3091 0.00899779 0.0931627 0.0387082 1 0 1 1 0 0 +EDGE2 3131 3111 0.0149288 0.0219092 0.019837 1 0 1 1 0 0 +EDGE2 3131 1171 0.0292291 0.0990876 -0.0118179 1 0 1 1 0 0 +EDGE2 3131 3110 -0.930356 0.00895615 -1.59886 1 0 1 1 0 0 +EDGE2 3131 3130 -1.07266 0.0728799 -1.55861 1 0 1 1 0 0 +EDGE2 3131 3090 -1.01852 -0.0206386 -1.57371 1 0 1 1 0 0 +EDGE2 3131 1130 -1.10158 0.00378453 1.56977 1 0 1 1 0 0 +EDGE2 3131 1170 -1.06739 0.0291078 -1.56057 1 0 1 1 0 0 +EDGE2 3131 1190 -0.998241 0.00962968 -1.56965 1 0 1 1 0 0 +EDGE2 3131 3030 -0.924605 -0.0614966 1.55586 1 0 1 1 0 0 +EDGE2 3131 1150 -1.03031 -0.0618311 1.57824 1 0 1 1 0 0 +EDGE2 3131 1110 -0.965145 -0.0208802 1.55575 1 0 1 1 0 0 +EDGE2 3132 1173 0.986965 -0.000252895 0.0456312 1 0 1 1 0 0 +EDGE2 3132 3093 1.05502 0.0310006 0.00700314 1 0 1 1 0 0 +EDGE2 3132 3113 0.992773 -0.049977 -0.000790998 1 0 1 1 0 0 +EDGE2 3132 1193 0.972928 -0.011929 0.0218147 1 0 1 1 0 0 +EDGE2 3132 3131 -0.987086 0.0478036 -0.0118104 1 0 1 1 0 0 +EDGE2 3132 3092 -0.0869273 -0.0123913 0.0155462 1 0 1 1 0 0 +EDGE2 3132 1153 0.913079 0.0242304 0.0294173 1 0 1 1 0 0 +EDGE2 3132 3112 -0.00687267 -0.12655 -0.0134236 1 0 1 1 0 0 +EDGE2 3132 1152 -0.0461848 0.022493 0.0108364 1 0 1 1 0 0 +EDGE2 3132 1172 0.0442229 0.0743768 0.0105789 1 0 1 1 0 0 +EDGE2 3132 1192 0.0473909 -0.0661117 0.017186 1 0 1 1 0 0 +EDGE2 3132 1151 -1.07346 -0.0383101 -0.021524 1 0 1 1 0 0 +EDGE2 3132 1191 -0.960111 -0.112358 -0.00974072 1 0 1 1 0 0 +EDGE2 3132 3091 -1.02563 -0.0740164 -0.00252782 1 0 1 1 0 0 +EDGE2 3132 3111 -1.01518 -0.0393998 -0.014295 1 0 1 1 0 0 +EDGE2 3132 1171 -1.04347 0.0100048 -0.00233659 1 0 1 1 0 0 +EDGE2 3133 1173 -0.044918 0.0131155 0.0052978 1 0 1 1 0 0 +EDGE2 3133 1174 0.985855 0.0245607 0.00616989 1 0 1 1 0 0 +EDGE2 3133 3094 0.930561 0.00928329 0.0168292 1 0 1 1 0 0 +EDGE2 3133 3114 1.06809 -0.0228913 0.0252148 1 0 1 1 0 0 +EDGE2 3133 1194 0.958033 0.0577362 -0.00887879 1 0 1 1 0 0 +EDGE2 3133 1154 1.02858 -0.0605583 -0.0138332 1 0 1 1 0 0 +EDGE2 3133 3093 0.0707926 0.0294859 -0.0090512 1 0 1 1 0 0 +EDGE2 3133 3113 0.0109223 0.006805 0.0429211 1 0 1 1 0 0 +EDGE2 3133 1193 -0.00482808 -0.0497693 -0.00392786 1 0 1 1 0 0 +EDGE2 3133 3092 -0.937527 -0.0666566 0.00377396 1 0 1 1 0 0 +EDGE2 3133 1153 -0.0213744 -0.0686691 -0.0016402 1 0 1 1 0 0 +EDGE2 3133 3132 -0.98618 -0.0693122 0.0182658 1 0 1 1 0 0 +EDGE2 3133 3112 -1.03749 -0.043519 -0.0121387 1 0 1 1 0 0 +EDGE2 3133 1152 -0.952055 0.0382676 0.0380306 1 0 1 1 0 0 +EDGE2 3133 1172 -0.937306 0.00644308 0.0104164 1 0 1 1 0 0 +EDGE2 3133 1192 -1.03367 0.0183849 0.0120619 1 0 1 1 0 0 +EDGE2 3134 1173 -1.04836 -0.00959931 -0.0398911 1 0 1 1 0 0 +EDGE2 3134 1174 0.0450272 -0.0622277 -0.00915 1 0 1 1 0 0 +EDGE2 3134 3115 0.995546 -0.0978448 -0.0102167 1 0 1 1 0 0 +EDGE2 3134 1175 0.995381 0.0526476 -0.00800114 1 0 1 1 0 0 +EDGE2 3134 1195 0.996353 0.025386 0.00126663 1 0 1 1 0 0 +EDGE2 3134 3095 1.04369 0.0895215 0.0156136 1 0 1 1 0 0 +EDGE2 3134 1155 1.04526 -0.104543 0.000453676 1 0 1 1 0 0 +EDGE2 3134 3094 -0.0253526 -0.0443105 0.000519723 1 0 1 1 0 0 +EDGE2 3134 3114 0.0196184 0.0454716 -0.0258073 1 0 1 1 0 0 +EDGE2 3134 1194 -0.0416792 -0.00486559 -0.0149473 1 0 1 1 0 0 +EDGE2 3134 1154 0.0202262 -0.00231856 0.0109521 1 0 1 1 0 0 +EDGE2 3134 3133 -0.98233 0.0123643 0.000948332 1 0 1 1 0 0 +EDGE2 3134 3093 -0.935299 0.034636 0.0107004 1 0 1 1 0 0 +EDGE2 3134 3113 -1.0574 0.0184829 0.013731 1 0 1 1 0 0 +EDGE2 3134 1193 -1.07861 0.0596895 0.0402096 1 0 1 1 0 0 +EDGE2 3134 1153 -0.972576 0.076942 0.0284163 1 0 1 1 0 0 +EDGE2 3135 1196 -0.0484675 1.02188 1.53953 1 0 1 1 0 0 +EDGE2 3135 3116 -0.00242973 1.0033 1.56518 1 0 1 1 0 0 +EDGE2 3135 3096 -0.00783589 1.02448 1.57003 1 0 1 1 0 0 +EDGE2 3135 1156 -0.0758804 1.0268 1.54837 1 0 1 1 0 0 +EDGE2 3135 1176 -0.1285 0.905605 1.57021 1 0 1 1 0 0 +EDGE2 3135 1174 -1.01804 -0.0923071 0.00911856 1 0 1 1 0 0 +EDGE2 3135 3115 0.051138 0.0199313 -0.0327682 1 0 1 1 0 0 +EDGE2 3135 1175 -0.0145897 -0.0933902 -0.00314644 1 0 1 1 0 0 +EDGE2 3135 1195 0.0597924 -0.00747701 0.0295537 1 0 1 1 0 0 +EDGE2 3135 3095 -0.0099247 -0.100116 0.017382 1 0 1 1 0 0 +EDGE2 3135 1155 0.0521715 0.0900108 -0.0248498 1 0 1 1 0 0 +EDGE2 3135 3094 -1.05776 -0.0344124 0.0027957 1 0 1 1 0 0 +EDGE2 3135 3114 -0.918881 0.0451236 -0.0157265 1 0 1 1 0 0 +EDGE2 3135 3134 -0.961384 -0.0408447 0.0217673 1 0 1 1 0 0 +EDGE2 3135 1194 -1.01988 -0.0306358 -0.0340778 1 0 1 1 0 0 +EDGE2 3135 1154 -1.15024 -0.0581491 0.0269831 1 0 1 1 0 0 +EDGE2 3136 1197 0.971781 0.043901 0.0116185 1 0 1 1 0 0 +EDGE2 3136 3117 0.986787 -0.0342893 -0.00134697 1 0 1 1 0 0 +EDGE2 3136 3097 0.971447 -0.0544581 -0.0149555 1 0 1 1 0 0 +EDGE2 3136 1177 1.07658 0.0552094 0.00881381 1 0 1 1 0 0 +EDGE2 3136 1157 1.01944 -0.00512092 -0.00667715 1 0 1 1 0 0 +EDGE2 3136 1196 0.0530602 -0.0813684 -0.00133223 1 0 1 1 0 0 +EDGE2 3136 3116 -0.013474 0.0164901 0.00133527 1 0 1 1 0 0 +EDGE2 3136 3096 -0.0288146 0.0752533 0.00739339 1 0 1 1 0 0 +EDGE2 3136 1156 -0.0292713 0.0220275 -0.0269158 1 0 1 1 0 0 +EDGE2 3136 1176 -0.0942694 -0.027736 0.0185416 1 0 1 1 0 0 +EDGE2 3136 3115 -1.0934 0.0392072 -1.58241 1 0 1 1 0 0 +EDGE2 3136 3135 -0.986642 0.0255561 -1.57432 1 0 1 1 0 0 +EDGE2 3136 1175 -0.980468 0.0665634 -1.58868 1 0 1 1 0 0 +EDGE2 3136 1195 -1.05588 -0.00441579 -1.5737 1 0 1 1 0 0 +EDGE2 3136 3095 -1.02739 -0.0892162 -1.56811 1 0 1 1 0 0 +EDGE2 3136 1155 -1.02509 -0.118711 -1.55515 1 0 1 1 0 0 +EDGE2 3137 1197 0.0593464 0.0177088 0.0340611 1 0 1 1 0 0 +EDGE2 3137 3098 0.942137 0.0517652 -0.0145196 1 0 1 1 0 0 +EDGE2 3137 3118 0.988921 0.0422397 0.0225834 1 0 1 1 0 0 +EDGE2 3137 1178 1.00575 0.0187192 -0.00769022 1 0 1 1 0 0 +EDGE2 3137 1198 1.06705 -0.0725527 0.0646137 1 0 1 1 0 0 +EDGE2 3137 1158 0.965454 -0.0271369 0.0225168 1 0 1 1 0 0 +EDGE2 3137 3117 0.0111111 0.0226687 -0.00392719 1 0 1 1 0 0 +EDGE2 3137 3097 -0.0528411 0.117817 0.00202781 1 0 1 1 0 0 +EDGE2 3137 1177 -0.0432587 -0.0375322 -0.00402074 1 0 1 1 0 0 +EDGE2 3137 1157 0.0955374 -0.0363545 0.021604 1 0 1 1 0 0 +EDGE2 3137 1196 -0.964521 0.0635245 -0.00848924 1 0 1 1 0 0 +EDGE2 3137 3116 -0.947882 -0.0311839 -0.0356228 1 0 1 1 0 0 +EDGE2 3137 3136 -0.9413 -0.0910562 -0.0117801 1 0 1 1 0 0 +EDGE2 3137 3096 -1.02411 0.0374747 0.042172 1 0 1 1 0 0 +EDGE2 3137 1156 -1.03581 -0.0243325 -0.00561966 1 0 1 1 0 0 +EDGE2 3137 1176 -1.04265 0.0561362 -0.00327612 1 0 1 1 0 0 +EDGE2 3138 1197 -1.02701 0.0199366 -0.00429297 1 0 1 1 0 0 +EDGE2 3138 3119 1.09787 -0.0651782 -0.0178791 1 0 1 1 0 0 +EDGE2 3138 1179 1.01085 0.139089 -0.0111561 1 0 1 1 0 0 +EDGE2 3138 1199 0.972212 -0.0696479 0.0387206 1 0 1 1 0 0 +EDGE2 3138 3099 1.01319 0.0735097 -0.00133238 1 0 1 1 0 0 +EDGE2 3138 1159 1.00602 0.00428236 -0.0192242 1 0 1 1 0 0 +EDGE2 3138 3098 0.0463263 -0.0598751 0.0286215 1 0 1 1 0 0 +EDGE2 3138 3118 -0.00316478 -0.0864784 0.00633741 1 0 1 1 0 0 +EDGE2 3138 1178 -0.13439 -0.0541625 0.0189457 1 0 1 1 0 0 +EDGE2 3138 1198 -0.0237123 -0.0289374 -0.0192183 1 0 1 1 0 0 +EDGE2 3138 1158 0.0506731 0.0305853 -0.00177397 1 0 1 1 0 0 +EDGE2 3138 3117 -1.0025 0.0117235 -0.0117588 1 0 1 1 0 0 +EDGE2 3138 3137 -0.945231 0.0599822 -0.022979 1 0 1 1 0 0 +EDGE2 3138 3097 -1.03924 -0.00621761 -0.000860506 1 0 1 1 0 0 +EDGE2 3138 1177 -0.90651 0.0611623 -0.00430447 1 0 1 1 0 0 +EDGE2 3138 1157 -1.01809 0.00261281 0.0212562 1 0 1 1 0 0 +EDGE2 3139 1160 0.931611 -0.0116788 -0.00417195 1 0 1 1 0 0 +EDGE2 3139 1200 0.968089 -0.0158151 0.0125768 1 0 1 1 0 0 +EDGE2 3139 3100 0.990735 0.0172471 -0.0444058 1 0 1 1 0 0 +EDGE2 3139 3120 1.10601 -0.0433181 -0.0140975 1 0 1 1 0 0 +EDGE2 3139 1180 0.958222 0.0309327 -0.00950657 1 0 1 1 0 0 +EDGE2 3139 900 1.05197 0.0779821 -3.11719 1 0 1 1 0 0 +EDGE2 3139 840 1.05467 -0.0352608 -3.15015 1 0 1 1 0 0 +EDGE2 3139 860 1.02505 -0.0427007 -3.11382 1 0 1 1 0 0 +EDGE2 3139 3119 -0.103451 -0.0570415 -0.0196137 1 0 1 1 0 0 +EDGE2 3139 1179 0.0272816 0.0425129 -0.00710184 1 0 1 1 0 0 +EDGE2 3139 1199 -0.120657 -0.115816 -0.0163735 1 0 1 1 0 0 +EDGE2 3139 3099 0.0190443 0.000762782 0.000834619 1 0 1 1 0 0 +EDGE2 3139 1159 -0.04846 0.0366936 0.0242625 1 0 1 1 0 0 +EDGE2 3139 3098 -1.07912 -0.0200755 0.00696756 1 0 1 1 0 0 +EDGE2 3139 3138 -0.994127 -0.0844961 -0.00674789 1 0 1 1 0 0 +EDGE2 3139 3118 -1.0434 0.0610078 -0.00450897 1 0 1 1 0 0 +EDGE2 3139 1178 -0.989974 -0.0879524 0.0315338 1 0 1 1 0 0 +EDGE2 3139 1198 -1.05055 -0.0359531 0.0259255 1 0 1 1 0 0 +EDGE2 3139 1158 -0.911329 -0.0814389 -0.00589287 1 0 1 1 0 0 +EDGE2 3140 839 0.970036 0.0401489 -3.16811 1 0 1 1 0 0 +EDGE2 3140 899 0.988092 -0.0273001 -3.17057 1 0 1 1 0 0 +EDGE2 3140 859 1.05067 -0.0486931 -3.1395 1 0 1 1 0 0 +EDGE2 3140 841 -0.00116598 -0.97406 -1.56418 1 0 1 1 0 0 +EDGE2 3140 901 -0.116692 -1.01844 -1.56873 1 0 1 1 0 0 +EDGE2 3140 1201 0.00866543 -0.996975 -1.56704 1 0 1 1 0 0 +EDGE2 3140 861 -0.0303228 -1.061 -1.58638 1 0 1 1 0 0 +EDGE2 3140 1160 0.0248292 0.0143868 0.0152211 1 0 1 1 0 0 +EDGE2 3140 1200 -0.0392714 0.0448958 -0.054994 1 0 1 1 0 0 +EDGE2 3140 3100 -0.0414356 0.0648656 -0.00436008 1 0 1 1 0 0 +EDGE2 3140 3120 0.00250352 0.0870662 0.0645665 1 0 1 1 0 0 +EDGE2 3140 1180 -0.0692061 0.0841227 0.0176059 1 0 1 1 0 0 +EDGE2 3140 900 -0.0344937 0.017662 -3.11952 1 0 1 1 0 0 +EDGE2 3140 840 0.0142968 0.046485 -3.14906 1 0 1 1 0 0 +EDGE2 3140 860 -0.0391816 -0.0318086 -3.1695 1 0 1 1 0 0 +EDGE2 3140 3101 0.0161152 1.01741 1.60703 1 0 1 1 0 0 +EDGE2 3140 3121 0.00759265 0.997574 1.52379 1 0 1 1 0 0 +EDGE2 3140 1161 -0.0358174 0.950952 1.5785 1 0 1 1 0 0 +EDGE2 3140 1181 0.0492036 1.04921 1.56196 1 0 1 1 0 0 +EDGE2 3140 3119 -0.992238 -0.0550053 0.0092301 1 0 1 1 0 0 +EDGE2 3140 3139 -0.964801 -0.086086 -0.000317256 1 0 1 1 0 0 +EDGE2 3140 1179 -0.99462 0.0773744 0.0281931 1 0 1 1 0 0 +EDGE2 3140 1199 -1.01418 -0.0203898 -0.00964445 1 0 1 1 0 0 +EDGE2 3140 3099 -1.0205 -0.0836363 -0.0109086 1 0 1 1 0 0 +EDGE2 3140 1159 -0.981995 -0.0206429 -0.00638933 1 0 1 1 0 0 +EDGE2 3141 1160 -0.948336 0.00351121 -1.55482 1 0 1 1 0 0 +EDGE2 3141 3140 -0.981405 0.0227807 -1.57068 1 0 1 1 0 0 +EDGE2 3141 1200 -1.01088 -0.0374303 -1.53712 1 0 1 1 0 0 +EDGE2 3141 3100 -1.0353 0.0260993 -1.57697 1 0 1 1 0 0 +EDGE2 3141 3120 -0.981727 0.090103 -1.60192 1 0 1 1 0 0 +EDGE2 3141 1180 -1.04189 -0.058648 -1.59922 1 0 1 1 0 0 +EDGE2 3141 900 -0.979706 -0.0411836 1.58414 1 0 1 1 0 0 +EDGE2 3141 840 -1.03338 -0.0465844 1.54296 1 0 1 1 0 0 +EDGE2 3141 860 -0.933919 -0.00349399 1.54923 1 0 1 1 0 0 +EDGE2 3141 3101 -0.0255158 -0.0309064 -0.00834301 1 0 1 1 0 0 +EDGE2 3141 3121 0.0507264 -0.0307925 0.0215682 1 0 1 1 0 0 +EDGE2 3141 1161 -0.0515354 0.085025 -0.0274731 1 0 1 1 0 0 +EDGE2 3141 1181 0.00530385 -0.0661637 -0.00441461 1 0 1 1 0 0 +EDGE2 3141 1182 1.04274 0.0200664 -0.000157765 1 0 1 1 0 0 +EDGE2 3141 3122 0.954128 0.0879537 -0.0539784 1 0 1 1 0 0 +EDGE2 3141 3102 1.11973 -0.00998962 0.0321764 1 0 1 1 0 0 +EDGE2 3141 1162 1.00992 0.0903677 0.0298134 1 0 1 1 0 0 +EDGE2 3142 3101 -1.00532 -0.0815742 0.00359292 1 0 1 1 0 0 +EDGE2 3142 3141 -0.976008 -0.095504 0.000343242 1 0 1 1 0 0 +EDGE2 3142 3121 -0.997898 -0.0321243 0.0121127 1 0 1 1 0 0 +EDGE2 3142 1161 -1.01502 0.022358 0.0045937 1 0 1 1 0 0 +EDGE2 3142 1181 -0.997329 0.0113771 0.0153403 1 0 1 1 0 0 +EDGE2 3142 1182 0.0886229 -0.086999 -0.00753337 1 0 1 1 0 0 +EDGE2 3142 3122 0.0196836 -0.0373428 -0.00632893 1 0 1 1 0 0 +EDGE2 3142 3102 0.0276288 0.00183451 0.0285439 1 0 1 1 0 0 +EDGE2 3142 1162 -0.0162192 0.032992 -0.0285974 1 0 1 1 0 0 +EDGE2 3142 1163 1.12874 -0.0802479 0.0147848 1 0 1 1 0 0 +EDGE2 3142 3103 1.04402 0.0445167 -0.00192638 1 0 1 1 0 0 +EDGE2 3142 3123 1.06717 -0.000154463 -0.0378873 1 0 1 1 0 0 +EDGE2 3142 1183 1.12938 -0.0279459 0.00794162 1 0 1 1 0 0 +EDGE2 3143 1182 -0.995665 0.0318567 0.0210442 1 0 1 1 0 0 +EDGE2 3143 3122 -1.02086 -0.0666091 -0.00637338 1 0 1 1 0 0 +EDGE2 3143 3142 -1.0996 0.0878528 -0.030892 1 0 1 1 0 0 +EDGE2 3143 3102 -1.01065 -0.00660937 -0.0160042 1 0 1 1 0 0 +EDGE2 3143 1162 -1.00581 -0.0537188 -0.00878229 1 0 1 1 0 0 +EDGE2 3143 1163 -0.0415737 -0.109657 -0.0166135 1 0 1 1 0 0 +EDGE2 3143 3103 -0.0199082 0.0847791 -0.0093915 1 0 1 1 0 0 +EDGE2 3143 3123 0.0335888 0.0651016 0.00040107 1 0 1 1 0 0 +EDGE2 3143 1183 -0.0471473 -0.0429874 -0.0149316 1 0 1 1 0 0 +EDGE2 3143 1184 0.975981 -0.0408829 -0.0122504 1 0 1 1 0 0 +EDGE2 3143 3104 0.899145 0.0631131 0.00968281 1 0 1 1 0 0 +EDGE2 3143 3124 1.04639 -0.105529 0.0169429 1 0 1 1 0 0 +EDGE2 3143 1164 0.98572 -0.0205482 -0.0484262 1 0 1 1 0 0 +EDGE2 3144 1163 -1.01554 0.0135347 0.021742 1 0 1 1 0 0 +EDGE2 3144 3103 -0.920732 0.0526802 0.00348428 1 0 1 1 0 0 +EDGE2 3144 3123 -1.00664 -0.0133535 -0.000787951 1 0 1 1 0 0 +EDGE2 3144 3143 -0.969683 0.108955 0.0207464 1 0 1 1 0 0 +EDGE2 3144 1183 -0.970612 0.043943 -0.00398419 1 0 1 1 0 0 +EDGE2 3144 1184 0.151067 0.111396 0.0361019 1 0 1 1 0 0 +EDGE2 3144 3104 0.0140245 -0.00426155 -0.00432751 1 0 1 1 0 0 +EDGE2 3144 3124 0.012009 0.0314335 0.0221425 1 0 1 1 0 0 +EDGE2 3144 1164 -0.105953 -0.0356907 0.0133155 1 0 1 1 0 0 +EDGE2 3144 3105 0.921003 -0.0642959 -0.0226107 1 0 1 1 0 0 +EDGE2 3144 3125 0.960328 -0.00387973 -0.0593326 1 0 1 1 0 0 +EDGE2 3144 1185 1.03649 0.00167481 0.0296805 1 0 1 1 0 0 +EDGE2 3144 3065 0.959341 0.0891107 -3.1633 1 0 1 1 0 0 +EDGE2 3144 3085 1.13868 -0.0271776 -3.14249 1 0 1 1 0 0 +EDGE2 3144 1165 0.914261 -0.0265286 -0.0145923 1 0 1 1 0 0 +EDGE2 3145 3066 0.0443293 -1.0214 -1.59781 1 0 1 1 0 0 +EDGE2 3145 3144 -1.02978 -0.0391685 0.0166336 1 0 1 1 0 0 +EDGE2 3145 1184 -0.944609 0.0342045 0.0276537 1 0 1 1 0 0 +EDGE2 3145 3104 -0.931366 0.0694984 0.00798916 1 0 1 1 0 0 +EDGE2 3145 3124 -0.991802 -0.0282165 0.0222895 1 0 1 1 0 0 +EDGE2 3145 1164 -0.989807 0.0288276 -0.00114675 1 0 1 1 0 0 +EDGE2 3145 3105 0.00635024 0.0353814 0.000893241 1 0 1 1 0 0 +EDGE2 3145 3125 0.054849 -0.023824 0.00281327 1 0 1 1 0 0 +EDGE2 3145 1185 -0.0257553 -0.00972873 0.000287381 1 0 1 1 0 0 +EDGE2 3145 3065 -0.0394245 -0.0231717 -3.14309 1 0 1 1 0 0 +EDGE2 3145 3085 0.0534475 -0.0681178 -3.16492 1 0 1 1 0 0 +EDGE2 3145 1165 -0.00944476 0.042709 -0.0229036 1 0 1 1 0 0 +EDGE2 3145 1166 0.0958051 1.03899 1.60343 1 0 1 1 0 0 +EDGE2 3145 3086 0.0557719 0.923832 1.57947 1 0 1 1 0 0 +EDGE2 3145 3106 -0.0345144 1.00749 1.57512 1 0 1 1 0 0 +EDGE2 3145 3126 0.099405 0.996649 1.56861 1 0 1 1 0 0 +EDGE2 3145 1186 -0.0639509 1.06247 1.59869 1 0 1 1 0 0 +EDGE2 3145 3064 0.959865 -0.0364822 -3.16013 1 0 1 1 0 0 +EDGE2 3145 3084 1.01952 -0.0358436 -3.15404 1 0 1 1 0 0 +EDGE2 3146 3067 1.03104 -0.0333347 -0.0147038 1 0 1 1 0 0 +EDGE2 3146 3066 0.00155063 -0.122629 -0.0128028 1 0 1 1 0 0 +EDGE2 3146 3105 -0.982426 0.0429655 1.58688 1 0 1 1 0 0 +EDGE2 3146 3145 -0.988411 0.0436499 1.59027 1 0 1 1 0 0 +EDGE2 3146 3125 -0.998953 0.00602966 1.57784 1 0 1 1 0 0 +EDGE2 3146 1185 -0.918902 -0.0323935 1.59519 1 0 1 1 0 0 +EDGE2 3146 3065 -0.928261 -0.0138994 -1.56036 1 0 1 1 0 0 +EDGE2 3146 3085 -0.965141 0.0710099 -1.5536 1 0 1 1 0 0 +EDGE2 3146 1165 -0.946195 -0.0376982 1.55932 1 0 1 1 0 0 +EDGE2 3147 3068 0.899995 -0.00380379 -0.0205456 1 0 1 1 0 0 +EDGE2 3147 3067 0.0504037 -0.0511331 0.0488272 1 0 1 1 0 0 +EDGE2 3147 3146 -0.995705 -0.0327769 -0.0111823 1 0 1 1 0 0 +EDGE2 3147 3066 -1.02943 -0.0208597 -0.0131505 1 0 1 1 0 0 +EDGE2 3148 3069 1.03847 -0.0860988 -0.0307464 1 0 1 1 0 0 +EDGE2 3148 3068 -0.064436 -0.0277377 -0.0146049 1 0 1 1 0 0 +EDGE2 3148 3147 -1.01904 -0.0038581 -0.00302749 1 0 1 1 0 0 +EDGE2 3148 3067 -1.07504 0.00735625 -0.0260645 1 0 1 1 0 0 +EDGE2 3149 3070 1.02217 0.0482265 -0.0255506 1 0 1 1 0 0 +EDGE2 3149 3069 -0.01508 0.0122282 -0.00108194 1 0 1 1 0 0 +EDGE2 3149 3068 -1.03806 -0.00461645 0.00796663 1 0 1 1 0 0 +EDGE2 3149 3148 -0.992342 0.0916516 -0.00194085 1 0 1 1 0 0 +EDGE2 3150 3070 -0.0308708 -0.0304048 -0.0234581 1 0 1 1 0 0 +EDGE2 3150 3149 -1.0125 0.0150383 -0.0335111 1 0 1 1 0 0 +EDGE2 3150 3069 -0.983116 -0.0487463 -0.0409738 1 0 1 1 0 0 +EDGE2 3150 3071 -0.0282904 0.981046 1.57948 1 0 1 1 0 0 +EDGE2 3151 3070 -0.92228 0.0528985 -1.57608 1 0 1 1 0 0 +EDGE2 3151 3150 -1.06522 -0.0359037 -1.57431 1 0 1 1 0 0 +EDGE2 3151 3072 1.00112 0.0131499 0.0180212 1 0 1 1 0 0 +EDGE2 3151 3071 -0.0431542 0.00442038 0.0148609 1 0 1 1 0 0 +EDGE2 3152 3072 0.0198713 0.0183487 0.015247 1 0 1 1 0 0 +EDGE2 3152 3151 -1.03278 0.00224316 0.000543055 1 0 1 1 0 0 +EDGE2 3152 3071 -0.997758 0.00922231 0.041222 1 0 1 1 0 0 +EDGE2 3152 3073 0.934915 0.0194433 0.0183259 1 0 1 1 0 0 +EDGE2 3153 3072 -0.982084 0.0951747 -0.0102818 1 0 1 1 0 0 +EDGE2 3153 3152 -0.889184 0.106878 -0.0143666 1 0 1 1 0 0 +EDGE2 3153 3073 0.0656449 0.00262358 0.00294157 1 0 1 1 0 0 +EDGE2 3153 3074 1.00711 -0.00332277 0.0181496 1 0 1 1 0 0 +EDGE2 3154 3153 -0.975219 0.0160881 0.0155484 1 0 1 1 0 0 +EDGE2 3154 3073 -0.95863 -0.122792 0.0290363 1 0 1 1 0 0 +EDGE2 3154 1075 0.931026 0.0531235 -3.15978 1 0 1 1 0 0 +EDGE2 3154 3074 -0.0123394 -0.0430334 0.00356438 1 0 1 1 0 0 +EDGE2 3154 3075 1.02695 0.00372126 -0.00329122 1 0 1 1 0 0 +EDGE2 3154 995 0.96515 0.0292569 -3.13678 1 0 1 1 0 0 +EDGE2 3154 1015 1.02268 -0.0337657 -3.13069 1 0 1 1 0 0 +EDGE2 3154 1055 1.01903 -0.0472922 -3.14998 1 0 1 1 0 0 +EDGE2 3155 1016 -0.0194279 -0.934375 -1.56006 1 0 1 1 0 0 +EDGE2 3155 1056 -0.00559049 -1.00073 -1.56766 1 0 1 1 0 0 +EDGE2 3155 996 0.0160093 -0.97862 -1.60409 1 0 1 1 0 0 +EDGE2 3155 1075 -0.00622451 -0.00595116 -3.14989 1 0 1 1 0 0 +EDGE2 3155 3074 -0.97284 -0.0492524 0.0189504 1 0 1 1 0 0 +EDGE2 3155 3154 -0.940695 0.0368912 0.0240216 1 0 1 1 0 0 +EDGE2 3155 3075 -0.0143787 -0.0306211 0.0261281 1 0 1 1 0 0 +EDGE2 3155 1074 1.04007 0.0251794 -3.13492 1 0 1 1 0 0 +EDGE2 3155 995 -0.0178278 -0.0593046 -3.14097 1 0 1 1 0 0 +EDGE2 3155 1015 0.0716022 0.063137 -3.15349 1 0 1 1 0 0 +EDGE2 3155 1055 0.0324806 -0.00406974 -3.16365 1 0 1 1 0 0 +EDGE2 3155 1014 1.03395 0.0456207 -3.1168 1 0 1 1 0 0 +EDGE2 3155 1054 0.954776 0.0110783 -3.15401 1 0 1 1 0 0 +EDGE2 3155 994 0.979822 -0.0155077 -3.14577 1 0 1 1 0 0 +EDGE2 3155 1076 0.0736412 0.993203 1.58299 1 0 1 1 0 0 +EDGE2 3155 3076 0.00475362 1.02664 1.54858 1 0 1 1 0 0 +EDGE2 3156 1075 -1.12198 -0.0135964 1.58617 1 0 1 1 0 0 +EDGE2 3156 3155 -0.994349 -0.0423163 -1.58749 1 0 1 1 0 0 +EDGE2 3156 3075 -1.0398 -0.0412255 -1.61109 1 0 1 1 0 0 +EDGE2 3156 995 -0.983339 0.0461225 1.57421 1 0 1 1 0 0 +EDGE2 3156 1015 -1.02675 -0.0487056 1.59169 1 0 1 1 0 0 +EDGE2 3156 1055 -1.06316 0.0560612 1.53804 1 0 1 1 0 0 +EDGE2 3156 1076 -0.0464018 0.0255194 -0.00532415 1 0 1 1 0 0 +EDGE2 3156 3076 0.0301494 -0.00615769 0.0218365 1 0 1 1 0 0 +EDGE2 3156 3077 1.05651 0.014906 0.00914684 1 0 1 1 0 0 +EDGE2 3156 1077 1.05227 0.0232793 0.00715074 1 0 1 1 0 0 +EDGE2 3157 3078 0.884501 -0.0447799 -0.00547679 1 0 1 1 0 0 +EDGE2 3157 3156 -1.04625 -0.00291768 -0.00555044 1 0 1 1 0 0 +EDGE2 3157 1076 -1.00838 0.0239544 -0.0105439 1 0 1 1 0 0 +EDGE2 3157 3076 -1.03356 0.0276252 -0.0122331 1 0 1 1 0 0 +EDGE2 3157 3077 0.0508433 0.0262351 -0.0212323 1 0 1 1 0 0 +EDGE2 3157 1077 -0.0563092 -0.0226638 -0.00260297 1 0 1 1 0 0 +EDGE2 3157 1078 1.02568 -0.026823 -0.0468144 1 0 1 1 0 0 +EDGE2 3158 3078 0.0963264 0.0544233 -0.00173958 1 0 1 1 0 0 +EDGE2 3158 3077 -1.02587 -0.0603783 0.0150221 1 0 1 1 0 0 +EDGE2 3158 3157 -0.953699 0.00854181 -0.0335917 1 0 1 1 0 0 +EDGE2 3158 1077 -1.05624 0.00554773 -0.00110221 1 0 1 1 0 0 +EDGE2 3158 1078 0.03634 0.00708104 -0.0167257 1 0 1 1 0 0 +EDGE2 3158 3079 0.931124 0.0164387 0.0261152 1 0 1 1 0 0 +EDGE2 3158 1079 1.04292 -0.0390646 -0.023122 1 0 1 1 0 0 +EDGE2 3159 3078 -1.02369 -0.0680633 -0.00445703 1 0 1 1 0 0 +EDGE2 3159 3158 -1.03905 -0.0340699 0.0260946 1 0 1 1 0 0 +EDGE2 3159 1078 -0.977532 -0.0534683 0.027362 1 0 1 1 0 0 +EDGE2 3159 3079 0.0477877 -0.0083874 -0.0262119 1 0 1 1 0 0 +EDGE2 3159 1079 -0.0713267 -0.0427341 -0.0110674 1 0 1 1 0 0 +EDGE2 3159 3060 0.944916 -0.0252201 -3.13539 1 0 1 1 0 0 +EDGE2 3159 3080 0.968234 0.00891883 -0.0143779 1 0 1 1 0 0 +EDGE2 3159 1080 1.03808 0.0181639 -0.0199649 1 0 1 1 0 0 +EDGE2 3160 3079 -0.972272 -0.0678002 0.0264499 1 0 1 1 0 0 +EDGE2 3160 3159 -0.941357 -0.0784231 0.0353929 1 0 1 1 0 0 +EDGE2 3160 1079 -0.967573 -0.0382999 -0.0115998 1 0 1 1 0 0 +EDGE2 3160 3081 0.00229169 0.965678 1.61094 1 0 1 1 0 0 +EDGE2 3160 3061 -0.0100885 0.988086 1.60402 1 0 1 1 0 0 +EDGE2 3160 3060 -0.0372447 -0.0128384 -3.15659 1 0 1 1 0 0 +EDGE2 3160 3080 -0.0406051 -0.0697047 0.0225275 1 0 1 1 0 0 +EDGE2 3160 1080 0.0427118 0.0423644 0.00985705 1 0 1 1 0 0 +EDGE2 3160 1081 -0.100489 -1.05275 -1.53667 1 0 1 1 0 0 +EDGE2 3160 3059 1.0513 -0.0275376 -3.11281 1 0 1 1 0 0 +EDGE2 3161 3082 0.996681 0.050206 0.0552693 1 0 1 1 0 0 +EDGE2 3161 3062 0.978095 -0.0747071 0.0113748 1 0 1 1 0 0 +EDGE2 3161 3081 0.0589209 0.0104297 -0.0250078 1 0 1 1 0 0 +EDGE2 3161 3061 -0.0160703 0.00835731 0.0232158 1 0 1 1 0 0 +EDGE2 3161 3060 -1.06291 0.0117868 1.56409 1 0 1 1 0 0 +EDGE2 3161 3160 -1.05773 -0.104942 -1.56314 1 0 1 1 0 0 +EDGE2 3161 3080 -0.948831 0.00761268 -1.55883 1 0 1 1 0 0 +EDGE2 3161 1080 -1.075 -0.0754324 -1.58244 1 0 1 1 0 0 +EDGE2 3162 3083 0.999815 -0.0121812 0.023343 1 0 1 1 0 0 +EDGE2 3162 3063 1.04195 -0.0245156 0.0073115 1 0 1 1 0 0 +EDGE2 3162 3082 0.0374214 0.0152209 0.00472455 1 0 1 1 0 0 +EDGE2 3162 3062 -0.0299867 0.0986618 0.0136449 1 0 1 1 0 0 +EDGE2 3162 3081 -1.07961 -0.0682462 -0.0281639 1 0 1 1 0 0 +EDGE2 3162 3161 -1.01242 0.0738527 -0.0180841 1 0 1 1 0 0 +EDGE2 3162 3061 -1.09105 0.035219 -0.00265897 1 0 1 1 0 0 +EDGE2 3163 3064 0.938346 -0.0766965 0.0266273 1 0 1 1 0 0 +EDGE2 3163 3084 1.01954 -0.0984529 -0.0160242 1 0 1 1 0 0 +EDGE2 3163 3083 -0.0417008 -0.0310368 -0.0147568 1 0 1 1 0 0 +EDGE2 3163 3063 0.00793836 -0.0179977 0.0103637 1 0 1 1 0 0 +EDGE2 3163 3082 -1.01222 0.0543789 0.000255829 1 0 1 1 0 0 +EDGE2 3163 3162 -0.955784 -0.0520359 0.036082 1 0 1 1 0 0 +EDGE2 3163 3062 -0.997222 -0.0993556 -0.00744895 1 0 1 1 0 0 +EDGE2 3164 3105 1.01053 0.00227043 -3.14205 1 0 1 1 0 0 +EDGE2 3164 3145 1.01363 -0.00970722 -3.14238 1 0 1 1 0 0 +EDGE2 3164 3125 1.03121 0.0392444 -3.1568 1 0 1 1 0 0 +EDGE2 3164 1185 0.9881 0.0418384 -3.16561 1 0 1 1 0 0 +EDGE2 3164 3065 0.904065 -0.0455411 0.00411368 1 0 1 1 0 0 +EDGE2 3164 3085 0.99458 0.0238196 0.0263489 1 0 1 1 0 0 +EDGE2 3164 1165 1.03314 0.0404574 -3.19385 1 0 1 1 0 0 +EDGE2 3164 3064 0.102998 -0.0157574 0.000306145 1 0 1 1 0 0 +EDGE2 3164 3084 0.0474337 -0.013032 -0.00795512 1 0 1 1 0 0 +EDGE2 3164 3083 -1.05137 0.0131383 -0.00773334 1 0 1 1 0 0 +EDGE2 3164 3163 -0.942459 0.0841484 -0.01014 1 0 1 1 0 0 +EDGE2 3164 3063 -0.91081 -0.0144961 0.00302224 1 0 1 1 0 0 +EDGE2 3165 3146 0.0392112 0.959237 1.53092 1 0 1 1 0 0 +EDGE2 3165 3066 -0.0167164 0.948377 1.58934 1 0 1 1 0 0 +EDGE2 3165 3144 0.94988 -0.00912715 -3.12254 1 0 1 1 0 0 +EDGE2 3165 1184 0.984079 0.0113776 -3.13571 1 0 1 1 0 0 +EDGE2 3165 3104 1.05248 0.0754325 -3.1737 1 0 1 1 0 0 +EDGE2 3165 3124 1.02574 -0.0275527 -3.15825 1 0 1 1 0 0 +EDGE2 3165 1164 0.960353 0.0849138 -3.14229 1 0 1 1 0 0 +EDGE2 3165 3105 0.0259619 0.0216593 -3.16698 1 0 1 1 0 0 +EDGE2 3165 3145 0.0421819 0.0685747 -3.14929 1 0 1 1 0 0 +EDGE2 3165 3125 0.0186068 -0.00337898 -3.15313 1 0 1 1 0 0 +EDGE2 3165 1185 -0.0678458 -0.0356668 -3.15708 1 0 1 1 0 0 +EDGE2 3165 3065 0.0566836 -0.00761792 0.0133452 1 0 1 1 0 0 +EDGE2 3165 3085 0.0184731 -0.00689276 0.0216324 1 0 1 1 0 0 +EDGE2 3165 1165 0.00769479 -0.0129101 -3.15456 1 0 1 1 0 0 +EDGE2 3165 1166 0.00747373 -1.04739 -1.56329 1 0 1 1 0 0 +EDGE2 3165 3086 -0.0594043 -1.08072 -1.56545 1 0 1 1 0 0 +EDGE2 3165 3106 -0.0185243 -0.964827 -1.57358 1 0 1 1 0 0 +EDGE2 3165 3126 -0.0221984 -0.868938 -1.57869 1 0 1 1 0 0 +EDGE2 3165 1186 0.068168 -1.09108 -1.57575 1 0 1 1 0 0 +EDGE2 3165 3064 -1.00459 0.0089002 0.000478975 1 0 1 1 0 0 +EDGE2 3165 3164 -0.962506 0.0280238 -0.0145361 1 0 1 1 0 0 +EDGE2 3165 3084 -0.984229 0.0466877 0.0205446 1 0 1 1 0 0 +EDGE2 3166 3105 -1.02204 0.00986103 -1.54431 1 0 1 1 0 0 +EDGE2 3166 3145 -0.949523 0.0501264 -1.55463 1 0 1 1 0 0 +EDGE2 3166 3165 -1.08618 0.00657749 1.57039 1 0 1 1 0 0 +EDGE2 3166 3125 -1.14164 -0.0408698 -1.59011 1 0 1 1 0 0 +EDGE2 3166 1185 -1.03801 -0.020922 -1.5425 1 0 1 1 0 0 +EDGE2 3166 3065 -1.01807 0.0349904 1.56145 1 0 1 1 0 0 +EDGE2 3166 3085 -1.03482 0.0378445 1.56505 1 0 1 1 0 0 +EDGE2 3166 1165 -0.948844 -0.137067 -1.56902 1 0 1 1 0 0 +EDGE2 3166 1166 0.0179213 -0.0651341 -0.00424117 1 0 1 1 0 0 +EDGE2 3166 3086 -0.00571501 -0.0501168 -0.0395513 1 0 1 1 0 0 +EDGE2 3166 3106 -0.0270248 -0.0948697 -0.0170849 1 0 1 1 0 0 +EDGE2 3166 3126 -0.0564111 -0.122135 0.0217776 1 0 1 1 0 0 +EDGE2 3166 1186 -0.0285833 -0.123962 -0.0285918 1 0 1 1 0 0 +EDGE2 3166 3107 0.881513 -0.0810008 0.00992583 1 0 1 1 0 0 +EDGE2 3166 3127 1.02349 0.0243715 0.00137798 1 0 1 1 0 0 +EDGE2 3166 1187 0.921046 -0.00894323 0.00907889 1 0 1 1 0 0 +EDGE2 3166 3087 1.01555 -0.00441466 -0.00339037 1 0 1 1 0 0 +EDGE2 3166 1167 0.965836 0.0946619 -0.00689553 1 0 1 1 0 0 +EDGE2 3167 3166 -0.989717 0.00783919 0.0133441 1 0 1 1 0 0 +EDGE2 3167 1166 -1.10115 0.0292383 0.0245365 1 0 1 1 0 0 +EDGE2 3167 3086 -1.10559 -0.0313921 0.0168843 1 0 1 1 0 0 +EDGE2 3167 3106 -1.02258 -0.0267258 0.011618 1 0 1 1 0 0 +EDGE2 3167 3126 -1.04061 0.0790997 0.0306487 1 0 1 1 0 0 +EDGE2 3167 1186 -0.879372 -0.0955635 -0.00889773 1 0 1 1 0 0 +EDGE2 3167 3107 -0.00857201 0.0314892 0.022076 1 0 1 1 0 0 +EDGE2 3167 3127 -0.0101991 -0.00276335 -0.00687365 1 0 1 1 0 0 +EDGE2 3167 1187 0.00857777 -0.0257028 0.0245948 1 0 1 1 0 0 +EDGE2 3167 3087 -0.00819382 -0.0151903 0.0103765 1 0 1 1 0 0 +EDGE2 3167 1167 -0.0331156 0.123886 0.00251876 1 0 1 1 0 0 +EDGE2 3167 3128 0.980098 0.03776 0.0247748 1 0 1 1 0 0 +EDGE2 3167 1188 0.995818 0.0207794 0.00503039 1 0 1 1 0 0 +EDGE2 3167 3088 0.936341 -0.0218285 -0.0231412 1 0 1 1 0 0 +EDGE2 3167 3108 0.953961 0.00125604 0.000984147 1 0 1 1 0 0 +EDGE2 3167 1168 0.956638 -0.035238 0.0020492 1 0 1 1 0 0 +EDGE2 3168 3107 -1.03717 -0.0297723 0.0121877 1 0 1 1 0 0 +EDGE2 3168 3167 -0.995715 -0.0154196 -0.00986208 1 0 1 1 0 0 +EDGE2 3168 3127 -0.927021 -0.0444516 -0.0312084 1 0 1 1 0 0 +EDGE2 3168 1187 -1.0229 0.027638 -0.0385246 1 0 1 1 0 0 +EDGE2 3168 3087 -0.975397 -0.0371647 0.00984928 1 0 1 1 0 0 +EDGE2 3168 1167 -1.04686 -0.0195496 -0.00442236 1 0 1 1 0 0 +EDGE2 3168 3128 0.0985286 -0.0929687 0.0106389 1 0 1 1 0 0 +EDGE2 3168 1188 -0.0558406 -0.0407678 -0.0223048 1 0 1 1 0 0 +EDGE2 3168 3088 0.00369958 -0.053173 0.00398612 1 0 1 1 0 0 +EDGE2 3168 3108 0.0242602 0.0221795 0.0311784 1 0 1 1 0 0 +EDGE2 3168 1168 -0.0120404 0.000512593 -0.0085767 1 0 1 1 0 0 +EDGE2 3168 3109 1.04706 -0.0126665 0.0111368 1 0 1 1 0 0 +EDGE2 3168 3129 1.06045 -0.0275035 0.00753907 1 0 1 1 0 0 +EDGE2 3168 1189 0.944948 0.0773406 0.0119228 1 0 1 1 0 0 +EDGE2 3168 3089 1.05544 0.0223928 -0.0257337 1 0 1 1 0 0 +EDGE2 3168 1169 0.97723 -0.017581 0.0160117 1 0 1 1 0 0 +EDGE2 3169 3128 -1.0116 -0.0194624 -0.00718235 1 0 1 1 0 0 +EDGE2 3169 3168 -1.03563 0.0928618 -0.0398308 1 0 1 1 0 0 +EDGE2 3169 1188 -0.981462 0.0216775 0.00341589 1 0 1 1 0 0 +EDGE2 3169 3088 -0.983827 0.00442579 -0.017878 1 0 1 1 0 0 +EDGE2 3169 3108 -0.972263 -0.00507584 -0.0128734 1 0 1 1 0 0 +EDGE2 3169 1168 -1.06119 0.0479086 0.00187157 1 0 1 1 0 0 +EDGE2 3169 3109 -0.0022129 0.0296505 0.0198605 1 0 1 1 0 0 +EDGE2 3169 3129 -0.0651431 -0.0600253 -0.00790648 1 0 1 1 0 0 +EDGE2 3169 1189 -0.070224 -0.0412819 0.00434228 1 0 1 1 0 0 +EDGE2 3169 3089 0.0307119 0.0214365 0.00641903 1 0 1 1 0 0 +EDGE2 3169 1169 -0.0984251 0.107396 0.021431 1 0 1 1 0 0 +EDGE2 3169 3050 1.03815 0.0124015 -3.14097 1 0 1 1 0 0 +EDGE2 3169 3110 1.01866 -0.0371588 -0.00742752 1 0 1 1 0 0 +EDGE2 3169 3130 1.00112 -0.0321108 -0.033529 1 0 1 1 0 0 +EDGE2 3169 3090 0.955151 0.0358367 0.016615 1 0 1 1 0 0 +EDGE2 3169 1130 1.0194 0.0452878 -3.17585 1 0 1 1 0 0 +EDGE2 3169 1170 1.00215 0.0459063 0.0204179 1 0 1 1 0 0 +EDGE2 3169 1190 1.02472 -0.00469961 -0.000674306 1 0 1 1 0 0 +EDGE2 3169 3030 0.97948 -0.0223167 -3.16289 1 0 1 1 0 0 +EDGE2 3169 1150 1.05634 -0.0630211 -3.15629 1 0 1 1 0 0 +EDGE2 3169 1110 1.0061 -0.0203933 -3.1572 1 0 1 1 0 0 +EDGE2 3170 3109 -1.05246 0.0147346 0.0293362 1 0 1 1 0 0 +EDGE2 3170 3169 -1.04963 -0.0138293 -0.012001 1 0 1 1 0 0 +EDGE2 3170 3129 -1.04328 0.0430953 -0.0142457 1 0 1 1 0 0 +EDGE2 3170 1189 -0.993473 0.0217006 -0.00365975 1 0 1 1 0 0 +EDGE2 3170 3089 -1.04297 -0.0159814 0.00800284 1 0 1 1 0 0 +EDGE2 3170 1169 -1.00195 0.00864525 0.00733178 1 0 1 1 0 0 +EDGE2 3170 3050 0.00838551 -0.0246663 -3.13787 1 0 1 1 0 0 +EDGE2 3170 3131 0.0536842 0.927726 1.56077 1 0 1 1 0 0 +EDGE2 3170 1151 -0.0294682 0.991555 1.57003 1 0 1 1 0 0 +EDGE2 3170 1191 0.0327235 1.06071 1.57987 1 0 1 1 0 0 +EDGE2 3170 3091 -0.0810581 0.936761 1.56943 1 0 1 1 0 0 +EDGE2 3170 3111 -0.0245107 0.976416 1.57421 1 0 1 1 0 0 +EDGE2 3170 1171 0.0519158 1.06078 1.54928 1 0 1 1 0 0 +EDGE2 3170 3110 -0.0956445 0.0905747 0.0325326 1 0 1 1 0 0 +EDGE2 3170 3130 -0.00836671 0.031416 -0.00162107 1 0 1 1 0 0 +EDGE2 3170 3090 -0.0585348 -0.0445046 0.0246279 1 0 1 1 0 0 +EDGE2 3170 1130 -0.0252505 -0.0301184 -3.15696 1 0 1 1 0 0 +EDGE2 3170 1170 0.0662666 0.0253625 0.0101265 1 0 1 1 0 0 +EDGE2 3170 1190 -0.0154295 0.0108265 0.01473 1 0 1 1 0 0 +EDGE2 3170 3030 0.0236395 -2.46947e-05 -3.15871 1 0 1 1 0 0 +EDGE2 3170 1150 -0.0495841 0.100988 -3.09421 1 0 1 1 0 0 +EDGE2 3170 1110 0.0257649 0.038156 -3.16355 1 0 1 1 0 0 +EDGE2 3170 1109 1.00791 -0.0376761 -3.14011 1 0 1 1 0 0 +EDGE2 3170 1149 1.00161 -0.00861055 -3.16649 1 0 1 1 0 0 +EDGE2 3170 3029 1.00109 -0.108544 -3.16636 1 0 1 1 0 0 +EDGE2 3170 3049 0.977107 0.0105048 -3.16184 1 0 1 1 0 0 +EDGE2 3170 1129 1.0195 -0.0294964 -3.15681 1 0 1 1 0 0 +EDGE2 3170 1111 -0.0420924 -0.949091 -1.55223 1 0 1 1 0 0 +EDGE2 3170 3031 -0.0126073 -1.04512 -1.56799 1 0 1 1 0 0 +EDGE2 3170 3051 0.00428877 -1.02005 -1.60923 1 0 1 1 0 0 +EDGE2 3170 1131 -0.0262235 -0.993582 -1.5643 1 0 1 1 0 0 +EDGE2 3171 3050 -1.06452 -0.105096 1.53892 1 0 1 1 0 0 +EDGE2 3171 3131 -0.0317846 -0.0761848 -0.0257148 1 0 1 1 0 0 +EDGE2 3171 3092 1.04907 -0.0168966 0.0221853 1 0 1 1 0 0 +EDGE2 3171 3132 1.01577 0.0776644 0.0258626 1 0 1 1 0 0 +EDGE2 3171 3112 1.02673 -0.0209315 0.0270979 1 0 1 1 0 0 +EDGE2 3171 1152 1.03672 0.0234525 0.0323433 1 0 1 1 0 0 +EDGE2 3171 1172 0.967812 -0.0193404 -0.0262698 1 0 1 1 0 0 +EDGE2 3171 1192 1.04973 0.0907543 0.0023262 1 0 1 1 0 0 +EDGE2 3171 1151 0.0293993 0.0365945 0.00680812 1 0 1 1 0 0 +EDGE2 3171 1191 0.122494 0.0253643 0.0126694 1 0 1 1 0 0 +EDGE2 3171 3091 -0.0654962 0.00449766 0.0097811 1 0 1 1 0 0 +EDGE2 3171 3111 -0.00880566 -0.0297151 0.0322498 1 0 1 1 0 0 +EDGE2 3171 1171 -0.00338565 -0.0147919 0.00170915 1 0 1 1 0 0 +EDGE2 3171 3170 -0.989174 -0.0442478 -1.53367 1 0 1 1 0 0 +EDGE2 3171 3110 -1.08639 -0.0727622 -1.56043 1 0 1 1 0 0 +EDGE2 3171 3130 -0.978378 0.0033282 -1.51058 1 0 1 1 0 0 +EDGE2 3171 3090 -1.00275 0.0864707 -1.58495 1 0 1 1 0 0 +EDGE2 3171 1130 -1.08115 0.00701124 1.5646 1 0 1 1 0 0 +EDGE2 3171 1170 -1.03112 -0.0370351 -1.59705 1 0 1 1 0 0 +EDGE2 3171 1190 -1.01591 0.0131046 -1.56782 1 0 1 1 0 0 +EDGE2 3171 3030 -0.967867 -0.0318928 1.55976 1 0 1 1 0 0 +EDGE2 3171 1150 -0.991647 -0.0100194 1.59537 1 0 1 1 0 0 +EDGE2 3171 1110 -1.02517 0.0626187 1.55531 1 0 1 1 0 0 +EDGE2 3172 1173 1.09594 0.0336911 0.0216023 1 0 1 1 0 0 +EDGE2 3172 3133 1.0897 0.0258511 0.00669304 1 0 1 1 0 0 +EDGE2 3172 3093 0.983789 -0.00925793 -0.0382873 1 0 1 1 0 0 +EDGE2 3172 3113 0.951334 0.0335642 0.00765649 1 0 1 1 0 0 +EDGE2 3172 1193 1.06523 0.0746585 -0.0104841 1 0 1 1 0 0 +EDGE2 3172 3131 -1.08009 0.00299223 0.0313744 1 0 1 1 0 0 +EDGE2 3172 3092 0.0270964 0.0197959 -0.0289801 1 0 1 1 0 0 +EDGE2 3172 1153 0.916608 0.00581057 -0.0340363 1 0 1 1 0 0 +EDGE2 3172 3132 0.0376455 -0.0184001 -0.0233946 1 0 1 1 0 0 +EDGE2 3172 3112 -0.0232906 -0.0836381 -0.00512103 1 0 1 1 0 0 +EDGE2 3172 1152 0.0100561 -0.0372074 0.000888143 1 0 1 1 0 0 +EDGE2 3172 1172 -0.135402 0.0414825 -0.00242759 1 0 1 1 0 0 +EDGE2 3172 1192 -0.0671224 0.0283564 -0.00980561 1 0 1 1 0 0 +EDGE2 3172 3171 -1.05003 0.0357237 -0.0020998 1 0 1 1 0 0 +EDGE2 3172 1151 -0.957476 -0.135942 -0.0183123 1 0 1 1 0 0 +EDGE2 3172 1191 -0.988738 0.0254688 -0.00157012 1 0 1 1 0 0 +EDGE2 3172 3091 -0.965867 -0.0438093 0.00831286 1 0 1 1 0 0 +EDGE2 3172 3111 -1.06474 0.0183564 0.0122794 1 0 1 1 0 0 +EDGE2 3172 1171 -1.0205 0.0245244 -0.0156625 1 0 1 1 0 0 +EDGE2 3173 1173 -0.0564207 0.00192061 -0.0157589 1 0 1 1 0 0 +EDGE2 3173 1174 0.991533 0.00402678 0.00793018 1 0 1 1 0 0 +EDGE2 3173 3094 0.982539 0.0202022 0.0252271 1 0 1 1 0 0 +EDGE2 3173 3114 0.955476 0.00797798 -0.0134231 1 0 1 1 0 0 +EDGE2 3173 3134 1.03026 -0.0349886 0.0205037 1 0 1 1 0 0 +EDGE2 3173 1194 0.988431 0.0255124 -0.00888267 1 0 1 1 0 0 +EDGE2 3173 1154 0.972441 0.0366088 -0.0201059 1 0 1 1 0 0 +EDGE2 3173 3133 0.0608187 0.111914 0.00584699 1 0 1 1 0 0 +EDGE2 3173 3093 0.0993934 0.0568787 0.0122948 1 0 1 1 0 0 +EDGE2 3173 3113 0.0210871 -0.0326048 -0.0119521 1 0 1 1 0 0 +EDGE2 3173 1193 0.0174357 0.000841952 -0.0114682 1 0 1 1 0 0 +EDGE2 3173 3092 -1.07879 -0.0191633 -0.0196851 1 0 1 1 0 0 +EDGE2 3173 1153 -0.018864 -0.0036339 -0.0204027 1 0 1 1 0 0 +EDGE2 3173 3132 -1.01416 0.0385415 -0.00564576 1 0 1 1 0 0 +EDGE2 3173 3172 -1.07959 0.0618072 -0.0109804 1 0 1 1 0 0 +EDGE2 3173 3112 -1.04584 0.0541744 -0.0264025 1 0 1 1 0 0 +EDGE2 3173 1152 -0.960344 -0.071036 -0.00606982 1 0 1 1 0 0 +EDGE2 3173 1172 -1.00754 0.0106122 0.000508089 1 0 1 1 0 0 +EDGE2 3173 1192 -1.03884 0.0485554 0.00567262 1 0 1 1 0 0 +EDGE2 3174 1173 -1.09148 0.0292125 -0.0119295 1 0 1 1 0 0 +EDGE2 3174 1174 0.0613947 -0.0292263 0.0135368 1 0 1 1 0 0 +EDGE2 3174 3115 1.06005 0.0195839 0.031926 1 0 1 1 0 0 +EDGE2 3174 3135 0.92831 -0.0249697 -0.0196788 1 0 1 1 0 0 +EDGE2 3174 1175 1.04503 0.000695599 0.00683782 1 0 1 1 0 0 +EDGE2 3174 1195 0.995651 -0.0182344 -0.00994063 1 0 1 1 0 0 +EDGE2 3174 3095 0.992194 0.0594551 0.0244065 1 0 1 1 0 0 +EDGE2 3174 1155 1.02518 -0.019209 -0.0039124 1 0 1 1 0 0 +EDGE2 3174 3094 -0.0891253 -0.00243651 0.0208872 1 0 1 1 0 0 +EDGE2 3174 3114 -0.0541882 0.011555 -0.0216029 1 0 1 1 0 0 +EDGE2 3174 3134 -0.0162859 0.0152257 -0.00879899 1 0 1 1 0 0 +EDGE2 3174 1194 0.00502666 -0.00786243 0.012135 1 0 1 1 0 0 +EDGE2 3174 1154 -0.0434733 0.0733824 -0.0120192 1 0 1 1 0 0 +EDGE2 3174 3133 -1.00802 0.0783054 0.0109204 1 0 1 1 0 0 +EDGE2 3174 3173 -1.06376 -0.000832235 -0.0122883 1 0 1 1 0 0 +EDGE2 3174 3093 -1.02638 0.0311907 0.00505168 1 0 1 1 0 0 +EDGE2 3174 3113 -0.991063 -0.0279169 -0.00610443 1 0 1 1 0 0 +EDGE2 3174 1193 -0.959789 -0.0157852 -0.0186988 1 0 1 1 0 0 +EDGE2 3174 1153 -1.03354 0.0204636 -0.00303436 1 0 1 1 0 0 +EDGE2 3175 1196 -0.0128161 1.02643 1.59973 1 0 1 1 0 0 +EDGE2 3175 3116 -0.0541023 1.02614 1.58192 1 0 1 1 0 0 +EDGE2 3175 3136 0.00591582 0.986213 1.60283 1 0 1 1 0 0 +EDGE2 3175 3096 0.00259257 0.937297 1.5451 1 0 1 1 0 0 +EDGE2 3175 1156 0.0215859 0.958886 1.57674 1 0 1 1 0 0 +EDGE2 3175 1176 -0.0278125 1.06445 1.58826 1 0 1 1 0 0 +EDGE2 3175 1174 -0.929171 -0.00290532 0.00560793 1 0 1 1 0 0 +EDGE2 3175 3115 -0.0772738 -0.0373436 0.0277827 1 0 1 1 0 0 +EDGE2 3175 3135 0.0220142 0.0915367 0.0608713 1 0 1 1 0 0 +EDGE2 3175 1175 -0.0237777 0.010825 0.0193384 1 0 1 1 0 0 +EDGE2 3175 1195 -0.054586 0.0478275 -3.53209e-05 1 0 1 1 0 0 +EDGE2 3175 3095 -0.0789528 0.0598917 0.015187 1 0 1 1 0 0 +EDGE2 3175 1155 -0.041388 -0.0446036 0.0242022 1 0 1 1 0 0 +EDGE2 3175 3174 -1.04656 0.0390029 0.0115113 1 0 1 1 0 0 +EDGE2 3175 3094 -1.04936 -0.0109009 -0.0102834 1 0 1 1 0 0 +EDGE2 3175 3114 -0.939439 -0.0257854 -0.0229715 1 0 1 1 0 0 +EDGE2 3175 3134 -1.05628 0.000344398 -0.0165814 1 0 1 1 0 0 +EDGE2 3175 1194 -0.963067 -0.000235133 0.0117616 1 0 1 1 0 0 +EDGE2 3175 1154 -1.01901 0.0186815 0.0205791 1 0 1 1 0 0 +EDGE2 3176 3115 -1.03699 0.0298962 1.56678 1 0 1 1 0 0 +EDGE2 3176 3175 -0.985098 5.3131e-05 1.60401 1 0 1 1 0 0 +EDGE2 3176 3135 -0.999358 -0.0906434 1.56953 1 0 1 1 0 0 +EDGE2 3176 1175 -1.01683 -0.0381792 1.59048 1 0 1 1 0 0 +EDGE2 3176 1195 -1.01351 -0.00652519 1.55501 1 0 1 1 0 0 +EDGE2 3176 3095 -0.989386 -0.00274024 1.57771 1 0 1 1 0 0 +EDGE2 3176 1155 -1.01416 -0.0564967 1.54644 1 0 1 1 0 0 +EDGE2 3177 3176 -0.98015 -0.0129828 -0.00652806 1 0 1 1 0 0 +EDGE2 3178 3177 -1.09893 -0.00713021 -0.0023715 1 0 1 1 0 0 +EDGE2 3179 3178 -0.956127 -0.00227605 -0.0266942 1 0 1 1 0 0 +EDGE2 3179 3020 1.04863 -0.0145432 -3.15563 1 0 1 1 0 0 +EDGE2 3180 3179 -1.09268 -0.00757163 0.0275682 1 0 1 1 0 0 +EDGE2 3180 3020 0.0433498 0.0724771 -3.11235 1 0 1 1 0 0 +EDGE2 3180 3021 -0.0212545 -1.02832 -1.53421 1 0 1 1 0 0 +EDGE2 3180 3019 0.923501 0.0222523 -3.17282 1 0 1 1 0 0 +EDGE2 3181 3020 -1.08534 -0.0516737 1.60814 1 0 1 1 0 0 +EDGE2 3181 3180 -0.927346 -0.00968431 -1.56 1 0 1 1 0 0 +EDGE2 3182 3181 -0.983874 0.044264 0.0287499 1 0 1 1 0 0 +EDGE2 3183 3182 -0.982221 0.0492424 -0.00651848 1 0 1 1 0 0 +EDGE2 3184 3005 1.05887 0.0235823 -3.12601 1 0 1 1 0 0 +EDGE2 3184 725 0.941808 -0.0666487 -3.1738 1 0 1 1 0 0 +EDGE2 3184 3183 -1.00785 0.015107 -0.0269175 1 0 1 1 0 0 +EDGE2 3185 3004 0.927599 0.0695213 -3.13512 1 0 1 1 0 0 +EDGE2 3185 724 1.00112 0.0307572 -3.1159 1 0 1 1 0 0 +EDGE2 3185 726 0.00424445 0.955495 1.56627 1 0 1 1 0 0 +EDGE2 3185 3005 -0.087894 -0.0288112 -3.10563 1 0 1 1 0 0 +EDGE2 3185 725 0.106749 0.0819474 -3.14289 1 0 1 1 0 0 +EDGE2 3185 3184 -1.08508 0.0100244 0.00138145 1 0 1 1 0 0 +EDGE2 3185 3006 0.0974191 -1.02186 -1.59322 1 0 1 1 0 0 +EDGE2 3186 727 0.927052 -0.0518653 -0.0267144 1 0 1 1 0 0 +EDGE2 3186 726 0.0106227 0.00098939 -0.000491431 1 0 1 1 0 0 +EDGE2 3186 3005 -1.06918 0.111475 1.59563 1 0 1 1 0 0 +EDGE2 3186 3185 -1.00058 -0.0017668 -1.53921 1 0 1 1 0 0 +EDGE2 3186 725 -1.03111 0.0274006 1.56919 1 0 1 1 0 0 +EDGE2 3187 728 0.985889 -0.0726417 -0.000678545 1 0 1 1 0 0 +EDGE2 3187 3186 -1.059 0.0495063 0.0184983 1 0 1 1 0 0 +EDGE2 3187 727 -0.00393283 0.0174572 -0.00271876 1 0 1 1 0 0 +EDGE2 3187 726 -0.954379 -0.047028 0.0128245 1 0 1 1 0 0 +EDGE2 3188 729 1.01194 0.0391278 -0.00650715 1 0 1 1 0 0 +EDGE2 3188 728 -0.0680146 -0.0159727 -0.0298813 1 0 1 1 0 0 +EDGE2 3188 727 -1.07087 -0.0373772 0.00220424 1 0 1 1 0 0 +EDGE2 3188 3187 -1.07175 0.0157099 -0.0175729 1 0 1 1 0 0 +EDGE2 3189 730 0.981062 0.0024958 0.0308582 1 0 1 1 0 0 +EDGE2 3189 1210 0.972828 0.0499578 -3.16111 1 0 1 1 0 0 +EDGE2 3189 710 1.07817 0.0150695 -3.19275 1 0 1 1 0 0 +EDGE2 3189 729 -0.00134261 0.017951 0.00461608 1 0 1 1 0 0 +EDGE2 3189 3188 -1.05476 0.019766 0.00492113 1 0 1 1 0 0 +EDGE2 3189 728 -1.02903 0.0105054 0.0129532 1 0 1 1 0 0 +EDGE2 3190 1211 -0.0333962 -1.04474 -1.56528 1 0 1 1 0 0 +EDGE2 3190 711 -0.118709 -1.05075 -1.58567 1 0 1 1 0 0 +EDGE2 3190 731 0.0205563 -1.03266 -1.5785 1 0 1 1 0 0 +EDGE2 3190 1209 0.984802 0.0100899 -3.13492 1 0 1 1 0 0 +EDGE2 3190 709 0.945412 0.0889047 -3.13622 1 0 1 1 0 0 +EDGE2 3190 730 -0.00374058 -0.0360214 0.0316123 1 0 1 1 0 0 +EDGE2 3190 1210 0.0539695 -0.0710711 -3.15506 1 0 1 1 0 0 +EDGE2 3190 710 0.040362 0.046152 -3.18486 1 0 1 1 0 0 +EDGE2 3190 3189 -0.970537 0.0390856 -0.00547988 1 0 1 1 0 0 +EDGE2 3190 729 -1.031 -0.0866169 0.00666733 1 0 1 1 0 0 +EDGE2 3191 732 0.960564 -0.0332035 0.00939585 1 0 1 1 0 0 +EDGE2 3191 1212 0.949164 0.0099487 0.0059896 1 0 1 1 0 0 +EDGE2 3191 1211 0.0882999 0.0371045 0.00372092 1 0 1 1 0 0 +EDGE2 3191 712 1.02761 -0.140101 -0.0161409 1 0 1 1 0 0 +EDGE2 3191 711 0.00916513 -0.00306143 0.00697101 1 0 1 1 0 0 +EDGE2 3191 731 0.0818512 0.0528429 -0.0116746 1 0 1 1 0 0 +EDGE2 3191 730 -1.04129 0.0395446 1.58289 1 0 1 1 0 0 +EDGE2 3191 3190 -0.99857 -0.000502849 1.58227 1 0 1 1 0 0 +EDGE2 3191 1210 -1.08718 -0.0165692 -1.57649 1 0 1 1 0 0 +EDGE2 3191 710 -1.04808 0.0405836 -1.55552 1 0 1 1 0 0 +EDGE2 3192 732 0.026316 0.000388722 -0.0166711 1 0 1 1 0 0 +EDGE2 3192 713 0.98002 0.01631 0.00504535 1 0 1 1 0 0 +EDGE2 3192 1213 0.956326 -0.0244027 -0.0217219 1 0 1 1 0 0 +EDGE2 3192 733 1.01837 0.0662665 -0.0156831 1 0 1 1 0 0 +EDGE2 3192 1212 -0.0370825 0.00978584 -0.0246084 1 0 1 1 0 0 +EDGE2 3192 1211 -0.97919 -0.0972664 -0.0104863 1 0 1 1 0 0 +EDGE2 3192 712 0.0133509 0.00678168 0.0340154 1 0 1 1 0 0 +EDGE2 3192 3191 -1.0262 -0.0950887 -0.00106505 1 0 1 1 0 0 +EDGE2 3192 711 -1.10893 -0.0628621 -0.0344168 1 0 1 1 0 0 +EDGE2 3192 731 -1.01379 0.0693328 0.0413601 1 0 1 1 0 0 +EDGE2 3193 734 0.974109 0.019016 -0.0031334 1 0 1 1 0 0 +EDGE2 3193 1214 1.01554 0.000468445 -0.0146752 1 0 1 1 0 0 +EDGE2 3193 714 0.940928 0.0337377 0.00710025 1 0 1 1 0 0 +EDGE2 3193 732 -1.01038 -0.0432506 -0.010778 1 0 1 1 0 0 +EDGE2 3193 713 -0.0334311 0.0250773 -0.00711234 1 0 1 1 0 0 +EDGE2 3193 1213 -0.0456925 -0.0934091 -0.017417 1 0 1 1 0 0 +EDGE2 3193 733 -0.00284433 0.0301762 -0.0108755 1 0 1 1 0 0 +EDGE2 3193 3192 -0.966582 0.0922824 -0.00552725 1 0 1 1 0 0 +EDGE2 3193 1212 -0.991771 0.0639349 -0.0253459 1 0 1 1 0 0 +EDGE2 3193 712 -1.06119 -0.0721238 0.013776 1 0 1 1 0 0 +EDGE2 3194 2475 0.971132 -0.10659 -3.16741 1 0 1 1 0 0 +EDGE2 3194 2995 1.07514 -0.0361169 -3.16265 1 0 1 1 0 0 +EDGE2 3194 715 0.940798 -0.0218835 0.00506987 1 0 1 1 0 0 +EDGE2 3194 735 0.963322 -0.0361535 -0.0166476 1 0 1 1 0 0 +EDGE2 3194 1215 1.00803 -0.0107323 0.00544391 1 0 1 1 0 0 +EDGE2 3194 734 -0.00863501 -0.0549266 -0.0308379 1 0 1 1 0 0 +EDGE2 3194 1214 0.0197763 0.0187863 -0.0141352 1 0 1 1 0 0 +EDGE2 3194 714 -0.0265295 0.000858489 -0.022892 1 0 1 1 0 0 +EDGE2 3194 713 -0.940045 -0.0802864 0.0168829 1 0 1 1 0 0 +EDGE2 3194 1213 -0.952802 -0.0350051 0.0466526 1 0 1 1 0 0 +EDGE2 3194 3193 -1.02655 0.0912369 0.000613462 1 0 1 1 0 0 +EDGE2 3194 733 -1.09391 -0.104914 0.02924 1 0 1 1 0 0 +EDGE2 3195 736 -0.0347386 0.916788 1.60362 1 0 1 1 0 0 +EDGE2 3195 2475 -0.0429443 -0.0165838 -3.12158 1 0 1 1 0 0 +EDGE2 3195 2994 1.01213 -0.132531 -3.15013 1 0 1 1 0 0 +EDGE2 3195 2474 0.954627 0.0587572 -3.14824 1 0 1 1 0 0 +EDGE2 3195 2995 0.023713 0.00124145 -3.12875 1 0 1 1 0 0 +EDGE2 3195 715 0.0404165 0.00426141 -3.69487e-05 1 0 1 1 0 0 +EDGE2 3195 735 -0.0684948 0.0778948 0.00655695 1 0 1 1 0 0 +EDGE2 3195 1215 -0.058629 -0.0267841 0.048628 1 0 1 1 0 0 +EDGE2 3195 734 -1.00717 0.0852879 0.00692688 1 0 1 1 0 0 +EDGE2 3195 1214 -1.07493 0.0106333 -0.00330996 1 0 1 1 0 0 +EDGE2 3195 3194 -1.01166 0.0598251 0.0064139 1 0 1 1 0 0 +EDGE2 3195 714 -0.982806 -0.0721566 0.0318131 1 0 1 1 0 0 +EDGE2 3195 1216 0.015936 -0.988276 -1.55326 1 0 1 1 0 0 +EDGE2 3195 2996 -0.0819676 -0.939252 -1.55794 1 0 1 1 0 0 +EDGE2 3195 2476 0.120175 -1.04024 -1.59519 1 0 1 1 0 0 +EDGE2 3195 716 -0.0722176 -1.0374 -1.56012 1 0 1 1 0 0 +EDGE2 3196 737 1.03633 -0.0662249 -0.00170328 1 0 1 1 0 0 +EDGE2 3196 736 0.0435612 0.0336116 0.00136867 1 0 1 1 0 0 +EDGE2 3196 2475 -1.04284 0.0365317 1.57407 1 0 1 1 0 0 +EDGE2 3196 3195 -0.969354 -0.00700105 -1.54884 1 0 1 1 0 0 +EDGE2 3196 2995 -1.06467 -0.000822788 1.55657 1 0 1 1 0 0 +EDGE2 3196 715 -0.99577 -0.0256079 -1.57016 1 0 1 1 0 0 +EDGE2 3196 735 -1.06621 0.00582907 -1.56078 1 0 1 1 0 0 +EDGE2 3196 1215 -1.0471 -0.0636002 -1.5936 1 0 1 1 0 0 +EDGE2 3197 738 0.908857 0.0207907 -0.0216601 1 0 1 1 0 0 +EDGE2 3197 737 0.0908549 0.0274855 0.0151244 1 0 1 1 0 0 +EDGE2 3197 736 -0.963764 0.0362342 0.012139 1 0 1 1 0 0 +EDGE2 3197 3196 -0.95366 -0.00962175 0.0226026 1 0 1 1 0 0 +EDGE2 3198 739 1.0028 -0.0910209 -0.00569596 1 0 1 1 0 0 +EDGE2 3198 738 0.0343144 0.0811981 0.0372844 1 0 1 1 0 0 +EDGE2 3198 737 -0.958772 -0.00221213 -0.0210853 1 0 1 1 0 0 +EDGE2 3198 3197 -0.947368 0.0483948 -0.012069 1 0 1 1 0 0 +EDGE2 3199 800 0.980356 0.0191685 -3.14002 1 0 1 1 0 0 +EDGE2 3199 820 0.993106 0.0306651 -3.14481 1 0 1 1 0 0 +EDGE2 3199 740 1.02144 0.0506838 -0.0230267 1 0 1 1 0 0 +EDGE2 3199 760 0.978489 -0.0309553 -3.136 1 0 1 1 0 0 +EDGE2 3199 780 0.98099 0.0684331 -3.17235 1 0 1 1 0 0 +EDGE2 3199 700 1.012 -0.0451395 -3.13068 1 0 1 1 0 0 +EDGE2 3199 3198 -1.04686 -0.0352837 -0.000385049 1 0 1 1 0 0 +EDGE2 3199 739 -0.015832 0.0421212 -0.0335978 1 0 1 1 0 0 +EDGE2 3199 738 -0.968465 0.0356928 0.0442963 1 0 1 1 0 0 +EDGE2 3200 801 0.00214952 -1.03361 -1.60034 1 0 1 1 0 0 +EDGE2 3200 761 -0.0363008 -1.05221 -1.55392 1 0 1 1 0 0 +EDGE2 3200 781 -0.0137338 -1.02023 -1.54572 1 0 1 1 0 0 +EDGE2 3200 741 0.0709708 -1.04235 -1.5923 1 0 1 1 0 0 +EDGE2 3200 800 0.00311584 0.0430645 -3.12527 1 0 1 1 0 0 +EDGE2 3200 699 0.966147 -0.00652831 -3.13815 1 0 1 1 0 0 +EDGE2 3200 779 0.932362 0.0568429 -3.16842 1 0 1 1 0 0 +EDGE2 3200 799 1.00679 -0.0253697 -3.12255 1 0 1 1 0 0 +EDGE2 3200 819 1.01723 -0.126252 -3.1382 1 0 1 1 0 0 +EDGE2 3200 759 1.01013 0.010797 -3.13945 1 0 1 1 0 0 +EDGE2 3200 820 -0.0460417 -0.0531768 -3.15058 1 0 1 1 0 0 +EDGE2 3200 701 0.0693745 1.00057 1.57579 1 0 1 1 0 0 +EDGE2 3200 740 -0.0225376 0.0776595 -0.00705318 1 0 1 1 0 0 +EDGE2 3200 760 -0.0139693 0.0808603 -3.15358 1 0 1 1 0 0 +EDGE2 3200 780 0.00328153 -0.0024772 -3.15485 1 0 1 1 0 0 +EDGE2 3200 700 -0.0434003 0.0469225 -3.11872 1 0 1 1 0 0 +EDGE2 3200 821 -0.0596433 1.04045 1.58602 1 0 1 1 0 0 +EDGE2 3200 3199 -1.02672 -0.00710405 0.0101422 1 0 1 1 0 0 +EDGE2 3200 739 -1.00306 -0.123899 0.0303273 1 0 1 1 0 0 +EDGE2 3201 800 -0.986854 -0.041424 1.58626 1 0 1 1 0 0 +EDGE2 3201 3200 -0.945755 -0.100593 -1.5759 1 0 1 1 0 0 +EDGE2 3201 820 -1.13191 -0.0255583 1.59559 1 0 1 1 0 0 +EDGE2 3201 701 -0.0505667 -0.0417656 0.00850861 1 0 1 1 0 0 +EDGE2 3201 740 -0.983492 0.0147095 -1.58689 1 0 1 1 0 0 +EDGE2 3201 760 -1.01714 -0.14998 1.51994 1 0 1 1 0 0 +EDGE2 3201 780 -1.01993 -0.00982547 1.53993 1 0 1 1 0 0 +EDGE2 3201 700 -0.927724 -0.00930557 1.58197 1 0 1 1 0 0 +EDGE2 3201 821 0.0475819 0.128439 -0.0411813 1 0 1 1 0 0 +EDGE2 3201 822 1.03517 0.00962147 -0.00302835 1 0 1 1 0 0 +EDGE2 3201 702 0.96847 -0.0304516 0.0145306 1 0 1 1 0 0 +EDGE2 3202 701 -1.04997 -0.0766358 0.00731463 1 0 1 1 0 0 +EDGE2 3202 3201 -1.04507 0.0855974 0.00246402 1 0 1 1 0 0 +EDGE2 3202 821 -1.01858 -0.0121491 0.00736767 1 0 1 1 0 0 +EDGE2 3202 822 -0.0570888 -0.0581154 0.000633352 1 0 1 1 0 0 +EDGE2 3202 702 -0.0430202 -0.0404259 -0.000658827 1 0 1 1 0 0 +EDGE2 3202 703 1.08294 -0.0769169 0.0159881 1 0 1 1 0 0 +EDGE2 3202 823 0.971416 -0.00872705 0.0116803 1 0 1 1 0 0 +EDGE2 3203 822 -0.906889 0.0163982 0.00221778 1 0 1 1 0 0 +EDGE2 3203 3202 -0.933864 -0.0640072 -0.000979392 1 0 1 1 0 0 +EDGE2 3203 702 -1.05239 0.0570356 -0.0128692 1 0 1 1 0 0 +EDGE2 3203 703 -0.0498827 -0.0056079 -0.0180387 1 0 1 1 0 0 +EDGE2 3203 823 0.0360039 -0.033905 0.0102391 1 0 1 1 0 0 +EDGE2 3203 824 0.988531 -0.0439958 0.0312123 1 0 1 1 0 0 +EDGE2 3203 704 1.06464 0.00725521 -0.0164594 1 0 1 1 0 0 +EDGE2 3204 3203 -0.971247 -0.0716945 0.034531 1 0 1 1 0 0 +EDGE2 3204 703 -1.0273 -0.00282959 0.0249472 1 0 1 1 0 0 +EDGE2 3204 823 -0.990335 -0.0814048 -0.00132052 1 0 1 1 0 0 +EDGE2 3204 824 0.0488243 0.0219542 0.00230953 1 0 1 1 0 0 +EDGE2 3204 704 -0.0425185 -0.0138081 -0.0175565 1 0 1 1 0 0 +EDGE2 3204 865 0.983615 -0.04292 -3.16054 1 0 1 1 0 0 +EDGE2 3204 1205 1.02651 -0.0559399 -3.13483 1 0 1 1 0 0 +EDGE2 3204 905 0.958538 -0.041516 -3.1481 1 0 1 1 0 0 +EDGE2 3204 705 0.953132 0.0383942 0.0109245 1 0 1 1 0 0 +EDGE2 3204 825 1.0216 -0.0871619 0.0200642 1 0 1 1 0 0 +EDGE2 3204 845 1.03442 -0.00364227 -3.13481 1 0 1 1 0 0 +EDGE2 3205 824 -0.953589 0.0116708 -0.0104846 1 0 1 1 0 0 +EDGE2 3205 3204 -1.09543 -0.0443103 0.00317533 1 0 1 1 0 0 +EDGE2 3205 704 -0.980774 -0.0805657 0.00453285 1 0 1 1 0 0 +EDGE2 3205 865 -0.045885 0.0343082 -3.15951 1 0 1 1 0 0 +EDGE2 3205 826 0.0780138 -0.959467 -1.57697 1 0 1 1 0 0 +EDGE2 3205 866 0.0719942 -0.967058 -1.52654 1 0 1 1 0 0 +EDGE2 3205 906 0.0603114 -0.919625 -1.58958 1 0 1 1 0 0 +EDGE2 3205 846 -0.0320426 -0.943196 -1.54419 1 0 1 1 0 0 +EDGE2 3205 1205 -0.0214989 0.0833308 -3.15081 1 0 1 1 0 0 +EDGE2 3205 905 0.0225648 0.0116987 -3.15128 1 0 1 1 0 0 +EDGE2 3205 864 0.881555 0.050163 -3.16744 1 0 1 1 0 0 +EDGE2 3205 705 -0.0316602 0.0714068 -0.0189124 1 0 1 1 0 0 +EDGE2 3205 825 -0.0174466 -0.0214031 -0.0118938 1 0 1 1 0 0 +EDGE2 3205 845 0.0244479 0.134721 -3.14906 1 0 1 1 0 0 +EDGE2 3205 1204 1.01612 -0.070021 -3.13767 1 0 1 1 0 0 +EDGE2 3205 904 1.05145 0.0237837 -3.14044 1 0 1 1 0 0 +EDGE2 3205 844 1.05953 -0.00707828 -3.12468 1 0 1 1 0 0 +EDGE2 3205 1206 0.0153683 1.0271 1.57963 1 0 1 1 0 0 +EDGE2 3205 706 -0.0793092 1.0654 1.54691 1 0 1 1 0 0 +EDGE2 3206 865 -1.00607 -0.00488363 1.58215 1 0 1 1 0 0 +EDGE2 3206 1205 -1.02356 -0.00791167 1.56278 1 0 1 1 0 0 +EDGE2 3206 3205 -1.0653 -0.0615476 -1.57098 1 0 1 1 0 0 +EDGE2 3206 905 -0.918193 -0.00872974 1.55975 1 0 1 1 0 0 +EDGE2 3206 705 -0.924809 -0.0375773 -1.57381 1 0 1 1 0 0 +EDGE2 3206 825 -1.02278 0.00198527 -1.56624 1 0 1 1 0 0 +EDGE2 3206 845 -1.02691 0.020686 1.56527 1 0 1 1 0 0 +EDGE2 3206 1206 -0.0214021 0.0213234 -0.00909229 1 0 1 1 0 0 +EDGE2 3206 706 -0.0195982 0.0155433 -0.0146865 1 0 1 1 0 0 +EDGE2 3206 1207 0.966242 0.0240066 0.00759347 1 0 1 1 0 0 +EDGE2 3206 707 1.00252 0.0577605 0.0270363 1 0 1 1 0 0 +EDGE2 3207 1206 -0.972876 0.0308417 0.0338394 1 0 1 1 0 0 +EDGE2 3207 3206 -1.01073 -0.0353523 -0.0139625 1 0 1 1 0 0 +EDGE2 3207 706 -1.01527 0.0187114 -0.0271953 1 0 1 1 0 0 +EDGE2 3207 1207 0.0618339 0.00710299 0.00790242 1 0 1 1 0 0 +EDGE2 3207 707 0.0420756 0.0181743 -0.0237543 1 0 1 1 0 0 +EDGE2 3207 708 1.03588 -0.00710842 0.01626 1 0 1 1 0 0 +EDGE2 3207 1208 1.01764 0.0540361 -0.00526105 1 0 1 1 0 0 +EDGE2 3208 1207 -0.974531 0.0471292 0.0110122 1 0 1 1 0 0 +EDGE2 3208 3207 -1.02314 -0.0319682 0.0723876 1 0 1 1 0 0 +EDGE2 3208 707 -0.95555 0.0453124 -0.0348476 1 0 1 1 0 0 +EDGE2 3208 708 -0.0161762 -0.035942 -0.00569576 1 0 1 1 0 0 +EDGE2 3208 1208 0.0152496 -0.04816 0.00573182 1 0 1 1 0 0 +EDGE2 3208 1209 1.02345 0.0452753 0.014289 1 0 1 1 0 0 +EDGE2 3208 709 1.02877 0.0987433 -0.00836462 1 0 1 1 0 0 +EDGE2 3209 708 -1.06118 0.0626738 0.00364539 1 0 1 1 0 0 +EDGE2 3209 1208 -1.00099 0.0248572 -0.0168456 1 0 1 1 0 0 +EDGE2 3209 3208 -0.904404 0.0316833 0.00202134 1 0 1 1 0 0 +EDGE2 3209 1209 0.0982058 -0.0319433 0.00880718 1 0 1 1 0 0 +EDGE2 3209 709 0.0343183 -0.0556113 -0.00273128 1 0 1 1 0 0 +EDGE2 3209 730 1.00074 -0.0394158 -3.12415 1 0 1 1 0 0 +EDGE2 3209 3190 0.959112 -0.0503123 -3.15908 1 0 1 1 0 0 +EDGE2 3209 1210 0.997433 -0.00295062 -0.00520682 1 0 1 1 0 0 +EDGE2 3209 710 0.956068 0.00973438 -0.0140244 1 0 1 1 0 0 +EDGE2 3210 1211 0.0807503 1.03835 1.53191 1 0 1 1 0 0 +EDGE2 3210 3191 -0.0730736 1.01285 1.57263 1 0 1 1 0 0 +EDGE2 3210 711 0.0631468 0.925898 1.56537 1 0 1 1 0 0 +EDGE2 3210 731 0.0840707 1.04499 1.5541 1 0 1 1 0 0 +EDGE2 3210 1209 -1.14668 -0.0593637 -0.0230717 1 0 1 1 0 0 +EDGE2 3210 3209 -0.981921 -0.0521678 0.00862673 1 0 1 1 0 0 +EDGE2 3210 709 -1.06219 0.0222925 0.0180291 1 0 1 1 0 0 +EDGE2 3210 730 0.0105122 -0.0437722 -3.13719 1 0 1 1 0 0 +EDGE2 3210 3190 0.057119 -0.0450127 -3.16598 1 0 1 1 0 0 +EDGE2 3210 1210 0.0541953 0.0189385 0.006642 1 0 1 1 0 0 +EDGE2 3210 710 -0.0331813 -0.094177 -0.048356 1 0 1 1 0 0 +EDGE2 3210 3189 0.915101 0.00670472 -3.14533 1 0 1 1 0 0 +EDGE2 3210 729 1.02583 0.0425115 -3.14904 1 0 1 1 0 0 +EDGE2 3211 732 0.998356 -0.040406 -0.0110401 1 0 1 1 0 0 +EDGE2 3211 3192 1.05134 0.00680629 -0.0159114 1 0 1 1 0 0 +EDGE2 3211 1212 0.971568 0.0424037 -0.0222063 1 0 1 1 0 0 +EDGE2 3211 1211 0.0119747 0.071567 -0.00500766 1 0 1 1 0 0 +EDGE2 3211 712 1.01175 -0.00842979 -0.00962138 1 0 1 1 0 0 +EDGE2 3211 3191 -0.0386785 0.0202956 0.00975894 1 0 1 1 0 0 +EDGE2 3211 711 -0.0119017 0.023439 0.00520297 1 0 1 1 0 0 +EDGE2 3211 731 0.00348856 0.0524007 0.0241255 1 0 1 1 0 0 +EDGE2 3211 730 -0.852758 -0.0785553 1.58108 1 0 1 1 0 0 +EDGE2 3211 3190 -0.91906 0.0150155 1.57449 1 0 1 1 0 0 +EDGE2 3211 3210 -1.01041 -0.0136856 -1.55842 1 0 1 1 0 0 +EDGE2 3211 1210 -1.02982 0.0951633 -1.58705 1 0 1 1 0 0 +EDGE2 3211 710 -0.897242 0.00551999 -1.54442 1 0 1 1 0 0 +EDGE2 3212 732 0.0752983 0.0440172 -0.00193285 1 0 1 1 0 0 +EDGE2 3212 713 0.983601 -0.0397211 -0.0422546 1 0 1 1 0 0 +EDGE2 3212 1213 0.980788 0.0529412 0.0134686 1 0 1 1 0 0 +EDGE2 3212 3193 0.923634 -0.0430007 -0.02368 1 0 1 1 0 0 +EDGE2 3212 733 0.924676 -0.0191925 -0.00297148 1 0 1 1 0 0 +EDGE2 3212 3192 0.0577062 -0.065231 0.000158597 1 0 1 1 0 0 +EDGE2 3212 1212 -0.0164956 0.0442131 -0.000725204 1 0 1 1 0 0 +EDGE2 3212 1211 -1.05707 -0.0887389 -0.0046925 1 0 1 1 0 0 +EDGE2 3212 3211 -1.01855 0.00659486 -0.00337712 1 0 1 1 0 0 +EDGE2 3212 712 -0.013062 -0.0757218 0.016411 1 0 1 1 0 0 +EDGE2 3212 3191 -0.985785 0.0544437 -0.0043572 1 0 1 1 0 0 +EDGE2 3212 711 -0.886222 -0.00548751 -0.0282182 1 0 1 1 0 0 +EDGE2 3212 731 -1.03362 -0.0886021 -0.00669187 1 0 1 1 0 0 +EDGE2 3213 734 1.01771 -0.0288151 0.0380918 1 0 1 1 0 0 +EDGE2 3213 1214 1.0253 -0.0363213 -0.0216498 1 0 1 1 0 0 +EDGE2 3213 3194 1.03887 -0.00477403 -0.00671501 1 0 1 1 0 0 +EDGE2 3213 714 0.96069 -0.0373773 0.0426957 1 0 1 1 0 0 +EDGE2 3213 732 -0.993958 -0.0057091 -0.0325744 1 0 1 1 0 0 +EDGE2 3213 713 0.0112888 -0.0405689 -0.0139414 1 0 1 1 0 0 +EDGE2 3213 1213 -0.0715543 0.00429252 -0.0253607 1 0 1 1 0 0 +EDGE2 3213 3193 0.0318094 0.0319263 0.0167696 1 0 1 1 0 0 +EDGE2 3213 733 0.0323219 -0.0670337 0.0542476 1 0 1 1 0 0 +EDGE2 3213 3192 -0.986445 0.0863317 0.00409065 1 0 1 1 0 0 +EDGE2 3213 3212 -0.961604 0.0257421 -0.00423989 1 0 1 1 0 0 +EDGE2 3213 1212 -0.975523 -0.0876559 0.0108858 1 0 1 1 0 0 +EDGE2 3213 712 -1.00794 0.00866003 -0.0108794 1 0 1 1 0 0 +EDGE2 3214 2475 1.02585 -0.0670437 -3.12244 1 0 1 1 0 0 +EDGE2 3214 3195 0.994535 -0.00402473 0.00337265 1 0 1 1 0 0 +EDGE2 3214 2995 1.00814 0.011392 -3.17342 1 0 1 1 0 0 +EDGE2 3214 715 0.94741 0.0141036 -0.0137433 1 0 1 1 0 0 +EDGE2 3214 735 1.00698 -0.0612201 -0.018016 1 0 1 1 0 0 +EDGE2 3214 1215 1.00952 -0.00966026 -0.00936005 1 0 1 1 0 0 +EDGE2 3214 734 -0.03643 -0.0207457 -0.023267 1 0 1 1 0 0 +EDGE2 3214 1214 -0.00303172 -0.0207339 0.0118755 1 0 1 1 0 0 +EDGE2 3214 3194 0.0153056 0.0233536 -0.00883224 1 0 1 1 0 0 +EDGE2 3214 714 -0.00414049 -0.0412481 0.0259656 1 0 1 1 0 0 +EDGE2 3214 713 -0.954557 0.0893892 -0.00751749 1 0 1 1 0 0 +EDGE2 3214 1213 -0.950547 -0.106991 -0.00179491 1 0 1 1 0 0 +EDGE2 3214 3193 -1.07605 0.0471099 0.0179827 1 0 1 1 0 0 +EDGE2 3214 3213 -0.907098 0.0292103 0.00398507 1 0 1 1 0 0 +EDGE2 3214 733 -0.959656 0.0635482 -0.0155496 1 0 1 1 0 0 +EDGE2 3215 736 -0.136635 0.935375 1.55066 1 0 1 1 0 0 +EDGE2 3215 3196 -0.0665583 1.02199 1.55769 1 0 1 1 0 0 +EDGE2 3215 2475 -0.00864758 0.0302359 -3.13648 1 0 1 1 0 0 +EDGE2 3215 2994 1.06083 -0.0364005 -3.11111 1 0 1 1 0 0 +EDGE2 3215 2474 1.0714 0.0530076 -3.14008 1 0 1 1 0 0 +EDGE2 3215 3195 -0.00359938 0.0189539 -0.0128683 1 0 1 1 0 0 +EDGE2 3215 2995 0.0264278 -0.0279947 -3.14825 1 0 1 1 0 0 +EDGE2 3215 3214 -1.01016 -0.0367222 0.0216349 1 0 1 1 0 0 +EDGE2 3215 715 0.0328082 0.106785 -0.00949086 1 0 1 1 0 0 +EDGE2 3215 735 -0.0618798 -0.0432099 0.00560141 1 0 1 1 0 0 +EDGE2 3215 1215 -0.105139 0.00906254 0.00603601 1 0 1 1 0 0 +EDGE2 3215 734 -1.06081 -0.0342868 0.00826063 1 0 1 1 0 0 +EDGE2 3215 1214 -0.941004 -0.00769047 0.0314868 1 0 1 1 0 0 +EDGE2 3215 3194 -0.888082 -0.00313051 0.00113782 1 0 1 1 0 0 +EDGE2 3215 714 -1.01849 0.0128561 -0.00715308 1 0 1 1 0 0 +EDGE2 3215 1216 -0.053779 -1.09484 -1.59918 1 0 1 1 0 0 +EDGE2 3215 2996 0.088226 -1.10218 -1.62097 1 0 1 1 0 0 +EDGE2 3215 2476 0.0771158 -1.06808 -1.53085 1 0 1 1 0 0 +EDGE2 3215 716 -0.0704986 -0.965344 -1.58695 1 0 1 1 0 0 +EDGE2 3216 737 0.993688 0.0357161 -0.000861003 1 0 1 1 0 0 +EDGE2 3216 3197 0.998876 -0.022851 0.014743 1 0 1 1 0 0 +EDGE2 3216 736 -0.0091615 -0.104961 -0.0215652 1 0 1 1 0 0 +EDGE2 3216 3196 -0.0105876 0.00932164 -0.00266925 1 0 1 1 0 0 +EDGE2 3216 2475 -0.966389 -0.0368905 1.55091 1 0 1 1 0 0 +EDGE2 3216 3195 -0.973343 -0.0231183 -1.58256 1 0 1 1 0 0 +EDGE2 3216 3215 -0.964271 0.0532837 -1.55872 1 0 1 1 0 0 +EDGE2 3216 2995 -1.07924 0.0191082 1.56303 1 0 1 1 0 0 +EDGE2 3216 715 -0.997583 -0.11395 -1.56036 1 0 1 1 0 0 +EDGE2 3216 735 -0.920158 -0.0877524 -1.58355 1 0 1 1 0 0 +EDGE2 3216 1215 -0.936991 0.00952214 -1.57597 1 0 1 1 0 0 +EDGE2 3217 3198 0.98521 -0.039311 0.0121358 1 0 1 1 0 0 +EDGE2 3217 738 1.06323 -0.0101632 -0.00361647 1 0 1 1 0 0 +EDGE2 3217 737 0.095751 0.041597 0.00552095 1 0 1 1 0 0 +EDGE2 3217 3197 -0.0043255 0.0060651 -0.0105057 1 0 1 1 0 0 +EDGE2 3217 736 -0.92687 0.0163067 0.00185955 1 0 1 1 0 0 +EDGE2 3217 3196 -0.929907 0.0345523 -0.00334367 1 0 1 1 0 0 +EDGE2 3217 3216 -0.936954 0.00427225 -0.0279616 1 0 1 1 0 0 +EDGE2 3218 3199 1.10644 -0.0644652 -0.0117529 1 0 1 1 0 0 +EDGE2 3218 3198 -0.0849214 0.0569184 0.0268134 1 0 1 1 0 0 +EDGE2 3218 739 1.0346 -0.0200185 -0.0220419 1 0 1 1 0 0 +EDGE2 3218 738 0.00746614 -0.0722085 -0.0185772 1 0 1 1 0 0 +EDGE2 3218 737 -1.01842 0.0794018 0.00220279 1 0 1 1 0 0 +EDGE2 3218 3197 -0.952099 0.133948 -0.000106541 1 0 1 1 0 0 +EDGE2 3218 3217 -0.902542 -0.0409283 -0.00599304 1 0 1 1 0 0 +EDGE2 3219 800 0.988037 0.0124927 -3.11179 1 0 1 1 0 0 +EDGE2 3219 3200 1.03999 0.0477793 0.0168029 1 0 1 1 0 0 +EDGE2 3219 820 1.00516 0.035653 -3.11796 1 0 1 1 0 0 +EDGE2 3219 740 0.999505 0.0162707 -0.040788 1 0 1 1 0 0 +EDGE2 3219 760 1.07526 0.0358884 -3.17122 1 0 1 1 0 0 +EDGE2 3219 780 0.878319 0.0693968 -3.14733 1 0 1 1 0 0 +EDGE2 3219 700 0.98791 -0.0261282 -3.10974 1 0 1 1 0 0 +EDGE2 3219 3199 0.00418196 -0.0366029 -0.00201957 1 0 1 1 0 0 +EDGE2 3219 3198 -1.03456 -0.00710515 -0.0347231 1 0 1 1 0 0 +EDGE2 3219 3218 -1.05035 -0.00594625 -0.0139389 1 0 1 1 0 0 +EDGE2 3219 739 -0.000411569 0.0339388 -0.016942 1 0 1 1 0 0 +EDGE2 3219 738 -1.06422 0.0361129 -0.00229308 1 0 1 1 0 0 +EDGE2 3220 801 0.0162314 -0.996397 -1.55598 1 0 1 1 0 0 +EDGE2 3220 761 -0.0219481 -1.05056 -1.57477 1 0 1 1 0 0 +EDGE2 3220 781 0.00700902 -1.00056 -1.56276 1 0 1 1 0 0 +EDGE2 3220 741 0.0605587 -0.8901 -1.61054 1 0 1 1 0 0 +EDGE2 3220 800 -0.0624258 0.0166138 -3.12828 1 0 1 1 0 0 +EDGE2 3220 699 0.948265 -0.0487036 -3.15417 1 0 1 1 0 0 +EDGE2 3220 779 0.985724 0.0732625 -3.13613 1 0 1 1 0 0 +EDGE2 3220 799 1.03215 -0.0213823 -3.15842 1 0 1 1 0 0 +EDGE2 3220 819 0.964679 -0.101994 -3.15977 1 0 1 1 0 0 +EDGE2 3220 759 0.97657 -0.0398792 -3.11906 1 0 1 1 0 0 +EDGE2 3220 3200 -0.000116244 -0.0741841 0.0345039 1 0 1 1 0 0 +EDGE2 3220 820 -0.0472398 -0.0297287 -3.13019 1 0 1 1 0 0 +EDGE2 3220 701 0.0842367 1.0045 1.57708 1 0 1 1 0 0 +EDGE2 3220 740 -0.0457127 0.0447414 0.0134814 1 0 1 1 0 0 +EDGE2 3220 760 -0.0350452 -0.0440042 -3.14294 1 0 1 1 0 0 +EDGE2 3220 780 -0.0569437 -0.0566258 -3.1464 1 0 1 1 0 0 +EDGE2 3220 700 0.0227704 -0.0637788 -3.09991 1 0 1 1 0 0 +EDGE2 3220 3201 0.0375102 1.02036 1.52633 1 0 1 1 0 0 +EDGE2 3220 821 0.0212283 0.949444 1.54035 1 0 1 1 0 0 +EDGE2 3220 3199 -0.967615 0.00477192 -0.0287521 1 0 1 1 0 0 +EDGE2 3220 3219 -0.974438 -0.0289848 0.0200191 1 0 1 1 0 0 +EDGE2 3220 739 -1.0301 -0.0349033 -0.00514383 1 0 1 1 0 0 +EDGE2 3221 800 -0.981175 0.056485 1.60205 1 0 1 1 0 0 +EDGE2 3221 3200 -0.967134 -0.0570105 -1.55543 1 0 1 1 0 0 +EDGE2 3221 3220 -0.985002 0.0491924 -1.59548 1 0 1 1 0 0 +EDGE2 3221 820 -1.00672 0.0276886 1.57558 1 0 1 1 0 0 +EDGE2 3221 701 0.000294975 0.102042 -0.00147736 1 0 1 1 0 0 +EDGE2 3221 740 -1.02246 0.0342868 -1.58545 1 0 1 1 0 0 +EDGE2 3221 760 -0.942574 0.0542925 1.56708 1 0 1 1 0 0 +EDGE2 3221 780 -1.00852 0.0374144 1.56194 1 0 1 1 0 0 +EDGE2 3221 700 -0.938031 0.0810489 1.57962 1 0 1 1 0 0 +EDGE2 3221 3201 0.0262234 0.0337461 -0.0202768 1 0 1 1 0 0 +EDGE2 3221 821 0.00293966 -0.0258367 -0.00314842 1 0 1 1 0 0 +EDGE2 3221 822 0.928313 -0.104311 -0.00804841 1 0 1 1 0 0 +EDGE2 3221 3202 0.918533 0.0118063 -0.0419592 1 0 1 1 0 0 +EDGE2 3221 702 1.05913 -0.105998 -0.0164929 1 0 1 1 0 0 +EDGE2 3222 3203 0.966629 -0.0420233 0.0156319 1 0 1 1 0 0 +EDGE2 3222 701 -0.906705 0.015694 -0.0258545 1 0 1 1 0 0 +EDGE2 3222 3201 -0.955634 -0.0152174 0.0381196 1 0 1 1 0 0 +EDGE2 3222 3221 -1.07002 0.00965084 -0.0174091 1 0 1 1 0 0 +EDGE2 3222 821 -1.11796 0.0151313 -0.0254169 1 0 1 1 0 0 +EDGE2 3222 822 0.0171669 0.00885992 0.0234319 1 0 1 1 0 0 +EDGE2 3222 3202 0.0493126 -0.0296301 -0.00679943 1 0 1 1 0 0 +EDGE2 3222 702 0.0232796 0.0954283 0.0182281 1 0 1 1 0 0 +EDGE2 3222 703 0.979531 0.00536252 0.011201 1 0 1 1 0 0 +EDGE2 3222 823 1.00572 0.0247279 -0.0125275 1 0 1 1 0 0 +EDGE2 3223 3203 0.0347012 -0.0771166 0.0025508 1 0 1 1 0 0 +EDGE2 3223 822 -0.90391 0.0518593 -0.0183185 1 0 1 1 0 0 +EDGE2 3223 3222 -0.997817 0.00145437 0.016004 1 0 1 1 0 0 +EDGE2 3223 3202 -1.0568 0.0461477 -0.0024261 1 0 1 1 0 0 +EDGE2 3223 702 -0.985357 -0.0846097 -0.0454419 1 0 1 1 0 0 +EDGE2 3223 703 0.0233181 -0.0275598 0.0196434 1 0 1 1 0 0 +EDGE2 3223 823 0.0535145 0.0139104 -0.0365532 1 0 1 1 0 0 +EDGE2 3223 824 1.02998 0.00669257 0.0190675 1 0 1 1 0 0 +EDGE2 3223 3204 1.02609 0.00487576 0.0195544 1 0 1 1 0 0 +EDGE2 3223 704 0.9921 0.0199406 0.0348844 1 0 1 1 0 0 +EDGE2 3224 3203 -0.986725 -0.0411225 0.00590449 1 0 1 1 0 0 +EDGE2 3224 3223 -1.06488 -0.0147209 0.00300986 1 0 1 1 0 0 +EDGE2 3224 703 -0.98588 -0.0276631 -0.0153489 1 0 1 1 0 0 +EDGE2 3224 823 -0.935163 0.00931905 -0.0149681 1 0 1 1 0 0 +EDGE2 3224 824 -0.0646169 0.0234899 -0.000879415 1 0 1 1 0 0 +EDGE2 3224 3204 0.0379489 -0.0197572 0.030351 1 0 1 1 0 0 +EDGE2 3224 704 0.0081971 0.0674697 -0.0259571 1 0 1 1 0 0 +EDGE2 3224 865 0.942285 0.0553111 -3.1296 1 0 1 1 0 0 +EDGE2 3224 1205 0.997667 0.0746825 -3.16394 1 0 1 1 0 0 +EDGE2 3224 3205 0.951376 -0.0084041 0.0284948 1 0 1 1 0 0 +EDGE2 3224 905 0.928156 0.00707358 -3.11397 1 0 1 1 0 0 +EDGE2 3224 705 1.08689 -0.0190057 0.0247599 1 0 1 1 0 0 +EDGE2 3224 825 0.995681 -0.0801615 -0.00578687 1 0 1 1 0 0 +EDGE2 3224 845 0.994235 0.0501638 -3.1044 1 0 1 1 0 0 +EDGE2 3225 824 -1.08514 0.0166834 0.0135957 1 0 1 1 0 0 +EDGE2 3225 3204 -0.965571 -0.0394777 -0.00586015 1 0 1 1 0 0 +EDGE2 3225 3224 -0.988487 -0.00314669 -0.0082837 1 0 1 1 0 0 +EDGE2 3225 704 -0.991225 -0.0376605 -0.01945 1 0 1 1 0 0 +EDGE2 3225 865 -0.0370375 0.0708296 -3.14608 1 0 1 1 0 0 +EDGE2 3225 826 0.0254002 -1.00379 -1.58666 1 0 1 1 0 0 +EDGE2 3225 866 -0.0727885 -0.95717 -1.58769 1 0 1 1 0 0 +EDGE2 3225 906 0.0391289 -1.00253 -1.56383 1 0 1 1 0 0 +EDGE2 3225 846 0.0594747 -0.933858 -1.58162 1 0 1 1 0 0 +EDGE2 3225 1205 0.0675738 0.0238157 -3.16729 1 0 1 1 0 0 +EDGE2 3225 3205 -0.0353011 -0.020235 0.00223346 1 0 1 1 0 0 +EDGE2 3225 905 0.0407575 0.0279171 -3.1379 1 0 1 1 0 0 +EDGE2 3225 864 0.995592 -0.0100667 -3.12952 1 0 1 1 0 0 +EDGE2 3225 705 0.00996699 -0.0416539 0.0157525 1 0 1 1 0 0 +EDGE2 3225 825 -0.0518581 -0.0428866 0.0194678 1 0 1 1 0 0 +EDGE2 3225 845 0.0657794 0.0318964 -3.13938 1 0 1 1 0 0 +EDGE2 3225 1204 1.02396 -0.0253818 -3.12999 1 0 1 1 0 0 +EDGE2 3225 904 1.07072 -0.0376282 -3.1352 1 0 1 1 0 0 +EDGE2 3225 844 0.983052 -0.0293908 -3.12096 1 0 1 1 0 0 +EDGE2 3225 1206 -0.00877454 0.950377 1.55907 1 0 1 1 0 0 +EDGE2 3225 3206 -0.00563303 0.980387 1.58195 1 0 1 1 0 0 +EDGE2 3225 706 0.0886991 1.08754 1.58405 1 0 1 1 0 0 +EDGE2 3226 865 -0.990639 -0.138767 1.55102 1 0 1 1 0 0 +EDGE2 3226 3225 -0.934356 0.0254464 -1.55112 1 0 1 1 0 0 +EDGE2 3226 1205 -1.0125 0.014845 1.61795 1 0 1 1 0 0 +EDGE2 3226 3205 -1.03228 -0.0353882 -1.57563 1 0 1 1 0 0 +EDGE2 3226 905 -1.09075 -0.0272003 1.58021 1 0 1 1 0 0 +EDGE2 3226 705 -0.984851 0.0160339 -1.59829 1 0 1 1 0 0 +EDGE2 3226 825 -0.950684 -0.0203534 -1.57761 1 0 1 1 0 0 +EDGE2 3226 845 -0.97172 0.0515913 1.58264 1 0 1 1 0 0 +EDGE2 3226 1206 0.113892 -0.0284284 -0.0256189 1 0 1 1 0 0 +EDGE2 3226 3206 0.0481163 0.0311481 0.0131614 1 0 1 1 0 0 +EDGE2 3226 706 -0.0237375 0.00160803 0.00931626 1 0 1 1 0 0 +EDGE2 3226 1207 0.958156 0.0232085 -0.0276183 1 0 1 1 0 0 +EDGE2 3226 3207 0.962637 -0.0539802 -0.00390046 1 0 1 1 0 0 +EDGE2 3226 707 0.950739 0.0354218 -0.00668683 1 0 1 1 0 0 +EDGE2 3227 1206 -1.07436 -0.00514489 0.0293528 1 0 1 1 0 0 +EDGE2 3227 3226 -0.985714 0.0241019 0.0114569 1 0 1 1 0 0 +EDGE2 3227 3206 -1.01259 0.147205 0.0488816 1 0 1 1 0 0 +EDGE2 3227 706 -1.0382 -0.0317018 -0.000155416 1 0 1 1 0 0 +EDGE2 3227 1207 0.0120362 -0.0422811 0.0185865 1 0 1 1 0 0 +EDGE2 3227 3207 0.0381307 -0.0376892 0.0141814 1 0 1 1 0 0 +EDGE2 3227 707 -0.00420789 -0.0597648 0.011328 1 0 1 1 0 0 +EDGE2 3227 708 0.944696 0.0173026 -0.0180755 1 0 1 1 0 0 +EDGE2 3227 1208 1.00997 -0.0276247 0.012032 1 0 1 1 0 0 +EDGE2 3227 3208 0.888636 -0.0452175 0.012852 1 0 1 1 0 0 +EDGE2 3228 1207 -1.05514 -0.0661105 -0.0208995 1 0 1 1 0 0 +EDGE2 3228 3207 -0.93899 0.0216445 0.00908597 1 0 1 1 0 0 +EDGE2 3228 3227 -0.981546 0.0220597 0.0276048 1 0 1 1 0 0 +EDGE2 3228 707 -0.988188 0.0066283 0.0289243 1 0 1 1 0 0 +EDGE2 3228 708 0.116415 -0.0810466 0.0032395 1 0 1 1 0 0 +EDGE2 3228 1208 -0.0974091 -0.0181763 0.0201127 1 0 1 1 0 0 +EDGE2 3228 3208 -0.069838 -0.0161986 -0.0216112 1 0 1 1 0 0 +EDGE2 3228 1209 0.930333 -0.107098 -0.0104515 1 0 1 1 0 0 +EDGE2 3228 3209 0.996693 -0.0139083 -0.00119602 1 0 1 1 0 0 +EDGE2 3228 709 0.845975 -0.0512913 0.0205009 1 0 1 1 0 0 +EDGE2 3229 3228 -1.01084 0.0603438 0.00941157 1 0 1 1 0 0 +EDGE2 3229 708 -0.944106 0.00332231 -0.0348628 1 0 1 1 0 0 +EDGE2 3229 1208 -0.957404 -0.0035409 0.00603059 1 0 1 1 0 0 +EDGE2 3229 3208 -0.997923 0.041236 0.000773791 1 0 1 1 0 0 +EDGE2 3229 1209 -0.00126394 -0.0360598 -0.0216134 1 0 1 1 0 0 +EDGE2 3229 3209 -0.0983471 0.0141294 0.00121814 1 0 1 1 0 0 +EDGE2 3229 709 0.083122 0.0431944 0.0195544 1 0 1 1 0 0 +EDGE2 3229 730 0.975289 -0.00510202 -3.12496 1 0 1 1 0 0 +EDGE2 3229 3190 1.07059 -0.0450334 -3.13853 1 0 1 1 0 0 +EDGE2 3229 3210 1.0288 0.0705425 0.00891616 1 0 1 1 0 0 +EDGE2 3229 1210 1.03895 -0.00284281 0.0109018 1 0 1 1 0 0 +EDGE2 3229 710 1.00146 -0.0300121 -0.037859 1 0 1 1 0 0 +EDGE2 3230 1211 -0.014094 0.980484 1.59463 1 0 1 1 0 0 +EDGE2 3230 3211 -0.0199615 1.01818 1.55692 1 0 1 1 0 0 +EDGE2 3230 3191 0.0091786 1.06369 1.57794 1 0 1 1 0 0 +EDGE2 3230 711 -0.099916 1.01771 1.57042 1 0 1 1 0 0 +EDGE2 3230 731 0.0311512 0.965003 1.57722 1 0 1 1 0 0 +EDGE2 3230 1209 -0.971016 0.0248454 0.0189926 1 0 1 1 0 0 +EDGE2 3230 3209 -0.963172 -0.0744905 -0.0248996 1 0 1 1 0 0 +EDGE2 3230 3229 -0.954127 -0.0178935 -0.00340663 1 0 1 1 0 0 +EDGE2 3230 709 -0.992612 -0.0285447 0.00575407 1 0 1 1 0 0 +EDGE2 3230 730 0.0232353 -0.0303287 -3.15465 1 0 1 1 0 0 +EDGE2 3230 3190 0.0206333 -0.0102722 -3.12766 1 0 1 1 0 0 +EDGE2 3230 3210 0.00294199 -0.0360286 -0.0140463 1 0 1 1 0 0 +EDGE2 3230 1210 -0.00311784 -0.0590016 -0.0306005 1 0 1 1 0 0 +EDGE2 3230 710 0.106556 -0.151459 -0.000993796 1 0 1 1 0 0 +EDGE2 3230 3189 1.03748 -0.0761444 -3.14296 1 0 1 1 0 0 +EDGE2 3230 729 1.04555 0.0093483 -3.09846 1 0 1 1 0 0 +EDGE2 3231 732 1.0402 0.0433445 0.0149898 1 0 1 1 0 0 +EDGE2 3231 3192 1.08541 0.00708931 0.0228935 1 0 1 1 0 0 +EDGE2 3231 3212 0.983681 -0.0277441 -0.00353401 1 0 1 1 0 0 +EDGE2 3231 1212 1.00254 0.0495451 0.00028255 1 0 1 1 0 0 +EDGE2 3231 1211 -0.0409251 0.0613077 0.0306849 1 0 1 1 0 0 +EDGE2 3231 3211 -0.0342114 -0.0515072 0.0461746 1 0 1 1 0 0 +EDGE2 3231 712 1.06807 0.0739673 -0.0496216 1 0 1 1 0 0 +EDGE2 3231 3191 0.0260163 0.0234526 -0.00321698 1 0 1 1 0 0 +EDGE2 3231 711 -0.104886 0.0156185 0.0133781 1 0 1 1 0 0 +EDGE2 3231 731 0.0607777 0.019456 -0.0019684 1 0 1 1 0 0 +EDGE2 3231 730 -1.10259 0.0167544 1.55291 1 0 1 1 0 0 +EDGE2 3231 3190 -1.01689 -0.00963219 1.57442 1 0 1 1 0 0 +EDGE2 3231 3210 -0.992472 0.0838216 -1.5877 1 0 1 1 0 0 +EDGE2 3231 3230 -0.982444 -0.035098 -1.58669 1 0 1 1 0 0 +EDGE2 3231 1210 -0.978088 -0.00406122 -1.58318 1 0 1 1 0 0 +EDGE2 3231 710 -1.02619 0.0346605 -1.54646 1 0 1 1 0 0 +EDGE2 3232 732 -0.0615545 -0.0223302 0.0173147 1 0 1 1 0 0 +EDGE2 3232 713 1.04499 -0.0621311 0.00107246 1 0 1 1 0 0 +EDGE2 3232 1213 0.955913 0.0890246 0.000847105 1 0 1 1 0 0 +EDGE2 3232 3193 1.1208 -0.0704044 0.0418742 1 0 1 1 0 0 +EDGE2 3232 3213 0.974471 -0.00977855 -0.0633229 1 0 1 1 0 0 +EDGE2 3232 733 1.08513 -0.0163048 0.00941022 1 0 1 1 0 0 +EDGE2 3232 3192 -0.0473814 0.0563155 -0.0234779 1 0 1 1 0 0 +EDGE2 3232 3212 -0.0374262 0.0080218 -0.038055 1 0 1 1 0 0 +EDGE2 3232 1212 0.0361057 0.0404451 -0.0235124 1 0 1 1 0 0 +EDGE2 3232 1211 -0.916663 0.0479875 -0.0102131 1 0 1 1 0 0 +EDGE2 3232 3211 -0.976077 -0.0311842 -0.00245387 1 0 1 1 0 0 +EDGE2 3232 3231 -1.08428 0.0214628 -0.00644997 1 0 1 1 0 0 +EDGE2 3232 712 -0.00355022 -0.0192197 -0.0251154 1 0 1 1 0 0 +EDGE2 3232 3191 -0.904478 0.0206795 -0.0146936 1 0 1 1 0 0 +EDGE2 3232 711 -1.0505 0.0662787 -0.0147945 1 0 1 1 0 0 +EDGE2 3232 731 -1.06492 -0.0250077 0.0100616 1 0 1 1 0 0 +EDGE2 3233 3214 0.972763 0.00258644 -0.0391522 1 0 1 1 0 0 +EDGE2 3233 734 0.975118 -0.0305622 0.0318362 1 0 1 1 0 0 +EDGE2 3233 1214 1.05598 -0.00284583 0.00657075 1 0 1 1 0 0 +EDGE2 3233 3194 1.05231 -0.0341853 -0.021751 1 0 1 1 0 0 +EDGE2 3233 714 1.00064 -0.00957313 0.0122797 1 0 1 1 0 0 +EDGE2 3233 732 -0.990861 -0.0494188 -0.029433 1 0 1 1 0 0 +EDGE2 3233 713 0.0247419 0.0413624 -0.0266801 1 0 1 1 0 0 +EDGE2 3233 1213 0.0585763 0.00611241 0.00892711 1 0 1 1 0 0 +EDGE2 3233 3193 -0.0397719 0.0890653 0.0174893 1 0 1 1 0 0 +EDGE2 3233 3213 0.0365117 0.00388054 -0.0108247 1 0 1 1 0 0 +EDGE2 3233 733 0.0127773 0.1194 0.0265361 1 0 1 1 0 0 +EDGE2 3233 3192 -0.950176 0.0364937 -0.0566179 1 0 1 1 0 0 +EDGE2 3233 3212 -1.01917 -0.0354843 -0.000901117 1 0 1 1 0 0 +EDGE2 3233 3232 -1.1097 0.0154704 -0.020264 1 0 1 1 0 0 +EDGE2 3233 1212 -1.02716 -0.0674522 0.015561 1 0 1 1 0 0 +EDGE2 3233 712 -0.915041 0.025147 0.003719 1 0 1 1 0 0 +EDGE2 3234 3233 -0.977689 0.0362948 0.00836262 1 0 1 1 0 0 +EDGE2 3234 2475 0.931014 -0.0592928 -3.13724 1 0 1 1 0 0 +EDGE2 3234 3195 1.07428 0.0535153 0.0241742 1 0 1 1 0 0 +EDGE2 3234 3215 1.00489 -0.0679473 -0.0286412 1 0 1 1 0 0 +EDGE2 3234 2995 0.991119 -0.00803046 -3.15508 1 0 1 1 0 0 +EDGE2 3234 3214 0.0485407 0.0987639 0.0310093 1 0 1 1 0 0 +EDGE2 3234 715 1.05145 0.0272205 0.00162718 1 0 1 1 0 0 +EDGE2 3234 735 0.936937 -0.00035697 -0.0172584 1 0 1 1 0 0 +EDGE2 3234 1215 1.06806 -0.0296881 -0.0168377 1 0 1 1 0 0 +EDGE2 3234 734 0.02407 0.0717796 -0.00366404 1 0 1 1 0 0 +EDGE2 3234 1214 -0.0627445 -0.0364601 0.012656 1 0 1 1 0 0 +EDGE2 3234 3194 -0.108044 0.0484354 -0.0164373 1 0 1 1 0 0 +EDGE2 3234 714 0.00925647 -0.0861866 0.00160526 1 0 1 1 0 0 +EDGE2 3234 713 -0.970507 -0.0624461 -0.00849241 1 0 1 1 0 0 +EDGE2 3234 1213 -1.01094 0.0614227 0.00363272 1 0 1 1 0 0 +EDGE2 3234 3193 -0.925741 0.0771715 -0.0149834 1 0 1 1 0 0 +EDGE2 3234 3213 -1.06899 0.0114542 0.00113966 1 0 1 1 0 0 +EDGE2 3234 733 -1.08927 0.069321 0.0123464 1 0 1 1 0 0 +EDGE2 3235 736 0.053213 0.977355 1.542 1 0 1 1 0 0 +EDGE2 3235 3196 -0.0135418 0.998136 1.56213 1 0 1 1 0 0 +EDGE2 3235 3216 0.0255023 1.01395 1.55719 1 0 1 1 0 0 +EDGE2 3235 2475 -0.0339989 0.0871063 -3.14594 1 0 1 1 0 0 +EDGE2 3235 2994 1.0577 -0.0027296 -3.10614 1 0 1 1 0 0 +EDGE2 3235 2474 0.999006 0.000433807 -3.14953 1 0 1 1 0 0 +EDGE2 3235 3195 0.0605962 0.00459016 0.0210095 1 0 1 1 0 0 +EDGE2 3235 3215 0.0315963 -0.0149424 -0.0455127 1 0 1 1 0 0 +EDGE2 3235 2995 -0.0211468 0.0566099 -3.15911 1 0 1 1 0 0 +EDGE2 3235 3214 -1.01797 0.00551625 -0.0143774 1 0 1 1 0 0 +EDGE2 3235 715 0.0720526 -0.0546931 0.0389062 1 0 1 1 0 0 +EDGE2 3235 735 -0.0450864 0.0437152 -0.00481761 1 0 1 1 0 0 +EDGE2 3235 1215 0.00707336 0.00801448 0.0181574 1 0 1 1 0 0 +EDGE2 3235 3234 -0.982398 0.0407072 0.0277583 1 0 1 1 0 0 +EDGE2 3235 734 -0.938861 -0.0351169 -0.00996175 1 0 1 1 0 0 +EDGE2 3235 1214 -1.0547 0.0881856 -0.012709 1 0 1 1 0 0 +EDGE2 3235 3194 -1.00061 0.0148041 0.00608229 1 0 1 1 0 0 +EDGE2 3235 714 -0.942974 -0.00498676 -0.0135433 1 0 1 1 0 0 +EDGE2 3235 1216 0.0830049 -1.02599 -1.526 1 0 1 1 0 0 +EDGE2 3235 2996 -0.0975125 -1.03158 -1.551 1 0 1 1 0 0 +EDGE2 3235 2476 0.0223045 -0.969645 -1.60362 1 0 1 1 0 0 +EDGE2 3235 716 0.0180619 -1.08339 -1.56867 1 0 1 1 0 0 +EDGE2 3236 2475 -0.922586 -0.0042004 -1.5396 1 0 1 1 0 0 +EDGE2 3236 3195 -0.97768 -0.0977611 1.59415 1 0 1 1 0 0 +EDGE2 3236 3215 -1.00889 -0.0249298 1.60258 1 0 1 1 0 0 +EDGE2 3236 3235 -0.986505 0.0351231 1.55145 1 0 1 1 0 0 +EDGE2 3236 2995 -1.10094 0.0708798 -1.57756 1 0 1 1 0 0 +EDGE2 3236 715 -0.976225 -0.0607499 1.54487 1 0 1 1 0 0 +EDGE2 3236 735 -0.954716 0.0265467 1.56565 1 0 1 1 0 0 +EDGE2 3236 1215 -0.924924 -0.00354712 1.57652 1 0 1 1 0 0 +EDGE2 3236 1216 0.0172679 -0.081764 -0.0160512 1 0 1 1 0 0 +EDGE2 3236 2996 0.0143474 -0.106306 -0.0200591 1 0 1 1 0 0 +EDGE2 3236 2476 0.0116403 0.0159177 -0.00869948 1 0 1 1 0 0 +EDGE2 3236 716 -0.0616056 -0.0554652 0.00417593 1 0 1 1 0 0 +EDGE2 3236 1217 0.97593 -0.00424946 -0.00679752 1 0 1 1 0 0 +EDGE2 3236 2477 0.964893 0.0245645 -0.00136994 1 0 1 1 0 0 +EDGE2 3236 2997 0.930637 -0.0352857 0.00760919 1 0 1 1 0 0 +EDGE2 3236 717 1.07141 -0.0105915 -0.018936 1 0 1 1 0 0 +EDGE2 3237 1218 1.04681 -0.0266427 0.0346441 1 0 1 1 0 0 +EDGE2 3237 1216 -0.978038 0.0179864 -0.0257501 1 0 1 1 0 0 +EDGE2 3237 2996 -0.999497 0.0481342 -0.00765225 1 0 1 1 0 0 +EDGE2 3237 3236 -1.04381 -0.0327113 0.0164562 1 0 1 1 0 0 +EDGE2 3237 2476 -0.997176 -0.00468522 -0.00831721 1 0 1 1 0 0 +EDGE2 3237 716 -0.985444 0.0132232 -0.0185906 1 0 1 1 0 0 +EDGE2 3237 1217 0.081485 -0.0294695 -0.00313312 1 0 1 1 0 0 +EDGE2 3237 2477 0.00349599 -0.113706 0.00917997 1 0 1 1 0 0 +EDGE2 3237 2997 -0.036245 -0.0131437 -0.0289184 1 0 1 1 0 0 +EDGE2 3237 717 -0.0094997 0.011754 -0.00659218 1 0 1 1 0 0 +EDGE2 3237 2998 1.05443 -0.000452697 0.0118242 1 0 1 1 0 0 +EDGE2 3237 2478 0.962281 -0.0697495 -0.00571302 1 0 1 1 0 0 +EDGE2 3237 718 1.01553 -0.0389217 0.0393534 1 0 1 1 0 0 +EDGE2 3238 1218 0.0486219 0.0113781 -0.000205006 1 0 1 1 0 0 +EDGE2 3238 3237 -0.920861 -0.015864 0.0198192 1 0 1 1 0 0 +EDGE2 3238 1217 -0.927093 -0.0418897 0.00947713 1 0 1 1 0 0 +EDGE2 3238 2477 -0.986912 -0.044719 -0.0291583 1 0 1 1 0 0 +EDGE2 3238 2997 -0.986306 -0.0250259 0.0359305 1 0 1 1 0 0 +EDGE2 3238 717 -1.02868 -0.0132086 0.0158208 1 0 1 1 0 0 +EDGE2 3238 2998 -0.0478298 -0.0183657 0.0143901 1 0 1 1 0 0 +EDGE2 3238 2478 -0.0390643 -0.0171774 -0.0244617 1 0 1 1 0 0 +EDGE2 3238 2479 0.998873 0.0504909 -0.0248355 1 0 1 1 0 0 +EDGE2 3238 718 0.0372058 -0.0149496 -0.00697446 1 0 1 1 0 0 +EDGE2 3238 2999 0.931673 -0.054364 -0.00471255 1 0 1 1 0 0 +EDGE2 3238 719 0.942878 -0.0146977 0.0291538 1 0 1 1 0 0 +EDGE2 3238 1219 0.892295 -0.0533448 0.0345688 1 0 1 1 0 0 +EDGE2 3239 1218 -1.00264 -0.00511247 0.0455418 1 0 1 1 0 0 +EDGE2 3239 2998 -1.05619 0.00677732 0.0254143 1 0 1 1 0 0 +EDGE2 3239 3238 -0.988092 -0.00231207 0.0125049 1 0 1 1 0 0 +EDGE2 3239 2478 -1.08775 -0.0137043 0.0413723 1 0 1 1 0 0 +EDGE2 3239 2479 0.051098 -0.0219041 -0.0152764 1 0 1 1 0 0 +EDGE2 3239 718 -1.03805 -0.123243 -0.000151302 1 0 1 1 0 0 +EDGE2 3239 2999 0.0431583 -0.000150389 0.0522201 1 0 1 1 0 0 +EDGE2 3239 719 -0.0324551 0.0182675 0.0175567 1 0 1 1 0 0 +EDGE2 3239 1219 -0.0402717 0.049924 -0.00447893 1 0 1 1 0 0 +EDGE2 3239 3000 1.0008 0.0439283 0.0167387 1 0 1 1 0 0 +EDGE2 3239 1220 0.941935 -0.078813 -0.00236276 1 0 1 1 0 0 +EDGE2 3239 2480 1.05319 0.0349098 0.00221509 1 0 1 1 0 0 +EDGE2 3239 2980 0.990895 -0.0294715 -3.12083 1 0 1 1 0 0 +EDGE2 3239 720 0.971136 -0.0352496 0.0131301 1 0 1 1 0 0 +EDGE2 3240 2479 -0.910978 0.0374816 -0.00109856 1 0 1 1 0 0 +EDGE2 3240 3239 -0.961637 -0.0427617 -0.0126028 1 0 1 1 0 0 +EDGE2 3240 2999 -0.956603 -0.0031728 -0.0228555 1 0 1 1 0 0 +EDGE2 3240 719 -1.13802 -0.0511011 0.0159883 1 0 1 1 0 0 +EDGE2 3240 1219 -1.06496 0.0363538 -0.00789178 1 0 1 1 0 0 +EDGE2 3240 1221 0.145622 1.03709 1.58166 1 0 1 1 0 0 +EDGE2 3240 2981 -0.142709 0.959872 1.55027 1 0 1 1 0 0 +EDGE2 3240 2481 0.0450708 0.999178 1.59414 1 0 1 1 0 0 +EDGE2 3240 3000 -0.107125 0.0332744 0.0247908 1 0 1 1 0 0 +EDGE2 3240 1220 -0.0399473 0.0453448 0.0062297 1 0 1 1 0 0 +EDGE2 3240 2480 -0.0143587 0.00273328 0.020768 1 0 1 1 0 0 +EDGE2 3240 2980 -0.0612995 -0.00184096 -3.15487 1 0 1 1 0 0 +EDGE2 3240 720 -0.021717 -0.0665129 -0.0269294 1 0 1 1 0 0 +EDGE2 3240 721 -0.112045 -1.04155 -1.59275 1 0 1 1 0 0 +EDGE2 3240 3001 -0.0141219 -1.01103 -1.5635 1 0 1 1 0 0 +EDGE2 3240 2979 0.878877 0.0660323 -3.16141 1 0 1 1 0 0 +EDGE2 3241 1221 0.075736 -0.00383043 -0.00137403 1 0 1 1 0 0 +EDGE2 3241 1222 0.99054 0.0446318 -0.0274119 1 0 1 1 0 0 +EDGE2 3241 2982 0.994695 -0.0476362 0.0269429 1 0 1 1 0 0 +EDGE2 3241 2482 1.02701 -0.0672492 -0.0277857 1 0 1 1 0 0 +EDGE2 3241 2981 -0.051594 0.0939754 -0.0143222 1 0 1 1 0 0 +EDGE2 3241 2481 -0.046122 0.0265419 -0.00883309 1 0 1 1 0 0 +EDGE2 3241 3000 -1.00926 -0.0958682 -1.55792 1 0 1 1 0 0 +EDGE2 3241 3240 -0.985603 -0.0308726 -1.54658 1 0 1 1 0 0 +EDGE2 3241 1220 -0.93966 -0.0252059 -1.58402 1 0 1 1 0 0 +EDGE2 3241 2480 -1.04444 -0.00541768 -1.59207 1 0 1 1 0 0 +EDGE2 3241 2980 -0.955614 0.00922402 1.61691 1 0 1 1 0 0 +EDGE2 3241 720 -1.04214 0.0445143 -1.55661 1 0 1 1 0 0 +EDGE2 3242 1221 -0.939981 -0.00806311 -0.00835118 1 0 1 1 0 0 +EDGE2 3242 1223 0.901045 0.057712 -0.00491952 1 0 1 1 0 0 +EDGE2 3242 2983 1.00133 -0.029699 -0.0194351 1 0 1 1 0 0 +EDGE2 3242 2483 0.942101 -0.0379319 -0.0239108 1 0 1 1 0 0 +EDGE2 3242 1222 0.053347 0.00616448 0.0331775 1 0 1 1 0 0 +EDGE2 3242 2982 -0.0901484 0.0477215 -0.00220352 1 0 1 1 0 0 +EDGE2 3242 2482 0.0443937 0.0177588 0.0135167 1 0 1 1 0 0 +EDGE2 3242 2981 -1.01869 -0.0717576 -0.0260953 1 0 1 1 0 0 +EDGE2 3242 3241 -1.00854 0.017977 0.032574 1 0 1 1 0 0 +EDGE2 3242 2481 -0.991899 0.108832 -0.0169804 1 0 1 1 0 0 +EDGE2 3243 1223 0.00667289 -0.0543779 -0.0343892 1 0 1 1 0 0 +EDGE2 3243 1224 1.04227 0.0340158 -0.000307867 1 0 1 1 0 0 +EDGE2 3243 2984 0.990843 0.032473 -0.00865948 1 0 1 1 0 0 +EDGE2 3243 2484 1.00919 0.0396427 0.013362 1 0 1 1 0 0 +EDGE2 3243 2983 -0.0840345 -0.061206 0.0266726 1 0 1 1 0 0 +EDGE2 3243 2483 -0.0392734 0.0096844 0.0159016 1 0 1 1 0 0 +EDGE2 3243 1222 -0.984364 -0.0362304 -0.0363177 1 0 1 1 0 0 +EDGE2 3243 2982 -1.07459 0.0158927 0.0064448 1 0 1 1 0 0 +EDGE2 3243 3242 -1.04357 -0.0597576 0.0011358 1 0 1 1 0 0 +EDGE2 3243 2482 -0.902667 -0.0170058 -0.00975351 1 0 1 1 0 0 +EDGE2 3244 2645 1.04053 0.00111167 -3.14792 1 0 1 1 0 0 +EDGE2 3244 2985 1.01887 -0.0343521 -0.013884 1 0 1 1 0 0 +EDGE2 3244 2665 1.01447 -0.00971032 -3.12896 1 0 1 1 0 0 +EDGE2 3244 1225 1.00495 0.0105508 0.0272776 1 0 1 1 0 0 +EDGE2 3244 2485 0.960446 0.0178895 -0.00117937 1 0 1 1 0 0 +EDGE2 3244 2505 0.993946 0.033734 -3.15566 1 0 1 1 0 0 +EDGE2 3244 2605 1.01171 0.00490914 -3.16323 1 0 1 1 0 0 +EDGE2 3244 2445 0.99946 0.115195 -3.15813 1 0 1 1 0 0 +EDGE2 3244 1223 -0.987121 0.0518606 0.00527065 1 0 1 1 0 0 +EDGE2 3244 1224 0.0111693 -0.0147554 -0.011236 1 0 1 1 0 0 +EDGE2 3244 2984 -0.000962309 -0.0701486 -0.00731993 1 0 1 1 0 0 +EDGE2 3244 2484 0.0602163 0.0299156 -0.0403629 1 0 1 1 0 0 +EDGE2 3244 2983 -0.996971 -0.001101 0.0109191 1 0 1 1 0 0 +EDGE2 3244 3243 -1.07536 0.0707114 0.0468644 1 0 1 1 0 0 +EDGE2 3244 2483 -0.980955 0.0408588 -0.00722181 1 0 1 1 0 0 +EDGE2 3245 2446 0.00615531 1.08522 1.60711 1 0 1 1 0 0 +EDGE2 3245 2986 0.0621067 0.960764 1.58161 1 0 1 1 0 0 +EDGE2 3245 2486 0.0017408 1.00303 1.57328 1 0 1 1 0 0 +EDGE2 3245 1226 0.000820522 0.888415 1.56956 1 0 1 1 0 0 +EDGE2 3245 2666 0.0451148 -1.01008 -1.55951 1 0 1 1 0 0 +EDGE2 3245 2645 0.0840969 -0.0152792 -3.14657 1 0 1 1 0 0 +EDGE2 3245 2444 0.967271 0.0772915 -3.16534 1 0 1 1 0 0 +EDGE2 3245 2604 0.985462 0.00704203 -3.13955 1 0 1 1 0 0 +EDGE2 3245 2644 0.916104 0.00605624 -3.14779 1 0 1 1 0 0 +EDGE2 3245 2664 0.921522 -0.00672891 -3.15335 1 0 1 1 0 0 +EDGE2 3245 2504 0.997647 -0.0830769 -3.15012 1 0 1 1 0 0 +EDGE2 3245 2985 -0.0417262 -0.0760528 -0.00431946 1 0 1 1 0 0 +EDGE2 3245 2665 0.0335101 0.0223974 -3.15797 1 0 1 1 0 0 +EDGE2 3245 1225 0.0643232 -0.0251653 0.0135557 1 0 1 1 0 0 +EDGE2 3245 2485 -0.0100104 -0.11135 0.00258185 1 0 1 1 0 0 +EDGE2 3245 2505 0.0376924 -0.0803762 -3.14822 1 0 1 1 0 0 +EDGE2 3245 2605 -0.0612054 0.0240488 -3.16477 1 0 1 1 0 0 +EDGE2 3245 2445 -0.0222255 -0.0647408 -3.16223 1 0 1 1 0 0 +EDGE2 3245 1224 -1.03354 0.0203183 0.0104635 1 0 1 1 0 0 +EDGE2 3245 2984 -1.05443 0.0960258 0.0088574 1 0 1 1 0 0 +EDGE2 3245 3244 -0.976381 -0.0533519 -0.00206989 1 0 1 1 0 0 +EDGE2 3245 2484 -0.985518 -0.0329969 0.010474 1 0 1 1 0 0 +EDGE2 3245 2506 0.0184884 -0.965557 -1.60083 1 0 1 1 0 0 +EDGE2 3245 2606 -0.103862 -1.04015 -1.54528 1 0 1 1 0 0 +EDGE2 3245 2646 0.0156128 -1.02633 -1.5849 1 0 1 1 0 0 +EDGE2 3246 1227 0.985152 -0.0291477 0.00575971 1 0 1 1 0 0 +EDGE2 3246 2487 0.957932 0.0204576 0.00084713 1 0 1 1 0 0 +EDGE2 3246 2987 0.953587 -0.0407662 -0.0123434 1 0 1 1 0 0 +EDGE2 3246 2447 0.994296 0.0258361 -0.00812858 1 0 1 1 0 0 +EDGE2 3246 2446 -0.00588004 -0.106411 0.00129892 1 0 1 1 0 0 +EDGE2 3246 2986 -0.0887878 0.0348756 -0.0500856 1 0 1 1 0 0 +EDGE2 3246 2486 0.0381563 0.0269067 -0.00994543 1 0 1 1 0 0 +EDGE2 3246 1226 0.0489285 0.0185587 -0.010557 1 0 1 1 0 0 +EDGE2 3246 2645 -1.00804 0.0701657 1.58387 1 0 1 1 0 0 +EDGE2 3246 2985 -1.02995 0.0041433 -1.58488 1 0 1 1 0 0 +EDGE2 3246 3245 -1.01987 0.0439303 -1.56512 1 0 1 1 0 0 +EDGE2 3246 2665 -1.0163 0.0969796 1.57729 1 0 1 1 0 0 +EDGE2 3246 1225 -0.990744 0.0359754 -1.50781 1 0 1 1 0 0 +EDGE2 3246 2485 -1.07554 -0.0231647 -1.57839 1 0 1 1 0 0 +EDGE2 3246 2505 -1.03555 0.0236269 1.53407 1 0 1 1 0 0 +EDGE2 3246 2605 -1.03794 0.0522129 1.55644 1 0 1 1 0 0 +EDGE2 3246 2445 -1.02447 0.00867241 1.59216 1 0 1 1 0 0 +EDGE2 3247 2488 0.955937 0.010114 0.00381718 1 0 1 1 0 0 +EDGE2 3247 2988 0.983006 -0.0263217 -0.0304745 1 0 1 1 0 0 +EDGE2 3247 1228 0.989046 -0.0161123 0.0212823 1 0 1 1 0 0 +EDGE2 3247 2448 0.987882 -0.0235555 -0.0272689 1 0 1 1 0 0 +EDGE2 3247 1227 -0.0488829 -0.0184448 -0.0143868 1 0 1 1 0 0 +EDGE2 3247 2487 -0.0536977 0.0190178 -0.0165183 1 0 1 1 0 0 +EDGE2 3247 2987 -0.0384253 0.0807268 0.00359147 1 0 1 1 0 0 +EDGE2 3247 2447 0.0411979 0.0341346 0.000107038 1 0 1 1 0 0 +EDGE2 3247 2446 -0.991501 -0.00724781 -0.0279537 1 0 1 1 0 0 +EDGE2 3247 2986 -1.05092 0.0534119 0.00186053 1 0 1 1 0 0 +EDGE2 3247 3246 -1.0954 0.0387868 -0.0206011 1 0 1 1 0 0 +EDGE2 3247 2486 -1.06717 -0.0140581 -0.0256481 1 0 1 1 0 0 +EDGE2 3247 1226 -1.08476 -0.0218219 -0.0139757 1 0 1 1 0 0 +EDGE2 3248 2488 -0.0149848 -0.0666696 -0.0250624 1 0 1 1 0 0 +EDGE2 3248 2449 1.0417 -0.0428432 -0.014082 1 0 1 1 0 0 +EDGE2 3248 2989 0.967806 0.0141338 -0.00264647 1 0 1 1 0 0 +EDGE2 3248 2489 1.01166 -0.0461865 -0.0222552 1 0 1 1 0 0 +EDGE2 3248 1229 0.98487 0.00079609 0.0326578 1 0 1 1 0 0 +EDGE2 3248 2988 0.069564 -0.00385516 -0.00186554 1 0 1 1 0 0 +EDGE2 3248 1228 -0.00205007 0.0351334 0.0181237 1 0 1 1 0 0 +EDGE2 3248 2448 0.0229033 0.0396211 0.00179515 1 0 1 1 0 0 +EDGE2 3248 1227 -1.06746 -0.0502461 0.0217293 1 0 1 1 0 0 +EDGE2 3248 2487 -0.99902 -0.0340226 -0.014305 1 0 1 1 0 0 +EDGE2 3248 2987 -1.00907 0.0284844 0.00969451 1 0 1 1 0 0 +EDGE2 3248 3247 -0.959997 0.0255108 -0.00504642 1 0 1 1 0 0 +EDGE2 3248 2447 -0.997177 0.0377411 0.0262309 1 0 1 1 0 0 +EDGE2 3249 1250 0.978079 0.0073533 -3.13001 1 0 1 1 0 0 +EDGE2 3249 2990 0.97373 0.00149817 0.0470889 1 0 1 1 0 0 +EDGE2 3249 2450 1.03533 -0.00252445 0.0118547 1 0 1 1 0 0 +EDGE2 3249 2470 0.957244 0.0478579 -3.16471 1 0 1 1 0 0 +EDGE2 3249 2490 0.999442 0.0755532 0.00110371 1 0 1 1 0 0 +EDGE2 3249 2290 1.02371 -0.0162792 -3.10422 1 0 1 1 0 0 +EDGE2 3249 1230 0.993201 0.0213808 -0.0298464 1 0 1 1 0 0 +EDGE2 3249 2488 -1.06337 -0.0477263 -0.0103245 1 0 1 1 0 0 +EDGE2 3249 2449 0.0460112 -0.0646242 0.0161415 1 0 1 1 0 0 +EDGE2 3249 2989 0.0545406 -0.0182091 -6.35175e-05 1 0 1 1 0 0 +EDGE2 3249 2489 -0.0393303 -0.0593841 0.0127459 1 0 1 1 0 0 +EDGE2 3249 3248 -1.04075 -0.00582098 0.0274291 1 0 1 1 0 0 +EDGE2 3249 1229 -0.00480041 -0.0255069 0.01227 1 0 1 1 0 0 +EDGE2 3249 2988 -1.06545 0.029426 -0.00417528 1 0 1 1 0 0 +EDGE2 3249 1228 -1.03525 0.0218478 -0.00716934 1 0 1 1 0 0 +EDGE2 3249 2448 -1.02937 -0.0148999 0.00837486 1 0 1 1 0 0 +EDGE2 3250 2291 0.00406622 -1.07551 -1.58462 1 0 1 1 0 0 +EDGE2 3250 2289 1.01778 0.0099249 -3.15234 1 0 1 1 0 0 +EDGE2 3250 2469 1.09559 0.0252643 -3.16835 1 0 1 1 0 0 +EDGE2 3250 2491 -0.0675725 -0.979845 -1.55663 1 0 1 1 0 0 +EDGE2 3250 2451 -0.124156 -1.0913 -1.57366 1 0 1 1 0 0 +EDGE2 3250 1249 1.06884 -0.0870587 -3.13697 1 0 1 1 0 0 +EDGE2 3250 1250 -0.0685996 0.00193345 -3.1438 1 0 1 1 0 0 +EDGE2 3250 2990 -0.0150143 0.024688 0.0204853 1 0 1 1 0 0 +EDGE2 3250 1231 -0.0194127 -1.04997 -1.56534 1 0 1 1 0 0 +EDGE2 3250 1251 0.0482022 -1.00676 -1.55314 1 0 1 1 0 0 +EDGE2 3250 2450 0.0169102 0.00438197 -0.0414373 1 0 1 1 0 0 +EDGE2 3250 2470 -0.0458741 0.00840291 -3.19096 1 0 1 1 0 0 +EDGE2 3250 2490 -0.00869087 0.00220987 -0.0122371 1 0 1 1 0 0 +EDGE2 3250 2290 -0.0257534 0.0631907 -3.15203 1 0 1 1 0 0 +EDGE2 3250 2991 0.00530727 0.994934 1.56532 1 0 1 1 0 0 +EDGE2 3250 1230 -0.0314352 0.0727053 -0.019502 1 0 1 1 0 0 +EDGE2 3250 2471 -0.0081727 0.935997 1.55951 1 0 1 1 0 0 +EDGE2 3250 2449 -0.982687 0.0324239 -0.00708519 1 0 1 1 0 0 +EDGE2 3250 2989 -0.934871 0.0309915 0.0135407 1 0 1 1 0 0 +EDGE2 3250 3249 -1.09579 -0.0046952 -0.0153774 1 0 1 1 0 0 +EDGE2 3250 2489 -0.979932 -0.00849876 0.0201257 1 0 1 1 0 0 +EDGE2 3250 1229 -1.06501 0.00289873 -0.0103536 1 0 1 1 0 0 +EDGE2 3251 1250 -1.06472 -0.0066551 1.59165 1 0 1 1 0 0 +EDGE2 3251 2990 -0.863806 0.0704701 -1.55496 1 0 1 1 0 0 +EDGE2 3251 3250 -0.998992 -0.0562417 -1.55596 1 0 1 1 0 0 +EDGE2 3251 2450 -0.978181 -0.0255395 -1.59764 1 0 1 1 0 0 +EDGE2 3251 2470 -0.964488 0.0682551 1.58241 1 0 1 1 0 0 +EDGE2 3251 2490 -1.02779 -0.0101414 -1.60162 1 0 1 1 0 0 +EDGE2 3251 2290 -0.943936 -0.0128383 1.5624 1 0 1 1 0 0 +EDGE2 3251 2991 0.0820803 0.0299874 0.0188024 1 0 1 1 0 0 +EDGE2 3251 1230 -1.04375 -0.0230043 -1.56617 1 0 1 1 0 0 +EDGE2 3251 2471 0.0082864 -0.0965055 -0.0218102 1 0 1 1 0 0 +EDGE2 3251 2472 1.01211 0.0458464 0.0112914 1 0 1 1 0 0 +EDGE2 3251 2992 1.0258 -0.108944 -0.0200378 1 0 1 1 0 0 +EDGE2 3252 2993 1.01299 0.0541166 -0.0118068 1 0 1 1 0 0 +EDGE2 3252 2991 -0.97821 0.013451 0.00532679 1 0 1 1 0 0 +EDGE2 3252 3251 -0.94546 0.0344077 -0.00638594 1 0 1 1 0 0 +EDGE2 3252 2471 -1.00071 -0.02571 0.0207831 1 0 1 1 0 0 +EDGE2 3252 2472 -0.104166 0.01872 -0.00270004 1 0 1 1 0 0 +EDGE2 3252 2992 -0.00407893 0.10661 -0.0175342 1 0 1 1 0 0 +EDGE2 3252 2473 0.939517 0.0268098 0.00734388 1 0 1 1 0 0 +EDGE2 3253 2993 -0.0364014 -0.0625083 0.0142923 1 0 1 1 0 0 +EDGE2 3253 3252 -0.950656 -0.0303139 -0.0207898 1 0 1 1 0 0 +EDGE2 3253 2472 -0.968103 0.0168295 -0.0256169 1 0 1 1 0 0 +EDGE2 3253 2992 -0.900867 -0.0197809 -0.0210606 1 0 1 1 0 0 +EDGE2 3253 2994 0.975478 0.0135384 -0.0153335 1 0 1 1 0 0 +EDGE2 3253 2473 -0.0458759 -0.00359402 -0.0259351 1 0 1 1 0 0 +EDGE2 3253 2474 0.971776 -0.0876729 0.0450354 1 0 1 1 0 0 +EDGE2 3254 2993 -0.943211 -0.017559 -0.014243 1 0 1 1 0 0 +EDGE2 3254 3253 -0.966483 0.0556715 0.0444885 1 0 1 1 0 0 +EDGE2 3254 2475 1.00222 0.129399 0.0169844 1 0 1 1 0 0 +EDGE2 3254 2994 0.0260045 0.0116747 -0.010301 1 0 1 1 0 0 +EDGE2 3254 2473 -1.03112 -0.0179776 0.028915 1 0 1 1 0 0 +EDGE2 3254 2474 -0.0506761 -0.0209162 0.00450075 1 0 1 1 0 0 +EDGE2 3254 3195 0.989979 -0.0794643 -3.11223 1 0 1 1 0 0 +EDGE2 3254 3215 1.02952 0.0280442 -3.14928 1 0 1 1 0 0 +EDGE2 3254 3235 1.02666 -0.100858 -3.17185 1 0 1 1 0 0 +EDGE2 3254 2995 0.965034 0.00303928 0.000410815 1 0 1 1 0 0 +EDGE2 3254 715 1.0876 0.0638949 -3.1243 1 0 1 1 0 0 +EDGE2 3254 735 1.00256 -0.0277576 -3.13118 1 0 1 1 0 0 +EDGE2 3254 1215 0.963366 0.0535109 -3.15218 1 0 1 1 0 0 +EDGE2 3255 736 -0.0276004 -0.957626 -1.58913 1 0 1 1 0 0 +EDGE2 3255 3196 -0.0575622 -1.00202 -1.60223 1 0 1 1 0 0 +EDGE2 3255 3216 -0.0647945 -1.07574 -1.58122 1 0 1 1 0 0 +EDGE2 3255 2475 -0.05134 0.0046812 -0.0221419 1 0 1 1 0 0 +EDGE2 3255 2994 -0.945902 -0.0195749 0.0185895 1 0 1 1 0 0 +EDGE2 3255 3254 -1.05824 -0.0119583 0.0191987 1 0 1 1 0 0 +EDGE2 3255 2474 -1.11453 0.138672 0.00664413 1 0 1 1 0 0 +EDGE2 3255 3195 0.0228457 -0.07337 -3.17909 1 0 1 1 0 0 +EDGE2 3255 3215 -0.0414706 0.00272897 -3.12775 1 0 1 1 0 0 +EDGE2 3255 3235 -0.0138143 -0.0192149 -3.13896 1 0 1 1 0 0 +EDGE2 3255 2995 -0.0417265 -0.0616036 -0.0104833 1 0 1 1 0 0 +EDGE2 3255 3214 0.989709 -0.0771503 -3.10472 1 0 1 1 0 0 +EDGE2 3255 715 0.0749534 -0.0848086 -3.15596 1 0 1 1 0 0 +EDGE2 3255 735 -0.017488 -0.0233401 -3.12654 1 0 1 1 0 0 +EDGE2 3255 1215 -0.016486 0.0298176 -3.11373 1 0 1 1 0 0 +EDGE2 3255 3234 1.03752 0.00644132 -3.12957 1 0 1 1 0 0 +EDGE2 3255 734 0.927814 0.0236263 -3.13935 1 0 1 1 0 0 +EDGE2 3255 1214 0.993083 -0.0299727 -3.1394 1 0 1 1 0 0 +EDGE2 3255 3194 1.05604 0.0392469 -3.17392 1 0 1 1 0 0 +EDGE2 3255 714 1.03225 -0.0342361 -3.17852 1 0 1 1 0 0 +EDGE2 3255 1216 -0.00752091 1.08213 1.55598 1 0 1 1 0 0 +EDGE2 3255 2996 0.0689683 1.03076 1.59765 1 0 1 1 0 0 +EDGE2 3255 3236 -0.0990885 0.994436 1.59046 1 0 1 1 0 0 +EDGE2 3255 2476 0.0102657 1.05684 1.53878 1 0 1 1 0 0 +EDGE2 3255 716 0.050286 1.01817 1.56584 1 0 1 1 0 0 +EDGE2 3256 2475 -0.958498 -0.0268199 -1.58365 1 0 1 1 0 0 +EDGE2 3256 3255 -1.02413 0.0922281 -1.55777 1 0 1 1 0 0 +EDGE2 3256 3195 -1.01629 0.0342876 1.57455 1 0 1 1 0 0 +EDGE2 3256 3215 -0.946565 0.055552 1.57453 1 0 1 1 0 0 +EDGE2 3256 3235 -0.975346 0.0175925 1.57054 1 0 1 1 0 0 +EDGE2 3256 2995 -1.00611 0.0596825 -1.57107 1 0 1 1 0 0 +EDGE2 3256 715 -1.01826 -0.0135239 1.55566 1 0 1 1 0 0 +EDGE2 3256 735 -1.02659 0.00967988 1.5698 1 0 1 1 0 0 +EDGE2 3256 1215 -1.01491 -0.0364574 1.55558 1 0 1 1 0 0 +EDGE2 3256 3237 1.00292 0.0322678 0.0143789 1 0 1 1 0 0 +EDGE2 3256 1216 -0.0115409 0.00688643 -0.00349375 1 0 1 1 0 0 +EDGE2 3256 2996 0.057667 -0.00575697 0.0278401 1 0 1 1 0 0 +EDGE2 3256 3236 -0.00171963 0.0482853 0.0147148 1 0 1 1 0 0 +EDGE2 3256 2476 -0.100313 -0.0146264 0.0219539 1 0 1 1 0 0 +EDGE2 3256 716 0.00614108 -0.0825305 0.0018558 1 0 1 1 0 0 +EDGE2 3256 1217 0.940132 -0.00483961 -0.0168023 1 0 1 1 0 0 +EDGE2 3256 2477 0.992495 0.0445049 -0.0399148 1 0 1 1 0 0 +EDGE2 3256 2997 0.928485 -0.0755387 -0.0181295 1 0 1 1 0 0 +EDGE2 3256 717 0.996385 0.0462952 -0.000240742 1 0 1 1 0 0 +EDGE2 3257 1218 1.0203 -0.0669719 -0.0119884 1 0 1 1 0 0 +EDGE2 3257 3237 0.0732971 -0.0239229 0.016118 1 0 1 1 0 0 +EDGE2 3257 1216 -0.873077 -0.0648575 0.0116967 1 0 1 1 0 0 +EDGE2 3257 2996 -1.06622 0.0177743 0.00738604 1 0 1 1 0 0 +EDGE2 3257 3236 -1.00049 -0.0940029 -0.0163294 1 0 1 1 0 0 +EDGE2 3257 3256 -0.96909 -0.00556638 -0.000320561 1 0 1 1 0 0 +EDGE2 3257 2476 -0.997154 0.033669 0.00455413 1 0 1 1 0 0 +EDGE2 3257 716 -1.03945 0.0468134 0.00941507 1 0 1 1 0 0 +EDGE2 3257 1217 0.0248955 0.0739041 0.0179296 1 0 1 1 0 0 +EDGE2 3257 2477 0.00140028 0.0201218 0.0111465 1 0 1 1 0 0 +EDGE2 3257 2997 0.0446426 -0.0654915 0.0276474 1 0 1 1 0 0 +EDGE2 3257 717 -0.00512248 0.0648379 0.0105866 1 0 1 1 0 0 +EDGE2 3257 2998 1.00359 -0.0869618 0.00321914 1 0 1 1 0 0 +EDGE2 3257 3238 0.957876 0.0563486 0.0211948 1 0 1 1 0 0 +EDGE2 3257 2478 0.923635 0.00491056 0.0181809 1 0 1 1 0 0 +EDGE2 3257 718 1.035 0.0605126 0.00417719 1 0 1 1 0 0 +EDGE2 3258 1218 0.00428777 -0.0372977 -0.0350797 1 0 1 1 0 0 +EDGE2 3258 3237 -1.034 -0.0423576 -0.0145264 1 0 1 1 0 0 +EDGE2 3258 3257 -0.967812 0.0123298 0.00158358 1 0 1 1 0 0 +EDGE2 3258 1217 -0.979678 0.0555304 -0.0277301 1 0 1 1 0 0 +EDGE2 3258 2477 -1.08252 0.00357478 -0.00502138 1 0 1 1 0 0 +EDGE2 3258 2997 -1.08162 0.0477595 -0.0451354 1 0 1 1 0 0 +EDGE2 3258 717 -1.07797 0.0791676 0.0109511 1 0 1 1 0 0 +EDGE2 3258 2998 0.0512683 0.00517375 0.0109409 1 0 1 1 0 0 +EDGE2 3258 3238 0.0404739 -0.0230431 0.00178712 1 0 1 1 0 0 +EDGE2 3258 2478 0.0582328 0.0545518 0.00161359 1 0 1 1 0 0 +EDGE2 3258 2479 0.886364 0.0294906 -0.0160641 1 0 1 1 0 0 +EDGE2 3258 718 -0.0112818 0.0220563 0.0282121 1 0 1 1 0 0 +EDGE2 3258 3239 0.965716 -0.00511127 -0.00123598 1 0 1 1 0 0 +EDGE2 3258 2999 1.03513 -0.0175476 0.0247951 1 0 1 1 0 0 +EDGE2 3258 719 1.00556 -0.0678204 -0.0229417 1 0 1 1 0 0 +EDGE2 3258 1219 1.01225 0.0683974 -0.0236758 1 0 1 1 0 0 +EDGE2 3259 1218 -0.999069 -0.069262 -0.000109377 1 0 1 1 0 0 +EDGE2 3259 3258 -1.06024 -0.0279296 0.00267672 1 0 1 1 0 0 +EDGE2 3259 2998 -1.00856 -0.0148331 -0.00426737 1 0 1 1 0 0 +EDGE2 3259 3238 -1.05051 -0.0276001 0.00284571 1 0 1 1 0 0 +EDGE2 3259 2478 -0.9553 0.0311795 0.00683448 1 0 1 1 0 0 +EDGE2 3259 2479 -0.0146346 -0.0348498 -0.0234327 1 0 1 1 0 0 +EDGE2 3259 718 -1.01304 -0.0480925 0.0227755 1 0 1 1 0 0 +EDGE2 3259 3239 -0.0741735 0.0184691 -0.00731927 1 0 1 1 0 0 +EDGE2 3259 2999 0.145297 -0.146171 -0.0186994 1 0 1 1 0 0 +EDGE2 3259 719 -0.0441876 -0.00809577 -8.54767e-05 1 0 1 1 0 0 +EDGE2 3259 1219 -0.0564561 0.0558942 -0.0297749 1 0 1 1 0 0 +EDGE2 3259 3000 0.999996 0.0551821 0.0111504 1 0 1 1 0 0 +EDGE2 3259 3240 0.982739 0.025004 -0.0190799 1 0 1 1 0 0 +EDGE2 3259 1220 0.966197 0.0887671 0.0128179 1 0 1 1 0 0 +EDGE2 3259 2480 0.966863 -0.0684845 0.00145966 1 0 1 1 0 0 +EDGE2 3259 2980 1.07739 0.00217959 -3.13669 1 0 1 1 0 0 +EDGE2 3259 720 0.952895 -0.0896123 -0.00598987 1 0 1 1 0 0 +EDGE2 3260 2479 -0.92075 0.0189006 -0.0524034 1 0 1 1 0 0 +EDGE2 3260 3239 -0.887348 -0.0963477 -0.00581116 1 0 1 1 0 0 +EDGE2 3260 3259 -1.08518 -0.0237933 0.0134957 1 0 1 1 0 0 +EDGE2 3260 2999 -0.96662 0.0587665 -0.026528 1 0 1 1 0 0 +EDGE2 3260 719 -0.933477 0.00203847 -0.00595605 1 0 1 1 0 0 +EDGE2 3260 1219 -0.947319 0.0287969 -0.0226327 1 0 1 1 0 0 +EDGE2 3260 1221 -0.0286921 0.953387 1.56751 1 0 1 1 0 0 +EDGE2 3260 2981 -0.0157258 1.05083 1.56627 1 0 1 1 0 0 +EDGE2 3260 3241 0.0478272 1.01643 1.55253 1 0 1 1 0 0 +EDGE2 3260 2481 -0.00462645 1.00309 1.56798 1 0 1 1 0 0 +EDGE2 3260 3000 0.0232185 0.0438999 -0.012264 1 0 1 1 0 0 +EDGE2 3260 3240 0.0867382 0.0015046 -0.00266965 1 0 1 1 0 0 +EDGE2 3260 1220 0.0309352 0.0271065 0.00725818 1 0 1 1 0 0 +EDGE2 3260 2480 0.0248026 0.039173 -0.0200691 1 0 1 1 0 0 +EDGE2 3260 2980 0.102471 0.0234167 -3.14698 1 0 1 1 0 0 +EDGE2 3260 720 -0.00665767 -0.00141316 -0.00774531 1 0 1 1 0 0 +EDGE2 3260 721 0.0374358 -1.01699 -1.53668 1 0 1 1 0 0 +EDGE2 3260 3001 -0.0527174 -0.969545 -1.57172 1 0 1 1 0 0 +EDGE2 3260 2979 0.998971 -0.0234806 -3.12725 1 0 1 1 0 0 +EDGE2 3261 3000 -1.04617 -0.000544012 1.60654 1 0 1 1 0 0 +EDGE2 3261 3260 -1.00093 0.03987 1.53889 1 0 1 1 0 0 +EDGE2 3261 3240 -0.916223 0.0107792 1.54603 1 0 1 1 0 0 +EDGE2 3261 1220 -1.00152 0.0259658 1.58984 1 0 1 1 0 0 +EDGE2 3261 2480 -0.982066 -0.0641368 1.57222 1 0 1 1 0 0 +EDGE2 3261 2980 -1.05946 -0.0277143 -1.5444 1 0 1 1 0 0 +EDGE2 3261 720 -0.973707 -0.0670674 1.58356 1 0 1 1 0 0 +EDGE2 3261 721 0.0219654 -0.0717086 -0.0305555 1 0 1 1 0 0 +EDGE2 3261 3001 0.0218068 -0.0239996 0.0512836 1 0 1 1 0 0 +EDGE2 3261 722 0.904232 -0.042051 0.00454438 1 0 1 1 0 0 +EDGE2 3261 3002 0.97936 -0.0437559 0.0225974 1 0 1 1 0 0 +EDGE2 3262 721 -1.0693 0.0381399 -0.0202065 1 0 1 1 0 0 +EDGE2 3262 3001 -0.895666 -0.0262576 -0.013019 1 0 1 1 0 0 +EDGE2 3262 3261 -1.00468 0.0329866 -0.023053 1 0 1 1 0 0 +EDGE2 3262 722 0.066553 -0.0193787 -0.0165069 1 0 1 1 0 0 +EDGE2 3262 3002 0.0996697 0.0358696 -0.000826525 1 0 1 1 0 0 +EDGE2 3262 723 1.02023 0.01575 -0.0103982 1 0 1 1 0 0 +EDGE2 3262 3003 1.03268 0.034418 0.0314125 1 0 1 1 0 0 +EDGE2 3263 3262 -1.05771 -0.0806252 -0.0155838 1 0 1 1 0 0 +EDGE2 3263 722 -1.06731 0.00683882 -0.00600065 1 0 1 1 0 0 +EDGE2 3263 3002 -1.02623 0.0294663 0.0102594 1 0 1 1 0 0 +EDGE2 3263 3004 0.98662 -0.0689185 -0.0188201 1 0 1 1 0 0 +EDGE2 3263 723 -0.0154956 -0.0586879 -0.0186762 1 0 1 1 0 0 +EDGE2 3263 3003 -0.0025164 0.0677019 0.0164752 1 0 1 1 0 0 +EDGE2 3263 724 1.08848 -0.0649895 -0.0276698 1 0 1 1 0 0 +EDGE2 3264 3263 -0.944051 -0.0756871 -0.00313876 1 0 1 1 0 0 +EDGE2 3264 3004 0.0119134 0.0902956 0.0104731 1 0 1 1 0 0 +EDGE2 3264 723 -0.974821 0.0317819 0.00843788 1 0 1 1 0 0 +EDGE2 3264 3003 -0.977742 -0.00640799 0.00984889 1 0 1 1 0 0 +EDGE2 3264 724 -0.000343539 -0.0226731 -0.00710796 1 0 1 1 0 0 +EDGE2 3264 3005 1.04685 -0.0295066 0.00378347 1 0 1 1 0 0 +EDGE2 3264 3185 1.01958 0.0208431 -3.13178 1 0 1 1 0 0 +EDGE2 3264 725 0.962151 0.0712663 -0.00327921 1 0 1 1 0 0 +EDGE2 3265 3004 -0.965608 0.0272209 -0.0128307 1 0 1 1 0 0 +EDGE2 3265 3264 -0.88597 -0.0382639 -0.0438054 1 0 1 1 0 0 +EDGE2 3265 724 -0.993963 -0.0205457 4.48404e-06 1 0 1 1 0 0 +EDGE2 3265 3186 0.0188591 -1.09775 -1.53626 1 0 1 1 0 0 +EDGE2 3265 726 0.0125765 -0.970811 -1.58296 1 0 1 1 0 0 +EDGE2 3265 3005 -0.00320095 0.00647584 -0.0016185 1 0 1 1 0 0 +EDGE2 3265 3185 -0.0124532 -0.0435536 -3.11417 1 0 1 1 0 0 +EDGE2 3265 725 -0.0206342 -0.0418427 0.0180346 1 0 1 1 0 0 +EDGE2 3265 3184 1.03646 -0.0564548 -3.14331 1 0 1 1 0 0 +EDGE2 3265 3006 0.0417586 0.99323 1.55701 1 0 1 1 0 0 +EDGE2 3266 3005 -1.01244 -0.0678943 -1.56167 1 0 1 1 0 0 +EDGE2 3266 3185 -1.06693 0.0307661 1.54084 1 0 1 1 0 0 +EDGE2 3266 3265 -1.05228 0.0207971 -1.54625 1 0 1 1 0 0 +EDGE2 3266 725 -1.04971 0.0516952 -1.55835 1 0 1 1 0 0 +EDGE2 3266 3006 0.0255428 0.0290052 -0.0237898 1 0 1 1 0 0 +EDGE2 3266 3007 0.877386 0.00160771 0.000863971 1 0 1 1 0 0 +EDGE2 3267 3266 -0.983525 0.0791606 -0.0328175 1 0 1 1 0 0 +EDGE2 3267 3006 -1.03761 0.0904858 -0.031651 1 0 1 1 0 0 +EDGE2 3267 3007 -0.0386615 0.0487624 0.0305099 1 0 1 1 0 0 +EDGE2 3267 3008 0.940428 0.0554884 -0.0130036 1 0 1 1 0 0 +EDGE2 3268 3007 -0.981674 0.0401893 0.0130807 1 0 1 1 0 0 +EDGE2 3268 3267 -1.09391 0.00830256 -0.00751971 1 0 1 1 0 0 +EDGE2 3268 3008 0.0033858 0.0716831 0.000562828 1 0 1 1 0 0 +EDGE2 3268 3009 0.974232 0.023531 0.0147652 1 0 1 1 0 0 +EDGE2 3269 3268 -0.937742 -0.0110079 -0.0209305 1 0 1 1 0 0 +EDGE2 3269 3008 -0.93334 0.0111496 -0.00187817 1 0 1 1 0 0 +EDGE2 3269 3009 0.0192931 -0.0316107 -0.0107241 1 0 1 1 0 0 +EDGE2 3269 2970 1.02737 0.0167235 -3.14374 1 0 1 1 0 0 +EDGE2 3269 3010 0.960127 0.0353239 0.0222443 1 0 1 1 0 0 +EDGE2 3269 2710 0.980117 -0.076129 -3.14092 1 0 1 1 0 0 +EDGE2 3270 2971 -0.0296303 1.03971 1.56643 1 0 1 1 0 0 +EDGE2 3270 2711 -0.0655748 -0.98556 -1.56484 1 0 1 1 0 0 +EDGE2 3270 3269 -1.05918 -0.0575243 0.00434934 1 0 1 1 0 0 +EDGE2 3270 3009 -1.01891 -0.0366416 0.0136648 1 0 1 1 0 0 +EDGE2 3270 2970 0.00911174 -0.0243652 -3.15374 1 0 1 1 0 0 +EDGE2 3270 3010 -0.00116489 -0.0198801 -0.00849526 1 0 1 1 0 0 +EDGE2 3270 2710 0.00282127 -0.0138465 -3.16122 1 0 1 1 0 0 +EDGE2 3270 3011 -0.0498802 -1.0906 -1.58826 1 0 1 1 0 0 +EDGE2 3270 2969 0.925705 0.0141217 -3.13564 1 0 1 1 0 0 +EDGE2 3270 2709 1.00146 -0.0543156 -3.11997 1 0 1 1 0 0 +EDGE2 3271 2972 1.09238 0.047494 -0.0314414 1 0 1 1 0 0 +EDGE2 3271 2971 -0.00405254 -0.0226408 0.0214816 1 0 1 1 0 0 +EDGE2 3271 2970 -1.07696 -0.0951802 1.6006 1 0 1 1 0 0 +EDGE2 3271 3270 -0.962011 -0.0630124 -1.56859 1 0 1 1 0 0 +EDGE2 3271 3010 -0.996607 -0.00984559 -1.57218 1 0 1 1 0 0 +EDGE2 3271 2710 -0.997591 -0.0535325 1.59916 1 0 1 1 0 0 +EDGE2 3272 2973 1.00936 -0.00402914 0.0171277 1 0 1 1 0 0 +EDGE2 3272 3271 -1.03085 -0.0779412 0.00395103 1 0 1 1 0 0 +EDGE2 3272 2972 0.0275722 -0.0134245 -0.00661274 1 0 1 1 0 0 +EDGE2 3272 2971 -1.00891 -0.0138959 -0.0184192 1 0 1 1 0 0 +EDGE2 3273 2973 -0.000231878 -0.00587119 -0.0115269 1 0 1 1 0 0 +EDGE2 3273 2974 0.970401 0.0245583 0.00590454 1 0 1 1 0 0 +EDGE2 3273 2972 -0.957502 0.0400269 -0.0126054 1 0 1 1 0 0 +EDGE2 3273 3272 -0.998372 0.0136306 -0.000105169 1 0 1 1 0 0 +EDGE2 3274 2973 -1.03667 0.0169999 0.0050076 1 0 1 1 0 0 +EDGE2 3274 2775 0.963326 -0.025698 -3.09579 1 0 1 1 0 0 +EDGE2 3274 2975 1.06797 0.00358955 0.0107345 1 0 1 1 0 0 +EDGE2 3274 2855 1.06354 -0.00793551 -3.12895 1 0 1 1 0 0 +EDGE2 3274 2615 0.957045 0.00465307 -3.14836 1 0 1 1 0 0 +EDGE2 3274 2675 1.12172 0.0061811 -3.0949 1 0 1 1 0 0 +EDGE2 3274 2695 1.04327 -0.0364738 -3.1215 1 0 1 1 0 0 +EDGE2 3274 2974 -0.0531533 -0.0418146 -0.0110463 1 0 1 1 0 0 +EDGE2 3274 3273 -1.02912 -0.0624867 0.0128651 1 0 1 1 0 0 +EDGE2 3275 2976 -0.017019 1.02249 1.58408 1 0 1 1 0 0 +EDGE2 3275 2854 0.928559 0.0369601 -3.12109 1 0 1 1 0 0 +EDGE2 3275 2775 0.123202 -0.058864 -3.16928 1 0 1 1 0 0 +EDGE2 3275 2674 1.0177 0.00938096 -3.11189 1 0 1 1 0 0 +EDGE2 3275 2694 1.00485 -0.0424076 -3.14246 1 0 1 1 0 0 +EDGE2 3275 2774 1.06527 0.079183 -3.15438 1 0 1 1 0 0 +EDGE2 3275 2614 1.02793 0.0111005 -3.11715 1 0 1 1 0 0 +EDGE2 3275 2975 0.00741307 0.0458499 0.00549917 1 0 1 1 0 0 +EDGE2 3275 2855 -0.0398131 0.0239452 -3.12226 1 0 1 1 0 0 +EDGE2 3275 3274 -1.02016 0.00342747 -0.00758187 1 0 1 1 0 0 +EDGE2 3275 2615 0.00826645 -0.0586648 -3.14163 1 0 1 1 0 0 +EDGE2 3275 2675 -0.0272848 -0.0139956 -3.12603 1 0 1 1 0 0 +EDGE2 3275 2695 0.0719681 -0.0512609 -3.15793 1 0 1 1 0 0 +EDGE2 3275 2974 -1.00162 -0.0488689 0.0354012 1 0 1 1 0 0 +EDGE2 3275 2676 -0.0182351 -1.00322 -1.57711 1 0 1 1 0 0 +EDGE2 3275 2776 0.0375107 -1.00488 -1.55819 1 0 1 1 0 0 +EDGE2 3275 2856 0.0658683 -1.01445 -1.56123 1 0 1 1 0 0 +EDGE2 3275 2696 0.00725723 -1.0504 -1.58671 1 0 1 1 0 0 +EDGE2 3275 2616 0.0259658 -1.03172 -1.5834 1 0 1 1 0 0 +EDGE2 3276 2977 0.919842 -0.0088544 0.00737995 1 0 1 1 0 0 +EDGE2 3276 2976 0.0082199 0.00932796 -0.0125995 1 0 1 1 0 0 +EDGE2 3276 2775 -0.958361 -0.0284968 1.55157 1 0 1 1 0 0 +EDGE2 3276 2975 -1.04653 0.0123935 -1.57826 1 0 1 1 0 0 +EDGE2 3276 3275 -0.992012 0.0410674 -1.58525 1 0 1 1 0 0 +EDGE2 3276 2855 -0.969574 -0.00949006 1.54115 1 0 1 1 0 0 +EDGE2 3276 2615 -1.00629 -0.0544185 1.5648 1 0 1 1 0 0 +EDGE2 3276 2675 -0.970479 0.0871917 1.57068 1 0 1 1 0 0 +EDGE2 3276 2695 -1.00618 0.00950243 1.54346 1 0 1 1 0 0 +EDGE2 3277 2978 1.03708 -0.00660726 0.0371023 1 0 1 1 0 0 +EDGE2 3277 2977 -0.00913092 0.0802979 0.0239201 1 0 1 1 0 0 +EDGE2 3277 2976 -1.05958 -0.0855002 0.00649969 1 0 1 1 0 0 +EDGE2 3277 3276 -0.95618 -0.022698 0.00746344 1 0 1 1 0 0 +EDGE2 3278 2979 0.976169 0.016479 -0.00544678 1 0 1 1 0 0 +EDGE2 3278 2978 -0.0538085 0.0770121 0.00821824 1 0 1 1 0 0 +EDGE2 3278 2977 -0.960941 0.00689813 -0.0242479 1 0 1 1 0 0 +EDGE2 3278 3277 -1.02808 0.0701913 -0.0333838 1 0 1 1 0 0 +EDGE2 3279 3000 1.07685 -0.055495 -3.14564 1 0 1 1 0 0 +EDGE2 3279 3260 1.04045 0.0150966 -3.16661 1 0 1 1 0 0 +EDGE2 3279 3240 1.0516 0.0795391 -3.15247 1 0 1 1 0 0 +EDGE2 3279 1220 0.997718 0.0419313 -3.14234 1 0 1 1 0 0 +EDGE2 3279 2480 1.01992 0.022423 -3.13926 1 0 1 1 0 0 +EDGE2 3279 2980 0.939874 -0.0154172 0.00499201 1 0 1 1 0 0 +EDGE2 3279 720 0.965379 0.0179042 -3.09283 1 0 1 1 0 0 +EDGE2 3279 3278 -1.02205 -0.0678275 -0.0310163 1 0 1 1 0 0 +EDGE2 3279 2979 -0.0115241 0.062735 -0.00388432 1 0 1 1 0 0 +EDGE2 3279 2978 -0.975522 -0.0337287 -0.0120221 1 0 1 1 0 0 +EDGE2 3280 2479 1.02311 -0.0181924 -3.12798 1 0 1 1 0 0 +EDGE2 3280 3239 1.02409 0.00291285 -3.14404 1 0 1 1 0 0 +EDGE2 3280 3259 0.998119 -0.0546977 -3.15035 1 0 1 1 0 0 +EDGE2 3280 2999 1.04931 0.0217572 -3.19065 1 0 1 1 0 0 +EDGE2 3280 719 1.01962 -0.00462812 -3.10838 1 0 1 1 0 0 +EDGE2 3280 1219 1.07262 0.0943526 -3.15251 1 0 1 1 0 0 +EDGE2 3280 1221 -0.032033 -0.943384 -1.59238 1 0 1 1 0 0 +EDGE2 3280 2981 0.0490363 -0.903672 -1.59805 1 0 1 1 0 0 +EDGE2 3280 3241 -0.0842081 -1.0048 -1.58597 1 0 1 1 0 0 +EDGE2 3280 2481 -0.0132825 -1.06387 -1.56615 1 0 1 1 0 0 +EDGE2 3280 3000 0.0488929 -0.00569743 -3.14106 1 0 1 1 0 0 +EDGE2 3280 3260 0.0310481 0.0010981 -3.14826 1 0 1 1 0 0 +EDGE2 3280 3240 -0.0220541 0.0378301 -3.13836 1 0 1 1 0 0 +EDGE2 3280 1220 -0.0112488 -0.0140955 -3.17283 1 0 1 1 0 0 +EDGE2 3280 2480 -0.0158842 -0.0104939 -3.1321 1 0 1 1 0 0 +EDGE2 3280 2980 -0.026583 -0.0257234 0.0217136 1 0 1 1 0 0 +EDGE2 3280 720 -0.0519184 0.0530356 -3.11968 1 0 1 1 0 0 +EDGE2 3280 721 0.0325169 0.942796 1.59192 1 0 1 1 0 0 +EDGE2 3280 3001 0.118117 0.925376 1.58061 1 0 1 1 0 0 +EDGE2 3280 3261 -0.0221272 0.949786 1.60293 1 0 1 1 0 0 +EDGE2 3280 2979 -0.990664 0.0172229 -0.0249659 1 0 1 1 0 0 +EDGE2 3280 3279 -0.935206 -0.0187175 0.00414605 1 0 1 1 0 0 +EDGE2 3281 3000 -1.01733 0.0533507 1.56614 1 0 1 1 0 0 +EDGE2 3281 3260 -0.948841 -0.026616 1.56807 1 0 1 1 0 0 +EDGE2 3281 3280 -0.988558 0.0230607 -1.53525 1 0 1 1 0 0 +EDGE2 3281 3240 -1.03863 -0.0413629 1.60372 1 0 1 1 0 0 +EDGE2 3281 1220 -1.04914 -0.0109493 1.58073 1 0 1 1 0 0 +EDGE2 3281 2480 -0.980113 -0.086917 1.59073 1 0 1 1 0 0 +EDGE2 3281 2980 -0.954656 -0.0655537 -1.56887 1 0 1 1 0 0 +EDGE2 3281 720 -0.996311 0.0131099 1.56575 1 0 1 1 0 0 +EDGE2 3281 3262 0.983581 0.0359244 0.0462673 1 0 1 1 0 0 +EDGE2 3281 721 -0.0811204 -0.0444608 -0.0223476 1 0 1 1 0 0 +EDGE2 3281 3001 -0.0156757 -0.116128 0.0135322 1 0 1 1 0 0 +EDGE2 3281 3261 -0.0241084 0.0476191 -0.00609295 1 0 1 1 0 0 +EDGE2 3281 722 1.02366 0.00642333 -0.0196819 1 0 1 1 0 0 +EDGE2 3281 3002 0.990594 0.00605664 0.0012444 1 0 1 1 0 0 +EDGE2 3282 3263 0.998381 -0.00927939 -0.0151624 1 0 1 1 0 0 +EDGE2 3282 3281 -0.94689 0.0295715 -0.0251626 1 0 1 1 0 0 +EDGE2 3282 3262 0.00847589 0.00258756 -0.015591 1 0 1 1 0 0 +EDGE2 3282 721 -0.960565 -0.122331 -0.00757419 1 0 1 1 0 0 +EDGE2 3282 3001 -0.966493 0.10879 -0.0262711 1 0 1 1 0 0 +EDGE2 3282 3261 -0.918334 -0.0226598 0.0012197 1 0 1 1 0 0 +EDGE2 3282 722 -0.0476316 -0.00157022 0.00894894 1 0 1 1 0 0 +EDGE2 3282 3002 -0.00933771 -0.0994867 0.0366094 1 0 1 1 0 0 +EDGE2 3282 723 0.964212 0.00615754 -0.0150273 1 0 1 1 0 0 +EDGE2 3282 3003 1.02944 0.0714522 0.0153713 1 0 1 1 0 0 +EDGE2 3283 3263 0.0100882 0.0327221 0.00174371 1 0 1 1 0 0 +EDGE2 3283 3262 -0.970168 -0.0212207 -0.0272957 1 0 1 1 0 0 +EDGE2 3283 3282 -0.964335 0.0317382 -0.000433872 1 0 1 1 0 0 +EDGE2 3283 722 -1.08606 0.00270172 0.00693971 1 0 1 1 0 0 +EDGE2 3283 3002 -1.01419 0.00539815 -0.0134026 1 0 1 1 0 0 +EDGE2 3283 3004 0.932326 -0.0107616 0.0176822 1 0 1 1 0 0 +EDGE2 3283 723 -0.13661 0.026749 0.0147515 1 0 1 1 0 0 +EDGE2 3283 3003 -0.0613617 -0.0463325 -0.0323745 1 0 1 1 0 0 +EDGE2 3283 3264 0.941152 -0.00888708 -0.0172141 1 0 1 1 0 0 +EDGE2 3283 724 1.08611 -0.0112209 -5.77191e-05 1 0 1 1 0 0 +EDGE2 3284 3263 -0.936176 -0.0317566 -0.0341268 1 0 1 1 0 0 +EDGE2 3284 3283 -1.00588 -0.0609876 -0.021703 1 0 1 1 0 0 +EDGE2 3284 3004 0.0255398 0.0141064 0.0247453 1 0 1 1 0 0 +EDGE2 3284 723 -1.04749 -0.0467657 -0.0203005 1 0 1 1 0 0 +EDGE2 3284 3003 -1.03946 0.0349351 0.018564 1 0 1 1 0 0 +EDGE2 3284 3264 0.0675071 -0.0230066 0.0334241 1 0 1 1 0 0 +EDGE2 3284 724 -0.0332396 0.0200669 -0.0211299 1 0 1 1 0 0 +EDGE2 3284 3005 0.969623 0.123764 -0.0146864 1 0 1 1 0 0 +EDGE2 3284 3185 0.992886 0.00205115 -3.12106 1 0 1 1 0 0 +EDGE2 3284 3265 0.965886 0.00198799 0.0188958 1 0 1 1 0 0 +EDGE2 3284 725 0.981264 -0.0672505 -0.0155698 1 0 1 1 0 0 +EDGE2 3285 3004 -1.01141 0.0618891 -0.00398329 1 0 1 1 0 0 +EDGE2 3285 3284 -0.950004 -0.101557 0.0123292 1 0 1 1 0 0 +EDGE2 3285 3264 -1.01879 0.0603132 -0.00578909 1 0 1 1 0 0 +EDGE2 3285 724 -0.926196 -0.0254502 -0.0172561 1 0 1 1 0 0 +EDGE2 3285 3186 5.94039e-05 -0.891825 -1.56553 1 0 1 1 0 0 +EDGE2 3285 726 -0.00459154 -0.911143 -1.60117 1 0 1 1 0 0 +EDGE2 3285 3005 -0.0405528 -0.00417245 -0.00550268 1 0 1 1 0 0 +EDGE2 3285 3185 -0.0806247 0.016551 -3.10273 1 0 1 1 0 0 +EDGE2 3285 3265 -0.0185285 0.0256983 0.0269226 1 0 1 1 0 0 +EDGE2 3285 725 -0.0555344 -0.0204859 -0.00827189 1 0 1 1 0 0 +EDGE2 3285 3184 1.00656 -0.0223151 -3.16313 1 0 1 1 0 0 +EDGE2 3285 3266 0.0288752 0.941528 1.59903 1 0 1 1 0 0 +EDGE2 3285 3006 -0.0519988 1.00624 1.5727 1 0 1 1 0 0 +EDGE2 3286 3285 -0.973462 -0.00260953 -1.58859 1 0 1 1 0 0 +EDGE2 3286 3005 -1.05587 -0.0456096 -1.59274 1 0 1 1 0 0 +EDGE2 3286 3185 -0.94351 -0.0762996 1.53523 1 0 1 1 0 0 +EDGE2 3286 3265 -0.981174 -0.0629642 -1.59456 1 0 1 1 0 0 +EDGE2 3286 725 -0.934676 -0.0423165 -1.56083 1 0 1 1 0 0 +EDGE2 3286 3266 -0.0744928 -0.0534679 -0.00968252 1 0 1 1 0 0 +EDGE2 3286 3006 0.0228713 -0.00136638 0.011294 1 0 1 1 0 0 +EDGE2 3286 3007 1.06183 -0.0206822 0.0205945 1 0 1 1 0 0 +EDGE2 3286 3267 1.02027 0.0206769 -0.0125644 1 0 1 1 0 0 +EDGE2 3287 3266 -0.973924 -0.0123423 0.000336895 1 0 1 1 0 0 +EDGE2 3287 3286 -0.991835 -0.0434335 0.0276117 1 0 1 1 0 0 +EDGE2 3287 3006 -1.06251 0.0576587 0.00490406 1 0 1 1 0 0 +EDGE2 3287 3268 1.04263 -0.00653298 -0.0272194 1 0 1 1 0 0 +EDGE2 3287 3007 -0.0354596 -0.00478642 -0.0272537 1 0 1 1 0 0 +EDGE2 3287 3267 -0.0893046 0.0503097 -0.0222565 1 0 1 1 0 0 +EDGE2 3287 3008 0.96627 -0.0208051 -0.0414974 1 0 1 1 0 0 +EDGE2 3288 3268 -0.0639253 -0.0826417 -0.0070448 1 0 1 1 0 0 +EDGE2 3288 3007 -1.00906 -0.0602103 -0.00531612 1 0 1 1 0 0 +EDGE2 3288 3267 -1.00811 0.0454783 -0.00969407 1 0 1 1 0 0 +EDGE2 3288 3287 -0.918924 0.0485043 -0.0331749 1 0 1 1 0 0 +EDGE2 3288 3269 0.926253 -0.131865 -0.0121073 1 0 1 1 0 0 +EDGE2 3288 3008 -0.106054 0.0294343 -0.0263729 1 0 1 1 0 0 +EDGE2 3288 3009 1.00872 -0.0652537 0.0168225 1 0 1 1 0 0 +EDGE2 3289 3268 -1.01404 0.0949815 0.0246152 1 0 1 1 0 0 +EDGE2 3289 3288 -1.08604 0.0546119 -0.0201452 1 0 1 1 0 0 +EDGE2 3289 3269 -0.0387413 0.0709932 -0.00859189 1 0 1 1 0 0 +EDGE2 3289 3008 -1.02514 -0.0404976 0.0298182 1 0 1 1 0 0 +EDGE2 3289 3009 0.0202945 0.0235012 -0.0127042 1 0 1 1 0 0 +EDGE2 3289 2970 1.02432 -0.0486955 -3.14529 1 0 1 1 0 0 +EDGE2 3289 3270 0.986315 0.0170135 0.0174844 1 0 1 1 0 0 +EDGE2 3289 3010 0.980882 -0.0121544 -0.0191757 1 0 1 1 0 0 +EDGE2 3289 2710 0.99207 -0.0510328 -3.13632 1 0 1 1 0 0 +EDGE2 3290 3271 0.0072686 1.08927 1.55437 1 0 1 1 0 0 +EDGE2 3290 2971 -0.0228578 0.970811 1.60371 1 0 1 1 0 0 +EDGE2 3290 2711 -0.0666007 -1.00759 -1.56434 1 0 1 1 0 0 +EDGE2 3290 3269 -0.978559 -0.0329213 -0.0106137 1 0 1 1 0 0 +EDGE2 3290 3289 -1.07921 -0.0193479 -0.0143204 1 0 1 1 0 0 +EDGE2 3290 3009 -1.07086 -0.0132646 -0.0171609 1 0 1 1 0 0 +EDGE2 3290 2970 0.0813009 -0.0117908 -3.17034 1 0 1 1 0 0 +EDGE2 3290 3270 -0.0295626 0.0599755 -0.00574855 1 0 1 1 0 0 +EDGE2 3290 3010 0.0408887 -0.0999244 0.0250272 1 0 1 1 0 0 +EDGE2 3290 2710 -0.0147689 -0.0415257 -3.16043 1 0 1 1 0 0 +EDGE2 3290 3011 -0.0249847 -1.02203 -1.58609 1 0 1 1 0 0 +EDGE2 3290 2969 1.01229 0.0306984 -3.13575 1 0 1 1 0 0 +EDGE2 3290 2709 1.04936 0.00252888 -3.15638 1 0 1 1 0 0 +EDGE2 3291 3271 0.00401056 -0.016176 0.0297194 1 0 1 1 0 0 +EDGE2 3291 2972 0.959903 0.0379547 0.00577034 1 0 1 1 0 0 +EDGE2 3291 3272 0.982892 -0.0576297 -0.0138035 1 0 1 1 0 0 +EDGE2 3291 2971 -0.0119652 0.0576748 0.0270323 1 0 1 1 0 0 +EDGE2 3291 3290 -1.04662 0.0566479 -1.55125 1 0 1 1 0 0 +EDGE2 3291 2970 -0.932918 0.0318726 1.58418 1 0 1 1 0 0 +EDGE2 3291 3270 -1.00858 -0.0814484 -1.58301 1 0 1 1 0 0 +EDGE2 3291 3010 -1.03794 0.0117898 -1.56226 1 0 1 1 0 0 +EDGE2 3291 2710 -1.07239 -0.0190114 1.5651 1 0 1 1 0 0 +EDGE2 3292 2973 1.09716 0.0631288 -0.00172465 1 0 1 1 0 0 +EDGE2 3292 3273 0.993663 -0.0226877 0.000528103 1 0 1 1 0 0 +EDGE2 3292 3271 -0.967272 -0.0631795 -0.00854654 1 0 1 1 0 0 +EDGE2 3292 2972 0.0532377 -0.0385258 -0.00610641 1 0 1 1 0 0 +EDGE2 3292 3272 -0.0416681 -0.0494371 0.0263407 1 0 1 1 0 0 +EDGE2 3292 3291 -1.03853 0.0439595 0.00504581 1 0 1 1 0 0 +EDGE2 3292 2971 -1.04023 0.10334 0.0109095 1 0 1 1 0 0 +EDGE2 3293 2973 -0.0415781 0.0734698 -0.0135191 1 0 1 1 0 0 +EDGE2 3293 3274 0.907325 -0.015504 0.0133987 1 0 1 1 0 0 +EDGE2 3293 2974 0.954641 0.0337525 -0.00812985 1 0 1 1 0 0 +EDGE2 3293 3273 0.0286992 -0.0191323 0.0230628 1 0 1 1 0 0 +EDGE2 3293 2972 -1.08746 -0.0131206 0.000199563 1 0 1 1 0 0 +EDGE2 3293 3272 -1.03354 0.0851221 -0.0200365 1 0 1 1 0 0 +EDGE2 3293 3292 -0.996985 0.0115571 0.0240587 1 0 1 1 0 0 +EDGE2 3294 2973 -1.01467 -0.0403739 0.00484988 1 0 1 1 0 0 +EDGE2 3294 2775 0.954986 0.0616662 -3.1412 1 0 1 1 0 0 +EDGE2 3294 2975 0.977035 0.017617 -0.0133472 1 0 1 1 0 0 +EDGE2 3294 3275 1.10206 -0.0661643 0.0316119 1 0 1 1 0 0 +EDGE2 3294 2855 0.953848 0.100532 -3.15212 1 0 1 1 0 0 +EDGE2 3294 3274 -0.0504971 -0.0143223 -0.0399155 1 0 1 1 0 0 +EDGE2 3294 2615 1.05986 -0.107493 -3.12304 1 0 1 1 0 0 +EDGE2 3294 2675 1.00889 0.00986133 -3.13746 1 0 1 1 0 0 +EDGE2 3294 2695 0.961399 -0.0159543 -3.14957 1 0 1 1 0 0 +EDGE2 3294 3293 -0.970318 -0.0985212 0.0196545 1 0 1 1 0 0 +EDGE2 3294 2974 0.0107931 0.0363129 -0.00224716 1 0 1 1 0 0 +EDGE2 3294 3273 -1.07262 0.038213 -0.00991513 1 0 1 1 0 0 +EDGE2 3295 2976 0.0766551 1.07177 1.58503 1 0 1 1 0 0 +EDGE2 3295 3276 -0.0112562 0.993304 1.57825 1 0 1 1 0 0 +EDGE2 3295 2854 0.946471 0.00876249 -3.1453 1 0 1 1 0 0 +EDGE2 3295 2775 -0.0277243 0.0237779 -3.16741 1 0 1 1 0 0 +EDGE2 3295 2674 1.07916 0.074146 -3.11758 1 0 1 1 0 0 +EDGE2 3295 2694 1.09094 0.007197 -3.11944 1 0 1 1 0 0 +EDGE2 3295 2774 0.944987 -0.0858806 -3.17948 1 0 1 1 0 0 +EDGE2 3295 2614 1.02919 -0.0068051 -3.13165 1 0 1 1 0 0 +EDGE2 3295 2975 -0.0255949 0.0592024 -0.0137906 1 0 1 1 0 0 +EDGE2 3295 3275 0.0308176 0.0220173 0.0354821 1 0 1 1 0 0 +EDGE2 3295 2855 -0.0702147 -0.0388945 -3.131 1 0 1 1 0 0 +EDGE2 3295 3274 -0.990101 0.0901322 0.0273825 1 0 1 1 0 0 +EDGE2 3295 2615 -0.0374189 0.0371167 -3.18112 1 0 1 1 0 0 +EDGE2 3295 2675 -0.0284373 -0.100964 -3.12126 1 0 1 1 0 0 +EDGE2 3295 2695 0.0846073 -0.126465 -3.16007 1 0 1 1 0 0 +EDGE2 3295 3294 -1.03759 0.0901497 0.0250748 1 0 1 1 0 0 +EDGE2 3295 2974 -1.02631 -0.0447066 0.0373484 1 0 1 1 0 0 +EDGE2 3295 2676 0.0999949 -1.06554 -1.5753 1 0 1 1 0 0 +EDGE2 3295 2776 -0.0242763 -0.974953 -1.59919 1 0 1 1 0 0 +EDGE2 3295 2856 -0.0349989 -1.05017 -1.55868 1 0 1 1 0 0 +EDGE2 3295 2696 0.0192805 -1.02533 -1.60611 1 0 1 1 0 0 +EDGE2 3295 2616 0.0399507 -0.982956 -1.54002 1 0 1 1 0 0 +EDGE2 3296 2977 0.998767 -0.00877546 0.0216772 1 0 1 1 0 0 +EDGE2 3296 3277 1.06195 -0.0350035 0.00581532 1 0 1 1 0 0 +EDGE2 3296 2976 0.00598599 -0.00481582 -0.0115662 1 0 1 1 0 0 +EDGE2 3296 3276 0.0876773 0.0499906 0.0285276 1 0 1 1 0 0 +EDGE2 3296 2775 -1.02232 0.034748 1.55575 1 0 1 1 0 0 +EDGE2 3296 2975 -1.07686 -0.0299934 -1.56653 1 0 1 1 0 0 +EDGE2 3296 3275 -1.02974 0.0113363 -1.56249 1 0 1 1 0 0 +EDGE2 3296 3295 -0.913062 -0.0441924 -1.60822 1 0 1 1 0 0 +EDGE2 3296 2855 -0.943846 -0.0281252 1.5674 1 0 1 1 0 0 +EDGE2 3296 2615 -0.963681 -0.0110083 1.57406 1 0 1 1 0 0 +EDGE2 3296 2675 -1.0069 -0.0767665 1.58214 1 0 1 1 0 0 +EDGE2 3296 2695 -1.01466 -0.120794 1.56952 1 0 1 1 0 0 +EDGE2 3297 3278 0.909962 -0.0115755 -0.00542581 1 0 1 1 0 0 +EDGE2 3297 2978 1.03133 -0.0509315 -0.0141905 1 0 1 1 0 0 +EDGE2 3297 3296 -1.02003 -0.00710441 0.00612303 1 0 1 1 0 0 +EDGE2 3297 2977 -0.0167572 -0.020253 -0.00148654 1 0 1 1 0 0 +EDGE2 3297 3277 0.015693 0.0774037 -0.00160474 1 0 1 1 0 0 +EDGE2 3297 2976 -0.997703 0.0402736 0.0195434 1 0 1 1 0 0 +EDGE2 3297 3276 -0.878546 -0.147969 -0.0251169 1 0 1 1 0 0 +EDGE2 3298 3278 0.046646 -0.0484566 0.0171236 1 0 1 1 0 0 +EDGE2 3298 2979 1.01847 0.0215968 0.0141578 1 0 1 1 0 0 +EDGE2 3298 3279 1.00947 0.0135423 0.00237573 1 0 1 1 0 0 +EDGE2 3298 3297 -1.09238 -0.12894 -0.0212606 1 0 1 1 0 0 +EDGE2 3298 2978 0.0241009 0.0507165 -0.0203934 1 0 1 1 0 0 +EDGE2 3298 2977 -0.951732 0.0146403 -0.00354426 1 0 1 1 0 0 +EDGE2 3298 3277 -0.970405 -0.0389206 -0.0273111 1 0 1 1 0 0 +EDGE2 3299 3000 1.03776 -0.0447264 -3.14043 1 0 1 1 0 0 +EDGE2 3299 3260 1.02225 -0.0338495 -3.13585 1 0 1 1 0 0 +EDGE2 3299 3280 1.00019 0.0162483 -0.000183651 1 0 1 1 0 0 +EDGE2 3299 3240 1.04648 0.118017 -3.13911 1 0 1 1 0 0 +EDGE2 3299 1220 1.0549 0.093371 -3.11652 1 0 1 1 0 0 +EDGE2 3299 2480 0.995778 0.0335865 -3.13039 1 0 1 1 0 0 +EDGE2 3299 2980 1.03283 0.0256349 -0.00568617 1 0 1 1 0 0 +EDGE2 3299 720 0.94812 -0.0186198 -3.15091 1 0 1 1 0 0 +EDGE2 3299 3278 -0.932264 -0.00846724 -0.000406785 1 0 1 1 0 0 +EDGE2 3299 2979 0.0889891 -0.063144 -0.00239566 1 0 1 1 0 0 +EDGE2 3299 3279 -0.00327284 -0.0277529 0.0186796 1 0 1 1 0 0 +EDGE2 3299 3298 -1.0469 -0.028967 0.0533489 1 0 1 1 0 0 +EDGE2 3299 2978 -0.998494 -0.0149965 0.00522299 1 0 1 1 0 0 +EDGE2 3300 2479 1.04102 0.0622394 -3.13732 1 0 1 1 0 0 +EDGE2 3300 3239 0.963837 0.132245 -3.14864 1 0 1 1 0 0 +EDGE2 3300 3259 0.966655 -0.0280318 -3.13572 1 0 1 1 0 0 +EDGE2 3300 2999 0.971239 0.0496222 -3.16426 1 0 1 1 0 0 +EDGE2 3300 719 0.990312 -0.056224 -3.16778 1 0 1 1 0 0 +EDGE2 3300 1219 0.936764 -0.023466 -3.17384 1 0 1 1 0 0 +EDGE2 3300 1221 -0.0294624 -1.10125 -1.57373 1 0 1 1 0 0 +EDGE2 3300 2981 0.116209 -1.01567 -1.53116 1 0 1 1 0 0 +EDGE2 3300 3241 0.0438757 -1.07006 -1.5885 1 0 1 1 0 0 +EDGE2 3300 2481 -0.0334084 -1.00266 -1.58439 1 0 1 1 0 0 +EDGE2 3300 3281 0.036506 0.969612 1.55702 1 0 1 1 0 0 +EDGE2 3300 3000 -0.0595151 0.0311809 -3.1583 1 0 1 1 0 0 +EDGE2 3300 3260 0.0422369 -0.093238 -3.15293 1 0 1 1 0 0 +EDGE2 3300 3280 0.0184103 -0.0754547 -0.0389392 1 0 1 1 0 0 +EDGE2 3300 3240 0.0600885 0.00139002 -3.13638 1 0 1 1 0 0 +EDGE2 3300 1220 -0.0100523 0.0755215 -3.12868 1 0 1 1 0 0 +EDGE2 3300 2480 -0.0122144 0.00519322 -3.13367 1 0 1 1 0 0 +EDGE2 3300 2980 -0.0020719 0.0764984 0.02602 1 0 1 1 0 0 +EDGE2 3300 720 0.0642892 -0.0767212 -3.12088 1 0 1 1 0 0 +EDGE2 3300 721 -0.0466107 1.05438 1.55376 1 0 1 1 0 0 +EDGE2 3300 3001 0.00620175 1.03904 1.57596 1 0 1 1 0 0 +EDGE2 3300 3261 -0.0566543 1.05408 1.59913 1 0 1 1 0 0 +EDGE2 3300 2979 -1.00872 -0.00181382 -0.0331667 1 0 1 1 0 0 +EDGE2 3300 3279 -1.13142 0.0128419 -0.0060313 1 0 1 1 0 0 +EDGE2 3300 3299 -0.988823 -0.00946411 -0.0417427 1 0 1 1 0 0 +EDGE2 3301 1221 0.0351661 -0.0187304 -0.0279824 1 0 1 1 0 0 +EDGE2 3301 1222 0.929362 -0.097988 -0.0335413 1 0 1 1 0 0 +EDGE2 3301 2982 1.08321 -0.0311354 0.0220104 1 0 1 1 0 0 +EDGE2 3301 3242 1.07363 -0.00412312 0.00995925 1 0 1 1 0 0 +EDGE2 3301 2482 0.986423 -0.0556821 -0.0143339 1 0 1 1 0 0 +EDGE2 3301 2981 0.0149056 0.00507137 -0.0222135 1 0 1 1 0 0 +EDGE2 3301 3241 -0.0373196 -0.0254759 0.0145523 1 0 1 1 0 0 +EDGE2 3301 2481 -0.0187026 -0.0162307 -0.011734 1 0 1 1 0 0 +EDGE2 3301 3000 -0.971184 -0.0142201 -1.57229 1 0 1 1 0 0 +EDGE2 3301 3260 -1.0471 0.0546427 -1.5563 1 0 1 1 0 0 +EDGE2 3301 3280 -1.105 0.0125212 1.56778 1 0 1 1 0 0 +EDGE2 3301 3300 -0.933946 0.0143309 1.56674 1 0 1 1 0 0 +EDGE2 3301 3240 -0.997042 -0.0757357 -1.5725 1 0 1 1 0 0 +EDGE2 3301 1220 -1.0139 -0.0151494 -1.52852 1 0 1 1 0 0 +EDGE2 3301 2480 -0.986642 -0.0561446 -1.55246 1 0 1 1 0 0 +EDGE2 3301 2980 -1.0322 -0.00943358 1.55295 1 0 1 1 0 0 +EDGE2 3301 720 -1.07507 -0.00138863 -1.57393 1 0 1 1 0 0 +EDGE2 3302 1221 -0.99695 -0.0118127 0.00846828 1 0 1 1 0 0 +EDGE2 3302 1223 0.971963 0.0255686 -0.00614736 1 0 1 1 0 0 +EDGE2 3302 2983 0.966149 -0.0249833 -0.0368966 1 0 1 1 0 0 +EDGE2 3302 3243 0.999831 0.113541 -0.021247 1 0 1 1 0 0 +EDGE2 3302 2483 0.962863 0.0233671 0.0035148 1 0 1 1 0 0 +EDGE2 3302 1222 -0.0141039 -0.00184041 0.000730615 1 0 1 1 0 0 +EDGE2 3302 2982 0.0401236 -0.00655785 0.00945554 1 0 1 1 0 0 +EDGE2 3302 3242 0.0611959 -0.0131569 0.00109588 1 0 1 1 0 0 +EDGE2 3302 2482 -0.00318808 -0.0183671 0.0243389 1 0 1 1 0 0 +EDGE2 3302 2981 -0.942494 0.0113389 -0.0189964 1 0 1 1 0 0 +EDGE2 3302 3241 -1.00661 -0.0159158 0.0173656 1 0 1 1 0 0 +EDGE2 3302 3301 -1.04646 0.0725097 -0.00656022 1 0 1 1 0 0 +EDGE2 3302 2481 -1.02467 0.0502233 0.0122254 1 0 1 1 0 0 +EDGE2 3303 1223 -0.0379755 0.0160513 -0.0250315 1 0 1 1 0 0 +EDGE2 3303 1224 1.02146 -0.0258327 -0.00627419 1 0 1 1 0 0 +EDGE2 3303 2984 1.01043 0.0442027 0.000952174 1 0 1 1 0 0 +EDGE2 3303 3244 1.04166 0.0308252 0.0282946 1 0 1 1 0 0 +EDGE2 3303 2484 1.01516 -0.0258199 -0.0053118 1 0 1 1 0 0 +EDGE2 3303 2983 0.0490746 -0.00191055 0.00236135 1 0 1 1 0 0 +EDGE2 3303 3243 -0.0639758 0.044076 -0.00959214 1 0 1 1 0 0 +EDGE2 3303 2483 -0.0678013 -0.036659 0.0250891 1 0 1 1 0 0 +EDGE2 3303 1222 -0.952418 -0.0333534 0.00427651 1 0 1 1 0 0 +EDGE2 3303 2982 -0.973008 -0.0983351 0.0448534 1 0 1 1 0 0 +EDGE2 3303 3242 -1.02534 0.0161756 -0.0238946 1 0 1 1 0 0 +EDGE2 3303 3302 -0.925635 0.0415064 0.000744426 1 0 1 1 0 0 +EDGE2 3303 2482 -1.02052 0.019013 0.00942489 1 0 1 1 0 0 +EDGE2 3304 2645 0.992365 0.0373408 -3.15821 1 0 1 1 0 0 +EDGE2 3304 2985 0.99703 -0.0318796 0.0138168 1 0 1 1 0 0 +EDGE2 3304 3245 0.969359 -0.0498676 0.0235482 1 0 1 1 0 0 +EDGE2 3304 2665 1.04333 0.0790461 -3.12389 1 0 1 1 0 0 +EDGE2 3304 1225 1.03747 0.0448934 -0.00176633 1 0 1 1 0 0 +EDGE2 3304 2485 0.999145 0.0507758 -0.0237193 1 0 1 1 0 0 +EDGE2 3304 2505 0.919684 -0.0203743 -3.13773 1 0 1 1 0 0 +EDGE2 3304 2605 0.935053 -0.125391 -3.16133 1 0 1 1 0 0 +EDGE2 3304 2445 0.999845 0.00570859 -3.13797 1 0 1 1 0 0 +EDGE2 3304 1223 -1.01582 -0.0206466 -0.00824016 1 0 1 1 0 0 +EDGE2 3304 1224 0.0780553 0.0486952 -0.00814773 1 0 1 1 0 0 +EDGE2 3304 2984 -0.0574326 0.0569763 0.0181212 1 0 1 1 0 0 +EDGE2 3304 3244 -0.0445212 -0.0384288 0.00681415 1 0 1 1 0 0 +EDGE2 3304 2484 -0.0929938 -0.0763693 0.0284557 1 0 1 1 0 0 +EDGE2 3304 2983 -0.924829 -0.0278333 0.00305056 1 0 1 1 0 0 +EDGE2 3304 3243 -0.948359 -0.035043 -0.00684876 1 0 1 1 0 0 +EDGE2 3304 3303 -0.976087 -0.0331921 0.0046916 1 0 1 1 0 0 +EDGE2 3304 2483 -1.02158 0.053458 0.00282583 1 0 1 1 0 0 +EDGE2 3305 2446 0.0523023 1.06381 1.58037 1 0 1 1 0 0 +EDGE2 3305 2986 0.0170355 0.967734 1.54208 1 0 1 1 0 0 +EDGE2 3305 3246 0.0422532 1.00133 1.57125 1 0 1 1 0 0 +EDGE2 3305 2486 0.0771586 0.999843 1.59503 1 0 1 1 0 0 +EDGE2 3305 1226 -0.032463 0.968025 1.58717 1 0 1 1 0 0 +EDGE2 3305 2666 0.0672439 -0.945779 -1.56483 1 0 1 1 0 0 +EDGE2 3305 2645 -0.0820528 -0.0206701 -3.11638 1 0 1 1 0 0 +EDGE2 3305 2444 1.06833 -0.0480587 -3.13693 1 0 1 1 0 0 +EDGE2 3305 2604 1.05385 -0.0485199 -3.1133 1 0 1 1 0 0 +EDGE2 3305 2644 1.06744 -0.00277665 -3.12713 1 0 1 1 0 0 +EDGE2 3305 2664 0.952275 0.0930762 -3.16195 1 0 1 1 0 0 +EDGE2 3305 2504 1.0098 -0.0483769 -3.14968 1 0 1 1 0 0 +EDGE2 3305 2985 0.0516984 0.034744 -0.0172199 1 0 1 1 0 0 +EDGE2 3305 3245 0.0126343 -0.0472263 -0.00206351 1 0 1 1 0 0 +EDGE2 3305 2665 0.0218607 -0.0796338 -3.17095 1 0 1 1 0 0 +EDGE2 3305 1225 -0.0267463 -0.020437 -0.014663 1 0 1 1 0 0 +EDGE2 3305 2485 -0.024556 -0.036805 0.00997458 1 0 1 1 0 0 +EDGE2 3305 2505 0.0399099 0.0165168 -3.14762 1 0 1 1 0 0 +EDGE2 3305 2605 0.114741 0.00252026 -3.18089 1 0 1 1 0 0 +EDGE2 3305 2445 -0.0160364 0.0186492 -3.11521 1 0 1 1 0 0 +EDGE2 3305 1224 -0.997147 0.0188602 0.0109255 1 0 1 1 0 0 +EDGE2 3305 2984 -0.960001 -0.0137559 0.0352216 1 0 1 1 0 0 +EDGE2 3305 3244 -0.965542 -0.00367885 -0.0102652 1 0 1 1 0 0 +EDGE2 3305 3304 -1.07276 -0.0235988 0.00540645 1 0 1 1 0 0 +EDGE2 3305 2484 -0.961486 -0.0137053 -0.0176426 1 0 1 1 0 0 +EDGE2 3305 2506 -0.00176451 -1.0042 -1.57038 1 0 1 1 0 0 +EDGE2 3305 2606 -0.0125813 -0.92571 -1.5719 1 0 1 1 0 0 +EDGE2 3305 2646 0.0384018 -0.931569 -1.57492 1 0 1 1 0 0 +EDGE2 3306 1227 0.975938 0.0126398 -0.0153832 1 0 1 1 0 0 +EDGE2 3306 2487 1.08427 0.0178589 -0.0229168 1 0 1 1 0 0 +EDGE2 3306 2987 0.984299 0.0318883 -0.00642426 1 0 1 1 0 0 +EDGE2 3306 3247 0.968961 -0.0323863 0.00283567 1 0 1 1 0 0 +EDGE2 3306 2447 1.01537 0.0145362 0.0244613 1 0 1 1 0 0 +EDGE2 3306 2446 0.0885039 -0.104586 -0.000304565 1 0 1 1 0 0 +EDGE2 3306 2986 -0.00414832 0.00972967 -0.00515054 1 0 1 1 0 0 +EDGE2 3306 3246 0.0157203 -0.00464535 -0.013753 1 0 1 1 0 0 +EDGE2 3306 2486 -0.0714652 -0.0309125 0.0376811 1 0 1 1 0 0 +EDGE2 3306 1226 0.0294519 0.146343 0.00292563 1 0 1 1 0 0 +EDGE2 3306 2645 -0.997752 0.0421964 1.58799 1 0 1 1 0 0 +EDGE2 3306 2985 -0.896751 -0.0248968 -1.53204 1 0 1 1 0 0 +EDGE2 3306 3245 -1.07483 -0.100548 -1.57958 1 0 1 1 0 0 +EDGE2 3306 3305 -1.02309 0.00799773 -1.55145 1 0 1 1 0 0 +EDGE2 3306 2665 -0.93271 -0.0310444 1.59137 1 0 1 1 0 0 +EDGE2 3306 1225 -0.969171 0.0348301 -1.56659 1 0 1 1 0 0 +EDGE2 3306 2485 -0.988851 -0.0383688 -1.55592 1 0 1 1 0 0 +EDGE2 3306 2505 -1.04699 -0.0807786 1.57879 1 0 1 1 0 0 +EDGE2 3306 2605 -0.998414 0.0117006 1.59511 1 0 1 1 0 0 +EDGE2 3306 2445 -1.03141 -0.00456086 1.55026 1 0 1 1 0 0 +EDGE2 3307 2488 1.01868 -0.134133 -0.0416415 1 0 1 1 0 0 +EDGE2 3307 3248 1.02332 0.00397234 -0.00264516 1 0 1 1 0 0 +EDGE2 3307 2988 1.05196 -0.00571237 -0.0390363 1 0 1 1 0 0 +EDGE2 3307 1228 0.961577 -0.00958085 -0.015046 1 0 1 1 0 0 +EDGE2 3307 2448 0.948659 0.0826409 -0.00529742 1 0 1 1 0 0 +EDGE2 3307 1227 0.0207117 -0.0539615 -0.0216492 1 0 1 1 0 0 +EDGE2 3307 2487 -0.0388699 0.0146329 -0.0264917 1 0 1 1 0 0 +EDGE2 3307 2987 -0.0175838 -0.012404 0.00897334 1 0 1 1 0 0 +EDGE2 3307 3247 0.0661625 0.0159616 0.00931296 1 0 1 1 0 0 +EDGE2 3307 2447 -0.0467849 -0.03424 0.0115214 1 0 1 1 0 0 +EDGE2 3307 3306 -0.962492 -0.00560695 0.0229959 1 0 1 1 0 0 +EDGE2 3307 2446 -1.01191 0.0518727 0.0180493 1 0 1 1 0 0 +EDGE2 3307 2986 -0.972566 -0.0100434 0.00890294 1 0 1 1 0 0 +EDGE2 3307 3246 -1.02473 -0.0180221 0.020345 1 0 1 1 0 0 +EDGE2 3307 2486 -0.960081 -0.054461 -0.041246 1 0 1 1 0 0 +EDGE2 3307 1226 -0.985442 0.0229516 0.0313268 1 0 1 1 0 0 +EDGE2 3308 2488 -0.00595372 0.00109734 -0.0134606 1 0 1 1 0 0 +EDGE2 3308 2449 1.0503 -0.0595957 0.00513426 1 0 1 1 0 0 +EDGE2 3308 2989 1.01124 -0.0301019 0.0160104 1 0 1 1 0 0 +EDGE2 3308 3249 0.925774 -0.0739545 -0.0510532 1 0 1 1 0 0 +EDGE2 3308 2489 1.01378 -0.0920024 -0.0140052 1 0 1 1 0 0 +EDGE2 3308 3248 -0.0355274 -0.0689132 0.0127403 1 0 1 1 0 0 +EDGE2 3308 1229 0.987952 -0.0106444 0.00349197 1 0 1 1 0 0 +EDGE2 3308 2988 0.0150556 -0.0446193 0.00571535 1 0 1 1 0 0 +EDGE2 3308 1228 -0.0732431 -0.004644 -0.0084807 1 0 1 1 0 0 +EDGE2 3308 2448 0.0464954 -0.0252079 -0.0123104 1 0 1 1 0 0 +EDGE2 3308 1227 -0.919205 -0.0270807 -0.00393157 1 0 1 1 0 0 +EDGE2 3308 3307 -0.999501 0.0946207 -0.0037892 1 0 1 1 0 0 +EDGE2 3308 2487 -1.02485 0.00726476 0.0157821 1 0 1 1 0 0 +EDGE2 3308 2987 -0.958773 -0.086104 0.0402872 1 0 1 1 0 0 +EDGE2 3308 3247 -0.972939 0.0213261 -0.0187932 1 0 1 1 0 0 +EDGE2 3308 2447 -1.06024 -0.00499336 0.000923903 1 0 1 1 0 0 +EDGE2 3309 1250 0.985263 0.0238891 -3.1541 1 0 1 1 0 0 +EDGE2 3309 2990 0.947656 0.00633295 -0.0247791 1 0 1 1 0 0 +EDGE2 3309 3250 0.972268 0.071836 -0.0245145 1 0 1 1 0 0 +EDGE2 3309 2450 1.05625 0.0591189 -0.0292519 1 0 1 1 0 0 +EDGE2 3309 2470 1.01838 -0.0215404 -3.12473 1 0 1 1 0 0 +EDGE2 3309 2490 1.16253 -0.0557934 -0.00387784 1 0 1 1 0 0 +EDGE2 3309 2290 0.951743 -0.0544802 -3.12888 1 0 1 1 0 0 +EDGE2 3309 1230 1.03161 0.0751377 -0.0140174 1 0 1 1 0 0 +EDGE2 3309 2488 -1.0265 -0.0452509 0.0057934 1 0 1 1 0 0 +EDGE2 3309 2449 -0.011126 0.11155 -0.0191753 1 0 1 1 0 0 +EDGE2 3309 2989 -0.100233 -0.0116066 -0.0291582 1 0 1 1 0 0 +EDGE2 3309 3249 0.0175749 0.00229373 0.0276349 1 0 1 1 0 0 +EDGE2 3309 2489 0.0446322 0.0258597 -0.00471356 1 0 1 1 0 0 +EDGE2 3309 3248 -1.02424 0.0713268 -0.00577176 1 0 1 1 0 0 +EDGE2 3309 3308 -0.955634 0.0174514 0.0376543 1 0 1 1 0 0 +EDGE2 3309 1229 -0.0629103 -0.0551877 -0.0134156 1 0 1 1 0 0 +EDGE2 3309 2988 -0.955737 -0.0561405 -0.0220439 1 0 1 1 0 0 +EDGE2 3309 1228 -0.92805 -0.0197638 0.00515382 1 0 1 1 0 0 +EDGE2 3309 2448 -0.965492 0.00615246 -0.00638508 1 0 1 1 0 0 +EDGE2 3310 2291 -0.0235354 -0.949995 -1.55939 1 0 1 1 0 0 +EDGE2 3310 2289 1.02546 -0.0665843 -3.15836 1 0 1 1 0 0 +EDGE2 3310 2469 0.836186 0.00145892 -3.12966 1 0 1 1 0 0 +EDGE2 3310 2491 0.0594704 -0.938617 -1.57323 1 0 1 1 0 0 +EDGE2 3310 2451 -0.00481982 -1.01828 -1.59891 1 0 1 1 0 0 +EDGE2 3310 1249 1.01416 0.0175824 -3.14006 1 0 1 1 0 0 +EDGE2 3310 1250 0.0152125 -0.0204583 -3.14444 1 0 1 1 0 0 +EDGE2 3310 2990 -0.0935632 0.0259011 0.0141323 1 0 1 1 0 0 +EDGE2 3310 1231 -0.00140383 -1.08614 -1.59724 1 0 1 1 0 0 +EDGE2 3310 1251 -0.00610373 -0.987952 -1.57183 1 0 1 1 0 0 +EDGE2 3310 3250 0.00262034 -0.0486275 0.0102067 1 0 1 1 0 0 +EDGE2 3310 2450 0.0162691 0.084627 0.0531351 1 0 1 1 0 0 +EDGE2 3310 2470 0.0431409 0.0272042 -3.13546 1 0 1 1 0 0 +EDGE2 3310 2490 6.90124e-06 -0.0395704 -0.016718 1 0 1 1 0 0 +EDGE2 3310 2290 0.0653418 0.0203287 -3.11752 1 0 1 1 0 0 +EDGE2 3310 2991 -0.0406982 1.05345 1.60283 1 0 1 1 0 0 +EDGE2 3310 3251 0.0613355 1.07876 1.54747 1 0 1 1 0 0 +EDGE2 3310 1230 -0.0331987 -0.0327984 -0.0240377 1 0 1 1 0 0 +EDGE2 3310 2471 -0.0104406 0.967328 1.56821 1 0 1 1 0 0 +EDGE2 3310 2449 -0.912694 -0.0461621 -0.0156322 1 0 1 1 0 0 +EDGE2 3310 2989 -0.951292 -0.0506881 0.00650355 1 0 1 1 0 0 +EDGE2 3310 3249 -1.01476 -0.0830916 -0.00347294 1 0 1 1 0 0 +EDGE2 3310 3309 -0.966098 -0.00769772 0.0261489 1 0 1 1 0 0 +EDGE2 3310 2489 -0.944857 0.0447373 -0.0168471 1 0 1 1 0 0 +EDGE2 3310 1229 -0.972711 -0.0482663 0.0195192 1 0 1 1 0 0 +EDGE2 3311 2292 1.02396 0.022563 -0.0356502 1 0 1 1 0 0 +EDGE2 3311 2452 0.974717 -0.0521355 -0.0118641 1 0 1 1 0 0 +EDGE2 3311 2492 1.05801 0.0446589 -0.0283459 1 0 1 1 0 0 +EDGE2 3311 2291 0.0407314 0.0125504 -0.0459716 1 0 1 1 0 0 +EDGE2 3311 1252 1.02275 0.0680162 -0.0157114 1 0 1 1 0 0 +EDGE2 3311 2491 -0.0517521 -0.0113577 0.0178126 1 0 1 1 0 0 +EDGE2 3311 1232 0.908973 0.0215079 -0.0200971 1 0 1 1 0 0 +EDGE2 3311 2451 0.101411 -0.0275078 -0.0222126 1 0 1 1 0 0 +EDGE2 3311 1250 -0.911483 0.055646 -1.58291 1 0 1 1 0 0 +EDGE2 3311 2990 -1.00488 -0.0145909 1.58021 1 0 1 1 0 0 +EDGE2 3311 3310 -1.07419 0.0356225 1.53789 1 0 1 1 0 0 +EDGE2 3311 1231 -0.0258672 -0.0748846 -0.024855 1 0 1 1 0 0 +EDGE2 3311 1251 -0.0733967 0.0217332 0.0057359 1 0 1 1 0 0 +EDGE2 3311 3250 -1.02842 0.0789605 1.57061 1 0 1 1 0 0 +EDGE2 3311 2450 -0.962946 -0.0324934 1.55575 1 0 1 1 0 0 +EDGE2 3311 2470 -1.04238 0.0275107 -1.56929 1 0 1 1 0 0 +EDGE2 3311 2490 -1.04307 -0.00445881 1.5624 1 0 1 1 0 0 +EDGE2 3311 2290 -1.00788 -0.0341802 -1.56683 1 0 1 1 0 0 +EDGE2 3311 1230 -1.06193 -0.0429364 1.57576 1 0 1 1 0 0 +EDGE2 3312 2292 -0.031795 0.0962149 0.00837746 1 0 1 1 0 0 +EDGE2 3312 2293 1.07937 -0.0690788 0.0156211 1 0 1 1 0 0 +EDGE2 3312 2493 1.04079 0.0563201 -0.0232907 1 0 1 1 0 0 +EDGE2 3312 2453 1.12097 -0.017759 -0.018027 1 0 1 1 0 0 +EDGE2 3312 2452 0.0224417 0.026745 0.0286562 1 0 1 1 0 0 +EDGE2 3312 1233 0.999204 0.0154089 -0.0118722 1 0 1 1 0 0 +EDGE2 3312 1253 0.984636 -0.0305224 0.00585851 1 0 1 1 0 0 +EDGE2 3312 2492 0.0299347 -0.0476936 0.00603527 1 0 1 1 0 0 +EDGE2 3312 2291 -1.00126 0.0577067 -0.00393294 1 0 1 1 0 0 +EDGE2 3312 1252 -0.0217183 -0.0114469 -0.0155421 1 0 1 1 0 0 +EDGE2 3312 2491 -1.06248 0.0804224 0.0414024 1 0 1 1 0 0 +EDGE2 3312 3311 -0.970534 0.00773519 -0.0220335 1 0 1 1 0 0 +EDGE2 3312 1232 -0.077641 -0.0311107 0.00981586 1 0 1 1 0 0 +EDGE2 3312 2451 -1.00035 -0.0575573 0.00130602 1 0 1 1 0 0 +EDGE2 3312 1231 -1.06731 -0.0849483 0.00141607 1 0 1 1 0 0 +EDGE2 3312 1251 -1.04933 -0.0128394 -0.0162924 1 0 1 1 0 0 +EDGE2 3313 2292 -1.05248 -0.0238921 0.06501 1 0 1 1 0 0 +EDGE2 3313 2293 -0.0505055 0.0663459 0.0183798 1 0 1 1 0 0 +EDGE2 3313 1254 1.0566 0.0225622 -0.0045866 1 0 1 1 0 0 +EDGE2 3313 2454 1.06956 0.108964 -0.028655 1 0 1 1 0 0 +EDGE2 3313 2494 1.07496 -0.0399902 -0.00881849 1 0 1 1 0 0 +EDGE2 3313 2294 0.925285 0.0355485 0.0119077 1 0 1 1 0 0 +EDGE2 3313 2493 -0.0860179 0.0495612 -0.0166324 1 0 1 1 0 0 +EDGE2 3313 1234 0.961593 -0.0076817 0.0243746 1 0 1 1 0 0 +EDGE2 3313 2453 -0.0205465 0.102422 -0.0281528 1 0 1 1 0 0 +EDGE2 3313 2452 -0.927251 0.00301162 0.00667789 1 0 1 1 0 0 +EDGE2 3313 3312 -1.02765 -0.0423899 -0.00264125 1 0 1 1 0 0 +EDGE2 3313 1233 0.0731195 0.00912528 0.0251503 1 0 1 1 0 0 +EDGE2 3313 1253 -0.0275406 -0.0359728 -0.00470126 1 0 1 1 0 0 +EDGE2 3313 2492 -0.955836 -0.0170725 0.0290645 1 0 1 1 0 0 +EDGE2 3313 1252 -0.981302 -0.050245 0.0232774 1 0 1 1 0 0 +EDGE2 3313 1232 -0.973171 -0.0918681 0.00915728 1 0 1 1 0 0 +EDGE2 3314 2595 0.999282 -0.0500671 -3.16954 1 0 1 1 0 0 +EDGE2 3314 2293 -1.02766 -0.0676823 0.00294346 1 0 1 1 0 0 +EDGE2 3314 1235 1.00502 0.0148031 0.00775668 1 0 1 1 0 0 +EDGE2 3314 2455 1.00215 0.013246 0.00852303 1 0 1 1 0 0 +EDGE2 3314 2535 0.953931 -0.0132084 -3.13005 1 0 1 1 0 0 +EDGE2 3314 2555 0.99734 0.0105538 -3.12296 1 0 1 1 0 0 +EDGE2 3314 2575 0.949575 0.0767387 -3.12866 1 0 1 1 0 0 +EDGE2 3314 2495 1.0081 -0.12489 0.00823621 1 0 1 1 0 0 +EDGE2 3314 2295 1.05031 -0.0467774 0.0129851 1 0 1 1 0 0 +EDGE2 3314 2415 1.01172 -0.0615913 -3.17668 1 0 1 1 0 0 +EDGE2 3314 2435 1.06214 -0.00609999 -3.11989 1 0 1 1 0 0 +EDGE2 3314 1255 1.05342 -0.0452681 -4.75017e-05 1 0 1 1 0 0 +EDGE2 3314 1254 0.0326913 0.0179872 0.000443354 1 0 1 1 0 0 +EDGE2 3314 2454 0.00930025 0.0210019 -0.0371642 1 0 1 1 0 0 +EDGE2 3314 2494 0.0852072 0.0337896 0.0229615 1 0 1 1 0 0 +EDGE2 3314 2294 -0.0773629 0.0210236 0.0137265 1 0 1 1 0 0 +EDGE2 3314 2493 -0.995207 0.0859097 -0.0166019 1 0 1 1 0 0 +EDGE2 3314 3313 -1.00403 -0.0141424 -0.0062012 1 0 1 1 0 0 +EDGE2 3314 1234 0.0124886 -0.0188591 0.031355 1 0 1 1 0 0 +EDGE2 3314 2453 -1.02022 0.0319977 0.0118835 1 0 1 1 0 0 +EDGE2 3314 1233 -0.944303 0.0167361 -0.00591321 1 0 1 1 0 0 +EDGE2 3314 1253 -1.08279 -0.0614024 -0.0393549 1 0 1 1 0 0 +EDGE2 3315 2416 0.0460254 -0.952821 -1.6033 1 0 1 1 0 0 +EDGE2 3315 2595 0.121318 0.0204775 -3.12169 1 0 1 1 0 0 +EDGE2 3315 2456 -0.0266147 0.974289 1.55661 1 0 1 1 0 0 +EDGE2 3315 1236 -0.0384365 0.886283 1.56013 1 0 1 1 0 0 +EDGE2 3315 2554 0.99562 0.037142 -3.16281 1 0 1 1 0 0 +EDGE2 3315 2594 0.976878 0.00913443 -3.15284 1 0 1 1 0 0 +EDGE2 3315 2574 1.03108 0.0215068 -3.1421 1 0 1 1 0 0 +EDGE2 3315 2414 0.993003 -0.00789133 -3.14779 1 0 1 1 0 0 +EDGE2 3315 2434 1.06583 -0.00564665 -3.16013 1 0 1 1 0 0 +EDGE2 3315 2534 1.06078 -0.0319614 -3.13623 1 0 1 1 0 0 +EDGE2 3315 1235 0.0105372 -0.0326227 0.00967511 1 0 1 1 0 0 +EDGE2 3315 2455 -0.0311542 -0.00235473 -0.0193693 1 0 1 1 0 0 +EDGE2 3315 2535 0.0163329 0.038754 -3.15588 1 0 1 1 0 0 +EDGE2 3315 2555 -0.000650436 0.054329 -3.16669 1 0 1 1 0 0 +EDGE2 3315 2575 -0.0401851 -0.0478209 -3.12716 1 0 1 1 0 0 +EDGE2 3315 2495 -0.0368352 0.0833595 -0.0122767 1 0 1 1 0 0 +EDGE2 3315 2295 -0.0605251 -0.0351379 -0.0217439 1 0 1 1 0 0 +EDGE2 3315 2415 0.00835525 0.123293 -3.14746 1 0 1 1 0 0 +EDGE2 3315 2435 -0.0332513 -0.0310671 -3.14662 1 0 1 1 0 0 +EDGE2 3315 1255 0.0989654 0.022817 -0.0159604 1 0 1 1 0 0 +EDGE2 3315 1254 -0.953935 -0.0167728 0.0266229 1 0 1 1 0 0 +EDGE2 3315 2454 -0.939377 0.0799069 -0.00752285 1 0 1 1 0 0 +EDGE2 3315 2494 -0.965201 -0.0289262 -0.0528461 1 0 1 1 0 0 +EDGE2 3315 3314 -1.08376 -0.0114878 0.00488446 1 0 1 1 0 0 +EDGE2 3315 2294 -0.999422 0.0711985 0.00500489 1 0 1 1 0 0 +EDGE2 3315 1234 -0.958674 -0.0782162 0.0112696 1 0 1 1 0 0 +EDGE2 3315 2556 -0.0891614 -0.918898 -1.55807 1 0 1 1 0 0 +EDGE2 3315 2596 0.0620318 -0.988017 -1.59141 1 0 1 1 0 0 +EDGE2 3315 2576 0.0610318 -0.968667 -1.56493 1 0 1 1 0 0 +EDGE2 3315 2496 0.0570755 -1.00836 -1.55852 1 0 1 1 0 0 +EDGE2 3315 2536 0.00910376 -0.996907 -1.59906 1 0 1 1 0 0 +EDGE2 3315 2436 -0.0586788 -0.923769 -1.57283 1 0 1 1 0 0 +EDGE2 3315 1256 -0.017188 -1.04013 -1.56459 1 0 1 1 0 0 +EDGE2 3315 2296 -0.0182661 -0.956662 -1.54508 1 0 1 1 0 0 +EDGE2 3316 2595 -1.06039 0.0485347 1.59232 1 0 1 1 0 0 +EDGE2 3316 2456 0.00546074 -0.0100044 0.00832802 1 0 1 1 0 0 +EDGE2 3316 1237 1.03457 -0.0441682 0.0178601 1 0 1 1 0 0 +EDGE2 3316 2457 0.948908 -0.0576459 -0.0134535 1 0 1 1 0 0 +EDGE2 3316 1236 -0.00780186 -0.0298797 0.0360182 1 0 1 1 0 0 +EDGE2 3316 3315 -0.988557 0.0504248 -1.58657 1 0 1 1 0 0 +EDGE2 3316 1235 -1.02137 0.0800423 -1.54764 1 0 1 1 0 0 +EDGE2 3316 2455 -0.972305 0.00242878 -1.56222 1 0 1 1 0 0 +EDGE2 3316 2535 -1.05056 -0.0214851 1.58352 1 0 1 1 0 0 +EDGE2 3316 2555 -1.09892 -0.0564258 1.56521 1 0 1 1 0 0 +EDGE2 3316 2575 -1.03415 -0.0222048 1.57585 1 0 1 1 0 0 +EDGE2 3316 2495 -0.992191 -0.0501542 -1.58351 1 0 1 1 0 0 +EDGE2 3316 2295 -1.06261 -0.129816 -1.57177 1 0 1 1 0 0 +EDGE2 3316 2415 -0.987074 -0.0445414 1.55572 1 0 1 1 0 0 +EDGE2 3316 2435 -0.925695 0.0649523 1.56994 1 0 1 1 0 0 +EDGE2 3316 1255 -1.03002 -0.0423285 -1.59218 1 0 1 1 0 0 +EDGE2 3317 2458 1.00633 0.0931927 -0.0212971 1 0 1 1 0 0 +EDGE2 3317 1238 0.962416 -0.0164739 -0.0143108 1 0 1 1 0 0 +EDGE2 3317 2456 -1.08562 0.0956475 0.00906911 1 0 1 1 0 0 +EDGE2 3317 1237 -0.00710988 -0.0366054 -0.0162729 1 0 1 1 0 0 +EDGE2 3317 2457 -0.0777526 0.012788 -0.0130122 1 0 1 1 0 0 +EDGE2 3317 3316 -0.961032 -0.133478 0.0128185 1 0 1 1 0 0 +EDGE2 3317 1236 -1.00563 -0.0606579 0.0112324 1 0 1 1 0 0 +EDGE2 3318 1239 1.0171 -0.0220403 0.0435665 1 0 1 1 0 0 +EDGE2 3318 2459 0.956632 0.0120971 -0.00282152 1 0 1 1 0 0 +EDGE2 3318 2458 0.0947221 -0.0132483 -0.00849084 1 0 1 1 0 0 +EDGE2 3318 1238 -0.0252942 -0.00222435 0.0278636 1 0 1 1 0 0 +EDGE2 3318 1237 -0.977106 0.0759503 0.00719493 1 0 1 1 0 0 +EDGE2 3318 2457 -0.987325 0.0131712 0.0132721 1 0 1 1 0 0 +EDGE2 3318 3317 -1.05283 -0.0037357 -0.00776322 1 0 1 1 0 0 +EDGE2 3319 2460 0.972941 0.0613885 0.000338892 1 0 1 1 0 0 +EDGE2 3319 1820 1.10416 -0.0994444 -3.12878 1 0 1 1 0 0 +EDGE2 3319 2240 0.960592 0.0289952 -3.15195 1 0 1 1 0 0 +EDGE2 3319 2280 1.03002 -0.0649053 -3.14613 1 0 1 1 0 0 +EDGE2 3319 1240 0.968866 -0.0234519 -0.037504 1 0 1 1 0 0 +EDGE2 3319 1239 -0.0691544 0.0343132 -0.0171756 1 0 1 1 0 0 +EDGE2 3319 2459 0.0296619 0.0337655 -0.0202828 1 0 1 1 0 0 +EDGE2 3319 2458 -1.049 -0.0129186 -0.0107526 1 0 1 1 0 0 +EDGE2 3319 3318 -0.940215 0.00742549 0.0130985 1 0 1 1 0 0 +EDGE2 3319 1238 -0.949838 -0.00954356 -0.0251562 1 0 1 1 0 0 +EDGE2 3320 2239 1.04991 -0.0314306 -3.15238 1 0 1 1 0 0 +EDGE2 3320 2279 1.05894 0.0486932 -3.16614 1 0 1 1 0 0 +EDGE2 3320 1819 0.999487 -0.0544954 -3.10162 1 0 1 1 0 0 +EDGE2 3320 2460 0.0443542 -0.0336981 0.00271398 1 0 1 1 0 0 +EDGE2 3320 1821 -0.00981966 -0.966363 -1.5435 1 0 1 1 0 0 +EDGE2 3320 2241 0.0672712 -1.03898 -1.57005 1 0 1 1 0 0 +EDGE2 3320 1820 0.0152963 0.0271037 -3.16514 1 0 1 1 0 0 +EDGE2 3320 2240 0.00722524 -0.0100537 -3.15458 1 0 1 1 0 0 +EDGE2 3320 2280 0.0286146 -0.0243479 -3.13729 1 0 1 1 0 0 +EDGE2 3320 1240 0.0446443 -0.07027 0.00873288 1 0 1 1 0 0 +EDGE2 3320 1241 0.0417037 1.06407 1.5959 1 0 1 1 0 0 +EDGE2 3320 2281 -0.00352857 1.00858 1.60809 1 0 1 1 0 0 +EDGE2 3320 2461 -0.0424383 1.01639 1.56232 1 0 1 1 0 0 +EDGE2 3320 1239 -0.973117 0.0429065 0.000662066 1 0 1 1 0 0 +EDGE2 3320 3319 -1.05367 -0.0602865 0.0252102 1 0 1 1 0 0 +EDGE2 3320 2459 -0.927753 -0.0722823 -0.0122606 1 0 1 1 0 0 +EDGE2 3321 2462 0.96254 -0.0463623 -0.00788096 1 0 1 1 0 0 +EDGE2 3321 2460 -1.03935 -0.0214944 -1.56015 1 0 1 1 0 0 +EDGE2 3321 3320 -0.992419 -0.0845402 -1.56172 1 0 1 1 0 0 +EDGE2 3321 1820 -1.00268 -0.0797316 1.56149 1 0 1 1 0 0 +EDGE2 3321 2240 -0.952636 -0.0826866 1.53328 1 0 1 1 0 0 +EDGE2 3321 2280 -0.939945 -0.0201754 1.54894 1 0 1 1 0 0 +EDGE2 3321 1240 -1.05224 0.00352769 -1.57396 1 0 1 1 0 0 +EDGE2 3321 1241 -0.0141597 -0.0303769 -0.00966057 1 0 1 1 0 0 +EDGE2 3321 2281 0.00245146 0.0356292 -0.0344279 1 0 1 1 0 0 +EDGE2 3321 2461 -0.0622805 0.0597103 -0.00987734 1 0 1 1 0 0 +EDGE2 3321 1242 1.00301 0.00557894 -0.0311233 1 0 1 1 0 0 +EDGE2 3321 2282 1.00682 0.0587771 0.000834889 1 0 1 1 0 0 +EDGE2 3322 2462 0.0757182 -0.0325782 0.0138951 1 0 1 1 0 0 +EDGE2 3322 3321 -0.950301 -0.0528633 0.0232553 1 0 1 1 0 0 +EDGE2 3322 1241 -0.991685 -0.0535568 -0.0419102 1 0 1 1 0 0 +EDGE2 3322 2281 -1.00393 0.0142368 0.0212404 1 0 1 1 0 0 +EDGE2 3322 2461 -0.934291 -0.0196201 0.00483988 1 0 1 1 0 0 +EDGE2 3322 1242 -0.0798438 -0.070335 -0.0167709 1 0 1 1 0 0 +EDGE2 3322 2282 0.0134139 0.012807 0.00886222 1 0 1 1 0 0 +EDGE2 3322 2283 0.939309 0.0262616 -0.00415073 1 0 1 1 0 0 +EDGE2 3322 2463 1.05501 -0.0218599 -0.00801052 1 0 1 1 0 0 +EDGE2 3322 1243 0.924832 -0.021559 -0.0112365 1 0 1 1 0 0 +EDGE2 3323 2462 -1.04679 0.088318 0.000316145 1 0 1 1 0 0 +EDGE2 3323 3322 -1.01903 -0.0516774 -0.0113234 1 0 1 1 0 0 +EDGE2 3323 1242 -1.02692 -0.0597623 0.0177208 1 0 1 1 0 0 +EDGE2 3323 2282 -1.01892 -0.0165663 0.00860542 1 0 1 1 0 0 +EDGE2 3323 2283 0.0220592 -0.0524576 -3.58267e-05 1 0 1 1 0 0 +EDGE2 3323 2463 -0.0432079 0.0378471 -0.023117 1 0 1 1 0 0 +EDGE2 3323 1243 -0.0149013 -0.0204494 0.00332905 1 0 1 1 0 0 +EDGE2 3323 1244 0.963784 0.0187308 0.0173745 1 0 1 1 0 0 +EDGE2 3323 2284 0.999356 -0.019808 0.0144706 1 0 1 1 0 0 +EDGE2 3323 2464 1.07764 -0.00119657 -0.00323688 1 0 1 1 0 0 +EDGE2 3324 2283 -1.04544 -0.0322219 -0.00239024 1 0 1 1 0 0 +EDGE2 3324 2463 -0.992501 0.0291548 -0.00625201 1 0 1 1 0 0 +EDGE2 3324 3323 -1.1117 0.0539132 0.00178663 1 0 1 1 0 0 +EDGE2 3324 1243 -0.965448 -0.0106587 0.0138519 1 0 1 1 0 0 +EDGE2 3324 785 1.00725 -0.00260135 -3.14873 1 0 1 1 0 0 +EDGE2 3324 1244 -0.0650317 -0.0673991 -0.000384273 1 0 1 1 0 0 +EDGE2 3324 2284 0.0335866 -0.0489418 -0.000667861 1 0 1 1 0 0 +EDGE2 3324 2464 0.019085 0.0263792 0.00587721 1 0 1 1 0 0 +EDGE2 3324 1245 1.07589 0.0210965 -0.0177229 1 0 1 1 0 0 +EDGE2 3324 2285 1.01479 0.0791584 -0.00829919 1 0 1 1 0 0 +EDGE2 3324 2465 0.999986 -0.000515196 0.0242417 1 0 1 1 0 0 +EDGE2 3324 805 1.07168 0.0616988 -3.17257 1 0 1 1 0 0 +EDGE2 3324 745 1.02167 0.0424794 -3.14999 1 0 1 1 0 0 +EDGE2 3324 765 1.11652 0.0332389 -3.12199 1 0 1 1 0 0 +EDGE2 3325 3324 -0.928702 -0.0426225 0.0384264 1 0 1 1 0 0 +EDGE2 3325 806 0.0778347 -0.967534 -1.59266 1 0 1 1 0 0 +EDGE2 3325 766 0.0207124 -0.987073 -1.59609 1 0 1 1 0 0 +EDGE2 3325 786 -0.0417799 -1.00279 -1.55591 1 0 1 1 0 0 +EDGE2 3325 746 -0.0336057 -0.974465 -1.54004 1 0 1 1 0 0 +EDGE2 3325 785 0.0112827 0.0454252 -3.12064 1 0 1 1 0 0 +EDGE2 3325 1244 -1.11899 0.0353009 -0.00463916 1 0 1 1 0 0 +EDGE2 3325 2284 -0.998981 -0.129317 0.0364608 1 0 1 1 0 0 +EDGE2 3325 2464 -0.997436 0.00863474 -0.0126817 1 0 1 1 0 0 +EDGE2 3325 1245 -0.0132301 0.0630206 -0.003649 1 0 1 1 0 0 +EDGE2 3325 2285 0.00542649 -0.00358937 0.0328992 1 0 1 1 0 0 +EDGE2 3325 2465 -0.0842099 0.0358564 0.0352779 1 0 1 1 0 0 +EDGE2 3325 805 0.00224523 -0.00474787 -3.15446 1 0 1 1 0 0 +EDGE2 3325 784 1.00448 0.0286191 -3.1489 1 0 1 1 0 0 +EDGE2 3325 745 -0.034615 -0.0794056 -3.18396 1 0 1 1 0 0 +EDGE2 3325 765 -0.02449 -0.0123258 -3.13538 1 0 1 1 0 0 +EDGE2 3325 804 1.01296 0.0554236 -3.12434 1 0 1 1 0 0 +EDGE2 3325 744 1.05234 -0.11607 -3.14525 1 0 1 1 0 0 +EDGE2 3325 764 1.0541 0.107754 -3.15994 1 0 1 1 0 0 +EDGE2 3325 2286 -0.0340374 1.02317 1.55776 1 0 1 1 0 0 +EDGE2 3325 2466 0.0626305 1.01869 1.53903 1 0 1 1 0 0 +EDGE2 3325 1246 -0.0152224 0.948014 1.58896 1 0 1 1 0 0 +EDGE2 3326 747 1.04606 0.0476765 -0.00532169 1 0 1 1 0 0 +EDGE2 3326 767 1.0023 -0.045589 0.0452275 1 0 1 1 0 0 +EDGE2 3326 807 1.00206 0.0124888 -0.013025 1 0 1 1 0 0 +EDGE2 3326 787 0.979021 0.0662641 0.0165625 1 0 1 1 0 0 +EDGE2 3326 806 -0.00888033 0.00512602 -0.00792122 1 0 1 1 0 0 +EDGE2 3326 766 0.0116508 -0.0388929 0.00971959 1 0 1 1 0 0 +EDGE2 3326 786 -0.043242 -0.0340783 -0.0389305 1 0 1 1 0 0 +EDGE2 3326 746 -0.0070529 0.0447766 0.0128071 1 0 1 1 0 0 +EDGE2 3326 785 -1.01651 0.0425264 -1.58191 1 0 1 1 0 0 +EDGE2 3326 3325 -1.03173 0.0631567 1.56462 1 0 1 1 0 0 +EDGE2 3326 1245 -1.01394 0.0383021 1.59324 1 0 1 1 0 0 +EDGE2 3326 2285 -1.11546 0.00164591 1.57156 1 0 1 1 0 0 +EDGE2 3326 2465 -0.944034 0.0405892 1.59433 1 0 1 1 0 0 +EDGE2 3326 805 -0.982043 -0.00259942 -1.55199 1 0 1 1 0 0 +EDGE2 3326 745 -1.04098 -0.00377271 -1.56515 1 0 1 1 0 0 +EDGE2 3326 765 -1.06981 -0.0634721 -1.58301 1 0 1 1 0 0 +EDGE2 3327 748 0.989113 -0.0658083 0.0271827 1 0 1 1 0 0 +EDGE2 3327 788 1.04891 -0.0542694 0.010509 1 0 1 1 0 0 +EDGE2 3327 808 0.940853 -0.0177654 -0.0240545 1 0 1 1 0 0 +EDGE2 3327 768 0.994981 -0.000267873 -0.0462945 1 0 1 1 0 0 +EDGE2 3327 747 -0.0399196 -0.000121974 -0.00248601 1 0 1 1 0 0 +EDGE2 3327 767 -0.0207378 -0.0443436 0.00948871 1 0 1 1 0 0 +EDGE2 3327 807 0.00986876 -0.0637764 -0.0275612 1 0 1 1 0 0 +EDGE2 3327 787 0.00242101 0.0289465 0.00675582 1 0 1 1 0 0 +EDGE2 3327 806 -0.985036 -0.086349 0.00624378 1 0 1 1 0 0 +EDGE2 3327 3326 -1.03627 0.00789033 0.0010477 1 0 1 1 0 0 +EDGE2 3327 766 -0.935456 0.00524421 -0.0711142 1 0 1 1 0 0 +EDGE2 3327 786 -0.953358 -0.0308408 -0.00480505 1 0 1 1 0 0 +EDGE2 3327 746 -1.07674 0.0492971 0.0187878 1 0 1 1 0 0 +EDGE2 3328 748 -0.0306005 -0.0391436 -0.0226923 1 0 1 1 0 0 +EDGE2 3328 788 0.00872395 0.0123468 -0.00173957 1 0 1 1 0 0 +EDGE2 3328 769 0.950586 0.0492348 0.0367135 1 0 1 1 0 0 +EDGE2 3328 809 0.930182 0.0592356 -0.00308586 1 0 1 1 0 0 +EDGE2 3328 789 0.942417 0.0400563 0.0155951 1 0 1 1 0 0 +EDGE2 3328 749 1.06643 -0.0202527 0.0156258 1 0 1 1 0 0 +EDGE2 3328 808 0.00832367 0.054693 0.00729255 1 0 1 1 0 0 +EDGE2 3328 768 0.0151303 -0.0614019 0.0118836 1 0 1 1 0 0 +EDGE2 3328 747 -1.0368 -0.0422559 0.0212278 1 0 1 1 0 0 +EDGE2 3328 767 -0.948394 0.000105435 -0.031079 1 0 1 1 0 0 +EDGE2 3328 807 -0.955698 0.0264671 0.00673881 1 0 1 1 0 0 +EDGE2 3328 3327 -0.956353 -0.0800766 0.0128583 1 0 1 1 0 0 +EDGE2 3328 787 -0.976421 0.0233713 -0.0131454 1 0 1 1 0 0 +EDGE2 3329 790 0.993632 0.0287734 -0.0402879 1 0 1 1 0 0 +EDGE2 3329 810 0.966427 0.0574136 0.0119617 1 0 1 1 0 0 +EDGE2 3329 750 1.01551 -0.0233503 0.0151094 1 0 1 1 0 0 +EDGE2 3329 770 1.00778 -0.0796309 -0.0014557 1 0 1 1 0 0 +EDGE2 3329 748 -0.990992 -0.101553 -0.00122063 1 0 1 1 0 0 +EDGE2 3329 788 -1.02095 -0.0269771 -0.038692 1 0 1 1 0 0 +EDGE2 3329 769 -0.00948069 0.00132906 0.0135517 1 0 1 1 0 0 +EDGE2 3329 809 0.111309 -0.00617019 -0.0144485 1 0 1 1 0 0 +EDGE2 3329 789 -0.0392782 0.0581464 -0.0112109 1 0 1 1 0 0 +EDGE2 3329 3328 -0.992226 -0.00307445 0.000796666 1 0 1 1 0 0 +EDGE2 3329 749 -0.0669964 0.0581953 -0.0152839 1 0 1 1 0 0 +EDGE2 3329 808 -1.05072 -0.0334146 0.00338081 1 0 1 1 0 0 +EDGE2 3329 768 -1.0901 -0.0142366 0.00675865 1 0 1 1 0 0 +EDGE2 3330 790 -0.0280944 -0.0694492 0.0187696 1 0 1 1 0 0 +EDGE2 3330 810 0.0859103 0.0242436 -0.0343517 1 0 1 1 0 0 +EDGE2 3330 811 0.0721496 1.05091 1.60789 1 0 1 1 0 0 +EDGE2 3330 750 0.0510436 -0.0224006 -0.0101293 1 0 1 1 0 0 +EDGE2 3330 770 0.022266 -0.00192459 -0.0216566 1 0 1 1 0 0 +EDGE2 3330 751 0.0358097 1.05706 1.57213 1 0 1 1 0 0 +EDGE2 3330 771 0.0329489 0.95727 1.55787 1 0 1 1 0 0 +EDGE2 3330 791 0.00496228 1.09287 1.61188 1 0 1 1 0 0 +EDGE2 3330 769 -1.00614 0.0463384 0.0207074 1 0 1 1 0 0 +EDGE2 3330 809 -1.07899 -0.00977461 -0.016395 1 0 1 1 0 0 +EDGE2 3330 3329 -0.895135 0.06163 -0.00867381 1 0 1 1 0 0 +EDGE2 3330 789 -1.07156 0.000618088 -0.0177791 1 0 1 1 0 0 +EDGE2 3330 749 -0.981818 0.0130474 0.0233961 1 0 1 1 0 0 +EDGE2 3331 790 -0.987877 -0.0486674 -1.54471 1 0 1 1 0 0 +EDGE2 3331 3330 -0.910158 0.00496734 -1.53647 1 0 1 1 0 0 +EDGE2 3331 810 -1.09265 0.0422082 -1.5597 1 0 1 1 0 0 +EDGE2 3331 811 -0.05277 0.0285081 0.0162341 1 0 1 1 0 0 +EDGE2 3331 750 -0.888759 -0.116302 -1.57405 1 0 1 1 0 0 +EDGE2 3331 770 -0.9906 -0.0513468 -1.58305 1 0 1 1 0 0 +EDGE2 3331 751 -0.038105 0.0121942 0.00290387 1 0 1 1 0 0 +EDGE2 3331 771 0.0563511 0.000471904 -0.0107792 1 0 1 1 0 0 +EDGE2 3331 791 -0.0307391 0.0340075 -0.0269885 1 0 1 1 0 0 +EDGE2 3331 772 0.954869 0.0254537 -0.0108245 1 0 1 1 0 0 +EDGE2 3331 792 0.990176 -0.028821 -0.0137442 1 0 1 1 0 0 +EDGE2 3331 812 0.922347 -0.0220906 -0.0250549 1 0 1 1 0 0 +EDGE2 3331 752 1.0733 0.0020042 -0.0043442 1 0 1 1 0 0 +EDGE2 3332 753 0.987845 -0.067223 -0.0379827 1 0 1 1 0 0 +EDGE2 3332 811 -0.995603 0.00892223 0.0062568 1 0 1 1 0 0 +EDGE2 3332 3331 -1.06042 -0.0132299 0.00114594 1 0 1 1 0 0 +EDGE2 3332 751 -0.97124 0.0376777 0.0124064 1 0 1 1 0 0 +EDGE2 3332 771 -0.963856 0.0250105 -0.00309214 1 0 1 1 0 0 +EDGE2 3332 791 -0.968991 -0.00811737 -0.00217982 1 0 1 1 0 0 +EDGE2 3332 772 -0.025213 0.0711555 -0.00348895 1 0 1 1 0 0 +EDGE2 3332 792 0.00772191 -0.0280074 0.00588346 1 0 1 1 0 0 +EDGE2 3332 812 0.0451022 0.0220507 0.017416 1 0 1 1 0 0 +EDGE2 3332 752 0.0156661 -0.0552535 -0.0137213 1 0 1 1 0 0 +EDGE2 3332 793 1.00106 -0.00099074 -0.00240844 1 0 1 1 0 0 +EDGE2 3332 813 1.03289 0.00873408 -0.0204233 1 0 1 1 0 0 +EDGE2 3332 773 0.980176 0.0560921 -0.025625 1 0 1 1 0 0 +EDGE2 3333 753 -0.036531 0.109218 -0.00544307 1 0 1 1 0 0 +EDGE2 3333 3332 -1.04285 -0.018897 0.0381201 1 0 1 1 0 0 +EDGE2 3333 772 -1.03182 -0.0372187 0.0525261 1 0 1 1 0 0 +EDGE2 3333 792 -1.04887 -0.046912 -0.0344434 1 0 1 1 0 0 +EDGE2 3333 812 -0.98178 -0.0826944 -0.00335813 1 0 1 1 0 0 +EDGE2 3333 752 -0.913633 0.0474934 0.00103985 1 0 1 1 0 0 +EDGE2 3333 793 0.0436266 0.0083826 0.0354073 1 0 1 1 0 0 +EDGE2 3333 813 -0.114526 0.0132848 -0.00954806 1 0 1 1 0 0 +EDGE2 3333 773 0.0636097 0.0359898 -0.0129855 1 0 1 1 0 0 +EDGE2 3333 774 0.940632 -0.023627 -0.000450538 1 0 1 1 0 0 +EDGE2 3333 814 1.06255 0.0153428 -0.0135515 1 0 1 1 0 0 +EDGE2 3333 794 1.02835 -0.0098575 -0.0277179 1 0 1 1 0 0 +EDGE2 3333 754 1.0693 -0.0523431 -0.0170512 1 0 1 1 0 0 +EDGE2 3334 753 -0.943444 -0.0722408 -0.0121056 1 0 1 1 0 0 +EDGE2 3334 793 -0.992201 0.0128291 -0.00435708 1 0 1 1 0 0 +EDGE2 3334 813 -0.984442 -0.0784194 -0.00384382 1 0 1 1 0 0 +EDGE2 3334 3333 -0.943439 -0.0271369 -0.0601968 1 0 1 1 0 0 +EDGE2 3334 773 -0.999683 0.00712019 -0.00925691 1 0 1 1 0 0 +EDGE2 3334 774 -0.0663933 -0.0329753 -0.0106969 1 0 1 1 0 0 +EDGE2 3334 814 0.0137727 -0.0658847 0.0261083 1 0 1 1 0 0 +EDGE2 3334 794 -0.0550629 0.0787032 -0.0275363 1 0 1 1 0 0 +EDGE2 3334 754 0.0115235 0.0628009 0.0396417 1 0 1 1 0 0 +EDGE2 3334 795 0.978885 0.0102963 -0.00560648 1 0 1 1 0 0 +EDGE2 3334 875 0.909154 -0.00668023 -3.17292 1 0 1 1 0 0 +EDGE2 3334 815 1.01411 0.0107104 -0.00793784 1 0 1 1 0 0 +EDGE2 3334 755 1.08043 -0.00186261 0.0239289 1 0 1 1 0 0 +EDGE2 3334 775 0.989773 -0.0874935 -0.0172857 1 0 1 1 0 0 +EDGE2 3334 695 0.952738 0.0219468 -3.17033 1 0 1 1 0 0 +EDGE2 3335 876 -0.0168299 -1.01992 -1.58336 1 0 1 1 0 0 +EDGE2 3335 774 -0.987671 -0.0255887 0.0106371 1 0 1 1 0 0 +EDGE2 3335 814 -1.00018 0.122949 0.0235622 1 0 1 1 0 0 +EDGE2 3335 3334 -0.996864 0.00270773 0.00907132 1 0 1 1 0 0 +EDGE2 3335 794 -1.03302 0.0736955 -0.00982254 1 0 1 1 0 0 +EDGE2 3335 754 -1.10019 -0.0196726 0.000915045 1 0 1 1 0 0 +EDGE2 3335 795 0.0123425 0.0133834 0.0184039 1 0 1 1 0 0 +EDGE2 3335 875 0.103674 -0.00275669 -3.1591 1 0 1 1 0 0 +EDGE2 3335 815 0.018219 -0.104563 -0.0147727 1 0 1 1 0 0 +EDGE2 3335 755 0.0371662 -0.0190514 0.00419087 1 0 1 1 0 0 +EDGE2 3335 775 0.106297 0.000795789 0.0197709 1 0 1 1 0 0 +EDGE2 3335 695 0.00135488 0.0111958 -3.14575 1 0 1 1 0 0 +EDGE2 3335 874 1.01966 0.101437 -3.15735 1 0 1 1 0 0 +EDGE2 3335 694 0.990552 -0.00191111 -3.14528 1 0 1 1 0 0 +EDGE2 3335 796 -0.0440198 0.949004 1.5836 1 0 1 1 0 0 +EDGE2 3335 816 -0.0709775 0.930615 1.55149 1 0 1 1 0 0 +EDGE2 3335 696 0.0664216 0.950794 1.56218 1 0 1 1 0 0 +EDGE2 3335 756 -0.0143222 0.956151 1.59753 1 0 1 1 0 0 +EDGE2 3335 776 0.00588411 1.01145 1.58829 1 0 1 1 0 0 +EDGE2 3336 795 -1.07019 -0.131682 -1.54183 1 0 1 1 0 0 +EDGE2 3336 875 -1.0166 0.0104463 1.57622 1 0 1 1 0 0 +EDGE2 3336 3335 -1.02306 0.0568989 -1.56581 1 0 1 1 0 0 +EDGE2 3336 815 -1.0042 -0.0366827 -1.58296 1 0 1 1 0 0 +EDGE2 3336 755 -1.05623 -0.0292194 -1.55749 1 0 1 1 0 0 +EDGE2 3336 775 -1.12087 0.0119665 -1.56308 1 0 1 1 0 0 +EDGE2 3336 695 -0.989413 -0.00611311 1.53497 1 0 1 1 0 0 +EDGE2 3336 796 -0.00508361 -0.0203408 -0.00579576 1 0 1 1 0 0 +EDGE2 3336 816 -0.0297106 0.00646502 0.0288231 1 0 1 1 0 0 +EDGE2 3336 696 -0.042618 0.0297057 -0.0206744 1 0 1 1 0 0 +EDGE2 3336 756 -0.0697439 0.00677789 0.0495642 1 0 1 1 0 0 +EDGE2 3336 776 -0.0102146 -0.069108 -0.012118 1 0 1 1 0 0 +EDGE2 3336 697 1.00905 -0.0637843 0.0023977 1 0 1 1 0 0 +EDGE2 3336 777 0.925409 0.0241757 -0.00518168 1 0 1 1 0 0 +EDGE2 3336 797 1.0997 0.00550169 0.0086601 1 0 1 1 0 0 +EDGE2 3336 817 0.957716 0.0842977 0.00273967 1 0 1 1 0 0 +EDGE2 3336 757 0.969767 -0.0441157 0.00551132 1 0 1 1 0 0 +EDGE2 3337 796 -1.03211 -0.0102906 0.0163908 1 0 1 1 0 0 +EDGE2 3337 3336 -1.06585 0.0642705 -0.00914484 1 0 1 1 0 0 +EDGE2 3337 816 -1.00613 0.0743414 0.0335251 1 0 1 1 0 0 +EDGE2 3337 696 -0.901156 0.000874524 -0.0053281 1 0 1 1 0 0 +EDGE2 3337 756 -0.987749 -0.0108268 -0.00816527 1 0 1 1 0 0 +EDGE2 3337 776 -0.955924 0.0466358 -0.00432802 1 0 1 1 0 0 +EDGE2 3337 778 0.991025 -0.0400657 0.012 1 0 1 1 0 0 +EDGE2 3337 798 0.985925 -0.00720985 0.0193332 1 0 1 1 0 0 +EDGE2 3337 697 -0.0252343 0.00180364 -0.00269331 1 0 1 1 0 0 +EDGE2 3337 777 0.0935667 0.0126151 0.0274155 1 0 1 1 0 0 +EDGE2 3337 797 0.12123 0.0506619 0.00605273 1 0 1 1 0 0 +EDGE2 3337 817 0.147819 0.0201502 0.00431349 1 0 1 1 0 0 +EDGE2 3337 757 -0.0138525 0.00704927 -0.0475621 1 0 1 1 0 0 +EDGE2 3337 818 0.9513 0.035867 0.00861165 1 0 1 1 0 0 +EDGE2 3337 698 1.05549 0.0531642 -0.0479419 1 0 1 1 0 0 +EDGE2 3337 758 1.08508 -0.0498131 -0.0199156 1 0 1 1 0 0 +EDGE2 3338 3337 -0.998674 0.00233721 -0.0197189 1 0 1 1 0 0 +EDGE2 3338 778 -0.0200085 -0.00416056 0.0257184 1 0 1 1 0 0 +EDGE2 3338 798 -0.0393323 -0.0601518 -0.00374112 1 0 1 1 0 0 +EDGE2 3338 697 -0.920958 0.0467864 -0.0146515 1 0 1 1 0 0 +EDGE2 3338 777 -0.966849 0.100529 0.0131738 1 0 1 1 0 0 +EDGE2 3338 797 -0.994763 0.0388931 0.0145804 1 0 1 1 0 0 +EDGE2 3338 817 -1.01875 0.00365196 0.00465483 1 0 1 1 0 0 +EDGE2 3338 757 -0.968781 0.0494602 -0.0444067 1 0 1 1 0 0 +EDGE2 3338 818 0.0233776 0.0108713 0.015959 1 0 1 1 0 0 +EDGE2 3338 699 1.05007 0.0181123 -0.0159056 1 0 1 1 0 0 +EDGE2 3338 698 0.0429757 -0.0938536 0.0254852 1 0 1 1 0 0 +EDGE2 3338 758 -0.0115976 -0.00755166 -0.000750083 1 0 1 1 0 0 +EDGE2 3338 779 0.924176 0.030666 0.0371044 1 0 1 1 0 0 +EDGE2 3338 799 1.03123 -0.0745627 0.0130984 1 0 1 1 0 0 +EDGE2 3338 819 1.01974 0.00472621 -0.01406 1 0 1 1 0 0 +EDGE2 3338 759 0.907851 -0.0310498 0.0326088 1 0 1 1 0 0 +EDGE2 3339 800 0.98278 -0.0693133 -0.0108119 1 0 1 1 0 0 +EDGE2 3339 778 -1.03872 -0.0509944 -0.00300103 1 0 1 1 0 0 +EDGE2 3339 798 -0.908745 0.0626163 -0.0247019 1 0 1 1 0 0 +EDGE2 3339 3338 -0.983002 0.0364827 -0.0146113 1 0 1 1 0 0 +EDGE2 3339 818 -0.95577 -0.0730231 0.00514346 1 0 1 1 0 0 +EDGE2 3339 699 -0.0691968 0.0703333 -0.0144631 1 0 1 1 0 0 +EDGE2 3339 698 -1.02014 -0.0757981 0.00393472 1 0 1 1 0 0 +EDGE2 3339 758 -1.00099 -0.0800791 -0.0141715 1 0 1 1 0 0 +EDGE2 3339 779 0.0805417 0.0448286 0.0131614 1 0 1 1 0 0 +EDGE2 3339 799 -0.0860676 0.00245996 0.00409027 1 0 1 1 0 0 +EDGE2 3339 819 -0.0045142 -0.0254835 0.000311993 1 0 1 1 0 0 +EDGE2 3339 759 -0.0627557 -0.0487355 0.0031603 1 0 1 1 0 0 +EDGE2 3339 3200 1.00839 0.115568 -3.14978 1 0 1 1 0 0 +EDGE2 3339 3220 0.973735 -0.0614589 -3.15507 1 0 1 1 0 0 +EDGE2 3339 820 1.00074 -0.0562707 -0.023086 1 0 1 1 0 0 +EDGE2 3339 740 1.0416 0.0521594 -3.13158 1 0 1 1 0 0 +EDGE2 3339 760 0.928541 0.00902031 -0.0177512 1 0 1 1 0 0 +EDGE2 3339 780 0.989172 0.0672963 0.00113199 1 0 1 1 0 0 +EDGE2 3339 700 0.994908 0.0495093 0.000244695 1 0 1 1 0 0 +EDGE2 3340 801 -0.0342889 0.997439 1.58507 1 0 1 1 0 0 +EDGE2 3340 761 -0.0135826 1.08198 1.61384 1 0 1 1 0 0 +EDGE2 3340 781 -0.0269235 0.937261 1.52567 1 0 1 1 0 0 +EDGE2 3340 741 -0.0848134 1.01394 1.5755 1 0 1 1 0 0 +EDGE2 3340 800 0.0267464 0.00734836 0.0175876 1 0 1 1 0 0 +EDGE2 3340 699 -1.08335 -0.0580738 -0.0122614 1 0 1 1 0 0 +EDGE2 3340 3339 -0.98895 -0.0475629 0.00313988 1 0 1 1 0 0 +EDGE2 3340 779 -1.03691 -0.0300762 -0.0021079 1 0 1 1 0 0 +EDGE2 3340 799 -1.01132 0.106055 -0.0107188 1 0 1 1 0 0 +EDGE2 3340 819 -0.970152 0.0650958 -0.00406257 1 0 1 1 0 0 +EDGE2 3340 759 -0.962833 0.0189923 -0.00632375 1 0 1 1 0 0 +EDGE2 3340 3200 0.124544 0.0302566 -3.12249 1 0 1 1 0 0 +EDGE2 3340 3220 -0.0621637 -0.0507523 -3.11598 1 0 1 1 0 0 +EDGE2 3340 820 -0.0488998 -0.0502274 0.0116128 1 0 1 1 0 0 +EDGE2 3340 701 -0.159287 -0.994259 -1.56559 1 0 1 1 0 0 +EDGE2 3340 740 -0.0421548 -0.0304874 -3.14819 1 0 1 1 0 0 +EDGE2 3340 760 0.031874 0.0450759 0.0219114 1 0 1 1 0 0 +EDGE2 3340 780 -0.037334 -0.0301552 -0.0112329 1 0 1 1 0 0 +EDGE2 3340 700 -0.0589309 -0.0622638 0.0248036 1 0 1 1 0 0 +EDGE2 3340 3201 -0.047765 -1.0699 -1.57065 1 0 1 1 0 0 +EDGE2 3340 3221 0.0110738 -1.00008 -1.55585 1 0 1 1 0 0 +EDGE2 3340 821 -0.0951058 -1.00561 -1.54085 1 0 1 1 0 0 +EDGE2 3340 3199 1.05711 -0.080978 -3.14558 1 0 1 1 0 0 +EDGE2 3340 3219 0.94125 0.0117983 -3.14288 1 0 1 1 0 0 +EDGE2 3340 739 1.0514 0.0783987 -3.15768 1 0 1 1 0 0 +EDGE2 3341 802 1.06814 0.031784 0.00542005 1 0 1 1 0 0 +EDGE2 3341 801 0.00551727 0.0830041 -0.00564206 1 0 1 1 0 0 +EDGE2 3341 742 1.0068 -0.0136032 0.0195973 1 0 1 1 0 0 +EDGE2 3341 762 0.992032 -0.128326 -0.000887883 1 0 1 1 0 0 +EDGE2 3341 782 0.918995 -0.0477762 0.0300882 1 0 1 1 0 0 +EDGE2 3341 761 -0.0227654 0.0471954 -0.0189349 1 0 1 1 0 0 +EDGE2 3341 781 -0.0686333 -0.00448529 -0.0191168 1 0 1 1 0 0 +EDGE2 3341 741 -0.0359945 -0.0250564 0.00527527 1 0 1 1 0 0 +EDGE2 3341 800 -0.960236 -0.10276 -1.55459 1 0 1 1 0 0 +EDGE2 3341 3340 -0.844107 -0.0358359 -1.60322 1 0 1 1 0 0 +EDGE2 3341 3200 -0.999253 0.0273276 1.53689 1 0 1 1 0 0 +EDGE2 3341 3220 -0.986017 0.0125496 1.57165 1 0 1 1 0 0 +EDGE2 3341 820 -1.04104 -0.0419619 -1.56011 1 0 1 1 0 0 +EDGE2 3341 740 -0.984445 0.0346438 1.6072 1 0 1 1 0 0 +EDGE2 3341 760 -0.959512 -0.0388703 -1.57805 1 0 1 1 0 0 +EDGE2 3341 780 -1.02337 0.0793795 -1.54336 1 0 1 1 0 0 +EDGE2 3341 700 -0.915097 0.0277915 -1.6058 1 0 1 1 0 0 +EDGE2 3342 783 1.03164 -0.0259286 0.0244081 1 0 1 1 0 0 +EDGE2 3342 803 0.993844 -0.0450795 -0.0222621 1 0 1 1 0 0 +EDGE2 3342 802 -0.00257755 -0.00128051 -0.00347512 1 0 1 1 0 0 +EDGE2 3342 743 1.02687 -0.124184 0.010971 1 0 1 1 0 0 +EDGE2 3342 763 1.02739 -0.0607336 -0.0225993 1 0 1 1 0 0 +EDGE2 3342 801 -1.00785 -0.0329682 0.00344826 1 0 1 1 0 0 +EDGE2 3342 742 0.030501 0.0716807 0.0233269 1 0 1 1 0 0 +EDGE2 3342 762 -0.0130623 -0.00118558 0.0167133 1 0 1 1 0 0 +EDGE2 3342 782 -0.0121682 -0.0815798 -0.0137772 1 0 1 1 0 0 +EDGE2 3342 3341 -1.04874 0.0807566 0.0156231 1 0 1 1 0 0 +EDGE2 3342 761 -1.05519 0.00137295 -0.013937 1 0 1 1 0 0 +EDGE2 3342 781 -1.04344 -0.002622 0.0110164 1 0 1 1 0 0 +EDGE2 3342 741 -1.01224 0.0266291 0.00636758 1 0 1 1 0 0 +EDGE2 3343 783 -0.0423149 -0.0779494 0.00788712 1 0 1 1 0 0 +EDGE2 3343 784 1.0454 -0.0276348 0.00835488 1 0 1 1 0 0 +EDGE2 3343 804 0.930244 0.0164028 -0.0107647 1 0 1 1 0 0 +EDGE2 3343 744 1.09191 -0.106491 0.00688439 1 0 1 1 0 0 +EDGE2 3343 764 0.976575 0.00277239 -0.00864591 1 0 1 1 0 0 +EDGE2 3343 803 -0.00827768 -0.0913957 0.0219153 1 0 1 1 0 0 +EDGE2 3343 802 -1.00549 0.0237327 0.00174893 1 0 1 1 0 0 +EDGE2 3343 3342 -0.968168 -0.0180291 0.0361338 1 0 1 1 0 0 +EDGE2 3343 743 -0.0385068 -0.0111303 0.0170802 1 0 1 1 0 0 +EDGE2 3343 763 -0.000947974 -0.106126 -0.0152177 1 0 1 1 0 0 +EDGE2 3343 742 -0.958273 0.0165597 -0.0335169 1 0 1 1 0 0 +EDGE2 3343 762 -0.974768 -0.0412533 -0.0377835 1 0 1 1 0 0 +EDGE2 3343 782 -1.03715 -0.00998336 0.0131594 1 0 1 1 0 0 +EDGE2 3344 783 -0.935463 0.0162057 0.00972171 1 0 1 1 0 0 +EDGE2 3344 785 1.00849 0.000921734 0.00278285 1 0 1 1 0 0 +EDGE2 3344 3325 0.951686 0.0191645 -3.15305 1 0 1 1 0 0 +EDGE2 3344 1245 0.964558 0.00165057 -3.15401 1 0 1 1 0 0 +EDGE2 3344 2285 0.893387 -0.0136811 -3.16613 1 0 1 1 0 0 +EDGE2 3344 2465 0.920469 -0.0532226 -3.14244 1 0 1 1 0 0 +EDGE2 3344 805 0.919208 -0.0200286 0.00316454 1 0 1 1 0 0 +EDGE2 3344 784 -0.0963715 0.0067512 0.0159421 1 0 1 1 0 0 +EDGE2 3344 745 0.9474 -0.0621493 -0.0223761 1 0 1 1 0 0 +EDGE2 3344 765 1.03493 0.00645458 -0.00150688 1 0 1 1 0 0 +EDGE2 3344 804 -0.0332953 -0.0843159 0.0052993 1 0 1 1 0 0 +EDGE2 3344 3343 -0.954867 0.0910106 0.0131692 1 0 1 1 0 0 +EDGE2 3344 744 0.00666115 0.00893391 0.00933684 1 0 1 1 0 0 +EDGE2 3344 764 -0.0471681 0.0487117 -0.0155088 1 0 1 1 0 0 +EDGE2 3344 803 -0.951432 0.0643724 -0.00010889 1 0 1 1 0 0 +EDGE2 3344 743 -1.04703 -0.0326826 -0.0361074 1 0 1 1 0 0 +EDGE2 3344 763 -1.04661 -0.0307149 0.0357033 1 0 1 1 0 0 +EDGE2 3345 3324 1.00779 0.047143 -3.13665 1 0 1 1 0 0 +EDGE2 3345 806 -0.0169779 1.02706 1.56118 1 0 1 1 0 0 +EDGE2 3345 3326 0.0210604 1.02134 1.56955 1 0 1 1 0 0 +EDGE2 3345 766 -0.0502556 0.959985 1.54362 1 0 1 1 0 0 +EDGE2 3345 786 0.00543093 1.03048 1.54173 1 0 1 1 0 0 +EDGE2 3345 746 -0.0289081 0.948159 1.57817 1 0 1 1 0 0 +EDGE2 3345 785 -0.0798347 0.0125066 0.0344836 1 0 1 1 0 0 +EDGE2 3345 3325 -0.0310355 -0.143343 -3.13104 1 0 1 1 0 0 +EDGE2 3345 1244 0.941955 -0.038338 -3.11661 1 0 1 1 0 0 +EDGE2 3345 2284 0.968324 -0.0123118 -3.15802 1 0 1 1 0 0 +EDGE2 3345 2464 1.02269 0.0614874 -3.14828 1 0 1 1 0 0 +EDGE2 3345 1245 -0.0536595 0.126491 -3.13973 1 0 1 1 0 0 +EDGE2 3345 2285 0.0143064 -0.0720198 -3.18053 1 0 1 1 0 0 +EDGE2 3345 2465 0.0292168 0.00908188 -3.15494 1 0 1 1 0 0 +EDGE2 3345 805 -0.0355393 0.0468191 -0.0208073 1 0 1 1 0 0 +EDGE2 3345 784 -1.11463 -0.0228948 -0.0185512 1 0 1 1 0 0 +EDGE2 3345 3344 -1.04056 0.0163191 0.0371676 1 0 1 1 0 0 +EDGE2 3345 745 0.0658925 0.0128068 -0.0101835 1 0 1 1 0 0 +EDGE2 3345 765 0.00509476 -0.0295539 -0.000538336 1 0 1 1 0 0 +EDGE2 3345 804 -1.03803 -0.008869 -0.00859731 1 0 1 1 0 0 +EDGE2 3345 744 -1.07548 -0.013626 0.0206295 1 0 1 1 0 0 +EDGE2 3345 764 -0.988179 0.0790712 0.018683 1 0 1 1 0 0 +EDGE2 3345 2286 0.0184134 -0.928115 -1.53791 1 0 1 1 0 0 +EDGE2 3345 2466 0.078242 -0.886955 -1.58157 1 0 1 1 0 0 +EDGE2 3345 1246 0.0143645 -0.968034 -1.55172 1 0 1 1 0 0 +EDGE2 3346 747 1.10773 -0.0134206 -0.0116533 1 0 1 1 0 0 +EDGE2 3346 767 0.98789 0.0102763 -0.0132361 1 0 1 1 0 0 +EDGE2 3346 807 0.989893 -0.0533932 -0.000203003 1 0 1 1 0 0 +EDGE2 3346 3327 0.944411 -0.0395561 -0.0221258 1 0 1 1 0 0 +EDGE2 3346 787 0.970754 0.00178745 -0.0309263 1 0 1 1 0 0 +EDGE2 3346 806 -0.026899 0.0545275 0.0238251 1 0 1 1 0 0 +EDGE2 3346 3326 0.00954311 -0.00156806 -0.0323552 1 0 1 1 0 0 +EDGE2 3346 766 -0.0533069 -0.074171 -0.0312294 1 0 1 1 0 0 +EDGE2 3346 786 0.030008 -0.032332 -0.045666 1 0 1 1 0 0 +EDGE2 3346 746 -0.0202476 0.00416253 0.0309511 1 0 1 1 0 0 +EDGE2 3346 785 -1.0478 -0.019708 -1.62307 1 0 1 1 0 0 +EDGE2 3346 3325 -1.00289 -0.0476629 1.60398 1 0 1 1 0 0 +EDGE2 3346 3345 -0.952044 -0.0443239 -1.58247 1 0 1 1 0 0 +EDGE2 3346 1245 -0.985282 0.00420843 1.56089 1 0 1 1 0 0 +EDGE2 3346 2285 -0.955219 0.0217303 1.57067 1 0 1 1 0 0 +EDGE2 3346 2465 -1.0221 -0.0440792 1.58444 1 0 1 1 0 0 +EDGE2 3346 805 -0.94879 0.0212162 -1.59181 1 0 1 1 0 0 +EDGE2 3346 745 -0.952242 0.0215728 -1.56427 1 0 1 1 0 0 +EDGE2 3346 765 -1.00529 0.0381982 -1.54479 1 0 1 1 0 0 +EDGE2 3347 748 0.980372 -0.0105575 0.0116905 1 0 1 1 0 0 +EDGE2 3347 788 1.03058 0.0635105 -0.0230371 1 0 1 1 0 0 +EDGE2 3347 3328 0.998348 0.0127663 -0.014054 1 0 1 1 0 0 +EDGE2 3347 808 0.924635 -0.0800433 -0.0110677 1 0 1 1 0 0 +EDGE2 3347 768 0.97866 0.107134 -0.00584656 1 0 1 1 0 0 +EDGE2 3347 747 0.00536612 -0.0471848 0.0162164 1 0 1 1 0 0 +EDGE2 3347 767 -0.000831978 -0.00829306 -0.00188106 1 0 1 1 0 0 +EDGE2 3347 807 -0.0216549 -0.0276648 -0.00154852 1 0 1 1 0 0 +EDGE2 3347 3327 0.0508552 -0.0598068 -0.0253555 1 0 1 1 0 0 +EDGE2 3347 787 0.124219 -0.0279397 -0.0401837 1 0 1 1 0 0 +EDGE2 3347 806 -0.930365 0.00692396 -0.0167039 1 0 1 1 0 0 +EDGE2 3347 3346 -0.985808 -0.0338989 -0.00611456 1 0 1 1 0 0 +EDGE2 3347 3326 -1.12143 0.0592523 0.00165667 1 0 1 1 0 0 +EDGE2 3347 766 -1.01132 -0.0758795 0.0289045 1 0 1 1 0 0 +EDGE2 3347 786 -1.03044 0.0260252 -0.0135139 1 0 1 1 0 0 +EDGE2 3347 746 -0.966643 -0.0012933 0.0410819 1 0 1 1 0 0 +EDGE2 3348 748 -0.0338746 0.00187689 -0.0221133 1 0 1 1 0 0 +EDGE2 3348 788 0.0313993 0.010719 0.0175947 1 0 1 1 0 0 +EDGE2 3348 769 1.00301 -0.0443933 0.011251 1 0 1 1 0 0 +EDGE2 3348 809 0.953883 -0.0870727 -0.0295279 1 0 1 1 0 0 +EDGE2 3348 3329 0.932314 0.0805513 -0.00269597 1 0 1 1 0 0 +EDGE2 3348 789 1.11119 -0.0088153 0.0126942 1 0 1 1 0 0 +EDGE2 3348 3328 0.0601028 0.0325122 -0.011277 1 0 1 1 0 0 +EDGE2 3348 749 0.939903 -0.0169925 0.0209795 1 0 1 1 0 0 +EDGE2 3348 808 -0.0533837 -0.0307103 0.0310222 1 0 1 1 0 0 +EDGE2 3348 768 -0.0116972 -0.0601913 -0.000609049 1 0 1 1 0 0 +EDGE2 3348 747 -0.9293 0.00247096 -0.0109831 1 0 1 1 0 0 +EDGE2 3348 767 -1.07991 0.0703059 -0.00570032 1 0 1 1 0 0 +EDGE2 3348 807 -0.930415 0.0578001 -0.0151117 1 0 1 1 0 0 +EDGE2 3348 3327 -1.0075 0.0236397 0.00278242 1 0 1 1 0 0 +EDGE2 3348 3347 -0.948602 -0.077547 -0.0114541 1 0 1 1 0 0 +EDGE2 3348 787 -1.0128 -0.053693 0.02207 1 0 1 1 0 0 +EDGE2 3349 790 0.929356 0.0182412 0.0221176 1 0 1 1 0 0 +EDGE2 3349 3330 1.00058 0.0149744 -0.0280273 1 0 1 1 0 0 +EDGE2 3349 810 0.960791 0.00238313 -0.0189918 1 0 1 1 0 0 +EDGE2 3349 750 0.968722 0.00331663 0.0183623 1 0 1 1 0 0 +EDGE2 3349 770 0.997413 -0.0199432 0.0162883 1 0 1 1 0 0 +EDGE2 3349 748 -0.964931 0.0620114 0.0141488 1 0 1 1 0 0 +EDGE2 3349 788 -1.03117 -0.00832319 0.0201857 1 0 1 1 0 0 +EDGE2 3349 769 -0.000229205 0.0551426 -0.0103876 1 0 1 1 0 0 +EDGE2 3349 809 -0.0925977 -0.0852179 -0.0107415 1 0 1 1 0 0 +EDGE2 3349 3329 -0.101538 0.0296421 -0.00626691 1 0 1 1 0 0 +EDGE2 3349 789 -0.0331712 -0.130868 0.00778201 1 0 1 1 0 0 +EDGE2 3349 3328 -1.01292 0.0444498 -0.0160086 1 0 1 1 0 0 +EDGE2 3349 3348 -1.08768 -0.0203913 -0.00194317 1 0 1 1 0 0 +EDGE2 3349 749 0.0441068 0.0374123 -0.0316248 1 0 1 1 0 0 +EDGE2 3349 808 -0.968788 -0.0893818 -0.00926758 1 0 1 1 0 0 +EDGE2 3349 768 -0.981722 0.122149 0.00829838 1 0 1 1 0 0 +EDGE2 3350 790 0.0478524 -0.0380134 -0.00174768 1 0 1 1 0 0 +EDGE2 3350 3330 0.0416527 -0.0607938 0.00702534 1 0 1 1 0 0 +EDGE2 3350 810 0.0338901 0.006669 0.0121303 1 0 1 1 0 0 +EDGE2 3350 811 0.0522008 1.0445 1.56343 1 0 1 1 0 0 +EDGE2 3350 750 0.0679467 -0.0343173 0.013529 1 0 1 1 0 0 +EDGE2 3350 770 0.0282163 -0.0118324 0.0353431 1 0 1 1 0 0 +EDGE2 3350 3331 -0.0425673 1.025 1.55594 1 0 1 1 0 0 +EDGE2 3350 751 0.126064 0.989326 1.56842 1 0 1 1 0 0 +EDGE2 3350 771 0.0401526 1.00214 1.62099 1 0 1 1 0 0 +EDGE2 3350 791 -0.0333365 0.987885 1.57734 1 0 1 1 0 0 +EDGE2 3350 769 -1.03247 0.119228 0.0161014 1 0 1 1 0 0 +EDGE2 3350 809 -1.02204 -0.0416845 0.016449 1 0 1 1 0 0 +EDGE2 3350 3329 -1.00112 0.0014262 -0.0240113 1 0 1 1 0 0 +EDGE2 3350 3349 -0.95063 0.0531159 0.00276555 1 0 1 1 0 0 +EDGE2 3350 789 -0.972462 0.121612 -0.0140127 1 0 1 1 0 0 +EDGE2 3350 749 -1.00521 -0.0929047 -0.00660835 1 0 1 1 0 0 +EDGE2 3351 790 -0.988295 0.0117866 -1.58151 1 0 1 1 0 0 +EDGE2 3351 3330 -1.01146 -0.062794 -1.5804 1 0 1 1 0 0 +EDGE2 3351 3350 -1.02611 0.0347676 -1.55147 1 0 1 1 0 0 +EDGE2 3351 810 -1.04132 -0.0223492 -1.56166 1 0 1 1 0 0 +EDGE2 3351 3332 0.999009 -0.034068 0.0377951 1 0 1 1 0 0 +EDGE2 3351 811 -0.0473822 -0.0121016 -0.000141234 1 0 1 1 0 0 +EDGE2 3351 750 -0.989125 -0.0448988 -1.53857 1 0 1 1 0 0 +EDGE2 3351 770 -1.02405 -0.0237873 -1.59343 1 0 1 1 0 0 +EDGE2 3351 3331 -0.0600547 -0.039864 0.0218077 1 0 1 1 0 0 +EDGE2 3351 751 -0.0503795 0.0337129 -0.0265262 1 0 1 1 0 0 +EDGE2 3351 771 -0.0389891 0.0777815 -0.00797846 1 0 1 1 0 0 +EDGE2 3351 791 0.056228 0.00931892 -0.0207972 1 0 1 1 0 0 +EDGE2 3351 772 1.0586 -0.0345262 0.00529607 1 0 1 1 0 0 +EDGE2 3351 792 1.07668 -0.0210693 -0.0225438 1 0 1 1 0 0 +EDGE2 3351 812 1.02624 -0.0630383 0.0111189 1 0 1 1 0 0 +EDGE2 3351 752 1.01803 0.0936534 -0.0215644 1 0 1 1 0 0 +EDGE2 3352 753 1.04299 -0.07927 -0.0160487 1 0 1 1 0 0 +EDGE2 3352 3332 0.0967 0.113544 -0.0108787 1 0 1 1 0 0 +EDGE2 3352 811 -1.0795 0.0761263 0.0493478 1 0 1 1 0 0 +EDGE2 3352 3351 -0.876645 -0.0172268 0.00374171 1 0 1 1 0 0 +EDGE2 3352 3331 -1.04038 -0.0630856 0.0261069 1 0 1 1 0 0 +EDGE2 3352 751 -1.04296 -0.078593 -0.0161488 1 0 1 1 0 0 +EDGE2 3352 771 -0.995603 0.0441661 0.00408844 1 0 1 1 0 0 +EDGE2 3352 791 -1.01448 0.0246599 0.0347198 1 0 1 1 0 0 +EDGE2 3352 772 -0.0652913 0.0075228 -0.0211609 1 0 1 1 0 0 +EDGE2 3352 792 -0.00325004 0.0691918 0.00913347 1 0 1 1 0 0 +EDGE2 3352 812 -0.121012 -0.021139 0.0254377 1 0 1 1 0 0 +EDGE2 3352 752 0.0584657 0.00374283 -0.0307406 1 0 1 1 0 0 +EDGE2 3352 793 0.964473 -0.0328548 -0.0215598 1 0 1 1 0 0 +EDGE2 3352 813 1.05268 0.00953081 0.0260881 1 0 1 1 0 0 +EDGE2 3352 3333 0.950097 -0.0614144 -0.0195332 1 0 1 1 0 0 +EDGE2 3352 773 1.09717 0.0202036 0.00862308 1 0 1 1 0 0 +EDGE2 3353 753 -0.0117015 -0.110043 -0.0254916 1 0 1 1 0 0 +EDGE2 3353 3332 -1.00642 -0.0260228 0.00682888 1 0 1 1 0 0 +EDGE2 3353 3352 -1.11171 -0.00921988 0.00641632 1 0 1 1 0 0 +EDGE2 3353 772 -0.913618 -0.0121636 -0.014307 1 0 1 1 0 0 +EDGE2 3353 792 -0.903329 -0.0506184 0.00942924 1 0 1 1 0 0 +EDGE2 3353 812 -0.993302 0.0615587 0.00759344 1 0 1 1 0 0 +EDGE2 3353 752 -0.985369 0.0251311 0.00297599 1 0 1 1 0 0 +EDGE2 3353 793 -0.0906693 -0.0171407 0.0507923 1 0 1 1 0 0 +EDGE2 3353 813 -0.0539349 0.0794497 0.0404733 1 0 1 1 0 0 +EDGE2 3353 3333 -0.0510347 0.0422168 -0.00504682 1 0 1 1 0 0 +EDGE2 3353 773 0.0644981 0.0324461 0.0184705 1 0 1 1 0 0 +EDGE2 3353 774 0.991463 -0.0356919 0.0138024 1 0 1 1 0 0 +EDGE2 3353 814 1.04766 0.029082 0.0184708 1 0 1 1 0 0 +EDGE2 3353 3334 0.997432 0.0522936 0.0110508 1 0 1 1 0 0 +EDGE2 3353 794 1.02635 0.0289047 -0.0452396 1 0 1 1 0 0 +EDGE2 3353 754 1.04428 0.0369816 -0.0350584 1 0 1 1 0 0 +EDGE2 3354 753 -1.06515 0.0136972 0.00209922 1 0 1 1 0 0 +EDGE2 3354 3353 -0.955373 0.0350459 0.00572868 1 0 1 1 0 0 +EDGE2 3354 793 -1.04403 0.00981964 0.0285978 1 0 1 1 0 0 +EDGE2 3354 813 -0.957815 0.010759 -0.0218287 1 0 1 1 0 0 +EDGE2 3354 3333 -1.01588 0.0118337 -0.0207908 1 0 1 1 0 0 +EDGE2 3354 773 -0.971571 -0.00578791 0.00586817 1 0 1 1 0 0 +EDGE2 3354 774 -0.037772 -0.0638147 0.0219745 1 0 1 1 0 0 +EDGE2 3354 814 0.078114 0.0501762 0.0194866 1 0 1 1 0 0 +EDGE2 3354 3334 -0.0670342 -0.0396481 0.0569492 1 0 1 1 0 0 +EDGE2 3354 794 0.0185861 0.00119884 -0.000266937 1 0 1 1 0 0 +EDGE2 3354 754 0.0977847 -0.0260605 0.0188619 1 0 1 1 0 0 +EDGE2 3354 795 1.0534 -0.0220975 -0.0201043 1 0 1 1 0 0 +EDGE2 3354 875 1.0399 0.0021398 -3.14487 1 0 1 1 0 0 +EDGE2 3354 3335 0.957168 -0.0968376 -0.00275952 1 0 1 1 0 0 +EDGE2 3354 815 1.02139 0.073446 0.00307498 1 0 1 1 0 0 +EDGE2 3354 755 0.986857 -0.0736172 -0.01142 1 0 1 1 0 0 +EDGE2 3354 775 1.02187 0.0253498 0.0127267 1 0 1 1 0 0 +EDGE2 3354 695 1.00629 -0.0320749 -3.12128 1 0 1 1 0 0 +EDGE2 3355 876 0.0447024 -0.944507 -1.57551 1 0 1 1 0 0 +EDGE2 3355 774 -1.00575 0.00863826 -0.0225095 1 0 1 1 0 0 +EDGE2 3355 814 -0.944394 -0.0621883 0.00304894 1 0 1 1 0 0 +EDGE2 3355 3334 -1.06461 -0.0723378 -0.00595102 1 0 1 1 0 0 +EDGE2 3355 3354 -0.987853 -0.0342699 -0.00759775 1 0 1 1 0 0 +EDGE2 3355 794 -1.04056 -0.0616419 -0.00282009 1 0 1 1 0 0 +EDGE2 3355 754 -1.07472 -0.0460152 0.0195959 1 0 1 1 0 0 +EDGE2 3355 795 -0.0781542 -0.0274631 -0.00367853 1 0 1 1 0 0 +EDGE2 3355 875 0.0873782 -0.0269811 -3.15936 1 0 1 1 0 0 +EDGE2 3355 3335 0.0437353 -0.0856271 -0.00171673 1 0 1 1 0 0 +EDGE2 3355 815 0.00138117 -0.0611032 -0.035715 1 0 1 1 0 0 +EDGE2 3355 755 -0.0282326 -0.0376241 -0.0347504 1 0 1 1 0 0 +EDGE2 3355 775 0.0240123 -0.0632771 -0.00567128 1 0 1 1 0 0 +EDGE2 3355 695 -0.0202378 0.0453339 -3.15516 1 0 1 1 0 0 +EDGE2 3355 874 0.940241 -0.0342052 -3.12758 1 0 1 1 0 0 +EDGE2 3355 694 1.04382 0.00478771 -3.13143 1 0 1 1 0 0 +EDGE2 3355 796 -0.021333 0.980314 1.59556 1 0 1 1 0 0 +EDGE2 3355 3336 -0.00970388 0.970626 1.59978 1 0 1 1 0 0 +EDGE2 3355 816 0.041777 1.03854 1.58017 1 0 1 1 0 0 +EDGE2 3355 696 -0.00232931 0.99387 1.57698 1 0 1 1 0 0 +EDGE2 3355 756 0.0104339 0.92198 1.57261 1 0 1 1 0 0 +EDGE2 3355 776 -0.00541632 0.921442 1.57893 1 0 1 1 0 0 +EDGE2 3356 795 -0.910267 -0.0726431 -1.5685 1 0 1 1 0 0 +EDGE2 3356 875 -0.915342 -0.0793117 1.57879 1 0 1 1 0 0 +EDGE2 3356 3335 -1.0238 -0.0148917 -1.59563 1 0 1 1 0 0 +EDGE2 3356 3355 -1.01103 0.0291926 -1.57861 1 0 1 1 0 0 +EDGE2 3356 815 -0.967818 -0.0146624 -1.542 1 0 1 1 0 0 +EDGE2 3356 755 -1.01888 -0.0292668 -1.57424 1 0 1 1 0 0 +EDGE2 3356 775 -1.03101 0.0687408 -1.57759 1 0 1 1 0 0 +EDGE2 3356 695 -1.02071 0.0141403 1.57861 1 0 1 1 0 0 +EDGE2 3356 3337 1.01239 0.0800062 0.000818484 1 0 1 1 0 0 +EDGE2 3356 796 0.0102588 -0.040092 -0.00188144 1 0 1 1 0 0 +EDGE2 3356 3336 0.0366208 -0.00553163 -0.012211 1 0 1 1 0 0 +EDGE2 3356 816 0.0161009 -0.0496026 0.0381077 1 0 1 1 0 0 +EDGE2 3356 696 -0.0594144 0.0257507 -0.0309095 1 0 1 1 0 0 +EDGE2 3356 756 0.0437869 -0.0239561 -0.0220293 1 0 1 1 0 0 +EDGE2 3356 776 -0.0265143 0.0636923 0.00334151 1 0 1 1 0 0 +EDGE2 3356 697 0.972831 -0.0565886 0.000384119 1 0 1 1 0 0 +EDGE2 3356 777 1.01195 -0.00440093 0.00783314 1 0 1 1 0 0 +EDGE2 3356 797 1.06561 0.0924738 0.000343326 1 0 1 1 0 0 +EDGE2 3356 817 1.02431 0.0262037 -0.011099 1 0 1 1 0 0 +EDGE2 3356 757 1.00596 -0.0451004 0.0294795 1 0 1 1 0 0 +EDGE2 3357 3337 0.0126302 -0.0180678 -0.0426278 1 0 1 1 0 0 +EDGE2 3357 796 -1.05151 0.0283881 0.0058123 1 0 1 1 0 0 +EDGE2 3357 3336 -0.957451 -0.0583231 -0.00201719 1 0 1 1 0 0 +EDGE2 3357 3356 -0.995704 0.100292 0.0111149 1 0 1 1 0 0 +EDGE2 3357 816 -1.02403 0.0110534 -0.0227472 1 0 1 1 0 0 +EDGE2 3357 696 -1.12869 0.0474052 -0.0108693 1 0 1 1 0 0 +EDGE2 3357 756 -0.900675 -0.0149521 0.0242574 1 0 1 1 0 0 +EDGE2 3357 776 -0.985859 0.027169 0.0023821 1 0 1 1 0 0 +EDGE2 3357 778 1.01601 -0.0425174 -0.0322795 1 0 1 1 0 0 +EDGE2 3357 798 0.981946 -0.024189 0.0105074 1 0 1 1 0 0 +EDGE2 3357 697 0.060113 0.0755261 0.0202926 1 0 1 1 0 0 +EDGE2 3357 777 -0.0274954 -0.00994649 0.00388907 1 0 1 1 0 0 +EDGE2 3357 797 -0.00464876 0.00431522 0.00369543 1 0 1 1 0 0 +EDGE2 3357 817 0.0346749 0.0332528 0.00935079 1 0 1 1 0 0 +EDGE2 3357 757 -0.027885 -0.0121899 -0.00146384 1 0 1 1 0 0 +EDGE2 3357 3338 1.08382 0.00369551 0.0436717 1 0 1 1 0 0 +EDGE2 3357 818 1.0045 0.0647005 0.00889752 1 0 1 1 0 0 +EDGE2 3357 698 0.988533 0.0451149 -0.0465436 1 0 1 1 0 0 +EDGE2 3357 758 1.00909 -0.0238896 0.0145363 1 0 1 1 0 0 +EDGE2 3358 3337 -0.981272 -0.0597545 0.0206612 1 0 1 1 0 0 +EDGE2 3358 3357 -0.88696 -0.0134827 0.0139315 1 0 1 1 0 0 +EDGE2 3358 778 -0.00378633 -0.0551901 0.0128396 1 0 1 1 0 0 +EDGE2 3358 798 -0.0138246 -0.0371412 -0.00859159 1 0 1 1 0 0 +EDGE2 3358 697 -1.02072 0.0262836 -0.0304061 1 0 1 1 0 0 +EDGE2 3358 777 -1.02311 0.0489818 0.0101417 1 0 1 1 0 0 +EDGE2 3358 797 -0.987858 0.0267571 -0.0155733 1 0 1 1 0 0 +EDGE2 3358 817 -1.00032 -0.0303744 -0.0348308 1 0 1 1 0 0 +EDGE2 3358 757 -1.0133 0.0901291 -0.0215574 1 0 1 1 0 0 +EDGE2 3358 3338 0.0115456 0.0548326 -0.0205726 1 0 1 1 0 0 +EDGE2 3358 818 -0.107212 -0.0307713 0.0208492 1 0 1 1 0 0 +EDGE2 3358 699 1.04024 0.0469549 0.0328737 1 0 1 1 0 0 +EDGE2 3358 3339 1.08261 -0.0132452 -0.0248631 1 0 1 1 0 0 +EDGE2 3358 698 -0.117659 -0.00147904 -0.00995082 1 0 1 1 0 0 +EDGE2 3358 758 0.0171298 0.00814122 0.00182421 1 0 1 1 0 0 +EDGE2 3358 779 0.957922 -0.0447733 0.000670153 1 0 1 1 0 0 +EDGE2 3358 799 0.918893 -0.0330673 0.00944284 1 0 1 1 0 0 +EDGE2 3358 819 1.0275 -0.00229384 -0.0104449 1 0 1 1 0 0 +EDGE2 3358 759 0.986789 0.0906446 0.000221392 1 0 1 1 0 0 +EDGE2 3359 800 0.988968 -0.0433622 0.00297982 1 0 1 1 0 0 +EDGE2 3359 778 -1.00885 -0.101822 0.00728689 1 0 1 1 0 0 +EDGE2 3359 798 -0.943544 0.0789533 -0.00277148 1 0 1 1 0 0 +EDGE2 3359 3338 -1.00105 -0.00478797 -0.00834711 1 0 1 1 0 0 +EDGE2 3359 3358 -0.983496 0.113489 -0.0122633 1 0 1 1 0 0 +EDGE2 3359 818 -1.02288 -0.103568 0.0214426 1 0 1 1 0 0 +EDGE2 3359 699 0.0209052 0.0137726 -0.0295391 1 0 1 1 0 0 +EDGE2 3359 3339 0.0104043 -0.0418285 -0.0004037 1 0 1 1 0 0 +EDGE2 3359 698 -0.980877 -0.0194195 0.00879327 1 0 1 1 0 0 +EDGE2 3359 758 -1.11607 -0.0033227 0.0283311 1 0 1 1 0 0 +EDGE2 3359 779 -0.0364827 -0.0377796 -0.0170716 1 0 1 1 0 0 +EDGE2 3359 799 -0.0629887 -0.0210865 0.0160008 1 0 1 1 0 0 +EDGE2 3359 819 -0.0121878 0.076806 0.00839818 1 0 1 1 0 0 +EDGE2 3359 759 -0.0154548 0.0100827 0.0161644 1 0 1 1 0 0 +EDGE2 3359 3340 1.00655 -0.0010252 0.0136608 1 0 1 1 0 0 +EDGE2 3359 3200 1.01218 -0.0136469 -3.17462 1 0 1 1 0 0 +EDGE2 3359 3220 0.956126 -0.0103564 -3.09312 1 0 1 1 0 0 +EDGE2 3359 820 0.899371 -0.0547699 0.0134585 1 0 1 1 0 0 +EDGE2 3359 740 0.95141 0.0930141 -3.1596 1 0 1 1 0 0 +EDGE2 3359 760 1.08407 -0.000632643 -0.025985 1 0 1 1 0 0 +EDGE2 3359 780 1.01469 -0.00155715 0.0109557 1 0 1 1 0 0 +EDGE2 3359 700 0.870313 0.00694686 0.00382428 1 0 1 1 0 0 +EDGE2 3360 801 0.0510182 1.07375 1.52925 1 0 1 1 0 0 +EDGE2 3360 3341 0.0100136 0.978853 1.56005 1 0 1 1 0 0 +EDGE2 3360 761 0.0101816 0.935246 1.57823 1 0 1 1 0 0 +EDGE2 3360 781 0.0456186 0.996379 1.54315 1 0 1 1 0 0 +EDGE2 3360 741 -0.00425155 1.07156 1.55859 1 0 1 1 0 0 +EDGE2 3360 800 0.0257738 0.0335634 -0.0105376 1 0 1 1 0 0 +EDGE2 3360 699 -1.01125 -0.00170043 -0.010965 1 0 1 1 0 0 +EDGE2 3360 3339 -0.984374 -0.0112937 -0.0252397 1 0 1 1 0 0 +EDGE2 3360 3359 -1.14808 -0.132407 -0.0222885 1 0 1 1 0 0 +EDGE2 3360 779 -1.05436 0.061806 -0.00765814 1 0 1 1 0 0 +EDGE2 3360 799 -1.03418 0.0854774 0.0148684 1 0 1 1 0 0 +EDGE2 3360 819 -0.912405 0.0792686 -0.0230403 1 0 1 1 0 0 +EDGE2 3360 759 -0.984831 -0.0205315 7.74976e-05 1 0 1 1 0 0 +EDGE2 3360 3340 0.000296339 -0.0528872 0.0203458 1 0 1 1 0 0 +EDGE2 3360 3200 0.0135595 0.0679572 -3.14217 1 0 1 1 0 0 +EDGE2 3360 3220 0.0183163 0.0807764 -3.14096 1 0 1 1 0 0 +EDGE2 3360 820 0.049883 -0.0437986 -0.0201257 1 0 1 1 0 0 +EDGE2 3360 701 0.0111657 -1.06352 -1.58346 1 0 1 1 0 0 +EDGE2 3360 740 -0.0378859 0.0159156 -3.12104 1 0 1 1 0 0 +EDGE2 3360 760 -0.00102797 -0.0316262 0.0122975 1 0 1 1 0 0 +EDGE2 3360 780 -0.0665539 -0.0229686 0.00151503 1 0 1 1 0 0 +EDGE2 3360 700 -0.0357886 0.0428095 0.00137059 1 0 1 1 0 0 +EDGE2 3360 3201 0.11165 -0.96004 -1.54292 1 0 1 1 0 0 +EDGE2 3360 3221 -0.0375603 -0.966904 -1.57644 1 0 1 1 0 0 +EDGE2 3360 821 -0.0342056 -0.865597 -1.54874 1 0 1 1 0 0 +EDGE2 3360 3199 0.995965 -0.0756211 -3.16544 1 0 1 1 0 0 +EDGE2 3360 3219 0.950303 0.0576277 -3.14497 1 0 1 1 0 0 +EDGE2 3360 739 0.96782 -0.0197651 -3.16287 1 0 1 1 0 0 +EDGE2 3361 800 -0.949845 -0.00816181 1.58489 1 0 1 1 0 0 +EDGE2 3361 3340 -1.00838 0.030713 1.57424 1 0 1 1 0 0 +EDGE2 3361 3360 -0.982209 -0.0304795 1.56633 1 0 1 1 0 0 +EDGE2 3361 3200 -0.91629 -0.0227908 -1.56639 1 0 1 1 0 0 +EDGE2 3361 3220 -0.993662 -0.0117623 -1.60319 1 0 1 1 0 0 +EDGE2 3361 820 -1.01007 0.0243937 1.56162 1 0 1 1 0 0 +EDGE2 3361 701 0.00156338 -0.0154154 -0.00120646 1 0 1 1 0 0 +EDGE2 3361 740 -0.930832 0.0611683 -1.55982 1 0 1 1 0 0 +EDGE2 3361 760 -0.998642 -0.0296839 1.57368 1 0 1 1 0 0 +EDGE2 3361 780 -1.02567 0.0367338 1.60555 1 0 1 1 0 0 +EDGE2 3361 700 -0.980654 -0.0569715 1.57684 1 0 1 1 0 0 +EDGE2 3361 3201 0.025216 -0.0513693 -0.0169731 1 0 1 1 0 0 +EDGE2 3361 3221 -0.0311128 -0.0182121 0.0255097 1 0 1 1 0 0 +EDGE2 3361 821 -0.0565008 -0.0132814 0.0243093 1 0 1 1 0 0 +EDGE2 3361 822 1.07537 0.015168 -0.0044416 1 0 1 1 0 0 +EDGE2 3361 3222 0.993878 0.100831 0.00365148 1 0 1 1 0 0 +EDGE2 3361 3202 1.02244 -0.0694954 0.00360218 1 0 1 1 0 0 +EDGE2 3361 702 1.04842 0.0378021 0.0156792 1 0 1 1 0 0 +EDGE2 3362 3203 0.984608 0.00327399 0.0412862 1 0 1 1 0 0 +EDGE2 3362 701 -1.05147 -0.08729 0.00987891 1 0 1 1 0 0 +EDGE2 3362 3201 -1.07006 0.00265217 -0.0186621 1 0 1 1 0 0 +EDGE2 3362 3221 -1.01674 -0.104761 0.0272148 1 0 1 1 0 0 +EDGE2 3362 3361 -0.953626 0.0465192 0.0152634 1 0 1 1 0 0 +EDGE2 3362 821 -0.989284 0.0962998 0.0199375 1 0 1 1 0 0 +EDGE2 3362 822 0.0579083 0.0179726 -0.00652658 1 0 1 1 0 0 +EDGE2 3362 3222 -0.0353707 0.00896734 0.00633513 1 0 1 1 0 0 +EDGE2 3362 3202 -0.0525096 -0.0187235 0.0101039 1 0 1 1 0 0 +EDGE2 3362 702 0.0481239 0.0266157 -0.00542572 1 0 1 1 0 0 +EDGE2 3362 3223 1.06969 -0.00679386 0.0103949 1 0 1 1 0 0 +EDGE2 3362 703 1.0725 0.0290236 0.00104835 1 0 1 1 0 0 +EDGE2 3362 823 0.950829 0.0287794 0.00366427 1 0 1 1 0 0 +EDGE2 3363 3203 0.050524 0.090441 0.0212942 1 0 1 1 0 0 +EDGE2 3363 822 -1.06321 0.0993273 0.017156 1 0 1 1 0 0 +EDGE2 3363 3222 -0.903513 0.0118304 0.0129047 1 0 1 1 0 0 +EDGE2 3363 3362 -0.982339 -0.0530579 0.00350208 1 0 1 1 0 0 +EDGE2 3363 3202 -1.0394 0.00346325 -0.00540254 1 0 1 1 0 0 +EDGE2 3363 702 -1.01476 0.0875396 -0.0407986 1 0 1 1 0 0 +EDGE2 3363 3223 0.0707133 -0.0523943 0.0125234 1 0 1 1 0 0 +EDGE2 3363 703 -0.0495478 0.0202989 0.00539631 1 0 1 1 0 0 +EDGE2 3363 823 -0.0536255 -0.00281927 0.0214691 1 0 1 1 0 0 +EDGE2 3363 824 0.933238 -0.0195452 0.0452042 1 0 1 1 0 0 +EDGE2 3363 3204 0.971041 0.0289519 0.00981392 1 0 1 1 0 0 +EDGE2 3363 3224 0.924402 -0.095748 -0.0397588 1 0 1 1 0 0 +EDGE2 3363 704 1.01056 0.0353791 -0.00928957 1 0 1 1 0 0 +EDGE2 3364 3203 -0.986246 0.00442251 -0.0220875 1 0 1 1 0 0 +EDGE2 3364 3363 -1.0055 0.0878294 0.00500615 1 0 1 1 0 0 +EDGE2 3364 3223 -1.03132 -0.0211518 -0.0130428 1 0 1 1 0 0 +EDGE2 3364 703 -0.996944 -0.0117163 -0.00309583 1 0 1 1 0 0 +EDGE2 3364 823 -1.00562 0.0593971 0.0234192 1 0 1 1 0 0 +EDGE2 3364 824 -0.0173973 0.031555 -0.00557681 1 0 1 1 0 0 +EDGE2 3364 3204 -0.0546806 -0.0343111 -0.000210021 1 0 1 1 0 0 +EDGE2 3364 3224 -0.0275765 0.0315803 -0.0112719 1 0 1 1 0 0 +EDGE2 3364 704 -0.107865 -0.0825622 -0.00528422 1 0 1 1 0 0 +EDGE2 3364 865 1.01257 -0.00462612 -3.14721 1 0 1 1 0 0 +EDGE2 3364 3225 1.00412 -0.0168143 0.0280204 1 0 1 1 0 0 +EDGE2 3364 1205 0.979651 -0.0171858 -3.15976 1 0 1 1 0 0 +EDGE2 3364 3205 1.01742 -0.0904938 0.01452 1 0 1 1 0 0 +EDGE2 3364 905 0.92082 0.0384969 -3.14451 1 0 1 1 0 0 +EDGE2 3364 705 1.10896 -0.000354079 0.0123906 1 0 1 1 0 0 +EDGE2 3364 825 0.981919 -0.00950951 -0.0183791 1 0 1 1 0 0 +EDGE2 3364 845 1.03085 0.0311075 -3.14514 1 0 1 1 0 0 +EDGE2 3365 3364 -1.11408 0.0891476 0.0212285 1 0 1 1 0 0 +EDGE2 3365 824 -1.02081 0.0295363 0.0135151 1 0 1 1 0 0 +EDGE2 3365 3204 -1.05441 -0.00457978 -0.0252026 1 0 1 1 0 0 +EDGE2 3365 3224 -0.955009 0.0021535 -0.0115458 1 0 1 1 0 0 +EDGE2 3365 704 -0.949973 0.0285596 0.0264312 1 0 1 1 0 0 +EDGE2 3365 865 0.0791831 0.0258696 -3.13319 1 0 1 1 0 0 +EDGE2 3365 3225 -0.00118723 4.86231e-05 -0.00952055 1 0 1 1 0 0 +EDGE2 3365 826 0.0421996 -1.03502 -1.5838 1 0 1 1 0 0 +EDGE2 3365 866 -0.0627426 -0.947515 -1.55462 1 0 1 1 0 0 +EDGE2 3365 906 -0.042571 -1.02052 -1.59632 1 0 1 1 0 0 +EDGE2 3365 846 -0.0245821 -1.00027 -1.5601 1 0 1 1 0 0 +EDGE2 3365 1205 0.0592251 -0.00831005 -3.14907 1 0 1 1 0 0 +EDGE2 3365 3205 -0.103337 0.0556615 -0.0142241 1 0 1 1 0 0 +EDGE2 3365 905 0.0157611 -0.00865363 -3.12277 1 0 1 1 0 0 +EDGE2 3365 864 0.983845 0.0574365 -3.13244 1 0 1 1 0 0 +EDGE2 3365 705 0.00589516 -0.0394194 0.00087069 1 0 1 1 0 0 +EDGE2 3365 825 -0.0608771 -0.01969 0.00863396 1 0 1 1 0 0 +EDGE2 3365 845 0.0225347 0.00671838 -3.12526 1 0 1 1 0 0 +EDGE2 3365 1204 1.0129 -0.00991498 -3.20003 1 0 1 1 0 0 +EDGE2 3365 904 1.06666 -0.0836568 -3.12685 1 0 1 1 0 0 +EDGE2 3365 844 1.03405 0.00322351 -3.1444 1 0 1 1 0 0 +EDGE2 3365 1206 -0.00538722 1.01178 1.57866 1 0 1 1 0 0 +EDGE2 3365 3226 -0.0602298 0.968362 1.57488 1 0 1 1 0 0 +EDGE2 3365 3206 0.058646 0.944147 1.59082 1 0 1 1 0 0 +EDGE2 3365 706 -0.132161 1.03162 1.5909 1 0 1 1 0 0 +EDGE2 3366 865 -1.02616 -0.0493022 1.55992 1 0 1 1 0 0 +EDGE2 3366 3225 -1.0396 -0.00265792 -1.60999 1 0 1 1 0 0 +EDGE2 3366 3365 -0.985029 0.0102234 -1.51923 1 0 1 1 0 0 +EDGE2 3366 1205 -1.00233 0.0342693 1.55923 1 0 1 1 0 0 +EDGE2 3366 3205 -0.972496 0.111161 -1.57758 1 0 1 1 0 0 +EDGE2 3366 905 -0.989777 0.0058866 1.56527 1 0 1 1 0 0 +EDGE2 3366 705 -0.989146 -0.0921364 -1.61238 1 0 1 1 0 0 +EDGE2 3366 825 -0.946922 -0.0221976 -1.57379 1 0 1 1 0 0 +EDGE2 3366 845 -1.01033 0.0300544 1.54286 1 0 1 1 0 0 +EDGE2 3366 1206 0.00830862 -0.059387 0.0232503 1 0 1 1 0 0 +EDGE2 3366 3226 0.11624 0.0205104 0.0042981 1 0 1 1 0 0 +EDGE2 3366 3206 0.0498312 -0.166805 -0.00270181 1 0 1 1 0 0 +EDGE2 3366 706 -0.0656538 -0.0102316 0.00250353 1 0 1 1 0 0 +EDGE2 3366 1207 1.04973 0.141418 0.0241552 1 0 1 1 0 0 +EDGE2 3366 3207 0.991831 0.094084 -0.00776145 1 0 1 1 0 0 +EDGE2 3366 3227 1.01265 -0.0428618 0.00884355 1 0 1 1 0 0 +EDGE2 3366 707 0.992863 -6.07565e-05 0.000360579 1 0 1 1 0 0 +EDGE2 3367 3228 0.965692 -0.0349557 0.0284867 1 0 1 1 0 0 +EDGE2 3367 1206 -1.05578 -0.00763933 0.0326782 1 0 1 1 0 0 +EDGE2 3367 3226 -1.01009 -0.130048 -0.00222526 1 0 1 1 0 0 +EDGE2 3367 3366 -1.0302 -0.00429883 0.00295761 1 0 1 1 0 0 +EDGE2 3367 3206 -0.974992 0.0750953 -0.0240479 1 0 1 1 0 0 +EDGE2 3367 706 -0.932539 -0.0168833 0.0225137 1 0 1 1 0 0 +EDGE2 3367 1207 0.03193 0.015326 -0.0014754 1 0 1 1 0 0 +EDGE2 3367 3207 0.0215546 -0.0616965 -0.00961397 1 0 1 1 0 0 +EDGE2 3367 3227 -0.0027981 0.0223986 0.029089 1 0 1 1 0 0 +EDGE2 3367 707 -0.0388186 0.0413948 -0.0226962 1 0 1 1 0 0 +EDGE2 3367 708 1.00467 -0.00511012 -0.00718081 1 0 1 1 0 0 +EDGE2 3367 1208 1.11959 0.0152156 0.0170159 1 0 1 1 0 0 +EDGE2 3367 3208 1.02824 -0.109927 -0.000737051 1 0 1 1 0 0 +EDGE2 3368 3228 0.0315474 -0.0830594 -0.027048 1 0 1 1 0 0 +EDGE2 3368 3367 -0.970009 -0.00326062 0.00971046 1 0 1 1 0 0 +EDGE2 3368 1207 -0.99509 0.0550504 0.0210421 1 0 1 1 0 0 +EDGE2 3368 3207 -0.919398 0.0484405 -0.00798931 1 0 1 1 0 0 +EDGE2 3368 3227 -1.07187 -0.000933959 -0.00850695 1 0 1 1 0 0 +EDGE2 3368 707 -1.06143 -0.0282486 -0.0167544 1 0 1 1 0 0 +EDGE2 3368 708 -0.00776909 0.0212494 -0.0160268 1 0 1 1 0 0 +EDGE2 3368 1208 0.0419633 0.0313119 0.026673 1 0 1 1 0 0 +EDGE2 3368 3208 -0.00225874 -0.0163014 0.00975003 1 0 1 1 0 0 +EDGE2 3368 1209 0.924756 0.0233011 -0.0177941 1 0 1 1 0 0 +EDGE2 3368 3209 0.954615 0.0190894 0.032084 1 0 1 1 0 0 +EDGE2 3368 3229 1.05494 -0.0342914 -0.0178958 1 0 1 1 0 0 +EDGE2 3368 709 1.01859 0.0773531 -0.0251698 1 0 1 1 0 0 +EDGE2 3369 3228 -1.02518 0.0348344 -0.0149741 1 0 1 1 0 0 +EDGE2 3369 3368 -0.972779 0.017124 -0.016836 1 0 1 1 0 0 +EDGE2 3369 708 -0.90562 -0.0178529 -0.0193711 1 0 1 1 0 0 +EDGE2 3369 1208 -1.02828 0.0126828 0.00538459 1 0 1 1 0 0 +EDGE2 3369 3208 -0.926525 -0.0537916 0.0254189 1 0 1 1 0 0 +EDGE2 3369 1209 0.0256918 -0.119337 -0.059453 1 0 1 1 0 0 +EDGE2 3369 3209 -0.00761323 0.0148379 -0.00761123 1 0 1 1 0 0 +EDGE2 3369 3229 -0.0603733 -0.00665301 0.0222723 1 0 1 1 0 0 +EDGE2 3369 709 -0.0231268 0.112605 -0.0157247 1 0 1 1 0 0 +EDGE2 3369 730 0.993787 0.0353039 -3.14995 1 0 1 1 0 0 +EDGE2 3369 3190 0.978383 0.030982 -3.15863 1 0 1 1 0 0 +EDGE2 3369 3210 1.07658 0.0614541 0.0163003 1 0 1 1 0 0 +EDGE2 3369 3230 0.996815 0.0659081 0.0172352 1 0 1 1 0 0 +EDGE2 3369 1210 1.00792 0.104903 -0.001223 1 0 1 1 0 0 +EDGE2 3369 710 0.914553 -0.0531363 0.0230131 1 0 1 1 0 0 +EDGE2 3370 1211 0.0597023 0.902614 1.58345 1 0 1 1 0 0 +EDGE2 3370 3211 0.0730842 0.936917 1.58265 1 0 1 1 0 0 +EDGE2 3370 3231 -0.0729573 1.06679 1.59699 1 0 1 1 0 0 +EDGE2 3370 3191 0.0335478 0.938981 1.61121 1 0 1 1 0 0 +EDGE2 3370 711 -0.0182232 0.983845 1.58681 1 0 1 1 0 0 +EDGE2 3370 731 0.0173838 1.14829 1.57705 1 0 1 1 0 0 +EDGE2 3370 3369 -1.01421 0.0144069 -0.0258786 1 0 1 1 0 0 +EDGE2 3370 1209 -1.02797 0.0607199 -0.0105522 1 0 1 1 0 0 +EDGE2 3370 3209 -0.991794 0.0899957 0.0102245 1 0 1 1 0 0 +EDGE2 3370 3229 -0.884764 -0.0391223 0.00195283 1 0 1 1 0 0 +EDGE2 3370 709 -1.12363 -0.044107 0.00545349 1 0 1 1 0 0 +EDGE2 3370 730 -0.0474995 -0.00283837 -3.12902 1 0 1 1 0 0 +EDGE2 3370 3190 -0.0405212 0.0202139 -3.15775 1 0 1 1 0 0 +EDGE2 3370 3210 0.0681331 -0.0346424 0.0210426 1 0 1 1 0 0 +EDGE2 3370 3230 0.0449661 -0.0472403 -0.0164627 1 0 1 1 0 0 +EDGE2 3370 1210 -0.00308897 -0.00281753 0.016894 1 0 1 1 0 0 +EDGE2 3370 710 -0.0582677 0.025176 -0.0195484 1 0 1 1 0 0 +EDGE2 3370 3189 0.946341 0.0456689 -3.12981 1 0 1 1 0 0 +EDGE2 3370 729 1.00963 0.0602035 -3.11663 1 0 1 1 0 0 +EDGE2 3371 3370 -1.12368 -0.0475367 1.55052 1 0 1 1 0 0 +EDGE2 3371 730 -1.04389 -0.0326073 -1.55813 1 0 1 1 0 0 +EDGE2 3371 3190 -0.869291 0.0618418 -1.57414 1 0 1 1 0 0 +EDGE2 3371 3210 -0.995094 0.0732314 1.5691 1 0 1 1 0 0 +EDGE2 3371 3230 -1.08925 -0.0845679 1.57011 1 0 1 1 0 0 +EDGE2 3371 1210 -0.967728 0.0766913 1.60009 1 0 1 1 0 0 +EDGE2 3371 710 -0.932277 0.104582 1.53283 1 0 1 1 0 0 +EDGE2 3372 3371 -0.996745 0.0677216 0.0211882 1 0 1 1 0 0 +EDGE2 3373 3372 -0.997346 -0.00655903 -0.0178086 1 0 1 1 0 0 +EDGE2 3374 3373 -1.00318 0.0330366 0.00983388 1 0 1 1 0 0 +EDGE2 3374 3115 0.993082 -0.0308875 -3.14622 1 0 1 1 0 0 +EDGE2 3374 3175 0.959809 0.0513428 -3.16116 1 0 1 1 0 0 +EDGE2 3374 3135 0.979768 0.000991526 -3.14438 1 0 1 1 0 0 +EDGE2 3374 1175 0.909281 -0.00479329 -3.1447 1 0 1 1 0 0 +EDGE2 3374 1195 0.976293 0.0393203 -3.16371 1 0 1 1 0 0 +EDGE2 3374 3095 0.955398 0.0650224 -3.15631 1 0 1 1 0 0 +EDGE2 3374 1155 1.01053 0.0240475 -3.14194 1 0 1 1 0 0 +EDGE2 3375 3374 -0.978279 -0.0981372 0.0100283 1 0 1 1 0 0 +EDGE2 3375 1196 0.0459698 -0.950127 -1.56617 1 0 1 1 0 0 +EDGE2 3375 3116 0.00512819 -0.964396 -1.59393 1 0 1 1 0 0 +EDGE2 3375 3136 0.0763742 -1.0181 -1.55009 1 0 1 1 0 0 +EDGE2 3375 3096 0.0152968 -1.0779 -1.54589 1 0 1 1 0 0 +EDGE2 3375 1156 0.00879931 -1.0007 -1.56605 1 0 1 1 0 0 +EDGE2 3375 1176 0.0396195 -1.00649 -1.57699 1 0 1 1 0 0 +EDGE2 3375 1174 1.00789 0.0145076 -3.12842 1 0 1 1 0 0 +EDGE2 3375 3115 0.0689445 -0.00314325 -3.13925 1 0 1 1 0 0 +EDGE2 3375 3175 -0.0258754 -0.0378265 -3.14443 1 0 1 1 0 0 +EDGE2 3375 3135 -0.00166088 -0.0256126 -3.12938 1 0 1 1 0 0 +EDGE2 3375 1175 -0.00101733 -0.0287064 -3.14208 1 0 1 1 0 0 +EDGE2 3375 1195 0.098795 0.0535104 -3.1208 1 0 1 1 0 0 +EDGE2 3375 3095 0.0196291 -0.0129726 -3.12854 1 0 1 1 0 0 +EDGE2 3375 1155 -0.133451 -0.0666759 -3.14249 1 0 1 1 0 0 +EDGE2 3375 3174 1.0616 0.0350247 -3.1386 1 0 1 1 0 0 +EDGE2 3375 3094 0.947846 -0.0287355 -3.12537 1 0 1 1 0 0 +EDGE2 3375 3114 1.00387 -0.09177 -3.13186 1 0 1 1 0 0 +EDGE2 3375 3134 0.954719 -0.0189612 -3.1317 1 0 1 1 0 0 +EDGE2 3375 1194 0.965212 -0.0969622 -3.11775 1 0 1 1 0 0 +EDGE2 3375 1154 1.01231 -0.0245876 -3.15073 1 0 1 1 0 0 +EDGE2 3375 3176 -0.0142171 0.994603 1.57131 1 0 1 1 0 0 +EDGE2 3376 1197 0.963234 -0.0876301 -0.0133167 1 0 1 1 0 0 +EDGE2 3376 3117 0.998048 0.036064 0.0087295 1 0 1 1 0 0 +EDGE2 3376 3137 1.04532 -0.0791747 0.00528732 1 0 1 1 0 0 +EDGE2 3376 3097 0.944511 -0.00145906 -0.0281314 1 0 1 1 0 0 +EDGE2 3376 1177 0.979579 0.00745848 -0.00689997 1 0 1 1 0 0 +EDGE2 3376 1157 0.980463 0.0229105 0.0191323 1 0 1 1 0 0 +EDGE2 3376 1196 -0.0407346 0.116127 -0.0230717 1 0 1 1 0 0 +EDGE2 3376 3116 0.014412 -0.011284 0.00118175 1 0 1 1 0 0 +EDGE2 3376 3136 0.00106541 0.038895 -0.00492561 1 0 1 1 0 0 +EDGE2 3376 3096 0.0592333 -0.0594632 -0.00580277 1 0 1 1 0 0 +EDGE2 3376 1156 -0.0505231 -0.0154285 -0.0256396 1 0 1 1 0 0 +EDGE2 3376 1176 -0.0306823 0.0209287 -0.0143891 1 0 1 1 0 0 +EDGE2 3376 3115 -1.03889 0.0554602 -1.58605 1 0 1 1 0 0 +EDGE2 3376 3175 -0.967511 -0.091141 -1.54439 1 0 1 1 0 0 +EDGE2 3376 3375 -0.963881 -0.0400978 1.57084 1 0 1 1 0 0 +EDGE2 3376 3135 -0.950133 0.0190754 -1.58758 1 0 1 1 0 0 +EDGE2 3376 1175 -0.985126 0.0561584 -1.54465 1 0 1 1 0 0 +EDGE2 3376 1195 -0.908846 0.0459091 -1.55254 1 0 1 1 0 0 +EDGE2 3376 3095 -1.08636 -0.0244726 -1.57796 1 0 1 1 0 0 +EDGE2 3376 1155 -1.00807 -0.0331465 -1.57278 1 0 1 1 0 0 +EDGE2 3377 1197 -0.0342016 0.0311915 0.0224677 1 0 1 1 0 0 +EDGE2 3377 3098 1.01457 -0.031905 -0.0288832 1 0 1 1 0 0 +EDGE2 3377 3138 0.943984 -0.0408738 0.0422757 1 0 1 1 0 0 +EDGE2 3377 3118 1.05088 -0.0571748 -0.0126151 1 0 1 1 0 0 +EDGE2 3377 1178 1.04428 0.0405945 -0.00952286 1 0 1 1 0 0 +EDGE2 3377 1198 0.933232 -0.0395138 0.0254418 1 0 1 1 0 0 +EDGE2 3377 1158 1.08614 -0.00377406 -0.0116511 1 0 1 1 0 0 +EDGE2 3377 3117 -0.016991 -0.00427456 0.0167135 1 0 1 1 0 0 +EDGE2 3377 3137 0.0123613 -0.105422 -0.023345 1 0 1 1 0 0 +EDGE2 3377 3097 0.0429511 0.0294283 -0.00202335 1 0 1 1 0 0 +EDGE2 3377 1177 0.0129682 -0.0214725 -0.0450048 1 0 1 1 0 0 +EDGE2 3377 1157 0.0399815 -0.0942481 0.00163898 1 0 1 1 0 0 +EDGE2 3377 1196 -1.08574 -0.0212251 -0.0220658 1 0 1 1 0 0 +EDGE2 3377 3116 -1.01328 -0.0296168 -0.0205653 1 0 1 1 0 0 +EDGE2 3377 3136 -0.974573 0.0273065 0.0122799 1 0 1 1 0 0 +EDGE2 3377 3376 -1.0509 0.0193071 -0.0459198 1 0 1 1 0 0 +EDGE2 3377 3096 -0.942413 0.0433725 0.00631152 1 0 1 1 0 0 +EDGE2 3377 1156 -0.99747 0.0865035 0.0139783 1 0 1 1 0 0 +EDGE2 3377 1176 -0.938902 -0.0461794 0.00712257 1 0 1 1 0 0 +EDGE2 3378 1197 -0.985129 -0.0704665 0.0214926 1 0 1 1 0 0 +EDGE2 3378 3119 0.961009 -0.00648946 -0.0238628 1 0 1 1 0 0 +EDGE2 3378 3139 0.999434 -0.0191831 0.0206045 1 0 1 1 0 0 +EDGE2 3378 1179 1.05038 -0.0781382 -0.0224335 1 0 1 1 0 0 +EDGE2 3378 1199 0.966457 -0.00054203 -0.0134769 1 0 1 1 0 0 +EDGE2 3378 3099 1.06817 0.0773343 -0.0166534 1 0 1 1 0 0 +EDGE2 3378 1159 1.06122 0.0612627 -0.00411106 1 0 1 1 0 0 +EDGE2 3378 3098 -0.0239127 0.00141429 -0.0106002 1 0 1 1 0 0 +EDGE2 3378 3138 0.104513 -0.0112961 -0.0114434 1 0 1 1 0 0 +EDGE2 3378 3118 0.00337235 -0.0137308 0.0201013 1 0 1 1 0 0 +EDGE2 3378 1178 0.0654677 -0.0485513 0.0228117 1 0 1 1 0 0 +EDGE2 3378 1198 0.0523494 -0.102726 0.0106231 1 0 1 1 0 0 +EDGE2 3378 1158 -0.0458359 0.0339238 -0.0321544 1 0 1 1 0 0 +EDGE2 3378 3117 -0.964465 0.0369766 0.0121577 1 0 1 1 0 0 +EDGE2 3378 3137 -1.0137 -0.000780326 -0.0247274 1 0 1 1 0 0 +EDGE2 3378 3377 -0.97484 -0.0166141 -0.00154618 1 0 1 1 0 0 +EDGE2 3378 3097 -0.945443 -0.0316718 0.00315145 1 0 1 1 0 0 +EDGE2 3378 1177 -0.942022 0.022124 -0.0110612 1 0 1 1 0 0 +EDGE2 3378 1157 -1.03819 0.0359057 -0.00153981 1 0 1 1 0 0 +EDGE2 3379 1160 1.05854 -0.0116556 0.00434697 1 0 1 1 0 0 +EDGE2 3379 3140 0.909198 -0.018709 0.0389515 1 0 1 1 0 0 +EDGE2 3379 1200 0.99121 0.0850563 -0.0228509 1 0 1 1 0 0 +EDGE2 3379 3100 0.941302 0.023439 -0.0367097 1 0 1 1 0 0 +EDGE2 3379 3120 0.979373 0.00819393 0.0206665 1 0 1 1 0 0 +EDGE2 3379 1180 1.01903 0.0116359 -0.010801 1 0 1 1 0 0 +EDGE2 3379 900 1.0378 0.0337396 -3.12399 1 0 1 1 0 0 +EDGE2 3379 840 1.03308 -0.0240496 -3.18182 1 0 1 1 0 0 +EDGE2 3379 860 0.991648 -0.0581224 -3.1767 1 0 1 1 0 0 +EDGE2 3379 3119 -0.0225988 -0.0147438 -0.0333662 1 0 1 1 0 0 +EDGE2 3379 3139 -0.0263732 0.0852777 0.0113707 1 0 1 1 0 0 +EDGE2 3379 1179 0.0480252 0.021218 -0.0205302 1 0 1 1 0 0 +EDGE2 3379 1199 -0.0384477 -0.0743563 0.00721942 1 0 1 1 0 0 +EDGE2 3379 3099 -0.100685 -0.0241317 0.0288414 1 0 1 1 0 0 +EDGE2 3379 1159 0.0650428 -0.0194968 -0.0150715 1 0 1 1 0 0 +EDGE2 3379 3098 -0.892322 0.0271717 -0.0181956 1 0 1 1 0 0 +EDGE2 3379 3138 -1.02797 -0.027025 -0.0351709 1 0 1 1 0 0 +EDGE2 3379 3378 -0.912538 0.0431699 0.00284352 1 0 1 1 0 0 +EDGE2 3379 3118 -0.994595 -0.0915655 0.00801018 1 0 1 1 0 0 +EDGE2 3379 1178 -0.958777 -0.0389688 -0.0053817 1 0 1 1 0 0 +EDGE2 3379 1198 -0.936157 -0.0156895 0.0400765 1 0 1 1 0 0 +EDGE2 3379 1158 -0.962507 0.078051 0.00757356 1 0 1 1 0 0 +EDGE2 3380 839 0.985203 0.0888101 -3.09747 1 0 1 1 0 0 +EDGE2 3380 899 1.02424 -0.0125156 -3.15735 1 0 1 1 0 0 +EDGE2 3380 859 0.984717 0.0445131 -3.12333 1 0 1 1 0 0 +EDGE2 3380 841 0.0249252 -1.05749 -1.53819 1 0 1 1 0 0 +EDGE2 3380 901 -0.0288604 -1.06668 -1.55924 1 0 1 1 0 0 +EDGE2 3380 1201 -0.0679883 -0.988365 -1.54466 1 0 1 1 0 0 +EDGE2 3380 861 -0.0631673 -0.985305 -1.55237 1 0 1 1 0 0 +EDGE2 3380 1160 -0.0585291 -0.0648051 -0.0118091 1 0 1 1 0 0 +EDGE2 3380 3140 0.0524995 0.055319 -0.00684521 1 0 1 1 0 0 +EDGE2 3380 1200 -0.0643833 -0.0634745 0.0254366 1 0 1 1 0 0 +EDGE2 3380 3100 0.0658057 0.0210276 -0.0174225 1 0 1 1 0 0 +EDGE2 3380 3120 -0.0425378 0.0736632 0.00546966 1 0 1 1 0 0 +EDGE2 3380 1180 0.0211382 -0.0471708 -0.0207907 1 0 1 1 0 0 +EDGE2 3380 900 -0.0313735 -0.0467008 -3.11484 1 0 1 1 0 0 +EDGE2 3380 840 -0.0658746 -0.0823301 -3.16359 1 0 1 1 0 0 +EDGE2 3380 860 -0.0532986 0.050761 -3.16556 1 0 1 1 0 0 +EDGE2 3380 3101 0.00903982 0.954779 1.5513 1 0 1 1 0 0 +EDGE2 3380 3141 0.0115748 1.00274 1.58232 1 0 1 1 0 0 +EDGE2 3380 3121 0.104434 1.04749 1.59525 1 0 1 1 0 0 +EDGE2 3380 1161 -0.00259333 1.0268 1.55887 1 0 1 1 0 0 +EDGE2 3380 1181 0.047232 0.956722 1.58293 1 0 1 1 0 0 +EDGE2 3380 3119 -0.945502 -0.0213998 -0.00821128 1 0 1 1 0 0 +EDGE2 3380 3379 -1.03119 -0.0136076 -0.00565228 1 0 1 1 0 0 +EDGE2 3380 3139 -1.03258 0.00113211 -0.00796568 1 0 1 1 0 0 +EDGE2 3380 1179 -0.964654 0.0203197 -0.0342981 1 0 1 1 0 0 +EDGE2 3380 1199 -1.00401 0.0154847 0.00903541 1 0 1 1 0 0 +EDGE2 3380 3099 -0.954738 -0.0164472 -0.0438704 1 0 1 1 0 0 +EDGE2 3380 1159 -1.00205 -0.0862351 -0.0222455 1 0 1 1 0 0 +EDGE2 3381 1160 -1.02559 0.0525854 -1.56904 1 0 1 1 0 0 +EDGE2 3381 3140 -1.02394 -0.00192827 -1.59247 1 0 1 1 0 0 +EDGE2 3381 3380 -1.06568 -0.0580149 -1.57101 1 0 1 1 0 0 +EDGE2 3381 1200 -1.01994 0.0275862 -1.53961 1 0 1 1 0 0 +EDGE2 3381 3100 -0.973687 -0.0841826 -1.57237 1 0 1 1 0 0 +EDGE2 3381 3120 -1.02165 0.078087 -1.572 1 0 1 1 0 0 +EDGE2 3381 1180 -0.94185 0.014837 -1.5799 1 0 1 1 0 0 +EDGE2 3381 900 -1.0327 -0.0579047 1.59899 1 0 1 1 0 0 +EDGE2 3381 840 -1.02704 0.0249349 1.57528 1 0 1 1 0 0 +EDGE2 3381 860 -0.904847 0.0271768 1.59482 1 0 1 1 0 0 +EDGE2 3381 3101 -0.0303243 0.0760626 -0.00925196 1 0 1 1 0 0 +EDGE2 3381 3141 -0.0768212 -0.0720825 0.0169049 1 0 1 1 0 0 +EDGE2 3381 3121 -0.114566 -0.0633522 0.0167173 1 0 1 1 0 0 +EDGE2 3381 1161 -0.0184704 -0.014354 0.00823665 1 0 1 1 0 0 +EDGE2 3381 1181 -0.0715266 -0.0739808 -0.0268531 1 0 1 1 0 0 +EDGE2 3381 1182 1.02017 -0.0105895 0.0199321 1 0 1 1 0 0 +EDGE2 3381 3122 0.948466 -0.0451006 0.000652488 1 0 1 1 0 0 +EDGE2 3381 3142 0.994959 -0.0265206 -0.0153094 1 0 1 1 0 0 +EDGE2 3381 3102 1.0417 -0.0486172 0.016542 1 0 1 1 0 0 +EDGE2 3381 1162 1.0184 0.0664322 -0.0209089 1 0 1 1 0 0 +EDGE2 3382 3101 -1.03614 0.0777825 -0.00193084 1 0 1 1 0 0 +EDGE2 3382 3141 -0.943929 -0.0416233 -0.0130231 1 0 1 1 0 0 +EDGE2 3382 3381 -1.02675 -0.0210944 0.00669641 1 0 1 1 0 0 +EDGE2 3382 3121 -1.00952 -0.00241337 -0.000575654 1 0 1 1 0 0 +EDGE2 3382 1161 -0.965389 -0.0745593 -0.0221259 1 0 1 1 0 0 +EDGE2 3382 1181 -0.992008 -0.00212619 -0.00167471 1 0 1 1 0 0 +EDGE2 3382 1182 0.0357901 -0.0630672 0.000335421 1 0 1 1 0 0 +EDGE2 3382 3122 0.0207101 -0.00826078 -0.0165426 1 0 1 1 0 0 +EDGE2 3382 3142 -0.00543272 0.0651874 0.0213362 1 0 1 1 0 0 +EDGE2 3382 3102 0.0528841 -0.0260608 -0.0102758 1 0 1 1 0 0 +EDGE2 3382 1162 -0.094003 -0.0700223 -0.0271845 1 0 1 1 0 0 +EDGE2 3382 1163 1.02981 -0.0209768 0.0329028 1 0 1 1 0 0 +EDGE2 3382 3103 0.944406 -0.03299 0.0100824 1 0 1 1 0 0 +EDGE2 3382 3123 0.968682 0.00528807 -0.000152983 1 0 1 1 0 0 +EDGE2 3382 3143 0.962847 0.126199 0.000908581 1 0 1 1 0 0 +EDGE2 3382 1183 1.03781 0.0194179 -0.0138116 1 0 1 1 0 0 +EDGE2 3383 1182 -1.02589 0.0218957 -0.0351919 1 0 1 1 0 0 +EDGE2 3383 3122 -0.90753 0.0475131 0.0271598 1 0 1 1 0 0 +EDGE2 3383 3142 -1.00594 -0.0105669 -0.000644681 1 0 1 1 0 0 +EDGE2 3383 3382 -1.00095 0.0182364 0.0353806 1 0 1 1 0 0 +EDGE2 3383 3102 -1.06766 0.040958 -0.00126796 1 0 1 1 0 0 +EDGE2 3383 1162 -0.939639 -0.0646606 -0.013708 1 0 1 1 0 0 +EDGE2 3383 3144 1.05061 -0.00111254 0.0131242 1 0 1 1 0 0 +EDGE2 3383 1163 0.00237914 -0.0482921 0.0146902 1 0 1 1 0 0 +EDGE2 3383 3103 -0.0748495 0.0524137 -0.0396593 1 0 1 1 0 0 +EDGE2 3383 3123 -0.00412659 0.0377469 0.0218838 1 0 1 1 0 0 +EDGE2 3383 3143 0.066001 0.0600729 0.00454972 1 0 1 1 0 0 +EDGE2 3383 1183 7.17025e-05 -0.0726008 -0.0232342 1 0 1 1 0 0 +EDGE2 3383 1184 0.985035 0.00929298 -0.0153546 1 0 1 1 0 0 +EDGE2 3383 3104 1.07014 0.0131862 0.00198897 1 0 1 1 0 0 +EDGE2 3383 3124 0.985295 -0.0668469 -0.0116686 1 0 1 1 0 0 +EDGE2 3383 1164 0.958004 -0.00455049 0.00284756 1 0 1 1 0 0 +EDGE2 3384 3383 -0.951876 -0.0381527 -0.0110913 1 0 1 1 0 0 +EDGE2 3384 3144 0.0153547 0.0369215 0.0331682 1 0 1 1 0 0 +EDGE2 3384 1163 -1.0087 0.0415639 0.00608017 1 0 1 1 0 0 +EDGE2 3384 3103 -1.01073 0.0110889 -0.0104452 1 0 1 1 0 0 +EDGE2 3384 3123 -1.09476 -0.0465043 0.0294999 1 0 1 1 0 0 +EDGE2 3384 3143 -0.989962 0.0312643 -0.0146372 1 0 1 1 0 0 +EDGE2 3384 1183 -0.934755 0.0695531 -0.00382378 1 0 1 1 0 0 +EDGE2 3384 1184 0.0185427 0.0591126 0.012135 1 0 1 1 0 0 +EDGE2 3384 3104 -0.0119505 0.00242703 -0.00612695 1 0 1 1 0 0 +EDGE2 3384 3124 0.0246868 0.032714 0.0232891 1 0 1 1 0 0 +EDGE2 3384 1164 -0.123543 0.0327996 -0.0032793 1 0 1 1 0 0 +EDGE2 3384 3105 1.02651 0.0282481 -0.026468 1 0 1 1 0 0 +EDGE2 3384 3145 1.05816 0.00760096 -0.0193792 1 0 1 1 0 0 +EDGE2 3384 3165 0.920065 -0.0330673 -3.14275 1 0 1 1 0 0 +EDGE2 3384 3125 1.02047 0.00308286 -0.0311778 1 0 1 1 0 0 +EDGE2 3384 1185 0.965296 0.019687 0.00134181 1 0 1 1 0 0 +EDGE2 3384 3065 1.07334 -0.0164653 -3.10833 1 0 1 1 0 0 +EDGE2 3384 3085 0.963892 -0.0226219 -3.14366 1 0 1 1 0 0 +EDGE2 3384 1165 0.975989 0.0198155 0.00159853 1 0 1 1 0 0 +EDGE2 3385 3146 0.00862259 -0.977387 -1.57598 1 0 1 1 0 0 +EDGE2 3385 3066 0.126191 -0.970137 -1.5851 1 0 1 1 0 0 +EDGE2 3385 3144 -1.02888 -0.00125336 -0.0047556 1 0 1 1 0 0 +EDGE2 3385 3384 -1.09816 0.0628657 0.0141733 1 0 1 1 0 0 +EDGE2 3385 1184 -1.06122 -0.13439 0.0288116 1 0 1 1 0 0 +EDGE2 3385 3104 -1.00886 0.00691463 0.0270515 1 0 1 1 0 0 +EDGE2 3385 3124 -0.901135 -0.0160304 0.0306381 1 0 1 1 0 0 +EDGE2 3385 1164 -0.902058 -0.0490052 0.0280458 1 0 1 1 0 0 +EDGE2 3385 3166 -0.0296681 0.939099 1.56487 1 0 1 1 0 0 +EDGE2 3385 3105 0.0271069 -0.0783405 -0.0285362 1 0 1 1 0 0 +EDGE2 3385 3145 -0.0236574 0.102769 -0.0409943 1 0 1 1 0 0 +EDGE2 3385 3165 -0.0658902 0.0271132 -3.13792 1 0 1 1 0 0 +EDGE2 3385 3125 -0.0399567 -0.0741837 0.00764049 1 0 1 1 0 0 +EDGE2 3385 1185 -0.0676374 -0.113382 0.0658218 1 0 1 1 0 0 +EDGE2 3385 3065 -0.0758508 0.0516875 -3.15735 1 0 1 1 0 0 +EDGE2 3385 3085 0.0324872 -0.0552882 -3.13961 1 0 1 1 0 0 +EDGE2 3385 1165 0.07216 0.0757195 -0.0166582 1 0 1 1 0 0 +EDGE2 3385 1166 0.0726912 1.06784 1.57142 1 0 1 1 0 0 +EDGE2 3385 3086 -0.00646633 1.02398 1.59629 1 0 1 1 0 0 +EDGE2 3385 3106 -0.0395542 1.07293 1.58272 1 0 1 1 0 0 +EDGE2 3385 3126 0.0584564 1.03999 1.58634 1 0 1 1 0 0 +EDGE2 3385 1186 0.00828319 1.10108 1.57254 1 0 1 1 0 0 +EDGE2 3385 3064 1.02339 0.00925326 -3.16344 1 0 1 1 0 0 +EDGE2 3385 3164 0.981382 -0.0261182 -3.16613 1 0 1 1 0 0 +EDGE2 3385 3084 0.983575 0.0752332 -3.1747 1 0 1 1 0 0 +EDGE2 3386 3147 0.979198 -0.00191151 -0.0241178 1 0 1 1 0 0 +EDGE2 3386 3067 1.01719 0.0469965 -0.0037278 1 0 1 1 0 0 +EDGE2 3386 3146 -0.0665681 -0.0120618 0.0328959 1 0 1 1 0 0 +EDGE2 3386 3066 0.0560213 0.0159442 -0.000924485 1 0 1 1 0 0 +EDGE2 3386 3105 -0.942013 0.0388162 1.56647 1 0 1 1 0 0 +EDGE2 3386 3145 -1.06449 -0.023283 1.57293 1 0 1 1 0 0 +EDGE2 3386 3165 -1.0233 0.0659521 -1.56383 1 0 1 1 0 0 +EDGE2 3386 3385 -0.968205 -0.0259474 1.58191 1 0 1 1 0 0 +EDGE2 3386 3125 -0.945688 -0.0843312 1.57863 1 0 1 1 0 0 +EDGE2 3386 1185 -1.00467 0.0414354 1.55639 1 0 1 1 0 0 +EDGE2 3386 3065 -1.01197 0.00805483 -1.56809 1 0 1 1 0 0 +EDGE2 3386 3085 -1.03291 0.00399728 -1.58586 1 0 1 1 0 0 +EDGE2 3386 1165 -1.04061 -0.0572743 1.54737 1 0 1 1 0 0 +EDGE2 3387 3068 1.01283 -0.0688828 0.0137837 1 0 1 1 0 0 +EDGE2 3387 3148 0.957097 -0.044076 0.00884378 1 0 1 1 0 0 +EDGE2 3387 3147 -0.0409579 -0.0448661 0.0365208 1 0 1 1 0 0 +EDGE2 3387 3067 0.0459688 -0.0412442 -0.0282919 1 0 1 1 0 0 +EDGE2 3387 3146 -1.11214 -0.0636479 -0.0371555 1 0 1 1 0 0 +EDGE2 3387 3386 -0.978474 0.0207532 0.0101403 1 0 1 1 0 0 +EDGE2 3387 3066 -1.06267 0.00946852 -0.00315306 1 0 1 1 0 0 +EDGE2 3388 3149 1.01741 0.00513052 -0.00263658 1 0 1 1 0 0 +EDGE2 3388 3069 0.953841 -0.0663557 -0.0107007 1 0 1 1 0 0 +EDGE2 3388 3068 0.0125628 -0.0415524 -0.00550129 1 0 1 1 0 0 +EDGE2 3388 3148 0.04156 0.036978 -0.0134334 1 0 1 1 0 0 +EDGE2 3388 3147 -1.06541 -0.0793289 -0.00206627 1 0 1 1 0 0 +EDGE2 3388 3387 -0.88978 -0.0632856 -0.0367832 1 0 1 1 0 0 +EDGE2 3388 3067 -1.02806 -0.0753437 0.0291176 1 0 1 1 0 0 +EDGE2 3389 3070 0.985713 0.0301418 0.0166064 1 0 1 1 0 0 +EDGE2 3389 3150 0.978478 0.00506627 -0.000212067 1 0 1 1 0 0 +EDGE2 3389 3149 -0.0156898 -0.0193607 0.000259961 1 0 1 1 0 0 +EDGE2 3389 3069 0.0357497 -0.0361575 -0.0277732 1 0 1 1 0 0 +EDGE2 3389 3068 -0.875271 0.129749 -0.0169403 1 0 1 1 0 0 +EDGE2 3389 3148 -1.00078 0.0508266 0.0106319 1 0 1 1 0 0 +EDGE2 3389 3388 -1.05834 -0.0128343 -0.00632251 1 0 1 1 0 0 +EDGE2 3390 3070 -0.0655428 0.0525738 0.00580457 1 0 1 1 0 0 +EDGE2 3390 3150 -0.0153617 0.0387015 -0.0172295 1 0 1 1 0 0 +EDGE2 3390 3149 -1.05565 -0.0797324 0.00424707 1 0 1 1 0 0 +EDGE2 3390 3389 -0.950407 0.00978582 0.012621 1 0 1 1 0 0 +EDGE2 3390 3069 -1.0659 0.0541445 0.0197337 1 0 1 1 0 0 +EDGE2 3390 3151 -0.0358738 1.0071 1.60285 1 0 1 1 0 0 +EDGE2 3390 3071 0.00866373 0.949157 1.59154 1 0 1 1 0 0 +EDGE2 3391 3070 -1.00036 0.0284318 1.59531 1 0 1 1 0 0 +EDGE2 3391 3390 -1.02752 0.0206685 1.53919 1 0 1 1 0 0 +EDGE2 3391 3150 -1.04363 -0.0437626 1.54927 1 0 1 1 0 0 +EDGE2 3392 3391 -0.975534 -0.0295678 0.0317841 1 0 1 1 0 0 +EDGE2 3393 3392 -0.919601 -0.0825241 0.0291125 1 0 1 1 0 0 +EDGE2 3394 855 1.05589 -0.0951208 -3.12376 1 0 1 1 0 0 +EDGE2 3394 895 0.995904 -0.0825272 -3.14023 1 0 1 1 0 0 +EDGE2 3394 915 0.964833 -0.0472617 -3.17335 1 0 1 1 0 0 +EDGE2 3394 835 0.942947 -0.0140762 -3.16427 1 0 1 1 0 0 +EDGE2 3394 3393 -0.991219 0.0249725 -0.00143127 1 0 1 1 0 0 +EDGE2 3395 916 0.0917136 1.02734 1.5916 1 0 1 1 0 0 +EDGE2 3395 894 1.01624 0.0373565 -3.13831 1 0 1 1 0 0 +EDGE2 3395 914 1.02075 0.000806427 -3.14319 1 0 1 1 0 0 +EDGE2 3395 834 0.968686 -0.0933172 -3.13211 1 0 1 1 0 0 +EDGE2 3395 854 1.07587 -0.00137091 -3.13431 1 0 1 1 0 0 +EDGE2 3395 855 -0.0293184 -0.0207512 -3.14987 1 0 1 1 0 0 +EDGE2 3395 895 -0.0527213 0.0530651 -3.13454 1 0 1 1 0 0 +EDGE2 3395 915 0.0165954 -0.11078 -3.16952 1 0 1 1 0 0 +EDGE2 3395 835 -0.00686329 0.0216802 -3.13933 1 0 1 1 0 0 +EDGE2 3395 3394 -0.95666 -0.0109031 0.00205358 1 0 1 1 0 0 +EDGE2 3395 856 -0.0236701 -1.02243 -1.57863 1 0 1 1 0 0 +EDGE2 3395 896 -0.0250743 -0.975629 -1.57707 1 0 1 1 0 0 +EDGE2 3395 836 0.0250626 -1.0571 -1.5613 1 0 1 1 0 0 +EDGE2 3396 3395 -1.06217 -0.0606417 -1.5533 1 0 1 1 0 0 +EDGE2 3396 917 1.00686 -0.0457794 0.0150496 1 0 1 1 0 0 +EDGE2 3396 916 -0.00528224 0.0225196 0.0070434 1 0 1 1 0 0 +EDGE2 3396 855 -0.95565 0.0119589 1.58393 1 0 1 1 0 0 +EDGE2 3396 895 -1.08253 -0.0140715 1.56205 1 0 1 1 0 0 +EDGE2 3396 915 -0.897175 0.00395089 1.57673 1 0 1 1 0 0 +EDGE2 3396 835 -1.02432 0.0374883 1.5754 1 0 1 1 0 0 +EDGE2 3397 918 0.946631 -0.0529941 0.00313012 1 0 1 1 0 0 +EDGE2 3397 917 -0.0189141 -0.128986 -0.00474872 1 0 1 1 0 0 +EDGE2 3397 3396 -0.9727 -0.00456047 -0.0250277 1 0 1 1 0 0 +EDGE2 3397 916 -0.904153 -0.0135614 0.0279751 1 0 1 1 0 0 +EDGE2 3398 919 1.0469 0.0180062 0.0125369 1 0 1 1 0 0 +EDGE2 3398 918 0.00343091 -0.000567336 -0.00584432 1 0 1 1 0 0 +EDGE2 3398 917 -1.12218 -0.0177975 -0.00817494 1 0 1 1 0 0 +EDGE2 3398 3397 -0.981991 0.028546 -0.0285057 1 0 1 1 0 0 +EDGE2 3399 920 1.03134 -0.0696508 0.0398266 1 0 1 1 0 0 +EDGE2 3399 680 0.999611 -0.0218247 -3.13041 1 0 1 1 0 0 +EDGE2 3399 919 0.0301405 -0.050986 0.0372612 1 0 1 1 0 0 +EDGE2 3399 918 -1.10806 0.0535623 0.0294929 1 0 1 1 0 0 +EDGE2 3399 3398 -0.983723 -0.00390871 -0.0120007 1 0 1 1 0 0 +EDGE2 3400 921 0.0516724 0.966541 1.55394 1 0 1 1 0 0 +EDGE2 3400 679 0.911368 0.0857273 -3.11929 1 0 1 1 0 0 +EDGE2 3400 681 0.100049 -0.950653 -1.58861 1 0 1 1 0 0 +EDGE2 3400 920 -0.0367873 0.0465918 -0.0299306 1 0 1 1 0 0 +EDGE2 3400 680 -0.0644002 -0.096308 -3.15343 1 0 1 1 0 0 +EDGE2 3400 919 -0.908673 0.0244265 0.0165659 1 0 1 1 0 0 +EDGE2 3400 3399 -0.993273 -0.0397095 -0.00217239 1 0 1 1 0 0 +EDGE2 3401 921 0.0166609 0.00821275 -0.00285809 1 0 1 1 0 0 +EDGE2 3401 920 -0.954876 0.0264056 -1.54657 1 0 1 1 0 0 +EDGE2 3401 3400 -0.998462 -0.00417744 -1.53801 1 0 1 1 0 0 +EDGE2 3401 680 -1.03587 0.0784543 1.55646 1 0 1 1 0 0 +EDGE2 3401 922 1.0714 -0.0536678 0.0346021 1 0 1 1 0 0 +EDGE2 3402 921 -1.00469 0.00159018 0.0126598 1 0 1 1 0 0 +EDGE2 3402 3401 -1.06736 0.0233989 -0.00949053 1 0 1 1 0 0 +EDGE2 3402 922 -0.0288594 0.0677877 0.00161051 1 0 1 1 0 0 +EDGE2 3402 923 0.947225 -0.00791903 0.0159537 1 0 1 1 0 0 +EDGE2 3403 3402 -0.959091 0.0393238 0.00701946 1 0 1 1 0 0 +EDGE2 3403 922 -0.974066 -0.0121602 0.0487231 1 0 1 1 0 0 +EDGE2 3403 923 -0.0528692 0.0273822 0.0177115 1 0 1 1 0 0 +EDGE2 3403 924 1.00016 -0.0130555 0.0424957 1 0 1 1 0 0 +EDGE2 3404 923 -1.04428 -0.0284913 -0.00245025 1 0 1 1 0 0 +EDGE2 3404 3403 -1.0094 -0.0638845 0.0142207 1 0 1 1 0 0 +EDGE2 3404 924 0.0866883 -0.0340977 0.03593 1 0 1 1 0 0 +EDGE2 3404 925 1.09536 -0.0517845 -0.0253017 1 0 1 1 0 0 +EDGE2 3405 926 -0.0210083 -1.01816 -1.5877 1 0 1 1 0 0 +EDGE2 3405 924 -0.941447 0.0170879 0.0346982 1 0 1 1 0 0 +EDGE2 3405 3404 -1.06358 0.0597683 0.0197026 1 0 1 1 0 0 +EDGE2 3405 925 -0.028863 -0.0480115 -0.0317395 1 0 1 1 0 0 +EDGE2 3406 925 -0.944971 -0.0473575 -1.58339 1 0 1 1 0 0 +EDGE2 3406 3405 -0.954663 -0.0305872 -1.57771 1 0 1 1 0 0 +EDGE2 3407 3406 -1.0782 -0.0230179 -0.00998839 1 0 1 1 0 0 +EDGE2 3408 3407 -1.04682 0.0294808 0.0345137 1 0 1 1 0 0 +EDGE2 3409 3408 -0.945347 0.08413 -0.036064 1 0 1 1 0 0 +EDGE2 3409 3070 1.03033 -0.100961 -3.15284 1 0 1 1 0 0 +EDGE2 3409 3390 0.967326 0.028541 -3.11686 1 0 1 1 0 0 +EDGE2 3409 3150 0.99244 0.0415025 -3.15687 1 0 1 1 0 0 +EDGE2 3410 3409 -1.04287 0.0219909 -0.00668524 1 0 1 1 0 0 +EDGE2 3410 3391 0.0172617 0.991154 1.54432 1 0 1 1 0 0 +EDGE2 3410 3070 -0.0253029 -0.0157125 -3.16031 1 0 1 1 0 0 +EDGE2 3410 3390 0.0234349 -0.0347723 -3.13382 1 0 1 1 0 0 +EDGE2 3410 3150 -0.0688534 -0.0665098 -3.09966 1 0 1 1 0 0 +EDGE2 3410 3149 1.02954 0.0210792 -3.11641 1 0 1 1 0 0 +EDGE2 3410 3389 1.0473 0.118679 -3.15376 1 0 1 1 0 0 +EDGE2 3410 3069 0.986534 0.0666778 -3.12873 1 0 1 1 0 0 +EDGE2 3410 3151 0.000607088 -1.00455 -1.58561 1 0 1 1 0 0 +EDGE2 3410 3071 -0.0695852 -0.980599 -1.5793 1 0 1 1 0 0 +EDGE2 3411 3392 1.00931 -0.0585103 0.0265679 1 0 1 1 0 0 +EDGE2 3411 3391 0.0608582 0.038445 -0.00785496 1 0 1 1 0 0 +EDGE2 3411 3070 -0.957068 0.0186945 1.58982 1 0 1 1 0 0 +EDGE2 3411 3390 -0.973252 0.0206603 1.58062 1 0 1 1 0 0 +EDGE2 3411 3410 -1.048 0.0639341 -1.57307 1 0 1 1 0 0 +EDGE2 3411 3150 -1.00834 0.0182676 1.59458 1 0 1 1 0 0 +EDGE2 3412 3393 0.958321 0.068769 -0.0190362 1 0 1 1 0 0 +EDGE2 3412 3392 0.0382011 0.0564917 0.0231482 1 0 1 1 0 0 +EDGE2 3412 3411 -0.962864 0.0328067 0.00857779 1 0 1 1 0 0 +EDGE2 3412 3391 -0.944242 0.0172037 0.0183508 1 0 1 1 0 0 +EDGE2 3413 3394 1.04721 0.0368281 0.0396975 1 0 1 1 0 0 +EDGE2 3413 3393 0.113225 0.0401067 0.0297929 1 0 1 1 0 0 +EDGE2 3413 3412 -0.928249 0.0186368 -0.00535374 1 0 1 1 0 0 +EDGE2 3413 3392 -1.07024 -0.00887795 -0.00580409 1 0 1 1 0 0 +EDGE2 3414 3395 1.00163 -0.00906712 -0.000661147 1 0 1 1 0 0 +EDGE2 3414 855 0.974561 -0.00530006 -3.12066 1 0 1 1 0 0 +EDGE2 3414 895 1.00226 -0.0699354 -3.17349 1 0 1 1 0 0 +EDGE2 3414 915 0.92459 -0.000104778 -3.15331 1 0 1 1 0 0 +EDGE2 3414 835 0.916932 0.0586718 -3.11248 1 0 1 1 0 0 +EDGE2 3414 3394 0.0155556 -0.0326351 -0.00923723 1 0 1 1 0 0 +EDGE2 3414 3413 -0.99944 -0.0163876 -0.0115907 1 0 1 1 0 0 +EDGE2 3414 3393 -1.02968 -0.0874383 -0.00238976 1 0 1 1 0 0 +EDGE2 3415 3395 0.0335354 -0.0833286 -0.0147235 1 0 1 1 0 0 +EDGE2 3415 3396 -0.0149579 0.993967 1.57936 1 0 1 1 0 0 +EDGE2 3415 916 -0.0243635 0.989465 1.5774 1 0 1 1 0 0 +EDGE2 3415 894 1.01899 -0.0027424 -3.14843 1 0 1 1 0 0 +EDGE2 3415 914 1.00789 -0.000950768 -3.14274 1 0 1 1 0 0 +EDGE2 3415 834 0.958653 -0.0150604 -3.16819 1 0 1 1 0 0 +EDGE2 3415 854 1.06012 0.0646523 -3.13795 1 0 1 1 0 0 +EDGE2 3415 855 0.00489657 -0.0187569 -3.14595 1 0 1 1 0 0 +EDGE2 3415 895 0.0112048 -0.0148633 -3.13687 1 0 1 1 0 0 +EDGE2 3415 915 -0.00877257 0.0287693 -3.12133 1 0 1 1 0 0 +EDGE2 3415 835 -0.000760634 0.0297685 -3.12132 1 0 1 1 0 0 +EDGE2 3415 3414 -1.00536 0.0206098 -0.0149036 1 0 1 1 0 0 +EDGE2 3415 3394 -0.915787 0.010647 0.00363379 1 0 1 1 0 0 +EDGE2 3415 856 -0.0356257 -0.953368 -1.57527 1 0 1 1 0 0 +EDGE2 3415 896 0.00067825 -1.00225 -1.56232 1 0 1 1 0 0 +EDGE2 3415 836 -0.0780769 -0.994257 -1.55579 1 0 1 1 0 0 +EDGE2 3416 3395 -1.01811 0.0619563 1.59864 1 0 1 1 0 0 +EDGE2 3416 3415 -1.01705 -0.108217 1.55665 1 0 1 1 0 0 +EDGE2 3416 855 -0.917347 0.00190554 -1.55477 1 0 1 1 0 0 +EDGE2 3416 895 -0.974247 -0.0874286 -1.54859 1 0 1 1 0 0 +EDGE2 3416 915 -0.987317 -0.0327778 -1.57122 1 0 1 1 0 0 +EDGE2 3416 835 -0.996786 -0.0505478 -1.56362 1 0 1 1 0 0 +EDGE2 3416 856 -0.0212165 -0.0523759 0.0112629 1 0 1 1 0 0 +EDGE2 3416 896 0.09783 -0.0831 9.49711e-06 1 0 1 1 0 0 +EDGE2 3416 836 0.0133453 -0.0993376 0.0340159 1 0 1 1 0 0 +EDGE2 3416 857 0.963773 -0.0612107 0.00721422 1 0 1 1 0 0 +EDGE2 3416 897 0.955328 0.00737658 -0.00943947 1 0 1 1 0 0 +EDGE2 3416 837 1.1148 -0.0702789 0.019091 1 0 1 1 0 0 +EDGE2 3417 856 -0.938126 0.00329356 -0.0180148 1 0 1 1 0 0 +EDGE2 3417 896 -1.09105 0.0658894 0.0319191 1 0 1 1 0 0 +EDGE2 3417 3416 -0.959563 0.058044 -0.0258181 1 0 1 1 0 0 +EDGE2 3417 836 -0.97646 -0.0352421 0.00077562 1 0 1 1 0 0 +EDGE2 3417 857 -0.0975683 0.0240729 0.0119821 1 0 1 1 0 0 +EDGE2 3417 897 0.0434605 0.036468 0.00658343 1 0 1 1 0 0 +EDGE2 3417 837 -0.0649538 -0.0225943 0.0349222 1 0 1 1 0 0 +EDGE2 3417 858 1.05523 -0.0630876 0.0151077 1 0 1 1 0 0 +EDGE2 3417 898 1.01931 -0.000229994 -0.0186691 1 0 1 1 0 0 +EDGE2 3417 838 1.04189 -0.0425267 0.00433707 1 0 1 1 0 0 +EDGE2 3418 857 -0.931163 -0.070284 -0.0108823 1 0 1 1 0 0 +EDGE2 3418 897 -1.02875 -0.0226672 0.0152638 1 0 1 1 0 0 +EDGE2 3418 3417 -0.941576 -0.0673613 -0.0416441 1 0 1 1 0 0 +EDGE2 3418 837 -1.0095 0.0231822 0.0231996 1 0 1 1 0 0 +EDGE2 3418 858 0.118202 -0.0125383 -0.0241214 1 0 1 1 0 0 +EDGE2 3418 898 -0.0720511 0.0293633 0.0132059 1 0 1 1 0 0 +EDGE2 3418 838 0.0370626 0.0227169 0.0141528 1 0 1 1 0 0 +EDGE2 3418 839 0.970588 -0.0426448 0.0097055 1 0 1 1 0 0 +EDGE2 3418 899 1.00655 0.0997243 -0.0145246 1 0 1 1 0 0 +EDGE2 3418 859 1.03413 -0.0323568 -0.0174621 1 0 1 1 0 0 +EDGE2 3419 858 -1.01694 -0.07218 0.0284997 1 0 1 1 0 0 +EDGE2 3419 898 -0.996181 -0.0416407 -0.0021715 1 0 1 1 0 0 +EDGE2 3419 3418 -0.988597 -0.0861881 -0.0137935 1 0 1 1 0 0 +EDGE2 3419 838 -1.04713 -0.0355042 0.0196931 1 0 1 1 0 0 +EDGE2 3419 839 0.0100692 -0.0440457 -0.00320087 1 0 1 1 0 0 +EDGE2 3419 899 0.00784315 0.0244213 0.0195952 1 0 1 1 0 0 +EDGE2 3419 859 0.0516034 0.0140924 -0.00547916 1 0 1 1 0 0 +EDGE2 3419 1160 1.03733 -0.0484039 -3.16843 1 0 1 1 0 0 +EDGE2 3419 3140 1.04667 -0.0402389 -3.13093 1 0 1 1 0 0 +EDGE2 3419 3380 0.909023 0.0608127 -3.16417 1 0 1 1 0 0 +EDGE2 3419 1200 0.909034 0.00742414 -3.14956 1 0 1 1 0 0 +EDGE2 3419 3100 0.961442 0.0168586 -3.12084 1 0 1 1 0 0 +EDGE2 3419 3120 1.02306 0.00949181 -3.15757 1 0 1 1 0 0 +EDGE2 3419 1180 1.00495 -0.0438206 -3.16261 1 0 1 1 0 0 +EDGE2 3419 900 0.981056 0.0504861 0.0404919 1 0 1 1 0 0 +EDGE2 3419 840 0.95884 0.00868217 0.0130478 1 0 1 1 0 0 +EDGE2 3419 860 0.995587 -0.0458813 -0.0361054 1 0 1 1 0 0 +EDGE2 3420 839 -0.951134 0.00374279 0.0160466 1 0 1 1 0 0 +EDGE2 3420 899 -0.940193 -0.00434285 -0.00439324 1 0 1 1 0 0 +EDGE2 3420 3419 -0.978916 -0.054494 -0.00073043 1 0 1 1 0 0 +EDGE2 3420 859 -0.973969 -0.018627 -0.0143369 1 0 1 1 0 0 +EDGE2 3420 841 -0.0470126 1.01074 1.55056 1 0 1 1 0 0 +EDGE2 3420 901 0.000263228 0.951288 1.56535 1 0 1 1 0 0 +EDGE2 3420 1201 -0.0466443 1.0513 1.56865 1 0 1 1 0 0 +EDGE2 3420 861 0.0568972 0.988281 1.59226 1 0 1 1 0 0 +EDGE2 3420 1160 0.0355278 0.0137208 -3.15114 1 0 1 1 0 0 +EDGE2 3420 3140 -0.0464818 -0.000871368 -3.17264 1 0 1 1 0 0 +EDGE2 3420 3380 -0.0752823 -0.0152428 -3.12385 1 0 1 1 0 0 +EDGE2 3420 1200 -0.0375089 -0.063106 -3.14619 1 0 1 1 0 0 +EDGE2 3420 3100 -0.076763 -0.0365576 -3.13048 1 0 1 1 0 0 +EDGE2 3420 3120 0.0273833 0.0034575 -3.16732 1 0 1 1 0 0 +EDGE2 3420 1180 0.074074 0.0152756 -3.17532 1 0 1 1 0 0 +EDGE2 3420 900 0.0681771 -0.0362947 0.0080619 1 0 1 1 0 0 +EDGE2 3420 840 -0.0366999 -0.0349461 -0.0234009 1 0 1 1 0 0 +EDGE2 3420 860 -0.097476 0.0542482 -0.0278202 1 0 1 1 0 0 +EDGE2 3420 3101 -0.0545344 -1.00842 -1.58633 1 0 1 1 0 0 +EDGE2 3420 3141 -0.00245026 -1.02948 -1.59087 1 0 1 1 0 0 +EDGE2 3420 3381 -0.0333248 -1.00518 -1.56591 1 0 1 1 0 0 +EDGE2 3420 3121 0.0544155 -1.07848 -1.55705 1 0 1 1 0 0 +EDGE2 3420 1161 -0.0781521 -1.04966 -1.59614 1 0 1 1 0 0 +EDGE2 3420 1181 -0.0660221 -1.03591 -1.55818 1 0 1 1 0 0 +EDGE2 3420 3119 1.02839 -0.0673935 -3.16637 1 0 1 1 0 0 +EDGE2 3420 3379 0.984256 -0.0402639 -3.15172 1 0 1 1 0 0 +EDGE2 3420 3139 1.03325 -0.0219349 -3.13608 1 0 1 1 0 0 +EDGE2 3420 1179 1.02706 -0.0613096 -3.15889 1 0 1 1 0 0 +EDGE2 3420 1199 1.01579 -0.0952888 -3.15134 1 0 1 1 0 0 +EDGE2 3420 3099 0.967598 0.00286941 -3.16544 1 0 1 1 0 0 +EDGE2 3420 1159 1.04484 0.0302547 -3.14806 1 0 1 1 0 0 +EDGE2 3421 902 0.988088 -0.0380699 -0.0306329 1 0 1 1 0 0 +EDGE2 3421 1202 0.980426 -0.00524915 0.0466438 1 0 1 1 0 0 +EDGE2 3421 842 1.03562 0.0361822 0.0112182 1 0 1 1 0 0 +EDGE2 3421 862 1.00659 -0.0499494 0.014398 1 0 1 1 0 0 +EDGE2 3421 841 -0.00514989 0.0485977 -0.0232312 1 0 1 1 0 0 +EDGE2 3421 901 0.0230596 -0.0423502 -0.00480281 1 0 1 1 0 0 +EDGE2 3421 1201 -0.00212189 -0.0673372 0.0363816 1 0 1 1 0 0 +EDGE2 3421 861 -0.0178974 -0.0456016 -0.0188891 1 0 1 1 0 0 +EDGE2 3421 1160 -1.02239 0.0530356 1.60255 1 0 1 1 0 0 +EDGE2 3421 3140 -1.04375 -0.0153639 1.59511 1 0 1 1 0 0 +EDGE2 3421 3420 -1.01439 0.00851327 -1.59964 1 0 1 1 0 0 +EDGE2 3421 3380 -0.905479 -0.0175896 1.5787 1 0 1 1 0 0 +EDGE2 3421 1200 -1.0023 -0.0863572 1.58859 1 0 1 1 0 0 +EDGE2 3421 3100 -0.954335 0.080196 1.56825 1 0 1 1 0 0 +EDGE2 3421 3120 -1.02426 0.0653609 1.55935 1 0 1 1 0 0 +EDGE2 3421 1180 -0.936912 0.0194757 1.58064 1 0 1 1 0 0 +EDGE2 3421 900 -0.95965 0.0361828 -1.58841 1 0 1 1 0 0 +EDGE2 3421 840 -1.03913 0.0478977 -1.57383 1 0 1 1 0 0 +EDGE2 3421 860 -0.970152 -0.0509141 -1.54202 1 0 1 1 0 0 +EDGE2 3422 863 1.01054 -0.0020507 0.00431013 1 0 1 1 0 0 +EDGE2 3422 903 1.07183 -0.00419764 -0.0074014 1 0 1 1 0 0 +EDGE2 3422 1203 1.01173 -0.0492044 -0.00192129 1 0 1 1 0 0 +EDGE2 3422 843 0.987192 0.00429477 0.00841768 1 0 1 1 0 0 +EDGE2 3422 902 -0.0316155 0.00472468 -0.019904 1 0 1 1 0 0 +EDGE2 3422 1202 0.0788413 0.0359372 0.0314754 1 0 1 1 0 0 +EDGE2 3422 842 -0.0783874 0.0545358 -0.00151318 1 0 1 1 0 0 +EDGE2 3422 862 0.040759 0.0154551 -0.00348702 1 0 1 1 0 0 +EDGE2 3422 841 -1.00395 0.00284504 -0.0123468 1 0 1 1 0 0 +EDGE2 3422 901 -1.04645 -0.0205524 0.0051275 1 0 1 1 0 0 +EDGE2 3422 1201 -0.921715 0.0958611 -0.0355517 1 0 1 1 0 0 +EDGE2 3422 3421 -1.0341 -0.00305788 -0.00764809 1 0 1 1 0 0 +EDGE2 3422 861 -0.976019 -0.031421 0.0143634 1 0 1 1 0 0 +EDGE2 3423 864 0.950513 -0.0179339 -0.0157424 1 0 1 1 0 0 +EDGE2 3423 1204 1.05766 0.0137123 0.0289128 1 0 1 1 0 0 +EDGE2 3423 904 0.942828 -0.0605994 -0.0383919 1 0 1 1 0 0 +EDGE2 3423 844 0.982005 -0.115191 0.00336414 1 0 1 1 0 0 +EDGE2 3423 863 -0.0168527 0.0200283 -0.054105 1 0 1 1 0 0 +EDGE2 3423 903 -0.000914666 0.00940549 0.0218782 1 0 1 1 0 0 +EDGE2 3423 1203 0.0484729 -0.00964241 0.015398 1 0 1 1 0 0 +EDGE2 3423 843 0.0376749 -0.0458516 0.0258665 1 0 1 1 0 0 +EDGE2 3423 902 -1.01287 -0.0443071 -0.0141583 1 0 1 1 0 0 +EDGE2 3423 3422 -0.999929 0.0277096 -0.019067 1 0 1 1 0 0 +EDGE2 3423 1202 -0.938782 -0.00879898 0.0112707 1 0 1 1 0 0 +EDGE2 3423 842 -0.948147 -0.054405 0.02446 1 0 1 1 0 0 +EDGE2 3423 862 -0.946711 -0.00521558 -0.00534747 1 0 1 1 0 0 +EDGE2 3424 865 0.964272 -0.120359 0.00586776 1 0 1 1 0 0 +EDGE2 3424 3225 0.983492 0.0777784 -3.1104 1 0 1 1 0 0 +EDGE2 3424 3365 1.03028 0.00387206 -3.13193 1 0 1 1 0 0 +EDGE2 3424 1205 0.940413 0.0139176 0.0260468 1 0 1 1 0 0 +EDGE2 3424 3205 0.967455 -0.0934466 -3.16412 1 0 1 1 0 0 +EDGE2 3424 905 0.916867 0.0910882 -0.0222611 1 0 1 1 0 0 +EDGE2 3424 864 -0.0214451 0.0590892 -0.00199847 1 0 1 1 0 0 +EDGE2 3424 705 0.973571 0.0850233 -3.14505 1 0 1 1 0 0 +EDGE2 3424 825 1.01126 -0.0532799 -3.16843 1 0 1 1 0 0 +EDGE2 3424 845 1.0298 -0.0182968 -0.0262285 1 0 1 1 0 0 +EDGE2 3424 1204 -0.070166 -0.043058 0.0194779 1 0 1 1 0 0 +EDGE2 3424 904 0.016583 0.0325368 0.0149566 1 0 1 1 0 0 +EDGE2 3424 3423 -1.05681 -0.0388449 -0.0048856 1 0 1 1 0 0 +EDGE2 3424 844 0.0605233 -0.0135555 0.0119435 1 0 1 1 0 0 +EDGE2 3424 863 -0.979578 -0.0186143 0.00785277 1 0 1 1 0 0 +EDGE2 3424 903 -1.1078 -0.0114512 -0.00947497 1 0 1 1 0 0 +EDGE2 3424 1203 -0.950453 0.068451 0.00152038 1 0 1 1 0 0 +EDGE2 3424 843 -1.06276 -0.00342097 0.022149 1 0 1 1 0 0 +EDGE2 3425 3364 1.01613 0.0162807 -3.16821 1 0 1 1 0 0 +EDGE2 3425 824 0.968438 -0.0679913 -3.13684 1 0 1 1 0 0 +EDGE2 3425 3204 1.0672 -0.0514963 -3.14345 1 0 1 1 0 0 +EDGE2 3425 3224 1.04091 -0.00491291 -3.13732 1 0 1 1 0 0 +EDGE2 3425 704 1.04304 0.0072369 -3.16717 1 0 1 1 0 0 +EDGE2 3425 865 0.0244687 -0.0166462 0.0348115 1 0 1 1 0 0 +EDGE2 3425 3225 -0.0533394 -0.0980309 -3.14316 1 0 1 1 0 0 +EDGE2 3425 826 -0.0379172 0.946253 1.55953 1 0 1 1 0 0 +EDGE2 3425 866 0.0932579 0.967493 1.56601 1 0 1 1 0 0 +EDGE2 3425 906 -0.022526 0.94467 1.59037 1 0 1 1 0 0 +EDGE2 3425 846 -0.0522809 1.00779 1.57687 1 0 1 1 0 0 +EDGE2 3425 3365 -4.64401e-05 0.0208005 -3.10227 1 0 1 1 0 0 +EDGE2 3425 1205 0.0289469 0.0492286 0.000552931 1 0 1 1 0 0 +EDGE2 3425 3205 -0.106195 0.0189779 -3.09128 1 0 1 1 0 0 +EDGE2 3425 905 -0.0963274 -0.0129576 -0.0128514 1 0 1 1 0 0 +EDGE2 3425 864 -1.09294 0.013769 -0.00070046 1 0 1 1 0 0 +EDGE2 3425 705 0.0118128 -0.0044498 -3.14806 1 0 1 1 0 0 +EDGE2 3425 825 0.0231294 -0.0648478 -3.15271 1 0 1 1 0 0 +EDGE2 3425 845 -0.0396596 -0.0262796 0.0138996 1 0 1 1 0 0 +EDGE2 3425 1204 -0.973439 0.0563276 0.0113187 1 0 1 1 0 0 +EDGE2 3425 3424 -1.05282 0.0727704 -0.0198073 1 0 1 1 0 0 +EDGE2 3425 904 -1.0048 0.0198336 0.0190399 1 0 1 1 0 0 +EDGE2 3425 844 -0.944961 0.0165658 -5.49212e-05 1 0 1 1 0 0 +EDGE2 3425 1206 0.0215809 -0.974352 -1.53189 1 0 1 1 0 0 +EDGE2 3425 3226 -0.0883788 -0.919252 -1.60586 1 0 1 1 0 0 +EDGE2 3425 3366 0.018927 -1.04188 -1.57231 1 0 1 1 0 0 +EDGE2 3425 3206 -0.0175665 -1.02333 -1.56177 1 0 1 1 0 0 +EDGE2 3425 706 0.0945982 -1.0661 -1.56611 1 0 1 1 0 0 +EDGE2 3426 865 -0.945427 -0.0409499 -1.55553 1 0 1 1 0 0 +EDGE2 3426 847 1.01768 0.0361553 -0.0437981 1 0 1 1 0 0 +EDGE2 3426 867 0.962168 0.00181792 0.00476779 1 0 1 1 0 0 +EDGE2 3426 907 0.956282 0.0353351 0.0199791 1 0 1 1 0 0 +EDGE2 3426 827 0.962801 -0.0303619 0.0114724 1 0 1 1 0 0 +EDGE2 3426 3225 -1.03751 0.0188429 1.58978 1 0 1 1 0 0 +EDGE2 3426 826 0.0736719 -0.00899939 0.0152512 1 0 1 1 0 0 +EDGE2 3426 866 -0.0502787 -0.0110406 -0.0114562 1 0 1 1 0 0 +EDGE2 3426 906 -0.0358199 -0.0136902 0.0113331 1 0 1 1 0 0 +EDGE2 3426 846 0.0770213 -0.0069397 -0.00775435 1 0 1 1 0 0 +EDGE2 3426 3425 -1.11778 0.0203819 -1.58231 1 0 1 1 0 0 +EDGE2 3426 3365 -0.97803 0.0762911 1.55762 1 0 1 1 0 0 +EDGE2 3426 1205 -1.04342 0.090101 -1.57114 1 0 1 1 0 0 +EDGE2 3426 3205 -0.986631 -0.00953406 1.5885 1 0 1 1 0 0 +EDGE2 3426 905 -0.899967 -0.00156728 -1.59504 1 0 1 1 0 0 +EDGE2 3426 705 -1.08591 0.0258625 1.52733 1 0 1 1 0 0 +EDGE2 3426 825 -0.995805 0.00907461 1.56235 1 0 1 1 0 0 +EDGE2 3426 845 -1.06968 0.0742964 -1.54801 1 0 1 1 0 0 +EDGE2 3427 908 1.05374 -0.0146174 -0.00811859 1 0 1 1 0 0 +EDGE2 3427 828 1.03879 0.0105919 -0.0370506 1 0 1 1 0 0 +EDGE2 3427 848 1.00318 -0.0660323 -0.0105601 1 0 1 1 0 0 +EDGE2 3427 868 0.996779 0.0459858 -0.0140271 1 0 1 1 0 0 +EDGE2 3427 847 -0.0380165 -0.0334161 -0.05581 1 0 1 1 0 0 +EDGE2 3427 867 0.0620566 -0.0442485 -0.0192459 1 0 1 1 0 0 +EDGE2 3427 907 0.0619665 0.0251213 0.00357816 1 0 1 1 0 0 +EDGE2 3427 827 0.0192194 -0.0278295 0.00204497 1 0 1 1 0 0 +EDGE2 3427 826 -1.05332 -0.008591 0.0108303 1 0 1 1 0 0 +EDGE2 3427 866 -0.992048 -0.0105094 0.0168173 1 0 1 1 0 0 +EDGE2 3427 906 -0.90463 -0.0113476 -0.0314726 1 0 1 1 0 0 +EDGE2 3427 3426 -1.00531 -0.108404 0.0342261 1 0 1 1 0 0 +EDGE2 3427 846 -0.920565 0.0419081 -0.0237912 1 0 1 1 0 0 +EDGE2 3428 908 0.0231079 0.0890665 0.017798 1 0 1 1 0 0 +EDGE2 3428 869 1.00472 -0.0518443 -0.0148624 1 0 1 1 0 0 +EDGE2 3428 909 0.995376 0.0156743 0.0129955 1 0 1 1 0 0 +EDGE2 3428 829 0.943354 -0.0309285 0.0241399 1 0 1 1 0 0 +EDGE2 3428 849 0.981378 0.024805 0.0156077 1 0 1 1 0 0 +EDGE2 3428 3427 -0.947705 -0.0711547 0.0102821 1 0 1 1 0 0 +EDGE2 3428 828 -0.0308747 0.0488741 0.000702468 1 0 1 1 0 0 +EDGE2 3428 848 0.0129269 -0.0269783 0.0163673 1 0 1 1 0 0 +EDGE2 3428 868 0.0382624 0.0977362 0.0233879 1 0 1 1 0 0 +EDGE2 3428 847 -0.998706 0.0163183 -0.0304168 1 0 1 1 0 0 +EDGE2 3428 867 -1.04607 -0.0389746 0.0118622 1 0 1 1 0 0 +EDGE2 3428 907 -0.972429 -0.0738832 -0.0215067 1 0 1 1 0 0 +EDGE2 3428 827 -0.986558 -0.0479678 0.0189306 1 0 1 1 0 0 +EDGE2 3429 908 -1.05439 0.0578386 0.014729 1 0 1 1 0 0 +EDGE2 3429 690 0.93859 -0.0585677 -3.15689 1 0 1 1 0 0 +EDGE2 3429 910 1.01482 0.0316084 -0.0120128 1 0 1 1 0 0 +EDGE2 3429 850 1.0535 0.0565767 0.00528687 1 0 1 1 0 0 +EDGE2 3429 870 1.02046 0.0517409 0.0223423 1 0 1 1 0 0 +EDGE2 3429 890 0.962349 -0.00209133 -3.11868 1 0 1 1 0 0 +EDGE2 3429 830 1.02633 0.0923208 -0.0129117 1 0 1 1 0 0 +EDGE2 3429 869 -0.0154185 -0.0723601 -0.000520814 1 0 1 1 0 0 +EDGE2 3429 909 0.0917995 -0.0103072 -0.00940717 1 0 1 1 0 0 +EDGE2 3429 829 -0.101582 0.054733 -0.00955048 1 0 1 1 0 0 +EDGE2 3429 849 -0.0352253 0.0423247 0.0196264 1 0 1 1 0 0 +EDGE2 3429 3428 -1.02822 -0.0383298 0.0259205 1 0 1 1 0 0 +EDGE2 3429 828 -1.02698 -0.00785402 0.0083193 1 0 1 1 0 0 +EDGE2 3429 848 -0.991269 -0.0681033 0.0123905 1 0 1 1 0 0 +EDGE2 3429 868 -0.973051 0.0114225 -0.0153894 1 0 1 1 0 0 +EDGE2 3430 691 0.0127888 -0.964117 -1.6038 1 0 1 1 0 0 +EDGE2 3430 871 0.00418307 -0.904228 -1.56163 1 0 1 1 0 0 +EDGE2 3430 690 0.000143178 -0.0209047 -3.15431 1 0 1 1 0 0 +EDGE2 3430 910 -0.00600279 0.0122219 0.0487318 1 0 1 1 0 0 +EDGE2 3430 689 1.03856 -0.0715451 -3.15243 1 0 1 1 0 0 +EDGE2 3430 889 1.08699 0.0457572 -3.14557 1 0 1 1 0 0 +EDGE2 3430 850 0.0688335 -0.00995606 0.00734953 1 0 1 1 0 0 +EDGE2 3430 870 -0.0292099 0.028403 0.00166722 1 0 1 1 0 0 +EDGE2 3430 890 0.0556038 0.0792037 -3.14681 1 0 1 1 0 0 +EDGE2 3430 830 -0.0670947 0.0604285 -0.00947933 1 0 1 1 0 0 +EDGE2 3430 851 0.0224016 0.94335 1.55608 1 0 1 1 0 0 +EDGE2 3430 911 -0.021819 1.02586 1.5502 1 0 1 1 0 0 +EDGE2 3430 891 0.0218421 0.934923 1.56275 1 0 1 1 0 0 +EDGE2 3430 831 -0.028586 1.04406 1.54897 1 0 1 1 0 0 +EDGE2 3430 869 -0.932183 0.0231821 -0.00844463 1 0 1 1 0 0 +EDGE2 3430 3429 -1.03148 0.10027 0.0177931 1 0 1 1 0 0 +EDGE2 3430 909 -0.951642 0.00601709 0.0079817 1 0 1 1 0 0 +EDGE2 3430 829 -1.07602 0.00269111 -0.0153135 1 0 1 1 0 0 +EDGE2 3430 849 -0.945106 0.0369531 0.00703255 1 0 1 1 0 0 +EDGE2 3431 690 -1.08146 -0.0431147 1.54285 1 0 1 1 0 0 +EDGE2 3431 910 -0.969239 0.0116813 -1.56712 1 0 1 1 0 0 +EDGE2 3431 3430 -1.03658 -0.0362924 -1.56291 1 0 1 1 0 0 +EDGE2 3431 850 -1.05222 -0.0164221 -1.55076 1 0 1 1 0 0 +EDGE2 3431 870 -1.05492 0.00445838 -1.58908 1 0 1 1 0 0 +EDGE2 3431 890 -0.995596 -0.0177964 1.56224 1 0 1 1 0 0 +EDGE2 3431 830 -1.05289 -0.0554889 -1.58608 1 0 1 1 0 0 +EDGE2 3431 892 1.06494 -0.0774346 0.0197743 1 0 1 1 0 0 +EDGE2 3431 851 0.0104174 -0.00630274 0.0166558 1 0 1 1 0 0 +EDGE2 3431 911 0.0539823 -0.00207721 -0.0359542 1 0 1 1 0 0 +EDGE2 3431 891 -0.00827396 -0.0513819 -0.00476558 1 0 1 1 0 0 +EDGE2 3431 831 -0.110058 -0.0717484 -0.0111938 1 0 1 1 0 0 +EDGE2 3431 912 0.979934 -0.0160743 0.0396558 1 0 1 1 0 0 +EDGE2 3431 832 0.977188 0.0135554 -0.0505501 1 0 1 1 0 0 +EDGE2 3431 852 1.0198 -0.0409526 0.00867094 1 0 1 1 0 0 +EDGE2 3432 892 0.0989236 -0.0817642 -0.0188799 1 0 1 1 0 0 +EDGE2 3432 851 -0.920068 0.0447672 0.0229806 1 0 1 1 0 0 +EDGE2 3432 911 -0.99415 -0.0566618 -0.00735129 1 0 1 1 0 0 +EDGE2 3432 3431 -0.986736 -0.0507842 -0.00830605 1 0 1 1 0 0 +EDGE2 3432 891 -0.940179 -0.0550034 -0.0126487 1 0 1 1 0 0 +EDGE2 3432 831 -1.02758 0.0168156 -0.0374527 1 0 1 1 0 0 +EDGE2 3432 912 0.00725194 0.0473286 0.00604729 1 0 1 1 0 0 +EDGE2 3432 913 0.936982 -0.0331521 0.0383852 1 0 1 1 0 0 +EDGE2 3432 832 -0.0418099 -0.0463782 -0.0123552 1 0 1 1 0 0 +EDGE2 3432 852 -0.0394228 0.00100315 0.00885967 1 0 1 1 0 0 +EDGE2 3432 833 0.974329 -0.0466314 -0.0303857 1 0 1 1 0 0 +EDGE2 3432 853 0.876303 -0.00444473 -0.00907942 1 0 1 1 0 0 +EDGE2 3432 893 0.871009 -0.0301121 0.0206497 1 0 1 1 0 0 +EDGE2 3433 892 -1.04886 0.0224442 -0.0266949 1 0 1 1 0 0 +EDGE2 3433 3432 -0.964543 0.0110302 0.0281746 1 0 1 1 0 0 +EDGE2 3433 912 -0.964101 0.0710219 0.0115915 1 0 1 1 0 0 +EDGE2 3433 913 -0.00235751 -0.0535995 -0.016892 1 0 1 1 0 0 +EDGE2 3433 832 -0.990097 0.0328459 -0.0481928 1 0 1 1 0 0 +EDGE2 3433 852 -0.971005 -0.00182951 0.0203368 1 0 1 1 0 0 +EDGE2 3433 833 -0.0549811 -0.0500181 0.00299713 1 0 1 1 0 0 +EDGE2 3433 853 -0.0449575 0.0596193 -0.00200675 1 0 1 1 0 0 +EDGE2 3433 893 -0.0222872 -0.00426401 0.0141331 1 0 1 1 0 0 +EDGE2 3433 894 0.99675 -0.0750873 -0.0112724 1 0 1 1 0 0 +EDGE2 3433 914 1.0674 -0.00959651 0.0185132 1 0 1 1 0 0 +EDGE2 3433 834 1.0085 -0.000603539 0.0169412 1 0 1 1 0 0 +EDGE2 3433 854 1.02107 -0.00431776 -0.00919702 1 0 1 1 0 0 +EDGE2 3434 3395 0.923003 -0.0311979 -3.15135 1 0 1 1 0 0 +EDGE2 3434 913 -0.976227 0.0571626 -0.0203607 1 0 1 1 0 0 +EDGE2 3434 3433 -0.935327 -0.0449296 -0.0282148 1 0 1 1 0 0 +EDGE2 3434 833 -1.09211 0.0842365 0.0177349 1 0 1 1 0 0 +EDGE2 3434 853 -1.0267 0.022626 0.00666365 1 0 1 1 0 0 +EDGE2 3434 893 -1.0047 0.00413902 0.00682742 1 0 1 1 0 0 +EDGE2 3434 894 0.0215405 -0.0126157 -0.0354673 1 0 1 1 0 0 +EDGE2 3434 914 0.067797 -0.0155203 0.00478873 1 0 1 1 0 0 +EDGE2 3434 834 0.0274022 -0.0113078 0.00406689 1 0 1 1 0 0 +EDGE2 3434 854 0.0123193 0.0185475 0.0263776 1 0 1 1 0 0 +EDGE2 3434 3415 0.974835 0.0142201 -3.14694 1 0 1 1 0 0 +EDGE2 3434 855 1.0008 -0.0442503 0.00414387 1 0 1 1 0 0 +EDGE2 3434 895 0.999811 0.034961 0.00320139 1 0 1 1 0 0 +EDGE2 3434 915 1.01695 0.0276027 0.0200965 1 0 1 1 0 0 +EDGE2 3434 835 1.05309 -0.0817399 0.0109067 1 0 1 1 0 0 +EDGE2 3435 3395 0.0456288 -0.0173608 -3.15077 1 0 1 1 0 0 +EDGE2 3435 3396 0.0099141 -1.0708 -1.57153 1 0 1 1 0 0 +EDGE2 3435 916 -0.064705 -1.03901 -1.55266 1 0 1 1 0 0 +EDGE2 3435 3434 -1.03249 -0.0606642 -0.00598467 1 0 1 1 0 0 +EDGE2 3435 894 -1.01071 0.0326013 -0.0361978 1 0 1 1 0 0 +EDGE2 3435 914 -1.06454 -0.0284244 -0.0180914 1 0 1 1 0 0 +EDGE2 3435 834 -0.934346 0.0552364 -0.00808676 1 0 1 1 0 0 +EDGE2 3435 854 -1.03625 0.0348388 -0.00304501 1 0 1 1 0 0 +EDGE2 3435 3415 -0.0198435 -0.0309589 -3.15752 1 0 1 1 0 0 +EDGE2 3435 855 -0.00322877 -0.0400195 0.0173753 1 0 1 1 0 0 +EDGE2 3435 895 -0.0683824 0.014062 0.0146767 1 0 1 1 0 0 +EDGE2 3435 915 -0.0754289 -0.0248832 0.00777447 1 0 1 1 0 0 +EDGE2 3435 835 -0.0727665 -0.00308296 0.00385801 1 0 1 1 0 0 +EDGE2 3435 3414 0.948998 -0.00575657 -3.15929 1 0 1 1 0 0 +EDGE2 3435 3394 0.979777 -0.047607 -3.13279 1 0 1 1 0 0 +EDGE2 3435 856 -0.0296564 1.14229 1.57883 1 0 1 1 0 0 +EDGE2 3435 896 0.113013 0.93809 1.57136 1 0 1 1 0 0 +EDGE2 3435 3416 -0.0403425 1.07559 1.60417 1 0 1 1 0 0 +EDGE2 3435 836 -0.0442324 0.958094 1.54885 1 0 1 1 0 0 +EDGE2 3436 3395 -0.995398 -0.122208 1.59182 1 0 1 1 0 0 +EDGE2 3436 3435 -1.00005 -0.0431908 -1.59359 1 0 1 1 0 0 +EDGE2 3436 3415 -0.942135 -0.0140804 1.56293 1 0 1 1 0 0 +EDGE2 3436 855 -1.06128 0.0265168 -1.58048 1 0 1 1 0 0 +EDGE2 3436 895 -0.916147 -0.0551288 -1.5877 1 0 1 1 0 0 +EDGE2 3436 915 -1.02317 -0.0125318 -1.57199 1 0 1 1 0 0 +EDGE2 3436 835 -0.987034 -0.0252013 -1.53326 1 0 1 1 0 0 +EDGE2 3436 856 0.0679212 -0.0252629 0.0104581 1 0 1 1 0 0 +EDGE2 3436 896 -0.0421457 0.132755 -0.0328051 1 0 1 1 0 0 +EDGE2 3436 3416 -0.0576883 -0.0120543 0.01332 1 0 1 1 0 0 +EDGE2 3436 836 -0.0475917 0.0149376 -0.0145098 1 0 1 1 0 0 +EDGE2 3436 857 0.977022 -0.0021095 -0.0183089 1 0 1 1 0 0 +EDGE2 3436 897 0.974716 0.0189092 0.0138343 1 0 1 1 0 0 +EDGE2 3436 3417 1.00681 -0.0345923 0.0137479 1 0 1 1 0 0 +EDGE2 3436 837 0.994399 -0.0099827 -0.0559818 1 0 1 1 0 0 +EDGE2 3437 3436 -1.10067 -0.0963355 0.012867 1 0 1 1 0 0 +EDGE2 3437 856 -0.930403 -0.045519 -0.0138363 1 0 1 1 0 0 +EDGE2 3437 896 -1.07859 0.0697699 0.00514668 1 0 1 1 0 0 +EDGE2 3437 3416 -0.998437 -0.0597796 0.00648506 1 0 1 1 0 0 +EDGE2 3437 836 -0.968913 -0.0383262 -0.0144384 1 0 1 1 0 0 +EDGE2 3437 857 -0.0791536 0.00695925 0.00566912 1 0 1 1 0 0 +EDGE2 3437 897 0.0447767 -0.0311827 -0.00742327 1 0 1 1 0 0 +EDGE2 3437 3417 -0.0556578 0.049127 -0.00307693 1 0 1 1 0 0 +EDGE2 3437 837 -0.0403511 -0.0713507 -0.0250834 1 0 1 1 0 0 +EDGE2 3437 858 1.06936 -0.00751014 -0.0146918 1 0 1 1 0 0 +EDGE2 3437 898 0.935577 -0.0836817 -0.0431114 1 0 1 1 0 0 +EDGE2 3437 3418 1.00778 -0.0507572 -0.022457 1 0 1 1 0 0 +EDGE2 3437 838 0.966822 0.0186052 -0.0190464 1 0 1 1 0 0 +EDGE2 3438 3437 -1.00653 0.00862939 -0.0267398 1 0 1 1 0 0 +EDGE2 3438 857 -0.991416 -0.0255791 0.0314738 1 0 1 1 0 0 +EDGE2 3438 897 -0.975158 -0.0520502 -0.0149369 1 0 1 1 0 0 +EDGE2 3438 3417 -0.959277 -0.0263118 0.00606962 1 0 1 1 0 0 +EDGE2 3438 837 -0.903611 -0.0340574 -0.00640756 1 0 1 1 0 0 +EDGE2 3438 858 -0.0510861 0.000989573 -0.0311029 1 0 1 1 0 0 +EDGE2 3438 898 0.028241 0.0411578 -0.0190085 1 0 1 1 0 0 +EDGE2 3438 3418 -0.0112209 -0.0512828 0.0170756 1 0 1 1 0 0 +EDGE2 3438 838 0.0927619 -0.0709593 -0.0277689 1 0 1 1 0 0 +EDGE2 3438 839 0.98711 -0.0322467 0.0198031 1 0 1 1 0 0 +EDGE2 3438 899 1.12514 -0.00349203 0.000178948 1 0 1 1 0 0 +EDGE2 3438 3419 1.03971 -0.0176284 -0.034647 1 0 1 1 0 0 +EDGE2 3438 859 0.978715 -0.0138656 0.00364251 1 0 1 1 0 0 +EDGE2 3439 3438 -0.945512 0.013959 0.0204976 1 0 1 1 0 0 +EDGE2 3439 858 -0.992791 -0.0384943 -0.0202967 1 0 1 1 0 0 +EDGE2 3439 898 -0.876706 0.0376825 -0.00775492 1 0 1 1 0 0 +EDGE2 3439 3418 -0.990748 -0.068259 -0.0178319 1 0 1 1 0 0 +EDGE2 3439 838 -0.934888 -0.17103 0.0175726 1 0 1 1 0 0 +EDGE2 3439 839 0.0602486 -0.000100604 -0.0150221 1 0 1 1 0 0 +EDGE2 3439 899 -0.0365671 -0.0491478 0.0182323 1 0 1 1 0 0 +EDGE2 3439 3419 -0.0493998 -0.0165346 0.00375826 1 0 1 1 0 0 +EDGE2 3439 859 0.00661963 -0.0465338 -0.00328987 1 0 1 1 0 0 +EDGE2 3439 1160 0.942427 -0.0215223 -3.13783 1 0 1 1 0 0 +EDGE2 3439 3140 1.00852 -0.104373 -3.175 1 0 1 1 0 0 +EDGE2 3439 3420 0.989985 -0.0366953 -0.0108567 1 0 1 1 0 0 +EDGE2 3439 3380 0.931015 -0.0396395 -3.15667 1 0 1 1 0 0 +EDGE2 3439 1200 0.969474 0.0172075 -3.12032 1 0 1 1 0 0 +EDGE2 3439 3100 1.07165 -0.0314332 -3.11947 1 0 1 1 0 0 +EDGE2 3439 3120 0.975113 0.0158424 -3.15261 1 0 1 1 0 0 +EDGE2 3439 1180 0.856888 -0.0164593 -3.14892 1 0 1 1 0 0 +EDGE2 3439 900 1.08311 -0.0438338 -0.0170415 1 0 1 1 0 0 +EDGE2 3439 840 0.989783 -0.000498718 0.0158862 1 0 1 1 0 0 +EDGE2 3439 860 0.916764 0.0361082 -0.040353 1 0 1 1 0 0 +EDGE2 3440 839 -0.970474 -0.00601863 0.011312 1 0 1 1 0 0 +EDGE2 3440 899 -1.0481 -0.0461919 -0.0150749 1 0 1 1 0 0 +EDGE2 3440 3419 -1.05648 -0.0428958 -0.0004479 1 0 1 1 0 0 +EDGE2 3440 3439 -0.956558 0.0581914 -0.00813257 1 0 1 1 0 0 +EDGE2 3440 859 -1.04108 -0.00528957 0.00887971 1 0 1 1 0 0 +EDGE2 3440 841 0.00423295 1.06965 1.58912 1 0 1 1 0 0 +EDGE2 3440 901 0.0193209 0.955511 1.52502 1 0 1 1 0 0 +EDGE2 3440 1201 -0.0045824 1.02834 1.56117 1 0 1 1 0 0 +EDGE2 3440 3421 0.071823 0.91848 1.55097 1 0 1 1 0 0 +EDGE2 3440 861 0.104473 1.00059 1.57729 1 0 1 1 0 0 +EDGE2 3440 1160 -0.0932167 0.0321592 -3.13453 1 0 1 1 0 0 +EDGE2 3440 3140 -0.0246525 0.0397741 -3.14583 1 0 1 1 0 0 +EDGE2 3440 3420 0.00387214 0.0652901 0.0172518 1 0 1 1 0 0 +EDGE2 3440 3380 -0.0509325 0.000415616 -3.12693 1 0 1 1 0 0 +EDGE2 3440 1200 -0.0514002 -0.0150454 -3.13958 1 0 1 1 0 0 +EDGE2 3440 3100 -0.027186 -0.0676727 -3.12971 1 0 1 1 0 0 +EDGE2 3440 3120 0.0239236 -0.0210025 -3.1521 1 0 1 1 0 0 +EDGE2 3440 1180 0.0212755 0.0218023 -3.11301 1 0 1 1 0 0 +EDGE2 3440 900 -0.0908506 0.0628578 0.00893972 1 0 1 1 0 0 +EDGE2 3440 840 0.00243765 0.0836041 -0.000978631 1 0 1 1 0 0 +EDGE2 3440 860 -0.00983266 -0.0876798 0.00837498 1 0 1 1 0 0 +EDGE2 3440 3101 0.0415167 -1.03305 -1.56136 1 0 1 1 0 0 +EDGE2 3440 3141 0.0660441 -1.0623 -1.5244 1 0 1 1 0 0 +EDGE2 3440 3381 0.0289164 -1.023 -1.5602 1 0 1 1 0 0 +EDGE2 3440 3121 -0.0859015 -0.886392 -1.55356 1 0 1 1 0 0 +EDGE2 3440 1161 -0.0382015 -1.12947 -1.5765 1 0 1 1 0 0 +EDGE2 3440 1181 0.12995 -1.0672 -1.58478 1 0 1 1 0 0 +EDGE2 3440 3119 0.975071 -0.0492362 -3.13739 1 0 1 1 0 0 +EDGE2 3440 3379 1.02956 -0.0409992 -3.12924 1 0 1 1 0 0 +EDGE2 3440 3139 1.0542 0.0592769 -3.16203 1 0 1 1 0 0 +EDGE2 3440 1179 0.991553 -0.0139166 -3.14296 1 0 1 1 0 0 +EDGE2 3440 1199 0.953908 -0.047983 -3.1246 1 0 1 1 0 0 +EDGE2 3440 3099 0.920353 0.00273267 -3.12314 1 0 1 1 0 0 +EDGE2 3440 1159 1.03279 -0.0202017 -3.16086 1 0 1 1 0 0 +EDGE2 3441 902 0.969258 0.0424004 -0.0162884 1 0 1 1 0 0 +EDGE2 3441 3422 0.99109 -0.0294883 0.0366908 1 0 1 1 0 0 +EDGE2 3441 1202 1.04421 0.000464025 -0.0136092 1 0 1 1 0 0 +EDGE2 3441 842 0.936046 -0.0506101 -0.0229292 1 0 1 1 0 0 +EDGE2 3441 862 1.04661 -0.0729535 -0.0252319 1 0 1 1 0 0 +EDGE2 3441 841 0.0242081 0.0239652 -0.000507642 1 0 1 1 0 0 +EDGE2 3441 901 -0.0983226 0.00420563 -0.0270392 1 0 1 1 0 0 +EDGE2 3441 1201 -0.0693858 -0.0765543 -0.0118948 1 0 1 1 0 0 +EDGE2 3441 3421 0.0179379 0.0649072 -0.00887874 1 0 1 1 0 0 +EDGE2 3441 861 0.00549875 0.0708171 0.0420368 1 0 1 1 0 0 +EDGE2 3441 1160 -0.992374 -0.0241709 1.57361 1 0 1 1 0 0 +EDGE2 3441 3140 -1.02179 -0.0368947 1.56015 1 0 1 1 0 0 +EDGE2 3441 3420 -1.04069 -0.0689865 -1.56336 1 0 1 1 0 0 +EDGE2 3441 3440 -1.02434 0.0312744 -1.56905 1 0 1 1 0 0 +EDGE2 3441 3380 -0.999852 0.0476675 1.56978 1 0 1 1 0 0 +EDGE2 3441 1200 -1.04755 -0.0150504 1.61422 1 0 1 1 0 0 +EDGE2 3441 3100 -1.04877 0.0198169 1.58954 1 0 1 1 0 0 +EDGE2 3441 3120 -0.902636 -0.0814489 1.5874 1 0 1 1 0 0 +EDGE2 3441 1180 -0.982459 0.0169624 1.56386 1 0 1 1 0 0 +EDGE2 3441 900 -0.990811 0.0209784 -1.56102 1 0 1 1 0 0 +EDGE2 3441 840 -0.95648 0.0274646 -1.55247 1 0 1 1 0 0 +EDGE2 3441 860 -0.9514 0.0226507 -1.58654 1 0 1 1 0 0 +EDGE2 3442 3423 1.01304 0.0404834 0.0127201 1 0 1 1 0 0 +EDGE2 3442 863 1.05087 -0.0459691 0.0397139 1 0 1 1 0 0 +EDGE2 3442 903 1.07713 0.06047 0.0163413 1 0 1 1 0 0 +EDGE2 3442 1203 0.993894 0.0584993 -0.0100898 1 0 1 1 0 0 +EDGE2 3442 843 0.960243 -0.02295 -0.0207022 1 0 1 1 0 0 +EDGE2 3442 3441 -1.09987 -0.0540951 -0.00542154 1 0 1 1 0 0 +EDGE2 3442 902 -0.0864853 0.023062 -0.000222738 1 0 1 1 0 0 +EDGE2 3442 3422 -0.0347764 0.0769199 0.026025 1 0 1 1 0 0 +EDGE2 3442 1202 -0.0970162 0.0194687 -0.0166634 1 0 1 1 0 0 +EDGE2 3442 842 0.0213123 0.0357434 0.030686 1 0 1 1 0 0 +EDGE2 3442 862 -0.0451813 -0.0747701 0.00692268 1 0 1 1 0 0 +EDGE2 3442 841 -1.05632 -0.00351674 0.0129646 1 0 1 1 0 0 +EDGE2 3442 901 -0.968075 -0.0167021 -0.000411717 1 0 1 1 0 0 +EDGE2 3442 1201 -0.944549 -0.0512904 -0.00221402 1 0 1 1 0 0 +EDGE2 3442 3421 -1.02513 0.0579394 0.0145488 1 0 1 1 0 0 +EDGE2 3442 861 -0.96982 -0.0821537 -0.0175802 1 0 1 1 0 0 +EDGE2 3443 864 0.939973 0.000878083 -0.0113812 1 0 1 1 0 0 +EDGE2 3443 1204 0.975406 0.0109818 -0.00792293 1 0 1 1 0 0 +EDGE2 3443 3424 1.00999 -0.106843 0.0174522 1 0 1 1 0 0 +EDGE2 3443 904 0.964084 -0.0589973 0.00834404 1 0 1 1 0 0 +EDGE2 3443 3423 0.00273002 0.082581 0.027167 1 0 1 1 0 0 +EDGE2 3443 844 1.01036 0.0660506 0.0180728 1 0 1 1 0 0 +EDGE2 3443 863 0.0433736 0.012736 -0.00520555 1 0 1 1 0 0 +EDGE2 3443 903 0.00229028 -0.0237694 0.0125672 1 0 1 1 0 0 +EDGE2 3443 1203 -0.074776 0.000662396 -0.0202575 1 0 1 1 0 0 +EDGE2 3443 843 0.0661183 -0.00225334 -0.00480975 1 0 1 1 0 0 +EDGE2 3443 902 -1.04088 0.0141622 0.0123633 1 0 1 1 0 0 +EDGE2 3443 3422 -0.972109 -0.0403858 0.0273716 1 0 1 1 0 0 +EDGE2 3443 3442 -1.00573 0.000682939 0.0160882 1 0 1 1 0 0 +EDGE2 3443 1202 -0.982218 -0.0566855 -0.0072755 1 0 1 1 0 0 +EDGE2 3443 842 -1.09839 0.0409438 0.0112736 1 0 1 1 0 0 +EDGE2 3443 862 -1.05306 -0.00016055 -0.00822114 1 0 1 1 0 0 +EDGE2 3444 865 1.06902 0.0111973 -0.0386464 1 0 1 1 0 0 +EDGE2 3444 3225 1.13915 0.0381858 -3.10479 1 0 1 1 0 0 +EDGE2 3444 3425 1.00944 0.0472797 -0.0197856 1 0 1 1 0 0 +EDGE2 3444 3365 1.01243 0.0213805 -3.13331 1 0 1 1 0 0 +EDGE2 3444 1205 0.93959 0.0395368 0.0113986 1 0 1 1 0 0 +EDGE2 3444 3205 1.0269 -0.0790892 -3.13671 1 0 1 1 0 0 +EDGE2 3444 905 0.989599 -0.00735891 -0.0282412 1 0 1 1 0 0 +EDGE2 3444 864 -0.00983538 -0.0151207 0.0239373 1 0 1 1 0 0 +EDGE2 3444 705 0.994386 0.0315706 -3.15512 1 0 1 1 0 0 +EDGE2 3444 825 0.964149 0.0297127 -3.15991 1 0 1 1 0 0 +EDGE2 3444 845 0.946581 0.0213216 -0.00401732 1 0 1 1 0 0 +EDGE2 3444 1204 -0.0241148 0.0319992 0.000329098 1 0 1 1 0 0 +EDGE2 3444 3424 -0.00474736 8.48258e-05 -0.0101509 1 0 1 1 0 0 +EDGE2 3444 904 -0.0892316 0.0179509 0.00691499 1 0 1 1 0 0 +EDGE2 3444 3423 -0.988266 -0.0039002 0.00316742 1 0 1 1 0 0 +EDGE2 3444 844 0.0161123 -0.0146329 -0.0132855 1 0 1 1 0 0 +EDGE2 3444 3443 -1.03642 0.0290044 0.0258513 1 0 1 1 0 0 +EDGE2 3444 863 -1.03159 -0.0159607 0.00888704 1 0 1 1 0 0 +EDGE2 3444 903 -0.969464 -0.00757785 0.0400281 1 0 1 1 0 0 +EDGE2 3444 1203 -0.978943 0.0195732 -0.0227828 1 0 1 1 0 0 +EDGE2 3444 843 -0.948034 0.000942984 0.0314781 1 0 1 1 0 0 +EDGE2 3445 3364 1.04106 -0.0392883 -3.14899 1 0 1 1 0 0 +EDGE2 3445 824 1.05565 0.0566181 -3.1678 1 0 1 1 0 0 +EDGE2 3445 3204 1.01573 -0.00836138 -3.12472 1 0 1 1 0 0 +EDGE2 3445 3224 1.02613 -0.0869866 -3.13899 1 0 1 1 0 0 +EDGE2 3445 704 1.03674 -0.0197482 -3.14286 1 0 1 1 0 0 +EDGE2 3445 865 0.0103679 -0.0419146 0.0150478 1 0 1 1 0 0 +EDGE2 3445 3225 0.0810351 0.0399777 -3.14519 1 0 1 1 0 0 +EDGE2 3445 826 -0.0812506 0.959796 1.5877 1 0 1 1 0 0 +EDGE2 3445 866 -0.109301 1.08333 1.54759 1 0 1 1 0 0 +EDGE2 3445 906 0.00993797 1.04899 1.53744 1 0 1 1 0 0 +EDGE2 3445 3426 0.0349866 0.982668 1.56343 1 0 1 1 0 0 +EDGE2 3445 846 0.0721701 0.95883 1.594 1 0 1 1 0 0 +EDGE2 3445 3425 -0.0473434 0.0612871 0.00722331 1 0 1 1 0 0 +EDGE2 3445 3365 0.0448961 -0.0229177 -3.16351 1 0 1 1 0 0 +EDGE2 3445 1205 -0.00328543 -0.0424483 0.0341146 1 0 1 1 0 0 +EDGE2 3445 3205 -0.0156138 0.0543388 -3.14652 1 0 1 1 0 0 +EDGE2 3445 905 -0.0195859 0.064462 -0.0024642 1 0 1 1 0 0 +EDGE2 3445 864 -1.01887 -0.0353687 -0.0059071 1 0 1 1 0 0 +EDGE2 3445 705 0.0495215 0.0149141 -3.15108 1 0 1 1 0 0 +EDGE2 3445 825 0.0773256 -0.0542408 -3.15466 1 0 1 1 0 0 +EDGE2 3445 845 -0.053927 -0.0400661 0.0134251 1 0 1 1 0 0 +EDGE2 3445 1204 -1.04174 -0.020697 0.000276416 1 0 1 1 0 0 +EDGE2 3445 3424 -1.00973 0.0731053 -0.0257653 1 0 1 1 0 0 +EDGE2 3445 3444 -0.994394 -0.0136655 -0.0478245 1 0 1 1 0 0 +EDGE2 3445 904 -0.990376 -0.0199671 -0.00874304 1 0 1 1 0 0 +EDGE2 3445 844 -1.05026 0.0394175 0.0190381 1 0 1 1 0 0 +EDGE2 3445 1206 0.0268782 -1.00909 -1.56168 1 0 1 1 0 0 +EDGE2 3445 3226 -0.00172265 -1.03158 -1.56324 1 0 1 1 0 0 +EDGE2 3445 3366 -0.0143606 -1.03709 -1.54832 1 0 1 1 0 0 +EDGE2 3445 3206 -0.0135501 -1.03072 -1.56835 1 0 1 1 0 0 +EDGE2 3445 706 -0.029916 -1.0244 -1.62731 1 0 1 1 0 0 +EDGE2 3446 865 -0.979514 -0.0700683 -1.5634 1 0 1 1 0 0 +EDGE2 3446 3427 1.01033 -0.0699655 -0.024333 1 0 1 1 0 0 +EDGE2 3446 847 1.02948 -0.0410953 0.0162868 1 0 1 1 0 0 +EDGE2 3446 867 0.909572 0.0128425 -0.0041832 1 0 1 1 0 0 +EDGE2 3446 907 1.10388 -0.0589552 -0.000665414 1 0 1 1 0 0 +EDGE2 3446 827 1.03358 -0.00074947 0.0082452 1 0 1 1 0 0 +EDGE2 3446 3225 -1.06752 0.0134885 1.59944 1 0 1 1 0 0 +EDGE2 3446 826 0.014409 0.0282434 0.0280661 1 0 1 1 0 0 +EDGE2 3446 866 0.00967247 0.0121349 0.0267268 1 0 1 1 0 0 +EDGE2 3446 906 0.0145997 0.020377 0.0101124 1 0 1 1 0 0 +EDGE2 3446 3426 0.0610087 0.0284989 -0.00693094 1 0 1 1 0 0 +EDGE2 3446 846 -0.0278306 0.0355805 -0.00460634 1 0 1 1 0 0 +EDGE2 3446 3425 -0.929424 0.0831277 -1.56656 1 0 1 1 0 0 +EDGE2 3446 3445 -1.01078 -0.0400051 -1.55317 1 0 1 1 0 0 +EDGE2 3446 3365 -1.0338 0.0789762 1.59322 1 0 1 1 0 0 +EDGE2 3446 1205 -0.937202 0.038552 -1.58325 1 0 1 1 0 0 +EDGE2 3446 3205 -1.06174 -0.0509184 1.56594 1 0 1 1 0 0 +EDGE2 3446 905 -1.02442 0.0215353 -1.56326 1 0 1 1 0 0 +EDGE2 3446 705 -1.06795 -0.0330596 1.56329 1 0 1 1 0 0 +EDGE2 3446 825 -0.929814 0.0136918 1.54793 1 0 1 1 0 0 +EDGE2 3446 845 -1.0189 -0.052838 -1.56319 1 0 1 1 0 0 +EDGE2 3447 908 1.02236 -0.0158239 -0.00732012 1 0 1 1 0 0 +EDGE2 3447 3428 0.992781 0.123921 0.0308072 1 0 1 1 0 0 +EDGE2 3447 3446 -1.04273 0.0268225 -0.00817163 1 0 1 1 0 0 +EDGE2 3447 3427 0.0455585 0.0670686 0.0093394 1 0 1 1 0 0 +EDGE2 3447 828 1.01836 -0.00405015 0.00270632 1 0 1 1 0 0 +EDGE2 3447 848 1.01683 -0.016464 -0.000144735 1 0 1 1 0 0 +EDGE2 3447 868 0.998102 0.0519366 -0.0101477 1 0 1 1 0 0 +EDGE2 3447 847 -0.0765876 -0.0298712 -0.00117988 1 0 1 1 0 0 +EDGE2 3447 867 0.00328205 -0.0530481 -0.0287142 1 0 1 1 0 0 +EDGE2 3447 907 0.0682039 0.0539602 -0.0191772 1 0 1 1 0 0 +EDGE2 3447 827 -0.0494545 -0.000669986 0.00744745 1 0 1 1 0 0 +EDGE2 3447 826 -0.92924 -0.0450362 0.0183051 1 0 1 1 0 0 +EDGE2 3447 866 -1.06091 0.0036546 0.00887554 1 0 1 1 0 0 +EDGE2 3447 906 -0.954247 0.0211139 -0.0213946 1 0 1 1 0 0 +EDGE2 3447 3426 -1.0467 0.0226077 0.0067109 1 0 1 1 0 0 +EDGE2 3447 846 -1.04153 0.0105554 0.00614045 1 0 1 1 0 0 +EDGE2 3448 908 -0.0310765 0.0379574 -0.0038185 1 0 1 1 0 0 +EDGE2 3448 869 1.02208 0.0146477 0.00266335 1 0 1 1 0 0 +EDGE2 3448 3429 0.995944 0.0273999 -0.0028378 1 0 1 1 0 0 +EDGE2 3448 909 0.937421 0.0478486 -0.00450057 1 0 1 1 0 0 +EDGE2 3448 829 1.00899 -0.0655197 -0.00544113 1 0 1 1 0 0 +EDGE2 3448 849 0.915017 -0.0172873 -0.00515278 1 0 1 1 0 0 +EDGE2 3448 3428 -0.043949 0.0207943 -0.0112588 1 0 1 1 0 0 +EDGE2 3448 3427 -1.01409 0.0567011 0.018717 1 0 1 1 0 0 +EDGE2 3448 828 0.0281495 -0.0419105 -0.00542586 1 0 1 1 0 0 +EDGE2 3448 848 -0.0164792 -0.0489676 -0.000863653 1 0 1 1 0 0 +EDGE2 3448 868 -0.108514 -0.0538046 -0.0125655 1 0 1 1 0 0 +EDGE2 3448 3447 -1.00908 -0.0281001 9.00559e-05 1 0 1 1 0 0 +EDGE2 3448 847 -0.908845 -0.0780995 -0.0183621 1 0 1 1 0 0 +EDGE2 3448 867 -0.993132 -0.0954063 0.0113631 1 0 1 1 0 0 +EDGE2 3448 907 -1.05361 0.0544243 -0.00680031 1 0 1 1 0 0 +EDGE2 3448 827 -1.0061 0.118728 -0.00828566 1 0 1 1 0 0 +EDGE2 3449 908 -0.918172 -0.0113922 0.0120326 1 0 1 1 0 0 +EDGE2 3449 690 0.992712 -0.0907328 -3.13692 1 0 1 1 0 0 +EDGE2 3449 910 1.03552 0.118658 0.0387807 1 0 1 1 0 0 +EDGE2 3449 3430 0.94852 -0.0397938 -0.0214459 1 0 1 1 0 0 +EDGE2 3449 850 0.942984 -0.00540501 0.0177114 1 0 1 1 0 0 +EDGE2 3449 870 0.943788 0.0636502 -0.0183651 1 0 1 1 0 0 +EDGE2 3449 890 0.920862 -0.0248739 -3.1656 1 0 1 1 0 0 +EDGE2 3449 830 0.973997 -0.000282003 -0.00705782 1 0 1 1 0 0 +EDGE2 3449 869 -0.0138896 0.0808174 -0.0151497 1 0 1 1 0 0 +EDGE2 3449 3429 0.00369219 0.00466442 0.0182262 1 0 1 1 0 0 +EDGE2 3449 909 -0.00689218 -0.0794491 -0.0123185 1 0 1 1 0 0 +EDGE2 3449 3448 -0.96428 -0.00719223 -0.00528165 1 0 1 1 0 0 +EDGE2 3449 829 -0.0264717 -0.00750839 0.0313146 1 0 1 1 0 0 +EDGE2 3449 849 -0.0186957 0.127153 0.0150149 1 0 1 1 0 0 +EDGE2 3449 3428 -1.06801 -0.0286406 0.00426333 1 0 1 1 0 0 +EDGE2 3449 828 -1.0063 -0.0405728 -0.0378403 1 0 1 1 0 0 +EDGE2 3449 848 -0.938414 0.0468711 0.0158314 1 0 1 1 0 0 +EDGE2 3449 868 -0.997656 0.0356862 0.000877103 1 0 1 1 0 0 +EDGE2 3450 691 -0.0690124 -1.03316 -1.595 1 0 1 1 0 0 +EDGE2 3450 871 0.0273427 -0.938015 -1.58071 1 0 1 1 0 0 +EDGE2 3450 690 -0.0152354 0.0052266 -3.15299 1 0 1 1 0 0 +EDGE2 3450 910 0.0127403 -0.0405769 -0.0086687 1 0 1 1 0 0 +EDGE2 3450 689 0.981121 -0.040956 -3.16587 1 0 1 1 0 0 +EDGE2 3450 889 1.00442 0.0852188 -3.1235 1 0 1 1 0 0 +EDGE2 3450 3430 0.0365233 -0.0436273 -0.0209083 1 0 1 1 0 0 +EDGE2 3450 850 0.0601059 0.044549 -0.00337278 1 0 1 1 0 0 +EDGE2 3450 870 0.0265353 -0.0984504 -0.0186422 1 0 1 1 0 0 +EDGE2 3450 890 0.0349949 -0.122129 -3.16133 1 0 1 1 0 0 +EDGE2 3450 830 0.0218884 0.0100125 -0.00782064 1 0 1 1 0 0 +EDGE2 3450 851 -0.066236 0.99244 1.55974 1 0 1 1 0 0 +EDGE2 3450 911 -0.0686918 0.955667 1.56909 1 0 1 1 0 0 +EDGE2 3450 3431 0.0750358 0.948643 1.53444 1 0 1 1 0 0 +EDGE2 3450 891 0.0196381 0.979507 1.57424 1 0 1 1 0 0 +EDGE2 3450 831 -0.0515092 0.948875 1.554 1 0 1 1 0 0 +EDGE2 3450 869 -1.0431 0.0302504 -0.0254257 1 0 1 1 0 0 +EDGE2 3450 3429 -1.00817 0.0549811 0.0197864 1 0 1 1 0 0 +EDGE2 3450 3449 -1.01174 0.0155643 0.000528197 1 0 1 1 0 0 +EDGE2 3450 909 -0.915585 0.0143573 0.0288799 1 0 1 1 0 0 +EDGE2 3450 829 -1.00585 0.0100523 0.0081119 1 0 1 1 0 0 +EDGE2 3450 849 -1.02762 0.0698991 0.0107378 1 0 1 1 0 0 +EDGE2 3451 872 1.09147 -0.10776 -0.0467067 1 0 1 1 0 0 +EDGE2 3451 692 0.951439 0.00465186 0.0382256 1 0 1 1 0 0 +EDGE2 3451 691 -0.0490541 -0.110393 0.0135448 1 0 1 1 0 0 +EDGE2 3451 871 -0.0451053 -0.0413264 -0.0125307 1 0 1 1 0 0 +EDGE2 3451 690 -1.05026 0.0748502 -1.56505 1 0 1 1 0 0 +EDGE2 3451 910 -1.07462 0.0447539 1.55309 1 0 1 1 0 0 +EDGE2 3451 3450 -0.870786 -0.0574351 1.54619 1 0 1 1 0 0 +EDGE2 3451 3430 -1.0666 0.0437134 1.56873 1 0 1 1 0 0 +EDGE2 3451 850 -1.02849 -0.0062951 1.57072 1 0 1 1 0 0 +EDGE2 3451 870 -0.985652 0.0493462 1.54624 1 0 1 1 0 0 +EDGE2 3451 890 -0.972487 0.0130867 -1.55669 1 0 1 1 0 0 +EDGE2 3451 830 -0.928644 0.00312381 1.56803 1 0 1 1 0 0 +EDGE2 3452 693 0.985424 0.124335 -0.044326 1 0 1 1 0 0 +EDGE2 3452 873 1.03557 -0.105669 0.00294687 1 0 1 1 0 0 +EDGE2 3452 872 -0.0224039 -0.0282123 0.029304 1 0 1 1 0 0 +EDGE2 3452 692 0.0585821 -0.0485281 0.0153764 1 0 1 1 0 0 +EDGE2 3452 691 -0.978427 -0.0380211 0.00365362 1 0 1 1 0 0 +EDGE2 3452 871 -0.963083 0.0666007 -0.00537799 1 0 1 1 0 0 +EDGE2 3452 3451 -1.08943 -0.047539 0.0291787 1 0 1 1 0 0 +EDGE2 3453 693 0.00897881 -0.00847177 0.00836443 1 0 1 1 0 0 +EDGE2 3453 874 1.03343 0.0180611 0.0141042 1 0 1 1 0 0 +EDGE2 3453 694 1.07496 -0.0184825 0.00647236 1 0 1 1 0 0 +EDGE2 3453 873 -0.0133973 0.0407094 0.0102843 1 0 1 1 0 0 +EDGE2 3453 872 -0.944574 -0.0107803 0.0016184 1 0 1 1 0 0 +EDGE2 3453 3452 -0.954835 0.0273865 -0.025313 1 0 1 1 0 0 +EDGE2 3453 692 -0.978584 0.0355714 0.0124845 1 0 1 1 0 0 +EDGE2 3454 795 1.05054 -0.00142779 -3.15775 1 0 1 1 0 0 +EDGE2 3454 875 0.930765 -0.0155378 0.0190509 1 0 1 1 0 0 +EDGE2 3454 3335 0.925462 -0.115342 -3.14599 1 0 1 1 0 0 +EDGE2 3454 3355 1.01381 -0.0178861 -3.12699 1 0 1 1 0 0 +EDGE2 3454 815 0.913754 0.0393141 -3.15249 1 0 1 1 0 0 +EDGE2 3454 755 1.05682 0.0137662 -3.16324 1 0 1 1 0 0 +EDGE2 3454 775 1.08588 -0.0582269 -3.14584 1 0 1 1 0 0 +EDGE2 3454 695 0.969076 0.0136282 0.0161878 1 0 1 1 0 0 +EDGE2 3454 693 -0.949364 -0.00185891 0.0412482 1 0 1 1 0 0 +EDGE2 3454 874 0.00826321 0.0369656 -0.0117802 1 0 1 1 0 0 +EDGE2 3454 694 0.112297 -0.0203781 0.0367378 1 0 1 1 0 0 +EDGE2 3454 3453 -1.01172 -0.0376085 0.000558698 1 0 1 1 0 0 +EDGE2 3454 873 -1.01297 0.00144527 -0.0104682 1 0 1 1 0 0 +EDGE2 3455 876 -0.0321925 0.988247 1.5901 1 0 1 1 0 0 +EDGE2 3455 774 1.00254 0.046525 -3.17167 1 0 1 1 0 0 +EDGE2 3455 814 0.979838 0.0372506 -3.14368 1 0 1 1 0 0 +EDGE2 3455 3334 1.04519 0.0227845 -3.12351 1 0 1 1 0 0 +EDGE2 3455 3354 0.964597 -0.0306763 -3.12934 1 0 1 1 0 0 +EDGE2 3455 794 1.00758 -0.0145902 -3.12544 1 0 1 1 0 0 +EDGE2 3455 754 0.966517 -0.00195997 -3.1288 1 0 1 1 0 0 +EDGE2 3455 795 0.0499253 -0.0152318 -3.1303 1 0 1 1 0 0 +EDGE2 3455 875 -0.0422952 0.0557989 0.0439864 1 0 1 1 0 0 +EDGE2 3455 3335 -0.0494748 -0.0250894 -3.10716 1 0 1 1 0 0 +EDGE2 3455 3355 0.0720549 0.0477365 -3.13931 1 0 1 1 0 0 +EDGE2 3455 815 -0.057207 0.0710309 -3.15262 1 0 1 1 0 0 +EDGE2 3455 755 0.0112166 -0.0778758 -3.147 1 0 1 1 0 0 +EDGE2 3455 775 0.0273695 -0.0320332 -3.1644 1 0 1 1 0 0 +EDGE2 3455 695 0.140719 -0.0831416 0.0360623 1 0 1 1 0 0 +EDGE2 3455 874 -0.928468 0.121405 0.00724742 1 0 1 1 0 0 +EDGE2 3455 3454 -0.970606 -0.0398678 -0.0076458 1 0 1 1 0 0 +EDGE2 3455 694 -0.916448 -0.109256 -0.00294529 1 0 1 1 0 0 +EDGE2 3455 796 0.0140152 -1.0119 -1.55836 1 0 1 1 0 0 +EDGE2 3455 3336 0.0954151 -0.995719 -1.55154 1 0 1 1 0 0 +EDGE2 3455 3356 0.0630796 -1.00631 -1.54459 1 0 1 1 0 0 +EDGE2 3455 816 -0.0694978 -1.05516 -1.53997 1 0 1 1 0 0 +EDGE2 3455 696 0.0294296 -1.02945 -1.53409 1 0 1 1 0 0 +EDGE2 3455 756 0.0863683 -1.03205 -1.55817 1 0 1 1 0 0 +EDGE2 3455 776 0.039102 -0.983075 -1.58778 1 0 1 1 0 0 +EDGE2 3456 3455 -0.796106 -0.00696599 1.5891 1 0 1 1 0 0 +EDGE2 3456 795 -0.89129 0.0191441 -1.55427 1 0 1 1 0 0 +EDGE2 3456 875 -0.993561 0.00270695 1.59162 1 0 1 1 0 0 +EDGE2 3456 3335 -0.949709 0.0247859 -1.58401 1 0 1 1 0 0 +EDGE2 3456 3355 -0.966802 -0.0404116 -1.59163 1 0 1 1 0 0 +EDGE2 3456 815 -0.952904 -0.0680445 -1.57127 1 0 1 1 0 0 +EDGE2 3456 755 -1.03258 0.0221091 -1.5657 1 0 1 1 0 0 +EDGE2 3456 775 -1.01737 0.0553924 -1.53511 1 0 1 1 0 0 +EDGE2 3456 695 -1.03634 -0.0109298 1.57572 1 0 1 1 0 0 +EDGE2 3456 3337 0.954566 0.000872403 0.00962904 1 0 1 1 0 0 +EDGE2 3456 796 0.0100901 -0.04671 -0.0412446 1 0 1 1 0 0 +EDGE2 3456 3336 -0.0514914 0.01161 -0.0135569 1 0 1 1 0 0 +EDGE2 3456 3356 0.0215694 0.0980416 -0.033923 1 0 1 1 0 0 +EDGE2 3456 816 -0.00954749 0.0895799 0.0285018 1 0 1 1 0 0 +EDGE2 3456 696 0.082238 0.0860618 -0.0325219 1 0 1 1 0 0 +EDGE2 3456 756 0.0178676 0.0246943 0.00385412 1 0 1 1 0 0 +EDGE2 3456 776 -0.0662852 -0.0413254 0.0197253 1 0 1 1 0 0 +EDGE2 3456 3357 1.00947 0.0304265 -0.0104753 1 0 1 1 0 0 +EDGE2 3456 697 1.03531 0.0556347 -0.0155224 1 0 1 1 0 0 +EDGE2 3456 777 1.04808 -0.0254404 0.0087802 1 0 1 1 0 0 +EDGE2 3456 797 1.04738 -0.034394 -0.0145324 1 0 1 1 0 0 +EDGE2 3456 817 0.951381 0.0403657 0.0433241 1 0 1 1 0 0 +EDGE2 3456 757 1.00364 0.122972 0.0376652 1 0 1 1 0 0 +EDGE2 3457 3337 0.0272945 0.00398459 0.0110894 1 0 1 1 0 0 +EDGE2 3457 796 -0.992873 0.0881869 0.0158343 1 0 1 1 0 0 +EDGE2 3457 3336 -1.00721 -0.0115814 0.00481524 1 0 1 1 0 0 +EDGE2 3457 3356 -0.978123 0.000410352 -0.0153809 1 0 1 1 0 0 +EDGE2 3457 3456 -1.00897 0.0345739 0.00424046 1 0 1 1 0 0 +EDGE2 3457 816 -1.05763 -0.132644 -0.0293445 1 0 1 1 0 0 +EDGE2 3457 696 -0.987506 0.00253273 0.0192396 1 0 1 1 0 0 +EDGE2 3457 756 -0.985313 0.0172743 -0.049613 1 0 1 1 0 0 +EDGE2 3457 776 -0.991865 -0.00681306 -0.051739 1 0 1 1 0 0 +EDGE2 3457 3357 0.0246238 0.0159559 0.0139113 1 0 1 1 0 0 +EDGE2 3457 778 1.02121 0.0161813 -0.00337353 1 0 1 1 0 0 +EDGE2 3457 798 0.994769 -0.0371014 0.0189182 1 0 1 1 0 0 +EDGE2 3457 697 -0.128309 0.0164179 -0.00141166 1 0 1 1 0 0 +EDGE2 3457 777 0.04328 0.0439532 -0.0112263 1 0 1 1 0 0 +EDGE2 3457 797 0.0209318 -0.0261244 0.0125443 1 0 1 1 0 0 +EDGE2 3457 817 -0.0509798 0.0338353 -0.0255567 1 0 1 1 0 0 +EDGE2 3457 757 -0.0299414 -0.0630763 -0.0253693 1 0 1 1 0 0 +EDGE2 3457 3338 0.942817 0.0160194 -0.0283641 1 0 1 1 0 0 +EDGE2 3457 3358 1.03645 -0.0764289 -0.0186869 1 0 1 1 0 0 +EDGE2 3457 818 0.979044 0.083863 0.00312457 1 0 1 1 0 0 +EDGE2 3457 698 0.949485 -0.0085391 0.0351713 1 0 1 1 0 0 +EDGE2 3457 758 1.00347 0.00259731 -0.039367 1 0 1 1 0 0 +EDGE2 3458 3337 -0.990832 -0.030572 -0.0236897 1 0 1 1 0 0 +EDGE2 3458 3357 -0.994893 0.0605964 0.000153467 1 0 1 1 0 0 +EDGE2 3458 3457 -0.981425 -0.00991504 0.00859608 1 0 1 1 0 0 +EDGE2 3458 778 -0.008003 -0.0158714 0.00502076 1 0 1 1 0 0 +EDGE2 3458 798 -0.0165967 0.0755607 0.0127451 1 0 1 1 0 0 +EDGE2 3458 697 -1.04079 0.0841033 -0.00402156 1 0 1 1 0 0 +EDGE2 3458 777 -1.00391 -0.0874946 0.00752178 1 0 1 1 0 0 +EDGE2 3458 797 -0.961491 0.0114711 -0.0254217 1 0 1 1 0 0 +EDGE2 3458 817 -0.931275 -0.00810274 -0.00961562 1 0 1 1 0 0 +EDGE2 3458 757 -0.901674 -0.0016082 -0.00886795 1 0 1 1 0 0 +EDGE2 3458 3338 -0.0689638 -0.0141381 -0.00290999 1 0 1 1 0 0 +EDGE2 3458 3358 -0.00452504 -0.0109245 -0.00552591 1 0 1 1 0 0 +EDGE2 3458 818 -0.0639843 0.00233337 -0.0520578 1 0 1 1 0 0 +EDGE2 3458 699 1.00831 0.033217 -0.0243436 1 0 1 1 0 0 +EDGE2 3458 3339 1.00094 0.023174 0.00829628 1 0 1 1 0 0 +EDGE2 3458 698 -0.0536442 0.0372119 -0.00786987 1 0 1 1 0 0 +EDGE2 3458 758 0.0348576 -0.0564893 -0.0180061 1 0 1 1 0 0 +EDGE2 3458 3359 1.02883 -0.0659916 0.0250994 1 0 1 1 0 0 +EDGE2 3458 779 0.942616 0.00164371 -0.00141202 1 0 1 1 0 0 +EDGE2 3458 799 0.952488 -0.0324405 -0.0231599 1 0 1 1 0 0 +EDGE2 3458 819 1.02127 0.0453244 0.0248772 1 0 1 1 0 0 +EDGE2 3458 759 1.05785 0.0468105 -0.0432461 1 0 1 1 0 0 +EDGE2 3459 800 0.920716 0.0072415 -0.0209254 1 0 1 1 0 0 +EDGE2 3459 778 -1.04502 0.0252236 -0.0310042 1 0 1 1 0 0 +EDGE2 3459 798 -0.980441 0.105949 -0.0247431 1 0 1 1 0 0 +EDGE2 3459 3338 -0.905345 0.002805 0.048379 1 0 1 1 0 0 +EDGE2 3459 3358 -0.973198 -0.0143499 -0.00739201 1 0 1 1 0 0 +EDGE2 3459 3458 -1.03538 0.0232436 -0.0175988 1 0 1 1 0 0 +EDGE2 3459 818 -1.08085 0.00374241 -0.00483733 1 0 1 1 0 0 +EDGE2 3459 699 -0.0242568 -0.0384061 0.0123031 1 0 1 1 0 0 +EDGE2 3459 3339 -0.062297 -0.050817 0.0313046 1 0 1 1 0 0 +EDGE2 3459 698 -1.04861 -0.0113231 -0.00378653 1 0 1 1 0 0 +EDGE2 3459 758 -1.01021 -0.0301679 0.0248453 1 0 1 1 0 0 +EDGE2 3459 3359 -0.0537573 0.0217211 -0.0516832 1 0 1 1 0 0 +EDGE2 3459 779 0.0144219 0.0758157 -0.0319473 1 0 1 1 0 0 +EDGE2 3459 799 0.0123201 -0.0665978 -0.0254482 1 0 1 1 0 0 +EDGE2 3459 819 -0.0352684 0.0175689 -0.00765081 1 0 1 1 0 0 +EDGE2 3459 759 -0.0704643 0.0455636 -0.00631454 1 0 1 1 0 0 +EDGE2 3459 3340 1.03365 -0.0424253 -0.0156487 1 0 1 1 0 0 +EDGE2 3459 3360 0.975333 -0.0189505 0.003 1 0 1 1 0 0 +EDGE2 3459 3200 0.930128 0.0367584 -3.18136 1 0 1 1 0 0 +EDGE2 3459 3220 0.967808 0.0479697 -3.13544 1 0 1 1 0 0 +EDGE2 3459 820 1.03358 0.118832 0.000181804 1 0 1 1 0 0 +EDGE2 3459 740 1.02787 0.0142881 -3.13904 1 0 1 1 0 0 +EDGE2 3459 760 0.902286 0.0326163 0.00309863 1 0 1 1 0 0 +EDGE2 3459 780 0.925362 0.0431028 0.0297804 1 0 1 1 0 0 +EDGE2 3459 700 1.03995 -0.0992789 0.0193191 1 0 1 1 0 0 +EDGE2 3460 801 -0.00354455 0.905492 1.5633 1 0 1 1 0 0 +EDGE2 3460 3341 -0.024461 1.02225 1.60138 1 0 1 1 0 0 +EDGE2 3460 761 0.0261424 0.959968 1.55336 1 0 1 1 0 0 +EDGE2 3460 781 0.0346107 0.930555 1.57365 1 0 1 1 0 0 +EDGE2 3460 741 0.0172651 1.02174 1.58251 1 0 1 1 0 0 +EDGE2 3460 800 -0.0244647 0.128908 0.00448745 1 0 1 1 0 0 +EDGE2 3460 699 -1.05276 -0.0818822 0.00204633 1 0 1 1 0 0 +EDGE2 3460 3339 -0.924802 0.0555689 -0.0182868 1 0 1 1 0 0 +EDGE2 3460 3459 -0.963076 0.00502737 0.0072768 1 0 1 1 0 0 +EDGE2 3460 3359 -0.941086 -0.0568712 0.00874555 1 0 1 1 0 0 +EDGE2 3460 779 -1.03958 -0.002567 -0.00348502 1 0 1 1 0 0 +EDGE2 3460 799 -1.03969 -0.0600986 0.0233034 1 0 1 1 0 0 +EDGE2 3460 819 -1.04141 0.0109413 0.0331587 1 0 1 1 0 0 +EDGE2 3460 759 -0.948568 -0.0276065 -0.0103307 1 0 1 1 0 0 +EDGE2 3460 3340 0.000959901 0.0700039 0.0441433 1 0 1 1 0 0 +EDGE2 3460 3360 -0.0381465 0.0691468 0.0218987 1 0 1 1 0 0 +EDGE2 3460 3200 0.0422687 0.00751087 -3.1566 1 0 1 1 0 0 +EDGE2 3460 3220 -0.0628581 -0.0165009 -3.14144 1 0 1 1 0 0 +EDGE2 3460 820 -0.0384146 0.031107 0.0130464 1 0 1 1 0 0 +EDGE2 3460 701 0.032868 -0.950505 -1.55412 1 0 1 1 0 0 +EDGE2 3460 740 0.0381513 0.0429681 -3.14187 1 0 1 1 0 0 +EDGE2 3460 760 -0.0211993 -0.0268071 -0.0222353 1 0 1 1 0 0 +EDGE2 3460 780 0.148831 0.00179481 0.0157331 1 0 1 1 0 0 +EDGE2 3460 700 -0.0281492 0.00802842 0.0115745 1 0 1 1 0 0 +EDGE2 3460 3201 -0.0209153 -1.08608 -1.56496 1 0 1 1 0 0 +EDGE2 3460 3221 0.00480342 -1.06049 -1.57559 1 0 1 1 0 0 +EDGE2 3460 3361 0.0309576 -0.963021 -1.59432 1 0 1 1 0 0 +EDGE2 3460 821 0.0759642 -1.01652 -1.57418 1 0 1 1 0 0 +EDGE2 3460 3199 1.03749 -0.00314159 -3.16733 1 0 1 1 0 0 +EDGE2 3460 3219 1.02463 0.0517024 -3.14716 1 0 1 1 0 0 +EDGE2 3460 739 0.940097 0.0465885 -3.16939 1 0 1 1 0 0 +EDGE2 3461 800 -0.965985 0.00763841 1.59711 1 0 1 1 0 0 +EDGE2 3461 3340 -1.03188 0.0182175 1.57862 1 0 1 1 0 0 +EDGE2 3461 3460 -1.05853 -0.0685898 1.53736 1 0 1 1 0 0 +EDGE2 3461 3360 -0.996303 0.0148376 1.55784 1 0 1 1 0 0 +EDGE2 3461 3200 -0.973896 -0.0132624 -1.60346 1 0 1 1 0 0 +EDGE2 3461 3220 -0.964712 -0.0344201 -1.54717 1 0 1 1 0 0 +EDGE2 3461 820 -1.0386 -0.127012 1.57714 1 0 1 1 0 0 +EDGE2 3461 701 0.0125015 -0.0109933 0.0160415 1 0 1 1 0 0 +EDGE2 3461 740 -0.9788 -0.0366275 -1.57732 1 0 1 1 0 0 +EDGE2 3461 760 -0.951173 -0.0601221 1.54707 1 0 1 1 0 0 +EDGE2 3461 780 -1.07259 -0.0160844 1.54967 1 0 1 1 0 0 +EDGE2 3461 700 -1.0086 -0.000416529 1.56307 1 0 1 1 0 0 +EDGE2 3461 3201 -0.00307983 -0.0214034 -0.0167132 1 0 1 1 0 0 +EDGE2 3461 3221 -0.0101758 0.0338561 -0.0423864 1 0 1 1 0 0 +EDGE2 3461 3361 0.0242853 -0.0581706 -0.0307434 1 0 1 1 0 0 +EDGE2 3461 821 -0.00426163 -0.0104064 0.0124912 1 0 1 1 0 0 +EDGE2 3461 822 1.08516 -0.0488856 0.0241135 1 0 1 1 0 0 +EDGE2 3461 3222 1.08514 -0.0331168 -0.0307663 1 0 1 1 0 0 +EDGE2 3461 3362 0.997153 -0.00531135 0.028385 1 0 1 1 0 0 +EDGE2 3461 3202 0.946568 -0.0580896 -0.0102127 1 0 1 1 0 0 +EDGE2 3461 702 1.0068 -0.028082 -0.00940458 1 0 1 1 0 0 +EDGE2 3462 3203 0.912823 0.0531949 0.0334444 1 0 1 1 0 0 +EDGE2 3462 701 -0.996135 -0.05316 0.00248552 1 0 1 1 0 0 +EDGE2 3462 3461 -0.94998 0.0594459 -0.0180296 1 0 1 1 0 0 +EDGE2 3462 3201 -0.984686 -0.00823683 0.0152876 1 0 1 1 0 0 +EDGE2 3462 3221 -1.00691 -0.0502029 0.0132063 1 0 1 1 0 0 +EDGE2 3462 3361 -0.929412 -0.00193089 -0.00664849 1 0 1 1 0 0 +EDGE2 3462 821 -1.10004 -0.034426 0.0049664 1 0 1 1 0 0 +EDGE2 3462 822 0.0207188 -0.0450792 -0.0222395 1 0 1 1 0 0 +EDGE2 3462 3222 0.00455402 0.0704147 -0.0106376 1 0 1 1 0 0 +EDGE2 3462 3362 -0.00642007 -0.0528121 0.0157581 1 0 1 1 0 0 +EDGE2 3462 3202 0.026417 -0.00929684 0.0010304 1 0 1 1 0 0 +EDGE2 3462 3363 1.03213 0.0460226 -0.0182191 1 0 1 1 0 0 +EDGE2 3462 702 0.129218 0.0284305 0.00981263 1 0 1 1 0 0 +EDGE2 3462 3223 0.994619 -0.0160368 0.00340646 1 0 1 1 0 0 +EDGE2 3462 703 0.930957 -0.0276538 -0.0133023 1 0 1 1 0 0 +EDGE2 3462 823 0.957404 0.0634413 -0.00638451 1 0 1 1 0 0 +EDGE2 3463 3203 -0.0165981 0.0341648 -0.0298316 1 0 1 1 0 0 +EDGE2 3463 822 -1.024 0.0203523 -0.00393655 1 0 1 1 0 0 +EDGE2 3463 3222 -0.984094 -0.0501953 -0.0220537 1 0 1 1 0 0 +EDGE2 3463 3362 -1.05761 0.0332539 -0.0058416 1 0 1 1 0 0 +EDGE2 3463 3462 -0.99669 0.0380167 0.00449322 1 0 1 1 0 0 +EDGE2 3463 3202 -1.0321 -0.088563 -0.0187487 1 0 1 1 0 0 +EDGE2 3463 3363 -0.00764901 0.103224 0.0213926 1 0 1 1 0 0 +EDGE2 3463 702 -1.10469 -0.0352911 0.0168022 1 0 1 1 0 0 +EDGE2 3463 3223 -0.0417731 0.013845 0.0215435 1 0 1 1 0 0 +EDGE2 3463 3364 1.08633 -0.127246 -0.0578899 1 0 1 1 0 0 +EDGE2 3463 703 -0.00673808 -0.0420412 0.0135705 1 0 1 1 0 0 +EDGE2 3463 823 -0.0262137 -0.0175456 0.0125699 1 0 1 1 0 0 +EDGE2 3463 824 1.10092 0.0140476 -0.00859267 1 0 1 1 0 0 +EDGE2 3463 3204 1.05549 0.00657459 -0.00565987 1 0 1 1 0 0 +EDGE2 3463 3224 1.01567 0.0224524 -0.0100005 1 0 1 1 0 0 +EDGE2 3463 704 1.0513 -0.0479198 -0.00172925 1 0 1 1 0 0 +EDGE2 3464 3203 -0.966423 -0.0510041 0.00572723 1 0 1 1 0 0 +EDGE2 3464 3363 -1.00525 -0.0534606 0.0336402 1 0 1 1 0 0 +EDGE2 3464 3463 -0.982217 -0.000117886 -0.0122581 1 0 1 1 0 0 +EDGE2 3464 3223 -1.0658 0.106801 0.0476122 1 0 1 1 0 0 +EDGE2 3464 3364 0.0535556 -0.0166952 -0.000352384 1 0 1 1 0 0 +EDGE2 3464 703 -1.01439 -0.0111161 0.00910924 1 0 1 1 0 0 +EDGE2 3464 823 -0.99927 0.0610455 0.0164814 1 0 1 1 0 0 +EDGE2 3464 824 0.0149383 0.0577355 -0.011319 1 0 1 1 0 0 +EDGE2 3464 3204 0.0562844 -0.0839077 0.0358421 1 0 1 1 0 0 +EDGE2 3464 3224 0.0391725 0.0788581 -0.00558005 1 0 1 1 0 0 +EDGE2 3464 704 0.046046 0.0460979 0.000348439 1 0 1 1 0 0 +EDGE2 3464 865 0.962354 0.0166214 -3.10042 1 0 1 1 0 0 +EDGE2 3464 3225 1.02298 -0.000385786 -0.0119568 1 0 1 1 0 0 +EDGE2 3464 3425 1.04056 -0.000134652 -3.13006 1 0 1 1 0 0 +EDGE2 3464 3445 0.903907 0.0759805 -3.18333 1 0 1 1 0 0 +EDGE2 3464 3365 1.0051 0.00499736 0.000329181 1 0 1 1 0 0 +EDGE2 3464 1205 1.05298 0.0564813 -3.15329 1 0 1 1 0 0 +EDGE2 3464 3205 1.05871 0.00922242 0.0309424 1 0 1 1 0 0 +EDGE2 3464 905 0.919347 -0.00338607 -3.13659 1 0 1 1 0 0 +EDGE2 3464 705 1.04071 0.0817093 -0.0102768 1 0 1 1 0 0 +EDGE2 3464 825 1.03716 -0.100146 0.000246528 1 0 1 1 0 0 +EDGE2 3464 845 1.0473 -0.0233471 -3.14388 1 0 1 1 0 0 +EDGE2 3465 3364 -0.978031 -0.0170915 -0.000317308 1 0 1 1 0 0 +EDGE2 3465 3464 -0.982178 -0.0103741 -0.00922582 1 0 1 1 0 0 +EDGE2 3465 824 -1.10381 -0.0325046 -0.0239638 1 0 1 1 0 0 +EDGE2 3465 3204 -0.937545 0.0419335 -0.00760375 1 0 1 1 0 0 +EDGE2 3465 3224 -0.984612 0.0505564 -0.00102278 1 0 1 1 0 0 +EDGE2 3465 704 -1.07577 -0.00336593 0.0134245 1 0 1 1 0 0 +EDGE2 3465 865 -0.0328202 -0.0222466 -3.11896 1 0 1 1 0 0 +EDGE2 3465 3446 -0.0888941 -0.954971 -1.59224 1 0 1 1 0 0 +EDGE2 3465 3225 0.0122266 -0.0609967 0.0484948 1 0 1 1 0 0 +EDGE2 3465 826 0.0221965 -1.04169 -1.57921 1 0 1 1 0 0 +EDGE2 3465 866 0.050224 -1.04923 -1.54472 1 0 1 1 0 0 +EDGE2 3465 906 -0.0532885 -0.902246 -1.55623 1 0 1 1 0 0 +EDGE2 3465 3426 -0.0612875 -0.96605 -1.56355 1 0 1 1 0 0 +EDGE2 3465 846 0.045919 -1.0035 -1.55232 1 0 1 1 0 0 +EDGE2 3465 3425 -0.010667 -0.0388983 -3.1364 1 0 1 1 0 0 +EDGE2 3465 3445 0.0382064 -0.0646455 -3.14424 1 0 1 1 0 0 +EDGE2 3465 3365 -0.0510537 -0.00779975 0.0308867 1 0 1 1 0 0 +EDGE2 3465 1205 0.00326402 -0.0182626 -3.15956 1 0 1 1 0 0 +EDGE2 3465 3205 -0.0867544 -0.010526 0.00131664 1 0 1 1 0 0 +EDGE2 3465 905 0.00526747 -0.0122277 -3.13637 1 0 1 1 0 0 +EDGE2 3465 864 0.935923 0.0384476 -3.16029 1 0 1 1 0 0 +EDGE2 3465 705 -0.0700445 -0.0157318 -0.00868106 1 0 1 1 0 0 +EDGE2 3465 825 0.136165 -0.0174351 0.00767375 1 0 1 1 0 0 +EDGE2 3465 845 0.00293193 0.0630856 -3.1531 1 0 1 1 0 0 +EDGE2 3465 1204 0.999244 0.0371095 -3.12232 1 0 1 1 0 0 +EDGE2 3465 3424 1.04027 -0.0279154 -3.09519 1 0 1 1 0 0 +EDGE2 3465 3444 0.961831 -0.00626059 -3.13682 1 0 1 1 0 0 +EDGE2 3465 904 1.02981 0.0330549 -3.11807 1 0 1 1 0 0 +EDGE2 3465 844 0.975111 0.0640678 -3.13028 1 0 1 1 0 0 +EDGE2 3465 1206 0.00910088 0.990343 1.60056 1 0 1 1 0 0 +EDGE2 3465 3226 0.0431266 1.03614 1.58534 1 0 1 1 0 0 +EDGE2 3465 3366 0.0110043 0.97344 1.5445 1 0 1 1 0 0 +EDGE2 3465 3206 -0.0249909 0.987338 1.54187 1 0 1 1 0 0 +EDGE2 3465 706 0.115191 1.02142 1.61614 1 0 1 1 0 0 +EDGE2 3466 865 -0.942851 -0.0626273 1.5627 1 0 1 1 0 0 +EDGE2 3466 3225 -0.918827 -0.0290018 -1.54722 1 0 1 1 0 0 +EDGE2 3466 3425 -1.06576 0.016811 1.59771 1 0 1 1 0 0 +EDGE2 3466 3445 -1.07986 0.00384056 1.60383 1 0 1 1 0 0 +EDGE2 3466 3465 -1.04423 0.0121486 -1.54789 1 0 1 1 0 0 +EDGE2 3466 3365 -0.940997 -0.0429914 -1.5684 1 0 1 1 0 0 +EDGE2 3466 1205 -1.01331 0.176905 1.55616 1 0 1 1 0 0 +EDGE2 3466 3205 -0.975986 -0.01753 -1.57801 1 0 1 1 0 0 +EDGE2 3466 905 -0.938632 -0.063102 1.54225 1 0 1 1 0 0 +EDGE2 3466 705 -1.0732 0.0157824 -1.54932 1 0 1 1 0 0 +EDGE2 3466 825 -1.01982 0.00523872 -1.57477 1 0 1 1 0 0 +EDGE2 3466 845 -0.920351 0.0334912 1.5704 1 0 1 1 0 0 +EDGE2 3466 3367 1.01967 -0.0144731 0.0259314 1 0 1 1 0 0 +EDGE2 3466 1206 -0.130094 0.0440369 -0.0148134 1 0 1 1 0 0 +EDGE2 3466 3226 0.05838 -0.0327702 0.00214797 1 0 1 1 0 0 +EDGE2 3466 3366 -0.0291222 0.00388099 0.00185783 1 0 1 1 0 0 +EDGE2 3466 3206 -0.0256699 -0.0110916 0.0301083 1 0 1 1 0 0 +EDGE2 3466 706 -0.0470253 0.0229695 0.0376513 1 0 1 1 0 0 +EDGE2 3466 1207 0.978895 -0.0397281 -0.00450079 1 0 1 1 0 0 +EDGE2 3466 3207 1.0402 0.0531444 0.00510426 1 0 1 1 0 0 +EDGE2 3466 3227 1.01605 0.0467347 -0.0230099 1 0 1 1 0 0 +EDGE2 3466 707 0.994841 0.0206434 -0.0180795 1 0 1 1 0 0 +EDGE2 3467 3228 0.977932 0.00956127 0.0269617 1 0 1 1 0 0 +EDGE2 3467 3367 0.021352 0.0444048 0.000653094 1 0 1 1 0 0 +EDGE2 3467 1206 -0.921327 0.0375375 -0.024985 1 0 1 1 0 0 +EDGE2 3467 3226 -0.942212 0.0248127 0.00908943 1 0 1 1 0 0 +EDGE2 3467 3366 -1.04 0.0307841 0.00594012 1 0 1 1 0 0 +EDGE2 3467 3466 -0.990027 -0.0562229 0.0064505 1 0 1 1 0 0 +EDGE2 3467 3206 -0.951382 -0.0169987 -0.0508528 1 0 1 1 0 0 +EDGE2 3467 706 -0.951713 -0.0522098 0.0184702 1 0 1 1 0 0 +EDGE2 3467 1207 -0.0244868 0.0272999 0.0361814 1 0 1 1 0 0 +EDGE2 3467 3207 -0.0235618 0.00936806 -0.00753575 1 0 1 1 0 0 +EDGE2 3467 3227 0.0647506 -0.0966807 -0.00348324 1 0 1 1 0 0 +EDGE2 3467 707 0.0271104 -0.0469383 0.00190414 1 0 1 1 0 0 +EDGE2 3467 3368 1.03885 -0.0104727 -0.01054 1 0 1 1 0 0 +EDGE2 3467 708 1.04624 -0.0290052 -0.0198597 1 0 1 1 0 0 +EDGE2 3467 1208 0.995518 -0.0612433 0.0211745 1 0 1 1 0 0 +EDGE2 3467 3208 0.968576 -0.00350235 0.00159142 1 0 1 1 0 0 +EDGE2 3468 3228 0.00666145 0.0792552 -0.0007253 1 0 1 1 0 0 +EDGE2 3468 3367 -1.02715 -0.0386215 -0.0215145 1 0 1 1 0 0 +EDGE2 3468 3467 -1.05203 0.0475583 0.00701407 1 0 1 1 0 0 +EDGE2 3468 1207 -0.941295 -0.017767 0.00078966 1 0 1 1 0 0 +EDGE2 3468 3207 -0.949487 -0.00319251 0.00652929 1 0 1 1 0 0 +EDGE2 3468 3227 -1.05616 0.0329026 0.044684 1 0 1 1 0 0 +EDGE2 3468 707 -0.992708 0.0556453 -0.0293968 1 0 1 1 0 0 +EDGE2 3468 3368 -0.0569889 0.00755594 -0.0317273 1 0 1 1 0 0 +EDGE2 3468 3369 1.01102 -0.0192546 -0.0116582 1 0 1 1 0 0 +EDGE2 3468 708 -0.00642924 -0.0310999 -0.0210655 1 0 1 1 0 0 +EDGE2 3468 1208 0.0206992 -0.00496415 0.0341971 1 0 1 1 0 0 +EDGE2 3468 3208 -0.0344268 -0.0224195 -0.018461 1 0 1 1 0 0 +EDGE2 3468 1209 0.929618 -0.0883198 0.0203492 1 0 1 1 0 0 +EDGE2 3468 3209 0.97391 0.0183319 -0.00748021 1 0 1 1 0 0 +EDGE2 3468 3229 0.957439 -0.0833835 0.00253195 1 0 1 1 0 0 +EDGE2 3468 709 0.98653 0.050217 -0.0475014 1 0 1 1 0 0 +EDGE2 3469 3228 -0.963611 -0.0139065 -0.0304145 1 0 1 1 0 0 +EDGE2 3469 3468 -0.995457 0.0388252 0.0122795 1 0 1 1 0 0 +EDGE2 3469 3368 -1.05048 0.0347534 -0.00914437 1 0 1 1 0 0 +EDGE2 3469 3370 1.00908 0.0184477 0.0470646 1 0 1 1 0 0 +EDGE2 3469 3369 0.0506485 -0.0406112 0.00699285 1 0 1 1 0 0 +EDGE2 3469 708 -1.05113 0.0186173 0.0123138 1 0 1 1 0 0 +EDGE2 3469 1208 -0.994747 -0.0289991 -0.0346529 1 0 1 1 0 0 +EDGE2 3469 3208 -0.99999 0.0953825 -0.00562862 1 0 1 1 0 0 +EDGE2 3469 1209 -0.00959915 0.0571018 -0.00569757 1 0 1 1 0 0 +EDGE2 3469 3209 0.0533102 -0.0643014 -0.00295617 1 0 1 1 0 0 +EDGE2 3469 3229 -0.0746409 0.0154188 -0.0183128 1 0 1 1 0 0 +EDGE2 3469 709 -0.0207945 -0.0391831 -0.0525697 1 0 1 1 0 0 +EDGE2 3469 730 0.914588 0.0493364 -3.15252 1 0 1 1 0 0 +EDGE2 3469 3190 1.02224 0.0429823 -3.14808 1 0 1 1 0 0 +EDGE2 3469 3210 1.10433 -0.00748489 0.0112845 1 0 1 1 0 0 +EDGE2 3469 3230 1.0635 0.00117133 -0.0187545 1 0 1 1 0 0 +EDGE2 3469 1210 0.943313 0.00667667 0.00928208 1 0 1 1 0 0 +EDGE2 3469 710 1.06434 -0.117847 0.0166287 1 0 1 1 0 0 +EDGE2 3470 1211 0.0636554 0.99639 1.57282 1 0 1 1 0 0 +EDGE2 3470 3211 -0.0605335 1.03944 1.54934 1 0 1 1 0 0 +EDGE2 3470 3231 -0.0061193 0.933934 1.57916 1 0 1 1 0 0 +EDGE2 3470 3191 0.0671955 0.979683 1.56476 1 0 1 1 0 0 +EDGE2 3470 711 0.01875 0.98282 1.58038 1 0 1 1 0 0 +EDGE2 3470 731 0.0542731 0.953927 1.58514 1 0 1 1 0 0 +EDGE2 3470 3370 0.0136747 -0.0918694 0.0179615 1 0 1 1 0 0 +EDGE2 3470 3369 -1.00391 -0.0352686 0.00432434 1 0 1 1 0 0 +EDGE2 3470 3469 -0.906826 -0.0602125 0.00976375 1 0 1 1 0 0 +EDGE2 3470 1209 -0.959068 -0.0721417 0.0126059 1 0 1 1 0 0 +EDGE2 3470 3209 -0.92767 -0.053546 0.0124132 1 0 1 1 0 0 +EDGE2 3470 3229 -1.05879 -0.0510497 -0.0216451 1 0 1 1 0 0 +EDGE2 3470 709 -1.0145 -0.0104735 -0.0256445 1 0 1 1 0 0 +EDGE2 3470 730 0.0418844 -0.0388119 -3.12386 1 0 1 1 0 0 +EDGE2 3470 3190 -0.00558025 0.0566592 -3.16345 1 0 1 1 0 0 +EDGE2 3470 3210 0.0118207 0.0127257 0.0084629 1 0 1 1 0 0 +EDGE2 3470 3230 -0.00791343 0.0886182 0.0103022 1 0 1 1 0 0 +EDGE2 3470 1210 0.0319086 -0.0117149 0.00165569 1 0 1 1 0 0 +EDGE2 3470 710 -0.00754324 -0.005722 0.0212975 1 0 1 1 0 0 +EDGE2 3470 3371 0.0825265 -1.02966 -1.58208 1 0 1 1 0 0 +EDGE2 3470 3189 1.02997 -0.00246228 -3.12093 1 0 1 1 0 0 +EDGE2 3470 729 0.965461 0.00144387 -3.13832 1 0 1 1 0 0 +EDGE2 3471 3370 -1.0279 -0.0204923 1.59644 1 0 1 1 0 0 +EDGE2 3471 3470 -1.02321 -0.0736128 1.54874 1 0 1 1 0 0 +EDGE2 3471 730 -1.01745 -0.0205296 -1.53882 1 0 1 1 0 0 +EDGE2 3471 3190 -1.04084 0.0220336 -1.54617 1 0 1 1 0 0 +EDGE2 3471 3210 -0.927634 0.0248402 1.57575 1 0 1 1 0 0 +EDGE2 3471 3230 -0.981165 -0.0110934 1.55988 1 0 1 1 0 0 +EDGE2 3471 1210 -0.937515 0.002699 1.57968 1 0 1 1 0 0 +EDGE2 3471 710 -0.953089 0.0298446 1.61305 1 0 1 1 0 0 +EDGE2 3471 3371 0.0112215 0.138901 0.0136882 1 0 1 1 0 0 +EDGE2 3471 3372 0.980937 0.0453978 0.00545283 1 0 1 1 0 0 +EDGE2 3472 3471 -1.04601 0.060214 0.00326683 1 0 1 1 0 0 +EDGE2 3472 3371 -0.977242 -0.101218 0.00840559 1 0 1 1 0 0 +EDGE2 3472 3373 1.04774 0.0199201 0.016651 1 0 1 1 0 0 +EDGE2 3472 3372 0.0339362 0.00600107 -0.028396 1 0 1 1 0 0 +EDGE2 3473 3373 0.0302143 0.0296347 0.0200751 1 0 1 1 0 0 +EDGE2 3473 3372 -0.969845 0.040304 0.00421045 1 0 1 1 0 0 +EDGE2 3473 3472 -1.06767 0.0230089 0.0330303 1 0 1 1 0 0 +EDGE2 3473 3374 1.03968 -0.033735 -0.00429131 1 0 1 1 0 0 +EDGE2 3474 3373 -0.943399 0.00784255 -0.00485763 1 0 1 1 0 0 +EDGE2 3474 3473 -1.02048 0.00183409 0.0140625 1 0 1 1 0 0 +EDGE2 3474 3374 0.00501378 -0.0318475 0.00200276 1 0 1 1 0 0 +EDGE2 3474 3115 1.06883 -0.0208005 -3.11555 1 0 1 1 0 0 +EDGE2 3474 3175 0.913143 -0.0478693 -3.15255 1 0 1 1 0 0 +EDGE2 3474 3375 1.05646 0.0180577 -0.0291219 1 0 1 1 0 0 +EDGE2 3474 3135 1.07862 -0.00321271 -3.12062 1 0 1 1 0 0 +EDGE2 3474 1175 0.925316 -0.0117166 -3.14001 1 0 1 1 0 0 +EDGE2 3474 1195 1.0109 0.0441855 -3.17764 1 0 1 1 0 0 +EDGE2 3474 3095 1.06227 -0.0283655 -3.14243 1 0 1 1 0 0 +EDGE2 3474 1155 0.998796 0.0472892 -3.12516 1 0 1 1 0 0 +EDGE2 3475 3474 -1.00961 -0.0369806 -0.0110015 1 0 1 1 0 0 +EDGE2 3475 3374 -1.05596 0.0661547 0.0429345 1 0 1 1 0 0 +EDGE2 3475 1196 0.0857194 -0.942056 -1.53438 1 0 1 1 0 0 +EDGE2 3475 3116 0.0722975 -0.988842 -1.60512 1 0 1 1 0 0 +EDGE2 3475 3136 -0.0331443 -0.911291 -1.53747 1 0 1 1 0 0 +EDGE2 3475 3376 0.0981694 -1.0964 -1.55388 1 0 1 1 0 0 +EDGE2 3475 3096 0.135627 -0.944144 -1.57785 1 0 1 1 0 0 +EDGE2 3475 1156 0.00893132 -0.968752 -1.58232 1 0 1 1 0 0 +EDGE2 3475 1176 -0.0706572 -0.974654 -1.58165 1 0 1 1 0 0 +EDGE2 3475 1174 1.05324 0.0761676 -3.1389 1 0 1 1 0 0 +EDGE2 3475 3115 -0.0370544 0.0444659 -3.14937 1 0 1 1 0 0 +EDGE2 3475 3175 -0.0314292 -0.0714299 -3.11655 1 0 1 1 0 0 +EDGE2 3475 3375 0.00676296 -0.0283719 0.0245533 1 0 1 1 0 0 +EDGE2 3475 3135 0.00963876 0.0466019 -3.17781 1 0 1 1 0 0 +EDGE2 3475 1175 0.0890716 -0.0395436 -3.14193 1 0 1 1 0 0 +EDGE2 3475 1195 -0.0268596 6.10801e-05 -3.16883 1 0 1 1 0 0 +EDGE2 3475 3095 -0.0446356 0.0303793 -3.15347 1 0 1 1 0 0 +EDGE2 3475 1155 0.0664383 0.0409612 -3.15183 1 0 1 1 0 0 +EDGE2 3475 3174 1.08111 -0.0421437 -3.12911 1 0 1 1 0 0 +EDGE2 3475 3094 1.06657 -0.0309155 -3.13533 1 0 1 1 0 0 +EDGE2 3475 3114 1.06421 0.0225965 -3.12177 1 0 1 1 0 0 +EDGE2 3475 3134 1.04932 -0.0922438 -3.1426 1 0 1 1 0 0 +EDGE2 3475 1194 1.01782 -0.0401724 -3.12719 1 0 1 1 0 0 +EDGE2 3475 1154 0.974243 -0.0693319 -3.11699 1 0 1 1 0 0 +EDGE2 3475 3176 -0.0913302 0.992796 1.57222 1 0 1 1 0 0 +EDGE2 3476 1197 1.0493 -0.0202389 0.00715957 1 0 1 1 0 0 +EDGE2 3476 3117 1.05715 -0.108443 0.0376118 1 0 1 1 0 0 +EDGE2 3476 3137 0.980958 -0.0430985 -0.0441186 1 0 1 1 0 0 +EDGE2 3476 3377 1.1019 0.0425448 -0.00487509 1 0 1 1 0 0 +EDGE2 3476 3097 0.975504 0.00698341 -0.0183872 1 0 1 1 0 0 +EDGE2 3476 1177 1.02197 -0.120683 0.00318295 1 0 1 1 0 0 +EDGE2 3476 1157 0.952546 0.0119372 0.000110588 1 0 1 1 0 0 +EDGE2 3476 1196 0.0274743 0.0163402 -0.0255904 1 0 1 1 0 0 +EDGE2 3476 3116 0.113448 0.00148569 -0.00578866 1 0 1 1 0 0 +EDGE2 3476 3136 -0.00700816 -0.0415938 0.0104095 1 0 1 1 0 0 +EDGE2 3476 3376 -0.00141117 -0.0802947 0.0398218 1 0 1 1 0 0 +EDGE2 3476 3096 0.0656318 0.0566216 0.0197701 1 0 1 1 0 0 +EDGE2 3476 1156 0.0265608 0.0138795 0.030523 1 0 1 1 0 0 +EDGE2 3476 1176 0.0141437 0.125695 0.00621305 1 0 1 1 0 0 +EDGE2 3476 3115 -0.976128 0.00931174 -1.58573 1 0 1 1 0 0 +EDGE2 3476 3175 -1.00712 0.08016 -1.55563 1 0 1 1 0 0 +EDGE2 3476 3375 -1.06419 0.0976172 1.55159 1 0 1 1 0 0 +EDGE2 3476 3475 -0.936296 -0.0629482 1.5396 1 0 1 1 0 0 +EDGE2 3476 3135 -1.06279 0.0102855 -1.5571 1 0 1 1 0 0 +EDGE2 3476 1175 -1.00134 -0.000608823 -1.54893 1 0 1 1 0 0 +EDGE2 3476 1195 -0.961008 0.0479855 -1.58701 1 0 1 1 0 0 +EDGE2 3476 3095 -0.971573 -0.00985028 -1.55101 1 0 1 1 0 0 +EDGE2 3476 1155 -1.00352 0.0545027 -1.58058 1 0 1 1 0 0 +EDGE2 3477 1197 0.0393551 0.0459263 -0.0117576 1 0 1 1 0 0 +EDGE2 3477 3098 1.04676 -0.00995312 0.00383084 1 0 1 1 0 0 +EDGE2 3477 3138 0.991758 0.0264457 -0.0078882 1 0 1 1 0 0 +EDGE2 3477 3378 0.980948 0.0664108 0.00901739 1 0 1 1 0 0 +EDGE2 3477 3118 0.987316 -0.0728716 -0.00916899 1 0 1 1 0 0 +EDGE2 3477 1178 0.983136 0.0154297 -0.0190958 1 0 1 1 0 0 +EDGE2 3477 1198 1.08076 0.0981111 0.0100139 1 0 1 1 0 0 +EDGE2 3477 1158 0.991393 -0.0453075 0.023727 1 0 1 1 0 0 +EDGE2 3477 3117 -0.00652149 0.0896432 -0.00910144 1 0 1 1 0 0 +EDGE2 3477 3137 -0.0332431 0.0347067 0.0084097 1 0 1 1 0 0 +EDGE2 3477 3377 -0.0215067 0.0135556 0.0138574 1 0 1 1 0 0 +EDGE2 3477 3097 -0.0184597 0.0385445 -0.00546053 1 0 1 1 0 0 +EDGE2 3477 1177 0.054185 -0.0235611 0.0134408 1 0 1 1 0 0 +EDGE2 3477 1157 0.0157891 -0.0348387 -0.0235732 1 0 1 1 0 0 +EDGE2 3477 1196 -1.04204 -0.0226478 -0.010194 1 0 1 1 0 0 +EDGE2 3477 3476 -1.0362 0.0244283 0.00987156 1 0 1 1 0 0 +EDGE2 3477 3116 -0.986243 -0.0220505 0.0204152 1 0 1 1 0 0 +EDGE2 3477 3136 -0.991511 0.0127939 -0.00589014 1 0 1 1 0 0 +EDGE2 3477 3376 -1.03891 -0.0565272 -0.0176155 1 0 1 1 0 0 +EDGE2 3477 3096 -0.985669 -0.015364 -0.00798911 1 0 1 1 0 0 +EDGE2 3477 1156 -1.00263 -0.0129025 0.0113802 1 0 1 1 0 0 +EDGE2 3477 1176 -0.933434 -0.00819096 -0.00298984 1 0 1 1 0 0 +EDGE2 3478 1197 -0.936692 0.0779305 0.00897749 1 0 1 1 0 0 +EDGE2 3478 3119 0.838414 0.0209496 0.0117676 1 0 1 1 0 0 +EDGE2 3478 3379 0.93983 0.0156077 -0.0264763 1 0 1 1 0 0 +EDGE2 3478 3139 0.962164 0.021969 0.0118108 1 0 1 1 0 0 +EDGE2 3478 1179 1.02451 -0.0308416 -0.00104418 1 0 1 1 0 0 +EDGE2 3478 1199 0.994981 -0.0118753 0.00336858 1 0 1 1 0 0 +EDGE2 3478 3099 0.983547 -0.00712363 -0.0105592 1 0 1 1 0 0 +EDGE2 3478 1159 0.96541 0.0138335 -0.029292 1 0 1 1 0 0 +EDGE2 3478 3098 -0.0460612 -0.0307965 -0.00326912 1 0 1 1 0 0 +EDGE2 3478 3138 -0.093834 0.00283364 -0.00679382 1 0 1 1 0 0 +EDGE2 3478 3378 -0.00442116 0.0521873 0.0189933 1 0 1 1 0 0 +EDGE2 3478 3118 0.00139705 0.0193754 -0.0100932 1 0 1 1 0 0 +EDGE2 3478 1178 -0.0190472 -0.0212077 0.0122883 1 0 1 1 0 0 +EDGE2 3478 1198 0.068799 0.0103425 -0.00460382 1 0 1 1 0 0 +EDGE2 3478 1158 -0.0219156 0.0403016 -0.0433249 1 0 1 1 0 0 +EDGE2 3478 3477 -0.992214 0.0733693 -0.0210602 1 0 1 1 0 0 +EDGE2 3478 3117 -0.949653 0.025457 -0.0137984 1 0 1 1 0 0 +EDGE2 3478 3137 -1.02775 -0.074008 0.0174354 1 0 1 1 0 0 +EDGE2 3478 3377 -1.0228 0.0679462 0.00116315 1 0 1 1 0 0 +EDGE2 3478 3097 -1.03835 0.0635861 0.00548933 1 0 1 1 0 0 +EDGE2 3478 1177 -1.0022 0.0146603 -0.0136653 1 0 1 1 0 0 +EDGE2 3478 1157 -1.05293 0.0511633 0.0151162 1 0 1 1 0 0 +EDGE2 3479 1160 0.932353 -0.0376539 0.00947707 1 0 1 1 0 0 +EDGE2 3479 3140 0.968755 0.00586298 0.0251988 1 0 1 1 0 0 +EDGE2 3479 3420 0.955509 0.0273181 -3.12188 1 0 1 1 0 0 +EDGE2 3479 3440 0.919454 0.00441263 -3.13347 1 0 1 1 0 0 +EDGE2 3479 3380 1.04147 -0.0170683 0.0142789 1 0 1 1 0 0 +EDGE2 3479 1200 0.985586 -0.0693338 -4.06765e-05 1 0 1 1 0 0 +EDGE2 3479 3100 1.0053 -0.165658 0.0170171 1 0 1 1 0 0 +EDGE2 3479 3120 1.07455 -0.0207796 0.0141841 1 0 1 1 0 0 +EDGE2 3479 1180 1.0919 0.0410613 0.010596 1 0 1 1 0 0 +EDGE2 3479 900 0.963375 0.0354089 -3.15412 1 0 1 1 0 0 +EDGE2 3479 840 0.957471 0.00225368 -3.13406 1 0 1 1 0 0 +EDGE2 3479 860 0.98696 0.0303466 -3.157 1 0 1 1 0 0 +EDGE2 3479 3119 0.026363 0.0359007 0.0227998 1 0 1 1 0 0 +EDGE2 3479 3379 0.105884 -0.000608254 -0.00147232 1 0 1 1 0 0 +EDGE2 3479 3139 0.0860562 0.0464361 -0.00159667 1 0 1 1 0 0 +EDGE2 3479 1179 0.0127108 0.0101896 0.0345141 1 0 1 1 0 0 +EDGE2 3479 1199 -0.002652 0.0390413 -0.0374884 1 0 1 1 0 0 +EDGE2 3479 3099 -0.0483629 0.0125945 0.0130939 1 0 1 1 0 0 +EDGE2 3479 1159 -0.014934 -0.00218816 0.0167299 1 0 1 1 0 0 +EDGE2 3479 3098 -1.00891 -0.0450119 0.0156379 1 0 1 1 0 0 +EDGE2 3479 3138 -1.03928 0.00535875 -0.00143589 1 0 1 1 0 0 +EDGE2 3479 3378 -1.01079 -0.03241 -0.00786946 1 0 1 1 0 0 +EDGE2 3479 3478 -1.06006 -0.0223011 0.00701099 1 0 1 1 0 0 +EDGE2 3479 3118 -1.01694 -0.0242792 0.028882 1 0 1 1 0 0 +EDGE2 3479 1178 -1.04284 0.0834809 -0.00586612 1 0 1 1 0 0 +EDGE2 3479 1198 -1.04661 -0.011738 -0.0016979 1 0 1 1 0 0 +EDGE2 3479 1158 -1.10773 0.0644641 -0.0188793 1 0 1 1 0 0 +EDGE2 3480 839 0.978266 0.0147324 -3.17344 1 0 1 1 0 0 +EDGE2 3480 899 1.08771 0.0206033 -3.14344 1 0 1 1 0 0 +EDGE2 3480 3419 0.999525 -0.0214388 -3.1828 1 0 1 1 0 0 +EDGE2 3480 3439 0.94636 0.0437536 -3.13108 1 0 1 1 0 0 +EDGE2 3480 859 1.01883 -0.0499085 -3.14382 1 0 1 1 0 0 +EDGE2 3480 3441 0.0368643 -1.0101 -1.55126 1 0 1 1 0 0 +EDGE2 3480 841 0.0672763 -1.08249 -1.5813 1 0 1 1 0 0 +EDGE2 3480 901 0.00751743 -0.992722 -1.56565 1 0 1 1 0 0 +EDGE2 3480 1201 0.0700098 -1.08565 -1.53569 1 0 1 1 0 0 +EDGE2 3480 3421 0.00473809 -1.07023 -1.57195 1 0 1 1 0 0 +EDGE2 3480 861 -0.0344903 -1.02523 -1.5692 1 0 1 1 0 0 +EDGE2 3480 1160 -0.019469 -0.0259989 0.0181295 1 0 1 1 0 0 +EDGE2 3480 3140 -0.0522575 0.0529801 0.00803384 1 0 1 1 0 0 +EDGE2 3480 3420 -0.0376743 -0.0221665 -3.13791 1 0 1 1 0 0 +EDGE2 3480 3440 0.0352271 0.03847 -3.16566 1 0 1 1 0 0 +EDGE2 3480 3380 -0.0963808 0.0327203 0.00136725 1 0 1 1 0 0 +EDGE2 3480 1200 0.0672023 0.0407551 0.00959315 1 0 1 1 0 0 +EDGE2 3480 3100 -0.0185748 0.0657964 0.0436572 1 0 1 1 0 0 +EDGE2 3480 3120 -0.022398 0.0213433 -0.0104868 1 0 1 1 0 0 +EDGE2 3480 1180 0.0511569 0.100104 0.00420533 1 0 1 1 0 0 +EDGE2 3480 900 -0.0411684 0.0788418 -3.18623 1 0 1 1 0 0 +EDGE2 3480 840 -0.0671127 -0.00566664 -3.1253 1 0 1 1 0 0 +EDGE2 3480 860 0.00880047 -0.0303502 -3.11494 1 0 1 1 0 0 +EDGE2 3480 3101 0.0236579 0.920536 1.56775 1 0 1 1 0 0 +EDGE2 3480 3141 0.0147996 1.01717 1.55535 1 0 1 1 0 0 +EDGE2 3480 3381 0.109608 0.939522 1.57234 1 0 1 1 0 0 +EDGE2 3480 3121 -0.073887 0.931402 1.57277 1 0 1 1 0 0 +EDGE2 3480 1161 -0.0845376 1.05208 1.56082 1 0 1 1 0 0 +EDGE2 3480 1181 -0.050754 0.974342 1.59281 1 0 1 1 0 0 +EDGE2 3480 3119 -1.09437 -0.00803576 -0.0240055 1 0 1 1 0 0 +EDGE2 3480 3379 -0.975501 -0.0141601 0.0116704 1 0 1 1 0 0 +EDGE2 3480 3479 -1.04381 0.0210123 0.0265095 1 0 1 1 0 0 +EDGE2 3480 3139 -1.00877 -0.00502612 -0.0255085 1 0 1 1 0 0 +EDGE2 3480 1179 -1.08581 -0.00858462 -0.00475823 1 0 1 1 0 0 +EDGE2 3480 1199 -0.98833 -0.0239273 -0.0317418 1 0 1 1 0 0 +EDGE2 3480 3099 -0.929719 -0.0711227 -0.00251972 1 0 1 1 0 0 +EDGE2 3480 1159 -0.894197 0.0318083 0.0135486 1 0 1 1 0 0 +EDGE2 3481 1160 -1.10712 0.044214 -1.58502 1 0 1 1 0 0 +EDGE2 3481 3140 -0.968709 0.0157373 -1.59618 1 0 1 1 0 0 +EDGE2 3481 3420 -1.05137 0.0497044 1.55115 1 0 1 1 0 0 +EDGE2 3481 3440 -1.0565 -0.0349549 1.59686 1 0 1 1 0 0 +EDGE2 3481 3480 -0.870701 -0.030621 -1.56647 1 0 1 1 0 0 +EDGE2 3481 3380 -1.03709 -0.0183871 -1.56685 1 0 1 1 0 0 +EDGE2 3481 1200 -0.954019 0.0868678 -1.53577 1 0 1 1 0 0 +EDGE2 3481 3100 -0.997999 -0.0695802 -1.5235 1 0 1 1 0 0 +EDGE2 3481 3120 -1.02549 0.00393441 -1.57424 1 0 1 1 0 0 +EDGE2 3481 1180 -1.03612 0.0236727 -1.60467 1 0 1 1 0 0 +EDGE2 3481 900 -0.990552 -0.0346032 1.57392 1 0 1 1 0 0 +EDGE2 3481 840 -0.995959 -0.0879169 1.58508 1 0 1 1 0 0 +EDGE2 3481 860 -1.08914 0.0764543 1.60417 1 0 1 1 0 0 +EDGE2 3481 3101 -0.105488 -0.0916852 -0.00752902 1 0 1 1 0 0 +EDGE2 3481 3141 0.0194105 -0.0392586 -0.00165718 1 0 1 1 0 0 +EDGE2 3481 3381 0.076386 0.0224878 -0.00748138 1 0 1 1 0 0 +EDGE2 3481 3121 0.0533905 -0.0674085 -0.0470014 1 0 1 1 0 0 +EDGE2 3481 1161 -0.0387185 -0.0166893 -0.00649333 1 0 1 1 0 0 +EDGE2 3481 1181 -0.0509988 -0.0521032 -0.00709545 1 0 1 1 0 0 +EDGE2 3481 1182 0.953056 0.0147776 0.00991417 1 0 1 1 0 0 +EDGE2 3481 3122 0.918648 -0.0405855 0.00103541 1 0 1 1 0 0 +EDGE2 3481 3142 1.06591 -0.058817 0.0245152 1 0 1 1 0 0 +EDGE2 3481 3382 1.06132 0.023566 -0.0236406 1 0 1 1 0 0 +EDGE2 3481 3102 1.10702 -0.0434691 0.0131424 1 0 1 1 0 0 +EDGE2 3481 1162 0.898925 0.0536938 -0.0329903 1 0 1 1 0 0 +EDGE2 3482 3383 0.974144 0.0106105 0.000454542 1 0 1 1 0 0 +EDGE2 3482 3101 -0.99967 -0.0268269 -0.0334794 1 0 1 1 0 0 +EDGE2 3482 3141 -0.969865 -0.00856721 0.0207578 1 0 1 1 0 0 +EDGE2 3482 3381 -1.0783 0.0247878 -0.0330753 1 0 1 1 0 0 +EDGE2 3482 3481 -0.895621 0.000381909 -0.0267411 1 0 1 1 0 0 +EDGE2 3482 3121 -0.916143 0.0103591 -0.0380315 1 0 1 1 0 0 +EDGE2 3482 1161 -1.06644 -0.00402568 0.0110258 1 0 1 1 0 0 +EDGE2 3482 1181 -1.04465 -0.0576793 0.0195164 1 0 1 1 0 0 +EDGE2 3482 1182 0.0349375 0.0188271 -0.0231271 1 0 1 1 0 0 +EDGE2 3482 3122 -0.0287532 -0.0516479 -0.0182203 1 0 1 1 0 0 +EDGE2 3482 3142 0.0140019 -0.0822003 0.00787572 1 0 1 1 0 0 +EDGE2 3482 3382 -0.00533262 0.0633897 0.0327583 1 0 1 1 0 0 +EDGE2 3482 3102 0.0749888 -0.0551822 -0.00722366 1 0 1 1 0 0 +EDGE2 3482 1162 0.0569758 0.00248376 0.0118794 1 0 1 1 0 0 +EDGE2 3482 1163 1.04933 -0.000338748 -0.0356894 1 0 1 1 0 0 +EDGE2 3482 3103 1.00532 0.0678805 0.0508951 1 0 1 1 0 0 +EDGE2 3482 3123 1.03475 -0.0706497 -0.0193567 1 0 1 1 0 0 +EDGE2 3482 3143 1.03205 -0.0481449 -0.0226238 1 0 1 1 0 0 +EDGE2 3482 1183 0.999347 0.00893098 0.014658 1 0 1 1 0 0 +EDGE2 3483 3383 -0.110002 -0.0646598 -0.00696151 1 0 1 1 0 0 +EDGE2 3483 3482 -0.997117 -0.0491252 -0.00625577 1 0 1 1 0 0 +EDGE2 3483 1182 -1.01311 0.0119669 -0.0146831 1 0 1 1 0 0 +EDGE2 3483 3122 -0.931995 0.0760277 -0.00626114 1 0 1 1 0 0 +EDGE2 3483 3142 -1.02868 -0.0673066 -0.00432702 1 0 1 1 0 0 +EDGE2 3483 3382 -0.987072 0.0216425 -0.0147104 1 0 1 1 0 0 +EDGE2 3483 3102 -0.964798 0.0194056 0.0118377 1 0 1 1 0 0 +EDGE2 3483 1162 -1.07751 0.0592216 0.0307114 1 0 1 1 0 0 +EDGE2 3483 3144 1.03438 0.00930699 0.052047 1 0 1 1 0 0 +EDGE2 3483 1163 0.00155106 -0.0953829 0.00124933 1 0 1 1 0 0 +EDGE2 3483 3103 0.0507287 0.00544284 0.0103057 1 0 1 1 0 0 +EDGE2 3483 3123 0.0315647 -0.0329367 0.0238119 1 0 1 1 0 0 +EDGE2 3483 3143 -0.0598893 -0.0282596 0.00348096 1 0 1 1 0 0 +EDGE2 3483 1183 -0.0364871 0.0250212 0.0116405 1 0 1 1 0 0 +EDGE2 3483 3384 0.976538 -0.00973764 -0.000111581 1 0 1 1 0 0 +EDGE2 3483 1184 0.949727 -0.027246 -0.0203856 1 0 1 1 0 0 +EDGE2 3483 3104 1.07421 -0.0328467 0.0261834 1 0 1 1 0 0 +EDGE2 3483 3124 1.03916 -0.00912591 0.0264728 1 0 1 1 0 0 +EDGE2 3483 1164 0.987424 -0.0504104 0.00569808 1 0 1 1 0 0 +EDGE2 3484 3383 -0.929476 0.0453316 -0.0187534 1 0 1 1 0 0 +EDGE2 3484 3483 -1.03559 -0.138851 -0.00327423 1 0 1 1 0 0 +EDGE2 3484 3144 0.0513125 0.0642788 -0.0238445 1 0 1 1 0 0 +EDGE2 3484 1163 -1.05274 0.106471 0.0101011 1 0 1 1 0 0 +EDGE2 3484 3103 -0.844553 -0.0105966 -0.0107423 1 0 1 1 0 0 +EDGE2 3484 3123 -0.962035 0.14419 -0.00600315 1 0 1 1 0 0 +EDGE2 3484 3143 -0.928956 -0.0774507 -0.0152501 1 0 1 1 0 0 +EDGE2 3484 1183 -0.903767 0.042182 -0.0169035 1 0 1 1 0 0 +EDGE2 3484 3384 -0.0466183 -0.0331613 -0.0255016 1 0 1 1 0 0 +EDGE2 3484 1184 0.061592 0.0241312 0.0247168 1 0 1 1 0 0 +EDGE2 3484 3104 0.0578686 0.0347202 -0.0223878 1 0 1 1 0 0 +EDGE2 3484 3124 -0.0321401 -0.0184021 0.0154112 1 0 1 1 0 0 +EDGE2 3484 1164 0.051282 0.00725065 0.00578363 1 0 1 1 0 0 +EDGE2 3484 3105 0.931705 0.0861825 0.029509 1 0 1 1 0 0 +EDGE2 3484 3145 1.05009 -0.0494606 0.00237457 1 0 1 1 0 0 +EDGE2 3484 3165 1.03963 -0.050066 -3.13126 1 0 1 1 0 0 +EDGE2 3484 3385 0.990692 -0.0212785 0.0136231 1 0 1 1 0 0 +EDGE2 3484 3125 1.0797 0.0571149 -0.0456022 1 0 1 1 0 0 +EDGE2 3484 1185 0.966658 0.032929 0.00326419 1 0 1 1 0 0 +EDGE2 3484 3065 0.948136 -0.0628418 -3.13821 1 0 1 1 0 0 +EDGE2 3484 3085 0.934505 0.0276773 -3.12378 1 0 1 1 0 0 +EDGE2 3484 1165 0.960573 -0.0400254 -0.0213797 1 0 1 1 0 0 +EDGE2 3485 3146 0.101377 -0.992354 -1.5265 1 0 1 1 0 0 +EDGE2 3485 3386 -0.0965358 -1.0294 -1.53886 1 0 1 1 0 0 +EDGE2 3485 3066 0.0213227 -1.02986 -1.5801 1 0 1 1 0 0 +EDGE2 3485 3144 -0.998531 0.0770875 -0.0237751 1 0 1 1 0 0 +EDGE2 3485 3484 -0.941532 -0.0358928 0.0290388 1 0 1 1 0 0 +EDGE2 3485 3384 -1.02327 -0.00670253 -0.0194475 1 0 1 1 0 0 +EDGE2 3485 1184 -1.01496 -0.0552567 -0.0284341 1 0 1 1 0 0 +EDGE2 3485 3104 -1.06895 -0.0359622 0.0198744 1 0 1 1 0 0 +EDGE2 3485 3124 -0.979254 -0.0353972 -0.00070725 1 0 1 1 0 0 +EDGE2 3485 1164 -1.03749 -0.0165163 -0.0358832 1 0 1 1 0 0 +EDGE2 3485 3166 0.0805555 1.00264 1.58827 1 0 1 1 0 0 +EDGE2 3485 3105 -0.0554872 -0.0427739 0.00687268 1 0 1 1 0 0 +EDGE2 3485 3145 0.0041122 -0.0118156 -0.0363754 1 0 1 1 0 0 +EDGE2 3485 3165 -0.0203593 -0.012007 -3.1134 1 0 1 1 0 0 +EDGE2 3485 3385 0.0322741 0.0107872 0.0285716 1 0 1 1 0 0 +EDGE2 3485 3125 0.0857908 0.0395479 0.00849296 1 0 1 1 0 0 +EDGE2 3485 1185 -0.047621 -0.0364104 0.00259801 1 0 1 1 0 0 +EDGE2 3485 3065 -0.00537135 0.0269196 -3.1319 1 0 1 1 0 0 +EDGE2 3485 3085 -0.0263077 -0.0279797 -3.12313 1 0 1 1 0 0 +EDGE2 3485 1165 -0.00540445 -0.0238801 0.0104519 1 0 1 1 0 0 +EDGE2 3485 1166 -0.0357343 1.05501 1.58046 1 0 1 1 0 0 +EDGE2 3485 3086 -0.0863723 1.02975 1.54706 1 0 1 1 0 0 +EDGE2 3485 3106 0.00384215 0.991556 1.54544 1 0 1 1 0 0 +EDGE2 3485 3126 -0.0147697 1.08685 1.60376 1 0 1 1 0 0 +EDGE2 3485 1186 -0.0186498 0.986439 1.58324 1 0 1 1 0 0 +EDGE2 3485 3064 1.0389 0.0345751 -3.13617 1 0 1 1 0 0 +EDGE2 3485 3164 0.956178 -0.0569417 -3.13598 1 0 1 1 0 0 +EDGE2 3485 3084 0.897823 -0.0612097 -3.15194 1 0 1 1 0 0 +EDGE2 3486 3166 -0.0918061 -0.102919 -0.0430035 1 0 1 1 0 0 +EDGE2 3486 3105 -0.980692 -0.0304865 -1.56717 1 0 1 1 0 0 +EDGE2 3486 3485 -1.02017 0.000630792 -1.59675 1 0 1 1 0 0 +EDGE2 3486 3145 -0.991781 0.0994014 -1.58568 1 0 1 1 0 0 +EDGE2 3486 3165 -1.04502 -0.00508594 1.5603 1 0 1 1 0 0 +EDGE2 3486 3385 -0.998143 0.0459237 -1.54356 1 0 1 1 0 0 +EDGE2 3486 3125 -1.01403 0.0836063 -1.55123 1 0 1 1 0 0 +EDGE2 3486 1185 -0.96652 0.0166487 -1.55575 1 0 1 1 0 0 +EDGE2 3486 3065 -1.02608 0.0493171 1.53758 1 0 1 1 0 0 +EDGE2 3486 3085 -1.02957 -0.015073 1.55833 1 0 1 1 0 0 +EDGE2 3486 1165 -0.952674 -0.00820703 -1.60557 1 0 1 1 0 0 +EDGE2 3486 1166 0.0627181 -0.0526567 0.00905365 1 0 1 1 0 0 +EDGE2 3486 3086 0.0195533 0.0147044 -0.00693312 1 0 1 1 0 0 +EDGE2 3486 3106 0.0653004 0.0109074 0.00221785 1 0 1 1 0 0 +EDGE2 3486 3126 0.0851749 0.0171745 -0.0118796 1 0 1 1 0 0 +EDGE2 3486 1186 0.0338317 -0.0610249 -0.0273269 1 0 1 1 0 0 +EDGE2 3486 3107 1.05387 0.0742661 -0.00194189 1 0 1 1 0 0 +EDGE2 3486 3167 1.00676 -0.0539718 0.0318547 1 0 1 1 0 0 +EDGE2 3486 3127 0.98257 0.0205451 0.000520705 1 0 1 1 0 0 +EDGE2 3486 1187 1.02785 -0.0354497 -0.0262757 1 0 1 1 0 0 +EDGE2 3486 3087 1.05907 0.0503057 -0.0147918 1 0 1 1 0 0 +EDGE2 3486 1167 0.941381 -0.00389104 0.000136567 1 0 1 1 0 0 +EDGE2 3487 3166 -0.911008 0.0362841 -0.0354746 1 0 1 1 0 0 +EDGE2 3487 3486 -1.01087 0.0166419 -0.0133437 1 0 1 1 0 0 +EDGE2 3487 1166 -0.950163 -0.139192 -0.0246481 1 0 1 1 0 0 +EDGE2 3487 3086 -1.00553 0.0556377 -0.0154566 1 0 1 1 0 0 +EDGE2 3487 3106 -1.0569 -0.00236006 -0.0221624 1 0 1 1 0 0 +EDGE2 3487 3126 -0.955213 0.0479036 -0.00130629 1 0 1 1 0 0 +EDGE2 3487 1186 -1.04241 -0.00406324 0.00157599 1 0 1 1 0 0 +EDGE2 3487 3107 -0.0126157 0.0916056 -0.00771107 1 0 1 1 0 0 +EDGE2 3487 3167 -0.0407874 -0.0113719 -0.0117055 1 0 1 1 0 0 +EDGE2 3487 3127 -0.00570738 -0.0690187 -0.0106505 1 0 1 1 0 0 +EDGE2 3487 1187 0.0368493 -0.016015 -0.0249382 1 0 1 1 0 0 +EDGE2 3487 3087 -0.0854716 -0.0155801 -0.0265555 1 0 1 1 0 0 +EDGE2 3487 1167 0.0326211 0.014802 0.00362969 1 0 1 1 0 0 +EDGE2 3487 3128 1.07699 0.102022 -0.00729156 1 0 1 1 0 0 +EDGE2 3487 3168 0.975372 -0.0536225 -0.0218169 1 0 1 1 0 0 +EDGE2 3487 1188 1.0362 0.047893 0.00433888 1 0 1 1 0 0 +EDGE2 3487 3088 0.910236 -0.0243888 -0.0160089 1 0 1 1 0 0 +EDGE2 3487 3108 1.02826 -0.0281706 0.0464233 1 0 1 1 0 0 +EDGE2 3487 1168 0.982065 0.00685784 0.021693 1 0 1 1 0 0 +EDGE2 3488 3107 -0.956955 -0.0721995 -0.0420491 1 0 1 1 0 0 +EDGE2 3488 3167 -0.996298 -0.00851587 0.0157466 1 0 1 1 0 0 +EDGE2 3488 3487 -0.94739 0.0385675 0.000988121 1 0 1 1 0 0 +EDGE2 3488 3127 -0.991197 0.0147366 -0.0332786 1 0 1 1 0 0 +EDGE2 3488 1187 -1.07496 0.0608742 -0.000318893 1 0 1 1 0 0 +EDGE2 3488 3087 -0.929485 0.0260462 -0.026799 1 0 1 1 0 0 +EDGE2 3488 1167 -1.01014 -0.0555156 0.026194 1 0 1 1 0 0 +EDGE2 3488 3128 0.0750027 -0.0555236 -0.00969289 1 0 1 1 0 0 +EDGE2 3488 3168 0.000271775 -0.0830665 0.0184202 1 0 1 1 0 0 +EDGE2 3488 1188 0.0850804 -0.0497798 -0.0221326 1 0 1 1 0 0 +EDGE2 3488 3088 -0.019676 0.0529264 0.00290068 1 0 1 1 0 0 +EDGE2 3488 3108 -0.014024 -0.0529312 -0.00100407 1 0 1 1 0 0 +EDGE2 3488 1168 0.0385901 0.0157638 -0.0278438 1 0 1 1 0 0 +EDGE2 3488 3109 1.06053 0.0535018 0.0103019 1 0 1 1 0 0 +EDGE2 3488 3169 0.979882 -0.0395732 -0.00497341 1 0 1 1 0 0 +EDGE2 3488 3129 0.966562 0.0398651 -0.0229955 1 0 1 1 0 0 +EDGE2 3488 1189 1.01679 0.0164674 -0.00461851 1 0 1 1 0 0 +EDGE2 3488 3089 0.957728 -0.039153 -0.0107727 1 0 1 1 0 0 +EDGE2 3488 1169 0.973955 0.0610943 -0.00759267 1 0 1 1 0 0 +EDGE2 3489 3128 -0.997904 -0.0640356 -0.00431233 1 0 1 1 0 0 +EDGE2 3489 3488 -1.03712 -0.0356536 0.00551557 1 0 1 1 0 0 +EDGE2 3489 3168 -0.965048 0.00834082 -0.00195574 1 0 1 1 0 0 +EDGE2 3489 1188 -1.06772 0.0224218 -0.00818513 1 0 1 1 0 0 +EDGE2 3489 3088 -1.03389 0.0268844 -0.0298502 1 0 1 1 0 0 +EDGE2 3489 3108 -1.08206 -0.0985627 0.0161313 1 0 1 1 0 0 +EDGE2 3489 1168 -0.990708 0.0342625 -0.0304602 1 0 1 1 0 0 +EDGE2 3489 3109 -0.0412466 0.015933 0.0109386 1 0 1 1 0 0 +EDGE2 3489 3169 -0.0217455 0.00333756 -0.0442037 1 0 1 1 0 0 +EDGE2 3489 3129 0.0425274 0.0218214 -0.0450437 1 0 1 1 0 0 +EDGE2 3489 1189 0.0236366 -0.0203733 -0.00203299 1 0 1 1 0 0 +EDGE2 3489 3089 0.0868941 -0.0533606 0.00110672 1 0 1 1 0 0 +EDGE2 3489 1169 -0.0518 0.0457155 -0.0235064 1 0 1 1 0 0 +EDGE2 3489 3050 1.05062 0.0506542 -3.15373 1 0 1 1 0 0 +EDGE2 3489 3170 0.99099 0.0210984 0.0469311 1 0 1 1 0 0 +EDGE2 3489 3110 1.04821 0.0395031 0.00999843 1 0 1 1 0 0 +EDGE2 3489 3130 0.890921 -0.018235 -0.0243652 1 0 1 1 0 0 +EDGE2 3489 3090 1.01914 -0.0314066 0.0174829 1 0 1 1 0 0 +EDGE2 3489 1130 1.11037 0.0732696 -3.16655 1 0 1 1 0 0 +EDGE2 3489 1170 1.06462 -0.00581145 0.0140655 1 0 1 1 0 0 +EDGE2 3489 1190 1.00209 -0.00798984 -0.00773126 1 0 1 1 0 0 +EDGE2 3489 3030 0.99822 0.037859 -3.16482 1 0 1 1 0 0 +EDGE2 3489 1150 0.919682 0.0112843 -3.18069 1 0 1 1 0 0 +EDGE2 3489 1110 0.991684 0.019698 -3.12042 1 0 1 1 0 0 +EDGE2 3490 3109 -1.0233 -0.0647236 0.0032229 1 0 1 1 0 0 +EDGE2 3490 3169 -0.954591 0.0379152 -0.0350903 1 0 1 1 0 0 +EDGE2 3490 3489 -0.964949 -0.00567222 0.0453549 1 0 1 1 0 0 +EDGE2 3490 3129 -0.923968 0.0489836 0.0253576 1 0 1 1 0 0 +EDGE2 3490 1189 -1.05608 -0.0026326 -0.0272491 1 0 1 1 0 0 +EDGE2 3490 3089 -0.972842 -0.0461711 -0.0249934 1 0 1 1 0 0 +EDGE2 3490 1169 -1.00318 -0.0923537 -0.0323425 1 0 1 1 0 0 +EDGE2 3490 3050 -0.0385209 -0.0444333 -3.14008 1 0 1 1 0 0 +EDGE2 3490 3131 0.051157 1.01905 1.56875 1 0 1 1 0 0 +EDGE2 3490 3171 0.00947276 0.952548 1.58732 1 0 1 1 0 0 +EDGE2 3490 1151 -0.00807008 1.01905 1.54284 1 0 1 1 0 0 +EDGE2 3490 1191 -0.000827908 1.039 1.56251 1 0 1 1 0 0 +EDGE2 3490 3091 -0.010945 0.9437 1.54375 1 0 1 1 0 0 +EDGE2 3490 3111 0.0403865 0.994057 1.60282 1 0 1 1 0 0 +EDGE2 3490 1171 -0.0626795 0.991593 1.56168 1 0 1 1 0 0 +EDGE2 3490 3170 0.0179133 0.0810622 0.00750687 1 0 1 1 0 0 +EDGE2 3490 3110 0.0333176 0.0097427 -0.00802946 1 0 1 1 0 0 +EDGE2 3490 3130 -0.0229323 0.0756078 0.00777036 1 0 1 1 0 0 +EDGE2 3490 3090 -0.0276378 -0.0294194 0.00826992 1 0 1 1 0 0 +EDGE2 3490 1130 -0.0228626 -0.0171196 -3.10814 1 0 1 1 0 0 +EDGE2 3490 1170 0.00428582 0.0487445 -0.00621315 1 0 1 1 0 0 +EDGE2 3490 1190 -0.105539 0.00806451 0.00264228 1 0 1 1 0 0 +EDGE2 3490 3030 0.0283868 -0.0324267 -3.17672 1 0 1 1 0 0 +EDGE2 3490 1150 0.0443982 -0.155323 -3.14 1 0 1 1 0 0 +EDGE2 3490 1110 -0.0134124 0.025339 -3.14436 1 0 1 1 0 0 +EDGE2 3490 1109 0.979141 -0.0538606 -3.14317 1 0 1 1 0 0 +EDGE2 3490 1149 0.920513 -0.0184424 -3.14094 1 0 1 1 0 0 +EDGE2 3490 3029 1.02352 -0.0236169 -3.14592 1 0 1 1 0 0 +EDGE2 3490 3049 1.00152 -0.0677461 -3.15797 1 0 1 1 0 0 +EDGE2 3490 1129 0.927376 0.0136913 -3.13269 1 0 1 1 0 0 +EDGE2 3490 1111 -0.0206184 -1.02506 -1.5835 1 0 1 1 0 0 +EDGE2 3490 3031 -0.00340348 -0.858622 -1.55962 1 0 1 1 0 0 +EDGE2 3490 3051 -0.0161327 -1.02087 -1.5674 1 0 1 1 0 0 +EDGE2 3490 1131 -0.0760576 -0.995178 -1.53941 1 0 1 1 0 0 +EDGE2 3491 3050 -0.956586 -0.0549068 1.58953 1 0 1 1 0 0 +EDGE2 3491 3131 -0.0342006 -0.072827 0.0353499 1 0 1 1 0 0 +EDGE2 3491 3092 0.986995 -0.039815 -0.037776 1 0 1 1 0 0 +EDGE2 3491 3132 0.919373 0.0315298 -0.00336075 1 0 1 1 0 0 +EDGE2 3491 3172 0.921463 0.104416 0.0167891 1 0 1 1 0 0 +EDGE2 3491 3112 0.972628 -0.0766345 0.0104982 1 0 1 1 0 0 +EDGE2 3491 1152 0.936901 0.0222175 -0.000915181 1 0 1 1 0 0 +EDGE2 3491 1172 1.00948 -0.0159166 -0.00382526 1 0 1 1 0 0 +EDGE2 3491 1192 1.01511 0.00937239 -0.0119337 1 0 1 1 0 0 +EDGE2 3491 3171 -0.0169044 -0.00901655 0.00740355 1 0 1 1 0 0 +EDGE2 3491 1151 0.0631816 -0.0122786 -0.0261542 1 0 1 1 0 0 +EDGE2 3491 1191 0.0301001 0.01654 -0.0344146 1 0 1 1 0 0 +EDGE2 3491 3091 -0.0396627 -0.00874413 -0.0428275 1 0 1 1 0 0 +EDGE2 3491 3111 -0.0843522 -0.0257727 -0.0189769 1 0 1 1 0 0 +EDGE2 3491 1171 0.0400463 -0.0173708 0.0079713 1 0 1 1 0 0 +EDGE2 3491 3170 -1.06811 0.0168546 -1.59264 1 0 1 1 0 0 +EDGE2 3491 3490 -0.945985 0.0304361 -1.56849 1 0 1 1 0 0 +EDGE2 3491 3110 -0.993209 -0.0125012 -1.61739 1 0 1 1 0 0 +EDGE2 3491 3130 -0.999558 -0.063219 -1.56733 1 0 1 1 0 0 +EDGE2 3491 3090 -1.01045 -0.0325597 -1.5741 1 0 1 1 0 0 +EDGE2 3491 1130 -1.04651 0.00825992 1.60332 1 0 1 1 0 0 +EDGE2 3491 1170 -1.06067 0.00189528 -1.5882 1 0 1 1 0 0 +EDGE2 3491 1190 -1.02729 -0.0143385 -1.56703 1 0 1 1 0 0 +EDGE2 3491 3030 -1.00407 -0.012327 1.57221 1 0 1 1 0 0 +EDGE2 3491 1150 -0.997634 0.0206193 1.56851 1 0 1 1 0 0 +EDGE2 3491 1110 -1.05535 -0.109437 1.58258 1 0 1 1 0 0 +EDGE2 3492 1173 0.961987 -0.0608761 -0.00721038 1 0 1 1 0 0 +EDGE2 3492 3133 0.903707 -0.0520568 -0.00284385 1 0 1 1 0 0 +EDGE2 3492 3173 0.954582 0.122885 0.0179036 1 0 1 1 0 0 +EDGE2 3492 3093 1.09151 0.0196442 0.0269559 1 0 1 1 0 0 +EDGE2 3492 3113 1.01366 0.0523142 -0.0118513 1 0 1 1 0 0 +EDGE2 3492 1193 0.896472 0.00807883 0.0237644 1 0 1 1 0 0 +EDGE2 3492 3131 -0.939731 -0.005258 0.0124155 1 0 1 1 0 0 +EDGE2 3492 3092 -0.0918207 0.0302287 -0.00748394 1 0 1 1 0 0 +EDGE2 3492 1153 1.05386 -0.0279952 0.00474437 1 0 1 1 0 0 +EDGE2 3492 3132 0.0155322 -0.0255676 -0.00343878 1 0 1 1 0 0 +EDGE2 3492 3172 -0.0173285 -0.0263983 -0.00116122 1 0 1 1 0 0 +EDGE2 3492 3112 0.00643746 -0.0119332 0.0292753 1 0 1 1 0 0 +EDGE2 3492 1152 0.000446798 -0.0197996 -0.0063588 1 0 1 1 0 0 +EDGE2 3492 1172 -0.0872856 -0.0227497 0.0253185 1 0 1 1 0 0 +EDGE2 3492 1192 0.101769 -0.0276151 -0.00375151 1 0 1 1 0 0 +EDGE2 3492 3491 -0.929104 -0.0141182 0.0320288 1 0 1 1 0 0 +EDGE2 3492 3171 -1.01922 0.0380469 0.0153645 1 0 1 1 0 0 +EDGE2 3492 1151 -0.927849 -0.0155139 0.00250542 1 0 1 1 0 0 +EDGE2 3492 1191 -0.968876 -0.0483159 0.00748928 1 0 1 1 0 0 +EDGE2 3492 3091 -1.05327 -0.043161 -0.0196147 1 0 1 1 0 0 +EDGE2 3492 3111 -0.935664 0.0798213 -0.00716897 1 0 1 1 0 0 +EDGE2 3492 1171 -1.00194 0.0528579 -0.0390389 1 0 1 1 0 0 +EDGE2 3493 1173 0.0187258 0.0606423 -0.0129352 1 0 1 1 0 0 +EDGE2 3493 1174 0.960874 0.0765151 0.00754095 1 0 1 1 0 0 +EDGE2 3493 3174 1.0289 -0.0359892 -0.0238548 1 0 1 1 0 0 +EDGE2 3493 3094 1.01862 -0.0339265 0.0138324 1 0 1 1 0 0 +EDGE2 3493 3114 0.947563 0.0528983 -0.0421867 1 0 1 1 0 0 +EDGE2 3493 3134 1.01889 -0.00405071 0.0105886 1 0 1 1 0 0 +EDGE2 3493 1194 1.04642 -0.0422948 -0.0356985 1 0 1 1 0 0 +EDGE2 3493 1154 0.958682 0.0695587 0.0329514 1 0 1 1 0 0 +EDGE2 3493 3133 0.0056378 0.028364 -0.00460685 1 0 1 1 0 0 +EDGE2 3493 3173 -0.0480476 0.0208962 -0.00706107 1 0 1 1 0 0 +EDGE2 3493 3093 -0.0151955 -0.0409251 0.0057567 1 0 1 1 0 0 +EDGE2 3493 3113 0.0149297 0.0413637 0.0299546 1 0 1 1 0 0 +EDGE2 3493 1193 -0.0262096 0.0414625 0.0069961 1 0 1 1 0 0 +EDGE2 3493 3092 -1.02263 -0.0713986 0.0230733 1 0 1 1 0 0 +EDGE2 3493 1153 -0.0713309 -0.00716586 -0.00254803 1 0 1 1 0 0 +EDGE2 3493 3132 -0.951526 0.00507646 0.0355931 1 0 1 1 0 0 +EDGE2 3493 3172 -0.999058 -0.0434865 -0.0091335 1 0 1 1 0 0 +EDGE2 3493 3492 -1.03565 -0.00843845 0.0229619 1 0 1 1 0 0 +EDGE2 3493 3112 -0.923331 0.0182959 0.0195 1 0 1 1 0 0 +EDGE2 3493 1152 -1.01238 -0.0505706 0.0511761 1 0 1 1 0 0 +EDGE2 3493 1172 -1.00536 -0.0100821 -0.0131431 1 0 1 1 0 0 +EDGE2 3493 1192 -0.940547 -0.0180264 -0.0028957 1 0 1 1 0 0 +EDGE2 3494 1173 -0.95405 0.0299534 0.0127047 1 0 1 1 0 0 +EDGE2 3494 1174 0.0579799 0.0242764 -0.00930391 1 0 1 1 0 0 +EDGE2 3494 3115 0.937954 -0.0284091 0.0096436 1 0 1 1 0 0 +EDGE2 3494 3175 1.04791 0.0824947 0.0108155 1 0 1 1 0 0 +EDGE2 3494 3375 1.00775 -0.0200288 -3.15728 1 0 1 1 0 0 +EDGE2 3494 3475 1.03349 -0.0173831 -3.15343 1 0 1 1 0 0 +EDGE2 3494 3135 0.894352 -0.100892 -0.00738189 1 0 1 1 0 0 +EDGE2 3494 1175 1.01159 -0.0582315 -0.00896181 1 0 1 1 0 0 +EDGE2 3494 1195 0.965052 0.0689463 0.00996515 1 0 1 1 0 0 +EDGE2 3494 3095 1.05214 -0.0641807 0.000276317 1 0 1 1 0 0 +EDGE2 3494 1155 0.93229 -0.11039 0.0081992 1 0 1 1 0 0 +EDGE2 3494 3174 -0.0637285 -0.0125245 -0.0155376 1 0 1 1 0 0 +EDGE2 3494 3094 0.0414906 0.0151204 -0.00485074 1 0 1 1 0 0 +EDGE2 3494 3114 0.0559034 0.0541731 0.0122277 1 0 1 1 0 0 +EDGE2 3494 3134 0.000169819 0.0530446 -0.0138809 1 0 1 1 0 0 +EDGE2 3494 1194 0.0191046 -0.0544769 0.0203089 1 0 1 1 0 0 +EDGE2 3494 1154 -0.0388163 -0.00471139 -0.000345474 1 0 1 1 0 0 +EDGE2 3494 3133 -0.962104 -0.0154255 0.0240848 1 0 1 1 0 0 +EDGE2 3494 3493 -0.990052 0.00459388 0.00191464 1 0 1 1 0 0 +EDGE2 3494 3173 -1.0002 -0.0621746 -0.0308553 1 0 1 1 0 0 +EDGE2 3494 3093 -0.971822 0.048332 0.0162166 1 0 1 1 0 0 +EDGE2 3494 3113 -0.922083 0.0259076 0.00173347 1 0 1 1 0 0 +EDGE2 3494 1193 -1.04462 -0.0531318 0.00185175 1 0 1 1 0 0 +EDGE2 3494 1153 -0.974098 -0.00877475 0.00649782 1 0 1 1 0 0 +EDGE2 3495 3474 0.983169 -0.0558454 -3.1456 1 0 1 1 0 0 +EDGE2 3495 3374 0.995142 -0.0386356 -3.14199 1 0 1 1 0 0 +EDGE2 3495 1196 0.0516418 0.937549 1.56696 1 0 1 1 0 0 +EDGE2 3495 3476 -0.0943746 1.07827 1.57554 1 0 1 1 0 0 +EDGE2 3495 3116 0.00963866 0.936934 1.59742 1 0 1 1 0 0 +EDGE2 3495 3136 0.141298 1.00087 1.54523 1 0 1 1 0 0 +EDGE2 3495 3376 -0.0220232 0.994632 1.59518 1 0 1 1 0 0 +EDGE2 3495 3096 -0.0655847 1.10645 1.56572 1 0 1 1 0 0 +EDGE2 3495 1156 -0.000821696 0.991454 1.59505 1 0 1 1 0 0 +EDGE2 3495 1176 0.0616934 0.996406 1.56817 1 0 1 1 0 0 +EDGE2 3495 1174 -0.992015 0.0431723 -0.0301748 1 0 1 1 0 0 +EDGE2 3495 3115 -0.0104176 0.02941 0.0186651 1 0 1 1 0 0 +EDGE2 3495 3175 -0.0169721 -0.0278773 0.0139055 1 0 1 1 0 0 +EDGE2 3495 3375 -0.0174728 0.045958 -3.1622 1 0 1 1 0 0 +EDGE2 3495 3475 0.0733321 -0.00467892 -3.13158 1 0 1 1 0 0 +EDGE2 3495 3135 -0.0366156 -0.00748948 -0.009615 1 0 1 1 0 0 +EDGE2 3495 1175 0.0591155 0.016942 0.00698946 1 0 1 1 0 0 +EDGE2 3495 1195 -0.000343946 0.0228374 0.0263083 1 0 1 1 0 0 +EDGE2 3495 3095 -0.0135106 -0.0259651 0.00556098 1 0 1 1 0 0 +EDGE2 3495 1155 -0.0603694 -0.014396 0.0153027 1 0 1 1 0 0 +EDGE2 3495 3174 -1.01541 0.0140119 -0.0309418 1 0 1 1 0 0 +EDGE2 3495 3494 -1.06857 -0.023172 0.00638284 1 0 1 1 0 0 +EDGE2 3495 3094 -0.991582 -0.000637325 0.0266263 1 0 1 1 0 0 +EDGE2 3495 3114 -0.930826 -0.00154826 -0.00109447 1 0 1 1 0 0 +EDGE2 3495 3134 -0.995297 0.00465961 0.00774239 1 0 1 1 0 0 +EDGE2 3495 1194 -1.01602 0.0141933 0.0112529 1 0 1 1 0 0 +EDGE2 3495 1154 -1.03899 -0.00879186 -0.0107639 1 0 1 1 0 0 +EDGE2 3495 3176 0.0240594 -1.02688 -1.58141 1 0 1 1 0 0 +EDGE2 3496 3495 -0.947263 0.133608 1.52085 1 0 1 1 0 0 +EDGE2 3496 3115 -1.03135 -0.0183526 1.54759 1 0 1 1 0 0 +EDGE2 3496 3175 -1.03042 -0.00388282 1.59349 1 0 1 1 0 0 +EDGE2 3496 3375 -1.00938 0.0111196 -1.56384 1 0 1 1 0 0 +EDGE2 3496 3475 -1.00062 -0.0227615 -1.57546 1 0 1 1 0 0 +EDGE2 3496 3135 -1.06325 0.00315587 1.56835 1 0 1 1 0 0 +EDGE2 3496 1175 -1.00406 0.0843665 1.57399 1 0 1 1 0 0 +EDGE2 3496 1195 -1.02325 0.000566254 1.58298 1 0 1 1 0 0 +EDGE2 3496 3095 -0.963733 -0.0576638 1.58302 1 0 1 1 0 0 +EDGE2 3496 1155 -1.00649 0.0127957 1.57445 1 0 1 1 0 0 +EDGE2 3496 3176 -0.0752026 -0.0128019 0.00275265 1 0 1 1 0 0 +EDGE2 3496 3177 0.995707 -0.0292804 -0.0016932 1 0 1 1 0 0 +EDGE2 3497 3176 -0.983355 0.0105025 -0.00924232 1 0 1 1 0 0 +EDGE2 3497 3496 -0.957508 -0.0183039 -0.00484086 1 0 1 1 0 0 +EDGE2 3497 3178 0.967234 0.0396519 0.0193957 1 0 1 1 0 0 +EDGE2 3497 3177 -0.0428741 0.00260418 0.000299127 1 0 1 1 0 0 +EDGE2 3498 3178 -0.0363779 -0.0376274 0.00423099 1 0 1 1 0 0 +EDGE2 3498 3177 -1.05595 -0.0686041 -0.0270288 1 0 1 1 0 0 +EDGE2 3498 3497 -0.988092 0.00595167 -0.00108822 1 0 1 1 0 0 +EDGE2 3498 3179 0.936602 -0.0746854 -0.0100769 1 0 1 1 0 0 +EDGE2 3499 3178 -1.02608 -0.0510748 -0.0270728 1 0 1 1 0 0 +EDGE2 3499 3498 -1.05759 -0.0583696 0.00433543 1 0 1 1 0 0 +EDGE2 3499 3179 -0.0602915 -0.0288311 -0.00165548 1 0 1 1 0 0 +EDGE2 3499 3020 0.998671 0.00996838 -3.15576 1 0 1 1 0 0 +EDGE2 3499 3180 1.00442 -0.0208545 -0.00345669 1 0 1 1 0 0 +EDGE2 3500 3179 -1.0342 0.130929 -0.0154651 1 0 1 1 0 0 +EDGE2 3500 3499 -0.981972 0.0429428 -0.0292903 1 0 1 1 0 0 +EDGE2 3500 3181 0.0391506 1.02677 1.55218 1 0 1 1 0 0 +EDGE2 3500 3020 -0.0662041 -0.00253161 -3.13013 1 0 1 1 0 0 +EDGE2 3500 3180 -0.0302762 0.0543072 0.0110623 1 0 1 1 0 0 +EDGE2 3500 3021 -0.0382184 -1.0489 -1.59434 1 0 1 1 0 0 +EDGE2 3500 3019 1.06845 0.0449819 -3.16482 1 0 1 1 0 0 +EDGE2 3501 3020 -0.917462 0.0182167 -1.57876 1 0 1 1 0 0 +EDGE2 3501 3180 -1.02637 0.0163171 1.59764 1 0 1 1 0 0 +EDGE2 3501 3500 -0.951027 0.134021 1.56043 1 0 1 1 0 0 +EDGE2 3501 3021 0.0995808 0.0092436 0.0187237 1 0 1 1 0 0 +EDGE2 3501 3022 0.973005 -0.036123 -0.00209097 1 0 1 1 0 0 +EDGE2 3502 3501 -0.860481 0.0541427 0.0419608 1 0 1 1 0 0 +EDGE2 3502 3021 -1.06943 -0.0456469 -0.0060502 1 0 1 1 0 0 +EDGE2 3502 3022 -0.0451621 0.0688981 -0.0262852 1 0 1 1 0 0 +EDGE2 3502 3023 0.96636 0.0785229 0.0171457 1 0 1 1 0 0 +EDGE2 3503 3022 -1.04304 -0.025092 -0.028177 1 0 1 1 0 0 +EDGE2 3503 3502 -0.919186 0.031409 0.0219264 1 0 1 1 0 0 +EDGE2 3503 3023 -0.0480516 -0.106483 0.055287 1 0 1 1 0 0 +EDGE2 3503 3024 0.963172 -0.021506 -0.00882602 1 0 1 1 0 0 +EDGE2 3504 3503 -0.984898 0.0200153 0.0101127 1 0 1 1 0 0 +EDGE2 3504 3023 -0.971207 0.0123122 -0.0167721 1 0 1 1 0 0 +EDGE2 3504 3024 0.0277695 -0.00464762 0.0045779 1 0 1 1 0 0 +EDGE2 3504 1145 1.0002 0.0444566 -3.13272 1 0 1 1 0 0 +EDGE2 3504 3045 1.04748 0.0138782 -3.13454 1 0 1 1 0 0 +EDGE2 3504 3025 1.00084 0.0734687 -0.0161433 1 0 1 1 0 0 +EDGE2 3504 1105 0.963354 0.0308473 -3.1396 1 0 1 1 0 0 +EDGE2 3504 1125 0.984904 0.0521265 -3.1433 1 0 1 1 0 0 +EDGE2 3505 3504 -1.00482 -0.0803029 0.00566764 1 0 1 1 0 0 +EDGE2 3505 3024 -1.0188 -0.053836 0.00536909 1 0 1 1 0 0 +EDGE2 3505 3046 -0.00200039 -1.06208 -1.54794 1 0 1 1 0 0 +EDGE2 3505 1126 0.0498737 -0.949827 -1.57228 1 0 1 1 0 0 +EDGE2 3505 1146 0.0448915 -1.11365 -1.5734 1 0 1 1 0 0 +EDGE2 3505 3026 0.0110159 -1.06268 -1.57102 1 0 1 1 0 0 +EDGE2 3505 1106 -0.112405 -1.01805 -1.59386 1 0 1 1 0 0 +EDGE2 3505 1145 -0.0395133 0.0378726 -3.15403 1 0 1 1 0 0 +EDGE2 3505 3045 -0.0501952 -0.0727086 -3.13385 1 0 1 1 0 0 +EDGE2 3505 3025 -0.0273288 0.000167345 -0.00771353 1 0 1 1 0 0 +EDGE2 3505 1105 -0.050536 0.0246224 -3.15447 1 0 1 1 0 0 +EDGE2 3505 1125 -0.0902252 -0.0083184 -3.1614 1 0 1 1 0 0 +EDGE2 3505 1124 1.03322 0.0194411 -3.13211 1 0 1 1 0 0 +EDGE2 3505 1144 1.0096 -0.0329611 -3.15051 1 0 1 1 0 0 +EDGE2 3505 3044 1.08299 -0.0320338 -3.14956 1 0 1 1 0 0 +EDGE2 3505 1104 1.02832 -0.0198847 -3.12346 1 0 1 1 0 0 +EDGE2 3506 1145 -0.989049 -0.00816758 1.55742 1 0 1 1 0 0 +EDGE2 3506 3045 -0.943412 0.0591551 1.56507 1 0 1 1 0 0 +EDGE2 3506 3505 -0.94466 -0.00308032 -1.54731 1 0 1 1 0 0 +EDGE2 3506 3025 -1.077 -0.034498 -1.60827 1 0 1 1 0 0 +EDGE2 3506 1105 -0.978239 -0.133761 1.55345 1 0 1 1 0 0 +EDGE2 3506 1125 -0.929549 0.0212284 1.55306 1 0 1 1 0 0 +EDGE2 3507 3506 -0.963599 0.104921 -0.0438242 1 0 1 1 0 0 +EDGE2 3508 3507 -0.969811 -0.019342 -0.00313859 1 0 1 1 0 0 +EDGE2 3509 3508 -1.01359 -0.0697332 0.0128905 1 0 1 1 0 0 +EDGE2 3510 3509 -1.00597 -0.0104936 -0.00536771 1 0 1 1 0 0 +EDGE2 3511 3510 -1.0395 -0.0074363 -1.5961 1 0 1 1 0 0 +EDGE2 3512 3511 -1.0425 0.00911824 0.00107585 1 0 1 1 0 0 +EDGE2 3513 3512 -1.00806 -0.0336677 0.00548401 1 0 1 1 0 0 +EDGE2 3514 2715 0.933097 0.0580507 -3.13293 1 0 1 1 0 0 +EDGE2 3514 3015 1.06656 0.0125892 -3.17349 1 0 1 1 0 0 +EDGE2 3514 3513 -1.06986 0.045522 0.00472109 1 0 1 1 0 0 +EDGE2 3515 3014 1.01437 -0.00388444 -3.12824 1 0 1 1 0 0 +EDGE2 3515 2714 1.05957 -0.0397292 -3.12033 1 0 1 1 0 0 +EDGE2 3515 3016 -0.047538 1.04899 1.58234 1 0 1 1 0 0 +EDGE2 3515 2715 -0.0307979 -0.0129525 -3.14722 1 0 1 1 0 0 +EDGE2 3515 3015 -0.0174293 -0.0132263 -3.1522 1 0 1 1 0 0 +EDGE2 3515 3514 -0.948773 0.00849337 -0.0089934 1 0 1 1 0 0 +EDGE2 3515 2716 0.0115363 -1.00985 -1.55335 1 0 1 1 0 0 +EDGE2 3516 2715 -0.999615 0.0412799 -1.54637 1 0 1 1 0 0 +EDGE2 3516 3015 -0.97818 0.0885294 -1.53699 1 0 1 1 0 0 +EDGE2 3516 3515 -0.951292 0.00600364 1.59052 1 0 1 1 0 0 +EDGE2 3516 2716 0.105166 -0.0306401 -0.00900026 1 0 1 1 0 0 +EDGE2 3516 2717 0.999995 -0.0119967 0.025461 1 0 1 1 0 0 +EDGE2 3517 3516 -1.02573 0.000808577 -0.0116553 1 0 1 1 0 0 +EDGE2 3517 2716 -0.973542 0.0306832 -0.00283933 1 0 1 1 0 0 +EDGE2 3517 2718 0.962889 0.0520964 -0.010744 1 0 1 1 0 0 +EDGE2 3517 2717 0.00513423 0.0743753 -0.0163644 1 0 1 1 0 0 +EDGE2 3518 2718 0.0243694 -0.0181997 -0.0123244 1 0 1 1 0 0 +EDGE2 3518 2717 -0.925136 0.0545601 -0.00899608 1 0 1 1 0 0 +EDGE2 3518 3517 -0.958181 -0.0542993 -0.00139671 1 0 1 1 0 0 +EDGE2 3518 2719 1.04817 0.00449935 0.0067028 1 0 1 1 0 0 +EDGE2 3519 2718 -1.08615 0.0283702 0.028262 1 0 1 1 0 0 +EDGE2 3519 3518 -1.05556 -0.0223099 -0.0215449 1 0 1 1 0 0 +EDGE2 3519 2719 0.0535596 -0.0631242 -0.0287333 1 0 1 1 0 0 +EDGE2 3519 2720 1.00133 -0.0729094 0.0177547 1 0 1 1 0 0 +EDGE2 3519 2740 1.04051 -0.120246 -3.11899 1 0 1 1 0 0 +EDGE2 3520 2741 -0.0534207 0.968379 1.56917 1 0 1 1 0 0 +EDGE2 3520 2719 -0.94325 -0.0209128 0.00494059 1 0 1 1 0 0 +EDGE2 3520 3519 -0.940266 -0.0475097 0.00777564 1 0 1 1 0 0 +EDGE2 3520 2721 -0.0659767 -0.922586 -1.55951 1 0 1 1 0 0 +EDGE2 3520 2720 0.143856 -0.0797211 0.0160082 1 0 1 1 0 0 +EDGE2 3520 2740 -0.0296271 0.0297793 -3.15162 1 0 1 1 0 0 +EDGE2 3520 2739 0.886348 0.0357825 -3.11154 1 0 1 1 0 0 +EDGE2 3521 3520 -0.961668 0.0149109 1.57875 1 0 1 1 0 0 +EDGE2 3521 2721 -0.00431323 0.0523023 0.0032559 1 0 1 1 0 0 +EDGE2 3521 2720 -0.871727 -0.026093 1.57719 1 0 1 1 0 0 +EDGE2 3521 2740 -0.995465 0.0903517 -1.52649 1 0 1 1 0 0 +EDGE2 3521 2722 0.931779 -0.00216388 -0.0114477 1 0 1 1 0 0 +EDGE2 3522 2721 -1.03267 0.0661984 -0.0148752 1 0 1 1 0 0 +EDGE2 3522 3521 -1.02835 -0.0748284 -0.0207494 1 0 1 1 0 0 +EDGE2 3522 2722 -0.0172562 -0.0420974 -0.0197416 1 0 1 1 0 0 +EDGE2 3522 2723 0.959418 0.07756 0.00100779 1 0 1 1 0 0 +EDGE2 3523 3522 -0.951044 0.00167459 0.021642 1 0 1 1 0 0 +EDGE2 3523 2722 -1.0468 0.104674 0.00555287 1 0 1 1 0 0 +EDGE2 3523 2724 0.946644 -0.0488006 -0.00256666 1 0 1 1 0 0 +EDGE2 3523 2723 0.0306851 -0.0127315 0.0375382 1 0 1 1 0 0 +EDGE2 3524 2724 -0.0232625 -0.0109333 -0.0184338 1 0 1 1 0 0 +EDGE2 3524 2723 -0.983764 0.114641 -0.00727474 1 0 1 1 0 0 +EDGE2 3524 3523 -0.967096 0.0127024 -0.0457458 1 0 1 1 0 0 +EDGE2 3524 2725 1.03632 -0.0320924 -0.0174631 1 0 1 1 0 0 +EDGE2 3525 2724 -1.01986 -0.02516 0.0232661 1 0 1 1 0 0 +EDGE2 3525 3524 -1.02015 -0.00684203 -0.0395435 1 0 1 1 0 0 +EDGE2 3525 2725 0.0110681 0.0223713 -0.00883601 1 0 1 1 0 0 +EDGE2 3525 2726 0.00300763 1.01025 1.58717 1 0 1 1 0 0 +EDGE2 3526 3525 -1.0288 -0.0635073 -1.60321 1 0 1 1 0 0 +EDGE2 3526 2725 -1.09853 0.0413539 -1.59039 1 0 1 1 0 0 +EDGE2 3526 2726 -0.0628834 0.00577784 0.0136065 1 0 1 1 0 0 +EDGE2 3526 2727 0.901185 -0.0552646 0.00927462 1 0 1 1 0 0 +EDGE2 3527 2728 0.973816 0.0937189 0.0377866 1 0 1 1 0 0 +EDGE2 3527 3526 -1.02465 -0.0132617 -0.00707618 1 0 1 1 0 0 +EDGE2 3527 2726 -1.00938 0.0624681 0.00710316 1 0 1 1 0 0 +EDGE2 3527 2727 0.0182331 -0.0409375 0.0228155 1 0 1 1 0 0 +EDGE2 3528 2728 0.0035496 0.0299341 0.00285274 1 0 1 1 0 0 +EDGE2 3528 2727 -0.949642 0.0655916 -0.0293502 1 0 1 1 0 0 +EDGE2 3528 3527 -1.05028 -0.0865334 0.0554163 1 0 1 1 0 0 +EDGE2 3528 2729 1.07848 0.0678871 0.00753668 1 0 1 1 0 0 +EDGE2 3529 2728 -1.07888 -0.074701 0.00986521 1 0 1 1 0 0 +EDGE2 3529 3528 -0.947741 -0.0528059 -0.0166314 1 0 1 1 0 0 +EDGE2 3529 2729 0.0299334 -0.082971 0.0196164 1 0 1 1 0 0 +EDGE2 3529 2730 1.0146 0.11079 0.0410943 1 0 1 1 0 0 +EDGE2 3530 2731 -0.0896013 1.06965 1.58264 1 0 1 1 0 0 +EDGE2 3530 2729 -1.01121 0.0781844 -0.0174103 1 0 1 1 0 0 +EDGE2 3530 3529 -0.879439 0.0577781 0.0115774 1 0 1 1 0 0 +EDGE2 3530 2730 0.0571959 0.0324265 0.0354826 1 0 1 1 0 0 +EDGE2 3531 2730 -0.96238 -0.017445 1.58152 1 0 1 1 0 0 +EDGE2 3531 3530 -0.964957 0.125054 1.56065 1 0 1 1 0 0 +EDGE2 3532 3531 -0.986559 0.0115632 0.0231128 1 0 1 1 0 0 +EDGE2 3533 3532 -0.990116 0.0021648 -0.0025664 1 0 1 1 0 0 +EDGE2 3534 3533 -0.993417 -0.0232174 -0.000592298 1 0 1 1 0 0 +EDGE2 3535 3534 -1.0824 0.0333581 0.0228418 1 0 1 1 0 0 +EDGE2 3536 3535 -0.998669 0.00218605 -1.57336 1 0 1 1 0 0 +EDGE2 3537 3536 -0.979675 0.0279147 -0.0135768 1 0 1 1 0 0 +EDGE2 3538 3537 -1.00113 0.0342806 -0.0366679 1 0 1 1 0 0 +EDGE2 3539 3538 -0.93913 -0.0042768 -0.0377137 1 0 1 1 0 0 +EDGE2 3540 3539 -1.05081 -0.0433081 0.0173491 1 0 1 1 0 0 +EDGE2 3541 3540 -1.02952 -0.0320495 -1.58284 1 0 1 1 0 0 +EDGE2 3542 3541 -1.14302 0.0122115 0.0126273 1 0 1 1 0 0 +EDGE2 3543 3542 -1.02998 -0.0158251 -0.0038643 1 0 1 1 0 0 +EDGE2 3544 3543 -1.12245 0.000320813 -0.00197206 1 0 1 1 0 0 +EDGE2 3545 3544 -0.991977 0.019332 0.015995 1 0 1 1 0 0 +EDGE2 3546 3545 -1.03457 0.0964991 1.58202 1 0 1 1 0 0 +EDGE2 3547 3546 -1.03275 0.040594 -0.0274157 1 0 1 1 0 0 +EDGE2 3548 3547 -1.00309 0.115239 -0.00537387 1 0 1 1 0 0 +EDGE2 3549 3548 -1.04803 0.0690886 -0.0243396 1 0 1 1 0 0 +EDGE2 3550 3549 -0.952172 0.0717824 -0.00388464 1 0 1 1 0 0 +EDGE2 3551 3550 -0.961377 0.00794283 -1.5598 1 0 1 1 0 0 +EDGE2 3552 3551 -0.969396 0.0384239 -0.00780742 1 0 1 1 0 0 +EDGE2 3553 3552 -0.992752 0.0198985 -0.00838609 1 0 1 1 0 0 +EDGE2 3554 3553 -0.983304 -0.155437 0.0275452 1 0 1 1 0 0 +EDGE2 3555 3554 -0.958546 -0.0392228 -0.0248179 1 0 1 1 0 0 +EDGE2 3556 3555 -1.07042 0.000662529 1.59281 1 0 1 1 0 0 +EDGE2 3557 3556 -1.07532 -0.0029848 0.00697898 1 0 1 1 0 0 +EDGE2 3558 3557 -1.0432 -0.00555093 -0.00883667 1 0 1 1 0 0 +EDGE2 3559 3558 -0.962305 0.0292042 -0.0233407 1 0 1 1 0 0 +EDGE2 3560 3559 -1.0234 -0.0650351 -0.0162196 1 0 1 1 0 0 +EDGE2 3561 3560 -1.07638 -0.0282083 -1.58543 1 0 1 1 0 0 +EDGE2 3562 3561 -1.02524 -0.0076558 0.0238883 1 0 1 1 0 0 +EDGE2 3563 3562 -1.06762 -0.0160881 -0.00678312 1 0 1 1 0 0 +EDGE2 3564 3563 -0.974793 0.034378 0.0570108 1 0 1 1 0 0 +EDGE2 3565 3564 -0.990885 0.0208647 -0.0115712 1 0 1 1 0 0 +EDGE2 3566 3565 -0.95472 0.0272684 -1.55403 1 0 1 1 0 0 +EDGE2 3567 3566 -0.955367 0.0418824 0.0149981 1 0 1 1 0 0 +EDGE2 3568 3567 -1.02124 -0.0323237 0.00621312 1 0 1 1 0 0 +EDGE2 3569 2910 1.01911 0.00315889 -3.14348 1 0 1 1 0 0 +EDGE2 3569 3568 -0.948932 0.0202907 0.00979098 1 0 1 1 0 0 +EDGE2 3570 2911 0.0777001 -1.04124 -1.57451 1 0 1 1 0 0 +EDGE2 3570 2909 0.952513 -0.0376873 -3.15211 1 0 1 1 0 0 +EDGE2 3570 2910 -0.00225685 -0.0322404 -3.13978 1 0 1 1 0 0 +EDGE2 3570 3569 -0.971372 0.0712304 0.00769236 1 0 1 1 0 0 +EDGE2 3571 2912 1.08492 0.0502632 -0.02506 1 0 1 1 0 0 +EDGE2 3571 2911 0.0391143 0.0633441 0.00920958 1 0 1 1 0 0 +EDGE2 3571 2910 -1.02522 0.0188788 -1.57105 1 0 1 1 0 0 +EDGE2 3571 3570 -0.963797 0.0463391 1.57295 1 0 1 1 0 0 +EDGE2 3572 3571 -0.995442 -0.0321783 0.0375562 1 0 1 1 0 0 +EDGE2 3572 2913 0.966451 0.0985201 0.00189892 1 0 1 1 0 0 +EDGE2 3572 2912 0.0675519 0.0509243 -0.00143275 1 0 1 1 0 0 +EDGE2 3572 2911 -0.989128 -0.0716816 0.0106331 1 0 1 1 0 0 +EDGE2 3573 2913 -0.0494993 0.0532077 -0.00955479 1 0 1 1 0 0 +EDGE2 3573 2914 1.01535 -0.0215595 0.011641 1 0 1 1 0 0 +EDGE2 3573 2912 -0.981565 0.00183027 -0.0116997 1 0 1 1 0 0 +EDGE2 3573 3572 -1.05533 -0.0360229 -0.0196795 1 0 1 1 0 0 +EDGE2 3574 2915 0.979075 -0.0187405 -0.00493297 1 0 1 1 0 0 +EDGE2 3574 2913 -1.0052 -0.0955978 0.0198127 1 0 1 1 0 0 +EDGE2 3574 2914 -0.0203834 0.0603758 -0.0243616 1 0 1 1 0 0 +EDGE2 3574 3573 -0.971841 -0.0274439 -0.00474852 1 0 1 1 0 0 +EDGE2 3575 2915 0.031871 -0.0516269 0.0242253 1 0 1 1 0 0 +EDGE2 3575 2916 -0.0127767 0.957237 1.59616 1 0 1 1 0 0 +EDGE2 3575 2914 -0.984122 0.00575851 -0.0144982 1 0 1 1 0 0 +EDGE2 3575 3574 -1.05294 0.0125736 -0.0021362 1 0 1 1 0 0 +EDGE2 3576 2915 -0.995283 0.0167943 -1.56739 1 0 1 1 0 0 +EDGE2 3576 2916 -0.0643713 -0.0673258 -0.0112923 1 0 1 1 0 0 +EDGE2 3576 2917 1.07593 -0.026736 0.0247868 1 0 1 1 0 0 +EDGE2 3576 3575 -1.03722 -0.0281393 -1.57615 1 0 1 1 0 0 +EDGE2 3577 2918 0.964455 -0.0205133 0.0196032 1 0 1 1 0 0 +EDGE2 3577 2916 -1.04577 0.00442923 0.0198777 1 0 1 1 0 0 +EDGE2 3577 2917 -0.0363104 -0.0520593 0.000815398 1 0 1 1 0 0 +EDGE2 3577 3576 -1.00369 0.098696 0.00942371 1 0 1 1 0 0 +EDGE2 3578 2919 0.971663 -0.00234636 0.0507929 1 0 1 1 0 0 +EDGE2 3578 3577 -0.982687 0.0451814 -0.00212148 1 0 1 1 0 0 +EDGE2 3578 2918 -0.0542581 0.00622857 -0.00390638 1 0 1 1 0 0 +EDGE2 3578 2917 -0.955297 -0.0250438 -0.0114321 1 0 1 1 0 0 +EDGE2 3579 2919 0.0435237 0.029882 -0.0350724 1 0 1 1 0 0 +EDGE2 3579 2920 1.00372 -0.0623815 -0.00812171 1 0 1 1 0 0 +EDGE2 3579 3578 -1.14112 0.0144984 0.00132829 1 0 1 1 0 0 +EDGE2 3579 2918 -1.02315 0.0385644 -0.0313726 1 0 1 1 0 0 +EDGE2 3580 2919 -1.04206 -0.0593621 -0.000305933 1 0 1 1 0 0 +EDGE2 3580 2921 0.00168201 0.978021 1.53627 1 0 1 1 0 0 +EDGE2 3580 2920 0.0365207 -0.0209304 0.00384788 1 0 1 1 0 0 +EDGE2 3580 3579 -1.06567 0.0330574 0.020355 1 0 1 1 0 0 +EDGE2 3581 2921 -0.0366985 0.00998678 0.00812765 1 0 1 1 0 0 +EDGE2 3581 2920 -0.973288 -0.0303672 -1.56073 1 0 1 1 0 0 +EDGE2 3581 3580 -1.10767 0.00769995 -1.58114 1 0 1 1 0 0 +EDGE2 3581 2922 0.971776 -0.0141026 0.0144286 1 0 1 1 0 0 +EDGE2 3582 2921 -0.925225 0.0492119 -0.00457359 1 0 1 1 0 0 +EDGE2 3582 3581 -0.94425 -0.0492033 0.0332098 1 0 1 1 0 0 +EDGE2 3582 2922 -0.00715235 -0.0854998 -0.0415441 1 0 1 1 0 0 +EDGE2 3582 2923 0.9559 -0.000452635 0.0130951 1 0 1 1 0 0 +EDGE2 3583 3582 -1.00687 0.00250129 -0.030165 1 0 1 1 0 0 +EDGE2 3583 2922 -0.982501 -0.00543484 0.0049259 1 0 1 1 0 0 +EDGE2 3583 2923 0.023543 -0.0904793 -0.007468 1 0 1 1 0 0 +EDGE2 3583 2924 1.05571 0.0763769 0.00201838 1 0 1 1 0 0 +EDGE2 3584 3583 -1.08641 0.0213004 0.0175959 1 0 1 1 0 0 +EDGE2 3584 2923 -1.03422 -0.0135618 -0.0188386 1 0 1 1 0 0 +EDGE2 3584 2924 -0.0186937 -0.0511115 0.00911622 1 0 1 1 0 0 +EDGE2 3584 2905 0.978364 -0.00999652 -3.11295 1 0 1 1 0 0 +EDGE2 3584 2925 1.03561 0.00655361 0.0109064 1 0 1 1 0 0 +EDGE2 3584 2945 1.07116 -0.0174696 -3.11667 1 0 1 1 0 0 +EDGE2 3585 2924 -0.945384 -0.0162895 0.0132784 1 0 1 1 0 0 +EDGE2 3585 3584 -1.02755 0.0913598 0.0154489 1 0 1 1 0 0 +EDGE2 3585 2904 0.991939 0.0563134 -3.1504 1 0 1 1 0 0 +EDGE2 3585 2946 0.0135426 -1.01259 -1.55985 1 0 1 1 0 0 +EDGE2 3585 2926 0.0161354 -0.886497 -1.52828 1 0 1 1 0 0 +EDGE2 3585 2905 0.0353393 0.0124805 -3.1499 1 0 1 1 0 0 +EDGE2 3585 2925 -0.0641648 0.113179 0.030011 1 0 1 1 0 0 +EDGE2 3585 2945 0.0370484 0.0434022 -3.14251 1 0 1 1 0 0 +EDGE2 3585 2944 0.872353 0.0839329 -3.11783 1 0 1 1 0 0 +EDGE2 3585 2906 -0.0833935 0.986016 1.58936 1 0 1 1 0 0 +EDGE2 3586 3585 -0.956421 0.0885157 -1.53498 1 0 1 1 0 0 +EDGE2 3586 2905 -0.929276 0.0137423 1.57946 1 0 1 1 0 0 +EDGE2 3586 2925 -0.91667 -0.0318268 -1.57294 1 0 1 1 0 0 +EDGE2 3586 2945 -0.993895 0.0725745 1.591 1 0 1 1 0 0 +EDGE2 3586 2906 0.069214 -0.0659293 0.00864318 1 0 1 1 0 0 +EDGE2 3586 2907 1.04175 -0.000547782 -0.0288872 1 0 1 1 0 0 +EDGE2 3587 2906 -0.957088 -0.0288489 -0.0296702 1 0 1 1 0 0 +EDGE2 3587 3586 -0.959601 0.00901637 0.0157659 1 0 1 1 0 0 +EDGE2 3587 2907 0.0068945 0.0252876 -0.00323452 1 0 1 1 0 0 +EDGE2 3587 2908 0.981425 -9.63793e-05 -0.0171357 1 0 1 1 0 0 +EDGE2 3588 3587 -1.03187 0.0791216 -0.0359867 1 0 1 1 0 0 +EDGE2 3588 2907 -1.0014 -0.0708218 0.0150541 1 0 1 1 0 0 +EDGE2 3588 2909 0.939918 -0.0150035 -0.0236937 1 0 1 1 0 0 +EDGE2 3588 2908 -0.0342716 -0.00740075 0.00944576 1 0 1 1 0 0 +EDGE2 3589 3588 -1.01791 -0.0184813 -0.0278683 1 0 1 1 0 0 +EDGE2 3589 2909 0.0387199 0.00898466 0.000782982 1 0 1 1 0 0 +EDGE2 3589 2908 -0.949017 0.00596122 -0.0253898 1 0 1 1 0 0 +EDGE2 3589 2910 1.00305 -0.0131385 0.0011917 1 0 1 1 0 0 +EDGE2 3589 3570 0.998507 0.00298486 -3.14189 1 0 1 1 0 0 +EDGE2 3590 3571 0.0325992 0.88769 1.53436 1 0 1 1 0 0 +EDGE2 3590 2911 0.0151588 1.00849 1.5834 1 0 1 1 0 0 +EDGE2 3590 2909 -1.02614 0.0402072 -0.00191257 1 0 1 1 0 0 +EDGE2 3590 3589 -1.01574 0.0140183 -0.0179101 1 0 1 1 0 0 +EDGE2 3590 2910 0.0383669 -0.00197992 -0.0219193 1 0 1 1 0 0 +EDGE2 3590 3570 -0.00928687 -0.0596512 -3.15921 1 0 1 1 0 0 +EDGE2 3590 3569 1.03319 0.0444559 -3.15936 1 0 1 1 0 0 +EDGE2 3591 3571 -0.0107973 0.0347988 0.0117479 1 0 1 1 0 0 +EDGE2 3591 2912 0.978651 0.127437 -0.0412822 1 0 1 1 0 0 +EDGE2 3591 3572 1.01006 -0.00274626 -0.0177974 1 0 1 1 0 0 +EDGE2 3591 2911 0.0135188 -0.00955984 -0.0405384 1 0 1 1 0 0 +EDGE2 3591 3590 -0.979419 0.0766736 -1.56194 1 0 1 1 0 0 +EDGE2 3591 2910 -0.979816 -0.0363535 -1.5319 1 0 1 1 0 0 +EDGE2 3591 3570 -1.06778 0.0428762 1.63487 1 0 1 1 0 0 +EDGE2 3592 3571 -0.967919 -0.0890833 0.00104042 1 0 1 1 0 0 +EDGE2 3592 2913 0.991527 -0.00410049 0.0228647 1 0 1 1 0 0 +EDGE2 3592 3573 0.95438 0.164679 0.020529 1 0 1 1 0 0 +EDGE2 3592 2912 -0.0129178 0.0450683 0.00292317 1 0 1 1 0 0 +EDGE2 3592 3572 -0.0074517 0.0130582 -0.0122558 1 0 1 1 0 0 +EDGE2 3592 3591 -0.950128 -0.0272273 -0.00115328 1 0 1 1 0 0 +EDGE2 3592 2911 -1.02601 -0.0169621 -0.0123573 1 0 1 1 0 0 +EDGE2 3593 2913 0.0182581 -0.0184161 0.0375666 1 0 1 1 0 0 +EDGE2 3593 2914 1.04624 0.0596473 -0.00873874 1 0 1 1 0 0 +EDGE2 3593 3574 0.968647 -0.125984 -0.00634673 1 0 1 1 0 0 +EDGE2 3593 3573 0.0209596 0.0435528 -0.0219829 1 0 1 1 0 0 +EDGE2 3593 2912 -1.01794 0.0481932 -0.0374172 1 0 1 1 0 0 +EDGE2 3593 3592 -1.00451 -0.129833 0.0336389 1 0 1 1 0 0 +EDGE2 3593 3572 -0.933026 0.0300776 -0.00776013 1 0 1 1 0 0 +EDGE2 3594 2915 0.996898 -0.0564112 0.0148417 1 0 1 1 0 0 +EDGE2 3594 3575 0.991482 -0.00907964 -0.00881068 1 0 1 1 0 0 +EDGE2 3594 2913 -0.990802 -0.0325868 -0.0152111 1 0 1 1 0 0 +EDGE2 3594 2914 0.011988 0.0388916 -0.00649595 1 0 1 1 0 0 +EDGE2 3594 3574 -0.0160596 0.00666248 0.00211474 1 0 1 1 0 0 +EDGE2 3594 3593 -1.00058 0.019715 -0.0325246 1 0 1 1 0 0 +EDGE2 3594 3573 -1.01146 0.0397535 -0.0800499 1 0 1 1 0 0 +EDGE2 3595 2915 -0.0657307 -0.116478 -0.0178591 1 0 1 1 0 0 +EDGE2 3595 2916 -0.00587725 1.06913 1.56548 1 0 1 1 0 0 +EDGE2 3595 3576 -0.117122 1.03451 1.57571 1 0 1 1 0 0 +EDGE2 3595 3575 -0.0483259 0.0125217 0.0115188 1 0 1 1 0 0 +EDGE2 3595 2914 -1.09475 0.00719182 -0.0139693 1 0 1 1 0 0 +EDGE2 3595 3594 -0.946674 -0.0424552 -0.0105207 1 0 1 1 0 0 +EDGE2 3595 3574 -1.03598 0.0190739 0.0509332 1 0 1 1 0 0 +EDGE2 3596 2915 -1.0455 0.0987611 1.60522 1 0 1 1 0 0 +EDGE2 3596 3595 -1.0845 0.0537835 1.56296 1 0 1 1 0 0 +EDGE2 3596 3575 -1.05453 -0.0142757 1.59922 1 0 1 1 0 0 +EDGE2 3597 3596 -1.03051 -0.0392412 -0.011753 1 0 1 1 0 0 +EDGE2 3598 3597 -0.918194 0.0876294 0.0233893 1 0 1 1 0 0 +EDGE2 3599 3598 -0.980574 -0.00686126 0.0160164 1 0 1 1 0 0 +EDGE2 3600 3599 -0.975176 -0.0165062 -0.0212474 1 0 1 1 0 0 +EDGE2 3601 3600 -0.943814 -0.0291512 -1.57116 1 0 1 1 0 0 +EDGE2 3602 3601 -1.02341 0.0424836 0.00429146 1 0 1 1 0 0 +EDGE2 3603 3602 -1.01646 -0.0570137 -0.0193973 1 0 1 1 0 0 +EDGE2 3604 3603 -0.969652 0.0312283 -0.0290956 1 0 1 1 0 0 +EDGE2 3605 3604 -1.02548 0.00653694 0.0114096 1 0 1 1 0 0 +EDGE2 3606 3605 -1.01592 0.0584634 1.57474 1 0 1 1 0 0 +EDGE2 3607 3606 -0.931031 -0.0546051 0.0143104 1 0 1 1 0 0 +EDGE2 3608 3607 -0.942369 0.0352036 0.00656692 1 0 1 1 0 0 +EDGE2 3609 3608 -1.0431 -0.0638784 0.0368552 1 0 1 1 0 0 +EDGE2 3610 3609 -1.04775 -0.0349576 -0.00773567 1 0 1 1 0 0 +EDGE2 3611 3610 -1.01138 0.0153274 -1.59196 1 0 1 1 0 0 +EDGE2 3612 3611 -0.976353 -0.115095 0.00911199 1 0 1 1 0 0 +EDGE2 3613 3612 -1.023 -0.0367008 0.0428617 1 0 1 1 0 0 +EDGE2 3614 3613 -0.998078 -0.111898 0.00830978 1 0 1 1 0 0 +EDGE2 3615 3614 -0.935508 -0.020724 -0.0239222 1 0 1 1 0 0 +EDGE2 3616 3615 -1.10848 0.00292889 1.63069 1 0 1 1 0 0 +EDGE2 3617 3616 -1.01279 -0.0219123 0.0313967 1 0 1 1 0 0 +EDGE2 3618 3617 -1.07452 0.0625042 0.00216186 1 0 1 1 0 0 +EDGE2 3619 3618 -0.939751 0.100159 0.0127405 1 0 1 1 0 0 +EDGE2 3620 3619 -1.02127 0.0525084 0.0123863 1 0 1 1 0 0 +EDGE2 3621 3620 -0.974246 0.0210147 1.62597 1 0 1 1 0 0 +EDGE2 3622 3621 -1.02903 0.03746 0.0309285 1 0 1 1 0 0 +EDGE2 3623 3622 -0.966804 -0.00565776 -0.00987388 1 0 1 1 0 0 +EDGE2 3624 3623 -1.03357 -0.040396 -0.025922 1 0 1 1 0 0 +EDGE2 3625 3624 -1.05831 0.0386432 -0.00959498 1 0 1 1 0 0 +EDGE2 3626 3625 -0.960349 -0.0299826 1.57874 1 0 1 1 0 0 +EDGE2 3627 3626 -1.02084 0.0528248 -0.0329606 1 0 1 1 0 0 +EDGE2 3628 3627 -0.947931 0.107528 -0.0317556 1 0 1 1 0 0 +EDGE2 3629 3610 0.970824 -0.00748793 -3.11687 1 0 1 1 0 0 +EDGE2 3629 3628 -1.09739 0.0328772 0.00980452 1 0 1 1 0 0 +EDGE2 3630 3609 0.982927 -0.046907 -3.13423 1 0 1 1 0 0 +EDGE2 3630 3611 0.102017 -0.968675 -1.56871 1 0 1 1 0 0 +EDGE2 3630 3610 -0.0330396 -0.058695 -3.09972 1 0 1 1 0 0 +EDGE2 3630 3629 -1.05624 0.0341764 -0.000254282 1 0 1 1 0 0 +EDGE2 3631 3610 -0.952568 0.0375447 1.60345 1 0 1 1 0 0 +EDGE2 3631 3630 -1.00018 0.0127167 -1.52002 1 0 1 1 0 0 +EDGE2 3632 3631 -0.996589 -0.0457907 0.0161413 1 0 1 1 0 0 +EDGE2 3633 3632 -1.04125 -0.0087923 0.0226833 1 0 1 1 0 0 +EDGE2 3634 3633 -0.965182 -0.0148887 -0.022681 1 0 1 1 0 0 +EDGE2 3635 3634 -1.04281 -0.00156852 0.0162475 1 0 1 1 0 0 +EDGE2 3636 3635 -1.07515 0.0494056 1.58185 1 0 1 1 0 0 +EDGE2 3637 3636 -0.936865 -0.0199754 0.0253948 1 0 1 1 0 0 +EDGE2 3638 3637 -1.0323 0.0059938 0.0337855 1 0 1 1 0 0 +EDGE2 3639 3600 1.06093 0.0606009 -3.12476 1 0 1 1 0 0 +EDGE2 3639 3638 -1.01737 -0.0572028 -0.00858159 1 0 1 1 0 0 +EDGE2 3640 3599 0.999358 0.0877098 -3.15165 1 0 1 1 0 0 +EDGE2 3640 3601 -0.0427969 -1.04692 -1.54828 1 0 1 1 0 0 +EDGE2 3640 3600 -0.0938801 -0.0420929 -3.14942 1 0 1 1 0 0 +EDGE2 3640 3639 -0.953004 -0.00131808 -0.00224262 1 0 1 1 0 0 +EDGE2 3641 3600 -1.01916 -0.00371992 1.58226 1 0 1 1 0 0 +EDGE2 3641 3640 -1.02003 0.0240006 -1.5587 1 0 1 1 0 0 +EDGE2 3642 3641 -1.05531 -0.11179 0.0153286 1 0 1 1 0 0 +EDGE2 3643 3642 -0.889089 -0.0657651 0.0110532 1 0 1 1 0 0 +EDGE2 3644 3643 -0.99882 0.0822448 0.00290775 1 0 1 1 0 0 +EDGE2 3644 3565 1.0454 -0.0369178 -3.15852 1 0 1 1 0 0 +EDGE2 3645 3644 -1.03058 0.0248238 0.0235179 1 0 1 1 0 0 +EDGE2 3645 3566 0.0682045 -0.989702 -1.56212 1 0 1 1 0 0 +EDGE2 3645 3564 1.08239 0.0987682 -3.16633 1 0 1 1 0 0 +EDGE2 3645 3565 0.0768728 0.0241578 -3.14258 1 0 1 1 0 0 +EDGE2 3646 3645 -1.00376 0.0152079 -1.55204 1 0 1 1 0 0 +EDGE2 3646 3565 -0.990516 -0.0252178 1.57058 1 0 1 1 0 0 +EDGE2 3647 3646 -0.952264 -0.028977 0.0272344 1 0 1 1 0 0 +EDGE2 3648 3647 -0.963526 -0.0435614 0.0032094 1 0 1 1 0 0 +EDGE2 3649 3648 -0.96126 -0.0323233 0.00665173 1 0 1 1 0 0 +EDGE2 3650 3649 -0.932565 0.0540064 0.0293103 1 0 1 1 0 0 +EDGE2 3651 3650 -0.96288 0.0228263 -1.57751 1 0 1 1 0 0 +EDGE2 3652 3651 -0.959668 -0.0791053 -0.00517596 1 0 1 1 0 0 +EDGE2 3653 3652 -0.927358 -0.106485 -0.0156827 1 0 1 1 0 0 +EDGE2 3654 3635 1.05674 -0.0425318 -3.15512 1 0 1 1 0 0 +EDGE2 3654 3653 -0.987693 0.077505 -0.0120653 1 0 1 1 0 0 +EDGE2 3655 3635 -0.0139849 -0.0599458 -3.15382 1 0 1 1 0 0 +EDGE2 3655 3636 -0.0051874 1.09877 1.57337 1 0 1 1 0 0 +EDGE2 3655 3634 1.00193 0.0123946 -3.11028 1 0 1 1 0 0 +EDGE2 3655 3654 -1.02966 -0.0816287 -0.0269701 1 0 1 1 0 0 +EDGE2 3656 3637 0.946253 -0.00121951 -0.0423478 1 0 1 1 0 0 +EDGE2 3656 3635 -0.930403 -0.107454 1.55183 1 0 1 1 0 0 +EDGE2 3656 3636 -0.0330365 0.0788001 0.00398207 1 0 1 1 0 0 +EDGE2 3656 3655 -0.98806 0.0773995 -1.58456 1 0 1 1 0 0 +EDGE2 3657 3637 -0.0277791 0.0078336 -0.00583115 1 0 1 1 0 0 +EDGE2 3657 3638 0.922611 -0.050769 -0.00938329 1 0 1 1 0 0 +EDGE2 3657 3656 -0.978517 -0.031589 -0.0334105 1 0 1 1 0 0 +EDGE2 3657 3636 -0.989168 -0.0170942 -0.0206121 1 0 1 1 0 0 +EDGE2 3658 3637 -0.983201 0.0715679 -0.0364407 1 0 1 1 0 0 +EDGE2 3658 3639 1.00749 0.0595843 0.025277 1 0 1 1 0 0 +EDGE2 3658 3638 0.0113056 0.0129908 0.00891385 1 0 1 1 0 0 +EDGE2 3658 3657 -0.984934 -0.00178717 -0.0337001 1 0 1 1 0 0 +EDGE2 3659 3600 0.975921 -0.0479629 -3.1464 1 0 1 1 0 0 +EDGE2 3659 3640 0.997486 0.055111 0.00260941 1 0 1 1 0 0 +EDGE2 3659 3639 -0.00575107 -0.003709 0.00793978 1 0 1 1 0 0 +EDGE2 3659 3638 -1.03721 0.0259274 0.00129721 1 0 1 1 0 0 +EDGE2 3659 3658 -1.00997 -0.0441272 -0.0354424 1 0 1 1 0 0 +EDGE2 3660 3599 0.977127 0.0494425 -3.15811 1 0 1 1 0 0 +EDGE2 3660 3601 0.0647704 -1.01943 -1.54339 1 0 1 1 0 0 +EDGE2 3660 3600 -0.00765131 0.031612 -3.15172 1 0 1 1 0 0 +EDGE2 3660 3640 0.00178278 0.0193116 0.0109734 1 0 1 1 0 0 +EDGE2 3660 3641 -0.0352855 1.01547 1.56125 1 0 1 1 0 0 +EDGE2 3660 3659 -0.984488 -0.0123034 -0.00218308 1 0 1 1 0 0 +EDGE2 3660 3639 -1.00101 -0.0475401 -0.00611724 1 0 1 1 0 0 +EDGE2 3661 3600 -0.938075 0.028362 1.57043 1 0 1 1 0 0 +EDGE2 3661 3640 -1.03444 -0.0867595 -1.55051 1 0 1 1 0 0 +EDGE2 3661 3660 -0.981941 0.10831 -1.57978 1 0 1 1 0 0 +EDGE2 3661 3641 0.132498 -0.116496 -0.00591795 1 0 1 1 0 0 +EDGE2 3661 3642 1.05368 0.0585675 0.00740229 1 0 1 1 0 0 +EDGE2 3662 3641 -1.00749 0.0360902 0.00964223 1 0 1 1 0 0 +EDGE2 3662 3661 -0.915994 0.0022261 0.0167955 1 0 1 1 0 0 +EDGE2 3662 3642 0.0111625 -0.00774905 0.0224375 1 0 1 1 0 0 +EDGE2 3662 3643 0.972981 -0.0183944 -0.00560114 1 0 1 1 0 0 +EDGE2 3663 3642 -0.943698 0.0107448 0.00295144 1 0 1 1 0 0 +EDGE2 3663 3662 -0.91616 -0.0285401 -0.0175616 1 0 1 1 0 0 +EDGE2 3663 3643 0.0100411 0.00800634 0.00531949 1 0 1 1 0 0 +EDGE2 3663 3644 1.07026 0.0703885 0.0210591 1 0 1 1 0 0 +EDGE2 3664 3663 -1.11136 -0.0653289 -0.00687109 1 0 1 1 0 0 +EDGE2 3664 3643 -1.09837 -0.0279865 -0.0173007 1 0 1 1 0 0 +EDGE2 3664 3644 -0.0875163 -0.0819351 -0.0172761 1 0 1 1 0 0 +EDGE2 3664 3645 0.939408 0.00640249 -0.00762899 1 0 1 1 0 0 +EDGE2 3664 3565 1.00844 -0.0775771 -3.1732 1 0 1 1 0 0 +EDGE2 3665 3664 -1.00631 -0.0184732 0.00496415 1 0 1 1 0 0 +EDGE2 3665 3644 -1.02593 0.0706589 0.0142616 1 0 1 1 0 0 +EDGE2 3665 3566 -0.00552096 -0.984424 -1.58323 1 0 1 1 0 0 +EDGE2 3665 3645 -0.007204 -0.0426157 0.00695124 1 0 1 1 0 0 +EDGE2 3665 3564 1.06468 -0.0346837 -3.12269 1 0 1 1 0 0 +EDGE2 3665 3565 -0.0178103 -0.0253895 -3.12097 1 0 1 1 0 0 +EDGE2 3665 3646 -0.108922 0.972537 1.57623 1 0 1 1 0 0 +EDGE2 3666 3645 -0.943084 0.0706368 -1.56814 1 0 1 1 0 0 +EDGE2 3666 3665 -1.02331 -0.0859053 -1.55476 1 0 1 1 0 0 +EDGE2 3666 3565 -0.984328 0.0127017 1.58074 1 0 1 1 0 0 +EDGE2 3666 3646 0.0537254 0.0103901 0.039712 1 0 1 1 0 0 +EDGE2 3666 3647 1.00951 -0.00171407 -0.00309797 1 0 1 1 0 0 +EDGE2 3667 3646 -0.949561 0.0135503 0.00201984 1 0 1 1 0 0 +EDGE2 3667 3666 -0.981165 -0.0213706 0.00393481 1 0 1 1 0 0 +EDGE2 3667 3647 0.0676738 0.063296 0.0135199 1 0 1 1 0 0 +EDGE2 3667 3648 0.98024 -0.049998 -0.0129066 1 0 1 1 0 0 +EDGE2 3668 3667 -0.998364 -0.00981187 -0.0170761 1 0 1 1 0 0 +EDGE2 3668 3647 -1.01869 -0.00368913 -0.0422763 1 0 1 1 0 0 +EDGE2 3668 3649 0.948205 0.0759912 0.0197072 1 0 1 1 0 0 +EDGE2 3668 3648 0.0488203 0.0121908 0.00279617 1 0 1 1 0 0 +EDGE2 3669 3650 1.04209 -0.0207037 -0.0383606 1 0 1 1 0 0 +EDGE2 3669 3668 -0.977446 -0.0293298 0.0289777 1 0 1 1 0 0 +EDGE2 3669 3649 0.0452115 0.0531896 0.00116409 1 0 1 1 0 0 +EDGE2 3669 3648 -0.956664 0.0237385 -0.0178563 1 0 1 1 0 0 +EDGE2 3670 3651 -0.0357377 0.950843 1.59643 1 0 1 1 0 0 +EDGE2 3670 3650 0.100417 0.0361745 -0.0197791 1 0 1 1 0 0 +EDGE2 3670 3649 -0.948639 0.0873893 0.00890398 1 0 1 1 0 0 +EDGE2 3670 3669 -1.02985 0.0125553 0.00366298 1 0 1 1 0 0 +EDGE2 3671 3651 -0.0150936 -0.0117416 0.0277266 1 0 1 1 0 0 +EDGE2 3671 3652 0.98499 -0.0545271 -0.0265683 1 0 1 1 0 0 +EDGE2 3671 3650 -1.07806 0.0258726 -1.57313 1 0 1 1 0 0 +EDGE2 3671 3670 -1.11899 0.0153734 -1.53199 1 0 1 1 0 0 +EDGE2 3672 3653 0.951161 -0.0217461 0.020157 1 0 1 1 0 0 +EDGE2 3672 3651 -0.910299 0.0352964 0.013362 1 0 1 1 0 0 +EDGE2 3672 3652 0.0279338 -0.0366807 -0.0104105 1 0 1 1 0 0 +EDGE2 3672 3671 -1.0228 0.042788 -0.0380944 1 0 1 1 0 0 +EDGE2 3673 3654 0.997887 -0.0693637 0.0108934 1 0 1 1 0 0 +EDGE2 3673 3653 -0.0369739 0.0123047 0.000493456 1 0 1 1 0 0 +EDGE2 3673 3652 -1.03428 0.0519354 0.013732 1 0 1 1 0 0 +EDGE2 3673 3672 -0.982241 -0.0466806 0.0281783 1 0 1 1 0 0 +EDGE2 3674 3635 0.952114 -0.0497773 -3.13826 1 0 1 1 0 0 +EDGE2 3674 3655 0.967674 -0.0377214 -0.0383964 1 0 1 1 0 0 +EDGE2 3674 3654 0.0577731 -0.0443818 0.0255072 1 0 1 1 0 0 +EDGE2 3674 3673 -1.01804 -0.0115073 -0.0479059 1 0 1 1 0 0 +EDGE2 3674 3653 -0.965545 -0.02143 0.0124965 1 0 1 1 0 0 +EDGE2 3675 3635 -0.084151 0.0278845 -3.15372 1 0 1 1 0 0 +EDGE2 3675 3656 -0.013326 1.04313 1.59483 1 0 1 1 0 0 +EDGE2 3675 3636 -0.115062 0.99691 1.56872 1 0 1 1 0 0 +EDGE2 3675 3634 1.02125 0.0605821 -3.13306 1 0 1 1 0 0 +EDGE2 3675 3655 -0.0057259 0.0677837 -0.0251505 1 0 1 1 0 0 +EDGE2 3675 3654 -1.06824 0.0409491 -0.0386799 1 0 1 1 0 0 +EDGE2 3675 3674 -0.984123 0.0139094 0.0348826 1 0 1 1 0 0 +EDGE2 3676 3637 0.930217 -0.0357881 -0.000879388 1 0 1 1 0 0 +EDGE2 3676 3657 1.06808 -0.0168068 -0.03122 1 0 1 1 0 0 +EDGE2 3676 3635 -0.983537 -0.00342793 1.54103 1 0 1 1 0 0 +EDGE2 3676 3656 -0.00149477 -0.118485 -0.0239329 1 0 1 1 0 0 +EDGE2 3676 3636 0.010752 -0.0730446 -0.0196542 1 0 1 1 0 0 +EDGE2 3676 3675 -1.00077 0.0491348 -1.55252 1 0 1 1 0 0 +EDGE2 3676 3655 -0.976859 0.0221275 -1.61391 1 0 1 1 0 0 +EDGE2 3677 3637 0.0667573 0.030067 -0.0282211 1 0 1 1 0 0 +EDGE2 3677 3638 0.976652 -0.0766061 0.000114748 1 0 1 1 0 0 +EDGE2 3677 3658 0.990633 -0.0472942 0.00450332 1 0 1 1 0 0 +EDGE2 3677 3657 0.0140486 -0.010937 0.0170494 1 0 1 1 0 0 +EDGE2 3677 3656 -1.11246 0.035453 -0.0040637 1 0 1 1 0 0 +EDGE2 3677 3676 -0.974803 0.0101884 0.0233516 1 0 1 1 0 0 +EDGE2 3677 3636 -1.01312 -0.0569524 0.0261928 1 0 1 1 0 0 +EDGE2 3678 3637 -0.991031 0.0839861 0.0189328 1 0 1 1 0 0 +EDGE2 3678 3677 -0.995045 -0.019296 -0.0229194 1 0 1 1 0 0 +EDGE2 3678 3659 1.04419 -0.127571 0.00769422 1 0 1 1 0 0 +EDGE2 3678 3639 0.926139 0.00933599 -0.00299818 1 0 1 1 0 0 +EDGE2 3678 3638 0.0580375 0.0193652 0.000514782 1 0 1 1 0 0 +EDGE2 3678 3658 -0.0067623 0.00179718 -0.000544135 1 0 1 1 0 0 +EDGE2 3678 3657 -0.953523 0.0127985 -0.016098 1 0 1 1 0 0 +EDGE2 3679 3600 1.03794 0.0440455 -3.11994 1 0 1 1 0 0 +EDGE2 3679 3640 1.04359 -0.0345957 -0.00946068 1 0 1 1 0 0 +EDGE2 3679 3660 0.964411 -0.133254 -0.00950161 1 0 1 1 0 0 +EDGE2 3679 3659 0.0116351 -0.0361145 -0.0172184 1 0 1 1 0 0 +EDGE2 3679 3639 0.0490091 -0.0387462 -0.0113838 1 0 1 1 0 0 +EDGE2 3679 3638 -1.06203 0.110751 -0.0332256 1 0 1 1 0 0 +EDGE2 3679 3658 -1.08232 -0.0517857 -0.0307969 1 0 1 1 0 0 +EDGE2 3679 3678 -0.960162 -0.0212995 0.0274471 1 0 1 1 0 0 +EDGE2 3680 3599 0.997737 -0.0136808 -3.15625 1 0 1 1 0 0 +EDGE2 3680 3601 0.0439874 -0.982298 -1.54585 1 0 1 1 0 0 +EDGE2 3680 3600 -0.00762638 0.0865488 -3.18283 1 0 1 1 0 0 +EDGE2 3680 3640 0.0350121 -0.036529 0.00159527 1 0 1 1 0 0 +EDGE2 3680 3660 0.0312722 0.0861353 -0.016773 1 0 1 1 0 0 +EDGE2 3680 3641 -0.0260765 0.974434 1.54965 1 0 1 1 0 0 +EDGE2 3680 3661 0.000402279 1.04772 1.5927 1 0 1 1 0 0 +EDGE2 3680 3659 -1.0527 0.0571453 0.00751585 1 0 1 1 0 0 +EDGE2 3680 3679 -1.03492 0.0718568 0.0336335 1 0 1 1 0 0 +EDGE2 3680 3639 -1.06185 -0.00356485 0.0166312 1 0 1 1 0 0 +EDGE2 3681 3680 -1.10766 0.0219706 -1.56984 1 0 1 1 0 0 +EDGE2 3681 3600 -1.07612 0.00425446 1.55557 1 0 1 1 0 0 +EDGE2 3681 3640 -0.977859 -0.0446112 -1.56507 1 0 1 1 0 0 +EDGE2 3681 3660 -1.01237 0.0582584 -1.5991 1 0 1 1 0 0 +EDGE2 3681 3641 0.00653382 -0.0196266 -0.0368064 1 0 1 1 0 0 +EDGE2 3681 3661 -0.0765555 -0.0917656 -0.00026158 1 0 1 1 0 0 +EDGE2 3681 3642 0.976167 0.0538403 0.0276125 1 0 1 1 0 0 +EDGE2 3681 3662 0.976746 0.0773708 0.0134166 1 0 1 1 0 0 +EDGE2 3682 3641 -0.97204 0.0542112 0.0296069 1 0 1 1 0 0 +EDGE2 3682 3661 -0.965536 0.0110692 0.014893 1 0 1 1 0 0 +EDGE2 3682 3681 -1.03257 0.0135241 -0.0227329 1 0 1 1 0 0 +EDGE2 3682 3642 0.0906116 -0.0674483 0.0131984 1 0 1 1 0 0 +EDGE2 3682 3662 0.0128565 0.0298224 -0.0320102 1 0 1 1 0 0 +EDGE2 3682 3663 1.09853 -0.0632372 -0.0318831 1 0 1 1 0 0 +EDGE2 3682 3643 1.01428 -0.0231802 -0.00172482 1 0 1 1 0 0 +EDGE2 3683 3642 -1.04192 -0.0390776 -0.000429629 1 0 1 1 0 0 +EDGE2 3683 3662 -0.92967 -0.0257449 -0.0235816 1 0 1 1 0 0 +EDGE2 3683 3682 -0.923021 -0.068705 0.0199505 1 0 1 1 0 0 +EDGE2 3683 3663 -0.0745543 0.0146394 -0.0152535 1 0 1 1 0 0 +EDGE2 3683 3643 0.0595209 0.0672097 0.0127603 1 0 1 1 0 0 +EDGE2 3683 3664 0.952215 0.00788984 -0.0114023 1 0 1 1 0 0 +EDGE2 3683 3644 1.04221 -0.105752 -0.0105859 1 0 1 1 0 0 +EDGE2 3684 3663 -0.92384 0.0517026 -0.0598606 1 0 1 1 0 0 +EDGE2 3684 3683 -0.989292 -0.00582925 -0.0204925 1 0 1 1 0 0 +EDGE2 3684 3643 -0.971986 -0.0313755 0.0179409 1 0 1 1 0 0 +EDGE2 3684 3664 0.0440051 0.0322047 -0.0480153 1 0 1 1 0 0 +EDGE2 3684 3644 -0.0545457 0.0607325 0.0182938 1 0 1 1 0 0 +EDGE2 3684 3645 1.00586 0.0857717 -0.0290666 1 0 1 1 0 0 +EDGE2 3684 3665 0.96626 -0.0537742 -0.0295627 1 0 1 1 0 0 +EDGE2 3684 3565 1.02527 0.0444686 -3.17116 1 0 1 1 0 0 +EDGE2 3685 3664 -0.926 0.0826938 0.00476264 1 0 1 1 0 0 +EDGE2 3685 3684 -0.975139 0.0293121 -0.0301922 1 0 1 1 0 0 +EDGE2 3685 3644 -1.01809 -0.0417626 0.00543402 1 0 1 1 0 0 +EDGE2 3685 3566 -0.0252876 -1.0449 -1.60044 1 0 1 1 0 0 +EDGE2 3685 3645 0.0189722 -0.0497022 -0.0014448 1 0 1 1 0 0 +EDGE2 3685 3665 0.0368235 -0.0399814 0.00973399 1 0 1 1 0 0 +EDGE2 3685 3564 0.921697 -0.058644 -3.12226 1 0 1 1 0 0 +EDGE2 3685 3565 0.00113986 0.105133 -3.15333 1 0 1 1 0 0 +EDGE2 3685 3646 0.00678826 1.02084 1.55874 1 0 1 1 0 0 +EDGE2 3685 3666 -0.0983271 1.08491 1.55655 1 0 1 1 0 0 +EDGE2 3686 3567 1.07158 -0.0477731 -0.00675654 1 0 1 1 0 0 +EDGE2 3686 3566 0.0191636 0.000590141 -0.0113134 1 0 1 1 0 0 +EDGE2 3686 3645 -1.06271 0.0922278 1.56139 1 0 1 1 0 0 +EDGE2 3686 3685 -0.983864 -0.0069697 1.55917 1 0 1 1 0 0 +EDGE2 3686 3665 -0.954342 -0.024931 1.57955 1 0 1 1 0 0 +EDGE2 3686 3565 -1.05304 -0.0019946 -1.6005 1 0 1 1 0 0 +EDGE2 3687 3568 1.07502 0.0585208 -0.00570134 1 0 1 1 0 0 +EDGE2 3687 3686 -0.963239 -0.0851099 0.00126872 1 0 1 1 0 0 +EDGE2 3687 3567 -0.00886377 0.0491079 0.0144418 1 0 1 1 0 0 +EDGE2 3687 3566 -1.01101 0.000425477 0.0292198 1 0 1 1 0 0 +EDGE2 3688 3687 -0.960416 0.111492 -0.0103461 1 0 1 1 0 0 +EDGE2 3688 3569 1.01307 0.102923 -0.0206168 1 0 1 1 0 0 +EDGE2 3688 3568 0.00461031 0.0393198 -0.00599874 1 0 1 1 0 0 +EDGE2 3688 3567 -0.932802 -0.00164529 0.0116706 1 0 1 1 0 0 +EDGE2 3689 3590 0.966683 -0.0180757 -3.13512 1 0 1 1 0 0 +EDGE2 3689 2910 1.03844 0.0226924 -3.14276 1 0 1 1 0 0 +EDGE2 3689 3570 1.00505 -0.0503803 -0.00634595 1 0 1 1 0 0 +EDGE2 3689 3688 -0.988131 0.0185087 -0.010635 1 0 1 1 0 0 +EDGE2 3689 3569 -0.0336354 -0.0242476 -0.0453365 1 0 1 1 0 0 +EDGE2 3689 3568 -0.924322 0.0151712 -0.0182566 1 0 1 1 0 0 +EDGE2 3690 3571 -0.0201875 -1.09619 -1.57926 1 0 1 1 0 0 +EDGE2 3690 3591 -0.00944743 -0.967829 -1.56116 1 0 1 1 0 0 +EDGE2 3690 2911 0.0341513 -1.0458 -1.5764 1 0 1 1 0 0 +EDGE2 3690 3590 0.0221697 -0.00712173 -3.17788 1 0 1 1 0 0 +EDGE2 3690 2909 1.05527 -0.0815975 -3.11641 1 0 1 1 0 0 +EDGE2 3690 3589 0.978796 0.0311157 -3.15616 1 0 1 1 0 0 +EDGE2 3690 2910 0.0751332 -0.0763199 -3.11739 1 0 1 1 0 0 +EDGE2 3690 3570 0.0818264 -0.017172 -0.0147625 1 0 1 1 0 0 +EDGE2 3690 3569 -0.889087 0.0118337 0.0323939 1 0 1 1 0 0 +EDGE2 3690 3689 -1.03455 -0.0925055 -0.0452923 1 0 1 1 0 0 +EDGE2 3691 3590 -1.0492 -0.00061644 1.57753 1 0 1 1 0 0 +EDGE2 3691 3690 -0.94311 0.0494219 -1.57079 1 0 1 1 0 0 +EDGE2 3691 2910 -1.072 0.0327878 1.60249 1 0 1 1 0 0 +EDGE2 3691 3570 -1.01682 0.00753929 -1.54981 1 0 1 1 0 0 +EDGE2 3692 3691 -1.05054 -0.0735366 -0.0459214 1 0 1 1 0 0 +EDGE2 3693 3692 -1.07857 -0.0654611 -0.0224196 1 0 1 1 0 0 +EDGE2 3694 3693 -1.04399 -0.0336481 -0.00562261 1 0 1 1 0 0 +EDGE2 3694 3555 0.997327 0.0620712 -3.17488 1 0 1 1 0 0 +EDGE2 3695 3694 -1.02209 -0.0798113 -0.0013626 1 0 1 1 0 0 +EDGE2 3695 3554 1.02197 0.0203155 -3.16927 1 0 1 1 0 0 +EDGE2 3695 3555 -0.00512229 -0.0339565 -3.14827 1 0 1 1 0 0 +EDGE2 3695 3556 -0.0171016 0.943508 1.58165 1 0 1 1 0 0 +EDGE2 3696 3695 -1.03837 0.0826626 -1.59136 1 0 1 1 0 0 +EDGE2 3696 3555 -1.02942 -0.0361722 1.58076 1 0 1 1 0 0 +EDGE2 3696 3556 -0.0138547 -0.00502966 0.0110093 1 0 1 1 0 0 +EDGE2 3696 3557 0.986324 -0.021248 0.0213896 1 0 1 1 0 0 +EDGE2 3697 3696 -1.06999 0.00313349 0.00391645 1 0 1 1 0 0 +EDGE2 3697 3556 -0.955815 0.131849 -0.0299087 1 0 1 1 0 0 +EDGE2 3697 3557 -0.0528445 -0.0303712 0.0247057 1 0 1 1 0 0 +EDGE2 3697 3558 1.01859 -0.0388206 -0.00741253 1 0 1 1 0 0 +EDGE2 3698 3559 0.97748 -0.051846 0.0184815 1 0 1 1 0 0 +EDGE2 3698 3697 -1.03551 -0.161276 0.00378656 1 0 1 1 0 0 +EDGE2 3698 3557 -0.96706 -0.0136164 -0.00914896 1 0 1 1 0 0 +EDGE2 3698 3558 -0.0143477 -0.0584842 -0.0262296 1 0 1 1 0 0 +EDGE2 3699 3559 0.0666971 -0.0687394 -0.0216509 1 0 1 1 0 0 +EDGE2 3699 3558 -0.955547 -0.0296589 -0.0264852 1 0 1 1 0 0 +EDGE2 3699 3698 -1.12951 -0.0348779 0.0069836 1 0 1 1 0 0 +EDGE2 3699 3560 1.0477 0.00227158 -0.0101667 1 0 1 1 0 0 +EDGE2 3700 3561 -0.0624941 0.973368 1.54349 1 0 1 1 0 0 +EDGE2 3700 3559 -0.986832 0.0590283 -0.00955548 1 0 1 1 0 0 +EDGE2 3700 3699 -1.00562 0.00443798 0.00432552 1 0 1 1 0 0 +EDGE2 3700 3560 -0.00733636 0.0224825 0.0371798 1 0 1 1 0 0 +EDGE2 3701 3700 -1.10096 0.0402593 1.55035 1 0 1 1 0 0 +EDGE2 3701 3560 -0.940193 -0.0167577 1.58097 1 0 1 1 0 0 +EDGE2 3702 3701 -0.979206 -0.0529738 0.0405162 1 0 1 1 0 0 +EDGE2 3703 3702 -0.92954 0.0196008 0.0147035 1 0 1 1 0 0 +EDGE2 3704 3703 -0.847431 -0.0223249 -0.0552438 1 0 1 1 0 0 +EDGE2 3705 3704 -1.07104 -0.0692379 0.0101596 1 0 1 1 0 0 +EDGE2 3706 3705 -0.995919 -0.000687854 -1.51349 1 0 1 1 0 0 +EDGE2 3707 3706 -0.989845 -0.0436232 0.0381672 1 0 1 1 0 0 +EDGE2 3708 3707 -1.00378 0.0324188 -0.00667088 1 0 1 1 0 0 +EDGE2 3709 3708 -1.02028 -0.0514557 0.0348667 1 0 1 1 0 0 +EDGE2 3710 3709 -1.07566 0.0601374 -0.0518474 1 0 1 1 0 0 +EDGE2 3711 3710 -1.03431 0.0171611 -1.56007 1 0 1 1 0 0 +EDGE2 3712 3711 -0.917795 -0.00812039 -0.000359261 1 0 1 1 0 0 +EDGE2 3713 3712 -1.04808 -0.0113265 0.00247798 1 0 1 1 0 0 +EDGE2 3714 3713 -0.884807 0.0102659 -0.0145048 1 0 1 1 0 0 +EDGE2 3715 3714 -1.05996 -0.0186261 0.00911967 1 0 1 1 0 0 +EDGE2 3716 3715 -1.0084 -0.0851085 -1.57092 1 0 1 1 0 0 +EDGE2 3717 3716 -1.02877 0.029613 -0.00173784 1 0 1 1 0 0 +EDGE2 3718 3717 -1.03971 -0.0188114 0.0161305 1 0 1 1 0 0 +EDGE2 3719 3700 1.02038 0.0247537 -3.13263 1 0 1 1 0 0 +EDGE2 3719 3560 0.894163 0.0255258 -3.14988 1 0 1 1 0 0 +EDGE2 3719 3718 -0.966496 0.0188424 -0.00469081 1 0 1 1 0 0 +EDGE2 3720 3561 -0.0124951 -1.04228 -1.5797 1 0 1 1 0 0 +EDGE2 3720 3559 1.08644 -0.0381539 -3.13702 1 0 1 1 0 0 +EDGE2 3720 3699 1.02409 -0.0153682 -3.16526 1 0 1 1 0 0 +EDGE2 3720 3700 0.0843101 -0.0490622 -3.12689 1 0 1 1 0 0 +EDGE2 3720 3560 0.0559174 0.0956471 -3.16772 1 0 1 1 0 0 +EDGE2 3720 3701 -0.0136142 0.915417 1.58023 1 0 1 1 0 0 +EDGE2 3720 3719 -0.967982 0.00290082 -0.0376776 1 0 1 1 0 0 +EDGE2 3721 3562 1.08871 0.020724 -0.0144969 1 0 1 1 0 0 +EDGE2 3721 3561 -0.00541945 -0.00105859 0.0170631 1 0 1 1 0 0 +EDGE2 3721 3700 -0.958107 -0.0387091 -1.59423 1 0 1 1 0 0 +EDGE2 3721 3720 -0.866254 0.0201263 1.55127 1 0 1 1 0 0 +EDGE2 3721 3560 -1.05666 0.048489 -1.55171 1 0 1 1 0 0 +EDGE2 3722 3563 0.920079 -0.0106007 0.0430783 1 0 1 1 0 0 +EDGE2 3722 3721 -0.963119 -0.0399708 -0.0208638 1 0 1 1 0 0 +EDGE2 3722 3562 0.0436504 -0.0601323 -0.0140224 1 0 1 1 0 0 +EDGE2 3722 3561 -1.03358 -0.0368845 0.0289276 1 0 1 1 0 0 +EDGE2 3723 3563 0.0216442 -0.0835854 0.0226765 1 0 1 1 0 0 +EDGE2 3723 3564 0.966983 -0.013598 -0.0189076 1 0 1 1 0 0 +EDGE2 3723 3562 -1.12166 -0.127084 0.00302305 1 0 1 1 0 0 +EDGE2 3723 3722 -0.998184 0.0509666 0.0147613 1 0 1 1 0 0 +EDGE2 3724 3563 -0.975947 0.0196322 -0.00270064 1 0 1 1 0 0 +EDGE2 3724 3645 1.02171 -0.0760256 -3.1525 1 0 1 1 0 0 +EDGE2 3724 3685 1.00185 -0.0463303 -3.14253 1 0 1 1 0 0 +EDGE2 3724 3665 0.986356 -0.107643 -3.13228 1 0 1 1 0 0 +EDGE2 3724 3564 0.0254974 -0.0283342 0.0188313 1 0 1 1 0 0 +EDGE2 3724 3565 0.959378 -0.00518737 -0.0267978 1 0 1 1 0 0 +EDGE2 3724 3723 -1.03619 0.0559304 -0.0106751 1 0 1 1 0 0 +EDGE2 3725 3664 0.8992 0.0013156 -3.14001 1 0 1 1 0 0 +EDGE2 3725 3684 0.972051 -0.0172114 -3.15361 1 0 1 1 0 0 +EDGE2 3725 3644 1.01774 0.0085185 -3.12311 1 0 1 1 0 0 +EDGE2 3725 3686 0.0134847 1.10547 1.56048 1 0 1 1 0 0 +EDGE2 3725 3566 -0.0205685 0.950738 1.56215 1 0 1 1 0 0 +EDGE2 3725 3645 0.0368262 -0.0334008 -3.17253 1 0 1 1 0 0 +EDGE2 3725 3685 -0.0255481 0.0228125 -3.12916 1 0 1 1 0 0 +EDGE2 3725 3665 0.00947114 0.156239 -3.11528 1 0 1 1 0 0 +EDGE2 3725 3564 -0.891158 0.0140257 -0.00796626 1 0 1 1 0 0 +EDGE2 3725 3724 -0.998243 -0.0384219 -0.0117312 1 0 1 1 0 0 +EDGE2 3725 3565 -0.0506441 -0.0628516 -0.0129557 1 0 1 1 0 0 +EDGE2 3725 3646 -0.0258718 -1.01141 -1.58438 1 0 1 1 0 0 +EDGE2 3725 3666 -0.0146648 -0.988376 -1.55126 1 0 1 1 0 0 +EDGE2 3726 3725 -0.885657 -0.0263261 -1.59923 1 0 1 1 0 0 +EDGE2 3726 3687 1.01704 -0.00743147 0.00917479 1 0 1 1 0 0 +EDGE2 3726 3686 0.0429305 -0.0663998 -0.023286 1 0 1 1 0 0 +EDGE2 3726 3567 0.875001 0.0181393 0.0127737 1 0 1 1 0 0 +EDGE2 3726 3566 0.00231435 -0.00751439 0.0274097 1 0 1 1 0 0 +EDGE2 3726 3645 -1.01804 0.0156331 1.56085 1 0 1 1 0 0 +EDGE2 3726 3685 -0.999291 0.0363754 1.56231 1 0 1 1 0 0 +EDGE2 3726 3665 -0.97573 -0.0348144 1.55281 1 0 1 1 0 0 +EDGE2 3726 3565 -1.04174 0.0173429 -1.58381 1 0 1 1 0 0 +EDGE2 3727 3687 -0.0276139 0.0757917 0.0113495 1 0 1 1 0 0 +EDGE2 3727 3688 1.00138 0.0108999 0.0220732 1 0 1 1 0 0 +EDGE2 3727 3568 1.0157 -0.0360974 0.0115205 1 0 1 1 0 0 +EDGE2 3727 3686 -1.00565 0.00871919 -0.0227309 1 0 1 1 0 0 +EDGE2 3727 3726 -1.01687 0.00154796 -0.0126792 1 0 1 1 0 0 +EDGE2 3727 3567 0.0217599 0.0537197 -0.0235968 1 0 1 1 0 0 +EDGE2 3727 3566 -1.13093 0.0370887 0.00379659 1 0 1 1 0 0 +EDGE2 3728 3727 -0.937435 -0.0472078 -0.0173583 1 0 1 1 0 0 +EDGE2 3728 3687 -1.02844 -0.0437393 -0.00122366 1 0 1 1 0 0 +EDGE2 3728 3688 -0.0578036 -0.0594301 -0.0300129 1 0 1 1 0 0 +EDGE2 3728 3569 1.00085 -0.0817566 -0.0688737 1 0 1 1 0 0 +EDGE2 3728 3689 0.982815 -0.0181713 0.0166715 1 0 1 1 0 0 +EDGE2 3728 3568 -0.0397189 -0.0264117 0.0210496 1 0 1 1 0 0 +EDGE2 3728 3567 -0.993794 -0.0883221 -0.000126605 1 0 1 1 0 0 +EDGE2 3729 3728 -0.987286 0.00808664 -0.0208916 1 0 1 1 0 0 +EDGE2 3729 3590 0.998487 0.0294831 -3.15222 1 0 1 1 0 0 +EDGE2 3729 3690 0.954547 0.0512879 -0.0510842 1 0 1 1 0 0 +EDGE2 3729 2910 0.997783 -0.0335405 -3.12775 1 0 1 1 0 0 +EDGE2 3729 3570 1.05983 0.0824144 0.0042071 1 0 1 1 0 0 +EDGE2 3729 3688 -0.929424 -0.011863 0.00855248 1 0 1 1 0 0 +EDGE2 3729 3569 -0.0646832 0.00237714 -0.00394774 1 0 1 1 0 0 +EDGE2 3729 3689 -0.0234536 0.0144128 -0.0403536 1 0 1 1 0 0 +EDGE2 3729 3568 -0.937867 0.0310721 -0.00489948 1 0 1 1 0 0 +EDGE2 3730 3571 0.00684654 -1.01265 -1.54997 1 0 1 1 0 0 +EDGE2 3730 3591 -0.104542 -1.04458 -1.62148 1 0 1 1 0 0 +EDGE2 3730 2911 0.112482 -1.01333 -1.58184 1 0 1 1 0 0 +EDGE2 3730 3729 -1.05972 -0.000981092 0.017705 1 0 1 1 0 0 +EDGE2 3730 3590 -0.0157334 0.0965967 -3.15761 1 0 1 1 0 0 +EDGE2 3730 2909 0.961741 -0.0617784 -3.14678 1 0 1 1 0 0 +EDGE2 3730 3589 0.972285 0.0684143 -3.16433 1 0 1 1 0 0 +EDGE2 3730 3690 0.0508101 -0.0260476 -0.00903697 1 0 1 1 0 0 +EDGE2 3730 3691 -0.0285941 1.0196 1.57387 1 0 1 1 0 0 +EDGE2 3730 2910 -0.0617419 0.0501058 -3.14864 1 0 1 1 0 0 +EDGE2 3730 3570 0.0344848 0.0396974 -0.0244695 1 0 1 1 0 0 +EDGE2 3730 3569 -0.941528 0.00757092 -0.0102081 1 0 1 1 0 0 +EDGE2 3730 3689 -1.00106 0.0089895 -0.00692221 1 0 1 1 0 0 +EDGE2 3731 3571 -0.0458269 0.00388193 0.00589737 1 0 1 1 0 0 +EDGE2 3731 2912 0.916675 -0.00881394 -0.00622342 1 0 1 1 0 0 +EDGE2 3731 3592 0.986442 -0.00680688 0.0150505 1 0 1 1 0 0 +EDGE2 3731 3572 1.03694 0.0721986 0.0226312 1 0 1 1 0 0 +EDGE2 3731 3591 0.0040277 0.0319724 0.00758073 1 0 1 1 0 0 +EDGE2 3731 2911 0.00904903 0.0232623 -0.0153659 1 0 1 1 0 0 +EDGE2 3731 3730 -1.03616 -0.0630649 1.55999 1 0 1 1 0 0 +EDGE2 3731 3590 -0.997233 0.00474378 -1.55023 1 0 1 1 0 0 +EDGE2 3731 3690 -0.981329 0.00621296 1.58695 1 0 1 1 0 0 +EDGE2 3731 2910 -1.0768 -0.0165555 -1.58647 1 0 1 1 0 0 +EDGE2 3731 3570 -1.01226 0.0200071 1.58371 1 0 1 1 0 0 +EDGE2 3732 3571 -0.953297 -0.0539516 -0.0276861 1 0 1 1 0 0 +EDGE2 3732 2913 1.13162 -0.0355137 0.00630385 1 0 1 1 0 0 +EDGE2 3732 3593 1.03816 -0.0361506 0.0173438 1 0 1 1 0 0 +EDGE2 3732 3573 0.953015 -0.0325373 -0.000670619 1 0 1 1 0 0 +EDGE2 3732 2912 0.0365161 0.0528243 0.0152629 1 0 1 1 0 0 +EDGE2 3732 3592 0.128345 -0.0193303 -0.0284646 1 0 1 1 0 0 +EDGE2 3732 3572 0.0302261 0.00660285 -0.0404096 1 0 1 1 0 0 +EDGE2 3732 3731 -0.947067 0.00233653 -0.00143042 1 0 1 1 0 0 +EDGE2 3732 3591 -0.978713 -0.0295576 0.0267087 1 0 1 1 0 0 +EDGE2 3732 2911 -0.965132 0.0657794 -0.0164817 1 0 1 1 0 0 +EDGE2 3733 2913 -0.0675652 0.0197383 -0.00542759 1 0 1 1 0 0 +EDGE2 3733 2914 1.01149 0.0105671 0.0101427 1 0 1 1 0 0 +EDGE2 3733 3594 0.915791 0.0416158 0.0133722 1 0 1 1 0 0 +EDGE2 3733 3574 1.04484 -0.123747 0.018484 1 0 1 1 0 0 +EDGE2 3733 3593 -0.0574501 -0.0256854 0.0349186 1 0 1 1 0 0 +EDGE2 3733 3573 -0.0604489 0.00559154 -0.0136389 1 0 1 1 0 0 +EDGE2 3733 2912 -1.02895 -0.00824867 -0.013569 1 0 1 1 0 0 +EDGE2 3733 3592 -1.06128 0.134965 4.33283e-05 1 0 1 1 0 0 +EDGE2 3733 3732 -0.984626 -0.0412267 -0.0265677 1 0 1 1 0 0 +EDGE2 3733 3572 -0.988758 0.059354 -0.0379221 1 0 1 1 0 0 +EDGE2 3734 2915 1.15382 0.0105815 0.0279729 1 0 1 1 0 0 +EDGE2 3734 3595 0.999646 0.0165099 -0.00582851 1 0 1 1 0 0 +EDGE2 3734 3575 1.085 -0.0311461 0.00990993 1 0 1 1 0 0 +EDGE2 3734 2913 -1.01541 0.0717467 0.000951837 1 0 1 1 0 0 +EDGE2 3734 2914 -0.0483076 -0.0349672 -0.0197628 1 0 1 1 0 0 +EDGE2 3734 3594 -0.0376112 0.0567632 0.0103963 1 0 1 1 0 0 +EDGE2 3734 3574 0.0159374 0.0436045 -0.00708036 1 0 1 1 0 0 +EDGE2 3734 3593 -1.01252 0.0571398 0.00777317 1 0 1 1 0 0 +EDGE2 3734 3733 -0.957907 0.0160018 -0.010906 1 0 1 1 0 0 +EDGE2 3734 3573 -0.993665 -0.00369589 -0.0201325 1 0 1 1 0 0 +EDGE2 3735 2915 -0.0135229 -0.0719582 -0.0158243 1 0 1 1 0 0 +EDGE2 3735 2916 0.0316733 1.00521 1.56464 1 0 1 1 0 0 +EDGE2 3735 3576 0.0505062 1.00011 1.5675 1 0 1 1 0 0 +EDGE2 3735 3595 -0.0287545 0.0178942 0.0112727 1 0 1 1 0 0 +EDGE2 3735 3575 -0.00730569 -0.0025278 0.0310066 1 0 1 1 0 0 +EDGE2 3735 2914 -0.974819 -0.0829327 -0.00872328 1 0 1 1 0 0 +EDGE2 3735 3594 -0.961667 0.0214221 -0.0255761 1 0 1 1 0 0 +EDGE2 3735 3734 -0.997154 0.0117407 0.0188843 1 0 1 1 0 0 +EDGE2 3735 3574 -0.946519 -0.0449226 -0.0130653 1 0 1 1 0 0 +EDGE2 3735 3596 -0.0201314 -1.12771 -1.6064 1 0 1 1 0 0 +EDGE2 3736 3577 0.931183 0.0799167 -0.00348806 1 0 1 1 0 0 +EDGE2 3736 2915 -1.01562 0.0378128 -1.55304 1 0 1 1 0 0 +EDGE2 3736 2916 0.0770878 -0.0359526 0.0108544 1 0 1 1 0 0 +EDGE2 3736 2917 0.957127 -0.0334031 -0.0143956 1 0 1 1 0 0 +EDGE2 3736 3576 -0.0321476 0.00764552 0.0275348 1 0 1 1 0 0 +EDGE2 3736 3595 -0.952072 0.00499682 -1.57539 1 0 1 1 0 0 +EDGE2 3736 3735 -0.935493 -0.0423221 -1.57611 1 0 1 1 0 0 +EDGE2 3736 3575 -1.08138 -0.0376359 -1.57462 1 0 1 1 0 0 +EDGE2 3737 3577 0.112667 -0.0428812 -0.0129527 1 0 1 1 0 0 +EDGE2 3737 3578 0.999139 -0.105544 0.0107782 1 0 1 1 0 0 +EDGE2 3737 2918 0.989839 -0.0593072 0.00659894 1 0 1 1 0 0 +EDGE2 3737 2916 -0.975922 0.0582488 0.0173833 1 0 1 1 0 0 +EDGE2 3737 3736 -1.0094 -0.000840056 -0.00460207 1 0 1 1 0 0 +EDGE2 3737 2917 -0.0382414 -0.00735409 -0.0268075 1 0 1 1 0 0 +EDGE2 3737 3576 -0.98494 -0.0154396 -0.0265514 1 0 1 1 0 0 +EDGE2 3738 2919 0.979663 0.00848351 0.013084 1 0 1 1 0 0 +EDGE2 3738 3579 1.02318 -0.0615688 -0.0137187 1 0 1 1 0 0 +EDGE2 3738 3577 -0.912944 0.025401 -0.0281398 1 0 1 1 0 0 +EDGE2 3738 3578 -0.00112156 0.0364986 -0.031403 1 0 1 1 0 0 +EDGE2 3738 2918 0.0322014 -0.0103876 0.0223782 1 0 1 1 0 0 +EDGE2 3738 3737 -0.939166 -0.0867634 -0.00680329 1 0 1 1 0 0 +EDGE2 3738 2917 -0.951952 0.00305707 0.022638 1 0 1 1 0 0 +EDGE2 3739 2919 -0.0281353 0.0838397 0.0121051 1 0 1 1 0 0 +EDGE2 3739 2920 0.999585 -0.0444115 -0.0373275 1 0 1 1 0 0 +EDGE2 3739 3580 0.997991 -0.0302725 0.013235 1 0 1 1 0 0 +EDGE2 3739 3579 -0.00942519 -0.0271423 -0.0203092 1 0 1 1 0 0 +EDGE2 3739 3578 -1.01676 -0.0239637 0.000435107 1 0 1 1 0 0 +EDGE2 3739 3738 -0.910641 0.0432691 -0.0472225 1 0 1 1 0 0 +EDGE2 3739 2918 -1.0635 0.0151767 -0.00229511 1 0 1 1 0 0 +EDGE2 3740 2919 -0.918907 0.0512571 0.0355993 1 0 1 1 0 0 +EDGE2 3740 2921 -0.0390838 1.00792 1.5778 1 0 1 1 0 0 +EDGE2 3740 2920 -0.08098 -0.00399506 0.0012401 1 0 1 1 0 0 +EDGE2 3740 3580 -0.0120268 -0.036942 0.00469555 1 0 1 1 0 0 +EDGE2 3740 3581 -0.0341832 0.93188 1.56357 1 0 1 1 0 0 +EDGE2 3740 3739 -0.995399 0.0273288 0.0325809 1 0 1 1 0 0 +EDGE2 3740 3579 -0.983751 0.0329569 -0.0168096 1 0 1 1 0 0 +EDGE2 3741 3740 -0.992819 0.11454 -1.55763 1 0 1 1 0 0 +EDGE2 3741 3582 1.02604 -0.0973208 0.0092102 1 0 1 1 0 0 +EDGE2 3741 2921 -0.000560996 -0.0194428 0.0175245 1 0 1 1 0 0 +EDGE2 3741 2920 -1.05639 0.00611136 -1.56608 1 0 1 1 0 0 +EDGE2 3741 3580 -0.920328 0.0524864 -1.54814 1 0 1 1 0 0 +EDGE2 3741 3581 -0.0956096 0.0229389 0.0259269 1 0 1 1 0 0 +EDGE2 3741 2922 0.96652 -0.017136 0.0155363 1 0 1 1 0 0 +EDGE2 3742 3582 0.0252537 -0.0235947 -0.00720996 1 0 1 1 0 0 +EDGE2 3742 2921 -1.03819 0.00196612 -0.000280846 1 0 1 1 0 0 +EDGE2 3742 3741 -0.981287 -0.0452905 0.0139879 1 0 1 1 0 0 +EDGE2 3742 3581 -1.06462 0.00877668 -0.00638036 1 0 1 1 0 0 +EDGE2 3742 3583 0.926819 -0.033067 -0.035208 1 0 1 1 0 0 +EDGE2 3742 2922 -0.0436271 0.0242232 0.0140661 1 0 1 1 0 0 +EDGE2 3742 2923 1.0294 -0.0590966 -0.0124723 1 0 1 1 0 0 +EDGE2 3743 3582 -0.964188 -0.0915538 -0.0142519 1 0 1 1 0 0 +EDGE2 3743 3742 -0.9184 0.0218074 -0.0178168 1 0 1 1 0 0 +EDGE2 3743 3583 0.000408021 -0.018053 -0.0081058 1 0 1 1 0 0 +EDGE2 3743 2922 -0.956574 0.108241 0.0165708 1 0 1 1 0 0 +EDGE2 3743 2923 0.0232343 0.0157704 -0.00332266 1 0 1 1 0 0 +EDGE2 3743 2924 1.03948 -0.0253391 -0.00224614 1 0 1 1 0 0 +EDGE2 3743 3584 1.01936 0.0433368 0.0171632 1 0 1 1 0 0 +EDGE2 3744 3583 -1.03514 -0.0426926 -0.0150359 1 0 1 1 0 0 +EDGE2 3744 3743 -1.03325 -0.017826 0.0179594 1 0 1 1 0 0 +EDGE2 3744 2923 -0.988488 -0.0142724 -0.00969368 1 0 1 1 0 0 +EDGE2 3744 2924 0.141909 -0.0161015 0.0145873 1 0 1 1 0 0 +EDGE2 3744 3584 -0.0537863 -0.0426278 0.00317473 1 0 1 1 0 0 +EDGE2 3744 3585 0.9694 0.0405274 0.0295062 1 0 1 1 0 0 +EDGE2 3744 2905 1.03396 0.0402445 -3.14716 1 0 1 1 0 0 +EDGE2 3744 2925 0.949162 -0.0465299 0.00514559 1 0 1 1 0 0 +EDGE2 3744 2945 1.01873 -0.00871802 -3.13604 1 0 1 1 0 0 +EDGE2 3745 3744 -0.973277 -0.00268447 -0.0112935 1 0 1 1 0 0 +EDGE2 3745 2924 -0.932815 -0.0531458 -0.000481099 1 0 1 1 0 0 +EDGE2 3745 3584 -0.960266 -0.00702293 0.000630538 1 0 1 1 0 0 +EDGE2 3745 2904 0.970764 0.00446654 -3.13533 1 0 1 1 0 0 +EDGE2 3745 3585 -0.0360289 -0.0233728 0.0196836 1 0 1 1 0 0 +EDGE2 3745 2946 0.0293438 -0.968913 -1.54227 1 0 1 1 0 0 +EDGE2 3745 2926 0.0211195 -1.00158 -1.58348 1 0 1 1 0 0 +EDGE2 3745 2905 -0.0429141 -0.0199135 -3.122 1 0 1 1 0 0 +EDGE2 3745 2925 -0.0823285 0.0390093 0.0385143 1 0 1 1 0 0 +EDGE2 3745 2945 -0.0347021 0.0378042 -3.16088 1 0 1 1 0 0 +EDGE2 3745 2944 1.01545 -0.034134 -3.14969 1 0 1 1 0 0 +EDGE2 3745 2906 -0.0265586 1.03833 1.58369 1 0 1 1 0 0 +EDGE2 3745 3586 -0.0341818 0.984593 1.5738 1 0 1 1 0 0 +EDGE2 3746 3745 -1.0338 0.0905889 -1.5787 1 0 1 1 0 0 +EDGE2 3746 3585 -1.02765 0.0345887 -1.5907 1 0 1 1 0 0 +EDGE2 3746 2905 -0.887075 -0.0353847 1.54986 1 0 1 1 0 0 +EDGE2 3746 2925 -0.960694 0.0229988 -1.57811 1 0 1 1 0 0 +EDGE2 3746 2945 -1.05354 -0.0185315 1.56984 1 0 1 1 0 0 +EDGE2 3746 3587 1.05094 -0.00678212 -0.00080879 1 0 1 1 0 0 +EDGE2 3746 2906 0.000888015 0.0432636 0.0459609 1 0 1 1 0 0 +EDGE2 3746 3586 0.035743 0.0436971 -0.00584461 1 0 1 1 0 0 +EDGE2 3746 2907 0.95806 -0.0485861 0.00813844 1 0 1 1 0 0 +EDGE2 3747 3746 -1.01696 -0.0461155 0.00746644 1 0 1 1 0 0 +EDGE2 3747 3588 1.06858 0.0114061 -0.0300466 1 0 1 1 0 0 +EDGE2 3747 3587 0.0469138 -0.0713213 0.0120154 1 0 1 1 0 0 +EDGE2 3747 2906 -1.01286 0.0726054 0.00866881 1 0 1 1 0 0 +EDGE2 3747 3586 -0.925988 0.0373749 0.012779 1 0 1 1 0 0 +EDGE2 3747 2907 -0.02043 -0.0637863 0.0207305 1 0 1 1 0 0 +EDGE2 3747 2908 1.02224 0.109119 -0.001619 1 0 1 1 0 0 +EDGE2 3748 3747 -1.03417 -0.0244039 -0.000195166 1 0 1 1 0 0 +EDGE2 3748 3588 0.030072 -0.0595139 0.0226325 1 0 1 1 0 0 +EDGE2 3748 3587 -0.997431 -0.00883289 0.00815174 1 0 1 1 0 0 +EDGE2 3748 2907 -1.06242 -0.0361145 0.00690347 1 0 1 1 0 0 +EDGE2 3748 2909 1.01247 -0.0158096 -0.0195571 1 0 1 1 0 0 +EDGE2 3748 3589 0.961426 0.0292636 -0.0343914 1 0 1 1 0 0 +EDGE2 3748 2908 0.0237091 -0.0505906 0.00930798 1 0 1 1 0 0 +EDGE2 3749 3748 -1.02247 0.12507 0.000553697 1 0 1 1 0 0 +EDGE2 3749 3730 0.964743 -0.0346647 -3.1436 1 0 1 1 0 0 +EDGE2 3749 3590 0.931792 0.0210837 -0.04961 1 0 1 1 0 0 +EDGE2 3749 3588 -0.981497 0.0472649 -0.0132049 1 0 1 1 0 0 +EDGE2 3749 2909 -0.0157736 0.0533849 -0.00339163 1 0 1 1 0 0 +EDGE2 3749 3589 -0.0223234 0.00871199 0.0254393 1 0 1 1 0 0 +EDGE2 3749 2908 -1.01579 -0.092575 -0.0291183 1 0 1 1 0 0 +EDGE2 3749 3690 1.02544 0.0493494 -3.12251 1 0 1 1 0 0 +EDGE2 3749 2910 0.989045 -0.0271778 0.00171249 1 0 1 1 0 0 +EDGE2 3749 3570 1.06377 0.00382811 -3.12927 1 0 1 1 0 0 +EDGE2 3750 3571 0.00172193 0.991665 1.54823 1 0 1 1 0 0 +EDGE2 3750 3749 -1.1351 0.0544389 -0.0243922 1 0 1 1 0 0 +EDGE2 3750 3731 -0.0209163 1.02586 1.58424 1 0 1 1 0 0 +EDGE2 3750 3591 -0.035826 1.058 1.56685 1 0 1 1 0 0 +EDGE2 3750 2911 0.0358965 1.11394 1.55887 1 0 1 1 0 0 +EDGE2 3750 3730 0.0206312 0.000354607 -3.1481 1 0 1 1 0 0 +EDGE2 3750 3729 0.971682 -0.112595 -3.17566 1 0 1 1 0 0 +EDGE2 3750 3590 0.108729 0.0445219 -0.0285969 1 0 1 1 0 0 +EDGE2 3750 2909 -0.997689 0.0189441 -0.014714 1 0 1 1 0 0 +EDGE2 3750 3589 -1.07949 0.113611 -0.0389967 1 0 1 1 0 0 +EDGE2 3750 3690 0.0593125 -0.0427072 -3.12951 1 0 1 1 0 0 +EDGE2 3750 3691 0.0529121 -1.00508 -1.57009 1 0 1 1 0 0 +EDGE2 3750 2910 -0.0596506 0.00162399 -0.0387088 1 0 1 1 0 0 +EDGE2 3750 3570 0.0145198 0.0358227 -3.18229 1 0 1 1 0 0 +EDGE2 3750 3569 0.982341 0.0731404 -3.16812 1 0 1 1 0 0 +EDGE2 3750 3689 1.02549 0.0545429 -3.18206 1 0 1 1 0 0 +EDGE2 3751 3571 0.0278954 0.065923 0.0133871 1 0 1 1 0 0 +EDGE2 3751 2912 0.978419 -0.00592372 0.00399583 1 0 1 1 0 0 +EDGE2 3751 3592 1.03496 -0.0276795 -0.0324602 1 0 1 1 0 0 +EDGE2 3751 3732 0.949974 0.0960554 0.0191553 1 0 1 1 0 0 +EDGE2 3751 3572 1.05613 -0.0137377 -0.00293446 1 0 1 1 0 0 +EDGE2 3751 3731 -0.0226558 0.0379395 0.0180789 1 0 1 1 0 0 +EDGE2 3751 3591 -0.0960077 -0.00142499 0.0067386 1 0 1 1 0 0 +EDGE2 3751 3750 -1.09459 -0.011267 -1.53528 1 0 1 1 0 0 +EDGE2 3751 2911 -0.00644259 -0.0476162 0.00110991 1 0 1 1 0 0 +EDGE2 3751 3730 -1.03662 -0.0339253 1.59801 1 0 1 1 0 0 +EDGE2 3751 3590 -1.07587 0.0215427 -1.60965 1 0 1 1 0 0 +EDGE2 3751 3690 -0.978005 -0.0540135 1.56801 1 0 1 1 0 0 +EDGE2 3751 2910 -0.941453 -0.0511448 -1.56017 1 0 1 1 0 0 +EDGE2 3751 3570 -1.04538 -0.0248532 1.58044 1 0 1 1 0 0 +EDGE2 3752 3571 -0.913354 0.0719005 -0.0034463 1 0 1 1 0 0 +EDGE2 3752 2913 0.940791 0.0651631 0.0175887 1 0 1 1 0 0 +EDGE2 3752 3593 1.01398 -0.0305325 -0.0165211 1 0 1 1 0 0 +EDGE2 3752 3733 1.0235 0.00310482 -0.0199581 1 0 1 1 0 0 +EDGE2 3752 3573 1.0392 -0.00232294 -0.00268911 1 0 1 1 0 0 +EDGE2 3752 2912 0.0626955 -0.0665442 0.0173768 1 0 1 1 0 0 +EDGE2 3752 3592 0.0715369 -0.0350597 -0.0456756 1 0 1 1 0 0 +EDGE2 3752 3732 -0.0297398 0.0497544 -0.0206111 1 0 1 1 0 0 +EDGE2 3752 3572 -0.00741866 -0.104909 0.0111071 1 0 1 1 0 0 +EDGE2 3752 3731 -1.00021 -0.0563549 -0.000572985 1 0 1 1 0 0 +EDGE2 3752 3751 -1.09747 0.0152063 -0.0274175 1 0 1 1 0 0 +EDGE2 3752 3591 -1.00502 0.0126902 -0.0381972 1 0 1 1 0 0 +EDGE2 3752 2911 -1.0148 -0.0106313 0.00605544 1 0 1 1 0 0 +EDGE2 3753 2913 0.0436012 -0.0157979 -0.0227974 1 0 1 1 0 0 +EDGE2 3753 2914 1.0354 -0.00557612 0.00776796 1 0 1 1 0 0 +EDGE2 3753 3594 1.00968 0.0282924 0.0199117 1 0 1 1 0 0 +EDGE2 3753 3734 1.01685 0.0576885 0.0132984 1 0 1 1 0 0 +EDGE2 3753 3574 0.904903 0.0519387 -0.0248121 1 0 1 1 0 0 +EDGE2 3753 3593 -0.0452827 0.0832086 -0.0122699 1 0 1 1 0 0 +EDGE2 3753 3733 -0.0370151 -0.00503578 0.0150335 1 0 1 1 0 0 +EDGE2 3753 3573 0.145887 -0.0260057 -0.00276473 1 0 1 1 0 0 +EDGE2 3753 2912 -0.918529 0.0169051 0.000294799 1 0 1 1 0 0 +EDGE2 3753 3592 -1.05669 -0.0526969 0.00680892 1 0 1 1 0 0 +EDGE2 3753 3732 -1.06668 -0.00545981 0.00872782 1 0 1 1 0 0 +EDGE2 3753 3752 -0.998263 0.00470086 0.0173317 1 0 1 1 0 0 +EDGE2 3753 3572 -0.952761 -0.00471632 0.00684689 1 0 1 1 0 0 +EDGE2 3754 2915 0.945481 0.0140535 0.0198179 1 0 1 1 0 0 +EDGE2 3754 3595 1.03418 0.0722437 0.0241302 1 0 1 1 0 0 +EDGE2 3754 3735 0.970908 -0.046258 -0.00333342 1 0 1 1 0 0 +EDGE2 3754 3575 0.991669 0.0184763 0.00177908 1 0 1 1 0 0 +EDGE2 3754 2913 -0.989894 -0.0464214 -0.0151576 1 0 1 1 0 0 +EDGE2 3754 2914 0.00727371 0.00468813 -0.00239024 1 0 1 1 0 0 +EDGE2 3754 3594 0.0177619 -0.0463204 0.0225994 1 0 1 1 0 0 +EDGE2 3754 3734 0.0353646 0.0362293 0.0236032 1 0 1 1 0 0 +EDGE2 3754 3574 -0.108618 -0.0100208 0.0149611 1 0 1 1 0 0 +EDGE2 3754 3593 -1.02756 -0.0191799 -0.0146212 1 0 1 1 0 0 +EDGE2 3754 3733 -0.948377 0.0346284 0.0138162 1 0 1 1 0 0 +EDGE2 3754 3753 -1.00314 0.0116864 0.00284485 1 0 1 1 0 0 +EDGE2 3754 3573 -0.961777 -0.000595466 -0.00680144 1 0 1 1 0 0 +EDGE2 3755 2915 0.0235199 -0.0279902 0.0327528 1 0 1 1 0 0 +EDGE2 3755 2916 -0.0848196 1.0955 1.55155 1 0 1 1 0 0 +EDGE2 3755 3736 0.027701 1.04378 1.55403 1 0 1 1 0 0 +EDGE2 3755 3576 -0.00224264 1.00925 1.55277 1 0 1 1 0 0 +EDGE2 3755 3595 -0.0245825 -0.0332833 0.00973616 1 0 1 1 0 0 +EDGE2 3755 3735 -0.0442619 -0.0428482 0.0209736 1 0 1 1 0 0 +EDGE2 3755 3575 0.00635199 -0.114053 -0.0291438 1 0 1 1 0 0 +EDGE2 3755 2914 -0.884182 0.0434435 -0.00299789 1 0 1 1 0 0 +EDGE2 3755 3594 -0.996798 -0.0633012 -0.0363879 1 0 1 1 0 0 +EDGE2 3755 3734 -0.902612 -0.0226327 -0.0246774 1 0 1 1 0 0 +EDGE2 3755 3754 -0.990995 -0.0382822 0.0197332 1 0 1 1 0 0 +EDGE2 3755 3574 -1.01047 -0.0805374 0.016421 1 0 1 1 0 0 +EDGE2 3755 3596 0.0151491 -0.952631 -1.58415 1 0 1 1 0 0 +EDGE2 3756 2915 -1.02701 0.00919758 1.59039 1 0 1 1 0 0 +EDGE2 3756 3595 -1.01938 -0.0295574 1.59092 1 0 1 1 0 0 +EDGE2 3756 3735 -1.00923 -0.00420296 1.59361 1 0 1 1 0 0 +EDGE2 3756 3755 -1.08383 0.00482118 1.55574 1 0 1 1 0 0 +EDGE2 3756 3575 -0.974694 0.0160291 1.57891 1 0 1 1 0 0 +EDGE2 3756 3597 0.973261 -0.036993 -0.0280561 1 0 1 1 0 0 +EDGE2 3756 3596 0.0571682 -0.0180969 0.00451732 1 0 1 1 0 0 +EDGE2 3757 3597 -0.0721304 -0.0501128 0.0245731 1 0 1 1 0 0 +EDGE2 3757 3596 -1.04136 0.0284158 -0.0209191 1 0 1 1 0 0 +EDGE2 3757 3756 -1.01827 -0.105762 0.0219001 1 0 1 1 0 0 +EDGE2 3757 3598 1.00902 0.0423872 -0.0202532 1 0 1 1 0 0 +EDGE2 3758 3597 -1.03249 -0.089125 0.0509194 1 0 1 1 0 0 +EDGE2 3758 3757 -0.979144 0.0658628 -0.0030814 1 0 1 1 0 0 +EDGE2 3758 3598 -0.0206224 -0.0700485 0.0153881 1 0 1 1 0 0 +EDGE2 3758 3599 0.901469 -0.0602366 0.0253371 1 0 1 1 0 0 +EDGE2 3759 3598 -1.00714 -0.0987977 0.00634195 1 0 1 1 0 0 +EDGE2 3759 3758 -0.937441 0.0585398 -0.0235379 1 0 1 1 0 0 +EDGE2 3759 3599 -0.109256 0.0105488 -0.0227712 1 0 1 1 0 0 +EDGE2 3759 3680 1.02778 0.0357699 -3.13492 1 0 1 1 0 0 +EDGE2 3759 3600 1.03925 -0.07672 -0.001095 1 0 1 1 0 0 +EDGE2 3759 3640 1.06279 -0.0512807 -3.16531 1 0 1 1 0 0 +EDGE2 3759 3660 0.973077 0.00420061 -3.15013 1 0 1 1 0 0 +EDGE2 3760 3599 -0.958621 -0.0178889 0.0187393 1 0 1 1 0 0 +EDGE2 3760 3759 -0.937061 0.110464 -0.0200302 1 0 1 1 0 0 +EDGE2 3760 3680 -0.0320739 -0.107309 -3.13632 1 0 1 1 0 0 +EDGE2 3760 3601 0.0197147 0.997233 1.59623 1 0 1 1 0 0 +EDGE2 3760 3600 0.00155495 -0.115807 0.0200092 1 0 1 1 0 0 +EDGE2 3760 3640 0.0253039 -0.0503484 -3.14473 1 0 1 1 0 0 +EDGE2 3760 3660 0.0258802 0.00344029 -3.14705 1 0 1 1 0 0 +EDGE2 3760 3641 -0.0192708 -0.940772 -1.58099 1 0 1 1 0 0 +EDGE2 3760 3661 -0.0349277 -1.05209 -1.59482 1 0 1 1 0 0 +EDGE2 3760 3681 0.0102391 -0.97658 -1.55671 1 0 1 1 0 0 +EDGE2 3760 3659 0.92476 -0.0114811 -3.15383 1 0 1 1 0 0 +EDGE2 3760 3679 0.936961 -0.0218046 -3.09408 1 0 1 1 0 0 +EDGE2 3760 3639 1.00702 0.030365 -3.14825 1 0 1 1 0 0 +EDGE2 3761 3680 -0.925362 0.0841578 -1.58999 1 0 1 1 0 0 +EDGE2 3761 3760 -0.994085 -0.0250984 1.56391 1 0 1 1 0 0 +EDGE2 3761 3600 -0.942702 -0.0410773 1.55653 1 0 1 1 0 0 +EDGE2 3761 3640 -1.02766 0.00416528 -1.58604 1 0 1 1 0 0 +EDGE2 3761 3660 -1.01959 -0.0345544 -1.57581 1 0 1 1 0 0 +EDGE2 3761 3641 0.00615414 0.0525522 -0.00545684 1 0 1 1 0 0 +EDGE2 3761 3661 -0.0210421 0.0719781 0.0427241 1 0 1 1 0 0 +EDGE2 3761 3681 -0.0512129 -0.00221904 -0.0142109 1 0 1 1 0 0 +EDGE2 3761 3642 0.966143 -0.0264341 -0.0125823 1 0 1 1 0 0 +EDGE2 3761 3662 0.861635 0.105654 0.0127239 1 0 1 1 0 0 +EDGE2 3761 3682 1.01514 -0.0186898 0.0194582 1 0 1 1 0 0 +EDGE2 3762 3761 -0.949237 0.0012011 -0.0145313 1 0 1 1 0 0 +EDGE2 3762 3641 -0.980964 0.00973498 -0.0244061 1 0 1 1 0 0 +EDGE2 3762 3661 -1.11569 -0.0213881 -0.012293 1 0 1 1 0 0 +EDGE2 3762 3681 -0.966408 0.00975596 -0.0216085 1 0 1 1 0 0 +EDGE2 3762 3642 -0.00476098 0.0698881 0.00784664 1 0 1 1 0 0 +EDGE2 3762 3662 -0.00675038 -0.146402 0.00526809 1 0 1 1 0 0 +EDGE2 3762 3682 -0.0435755 0.07806 0.0214844 1 0 1 1 0 0 +EDGE2 3762 3663 1.03683 0.0353454 0.00420723 1 0 1 1 0 0 +EDGE2 3762 3683 0.957426 0.049158 0.00277476 1 0 1 1 0 0 +EDGE2 3762 3643 1.02902 -0.0228384 -0.0183141 1 0 1 1 0 0 +EDGE2 3763 3762 -1.04529 -0.00865046 -0.0124415 1 0 1 1 0 0 +EDGE2 3763 3642 -1.01812 -0.0376906 -0.0178109 1 0 1 1 0 0 +EDGE2 3763 3662 -1.00175 -0.000113093 -0.0365721 1 0 1 1 0 0 +EDGE2 3763 3682 -1.08591 -0.074904 0.051802 1 0 1 1 0 0 +EDGE2 3763 3663 0.0151445 -0.0209209 -0.0260407 1 0 1 1 0 0 +EDGE2 3763 3683 0.00442927 -0.0142761 -0.0199134 1 0 1 1 0 0 +EDGE2 3763 3643 0.0349856 -0.0252495 -0.0239874 1 0 1 1 0 0 +EDGE2 3763 3664 1.04185 -0.0478352 0.0299553 1 0 1 1 0 0 +EDGE2 3763 3684 1.02244 0.0793242 -0.00720929 1 0 1 1 0 0 +EDGE2 3763 3644 1.02767 -0.0880731 -0.00798645 1 0 1 1 0 0 +EDGE2 3764 3763 -1.03407 -0.0534644 -0.00083734 1 0 1 1 0 0 +EDGE2 3764 3663 -1.00302 -0.0260354 -0.0209566 1 0 1 1 0 0 +EDGE2 3764 3683 -1.02994 -0.0118207 0.00638527 1 0 1 1 0 0 +EDGE2 3764 3643 -1.01493 0.000264789 -0.000705695 1 0 1 1 0 0 +EDGE2 3764 3664 -0.0248198 0.11529 0.0376577 1 0 1 1 0 0 +EDGE2 3764 3684 -0.0621475 0.0706172 0.0103631 1 0 1 1 0 0 +EDGE2 3764 3644 -0.112347 -0.00317053 -0.00267107 1 0 1 1 0 0 +EDGE2 3764 3725 1.03989 0.0152019 -3.12899 1 0 1 1 0 0 +EDGE2 3764 3645 0.946785 -0.104369 0.00213996 1 0 1 1 0 0 +EDGE2 3764 3685 1.07041 -0.00954956 -0.0181884 1 0 1 1 0 0 +EDGE2 3764 3665 0.967294 0.099786 -0.0222583 1 0 1 1 0 0 +EDGE2 3764 3565 1.00423 0.00503856 -3.13062 1 0 1 1 0 0 +EDGE2 3765 3664 -0.89422 0.0176712 0.0193612 1 0 1 1 0 0 +EDGE2 3765 3684 -0.890008 -0.0079357 -0.0198793 1 0 1 1 0 0 +EDGE2 3765 3764 -1.03576 -0.0485255 -0.0163619 1 0 1 1 0 0 +EDGE2 3765 3644 -0.901835 0.00339397 0.0034912 1 0 1 1 0 0 +EDGE2 3765 3725 0.0601967 -0.0573353 -3.1127 1 0 1 1 0 0 +EDGE2 3765 3686 -0.00138047 -0.942764 -1.58275 1 0 1 1 0 0 +EDGE2 3765 3726 -0.0313511 -0.993784 -1.5655 1 0 1 1 0 0 +EDGE2 3765 3566 0.0241713 -0.990546 -1.58467 1 0 1 1 0 0 +EDGE2 3765 3645 0.0592931 0.106551 0.0198864 1 0 1 1 0 0 +EDGE2 3765 3685 0.14328 -0.0536294 -0.0105087 1 0 1 1 0 0 +EDGE2 3765 3665 -0.0437279 0.0673963 -0.0197238 1 0 1 1 0 0 +EDGE2 3765 3564 0.971504 0.0406416 -3.15289 1 0 1 1 0 0 +EDGE2 3765 3724 1.00983 -0.0102701 -3.11974 1 0 1 1 0 0 +EDGE2 3765 3565 -0.0287793 0.0940618 -3.1059 1 0 1 1 0 0 +EDGE2 3765 3646 0.0945282 0.984888 1.58352 1 0 1 1 0 0 +EDGE2 3765 3666 -0.0854255 0.986066 1.59211 1 0 1 1 0 0 +EDGE2 3766 3727 1.06435 -0.0162223 0.0185899 1 0 1 1 0 0 +EDGE2 3766 3765 -0.971713 -0.00839236 1.57868 1 0 1 1 0 0 +EDGE2 3766 3725 -1.02316 0.0223046 -1.60329 1 0 1 1 0 0 +EDGE2 3766 3687 1.02372 -0.0166622 0.000134127 1 0 1 1 0 0 +EDGE2 3766 3686 -0.0629044 0.0274936 0.00384249 1 0 1 1 0 0 +EDGE2 3766 3726 0.0124671 0.0778972 0.0213059 1 0 1 1 0 0 +EDGE2 3766 3567 1.03487 0.0229879 -0.0164055 1 0 1 1 0 0 +EDGE2 3766 3566 -0.0591619 -0.0138341 0.00141505 1 0 1 1 0 0 +EDGE2 3766 3645 -0.946307 0.111135 1.60298 1 0 1 1 0 0 +EDGE2 3766 3685 -0.995754 -0.0164209 1.59209 1 0 1 1 0 0 +EDGE2 3766 3665 -1.01842 0.071795 1.57937 1 0 1 1 0 0 +EDGE2 3766 3565 -0.987807 -0.0123502 -1.58213 1 0 1 1 0 0 +EDGE2 3767 3727 -0.021617 -0.0340825 -0.0159746 1 0 1 1 0 0 +EDGE2 3767 3728 0.984591 -0.0143425 0.0126583 1 0 1 1 0 0 +EDGE2 3767 3766 -0.90371 0.0228718 0.00283868 1 0 1 1 0 0 +EDGE2 3767 3687 0.0650487 -0.00331519 0.0131619 1 0 1 1 0 0 +EDGE2 3767 3688 0.946748 0.00542634 0.0187437 1 0 1 1 0 0 +EDGE2 3767 3568 0.999562 -0.025258 0.00277128 1 0 1 1 0 0 +EDGE2 3767 3686 -0.930151 -0.0434954 -0.0036162 1 0 1 1 0 0 +EDGE2 3767 3726 -0.939437 -0.00959225 0.0106414 1 0 1 1 0 0 +EDGE2 3767 3567 -0.0758353 0.0708427 -0.011245 1 0 1 1 0 0 +EDGE2 3767 3566 -0.980786 0.024229 -0.00564439 1 0 1 1 0 0 +EDGE2 3768 3727 -0.918863 0.017309 0.00261128 1 0 1 1 0 0 +EDGE2 3768 3729 0.971552 0.0485954 0.00684409 1 0 1 1 0 0 +EDGE2 3768 3767 -1.04768 -0.045933 0.00821377 1 0 1 1 0 0 +EDGE2 3768 3728 -0.07061 0.030687 -0.0155291 1 0 1 1 0 0 +EDGE2 3768 3687 -0.915727 -0.123938 0.0164492 1 0 1 1 0 0 +EDGE2 3768 3688 -0.048822 -0.0723823 0.0174601 1 0 1 1 0 0 +EDGE2 3768 3569 0.999029 -0.00600537 0.00171686 1 0 1 1 0 0 +EDGE2 3768 3689 1.03314 -0.0648432 -0.0289225 1 0 1 1 0 0 +EDGE2 3768 3568 -0.0384246 -0.0669099 0.0126513 1 0 1 1 0 0 +EDGE2 3768 3567 -0.923374 0.106385 -0.0122121 1 0 1 1 0 0 +EDGE2 3769 3750 1.05491 -0.0407584 -3.12568 1 0 1 1 0 0 +EDGE2 3769 3730 0.958781 0.0320383 0.0109028 1 0 1 1 0 0 +EDGE2 3769 3729 0.0211816 -0.0479576 -0.0181367 1 0 1 1 0 0 +EDGE2 3769 3728 -0.980517 0.0278622 0.00054851 1 0 1 1 0 0 +EDGE2 3769 3768 -1.00542 -0.0832244 0.0162573 1 0 1 1 0 0 +EDGE2 3769 3590 1.07399 -0.0448751 -3.16422 1 0 1 1 0 0 +EDGE2 3769 3690 0.964153 0.156092 0.0190371 1 0 1 1 0 0 +EDGE2 3769 2910 1.07502 -0.09883 -3.16935 1 0 1 1 0 0 +EDGE2 3769 3570 0.955254 0.077837 -0.025531 1 0 1 1 0 0 +EDGE2 3769 3688 -1.03623 0.00543199 -0.0296179 1 0 1 1 0 0 +EDGE2 3769 3569 0.0212218 0.0486869 0.007888 1 0 1 1 0 0 +EDGE2 3769 3689 0.0366072 -0.0478319 -0.0106985 1 0 1 1 0 0 +EDGE2 3769 3568 -0.973228 0.0803346 -0.00553461 1 0 1 1 0 0 +EDGE2 3770 3571 -0.0690552 -1.01308 -1.58483 1 0 1 1 0 0 +EDGE2 3770 3749 1.08735 -0.0142412 -3.14234 1 0 1 1 0 0 +EDGE2 3770 3731 0.00471836 -1.04485 -1.54138 1 0 1 1 0 0 +EDGE2 3770 3751 -0.0232472 -0.983975 -1.53581 1 0 1 1 0 0 +EDGE2 3770 3591 -0.0903294 -1.07743 -1.53713 1 0 1 1 0 0 +EDGE2 3770 3769 -0.992523 -0.0595647 -0.0478007 1 0 1 1 0 0 +EDGE2 3770 3750 0.0846731 0.0153836 -3.13789 1 0 1 1 0 0 +EDGE2 3770 2911 -0.004733 -0.997784 -1.58403 1 0 1 1 0 0 +EDGE2 3770 3730 0.000663995 -0.079033 -0.0249558 1 0 1 1 0 0 +EDGE2 3770 3729 -0.928253 0.0309544 0.0300355 1 0 1 1 0 0 +EDGE2 3770 3590 0.0744767 0.0597479 -3.10425 1 0 1 1 0 0 +EDGE2 3770 2909 1.06338 -0.0412019 -3.17189 1 0 1 1 0 0 +EDGE2 3770 3589 1.01347 -0.0204949 -3.12929 1 0 1 1 0 0 +EDGE2 3770 3690 -0.0713652 -0.0367059 -0.00722686 1 0 1 1 0 0 +EDGE2 3770 3691 0.0081921 1.05699 1.57947 1 0 1 1 0 0 +EDGE2 3770 2910 0.0353444 -0.0441194 -3.11403 1 0 1 1 0 0 +EDGE2 3770 3570 0.0280868 -0.0288178 0.0210926 1 0 1 1 0 0 +EDGE2 3770 3569 -1.03599 -0.0704848 0.0154795 1 0 1 1 0 0 +EDGE2 3770 3689 -1.04658 0.0189887 0.0139673 1 0 1 1 0 0 +EDGE2 3771 3750 -0.989139 0.0179032 1.5927 1 0 1 1 0 0 +EDGE2 3771 3770 -1.05819 -0.15597 -1.61134 1 0 1 1 0 0 +EDGE2 3771 3730 -0.995332 -0.0652822 -1.55992 1 0 1 1 0 0 +EDGE2 3771 3590 -0.952503 -0.0416655 1.57703 1 0 1 1 0 0 +EDGE2 3771 3690 -0.976368 0.069528 -1.5471 1 0 1 1 0 0 +EDGE2 3771 3691 -0.0553561 0.0472389 -0.00330761 1 0 1 1 0 0 +EDGE2 3771 2910 -0.901074 -0.0192586 1.53898 1 0 1 1 0 0 +EDGE2 3771 3570 -1.0026 0.0401484 -1.58893 1 0 1 1 0 0 +EDGE2 3771 3692 1.06089 -0.0989115 0.00142821 1 0 1 1 0 0 +EDGE2 3772 3693 0.967424 0.082634 0.0216829 1 0 1 1 0 0 +EDGE2 3772 3691 -1.02934 -0.00423586 -0.0184896 1 0 1 1 0 0 +EDGE2 3772 3771 -1.00892 0.00157177 0.0149782 1 0 1 1 0 0 +EDGE2 3772 3692 0.030834 -0.05123 0.00506174 1 0 1 1 0 0 +EDGE2 3773 3693 0.0240802 -0.0587764 0.0332708 1 0 1 1 0 0 +EDGE2 3773 3692 -0.964533 -0.0695306 -0.00336098 1 0 1 1 0 0 +EDGE2 3773 3772 -0.99937 -0.0140582 -0.0220902 1 0 1 1 0 0 +EDGE2 3773 3694 0.955236 -0.0471745 0.0105679 1 0 1 1 0 0 +EDGE2 3774 3693 -0.94139 0.0356269 -0.006712 1 0 1 1 0 0 +EDGE2 3774 3773 -1.0092 -0.00979345 0.0228446 1 0 1 1 0 0 +EDGE2 3774 3694 -0.0111767 0.113214 -0.0346669 1 0 1 1 0 0 +EDGE2 3774 3695 1.03189 0.110126 0.0113949 1 0 1 1 0 0 +EDGE2 3774 3555 1.07258 -0.0277498 -3.11741 1 0 1 1 0 0 +EDGE2 3775 3694 -1.02306 -0.0173213 -0.00709624 1 0 1 1 0 0 +EDGE2 3775 3774 -1.00365 -0.0601123 -0.0148121 1 0 1 1 0 0 +EDGE2 3775 3696 -0.0442797 0.971279 1.56335 1 0 1 1 0 0 +EDGE2 3775 3554 0.88447 -0.0485276 -3.14738 1 0 1 1 0 0 +EDGE2 3775 3695 0.0328184 0.00136239 -0.0198623 1 0 1 1 0 0 +EDGE2 3775 3555 0.0409542 -0.0393271 -3.1192 1 0 1 1 0 0 +EDGE2 3775 3556 0.0191777 0.951451 1.56708 1 0 1 1 0 0 +EDGE2 3776 3696 -0.019801 -0.091544 0.0114599 1 0 1 1 0 0 +EDGE2 3776 3695 -1.02013 0.0387934 -1.56277 1 0 1 1 0 0 +EDGE2 3776 3775 -1.09473 -0.00406912 -1.58508 1 0 1 1 0 0 +EDGE2 3776 3555 -0.983792 -0.0133093 1.55289 1 0 1 1 0 0 +EDGE2 3776 3697 0.934077 0.00323432 0.00876951 1 0 1 1 0 0 +EDGE2 3776 3556 0.0367855 -0.0640843 -0.0332359 1 0 1 1 0 0 +EDGE2 3776 3557 0.941569 0.0421564 -0.0108218 1 0 1 1 0 0 +EDGE2 3777 3696 -1.09342 -0.00580404 -0.029614 1 0 1 1 0 0 +EDGE2 3777 3776 -0.982057 0.0134915 -0.0177653 1 0 1 1 0 0 +EDGE2 3777 3697 -0.0351935 -0.0262026 -0.00103893 1 0 1 1 0 0 +EDGE2 3777 3556 -0.957612 0.0255751 -0.0526278 1 0 1 1 0 0 +EDGE2 3777 3557 -0.0497528 -0.109939 0.00731194 1 0 1 1 0 0 +EDGE2 3777 3558 1.06189 0.0113221 -0.00760138 1 0 1 1 0 0 +EDGE2 3777 3698 1.04484 0.0225105 -0.00096938 1 0 1 1 0 0 +EDGE2 3778 3559 0.984227 -0.00114382 0.0140397 1 0 1 1 0 0 +EDGE2 3778 3697 -1.06792 -0.0207877 0.0239791 1 0 1 1 0 0 +EDGE2 3778 3777 -1.04049 -0.0891736 -0.00271807 1 0 1 1 0 0 +EDGE2 3778 3557 -0.974945 0.0163709 0.00290926 1 0 1 1 0 0 +EDGE2 3778 3558 -0.0156139 0.0536388 -0.0093651 1 0 1 1 0 0 +EDGE2 3778 3698 0.0332639 0.0222894 -0.00994669 1 0 1 1 0 0 +EDGE2 3778 3699 0.95834 -0.0647619 0.00296274 1 0 1 1 0 0 +EDGE2 3779 3559 0.026222 0.0971349 0.0135861 1 0 1 1 0 0 +EDGE2 3779 3778 -1.02367 -0.0882989 0.0143825 1 0 1 1 0 0 +EDGE2 3779 3558 -0.985157 0.0397191 -0.00707307 1 0 1 1 0 0 +EDGE2 3779 3698 -1.00229 0.027896 0.0394642 1 0 1 1 0 0 +EDGE2 3779 3699 0.0364569 -0.104801 0.0111934 1 0 1 1 0 0 +EDGE2 3779 3700 0.971777 0.0703255 0.011108 1 0 1 1 0 0 +EDGE2 3779 3720 1.07922 0.0223342 -3.16891 1 0 1 1 0 0 +EDGE2 3779 3560 0.992471 0.0185694 0.0148223 1 0 1 1 0 0 +EDGE2 3780 3721 -0.0229385 1.05294 1.61503 1 0 1 1 0 0 +EDGE2 3780 3561 0.0325856 0.86604 1.5964 1 0 1 1 0 0 +EDGE2 3780 3559 -1.00538 0.0154805 -0.0225863 1 0 1 1 0 0 +EDGE2 3780 3779 -0.977001 -0.000869608 -0.0219602 1 0 1 1 0 0 +EDGE2 3780 3699 -1.03299 -0.00901985 0.0236375 1 0 1 1 0 0 +EDGE2 3780 3700 -0.0290178 0.147279 0.0256237 1 0 1 1 0 0 +EDGE2 3780 3720 0.0313427 0.11461 -3.14095 1 0 1 1 0 0 +EDGE2 3780 3560 0.0844786 -0.0423269 -0.0215693 1 0 1 1 0 0 +EDGE2 3780 3701 0.00850086 -0.946085 -1.56604 1 0 1 1 0 0 +EDGE2 3780 3719 1.04821 0.0376881 -3.14456 1 0 1 1 0 0 +EDGE2 3781 3700 -1.04613 -0.0317306 1.57392 1 0 1 1 0 0 +EDGE2 3781 3720 -0.981552 -0.0128674 -1.55601 1 0 1 1 0 0 +EDGE2 3781 3780 -1.11653 -0.0963688 1.55193 1 0 1 1 0 0 +EDGE2 3781 3560 -1.04377 -0.0020588 1.56385 1 0 1 1 0 0 +EDGE2 3781 3701 -0.0212219 -0.0593468 -0.021194 1 0 1 1 0 0 +EDGE2 3781 3702 0.895354 0.0188902 -0.000900855 1 0 1 1 0 0 +EDGE2 3782 3781 -1.01084 -0.0187886 -0.0277146 1 0 1 1 0 0 +EDGE2 3782 3701 -0.998832 0.0442546 0.00560269 1 0 1 1 0 0 +EDGE2 3782 3702 -0.0383125 0.0425907 -0.00568291 1 0 1 1 0 0 +EDGE2 3782 3703 1.02966 -0.0362367 -0.0221154 1 0 1 1 0 0 +EDGE2 3783 3782 -0.968502 -0.0355355 0.0261475 1 0 1 1 0 0 +EDGE2 3783 3702 -0.913182 -0.0205928 0.0134201 1 0 1 1 0 0 +EDGE2 3783 3704 0.948211 0.010406 -0.014244 1 0 1 1 0 0 +EDGE2 3783 3703 0.0356125 0.0294155 -0.0133939 1 0 1 1 0 0 +EDGE2 3784 3783 -0.984191 0.0188105 -0.00803269 1 0 1 1 0 0 +EDGE2 3784 3704 -0.0467853 0.0174029 -0.0109238 1 0 1 1 0 0 +EDGE2 3784 3703 -0.97365 -0.100067 0.00227008 1 0 1 1 0 0 +EDGE2 3784 3705 0.930679 -0.0126063 -0.0164252 1 0 1 1 0 0 +EDGE2 3785 3704 -1.001 -0.0770071 -0.0139903 1 0 1 1 0 0 +EDGE2 3785 3784 -0.909442 -0.0351821 0.0207332 1 0 1 1 0 0 +EDGE2 3785 3706 0.0202041 0.955978 1.55862 1 0 1 1 0 0 +EDGE2 3785 3705 -0.0237768 0.110355 1.20291e-05 1 0 1 1 0 0 +EDGE2 3786 3785 -1.03096 0.0372955 -1.57989 1 0 1 1 0 0 +EDGE2 3786 3707 1.05895 0.0218501 -0.0407736 1 0 1 1 0 0 +EDGE2 3786 3706 -0.0359941 -0.0475601 -0.0173822 1 0 1 1 0 0 +EDGE2 3786 3705 -1.06163 0.0225162 -1.58178 1 0 1 1 0 0 +EDGE2 3787 3707 0.0351125 -0.0146956 -0.0204099 1 0 1 1 0 0 +EDGE2 3787 3706 -0.985852 -0.0178388 0.0157112 1 0 1 1 0 0 +EDGE2 3787 3786 -0.96492 -0.0210486 -0.0116369 1 0 1 1 0 0 +EDGE2 3787 3708 0.995599 0.0371665 0.0124053 1 0 1 1 0 0 +EDGE2 3788 3707 -1.07667 0.0090119 -0.000990548 1 0 1 1 0 0 +EDGE2 3788 3787 -0.856837 0.00349041 -0.0178217 1 0 1 1 0 0 +EDGE2 3788 3708 -0.00122246 0.0135471 -0.0148734 1 0 1 1 0 0 +EDGE2 3788 3709 1.00111 0.0148913 -0.0328343 1 0 1 1 0 0 +EDGE2 3789 3708 -0.915355 0.0548342 0.0201165 1 0 1 1 0 0 +EDGE2 3789 3788 -1.05957 -0.0322748 0.0122764 1 0 1 1 0 0 +EDGE2 3789 3709 -0.0534523 -0.0257515 0.0229376 1 0 1 1 0 0 +EDGE2 3789 3710 0.988013 -0.0517125 -0.0240187 1 0 1 1 0 0 +EDGE2 3790 3789 -1.00231 -0.0429175 0.00471871 1 0 1 1 0 0 +EDGE2 3790 3709 -1.01295 0.0416137 -0.0343973 1 0 1 1 0 0 +EDGE2 3790 3711 0.0345408 1.01113 1.56767 1 0 1 1 0 0 +EDGE2 3790 3710 -0.0371166 0.0300717 0.00142867 1 0 1 1 0 0 +EDGE2 3791 3712 1.01494 -0.0186483 -0.00606329 1 0 1 1 0 0 +EDGE2 3791 3790 -1.02578 0.0492658 -1.60314 1 0 1 1 0 0 +EDGE2 3791 3711 -0.031347 -0.00643175 0.018784 1 0 1 1 0 0 +EDGE2 3791 3710 -1.05336 0.0631914 -1.59014 1 0 1 1 0 0 +EDGE2 3792 3791 -0.994512 -0.00848164 0.041659 1 0 1 1 0 0 +EDGE2 3792 3713 0.897663 -0.0830261 -0.0241322 1 0 1 1 0 0 +EDGE2 3792 3712 0.0230113 0.062092 0.0385335 1 0 1 1 0 0 +EDGE2 3792 3711 -1.00219 0.050105 -0.0243273 1 0 1 1 0 0 +EDGE2 3793 3714 1.06374 0.016193 0.0199737 1 0 1 1 0 0 +EDGE2 3793 3792 -1.00733 -0.057318 0.0196731 1 0 1 1 0 0 +EDGE2 3793 3713 0.0349665 -0.072445 0.000138739 1 0 1 1 0 0 +EDGE2 3793 3712 -0.955074 -0.0658958 0.0425701 1 0 1 1 0 0 +EDGE2 3794 3715 1.01728 -0.046188 -0.0132026 1 0 1 1 0 0 +EDGE2 3794 3714 0.0401667 -0.085182 0.0306548 1 0 1 1 0 0 +EDGE2 3794 3713 -0.958365 -0.024435 -0.0262552 1 0 1 1 0 0 +EDGE2 3794 3793 -1.03101 0.0367604 0.0193584 1 0 1 1 0 0 +EDGE2 3795 3715 -0.0371036 -0.0573904 0.0088014 1 0 1 1 0 0 +EDGE2 3795 3716 -0.0357641 1.04429 1.58319 1 0 1 1 0 0 +EDGE2 3795 3714 -1.02246 -0.0245874 -0.00664078 1 0 1 1 0 0 +EDGE2 3795 3794 -1.00751 -0.0739364 0.00997247 1 0 1 1 0 0 +EDGE2 3796 3715 -0.964642 0.0317854 1.5571 1 0 1 1 0 0 +EDGE2 3796 3795 -0.860773 -0.0278518 1.54141 1 0 1 1 0 0 +EDGE2 3797 3796 -0.907844 -0.0557837 0.00682583 1 0 1 1 0 0 +EDGE2 3798 3797 -1.02886 -0.0607738 -0.00500795 1 0 1 1 0 0 +EDGE2 3799 3798 -1.03668 -0.0475531 0.00898223 1 0 1 1 0 0 +EDGE2 3800 3799 -1.00935 -0.00794822 0.0168948 1 0 1 1 0 0 +EDGE2 3801 3800 -1.08918 0.0402687 -1.58687 1 0 1 1 0 0 +EDGE2 3802 3801 -0.966602 0.0468493 -0.0303277 1 0 1 1 0 0 +EDGE2 3803 3802 -0.919686 -0.0489009 -0.0131281 1 0 1 1 0 0 +EDGE2 3804 3803 -0.912424 -0.0157017 0.0100127 1 0 1 1 0 0 +EDGE2 3805 3804 -1.0397 0.032162 -0.00405549 1 0 1 1 0 0 +EDGE2 3806 3805 -0.98994 -0.0220676 -1.56893 1 0 1 1 0 0 +EDGE2 3807 3806 -1.05862 0.0394475 -0.0568204 1 0 1 1 0 0 +EDGE2 3808 3807 -1.10311 -0.120308 -0.014605 1 0 1 1 0 0 +EDGE2 3809 3808 -0.933241 0.0792012 -0.00487086 1 0 1 1 0 0 +EDGE2 3809 3650 1.06255 -0.0386816 -3.14135 1 0 1 1 0 0 +EDGE2 3809 3670 1.12503 0.0393531 -3.1418 1 0 1 1 0 0 +EDGE2 3810 3651 0.00423372 -1.01215 -1.5468 1 0 1 1 0 0 +EDGE2 3810 3671 0.0330038 -0.977999 -1.57876 1 0 1 1 0 0 +EDGE2 3810 3809 -0.960333 -0.0132821 0.00589492 1 0 1 1 0 0 +EDGE2 3810 3650 0.0312843 -0.00701813 -3.1199 1 0 1 1 0 0 +EDGE2 3810 3649 0.921992 -0.064166 -3.13923 1 0 1 1 0 0 +EDGE2 3810 3669 0.949162 -0.0902344 -3.14281 1 0 1 1 0 0 +EDGE2 3810 3670 -0.0370959 0.0320685 -3.14802 1 0 1 1 0 0 +EDGE2 3811 3651 0.0130481 0.0415535 0.0242758 1 0 1 1 0 0 +EDGE2 3811 3652 0.952324 0.0401809 0.00822186 1 0 1 1 0 0 +EDGE2 3811 3672 1.10409 -0.0117558 -0.00716251 1 0 1 1 0 0 +EDGE2 3811 3671 0.0482546 -0.0589888 -0.013552 1 0 1 1 0 0 +EDGE2 3811 3810 -0.946077 0.0753397 1.56973 1 0 1 1 0 0 +EDGE2 3811 3650 -0.923567 0.0603087 -1.56465 1 0 1 1 0 0 +EDGE2 3811 3670 -0.997737 -0.0120413 -1.54069 1 0 1 1 0 0 +EDGE2 3812 3673 0.924646 0.0918335 0.0249804 1 0 1 1 0 0 +EDGE2 3812 3653 0.912087 0.0532318 -0.0163776 1 0 1 1 0 0 +EDGE2 3812 3651 -1.00372 0.0377044 -0.0194098 1 0 1 1 0 0 +EDGE2 3812 3811 -1.01878 -0.020464 -0.00941995 1 0 1 1 0 0 +EDGE2 3812 3652 -0.00219205 0.0728388 0.0417381 1 0 1 1 0 0 +EDGE2 3812 3672 0.0247515 -0.0594147 0.0162077 1 0 1 1 0 0 +EDGE2 3812 3671 -1.06536 -0.02482 -0.0229147 1 0 1 1 0 0 +EDGE2 3813 3812 -1.01237 -0.0486209 -0.0160555 1 0 1 1 0 0 +EDGE2 3813 3654 0.945653 -0.0502892 -0.0123721 1 0 1 1 0 0 +EDGE2 3813 3674 1.01048 0.071071 0.000615933 1 0 1 1 0 0 +EDGE2 3813 3673 -0.0398747 0.113252 0.0174715 1 0 1 1 0 0 +EDGE2 3813 3653 0.0137399 -0.0175398 -0.00185341 1 0 1 1 0 0 +EDGE2 3813 3652 -0.968124 -0.0361181 0.00576293 1 0 1 1 0 0 +EDGE2 3813 3672 -1.01415 -0.0199816 0.00638939 1 0 1 1 0 0 +EDGE2 3814 3635 1.04729 -0.00780008 -3.15174 1 0 1 1 0 0 +EDGE2 3814 3675 0.969513 0.0896135 0.0200119 1 0 1 1 0 0 +EDGE2 3814 3655 0.986558 0.0714983 -0.00964603 1 0 1 1 0 0 +EDGE2 3814 3654 -0.0261544 0.0143807 0.00322145 1 0 1 1 0 0 +EDGE2 3814 3674 -0.0230191 0.074665 0.0101032 1 0 1 1 0 0 +EDGE2 3814 3673 -0.967785 0.0604286 0.0332658 1 0 1 1 0 0 +EDGE2 3814 3813 -1.0426 -0.0305082 -0.0334485 1 0 1 1 0 0 +EDGE2 3814 3653 -0.920376 -0.0129053 -0.017962 1 0 1 1 0 0 +EDGE2 3815 3635 0.0171035 0.104649 -3.1242 1 0 1 1 0 0 +EDGE2 3815 3656 -0.0224357 1.05831 1.55145 1 0 1 1 0 0 +EDGE2 3815 3676 -0.0334858 0.948398 1.56822 1 0 1 1 0 0 +EDGE2 3815 3636 0.0358985 0.991729 1.53997 1 0 1 1 0 0 +EDGE2 3815 3675 -0.0541837 0.134503 -0.0272464 1 0 1 1 0 0 +EDGE2 3815 3634 0.963745 0.0355434 -3.15582 1 0 1 1 0 0 +EDGE2 3815 3655 0.0705327 -0.0615184 0.00660421 1 0 1 1 0 0 +EDGE2 3815 3654 -1.03796 0.0582911 0.0293077 1 0 1 1 0 0 +EDGE2 3815 3814 -1.01463 -0.0270792 0.00585219 1 0 1 1 0 0 +EDGE2 3815 3674 -1.05615 -0.014299 -0.00323795 1 0 1 1 0 0 +EDGE2 3816 3637 1.0415 0.0161868 0.00461272 1 0 1 1 0 0 +EDGE2 3816 3677 0.883947 0.0190873 0.00129441 1 0 1 1 0 0 +EDGE2 3816 3657 0.941493 0.00360163 -0.0123585 1 0 1 1 0 0 +EDGE2 3816 3635 -1.00385 0.030063 1.64359 1 0 1 1 0 0 +EDGE2 3816 3656 0.00508557 0.0361772 -0.0100647 1 0 1 1 0 0 +EDGE2 3816 3676 0.000716137 0.0992061 0.0145265 1 0 1 1 0 0 +EDGE2 3816 3636 -0.0320291 0.0596908 0.017865 1 0 1 1 0 0 +EDGE2 3816 3675 -0.961679 -0.0343481 -1.59031 1 0 1 1 0 0 +EDGE2 3816 3815 -1.12128 -0.0625168 -1.59625 1 0 1 1 0 0 +EDGE2 3816 3655 -1.04307 -0.0567772 -1.58725 1 0 1 1 0 0 +EDGE2 3817 3637 0.0405093 0.0734171 -0.00903425 1 0 1 1 0 0 +EDGE2 3817 3677 0.0723888 0.0825132 0.0125224 1 0 1 1 0 0 +EDGE2 3817 3638 0.935889 0.0556838 -0.0179495 1 0 1 1 0 0 +EDGE2 3817 3658 1.06506 0.0644967 -0.0152636 1 0 1 1 0 0 +EDGE2 3817 3678 1.01293 -0.0257892 0.00755453 1 0 1 1 0 0 +EDGE2 3817 3657 -0.0387487 -0.0176174 0.00836667 1 0 1 1 0 0 +EDGE2 3817 3656 -0.999486 0.0646814 -0.0231213 1 0 1 1 0 0 +EDGE2 3817 3676 -0.902906 -0.0247803 -0.0333053 1 0 1 1 0 0 +EDGE2 3817 3816 -1.06425 -0.0227644 -0.0126195 1 0 1 1 0 0 +EDGE2 3817 3636 -0.934183 -0.00723131 -0.00252358 1 0 1 1 0 0 +EDGE2 3818 3637 -0.996872 0.0162245 0.0102718 1 0 1 1 0 0 +EDGE2 3818 3677 -1.03951 0.00409581 0.0128965 1 0 1 1 0 0 +EDGE2 3818 3659 0.954121 0.0297799 -0.0215371 1 0 1 1 0 0 +EDGE2 3818 3679 1.05611 0.043642 -0.00250194 1 0 1 1 0 0 +EDGE2 3818 3639 1.04218 -0.0532215 -0.00322836 1 0 1 1 0 0 +EDGE2 3818 3638 0.00857368 0.0236944 -0.0117287 1 0 1 1 0 0 +EDGE2 3818 3658 0.0883998 0.133603 -0.0131584 1 0 1 1 0 0 +EDGE2 3818 3678 0.0125344 -0.00337029 0.0281068 1 0 1 1 0 0 +EDGE2 3818 3817 -0.936 0.0167184 0.0407614 1 0 1 1 0 0 +EDGE2 3818 3657 -0.967849 -0.0156483 0.0380648 1 0 1 1 0 0 +EDGE2 3819 3680 1.06454 -0.000765772 0.00195823 1 0 1 1 0 0 +EDGE2 3819 3760 1.013 0.0439722 -3.16083 1 0 1 1 0 0 +EDGE2 3819 3600 1.03951 -0.0579348 -3.13802 1 0 1 1 0 0 +EDGE2 3819 3640 1.0417 -0.0717125 0.0133378 1 0 1 1 0 0 +EDGE2 3819 3660 1.05784 -0.0341971 -0.00772021 1 0 1 1 0 0 +EDGE2 3819 3818 -1.06021 -0.0103735 0.0417873 1 0 1 1 0 0 +EDGE2 3819 3659 0.00519366 -0.0339628 -0.000693056 1 0 1 1 0 0 +EDGE2 3819 3679 -0.0536901 0.0875024 0.00522703 1 0 1 1 0 0 +EDGE2 3819 3639 -0.0210374 -0.0581977 0.00703563 1 0 1 1 0 0 +EDGE2 3819 3638 -1.01622 0.0372879 0.0352215 1 0 1 1 0 0 +EDGE2 3819 3658 -0.995194 -0.00175625 -0.0251026 1 0 1 1 0 0 +EDGE2 3819 3678 -1.00055 0.034788 0.00396788 1 0 1 1 0 0 +EDGE2 3820 3599 1.03267 -0.0262576 -3.144 1 0 1 1 0 0 +EDGE2 3820 3759 0.956734 -0.109169 -3.12855 1 0 1 1 0 0 +EDGE2 3820 3680 0.00380617 -0.103069 -0.0079759 1 0 1 1 0 0 +EDGE2 3820 3601 -0.0592402 -0.971227 -1.5731 1 0 1 1 0 0 +EDGE2 3820 3760 -0.00475745 -0.00552064 -3.14351 1 0 1 1 0 0 +EDGE2 3820 3761 -0.0896306 0.98743 1.56341 1 0 1 1 0 0 +EDGE2 3820 3600 -0.0465396 -0.0259923 -3.14975 1 0 1 1 0 0 +EDGE2 3820 3640 0.0470678 0.0451487 0.0292986 1 0 1 1 0 0 +EDGE2 3820 3660 0.00623312 -0.0134091 0.00757993 1 0 1 1 0 0 +EDGE2 3820 3641 0.03971 1.00347 1.58246 1 0 1 1 0 0 +EDGE2 3820 3661 -0.0369179 0.989651 1.54379 1 0 1 1 0 0 +EDGE2 3820 3681 -0.0383372 1.06222 1.56555 1 0 1 1 0 0 +EDGE2 3820 3659 -1.03731 -0.0131571 -0.0246346 1 0 1 1 0 0 +EDGE2 3820 3679 -1.00728 -0.0578869 0.0124157 1 0 1 1 0 0 +EDGE2 3820 3819 -0.899313 0.00173023 0.00760237 1 0 1 1 0 0 +EDGE2 3820 3639 -1.01647 -0.00247629 -0.0097074 1 0 1 1 0 0 +EDGE2 3821 3680 -0.907069 -0.0328007 -1.56007 1 0 1 1 0 0 +EDGE2 3821 3820 -1.0221 -0.0598513 -1.57989 1 0 1 1 0 0 +EDGE2 3821 3760 -0.963786 0.0503438 1.53676 1 0 1 1 0 0 +EDGE2 3821 3762 0.949755 -0.0713249 -0.00413339 1 0 1 1 0 0 +EDGE2 3821 3761 -0.0824764 -0.0414985 0.00313548 1 0 1 1 0 0 +EDGE2 3821 3600 -1.07666 0.0311692 1.52792 1 0 1 1 0 0 +EDGE2 3821 3640 -0.993624 -0.0488494 -1.59435 1 0 1 1 0 0 +EDGE2 3821 3660 -0.943398 -0.018743 -1.56986 1 0 1 1 0 0 +EDGE2 3821 3641 -0.006541 -0.0175824 -0.000241071 1 0 1 1 0 0 +EDGE2 3821 3661 -0.0469014 -0.0365402 -0.00409501 1 0 1 1 0 0 +EDGE2 3821 3681 -0.0556802 0.0538361 0.00283574 1 0 1 1 0 0 +EDGE2 3821 3642 0.998437 -0.114556 0.00898106 1 0 1 1 0 0 +EDGE2 3821 3662 1.04401 -0.00606828 -0.00171618 1 0 1 1 0 0 +EDGE2 3821 3682 1.01119 0.0370789 -0.0149826 1 0 1 1 0 0 +EDGE2 3822 3762 0.152422 -0.0164567 0.00763195 1 0 1 1 0 0 +EDGE2 3822 3761 -1.00129 -0.027142 0.0151348 1 0 1 1 0 0 +EDGE2 3822 3821 -1.09526 0.00850783 0.0160457 1 0 1 1 0 0 +EDGE2 3822 3641 -1.01414 0.0102621 0.0249901 1 0 1 1 0 0 +EDGE2 3822 3661 -1.05395 0.00212022 0.0246199 1 0 1 1 0 0 +EDGE2 3822 3681 -0.949632 -0.0563331 0.00378244 1 0 1 1 0 0 +EDGE2 3822 3763 1.07428 0.104336 -0.0306876 1 0 1 1 0 0 +EDGE2 3822 3642 0.111827 -0.115076 -0.00627196 1 0 1 1 0 0 +EDGE2 3822 3662 -0.00409457 -0.0557692 0.000772726 1 0 1 1 0 0 +EDGE2 3822 3682 0.00313722 -0.0667696 -0.0272421 1 0 1 1 0 0 +EDGE2 3822 3663 0.957992 -0.102236 0.0401462 1 0 1 1 0 0 +EDGE2 3822 3683 1.01151 0.0255878 -0.00729227 1 0 1 1 0 0 +EDGE2 3822 3643 1.02015 0.0441228 -0.0168837 1 0 1 1 0 0 +EDGE2 3823 3762 -1.08967 -0.0122304 0.0191464 1 0 1 1 0 0 +EDGE2 3823 3822 -0.949923 0.00113387 -0.0115783 1 0 1 1 0 0 +EDGE2 3823 3763 -0.00923174 -0.0015367 0.0394524 1 0 1 1 0 0 +EDGE2 3823 3642 -1.07224 -0.00444941 0.00798563 1 0 1 1 0 0 +EDGE2 3823 3662 -0.986962 0.0529148 -0.0107059 1 0 1 1 0 0 +EDGE2 3823 3682 -1.00451 -0.034097 -0.0098581 1 0 1 1 0 0 +EDGE2 3823 3663 0.0235581 0.0160294 -0.00435354 1 0 1 1 0 0 +EDGE2 3823 3683 -0.0976676 -0.0151965 -0.0204082 1 0 1 1 0 0 +EDGE2 3823 3643 0.00171323 -0.0173143 0.00408489 1 0 1 1 0 0 +EDGE2 3823 3664 0.91483 0.0237081 0.0188036 1 0 1 1 0 0 +EDGE2 3823 3684 1.04856 -0.0759413 -0.0194909 1 0 1 1 0 0 +EDGE2 3823 3764 1.07974 0.0658302 0.0188788 1 0 1 1 0 0 +EDGE2 3823 3644 0.950457 -0.026778 -0.0386397 1 0 1 1 0 0 +EDGE2 3824 3763 -0.943768 -0.0535139 0.00575941 1 0 1 1 0 0 +EDGE2 3824 3823 -1.03728 -0.017189 0.0118505 1 0 1 1 0 0 +EDGE2 3824 3663 -0.956467 0.00102764 -0.0172085 1 0 1 1 0 0 +EDGE2 3824 3683 -1.01637 -0.0449572 0.0369903 1 0 1 1 0 0 +EDGE2 3824 3643 -0.984233 0.000412239 0.0120485 1 0 1 1 0 0 +EDGE2 3824 3664 -0.0187294 -0.107116 -0.0150697 1 0 1 1 0 0 +EDGE2 3824 3684 -0.0318827 -0.022335 0.0499881 1 0 1 1 0 0 +EDGE2 3824 3764 0.033885 0.0223441 -0.0242873 1 0 1 1 0 0 +EDGE2 3824 3644 0.0170196 -0.0829362 0.0134549 1 0 1 1 0 0 +EDGE2 3824 3765 0.955813 0.0515667 0.00746456 1 0 1 1 0 0 +EDGE2 3824 3725 1.0169 -0.10863 -3.14737 1 0 1 1 0 0 +EDGE2 3824 3645 1.06056 0.03024 -0.0252974 1 0 1 1 0 0 +EDGE2 3824 3685 0.993669 -0.0145705 0.0223745 1 0 1 1 0 0 +EDGE2 3824 3665 1.02957 0.0600619 -0.0313884 1 0 1 1 0 0 +EDGE2 3824 3565 0.932102 0.0729822 -3.12771 1 0 1 1 0 0 +EDGE2 3825 3766 0.0630135 -1.00196 -1.61435 1 0 1 1 0 0 +EDGE2 3825 3824 -1.04315 0.0095672 -0.0116589 1 0 1 1 0 0 +EDGE2 3825 3664 -1.02486 0.0795824 0.00256859 1 0 1 1 0 0 +EDGE2 3825 3684 -1.01197 -0.0624611 0.0146007 1 0 1 1 0 0 +EDGE2 3825 3764 -1.003 -0.00295747 -0.00946345 1 0 1 1 0 0 +EDGE2 3825 3644 -0.991011 0.0951517 0.0180394 1 0 1 1 0 0 +EDGE2 3825 3765 0.0380029 -0.0104082 -0.00621425 1 0 1 1 0 0 +EDGE2 3825 3725 0.044368 -0.0898548 -3.15624 1 0 1 1 0 0 +EDGE2 3825 3686 -0.0805606 -1.02634 -1.57727 1 0 1 1 0 0 +EDGE2 3825 3726 0.0427497 -0.879376 -1.57406 1 0 1 1 0 0 +EDGE2 3825 3566 -0.0295787 -0.998026 -1.56878 1 0 1 1 0 0 +EDGE2 3825 3645 0.019082 -0.0162632 0.0202305 1 0 1 1 0 0 +EDGE2 3825 3685 -0.0175225 -0.000461519 -0.00764376 1 0 1 1 0 0 +EDGE2 3825 3665 0.0687743 0.0773462 0.00516243 1 0 1 1 0 0 +EDGE2 3825 3564 1.07377 0.0471468 -3.12597 1 0 1 1 0 0 +EDGE2 3825 3724 0.966642 0.0541963 -3.16039 1 0 1 1 0 0 +EDGE2 3825 3565 0.0876057 0.0834093 -3.13483 1 0 1 1 0 0 +EDGE2 3825 3646 0.00626977 1.01056 1.5536 1 0 1 1 0 0 +EDGE2 3825 3666 -0.0302349 1.00804 1.53627 1 0 1 1 0 0 +EDGE2 3826 3825 -1.04624 0.00890226 -1.56864 1 0 1 1 0 0 +EDGE2 3826 3765 -1.00951 0.0820091 -1.54075 1 0 1 1 0 0 +EDGE2 3826 3725 -1.01729 -0.111224 1.60005 1 0 1 1 0 0 +EDGE2 3826 3645 -1.04226 0.0113648 -1.56808 1 0 1 1 0 0 +EDGE2 3826 3685 -0.973326 -0.0517695 -1.54743 1 0 1 1 0 0 +EDGE2 3826 3665 -0.990381 0.075032 -1.55017 1 0 1 1 0 0 +EDGE2 3826 3565 -0.965854 -0.0058271 1.57709 1 0 1 1 0 0 +EDGE2 3826 3667 1.02234 -0.0764516 -0.00508092 1 0 1 1 0 0 +EDGE2 3826 3646 -0.00721338 0.0227896 0.0177346 1 0 1 1 0 0 +EDGE2 3826 3666 0.0856735 0.0886636 0.04442 1 0 1 1 0 0 +EDGE2 3826 3647 0.989305 0.0176898 0.043946 1 0 1 1 0 0 +EDGE2 3827 3826 -1.01265 -0.0770673 -0.013966 1 0 1 1 0 0 +EDGE2 3827 3668 1.00211 0.00473921 -0.00354805 1 0 1 1 0 0 +EDGE2 3827 3667 -0.0632489 -0.00677772 -0.0270335 1 0 1 1 0 0 +EDGE2 3827 3646 -0.995831 -0.00411064 0.0261151 1 0 1 1 0 0 +EDGE2 3827 3666 -0.989323 -0.0321912 0.00309761 1 0 1 1 0 0 +EDGE2 3827 3647 0.00799513 0.00302941 0.0258022 1 0 1 1 0 0 +EDGE2 3827 3648 1.04543 0.0627096 0.0277507 1 0 1 1 0 0 +EDGE2 3828 3827 -1.07461 0.0356456 0.0270378 1 0 1 1 0 0 +EDGE2 3828 3668 -0.0599172 -0.101753 0.0268305 1 0 1 1 0 0 +EDGE2 3828 3667 -1.03354 0.0650697 0.00956417 1 0 1 1 0 0 +EDGE2 3828 3647 -1.02441 -0.0743709 -0.017041 1 0 1 1 0 0 +EDGE2 3828 3649 1.00809 -0.104302 0.0156007 1 0 1 1 0 0 +EDGE2 3828 3669 0.904801 0.0779103 -0.00353497 1 0 1 1 0 0 +EDGE2 3828 3648 0.0738542 -0.0172428 -0.0104911 1 0 1 1 0 0 +EDGE2 3829 3828 -0.995065 0.0685169 0.0451688 1 0 1 1 0 0 +EDGE2 3829 3810 1.00566 0.0403482 -3.16306 1 0 1 1 0 0 +EDGE2 3829 3650 0.955108 0.0416949 0.0104687 1 0 1 1 0 0 +EDGE2 3829 3668 -1.05709 0.0219335 -0.00365004 1 0 1 1 0 0 +EDGE2 3829 3649 0.0136429 0.0251036 -0.0235234 1 0 1 1 0 0 +EDGE2 3829 3669 0.0584691 0.0205478 -0.0125335 1 0 1 1 0 0 +EDGE2 3829 3648 -0.992939 -0.0406249 0.0348686 1 0 1 1 0 0 +EDGE2 3829 3670 1.06665 0.0127739 0.0100169 1 0 1 1 0 0 +EDGE2 3830 3829 -0.991923 -0.0239016 -0.00349425 1 0 1 1 0 0 +EDGE2 3830 3651 -0.0124695 0.987326 1.56132 1 0 1 1 0 0 +EDGE2 3830 3811 -0.0230686 0.92294 1.58015 1 0 1 1 0 0 +EDGE2 3830 3671 -0.00666463 1.0432 1.5447 1 0 1 1 0 0 +EDGE2 3830 3809 0.880837 0.0880692 -3.13498 1 0 1 1 0 0 +EDGE2 3830 3810 -0.03654 -0.0580293 -3.15782 1 0 1 1 0 0 +EDGE2 3830 3650 -0.00641767 -0.0611362 0.0363003 1 0 1 1 0 0 +EDGE2 3830 3649 -1.08878 -0.0034116 -0.00435427 1 0 1 1 0 0 +EDGE2 3830 3669 -1.06112 0.0763917 -0.00812498 1 0 1 1 0 0 +EDGE2 3830 3670 0.0511683 -0.0112121 0.0149331 1 0 1 1 0 0 +EDGE2 3831 3810 -1.01813 0.0414606 -1.59467 1 0 1 1 0 0 +EDGE2 3831 3830 -0.981669 0.00141895 1.60708 1 0 1 1 0 0 +EDGE2 3831 3650 -0.921052 -0.00655344 1.55792 1 0 1 1 0 0 +EDGE2 3831 3670 -1.00166 -0.098493 1.53506 1 0 1 1 0 0 +EDGE2 3832 3831 -1.03138 -0.073564 -0.0168081 1 0 1 1 0 0 +EDGE2 3833 3832 -0.913977 -0.00298384 -0.0434824 1 0 1 1 0 0 +EDGE2 3834 3833 -1.1111 -0.0102374 0.01841 1 0 1 1 0 0 +EDGE2 3834 3715 1.08672 0.0192158 -3.14343 1 0 1 1 0 0 +EDGE2 3834 3795 1.05492 -0.0118464 -3.11947 1 0 1 1 0 0 +EDGE2 3835 3834 -0.971369 -0.0193979 -0.0187579 1 0 1 1 0 0 +EDGE2 3835 3715 -0.0348893 0.0853406 -3.14568 1 0 1 1 0 0 +EDGE2 3835 3716 0.044142 -1.01516 -1.55941 1 0 1 1 0 0 +EDGE2 3835 3795 -0.0135322 -0.00949839 -3.12162 1 0 1 1 0 0 +EDGE2 3835 3714 1.00208 -0.0294296 -3.13251 1 0 1 1 0 0 +EDGE2 3835 3796 -0.0616872 1 1.61349 1 0 1 1 0 0 +EDGE2 3835 3794 1.01475 0.0799424 -3.15092 1 0 1 1 0 0 +EDGE2 3836 3715 -1.02695 -0.0663632 1.56889 1 0 1 1 0 0 +EDGE2 3836 3835 -0.989185 -0.0486616 -1.55236 1 0 1 1 0 0 +EDGE2 3836 3795 -1.02442 -0.00998825 1.57931 1 0 1 1 0 0 +EDGE2 3836 3797 0.888395 0.0347023 -0.014245 1 0 1 1 0 0 +EDGE2 3836 3796 -0.0182783 0.0419495 -0.0186759 1 0 1 1 0 0 +EDGE2 3837 3797 0.0234898 -0.0516265 -0.021345 1 0 1 1 0 0 +EDGE2 3837 3796 -1.02433 0.00831916 -0.00857146 1 0 1 1 0 0 +EDGE2 3837 3836 -0.968263 -0.0479155 -0.00171215 1 0 1 1 0 0 +EDGE2 3837 3798 1.06462 -0.0360949 -0.00879375 1 0 1 1 0 0 +EDGE2 3838 3797 -0.952009 -0.0276571 0.0063009 1 0 1 1 0 0 +EDGE2 3838 3837 -1.01764 -0.00979122 0.0220019 1 0 1 1 0 0 +EDGE2 3838 3798 0.0543177 -0.121319 -0.0287212 1 0 1 1 0 0 +EDGE2 3838 3799 0.941367 0.0175075 0.0111806 1 0 1 1 0 0 +EDGE2 3839 3798 -0.999312 0.0515095 -0.0620725 1 0 1 1 0 0 +EDGE2 3839 3838 -0.974605 0.0983016 0.0164964 1 0 1 1 0 0 +EDGE2 3839 3799 0.0568886 0.00243731 -0.00938338 1 0 1 1 0 0 +EDGE2 3839 3800 1.04928 0.0195713 0.0211853 1 0 1 1 0 0 +EDGE2 3840 3839 -0.947318 -0.00524871 -0.0114846 1 0 1 1 0 0 +EDGE2 3840 3799 -0.899919 -0.00462819 -0.00997775 1 0 1 1 0 0 +EDGE2 3840 3801 -0.00653715 1.05 1.59767 1 0 1 1 0 0 +EDGE2 3840 3800 -0.061382 -0.0712226 -0.0265108 1 0 1 1 0 0 +EDGE2 3841 3840 -1.03841 -0.00140293 1.58151 1 0 1 1 0 0 +EDGE2 3841 3800 -0.968339 -0.106778 1.58679 1 0 1 1 0 0 +EDGE2 3842 3841 -1.06006 0.0169605 0.00512147 1 0 1 1 0 0 +EDGE2 3843 3842 -1.12134 0.0115876 -0.000832005 1 0 1 1 0 0 +EDGE2 3844 3843 -1.08856 -0.0124456 -0.00325574 1 0 1 1 0 0 +EDGE2 3845 3844 -1.02142 -0.00703636 -0.00642728 1 0 1 1 0 0 +EDGE2 3846 3845 -0.975053 0.0703357 -1.52224 1 0 1 1 0 0 +EDGE2 3847 3846 -1.02414 0.0696158 1.36384e-05 1 0 1 1 0 0 +EDGE2 3848 3847 -0.918077 0.0617116 -0.035867 1 0 1 1 0 0 +EDGE2 3849 3848 -1.04949 0.0187286 -0.0119755 1 0 1 1 0 0 +EDGE2 3850 3849 -0.933014 0.0306653 0.0321269 1 0 1 1 0 0 +EDGE2 3851 3850 -0.9654 0.00729662 -1.57537 1 0 1 1 0 0 +EDGE2 3852 3851 -0.978136 -0.061786 -0.0204939 1 0 1 1 0 0 +EDGE2 3853 3852 -0.992682 0.0398342 -0.0099068 1 0 1 1 0 0 +EDGE2 3854 3853 -0.986965 -0.034121 -0.00521177 1 0 1 1 0 0 +EDGE2 3855 3854 -0.899975 0.0377928 -0.0325063 1 0 1 1 0 0 +EDGE2 3856 3855 -1.14294 -0.0206868 1.58499 1 0 1 1 0 0 +EDGE2 3857 3856 -0.974188 -0.0618705 0.0140409 1 0 1 1 0 0 +EDGE2 3858 3857 -0.903404 0.0202546 -0.018858 1 0 1 1 0 0 +EDGE2 3859 3858 -0.975986 0.00167916 0.0593458 1 0 1 1 0 0 +EDGE2 3860 3859 -1.04559 0.00857098 0.00522694 1 0 1 1 0 0 +EDGE2 3861 3860 -0.979519 0.0191036 -1.54925 1 0 1 1 0 0 +EDGE2 3862 3861 -1.01905 0.0485397 -0.0520295 1 0 1 1 0 0 +EDGE2 3863 3862 -1.03826 0.0446101 -0.00755084 1 0 1 1 0 0 +EDGE2 3864 3863 -1.04692 0.0628943 -0.00272776 1 0 1 1 0 0 +EDGE2 3865 3864 -1.03393 -0.0856564 0.0255177 1 0 1 1 0 0 +EDGE2 3866 3865 -1.08146 -0.0123293 -1.57398 1 0 1 1 0 0 +EDGE2 3867 3866 -1.03827 0.0586255 0.000841667 1 0 1 1 0 0 +EDGE2 3868 3867 -0.890267 0.0533117 0.0110908 1 0 1 1 0 0 +EDGE2 3869 3868 -0.95829 0.0513142 -0.00795464 1 0 1 1 0 0 +EDGE2 3870 3869 -0.947095 -0.0471947 -0.00556152 1 0 1 1 0 0 +EDGE2 3871 3870 -1.03943 -0.0609091 -1.56822 1 0 1 1 0 0 +EDGE2 3872 3871 -1.03301 -0.113176 -0.0156633 1 0 1 1 0 0 +EDGE2 3873 3872 -1.06041 -0.0216062 0.0113574 1 0 1 1 0 0 +EDGE2 3874 3873 -0.948552 -0.00699075 0.0306944 1 0 1 1 0 0 +EDGE2 3874 3855 1.03929 -0.0322957 -3.12602 1 0 1 1 0 0 +EDGE2 3875 3856 0.0754799 1.02012 1.57847 1 0 1 1 0 0 +EDGE2 3875 3874 -1.04262 -0.0645366 0.0207897 1 0 1 1 0 0 +EDGE2 3875 3855 -0.06173 -0.0424824 -3.11373 1 0 1 1 0 0 +EDGE2 3875 3854 0.976285 -0.0212953 -3.13601 1 0 1 1 0 0 +EDGE2 3876 3856 -0.0293806 0.0488736 0.0201923 1 0 1 1 0 0 +EDGE2 3876 3855 -0.947135 0.0377059 1.57075 1 0 1 1 0 0 +EDGE2 3876 3875 -0.977523 0.0547325 -1.60469 1 0 1 1 0 0 +EDGE2 3876 3857 1.00297 -0.0566943 0.0108767 1 0 1 1 0 0 +EDGE2 3877 3856 -1.04736 0.0713256 0.00913228 1 0 1 1 0 0 +EDGE2 3877 3876 -1.01478 -0.022302 -0.025328 1 0 1 1 0 0 +EDGE2 3877 3857 0.0713903 -0.0334777 0.0224763 1 0 1 1 0 0 +EDGE2 3877 3858 1.06397 -0.0332964 -0.0165703 1 0 1 1 0 0 +EDGE2 3878 3857 -1.00529 0.0957927 -0.0297663 1 0 1 1 0 0 +EDGE2 3878 3877 -0.954834 0.0467232 0.0310579 1 0 1 1 0 0 +EDGE2 3878 3858 0.0547566 -0.00728362 0.0142985 1 0 1 1 0 0 +EDGE2 3878 3859 1.0505 -0.00541343 0.0184742 1 0 1 1 0 0 +EDGE2 3879 3878 -1.02269 -0.0268452 -0.0242671 1 0 1 1 0 0 +EDGE2 3879 3858 -0.975085 0.0293081 0.0247263 1 0 1 1 0 0 +EDGE2 3879 3859 -0.0196987 0.0126199 -0.0336489 1 0 1 1 0 0 +EDGE2 3879 3860 1.05873 -0.0162525 0.0014577 1 0 1 1 0 0 +EDGE2 3880 3859 -1.04681 0.176373 -0.0170458 1 0 1 1 0 0 +EDGE2 3880 3879 -0.990041 -0.0132503 0.00978967 1 0 1 1 0 0 +EDGE2 3880 3861 0.0826279 0.997067 1.59075 1 0 1 1 0 0 +EDGE2 3880 3860 0.0958178 0.0189624 -0.00508168 1 0 1 1 0 0 +EDGE2 3881 3860 -0.97018 0.0734679 1.54921 1 0 1 1 0 0 +EDGE2 3881 3880 -0.877681 0.121697 1.58381 1 0 1 1 0 0 +EDGE2 3882 3881 -0.962525 0.0310385 0.0303807 1 0 1 1 0 0 +EDGE2 3883 3882 -1.00077 0.0570614 0.0158379 1 0 1 1 0 0 +EDGE2 3884 3883 -1.02402 -0.0193108 -0.00951051 1 0 1 1 0 0 +EDGE2 3885 3884 -0.981206 0.00369123 0.00942413 1 0 1 1 0 0 +EDGE2 3886 3885 -0.971692 -0.089353 -1.58624 1 0 1 1 0 0 +EDGE2 3887 3886 -0.953989 -0.0567739 -0.0185566 1 0 1 1 0 0 +EDGE2 3888 3887 -0.956365 -0.00283804 -0.0155032 1 0 1 1 0 0 +EDGE2 3889 3888 -1.01331 -0.0590587 0.0151483 1 0 1 1 0 0 +EDGE2 3890 3889 -0.901323 -0.0138203 0.00908675 1 0 1 1 0 0 +EDGE2 3891 3890 -0.9215 -0.0970035 1.57302 1 0 1 1 0 0 +EDGE2 3892 3891 -1.05776 -0.0174521 0.0126408 1 0 1 1 0 0 +EDGE2 3893 3892 -0.896816 -0.0887149 0.0304549 1 0 1 1 0 0 +EDGE2 3894 3893 -0.983632 0.0336694 -0.0195337 1 0 1 1 0 0 +EDGE2 3895 3894 -0.988553 0.0342303 0.00323233 1 0 1 1 0 0 +EDGE2 3896 3895 -0.977762 0.0551075 -1.57551 1 0 1 1 0 0 +EDGE2 3897 3896 -1.09359 0.0191838 0.00618875 1 0 1 1 0 0 +EDGE2 3898 3897 -1.00293 0.0382001 -0.00136089 1 0 1 1 0 0 +EDGE2 3899 3898 -0.95394 -0.0292606 0.00201461 1 0 1 1 0 0 +EDGE2 3900 3899 -0.92964 -0.0152936 -0.0136501 1 0 1 1 0 0 +EDGE2 3901 3900 -0.97603 0.0423468 -1.58075 1 0 1 1 0 0 +EDGE2 3902 3901 -0.984396 -0.027001 0.0222496 1 0 1 1 0 0 +EDGE2 3903 3902 -0.918079 0.00378039 0.00533073 1 0 1 1 0 0 +EDGE2 3904 3903 -1.01699 0.0285773 -0.0106009 1 0 1 1 0 0 +EDGE2 3905 3904 -1.07317 -0.0381167 -0.0038992 1 0 1 1 0 0 +EDGE2 3906 3905 -1.02569 -0.0113905 1.54884 1 0 1 1 0 0 +EDGE2 3907 3906 -1.04663 0.0557236 -0.0145925 1 0 1 1 0 0 +EDGE2 3908 3907 -1.00467 -0.0591073 -0.0194362 1 0 1 1 0 0 +EDGE2 3909 3908 -0.970558 0.0576963 -0.023866 1 0 1 1 0 0 +EDGE2 3910 3909 -1.12494 0.0513159 -0.0237168 1 0 1 1 0 0 +EDGE2 3911 3910 -1.03112 0.0181604 -1.57917 1 0 1 1 0 0 +EDGE2 3912 3911 -0.992119 -0.100343 0.00979973 1 0 1 1 0 0 +EDGE2 3913 3912 -1.03994 -0.0359134 -0.0106384 1 0 1 1 0 0 +EDGE2 3914 3913 -0.999414 -0.0153049 -0.00749665 1 0 1 1 0 0 +EDGE2 3915 3914 -0.973239 0.0405177 -0.00859152 1 0 1 1 0 0 +EDGE2 3916 3915 -0.911581 0.0465664 -1.56675 1 0 1 1 0 0 +EDGE2 3917 3916 -1.03689 0.0974884 0.00889977 1 0 1 1 0 0 +EDGE2 3918 3917 -1.01676 0.0304401 -0.00376175 1 0 1 1 0 0 +EDGE2 3919 3918 -0.962073 -0.0649268 0.0264993 1 0 1 1 0 0 +EDGE2 3920 3919 -1.01434 -0.0805709 -0.0190884 1 0 1 1 0 0 +EDGE2 3921 3920 -0.987822 -0.0120973 -1.50797 1 0 1 1 0 0 +EDGE2 3922 3921 -0.950474 0.0542155 0.0259317 1 0 1 1 0 0 +EDGE2 3923 3922 -0.991529 0.0292484 0.0113761 1 0 1 1 0 0 +EDGE2 3924 3923 -0.934405 0.0453659 0.0130307 1 0 1 1 0 0 +EDGE2 3924 3905 1.02495 -0.0305329 -3.16881 1 0 1 1 0 0 +EDGE2 3925 3924 -1.05503 -0.0713289 0.00923318 1 0 1 1 0 0 +EDGE2 3925 3905 0.00759358 -0.00465692 -3.13466 1 0 1 1 0 0 +EDGE2 3925 3904 0.919601 -0.00600024 -3.12242 1 0 1 1 0 0 +EDGE2 3925 3906 0.0722175 0.956058 1.55912 1 0 1 1 0 0 +EDGE2 3926 3905 -1.008 0.0224721 1.52536 1 0 1 1 0 0 +EDGE2 3926 3925 -0.985789 -0.0427732 -1.58888 1 0 1 1 0 0 +EDGE2 3926 3907 1.003 -0.0307405 0.0134711 1 0 1 1 0 0 +EDGE2 3926 3906 0.0184411 -0.0345577 0.0185417 1 0 1 1 0 0 +EDGE2 3927 3907 -0.0298188 -0.0600376 0.0366399 1 0 1 1 0 0 +EDGE2 3927 3906 -1.02504 0.0378591 -0.0112418 1 0 1 1 0 0 +EDGE2 3927 3926 -1.06766 -0.0788098 -0.00126559 1 0 1 1 0 0 +EDGE2 3927 3908 0.990742 -0.00385412 -0.002876 1 0 1 1 0 0 +EDGE2 3928 3907 -0.973555 -0.0591126 0.00293573 1 0 1 1 0 0 +EDGE2 3928 3927 -0.985016 -0.0238586 -0.0373944 1 0 1 1 0 0 +EDGE2 3928 3908 -0.00285244 -0.0977597 -0.0348094 1 0 1 1 0 0 +EDGE2 3928 3909 1.1098 -0.0271384 -0.0074709 1 0 1 1 0 0 +EDGE2 3929 3908 -1.11616 0.0427241 0.0202109 1 0 1 1 0 0 +EDGE2 3929 3928 -0.999707 -0.0530979 0.000704284 1 0 1 1 0 0 +EDGE2 3929 3909 0.0242714 -0.043132 0.00287013 1 0 1 1 0 0 +EDGE2 3929 3910 0.99909 0.0517575 -0.0221637 1 0 1 1 0 0 +EDGE2 3930 3911 0.0257357 1.02523 1.57286 1 0 1 1 0 0 +EDGE2 3930 3929 -0.980975 0.0320052 -0.0396558 1 0 1 1 0 0 +EDGE2 3930 3909 -0.937375 -0.0342089 -0.0193364 1 0 1 1 0 0 +EDGE2 3930 3910 -0.0440142 0.0234274 -0.00011731 1 0 1 1 0 0 +EDGE2 3931 3912 0.955491 -0.0920816 -0.0199289 1 0 1 1 0 0 +EDGE2 3931 3911 -0.0463246 0.0515698 0.0574591 1 0 1 1 0 0 +EDGE2 3931 3910 -0.982038 -0.0155323 -1.54234 1 0 1 1 0 0 +EDGE2 3931 3930 -0.960902 -0.0145769 -1.57845 1 0 1 1 0 0 +EDGE2 3932 3913 0.977302 0.0719117 0.0135805 1 0 1 1 0 0 +EDGE2 3932 3912 -0.0204024 0.0467262 -0.00617341 1 0 1 1 0 0 +EDGE2 3932 3911 -1.01466 0.0165232 0.0395273 1 0 1 1 0 0 +EDGE2 3932 3931 -1.06016 0.0392835 -0.0125502 1 0 1 1 0 0 +EDGE2 3933 3913 0.0169451 0.0911068 0.0144725 1 0 1 1 0 0 +EDGE2 3933 3914 1.03485 0.0325344 -0.0163478 1 0 1 1 0 0 +EDGE2 3933 3932 -1.05553 -0.064288 0.00889699 1 0 1 1 0 0 +EDGE2 3933 3912 -1.09446 -0.0820937 -0.0275587 1 0 1 1 0 0 +EDGE2 3934 3915 0.960055 0.0234491 -0.0169289 1 0 1 1 0 0 +EDGE2 3934 3913 -0.897043 0.0824745 -0.0245618 1 0 1 1 0 0 +EDGE2 3934 3914 -0.0212442 -0.0529861 0.0126279 1 0 1 1 0 0 +EDGE2 3934 3933 -1.05636 -0.0382707 0.0146228 1 0 1 1 0 0 +EDGE2 3935 3916 0.0157197 1.02609 1.52831 1 0 1 1 0 0 +EDGE2 3935 3915 0.00398008 -0.027454 -0.0284052 1 0 1 1 0 0 +EDGE2 3935 3934 -0.954858 0.0121694 0.0118037 1 0 1 1 0 0 +EDGE2 3935 3914 -1.04272 0.0671297 -0.00266505 1 0 1 1 0 0 +EDGE2 3936 3917 0.990802 0.12192 -0.017221 1 0 1 1 0 0 +EDGE2 3936 3916 0.0156308 -0.0901733 -0.000859412 1 0 1 1 0 0 +EDGE2 3936 3935 -0.972774 -0.0308661 -1.57202 1 0 1 1 0 0 +EDGE2 3936 3915 -0.970887 -0.0232685 -1.54815 1 0 1 1 0 0 +EDGE2 3937 3918 1.04729 0.109118 -0.0282815 1 0 1 1 0 0 +EDGE2 3937 3917 0.0110989 0.0411111 0.0505792 1 0 1 1 0 0 +EDGE2 3937 3936 -0.973252 0.0239387 -0.00106782 1 0 1 1 0 0 +EDGE2 3937 3916 -0.964752 -0.00682148 -0.00886226 1 0 1 1 0 0 +EDGE2 3938 3919 0.935236 0.0756454 0.0153816 1 0 1 1 0 0 +EDGE2 3938 3918 -0.0455554 -0.0056064 0.00878275 1 0 1 1 0 0 +EDGE2 3938 3917 -0.991183 -0.0418196 -0.00155436 1 0 1 1 0 0 +EDGE2 3938 3937 -1.09002 -0.00449195 0.027887 1 0 1 1 0 0 +EDGE2 3939 3920 0.939814 -0.0492656 -0.0190914 1 0 1 1 0 0 +EDGE2 3939 3919 0.0299083 -0.0860802 0.0259366 1 0 1 1 0 0 +EDGE2 3939 3918 -1.0112 0.0242035 0.0152331 1 0 1 1 0 0 +EDGE2 3939 3938 -0.947822 0.0187086 -0.0008777 1 0 1 1 0 0 +EDGE2 3940 3920 -0.0301386 -0.0766122 -0.00727441 1 0 1 1 0 0 +EDGE2 3940 3919 -0.999042 -0.0483728 0.00817621 1 0 1 1 0 0 +EDGE2 3940 3939 -1.01786 0.0187227 0.0138533 1 0 1 1 0 0 +EDGE2 3940 3921 0.0197525 1.05223 1.56673 1 0 1 1 0 0 +EDGE2 3941 3920 -0.986999 -0.047727 -1.57154 1 0 1 1 0 0 +EDGE2 3941 3940 -0.998466 0.000419062 -1.58628 1 0 1 1 0 0 +EDGE2 3941 3921 0.0114435 -0.0349048 0.0177358 1 0 1 1 0 0 +EDGE2 3941 3922 1.13955 -0.0289301 -0.00048993 1 0 1 1 0 0 +EDGE2 3942 3921 -0.915284 -0.0773466 -0.0474731 1 0 1 1 0 0 +EDGE2 3942 3941 -1.05259 0.073056 0.000713751 1 0 1 1 0 0 +EDGE2 3942 3922 0.0168199 -0.0370553 0.0083519 1 0 1 1 0 0 +EDGE2 3942 3923 1.01979 -0.0384569 -0.0157159 1 0 1 1 0 0 +EDGE2 3943 3922 -1.02207 -0.0163128 -0.00958816 1 0 1 1 0 0 +EDGE2 3943 3942 -1.01533 0.0614749 0.00932621 1 0 1 1 0 0 +EDGE2 3943 3923 -0.0459106 -0.0201532 0.0183765 1 0 1 1 0 0 +EDGE2 3943 3924 1.06726 0.0563827 0.00456563 1 0 1 1 0 0 +EDGE2 3944 3923 -1.03125 0.0201872 -0.0379593 1 0 1 1 0 0 +EDGE2 3944 3943 -0.997107 -0.0553245 -0.0329665 1 0 1 1 0 0 +EDGE2 3944 3924 0.0217554 -0.0246538 0.0150582 1 0 1 1 0 0 +EDGE2 3944 3905 0.965519 -0.0726516 -3.15505 1 0 1 1 0 0 +EDGE2 3944 3925 1.01901 0.0780831 -0.0209593 1 0 1 1 0 0 +EDGE2 3945 3944 -0.996988 0.0290074 -0.00343808 1 0 1 1 0 0 +EDGE2 3945 3924 -1.05315 0.044913 -0.0178051 1 0 1 1 0 0 +EDGE2 3945 3905 0.0584766 0.0125898 -3.18389 1 0 1 1 0 0 +EDGE2 3945 3925 0.0266953 -0.0766206 0.0022219 1 0 1 1 0 0 +EDGE2 3945 3904 1.01244 0.0607183 -3.12718 1 0 1 1 0 0 +EDGE2 3945 3906 -0.0396637 0.988207 1.61214 1 0 1 1 0 0 +EDGE2 3945 3926 0.0372485 0.96844 1.6022 1 0 1 1 0 0 +EDGE2 3946 3905 -0.944443 0.0235196 1.56951 1 0 1 1 0 0 +EDGE2 3946 3945 -1.04062 0.00546128 -1.55495 1 0 1 1 0 0 +EDGE2 3946 3925 -1.04819 0.00515446 -1.57483 1 0 1 1 0 0 +EDGE2 3946 3907 0.997053 -0.000193128 -0.00106589 1 0 1 1 0 0 +EDGE2 3946 3906 -0.00747231 0.0548691 -0.00320364 1 0 1 1 0 0 +EDGE2 3946 3926 0.0543692 -0.157348 0.0024475 1 0 1 1 0 0 +EDGE2 3946 3927 1.05452 -0.075905 0.0142697 1 0 1 1 0 0 +EDGE2 3947 3907 -0.00153953 0.00933562 -0.0016013 1 0 1 1 0 0 +EDGE2 3947 3906 -1.07098 -0.0292647 -0.0123737 1 0 1 1 0 0 +EDGE2 3947 3946 -1.04018 0.0163899 0.0123234 1 0 1 1 0 0 +EDGE2 3947 3926 -0.955036 0.00330182 0.0226719 1 0 1 1 0 0 +EDGE2 3947 3927 0.0526602 -0.0643524 0.0112873 1 0 1 1 0 0 +EDGE2 3947 3908 1.076 -0.0488513 0.0172314 1 0 1 1 0 0 +EDGE2 3947 3928 0.952832 -0.0590619 0.0210062 1 0 1 1 0 0 +EDGE2 3948 3929 0.904645 0.0395359 -0.00925849 1 0 1 1 0 0 +EDGE2 3948 3907 -1.00182 -0.0264765 -0.00418452 1 0 1 1 0 0 +EDGE2 3948 3947 -1.05789 -0.00233179 0.00143624 1 0 1 1 0 0 +EDGE2 3948 3927 -1.04843 0.0141495 0.00811619 1 0 1 1 0 0 +EDGE2 3948 3908 0.0527842 0.0092892 -0.0389522 1 0 1 1 0 0 +EDGE2 3948 3928 0.0115994 0.0727001 -0.0426357 1 0 1 1 0 0 +EDGE2 3948 3909 0.958528 -0.0777948 0.0166825 1 0 1 1 0 0 +EDGE2 3949 3929 -0.00621143 -0.0126501 0.016701 1 0 1 1 0 0 +EDGE2 3949 3908 -0.978369 -0.0424552 0.0224362 1 0 1 1 0 0 +EDGE2 3949 3948 -0.945632 0.0102385 0.012518 1 0 1 1 0 0 +EDGE2 3949 3928 -0.977616 -0.0309899 -0.00163683 1 0 1 1 0 0 +EDGE2 3949 3909 0.0386844 0.103702 -0.0183206 1 0 1 1 0 0 +EDGE2 3949 3910 0.885718 0.0433284 0.0355569 1 0 1 1 0 0 +EDGE2 3949 3930 1.07437 -0.146406 0.0102858 1 0 1 1 0 0 +EDGE2 3950 3911 0.00979259 1.06526 1.57975 1 0 1 1 0 0 +EDGE2 3950 3931 -0.00648319 0.995451 1.60501 1 0 1 1 0 0 +EDGE2 3950 3929 -1.00147 -0.00680782 0.00356795 1 0 1 1 0 0 +EDGE2 3950 3949 -1.00036 0.0260043 -0.0151639 1 0 1 1 0 0 +EDGE2 3950 3909 -0.960941 -0.00856196 -0.00533343 1 0 1 1 0 0 +EDGE2 3950 3910 -0.0134226 0.0701394 -0.0157263 1 0 1 1 0 0 +EDGE2 3950 3930 0.0261308 0.00560371 0.0124003 1 0 1 1 0 0 +EDGE2 3951 3910 -0.971802 -0.0351151 1.58857 1 0 1 1 0 0 +EDGE2 3951 3930 -0.980358 -0.0697302 1.59074 1 0 1 1 0 0 +EDGE2 3951 3950 -0.949694 0.0284252 1.57523 1 0 1 1 0 0 +EDGE2 3952 3951 -0.95971 -0.062881 0.0125898 1 0 1 1 0 0 +EDGE2 3953 3952 -1.09334 -0.02334 -0.0135945 1 0 1 1 0 0 +EDGE2 3954 3953 -1.0382 0.0842166 0.0114412 1 0 1 1 0 0 +EDGE2 3955 3954 -0.999863 -0.0498993 -0.0251834 1 0 1 1 0 0 +EDGE2 3956 3955 -1.00196 0.0171728 -1.58399 1 0 1 1 0 0 +EDGE2 3957 3956 -0.990549 0.0308184 0.00471402 1 0 1 1 0 0 +EDGE2 3958 3957 -1.06241 -0.00239737 0.0153096 1 0 1 1 0 0 +EDGE2 3959 3958 -0.967009 -0.0802261 -0.0391654 1 0 1 1 0 0 +EDGE2 3960 3959 -1.03402 0.0124275 0.00745966 1 0 1 1 0 0 +EDGE2 3961 3960 -0.970434 0.0750717 -1.56206 1 0 1 1 0 0 +EDGE2 3962 3961 -1.00932 -0.00578213 -0.00470261 1 0 1 1 0 0 +EDGE2 3963 3962 -1.01108 -0.0147562 0.0071492 1 0 1 1 0 0 +EDGE2 3964 3963 -0.953895 0.0151128 0.00152007 1 0 1 1 0 0 +EDGE2 3965 3964 -1.06277 -0.0429947 0.0188279 1 0 1 1 0 0 +EDGE2 3966 3965 -0.916034 -0.0211437 -1.57096 1 0 1 1 0 0 +EDGE2 3967 3966 -1.01797 0.00987651 -0.0133266 1 0 1 1 0 0 +EDGE2 3968 3967 -0.986863 -0.0640326 -0.0117027 1 0 1 1 0 0 +EDGE2 3969 3910 1.03513 -0.100887 -3.17816 1 0 1 1 0 0 +EDGE2 3969 3930 1.00164 -0.0182385 -3.16117 1 0 1 1 0 0 +EDGE2 3969 3950 1.04372 -0.0736253 -3.12619 1 0 1 1 0 0 +EDGE2 3969 3968 -0.986812 -0.0510488 0.0262651 1 0 1 1 0 0 +EDGE2 3970 3911 0.0444631 -1.1243 -1.59159 1 0 1 1 0 0 +EDGE2 3970 3931 0.0715123 -1.02702 -1.59484 1 0 1 1 0 0 +EDGE2 3970 3929 1.05181 -0.0597557 -3.1399 1 0 1 1 0 0 +EDGE2 3970 3949 0.95093 0.0406906 -3.11152 1 0 1 1 0 0 +EDGE2 3970 3969 -0.952596 -0.13264 0.0108192 1 0 1 1 0 0 +EDGE2 3970 3909 1.01085 -0.0232441 -3.15708 1 0 1 1 0 0 +EDGE2 3970 3910 -0.0574641 0.0677911 -3.13988 1 0 1 1 0 0 +EDGE2 3970 3930 0.0649298 0.0122547 -3.12908 1 0 1 1 0 0 +EDGE2 3970 3950 0.038176 0.0638552 -3.13451 1 0 1 1 0 0 +EDGE2 3970 3951 0.0131745 0.99253 1.58617 1 0 1 1 0 0 +EDGE2 3971 3932 0.968869 0.0492431 -0.0188018 1 0 1 1 0 0 +EDGE2 3971 3912 0.958801 -0.0164471 -0.0263084 1 0 1 1 0 0 +EDGE2 3971 3911 0.0386739 -0.0174311 -0.0192916 1 0 1 1 0 0 +EDGE2 3971 3931 0.082298 -0.042842 0.0064814 1 0 1 1 0 0 +EDGE2 3971 3970 -0.996633 0.00358038 1.54402 1 0 1 1 0 0 +EDGE2 3971 3910 -1.00487 -0.043232 -1.56532 1 0 1 1 0 0 +EDGE2 3971 3930 -0.996433 -0.0497484 -1.58136 1 0 1 1 0 0 +EDGE2 3971 3950 -0.990804 0.0254635 -1.56214 1 0 1 1 0 0 +EDGE2 3972 3971 -1.08409 -0.0524833 0.013084 1 0 1 1 0 0 +EDGE2 3972 3913 1.03328 0.0878341 0.020849 1 0 1 1 0 0 +EDGE2 3972 3933 1.0092 -0.0545366 0.00373185 1 0 1 1 0 0 +EDGE2 3972 3932 0.00131465 -0.0515006 -0.0506972 1 0 1 1 0 0 +EDGE2 3972 3912 -0.0878919 0.0291784 0.0247677 1 0 1 1 0 0 +EDGE2 3972 3911 -0.917835 -0.00889304 -0.0238759 1 0 1 1 0 0 +EDGE2 3972 3931 -0.964628 0.134682 0.00401164 1 0 1 1 0 0 +EDGE2 3973 3913 0.0786644 0.0335015 -0.0189114 1 0 1 1 0 0 +EDGE2 3973 3934 0.951365 0.0434417 -0.0126324 1 0 1 1 0 0 +EDGE2 3973 3914 0.964273 0.0322573 -0.0217306 1 0 1 1 0 0 +EDGE2 3973 3933 0.0579518 -0.0395799 0.00376587 1 0 1 1 0 0 +EDGE2 3973 3932 -1.06709 -0.0155197 -0.0238468 1 0 1 1 0 0 +EDGE2 3973 3972 -1.01824 0.0127704 -0.0306134 1 0 1 1 0 0 +EDGE2 3973 3912 -1.09052 0.100596 0.0456727 1 0 1 1 0 0 +EDGE2 3974 3935 1.02479 -0.0450627 -0.0283511 1 0 1 1 0 0 +EDGE2 3974 3915 1.03151 -0.0112919 -0.0334844 1 0 1 1 0 0 +EDGE2 3974 3913 -1.02925 -0.0543924 -0.00523848 1 0 1 1 0 0 +EDGE2 3974 3934 0.00755197 0.0807852 -1.06975e-05 1 0 1 1 0 0 +EDGE2 3974 3914 -0.0192483 0.0181239 -0.00802741 1 0 1 1 0 0 +EDGE2 3974 3973 -0.999973 -0.0064123 -0.00841298 1 0 1 1 0 0 +EDGE2 3974 3933 -1.03385 -0.0023044 0.027361 1 0 1 1 0 0 +EDGE2 3975 3936 0.00693846 0.984496 1.60144 1 0 1 1 0 0 +EDGE2 3975 3916 -0.0272905 1.03122 1.59038 1 0 1 1 0 0 +EDGE2 3975 3935 0.0706728 -0.0234537 -0.034319 1 0 1 1 0 0 +EDGE2 3975 3915 0.016178 0.0124553 -0.0369963 1 0 1 1 0 0 +EDGE2 3975 3934 -1.01956 -0.0174279 -0.00309919 1 0 1 1 0 0 +EDGE2 3975 3974 -1.03227 -0.0483172 -0.0160358 1 0 1 1 0 0 +EDGE2 3975 3914 -1.02603 -0.0762194 -0.0203809 1 0 1 1 0 0 +EDGE2 3976 3935 -1.03765 0.0582397 1.57021 1 0 1 1 0 0 +EDGE2 3976 3975 -0.982474 0.0158827 1.54256 1 0 1 1 0 0 +EDGE2 3976 3915 -1.00831 0.0744972 1.57043 1 0 1 1 0 0 +EDGE2 3977 3976 -1.07035 -0.0997909 0.0465229 1 0 1 1 0 0 +EDGE2 3978 3977 -0.90622 0.0395775 -0.0147538 1 0 1 1 0 0 +EDGE2 3979 3978 -0.93032 0.0580046 -0.0106222 1 0 1 1 0 0 +EDGE2 3980 3979 -1.03912 0.0303219 0.0101662 1 0 1 1 0 0 +EDGE2 3981 3980 -1.1614 -0.106407 -1.55191 1 0 1 1 0 0 +EDGE2 3982 3981 -0.937661 0.0969444 -0.0122265 1 0 1 1 0 0 +EDGE2 3983 3982 -1.03195 -0.101607 -0.0189871 1 0 1 1 0 0 +EDGE2 3984 3983 -0.955031 -0.063439 -0.014379 1 0 1 1 0 0 +EDGE2 3985 3984 -1.03553 0.052987 -0.0130743 1 0 1 1 0 0 +EDGE2 3986 3985 -1.06033 0.0402089 -1.57226 1 0 1 1 0 0 +EDGE2 3987 3986 -0.958071 0.0486767 0.0186408 1 0 1 1 0 0 +EDGE2 3988 3987 -1.08821 0.0148985 0.0149148 1 0 1 1 0 0 +EDGE2 3989 3988 -0.908154 -0.0140113 0.028241 1 0 1 1 0 0 +EDGE2 3990 3989 -1.04933 0.0331141 0.0298341 1 0 1 1 0 0 +EDGE2 3991 3990 -0.853795 -0.028507 -1.54628 1 0 1 1 0 0 +EDGE2 3992 3991 -1.02045 0.0506408 -0.00799231 1 0 1 1 0 0 +EDGE2 3993 3992 -0.966169 0.0522706 -0.0284819 1 0 1 1 0 0 +EDGE2 3994 3993 -0.988849 0.0245186 -0.0237364 1 0 1 1 0 0 +EDGE2 3994 3935 1.06276 0.00152448 -3.15498 1 0 1 1 0 0 +EDGE2 3994 3975 0.937571 0.0129532 -3.10212 1 0 1 1 0 0 +EDGE2 3994 3915 1.02088 -0.0716136 -3.10513 1 0 1 1 0 0 +EDGE2 3995 3936 0.00926493 -0.981424 -1.55877 1 0 1 1 0 0 +EDGE2 3995 3916 0.0130684 -1.05768 -1.55171 1 0 1 1 0 0 +EDGE2 3995 3994 -0.97423 0.00388246 -0.0108545 1 0 1 1 0 0 +EDGE2 3995 3935 0.0767379 -0.0163454 -3.18358 1 0 1 1 0 0 +EDGE2 3995 3975 0.0529235 0.0196653 -3.11878 1 0 1 1 0 0 +EDGE2 3995 3915 -0.0914331 -0.0515895 -3.13281 1 0 1 1 0 0 +EDGE2 3995 3976 0.0793842 0.953859 1.56792 1 0 1 1 0 0 +EDGE2 3995 3934 1.0241 0.00624019 -3.11999 1 0 1 1 0 0 +EDGE2 3995 3974 1.01046 -0.0268323 -3.15985 1 0 1 1 0 0 +EDGE2 3995 3914 1.04582 0.030831 -3.16646 1 0 1 1 0 0 +EDGE2 3996 3977 1.01641 -0.0284668 -0.0152739 1 0 1 1 0 0 +EDGE2 3996 3935 -1.04588 0.0345823 1.6145 1 0 1 1 0 0 +EDGE2 3996 3975 -1.06534 -0.0397338 1.59511 1 0 1 1 0 0 +EDGE2 3996 3995 -0.939844 -0.00796382 -1.59224 1 0 1 1 0 0 +EDGE2 3996 3915 -1.07096 0.0345696 1.5961 1 0 1 1 0 0 +EDGE2 3996 3976 -0.0145956 -0.0515745 0.0303266 1 0 1 1 0 0 +EDGE2 3997 3977 0.025686 0.0105479 0.0398997 1 0 1 1 0 0 +EDGE2 3997 3976 -1.10004 0.0944381 0.02807 1 0 1 1 0 0 +EDGE2 3997 3996 -1.01544 0.0972944 -0.0358802 1 0 1 1 0 0 +EDGE2 3997 3978 1.05409 -0.00740925 0.00423157 1 0 1 1 0 0 +EDGE2 3998 3977 -0.953332 -0.0511217 0.00426294 1 0 1 1 0 0 +EDGE2 3998 3997 -1.01696 -0.048781 0.0168415 1 0 1 1 0 0 +EDGE2 3998 3978 0.0817679 -0.067804 0.00186429 1 0 1 1 0 0 +EDGE2 3998 3979 0.988736 0.0596446 -0.0287263 1 0 1 1 0 0 +EDGE2 3999 3998 -0.994827 0.0294717 0.00815113 1 0 1 1 0 0 +EDGE2 3999 3978 -0.987245 0.00799329 -0.0112637 1 0 1 1 0 0 +EDGE2 3999 3979 0.0423458 0.0407715 0.0148597 1 0 1 1 0 0 +EDGE2 3999 3980 1.07894 0.025922 -0.018046 1 0 1 1 0 0 +EDGE2 4000 3981 0.0449363 0.99433 1.59006 1 0 1 1 0 0 +EDGE2 4000 3999 -1.01882 0.0320901 0.000843137 1 0 1 1 0 0 +EDGE2 4000 3979 -0.989874 0.0182749 0.0189633 1 0 1 1 0 0 +EDGE2 4000 3980 -0.000494251 -0.0604098 -0.0409132 1 0 1 1 0 0 +EDGE2 4001 3982 0.974421 0.0933596 -0.00842304 1 0 1 1 0 0 +EDGE2 4001 3981 0.00424235 0.142219 0.00536156 1 0 1 1 0 0 +EDGE2 4001 4000 -1.0845 -0.0362491 -1.58643 1 0 1 1 0 0 +EDGE2 4001 3980 -0.976125 0.0196162 -1.58932 1 0 1 1 0 0 +EDGE2 4002 3983 0.941996 -0.00245882 0.00622596 1 0 1 1 0 0 +EDGE2 4002 4001 -0.908828 0.0341292 -0.0294848 1 0 1 1 0 0 +EDGE2 4002 3982 0.0731837 0.0510515 -0.02147 1 0 1 1 0 0 +EDGE2 4002 3981 -0.94633 -0.064486 -0.00735958 1 0 1 1 0 0 +EDGE2 4003 3983 -0.0695563 0.0586414 0.0162916 1 0 1 1 0 0 +EDGE2 4003 3984 1.04495 -0.000948157 0.00323333 1 0 1 1 0 0 +EDGE2 4003 3982 -1.01801 0.0121855 0.0144919 1 0 1 1 0 0 +EDGE2 4003 4002 -0.906636 -0.000227978 -0.0237669 1 0 1 1 0 0 +EDGE2 4004 3985 1.00245 0.0309844 -0.0037758 1 0 1 1 0 0 +EDGE2 4004 3983 -0.973757 0.0377757 -0.0124754 1 0 1 1 0 0 +EDGE2 4004 3984 0.0169983 0.0378249 0.00796035 1 0 1 1 0 0 +EDGE2 4004 4003 -1.0821 0.043369 0.0108074 1 0 1 1 0 0 +EDGE2 4005 3986 0.072014 1.06224 1.56184 1 0 1 1 0 0 +EDGE2 4005 3985 -0.0165262 -0.029118 0.0130792 1 0 1 1 0 0 +EDGE2 4005 3984 -0.978215 0.0406802 -0.000704176 1 0 1 1 0 0 +EDGE2 4005 4004 -1.00641 0.0623211 0.0208539 1 0 1 1 0 0 +EDGE2 4006 3987 0.974713 -0.00173849 0.0108086 1 0 1 1 0 0 +EDGE2 4006 4005 -1.0447 0.0769029 -1.54727 1 0 1 1 0 0 +EDGE2 4006 3986 -0.107012 -0.0851227 0.00337384 1 0 1 1 0 0 +EDGE2 4006 3985 -1.03772 0.0224761 -1.57633 1 0 1 1 0 0 +EDGE2 4007 4006 -0.99999 0.00395403 0.0281809 1 0 1 1 0 0 +EDGE2 4007 3988 0.985964 0.0371594 -0.0105052 1 0 1 1 0 0 +EDGE2 4007 3987 -0.0495683 -0.0339846 -0.0112463 1 0 1 1 0 0 +EDGE2 4007 3986 -1.01296 -0.00912437 -0.0109205 1 0 1 1 0 0 +EDGE2 4008 3989 0.994223 -0.0539417 -0.0154472 1 0 1 1 0 0 +EDGE2 4008 4007 -0.934974 0.0134691 0.00356569 1 0 1 1 0 0 +EDGE2 4008 3988 -0.120066 -0.00615467 -0.00264558 1 0 1 1 0 0 +EDGE2 4008 3987 -1.00306 0.00352838 -0.00875325 1 0 1 1 0 0 +EDGE2 4009 3989 -0.0531904 -0.0652076 0.0390614 1 0 1 1 0 0 +EDGE2 4009 3990 1.08171 0.0825465 0.00172492 1 0 1 1 0 0 +EDGE2 4009 3988 -0.978054 -0.0250194 -0.00274265 1 0 1 1 0 0 +EDGE2 4009 4008 -1.01571 0.00531535 -0.0175111 1 0 1 1 0 0 +EDGE2 4010 3989 -1.05428 -0.0413852 0.0312596 1 0 1 1 0 0 +EDGE2 4010 3990 -0.0292735 -0.0809936 0.00415125 1 0 1 1 0 0 +EDGE2 4010 4009 -1.03621 -0.0665475 0.00936737 1 0 1 1 0 0 +EDGE2 4010 3991 0.062527 1.0789 1.59322 1 0 1 1 0 0 +EDGE2 4011 3990 -1.02356 0.0166988 -1.56898 1 0 1 1 0 0 +EDGE2 4011 4010 -0.998137 -0.0502791 -1.60144 1 0 1 1 0 0 +EDGE2 4011 3991 0.0448677 -0.0343521 0.00735965 1 0 1 1 0 0 +EDGE2 4011 3992 0.997378 -0.0614224 -0.00446095 1 0 1 1 0 0 +EDGE2 4012 3991 -1.08712 0.0506498 -0.00496774 1 0 1 1 0 0 +EDGE2 4012 4011 -0.981832 -0.00758946 0.0210987 1 0 1 1 0 0 +EDGE2 4012 3992 0.0398165 0.0113989 -0.0148025 1 0 1 1 0 0 +EDGE2 4012 3993 0.937453 0.00346322 -0.0500147 1 0 1 1 0 0 +EDGE2 4013 3992 -0.993734 0.0166062 -0.0181981 1 0 1 1 0 0 +EDGE2 4013 4012 -1.02178 0.0776456 0.020614 1 0 1 1 0 0 +EDGE2 4013 3993 -0.041514 0.0558947 0.00859699 1 0 1 1 0 0 +EDGE2 4013 3994 1.01407 -0.0525147 0.00588399 1 0 1 1 0 0 +EDGE2 4014 4013 -1.00563 0.00785739 -0.0212129 1 0 1 1 0 0 +EDGE2 4014 3993 -1.01072 -0.0257498 -0.00606239 1 0 1 1 0 0 +EDGE2 4014 3994 0.0330511 0.0620249 0.00731587 1 0 1 1 0 0 +EDGE2 4014 3935 0.974154 0.0941433 -3.10167 1 0 1 1 0 0 +EDGE2 4014 3975 1.05967 0.0365069 -3.15848 1 0 1 1 0 0 +EDGE2 4014 3995 1.04077 -0.105995 0.0108651 1 0 1 1 0 0 +EDGE2 4014 3915 1.04028 0.0212543 -3.09458 1 0 1 1 0 0 +EDGE2 4015 3936 0.000277872 -1.04352 -1.54661 1 0 1 1 0 0 +EDGE2 4015 3916 0.0767657 -0.997792 -1.55366 1 0 1 1 0 0 +EDGE2 4015 4014 -1.01149 0.00388699 0.0256284 1 0 1 1 0 0 +EDGE2 4015 3994 -0.990218 0.0855245 -0.00358856 1 0 1 1 0 0 +EDGE2 4015 3935 -0.0270215 -0.0693601 -3.14056 1 0 1 1 0 0 +EDGE2 4015 3975 -0.025519 0.0254874 -3.14627 1 0 1 1 0 0 +EDGE2 4015 3995 0.0170501 0.0265776 0.000967754 1 0 1 1 0 0 +EDGE2 4015 3915 0.0604244 -0.0367459 -3.17076 1 0 1 1 0 0 +EDGE2 4015 3976 0.00788304 1.04591 1.56954 1 0 1 1 0 0 +EDGE2 4015 3996 -0.0177989 1.01569 1.55676 1 0 1 1 0 0 +EDGE2 4015 3934 1.02477 -0.00744471 -3.15809 1 0 1 1 0 0 +EDGE2 4015 3974 1.02786 -0.0709026 -3.15882 1 0 1 1 0 0 +EDGE2 4015 3914 0.925938 0.00605082 -3.15331 1 0 1 1 0 0 +EDGE2 4016 3977 0.963186 0.0314147 0.0142985 1 0 1 1 0 0 +EDGE2 4016 4015 -1.02591 0.0596763 -1.54497 1 0 1 1 0 0 +EDGE2 4016 3935 -0.983623 0.082585 1.53566 1 0 1 1 0 0 +EDGE2 4016 3975 -0.962599 -0.00925951 1.57664 1 0 1 1 0 0 +EDGE2 4016 3995 -1.01403 -0.0997539 -1.5836 1 0 1 1 0 0 +EDGE2 4016 3915 -1.03155 -0.110404 1.57988 1 0 1 1 0 0 +EDGE2 4016 3976 0.0014641 -0.0512054 0.0272914 1 0 1 1 0 0 +EDGE2 4016 3996 0.0701133 0.0350728 0.00928659 1 0 1 1 0 0 +EDGE2 4016 3997 1.00997 0.0425742 0.00947823 1 0 1 1 0 0 +EDGE2 4017 3977 0.0378632 0.0206617 0.00805449 1 0 1 1 0 0 +EDGE2 4017 4016 -0.983505 0.0673159 -0.0124727 1 0 1 1 0 0 +EDGE2 4017 3976 -1.031 0.00701482 0.025518 1 0 1 1 0 0 +EDGE2 4017 3996 -0.988852 0.111957 0.0265636 1 0 1 1 0 0 +EDGE2 4017 3997 0.0331825 0.0122699 0.0187088 1 0 1 1 0 0 +EDGE2 4017 3998 1.03035 0.0341383 -0.0213949 1 0 1 1 0 0 +EDGE2 4017 3978 1.10505 0.019095 -0.0146992 1 0 1 1 0 0 +EDGE2 4018 3977 -1.07664 -0.0410196 0.026788 1 0 1 1 0 0 +EDGE2 4018 4017 -0.940613 0.0817194 -0.00617047 1 0 1 1 0 0 +EDGE2 4018 3997 -0.867011 -0.0513418 0.0152476 1 0 1 1 0 0 +EDGE2 4018 3998 -0.0347409 0.0281853 -0.041169 1 0 1 1 0 0 +EDGE2 4018 3999 0.940834 -0.0537633 -0.0136394 1 0 1 1 0 0 +EDGE2 4018 3978 0.0701435 -0.0190943 0.0177633 1 0 1 1 0 0 +EDGE2 4018 3979 1.03848 0.0486944 -0.0115306 1 0 1 1 0 0 +EDGE2 4019 3998 -0.943057 0.119997 -0.0278866 1 0 1 1 0 0 +EDGE2 4019 4018 -1.04958 0.0485081 -0.0121006 1 0 1 1 0 0 +EDGE2 4019 3999 0.00958824 -0.0352637 -0.0176406 1 0 1 1 0 0 +EDGE2 4019 3978 -1.01432 0.0665252 -0.00790708 1 0 1 1 0 0 +EDGE2 4019 3979 -0.042681 0.0289869 -0.00358355 1 0 1 1 0 0 +EDGE2 4019 4000 0.952197 0.0843878 -0.0248328 1 0 1 1 0 0 +EDGE2 4019 3980 0.962211 -0.094058 -0.00403153 1 0 1 1 0 0 +EDGE2 4020 4001 -0.0726904 0.985112 1.56759 1 0 1 1 0 0 +EDGE2 4020 3981 -0.115244 1.00293 1.56167 1 0 1 1 0 0 +EDGE2 4020 3999 -1.06051 0.089139 -0.0159834 1 0 1 1 0 0 +EDGE2 4020 4019 -0.986547 0.0227668 0.00734384 1 0 1 1 0 0 +EDGE2 4020 3979 -0.999732 0.0755819 0.0153339 1 0 1 1 0 0 +EDGE2 4020 4000 -0.0396675 0.0962443 0.00393088 1 0 1 1 0 0 +EDGE2 4020 3980 0.0382539 -0.0608006 -0.0402671 1 0 1 1 0 0 +EDGE2 4021 4000 -0.943071 0.0961398 1.5571 1 0 1 1 0 0 +EDGE2 4021 4020 -0.937567 -0.0205232 1.59397 1 0 1 1 0 0 +EDGE2 4021 3980 -0.999047 -0.0378703 1.59537 1 0 1 1 0 0 +EDGE2 4022 4021 -0.944669 0.0830999 0.00260287 1 0 1 1 0 0 +EDGE2 4023 4022 -1.10528 0.00174373 -0.00970124 1 0 1 1 0 0 +EDGE2 4024 4023 -1.00362 -0.0192055 0.0254577 1 0 1 1 0 0 +EDGE2 4024 3965 1.10834 -0.0257793 -3.17198 1 0 1 1 0 0 +EDGE2 4025 4024 -0.948948 0.0134924 -0.0240069 1 0 1 1 0 0 +EDGE2 4025 3966 0.0457958 -1.03815 -1.56946 1 0 1 1 0 0 +EDGE2 4025 3965 0.0966231 -0.0105338 -3.11898 1 0 1 1 0 0 +EDGE2 4025 3964 1.0299 0.012309 -3.13081 1 0 1 1 0 0 +EDGE2 4026 3965 -0.947176 -0.0632 1.56341 1 0 1 1 0 0 +EDGE2 4026 4025 -0.973008 0.0019688 -1.59892 1 0 1 1 0 0 +EDGE2 4027 4026 -0.967816 0.0191693 0.0139075 1 0 1 1 0 0 +EDGE2 4028 4027 -0.972595 -0.0703494 0.0061428 1 0 1 1 0 0 +EDGE2 4029 4028 -1.03378 -0.012679 -0.0112034 1 0 1 1 0 0 +EDGE2 4030 4029 -0.953037 -0.00550354 -0.00278674 1 0 1 1 0 0 +EDGE2 4031 4030 -0.954519 -0.0629059 1.56022 1 0 1 1 0 0 +EDGE2 4032 4031 -1.00885 0.000843739 -0.0312053 1 0 1 1 0 0 +EDGE2 4033 4032 -0.990345 0.0588982 0.00163117 1 0 1 1 0 0 +EDGE2 4034 4033 -0.983136 0.00787374 -0.0138948 1 0 1 1 0 0 +EDGE2 4035 4034 -1.03266 0.0244233 0.0282075 1 0 1 1 0 0 +EDGE2 4036 4035 -1.00051 0.0258409 1.54326 1 0 1 1 0 0 +EDGE2 4037 4036 -0.998463 -0.0895462 -0.0114935 1 0 1 1 0 0 +EDGE2 4038 4037 -1.01428 -0.0488306 0.0149845 1 0 1 1 0 0 +EDGE2 4039 3960 0.978539 -0.0258281 -3.15776 1 0 1 1 0 0 +EDGE2 4039 4038 -0.923052 -0.0692094 0.00506203 1 0 1 1 0 0 +EDGE2 4040 3960 0.0184554 -0.0785404 -3.15979 1 0 1 1 0 0 +EDGE2 4040 3959 1.05169 0.0284985 -3.1666 1 0 1 1 0 0 +EDGE2 4040 3961 -0.0597764 -0.936497 -1.58132 1 0 1 1 0 0 +EDGE2 4040 4039 -0.895669 0.0404987 -0.0419637 1 0 1 1 0 0 +EDGE2 4041 3960 -0.961405 0.011121 1.536 1 0 1 1 0 0 +EDGE2 4041 4040 -1.04482 0.036684 -1.56787 1 0 1 1 0 0 +EDGE2 4042 4041 -1.02152 0.0468282 -0.0159603 1 0 1 1 0 0 +EDGE2 4043 4042 -1.07344 0.0499226 0.0217412 1 0 1 1 0 0 +EDGE2 4044 4043 -0.995265 -0.0147589 0.00984991 1 0 1 1 0 0 +EDGE2 4045 4044 -1.09847 -0.0331528 -0.0197719 1 0 1 1 0 0 +EDGE2 4046 4045 -0.985977 0.0508926 1.59604 1 0 1 1 0 0 +EDGE2 4047 4046 -0.999219 -0.0706197 0.0100908 1 0 1 1 0 0 +EDGE2 4048 4047 -1.03716 0.0378143 0.00663412 1 0 1 1 0 0 +EDGE2 4049 4048 -1.00091 -0.0891356 0.00347785 1 0 1 1 0 0 +EDGE2 4050 4049 -0.951715 -0.0984415 -0.00114586 1 0 1 1 0 0 +EDGE2 4051 4050 -1.0087 0.0055724 -1.58577 1 0 1 1 0 0 +EDGE2 4052 4051 -0.924298 0.034181 -0.0175241 1 0 1 1 0 0 +EDGE2 4053 4052 -0.912856 0.0149288 -0.0492777 1 0 1 1 0 0 +EDGE2 4054 4053 -0.980796 -0.0695152 -0.00458233 1 0 1 1 0 0 +EDGE2 4055 4054 -1.00641 -0.0549875 -0.0493418 1 0 1 1 0 0 +EDGE2 4056 4055 -0.98018 0.0682803 -1.55088 1 0 1 1 0 0 +EDGE2 4057 4056 -1.02405 0.0365275 0.00807948 1 0 1 1 0 0 +EDGE2 4058 4057 -0.973464 0.0266896 -0.0406113 1 0 1 1 0 0 +EDGE2 4059 4058 -0.968658 0.027993 -0.0359339 1 0 1 1 0 0 +EDGE2 4060 4059 -1.08639 -0.11576 -0.0122831 1 0 1 1 0 0 +EDGE2 4061 4060 -1.00013 0.0346303 -1.60502 1 0 1 1 0 0 +EDGE2 4062 4061 -1.09209 0.0990123 -0.00110964 1 0 1 1 0 0 +EDGE2 4063 4062 -1.02746 -0.0586183 -0.031227 1 0 1 1 0 0 +EDGE2 4064 4063 -1.03062 -0.0153529 -0.0142513 1 0 1 1 0 0 +EDGE2 4064 4045 1.01427 0.0446839 -3.14675 1 0 1 1 0 0 +EDGE2 4065 4046 0.00219762 0.979672 1.56697 1 0 1 1 0 0 +EDGE2 4065 4045 -0.0175805 -0.0246884 -3.16844 1 0 1 1 0 0 +EDGE2 4065 4044 0.999581 0.0497128 -3.14356 1 0 1 1 0 0 +EDGE2 4065 4064 -0.95838 -0.0381187 0.0137924 1 0 1 1 0 0 +EDGE2 4066 4047 0.947004 0.013542 0.0214027 1 0 1 1 0 0 +EDGE2 4066 4046 0.0171898 -0.120529 -0.030661 1 0 1 1 0 0 +EDGE2 4066 4045 -1.02301 -0.0530662 1.59453 1 0 1 1 0 0 +EDGE2 4066 4065 -1.03877 -0.0531598 -1.59831 1 0 1 1 0 0 +EDGE2 4067 4047 0.0023582 0.00424872 -0.0170018 1 0 1 1 0 0 +EDGE2 4067 4048 0.953334 0.00381692 0.0228027 1 0 1 1 0 0 +EDGE2 4067 4046 -1.02356 0.000638489 -0.00120048 1 0 1 1 0 0 +EDGE2 4067 4066 -1.07106 -0.0201241 0.0107965 1 0 1 1 0 0 +EDGE2 4068 4049 0.981493 0.0770439 -0.0272068 1 0 1 1 0 0 +EDGE2 4068 4047 -0.944488 0.0754092 -0.0251824 1 0 1 1 0 0 +EDGE2 4068 4048 0.0469909 -0.0290903 -0.00296566 1 0 1 1 0 0 +EDGE2 4068 4067 -1.03943 -0.0361932 -0.00436041 1 0 1 1 0 0 +EDGE2 4069 4050 0.995023 0.0396726 0.000853921 1 0 1 1 0 0 +EDGE2 4069 4049 -0.0416321 -0.015248 0.028905 1 0 1 1 0 0 +EDGE2 4069 4048 -0.948194 -0.0130082 0.0171832 1 0 1 1 0 0 +EDGE2 4069 4068 -0.944917 -0.0172062 -0.0189035 1 0 1 1 0 0 +EDGE2 4070 4050 -0.0483691 -0.016414 -0.025542 1 0 1 1 0 0 +EDGE2 4070 4051 -0.00756686 0.998828 1.5811 1 0 1 1 0 0 +EDGE2 4070 4049 -1.01776 -0.0539569 -0.0112398 1 0 1 1 0 0 +EDGE2 4070 4069 -1.01174 0.1021 0.0103674 1 0 1 1 0 0 +EDGE2 4071 4050 -1.04512 0.0130539 1.59998 1 0 1 1 0 0 +EDGE2 4071 4070 -0.972266 0.00714214 1.59466 1 0 1 1 0 0 +EDGE2 4072 4071 -1.07939 -0.0539784 0.0392938 1 0 1 1 0 0 +EDGE2 4073 4072 -0.964398 -0.0218409 -0.0119653 1 0 1 1 0 0 +EDGE2 4074 4073 -1.04194 -0.0207521 0.0143495 1 0 1 1 0 0 +EDGE2 4074 3955 0.993404 -0.0895998 -3.1394 1 0 1 1 0 0 +EDGE2 4075 3954 1.09078 0.073959 -3.15279 1 0 1 1 0 0 +EDGE2 4075 4074 -0.943007 -0.0670111 0.0137896 1 0 1 1 0 0 +EDGE2 4075 3955 -0.0403093 -0.00894896 -3.14849 1 0 1 1 0 0 +EDGE2 4075 3956 -0.0450932 -1.00719 -1.57348 1 0 1 1 0 0 +EDGE2 4076 3957 0.987344 -0.00475538 0.0431475 1 0 1 1 0 0 +EDGE2 4076 4075 -1.00427 -0.0269267 1.60345 1 0 1 1 0 0 +EDGE2 4076 3955 -1.03992 -0.0337673 -1.57359 1 0 1 1 0 0 +EDGE2 4076 3956 0.0363186 -0.0293425 0.00655942 1 0 1 1 0 0 +EDGE2 4077 3957 0.0211083 0.0470141 -0.0161686 1 0 1 1 0 0 +EDGE2 4077 3956 -0.917393 0.0975751 -0.00268867 1 0 1 1 0 0 +EDGE2 4077 4076 -1.02928 0.0427599 0.0400813 1 0 1 1 0 0 +EDGE2 4077 3958 0.938273 -0.0302525 0.00530939 1 0 1 1 0 0 +EDGE2 4078 3957 -1.1369 0.0590357 -0.00637211 1 0 1 1 0 0 +EDGE2 4078 4077 -0.884053 0.0167929 -0.0408815 1 0 1 1 0 0 +EDGE2 4078 3958 0.0102611 0.0121319 0.0165206 1 0 1 1 0 0 +EDGE2 4078 3959 1.02886 0.0341175 -0.00316504 1 0 1 1 0 0 +EDGE2 4079 3960 0.912913 0.0169507 0.00378366 1 0 1 1 0 0 +EDGE2 4079 4040 1.08653 -0.0390687 -3.1805 1 0 1 1 0 0 +EDGE2 4079 3958 -0.913363 -0.0373564 0.0131954 1 0 1 1 0 0 +EDGE2 4079 4078 -1.09011 0.0392886 -0.0406083 1 0 1 1 0 0 +EDGE2 4079 3959 0.0011328 -0.0176764 -0.0272899 1 0 1 1 0 0 +EDGE2 4080 3960 -0.0132908 -0.0154796 0.0285573 1 0 1 1 0 0 +EDGE2 4080 4040 -0.0219821 0.00464546 -3.19395 1 0 1 1 0 0 +EDGE2 4080 4079 -0.972051 -0.00331536 -0.00415645 1 0 1 1 0 0 +EDGE2 4080 3959 -1.00639 0.0665342 0.0118813 1 0 1 1 0 0 +EDGE2 4080 3961 0.0823904 0.950819 1.54452 1 0 1 1 0 0 +EDGE2 4080 4039 1.06639 -0.0160042 -3.12489 1 0 1 1 0 0 +EDGE2 4080 4041 0.0396025 -0.861265 -1.58298 1 0 1 1 0 0 +EDGE2 4081 3960 -0.965983 -0.027643 -1.5414 1 0 1 1 0 0 +EDGE2 4081 4040 -0.940747 -0.0122788 1.57914 1 0 1 1 0 0 +EDGE2 4081 3961 -0.0252193 -0.0222566 -0.0362831 1 0 1 1 0 0 +EDGE2 4081 3962 0.958645 -0.0376686 0.00683828 1 0 1 1 0 0 +EDGE2 4081 4080 -0.981571 -0.0212529 -1.56201 1 0 1 1 0 0 +EDGE2 4082 3963 1.03595 0.0819733 -0.000124844 1 0 1 1 0 0 +EDGE2 4082 3961 -0.960281 -0.0276012 -0.015784 1 0 1 1 0 0 +EDGE2 4082 4081 -0.980905 -0.0939752 -0.0352035 1 0 1 1 0 0 +EDGE2 4082 3962 -0.102558 -0.0185098 -0.00132285 1 0 1 1 0 0 +EDGE2 4083 3964 0.89281 0.0159413 -0.0152163 1 0 1 1 0 0 +EDGE2 4083 3963 -0.000922153 -0.10547 0.0256554 1 0 1 1 0 0 +EDGE2 4083 4082 -0.965605 0.0812719 -0.0125711 1 0 1 1 0 0 +EDGE2 4083 3962 -0.994548 -0.00689397 -0.0140197 1 0 1 1 0 0 +EDGE2 4084 3965 1.05065 -0.0673901 0.00868666 1 0 1 1 0 0 +EDGE2 4084 4025 1.01858 0.0703954 -3.11478 1 0 1 1 0 0 +EDGE2 4084 4083 -0.936661 -0.0508141 0.0147102 1 0 1 1 0 0 +EDGE2 4084 3964 0.0752525 -0.0440139 -0.0259894 1 0 1 1 0 0 +EDGE2 4084 3963 -1.059 -0.0426066 0.0151358 1 0 1 1 0 0 +EDGE2 4085 4024 0.962597 -0.0097802 -3.19108 1 0 1 1 0 0 +EDGE2 4085 3966 0.0474735 1.01853 1.57038 1 0 1 1 0 0 +EDGE2 4085 3965 0.0544774 0.0277547 -0.0152844 1 0 1 1 0 0 +EDGE2 4085 4025 -0.0240587 -0.0557334 -3.10675 1 0 1 1 0 0 +EDGE2 4085 4026 -0.0597713 -0.973305 -1.55386 1 0 1 1 0 0 +EDGE2 4085 3964 -0.925955 -0.115183 -0.00374486 1 0 1 1 0 0 +EDGE2 4085 4084 -1.04055 0.0394613 0.0622736 1 0 1 1 0 0 +EDGE2 4086 4085 -0.965832 -0.00933242 1.54011 1 0 1 1 0 0 +EDGE2 4086 3965 -0.95822 -0.0430844 1.58909 1 0 1 1 0 0 +EDGE2 4086 4025 -0.990917 -0.00842857 -1.5617 1 0 1 1 0 0 +EDGE2 4086 4026 0.00324202 0.0431227 0.0507998 1 0 1 1 0 0 +EDGE2 4086 4027 1.02625 -0.0418333 -0.0083718 1 0 1 1 0 0 +EDGE2 4087 4086 -0.966972 -0.00199185 -0.0209647 1 0 1 1 0 0 +EDGE2 4087 4026 -1.02362 -0.0521691 0.0294843 1 0 1 1 0 0 +EDGE2 4087 4028 1.01932 0.0343343 -0.0247512 1 0 1 1 0 0 +EDGE2 4087 4027 -0.0857523 0.0550903 -0.0259639 1 0 1 1 0 0 +EDGE2 4088 4029 1.0033 0.115957 -0.0421686 1 0 1 1 0 0 +EDGE2 4088 4087 -1.03508 0.0551787 0.00817435 1 0 1 1 0 0 +EDGE2 4088 4028 0.0530437 -0.0322673 0.000688409 1 0 1 1 0 0 +EDGE2 4088 4027 -0.937708 -0.0770651 0.0103233 1 0 1 1 0 0 +EDGE2 4089 4029 0.014253 -0.0184523 0.0191763 1 0 1 1 0 0 +EDGE2 4089 4028 -1.09281 0.0047249 -0.00277891 1 0 1 1 0 0 +EDGE2 4089 4088 -1.03067 -0.0315991 -0.000658265 1 0 1 1 0 0 +EDGE2 4089 4030 0.931522 0.0151097 -0.0110458 1 0 1 1 0 0 +EDGE2 4090 4029 -0.96618 -0.00659476 0.00400596 1 0 1 1 0 0 +EDGE2 4090 4089 -0.985377 0.00200385 0.00919744 1 0 1 1 0 0 +EDGE2 4090 4031 0.0156845 -1.02345 -1.55895 1 0 1 1 0 0 +EDGE2 4090 4030 0.0357358 -0.0291509 -0.0304199 1 0 1 1 0 0 +EDGE2 4091 4090 -0.972225 -0.0424355 -1.58329 1 0 1 1 0 0 +EDGE2 4091 4030 -1.00974 0.00971349 -1.57129 1 0 1 1 0 0 +EDGE2 4092 4091 -0.983483 0.0250525 0.0228053 1 0 1 1 0 0 +EDGE2 4093 4092 -0.983596 0.0195633 -0.0113494 1 0 1 1 0 0 +EDGE2 4094 4093 -0.909806 0.0301086 -0.00487351 1 0 1 1 0 0 +EDGE2 4095 4094 -1.02025 0.0459696 0.0102517 1 0 1 1 0 0 +EDGE2 4096 4095 -1.06913 -0.038772 -1.53137 1 0 1 1 0 0 +EDGE2 4097 4096 -0.889339 0.0545606 -0.00209169 1 0 1 1 0 0 +EDGE2 4098 4097 -1.01608 0.076577 0.00553953 1 0 1 1 0 0 +EDGE2 4099 4000 1.03398 -0.0604019 -3.12991 1 0 1 1 0 0 +EDGE2 4099 4020 1.00747 -0.00640961 -3.11512 1 0 1 1 0 0 +EDGE2 4099 3980 0.976936 0.0352646 -3.14657 1 0 1 1 0 0 +EDGE2 4099 4098 -0.9388 0.0586441 0.0138816 1 0 1 1 0 0 +EDGE2 4100 4099 -0.984432 0.0240784 -0.0268174 1 0 1 1 0 0 +EDGE2 4100 4001 -0.00667122 -0.978564 -1.55749 1 0 1 1 0 0 +EDGE2 4100 3981 -0.0166368 -0.986489 -1.55421 1 0 1 1 0 0 +EDGE2 4100 3999 1.03553 -0.0113267 -3.13348 1 0 1 1 0 0 +EDGE2 4100 4019 0.960334 -0.0509676 -3.12914 1 0 1 1 0 0 +EDGE2 4100 3979 1.03912 0.0552762 -3.15844 1 0 1 1 0 0 +EDGE2 4100 4000 0.070824 0.0361785 -3.16303 1 0 1 1 0 0 +EDGE2 4100 4020 0.0330418 -0.0293201 -3.14394 1 0 1 1 0 0 +EDGE2 4100 3980 0.0775904 -0.0152727 -3.1327 1 0 1 1 0 0 +EDGE2 4100 4021 -0.0293038 0.998594 1.55787 1 0 1 1 0 0 +EDGE2 4101 4100 -0.991087 -0.0157042 -1.56394 1 0 1 1 0 0 +EDGE2 4101 4000 -1.03576 0.0488807 1.60085 1 0 1 1 0 0 +EDGE2 4101 4020 -0.970414 -0.0396828 1.59244 1 0 1 1 0 0 +EDGE2 4101 3980 -1.05061 -0.00185481 1.59268 1 0 1 1 0 0 +EDGE2 4101 4021 0.00438144 0.0037228 -0.00989035 1 0 1 1 0 0 +EDGE2 4101 4022 1.04065 -0.0408633 0.0702087 1 0 1 1 0 0 +EDGE2 4102 4021 -0.967922 -0.00618965 -0.0150168 1 0 1 1 0 0 +EDGE2 4102 4101 -0.970328 -0.0576618 -0.0102749 1 0 1 1 0 0 +EDGE2 4102 4022 -0.0592401 -0.0146347 -0.00648604 1 0 1 1 0 0 +EDGE2 4102 4023 0.976661 -0.0160879 0.00183026 1 0 1 1 0 0 +EDGE2 4103 4102 -0.983353 0.0455855 -0.0260529 1 0 1 1 0 0 +EDGE2 4103 4022 -1.04317 0.0247899 -0.0116996 1 0 1 1 0 0 +EDGE2 4103 4023 0.0988004 -0.00776616 0.0184774 1 0 1 1 0 0 +EDGE2 4103 4024 0.927996 -0.072436 0.00268947 1 0 1 1 0 0 +EDGE2 4104 4103 -0.969952 0.0518075 -0.02363 1 0 1 1 0 0 +EDGE2 4104 4023 -1.02327 0.111318 0.000169763 1 0 1 1 0 0 +EDGE2 4104 4024 0.0139828 0.0544043 -0.00438127 1 0 1 1 0 0 +EDGE2 4104 4085 0.976492 -0.0628744 -3.12957 1 0 1 1 0 0 +EDGE2 4104 3965 1.07128 -0.032605 -3.16901 1 0 1 1 0 0 +EDGE2 4104 4025 0.984279 0.0282779 -0.038507 1 0 1 1 0 0 +EDGE2 4105 4104 -1.00275 -0.00455461 -0.00942329 1 0 1 1 0 0 +EDGE2 4105 4024 -1.06572 -0.0504295 -0.0243556 1 0 1 1 0 0 +EDGE2 4105 4085 -0.0597535 -0.0365559 -3.10802 1 0 1 1 0 0 +EDGE2 4105 3966 -0.0510192 -0.978758 -1.57178 1 0 1 1 0 0 +EDGE2 4105 4086 0.0850834 1.06246 1.58994 1 0 1 1 0 0 +EDGE2 4105 3965 0.0870967 0.0131635 -3.1319 1 0 1 1 0 0 +EDGE2 4105 4025 -0.0702688 -0.0323295 -0.0276239 1 0 1 1 0 0 +EDGE2 4105 4026 0.0259997 1.04134 1.5709 1 0 1 1 0 0 +EDGE2 4105 3964 1.00016 -0.0421257 -3.15033 1 0 1 1 0 0 +EDGE2 4105 4084 1.07272 -0.0105846 -3.13352 1 0 1 1 0 0 +EDGE2 4106 4085 -1.01884 0.067519 -1.55346 1 0 1 1 0 0 +EDGE2 4106 3966 0.0329067 0.0526656 0.0125086 1 0 1 1 0 0 +EDGE2 4106 3967 1.02041 0.0190502 -0.00106509 1 0 1 1 0 0 +EDGE2 4106 4105 -1.02871 -0.0776122 1.59885 1 0 1 1 0 0 +EDGE2 4106 3965 -0.991891 0.0219981 -1.5835 1 0 1 1 0 0 +EDGE2 4106 4025 -0.99753 0.0473806 1.58228 1 0 1 1 0 0 +EDGE2 4107 3968 1.0091 -0.00330189 0.0356119 1 0 1 1 0 0 +EDGE2 4107 3966 -1.02404 0.00849944 -0.0237384 1 0 1 1 0 0 +EDGE2 4107 4106 -0.923368 0.03802 -0.0105848 1 0 1 1 0 0 +EDGE2 4107 3967 0.00941344 0.107309 -0.0469529 1 0 1 1 0 0 +EDGE2 4108 3969 0.984949 -0.10459 0.00768438 1 0 1 1 0 0 +EDGE2 4108 4107 -0.993236 -0.101721 0.0279185 1 0 1 1 0 0 +EDGE2 4108 3968 -0.0123625 0.0924892 0.00162885 1 0 1 1 0 0 +EDGE2 4108 3967 -1.02841 -0.0236935 0.0353891 1 0 1 1 0 0 +EDGE2 4109 3969 -0.00574855 -0.0942591 -0.00126726 1 0 1 1 0 0 +EDGE2 4109 3970 1.0026 -0.00309496 0.00446333 1 0 1 1 0 0 +EDGE2 4109 3910 0.962724 0.0514748 -3.11265 1 0 1 1 0 0 +EDGE2 4109 3930 1.09214 0.00918805 -3.14454 1 0 1 1 0 0 +EDGE2 4109 3950 1.00985 -0.0282498 -3.1718 1 0 1 1 0 0 +EDGE2 4109 4108 -1.02227 -0.02976 0.00487073 1 0 1 1 0 0 +EDGE2 4109 3968 -0.982259 0.0379802 0.0479809 1 0 1 1 0 0 +EDGE2 4110 3971 0.0296514 -0.998724 -1.58282 1 0 1 1 0 0 +EDGE2 4110 3911 -0.00507971 -0.989058 -1.57 1 0 1 1 0 0 +EDGE2 4110 3931 0.0792922 -1.00475 -1.58951 1 0 1 1 0 0 +EDGE2 4110 3929 0.985261 -0.0027727 -3.16822 1 0 1 1 0 0 +EDGE2 4110 3949 1.00256 -0.0573607 -3.12463 1 0 1 1 0 0 +EDGE2 4110 3969 -1.02023 0.057272 0.00969903 1 0 1 1 0 0 +EDGE2 4110 3970 -0.0319679 -0.0307308 -0.023592 1 0 1 1 0 0 +EDGE2 4110 3909 0.938707 0.0022356 -3.13794 1 0 1 1 0 0 +EDGE2 4110 3910 0.0266798 -0.00108678 -3.13923 1 0 1 1 0 0 +EDGE2 4110 3930 -0.0531115 -0.0835295 -3.17659 1 0 1 1 0 0 +EDGE2 4110 3950 -0.0100365 0.0284922 -3.09662 1 0 1 1 0 0 +EDGE2 4110 4109 -0.95775 -0.0114668 -0.0284447 1 0 1 1 0 0 +EDGE2 4110 3951 0.00630335 0.95071 1.54133 1 0 1 1 0 0 +EDGE2 4111 3971 0.000608421 0.0470501 0.00273421 1 0 1 1 0 0 +EDGE2 4111 3932 0.971885 -0.0231275 0.00753429 1 0 1 1 0 0 +EDGE2 4111 3972 0.955658 0.0107205 -0.0348425 1 0 1 1 0 0 +EDGE2 4111 3912 0.996464 -0.0327927 -0.0150804 1 0 1 1 0 0 +EDGE2 4111 3911 -0.0415963 -0.0338686 0.0108048 1 0 1 1 0 0 +EDGE2 4111 3931 -0.0603082 0.100663 -0.00296601 1 0 1 1 0 0 +EDGE2 4111 3970 -0.983512 -0.0394408 1.59612 1 0 1 1 0 0 +EDGE2 4111 4110 -1.00537 -0.0381487 1.57941 1 0 1 1 0 0 +EDGE2 4111 3910 -1.0351 0.0615706 -1.57156 1 0 1 1 0 0 +EDGE2 4111 3930 -1.03118 0.0194787 -1.54666 1 0 1 1 0 0 +EDGE2 4111 3950 -1.03751 0.0948596 -1.60965 1 0 1 1 0 0 +EDGE2 4112 3971 -0.99609 -0.0747868 -0.0126132 1 0 1 1 0 0 +EDGE2 4112 3913 0.978596 0.0868745 -0.0108884 1 0 1 1 0 0 +EDGE2 4112 3973 0.903022 0.052151 0.0293087 1 0 1 1 0 0 +EDGE2 4112 3933 0.971569 -0.0642799 0.00831619 1 0 1 1 0 0 +EDGE2 4112 3932 -0.0641237 0.0483032 -0.00607973 1 0 1 1 0 0 +EDGE2 4112 3972 0.052638 -0.0843831 -0.00978966 1 0 1 1 0 0 +EDGE2 4112 3912 -0.0043052 0.0187674 -0.0316634 1 0 1 1 0 0 +EDGE2 4112 4111 -0.959649 0.0549708 -0.00983891 1 0 1 1 0 0 +EDGE2 4112 3911 -0.931686 0.0412097 -0.020091 1 0 1 1 0 0 +EDGE2 4112 3931 -1.02324 0.10853 -0.0337741 1 0 1 1 0 0 +EDGE2 4113 3913 0.0606689 -0.144146 -0.00251925 1 0 1 1 0 0 +EDGE2 4113 3934 0.990342 -0.0597654 -0.0125383 1 0 1 1 0 0 +EDGE2 4113 3974 0.976377 0.00404384 0.0185955 1 0 1 1 0 0 +EDGE2 4113 3914 0.958596 -0.032631 -0.0171722 1 0 1 1 0 0 +EDGE2 4113 3973 0.0515706 0.0733631 -0.00821631 1 0 1 1 0 0 +EDGE2 4113 3933 0.0588031 0.00704628 -0.0117585 1 0 1 1 0 0 +EDGE2 4113 3932 -0.962267 -0.0443333 0.0259623 1 0 1 1 0 0 +EDGE2 4113 4112 -1.06941 0.0335003 -0.0158544 1 0 1 1 0 0 +EDGE2 4113 3972 -0.982544 -0.0171219 0.00451984 1 0 1 1 0 0 +EDGE2 4113 3912 -1.01576 0.0198767 0.00219084 1 0 1 1 0 0 +EDGE2 4114 4015 0.91662 0.0249705 -3.14876 1 0 1 1 0 0 +EDGE2 4114 3935 0.919054 0.0734612 0.0268895 1 0 1 1 0 0 +EDGE2 4114 3975 1.04499 0.0295193 -0.00939126 1 0 1 1 0 0 +EDGE2 4114 3995 0.974157 -0.0178305 -3.13762 1 0 1 1 0 0 +EDGE2 4114 3915 0.937254 0.0165684 0.026444 1 0 1 1 0 0 +EDGE2 4114 3913 -1.10501 -0.067101 -0.0284082 1 0 1 1 0 0 +EDGE2 4114 3934 -0.034455 0.0722334 0.00329017 1 0 1 1 0 0 +EDGE2 4114 3974 -0.034507 -0.0423332 -0.00269114 1 0 1 1 0 0 +EDGE2 4114 3914 0.0403589 -0.0862106 -0.0258605 1 0 1 1 0 0 +EDGE2 4114 3973 -1.05423 0.0697094 -0.0103309 1 0 1 1 0 0 +EDGE2 4114 4113 -1.11303 0.0382705 0.000921137 1 0 1 1 0 0 +EDGE2 4114 3933 -0.926589 0.157273 0.0108202 1 0 1 1 0 0 +EDGE2 4115 3936 0.0291838 0.933294 1.57003 1 0 1 1 0 0 +EDGE2 4115 3916 -0.0184977 1.08984 1.5672 1 0 1 1 0 0 +EDGE2 4115 4015 -0.0246531 -0.136121 -3.13907 1 0 1 1 0 0 +EDGE2 4115 4014 0.927437 -0.00772112 -3.11609 1 0 1 1 0 0 +EDGE2 4115 3994 1.03596 0.0116371 -3.10854 1 0 1 1 0 0 +EDGE2 4115 4016 0.0482867 -0.916261 -1.57064 1 0 1 1 0 0 +EDGE2 4115 3935 0.00212112 0.0384691 -0.0352219 1 0 1 1 0 0 +EDGE2 4115 3975 -0.0272137 0.0554832 0.0222515 1 0 1 1 0 0 +EDGE2 4115 3995 0.0171891 0.0122907 -3.12943 1 0 1 1 0 0 +EDGE2 4115 3915 -0.00247101 0.0607176 -0.00212223 1 0 1 1 0 0 +EDGE2 4115 3976 0.0668832 -0.914044 -1.54402 1 0 1 1 0 0 +EDGE2 4115 3996 0.0145874 -1.03148 -1.57997 1 0 1 1 0 0 +EDGE2 4115 3934 -1.03642 -0.0366471 -0.0279592 1 0 1 1 0 0 +EDGE2 4115 3974 -1.0271 -0.00103502 -0.00584019 1 0 1 1 0 0 +EDGE2 4115 4114 -1.01343 0.0226101 -0.010135 1 0 1 1 0 0 +EDGE2 4115 3914 -0.961317 0.00257123 0.00810494 1 0 1 1 0 0 +EDGE2 4116 3917 1.0815 0.068896 -0.02981 1 0 1 1 0 0 +EDGE2 4116 3937 1.03849 0.0572929 0.0248164 1 0 1 1 0 0 +EDGE2 4116 3936 -0.061323 -0.0814939 -0.0102512 1 0 1 1 0 0 +EDGE2 4116 3916 0.0784051 -0.0558199 -0.0023268 1 0 1 1 0 0 +EDGE2 4116 4015 -0.982053 0.0294408 1.56942 1 0 1 1 0 0 +EDGE2 4116 4115 -1.0632 -0.0452747 -1.57948 1 0 1 1 0 0 +EDGE2 4116 3935 -1.01007 0.00205904 -1.54582 1 0 1 1 0 0 +EDGE2 4116 3975 -1.09368 -0.000452254 -1.54174 1 0 1 1 0 0 +EDGE2 4116 3995 -0.979497 -0.0222786 1.57463 1 0 1 1 0 0 +EDGE2 4116 3915 -1.03545 0.0215948 -1.53253 1 0 1 1 0 0 +EDGE2 4117 3918 1.00496 -0.0795566 0.0228099 1 0 1 1 0 0 +EDGE2 4117 3938 1.01302 0.027864 -0.0264671 1 0 1 1 0 0 +EDGE2 4117 3917 -0.00317869 0.078832 0.0198898 1 0 1 1 0 0 +EDGE2 4117 3937 0.0970722 0.00188354 -0.0192673 1 0 1 1 0 0 +EDGE2 4117 3936 -1.00936 0.064276 -0.00355429 1 0 1 1 0 0 +EDGE2 4117 4116 -0.937087 0.00514693 0.00772437 1 0 1 1 0 0 +EDGE2 4117 3916 -1.03564 0.0221855 0.00732457 1 0 1 1 0 0 +EDGE2 4118 3919 1.02897 -0.00496794 -0.0040421 1 0 1 1 0 0 +EDGE2 4118 3939 1.01778 -0.0726374 0.0285294 1 0 1 1 0 0 +EDGE2 4118 3918 0.065603 0.0508959 0.0277523 1 0 1 1 0 0 +EDGE2 4118 3938 -0.029186 0.00326927 -0.0333323 1 0 1 1 0 0 +EDGE2 4118 3917 -0.976832 -0.0657928 0.0153322 1 0 1 1 0 0 +EDGE2 4118 3937 -0.969646 0.039443 -0.0197021 1 0 1 1 0 0 +EDGE2 4118 4117 -1.01906 -0.0408349 -0.0158634 1 0 1 1 0 0 +EDGE2 4119 3920 1.0036 0.038742 -0.035692 1 0 1 1 0 0 +EDGE2 4119 3940 0.997092 0.00305078 -0.0235855 1 0 1 1 0 0 +EDGE2 4119 4118 -0.92784 -0.0638804 0.00417014 1 0 1 1 0 0 +EDGE2 4119 3919 0.0544408 0.0263783 0.00797729 1 0 1 1 0 0 +EDGE2 4119 3939 -0.099861 0.0183398 0.00339722 1 0 1 1 0 0 +EDGE2 4119 3918 -0.936954 -0.02134 0.00657833 1 0 1 1 0 0 +EDGE2 4119 3938 -0.994788 0.00298067 0.0277094 1 0 1 1 0 0 +EDGE2 4120 4119 -0.987602 0.148527 -0.0189412 1 0 1 1 0 0 +EDGE2 4120 3920 -0.00814967 -0.0145387 0.0228774 1 0 1 1 0 0 +EDGE2 4120 3940 0.0011901 0.0103439 -0.00137466 1 0 1 1 0 0 +EDGE2 4120 3919 -1.01724 0.0138711 0.00319011 1 0 1 1 0 0 +EDGE2 4120 3939 -0.992299 -0.0628677 -0.0253758 1 0 1 1 0 0 +EDGE2 4120 3921 -0.130629 0.990764 1.53939 1 0 1 1 0 0 +EDGE2 4120 3941 -0.00791242 0.948142 1.58671 1 0 1 1 0 0 +EDGE2 4121 4120 -0.918407 0.0829434 -1.55472 1 0 1 1 0 0 +EDGE2 4121 3920 -0.975659 -0.0356779 -1.57953 1 0 1 1 0 0 +EDGE2 4121 3940 -1.002 0.0133064 -1.54433 1 0 1 1 0 0 +EDGE2 4121 3921 -0.0682526 0.0250483 0.0211179 1 0 1 1 0 0 +EDGE2 4121 3941 0.0208161 -0.0525144 -0.0374612 1 0 1 1 0 0 +EDGE2 4121 3922 0.998747 -0.0142712 0.0120211 1 0 1 1 0 0 +EDGE2 4121 3942 0.917664 -0.0148627 -0.00620655 1 0 1 1 0 0 +EDGE2 4122 4121 -1.01515 -0.027416 -0.00638808 1 0 1 1 0 0 +EDGE2 4122 3921 -0.939742 0.115893 -0.0136388 1 0 1 1 0 0 +EDGE2 4122 3941 -0.894299 -0.0398155 0.021096 1 0 1 1 0 0 +EDGE2 4122 3922 -0.023273 0.0078043 -0.00513635 1 0 1 1 0 0 +EDGE2 4122 3942 -0.0631497 -0.0361871 0.0224033 1 0 1 1 0 0 +EDGE2 4122 3923 1.00156 -0.146696 0.00305485 1 0 1 1 0 0 +EDGE2 4122 3943 0.996375 -0.0352877 0.0165089 1 0 1 1 0 0 +EDGE2 4123 4122 -1.01431 0.0354855 -0.0134729 1 0 1 1 0 0 +EDGE2 4123 3922 -1.00708 0.046347 0.0322269 1 0 1 1 0 0 +EDGE2 4123 3942 -0.967699 -0.0484604 0.00232853 1 0 1 1 0 0 +EDGE2 4123 3923 -0.0145323 0.0258493 -0.00371711 1 0 1 1 0 0 +EDGE2 4123 3943 -0.0662434 -0.0201409 0.0173723 1 0 1 1 0 0 +EDGE2 4123 3944 1.08285 -0.115494 0.00925036 1 0 1 1 0 0 +EDGE2 4123 3924 0.985413 0.092669 0.020173 1 0 1 1 0 0 +EDGE2 4124 3923 -0.988112 0.0235406 -0.0102072 1 0 1 1 0 0 +EDGE2 4124 3943 -1.05954 0.0274898 -0.00576512 1 0 1 1 0 0 +EDGE2 4124 4123 -0.957153 -0.00121909 -0.0205244 1 0 1 1 0 0 +EDGE2 4124 3944 0.0334212 0.0858944 -0.00666952 1 0 1 1 0 0 +EDGE2 4124 3924 -0.0568327 0.0637719 -0.0124592 1 0 1 1 0 0 +EDGE2 4124 3905 0.93725 0.0267592 -3.14929 1 0 1 1 0 0 +EDGE2 4124 3945 0.990953 0.0447461 -0.036182 1 0 1 1 0 0 +EDGE2 4124 3925 0.965762 -0.0346691 0.0163248 1 0 1 1 0 0 +EDGE2 4125 3944 -0.972725 -0.00813712 -0.0268846 1 0 1 1 0 0 +EDGE2 4125 4124 -0.910232 0.019337 -0.00313798 1 0 1 1 0 0 +EDGE2 4125 3924 -0.971507 0.0270326 0.00440371 1 0 1 1 0 0 +EDGE2 4125 3905 0.000403655 0.0117402 -3.15827 1 0 1 1 0 0 +EDGE2 4125 3945 -0.0350986 0.0653662 0.00237591 1 0 1 1 0 0 +EDGE2 4125 3925 0.00244238 -0.034575 0.0378693 1 0 1 1 0 0 +EDGE2 4125 3904 1.03802 -0.0486929 -3.1591 1 0 1 1 0 0 +EDGE2 4125 3906 0.00257118 1.04602 1.58063 1 0 1 1 0 0 +EDGE2 4125 3946 0.0606902 0.906175 1.55961 1 0 1 1 0 0 +EDGE2 4125 3926 -0.0285531 0.975355 1.56063 1 0 1 1 0 0 +EDGE2 4126 3905 -1.02846 -0.00439809 -1.59585 1 0 1 1 0 0 +EDGE2 4126 3945 -1.01795 -0.0881445 1.58788 1 0 1 1 0 0 +EDGE2 4126 4125 -0.93565 -0.0195398 1.58119 1 0 1 1 0 0 +EDGE2 4126 3925 -1.14739 0.00171926 1.57812 1 0 1 1 0 0 +EDGE2 4127 4126 -0.96693 0.00394281 -0.0127933 1 0 1 1 0 0 +EDGE2 4128 4127 -0.905832 -0.0629091 -0.00980962 1 0 1 1 0 0 +EDGE2 4129 3890 1.01568 0.0532837 -3.13009 1 0 1 1 0 0 +EDGE2 4129 4128 -1.01573 -0.029943 -0.00750053 1 0 1 1 0 0 +EDGE2 4130 3889 0.963716 0.00842888 -3.12588 1 0 1 1 0 0 +EDGE2 4130 3890 0.0516153 -0.0312562 -3.14751 1 0 1 1 0 0 +EDGE2 4130 3891 0.0132783 1.0815 1.55443 1 0 1 1 0 0 +EDGE2 4130 4129 -1.02024 0.00654547 0.0316458 1 0 1 1 0 0 +EDGE2 4131 3890 -0.934034 0.0192708 1.57678 1 0 1 1 0 0 +EDGE2 4131 4130 -1.11945 0.0516254 -1.56334 1 0 1 1 0 0 +EDGE2 4131 3891 0.00498395 -0.0443542 0.0222243 1 0 1 1 0 0 +EDGE2 4131 3892 0.991239 -0.0541732 -0.0031348 1 0 1 1 0 0 +EDGE2 4132 3891 -1.04826 0.0636185 -0.00948307 1 0 1 1 0 0 +EDGE2 4132 4131 -1.03122 -0.0359121 0.0131646 1 0 1 1 0 0 +EDGE2 4132 3892 -0.00934926 -0.021881 0.0198333 1 0 1 1 0 0 +EDGE2 4132 3893 1.12298 0.0159707 0.0288301 1 0 1 1 0 0 +EDGE2 4133 4132 -1.07668 -0.0533102 -0.00601884 1 0 1 1 0 0 +EDGE2 4133 3892 -1.05325 -0.0497675 0.0153575 1 0 1 1 0 0 +EDGE2 4133 3893 0.00630469 0.0183366 0.00155196 1 0 1 1 0 0 +EDGE2 4133 3894 1.07304 -0.0224075 0.0100253 1 0 1 1 0 0 +EDGE2 4134 4133 -0.894721 0.0416176 -0.000421487 1 0 1 1 0 0 +EDGE2 4134 3893 -0.936748 -0.0853257 0.0051621 1 0 1 1 0 0 +EDGE2 4134 3895 0.950505 0.0779327 -0.0177395 1 0 1 1 0 0 +EDGE2 4134 3894 -0.00966618 0.0211246 -0.0298359 1 0 1 1 0 0 +EDGE2 4135 3895 0.0953121 0.0332539 0.00640426 1 0 1 1 0 0 +EDGE2 4135 3894 -0.927373 0.0418818 -0.000536326 1 0 1 1 0 0 +EDGE2 4135 4134 -1.02445 0.0157466 -0.0131504 1 0 1 1 0 0 +EDGE2 4135 3896 0.0101388 1.06563 1.57233 1 0 1 1 0 0 +EDGE2 4136 3895 -0.963038 -0.0581567 1.55359 1 0 1 1 0 0 +EDGE2 4136 4135 -0.983137 -0.0528055 1.53166 1 0 1 1 0 0 +EDGE2 4137 4136 -1.1101 0.0199707 -0.0069302 1 0 1 1 0 0 +EDGE2 4138 4137 -1.02007 0.0484469 0.0211341 1 0 1 1 0 0 +EDGE2 4139 4138 -1.01895 0.00402353 0.028333 1 0 1 1 0 0 +EDGE2 4140 4139 -1.05112 0.0296683 -0.0127857 1 0 1 1 0 0 +EDGE2 4141 4140 -1.05647 -0.0611069 1.55362 1 0 1 1 0 0 +EDGE2 4142 4141 -0.985053 0.0624826 -0.0156761 1 0 1 1 0 0 +EDGE2 4143 4142 -1.07925 0.0479648 -0.0147174 1 0 1 1 0 0 +EDGE2 4144 3885 0.998622 -0.0100405 -3.10475 1 0 1 1 0 0 +EDGE2 4144 4143 -1.02798 -0.00491448 -0.00515456 1 0 1 1 0 0 +EDGE2 4145 3884 0.979918 0.0504704 -3.11942 1 0 1 1 0 0 +EDGE2 4145 3885 0.0343576 -0.00746943 -3.15204 1 0 1 1 0 0 +EDGE2 4145 3886 0.0457834 -0.951028 -1.5741 1 0 1 1 0 0 +EDGE2 4145 4144 -1.06061 0.0190674 -0.00868189 1 0 1 1 0 0 +EDGE2 4146 3885 -1.05584 0.0911986 -1.52846 1 0 1 1 0 0 +EDGE2 4146 4145 -0.981751 -0.0295127 1.56282 1 0 1 1 0 0 +EDGE2 4146 3886 -0.0572313 0.082151 0.0202417 1 0 1 1 0 0 +EDGE2 4146 3887 0.929844 -0.100377 -0.0261687 1 0 1 1 0 0 +EDGE2 4147 3886 -0.986954 0.00426759 -0.00595541 1 0 1 1 0 0 +EDGE2 4147 4146 -1.0305 -0.0415707 0.0111943 1 0 1 1 0 0 +EDGE2 4147 3887 0.0873756 0.0493473 0.0215052 1 0 1 1 0 0 +EDGE2 4147 3888 1.04878 0.0221319 0.0117625 1 0 1 1 0 0 +EDGE2 4148 3887 -0.97663 -0.0210433 0.00067027 1 0 1 1 0 0 +EDGE2 4148 4147 -0.999213 -0.00611872 0.0159729 1 0 1 1 0 0 +EDGE2 4148 3888 0.0044644 0.0533128 0.0205014 1 0 1 1 0 0 +EDGE2 4148 3889 1.07288 0.00367418 -0.0218315 1 0 1 1 0 0 +EDGE2 4149 3888 -1.04308 -0.0554528 0.00379855 1 0 1 1 0 0 +EDGE2 4149 4148 -0.986065 0.00929315 -0.00773906 1 0 1 1 0 0 +EDGE2 4149 3889 0.0900561 0.0611616 -0.0186695 1 0 1 1 0 0 +EDGE2 4149 3890 0.988355 0.0496931 0.00170208 1 0 1 1 0 0 +EDGE2 4149 4130 0.909211 0.0680237 -3.13616 1 0 1 1 0 0 +EDGE2 4150 4149 -0.935118 -0.0952862 0.00104273 1 0 1 1 0 0 +EDGE2 4150 3889 -0.957433 0.0424368 0.0123642 1 0 1 1 0 0 +EDGE2 4150 3890 -0.0192604 0.0849558 -0.0080601 1 0 1 1 0 0 +EDGE2 4150 4130 -0.11031 -0.0596735 -3.15331 1 0 1 1 0 0 +EDGE2 4150 3891 0.065352 -0.986669 -1.55838 1 0 1 1 0 0 +EDGE2 4150 4131 -0.101059 -0.97538 -1.56581 1 0 1 1 0 0 +EDGE2 4150 4129 1.00205 -0.0336511 -3.10547 1 0 1 1 0 0 +EDGE2 4151 4132 0.946712 -0.0189614 0.0137091 1 0 1 1 0 0 +EDGE2 4151 3890 -1.02046 -0.00079207 1.54734 1 0 1 1 0 0 +EDGE2 4151 4150 -0.931455 -0.0240125 1.56654 1 0 1 1 0 0 +EDGE2 4151 4130 -0.976768 0.0308222 -1.57595 1 0 1 1 0 0 +EDGE2 4151 3891 0.027309 0.0560614 -0.00418258 1 0 1 1 0 0 +EDGE2 4151 4131 -0.0605256 -0.0187911 -0.0123536 1 0 1 1 0 0 +EDGE2 4151 3892 0.837898 -0.077823 0.000900901 1 0 1 1 0 0 +EDGE2 4152 4132 0.0371112 0.121828 -0.0330813 1 0 1 1 0 0 +EDGE2 4152 3891 -0.916386 -0.0639122 -0.0272544 1 0 1 1 0 0 +EDGE2 4152 4131 -1.02509 -0.0523512 0.00259402 1 0 1 1 0 0 +EDGE2 4152 4151 -1.09451 -0.0414791 -0.0276266 1 0 1 1 0 0 +EDGE2 4152 3892 -0.0648271 -0.00625308 -0.0239682 1 0 1 1 0 0 +EDGE2 4152 4133 0.9713 -0.0140933 0.0223836 1 0 1 1 0 0 +EDGE2 4152 3893 1.01049 -0.0497633 0.00591383 1 0 1 1 0 0 +EDGE2 4153 4132 -0.988657 -0.00146608 -0.0154697 1 0 1 1 0 0 +EDGE2 4153 4152 -1.03945 0.0383131 0.014829 1 0 1 1 0 0 +EDGE2 4153 3892 -0.992112 -0.0337428 0.0145901 1 0 1 1 0 0 +EDGE2 4153 4133 0.0266068 -0.0909513 0.00752628 1 0 1 1 0 0 +EDGE2 4153 3893 0.00491511 -0.0475584 0.00456904 1 0 1 1 0 0 +EDGE2 4153 3894 1.00724 0.0368992 -0.0242396 1 0 1 1 0 0 +EDGE2 4153 4134 1.02583 -0.031395 -0.0145526 1 0 1 1 0 0 +EDGE2 4154 4133 -1.07024 0.0284163 0.00162424 1 0 1 1 0 0 +EDGE2 4154 4153 -1.01615 -0.0502946 -0.0152211 1 0 1 1 0 0 +EDGE2 4154 3893 -1.05221 0.0176734 -0.00537634 1 0 1 1 0 0 +EDGE2 4154 3895 1.10454 0.0344745 0.0218122 1 0 1 1 0 0 +EDGE2 4154 3894 -0.0313335 0.049755 -0.030711 1 0 1 1 0 0 +EDGE2 4154 4134 0.0758566 0.0692609 -0.0187904 1 0 1 1 0 0 +EDGE2 4154 4135 0.950976 0.0172189 -0.000520299 1 0 1 1 0 0 +EDGE2 4155 4154 -0.986534 -0.0514038 0.00912259 1 0 1 1 0 0 +EDGE2 4155 4136 -0.0183079 -0.985803 -1.5766 1 0 1 1 0 0 +EDGE2 4155 3895 -0.0016825 -0.0546605 0.046865 1 0 1 1 0 0 +EDGE2 4155 3894 -0.918322 0.043631 -0.00447007 1 0 1 1 0 0 +EDGE2 4155 4134 -1.01608 0.0191843 0.0214576 1 0 1 1 0 0 +EDGE2 4155 4135 -0.0353296 -0.0730666 -0.0104906 1 0 1 1 0 0 +EDGE2 4155 3896 -0.000355749 1.03871 1.56505 1 0 1 1 0 0 +EDGE2 4156 3895 -1.00704 0.0437752 -1.56814 1 0 1 1 0 0 +EDGE2 4156 4155 -0.974549 0.010063 -1.57111 1 0 1 1 0 0 +EDGE2 4156 4135 -1.01424 -0.0529954 -1.56806 1 0 1 1 0 0 +EDGE2 4156 3897 1.01827 -0.0470988 -0.0261816 1 0 1 1 0 0 +EDGE2 4156 3896 -0.00512295 -1.63478e-05 -0.0217876 1 0 1 1 0 0 +EDGE2 4157 4156 -0.974402 0.0227593 0.00180288 1 0 1 1 0 0 +EDGE2 4157 3898 0.988114 -0.0101195 0.0273262 1 0 1 1 0 0 +EDGE2 4157 3897 0.0925065 -0.0136478 -0.0187657 1 0 1 1 0 0 +EDGE2 4157 3896 -0.946425 0.0293544 -0.00129635 1 0 1 1 0 0 +EDGE2 4158 3898 -0.0179206 -0.0327279 -0.0167787 1 0 1 1 0 0 +EDGE2 4158 3897 -1.06076 0.0270956 0.00422691 1 0 1 1 0 0 +EDGE2 4158 4157 -0.977343 0.000101077 0.000498585 1 0 1 1 0 0 +EDGE2 4158 3899 1.0158 -0.053217 -0.00814409 1 0 1 1 0 0 +EDGE2 4159 3898 -0.974348 -0.0525407 -0.00554611 1 0 1 1 0 0 +EDGE2 4159 4158 -1.07197 0.0311425 0.0195292 1 0 1 1 0 0 +EDGE2 4159 3899 -0.0736897 0.0105448 -0.00169651 1 0 1 1 0 0 +EDGE2 4159 3900 0.990347 -0.00482241 0.00286363 1 0 1 1 0 0 +EDGE2 4160 3901 0.0115909 0.974412 1.57704 1 0 1 1 0 0 +EDGE2 4160 3899 -0.964719 -0.0851809 0.0148842 1 0 1 1 0 0 +EDGE2 4160 4159 -0.900478 0.046336 0.00432971 1 0 1 1 0 0 +EDGE2 4160 3900 -0.0926603 0.0108901 0.0266602 1 0 1 1 0 0 +EDGE2 4161 3902 1.04411 -0.0340292 0.0310101 1 0 1 1 0 0 +EDGE2 4161 3901 0.153929 0.097424 0.0145662 1 0 1 1 0 0 +EDGE2 4161 4160 -0.929858 0.0610632 -1.58267 1 0 1 1 0 0 +EDGE2 4161 3900 -0.978478 0.0229603 -1.55459 1 0 1 1 0 0 +EDGE2 4162 3902 0.108088 0.0134195 -0.00231821 1 0 1 1 0 0 +EDGE2 4162 3903 0.991454 0.072153 -0.00820097 1 0 1 1 0 0 +EDGE2 4162 3901 -1.00429 0.0565651 0.00705976 1 0 1 1 0 0 +EDGE2 4162 4161 -1.04771 0.0462715 -5.55403e-05 1 0 1 1 0 0 +EDGE2 4163 3902 -1.12068 0.033226 -0.010488 1 0 1 1 0 0 +EDGE2 4163 4162 -1.03725 0.030614 -0.0111771 1 0 1 1 0 0 +EDGE2 4163 3904 1.0377 0.0261815 -0.00921111 1 0 1 1 0 0 +EDGE2 4163 3903 0.0231889 -0.0373836 -0.0358703 1 0 1 1 0 0 +EDGE2 4164 3905 1.01609 -0.0275783 0.00480168 1 0 1 1 0 0 +EDGE2 4164 3945 1.02935 0.016682 -3.16659 1 0 1 1 0 0 +EDGE2 4164 4125 1.09573 -0.027483 -3.14087 1 0 1 1 0 0 +EDGE2 4164 3925 0.923034 -0.0336688 -3.16259 1 0 1 1 0 0 +EDGE2 4164 4163 -1.08094 -0.0258158 0.00128102 1 0 1 1 0 0 +EDGE2 4164 3904 -0.029415 0.041023 0.0247603 1 0 1 1 0 0 +EDGE2 4164 3903 -0.988242 0.0276233 -0.0136476 1 0 1 1 0 0 +EDGE2 4165 3944 1.06254 -0.03046 -3.14028 1 0 1 1 0 0 +EDGE2 4165 4124 1.03532 0.0757624 -3.12649 1 0 1 1 0 0 +EDGE2 4165 3924 1.00605 0.0142425 -3.14865 1 0 1 1 0 0 +EDGE2 4165 4126 -0.0570626 1.0509 1.57906 1 0 1 1 0 0 +EDGE2 4165 3905 0.0397058 0.0315042 0.015222 1 0 1 1 0 0 +EDGE2 4165 3945 0.0612761 0.047106 -3.12463 1 0 1 1 0 0 +EDGE2 4165 4125 0.0619732 0.034968 -3.14746 1 0 1 1 0 0 +EDGE2 4165 3925 -0.0710425 0.0588218 -3.13446 1 0 1 1 0 0 +EDGE2 4165 3904 -0.9802 -0.0580178 0.0116761 1 0 1 1 0 0 +EDGE2 4165 4164 -1.05546 -0.048149 0.0370436 1 0 1 1 0 0 +EDGE2 4165 3906 -0.00838641 -1.05106 -1.60299 1 0 1 1 0 0 +EDGE2 4165 3946 0.114773 -0.960928 -1.58151 1 0 1 1 0 0 +EDGE2 4165 3926 -0.0311573 -1.01829 -1.62662 1 0 1 1 0 0 +EDGE2 4166 4126 -0.0700594 -0.02317 -0.015427 1 0 1 1 0 0 +EDGE2 4166 4127 1.00991 -0.0329697 -0.0155306 1 0 1 1 0 0 +EDGE2 4166 3905 -1.04143 -0.0205224 -1.58676 1 0 1 1 0 0 +EDGE2 4166 3945 -0.957499 0.0569771 1.56216 1 0 1 1 0 0 +EDGE2 4166 4125 -0.987312 0.0374876 1.57502 1 0 1 1 0 0 +EDGE2 4166 4165 -0.946576 0.0142089 -1.54821 1 0 1 1 0 0 +EDGE2 4166 3925 -0.978564 0.0153698 1.57045 1 0 1 1 0 0 +EDGE2 4167 4128 1.04308 -0.0233885 -0.0518086 1 0 1 1 0 0 +EDGE2 4167 4126 -0.952285 -0.0201368 -0.0136251 1 0 1 1 0 0 +EDGE2 4167 4166 -1.03883 -0.11086 -0.00260378 1 0 1 1 0 0 +EDGE2 4167 4127 -0.0286954 -0.0504276 0.0096339 1 0 1 1 0 0 +EDGE2 4168 4167 -1.01215 -0.00756318 -0.0253047 1 0 1 1 0 0 +EDGE2 4168 4129 0.999347 0.106215 -0.0163851 1 0 1 1 0 0 +EDGE2 4168 4128 -0.015946 -0.0452429 -0.00278872 1 0 1 1 0 0 +EDGE2 4168 4127 -0.919809 -0.0131567 0.00715404 1 0 1 1 0 0 +EDGE2 4169 3890 1.00613 0.0282217 -3.11343 1 0 1 1 0 0 +EDGE2 4169 4150 1.02054 -0.0324843 -3.14281 1 0 1 1 0 0 +EDGE2 4169 4130 1.01617 -0.0292825 0.0127447 1 0 1 1 0 0 +EDGE2 4169 4168 -0.970687 -0.0707948 0.0233302 1 0 1 1 0 0 +EDGE2 4169 4129 -0.0318545 0.0514416 -0.0166069 1 0 1 1 0 0 +EDGE2 4169 4128 -1.02903 0.0255793 -0.00558677 1 0 1 1 0 0 +EDGE2 4170 4149 1.02187 -0.0291135 -3.11639 1 0 1 1 0 0 +EDGE2 4170 3889 0.9788 0.0498501 -3.16886 1 0 1 1 0 0 +EDGE2 4170 3890 -0.0148217 0.00134228 -3.13027 1 0 1 1 0 0 +EDGE2 4170 4150 -0.00371049 0.0327081 -3.13908 1 0 1 1 0 0 +EDGE2 4170 4130 0.0574814 -0.0285286 0.0164216 1 0 1 1 0 0 +EDGE2 4170 3891 -0.0441981 0.935803 1.58437 1 0 1 1 0 0 +EDGE2 4170 4131 -0.00606858 1.02807 1.60343 1 0 1 1 0 0 +EDGE2 4170 4151 0.0804753 1.04234 1.58169 1 0 1 1 0 0 +EDGE2 4170 4129 -1.02309 -0.0605236 -0.00769308 1 0 1 1 0 0 +EDGE2 4170 4169 -1.02102 -0.0197361 0.000786066 1 0 1 1 0 0 +EDGE2 4171 3890 -1.03588 -0.0261032 -1.56018 1 0 1 1 0 0 +EDGE2 4171 4150 -0.976407 0.0434865 -1.56434 1 0 1 1 0 0 +EDGE2 4171 4170 -0.981479 0.00547536 1.56419 1 0 1 1 0 0 +EDGE2 4171 4130 -0.94306 -0.0480101 1.57297 1 0 1 1 0 0 +EDGE2 4172 4171 -1.04798 0.0679009 -0.0261505 1 0 1 1 0 0 +EDGE2 4173 4172 -1.01695 0.033099 0.0115536 1 0 1 1 0 0 +EDGE2 4174 4173 -0.948447 -0.0732368 0.0326292 1 0 1 1 0 0 +EDGE2 4175 4174 -1.00325 0.0440363 -0.0191794 1 0 1 1 0 0 +EDGE2 4176 4175 -0.95694 0.0813928 -1.58258 1 0 1 1 0 0 +EDGE2 4177 4176 -0.973556 -0.0554683 0.00190393 1 0 1 1 0 0 +EDGE2 4178 4177 -1.01576 0.00267268 0.0522009 1 0 1 1 0 0 +EDGE2 4179 3860 1.01608 -0.0426669 -3.14931 1 0 1 1 0 0 +EDGE2 4179 3880 1.05202 -0.00934161 -3.17058 1 0 1 1 0 0 +EDGE2 4179 4178 -1.0498 0.0804029 -0.0107698 1 0 1 1 0 0 +EDGE2 4180 3859 1.07285 -0.0235714 -3.12101 1 0 1 1 0 0 +EDGE2 4180 3879 1.04796 -0.0323626 -3.12581 1 0 1 1 0 0 +EDGE2 4180 3861 -0.0140491 -1.06018 -1.5564 1 0 1 1 0 0 +EDGE2 4180 3860 -0.0142061 0.0071583 -3.14962 1 0 1 1 0 0 +EDGE2 4180 3880 -0.0148525 -0.0167484 -3.14556 1 0 1 1 0 0 +EDGE2 4180 4179 -1.03573 -0.0892952 0.0299221 1 0 1 1 0 0 +EDGE2 4180 3881 0.0252949 0.976926 1.5676 1 0 1 1 0 0 +EDGE2 4181 4180 -1.10054 0.0339505 -1.5665 1 0 1 1 0 0 +EDGE2 4181 3860 -1.03731 0.0191075 1.56546 1 0 1 1 0 0 +EDGE2 4181 3880 -0.937539 -0.0185936 1.59273 1 0 1 1 0 0 +EDGE2 4181 3881 -0.0196114 0.0864509 0.0266194 1 0 1 1 0 0 +EDGE2 4181 3882 0.922487 0.0648359 0.0100647 1 0 1 1 0 0 +EDGE2 4182 4181 -1.07004 -0.0495525 -0.00202286 1 0 1 1 0 0 +EDGE2 4182 3881 -1.17152 -0.0972039 0.00610667 1 0 1 1 0 0 +EDGE2 4182 3882 -0.0191476 -0.0435167 0.00940285 1 0 1 1 0 0 +EDGE2 4182 3883 0.990423 -0.0545163 -0.00486014 1 0 1 1 0 0 +EDGE2 4183 4182 -0.924412 0.018735 -0.0223221 1 0 1 1 0 0 +EDGE2 4183 3882 -0.996326 -0.023755 -0.0241138 1 0 1 1 0 0 +EDGE2 4183 3883 0.0195308 -0.120026 -0.0197089 1 0 1 1 0 0 +EDGE2 4183 3884 0.950562 0.0217996 -0.0313454 1 0 1 1 0 0 +EDGE2 4184 4183 -0.960004 0.010322 -0.00861429 1 0 1 1 0 0 +EDGE2 4184 3883 -1.03474 -0.0262313 -0.0140669 1 0 1 1 0 0 +EDGE2 4184 3884 0.0414072 -0.0730795 -0.0140088 1 0 1 1 0 0 +EDGE2 4184 3885 1.02231 0.0722931 0.0147582 1 0 1 1 0 0 +EDGE2 4184 4145 0.950229 0.0069027 -3.11206 1 0 1 1 0 0 +EDGE2 4185 4184 -1.05701 -0.00633088 2.20966e-05 1 0 1 1 0 0 +EDGE2 4185 3884 -1.0142 -0.0429423 0.0129376 1 0 1 1 0 0 +EDGE2 4185 3885 0.0105934 0.0582916 -0.010708 1 0 1 1 0 0 +EDGE2 4185 4145 -0.0155902 0.0883267 -3.14253 1 0 1 1 0 0 +EDGE2 4185 3886 -0.0183629 0.976995 1.60246 1 0 1 1 0 0 +EDGE2 4185 4146 0.010525 0.937382 1.56943 1 0 1 1 0 0 +EDGE2 4185 4144 0.947282 0.0389514 -3.14247 1 0 1 1 0 0 +EDGE2 4186 3885 -0.987313 -0.0559894 1.55735 1 0 1 1 0 0 +EDGE2 4186 4145 -0.987998 -0.0770208 -1.5531 1 0 1 1 0 0 +EDGE2 4186 4185 -0.999878 -0.00274983 1.55046 1 0 1 1 0 0 +EDGE2 4187 4186 -0.927141 -0.0609145 -0.0172375 1 0 1 1 0 0 +EDGE2 4188 4187 -0.989158 0.00492399 0.0485584 1 0 1 1 0 0 +EDGE2 4189 3850 1.02287 -0.0390866 -3.13665 1 0 1 1 0 0 +EDGE2 4189 4188 -1.03472 0.017113 0.0102098 1 0 1 1 0 0 +EDGE2 4190 3851 -0.0246308 -0.930841 -1.57963 1 0 1 1 0 0 +EDGE2 4190 3849 1.0379 -0.00465849 -3.13714 1 0 1 1 0 0 +EDGE2 4190 3850 0.00171621 0.0167891 -3.18008 1 0 1 1 0 0 +EDGE2 4190 4189 -0.939384 0.0353109 0.0241229 1 0 1 1 0 0 +EDGE2 4191 3850 -0.976856 0.00144078 1.56256 1 0 1 1 0 0 +EDGE2 4191 4190 -1.03239 -0.0543813 -1.60506 1 0 1 1 0 0 +EDGE2 4192 4191 -1.06496 0.0377269 -0.010677 1 0 1 1 0 0 +EDGE2 4193 4192 -1.01687 0.00681068 0.0123907 1 0 1 1 0 0 +EDGE2 4194 4193 -0.980555 0.0455839 -0.0305979 1 0 1 1 0 0 +EDGE2 4195 4194 -1.02428 -0.122311 0.0190054 1 0 1 1 0 0 +EDGE2 4196 4195 -0.990109 0.0258139 -1.56135 1 0 1 1 0 0 +EDGE2 4197 4196 -1.07026 0.00597414 0.00116447 1 0 1 1 0 0 +EDGE2 4198 4197 -0.945215 -0.0321028 -0.0173787 1 0 1 1 0 0 +EDGE2 4199 4140 0.949231 0.00965717 -3.15975 1 0 1 1 0 0 +EDGE2 4199 4198 -0.977869 0.0217637 0.0308496 1 0 1 1 0 0 +EDGE2 4200 4140 -0.0212414 0.0374951 -3.14924 1 0 1 1 0 0 +EDGE2 4200 4141 0.0244608 0.987269 1.56873 1 0 1 1 0 0 +EDGE2 4200 4199 -1.03664 0.0529383 0.0195578 1 0 1 1 0 0 +EDGE2 4200 4139 1.00564 -0.0161871 -3.14403 1 0 1 1 0 0 +EDGE2 4201 4140 -1.02727 0.0704403 1.53463 1 0 1 1 0 0 +EDGE2 4201 4142 1.01376 -0.0546947 0.0135925 1 0 1 1 0 0 +EDGE2 4201 4141 0.0824355 -0.0995063 0.00382348 1 0 1 1 0 0 +EDGE2 4201 4200 -1.04984 0.007841 -1.58342 1 0 1 1 0 0 +EDGE2 4202 4143 0.963927 0.00768136 0.00684154 1 0 1 1 0 0 +EDGE2 4202 4142 0.0593405 -0.00299272 0.00847101 1 0 1 1 0 0 +EDGE2 4202 4141 -0.991941 0.115263 0.0206243 1 0 1 1 0 0 +EDGE2 4202 4201 -0.997097 0.0479488 -0.0110392 1 0 1 1 0 0 +EDGE2 4203 4144 0.975005 0.0614984 0.0113809 1 0 1 1 0 0 +EDGE2 4203 4202 -1.02808 -0.00512222 0.0158466 1 0 1 1 0 0 +EDGE2 4203 4143 0.0877901 -0.0292866 0.0146188 1 0 1 1 0 0 +EDGE2 4203 4142 -0.956198 0.0514342 0.0394289 1 0 1 1 0 0 +EDGE2 4204 3885 0.974475 -0.0644729 -3.17247 1 0 1 1 0 0 +EDGE2 4204 4145 1.04389 -0.0259069 0.000204816 1 0 1 1 0 0 +EDGE2 4204 4185 0.938631 0.0437069 -3.16254 1 0 1 1 0 0 +EDGE2 4204 4144 -0.030609 -0.0660841 -0.00266885 1 0 1 1 0 0 +EDGE2 4204 4143 -0.937921 0.102058 -0.0164822 1 0 1 1 0 0 +EDGE2 4204 4203 -1.12261 0.0772743 -0.0193501 1 0 1 1 0 0 +EDGE2 4205 4186 0.0011562 0.963244 1.57203 1 0 1 1 0 0 +EDGE2 4205 4184 1.06386 0.033671 -3.0882 1 0 1 1 0 0 +EDGE2 4205 3884 0.992665 -0.00818844 -3.19911 1 0 1 1 0 0 +EDGE2 4205 3885 0.00718043 -0.0118082 -3.1576 1 0 1 1 0 0 +EDGE2 4205 4145 -0.120901 0.0521908 0.00987938 1 0 1 1 0 0 +EDGE2 4205 4185 0.101893 -0.056265 -3.1614 1 0 1 1 0 0 +EDGE2 4205 3886 -0.0268062 -0.984805 -1.56685 1 0 1 1 0 0 +EDGE2 4205 4146 -0.0380313 -1.03725 -1.59046 1 0 1 1 0 0 +EDGE2 4205 4144 -0.973413 0.035398 -0.0190588 1 0 1 1 0 0 +EDGE2 4205 4204 -0.953093 -0.0380187 0.00572861 1 0 1 1 0 0 +EDGE2 4206 4205 -0.919937 -0.0283749 1.57664 1 0 1 1 0 0 +EDGE2 4206 3885 -0.979776 0.0112257 -1.59095 1 0 1 1 0 0 +EDGE2 4206 4145 -1.03146 0.0500503 1.56537 1 0 1 1 0 0 +EDGE2 4206 4185 -1.01146 -0.036105 -1.59474 1 0 1 1 0 0 +EDGE2 4206 3886 0.0542354 0.0953013 -0.012918 1 0 1 1 0 0 +EDGE2 4206 4146 0.0954478 -0.0583329 -0.0310819 1 0 1 1 0 0 +EDGE2 4206 3887 1.00257 -0.056055 0.0124702 1 0 1 1 0 0 +EDGE2 4206 4147 1.01251 0.0201147 0.0112617 1 0 1 1 0 0 +EDGE2 4207 3886 -0.978541 -0.0245036 -0.0170663 1 0 1 1 0 0 +EDGE2 4207 4146 -0.959006 0.0271237 0.017076 1 0 1 1 0 0 +EDGE2 4207 4206 -0.896478 0.00735268 -0.0131058 1 0 1 1 0 0 +EDGE2 4207 3887 -0.0230308 -0.075434 0.00380802 1 0 1 1 0 0 +EDGE2 4207 4147 -0.0336433 -0.013812 0.0140927 1 0 1 1 0 0 +EDGE2 4207 3888 1.0668 -0.0122276 -0.0073183 1 0 1 1 0 0 +EDGE2 4207 4148 0.929569 -0.0372867 0.0297794 1 0 1 1 0 0 +EDGE2 4208 3887 -0.976108 0.0278216 -0.0286607 1 0 1 1 0 0 +EDGE2 4208 4147 -0.897342 0.0546969 -0.00424306 1 0 1 1 0 0 +EDGE2 4208 4207 -0.956174 0.0210209 0.0152925 1 0 1 1 0 0 +EDGE2 4208 3888 -0.0782153 -0.00467886 -0.00352688 1 0 1 1 0 0 +EDGE2 4208 4148 -0.0479664 0.030812 0.0440578 1 0 1 1 0 0 +EDGE2 4208 4149 0.922458 -0.0524361 0.0306691 1 0 1 1 0 0 +EDGE2 4208 3889 1.05465 -0.020965 -0.00306649 1 0 1 1 0 0 +EDGE2 4209 3888 -0.910835 0.0128462 -0.0726852 1 0 1 1 0 0 +EDGE2 4209 4148 -0.94827 0.0446989 -0.011166 1 0 1 1 0 0 +EDGE2 4209 4208 -0.91936 0.0174483 0.026606 1 0 1 1 0 0 +EDGE2 4209 4149 -0.0845887 0.0530869 0.00157615 1 0 1 1 0 0 +EDGE2 4209 3889 -0.0628966 -0.00217699 -0.00387515 1 0 1 1 0 0 +EDGE2 4209 3890 0.920898 0.0295418 0.0203927 1 0 1 1 0 0 +EDGE2 4209 4150 1.04491 0.0458477 0.0149903 1 0 1 1 0 0 +EDGE2 4209 4170 1.00036 0.0270619 -3.14559 1 0 1 1 0 0 +EDGE2 4209 4130 0.913595 -0.0476317 -3.14927 1 0 1 1 0 0 +EDGE2 4210 4149 -0.986543 0.0557873 0.0362505 1 0 1 1 0 0 +EDGE2 4210 4209 -1.00839 -0.0167715 -0.0344522 1 0 1 1 0 0 +EDGE2 4210 3889 -0.970173 -0.0838897 -0.0207857 1 0 1 1 0 0 +EDGE2 4210 4171 0.0213239 0.999272 1.58478 1 0 1 1 0 0 +EDGE2 4210 3890 0.112195 -0.0575483 0.010306 1 0 1 1 0 0 +EDGE2 4210 4150 0.0178779 -0.0124951 0.0439095 1 0 1 1 0 0 +EDGE2 4210 4170 0.0477486 0.0148445 -3.11469 1 0 1 1 0 0 +EDGE2 4210 4130 0.0638809 0.020874 -3.13132 1 0 1 1 0 0 +EDGE2 4210 3891 0.0523875 -1.00861 -1.57452 1 0 1 1 0 0 +EDGE2 4210 4131 0.0735095 -1.05005 -1.56036 1 0 1 1 0 0 +EDGE2 4210 4151 0.00464969 -1.01265 -1.53578 1 0 1 1 0 0 +EDGE2 4210 4129 1.11625 0.029742 -3.10473 1 0 1 1 0 0 +EDGE2 4210 4169 0.988778 0.022073 -3.12541 1 0 1 1 0 0 +EDGE2 4211 4172 0.988517 0.0462896 0.00589528 1 0 1 1 0 0 +EDGE2 4211 4171 0.0260655 -0.0297972 -0.00170714 1 0 1 1 0 0 +EDGE2 4211 3890 -1.07078 -0.074861 -1.56239 1 0 1 1 0 0 +EDGE2 4211 4150 -1.06688 0.106693 -1.57397 1 0 1 1 0 0 +EDGE2 4211 4170 -1.0714 -0.0797525 1.5877 1 0 1 1 0 0 +EDGE2 4211 4210 -1.04784 -0.0164545 -1.54821 1 0 1 1 0 0 +EDGE2 4211 4130 -0.984199 0.0286425 1.55448 1 0 1 1 0 0 +EDGE2 4212 4173 0.977214 0.0116656 -0.00743663 1 0 1 1 0 0 +EDGE2 4212 4172 -0.00779749 -0.0445999 0.00385608 1 0 1 1 0 0 +EDGE2 4212 4171 -0.907455 0.00953843 0.000746989 1 0 1 1 0 0 +EDGE2 4212 4211 -1.09644 0.0243434 0.0110713 1 0 1 1 0 0 +EDGE2 4213 4173 -0.0157442 -0.072349 -0.0132405 1 0 1 1 0 0 +EDGE2 4213 4174 0.971641 0.0527023 0.00937577 1 0 1 1 0 0 +EDGE2 4213 4212 -1.01298 0.0241411 -0.0293868 1 0 1 1 0 0 +EDGE2 4213 4172 -0.949748 -0.0054966 0.0123544 1 0 1 1 0 0 +EDGE2 4214 4175 1.03955 -0.00012476 -0.00518928 1 0 1 1 0 0 +EDGE2 4214 4173 -0.990691 -0.00295728 0.0248756 1 0 1 1 0 0 +EDGE2 4214 4174 0.0220011 -0.0809451 0.00233887 1 0 1 1 0 0 +EDGE2 4214 4213 -0.9098 -0.0564386 -0.0101377 1 0 1 1 0 0 +EDGE2 4215 4176 -0.0154141 0.978309 1.6112 1 0 1 1 0 0 +EDGE2 4215 4175 0.0293817 -0.0193293 -0.010728 1 0 1 1 0 0 +EDGE2 4215 4214 -1.01039 0.00163174 0.00824664 1 0 1 1 0 0 +EDGE2 4215 4174 -0.9352 0.0159555 -0.00571072 1 0 1 1 0 0 +EDGE2 4216 4177 0.973196 -0.0314438 0.000970088 1 0 1 1 0 0 +EDGE2 4216 4176 0.0547769 -0.0234288 0.0246078 1 0 1 1 0 0 +EDGE2 4216 4175 -1.09154 0.109965 -1.50943 1 0 1 1 0 0 +EDGE2 4216 4215 -1.08651 -0.0182812 -1.52683 1 0 1 1 0 0 +EDGE2 4217 4178 1.07595 -0.00517812 -0.00315468 1 0 1 1 0 0 +EDGE2 4217 4177 -0.00727682 -0.0144062 -0.00767301 1 0 1 1 0 0 +EDGE2 4217 4176 -1.02797 -0.0164341 -0.0195224 1 0 1 1 0 0 +EDGE2 4217 4216 -1.04946 -0.0119241 -0.0322051 1 0 1 1 0 0 +EDGE2 4218 4178 0.0514249 0.0240368 -0.0072641 1 0 1 1 0 0 +EDGE2 4218 4179 1.00415 0.0341896 -0.00984132 1 0 1 1 0 0 +EDGE2 4218 4177 -1.00422 0.0335982 0.0316446 1 0 1 1 0 0 +EDGE2 4218 4217 -0.912844 -0.0821205 0.0222882 1 0 1 1 0 0 +EDGE2 4219 4180 0.975786 -0.0128571 0.00440136 1 0 1 1 0 0 +EDGE2 4219 3860 1.00057 0.0266071 -3.13243 1 0 1 1 0 0 +EDGE2 4219 3880 0.973682 -0.00580891 -3.11514 1 0 1 1 0 0 +EDGE2 4219 4178 -0.989608 0.0282399 0.0224433 1 0 1 1 0 0 +EDGE2 4219 4179 -0.027387 0.030514 -0.0107894 1 0 1 1 0 0 +EDGE2 4219 4218 -0.973122 -0.0555589 -0.0257895 1 0 1 1 0 0 +EDGE2 4220 4219 -0.990126 -0.00849747 -0.00721221 1 0 1 1 0 0 +EDGE2 4220 3859 1.03933 0.0942277 -3.10186 1 0 1 1 0 0 +EDGE2 4220 3879 1.02301 -0.0214461 -3.15652 1 0 1 1 0 0 +EDGE2 4220 3861 0.0300062 -0.987258 -1.59582 1 0 1 1 0 0 +EDGE2 4220 4180 -0.0615837 -0.0513818 -0.0306694 1 0 1 1 0 0 +EDGE2 4220 3860 0.143092 0.0206208 -3.13273 1 0 1 1 0 0 +EDGE2 4220 3880 -0.000463602 0.0694479 -3.13523 1 0 1 1 0 0 +EDGE2 4220 4179 -0.942531 -0.0183449 0.00875091 1 0 1 1 0 0 +EDGE2 4220 4181 -0.0442192 0.973532 1.56846 1 0 1 1 0 0 +EDGE2 4220 3881 0.0346369 1.00708 1.5671 1 0 1 1 0 0 +EDGE2 4221 4180 -1.04994 0.0193548 -1.56022 1 0 1 1 0 0 +EDGE2 4221 4220 -1.06707 0.0562333 -1.56962 1 0 1 1 0 0 +EDGE2 4221 3860 -0.975098 0.0103461 1.57432 1 0 1 1 0 0 +EDGE2 4221 3880 -0.938033 0.0500371 1.58812 1 0 1 1 0 0 +EDGE2 4221 4182 0.915412 0.0225161 0.0322115 1 0 1 1 0 0 +EDGE2 4221 4181 -0.000890086 0.0880657 0.0151657 1 0 1 1 0 0 +EDGE2 4221 3881 0.0563024 -0.0130507 0.00175821 1 0 1 1 0 0 +EDGE2 4221 3882 1.07593 0.0645998 -0.0125492 1 0 1 1 0 0 +EDGE2 4222 4182 -0.00164096 0.0726698 -0.023508 1 0 1 1 0 0 +EDGE2 4222 4181 -1.02069 -0.00854529 0.00778904 1 0 1 1 0 0 +EDGE2 4222 4221 -1.00895 0.00253313 0.0335438 1 0 1 1 0 0 +EDGE2 4222 3881 -1.0615 -0.0670201 0.0141077 1 0 1 1 0 0 +EDGE2 4222 4183 0.99424 0.0613945 0.0236817 1 0 1 1 0 0 +EDGE2 4222 3882 0.0584211 0.0509874 -0.0156965 1 0 1 1 0 0 +EDGE2 4222 3883 0.965648 0.0535176 -0.0096584 1 0 1 1 0 0 +EDGE2 4223 4182 -1.01064 -0.0141681 -0.0219 1 0 1 1 0 0 +EDGE2 4223 4222 -0.963674 -0.0320425 0.00376982 1 0 1 1 0 0 +EDGE2 4223 4184 1.03956 -0.010711 0.00696017 1 0 1 1 0 0 +EDGE2 4223 4183 -0.0491267 -0.0399442 -0.014115 1 0 1 1 0 0 +EDGE2 4223 3882 -0.867303 0.0131201 -0.0226307 1 0 1 1 0 0 +EDGE2 4223 3883 0.0966783 -0.0276285 -0.016927 1 0 1 1 0 0 +EDGE2 4223 3884 0.953223 -0.0368272 -0.0136247 1 0 1 1 0 0 +EDGE2 4224 4184 0.0918791 0.000857799 0.0073001 1 0 1 1 0 0 +EDGE2 4224 4183 -0.94785 -0.00334706 -0.0093804 1 0 1 1 0 0 +EDGE2 4224 4223 -1.03 -0.0584586 0.00894189 1 0 1 1 0 0 +EDGE2 4224 3883 -1.00979 -0.084941 0.0261609 1 0 1 1 0 0 +EDGE2 4224 4205 0.916607 -0.0331423 -3.15394 1 0 1 1 0 0 +EDGE2 4224 3884 0.0386558 -0.0475216 -0.0570435 1 0 1 1 0 0 +EDGE2 4224 3885 0.910048 -0.0183239 -0.00487222 1 0 1 1 0 0 +EDGE2 4224 4145 1.0832 -0.0281975 -3.13483 1 0 1 1 0 0 +EDGE2 4224 4185 0.955405 0.0550588 0.00591742 1 0 1 1 0 0 +EDGE2 4225 4186 -0.0591375 -0.966447 -1.61519 1 0 1 1 0 0 +EDGE2 4225 4184 -0.990445 0.061786 0.0147659 1 0 1 1 0 0 +EDGE2 4225 4224 -1.06182 -0.00612673 0.00752759 1 0 1 1 0 0 +EDGE2 4225 4205 0.00843055 -0.00739834 -3.16228 1 0 1 1 0 0 +EDGE2 4225 3884 -1.0018 0.0180083 -0.0228864 1 0 1 1 0 0 +EDGE2 4225 3885 -0.0389827 -0.0686374 0.0293483 1 0 1 1 0 0 +EDGE2 4225 4145 -0.0075084 0.0402034 -3.14044 1 0 1 1 0 0 +EDGE2 4225 4185 -0.0136527 0.0869017 -0.00547023 1 0 1 1 0 0 +EDGE2 4225 3886 -0.0283416 1.05931 1.56726 1 0 1 1 0 0 +EDGE2 4225 4146 -0.0112801 1.0347 1.55173 1 0 1 1 0 0 +EDGE2 4225 4206 -0.00637122 1.05095 1.6103 1 0 1 1 0 0 +EDGE2 4225 4144 0.886256 0.0783615 -3.11589 1 0 1 1 0 0 +EDGE2 4225 4204 1.08713 -0.0136419 -3.1526 1 0 1 1 0 0 +EDGE2 4226 4205 -1.04295 -0.0358691 1.56782 1 0 1 1 0 0 +EDGE2 4226 4225 -0.920133 0.0150409 -1.56333 1 0 1 1 0 0 +EDGE2 4226 3885 -1.08207 -0.0204631 -1.59716 1 0 1 1 0 0 +EDGE2 4226 4145 -1.01923 -0.0247553 1.5757 1 0 1 1 0 0 +EDGE2 4226 4185 -0.939292 0.0482859 -1.59906 1 0 1 1 0 0 +EDGE2 4226 3886 -0.0311716 -0.0606288 -0.00181121 1 0 1 1 0 0 +EDGE2 4226 4146 -0.0427943 0.016748 -0.016944 1 0 1 1 0 0 +EDGE2 4226 4206 -0.0154473 -0.0934945 0.00559746 1 0 1 1 0 0 +EDGE2 4226 3887 1.02824 0.0393045 0.0059171 1 0 1 1 0 0 +EDGE2 4226 4147 0.874843 0.115543 0.0108665 1 0 1 1 0 0 +EDGE2 4226 4207 0.912237 -0.00807944 0.000798115 1 0 1 1 0 0 +EDGE2 4227 4226 -1.11079 -0.00362371 -0.00463322 1 0 1 1 0 0 +EDGE2 4227 3886 -1.02673 0.0344165 0.024584 1 0 1 1 0 0 +EDGE2 4227 4146 -1.0678 0.00740629 -0.00288585 1 0 1 1 0 0 +EDGE2 4227 4206 -1.10514 0.0545158 -0.00630033 1 0 1 1 0 0 +EDGE2 4227 3887 -0.0488243 -0.0801839 -0.000921117 1 0 1 1 0 0 +EDGE2 4227 4147 -0.00718428 0.0525117 0.00156862 1 0 1 1 0 0 +EDGE2 4227 4207 0.0236689 -0.0627373 0.000200459 1 0 1 1 0 0 +EDGE2 4227 3888 0.942987 0.0357687 0.0075979 1 0 1 1 0 0 +EDGE2 4227 4148 0.971211 -0.0482597 0.0121092 1 0 1 1 0 0 +EDGE2 4227 4208 0.960272 -0.0632196 0.00344448 1 0 1 1 0 0 +EDGE2 4228 4227 -0.947039 -0.0119089 -0.00894061 1 0 1 1 0 0 +EDGE2 4228 3887 -1.05775 0.0312516 -0.0169465 1 0 1 1 0 0 +EDGE2 4228 4147 -0.954707 0.0221026 0.00582145 1 0 1 1 0 0 +EDGE2 4228 4207 -0.984957 -0.0377782 -0.0132679 1 0 1 1 0 0 +EDGE2 4228 3888 0.0526184 0.0758329 0.0179232 1 0 1 1 0 0 +EDGE2 4228 4148 -0.0113654 0.0263188 -0.0270453 1 0 1 1 0 0 +EDGE2 4228 4208 0.0644835 -0.0288878 0.0384895 1 0 1 1 0 0 +EDGE2 4228 4149 1.05682 0.0587177 0.0123889 1 0 1 1 0 0 +EDGE2 4228 4209 0.945121 -0.0637272 -9.23629e-05 1 0 1 1 0 0 +EDGE2 4228 3889 1.02071 -0.0195711 0.0378111 1 0 1 1 0 0 +EDGE2 4229 4228 -0.914935 -0.00775145 0.0173502 1 0 1 1 0 0 +EDGE2 4229 3888 -1.0469 0.0407293 0.0313693 1 0 1 1 0 0 +EDGE2 4229 4148 -1.0444 0.033026 0.0056718 1 0 1 1 0 0 +EDGE2 4229 4208 -1.06349 0.107895 0.000640857 1 0 1 1 0 0 +EDGE2 4229 4149 0.0277173 0.00185543 0.0162851 1 0 1 1 0 0 +EDGE2 4229 4209 0.0148521 -0.0202354 0.0139375 1 0 1 1 0 0 +EDGE2 4229 3889 0.0712484 0.0369117 0.0108168 1 0 1 1 0 0 +EDGE2 4229 3890 1.01976 0.0588983 -0.00678231 1 0 1 1 0 0 +EDGE2 4229 4150 1.00665 -0.112561 -0.010014 1 0 1 1 0 0 +EDGE2 4229 4170 1.05333 0.0154515 -3.14134 1 0 1 1 0 0 +EDGE2 4229 4210 1.01317 0.0198118 0.00181845 1 0 1 1 0 0 +EDGE2 4229 4130 1.01243 -0.0360181 -3.15045 1 0 1 1 0 0 +EDGE2 4230 4229 -0.958161 0.0516373 -0.000966222 1 0 1 1 0 0 +EDGE2 4230 4149 -1.0052 -0.0209416 0.0341839 1 0 1 1 0 0 +EDGE2 4230 4209 -0.983191 0.00788687 0.00629225 1 0 1 1 0 0 +EDGE2 4230 3889 -0.991698 4.31073e-05 0.00714835 1 0 1 1 0 0 +EDGE2 4230 4171 -0.0303023 1.00631 1.55348 1 0 1 1 0 0 +EDGE2 4230 4211 -0.0047915 0.955708 1.57923 1 0 1 1 0 0 +EDGE2 4230 3890 0.028543 0.0343418 0.00438878 1 0 1 1 0 0 +EDGE2 4230 4150 -0.0352562 0.0998699 -0.00649807 1 0 1 1 0 0 +EDGE2 4230 4170 -0.0226798 0.0555488 -3.15427 1 0 1 1 0 0 +EDGE2 4230 4210 0.0137596 0.080655 0.0383384 1 0 1 1 0 0 +EDGE2 4230 4130 0.0242587 -0.00779146 -3.1354 1 0 1 1 0 0 +EDGE2 4230 3891 0.0675323 -0.96737 -1.59013 1 0 1 1 0 0 +EDGE2 4230 4131 -0.0341828 -0.970288 -1.58781 1 0 1 1 0 0 +EDGE2 4230 4151 -0.0620211 -0.92736 -1.56643 1 0 1 1 0 0 +EDGE2 4230 4129 1.03213 0.00299861 -3.16308 1 0 1 1 0 0 +EDGE2 4230 4169 1.06274 0.0507876 -3.1225 1 0 1 1 0 0 +EDGE2 4231 4230 -1.0796 -0.0310958 -1.5689 1 0 1 1 0 0 +EDGE2 4231 4212 1.04949 -0.0207787 -0.00973521 1 0 1 1 0 0 +EDGE2 4231 4172 0.982541 0.03595 -0.0158282 1 0 1 1 0 0 +EDGE2 4231 4171 0.023711 0.0502839 -0.00291599 1 0 1 1 0 0 +EDGE2 4231 4211 -0.0957718 -0.0494049 0.002031 1 0 1 1 0 0 +EDGE2 4231 3890 -1.00436 0.0974211 -1.57216 1 0 1 1 0 0 +EDGE2 4231 4150 -0.980062 -0.00138805 -1.54524 1 0 1 1 0 0 +EDGE2 4231 4170 -0.972852 -0.00583478 1.55441 1 0 1 1 0 0 +EDGE2 4231 4210 -1.05847 0.00650571 -1.58139 1 0 1 1 0 0 +EDGE2 4231 4130 -0.975651 -0.113406 1.557 1 0 1 1 0 0 +EDGE2 4232 4173 1.04766 0.0832033 -0.0224023 1 0 1 1 0 0 +EDGE2 4232 4213 1.005 -0.0936093 0.00841476 1 0 1 1 0 0 +EDGE2 4232 4212 -0.0212687 -0.0218851 -0.0110363 1 0 1 1 0 0 +EDGE2 4232 4172 -0.0725255 -0.00711853 0.0231826 1 0 1 1 0 0 +EDGE2 4232 4171 -0.976661 -0.0771678 0.0234224 1 0 1 1 0 0 +EDGE2 4232 4211 -0.997053 -0.0551727 0.00520976 1 0 1 1 0 0 +EDGE2 4232 4231 -0.94435 -0.032671 0.0268144 1 0 1 1 0 0 +EDGE2 4233 4173 0.0141302 0.0533748 -0.0240127 1 0 1 1 0 0 +EDGE2 4233 4214 1.03425 -0.0302126 -0.00292399 1 0 1 1 0 0 +EDGE2 4233 4174 1.00956 -0.0802487 0.00700516 1 0 1 1 0 0 +EDGE2 4233 4213 -0.0242739 -0.0158914 0.052608 1 0 1 1 0 0 +EDGE2 4233 4212 -0.922409 0.00115651 -0.0172761 1 0 1 1 0 0 +EDGE2 4233 4232 -1.03031 0.0180984 0.00393415 1 0 1 1 0 0 +EDGE2 4233 4172 -1.01524 -0.0219294 -0.00370989 1 0 1 1 0 0 +EDGE2 4234 4175 1.01021 -0.0508238 -0.0273872 1 0 1 1 0 0 +EDGE2 4234 4215 0.988921 -0.143381 0.0178678 1 0 1 1 0 0 +EDGE2 4234 4173 -0.969535 0.0184371 0.0239603 1 0 1 1 0 0 +EDGE2 4234 4214 -0.0715902 0.0296457 -0.00537304 1 0 1 1 0 0 +EDGE2 4234 4174 0.0973411 -0.0113878 0.00362678 1 0 1 1 0 0 +EDGE2 4234 4213 -0.972588 -0.0217763 0.0136735 1 0 1 1 0 0 +EDGE2 4234 4233 -1.02877 -0.0276854 -0.0203394 1 0 1 1 0 0 +EDGE2 4235 4176 -0.0254112 1.06169 1.58396 1 0 1 1 0 0 +EDGE2 4235 4216 -0.00445409 0.995033 1.57732 1 0 1 1 0 0 +EDGE2 4235 4175 0.00870154 -0.0761109 0.00677979 1 0 1 1 0 0 +EDGE2 4235 4215 -0.0144472 0.00439594 0.00896976 1 0 1 1 0 0 +EDGE2 4235 4214 -1.02635 0.0983879 -0.0183181 1 0 1 1 0 0 +EDGE2 4235 4234 -0.984395 -0.0144185 -0.0200699 1 0 1 1 0 0 +EDGE2 4235 4174 -1.01014 0.0409505 0.0484067 1 0 1 1 0 0 +EDGE2 4236 4175 -1.00548 -0.0174691 1.57451 1 0 1 1 0 0 +EDGE2 4236 4215 -1.00479 -0.0212367 1.60996 1 0 1 1 0 0 +EDGE2 4236 4235 -0.974054 -0.0796152 1.55966 1 0 1 1 0 0 +EDGE2 4237 4236 -0.986463 0.0677101 -0.0237984 1 0 1 1 0 0 +EDGE2 4238 4237 -0.966834 -0.0583637 -0.0330132 1 0 1 1 0 0 +EDGE2 4239 4238 -1.09127 -0.0230386 0.00780906 1 0 1 1 0 0 +EDGE2 4239 4120 1.00497 0.024751 -3.11306 1 0 1 1 0 0 +EDGE2 4239 3920 1.04156 -0.000192203 -3.14566 1 0 1 1 0 0 +EDGE2 4239 3940 0.922209 -0.0604016 -3.09689 1 0 1 1 0 0 +EDGE2 4240 4119 0.974329 -0.125973 -3.12403 1 0 1 1 0 0 +EDGE2 4240 4120 0.0335151 0.0501805 -3.10179 1 0 1 1 0 0 +EDGE2 4240 4239 -1.02401 -0.0401997 -0.0319501 1 0 1 1 0 0 +EDGE2 4240 3920 0.0980778 0.0489414 -3.14213 1 0 1 1 0 0 +EDGE2 4240 3940 -0.035141 -0.0229202 -3.15766 1 0 1 1 0 0 +EDGE2 4240 3919 1.01677 -0.0606854 -3.13138 1 0 1 1 0 0 +EDGE2 4240 3939 0.943891 -0.0280248 -3.13675 1 0 1 1 0 0 +EDGE2 4240 4121 -0.0996223 -0.893065 -1.55587 1 0 1 1 0 0 +EDGE2 4240 3921 0.0564377 -0.912172 -1.592 1 0 1 1 0 0 +EDGE2 4240 3941 0.0187961 -0.931475 -1.56934 1 0 1 1 0 0 +EDGE2 4241 4120 -1.0115 0.0279858 -1.55664 1 0 1 1 0 0 +EDGE2 4241 4240 -0.983227 -0.0312937 1.55315 1 0 1 1 0 0 +EDGE2 4241 3920 -1.00636 0.0188688 -1.55506 1 0 1 1 0 0 +EDGE2 4241 3940 -0.955153 -0.0460612 -1.57395 1 0 1 1 0 0 +EDGE2 4241 4121 -0.0405488 -0.00985145 0.00792655 1 0 1 1 0 0 +EDGE2 4241 4122 1.03856 0.0276847 0.0390431 1 0 1 1 0 0 +EDGE2 4241 3921 -0.0504038 -0.0310791 -0.00835771 1 0 1 1 0 0 +EDGE2 4241 3941 -0.059896 0.0242667 -0.00145698 1 0 1 1 0 0 +EDGE2 4241 3922 0.965809 -0.0259233 0.00280914 1 0 1 1 0 0 +EDGE2 4241 3942 0.919746 0.0890782 0.0108334 1 0 1 1 0 0 +EDGE2 4242 4121 -1.04301 0.0846807 0.00539873 1 0 1 1 0 0 +EDGE2 4242 4241 -1.11462 -0.0333755 -0.0128484 1 0 1 1 0 0 +EDGE2 4242 4122 -0.0591882 -0.0534514 -0.00177844 1 0 1 1 0 0 +EDGE2 4242 3921 -0.975251 0.0984924 -0.00718721 1 0 1 1 0 0 +EDGE2 4242 3941 -1.01425 0.0191984 -0.00194901 1 0 1 1 0 0 +EDGE2 4242 3922 0.0517688 -0.118606 -0.00221145 1 0 1 1 0 0 +EDGE2 4242 3942 -0.0331626 0.0269088 -0.0203571 1 0 1 1 0 0 +EDGE2 4242 3923 0.998698 -0.0489709 0.0175351 1 0 1 1 0 0 +EDGE2 4242 3943 0.955226 -0.0239025 0.00947641 1 0 1 1 0 0 +EDGE2 4242 4123 0.997465 0.0702414 -0.000306614 1 0 1 1 0 0 +EDGE2 4243 4122 -0.983558 0.020601 0.0199132 1 0 1 1 0 0 +EDGE2 4243 4242 -0.965716 -0.0352242 0.000340472 1 0 1 1 0 0 +EDGE2 4243 3922 -0.946749 0.0322208 -0.00258123 1 0 1 1 0 0 +EDGE2 4243 3942 -0.991495 0.0116876 -0.00383502 1 0 1 1 0 0 +EDGE2 4243 3923 -0.0575785 -0.116441 -0.00542355 1 0 1 1 0 0 +EDGE2 4243 3943 0.0399489 -0.0763187 -0.000644173 1 0 1 1 0 0 +EDGE2 4243 4123 0.031179 -0.0349478 0.0166493 1 0 1 1 0 0 +EDGE2 4243 3944 1.09234 -0.0388112 0.00883824 1 0 1 1 0 0 +EDGE2 4243 4124 0.976303 -0.0503726 0.0106422 1 0 1 1 0 0 +EDGE2 4243 3924 1.01054 -0.00406153 0.016118 1 0 1 1 0 0 +EDGE2 4244 4243 -0.901069 -0.0120945 -0.000504979 1 0 1 1 0 0 +EDGE2 4244 3923 -1.0297 0.0258616 -0.0452401 1 0 1 1 0 0 +EDGE2 4244 3943 -0.967237 0.0141635 -0.0362177 1 0 1 1 0 0 +EDGE2 4244 4123 -0.938427 -0.0614396 -0.0213042 1 0 1 1 0 0 +EDGE2 4244 3944 -0.0496903 0.00712398 0.0270236 1 0 1 1 0 0 +EDGE2 4244 4124 0.0362614 -0.0378195 -0.0313098 1 0 1 1 0 0 +EDGE2 4244 3924 -0.0270286 0.0105644 -0.00184739 1 0 1 1 0 0 +EDGE2 4244 3905 1.02899 -0.0469 -3.13414 1 0 1 1 0 0 +EDGE2 4244 3945 1.05382 -0.0217059 0.00138603 1 0 1 1 0 0 +EDGE2 4244 4125 1.00225 0.0352139 0.00210881 1 0 1 1 0 0 +EDGE2 4244 4165 0.954933 -0.078117 -3.13138 1 0 1 1 0 0 +EDGE2 4244 3925 0.917237 -0.00772406 0.0058198 1 0 1 1 0 0 +EDGE2 4245 4244 -0.916671 0.0329139 0.000289075 1 0 1 1 0 0 +EDGE2 4245 3944 -1.04523 -0.0430981 -0.00635152 1 0 1 1 0 0 +EDGE2 4245 4124 -1.03353 -0.0438273 -0.0152712 1 0 1 1 0 0 +EDGE2 4245 3924 -1.05566 0.0841309 0.00998397 1 0 1 1 0 0 +EDGE2 4245 4126 -0.0254172 -0.961543 -1.58221 1 0 1 1 0 0 +EDGE2 4245 4166 0.0577137 -0.969906 -1.57669 1 0 1 1 0 0 +EDGE2 4245 3905 0.0297919 0.0348664 -3.1434 1 0 1 1 0 0 +EDGE2 4245 3945 0.0183287 0.0587755 0.0530124 1 0 1 1 0 0 +EDGE2 4245 4125 -0.0585091 -0.00538745 -0.00808284 1 0 1 1 0 0 +EDGE2 4245 4165 0.0718404 -0.0173348 -3.1423 1 0 1 1 0 0 +EDGE2 4245 3925 0.118302 0.0433426 -0.015434 1 0 1 1 0 0 +EDGE2 4245 3904 1.03773 0.105121 -3.14245 1 0 1 1 0 0 +EDGE2 4245 4164 0.99906 -0.0712981 -3.14406 1 0 1 1 0 0 +EDGE2 4245 3906 0.0231108 1.03735 1.58559 1 0 1 1 0 0 +EDGE2 4245 3946 0.0308229 1.01514 1.55957 1 0 1 1 0 0 +EDGE2 4245 3926 0.00201441 0.983207 1.56002 1 0 1 1 0 0 +EDGE2 4246 4245 -0.86406 -0.05628 -1.57485 1 0 1 1 0 0 +EDGE2 4246 3905 -0.989642 0.090483 1.57808 1 0 1 1 0 0 +EDGE2 4246 3945 -1.07356 0.0328384 -1.55301 1 0 1 1 0 0 +EDGE2 4246 4125 -0.989769 -0.0374255 -1.55857 1 0 1 1 0 0 +EDGE2 4246 4165 -1.05301 0.00763428 1.57898 1 0 1 1 0 0 +EDGE2 4246 3925 -1.00432 0.028676 -1.55372 1 0 1 1 0 0 +EDGE2 4246 3907 0.977559 0.119291 -0.0260652 1 0 1 1 0 0 +EDGE2 4246 3906 -0.0088112 -0.0206427 0.00535773 1 0 1 1 0 0 +EDGE2 4246 3946 -0.0304457 -0.0700372 0.00827053 1 0 1 1 0 0 +EDGE2 4246 3926 0.0470403 -0.000378432 0.0102119 1 0 1 1 0 0 +EDGE2 4246 3947 0.937831 0.111095 -0.0112588 1 0 1 1 0 0 +EDGE2 4246 3927 0.994962 -0.0763242 -0.00270074 1 0 1 1 0 0 +EDGE2 4247 3907 -0.0919173 -0.00625733 0.00514963 1 0 1 1 0 0 +EDGE2 4247 3906 -1.01307 -0.0436387 -0.00890325 1 0 1 1 0 0 +EDGE2 4247 3946 -0.975763 0.0675271 -0.0306081 1 0 1 1 0 0 +EDGE2 4247 4246 -0.946036 -0.0617216 -0.00283572 1 0 1 1 0 0 +EDGE2 4247 3926 -0.987354 -0.100824 -0.0124891 1 0 1 1 0 0 +EDGE2 4247 3947 0.0660824 -0.0711859 -0.00758499 1 0 1 1 0 0 +EDGE2 4247 3927 0.0277019 -0.0638001 -0.031149 1 0 1 1 0 0 +EDGE2 4247 3908 0.984754 -0.0219298 0.0310314 1 0 1 1 0 0 +EDGE2 4247 3948 1.02253 -0.023603 0.0186232 1 0 1 1 0 0 +EDGE2 4247 3928 0.994958 0.00293503 -0.0285642 1 0 1 1 0 0 +EDGE2 4248 3929 0.9854 -0.0543755 0.00470222 1 0 1 1 0 0 +EDGE2 4248 3907 -1.02993 -0.094078 -0.00225715 1 0 1 1 0 0 +EDGE2 4248 3947 -0.98006 0.0500232 -0.00376449 1 0 1 1 0 0 +EDGE2 4248 4247 -0.999861 -0.0398795 0.0198048 1 0 1 1 0 0 +EDGE2 4248 3927 -0.962394 0.0238052 0.0133633 1 0 1 1 0 0 +EDGE2 4248 3908 0.033904 -0.103764 0.0112165 1 0 1 1 0 0 +EDGE2 4248 3948 -0.0750186 -0.206498 0.028148 1 0 1 1 0 0 +EDGE2 4248 3928 -0.0565385 -0.0390113 -0.036484 1 0 1 1 0 0 +EDGE2 4248 3949 0.910096 0.0579502 0.0247889 1 0 1 1 0 0 +EDGE2 4248 3909 0.970318 0.038237 -0.0162776 1 0 1 1 0 0 +EDGE2 4249 3929 -0.0440983 0.131526 -0.00128348 1 0 1 1 0 0 +EDGE2 4249 3908 -0.923625 0.023974 0.0257689 1 0 1 1 0 0 +EDGE2 4249 3948 -0.804311 0.000727643 0.00774982 1 0 1 1 0 0 +EDGE2 4249 4248 -0.972353 -0.00981529 -0.00120165 1 0 1 1 0 0 +EDGE2 4249 3928 -1.02932 -0.0465066 0.00303309 1 0 1 1 0 0 +EDGE2 4249 3949 -0.0259111 0.0431847 0.026303 1 0 1 1 0 0 +EDGE2 4249 3970 0.954265 -0.0445994 -3.12458 1 0 1 1 0 0 +EDGE2 4249 3909 0.0129832 0.0228007 0.00932785 1 0 1 1 0 0 +EDGE2 4249 4110 0.982856 0.0200937 -3.15615 1 0 1 1 0 0 +EDGE2 4249 3910 0.952809 -0.0344918 0.0270882 1 0 1 1 0 0 +EDGE2 4249 3930 0.953813 -0.0498232 0.0286923 1 0 1 1 0 0 +EDGE2 4249 3950 1.01804 0.0363168 -0.00896165 1 0 1 1 0 0 +EDGE2 4250 3971 0.0341643 0.970644 1.55283 1 0 1 1 0 0 +EDGE2 4250 4111 -0.0558405 1.01819 1.5683 1 0 1 1 0 0 +EDGE2 4250 3911 0.0184587 1.03754 1.61412 1 0 1 1 0 0 +EDGE2 4250 3931 -0.0274844 0.938452 1.61341 1 0 1 1 0 0 +EDGE2 4250 3929 -0.988675 0.00576758 0.00483566 1 0 1 1 0 0 +EDGE2 4250 4249 -0.964128 0.0283508 0.0217974 1 0 1 1 0 0 +EDGE2 4250 3949 -1.00558 -0.0389253 -0.00245876 1 0 1 1 0 0 +EDGE2 4250 3969 0.975911 -0.00466094 -3.14825 1 0 1 1 0 0 +EDGE2 4250 3970 -0.00545756 0.0112092 -3.15193 1 0 1 1 0 0 +EDGE2 4250 3909 -1.06152 -0.00559662 0.0348398 1 0 1 1 0 0 +EDGE2 4250 4110 -0.00390871 0.00695184 -3.12353 1 0 1 1 0 0 +EDGE2 4250 3910 0.0450757 -0.0513103 0.0119483 1 0 1 1 0 0 +EDGE2 4250 3930 -0.0293169 -0.0284708 0.000609074 1 0 1 1 0 0 +EDGE2 4250 3950 0.00800857 -0.00195405 -0.0108429 1 0 1 1 0 0 +EDGE2 4250 4109 1.06363 -0.0624006 -3.12772 1 0 1 1 0 0 +EDGE2 4250 3951 -0.0570929 -1.04357 -1.60547 1 0 1 1 0 0 +EDGE2 4251 3971 0.0102855 -0.0427343 0.0036029 1 0 1 1 0 0 +EDGE2 4251 3932 0.985657 -0.0154686 -0.00448303 1 0 1 1 0 0 +EDGE2 4251 4112 1.01115 -0.0265736 -0.0138555 1 0 1 1 0 0 +EDGE2 4251 3972 0.967603 0.0469595 0.00192589 1 0 1 1 0 0 +EDGE2 4251 3912 1.00825 0.0187224 -0.0168567 1 0 1 1 0 0 +EDGE2 4251 4111 -0.00739929 0.0680853 0.0612968 1 0 1 1 0 0 +EDGE2 4251 3911 0.110154 -0.0156712 -0.000889058 1 0 1 1 0 0 +EDGE2 4251 3931 0.00813678 -0.0842685 0.0226122 1 0 1 1 0 0 +EDGE2 4251 3970 -0.967022 -0.0557813 1.58167 1 0 1 1 0 0 +EDGE2 4251 4250 -0.969064 0.00787773 -1.54118 1 0 1 1 0 0 +EDGE2 4251 4110 -0.941793 -0.0158256 1.55952 1 0 1 1 0 0 +EDGE2 4251 3910 -0.991321 0.0720447 -1.56291 1 0 1 1 0 0 +EDGE2 4251 3930 -0.998038 0.0111711 -1.58579 1 0 1 1 0 0 +EDGE2 4251 3950 -0.964178 0.0894637 -1.55299 1 0 1 1 0 0 +EDGE2 4252 3971 -1.06896 0.020642 -0.0485529 1 0 1 1 0 0 +EDGE2 4252 3913 1.0211 -0.0607034 -0.00313156 1 0 1 1 0 0 +EDGE2 4252 3973 0.881795 -0.0264641 -0.00354749 1 0 1 1 0 0 +EDGE2 4252 4113 1.02466 -0.0156039 -0.0164847 1 0 1 1 0 0 +EDGE2 4252 3933 1.01676 0.158963 0.000963174 1 0 1 1 0 0 +EDGE2 4252 3932 0.0210663 -0.0239373 -0.0182317 1 0 1 1 0 0 +EDGE2 4252 4112 0.0232066 0.0202514 0.00459101 1 0 1 1 0 0 +EDGE2 4252 3972 -0.0176358 0.0313402 0.027301 1 0 1 1 0 0 +EDGE2 4252 4251 -0.943612 -0.0993104 -0.0321041 1 0 1 1 0 0 +EDGE2 4252 3912 0.034208 -0.0514478 -0.030146 1 0 1 1 0 0 +EDGE2 4252 4111 -0.980549 0.0706444 -0.0059288 1 0 1 1 0 0 +EDGE2 4252 3911 -1.05801 0.0776204 0.00410919 1 0 1 1 0 0 +EDGE2 4252 3931 -0.989182 0.0602319 0.00964777 1 0 1 1 0 0 +EDGE2 4253 3913 0.0855734 0.0489907 0.00883557 1 0 1 1 0 0 +EDGE2 4253 3934 1.0132 -0.0169788 0.011813 1 0 1 1 0 0 +EDGE2 4253 3974 1.03081 -0.0998264 0.0154935 1 0 1 1 0 0 +EDGE2 4253 4114 0.911545 0.00366732 0.0207602 1 0 1 1 0 0 +EDGE2 4253 3914 0.997647 -0.0255637 0.0148109 1 0 1 1 0 0 +EDGE2 4253 3973 -0.000595981 0.0427551 0.0130739 1 0 1 1 0 0 +EDGE2 4253 4113 -0.101036 0.0432491 0.0216089 1 0 1 1 0 0 +EDGE2 4253 3933 0.0150386 0.0243745 -0.00988561 1 0 1 1 0 0 +EDGE2 4253 3932 -0.999544 0.0736198 0.0165307 1 0 1 1 0 0 +EDGE2 4253 4112 -1.09259 0.0480167 0.00511374 1 0 1 1 0 0 +EDGE2 4253 4252 -1.06794 0.0417864 -0.0261622 1 0 1 1 0 0 +EDGE2 4253 3972 -1.03239 -0.0290995 -0.0185196 1 0 1 1 0 0 +EDGE2 4253 3912 -0.939395 0.0446315 -0.01638 1 0 1 1 0 0 +EDGE2 4254 4015 1.10802 -0.0117894 -3.13362 1 0 1 1 0 0 +EDGE2 4254 4115 0.992753 -0.00396039 -0.00282437 1 0 1 1 0 0 +EDGE2 4254 3935 0.955002 -0.0145432 0.029392 1 0 1 1 0 0 +EDGE2 4254 3975 0.971328 -0.0486986 -0.00485651 1 0 1 1 0 0 +EDGE2 4254 3995 1.03272 0.049969 -3.17032 1 0 1 1 0 0 +EDGE2 4254 3915 0.932721 -0.0111753 -0.0170287 1 0 1 1 0 0 +EDGE2 4254 3913 -1.01343 0.020945 0.0546001 1 0 1 1 0 0 +EDGE2 4254 3934 0.028029 0.0621192 -0.00729877 1 0 1 1 0 0 +EDGE2 4254 3974 0.0651781 -0.0124107 -0.0408154 1 0 1 1 0 0 +EDGE2 4254 4114 0.118068 -0.0671521 -0.00998177 1 0 1 1 0 0 +EDGE2 4254 3914 0.0175138 0.0226961 0.00927474 1 0 1 1 0 0 +EDGE2 4254 3973 -1.04142 -0.0850848 -0.0336508 1 0 1 1 0 0 +EDGE2 4254 4113 -0.913853 -0.00651951 -0.0310592 1 0 1 1 0 0 +EDGE2 4254 4253 -0.949619 0.0237813 0.00545657 1 0 1 1 0 0 +EDGE2 4254 3933 -0.998615 -0.0350258 -0.000520498 1 0 1 1 0 0 +EDGE2 4255 3936 0.0294482 0.9864 1.54771 1 0 1 1 0 0 +EDGE2 4255 4116 -0.0184574 0.959934 1.56061 1 0 1 1 0 0 +EDGE2 4255 3916 -0.113886 0.959505 1.5955 1 0 1 1 0 0 +EDGE2 4255 4015 -0.0136727 0.0454076 -3.13721 1 0 1 1 0 0 +EDGE2 4255 4014 1.05189 0.0216972 -3.10382 1 0 1 1 0 0 +EDGE2 4255 3994 0.980025 0.0726579 -3.12701 1 0 1 1 0 0 +EDGE2 4255 4115 -0.00914406 -0.035153 0.00462263 1 0 1 1 0 0 +EDGE2 4255 4016 0.0244846 -1.01858 -1.55776 1 0 1 1 0 0 +EDGE2 4255 3935 0.113758 0.0531496 0.0130522 1 0 1 1 0 0 +EDGE2 4255 3975 0.0417316 0.0225581 0.0471111 1 0 1 1 0 0 +EDGE2 4255 3995 0.0679121 -0.0289697 -3.12823 1 0 1 1 0 0 +EDGE2 4255 3915 -0.0723988 -0.0632506 0.00691116 1 0 1 1 0 0 +EDGE2 4255 3976 0.0182573 -1.01474 -1.56967 1 0 1 1 0 0 +EDGE2 4255 3996 -0.04088 -0.992319 -1.55844 1 0 1 1 0 0 +EDGE2 4255 4254 -1.02797 -0.0145191 0.0270737 1 0 1 1 0 0 +EDGE2 4255 3934 -0.991401 -0.0200168 0.0107623 1 0 1 1 0 0 +EDGE2 4255 3974 -1.03786 -0.0426295 0.000817373 1 0 1 1 0 0 +EDGE2 4255 4114 -1.04303 0.00119154 0.0252607 1 0 1 1 0 0 +EDGE2 4255 3914 -1.03627 0.000503622 0.0138557 1 0 1 1 0 0 +EDGE2 4256 3917 0.990323 0.0464035 0.0122629 1 0 1 1 0 0 +EDGE2 4256 3937 0.983409 0.00595255 -0.0110679 1 0 1 1 0 0 +EDGE2 4256 4117 1.03748 0.0670878 0.0244811 1 0 1 1 0 0 +EDGE2 4256 3936 0.0116858 0.0490512 0.0234028 1 0 1 1 0 0 +EDGE2 4256 4116 -0.0978822 -0.127183 -0.0157518 1 0 1 1 0 0 +EDGE2 4256 3916 0.00526491 -0.00960401 -0.0212894 1 0 1 1 0 0 +EDGE2 4256 4015 -1.01124 -0.0400593 1.54739 1 0 1 1 0 0 +EDGE2 4256 4255 -1.04158 0.049562 -1.56704 1 0 1 1 0 0 +EDGE2 4256 4115 -0.97321 0.0084089 -1.55878 1 0 1 1 0 0 +EDGE2 4256 3935 -1.04081 -0.0302675 -1.59666 1 0 1 1 0 0 +EDGE2 4256 3975 -1.04854 -0.0784812 -1.55528 1 0 1 1 0 0 +EDGE2 4256 3995 -0.929599 0.0249161 1.56597 1 0 1 1 0 0 +EDGE2 4256 3915 -0.981243 -0.01895 -1.59328 1 0 1 1 0 0 +EDGE2 4257 4118 1.08946 -0.040521 0.0136198 1 0 1 1 0 0 +EDGE2 4257 3918 0.967422 -0.0017142 -0.00768938 1 0 1 1 0 0 +EDGE2 4257 3938 0.98437 -0.031992 0.0143334 1 0 1 1 0 0 +EDGE2 4257 4256 -0.960471 -0.0523297 -0.00118439 1 0 1 1 0 0 +EDGE2 4257 3917 0.0668885 0.0331991 0.0228589 1 0 1 1 0 0 +EDGE2 4257 3937 0.0124532 0.0100685 -0.00964179 1 0 1 1 0 0 +EDGE2 4257 4117 -0.0437529 -0.0431272 0.0137367 1 0 1 1 0 0 +EDGE2 4257 3936 -0.974242 -0.0272575 -0.00250628 1 0 1 1 0 0 +EDGE2 4257 4116 -0.991622 0.0521371 0.000783273 1 0 1 1 0 0 +EDGE2 4257 3916 -1.01263 0.00945508 0.0150486 1 0 1 1 0 0 +EDGE2 4258 4119 1.01537 0.0207098 0.00251638 1 0 1 1 0 0 +EDGE2 4258 4257 -1.05859 -0.00851431 -0.0231804 1 0 1 1 0 0 +EDGE2 4258 4118 -0.0434446 0.0864264 0.015965 1 0 1 1 0 0 +EDGE2 4258 3919 1.02204 -0.0111497 -0.0106177 1 0 1 1 0 0 +EDGE2 4258 3939 0.971729 0.0277701 0.0125016 1 0 1 1 0 0 +EDGE2 4258 3918 0.00486906 0.0489487 -0.0309663 1 0 1 1 0 0 +EDGE2 4258 3938 0.0305005 0.0476223 0.0353415 1 0 1 1 0 0 +EDGE2 4258 3917 -1.00609 -0.021658 -0.0112366 1 0 1 1 0 0 +EDGE2 4258 3937 -1.04458 0.0147705 0.0151507 1 0 1 1 0 0 +EDGE2 4258 4117 -0.940014 -0.06646 0.00101004 1 0 1 1 0 0 +EDGE2 4259 4119 0.129236 -0.037335 0.0189505 1 0 1 1 0 0 +EDGE2 4259 4120 1.02323 0.00886382 0.000777834 1 0 1 1 0 0 +EDGE2 4259 4240 0.95638 0.0144846 -3.13396 1 0 1 1 0 0 +EDGE2 4259 3920 1.00094 0.086024 0.0109329 1 0 1 1 0 0 +EDGE2 4259 3940 1.05301 0.0651662 -0.0162112 1 0 1 1 0 0 +EDGE2 4259 4118 -1.01246 -0.0339968 -0.00441399 1 0 1 1 0 0 +EDGE2 4259 3919 -0.0499106 -0.0286258 0.0257939 1 0 1 1 0 0 +EDGE2 4259 3939 0.0570678 -0.0199336 0.0303779 1 0 1 1 0 0 +EDGE2 4259 4258 -1.02012 0.00697499 -0.00338191 1 0 1 1 0 0 +EDGE2 4259 3918 -0.978191 0.00508377 -0.00972028 1 0 1 1 0 0 +EDGE2 4259 3938 -0.96761 0.0303875 -0.00975843 1 0 1 1 0 0 +EDGE2 4260 4119 -0.879795 -0.0392594 0.0235262 1 0 1 1 0 0 +EDGE2 4260 4120 0.000795933 0.0238828 0.00555928 1 0 1 1 0 0 +EDGE2 4260 4239 1.06076 0.0356211 -3.13466 1 0 1 1 0 0 +EDGE2 4260 4240 0.0561351 0.0423755 -3.16713 1 0 1 1 0 0 +EDGE2 4260 3920 -0.0369269 0.0629595 -0.0281686 1 0 1 1 0 0 +EDGE2 4260 3940 -0.0315455 0.0474666 0.0129486 1 0 1 1 0 0 +EDGE2 4260 4259 -1.00713 0.0476806 0.0025777 1 0 1 1 0 0 +EDGE2 4260 3919 -0.999185 0.071324 0.0355132 1 0 1 1 0 0 +EDGE2 4260 3939 -0.934663 -0.10957 -0.00160973 1 0 1 1 0 0 +EDGE2 4260 4121 0.0513401 1.09939 1.56666 1 0 1 1 0 0 +EDGE2 4260 4241 0.0356445 1.048 1.56533 1 0 1 1 0 0 +EDGE2 4260 3921 0.0237558 0.939763 1.59544 1 0 1 1 0 0 +EDGE2 4260 3941 -0.0481347 0.942633 1.55915 1 0 1 1 0 0 +EDGE2 4261 4120 -1.04171 -0.0135868 -1.57953 1 0 1 1 0 0 +EDGE2 4261 4260 -1.01704 0.00040067 -1.58535 1 0 1 1 0 0 +EDGE2 4261 4240 -0.906029 -0.0432978 1.57252 1 0 1 1 0 0 +EDGE2 4261 3920 -0.987998 -0.00380093 -1.55715 1 0 1 1 0 0 +EDGE2 4261 3940 -0.972286 0.0140626 -1.59687 1 0 1 1 0 0 +EDGE2 4261 4121 -0.0173055 -0.01276 0.00725014 1 0 1 1 0 0 +EDGE2 4261 4241 -0.0155906 0.0855519 0.0115844 1 0 1 1 0 0 +EDGE2 4261 4122 0.956486 0.0238314 -0.0229365 1 0 1 1 0 0 +EDGE2 4261 3921 -0.0557519 0.0282643 -0.0334559 1 0 1 1 0 0 +EDGE2 4261 3941 -0.0198509 -0.0415473 0.0330756 1 0 1 1 0 0 +EDGE2 4261 4242 1.02234 -0.0592987 0.0222403 1 0 1 1 0 0 +EDGE2 4261 3922 0.95398 -0.0611585 -0.02943 1 0 1 1 0 0 +EDGE2 4261 3942 0.96456 -0.0260308 0.015316 1 0 1 1 0 0 +EDGE2 4262 4121 -1.00911 0.0636058 0.000291735 1 0 1 1 0 0 +EDGE2 4262 4261 -0.963843 0.0367111 0.00598741 1 0 1 1 0 0 +EDGE2 4262 4241 -0.992931 0.0210673 -0.0339083 1 0 1 1 0 0 +EDGE2 4262 4243 1.01086 -0.0355239 0.000171207 1 0 1 1 0 0 +EDGE2 4262 4122 -0.00218586 -0.0466157 0.00847265 1 0 1 1 0 0 +EDGE2 4262 3921 -1.05383 -0.0199747 -0.0214124 1 0 1 1 0 0 +EDGE2 4262 3941 -0.944164 0.0427633 -0.0179784 1 0 1 1 0 0 +EDGE2 4262 4242 0.0586851 0.0854097 -0.00580099 1 0 1 1 0 0 +EDGE2 4262 3922 0.013595 -0.0282038 -0.0297843 1 0 1 1 0 0 +EDGE2 4262 3942 -0.00795321 0.0653147 0.0100789 1 0 1 1 0 0 +EDGE2 4262 3923 0.97903 -0.00492626 0.0266912 1 0 1 1 0 0 +EDGE2 4262 3943 1.11354 0.0278527 0.00485159 1 0 1 1 0 0 +EDGE2 4262 4123 1.01175 -0.0143037 -0.0108846 1 0 1 1 0 0 +EDGE2 4263 4243 0.0636032 0.042465 -0.00671982 1 0 1 1 0 0 +EDGE2 4263 4122 -1.00917 -0.0299916 -0.0235803 1 0 1 1 0 0 +EDGE2 4263 4262 -0.938565 -0.0397905 -0.0213288 1 0 1 1 0 0 +EDGE2 4263 4242 -1.03182 -0.0693896 -0.0160683 1 0 1 1 0 0 +EDGE2 4263 3922 -0.947228 0.0611755 -0.0135916 1 0 1 1 0 0 +EDGE2 4263 3942 -1.02418 0.143997 -0.033062 1 0 1 1 0 0 +EDGE2 4263 4244 0.952049 0.0218612 -0.0351248 1 0 1 1 0 0 +EDGE2 4263 3923 -0.0156234 0.122057 0.0240468 1 0 1 1 0 0 +EDGE2 4263 3943 -0.0588895 -0.0134631 -0.0114316 1 0 1 1 0 0 +EDGE2 4263 4123 -0.0287753 0.0191589 0.0348939 1 0 1 1 0 0 +EDGE2 4263 3944 1.02313 0.00226251 -0.0034472 1 0 1 1 0 0 +EDGE2 4263 4124 1.00703 -0.03088 0.034976 1 0 1 1 0 0 +EDGE2 4263 3924 1.03047 0.0419712 0.0180269 1 0 1 1 0 0 +EDGE2 4264 4243 -1.09066 -0.0128569 0.0419629 1 0 1 1 0 0 +EDGE2 4264 4263 -1.02327 -0.0475853 0.0237979 1 0 1 1 0 0 +EDGE2 4264 4244 0.0120776 -0.0377792 0.040751 1 0 1 1 0 0 +EDGE2 4264 3923 -1.07512 0.036732 -0.0207408 1 0 1 1 0 0 +EDGE2 4264 3943 -1.09672 -0.0656874 0.0179052 1 0 1 1 0 0 +EDGE2 4264 4123 -0.98749 -0.0403606 -0.0144208 1 0 1 1 0 0 +EDGE2 4264 3944 0.0107109 0.0255888 -0.00771955 1 0 1 1 0 0 +EDGE2 4264 4124 0.0265615 0.0621243 0.00459337 1 0 1 1 0 0 +EDGE2 4264 3924 -0.0320099 -0.0707647 0.00667382 1 0 1 1 0 0 +EDGE2 4264 4245 1.04174 -0.0349352 0.000774512 1 0 1 1 0 0 +EDGE2 4264 3905 1.05291 0.0417242 -3.10876 1 0 1 1 0 0 +EDGE2 4264 3945 0.969086 0.0120226 -0.00631436 1 0 1 1 0 0 +EDGE2 4264 4125 0.942122 0.0156554 0.00262202 1 0 1 1 0 0 +EDGE2 4264 4165 1.01464 -0.071185 -3.155 1 0 1 1 0 0 +EDGE2 4264 3925 0.952283 0.000712327 -0.00983929 1 0 1 1 0 0 +EDGE2 4265 4244 -1.11197 0.00580598 0.0307 1 0 1 1 0 0 +EDGE2 4265 4264 -0.88776 0.0444974 0.00218624 1 0 1 1 0 0 +EDGE2 4265 3944 -0.979583 0.0257293 -0.0154644 1 0 1 1 0 0 +EDGE2 4265 4124 -0.92942 0.00397626 -0.0063544 1 0 1 1 0 0 +EDGE2 4265 3924 -1.07862 0.0543363 -0.00523896 1 0 1 1 0 0 +EDGE2 4265 4245 -0.087949 -0.0106247 -0.0114763 1 0 1 1 0 0 +EDGE2 4265 4126 -0.0531769 -1.03003 -1.55778 1 0 1 1 0 0 +EDGE2 4265 4166 0.0232833 -1.04635 -1.5849 1 0 1 1 0 0 +EDGE2 4265 3905 0.0240299 0.00671251 -3.10876 1 0 1 1 0 0 +EDGE2 4265 3945 -0.0547567 0.0265624 0.0224292 1 0 1 1 0 0 +EDGE2 4265 4125 0.0235548 -0.0405932 -0.00378328 1 0 1 1 0 0 +EDGE2 4265 4165 0.011533 -0.131662 -3.13468 1 0 1 1 0 0 +EDGE2 4265 3925 -0.0535905 -0.0669569 -0.0115771 1 0 1 1 0 0 +EDGE2 4265 3904 0.994417 -0.0640964 -3.13528 1 0 1 1 0 0 +EDGE2 4265 4164 1.03128 -0.0246006 -3.1467 1 0 1 1 0 0 +EDGE2 4265 3906 0.0308521 0.985245 1.5732 1 0 1 1 0 0 +EDGE2 4265 3946 -0.0594448 1.00788 1.55472 1 0 1 1 0 0 +EDGE2 4265 4246 0.0380848 1.01929 1.59326 1 0 1 1 0 0 +EDGE2 4265 3926 0.131394 1.03629 1.58805 1 0 1 1 0 0 +EDGE2 4266 4245 -1.09023 -0.0777798 -1.57418 1 0 1 1 0 0 +EDGE2 4266 4265 -0.985149 -0.0668593 -1.55575 1 0 1 1 0 0 +EDGE2 4266 3905 -0.952158 0.0291659 1.57079 1 0 1 1 0 0 +EDGE2 4266 3945 -0.94239 0.000454571 -1.56344 1 0 1 1 0 0 +EDGE2 4266 4125 -1.03566 -0.0271618 -1.60084 1 0 1 1 0 0 +EDGE2 4266 4165 -0.915635 -0.0194001 1.5798 1 0 1 1 0 0 +EDGE2 4266 3925 -1.08729 0.0398309 -1.58293 1 0 1 1 0 0 +EDGE2 4266 3907 0.891117 0.00289136 -0.005035 1 0 1 1 0 0 +EDGE2 4266 3906 0.000474539 0.0329849 0.0045215 1 0 1 1 0 0 +EDGE2 4266 3946 -0.0201167 -0.0458955 0.0189756 1 0 1 1 0 0 +EDGE2 4266 4246 0.017093 -0.0200962 0.0157439 1 0 1 1 0 0 +EDGE2 4266 3926 -0.0135811 0.0202183 -0.00284898 1 0 1 1 0 0 +EDGE2 4266 3947 0.969084 -0.00684742 -0.0239324 1 0 1 1 0 0 +EDGE2 4266 4247 1.0001 -0.0231102 0.00377387 1 0 1 1 0 0 +EDGE2 4266 3927 1.08049 0.00262048 -0.0125593 1 0 1 1 0 0 +EDGE2 4267 3907 -0.045339 0.0940637 -0.0172553 1 0 1 1 0 0 +EDGE2 4267 3906 -1.00101 0.00705061 -0.0135485 1 0 1 1 0 0 +EDGE2 4267 3946 -1.05063 -0.00212917 -0.0048484 1 0 1 1 0 0 +EDGE2 4267 4246 -0.945654 -0.0628596 0.0209109 1 0 1 1 0 0 +EDGE2 4267 4266 -0.995884 -0.0304683 0.00169779 1 0 1 1 0 0 +EDGE2 4267 3926 -0.967217 0.0377805 -0.00859866 1 0 1 1 0 0 +EDGE2 4267 3947 0.00475237 -0.0405521 -0.0218181 1 0 1 1 0 0 +EDGE2 4267 4247 0.0305134 0.0235021 -0.0244193 1 0 1 1 0 0 +EDGE2 4267 3927 -0.0582813 -0.0130193 -0.00121718 1 0 1 1 0 0 +EDGE2 4267 3908 1.01753 0.006087 0.000267495 1 0 1 1 0 0 +EDGE2 4267 3948 1.01002 0.0192137 -0.00751916 1 0 1 1 0 0 +EDGE2 4267 4248 0.953603 -0.00839638 -0.0341884 1 0 1 1 0 0 +EDGE2 4267 3928 0.919038 -0.00466978 -0.0161772 1 0 1 1 0 0 +EDGE2 4268 3929 0.982765 -0.0154108 0.00799584 1 0 1 1 0 0 +EDGE2 4268 3907 -1.02772 0.0236273 0.00420237 1 0 1 1 0 0 +EDGE2 4268 3947 -0.905874 -0.0341686 0.00954868 1 0 1 1 0 0 +EDGE2 4268 4247 -1.0472 -0.030457 -0.0201331 1 0 1 1 0 0 +EDGE2 4268 4267 -0.969568 -0.042117 0.0349454 1 0 1 1 0 0 +EDGE2 4268 3927 -1.0163 0.0403324 0.0259126 1 0 1 1 0 0 +EDGE2 4268 3908 0.0587269 0.00913305 -0.0428769 1 0 1 1 0 0 +EDGE2 4268 3948 -0.0225949 -0.103886 0.0115917 1 0 1 1 0 0 +EDGE2 4268 4248 0.0240342 0.0637205 -0.00309008 1 0 1 1 0 0 +EDGE2 4268 3928 -0.0272244 -0.0046275 0.00838634 1 0 1 1 0 0 +EDGE2 4268 4249 1.01166 0.073831 -0.00969506 1 0 1 1 0 0 +EDGE2 4268 3949 1.018 0.0394502 -0.0347508 1 0 1 1 0 0 +EDGE2 4268 3909 1.0306 -0.0152755 -0.0266836 1 0 1 1 0 0 +EDGE2 4269 3929 0.0790149 0.00524581 -0.0170396 1 0 1 1 0 0 +EDGE2 4269 3908 -0.991503 -0.0436596 0.00589224 1 0 1 1 0 0 +EDGE2 4269 3948 -0.976523 0.0375386 0.0108872 1 0 1 1 0 0 +EDGE2 4269 4248 -0.976981 -0.0752399 -0.00810529 1 0 1 1 0 0 +EDGE2 4269 4268 -1.03768 -0.00495657 0.0237136 1 0 1 1 0 0 +EDGE2 4269 3928 -0.990749 0.00508287 -0.0340155 1 0 1 1 0 0 +EDGE2 4269 4249 0.0963425 0.0473621 -0.0255355 1 0 1 1 0 0 +EDGE2 4269 3949 -0.0759936 0.062054 -0.00110274 1 0 1 1 0 0 +EDGE2 4269 3970 1.02857 -0.0299554 -3.13108 1 0 1 1 0 0 +EDGE2 4269 4250 1.0606 -0.00831581 0.0143341 1 0 1 1 0 0 +EDGE2 4269 3909 0.0739775 -0.0772525 0.00309681 1 0 1 1 0 0 +EDGE2 4269 4110 0.899331 0.00740923 -3.12988 1 0 1 1 0 0 +EDGE2 4269 3910 0.970163 0.0686314 0.0304358 1 0 1 1 0 0 +EDGE2 4269 3930 1.07547 -0.0464377 0.0103649 1 0 1 1 0 0 +EDGE2 4269 3950 0.948098 0.0544418 -0.0109976 1 0 1 1 0 0 +EDGE2 4270 3971 -0.130878 1.04741 1.53404 1 0 1 1 0 0 +EDGE2 4270 4251 0.0574813 1.01099 1.56573 1 0 1 1 0 0 +EDGE2 4270 4111 -0.0382626 1.03282 1.61442 1 0 1 1 0 0 +EDGE2 4270 3911 -0.0994645 0.93109 1.55666 1 0 1 1 0 0 +EDGE2 4270 3931 0.00569031 0.996007 1.58465 1 0 1 1 0 0 +EDGE2 4270 3929 -1.00702 -0.00343243 -0.00652314 1 0 1 1 0 0 +EDGE2 4270 4249 -0.993816 0.0120776 -0.0115144 1 0 1 1 0 0 +EDGE2 4270 4269 -1.03428 -0.00310629 0.00815687 1 0 1 1 0 0 +EDGE2 4270 3949 -1.01649 0.0363781 0.0036976 1 0 1 1 0 0 +EDGE2 4270 3969 1.02666 -0.0050906 -3.14633 1 0 1 1 0 0 +EDGE2 4270 3970 0.0759817 -0.0360336 -3.16272 1 0 1 1 0 0 +EDGE2 4270 4250 -0.00632354 0.0417237 -0.012278 1 0 1 1 0 0 +EDGE2 4270 3909 -0.965173 -0.0752095 -0.00820737 1 0 1 1 0 0 +EDGE2 4270 4110 -0.0505981 0.00217524 -3.15477 1 0 1 1 0 0 +EDGE2 4270 3910 0.0182079 -0.110859 -0.00616342 1 0 1 1 0 0 +EDGE2 4270 3930 0.0352251 -0.0163693 0.00502898 1 0 1 1 0 0 +EDGE2 4270 3950 -0.0334142 -0.0218766 0.00571513 1 0 1 1 0 0 +EDGE2 4270 4109 0.881093 0.0494566 -3.15152 1 0 1 1 0 0 +EDGE2 4270 3951 0.0240754 -0.97172 -1.58438 1 0 1 1 0 0 +EDGE2 4271 3971 -0.0701471 0.0785449 -0.0114103 1 0 1 1 0 0 +EDGE2 4271 3932 1.11846 -0.0236082 -0.0276471 1 0 1 1 0 0 +EDGE2 4271 4112 0.908468 -0.00687925 -0.0169902 1 0 1 1 0 0 +EDGE2 4271 4252 1.01787 0.0149798 -0.0101557 1 0 1 1 0 0 +EDGE2 4271 3972 0.965176 0.00421947 -0.00443759 1 0 1 1 0 0 +EDGE2 4271 4251 0.0350683 0.0151042 -0.018054 1 0 1 1 0 0 +EDGE2 4271 3912 0.976901 0.0550103 0.0405886 1 0 1 1 0 0 +EDGE2 4271 4111 -0.0234839 -0.0261373 0.0150654 1 0 1 1 0 0 +EDGE2 4271 3911 0.045556 0.0075534 -0.000358006 1 0 1 1 0 0 +EDGE2 4271 3931 0.0741795 -0.0416557 -0.0147157 1 0 1 1 0 0 +EDGE2 4271 3970 -1.01407 0.0669533 1.56473 1 0 1 1 0 0 +EDGE2 4271 4250 -1.03171 0.00538858 -1.5545 1 0 1 1 0 0 +EDGE2 4271 4270 -0.900432 -0.00708732 -1.59138 1 0 1 1 0 0 +EDGE2 4271 4110 -0.927467 0.0516075 1.5737 1 0 1 1 0 0 +EDGE2 4271 3910 -1.04427 0.0288017 -1.5948 1 0 1 1 0 0 +EDGE2 4271 3930 -1.04261 -0.0153926 -1.57069 1 0 1 1 0 0 +EDGE2 4271 3950 -0.974702 0.00476821 -1.57129 1 0 1 1 0 0 +EDGE2 4272 3971 -0.983405 0.0308757 -0.0184344 1 0 1 1 0 0 +EDGE2 4272 3913 0.938637 0.0178346 0.00723475 1 0 1 1 0 0 +EDGE2 4272 3973 0.946846 -0.0117584 0.00010655 1 0 1 1 0 0 +EDGE2 4272 4113 0.945962 0.0391172 -0.0071039 1 0 1 1 0 0 +EDGE2 4272 4253 1.01603 0.0283898 0.0198276 1 0 1 1 0 0 +EDGE2 4272 3933 0.994137 0.0193799 -0.0350988 1 0 1 1 0 0 +EDGE2 4272 3932 0.0071532 -0.0462074 -0.00237413 1 0 1 1 0 0 +EDGE2 4272 4112 -0.0157064 0.0528054 -0.0123776 1 0 1 1 0 0 +EDGE2 4272 4252 0.0427561 -0.0570488 -0.00515584 1 0 1 1 0 0 +EDGE2 4272 3972 -0.0608557 -0.0797982 0.013056 1 0 1 1 0 0 +EDGE2 4272 4251 -0.989792 -0.0210087 0.0285411 1 0 1 1 0 0 +EDGE2 4272 4271 -1.004 -0.0799696 0.0227481 1 0 1 1 0 0 +EDGE2 4272 3912 0.0445188 0.00840481 -0.00162841 1 0 1 1 0 0 +EDGE2 4272 4111 -1.08937 -0.0484967 0.0250514 1 0 1 1 0 0 +EDGE2 4272 3911 -0.994516 0.0120576 0.00357439 1 0 1 1 0 0 +EDGE2 4272 3931 -1.00622 -0.0331201 0.0302632 1 0 1 1 0 0 +EDGE2 4273 4254 1.00475 -0.00025402 0.0230165 1 0 1 1 0 0 +EDGE2 4273 3913 0.0288429 0.0321211 -0.00854306 1 0 1 1 0 0 +EDGE2 4273 3934 0.952952 0.0141506 -0.0225592 1 0 1 1 0 0 +EDGE2 4273 3974 1.06301 0.0189236 -0.0195549 1 0 1 1 0 0 +EDGE2 4273 4114 0.997801 -0.144499 0.0221979 1 0 1 1 0 0 +EDGE2 4273 3914 1.04842 -0.052506 -0.0418491 1 0 1 1 0 0 +EDGE2 4273 3973 -0.0299373 -0.0153151 0.0530937 1 0 1 1 0 0 +EDGE2 4273 4113 -0.082212 -0.0319928 -0.0246167 1 0 1 1 0 0 +EDGE2 4273 4253 0.0164036 0.0149393 -0.0238919 1 0 1 1 0 0 +EDGE2 4273 3933 -0.0420234 -0.0161387 -0.0038442 1 0 1 1 0 0 +EDGE2 4273 3932 -0.973196 0.0184708 0.0315485 1 0 1 1 0 0 +EDGE2 4273 4112 -0.958496 0.0322778 -0.0043561 1 0 1 1 0 0 +EDGE2 4273 4252 -0.95539 0.012491 0.0171612 1 0 1 1 0 0 +EDGE2 4273 4272 -1.09317 0.0386646 0.0197316 1 0 1 1 0 0 +EDGE2 4273 3972 -0.962163 -0.102537 -0.00397489 1 0 1 1 0 0 +EDGE2 4273 3912 -0.963958 -0.000437169 0.0188117 1 0 1 1 0 0 +EDGE2 4274 4015 1.06295 0.0325638 -3.11783 1 0 1 1 0 0 +EDGE2 4274 4255 0.875474 -0.0445008 -0.0108866 1 0 1 1 0 0 +EDGE2 4274 4115 1.03211 0.0527073 0.00907897 1 0 1 1 0 0 +EDGE2 4274 3935 0.936452 -0.0410279 0.00410659 1 0 1 1 0 0 +EDGE2 4274 3975 0.968614 0.0800917 -0.00622444 1 0 1 1 0 0 +EDGE2 4274 3995 0.979824 -0.014991 -3.14499 1 0 1 1 0 0 +EDGE2 4274 3915 1.03813 -0.0435948 -0.0261589 1 0 1 1 0 0 +EDGE2 4274 4254 0.0718792 0.0367033 0.0268227 1 0 1 1 0 0 +EDGE2 4274 3913 -0.937742 0.0520107 -0.00361747 1 0 1 1 0 0 +EDGE2 4274 4273 -0.98912 -0.0692098 0.0371947 1 0 1 1 0 0 +EDGE2 4274 3934 0.0382537 -0.0301024 0.0202163 1 0 1 1 0 0 +EDGE2 4274 3974 -0.0805176 -0.00775005 -0.0181249 1 0 1 1 0 0 +EDGE2 4274 4114 0.0486627 0.0107704 -0.0169324 1 0 1 1 0 0 +EDGE2 4274 3914 0.071542 -0.0293836 -0.0293863 1 0 1 1 0 0 +EDGE2 4274 3973 -0.925506 -0.0931066 -0.00236299 1 0 1 1 0 0 +EDGE2 4274 4113 -1.06223 -0.0209853 -0.0241531 1 0 1 1 0 0 +EDGE2 4274 4253 -1.04882 0.0983065 0.00535951 1 0 1 1 0 0 +EDGE2 4274 3933 -1.0258 0.0198982 -0.00995426 1 0 1 1 0 0 +EDGE2 4275 4256 0.113527 1.0187 1.57898 1 0 1 1 0 0 +EDGE2 4275 3936 0.0455403 1.06537 1.61935 1 0 1 1 0 0 +EDGE2 4275 4116 0.0343888 0.98515 1.57364 1 0 1 1 0 0 +EDGE2 4275 3916 0.0399441 0.914702 1.56339 1 0 1 1 0 0 +EDGE2 4275 4015 0.0323563 -0.002017 -3.12965 1 0 1 1 0 0 +EDGE2 4275 4014 0.926293 -0.0948178 -3.13969 1 0 1 1 0 0 +EDGE2 4275 4255 -0.00557442 0.0511225 -0.0143077 1 0 1 1 0 0 +EDGE2 4275 3994 1.054 0.0591566 -3.15866 1 0 1 1 0 0 +EDGE2 4275 4115 -0.00184489 0.0198872 -0.00994365 1 0 1 1 0 0 +EDGE2 4275 4016 0.0862918 -1.02368 -1.53727 1 0 1 1 0 0 +EDGE2 4275 3935 0.0301414 -0.0017664 0.00908402 1 0 1 1 0 0 +EDGE2 4275 3975 -0.0213838 0.0695418 0.0262731 1 0 1 1 0 0 +EDGE2 4275 3995 0.0469487 0.00230547 -3.15739 1 0 1 1 0 0 +EDGE2 4275 3915 0.00809687 -0.0181111 0.0102525 1 0 1 1 0 0 +EDGE2 4275 3976 0.0105585 -1.02693 -1.58048 1 0 1 1 0 0 +EDGE2 4275 3996 -0.0634338 -0.950421 -1.57901 1 0 1 1 0 0 +EDGE2 4275 4254 -1.03112 0.0651653 0.00724748 1 0 1 1 0 0 +EDGE2 4275 4274 -0.989132 0.0352227 0.00438303 1 0 1 1 0 0 +EDGE2 4275 3934 -1.03426 0.0328938 0.00228041 1 0 1 1 0 0 +EDGE2 4275 3974 -1.00251 -0.0184763 -0.0212055 1 0 1 1 0 0 +EDGE2 4275 4114 -0.950383 -0.0267652 0.0136583 1 0 1 1 0 0 +EDGE2 4275 3914 -0.979223 -0.00147029 -0.0225452 1 0 1 1 0 0 +EDGE2 4276 4257 1.04035 0.0633541 0.00475394 1 0 1 1 0 0 +EDGE2 4276 4256 -0.0636298 -0.0126831 0.000764732 1 0 1 1 0 0 +EDGE2 4276 3917 1.10888 -0.00214695 0.00295479 1 0 1 1 0 0 +EDGE2 4276 3937 0.945511 0.00203707 0.0188234 1 0 1 1 0 0 +EDGE2 4276 4117 0.845787 0.0151636 0.00545576 1 0 1 1 0 0 +EDGE2 4276 3936 -0.00226864 -0.0315137 -0.0180731 1 0 1 1 0 0 +EDGE2 4276 4116 0.0295275 0.0219346 -0.00746986 1 0 1 1 0 0 +EDGE2 4276 3916 0.0071342 0.0207908 0.000956978 1 0 1 1 0 0 +EDGE2 4276 4015 -1.03077 0.0234716 1.56048 1 0 1 1 0 0 +EDGE2 4276 4255 -1.00787 -0.014531 -1.60188 1 0 1 1 0 0 +EDGE2 4276 4275 -1.06094 -0.0198455 -1.56121 1 0 1 1 0 0 +EDGE2 4276 4115 -0.979582 -0.0678941 -1.55851 1 0 1 1 0 0 +EDGE2 4276 3935 -0.978416 -0.0553238 -1.57068 1 0 1 1 0 0 +EDGE2 4276 3975 -0.986049 -0.0208308 -1.55607 1 0 1 1 0 0 +EDGE2 4276 3995 -1.06227 0.096723 1.58478 1 0 1 1 0 0 +EDGE2 4276 3915 -0.986191 0.0831041 -1.56473 1 0 1 1 0 0 +EDGE2 4277 4257 0.025015 -0.0482245 0.00261672 1 0 1 1 0 0 +EDGE2 4277 4118 0.978059 0.0654929 -0.00587319 1 0 1 1 0 0 +EDGE2 4277 4258 0.946541 -0.025604 0.0541308 1 0 1 1 0 0 +EDGE2 4277 3918 1.04098 0.0908207 -0.0192294 1 0 1 1 0 0 +EDGE2 4277 3938 1.02488 -0.0286237 0.00357267 1 0 1 1 0 0 +EDGE2 4277 4256 -1.014 -0.101097 -0.0158555 1 0 1 1 0 0 +EDGE2 4277 3917 0.0131721 0.00714127 0.00684154 1 0 1 1 0 0 +EDGE2 4277 3937 0.0205476 0.0119486 -0.0142243 1 0 1 1 0 0 +EDGE2 4277 4117 0.0660851 -0.0294011 -0.0147299 1 0 1 1 0 0 +EDGE2 4277 4276 -1.00709 0.0561003 0.00515862 1 0 1 1 0 0 +EDGE2 4277 3936 -1.00193 0.0827212 0.0108985 1 0 1 1 0 0 +EDGE2 4277 4116 -0.99339 0.0719138 0.0126058 1 0 1 1 0 0 +EDGE2 4277 3916 -1.01364 -0.13727 -0.0281899 1 0 1 1 0 0 +EDGE2 4278 4119 0.906241 -0.00956292 0.00147231 1 0 1 1 0 0 +EDGE2 4278 4259 0.970175 0.0606095 0.0083525 1 0 1 1 0 0 +EDGE2 4278 4257 -1.03756 0.0235602 0.0123443 1 0 1 1 0 0 +EDGE2 4278 4118 -0.0124179 0.023166 -0.000746528 1 0 1 1 0 0 +EDGE2 4278 3919 0.980037 0.0714416 0.023454 1 0 1 1 0 0 +EDGE2 4278 3939 1.05778 0.00263785 0.0250351 1 0 1 1 0 0 +EDGE2 4278 4258 0.0980308 0.0410468 -0.00442724 1 0 1 1 0 0 +EDGE2 4278 4277 -1.0027 0.00187026 0.0427472 1 0 1 1 0 0 +EDGE2 4278 3918 0.0553771 0.0139393 0.000914861 1 0 1 1 0 0 +EDGE2 4278 3938 -0.044098 -0.0284749 -0.00111895 1 0 1 1 0 0 +EDGE2 4278 3917 -0.979531 -0.0490605 0.045492 1 0 1 1 0 0 +EDGE2 4278 3937 -1.10426 0.00482909 -0.00944056 1 0 1 1 0 0 +EDGE2 4278 4117 -1.01552 0.00924446 -0.0224942 1 0 1 1 0 0 +EDGE2 4279 4119 -0.0218966 0.0595293 0.0202302 1 0 1 1 0 0 +EDGE2 4279 4120 1.00447 0.0358501 0.0081553 1 0 1 1 0 0 +EDGE2 4279 4260 0.962543 0.13733 0.0111272 1 0 1 1 0 0 +EDGE2 4279 4240 1.03882 -0.110886 -3.12707 1 0 1 1 0 0 +EDGE2 4279 3920 1.02655 -0.0379188 0.000574374 1 0 1 1 0 0 +EDGE2 4279 3940 0.921795 0.00498129 -0.0260353 1 0 1 1 0 0 +EDGE2 4279 4259 -0.0731292 -0.0359928 -0.0280589 1 0 1 1 0 0 +EDGE2 4279 4118 -1.04362 -0.06276 0.00183172 1 0 1 1 0 0 +EDGE2 4279 4278 -0.969922 -0.0595241 0.0142486 1 0 1 1 0 0 +EDGE2 4279 3919 -0.0277897 0.0428578 0.00649922 1 0 1 1 0 0 +EDGE2 4279 3939 -0.120567 0.0152419 -0.010954 1 0 1 1 0 0 +EDGE2 4279 4258 -1.02314 -0.00385081 -0.0179323 1 0 1 1 0 0 +EDGE2 4279 3918 -1.07038 -0.00685931 -0.00524065 1 0 1 1 0 0 +EDGE2 4279 3938 -0.912493 -0.120944 0.00276824 1 0 1 1 0 0 +EDGE2 4280 4119 -0.970756 -0.0917773 -0.0204914 1 0 1 1 0 0 +EDGE2 4280 4120 -0.0804489 0.00901108 0.0141102 1 0 1 1 0 0 +EDGE2 4280 4260 -0.0452451 0.00762047 -0.0171475 1 0 1 1 0 0 +EDGE2 4280 4239 0.98841 0.0990238 -3.12312 1 0 1 1 0 0 +EDGE2 4280 4240 -0.0812731 -0.0178075 -3.12344 1 0 1 1 0 0 +EDGE2 4280 4279 -0.988771 -0.026521 0.00149551 1 0 1 1 0 0 +EDGE2 4280 3920 0.0547492 0.014473 -0.0124568 1 0 1 1 0 0 +EDGE2 4280 3940 -0.0266164 0.0856284 -0.0116301 1 0 1 1 0 0 +EDGE2 4280 4259 -1.01264 -0.0255701 -0.0057571 1 0 1 1 0 0 +EDGE2 4280 3919 -0.986424 0.0286291 -0.0214022 1 0 1 1 0 0 +EDGE2 4280 3939 -1.01472 -0.016864 0.00519866 1 0 1 1 0 0 +EDGE2 4280 4121 -0.0471634 1.00065 1.56642 1 0 1 1 0 0 +EDGE2 4280 4261 0.00537346 1.15254 1.61828 1 0 1 1 0 0 +EDGE2 4280 4241 0.0548502 0.985432 1.57928 1 0 1 1 0 0 +EDGE2 4280 3921 0.0342709 0.954086 1.58755 1 0 1 1 0 0 +EDGE2 4280 3941 0.0401235 1.05823 1.59903 1 0 1 1 0 0 +EDGE2 4281 4120 -0.971103 -0.0128096 1.63111 1 0 1 1 0 0 +EDGE2 4281 4260 -1.01905 -0.0182287 1.56117 1 0 1 1 0 0 +EDGE2 4281 4280 -1.09582 -0.095568 1.55911 1 0 1 1 0 0 +EDGE2 4281 4240 -1.00758 -0.0654069 -1.58812 1 0 1 1 0 0 +EDGE2 4281 3920 -1.02493 0.110743 1.54122 1 0 1 1 0 0 +EDGE2 4281 3940 -1.00865 0.0272636 1.57365 1 0 1 1 0 0 +EDGE2 4282 4281 -0.909187 -0.107824 0.0146774 1 0 1 1 0 0 +EDGE2 4283 4282 -1.0755 0.01075 -0.00234819 1 0 1 1 0 0 +EDGE2 4284 4283 -0.965555 0.0773552 0.0288421 1 0 1 1 0 0 +EDGE2 4285 4284 -1.02434 0.0556268 0.00525276 1 0 1 1 0 0 +EDGE2 4286 4285 -0.948914 0.0629612 -1.57991 1 0 1 1 0 0 +EDGE2 4287 4286 -1.0022 0.0561617 -0.0344891 1 0 1 1 0 0 +EDGE2 4288 4287 -0.882162 0.00608715 0.0419509 1 0 1 1 0 0 +EDGE2 4289 4288 -1.0088 0.07041 0.0208553 1 0 1 1 0 0 +EDGE2 4290 4289 -1.01155 -0.0349028 -0.00143493 1 0 1 1 0 0 +EDGE2 4291 4290 -1.01533 0.0292979 -1.58421 1 0 1 1 0 0 +EDGE2 4292 4291 -1.02784 -0.0706184 -0.00223675 1 0 1 1 0 0 +EDGE2 4293 4292 -1.06808 0.0471282 0.0238189 1 0 1 1 0 0 +EDGE2 4294 4293 -1.05368 -0.122992 -0.0119829 1 0 1 1 0 0 +EDGE2 4294 4175 0.969982 0.0776945 -3.14158 1 0 1 1 0 0 +EDGE2 4294 4215 1.00378 0.0455043 -3.10647 1 0 1 1 0 0 +EDGE2 4294 4235 0.961352 -0.00554125 -3.14588 1 0 1 1 0 0 +EDGE2 4295 4294 -1.03166 -0.0336219 0.0193637 1 0 1 1 0 0 +EDGE2 4295 4176 0.00397529 -1.0069 -1.53441 1 0 1 1 0 0 +EDGE2 4295 4216 -0.0437065 -0.923648 -1.61097 1 0 1 1 0 0 +EDGE2 4295 4175 0.0265303 0.0395922 -3.12252 1 0 1 1 0 0 +EDGE2 4295 4215 0.0727505 0.0604386 -3.14387 1 0 1 1 0 0 +EDGE2 4295 4235 -0.0655774 0.0582366 -3.12188 1 0 1 1 0 0 +EDGE2 4295 4236 0.0277572 1.11249 1.57074 1 0 1 1 0 0 +EDGE2 4295 4214 0.911279 -0.0430838 -3.12581 1 0 1 1 0 0 +EDGE2 4295 4234 0.999632 0.018945 -3.11663 1 0 1 1 0 0 +EDGE2 4295 4174 0.939636 -0.0491012 -3.15591 1 0 1 1 0 0 +EDGE2 4296 4295 -0.965699 0.0497724 1.57626 1 0 1 1 0 0 +EDGE2 4296 4177 1.00259 0.0319851 -0.0133133 1 0 1 1 0 0 +EDGE2 4296 4217 0.997238 0.0464669 0.0106338 1 0 1 1 0 0 +EDGE2 4296 4176 -0.000955337 0.0625995 0.0154392 1 0 1 1 0 0 +EDGE2 4296 4216 -0.0537025 -0.0371318 0.0242847 1 0 1 1 0 0 +EDGE2 4296 4175 -0.86691 -0.0634417 -1.55903 1 0 1 1 0 0 +EDGE2 4296 4215 -0.985604 0.00978814 -1.58555 1 0 1 1 0 0 +EDGE2 4296 4235 -1.00918 -0.0926645 -1.56327 1 0 1 1 0 0 +EDGE2 4297 4178 1.04438 0.0319965 -0.0198095 1 0 1 1 0 0 +EDGE2 4297 4218 1.03474 0.0719255 0.019724 1 0 1 1 0 0 +EDGE2 4297 4296 -1.12692 0.00604215 -0.00503694 1 0 1 1 0 0 +EDGE2 4297 4177 -0.0149886 -0.0164329 -0.0143364 1 0 1 1 0 0 +EDGE2 4297 4217 -0.0475834 0.0058988 0.00121137 1 0 1 1 0 0 +EDGE2 4297 4176 -0.93569 -0.0526476 0.00494507 1 0 1 1 0 0 +EDGE2 4297 4216 -0.999097 -0.00698126 0.017294 1 0 1 1 0 0 +EDGE2 4298 4219 0.934964 0.0187518 0.0167911 1 0 1 1 0 0 +EDGE2 4298 4178 0.0768514 -0.0305988 -0.0100556 1 0 1 1 0 0 +EDGE2 4298 4179 0.97943 0.0373055 0.00526361 1 0 1 1 0 0 +EDGE2 4298 4218 -0.0456392 -0.0151265 0.0170922 1 0 1 1 0 0 +EDGE2 4298 4177 -1.02552 0.043445 0.0165876 1 0 1 1 0 0 +EDGE2 4298 4217 -1.08704 0.0283362 -0.0259767 1 0 1 1 0 0 +EDGE2 4298 4297 -1.0049 0.0505118 -0.0188835 1 0 1 1 0 0 +EDGE2 4299 4219 -0.0423873 -0.0572657 0.00932067 1 0 1 1 0 0 +EDGE2 4299 4180 1.01428 0.0646281 0.0224389 1 0 1 1 0 0 +EDGE2 4299 4220 1.00713 -0.0277819 0.037609 1 0 1 1 0 0 +EDGE2 4299 3860 1.04616 -0.0262488 -3.14523 1 0 1 1 0 0 +EDGE2 4299 3880 0.96042 0.105529 -3.15544 1 0 1 1 0 0 +EDGE2 4299 4178 -0.954528 -0.0464462 0.00264304 1 0 1 1 0 0 +EDGE2 4299 4298 -1.04592 -0.000868377 0.0159214 1 0 1 1 0 0 +EDGE2 4299 4179 -0.0327856 0.0214789 -0.0345808 1 0 1 1 0 0 +EDGE2 4299 4218 -1.15796 0.0123455 -0.00738069 1 0 1 1 0 0 +EDGE2 4300 4219 -1.0308 -0.0398382 -0.014942 1 0 1 1 0 0 +EDGE2 4300 3859 1.02964 0.00546609 -3.1318 1 0 1 1 0 0 +EDGE2 4300 3879 1.09839 0.0210022 -3.14843 1 0 1 1 0 0 +EDGE2 4300 3861 0.0288158 -0.927225 -1.54843 1 0 1 1 0 0 +EDGE2 4300 4180 -0.116884 0.0492703 0.00985168 1 0 1 1 0 0 +EDGE2 4300 4220 -0.0388042 -0.0280969 0.0121541 1 0 1 1 0 0 +EDGE2 4300 3860 0.0738383 -0.00262953 -3.11485 1 0 1 1 0 0 +EDGE2 4300 3880 0.0921499 -0.00116141 -3.13921 1 0 1 1 0 0 +EDGE2 4300 4299 -0.965762 0.0578088 -0.0144835 1 0 1 1 0 0 +EDGE2 4300 4179 -0.972468 -0.00179331 -0.00923136 1 0 1 1 0 0 +EDGE2 4300 4181 0.10822 1.15452 1.60007 1 0 1 1 0 0 +EDGE2 4300 4221 0.0566491 0.93971 1.56169 1 0 1 1 0 0 +EDGE2 4300 3881 -0.0120596 0.980178 1.56786 1 0 1 1 0 0 +EDGE2 4301 4180 -0.980137 0.0101566 -1.5759 1 0 1 1 0 0 +EDGE2 4301 4300 -0.935151 0.0288267 -1.5705 1 0 1 1 0 0 +EDGE2 4301 4220 -0.994447 -0.0312267 -1.52007 1 0 1 1 0 0 +EDGE2 4301 3860 -1.00231 -0.0211017 1.54992 1 0 1 1 0 0 +EDGE2 4301 3880 -1.05447 -0.0867539 1.57027 1 0 1 1 0 0 +EDGE2 4301 4182 0.916402 -0.0332678 -0.0293791 1 0 1 1 0 0 +EDGE2 4301 4181 -0.0335913 -0.050778 -0.0122163 1 0 1 1 0 0 +EDGE2 4301 4221 0.0594822 -0.00812799 -0.0283611 1 0 1 1 0 0 +EDGE2 4301 3881 -0.00649304 0.0219381 -0.000937134 1 0 1 1 0 0 +EDGE2 4301 4222 1.03201 -0.0114504 0.0238035 1 0 1 1 0 0 +EDGE2 4301 3882 1.01682 -0.026964 0.010437 1 0 1 1 0 0 +EDGE2 4302 4182 -0.0154037 -0.0075182 -0.0302147 1 0 1 1 0 0 +EDGE2 4302 4181 -0.990934 -0.0555723 0.0160569 1 0 1 1 0 0 +EDGE2 4302 4301 -1.00204 0.031259 -0.0247683 1 0 1 1 0 0 +EDGE2 4302 4221 -1.0236 0.078251 0.0509641 1 0 1 1 0 0 +EDGE2 4302 3881 -0.978394 -0.00237261 -0.0219282 1 0 1 1 0 0 +EDGE2 4302 4222 -0.0193404 -0.0172897 0.00584477 1 0 1 1 0 0 +EDGE2 4302 4183 0.90711 -0.00425885 0.0095085 1 0 1 1 0 0 +EDGE2 4302 3882 0.011937 0.121392 0.0122962 1 0 1 1 0 0 +EDGE2 4302 4223 1.05222 0.00152691 -0.000227264 1 0 1 1 0 0 +EDGE2 4302 3883 0.98375 -0.0507128 0.0207625 1 0 1 1 0 0 +EDGE2 4303 4182 -1.04168 -0.0201454 0.00712699 1 0 1 1 0 0 +EDGE2 4303 4302 -1.12227 -0.0026576 -0.0015715 1 0 1 1 0 0 +EDGE2 4303 4222 -1.08209 0.0719265 0.00582932 1 0 1 1 0 0 +EDGE2 4303 4184 1.08595 0.0150104 0.00156141 1 0 1 1 0 0 +EDGE2 4303 4183 -0.00967228 -0.00291249 -0.00163416 1 0 1 1 0 0 +EDGE2 4303 3882 -0.97219 -0.0790241 -0.0207069 1 0 1 1 0 0 +EDGE2 4303 4223 -0.0477576 0.000818653 0.00784621 1 0 1 1 0 0 +EDGE2 4303 3883 -0.0487126 -0.0218847 -0.0104513 1 0 1 1 0 0 +EDGE2 4303 4224 0.963495 0.0750537 -0.00932627 1 0 1 1 0 0 +EDGE2 4303 3884 0.982264 -0.00451347 0.0393214 1 0 1 1 0 0 +EDGE2 4304 4184 0.0637675 -0.00461601 0.0365437 1 0 1 1 0 0 +EDGE2 4304 4183 -1.04551 0.0297944 0.0131004 1 0 1 1 0 0 +EDGE2 4304 4303 -1.01156 0.0667044 0.0197705 1 0 1 1 0 0 +EDGE2 4304 4223 -0.961884 -0.0407365 -0.0212663 1 0 1 1 0 0 +EDGE2 4304 3883 -1.02165 -0.00309503 0.0265166 1 0 1 1 0 0 +EDGE2 4304 4224 0.0373009 0.0881351 -0.0139703 1 0 1 1 0 0 +EDGE2 4304 4205 1.02653 0.0520585 -3.15666 1 0 1 1 0 0 +EDGE2 4304 3884 -0.0102463 0.0718198 -0.0196612 1 0 1 1 0 0 +EDGE2 4304 4225 0.964912 -0.00752765 0.00247317 1 0 1 1 0 0 +EDGE2 4304 3885 0.986539 0.0454015 0.0373658 1 0 1 1 0 0 +EDGE2 4304 4145 0.985792 0.0270508 -3.14947 1 0 1 1 0 0 +EDGE2 4304 4185 0.979891 0.0307244 -0.0231772 1 0 1 1 0 0 +EDGE2 4305 4186 -0.0837141 -1.00046 -1.51475 1 0 1 1 0 0 +EDGE2 4305 4226 0.0295274 1.01485 1.56821 1 0 1 1 0 0 +EDGE2 4305 4184 -0.921783 0.00807725 0.0277184 1 0 1 1 0 0 +EDGE2 4305 4304 -0.949659 -0.000422885 0.032646 1 0 1 1 0 0 +EDGE2 4305 4224 -0.965654 -0.0277201 0.00365626 1 0 1 1 0 0 +EDGE2 4305 4205 -0.00935531 -0.0366819 -3.12124 1 0 1 1 0 0 +EDGE2 4305 3884 -0.944126 -0.0104913 0.0076806 1 0 1 1 0 0 +EDGE2 4305 4225 0.0163899 -0.0365342 0.00949926 1 0 1 1 0 0 +EDGE2 4305 3885 0.043121 -0.0710069 0.0300245 1 0 1 1 0 0 +EDGE2 4305 4145 -0.0570545 0.0295596 -3.15017 1 0 1 1 0 0 +EDGE2 4305 4185 -0.0422203 -0.00404514 0.0291051 1 0 1 1 0 0 +EDGE2 4305 3886 0.00995923 1.03198 1.59381 1 0 1 1 0 0 +EDGE2 4305 4146 0.00538772 1.0113 1.55945 1 0 1 1 0 0 +EDGE2 4305 4206 0.0500918 0.976261 1.56754 1 0 1 1 0 0 +EDGE2 4305 4144 0.957974 0.00822332 -3.1412 1 0 1 1 0 0 +EDGE2 4305 4204 1.05397 0.00262484 -3.14324 1 0 1 1 0 0 +EDGE2 4306 4226 -0.00849777 -0.0727581 0.00859292 1 0 1 1 0 0 +EDGE2 4306 4205 -1.03654 0.00497306 1.54489 1 0 1 1 0 0 +EDGE2 4306 4305 -0.937734 0.0695677 -1.57536 1 0 1 1 0 0 +EDGE2 4306 4225 -0.937172 -0.00859944 -1.59074 1 0 1 1 0 0 +EDGE2 4306 3885 -1.13659 -0.0526958 -1.54274 1 0 1 1 0 0 +EDGE2 4306 4145 -0.928129 -0.112526 1.53673 1 0 1 1 0 0 +EDGE2 4306 4185 -1.03078 -0.0755082 -1.56504 1 0 1 1 0 0 +EDGE2 4306 4227 1.05379 0.0186916 -0.0191842 1 0 1 1 0 0 +EDGE2 4306 3886 0.00965014 -0.0067475 -0.0144371 1 0 1 1 0 0 +EDGE2 4306 4146 -0.0882747 0.043264 0.00667001 1 0 1 1 0 0 +EDGE2 4306 4206 -0.00215138 -0.0330883 0.000278221 1 0 1 1 0 0 +EDGE2 4306 3887 1.03956 0.0129693 0.049067 1 0 1 1 0 0 +EDGE2 4306 4147 0.97369 0.0263164 0.0148118 1 0 1 1 0 0 +EDGE2 4306 4207 0.95173 -0.0594611 0.0258263 1 0 1 1 0 0 +EDGE2 4307 4226 -0.999863 -0.00251885 -0.0254049 1 0 1 1 0 0 +EDGE2 4307 4306 -0.982853 0.0181983 0.00890841 1 0 1 1 0 0 +EDGE2 4307 4228 1.0505 -0.0896289 0.00434809 1 0 1 1 0 0 +EDGE2 4307 4227 -0.0398292 -0.0264422 -0.0308183 1 0 1 1 0 0 +EDGE2 4307 3886 -1.01454 -0.0641819 -0.0219911 1 0 1 1 0 0 +EDGE2 4307 4146 -1.02434 -0.00205197 0.00483681 1 0 1 1 0 0 +EDGE2 4307 4206 -0.99416 0.0507246 -0.00608768 1 0 1 1 0 0 +EDGE2 4307 3887 0.0176635 -0.0414213 -0.0260322 1 0 1 1 0 0 +EDGE2 4307 4147 0.00050694 -0.0743445 -0.0150832 1 0 1 1 0 0 +EDGE2 4307 4207 -0.0494744 -0.00652933 -0.0142641 1 0 1 1 0 0 +EDGE2 4307 3888 0.995024 -0.0502294 0.00842706 1 0 1 1 0 0 +EDGE2 4307 4148 0.964906 -0.0719073 -0.0152262 1 0 1 1 0 0 +EDGE2 4307 4208 1.02286 0.0227051 -0.00802997 1 0 1 1 0 0 +EDGE2 4308 4228 -0.00692582 -0.0504772 -0.00952227 1 0 1 1 0 0 +EDGE2 4308 4227 -0.921246 0.0588532 0.00774384 1 0 1 1 0 0 +EDGE2 4308 4307 -1.00067 0.0182742 -0.0109296 1 0 1 1 0 0 +EDGE2 4308 3887 -1.03223 -0.0184476 -0.0173624 1 0 1 1 0 0 +EDGE2 4308 4147 -1.04331 0.029627 -0.00141626 1 0 1 1 0 0 +EDGE2 4308 4207 -1.00369 -0.0563534 -0.0171472 1 0 1 1 0 0 +EDGE2 4308 4229 0.989795 0.0603765 0.0363258 1 0 1 1 0 0 +EDGE2 4308 3888 0.00928614 -0.0116939 0.00609076 1 0 1 1 0 0 +EDGE2 4308 4148 -0.0157713 0.05188 -0.00112317 1 0 1 1 0 0 +EDGE2 4308 4208 0.00696496 -0.00526153 0.0330731 1 0 1 1 0 0 +EDGE2 4308 4149 0.94928 0.00598678 0.0416562 1 0 1 1 0 0 +EDGE2 4308 4209 1.02669 -0.0587617 -0.00699621 1 0 1 1 0 0 +EDGE2 4308 3889 0.980719 0.0728427 -0.0174502 1 0 1 1 0 0 +EDGE2 4309 4230 0.937216 0.0251986 -0.0495965 1 0 1 1 0 0 +EDGE2 4309 4228 -0.937401 -0.03737 0.0151537 1 0 1 1 0 0 +EDGE2 4309 4308 -0.983373 0.000230815 0.0229975 1 0 1 1 0 0 +EDGE2 4309 4229 -0.0658324 -0.0445899 0.0370273 1 0 1 1 0 0 +EDGE2 4309 3888 -0.971902 0.0637608 0.0242694 1 0 1 1 0 0 +EDGE2 4309 4148 -0.891013 0.0218253 -0.00244316 1 0 1 1 0 0 +EDGE2 4309 4208 -1.05375 -0.0511864 0.000811842 1 0 1 1 0 0 +EDGE2 4309 4149 -0.0517126 0.0444128 0.0226016 1 0 1 1 0 0 +EDGE2 4309 4209 -0.00049686 0.0324332 0.0245147 1 0 1 1 0 0 +EDGE2 4309 3889 0.000246969 -0.0429597 -0.034975 1 0 1 1 0 0 +EDGE2 4309 3890 0.990376 -0.0372863 -0.00837042 1 0 1 1 0 0 +EDGE2 4309 4150 1.03646 0.0414297 0.00546822 1 0 1 1 0 0 +EDGE2 4309 4170 1.00162 0.0116307 -3.11621 1 0 1 1 0 0 +EDGE2 4309 4210 0.904619 0.0700379 -0.0477558 1 0 1 1 0 0 +EDGE2 4309 4130 1.00125 -0.0258532 -3.13182 1 0 1 1 0 0 +EDGE2 4310 4230 -0.0504402 0.021129 -0.0132846 1 0 1 1 0 0 +EDGE2 4310 4229 -1.01048 -0.0431822 -0.00213655 1 0 1 1 0 0 +EDGE2 4310 4309 -0.976564 -0.0331765 -0.0459907 1 0 1 1 0 0 +EDGE2 4310 4149 -0.934838 -0.0750721 -0.00365015 1 0 1 1 0 0 +EDGE2 4310 4209 -0.946328 -0.0533149 0.00107084 1 0 1 1 0 0 +EDGE2 4310 3889 -1.0158 0.0210043 -0.0172158 1 0 1 1 0 0 +EDGE2 4310 4171 0.0203524 1.00133 1.59602 1 0 1 1 0 0 +EDGE2 4310 4211 0.0196066 1.05935 1.5783 1 0 1 1 0 0 +EDGE2 4310 4231 -0.0331427 0.950991 1.56374 1 0 1 1 0 0 +EDGE2 4310 3890 0.0885106 0.00824563 -0.0233032 1 0 1 1 0 0 +EDGE2 4310 4150 0.00223517 0.0360293 0.0269533 1 0 1 1 0 0 +EDGE2 4310 4170 0.0414053 -0.0648661 -3.11116 1 0 1 1 0 0 +EDGE2 4310 4210 -0.0520024 -0.0414259 0.00616436 1 0 1 1 0 0 +EDGE2 4310 4130 0.0178149 0.0234342 -3.14187 1 0 1 1 0 0 +EDGE2 4310 3891 -0.0390082 -1.03423 -1.62232 1 0 1 1 0 0 +EDGE2 4310 4131 -0.0421081 -0.98424 -1.53916 1 0 1 1 0 0 +EDGE2 4310 4151 -0.0987061 -1.03358 -1.5797 1 0 1 1 0 0 +EDGE2 4310 4129 0.933856 -0.00426414 -3.10091 1 0 1 1 0 0 +EDGE2 4310 4169 1.00865 -0.00756683 -3.16582 1 0 1 1 0 0 +EDGE2 4311 4230 -0.967787 0.0289714 -1.57478 1 0 1 1 0 0 +EDGE2 4311 4212 0.933071 -0.0252354 -0.0179768 1 0 1 1 0 0 +EDGE2 4311 4232 1.1499 0.0663287 0.0123648 1 0 1 1 0 0 +EDGE2 4311 4172 0.976635 -0.023394 0.0364205 1 0 1 1 0 0 +EDGE2 4311 4171 0.0334196 -0.0282984 -0.0227143 1 0 1 1 0 0 +EDGE2 4311 4211 0.0326225 -0.0548876 -0.00923725 1 0 1 1 0 0 +EDGE2 4311 4231 -0.082494 0.0219945 0.000481093 1 0 1 1 0 0 +EDGE2 4311 4310 -1.0667 0.0820826 -1.51656 1 0 1 1 0 0 +EDGE2 4311 3890 -1.04166 0.0448526 -1.58957 1 0 1 1 0 0 +EDGE2 4311 4150 -1.01648 0.014473 -1.53392 1 0 1 1 0 0 +EDGE2 4311 4170 -1.01729 -0.0644349 1.60674 1 0 1 1 0 0 +EDGE2 4311 4210 -1.03757 0.0673193 -1.58942 1 0 1 1 0 0 +EDGE2 4311 4130 -1.08336 0.0432495 1.54511 1 0 1 1 0 0 +EDGE2 4312 4173 1.02273 -0.0830438 -0.0193099 1 0 1 1 0 0 +EDGE2 4312 4213 0.928051 0.0134275 0.0159924 1 0 1 1 0 0 +EDGE2 4312 4233 0.95608 0.033715 0.0132216 1 0 1 1 0 0 +EDGE2 4312 4311 -1.00631 0.0676381 -0.0298442 1 0 1 1 0 0 +EDGE2 4312 4212 9.35496e-05 0.0407913 -0.0029633 1 0 1 1 0 0 +EDGE2 4312 4232 0.0238236 -0.0352501 -0.00939842 1 0 1 1 0 0 +EDGE2 4312 4172 0.0327153 -0.0628576 0.00576228 1 0 1 1 0 0 +EDGE2 4312 4171 -1.08458 0.0293291 0.0144363 1 0 1 1 0 0 +EDGE2 4312 4211 -1.10243 0.0569292 0.023499 1 0 1 1 0 0 +EDGE2 4312 4231 -1.00982 0.123856 -0.0174202 1 0 1 1 0 0 +EDGE2 4313 4173 -0.067764 0.0392718 0.0426616 1 0 1 1 0 0 +EDGE2 4313 4214 1.01646 0.00502802 -0.00433896 1 0 1 1 0 0 +EDGE2 4313 4234 1.0296 -0.0388336 0.0301109 1 0 1 1 0 0 +EDGE2 4313 4174 0.999871 -0.0061441 0.00336481 1 0 1 1 0 0 +EDGE2 4313 4213 -0.0146828 -0.0352974 0.0233731 1 0 1 1 0 0 +EDGE2 4313 4233 -0.0627272 0.0471229 0.0107995 1 0 1 1 0 0 +EDGE2 4313 4212 -0.96519 -0.0322244 0.00286927 1 0 1 1 0 0 +EDGE2 4313 4232 -1.01952 -0.0279872 -0.00559934 1 0 1 1 0 0 +EDGE2 4313 4312 -1.00177 -0.00262879 0.0201821 1 0 1 1 0 0 +EDGE2 4313 4172 -0.948372 0.0230504 0.0159915 1 0 1 1 0 0 +EDGE2 4314 4295 1.08424 -0.0406884 -3.1633 1 0 1 1 0 0 +EDGE2 4314 4175 0.921263 -0.0258104 -0.000578758 1 0 1 1 0 0 +EDGE2 4314 4215 1.06839 -0.0041245 0.00627083 1 0 1 1 0 0 +EDGE2 4314 4235 0.997252 0.0145292 -0.0249824 1 0 1 1 0 0 +EDGE2 4314 4173 -1.01033 -0.0117234 0.0388629 1 0 1 1 0 0 +EDGE2 4314 4313 -0.933669 0.0961097 0.0194333 1 0 1 1 0 0 +EDGE2 4314 4214 0.128395 -0.0327239 0.0164558 1 0 1 1 0 0 +EDGE2 4314 4234 -0.0454433 0.00487738 -0.00769379 1 0 1 1 0 0 +EDGE2 4314 4174 0.0284065 0.0658361 0.0173989 1 0 1 1 0 0 +EDGE2 4314 4213 -0.952746 -0.0964356 -0.00991249 1 0 1 1 0 0 +EDGE2 4314 4233 -0.984688 0.0273563 -0.010684 1 0 1 1 0 0 +EDGE2 4315 4295 -0.05096 -0.012435 -3.13691 1 0 1 1 0 0 +EDGE2 4315 4294 1.00797 0.0330337 -3.1308 1 0 1 1 0 0 +EDGE2 4315 4296 0.0067653 0.963354 1.5565 1 0 1 1 0 0 +EDGE2 4315 4176 -0.058782 0.909675 1.57002 1 0 1 1 0 0 +EDGE2 4315 4216 -0.0193792 1.04685 1.56818 1 0 1 1 0 0 +EDGE2 4315 4175 0.00410391 -0.00355491 -0.00498524 1 0 1 1 0 0 +EDGE2 4315 4215 -0.024682 -0.044974 -0.00241038 1 0 1 1 0 0 +EDGE2 4315 4235 0.0432021 -0.0146446 0.00704598 1 0 1 1 0 0 +EDGE2 4315 4236 -0.0314209 -1.03833 -1.60084 1 0 1 1 0 0 +EDGE2 4315 4214 -0.950981 0.0420435 0.0140434 1 0 1 1 0 0 +EDGE2 4315 4234 -1.02658 0.00669636 -0.0279263 1 0 1 1 0 0 +EDGE2 4315 4314 -0.989651 -0.0823957 0.0150584 1 0 1 1 0 0 +EDGE2 4315 4174 -1.02606 -0.0597951 0.0119355 1 0 1 1 0 0 +EDGE2 4316 4295 -1.06702 -0.040686 1.54285 1 0 1 1 0 0 +EDGE2 4316 4296 -0.0511701 0.029108 -0.00679482 1 0 1 1 0 0 +EDGE2 4316 4177 1.02175 -0.0032759 -0.0162995 1 0 1 1 0 0 +EDGE2 4316 4217 1.072 0.00123227 0.00188562 1 0 1 1 0 0 +EDGE2 4316 4297 1.05401 0.031311 -0.0174754 1 0 1 1 0 0 +EDGE2 4316 4176 0.0304479 -0.024785 -0.00637372 1 0 1 1 0 0 +EDGE2 4316 4216 -0.00864769 0.0303912 0.00305656 1 0 1 1 0 0 +EDGE2 4316 4315 -0.969585 -0.061225 -1.6075 1 0 1 1 0 0 +EDGE2 4316 4175 -0.998465 -0.0487516 -1.58453 1 0 1 1 0 0 +EDGE2 4316 4215 -1.04561 -0.00583828 -1.58201 1 0 1 1 0 0 +EDGE2 4316 4235 -1.08784 0.0788486 -1.55054 1 0 1 1 0 0 +EDGE2 4317 4178 1.09194 0.0155103 0.025117 1 0 1 1 0 0 +EDGE2 4317 4298 1.03673 0.0276761 0.000998599 1 0 1 1 0 0 +EDGE2 4317 4218 1.03238 0.0129778 -0.0143733 1 0 1 1 0 0 +EDGE2 4317 4296 -1.04601 -0.0322964 0.0190422 1 0 1 1 0 0 +EDGE2 4317 4177 0.0622149 0.0298839 0.00765782 1 0 1 1 0 0 +EDGE2 4317 4217 0.0318176 0.00656916 -0.0056712 1 0 1 1 0 0 +EDGE2 4317 4297 -0.102701 -0.0612322 0.03502 1 0 1 1 0 0 +EDGE2 4317 4316 -0.996551 -0.0303597 0.0223636 1 0 1 1 0 0 +EDGE2 4317 4176 -0.989706 -0.0510194 0.00310585 1 0 1 1 0 0 +EDGE2 4317 4216 -1.06066 0.0324353 0.0129789 1 0 1 1 0 0 +EDGE2 4318 4219 1.09305 0.0265943 -0.0208174 1 0 1 1 0 0 +EDGE2 4318 4299 1.0241 -0.0279639 0.00318225 1 0 1 1 0 0 +EDGE2 4318 4317 -1.0167 -0.0265177 0.0227047 1 0 1 1 0 0 +EDGE2 4318 4178 -0.0542279 0.0907359 -0.00546129 1 0 1 1 0 0 +EDGE2 4318 4298 -0.0460706 -0.0421857 -0.0119378 1 0 1 1 0 0 +EDGE2 4318 4179 1.01339 0.00702919 -0.0266691 1 0 1 1 0 0 +EDGE2 4318 4218 -0.00974165 0.0202548 0.0228624 1 0 1 1 0 0 +EDGE2 4318 4177 -1.0372 -0.0701553 0.00780427 1 0 1 1 0 0 +EDGE2 4318 4217 -0.947125 -0.0438929 0.0429775 1 0 1 1 0 0 +EDGE2 4318 4297 -1.03166 -0.00272734 0.00120259 1 0 1 1 0 0 +EDGE2 4319 4219 0.0239598 0.0105225 0.00940946 1 0 1 1 0 0 +EDGE2 4319 4180 0.949717 -0.0459149 0.000856512 1 0 1 1 0 0 +EDGE2 4319 4300 1.03732 0.0225171 -0.0080287 1 0 1 1 0 0 +EDGE2 4319 4220 1.0338 0.0513295 -0.0401615 1 0 1 1 0 0 +EDGE2 4319 3860 1.00798 0.0360582 -3.12304 1 0 1 1 0 0 +EDGE2 4319 3880 0.980266 -0.00702561 -3.11441 1 0 1 1 0 0 +EDGE2 4319 4299 0.015874 -0.069116 -0.00111707 1 0 1 1 0 0 +EDGE2 4319 4178 -0.96625 0.0374941 0.00711809 1 0 1 1 0 0 +EDGE2 4319 4298 -0.996618 -0.0229271 -0.0356235 1 0 1 1 0 0 +EDGE2 4319 4318 -1.02563 0.0647309 0.0168384 1 0 1 1 0 0 +EDGE2 4319 4179 -0.0082116 0.0547212 0.0070174 1 0 1 1 0 0 +EDGE2 4319 4218 -1.02966 -0.0569905 -0.0146878 1 0 1 1 0 0 +EDGE2 4320 4219 -1.01738 -0.00818924 -0.0153257 1 0 1 1 0 0 +EDGE2 4320 3859 0.990377 -0.0476781 -3.14264 1 0 1 1 0 0 +EDGE2 4320 3879 1.00693 -0.0140245 -3.11285 1 0 1 1 0 0 +EDGE2 4320 3861 -0.0215062 -1.06568 -1.57887 1 0 1 1 0 0 +EDGE2 4320 4180 -0.0115469 -0.0822309 -0.0166873 1 0 1 1 0 0 +EDGE2 4320 4300 0.0252406 -0.00863837 -0.0263255 1 0 1 1 0 0 +EDGE2 4320 4220 0.0385818 0.0178503 -0.0329664 1 0 1 1 0 0 +EDGE2 4320 4319 -1.09013 0.0202182 0.0111089 1 0 1 1 0 0 +EDGE2 4320 3860 0.06705 -0.021897 -3.1468 1 0 1 1 0 0 +EDGE2 4320 3880 -0.00228126 -0.0631604 -3.16414 1 0 1 1 0 0 +EDGE2 4320 4299 -0.95569 -0.0168973 0.0307603 1 0 1 1 0 0 +EDGE2 4320 4179 -0.942139 -0.0155553 0.0328048 1 0 1 1 0 0 +EDGE2 4320 4181 -0.0710604 1.0833 1.55989 1 0 1 1 0 0 +EDGE2 4320 4301 0.0319193 1.00283 1.56844 1 0 1 1 0 0 +EDGE2 4320 4221 0.104073 1.01061 1.55715 1 0 1 1 0 0 +EDGE2 4320 3881 -0.0921075 1.03123 1.55282 1 0 1 1 0 0 +EDGE2 4321 4180 -0.976713 0.0333252 -1.58578 1 0 1 1 0 0 +EDGE2 4321 4300 -1.02998 -0.0264386 -1.55156 1 0 1 1 0 0 +EDGE2 4321 4320 -0.930198 -0.0814558 -1.58408 1 0 1 1 0 0 +EDGE2 4321 4220 -0.999866 -0.023621 -1.58604 1 0 1 1 0 0 +EDGE2 4321 3860 -1.01556 -0.00167031 1.54905 1 0 1 1 0 0 +EDGE2 4321 3880 -0.951963 0.0296798 1.57109 1 0 1 1 0 0 +EDGE2 4321 4182 0.934713 0.0349546 -0.0218742 1 0 1 1 0 0 +EDGE2 4321 4181 -0.101277 0.12293 0.002893 1 0 1 1 0 0 +EDGE2 4321 4301 -0.00615885 0.00370456 -0.0159253 1 0 1 1 0 0 +EDGE2 4321 4221 -0.0310832 -0.0400132 -0.0243472 1 0 1 1 0 0 +EDGE2 4321 4302 1.03737 0.0342945 -0.00898372 1 0 1 1 0 0 +EDGE2 4321 3881 -0.0317877 0.0819289 0.0122189 1 0 1 1 0 0 +EDGE2 4321 4222 1.01797 -0.0675112 0.00466278 1 0 1 1 0 0 +EDGE2 4321 3882 1.01475 0.000355766 0.0214942 1 0 1 1 0 0 +EDGE2 4322 4321 -1.06166 0.000572327 -0.033578 1 0 1 1 0 0 +EDGE2 4322 4182 -0.025388 -0.0391563 0.0201701 1 0 1 1 0 0 +EDGE2 4322 4181 -1.03908 0.0439775 -0.0122079 1 0 1 1 0 0 +EDGE2 4322 4301 -0.919583 0.011373 0.025107 1 0 1 1 0 0 +EDGE2 4322 4221 -1.02678 0.0226257 0.0178062 1 0 1 1 0 0 +EDGE2 4322 4302 -0.0208008 0.0435851 -0.0140404 1 0 1 1 0 0 +EDGE2 4322 3881 -1.03109 -0.0435697 -0.0136628 1 0 1 1 0 0 +EDGE2 4322 4222 0.0810685 -0.0465187 -0.0102989 1 0 1 1 0 0 +EDGE2 4322 4183 1.04255 -0.105499 0.020956 1 0 1 1 0 0 +EDGE2 4322 4303 0.9836 0.00449177 0.0217431 1 0 1 1 0 0 +EDGE2 4322 3882 -0.0547821 0.0144467 0.0490098 1 0 1 1 0 0 +EDGE2 4322 4223 1.00163 -0.0244112 0.0187099 1 0 1 1 0 0 +EDGE2 4322 3883 0.944357 -0.0411689 -0.0024034 1 0 1 1 0 0 +EDGE2 4323 4182 -0.989375 -0.000245966 -0.0128895 1 0 1 1 0 0 +EDGE2 4323 4302 -1.08194 -0.00268534 0.00906459 1 0 1 1 0 0 +EDGE2 4323 4322 -0.980118 0.0834674 -0.0145139 1 0 1 1 0 0 +EDGE2 4323 4222 -1.00205 0.0541591 -0.0104945 1 0 1 1 0 0 +EDGE2 4323 4184 1.0273 0.0110279 -0.00328068 1 0 1 1 0 0 +EDGE2 4323 4183 -0.0146769 0.0495284 0.0043086 1 0 1 1 0 0 +EDGE2 4323 4303 0.0572653 0.059678 0.00766219 1 0 1 1 0 0 +EDGE2 4323 3882 -0.966138 0.0176952 0.0294595 1 0 1 1 0 0 +EDGE2 4323 4223 -0.0595297 -0.0352296 0.0067636 1 0 1 1 0 0 +EDGE2 4323 4304 0.976776 0.0170987 -0.000191662 1 0 1 1 0 0 +EDGE2 4323 3883 -0.0514551 0.0130138 -0.00412827 1 0 1 1 0 0 +EDGE2 4323 4224 0.925142 -0.0839525 -0.000103478 1 0 1 1 0 0 +EDGE2 4323 3884 0.977899 0.020727 -0.0177267 1 0 1 1 0 0 +EDGE2 4324 4184 0.0301987 0.0235586 0.0279053 1 0 1 1 0 0 +EDGE2 4324 4183 -1.0163 0.0508446 0.0113014 1 0 1 1 0 0 +EDGE2 4324 4303 -1.07785 -0.00651782 0.0231765 1 0 1 1 0 0 +EDGE2 4324 4323 -0.953933 -0.0169447 -0.019272 1 0 1 1 0 0 +EDGE2 4324 4223 -0.931343 -0.0170264 -0.0156082 1 0 1 1 0 0 +EDGE2 4324 4304 0.06744 0.0222655 0.00777071 1 0 1 1 0 0 +EDGE2 4324 3883 -1.00516 -0.0103758 0.017532 1 0 1 1 0 0 +EDGE2 4324 4224 0.0405842 0.0158876 -0.00414014 1 0 1 1 0 0 +EDGE2 4324 4205 1.033 0.0259657 -3.13159 1 0 1 1 0 0 +EDGE2 4324 4305 0.989767 0.013574 -0.00929597 1 0 1 1 0 0 +EDGE2 4324 3884 0.0543543 0.0295833 0.0238184 1 0 1 1 0 0 +EDGE2 4324 4225 0.972336 -0.0430092 0.0278876 1 0 1 1 0 0 +EDGE2 4324 3885 1.00142 -0.00889141 0.0572607 1 0 1 1 0 0 +EDGE2 4324 4145 0.962393 -0.0557437 -3.16534 1 0 1 1 0 0 +EDGE2 4324 4185 1.11194 -0.0620652 0.0118212 1 0 1 1 0 0 +EDGE2 4325 4186 -0.0166394 -0.9487 -1.57098 1 0 1 1 0 0 +EDGE2 4325 4226 -0.0481437 1.04125 1.57541 1 0 1 1 0 0 +EDGE2 4325 4184 -0.972389 0.0123311 -0.00142051 1 0 1 1 0 0 +EDGE2 4325 4304 -0.937871 -0.005366 0.0279671 1 0 1 1 0 0 +EDGE2 4325 4324 -0.981418 -0.0482641 0.00984738 1 0 1 1 0 0 +EDGE2 4325 4224 -0.968458 0.00773825 0.010283 1 0 1 1 0 0 +EDGE2 4325 4205 -0.029944 -0.021273 -3.12917 1 0 1 1 0 0 +EDGE2 4325 4305 -0.0244447 0.017102 0.0406751 1 0 1 1 0 0 +EDGE2 4325 3884 -0.951342 0.0265557 0.0162489 1 0 1 1 0 0 +EDGE2 4325 4225 0.064241 -0.0479276 0.035794 1 0 1 1 0 0 +EDGE2 4325 3885 -0.00182103 0.00119744 0.0152185 1 0 1 1 0 0 +EDGE2 4325 4145 -0.047907 -0.0330144 -3.15001 1 0 1 1 0 0 +EDGE2 4325 4185 -0.0619861 -0.0584858 -0.0395081 1 0 1 1 0 0 +EDGE2 4325 4306 -0.0197736 1.04085 1.55279 1 0 1 1 0 0 +EDGE2 4325 3886 -0.0369049 1.10647 1.56366 1 0 1 1 0 0 +EDGE2 4325 4146 0.0133295 0.991812 1.55735 1 0 1 1 0 0 +EDGE2 4325 4206 0.0212651 0.997436 1.57369 1 0 1 1 0 0 +EDGE2 4325 4144 0.918191 0.0242154 -3.15156 1 0 1 1 0 0 +EDGE2 4325 4204 1.00244 -0.00343978 -3.13365 1 0 1 1 0 0 +EDGE2 4326 4187 1.09206 0.0179854 0.00481145 1 0 1 1 0 0 +EDGE2 4326 4186 -0.084057 -0.0293413 -0.00150024 1 0 1 1 0 0 +EDGE2 4326 4205 -1.01383 -0.00504555 -1.54982 1 0 1 1 0 0 +EDGE2 4326 4305 -1.05624 0.0690454 1.55393 1 0 1 1 0 0 +EDGE2 4326 4325 -0.978791 -0.0467936 1.57948 1 0 1 1 0 0 +EDGE2 4326 4225 -1.02668 0.00264514 1.58163 1 0 1 1 0 0 +EDGE2 4326 3885 -1.02599 0.00122804 1.57454 1 0 1 1 0 0 +EDGE2 4326 4145 -0.943466 0.0467262 -1.56311 1 0 1 1 0 0 +EDGE2 4326 4185 -0.991164 -0.00138372 1.60302 1 0 1 1 0 0 +EDGE2 4327 4188 1.01525 0.0618342 -0.0111338 1 0 1 1 0 0 +EDGE2 4327 4326 -1.07653 0.0709698 0.0126138 1 0 1 1 0 0 +EDGE2 4327 4187 0.0130409 0.0462953 0.0174629 1 0 1 1 0 0 +EDGE2 4327 4186 -0.994176 0.0383552 -0.0173277 1 0 1 1 0 0 +EDGE2 4328 4327 -0.964354 -0.056305 0.0195831 1 0 1 1 0 0 +EDGE2 4328 4189 0.994717 0.0794291 0.00794176 1 0 1 1 0 0 +EDGE2 4328 4188 -0.0347292 -0.00662867 0.0174701 1 0 1 1 0 0 +EDGE2 4328 4187 -1.00312 0.0413334 -0.008526 1 0 1 1 0 0 +EDGE2 4329 3850 0.893871 0.11259 -3.08614 1 0 1 1 0 0 +EDGE2 4329 4190 0.989631 0.0129882 0.0218062 1 0 1 1 0 0 +EDGE2 4329 4328 -1.05928 0.00655293 0.00829332 1 0 1 1 0 0 +EDGE2 4329 4189 -0.0180126 0.0802547 0.00207397 1 0 1 1 0 0 +EDGE2 4329 4188 -1.05319 0.00657674 0.0175495 1 0 1 1 0 0 +EDGE2 4330 3851 0.0876571 -0.99016 -1.5795 1 0 1 1 0 0 +EDGE2 4330 3849 0.948393 0.0289865 -3.12578 1 0 1 1 0 0 +EDGE2 4330 3850 0.012009 0.00628055 -3.16641 1 0 1 1 0 0 +EDGE2 4330 4190 0.0409264 0.0641675 0.0141587 1 0 1 1 0 0 +EDGE2 4330 4189 -0.997541 0.0575472 0.0198313 1 0 1 1 0 0 +EDGE2 4330 4329 -1.00391 -0.00236618 0.0446129 1 0 1 1 0 0 +EDGE2 4330 4191 -0.0268149 0.919229 1.53911 1 0 1 1 0 0 +EDGE2 4331 3850 -0.992956 -0.00892552 1.56586 1 0 1 1 0 0 +EDGE2 4331 4190 -1.01088 0.00481644 -1.51513 1 0 1 1 0 0 +EDGE2 4331 4330 -1.10263 0.0637632 -1.57579 1 0 1 1 0 0 +EDGE2 4331 4192 0.95795 0.0386983 0.00389524 1 0 1 1 0 0 +EDGE2 4331 4191 -0.00632175 -0.0295014 0.0129035 1 0 1 1 0 0 +EDGE2 4332 4192 0.0317265 0.0537585 0.0371401 1 0 1 1 0 0 +EDGE2 4332 4191 -0.949146 0.0193655 0.00455963 1 0 1 1 0 0 +EDGE2 4332 4331 -1.02961 -0.0345386 -0.00796627 1 0 1 1 0 0 +EDGE2 4332 4193 1.03337 0.0464116 0.0124681 1 0 1 1 0 0 +EDGE2 4333 4192 -0.981532 0.088097 -0.0232135 1 0 1 1 0 0 +EDGE2 4333 4332 -1.01733 0.0487381 -0.0102247 1 0 1 1 0 0 +EDGE2 4333 4194 0.988002 -0.00678941 0.00157098 1 0 1 1 0 0 +EDGE2 4333 4193 0.0105493 0.0208513 0.0314739 1 0 1 1 0 0 +EDGE2 4334 4194 -0.0361809 -0.0243089 -0.00119555 1 0 1 1 0 0 +EDGE2 4334 4193 -0.962214 0.00278453 0.023823 1 0 1 1 0 0 +EDGE2 4334 4333 -1.04331 -0.0523026 -0.013831 1 0 1 1 0 0 +EDGE2 4334 4195 0.894381 0.046152 0.00643034 1 0 1 1 0 0 +EDGE2 4335 4194 -0.974744 0.0875012 -0.00653287 1 0 1 1 0 0 +EDGE2 4335 4334 -1.00362 -0.031808 0.0160225 1 0 1 1 0 0 +EDGE2 4335 4196 -0.162912 1.01394 1.58051 1 0 1 1 0 0 +EDGE2 4335 4195 0.0333801 0.00816551 0.00877512 1 0 1 1 0 0 +EDGE2 4336 4195 -0.924813 -0.0020509 1.54703 1 0 1 1 0 0 +EDGE2 4336 4335 -1.01641 -0.028549 1.57146 1 0 1 1 0 0 +EDGE2 4337 4336 -1.05793 -0.0206208 -0.00309823 1 0 1 1 0 0 +EDGE2 4338 4337 -0.927638 -0.0186665 0.00469075 1 0 1 1 0 0 +EDGE2 4339 4338 -1.03361 -0.0704482 0.0190275 1 0 1 1 0 0 +EDGE2 4340 4339 -1.07233 0.0452332 0.0161165 1 0 1 1 0 0 +EDGE2 4341 4340 -1.01343 -0.0330421 -1.5658 1 0 1 1 0 0 +EDGE2 4342 4341 -0.961779 -0.00408698 0.0276563 1 0 1 1 0 0 +EDGE2 4343 4342 -1.02553 -0.029824 -0.0276917 1 0 1 1 0 0 +EDGE2 4344 4343 -1.00562 -0.0575115 -0.0256505 1 0 1 1 0 0 +EDGE2 4345 4344 -0.966264 0.0331557 0.0155407 1 0 1 1 0 0 +EDGE2 4346 4345 -0.954129 -0.0600341 1.56962 1 0 1 1 0 0 +EDGE2 4347 4346 -1.04097 -0.00510147 0.0187716 1 0 1 1 0 0 +EDGE2 4348 4347 -0.99153 -0.0232816 0.0421321 1 0 1 1 0 0 +EDGE2 4349 4348 -1.01491 -0.031225 0.0347192 1 0 1 1 0 0 +EDGE2 4350 4349 -1.06111 0.113587 0.00776391 1 0 1 1 0 0 +EDGE2 4351 4350 -0.975314 0.0198329 -1.53916 1 0 1 1 0 0 +EDGE2 4352 4351 -0.945487 0.0116656 0.0234434 1 0 1 1 0 0 +EDGE2 4353 4352 -1.00937 -0.113525 -0.0369992 1 0 1 1 0 0 +EDGE2 4354 4353 -1.05414 -0.0321679 0.0127324 1 0 1 1 0 0 +EDGE2 4355 4354 -1.0465 -0.0147977 -0.00446619 1 0 1 1 0 0 +EDGE2 4356 4355 -1.01678 0.0685081 1.58028 1 0 1 1 0 0 +EDGE2 4357 4356 -0.996229 -0.0660808 -0.00973682 1 0 1 1 0 0 +EDGE2 4358 4357 -0.970297 -0.0768924 -0.00472861 1 0 1 1 0 0 +EDGE2 4359 4358 -1.0032 0.0238365 -0.0253574 1 0 1 1 0 0 +EDGE2 4360 4359 -0.998914 -0.0232282 0.0172108 1 0 1 1 0 0 +EDGE2 4361 4360 -1.02351 -0.119951 1.57559 1 0 1 1 0 0 +EDGE2 4362 4361 -1.00921 -0.0410872 0.0204402 1 0 1 1 0 0 +EDGE2 4363 4362 -1.06241 0.0784309 -0.00275518 1 0 1 1 0 0 +EDGE2 4364 4363 -1.04292 0.0669887 0.00783888 1 0 1 1 0 0 +EDGE2 4365 4364 -1.06377 0.0289033 -0.0175604 1 0 1 1 0 0 +EDGE2 4366 4365 -0.958462 0.0513757 -1.54794 1 0 1 1 0 0 +EDGE2 4367 4366 -0.946509 -0.0433902 -0.0236026 1 0 1 1 0 0 +EDGE2 4368 4367 -0.909685 -0.0525729 -0.0164147 1 0 1 1 0 0 +EDGE2 4369 4368 -0.990015 0.0531988 0.0173973 1 0 1 1 0 0 +EDGE2 4370 4369 -1.07861 -0.0578074 -0.00283571 1 0 1 1 0 0 +EDGE2 4371 4370 -1.04775 0.0318175 -1.57533 1 0 1 1 0 0 +EDGE2 4372 4371 -0.903758 -0.00834634 -0.00142268 1 0 1 1 0 0 +EDGE2 4373 4372 -0.956165 -0.0798055 0.0138943 1 0 1 1 0 0 +EDGE2 4374 4373 -0.981532 0.0913638 -0.0266152 1 0 1 1 0 0 +EDGE2 4375 4374 -0.95286 -0.0482391 0.000562724 1 0 1 1 0 0 +EDGE2 4376 4375 -0.928405 0.0156345 1.54504 1 0 1 1 0 0 +EDGE2 4377 4376 -1.04826 0.085493 0.0118327 1 0 1 1 0 0 +EDGE2 4378 4377 -1.0457 -0.0691623 0.0112357 1 0 1 1 0 0 +EDGE2 4379 4378 -1.01554 0.0261452 0.0277948 1 0 1 1 0 0 +EDGE2 4380 4379 -1.06856 -0.0405608 -0.0215424 1 0 1 1 0 0 +EDGE2 4381 4380 -0.999701 0.159305 1.54268 1 0 1 1 0 0 +EDGE2 4382 4381 -1.01641 -0.0231952 0.00647616 1 0 1 1 0 0 +EDGE2 4383 4382 -0.981933 0.0404394 -0.0263796 1 0 1 1 0 0 +EDGE2 4384 4383 -0.989214 -0.0025548 -0.0179164 1 0 1 1 0 0 +EDGE2 4385 4384 -0.956281 0.0720428 0.0211692 1 0 1 1 0 0 +EDGE2 4386 4385 -0.986022 0.055082 1.58458 1 0 1 1 0 0 +EDGE2 4387 4386 -0.997346 -0.060102 -0.0218017 1 0 1 1 0 0 +EDGE2 4388 4387 -0.993835 0.0201403 0.00118164 1 0 1 1 0 0 +EDGE2 4389 4388 -1.04846 -0.0319513 0.0011435 1 0 1 1 0 0 +EDGE2 4389 4370 0.990178 0.00173071 -3.16927 1 0 1 1 0 0 +EDGE2 4390 4389 -1.04712 0.0270164 -0.020397 1 0 1 1 0 0 +EDGE2 4390 4371 0.0022233 -0.960172 -1.55659 1 0 1 1 0 0 +EDGE2 4390 4370 -0.0653917 0.10569 -3.13661 1 0 1 1 0 0 +EDGE2 4390 4369 1.07102 -0.021628 -3.18177 1 0 1 1 0 0 +EDGE2 4391 4372 1.08611 -0.0820126 0.0293314 1 0 1 1 0 0 +EDGE2 4391 4390 -0.96802 0.04172 1.57348 1 0 1 1 0 0 +EDGE2 4391 4371 -0.00227271 0.0359347 0.0277614 1 0 1 1 0 0 +EDGE2 4391 4370 -0.944991 0.0444642 -1.54895 1 0 1 1 0 0 +EDGE2 4392 4372 -0.0050369 0.0670547 -0.0165023 1 0 1 1 0 0 +EDGE2 4392 4371 -1.10675 -0.0403322 -0.0095331 1 0 1 1 0 0 +EDGE2 4392 4391 -1.01364 0.0640945 0.00119945 1 0 1 1 0 0 +EDGE2 4392 4373 0.970301 -0.00714597 -0.00923849 1 0 1 1 0 0 +EDGE2 4393 4372 -0.98959 -0.0334447 -0.0289963 1 0 1 1 0 0 +EDGE2 4393 4392 -0.965221 0.0354963 -0.00279961 1 0 1 1 0 0 +EDGE2 4393 4373 0.00557198 -0.0610378 0.0159636 1 0 1 1 0 0 +EDGE2 4393 4374 1.05547 0.0767634 -0.0322442 1 0 1 1 0 0 +EDGE2 4394 4375 0.983836 0.0209696 0.0262458 1 0 1 1 0 0 +EDGE2 4394 4393 -1.07016 0.0525412 0.0107289 1 0 1 1 0 0 +EDGE2 4394 4373 -1.00694 -0.0582724 0.00221389 1 0 1 1 0 0 +EDGE2 4394 4374 -0.0870561 0.00688851 -0.00236469 1 0 1 1 0 0 +EDGE2 4395 4375 -0.0442071 -0.0773058 -0.0425206 1 0 1 1 0 0 +EDGE2 4395 4394 -1.00103 0.0479667 -0.013406 1 0 1 1 0 0 +EDGE2 4395 4374 -1.04313 -0.030397 0.0289911 1 0 1 1 0 0 +EDGE2 4395 4376 0.0438795 -1.01043 -1.58597 1 0 1 1 0 0 +EDGE2 4396 4375 -1.07523 -0.0226405 1.62116 1 0 1 1 0 0 +EDGE2 4396 4377 1.03743 -0.0497332 -0.00639323 1 0 1 1 0 0 +EDGE2 4396 4376 -0.00758092 -0.00317252 0.0175275 1 0 1 1 0 0 +EDGE2 4396 4395 -0.954002 0.00474551 1.58848 1 0 1 1 0 0 +EDGE2 4397 4378 1.01226 0.00929998 -0.0240801 1 0 1 1 0 0 +EDGE2 4397 4396 -0.991777 0.0184503 0.0114066 1 0 1 1 0 0 +EDGE2 4397 4377 -0.0199203 -0.0405812 0.0342276 1 0 1 1 0 0 +EDGE2 4397 4376 -1.04794 0.0744434 0.0168401 1 0 1 1 0 0 +EDGE2 4398 4379 0.957376 0.00585881 -0.0256446 1 0 1 1 0 0 +EDGE2 4398 4397 -0.987949 0.00418585 -0.0146776 1 0 1 1 0 0 +EDGE2 4398 4378 0.000656452 0.0284195 -0.00906511 1 0 1 1 0 0 +EDGE2 4398 4377 -1.00203 -0.0484126 -0.0264355 1 0 1 1 0 0 +EDGE2 4399 4380 1.02165 0.0334734 0.0133946 1 0 1 1 0 0 +EDGE2 4399 4379 -0.0163589 -0.00632443 0.00565929 1 0 1 1 0 0 +EDGE2 4399 4378 -0.976723 -0.0343477 0.0168167 1 0 1 1 0 0 +EDGE2 4399 4398 -0.982217 0.0350255 0.0102045 1 0 1 1 0 0 +EDGE2 4400 4381 0.0611046 -0.974154 -1.59344 1 0 1 1 0 0 +EDGE2 4400 4380 0.0350817 0.0010049 -0.0131905 1 0 1 1 0 0 +EDGE2 4400 4399 -1.09557 -0.00159903 0.0276187 1 0 1 1 0 0 +EDGE2 4400 4379 -0.964742 0.0591138 -0.00993084 1 0 1 1 0 0 +EDGE2 4401 4380 -0.983 0.0588266 -1.53988 1 0 1 1 0 0 +EDGE2 4401 4400 -1.03837 0.0898028 -1.59953 1 0 1 1 0 0 +EDGE2 4402 4401 -1.02595 -0.0378172 0.0223666 1 0 1 1 0 0 +EDGE2 4403 4402 -0.993642 -0.108955 0.0234272 1 0 1 1 0 0 +EDGE2 4404 4403 -1.00777 -0.0271981 0.0298959 1 0 1 1 0 0 +EDGE2 4405 4404 -1.00759 -0.0283338 0.00316074 1 0 1 1 0 0 +EDGE2 4406 4405 -1.08275 -0.0396562 -1.61175 1 0 1 1 0 0 +EDGE2 4407 4406 -0.983479 0.0207945 0.0181835 1 0 1 1 0 0 +EDGE2 4408 4407 -1.03293 -0.0681567 -0.0043396 1 0 1 1 0 0 +EDGE2 4409 4408 -1.0308 0.00982915 -0.00667463 1 0 1 1 0 0 +EDGE2 4410 4409 -0.923054 -0.0373294 0.0527794 1 0 1 1 0 0 +EDGE2 4411 4410 -0.976848 -0.00767205 -1.53005 1 0 1 1 0 0 +EDGE2 4412 4411 -1.00628 -0.0716824 -0.0499862 1 0 1 1 0 0 +EDGE2 4413 4412 -1.0129 -0.05458 -0.00347717 1 0 1 1 0 0 +EDGE2 4414 4375 0.966216 0.0605716 -3.16361 1 0 1 1 0 0 +EDGE2 4414 4395 1.00737 -0.0293733 -3.13612 1 0 1 1 0 0 +EDGE2 4414 4413 -0.970297 0.105204 -0.000562871 1 0 1 1 0 0 +EDGE2 4415 4375 -0.0333283 0.000690998 -3.16182 1 0 1 1 0 0 +EDGE2 4415 4394 1.03001 0.0535279 -3.15274 1 0 1 1 0 0 +EDGE2 4415 4374 0.96766 -0.0154799 -3.09951 1 0 1 1 0 0 +EDGE2 4415 4396 0.01619 1.07408 1.57826 1 0 1 1 0 0 +EDGE2 4415 4376 0.000770011 1.1154 1.57898 1 0 1 1 0 0 +EDGE2 4415 4395 0.0441134 -0.0323736 -3.1576 1 0 1 1 0 0 +EDGE2 4415 4414 -0.823751 0.0406979 -0.0699046 1 0 1 1 0 0 +EDGE2 4416 4375 -0.99265 -0.0211336 1.58608 1 0 1 1 0 0 +EDGE2 4416 4397 1.00616 0.00327034 0.00020004 1 0 1 1 0 0 +EDGE2 4416 4396 -0.0400877 0.0970481 -0.0120658 1 0 1 1 0 0 +EDGE2 4416 4377 0.96348 -0.058267 0.0183125 1 0 1 1 0 0 +EDGE2 4416 4376 0.0761521 0.0908151 0.0195736 1 0 1 1 0 0 +EDGE2 4416 4415 -0.995839 -0.0701835 -1.56646 1 0 1 1 0 0 +EDGE2 4416 4395 -1.01868 0.0163046 1.55409 1 0 1 1 0 0 +EDGE2 4417 4397 0.0714449 0.0254924 -0.00589362 1 0 1 1 0 0 +EDGE2 4417 4378 0.964203 -0.0918218 -0.0161476 1 0 1 1 0 0 +EDGE2 4417 4398 0.913912 0.0224453 0.0144251 1 0 1 1 0 0 +EDGE2 4417 4396 -1.02108 0.0335489 -0.0164011 1 0 1 1 0 0 +EDGE2 4417 4416 -0.999426 0.0305793 -0.0422697 1 0 1 1 0 0 +EDGE2 4417 4377 -0.0148887 -0.0103312 0.0127904 1 0 1 1 0 0 +EDGE2 4417 4376 -1.05664 -0.0198277 0.0252668 1 0 1 1 0 0 +EDGE2 4418 4399 1.02911 -0.0315698 -0.0268539 1 0 1 1 0 0 +EDGE2 4418 4379 1.02979 0.0274265 -0.0137195 1 0 1 1 0 0 +EDGE2 4418 4397 -0.990746 -0.00131315 -0.0131229 1 0 1 1 0 0 +EDGE2 4418 4378 0.000795532 0.00351348 -0.0125776 1 0 1 1 0 0 +EDGE2 4418 4398 0.0149832 -0.0234668 0.0285793 1 0 1 1 0 0 +EDGE2 4418 4417 -1.03297 0.0302417 -0.0479608 1 0 1 1 0 0 +EDGE2 4418 4377 -0.964443 0.0661801 -0.0273227 1 0 1 1 0 0 +EDGE2 4419 4380 0.887716 0.0337106 -0.0277263 1 0 1 1 0 0 +EDGE2 4419 4400 1.01396 -0.038693 0.00299237 1 0 1 1 0 0 +EDGE2 4419 4399 -0.0270666 -0.0398382 -0.0263989 1 0 1 1 0 0 +EDGE2 4419 4379 0.00588552 -0.00586125 0.00966185 1 0 1 1 0 0 +EDGE2 4419 4378 -0.944558 -0.0136279 -0.00910958 1 0 1 1 0 0 +EDGE2 4419 4398 -1.06078 -0.096014 -0.0455267 1 0 1 1 0 0 +EDGE2 4419 4418 -0.993107 -0.108839 0.0348007 1 0 1 1 0 0 +EDGE2 4420 4381 -0.038048 -0.961415 -1.57708 1 0 1 1 0 0 +EDGE2 4420 4380 -0.00850941 -0.110489 0.0234204 1 0 1 1 0 0 +EDGE2 4420 4400 -0.0432104 -0.0229025 0.00934987 1 0 1 1 0 0 +EDGE2 4420 4401 -0.0423969 1.00222 1.57412 1 0 1 1 0 0 +EDGE2 4420 4399 -0.9367 -0.163595 -0.0270312 1 0 1 1 0 0 +EDGE2 4420 4419 -1.06272 -0.0677209 0.00614693 1 0 1 1 0 0 +EDGE2 4420 4379 -1.05453 0.0286204 0.0262115 1 0 1 1 0 0 +EDGE2 4421 4380 -0.960086 -0.000520536 -1.57156 1 0 1 1 0 0 +EDGE2 4421 4420 -1.04554 -0.00862638 -1.57796 1 0 1 1 0 0 +EDGE2 4421 4400 -0.979407 0.0337191 -1.59932 1 0 1 1 0 0 +EDGE2 4421 4401 -0.0212919 0.0292054 0.0132089 1 0 1 1 0 0 +EDGE2 4421 4402 0.900377 -0.0250729 0.0116922 1 0 1 1 0 0 +EDGE2 4422 4401 -1.0048 0.0111635 -0.00970099 1 0 1 1 0 0 +EDGE2 4422 4421 -1.04603 -0.0451639 0.0217399 1 0 1 1 0 0 +EDGE2 4422 4402 -0.0509044 0.0533031 -0.0119538 1 0 1 1 0 0 +EDGE2 4422 4403 0.925005 0.0147373 0.0275931 1 0 1 1 0 0 +EDGE2 4423 4422 -1.05147 -0.0140831 0.00309357 1 0 1 1 0 0 +EDGE2 4423 4402 -1.00963 0.0377203 -0.0151375 1 0 1 1 0 0 +EDGE2 4423 4404 1.01658 0.0636887 -0.02089 1 0 1 1 0 0 +EDGE2 4423 4403 -0.0275423 0.0651537 0.0129632 1 0 1 1 0 0 +EDGE2 4424 4404 -0.0488915 -0.021723 -0.0113302 1 0 1 1 0 0 +EDGE2 4424 4403 -1.00197 0.0718656 0.015317 1 0 1 1 0 0 +EDGE2 4424 4423 -1.08907 -0.0676991 0.0182486 1 0 1 1 0 0 +EDGE2 4424 4405 0.90545 0.00994333 -0.0558154 1 0 1 1 0 0 +EDGE2 4425 4406 0.0554473 0.884284 1.55833 1 0 1 1 0 0 +EDGE2 4425 4404 -0.908256 -0.0108909 -0.0195408 1 0 1 1 0 0 +EDGE2 4425 4424 -0.977141 0.0307591 -0.00831808 1 0 1 1 0 0 +EDGE2 4425 4405 0.0544331 -0.0060355 0.0144221 1 0 1 1 0 0 +EDGE2 4426 4406 0.0586312 0.0140357 0.0151557 1 0 1 1 0 0 +EDGE2 4426 4405 -1.01554 0.0338126 -1.54388 1 0 1 1 0 0 +EDGE2 4426 4425 -0.997234 -0.000338181 -1.59123 1 0 1 1 0 0 +EDGE2 4426 4407 1.08061 0.0169919 -0.0042188 1 0 1 1 0 0 +EDGE2 4427 4406 -0.951508 -0.00612299 0.0231871 1 0 1 1 0 0 +EDGE2 4427 4426 -1.08233 -0.0036387 0.0108574 1 0 1 1 0 0 +EDGE2 4427 4407 -0.0614858 -0.0345596 0.00592073 1 0 1 1 0 0 +EDGE2 4427 4408 0.946145 0.0719528 0.0377149 1 0 1 1 0 0 +EDGE2 4428 4407 -0.956408 0.000946345 -0.01498 1 0 1 1 0 0 +EDGE2 4428 4427 -1.01651 0.0173166 0.039421 1 0 1 1 0 0 +EDGE2 4428 4408 0.0203117 0.0140571 -0.010447 1 0 1 1 0 0 +EDGE2 4428 4409 1.03961 0.00467706 0.0072449 1 0 1 1 0 0 +EDGE2 4429 4428 -0.943188 -0.00401911 0.0124907 1 0 1 1 0 0 +EDGE2 4429 4408 -0.999506 0.00267 0.00260157 1 0 1 1 0 0 +EDGE2 4429 4409 -0.0222006 -0.00462725 -0.00832778 1 0 1 1 0 0 +EDGE2 4429 4410 1.01611 0.0295971 0.0381036 1 0 1 1 0 0 +EDGE2 4430 4429 -1.03056 -0.0378753 -0.000312466 1 0 1 1 0 0 +EDGE2 4430 4409 -0.999541 -0.00172545 -0.0385947 1 0 1 1 0 0 +EDGE2 4430 4411 0.0494533 0.927897 1.57868 1 0 1 1 0 0 +EDGE2 4430 4410 0.000777877 -0.0181418 0.00351869 1 0 1 1 0 0 +EDGE2 4431 4412 0.930076 0.0395962 0.020315 1 0 1 1 0 0 +EDGE2 4431 4430 -0.995313 -0.0354973 -1.60414 1 0 1 1 0 0 +EDGE2 4431 4411 -0.091719 0.0317426 0.0273502 1 0 1 1 0 0 +EDGE2 4431 4410 -0.978072 -0.0520126 -1.57398 1 0 1 1 0 0 +EDGE2 4432 4412 0.0278718 0.0241752 -0.0283184 1 0 1 1 0 0 +EDGE2 4432 4413 0.966947 0.0763861 0.0034922 1 0 1 1 0 0 +EDGE2 4432 4411 -1.02123 -0.0109282 -0.0258056 1 0 1 1 0 0 +EDGE2 4432 4431 -0.933434 0.017317 -0.0166062 1 0 1 1 0 0 +EDGE2 4433 4412 -0.98313 0.0163124 -0.00307127 1 0 1 1 0 0 +EDGE2 4433 4413 -0.00304159 -0.056294 0.00958354 1 0 1 1 0 0 +EDGE2 4433 4414 1.0003 0.0371019 0.0249337 1 0 1 1 0 0 +EDGE2 4433 4432 -0.984268 -0.0444801 -0.0334524 1 0 1 1 0 0 +EDGE2 4434 4375 0.970646 -0.00180308 -3.13357 1 0 1 1 0 0 +EDGE2 4434 4415 0.997042 -0.0081325 -0.00775508 1 0 1 1 0 0 +EDGE2 4434 4395 1.06372 -0.0313462 -3.16465 1 0 1 1 0 0 +EDGE2 4434 4413 -0.953145 0.0251143 -0.0124312 1 0 1 1 0 0 +EDGE2 4434 4433 -0.977662 -0.00774124 0.00284308 1 0 1 1 0 0 +EDGE2 4434 4414 0.00265362 -0.0385916 0.0165694 1 0 1 1 0 0 +EDGE2 4435 4375 -0.012045 -0.124598 -3.12804 1 0 1 1 0 0 +EDGE2 4435 4394 1.00889 -0.0468099 -3.15789 1 0 1 1 0 0 +EDGE2 4435 4374 1.02773 -0.059858 -3.11344 1 0 1 1 0 0 +EDGE2 4435 4396 0.0633317 1.0249 1.57384 1 0 1 1 0 0 +EDGE2 4435 4416 -0.0116873 1.03409 1.54669 1 0 1 1 0 0 +EDGE2 4435 4376 0.0345875 1.02926 1.54047 1 0 1 1 0 0 +EDGE2 4435 4415 -0.0865454 0.0195311 0.00993937 1 0 1 1 0 0 +EDGE2 4435 4395 -0.0495527 -0.0366305 -3.14837 1 0 1 1 0 0 +EDGE2 4435 4434 -1.07211 -0.0330582 0.0334503 1 0 1 1 0 0 +EDGE2 4435 4414 -1.00286 -0.00756279 0.00697148 1 0 1 1 0 0 +EDGE2 4436 4375 -0.931231 -0.0667104 -1.58058 1 0 1 1 0 0 +EDGE2 4436 4435 -1.04409 0.00320678 1.57427 1 0 1 1 0 0 +EDGE2 4436 4415 -1.00175 -0.00922413 1.55903 1 0 1 1 0 0 +EDGE2 4436 4395 -0.977011 -0.032697 -1.57501 1 0 1 1 0 0 +EDGE2 4437 4436 -1.0165 -0.059277 0.0167645 1 0 1 1 0 0 +EDGE2 4438 4437 -0.936976 0.0515946 -0.021121 1 0 1 1 0 0 +EDGE2 4439 4438 -0.964951 0.0883335 -0.0128939 1 0 1 1 0 0 +EDGE2 4439 4360 0.946099 -0.0346272 -3.13246 1 0 1 1 0 0 +EDGE2 4440 4439 -0.954322 -0.0407022 0.00947365 1 0 1 1 0 0 +EDGE2 4440 4361 -0.0282928 1.01414 1.58334 1 0 1 1 0 0 +EDGE2 4440 4359 1.05704 0.00150002 -3.1515 1 0 1 1 0 0 +EDGE2 4440 4360 0.0294694 0.0231276 -3.14136 1 0 1 1 0 0 +EDGE2 4441 4440 -1.00584 -0.0539729 -1.55255 1 0 1 1 0 0 +EDGE2 4441 4362 1.00268 -0.00246939 0.0229724 1 0 1 1 0 0 +EDGE2 4441 4361 -0.0120708 0.034364 0.0315799 1 0 1 1 0 0 +EDGE2 4441 4360 -1.00322 -0.00601471 1.59117 1 0 1 1 0 0 +EDGE2 4442 4363 0.972102 0.0111887 0.00278237 1 0 1 1 0 0 +EDGE2 4442 4441 -1.00946 0.0260816 0.008767 1 0 1 1 0 0 +EDGE2 4442 4362 0.0190512 0.0812421 -0.0313351 1 0 1 1 0 0 +EDGE2 4442 4361 -0.982279 -0.0368737 0.00818475 1 0 1 1 0 0 +EDGE2 4443 4363 -0.0799443 -0.0575661 -0.00305875 1 0 1 1 0 0 +EDGE2 4443 4364 0.87812 -0.0346176 -0.00731313 1 0 1 1 0 0 +EDGE2 4443 4362 -0.959204 -0.0251158 0.00689982 1 0 1 1 0 0 +EDGE2 4443 4442 -0.888198 -0.0271229 -0.0391522 1 0 1 1 0 0 +EDGE2 4444 4363 -0.923032 0.028387 -0.00963741 1 0 1 1 0 0 +EDGE2 4444 4364 -0.0153194 -0.0704986 -0.0114067 1 0 1 1 0 0 +EDGE2 4444 4365 0.90562 0.00667492 0.00545148 1 0 1 1 0 0 +EDGE2 4444 4443 -0.995199 -0.0159808 -0.00571818 1 0 1 1 0 0 +EDGE2 4445 4366 -0.00361971 0.933796 1.57874 1 0 1 1 0 0 +EDGE2 4445 4364 -1.05841 -0.0699732 -0.00612978 1 0 1 1 0 0 +EDGE2 4445 4444 -1.0102 -0.0234464 0.00958663 1 0 1 1 0 0 +EDGE2 4445 4365 0.0580426 -0.0822161 0.0367614 1 0 1 1 0 0 +EDGE2 4446 4445 -1.01265 0.0238251 1.59358 1 0 1 1 0 0 +EDGE2 4446 4365 -1.00963 0.0348452 1.5845 1 0 1 1 0 0 +EDGE2 4447 4446 -1.04637 -0.000134086 0.0475058 1 0 1 1 0 0 +EDGE2 4448 4447 -0.956125 0.00217284 0.00832448 1 0 1 1 0 0 +EDGE2 4449 4448 -0.94926 -0.0538107 0.00998547 1 0 1 1 0 0 +EDGE2 4449 4350 1.0145 -0.00255103 -3.12027 1 0 1 1 0 0 +EDGE2 4450 4349 1.04975 -0.0753593 -3.10608 1 0 1 1 0 0 +EDGE2 4450 4449 -1.01808 -0.0817564 0.00818847 1 0 1 1 0 0 +EDGE2 4450 4351 0.0537667 -0.96224 -1.57454 1 0 1 1 0 0 +EDGE2 4450 4350 0.0382893 0.00547186 -3.10687 1 0 1 1 0 0 +EDGE2 4451 4450 -0.951536 -0.0116544 1.59117 1 0 1 1 0 0 +EDGE2 4451 4351 -0.00244937 0.0283305 -0.000493522 1 0 1 1 0 0 +EDGE2 4451 4350 -1.0363 0.0328463 -1.61284 1 0 1 1 0 0 +EDGE2 4451 4352 1.16425 -0.0637972 -0.00784369 1 0 1 1 0 0 +EDGE2 4452 4351 -1.0162 -0.0223944 -0.0386762 1 0 1 1 0 0 +EDGE2 4452 4451 -1.01724 -0.0145533 0.0137655 1 0 1 1 0 0 +EDGE2 4452 4353 1.02517 0.0888245 0.0080312 1 0 1 1 0 0 +EDGE2 4452 4352 0.101799 0.0376262 0.00246825 1 0 1 1 0 0 +EDGE2 4453 4452 -0.954828 0.050881 0.022888 1 0 1 1 0 0 +EDGE2 4453 4353 -0.113928 -0.032805 0.0366227 1 0 1 1 0 0 +EDGE2 4453 4352 -1.08358 0.021554 0.00872935 1 0 1 1 0 0 +EDGE2 4453 4354 0.97557 -0.0236115 0.00377482 1 0 1 1 0 0 +EDGE2 4454 4353 -1.04408 -0.0363178 -0.00126993 1 0 1 1 0 0 +EDGE2 4454 4453 -0.965837 -0.078155 0.0145412 1 0 1 1 0 0 +EDGE2 4454 4354 -0.0265776 -0.0151858 0.00892253 1 0 1 1 0 0 +EDGE2 4454 4355 1.02034 -0.0108455 -0.00444123 1 0 1 1 0 0 +EDGE2 4455 4356 -0.0414837 -1.01566 -1.52699 1 0 1 1 0 0 +EDGE2 4455 4354 -0.997373 0.0591692 0.0030153 1 0 1 1 0 0 +EDGE2 4455 4454 -1.05327 0.0559905 0.00432892 1 0 1 1 0 0 +EDGE2 4455 4355 -0.109432 0.0105582 0.0138084 1 0 1 1 0 0 +EDGE2 4456 4455 -1.05571 0.073643 -1.58233 1 0 1 1 0 0 +EDGE2 4456 4355 -0.989369 0.0393421 -1.53736 1 0 1 1 0 0 +EDGE2 4457 4456 -1.04543 -0.0163008 0.0133423 1 0 1 1 0 0 +EDGE2 4458 4457 -0.943771 0.046113 -0.0233985 1 0 1 1 0 0 +EDGE2 4459 4458 -1.05663 -0.00832631 -0.0046582 1 0 1 1 0 0 +EDGE2 4460 4459 -1.03398 0.0124334 0.0186751 1 0 1 1 0 0 +EDGE2 4461 4460 -0.999258 -0.0779802 -1.55695 1 0 1 1 0 0 +EDGE2 4462 4461 -0.980003 0.0891174 0.0207786 1 0 1 1 0 0 +EDGE2 4463 4462 -1.04064 -0.0199237 -0.0228535 1 0 1 1 0 0 +EDGE2 4464 4345 1.01242 -0.0258831 -3.12965 1 0 1 1 0 0 +EDGE2 4464 4463 -1.14521 0.0375552 0.0214126 1 0 1 1 0 0 +EDGE2 4465 4464 -0.977597 0.0453874 -0.00348325 1 0 1 1 0 0 +EDGE2 4465 4346 0.148268 0.959585 1.53426 1 0 1 1 0 0 +EDGE2 4465 4344 0.993233 -0.0338872 -3.09573 1 0 1 1 0 0 +EDGE2 4465 4345 0.0225913 0.0152216 -3.13375 1 0 1 1 0 0 +EDGE2 4466 4347 1.08696 -0.0440935 -0.00670443 1 0 1 1 0 0 +EDGE2 4466 4465 -1.06542 0.0342957 -1.54387 1 0 1 1 0 0 +EDGE2 4466 4346 -0.046467 0.0585465 -0.00917482 1 0 1 1 0 0 +EDGE2 4466 4345 -0.922406 0.00446377 1.56085 1 0 1 1 0 0 +EDGE2 4467 4466 -1.0855 -0.0449016 0.0142944 1 0 1 1 0 0 +EDGE2 4467 4348 1.06667 -0.0527703 0.0213769 1 0 1 1 0 0 +EDGE2 4467 4347 0.0222937 0.0448518 0.0601786 1 0 1 1 0 0 +EDGE2 4467 4346 -1.07231 0.0368931 -0.0165777 1 0 1 1 0 0 +EDGE2 4468 4349 0.967149 -0.0461899 -0.00772255 1 0 1 1 0 0 +EDGE2 4468 4467 -1.0445 0.0637093 -0.00187405 1 0 1 1 0 0 +EDGE2 4468 4348 -0.00538069 -0.102653 0.0102553 1 0 1 1 0 0 +EDGE2 4468 4347 -1.03787 -0.0553337 0.0088456 1 0 1 1 0 0 +EDGE2 4469 4349 -0.129545 0.0443907 -0.00340312 1 0 1 1 0 0 +EDGE2 4469 4450 0.995821 0.036506 -3.15071 1 0 1 1 0 0 +EDGE2 4469 4350 0.981555 -0.00883477 -0.0329231 1 0 1 1 0 0 +EDGE2 4469 4348 -1.02325 0.0714131 -0.0194995 1 0 1 1 0 0 +EDGE2 4469 4468 -1.01209 0.0272018 -0.0209489 1 0 1 1 0 0 +EDGE2 4470 4349 -1.02337 -0.02867 0.0221085 1 0 1 1 0 0 +EDGE2 4470 4450 -0.055958 0.00865045 -3.14437 1 0 1 1 0 0 +EDGE2 4470 4449 0.9536 0.0113531 -3.15194 1 0 1 1 0 0 +EDGE2 4470 4351 -0.0223176 1.14441 1.54662 1 0 1 1 0 0 +EDGE2 4470 4451 0.0389663 0.925185 1.5438 1 0 1 1 0 0 +EDGE2 4470 4350 0.00195869 -0.0639304 -0.0316808 1 0 1 1 0 0 +EDGE2 4470 4469 -0.961803 -0.00797197 -0.000190634 1 0 1 1 0 0 +EDGE2 4471 4450 -0.950546 0.0195062 -1.61997 1 0 1 1 0 0 +EDGE2 4471 4470 -1.02805 0.0436217 1.54453 1 0 1 1 0 0 +EDGE2 4471 4350 -0.953097 -0.0545732 1.60551 1 0 1 1 0 0 +EDGE2 4472 4471 -1.04002 0.0860318 -0.0101153 1 0 1 1 0 0 +EDGE2 4473 4472 -1.02525 -0.0290515 -0.0278446 1 0 1 1 0 0 +EDGE2 4474 4473 -0.975259 0.0193166 -0.0013048 1 0 1 1 0 0 +EDGE2 4475 4474 -1.01874 -0.00651044 0.00979893 1 0 1 1 0 0 +EDGE2 4476 4475 -0.928918 -0.125254 -1.57538 1 0 1 1 0 0 +EDGE2 4477 4476 -0.954174 -0.0344415 -0.0365312 1 0 1 1 0 0 +EDGE2 4478 4477 -0.974001 0.0594676 0.041037 1 0 1 1 0 0 +EDGE2 4479 4478 -0.991245 0.0401376 -0.00428872 1 0 1 1 0 0 +EDGE2 4480 4479 -0.950331 -0.0116423 0.032542 1 0 1 1 0 0 +EDGE2 4481 4480 -0.975558 -0.0657327 -1.576 1 0 1 1 0 0 +EDGE2 4482 4481 -1.03971 -0.018632 -0.00213976 1 0 1 1 0 0 +EDGE2 4483 4482 -0.916821 0.0666629 0.00162887 1 0 1 1 0 0 +EDGE2 4484 4483 -0.990526 0.0325422 0.0265837 1 0 1 1 0 0 +EDGE2 4484 4445 0.948442 0.00066724 -3.11748 1 0 1 1 0 0 +EDGE2 4484 4365 1.00485 -0.0119001 -3.09278 1 0 1 1 0 0 +EDGE2 4485 4484 -1.12414 -0.0781462 -0.00492717 1 0 1 1 0 0 +EDGE2 4485 4445 -0.0230455 -0.0501362 -3.16708 1 0 1 1 0 0 +EDGE2 4485 4366 -0.0344962 -0.966158 -1.58573 1 0 1 1 0 0 +EDGE2 4485 4364 1.07139 -0.0731297 -3.11537 1 0 1 1 0 0 +EDGE2 4485 4444 0.959397 0.0316975 -3.09466 1 0 1 1 0 0 +EDGE2 4485 4365 -0.0661715 -0.0328771 -3.12238 1 0 1 1 0 0 +EDGE2 4485 4446 0.023338 1.00175 1.59627 1 0 1 1 0 0 +EDGE2 4486 4445 -1.03299 -0.0603452 1.58461 1 0 1 1 0 0 +EDGE2 4486 4485 -0.923389 0.0402729 -1.55108 1 0 1 1 0 0 +EDGE2 4486 4365 -0.992705 0.057451 1.58708 1 0 1 1 0 0 +EDGE2 4486 4447 1.00239 0.032294 0.00724829 1 0 1 1 0 0 +EDGE2 4486 4446 -0.0240202 -0.00215866 -0.0111155 1 0 1 1 0 0 +EDGE2 4487 4448 1.06323 0.0317336 0.0279051 1 0 1 1 0 0 +EDGE2 4487 4486 -0.996227 -0.00047824 0.0292196 1 0 1 1 0 0 +EDGE2 4487 4447 -0.0229138 -0.00670363 -0.00536618 1 0 1 1 0 0 +EDGE2 4487 4446 -1.08494 0.128052 0.0108608 1 0 1 1 0 0 +EDGE2 4488 4448 -0.11439 0.105915 0.0240659 1 0 1 1 0 0 +EDGE2 4488 4447 -0.936447 -0.0513531 -0.0186104 1 0 1 1 0 0 +EDGE2 4488 4487 -1.01599 0.127014 -0.00178427 1 0 1 1 0 0 +EDGE2 4488 4449 1.08012 -0.0712714 -0.0168488 1 0 1 1 0 0 +EDGE2 4489 4448 -1.05693 -0.00549592 -0.0244429 1 0 1 1 0 0 +EDGE2 4489 4488 -0.97148 -0.085888 -0.0103295 1 0 1 1 0 0 +EDGE2 4489 4450 1.05162 0.0263215 0.0154375 1 0 1 1 0 0 +EDGE2 4489 4449 -0.051751 0.00990396 -0.0308398 1 0 1 1 0 0 +EDGE2 4489 4470 1.02416 0.0461977 -3.14662 1 0 1 1 0 0 +EDGE2 4489 4350 1.0578 -0.0228694 -3.14901 1 0 1 1 0 0 +EDGE2 4490 4471 0.0661214 1.0148 1.59245 1 0 1 1 0 0 +EDGE2 4490 4349 1.02389 -0.0799686 -3.12149 1 0 1 1 0 0 +EDGE2 4490 4450 -0.0317642 -0.0389707 0.0211622 1 0 1 1 0 0 +EDGE2 4490 4449 -1.0729 -0.0751352 -0.0222105 1 0 1 1 0 0 +EDGE2 4490 4489 -1.07554 0.0259911 -0.0288957 1 0 1 1 0 0 +EDGE2 4490 4470 -0.0161155 -0.0406744 -3.11637 1 0 1 1 0 0 +EDGE2 4490 4351 0.0336434 -0.92642 -1.57991 1 0 1 1 0 0 +EDGE2 4490 4451 -0.0260501 -0.965799 -1.57623 1 0 1 1 0 0 +EDGE2 4490 4350 -0.0324345 0.0273367 -3.11992 1 0 1 1 0 0 +EDGE2 4490 4469 0.954536 0.0382204 -3.13043 1 0 1 1 0 0 +EDGE2 4491 4471 -0.0402363 -0.0641095 0.0020574 1 0 1 1 0 0 +EDGE2 4491 4472 0.988744 0.00208459 -0.0185477 1 0 1 1 0 0 +EDGE2 4491 4450 -0.929843 0.0329627 -1.603 1 0 1 1 0 0 +EDGE2 4491 4490 -1.02013 0.00610815 -1.61223 1 0 1 1 0 0 +EDGE2 4491 4470 -1.02029 0.0279933 1.56884 1 0 1 1 0 0 +EDGE2 4491 4350 -0.904385 -0.0178738 1.5767 1 0 1 1 0 0 +EDGE2 4492 4471 -1.00909 0.00306228 -0.00354848 1 0 1 1 0 0 +EDGE2 4492 4472 -0.0583364 0.0715148 0.00738194 1 0 1 1 0 0 +EDGE2 4492 4473 0.884891 0.0534146 -0.0440848 1 0 1 1 0 0 +EDGE2 4492 4491 -1.08433 -0.130942 -0.00965165 1 0 1 1 0 0 +EDGE2 4493 4474 1.03544 0.00113571 0.0162134 1 0 1 1 0 0 +EDGE2 4493 4472 -0.854719 -0.0564973 -0.00719226 1 0 1 1 0 0 +EDGE2 4493 4492 -0.97948 0.0310608 -0.00647291 1 0 1 1 0 0 +EDGE2 4493 4473 -0.00947943 -0.0597335 0.0101253 1 0 1 1 0 0 +EDGE2 4494 4475 0.961239 -0.000925855 -0.00370431 1 0 1 1 0 0 +EDGE2 4494 4493 -0.948664 0.0173681 -0.0245148 1 0 1 1 0 0 +EDGE2 4494 4474 0.063778 0.0867247 -0.0142111 1 0 1 1 0 0 +EDGE2 4494 4473 -1.06631 -0.000391919 -0.00319042 1 0 1 1 0 0 +EDGE2 4495 4494 -1.00441 0.0875073 -0.0427147 1 0 1 1 0 0 +EDGE2 4495 4475 -0.0370028 0.0959513 0.0200435 1 0 1 1 0 0 +EDGE2 4495 4476 0.0575356 0.96908 1.58778 1 0 1 1 0 0 +EDGE2 4495 4474 -1.03905 -0.0034084 0.0104849 1 0 1 1 0 0 +EDGE2 4496 4475 -1.00726 0.0016713 1.59842 1 0 1 1 0 0 +EDGE2 4496 4495 -0.94758 0.0388824 1.59849 1 0 1 1 0 0 +EDGE2 4497 4496 -1.0028 -0.00878475 0.00556758 1 0 1 1 0 0 +EDGE2 4498 4497 -1.00826 0.0135262 -0.0115568 1 0 1 1 0 0 +EDGE2 4499 4498 -1.05442 -0.00694101 0.00609984 1 0 1 1 0 0 +EDGE2 4499 4340 1.02436 -0.039398 -3.15133 1 0 1 1 0 0 +EDGE2 4500 4499 -1.02044 0.0551708 -0.00598303 1 0 1 1 0 0 +EDGE2 4500 4339 1.04753 0.00436781 -3.13073 1 0 1 1 0 0 +EDGE2 4500 4341 -0.0407212 -1.09587 -1.63176 1 0 1 1 0 0 +EDGE2 4500 4340 0.0827363 0.069112 -3.16 1 0 1 1 0 0 +EDGE2 4501 4500 -0.99459 -0.0635453 -1.5613 1 0 1 1 0 0 +EDGE2 4501 4340 -1.08769 0.0227277 1.58092 1 0 1 1 0 0 +EDGE2 4502 4501 -1.02306 -0.0603327 0.0130901 1 0 1 1 0 0 +EDGE2 4503 4502 -0.959659 -0.0548187 -0.0123426 1 0 1 1 0 0 +EDGE2 4504 3845 0.922969 -0.0402187 -3.12157 1 0 1 1 0 0 +EDGE2 4504 4503 -0.944973 -0.00364872 0.0573695 1 0 1 1 0 0 +EDGE2 4505 3844 0.996129 0.0200259 -3.15578 1 0 1 1 0 0 +EDGE2 4505 3846 0.0396531 -0.953065 -1.5717 1 0 1 1 0 0 +EDGE2 4505 3845 0.0146568 -0.0160777 -3.14792 1 0 1 1 0 0 +EDGE2 4505 4504 -0.955504 0.0100789 0.0113862 1 0 1 1 0 0 +EDGE2 4506 4505 -0.935695 -0.0251779 1.54645 1 0 1 1 0 0 +EDGE2 4506 3847 1.01519 -0.0346173 -0.0104108 1 0 1 1 0 0 +EDGE2 4506 3846 0.0550555 -0.0252302 0.0170585 1 0 1 1 0 0 +EDGE2 4506 3845 -1.06067 0.00994295 -1.55646 1 0 1 1 0 0 +EDGE2 4507 3847 -0.0322039 0.0952189 -0.0106922 1 0 1 1 0 0 +EDGE2 4507 3846 -1.00227 0.00122396 -0.0569963 1 0 1 1 0 0 +EDGE2 4507 4506 -0.970442 0.0195484 -0.0335002 1 0 1 1 0 0 +EDGE2 4507 3848 0.927234 -0.0234202 -0.0256027 1 0 1 1 0 0 +EDGE2 4508 3847 -1.0199 0.017427 0.0038463 1 0 1 1 0 0 +EDGE2 4508 4507 -1.00577 -0.0607406 0.0227547 1 0 1 1 0 0 +EDGE2 4508 3848 0.0124088 0.00234631 -0.0113102 1 0 1 1 0 0 +EDGE2 4508 3849 1.03659 -0.00319958 -0.00226634 1 0 1 1 0 0 +EDGE2 4509 3848 -1.09226 0.0644904 0.0209914 1 0 1 1 0 0 +EDGE2 4509 4508 -1.09854 0.00615697 -0.00115548 1 0 1 1 0 0 +EDGE2 4509 3849 0.0242439 0.00712809 0.0234464 1 0 1 1 0 0 +EDGE2 4509 3850 1.00731 -0.0309891 -0.0106774 1 0 1 1 0 0 +EDGE2 4509 4190 0.983716 -0.00924934 -3.15794 1 0 1 1 0 0 +EDGE2 4509 4330 1.0028 0.0631671 -3.13432 1 0 1 1 0 0 +EDGE2 4510 3851 -0.030371 1.05998 1.57788 1 0 1 1 0 0 +EDGE2 4510 4509 -1.03028 0.0610577 0.00914757 1 0 1 1 0 0 +EDGE2 4510 3849 -0.871281 0.0875693 0.00964138 1 0 1 1 0 0 +EDGE2 4510 3850 0.0560513 -0.000520445 0.00904391 1 0 1 1 0 0 +EDGE2 4510 4190 0.0220179 -0.041076 -3.11577 1 0 1 1 0 0 +EDGE2 4510 4330 0.0232976 0.058908 -3.10288 1 0 1 1 0 0 +EDGE2 4510 4189 1.06597 0.0164536 -3.18122 1 0 1 1 0 0 +EDGE2 4510 4329 0.932555 0.0152794 -3.14723 1 0 1 1 0 0 +EDGE2 4510 4191 0.023512 -1.03126 -1.58085 1 0 1 1 0 0 +EDGE2 4510 4331 -0.0216512 -0.966218 -1.55244 1 0 1 1 0 0 +EDGE2 4511 4510 -0.961818 -0.045127 -1.58077 1 0 1 1 0 0 +EDGE2 4511 3852 0.978629 0.0331087 -0.012076 1 0 1 1 0 0 +EDGE2 4511 3851 -0.0462682 0.0237097 -0.011784 1 0 1 1 0 0 +EDGE2 4511 3850 -1.04292 -0.0172402 -1.58122 1 0 1 1 0 0 +EDGE2 4511 4190 -1.03682 -0.0476303 1.53884 1 0 1 1 0 0 +EDGE2 4511 4330 -0.976713 0.0521032 1.5348 1 0 1 1 0 0 +EDGE2 4512 3853 0.995122 0.0343843 0.0151259 1 0 1 1 0 0 +EDGE2 4512 4511 -1.00327 0.11032 -0.0198941 1 0 1 1 0 0 +EDGE2 4512 3852 -0.00494894 0.0534418 -0.00506572 1 0 1 1 0 0 +EDGE2 4512 3851 -0.947212 -0.0184942 -0.0063886 1 0 1 1 0 0 +EDGE2 4513 3854 0.972088 -0.0248506 0.0237133 1 0 1 1 0 0 +EDGE2 4513 3853 0.00315426 -0.0238633 -0.00160312 1 0 1 1 0 0 +EDGE2 4513 3852 -0.9509 -0.0183782 -0.00765924 1 0 1 1 0 0 +EDGE2 4513 4512 -1.06351 0.0428275 -0.00134319 1 0 1 1 0 0 +EDGE2 4514 3855 1.09078 0.0937869 0.017507 1 0 1 1 0 0 +EDGE2 4514 3875 1.08939 0.00719618 -3.16539 1 0 1 1 0 0 +EDGE2 4514 3854 0.00230847 0.0125792 0.00728027 1 0 1 1 0 0 +EDGE2 4514 3853 -1.02845 -0.00851217 0.0023665 1 0 1 1 0 0 +EDGE2 4514 4513 -1.01833 0.000830753 -0.00302392 1 0 1 1 0 0 +EDGE2 4515 3856 -0.0812524 -0.849205 -1.56164 1 0 1 1 0 0 +EDGE2 4515 3874 1.05247 -0.00922746 -3.1581 1 0 1 1 0 0 +EDGE2 4515 3855 0.0651731 0.00551696 -0.0220044 1 0 1 1 0 0 +EDGE2 4515 3875 -0.121928 0.0271669 -3.13695 1 0 1 1 0 0 +EDGE2 4515 3876 0.0623249 -0.971557 -1.563 1 0 1 1 0 0 +EDGE2 4515 3854 -0.992475 -0.0408658 0.016136 1 0 1 1 0 0 +EDGE2 4515 4514 -0.917404 0.098162 -0.00659058 1 0 1 1 0 0 +EDGE2 4516 3856 -0.0228086 0.0024272 0.00563246 1 0 1 1 0 0 +EDGE2 4516 4515 -0.982518 0.0303598 1.58733 1 0 1 1 0 0 +EDGE2 4516 3855 -0.969794 0.00480481 1.60307 1 0 1 1 0 0 +EDGE2 4516 3875 -0.967023 0.033183 -1.53893 1 0 1 1 0 0 +EDGE2 4516 3876 0.00483668 0.118777 -0.0151035 1 0 1 1 0 0 +EDGE2 4516 3857 0.987876 -0.0187942 -0.00180519 1 0 1 1 0 0 +EDGE2 4516 3877 1.03215 0.0467298 0.0124381 1 0 1 1 0 0 +EDGE2 4517 3856 -1.0497 0.017049 0.0202366 1 0 1 1 0 0 +EDGE2 4517 4516 -0.955342 -0.0510837 0.032351 1 0 1 1 0 0 +EDGE2 4517 3876 -1.05054 -0.0417069 -0.0204975 1 0 1 1 0 0 +EDGE2 4517 3857 0.102596 0.0133955 -0.0368581 1 0 1 1 0 0 +EDGE2 4517 3877 -0.00380042 -0.00257396 0.00383179 1 0 1 1 0 0 +EDGE2 4517 3878 1.00955 -0.0068402 -0.00541318 1 0 1 1 0 0 +EDGE2 4517 3858 0.975312 -0.00267742 -0.0281635 1 0 1 1 0 0 +EDGE2 4518 3857 -1.04838 -0.0514604 -0.00242232 1 0 1 1 0 0 +EDGE2 4518 4517 -1.03198 0.0841014 0.00607736 1 0 1 1 0 0 +EDGE2 4518 3877 -1.02077 0.0520864 -0.00121684 1 0 1 1 0 0 +EDGE2 4518 3878 0.0188962 -0.0879133 0.0471738 1 0 1 1 0 0 +EDGE2 4518 3858 0.00162934 -0.00504314 0.00628335 1 0 1 1 0 0 +EDGE2 4518 3859 1.03047 0.0378427 -0.00241213 1 0 1 1 0 0 +EDGE2 4518 3879 1.09369 -0.0045913 -0.00759342 1 0 1 1 0 0 +EDGE2 4519 3878 -0.979265 0.0312128 0.0126836 1 0 1 1 0 0 +EDGE2 4519 4518 -0.973518 0.00453025 0.0194804 1 0 1 1 0 0 +EDGE2 4519 3858 -1.0725 -0.0423655 0.0342625 1 0 1 1 0 0 +EDGE2 4519 3859 -0.000877446 0.00755582 0.022292 1 0 1 1 0 0 +EDGE2 4519 3879 -0.10561 0.00158248 -0.0361756 1 0 1 1 0 0 +EDGE2 4519 4180 1.09802 0.031351 -3.07435 1 0 1 1 0 0 +EDGE2 4519 4300 0.944617 -0.0158992 -3.14778 1 0 1 1 0 0 +EDGE2 4519 4320 1.02772 -0.0420615 -3.13985 1 0 1 1 0 0 +EDGE2 4519 4220 1.17046 0.0115164 -3.15668 1 0 1 1 0 0 +EDGE2 4519 3860 0.953439 0.0236929 0.00395209 1 0 1 1 0 0 +EDGE2 4519 3880 0.975186 -0.00290897 -0.00652566 1 0 1 1 0 0 +EDGE2 4520 4321 0.072602 -1.01485 -1.61126 1 0 1 1 0 0 +EDGE2 4520 4519 -0.989928 -0.0444082 -0.00241847 1 0 1 1 0 0 +EDGE2 4520 4219 0.943819 -0.159771 -3.18576 1 0 1 1 0 0 +EDGE2 4520 3859 -1.00911 0.0839697 0.0099561 1 0 1 1 0 0 +EDGE2 4520 3879 -1.05445 0.0190673 -0.0349381 1 0 1 1 0 0 +EDGE2 4520 3861 -0.0166357 0.920263 1.57593 1 0 1 1 0 0 +EDGE2 4520 4180 -0.0641858 -0.0876656 -3.15682 1 0 1 1 0 0 +EDGE2 4520 4300 0.00966782 -0.0853419 -3.14569 1 0 1 1 0 0 +EDGE2 4520 4320 0.0312241 -0.04441 -3.13956 1 0 1 1 0 0 +EDGE2 4520 4220 0.0474045 -0.0754664 -3.17434 1 0 1 1 0 0 +EDGE2 4520 4319 0.954084 0.00724706 -3.11863 1 0 1 1 0 0 +EDGE2 4520 3860 0.0166587 -0.0034074 0.0289598 1 0 1 1 0 0 +EDGE2 4520 3880 0.0226022 -0.0381126 0.00976404 1 0 1 1 0 0 +EDGE2 4520 4299 1.05856 0.0171816 -3.12769 1 0 1 1 0 0 +EDGE2 4520 4179 1.01381 -0.0821578 -3.1173 1 0 1 1 0 0 +EDGE2 4520 4181 -0.0160391 -1.02379 -1.53536 1 0 1 1 0 0 +EDGE2 4520 4301 -0.0736856 -1.06566 -1.59298 1 0 1 1 0 0 +EDGE2 4520 4221 -0.00368128 -0.960711 -1.59446 1 0 1 1 0 0 +EDGE2 4520 3881 -0.0141416 -0.966168 -1.53912 1 0 1 1 0 0 +EDGE2 4521 3862 1.0043 -0.0598649 -0.000640088 1 0 1 1 0 0 +EDGE2 4521 3861 0.0229248 -0.0386476 0.0310227 1 0 1 1 0 0 +EDGE2 4521 4180 -0.97683 0.0223704 1.51798 1 0 1 1 0 0 +EDGE2 4521 4300 -1.07763 0.0123242 1.54488 1 0 1 1 0 0 +EDGE2 4521 4320 -0.962571 -0.0217623 1.53923 1 0 1 1 0 0 +EDGE2 4521 4520 -0.98547 0.0277671 -1.61579 1 0 1 1 0 0 +EDGE2 4521 4220 -0.988033 -0.00203912 1.54832 1 0 1 1 0 0 +EDGE2 4521 3860 -1.13078 0.0181637 -1.56458 1 0 1 1 0 0 +EDGE2 4521 3880 -0.988384 -0.00430245 -1.57589 1 0 1 1 0 0 +EDGE2 4522 3863 0.959304 0.0139938 -0.00457456 1 0 1 1 0 0 +EDGE2 4522 4521 -1.01386 -0.115736 0.0114789 1 0 1 1 0 0 +EDGE2 4522 3862 0.00571693 -0.0177512 0.0325883 1 0 1 1 0 0 +EDGE2 4522 3861 -1.02949 -0.0413261 0.0165159 1 0 1 1 0 0 +EDGE2 4523 3863 0.022601 -0.0706263 -0.0247066 1 0 1 1 0 0 +EDGE2 4523 3864 0.94358 0.0326869 0.0228769 1 0 1 1 0 0 +EDGE2 4523 3862 -1.00907 0.00521479 0.00491378 1 0 1 1 0 0 +EDGE2 4523 4522 -1.05286 0.0251353 0.0124995 1 0 1 1 0 0 +EDGE2 4524 3865 0.981221 0.0348806 -0.00142713 1 0 1 1 0 0 +EDGE2 4524 3863 -0.971597 -0.000197048 -0.00953381 1 0 1 1 0 0 +EDGE2 4524 3864 -0.0984039 -0.0677625 -0.0318517 1 0 1 1 0 0 +EDGE2 4524 4523 -0.994494 0.0372464 0.0223467 1 0 1 1 0 0 +EDGE2 4525 3865 -0.0296179 0.0521619 0.0123721 1 0 1 1 0 0 +EDGE2 4525 3866 -0.0450109 1.03336 1.55363 1 0 1 1 0 0 +EDGE2 4525 3864 -0.992896 0.00981158 -0.00992 1 0 1 1 0 0 +EDGE2 4525 4524 -0.979678 -0.00408457 -0.0344771 1 0 1 1 0 0 +EDGE2 4526 3865 -0.989572 -0.00391786 -1.57924 1 0 1 1 0 0 +EDGE2 4526 3866 0.0350066 0.042087 -0.010819 1 0 1 1 0 0 +EDGE2 4526 3867 1.08398 -0.0455422 0.00547476 1 0 1 1 0 0 +EDGE2 4526 4525 -1.01481 0.080664 -1.55246 1 0 1 1 0 0 +EDGE2 4527 3868 1.01685 0.0191388 0.0211764 1 0 1 1 0 0 +EDGE2 4527 3866 -1.02735 0.0555207 -0.000999488 1 0 1 1 0 0 +EDGE2 4527 4526 -0.945571 0.0840335 -0.0210433 1 0 1 1 0 0 +EDGE2 4527 3867 -0.0885409 -0.0264348 -0.0133454 1 0 1 1 0 0 +EDGE2 4528 4527 -1.01542 -0.0872607 -0.0604694 1 0 1 1 0 0 +EDGE2 4528 3869 1.12941 0.0476329 -0.0116987 1 0 1 1 0 0 +EDGE2 4528 3868 -0.112608 -0.0365631 0.00863981 1 0 1 1 0 0 +EDGE2 4528 3867 -1.02049 -0.0194962 -0.00023731 1 0 1 1 0 0 +EDGE2 4529 3870 1.0815 0.0728256 0.0168181 1 0 1 1 0 0 +EDGE2 4529 4528 -0.953561 -0.0312796 -0.00500999 1 0 1 1 0 0 +EDGE2 4529 3869 0.00416691 -0.00891719 0.0224975 1 0 1 1 0 0 +EDGE2 4529 3868 -1.00299 0.0256989 -0.00860337 1 0 1 1 0 0 +EDGE2 4530 3870 0.0740579 -0.0528938 0.000160429 1 0 1 1 0 0 +EDGE2 4530 3869 -0.94316 -0.00153914 0.0271702 1 0 1 1 0 0 +EDGE2 4530 4529 -0.978614 0.0985481 -0.0496017 1 0 1 1 0 0 +EDGE2 4530 3871 -0.0411333 1.00456 1.59626 1 0 1 1 0 0 +EDGE2 4531 4530 -0.951679 6.04855e-05 -1.56027 1 0 1 1 0 0 +EDGE2 4531 3870 -1.02556 -0.0308721 -1.57012 1 0 1 1 0 0 +EDGE2 4531 3871 -0.0433184 -0.0271651 0.0132402 1 0 1 1 0 0 +EDGE2 4531 3872 0.944611 0.060467 0.00238492 1 0 1 1 0 0 +EDGE2 4532 3871 -0.934097 -0.00228215 0.000713518 1 0 1 1 0 0 +EDGE2 4532 4531 -1.02515 -0.0310174 -0.0102035 1 0 1 1 0 0 +EDGE2 4532 3872 0.133711 0.00458418 0.00545918 1 0 1 1 0 0 +EDGE2 4532 3873 1.03832 0.014375 0.00737804 1 0 1 1 0 0 +EDGE2 4533 4532 -1.01029 0.0490972 -0.0107528 1 0 1 1 0 0 +EDGE2 4533 3872 -0.969792 -0.00557545 -0.0182752 1 0 1 1 0 0 +EDGE2 4533 3874 0.934448 0.0249063 -0.0158918 1 0 1 1 0 0 +EDGE2 4533 3873 -0.0180461 0.0115917 0.035201 1 0 1 1 0 0 +EDGE2 4534 4533 -1.0836 0.00788928 -0.0023756 1 0 1 1 0 0 +EDGE2 4534 4515 1.0372 -0.0365334 -3.16156 1 0 1 1 0 0 +EDGE2 4534 3874 -0.012897 -0.0064842 0.0226615 1 0 1 1 0 0 +EDGE2 4534 3873 -0.911054 -0.0324227 -0.00895422 1 0 1 1 0 0 +EDGE2 4534 3855 0.929074 -0.0781481 -3.13927 1 0 1 1 0 0 +EDGE2 4534 3875 0.960531 0.00488299 -0.0291555 1 0 1 1 0 0 +EDGE2 4535 3856 -0.0228955 1.04803 1.53472 1 0 1 1 0 0 +EDGE2 4535 4515 -0.0393998 -0.0500833 -3.1357 1 0 1 1 0 0 +EDGE2 4535 3874 -0.945723 0.0742164 -0.028001 1 0 1 1 0 0 +EDGE2 4535 4534 -0.970158 -0.0451955 -0.0168229 1 0 1 1 0 0 +EDGE2 4535 4516 -0.0271095 0.937045 1.57705 1 0 1 1 0 0 +EDGE2 4535 3855 0.0220369 0.0518435 -3.13115 1 0 1 1 0 0 +EDGE2 4535 3875 -0.0898472 0.0190828 0.0026015 1 0 1 1 0 0 +EDGE2 4535 3876 0.0479049 1.05658 1.57142 1 0 1 1 0 0 +EDGE2 4535 3854 1.03801 0.0140617 -3.14383 1 0 1 1 0 0 +EDGE2 4535 4514 0.949327 -0.0561606 -3.15145 1 0 1 1 0 0 +EDGE2 4536 4515 -0.954974 0.0838145 -1.60002 1 0 1 1 0 0 +EDGE2 4536 4535 -1.04001 0.0176572 1.55329 1 0 1 1 0 0 +EDGE2 4536 3855 -0.998485 -0.012634 -1.54714 1 0 1 1 0 0 +EDGE2 4536 3875 -0.993938 0.00618478 1.58546 1 0 1 1 0 0 +EDGE2 4537 4536 -1.02688 -0.00289215 0.0188626 1 0 1 1 0 0 +EDGE2 4538 4537 -1.02488 -0.0301482 -0.0316326 1 0 1 1 0 0 +EDGE2 4539 3840 1.0613 0.0441773 -3.16748 1 0 1 1 0 0 +EDGE2 4539 3800 0.924407 0.0213959 -3.14121 1 0 1 1 0 0 +EDGE2 4539 4538 -0.879743 0.00825506 0.0220115 1 0 1 1 0 0 +EDGE2 4540 3839 1.04077 -0.0106115 -3.16167 1 0 1 1 0 0 +EDGE2 4540 3799 1.04502 0.0533791 -3.13907 1 0 1 1 0 0 +EDGE2 4540 3841 0.0868507 0.985678 1.56979 1 0 1 1 0 0 +EDGE2 4540 3840 -0.0765407 -0.0567569 -3.15131 1 0 1 1 0 0 +EDGE2 4540 3801 -0.00231504 -1.01226 -1.61918 1 0 1 1 0 0 +EDGE2 4540 3800 0.03947 0.0694479 -3.11624 1 0 1 1 0 0 +EDGE2 4540 4539 -0.95312 0.0237256 0.033298 1 0 1 1 0 0 +EDGE2 4541 3802 0.929573 -0.0146104 0.0195266 1 0 1 1 0 0 +EDGE2 4541 3840 -1.04503 -0.0272376 -1.59934 1 0 1 1 0 0 +EDGE2 4541 4540 -0.995095 0.00527224 1.53991 1 0 1 1 0 0 +EDGE2 4541 3801 0.0515757 0.0518786 0.00869223 1 0 1 1 0 0 +EDGE2 4541 3800 -1.10503 0.0382446 -1.59511 1 0 1 1 0 0 +EDGE2 4542 4541 -1.02321 -0.03007 -0.0168869 1 0 1 1 0 0 +EDGE2 4542 3802 0.0384768 -0.0419542 0.00357499 1 0 1 1 0 0 +EDGE2 4542 3803 1.08003 -0.0163108 -0.0499153 1 0 1 1 0 0 +EDGE2 4542 3801 -0.988444 0.0558025 0.0195234 1 0 1 1 0 0 +EDGE2 4543 3802 -0.946955 0.040307 0.00385342 1 0 1 1 0 0 +EDGE2 4543 3803 0.0233459 -0.0158541 0.00669738 1 0 1 1 0 0 +EDGE2 4543 3804 0.999307 -0.0607578 0.00678761 1 0 1 1 0 0 +EDGE2 4543 4542 -1.05253 0.0723072 -0.00699823 1 0 1 1 0 0 +EDGE2 4544 3805 0.947579 -0.100007 -0.0132613 1 0 1 1 0 0 +EDGE2 4544 3803 -1.01124 0.0287328 -0.00211321 1 0 1 1 0 0 +EDGE2 4544 4543 -0.991429 0.0246258 0.0200586 1 0 1 1 0 0 +EDGE2 4544 3804 -0.0172275 0.00730451 0.0194797 1 0 1 1 0 0 +EDGE2 4545 3805 -0.0253864 -0.0306552 0.00176055 1 0 1 1 0 0 +EDGE2 4545 3806 -0.0645627 1.07448 1.54633 1 0 1 1 0 0 +EDGE2 4545 4544 -0.968636 0.0683331 0.0415643 1 0 1 1 0 0 +EDGE2 4545 3804 -1.00587 -0.00130022 -0.00685156 1 0 1 1 0 0 +EDGE2 4546 3805 -0.92935 0.0338232 1.5527 1 0 1 1 0 0 +EDGE2 4546 4545 -0.983647 -0.0163107 1.55685 1 0 1 1 0 0 +EDGE2 4547 4546 -1.12801 -0.0493044 0.00896195 1 0 1 1 0 0 +EDGE2 4548 4547 -0.955905 0.00248035 -0.00720607 1 0 1 1 0 0 +EDGE2 4549 4548 -0.991603 -0.00671338 -0.0037873 1 0 1 1 0 0 +EDGE2 4549 4530 0.949163 -0.101707 -3.10339 1 0 1 1 0 0 +EDGE2 4549 3870 1.09858 -0.0376432 -3.15812 1 0 1 1 0 0 +EDGE2 4550 4549 -1.04188 -0.071261 0.0029021 1 0 1 1 0 0 +EDGE2 4550 4530 0.0302955 -0.0210746 -3.12831 1 0 1 1 0 0 +EDGE2 4550 3870 -0.00620473 0.0257074 -3.12358 1 0 1 1 0 0 +EDGE2 4550 3869 1.01705 0.0181814 -3.16127 1 0 1 1 0 0 +EDGE2 4550 4529 1.02444 0.0443606 -3.13128 1 0 1 1 0 0 +EDGE2 4550 3871 -0.0136497 -0.984589 -1.57299 1 0 1 1 0 0 +EDGE2 4550 4531 0.0345908 -0.984889 -1.55915 1 0 1 1 0 0 +EDGE2 4551 4530 -1.01912 -0.032376 1.56631 1 0 1 1 0 0 +EDGE2 4551 4550 -0.96635 0.026555 -1.54197 1 0 1 1 0 0 +EDGE2 4551 3870 -0.856412 0.029949 1.57862 1 0 1 1 0 0 +EDGE2 4552 4551 -0.990568 -0.00865781 0.0210247 1 0 1 1 0 0 +EDGE2 4553 4552 -1.07222 -0.0149812 0.0185241 1 0 1 1 0 0 +EDGE2 4554 4553 -0.947973 0.152086 -0.0256907 1 0 1 1 0 0 +EDGE2 4555 4554 -0.965294 -0.0990851 -0.00039397 1 0 1 1 0 0 +EDGE2 4556 4555 -0.94078 0.0631333 -1.57754 1 0 1 1 0 0 +EDGE2 4557 4556 -1.06275 -0.069187 0.00500819 1 0 1 1 0 0 +EDGE2 4558 4557 -0.956209 0.00879774 0.021716 1 0 1 1 0 0 +EDGE2 4559 4558 -1.01185 -0.00243015 0.0196383 1 0 1 1 0 0 +EDGE2 4560 4559 -0.998524 0.052508 -0.00520449 1 0 1 1 0 0 +EDGE2 4561 4560 -0.977391 0.0190176 1.57043 1 0 1 1 0 0 +EDGE2 4562 4561 -0.909385 -0.0173873 0.00125885 1 0 1 1 0 0 +EDGE2 4563 4562 -0.963394 -0.0644114 -0.0049213 1 0 1 1 0 0 +EDGE2 4564 3625 1.04698 0.0237094 -3.10953 1 0 1 1 0 0 +EDGE2 4564 4563 -1.0181 0.00218308 -0.00239068 1 0 1 1 0 0 +EDGE2 4565 3626 0.0215216 0.960938 1.60768 1 0 1 1 0 0 +EDGE2 4565 3624 1.09745 0.030973 -3.12401 1 0 1 1 0 0 +EDGE2 4565 3625 -0.0520146 -0.0412513 -3.10779 1 0 1 1 0 0 +EDGE2 4565 4564 -0.990491 0.0478058 0.0301877 1 0 1 1 0 0 +EDGE2 4566 3627 0.97236 -0.00173897 0.00155241 1 0 1 1 0 0 +EDGE2 4566 3626 0.000176343 0.00838227 -0.0213978 1 0 1 1 0 0 +EDGE2 4566 4565 -0.97515 -0.042877 -1.56911 1 0 1 1 0 0 +EDGE2 4566 3625 -0.976279 -0.010015 1.56176 1 0 1 1 0 0 +EDGE2 4567 3628 0.9815 -0.0282074 0.013941 1 0 1 1 0 0 +EDGE2 4567 4566 -0.995007 -0.048027 -0.0186493 1 0 1 1 0 0 +EDGE2 4567 3627 0.0450503 0.0047146 -0.00890789 1 0 1 1 0 0 +EDGE2 4567 3626 -1.03402 0.00447603 -0.0132957 1 0 1 1 0 0 +EDGE2 4568 3629 1.04705 -0.024711 -0.00916663 1 0 1 1 0 0 +EDGE2 4568 4567 -0.893187 -0.0368618 -0.00978632 1 0 1 1 0 0 +EDGE2 4568 3628 -0.00716776 0.0522218 -0.0337286 1 0 1 1 0 0 +EDGE2 4568 3627 -0.982527 -0.0274804 -0.00298211 1 0 1 1 0 0 +EDGE2 4569 3610 1.00902 -0.0198763 -3.16431 1 0 1 1 0 0 +EDGE2 4569 3630 1.03494 -0.0619617 -0.00484186 1 0 1 1 0 0 +EDGE2 4569 3629 0.0239713 -0.0486734 0.00966934 1 0 1 1 0 0 +EDGE2 4569 3628 -1.00005 -0.0494489 -0.026948 1 0 1 1 0 0 +EDGE2 4569 4568 -1.01637 0.109051 0.00930957 1 0 1 1 0 0 +EDGE2 4570 3609 0.982463 -0.0268964 -3.15138 1 0 1 1 0 0 +EDGE2 4570 3611 -0.0582537 -1.03102 -1.58258 1 0 1 1 0 0 +EDGE2 4570 3610 0.0430492 -0.0407992 -3.15733 1 0 1 1 0 0 +EDGE2 4570 3630 -0.0560784 0.0124317 -0.0084099 1 0 1 1 0 0 +EDGE2 4570 3631 0.00629211 0.999075 1.58214 1 0 1 1 0 0 +EDGE2 4570 3629 -0.98226 -0.0838469 0.0215598 1 0 1 1 0 0 +EDGE2 4570 4569 -0.96973 0.0260377 -0.0273677 1 0 1 1 0 0 +EDGE2 4571 3612 0.955388 0.0121013 -0.00726349 1 0 1 1 0 0 +EDGE2 4571 3611 0.0446313 -0.0614637 0.0157371 1 0 1 1 0 0 +EDGE2 4571 4570 -0.907052 -0.00213201 1.59892 1 0 1 1 0 0 +EDGE2 4571 3610 -0.986595 0.0292576 -1.56157 1 0 1 1 0 0 +EDGE2 4571 3630 -1.01095 0.0459409 1.54959 1 0 1 1 0 0 +EDGE2 4572 3613 0.982276 -0.053848 -0.0233016 1 0 1 1 0 0 +EDGE2 4572 3612 0.0828235 0.0411544 -0.000695312 1 0 1 1 0 0 +EDGE2 4572 4571 -1.0374 -0.0392446 0.0204283 1 0 1 1 0 0 +EDGE2 4572 3611 -1.04686 0.0695989 -0.0462039 1 0 1 1 0 0 +EDGE2 4573 3614 1.04175 -0.0576768 0.0609715 1 0 1 1 0 0 +EDGE2 4573 3613 -0.020148 -0.00310551 0.00428395 1 0 1 1 0 0 +EDGE2 4573 3612 -1.04815 -0.0606427 0.00335645 1 0 1 1 0 0 +EDGE2 4573 4572 -0.94546 0.0657256 -0.0229182 1 0 1 1 0 0 +EDGE2 4574 3615 0.937241 -0.0718091 0.0236519 1 0 1 1 0 0 +EDGE2 4574 3614 -0.0512511 -0.0209992 -0.0449976 1 0 1 1 0 0 +EDGE2 4574 3613 -1.00353 -0.0319979 -0.0109501 1 0 1 1 0 0 +EDGE2 4574 4573 -0.986521 0.000507196 0.0373365 1 0 1 1 0 0 +EDGE2 4575 3615 0.0271137 -0.0237596 0.0298596 1 0 1 1 0 0 +EDGE2 4575 3616 -0.0549858 -0.989697 -1.61088 1 0 1 1 0 0 +EDGE2 4575 4574 -1.01253 0.0232176 -0.0096184 1 0 1 1 0 0 +EDGE2 4575 3614 -0.99599 -0.0177809 -0.0161528 1 0 1 1 0 0 +EDGE2 4576 4575 -1.06503 0.0225511 -1.59122 1 0 1 1 0 0 +EDGE2 4576 3615 -0.987147 0.012961 -1.60336 1 0 1 1 0 0 +EDGE2 4577 4576 -0.965799 0.00216616 -0.0282829 1 0 1 1 0 0 +EDGE2 4578 4577 -1.08589 0.0267986 0.0249741 1 0 1 1 0 0 +EDGE2 4579 4578 -1.02147 0.0313111 0.0129 1 0 1 1 0 0 +EDGE2 4580 4579 -0.968607 0.0185138 0.00306273 1 0 1 1 0 0 +EDGE2 4581 4580 -1.11934 0.0337302 -1.57425 1 0 1 1 0 0 +EDGE2 4582 4581 -1.02895 0.0277117 0.0269115 1 0 1 1 0 0 +EDGE2 4583 4582 -0.984995 -0.062209 0.0259095 1 0 1 1 0 0 +EDGE2 4584 4583 -0.999363 0.0964964 -0.000489392 1 0 1 1 0 0 +EDGE2 4584 3605 1.06092 0.0445367 -3.17313 1 0 1 1 0 0 +EDGE2 4585 4584 -0.973669 0.0278611 -0.0441649 1 0 1 1 0 0 +EDGE2 4585 3605 -0.0589003 0.0811465 -3.13891 1 0 1 1 0 0 +EDGE2 4585 3606 0.0193038 1.10716 1.547 1 0 1 1 0 0 +EDGE2 4585 3604 0.981091 0.0121186 -3.12629 1 0 1 1 0 0 +EDGE2 4586 3605 -1.00881 -0.0316228 -1.57046 1 0 1 1 0 0 +EDGE2 4586 4585 -0.954929 0.109118 1.57423 1 0 1 1 0 0 +EDGE2 4587 4586 -1.12819 -0.0278642 -0.00358509 1 0 1 1 0 0 +EDGE2 4588 4587 -1.04412 0.0451689 0.00598228 1 0 1 1 0 0 +EDGE2 4589 4588 -0.949222 -0.0416876 0.0012467 1 0 1 1 0 0 +EDGE2 4590 4589 -0.938879 0.0494339 0.013277 1 0 1 1 0 0 +EDGE2 4591 4590 -1.00627 -0.00532441 -1.54458 1 0 1 1 0 0 +EDGE2 4592 4591 -0.973823 -0.0953911 -0.00095592 1 0 1 1 0 0 +EDGE2 4593 4592 -1.05293 0.0279791 -0.0203729 1 0 1 1 0 0 +EDGE2 4594 4593 -0.941494 -0.0152793 -0.0024323 1 0 1 1 0 0 +EDGE2 4594 2915 1.065 0.0293881 -3.15875 1 0 1 1 0 0 +EDGE2 4594 3595 0.952298 -0.0384419 -3.16034 1 0 1 1 0 0 +EDGE2 4594 3735 0.961311 -0.0577869 -3.16197 1 0 1 1 0 0 +EDGE2 4594 3755 1.00375 -0.0418663 -3.18215 1 0 1 1 0 0 +EDGE2 4594 3575 1.09903 -0.00273974 -3.12041 1 0 1 1 0 0 +EDGE2 4595 4594 -1.07127 0.0175559 0.0321364 1 0 1 1 0 0 +EDGE2 4595 2915 0.097003 0.00876256 -3.14709 1 0 1 1 0 0 +EDGE2 4595 2916 0.048509 -1.06388 -1.57882 1 0 1 1 0 0 +EDGE2 4595 3736 -0.0585153 -1.03063 -1.58639 1 0 1 1 0 0 +EDGE2 4595 3576 0.0521618 -0.921554 -1.55487 1 0 1 1 0 0 +EDGE2 4595 3595 0.07448 -0.0982581 -3.14724 1 0 1 1 0 0 +EDGE2 4595 3735 0.0439568 0.0338477 -3.17286 1 0 1 1 0 0 +EDGE2 4595 3755 0.0266524 0.0150204 -3.14791 1 0 1 1 0 0 +EDGE2 4595 3575 -0.000155718 0.0283326 -3.13272 1 0 1 1 0 0 +EDGE2 4595 2914 1.03644 -0.0415776 -3.1453 1 0 1 1 0 0 +EDGE2 4595 3594 0.949977 0.019186 -3.15803 1 0 1 1 0 0 +EDGE2 4595 3734 0.971431 0.0311376 -3.15298 1 0 1 1 0 0 +EDGE2 4595 3754 1.01827 0.0393724 -3.1364 1 0 1 1 0 0 +EDGE2 4595 3574 0.966921 -0.00721828 -3.14554 1 0 1 1 0 0 +EDGE2 4595 3596 -0.0155634 0.991674 1.56654 1 0 1 1 0 0 +EDGE2 4595 3756 -0.0470047 0.996408 1.57286 1 0 1 1 0 0 +EDGE2 4596 3577 0.99531 0.0703663 -0.0101752 1 0 1 1 0 0 +EDGE2 4596 3737 1.0827 -0.0460035 -0.0191882 1 0 1 1 0 0 +EDGE2 4596 2915 -0.997732 0.0015866 -1.60139 1 0 1 1 0 0 +EDGE2 4596 2916 0.00643238 0.0691486 -0.00965009 1 0 1 1 0 0 +EDGE2 4596 3736 -0.00608819 -0.0157491 0.005604 1 0 1 1 0 0 +EDGE2 4596 2917 1.00787 0.0227878 0.0175745 1 0 1 1 0 0 +EDGE2 4596 3576 0.0393458 0.0152618 0.0226348 1 0 1 1 0 0 +EDGE2 4596 4595 -1.06181 0.0697018 1.55221 1 0 1 1 0 0 +EDGE2 4596 3595 -1.09309 0.00168727 -1.59068 1 0 1 1 0 0 +EDGE2 4596 3735 -0.970346 -0.0178482 -1.5865 1 0 1 1 0 0 +EDGE2 4596 3755 -1.00923 -0.00681506 -1.56755 1 0 1 1 0 0 +EDGE2 4596 3575 -1.0013 -0.0193885 -1.56859 1 0 1 1 0 0 +EDGE2 4597 3577 -0.102147 0.0525296 0.0296488 1 0 1 1 0 0 +EDGE2 4597 3578 0.983127 -0.0436838 0.0193075 1 0 1 1 0 0 +EDGE2 4597 3738 1.01849 -0.0586257 0.00325661 1 0 1 1 0 0 +EDGE2 4597 2918 0.956561 -0.0107126 -0.0328648 1 0 1 1 0 0 +EDGE2 4597 3737 0.0135764 0.0516023 -0.0385763 1 0 1 1 0 0 +EDGE2 4597 2916 -0.969493 -0.0373676 0.0217466 1 0 1 1 0 0 +EDGE2 4597 3736 -1.0248 -0.0724007 -0.0118018 1 0 1 1 0 0 +EDGE2 4597 4596 -0.929042 -0.0442484 -0.0094419 1 0 1 1 0 0 +EDGE2 4597 2917 -0.0138373 0.0902755 0.0140221 1 0 1 1 0 0 +EDGE2 4597 3576 -1.02088 0.0382713 0.0155171 1 0 1 1 0 0 +EDGE2 4598 2919 1.00632 -0.00795554 0.0108177 1 0 1 1 0 0 +EDGE2 4598 3739 1.03731 0.0533101 -0.0054571 1 0 1 1 0 0 +EDGE2 4598 3579 0.959468 -0.0496564 -0.0166207 1 0 1 1 0 0 +EDGE2 4598 3577 -1.04938 -0.00848326 0.0208013 1 0 1 1 0 0 +EDGE2 4598 4597 -1.09147 -0.0333343 -0.00396142 1 0 1 1 0 0 +EDGE2 4598 3578 0.01773 -0.0617322 -0.0406182 1 0 1 1 0 0 +EDGE2 4598 3738 0.0152919 -0.0584197 0.0126732 1 0 1 1 0 0 +EDGE2 4598 2918 0.00855118 -0.137372 -0.0354609 1 0 1 1 0 0 +EDGE2 4598 3737 -1.0714 -0.00437968 -0.0162513 1 0 1 1 0 0 +EDGE2 4598 2917 -1.16513 -0.052126 0.0326529 1 0 1 1 0 0 +EDGE2 4599 2919 0.0209872 -0.048607 0.0209095 1 0 1 1 0 0 +EDGE2 4599 3740 1.11401 0.0624634 -0.0232589 1 0 1 1 0 0 +EDGE2 4599 2920 0.989944 -0.0163946 -0.00681462 1 0 1 1 0 0 +EDGE2 4599 3580 0.999958 0.0316101 0.0271838 1 0 1 1 0 0 +EDGE2 4599 3739 -0.0937929 0.159133 -0.00524055 1 0 1 1 0 0 +EDGE2 4599 3579 0.0250041 0.0243196 0.00282488 1 0 1 1 0 0 +EDGE2 4599 3578 -0.962671 0.0971876 0.00655261 1 0 1 1 0 0 +EDGE2 4599 3738 -1.02759 -0.00299347 -0.000371479 1 0 1 1 0 0 +EDGE2 4599 4598 -0.95984 -0.0842404 -0.0120652 1 0 1 1 0 0 +EDGE2 4599 2918 -1.03534 0.0513255 0.019667 1 0 1 1 0 0 +EDGE2 4600 2919 -0.984544 -0.0340488 -0.00233993 1 0 1 1 0 0 +EDGE2 4600 3740 -0.00652863 0.0281229 0.0222509 1 0 1 1 0 0 +EDGE2 4600 2921 -0.00768866 0.981777 1.57203 1 0 1 1 0 0 +EDGE2 4600 3741 0.0774983 1.00002 1.57731 1 0 1 1 0 0 +EDGE2 4600 2920 0.0638067 0.0784366 0.0238994 1 0 1 1 0 0 +EDGE2 4600 3580 -0.0135516 -0.0115691 0.00543969 1 0 1 1 0 0 +EDGE2 4600 3581 0.000812687 0.994325 1.58968 1 0 1 1 0 0 +EDGE2 4600 3739 -0.960432 0.0357742 -5.09759e-05 1 0 1 1 0 0 +EDGE2 4600 4599 -1.04758 0.137608 -0.00435261 1 0 1 1 0 0 +EDGE2 4600 3579 -0.877037 -0.000914275 -0.00017791 1 0 1 1 0 0 +EDGE2 4601 3740 -0.998763 -0.0509139 1.54284 1 0 1 1 0 0 +EDGE2 4601 4600 -0.98968 -0.0564743 1.56535 1 0 1 1 0 0 +EDGE2 4601 2920 -0.986285 -0.0312492 1.55401 1 0 1 1 0 0 +EDGE2 4601 3580 -0.980544 0.0430701 1.57494 1 0 1 1 0 0 +EDGE2 4602 4601 -0.998549 -0.0611343 -0.0334948 1 0 1 1 0 0 +EDGE2 4603 4602 -1.04439 -0.0607762 -0.0130735 1 0 1 1 0 0 +EDGE2 4604 4603 -0.952911 -0.00124274 0.0427627 1 0 1 1 0 0 +EDGE2 4605 4604 -1.05884 0.0199406 0.0348953 1 0 1 1 0 0 +EDGE2 4606 4605 -1.00747 0.0643916 -1.54163 1 0 1 1 0 0 +EDGE2 4607 4606 -0.985196 -0.0353032 0.0200653 1 0 1 1 0 0 +EDGE2 4608 4607 -1.00347 -0.0307025 0.0133392 1 0 1 1 0 0 +EDGE2 4609 2810 0.940628 -0.056039 -3.14857 1 0 1 1 0 0 +EDGE2 4609 2790 1.00853 0.0769727 -3.15629 1 0 1 1 0 0 +EDGE2 4609 4608 -0.941608 -0.0333894 0.0202213 1 0 1 1 0 0 +EDGE2 4610 2811 -0.00149964 -1.02704 -1.56498 1 0 1 1 0 0 +EDGE2 4610 2791 0.0217142 -0.928678 -1.57374 1 0 1 1 0 0 +EDGE2 4610 2789 1.02237 -0.0739621 -3.14203 1 0 1 1 0 0 +EDGE2 4610 2809 1.01459 -0.0802387 -3.15407 1 0 1 1 0 0 +EDGE2 4610 2810 0.0278609 0.032812 -3.15705 1 0 1 1 0 0 +EDGE2 4610 2790 -0.0841587 0.021299 -3.12509 1 0 1 1 0 0 +EDGE2 4610 4609 -1.00631 -0.0248023 -0.0352965 1 0 1 1 0 0 +EDGE2 4611 2810 -0.974936 -0.0464727 1.57475 1 0 1 1 0 0 +EDGE2 4611 4610 -0.995781 0.0875055 -1.62438 1 0 1 1 0 0 +EDGE2 4611 2790 -0.989424 -0.0274848 1.57845 1 0 1 1 0 0 +EDGE2 4612 4611 -1.0921 -0.123076 0.0311255 1 0 1 1 0 0 +EDGE2 4613 4612 -0.971249 0.000919598 0.0129252 1 0 1 1 0 0 +EDGE2 4614 4613 -1.02839 -0.0281442 -0.0494433 1 0 1 1 0 0 +EDGE2 4614 2875 0.945204 0.0248815 -3.17697 1 0 1 1 0 0 +EDGE2 4614 2955 1.09728 -0.0465563 -3.18274 1 0 1 1 0 0 +EDGE2 4614 2755 1.00024 -0.0254174 -3.15287 1 0 1 1 0 0 +EDGE2 4615 4614 -1.04974 0.0047512 -0.00254155 1 0 1 1 0 0 +EDGE2 4615 2875 0.0620849 0.0627512 -3.16183 1 0 1 1 0 0 +EDGE2 4615 2956 -0.0647001 -0.953913 -1.56806 1 0 1 1 0 0 +EDGE2 4615 2876 0.0222355 -1.0426 -1.56509 1 0 1 1 0 0 +EDGE2 4615 2756 -0.0190447 -1.02724 -1.58864 1 0 1 1 0 0 +EDGE2 4615 2955 0.0632675 0.00559481 -3.13214 1 0 1 1 0 0 +EDGE2 4615 2754 0.927946 0.0229551 -3.17234 1 0 1 1 0 0 +EDGE2 4615 2874 1.02601 -0.0832931 -3.15342 1 0 1 1 0 0 +EDGE2 4615 2954 1.12209 0.0319836 -3.12439 1 0 1 1 0 0 +EDGE2 4615 2755 0.0639201 0.0519601 -3.158 1 0 1 1 0 0 +EDGE2 4616 2875 -1.03041 0.0142208 1.55618 1 0 1 1 0 0 +EDGE2 4616 4615 -1.01721 0.0148282 -1.58249 1 0 1 1 0 0 +EDGE2 4616 2955 -1.03334 0.0495169 1.57545 1 0 1 1 0 0 +EDGE2 4616 2755 -0.998812 0.00733271 1.56121 1 0 1 1 0 0 +EDGE2 4617 4616 -1.03018 0.0298531 0.0045551 1 0 1 1 0 0 +EDGE2 4618 4617 -1.03791 -0.0928787 -0.0338413 1 0 1 1 0 0 +EDGE2 4619 3740 0.987045 0.0161445 -3.14068 1 0 1 1 0 0 +EDGE2 4619 4618 -1.01205 -0.0555942 -0.00848822 1 0 1 1 0 0 +EDGE2 4619 4600 1.02324 -0.0246485 -3.15329 1 0 1 1 0 0 +EDGE2 4619 2920 0.979001 -0.107793 -3.14772 1 0 1 1 0 0 +EDGE2 4619 3580 1.04178 -0.0497122 -3.12701 1 0 1 1 0 0 +EDGE2 4620 2919 1.0449 0.00521092 -3.13374 1 0 1 1 0 0 +EDGE2 4620 4601 0.0266037 0.988559 1.52878 1 0 1 1 0 0 +EDGE2 4620 3740 0.0411124 0.0510954 -3.16918 1 0 1 1 0 0 +EDGE2 4620 4619 -1.01469 0.106418 -0.0176879 1 0 1 1 0 0 +EDGE2 4620 4600 0.00137232 -0.0858486 -3.16509 1 0 1 1 0 0 +EDGE2 4620 2921 -0.0465907 -0.943782 -1.53787 1 0 1 1 0 0 +EDGE2 4620 3741 -0.0908194 -1.03121 -1.58648 1 0 1 1 0 0 +EDGE2 4620 2920 -0.0666847 -0.0695923 -3.15553 1 0 1 1 0 0 +EDGE2 4620 3580 -0.127157 -0.0600436 -3.1535 1 0 1 1 0 0 +EDGE2 4620 3581 -0.00259734 -0.960068 -1.55579 1 0 1 1 0 0 +EDGE2 4620 3739 1.08137 0.0433054 -3.14625 1 0 1 1 0 0 +EDGE2 4620 4599 1.08903 -0.00367764 -3.15564 1 0 1 1 0 0 +EDGE2 4620 3579 0.975997 0.0974957 -3.13647 1 0 1 1 0 0 +EDGE2 4621 4602 0.948876 -0.0196247 -0.0174904 1 0 1 1 0 0 +EDGE2 4621 4601 -0.0323803 -0.0751556 -0.0160569 1 0 1 1 0 0 +EDGE2 4621 3740 -0.957921 -0.0572483 1.57944 1 0 1 1 0 0 +EDGE2 4621 4620 -1.06869 -0.0470175 -1.55122 1 0 1 1 0 0 +EDGE2 4621 4600 -1.09153 0.0213667 1.55069 1 0 1 1 0 0 +EDGE2 4621 2920 -0.942692 0.0155049 1.5648 1 0 1 1 0 0 +EDGE2 4621 3580 -0.897053 -0.0149915 1.53617 1 0 1 1 0 0 +EDGE2 4622 4603 1.06981 -0.032459 -0.00439482 1 0 1 1 0 0 +EDGE2 4622 4621 -1.08206 -0.00941539 -0.0192251 1 0 1 1 0 0 +EDGE2 4622 4602 -0.0439681 0.00454785 -0.00298123 1 0 1 1 0 0 +EDGE2 4622 4601 -1.1477 0.132813 0.0200874 1 0 1 1 0 0 +EDGE2 4623 4604 1.03358 -0.0323869 0.0217269 1 0 1 1 0 0 +EDGE2 4623 4622 -1.01895 -0.0590984 0.0162231 1 0 1 1 0 0 +EDGE2 4623 4603 -0.053463 0.00972916 0.00380343 1 0 1 1 0 0 +EDGE2 4623 4602 -0.963414 -0.074476 0.0127238 1 0 1 1 0 0 +EDGE2 4624 4604 -0.0361333 -0.0333113 0.0322956 1 0 1 1 0 0 +EDGE2 4624 4605 0.967226 0.0553208 -0.0269241 1 0 1 1 0 0 +EDGE2 4624 4623 -1.05479 -0.000138911 0.0111683 1 0 1 1 0 0 +EDGE2 4624 4603 -1.01052 0.0288737 -0.0213873 1 0 1 1 0 0 +EDGE2 4625 4606 -0.0774281 0.905996 1.58148 1 0 1 1 0 0 +EDGE2 4625 4604 -0.958255 0.00393739 0.0345421 1 0 1 1 0 0 +EDGE2 4625 4624 -0.905264 0.00413038 -0.0192174 1 0 1 1 0 0 +EDGE2 4625 4605 0.066942 0.0360986 -0.0495752 1 0 1 1 0 0 +EDGE2 4626 4625 -0.992888 -0.0873894 1.59443 1 0 1 1 0 0 +EDGE2 4626 4605 -1.03264 0.0159102 1.57803 1 0 1 1 0 0 +EDGE2 4627 4626 -1.07206 0.0966259 -0.0208035 1 0 1 1 0 0 +EDGE2 4628 4627 -1.00215 0.0366684 -0.0515447 1 0 1 1 0 0 +EDGE2 4629 4628 -1.00619 -0.140998 -0.00530196 1 0 1 1 0 0 +EDGE2 4629 4590 1.01647 0.0330123 -3.1444 1 0 1 1 0 0 +EDGE2 4630 4629 -1.00922 -0.0124794 -0.0403856 1 0 1 1 0 0 +EDGE2 4630 4590 -0.0515502 0.0862866 -3.13271 1 0 1 1 0 0 +EDGE2 4630 4591 0.0423279 -1.05247 -1.60216 1 0 1 1 0 0 +EDGE2 4630 4589 1.02605 -0.0366979 -3.1523 1 0 1 1 0 0 +EDGE2 4631 4630 -0.853755 -0.0289504 1.5762 1 0 1 1 0 0 +EDGE2 4631 4590 -1.02345 0.0545865 -1.55168 1 0 1 1 0 0 +EDGE2 4631 4591 0.0348031 -0.00633084 0.00949972 1 0 1 1 0 0 +EDGE2 4631 4592 0.988956 0.0677374 0.0151599 1 0 1 1 0 0 +EDGE2 4632 4591 -0.864975 -0.0573092 -0.0457802 1 0 1 1 0 0 +EDGE2 4632 4631 -0.999883 -0.19122 -0.00513785 1 0 1 1 0 0 +EDGE2 4632 4592 0.0331169 0.0320229 0.0163618 1 0 1 1 0 0 +EDGE2 4632 4593 0.904159 -0.0836991 -0.0151101 1 0 1 1 0 0 +EDGE2 4633 4632 -1.10507 -0.0213475 -0.0172996 1 0 1 1 0 0 +EDGE2 4633 4592 -1.02894 -0.000433795 -0.0170066 1 0 1 1 0 0 +EDGE2 4633 4593 -0.0172948 -0.100772 -0.0319075 1 0 1 1 0 0 +EDGE2 4633 4594 1.0503 -0.0012568 -0.0511584 1 0 1 1 0 0 +EDGE2 4634 4593 -1.07084 -0.120809 -0.0158259 1 0 1 1 0 0 +EDGE2 4634 4633 -1.01966 0.00507806 -0.0100753 1 0 1 1 0 0 +EDGE2 4634 4594 0.0166588 0.0624687 -0.0305284 1 0 1 1 0 0 +EDGE2 4634 2915 1.01003 -0.00457226 -3.15837 1 0 1 1 0 0 +EDGE2 4634 4595 0.963005 -0.0193787 -0.00684997 1 0 1 1 0 0 +EDGE2 4634 3595 1.00605 -0.00018286 -3.15915 1 0 1 1 0 0 +EDGE2 4634 3735 0.986889 0.0855101 -3.15197 1 0 1 1 0 0 +EDGE2 4634 3755 0.975504 -0.012741 -3.13043 1 0 1 1 0 0 +EDGE2 4634 3575 1.03997 -0.0397658 -3.11773 1 0 1 1 0 0 +EDGE2 4635 4634 -1.05168 0.0731559 -0.0160509 1 0 1 1 0 0 +EDGE2 4635 4594 -0.99068 -0.107351 0.0176619 1 0 1 1 0 0 +EDGE2 4635 2915 -0.00180496 -0.025131 -3.14387 1 0 1 1 0 0 +EDGE2 4635 2916 -0.0456109 -1.0353 -1.58151 1 0 1 1 0 0 +EDGE2 4635 3736 0.094391 -0.934348 -1.58859 1 0 1 1 0 0 +EDGE2 4635 4596 -0.0039777 -1.03612 -1.5476 1 0 1 1 0 0 +EDGE2 4635 3576 0.0611692 -0.888092 -1.58212 1 0 1 1 0 0 +EDGE2 4635 4595 -0.0736163 0.019888 -0.000291222 1 0 1 1 0 0 +EDGE2 4635 3595 -0.050691 0.0893489 -3.13679 1 0 1 1 0 0 +EDGE2 4635 3735 -0.0564398 0.0399903 -3.14168 1 0 1 1 0 0 +EDGE2 4635 3755 -0.028803 -0.0157854 -3.11517 1 0 1 1 0 0 +EDGE2 4635 3575 -0.0391741 -0.0629345 -3.18247 1 0 1 1 0 0 +EDGE2 4635 2914 0.96253 -0.00363079 -3.13455 1 0 1 1 0 0 +EDGE2 4635 3594 1.05933 -0.0189018 -3.12801 1 0 1 1 0 0 +EDGE2 4635 3734 1.08981 -0.0562048 -3.147 1 0 1 1 0 0 +EDGE2 4635 3754 1.04144 -0.0315805 -3.1356 1 0 1 1 0 0 +EDGE2 4635 3574 0.943239 -0.0116974 -3.11942 1 0 1 1 0 0 +EDGE2 4635 3596 0.0265904 1.01431 1.55527 1 0 1 1 0 0 +EDGE2 4635 3756 -0.0129047 0.969847 1.59946 1 0 1 1 0 0 +EDGE2 4636 2915 -0.892014 0.023157 1.60247 1 0 1 1 0 0 +EDGE2 4636 4635 -1.02477 0.0378113 -1.57512 1 0 1 1 0 0 +EDGE2 4636 4595 -1.02012 -0.00946378 -1.57731 1 0 1 1 0 0 +EDGE2 4636 3595 -0.978339 0.0183207 1.54843 1 0 1 1 0 0 +EDGE2 4636 3735 -1.02508 -0.0581841 1.53746 1 0 1 1 0 0 +EDGE2 4636 3755 -0.881004 -0.0131397 1.55874 1 0 1 1 0 0 +EDGE2 4636 3575 -1.04928 0.0298049 1.56911 1 0 1 1 0 0 +EDGE2 4636 3597 1.1251 0.00606079 -0.00530884 1 0 1 1 0 0 +EDGE2 4636 3596 -0.0494148 0.0639911 0.0388236 1 0 1 1 0 0 +EDGE2 4636 3756 0.0402185 -0.0212823 0.0210914 1 0 1 1 0 0 +EDGE2 4636 3757 0.971237 0.0202842 0.0123192 1 0 1 1 0 0 +EDGE2 4637 3597 0.0283579 -0.00347692 -0.00332527 1 0 1 1 0 0 +EDGE2 4637 4636 -0.955245 0.0176307 -0.02175 1 0 1 1 0 0 +EDGE2 4637 3596 -1.02155 0.0215814 0.00395313 1 0 1 1 0 0 +EDGE2 4637 3756 -1.04905 -0.0478127 0.0111907 1 0 1 1 0 0 +EDGE2 4637 3757 0.0684657 -0.0382482 -0.040064 1 0 1 1 0 0 +EDGE2 4637 3598 0.973982 -0.033418 0.00191302 1 0 1 1 0 0 +EDGE2 4637 3758 1.0704 -0.0479616 0.0225568 1 0 1 1 0 0 +EDGE2 4638 3597 -1.04077 -0.0309028 0.0168144 1 0 1 1 0 0 +EDGE2 4638 4637 -1.08019 -0.0241597 0.00402716 1 0 1 1 0 0 +EDGE2 4638 3757 -1.0277 0.0169984 -0.00495787 1 0 1 1 0 0 +EDGE2 4638 3598 -0.0101972 0.048606 -0.0181747 1 0 1 1 0 0 +EDGE2 4638 3758 -0.0526637 -0.0489212 0.0117446 1 0 1 1 0 0 +EDGE2 4638 3599 0.958494 0.0243635 0.0163142 1 0 1 1 0 0 +EDGE2 4638 3759 0.980386 0.0201835 -0.00298051 1 0 1 1 0 0 +EDGE2 4639 4638 -1.00298 -0.0379354 0.00229249 1 0 1 1 0 0 +EDGE2 4639 3598 -1.03125 0.0514583 0.0210533 1 0 1 1 0 0 +EDGE2 4639 3758 -0.951037 -0.0581974 0.0268353 1 0 1 1 0 0 +EDGE2 4639 3599 0.0759919 -0.0501964 0.0214301 1 0 1 1 0 0 +EDGE2 4639 3759 0.0530875 -0.0383785 -0.016118 1 0 1 1 0 0 +EDGE2 4639 3680 1.02655 0.0095324 -3.11227 1 0 1 1 0 0 +EDGE2 4639 3820 1.03708 -0.142876 -3.12851 1 0 1 1 0 0 +EDGE2 4639 3760 1.02066 0.101073 -0.00685611 1 0 1 1 0 0 +EDGE2 4639 3600 1.02441 0.070465 -0.00527002 1 0 1 1 0 0 +EDGE2 4639 3640 0.99776 -0.0202114 -3.16028 1 0 1 1 0 0 +EDGE2 4639 3660 1.10293 0.0266259 -3.14238 1 0 1 1 0 0 +EDGE2 4640 4639 -1.05341 0.0295928 -0.0146857 1 0 1 1 0 0 +EDGE2 4640 3599 -1.04013 -0.0292303 0.024213 1 0 1 1 0 0 +EDGE2 4640 3759 -0.958562 -0.0272071 0.0119909 1 0 1 1 0 0 +EDGE2 4640 3680 0.0238875 -0.122546 -3.15019 1 0 1 1 0 0 +EDGE2 4640 3601 0.0188968 1.03065 1.54364 1 0 1 1 0 0 +EDGE2 4640 3820 0.0569684 -0.0199604 -3.11619 1 0 1 1 0 0 +EDGE2 4640 3760 -0.0470466 0.0164076 0.0129563 1 0 1 1 0 0 +EDGE2 4640 3761 -0.10553 -1.04332 -1.57151 1 0 1 1 0 0 +EDGE2 4640 3600 -0.0228513 0.0501364 -0.0238835 1 0 1 1 0 0 +EDGE2 4640 3640 -0.0470982 0.0928817 -3.16265 1 0 1 1 0 0 +EDGE2 4640 3660 -0.0874572 -0.0424772 -3.15468 1 0 1 1 0 0 +EDGE2 4640 3821 0.0689272 -0.993975 -1.56996 1 0 1 1 0 0 +EDGE2 4640 3641 0.0131617 -0.992453 -1.57407 1 0 1 1 0 0 +EDGE2 4640 3661 0.0233159 -1.06513 -1.5707 1 0 1 1 0 0 +EDGE2 4640 3681 0.0358284 -0.959781 -1.57639 1 0 1 1 0 0 +EDGE2 4640 3659 0.943878 0.0120663 -3.15445 1 0 1 1 0 0 +EDGE2 4640 3679 1.07129 0.0637231 -3.15314 1 0 1 1 0 0 +EDGE2 4640 3819 0.98768 -0.0308429 -3.14064 1 0 1 1 0 0 +EDGE2 4640 3639 1.00275 -0.0629238 -3.16203 1 0 1 1 0 0 +EDGE2 4641 3680 -1.03332 -0.0272266 1.60331 1 0 1 1 0 0 +EDGE2 4641 3602 1.08296 -0.0477824 -0.0274666 1 0 1 1 0 0 +EDGE2 4641 3601 -0.0137485 -0.0298588 -0.0184964 1 0 1 1 0 0 +EDGE2 4641 3820 -1.03862 0.0182635 1.5862 1 0 1 1 0 0 +EDGE2 4641 4640 -1.01516 0.0295002 -1.59124 1 0 1 1 0 0 +EDGE2 4641 3760 -1.01053 -0.0802361 -1.57007 1 0 1 1 0 0 +EDGE2 4641 3600 -0.968164 0.119397 -1.54973 1 0 1 1 0 0 +EDGE2 4641 3640 -1.04726 0.0140184 1.52745 1 0 1 1 0 0 +EDGE2 4641 3660 -1.02087 -0.0644414 1.55367 1 0 1 1 0 0 +EDGE2 4642 3603 1.02249 -0.0695818 -0.0102359 1 0 1 1 0 0 +EDGE2 4642 3602 -0.00896492 0.0286978 -0.0366767 1 0 1 1 0 0 +EDGE2 4642 3601 -1.03842 -0.0819973 0.00407241 1 0 1 1 0 0 +EDGE2 4642 4641 -0.955194 -0.024271 0.0112448 1 0 1 1 0 0 +EDGE2 4643 3604 0.97406 -0.0323225 0.00896317 1 0 1 1 0 0 +EDGE2 4643 3603 -0.0275887 0.0790153 0.0100649 1 0 1 1 0 0 +EDGE2 4643 4642 -0.952668 -0.0688123 0.0108433 1 0 1 1 0 0 +EDGE2 4643 3602 -1.05277 0.0365635 0.0046998 1 0 1 1 0 0 +EDGE2 4644 3605 1.01079 -0.0834559 -0.0254063 1 0 1 1 0 0 +EDGE2 4644 4585 1.03254 0.0437359 -3.19817 1 0 1 1 0 0 +EDGE2 4644 3604 -0.0525697 -0.0132394 -0.0460275 1 0 1 1 0 0 +EDGE2 4644 3603 -0.9256 -0.0279589 0.0304069 1 0 1 1 0 0 +EDGE2 4644 4643 -0.937542 0.0467251 0.0114196 1 0 1 1 0 0 +EDGE2 4645 4586 -0.0133798 0.973419 1.57249 1 0 1 1 0 0 +EDGE2 4645 4644 -1.01038 0.0711581 0.0120862 1 0 1 1 0 0 +EDGE2 4645 4584 1.0337 0.0994288 -3.16308 1 0 1 1 0 0 +EDGE2 4645 3605 -0.0171161 -0.0594614 -0.0223662 1 0 1 1 0 0 +EDGE2 4645 4585 -0.0092852 0.0253062 -3.11639 1 0 1 1 0 0 +EDGE2 4645 3606 0.0870258 -1.05262 -1.54992 1 0 1 1 0 0 +EDGE2 4645 3604 -1.04225 -0.0490899 -0.00381886 1 0 1 1 0 0 +EDGE2 4646 4587 1.00542 0.0165513 -0.0193927 1 0 1 1 0 0 +EDGE2 4646 4586 -0.0514693 -0.057136 0.0174059 1 0 1 1 0 0 +EDGE2 4646 3605 -0.947049 0.0064024 -1.54358 1 0 1 1 0 0 +EDGE2 4646 4645 -1.03458 0.0464458 -1.54339 1 0 1 1 0 0 +EDGE2 4646 4585 -0.929156 0.00450371 1.54676 1 0 1 1 0 0 +EDGE2 4647 4588 0.895386 0.0288508 0.0240289 1 0 1 1 0 0 +EDGE2 4647 4587 0.00702515 -0.0559483 0.0217599 1 0 1 1 0 0 +EDGE2 4647 4646 -1.00585 -0.0260321 0.00153094 1 0 1 1 0 0 +EDGE2 4647 4586 -1.02704 -0.00184118 -0.00184252 1 0 1 1 0 0 +EDGE2 4648 4589 1.00055 -0.0397674 0.00595084 1 0 1 1 0 0 +EDGE2 4648 4588 -0.048825 -0.00971149 0.0135036 1 0 1 1 0 0 +EDGE2 4648 4587 -0.996807 0.0985518 0.0185442 1 0 1 1 0 0 +EDGE2 4648 4647 -0.998268 0.0215063 -0.0113133 1 0 1 1 0 0 +EDGE2 4649 4630 0.861848 0.0117845 -3.1552 1 0 1 1 0 0 +EDGE2 4649 4590 0.974462 0.0110762 -0.0352164 1 0 1 1 0 0 +EDGE2 4649 4589 0.059096 -0.0974977 -0.00635022 1 0 1 1 0 0 +EDGE2 4649 4648 -0.930508 0.103284 -0.017358 1 0 1 1 0 0 +EDGE2 4649 4588 -1.08162 0.119474 -0.000216393 1 0 1 1 0 0 +EDGE2 4650 4629 0.975766 0.0456104 -3.12546 1 0 1 1 0 0 +EDGE2 4650 4630 0.101042 -0.0770025 -3.15651 1 0 1 1 0 0 +EDGE2 4650 4590 0.0159151 -0.00972698 0.00227581 1 0 1 1 0 0 +EDGE2 4650 4591 0.0665711 0.980796 1.5709 1 0 1 1 0 0 +EDGE2 4650 4631 0.0180344 0.994099 1.54376 1 0 1 1 0 0 +EDGE2 4650 4649 -0.969354 -0.0448005 -0.00118667 1 0 1 1 0 0 +EDGE2 4650 4589 -1.02478 -0.0211039 -0.0107182 1 0 1 1 0 0 +EDGE2 4651 4630 -0.925125 0.0542608 1.58288 1 0 1 1 0 0 +EDGE2 4651 4650 -1.01556 -0.0182911 -1.56666 1 0 1 1 0 0 +EDGE2 4651 4590 -0.977252 -0.013039 -1.55435 1 0 1 1 0 0 +EDGE2 4651 4632 1.04027 0.106223 0.0258915 1 0 1 1 0 0 +EDGE2 4651 4591 0.00252462 0.00855821 -0.0182467 1 0 1 1 0 0 +EDGE2 4651 4631 -0.0606797 0.0159801 -0.00859501 1 0 1 1 0 0 +EDGE2 4651 4592 1.03457 0.02673 -0.00580511 1 0 1 1 0 0 +EDGE2 4652 4632 0.00284918 0.0869813 0.0174153 1 0 1 1 0 0 +EDGE2 4652 4591 -0.909508 0.0227117 -0.0164718 1 0 1 1 0 0 +EDGE2 4652 4651 -1.10262 -0.0109971 -0.0141927 1 0 1 1 0 0 +EDGE2 4652 4631 -1.01573 -0.0147152 -0.0298967 1 0 1 1 0 0 +EDGE2 4652 4592 0.0978582 0.0943016 -0.0140838 1 0 1 1 0 0 +EDGE2 4652 4593 1.02325 0.00249182 -0.00127072 1 0 1 1 0 0 +EDGE2 4652 4633 1.01692 -0.0278467 0.0290677 1 0 1 1 0 0 +EDGE2 4653 4632 -0.966878 -0.0650185 -0.0168728 1 0 1 1 0 0 +EDGE2 4653 4652 -0.989404 0.0566774 -0.0371269 1 0 1 1 0 0 +EDGE2 4653 4592 -1.0315 -0.0522819 -0.0143923 1 0 1 1 0 0 +EDGE2 4653 4593 0.0906682 0.0075165 0.0106727 1 0 1 1 0 0 +EDGE2 4653 4633 -0.0232926 0.0465292 -0.00271621 1 0 1 1 0 0 +EDGE2 4653 4634 0.987158 0.0102499 0.0105474 1 0 1 1 0 0 +EDGE2 4653 4594 0.95537 -0.0719671 -0.0142134 1 0 1 1 0 0 +EDGE2 4654 4653 -0.972723 -0.0330386 -0.0101203 1 0 1 1 0 0 +EDGE2 4654 4593 -1.04079 -0.110083 -0.0255483 1 0 1 1 0 0 +EDGE2 4654 4633 -0.972992 0.0745088 -0.0227128 1 0 1 1 0 0 +EDGE2 4654 4634 -0.0503712 0.0458507 -0.0236648 1 0 1 1 0 0 +EDGE2 4654 4594 0.0176423 -0.0329798 -0.0353982 1 0 1 1 0 0 +EDGE2 4654 2915 0.958239 -0.0188159 -3.14461 1 0 1 1 0 0 +EDGE2 4654 4635 0.969139 -0.00571692 0.00648049 1 0 1 1 0 0 +EDGE2 4654 4595 0.932496 0.0922612 0.0178625 1 0 1 1 0 0 +EDGE2 4654 3595 1.00927 0.00594632 -3.14452 1 0 1 1 0 0 +EDGE2 4654 3735 1.04517 0.0140083 -3.15705 1 0 1 1 0 0 +EDGE2 4654 3755 0.937749 -0.0459182 -3.15813 1 0 1 1 0 0 +EDGE2 4654 3575 0.981968 0.0933038 -3.15839 1 0 1 1 0 0 +EDGE2 4655 4634 -1.02246 -0.028316 0.0255005 1 0 1 1 0 0 +EDGE2 4655 4654 -0.963119 0.102577 -0.0326628 1 0 1 1 0 0 +EDGE2 4655 4594 -0.991534 0.0117545 -0.033538 1 0 1 1 0 0 +EDGE2 4655 2915 -0.0441432 0.0231123 -3.1412 1 0 1 1 0 0 +EDGE2 4655 4635 0.025893 -0.0261871 -0.022978 1 0 1 1 0 0 +EDGE2 4655 2916 0.0806035 -1.06511 -1.55006 1 0 1 1 0 0 +EDGE2 4655 3736 0.0189004 -1.00648 -1.55056 1 0 1 1 0 0 +EDGE2 4655 4596 0.0680975 -1.01511 -1.57487 1 0 1 1 0 0 +EDGE2 4655 3576 -0.0196517 -0.902668 -1.54797 1 0 1 1 0 0 +EDGE2 4655 4595 -0.0471961 -0.00711248 0.0148477 1 0 1 1 0 0 +EDGE2 4655 3595 0.0948522 -0.0770973 -3.13225 1 0 1 1 0 0 +EDGE2 4655 3735 0.0484879 0.0170679 -3.15769 1 0 1 1 0 0 +EDGE2 4655 3755 -0.0854883 -0.0487742 -3.13985 1 0 1 1 0 0 +EDGE2 4655 3575 -0.00870692 -0.0216036 -3.16573 1 0 1 1 0 0 +EDGE2 4655 2914 0.996646 0.103451 -3.15235 1 0 1 1 0 0 +EDGE2 4655 3594 1.07177 -0.0455806 -3.13254 1 0 1 1 0 0 +EDGE2 4655 3734 0.929752 -0.0420534 -3.12613 1 0 1 1 0 0 +EDGE2 4655 3754 1.02241 0.0225481 -3.13364 1 0 1 1 0 0 +EDGE2 4655 3574 1.01234 -0.0374331 -3.1204 1 0 1 1 0 0 +EDGE2 4655 4636 -0.000695967 1.0492 1.56358 1 0 1 1 0 0 +EDGE2 4655 3596 0.0191099 0.963122 1.54007 1 0 1 1 0 0 +EDGE2 4655 3756 0.0363166 1.02278 1.5612 1 0 1 1 0 0 +EDGE2 4656 2915 -0.962 -0.0260339 1.57583 1 0 1 1 0 0 +EDGE2 4656 4635 -1.16984 -0.00249452 -1.56173 1 0 1 1 0 0 +EDGE2 4656 4655 -1.01236 -0.0114787 -1.55534 1 0 1 1 0 0 +EDGE2 4656 4595 -0.979353 0.0312784 -1.59727 1 0 1 1 0 0 +EDGE2 4656 3595 -1.0116 0.0533783 1.61033 1 0 1 1 0 0 +EDGE2 4656 3735 -1.09771 -0.0252588 1.60096 1 0 1 1 0 0 +EDGE2 4656 3755 -0.994405 -0.0153407 1.56454 1 0 1 1 0 0 +EDGE2 4656 3575 -1.05927 0.00317627 1.55275 1 0 1 1 0 0 +EDGE2 4656 3597 1.02145 0.00204011 -0.00123596 1 0 1 1 0 0 +EDGE2 4656 4636 -0.00768083 -0.0649218 -0.00832926 1 0 1 1 0 0 +EDGE2 4656 3596 -0.0661186 0.0152755 -0.00518506 1 0 1 1 0 0 +EDGE2 4656 3756 0.0140201 0.00616316 0.00200974 1 0 1 1 0 0 +EDGE2 4656 4637 0.958761 0.0388257 0.030338 1 0 1 1 0 0 +EDGE2 4656 3757 0.975156 -0.0311424 -0.00114849 1 0 1 1 0 0 +EDGE2 4657 3597 0.0149071 0.0285886 0.00819193 1 0 1 1 0 0 +EDGE2 4657 4636 -1.01522 0.0508749 -0.0234717 1 0 1 1 0 0 +EDGE2 4657 4656 -1.00734 -0.0671426 -0.0133293 1 0 1 1 0 0 +EDGE2 4657 3596 -0.955662 -0.0383314 0.00565175 1 0 1 1 0 0 +EDGE2 4657 3756 -1.0325 -0.0801456 0.00331254 1 0 1 1 0 0 +EDGE2 4657 4637 -0.0100283 -0.0187721 0.0264415 1 0 1 1 0 0 +EDGE2 4657 3757 0.0026029 0.0529142 0.00518336 1 0 1 1 0 0 +EDGE2 4657 4638 0.97875 -0.0641533 -0.00554536 1 0 1 1 0 0 +EDGE2 4657 3598 0.961012 -0.0257196 0.0127532 1 0 1 1 0 0 +EDGE2 4657 3758 1.00014 -0.0403112 -0.013477 1 0 1 1 0 0 +EDGE2 4658 3597 -1.05208 -0.0517667 -0.0284291 1 0 1 1 0 0 +EDGE2 4658 4637 -1.06672 -0.0209178 -0.0379802 1 0 1 1 0 0 +EDGE2 4658 4657 -1.00344 0.00303334 -0.00129388 1 0 1 1 0 0 +EDGE2 4658 3757 -1.01035 0.0495754 -0.0261623 1 0 1 1 0 0 +EDGE2 4658 4638 -0.022037 -0.00193929 -0.0181651 1 0 1 1 0 0 +EDGE2 4658 3598 -0.0452501 0.0191312 0.0154816 1 0 1 1 0 0 +EDGE2 4658 3758 -0.00670202 0.0135022 -0.00373532 1 0 1 1 0 0 +EDGE2 4658 4639 0.984522 -0.0110674 0.0170623 1 0 1 1 0 0 +EDGE2 4658 3599 1.04848 0.0891485 -0.0157689 1 0 1 1 0 0 +EDGE2 4658 3759 0.99084 0.0253534 0.000343303 1 0 1 1 0 0 +EDGE2 4659 4638 -0.96893 -0.000533945 0.00998902 1 0 1 1 0 0 +EDGE2 4659 4658 -1.01367 0.0513824 -0.0219675 1 0 1 1 0 0 +EDGE2 4659 3598 -0.955814 -0.0765802 -0.00619971 1 0 1 1 0 0 +EDGE2 4659 3758 -1.00559 -0.0212086 0.00732997 1 0 1 1 0 0 +EDGE2 4659 4639 -0.0604405 -0.0285692 0.0109693 1 0 1 1 0 0 +EDGE2 4659 3599 0.0812511 -0.0619514 0.0221572 1 0 1 1 0 0 +EDGE2 4659 3759 0.0152684 0.0402099 -0.0212574 1 0 1 1 0 0 +EDGE2 4659 3680 0.985927 -0.0750994 -3.13595 1 0 1 1 0 0 +EDGE2 4659 3820 0.967488 -0.125361 -3.12903 1 0 1 1 0 0 +EDGE2 4659 4640 0.958914 0.0491745 0.00545099 1 0 1 1 0 0 +EDGE2 4659 3760 1.03675 -0.0275715 -0.0497167 1 0 1 1 0 0 +EDGE2 4659 3600 0.931642 0.0258717 0.024032 1 0 1 1 0 0 +EDGE2 4659 3640 1.06156 -0.0237318 -3.14224 1 0 1 1 0 0 +EDGE2 4659 3660 0.994072 -0.004357 -3.13324 1 0 1 1 0 0 +EDGE2 4660 4639 -0.990567 -0.0244056 -0.0031824 1 0 1 1 0 0 +EDGE2 4660 4659 -0.987969 0.0399176 0.000619579 1 0 1 1 0 0 +EDGE2 4660 3599 -0.980557 -0.053702 -0.0235167 1 0 1 1 0 0 +EDGE2 4660 3759 -1.08145 -0.0524642 0.0167335 1 0 1 1 0 0 +EDGE2 4660 3680 -0.0578543 0.116547 -3.10044 1 0 1 1 0 0 +EDGE2 4660 3601 -0.0630176 0.945224 1.57783 1 0 1 1 0 0 +EDGE2 4660 4641 -0.0257854 0.972697 1.54593 1 0 1 1 0 0 +EDGE2 4660 3820 0.0139917 -0.000372654 -3.1488 1 0 1 1 0 0 +EDGE2 4660 4640 -0.0306407 -0.0644482 0.0128124 1 0 1 1 0 0 +EDGE2 4660 3760 0.0539505 -0.05643 -0.0192027 1 0 1 1 0 0 +EDGE2 4660 3761 -0.0180349 -1.01633 -1.57905 1 0 1 1 0 0 +EDGE2 4660 3600 -0.0271755 -0.138391 0.0327444 1 0 1 1 0 0 +EDGE2 4660 3640 -0.0511911 -0.0826109 -3.13476 1 0 1 1 0 0 +EDGE2 4660 3660 -0.00784069 -0.0224016 -3.13371 1 0 1 1 0 0 +EDGE2 4660 3821 0.0277858 -1.0151 -1.57105 1 0 1 1 0 0 +EDGE2 4660 3641 0.040355 -1.06589 -1.56842 1 0 1 1 0 0 +EDGE2 4660 3661 0.0260898 -1.08677 -1.56357 1 0 1 1 0 0 +EDGE2 4660 3681 0.04364 -0.98814 -1.54494 1 0 1 1 0 0 +EDGE2 4660 3659 0.997048 -0.0633337 -3.10924 1 0 1 1 0 0 +EDGE2 4660 3679 0.99628 0.106354 -3.1106 1 0 1 1 0 0 +EDGE2 4660 3819 1.08645 -0.0269481 -3.17421 1 0 1 1 0 0 +EDGE2 4660 3639 1.01088 0.025257 -3.14915 1 0 1 1 0 0 +EDGE2 4661 3680 -1.02668 -0.069469 1.59312 1 0 1 1 0 0 +EDGE2 4661 4642 0.988944 0.0105467 -0.0439054 1 0 1 1 0 0 +EDGE2 4661 3602 0.906891 -0.120364 0.0391157 1 0 1 1 0 0 +EDGE2 4661 3601 0.0417291 -0.0254152 -0.00730058 1 0 1 1 0 0 +EDGE2 4661 4641 -0.0562881 -0.0306232 0.0127601 1 0 1 1 0 0 +EDGE2 4661 3820 -1.01334 0.0554313 1.57377 1 0 1 1 0 0 +EDGE2 4661 4640 -1.02426 -0.0246868 -1.51781 1 0 1 1 0 0 +EDGE2 4661 4660 -0.954642 0.111006 -1.60694 1 0 1 1 0 0 +EDGE2 4661 3760 -0.895194 0.0426574 -1.55977 1 0 1 1 0 0 +EDGE2 4661 3600 -0.972314 -0.0251946 -1.55693 1 0 1 1 0 0 +EDGE2 4661 3640 -1.04806 0.0192068 1.54591 1 0 1 1 0 0 +EDGE2 4661 3660 -1.10839 0.0260414 1.58429 1 0 1 1 0 0 +EDGE2 4662 3603 1.05072 -0.0149471 0.0200316 1 0 1 1 0 0 +EDGE2 4662 4643 1.03341 -0.0422426 0.0168235 1 0 1 1 0 0 +EDGE2 4662 4661 -0.963744 -0.0357991 -0.0119135 1 0 1 1 0 0 +EDGE2 4662 4642 -0.0665607 -0.0246704 -0.0163644 1 0 1 1 0 0 +EDGE2 4662 3602 0.000445345 -0.0384819 0.00624969 1 0 1 1 0 0 +EDGE2 4662 3601 -0.978207 0.094634 -0.0160591 1 0 1 1 0 0 +EDGE2 4662 4641 -1.05676 0.0260887 -0.04188 1 0 1 1 0 0 +EDGE2 4663 4644 1.00927 -0.0403627 -0.00240081 1 0 1 1 0 0 +EDGE2 4663 3604 1.0015 0.0106406 0.0371895 1 0 1 1 0 0 +EDGE2 4663 3603 -0.0934107 0.034852 -0.00507085 1 0 1 1 0 0 +EDGE2 4663 4643 0.0587546 -0.0176915 0.00299121 1 0 1 1 0 0 +EDGE2 4663 4642 -1.02069 0.0796316 0.0347705 1 0 1 1 0 0 +EDGE2 4663 4662 -1.02021 0.0456665 0.0131842 1 0 1 1 0 0 +EDGE2 4663 3602 -1.01025 -0.00377438 0.0124058 1 0 1 1 0 0 +EDGE2 4664 4644 -0.0829876 -0.073498 -0.000569468 1 0 1 1 0 0 +EDGE2 4664 3605 0.98109 -0.0958771 0.00365125 1 0 1 1 0 0 +EDGE2 4664 4645 1.07964 0.0506285 -0.0307767 1 0 1 1 0 0 +EDGE2 4664 4585 0.951046 -0.0340408 -3.11926 1 0 1 1 0 0 +EDGE2 4664 4663 -1.03126 -0.0814367 0.000900346 1 0 1 1 0 0 +EDGE2 4664 3604 -0.039029 -0.0215556 0.031263 1 0 1 1 0 0 +EDGE2 4664 3603 -0.959785 0.0641182 -0.0161793 1 0 1 1 0 0 +EDGE2 4664 4643 -1.0887 -0.075421 -0.00545536 1 0 1 1 0 0 +EDGE2 4665 4646 -0.0342557 1.00324 1.5488 1 0 1 1 0 0 +EDGE2 4665 4586 0.00928584 1.03788 1.55902 1 0 1 1 0 0 +EDGE2 4665 4644 -0.927357 0.0129266 0.0119348 1 0 1 1 0 0 +EDGE2 4665 4584 1.07219 0.0696199 -3.18828 1 0 1 1 0 0 +EDGE2 4665 3605 0.024721 -0.034566 -0.000396297 1 0 1 1 0 0 +EDGE2 4665 4645 0.0311411 0.0110288 0.0131542 1 0 1 1 0 0 +EDGE2 4665 4585 0.0191633 -0.080765 -3.14821 1 0 1 1 0 0 +EDGE2 4665 4664 -0.892408 0.028605 -0.0418035 1 0 1 1 0 0 +EDGE2 4665 3606 -0.083349 -1.00395 -1.54044 1 0 1 1 0 0 +EDGE2 4665 3604 -0.940024 -0.0400466 -0.00899283 1 0 1 1 0 0 +EDGE2 4666 3605 -0.999895 0.0520991 1.55885 1 0 1 1 0 0 +EDGE2 4666 4645 -0.881465 0.0105096 1.57562 1 0 1 1 0 0 +EDGE2 4666 4665 -0.973606 -0.00268324 1.55786 1 0 1 1 0 0 +EDGE2 4666 4585 -1.06829 0.0143759 -1.56881 1 0 1 1 0 0 +EDGE2 4666 3607 0.966702 0.0468591 0.00626834 1 0 1 1 0 0 +EDGE2 4666 3606 0.0672666 0.0310709 -0.0332078 1 0 1 1 0 0 +EDGE2 4667 3607 -0.0325639 0.0665069 -0.0084488 1 0 1 1 0 0 +EDGE2 4667 3606 -0.988632 -0.00347093 0.0101812 1 0 1 1 0 0 +EDGE2 4667 4666 -1.0077 0.0238012 -0.0203415 1 0 1 1 0 0 +EDGE2 4667 3608 0.995882 -0.043266 -0.015121 1 0 1 1 0 0 +EDGE2 4668 3607 -0.995741 -0.0550594 0.0106432 1 0 1 1 0 0 +EDGE2 4668 4667 -1.06154 0.0105485 -0.0028829 1 0 1 1 0 0 +EDGE2 4668 3608 -0.0416746 -0.0452643 -0.0520472 1 0 1 1 0 0 +EDGE2 4668 3609 1.00958 -5.75826e-05 -0.00769182 1 0 1 1 0 0 +EDGE2 4669 3608 -0.983541 -0.02742 -0.0401129 1 0 1 1 0 0 +EDGE2 4669 4668 -0.935336 -0.00175483 0.0172225 1 0 1 1 0 0 +EDGE2 4669 3609 0.00967239 0.0844282 -0.00293299 1 0 1 1 0 0 +EDGE2 4669 4570 0.958803 -0.0280334 -3.1176 1 0 1 1 0 0 +EDGE2 4669 3610 1.01029 0.00675 -0.050597 1 0 1 1 0 0 +EDGE2 4669 3630 1.04846 0.00944227 -3.14516 1 0 1 1 0 0 +EDGE2 4670 3609 -0.955182 -0.125095 -0.0173934 1 0 1 1 0 0 +EDGE2 4670 4669 -1.0074 0.0392975 0.0243369 1 0 1 1 0 0 +EDGE2 4670 4571 -0.00064009 1.00845 1.58041 1 0 1 1 0 0 +EDGE2 4670 3611 -0.064804 0.971878 1.58017 1 0 1 1 0 0 +EDGE2 4670 4570 0.0234693 0.012238 -3.10615 1 0 1 1 0 0 +EDGE2 4670 3610 0.0155283 -0.0813253 -0.0250708 1 0 1 1 0 0 +EDGE2 4670 3630 0.0277384 0.0138513 -3.13764 1 0 1 1 0 0 +EDGE2 4670 3631 0.021879 -1.02074 -1.60846 1 0 1 1 0 0 +EDGE2 4670 3629 0.959427 0.0047708 -3.17214 1 0 1 1 0 0 +EDGE2 4670 4569 1.03011 -0.0815687 -3.11922 1 0 1 1 0 0 +EDGE2 4671 3612 1.00933 0.0364697 0.00463797 1 0 1 1 0 0 +EDGE2 4671 4572 0.986971 -0.0471048 -0.00692615 1 0 1 1 0 0 +EDGE2 4671 4571 -0.0197752 -0.0509384 0.0228897 1 0 1 1 0 0 +EDGE2 4671 3611 -0.0858485 0.0240697 0.0276821 1 0 1 1 0 0 +EDGE2 4671 4570 -1.02619 -0.00471719 1.59024 1 0 1 1 0 0 +EDGE2 4671 4670 -1.00889 -0.00235468 -1.58483 1 0 1 1 0 0 +EDGE2 4671 3610 -1.03114 0.0107938 -1.56447 1 0 1 1 0 0 +EDGE2 4671 3630 -0.979859 0.0584919 1.62172 1 0 1 1 0 0 +EDGE2 4672 3613 0.985761 0.0463532 -0.0368563 1 0 1 1 0 0 +EDGE2 4672 4573 1.03172 -0.0555549 0.00971701 1 0 1 1 0 0 +EDGE2 4672 3612 -0.0577261 0.118708 -0.0106823 1 0 1 1 0 0 +EDGE2 4672 4572 0.0884725 -0.0347454 -0.0102268 1 0 1 1 0 0 +EDGE2 4672 4571 -0.951236 0.0260335 -0.00742091 1 0 1 1 0 0 +EDGE2 4672 4671 -1.06781 -0.0109508 0.00570012 1 0 1 1 0 0 +EDGE2 4672 3611 -1.05174 -0.0640215 0.0216005 1 0 1 1 0 0 +EDGE2 4673 4574 0.901419 0.039538 -0.000571135 1 0 1 1 0 0 +EDGE2 4673 3614 1.00121 0.0728322 0.00314501 1 0 1 1 0 0 +EDGE2 4673 4672 -0.938835 -0.0774788 -0.0182372 1 0 1 1 0 0 +EDGE2 4673 3613 -0.0399399 -0.0660875 0.00193309 1 0 1 1 0 0 +EDGE2 4673 4573 0.0111907 0.113621 -0.00624421 1 0 1 1 0 0 +EDGE2 4673 3612 -0.943947 -0.0521374 0.00939023 1 0 1 1 0 0 +EDGE2 4673 4572 -1.08971 0.0387781 0.0194643 1 0 1 1 0 0 +EDGE2 4674 4575 1.0779 -0.00365461 -0.0096018 1 0 1 1 0 0 +EDGE2 4674 3615 1.02185 0.0040312 -0.0422429 1 0 1 1 0 0 +EDGE2 4674 4574 0.0650128 0.0241284 0.0216868 1 0 1 1 0 0 +EDGE2 4674 3614 0.0123248 -0.060918 -0.0238706 1 0 1 1 0 0 +EDGE2 4674 4673 -0.951599 -0.0836682 0.0024786 1 0 1 1 0 0 +EDGE2 4674 3613 -1.08349 -0.00827281 0.0206292 1 0 1 1 0 0 +EDGE2 4674 4573 -1.05435 0.000290214 0.0113243 1 0 1 1 0 0 +EDGE2 4675 4576 -0.0414826 1.01536 1.54632 1 0 1 1 0 0 +EDGE2 4675 4575 -0.0105266 0.0249225 -0.0037272 1 0 1 1 0 0 +EDGE2 4675 3615 -0.0274559 0.113384 0.0266641 1 0 1 1 0 0 +EDGE2 4675 3616 0.0339578 -0.966749 -1.57967 1 0 1 1 0 0 +EDGE2 4675 4574 -1.00943 -0.0116001 0.0246307 1 0 1 1 0 0 +EDGE2 4675 4674 -0.924291 -0.0725411 0.0040217 1 0 1 1 0 0 +EDGE2 4675 3614 -1.06615 -0.0127121 0.0420329 1 0 1 1 0 0 +EDGE2 4676 4577 0.997711 0.00256851 0.00637948 1 0 1 1 0 0 +EDGE2 4676 4576 0.0323768 0.0157401 -0.0359822 1 0 1 1 0 0 +EDGE2 4676 4575 -1.0099 -0.00686036 -1.59284 1 0 1 1 0 0 +EDGE2 4676 4675 -1.02222 -0.0120698 -1.55731 1 0 1 1 0 0 +EDGE2 4676 3615 -1.0488 0.0337093 -1.54785 1 0 1 1 0 0 +EDGE2 4677 4578 1.08961 -0.0653601 0.00488515 1 0 1 1 0 0 +EDGE2 4677 4577 0.0270926 -0.0855646 -0.0452985 1 0 1 1 0 0 +EDGE2 4677 4676 -0.961431 0.00235482 -0.0207927 1 0 1 1 0 0 +EDGE2 4677 4576 -0.959143 0.0642211 0.0152568 1 0 1 1 0 0 +EDGE2 4678 4579 1.05996 0.000364156 -0.0156251 1 0 1 1 0 0 +EDGE2 4678 4578 -0.0689868 0.0812656 -0.0108603 1 0 1 1 0 0 +EDGE2 4678 4577 -1.06544 0.0294601 0.0191238 1 0 1 1 0 0 +EDGE2 4678 4677 -0.968499 0.0260437 -0.0101329 1 0 1 1 0 0 +EDGE2 4679 4580 0.951997 0.05045 -0.02791 1 0 1 1 0 0 +EDGE2 4679 4579 -0.00860605 0.0451822 -0.00768769 1 0 1 1 0 0 +EDGE2 4679 4678 -1.0771 0.00170605 0.0318566 1 0 1 1 0 0 +EDGE2 4679 4578 -1.02272 0.0621696 -0.0167182 1 0 1 1 0 0 +EDGE2 4680 4580 -0.0208919 -0.0363691 0.00958485 1 0 1 1 0 0 +EDGE2 4680 4581 -0.00650206 0.96774 1.57253 1 0 1 1 0 0 +EDGE2 4680 4679 -1.11264 -0.0906509 -0.00237549 1 0 1 1 0 0 +EDGE2 4680 4579 -1.03255 0.0455492 -0.00257912 1 0 1 1 0 0 +EDGE2 4681 4580 -1.07844 -0.0598566 -1.54277 1 0 1 1 0 0 +EDGE2 4681 4680 -0.971079 0.127663 -1.57232 1 0 1 1 0 0 +EDGE2 4681 4581 -0.0682021 -0.0429469 -0.0102945 1 0 1 1 0 0 +EDGE2 4681 4582 0.934635 0.0306541 -0.0157696 1 0 1 1 0 0 +EDGE2 4682 4681 -1.00705 0.0720015 0.000137275 1 0 1 1 0 0 +EDGE2 4682 4581 -0.997084 -0.0624643 -0.000158272 1 0 1 1 0 0 +EDGE2 4682 4583 0.953426 0.0933419 0.00441303 1 0 1 1 0 0 +EDGE2 4682 4582 -0.0170983 -0.0174047 0.0166705 1 0 1 1 0 0 +EDGE2 4683 4583 0.00499497 0.0203485 0.0214532 1 0 1 1 0 0 +EDGE2 4683 4582 -0.987238 -0.0423273 -0.0170299 1 0 1 1 0 0 +EDGE2 4683 4682 -0.937551 -0.0809787 0.0529856 1 0 1 1 0 0 +EDGE2 4683 4584 0.992319 -0.015177 -0.0064253 1 0 1 1 0 0 +EDGE2 4684 4583 -0.967894 0.0174072 -0.0036677 1 0 1 1 0 0 +EDGE2 4684 4683 -1.00243 -0.0181026 0.00309114 1 0 1 1 0 0 +EDGE2 4684 4584 0.0625214 0.0245596 0.00240742 1 0 1 1 0 0 +EDGE2 4684 3605 1.09171 -0.0100076 -3.13885 1 0 1 1 0 0 +EDGE2 4684 4645 0.952578 -0.0295674 -3.13009 1 0 1 1 0 0 +EDGE2 4684 4665 0.982378 0.0724851 -3.15862 1 0 1 1 0 0 +EDGE2 4684 4585 0.979201 -0.0141077 0.0102084 1 0 1 1 0 0 +EDGE2 4685 4646 -0.0728589 -1.01155 -1.54159 1 0 1 1 0 0 +EDGE2 4685 4586 0.0190182 -0.930127 -1.54358 1 0 1 1 0 0 +EDGE2 4685 4644 1.02584 0.0507587 -3.16815 1 0 1 1 0 0 +EDGE2 4685 4684 -0.935125 -0.0552696 0.00647822 1 0 1 1 0 0 +EDGE2 4685 4584 -0.995988 -0.0365968 -0.00842871 1 0 1 1 0 0 +EDGE2 4685 3605 -0.0166613 0.00503566 -3.11941 1 0 1 1 0 0 +EDGE2 4685 4645 -0.0515566 0.000216447 -3.15973 1 0 1 1 0 0 +EDGE2 4685 4665 0.0170037 0.054063 -3.15088 1 0 1 1 0 0 +EDGE2 4685 4585 0.072519 0.0498128 0.0432161 1 0 1 1 0 0 +EDGE2 4685 4664 0.952152 0.109547 -3.14561 1 0 1 1 0 0 +EDGE2 4685 3606 -0.0161596 0.940163 1.58133 1 0 1 1 0 0 +EDGE2 4685 4666 0.0256151 0.987867 1.56254 1 0 1 1 0 0 +EDGE2 4685 3604 0.974586 0.0234028 -3.11642 1 0 1 1 0 0 +EDGE2 4686 3605 -1.06723 -0.00562 1.56726 1 0 1 1 0 0 +EDGE2 4686 4645 -1.02845 0.048742 1.62952 1 0 1 1 0 0 +EDGE2 4686 4665 -0.997546 -0.0671842 1.60218 1 0 1 1 0 0 +EDGE2 4686 4685 -0.944942 0.0783668 -1.56256 1 0 1 1 0 0 +EDGE2 4686 4585 -1.03524 0.0598813 -1.53688 1 0 1 1 0 0 +EDGE2 4686 3607 0.961212 0.0191288 0.00924514 1 0 1 1 0 0 +EDGE2 4686 3606 0.0348957 0.0737505 -0.0344621 1 0 1 1 0 0 +EDGE2 4686 4666 0.00714886 0.0409018 0.00610471 1 0 1 1 0 0 +EDGE2 4686 4667 0.945055 0.0106328 -0.00782305 1 0 1 1 0 0 +EDGE2 4687 3607 -0.0434387 0.0149561 0.0211074 1 0 1 1 0 0 +EDGE2 4687 3606 -0.999519 0.0124409 0.0429052 1 0 1 1 0 0 +EDGE2 4687 4686 -1.02426 -0.077774 -0.0173113 1 0 1 1 0 0 +EDGE2 4687 4666 -1.00667 -0.0625951 -0.00586217 1 0 1 1 0 0 +EDGE2 4687 4667 0.0455529 0.00568036 0.00883469 1 0 1 1 0 0 +EDGE2 4687 3608 0.909498 -0.0669308 -0.00955654 1 0 1 1 0 0 +EDGE2 4687 4668 0.992911 -0.0568333 -0.00992356 1 0 1 1 0 0 +EDGE2 4688 3607 -1.02599 0.0497123 0.00647737 1 0 1 1 0 0 +EDGE2 4688 4687 -1.0091 0.0527918 0.00951738 1 0 1 1 0 0 +EDGE2 4688 4667 -1.03836 0.0830301 -0.020234 1 0 1 1 0 0 +EDGE2 4688 3608 -0.0539294 -0.0584423 0.00859993 1 0 1 1 0 0 +EDGE2 4688 4668 -0.109177 -0.0367917 0.0113403 1 0 1 1 0 0 +EDGE2 4688 3609 0.951788 -0.0527618 0.045564 1 0 1 1 0 0 +EDGE2 4688 4669 1.04818 -0.0623477 0.00236516 1 0 1 1 0 0 +EDGE2 4689 3608 -1.06173 -0.0423895 -0.0285839 1 0 1 1 0 0 +EDGE2 4689 4668 -0.928297 -0.0235661 -0.00191694 1 0 1 1 0 0 +EDGE2 4689 4688 -0.9659 0.0772317 -0.0178809 1 0 1 1 0 0 +EDGE2 4689 3609 -0.0496938 -0.00599952 0.0193542 1 0 1 1 0 0 +EDGE2 4689 4669 0.0150039 -0.0250647 -0.000382058 1 0 1 1 0 0 +EDGE2 4689 4570 0.949207 -0.0160969 -3.12587 1 0 1 1 0 0 +EDGE2 4689 4670 1.04941 0.0460997 -0.00927947 1 0 1 1 0 0 +EDGE2 4689 3610 1.02153 -0.0983745 0.00014481 1 0 1 1 0 0 +EDGE2 4689 3630 0.989387 -0.015729 -3.18162 1 0 1 1 0 0 +EDGE2 4690 3609 -0.928345 -0.0775912 -0.0115965 1 0 1 1 0 0 +EDGE2 4690 4669 -0.906741 0.0387846 -0.0425588 1 0 1 1 0 0 +EDGE2 4690 4689 -0.91572 -0.0225054 0.0208537 1 0 1 1 0 0 +EDGE2 4690 4571 0.021448 0.969412 1.56021 1 0 1 1 0 0 +EDGE2 4690 4671 -0.0717072 1.03253 1.53047 1 0 1 1 0 0 +EDGE2 4690 3611 -0.00828953 1.01161 1.56588 1 0 1 1 0 0 +EDGE2 4690 4570 0.0483613 -0.0247307 -3.10779 1 0 1 1 0 0 +EDGE2 4690 4670 0.0299202 0.0355868 -0.00737851 1 0 1 1 0 0 +EDGE2 4690 3610 0.0120631 0.0299009 0.00480281 1 0 1 1 0 0 +EDGE2 4690 3630 0.0628494 0.066678 -3.14471 1 0 1 1 0 0 +EDGE2 4690 3631 0.0599929 -0.977322 -1.56536 1 0 1 1 0 0 +EDGE2 4690 3629 0.984774 -0.012548 -3.13429 1 0 1 1 0 0 +EDGE2 4690 4569 1.03838 0.0431346 -3.13929 1 0 1 1 0 0 +EDGE2 4691 4672 1.03486 0.0185708 0.0231647 1 0 1 1 0 0 +EDGE2 4691 3612 1.01819 -0.0516624 -0.000902858 1 0 1 1 0 0 +EDGE2 4691 4572 0.965401 -0.0163959 -0.0191327 1 0 1 1 0 0 +EDGE2 4691 4571 0.0334627 0.0175197 -0.014701 1 0 1 1 0 0 +EDGE2 4691 4671 -0.0065484 0.00985057 -0.0114088 1 0 1 1 0 0 +EDGE2 4691 3611 -0.0823215 0.0179061 -0.01837 1 0 1 1 0 0 +EDGE2 4691 4570 -1.05969 -0.0953516 1.54493 1 0 1 1 0 0 +EDGE2 4691 4690 -1.04889 -0.0340094 -1.54173 1 0 1 1 0 0 +EDGE2 4691 4670 -1.02827 0.0205711 -1.55868 1 0 1 1 0 0 +EDGE2 4691 3610 -1.03248 -0.0265534 -1.57467 1 0 1 1 0 0 +EDGE2 4691 3630 -1.09155 0.0086906 1.61112 1 0 1 1 0 0 +EDGE2 4692 4672 0.036927 0.0603429 -0.0113544 1 0 1 1 0 0 +EDGE2 4692 4673 1.06822 -0.118811 0.0149654 1 0 1 1 0 0 +EDGE2 4692 3613 0.995013 0.0438964 0.0056499 1 0 1 1 0 0 +EDGE2 4692 4573 1.02524 -0.0888765 0.00610924 1 0 1 1 0 0 +EDGE2 4692 3612 -0.0443718 0.0500057 0.0242237 1 0 1 1 0 0 +EDGE2 4692 4572 -0.0477357 -0.0383155 0.0296909 1 0 1 1 0 0 +EDGE2 4692 4571 -1.09575 0.108441 -0.00144598 1 0 1 1 0 0 +EDGE2 4692 4671 -1.02145 -0.0117559 0.000356382 1 0 1 1 0 0 +EDGE2 4692 4691 -1.04169 0.0545329 -0.0124468 1 0 1 1 0 0 +EDGE2 4692 3611 -0.992518 -0.00415565 0.0164162 1 0 1 1 0 0 +EDGE2 4693 4574 0.976203 0.0922202 -0.0179571 1 0 1 1 0 0 +EDGE2 4693 4674 1.05274 0.0618714 0.0111323 1 0 1 1 0 0 +EDGE2 4693 3614 1.00092 0.0228352 0.0269973 1 0 1 1 0 0 +EDGE2 4693 4672 -1.00872 0.115372 -0.00688662 1 0 1 1 0 0 +EDGE2 4693 4673 0.032864 0.0392821 -0.0290357 1 0 1 1 0 0 +EDGE2 4693 3613 0.00664697 -0.0248983 0.000986834 1 0 1 1 0 0 +EDGE2 4693 4573 -0.0371313 -0.0536406 -0.0132289 1 0 1 1 0 0 +EDGE2 4693 4692 -1.03184 -0.0476215 0.0271228 1 0 1 1 0 0 +EDGE2 4693 3612 -1.00774 -0.0538842 0.0383942 1 0 1 1 0 0 +EDGE2 4693 4572 -1.08279 -0.0334295 -0.00549897 1 0 1 1 0 0 +EDGE2 4694 4575 1.05067 -0.019154 -0.00908728 1 0 1 1 0 0 +EDGE2 4694 4675 0.929746 0.0298457 -0.0387638 1 0 1 1 0 0 +EDGE2 4694 3615 0.987001 0.103376 -0.0168317 1 0 1 1 0 0 +EDGE2 4694 4574 -0.0736671 -0.0308008 0.0144725 1 0 1 1 0 0 +EDGE2 4694 4674 0.0100484 -0.0527527 -0.00952755 1 0 1 1 0 0 +EDGE2 4694 3614 -0.0765047 0.0109751 0.0107304 1 0 1 1 0 0 +EDGE2 4694 4673 -0.900308 -0.0186582 0.0364068 1 0 1 1 0 0 +EDGE2 4694 4693 -0.938709 -0.0768503 0.00482104 1 0 1 1 0 0 +EDGE2 4694 3613 -1.05696 0.112242 0.00282239 1 0 1 1 0 0 +EDGE2 4694 4573 -0.948062 0.0922302 0.013168 1 0 1 1 0 0 +EDGE2 4695 4676 -0.0106688 0.962666 1.56484 1 0 1 1 0 0 +EDGE2 4695 4576 0.0091083 1.02929 1.56006 1 0 1 1 0 0 +EDGE2 4695 4575 0.0618516 -0.0597098 0.0143762 1 0 1 1 0 0 +EDGE2 4695 4675 -0.0241462 -0.0195442 0.00983652 1 0 1 1 0 0 +EDGE2 4695 3615 -0.0340163 -0.0215388 0.0133462 1 0 1 1 0 0 +EDGE2 4695 3616 -0.0428866 -1.05849 -1.55001 1 0 1 1 0 0 +EDGE2 4695 4574 -0.883429 -0.0442134 -0.000180642 1 0 1 1 0 0 +EDGE2 4695 4674 -0.988356 0.111787 0.00798343 1 0 1 1 0 0 +EDGE2 4695 4694 -0.977984 -0.0325661 0.0226765 1 0 1 1 0 0 +EDGE2 4695 3614 -0.976599 -0.0371206 -0.0289943 1 0 1 1 0 0 +EDGE2 4696 4577 1.02383 -0.0508447 0.00030924 1 0 1 1 0 0 +EDGE2 4696 4677 1.07469 -0.0849881 -0.00585038 1 0 1 1 0 0 +EDGE2 4696 4676 -0.031423 0.0620098 -0.0239806 1 0 1 1 0 0 +EDGE2 4696 4576 -0.107826 0.0543446 0.0152996 1 0 1 1 0 0 +EDGE2 4696 4575 -1.09484 0.0223026 -1.59329 1 0 1 1 0 0 +EDGE2 4696 4695 -0.916474 0.0626429 -1.58991 1 0 1 1 0 0 +EDGE2 4696 4675 -1.02302 -0.0160495 -1.56432 1 0 1 1 0 0 +EDGE2 4696 3615 -0.968319 0.0440534 -1.56581 1 0 1 1 0 0 +EDGE2 4697 4678 0.947342 0.0361772 -0.0166831 1 0 1 1 0 0 +EDGE2 4697 4578 0.973537 -0.0265297 -0.00299312 1 0 1 1 0 0 +EDGE2 4697 4577 -0.00122869 0.033556 0.0435766 1 0 1 1 0 0 +EDGE2 4697 4677 -0.0467371 0.0454601 0.000951082 1 0 1 1 0 0 +EDGE2 4697 4676 -0.973569 -0.0313703 -0.00910151 1 0 1 1 0 0 +EDGE2 4697 4696 -0.97912 0.00481393 -0.000922379 1 0 1 1 0 0 +EDGE2 4697 4576 -0.96882 0.1018 0.0243909 1 0 1 1 0 0 +EDGE2 4698 4679 1.06774 0.0375226 -0.00260199 1 0 1 1 0 0 +EDGE2 4698 4579 1.02853 -0.0526434 0.0014952 1 0 1 1 0 0 +EDGE2 4698 4678 -0.0238889 -0.0825166 0.0191043 1 0 1 1 0 0 +EDGE2 4698 4578 -0.044421 -0.0528705 0.0129444 1 0 1 1 0 0 +EDGE2 4698 4577 -0.971923 -0.0275937 -0.0131798 1 0 1 1 0 0 +EDGE2 4698 4677 -0.897574 0.0212324 0.030812 1 0 1 1 0 0 +EDGE2 4698 4697 -1.05683 -0.0173142 -0.020333 1 0 1 1 0 0 +EDGE2 4699 4580 0.992169 -0.031593 0.0174837 1 0 1 1 0 0 +EDGE2 4699 4680 1.08711 -0.0287742 -0.0154602 1 0 1 1 0 0 +EDGE2 4699 4679 0.0319311 -0.0501288 -0.0124788 1 0 1 1 0 0 +EDGE2 4699 4579 0.0121231 0.0350084 -0.0352106 1 0 1 1 0 0 +EDGE2 4699 4678 -0.986012 0.0240108 -0.00291291 1 0 1 1 0 0 +EDGE2 4699 4698 -1.07847 -0.000319891 0.0117739 1 0 1 1 0 0 +EDGE2 4699 4578 -0.930812 -0.00846535 0.0026047 1 0 1 1 0 0 +EDGE2 4700 4580 0.00980082 -0.126309 -0.0334518 1 0 1 1 0 0 +EDGE2 4700 4680 -0.0373147 -0.0490976 -0.0118352 1 0 1 1 0 0 +EDGE2 4700 4681 0.0375917 1.00269 1.57922 1 0 1 1 0 0 +EDGE2 4700 4581 -0.037964 1.01917 1.59043 1 0 1 1 0 0 +EDGE2 4700 4679 -0.992479 0.0466739 0.025771 1 0 1 1 0 0 +EDGE2 4700 4699 -0.996014 -0.0676938 -0.0302516 1 0 1 1 0 0 +EDGE2 4700 4579 -1.04703 0.0655306 -0.0281562 1 0 1 1 0 0 +EDGE2 4701 4580 -1.07 -0.000315498 -1.57443 1 0 1 1 0 0 +EDGE2 4701 4680 -0.950697 -0.0102523 -1.56636 1 0 1 1 0 0 +EDGE2 4701 4700 -0.984003 -0.016127 -1.55792 1 0 1 1 0 0 +EDGE2 4701 4681 -0.0194853 -0.0470174 0.0437186 1 0 1 1 0 0 +EDGE2 4701 4581 -0.0579147 0.114852 -0.0146889 1 0 1 1 0 0 +EDGE2 4701 4582 1.02505 0.0993313 -0.0280589 1 0 1 1 0 0 +EDGE2 4701 4682 1.01535 -0.0112013 0.001175 1 0 1 1 0 0 +EDGE2 4702 4681 -1.04359 0.10351 0.0130971 1 0 1 1 0 0 +EDGE2 4702 4701 -0.99448 0.0116747 -0.0280954 1 0 1 1 0 0 +EDGE2 4702 4581 -1.06718 0.0652953 0.0015356 1 0 1 1 0 0 +EDGE2 4702 4583 0.978159 -0.00936247 0.00760063 1 0 1 1 0 0 +EDGE2 4702 4582 -0.0202021 -0.0620463 -0.0204057 1 0 1 1 0 0 +EDGE2 4702 4682 -0.040062 0.0762443 0.0229161 1 0 1 1 0 0 +EDGE2 4702 4683 0.953307 -0.0138739 0.00187163 1 0 1 1 0 0 +EDGE2 4703 4583 0.023373 -0.05472 -0.0460642 1 0 1 1 0 0 +EDGE2 4703 4582 -0.988397 -0.062172 -0.0128637 1 0 1 1 0 0 +EDGE2 4703 4702 -1.04458 0.00278668 0.0232077 1 0 1 1 0 0 +EDGE2 4703 4682 -1.0169 0.095374 -0.0214272 1 0 1 1 0 0 +EDGE2 4703 4683 0.0558334 0.082337 -0.0271432 1 0 1 1 0 0 +EDGE2 4703 4684 1.02553 0.00618837 0.0101707 1 0 1 1 0 0 +EDGE2 4703 4584 0.954934 -0.000673972 0.021604 1 0 1 1 0 0 +EDGE2 4704 4583 -1.00524 0.117873 -0.0474705 1 0 1 1 0 0 +EDGE2 4704 4703 -1.0034 0.157505 0.00664467 1 0 1 1 0 0 +EDGE2 4704 4683 -0.941615 0.0463948 -0.00923963 1 0 1 1 0 0 +EDGE2 4704 4684 -0.0655938 -0.0834801 0.00289965 1 0 1 1 0 0 +EDGE2 4704 4584 0.000973968 -0.0490303 0.000526618 1 0 1 1 0 0 +EDGE2 4704 3605 1.05702 -0.00309615 -3.12317 1 0 1 1 0 0 +EDGE2 4704 4645 0.89417 0.000533926 -3.15303 1 0 1 1 0 0 +EDGE2 4704 4665 0.93998 0.0263976 -3.14628 1 0 1 1 0 0 +EDGE2 4704 4685 0.96437 0.0453101 0.0115741 1 0 1 1 0 0 +EDGE2 4704 4585 1.1094 0.0287506 0.0447043 1 0 1 1 0 0 +EDGE2 4705 4646 0.0520205 -1.07908 -1.56423 1 0 1 1 0 0 +EDGE2 4705 4586 0.0384938 -1.00287 -1.54105 1 0 1 1 0 0 +EDGE2 4705 4644 0.940372 0.0934495 -3.12745 1 0 1 1 0 0 +EDGE2 4705 4684 -0.979494 0.0193882 -0.00802395 1 0 1 1 0 0 +EDGE2 4705 4704 -0.883833 -0.00899715 -0.0100888 1 0 1 1 0 0 +EDGE2 4705 4584 -0.9965 0.0474375 -0.0125195 1 0 1 1 0 0 +EDGE2 4705 3605 0.0286747 -0.0730211 -3.17592 1 0 1 1 0 0 +EDGE2 4705 4645 0.0386142 0.00662623 -3.15596 1 0 1 1 0 0 +EDGE2 4705 4665 -0.0100283 0.0971925 -3.1424 1 0 1 1 0 0 +EDGE2 4705 4685 -0.0536077 0.0444658 -0.0225505 1 0 1 1 0 0 +EDGE2 4705 4585 0.0112806 -0.00364417 0.00702426 1 0 1 1 0 0 +EDGE2 4705 4664 1.02539 0.0450145 -3.1424 1 0 1 1 0 0 +EDGE2 4705 3606 0.058688 0.975958 1.56708 1 0 1 1 0 0 +EDGE2 4705 4686 0.0699766 0.94788 1.58166 1 0 1 1 0 0 +EDGE2 4705 4666 0.0837005 0.992191 1.58723 1 0 1 1 0 0 +EDGE2 4705 3604 1.04984 -0.00355919 -3.13437 1 0 1 1 0 0 +EDGE2 4706 4587 0.966055 0.0752155 -0.0180708 1 0 1 1 0 0 +EDGE2 4706 4647 0.988308 -0.00372618 0.0246719 1 0 1 1 0 0 +EDGE2 4706 4646 -0.0330166 0.00070329 -0.0172378 1 0 1 1 0 0 +EDGE2 4706 4586 -0.0159048 -0.000132161 0.0362173 1 0 1 1 0 0 +EDGE2 4706 4705 -0.905419 0.00804991 1.5873 1 0 1 1 0 0 +EDGE2 4706 3605 -0.981667 -0.0326347 -1.56968 1 0 1 1 0 0 +EDGE2 4706 4645 -0.936356 0.13854 -1.57677 1 0 1 1 0 0 +EDGE2 4706 4665 -1.01583 -0.0236728 -1.55452 1 0 1 1 0 0 +EDGE2 4706 4685 -0.996316 0.0235532 1.56621 1 0 1 1 0 0 +EDGE2 4706 4585 -1.09885 -0.0777919 1.57616 1 0 1 1 0 0 +EDGE2 4707 4648 1.03546 -0.086037 0.0100832 1 0 1 1 0 0 +EDGE2 4707 4588 0.988786 0.037098 -0.0572406 1 0 1 1 0 0 +EDGE2 4707 4587 -0.0579958 0.0550194 -0.0450576 1 0 1 1 0 0 +EDGE2 4707 4647 -0.0499758 -0.0132189 0.0127005 1 0 1 1 0 0 +EDGE2 4707 4646 -1.0644 0.00789441 0.00834997 1 0 1 1 0 0 +EDGE2 4707 4706 -0.987338 0.0191929 0.00962858 1 0 1 1 0 0 +EDGE2 4707 4586 -1.009 -0.0406221 0.00554351 1 0 1 1 0 0 +EDGE2 4708 4707 -0.986137 0.060028 -0.0287114 1 0 1 1 0 0 +EDGE2 4708 4649 0.967932 -0.068213 0.0125141 1 0 1 1 0 0 +EDGE2 4708 4589 0.98224 0.0932896 -0.00464817 1 0 1 1 0 0 +EDGE2 4708 4648 0.0428524 0.0100724 0.0166444 1 0 1 1 0 0 +EDGE2 4708 4588 -0.031768 -0.0104104 0.000921624 1 0 1 1 0 0 +EDGE2 4708 4587 -1.12711 0.0685514 0.0144629 1 0 1 1 0 0 +EDGE2 4708 4647 -1.01505 -0.0514664 -0.0195285 1 0 1 1 0 0 +EDGE2 4709 4630 0.972917 -0.0346767 -3.13671 1 0 1 1 0 0 +EDGE2 4709 4650 1.0099 -0.00157526 -0.0341171 1 0 1 1 0 0 +EDGE2 4709 4590 1.10871 0.0531643 0.0361053 1 0 1 1 0 0 +EDGE2 4709 4708 -1.08723 -0.00611853 0.0250018 1 0 1 1 0 0 +EDGE2 4709 4649 0.0366189 -0.0369751 0.0171524 1 0 1 1 0 0 +EDGE2 4709 4589 -0.0681754 -0.107258 0.0287901 1 0 1 1 0 0 +EDGE2 4709 4648 -1.06617 0.0126241 -0.0111428 1 0 1 1 0 0 +EDGE2 4709 4588 -1.05698 0.0136898 -0.0140225 1 0 1 1 0 0 +EDGE2 4710 4629 1.01227 0.0433944 -3.13642 1 0 1 1 0 0 +EDGE2 4710 4630 0.0386839 0.0155165 -3.18248 1 0 1 1 0 0 +EDGE2 4710 4650 -0.00133836 -0.0464786 -0.0250061 1 0 1 1 0 0 +EDGE2 4710 4590 0.0357445 -0.0774507 -0.00590793 1 0 1 1 0 0 +EDGE2 4710 4591 0.0324335 1.01589 1.57996 1 0 1 1 0 0 +EDGE2 4710 4651 -0.0458996 0.897005 1.59607 1 0 1 1 0 0 +EDGE2 4710 4631 0.0372219 0.961757 1.57652 1 0 1 1 0 0 +EDGE2 4710 4649 -0.886182 -0.010619 0.0205519 1 0 1 1 0 0 +EDGE2 4710 4709 -1.02645 -0.0172987 -0.0392437 1 0 1 1 0 0 +EDGE2 4710 4589 -1.06334 0.0287501 -0.0367851 1 0 1 1 0 0 +EDGE2 4711 4710 -1.00929 0.0807109 1.55358 1 0 1 1 0 0 +EDGE2 4711 4630 -1.05272 -0.00137438 -1.56009 1 0 1 1 0 0 +EDGE2 4711 4650 -0.913682 -0.0402145 1.56915 1 0 1 1 0 0 +EDGE2 4711 4590 -0.957905 -0.000763464 1.54748 1 0 1 1 0 0 +EDGE2 4712 4711 -1.07532 0.0132972 -0.0323855 1 0 1 1 0 0 +EDGE2 4713 4712 -0.981769 0.0125824 -0.00990674 1 0 1 1 0 0 +EDGE2 4714 4713 -0.957535 0.0211642 0.000997017 1 0 1 1 0 0 +EDGE2 4715 4714 -1.10484 0.0177242 0.0030737 1 0 1 1 0 0 +EDGE2 4716 4715 -0.925677 0.0490432 -1.55935 1 0 1 1 0 0 +EDGE2 4717 4716 -0.942281 0.0109949 -0.0215728 1 0 1 1 0 0 +EDGE2 4718 4717 -1.01968 0.0518172 -0.0436428 1 0 1 1 0 0 +EDGE2 4719 4718 -0.994304 -0.0713052 0.00861329 1 0 1 1 0 0 +EDGE2 4720 4719 -0.938709 0.0299456 -0.00662047 1 0 1 1 0 0 +EDGE2 4721 4720 -1.06819 0.0133619 1.56939 1 0 1 1 0 0 +EDGE2 4722 4721 -0.945559 -0.0152287 0.0277063 1 0 1 1 0 0 +EDGE2 4723 4722 -0.955231 0.0310916 -0.00645568 1 0 1 1 0 0 +EDGE2 4724 4723 -0.977637 0.0278494 0.0131724 1 0 1 1 0 0 +EDGE2 4725 4724 -0.943423 -0.108226 0.0462374 1 0 1 1 0 0 +EDGE2 4726 4725 -1.09811 0.12685 -1.57863 1 0 1 1 0 0 +EDGE2 4727 4726 -1.00807 -0.00086702 -0.0132755 1 0 1 1 0 0 +EDGE2 4728 4727 -0.998376 -0.0486175 0.0124935 1 0 1 1 0 0 +EDGE2 4729 1610 1.06504 0.000922701 -3.1264 1 0 1 1 0 0 +EDGE2 4729 1630 1.01087 -0.00685931 -3.1673 1 0 1 1 0 0 +EDGE2 4729 1310 1.02308 -0.0419753 -3.12739 1 0 1 1 0 0 +EDGE2 4729 4728 -1.0461 -0.0244722 -0.0127439 1 0 1 1 0 0 +EDGE2 4730 1609 1.01102 0.0536333 -3.09146 1 0 1 1 0 0 +EDGE2 4730 1629 0.995677 -0.0242554 -3.13379 1 0 1 1 0 0 +EDGE2 4730 1309 1.01466 0.00418342 -3.13439 1 0 1 1 0 0 +EDGE2 4730 1611 -0.000787569 -0.971667 -1.56077 1 0 1 1 0 0 +EDGE2 4730 1631 -0.00433884 -1.00352 -1.58083 1 0 1 1 0 0 +EDGE2 4730 1311 0.0404036 -0.978781 -1.56391 1 0 1 1 0 0 +EDGE2 4730 1610 -0.0133985 -0.0716504 -3.12287 1 0 1 1 0 0 +EDGE2 4730 1630 0.0833203 -0.073425 -3.15624 1 0 1 1 0 0 +EDGE2 4730 1310 -0.00766904 -0.0577104 -3.14317 1 0 1 1 0 0 +EDGE2 4730 4729 -1.00704 0.0474658 -0.0220881 1 0 1 1 0 0 +EDGE2 4731 1610 -0.971326 0.0514681 1.57244 1 0 1 1 0 0 +EDGE2 4731 1630 -0.990239 -0.00265591 1.54285 1 0 1 1 0 0 +EDGE2 4731 4730 -1.03953 0.0539255 -1.58067 1 0 1 1 0 0 +EDGE2 4731 1310 -1.0313 -0.0108869 1.57389 1 0 1 1 0 0 +EDGE2 4732 4731 -1.03018 -0.00920329 -0.0077509 1 0 1 1 0 0 +EDGE2 4733 4732 -1.05272 0.103131 -0.019173 1 0 1 1 0 0 +EDGE2 4734 2815 0.964052 -0.0791446 -3.13529 1 0 1 1 0 0 +EDGE2 4734 4733 -1.02958 -0.0761716 -0.00276349 1 0 1 1 0 0 +EDGE2 4734 2795 1.04609 -0.0812229 -3.12879 1 0 1 1 0 0 +EDGE2 4735 2816 0.00886624 -0.99043 -1.5858 1 0 1 1 0 0 +EDGE2 4735 2796 -0.0420124 -0.985351 -1.56544 1 0 1 1 0 0 +EDGE2 4735 2815 0.0351442 -0.0213539 -3.13618 1 0 1 1 0 0 +EDGE2 4735 4734 -0.967305 -0.018671 0.00726098 1 0 1 1 0 0 +EDGE2 4735 2814 0.932149 -0.00267338 -3.15144 1 0 1 1 0 0 +EDGE2 4735 2795 0.0147919 -0.0203454 -3.1358 1 0 1 1 0 0 +EDGE2 4735 2794 1.00834 -0.0477672 -3.11285 1 0 1 1 0 0 +EDGE2 4736 2817 0.938557 0.0393466 -0.0296243 1 0 1 1 0 0 +EDGE2 4736 2797 1.02359 0.00114921 0.000268166 1 0 1 1 0 0 +EDGE2 4736 2816 0.0245809 -0.0821597 0.0171928 1 0 1 1 0 0 +EDGE2 4736 2796 -0.0077159 -0.000255971 -0.0253776 1 0 1 1 0 0 +EDGE2 4736 2815 -0.968146 -0.0511475 -1.54064 1 0 1 1 0 0 +EDGE2 4736 4735 -1.0222 0.0305299 1.58201 1 0 1 1 0 0 +EDGE2 4736 2795 -0.939172 -0.0219147 -1.60396 1 0 1 1 0 0 +EDGE2 4737 2818 1.117 0.0531138 0.00832794 1 0 1 1 0 0 +EDGE2 4737 2798 1.01992 0.0600675 0.0302229 1 0 1 1 0 0 +EDGE2 4737 2817 0.0762861 0.0337762 0.0157403 1 0 1 1 0 0 +EDGE2 4737 2797 0.0523281 -0.0581206 -0.00106817 1 0 1 1 0 0 +EDGE2 4737 2816 -0.98831 0.0290256 0.0325361 1 0 1 1 0 0 +EDGE2 4737 4736 -0.993258 -0.0299495 -0.00785458 1 0 1 1 0 0 +EDGE2 4737 2796 -0.913807 0.0379256 0.0204302 1 0 1 1 0 0 +EDGE2 4738 2819 0.86835 0.0261805 -0.00732369 1 0 1 1 0 0 +EDGE2 4738 2799 1.09518 0.0626395 -0.0126704 1 0 1 1 0 0 +EDGE2 4738 2818 0.0260497 0.0346611 -0.0370262 1 0 1 1 0 0 +EDGE2 4738 2798 0.0374555 -0.0123069 0.00237819 1 0 1 1 0 0 +EDGE2 4738 2817 -0.98932 -0.0254429 -0.0124223 1 0 1 1 0 0 +EDGE2 4738 4737 -1.04323 0.0298492 -0.0213413 1 0 1 1 0 0 +EDGE2 4738 2797 -1.0744 0.0571081 -0.0084358 1 0 1 1 0 0 +EDGE2 4739 2840 1.0146 0.0266767 -3.13777 1 0 1 1 0 0 +EDGE2 4739 1300 1.09327 0.00290839 -3.13919 1 0 1 1 0 0 +EDGE2 4739 2800 0.935904 0.0476779 0.00278762 1 0 1 1 0 0 +EDGE2 4739 2820 1.01863 -0.00665899 -0.0206278 1 0 1 1 0 0 +EDGE2 4739 1280 1.0426 -0.0121396 -3.14171 1 0 1 1 0 0 +EDGE2 4739 2819 -0.0337399 0.0541364 0.00847401 1 0 1 1 0 0 +EDGE2 4739 2799 0.0247107 0.0317358 -0.0239414 1 0 1 1 0 0 +EDGE2 4739 2818 -0.960151 0.046083 0.0352687 1 0 1 1 0 0 +EDGE2 4739 4738 -1.00077 -0.022257 0.0111505 1 0 1 1 0 0 +EDGE2 4739 2798 -0.989037 0.0093271 0.00960275 1 0 1 1 0 0 +EDGE2 4740 1299 1.02403 -0.00552058 -3.1081 1 0 1 1 0 0 +EDGE2 4740 2839 0.918931 -0.0166843 -3.14064 1 0 1 1 0 0 +EDGE2 4740 1279 1.02306 -0.00901801 -3.12465 1 0 1 1 0 0 +EDGE2 4740 2840 -0.00233385 -0.0305931 -3.16106 1 0 1 1 0 0 +EDGE2 4740 2821 0.0243434 -0.920566 -1.56436 1 0 1 1 0 0 +EDGE2 4740 1281 0.0312826 -1.02514 -1.59717 1 0 1 1 0 0 +EDGE2 4740 1301 -0.0769665 -0.96497 -1.57397 1 0 1 1 0 0 +EDGE2 4740 1300 -0.0380582 -0.0374467 -3.16873 1 0 1 1 0 0 +EDGE2 4740 2800 0.0260539 -0.00206074 0.0170497 1 0 1 1 0 0 +EDGE2 4740 2820 -0.0954238 0.0550285 -0.0165836 1 0 1 1 0 0 +EDGE2 4740 1280 -0.0222547 -0.0136634 -3.14008 1 0 1 1 0 0 +EDGE2 4740 2801 0.0190933 0.988659 1.58068 1 0 1 1 0 0 +EDGE2 4740 2841 0.0488125 0.978956 1.55137 1 0 1 1 0 0 +EDGE2 4740 4739 -0.991832 0.0578004 0.0121421 1 0 1 1 0 0 +EDGE2 4740 2819 -0.983108 0.0256378 -0.0194001 1 0 1 1 0 0 +EDGE2 4740 2799 -1.00463 -0.0788679 0.0191027 1 0 1 1 0 0 +EDGE2 4741 2840 -1.01735 -0.0217749 1.57863 1 0 1 1 0 0 +EDGE2 4741 4740 -0.984506 -0.108313 -1.58389 1 0 1 1 0 0 +EDGE2 4741 1300 -0.962241 0.022589 1.57724 1 0 1 1 0 0 +EDGE2 4741 2800 -1.0236 -0.0394686 -1.5709 1 0 1 1 0 0 +EDGE2 4741 2820 -1.05194 -0.0578381 -1.57462 1 0 1 1 0 0 +EDGE2 4741 1280 -0.980002 -0.0290061 1.58724 1 0 1 1 0 0 +EDGE2 4741 2801 -0.0249042 -0.00839507 -0.00234567 1 0 1 1 0 0 +EDGE2 4741 2841 0.0110323 0.0377808 -0.0193465 1 0 1 1 0 0 +EDGE2 4741 2802 1.00869 0.00441653 -0.00117055 1 0 1 1 0 0 +EDGE2 4741 2842 1.04253 0.0821043 0.0273456 1 0 1 1 0 0 +EDGE2 4742 2801 -1.03585 0.00978797 0.0507541 1 0 1 1 0 0 +EDGE2 4742 2841 -1.04354 -0.0556423 0.0270993 1 0 1 1 0 0 +EDGE2 4742 4741 -1.04094 -0.00200374 0.0439931 1 0 1 1 0 0 +EDGE2 4742 2802 0.0151151 -0.0479285 -0.0143792 1 0 1 1 0 0 +EDGE2 4742 2842 -0.0558862 -0.00484661 -0.00979394 1 0 1 1 0 0 +EDGE2 4742 2843 0.941412 -0.119588 0.00397266 1 0 1 1 0 0 +EDGE2 4742 2803 0.984196 -0.121854 0.0346344 1 0 1 1 0 0 +EDGE2 4743 4742 -0.950024 0.0153151 -0.0221551 1 0 1 1 0 0 +EDGE2 4743 2802 -1.00737 0.0165425 -0.00436399 1 0 1 1 0 0 +EDGE2 4743 2842 -0.962495 0.106435 -0.00781002 1 0 1 1 0 0 +EDGE2 4743 2843 -0.0015831 -0.0260061 -0.00516845 1 0 1 1 0 0 +EDGE2 4743 2803 0.0587687 0.0252765 -0.0301074 1 0 1 1 0 0 +EDGE2 4743 2804 1.05836 -0.0228748 0.0332635 1 0 1 1 0 0 +EDGE2 4743 2844 0.950749 0.0379794 0.00892439 1 0 1 1 0 0 +EDGE2 4744 2843 -0.984619 -0.0335394 -0.00645522 1 0 1 1 0 0 +EDGE2 4744 4743 -1.02952 -0.0336585 0.0300547 1 0 1 1 0 0 +EDGE2 4744 2803 -0.974285 -0.00509739 0.0169294 1 0 1 1 0 0 +EDGE2 4744 2804 -0.0588305 0.0234207 0.0225839 1 0 1 1 0 0 +EDGE2 4744 2844 0.111785 0.0115563 0.0285466 1 0 1 1 0 0 +EDGE2 4744 2685 1.0029 -0.028448 -3.12119 1 0 1 1 0 0 +EDGE2 4744 2785 0.983407 -0.0846009 -3.13787 1 0 1 1 0 0 +EDGE2 4744 2805 1.01358 -0.054335 -0.0220064 1 0 1 1 0 0 +EDGE2 4744 2845 0.976033 0.0519659 0.00189798 1 0 1 1 0 0 +EDGE2 4744 2765 1.00001 -0.000821621 -3.12785 1 0 1 1 0 0 +EDGE2 4744 2625 0.994378 -0.0234601 -3.12456 1 0 1 1 0 0 +EDGE2 4745 2766 0.0542934 -0.896828 -1.55088 1 0 1 1 0 0 +EDGE2 4745 2846 0.0206545 -0.961753 -1.58741 1 0 1 1 0 0 +EDGE2 4745 2686 -0.0288301 -0.998548 -1.5344 1 0 1 1 0 0 +EDGE2 4745 2626 0.0357417 -0.957117 -1.54971 1 0 1 1 0 0 +EDGE2 4745 2786 -0.0591331 0.99672 1.61683 1 0 1 1 0 0 +EDGE2 4745 2624 1.00124 -0.0199911 -3.1492 1 0 1 1 0 0 +EDGE2 4745 2804 -0.993749 0.0219351 0.00121874 1 0 1 1 0 0 +EDGE2 4745 2844 -0.93688 -0.0847401 -0.0126979 1 0 1 1 0 0 +EDGE2 4745 4744 -1.01089 0.0192811 -0.0233119 1 0 1 1 0 0 +EDGE2 4745 2685 -0.0255358 0.054086 -3.088 1 0 1 1 0 0 +EDGE2 4745 2785 -0.00377176 -0.064194 -3.15261 1 0 1 1 0 0 +EDGE2 4745 2805 0.0424715 0.0799353 -0.0131431 1 0 1 1 0 0 +EDGE2 4745 2845 0.0261413 0.0712549 0.00388074 1 0 1 1 0 0 +EDGE2 4745 2765 0.0364766 -0.125116 -3.12923 1 0 1 1 0 0 +EDGE2 4745 2764 1.00285 -0.0082058 -3.1222 1 0 1 1 0 0 +EDGE2 4745 2784 0.962492 -0.0606569 -3.15679 1 0 1 1 0 0 +EDGE2 4745 2625 -0.0145077 -0.0347561 -3.1409 1 0 1 1 0 0 +EDGE2 4745 2684 1.02402 0.0491773 -3.13125 1 0 1 1 0 0 +EDGE2 4745 2806 0.0243371 0.96939 1.54519 1 0 1 1 0 0 +EDGE2 4746 2786 -0.0210714 -0.164802 0.00155905 1 0 1 1 0 0 +EDGE2 4746 4745 -1.04618 -0.0241458 -1.58591 1 0 1 1 0 0 +EDGE2 4746 2685 -1.01501 0.035829 1.58695 1 0 1 1 0 0 +EDGE2 4746 2785 -0.96375 0.0542822 1.60602 1 0 1 1 0 0 +EDGE2 4746 2805 -0.988627 0.0339958 -1.57846 1 0 1 1 0 0 +EDGE2 4746 2845 -1.01784 -0.0611293 -1.579 1 0 1 1 0 0 +EDGE2 4746 2765 -0.978203 0.0221427 1.54541 1 0 1 1 0 0 +EDGE2 4746 2625 -0.985926 0.0791042 1.56681 1 0 1 1 0 0 +EDGE2 4746 2806 0.0255948 0.0430005 -0.00154703 1 0 1 1 0 0 +EDGE2 4746 2787 0.982635 0.0172172 -0.0108158 1 0 1 1 0 0 +EDGE2 4746 2807 1.04621 -0.0207747 -0.0138168 1 0 1 1 0 0 +EDGE2 4747 2786 -1.02964 -0.00923121 0.0476942 1 0 1 1 0 0 +EDGE2 4747 4746 -1.00164 -0.0138149 -0.00394932 1 0 1 1 0 0 +EDGE2 4747 2806 -1.02288 0.0440169 0.0194879 1 0 1 1 0 0 +EDGE2 4747 2787 0.0336904 -0.0637528 -0.0126061 1 0 1 1 0 0 +EDGE2 4747 2807 0.0855655 0.0142514 0.0112574 1 0 1 1 0 0 +EDGE2 4747 2788 1.00562 0.00016632 -0.0236702 1 0 1 1 0 0 +EDGE2 4747 2808 1.02909 0.00186854 -0.00947226 1 0 1 1 0 0 +EDGE2 4748 2787 -0.971404 -0.00555867 -0.0169318 1 0 1 1 0 0 +EDGE2 4748 2807 -1.04805 -0.0605911 -0.0232198 1 0 1 1 0 0 +EDGE2 4748 4747 -1.05321 0.0595459 -0.0371958 1 0 1 1 0 0 +EDGE2 4748 2789 1.00613 0.00551892 0.0450286 1 0 1 1 0 0 +EDGE2 4748 2788 0.0199022 0.00165368 0.0135476 1 0 1 1 0 0 +EDGE2 4748 2808 0.015154 0.0628839 -0.00774669 1 0 1 1 0 0 +EDGE2 4748 2809 0.990902 -0.0553872 -0.00197697 1 0 1 1 0 0 +EDGE2 4749 4748 -0.967606 -0.00531119 0.0346491 1 0 1 1 0 0 +EDGE2 4749 2789 -0.0651075 0.00883964 0.00159251 1 0 1 1 0 0 +EDGE2 4749 2788 -1.04696 0.0322091 -0.00484836 1 0 1 1 0 0 +EDGE2 4749 2808 -1.03461 -0.00192702 -0.00690582 1 0 1 1 0 0 +EDGE2 4749 2809 -0.0212824 -0.0168054 -0.011538 1 0 1 1 0 0 +EDGE2 4749 2810 1.08692 -0.035975 -0.00216168 1 0 1 1 0 0 +EDGE2 4749 4610 1.07321 -0.0436852 -3.15783 1 0 1 1 0 0 +EDGE2 4749 2790 0.972859 0.0294439 -0.0235575 1 0 1 1 0 0 +EDGE2 4750 4611 -0.0307019 -1.01078 -1.56668 1 0 1 1 0 0 +EDGE2 4750 2811 0.00408919 1.02989 1.57099 1 0 1 1 0 0 +EDGE2 4750 2791 -0.0201916 1.00604 1.59852 1 0 1 1 0 0 +EDGE2 4750 2789 -1.02923 0.0841886 0.0288638 1 0 1 1 0 0 +EDGE2 4750 4749 -0.965575 -0.0827572 0.00482723 1 0 1 1 0 0 +EDGE2 4750 2809 -0.994254 0.0399892 -0.00874731 1 0 1 1 0 0 +EDGE2 4750 2810 -0.0219461 0.00810911 -0.0289281 1 0 1 1 0 0 +EDGE2 4750 4610 -0.0632774 0.0102946 -3.12113 1 0 1 1 0 0 +EDGE2 4750 2790 -0.00223632 0.0104846 -0.00282056 1 0 1 1 0 0 +EDGE2 4750 4609 1.08354 -0.0231711 -3.15511 1 0 1 1 0 0 +EDGE2 4751 2812 0.952989 -0.0499675 -0.0106558 1 0 1 1 0 0 +EDGE2 4751 2811 0.0476442 0.0958167 0.0622529 1 0 1 1 0 0 +EDGE2 4751 2792 0.918257 -0.0178426 -0.0270544 1 0 1 1 0 0 +EDGE2 4751 2791 -0.0231806 -0.00130509 -0.00138053 1 0 1 1 0 0 +EDGE2 4751 2810 -0.976764 -0.0318482 -1.58054 1 0 1 1 0 0 +EDGE2 4751 4610 -0.991198 0.156851 1.56353 1 0 1 1 0 0 +EDGE2 4751 4750 -0.890525 0.0636407 -1.56124 1 0 1 1 0 0 +EDGE2 4751 2790 -1.01435 0.0103206 -1.57978 1 0 1 1 0 0 +EDGE2 4752 2793 1.07893 0.0755587 -0.0275873 1 0 1 1 0 0 +EDGE2 4752 2813 1.01761 -0.0574921 0.0174528 1 0 1 1 0 0 +EDGE2 4752 2812 -0.00644702 0.00383239 -0.0130155 1 0 1 1 0 0 +EDGE2 4752 2811 -1.02792 0.0685592 0.0391268 1 0 1 1 0 0 +EDGE2 4752 4751 -0.953327 -0.00913831 -0.00834341 1 0 1 1 0 0 +EDGE2 4752 2792 0.0461685 -0.0382289 0.00250592 1 0 1 1 0 0 +EDGE2 4752 2791 -0.945715 -0.014804 -0.0230943 1 0 1 1 0 0 +EDGE2 4753 2793 -0.0345302 -0.0315978 -0.00300779 1 0 1 1 0 0 +EDGE2 4753 2814 0.95639 0.0297807 -0.0152693 1 0 1 1 0 0 +EDGE2 4753 2794 1.03332 0.0710578 0.0241346 1 0 1 1 0 0 +EDGE2 4753 2813 -0.0132897 0.0089111 0.024719 1 0 1 1 0 0 +EDGE2 4753 2812 -1.03083 -0.0473783 0.000405104 1 0 1 1 0 0 +EDGE2 4753 4752 -0.90365 0.0307704 0.0191437 1 0 1 1 0 0 +EDGE2 4753 2792 -0.955221 0.012061 -0.0105238 1 0 1 1 0 0 +EDGE2 4754 2793 -0.988179 0.0225864 -0.0185111 1 0 1 1 0 0 +EDGE2 4754 2815 0.995034 -0.00912162 0.0101312 1 0 1 1 0 0 +EDGE2 4754 4735 0.919972 0.00227739 -3.1216 1 0 1 1 0 0 +EDGE2 4754 4753 -1.02944 0.033644 -0.024641 1 0 1 1 0 0 +EDGE2 4754 2814 -0.0460489 0.0359365 0.000818871 1 0 1 1 0 0 +EDGE2 4754 2795 0.966805 0.064645 0.0126896 1 0 1 1 0 0 +EDGE2 4754 2794 -0.00727461 -0.0215875 0.0263624 1 0 1 1 0 0 +EDGE2 4754 2813 -0.994206 -0.0035006 -0.00781067 1 0 1 1 0 0 +EDGE2 4755 2816 -0.0666734 1.0117 1.56529 1 0 1 1 0 0 +EDGE2 4755 4736 0.0684644 0.950846 1.60441 1 0 1 1 0 0 +EDGE2 4755 2796 0.0275893 1.05512 1.572 1 0 1 1 0 0 +EDGE2 4755 2815 0.0473488 0.0036378 -0.0822518 1 0 1 1 0 0 +EDGE2 4755 4734 0.970803 -0.00153134 -3.14298 1 0 1 1 0 0 +EDGE2 4755 4735 -0.0391399 0.0282578 -3.1787 1 0 1 1 0 0 +EDGE2 4755 2814 -1.07312 0.0388881 0.0102303 1 0 1 1 0 0 +EDGE2 4755 4754 -0.955025 -0.0411956 -0.024942 1 0 1 1 0 0 +EDGE2 4755 2795 0.0327694 -0.00792565 0.00655568 1 0 1 1 0 0 +EDGE2 4755 2794 -1.0183 0.164604 -0.00989244 1 0 1 1 0 0 +EDGE2 4756 2815 -1.03655 0.0101715 1.5809 1 0 1 1 0 0 +EDGE2 4756 4755 -0.995109 -0.0152337 1.58211 1 0 1 1 0 0 +EDGE2 4756 4735 -0.995694 -0.00311379 -1.55578 1 0 1 1 0 0 +EDGE2 4756 2795 -1.01023 0.0153454 1.54514 1 0 1 1 0 0 +EDGE2 4757 4756 -1.06072 -0.0869042 0.0134746 1 0 1 1 0 0 +EDGE2 4758 4757 -0.996945 -0.0153838 -0.0390399 1 0 1 1 0 0 +EDGE2 4759 4758 -0.956274 0.045861 0.0312121 1 0 1 1 0 0 +EDGE2 4759 4720 0.945569 -0.0866452 -3.10016 1 0 1 1 0 0 +EDGE2 4760 4759 -1.03238 0.0393893 0.00376034 1 0 1 1 0 0 +EDGE2 4760 4721 0.0145228 0.985132 1.60651 1 0 1 1 0 0 +EDGE2 4760 4719 0.990343 0.064878 -3.15236 1 0 1 1 0 0 +EDGE2 4760 4720 -0.0696625 -0.0479747 -3.12445 1 0 1 1 0 0 +EDGE2 4761 4760 -1.04185 0.0167553 -1.58255 1 0 1 1 0 0 +EDGE2 4761 4722 0.990683 0.0612141 0.00465781 1 0 1 1 0 0 +EDGE2 4761 4721 -0.0781306 0.0133327 -0.0192123 1 0 1 1 0 0 +EDGE2 4761 4720 -1.08339 0.000613247 1.61449 1 0 1 1 0 0 +EDGE2 4762 4723 0.952914 0.0510717 -0.0153669 1 0 1 1 0 0 +EDGE2 4762 4761 -1.02763 0.0259027 -0.00786347 1 0 1 1 0 0 +EDGE2 4762 4722 0.0172564 0.0928684 -0.029585 1 0 1 1 0 0 +EDGE2 4762 4721 -0.978642 -0.00643982 0.0183538 1 0 1 1 0 0 +EDGE2 4763 4762 -1.06082 -0.0552047 -0.0484894 1 0 1 1 0 0 +EDGE2 4763 4724 1.02553 0.00694293 -0.00894308 1 0 1 1 0 0 +EDGE2 4763 4723 0.00466624 0.0655384 -0.0155615 1 0 1 1 0 0 +EDGE2 4763 4722 -0.934516 0.07715 -0.00419006 1 0 1 1 0 0 +EDGE2 4764 4763 -1.02013 -0.0510956 -0.0132866 1 0 1 1 0 0 +EDGE2 4764 4725 0.98883 0.0260662 -0.0249667 1 0 1 1 0 0 +EDGE2 4764 4724 0.00120228 0.0115556 0.00646122 1 0 1 1 0 0 +EDGE2 4764 4723 -0.968022 -0.0431891 -0.0235711 1 0 1 1 0 0 +EDGE2 4765 4726 0.0284508 1.04076 1.58216 1 0 1 1 0 0 +EDGE2 4765 4764 -0.961013 0.00316331 0.0122634 1 0 1 1 0 0 +EDGE2 4765 4725 -0.0347213 0.0123119 -0.0136922 1 0 1 1 0 0 +EDGE2 4765 4724 -0.943969 -0.0508823 -0.015621 1 0 1 1 0 0 +EDGE2 4766 4725 -0.964706 -0.0441262 1.57183 1 0 1 1 0 0 +EDGE2 4766 4765 -0.983502 0.0479679 1.58481 1 0 1 1 0 0 +EDGE2 4767 4766 -0.941453 -0.0278655 0.015155 1 0 1 1 0 0 +EDGE2 4768 4767 -1.01112 -0.138285 -0.0239056 1 0 1 1 0 0 +EDGE2 4769 4768 -1.06608 0.00303465 -0.000237177 1 0 1 1 0 0 +EDGE2 4770 4769 -0.955992 0.0762802 0.0435343 1 0 1 1 0 0 +EDGE2 4771 4770 -0.984936 0.0653147 -1.56861 1 0 1 1 0 0 +EDGE2 4772 4771 -1.01529 0.0600565 0.0351106 1 0 1 1 0 0 +EDGE2 4773 4772 -0.967545 -0.0516033 -0.0233 1 0 1 1 0 0 +EDGE2 4774 4773 -0.975056 -0.0283773 -0.0309008 1 0 1 1 0 0 +EDGE2 4775 4774 -1.03141 0.0872595 0.00297127 1 0 1 1 0 0 +EDGE2 4776 4775 -0.941392 -0.0385002 1.55044 1 0 1 1 0 0 +EDGE2 4777 4776 -0.953914 -0.0108542 -0.0114877 1 0 1 1 0 0 +EDGE2 4778 4777 -0.919675 0.0937519 -0.00614963 1 0 1 1 0 0 +EDGE2 4779 4778 -0.978176 -0.047611 -0.00813231 1 0 1 1 0 0 +EDGE2 4780 4779 -1.01248 -0.040308 0.0273901 1 0 1 1 0 0 +EDGE2 4781 4780 -0.94813 0.0297826 1.57926 1 0 1 1 0 0 +EDGE2 4782 4781 -1.00632 0.000325003 0.0124988 1 0 1 1 0 0 +EDGE2 4783 4782 -0.953516 -0.039145 -0.00490413 1 0 1 1 0 0 +EDGE2 4784 4783 -0.963991 -0.0499456 0.00221887 1 0 1 1 0 0 +EDGE2 4785 4784 -0.977076 0.00249232 -0.0232782 1 0 1 1 0 0 +EDGE2 4786 4785 -1.04565 -0.0455247 -1.56662 1 0 1 1 0 0 +EDGE2 4787 4786 -0.964601 0.0705552 -0.0189978 1 0 1 1 0 0 +EDGE2 4788 4787 -1.00361 -0.0633724 -0.00649734 1 0 1 1 0 0 +EDGE2 4789 4788 -1.0355 0.0109435 -0.0229172 1 0 1 1 0 0 +EDGE2 4790 4789 -0.931909 0.00366545 0.00403783 1 0 1 1 0 0 +EDGE2 4791 4790 -1.0522 0.0961548 -1.5946 1 0 1 1 0 0 +EDGE2 4792 4791 -1.03266 0.017409 0.0201339 1 0 1 1 0 0 +EDGE2 4793 4792 -1.03391 -0.00629051 0.0224378 1 0 1 1 0 0 +EDGE2 4794 4793 -1.0678 -0.0120851 -0.00813277 1 0 1 1 0 0 +EDGE2 4795 4794 -0.976347 -0.059102 0.0161671 1 0 1 1 0 0 +EDGE2 4796 4795 -0.92561 0.0282241 -1.55116 1 0 1 1 0 0 +EDGE2 4797 4796 -1.009 0.0222392 0.0164535 1 0 1 1 0 0 +EDGE2 4798 4797 -0.968214 0.0754007 -0.000245714 1 0 1 1 0 0 +EDGE2 4799 4780 1.02297 0.0256665 -3.15271 1 0 1 1 0 0 +EDGE2 4799 4798 -0.988451 0.0598454 0.000713912 1 0 1 1 0 0 +EDGE2 4800 4779 0.979179 0.0537555 -3.17173 1 0 1 1 0 0 +EDGE2 4800 4780 0.0671195 0.0694896 -3.14487 1 0 1 1 0 0 +EDGE2 4800 4781 0.00576276 1.02429 1.5252 1 0 1 1 0 0 +EDGE2 4800 4799 -1.03295 -0.0206227 -0.0214471 1 0 1 1 0 0 +EDGE2 4801 4782 1.04081 -0.0212484 0.0192373 1 0 1 1 0 0 +EDGE2 4801 4780 -1.00832 -0.0434012 1.60447 1 0 1 1 0 0 +EDGE2 4801 4800 -0.937209 0.0131751 -1.59293 1 0 1 1 0 0 +EDGE2 4801 4781 -0.0588177 0.0873199 -0.00524967 1 0 1 1 0 0 +EDGE2 4802 4782 -0.0115319 -0.000112056 0.00376296 1 0 1 1 0 0 +EDGE2 4802 4781 -0.927345 0.0191584 0.0198414 1 0 1 1 0 0 +EDGE2 4802 4801 -1.01442 -0.029537 -0.0243436 1 0 1 1 0 0 +EDGE2 4802 4783 0.926281 0.0223162 0.0136934 1 0 1 1 0 0 +EDGE2 4803 4782 -0.976384 0.0631276 -0.00135979 1 0 1 1 0 0 +EDGE2 4803 4802 -1.03786 0.0271888 -0.0131067 1 0 1 1 0 0 +EDGE2 4803 4784 1.01033 -0.0048823 -0.0313772 1 0 1 1 0 0 +EDGE2 4803 4783 -0.0306497 0.0236093 0.00961738 1 0 1 1 0 0 +EDGE2 4804 4784 -0.0813811 -0.0881727 -0.0210297 1 0 1 1 0 0 +EDGE2 4804 4783 -0.994064 -0.035983 -0.0074045 1 0 1 1 0 0 +EDGE2 4804 4803 -0.970701 0.126587 0.0126791 1 0 1 1 0 0 +EDGE2 4804 4785 0.910596 -0.0229425 0.00302129 1 0 1 1 0 0 +EDGE2 4805 4784 -0.968798 0.0476182 -0.0376063 1 0 1 1 0 0 +EDGE2 4805 4804 -0.986522 0.0432658 0.0277017 1 0 1 1 0 0 +EDGE2 4805 4785 0.0268951 8.64607e-05 -0.00151838 1 0 1 1 0 0 +EDGE2 4805 4786 -0.0970028 1.0142 1.58084 1 0 1 1 0 0 +EDGE2 4806 4785 -0.938906 -0.0458814 1.5672 1 0 1 1 0 0 +EDGE2 4806 4805 -1.03277 -0.00539183 1.55437 1 0 1 1 0 0 +EDGE2 4807 4806 -1.03807 -0.0240593 0.00931313 1 0 1 1 0 0 +EDGE2 4808 4807 -0.945708 -0.0154473 -0.00687948 1 0 1 1 0 0 +EDGE2 4809 4770 0.890902 -0.0475144 -3.15031 1 0 1 1 0 0 +EDGE2 4809 4808 -1.03088 -0.04092 0.0275315 1 0 1 1 0 0 +EDGE2 4810 4771 0.00666191 -1.01519 -1.59751 1 0 1 1 0 0 +EDGE2 4810 4769 1.01496 0.071669 -3.14007 1 0 1 1 0 0 +EDGE2 4810 4770 -0.0403108 -0.0394289 -3.14955 1 0 1 1 0 0 +EDGE2 4810 4809 -1.08515 -0.0336519 -0.0124545 1 0 1 1 0 0 +EDGE2 4811 4770 -1.03125 0.0219984 1.58119 1 0 1 1 0 0 +EDGE2 4811 4810 -0.94968 -0.0685877 -1.53453 1 0 1 1 0 0 +EDGE2 4812 4811 -1.0353 0.0480167 0.00820244 1 0 1 1 0 0 +EDGE2 4813 4812 -0.835487 0.048545 0.0125487 1 0 1 1 0 0 +EDGE2 4814 4715 0.911988 -0.0151897 -3.14704 1 0 1 1 0 0 +EDGE2 4814 4813 -1.08605 -0.0173169 -0.00276311 1 0 1 1 0 0 +EDGE2 4815 4715 -0.00728604 -0.104032 -3.14803 1 0 1 1 0 0 +EDGE2 4815 4716 -0.107724 -0.988602 -1.58446 1 0 1 1 0 0 +EDGE2 4815 4814 -0.95952 -0.045708 -0.0224014 1 0 1 1 0 0 +EDGE2 4815 4714 0.979824 -0.0122398 -3.12889 1 0 1 1 0 0 +EDGE2 4816 4715 -1.11297 -0.0551872 1.56466 1 0 1 1 0 0 +EDGE2 4816 4815 -1.00376 0.041408 -1.54737 1 0 1 1 0 0 +EDGE2 4817 4816 -0.986919 -0.0315221 0.0318333 1 0 1 1 0 0 +EDGE2 4818 4817 -1.0531 0.055833 -0.0387682 1 0 1 1 0 0 +EDGE2 4819 4818 -0.990382 0.0362104 0.0138063 1 0 1 1 0 0 +EDGE2 4819 4580 1.11082 0.0183641 -3.13875 1 0 1 1 0 0 +EDGE2 4819 4680 1.0642 0.0612104 -3.1561 1 0 1 1 0 0 +EDGE2 4819 4700 1.08189 -0.0078321 -3.1129 1 0 1 1 0 0 +EDGE2 4820 4819 -0.973478 -0.00522768 0.0298117 1 0 1 1 0 0 +EDGE2 4820 4580 -0.0397963 0.0742657 -3.15713 1 0 1 1 0 0 +EDGE2 4820 4680 -0.0300774 0.00620375 -3.12333 1 0 1 1 0 0 +EDGE2 4820 4700 -0.0255596 -0.0135292 -3.15796 1 0 1 1 0 0 +EDGE2 4820 4681 0.0598137 -1.02505 -1.58449 1 0 1 1 0 0 +EDGE2 4820 4701 -0.0413185 -0.997888 -1.59791 1 0 1 1 0 0 +EDGE2 4820 4581 -0.125662 -1.00891 -1.50365 1 0 1 1 0 0 +EDGE2 4820 4679 0.996446 -0.0544459 -3.13115 1 0 1 1 0 0 +EDGE2 4820 4699 1.03274 -0.0553048 -3.12266 1 0 1 1 0 0 +EDGE2 4820 4579 1.01363 -0.0371324 -3.14246 1 0 1 1 0 0 +EDGE2 4821 4820 -0.966967 -0.053884 -1.54977 1 0 1 1 0 0 +EDGE2 4821 4580 -0.987232 0.105109 1.55559 1 0 1 1 0 0 +EDGE2 4821 4680 -1.01731 -0.0618153 1.53936 1 0 1 1 0 0 +EDGE2 4821 4700 -0.994027 -0.0171758 1.54979 1 0 1 1 0 0 +EDGE2 4822 4821 -0.958633 0.0458486 -0.00707511 1 0 1 1 0 0 +EDGE2 4823 4822 -1.02847 0.00332667 -0.0259391 1 0 1 1 0 0 +EDGE2 4824 4785 1.02184 0.0634503 -3.13814 1 0 1 1 0 0 +EDGE2 4824 4805 0.90828 -0.0143287 -3.12801 1 0 1 1 0 0 +EDGE2 4824 4823 -1.08484 -0.0741041 0.00150441 1 0 1 1 0 0 +EDGE2 4825 4806 0.0266758 1.02603 1.57213 1 0 1 1 0 0 +EDGE2 4825 4784 0.913848 0.0464874 -3.16437 1 0 1 1 0 0 +EDGE2 4825 4804 1.04966 0.047151 -3.16277 1 0 1 1 0 0 +EDGE2 4825 4785 0.050288 -0.032415 -3.15348 1 0 1 1 0 0 +EDGE2 4825 4805 -0.0441692 -0.0270706 -3.12567 1 0 1 1 0 0 +EDGE2 4825 4824 -0.99697 -0.0249955 0.0283253 1 0 1 1 0 0 +EDGE2 4825 4786 -0.0152061 -1.06343 -1.591 1 0 1 1 0 0 +EDGE2 4826 4807 1.05187 -0.0260952 -0.0200413 1 0 1 1 0 0 +EDGE2 4826 4806 0.01708 -0.00344103 0.00172289 1 0 1 1 0 0 +EDGE2 4826 4825 -0.975813 -0.0222034 -1.6037 1 0 1 1 0 0 +EDGE2 4826 4785 -0.916367 0.0213421 1.57222 1 0 1 1 0 0 +EDGE2 4826 4805 -0.944519 0.0305595 1.5862 1 0 1 1 0 0 +EDGE2 4827 4808 1.01418 0.0633069 -0.0364 1 0 1 1 0 0 +EDGE2 4827 4826 -1.00897 -0.0456552 0.0335982 1 0 1 1 0 0 +EDGE2 4827 4807 -0.0736935 -0.0311162 -0.0173884 1 0 1 1 0 0 +EDGE2 4827 4806 -1.0504 0.0158999 -0.0298592 1 0 1 1 0 0 +EDGE2 4828 4827 -1.0021 0.119702 0.0111826 1 0 1 1 0 0 +EDGE2 4828 4809 0.947561 -0.0341404 -0.00448816 1 0 1 1 0 0 +EDGE2 4828 4808 -0.00561534 0.0165157 -0.00202942 1 0 1 1 0 0 +EDGE2 4828 4807 -0.942526 -0.0224257 0.00925676 1 0 1 1 0 0 +EDGE2 4829 4770 0.940086 -0.0174152 -3.12359 1 0 1 1 0 0 +EDGE2 4829 4810 0.976985 -0.0315431 -0.000196202 1 0 1 1 0 0 +EDGE2 4829 4828 -0.953995 0.0484382 -0.0155747 1 0 1 1 0 0 +EDGE2 4829 4809 -0.0624329 -0.094859 -0.0475828 1 0 1 1 0 0 +EDGE2 4829 4808 -1.01187 0.000391584 -0.0108824 1 0 1 1 0 0 +EDGE2 4830 4811 -0.0196851 1.03169 1.60602 1 0 1 1 0 0 +EDGE2 4830 4771 0.0192312 -0.925503 -1.57113 1 0 1 1 0 0 +EDGE2 4830 4769 1.0712 -0.100811 -3.13053 1 0 1 1 0 0 +EDGE2 4830 4770 -0.00742698 -0.0133506 -3.14207 1 0 1 1 0 0 +EDGE2 4830 4810 -0.0315468 -0.0114631 -0.0303076 1 0 1 1 0 0 +EDGE2 4830 4809 -0.955649 -0.0252485 -0.0258518 1 0 1 1 0 0 +EDGE2 4830 4829 -1.06236 0.0540492 0.00914489 1 0 1 1 0 0 +EDGE2 4831 4811 0.0440076 -0.0065263 0.00462327 1 0 1 1 0 0 +EDGE2 4831 4770 -1.04034 -0.0592079 1.56286 1 0 1 1 0 0 +EDGE2 4831 4810 -1.03642 -0.0205062 -1.56871 1 0 1 1 0 0 +EDGE2 4831 4830 -1.06645 0.0166257 -1.57698 1 0 1 1 0 0 +EDGE2 4831 4812 0.959908 -0.035828 -0.00559715 1 0 1 1 0 0 +EDGE2 4832 4811 -1.0483 0.0669329 0.000551026 1 0 1 1 0 0 +EDGE2 4832 4831 -1.04247 -0.126056 -0.00902948 1 0 1 1 0 0 +EDGE2 4832 4813 1.00322 0.0849638 0.00882843 1 0 1 1 0 0 +EDGE2 4832 4812 -0.0339807 0.0952686 -0.0229848 1 0 1 1 0 0 +EDGE2 4833 4813 -0.0793722 0.0254817 -0.024674 1 0 1 1 0 0 +EDGE2 4833 4812 -1.0543 -0.122843 0.0621493 1 0 1 1 0 0 +EDGE2 4833 4832 -0.999001 -0.000209365 -0.0158098 1 0 1 1 0 0 +EDGE2 4833 4814 0.931754 -0.0422992 -0.0165092 1 0 1 1 0 0 +EDGE2 4834 4715 0.988147 0.0770503 -3.14397 1 0 1 1 0 0 +EDGE2 4834 4813 -1.0193 -0.0193272 0.0157639 1 0 1 1 0 0 +EDGE2 4834 4833 -0.991292 0.00480408 0.0296028 1 0 1 1 0 0 +EDGE2 4834 4814 -0.0479001 0.00818999 0.00579362 1 0 1 1 0 0 +EDGE2 4834 4815 0.988004 0.021319 0.0422351 1 0 1 1 0 0 +EDGE2 4835 4715 -0.042281 0.0844725 -3.09862 1 0 1 1 0 0 +EDGE2 4835 4716 -0.0419745 -1.06765 -1.55846 1 0 1 1 0 0 +EDGE2 4835 4814 -0.902272 -0.0165237 0.0167222 1 0 1 1 0 0 +EDGE2 4835 4834 -1.0204 0.00407417 -0.0278672 1 0 1 1 0 0 +EDGE2 4835 4815 -0.0553599 0.083691 -2.552e-05 1 0 1 1 0 0 +EDGE2 4835 4714 1.06146 0.0258898 -3.16514 1 0 1 1 0 0 +EDGE2 4835 4816 0.0450161 1.0688 1.56519 1 0 1 1 0 0 +EDGE2 4836 4715 -0.934382 0.00880755 1.57331 1 0 1 1 0 0 +EDGE2 4836 4835 -1.00414 0.0150921 -1.59291 1 0 1 1 0 0 +EDGE2 4836 4815 -0.981746 -0.00753119 -1.54433 1 0 1 1 0 0 +EDGE2 4836 4816 0.0693359 0.0476431 0.0224862 1 0 1 1 0 0 +EDGE2 4836 4817 0.993281 -0.0524843 0.00173968 1 0 1 1 0 0 +EDGE2 4837 4836 -0.958529 -0.00608958 0.023718 1 0 1 1 0 0 +EDGE2 4837 4816 -1.08087 -0.0734452 0.01353 1 0 1 1 0 0 +EDGE2 4837 4817 -0.0156388 0.0116343 0.0303356 1 0 1 1 0 0 +EDGE2 4837 4818 0.999332 0.109403 0.0136696 1 0 1 1 0 0 +EDGE2 4838 4837 -0.972979 -0.00902997 -0.0150446 1 0 1 1 0 0 +EDGE2 4838 4817 -0.95207 0.0241528 -0.00283428 1 0 1 1 0 0 +EDGE2 4838 4818 -0.122636 -0.0500826 -0.00539672 1 0 1 1 0 0 +EDGE2 4838 4819 0.960749 0.0336356 0.0130578 1 0 1 1 0 0 +EDGE2 4839 4838 -1.09421 -0.00980912 -0.00907104 1 0 1 1 0 0 +EDGE2 4839 4818 -1.02204 -0.00379099 -0.0134674 1 0 1 1 0 0 +EDGE2 4839 4819 -0.0404331 -0.0482008 -0.0226945 1 0 1 1 0 0 +EDGE2 4839 4820 0.95048 -0.00895433 -0.00845786 1 0 1 1 0 0 +EDGE2 4839 4580 0.989458 -0.041413 -3.15292 1 0 1 1 0 0 +EDGE2 4839 4680 0.980212 0.0801743 -3.14158 1 0 1 1 0 0 +EDGE2 4839 4700 1.07075 -0.045078 -3.14958 1 0 1 1 0 0 +EDGE2 4840 4839 -1.00292 -0.0357882 -0.0167101 1 0 1 1 0 0 +EDGE2 4840 4819 -1.06758 -0.0162548 -0.0079294 1 0 1 1 0 0 +EDGE2 4840 4820 0.0265173 -0.0518635 -0.0344956 1 0 1 1 0 0 +EDGE2 4840 4821 -0.0372244 1.02658 1.55238 1 0 1 1 0 0 +EDGE2 4840 4580 0.0432794 -0.0873644 -3.13241 1 0 1 1 0 0 +EDGE2 4840 4680 0.0278679 0.0345975 -3.12513 1 0 1 1 0 0 +EDGE2 4840 4700 -0.0818493 -0.0217618 -3.12202 1 0 1 1 0 0 +EDGE2 4840 4681 0.0525878 -0.98183 -1.57132 1 0 1 1 0 0 +EDGE2 4840 4701 -0.0360432 -1.00397 -1.54618 1 0 1 1 0 0 +EDGE2 4840 4581 -0.0256847 -0.908281 -1.59926 1 0 1 1 0 0 +EDGE2 4840 4679 1.08038 -0.00402877 -3.13788 1 0 1 1 0 0 +EDGE2 4840 4699 1.01018 0.0302453 -3.17084 1 0 1 1 0 0 +EDGE2 4840 4579 1.00571 -0.00931216 -3.12964 1 0 1 1 0 0 +EDGE2 4841 4820 -1.00737 -0.0499251 -1.53163 1 0 1 1 0 0 +EDGE2 4841 4821 -0.00809944 0.0376606 0.0176982 1 0 1 1 0 0 +EDGE2 4841 4822 0.991174 0.0301223 -0.019014 1 0 1 1 0 0 +EDGE2 4841 4840 -1.00104 0.0395865 -1.58692 1 0 1 1 0 0 +EDGE2 4841 4580 -0.941932 -0.0571815 1.57527 1 0 1 1 0 0 +EDGE2 4841 4680 -1.03123 0.019848 1.53228 1 0 1 1 0 0 +EDGE2 4841 4700 -0.889644 -0.0630937 1.58331 1 0 1 1 0 0 +EDGE2 4842 4821 -1.08712 0.0289358 -0.0377921 1 0 1 1 0 0 +EDGE2 4842 4822 0.0441435 0.0182405 0.00835233 1 0 1 1 0 0 +EDGE2 4842 4823 0.956401 0.0612306 0.000733124 1 0 1 1 0 0 +EDGE2 4842 4841 -0.977449 -0.0128732 -0.00776616 1 0 1 1 0 0 +EDGE2 4843 4824 1.01143 -0.0184359 -0.0116652 1 0 1 1 0 0 +EDGE2 4843 4822 -0.962108 -0.0107334 -0.0002493 1 0 1 1 0 0 +EDGE2 4843 4842 -1.00112 -0.0213579 -0.00580577 1 0 1 1 0 0 +EDGE2 4843 4823 -0.0279513 -0.0209895 -0.00977023 1 0 1 1 0 0 +EDGE2 4844 4843 -0.953027 0.0977701 -0.0242942 1 0 1 1 0 0 +EDGE2 4844 4825 0.912137 0.0241935 -0.0140995 1 0 1 1 0 0 +EDGE2 4844 4785 0.938731 0.0327692 -3.10885 1 0 1 1 0 0 +EDGE2 4844 4805 1.00236 -0.00790924 -3.12174 1 0 1 1 0 0 +EDGE2 4844 4824 -0.0528872 0.0365693 -0.00481337 1 0 1 1 0 0 +EDGE2 4844 4823 -0.974171 -0.0356631 0.0190814 1 0 1 1 0 0 +EDGE2 4845 4826 -0.00830254 1.06358 1.54641 1 0 1 1 0 0 +EDGE2 4845 4806 -0.0457704 1.06066 1.5769 1 0 1 1 0 0 +EDGE2 4845 4784 1.00754 0.0533456 -3.12946 1 0 1 1 0 0 +EDGE2 4845 4804 0.883931 -0.0651014 -3.11683 1 0 1 1 0 0 +EDGE2 4845 4825 0.030634 -0.0285949 -0.0183671 1 0 1 1 0 0 +EDGE2 4845 4844 -1.07491 -0.0526622 -0.0135838 1 0 1 1 0 0 +EDGE2 4845 4785 -0.0673223 0.0531581 -3.13596 1 0 1 1 0 0 +EDGE2 4845 4805 -0.00774607 -0.0115658 -3.16842 1 0 1 1 0 0 +EDGE2 4845 4824 -0.914233 -0.0820142 0.0170956 1 0 1 1 0 0 +EDGE2 4845 4786 -0.0148537 -0.971389 -1.58355 1 0 1 1 0 0 +EDGE2 4846 4825 -0.975002 0.072855 1.55968 1 0 1 1 0 0 +EDGE2 4846 4845 -0.94176 -0.0224938 1.59395 1 0 1 1 0 0 +EDGE2 4846 4785 -0.974749 0.0499406 -1.54886 1 0 1 1 0 0 +EDGE2 4846 4805 -0.938016 -0.0106298 -1.53843 1 0 1 1 0 0 +EDGE2 4846 4786 0.0503156 0.0468111 0.0101136 1 0 1 1 0 0 +EDGE2 4846 4787 0.892189 -0.067269 0.0238972 1 0 1 1 0 0 +EDGE2 4847 4786 -1.04681 -0.0779597 -0.0337127 1 0 1 1 0 0 +EDGE2 4847 4846 -1.02131 0.0393341 0.00416933 1 0 1 1 0 0 +EDGE2 4847 4787 -0.0389143 0.0756968 0.00788527 1 0 1 1 0 0 +EDGE2 4847 4788 0.973823 0.0401588 -0.0135432 1 0 1 1 0 0 +EDGE2 4848 4787 -0.885693 0.0313828 -0.0104871 1 0 1 1 0 0 +EDGE2 4848 4847 -1.01861 0.0390711 0.00543855 1 0 1 1 0 0 +EDGE2 4848 4788 -0.0420017 0.0616804 -0.00170414 1 0 1 1 0 0 +EDGE2 4848 4789 1.05137 -0.00145097 -0.0163257 1 0 1 1 0 0 +EDGE2 4849 4788 -1.0777 0.00592655 0.00689215 1 0 1 1 0 0 +EDGE2 4849 4848 -0.939188 -0.00105137 0.00236803 1 0 1 1 0 0 +EDGE2 4849 4789 -0.0748179 -0.0629188 -0.00729117 1 0 1 1 0 0 +EDGE2 4849 4790 1.08398 0.0482519 -0.0476765 1 0 1 1 0 0 +EDGE2 4850 4849 -0.961128 0.0102318 0.0161879 1 0 1 1 0 0 +EDGE2 4850 4789 -1.06127 0.0978025 -0.00329751 1 0 1 1 0 0 +EDGE2 4850 4791 -0.0422347 0.991937 1.6002 1 0 1 1 0 0 +EDGE2 4850 4790 0.0388854 -0.0411574 0.0201345 1 0 1 1 0 0 +EDGE2 4851 4792 0.995991 -0.0190056 -0.0211822 1 0 1 1 0 0 +EDGE2 4851 4791 0.0992489 0.0710028 0.000669173 1 0 1 1 0 0 +EDGE2 4851 4850 -0.946108 0.0062466 -1.59999 1 0 1 1 0 0 +EDGE2 4851 4790 -0.980606 -0.0101034 -1.54131 1 0 1 1 0 0 +EDGE2 4852 4793 1.05637 0.0312219 0.00609153 1 0 1 1 0 0 +EDGE2 4852 4792 -0.0369079 -0.0180085 0.0171421 1 0 1 1 0 0 +EDGE2 4852 4791 -1.01337 0.0722942 -0.025308 1 0 1 1 0 0 +EDGE2 4852 4851 -1.02903 -0.00954938 0.0163472 1 0 1 1 0 0 +EDGE2 4853 4794 0.983817 -0.0606697 0.0238254 1 0 1 1 0 0 +EDGE2 4853 4793 -0.0272316 0.0215859 -0.0135483 1 0 1 1 0 0 +EDGE2 4853 4792 -0.976851 0.0100934 -0.018909 1 0 1 1 0 0 +EDGE2 4853 4852 -0.936741 0.0707816 0.0411367 1 0 1 1 0 0 +EDGE2 4854 4795 0.992267 0.00558051 0.0392086 1 0 1 1 0 0 +EDGE2 4854 4794 -0.124316 -0.067968 -0.014001 1 0 1 1 0 0 +EDGE2 4854 4793 -0.998776 0.0165714 0.00654276 1 0 1 1 0 0 +EDGE2 4854 4853 -0.98951 0.0726859 -0.0333392 1 0 1 1 0 0 +EDGE2 4855 4796 -0.0696234 1.0514 1.55828 1 0 1 1 0 0 +EDGE2 4855 4795 -0.00840806 0.0298555 0.0232067 1 0 1 1 0 0 +EDGE2 4855 4794 -1.00979 -0.0195533 0.00113997 1 0 1 1 0 0 +EDGE2 4855 4854 -1.06032 -0.0184649 -0.0171907 1 0 1 1 0 0 +EDGE2 4856 4797 1.02521 -0.0534272 0.00512886 1 0 1 1 0 0 +EDGE2 4856 4796 -0.0361261 -0.0135703 -0.0309073 1 0 1 1 0 0 +EDGE2 4856 4795 -0.971801 -0.00998847 -1.615 1 0 1 1 0 0 +EDGE2 4856 4855 -1.0373 0.026389 -1.578 1 0 1 1 0 0 +EDGE2 4857 4798 0.99647 0.0258374 0.00391853 1 0 1 1 0 0 +EDGE2 4857 4797 -0.0365941 -0.0255422 0.00408907 1 0 1 1 0 0 +EDGE2 4857 4856 -0.985536 0.0178807 0.0277257 1 0 1 1 0 0 +EDGE2 4857 4796 -0.994047 -0.0260841 -0.00882975 1 0 1 1 0 0 +EDGE2 4858 4799 1.06835 -0.0192733 -0.0230623 1 0 1 1 0 0 +EDGE2 4858 4857 -0.953372 -0.0529151 0.0188172 1 0 1 1 0 0 +EDGE2 4858 4798 0.0939036 0.0240434 0.00012926 1 0 1 1 0 0 +EDGE2 4858 4797 -1.04106 0.114747 -0.0116169 1 0 1 1 0 0 +EDGE2 4859 4780 0.986704 -0.0263215 -3.13903 1 0 1 1 0 0 +EDGE2 4859 4800 1.02996 0.0203668 0.0385829 1 0 1 1 0 0 +EDGE2 4859 4799 -0.011312 0.045454 -0.0141149 1 0 1 1 0 0 +EDGE2 4859 4798 -1.01211 0.0409331 0.0156088 1 0 1 1 0 0 +EDGE2 4859 4858 -1.01254 -0.0125029 -0.0171593 1 0 1 1 0 0 +EDGE2 4860 4779 0.984596 -0.089236 -3.11514 1 0 1 1 0 0 +EDGE2 4860 4780 -0.0128388 -0.0523945 -3.12198 1 0 1 1 0 0 +EDGE2 4860 4800 -0.155172 -0.0658744 -0.00251521 1 0 1 1 0 0 +EDGE2 4860 4859 -0.985495 0.00687715 -0.0254638 1 0 1 1 0 0 +EDGE2 4860 4781 -0.11806 1.0594 1.5634 1 0 1 1 0 0 +EDGE2 4860 4801 0.072087 1.01718 1.54317 1 0 1 1 0 0 +EDGE2 4860 4799 -0.941382 -0.0787219 -0.0251837 1 0 1 1 0 0 +EDGE2 4861 4782 0.966531 0.0040054 0.0373967 1 0 1 1 0 0 +EDGE2 4861 4780 -0.971202 -0.0383251 1.5718 1 0 1 1 0 0 +EDGE2 4861 4800 -1.02585 -0.0290888 -1.55536 1 0 1 1 0 0 +EDGE2 4861 4860 -1.02054 0.0769137 -1.56744 1 0 1 1 0 0 +EDGE2 4861 4781 -0.0129406 0.0547837 0.0163938 1 0 1 1 0 0 +EDGE2 4861 4801 0.0545999 0.0409169 -0.00332109 1 0 1 1 0 0 +EDGE2 4861 4802 1.04178 0.00206281 0.00441367 1 0 1 1 0 0 +EDGE2 4862 4782 -0.126548 -0.00885488 0.0147189 1 0 1 1 0 0 +EDGE2 4862 4781 -0.987395 -0.0547525 -0.00474906 1 0 1 1 0 0 +EDGE2 4862 4801 -0.999206 -0.0231882 -0.0269439 1 0 1 1 0 0 +EDGE2 4862 4861 -0.961372 -0.0452852 0.000360261 1 0 1 1 0 0 +EDGE2 4862 4802 0.0175722 0.0202052 0.0148709 1 0 1 1 0 0 +EDGE2 4862 4783 0.942224 0.0275355 -0.0213744 1 0 1 1 0 0 +EDGE2 4862 4803 0.964839 0.00860359 -0.0065363 1 0 1 1 0 0 +EDGE2 4863 4782 -1.00849 -0.0301304 0.00846377 1 0 1 1 0 0 +EDGE2 4863 4802 -1.01888 0.00702162 0.00755918 1 0 1 1 0 0 +EDGE2 4863 4862 -0.942614 -0.0209856 -0.0240404 1 0 1 1 0 0 +EDGE2 4863 4784 0.997761 -0.00128463 -0.0174225 1 0 1 1 0 0 +EDGE2 4863 4783 -0.0287355 0.00773795 -0.0509424 1 0 1 1 0 0 +EDGE2 4863 4803 0.0244807 -0.0755325 0.00625424 1 0 1 1 0 0 +EDGE2 4863 4804 1.07258 0.0614374 0.0108784 1 0 1 1 0 0 +EDGE2 4864 4784 0.0646808 0.0898976 0.023006 1 0 1 1 0 0 +EDGE2 4864 4783 -0.956606 -0.0546391 -0.0321814 1 0 1 1 0 0 +EDGE2 4864 4863 -0.948629 0.061933 0.00589899 1 0 1 1 0 0 +EDGE2 4864 4803 -1.09173 0.0795408 -0.00300291 1 0 1 1 0 0 +EDGE2 4864 4804 0.0419262 -0.0361025 -0.00050001 1 0 1 1 0 0 +EDGE2 4864 4825 0.936895 -0.0100967 -3.11133 1 0 1 1 0 0 +EDGE2 4864 4845 1.05172 0.0139632 -3.16786 1 0 1 1 0 0 +EDGE2 4864 4785 1.00831 0.112496 -0.00251492 1 0 1 1 0 0 +EDGE2 4864 4805 1.06463 0.0430468 -0.0264361 1 0 1 1 0 0 +EDGE2 4865 4826 -0.0905947 -1.07596 -1.55096 1 0 1 1 0 0 +EDGE2 4865 4806 -0.0165443 -0.949508 -1.56994 1 0 1 1 0 0 +EDGE2 4865 4784 -1.03078 0.0417791 0.00660046 1 0 1 1 0 0 +EDGE2 4865 4864 -0.955537 0.00705796 0.00388818 1 0 1 1 0 0 +EDGE2 4865 4804 -1.05617 -0.0667259 -0.0292309 1 0 1 1 0 0 +EDGE2 4865 4825 0.00396771 -0.0301459 -3.15438 1 0 1 1 0 0 +EDGE2 4865 4845 -0.0754472 0.00937646 -3.15089 1 0 1 1 0 0 +EDGE2 4865 4844 0.915927 -0.0181885 -3.14567 1 0 1 1 0 0 +EDGE2 4865 4785 0.00164913 0.0854283 0.0162301 1 0 1 1 0 0 +EDGE2 4865 4805 -0.0548085 0.0185215 0.0284487 1 0 1 1 0 0 +EDGE2 4865 4824 1.01373 0.0488683 -3.11853 1 0 1 1 0 0 +EDGE2 4865 4786 -0.00118066 1.0119 1.58007 1 0 1 1 0 0 +EDGE2 4865 4846 -0.0450044 0.927649 1.59447 1 0 1 1 0 0 +EDGE2 4866 4825 -1.01652 0.00393997 1.56218 1 0 1 1 0 0 +EDGE2 4866 4865 -0.97815 0.045367 -1.5502 1 0 1 1 0 0 +EDGE2 4866 4845 -1.05825 -0.0255617 1.55949 1 0 1 1 0 0 +EDGE2 4866 4785 -0.939653 0.0333605 -1.57728 1 0 1 1 0 0 +EDGE2 4866 4805 -1.01975 -0.00725177 -1.55532 1 0 1 1 0 0 +EDGE2 4866 4786 -0.0348697 0.0368943 -0.044117 1 0 1 1 0 0 +EDGE2 4866 4846 -0.00279768 0.046152 0.0133105 1 0 1 1 0 0 +EDGE2 4866 4787 0.990362 -0.02793 0.00788127 1 0 1 1 0 0 +EDGE2 4866 4847 0.934573 0.017379 -0.0247892 1 0 1 1 0 0 +EDGE2 4867 4786 -1.03175 -0.0913665 -0.0180732 1 0 1 1 0 0 +EDGE2 4867 4846 -0.924968 0.0220099 0.0138254 1 0 1 1 0 0 +EDGE2 4867 4866 -0.882684 -0.0689603 0.00472745 1 0 1 1 0 0 +EDGE2 4867 4787 0.0219842 0.0626007 0.0178654 1 0 1 1 0 0 +EDGE2 4867 4847 0.0564966 0.0826471 -0.018646 1 0 1 1 0 0 +EDGE2 4867 4788 0.921824 0.0101704 0.00317703 1 0 1 1 0 0 +EDGE2 4867 4848 1.00846 0.00707416 -0.0329114 1 0 1 1 0 0 +EDGE2 4868 4787 -1.01129 0.0160181 0.0289916 1 0 1 1 0 0 +EDGE2 4868 4847 -0.964924 -0.0309283 0.00379487 1 0 1 1 0 0 +EDGE2 4868 4867 -1.0348 0.0124831 0.0214832 1 0 1 1 0 0 +EDGE2 4868 4788 -0.0390324 -0.00703954 0.0322528 1 0 1 1 0 0 +EDGE2 4868 4848 -0.00954867 0.0754511 0.0245682 1 0 1 1 0 0 +EDGE2 4868 4849 0.96949 -0.0665226 0.000262697 1 0 1 1 0 0 +EDGE2 4868 4789 1.01126 0.0076513 -0.000729712 1 0 1 1 0 0 +EDGE2 4869 4788 -0.935624 0.0788576 -0.0257981 1 0 1 1 0 0 +EDGE2 4869 4848 -0.986201 -0.0430085 0.00520675 1 0 1 1 0 0 +EDGE2 4869 4868 -1.05677 -0.0496425 0.0149989 1 0 1 1 0 0 +EDGE2 4869 4849 0.0512305 -0.0652354 -0.00424147 1 0 1 1 0 0 +EDGE2 4869 4789 0.0892608 0.0547198 -0.0180509 1 0 1 1 0 0 +EDGE2 4869 4850 0.943508 0.0131447 0.00788314 1 0 1 1 0 0 +EDGE2 4869 4790 1.03668 -0.0664234 -0.0310282 1 0 1 1 0 0 +EDGE2 4870 4849 -0.927404 0.00544809 -0.00610406 1 0 1 1 0 0 +EDGE2 4870 4869 -1.00293 0.0076652 -0.0515979 1 0 1 1 0 0 +EDGE2 4870 4789 -1.05698 -0.0101642 -0.00515127 1 0 1 1 0 0 +EDGE2 4870 4791 -0.0199642 1.03965 1.59096 1 0 1 1 0 0 +EDGE2 4870 4851 -0.0197589 1.04617 1.59991 1 0 1 1 0 0 +EDGE2 4870 4850 0.0176976 0.0728037 -0.0239758 1 0 1 1 0 0 +EDGE2 4870 4790 0.0243323 -0.00413326 -0.0136454 1 0 1 1 0 0 +EDGE2 4871 4850 -0.989137 0.0291333 1.57275 1 0 1 1 0 0 +EDGE2 4871 4870 -0.940709 -0.0795417 1.53745 1 0 1 1 0 0 +EDGE2 4871 4790 -0.957908 -0.0155952 1.56565 1 0 1 1 0 0 +EDGE2 4872 4871 -0.996159 -0.000707799 -0.027264 1 0 1 1 0 0 +EDGE2 4873 4872 -1.02464 0.024297 -0.00590268 1 0 1 1 0 0 +EDGE2 4874 4873 -1.03527 -0.00294663 -0.0171106 1 0 1 1 0 0 +EDGE2 4874 4575 1.08945 -0.0375697 -3.17222 1 0 1 1 0 0 +EDGE2 4874 4695 1.03042 -0.0520132 -3.13369 1 0 1 1 0 0 +EDGE2 4874 4675 0.928969 0.0289548 -3.14055 1 0 1 1 0 0 +EDGE2 4874 3615 0.98049 -0.0468039 -3.12675 1 0 1 1 0 0 +EDGE2 4875 4676 -0.0469903 -0.992324 -1.55195 1 0 1 1 0 0 +EDGE2 4875 4696 0.0392304 -1.00866 -1.54988 1 0 1 1 0 0 +EDGE2 4875 4576 0.0254609 -0.986158 -1.57904 1 0 1 1 0 0 +EDGE2 4875 4874 -1.07791 -0.00301117 -0.0052514 1 0 1 1 0 0 +EDGE2 4875 4575 0.0369254 0.028362 -3.12292 1 0 1 1 0 0 +EDGE2 4875 4695 0.00519425 0.088447 -3.15504 1 0 1 1 0 0 +EDGE2 4875 4675 -0.0117984 -0.0887923 -3.17733 1 0 1 1 0 0 +EDGE2 4875 3615 0.029255 -0.040363 -3.15829 1 0 1 1 0 0 +EDGE2 4875 3616 0.0409731 0.958338 1.56166 1 0 1 1 0 0 +EDGE2 4875 4574 1.11292 0.0977237 -3.13646 1 0 1 1 0 0 +EDGE2 4875 4674 1.02762 0.0298384 -3.16208 1 0 1 1 0 0 +EDGE2 4875 4694 0.937131 -0.00520084 -3.16811 1 0 1 1 0 0 +EDGE2 4875 3614 1.08427 0.00823227 -3.09366 1 0 1 1 0 0 +EDGE2 4876 4575 -0.977006 -0.0145153 1.53617 1 0 1 1 0 0 +EDGE2 4876 4695 -1.03411 0.0902265 1.58514 1 0 1 1 0 0 +EDGE2 4876 4875 -1.05089 -0.0844494 -1.55283 1 0 1 1 0 0 +EDGE2 4876 4675 -1.01296 0.0998319 1.5862 1 0 1 1 0 0 +EDGE2 4876 3615 -0.965644 -0.0349022 1.58161 1 0 1 1 0 0 +EDGE2 4876 3617 1.00873 0.00348507 0.00287061 1 0 1 1 0 0 +EDGE2 4876 3616 0.0515475 -0.00342458 0.0219138 1 0 1 1 0 0 +EDGE2 4877 3617 -0.0912084 -0.00993319 0.0164859 1 0 1 1 0 0 +EDGE2 4877 4876 -0.972897 -0.042493 -0.0249579 1 0 1 1 0 0 +EDGE2 4877 3616 -0.950991 0.0859822 0.0104202 1 0 1 1 0 0 +EDGE2 4877 3618 0.967954 -0.0470018 -0.00501666 1 0 1 1 0 0 +EDGE2 4878 3619 1.00727 -0.0572363 0.00331063 1 0 1 1 0 0 +EDGE2 4878 3617 -0.931459 0.0148726 -0.0349499 1 0 1 1 0 0 +EDGE2 4878 4877 -1.0126 -0.0293355 0.00927647 1 0 1 1 0 0 +EDGE2 4878 3618 -0.0659359 -0.0307386 0.0106913 1 0 1 1 0 0 +EDGE2 4879 3619 0.00356828 -0.0293754 -0.0214934 1 0 1 1 0 0 +EDGE2 4879 3618 -1.06816 -0.050028 0.00997931 1 0 1 1 0 0 +EDGE2 4879 4878 -0.904017 -0.105559 -0.0311391 1 0 1 1 0 0 +EDGE2 4879 3620 1.00967 0.0201929 -0.0268491 1 0 1 1 0 0 +EDGE2 4880 3619 -1.00761 0.00928431 0.017161 1 0 1 1 0 0 +EDGE2 4880 4879 -0.915062 0.0727884 0.00900361 1 0 1 1 0 0 +EDGE2 4880 3620 -0.0422813 -0.0171991 -0.00970716 1 0 1 1 0 0 +EDGE2 4880 3621 -0.0194194 -0.948504 -1.60892 1 0 1 1 0 0 +EDGE2 4881 4880 -1.01434 -0.0105773 1.56419 1 0 1 1 0 0 +EDGE2 4881 3620 -0.847488 0.0859189 1.59595 1 0 1 1 0 0 +EDGE2 4881 3621 0.10786 -0.0363934 -0.00436561 1 0 1 1 0 0 +EDGE2 4881 3622 0.998204 0.0104206 -0.000896103 1 0 1 1 0 0 +EDGE2 4882 3621 -1.05124 -0.134777 -0.0168847 1 0 1 1 0 0 +EDGE2 4882 4881 -1.02912 -0.0326982 -0.0221849 1 0 1 1 0 0 +EDGE2 4882 3622 0.00682184 0.019732 -0.021455 1 0 1 1 0 0 +EDGE2 4882 3623 1.09389 0.0106979 -0.014351 1 0 1 1 0 0 +EDGE2 4883 3622 -0.959326 -0.0154551 -0.0314369 1 0 1 1 0 0 +EDGE2 4883 4882 -1.02425 -0.0242316 0.0237607 1 0 1 1 0 0 +EDGE2 4883 3623 -0.00899701 -0.00953845 -0.0161476 1 0 1 1 0 0 +EDGE2 4883 3624 0.92762 -0.0475369 0.0145929 1 0 1 1 0 0 +EDGE2 4884 3623 -0.965284 -0.00069975 -0.00391641 1 0 1 1 0 0 +EDGE2 4884 4883 -0.92012 -0.00410548 -0.000579553 1 0 1 1 0 0 +EDGE2 4884 4565 1.08295 -0.00132695 -3.13784 1 0 1 1 0 0 +EDGE2 4884 3624 0.0171366 0.0262363 0.0234932 1 0 1 1 0 0 +EDGE2 4884 3625 1.04611 0.0319046 0.0201315 1 0 1 1 0 0 +EDGE2 4885 4884 -1.00152 -0.0222688 -0.0193923 1 0 1 1 0 0 +EDGE2 4885 4566 0.0440104 -1.02253 -1.55118 1 0 1 1 0 0 +EDGE2 4885 3626 0.0314093 -0.932508 -1.54879 1 0 1 1 0 0 +EDGE2 4885 4565 0.011112 -0.0409054 -3.16647 1 0 1 1 0 0 +EDGE2 4885 3624 -1.02901 -0.00689787 0.0348659 1 0 1 1 0 0 +EDGE2 4885 3625 -0.0291785 -0.00292385 0.00837152 1 0 1 1 0 0 +EDGE2 4885 4564 0.976644 -0.0432105 -3.09776 1 0 1 1 0 0 +EDGE2 4886 4565 -0.963168 -0.0210427 1.5603 1 0 1 1 0 0 +EDGE2 4886 4885 -0.981907 0.0126551 -1.58307 1 0 1 1 0 0 +EDGE2 4886 3625 -0.952853 -0.0349591 -1.59331 1 0 1 1 0 0 +EDGE2 4887 4886 -0.998731 -0.0235357 0.00897544 1 0 1 1 0 0 +EDGE2 4888 4887 -0.957308 -0.0876089 -0.00917566 1 0 1 1 0 0 +EDGE2 4889 4888 -0.988939 0.0625046 0.0332408 1 0 1 1 0 0 +EDGE2 4890 4889 -1.04273 0.0073775 0.000262254 1 0 1 1 0 0 +EDGE2 4891 4890 -1.02979 0.00116041 1.57908 1 0 1 1 0 0 +EDGE2 4892 4891 -0.916225 -0.0416047 0.0142445 1 0 1 1 0 0 +EDGE2 4893 4892 -0.954229 -0.0582862 -0.0101994 1 0 1 1 0 0 +EDGE2 4894 4893 -1.05177 0.0103947 0.0115461 1 0 1 1 0 0 +EDGE2 4894 4555 0.990348 -0.0192581 -3.14005 1 0 1 1 0 0 +EDGE2 4895 4894 -0.975915 0.0268458 -0.0109191 1 0 1 1 0 0 +EDGE2 4895 4556 -0.00360804 -1.02672 -1.57927 1 0 1 1 0 0 +EDGE2 4895 4555 0.0243822 0.0418387 -3.17491 1 0 1 1 0 0 +EDGE2 4895 4554 0.963955 0.0651406 -3.15983 1 0 1 1 0 0 +EDGE2 4896 4555 -1.03378 -0.0010137 1.57472 1 0 1 1 0 0 +EDGE2 4896 4895 -0.944692 0.0271018 -1.5903 1 0 1 1 0 0 +EDGE2 4897 4896 -0.989186 0.0647733 -0.0233122 1 0 1 1 0 0 +EDGE2 4898 4897 -0.950636 0.0268783 -0.0149027 1 0 1 1 0 0 +EDGE2 4899 4898 -0.935644 -0.0180743 -0.0276457 1 0 1 1 0 0 +EDGE2 4900 4899 -1.10619 -0.00251985 0.0177924 1 0 1 1 0 0 +EDGE2 4901 4900 -0.9853 0.0210439 -1.56273 1 0 1 1 0 0 +EDGE2 4902 4901 -1.04338 0.0259953 -0.00140139 1 0 1 1 0 0 +EDGE2 4903 4902 -1.0759 0.0683426 -0.00466869 1 0 1 1 0 0 +EDGE2 4904 4903 -1.00944 0.0657576 0.0110058 1 0 1 1 0 0 +EDGE2 4905 4904 -1.04402 -0.00785137 0.0121855 1 0 1 1 0 0 +EDGE2 4906 4905 -0.945481 0.0257388 -1.54922 1 0 1 1 0 0 +EDGE2 4907 4906 -0.994115 0.0189974 0.0145326 1 0 1 1 0 0 +EDGE2 4908 4907 -0.999693 -0.0347176 0.000880472 1 0 1 1 0 0 +EDGE2 4909 4890 0.995453 0.0481009 -3.12563 1 0 1 1 0 0 +EDGE2 4909 4908 -0.98048 0.108991 0.0121049 1 0 1 1 0 0 +EDGE2 4910 4890 -0.0259889 0.07496 -3.10667 1 0 1 1 0 0 +EDGE2 4910 4889 0.970094 -0.0764392 -3.15579 1 0 1 1 0 0 +EDGE2 4910 4891 0.0256398 0.980084 1.59529 1 0 1 1 0 0 +EDGE2 4910 4909 -1.029 -0.0121341 0.0142128 1 0 1 1 0 0 +EDGE2 4911 4890 -1.0277 -0.00562561 1.55181 1 0 1 1 0 0 +EDGE2 4911 4910 -1.05235 -0.090139 -1.57337 1 0 1 1 0 0 +EDGE2 4911 4891 -0.0511638 -0.00862764 -0.0314871 1 0 1 1 0 0 +EDGE2 4911 4892 1.10581 -0.0478088 -0.0273708 1 0 1 1 0 0 +EDGE2 4912 4891 -1.04082 0.0201281 0.0238432 1 0 1 1 0 0 +EDGE2 4912 4911 -1.04621 0.0387973 -0.0168529 1 0 1 1 0 0 +EDGE2 4912 4892 0.0183243 -0.0934188 -0.0087272 1 0 1 1 0 0 +EDGE2 4912 4893 1.04195 -0.00748562 -0.021828 1 0 1 1 0 0 +EDGE2 4913 4912 -1.04201 -0.0549614 -0.00640704 1 0 1 1 0 0 +EDGE2 4913 4892 -0.970617 -0.0519523 -0.0511672 1 0 1 1 0 0 +EDGE2 4913 4893 0.0315645 0.0461897 -0.00274475 1 0 1 1 0 0 +EDGE2 4913 4894 1.02636 0.0582869 -0.00730158 1 0 1 1 0 0 +EDGE2 4914 4913 -0.976499 0.033214 -0.016381 1 0 1 1 0 0 +EDGE2 4914 4893 -0.968606 0.027835 2.08709e-05 1 0 1 1 0 0 +EDGE2 4914 4894 0.0451882 0.0636954 -0.00140563 1 0 1 1 0 0 +EDGE2 4914 4555 0.962296 0.00355747 -3.1562 1 0 1 1 0 0 +EDGE2 4914 4895 0.990668 0.0760514 -0.024187 1 0 1 1 0 0 +EDGE2 4915 4894 -0.939833 -0.0114895 -0.0086798 1 0 1 1 0 0 +EDGE2 4915 4914 -0.990833 0.0390216 0.0091572 1 0 1 1 0 0 +EDGE2 4915 4556 0.0283249 -1.07231 -1.57583 1 0 1 1 0 0 +EDGE2 4915 4555 0.0216206 -0.0236572 -3.14276 1 0 1 1 0 0 +EDGE2 4915 4895 -0.0656702 0.063889 0.0187654 1 0 1 1 0 0 +EDGE2 4915 4554 0.975905 -0.0505796 -3.14164 1 0 1 1 0 0 +EDGE2 4915 4896 -0.0421125 0.983125 1.61534 1 0 1 1 0 0 +EDGE2 4916 4555 -1.06427 0.0202875 1.60407 1 0 1 1 0 0 +EDGE2 4916 4895 -0.932544 0.0365887 -1.56645 1 0 1 1 0 0 +EDGE2 4916 4915 -1.0459 -0.100204 -1.56465 1 0 1 1 0 0 +EDGE2 4916 4897 0.980437 -0.0477197 0.00100831 1 0 1 1 0 0 +EDGE2 4916 4896 -0.03035 0.0785098 -0.0262095 1 0 1 1 0 0 +EDGE2 4917 4916 -1.01379 -0.0555295 -0.00804339 1 0 1 1 0 0 +EDGE2 4917 4898 0.967206 0.0531132 -0.0238237 1 0 1 1 0 0 +EDGE2 4917 4897 -0.0630293 -0.0186192 0.0123317 1 0 1 1 0 0 +EDGE2 4917 4896 -0.980204 -0.0234558 -0.010184 1 0 1 1 0 0 +EDGE2 4918 4898 -0.0232793 0.034651 0.0123846 1 0 1 1 0 0 +EDGE2 4918 4897 -1.02384 0.0004221 0.01043 1 0 1 1 0 0 +EDGE2 4918 4917 -0.942406 0.0290234 0.036269 1 0 1 1 0 0 +EDGE2 4918 4899 0.965091 -0.0267643 -0.0163342 1 0 1 1 0 0 +EDGE2 4919 4900 0.998394 -0.0324589 -0.00679614 1 0 1 1 0 0 +EDGE2 4919 4898 -1.05552 -0.0943106 -0.00526199 1 0 1 1 0 0 +EDGE2 4919 4918 -1.00731 0.0490386 -0.00717311 1 0 1 1 0 0 +EDGE2 4919 4899 -0.0031265 0.0216801 0.00455951 1 0 1 1 0 0 +EDGE2 4920 4900 -0.013384 0.0425835 0.018065 1 0 1 1 0 0 +EDGE2 4920 4901 -0.0380975 1.04868 1.51556 1 0 1 1 0 0 +EDGE2 4920 4899 -0.992935 0.11475 0.0170714 1 0 1 1 0 0 +EDGE2 4920 4919 -0.986352 0.046314 0.00300555 1 0 1 1 0 0 +EDGE2 4921 4902 0.871598 0.0475606 0.0265032 1 0 1 1 0 0 +EDGE2 4921 4900 -1.03326 -0.0388793 -1.57011 1 0 1 1 0 0 +EDGE2 4921 4901 0.0319723 0.0106748 -0.0285079 1 0 1 1 0 0 +EDGE2 4921 4920 -1.04968 -0.00117042 -1.57568 1 0 1 1 0 0 +EDGE2 4922 4921 -1.01294 -0.0530598 -0.00769694 1 0 1 1 0 0 +EDGE2 4922 4903 1.02155 0.0296009 0.00110549 1 0 1 1 0 0 +EDGE2 4922 4902 -0.032096 -0.0664845 -0.0286681 1 0 1 1 0 0 +EDGE2 4922 4901 -1.00958 0.0440906 -0.0432563 1 0 1 1 0 0 +EDGE2 4923 4904 0.962897 0.064234 -0.0180418 1 0 1 1 0 0 +EDGE2 4923 4922 -0.988501 -0.0249542 0.0126752 1 0 1 1 0 0 +EDGE2 4923 4903 -0.00701409 0.0298546 -0.0017018 1 0 1 1 0 0 +EDGE2 4923 4902 -0.986711 -0.0032851 0.00119841 1 0 1 1 0 0 +EDGE2 4924 4905 0.96475 -0.0578739 -0.00140791 1 0 1 1 0 0 +EDGE2 4924 4923 -1.02268 0.0929153 -0.0447334 1 0 1 1 0 0 +EDGE2 4924 4904 -0.0432513 -0.0274535 -0.00890581 1 0 1 1 0 0 +EDGE2 4924 4903 -0.901791 -0.0194677 0.025792 1 0 1 1 0 0 +EDGE2 4925 4905 -0.001167 0.0134993 -0.0025823 1 0 1 1 0 0 +EDGE2 4925 4906 -0.0859248 1.02545 1.56595 1 0 1 1 0 0 +EDGE2 4925 4924 -0.962986 0.0149328 -0.0158077 1 0 1 1 0 0 +EDGE2 4925 4904 -0.999155 -0.0256048 -0.0145533 1 0 1 1 0 0 +EDGE2 4926 4905 -0.938264 -0.00374208 -1.5706 1 0 1 1 0 0 +EDGE2 4926 4906 -0.0480859 0.0534533 -0.00996016 1 0 1 1 0 0 +EDGE2 4926 4907 0.960709 0.0124028 -0.00701107 1 0 1 1 0 0 +EDGE2 4926 4925 -0.935031 0.00287409 -1.56956 1 0 1 1 0 0 +EDGE2 4927 4908 1.01282 0.00447689 0.0318499 1 0 1 1 0 0 +EDGE2 4927 4906 -1.01316 -0.0615721 -0.00334158 1 0 1 1 0 0 +EDGE2 4927 4926 -0.964769 0.00551491 -0.00704712 1 0 1 1 0 0 +EDGE2 4927 4907 0.0957515 0.0777898 -0.0168723 1 0 1 1 0 0 +EDGE2 4928 4927 -0.989396 0.00665783 0.0194166 1 0 1 1 0 0 +EDGE2 4928 4909 1.08663 -0.0107533 -0.0242994 1 0 1 1 0 0 +EDGE2 4928 4908 0.00576815 0.00780445 0.00407627 1 0 1 1 0 0 +EDGE2 4928 4907 -0.955503 -0.0564906 0.0327027 1 0 1 1 0 0 +EDGE2 4929 4890 0.979245 0.0957527 -3.13067 1 0 1 1 0 0 +EDGE2 4929 4910 0.929287 -0.0134155 -0.0232163 1 0 1 1 0 0 +EDGE2 4929 4928 -0.989978 0.00842105 0.018315 1 0 1 1 0 0 +EDGE2 4929 4909 -0.02056 -0.0691853 -0.00448916 1 0 1 1 0 0 +EDGE2 4929 4908 -0.962833 -0.0520534 0.0297619 1 0 1 1 0 0 +EDGE2 4930 4890 -0.0704783 -0.0603969 -3.1243 1 0 1 1 0 0 +EDGE2 4930 4889 1.02705 -0.0453281 -3.12271 1 0 1 1 0 0 +EDGE2 4930 4910 0.0452123 0.0443753 -0.0206082 1 0 1 1 0 0 +EDGE2 4930 4891 -0.0278023 1.03397 1.57058 1 0 1 1 0 0 +EDGE2 4930 4911 -0.0634297 1.03221 1.57317 1 0 1 1 0 0 +EDGE2 4930 4909 -0.941835 -0.00719328 -0.0109516 1 0 1 1 0 0 +EDGE2 4930 4929 -0.969315 -0.0371629 -0.0110744 1 0 1 1 0 0 +EDGE2 4931 4890 -0.970254 -0.0174333 1.54461 1 0 1 1 0 0 +EDGE2 4931 4930 -1.0014 -0.0340014 -1.6021 1 0 1 1 0 0 +EDGE2 4931 4910 -0.976972 -0.0319758 -1.58211 1 0 1 1 0 0 +EDGE2 4931 4912 1.05337 -0.00488674 -0.0159999 1 0 1 1 0 0 +EDGE2 4931 4891 0.010568 0.000947398 0.0210015 1 0 1 1 0 0 +EDGE2 4931 4911 0.0157991 -0.0695712 -0.0145224 1 0 1 1 0 0 +EDGE2 4931 4892 0.985002 -0.0196298 -0.0583345 1 0 1 1 0 0 +EDGE2 4932 4912 -0.0757775 -0.131178 -0.0250583 1 0 1 1 0 0 +EDGE2 4932 4891 -0.991784 0.00865865 -0.0346964 1 0 1 1 0 0 +EDGE2 4932 4911 -1.01452 0.00416996 -0.0131032 1 0 1 1 0 0 +EDGE2 4932 4931 -1.0382 0.0319623 0.028227 1 0 1 1 0 0 +EDGE2 4932 4913 0.94793 -0.0490686 0.0144052 1 0 1 1 0 0 +EDGE2 4932 4892 0.0286656 0.0518962 0.00704044 1 0 1 1 0 0 +EDGE2 4932 4893 0.993773 0.08216 -0.0100992 1 0 1 1 0 0 +EDGE2 4933 4912 -0.899155 0.0476444 0.0243363 1 0 1 1 0 0 +EDGE2 4933 4932 -1.00873 -0.0311881 0.0075686 1 0 1 1 0 0 +EDGE2 4933 4913 0.0231222 0.0221665 0.0151605 1 0 1 1 0 0 +EDGE2 4933 4892 -0.95156 0.0374932 0.0241807 1 0 1 1 0 0 +EDGE2 4933 4893 -0.0421525 -0.041663 0.00540472 1 0 1 1 0 0 +EDGE2 4933 4894 1.0448 0.0480917 -0.00582346 1 0 1 1 0 0 +EDGE2 4933 4914 0.92792 -0.048553 -0.00702735 1 0 1 1 0 0 +EDGE2 4934 4913 -1.048 -0.0438417 0.00572277 1 0 1 1 0 0 +EDGE2 4934 4933 -1.06742 0.0170368 -0.0334274 1 0 1 1 0 0 +EDGE2 4934 4893 -0.994318 -0.00742265 0.0162364 1 0 1 1 0 0 +EDGE2 4934 4894 0.099659 -0.0128144 0.0215272 1 0 1 1 0 0 +EDGE2 4934 4914 -0.0256765 0.00430689 0.0149173 1 0 1 1 0 0 +EDGE2 4934 4555 0.878088 0.047502 -3.13584 1 0 1 1 0 0 +EDGE2 4934 4895 1.07871 0.0298365 0.0210887 1 0 1 1 0 0 +EDGE2 4934 4915 1.0503 0.0152655 -0.00964921 1 0 1 1 0 0 +EDGE2 4935 4934 -1.05832 0.0573384 -0.0094049 1 0 1 1 0 0 +EDGE2 4935 4894 -0.995814 0.00345221 0.00670598 1 0 1 1 0 0 +EDGE2 4935 4914 -1.0011 -0.0123164 0.000384626 1 0 1 1 0 0 +EDGE2 4935 4916 -0.0588644 0.965843 1.60442 1 0 1 1 0 0 +EDGE2 4935 4556 0.00809691 -1.14465 -1.58097 1 0 1 1 0 0 +EDGE2 4935 4555 -0.0196404 0.0261547 -3.14705 1 0 1 1 0 0 +EDGE2 4935 4895 0.0444928 -0.142195 0.00767506 1 0 1 1 0 0 +EDGE2 4935 4915 0.044636 -0.0599657 0.00689297 1 0 1 1 0 0 +EDGE2 4935 4554 1.04136 0.00312835 -3.13942 1 0 1 1 0 0 +EDGE2 4935 4896 -0.00161261 1.0546 1.56436 1 0 1 1 0 0 +EDGE2 4936 4935 -0.986699 -0.100905 1.56544 1 0 1 1 0 0 +EDGE2 4936 4557 1.00242 -0.0840634 0.0130418 1 0 1 1 0 0 +EDGE2 4936 4556 -0.101102 0.008597 -0.0160813 1 0 1 1 0 0 +EDGE2 4936 4555 -0.978184 0.0329181 -1.57266 1 0 1 1 0 0 +EDGE2 4936 4895 -1.01735 0.0127073 1.58903 1 0 1 1 0 0 +EDGE2 4936 4915 -1.06531 -0.0380199 1.59576 1 0 1 1 0 0 +EDGE2 4937 4558 1.07197 -0.0302853 -0.0087892 1 0 1 1 0 0 +EDGE2 4937 4936 -0.997438 0.0163433 -0.022917 1 0 1 1 0 0 +EDGE2 4937 4557 -0.0229875 0.0867822 0.0245102 1 0 1 1 0 0 +EDGE2 4937 4556 -1.01611 -0.0724675 0.00177188 1 0 1 1 0 0 +EDGE2 4938 4558 0.0371203 0.0185732 -0.0243275 1 0 1 1 0 0 +EDGE2 4938 4559 0.9802 0.00873703 0.000787298 1 0 1 1 0 0 +EDGE2 4938 4557 -1.0091 -0.0347334 0.00791238 1 0 1 1 0 0 +EDGE2 4938 4937 -0.9221 -0.0638293 0.0146851 1 0 1 1 0 0 +EDGE2 4939 4558 -1.01765 0.075501 -0.0128911 1 0 1 1 0 0 +EDGE2 4939 4559 0.0254892 -0.0255316 0.0356061 1 0 1 1 0 0 +EDGE2 4939 4560 0.960312 0.0333551 -0.0241172 1 0 1 1 0 0 +EDGE2 4939 4938 -1.08137 -0.11586 0.026344 1 0 1 1 0 0 +EDGE2 4940 4561 -0.0466448 -1.03606 -1.58096 1 0 1 1 0 0 +EDGE2 4940 4559 -1.05181 -0.0913266 -0.00611614 1 0 1 1 0 0 +EDGE2 4940 4939 -1.09872 0.00808491 -0.00783045 1 0 1 1 0 0 +EDGE2 4940 4560 0.0249319 -0.0153653 -0.0106074 1 0 1 1 0 0 +EDGE2 4941 4562 1.02785 0.0121903 0.00449124 1 0 1 1 0 0 +EDGE2 4941 4561 0.0910258 0.0217297 -0.0108173 1 0 1 1 0 0 +EDGE2 4941 4940 -1.0488 0.0483932 1.55925 1 0 1 1 0 0 +EDGE2 4941 4560 -1.10734 0.0241599 1.57589 1 0 1 1 0 0 +EDGE2 4942 4563 1.03465 0.0951563 0.0116267 1 0 1 1 0 0 +EDGE2 4942 4941 -0.951288 -0.070997 0.037646 1 0 1 1 0 0 +EDGE2 4942 4562 0.0226841 0.0725917 0.0352876 1 0 1 1 0 0 +EDGE2 4942 4561 -0.991927 -0.00407685 -0.00645249 1 0 1 1 0 0 +EDGE2 4943 4942 -1.02894 0.0630756 0.0330689 1 0 1 1 0 0 +EDGE2 4943 4564 1.02747 -0.0543602 -0.0332049 1 0 1 1 0 0 +EDGE2 4943 4563 -0.104547 0.00198976 -0.0204268 1 0 1 1 0 0 +EDGE2 4943 4562 -1.00562 -0.00584494 0.0266781 1 0 1 1 0 0 +EDGE2 4944 4565 0.964835 0.0410308 0.0274371 1 0 1 1 0 0 +EDGE2 4944 4885 1.09901 0.0232252 -3.15472 1 0 1 1 0 0 +EDGE2 4944 3625 0.99725 0.0531286 -3.13751 1 0 1 1 0 0 +EDGE2 4944 4943 -1.06551 -0.037016 0.0123385 1 0 1 1 0 0 +EDGE2 4944 4564 -0.0448491 -0.0535159 -0.0207503 1 0 1 1 0 0 +EDGE2 4944 4563 -0.921859 -0.032461 0.0140025 1 0 1 1 0 0 +EDGE2 4945 4884 1.06152 -0.033448 -3.13343 1 0 1 1 0 0 +EDGE2 4945 4566 0.0505926 1.01116 1.57783 1 0 1 1 0 0 +EDGE2 4945 3626 -0.0108255 0.99433 1.57591 1 0 1 1 0 0 +EDGE2 4945 4565 0.0139653 0.0104956 -0.0165513 1 0 1 1 0 0 +EDGE2 4945 3624 1.03559 -0.000312513 -3.13538 1 0 1 1 0 0 +EDGE2 4945 4885 -0.0318149 -0.0675342 -3.16608 1 0 1 1 0 0 +EDGE2 4945 4886 0.0335504 -0.994672 -1.56427 1 0 1 1 0 0 +EDGE2 4945 3625 0.038372 -0.0601595 -3.15097 1 0 1 1 0 0 +EDGE2 4945 4564 -0.957578 -0.0748739 -0.00358567 1 0 1 1 0 0 +EDGE2 4945 4944 -0.912472 -0.0139178 0.00523538 1 0 1 1 0 0 +EDGE2 4946 4887 1.01107 -0.0129253 0.0214932 1 0 1 1 0 0 +EDGE2 4946 4565 -1.03782 -0.00705571 1.61164 1 0 1 1 0 0 +EDGE2 4946 4945 -1.02327 0.0284616 1.57405 1 0 1 1 0 0 +EDGE2 4946 4885 -1.02286 0.057866 -1.56318 1 0 1 1 0 0 +EDGE2 4946 4886 0.00405625 0.0654426 0.0177188 1 0 1 1 0 0 +EDGE2 4946 3625 -0.995209 -0.0648075 -1.56536 1 0 1 1 0 0 +EDGE2 4947 4887 0.0409766 0.0398049 0.00796646 1 0 1 1 0 0 +EDGE2 4947 4886 -0.953194 -0.0385339 -0.0135412 1 0 1 1 0 0 +EDGE2 4947 4946 -1.05257 0.0153947 -0.0134536 1 0 1 1 0 0 +EDGE2 4947 4888 1.0121 0.0321186 -0.00187047 1 0 1 1 0 0 +EDGE2 4948 4887 -0.964829 -0.0230072 0.0239044 1 0 1 1 0 0 +EDGE2 4948 4947 -0.93857 -0.0142781 0.0260118 1 0 1 1 0 0 +EDGE2 4948 4889 0.974585 -0.00470302 -0.0104512 1 0 1 1 0 0 +EDGE2 4948 4888 -0.0125873 -0.00826713 -0.0277097 1 0 1 1 0 0 +EDGE2 4949 4948 -1.00433 0.107262 -0.00138026 1 0 1 1 0 0 +EDGE2 4949 4890 1.03687 0.0116863 -0.0118515 1 0 1 1 0 0 +EDGE2 4949 4889 0.0381299 0.0232477 -0.0291844 1 0 1 1 0 0 +EDGE2 4949 4888 -0.950366 0.00257688 -0.0134011 1 0 1 1 0 0 +EDGE2 4949 4930 1.01339 -0.0457417 -3.14357 1 0 1 1 0 0 +EDGE2 4949 4910 1.0695 0.0261264 -3.14367 1 0 1 1 0 0 +EDGE2 4950 4890 0.0176293 -0.0455783 0.0530608 1 0 1 1 0 0 +EDGE2 4950 4889 -1.02722 0.0359081 -0.0115681 1 0 1 1 0 0 +EDGE2 4950 4949 -1.00459 -0.0266109 0.0183106 1 0 1 1 0 0 +EDGE2 4950 4930 0.0305035 0.0191562 -3.14183 1 0 1 1 0 0 +EDGE2 4950 4910 -0.116996 -0.0146739 -3.13233 1 0 1 1 0 0 +EDGE2 4950 4891 0.107159 -1.10754 -1.60153 1 0 1 1 0 0 +EDGE2 4950 4911 0.0200855 -0.91341 -1.55627 1 0 1 1 0 0 +EDGE2 4950 4931 -0.149568 -0.957846 -1.57254 1 0 1 1 0 0 +EDGE2 4950 4909 1.02933 0.0176294 -3.16349 1 0 1 1 0 0 +EDGE2 4950 4929 0.999901 -0.0377165 -3.157 1 0 1 1 0 0 +EDGE2 4951 4890 -0.945465 -0.025053 -1.55974 1 0 1 1 0 0 +EDGE2 4951 4930 -0.996648 0.0482117 1.57025 1 0 1 1 0 0 +EDGE2 4951 4950 -1.07368 0.0114948 -1.57613 1 0 1 1 0 0 +EDGE2 4951 4910 -0.949924 -0.0331387 1.59369 1 0 1 1 0 0 +EDGE2 4952 4951 -0.978047 0.0031698 -0.0275855 1 0 1 1 0 0 +EDGE2 4953 4952 -0.990612 0.0638387 0.00714578 1 0 1 1 0 0 +EDGE2 4954 4953 -1.0061 -0.0181476 0.0126886 1 0 1 1 0 0 +EDGE2 4955 4954 -0.998945 -0.00351732 -0.0284709 1 0 1 1 0 0 +EDGE2 4956 4955 -1.03022 0.0381692 -1.60659 1 0 1 1 0 0 +EDGE2 4957 4956 -0.954693 -0.0628401 0.0261163 1 0 1 1 0 0 +EDGE2 4958 4957 -1.11177 0.0444216 -0.00974177 1 0 1 1 0 0 +EDGE2 4959 4880 0.999061 0.0897915 -3.126 1 0 1 1 0 0 +EDGE2 4959 3620 1.00302 0.017552 -3.13946 1 0 1 1 0 0 +EDGE2 4959 4958 -0.956124 -0.00733337 -0.00288018 1 0 1 1 0 0 +EDGE2 4960 3619 1.05495 -0.0358626 -3.14407 1 0 1 1 0 0 +EDGE2 4960 4879 0.904618 -0.0519703 -3.11173 1 0 1 1 0 0 +EDGE2 4960 4959 -0.978192 0.0547148 -0.0406945 1 0 1 1 0 0 +EDGE2 4960 4880 0.0477961 0.064351 -3.17538 1 0 1 1 0 0 +EDGE2 4960 3620 0.038257 0.0248913 -3.15244 1 0 1 1 0 0 +EDGE2 4960 3621 0.0977789 0.957478 1.56443 1 0 1 1 0 0 +EDGE2 4960 4881 0.0844455 0.956527 1.58615 1 0 1 1 0 0 +EDGE2 4961 4880 -1.07256 0.00974833 1.58122 1 0 1 1 0 0 +EDGE2 4961 4960 -1.05418 -0.0636587 -1.57876 1 0 1 1 0 0 +EDGE2 4961 3620 -0.965342 0.0176225 1.55258 1 0 1 1 0 0 +EDGE2 4961 3621 -0.0520457 0.0423909 0.00541907 1 0 1 1 0 0 +EDGE2 4961 4881 -0.0693021 0.0446904 0.000132831 1 0 1 1 0 0 +EDGE2 4961 3622 1.02918 0.0415242 -0.0122082 1 0 1 1 0 0 +EDGE2 4961 4882 1.02261 -0.037447 0.00108042 1 0 1 1 0 0 +EDGE2 4962 3621 -1.02815 0.0303277 -0.00617718 1 0 1 1 0 0 +EDGE2 4962 4881 -1.05994 -0.053491 0.00164906 1 0 1 1 0 0 +EDGE2 4962 4961 -0.996367 -0.0917863 0.00869174 1 0 1 1 0 0 +EDGE2 4962 3622 0.0209103 -0.0802031 0.0054928 1 0 1 1 0 0 +EDGE2 4962 4882 -0.00607043 0.0564104 -0.00679997 1 0 1 1 0 0 +EDGE2 4962 3623 0.984457 0.0410419 -0.0331345 1 0 1 1 0 0 +EDGE2 4962 4883 1.03554 -0.0633127 0.00240581 1 0 1 1 0 0 +EDGE2 4963 4884 0.943909 -0.0881536 0.0144303 1 0 1 1 0 0 +EDGE2 4963 3622 -1.00527 0.0936917 0.0160921 1 0 1 1 0 0 +EDGE2 4963 4962 -0.969974 0.00821494 -0.0106762 1 0 1 1 0 0 +EDGE2 4963 4882 -0.899453 -0.100312 -0.0163309 1 0 1 1 0 0 +EDGE2 4963 3623 -0.0478214 0.0253749 0.00256096 1 0 1 1 0 0 +EDGE2 4963 4883 0.126224 0.0204772 0.0124428 1 0 1 1 0 0 +EDGE2 4963 3624 0.970445 -0.0085342 -0.0073161 1 0 1 1 0 0 +EDGE2 4964 4884 0.0272372 -0.11778 0.0174377 1 0 1 1 0 0 +EDGE2 4964 3623 -1.00679 0.0323506 -0.0250089 1 0 1 1 0 0 +EDGE2 4964 4883 -0.967654 0.0580225 -0.00282534 1 0 1 1 0 0 +EDGE2 4964 4963 -1.0377 -0.111019 0.011296 1 0 1 1 0 0 +EDGE2 4964 4565 1.01164 0.00303659 -3.17389 1 0 1 1 0 0 +EDGE2 4964 4945 1.08426 -0.0342625 -3.15858 1 0 1 1 0 0 +EDGE2 4964 3624 -0.0316881 0.0424338 0.00152664 1 0 1 1 0 0 +EDGE2 4964 4885 0.942325 -0.0307793 -0.038808 1 0 1 1 0 0 +EDGE2 4964 3625 1.05845 -0.0589893 0.00926174 1 0 1 1 0 0 +EDGE2 4965 4884 -0.983029 0.0642963 -0.00433267 1 0 1 1 0 0 +EDGE2 4965 4964 -1.08192 0.0148857 0.00268528 1 0 1 1 0 0 +EDGE2 4965 4566 0.0299275 -0.994963 -1.54073 1 0 1 1 0 0 +EDGE2 4965 3626 -0.0534923 -0.980265 -1.5785 1 0 1 1 0 0 +EDGE2 4965 4565 -0.0122689 0.0380116 -3.16755 1 0 1 1 0 0 +EDGE2 4965 4945 -0.0719678 -0.0502081 -3.13458 1 0 1 1 0 0 +EDGE2 4965 3624 -0.994403 -0.0140112 0.0111096 1 0 1 1 0 0 +EDGE2 4965 4885 0.0879728 -0.0469558 0.0161493 1 0 1 1 0 0 +EDGE2 4965 4886 0.100059 1.05401 1.54422 1 0 1 1 0 0 +EDGE2 4965 4946 0.0304824 1.02999 1.5369 1 0 1 1 0 0 +EDGE2 4965 3625 -0.0292133 0.0841425 0.00331287 1 0 1 1 0 0 +EDGE2 4965 4564 1.01898 -0.0113783 -3.17117 1 0 1 1 0 0 +EDGE2 4965 4944 0.958736 0.0303029 -3.12998 1 0 1 1 0 0 +EDGE2 4966 4567 1.02566 -0.0674518 -0.0154406 1 0 1 1 0 0 +EDGE2 4966 4566 -0.0013169 -0.0280206 0.00050735 1 0 1 1 0 0 +EDGE2 4966 3627 0.989167 -0.0167482 0.00854894 1 0 1 1 0 0 +EDGE2 4966 3626 -0.022451 -0.0545988 0.00312372 1 0 1 1 0 0 +EDGE2 4966 4565 -1.03507 0.0236098 -1.57299 1 0 1 1 0 0 +EDGE2 4966 4945 -1.00088 0.0165619 -1.56063 1 0 1 1 0 0 +EDGE2 4966 4965 -1.01535 -0.0225578 1.57047 1 0 1 1 0 0 +EDGE2 4966 4885 -1.02178 -0.011063 1.60369 1 0 1 1 0 0 +EDGE2 4966 3625 -1.07324 0.0779789 1.56446 1 0 1 1 0 0 +EDGE2 4967 4567 -0.0389593 0.0373782 -0.0140704 1 0 1 1 0 0 +EDGE2 4967 3628 1.13991 0.0592436 0.00473888 1 0 1 1 0 0 +EDGE2 4967 4568 0.925791 0.0199542 0.0108224 1 0 1 1 0 0 +EDGE2 4967 4566 -1.01251 0.0106211 -0.0028052 1 0 1 1 0 0 +EDGE2 4967 4966 -1.02433 -0.0720275 -0.0137794 1 0 1 1 0 0 +EDGE2 4967 3627 -0.0319646 0.0673114 -0.0111377 1 0 1 1 0 0 +EDGE2 4967 3626 -1.00302 0.0597078 -0.0222271 1 0 1 1 0 0 +EDGE2 4968 3629 0.974563 0.0373408 -0.00907147 1 0 1 1 0 0 +EDGE2 4968 4569 0.937778 0.00199868 -0.000343259 1 0 1 1 0 0 +EDGE2 4968 4567 -0.984208 0.0130808 0.0085706 1 0 1 1 0 0 +EDGE2 4968 3628 0.00931623 0.00199209 -0.00111007 1 0 1 1 0 0 +EDGE2 4968 4568 0.041401 0.0368097 0.0198051 1 0 1 1 0 0 +EDGE2 4968 4967 -1.08119 0.0743409 0.0015572 1 0 1 1 0 0 +EDGE2 4968 3627 -0.919284 -0.0804011 -0.0127234 1 0 1 1 0 0 +EDGE2 4969 4570 1.01482 0.153406 0.0070328 1 0 1 1 0 0 +EDGE2 4969 4690 0.963119 -0.062454 -3.12916 1 0 1 1 0 0 +EDGE2 4969 4670 1.04878 0.0492314 -3.18156 1 0 1 1 0 0 +EDGE2 4969 3610 0.900862 0.0160838 -3.13398 1 0 1 1 0 0 +EDGE2 4969 3630 0.966276 -0.0246134 -0.00209935 1 0 1 1 0 0 +EDGE2 4969 3629 -0.0601316 -0.034073 -0.0140381 1 0 1 1 0 0 +EDGE2 4969 4569 0.0913168 0.0153503 -0.00328504 1 0 1 1 0 0 +EDGE2 4969 3628 -1.01101 -0.0257416 0.0260899 1 0 1 1 0 0 +EDGE2 4969 4568 -0.963179 -0.0183047 -0.0121224 1 0 1 1 0 0 +EDGE2 4969 4968 -1.05891 0.0869456 0.0147289 1 0 1 1 0 0 +EDGE2 4970 3609 0.99229 -0.0395596 -3.14589 1 0 1 1 0 0 +EDGE2 4970 4669 1.00167 0.0940858 -3.10918 1 0 1 1 0 0 +EDGE2 4970 4689 0.959921 0.0139998 -3.16838 1 0 1 1 0 0 +EDGE2 4970 4571 -0.0874348 -0.927422 -1.58771 1 0 1 1 0 0 +EDGE2 4970 4671 0.0370443 -1.03875 -1.54323 1 0 1 1 0 0 +EDGE2 4970 4691 -0.0387265 -1.00739 -1.56888 1 0 1 1 0 0 +EDGE2 4970 3611 -0.0680085 -1.04192 -1.5449 1 0 1 1 0 0 +EDGE2 4970 4570 0.0293429 0.071881 -0.0133637 1 0 1 1 0 0 +EDGE2 4970 4690 0.0640439 -0.0744113 -3.12755 1 0 1 1 0 0 +EDGE2 4970 4670 0.0921353 -0.000687506 -3.14161 1 0 1 1 0 0 +EDGE2 4970 3610 -0.0428572 0.00530935 -3.16471 1 0 1 1 0 0 +EDGE2 4970 3630 0.000746537 -0.131063 0.0138724 1 0 1 1 0 0 +EDGE2 4970 3631 -0.00589152 0.998109 1.53617 1 0 1 1 0 0 +EDGE2 4970 3629 -1.06532 0.016295 0.00735301 1 0 1 1 0 0 +EDGE2 4970 4569 -0.96004 -0.0670864 -0.0167456 1 0 1 1 0 0 +EDGE2 4970 4969 -0.959847 0.0626944 0.0124404 1 0 1 1 0 0 +EDGE2 4971 4672 0.953308 -0.0635566 -0.0107789 1 0 1 1 0 0 +EDGE2 4971 4692 0.949121 -0.0194685 -0.0115649 1 0 1 1 0 0 +EDGE2 4971 3612 1.09042 0.0573054 0.0105854 1 0 1 1 0 0 +EDGE2 4971 4572 0.954707 -0.0130885 -0.0287737 1 0 1 1 0 0 +EDGE2 4971 4571 -0.0103412 -0.0188086 0.023129 1 0 1 1 0 0 +EDGE2 4971 4671 0.0332772 0.046273 0.0207075 1 0 1 1 0 0 +EDGE2 4971 4691 -0.000819833 0.0143989 0.0286417 1 0 1 1 0 0 +EDGE2 4971 3611 0.0587337 -0.0333304 0.0248506 1 0 1 1 0 0 +EDGE2 4971 4570 -1.02569 0.0224766 1.59358 1 0 1 1 0 0 +EDGE2 4971 4690 -0.999535 -0.0369307 -1.56919 1 0 1 1 0 0 +EDGE2 4971 4970 -1.03267 0.028732 1.60651 1 0 1 1 0 0 +EDGE2 4971 4670 -1.03921 -0.0302783 -1.58699 1 0 1 1 0 0 +EDGE2 4971 3610 -0.95804 -0.0274187 -1.52567 1 0 1 1 0 0 +EDGE2 4971 3630 -1.03249 0.0389939 1.58007 1 0 1 1 0 0 +EDGE2 4972 4672 -0.0400247 -0.00472694 0.00155041 1 0 1 1 0 0 +EDGE2 4972 4673 1.02778 0.0286643 1.41265e-05 1 0 1 1 0 0 +EDGE2 4972 4693 1.04074 -0.0276562 0.0147416 1 0 1 1 0 0 +EDGE2 4972 3613 1.02626 -0.0478122 0.0323932 1 0 1 1 0 0 +EDGE2 4972 4573 0.981983 -0.117056 0.011765 1 0 1 1 0 0 +EDGE2 4972 4692 -0.0250029 0.0226584 0.00894305 1 0 1 1 0 0 +EDGE2 4972 4971 -0.989935 -0.0283938 -0.0238243 1 0 1 1 0 0 +EDGE2 4972 3612 -0.0345176 -0.0164658 -0.000134351 1 0 1 1 0 0 +EDGE2 4972 4572 0.0258783 0.084078 0.032973 1 0 1 1 0 0 +EDGE2 4972 4571 -1.05018 0.022948 -0.0186511 1 0 1 1 0 0 +EDGE2 4972 4671 -0.896451 -0.00756493 -0.00971285 1 0 1 1 0 0 +EDGE2 4972 4691 -1.02107 -0.0667377 -0.0125123 1 0 1 1 0 0 +EDGE2 4972 3611 -0.986669 -0.00681525 0.0155376 1 0 1 1 0 0 +EDGE2 4973 4574 0.996271 0.0202364 0.0085786 1 0 1 1 0 0 +EDGE2 4973 4674 1.01721 -0.0642928 -0.0152634 1 0 1 1 0 0 +EDGE2 4973 4694 1.02942 -0.0342806 -0.0123198 1 0 1 1 0 0 +EDGE2 4973 3614 1.06209 -0.0162477 0.0214658 1 0 1 1 0 0 +EDGE2 4973 4672 -1.07552 0.0181814 -0.0035381 1 0 1 1 0 0 +EDGE2 4973 4972 -1.06785 -0.065913 0.0217416 1 0 1 1 0 0 +EDGE2 4973 4673 -0.0691576 -0.0708306 -0.00840798 1 0 1 1 0 0 +EDGE2 4973 4693 -0.0191323 -0.00967235 -0.0286743 1 0 1 1 0 0 +EDGE2 4973 3613 0.017299 0.0295186 0.0147909 1 0 1 1 0 0 +EDGE2 4973 4573 0.003593 0.053235 0.0105437 1 0 1 1 0 0 +EDGE2 4973 4692 -0.959854 0.0822103 -0.00912081 1 0 1 1 0 0 +EDGE2 4973 3612 -0.866442 0.00301158 0.0125307 1 0 1 1 0 0 +EDGE2 4973 4572 -0.999192 -0.00892554 0.0207997 1 0 1 1 0 0 +EDGE2 4974 4575 0.965188 -0.0003794 -0.0295798 1 0 1 1 0 0 +EDGE2 4974 4695 1.00815 -0.0181936 -0.0191059 1 0 1 1 0 0 +EDGE2 4974 4875 1.02909 0.110008 -3.10855 1 0 1 1 0 0 +EDGE2 4974 4675 0.982908 0.0278132 0.0289434 1 0 1 1 0 0 +EDGE2 4974 3615 0.993851 0.000793431 0.00101418 1 0 1 1 0 0 +EDGE2 4974 4574 0.0601535 0.00328796 -0.00365862 1 0 1 1 0 0 +EDGE2 4974 4674 -0.0012885 -0.052815 0.0258841 1 0 1 1 0 0 +EDGE2 4974 4694 0.0139365 0.0317674 0.0138222 1 0 1 1 0 0 +EDGE2 4974 3614 -0.0144071 -0.0199819 0.00274351 1 0 1 1 0 0 +EDGE2 4974 4673 -1.02485 -0.023569 0.0221273 1 0 1 1 0 0 +EDGE2 4974 4973 -1.0269 -0.03701 -0.00664205 1 0 1 1 0 0 +EDGE2 4974 4693 -0.986631 0.0839764 -0.000950115 1 0 1 1 0 0 +EDGE2 4974 3613 -0.946558 -0.0583331 0.00754365 1 0 1 1 0 0 +EDGE2 4974 4573 -0.928217 -0.0234815 -0.00804969 1 0 1 1 0 0 +EDGE2 4975 4676 0.0334034 0.969004 1.58389 1 0 1 1 0 0 +EDGE2 4975 4696 -0.00108562 0.893217 1.56968 1 0 1 1 0 0 +EDGE2 4975 4576 0.0639383 0.961243 1.5355 1 0 1 1 0 0 +EDGE2 4975 4974 -0.959035 0.0135839 -0.00169515 1 0 1 1 0 0 +EDGE2 4975 4874 0.943439 0.0288717 -3.10804 1 0 1 1 0 0 +EDGE2 4975 4575 -0.0179165 -0.0109902 -0.0128804 1 0 1 1 0 0 +EDGE2 4975 4695 -0.0846553 0.0010406 0.000492163 1 0 1 1 0 0 +EDGE2 4975 4875 -0.0143471 -0.0322361 -3.13054 1 0 1 1 0 0 +EDGE2 4975 4675 0.00436557 -0.0527107 -0.00602893 1 0 1 1 0 0 +EDGE2 4975 3615 -0.0598366 0.0046097 0.0088412 1 0 1 1 0 0 +EDGE2 4975 4876 0.0676229 -1.00895 -1.60332 1 0 1 1 0 0 +EDGE2 4975 3616 0.0042146 -0.975375 -1.53673 1 0 1 1 0 0 +EDGE2 4975 4574 -0.949765 -0.00240485 -0.0227194 1 0 1 1 0 0 +EDGE2 4975 4674 -0.997818 -0.0229463 -0.0121448 1 0 1 1 0 0 +EDGE2 4975 4694 -0.980963 0.0341888 0.0128745 1 0 1 1 0 0 +EDGE2 4975 3614 -1.04389 -0.0626323 0.0236609 1 0 1 1 0 0 +EDGE2 4976 4577 1.03807 0.0432048 0.00588976 1 0 1 1 0 0 +EDGE2 4976 4677 0.992298 -0.0708306 -0.0138183 1 0 1 1 0 0 +EDGE2 4976 4697 0.927163 0.0562285 -0.0323279 1 0 1 1 0 0 +EDGE2 4976 4676 0.170824 0.00790814 0.000871054 1 0 1 1 0 0 +EDGE2 4976 4696 -0.0214553 -0.0339638 0.0346107 1 0 1 1 0 0 +EDGE2 4976 4576 -0.00186481 -0.029139 -0.0131291 1 0 1 1 0 0 +EDGE2 4976 4575 -1.01625 -0.0585654 -1.59425 1 0 1 1 0 0 +EDGE2 4976 4695 -1.00724 0.0579552 -1.52896 1 0 1 1 0 0 +EDGE2 4976 4875 -1.00696 0.0312516 1.55196 1 0 1 1 0 0 +EDGE2 4976 4975 -0.975979 -0.00121401 -1.5764 1 0 1 1 0 0 +EDGE2 4976 4675 -0.97804 -0.00337566 -1.58644 1 0 1 1 0 0 +EDGE2 4976 3615 -0.98162 -0.0633076 -1.57399 1 0 1 1 0 0 +EDGE2 4977 4678 1.08912 -0.0163924 0.00935904 1 0 1 1 0 0 +EDGE2 4977 4698 0.919421 0.0418677 0.0360207 1 0 1 1 0 0 +EDGE2 4977 4578 0.99348 0.0138223 0.00129621 1 0 1 1 0 0 +EDGE2 4977 4976 -1.1402 -0.0553233 0.0408255 1 0 1 1 0 0 +EDGE2 4977 4577 -0.0181278 -0.102854 0.0450813 1 0 1 1 0 0 +EDGE2 4977 4677 -0.040818 -0.0519769 -0.022307 1 0 1 1 0 0 +EDGE2 4977 4697 -0.00825037 0.0150652 -0.0216502 1 0 1 1 0 0 +EDGE2 4977 4676 -1.00909 0.0317062 -0.0138058 1 0 1 1 0 0 +EDGE2 4977 4696 -0.957354 -0.0348587 0.00713764 1 0 1 1 0 0 +EDGE2 4977 4576 -1.00012 0.00942345 -0.000761402 1 0 1 1 0 0 +EDGE2 4978 4679 1.00701 0.0050226 0.0186121 1 0 1 1 0 0 +EDGE2 4978 4699 1.04227 0.0481039 0.0220701 1 0 1 1 0 0 +EDGE2 4978 4579 1.03725 0.0043957 -0.0349674 1 0 1 1 0 0 +EDGE2 4978 4678 0.0299688 0.0133061 0.0395519 1 0 1 1 0 0 +EDGE2 4978 4698 0.021471 -0.0268768 -0.0136325 1 0 1 1 0 0 +EDGE2 4978 4578 -0.128732 -0.0317848 0.0305929 1 0 1 1 0 0 +EDGE2 4978 4977 -0.996505 -0.00144983 0.0228816 1 0 1 1 0 0 +EDGE2 4978 4577 -0.992888 0.00577023 -0.00816895 1 0 1 1 0 0 +EDGE2 4978 4677 -1.00758 0.00350203 -0.0100481 1 0 1 1 0 0 +EDGE2 4978 4697 -1.00762 -0.00222737 -0.0141485 1 0 1 1 0 0 +EDGE2 4979 4820 1.01591 0.10655 -3.11445 1 0 1 1 0 0 +EDGE2 4979 4840 0.95675 0.0173729 -3.18409 1 0 1 1 0 0 +EDGE2 4979 4580 0.961849 -0.0547658 -0.013741 1 0 1 1 0 0 +EDGE2 4979 4680 0.99416 0.0118866 0.00862068 1 0 1 1 0 0 +EDGE2 4979 4700 0.979521 0.00961149 -0.0506819 1 0 1 1 0 0 +EDGE2 4979 4679 0.00850677 0.0333407 0.0128593 1 0 1 1 0 0 +EDGE2 4979 4699 0.0106291 -0.0593651 -0.0156243 1 0 1 1 0 0 +EDGE2 4979 4579 0.031526 0.0401908 -0.0082867 1 0 1 1 0 0 +EDGE2 4979 4678 -1.13341 0.0485667 0.0206762 1 0 1 1 0 0 +EDGE2 4979 4698 -0.930649 -0.0180867 0.00467754 1 0 1 1 0 0 +EDGE2 4979 4978 -1.06827 -0.0837101 0.0262004 1 0 1 1 0 0 +EDGE2 4979 4578 -1.05991 -0.0860573 -0.0314609 1 0 1 1 0 0 +EDGE2 4980 4839 1.03687 -0.0353112 -3.14241 1 0 1 1 0 0 +EDGE2 4980 4819 0.920505 0.0358924 -3.16882 1 0 1 1 0 0 +EDGE2 4980 4820 0.0372394 -0.0305687 -3.15232 1 0 1 1 0 0 +EDGE2 4980 4821 -0.0309913 -0.992945 -1.58209 1 0 1 1 0 0 +EDGE2 4980 4841 0.0382881 -0.989175 -1.60116 1 0 1 1 0 0 +EDGE2 4980 4840 -0.0806871 0.00739266 -3.18956 1 0 1 1 0 0 +EDGE2 4980 4580 -0.00713215 -0.010086 -0.05186 1 0 1 1 0 0 +EDGE2 4980 4680 -0.00151514 0.0438719 0.00927572 1 0 1 1 0 0 +EDGE2 4980 4700 0.0329065 0.0955712 0.0347364 1 0 1 1 0 0 +EDGE2 4980 4681 0.074655 1.0124 1.57679 1 0 1 1 0 0 +EDGE2 4980 4701 0.00810814 1.02298 1.56567 1 0 1 1 0 0 +EDGE2 4980 4581 0.0497688 0.990499 1.58039 1 0 1 1 0 0 +EDGE2 4980 4679 -0.916584 0.0293173 -0.0188641 1 0 1 1 0 0 +EDGE2 4980 4699 -0.946729 -0.0575824 -0.0491222 1 0 1 1 0 0 +EDGE2 4980 4979 -1.03701 0.0235889 -0.00425726 1 0 1 1 0 0 +EDGE2 4980 4579 -0.953378 -0.0598571 -0.00202553 1 0 1 1 0 0 +EDGE2 4981 4820 -0.970459 0.0556788 1.56922 1 0 1 1 0 0 +EDGE2 4981 4840 -0.998721 -0.0528144 1.54844 1 0 1 1 0 0 +EDGE2 4981 4980 -1.05835 0.0355243 -1.52861 1 0 1 1 0 0 +EDGE2 4981 4580 -1.00697 0.0530773 -1.56056 1 0 1 1 0 0 +EDGE2 4981 4680 -0.994818 -0.0494347 -1.56481 1 0 1 1 0 0 +EDGE2 4981 4700 -0.989251 -0.0874014 -1.59824 1 0 1 1 0 0 +EDGE2 4981 4681 -0.038982 -0.0141713 0.0320499 1 0 1 1 0 0 +EDGE2 4981 4701 0.00465137 -0.0701784 -0.0162931 1 0 1 1 0 0 +EDGE2 4981 4581 -0.0498158 -0.00715912 0.0145819 1 0 1 1 0 0 +EDGE2 4981 4582 0.986338 0.0185203 0.00116288 1 0 1 1 0 0 +EDGE2 4981 4702 1.04153 -0.079207 0.00681822 1 0 1 1 0 0 +EDGE2 4981 4682 1.11484 -0.0569197 -0.000698628 1 0 1 1 0 0 +EDGE2 4982 4981 -1.0338 0.0204248 -0.0334497 1 0 1 1 0 0 +EDGE2 4982 4681 -0.986637 -0.0108084 -0.0106245 1 0 1 1 0 0 +EDGE2 4982 4701 -0.985885 -0.0581175 -0.00995694 1 0 1 1 0 0 +EDGE2 4982 4581 -0.99962 -0.0023796 -0.043688 1 0 1 1 0 0 +EDGE2 4982 4583 1.03282 0.0628853 0.033563 1 0 1 1 0 0 +EDGE2 4982 4582 0.0070544 -0.00699593 -0.0328758 1 0 1 1 0 0 +EDGE2 4982 4702 -0.0987542 -0.078731 -0.011898 1 0 1 1 0 0 +EDGE2 4982 4682 -0.0333678 -0.0306529 -0.0363816 1 0 1 1 0 0 +EDGE2 4982 4703 0.919187 -0.0318481 -0.0134836 1 0 1 1 0 0 +EDGE2 4982 4683 1.01256 0.0448739 -0.0322795 1 0 1 1 0 0 +EDGE2 4983 4583 -0.0277415 0.0550911 0.00772669 1 0 1 1 0 0 +EDGE2 4983 4582 -1.0275 -0.0239046 -0.00770386 1 0 1 1 0 0 +EDGE2 4983 4702 -0.974146 0.0999032 0.00197053 1 0 1 1 0 0 +EDGE2 4983 4982 -1.01848 -0.0695043 -0.0181274 1 0 1 1 0 0 +EDGE2 4983 4682 -0.992156 0.0417427 0.0169664 1 0 1 1 0 0 +EDGE2 4983 4703 -0.0280694 0.0367891 -0.0424263 1 0 1 1 0 0 +EDGE2 4983 4683 -0.0131622 0.0730965 0.0124622 1 0 1 1 0 0 +EDGE2 4983 4684 0.937667 0.0377986 0.00680379 1 0 1 1 0 0 +EDGE2 4983 4704 1.08411 -0.0539723 -0.00543 1 0 1 1 0 0 +EDGE2 4983 4584 1.03735 -0.0752582 -0.029352 1 0 1 1 0 0 +EDGE2 4984 4583 -1.00966 -0.0321569 -0.034919 1 0 1 1 0 0 +EDGE2 4984 4703 -0.950178 0.10319 0.00207083 1 0 1 1 0 0 +EDGE2 4984 4983 -1.09344 -0.0316506 0.0135544 1 0 1 1 0 0 +EDGE2 4984 4683 -1.02716 -0.0581547 -0.00449781 1 0 1 1 0 0 +EDGE2 4984 4705 1.0298 -0.0632125 -0.00651185 1 0 1 1 0 0 +EDGE2 4984 4684 -0.0685868 -0.0698935 0.0113018 1 0 1 1 0 0 +EDGE2 4984 4704 -0.0999132 0.0891281 0.00835608 1 0 1 1 0 0 +EDGE2 4984 4584 0.106233 0.0819946 -0.006512 1 0 1 1 0 0 +EDGE2 4984 3605 1.03359 -0.0954392 -3.17371 1 0 1 1 0 0 +EDGE2 4984 4645 1.00645 -0.0155223 -3.14675 1 0 1 1 0 0 +EDGE2 4984 4665 1.06591 -0.0828447 -3.14021 1 0 1 1 0 0 +EDGE2 4984 4685 1.00862 -0.0176695 -0.00245546 1 0 1 1 0 0 +EDGE2 4984 4585 0.947856 -0.0676708 0.0254566 1 0 1 1 0 0 +EDGE2 4985 4646 0.0720222 -0.971678 -1.59344 1 0 1 1 0 0 +EDGE2 4985 4706 -0.082351 -0.976359 -1.55698 1 0 1 1 0 0 +EDGE2 4985 4586 -0.0518866 -0.87903 -1.53624 1 0 1 1 0 0 +EDGE2 4985 4644 1.05876 -0.0481702 -3.16337 1 0 1 1 0 0 +EDGE2 4985 4705 0.0171245 -0.0648654 0.00487685 1 0 1 1 0 0 +EDGE2 4985 4684 -1.01731 -0.00992037 0.0233709 1 0 1 1 0 0 +EDGE2 4985 4704 -0.991741 0.0173133 0.0374329 1 0 1 1 0 0 +EDGE2 4985 4984 -0.969686 0.0236302 -0.00165462 1 0 1 1 0 0 +EDGE2 4985 4584 -1.00282 0.0315895 0.0111388 1 0 1 1 0 0 +EDGE2 4985 3605 0.0507776 0.0224066 -3.1467 1 0 1 1 0 0 +EDGE2 4985 4645 0.00549795 0.0540544 -3.13393 1 0 1 1 0 0 +EDGE2 4985 4665 0.111962 -0.0241835 -3.11966 1 0 1 1 0 0 +EDGE2 4985 4685 -0.0570039 -0.0324802 0.0242032 1 0 1 1 0 0 +EDGE2 4985 4585 0.0354477 0.00398726 0.0390011 1 0 1 1 0 0 +EDGE2 4985 4664 0.966433 0.066721 -3.15216 1 0 1 1 0 0 +EDGE2 4985 3606 0.0635645 0.992349 1.54744 1 0 1 1 0 0 +EDGE2 4985 4686 0.00371124 0.998892 1.5647 1 0 1 1 0 0 +EDGE2 4985 4666 0.0488077 0.956091 1.55408 1 0 1 1 0 0 +EDGE2 4985 3604 0.994494 -0.00535277 -3.13663 1 0 1 1 0 0 +EDGE2 4986 4707 1.05234 0.0256465 0.0269284 1 0 1 1 0 0 +EDGE2 4986 4587 1.01717 -0.0505965 -0.0224463 1 0 1 1 0 0 +EDGE2 4986 4647 1.03797 -0.0282561 0.00962305 1 0 1 1 0 0 +EDGE2 4986 4646 0.0290554 0.0189345 0.0384395 1 0 1 1 0 0 +EDGE2 4986 4706 -0.0605269 0.0334007 -0.00757094 1 0 1 1 0 0 +EDGE2 4986 4586 -0.0295052 0.0706586 0.00147897 1 0 1 1 0 0 +EDGE2 4986 4705 -0.989238 0.0150563 1.56859 1 0 1 1 0 0 +EDGE2 4986 4985 -0.956617 -0.0571187 1.56634 1 0 1 1 0 0 +EDGE2 4986 3605 -0.997997 0.0394122 -1.56743 1 0 1 1 0 0 +EDGE2 4986 4645 -0.943954 0.0369758 -1.5561 1 0 1 1 0 0 +EDGE2 4986 4665 -0.976712 0.0245466 -1.62692 1 0 1 1 0 0 +EDGE2 4986 4685 -1.02219 -0.0599476 1.59762 1 0 1 1 0 0 +EDGE2 4986 4585 -1.02351 -0.00278265 1.55647 1 0 1 1 0 0 +EDGE2 4987 4707 0.061576 0.019511 0.0266206 1 0 1 1 0 0 +EDGE2 4987 4708 0.971315 0.0712691 0.00910586 1 0 1 1 0 0 +EDGE2 4987 4648 1.02375 0.009822 0.00596081 1 0 1 1 0 0 +EDGE2 4987 4588 1.05792 0.0704288 0.00901015 1 0 1 1 0 0 +EDGE2 4987 4986 -1.09526 -0.0449908 0.0269313 1 0 1 1 0 0 +EDGE2 4987 4587 0.0186132 0.0355484 -0.00672651 1 0 1 1 0 0 +EDGE2 4987 4647 -0.0190014 -0.0211908 0.0370911 1 0 1 1 0 0 +EDGE2 4987 4646 -1.0267 -0.0853012 0.0266897 1 0 1 1 0 0 +EDGE2 4987 4706 -1.04418 -0.0490444 -0.00209183 1 0 1 1 0 0 +EDGE2 4987 4586 -0.987192 0.0210198 -0.000968682 1 0 1 1 0 0 +EDGE2 4988 4707 -1.03318 -0.00524571 -0.00920808 1 0 1 1 0 0 +EDGE2 4988 4708 -0.0179255 -0.0190816 -0.0101512 1 0 1 1 0 0 +EDGE2 4988 4649 1.04008 0.0378109 0.0119571 1 0 1 1 0 0 +EDGE2 4988 4709 0.992108 -0.0521376 0.0336918 1 0 1 1 0 0 +EDGE2 4988 4589 0.96965 -0.0207807 -0.027678 1 0 1 1 0 0 +EDGE2 4988 4648 -0.0437612 -0.0284637 -0.00133792 1 0 1 1 0 0 +EDGE2 4988 4588 0.0746068 0.0263004 0.0190475 1 0 1 1 0 0 +EDGE2 4988 4987 -0.999241 0.0497471 -0.0254823 1 0 1 1 0 0 +EDGE2 4988 4587 -1.02539 -0.0938768 -0.0395779 1 0 1 1 0 0 +EDGE2 4988 4647 -1.0232 -0.025084 0.00943149 1 0 1 1 0 0 +EDGE2 4989 4710 0.985536 0.0282569 0.015006 1 0 1 1 0 0 +EDGE2 4989 4630 0.959229 -0.0575196 -3.14582 1 0 1 1 0 0 +EDGE2 4989 4650 1.02103 -0.0300354 0.0319084 1 0 1 1 0 0 +EDGE2 4989 4590 0.939649 0.0342257 0.0106068 1 0 1 1 0 0 +EDGE2 4989 4708 -1.02121 0.00419878 0.00444584 1 0 1 1 0 0 +EDGE2 4989 4649 0.0211867 -0.0533671 -0.0251073 1 0 1 1 0 0 +EDGE2 4989 4709 0.0486073 0.0883247 0.0163719 1 0 1 1 0 0 +EDGE2 4989 4589 0.0528394 -0.10258 0.010078 1 0 1 1 0 0 +EDGE2 4989 4988 -0.980853 0.0232497 0.00831091 1 0 1 1 0 0 +EDGE2 4989 4648 -0.961828 0.0444725 -0.000699415 1 0 1 1 0 0 +EDGE2 4989 4588 -1.01593 0.00931823 -0.0107863 1 0 1 1 0 0 +EDGE2 4990 4710 -0.131513 -0.00456236 0.0230922 1 0 1 1 0 0 +EDGE2 4990 4629 1.04071 -0.0450077 -3.14343 1 0 1 1 0 0 +EDGE2 4990 4711 0.0743458 -0.966357 -1.57789 1 0 1 1 0 0 +EDGE2 4990 4630 0.0718181 0.0387723 -3.18381 1 0 1 1 0 0 +EDGE2 4990 4650 0.0828875 -0.0684995 -0.000515203 1 0 1 1 0 0 +EDGE2 4990 4590 0.00730001 0.0796985 -0.00617258 1 0 1 1 0 0 +EDGE2 4990 4591 0.032812 1.00534 1.58273 1 0 1 1 0 0 +EDGE2 4990 4651 0.0100075 1.03286 1.54781 1 0 1 1 0 0 +EDGE2 4990 4631 0.0392314 0.97714 1.58264 1 0 1 1 0 0 +EDGE2 4990 4649 -1.06272 -0.084921 0.0267649 1 0 1 1 0 0 +EDGE2 4990 4989 -1.11343 0.0704253 -0.00686472 1 0 1 1 0 0 +EDGE2 4990 4709 -0.926261 0.0146665 -0.00516572 1 0 1 1 0 0 +EDGE2 4990 4589 -1.01106 -0.00768327 0.0185291 1 0 1 1 0 0 +EDGE2 4991 4710 -0.923965 -0.0382186 -1.5655 1 0 1 1 0 0 +EDGE2 4991 4990 -1.00692 -0.069277 -1.55202 1 0 1 1 0 0 +EDGE2 4991 4630 -1.02936 0.020985 1.63001 1 0 1 1 0 0 +EDGE2 4991 4650 -1.08419 0.0955197 -1.53946 1 0 1 1 0 0 +EDGE2 4991 4590 -1.07847 -0.0360335 -1.5469 1 0 1 1 0 0 +EDGE2 4991 4632 0.947306 -0.0622063 0.0273782 1 0 1 1 0 0 +EDGE2 4991 4591 0.0425918 0.0274826 -0.0456082 1 0 1 1 0 0 +EDGE2 4991 4651 0.0600099 0.0375823 0.0134358 1 0 1 1 0 0 +EDGE2 4991 4631 0.0503269 0.00239124 0.0237605 1 0 1 1 0 0 +EDGE2 4991 4652 1.01089 -0.0662232 0.0286152 1 0 1 1 0 0 +EDGE2 4991 4592 0.965267 -0.0453685 0.0462239 1 0 1 1 0 0 +EDGE2 4992 4632 0.0221765 -0.0628341 -0.0111597 1 0 1 1 0 0 +EDGE2 4992 4591 -0.952528 0.0357623 0.00570467 1 0 1 1 0 0 +EDGE2 4992 4651 -0.980279 -0.00506177 -0.0139963 1 0 1 1 0 0 +EDGE2 4992 4991 -0.939364 -0.0322875 -0.000526282 1 0 1 1 0 0 +EDGE2 4992 4631 -1.00149 0.0287596 -0.0213031 1 0 1 1 0 0 +EDGE2 4992 4652 0.0175384 0.0168964 0.0165896 1 0 1 1 0 0 +EDGE2 4992 4653 0.947955 0.0149349 -0.0125869 1 0 1 1 0 0 +EDGE2 4992 4592 -0.010666 -0.0501854 -0.0120076 1 0 1 1 0 0 +EDGE2 4992 4593 0.959936 0.0778519 -0.0112486 1 0 1 1 0 0 +EDGE2 4992 4633 1.0583 -0.118661 0.00421977 1 0 1 1 0 0 +EDGE2 4993 4632 -1.03603 -0.0390831 -0.053216 1 0 1 1 0 0 +EDGE2 4993 4992 -0.994488 -0.0642779 -0.00445791 1 0 1 1 0 0 +EDGE2 4993 4652 -0.962143 0.0446925 0.0051158 1 0 1 1 0 0 +EDGE2 4993 4653 0.0503135 0.108215 0.000341456 1 0 1 1 0 0 +EDGE2 4993 4592 -1.01376 0.0144699 0.00906796 1 0 1 1 0 0 +EDGE2 4993 4593 0.0311562 0.00156052 -0.0191698 1 0 1 1 0 0 +EDGE2 4993 4633 0.11269 -0.0541552 0.00567547 1 0 1 1 0 0 +EDGE2 4993 4634 0.98682 -0.0549099 -0.0048354 1 0 1 1 0 0 +EDGE2 4993 4654 1.06935 0.0148444 0.00367712 1 0 1 1 0 0 +EDGE2 4993 4594 1.08577 -0.00242746 0.0144186 1 0 1 1 0 0 +EDGE2 4994 4653 -1.03607 0.0290864 -0.0296126 1 0 1 1 0 0 +EDGE2 4994 4993 -1.00234 0.0301412 0.00511415 1 0 1 1 0 0 +EDGE2 4994 4593 -1.09056 0.00554831 -0.0116128 1 0 1 1 0 0 +EDGE2 4994 4633 -0.950646 0.000809852 -0.0111899 1 0 1 1 0 0 +EDGE2 4994 4634 0.0112949 0.0193282 0.0126923 1 0 1 1 0 0 +EDGE2 4994 4654 0.0482863 -0.0352142 -0.0186472 1 0 1 1 0 0 +EDGE2 4994 4594 0.00317751 -0.0144098 -0.0343393 1 0 1 1 0 0 +EDGE2 4994 2915 1.10823 -0.0338097 -3.12991 1 0 1 1 0 0 +EDGE2 4994 4635 0.931303 -0.0265657 -0.0148235 1 0 1 1 0 0 +EDGE2 4994 4655 0.965883 0.027078 0.0370928 1 0 1 1 0 0 +EDGE2 4994 4595 0.924167 -0.0158118 0.0200409 1 0 1 1 0 0 +EDGE2 4994 3595 1.04408 -0.0248412 -3.15652 1 0 1 1 0 0 +EDGE2 4994 3735 0.965426 -0.00971233 -3.13259 1 0 1 1 0 0 +EDGE2 4994 3755 0.96171 0.0237219 -3.12596 1 0 1 1 0 0 +EDGE2 4994 3575 1.06757 -0.00740124 -3.14995 1 0 1 1 0 0 +EDGE2 4995 4634 -0.961519 -0.064866 -0.0462318 1 0 1 1 0 0 +EDGE2 4995 4654 -1.03443 0.065014 0.0108443 1 0 1 1 0 0 +EDGE2 4995 4994 -0.956721 0.0826159 0.0264603 1 0 1 1 0 0 +EDGE2 4995 4594 -1.01953 -0.0432939 0.00219374 1 0 1 1 0 0 +EDGE2 4995 2915 0.0762246 0.0356365 -3.12709 1 0 1 1 0 0 +EDGE2 4995 4635 -0.0139569 0.0788762 0.00817856 1 0 1 1 0 0 +EDGE2 4995 2916 -0.0273187 -0.96146 -1.57854 1 0 1 1 0 0 +EDGE2 4995 3736 -0.0212922 -0.937829 -1.56817 1 0 1 1 0 0 +EDGE2 4995 4596 -0.0425084 -0.960679 -1.59924 1 0 1 1 0 0 +EDGE2 4995 3576 0.0393755 -0.985332 -1.58432 1 0 1 1 0 0 +EDGE2 4995 4655 -0.0144234 -0.0155829 -0.00673758 1 0 1 1 0 0 +EDGE2 4995 4595 -0.0401222 0.0162865 0.0300317 1 0 1 1 0 0 +EDGE2 4995 3595 0.123429 0.0295622 -3.15854 1 0 1 1 0 0 +EDGE2 4995 3735 -0.0422606 0.0966813 -3.21375 1 0 1 1 0 0 +EDGE2 4995 3755 0.0676595 0.122995 -3.10886 1 0 1 1 0 0 +EDGE2 4995 3575 0.0556813 -0.0154994 -3.13731 1 0 1 1 0 0 +EDGE2 4995 2914 0.92143 0.00341842 -3.15777 1 0 1 1 0 0 +EDGE2 4995 3594 0.985286 0.0138732 -3.11415 1 0 1 1 0 0 +EDGE2 4995 3734 1.02331 0.023993 -3.15402 1 0 1 1 0 0 +EDGE2 4995 3754 1.09155 0.0650785 -3.12719 1 0 1 1 0 0 +EDGE2 4995 3574 0.974034 -0.0177171 -3.15208 1 0 1 1 0 0 +EDGE2 4995 4636 0.110046 0.899848 1.562 1 0 1 1 0 0 +EDGE2 4995 4656 0.00685987 0.987491 1.5844 1 0 1 1 0 0 +EDGE2 4995 3596 -0.0471409 1.01377 1.57069 1 0 1 1 0 0 +EDGE2 4995 3756 -0.0318802 0.953184 1.57835 1 0 1 1 0 0 +EDGE2 4996 2915 -0.962502 0.077105 1.54796 1 0 1 1 0 0 +EDGE2 4996 4635 -0.925339 0.0227639 -1.55743 1 0 1 1 0 0 +EDGE2 4996 4995 -1.0289 -0.012711 -1.54649 1 0 1 1 0 0 +EDGE2 4996 4655 -0.917222 0.0646398 -1.57918 1 0 1 1 0 0 +EDGE2 4996 4595 -1.02401 0.0737692 -1.57642 1 0 1 1 0 0 +EDGE2 4996 3595 -1.00748 0.10961 1.56334 1 0 1 1 0 0 +EDGE2 4996 3735 -0.961961 -0.0300007 1.58248 1 0 1 1 0 0 +EDGE2 4996 3755 -0.986048 0.00778313 1.58504 1 0 1 1 0 0 +EDGE2 4996 3575 -0.93754 0.00616374 1.52886 1 0 1 1 0 0 +EDGE2 4996 3597 0.986519 -0.00691823 0.0209664 1 0 1 1 0 0 +EDGE2 4996 4636 -0.0319177 0.0154481 0.0276171 1 0 1 1 0 0 +EDGE2 4996 4656 -0.0202134 -0.0109061 -0.00360186 1 0 1 1 0 0 +EDGE2 4996 3596 -0.0110983 0.088566 -0.0338264 1 0 1 1 0 0 +EDGE2 4996 3756 0.0528266 -0.0196099 -0.0363263 1 0 1 1 0 0 +EDGE2 4996 4637 1.08743 -0.0451873 0.000537108 1 0 1 1 0 0 +EDGE2 4996 4657 1.07808 -0.028103 0.0154034 1 0 1 1 0 0 +EDGE2 4996 3757 1.00343 0.0488807 0.0414383 1 0 1 1 0 0 +EDGE2 4997 3597 -0.105254 0.0555519 -0.0230483 1 0 1 1 0 0 +EDGE2 4997 4636 -1.00748 -0.0769368 -0.000714514 1 0 1 1 0 0 +EDGE2 4997 4996 -0.966987 0.0499207 -0.0150273 1 0 1 1 0 0 +EDGE2 4997 4656 -0.985542 0.113745 0.0228676 1 0 1 1 0 0 +EDGE2 4997 3596 -0.874204 -0.0310677 0.0252859 1 0 1 1 0 0 +EDGE2 4997 3756 -1.01145 0.0449947 0.037801 1 0 1 1 0 0 +EDGE2 4997 4637 0.0110448 0.0230571 0.00954454 1 0 1 1 0 0 +EDGE2 4997 4657 -0.0126036 -0.080253 0.0165464 1 0 1 1 0 0 +EDGE2 4997 3757 -0.0729346 0.00566398 0.0209366 1 0 1 1 0 0 +EDGE2 4997 4638 0.929186 0.0125167 0.0238371 1 0 1 1 0 0 +EDGE2 4997 4658 1.00367 0.000467171 0.0132125 1 0 1 1 0 0 +EDGE2 4997 3598 0.881703 0.00993972 -0.0254925 1 0 1 1 0 0 +EDGE2 4997 3758 0.934822 -0.0235748 -0.0406054 1 0 1 1 0 0 +EDGE2 4998 3597 -0.998764 -0.0297188 -0.0119105 1 0 1 1 0 0 +EDGE2 4998 4997 -0.996598 -0.0441652 -0.00157648 1 0 1 1 0 0 +EDGE2 4998 4637 -1.03449 -0.0379164 0.018836 1 0 1 1 0 0 +EDGE2 4998 4657 -0.959051 0.0292547 -0.00262306 1 0 1 1 0 0 +EDGE2 4998 3757 -0.952443 -0.0107488 -0.0314358 1 0 1 1 0 0 +EDGE2 4998 4638 0.0150142 0.0503345 -0.0126537 1 0 1 1 0 0 +EDGE2 4998 4658 0.0996033 0.0250554 -0.00803076 1 0 1 1 0 0 +EDGE2 4998 3598 0.0198787 -0.0964836 -0.0140065 1 0 1 1 0 0 +EDGE2 4998 3758 0.0339935 -0.0234201 0.00955914 1 0 1 1 0 0 +EDGE2 4998 4639 1.00957 0.0423338 -0.0169103 1 0 1 1 0 0 +EDGE2 4998 4659 0.945288 -0.0701601 -0.0195436 1 0 1 1 0 0 +EDGE2 4998 3599 1.0089 -0.00896759 -0.0164396 1 0 1 1 0 0 +EDGE2 4998 3759 1.05272 -0.00875037 0.00571615 1 0 1 1 0 0 +EDGE2 4999 4638 -1.04957 -0.0439059 -0.00750296 1 0 1 1 0 0 +EDGE2 4999 4998 -0.984589 -0.108622 0.0203522 1 0 1 1 0 0 +EDGE2 4999 4658 -0.965986 -0.0350197 0.0467252 1 0 1 1 0 0 +EDGE2 4999 3598 -0.93451 0.0341331 0.00637611 1 0 1 1 0 0 +EDGE2 4999 3758 -1.01168 0.042404 0.0366208 1 0 1 1 0 0 +EDGE2 4999 4639 -0.00894232 0.0197159 0.00847412 1 0 1 1 0 0 +EDGE2 4999 4659 0.11123 -0.0105896 -0.0197236 1 0 1 1 0 0 +EDGE2 4999 3599 0.0430199 0.0416162 0.0141019 1 0 1 1 0 0 +EDGE2 4999 3759 0.024534 -0.0965399 0.0353215 1 0 1 1 0 0 +EDGE2 4999 3680 0.95366 0.00986323 -3.15733 1 0 1 1 0 0 +EDGE2 4999 3820 0.978244 0.0254498 -3.16113 1 0 1 1 0 0 +EDGE2 4999 4640 1.01072 -0.0181773 -0.00617767 1 0 1 1 0 0 +EDGE2 4999 4660 1.0222 0.0579668 0.0238988 1 0 1 1 0 0 +EDGE2 4999 3760 1.0318 -0.0394235 0.0353613 1 0 1 1 0 0 +EDGE2 4999 3600 0.947504 -0.0370475 0.0122516 1 0 1 1 0 0 +EDGE2 4999 3640 1.0485 0.0623504 -3.12519 1 0 1 1 0 0 +EDGE2 4999 3660 1.02834 -0.0420579 -3.16022 1 0 1 1 0 0 +EDGE2 5000 4999 -0.965051 0.0820334 -0.00448935 1 0 1 1 0 0 +EDGE2 5000 4639 -0.968193 0.0954812 0.0373153 1 0 1 1 0 0 +EDGE2 5000 4659 -1.002 -0.054797 -0.0302248 1 0 1 1 0 0 +EDGE2 5000 3599 -0.958826 0.00284047 -0.0364439 1 0 1 1 0 0 +EDGE2 5000 3759 -0.976736 0.00470795 -0.00228236 1 0 1 1 0 0 +EDGE2 5000 3680 0.0122013 -0.0205142 -3.12524 1 0 1 1 0 0 +EDGE2 5000 4661 0.0455897 1.02277 1.55911 1 0 1 1 0 0 +EDGE2 5000 3601 0.000800765 1.03059 1.55866 1 0 1 1 0 0 +EDGE2 5000 4641 -0.1147 0.986945 1.58842 1 0 1 1 0 0 +EDGE2 5000 3820 0.00903463 -0.0765831 -3.12422 1 0 1 1 0 0 +EDGE2 5000 4640 -0.0976163 0.00814115 0.000547697 1 0 1 1 0 0 +EDGE2 5000 4660 0.0861355 -0.010112 0.0179159 1 0 1 1 0 0 +EDGE2 5000 3760 0.0184862 -0.0264088 -0.00737003 1 0 1 1 0 0 +EDGE2 5000 3761 0.0229483 -0.968344 -1.5938 1 0 1 1 0 0 +EDGE2 5000 3600 -0.0409178 0.0222681 0.0267245 1 0 1 1 0 0 +EDGE2 5000 3640 -0.0533456 -0.0668135 -3.10521 1 0 1 1 0 0 +EDGE2 5000 3660 -0.00306205 0.00500628 -3.13608 1 0 1 1 0 0 +EDGE2 5000 3821 0.00981371 -0.944371 -1.57862 1 0 1 1 0 0 +EDGE2 5000 3641 0.0040339 -1.0302 -1.5374 1 0 1 1 0 0 +EDGE2 5000 3661 -0.0611794 -0.974674 -1.58233 1 0 1 1 0 0 +EDGE2 5000 3681 -0.0630304 -0.946092 -1.56137 1 0 1 1 0 0 +EDGE2 5000 3659 1.00609 0.0567217 -3.16974 1 0 1 1 0 0 +EDGE2 5000 3679 1.00619 0.0193184 -3.16019 1 0 1 1 0 0 +EDGE2 5000 3819 0.971167 0.00962218 -3.11827 1 0 1 1 0 0 +EDGE2 5000 3639 1.00986 -0.00754501 -3.12099 1 0 1 1 0 0 +EDGE2 5001 3680 -0.987365 0.0244901 1.58768 1 0 1 1 0 0 +EDGE2 5001 4661 0.0108355 -0.064613 0.0474834 1 0 1 1 0 0 +EDGE2 5001 4642 0.954225 -0.0110864 0.00804114 1 0 1 1 0 0 +EDGE2 5001 4662 0.961348 -0.0785878 -0.0368093 1 0 1 1 0 0 +EDGE2 5001 3602 0.965905 0.0597253 0.0214139 1 0 1 1 0 0 +EDGE2 5001 5000 -1.00536 -0.0170553 -1.58561 1 0 1 1 0 0 +EDGE2 5001 3601 -0.00232574 0.00649151 -0.011941 1 0 1 1 0 0 +EDGE2 5001 4641 -0.0359284 0.0305705 0.0264889 1 0 1 1 0 0 +EDGE2 5001 3820 -1.01049 0.0161833 1.59548 1 0 1 1 0 0 +EDGE2 5001 4640 -1.01461 0.0759801 -1.51405 1 0 1 1 0 0 +EDGE2 5001 4660 -1.04558 -0.061034 -1.58476 1 0 1 1 0 0 +EDGE2 5001 3760 -1.05225 0.0331168 -1.56966 1 0 1 1 0 0 +EDGE2 5001 3600 -1.02045 0.0393887 -1.57212 1 0 1 1 0 0 +EDGE2 5001 3640 -1.01941 -0.02612 1.50601 1 0 1 1 0 0 +EDGE2 5001 3660 -1.04597 0.00792698 1.54971 1 0 1 1 0 0 +EDGE2 5002 4663 1.00137 -0.0272035 0.00717409 1 0 1 1 0 0 +EDGE2 5002 3603 1.10668 -0.0401421 -0.017358 1 0 1 1 0 0 +EDGE2 5002 4643 0.89912 -0.0306818 -0.000842706 1 0 1 1 0 0 +EDGE2 5002 4661 -0.988476 0.104882 -0.000729867 1 0 1 1 0 0 +EDGE2 5002 4642 -0.0133206 0.0147669 -0.0333562 1 0 1 1 0 0 +EDGE2 5002 4662 -0.0479603 0.0086964 -0.00698888 1 0 1 1 0 0 +EDGE2 5002 3602 -0.137783 0.00925852 0.0102274 1 0 1 1 0 0 +EDGE2 5002 5001 -1.00412 0.0368521 0.0462565 1 0 1 1 0 0 +EDGE2 5002 3601 -1.05879 -0.0840496 6.72237e-05 1 0 1 1 0 0 +EDGE2 5002 4641 -1.01629 -0.086918 0.028287 1 0 1 1 0 0 +EDGE2 5003 4644 0.953684 -0.0251702 -1.34539e-05 1 0 1 1 0 0 +EDGE2 5003 4664 0.931873 0.0275304 -0.00328799 1 0 1 1 0 0 +EDGE2 5003 4663 -0.00809683 0.0763131 0.0073845 1 0 1 1 0 0 +EDGE2 5003 3604 1.04033 0.0119605 -0.00592278 1 0 1 1 0 0 +EDGE2 5003 3603 -0.0700117 0.0921954 0.0155191 1 0 1 1 0 0 +EDGE2 5003 4643 0.0527426 0.0462652 0.00785481 1 0 1 1 0 0 +EDGE2 5003 4642 -0.987362 0.0549116 0.00545283 1 0 1 1 0 0 +EDGE2 5003 5002 -1.01252 -0.0361771 0.0169926 1 0 1 1 0 0 +EDGE2 5003 4662 -1.0375 -0.0369913 0.000902179 1 0 1 1 0 0 +EDGE2 5003 3602 -1.04509 -0.0494439 -0.010672 1 0 1 1 0 0 +EDGE2 5004 4644 -0.0334125 -0.0734333 0.000600022 1 0 1 1 0 0 +EDGE2 5004 4705 0.969991 0.0358902 -3.12379 1 0 1 1 0 0 +EDGE2 5004 4985 0.967973 -0.0261614 -3.16894 1 0 1 1 0 0 +EDGE2 5004 3605 1.01402 0.0370034 -0.0295458 1 0 1 1 0 0 +EDGE2 5004 4645 0.961008 -0.00818509 -0.0118809 1 0 1 1 0 0 +EDGE2 5004 4665 0.954101 0.00481892 -0.0426646 1 0 1 1 0 0 +EDGE2 5004 4685 1.03235 -0.0110783 -3.14144 1 0 1 1 0 0 +EDGE2 5004 4585 0.996018 -0.0444533 -3.13563 1 0 1 1 0 0 +EDGE2 5004 4664 0.0264907 0.03197 0.0332663 1 0 1 1 0 0 +EDGE2 5004 4663 -1.02745 0.0182922 -0.0273105 1 0 1 1 0 0 +EDGE2 5004 3604 0.0561032 -0.0679324 0.0137863 1 0 1 1 0 0 +EDGE2 5004 5003 -0.979686 -0.0196333 0.00493398 1 0 1 1 0 0 +EDGE2 5004 3603 -1.04754 0.0408567 -0.000663749 1 0 1 1 0 0 +EDGE2 5004 4643 -0.972816 -0.0363013 -0.023106 1 0 1 1 0 0 +EDGE2 5005 4986 0.016728 1.08652 1.57218 1 0 1 1 0 0 +EDGE2 5005 4646 -0.0259138 0.983627 1.56979 1 0 1 1 0 0 +EDGE2 5005 4706 0.0142161 1.00366 1.54648 1 0 1 1 0 0 +EDGE2 5005 4586 -0.0230866 0.96699 1.57756 1 0 1 1 0 0 +EDGE2 5005 4644 -1.01349 0.0506597 -0.0221343 1 0 1 1 0 0 +EDGE2 5005 4705 0.0369287 0.061497 -3.12545 1 0 1 1 0 0 +EDGE2 5005 4684 1.15823 -0.0211421 -3.16858 1 0 1 1 0 0 +EDGE2 5005 4704 1.04932 -0.0203801 -3.13999 1 0 1 1 0 0 +EDGE2 5005 4984 0.953075 0.0601714 -3.11689 1 0 1 1 0 0 +EDGE2 5005 4584 1.06811 -0.0773838 -3.15858 1 0 1 1 0 0 +EDGE2 5005 4985 0.0559235 0.0217872 -3.10959 1 0 1 1 0 0 +EDGE2 5005 3605 0.0456002 0.00136975 -0.0288999 1 0 1 1 0 0 +EDGE2 5005 4645 0.0406353 0.0935816 -0.0103188 1 0 1 1 0 0 +EDGE2 5005 4665 -0.00825706 0.0245332 0.0318501 1 0 1 1 0 0 +EDGE2 5005 4685 0.0194422 -0.0184959 -3.15603 1 0 1 1 0 0 +EDGE2 5005 4585 0.0647887 0.0981835 -3.12852 1 0 1 1 0 0 +EDGE2 5005 5004 -1.03461 0.0355842 -0.0122518 1 0 1 1 0 0 +EDGE2 5005 4664 -1.03404 -0.0483107 -0.0305981 1 0 1 1 0 0 +EDGE2 5005 3606 0.0707046 -0.986315 -1.58888 1 0 1 1 0 0 +EDGE2 5005 4686 0.0548074 -1.03453 -1.57796 1 0 1 1 0 0 +EDGE2 5005 4666 -0.000775463 -0.965646 -1.5949 1 0 1 1 0 0 +EDGE2 5005 3604 -0.974087 -0.0287926 0.0107711 1 0 1 1 0 0 +EDGE2 5006 4705 -1.07964 0.0848247 -1.58274 1 0 1 1 0 0 +EDGE2 5006 5005 -0.976352 0.0768783 1.58941 1 0 1 1 0 0 +EDGE2 5006 4985 -1.00373 -0.0408383 -1.56929 1 0 1 1 0 0 +EDGE2 5006 3605 -0.913564 -0.00779005 1.53299 1 0 1 1 0 0 +EDGE2 5006 4645 -0.929551 0.0332846 1.58066 1 0 1 1 0 0 +EDGE2 5006 4665 -0.955593 0.0355037 1.62952 1 0 1 1 0 0 +EDGE2 5006 4685 -0.995859 0.067911 -1.56316 1 0 1 1 0 0 +EDGE2 5006 4585 -0.968571 0.0471166 -1.58442 1 0 1 1 0 0 +EDGE2 5006 3607 1.03372 -0.00445663 -0.0150819 1 0 1 1 0 0 +EDGE2 5006 3606 -0.0825777 0.0828641 -0.000628799 1 0 1 1 0 0 +EDGE2 5006 4686 -0.0156624 -0.018462 -0.028542 1 0 1 1 0 0 +EDGE2 5006 4666 -0.0175118 -0.070168 0.00512109 1 0 1 1 0 0 +EDGE2 5006 4687 1.00654 -0.00676027 0.0191922 1 0 1 1 0 0 +EDGE2 5006 4667 0.91818 0.0654762 -0.0153649 1 0 1 1 0 0 +EDGE2 5007 3607 0.0572138 0.0511148 0.0159083 1 0 1 1 0 0 +EDGE2 5007 3606 -0.961939 -0.0188729 -0.0195072 1 0 1 1 0 0 +EDGE2 5007 4686 -1.06967 0.0371935 -0.0140209 1 0 1 1 0 0 +EDGE2 5007 5006 -0.970725 0.00330048 0.00425446 1 0 1 1 0 0 +EDGE2 5007 4666 -1.03961 -0.111231 -0.0004452 1 0 1 1 0 0 +EDGE2 5007 4687 -0.0618009 -0.0257289 -0.0203014 1 0 1 1 0 0 +EDGE2 5007 4667 0.0550024 0.0142171 -0.00377476 1 0 1 1 0 0 +EDGE2 5007 3608 1.0218 0.0368386 -0.0253844 1 0 1 1 0 0 +EDGE2 5007 4668 1.00971 -0.0379312 -0.0162484 1 0 1 1 0 0 +EDGE2 5007 4688 1.00656 0.0308658 0.0256417 1 0 1 1 0 0 +EDGE2 5008 3607 -1.05445 -0.0262471 -0.024867 1 0 1 1 0 0 +EDGE2 5008 4687 -0.988205 0.00160016 0.00243292 1 0 1 1 0 0 +EDGE2 5008 5007 -0.947371 -0.0492556 -0.0102861 1 0 1 1 0 0 +EDGE2 5008 4667 -1.07814 0.024782 -0.00982544 1 0 1 1 0 0 +EDGE2 5008 3608 -0.0206577 0.00147908 -0.0196462 1 0 1 1 0 0 +EDGE2 5008 4668 0.0727211 -0.00906917 -0.0154987 1 0 1 1 0 0 +EDGE2 5008 4688 0.00854836 0.112335 0.0136168 1 0 1 1 0 0 +EDGE2 5008 3609 0.990162 -0.00418343 0.0160453 1 0 1 1 0 0 +EDGE2 5008 4669 1.01928 0.0266221 -0.01749 1 0 1 1 0 0 +EDGE2 5008 4689 1.05843 -0.0181201 0.0170064 1 0 1 1 0 0 +EDGE2 5009 5008 -0.964346 0.0418123 -0.000476476 1 0 1 1 0 0 +EDGE2 5009 3608 -1.01494 0.112358 0.0124742 1 0 1 1 0 0 +EDGE2 5009 4668 -1.0351 0.0690471 0.00934334 1 0 1 1 0 0 +EDGE2 5009 4688 -0.980763 0.019129 -0.0141442 1 0 1 1 0 0 +EDGE2 5009 3609 -0.0083851 -0.0209336 0.0356987 1 0 1 1 0 0 +EDGE2 5009 4669 0.0316534 -0.0119883 -0.0340445 1 0 1 1 0 0 +EDGE2 5009 4689 -0.00475448 0.0296374 0.0232311 1 0 1 1 0 0 +EDGE2 5009 4570 0.993917 0.0188175 -3.16527 1 0 1 1 0 0 +EDGE2 5009 4690 0.993619 0.0655434 -0.00796422 1 0 1 1 0 0 +EDGE2 5009 4970 0.979463 -0.0362911 -3.14523 1 0 1 1 0 0 +EDGE2 5009 4670 0.95602 -0.0709329 -0.00587261 1 0 1 1 0 0 +EDGE2 5009 3610 1.00274 -0.0201018 0.0160033 1 0 1 1 0 0 +EDGE2 5009 3630 1.13261 0.0245565 -3.12887 1 0 1 1 0 0 +EDGE2 5010 5009 -1.0413 0.025107 -0.0171717 1 0 1 1 0 0 +EDGE2 5010 3609 -1.00141 -0.0176991 -0.0108212 1 0 1 1 0 0 +EDGE2 5010 4669 -0.953686 0.038666 -0.0249778 1 0 1 1 0 0 +EDGE2 5010 4689 -1.08957 0.0660857 -0.0121286 1 0 1 1 0 0 +EDGE2 5010 4971 -0.0233809 0.961183 1.56546 1 0 1 1 0 0 +EDGE2 5010 4571 0.0228379 0.964765 1.57659 1 0 1 1 0 0 +EDGE2 5010 4671 0.018716 0.970213 1.5977 1 0 1 1 0 0 +EDGE2 5010 4691 -0.0126957 0.943505 1.6031 1 0 1 1 0 0 +EDGE2 5010 3611 -0.101743 1.10797 1.53758 1 0 1 1 0 0 +EDGE2 5010 4570 -0.0394641 0.0613753 -3.12481 1 0 1 1 0 0 +EDGE2 5010 4690 -0.0331494 0.0379614 0.00890143 1 0 1 1 0 0 +EDGE2 5010 4970 0.00888122 -0.0452849 -3.14993 1 0 1 1 0 0 +EDGE2 5010 4670 -0.0193407 0.0369098 0.00279954 1 0 1 1 0 0 +EDGE2 5010 3610 -0.036198 -0.053474 -0.00915768 1 0 1 1 0 0 +EDGE2 5010 3630 -0.0126201 0.0179552 -3.1598 1 0 1 1 0 0 +EDGE2 5010 3631 -0.0490402 -1.00884 -1.57464 1 0 1 1 0 0 +EDGE2 5010 3629 0.877519 0.0183478 -3.11823 1 0 1 1 0 0 +EDGE2 5010 4569 1.02902 0.0092559 -3.14891 1 0 1 1 0 0 +EDGE2 5010 4969 1.04491 -0.0345164 -3.10419 1 0 1 1 0 0 +EDGE2 5011 4672 0.973255 -0.046633 -0.0199873 1 0 1 1 0 0 +EDGE2 5011 4972 1.06857 0.0143598 -0.00487972 1 0 1 1 0 0 +EDGE2 5011 4692 0.99272 -0.02141 -0.0389061 1 0 1 1 0 0 +EDGE2 5011 4971 0.0587642 -0.034762 0.00541733 1 0 1 1 0 0 +EDGE2 5011 3612 0.972637 -0.0303687 0.0217221 1 0 1 1 0 0 +EDGE2 5011 4572 0.99456 0.0136846 0.0214349 1 0 1 1 0 0 +EDGE2 5011 4571 -0.0273718 0.00449504 0.00142204 1 0 1 1 0 0 +EDGE2 5011 4671 0.0974603 -0.0352104 -0.00370875 1 0 1 1 0 0 +EDGE2 5011 4691 -0.07703 0.0481766 -0.00339093 1 0 1 1 0 0 +EDGE2 5011 3611 -0.029972 -0.0559491 0.00544089 1 0 1 1 0 0 +EDGE2 5011 4570 -1.03324 -0.0275868 1.5916 1 0 1 1 0 0 +EDGE2 5011 4690 -0.946714 0.0809624 -1.55502 1 0 1 1 0 0 +EDGE2 5011 4970 -0.947879 -0.0295713 1.55441 1 0 1 1 0 0 +EDGE2 5011 5010 -1.02882 -0.0148151 -1.55344 1 0 1 1 0 0 +EDGE2 5011 4670 -0.998399 -0.06626 -1.5302 1 0 1 1 0 0 +EDGE2 5011 3610 -0.919764 -0.0426467 -1.53782 1 0 1 1 0 0 +EDGE2 5011 3630 -1.08758 0.00357428 1.56332 1 0 1 1 0 0 +EDGE2 5012 4672 -0.0393052 0.0365043 0.000572724 1 0 1 1 0 0 +EDGE2 5012 4972 0.0201861 -0.00244454 0.0161945 1 0 1 1 0 0 +EDGE2 5012 4673 1.05785 -0.000648804 -0.0257201 1 0 1 1 0 0 +EDGE2 5012 4973 0.932668 0.00700541 -0.0243368 1 0 1 1 0 0 +EDGE2 5012 4693 1.0072 0.0922846 0.0216211 1 0 1 1 0 0 +EDGE2 5012 3613 1.02463 0.00290077 -0.0123017 1 0 1 1 0 0 +EDGE2 5012 4573 1.01619 0.0927994 -0.0264232 1 0 1 1 0 0 +EDGE2 5012 4692 -0.00795014 -0.01159 0.00914927 1 0 1 1 0 0 +EDGE2 5012 4971 -1.08291 -0.0943441 -0.0151582 1 0 1 1 0 0 +EDGE2 5012 3612 0.00203271 0.0178037 0.0012204 1 0 1 1 0 0 +EDGE2 5012 4572 -0.0129049 0.174876 0.0118041 1 0 1 1 0 0 +EDGE2 5012 5011 -1.011 0.00556097 0.0126277 1 0 1 1 0 0 +EDGE2 5012 4571 -1.02722 0.111695 0.0116267 1 0 1 1 0 0 +EDGE2 5012 4671 -0.978983 0.0475271 0.0249778 1 0 1 1 0 0 +EDGE2 5012 4691 -0.990152 0.0200388 0.000164516 1 0 1 1 0 0 +EDGE2 5012 3611 -0.941669 -0.00960933 -0.00527302 1 0 1 1 0 0 +EDGE2 5013 4974 0.923906 -0.0703126 0.0127648 1 0 1 1 0 0 +EDGE2 5013 4574 0.938206 0.0858639 0.000680958 1 0 1 1 0 0 +EDGE2 5013 4674 1.01476 -0.0774879 0.0229475 1 0 1 1 0 0 +EDGE2 5013 4694 0.954837 -0.0652615 0.0275633 1 0 1 1 0 0 +EDGE2 5013 3614 0.950963 -0.0286705 0.00884659 1 0 1 1 0 0 +EDGE2 5013 4672 -1.02373 -0.0813059 -0.00810412 1 0 1 1 0 0 +EDGE2 5013 4972 -0.991571 0.0496593 0.0169176 1 0 1 1 0 0 +EDGE2 5013 4673 0.00639961 -0.0117697 -0.00221968 1 0 1 1 0 0 +EDGE2 5013 4973 -0.00451803 0.030444 0.015251 1 0 1 1 0 0 +EDGE2 5013 4693 -0.0200277 0.0316633 -0.00164665 1 0 1 1 0 0 +EDGE2 5013 3613 -0.0849719 -0.0172366 -0.0310375 1 0 1 1 0 0 +EDGE2 5013 4573 -0.0569286 -0.044479 0.0141374 1 0 1 1 0 0 +EDGE2 5013 5012 -0.926727 0.0448764 -0.0447619 1 0 1 1 0 0 +EDGE2 5013 4692 -1.04384 0.0671178 0.00632464 1 0 1 1 0 0 +EDGE2 5013 3612 -0.923208 0.0723132 -0.0102484 1 0 1 1 0 0 +EDGE2 5013 4572 -1.04435 -0.0339515 0.0109447 1 0 1 1 0 0 +EDGE2 5014 4974 -0.0847947 0.0443246 -0.0085039 1 0 1 1 0 0 +EDGE2 5014 4575 1.03128 0.0356825 -0.0118194 1 0 1 1 0 0 +EDGE2 5014 4695 0.89215 -0.0123947 0.00270151 1 0 1 1 0 0 +EDGE2 5014 4875 0.955198 0.0770394 -3.14234 1 0 1 1 0 0 +EDGE2 5014 4975 0.924693 0.0201844 0.00880085 1 0 1 1 0 0 +EDGE2 5014 4675 0.988573 0.0584238 0.000450019 1 0 1 1 0 0 +EDGE2 5014 3615 0.968056 -0.0467901 0.025897 1 0 1 1 0 0 +EDGE2 5014 4574 -0.0235731 -0.0207041 -0.000920674 1 0 1 1 0 0 +EDGE2 5014 4674 0.0251359 0.0784847 0.00668785 1 0 1 1 0 0 +EDGE2 5014 4694 -0.00735047 0.0670773 -0.0224952 1 0 1 1 0 0 +EDGE2 5014 3614 0.0124624 -0.0531967 0.0474735 1 0 1 1 0 0 +EDGE2 5014 4673 -1.05809 -0.0460341 -0.00394128 1 0 1 1 0 0 +EDGE2 5014 4973 -1.01764 -0.061679 -0.000872697 1 0 1 1 0 0 +EDGE2 5014 5013 -0.923858 -0.115541 -0.0395559 1 0 1 1 0 0 +EDGE2 5014 4693 -1.02832 -0.0488413 -0.009745 1 0 1 1 0 0 +EDGE2 5014 3613 -0.89116 0.000217289 -0.0124593 1 0 1 1 0 0 +EDGE2 5014 4573 -1.06531 -0.0106872 0.0173777 1 0 1 1 0 0 +EDGE2 5015 4976 0.0604762 0.990576 1.58718 1 0 1 1 0 0 +EDGE2 5015 4676 0.0504479 0.906646 1.54575 1 0 1 1 0 0 +EDGE2 5015 4696 0.0491691 1.05775 1.56454 1 0 1 1 0 0 +EDGE2 5015 4576 0.0163118 0.988644 1.57544 1 0 1 1 0 0 +EDGE2 5015 4974 -1.04701 0.0882888 0.021194 1 0 1 1 0 0 +EDGE2 5015 4874 0.944132 0.00270777 -3.14885 1 0 1 1 0 0 +EDGE2 5015 4575 0.0836398 0.0169207 -0.0398062 1 0 1 1 0 0 +EDGE2 5015 4695 0.0342962 0.0350335 0.00675047 1 0 1 1 0 0 +EDGE2 5015 4875 0.0703068 0.0221664 -3.18306 1 0 1 1 0 0 +EDGE2 5015 4975 0.0155845 0.014513 0.00721768 1 0 1 1 0 0 +EDGE2 5015 4675 0.0409182 0.0540994 -0.0084308 1 0 1 1 0 0 +EDGE2 5015 3615 0.0964709 0.040718 0.0122122 1 0 1 1 0 0 +EDGE2 5015 5014 -1.08915 -0.0633513 -0.0129897 1 0 1 1 0 0 +EDGE2 5015 4876 0.0117353 -1.03905 -1.5551 1 0 1 1 0 0 +EDGE2 5015 3616 0.0252534 -1.01107 -1.5459 1 0 1 1 0 0 +EDGE2 5015 4574 -1.08081 0.0153225 0.0231993 1 0 1 1 0 0 +EDGE2 5015 4674 -0.940299 -0.0296786 -0.0065442 1 0 1 1 0 0 +EDGE2 5015 4694 -1.00373 -0.0140367 -0.0291192 1 0 1 1 0 0 +EDGE2 5015 3614 -1.03844 -0.00866176 -0.00915928 1 0 1 1 0 0 +EDGE2 5016 4977 1.11347 -0.0666437 0.000893582 1 0 1 1 0 0 +EDGE2 5016 4976 -0.00635579 -0.0362484 0.0042497 1 0 1 1 0 0 +EDGE2 5016 4577 0.913646 -0.0613174 0.00596375 1 0 1 1 0 0 +EDGE2 5016 4677 1.01457 -0.0482407 -9.27671e-05 1 0 1 1 0 0 +EDGE2 5016 4697 0.937656 -0.0529526 -0.0211407 1 0 1 1 0 0 +EDGE2 5016 4676 0.0565992 0.0319568 -0.0038078 1 0 1 1 0 0 +EDGE2 5016 4696 0.00760148 -0.0457023 -0.0119066 1 0 1 1 0 0 +EDGE2 5016 4576 -0.0775986 0.0888881 0.00606736 1 0 1 1 0 0 +EDGE2 5016 5015 -1.05099 -0.048723 -1.61356 1 0 1 1 0 0 +EDGE2 5016 4575 -1.01415 -0.0840806 -1.58227 1 0 1 1 0 0 +EDGE2 5016 4695 -1.08697 -0.0355476 -1.59386 1 0 1 1 0 0 +EDGE2 5016 4875 -1.01812 0.0364696 1.5888 1 0 1 1 0 0 +EDGE2 5016 4975 -1.00784 0.0246531 -1.55585 1 0 1 1 0 0 +EDGE2 5016 4675 -0.997604 0.0567214 -1.58602 1 0 1 1 0 0 +EDGE2 5016 3615 -1.07822 -0.0309972 -1.57882 1 0 1 1 0 0 +EDGE2 5017 4678 0.991813 -0.0209346 0.0033953 1 0 1 1 0 0 +EDGE2 5017 4698 1.03548 0.0547208 0.0163631 1 0 1 1 0 0 +EDGE2 5017 4978 0.922736 0.0612939 0.00199473 1 0 1 1 0 0 +EDGE2 5017 4578 1.06966 0.00769302 0.017341 1 0 1 1 0 0 +EDGE2 5017 4977 -0.0849673 0.0283315 -0.0523456 1 0 1 1 0 0 +EDGE2 5017 4976 -0.970907 0.0215853 0.0256244 1 0 1 1 0 0 +EDGE2 5017 4577 0.0266257 0.0146029 0.00780342 1 0 1 1 0 0 +EDGE2 5017 4677 0.092753 0.017801 0.0202751 1 0 1 1 0 0 +EDGE2 5017 4697 0.0266546 -0.0201612 0.0399442 1 0 1 1 0 0 +EDGE2 5017 5016 -0.950937 0.0775026 0.0209772 1 0 1 1 0 0 +EDGE2 5017 4676 -0.927133 -0.00308717 0.0114226 1 0 1 1 0 0 +EDGE2 5017 4696 -0.98622 -0.0187658 0.0263487 1 0 1 1 0 0 +EDGE2 5017 4576 -1.00805 -0.0399664 0.0215859 1 0 1 1 0 0 +EDGE2 5018 4679 0.904312 -0.0434833 0.0181285 1 0 1 1 0 0 +EDGE2 5018 4699 1.02398 -0.122933 0.0301843 1 0 1 1 0 0 +EDGE2 5018 4979 0.972176 0.0128825 0.0156873 1 0 1 1 0 0 +EDGE2 5018 4579 1.05749 -0.0583208 -0.0321959 1 0 1 1 0 0 +EDGE2 5018 4678 0.010535 -0.0231635 0.00828949 1 0 1 1 0 0 +EDGE2 5018 4698 -0.0587419 -0.00992318 0.0182433 1 0 1 1 0 0 +EDGE2 5018 4978 0.0181149 0.0664347 -0.00989014 1 0 1 1 0 0 +EDGE2 5018 4578 -0.0626814 0.0582904 -0.0245054 1 0 1 1 0 0 +EDGE2 5018 4977 -0.94873 -0.0484652 0.0135882 1 0 1 1 0 0 +EDGE2 5018 5017 -0.983388 0.0190099 -0.0113524 1 0 1 1 0 0 +EDGE2 5018 4577 -1.01854 0.070659 0.0178845 1 0 1 1 0 0 +EDGE2 5018 4677 -1.10891 -0.0584589 -0.000753514 1 0 1 1 0 0 +EDGE2 5018 4697 -1.11322 -0.0781366 -0.00124593 1 0 1 1 0 0 +EDGE2 5019 4820 0.956194 -0.0495253 -3.16325 1 0 1 1 0 0 +EDGE2 5019 4840 0.931157 0.069456 -3.1375 1 0 1 1 0 0 +EDGE2 5019 4980 1.03951 -0.0188265 0.0349459 1 0 1 1 0 0 +EDGE2 5019 4580 1.03777 0.00783418 -0.000586635 1 0 1 1 0 0 +EDGE2 5019 4680 0.997713 -0.0377277 0.00846154 1 0 1 1 0 0 +EDGE2 5019 4700 0.945469 0.0647998 0.00681837 1 0 1 1 0 0 +EDGE2 5019 5018 -0.992341 0.0963235 -0.0558121 1 0 1 1 0 0 +EDGE2 5019 4679 0.0833477 -0.0331798 -0.0185832 1 0 1 1 0 0 +EDGE2 5019 4699 -0.0296977 0.0514733 0.00212734 1 0 1 1 0 0 +EDGE2 5019 4979 0.0440066 -0.00327084 0.0178718 1 0 1 1 0 0 +EDGE2 5019 4579 0.0106486 0.0562858 -0.024684 1 0 1 1 0 0 +EDGE2 5019 4678 -1.04902 0.0446701 0.00558795 1 0 1 1 0 0 +EDGE2 5019 4698 -1.06056 0.0154179 0.0123657 1 0 1 1 0 0 +EDGE2 5019 4978 -1.02984 -0.0268891 0.0155665 1 0 1 1 0 0 +EDGE2 5019 4578 -0.998235 0.112651 0.00570647 1 0 1 1 0 0 +EDGE2 5020 4839 1.02798 0.0966291 -3.15257 1 0 1 1 0 0 +EDGE2 5020 4819 0.939333 -0.0368848 -3.15566 1 0 1 1 0 0 +EDGE2 5020 4820 -0.0650891 0.00656252 -3.13967 1 0 1 1 0 0 +EDGE2 5020 4821 0.00504033 -0.962956 -1.55111 1 0 1 1 0 0 +EDGE2 5020 4841 -0.00893712 -0.892211 -1.52364 1 0 1 1 0 0 +EDGE2 5020 4840 0.0218243 -0.00162098 -3.16204 1 0 1 1 0 0 +EDGE2 5020 4980 0.0199475 -0.0707164 -0.0272383 1 0 1 1 0 0 +EDGE2 5020 4981 -0.0627481 1.01968 1.56451 1 0 1 1 0 0 +EDGE2 5020 4580 -0.0848465 -0.0708189 -0.025737 1 0 1 1 0 0 +EDGE2 5020 4680 -0.0139512 0.0804525 -0.032561 1 0 1 1 0 0 +EDGE2 5020 4700 -0.0173299 0.0365013 -0.0313553 1 0 1 1 0 0 +EDGE2 5020 4681 0.044074 0.992428 1.57363 1 0 1 1 0 0 +EDGE2 5020 4701 0.0572531 0.945496 1.59767 1 0 1 1 0 0 +EDGE2 5020 4581 0.0363362 0.986613 1.56758 1 0 1 1 0 0 +EDGE2 5020 5019 -0.941833 -0.00498453 0.0186777 1 0 1 1 0 0 +EDGE2 5020 4679 -0.950999 -0.0372364 0.0108235 1 0 1 1 0 0 +EDGE2 5020 4699 -1.10918 -0.0137953 -0.0150133 1 0 1 1 0 0 +EDGE2 5020 4979 -0.994846 0.030101 0.0258787 1 0 1 1 0 0 +EDGE2 5020 4579 -0.974387 0.0467648 -0.0101247 1 0 1 1 0 0 +EDGE2 5021 4820 -0.914289 -0.0260044 1.55864 1 0 1 1 0 0 +EDGE2 5021 4840 -1.0344 0.0406146 1.58654 1 0 1 1 0 0 +EDGE2 5021 4980 -1.05402 0.0252428 -1.53716 1 0 1 1 0 0 +EDGE2 5021 5020 -0.986729 0.0350923 -1.567 1 0 1 1 0 0 +EDGE2 5021 4981 -0.0847542 -0.0628252 -0.00452424 1 0 1 1 0 0 +EDGE2 5021 4580 -0.92632 -0.0420179 -1.57206 1 0 1 1 0 0 +EDGE2 5021 4680 -0.947598 0.00761828 -1.59243 1 0 1 1 0 0 +EDGE2 5021 4700 -1.0199 -0.0446126 -1.56572 1 0 1 1 0 0 +EDGE2 5021 4681 -0.00879418 0.0522169 -0.00312473 1 0 1 1 0 0 +EDGE2 5021 4701 0.042807 -0.0360757 0.0142646 1 0 1 1 0 0 +EDGE2 5021 4581 0.0238488 0.00438248 -0.0105458 1 0 1 1 0 0 +EDGE2 5021 4582 1.00662 0.0455024 -0.0214179 1 0 1 1 0 0 +EDGE2 5021 4702 1.06737 0.0215165 0.00772723 1 0 1 1 0 0 +EDGE2 5021 4982 0.975202 0.156861 0.026398 1 0 1 1 0 0 +EDGE2 5021 4682 0.996812 -0.0160368 -0.00547452 1 0 1 1 0 0 +EDGE2 5022 4981 -0.940655 0.0332662 0.0286528 1 0 1 1 0 0 +EDGE2 5022 5021 -1.02795 -0.0185135 -0.0170049 1 0 1 1 0 0 +EDGE2 5022 4681 -0.943704 0.0554824 0.0193763 1 0 1 1 0 0 +EDGE2 5022 4701 -1.00284 -0.107916 -0.00455826 1 0 1 1 0 0 +EDGE2 5022 4581 -0.978393 0.0734106 -0.00293053 1 0 1 1 0 0 +EDGE2 5022 4583 0.984753 -0.0066355 -0.00801196 1 0 1 1 0 0 +EDGE2 5022 4582 0.12368 0.00272709 -0.0203299 1 0 1 1 0 0 +EDGE2 5022 4702 0.00242717 -0.0469257 -0.00900835 1 0 1 1 0 0 +EDGE2 5022 4982 -0.0309406 0.0213594 0.00116283 1 0 1 1 0 0 +EDGE2 5022 4682 0.0740208 0.0301458 0.00571188 1 0 1 1 0 0 +EDGE2 5022 4703 0.982829 0.0032147 0.0268439 1 0 1 1 0 0 +EDGE2 5022 4983 1.00433 -0.0423332 -0.0266019 1 0 1 1 0 0 +EDGE2 5022 4683 0.904494 -0.0342507 -0.00170292 1 0 1 1 0 0 +EDGE2 5023 4583 0.0182219 -0.0549334 -0.0334811 1 0 1 1 0 0 +EDGE2 5023 4582 -1.02217 0.0445118 0.0171198 1 0 1 1 0 0 +EDGE2 5023 4702 -1.04563 -0.0234925 0.00559461 1 0 1 1 0 0 +EDGE2 5023 4982 -1.05663 -0.0425114 0.0308014 1 0 1 1 0 0 +EDGE2 5023 5022 -0.903835 -0.0517525 0.00521181 1 0 1 1 0 0 +EDGE2 5023 4682 -1.00453 0.0174141 0.00644743 1 0 1 1 0 0 +EDGE2 5023 4703 -0.0334766 -0.0394295 0.0046432 1 0 1 1 0 0 +EDGE2 5023 4983 0.0340334 0.0883471 0.031088 1 0 1 1 0 0 +EDGE2 5023 4683 0.0268879 -0.0342384 -0.00198388 1 0 1 1 0 0 +EDGE2 5023 4684 1.07392 0.0317801 0.0106778 1 0 1 1 0 0 +EDGE2 5023 4704 0.978918 -0.0442322 0.0295945 1 0 1 1 0 0 +EDGE2 5023 4984 0.968599 0.0586081 -0.0400856 1 0 1 1 0 0 +EDGE2 5023 4584 0.956798 -0.0465914 0.00276556 1 0 1 1 0 0 +EDGE2 5024 4583 -1.04473 -0.00271832 -0.040784 1 0 1 1 0 0 +EDGE2 5024 4703 -0.994653 0.0680014 -0.0114394 1 0 1 1 0 0 +EDGE2 5024 4983 -1.07056 -0.0589781 0.0119748 1 0 1 1 0 0 +EDGE2 5024 5023 -0.952387 0.0343527 -0.0122446 1 0 1 1 0 0 +EDGE2 5024 4683 -1.01606 0.0140569 0.0235451 1 0 1 1 0 0 +EDGE2 5024 4705 0.975516 -0.0470149 0.0422912 1 0 1 1 0 0 +EDGE2 5024 4684 -0.0438712 -0.023182 -0.0226962 1 0 1 1 0 0 +EDGE2 5024 4704 -0.00607266 0.041375 0.0137435 1 0 1 1 0 0 +EDGE2 5024 4984 -0.00229854 -0.0582 0.0357324 1 0 1 1 0 0 +EDGE2 5024 4584 -0.0499603 -0.0148026 -0.0109243 1 0 1 1 0 0 +EDGE2 5024 5005 0.949219 0.00741739 -3.16886 1 0 1 1 0 0 +EDGE2 5024 4985 0.996319 -0.0296041 -0.0420117 1 0 1 1 0 0 +EDGE2 5024 3605 0.947727 0.00859675 -3.14725 1 0 1 1 0 0 +EDGE2 5024 4645 1.03775 -0.00956318 -3.12037 1 0 1 1 0 0 +EDGE2 5024 4665 0.936346 0.057823 -3.1094 1 0 1 1 0 0 +EDGE2 5024 4685 1.0263 0.0252946 -0.0457997 1 0 1 1 0 0 +EDGE2 5024 4585 0.987859 0.0280095 0.00140606 1 0 1 1 0 0 +EDGE2 5025 5024 -1.07987 -0.134453 -0.0148449 1 0 1 1 0 0 +EDGE2 5025 4986 -0.0594592 -1.02812 -1.57734 1 0 1 1 0 0 +EDGE2 5025 4646 -0.0134253 -1.08262 -1.55781 1 0 1 1 0 0 +EDGE2 5025 4706 -0.0519919 -0.93849 -1.60154 1 0 1 1 0 0 +EDGE2 5025 4586 -0.0181928 -1.03256 -1.5573 1 0 1 1 0 0 +EDGE2 5025 4644 1.03067 0.0363566 -3.1054 1 0 1 1 0 0 +EDGE2 5025 4705 0.0273045 -0.0196696 -0.0197525 1 0 1 1 0 0 +EDGE2 5025 4684 -0.935014 0.0153502 0.0120068 1 0 1 1 0 0 +EDGE2 5025 4704 -1.06502 -0.0419374 0.0232907 1 0 1 1 0 0 +EDGE2 5025 4984 -0.990568 0.0918279 0.0188783 1 0 1 1 0 0 +EDGE2 5025 4584 -1.0684 0.0237718 0.0430057 1 0 1 1 0 0 +EDGE2 5025 5005 -0.0422422 -0.00259233 -3.14113 1 0 1 1 0 0 +EDGE2 5025 4985 -0.121299 -0.0205431 0.0127232 1 0 1 1 0 0 +EDGE2 5025 3605 -0.0897427 0.0456206 -3.14445 1 0 1 1 0 0 +EDGE2 5025 4645 0.033922 -0.031719 -3.13074 1 0 1 1 0 0 +EDGE2 5025 4665 0.000433646 -0.00718647 -3.11975 1 0 1 1 0 0 +EDGE2 5025 4685 0.0573112 -0.0340561 0.0297315 1 0 1 1 0 0 +EDGE2 5025 4585 -0.0463417 0.044091 -0.0182402 1 0 1 1 0 0 +EDGE2 5025 5004 1.03559 -0.0677591 -3.1344 1 0 1 1 0 0 +EDGE2 5025 4664 0.906241 -0.010492 -3.15948 1 0 1 1 0 0 +EDGE2 5025 3606 0.0185251 0.980406 1.56454 1 0 1 1 0 0 +EDGE2 5025 4686 0.0665997 0.897408 1.54129 1 0 1 1 0 0 +EDGE2 5025 5006 0.0014147 1.05484 1.54844 1 0 1 1 0 0 +EDGE2 5025 4666 0.0570637 0.970237 1.53852 1 0 1 1 0 0 +EDGE2 5025 3604 0.971726 0.0764986 -3.13392 1 0 1 1 0 0 +EDGE2 5026 4707 1.06132 -0.0286245 0.0370596 1 0 1 1 0 0 +EDGE2 5026 4987 0.929114 0.0538748 0.0190609 1 0 1 1 0 0 +EDGE2 5026 4986 -0.0836232 -0.0472302 -0.0099875 1 0 1 1 0 0 +EDGE2 5026 4587 0.958226 0.00562681 -0.020782 1 0 1 1 0 0 +EDGE2 5026 4647 1.0196 0.0180231 0.0310293 1 0 1 1 0 0 +EDGE2 5026 4646 0.00105591 0.0244483 -0.0294247 1 0 1 1 0 0 +EDGE2 5026 4706 0.0367259 -0.0709114 -0.0326125 1 0 1 1 0 0 +EDGE2 5026 4586 0.0250412 -0.0194639 -0.0142116 1 0 1 1 0 0 +EDGE2 5026 4705 -1.10304 0.00799474 1.5515 1 0 1 1 0 0 +EDGE2 5026 5005 -1.07415 0.0185577 -1.56504 1 0 1 1 0 0 +EDGE2 5026 5025 -1.01737 0.0319106 1.53721 1 0 1 1 0 0 +EDGE2 5026 4985 -0.934759 -0.0259344 1.58346 1 0 1 1 0 0 +EDGE2 5026 3605 -0.935942 -0.0936441 -1.56234 1 0 1 1 0 0 +EDGE2 5026 4645 -0.990621 0.0354097 -1.59916 1 0 1 1 0 0 +EDGE2 5026 4665 -1.0003 -0.0600227 -1.59014 1 0 1 1 0 0 +EDGE2 5026 4685 -1.0212 -0.00936726 1.58171 1 0 1 1 0 0 +EDGE2 5026 4585 -0.957417 -0.0530844 1.57086 1 0 1 1 0 0 +EDGE2 5027 4707 0.126749 -0.0333949 -0.0212203 1 0 1 1 0 0 +EDGE2 5027 4708 0.992874 -0.0857001 0.036597 1 0 1 1 0 0 +EDGE2 5027 4988 0.9591 0.0165344 0.01782 1 0 1 1 0 0 +EDGE2 5027 4648 1.05823 0.0146314 0.0400771 1 0 1 1 0 0 +EDGE2 5027 4588 1.04319 -0.0494004 0.0366822 1 0 1 1 0 0 +EDGE2 5027 4987 0.0618851 -0.00811951 -0.0122866 1 0 1 1 0 0 +EDGE2 5027 4986 -0.956757 -0.172533 -0.00158838 1 0 1 1 0 0 +EDGE2 5027 4587 -0.0391728 0.0555396 -0.0226276 1 0 1 1 0 0 +EDGE2 5027 4647 0.0206295 0.0222582 0.0305136 1 0 1 1 0 0 +EDGE2 5027 5026 -1.00631 -0.0282245 0.0221767 1 0 1 1 0 0 +EDGE2 5027 4646 -1.0321 0.0730589 -0.0059829 1 0 1 1 0 0 +EDGE2 5027 4706 -1.06519 -0.00454142 0.0213985 1 0 1 1 0 0 +EDGE2 5027 4586 -0.988839 -0.0454069 -0.02312 1 0 1 1 0 0 +EDGE2 5028 4707 -1.03618 -0.138627 -0.00546379 1 0 1 1 0 0 +EDGE2 5028 4708 -0.000547632 0.0781116 0.0163455 1 0 1 1 0 0 +EDGE2 5028 4649 0.951624 0.0343018 0.0362724 1 0 1 1 0 0 +EDGE2 5028 4989 1.05775 -0.0598407 0.0365102 1 0 1 1 0 0 +EDGE2 5028 4709 0.987264 0.0928733 -0.011748 1 0 1 1 0 0 +EDGE2 5028 4589 0.9389 -0.0247168 -0.0150564 1 0 1 1 0 0 +EDGE2 5028 4988 0.0173107 -0.0346444 0.024067 1 0 1 1 0 0 +EDGE2 5028 4648 0.0195004 -0.00139152 0.00141543 1 0 1 1 0 0 +EDGE2 5028 5027 -0.987463 -0.119858 -0.0452125 1 0 1 1 0 0 +EDGE2 5028 4588 -0.016667 0.0190724 -0.0241243 1 0 1 1 0 0 +EDGE2 5028 4987 -1.04346 0.0437383 0.00541575 1 0 1 1 0 0 +EDGE2 5028 4587 -1.09404 0.0166872 0.0163556 1 0 1 1 0 0 +EDGE2 5028 4647 -0.96837 0.0790074 0.00722673 1 0 1 1 0 0 +EDGE2 5029 4710 0.963304 -0.0702726 -0.00827532 1 0 1 1 0 0 +EDGE2 5029 4990 1.05202 -0.0408348 -0.00930554 1 0 1 1 0 0 +EDGE2 5029 4630 1.00541 -0.0528389 -3.1121 1 0 1 1 0 0 +EDGE2 5029 4650 0.990349 0.0515033 0.0164231 1 0 1 1 0 0 +EDGE2 5029 4590 0.973944 -0.0268286 0.00105798 1 0 1 1 0 0 +EDGE2 5029 4708 -1.0483 -0.00763023 -0.0302798 1 0 1 1 0 0 +EDGE2 5029 4649 0.0246351 0.00952662 -0.0331144 1 0 1 1 0 0 +EDGE2 5029 4989 0.0524928 -0.107482 0.0251885 1 0 1 1 0 0 +EDGE2 5029 4709 -0.0048524 -0.0155593 0.0223423 1 0 1 1 0 0 +EDGE2 5029 5028 -1.04351 -0.0117407 0.0166097 1 0 1 1 0 0 +EDGE2 5029 4589 0.0372137 0.0207298 0.01642 1 0 1 1 0 0 +EDGE2 5029 4988 -0.931489 0.125915 0.0226164 1 0 1 1 0 0 +EDGE2 5029 4648 -1.02688 0.0348159 0.0226541 1 0 1 1 0 0 +EDGE2 5029 4588 -0.983388 0.0360729 0.0157437 1 0 1 1 0 0 +EDGE2 5030 4710 0.0175227 0.130351 0.00350533 1 0 1 1 0 0 +EDGE2 5030 4629 1.01986 0.0897939 -3.10681 1 0 1 1 0 0 +EDGE2 5030 4711 -0.0583961 -1.01789 -1.55467 1 0 1 1 0 0 +EDGE2 5030 4990 -0.0551178 0.0355147 0.0134288 1 0 1 1 0 0 +EDGE2 5030 4630 0.00350209 -0.0202036 -3.13378 1 0 1 1 0 0 +EDGE2 5030 4650 -0.00913627 -0.0334997 -0.0153033 1 0 1 1 0 0 +EDGE2 5030 4590 0.021309 -0.0120204 0.0140951 1 0 1 1 0 0 +EDGE2 5030 4591 -0.0346655 1.01562 1.57656 1 0 1 1 0 0 +EDGE2 5030 4651 0.0104318 0.996778 1.58782 1 0 1 1 0 0 +EDGE2 5030 4991 0.00629501 1.07291 1.56466 1 0 1 1 0 0 +EDGE2 5030 4631 -0.000738067 0.985859 1.59321 1 0 1 1 0 0 +EDGE2 5030 4649 -1.02082 -0.0146427 0.0235738 1 0 1 1 0 0 +EDGE2 5030 4989 -0.971017 0.0123913 -0.0201894 1 0 1 1 0 0 +EDGE2 5030 5029 -0.920257 0.0179367 0.0154938 1 0 1 1 0 0 +EDGE2 5030 4709 -1.07028 -0.131512 -0.0230097 1 0 1 1 0 0 +EDGE2 5030 4589 -1.03936 -0.0428498 0.000536541 1 0 1 1 0 0 +EDGE2 5031 4710 -1.01455 -0.0589789 -1.55269 1 0 1 1 0 0 +EDGE2 5031 5030 -0.96988 0.0396391 -1.59648 1 0 1 1 0 0 +EDGE2 5031 4990 -0.985819 0.0248178 -1.59001 1 0 1 1 0 0 +EDGE2 5031 4630 -0.96697 0.0166895 1.55528 1 0 1 1 0 0 +EDGE2 5031 4650 -1.00904 0.101074 -1.57482 1 0 1 1 0 0 +EDGE2 5031 4590 -0.981698 -0.0482896 -1.578 1 0 1 1 0 0 +EDGE2 5031 4632 1.07363 -0.00675927 0.00665634 1 0 1 1 0 0 +EDGE2 5031 4591 -0.0151122 -0.0130845 0.0166589 1 0 1 1 0 0 +EDGE2 5031 4651 0.044398 -0.0614678 -0.0156994 1 0 1 1 0 0 +EDGE2 5031 4991 0.0370828 0.086027 -0.0219931 1 0 1 1 0 0 +EDGE2 5031 4631 0.0269424 0.0890016 -0.00615818 1 0 1 1 0 0 +EDGE2 5031 4992 0.992448 0.0048125 -0.0214794 1 0 1 1 0 0 +EDGE2 5031 4652 0.981904 0.0590417 0.0111338 1 0 1 1 0 0 +EDGE2 5031 4592 1.02293 0.00755269 0.0132465 1 0 1 1 0 0 +EDGE2 5032 4632 -0.0527513 0.114611 0.0159059 1 0 1 1 0 0 +EDGE2 5032 4591 -1.11742 -0.00708688 -0.0180698 1 0 1 1 0 0 +EDGE2 5032 4651 -0.998192 -0.0613822 0.00288568 1 0 1 1 0 0 +EDGE2 5032 4991 -1.08812 -0.071325 0.0121159 1 0 1 1 0 0 +EDGE2 5032 5031 -1.04756 -0.122363 -0.010314 1 0 1 1 0 0 +EDGE2 5032 4631 -0.923534 0.0023212 0.0408687 1 0 1 1 0 0 +EDGE2 5032 4992 -0.10599 0.120927 0.00786858 1 0 1 1 0 0 +EDGE2 5032 4652 -0.0993324 -0.146769 -0.00260302 1 0 1 1 0 0 +EDGE2 5032 4653 0.908477 -0.0207717 -0.00674078 1 0 1 1 0 0 +EDGE2 5032 4592 -0.0197069 -0.0784441 -0.0054972 1 0 1 1 0 0 +EDGE2 5032 4993 1.03988 -0.014596 0.0163626 1 0 1 1 0 0 +EDGE2 5032 4593 1.02397 0.0140821 0.0128691 1 0 1 1 0 0 +EDGE2 5032 4633 1.00253 0.030169 0.0553498 1 0 1 1 0 0 +EDGE2 5033 4632 -0.955153 -0.0975599 0.0170233 1 0 1 1 0 0 +EDGE2 5033 4992 -1.02328 -0.0255784 -0.0178037 1 0 1 1 0 0 +EDGE2 5033 5032 -0.919986 0.0296859 0.00945031 1 0 1 1 0 0 +EDGE2 5033 4652 -0.95808 0.0968413 0.0101965 1 0 1 1 0 0 +EDGE2 5033 4653 0.0160203 0.0706046 0.0078146 1 0 1 1 0 0 +EDGE2 5033 4592 -1.03759 0.072121 -0.00306813 1 0 1 1 0 0 +EDGE2 5033 4993 0.0222511 0.0250608 0.00195846 1 0 1 1 0 0 +EDGE2 5033 4593 0.0218792 0.0489486 0.00814482 1 0 1 1 0 0 +EDGE2 5033 4633 0.017279 -0.0184385 0.0298591 1 0 1 1 0 0 +EDGE2 5033 4634 0.952219 0.0215165 -0.0248919 1 0 1 1 0 0 +EDGE2 5033 4654 0.935521 0.0129768 0.0225107 1 0 1 1 0 0 +EDGE2 5033 4994 1.01151 0.0719069 0.0198487 1 0 1 1 0 0 +EDGE2 5033 4594 1.03898 0.0238055 -0.0338684 1 0 1 1 0 0 +EDGE2 5034 4653 -1.06632 0.0420278 0.0108644 1 0 1 1 0 0 +EDGE2 5034 5033 -1.0545 0.00341014 0.0123244 1 0 1 1 0 0 +EDGE2 5034 4993 -0.975988 -0.0423344 -0.00674519 1 0 1 1 0 0 +EDGE2 5034 4593 -1.01209 0.0891473 -0.0163158 1 0 1 1 0 0 +EDGE2 5034 4633 -1.03724 -0.0116869 -0.0153503 1 0 1 1 0 0 +EDGE2 5034 4634 -0.0172229 -0.00863416 0.0233865 1 0 1 1 0 0 +EDGE2 5034 4654 0.00941161 -0.0158641 0.0144398 1 0 1 1 0 0 +EDGE2 5034 4994 -0.0412856 -0.044761 -0.0274603 1 0 1 1 0 0 +EDGE2 5034 4594 0.0496961 -0.0288767 -0.0371004 1 0 1 1 0 0 +EDGE2 5034 2915 0.984242 -0.00526276 -3.18085 1 0 1 1 0 0 +EDGE2 5034 4635 0.984798 -0.0215071 0.0175664 1 0 1 1 0 0 +EDGE2 5034 4995 0.904809 -0.0366026 -0.0139332 1 0 1 1 0 0 +EDGE2 5034 4655 1.00714 -0.014692 -0.0517553 1 0 1 1 0 0 +EDGE2 5034 4595 0.997578 0.0207986 -0.0293903 1 0 1 1 0 0 +EDGE2 5034 3595 1.02259 -0.110417 -3.16761 1 0 1 1 0 0 +EDGE2 5034 3735 0.984071 0.0731787 -3.15931 1 0 1 1 0 0 +EDGE2 5034 3755 1.02535 -0.0296067 -3.15559 1 0 1 1 0 0 +EDGE2 5034 3575 1.01391 0.0363573 -3.15447 1 0 1 1 0 0 +EDGE2 5035 5034 -0.966187 -0.0473154 -0.0323658 1 0 1 1 0 0 +EDGE2 5035 4634 -1.01693 -0.0808175 0.0137002 1 0 1 1 0 0 +EDGE2 5035 4654 -1.02644 -0.127636 -0.00238796 1 0 1 1 0 0 +EDGE2 5035 4994 -1.0059 -0.0741366 0.0400013 1 0 1 1 0 0 +EDGE2 5035 4594 -1.02159 -0.0578141 -0.0182984 1 0 1 1 0 0 +EDGE2 5035 2915 0.0268386 -0.0169837 -3.17851 1 0 1 1 0 0 +EDGE2 5035 4635 -0.0609352 -0.136516 -0.022973 1 0 1 1 0 0 +EDGE2 5035 2916 -0.0416787 -0.881412 -1.5827 1 0 1 1 0 0 +EDGE2 5035 3736 0.0329049 -0.991881 -1.58406 1 0 1 1 0 0 +EDGE2 5035 4596 0.0367747 -0.987968 -1.57524 1 0 1 1 0 0 +EDGE2 5035 3576 -0.0750511 -1.03317 -1.59384 1 0 1 1 0 0 +EDGE2 5035 4995 0.0709031 -0.0504286 0.00313921 1 0 1 1 0 0 +EDGE2 5035 4655 0.0412287 -0.0492454 0.000600552 1 0 1 1 0 0 +EDGE2 5035 4595 -0.0366377 -0.110825 0.0240166 1 0 1 1 0 0 +EDGE2 5035 3595 0.0101207 -0.0443795 -3.12599 1 0 1 1 0 0 +EDGE2 5035 3735 -0.0280392 -0.0168199 -3.13962 1 0 1 1 0 0 +EDGE2 5035 3755 -0.0164059 -0.0637807 -3.10045 1 0 1 1 0 0 +EDGE2 5035 3575 0.0159217 0.0658876 -3.14061 1 0 1 1 0 0 +EDGE2 5035 2914 0.931114 0.0454031 -3.15373 1 0 1 1 0 0 +EDGE2 5035 3594 0.986399 -0.052948 -3.17592 1 0 1 1 0 0 +EDGE2 5035 3734 1.00513 -0.0768337 -3.17655 1 0 1 1 0 0 +EDGE2 5035 3754 0.961118 0.0230493 -3.14773 1 0 1 1 0 0 +EDGE2 5035 3574 1.00827 0.00873383 -3.14592 1 0 1 1 0 0 +EDGE2 5035 4636 0.0508992 1.06877 1.58439 1 0 1 1 0 0 +EDGE2 5035 4996 0.00644394 1.00304 1.56565 1 0 1 1 0 0 +EDGE2 5035 4656 -0.00565895 1.04817 1.56973 1 0 1 1 0 0 +EDGE2 5035 3596 -0.00341286 1.03062 1.55674 1 0 1 1 0 0 +EDGE2 5035 3756 0.0317607 0.997927 1.58061 1 0 1 1 0 0 +EDGE2 5036 2915 -0.961347 -0.0214895 1.60312 1 0 1 1 0 0 +EDGE2 5036 4635 -0.985759 0.0592077 -1.56028 1 0 1 1 0 0 +EDGE2 5036 4995 -0.96618 -0.0015643 -1.57142 1 0 1 1 0 0 +EDGE2 5036 5035 -1.00698 -0.0258679 -1.56398 1 0 1 1 0 0 +EDGE2 5036 4655 -0.993737 -0.0407157 -1.58239 1 0 1 1 0 0 +EDGE2 5036 4595 -1.02577 -0.0105677 -1.56592 1 0 1 1 0 0 +EDGE2 5036 3595 -1.06514 0.00121495 1.54216 1 0 1 1 0 0 +EDGE2 5036 3735 -0.953254 0.0800439 1.57673 1 0 1 1 0 0 +EDGE2 5036 3755 -0.971061 0.00228637 1.60402 1 0 1 1 0 0 +EDGE2 5036 3575 -1.01855 -0.000172448 1.56101 1 0 1 1 0 0 +EDGE2 5036 3597 1.06189 0.0816262 -0.0184905 1 0 1 1 0 0 +EDGE2 5036 4997 1.09046 0.0241183 0.0100763 1 0 1 1 0 0 +EDGE2 5036 4636 0.113252 0.0339535 0.019704 1 0 1 1 0 0 +EDGE2 5036 4996 0.0175238 0.0448915 -0.0215329 1 0 1 1 0 0 +EDGE2 5036 4656 0.0396335 -0.0188562 0.0120135 1 0 1 1 0 0 +EDGE2 5036 3596 0.0289347 -0.0144058 -0.00200503 1 0 1 1 0 0 +EDGE2 5036 3756 0.0905479 -0.0113134 -0.0155915 1 0 1 1 0 0 +EDGE2 5036 4637 0.985618 -0.0901154 -0.0137369 1 0 1 1 0 0 +EDGE2 5036 4657 0.984338 -0.0167907 -0.00882042 1 0 1 1 0 0 +EDGE2 5036 3757 0.968213 0.0591717 -0.0378262 1 0 1 1 0 0 +EDGE2 5037 3597 -0.00594744 -0.0425448 -0.00315677 1 0 1 1 0 0 +EDGE2 5037 4997 0.0349978 -0.0527305 -0.00718011 1 0 1 1 0 0 +EDGE2 5037 4636 -0.99847 0.0423291 -0.0169539 1 0 1 1 0 0 +EDGE2 5037 4996 -0.961884 -0.0562013 0.0257961 1 0 1 1 0 0 +EDGE2 5037 5036 -1.04026 -0.0916554 -0.0364912 1 0 1 1 0 0 +EDGE2 5037 4656 -1.01591 0.00223502 -0.00663157 1 0 1 1 0 0 +EDGE2 5037 3596 -1.04151 0.0490868 -0.00300117 1 0 1 1 0 0 +EDGE2 5037 3756 -1.08467 -0.0403227 -0.00095216 1 0 1 1 0 0 +EDGE2 5037 4637 0.0451498 -0.0297096 -0.000825006 1 0 1 1 0 0 +EDGE2 5037 4657 0.00868618 0.0150602 -0.0135565 1 0 1 1 0 0 +EDGE2 5037 3757 0.000242621 -0.0688768 0.0183969 1 0 1 1 0 0 +EDGE2 5037 4638 0.946936 0.0898739 0.0174233 1 0 1 1 0 0 +EDGE2 5037 4998 0.902729 0.0669105 -0.0164992 1 0 1 1 0 0 +EDGE2 5037 4658 1.01853 -0.0865596 0.0391665 1 0 1 1 0 0 +EDGE2 5037 3598 0.957468 0.0947058 -0.0166381 1 0 1 1 0 0 +EDGE2 5037 3758 0.940781 -0.0429639 -0.0226641 1 0 1 1 0 0 +EDGE2 5038 3597 -0.994274 -0.000330134 -0.0234745 1 0 1 1 0 0 +EDGE2 5038 4997 -1.00249 0.021936 0.0226852 1 0 1 1 0 0 +EDGE2 5038 5037 -1.01109 0.0617373 -0.0282422 1 0 1 1 0 0 +EDGE2 5038 4637 -1.02997 0.0269414 0.00415753 1 0 1 1 0 0 +EDGE2 5038 4657 -0.941584 0.0545719 0.00637859 1 0 1 1 0 0 +EDGE2 5038 3757 -1.03861 -0.048799 -0.00661605 1 0 1 1 0 0 +EDGE2 5038 4999 0.977976 0.0173551 -0.0122725 1 0 1 1 0 0 +EDGE2 5038 4638 0.0133983 0.0817425 0.0107212 1 0 1 1 0 0 +EDGE2 5038 4998 -0.00440798 -0.0593506 0.0298707 1 0 1 1 0 0 +EDGE2 5038 4658 0.00342862 0.0214243 -0.029538 1 0 1 1 0 0 +EDGE2 5038 3598 0.0104962 -0.075427 0.00605781 1 0 1 1 0 0 +EDGE2 5038 3758 -0.0129716 0.04552 0.0214745 1 0 1 1 0 0 +EDGE2 5038 4639 0.925206 -0.0134682 -0.0161666 1 0 1 1 0 0 +EDGE2 5038 4659 0.975419 0.0468074 -0.0265725 1 0 1 1 0 0 +EDGE2 5038 3599 0.944181 0.0751799 -0.00529949 1 0 1 1 0 0 +EDGE2 5038 3759 0.992252 -0.013942 0.00354052 1 0 1 1 0 0 +EDGE2 5039 4999 0.00731507 -0.0364759 0.0142918 1 0 1 1 0 0 +EDGE2 5039 4638 -1.07041 -0.0417061 0.00792656 1 0 1 1 0 0 +EDGE2 5039 4998 -1.03875 0.000322388 -0.0155692 1 0 1 1 0 0 +EDGE2 5039 5038 -1.03503 -0.041748 0.00482075 1 0 1 1 0 0 +EDGE2 5039 4658 -1.02251 0.0385676 0.00238763 1 0 1 1 0 0 +EDGE2 5039 3598 -0.94546 0.015419 -0.0017396 1 0 1 1 0 0 +EDGE2 5039 3758 -1.00002 0.0314938 -0.020267 1 0 1 1 0 0 +EDGE2 5039 4639 0.00785242 -0.0588705 0.0119352 1 0 1 1 0 0 +EDGE2 5039 4659 -0.0202768 -0.0562973 0.0266317 1 0 1 1 0 0 +EDGE2 5039 3599 -0.0387956 -0.0639658 -0.00870723 1 0 1 1 0 0 +EDGE2 5039 3759 -0.0631057 -0.0447818 0.0307542 1 0 1 1 0 0 +EDGE2 5039 3680 1.03803 0.0277166 -3.15397 1 0 1 1 0 0 +EDGE2 5039 5000 1.02302 0.0344102 -0.0242247 1 0 1 1 0 0 +EDGE2 5039 3820 1.00963 0.00563277 -3.14638 1 0 1 1 0 0 +EDGE2 5039 4640 0.973718 0.00943684 -0.0190289 1 0 1 1 0 0 +EDGE2 5039 4660 1.03115 0.0670592 0.0374929 1 0 1 1 0 0 +EDGE2 5039 3760 0.948204 0.007807 -0.00968677 1 0 1 1 0 0 +EDGE2 5039 3600 1.05489 0.0984233 -0.0211127 1 0 1 1 0 0 +EDGE2 5039 3640 0.963376 0.0497337 -3.11592 1 0 1 1 0 0 +EDGE2 5039 3660 1.01568 -0.00999631 -3.12181 1 0 1 1 0 0 +EDGE2 5040 4999 -1.04989 -0.0502683 -0.0200844 1 0 1 1 0 0 +EDGE2 5040 5039 -0.989475 0.0773278 0.00591319 1 0 1 1 0 0 +EDGE2 5040 4639 -0.986333 0.0292054 -0.0188508 1 0 1 1 0 0 +EDGE2 5040 4659 -0.940746 0.00914481 0.00476495 1 0 1 1 0 0 +EDGE2 5040 3599 -0.984543 0.0614654 -0.00955922 1 0 1 1 0 0 +EDGE2 5040 3759 -0.981808 -0.0135962 -0.0139239 1 0 1 1 0 0 +EDGE2 5040 3680 0.11695 0.0418259 -3.11881 1 0 1 1 0 0 +EDGE2 5040 4661 -0.00720721 1.11916 1.57875 1 0 1 1 0 0 +EDGE2 5040 5001 -0.0462268 0.979115 1.53615 1 0 1 1 0 0 +EDGE2 5040 5000 -0.0517104 -0.0335069 -0.0166593 1 0 1 1 0 0 +EDGE2 5040 3601 0.0052534 1.00672 1.57885 1 0 1 1 0 0 +EDGE2 5040 4641 -0.0949968 0.93287 1.58322 1 0 1 1 0 0 +EDGE2 5040 3820 0.0540461 -0.0428697 -3.15748 1 0 1 1 0 0 +EDGE2 5040 4640 0.0338742 0.0616923 -0.00995573 1 0 1 1 0 0 +EDGE2 5040 4660 -0.0078461 0.0180698 -0.0270025 1 0 1 1 0 0 +EDGE2 5040 3760 -0.0692752 0.075124 0.0175375 1 0 1 1 0 0 +EDGE2 5040 3761 0.0497336 -0.968537 -1.60801 1 0 1 1 0 0 +EDGE2 5040 3600 -0.0675942 -0.0360516 -0.00929776 1 0 1 1 0 0 +EDGE2 5040 3640 0.0194305 -0.0453574 -3.11909 1 0 1 1 0 0 +EDGE2 5040 3660 0.00349347 -0.0468189 -3.14678 1 0 1 1 0 0 +EDGE2 5040 3821 0.0626565 -1.05993 -1.60174 1 0 1 1 0 0 +EDGE2 5040 3641 0.028695 -1.03351 -1.58578 1 0 1 1 0 0 +EDGE2 5040 3661 -0.0866296 -1.013 -1.56223 1 0 1 1 0 0 +EDGE2 5040 3681 0.0129605 -0.996653 -1.57193 1 0 1 1 0 0 +EDGE2 5040 3659 0.956971 -0.00795601 -3.12455 1 0 1 1 0 0 +EDGE2 5040 3679 0.881338 0.0521983 -3.13437 1 0 1 1 0 0 +EDGE2 5040 3819 1.05556 0.0965861 -3.13347 1 0 1 1 0 0 +EDGE2 5040 3639 1.02481 0.00391314 -3.21947 1 0 1 1 0 0 +EDGE2 5041 3680 -0.989764 -0.108328 1.5831 1 0 1 1 0 0 +EDGE2 5041 4661 0.0692258 -0.124532 0.00767925 1 0 1 1 0 0 +EDGE2 5041 4642 0.907637 0.0270029 0.00699207 1 0 1 1 0 0 +EDGE2 5041 5002 0.956772 -0.0442713 0.0202029 1 0 1 1 0 0 +EDGE2 5041 4662 0.998054 -0.019304 -0.00170715 1 0 1 1 0 0 +EDGE2 5041 3602 1.15167 0.102148 -0.0189471 1 0 1 1 0 0 +EDGE2 5041 5001 -0.0634577 0.0299945 -0.0190435 1 0 1 1 0 0 +EDGE2 5041 5000 -1.02636 0.0655095 -1.60007 1 0 1 1 0 0 +EDGE2 5041 3601 0.0512613 0.0130829 0.0269673 1 0 1 1 0 0 +EDGE2 5041 4641 -0.0375964 -0.0294475 0.0160653 1 0 1 1 0 0 +EDGE2 5041 5040 -1.02398 0.0328546 -1.52758 1 0 1 1 0 0 +EDGE2 5041 3820 -1.07005 -0.0153797 1.62804 1 0 1 1 0 0 +EDGE2 5041 4640 -1.03173 -0.0586205 -1.59578 1 0 1 1 0 0 +EDGE2 5041 4660 -1.01617 0.000817618 -1.5623 1 0 1 1 0 0 +EDGE2 5041 3760 -1.01617 0.00433596 -1.58412 1 0 1 1 0 0 +EDGE2 5041 3600 -0.963276 0.0698089 -1.56462 1 0 1 1 0 0 +EDGE2 5041 3640 -1.00419 -0.0989822 1.56011 1 0 1 1 0 0 +EDGE2 5041 3660 -0.968282 0.053521 1.59072 1 0 1 1 0 0 +EDGE2 5042 4663 1.01144 0.0626552 -0.00397763 1 0 1 1 0 0 +EDGE2 5042 5003 0.947731 -0.00374974 -0.0275184 1 0 1 1 0 0 +EDGE2 5042 3603 1.05502 0.0391454 -0.037121 1 0 1 1 0 0 +EDGE2 5042 4643 0.984312 0.0316942 0.0340623 1 0 1 1 0 0 +EDGE2 5042 4661 -1.07917 0.0426411 -0.00258841 1 0 1 1 0 0 +EDGE2 5042 4642 0.0124572 0.0155143 -0.0525939 1 0 1 1 0 0 +EDGE2 5042 5002 0.0632263 -0.0327208 -0.0393037 1 0 1 1 0 0 +EDGE2 5042 4662 0.0359107 -0.151259 0.0063595 1 0 1 1 0 0 +EDGE2 5042 5041 -1.02297 0.0389921 0.0122073 1 0 1 1 0 0 +EDGE2 5042 3602 -0.0421545 -0.0414542 0.0141319 1 0 1 1 0 0 +EDGE2 5042 5001 -1.17172 -0.0205799 0.000194546 1 0 1 1 0 0 +EDGE2 5042 3601 -0.922675 -0.0726811 0.0135306 1 0 1 1 0 0 +EDGE2 5042 4641 -0.971055 0.0382807 -0.000492185 1 0 1 1 0 0 +EDGE2 5043 4644 1.01096 0.0612014 0.00642542 1 0 1 1 0 0 +EDGE2 5043 5004 1.07554 0.11899 0.0245749 1 0 1 1 0 0 +EDGE2 5043 4664 1.06496 -0.034956 -0.0352489 1 0 1 1 0 0 +EDGE2 5043 4663 -0.0707701 0.0420882 -0.0232443 1 0 1 1 0 0 +EDGE2 5043 3604 1.01315 -0.0525479 0.0210334 1 0 1 1 0 0 +EDGE2 5043 5003 0.0980617 0.0127022 0.00461163 1 0 1 1 0 0 +EDGE2 5043 3603 -0.00127275 0.0377328 -0.0116912 1 0 1 1 0 0 +EDGE2 5043 4643 0.00689266 0.035351 0.0175369 1 0 1 1 0 0 +EDGE2 5043 4642 -0.985512 -0.148825 -0.0302969 1 0 1 1 0 0 +EDGE2 5043 5002 -0.992813 -0.0572672 -0.0131856 1 0 1 1 0 0 +EDGE2 5043 5042 -0.96154 0.00960408 0.0115024 1 0 1 1 0 0 +EDGE2 5043 4662 -0.964862 -0.00901462 0.00166034 1 0 1 1 0 0 +EDGE2 5043 3602 -0.909516 -0.070885 -0.0175541 1 0 1 1 0 0 +EDGE2 5044 4644 -0.0172753 -0.00528634 -0.00538123 1 0 1 1 0 0 +EDGE2 5044 4705 1.11468 0.0390118 -3.15265 1 0 1 1 0 0 +EDGE2 5044 5005 0.98721 0.0341809 0.0209196 1 0 1 1 0 0 +EDGE2 5044 5025 1.04699 0.00331851 -3.18354 1 0 1 1 0 0 +EDGE2 5044 4985 0.923353 0.0013007 -3.14579 1 0 1 1 0 0 +EDGE2 5044 3605 0.980749 -0.0507619 0.00389324 1 0 1 1 0 0 +EDGE2 5044 4645 0.993137 0.0358132 0.000823456 1 0 1 1 0 0 +EDGE2 5044 4665 0.955129 0.0123823 0.00500487 1 0 1 1 0 0 +EDGE2 5044 4685 0.95775 0.0867266 -3.15524 1 0 1 1 0 0 +EDGE2 5044 4585 1.02476 -0.031749 -3.12248 1 0 1 1 0 0 +EDGE2 5044 5004 0.0398209 -0.013917 -0.00314998 1 0 1 1 0 0 +EDGE2 5044 4664 -0.00216172 -0.0340505 -0.0333969 1 0 1 1 0 0 +EDGE2 5044 4663 -0.986155 -0.021533 -0.0348836 1 0 1 1 0 0 +EDGE2 5044 5043 -1.11697 0.0147619 -0.00236819 1 0 1 1 0 0 +EDGE2 5044 3604 -0.0759931 -0.000652854 -0.00631024 1 0 1 1 0 0 +EDGE2 5044 5003 -1.02419 0.0605792 -0.0420805 1 0 1 1 0 0 +EDGE2 5044 3603 -1.03252 0.0657685 -0.00254371 1 0 1 1 0 0 +EDGE2 5044 4643 -1.04843 0.00847905 0.00194886 1 0 1 1 0 0 +EDGE2 5045 5024 1.0055 0.0765973 -3.14138 1 0 1 1 0 0 +EDGE2 5045 4986 0.0132602 1.01444 1.55826 1 0 1 1 0 0 +EDGE2 5045 5026 0.0123694 0.98823 1.59189 1 0 1 1 0 0 +EDGE2 5045 4646 0.0425327 1.055 1.52253 1 0 1 1 0 0 +EDGE2 5045 4706 0.0177051 0.997124 1.54367 1 0 1 1 0 0 +EDGE2 5045 4586 -0.0199487 1.00527 1.58669 1 0 1 1 0 0 +EDGE2 5045 4644 -1.00018 -0.00622894 -0.0171144 1 0 1 1 0 0 +EDGE2 5045 4705 -0.0714168 -0.0233498 -3.13596 1 0 1 1 0 0 +EDGE2 5045 4684 1.07561 0.068867 -3.13857 1 0 1 1 0 0 +EDGE2 5045 4704 1.06315 0.0161542 -3.15818 1 0 1 1 0 0 +EDGE2 5045 4984 1.02683 0.0887102 -3.14381 1 0 1 1 0 0 +EDGE2 5045 4584 0.988566 0.00191895 -3.1243 1 0 1 1 0 0 +EDGE2 5045 5005 0.0140213 0.0785228 -0.00631356 1 0 1 1 0 0 +EDGE2 5045 5025 -0.0774779 -0.0323995 -3.17034 1 0 1 1 0 0 +EDGE2 5045 4985 0.0154403 0.0975019 -3.16149 1 0 1 1 0 0 +EDGE2 5045 3605 -0.0116444 -0.0177501 0.0142295 1 0 1 1 0 0 +EDGE2 5045 4645 -0.0266746 0.0680683 -6.78222e-05 1 0 1 1 0 0 +EDGE2 5045 4665 -0.00321455 -0.0426306 0.00533746 1 0 1 1 0 0 +EDGE2 5045 4685 0.00289761 -0.0966255 -3.16842 1 0 1 1 0 0 +EDGE2 5045 4585 0.0794438 0.00800277 -3.13541 1 0 1 1 0 0 +EDGE2 5045 5004 -1.06522 -0.0476811 0.0157646 1 0 1 1 0 0 +EDGE2 5045 5044 -0.961159 0.0949544 -0.0426687 1 0 1 1 0 0 +EDGE2 5045 4664 -0.993005 0.0313604 -0.0180657 1 0 1 1 0 0 +EDGE2 5045 3606 0.0398868 -1.03044 -1.53312 1 0 1 1 0 0 +EDGE2 5045 4686 -0.0074096 -1.0371 -1.57087 1 0 1 1 0 0 +EDGE2 5045 5006 0.00757825 -1.00967 -1.57685 1 0 1 1 0 0 +EDGE2 5045 4666 0.0248443 -0.993074 -1.55691 1 0 1 1 0 0 +EDGE2 5045 3604 -0.955495 -0.0445563 0.010926 1 0 1 1 0 0 +EDGE2 5046 4707 1.0201 0.0089893 -0.0203241 1 0 1 1 0 0 +EDGE2 5046 5027 0.95912 -0.000963205 -0.0340704 1 0 1 1 0 0 +EDGE2 5046 4987 0.890755 0.0625454 -0.0165486 1 0 1 1 0 0 +EDGE2 5046 4986 0.092634 -0.0240241 0.0154682 1 0 1 1 0 0 +EDGE2 5046 4587 0.956972 -0.0677491 0.0262787 1 0 1 1 0 0 +EDGE2 5046 4647 0.973177 0.0233677 -0.022797 1 0 1 1 0 0 +EDGE2 5046 5026 0.0203562 -0.0947668 -0.0132069 1 0 1 1 0 0 +EDGE2 5046 4646 0.0696344 0.015268 0.0113976 1 0 1 1 0 0 +EDGE2 5046 4706 -0.0204452 0.0211607 -0.00323715 1 0 1 1 0 0 +EDGE2 5046 4586 -0.0233578 -0.0861795 -0.0277544 1 0 1 1 0 0 +EDGE2 5046 4705 -1.0466 -0.0266065 1.6045 1 0 1 1 0 0 +EDGE2 5046 5005 -1.0236 0.00230424 -1.57097 1 0 1 1 0 0 +EDGE2 5046 5025 -0.97577 -0.0401979 1.57798 1 0 1 1 0 0 +EDGE2 5046 5045 -0.982301 -0.0625449 -1.56948 1 0 1 1 0 0 +EDGE2 5046 4985 -0.940753 0.0322454 1.557 1 0 1 1 0 0 +EDGE2 5046 3605 -1.04749 -0.0530858 -1.58402 1 0 1 1 0 0 +EDGE2 5046 4645 -1.0804 -0.0685887 -1.57527 1 0 1 1 0 0 +EDGE2 5046 4665 -1.05273 0.0426478 -1.57232 1 0 1 1 0 0 +EDGE2 5046 4685 -1.03318 0.0449556 1.60568 1 0 1 1 0 0 +EDGE2 5046 4585 -0.99111 0.053012 1.57158 1 0 1 1 0 0 +EDGE2 5047 4707 0.035242 0.0141148 0.0182281 1 0 1 1 0 0 +EDGE2 5047 4708 1.06499 -0.103649 0.00647444 1 0 1 1 0 0 +EDGE2 5047 5028 1.01865 -0.00792765 0.0155553 1 0 1 1 0 0 +EDGE2 5047 4988 1.12128 0.0243808 0.00737292 1 0 1 1 0 0 +EDGE2 5047 4648 0.969467 -0.0180775 -0.0221849 1 0 1 1 0 0 +EDGE2 5047 5027 -0.0305999 0.0206871 0.0094186 1 0 1 1 0 0 +EDGE2 5047 4588 0.98116 -0.00728043 0.0120294 1 0 1 1 0 0 +EDGE2 5047 4987 -0.045455 -0.0297311 -0.00214525 1 0 1 1 0 0 +EDGE2 5047 4986 -1.00539 0.0127596 -0.0166976 1 0 1 1 0 0 +EDGE2 5047 5046 -1.04773 0.0732778 -0.0183794 1 0 1 1 0 0 +EDGE2 5047 4587 0.0032409 0.0665799 -0.0306841 1 0 1 1 0 0 +EDGE2 5047 4647 -0.00253618 0.000784338 0.00975287 1 0 1 1 0 0 +EDGE2 5047 5026 -0.951287 -0.0677493 0.025435 1 0 1 1 0 0 +EDGE2 5047 4646 -1.04702 0.00244045 -0.0110539 1 0 1 1 0 0 +EDGE2 5047 4706 -0.973954 0.0722479 -0.00976514 1 0 1 1 0 0 +EDGE2 5047 4586 -1.02051 -0.0690647 -0.00888409 1 0 1 1 0 0 +EDGE2 5048 4707 -1.0258 0.00627672 0.0134438 1 0 1 1 0 0 +EDGE2 5048 4708 -0.0235526 -0.0240445 0.025708 1 0 1 1 0 0 +EDGE2 5048 4649 0.991796 0.018616 -0.00225481 1 0 1 1 0 0 +EDGE2 5048 4989 0.91309 -0.0676196 -0.0114777 1 0 1 1 0 0 +EDGE2 5048 5029 0.999334 -0.0121884 -0.00775048 1 0 1 1 0 0 +EDGE2 5048 4709 0.886428 -0.0467956 -0.0116729 1 0 1 1 0 0 +EDGE2 5048 5028 0.0536796 -0.0199807 -0.00979154 1 0 1 1 0 0 +EDGE2 5048 4589 0.966641 0.0174082 0.00176985 1 0 1 1 0 0 +EDGE2 5048 4988 0.0783708 0.0168838 0.0258702 1 0 1 1 0 0 +EDGE2 5048 4648 -0.0498627 0.0599339 -0.0114448 1 0 1 1 0 0 +EDGE2 5048 5027 -0.916519 0.0473622 -0.0165482 1 0 1 1 0 0 +EDGE2 5048 5047 -1.0412 -0.109238 0.00685898 1 0 1 1 0 0 +EDGE2 5048 4588 -0.0474974 0.0581858 -0.0116032 1 0 1 1 0 0 +EDGE2 5048 4987 -1.08516 0.0475397 -0.0111028 1 0 1 1 0 0 +EDGE2 5048 4587 -0.973439 -0.00717315 0.00394468 1 0 1 1 0 0 +EDGE2 5048 4647 -0.969445 -0.0352619 0.000409471 1 0 1 1 0 0 +EDGE2 5049 4710 0.917226 0.103237 0.00260875 1 0 1 1 0 0 +EDGE2 5049 5030 0.974327 -0.00858961 0.0173049 1 0 1 1 0 0 +EDGE2 5049 4990 0.97533 -0.004932 0.00859239 1 0 1 1 0 0 +EDGE2 5049 4630 0.955393 -0.0682447 -3.14427 1 0 1 1 0 0 +EDGE2 5049 4650 0.948069 -0.0670716 -0.0264492 1 0 1 1 0 0 +EDGE2 5049 4590 1.02226 0.0457484 -0.0109181 1 0 1 1 0 0 +EDGE2 5049 4708 -1.06733 -0.032883 -0.0211321 1 0 1 1 0 0 +EDGE2 5049 4649 -0.0354676 0.00718463 0.0478525 1 0 1 1 0 0 +EDGE2 5049 4989 0.0193216 -0.0133072 0.00294344 1 0 1 1 0 0 +EDGE2 5049 5029 0.0377458 0.00623718 -0.00409523 1 0 1 1 0 0 +EDGE2 5049 4709 -0.0599791 0.00973148 0.0106868 1 0 1 1 0 0 +EDGE2 5049 5028 -1.0139 0.0626469 0.011699 1 0 1 1 0 0 +EDGE2 5049 5048 -0.911347 0.00348692 -0.00754022 1 0 1 1 0 0 +EDGE2 5049 4589 0.0217537 0.0534923 -0.0237696 1 0 1 1 0 0 +EDGE2 5049 4988 -0.960416 -0.0223813 -0.00156329 1 0 1 1 0 0 +EDGE2 5049 4648 -0.943298 0.0419444 -0.0140945 1 0 1 1 0 0 +EDGE2 5049 4588 -0.966643 0.0608425 0.0216724 1 0 1 1 0 0 +EDGE2 5050 4710 0.0598834 -0.00248284 0.0121172 1 0 1 1 0 0 +EDGE2 5050 4629 1.04672 -0.0157465 -3.12333 1 0 1 1 0 0 +EDGE2 5050 5030 0.0616342 -0.0898295 -0.0043937 1 0 1 1 0 0 +EDGE2 5050 4711 -0.0217928 -1.0268 -1.57777 1 0 1 1 0 0 +EDGE2 5050 4990 0.00703801 -0.0164563 -0.0225425 1 0 1 1 0 0 +EDGE2 5050 4630 0.0419865 -0.101417 -3.14859 1 0 1 1 0 0 +EDGE2 5050 4650 0.0132265 0.0372399 -0.00407399 1 0 1 1 0 0 +EDGE2 5050 4590 -0.0367737 0.0818708 0.0104138 1 0 1 1 0 0 +EDGE2 5050 4591 -0.112369 0.970204 1.62649 1 0 1 1 0 0 +EDGE2 5050 4651 -0.0547418 1.12408 1.56312 1 0 1 1 0 0 +EDGE2 5050 4991 0.112058 0.958261 1.59404 1 0 1 1 0 0 +EDGE2 5050 5031 0.0448419 1.09716 1.5473 1 0 1 1 0 0 +EDGE2 5050 4631 -0.0279505 1.03402 1.6265 1 0 1 1 0 0 +EDGE2 5050 4649 -0.957667 -0.0664208 -0.0246921 1 0 1 1 0 0 +EDGE2 5050 4989 -1.05602 0.0499355 0.000508693 1 0 1 1 0 0 +EDGE2 5050 5029 -0.92699 0.0595255 0.0204363 1 0 1 1 0 0 +EDGE2 5050 5049 -0.933245 -0.0487457 0.0282935 1 0 1 1 0 0 +EDGE2 5050 4709 -0.95839 0.0136223 0.000374329 1 0 1 1 0 0 +EDGE2 5050 4589 -1.094 -0.0293951 0.00155091 1 0 1 1 0 0 +EDGE2 5051 4710 -1.01079 0.0471663 -1.57629 1 0 1 1 0 0 +EDGE2 5051 5030 -1.0358 0.0221656 -1.5648 1 0 1 1 0 0 +EDGE2 5051 5050 -0.99385 0.0160135 -1.57065 1 0 1 1 0 0 +EDGE2 5051 4990 -1.21512 -0.0118959 -1.55226 1 0 1 1 0 0 +EDGE2 5051 4630 -0.9808 0.0416443 1.55186 1 0 1 1 0 0 +EDGE2 5051 4650 -1.0518 -0.0312626 -1.56828 1 0 1 1 0 0 +EDGE2 5051 4590 -1.01688 -0.0238503 -1.56791 1 0 1 1 0 0 +EDGE2 5051 4632 1.07397 -0.0740409 -0.0242833 1 0 1 1 0 0 +EDGE2 5051 4591 0.0928933 0.0589165 0.00960414 1 0 1 1 0 0 +EDGE2 5051 4651 0.0249158 -0.0603287 -0.0301938 1 0 1 1 0 0 +EDGE2 5051 4991 0.0378568 -0.0432963 0.0338061 1 0 1 1 0 0 +EDGE2 5051 5031 -0.0245969 0.0497474 0.0270418 1 0 1 1 0 0 +EDGE2 5051 4631 -0.0171789 0.0638717 0.00313944 1 0 1 1 0 0 +EDGE2 5051 4992 1.02458 -0.00719812 -0.019307 1 0 1 1 0 0 +EDGE2 5051 5032 0.933175 0.015774 -0.0442127 1 0 1 1 0 0 +EDGE2 5051 4652 0.999219 -0.0601721 0.0174182 1 0 1 1 0 0 +EDGE2 5051 4592 1.00397 -0.0455964 0.0221705 1 0 1 1 0 0 +EDGE2 5052 5051 -1.02039 -0.041237 0.0111735 1 0 1 1 0 0 +EDGE2 5052 4632 -0.0514124 -0.0829173 0.0251783 1 0 1 1 0 0 +EDGE2 5052 4591 -1.04579 0.0231222 0.0338579 1 0 1 1 0 0 +EDGE2 5052 4651 -1.01313 -0.0598757 0.0287494 1 0 1 1 0 0 +EDGE2 5052 4991 -0.989995 -0.05706 -0.015772 1 0 1 1 0 0 +EDGE2 5052 5031 -0.94674 0.0282309 0.00298089 1 0 1 1 0 0 +EDGE2 5052 4631 -1.01881 0.146003 -0.00579078 1 0 1 1 0 0 +EDGE2 5052 4992 -0.139161 -0.0199842 -0.00281953 1 0 1 1 0 0 +EDGE2 5052 5032 -0.0625304 0.0301854 -0.0105131 1 0 1 1 0 0 +EDGE2 5052 4652 -0.0103602 0.0143174 -0.0181869 1 0 1 1 0 0 +EDGE2 5052 4653 0.934095 -0.0239523 -0.00123241 1 0 1 1 0 0 +EDGE2 5052 5033 1.02924 0.0294147 0.0121268 1 0 1 1 0 0 +EDGE2 5052 4592 0.117712 -0.0290853 -0.0208022 1 0 1 1 0 0 +EDGE2 5052 4993 1.10892 0.0552496 -0.0273213 1 0 1 1 0 0 +EDGE2 5052 4593 0.953722 -0.0522751 0.0367959 1 0 1 1 0 0 +EDGE2 5052 4633 1.03525 0.0487326 -0.012022 1 0 1 1 0 0 +EDGE2 5053 5034 0.995829 0.0253628 0.0256806 1 0 1 1 0 0 +EDGE2 5053 4632 -0.973704 -0.0147296 0.030463 1 0 1 1 0 0 +EDGE2 5053 4992 -0.960659 -0.0382452 0.0452802 1 0 1 1 0 0 +EDGE2 5053 5032 -1.09149 -0.0130081 -0.0173321 1 0 1 1 0 0 +EDGE2 5053 5052 -1.03132 -0.0435697 0.00589453 1 0 1 1 0 0 +EDGE2 5053 4652 -1.00696 0.0276155 0.00324872 1 0 1 1 0 0 +EDGE2 5053 4653 0.0714171 0.0370252 -0.0134579 1 0 1 1 0 0 +EDGE2 5053 5033 -0.0365175 -0.00809591 0.0126018 1 0 1 1 0 0 +EDGE2 5053 4592 -0.962222 -0.00253079 -0.00808945 1 0 1 1 0 0 +EDGE2 5053 4993 -0.0215363 0.00606585 -0.0243342 1 0 1 1 0 0 +EDGE2 5053 4593 0.0822924 0.10946 0.00844973 1 0 1 1 0 0 +EDGE2 5053 4633 0.0649917 -0.0414503 0.0193376 1 0 1 1 0 0 +EDGE2 5053 4634 1.10177 -0.0440768 -0.0191973 1 0 1 1 0 0 +EDGE2 5053 4654 0.949435 0.0545654 -0.0239024 1 0 1 1 0 0 +EDGE2 5053 4994 0.995011 0.0237992 0.0113055 1 0 1 1 0 0 +EDGE2 5053 4594 0.9554 -0.0116776 0.0158444 1 0 1 1 0 0 +EDGE2 5054 5034 -0.0412374 0.0315882 0.0196787 1 0 1 1 0 0 +EDGE2 5054 4653 -0.958002 -0.0183726 -0.00381045 1 0 1 1 0 0 +EDGE2 5054 5033 -1.02165 -0.0707644 0.0164746 1 0 1 1 0 0 +EDGE2 5054 5053 -1.00302 -0.000316737 -0.0124898 1 0 1 1 0 0 +EDGE2 5054 4993 -1.00031 0.115576 0.0128377 1 0 1 1 0 0 +EDGE2 5054 4593 -0.984643 0.0348494 0.0251871 1 0 1 1 0 0 +EDGE2 5054 4633 -1.04181 0.0606661 -0.00440588 1 0 1 1 0 0 +EDGE2 5054 4634 0.0358939 0.0226228 -0.00720211 1 0 1 1 0 0 +EDGE2 5054 4654 0.0724374 0.0428595 -0.0177298 1 0 1 1 0 0 +EDGE2 5054 4994 -0.0314647 -0.0181489 0.0279295 1 0 1 1 0 0 +EDGE2 5054 4594 0.0159975 0.045413 0.00655281 1 0 1 1 0 0 +EDGE2 5054 2915 1.06936 -0.0369952 -3.17631 1 0 1 1 0 0 +EDGE2 5054 4635 0.988844 0.00880145 0.00735074 1 0 1 1 0 0 +EDGE2 5054 4995 0.974758 -0.00077888 -0.0110812 1 0 1 1 0 0 +EDGE2 5054 5035 1.10772 -0.0984504 0.0349249 1 0 1 1 0 0 +EDGE2 5054 4655 0.900104 0.0366692 0.00174105 1 0 1 1 0 0 +EDGE2 5054 4595 0.905469 0.0675708 0.00120005 1 0 1 1 0 0 +EDGE2 5054 3595 0.96672 -0.0469281 -3.15009 1 0 1 1 0 0 +EDGE2 5054 3735 1.08235 -0.062289 -3.13442 1 0 1 1 0 0 +EDGE2 5054 3755 1.0362 -0.010603 -3.14358 1 0 1 1 0 0 +EDGE2 5054 3575 1.00036 0.0345306 -3.15719 1 0 1 1 0 0 +EDGE2 5055 5034 -0.923709 0.0117646 0.0147178 1 0 1 1 0 0 +EDGE2 5055 5054 -1.05227 -0.0270452 0.00115716 1 0 1 1 0 0 +EDGE2 5055 4634 -0.912833 0.0107748 0.00399984 1 0 1 1 0 0 +EDGE2 5055 4654 -1.12603 -0.0162195 0.0368692 1 0 1 1 0 0 +EDGE2 5055 4994 -0.956947 -0.0661409 -0.0103616 1 0 1 1 0 0 +EDGE2 5055 4594 -1.01042 -0.0368793 -0.0251292 1 0 1 1 0 0 +EDGE2 5055 2915 0.0516125 0.0612583 -3.14127 1 0 1 1 0 0 +EDGE2 5055 4635 -0.0319951 -0.0394609 -0.00080981 1 0 1 1 0 0 +EDGE2 5055 2916 -0.0845433 -1.11035 -1.60492 1 0 1 1 0 0 +EDGE2 5055 3736 -0.00631345 -1.00218 -1.60087 1 0 1 1 0 0 +EDGE2 5055 4596 -0.0303071 -0.982592 -1.57 1 0 1 1 0 0 +EDGE2 5055 3576 0.031883 -0.973678 -1.58355 1 0 1 1 0 0 +EDGE2 5055 4995 -0.0500363 0.00109638 -0.0139127 1 0 1 1 0 0 +EDGE2 5055 5035 0.00380068 0.0928962 0.00375756 1 0 1 1 0 0 +EDGE2 5055 4655 -0.0024126 -0.0284437 -0.0241185 1 0 1 1 0 0 +EDGE2 5055 4595 0.0929423 -0.0923544 0.00054748 1 0 1 1 0 0 +EDGE2 5055 3595 -0.0320705 0.0270017 -3.14242 1 0 1 1 0 0 +EDGE2 5055 3735 -0.0825454 -0.032966 -3.10868 1 0 1 1 0 0 +EDGE2 5055 3755 0.00625061 0.0117677 -3.12107 1 0 1 1 0 0 +EDGE2 5055 3575 0.0348893 0.044345 -3.09662 1 0 1 1 0 0 +EDGE2 5055 2914 0.928981 0.0558205 -3.16857 1 0 1 1 0 0 +EDGE2 5055 3594 0.939678 -0.0161139 -3.11185 1 0 1 1 0 0 +EDGE2 5055 3734 1.0013 -0.0197111 -3.15647 1 0 1 1 0 0 +EDGE2 5055 3754 1.02905 0.0165454 -3.11419 1 0 1 1 0 0 +EDGE2 5055 3574 0.976493 -0.0640395 -3.09751 1 0 1 1 0 0 +EDGE2 5055 4636 0.0224489 1.02322 1.57559 1 0 1 1 0 0 +EDGE2 5055 4996 -0.0586711 0.976546 1.56478 1 0 1 1 0 0 +EDGE2 5055 5036 0.082006 1.03494 1.57074 1 0 1 1 0 0 +EDGE2 5055 4656 -0.00337176 0.932917 1.54867 1 0 1 1 0 0 +EDGE2 5055 3596 0.0294381 0.912995 1.58489 1 0 1 1 0 0 +EDGE2 5055 3756 0.110048 1.07786 1.55505 1 0 1 1 0 0 +EDGE2 5056 2915 -1.06436 0.00245677 1.56775 1 0 1 1 0 0 +EDGE2 5056 4635 -1.00504 0.0512874 -1.56835 1 0 1 1 0 0 +EDGE2 5056 4995 -0.935317 0.00818829 -1.55738 1 0 1 1 0 0 +EDGE2 5056 5035 -1.00689 0.0886826 -1.58972 1 0 1 1 0 0 +EDGE2 5056 5055 -1.00352 0.00534951 -1.58322 1 0 1 1 0 0 +EDGE2 5056 4655 -1.0089 -0.102547 -1.557 1 0 1 1 0 0 +EDGE2 5056 4595 -1.05144 0.000826286 -1.58627 1 0 1 1 0 0 +EDGE2 5056 3595 -0.917973 0.0634443 1.57229 1 0 1 1 0 0 +EDGE2 5056 3735 -1.05516 0.0211722 1.57129 1 0 1 1 0 0 +EDGE2 5056 3755 -1.0061 0.0998649 1.5655 1 0 1 1 0 0 +EDGE2 5056 3575 -1.05166 -0.00393004 1.55942 1 0 1 1 0 0 +EDGE2 5056 3597 0.949727 0.0739602 0.00388486 1 0 1 1 0 0 +EDGE2 5056 4997 1.08423 -0.0435521 -0.0248493 1 0 1 1 0 0 +EDGE2 5056 4636 0.0693485 0.0199339 -0.0156014 1 0 1 1 0 0 +EDGE2 5056 4996 0.000774231 0.00366262 0.00948994 1 0 1 1 0 0 +EDGE2 5056 5036 0.0708754 -0.0627063 -0.00225791 1 0 1 1 0 0 +EDGE2 5056 4656 0.0674146 -0.0140351 -0.00826199 1 0 1 1 0 0 +EDGE2 5056 3596 -0.063244 -0.0863884 -0.0322998 1 0 1 1 0 0 +EDGE2 5056 3756 -0.0994079 0.03167 0.00448151 1 0 1 1 0 0 +EDGE2 5056 5037 0.925845 -0.028869 -0.0340146 1 0 1 1 0 0 +EDGE2 5056 4637 1.02506 0.0277648 0.00474749 1 0 1 1 0 0 +EDGE2 5056 4657 1.05602 -0.0633459 0.0218001 1 0 1 1 0 0 +EDGE2 5056 3757 1.01472 0.0229588 -0.019351 1 0 1 1 0 0 +EDGE2 5057 3597 -0.00254731 0.102999 -0.027068 1 0 1 1 0 0 +EDGE2 5057 4997 0.0168664 0.0226796 0.0401441 1 0 1 1 0 0 +EDGE2 5057 4636 -1.02893 0.00465038 -0.0120345 1 0 1 1 0 0 +EDGE2 5057 4996 -0.962822 0.00558387 0.0195577 1 0 1 1 0 0 +EDGE2 5057 5036 -0.941938 -0.033638 0.00898758 1 0 1 1 0 0 +EDGE2 5057 5056 -0.973173 0.0122149 -0.0151303 1 0 1 1 0 0 +EDGE2 5057 4656 -1.03489 0.0649192 -0.0040707 1 0 1 1 0 0 +EDGE2 5057 3596 -1.03491 0.0184328 0.00846042 1 0 1 1 0 0 +EDGE2 5057 3756 -1.03928 0.0276173 0.024079 1 0 1 1 0 0 +EDGE2 5057 5037 -0.121072 -0.0492043 -0.0109242 1 0 1 1 0 0 +EDGE2 5057 4637 -0.0138499 -0.0194543 0.0165755 1 0 1 1 0 0 +EDGE2 5057 4657 0.0339574 0.0414377 0.0155516 1 0 1 1 0 0 +EDGE2 5057 3757 0.0104412 -0.0382814 -0.0137248 1 0 1 1 0 0 +EDGE2 5057 4638 0.950416 0.000230788 0.0107493 1 0 1 1 0 0 +EDGE2 5057 4998 1.09278 0.0245749 0.0123777 1 0 1 1 0 0 +EDGE2 5057 5038 0.992895 -0.0301196 -0.00842146 1 0 1 1 0 0 +EDGE2 5057 4658 0.962926 0.038988 -0.0110981 1 0 1 1 0 0 +EDGE2 5057 3598 0.959658 -0.0602566 -0.01306 1 0 1 1 0 0 +EDGE2 5057 3758 0.934746 0.00405528 -0.0144675 1 0 1 1 0 0 +EDGE2 5058 3597 -1.04297 -0.0718256 -0.00108137 1 0 1 1 0 0 +EDGE2 5058 4997 -0.995611 0.0321846 0.00673658 1 0 1 1 0 0 +EDGE2 5058 5057 -0.903743 -0.0431165 0.0187393 1 0 1 1 0 0 +EDGE2 5058 5037 -1.0869 -0.0144594 -0.00427296 1 0 1 1 0 0 +EDGE2 5058 4637 -1.01677 0.000111846 -0.00316368 1 0 1 1 0 0 +EDGE2 5058 4657 -0.986097 -0.0692458 -0.0031666 1 0 1 1 0 0 +EDGE2 5058 3757 -1.0318 0.0461683 0.00148697 1 0 1 1 0 0 +EDGE2 5058 4999 0.9979 -0.0972281 -0.0180603 1 0 1 1 0 0 +EDGE2 5058 4638 -0.00353847 -0.0130824 0.0143975 1 0 1 1 0 0 +EDGE2 5058 4998 0.0989716 -0.0121493 0.0244892 1 0 1 1 0 0 +EDGE2 5058 5038 0.00573601 -0.0704037 -0.00537682 1 0 1 1 0 0 +EDGE2 5058 4658 0.00830164 -0.0456681 0.000674579 1 0 1 1 0 0 +EDGE2 5058 3598 0.05317 0.0258405 -0.015783 1 0 1 1 0 0 +EDGE2 5058 3758 -0.0269734 0.0155742 -0.0294837 1 0 1 1 0 0 +EDGE2 5058 5039 1.08068 0.0799215 -0.0105505 1 0 1 1 0 0 +EDGE2 5058 4639 1.01995 -0.0238864 0.0163159 1 0 1 1 0 0 +EDGE2 5058 4659 1.05012 0.0257992 -0.00200816 1 0 1 1 0 0 +EDGE2 5058 3599 0.930363 -0.0188842 0.0143553 1 0 1 1 0 0 +EDGE2 5058 3759 0.966926 0.000802271 -0.0284501 1 0 1 1 0 0 +EDGE2 5059 4999 0.0897379 0.0226401 0.00229506 1 0 1 1 0 0 +EDGE2 5059 4638 -1.05583 -0.0173789 0.0277315 1 0 1 1 0 0 +EDGE2 5059 4998 -1.07525 0.00239883 0.051584 1 0 1 1 0 0 +EDGE2 5059 5038 -1.07519 0.00541595 -0.00896252 1 0 1 1 0 0 +EDGE2 5059 5058 -1.01599 -0.0984571 -0.010333 1 0 1 1 0 0 +EDGE2 5059 4658 -1.01019 0.0149912 0.00435058 1 0 1 1 0 0 +EDGE2 5059 3598 -0.986325 0.0344853 -0.0151246 1 0 1 1 0 0 +EDGE2 5059 3758 -1.01402 0.00147956 -0.00160369 1 0 1 1 0 0 +EDGE2 5059 5039 0.0188358 -0.0309874 -0.0135645 1 0 1 1 0 0 +EDGE2 5059 4639 -0.0351029 0.0537471 -0.0147688 1 0 1 1 0 0 +EDGE2 5059 4659 -0.0454158 0.077736 0.00248426 1 0 1 1 0 0 +EDGE2 5059 3599 0.0343515 -0.033086 0.0048615 1 0 1 1 0 0 +EDGE2 5059 3759 0.0774875 -0.00656218 0.0343164 1 0 1 1 0 0 +EDGE2 5059 3680 1.0287 -0.0490106 -3.13542 1 0 1 1 0 0 +EDGE2 5059 5000 0.944117 0.0142274 0.00704943 1 0 1 1 0 0 +EDGE2 5059 5040 0.951448 0.0343009 -0.0300031 1 0 1 1 0 0 +EDGE2 5059 3820 1.01749 0.0210715 -3.12061 1 0 1 1 0 0 +EDGE2 5059 4640 1.03009 -0.105112 -0.00421869 1 0 1 1 0 0 +EDGE2 5059 4660 1.04668 -0.00704662 0.003729 1 0 1 1 0 0 +EDGE2 5059 3760 1.01125 0.0440081 0.0257173 1 0 1 1 0 0 +EDGE2 5059 3600 0.956363 -0.0481855 -0.00457638 1 0 1 1 0 0 +EDGE2 5059 3640 0.968181 -0.0669705 -3.13824 1 0 1 1 0 0 +EDGE2 5059 3660 1.01457 -0.0058024 -3.18833 1 0 1 1 0 0 +EDGE2 5060 4999 -1.10263 0.0102043 -0.0162668 1 0 1 1 0 0 +EDGE2 5060 5059 -0.925618 0.0578644 0.0136073 1 0 1 1 0 0 +EDGE2 5060 5039 -0.998407 -0.0428239 0.0156652 1 0 1 1 0 0 +EDGE2 5060 4639 -0.948065 -0.0868165 0.0308161 1 0 1 1 0 0 +EDGE2 5060 4659 -0.976249 -0.0327512 0.0334176 1 0 1 1 0 0 +EDGE2 5060 3599 -1.02894 0.077922 -0.022911 1 0 1 1 0 0 +EDGE2 5060 3759 -0.883391 -0.145841 -0.0189173 1 0 1 1 0 0 +EDGE2 5060 3680 0.00211085 0.0351261 -3.15367 1 0 1 1 0 0 +EDGE2 5060 4661 -0.0580097 0.998826 1.55581 1 0 1 1 0 0 +EDGE2 5060 5041 0.00058222 1.00929 1.55712 1 0 1 1 0 0 +EDGE2 5060 5001 -0.0822421 1.08303 1.56195 1 0 1 1 0 0 +EDGE2 5060 5000 -0.0230458 0.0123599 -0.0247786 1 0 1 1 0 0 +EDGE2 5060 3601 0.0381943 0.962639 1.61873 1 0 1 1 0 0 +EDGE2 5060 4641 -0.0463159 0.907863 1.57481 1 0 1 1 0 0 +EDGE2 5060 5040 -0.0549543 0.0426663 0.00960444 1 0 1 1 0 0 +EDGE2 5060 3820 0.070428 0.0163446 -3.16935 1 0 1 1 0 0 +EDGE2 5060 4640 -0.0291761 0.00615654 -0.00111899 1 0 1 1 0 0 +EDGE2 5060 4660 -0.0165851 -0.00288271 -0.0257734 1 0 1 1 0 0 +EDGE2 5060 3760 -0.0013137 -0.0405831 0.00283651 1 0 1 1 0 0 +EDGE2 5060 3761 0.0436717 -1.01988 -1.55785 1 0 1 1 0 0 +EDGE2 5060 3600 0.0371694 -0.0147573 -0.0314186 1 0 1 1 0 0 +EDGE2 5060 3640 0.0136182 -0.00644056 -3.15586 1 0 1 1 0 0 +EDGE2 5060 3660 -0.0240323 -0.00704753 -3.14013 1 0 1 1 0 0 +EDGE2 5060 3821 0.00908441 -0.992398 -1.54976 1 0 1 1 0 0 +EDGE2 5060 3641 -0.0358345 -1.03254 -1.5671 1 0 1 1 0 0 +EDGE2 5060 3661 -0.0201966 -1.02088 -1.5491 1 0 1 1 0 0 +EDGE2 5060 3681 0.0591425 -0.984817 -1.57186 1 0 1 1 0 0 +EDGE2 5060 3659 1.04218 0.0805304 -3.15554 1 0 1 1 0 0 +EDGE2 5060 3679 0.982989 0.103706 -3.13897 1 0 1 1 0 0 +EDGE2 5060 3819 1.0187 0.0830388 -3.14801 1 0 1 1 0 0 +EDGE2 5060 3639 0.970005 0.0481787 -3.12196 1 0 1 1 0 0 +EDGE2 5061 3680 -0.982377 -0.0106682 1.59436 1 0 1 1 0 0 +EDGE2 5061 4661 0.000448847 -0.0166864 0.0211138 1 0 1 1 0 0 +EDGE2 5061 4642 0.909486 -0.0257122 -0.00291876 1 0 1 1 0 0 +EDGE2 5061 5002 0.977414 -0.0337731 -0.0168766 1 0 1 1 0 0 +EDGE2 5061 5042 1.11329 -0.0229715 0.00113461 1 0 1 1 0 0 +EDGE2 5061 4662 1.06606 0.00982476 -0.0123124 1 0 1 1 0 0 +EDGE2 5061 5041 0.0059222 0.00428273 -0.0445129 1 0 1 1 0 0 +EDGE2 5061 3602 1.03639 0.00185404 0.0108958 1 0 1 1 0 0 +EDGE2 5061 5001 -0.0385116 -0.0531401 0.0280711 1 0 1 1 0 0 +EDGE2 5061 5000 -1.04874 0.0999823 -1.54891 1 0 1 1 0 0 +EDGE2 5061 5060 -0.884546 0.0252206 -1.5779 1 0 1 1 0 0 +EDGE2 5061 3601 0.0142676 0.044021 -0.0253083 1 0 1 1 0 0 +EDGE2 5061 4641 0.0732571 0.0879019 0.0131459 1 0 1 1 0 0 +EDGE2 5061 5040 -1.06045 0.0102112 -1.5609 1 0 1 1 0 0 +EDGE2 5061 3820 -0.929959 0.0324345 1.55511 1 0 1 1 0 0 +EDGE2 5061 4640 -0.978848 -0.0291714 -1.55536 1 0 1 1 0 0 +EDGE2 5061 4660 -1.03675 0.00304862 -1.53158 1 0 1 1 0 0 +EDGE2 5061 3760 -0.951319 0.0384459 -1.58427 1 0 1 1 0 0 +EDGE2 5061 3600 -1.01488 -0.0588594 -1.57952 1 0 1 1 0 0 +EDGE2 5061 3640 -1.01942 0.019048 1.54508 1 0 1 1 0 0 +EDGE2 5061 3660 -1.03044 -0.0166455 1.58178 1 0 1 1 0 0 +EDGE2 5062 4663 0.990757 0.0654511 -0.0186993 1 0 1 1 0 0 +EDGE2 5062 5043 0.991223 0.0497005 -0.0220287 1 0 1 1 0 0 +EDGE2 5062 5003 0.945022 0.0276347 0.0080639 1 0 1 1 0 0 +EDGE2 5062 3603 1.02102 0.0252261 -0.0184538 1 0 1 1 0 0 +EDGE2 5062 4643 1.03372 -0.0399929 0.00259828 1 0 1 1 0 0 +EDGE2 5062 4661 -0.996142 -0.0405581 -0.00599818 1 0 1 1 0 0 +EDGE2 5062 4642 0.0418065 0.012741 0.0137347 1 0 1 1 0 0 +EDGE2 5062 5002 0.0132315 -0.000606627 -0.017717 1 0 1 1 0 0 +EDGE2 5062 5042 -0.0785936 0.0196429 -0.00134823 1 0 1 1 0 0 +EDGE2 5062 4662 -0.0648339 0.0839268 -0.00727963 1 0 1 1 0 0 +EDGE2 5062 5041 -1.02214 -0.0888408 0.026393 1 0 1 1 0 0 +EDGE2 5062 5061 -0.982025 0.0211939 -0.0174774 1 0 1 1 0 0 +EDGE2 5062 3602 0.0139119 -0.00924632 0.0134075 1 0 1 1 0 0 +EDGE2 5062 5001 -0.97996 -0.0188207 0.0039139 1 0 1 1 0 0 +EDGE2 5062 3601 -1.03587 -0.00875396 0.0452624 1 0 1 1 0 0 +EDGE2 5062 4641 -1.00407 0.0169524 0.015442 1 0 1 1 0 0 +EDGE2 5063 4644 0.982123 -0.0578859 -0.0203052 1 0 1 1 0 0 +EDGE2 5063 5004 0.994867 -0.0387406 0.040726 1 0 1 1 0 0 +EDGE2 5063 5044 0.952295 0.046722 0.00377953 1 0 1 1 0 0 +EDGE2 5063 4664 1.01403 -0.00846237 -0.0108917 1 0 1 1 0 0 +EDGE2 5063 4663 0.0715004 -0.0570035 -0.0158143 1 0 1 1 0 0 +EDGE2 5063 5043 0.0487302 0.0189916 0.0246939 1 0 1 1 0 0 +EDGE2 5063 3604 0.998635 0.00279118 0.017522 1 0 1 1 0 0 +EDGE2 5063 5003 0.0110432 0.0120616 -0.00713148 1 0 1 1 0 0 +EDGE2 5063 3603 0.00114592 0.0549516 0.0169068 1 0 1 1 0 0 +EDGE2 5063 4643 0.0268348 0.0192412 -0.00855982 1 0 1 1 0 0 +EDGE2 5063 4642 -0.979304 -0.0403012 0.00169875 1 0 1 1 0 0 +EDGE2 5063 5002 -0.954474 0.0244179 -0.0117644 1 0 1 1 0 0 +EDGE2 5063 5042 -0.927346 0.0333642 0.0267086 1 0 1 1 0 0 +EDGE2 5063 5062 -1.00018 -0.0464415 0.0349824 1 0 1 1 0 0 +EDGE2 5063 4662 -1.09419 -0.0632233 -0.000811393 1 0 1 1 0 0 +EDGE2 5063 3602 -0.998292 -0.0462973 -0.0106662 1 0 1 1 0 0 +EDGE2 5064 4644 0.0719279 0.0610589 0.0340589 1 0 1 1 0 0 +EDGE2 5064 4705 0.964328 -0.113819 -3.12503 1 0 1 1 0 0 +EDGE2 5064 5005 0.987172 -0.050879 -0.0159278 1 0 1 1 0 0 +EDGE2 5064 5025 0.998489 0.0697399 -3.14152 1 0 1 1 0 0 +EDGE2 5064 5045 1.01885 -0.0597198 0.0160519 1 0 1 1 0 0 +EDGE2 5064 4985 0.890178 -0.0183531 -3.15611 1 0 1 1 0 0 +EDGE2 5064 3605 1.07246 0.0325932 -0.00544938 1 0 1 1 0 0 +EDGE2 5064 4645 0.988053 0.0443939 0.0253755 1 0 1 1 0 0 +EDGE2 5064 4665 0.99388 -0.0130577 -0.00395888 1 0 1 1 0 0 +EDGE2 5064 4685 1.06538 -0.0432601 -3.16374 1 0 1 1 0 0 +EDGE2 5064 4585 0.948976 0.0371598 -3.14318 1 0 1 1 0 0 +EDGE2 5064 5004 0.00582195 0.00103148 0.0125741 1 0 1 1 0 0 +EDGE2 5064 5044 0.0401872 0.0488571 0.0042059 1 0 1 1 0 0 +EDGE2 5064 4664 -0.0220053 0.0405942 0.0110901 1 0 1 1 0 0 +EDGE2 5064 4663 -0.995752 -0.022891 -0.000500692 1 0 1 1 0 0 +EDGE2 5064 5043 -1.07505 -0.0224924 0.00322583 1 0 1 1 0 0 +EDGE2 5064 5063 -1.0871 -0.0547689 -0.00122369 1 0 1 1 0 0 +EDGE2 5064 3604 0.0124744 0.0342859 -0.00149015 1 0 1 1 0 0 +EDGE2 5064 5003 -1.0239 -0.00527492 0.00228581 1 0 1 1 0 0 +EDGE2 5064 3603 -0.879261 -0.0659991 0.0240152 1 0 1 1 0 0 +EDGE2 5064 4643 -1.03034 0.0793964 0.0168733 1 0 1 1 0 0 +EDGE2 5065 5024 0.903218 -0.00229353 -3.13062 1 0 1 1 0 0 +EDGE2 5065 4986 -0.0209962 0.947034 1.57121 1 0 1 1 0 0 +EDGE2 5065 5046 -0.0386125 0.96767 1.5847 1 0 1 1 0 0 +EDGE2 5065 5026 -0.00413724 1.01163 1.53557 1 0 1 1 0 0 +EDGE2 5065 4646 -0.0489579 0.940405 1.56359 1 0 1 1 0 0 +EDGE2 5065 4706 -0.0507511 0.951084 1.575 1 0 1 1 0 0 +EDGE2 5065 4586 0.0743285 0.998786 1.60507 1 0 1 1 0 0 +EDGE2 5065 4644 -0.967321 -0.0491938 0.00551955 1 0 1 1 0 0 +EDGE2 5065 4705 -0.0981316 -0.0639689 -3.1534 1 0 1 1 0 0 +EDGE2 5065 4684 0.970456 0.098026 -3.12285 1 0 1 1 0 0 +EDGE2 5065 4704 1.01031 -0.0249177 -3.11893 1 0 1 1 0 0 +EDGE2 5065 4984 0.968776 -0.134135 -3.14376 1 0 1 1 0 0 +EDGE2 5065 4584 1.03106 0.0100445 -3.16249 1 0 1 1 0 0 +EDGE2 5065 5005 -0.0280399 -0.0729718 -0.024486 1 0 1 1 0 0 +EDGE2 5065 5025 0.0216904 0.0609248 -3.14129 1 0 1 1 0 0 +EDGE2 5065 5045 0.0402366 -0.112347 0.00663399 1 0 1 1 0 0 +EDGE2 5065 4985 -0.00655456 -0.0790277 -3.16772 1 0 1 1 0 0 +EDGE2 5065 3605 -0.0167038 -0.0106567 0.0190272 1 0 1 1 0 0 +EDGE2 5065 4645 -0.0898012 -0.0366632 -0.020047 1 0 1 1 0 0 +EDGE2 5065 4665 -0.0197275 -0.014386 0.00833261 1 0 1 1 0 0 +EDGE2 5065 4685 -0.0809167 -0.0303601 -3.15451 1 0 1 1 0 0 +EDGE2 5065 4585 -0.0171413 -0.00834873 -3.13659 1 0 1 1 0 0 +EDGE2 5065 5004 -0.958689 0.0219935 -0.00958224 1 0 1 1 0 0 +EDGE2 5065 5044 -0.990981 -0.0623261 -0.0180187 1 0 1 1 0 0 +EDGE2 5065 5064 -1.02603 0.0218648 -0.0157452 1 0 1 1 0 0 +EDGE2 5065 4664 -0.917642 -0.000354084 -0.00650321 1 0 1 1 0 0 +EDGE2 5065 3606 -0.00301563 -0.975335 -1.55764 1 0 1 1 0 0 +EDGE2 5065 4686 -0.0297599 -1.04438 -1.50416 1 0 1 1 0 0 +EDGE2 5065 5006 -0.0329615 -0.99423 -1.54373 1 0 1 1 0 0 +EDGE2 5065 4666 0.0256889 -0.988892 -1.58806 1 0 1 1 0 0 +EDGE2 5065 3604 -0.999719 -0.0591315 -0.013992 1 0 1 1 0 0 +EDGE2 5066 4705 -1.04575 0.0337159 -1.54447 1 0 1 1 0 0 +EDGE2 5066 5065 -0.964158 -0.0390089 1.56738 1 0 1 1 0 0 +EDGE2 5066 5005 -1.00365 0.0212078 1.58746 1 0 1 1 0 0 +EDGE2 5066 5025 -1.02501 -0.0582051 -1.55793 1 0 1 1 0 0 +EDGE2 5066 5045 -0.990896 -0.0378061 1.58654 1 0 1 1 0 0 +EDGE2 5066 4985 -0.97403 -0.0459661 -1.57131 1 0 1 1 0 0 +EDGE2 5066 3605 -1.07235 0.0467699 1.54752 1 0 1 1 0 0 +EDGE2 5066 4645 -1.01328 0.0107115 1.57924 1 0 1 1 0 0 +EDGE2 5066 4665 -0.975669 0.0115657 1.58553 1 0 1 1 0 0 +EDGE2 5066 4685 -1.05217 -0.0401692 -1.58728 1 0 1 1 0 0 +EDGE2 5066 4585 -0.926385 -0.00454037 -1.57579 1 0 1 1 0 0 +EDGE2 5066 3607 1.01856 0.0952527 0.00425691 1 0 1 1 0 0 +EDGE2 5066 3606 0.0798198 -0.0184485 -0.0091519 1 0 1 1 0 0 +EDGE2 5066 4686 0.070969 -0.0869073 0.00437502 1 0 1 1 0 0 +EDGE2 5066 5006 0.0968828 -0.0672326 0.0078867 1 0 1 1 0 0 +EDGE2 5066 4666 0.0995269 0.019584 0.000533421 1 0 1 1 0 0 +EDGE2 5066 4687 1.02834 0.0688046 0.0079462 1 0 1 1 0 0 +EDGE2 5066 5007 0.950164 -0.0329032 0.0155148 1 0 1 1 0 0 +EDGE2 5066 4667 1.01137 0.0844401 0.000826668 1 0 1 1 0 0 +EDGE2 5067 5008 1.00058 -0.0864335 0.0439761 1 0 1 1 0 0 +EDGE2 5067 3607 0.007772 0.055803 -0.00234039 1 0 1 1 0 0 +EDGE2 5067 3606 -0.93693 0.0279515 0.0153357 1 0 1 1 0 0 +EDGE2 5067 4686 -1.13456 0.0229998 -0.00760339 1 0 1 1 0 0 +EDGE2 5067 5006 -1.04297 0.0647687 0.0159409 1 0 1 1 0 0 +EDGE2 5067 5066 -0.99529 0.0347406 0.0176415 1 0 1 1 0 0 +EDGE2 5067 4666 -1.0316 -0.0212434 -0.00428031 1 0 1 1 0 0 +EDGE2 5067 4687 -0.0216456 -0.030826 0.00174276 1 0 1 1 0 0 +EDGE2 5067 5007 0.0167312 -0.045686 0.00982519 1 0 1 1 0 0 +EDGE2 5067 4667 -0.0131091 -0.0312945 0.0107237 1 0 1 1 0 0 +EDGE2 5067 3608 0.960275 -0.00440492 0.00305776 1 0 1 1 0 0 +EDGE2 5067 4668 1.02129 0.0773856 -0.00475004 1 0 1 1 0 0 +EDGE2 5067 4688 1.00591 -0.0676705 0.0238929 1 0 1 1 0 0 +EDGE2 5068 5008 -0.0987131 -0.0121895 -0.0292411 1 0 1 1 0 0 +EDGE2 5068 3607 -1.01149 -0.0155271 0.0185084 1 0 1 1 0 0 +EDGE2 5068 4687 -0.923025 0.0379412 0.0287678 1 0 1 1 0 0 +EDGE2 5068 5007 -0.984045 0.0452686 0.0167946 1 0 1 1 0 0 +EDGE2 5068 5067 -0.991695 0.00108088 0.00159458 1 0 1 1 0 0 +EDGE2 5068 4667 -0.923479 -0.0487742 0.0128708 1 0 1 1 0 0 +EDGE2 5068 5009 0.957272 0.0792742 -0.0169351 1 0 1 1 0 0 +EDGE2 5068 3608 -0.000750723 0.00642202 0.00486138 1 0 1 1 0 0 +EDGE2 5068 4668 0.00354818 0.0533274 -0.00118167 1 0 1 1 0 0 +EDGE2 5068 4688 -0.0717662 -0.0512735 -0.0166293 1 0 1 1 0 0 +EDGE2 5068 3609 0.948935 -0.0155974 -0.0251295 1 0 1 1 0 0 +EDGE2 5068 4669 0.988223 -0.017422 -0.00758819 1 0 1 1 0 0 +EDGE2 5068 4689 1.03257 -0.0896541 -0.00381906 1 0 1 1 0 0 +EDGE2 5069 5008 -0.987483 0.0371178 0.00384953 1 0 1 1 0 0 +EDGE2 5069 5068 -0.985491 -0.118795 -0.00483182 1 0 1 1 0 0 +EDGE2 5069 5009 -0.0597974 -0.00445239 -0.00658463 1 0 1 1 0 0 +EDGE2 5069 3608 -0.998314 -0.0275457 0.0203278 1 0 1 1 0 0 +EDGE2 5069 4668 -1.04698 0.0199079 -0.00542591 1 0 1 1 0 0 +EDGE2 5069 4688 -1.00276 -0.0117854 0.00314786 1 0 1 1 0 0 +EDGE2 5069 3609 0.0444323 0.0766222 -0.00459311 1 0 1 1 0 0 +EDGE2 5069 4669 0.0573795 -0.0832844 0.00285811 1 0 1 1 0 0 +EDGE2 5069 4689 0.05513 0.00645256 -0.0117137 1 0 1 1 0 0 +EDGE2 5069 4570 1.13256 -0.0860884 -3.11486 1 0 1 1 0 0 +EDGE2 5069 4690 1.03675 -0.0182531 0.0147651 1 0 1 1 0 0 +EDGE2 5069 4970 1.02196 0.00761666 -3.12994 1 0 1 1 0 0 +EDGE2 5069 5010 1.00196 0.0247026 0.0112353 1 0 1 1 0 0 +EDGE2 5069 4670 1.05056 -0.0805822 0.0266268 1 0 1 1 0 0 +EDGE2 5069 3610 0.995101 -0.0890575 -0.0327113 1 0 1 1 0 0 +EDGE2 5069 3630 0.958462 0.0488734 -3.14875 1 0 1 1 0 0 +EDGE2 5070 5009 -0.962606 -0.0026326 0.0336542 1 0 1 1 0 0 +EDGE2 5070 5069 -1.03632 0.0862453 -0.00616074 1 0 1 1 0 0 +EDGE2 5070 3609 -0.948325 0.010516 -0.016011 1 0 1 1 0 0 +EDGE2 5070 4669 -1.03508 -0.0824752 -0.0157039 1 0 1 1 0 0 +EDGE2 5070 4689 -1.0805 0.0111032 -0.0121104 1 0 1 1 0 0 +EDGE2 5070 4971 -0.00402761 1.08073 1.56139 1 0 1 1 0 0 +EDGE2 5070 5011 0.0957491 1.06607 1.55294 1 0 1 1 0 0 +EDGE2 5070 4571 0.00585226 1.02476 1.56029 1 0 1 1 0 0 +EDGE2 5070 4671 0.0321573 0.989378 1.56225 1 0 1 1 0 0 +EDGE2 5070 4691 0.0244146 1.03399 1.54884 1 0 1 1 0 0 +EDGE2 5070 3611 0.0425733 0.930434 1.57913 1 0 1 1 0 0 +EDGE2 5070 4570 0.0243227 0.0646486 -3.16262 1 0 1 1 0 0 +EDGE2 5070 4690 0.00108112 0.097298 -0.0198209 1 0 1 1 0 0 +EDGE2 5070 4970 0.0667021 0.0984146 -3.13614 1 0 1 1 0 0 +EDGE2 5070 5010 0.034286 0.00822742 -0.0063754 1 0 1 1 0 0 +EDGE2 5070 4670 -0.0340025 0.0345706 -0.0103124 1 0 1 1 0 0 +EDGE2 5070 3610 -0.0105902 0.0502603 -0.00159923 1 0 1 1 0 0 +EDGE2 5070 3630 -0.0210279 0.0218468 -3.10134 1 0 1 1 0 0 +EDGE2 5070 3631 -0.0343667 -1.00014 -1.59855 1 0 1 1 0 0 +EDGE2 5070 3629 0.962876 -0.00057642 -3.10543 1 0 1 1 0 0 +EDGE2 5070 4569 0.98975 0.0532073 -3.13617 1 0 1 1 0 0 +EDGE2 5070 4969 0.995955 -0.0399466 -3.16499 1 0 1 1 0 0 +EDGE2 5071 4672 1.01939 -0.011997 0.0152797 1 0 1 1 0 0 +EDGE2 5071 4972 0.93166 0.00286418 -0.0133248 1 0 1 1 0 0 +EDGE2 5071 5012 0.988556 0.011983 -0.017024 1 0 1 1 0 0 +EDGE2 5071 4692 0.960538 0.028324 0.00338114 1 0 1 1 0 0 +EDGE2 5071 5070 -1.00421 -0.083716 -1.5493 1 0 1 1 0 0 +EDGE2 5071 4971 -0.0121131 0.012766 0.00248126 1 0 1 1 0 0 +EDGE2 5071 3612 0.970086 0.00266181 0.0154128 1 0 1 1 0 0 +EDGE2 5071 4572 1.06484 -0.0264665 -0.0138741 1 0 1 1 0 0 +EDGE2 5071 5011 0.0130391 0.0815019 0.0104324 1 0 1 1 0 0 +EDGE2 5071 4571 -0.0818276 0.0613862 0.0399935 1 0 1 1 0 0 +EDGE2 5071 4671 0.0190851 -0.025445 -0.0186475 1 0 1 1 0 0 +EDGE2 5071 4691 0.0564169 0.0553373 0.0210496 1 0 1 1 0 0 +EDGE2 5071 3611 -0.0238327 -0.026038 -0.0319076 1 0 1 1 0 0 +EDGE2 5071 4570 -1.03386 0.0739319 1.60585 1 0 1 1 0 0 +EDGE2 5071 4690 -0.933804 0.00591365 -1.57069 1 0 1 1 0 0 +EDGE2 5071 4970 -0.986263 -0.097264 1.60673 1 0 1 1 0 0 +EDGE2 5071 5010 -0.999585 -0.00695791 -1.58695 1 0 1 1 0 0 +EDGE2 5071 4670 -0.989359 -0.0446243 -1.56533 1 0 1 1 0 0 +EDGE2 5071 3610 -1.05929 -0.0135448 -1.56964 1 0 1 1 0 0 +EDGE2 5071 3630 -1.00118 0.060453 1.58784 1 0 1 1 0 0 +EDGE2 5072 4672 0.0362179 -0.0346271 -0.00132156 1 0 1 1 0 0 +EDGE2 5072 4972 -0.0240124 -0.00579273 0.00906517 1 0 1 1 0 0 +EDGE2 5072 4673 0.903921 0.0417026 -0.00370632 1 0 1 1 0 0 +EDGE2 5072 4973 0.939274 0.0570143 0.0315163 1 0 1 1 0 0 +EDGE2 5072 5013 0.942454 0.0591524 0.0215464 1 0 1 1 0 0 +EDGE2 5072 4693 1.06047 -0.0468546 -0.00399703 1 0 1 1 0 0 +EDGE2 5072 3613 0.992503 -0.0402811 -0.0041622 1 0 1 1 0 0 +EDGE2 5072 4573 1.08139 0.000562471 -0.0162856 1 0 1 1 0 0 +EDGE2 5072 5012 0.0232636 -0.0207198 -0.0116183 1 0 1 1 0 0 +EDGE2 5072 4692 -0.00873936 0.0824309 -0.0140049 1 0 1 1 0 0 +EDGE2 5072 4971 -1.03224 0.0502536 0.00631719 1 0 1 1 0 0 +EDGE2 5072 5071 -0.922599 -0.0589794 -0.004707 1 0 1 1 0 0 +EDGE2 5072 3612 -0.0187808 -0.0604588 0.033302 1 0 1 1 0 0 +EDGE2 5072 4572 -0.0643438 0.0265033 0.0127777 1 0 1 1 0 0 +EDGE2 5072 5011 -0.981941 0.0306193 0.0288722 1 0 1 1 0 0 +EDGE2 5072 4571 -0.97063 -0.0361981 -0.000515337 1 0 1 1 0 0 +EDGE2 5072 4671 -0.931774 -0.0151408 -0.0247233 1 0 1 1 0 0 +EDGE2 5072 4691 -1.00267 0.020791 -0.0396552 1 0 1 1 0 0 +EDGE2 5072 3611 -1.02538 0.00719156 0.0240383 1 0 1 1 0 0 +EDGE2 5073 4974 0.999571 0.0120922 -0.00330108 1 0 1 1 0 0 +EDGE2 5073 5014 1.06499 0.00664687 -0.0693855 1 0 1 1 0 0 +EDGE2 5073 4574 0.993836 -0.0290673 0.00859591 1 0 1 1 0 0 +EDGE2 5073 4674 1.01531 0.026951 0.0462205 1 0 1 1 0 0 +EDGE2 5073 4694 1.00916 -0.0747068 0.0149935 1 0 1 1 0 0 +EDGE2 5073 3614 1.02524 0.0483587 -0.00424983 1 0 1 1 0 0 +EDGE2 5073 4672 -0.986998 0.0349464 0.0128555 1 0 1 1 0 0 +EDGE2 5073 4972 -0.981508 0.0194852 0.00838957 1 0 1 1 0 0 +EDGE2 5073 4673 -0.0346598 0.00886221 -0.0332424 1 0 1 1 0 0 +EDGE2 5073 4973 0.0163157 0.030419 -0.0232819 1 0 1 1 0 0 +EDGE2 5073 5013 0.0196735 0.00446838 -0.015774 1 0 1 1 0 0 +EDGE2 5073 4693 0.0591552 -0.0744352 0.0150557 1 0 1 1 0 0 +EDGE2 5073 5072 -1.00827 0.134717 -0.00359982 1 0 1 1 0 0 +EDGE2 5073 3613 0.0430927 0.098028 -0.0076963 1 0 1 1 0 0 +EDGE2 5073 4573 0.0398623 -0.0062895 -0.0290743 1 0 1 1 0 0 +EDGE2 5073 5012 -1.05659 -0.05884 -0.0343559 1 0 1 1 0 0 +EDGE2 5073 4692 -1.03883 -0.0134646 0.0045517 1 0 1 1 0 0 +EDGE2 5073 3612 -0.952707 -0.0174586 -0.00544838 1 0 1 1 0 0 +EDGE2 5073 4572 -1.07684 0.0109191 0.0286221 1 0 1 1 0 0 +EDGE2 5074 4974 -0.0114785 0.00127231 -0.0152196 1 0 1 1 0 0 +EDGE2 5074 5015 0.955919 0.0353409 -0.0266062 1 0 1 1 0 0 +EDGE2 5074 4575 1.0408 -0.0021494 0.0278335 1 0 1 1 0 0 +EDGE2 5074 4695 1.01882 -0.0211926 0.00703567 1 0 1 1 0 0 +EDGE2 5074 4875 0.953298 0.00452162 -3.11397 1 0 1 1 0 0 +EDGE2 5074 4975 0.964935 -0.042459 -0.00429511 1 0 1 1 0 0 +EDGE2 5074 4675 0.947036 -0.143183 -0.00593398 1 0 1 1 0 0 +EDGE2 5074 3615 1.08239 0.0481645 -0.00573107 1 0 1 1 0 0 +EDGE2 5074 5014 0.0488051 -0.0128971 0.00628356 1 0 1 1 0 0 +EDGE2 5074 4574 0.00598547 0.0548133 -0.00474834 1 0 1 1 0 0 +EDGE2 5074 4674 -0.0777556 -0.0586008 -0.0161279 1 0 1 1 0 0 +EDGE2 5074 4694 0.0552888 -0.0470628 0.034126 1 0 1 1 0 0 +EDGE2 5074 3614 -0.0216316 0.00529816 -0.0251646 1 0 1 1 0 0 +EDGE2 5074 4673 -0.955135 0.0197409 0.0168041 1 0 1 1 0 0 +EDGE2 5074 4973 -1.04308 0.00269022 -0.0142814 1 0 1 1 0 0 +EDGE2 5074 5013 -1.00625 0.0490508 -0.0548476 1 0 1 1 0 0 +EDGE2 5074 5073 -0.98624 -0.0519908 0.00170811 1 0 1 1 0 0 +EDGE2 5074 4693 -0.971437 -0.00277889 0.0101318 1 0 1 1 0 0 +EDGE2 5074 3613 -1.01905 0.0403877 -0.0168769 1 0 1 1 0 0 +EDGE2 5074 4573 -1.03737 -0.0594188 -0.00376197 1 0 1 1 0 0 +EDGE2 5075 4976 -0.0494731 0.956183 1.55387 1 0 1 1 0 0 +EDGE2 5075 5016 0.0175176 0.949038 1.57294 1 0 1 1 0 0 +EDGE2 5075 4676 -0.0249972 1.02964 1.57912 1 0 1 1 0 0 +EDGE2 5075 4696 0.0398664 0.94977 1.59533 1 0 1 1 0 0 +EDGE2 5075 4576 0.162922 0.973338 1.57088 1 0 1 1 0 0 +EDGE2 5075 4974 -1.06676 -0.0274546 0.00596816 1 0 1 1 0 0 +EDGE2 5075 5015 -0.00530796 0.0225387 -5.84689e-05 1 0 1 1 0 0 +EDGE2 5075 4874 1.05518 -0.027853 -3.10362 1 0 1 1 0 0 +EDGE2 5075 4575 -0.0346408 -0.059148 0.000137707 1 0 1 1 0 0 +EDGE2 5075 4695 -0.0741521 0.0665366 0.0195962 1 0 1 1 0 0 +EDGE2 5075 4875 0.010288 -0.0257508 -3.1445 1 0 1 1 0 0 +EDGE2 5075 4975 -0.0477121 0.0518827 0.00278809 1 0 1 1 0 0 +EDGE2 5075 4675 -0.00260061 -0.0414594 0.0102032 1 0 1 1 0 0 +EDGE2 5075 5074 -1.0853 -0.0105229 -0.0265278 1 0 1 1 0 0 +EDGE2 5075 3615 -0.0604382 0.0184512 -0.0352939 1 0 1 1 0 0 +EDGE2 5075 5014 -1.02486 -0.0585899 -0.0276606 1 0 1 1 0 0 +EDGE2 5075 4876 0.0389945 -0.984735 -1.59727 1 0 1 1 0 0 +EDGE2 5075 3616 0.0239243 -1.0098 -1.56406 1 0 1 1 0 0 +EDGE2 5075 4574 -0.934286 0.0257443 0.00350053 1 0 1 1 0 0 +EDGE2 5075 4674 -1.00152 0.00753589 -0.0122832 1 0 1 1 0 0 +EDGE2 5075 4694 -0.997458 -0.0370973 0.000532506 1 0 1 1 0 0 +EDGE2 5075 3614 -0.918897 -0.0294032 0.0032517 1 0 1 1 0 0 +EDGE2 5076 5015 -0.943299 -0.082319 1.55056 1 0 1 1 0 0 +EDGE2 5076 5075 -0.997467 0.0598193 1.555 1 0 1 1 0 0 +EDGE2 5076 4575 -0.96646 0.0608487 1.57729 1 0 1 1 0 0 +EDGE2 5076 4695 -1.07497 0.0210766 1.57127 1 0 1 1 0 0 +EDGE2 5076 4875 -0.925135 0.101136 -1.55422 1 0 1 1 0 0 +EDGE2 5076 4975 -0.941259 0.0532038 1.5808 1 0 1 1 0 0 +EDGE2 5076 4675 -1.03031 0.0355022 1.56019 1 0 1 1 0 0 +EDGE2 5076 3615 -0.993437 -0.0177359 1.57477 1 0 1 1 0 0 +EDGE2 5076 3617 0.883618 0.0153414 -0.0256432 1 0 1 1 0 0 +EDGE2 5076 4876 0.0193651 -0.0196083 -0.0296264 1 0 1 1 0 0 +EDGE2 5076 3616 -0.0198616 -0.0851356 0.00298571 1 0 1 1 0 0 +EDGE2 5076 4877 1.02838 0.0348561 0.00826527 1 0 1 1 0 0 +EDGE2 5077 3617 0.0191489 0.0181577 0.00351161 1 0 1 1 0 0 +EDGE2 5077 4876 -1.02605 0.0111 0.00123285 1 0 1 1 0 0 +EDGE2 5077 5076 -1.03472 -0.0569839 -0.000883323 1 0 1 1 0 0 +EDGE2 5077 3616 -1.02176 -0.0375961 -0.0172443 1 0 1 1 0 0 +EDGE2 5077 4877 -0.0320195 -0.0304124 0.0232043 1 0 1 1 0 0 +EDGE2 5077 3618 1.00999 -0.0046649 0.0286449 1 0 1 1 0 0 +EDGE2 5077 4878 1.12668 0.147636 0.00357688 1 0 1 1 0 0 +EDGE2 5078 3619 0.886233 -0.0126143 -0.0146582 1 0 1 1 0 0 +EDGE2 5078 3617 -0.962476 -0.0454257 0.0284255 1 0 1 1 0 0 +EDGE2 5078 4877 -1.00139 0.0552009 0.0205394 1 0 1 1 0 0 +EDGE2 5078 5077 -0.860796 0.0459389 -0.00825844 1 0 1 1 0 0 +EDGE2 5078 3618 -0.104506 0.124709 0.0076298 1 0 1 1 0 0 +EDGE2 5078 4878 -0.0465881 -0.0880919 -0.0072535 1 0 1 1 0 0 +EDGE2 5078 4879 1.00611 0.00519253 0.00894314 1 0 1 1 0 0 +EDGE2 5079 3619 0.020187 0.0279892 -0.00286638 1 0 1 1 0 0 +EDGE2 5079 5078 -1.09658 -0.0311184 0.00384337 1 0 1 1 0 0 +EDGE2 5079 3618 -1.06282 0.0716558 -0.0376422 1 0 1 1 0 0 +EDGE2 5079 4878 -1.03836 0.0208878 0.00454147 1 0 1 1 0 0 +EDGE2 5079 4879 0.070835 0.0277475 0.0121057 1 0 1 1 0 0 +EDGE2 5079 4880 0.956137 0.00589889 -0.0217957 1 0 1 1 0 0 +EDGE2 5079 4960 0.931872 0.00446109 -3.20635 1 0 1 1 0 0 +EDGE2 5079 3620 1.00633 0.052317 -0.0327701 1 0 1 1 0 0 +EDGE2 5080 3619 -1.05398 -0.0154365 0.00677204 1 0 1 1 0 0 +EDGE2 5080 5079 -1.04768 0.0295708 0.00800209 1 0 1 1 0 0 +EDGE2 5080 4879 -0.998816 -0.0348491 0.0283579 1 0 1 1 0 0 +EDGE2 5080 4959 1.08452 0.064967 -3.14401 1 0 1 1 0 0 +EDGE2 5080 4880 0.0124916 -0.0455461 -0.00275246 1 0 1 1 0 0 +EDGE2 5080 4960 -0.0461605 -0.0233689 -3.12847 1 0 1 1 0 0 +EDGE2 5080 3620 0.00988258 -0.0115084 0.0147559 1 0 1 1 0 0 +EDGE2 5080 3621 0.0481879 -0.98571 -1.51547 1 0 1 1 0 0 +EDGE2 5080 4881 0.0468405 -0.918393 -1.5298 1 0 1 1 0 0 +EDGE2 5080 4961 -0.0164934 -0.973422 -1.59433 1 0 1 1 0 0 +EDGE2 5081 4880 -1.04018 0.0498881 -1.61402 1 0 1 1 0 0 +EDGE2 5081 4960 -1.06696 0.0703814 1.59521 1 0 1 1 0 0 +EDGE2 5081 5080 -1.0713 0.0385423 -1.59322 1 0 1 1 0 0 +EDGE2 5081 3620 -1.04747 -0.0284573 -1.56688 1 0 1 1 0 0 +EDGE2 5082 5081 -1.01285 0.0769025 -0.00143011 1 0 1 1 0 0 +EDGE2 5083 5082 -0.951767 -0.0672934 0.0388266 1 0 1 1 0 0 +EDGE2 5084 5083 -1.00126 -0.013087 0.00228864 1 0 1 1 0 0 +EDGE2 5085 5084 -1.12292 -0.068519 -0.0187594 1 0 1 1 0 0 +EDGE2 5086 5085 -0.996801 -0.0572378 -1.58906 1 0 1 1 0 0 +EDGE2 5087 5086 -0.971062 0.0189059 0.0112809 1 0 1 1 0 0 +EDGE2 5088 5087 -0.962156 0.0339883 -0.00694796 1 0 1 1 0 0 +EDGE2 5089 4850 0.981689 -0.0185699 -3.11508 1 0 1 1 0 0 +EDGE2 5089 4870 0.985785 0.0358087 -3.14046 1 0 1 1 0 0 +EDGE2 5089 4790 0.93365 -0.000419611 -3.15507 1 0 1 1 0 0 +EDGE2 5089 5088 -0.995787 0.0914648 0.0365657 1 0 1 1 0 0 +EDGE2 5090 4849 1.04929 -0.0266032 -3.12023 1 0 1 1 0 0 +EDGE2 5090 4869 0.915116 0.0689192 -3.14357 1 0 1 1 0 0 +EDGE2 5090 4789 1.00579 -0.0718262 -3.13408 1 0 1 1 0 0 +EDGE2 5090 4791 0.0421217 -0.975289 -1.57455 1 0 1 1 0 0 +EDGE2 5090 4851 0.050343 -1.06017 -1.57246 1 0 1 1 0 0 +EDGE2 5090 4871 -0.023316 0.915497 1.56489 1 0 1 1 0 0 +EDGE2 5090 4850 0.0432195 -0.0851474 -3.15491 1 0 1 1 0 0 +EDGE2 5090 4870 -0.0417357 -0.00953995 -3.14874 1 0 1 1 0 0 +EDGE2 5090 4790 -0.0449872 -0.0653598 -3.14906 1 0 1 1 0 0 +EDGE2 5090 5089 -0.981896 -0.0391482 -0.0202447 1 0 1 1 0 0 +EDGE2 5091 4792 0.985363 -0.00824757 -0.0131395 1 0 1 1 0 0 +EDGE2 5091 4852 1.02492 0.00913547 -0.0182761 1 0 1 1 0 0 +EDGE2 5091 4791 -0.00850809 -0.0546809 -0.0166626 1 0 1 1 0 0 +EDGE2 5091 4851 0.0751999 -0.00303219 -0.0339519 1 0 1 1 0 0 +EDGE2 5091 4850 -1.05523 0.0473534 -1.56171 1 0 1 1 0 0 +EDGE2 5091 4870 -1.05922 0.0396073 -1.62201 1 0 1 1 0 0 +EDGE2 5091 5090 -1.06212 0.0479186 1.55239 1 0 1 1 0 0 +EDGE2 5091 4790 -0.987376 0.0192557 -1.59935 1 0 1 1 0 0 +EDGE2 5092 4793 1.03066 0.00663669 -0.0073198 1 0 1 1 0 0 +EDGE2 5092 4853 0.922095 0.16826 0.0122784 1 0 1 1 0 0 +EDGE2 5092 4792 0.0332877 0.0846837 0.0141119 1 0 1 1 0 0 +EDGE2 5092 4852 0.0422055 0.0682492 0.0060087 1 0 1 1 0 0 +EDGE2 5092 4791 -1.04544 -0.0112938 0.0464839 1 0 1 1 0 0 +EDGE2 5092 4851 -0.958198 -0.000227053 0.00284403 1 0 1 1 0 0 +EDGE2 5092 5091 -1.05224 -0.136512 0.00739512 1 0 1 1 0 0 +EDGE2 5093 4794 1.03932 0.0382119 -0.0177888 1 0 1 1 0 0 +EDGE2 5093 4854 0.923312 -0.101876 -0.0339507 1 0 1 1 0 0 +EDGE2 5093 4793 0.0171876 0.0265286 -0.0306772 1 0 1 1 0 0 +EDGE2 5093 4853 -0.0397997 0.0195443 -0.0240895 1 0 1 1 0 0 +EDGE2 5093 4792 -0.983178 -0.0185516 -0.00260093 1 0 1 1 0 0 +EDGE2 5093 4852 -1.04186 0.132854 -0.0366364 1 0 1 1 0 0 +EDGE2 5093 5092 -1.03106 -0.0395069 -0.0060903 1 0 1 1 0 0 +EDGE2 5094 4795 0.972997 -0.101245 0.000123791 1 0 1 1 0 0 +EDGE2 5094 4855 1.05118 0.0315247 0.0170209 1 0 1 1 0 0 +EDGE2 5094 4794 -0.0684065 0.105039 0.00358436 1 0 1 1 0 0 +EDGE2 5094 4854 0.0209056 -0.0204042 0.00785847 1 0 1 1 0 0 +EDGE2 5094 4793 -0.992366 -0.0276418 -0.00337861 1 0 1 1 0 0 +EDGE2 5094 4853 -1.02773 -0.0732226 0.00385171 1 0 1 1 0 0 +EDGE2 5094 5093 -0.991786 0.0129296 0.02279 1 0 1 1 0 0 +EDGE2 5095 4856 0.0199373 1.04507 1.60686 1 0 1 1 0 0 +EDGE2 5095 4796 0.114038 0.989003 1.62288 1 0 1 1 0 0 +EDGE2 5095 4795 -0.00718334 0.0388742 -0.00820965 1 0 1 1 0 0 +EDGE2 5095 4855 -0.00344415 0.0236945 -0.0213622 1 0 1 1 0 0 +EDGE2 5095 4794 -1.00421 -0.0316415 -0.00509248 1 0 1 1 0 0 +EDGE2 5095 4854 -1.02853 -0.0405068 0.000438764 1 0 1 1 0 0 +EDGE2 5095 5094 -0.996837 0.0600948 0.00301671 1 0 1 1 0 0 +EDGE2 5096 4857 1.00858 -0.0550778 -0.0351227 1 0 1 1 0 0 +EDGE2 5096 4797 1.01812 0.00665578 -0.0337702 1 0 1 1 0 0 +EDGE2 5096 4856 0.0918369 -0.0627229 0.0290405 1 0 1 1 0 0 +EDGE2 5096 4796 0.00325199 0.016484 0.00766634 1 0 1 1 0 0 +EDGE2 5096 5095 -0.984571 0.0509086 -1.57328 1 0 1 1 0 0 +EDGE2 5096 4795 -1.05501 0.0490276 -1.56483 1 0 1 1 0 0 +EDGE2 5096 4855 -0.977213 -0.00196722 -1.589 1 0 1 1 0 0 +EDGE2 5097 4857 0.0508523 -0.00727556 0.0193649 1 0 1 1 0 0 +EDGE2 5097 4798 0.923773 -0.0255125 -0.0148392 1 0 1 1 0 0 +EDGE2 5097 4858 1.01368 0.0634591 -0.000235844 1 0 1 1 0 0 +EDGE2 5097 4797 0.00986499 0.0354062 -0.0219831 1 0 1 1 0 0 +EDGE2 5097 4856 -1.03197 0.0368105 0.0332049 1 0 1 1 0 0 +EDGE2 5097 5096 -1.0721 -0.0800805 0.00507625 1 0 1 1 0 0 +EDGE2 5097 4796 -1.02333 -0.0194362 0.0136672 1 0 1 1 0 0 +EDGE2 5098 4859 1.00011 -0.0368192 0.0158715 1 0 1 1 0 0 +EDGE2 5098 4799 0.997284 0.034415 0.0313719 1 0 1 1 0 0 +EDGE2 5098 4857 -0.924429 0.0550628 -0.0291449 1 0 1 1 0 0 +EDGE2 5098 4798 -0.0514216 0.0540901 0.0111864 1 0 1 1 0 0 +EDGE2 5098 4858 0.0633671 -0.0194991 0.0160063 1 0 1 1 0 0 +EDGE2 5098 5097 -1.00221 0.015754 -0.00632375 1 0 1 1 0 0 +EDGE2 5098 4797 -0.965011 0.0578979 -0.00039704 1 0 1 1 0 0 +EDGE2 5099 4780 0.973225 -0.0154353 -3.13022 1 0 1 1 0 0 +EDGE2 5099 4800 0.93023 -0.0318415 -0.001563 1 0 1 1 0 0 +EDGE2 5099 4860 1.06839 0.055766 0.00590956 1 0 1 1 0 0 +EDGE2 5099 4859 -0.02326 -0.00900507 0.0132145 1 0 1 1 0 0 +EDGE2 5099 4799 -0.0445642 -0.021096 -0.000740616 1 0 1 1 0 0 +EDGE2 5099 4798 -1.01514 -0.023189 -0.016518 1 0 1 1 0 0 +EDGE2 5099 5098 -0.966293 0.0286942 0.0388446 1 0 1 1 0 0 +EDGE2 5099 4858 -1.07263 0.14325 0.0290218 1 0 1 1 0 0 +EDGE2 5100 4779 1.0813 -0.0455095 -3.13409 1 0 1 1 0 0 +EDGE2 5100 4780 -0.0311693 -0.0625884 -3.12966 1 0 1 1 0 0 +EDGE2 5100 4800 -0.0281462 0.0411505 0.0155084 1 0 1 1 0 0 +EDGE2 5100 4860 -0.00430106 -0.0239613 -0.0288317 1 0 1 1 0 0 +EDGE2 5100 4859 -0.944348 0.0426775 -0.00677328 1 0 1 1 0 0 +EDGE2 5100 5099 -0.947451 0.00508247 0.0290442 1 0 1 1 0 0 +EDGE2 5100 4781 0.0651362 1.02929 1.57036 1 0 1 1 0 0 +EDGE2 5100 4801 0.00201947 0.955161 1.59509 1 0 1 1 0 0 +EDGE2 5100 4861 0.00643123 0.915925 1.58452 1 0 1 1 0 0 +EDGE2 5100 4799 -1.05809 -0.0112426 0.00105009 1 0 1 1 0 0 +EDGE2 5101 4782 0.998391 0.0406579 0.0540762 1 0 1 1 0 0 +EDGE2 5101 5100 -0.993598 -0.0545009 -1.58077 1 0 1 1 0 0 +EDGE2 5101 4780 -0.991023 -0.00203975 1.56767 1 0 1 1 0 0 +EDGE2 5101 4800 -0.974604 0.0827369 -1.60503 1 0 1 1 0 0 +EDGE2 5101 4860 -1.01155 0.0686694 -1.54405 1 0 1 1 0 0 +EDGE2 5101 4781 -0.012725 -0.0377722 -0.0058548 1 0 1 1 0 0 +EDGE2 5101 4801 -0.0189082 -0.0113249 -0.0223067 1 0 1 1 0 0 +EDGE2 5101 4861 0.0769738 0.0114136 0.0184981 1 0 1 1 0 0 +EDGE2 5101 4802 0.963028 -0.00292451 0.0291122 1 0 1 1 0 0 +EDGE2 5101 4862 0.952884 0.0238075 -0.0383043 1 0 1 1 0 0 +EDGE2 5102 4782 -0.00835386 -0.0321008 -0.0125717 1 0 1 1 0 0 +EDGE2 5102 5101 -0.967141 0.068024 0.0173749 1 0 1 1 0 0 +EDGE2 5102 4781 -0.960576 0.0526737 -0.0406457 1 0 1 1 0 0 +EDGE2 5102 4801 -0.995937 -0.0179052 -0.0371255 1 0 1 1 0 0 +EDGE2 5102 4861 -0.977938 0.0669454 0.0132222 1 0 1 1 0 0 +EDGE2 5102 4802 0.0134885 0.0622746 0.0180804 1 0 1 1 0 0 +EDGE2 5102 4862 0.0289196 -0.0204036 -0.0150296 1 0 1 1 0 0 +EDGE2 5102 4783 0.981049 0.0225208 -0.0299149 1 0 1 1 0 0 +EDGE2 5102 4863 0.913412 -0.0992486 0.00657339 1 0 1 1 0 0 +EDGE2 5102 4803 0.971373 0.0487653 0.00583457 1 0 1 1 0 0 +EDGE2 5103 4782 -0.961147 0.0386367 0.0195071 1 0 1 1 0 0 +EDGE2 5103 5102 -1.0275 -0.0607567 -0.00639729 1 0 1 1 0 0 +EDGE2 5103 4802 -0.986936 0.0166125 -0.00267096 1 0 1 1 0 0 +EDGE2 5103 4862 -0.97398 -0.0204491 -0.0281761 1 0 1 1 0 0 +EDGE2 5103 4784 1.05043 0.0495235 0.00729304 1 0 1 1 0 0 +EDGE2 5103 4783 -0.0201441 -0.00562383 0.0107184 1 0 1 1 0 0 +EDGE2 5103 4863 -0.0695538 0.06689 0.0273963 1 0 1 1 0 0 +EDGE2 5103 4803 -0.0300361 0.0525787 -0.00479185 1 0 1 1 0 0 +EDGE2 5103 4864 1.05084 0.0114822 0.0127068 1 0 1 1 0 0 +EDGE2 5103 4804 0.996047 -0.0171536 -0.00461129 1 0 1 1 0 0 +EDGE2 5104 4784 0.081662 0.0193923 -0.000477655 1 0 1 1 0 0 +EDGE2 5104 4783 -0.89305 -0.00110922 -0.0107217 1 0 1 1 0 0 +EDGE2 5104 4863 -1.01734 0.002367 -0.0504782 1 0 1 1 0 0 +EDGE2 5104 5103 -1.012 -0.0622694 -0.00340119 1 0 1 1 0 0 +EDGE2 5104 4803 -1.01517 -0.0689465 -0.00700633 1 0 1 1 0 0 +EDGE2 5104 4864 -0.118782 -0.0593243 -0.0279567 1 0 1 1 0 0 +EDGE2 5104 4804 -0.0602658 0.0985096 0.0311721 1 0 1 1 0 0 +EDGE2 5104 4825 0.968139 0.0263338 -3.14742 1 0 1 1 0 0 +EDGE2 5104 4865 0.905917 0.0219242 0.0228151 1 0 1 1 0 0 +EDGE2 5104 4845 1.01124 -0.0183807 -3.16026 1 0 1 1 0 0 +EDGE2 5104 4785 1.0106 0.0285329 0.00459956 1 0 1 1 0 0 +EDGE2 5104 4805 0.99269 -0.0880266 0.00928514 1 0 1 1 0 0 +EDGE2 5105 4826 -0.00641207 -1.05525 -1.54825 1 0 1 1 0 0 +EDGE2 5105 4806 0.0351328 -0.885592 -1.57385 1 0 1 1 0 0 +EDGE2 5105 4784 -0.964452 0.0552777 -0.0173594 1 0 1 1 0 0 +EDGE2 5105 4864 -0.990906 0.0129779 0.0206458 1 0 1 1 0 0 +EDGE2 5105 5104 -0.989965 0.0479115 -0.012981 1 0 1 1 0 0 +EDGE2 5105 4804 -1.06456 0.0681943 -0.00430972 1 0 1 1 0 0 +EDGE2 5105 4825 0.0183921 0.05582 -3.10624 1 0 1 1 0 0 +EDGE2 5105 4865 0.011825 -0.0588472 0.00910066 1 0 1 1 0 0 +EDGE2 5105 4845 0.0126891 0.0778546 -3.16879 1 0 1 1 0 0 +EDGE2 5105 4844 1.11065 0.0645744 -3.10945 1 0 1 1 0 0 +EDGE2 5105 4785 0.00894623 0.0139845 0.0266443 1 0 1 1 0 0 +EDGE2 5105 4805 -0.0593175 -0.112451 -0.0188746 1 0 1 1 0 0 +EDGE2 5105 4824 1.057 0.0964981 -3.11777 1 0 1 1 0 0 +EDGE2 5105 4786 -0.0414453 0.985842 1.57141 1 0 1 1 0 0 +EDGE2 5105 4846 -0.055146 1.0993 1.58924 1 0 1 1 0 0 +EDGE2 5105 4866 -0.0197879 0.899695 1.58457 1 0 1 1 0 0 +EDGE2 5106 4825 -1.03322 -0.0201314 1.56675 1 0 1 1 0 0 +EDGE2 5106 4865 -0.965573 0.0657279 -1.55849 1 0 1 1 0 0 +EDGE2 5106 5105 -1.04418 0.0030446 -1.61133 1 0 1 1 0 0 +EDGE2 5106 4845 -0.940546 0.0566658 1.57039 1 0 1 1 0 0 +EDGE2 5106 4785 -0.899072 -0.0112445 -1.59699 1 0 1 1 0 0 +EDGE2 5106 4805 -1.02367 0.0620837 -1.58088 1 0 1 1 0 0 +EDGE2 5106 4786 0.0287943 0.029459 -0.00160695 1 0 1 1 0 0 +EDGE2 5106 4846 0.0232512 0.0201209 -0.00231067 1 0 1 1 0 0 +EDGE2 5106 4866 0.0604642 0.0581414 -0.0305227 1 0 1 1 0 0 +EDGE2 5106 4787 0.982558 0.0272936 -0.00287471 1 0 1 1 0 0 +EDGE2 5106 4847 1.02037 -0.00454818 0.00396677 1 0 1 1 0 0 +EDGE2 5106 4867 1.13139 -0.00479566 0.00460245 1 0 1 1 0 0 +EDGE2 5107 5106 -0.87566 -0.0449035 -0.00805639 1 0 1 1 0 0 +EDGE2 5107 4786 -1.05058 0.0560126 0.0120517 1 0 1 1 0 0 +EDGE2 5107 4846 -0.972157 -0.00659179 -0.0352812 1 0 1 1 0 0 +EDGE2 5107 4866 -1.0391 0.0229947 0.000169661 1 0 1 1 0 0 +EDGE2 5107 4787 0.0852593 0.0715267 0.0359375 1 0 1 1 0 0 +EDGE2 5107 4847 -0.072059 0.00360064 -0.0244518 1 0 1 1 0 0 +EDGE2 5107 4867 -0.0293714 0.0893012 0.00510342 1 0 1 1 0 0 +EDGE2 5107 4788 0.96208 0.0612707 -0.0053381 1 0 1 1 0 0 +EDGE2 5107 4848 0.967005 0.0793844 -0.0213243 1 0 1 1 0 0 +EDGE2 5107 4868 1.0721 0.04959 -0.034707 1 0 1 1 0 0 +EDGE2 5108 5107 -0.989777 -0.0140931 -0.00317671 1 0 1 1 0 0 +EDGE2 5108 4787 -0.95917 -0.0552519 -0.00559243 1 0 1 1 0 0 +EDGE2 5108 4847 -1.08754 0.0264413 0.00715269 1 0 1 1 0 0 +EDGE2 5108 4867 -0.992969 0.0293363 0.00351317 1 0 1 1 0 0 +EDGE2 5108 4788 0.0537132 0.0972329 0.0209938 1 0 1 1 0 0 +EDGE2 5108 4848 0.0162314 -0.0191253 -0.0378556 1 0 1 1 0 0 +EDGE2 5108 4868 -0.0750274 -0.0545548 0.00478239 1 0 1 1 0 0 +EDGE2 5108 4849 1.05559 -0.0784972 -0.00425193 1 0 1 1 0 0 +EDGE2 5108 4869 0.967083 -0.0216718 0.00179122 1 0 1 1 0 0 +EDGE2 5108 4789 1.05292 0.0261396 -0.0129852 1 0 1 1 0 0 +EDGE2 5109 5108 -0.983272 0.0105389 -0.0304048 1 0 1 1 0 0 +EDGE2 5109 4788 -1.04204 0.0878912 -0.0336401 1 0 1 1 0 0 +EDGE2 5109 4848 -1.12587 0.0460037 -0.0260083 1 0 1 1 0 0 +EDGE2 5109 4868 -1.06069 0.0504452 0.015594 1 0 1 1 0 0 +EDGE2 5109 4849 -0.0067035 -0.033233 -0.00468352 1 0 1 1 0 0 +EDGE2 5109 4869 0.0879102 0.00954006 -0.0211345 1 0 1 1 0 0 +EDGE2 5109 4789 -0.0551885 0.02937 -0.00640071 1 0 1 1 0 0 +EDGE2 5109 4850 0.920265 -0.000484249 0.00871558 1 0 1 1 0 0 +EDGE2 5109 4870 0.933661 -0.0044661 0.00251328 1 0 1 1 0 0 +EDGE2 5109 5090 0.966967 -0.0173285 -3.16129 1 0 1 1 0 0 +EDGE2 5109 4790 1.09653 0.000700537 0.0294941 1 0 1 1 0 0 +EDGE2 5110 4849 -1.09392 0.0489797 0.0227108 1 0 1 1 0 0 +EDGE2 5110 4869 -1.03592 -0.0276659 0.0164892 1 0 1 1 0 0 +EDGE2 5110 5109 -0.983788 0.0430889 -0.0227856 1 0 1 1 0 0 +EDGE2 5110 4789 -1.04026 -0.0921473 0.0308046 1 0 1 1 0 0 +EDGE2 5110 4791 0.0345431 1.01412 1.56958 1 0 1 1 0 0 +EDGE2 5110 4851 -0.00496524 1.0167 1.55586 1 0 1 1 0 0 +EDGE2 5110 5091 0.0414717 0.967915 1.62873 1 0 1 1 0 0 +EDGE2 5110 4871 -0.0428198 -1.03934 -1.55905 1 0 1 1 0 0 +EDGE2 5110 4850 -0.0335762 -0.028262 -0.0147887 1 0 1 1 0 0 +EDGE2 5110 4870 -0.0320501 -0.0189743 0.0238103 1 0 1 1 0 0 +EDGE2 5110 5090 0.0382417 -0.013922 -3.13653 1 0 1 1 0 0 +EDGE2 5110 4790 -0.0321884 -0.0157463 0.0142782 1 0 1 1 0 0 +EDGE2 5110 5089 1.00076 -0.0483283 -3.14242 1 0 1 1 0 0 +EDGE2 5111 5110 -0.979915 -0.0497075 -1.57005 1 0 1 1 0 0 +EDGE2 5111 4792 1.04179 -0.0353187 0.0184799 1 0 1 1 0 0 +EDGE2 5111 4852 1.02877 0.00783631 -0.0123696 1 0 1 1 0 0 +EDGE2 5111 5092 1.11088 -0.0391253 0.00618908 1 0 1 1 0 0 +EDGE2 5111 4791 0.0279998 -0.00435177 0.000872709 1 0 1 1 0 0 +EDGE2 5111 4851 -0.102906 -0.0437406 0.0269386 1 0 1 1 0 0 +EDGE2 5111 5091 -0.0370226 0.0144707 0.0292909 1 0 1 1 0 0 +EDGE2 5111 4850 -1.03627 0.00182587 -1.59357 1 0 1 1 0 0 +EDGE2 5111 4870 -0.892771 -0.0256021 -1.56125 1 0 1 1 0 0 +EDGE2 5111 5090 -1.0667 -0.0141876 1.59198 1 0 1 1 0 0 +EDGE2 5111 4790 -1.03186 0.073717 -1.60364 1 0 1 1 0 0 +EDGE2 5112 4793 1.00364 -0.0605508 0.00567346 1 0 1 1 0 0 +EDGE2 5112 4853 1.03036 -0.0168079 0.00764522 1 0 1 1 0 0 +EDGE2 5112 5093 0.966151 0.0564518 0.0194294 1 0 1 1 0 0 +EDGE2 5112 5111 -1.04675 -0.0818453 0.011395 1 0 1 1 0 0 +EDGE2 5112 4792 0.0886152 -0.0979257 0.0313209 1 0 1 1 0 0 +EDGE2 5112 4852 0.0782579 0.0470475 0.00754058 1 0 1 1 0 0 +EDGE2 5112 5092 -0.0257003 0.00754309 -0.000950412 1 0 1 1 0 0 +EDGE2 5112 4791 -0.996188 0.0550252 -0.0360772 1 0 1 1 0 0 +EDGE2 5112 4851 -1.02114 -0.0193536 0.0215239 1 0 1 1 0 0 +EDGE2 5112 5091 -1.08211 -0.0225503 -0.000795815 1 0 1 1 0 0 +EDGE2 5113 5112 -1.00856 0.0247686 0.0146173 1 0 1 1 0 0 +EDGE2 5113 4794 0.94586 -0.00713634 0.0121157 1 0 1 1 0 0 +EDGE2 5113 4854 0.963851 -0.0726498 -0.0131838 1 0 1 1 0 0 +EDGE2 5113 5094 0.993592 -0.0214351 -0.0250272 1 0 1 1 0 0 +EDGE2 5113 4793 -0.0118057 0.0894539 0.000227068 1 0 1 1 0 0 +EDGE2 5113 4853 -0.0775354 0.00558839 0.00754223 1 0 1 1 0 0 +EDGE2 5113 5093 -0.0581862 0.0120224 -0.0192521 1 0 1 1 0 0 +EDGE2 5113 4792 -0.979075 -0.0297232 0.00302853 1 0 1 1 0 0 +EDGE2 5113 4852 -0.990821 0.0448268 -0.0293974 1 0 1 1 0 0 +EDGE2 5113 5092 -1.03433 0.0243945 0.0455312 1 0 1 1 0 0 +EDGE2 5114 5095 1.02672 -0.0238344 -0.0224447 1 0 1 1 0 0 +EDGE2 5114 4795 1.00432 -0.0535463 0.000467153 1 0 1 1 0 0 +EDGE2 5114 4855 0.98372 0.045971 -0.0174567 1 0 1 1 0 0 +EDGE2 5114 5113 -0.973689 0.0494145 0.0130079 1 0 1 1 0 0 +EDGE2 5114 4794 0.0385996 0.00333842 -0.00338688 1 0 1 1 0 0 +EDGE2 5114 4854 0.0235652 0.0388109 -0.0420134 1 0 1 1 0 0 +EDGE2 5114 5094 -0.0348109 -0.0242652 -0.00590818 1 0 1 1 0 0 +EDGE2 5114 4793 -0.987408 0.0312689 -0.00992146 1 0 1 1 0 0 +EDGE2 5114 4853 -1.02291 0.000838742 0.0333511 1 0 1 1 0 0 +EDGE2 5114 5093 -1.05492 -0.0195548 -0.0134984 1 0 1 1 0 0 +EDGE2 5115 4856 -0.0602127 0.941066 1.56977 1 0 1 1 0 0 +EDGE2 5115 5096 0.0275416 1.03745 1.58314 1 0 1 1 0 0 +EDGE2 5115 4796 -0.0538722 1.04178 1.54824 1 0 1 1 0 0 +EDGE2 5115 5114 -0.993463 0.014805 -0.0170228 1 0 1 1 0 0 +EDGE2 5115 5095 0.0147094 -0.0161395 0.0189306 1 0 1 1 0 0 +EDGE2 5115 4795 0.0262188 0.0254532 0.0308664 1 0 1 1 0 0 +EDGE2 5115 4855 -0.0322895 -0.0624876 -0.0152205 1 0 1 1 0 0 +EDGE2 5115 4794 -1.06814 0.00332546 -0.00897167 1 0 1 1 0 0 +EDGE2 5115 4854 -1.03816 -0.00402146 -0.0180252 1 0 1 1 0 0 +EDGE2 5115 5094 -1.03312 0.0546025 0.0206793 1 0 1 1 0 0 +EDGE2 5116 5095 -0.979815 0.0155251 1.59748 1 0 1 1 0 0 +EDGE2 5116 5115 -0.970472 -0.0193217 1.58276 1 0 1 1 0 0 +EDGE2 5116 4795 -1.07599 -0.0141249 1.56333 1 0 1 1 0 0 +EDGE2 5116 4855 -0.957293 0.0592995 1.61281 1 0 1 1 0 0 +EDGE2 5117 5116 -0.985206 0.0832272 0.0439953 1 0 1 1 0 0 +EDGE2 5118 5117 -1.07606 0.015744 0.00233453 1 0 1 1 0 0 +EDGE2 5119 5118 -1.00279 0.01734 -0.0171405 1 0 1 1 0 0 +EDGE2 5120 5119 -0.963452 0.0116946 -0.00704836 1 0 1 1 0 0 +EDGE2 5121 5120 -1.01525 0.0208596 -1.6107 1 0 1 1 0 0 +EDGE2 5122 5121 -0.981246 0.0322562 -0.00589133 1 0 1 1 0 0 +EDGE2 5123 5122 -1.01439 -0.0610991 0.000942069 1 0 1 1 0 0 +EDGE2 5124 5123 -1.02661 -0.00562351 0.0177793 1 0 1 1 0 0 +EDGE2 5125 5124 -1.01669 -0.00902802 0.00814672 1 0 1 1 0 0 +EDGE2 5126 5125 -0.955318 -0.0110123 -1.59846 1 0 1 1 0 0 +EDGE2 5127 5126 -1.0885 0.00376557 0.0104333 1 0 1 1 0 0 +EDGE2 5128 5127 -1.00111 -0.00601395 -0.00825092 1 0 1 1 0 0 +EDGE2 5129 5128 -0.976094 -0.0781228 0.019034 1 0 1 1 0 0 +EDGE2 5130 5129 -0.905807 0.0154941 0.0203687 1 0 1 1 0 0 +EDGE2 5131 5130 -1.00736 0.0110251 -1.55459 1 0 1 1 0 0 +EDGE2 5132 5131 -0.956957 -0.0966069 -0.02018 1 0 1 1 0 0 +EDGE2 5133 5132 -0.983419 -0.00797199 -0.0210965 1 0 1 1 0 0 +EDGE2 5134 5133 -0.96201 0.0716216 -0.0196526 1 0 1 1 0 0 +EDGE2 5134 5095 0.972963 -0.0839366 -3.13094 1 0 1 1 0 0 +EDGE2 5134 5115 0.974741 -0.0920333 -3.16658 1 0 1 1 0 0 +EDGE2 5134 4795 0.965461 -0.0257393 -3.15647 1 0 1 1 0 0 +EDGE2 5134 4855 1.0426 -0.0250405 -3.16226 1 0 1 1 0 0 +EDGE2 5135 4856 -0.0164664 -1.02525 -1.58814 1 0 1 1 0 0 +EDGE2 5135 5096 0.00784359 -0.990382 -1.55056 1 0 1 1 0 0 +EDGE2 5135 4796 0.0161922 -0.987134 -1.57449 1 0 1 1 0 0 +EDGE2 5135 5114 1.0553 0.00170493 -3.16313 1 0 1 1 0 0 +EDGE2 5135 5095 0.0232569 -0.0519634 -3.16826 1 0 1 1 0 0 +EDGE2 5135 5134 -1.08726 -0.0559885 0.0137937 1 0 1 1 0 0 +EDGE2 5135 5115 -0.0210945 -0.0112381 -3.12171 1 0 1 1 0 0 +EDGE2 5135 4795 -0.0700317 -0.00297196 -3.1325 1 0 1 1 0 0 +EDGE2 5135 4855 -0.0194244 0.0459208 -3.14077 1 0 1 1 0 0 +EDGE2 5135 5116 0.0530608 1.06084 1.57827 1 0 1 1 0 0 +EDGE2 5135 4794 1.01423 -0.070658 -3.15649 1 0 1 1 0 0 +EDGE2 5135 4854 0.972319 0.0310007 -3.14808 1 0 1 1 0 0 +EDGE2 5135 5094 1.05515 0.0213965 -3.13942 1 0 1 1 0 0 +EDGE2 5136 4857 1.04644 0.0194254 -0.00872517 1 0 1 1 0 0 +EDGE2 5136 5097 0.982045 0.0277489 -0.0137816 1 0 1 1 0 0 +EDGE2 5136 4797 0.968442 -0.0356538 -0.00476146 1 0 1 1 0 0 +EDGE2 5136 4856 -0.0715632 -0.0870664 0.0200957 1 0 1 1 0 0 +EDGE2 5136 5096 -0.0137166 0.105505 -0.0223755 1 0 1 1 0 0 +EDGE2 5136 4796 0.00625594 -0.0135132 0.0128156 1 0 1 1 0 0 +EDGE2 5136 5095 -1.06504 -0.0802119 -1.55568 1 0 1 1 0 0 +EDGE2 5136 5135 -0.948613 -0.0822038 1.56135 1 0 1 1 0 0 +EDGE2 5136 5115 -0.956162 -0.000643481 -1.55603 1 0 1 1 0 0 +EDGE2 5136 4795 -0.996317 -0.03224 -1.55982 1 0 1 1 0 0 +EDGE2 5136 4855 -1.00299 0.012357 -1.57789 1 0 1 1 0 0 +EDGE2 5137 4857 0.0500439 -0.0315565 0.0219129 1 0 1 1 0 0 +EDGE2 5137 4798 0.971459 -0.0883768 0.00683633 1 0 1 1 0 0 +EDGE2 5137 5098 1.09653 0.0802138 0.0101888 1 0 1 1 0 0 +EDGE2 5137 4858 1.0776 -0.033387 -0.00267561 1 0 1 1 0 0 +EDGE2 5137 5097 0.0201812 -0.0419341 0.0275642 1 0 1 1 0 0 +EDGE2 5137 5136 -0.980787 0.0623873 -0.00198723 1 0 1 1 0 0 +EDGE2 5137 4797 0.0215735 0.0530234 -0.0310483 1 0 1 1 0 0 +EDGE2 5137 4856 -1.01089 0.0464127 0.00590881 1 0 1 1 0 0 +EDGE2 5137 5096 -0.884497 -0.0466382 0.00159993 1 0 1 1 0 0 +EDGE2 5137 4796 -0.92326 -0.0170535 -0.00338053 1 0 1 1 0 0 +EDGE2 5138 4859 1.07118 0.0423636 0.0490674 1 0 1 1 0 0 +EDGE2 5138 5099 1.02006 0.00875551 0.0353758 1 0 1 1 0 0 +EDGE2 5138 4799 0.975514 -0.0842439 0.00386423 1 0 1 1 0 0 +EDGE2 5138 4857 -0.989203 0.112739 0.00562437 1 0 1 1 0 0 +EDGE2 5138 4798 -0.0111801 -0.0119747 0.00996322 1 0 1 1 0 0 +EDGE2 5138 5098 -0.0278732 -0.0213584 0.00134181 1 0 1 1 0 0 +EDGE2 5138 4858 0.0133863 -0.0982971 -0.00439395 1 0 1 1 0 0 +EDGE2 5138 5137 -1.05232 -0.0218903 0.00254262 1 0 1 1 0 0 +EDGE2 5138 5097 -0.985559 -0.0201703 0.0241048 1 0 1 1 0 0 +EDGE2 5138 4797 -0.967663 -0.102299 0.0151425 1 0 1 1 0 0 +EDGE2 5139 5100 0.970025 0.0158211 -0.0210612 1 0 1 1 0 0 +EDGE2 5139 4780 1.04864 -0.019367 -3.12988 1 0 1 1 0 0 +EDGE2 5139 4800 1.00376 -0.0316787 -0.00740888 1 0 1 1 0 0 +EDGE2 5139 4860 1.00364 -0.00996042 -0.0175133 1 0 1 1 0 0 +EDGE2 5139 4859 -0.0461118 0.0166044 0.0132022 1 0 1 1 0 0 +EDGE2 5139 5099 -0.0918853 0.00942815 -0.0369318 1 0 1 1 0 0 +EDGE2 5139 4799 0.0216043 0.0172613 -0.0261499 1 0 1 1 0 0 +EDGE2 5139 4798 -0.982894 -0.046582 0.0297174 1 0 1 1 0 0 +EDGE2 5139 5098 -1.00816 0.0332462 -0.0139441 1 0 1 1 0 0 +EDGE2 5139 5138 -1.00195 -0.0174371 -0.0119301 1 0 1 1 0 0 +EDGE2 5139 4858 -0.964072 0.0276249 0.0109841 1 0 1 1 0 0 +EDGE2 5140 4779 1.02246 -0.0818469 -3.10547 1 0 1 1 0 0 +EDGE2 5140 5101 0.0194153 1.03294 1.56763 1 0 1 1 0 0 +EDGE2 5140 5100 0.0158694 0.116587 0.0134789 1 0 1 1 0 0 +EDGE2 5140 4780 0.0418803 0.0510185 -3.13709 1 0 1 1 0 0 +EDGE2 5140 4800 -0.0116178 0.046674 0.0224471 1 0 1 1 0 0 +EDGE2 5140 4860 0.07221 -0.00734657 0.0171234 1 0 1 1 0 0 +EDGE2 5140 4859 -1.0011 0.0250026 0.0141511 1 0 1 1 0 0 +EDGE2 5140 5139 -1.04771 0.0859986 -0.0117675 1 0 1 1 0 0 +EDGE2 5140 5099 -1.00881 -0.0164571 -0.0181546 1 0 1 1 0 0 +EDGE2 5140 4781 0.11791 0.92886 1.56697 1 0 1 1 0 0 +EDGE2 5140 4801 0.0615735 1.02597 1.56496 1 0 1 1 0 0 +EDGE2 5140 4861 0.0823823 1.01363 1.53181 1 0 1 1 0 0 +EDGE2 5140 4799 -1.05948 0.0847802 0.00407866 1 0 1 1 0 0 +EDGE2 5141 4782 1.01602 0.0226507 -0.0420393 1 0 1 1 0 0 +EDGE2 5141 5101 0.0907465 0.0647979 -0.024318 1 0 1 1 0 0 +EDGE2 5141 5100 -0.995665 0.0661923 -1.55051 1 0 1 1 0 0 +EDGE2 5141 5140 -1.02578 -0.00929197 -1.61349 1 0 1 1 0 0 +EDGE2 5141 4780 -1.11379 -0.054185 1.58129 1 0 1 1 0 0 +EDGE2 5141 4800 -1.10902 -0.0547707 -1.51951 1 0 1 1 0 0 +EDGE2 5141 4860 -0.999982 -0.150632 -1.56275 1 0 1 1 0 0 +EDGE2 5141 5102 1.01775 0.0538776 -0.0366529 1 0 1 1 0 0 +EDGE2 5141 4781 -0.0123279 -0.0140232 -0.00783448 1 0 1 1 0 0 +EDGE2 5141 4801 0.00444096 0.0135861 -0.010732 1 0 1 1 0 0 +EDGE2 5141 4861 0.0525323 -0.00236417 0.011982 1 0 1 1 0 0 +EDGE2 5141 4802 0.910469 -0.00371437 0.00359356 1 0 1 1 0 0 +EDGE2 5141 4862 1.06337 0.0178287 -0.0384222 1 0 1 1 0 0 +EDGE2 5142 4782 -0.0171321 0.0357513 0.0219037 1 0 1 1 0 0 +EDGE2 5142 5101 -1.02753 -0.125992 0.0109138 1 0 1 1 0 0 +EDGE2 5142 5141 -0.923144 -0.0603785 0.0150106 1 0 1 1 0 0 +EDGE2 5142 5102 -0.0176655 -0.0776017 0.0139473 1 0 1 1 0 0 +EDGE2 5142 4781 -0.97716 0.026569 0.0304203 1 0 1 1 0 0 +EDGE2 5142 4801 -1.04356 -0.0134228 -0.0155787 1 0 1 1 0 0 +EDGE2 5142 4861 -0.89661 0.0488107 -0.00550484 1 0 1 1 0 0 +EDGE2 5142 4802 -0.0163127 0.0594078 -0.0405765 1 0 1 1 0 0 +EDGE2 5142 4862 -0.0643193 0.011006 0.0132029 1 0 1 1 0 0 +EDGE2 5142 4783 1.07949 0.0552693 -0.0110014 1 0 1 1 0 0 +EDGE2 5142 4863 0.985777 0.0186539 0.000696294 1 0 1 1 0 0 +EDGE2 5142 5103 0.956325 -0.0658452 0.0139303 1 0 1 1 0 0 +EDGE2 5142 4803 1.06823 -0.0108851 0.0101468 1 0 1 1 0 0 +EDGE2 5143 4782 -0.977753 -0.044975 -0.0131826 1 0 1 1 0 0 +EDGE2 5143 5102 -0.925196 -0.0482695 -0.016096 1 0 1 1 0 0 +EDGE2 5143 5142 -1.02296 -0.0313425 -0.0426936 1 0 1 1 0 0 +EDGE2 5143 4802 -0.979489 0.0247971 0.0199354 1 0 1 1 0 0 +EDGE2 5143 4862 -0.966806 -0.0359432 -0.00323509 1 0 1 1 0 0 +EDGE2 5143 4784 1.1095 -0.0154861 -0.000240414 1 0 1 1 0 0 +EDGE2 5143 4783 0.0203303 0.0400659 -0.0287377 1 0 1 1 0 0 +EDGE2 5143 4863 0.0591092 -0.0103552 0.00982705 1 0 1 1 0 0 +EDGE2 5143 5103 0.0319992 0.0226315 -0.0100855 1 0 1 1 0 0 +EDGE2 5143 4803 -0.124534 0.0334427 -0.0132048 1 0 1 1 0 0 +EDGE2 5143 4864 0.995637 -0.00613659 0.039864 1 0 1 1 0 0 +EDGE2 5143 5104 1.05508 -0.00968773 0.000724872 1 0 1 1 0 0 +EDGE2 5143 4804 1.03049 -0.0213311 0.00780787 1 0 1 1 0 0 +EDGE2 5144 4784 -0.0297458 -0.0201654 0.0201819 1 0 1 1 0 0 +EDGE2 5144 4783 -0.993859 -0.0318803 -0.0210187 1 0 1 1 0 0 +EDGE2 5144 4863 -1.01178 -0.0927893 0.00227251 1 0 1 1 0 0 +EDGE2 5144 5103 -1.04072 0.0362469 -0.00250167 1 0 1 1 0 0 +EDGE2 5144 5143 -0.937491 0.00207912 -0.00915364 1 0 1 1 0 0 +EDGE2 5144 4803 -0.925908 0.00666821 -0.00918661 1 0 1 1 0 0 +EDGE2 5144 4864 -0.034738 -0.0307079 0.00163503 1 0 1 1 0 0 +EDGE2 5144 5104 -0.0250094 -0.0376485 0.00308804 1 0 1 1 0 0 +EDGE2 5144 4804 0.0519571 -0.0585728 -0.0156177 1 0 1 1 0 0 +EDGE2 5144 4825 1.02291 0.062989 -3.13253 1 0 1 1 0 0 +EDGE2 5144 4865 1.05788 -0.0653461 -0.00431246 1 0 1 1 0 0 +EDGE2 5144 5105 0.995218 0.0832468 -0.0140234 1 0 1 1 0 0 +EDGE2 5144 4845 0.993592 0.00307413 -3.14986 1 0 1 1 0 0 +EDGE2 5144 4785 1.01695 -0.0633965 -0.0128789 1 0 1 1 0 0 +EDGE2 5144 4805 0.993687 -0.0804067 0.0262792 1 0 1 1 0 0 +EDGE2 5145 4826 0.0465105 -1.01779 -1.53603 1 0 1 1 0 0 +EDGE2 5145 4806 0.0812792 -1.04387 -1.56716 1 0 1 1 0 0 +EDGE2 5145 5106 0.0129097 0.934418 1.55698 1 0 1 1 0 0 +EDGE2 5145 4784 -1.10457 0.134178 0.0181114 1 0 1 1 0 0 +EDGE2 5145 4864 -1.12765 -0.00508602 0.026728 1 0 1 1 0 0 +EDGE2 5145 5104 -1.07074 0.0745963 -0.0234326 1 0 1 1 0 0 +EDGE2 5145 5144 -0.974862 0.0418517 -0.0324512 1 0 1 1 0 0 +EDGE2 5145 4804 -1.02992 0.0412489 -0.00725033 1 0 1 1 0 0 +EDGE2 5145 4825 0.0147158 -0.00027726 -3.1668 1 0 1 1 0 0 +EDGE2 5145 4865 -0.0397493 0.0316797 0.00399134 1 0 1 1 0 0 +EDGE2 5145 5105 -0.0502988 -0.0318523 0.0312029 1 0 1 1 0 0 +EDGE2 5145 4845 -0.0159568 -0.000898036 -3.16558 1 0 1 1 0 0 +EDGE2 5145 4844 0.916483 0.000653906 -3.14727 1 0 1 1 0 0 +EDGE2 5145 4785 0.0516487 0.0544455 -0.0092108 1 0 1 1 0 0 +EDGE2 5145 4805 -0.0439807 0.0377423 0.0181571 1 0 1 1 0 0 +EDGE2 5145 4824 1.01034 0.0840437 -3.13316 1 0 1 1 0 0 +EDGE2 5145 4786 0.0363262 0.996228 1.56366 1 0 1 1 0 0 +EDGE2 5145 4846 -0.103202 0.97399 1.56393 1 0 1 1 0 0 +EDGE2 5145 4866 -0.00306438 1.02902 1.55695 1 0 1 1 0 0 +EDGE2 5146 5106 -0.056674 -0.0374473 -0.0247983 1 0 1 1 0 0 +EDGE2 5146 4825 -0.987722 0.0254433 1.56766 1 0 1 1 0 0 +EDGE2 5146 4865 -0.968373 -0.0463154 -1.58418 1 0 1 1 0 0 +EDGE2 5146 5105 -1.00191 -0.00362265 -1.56804 1 0 1 1 0 0 +EDGE2 5146 5145 -1.02599 0.0132353 -1.61178 1 0 1 1 0 0 +EDGE2 5146 4845 -1.03408 -0.125183 1.61277 1 0 1 1 0 0 +EDGE2 5146 4785 -0.928892 -0.00606083 -1.56153 1 0 1 1 0 0 +EDGE2 5146 4805 -0.974365 0.0717912 -1.61339 1 0 1 1 0 0 +EDGE2 5146 5107 0.957153 -0.0577707 -0.0267645 1 0 1 1 0 0 +EDGE2 5146 4786 0.0529561 -0.101534 -0.00329726 1 0 1 1 0 0 +EDGE2 5146 4846 0.0893396 0.13014 -0.0259828 1 0 1 1 0 0 +EDGE2 5146 4866 -0.0876506 -0.0380026 0.0163595 1 0 1 1 0 0 +EDGE2 5146 4787 1.10219 0.0454458 0.0130899 1 0 1 1 0 0 +EDGE2 5146 4847 0.94252 -0.0428923 -0.00138003 1 0 1 1 0 0 +EDGE2 5146 4867 1.03085 -0.0575595 0.0253796 1 0 1 1 0 0 +EDGE2 5147 5106 -0.947314 0.0340899 0.00894692 1 0 1 1 0 0 +EDGE2 5147 5146 -1.00373 -0.0687107 -0.00370562 1 0 1 1 0 0 +EDGE2 5147 5108 1.00983 0.0165129 0.00230819 1 0 1 1 0 0 +EDGE2 5147 5107 -0.112989 0.126848 0.00270087 1 0 1 1 0 0 +EDGE2 5147 4786 -0.99011 -0.0311101 0.00958907 1 0 1 1 0 0 +EDGE2 5147 4846 -1.03834 -0.0454333 -0.0420249 1 0 1 1 0 0 +EDGE2 5147 4866 -1.03156 0.0360431 -0.0295663 1 0 1 1 0 0 +EDGE2 5147 4787 -0.00856217 -0.0684105 0.0259896 1 0 1 1 0 0 +EDGE2 5147 4847 -0.0514079 0.0138309 0.0143855 1 0 1 1 0 0 +EDGE2 5147 4867 0.107347 -0.0280844 0.00491188 1 0 1 1 0 0 +EDGE2 5147 4788 0.953044 -0.00862421 0.0158056 1 0 1 1 0 0 +EDGE2 5147 4848 0.891456 -0.0225067 -0.00332287 1 0 1 1 0 0 +EDGE2 5147 4868 1.03289 0.0578653 0.0326794 1 0 1 1 0 0 +EDGE2 5148 5108 0.0685157 0.00450094 0.00239668 1 0 1 1 0 0 +EDGE2 5148 5107 -1.07902 0.0180077 -0.028825 1 0 1 1 0 0 +EDGE2 5148 5147 -0.970525 -0.0543466 -0.014134 1 0 1 1 0 0 +EDGE2 5148 4787 -1.07543 0.0140607 -0.00726481 1 0 1 1 0 0 +EDGE2 5148 4847 -0.934161 0.0571064 0.00811515 1 0 1 1 0 0 +EDGE2 5148 4867 -1.05888 -0.024367 -0.0329698 1 0 1 1 0 0 +EDGE2 5148 4788 0.00547813 -0.0581314 -0.010236 1 0 1 1 0 0 +EDGE2 5148 4848 -0.0270095 -0.0109086 0.00399842 1 0 1 1 0 0 +EDGE2 5148 4868 -0.0321202 0.00628644 -0.0143647 1 0 1 1 0 0 +EDGE2 5148 4849 1.09393 0.0358967 -0.0254888 1 0 1 1 0 0 +EDGE2 5148 4869 1.02679 -0.0728393 0.00581471 1 0 1 1 0 0 +EDGE2 5148 5109 0.986784 -0.0327906 0.000126889 1 0 1 1 0 0 +EDGE2 5148 4789 0.944681 0.124013 0.013868 1 0 1 1 0 0 +EDGE2 5149 5108 -0.956413 0.00585674 0.00735886 1 0 1 1 0 0 +EDGE2 5149 5148 -1.01209 0.000637731 0.00842725 1 0 1 1 0 0 +EDGE2 5149 4788 -1.02656 -0.0249744 0.00809639 1 0 1 1 0 0 +EDGE2 5149 4848 -0.923122 -0.0639967 0.000142625 1 0 1 1 0 0 +EDGE2 5149 4868 -0.982107 0.0493912 0.0176263 1 0 1 1 0 0 +EDGE2 5149 4849 0.0164382 0.0643566 0.00760911 1 0 1 1 0 0 +EDGE2 5149 4869 -0.0131518 -0.135746 0.00214348 1 0 1 1 0 0 +EDGE2 5149 5109 -0.0116901 0.104107 0.0212496 1 0 1 1 0 0 +EDGE2 5149 4789 -0.0190221 -0.0127596 0.0208864 1 0 1 1 0 0 +EDGE2 5149 5110 0.930302 -0.0439594 -0.00785589 1 0 1 1 0 0 +EDGE2 5149 4850 1.0037 0.0383216 0.00259897 1 0 1 1 0 0 +EDGE2 5149 4870 1.00995 -0.0428098 0.0217752 1 0 1 1 0 0 +EDGE2 5149 5090 0.974797 -0.0384483 -3.16137 1 0 1 1 0 0 +EDGE2 5149 4790 1.01954 -0.0227178 -0.0376444 1 0 1 1 0 0 +EDGE2 5150 5149 -0.982921 -0.0528356 0.0389166 1 0 1 1 0 0 +EDGE2 5150 4849 -0.985906 0.0371191 -0.000909633 1 0 1 1 0 0 +EDGE2 5150 4869 -0.984895 0.0395322 0.018321 1 0 1 1 0 0 +EDGE2 5150 5109 -0.913909 -0.0458769 0.0164613 1 0 1 1 0 0 +EDGE2 5150 4789 -1.00809 0.0395314 -0.0191427 1 0 1 1 0 0 +EDGE2 5150 5110 -0.00788935 0.0737357 -0.00874108 1 0 1 1 0 0 +EDGE2 5150 5111 -0.0380214 1.07835 1.55332 1 0 1 1 0 0 +EDGE2 5150 4791 0.0744185 1.01759 1.59187 1 0 1 1 0 0 +EDGE2 5150 4851 0.0297287 0.967108 1.54812 1 0 1 1 0 0 +EDGE2 5150 5091 -0.069976 0.959626 1.59277 1 0 1 1 0 0 +EDGE2 5150 4871 0.0230581 -1.00288 -1.5759 1 0 1 1 0 0 +EDGE2 5150 4850 -0.0137274 0.0780896 0.00413888 1 0 1 1 0 0 +EDGE2 5150 4870 0.0368642 0.00997131 0.0155288 1 0 1 1 0 0 +EDGE2 5150 5090 0.0589911 0.0717896 -3.13052 1 0 1 1 0 0 +EDGE2 5150 4790 0.00599647 0.0145482 0.0344822 1 0 1 1 0 0 +EDGE2 5150 5089 1.02091 0.00517219 -3.12393 1 0 1 1 0 0 +EDGE2 5151 5110 -0.998954 0.00919641 -1.57806 1 0 1 1 0 0 +EDGE2 5151 5112 1.04016 -0.0901972 -0.0313998 1 0 1 1 0 0 +EDGE2 5151 5111 0.0424825 0.0137095 0.0113288 1 0 1 1 0 0 +EDGE2 5151 4792 0.966792 0.0518223 -0.0177522 1 0 1 1 0 0 +EDGE2 5151 4852 0.958533 0.0897199 0.016221 1 0 1 1 0 0 +EDGE2 5151 5092 1.08176 -0.0353292 0.000346366 1 0 1 1 0 0 +EDGE2 5151 4791 -0.00997359 -0.0124627 0.0557281 1 0 1 1 0 0 +EDGE2 5151 4851 0.00373871 0.0410769 0.0190441 1 0 1 1 0 0 +EDGE2 5151 5091 0.0361605 0.0144952 -0.00499842 1 0 1 1 0 0 +EDGE2 5151 5150 -0.944018 0.0450118 -1.57718 1 0 1 1 0 0 +EDGE2 5151 4850 -1.00269 -0.025111 -1.58082 1 0 1 1 0 0 +EDGE2 5151 4870 -0.891717 -0.00984827 -1.58258 1 0 1 1 0 0 +EDGE2 5151 5090 -0.949784 -0.0296436 1.53925 1 0 1 1 0 0 +EDGE2 5151 4790 -0.974317 -0.0412577 -1.54716 1 0 1 1 0 0 +EDGE2 5152 5112 0.0632264 0.0215064 0.00386534 1 0 1 1 0 0 +EDGE2 5152 5113 1.04648 -0.0237654 0.0132896 1 0 1 1 0 0 +EDGE2 5152 4793 0.956831 0.00215833 -0.00805869 1 0 1 1 0 0 +EDGE2 5152 4853 0.993049 0.0279007 -0.00528204 1 0 1 1 0 0 +EDGE2 5152 5093 0.976421 0.0649727 -0.0477514 1 0 1 1 0 0 +EDGE2 5152 5111 -0.960565 0.0238041 -0.0149352 1 0 1 1 0 0 +EDGE2 5152 4792 -0.0516401 -0.00211849 0.0326103 1 0 1 1 0 0 +EDGE2 5152 4852 -0.0180832 0.0130309 -0.0161604 1 0 1 1 0 0 +EDGE2 5152 5092 -0.0230995 -0.0481537 0.020885 1 0 1 1 0 0 +EDGE2 5152 5151 -0.982018 -0.0489039 -0.00913317 1 0 1 1 0 0 +EDGE2 5152 4791 -0.980009 0.00877736 -0.00436764 1 0 1 1 0 0 +EDGE2 5152 4851 -0.984122 0.0426081 -0.0372575 1 0 1 1 0 0 +EDGE2 5152 5091 -1.06443 -0.0107037 0.0146195 1 0 1 1 0 0 +EDGE2 5153 5114 1.05869 0.0338434 0.010324 1 0 1 1 0 0 +EDGE2 5153 5112 -1.07448 -0.0440584 -0.0137871 1 0 1 1 0 0 +EDGE2 5153 5113 0.0140927 -0.0270486 -0.0115857 1 0 1 1 0 0 +EDGE2 5153 4794 0.958316 -0.00505013 0.0302329 1 0 1 1 0 0 +EDGE2 5153 4854 1.04813 -0.037633 -0.0419667 1 0 1 1 0 0 +EDGE2 5153 5094 1.01966 0.0447574 -0.0260098 1 0 1 1 0 0 +EDGE2 5153 4793 -0.0333295 0.0109627 -0.018181 1 0 1 1 0 0 +EDGE2 5153 4853 -0.0195425 -0.0346261 -0.0061582 1 0 1 1 0 0 +EDGE2 5153 5093 -0.0210634 0.00056569 -0.00710566 1 0 1 1 0 0 +EDGE2 5153 5152 -1.08752 0.000183968 -0.00981601 1 0 1 1 0 0 +EDGE2 5153 4792 -0.968397 -0.101303 0.0222741 1 0 1 1 0 0 +EDGE2 5153 4852 -0.951763 0.0517174 -0.010048 1 0 1 1 0 0 +EDGE2 5153 5092 -1.05842 0.00616308 -0.0116984 1 0 1 1 0 0 +EDGE2 5154 5114 -0.0341401 0.0521068 -0.00822376 1 0 1 1 0 0 +EDGE2 5154 5095 1.10395 -0.0239288 -0.0277329 1 0 1 1 0 0 +EDGE2 5154 5135 1.03645 -0.00867161 -3.13583 1 0 1 1 0 0 +EDGE2 5154 5115 1.0474 -0.00105215 -0.0196883 1 0 1 1 0 0 +EDGE2 5154 4795 0.940975 0.0147392 0.0269488 1 0 1 1 0 0 +EDGE2 5154 4855 1.0537 -0.0176392 0.00302876 1 0 1 1 0 0 +EDGE2 5154 5113 -0.968802 -0.00173617 0.00185768 1 0 1 1 0 0 +EDGE2 5154 4794 -0.0500493 -0.0361588 -0.0452675 1 0 1 1 0 0 +EDGE2 5154 4854 0.0722265 -0.116035 0.016427 1 0 1 1 0 0 +EDGE2 5154 5094 -0.00359139 0.0553391 0.0259682 1 0 1 1 0 0 +EDGE2 5154 5153 -0.939095 -0.0361003 -6.6895e-05 1 0 1 1 0 0 +EDGE2 5154 4793 -0.942734 -0.053032 -0.00178111 1 0 1 1 0 0 +EDGE2 5154 4853 -0.986719 0.0438188 0.0127895 1 0 1 1 0 0 +EDGE2 5154 5093 -1.02384 -0.0938845 0.0179857 1 0 1 1 0 0 +EDGE2 5155 5136 -0.0238031 1.00623 1.57188 1 0 1 1 0 0 +EDGE2 5155 4856 -0.00966262 1.03692 1.57486 1 0 1 1 0 0 +EDGE2 5155 5096 0.0339045 1.07558 1.60115 1 0 1 1 0 0 +EDGE2 5155 4796 0.0834677 0.952215 1.5577 1 0 1 1 0 0 +EDGE2 5155 5114 -1.01811 0.0775553 -0.043845 1 0 1 1 0 0 +EDGE2 5155 5095 -0.03115 0.0970877 0.0209923 1 0 1 1 0 0 +EDGE2 5155 5135 0.0282368 -0.0700353 -3.14207 1 0 1 1 0 0 +EDGE2 5155 5134 0.927697 -0.00322797 -3.1774 1 0 1 1 0 0 +EDGE2 5155 5115 0.0114517 -0.0500251 -0.015961 1 0 1 1 0 0 +EDGE2 5155 4795 -0.0611743 -0.00507096 0.0214028 1 0 1 1 0 0 +EDGE2 5155 4855 -0.0169225 0.0619003 0.00274308 1 0 1 1 0 0 +EDGE2 5155 5154 -1.07105 0.0738518 -0.0064793 1 0 1 1 0 0 +EDGE2 5155 5116 -0.0048789 -1.11243 -1.57036 1 0 1 1 0 0 +EDGE2 5155 4794 -0.951856 0.0393576 -0.0316529 1 0 1 1 0 0 +EDGE2 5155 4854 -0.989987 0.0348104 -0.0110429 1 0 1 1 0 0 +EDGE2 5155 5094 -1.03716 -0.00909011 0.0072276 1 0 1 1 0 0 +EDGE2 5156 4857 1.0268 -0.0252909 -0.00758362 1 0 1 1 0 0 +EDGE2 5156 5137 0.987804 -0.0065555 0.0256999 1 0 1 1 0 0 +EDGE2 5156 5097 0.94413 -0.0426508 0.0152464 1 0 1 1 0 0 +EDGE2 5156 5136 -0.0455088 0.0557167 -0.0122417 1 0 1 1 0 0 +EDGE2 5156 4797 0.98569 -0.0597774 0.00185144 1 0 1 1 0 0 +EDGE2 5156 4856 -0.0574224 -0.0418785 0.00223782 1 0 1 1 0 0 +EDGE2 5156 5096 0.0387702 0.00898392 0.00657743 1 0 1 1 0 0 +EDGE2 5156 4796 -0.0493461 0.0257322 0.0150889 1 0 1 1 0 0 +EDGE2 5156 5095 -0.956793 0.0797623 -1.56976 1 0 1 1 0 0 +EDGE2 5156 5135 -1.0793 0.0101222 1.56001 1 0 1 1 0 0 +EDGE2 5156 5155 -1.1128 -0.0380205 -1.57099 1 0 1 1 0 0 +EDGE2 5156 5115 -0.991304 0.0486105 -1.56532 1 0 1 1 0 0 +EDGE2 5156 4795 -1.03733 0.052999 -1.53869 1 0 1 1 0 0 +EDGE2 5156 4855 -1.06717 0.0141695 -1.56973 1 0 1 1 0 0 +EDGE2 5157 4857 -0.117212 -0.063067 0.00217624 1 0 1 1 0 0 +EDGE2 5157 4798 1.03458 -0.0163631 -0.00758214 1 0 1 1 0 0 +EDGE2 5157 5098 1.0132 -0.0954679 0.0190316 1 0 1 1 0 0 +EDGE2 5157 5138 1.01678 0.0561272 0.0310775 1 0 1 1 0 0 +EDGE2 5157 4858 1.01353 0.092895 -0.00655051 1 0 1 1 0 0 +EDGE2 5157 5137 -0.0376417 0.0215507 0.0102109 1 0 1 1 0 0 +EDGE2 5157 5097 0.0103021 0.0459837 0.0506028 1 0 1 1 0 0 +EDGE2 5157 5136 -0.983279 -0.0103345 0.0185926 1 0 1 1 0 0 +EDGE2 5157 4797 -0.0186858 -0.0614858 0.00629242 1 0 1 1 0 0 +EDGE2 5157 5156 -0.965557 0.0707569 -0.0289356 1 0 1 1 0 0 +EDGE2 5157 4856 -1.04265 -0.0128876 -0.0112608 1 0 1 1 0 0 +EDGE2 5157 5096 -1.00318 -0.0341354 0.0326153 1 0 1 1 0 0 +EDGE2 5157 4796 -0.951424 0.127957 0.0342717 1 0 1 1 0 0 +EDGE2 5158 4859 0.987186 -0.00355664 0.00404445 1 0 1 1 0 0 +EDGE2 5158 5139 1.02677 -0.0147776 0.00233037 1 0 1 1 0 0 +EDGE2 5158 5099 1.04182 0.0422344 -0.0381996 1 0 1 1 0 0 +EDGE2 5158 4799 1.06664 0.0105501 0.0144236 1 0 1 1 0 0 +EDGE2 5158 4857 -0.973867 -0.0153074 0.0176855 1 0 1 1 0 0 +EDGE2 5158 4798 0.0498597 -0.00124147 -0.0483504 1 0 1 1 0 0 +EDGE2 5158 5098 -0.036955 -0.0998173 -0.000862014 1 0 1 1 0 0 +EDGE2 5158 5138 0.0867563 -0.0924645 0.00585881 1 0 1 1 0 0 +EDGE2 5158 4858 -0.0359866 -0.032261 0.00603656 1 0 1 1 0 0 +EDGE2 5158 5137 -0.975687 -0.0783278 -0.0123075 1 0 1 1 0 0 +EDGE2 5158 5157 -1.00198 0.0434876 -0.0060216 1 0 1 1 0 0 +EDGE2 5158 5097 -0.941783 -0.000746886 -0.0111379 1 0 1 1 0 0 +EDGE2 5158 4797 -0.996101 -0.044463 -0.000997747 1 0 1 1 0 0 +EDGE2 5159 5100 0.976448 -0.0476362 -0.019171 1 0 1 1 0 0 +EDGE2 5159 5140 0.941973 0.0460953 0.00109545 1 0 1 1 0 0 +EDGE2 5159 4780 0.898581 -0.0327983 -3.07378 1 0 1 1 0 0 +EDGE2 5159 4800 0.974154 0.0422845 0.0334321 1 0 1 1 0 0 +EDGE2 5159 4860 1.03995 -0.128516 0.0088966 1 0 1 1 0 0 +EDGE2 5159 4859 -0.0614894 0.0192761 0.00618234 1 0 1 1 0 0 +EDGE2 5159 5139 -0.0217313 -0.0211774 -0.0172372 1 0 1 1 0 0 +EDGE2 5159 5099 0.0544038 0.0307158 0.00617455 1 0 1 1 0 0 +EDGE2 5159 4799 0.00155592 0.0457973 0.0173195 1 0 1 1 0 0 +EDGE2 5159 4798 -0.8776 -0.025198 0.0106483 1 0 1 1 0 0 +EDGE2 5159 5098 -0.949573 0.0700438 0.0332312 1 0 1 1 0 0 +EDGE2 5159 5138 -1.02231 -0.0504274 -0.0189984 1 0 1 1 0 0 +EDGE2 5159 5158 -1.02794 -0.0210393 -0.0245214 1 0 1 1 0 0 +EDGE2 5159 4858 -0.993647 0.0275884 -0.0391455 1 0 1 1 0 0 +EDGE2 5160 4779 1.1315 0.0146525 -3.13456 1 0 1 1 0 0 +EDGE2 5160 5101 0.00447284 0.991395 1.58806 1 0 1 1 0 0 +EDGE2 5160 5100 0.154637 -0.0856909 -0.0396199 1 0 1 1 0 0 +EDGE2 5160 5140 0.047372 -0.079135 -0.0200684 1 0 1 1 0 0 +EDGE2 5160 4780 0.0500467 0.0220249 -3.11343 1 0 1 1 0 0 +EDGE2 5160 4800 7.74459e-05 -0.0265373 0.0202768 1 0 1 1 0 0 +EDGE2 5160 4860 -0.00196744 0.0917498 0.0315821 1 0 1 1 0 0 +EDGE2 5160 5141 0.00579528 0.94811 1.61854 1 0 1 1 0 0 +EDGE2 5160 4859 -1.0338 -0.0742542 -0.00343552 1 0 1 1 0 0 +EDGE2 5160 5139 -1.0566 -0.0453592 0.00277394 1 0 1 1 0 0 +EDGE2 5160 5159 -0.921431 -0.0478433 0.00659998 1 0 1 1 0 0 +EDGE2 5160 5099 -1.03913 0.0283118 0.000886137 1 0 1 1 0 0 +EDGE2 5160 4781 -0.118043 0.949672 1.59141 1 0 1 1 0 0 +EDGE2 5160 4801 -0.0536561 1.01301 1.53968 1 0 1 1 0 0 +EDGE2 5160 4861 0.00703187 1.06771 1.56515 1 0 1 1 0 0 +EDGE2 5160 4799 -1.00054 0.00612884 -0.0495224 1 0 1 1 0 0 +EDGE2 5161 5100 -1.00884 -0.131098 1.57541 1 0 1 1 0 0 +EDGE2 5161 5160 -1.00778 -0.0227267 1.54411 1 0 1 1 0 0 +EDGE2 5161 5140 -0.965288 -0.00970978 1.56661 1 0 1 1 0 0 +EDGE2 5161 4780 -0.875877 -0.0443896 -1.60096 1 0 1 1 0 0 +EDGE2 5161 4800 -0.958366 -0.017483 1.53152 1 0 1 1 0 0 +EDGE2 5161 4860 -0.96983 0.0508969 1.57813 1 0 1 1 0 0 +EDGE2 5162 5161 -1.04215 -0.0480071 -0.000129416 1 0 1 1 0 0 +EDGE2 5163 5162 -1.07407 0.0242422 -0.0146226 1 0 1 1 0 0 +EDGE2 5164 5163 -0.928426 0.0386234 -9.72824e-05 1 0 1 1 0 0 +EDGE2 5165 5164 -1.02683 0.0110506 0.0282599 1 0 1 1 0 0 +EDGE2 5166 5165 -1.00518 -0.0517767 1.56864 1 0 1 1 0 0 +EDGE2 5167 5166 -0.974583 -0.0172774 0.00157344 1 0 1 1 0 0 +EDGE2 5168 5167 -0.916429 0.079277 0.0171981 1 0 1 1 0 0 +EDGE2 5169 5168 -1.03737 -0.134899 -0.00607159 1 0 1 1 0 0 +EDGE2 5169 5130 0.961145 -0.00275312 -3.15074 1 0 1 1 0 0 +EDGE2 5170 5169 -0.975366 0.0919874 -0.0212499 1 0 1 1 0 0 +EDGE2 5170 5131 0.0606166 -0.952008 -1.57224 1 0 1 1 0 0 +EDGE2 5170 5130 0.0153932 -0.0428595 -3.16298 1 0 1 1 0 0 +EDGE2 5170 5129 1.07412 -0.046988 -3.11844 1 0 1 1 0 0 +EDGE2 5171 5170 -1.03723 0.0189489 -1.57487 1 0 1 1 0 0 +EDGE2 5171 5130 -1.07524 0.0819259 1.54267 1 0 1 1 0 0 +EDGE2 5172 5171 -1.0244 0.0814761 -0.0142727 1 0 1 1 0 0 +EDGE2 5173 5172 -1.02223 -0.0937396 0.0202301 1 0 1 1 0 0 +EDGE2 5174 5173 -0.861735 0.0494403 0.0152819 1 0 1 1 0 0 +EDGE2 5175 5174 -1.02363 -0.0085307 -0.0336715 1 0 1 1 0 0 +EDGE2 5176 5175 -1.06407 -0.0398364 1.59019 1 0 1 1 0 0 +EDGE2 5177 5176 -1.0061 0.0169038 0.0228449 1 0 1 1 0 0 +EDGE2 5178 5177 -1.00417 0.0986417 -0.00413573 1 0 1 1 0 0 +EDGE2 5179 5178 -0.95293 0.0686691 -0.00848323 1 0 1 1 0 0 +EDGE2 5180 5179 -1.04147 -0.101672 -0.0287542 1 0 1 1 0 0 +EDGE2 5181 5180 -1.10188 -0.0212185 -1.53057 1 0 1 1 0 0 +EDGE2 5182 5181 -0.945918 -0.0416141 0.025342 1 0 1 1 0 0 +EDGE2 5183 5182 -0.967173 0.00389321 0.0174562 1 0 1 1 0 0 +EDGE2 5184 5183 -1.09026 0.0288715 -0.00271052 1 0 1 1 0 0 +EDGE2 5185 5184 -1.00452 -0.0298633 -0.00513144 1 0 1 1 0 0 +EDGE2 5186 5185 -0.911083 0.0510197 -1.55406 1 0 1 1 0 0 +EDGE2 5187 5186 -0.911645 0.0429263 0.0197593 1 0 1 1 0 0 +EDGE2 5188 5187 -1.0625 -0.0549862 0.0161829 1 0 1 1 0 0 +EDGE2 5189 5188 -1.04375 0.0228701 0.0204694 1 0 1 1 0 0 +EDGE2 5190 5189 -0.854254 -0.0539164 -0.0255377 1 0 1 1 0 0 +EDGE2 5191 5190 -1.02076 -0.00948899 -1.56718 1 0 1 1 0 0 +EDGE2 5192 5191 -1.00362 0.0248421 -0.00524435 1 0 1 1 0 0 +EDGE2 5193 5192 -1.02378 0.0570592 -0.0011759 1 0 1 1 0 0 +EDGE2 5194 5193 -0.946311 0.0508309 0.0308019 1 0 1 1 0 0 +EDGE2 5194 5175 1.03206 0.0538954 -3.16201 1 0 1 1 0 0 +EDGE2 5195 5176 -0.00662581 0.988001 1.5483 1 0 1 1 0 0 +EDGE2 5195 5194 -0.981223 0.037443 0.00491859 1 0 1 1 0 0 +EDGE2 5195 5175 0.0266691 -0.0257843 -3.17859 1 0 1 1 0 0 +EDGE2 5195 5174 0.96616 0.0502055 -3.12972 1 0 1 1 0 0 +EDGE2 5196 5176 0.0366671 -0.0372995 0.00393877 1 0 1 1 0 0 +EDGE2 5196 5175 -1.03522 0.00753056 1.56489 1 0 1 1 0 0 +EDGE2 5196 5195 -1.0914 0.043043 -1.56281 1 0 1 1 0 0 +EDGE2 5196 5177 0.971441 0.134174 -0.00457284 1 0 1 1 0 0 +EDGE2 5197 5176 -0.966286 -0.0524098 0.014562 1 0 1 1 0 0 +EDGE2 5197 5196 -1.01158 -0.0265456 -0.0180505 1 0 1 1 0 0 +EDGE2 5197 5178 1.06251 0.0423037 -0.00173158 1 0 1 1 0 0 +EDGE2 5197 5177 0.0131077 -0.0502417 -0.0174664 1 0 1 1 0 0 +EDGE2 5198 5178 -0.00292016 -0.0765866 -0.0398593 1 0 1 1 0 0 +EDGE2 5198 5197 -1.02111 0.0477337 0.0163785 1 0 1 1 0 0 +EDGE2 5198 5177 -1.08787 -0.000229515 0.00460695 1 0 1 1 0 0 +EDGE2 5198 5179 0.93633 0.0359893 0.0156631 1 0 1 1 0 0 +EDGE2 5199 5178 -1.06184 0.0147183 0.00594309 1 0 1 1 0 0 +EDGE2 5199 5198 -1.04022 -0.0716559 -0.00326138 1 0 1 1 0 0 +EDGE2 5199 5179 0.0669607 0.0723308 -0.0198309 1 0 1 1 0 0 +EDGE2 5199 5180 1.13004 -0.0575824 -0.00798029 1 0 1 1 0 0 +EDGE2 5200 5179 -1.02882 -0.0626379 -0.000808032 1 0 1 1 0 0 +EDGE2 5200 5199 -0.964004 -0.0204286 -0.0143679 1 0 1 1 0 0 +EDGE2 5200 5181 0.0192488 1.0569 1.56255 1 0 1 1 0 0 +EDGE2 5200 5180 0.0275052 -0.0950865 -0.0295569 1 0 1 1 0 0 +EDGE2 5201 5181 0.0542938 0.0543862 0.0238917 1 0 1 1 0 0 +EDGE2 5201 5182 1.03579 0.0966671 0.018992 1 0 1 1 0 0 +EDGE2 5201 5180 -1.02623 -0.0650128 -1.5602 1 0 1 1 0 0 +EDGE2 5201 5200 -0.971722 -0.0279358 -1.57865 1 0 1 1 0 0 +EDGE2 5202 5181 -0.97078 -0.00875243 0.0155076 1 0 1 1 0 0 +EDGE2 5202 5182 0.0614017 0.00684165 0.0232545 1 0 1 1 0 0 +EDGE2 5202 5183 1.04971 -0.048803 -0.000450596 1 0 1 1 0 0 +EDGE2 5202 5201 -0.966994 -0.0114732 -0.0079644 1 0 1 1 0 0 +EDGE2 5203 5184 0.94475 -0.00357253 0.020876 1 0 1 1 0 0 +EDGE2 5203 5182 -1.09019 -0.0330181 -0.0157916 1 0 1 1 0 0 +EDGE2 5203 5202 -1.02346 -0.0441566 0.00100821 1 0 1 1 0 0 +EDGE2 5203 5183 -0.0205423 0.147759 0.0111516 1 0 1 1 0 0 +EDGE2 5204 5203 -1.06797 -0.0173812 -0.025988 1 0 1 1 0 0 +EDGE2 5204 5185 1.02297 0.018154 0.00443968 1 0 1 1 0 0 +EDGE2 5204 5184 -0.0932533 0.0210788 0.0217514 1 0 1 1 0 0 +EDGE2 5204 5183 -1.01509 -0.018365 -0.0189706 1 0 1 1 0 0 +EDGE2 5205 5186 -0.0606331 1.00671 1.55706 1 0 1 1 0 0 +EDGE2 5205 5204 -0.985908 -0.0539917 -0.0117193 1 0 1 1 0 0 +EDGE2 5205 5185 0.00975375 -0.0394506 -0.0171568 1 0 1 1 0 0 +EDGE2 5205 5184 -1.13234 0.0147146 -0.00767392 1 0 1 1 0 0 +EDGE2 5206 5187 1.02153 0.0347331 -0.0238151 1 0 1 1 0 0 +EDGE2 5206 5186 0.0493015 0.0169097 0.00578141 1 0 1 1 0 0 +EDGE2 5206 5185 -1.01866 -0.011712 -1.57615 1 0 1 1 0 0 +EDGE2 5206 5205 -0.982737 -0.00709881 -1.58361 1 0 1 1 0 0 +EDGE2 5207 5188 0.948886 -0.0528504 -0.0103704 1 0 1 1 0 0 +EDGE2 5207 5206 -0.96335 0.0174428 -0.00989838 1 0 1 1 0 0 +EDGE2 5207 5187 0.0850454 -0.0213852 0.0136245 1 0 1 1 0 0 +EDGE2 5207 5186 -1.10689 -0.00980235 -0.00795848 1 0 1 1 0 0 +EDGE2 5208 5189 0.898559 0.0415744 0.0169884 1 0 1 1 0 0 +EDGE2 5208 5207 -0.96773 0.00882251 0.0190586 1 0 1 1 0 0 +EDGE2 5208 5188 -0.0643111 -0.118352 -0.00680511 1 0 1 1 0 0 +EDGE2 5208 5187 -0.955008 0.0251501 0.003069 1 0 1 1 0 0 +EDGE2 5209 5190 1.00333 0.0875946 -0.0110707 1 0 1 1 0 0 +EDGE2 5209 5189 0.0174851 -0.0520437 -0.0193361 1 0 1 1 0 0 +EDGE2 5209 5188 -1.01818 -0.0599184 0.0188875 1 0 1 1 0 0 +EDGE2 5209 5208 -0.927969 -0.0677239 -0.00981993 1 0 1 1 0 0 +EDGE2 5210 5190 -0.0235461 -0.0249156 0.00478828 1 0 1 1 0 0 +EDGE2 5210 5191 0.0284555 1.05158 1.57339 1 0 1 1 0 0 +EDGE2 5210 5189 -0.963174 -0.0311129 -0.0231805 1 0 1 1 0 0 +EDGE2 5210 5209 -1.01449 0.0991325 0.00867611 1 0 1 1 0 0 +EDGE2 5211 5190 -0.987139 -0.0156539 -1.5787 1 0 1 1 0 0 +EDGE2 5211 5210 -0.957038 -0.0591214 -1.58923 1 0 1 1 0 0 +EDGE2 5211 5191 0.0131381 0.05787 -0.0118572 1 0 1 1 0 0 +EDGE2 5211 5192 1.00525 0.0111879 0.00563854 1 0 1 1 0 0 +EDGE2 5212 5191 -1.07283 0.0160471 -0.00702741 1 0 1 1 0 0 +EDGE2 5212 5211 -1.00634 -0.0337876 0.00389108 1 0 1 1 0 0 +EDGE2 5212 5192 -0.0071507 -0.0559381 -0.000307697 1 0 1 1 0 0 +EDGE2 5212 5193 0.997195 -0.0268362 0.0524064 1 0 1 1 0 0 +EDGE2 5213 5212 -0.958821 -0.00395347 -0.00178355 1 0 1 1 0 0 +EDGE2 5213 5192 -0.938712 -0.00163511 -0.00671896 1 0 1 1 0 0 +EDGE2 5213 5194 0.927321 0.0441977 -0.0333898 1 0 1 1 0 0 +EDGE2 5213 5193 -0.00740432 -0.0938302 -0.0325346 1 0 1 1 0 0 +EDGE2 5214 5213 -1.0044 0.0815967 -0.0128382 1 0 1 1 0 0 +EDGE2 5214 5194 -0.0826063 0.0816467 0.0242701 1 0 1 1 0 0 +EDGE2 5214 5193 -0.949494 -0.0152967 -0.0272402 1 0 1 1 0 0 +EDGE2 5214 5175 1.01178 -0.00666231 -3.13291 1 0 1 1 0 0 +EDGE2 5214 5195 1.10678 -0.014781 -0.0141799 1 0 1 1 0 0 +EDGE2 5215 5176 0.0122359 0.97068 1.59249 1 0 1 1 0 0 +EDGE2 5215 5194 -0.977878 0.0583002 0.0252796 1 0 1 1 0 0 +EDGE2 5215 5214 -0.914882 -0.0728527 0.0201886 1 0 1 1 0 0 +EDGE2 5215 5175 -0.0067703 -3.90254e-05 -3.1614 1 0 1 1 0 0 +EDGE2 5215 5195 -0.0271788 -0.0516972 0.0106338 1 0 1 1 0 0 +EDGE2 5215 5174 0.953892 -0.038791 -3.15347 1 0 1 1 0 0 +EDGE2 5215 5196 -0.0863497 0.993538 1.59458 1 0 1 1 0 0 +EDGE2 5216 5175 -0.981079 0.0668892 -1.55722 1 0 1 1 0 0 +EDGE2 5216 5195 -0.906928 -0.0344114 1.51506 1 0 1 1 0 0 +EDGE2 5216 5215 -1.07356 -0.0912102 1.57067 1 0 1 1 0 0 +EDGE2 5217 5216 -0.98483 0.0302648 0.0247222 1 0 1 1 0 0 +EDGE2 5218 5217 -1.00747 0.0242603 0.00171085 1 0 1 1 0 0 +EDGE2 5219 5218 -1.0296 0.0595912 -0.0222985 1 0 1 1 0 0 +EDGE2 5220 5219 -1.10199 0.0172813 0.0225013 1 0 1 1 0 0 +EDGE2 5221 5220 -0.955384 -0.111965 -1.58277 1 0 1 1 0 0 +EDGE2 5222 5221 -0.935984 0.0619862 -0.00333844 1 0 1 1 0 0 +EDGE2 5223 5222 -0.944456 -0.058335 -0.0237955 1 0 1 1 0 0 +EDGE2 5224 5223 -0.960416 -0.0442617 -0.026446 1 0 1 1 0 0 +EDGE2 5224 5165 0.931391 -0.0291368 -3.11217 1 0 1 1 0 0 +EDGE2 5225 5224 -0.991433 0.00105435 0.0196626 1 0 1 1 0 0 +EDGE2 5225 5165 -0.0761482 0.0310403 -3.15613 1 0 1 1 0 0 +EDGE2 5225 5164 1.13126 -0.0375956 -3.12362 1 0 1 1 0 0 +EDGE2 5225 5166 0.0419758 0.909795 1.57547 1 0 1 1 0 0 +EDGE2 5226 5165 -0.93563 -0.0058674 -1.55403 1 0 1 1 0 0 +EDGE2 5226 5225 -1.10264 0.0470529 1.55844 1 0 1 1 0 0 +EDGE2 5227 5226 -1.0152 0.103698 -0.024142 1 0 1 1 0 0 +EDGE2 5228 5227 -1.02409 -0.0198583 -0.00191175 1 0 1 1 0 0 +EDGE2 5229 5228 -0.974655 -0.0205378 0.00530741 1 0 1 1 0 0 +EDGE2 5230 5229 -0.948951 0.0186542 0.00437797 1 0 1 1 0 0 +EDGE2 5231 5230 -0.932884 0.0180792 1.57195 1 0 1 1 0 0 +EDGE2 5232 5231 -1.03917 -0.0349972 0.0386043 1 0 1 1 0 0 +EDGE2 5233 5232 -0.990357 0.108004 0.0165197 1 0 1 1 0 0 +EDGE2 5234 5233 -0.966326 0.0186996 -0.0196059 1 0 1 1 0 0 +EDGE2 5235 5234 -1.01935 -0.0150866 -0.020038 1 0 1 1 0 0 +EDGE2 5236 5235 -1.00019 -0.00253026 -1.57617 1 0 1 1 0 0 +EDGE2 5237 5236 -0.994849 -0.00720543 -0.0102224 1 0 1 1 0 0 +EDGE2 5238 5237 -0.914445 0.0271757 0.0174408 1 0 1 1 0 0 +EDGE2 5239 5238 -1.03674 -0.0108946 0.0291422 1 0 1 1 0 0 +EDGE2 5240 5239 -0.921666 -0.03391 -0.0233741 1 0 1 1 0 0 +EDGE2 5241 5240 -1.0963 -0.101712 -1.58152 1 0 1 1 0 0 +EDGE2 5242 5241 -0.996901 -0.073956 0.00972675 1 0 1 1 0 0 +EDGE2 5243 5242 -0.944476 0.00289278 0.027347 1 0 1 1 0 0 +EDGE2 5244 5243 -1.11712 0.0386012 0.00154242 1 0 1 1 0 0 +EDGE2 5245 5244 -0.937568 0.0302108 -0.00388681 1 0 1 1 0 0 +EDGE2 5246 5245 -0.999885 -0.0143379 -1.57737 1 0 1 1 0 0 +EDGE2 5247 5246 -0.967797 -0.0985091 0.00895939 1 0 1 1 0 0 +EDGE2 5248 5247 -1.05457 -0.0154038 0.0329648 1 0 1 1 0 0 +EDGE2 5249 5248 -1.06804 0.0305139 0.000514745 1 0 1 1 0 0 +EDGE2 5249 5230 1.0095 -0.0128368 -3.16548 1 0 1 1 0 0 +EDGE2 5250 5249 -0.978756 -0.0601845 0.00355165 1 0 1 1 0 0 +EDGE2 5250 5229 1.00319 0.0202074 -3.14726 1 0 1 1 0 0 +EDGE2 5250 5230 0.0192818 -0.0423735 -3.1614 1 0 1 1 0 0 +EDGE2 5250 5231 -0.0778879 1.06823 1.5796 1 0 1 1 0 0 +EDGE2 5251 5232 0.977934 0.0869688 0.0338511 1 0 1 1 0 0 +EDGE2 5251 5230 -0.882684 -0.0587845 1.59361 1 0 1 1 0 0 +EDGE2 5251 5250 -1.00689 0.0442253 -1.59296 1 0 1 1 0 0 +EDGE2 5251 5231 -0.0275158 -0.0546864 -0.00957425 1 0 1 1 0 0 +EDGE2 5252 5251 -0.972976 -0.0186851 0.00826426 1 0 1 1 0 0 +EDGE2 5252 5232 0.0324094 -0.0502086 0.00115557 1 0 1 1 0 0 +EDGE2 5252 5233 1.00601 -0.0135867 0.0240597 1 0 1 1 0 0 +EDGE2 5252 5231 -0.961337 0.0514721 -0.0186299 1 0 1 1 0 0 +EDGE2 5253 5234 1.04077 0.00672366 -0.0320702 1 0 1 1 0 0 +EDGE2 5253 5232 -1.06852 0.0172604 0.0025737 1 0 1 1 0 0 +EDGE2 5253 5252 -0.923921 0.0505254 -0.00203058 1 0 1 1 0 0 +EDGE2 5253 5233 0.00708121 0.0318095 -0.0244288 1 0 1 1 0 0 +EDGE2 5254 5253 -1.09224 -0.0251384 -0.0154445 1 0 1 1 0 0 +EDGE2 5254 5235 0.874589 -0.0248458 -0.00889735 1 0 1 1 0 0 +EDGE2 5254 5234 -0.0167774 0.0702159 0.00328586 1 0 1 1 0 0 +EDGE2 5254 5233 -1.03648 0.0487891 0.00549811 1 0 1 1 0 0 +EDGE2 5255 5236 -0.00312236 1.03512 1.58972 1 0 1 1 0 0 +EDGE2 5255 5254 -1.00917 0.064233 -0.0188666 1 0 1 1 0 0 +EDGE2 5255 5235 -0.0811603 0.0242282 -0.00747322 1 0 1 1 0 0 +EDGE2 5255 5234 -0.949695 0.153038 -0.0091953 1 0 1 1 0 0 +EDGE2 5256 5255 -0.97419 0.00633744 1.52272 1 0 1 1 0 0 +EDGE2 5256 5235 -1.06632 -0.0397918 1.55923 1 0 1 1 0 0 +EDGE2 5257 5256 -1.03741 -0.0523688 0.00224676 1 0 1 1 0 0 +EDGE2 5258 5257 -1.01443 0.0545497 0.0171517 1 0 1 1 0 0 +EDGE2 5259 5258 -0.953189 -0.130717 -0.00287124 1 0 1 1 0 0 +EDGE2 5259 5220 1.11032 -0.0453435 -3.13965 1 0 1 1 0 0 +EDGE2 5260 5220 0.0436817 0.0586473 -3.15145 1 0 1 1 0 0 +EDGE2 5260 5259 -0.96796 -0.0737621 0.0514834 1 0 1 1 0 0 +EDGE2 5260 5221 -0.019361 -0.916571 -1.52575 1 0 1 1 0 0 +EDGE2 5260 5219 1.01255 -0.00885836 -3.14541 1 0 1 1 0 0 +EDGE2 5261 5220 -0.999867 0.0568148 -1.59404 1 0 1 1 0 0 +EDGE2 5261 5260 -1.07767 0.128375 1.6035 1 0 1 1 0 0 +EDGE2 5261 5221 -0.00162504 -0.0239701 0.00648769 1 0 1 1 0 0 +EDGE2 5261 5222 0.984658 0.0420337 -0.012616 1 0 1 1 0 0 +EDGE2 5262 5261 -0.995339 0.0622321 -0.0519242 1 0 1 1 0 0 +EDGE2 5262 5221 -1.05114 -0.0118675 -0.0426434 1 0 1 1 0 0 +EDGE2 5262 5222 -0.0162129 0.0493094 -0.0244359 1 0 1 1 0 0 +EDGE2 5262 5223 0.952608 0.0372079 -0.034842 1 0 1 1 0 0 +EDGE2 5263 5222 -1.02807 0.0310602 0.03641 1 0 1 1 0 0 +EDGE2 5263 5262 -0.930828 0.0474441 -0.0189019 1 0 1 1 0 0 +EDGE2 5263 5223 -0.0372303 0.0188325 0.0240755 1 0 1 1 0 0 +EDGE2 5263 5224 1.09198 -0.0819277 -0.0146395 1 0 1 1 0 0 +EDGE2 5264 5263 -1.03621 0.0421873 -0.0196007 1 0 1 1 0 0 +EDGE2 5264 5223 -1.07751 0.0159748 -0.0308295 1 0 1 1 0 0 +EDGE2 5264 5224 0.0297242 -0.0195517 -0.00129233 1 0 1 1 0 0 +EDGE2 5264 5165 1.0135 0.00965875 -3.14704 1 0 1 1 0 0 +EDGE2 5264 5225 0.935684 -0.0300547 -0.00974231 1 0 1 1 0 0 +EDGE2 5265 5226 -0.0482757 -1.03091 -1.55816 1 0 1 1 0 0 +EDGE2 5265 5264 -1.01787 0.0460838 0.0157839 1 0 1 1 0 0 +EDGE2 5265 5224 -1.09166 -0.01108 -0.0173269 1 0 1 1 0 0 +EDGE2 5265 5165 0.0370984 -0.053744 -3.16794 1 0 1 1 0 0 +EDGE2 5265 5225 0.0493168 0.0071806 -0.0107188 1 0 1 1 0 0 +EDGE2 5265 5164 0.956496 -0.0736247 -3.12539 1 0 1 1 0 0 +EDGE2 5265 5166 -0.0441564 0.90879 1.56822 1 0 1 1 0 0 +EDGE2 5266 5165 -1.06536 -0.0583413 1.55476 1 0 1 1 0 0 +EDGE2 5266 5225 -0.974727 0.0172342 -1.55587 1 0 1 1 0 0 +EDGE2 5266 5265 -1.02725 -0.0179078 -1.56564 1 0 1 1 0 0 +EDGE2 5266 5166 -0.0616791 0.0132129 -0.0433674 1 0 1 1 0 0 +EDGE2 5266 5167 0.870122 -0.0332239 0.0113917 1 0 1 1 0 0 +EDGE2 5267 5266 -1.05539 0.0383005 0.00301418 1 0 1 1 0 0 +EDGE2 5267 5166 -1.0444 -0.000306598 -0.00624789 1 0 1 1 0 0 +EDGE2 5267 5167 -0.0487688 0.0149578 -0.0215563 1 0 1 1 0 0 +EDGE2 5267 5168 0.96105 0.0405306 -0.00915463 1 0 1 1 0 0 +EDGE2 5268 5167 -1.04181 0.00930512 0.0207373 1 0 1 1 0 0 +EDGE2 5268 5267 -0.998381 0.0138871 -0.00163632 1 0 1 1 0 0 +EDGE2 5268 5168 0.0589348 -0.0250914 0.000963451 1 0 1 1 0 0 +EDGE2 5268 5169 0.89773 -0.0603219 -0.0114304 1 0 1 1 0 0 +EDGE2 5269 5268 -0.962799 -0.0947609 -0.00806636 1 0 1 1 0 0 +EDGE2 5269 5168 -1.01213 -0.0396488 -0.0534084 1 0 1 1 0 0 +EDGE2 5269 5169 0.0701621 -0.0130195 -0.00464114 1 0 1 1 0 0 +EDGE2 5269 5170 0.955834 0.0877518 -0.0150559 1 0 1 1 0 0 +EDGE2 5269 5130 1.09329 -0.0123659 -3.16469 1 0 1 1 0 0 +EDGE2 5270 5169 -0.976428 0.0237889 0.0181044 1 0 1 1 0 0 +EDGE2 5270 5269 -1.06669 -0.0557434 -0.000302434 1 0 1 1 0 0 +EDGE2 5270 5171 0.0236562 0.988914 1.55031 1 0 1 1 0 0 +EDGE2 5270 5131 -0.0843132 -1.06555 -1.53148 1 0 1 1 0 0 +EDGE2 5270 5170 -0.0483094 -0.00767997 0.0201337 1 0 1 1 0 0 +EDGE2 5270 5130 -0.0446787 0.010847 -3.11885 1 0 1 1 0 0 +EDGE2 5270 5129 0.918002 0.0382848 -3.09864 1 0 1 1 0 0 +EDGE2 5271 5171 -0.0523116 0.0612967 -0.00159425 1 0 1 1 0 0 +EDGE2 5271 5172 0.970623 0.126215 -0.0158151 1 0 1 1 0 0 +EDGE2 5271 5170 -0.956958 -0.0721949 -1.58806 1 0 1 1 0 0 +EDGE2 5271 5270 -0.910023 0.0173067 -1.56549 1 0 1 1 0 0 +EDGE2 5271 5130 -1.02064 -0.016658 1.60007 1 0 1 1 0 0 +EDGE2 5272 5171 -1.01125 -0.00608422 -0.00615324 1 0 1 1 0 0 +EDGE2 5272 5173 1.06039 -0.0342135 -0.00987567 1 0 1 1 0 0 +EDGE2 5272 5172 0.074874 -0.0492731 -0.0227235 1 0 1 1 0 0 +EDGE2 5272 5271 -1.04853 0.0827397 0.0307174 1 0 1 1 0 0 +EDGE2 5273 5174 0.969564 0.0510397 0.00102064 1 0 1 1 0 0 +EDGE2 5273 5173 0.0460285 0.0325059 -0.00480363 1 0 1 1 0 0 +EDGE2 5273 5172 -0.974565 0.000174281 0.0294272 1 0 1 1 0 0 +EDGE2 5273 5272 -1.08616 0.034157 0.00602666 1 0 1 1 0 0 +EDGE2 5274 5175 1.00439 -0.0886061 0.00681784 1 0 1 1 0 0 +EDGE2 5274 5195 1.01287 0.0185412 -3.1539 1 0 1 1 0 0 +EDGE2 5274 5215 0.993245 -0.119419 -3.1338 1 0 1 1 0 0 +EDGE2 5274 5273 -1.02056 -0.0264768 -0.016599 1 0 1 1 0 0 +EDGE2 5274 5174 0.0573336 -0.0179891 0.0297371 1 0 1 1 0 0 +EDGE2 5274 5173 -1.04126 -0.0350605 0.0312748 1 0 1 1 0 0 +EDGE2 5275 5216 -0.0835364 0.923032 1.59184 1 0 1 1 0 0 +EDGE2 5275 5176 0.0244819 -0.974585 -1.60001 1 0 1 1 0 0 +EDGE2 5275 5274 -0.976682 -0.0180059 -0.00909595 1 0 1 1 0 0 +EDGE2 5275 5194 1.07112 -0.00758279 -3.1348 1 0 1 1 0 0 +EDGE2 5275 5214 0.952563 0.028487 -3.12354 1 0 1 1 0 0 +EDGE2 5275 5175 0.0108303 -0.0163266 -0.0214319 1 0 1 1 0 0 +EDGE2 5275 5195 -0.0832148 0.0148979 -3.16384 1 0 1 1 0 0 +EDGE2 5275 5215 0.0971453 -0.0157045 -3.14954 1 0 1 1 0 0 +EDGE2 5275 5174 -0.959438 -0.0654266 -0.016263 1 0 1 1 0 0 +EDGE2 5275 5196 0.0048923 -0.975609 -1.57446 1 0 1 1 0 0 +EDGE2 5276 5217 0.994944 0.0870754 -0.0399542 1 0 1 1 0 0 +EDGE2 5276 5216 -0.00634293 0.137015 -0.0185917 1 0 1 1 0 0 +EDGE2 5276 5275 -0.999718 0.029051 -1.57399 1 0 1 1 0 0 +EDGE2 5276 5175 -1.00064 0.000973754 -1.57677 1 0 1 1 0 0 +EDGE2 5276 5195 -0.947528 -0.0652914 1.57992 1 0 1 1 0 0 +EDGE2 5276 5215 -1.06973 -0.0225852 1.56966 1 0 1 1 0 0 +EDGE2 5277 5218 1.03834 -0.00448509 0.0171063 1 0 1 1 0 0 +EDGE2 5277 5217 0.0363476 0.0192764 -0.0289605 1 0 1 1 0 0 +EDGE2 5277 5216 -1.03306 0.00699196 0.0248509 1 0 1 1 0 0 +EDGE2 5277 5276 -1.00887 0.00347833 0.0171831 1 0 1 1 0 0 +EDGE2 5278 5219 0.925676 -0.00408402 -0.0153546 1 0 1 1 0 0 +EDGE2 5278 5218 -0.0314081 0.021074 0.026605 1 0 1 1 0 0 +EDGE2 5278 5217 -1.07465 -0.0184719 -0.00308941 1 0 1 1 0 0 +EDGE2 5278 5277 -0.962797 -0.0166595 0.0172564 1 0 1 1 0 0 +EDGE2 5279 5220 1.20702 -0.0149067 0.00702275 1 0 1 1 0 0 +EDGE2 5279 5260 1.03767 0.0169071 -3.15915 1 0 1 1 0 0 +EDGE2 5279 5219 -0.022588 -0.00934807 0.00588211 1 0 1 1 0 0 +EDGE2 5279 5218 -1.08902 0.149875 -0.00775319 1 0 1 1 0 0 +EDGE2 5279 5278 -1.02762 0.0382329 -0.0284359 1 0 1 1 0 0 +EDGE2 5280 5220 0.0837293 -0.0308631 -0.00522486 1 0 1 1 0 0 +EDGE2 5280 5259 1.02704 0.000282687 -3.14583 1 0 1 1 0 0 +EDGE2 5280 5260 -0.0248512 0.00756492 -3.116 1 0 1 1 0 0 +EDGE2 5280 5261 0.0190713 0.973867 1.58048 1 0 1 1 0 0 +EDGE2 5280 5221 -0.0129371 0.970316 1.58753 1 0 1 1 0 0 +EDGE2 5280 5219 -1.08638 -0.0245012 0.00953126 1 0 1 1 0 0 +EDGE2 5280 5279 -0.972892 0.0330508 -0.0102304 1 0 1 1 0 0 +EDGE2 5281 5220 -0.993238 -0.00401917 -1.56656 1 0 1 1 0 0 +EDGE2 5281 5280 -1.11079 0.0134405 -1.54725 1 0 1 1 0 0 +EDGE2 5281 5260 -1.0288 -0.0071675 1.50096 1 0 1 1 0 0 +EDGE2 5281 5261 -0.0163213 0.0147077 -0.0108381 1 0 1 1 0 0 +EDGE2 5281 5221 -0.052989 0.0584767 0.0237362 1 0 1 1 0 0 +EDGE2 5281 5222 0.956563 0.00462349 -0.0136076 1 0 1 1 0 0 +EDGE2 5281 5262 0.906748 -0.0757325 -0.00156525 1 0 1 1 0 0 +EDGE2 5282 5263 1.03491 -0.0389339 0.0141854 1 0 1 1 0 0 +EDGE2 5282 5261 -0.896334 0.0176 0.00501709 1 0 1 1 0 0 +EDGE2 5282 5281 -0.991893 -0.0197961 0.0318406 1 0 1 1 0 0 +EDGE2 5282 5221 -0.968239 -0.0562816 0.0123911 1 0 1 1 0 0 +EDGE2 5282 5222 -0.0386999 0.0286716 0.00979355 1 0 1 1 0 0 +EDGE2 5282 5262 0.00442173 0.0392464 0.00196058 1 0 1 1 0 0 +EDGE2 5282 5223 1.00347 -0.071979 0.0228008 1 0 1 1 0 0 +EDGE2 5283 5263 -0.0156642 -0.0215719 0.019829 1 0 1 1 0 0 +EDGE2 5283 5282 -0.942406 -0.0875394 -0.0100938 1 0 1 1 0 0 +EDGE2 5283 5222 -1.04356 0.0912952 6.30635e-05 1 0 1 1 0 0 +EDGE2 5283 5262 -1.01828 0.0798299 0.00899754 1 0 1 1 0 0 +EDGE2 5283 5264 0.960922 -0.00375242 0.00580197 1 0 1 1 0 0 +EDGE2 5283 5223 -0.0553515 -0.0475609 -0.0146218 1 0 1 1 0 0 +EDGE2 5283 5224 0.93014 -0.0545948 -0.0221283 1 0 1 1 0 0 +EDGE2 5284 5263 -0.941615 0.00594896 -0.0295433 1 0 1 1 0 0 +EDGE2 5284 5283 -0.934318 0.0917844 -0.00507376 1 0 1 1 0 0 +EDGE2 5284 5264 -0.0418843 0.0930527 0.00440672 1 0 1 1 0 0 +EDGE2 5284 5223 -0.967758 0.0907141 -0.0254474 1 0 1 1 0 0 +EDGE2 5284 5224 0.0120795 -0.00471147 0.01048 1 0 1 1 0 0 +EDGE2 5284 5165 0.973669 -0.0183494 -3.16897 1 0 1 1 0 0 +EDGE2 5284 5225 0.934061 0.028335 0.0114501 1 0 1 1 0 0 +EDGE2 5284 5265 0.987078 0.00901437 -0.0520362 1 0 1 1 0 0 +EDGE2 5285 5226 -0.0324754 -1.02941 -1.57205 1 0 1 1 0 0 +EDGE2 5285 5264 -0.998613 -0.01036 0.0131137 1 0 1 1 0 0 +EDGE2 5285 5284 -1.03751 -0.00146734 -0.00829745 1 0 1 1 0 0 +EDGE2 5285 5224 -0.957569 0.0158794 0.0222437 1 0 1 1 0 0 +EDGE2 5285 5165 -0.0154935 0.0229327 -3.17357 1 0 1 1 0 0 +EDGE2 5285 5225 0.014764 0.0936308 0.0227322 1 0 1 1 0 0 +EDGE2 5285 5265 0.0124336 -0.00169602 -0.0128935 1 0 1 1 0 0 +EDGE2 5285 5164 1.03167 0.00981277 -3.1196 1 0 1 1 0 0 +EDGE2 5285 5266 0.0230961 0.976169 1.5811 1 0 1 1 0 0 +EDGE2 5285 5166 0.0250901 0.928558 1.60619 1 0 1 1 0 0 +EDGE2 5286 5285 -0.946208 0.0869951 -1.58288 1 0 1 1 0 0 +EDGE2 5286 5165 -0.951367 -0.0720927 1.5663 1 0 1 1 0 0 +EDGE2 5286 5225 -1.07331 -0.00783602 -1.55329 1 0 1 1 0 0 +EDGE2 5286 5265 -1.01001 0.0479768 -1.57031 1 0 1 1 0 0 +EDGE2 5286 5266 -0.00463405 -0.0535579 -0.00784849 1 0 1 1 0 0 +EDGE2 5286 5166 -0.00482095 -0.0672182 0.0127381 1 0 1 1 0 0 +EDGE2 5286 5167 0.933708 0.0418191 -0.00633177 1 0 1 1 0 0 +EDGE2 5286 5267 0.934823 0.015716 -0.008712 1 0 1 1 0 0 +EDGE2 5287 5266 -0.967388 0.0264471 0.0499241 1 0 1 1 0 0 +EDGE2 5287 5286 -1.02037 -0.00497862 -0.00771676 1 0 1 1 0 0 +EDGE2 5287 5166 -1.00872 -0.0180399 -0.0130955 1 0 1 1 0 0 +EDGE2 5287 5268 0.929144 -0.0867676 -0.0148661 1 0 1 1 0 0 +EDGE2 5287 5167 -0.0351356 0.0437639 -0.0101371 1 0 1 1 0 0 +EDGE2 5287 5267 -0.0184141 0.114157 0.0181815 1 0 1 1 0 0 +EDGE2 5287 5168 0.975009 -0.0422323 -0.0125027 1 0 1 1 0 0 +EDGE2 5288 5268 -0.0579479 -0.0379741 -0.0215644 1 0 1 1 0 0 +EDGE2 5288 5167 -1.06453 0.00663123 -0.00637823 1 0 1 1 0 0 +EDGE2 5288 5287 -0.96099 0.0422807 -0.011935 1 0 1 1 0 0 +EDGE2 5288 5267 -1.00492 -0.0594187 0.0189809 1 0 1 1 0 0 +EDGE2 5288 5168 -0.192537 0.112706 -0.00238694 1 0 1 1 0 0 +EDGE2 5288 5169 1.06871 0.0514954 0.0363875 1 0 1 1 0 0 +EDGE2 5288 5269 1.00999 -0.0359508 0.0470504 1 0 1 1 0 0 +EDGE2 5289 5268 -1.01838 -0.0833903 -0.00532567 1 0 1 1 0 0 +EDGE2 5289 5288 -1.09449 -0.0155047 -0.0171105 1 0 1 1 0 0 +EDGE2 5289 5168 -0.980468 -0.0302187 -0.0144216 1 0 1 1 0 0 +EDGE2 5289 5169 0.0502144 0.00106465 0.0219247 1 0 1 1 0 0 +EDGE2 5289 5269 -0.0251716 0.0247587 0.00572637 1 0 1 1 0 0 +EDGE2 5289 5170 1.04533 0.0341853 0.00169837 1 0 1 1 0 0 +EDGE2 5289 5270 0.955066 0.0777918 -0.0217774 1 0 1 1 0 0 +EDGE2 5289 5130 1.02813 0.0117849 -3.12853 1 0 1 1 0 0 +EDGE2 5290 5289 -1.04795 0.00384439 0.020853 1 0 1 1 0 0 +EDGE2 5290 5169 -1.01455 -0.013152 -0.00703142 1 0 1 1 0 0 +EDGE2 5290 5269 -0.981139 -0.0595979 0.0351794 1 0 1 1 0 0 +EDGE2 5290 5171 0.0002603 1.02014 1.57092 1 0 1 1 0 0 +EDGE2 5290 5271 -0.00128367 1.01965 1.56585 1 0 1 1 0 0 +EDGE2 5290 5131 0.0506013 -1.07126 -1.55997 1 0 1 1 0 0 +EDGE2 5290 5170 -0.029201 0.0354688 -0.00734281 1 0 1 1 0 0 +EDGE2 5290 5270 -0.0433179 0.040409 -0.0188361 1 0 1 1 0 0 +EDGE2 5290 5130 0.031132 0.0556405 -3.13211 1 0 1 1 0 0 +EDGE2 5290 5129 0.994178 0.00661647 -3.13869 1 0 1 1 0 0 +EDGE2 5291 5171 -0.04482 0.0126678 -0.0148141 1 0 1 1 0 0 +EDGE2 5291 5172 1.01347 0.0706796 -0.0201139 1 0 1 1 0 0 +EDGE2 5291 5272 0.963343 -0.00324246 0.0141349 1 0 1 1 0 0 +EDGE2 5291 5271 -0.032489 -0.0305785 0.00412675 1 0 1 1 0 0 +EDGE2 5291 5170 -0.947625 0.0400577 -1.5674 1 0 1 1 0 0 +EDGE2 5291 5270 -1.00927 -0.00591751 -1.56334 1 0 1 1 0 0 +EDGE2 5291 5290 -0.986962 -0.0931349 -1.53378 1 0 1 1 0 0 +EDGE2 5291 5130 -1.00425 0.0794753 1.56815 1 0 1 1 0 0 +EDGE2 5292 5171 -1.05544 -0.0110502 -0.0104543 1 0 1 1 0 0 +EDGE2 5292 5273 0.983061 0.00443468 -0.0086214 1 0 1 1 0 0 +EDGE2 5292 5173 1.02475 -0.0151293 0.020037 1 0 1 1 0 0 +EDGE2 5292 5291 -0.943079 0.0742874 -0.0185924 1 0 1 1 0 0 +EDGE2 5292 5172 -0.0681249 -0.0352345 -0.0350438 1 0 1 1 0 0 +EDGE2 5292 5272 0.0145029 -0.0434153 0.0231095 1 0 1 1 0 0 +EDGE2 5292 5271 -1.08834 -0.0179437 0.021635 1 0 1 1 0 0 +EDGE2 5293 5274 1.04639 0.124943 0.0157935 1 0 1 1 0 0 +EDGE2 5293 5292 -1.03401 -0.0436092 -0.0111232 1 0 1 1 0 0 +EDGE2 5293 5273 -0.0485782 -0.0269797 -0.0338919 1 0 1 1 0 0 +EDGE2 5293 5174 1.02039 -0.0727471 0.00381499 1 0 1 1 0 0 +EDGE2 5293 5173 -0.0748908 -0.000643224 0.0138314 1 0 1 1 0 0 +EDGE2 5293 5172 -0.986684 -0.0975214 -0.00310348 1 0 1 1 0 0 +EDGE2 5293 5272 -0.957103 -0.0559769 -0.00639172 1 0 1 1 0 0 +EDGE2 5294 5274 -0.0138599 0.0122823 -0.00549892 1 0 1 1 0 0 +EDGE2 5294 5275 0.990153 -0.00338779 0.0271387 1 0 1 1 0 0 +EDGE2 5294 5175 1.00177 0.0174884 -0.00173733 1 0 1 1 0 0 +EDGE2 5294 5195 0.935899 0.0231774 -3.15125 1 0 1 1 0 0 +EDGE2 5294 5215 0.946079 -0.0603096 -3.14109 1 0 1 1 0 0 +EDGE2 5294 5273 -1.00392 -0.0344652 -0.00621775 1 0 1 1 0 0 +EDGE2 5294 5293 -1.01261 -0.0734278 -0.0155144 1 0 1 1 0 0 +EDGE2 5294 5174 0.0253978 -0.0812525 0.00809766 1 0 1 1 0 0 +EDGE2 5294 5173 -0.976667 -0.0930385 0.00661363 1 0 1 1 0 0 +EDGE2 5295 5216 0.052537 1.04156 1.54577 1 0 1 1 0 0 +EDGE2 5295 5276 0.00266308 1.06101 1.57798 1 0 1 1 0 0 +EDGE2 5295 5176 -0.0430091 -0.881269 -1.60538 1 0 1 1 0 0 +EDGE2 5295 5274 -1.04408 0.00854891 0.00996136 1 0 1 1 0 0 +EDGE2 5295 5275 0.000416704 -0.0352035 -0.00283134 1 0 1 1 0 0 +EDGE2 5295 5194 1.007 0.00828869 -3.13969 1 0 1 1 0 0 +EDGE2 5295 5214 0.929543 -0.121502 -3.16154 1 0 1 1 0 0 +EDGE2 5295 5175 -0.0447413 -0.106901 0.000229589 1 0 1 1 0 0 +EDGE2 5295 5195 -0.0155267 -0.0426131 -3.14783 1 0 1 1 0 0 +EDGE2 5295 5215 -0.0747928 0.0124793 -3.12329 1 0 1 1 0 0 +EDGE2 5295 5294 -1.04028 -0.0380039 -0.00416697 1 0 1 1 0 0 +EDGE2 5295 5174 -1.05722 0.0403389 0.0220277 1 0 1 1 0 0 +EDGE2 5295 5196 0.0466087 -0.922206 -1.60988 1 0 1 1 0 0 +EDGE2 5296 5217 0.897547 0.0814138 0.0229903 1 0 1 1 0 0 +EDGE2 5296 5277 1.0077 -0.0777914 -0.0152586 1 0 1 1 0 0 +EDGE2 5296 5216 0.0660189 -0.0177427 -0.0103862 1 0 1 1 0 0 +EDGE2 5296 5276 -0.0602193 0.0162932 0.00372514 1 0 1 1 0 0 +EDGE2 5296 5275 -1.00778 -0.0373502 -1.58607 1 0 1 1 0 0 +EDGE2 5296 5295 -1.02703 0.0409659 -1.60112 1 0 1 1 0 0 +EDGE2 5296 5175 -1.02614 0.134322 -1.58906 1 0 1 1 0 0 +EDGE2 5296 5195 -0.965328 0.00833199 1.59748 1 0 1 1 0 0 +EDGE2 5296 5215 -1.05657 -0.0302012 1.5437 1 0 1 1 0 0 +EDGE2 5297 5218 0.958955 0.0287936 0.0118859 1 0 1 1 0 0 +EDGE2 5297 5278 0.997478 0.0154309 -0.0115558 1 0 1 1 0 0 +EDGE2 5297 5217 0.0221513 -0.0672715 0.00342814 1 0 1 1 0 0 +EDGE2 5297 5277 0.0294225 -0.0427065 -0.0156915 1 0 1 1 0 0 +EDGE2 5297 5216 -1.03528 -3.40414e-05 -0.0123458 1 0 1 1 0 0 +EDGE2 5297 5276 -1.05457 -0.0580576 -0.00993886 1 0 1 1 0 0 +EDGE2 5297 5296 -1.04724 -0.0469315 0.00635838 1 0 1 1 0 0 +EDGE2 5298 5219 0.986359 0.0231643 -0.0172092 1 0 1 1 0 0 +EDGE2 5298 5279 1.07224 0.0268974 -0.0295497 1 0 1 1 0 0 +EDGE2 5298 5218 0.014509 -0.0652895 0.0211649 1 0 1 1 0 0 +EDGE2 5298 5278 0.0174009 -0.0628808 0.0252625 1 0 1 1 0 0 +EDGE2 5298 5217 -0.98215 0.0616274 -0.0100462 1 0 1 1 0 0 +EDGE2 5298 5277 -0.949789 -0.0133599 0.011692 1 0 1 1 0 0 +EDGE2 5298 5297 -0.974797 0.0458182 0.00980108 1 0 1 1 0 0 +EDGE2 5299 5220 0.956338 -0.00337008 -0.0298346 1 0 1 1 0 0 +EDGE2 5299 5280 1.06859 0.0431163 -0.0135999 1 0 1 1 0 0 +EDGE2 5299 5260 1.02579 0.00147723 -3.11928 1 0 1 1 0 0 +EDGE2 5299 5298 -1.05583 0.035942 0.0182898 1 0 1 1 0 0 +EDGE2 5299 5219 0.0746721 0.00443314 0.00845145 1 0 1 1 0 0 +EDGE2 5299 5279 -0.00866502 0.00131107 0.000649231 1 0 1 1 0 0 +EDGE2 5299 5218 -0.912234 0.0659722 -0.0170015 1 0 1 1 0 0 +EDGE2 5299 5278 -0.96088 -0.0860769 0.0029009 1 0 1 1 0 0 +EDGE2 5300 5220 -0.0132146 -0.00167555 0.0212818 1 0 1 1 0 0 +EDGE2 5300 5259 1.00642 -0.0218646 -3.17492 1 0 1 1 0 0 +EDGE2 5300 5280 -0.00107753 0.00831562 0.00905191 1 0 1 1 0 0 +EDGE2 5300 5260 0.0442849 -0.000674288 -3.11947 1 0 1 1 0 0 +EDGE2 5300 5261 0.0175626 0.995146 1.5434 1 0 1 1 0 0 +EDGE2 5300 5281 -0.0407454 0.978064 1.5691 1 0 1 1 0 0 +EDGE2 5300 5221 -0.0989003 1.00963 1.57908 1 0 1 1 0 0 +EDGE2 5300 5219 -1.03908 -0.00707621 0.0137937 1 0 1 1 0 0 +EDGE2 5300 5279 -0.951099 0.0652219 0.00156437 1 0 1 1 0 0 +EDGE2 5300 5299 -1.01891 0.0245933 0.012854 1 0 1 1 0 0 +EDGE2 5301 5220 -0.969259 0.000230363 1.58675 1 0 1 1 0 0 +EDGE2 5301 5280 -1.00685 -0.0182223 1.584 1 0 1 1 0 0 +EDGE2 5301 5300 -1.00154 0.0339899 1.57318 1 0 1 1 0 0 +EDGE2 5301 5260 -1.07899 0.106621 -1.55384 1 0 1 1 0 0 +EDGE2 5302 5301 -1.08826 -0.0497139 -0.00862183 1 0 1 1 0 0 +EDGE2 5303 5302 -1.04643 -0.0408984 -0.0377279 1 0 1 1 0 0 +EDGE2 5304 5303 -0.95925 0.0271785 -0.0136847 1 0 1 1 0 0 +EDGE2 5305 5304 -1.0047 0.00365805 0.0175622 1 0 1 1 0 0 +EDGE2 5306 5305 -1.00085 0.00972585 -1.5817 1 0 1 1 0 0 +EDGE2 5307 5306 -1.03316 0.00355143 -0.00808913 1 0 1 1 0 0 +EDGE2 5308 5307 -0.98276 0.00358443 0.0238656 1 0 1 1 0 0 +EDGE2 5309 5308 -0.901166 0.0117655 -0.044529 1 0 1 1 0 0 +EDGE2 5310 5309 -1.01307 0.0894427 0.00909529 1 0 1 1 0 0 +EDGE2 5311 5310 -0.941743 0.065672 -1.56327 1 0 1 1 0 0 +EDGE2 5312 5311 -0.916795 -0.0207715 0.00633645 1 0 1 1 0 0 +EDGE2 5313 5312 -0.960575 0.0163333 0.00361385 1 0 1 1 0 0 +EDGE2 5314 5313 -1.02207 0.00295707 -0.0198707 1 0 1 1 0 0 +EDGE2 5314 5255 1.02904 -0.0478483 -3.13166 1 0 1 1 0 0 +EDGE2 5314 5235 0.958063 -0.0699168 -3.15048 1 0 1 1 0 0 +EDGE2 5315 5236 -0.0334773 -1.00333 -1.59187 1 0 1 1 0 0 +EDGE2 5315 5314 -0.98921 0.11217 0.0237346 1 0 1 1 0 0 +EDGE2 5315 5255 0.00765215 0.0795573 -3.15736 1 0 1 1 0 0 +EDGE2 5315 5254 1.013 0.00462199 -3.13148 1 0 1 1 0 0 +EDGE2 5315 5235 -0.0128917 -0.00471703 -3.17383 1 0 1 1 0 0 +EDGE2 5315 5234 1.05685 0.00923175 -3.18686 1 0 1 1 0 0 +EDGE2 5315 5256 -0.0253961 1.05931 1.49752 1 0 1 1 0 0 +EDGE2 5316 5236 -0.0762093 0.013318 -0.0154867 1 0 1 1 0 0 +EDGE2 5316 5237 1.04259 0.0100835 -0.00776577 1 0 1 1 0 0 +EDGE2 5316 5255 -0.954302 0.0512556 -1.5699 1 0 1 1 0 0 +EDGE2 5316 5315 -1.05671 0.0220923 1.56921 1 0 1 1 0 0 +EDGE2 5316 5235 -1.07951 0.0266402 -1.57945 1 0 1 1 0 0 +EDGE2 5317 5236 -0.941548 -0.0839545 0.0534792 1 0 1 1 0 0 +EDGE2 5317 5237 -0.0860831 -0.0357087 -0.0322797 1 0 1 1 0 0 +EDGE2 5317 5238 0.915367 0.043896 0.00194299 1 0 1 1 0 0 +EDGE2 5317 5316 -1.00145 -0.0112875 0.0329506 1 0 1 1 0 0 +EDGE2 5318 5239 1.06294 0.0405817 0.0368701 1 0 1 1 0 0 +EDGE2 5318 5237 -0.984239 -0.0705397 -0.0145437 1 0 1 1 0 0 +EDGE2 5318 5317 -0.974912 0.0118217 -0.0228733 1 0 1 1 0 0 +EDGE2 5318 5238 -0.0166649 -0.0279513 -0.00041243 1 0 1 1 0 0 +EDGE2 5319 5318 -0.946272 0.0761549 -0.0226261 1 0 1 1 0 0 +EDGE2 5319 5240 0.904357 -0.0198238 -0.0178528 1 0 1 1 0 0 +EDGE2 5319 5239 0.0613887 -0.0113521 0.00821927 1 0 1 1 0 0 +EDGE2 5319 5238 -1.02369 -0.0806609 0.0109208 1 0 1 1 0 0 +EDGE2 5320 5240 -0.0204051 0.0546917 -0.0105482 1 0 1 1 0 0 +EDGE2 5320 5241 -0.0422343 0.930916 1.60331 1 0 1 1 0 0 +EDGE2 5320 5319 -1.01087 -0.0319532 -0.0174899 1 0 1 1 0 0 +EDGE2 5320 5239 -1.01651 0.0142361 -0.0517989 1 0 1 1 0 0 +EDGE2 5321 5240 -1.005 -0.0179295 -1.5536 1 0 1 1 0 0 +EDGE2 5321 5320 -1.0328 0.132203 -1.59889 1 0 1 1 0 0 +EDGE2 5321 5241 0.023602 -0.00828274 0.000644092 1 0 1 1 0 0 +EDGE2 5321 5242 0.931881 -0.0440284 0.00279564 1 0 1 1 0 0 +EDGE2 5322 5243 1.00573 -0.0554428 -0.00591267 1 0 1 1 0 0 +EDGE2 5322 5321 -0.9729 0.0103311 0.0496861 1 0 1 1 0 0 +EDGE2 5322 5241 -0.999313 -0.0506019 0.0255908 1 0 1 1 0 0 +EDGE2 5322 5242 -0.0160215 0.0756934 -0.00335335 1 0 1 1 0 0 +EDGE2 5323 5243 0.0372108 -0.0238561 0.00996751 1 0 1 1 0 0 +EDGE2 5323 5322 -0.905069 -0.0280504 -0.0016148 1 0 1 1 0 0 +EDGE2 5323 5242 -0.924014 0.107455 -0.00186156 1 0 1 1 0 0 +EDGE2 5323 5244 1.00668 0.0258123 -0.00462616 1 0 1 1 0 0 +EDGE2 5324 5243 -1.04135 -0.0574657 -0.014049 1 0 1 1 0 0 +EDGE2 5324 5323 -1.01794 0.091577 -0.0254457 1 0 1 1 0 0 +EDGE2 5324 5245 1.02729 0.026756 0.000279341 1 0 1 1 0 0 +EDGE2 5324 5244 0.0424123 0.0239222 0.00323396 1 0 1 1 0 0 +EDGE2 5325 5324 -1.0184 0.0911367 -0.0137709 1 0 1 1 0 0 +EDGE2 5325 5245 0.034348 0.0269639 0.00869601 1 0 1 1 0 0 +EDGE2 5325 5244 -0.997746 -0.0381603 0.00970609 1 0 1 1 0 0 +EDGE2 5325 5246 0.0135052 0.9946 1.53372 1 0 1 1 0 0 +EDGE2 5326 5245 -0.986984 -0.0218368 1.5408 1 0 1 1 0 0 +EDGE2 5326 5325 -1.06348 0.133387 1.59619 1 0 1 1 0 0 +EDGE2 5327 5326 -1.01516 0.037274 -0.0408232 1 0 1 1 0 0 +EDGE2 5328 5327 -0.990448 -0.0275639 0.00474961 1 0 1 1 0 0 +EDGE2 5329 1910 0.999308 0.0431642 -3.13903 1 0 1 1 0 0 +EDGE2 5329 1330 1.07127 -0.0153202 -3.16669 1 0 1 1 0 0 +EDGE2 5329 1350 0.994245 0.0610553 -3.16007 1 0 1 1 0 0 +EDGE2 5329 1490 1.01311 0.0384672 -3.14311 1 0 1 1 0 0 +EDGE2 5329 5328 -0.980368 0.0371505 -0.0160677 1 0 1 1 0 0 +EDGE2 5330 1349 0.997537 -0.0026712 -3.13306 1 0 1 1 0 0 +EDGE2 5330 1489 0.956211 0.00828127 -3.10258 1 0 1 1 0 0 +EDGE2 5330 1909 1.0531 0.0740382 -3.1344 1 0 1 1 0 0 +EDGE2 5330 1329 0.903457 0.0318104 -3.13543 1 0 1 1 0 0 +EDGE2 5330 1910 0.00448625 -0.00445013 -3.12924 1 0 1 1 0 0 +EDGE2 5330 1911 0.113369 -1.03901 -1.54444 1 0 1 1 0 0 +EDGE2 5330 1331 0.0864798 -0.995531 -1.57349 1 0 1 1 0 0 +EDGE2 5330 1351 -0.00955358 -1.0248 -1.54384 1 0 1 1 0 0 +EDGE2 5330 1491 0.0510907 -1.04268 -1.55011 1 0 1 1 0 0 +EDGE2 5330 1330 -0.0252774 0.039617 -3.15416 1 0 1 1 0 0 +EDGE2 5330 1350 0.00164225 -0.0260647 -3.16094 1 0 1 1 0 0 +EDGE2 5330 1490 -0.0621053 -0.0880664 -3.14335 1 0 1 1 0 0 +EDGE2 5330 5329 -1.04057 0.0174281 -0.00928409 1 0 1 1 0 0 +EDGE2 5331 1910 -1.02616 -0.00182263 1.56247 1 0 1 1 0 0 +EDGE2 5331 5330 -1.08991 -0.0256593 -1.57573 1 0 1 1 0 0 +EDGE2 5331 1330 -1.05857 0.0844348 1.52405 1 0 1 1 0 0 +EDGE2 5331 1350 -1.01481 -0.00234021 1.5565 1 0 1 1 0 0 +EDGE2 5331 1490 -1.02023 -0.0109444 1.57674 1 0 1 1 0 0 +EDGE2 5332 5331 -0.93148 -0.0358083 -0.0159841 1 0 1 1 0 0 +EDGE2 5333 5332 -1.06039 -0.0186277 -7.00056e-05 1 0 1 1 0 0 +EDGE2 5334 1635 1.05415 0.00369216 -3.15072 1 0 1 1 0 0 +EDGE2 5334 5333 -0.943348 0.05508 0.026144 1 0 1 1 0 0 +EDGE2 5334 1315 1.0738 0.0161018 -3.15251 1 0 1 1 0 0 +EDGE2 5334 1615 1.06284 -0.024835 -3.14622 1 0 1 1 0 0 +EDGE2 5335 1635 -0.0683872 -0.0204839 -3.113 1 0 1 1 0 0 +EDGE2 5335 1316 0.0692671 -0.966159 -1.56588 1 0 1 1 0 0 +EDGE2 5335 1616 -0.000201982 -1.05134 -1.58147 1 0 1 1 0 0 +EDGE2 5335 1636 -0.112021 -1.01152 -1.54477 1 0 1 1 0 0 +EDGE2 5335 5334 -1.06017 0.053949 -0.0441173 1 0 1 1 0 0 +EDGE2 5335 1314 0.950391 -0.0335586 -3.15485 1 0 1 1 0 0 +EDGE2 5335 1634 1.02023 -0.0318021 -3.13112 1 0 1 1 0 0 +EDGE2 5335 1315 -0.00372276 0.0206586 -3.14892 1 0 1 1 0 0 +EDGE2 5335 1615 -0.000596462 -0.0140074 -3.15424 1 0 1 1 0 0 +EDGE2 5335 1614 0.950453 0.0248798 -3.15463 1 0 1 1 0 0 +EDGE2 5336 1635 -0.989259 -0.000187726 -1.57349 1 0 1 1 0 0 +EDGE2 5336 1617 0.946983 -0.0101413 -0.00966061 1 0 1 1 0 0 +EDGE2 5336 1637 0.985402 -0.0439561 0.00941268 1 0 1 1 0 0 +EDGE2 5336 1317 0.982917 0.0446724 -0.0235493 1 0 1 1 0 0 +EDGE2 5336 1316 0.0615275 0.0317691 0.00765151 1 0 1 1 0 0 +EDGE2 5336 1616 0.0600927 -0.00185432 -0.012832 1 0 1 1 0 0 +EDGE2 5336 1636 0.00632973 -0.0404423 -0.0181195 1 0 1 1 0 0 +EDGE2 5336 5335 -0.978387 0.0463665 1.59415 1 0 1 1 0 0 +EDGE2 5336 1315 -1.00171 -0.0332163 -1.59847 1 0 1 1 0 0 +EDGE2 5336 1615 -1.01173 -0.0658039 -1.57477 1 0 1 1 0 0 +EDGE2 5337 1618 0.948119 0.0319055 0.00851161 1 0 1 1 0 0 +EDGE2 5337 1638 0.983868 0.0329978 -0.0125589 1 0 1 1 0 0 +EDGE2 5337 1318 1.05149 -0.0665652 -0.00932536 1 0 1 1 0 0 +EDGE2 5337 1617 0.0609896 -0.033293 -0.0133172 1 0 1 1 0 0 +EDGE2 5337 1637 0.0787266 -0.0181946 0.0140834 1 0 1 1 0 0 +EDGE2 5337 1317 -0.0174376 0.0184843 0.0156772 1 0 1 1 0 0 +EDGE2 5337 5336 -1.03358 0.0351136 -0.029907 1 0 1 1 0 0 +EDGE2 5337 1316 -1.03974 0.0777453 0.018749 1 0 1 1 0 0 +EDGE2 5337 1616 -0.983087 -0.0129673 0.00748904 1 0 1 1 0 0 +EDGE2 5337 1636 -0.947593 0.0320075 -0.0306655 1 0 1 1 0 0 +EDGE2 5338 1619 0.933327 0.0608781 0.00930178 1 0 1 1 0 0 +EDGE2 5338 1639 1.00217 -0.020605 -0.0125485 1 0 1 1 0 0 +EDGE2 5338 1319 1.02876 -0.0350389 -0.00210598 1 0 1 1 0 0 +EDGE2 5338 1618 0.105714 0.0267335 0.00537998 1 0 1 1 0 0 +EDGE2 5338 1638 -0.045821 -0.043719 0.0110256 1 0 1 1 0 0 +EDGE2 5338 1318 -0.00942368 -0.0242603 0.00566078 1 0 1 1 0 0 +EDGE2 5338 1617 -0.906343 0.0725028 -0.00489901 1 0 1 1 0 0 +EDGE2 5338 1637 -0.944318 -0.0185206 0.00211668 1 0 1 1 0 0 +EDGE2 5338 5337 -0.978624 -0.0594487 0.0337743 1 0 1 1 0 0 +EDGE2 5338 1317 -1.00065 -0.0272361 -0.010576 1 0 1 1 0 0 +EDGE2 5339 2340 0.940999 0.0410667 -3.12058 1 0 1 1 0 0 +EDGE2 5339 2360 0.951599 -0.0199321 -3.1381 1 0 1 1 0 0 +EDGE2 5339 1520 0.926282 0.0776664 -3.11688 1 0 1 1 0 0 +EDGE2 5339 1620 1.00297 0.0562076 -0.019565 1 0 1 1 0 0 +EDGE2 5339 1640 1.01507 -0.01313 -0.0359506 1 0 1 1 0 0 +EDGE2 5339 2320 0.955126 0.053019 -3.1487 1 0 1 1 0 0 +EDGE2 5339 1600 1.00368 0.0258379 -3.09218 1 0 1 1 0 0 +EDGE2 5339 1320 0.98253 0.0292435 0.0190933 1 0 1 1 0 0 +EDGE2 5339 1619 0.077586 0.010446 0.0206588 1 0 1 1 0 0 +EDGE2 5339 1639 -0.0205739 0.112226 -0.00244244 1 0 1 1 0 0 +EDGE2 5339 1319 0.00169921 0.00923866 0.0150853 1 0 1 1 0 0 +EDGE2 5339 1618 -0.878832 0.0736381 0.00863004 1 0 1 1 0 0 +EDGE2 5339 1638 -1.00919 0.0319821 0.00363212 1 0 1 1 0 0 +EDGE2 5339 5338 -1.07384 -0.015466 -0.0198445 1 0 1 1 0 0 +EDGE2 5339 1318 -0.948293 0.000178252 0.00520227 1 0 1 1 0 0 +EDGE2 5340 2359 0.906171 0.0559809 -3.14122 1 0 1 1 0 0 +EDGE2 5340 1599 0.961922 -0.125694 -3.12662 1 0 1 1 0 0 +EDGE2 5340 2319 1.06448 -0.110075 -3.14098 1 0 1 1 0 0 +EDGE2 5340 2339 1.02617 0.0582192 -3.15119 1 0 1 1 0 0 +EDGE2 5340 1519 0.99577 0.0270785 -3.14453 1 0 1 1 0 0 +EDGE2 5340 2340 -0.0367935 0.0541471 -3.1807 1 0 1 1 0 0 +EDGE2 5340 2341 0.0992528 -1.02961 -1.5301 1 0 1 1 0 0 +EDGE2 5340 2361 -0.101226 -0.938184 -1.55388 1 0 1 1 0 0 +EDGE2 5340 1521 0.058816 -1.05358 -1.56927 1 0 1 1 0 0 +EDGE2 5340 1641 -0.0708558 -1.02643 -1.55403 1 0 1 1 0 0 +EDGE2 5340 2321 -0.0103887 -1.04659 -1.58407 1 0 1 1 0 0 +EDGE2 5340 1321 -0.025564 -1.01885 -1.53983 1 0 1 1 0 0 +EDGE2 5340 2360 -0.0190544 -0.0453565 -3.1272 1 0 1 1 0 0 +EDGE2 5340 1520 0.0315701 0.14851 -3.13314 1 0 1 1 0 0 +EDGE2 5340 1620 -0.00180584 -0.0599919 0.00672848 1 0 1 1 0 0 +EDGE2 5340 1640 -0.0986096 -0.00068567 -0.0211537 1 0 1 1 0 0 +EDGE2 5340 2320 0.0567941 -0.161244 -3.15938 1 0 1 1 0 0 +EDGE2 5340 1600 -0.0296552 -0.0125017 -3.12398 1 0 1 1 0 0 +EDGE2 5340 1621 0.00568386 1.0521 1.5749 1 0 1 1 0 0 +EDGE2 5340 1320 0.00251894 0.0239085 0.0240101 1 0 1 1 0 0 +EDGE2 5340 1601 0.0542676 1.11057 1.59741 1 0 1 1 0 0 +EDGE2 5340 1619 -1.06185 0.0795233 -0.0143135 1 0 1 1 0 0 +EDGE2 5340 5339 -1.04481 0.0209291 -0.0076609 1 0 1 1 0 0 +EDGE2 5340 1639 -1.018 -0.110545 -0.00163888 1 0 1 1 0 0 +EDGE2 5340 1319 -1.03088 0.00907229 -0.00136296 1 0 1 1 0 0 +EDGE2 5341 2362 0.987578 -0.0454786 -0.00944701 1 0 1 1 0 0 +EDGE2 5341 2340 -1.03309 -0.066947 -1.60947 1 0 1 1 0 0 +EDGE2 5341 2341 -0.0147936 -0.127116 -0.00921999 1 0 1 1 0 0 +EDGE2 5341 1322 1.13821 -0.0118569 -0.0104805 1 0 1 1 0 0 +EDGE2 5341 1642 1.01406 -0.0875098 -0.0224062 1 0 1 1 0 0 +EDGE2 5341 2322 1.11722 -0.038095 0.0112679 1 0 1 1 0 0 +EDGE2 5341 2342 0.962257 0.0486639 -0.00593142 1 0 1 1 0 0 +EDGE2 5341 1522 0.995135 0.0136479 0.00328339 1 0 1 1 0 0 +EDGE2 5341 2361 -0.0194279 0.024644 -0.0130818 1 0 1 1 0 0 +EDGE2 5341 1521 0.0530905 -0.0240871 -0.0205718 1 0 1 1 0 0 +EDGE2 5341 1641 -0.0110198 -0.0367139 -0.0633876 1 0 1 1 0 0 +EDGE2 5341 2321 -0.0793917 0.027674 -0.0111529 1 0 1 1 0 0 +EDGE2 5341 1321 0.00719555 0.107234 -0.00749037 1 0 1 1 0 0 +EDGE2 5341 5340 -0.888797 -0.0198337 1.56928 1 0 1 1 0 0 +EDGE2 5341 2360 -1.06284 0.032981 -1.60837 1 0 1 1 0 0 +EDGE2 5341 1520 -1.06563 -0.0689958 -1.57428 1 0 1 1 0 0 +EDGE2 5341 1620 -0.97151 -0.0143282 1.59205 1 0 1 1 0 0 +EDGE2 5341 1640 -0.992442 0.0157714 1.57227 1 0 1 1 0 0 +EDGE2 5341 2320 -1.07753 0.0550579 -1.57747 1 0 1 1 0 0 +EDGE2 5341 1600 -1.05886 -0.0548133 -1.55981 1 0 1 1 0 0 +EDGE2 5341 1320 -1.07441 -0.032068 1.60609 1 0 1 1 0 0 +EDGE2 5342 2362 0.0141857 -0.0595715 0.024172 1 0 1 1 0 0 +EDGE2 5342 2363 1.02907 0.00931225 0.0208843 1 0 1 1 0 0 +EDGE2 5342 1323 0.934426 -0.11701 -0.00195852 1 0 1 1 0 0 +EDGE2 5342 1643 1.02708 0.0145013 0.00057096 1 0 1 1 0 0 +EDGE2 5342 2323 0.985806 0.111647 0.0342974 1 0 1 1 0 0 +EDGE2 5342 2343 1.01823 0.0485512 -0.0143758 1 0 1 1 0 0 +EDGE2 5342 1523 1.06251 0.0474959 0.00474575 1 0 1 1 0 0 +EDGE2 5342 2341 -1.07621 -0.0819812 -0.0154776 1 0 1 1 0 0 +EDGE2 5342 1322 0.00642197 0.0278959 0.00426127 1 0 1 1 0 0 +EDGE2 5342 1642 0.0297632 -0.037256 0.020891 1 0 1 1 0 0 +EDGE2 5342 2322 0.00179289 -0.0519775 -0.0167605 1 0 1 1 0 0 +EDGE2 5342 2342 -0.100017 0.00236207 0.00546745 1 0 1 1 0 0 +EDGE2 5342 1522 -0.0769912 -0.0906358 0.00258361 1 0 1 1 0 0 +EDGE2 5342 5341 -1.02333 0.0323287 0.0230573 1 0 1 1 0 0 +EDGE2 5342 2361 -1.08793 0.0952296 0.0148541 1 0 1 1 0 0 +EDGE2 5342 1521 -1.00526 -0.0151958 -0.0313 1 0 1 1 0 0 +EDGE2 5342 1641 -0.932805 0.0573751 -0.0122824 1 0 1 1 0 0 +EDGE2 5342 2321 -0.968089 0.00125336 -0.0177832 1 0 1 1 0 0 +EDGE2 5342 1321 -1.07598 0.00285998 -0.0129843 1 0 1 1 0 0 +EDGE2 5343 2362 -1.01219 0.0246088 -0.0209587 1 0 1 1 0 0 +EDGE2 5343 2363 0.0282555 -0.0460555 0.00860596 1 0 1 1 0 0 +EDGE2 5343 1524 1.05054 0.0553433 0.00149609 1 0 1 1 0 0 +EDGE2 5343 2324 1.0611 0.0177312 -0.00271073 1 0 1 1 0 0 +EDGE2 5343 2344 1.08628 0.00664767 -0.00170968 1 0 1 1 0 0 +EDGE2 5343 2364 1.04885 0.00241636 0.00239626 1 0 1 1 0 0 +EDGE2 5343 1644 0.967876 0.00604973 0.00188438 1 0 1 1 0 0 +EDGE2 5343 1324 0.982848 0.0438551 0.00790804 1 0 1 1 0 0 +EDGE2 5343 1323 0.0579612 -0.0227443 -0.0146953 1 0 1 1 0 0 +EDGE2 5343 1643 -0.0330159 -0.10686 0.0533842 1 0 1 1 0 0 +EDGE2 5343 2323 0.051468 0.073603 0.039928 1 0 1 1 0 0 +EDGE2 5343 2343 -0.0320997 -0.0195002 0.0103468 1 0 1 1 0 0 +EDGE2 5343 1523 0.114663 0.0635683 0.0403164 1 0 1 1 0 0 +EDGE2 5343 5342 -0.992118 0.016811 -0.0223895 1 0 1 1 0 0 +EDGE2 5343 1322 -0.995092 -0.0139263 -0.0214539 1 0 1 1 0 0 +EDGE2 5343 1642 -0.968655 -0.00744247 -0.00251694 1 0 1 1 0 0 +EDGE2 5343 2322 -0.918164 0.0550387 0.00138847 1 0 1 1 0 0 +EDGE2 5343 2342 -0.993131 0.0261473 -0.0136855 1 0 1 1 0 0 +EDGE2 5343 1522 -0.987624 -0.00957612 -0.0568123 1 0 1 1 0 0 +EDGE2 5344 1345 0.992775 0.0466344 -3.13993 1 0 1 1 0 0 +EDGE2 5344 2345 1.05168 0.0153125 -0.0219869 1 0 1 1 0 0 +EDGE2 5344 2365 1.04782 0.0112173 0.0145147 1 0 1 1 0 0 +EDGE2 5344 1525 1.04937 -0.0142192 -0.00789369 1 0 1 1 0 0 +EDGE2 5344 1905 0.978128 0.0262744 -3.17073 1 0 1 1 0 0 +EDGE2 5344 1925 0.950254 0.0392869 -3.17233 1 0 1 1 0 0 +EDGE2 5344 2325 1.00737 0.0180946 -0.00381697 1 0 1 1 0 0 +EDGE2 5344 1645 1.04611 -0.0569278 0.000363449 1 0 1 1 0 0 +EDGE2 5344 1485 1.04202 0.0248001 -3.16886 1 0 1 1 0 0 +EDGE2 5344 1505 1.06715 0.0334549 -3.15249 1 0 1 1 0 0 +EDGE2 5344 1365 0.9791 -0.0281882 -3.14582 1 0 1 1 0 0 +EDGE2 5344 1325 0.916178 -0.0290229 -0.0208715 1 0 1 1 0 0 +EDGE2 5344 2363 -0.95635 0.0268275 0.0254181 1 0 1 1 0 0 +EDGE2 5344 1524 -0.0311519 0.01376 -0.028934 1 0 1 1 0 0 +EDGE2 5344 2324 -0.00251364 -0.0478653 0.0109133 1 0 1 1 0 0 +EDGE2 5344 2344 0.0238424 -0.018 0.00656615 1 0 1 1 0 0 +EDGE2 5344 2364 0.0544403 0.0295259 -0.00873594 1 0 1 1 0 0 +EDGE2 5344 1644 0.107065 -0.0127884 0.00550418 1 0 1 1 0 0 +EDGE2 5344 1324 -0.00378716 0.0141814 0.00433729 1 0 1 1 0 0 +EDGE2 5344 5343 -1.05272 -0.045277 0.0467688 1 0 1 1 0 0 +EDGE2 5344 1323 -1.00719 -0.00155544 -0.0131522 1 0 1 1 0 0 +EDGE2 5344 1643 -0.943303 -0.0424207 0.0181605 1 0 1 1 0 0 +EDGE2 5344 2323 -0.943223 -0.0036703 -0.0146775 1 0 1 1 0 0 +EDGE2 5344 2343 -0.979779 0.0103962 -0.0235449 1 0 1 1 0 0 +EDGE2 5344 1523 -1.07757 -0.026156 0.00794222 1 0 1 1 0 0 +EDGE2 5345 1345 0.0659254 0.0120842 -3.15092 1 0 1 1 0 0 +EDGE2 5345 1526 0.0257915 1.00389 1.57001 1 0 1 1 0 0 +EDGE2 5345 2366 -0.0143894 1.04486 1.57773 1 0 1 1 0 0 +EDGE2 5345 1926 -0.0581065 0.879967 1.56826 1 0 1 1 0 0 +EDGE2 5345 2326 -0.00484454 1.05859 1.55742 1 0 1 1 0 0 +EDGE2 5345 2346 -0.0304352 1.02845 1.55069 1 0 1 1 0 0 +EDGE2 5345 1646 0.0468909 1.05788 1.59519 1 0 1 1 0 0 +EDGE2 5345 1366 0.0175777 1.10195 1.59351 1 0 1 1 0 0 +EDGE2 5345 1506 -0.105649 0.903397 1.55605 1 0 1 1 0 0 +EDGE2 5345 1924 0.969107 0.0839727 -3.13026 1 0 1 1 0 0 +EDGE2 5345 2345 -0.00925094 -0.0143569 0.0143765 1 0 1 1 0 0 +EDGE2 5345 1344 0.943641 0.0582663 -3.13909 1 0 1 1 0 0 +EDGE2 5345 1484 0.969571 -0.0332095 -3.15096 1 0 1 1 0 0 +EDGE2 5345 1504 0.976832 0.0596299 -3.10606 1 0 1 1 0 0 +EDGE2 5345 1904 0.961275 0.0443593 -3.16121 1 0 1 1 0 0 +EDGE2 5345 1364 1.00754 0.0451479 -3.14721 1 0 1 1 0 0 +EDGE2 5345 2365 -0.00337845 0.0521401 0.00609223 1 0 1 1 0 0 +EDGE2 5345 1525 0.0672548 -0.0788658 0.00166969 1 0 1 1 0 0 +EDGE2 5345 1905 -0.0195564 -0.0879045 -3.16578 1 0 1 1 0 0 +EDGE2 5345 1925 0.0712672 0.0310532 -3.10829 1 0 1 1 0 0 +EDGE2 5345 2325 0.00146801 -0.00158023 -0.0198053 1 0 1 1 0 0 +EDGE2 5345 1645 -0.0399603 -0.00661796 -0.00423871 1 0 1 1 0 0 +EDGE2 5345 1485 0.0875396 -0.0288665 -3.15041 1 0 1 1 0 0 +EDGE2 5345 1505 -0.00828201 0.0507524 -3.11752 1 0 1 1 0 0 +EDGE2 5345 1365 0.000512196 0.00564371 -3.13596 1 0 1 1 0 0 +EDGE2 5345 5344 -1.03 0.0187134 0.00316106 1 0 1 1 0 0 +EDGE2 5345 1325 0.0341571 0.0614088 0.00853963 1 0 1 1 0 0 +EDGE2 5345 1524 -0.971036 0.0178963 0.00192315 1 0 1 1 0 0 +EDGE2 5345 2324 -0.974273 -0.0578793 0.00762314 1 0 1 1 0 0 +EDGE2 5345 2344 -1.01196 -0.0491421 -0.0325954 1 0 1 1 0 0 +EDGE2 5345 2364 -1.00699 0.046277 -0.0116981 1 0 1 1 0 0 +EDGE2 5345 1644 -1.09359 -0.0838635 -0.00952295 1 0 1 1 0 0 +EDGE2 5345 1324 -1.07335 0.000360487 -0.0199289 1 0 1 1 0 0 +EDGE2 5345 1486 0.0231005 -1.02272 -1.58043 1 0 1 1 0 0 +EDGE2 5345 1906 -0.0512856 -1.01439 -1.58772 1 0 1 1 0 0 +EDGE2 5345 1326 -0.021957 -1.07573 -1.5677 1 0 1 1 0 0 +EDGE2 5345 1346 0.0242794 -1.01129 -1.56691 1 0 1 1 0 0 +EDGE2 5346 2327 0.987077 0.00465089 -0.00545204 1 0 1 1 0 0 +EDGE2 5346 2367 1.06014 0.0506328 -0.000794322 1 0 1 1 0 0 +EDGE2 5346 2347 1.07315 0.0307064 0.00662462 1 0 1 1 0 0 +EDGE2 5346 1345 -0.970738 -0.0249508 1.56776 1 0 1 1 0 0 +EDGE2 5346 1526 0.000614996 -0.0632528 -0.0251656 1 0 1 1 0 0 +EDGE2 5346 1507 0.935955 0.0214172 0.000418744 1 0 1 1 0 0 +EDGE2 5346 1527 1.00203 -0.00871269 -0.018263 1 0 1 1 0 0 +EDGE2 5346 1647 1.04235 0.0217112 -0.0131313 1 0 1 1 0 0 +EDGE2 5346 1927 1.05839 -0.0826604 -0.031189 1 0 1 1 0 0 +EDGE2 5346 2366 0.0438427 0.0077328 0.0431101 1 0 1 1 0 0 +EDGE2 5346 1367 0.992019 -0.0134008 6.77159e-06 1 0 1 1 0 0 +EDGE2 5346 1926 -0.0760783 -0.0748817 0.011869 1 0 1 1 0 0 +EDGE2 5346 2326 -0.0486688 0.0201264 -0.0193632 1 0 1 1 0 0 +EDGE2 5346 2346 -0.0843576 -0.0233479 0.00871814 1 0 1 1 0 0 +EDGE2 5346 1646 -0.0181519 -0.0130233 0.0148276 1 0 1 1 0 0 +EDGE2 5346 1366 0.102737 0.0171588 -0.0133913 1 0 1 1 0 0 +EDGE2 5346 1506 0.00722424 -0.045495 -0.00870768 1 0 1 1 0 0 +EDGE2 5346 2345 -0.958456 -0.144308 -1.59877 1 0 1 1 0 0 +EDGE2 5346 5345 -1.02433 -0.023926 -1.59403 1 0 1 1 0 0 +EDGE2 5346 2365 -0.964917 0.00151301 -1.58314 1 0 1 1 0 0 +EDGE2 5346 1525 -0.928877 0.0050548 -1.59629 1 0 1 1 0 0 +EDGE2 5346 1905 -0.969261 -0.0196975 1.58184 1 0 1 1 0 0 +EDGE2 5346 1925 -0.949453 -0.0121058 1.54636 1 0 1 1 0 0 +EDGE2 5346 2325 -0.970983 0.0269719 -1.57622 1 0 1 1 0 0 +EDGE2 5346 1645 -0.980867 -0.0173868 -1.59079 1 0 1 1 0 0 +EDGE2 5346 1485 -1.0045 -0.020191 1.56885 1 0 1 1 0 0 +EDGE2 5346 1505 -1.04158 -0.0108953 1.60923 1 0 1 1 0 0 +EDGE2 5346 1365 -1.02571 0.0527722 1.58675 1 0 1 1 0 0 +EDGE2 5346 1325 -1.01383 -0.0239853 -1.59104 1 0 1 1 0 0 +EDGE2 5347 2327 -0.0589005 -0.0060329 0.00446219 1 0 1 1 0 0 +EDGE2 5347 2368 0.898581 -0.0263299 0.0299366 1 0 1 1 0 0 +EDGE2 5347 1648 0.985381 -0.0551437 0.0149067 1 0 1 1 0 0 +EDGE2 5347 1928 1.02838 -0.0482214 0.0154405 1 0 1 1 0 0 +EDGE2 5347 2328 1.05588 0.0136169 0.0128831 1 0 1 1 0 0 +EDGE2 5347 2348 1.02793 0.0131865 -0.0274809 1 0 1 1 0 0 +EDGE2 5347 1368 1.01168 -0.0964873 -0.0124205 1 0 1 1 0 0 +EDGE2 5347 1508 1.00019 0.0249347 -0.0285404 1 0 1 1 0 0 +EDGE2 5347 1528 0.966691 0.0517012 -0.0156032 1 0 1 1 0 0 +EDGE2 5347 2367 -0.144527 0.0237413 0.0179675 1 0 1 1 0 0 +EDGE2 5347 2347 0.0693492 -0.00399877 -0.0101175 1 0 1 1 0 0 +EDGE2 5347 1526 -0.964186 0.0148674 0.00532172 1 0 1 1 0 0 +EDGE2 5347 1507 0.022503 0.103787 -0.00501662 1 0 1 1 0 0 +EDGE2 5347 1527 0.0313463 0.0996614 -0.0118606 1 0 1 1 0 0 +EDGE2 5347 1647 -0.0340741 -0.0624505 0.027128 1 0 1 1 0 0 +EDGE2 5347 1927 0.0520577 -0.0208171 -0.0113058 1 0 1 1 0 0 +EDGE2 5347 2366 -0.984222 0.000290289 0.00429459 1 0 1 1 0 0 +EDGE2 5347 1367 -0.0419615 0.0160533 0.000645457 1 0 1 1 0 0 +EDGE2 5347 5346 -1.13909 -0.00477725 -0.0184405 1 0 1 1 0 0 +EDGE2 5347 1926 -1.01435 0.0341116 0.0150361 1 0 1 1 0 0 +EDGE2 5347 2326 -0.990339 0.0561674 0.0141984 1 0 1 1 0 0 +EDGE2 5347 2346 -0.978737 0.0275732 0.00255321 1 0 1 1 0 0 +EDGE2 5347 1646 -0.964855 0.0489241 0.0155506 1 0 1 1 0 0 +EDGE2 5347 1366 -1.00044 0.0276115 0.0578307 1 0 1 1 0 0 +EDGE2 5347 1506 -0.970353 0.00682943 -0.0104188 1 0 1 1 0 0 +EDGE2 5348 2327 -0.94195 -0.0195321 -0.0127928 1 0 1 1 0 0 +EDGE2 5348 2368 0.00175568 -0.0651025 0.0314987 1 0 1 1 0 0 +EDGE2 5348 2349 0.916894 0.055578 0.0180127 1 0 1 1 0 0 +EDGE2 5348 2369 1.07121 0.0447968 -0.016142 1 0 1 1 0 0 +EDGE2 5348 1509 1.00998 0.0457366 -0.0115475 1 0 1 1 0 0 +EDGE2 5348 1649 0.979312 0.0123879 -0.0320334 1 0 1 1 0 0 +EDGE2 5348 1929 0.97295 -0.0495176 0.031339 1 0 1 1 0 0 +EDGE2 5348 2329 1.08323 0.0952059 0.00994186 1 0 1 1 0 0 +EDGE2 5348 1529 0.918036 -0.0557158 -0.00556883 1 0 1 1 0 0 +EDGE2 5348 1369 1.01589 -0.0691155 -0.0184028 1 0 1 1 0 0 +EDGE2 5348 1648 0.103496 -0.0430921 -0.0230196 1 0 1 1 0 0 +EDGE2 5348 1928 -0.0356873 0.0990627 0.0114833 1 0 1 1 0 0 +EDGE2 5348 2328 0.0183956 -0.102934 0.0427845 1 0 1 1 0 0 +EDGE2 5348 2348 0.0452516 0.0791065 -0.0238078 1 0 1 1 0 0 +EDGE2 5348 1368 -0.0258179 -0.0809366 -0.0218998 1 0 1 1 0 0 +EDGE2 5348 1508 0.0329318 0.0256216 -0.00953219 1 0 1 1 0 0 +EDGE2 5348 1528 -0.0406315 -0.0163898 -0.0241639 1 0 1 1 0 0 +EDGE2 5348 2367 -0.982487 0.0685867 -0.019891 1 0 1 1 0 0 +EDGE2 5348 5347 -0.984307 -0.0657208 -0.0402059 1 0 1 1 0 0 +EDGE2 5348 2347 -1.06285 0.0836287 0.0143817 1 0 1 1 0 0 +EDGE2 5348 1507 -0.959703 0.0252651 -0.0255055 1 0 1 1 0 0 +EDGE2 5348 1527 -1.0262 0.0679893 0.00680473 1 0 1 1 0 0 +EDGE2 5348 1647 -0.92331 -0.0313487 -0.000170505 1 0 1 1 0 0 +EDGE2 5348 1927 -0.93567 0.0136182 0.0123708 1 0 1 1 0 0 +EDGE2 5348 1367 -0.949313 -0.0567674 0.00687783 1 0 1 1 0 0 +EDGE2 5349 2330 1.00235 0.0468489 0.0317208 1 0 1 1 0 0 +EDGE2 5349 2370 0.997547 -0.00823313 -0.0142323 1 0 1 1 0 0 +EDGE2 5349 2350 0.911949 0.0284603 0.0546999 1 0 1 1 0 0 +EDGE2 5349 1650 0.941163 -0.10468 -0.0163541 1 0 1 1 0 0 +EDGE2 5349 1710 1.03527 0.0799346 -3.1441 1 0 1 1 0 0 +EDGE2 5349 1870 1.06573 0.0759414 -3.12961 1 0 1 1 0 0 +EDGE2 5349 1930 0.977529 0.030332 -0.0259069 1 0 1 1 0 0 +EDGE2 5349 1670 0.936185 0.00339426 -3.14665 1 0 1 1 0 0 +EDGE2 5349 1470 1.01011 0.0338053 -3.1469 1 0 1 1 0 0 +EDGE2 5349 1510 0.989509 -0.0241593 0.00339591 1 0 1 1 0 0 +EDGE2 5349 1530 0.968505 -0.0714552 0.0119822 1 0 1 1 0 0 +EDGE2 5349 1370 0.978914 0.0621572 0.00111779 1 0 1 1 0 0 +EDGE2 5349 2368 -1.00284 -0.0227893 -0.0299201 1 0 1 1 0 0 +EDGE2 5349 2349 -0.0996155 -0.094676 0.00934858 1 0 1 1 0 0 +EDGE2 5349 2369 -0.107579 -0.00888295 -0.00196084 1 0 1 1 0 0 +EDGE2 5349 1509 0.0966261 -0.000766594 -0.0156209 1 0 1 1 0 0 +EDGE2 5349 1649 -0.0184443 -0.0840826 0.0252559 1 0 1 1 0 0 +EDGE2 5349 1929 0.0750346 0.0263489 -0.0182969 1 0 1 1 0 0 +EDGE2 5349 2329 0.0911528 -0.0701304 -0.00531533 1 0 1 1 0 0 +EDGE2 5349 1529 -0.154832 0.0378447 -0.00141765 1 0 1 1 0 0 +EDGE2 5349 1369 -0.0105236 0.0463538 0.0465133 1 0 1 1 0 0 +EDGE2 5349 5348 -0.954779 0.0689471 0.0176764 1 0 1 1 0 0 +EDGE2 5349 1648 -1.05288 0.0540488 0.0156586 1 0 1 1 0 0 +EDGE2 5349 1928 -0.952782 -0.0561596 -0.0267917 1 0 1 1 0 0 +EDGE2 5349 2328 -0.958347 0.0371245 0.0310815 1 0 1 1 0 0 +EDGE2 5349 2348 -1.01661 0.0483153 0.00556328 1 0 1 1 0 0 +EDGE2 5349 1368 -0.973304 -0.0260871 -0.0086127 1 0 1 1 0 0 +EDGE2 5349 1508 -0.998036 0.00860459 0.00867477 1 0 1 1 0 0 +EDGE2 5349 1528 -1.06752 0.0355804 -0.0275924 1 0 1 1 0 0 +EDGE2 5350 1931 0.110211 -1.02325 -1.58048 1 0 1 1 0 0 +EDGE2 5350 1669 0.996248 -0.00408482 -3.15911 1 0 1 1 0 0 +EDGE2 5350 1709 1.01441 0.0576939 -3.14178 1 0 1 1 0 0 +EDGE2 5350 1869 0.975139 0.00818902 -3.15012 1 0 1 1 0 0 +EDGE2 5350 1469 0.99696 0.0291796 -3.13466 1 0 1 1 0 0 +EDGE2 5350 2330 -0.0382966 0.0397972 -0.00653408 1 0 1 1 0 0 +EDGE2 5350 1671 0.00905654 -0.931518 -1.53569 1 0 1 1 0 0 +EDGE2 5350 1711 0.0481766 -1.04563 -1.5526 1 0 1 1 0 0 +EDGE2 5350 1871 0.0535415 -1.022 -1.58411 1 0 1 1 0 0 +EDGE2 5350 1471 -0.0223018 -1.03335 -1.56868 1 0 1 1 0 0 +EDGE2 5350 2370 -0.0653109 -0.0509523 -0.00972812 1 0 1 1 0 0 +EDGE2 5350 2350 0.02461 -0.00972012 -0.00591721 1 0 1 1 0 0 +EDGE2 5350 1650 0.0708891 0.0182202 0.0225285 1 0 1 1 0 0 +EDGE2 5350 1710 -0.0404502 0.0428808 -3.14967 1 0 1 1 0 0 +EDGE2 5350 1870 0.0621851 -0.0467958 -3.13904 1 0 1 1 0 0 +EDGE2 5350 1930 -0.053641 0.0389956 -0.0217983 1 0 1 1 0 0 +EDGE2 5350 1670 -0.00148002 -0.0011243 -3.13288 1 0 1 1 0 0 +EDGE2 5350 1470 0.0337007 0.00614174 -3.12509 1 0 1 1 0 0 +EDGE2 5350 1510 0.0900519 0.0211181 0.0212168 1 0 1 1 0 0 +EDGE2 5350 1530 0.0418683 -0.0395306 0.00699628 1 0 1 1 0 0 +EDGE2 5350 1370 0.025802 -0.043348 -0.00248577 1 0 1 1 0 0 +EDGE2 5350 2351 0.0682952 0.957271 1.5507 1 0 1 1 0 0 +EDGE2 5350 2371 0.09389 1.04767 1.55815 1 0 1 1 0 0 +EDGE2 5350 1371 -0.0474753 0.972415 1.57516 1 0 1 1 0 0 +EDGE2 5350 1531 0.0265389 0.947811 1.57587 1 0 1 1 0 0 +EDGE2 5350 1651 0.000270106 0.981969 1.57135 1 0 1 1 0 0 +EDGE2 5350 2331 0.0282734 1.04811 1.56861 1 0 1 1 0 0 +EDGE2 5350 1511 -0.0229299 1.01134 1.5956 1 0 1 1 0 0 +EDGE2 5350 2349 -0.990968 -0.148091 0.0186932 1 0 1 1 0 0 +EDGE2 5350 2369 -0.987096 -0.0396321 -0.00546755 1 0 1 1 0 0 +EDGE2 5350 5349 -1.01779 0.0445724 -0.00952513 1 0 1 1 0 0 +EDGE2 5350 1509 -0.992622 -0.0500906 -0.0525805 1 0 1 1 0 0 +EDGE2 5350 1649 -0.972548 0.00915746 -0.0109037 1 0 1 1 0 0 +EDGE2 5350 1929 -1.05674 0.00339556 0.0187556 1 0 1 1 0 0 +EDGE2 5350 2329 -0.94505 0.0381185 -0.0379382 1 0 1 1 0 0 +EDGE2 5350 1529 -0.968088 0.0731945 0.00439755 1 0 1 1 0 0 +EDGE2 5350 1369 -1.05128 0.0893922 -0.0220414 1 0 1 1 0 0 +EDGE2 5351 2372 0.974102 -0.0661336 -0.000476789 1 0 1 1 0 0 +EDGE2 5351 2330 -0.939289 0.025605 -1.56117 1 0 1 1 0 0 +EDGE2 5351 2370 -0.99587 -0.0147366 -1.56923 1 0 1 1 0 0 +EDGE2 5351 5350 -1.03488 0.0531017 -1.55508 1 0 1 1 0 0 +EDGE2 5351 2350 -0.960552 0.0588335 -1.5629 1 0 1 1 0 0 +EDGE2 5351 1650 -1.02934 -0.0207306 -1.59539 1 0 1 1 0 0 +EDGE2 5351 1710 -0.95434 -0.0137849 1.55903 1 0 1 1 0 0 +EDGE2 5351 1870 -1.06263 -0.0627725 1.5304 1 0 1 1 0 0 +EDGE2 5351 1930 -0.960119 0.107458 -1.59727 1 0 1 1 0 0 +EDGE2 5351 1670 -1.0509 -0.0877845 1.5492 1 0 1 1 0 0 +EDGE2 5351 1470 -0.987818 0.076763 1.54921 1 0 1 1 0 0 +EDGE2 5351 1510 -1.05552 -0.068145 -1.59472 1 0 1 1 0 0 +EDGE2 5351 1530 -0.999695 -0.0054447 -1.59187 1 0 1 1 0 0 +EDGE2 5351 1370 -1.17716 0.0880138 -1.55377 1 0 1 1 0 0 +EDGE2 5351 2351 0.0278346 0.00619592 -0.0278055 1 0 1 1 0 0 +EDGE2 5351 2371 -0.00782589 0.0123126 0.0469691 1 0 1 1 0 0 +EDGE2 5351 1371 -0.021764 -0.0353909 0.0225203 1 0 1 1 0 0 +EDGE2 5351 1531 -0.0514387 0.0155183 -0.00860236 1 0 1 1 0 0 +EDGE2 5351 1651 -0.0307471 0.0243294 0.0064331 1 0 1 1 0 0 +EDGE2 5351 2331 -0.0125329 -0.0153194 -4.58704e-05 1 0 1 1 0 0 +EDGE2 5351 1511 -0.045369 -0.121391 0.0112805 1 0 1 1 0 0 +EDGE2 5351 1512 0.973415 0.0112799 0.00160344 1 0 1 1 0 0 +EDGE2 5351 1652 0.920492 -0.0979175 0.00519285 1 0 1 1 0 0 +EDGE2 5351 2332 0.936873 -0.0348767 0.0185517 1 0 1 1 0 0 +EDGE2 5351 2352 0.961655 -0.0244745 0.0109293 1 0 1 1 0 0 +EDGE2 5351 1532 1.0349 0.0205209 -0.0202811 1 0 1 1 0 0 +EDGE2 5351 1372 1.05859 0.0133011 -0.0303994 1 0 1 1 0 0 +EDGE2 5352 2372 -0.120932 0.0238792 -0.0209156 1 0 1 1 0 0 +EDGE2 5352 2351 -0.955029 0.0535439 -0.0158494 1 0 1 1 0 0 +EDGE2 5352 2371 -1.01574 -0.0327537 -0.000747847 1 0 1 1 0 0 +EDGE2 5352 5351 -1.04258 -0.0432558 0.00687427 1 0 1 1 0 0 +EDGE2 5352 1371 -1.11328 0.039293 0.000127408 1 0 1 1 0 0 +EDGE2 5352 1531 -0.988907 -0.0846602 0.00663802 1 0 1 1 0 0 +EDGE2 5352 1651 -1.04345 -0.00290525 0.00743133 1 0 1 1 0 0 +EDGE2 5352 2331 -1.05804 -0.00702908 -0.0034241 1 0 1 1 0 0 +EDGE2 5352 1511 -1.10233 -0.0885148 0.0162983 1 0 1 1 0 0 +EDGE2 5352 2373 0.977505 0.0353258 0.00507584 1 0 1 1 0 0 +EDGE2 5352 1512 0.00139957 0.00151798 -0.0185601 1 0 1 1 0 0 +EDGE2 5352 1652 -0.0404426 -0.0180528 -0.0495193 1 0 1 1 0 0 +EDGE2 5352 2332 0.0783183 0.0168461 0.00995308 1 0 1 1 0 0 +EDGE2 5352 2352 0.0125401 0.0502114 0.0323846 1 0 1 1 0 0 +EDGE2 5352 1532 -0.0970049 0.0168654 0.0314072 1 0 1 1 0 0 +EDGE2 5352 1372 -0.0485452 0.0748625 0.026785 1 0 1 1 0 0 +EDGE2 5352 1513 1.01939 0.0249045 0.00549044 1 0 1 1 0 0 +EDGE2 5352 1653 1.07797 -0.0817533 0.0321697 1 0 1 1 0 0 +EDGE2 5352 2333 0.987084 -0.0160353 -0.00141041 1 0 1 1 0 0 +EDGE2 5352 2353 1.02172 -0.0393905 0.00147101 1 0 1 1 0 0 +EDGE2 5352 1533 1.02412 0.00501011 0.0092972 1 0 1 1 0 0 +EDGE2 5352 1373 0.992842 -0.0728669 -4.70243e-06 1 0 1 1 0 0 +EDGE2 5353 2372 -1.02885 0.0162075 -0.0263756 1 0 1 1 0 0 +EDGE2 5353 5352 -0.972124 -0.0405667 0.0346461 1 0 1 1 0 0 +EDGE2 5353 2374 1.01977 -0.0271912 -0.000661555 1 0 1 1 0 0 +EDGE2 5353 2373 -0.0379101 0.0328109 0.0219376 1 0 1 1 0 0 +EDGE2 5353 1512 -0.945967 -0.000257802 0.0349715 1 0 1 1 0 0 +EDGE2 5353 1652 -0.96385 0.0165507 -0.02448 1 0 1 1 0 0 +EDGE2 5353 2332 -0.967165 0.0409665 -0.00443627 1 0 1 1 0 0 +EDGE2 5353 2352 -0.989287 0.0511511 -0.0250658 1 0 1 1 0 0 +EDGE2 5353 1532 -1.04395 -0.0949483 -0.0197675 1 0 1 1 0 0 +EDGE2 5353 1372 -1.00947 -0.0406001 0.00992423 1 0 1 1 0 0 +EDGE2 5353 1513 0.0408896 0.00833679 0.0192494 1 0 1 1 0 0 +EDGE2 5353 1653 -0.0707065 -0.0281348 0.0272826 1 0 1 1 0 0 +EDGE2 5353 2333 -0.0662582 0.0385056 0.0312398 1 0 1 1 0 0 +EDGE2 5353 2353 0.0570854 0.0500607 -0.0273184 1 0 1 1 0 0 +EDGE2 5353 1533 -0.114406 0.078915 -0.000963321 1 0 1 1 0 0 +EDGE2 5353 1373 0.048986 -0.0375739 0.00224274 1 0 1 1 0 0 +EDGE2 5353 1514 1.00129 0.0396968 -0.00559849 1 0 1 1 0 0 +EDGE2 5353 1654 1.05507 -0.0677556 -0.0235629 1 0 1 1 0 0 +EDGE2 5353 2334 1.0188 0.0173968 0.0169789 1 0 1 1 0 0 +EDGE2 5353 2354 1.00656 0.0416939 -0.00863308 1 0 1 1 0 0 +EDGE2 5353 1534 1.07987 0.0540818 0.00273746 1 0 1 1 0 0 +EDGE2 5353 1374 1.06285 -0.0744163 -0.00981951 1 0 1 1 0 0 +EDGE2 5354 1535 0.918389 -0.0759057 -0.0292664 1 0 1 1 0 0 +EDGE2 5354 2374 0.0431181 0.0341079 -0.000200752 1 0 1 1 0 0 +EDGE2 5354 2373 -1.02279 0.0525321 0.00124139 1 0 1 1 0 0 +EDGE2 5354 5353 -0.995414 0.00450167 0.00769686 1 0 1 1 0 0 +EDGE2 5354 1513 -0.985803 0.0203292 -0.0476788 1 0 1 1 0 0 +EDGE2 5354 1653 -0.955421 0.0251766 0.0108204 1 0 1 1 0 0 +EDGE2 5354 2333 -0.959633 0.0260546 0.00494283 1 0 1 1 0 0 +EDGE2 5354 2353 -0.930174 0.00680826 0.00770987 1 0 1 1 0 0 +EDGE2 5354 1533 -0.958179 -0.0329847 0.0220716 1 0 1 1 0 0 +EDGE2 5354 1373 -1.00376 -0.102432 0.0299781 1 0 1 1 0 0 +EDGE2 5354 2395 0.894818 -0.0410427 -3.13725 1 0 1 1 0 0 +EDGE2 5354 1514 -0.0360325 -0.000913662 -0.0329528 1 0 1 1 0 0 +EDGE2 5354 1654 -0.0103623 -0.0169128 0.0300772 1 0 1 1 0 0 +EDGE2 5354 2334 0.00517586 0.000136372 0.0185663 1 0 1 1 0 0 +EDGE2 5354 2354 0.0911904 -0.0739626 -0.0194969 1 0 1 1 0 0 +EDGE2 5354 1534 -0.00210505 -0.0088341 -0.00792979 1 0 1 1 0 0 +EDGE2 5354 1374 -0.0010494 -0.174237 -0.00798963 1 0 1 1 0 0 +EDGE2 5354 1855 1.05202 0.0123029 -3.15626 1 0 1 1 0 0 +EDGE2 5354 2335 0.986881 0.0432742 -0.0145438 1 0 1 1 0 0 +EDGE2 5354 2355 0.974295 -0.0422267 0.0162 1 0 1 1 0 0 +EDGE2 5354 2375 1.04637 0.0399377 0.00219712 1 0 1 1 0 0 +EDGE2 5354 2315 1.0045 0.0243019 -3.12109 1 0 1 1 0 0 +EDGE2 5354 1595 0.957105 -0.00525827 -3.12802 1 0 1 1 0 0 +EDGE2 5354 1655 0.979491 -0.0154212 0.00418943 1 0 1 1 0 0 +EDGE2 5354 1575 1.00307 0.0179293 -3.17137 1 0 1 1 0 0 +EDGE2 5354 1375 1.11248 0.0375961 -0.0199749 1 0 1 1 0 0 +EDGE2 5354 1515 1.00827 0.0712753 0.00689455 1 0 1 1 0 0 +EDGE2 5355 1656 -0.0780599 -0.920583 -1.57341 1 0 1 1 0 0 +EDGE2 5355 2376 -0.0455715 -0.977125 -1.55466 1 0 1 1 0 0 +EDGE2 5355 2396 -0.0170312 -1.00229 -1.60438 1 0 1 1 0 0 +EDGE2 5355 1856 -0.00110725 -1.02207 -1.54662 1 0 1 1 0 0 +EDGE2 5355 1536 -0.0947111 -1.07631 -1.55773 1 0 1 1 0 0 +EDGE2 5355 1576 0.0522992 -0.944018 -1.54976 1 0 1 1 0 0 +EDGE2 5355 1376 -0.0646752 -1.0036 -1.54197 1 0 1 1 0 0 +EDGE2 5355 1535 -0.00766951 0.0123315 0.0231611 1 0 1 1 0 0 +EDGE2 5355 2374 -1.00106 0.0508568 -0.00279517 1 0 1 1 0 0 +EDGE2 5355 5354 -0.964496 -0.0166844 -0.020585 1 0 1 1 0 0 +EDGE2 5355 2395 0.0513036 0.0104373 -3.15485 1 0 1 1 0 0 +EDGE2 5355 1514 -0.998162 0.0151085 -0.00386396 1 0 1 1 0 0 +EDGE2 5355 1654 -1.07676 0.00618939 0.00753941 1 0 1 1 0 0 +EDGE2 5355 2334 -0.954413 -0.00780842 -0.050949 1 0 1 1 0 0 +EDGE2 5355 2354 -0.983181 -0.0647605 0.0354443 1 0 1 1 0 0 +EDGE2 5355 1534 -1.04705 0.0616489 -0.00902844 1 0 1 1 0 0 +EDGE2 5355 1374 -1.00466 -0.00600534 0.00573251 1 0 1 1 0 0 +EDGE2 5355 1855 0.0127777 -0.0539207 -3.12184 1 0 1 1 0 0 +EDGE2 5355 2335 -0.0714463 -0.0890545 0.0210137 1 0 1 1 0 0 +EDGE2 5355 2355 0.042842 -0.0225298 -0.00257532 1 0 1 1 0 0 +EDGE2 5355 2375 0.000424178 -0.0407218 0.0117176 1 0 1 1 0 0 +EDGE2 5355 2315 -0.0328092 0.0420669 -3.11782 1 0 1 1 0 0 +EDGE2 5355 1595 0.106849 -0.0061505 -3.17397 1 0 1 1 0 0 +EDGE2 5355 1655 0.0720765 0.0570952 -0.0130288 1 0 1 1 0 0 +EDGE2 5355 1575 -0.0620717 -0.0443308 -3.1514 1 0 1 1 0 0 +EDGE2 5355 1854 0.864561 0.00835608 -3.17035 1 0 1 1 0 0 +EDGE2 5355 2394 1.03726 -0.16053 -3.12876 1 0 1 1 0 0 +EDGE2 5355 1375 0.0645822 0.0373905 0.0162009 1 0 1 1 0 0 +EDGE2 5355 1515 -0.088037 -0.00410766 -0.00704366 1 0 1 1 0 0 +EDGE2 5355 2314 0.966998 -0.0699416 -3.15136 1 0 1 1 0 0 +EDGE2 5355 1574 0.975906 0.0188948 -3.14738 1 0 1 1 0 0 +EDGE2 5355 1594 0.998947 0.0772288 -3.10482 1 0 1 1 0 0 +EDGE2 5355 2336 -0.0841847 0.952172 1.55461 1 0 1 1 0 0 +EDGE2 5355 2356 0.0613529 0.973971 1.58905 1 0 1 1 0 0 +EDGE2 5355 1516 0.0390864 1.03937 1.58671 1 0 1 1 0 0 +EDGE2 5355 1596 -0.0264495 0.97601 1.56191 1 0 1 1 0 0 +EDGE2 5355 2316 -0.0411541 0.933204 1.59827 1 0 1 1 0 0 +EDGE2 5356 1535 -1.01027 0.0615977 -1.58368 1 0 1 1 0 0 +EDGE2 5356 2395 -0.942611 -0.0565928 1.57232 1 0 1 1 0 0 +EDGE2 5356 5355 -0.973829 -0.0741906 -1.56833 1 0 1 1 0 0 +EDGE2 5356 1855 -1.01268 -0.0655028 1.57293 1 0 1 1 0 0 +EDGE2 5356 2335 -1.0445 0.0754607 -1.58605 1 0 1 1 0 0 +EDGE2 5356 2355 -0.981951 0.0411769 -1.59028 1 0 1 1 0 0 +EDGE2 5356 2375 -0.91897 0.0196725 -1.54608 1 0 1 1 0 0 +EDGE2 5356 2315 -1.03405 0.0514426 1.57105 1 0 1 1 0 0 +EDGE2 5356 1595 -0.884793 -0.0453324 1.5747 1 0 1 1 0 0 +EDGE2 5356 1655 -1.09667 0.0282104 -1.58606 1 0 1 1 0 0 +EDGE2 5356 1575 -0.939522 -0.0865114 1.57759 1 0 1 1 0 0 +EDGE2 5356 1375 -1.08401 -0.0234687 -1.55618 1 0 1 1 0 0 +EDGE2 5356 1515 -1.06364 -0.0252306 -1.57109 1 0 1 1 0 0 +EDGE2 5356 2336 -0.0145274 0.0409928 0.036769 1 0 1 1 0 0 +EDGE2 5356 2356 -0.0644547 0.0202218 -0.0350086 1 0 1 1 0 0 +EDGE2 5356 1516 0.0387661 -0.0428475 0.00678625 1 0 1 1 0 0 +EDGE2 5356 1596 -0.0318968 -0.046929 -0.0174647 1 0 1 1 0 0 +EDGE2 5356 2316 0.0677259 0.0160208 0.000834984 1 0 1 1 0 0 +EDGE2 5356 2337 0.984736 0.0590884 0.0198525 1 0 1 1 0 0 +EDGE2 5356 2357 1.03041 0.00877123 -0.00609663 1 0 1 1 0 0 +EDGE2 5356 1597 0.990739 0.017383 -0.00653955 1 0 1 1 0 0 +EDGE2 5356 2317 1.03472 -0.0538826 -0.0120333 1 0 1 1 0 0 +EDGE2 5356 1517 1.08296 0.0387987 0.00654708 1 0 1 1 0 0 +EDGE2 5357 2336 -0.967809 0.0312888 0.0455579 1 0 1 1 0 0 +EDGE2 5357 5356 -1.04189 0.0253737 -0.0296658 1 0 1 1 0 0 +EDGE2 5357 2356 -0.978982 0.0274554 -0.00872817 1 0 1 1 0 0 +EDGE2 5357 1516 -0.964896 0.00587053 0.00285722 1 0 1 1 0 0 +EDGE2 5357 1596 -0.991998 0.0944316 -0.0158881 1 0 1 1 0 0 +EDGE2 5357 2316 -0.916727 -0.0490594 -0.00328471 1 0 1 1 0 0 +EDGE2 5357 2337 0.00532715 -0.0356397 0.00184589 1 0 1 1 0 0 +EDGE2 5357 2357 0.0310556 0.00289613 0.00119193 1 0 1 1 0 0 +EDGE2 5357 1597 -0.00726499 -0.0461532 0.0278825 1 0 1 1 0 0 +EDGE2 5357 2317 0.038386 0.0831556 0.00825181 1 0 1 1 0 0 +EDGE2 5357 1517 -0.0239218 -0.0631319 0.0495384 1 0 1 1 0 0 +EDGE2 5357 1598 0.981206 -0.0189957 0.0059274 1 0 1 1 0 0 +EDGE2 5357 2338 0.914263 0.0637399 0.0328771 1 0 1 1 0 0 +EDGE2 5357 2358 1.05153 0.0348098 -0.000546989 1 0 1 1 0 0 +EDGE2 5357 2318 0.972139 0.0098768 -0.00454876 1 0 1 1 0 0 +EDGE2 5357 1518 1.03881 -0.00924815 -0.0292266 1 0 1 1 0 0 +EDGE2 5358 2337 -0.992101 0.0595243 0.0153008 1 0 1 1 0 0 +EDGE2 5358 5357 -0.967171 -0.0109926 0.00484677 1 0 1 1 0 0 +EDGE2 5358 2357 -0.991195 -0.023529 -0.0533304 1 0 1 1 0 0 +EDGE2 5358 1597 -1.01226 0.0325361 0.0190724 1 0 1 1 0 0 +EDGE2 5358 2317 -0.967877 0.0687904 -0.0181295 1 0 1 1 0 0 +EDGE2 5358 1517 -0.984959 0.0546131 -0.00681053 1 0 1 1 0 0 +EDGE2 5358 1598 0.00805544 0.0165282 -0.000730116 1 0 1 1 0 0 +EDGE2 5358 2338 -0.0297803 0.0593966 0.0152653 1 0 1 1 0 0 +EDGE2 5358 2358 0.0241087 0.0358288 0.000174938 1 0 1 1 0 0 +EDGE2 5358 2318 0.013265 -0.0218677 0.0164691 1 0 1 1 0 0 +EDGE2 5358 2359 1.04682 -0.0443136 0.0344031 1 0 1 1 0 0 +EDGE2 5358 1518 0.0564908 0.00837974 -0.00300087 1 0 1 1 0 0 +EDGE2 5358 1599 0.970766 0.0117058 -0.00889082 1 0 1 1 0 0 +EDGE2 5358 2319 0.9388 -1.53517e-05 0.0101606 1 0 1 1 0 0 +EDGE2 5358 2339 0.954356 -0.0871386 -0.0263206 1 0 1 1 0 0 +EDGE2 5358 1519 1.05782 -0.0484067 -0.0013937 1 0 1 1 0 0 +EDGE2 5359 1598 -0.939646 0.0168475 -0.0154065 1 0 1 1 0 0 +EDGE2 5359 2338 -1.04845 -0.0379553 0.0248973 1 0 1 1 0 0 +EDGE2 5359 5358 -0.958606 -0.0878194 0.00363748 1 0 1 1 0 0 +EDGE2 5359 2358 -1.05968 0.0351989 0.0137687 1 0 1 1 0 0 +EDGE2 5359 2318 -1.01591 0.0604269 0.00730107 1 0 1 1 0 0 +EDGE2 5359 2359 0.0997926 -0.0105635 0.0114563 1 0 1 1 0 0 +EDGE2 5359 1518 -1.04037 0.00967837 0.00423269 1 0 1 1 0 0 +EDGE2 5359 1599 0.0555691 -0.0266658 -0.00509908 1 0 1 1 0 0 +EDGE2 5359 2319 0.0174963 -0.0422222 0.0141489 1 0 1 1 0 0 +EDGE2 5359 2339 0.0211956 0.0490435 -0.00902317 1 0 1 1 0 0 +EDGE2 5359 1519 0.0030509 0.0172826 -0.0181339 1 0 1 1 0 0 +EDGE2 5359 2340 0.97598 -0.0736224 -0.0172854 1 0 1 1 0 0 +EDGE2 5359 5340 1.02324 0.0716045 -3.14084 1 0 1 1 0 0 +EDGE2 5359 2360 0.916103 0.020559 -0.00525073 1 0 1 1 0 0 +EDGE2 5359 1520 0.913518 0.0827425 0.0210455 1 0 1 1 0 0 +EDGE2 5359 1620 0.980772 0.0255535 -3.13581 1 0 1 1 0 0 +EDGE2 5359 1640 0.988441 0.0136933 -3.13312 1 0 1 1 0 0 +EDGE2 5359 2320 0.877816 -0.0432331 -0.00365173 1 0 1 1 0 0 +EDGE2 5359 1600 0.941473 -0.0235617 0.0233154 1 0 1 1 0 0 +EDGE2 5359 1320 1.02631 -0.00870029 -3.16023 1 0 1 1 0 0 +EDGE2 5360 2359 -0.96279 -0.0837814 -0.00784289 1 0 1 1 0 0 +EDGE2 5360 5359 -1.04401 -0.00903916 0.0257892 1 0 1 1 0 0 +EDGE2 5360 1599 -0.967321 0.00197311 0.00542611 1 0 1 1 0 0 +EDGE2 5360 2319 -1.04745 0.0104856 -0.014172 1 0 1 1 0 0 +EDGE2 5360 2339 -0.924717 0.0202939 -0.00926773 1 0 1 1 0 0 +EDGE2 5360 1519 -1.03191 0.00917458 0.0166788 1 0 1 1 0 0 +EDGE2 5360 2340 -0.0246767 0.00329401 -0.0319088 1 0 1 1 0 0 +EDGE2 5360 2341 0.0192078 1.02784 1.56512 1 0 1 1 0 0 +EDGE2 5360 5341 0.0120011 0.899799 1.54437 1 0 1 1 0 0 +EDGE2 5360 2361 -0.0354443 1.0257 1.54802 1 0 1 1 0 0 +EDGE2 5360 1521 -0.151665 1.04227 1.56326 1 0 1 1 0 0 +EDGE2 5360 1641 -0.0484636 0.984737 1.57026 1 0 1 1 0 0 +EDGE2 5360 2321 0.0245421 0.986666 1.5874 1 0 1 1 0 0 +EDGE2 5360 1321 0.0395176 1.0538 1.58668 1 0 1 1 0 0 +EDGE2 5360 5340 0.0116703 0.013436 -3.17131 1 0 1 1 0 0 +EDGE2 5360 2360 0.0171008 -0.0218443 -0.00882707 1 0 1 1 0 0 +EDGE2 5360 1520 -0.00422555 0.0519515 0.0249986 1 0 1 1 0 0 +EDGE2 5360 1620 0.0165503 -0.0683629 -3.11446 1 0 1 1 0 0 +EDGE2 5360 1640 0.0626927 0.031512 -3.16053 1 0 1 1 0 0 +EDGE2 5360 2320 -0.0361071 -0.0497156 -0.0358524 1 0 1 1 0 0 +EDGE2 5360 1600 0.0548601 -0.0445496 0.0011082 1 0 1 1 0 0 +EDGE2 5360 1621 0.0465223 -0.944293 -1.56366 1 0 1 1 0 0 +EDGE2 5360 1320 -0.0564344 -0.0167008 -3.15063 1 0 1 1 0 0 +EDGE2 5360 1601 0.0298702 -1.0672 -1.5847 1 0 1 1 0 0 +EDGE2 5360 1619 0.975083 -0.055948 -3.15267 1 0 1 1 0 0 +EDGE2 5360 5339 1.03321 -0.0460537 -3.14865 1 0 1 1 0 0 +EDGE2 5360 1639 1.01031 0.0747846 -3.11766 1 0 1 1 0 0 +EDGE2 5360 1319 0.996448 -0.0524514 -3.15431 1 0 1 1 0 0 +EDGE2 5361 2362 1.00796 0.0547018 -0.005241 1 0 1 1 0 0 +EDGE2 5361 5342 0.965823 -0.110621 -0.00313741 1 0 1 1 0 0 +EDGE2 5361 2340 -1.01665 0.010624 -1.60647 1 0 1 1 0 0 +EDGE2 5361 2341 -0.0858563 -0.00398109 -0.0163508 1 0 1 1 0 0 +EDGE2 5361 1322 1.03418 -0.0228199 0.0162368 1 0 1 1 0 0 +EDGE2 5361 1642 0.964346 0.0351097 0.0260437 1 0 1 1 0 0 +EDGE2 5361 2322 1.0393 -0.0358637 0.0311089 1 0 1 1 0 0 +EDGE2 5361 2342 0.945295 -0.0253456 -0.00140748 1 0 1 1 0 0 +EDGE2 5361 1522 0.985217 -0.0217005 -0.00825201 1 0 1 1 0 0 +EDGE2 5361 5341 -0.071304 0.0320662 0.00997648 1 0 1 1 0 0 +EDGE2 5361 2361 0.0338023 -0.0341657 0.00483247 1 0 1 1 0 0 +EDGE2 5361 1521 0.0309583 -0.083478 -0.00401538 1 0 1 1 0 0 +EDGE2 5361 1641 0.025817 -0.0524477 -0.0330336 1 0 1 1 0 0 +EDGE2 5361 2321 0.031263 0.0484347 -0.0155938 1 0 1 1 0 0 +EDGE2 5361 1321 0.00545744 -0.00562864 -0.00378645 1 0 1 1 0 0 +EDGE2 5361 5340 -0.969145 -0.145548 1.55505 1 0 1 1 0 0 +EDGE2 5361 5360 -0.877516 0.0484077 -1.55226 1 0 1 1 0 0 +EDGE2 5361 2360 -0.975841 0.0196524 -1.57521 1 0 1 1 0 0 +EDGE2 5361 1520 -0.931622 0.0335151 -1.56103 1 0 1 1 0 0 +EDGE2 5361 1620 -0.994592 0.0739684 1.56219 1 0 1 1 0 0 +EDGE2 5361 1640 -1.0419 0.0325873 1.52803 1 0 1 1 0 0 +EDGE2 5361 2320 -1.05928 -0.0124286 -1.57805 1 0 1 1 0 0 +EDGE2 5361 1600 -0.978399 0.00670612 -1.57222 1 0 1 1 0 0 +EDGE2 5361 1320 -0.93334 -0.0665041 1.57759 1 0 1 1 0 0 +EDGE2 5362 2362 0.0359201 0.00253408 -0.021022 1 0 1 1 0 0 +EDGE2 5362 2363 0.965632 0.00596367 0.000555495 1 0 1 1 0 0 +EDGE2 5362 5343 1.00295 -0.0168824 -0.0267672 1 0 1 1 0 0 +EDGE2 5362 1323 1.00578 0.00581799 0.0294849 1 0 1 1 0 0 +EDGE2 5362 1643 1.03927 -0.0840771 -0.0469229 1 0 1 1 0 0 +EDGE2 5362 2323 0.976481 0.0516322 0.000446006 1 0 1 1 0 0 +EDGE2 5362 2343 0.923991 -0.00122316 0.00749662 1 0 1 1 0 0 +EDGE2 5362 1523 1.08424 -0.0537024 0.0389174 1 0 1 1 0 0 +EDGE2 5362 5342 0.179329 0.0145942 0.00730088 1 0 1 1 0 0 +EDGE2 5362 2341 -0.996208 -0.0127078 0.000658142 1 0 1 1 0 0 +EDGE2 5362 1322 -0.0938333 0.0206538 -0.00677828 1 0 1 1 0 0 +EDGE2 5362 1642 0.054252 -0.086174 -0.00757787 1 0 1 1 0 0 +EDGE2 5362 2322 -0.0499198 0.0126281 0.0192182 1 0 1 1 0 0 +EDGE2 5362 2342 0.0682042 -0.00504617 -0.0110854 1 0 1 1 0 0 +EDGE2 5362 1522 -0.0313389 -0.100218 0.0175608 1 0 1 1 0 0 +EDGE2 5362 5341 -0.936482 -0.0141151 -0.0327439 1 0 1 1 0 0 +EDGE2 5362 5361 -1.06623 -0.0169293 -0.0291315 1 0 1 1 0 0 +EDGE2 5362 2361 -1.02012 0.00164057 0.00432966 1 0 1 1 0 0 +EDGE2 5362 1521 -1.01586 -0.0129084 0.0319601 1 0 1 1 0 0 +EDGE2 5362 1641 -0.93652 0.0529222 -0.0121571 1 0 1 1 0 0 +EDGE2 5362 2321 -0.985395 0.0882482 -0.00475321 1 0 1 1 0 0 +EDGE2 5362 1321 -0.954745 0.0163848 -0.00432151 1 0 1 1 0 0 +EDGE2 5363 2362 -1.07572 -0.0796243 0.0290436 1 0 1 1 0 0 +EDGE2 5363 5344 0.994922 -0.0573976 -0.0132025 1 0 1 1 0 0 +EDGE2 5363 2363 -0.0523773 -0.0179398 0.013079 1 0 1 1 0 0 +EDGE2 5363 1524 0.993875 -0.0554925 0.00938023 1 0 1 1 0 0 +EDGE2 5363 2324 1.04241 -0.0101768 0.00447452 1 0 1 1 0 0 +EDGE2 5363 2344 0.966582 0.0201014 0.00376326 1 0 1 1 0 0 +EDGE2 5363 2364 0.993177 0.0530598 -0.0150286 1 0 1 1 0 0 +EDGE2 5363 1644 0.939348 0.0687588 -0.010234 1 0 1 1 0 0 +EDGE2 5363 1324 1.00151 0.0349009 0.00743779 1 0 1 1 0 0 +EDGE2 5363 5343 -0.0205467 -0.0912333 0.00239454 1 0 1 1 0 0 +EDGE2 5363 1323 -0.0170213 -0.0286891 0.00751525 1 0 1 1 0 0 +EDGE2 5363 1643 -0.000515064 -0.0366671 0.000546652 1 0 1 1 0 0 +EDGE2 5363 2323 -0.0502788 0.0371756 -0.0281164 1 0 1 1 0 0 +EDGE2 5363 2343 0.00529383 0.0380411 -0.0261166 1 0 1 1 0 0 +EDGE2 5363 1523 -0.0125253 -0.00941479 0.0241377 1 0 1 1 0 0 +EDGE2 5363 5362 -1.1029 0.0707249 0.0246868 1 0 1 1 0 0 +EDGE2 5363 5342 -1.04608 -0.0859134 -0.0146234 1 0 1 1 0 0 +EDGE2 5363 1322 -0.991422 -0.109063 0.00811416 1 0 1 1 0 0 +EDGE2 5363 1642 -1.01811 0.026374 0.0275379 1 0 1 1 0 0 +EDGE2 5363 2322 -1.02293 -0.0673347 -0.00404894 1 0 1 1 0 0 +EDGE2 5363 2342 -1.02245 -0.0157598 -0.0166471 1 0 1 1 0 0 +EDGE2 5363 1522 -1.01882 0.0254016 -0.00871739 1 0 1 1 0 0 +EDGE2 5364 1345 1.06727 -0.0179639 -3.12249 1 0 1 1 0 0 +EDGE2 5364 2345 1.03968 -0.0662889 0.0305686 1 0 1 1 0 0 +EDGE2 5364 5345 1.02252 0.0296137 -0.0180278 1 0 1 1 0 0 +EDGE2 5364 2365 0.833461 0.111362 -0.0142681 1 0 1 1 0 0 +EDGE2 5364 1525 0.993497 0.0089011 0.00583666 1 0 1 1 0 0 +EDGE2 5364 1905 1.06634 0.0770766 -3.16451 1 0 1 1 0 0 +EDGE2 5364 1925 0.958175 -0.0373089 -3.1585 1 0 1 1 0 0 +EDGE2 5364 2325 1.01118 -0.0125719 -0.0142472 1 0 1 1 0 0 +EDGE2 5364 1645 1.00183 0.0168269 -0.010046 1 0 1 1 0 0 +EDGE2 5364 1485 1.03335 0.0143853 -3.10701 1 0 1 1 0 0 +EDGE2 5364 1505 0.914642 0.0478986 -3.13682 1 0 1 1 0 0 +EDGE2 5364 1365 0.98649 0.0610818 -3.15587 1 0 1 1 0 0 +EDGE2 5364 5344 -0.00107905 0.0210296 -0.0224083 1 0 1 1 0 0 +EDGE2 5364 1325 0.942012 -0.0217319 0.00118724 1 0 1 1 0 0 +EDGE2 5364 2363 -0.995629 -0.0246701 -0.0239258 1 0 1 1 0 0 +EDGE2 5364 1524 -0.0110467 0.0428537 0.0210102 1 0 1 1 0 0 +EDGE2 5364 2324 -0.0097709 -0.0398705 0.00247959 1 0 1 1 0 0 +EDGE2 5364 2344 -0.0348628 -0.0150784 -0.00586032 1 0 1 1 0 0 +EDGE2 5364 2364 0.0320644 -0.0444766 -0.0169085 1 0 1 1 0 0 +EDGE2 5364 1644 0.00949167 0.00145496 -0.0291545 1 0 1 1 0 0 +EDGE2 5364 5363 -1.00701 -0.0478829 0.0246721 1 0 1 1 0 0 +EDGE2 5364 1324 -0.0992676 -0.00955671 0.0200815 1 0 1 1 0 0 +EDGE2 5364 5343 -1.00051 0.0219134 -9.21129e-06 1 0 1 1 0 0 +EDGE2 5364 1323 -0.999706 0.0578145 0.0198461 1 0 1 1 0 0 +EDGE2 5364 1643 -0.941761 0.0369264 0.00571897 1 0 1 1 0 0 +EDGE2 5364 2323 -0.998974 -0.0925903 0.0188212 1 0 1 1 0 0 +EDGE2 5364 2343 -1.03202 -0.0316193 0.00366182 1 0 1 1 0 0 +EDGE2 5364 1523 -1.03248 0.0401556 -0.000369436 1 0 1 1 0 0 +EDGE2 5365 1345 0.0339037 0.0655893 -3.1296 1 0 1 1 0 0 +EDGE2 5365 1526 0.0374277 1.04697 1.57081 1 0 1 1 0 0 +EDGE2 5365 2366 0.00969111 1.01298 1.57552 1 0 1 1 0 0 +EDGE2 5365 5346 0.0310638 1.02917 1.55702 1 0 1 1 0 0 +EDGE2 5365 1926 -0.00719292 1.03781 1.59838 1 0 1 1 0 0 +EDGE2 5365 2326 -0.075656 1.06602 1.56355 1 0 1 1 0 0 +EDGE2 5365 2346 -0.0532399 1.08287 1.61159 1 0 1 1 0 0 +EDGE2 5365 1646 -0.0495234 1.13604 1.58751 1 0 1 1 0 0 +EDGE2 5365 1366 -0.0097932 1.04779 1.59423 1 0 1 1 0 0 +EDGE2 5365 1506 -0.0196817 0.940248 1.5667 1 0 1 1 0 0 +EDGE2 5365 1924 1.05677 -0.068623 -3.13381 1 0 1 1 0 0 +EDGE2 5365 2345 0.0323413 -0.0634562 -0.0202834 1 0 1 1 0 0 +EDGE2 5365 1344 0.857818 -0.11091 -3.15649 1 0 1 1 0 0 +EDGE2 5365 1484 1.00067 -0.0306695 -3.13877 1 0 1 1 0 0 +EDGE2 5365 1504 0.926486 0.0607423 -3.08052 1 0 1 1 0 0 +EDGE2 5365 1904 1.05612 0.0674418 -3.14146 1 0 1 1 0 0 +EDGE2 5365 1364 1.00126 0.0133303 -3.16025 1 0 1 1 0 0 +EDGE2 5365 5345 0.040176 0.026263 0.0102688 1 0 1 1 0 0 +EDGE2 5365 2365 0.0138476 -0.0432998 0.012633 1 0 1 1 0 0 +EDGE2 5365 1525 0.0132436 0.0369583 -0.0102653 1 0 1 1 0 0 +EDGE2 5365 1905 0.00644171 -0.0499392 -3.14316 1 0 1 1 0 0 +EDGE2 5365 1925 0.0104126 0.030698 -3.13281 1 0 1 1 0 0 +EDGE2 5365 2325 0.0787568 0.0921305 -0.0169553 1 0 1 1 0 0 +EDGE2 5365 1645 0.00820786 -0.023985 0.000210236 1 0 1 1 0 0 +EDGE2 5365 1485 0.0278486 0.0671921 -3.12484 1 0 1 1 0 0 +EDGE2 5365 1505 -0.00108308 0.0588182 -3.1593 1 0 1 1 0 0 +EDGE2 5365 1365 0.0238953 -0.00248971 -3.11729 1 0 1 1 0 0 +EDGE2 5365 5344 -1.09369 0.0819463 0.0229708 1 0 1 1 0 0 +EDGE2 5365 1325 -0.0781819 -0.0344435 0.0325438 1 0 1 1 0 0 +EDGE2 5365 5364 -1.03641 0.0152041 0.00713221 1 0 1 1 0 0 +EDGE2 5365 1524 -1.06005 -0.00912613 -0.0127462 1 0 1 1 0 0 +EDGE2 5365 2324 -0.960366 -0.0880757 -0.00182712 1 0 1 1 0 0 +EDGE2 5365 2344 -1.00848 -0.141052 -0.00585135 1 0 1 1 0 0 +EDGE2 5365 2364 -0.974492 -0.0255202 0.0235397 1 0 1 1 0 0 +EDGE2 5365 1644 -0.905638 0.0516751 -0.0295405 1 0 1 1 0 0 +EDGE2 5365 1324 -1.00465 0.0421486 0.022451 1 0 1 1 0 0 +EDGE2 5365 1486 -0.00126353 -1.07206 -1.55621 1 0 1 1 0 0 +EDGE2 5365 1906 0.016257 -0.986495 -1.55178 1 0 1 1 0 0 +EDGE2 5365 1326 -0.0601068 -1.07612 -1.59104 1 0 1 1 0 0 +EDGE2 5365 1346 0.0707055 -1.06783 -1.59089 1 0 1 1 0 0 +EDGE2 5366 2327 1.10145 0.0632351 0.00798807 1 0 1 1 0 0 +EDGE2 5366 2367 0.983654 -0.0337532 0.0263416 1 0 1 1 0 0 +EDGE2 5366 5347 0.940141 -0.00055868 -0.0099166 1 0 1 1 0 0 +EDGE2 5366 2347 0.960073 -0.0625997 -0.000605504 1 0 1 1 0 0 +EDGE2 5366 1345 -0.950374 -0.0268322 1.57749 1 0 1 1 0 0 +EDGE2 5366 1526 -0.0122307 -0.015465 -0.0343297 1 0 1 1 0 0 +EDGE2 5366 1507 1.00377 -0.0826072 0.00752204 1 0 1 1 0 0 +EDGE2 5366 1527 0.943393 -0.0172794 -0.0139809 1 0 1 1 0 0 +EDGE2 5366 1647 1.07852 0.0399259 -0.00218544 1 0 1 1 0 0 +EDGE2 5366 1927 1.0499 0.05337 -0.0100703 1 0 1 1 0 0 +EDGE2 5366 2366 -0.0529737 0.055277 -0.0184419 1 0 1 1 0 0 +EDGE2 5366 1367 0.976509 -0.0886834 -0.0157297 1 0 1 1 0 0 +EDGE2 5366 5346 0.0028306 0.0350281 0.015292 1 0 1 1 0 0 +EDGE2 5366 1926 0.0400941 -0.0163919 -0.0167425 1 0 1 1 0 0 +EDGE2 5366 2326 -0.0674528 -0.0933681 0.00702961 1 0 1 1 0 0 +EDGE2 5366 2346 0.0769941 -0.0227006 0.0170507 1 0 1 1 0 0 +EDGE2 5366 1646 0.0289326 0.0232537 -0.00102875 1 0 1 1 0 0 +EDGE2 5366 1366 0.0321492 0.0673368 0.00801324 1 0 1 1 0 0 +EDGE2 5366 1506 0.0230797 0.0555724 -0.016718 1 0 1 1 0 0 +EDGE2 5366 2345 -0.999726 0.00292944 -1.55191 1 0 1 1 0 0 +EDGE2 5366 5345 -0.919926 0.0581348 -1.56564 1 0 1 1 0 0 +EDGE2 5366 5365 -1.08441 0.0410724 -1.57465 1 0 1 1 0 0 +EDGE2 5366 2365 -1.00485 -0.047268 -1.55121 1 0 1 1 0 0 +EDGE2 5366 1525 -0.907136 0.0555 -1.5616 1 0 1 1 0 0 +EDGE2 5366 1905 -1.01876 0.025609 1.56089 1 0 1 1 0 0 +EDGE2 5366 1925 -1.09188 0.0153152 1.59685 1 0 1 1 0 0 +EDGE2 5366 2325 -1.06822 -0.0486326 -1.56319 1 0 1 1 0 0 +EDGE2 5366 1645 -0.99498 0.0262664 -1.56758 1 0 1 1 0 0 +EDGE2 5366 1485 -0.960689 -0.00877858 1.53542 1 0 1 1 0 0 +EDGE2 5366 1505 -0.984038 -0.0072968 1.59437 1 0 1 1 0 0 +EDGE2 5366 1365 -0.957816 0.0695467 1.59369 1 0 1 1 0 0 +EDGE2 5366 1325 -1.12151 0.0129 -1.61827 1 0 1 1 0 0 +EDGE2 5367 2327 -0.0167649 0.052613 -0.00644496 1 0 1 1 0 0 +EDGE2 5367 2368 0.994671 0.0367084 0.0131529 1 0 1 1 0 0 +EDGE2 5367 5348 1.00863 -0.0986892 -0.00896708 1 0 1 1 0 0 +EDGE2 5367 1648 0.966397 0.00506284 0.0229458 1 0 1 1 0 0 +EDGE2 5367 1928 1.03866 -0.0337404 0.0124164 1 0 1 1 0 0 +EDGE2 5367 2328 1.05276 0.0516968 -0.0095694 1 0 1 1 0 0 +EDGE2 5367 2348 0.985575 0.108698 -0.010701 1 0 1 1 0 0 +EDGE2 5367 1368 0.960616 0.0846711 0.0248237 1 0 1 1 0 0 +EDGE2 5367 1508 0.946338 0.0123547 -0.0313951 1 0 1 1 0 0 +EDGE2 5367 1528 0.993091 -0.0275399 0.016511 1 0 1 1 0 0 +EDGE2 5367 2367 0.0653447 0.039254 -0.00332446 1 0 1 1 0 0 +EDGE2 5367 5347 0.0201816 -0.0521676 -0.0270286 1 0 1 1 0 0 +EDGE2 5367 2347 0.087218 0.00838674 0.0128718 1 0 1 1 0 0 +EDGE2 5367 1526 -0.985034 0.05165 0.0203658 1 0 1 1 0 0 +EDGE2 5367 1507 0.0135763 0.0393429 -0.0201208 1 0 1 1 0 0 +EDGE2 5367 1527 0.0443448 -0.0234698 -0.0197167 1 0 1 1 0 0 +EDGE2 5367 1647 -0.0687758 -0.109 0.0114701 1 0 1 1 0 0 +EDGE2 5367 1927 0.0155886 -0.0349697 -0.0329869 1 0 1 1 0 0 +EDGE2 5367 2366 -0.949915 -0.0397454 0.00510707 1 0 1 1 0 0 +EDGE2 5367 5366 -0.935242 0.0474172 -0.0385543 1 0 1 1 0 0 +EDGE2 5367 1367 0.0173514 0.0594745 0.00767376 1 0 1 1 0 0 +EDGE2 5367 5346 -0.974174 -0.0445942 -0.00998095 1 0 1 1 0 0 +EDGE2 5367 1926 -0.948265 0.0282023 0.0068106 1 0 1 1 0 0 +EDGE2 5367 2326 -0.94833 0.0685699 0.00100522 1 0 1 1 0 0 +EDGE2 5367 2346 -1.01576 0.0212657 0.0157897 1 0 1 1 0 0 +EDGE2 5367 1646 -0.940701 0.0642878 -0.0229184 1 0 1 1 0 0 +EDGE2 5367 1366 -1.05465 -0.0434631 0.011306 1 0 1 1 0 0 +EDGE2 5367 1506 -1.0347 -0.0610059 0.0076498 1 0 1 1 0 0 +EDGE2 5368 2327 -0.938524 -0.0349974 -0.0244683 1 0 1 1 0 0 +EDGE2 5368 2368 0.0550564 0.000827312 -0.00643305 1 0 1 1 0 0 +EDGE2 5368 2349 1.00161 -0.00195047 0.00887686 1 0 1 1 0 0 +EDGE2 5368 2369 1.07129 -0.0607027 -0.0233984 1 0 1 1 0 0 +EDGE2 5368 5349 1.01138 0.0857064 -0.00975452 1 0 1 1 0 0 +EDGE2 5368 1509 1.04091 -0.0632658 -0.00763086 1 0 1 1 0 0 +EDGE2 5368 1649 0.993376 -0.0149752 -0.00721723 1 0 1 1 0 0 +EDGE2 5368 1929 1.07255 -0.0251697 0.0165628 1 0 1 1 0 0 +EDGE2 5368 2329 1.00326 0.00280931 0.0187006 1 0 1 1 0 0 +EDGE2 5368 1529 1.0346 0.0393343 -0.0057355 1 0 1 1 0 0 +EDGE2 5368 1369 1.08141 0.0653566 -0.00799091 1 0 1 1 0 0 +EDGE2 5368 5348 0.0241357 -0.0632441 -0.000413459 1 0 1 1 0 0 +EDGE2 5368 1648 -0.0481918 0.0568251 0.000777933 1 0 1 1 0 0 +EDGE2 5368 1928 -0.0455111 0.0152827 0.0115522 1 0 1 1 0 0 +EDGE2 5368 2328 0.0968475 -0.086218 0.0191393 1 0 1 1 0 0 +EDGE2 5368 2348 0.0440024 0.0164668 0.0125875 1 0 1 1 0 0 +EDGE2 5368 5367 -1.03052 0.0696638 -0.021729 1 0 1 1 0 0 +EDGE2 5368 1368 -0.0286784 -0.0464808 0.0095057 1 0 1 1 0 0 +EDGE2 5368 1508 -0.00258463 -0.0495823 -0.020532 1 0 1 1 0 0 +EDGE2 5368 1528 0.0111104 -0.010744 0.0230015 1 0 1 1 0 0 +EDGE2 5368 2367 -0.998741 0.0108972 -0.0088614 1 0 1 1 0 0 +EDGE2 5368 5347 -1.00652 0.0487923 0.00507264 1 0 1 1 0 0 +EDGE2 5368 2347 -1.07804 0.0979274 -0.00919162 1 0 1 1 0 0 +EDGE2 5368 1507 -1.07102 -0.02419 -0.0449054 1 0 1 1 0 0 +EDGE2 5368 1527 -1.11624 0.0610809 -0.00822761 1 0 1 1 0 0 +EDGE2 5368 1647 -1.02574 0.0439816 -0.0198401 1 0 1 1 0 0 +EDGE2 5368 1927 -0.974936 0.0166689 0.0358856 1 0 1 1 0 0 +EDGE2 5368 1367 -1.00864 -0.0875293 0.0108858 1 0 1 1 0 0 +EDGE2 5369 2330 1.0813 -0.0471958 0.0333312 1 0 1 1 0 0 +EDGE2 5369 2370 0.972143 -0.0316124 -0.00641363 1 0 1 1 0 0 +EDGE2 5369 5350 0.975583 -0.0275866 0.0324915 1 0 1 1 0 0 +EDGE2 5369 2350 1.05614 -0.0241177 0.0145908 1 0 1 1 0 0 +EDGE2 5369 1650 1.01153 0.0457851 0.0286349 1 0 1 1 0 0 +EDGE2 5369 1710 1.0472 -0.03049 -3.10774 1 0 1 1 0 0 +EDGE2 5369 1870 0.989279 -0.0282738 -3.11572 1 0 1 1 0 0 +EDGE2 5369 1930 1.00344 0.0371076 0.0116144 1 0 1 1 0 0 +EDGE2 5369 1670 0.966579 -0.0622048 -3.12577 1 0 1 1 0 0 +EDGE2 5369 1470 1.06541 0.0132305 -3.16122 1 0 1 1 0 0 +EDGE2 5369 1510 1.06797 0.0544645 0.0132201 1 0 1 1 0 0 +EDGE2 5369 1530 0.94812 0.0041083 -0.0118266 1 0 1 1 0 0 +EDGE2 5369 1370 0.94517 0.0161528 -0.0220803 1 0 1 1 0 0 +EDGE2 5369 2368 -1.07046 0.0135433 0.0183473 1 0 1 1 0 0 +EDGE2 5369 2349 -0.0658418 0.0338475 0.0285728 1 0 1 1 0 0 +EDGE2 5369 2369 0.0144585 0.055888 0.0075708 1 0 1 1 0 0 +EDGE2 5369 5349 0.0171902 0.0670898 -0.00823993 1 0 1 1 0 0 +EDGE2 5369 1509 0.111858 -0.0457036 0.000291339 1 0 1 1 0 0 +EDGE2 5369 1649 -0.00692118 0.0417087 -0.000201288 1 0 1 1 0 0 +EDGE2 5369 1929 -0.0324366 -0.04062 0.00966486 1 0 1 1 0 0 +EDGE2 5369 2329 0.0406658 -0.0361686 0.00127135 1 0 1 1 0 0 +EDGE2 5369 1529 -0.0282874 -0.0210769 -0.00606008 1 0 1 1 0 0 +EDGE2 5369 5368 -0.868232 0.0580388 0.0136554 1 0 1 1 0 0 +EDGE2 5369 1369 -0.0317713 0.0802725 -0.013183 1 0 1 1 0 0 +EDGE2 5369 5348 -0.983543 0.0195411 -0.00928822 1 0 1 1 0 0 +EDGE2 5369 1648 -1.03214 -0.0456163 0.00544127 1 0 1 1 0 0 +EDGE2 5369 1928 -1.04657 -0.0688023 -0.0023792 1 0 1 1 0 0 +EDGE2 5369 2328 -0.988824 0.00098657 -0.0238342 1 0 1 1 0 0 +EDGE2 5369 2348 -0.991242 0.0183567 0.00850526 1 0 1 1 0 0 +EDGE2 5369 1368 -0.985308 0.0148843 0.00532344 1 0 1 1 0 0 +EDGE2 5369 1508 -1.06098 -0.0357213 -0.0298488 1 0 1 1 0 0 +EDGE2 5369 1528 -1.016 0.0830676 0.0137289 1 0 1 1 0 0 +EDGE2 5370 1931 -0.0180914 -1.04451 -1.56633 1 0 1 1 0 0 +EDGE2 5370 1669 1.0069 -0.047968 -3.15473 1 0 1 1 0 0 +EDGE2 5370 1709 0.920947 -0.0852669 -3.1582 1 0 1 1 0 0 +EDGE2 5370 1869 0.991271 0.00612572 -3.13569 1 0 1 1 0 0 +EDGE2 5370 1469 0.888932 -0.0306546 -3.13226 1 0 1 1 0 0 +EDGE2 5370 2330 -0.0104933 0.00662928 0.00480552 1 0 1 1 0 0 +EDGE2 5370 1671 0.0221315 -0.953424 -1.55478 1 0 1 1 0 0 +EDGE2 5370 1711 -0.0413316 -1.05036 -1.57875 1 0 1 1 0 0 +EDGE2 5370 1871 -0.0876393 -1.04224 -1.58138 1 0 1 1 0 0 +EDGE2 5370 1471 0.0290209 -1.01372 -1.53175 1 0 1 1 0 0 +EDGE2 5370 2370 -0.0118816 0.0567607 -0.0227181 1 0 1 1 0 0 +EDGE2 5370 5350 -0.108367 0.0461917 0.0125518 1 0 1 1 0 0 +EDGE2 5370 2350 0.00217232 0.0298675 0.0102408 1 0 1 1 0 0 +EDGE2 5370 1650 -0.0233926 -0.0323689 0.00831288 1 0 1 1 0 0 +EDGE2 5370 1710 -0.0165057 -0.0104084 -3.14622 1 0 1 1 0 0 +EDGE2 5370 1870 -0.0298081 0.0528368 -3.16405 1 0 1 1 0 0 +EDGE2 5370 1930 -0.0599929 -0.0170079 0.0249519 1 0 1 1 0 0 +EDGE2 5370 1670 0.0754409 -0.00039245 -3.12127 1 0 1 1 0 0 +EDGE2 5370 1470 0.0463087 -0.00333888 -3.12875 1 0 1 1 0 0 +EDGE2 5370 1510 0.0144345 0.0301597 -0.00114387 1 0 1 1 0 0 +EDGE2 5370 1530 0.0216622 0.0326366 -0.0164648 1 0 1 1 0 0 +EDGE2 5370 1370 0.0769887 -0.0192618 -0.00376307 1 0 1 1 0 0 +EDGE2 5370 2351 0.00141213 0.964768 1.56809 1 0 1 1 0 0 +EDGE2 5370 2371 -0.00761244 0.956825 1.58674 1 0 1 1 0 0 +EDGE2 5370 5351 0.017282 1.11839 1.56966 1 0 1 1 0 0 +EDGE2 5370 1371 0.0564469 0.928624 1.57296 1 0 1 1 0 0 +EDGE2 5370 1531 0.0102547 1.01758 1.55877 1 0 1 1 0 0 +EDGE2 5370 1651 -0.0190721 0.956926 1.58117 1 0 1 1 0 0 +EDGE2 5370 2331 0.0543106 1.03004 1.58598 1 0 1 1 0 0 +EDGE2 5370 1511 0.0184616 0.997989 1.55997 1 0 1 1 0 0 +EDGE2 5370 2349 -0.964867 -0.103758 0.0212956 1 0 1 1 0 0 +EDGE2 5370 2369 -1.01365 0.093863 -0.00562583 1 0 1 1 0 0 +EDGE2 5370 5349 -1.05591 -0.00831331 -0.00979433 1 0 1 1 0 0 +EDGE2 5370 5369 -1.02294 -0.0439232 0.0171254 1 0 1 1 0 0 +EDGE2 5370 1509 -0.970902 0.00312254 -0.00947483 1 0 1 1 0 0 +EDGE2 5370 1649 -0.955265 -0.0306012 0.0115331 1 0 1 1 0 0 +EDGE2 5370 1929 -1.02431 0.0793217 0.00740907 1 0 1 1 0 0 +EDGE2 5370 2329 -0.995318 -0.0687338 0.0250975 1 0 1 1 0 0 +EDGE2 5370 1529 -0.952763 -0.0100746 0.0114336 1 0 1 1 0 0 +EDGE2 5370 1369 -1.03315 0.113216 0.00114804 1 0 1 1 0 0 +EDGE2 5371 2372 1.07825 0.098395 0.0282109 1 0 1 1 0 0 +EDGE2 5371 2330 -1.14153 0.034339 -1.582 1 0 1 1 0 0 +EDGE2 5371 2370 -1.04611 -0.0377041 -1.57791 1 0 1 1 0 0 +EDGE2 5371 5350 -0.970621 -0.0173809 -1.56954 1 0 1 1 0 0 +EDGE2 5371 5370 -1.00174 0.0726786 -1.59313 1 0 1 1 0 0 +EDGE2 5371 2350 -0.99431 0.00666825 -1.56833 1 0 1 1 0 0 +EDGE2 5371 1650 -1.0086 -0.0449277 -1.58415 1 0 1 1 0 0 +EDGE2 5371 1710 -1.02985 0.0192096 1.5598 1 0 1 1 0 0 +EDGE2 5371 1870 -1.00652 0.0501154 1.56999 1 0 1 1 0 0 +EDGE2 5371 1930 -1.16624 0.0292128 -1.58777 1 0 1 1 0 0 +EDGE2 5371 1670 -1.02697 0.045469 1.56554 1 0 1 1 0 0 +EDGE2 5371 1470 -0.975702 0.0326682 1.59417 1 0 1 1 0 0 +EDGE2 5371 1510 -1.02094 0.109664 -1.57196 1 0 1 1 0 0 +EDGE2 5371 1530 -0.924049 0.0144008 -1.57159 1 0 1 1 0 0 +EDGE2 5371 1370 -1.00492 0.0446594 -1.59095 1 0 1 1 0 0 +EDGE2 5371 2351 0.0268986 -0.0347173 0.0265632 1 0 1 1 0 0 +EDGE2 5371 2371 0.0440162 -0.0409836 0.0286057 1 0 1 1 0 0 +EDGE2 5371 5351 -0.0158186 0.0616501 0.0110816 1 0 1 1 0 0 +EDGE2 5371 1371 -0.0682101 0.071678 -0.0218886 1 0 1 1 0 0 +EDGE2 5371 1531 -0.0127274 0.0167837 -0.00143217 1 0 1 1 0 0 +EDGE2 5371 1651 -0.00478546 0.0603061 -0.0144357 1 0 1 1 0 0 +EDGE2 5371 2331 0.00163586 0.00592093 0.0151126 1 0 1 1 0 0 +EDGE2 5371 1511 -0.0392992 0.0466598 -0.00860066 1 0 1 1 0 0 +EDGE2 5371 5352 0.977587 0.0320872 0.00170963 1 0 1 1 0 0 +EDGE2 5371 1512 1.03785 0.0101212 -0.0220909 1 0 1 1 0 0 +EDGE2 5371 1652 1.0829 0.00590621 0.0193041 1 0 1 1 0 0 +EDGE2 5371 2332 0.939321 0.0345065 0.0102857 1 0 1 1 0 0 +EDGE2 5371 2352 1.10407 0.000671032 -0.0193802 1 0 1 1 0 0 +EDGE2 5371 1532 0.948125 -0.0215079 -0.0335224 1 0 1 1 0 0 +EDGE2 5371 1372 1.00094 0.0393167 -0.0100082 1 0 1 1 0 0 +EDGE2 5372 2372 0.0246212 -0.0492713 -0.0114854 1 0 1 1 0 0 +EDGE2 5372 2351 -1.12574 -0.0414194 -0.00771053 1 0 1 1 0 0 +EDGE2 5372 2371 -1.01156 0.0395691 -0.0262546 1 0 1 1 0 0 +EDGE2 5372 5351 -1.03116 -0.0278914 -0.0100773 1 0 1 1 0 0 +EDGE2 5372 5371 -0.990438 0.000457975 0.00286429 1 0 1 1 0 0 +EDGE2 5372 1371 -1.06146 0.0373759 -0.00979965 1 0 1 1 0 0 +EDGE2 5372 1531 -0.989721 -0.0238927 -0.0254856 1 0 1 1 0 0 +EDGE2 5372 1651 -0.900128 -0.0427753 -0.0414549 1 0 1 1 0 0 +EDGE2 5372 2331 -0.95804 -0.0430025 -0.00450239 1 0 1 1 0 0 +EDGE2 5372 1511 -1.00633 0.0494132 -0.0382514 1 0 1 1 0 0 +EDGE2 5372 5352 -0.0310236 -0.0609141 -0.00391062 1 0 1 1 0 0 +EDGE2 5372 2373 0.953636 0.000764798 0.00975508 1 0 1 1 0 0 +EDGE2 5372 1512 0.0189508 0.0296123 -0.0131852 1 0 1 1 0 0 +EDGE2 5372 1652 0.0494312 -0.0963543 -0.00863729 1 0 1 1 0 0 +EDGE2 5372 2332 0.0437813 -0.00217522 0.0357788 1 0 1 1 0 0 +EDGE2 5372 2352 0.0595233 0.060749 -0.017355 1 0 1 1 0 0 +EDGE2 5372 1532 0.0498155 -0.0256504 -0.000214751 1 0 1 1 0 0 +EDGE2 5372 1372 0.0391836 -0.00546827 -0.000350513 1 0 1 1 0 0 +EDGE2 5372 5353 1.01881 -0.0564266 -0.0455723 1 0 1 1 0 0 +EDGE2 5372 1513 1.01309 0.0660489 0.0117154 1 0 1 1 0 0 +EDGE2 5372 1653 1.0502 -0.00613311 0.0127382 1 0 1 1 0 0 +EDGE2 5372 2333 0.999065 -0.0287791 0.0301918 1 0 1 1 0 0 +EDGE2 5372 2353 1.03989 -0.12127 0.0161408 1 0 1 1 0 0 +EDGE2 5372 1533 1.04938 0.100387 0.00573777 1 0 1 1 0 0 +EDGE2 5372 1373 0.900167 0.0564052 -0.0175992 1 0 1 1 0 0 +EDGE2 5373 2372 -0.989176 0.016503 0.0190928 1 0 1 1 0 0 +EDGE2 5373 5372 -1.09283 0.0879684 -0.0333765 1 0 1 1 0 0 +EDGE2 5373 5352 -1.02457 -0.0513027 0.00269372 1 0 1 1 0 0 +EDGE2 5373 2374 0.927785 -0.0520757 -0.0178126 1 0 1 1 0 0 +EDGE2 5373 2373 -0.0772065 -0.0704846 -0.0178496 1 0 1 1 0 0 +EDGE2 5373 1512 -1.0118 0.045466 0.0530957 1 0 1 1 0 0 +EDGE2 5373 1652 -0.998117 0.0483453 0.0175275 1 0 1 1 0 0 +EDGE2 5373 2332 -0.994164 -0.0900503 -0.0338522 1 0 1 1 0 0 +EDGE2 5373 2352 -0.984053 0.00263189 -0.0020854 1 0 1 1 0 0 +EDGE2 5373 1532 -0.935669 -0.079178 -0.0307272 1 0 1 1 0 0 +EDGE2 5373 1372 -0.949722 0.0730891 -0.00840928 1 0 1 1 0 0 +EDGE2 5373 5353 -0.0483002 -0.00795863 0.0311557 1 0 1 1 0 0 +EDGE2 5373 1513 -0.0237863 0.0514552 -0.00696275 1 0 1 1 0 0 +EDGE2 5373 1653 -0.123756 -0.0453335 0.00824456 1 0 1 1 0 0 +EDGE2 5373 2333 -0.00508702 0.0465255 -0.00659992 1 0 1 1 0 0 +EDGE2 5373 2353 0.00665362 0.0178324 0.00162306 1 0 1 1 0 0 +EDGE2 5373 1533 -0.0649352 0.0310784 0.0300407 1 0 1 1 0 0 +EDGE2 5373 1373 0.0712206 0.00558515 -0.00630715 1 0 1 1 0 0 +EDGE2 5373 5354 0.955183 0.0141913 0.0222669 1 0 1 1 0 0 +EDGE2 5373 1514 1.0159 0.0115075 -0.00928246 1 0 1 1 0 0 +EDGE2 5373 1654 0.979133 -0.0541374 0.00157999 1 0 1 1 0 0 +EDGE2 5373 2334 1.12944 0.0437438 -0.000325756 1 0 1 1 0 0 +EDGE2 5373 2354 1.07437 -0.0338632 0.0384607 1 0 1 1 0 0 +EDGE2 5373 1534 0.927789 0.0157723 0.0469867 1 0 1 1 0 0 +EDGE2 5373 1374 1.00894 0.0290094 -0.0228028 1 0 1 1 0 0 +EDGE2 5374 1535 1.02365 -0.0242446 -0.0230415 1 0 1 1 0 0 +EDGE2 5374 2374 0.0177403 0.024489 0.0132338 1 0 1 1 0 0 +EDGE2 5374 2373 -1.04784 -0.0438177 -0.0124363 1 0 1 1 0 0 +EDGE2 5374 5373 -1.15002 -0.0713096 0.0347617 1 0 1 1 0 0 +EDGE2 5374 5353 -0.998832 0.0762094 0.0229683 1 0 1 1 0 0 +EDGE2 5374 1513 -1.03185 0.0323194 0.02183 1 0 1 1 0 0 +EDGE2 5374 1653 -0.981064 -0.015099 0.0153798 1 0 1 1 0 0 +EDGE2 5374 2333 -1.0468 -0.0429556 0.0522505 1 0 1 1 0 0 +EDGE2 5374 2353 -1.02236 -0.0260605 -0.00341821 1 0 1 1 0 0 +EDGE2 5374 1533 -0.95782 -0.0606985 -0.0250172 1 0 1 1 0 0 +EDGE2 5374 1373 -0.979342 0.138352 0.00120765 1 0 1 1 0 0 +EDGE2 5374 5354 -0.0892338 0.0268234 -0.0335679 1 0 1 1 0 0 +EDGE2 5374 2395 1.029 0.0227313 -3.13941 1 0 1 1 0 0 +EDGE2 5374 1514 0.00851111 -0.0708502 -0.0240447 1 0 1 1 0 0 +EDGE2 5374 1654 -0.0520649 0.0102849 0.0150735 1 0 1 1 0 0 +EDGE2 5374 2334 0.0327096 0.0277534 -0.00919998 1 0 1 1 0 0 +EDGE2 5374 2354 0.0108905 0.0640482 -0.0290118 1 0 1 1 0 0 +EDGE2 5374 1534 0.116184 -0.0260462 0.00423755 1 0 1 1 0 0 +EDGE2 5374 1374 -0.000242649 -0.00902269 0.0235575 1 0 1 1 0 0 +EDGE2 5374 5355 0.956274 -0.0742825 -0.0153467 1 0 1 1 0 0 +EDGE2 5374 1855 1.05935 -0.00960727 -3.16595 1 0 1 1 0 0 +EDGE2 5374 2335 1.01163 -0.00703557 0.0274235 1 0 1 1 0 0 +EDGE2 5374 2355 1.0051 -0.0962056 -0.00876148 1 0 1 1 0 0 +EDGE2 5374 2375 0.999913 -0.000470671 -0.026405 1 0 1 1 0 0 +EDGE2 5374 2315 0.968653 -0.0338748 -3.1362 1 0 1 1 0 0 +EDGE2 5374 1595 0.945986 0.01135 -3.1362 1 0 1 1 0 0 +EDGE2 5374 1655 0.959464 -0.0129217 0.0326768 1 0 1 1 0 0 +EDGE2 5374 1575 0.955895 0.0375905 -3.12172 1 0 1 1 0 0 +EDGE2 5374 1375 0.981977 0.103316 -0.0375984 1 0 1 1 0 0 +EDGE2 5374 1515 1.01059 0.036876 -0.0127373 1 0 1 1 0 0 +EDGE2 5375 1656 -0.0556171 -1.05626 -1.5943 1 0 1 1 0 0 +EDGE2 5375 2376 0.00104186 -1.01446 -1.5692 1 0 1 1 0 0 +EDGE2 5375 2396 -0.115397 -1.10266 -1.56516 1 0 1 1 0 0 +EDGE2 5375 1856 0.104429 -0.958318 -1.53286 1 0 1 1 0 0 +EDGE2 5375 1536 -0.000364539 -1.05636 -1.59699 1 0 1 1 0 0 +EDGE2 5375 1576 0.00526769 -1.06166 -1.56176 1 0 1 1 0 0 +EDGE2 5375 1376 -0.0221627 -1.03492 -1.54036 1 0 1 1 0 0 +EDGE2 5375 1535 0.0157152 -0.00549746 0.0100317 1 0 1 1 0 0 +EDGE2 5375 2374 -0.950393 -0.0333538 -0.000733157 1 0 1 1 0 0 +EDGE2 5375 5374 -1.05867 0.0760959 0.00167572 1 0 1 1 0 0 +EDGE2 5375 5354 -0.931584 -0.0455614 -0.0130566 1 0 1 1 0 0 +EDGE2 5375 2395 -0.0526979 0.083914 -3.15733 1 0 1 1 0 0 +EDGE2 5375 1514 -0.95315 -0.0339592 -0.00478332 1 0 1 1 0 0 +EDGE2 5375 1654 -0.963776 0.0099668 -0.0345672 1 0 1 1 0 0 +EDGE2 5375 2334 -1.05797 -0.0115743 0.0191546 1 0 1 1 0 0 +EDGE2 5375 2354 -1.00303 -0.0110762 -0.024308 1 0 1 1 0 0 +EDGE2 5375 1534 -1.0069 -0.0286641 -0.00372714 1 0 1 1 0 0 +EDGE2 5375 1374 -1.03629 0.0279969 0.0180201 1 0 1 1 0 0 +EDGE2 5375 5355 0.0246584 0.10984 0.0386169 1 0 1 1 0 0 +EDGE2 5375 1855 0.00828703 -0.0791871 -3.12516 1 0 1 1 0 0 +EDGE2 5375 2335 -0.0359535 0.00219279 0.0240962 1 0 1 1 0 0 +EDGE2 5375 2355 -0.0227749 -0.0193484 0.0394455 1 0 1 1 0 0 +EDGE2 5375 2375 0.0295828 -0.0139606 -0.00659739 1 0 1 1 0 0 +EDGE2 5375 2315 -0.0690865 -0.0975116 -3.12717 1 0 1 1 0 0 +EDGE2 5375 1595 -0.0135331 0.0192076 -3.15924 1 0 1 1 0 0 +EDGE2 5375 1655 0.0199218 0.114886 0.00213399 1 0 1 1 0 0 +EDGE2 5375 1575 -0.030498 0.00246301 -3.12048 1 0 1 1 0 0 +EDGE2 5375 1854 1.043 -0.109104 -3.10892 1 0 1 1 0 0 +EDGE2 5375 2394 0.966926 0.0910479 -3.13183 1 0 1 1 0 0 +EDGE2 5375 1375 0.0529246 -0.039138 -0.00583203 1 0 1 1 0 0 +EDGE2 5375 1515 0.0206497 0.0559545 -0.00437367 1 0 1 1 0 0 +EDGE2 5375 2314 1.07059 -0.125868 -3.15308 1 0 1 1 0 0 +EDGE2 5375 1574 0.977925 -0.0278275 -3.12986 1 0 1 1 0 0 +EDGE2 5375 1594 1.06809 0.0234074 -3.11027 1 0 1 1 0 0 +EDGE2 5375 2336 0.0161519 1.0086 1.56807 1 0 1 1 0 0 +EDGE2 5375 5356 0.0277305 0.954237 1.57742 1 0 1 1 0 0 +EDGE2 5375 2356 0.0328522 0.991618 1.57524 1 0 1 1 0 0 +EDGE2 5375 1516 0.0522283 0.960832 1.56425 1 0 1 1 0 0 +EDGE2 5375 1596 -0.0194236 1.09173 1.52231 1 0 1 1 0 0 +EDGE2 5375 2316 -0.0060935 0.955548 1.58151 1 0 1 1 0 0 +EDGE2 5376 1535 -0.937976 0.00781479 -1.55641 1 0 1 1 0 0 +EDGE2 5376 2395 -0.905821 -0.00524753 1.54646 1 0 1 1 0 0 +EDGE2 5376 5375 -1.02352 -0.0166695 -1.56056 1 0 1 1 0 0 +EDGE2 5376 5355 -0.973897 -0.0195703 -1.56689 1 0 1 1 0 0 +EDGE2 5376 1855 -1.00989 0.0022907 1.58087 1 0 1 1 0 0 +EDGE2 5376 2335 -0.992984 -0.0280034 -1.568 1 0 1 1 0 0 +EDGE2 5376 2355 -0.962835 -0.0445815 -1.55214 1 0 1 1 0 0 +EDGE2 5376 2375 -1.04357 -0.0305148 -1.57008 1 0 1 1 0 0 +EDGE2 5376 2315 -0.929223 -0.0169684 1.59419 1 0 1 1 0 0 +EDGE2 5376 1595 -0.997453 0.00139419 1.55016 1 0 1 1 0 0 +EDGE2 5376 1655 -0.9785 -0.00375989 -1.55466 1 0 1 1 0 0 +EDGE2 5376 1575 -0.921815 -0.0648236 1.567 1 0 1 1 0 0 +EDGE2 5376 1375 -0.99061 -0.0380354 -1.55695 1 0 1 1 0 0 +EDGE2 5376 1515 -1.01018 0.000536244 -1.58748 1 0 1 1 0 0 +EDGE2 5376 2336 0.0249237 0.0406837 -0.00754855 1 0 1 1 0 0 +EDGE2 5376 5356 0.0218196 0.00526519 0.0171177 1 0 1 1 0 0 +EDGE2 5376 2356 -0.0365032 0.0276465 -0.0425344 1 0 1 1 0 0 +EDGE2 5376 1516 -0.0358062 0.102443 -0.0140868 1 0 1 1 0 0 +EDGE2 5376 1596 -0.0351912 0.00575366 0.00945043 1 0 1 1 0 0 +EDGE2 5376 2316 0.0755287 -0.0211801 -0.0247006 1 0 1 1 0 0 +EDGE2 5376 2337 0.920302 0.00644993 -0.0222084 1 0 1 1 0 0 +EDGE2 5376 5357 1.03211 0.0321196 -0.0254141 1 0 1 1 0 0 +EDGE2 5376 2357 0.936486 0.0238493 0.00196092 1 0 1 1 0 0 +EDGE2 5376 1597 0.967968 0.0849285 -0.0216163 1 0 1 1 0 0 +EDGE2 5376 2317 1.00248 0.112898 0.0140292 1 0 1 1 0 0 +EDGE2 5376 1517 1.0172 -0.0476441 0.0164577 1 0 1 1 0 0 +EDGE2 5377 2336 -0.982642 -0.0216192 -0.0109334 1 0 1 1 0 0 +EDGE2 5377 5356 -1.08382 -0.0324569 0.00744194 1 0 1 1 0 0 +EDGE2 5377 5376 -1.00633 0.0579398 0.0160702 1 0 1 1 0 0 +EDGE2 5377 2356 -0.928812 -0.0106398 -0.0391062 1 0 1 1 0 0 +EDGE2 5377 1516 -1.01208 0.0697055 -0.0300478 1 0 1 1 0 0 +EDGE2 5377 1596 -0.923385 -0.0521669 0.00714353 1 0 1 1 0 0 +EDGE2 5377 2316 -0.955233 -0.0309956 -0.00156164 1 0 1 1 0 0 +EDGE2 5377 2337 0.0251785 0.00305091 -0.00591938 1 0 1 1 0 0 +EDGE2 5377 5357 -0.0182361 0.146122 -0.0176037 1 0 1 1 0 0 +EDGE2 5377 2357 0.0612095 -0.0141405 -0.0293932 1 0 1 1 0 0 +EDGE2 5377 1597 0.0188915 -0.026067 -0.024327 1 0 1 1 0 0 +EDGE2 5377 2317 0.0204008 0.0210223 -0.00127553 1 0 1 1 0 0 +EDGE2 5377 1517 0.000647666 0.0791275 0.00769902 1 0 1 1 0 0 +EDGE2 5377 1598 0.902143 -0.101738 -0.000913272 1 0 1 1 0 0 +EDGE2 5377 2338 1.0913 -0.046047 0.01109 1 0 1 1 0 0 +EDGE2 5377 5358 1.02856 0.0307421 -0.0115397 1 0 1 1 0 0 +EDGE2 5377 2358 0.990879 -0.000744663 0.00466871 1 0 1 1 0 0 +EDGE2 5377 2318 0.974965 -0.0284082 -0.00205491 1 0 1 1 0 0 +EDGE2 5377 1518 0.934152 -0.0225189 0.0130439 1 0 1 1 0 0 +EDGE2 5378 5377 -0.991165 0.0498183 0.00737217 1 0 1 1 0 0 +EDGE2 5378 2337 -0.95444 0.0489246 -0.0143158 1 0 1 1 0 0 +EDGE2 5378 5357 -1.07782 0.0163764 -0.000255989 1 0 1 1 0 0 +EDGE2 5378 2357 -0.994489 0.00500796 0.00306796 1 0 1 1 0 0 +EDGE2 5378 1597 -0.926231 -0.079093 0.015085 1 0 1 1 0 0 +EDGE2 5378 2317 -0.95342 -0.0455727 0.0531715 1 0 1 1 0 0 +EDGE2 5378 1517 -1.04673 -0.0476384 0.012313 1 0 1 1 0 0 +EDGE2 5378 1598 -0.00287249 -0.000869226 0.00448438 1 0 1 1 0 0 +EDGE2 5378 2338 0.0124059 0.0314147 -0.0144043 1 0 1 1 0 0 +EDGE2 5378 5358 -0.0633707 0.00683017 -0.0346791 1 0 1 1 0 0 +EDGE2 5378 2358 -0.034885 -0.0320023 0.0108064 1 0 1 1 0 0 +EDGE2 5378 2318 -0.0259527 -0.0220036 0.017847 1 0 1 1 0 0 +EDGE2 5378 2359 1.00355 0.110196 -0.0244874 1 0 1 1 0 0 +EDGE2 5378 1518 -0.0433949 -0.0305439 -0.00623565 1 0 1 1 0 0 +EDGE2 5378 5359 1.05039 -0.0620242 0.0237785 1 0 1 1 0 0 +EDGE2 5378 1599 0.950481 -0.0240117 0.0165206 1 0 1 1 0 0 +EDGE2 5378 2319 1.0266 0.0378071 -0.0119822 1 0 1 1 0 0 +EDGE2 5378 2339 1.05266 0.00339169 -0.0243935 1 0 1 1 0 0 +EDGE2 5378 1519 1.0858 -0.0387229 -0.00117877 1 0 1 1 0 0 +EDGE2 5379 1598 -0.992462 0.0090047 -0.000841282 1 0 1 1 0 0 +EDGE2 5379 2338 -0.978962 0.0311216 0.0188426 1 0 1 1 0 0 +EDGE2 5379 5358 -1.03678 -0.0474759 -0.00304407 1 0 1 1 0 0 +EDGE2 5379 5378 -0.957337 -0.0761488 -0.0468173 1 0 1 1 0 0 +EDGE2 5379 2358 -1.01052 0.0212938 -0.0117363 1 0 1 1 0 0 +EDGE2 5379 2318 -1.01794 0.0693773 0.000491816 1 0 1 1 0 0 +EDGE2 5379 2359 0.0298101 -0.0829444 0.010693 1 0 1 1 0 0 +EDGE2 5379 1518 -1.10652 0.0254041 0.0371291 1 0 1 1 0 0 +EDGE2 5379 5359 -0.0563599 -0.0191084 -0.0164191 1 0 1 1 0 0 +EDGE2 5379 1599 -0.0500799 -0.0467835 -0.0117173 1 0 1 1 0 0 +EDGE2 5379 2319 -0.0361743 -0.0127382 0.0207198 1 0 1 1 0 0 +EDGE2 5379 2339 0.0437922 -0.0173011 0.0156512 1 0 1 1 0 0 +EDGE2 5379 1519 -0.072861 0.060329 -0.0184553 1 0 1 1 0 0 +EDGE2 5379 2340 0.945873 -0.0692758 -0.00956426 1 0 1 1 0 0 +EDGE2 5379 5340 0.923007 -0.0621553 -3.13886 1 0 1 1 0 0 +EDGE2 5379 5360 1.03172 0.05022 0.00486215 1 0 1 1 0 0 +EDGE2 5379 2360 1.03385 -0.0294664 -0.0202934 1 0 1 1 0 0 +EDGE2 5379 1520 0.936471 -0.0669757 0.00225455 1 0 1 1 0 0 +EDGE2 5379 1620 0.992463 -0.0145714 -3.11475 1 0 1 1 0 0 +EDGE2 5379 1640 0.94482 -0.0930656 -3.11213 1 0 1 1 0 0 +EDGE2 5379 2320 1.14701 -0.00948266 0.0274668 1 0 1 1 0 0 +EDGE2 5379 1600 1.02007 -0.0887728 0.00564728 1 0 1 1 0 0 +EDGE2 5379 1320 0.937956 -0.0258119 -3.13025 1 0 1 1 0 0 +EDGE2 5380 2359 -0.998596 -0.0391683 0.0065468 1 0 1 1 0 0 +EDGE2 5380 5379 -1.05031 0.057504 -0.00954899 1 0 1 1 0 0 +EDGE2 5380 5359 -1.00035 -0.106046 -0.00153114 1 0 1 1 0 0 +EDGE2 5380 1599 -0.905951 -0.0183234 0.00951083 1 0 1 1 0 0 +EDGE2 5380 2319 -1.09567 0.01476 0.0102934 1 0 1 1 0 0 +EDGE2 5380 2339 -1.03464 0.000162836 -0.0266865 1 0 1 1 0 0 +EDGE2 5380 1519 -0.972428 0.027913 0.0103344 1 0 1 1 0 0 +EDGE2 5380 2340 0.102804 -0.0407243 0.0244095 1 0 1 1 0 0 +EDGE2 5380 2341 0.0107575 0.975838 1.55948 1 0 1 1 0 0 +EDGE2 5380 5341 0.0693855 1.04524 1.55296 1 0 1 1 0 0 +EDGE2 5380 5361 -0.00580739 0.986102 1.54272 1 0 1 1 0 0 +EDGE2 5380 2361 0.0524973 1.02218 1.5684 1 0 1 1 0 0 +EDGE2 5380 1521 -0.102256 1.02475 1.589 1 0 1 1 0 0 +EDGE2 5380 1641 0.0351536 0.938551 1.53823 1 0 1 1 0 0 +EDGE2 5380 2321 0.0349787 1.02897 1.58006 1 0 1 1 0 0 +EDGE2 5380 1321 -0.0454874 0.994762 1.6076 1 0 1 1 0 0 +EDGE2 5380 5340 -0.102053 0.0943212 -3.14239 1 0 1 1 0 0 +EDGE2 5380 5360 -0.0274215 0.0369206 -0.00354538 1 0 1 1 0 0 +EDGE2 5380 2360 0.0202214 -0.0186182 -0.0111966 1 0 1 1 0 0 +EDGE2 5380 1520 -0.00604149 0.107338 -0.0350406 1 0 1 1 0 0 +EDGE2 5380 1620 -0.0273931 -0.0163203 -3.1524 1 0 1 1 0 0 +EDGE2 5380 1640 0.0273661 -0.0721714 -3.12585 1 0 1 1 0 0 +EDGE2 5380 2320 0.0259309 0.000830157 0.0640315 1 0 1 1 0 0 +EDGE2 5380 1600 0.0290596 -0.00108391 -0.00302994 1 0 1 1 0 0 +EDGE2 5380 1621 0.0186043 -1.03351 -1.59504 1 0 1 1 0 0 +EDGE2 5380 1320 0.0438705 -0.0458444 -3.15911 1 0 1 1 0 0 +EDGE2 5380 1601 -0.10336 -1.04383 -1.58756 1 0 1 1 0 0 +EDGE2 5380 1619 1.02026 -0.0571368 -3.11024 1 0 1 1 0 0 +EDGE2 5380 5339 1.0205 -0.00765046 -3.16377 1 0 1 1 0 0 +EDGE2 5380 1639 0.957285 0.069726 -3.15964 1 0 1 1 0 0 +EDGE2 5380 1319 0.975734 0.0225974 -3.14675 1 0 1 1 0 0 +EDGE2 5381 2362 0.977311 -0.0277405 -0.0317735 1 0 1 1 0 0 +EDGE2 5381 5362 1.01778 0.0486752 0.00177587 1 0 1 1 0 0 +EDGE2 5381 5342 0.855652 0.0428036 -0.00547327 1 0 1 1 0 0 +EDGE2 5381 2340 -0.994421 0.0751384 -1.58054 1 0 1 1 0 0 +EDGE2 5381 2341 0.00145953 -0.00972709 -0.0381828 1 0 1 1 0 0 +EDGE2 5381 1322 1.07071 -0.0230373 0.0178733 1 0 1 1 0 0 +EDGE2 5381 1642 1.00826 0.0244349 -0.00141606 1 0 1 1 0 0 +EDGE2 5381 2322 1.02317 -0.00558993 0.00583982 1 0 1 1 0 0 +EDGE2 5381 2342 1.02638 -0.0445605 -0.0192383 1 0 1 1 0 0 +EDGE2 5381 1522 0.928605 -0.0693192 -0.00669247 1 0 1 1 0 0 +EDGE2 5381 5341 0.0148978 -0.134862 -0.0206095 1 0 1 1 0 0 +EDGE2 5381 5361 -0.0158826 0.15074 0.00282831 1 0 1 1 0 0 +EDGE2 5381 2361 -0.0145256 -0.0282707 -0.0235816 1 0 1 1 0 0 +EDGE2 5381 1521 -0.0188167 -0.0464306 0.025745 1 0 1 1 0 0 +EDGE2 5381 1641 0.0136011 0.0063898 0.0147784 1 0 1 1 0 0 +EDGE2 5381 2321 -0.0885164 -0.037667 0.0184805 1 0 1 1 0 0 +EDGE2 5381 1321 0.063523 -0.0299658 0.0237851 1 0 1 1 0 0 +EDGE2 5381 5340 -1.06397 -0.0420594 1.61649 1 0 1 1 0 0 +EDGE2 5381 5360 -0.933594 -0.0489196 -1.56706 1 0 1 1 0 0 +EDGE2 5381 5380 -1.08363 0.0197235 -1.56591 1 0 1 1 0 0 +EDGE2 5381 2360 -1.0141 0.0584497 -1.56633 1 0 1 1 0 0 +EDGE2 5381 1520 -1.0002 0.0292542 -1.59527 1 0 1 1 0 0 +EDGE2 5381 1620 -1.00122 0.0150803 1.59797 1 0 1 1 0 0 +EDGE2 5381 1640 -0.997017 0.0648595 1.54207 1 0 1 1 0 0 +EDGE2 5381 2320 -0.885279 -0.0952512 -1.55358 1 0 1 1 0 0 +EDGE2 5381 1600 -0.962448 -0.0362441 -1.56924 1 0 1 1 0 0 +EDGE2 5381 1320 -0.970914 0.0356549 1.58123 1 0 1 1 0 0 +EDGE2 5382 2362 -0.0719594 -0.0455718 0.022223 1 0 1 1 0 0 +EDGE2 5382 2363 1.00542 0.0170518 0.00491183 1 0 1 1 0 0 +EDGE2 5382 5363 1.02828 0.00910491 0.0031332 1 0 1 1 0 0 +EDGE2 5382 5343 1.01504 -0.0155525 -0.0100911 1 0 1 1 0 0 +EDGE2 5382 1323 0.917031 -0.0624645 -0.04426 1 0 1 1 0 0 +EDGE2 5382 1643 0.975888 0.0304843 0.0151099 1 0 1 1 0 0 +EDGE2 5382 2323 0.8812 -0.0290106 -0.014651 1 0 1 1 0 0 +EDGE2 5382 2343 1.0718 -0.0216448 0.0531463 1 0 1 1 0 0 +EDGE2 5382 1523 1.05406 -0.00946532 0.00664071 1 0 1 1 0 0 +EDGE2 5382 5362 -0.00166035 -0.0102716 -0.0132704 1 0 1 1 0 0 +EDGE2 5382 5342 -0.0407332 -0.00033835 -0.0123124 1 0 1 1 0 0 +EDGE2 5382 2341 -1.07786 0.0448338 0.0242719 1 0 1 1 0 0 +EDGE2 5382 1322 -0.0543211 0.0186288 0.00384142 1 0 1 1 0 0 +EDGE2 5382 1642 -0.0470967 0.00822529 0.0184088 1 0 1 1 0 0 +EDGE2 5382 2322 0.0560536 0.0321259 -0.0300988 1 0 1 1 0 0 +EDGE2 5382 2342 0.0891583 0.0265525 0.00865958 1 0 1 1 0 0 +EDGE2 5382 1522 -0.0665503 0.0491131 0.0115563 1 0 1 1 0 0 +EDGE2 5382 5341 -1.0637 0.0644248 -0.00286528 1 0 1 1 0 0 +EDGE2 5382 5361 -1.00029 -0.068855 -0.0358155 1 0 1 1 0 0 +EDGE2 5382 5381 -1.03505 -0.014539 -0.00853172 1 0 1 1 0 0 +EDGE2 5382 2361 -1.01489 -0.0276851 -0.0151011 1 0 1 1 0 0 +EDGE2 5382 1521 -0.971786 -0.00486622 0.00639985 1 0 1 1 0 0 +EDGE2 5382 1641 -0.934499 0.0747835 0.0243199 1 0 1 1 0 0 +EDGE2 5382 2321 -0.976092 -0.00196249 0.00921403 1 0 1 1 0 0 +EDGE2 5382 1321 -1.06174 0.0572589 -0.00655372 1 0 1 1 0 0 +EDGE2 5383 2362 -1.05105 0.0485108 -0.00144314 1 0 1 1 0 0 +EDGE2 5383 5344 0.96423 0.057781 -0.00934649 1 0 1 1 0 0 +EDGE2 5383 5364 1.08341 -0.00302272 0.00457146 1 0 1 1 0 0 +EDGE2 5383 2363 0.00966934 0.0153532 0.0116527 1 0 1 1 0 0 +EDGE2 5383 1524 1.07136 -0.0389583 0.00310028 1 0 1 1 0 0 +EDGE2 5383 2324 1.00945 0.0179411 -0.0147605 1 0 1 1 0 0 +EDGE2 5383 2344 1.03515 -0.0551869 0.0129549 1 0 1 1 0 0 +EDGE2 5383 2364 0.960652 0.0105488 -0.0104192 1 0 1 1 0 0 +EDGE2 5383 1644 1.04801 -0.0142855 0.00222251 1 0 1 1 0 0 +EDGE2 5383 5363 -0.0191681 0.028986 0.0380413 1 0 1 1 0 0 +EDGE2 5383 1324 1.028 -0.012194 0.00608409 1 0 1 1 0 0 +EDGE2 5383 5343 -0.0236052 0.0436206 0.0104083 1 0 1 1 0 0 +EDGE2 5383 1323 0.060152 -0.0762135 0.00262977 1 0 1 1 0 0 +EDGE2 5383 1643 -0.011638 0.0264142 0.015338 1 0 1 1 0 0 +EDGE2 5383 2323 0.0626443 -0.0108746 -0.0366882 1 0 1 1 0 0 +EDGE2 5383 2343 -0.0510707 0.04845 0.00971872 1 0 1 1 0 0 +EDGE2 5383 1523 0.0059705 -0.0204694 -0.00508087 1 0 1 1 0 0 +EDGE2 5383 5362 -1.03641 -0.0327592 0.0160668 1 0 1 1 0 0 +EDGE2 5383 5382 -0.962343 0.00339346 -0.0103023 1 0 1 1 0 0 +EDGE2 5383 5342 -0.989604 -0.080394 -0.0211222 1 0 1 1 0 0 +EDGE2 5383 1322 -0.977767 0.0967516 0.0104453 1 0 1 1 0 0 +EDGE2 5383 1642 -0.946854 -0.0655408 0.0113646 1 0 1 1 0 0 +EDGE2 5383 2322 -1.02903 0.0226353 -0.00691024 1 0 1 1 0 0 +EDGE2 5383 2342 -1.02441 0.0650267 0.0287615 1 0 1 1 0 0 +EDGE2 5383 1522 -0.949727 -0.0412545 -0.0209508 1 0 1 1 0 0 +EDGE2 5384 1345 1.00357 -0.104825 -3.11459 1 0 1 1 0 0 +EDGE2 5384 2345 0.991607 0.105609 0.00317874 1 0 1 1 0 0 +EDGE2 5384 5345 0.986171 0.0158019 -0.00612154 1 0 1 1 0 0 +EDGE2 5384 5365 0.928667 -0.0589028 -0.00582912 1 0 1 1 0 0 +EDGE2 5384 2365 0.987405 -0.0109466 -0.0220939 1 0 1 1 0 0 +EDGE2 5384 1525 0.922722 0.0484064 -0.00466996 1 0 1 1 0 0 +EDGE2 5384 1905 0.969927 -0.0423314 -3.15463 1 0 1 1 0 0 +EDGE2 5384 1925 0.908728 -0.00430183 -3.11964 1 0 1 1 0 0 +EDGE2 5384 2325 0.946169 0.0485748 0.00619398 1 0 1 1 0 0 +EDGE2 5384 1645 0.925343 0.0142856 -0.0456973 1 0 1 1 0 0 +EDGE2 5384 1485 0.971356 -0.0489337 -3.16793 1 0 1 1 0 0 +EDGE2 5384 1505 1.00249 -0.0190707 -3.16334 1 0 1 1 0 0 +EDGE2 5384 1365 0.910314 -0.0431523 -3.15624 1 0 1 1 0 0 +EDGE2 5384 5344 0.0225766 0.00433746 -0.0230981 1 0 1 1 0 0 +EDGE2 5384 1325 1.10693 0.0277272 0.0232675 1 0 1 1 0 0 +EDGE2 5384 5364 -0.00352991 -0.0320999 -0.0185271 1 0 1 1 0 0 +EDGE2 5384 2363 -0.994083 -0.0353573 -0.0340797 1 0 1 1 0 0 +EDGE2 5384 1524 0.0282529 0.0110104 -0.00558727 1 0 1 1 0 0 +EDGE2 5384 2324 0.0741638 0.00243274 0.0448841 1 0 1 1 0 0 +EDGE2 5384 2344 0.0280979 -0.0726156 0.00500759 1 0 1 1 0 0 +EDGE2 5384 2364 0.0503073 -0.0349491 0.0474187 1 0 1 1 0 0 +EDGE2 5384 1644 0.0293693 -0.0694055 -0.0113368 1 0 1 1 0 0 +EDGE2 5384 5363 -0.876059 -0.0377995 0.00338708 1 0 1 1 0 0 +EDGE2 5384 5383 -1.05071 -0.0360215 -0.000202049 1 0 1 1 0 0 +EDGE2 5384 1324 0.0087857 0.064123 0.00883426 1 0 1 1 0 0 +EDGE2 5384 5343 -1.07594 0.00119152 0.01144 1 0 1 1 0 0 +EDGE2 5384 1323 -1.08112 0.0133315 -0.00550755 1 0 1 1 0 0 +EDGE2 5384 1643 -1.0695 0.00228457 -0.000721593 1 0 1 1 0 0 +EDGE2 5384 2323 -1.00507 0.045613 0.0181851 1 0 1 1 0 0 +EDGE2 5384 2343 -0.997943 -0.107144 -0.00978583 1 0 1 1 0 0 +EDGE2 5384 1523 -0.942808 -0.000492437 0.0315951 1 0 1 1 0 0 +EDGE2 5385 1345 -0.0406884 0.00718108 -3.12855 1 0 1 1 0 0 +EDGE2 5385 1526 -0.0459203 1.00923 1.5807 1 0 1 1 0 0 +EDGE2 5385 2366 -0.00822839 1.10415 1.58439 1 0 1 1 0 0 +EDGE2 5385 5366 -0.00981531 0.978229 1.57085 1 0 1 1 0 0 +EDGE2 5385 5346 -0.000654894 0.993518 1.5694 1 0 1 1 0 0 +EDGE2 5385 1926 0.0159347 1.07895 1.579 1 0 1 1 0 0 +EDGE2 5385 2326 -0.0341124 1.05274 1.55983 1 0 1 1 0 0 +EDGE2 5385 2346 0.0718128 0.940271 1.57099 1 0 1 1 0 0 +EDGE2 5385 1646 0.031656 0.993367 1.55286 1 0 1 1 0 0 +EDGE2 5385 1366 0.0285668 1.00396 1.55772 1 0 1 1 0 0 +EDGE2 5385 1506 -0.0106352 1.00826 1.54012 1 0 1 1 0 0 +EDGE2 5385 1924 1.02774 -0.0252946 -3.14828 1 0 1 1 0 0 +EDGE2 5385 2345 -0.0304486 -0.000801431 -0.0181521 1 0 1 1 0 0 +EDGE2 5385 1344 1.03375 0.0489477 -3.1576 1 0 1 1 0 0 +EDGE2 5385 1484 1.02676 0.0102019 -3.13596 1 0 1 1 0 0 +EDGE2 5385 1504 1.09016 -0.130698 -3.1225 1 0 1 1 0 0 +EDGE2 5385 1904 1.09005 0.0260254 -3.1779 1 0 1 1 0 0 +EDGE2 5385 1364 0.958964 -0.000715422 -3.147 1 0 1 1 0 0 +EDGE2 5385 5345 0.0314723 -0.00212031 -0.00742547 1 0 1 1 0 0 +EDGE2 5385 5365 0.124938 0.0140355 0.00597465 1 0 1 1 0 0 +EDGE2 5385 2365 0.00480156 0.00336195 0.024882 1 0 1 1 0 0 +EDGE2 5385 1525 -0.0336229 -0.101643 -0.0215129 1 0 1 1 0 0 +EDGE2 5385 1905 0.0645616 -0.0874834 -3.12328 1 0 1 1 0 0 +EDGE2 5385 1925 -0.020847 -0.111881 -3.1455 1 0 1 1 0 0 +EDGE2 5385 2325 -0.0870894 -0.029347 -0.0102002 1 0 1 1 0 0 +EDGE2 5385 1645 0.0677486 -0.0514887 0.0109839 1 0 1 1 0 0 +EDGE2 5385 1485 -0.0193338 -0.0200747 -3.09645 1 0 1 1 0 0 +EDGE2 5385 1505 0.0146533 0.105991 -3.15196 1 0 1 1 0 0 +EDGE2 5385 1365 -0.00583889 0.032219 -3.16116 1 0 1 1 0 0 +EDGE2 5385 5344 -0.962523 -0.0177952 0.0139765 1 0 1 1 0 0 +EDGE2 5385 5384 -0.949974 -0.0739125 -0.00575307 1 0 1 1 0 0 +EDGE2 5385 1325 -0.00979188 0.0248315 -0.0179131 1 0 1 1 0 0 +EDGE2 5385 5364 -0.951348 -0.0574795 0.00179691 1 0 1 1 0 0 +EDGE2 5385 1524 -0.948386 -0.037491 0.00753438 1 0 1 1 0 0 +EDGE2 5385 2324 -0.919763 -0.029582 -0.02169 1 0 1 1 0 0 +EDGE2 5385 2344 -1.01566 -0.0779474 0.0130951 1 0 1 1 0 0 +EDGE2 5385 2364 -1.09942 0.0633928 0.0134777 1 0 1 1 0 0 +EDGE2 5385 1644 -1.04527 -0.0818039 -0.0374168 1 0 1 1 0 0 +EDGE2 5385 1324 -1.05363 -0.0230907 -0.00448872 1 0 1 1 0 0 +EDGE2 5385 1486 0.0903857 -1.03571 -1.55554 1 0 1 1 0 0 +EDGE2 5385 1906 -0.0383615 -1.01357 -1.61139 1 0 1 1 0 0 +EDGE2 5385 1326 -0.0211799 -0.97734 -1.5486 1 0 1 1 0 0 +EDGE2 5385 1346 0.0115057 -1.06013 -1.5815 1 0 1 1 0 0 +EDGE2 5386 2327 1.14762 -0.028168 0.0055663 1 0 1 1 0 0 +EDGE2 5386 5367 1.04059 -0.0469751 -0.0102745 1 0 1 1 0 0 +EDGE2 5386 2367 1.06675 0.082197 -0.00879869 1 0 1 1 0 0 +EDGE2 5386 5347 0.962 0.012956 0.0172141 1 0 1 1 0 0 +EDGE2 5386 2347 1.1508 -0.0450091 0.00225478 1 0 1 1 0 0 +EDGE2 5386 1345 -0.949452 0.0196536 1.57299 1 0 1 1 0 0 +EDGE2 5386 1526 -0.0844426 -0.0529126 0.0229077 1 0 1 1 0 0 +EDGE2 5386 1507 1.03702 0.102116 0.00596117 1 0 1 1 0 0 +EDGE2 5386 1527 1.08545 -0.0344761 0.00547458 1 0 1 1 0 0 +EDGE2 5386 1647 1.02439 0.00455512 0.00594459 1 0 1 1 0 0 +EDGE2 5386 1927 0.95451 0.103269 4.05e-05 1 0 1 1 0 0 +EDGE2 5386 2366 0.0642814 -0.00155624 -0.00975739 1 0 1 1 0 0 +EDGE2 5386 5366 0.0937568 0.0564423 0.00906872 1 0 1 1 0 0 +EDGE2 5386 1367 0.987141 -0.0699428 0.0188173 1 0 1 1 0 0 +EDGE2 5386 5346 -0.111369 -0.0326771 -0.000709324 1 0 1 1 0 0 +EDGE2 5386 1926 -0.0205283 0.0334173 0.0339719 1 0 1 1 0 0 +EDGE2 5386 2326 0.0868368 -0.04604 -0.00402147 1 0 1 1 0 0 +EDGE2 5386 2346 0.0293061 0.0434111 0.0186071 1 0 1 1 0 0 +EDGE2 5386 1646 -0.00801728 0.0245179 0.0504347 1 0 1 1 0 0 +EDGE2 5386 1366 0.0409461 0.0496528 0.0456079 1 0 1 1 0 0 +EDGE2 5386 1506 0.0662201 -0.008574 -0.0100142 1 0 1 1 0 0 +EDGE2 5386 2345 -0.98404 -0.0681202 -1.55986 1 0 1 1 0 0 +EDGE2 5386 5345 -0.986775 0.0359105 -1.56212 1 0 1 1 0 0 +EDGE2 5386 5365 -1.01863 -0.0389436 -1.58472 1 0 1 1 0 0 +EDGE2 5386 5385 -0.954306 0.0567722 -1.60566 1 0 1 1 0 0 +EDGE2 5386 2365 -0.92253 -0.000297521 -1.55908 1 0 1 1 0 0 +EDGE2 5386 1525 -1.03098 -0.0358211 -1.60345 1 0 1 1 0 0 +EDGE2 5386 1905 -1.03421 0.00576021 1.57068 1 0 1 1 0 0 +EDGE2 5386 1925 -1.02825 -0.0670675 1.54896 1 0 1 1 0 0 +EDGE2 5386 2325 -0.98998 -0.0173681 -1.58693 1 0 1 1 0 0 +EDGE2 5386 1645 -0.924489 0.0156166 -1.55761 1 0 1 1 0 0 +EDGE2 5386 1485 -1.01016 0.111983 1.50965 1 0 1 1 0 0 +EDGE2 5386 1505 -1.04996 0.0261894 1.54438 1 0 1 1 0 0 +EDGE2 5386 1365 -0.899744 0.0318822 1.59298 1 0 1 1 0 0 +EDGE2 5386 1325 -1.00293 0.10684 -1.56099 1 0 1 1 0 0 +EDGE2 5387 2327 0.0289194 -0.050319 -0.0171595 1 0 1 1 0 0 +EDGE2 5387 2368 0.962549 -0.0619913 -0.00342439 1 0 1 1 0 0 +EDGE2 5387 5368 0.993478 0.0550334 0.0235418 1 0 1 1 0 0 +EDGE2 5387 5348 0.96374 0.0567366 -0.0254888 1 0 1 1 0 0 +EDGE2 5387 1648 0.949998 0.0383322 0.0245456 1 0 1 1 0 0 +EDGE2 5387 1928 0.9781 0.0340132 0.00940418 1 0 1 1 0 0 +EDGE2 5387 2328 1.09702 0.0207711 0.0138097 1 0 1 1 0 0 +EDGE2 5387 2348 0.926606 -0.0454093 -0.0326546 1 0 1 1 0 0 +EDGE2 5387 5367 -0.0228233 -0.0920764 0.0118955 1 0 1 1 0 0 +EDGE2 5387 1368 0.922925 -0.0986051 -0.0302764 1 0 1 1 0 0 +EDGE2 5387 1508 0.997891 -0.00751425 -0.0131198 1 0 1 1 0 0 +EDGE2 5387 1528 0.988543 -0.0539664 -0.0151375 1 0 1 1 0 0 +EDGE2 5387 2367 0.000280607 0.00279059 -0.0256537 1 0 1 1 0 0 +EDGE2 5387 5347 0.0673341 -0.0345888 -0.0106328 1 0 1 1 0 0 +EDGE2 5387 2347 0.0559903 -0.037831 -0.00740047 1 0 1 1 0 0 +EDGE2 5387 1526 -0.994004 -0.0225687 -0.00431556 1 0 1 1 0 0 +EDGE2 5387 1507 0.00511843 0.012221 0.0114699 1 0 1 1 0 0 +EDGE2 5387 1527 -0.0424671 0.0114205 -0.013932 1 0 1 1 0 0 +EDGE2 5387 1647 -0.0406799 -0.105054 0.0249231 1 0 1 1 0 0 +EDGE2 5387 1927 0.0196041 0.0730834 -0.0303918 1 0 1 1 0 0 +EDGE2 5387 2366 -0.997357 5.27284e-06 0.0359233 1 0 1 1 0 0 +EDGE2 5387 5366 -0.989865 0.0188653 -0.0114505 1 0 1 1 0 0 +EDGE2 5387 5386 -1.06587 -0.102751 -0.012698 1 0 1 1 0 0 +EDGE2 5387 1367 -0.0929655 -0.0519818 -0.011015 1 0 1 1 0 0 +EDGE2 5387 5346 -0.95723 0.0440364 -0.00445496 1 0 1 1 0 0 +EDGE2 5387 1926 -1.0747 -0.0878364 -0.017231 1 0 1 1 0 0 +EDGE2 5387 2326 -0.987607 -0.0136999 -0.00458329 1 0 1 1 0 0 +EDGE2 5387 2346 -0.994812 0.0924209 -0.0224436 1 0 1 1 0 0 +EDGE2 5387 1646 -1.03347 -0.0341574 -0.0236177 1 0 1 1 0 0 +EDGE2 5387 1366 -0.937823 0.00206448 0.0206632 1 0 1 1 0 0 +EDGE2 5387 1506 -0.999766 0.0242402 0.0230975 1 0 1 1 0 0 +EDGE2 5388 2327 -1.04121 0.0780187 0.00246141 1 0 1 1 0 0 +EDGE2 5388 2368 -0.0549633 0.00482458 -0.0115523 1 0 1 1 0 0 +EDGE2 5388 2349 0.921383 -0.0625506 -0.0177086 1 0 1 1 0 0 +EDGE2 5388 2369 1.00847 -0.0159582 0.00234112 1 0 1 1 0 0 +EDGE2 5388 5349 1.00439 0.0265655 0.0499728 1 0 1 1 0 0 +EDGE2 5388 5369 0.986154 0.0442585 0.00416004 1 0 1 1 0 0 +EDGE2 5388 1509 1.06435 -0.0718113 0.0317374 1 0 1 1 0 0 +EDGE2 5388 1649 0.960682 -0.0399688 -0.0155258 1 0 1 1 0 0 +EDGE2 5388 1929 1.07081 0.0793682 0.00845634 1 0 1 1 0 0 +EDGE2 5388 2329 1.01366 0.0138715 0.00380429 1 0 1 1 0 0 +EDGE2 5388 1529 0.952383 0.0181584 -0.0357118 1 0 1 1 0 0 +EDGE2 5388 5368 -0.0665363 -0.00158504 0.0291344 1 0 1 1 0 0 +EDGE2 5388 1369 1.03648 -0.0271606 -0.0226111 1 0 1 1 0 0 +EDGE2 5388 5348 0.0384263 0.00381396 -0.0136907 1 0 1 1 0 0 +EDGE2 5388 1648 0.0500428 0.0536868 -0.0186496 1 0 1 1 0 0 +EDGE2 5388 1928 -0.0653453 -0.00349385 -0.00652102 1 0 1 1 0 0 +EDGE2 5388 2328 -0.12888 -0.0618969 -0.0327036 1 0 1 1 0 0 +EDGE2 5388 2348 -0.0621425 0.0450238 0.00358278 1 0 1 1 0 0 +EDGE2 5388 5367 -1.03416 0.0612964 -0.0186151 1 0 1 1 0 0 +EDGE2 5388 1368 0.0394376 -0.0455173 -0.0425332 1 0 1 1 0 0 +EDGE2 5388 1508 -0.0516621 -0.0807584 0.0356445 1 0 1 1 0 0 +EDGE2 5388 1528 -0.0309069 -0.0267082 -0.00363879 1 0 1 1 0 0 +EDGE2 5388 5387 -0.957567 0.0165681 0.0231029 1 0 1 1 0 0 +EDGE2 5388 2367 -0.964573 0.0348651 0.00515612 1 0 1 1 0 0 +EDGE2 5388 5347 -1.06377 0.0419403 -0.0295911 1 0 1 1 0 0 +EDGE2 5388 2347 -1.04625 -0.00931585 -0.00136332 1 0 1 1 0 0 +EDGE2 5388 1507 -0.987155 -0.0893718 -0.00320914 1 0 1 1 0 0 +EDGE2 5388 1527 -0.97526 0.0102698 -0.00502906 1 0 1 1 0 0 +EDGE2 5388 1647 -0.978897 -0.0174487 -0.0242072 1 0 1 1 0 0 +EDGE2 5388 1927 -1.02848 -0.0132865 -0.0121398 1 0 1 1 0 0 +EDGE2 5388 1367 -1.10384 -0.0238206 0.0308433 1 0 1 1 0 0 +EDGE2 5389 2330 1.00726 -0.0365549 -0.00718722 1 0 1 1 0 0 +EDGE2 5389 2370 1.01309 -0.0179365 -0.0409601 1 0 1 1 0 0 +EDGE2 5389 5350 1.00758 0.0232013 -0.0248606 1 0 1 1 0 0 +EDGE2 5389 5370 0.98085 -0.0861822 0.027359 1 0 1 1 0 0 +EDGE2 5389 2350 0.94396 0.00186778 -0.0186777 1 0 1 1 0 0 +EDGE2 5389 1650 0.95508 -0.0163451 -0.0105013 1 0 1 1 0 0 +EDGE2 5389 1710 1.00949 -0.0739619 -3.16964 1 0 1 1 0 0 +EDGE2 5389 1870 1.00658 -0.0476385 -3.11639 1 0 1 1 0 0 +EDGE2 5389 1930 1.04319 0.0195467 0.0165042 1 0 1 1 0 0 +EDGE2 5389 1670 0.98436 0.0203557 -3.14491 1 0 1 1 0 0 +EDGE2 5389 1470 0.952366 0.0900795 -3.16164 1 0 1 1 0 0 +EDGE2 5389 1510 0.958651 -0.00866436 0.0140727 1 0 1 1 0 0 +EDGE2 5389 1530 0.938067 -0.096103 -0.0463982 1 0 1 1 0 0 +EDGE2 5389 1370 0.914187 -0.0142208 0.00380623 1 0 1 1 0 0 +EDGE2 5389 2368 -1.00006 -0.00124967 -0.00132428 1 0 1 1 0 0 +EDGE2 5389 2349 -0.0806719 0.0499602 0.0221298 1 0 1 1 0 0 +EDGE2 5389 2369 -0.0797521 -0.0453102 0.00452744 1 0 1 1 0 0 +EDGE2 5389 5349 0.0158135 -0.00403368 -0.0199813 1 0 1 1 0 0 +EDGE2 5389 5369 -0.0223829 -0.0270661 0.00641421 1 0 1 1 0 0 +EDGE2 5389 1509 0.0101149 0.0429345 0.0250201 1 0 1 1 0 0 +EDGE2 5389 1649 0.0710341 0.045251 0.0454135 1 0 1 1 0 0 +EDGE2 5389 1929 0.0556361 -0.104701 0.0140233 1 0 1 1 0 0 +EDGE2 5389 2329 -0.00411552 -0.00235391 -0.0214766 1 0 1 1 0 0 +EDGE2 5389 1529 -0.0897408 -0.0509125 -0.0335604 1 0 1 1 0 0 +EDGE2 5389 5368 -0.954411 0.0345975 -0.00797469 1 0 1 1 0 0 +EDGE2 5389 5388 -0.990705 0.0349651 -0.00533277 1 0 1 1 0 0 +EDGE2 5389 1369 0.0205423 0.0253178 0.0171334 1 0 1 1 0 0 +EDGE2 5389 5348 -0.951947 -0.0242378 0.0192561 1 0 1 1 0 0 +EDGE2 5389 1648 -0.946232 0.0269337 -0.0157878 1 0 1 1 0 0 +EDGE2 5389 1928 -0.958183 -0.0737606 0.0163339 1 0 1 1 0 0 +EDGE2 5389 2328 -1.02851 0.0834673 -0.0178426 1 0 1 1 0 0 +EDGE2 5389 2348 -1.006 0.0490912 0.00564315 1 0 1 1 0 0 +EDGE2 5389 1368 -1.05862 0.0411833 -0.00807301 1 0 1 1 0 0 +EDGE2 5389 1508 -0.982388 -0.0134519 -0.0169808 1 0 1 1 0 0 +EDGE2 5389 1528 -0.941261 0.0433259 -0.0105569 1 0 1 1 0 0 +EDGE2 5390 1931 0.0692339 -1.03334 -1.55473 1 0 1 1 0 0 +EDGE2 5390 1669 1.04824 0.0456495 -3.17277 1 0 1 1 0 0 +EDGE2 5390 1709 0.994933 0.0476244 -3.13424 1 0 1 1 0 0 +EDGE2 5390 1869 1.0177 -0.0119963 -3.15548 1 0 1 1 0 0 +EDGE2 5390 1469 0.965537 -0.0792103 -3.14826 1 0 1 1 0 0 +EDGE2 5390 5389 -1.10665 -0.0508952 0.0122686 1 0 1 1 0 0 +EDGE2 5390 2330 0.0534368 -0.0474575 0.00939185 1 0 1 1 0 0 +EDGE2 5390 1671 0.0129079 -1.04021 -1.54039 1 0 1 1 0 0 +EDGE2 5390 1711 -0.0493043 -0.976513 -1.57184 1 0 1 1 0 0 +EDGE2 5390 1871 0.00832695 -1.04622 -1.58808 1 0 1 1 0 0 +EDGE2 5390 1471 -0.119487 -0.996065 -1.56514 1 0 1 1 0 0 +EDGE2 5390 2370 0.0432371 -0.0785377 -0.00555088 1 0 1 1 0 0 +EDGE2 5390 5350 0.0438305 -0.0779977 0.0111695 1 0 1 1 0 0 +EDGE2 5390 5370 0.0279202 0.0578459 0.0299615 1 0 1 1 0 0 +EDGE2 5390 2350 0.0395627 -0.000959066 -0.0207997 1 0 1 1 0 0 +EDGE2 5390 1650 0.0465829 -0.00671539 0.0184663 1 0 1 1 0 0 +EDGE2 5390 1710 -0.100988 0.0870941 -3.10838 1 0 1 1 0 0 +EDGE2 5390 1870 -0.0272708 0.047273 -3.15956 1 0 1 1 0 0 +EDGE2 5390 1930 -0.100648 -0.0653369 -0.0186994 1 0 1 1 0 0 +EDGE2 5390 1670 -0.0268383 0.0137648 -3.16015 1 0 1 1 0 0 +EDGE2 5390 1470 0.0602105 0.020017 -3.15111 1 0 1 1 0 0 +EDGE2 5390 1510 0.0644924 -0.0368572 0.00502658 1 0 1 1 0 0 +EDGE2 5390 1530 0.00509467 -0.0557276 0.0152155 1 0 1 1 0 0 +EDGE2 5390 1370 -0.0207109 -0.0252389 0.00600299 1 0 1 1 0 0 +EDGE2 5390 2351 -0.0533817 1.09458 1.56162 1 0 1 1 0 0 +EDGE2 5390 2371 -0.0571825 1.04754 1.57663 1 0 1 1 0 0 +EDGE2 5390 5351 0.022661 1.02212 1.57255 1 0 1 1 0 0 +EDGE2 5390 5371 -0.0234047 0.991508 1.58603 1 0 1 1 0 0 +EDGE2 5390 1371 0.0184692 0.945336 1.54274 1 0 1 1 0 0 +EDGE2 5390 1531 0.0818086 0.952726 1.60409 1 0 1 1 0 0 +EDGE2 5390 1651 -0.0373282 0.955917 1.54464 1 0 1 1 0 0 +EDGE2 5390 2331 0.0612524 0.988307 1.57059 1 0 1 1 0 0 +EDGE2 5390 1511 -0.101062 1.03209 1.59622 1 0 1 1 0 0 +EDGE2 5390 2349 -0.970963 -0.0759875 0.0174224 1 0 1 1 0 0 +EDGE2 5390 2369 -1.02173 -0.00551162 0.0177798 1 0 1 1 0 0 +EDGE2 5390 5349 -0.906108 0.0632247 0.0334431 1 0 1 1 0 0 +EDGE2 5390 5369 -0.977444 0.0621201 -0.0346341 1 0 1 1 0 0 +EDGE2 5390 1509 -0.996604 -0.0735249 -0.00643219 1 0 1 1 0 0 +EDGE2 5390 1649 -0.971603 0.0360086 0.0201071 1 0 1 1 0 0 +EDGE2 5390 1929 -0.979206 -0.0217054 -0.000474786 1 0 1 1 0 0 +EDGE2 5390 2329 -0.926688 0.0110054 -0.00819091 1 0 1 1 0 0 +EDGE2 5390 1529 -0.984666 -0.00645658 0.0142318 1 0 1 1 0 0 +EDGE2 5390 1369 -0.913601 -0.108997 -0.0174142 1 0 1 1 0 0 +EDGE2 5391 2372 0.941439 -0.0130494 0.0110051 1 0 1 1 0 0 +EDGE2 5391 2330 -0.985413 0.0587254 -1.58558 1 0 1 1 0 0 +EDGE2 5391 5390 -1.0084 0.00913387 -1.5733 1 0 1 1 0 0 +EDGE2 5391 2370 -0.994384 -0.0104588 -1.60042 1 0 1 1 0 0 +EDGE2 5391 5350 -1.08545 0.060493 -1.55402 1 0 1 1 0 0 +EDGE2 5391 5370 -0.940274 0.0382486 -1.57377 1 0 1 1 0 0 +EDGE2 5391 2350 -0.959533 -0.0742545 -1.55779 1 0 1 1 0 0 +EDGE2 5391 1650 -0.928542 0.0165836 -1.54921 1 0 1 1 0 0 +EDGE2 5391 1710 -1.05178 0.0506082 1.57101 1 0 1 1 0 0 +EDGE2 5391 1870 -1.03167 0.0561093 1.5736 1 0 1 1 0 0 +EDGE2 5391 1930 -0.905085 0.0397874 -1.57026 1 0 1 1 0 0 +EDGE2 5391 1670 -0.857423 0.018833 1.57167 1 0 1 1 0 0 +EDGE2 5391 1470 -1.01601 -0.00303885 1.5881 1 0 1 1 0 0 +EDGE2 5391 1510 -0.99579 -0.0420962 -1.57172 1 0 1 1 0 0 +EDGE2 5391 1530 -0.972742 0.0124999 -1.54811 1 0 1 1 0 0 +EDGE2 5391 1370 -1.03844 -0.00611205 -1.54303 1 0 1 1 0 0 +EDGE2 5391 2351 0.0456505 0.0372468 -0.0151036 1 0 1 1 0 0 +EDGE2 5391 2371 -0.0133722 -0.00148171 0.0183716 1 0 1 1 0 0 +EDGE2 5391 5351 0.0625158 0.0282998 0.0248177 1 0 1 1 0 0 +EDGE2 5391 5371 0.0578674 -0.0682092 0.0358391 1 0 1 1 0 0 +EDGE2 5391 1371 -0.0475181 -0.0219341 -0.0193661 1 0 1 1 0 0 +EDGE2 5391 1531 0.0433982 0.0160996 -0.0175361 1 0 1 1 0 0 +EDGE2 5391 1651 -0.0389015 -0.0209113 0.00145985 1 0 1 1 0 0 +EDGE2 5391 2331 0.0912862 -0.01961 -0.0189467 1 0 1 1 0 0 +EDGE2 5391 1511 -0.0525871 -0.00536794 -0.0180614 1 0 1 1 0 0 +EDGE2 5391 5372 0.951561 -0.00488104 -0.0284624 1 0 1 1 0 0 +EDGE2 5391 5352 0.994971 -0.00710416 0.00395197 1 0 1 1 0 0 +EDGE2 5391 1512 0.987179 -0.0678187 -0.00768119 1 0 1 1 0 0 +EDGE2 5391 1652 1.03075 -0.147016 0.0116684 1 0 1 1 0 0 +EDGE2 5391 2332 1.0766 -0.0782949 -0.0041423 1 0 1 1 0 0 +EDGE2 5391 2352 1.06158 0.0504777 0.0279741 1 0 1 1 0 0 +EDGE2 5391 1532 0.997553 -0.067936 0.045338 1 0 1 1 0 0 +EDGE2 5391 1372 0.94612 0.0527257 -0.00941106 1 0 1 1 0 0 +EDGE2 5392 2372 0.0430753 -0.0470021 -0.0379162 1 0 1 1 0 0 +EDGE2 5392 5391 -0.989078 -0.0242059 0.0447307 1 0 1 1 0 0 +EDGE2 5392 2351 -1.02045 -0.0353008 0.00349541 1 0 1 1 0 0 +EDGE2 5392 2371 -0.986039 -0.0273339 0.00383962 1 0 1 1 0 0 +EDGE2 5392 5351 -0.94731 -0.0527805 0.0214382 1 0 1 1 0 0 +EDGE2 5392 5371 -1.01935 0.0166343 0.031412 1 0 1 1 0 0 +EDGE2 5392 1371 -1.05511 0.00423339 0.0311551 1 0 1 1 0 0 +EDGE2 5392 1531 -0.927055 -0.0202759 -0.0208653 1 0 1 1 0 0 +EDGE2 5392 1651 -1.04805 0.089461 -0.00497861 1 0 1 1 0 0 +EDGE2 5392 2331 -0.923651 0.0426605 -0.0129864 1 0 1 1 0 0 +EDGE2 5392 1511 -0.953071 0.0301578 -0.011559 1 0 1 1 0 0 +EDGE2 5392 5372 0.0455618 -0.0456715 0.0197528 1 0 1 1 0 0 +EDGE2 5392 5352 -0.0100228 -0.0615239 0.0243523 1 0 1 1 0 0 +EDGE2 5392 2373 1.04608 0.0377357 0.0143017 1 0 1 1 0 0 +EDGE2 5392 1512 -0.0257688 0.026496 0.00890313 1 0 1 1 0 0 +EDGE2 5392 1652 -0.0436198 -0.00156798 0.0168884 1 0 1 1 0 0 +EDGE2 5392 2332 0.019034 -0.0907843 0.00213182 1 0 1 1 0 0 +EDGE2 5392 2352 0.0151096 0.023569 -0.0470584 1 0 1 1 0 0 +EDGE2 5392 1532 0.144072 0.0406794 -0.0043203 1 0 1 1 0 0 +EDGE2 5392 5373 1.06751 -0.0279543 0.0225583 1 0 1 1 0 0 +EDGE2 5392 1372 -0.0207526 -0.0538255 -0.0171064 1 0 1 1 0 0 +EDGE2 5392 5353 0.995251 0.0164652 -0.0138704 1 0 1 1 0 0 +EDGE2 5392 1513 1.02255 -0.022285 -0.0380475 1 0 1 1 0 0 +EDGE2 5392 1653 0.994306 0.0806588 -0.00190413 1 0 1 1 0 0 +EDGE2 5392 2333 1.05108 -0.0648789 -0.0501657 1 0 1 1 0 0 +EDGE2 5392 2353 1.03331 -0.000995595 0.0111126 1 0 1 1 0 0 +EDGE2 5392 1533 0.929992 0.0591797 -0.0443862 1 0 1 1 0 0 +EDGE2 5392 1373 1.07809 -0.066186 0.0115511 1 0 1 1 0 0 +EDGE2 5393 2372 -1.03564 0.153485 -0.00815326 1 0 1 1 0 0 +EDGE2 5393 5372 -0.988585 -0.000902528 -0.00253367 1 0 1 1 0 0 +EDGE2 5393 5392 -1.11279 0.0224147 0.0196208 1 0 1 1 0 0 +EDGE2 5393 5352 -1.00113 -0.0209774 -0.00441266 1 0 1 1 0 0 +EDGE2 5393 2374 1.005 0.0192514 0.0158409 1 0 1 1 0 0 +EDGE2 5393 2373 0.0548551 -0.0267689 -0.00606824 1 0 1 1 0 0 +EDGE2 5393 1512 -1.00848 0.0850422 0.0167852 1 0 1 1 0 0 +EDGE2 5393 1652 -1.01635 0.0325127 0.0166589 1 0 1 1 0 0 +EDGE2 5393 2332 -0.955568 0.0617191 -0.0145973 1 0 1 1 0 0 +EDGE2 5393 2352 -1.02581 0.00644252 0.0180507 1 0 1 1 0 0 +EDGE2 5393 1532 -1.01132 -0.0181886 -0.0226967 1 0 1 1 0 0 +EDGE2 5393 5373 0.0502351 0.0083302 -0.0327945 1 0 1 1 0 0 +EDGE2 5393 1372 -1.0195 -0.0177282 -0.0179731 1 0 1 1 0 0 +EDGE2 5393 5353 -0.0884052 -0.0631798 -0.000669015 1 0 1 1 0 0 +EDGE2 5393 1513 -0.0445577 -0.0113639 -0.000555161 1 0 1 1 0 0 +EDGE2 5393 1653 -0.0281227 0.0441505 -0.0251619 1 0 1 1 0 0 +EDGE2 5393 2333 0.0702913 -0.0275702 0.018072 1 0 1 1 0 0 +EDGE2 5393 2353 0.0681139 -0.0384282 -0.0362287 1 0 1 1 0 0 +EDGE2 5393 1533 0.130069 -0.0159242 -0.00102126 1 0 1 1 0 0 +EDGE2 5393 5374 1.04968 -0.0712812 -0.00788087 1 0 1 1 0 0 +EDGE2 5393 1373 -0.043832 -0.0629042 0.0274906 1 0 1 1 0 0 +EDGE2 5393 5354 1.02141 -0.0766201 -0.0194738 1 0 1 1 0 0 +EDGE2 5393 1514 0.942554 0.00175538 0.00346191 1 0 1 1 0 0 +EDGE2 5393 1654 0.915452 0.0205627 0.0082032 1 0 1 1 0 0 +EDGE2 5393 2334 1.04313 0.0571311 -0.00174165 1 0 1 1 0 0 +EDGE2 5393 2354 0.930633 0.0464181 0.0181815 1 0 1 1 0 0 +EDGE2 5393 1534 1.05293 -0.0818679 -0.00210443 1 0 1 1 0 0 +EDGE2 5393 1374 1.00278 -0.038629 -0.0145462 1 0 1 1 0 0 +EDGE2 5394 1535 1.03635 0.0326146 0.0269694 1 0 1 1 0 0 +EDGE2 5394 2374 0.0102069 0.0774466 0.00174891 1 0 1 1 0 0 +EDGE2 5394 2373 -1.06009 -0.0456261 0.00272586 1 0 1 1 0 0 +EDGE2 5394 5373 -1.02178 -0.0779211 -0.0293029 1 0 1 1 0 0 +EDGE2 5394 5393 -0.994534 0.0288138 0.00294814 1 0 1 1 0 0 +EDGE2 5394 5353 -0.946923 0.0105763 0.0208669 1 0 1 1 0 0 +EDGE2 5394 1513 -0.9926 -0.0127022 -0.0109955 1 0 1 1 0 0 +EDGE2 5394 1653 -0.936503 0.0178909 0.0048712 1 0 1 1 0 0 +EDGE2 5394 2333 -0.995891 0.0593776 -0.0489188 1 0 1 1 0 0 +EDGE2 5394 2353 -1.05241 0.0618142 -0.00754486 1 0 1 1 0 0 +EDGE2 5394 1533 -1.05941 0.0180312 -0.00130029 1 0 1 1 0 0 +EDGE2 5394 5374 -0.0479243 -0.0417373 -0.0436946 1 0 1 1 0 0 +EDGE2 5394 1373 -1.06417 0.0576434 0.0282243 1 0 1 1 0 0 +EDGE2 5394 5354 -0.0287752 -0.0334299 0.0144069 1 0 1 1 0 0 +EDGE2 5394 2395 0.931239 0.0351971 -3.14375 1 0 1 1 0 0 +EDGE2 5394 1514 -0.0301378 0.017105 0.00425313 1 0 1 1 0 0 +EDGE2 5394 1654 -0.0243464 -0.0852024 0.0322068 1 0 1 1 0 0 +EDGE2 5394 2334 -0.0661709 -0.0537079 0.0432861 1 0 1 1 0 0 +EDGE2 5394 2354 0.0165155 0.0153282 0.00984351 1 0 1 1 0 0 +EDGE2 5394 1534 -0.180804 0.0138 0.00878481 1 0 1 1 0 0 +EDGE2 5394 5375 0.938608 -0.015265 -0.0041289 1 0 1 1 0 0 +EDGE2 5394 1374 -0.0348782 0.0135623 -0.0446869 1 0 1 1 0 0 +EDGE2 5394 5355 0.955174 0.0224126 -0.000541589 1 0 1 1 0 0 +EDGE2 5394 1855 1.03039 -0.0538023 -3.15179 1 0 1 1 0 0 +EDGE2 5394 2335 1.07073 -0.0117675 0.0181976 1 0 1 1 0 0 +EDGE2 5394 2355 1.02772 -0.102491 0.0135225 1 0 1 1 0 0 +EDGE2 5394 2375 0.935493 -0.0365585 -0.0214734 1 0 1 1 0 0 +EDGE2 5394 2315 0.990407 -0.159573 -3.15455 1 0 1 1 0 0 +EDGE2 5394 1595 1.08057 -0.0162525 -3.10445 1 0 1 1 0 0 +EDGE2 5394 1655 0.924908 -0.0506459 0.0416982 1 0 1 1 0 0 +EDGE2 5394 1575 1.01144 0.0675967 -3.14265 1 0 1 1 0 0 +EDGE2 5394 1375 0.895173 0.0360413 -0.000976872 1 0 1 1 0 0 +EDGE2 5394 1515 0.992283 0.01362 -0.00396769 1 0 1 1 0 0 +EDGE2 5395 1656 -0.070514 -1.00855 -1.53662 1 0 1 1 0 0 +EDGE2 5395 2376 0.0507438 -1.02595 -1.52594 1 0 1 1 0 0 +EDGE2 5395 2396 0.0123959 -1.05203 -1.56666 1 0 1 1 0 0 +EDGE2 5395 1856 0.0136978 -0.948291 -1.57392 1 0 1 1 0 0 +EDGE2 5395 1536 0.0731835 -0.937619 -1.53754 1 0 1 1 0 0 +EDGE2 5395 1576 -0.0514509 -0.986472 -1.57118 1 0 1 1 0 0 +EDGE2 5395 1376 0.0533525 -1.04947 -1.57371 1 0 1 1 0 0 +EDGE2 5395 1535 -0.0776144 0.0235289 0.00785671 1 0 1 1 0 0 +EDGE2 5395 2374 -0.943677 -0.0225044 0.0202258 1 0 1 1 0 0 +EDGE2 5395 5374 -1.03885 -0.0609933 -0.0113195 1 0 1 1 0 0 +EDGE2 5395 5394 -1.07187 0.000725489 -0.02601 1 0 1 1 0 0 +EDGE2 5395 5354 -0.969301 0.0266868 -0.00706839 1 0 1 1 0 0 +EDGE2 5395 2395 0.00992991 -0.0621558 -3.14443 1 0 1 1 0 0 +EDGE2 5395 1514 -0.948352 -0.042172 0.00304784 1 0 1 1 0 0 +EDGE2 5395 1654 -1.03543 -0.0297606 -0.0264753 1 0 1 1 0 0 +EDGE2 5395 2334 -1.00817 0.0189999 0.026335 1 0 1 1 0 0 +EDGE2 5395 2354 -0.972358 -0.034661 0.0189718 1 0 1 1 0 0 +EDGE2 5395 1534 -0.976007 0.0467966 0.0091167 1 0 1 1 0 0 +EDGE2 5395 5375 0.0279272 -0.0255741 0.00621802 1 0 1 1 0 0 +EDGE2 5395 1374 -1.07007 -0.0380188 -0.00673796 1 0 1 1 0 0 +EDGE2 5395 5355 0.0445484 0.114134 0.0014098 1 0 1 1 0 0 +EDGE2 5395 1855 0.00538859 0.0119298 -3.16717 1 0 1 1 0 0 +EDGE2 5395 2335 0.0656455 0.0224346 -0.00355905 1 0 1 1 0 0 +EDGE2 5395 2355 -0.112442 0.0256775 -0.00460394 1 0 1 1 0 0 +EDGE2 5395 2375 -0.0377192 0.0437342 0.0012477 1 0 1 1 0 0 +EDGE2 5395 2315 -0.00334114 -0.0204348 -3.12796 1 0 1 1 0 0 +EDGE2 5395 1595 0.0359866 -0.0319758 -3.17844 1 0 1 1 0 0 +EDGE2 5395 1655 0.0552311 -0.0281289 0.00815067 1 0 1 1 0 0 +EDGE2 5395 1575 -0.0655326 0.0452107 -3.12706 1 0 1 1 0 0 +EDGE2 5395 1854 0.997464 0.0212994 -3.1721 1 0 1 1 0 0 +EDGE2 5395 2394 1.03186 0.016185 -3.14172 1 0 1 1 0 0 +EDGE2 5395 1375 -0.0130901 -0.0549777 -0.0464949 1 0 1 1 0 0 +EDGE2 5395 1515 0.00552928 -0.00738838 -0.0196107 1 0 1 1 0 0 +EDGE2 5395 2314 0.933166 0.0601769 -3.14099 1 0 1 1 0 0 +EDGE2 5395 1574 1.03153 0.0586105 -3.13953 1 0 1 1 0 0 +EDGE2 5395 1594 1.02763 0.00649188 -3.16196 1 0 1 1 0 0 +EDGE2 5395 2336 0.0443863 1.00251 1.56737 1 0 1 1 0 0 +EDGE2 5395 5356 0.0163114 1.06235 1.56157 1 0 1 1 0 0 +EDGE2 5395 5376 -0.0104097 1.00453 1.56679 1 0 1 1 0 0 +EDGE2 5395 2356 0.0349487 1.04112 1.56242 1 0 1 1 0 0 +EDGE2 5395 1516 0.0434176 1.08508 1.56442 1 0 1 1 0 0 +EDGE2 5395 1596 0.0359862 1.01328 1.60272 1 0 1 1 0 0 +EDGE2 5395 2316 0.0311364 1.07804 1.56707 1 0 1 1 0 0 +EDGE2 5396 1535 -0.952284 0.043923 -1.57234 1 0 1 1 0 0 +EDGE2 5396 2395 -1.00219 0.0365751 1.5901 1 0 1 1 0 0 +EDGE2 5396 5375 -0.953981 -0.0337396 -1.57083 1 0 1 1 0 0 +EDGE2 5396 5395 -1.03487 0.0162629 -1.58184 1 0 1 1 0 0 +EDGE2 5396 5355 -0.963161 -0.00878575 -1.5697 1 0 1 1 0 0 +EDGE2 5396 1855 -0.954845 -0.00898898 1.57572 1 0 1 1 0 0 +EDGE2 5396 2335 -1.06591 0.0518231 -1.57822 1 0 1 1 0 0 +EDGE2 5396 2355 -1.00407 0.0670932 -1.5458 1 0 1 1 0 0 +EDGE2 5396 2375 -1.00024 0.0447549 -1.55034 1 0 1 1 0 0 +EDGE2 5396 2315 -1.04257 -0.0126054 1.57522 1 0 1 1 0 0 +EDGE2 5396 1595 -1.07038 -0.0194759 1.55286 1 0 1 1 0 0 +EDGE2 5396 1655 -1.0075 0.00859539 -1.55926 1 0 1 1 0 0 +EDGE2 5396 1575 -1.08523 0.0163639 1.57834 1 0 1 1 0 0 +EDGE2 5396 1375 -1.01134 -0.0114293 -1.64063 1 0 1 1 0 0 +EDGE2 5396 1515 -0.990612 0.022579 -1.57207 1 0 1 1 0 0 +EDGE2 5396 5377 1.00323 0.0539504 -0.00991954 1 0 1 1 0 0 +EDGE2 5396 2336 -0.0538211 0.0165316 -0.018757 1 0 1 1 0 0 +EDGE2 5396 5356 0.0201409 -0.0643102 -0.00426798 1 0 1 1 0 0 +EDGE2 5396 5376 0.00874696 0.0454177 -0.00460857 1 0 1 1 0 0 +EDGE2 5396 2356 -0.0362106 -0.0923601 0.0191913 1 0 1 1 0 0 +EDGE2 5396 1516 -0.011532 -0.00180324 -0.0261901 1 0 1 1 0 0 +EDGE2 5396 1596 0.0221726 0.0279755 0.00760815 1 0 1 1 0 0 +EDGE2 5396 2316 0.0311105 0.0171519 0.0184904 1 0 1 1 0 0 +EDGE2 5396 2337 1.06405 -0.0154825 0.00502002 1 0 1 1 0 0 +EDGE2 5396 5357 1.02569 0.0134622 0.0159815 1 0 1 1 0 0 +EDGE2 5396 2357 0.944466 0.0369313 -0.0238109 1 0 1 1 0 0 +EDGE2 5396 1597 0.941326 -0.0380778 -0.00820912 1 0 1 1 0 0 +EDGE2 5396 2317 1.07825 -0.0634712 -0.0123864 1 0 1 1 0 0 +EDGE2 5396 1517 1.00945 0.101911 -0.0404915 1 0 1 1 0 0 +EDGE2 5397 5377 0.0270495 0.020674 -0.0251906 1 0 1 1 0 0 +EDGE2 5397 2336 -0.938065 0.0561263 -0.00749805 1 0 1 1 0 0 +EDGE2 5397 5356 -1.02051 -0.0941486 0.00649721 1 0 1 1 0 0 +EDGE2 5397 5376 -0.999803 -0.00455639 0.00969898 1 0 1 1 0 0 +EDGE2 5397 5396 -1.02417 0.00830701 0.0493248 1 0 1 1 0 0 +EDGE2 5397 2356 -0.964348 0.0842162 -0.0192496 1 0 1 1 0 0 +EDGE2 5397 1516 -1.01057 -0.0532497 -0.00152558 1 0 1 1 0 0 +EDGE2 5397 1596 -0.955491 -0.0699495 -0.0056211 1 0 1 1 0 0 +EDGE2 5397 2316 -1.02411 -0.064092 0.0172595 1 0 1 1 0 0 +EDGE2 5397 2337 -0.00903335 -0.0352947 -0.00272709 1 0 1 1 0 0 +EDGE2 5397 5357 -0.0102698 0.0800752 -0.00149421 1 0 1 1 0 0 +EDGE2 5397 2357 -0.0774431 0.00470639 -0.00636975 1 0 1 1 0 0 +EDGE2 5397 1597 -0.0336895 -0.0403188 0.0122774 1 0 1 1 0 0 +EDGE2 5397 2317 -0.11771 -0.0208824 -0.0205328 1 0 1 1 0 0 +EDGE2 5397 1517 -0.00334388 -0.00792987 -0.0153175 1 0 1 1 0 0 +EDGE2 5397 1598 0.96886 -0.0040406 0.0222056 1 0 1 1 0 0 +EDGE2 5397 2338 1.024 -0.0294288 0.0115821 1 0 1 1 0 0 +EDGE2 5397 5358 0.991598 0.000500414 -0.0103014 1 0 1 1 0 0 +EDGE2 5397 5378 1.0112 0.0160396 -0.0242643 1 0 1 1 0 0 +EDGE2 5397 2358 0.974768 0.0554358 0.0036296 1 0 1 1 0 0 +EDGE2 5397 2318 1.05947 0.116809 -0.0348138 1 0 1 1 0 0 +EDGE2 5397 1518 0.949069 0.0422305 -0.0432081 1 0 1 1 0 0 +EDGE2 5398 5377 -0.944945 -0.0886051 -0.0101065 1 0 1 1 0 0 +EDGE2 5398 5397 -1.01342 0.0604129 -0.00224357 1 0 1 1 0 0 +EDGE2 5398 2337 -0.983882 -0.0459734 0.0125744 1 0 1 1 0 0 +EDGE2 5398 5357 -0.990161 0.0243814 0.0105075 1 0 1 1 0 0 +EDGE2 5398 2357 -0.978847 -0.0267175 0.00634845 1 0 1 1 0 0 +EDGE2 5398 1597 -0.878402 -0.00703667 -0.024468 1 0 1 1 0 0 +EDGE2 5398 2317 -1.00646 -0.00907473 0.0115657 1 0 1 1 0 0 +EDGE2 5398 1517 -1.039 0.0308586 -0.0353454 1 0 1 1 0 0 +EDGE2 5398 1598 -0.0505763 0.00180914 0.00923487 1 0 1 1 0 0 +EDGE2 5398 2338 -0.0611117 0.0701397 0.00672924 1 0 1 1 0 0 +EDGE2 5398 5358 -0.0316829 -0.0659147 0.0104918 1 0 1 1 0 0 +EDGE2 5398 5378 -0.0264498 -0.0422656 0.0141394 1 0 1 1 0 0 +EDGE2 5398 2358 -0.00180477 0.019791 0.014387 1 0 1 1 0 0 +EDGE2 5398 2318 0.065805 -0.0674807 -0.0235677 1 0 1 1 0 0 +EDGE2 5398 2359 1.0249 -0.00202444 -0.0248719 1 0 1 1 0 0 +EDGE2 5398 5379 0.959998 -0.0541198 -0.005409 1 0 1 1 0 0 +EDGE2 5398 1518 0.0375234 -0.0375331 -0.0160445 1 0 1 1 0 0 +EDGE2 5398 5359 1.02068 -0.0393336 0.0184464 1 0 1 1 0 0 +EDGE2 5398 1599 1.05368 -0.0103785 -0.0177344 1 0 1 1 0 0 +EDGE2 5398 2319 1.02299 0.0124215 -0.00249282 1 0 1 1 0 0 +EDGE2 5398 2339 0.922169 0.0169949 0.00101783 1 0 1 1 0 0 +EDGE2 5398 1519 0.964081 -0.01398 0.00542305 1 0 1 1 0 0 +EDGE2 5399 1598 -0.942397 0.0274573 0.0112599 1 0 1 1 0 0 +EDGE2 5399 2338 -0.986422 0.0612077 0.0158203 1 0 1 1 0 0 +EDGE2 5399 5358 -0.991488 -0.031304 0.0136643 1 0 1 1 0 0 +EDGE2 5399 5378 -0.959131 0.0148873 -0.0173064 1 0 1 1 0 0 +EDGE2 5399 5398 -0.960675 0.0382382 -0.0332279 1 0 1 1 0 0 +EDGE2 5399 2358 -0.998213 0.07183 0.0158766 1 0 1 1 0 0 +EDGE2 5399 2318 -0.961072 0.0115947 0.00729964 1 0 1 1 0 0 +EDGE2 5399 2359 -0.0188246 -0.0220473 0.00355688 1 0 1 1 0 0 +EDGE2 5399 5379 0.00692315 -0.0320792 -0.0153231 1 0 1 1 0 0 +EDGE2 5399 1518 -0.911886 0.121127 -0.00909289 1 0 1 1 0 0 +EDGE2 5399 5359 -0.00672033 0.030455 0.00475938 1 0 1 1 0 0 +EDGE2 5399 1599 -0.0160784 -0.054294 0.0086963 1 0 1 1 0 0 +EDGE2 5399 2319 -0.062175 -0.078052 0.00927749 1 0 1 1 0 0 +EDGE2 5399 2339 0.0412553 0.0118441 0.00988264 1 0 1 1 0 0 +EDGE2 5399 1519 0.0470626 -0.0146526 -7.7734e-05 1 0 1 1 0 0 +EDGE2 5399 2340 1.00322 -0.0203667 0.0092585 1 0 1 1 0 0 +EDGE2 5399 5340 0.980486 -0.0139044 -3.13564 1 0 1 1 0 0 +EDGE2 5399 5360 0.996382 0.042625 0.035382 1 0 1 1 0 0 +EDGE2 5399 5380 0.951827 0.0248334 0.0162562 1 0 1 1 0 0 +EDGE2 5399 2360 1.10793 -0.167123 -0.0267767 1 0 1 1 0 0 +EDGE2 5399 1520 0.988034 -0.0473005 -0.0145763 1 0 1 1 0 0 +EDGE2 5399 1620 0.996324 0.0167682 -3.13522 1 0 1 1 0 0 +EDGE2 5399 1640 0.994499 -0.0819293 -3.15187 1 0 1 1 0 0 +EDGE2 5399 2320 1.02916 0.0204253 -0.00449193 1 0 1 1 0 0 +EDGE2 5399 1600 0.96437 0.00279925 0.00542139 1 0 1 1 0 0 +EDGE2 5399 1320 1.01935 0.0120427 -3.17464 1 0 1 1 0 0 +EDGE2 5400 2359 -1.02665 -0.013756 -0.0168077 1 0 1 1 0 0 +EDGE2 5400 5379 -1.05164 -0.00301938 -0.00266513 1 0 1 1 0 0 +EDGE2 5400 5399 -1.06533 -0.0255426 -0.00324243 1 0 1 1 0 0 +EDGE2 5400 5359 -0.999246 -0.117464 0.0189706 1 0 1 1 0 0 +EDGE2 5400 1599 -0.997655 -0.0212593 -0.0242149 1 0 1 1 0 0 +EDGE2 5400 2319 -0.988855 -0.0129426 -0.000372338 1 0 1 1 0 0 +EDGE2 5400 2339 -0.93986 -0.0441136 0.000852906 1 0 1 1 0 0 +EDGE2 5400 1519 -0.980788 -0.0759119 0.0177111 1 0 1 1 0 0 +EDGE2 5400 2340 0.0416878 0.0329029 0.00553129 1 0 1 1 0 0 +EDGE2 5400 2341 -0.019637 0.98639 1.59355 1 0 1 1 0 0 +EDGE2 5400 5341 -0.0445342 0.951909 1.56339 1 0 1 1 0 0 +EDGE2 5400 5361 0.0647433 1.03022 1.58613 1 0 1 1 0 0 +EDGE2 5400 5381 0.0806921 1.02223 1.5651 1 0 1 1 0 0 +EDGE2 5400 2361 0.0555746 0.94534 1.56297 1 0 1 1 0 0 +EDGE2 5400 1521 0.0685429 0.982109 1.5848 1 0 1 1 0 0 +EDGE2 5400 1641 -0.0442961 1.06985 1.55919 1 0 1 1 0 0 +EDGE2 5400 2321 -0.0534192 1.04439 1.53497 1 0 1 1 0 0 +EDGE2 5400 1321 -0.0490728 1.03422 1.57569 1 0 1 1 0 0 +EDGE2 5400 5340 -0.0347118 -0.0725594 -3.1878 1 0 1 1 0 0 +EDGE2 5400 5360 0.0947053 -0.0297503 0.00150423 1 0 1 1 0 0 +EDGE2 5400 5380 0.000341402 -0.0415773 0.0200032 1 0 1 1 0 0 +EDGE2 5400 2360 -0.0629875 0.0659471 0.0191741 1 0 1 1 0 0 +EDGE2 5400 1520 -0.0353598 -0.0281742 -0.0111963 1 0 1 1 0 0 +EDGE2 5400 1620 0.0529941 0.0170786 -3.13212 1 0 1 1 0 0 +EDGE2 5400 1640 -0.0549535 0.00155572 -3.10517 1 0 1 1 0 0 +EDGE2 5400 2320 -0.056545 -0.0180873 -0.00921218 1 0 1 1 0 0 +EDGE2 5400 1600 -0.00619174 0.0521902 0.031199 1 0 1 1 0 0 +EDGE2 5400 1621 0.0229356 -1.00533 -1.55774 1 0 1 1 0 0 +EDGE2 5400 1320 0.0281235 -0.0721511 -3.12953 1 0 1 1 0 0 +EDGE2 5400 1601 0.0440817 -1.03401 -1.54354 1 0 1 1 0 0 +EDGE2 5400 1619 0.952166 -0.0812463 -3.12908 1 0 1 1 0 0 +EDGE2 5400 5339 1.02899 -0.0252782 -3.10032 1 0 1 1 0 0 +EDGE2 5400 1639 1.02573 0.0165644 -3.14468 1 0 1 1 0 0 +EDGE2 5400 1319 1.03301 0.0374597 -3.13135 1 0 1 1 0 0 +EDGE2 5401 2340 -1.00326 0.00970466 1.56028 1 0 1 1 0 0 +EDGE2 5401 5400 -0.977595 -0.0750499 1.56177 1 0 1 1 0 0 +EDGE2 5401 5340 -1.05781 0.0205514 -1.5887 1 0 1 1 0 0 +EDGE2 5401 5360 -1.05422 -0.0736096 1.54586 1 0 1 1 0 0 +EDGE2 5401 5380 -1.03247 -0.0268382 1.56761 1 0 1 1 0 0 +EDGE2 5401 2360 -1.05881 -0.0470404 1.55331 1 0 1 1 0 0 +EDGE2 5401 1520 -0.965873 0.0495535 1.54486 1 0 1 1 0 0 +EDGE2 5401 1620 -0.998432 0.0441501 -1.58853 1 0 1 1 0 0 +EDGE2 5401 1640 -1.05329 -0.0206574 -1.59995 1 0 1 1 0 0 +EDGE2 5401 2320 -1.01801 0.022784 1.55997 1 0 1 1 0 0 +EDGE2 5401 1600 -0.958082 -0.0521398 1.57583 1 0 1 1 0 0 +EDGE2 5401 1621 0.0121032 -0.0960437 -0.0036426 1 0 1 1 0 0 +EDGE2 5401 1320 -1.04363 0.0383038 -1.56176 1 0 1 1 0 0 +EDGE2 5401 1601 -0.0282802 0.0125671 -0.00351111 1 0 1 1 0 0 +EDGE2 5401 1602 1.03763 -0.0510846 0.013333 1 0 1 1 0 0 +EDGE2 5401 1622 1.02475 -0.0702486 -0.0090857 1 0 1 1 0 0 +EDGE2 5402 1621 -1.02336 0.0130041 0.0306808 1 0 1 1 0 0 +EDGE2 5402 5401 -0.959156 -0.0184961 0.0294806 1 0 1 1 0 0 +EDGE2 5402 1601 -1.0262 -0.0585903 -0.0282389 1 0 1 1 0 0 +EDGE2 5402 1603 0.933884 -0.0103621 -0.0142933 1 0 1 1 0 0 +EDGE2 5402 1602 -0.060334 0.0131738 -0.014332 1 0 1 1 0 0 +EDGE2 5402 1622 0.0501321 0.0356553 0.0449516 1 0 1 1 0 0 +EDGE2 5402 1623 1.07805 -0.0252785 -0.00867629 1 0 1 1 0 0 +EDGE2 5403 5402 -0.929441 -0.0720167 0.0158884 1 0 1 1 0 0 +EDGE2 5403 1603 0.0245509 -0.0236336 -0.00401229 1 0 1 1 0 0 +EDGE2 5403 1602 -1.00094 -0.0213714 -0.0311096 1 0 1 1 0 0 +EDGE2 5403 1622 -1.07651 0.0518196 -0.0201021 1 0 1 1 0 0 +EDGE2 5403 1623 -0.0632566 0.0349198 -0.00121538 1 0 1 1 0 0 +EDGE2 5403 1624 1.02292 0.00831696 -0.0101913 1 0 1 1 0 0 +EDGE2 5403 1604 1.00132 -0.11057 -0.0201439 1 0 1 1 0 0 +EDGE2 5404 1603 -0.973397 0.0386099 -0.000453481 1 0 1 1 0 0 +EDGE2 5404 5403 -0.999136 -0.00133667 0.0160327 1 0 1 1 0 0 +EDGE2 5404 1623 -0.896389 0.108446 0.010876 1 0 1 1 0 0 +EDGE2 5404 1624 0.0144108 0.00348982 -0.0227139 1 0 1 1 0 0 +EDGE2 5404 1604 -0.0362392 0.00493834 0.0163866 1 0 1 1 0 0 +EDGE2 5404 1625 0.981078 0.0374315 -0.0210155 1 0 1 1 0 0 +EDGE2 5404 2825 0.9453 0.0441801 -3.1465 1 0 1 1 0 0 +EDGE2 5404 1285 0.988497 -0.0851471 -3.14152 1 0 1 1 0 0 +EDGE2 5404 1305 0.909507 0.0124646 -3.13165 1 0 1 1 0 0 +EDGE2 5404 1605 1.07956 -0.0619554 0.00327326 1 0 1 1 0 0 +EDGE2 5405 1624 -1.01754 -0.0348546 0.0149957 1 0 1 1 0 0 +EDGE2 5405 5404 -1.05487 0.0171116 0.0223963 1 0 1 1 0 0 +EDGE2 5405 1604 -0.939346 0.0499743 -0.0184388 1 0 1 1 0 0 +EDGE2 5405 1304 0.991621 0.0417019 -3.13515 1 0 1 1 0 0 +EDGE2 5405 1625 0.0438567 -0.0205923 -0.00164275 1 0 1 1 0 0 +EDGE2 5405 1286 -0.0623724 -1.09397 -1.57726 1 0 1 1 0 0 +EDGE2 5405 2826 -0.00112308 -1.05655 -1.57642 1 0 1 1 0 0 +EDGE2 5405 2825 0.0904826 -0.00286734 -3.16237 1 0 1 1 0 0 +EDGE2 5405 1285 0.0684938 0.0466001 -3.14295 1 0 1 1 0 0 +EDGE2 5405 1305 -0.0110881 0.0227488 -3.1259 1 0 1 1 0 0 +EDGE2 5405 1605 0.0894126 -0.0158131 -0.0224322 1 0 1 1 0 0 +EDGE2 5405 2824 1.10658 0.028924 -3.11742 1 0 1 1 0 0 +EDGE2 5405 1284 1.05468 0.0280364 -3.09246 1 0 1 1 0 0 +EDGE2 5405 1606 0.0589226 1.05045 1.56907 1 0 1 1 0 0 +EDGE2 5405 1626 -0.0715311 1.02843 1.58143 1 0 1 1 0 0 +EDGE2 5405 1306 0.0221975 0.942843 1.58804 1 0 1 1 0 0 +EDGE2 5406 1625 -1.04588 0.0263747 -1.59768 1 0 1 1 0 0 +EDGE2 5406 5405 -0.96459 -0.0192677 -1.55955 1 0 1 1 0 0 +EDGE2 5406 2825 -1.00961 0.119119 1.58175 1 0 1 1 0 0 +EDGE2 5406 1285 -0.922393 0.0242603 1.59371 1 0 1 1 0 0 +EDGE2 5406 1305 -1.04607 -0.0297663 1.53031 1 0 1 1 0 0 +EDGE2 5406 1605 -0.985611 -0.0999906 -1.575 1 0 1 1 0 0 +EDGE2 5406 1606 -0.0340824 0.00326921 -0.0232981 1 0 1 1 0 0 +EDGE2 5406 1626 -0.0176266 -0.0565867 0.014137 1 0 1 1 0 0 +EDGE2 5406 1306 -0.0922191 0.00310107 -0.0227803 1 0 1 1 0 0 +EDGE2 5406 1607 1.04281 -0.0627108 0.0129475 1 0 1 1 0 0 +EDGE2 5406 1627 0.991199 -0.0395906 -0.0151295 1 0 1 1 0 0 +EDGE2 5406 1307 0.957181 0.0592944 -0.0127387 1 0 1 1 0 0 +EDGE2 5407 1606 -1.04707 0.0374918 0.0143511 1 0 1 1 0 0 +EDGE2 5407 1626 -1.00075 -0.0473341 -0.0156439 1 0 1 1 0 0 +EDGE2 5407 5406 -0.955763 0.00650336 -0.0398195 1 0 1 1 0 0 +EDGE2 5407 1306 -0.920536 -0.0624047 -0.00205914 1 0 1 1 0 0 +EDGE2 5407 1607 -0.0587574 0.0250962 -0.02042 1 0 1 1 0 0 +EDGE2 5407 1627 -0.0202638 -0.0168523 -0.0119343 1 0 1 1 0 0 +EDGE2 5407 1307 -0.0360428 -0.00125152 0.0117844 1 0 1 1 0 0 +EDGE2 5407 1308 1.0167 -0.0180987 0.0299799 1 0 1 1 0 0 +EDGE2 5407 1608 1.00806 0.0333388 -0.019174 1 0 1 1 0 0 +EDGE2 5407 1628 1.03753 0.0424254 -0.0349354 1 0 1 1 0 0 +EDGE2 5408 1607 -1.064 0.0722172 -0.0124749 1 0 1 1 0 0 +EDGE2 5408 1627 -0.966777 -0.0259059 0.0301404 1 0 1 1 0 0 +EDGE2 5408 5407 -0.992856 0.00307657 -0.0158033 1 0 1 1 0 0 +EDGE2 5408 1307 -0.970388 0.0412962 -0.0204461 1 0 1 1 0 0 +EDGE2 5408 1609 0.987427 0.0449009 -0.00318623 1 0 1 1 0 0 +EDGE2 5408 1629 0.947899 -0.0327702 -0.0112666 1 0 1 1 0 0 +EDGE2 5408 1308 -0.00306005 0.0463696 0.0143658 1 0 1 1 0 0 +EDGE2 5408 1608 -0.0856292 -0.0630517 -0.016565 1 0 1 1 0 0 +EDGE2 5408 1628 -0.00491978 0.012692 0.00988128 1 0 1 1 0 0 +EDGE2 5408 1309 1.00664 -0.0466696 0.00570758 1 0 1 1 0 0 +EDGE2 5409 5408 -0.97268 -0.0426527 -0.00375082 1 0 1 1 0 0 +EDGE2 5409 1609 -0.00648202 0.00516753 0.00110205 1 0 1 1 0 0 +EDGE2 5409 1629 -0.00115333 -0.0388592 0.00921125 1 0 1 1 0 0 +EDGE2 5409 1308 -1.02576 -0.0523702 0.0380065 1 0 1 1 0 0 +EDGE2 5409 1608 -1.02528 0.0684429 -0.00011862 1 0 1 1 0 0 +EDGE2 5409 1628 -1.10112 -0.108188 -0.0255099 1 0 1 1 0 0 +EDGE2 5409 1309 -0.0134828 0.0150983 -0.0214084 1 0 1 1 0 0 +EDGE2 5409 1610 1.05662 -0.014702 -0.0318027 1 0 1 1 0 0 +EDGE2 5409 1630 0.981594 0.0371573 0.00942239 1 0 1 1 0 0 +EDGE2 5409 4730 1.01152 -0.0527845 -3.14611 1 0 1 1 0 0 +EDGE2 5409 1310 1.01673 -0.0319595 -0.0209196 1 0 1 1 0 0 +EDGE2 5410 1609 -1.03018 -0.049806 -0.0152039 1 0 1 1 0 0 +EDGE2 5410 1629 -0.985234 0.0721728 -0.00507816 1 0 1 1 0 0 +EDGE2 5410 5409 -0.963373 -0.000351033 -0.0105658 1 0 1 1 0 0 +EDGE2 5410 1309 -1.04355 -0.033949 0.0160619 1 0 1 1 0 0 +EDGE2 5410 1611 -0.0527178 1.05864 1.56374 1 0 1 1 0 0 +EDGE2 5410 1631 -0.0469522 1.01778 1.57371 1 0 1 1 0 0 +EDGE2 5410 1311 -0.0101708 1.02349 1.58748 1 0 1 1 0 0 +EDGE2 5410 1610 0.0315281 0.046684 0.039845 1 0 1 1 0 0 +EDGE2 5410 1630 0.0286542 0.0483341 -0.0190485 1 0 1 1 0 0 +EDGE2 5410 4730 0.0183394 0.0356573 -3.12148 1 0 1 1 0 0 +EDGE2 5410 1310 0.0403126 -0.051123 -0.0212879 1 0 1 1 0 0 +EDGE2 5410 4731 0.00518712 -0.987184 -1.57716 1 0 1 1 0 0 +EDGE2 5410 4729 0.996147 -0.0107015 -3.12616 1 0 1 1 0 0 +EDGE2 5411 5410 -1.059 -0.0564007 1.59591 1 0 1 1 0 0 +EDGE2 5411 1610 -1.00919 0.0142786 1.59903 1 0 1 1 0 0 +EDGE2 5411 1630 -1.00019 0.0294524 1.56001 1 0 1 1 0 0 +EDGE2 5411 4730 -0.911436 -0.0197211 -1.57506 1 0 1 1 0 0 +EDGE2 5411 1310 -0.968074 0.0672575 1.54151 1 0 1 1 0 0 +EDGE2 5411 4731 -0.0101917 0.0154056 0.0105459 1 0 1 1 0 0 +EDGE2 5411 4732 0.968731 0.0194712 -0.00145278 1 0 1 1 0 0 +EDGE2 5412 5411 -0.977521 -0.0480169 -0.0339337 1 0 1 1 0 0 +EDGE2 5412 4731 -0.949333 -0.0820209 0.00732675 1 0 1 1 0 0 +EDGE2 5412 4732 -0.0831765 -0.0751291 -0.0117558 1 0 1 1 0 0 +EDGE2 5412 4733 0.984229 -0.0147422 -0.00381469 1 0 1 1 0 0 +EDGE2 5413 5412 -1.02499 0.0114428 0.0140115 1 0 1 1 0 0 +EDGE2 5413 4732 -0.997065 -0.0336231 0.00444516 1 0 1 1 0 0 +EDGE2 5413 4734 0.954655 0.00784651 -0.0148028 1 0 1 1 0 0 +EDGE2 5413 4733 -0.0100053 -0.0173299 -0.0282377 1 0 1 1 0 0 +EDGE2 5414 5413 -0.984727 -0.0642826 0.043859 1 0 1 1 0 0 +EDGE2 5414 2815 0.97464 -0.0236546 -3.13039 1 0 1 1 0 0 +EDGE2 5414 4755 1.0743 0.0703007 -3.16958 1 0 1 1 0 0 +EDGE2 5414 4734 0.057002 -0.0198711 -0.0062492 1 0 1 1 0 0 +EDGE2 5414 4733 -1.01244 0.00642179 -0.0136103 1 0 1 1 0 0 +EDGE2 5414 4735 1.01263 -0.100287 -0.00970681 1 0 1 1 0 0 +EDGE2 5414 2795 0.96993 0.00263152 -3.1437 1 0 1 1 0 0 +EDGE2 5415 2816 -0.066199 -1.04627 -1.60112 1 0 1 1 0 0 +EDGE2 5415 4736 0.0686398 -1.07765 -1.57298 1 0 1 1 0 0 +EDGE2 5415 2796 -0.0188894 -0.986869 -1.59321 1 0 1 1 0 0 +EDGE2 5415 2815 0.0155639 0.0192469 -3.15068 1 0 1 1 0 0 +EDGE2 5415 4755 0.0596601 -0.0196872 -3.12255 1 0 1 1 0 0 +EDGE2 5415 4734 -1.02333 -0.0339782 0.0470931 1 0 1 1 0 0 +EDGE2 5415 5414 -1.04516 0.114297 -0.0329902 1 0 1 1 0 0 +EDGE2 5415 4735 0.0405564 0.028506 -0.00607157 1 0 1 1 0 0 +EDGE2 5415 2814 1.04022 -0.00882296 -3.15847 1 0 1 1 0 0 +EDGE2 5415 4754 1.01805 -0.0304171 -3.12046 1 0 1 1 0 0 +EDGE2 5415 2795 0.0058093 -0.00830125 -3.13843 1 0 1 1 0 0 +EDGE2 5415 2794 1.05026 3.20481e-05 -3.13997 1 0 1 1 0 0 +EDGE2 5415 4756 0.0280315 1.02022 1.54077 1 0 1 1 0 0 +EDGE2 5416 2817 1.00724 -0.00601852 0.0221078 1 0 1 1 0 0 +EDGE2 5416 4737 1.0306 -0.0683043 0.0132656 1 0 1 1 0 0 +EDGE2 5416 2797 1.00861 -0.0363852 0.0191468 1 0 1 1 0 0 +EDGE2 5416 2816 0.0429674 0.050846 -0.0205601 1 0 1 1 0 0 +EDGE2 5416 4736 -0.0773627 -0.00789371 0.0271777 1 0 1 1 0 0 +EDGE2 5416 2796 0.0647175 -0.0720713 0.0135735 1 0 1 1 0 0 +EDGE2 5416 2815 -0.961503 0.0305534 -1.55109 1 0 1 1 0 0 +EDGE2 5416 4755 -1.05103 0.00897858 -1.59403 1 0 1 1 0 0 +EDGE2 5416 5415 -0.997801 -0.00391264 1.57041 1 0 1 1 0 0 +EDGE2 5416 4735 -0.959191 -0.0858682 1.60329 1 0 1 1 0 0 +EDGE2 5416 2795 -0.952358 -0.00558599 -1.50809 1 0 1 1 0 0 +EDGE2 5417 2818 0.961453 0.00296786 0.0162288 1 0 1 1 0 0 +EDGE2 5417 4738 0.950161 -0.0356381 0.000252749 1 0 1 1 0 0 +EDGE2 5417 2798 0.986381 0.0832466 -0.0289533 1 0 1 1 0 0 +EDGE2 5417 2817 0.0351268 0.0590825 -0.036233 1 0 1 1 0 0 +EDGE2 5417 4737 -0.00800105 0.0176666 -0.0197289 1 0 1 1 0 0 +EDGE2 5417 2797 0.0324646 -0.0237468 0.00455161 1 0 1 1 0 0 +EDGE2 5417 2816 -1.05331 -0.0268668 -0.00720458 1 0 1 1 0 0 +EDGE2 5417 4736 -1.07684 0.0197692 -0.023483 1 0 1 1 0 0 +EDGE2 5417 5416 -1.01962 -0.0122862 -0.00758178 1 0 1 1 0 0 +EDGE2 5417 2796 -0.962385 0.0244412 0.000587186 1 0 1 1 0 0 +EDGE2 5418 4739 0.965375 -0.0827722 0.0389549 1 0 1 1 0 0 +EDGE2 5418 2819 1.01249 -0.0487291 -0.024726 1 0 1 1 0 0 +EDGE2 5418 2799 1.11051 0.00352816 0.00812978 1 0 1 1 0 0 +EDGE2 5418 2818 0.112813 -0.0324857 -0.00519175 1 0 1 1 0 0 +EDGE2 5418 4738 -0.111667 0.0250539 0.00479094 1 0 1 1 0 0 +EDGE2 5418 2798 0.0347212 0.0305451 0.0216296 1 0 1 1 0 0 +EDGE2 5418 2817 -0.887541 0.0111987 -0.0107618 1 0 1 1 0 0 +EDGE2 5418 4737 -1.07022 -0.104331 -0.00133461 1 0 1 1 0 0 +EDGE2 5418 5417 -1.02239 -0.00471423 0.0160664 1 0 1 1 0 0 +EDGE2 5418 2797 -0.96098 -0.0529076 -0.0101276 1 0 1 1 0 0 +EDGE2 5419 2840 0.998874 0.0894485 -3.15211 1 0 1 1 0 0 +EDGE2 5419 4740 0.99356 0.00583716 0.00979887 1 0 1 1 0 0 +EDGE2 5419 1300 1.05433 0.0483541 -3.13833 1 0 1 1 0 0 +EDGE2 5419 2800 1.10523 -0.0214268 0.00358608 1 0 1 1 0 0 +EDGE2 5419 2820 1.01002 -0.0230495 -0.0051397 1 0 1 1 0 0 +EDGE2 5419 1280 1.01445 0.0298459 -3.15634 1 0 1 1 0 0 +EDGE2 5419 4739 0.0128327 -0.0655237 -0.00691055 1 0 1 1 0 0 +EDGE2 5419 5418 -0.990489 -0.0933816 0.0186366 1 0 1 1 0 0 +EDGE2 5419 2819 -0.0832475 0.0110345 0.00507658 1 0 1 1 0 0 +EDGE2 5419 2799 0.108825 -0.0146113 0.0397798 1 0 1 1 0 0 +EDGE2 5419 2818 -0.894913 0.0401279 0.0279174 1 0 1 1 0 0 +EDGE2 5419 4738 -1.10159 0.0475769 4.31262e-05 1 0 1 1 0 0 +EDGE2 5419 2798 -0.962618 0.00714425 0.0259643 1 0 1 1 0 0 +EDGE2 5420 1299 1.04155 -0.0571981 -3.13178 1 0 1 1 0 0 +EDGE2 5420 2839 0.953833 -0.022711 -3.14693 1 0 1 1 0 0 +EDGE2 5420 1279 1.04468 0.0777033 -3.13258 1 0 1 1 0 0 +EDGE2 5420 2840 0.00278034 0.0350471 -3.15833 1 0 1 1 0 0 +EDGE2 5420 2821 0.00171427 -1.02994 -1.5587 1 0 1 1 0 0 +EDGE2 5420 1281 -0.00976269 -0.977702 -1.53695 1 0 1 1 0 0 +EDGE2 5420 1301 -0.0318773 -1.09148 -1.57193 1 0 1 1 0 0 +EDGE2 5420 4740 -0.081712 -0.0230858 0.0033507 1 0 1 1 0 0 +EDGE2 5420 1300 0.0771553 0.0973347 -3.14371 1 0 1 1 0 0 +EDGE2 5420 2800 0.0386569 0.0314034 -0.0234564 1 0 1 1 0 0 +EDGE2 5420 2820 -0.05535 0.00872969 0.0334815 1 0 1 1 0 0 +EDGE2 5420 1280 0.0429523 -0.00166871 -3.10038 1 0 1 1 0 0 +EDGE2 5420 2801 0.00904533 1.12126 1.5534 1 0 1 1 0 0 +EDGE2 5420 2841 -0.0117808 1.01641 1.56399 1 0 1 1 0 0 +EDGE2 5420 4741 0.0781892 1.02204 1.54898 1 0 1 1 0 0 +EDGE2 5420 4739 -0.995516 -0.0575327 -0.00721775 1 0 1 1 0 0 +EDGE2 5420 5419 -0.927798 0.099768 0.00114054 1 0 1 1 0 0 +EDGE2 5420 2819 -0.899226 0.007685 0.0133484 1 0 1 1 0 0 +EDGE2 5420 2799 -1.03551 0.00470989 0.00218083 1 0 1 1 0 0 +EDGE2 5421 4742 1.0201 -0.0493036 0.0142301 1 0 1 1 0 0 +EDGE2 5421 2840 -1.04385 -0.000479845 1.55296 1 0 1 1 0 0 +EDGE2 5421 5420 -0.927779 0.0133632 -1.56438 1 0 1 1 0 0 +EDGE2 5421 4740 -0.985712 0.0227697 -1.57056 1 0 1 1 0 0 +EDGE2 5421 1300 -1.03305 -0.00336669 1.56699 1 0 1 1 0 0 +EDGE2 5421 2800 -0.989398 0.0101787 -1.5611 1 0 1 1 0 0 +EDGE2 5421 2820 -0.917167 -0.0254032 -1.58419 1 0 1 1 0 0 +EDGE2 5421 1280 -0.986194 0.0034973 1.52704 1 0 1 1 0 0 +EDGE2 5421 2801 -0.0200927 0.0157589 0.0357944 1 0 1 1 0 0 +EDGE2 5421 2841 0.0340927 0.0184032 0.0150778 1 0 1 1 0 0 +EDGE2 5421 4741 0.0882895 0.0740187 0.0325691 1 0 1 1 0 0 +EDGE2 5421 2802 1.02169 -0.0120616 -0.00299382 1 0 1 1 0 0 +EDGE2 5421 2842 0.901843 0.00595341 -0.00498408 1 0 1 1 0 0 +EDGE2 5422 4742 -0.0331871 -0.03805 0.00201168 1 0 1 1 0 0 +EDGE2 5422 5421 -0.944545 0.0133223 -0.0246281 1 0 1 1 0 0 +EDGE2 5422 2801 -1.06423 0.0174411 0.0126743 1 0 1 1 0 0 +EDGE2 5422 2841 -1.02214 0.00923972 0.00339233 1 0 1 1 0 0 +EDGE2 5422 4741 -0.997486 -0.0459251 -0.0332623 1 0 1 1 0 0 +EDGE2 5422 2802 -0.0638906 0.0786282 -0.0219139 1 0 1 1 0 0 +EDGE2 5422 2842 -0.00969162 0.0125276 -0.0168186 1 0 1 1 0 0 +EDGE2 5422 2843 1.04722 0.0117037 0.00706655 1 0 1 1 0 0 +EDGE2 5422 4743 1.03703 -0.048824 -0.0171259 1 0 1 1 0 0 +EDGE2 5422 2803 1.01369 -0.0355654 0.020611 1 0 1 1 0 0 +EDGE2 5423 4742 -0.989826 0.00937167 0.00147785 1 0 1 1 0 0 +EDGE2 5423 5422 -0.991971 -0.0294928 0.00949289 1 0 1 1 0 0 +EDGE2 5423 2802 -1.02467 -0.0832445 0.0295999 1 0 1 1 0 0 +EDGE2 5423 2842 -1.0305 0.0325093 -0.0125747 1 0 1 1 0 0 +EDGE2 5423 2843 0.0188988 0.081485 -0.0267013 1 0 1 1 0 0 +EDGE2 5423 4743 0.0552775 -0.0631534 -0.0216752 1 0 1 1 0 0 +EDGE2 5423 2803 0.0787762 -0.0400517 -0.0291213 1 0 1 1 0 0 +EDGE2 5423 2804 0.943005 -0.0186141 -0.0172156 1 0 1 1 0 0 +EDGE2 5423 2844 0.972412 -0.00773131 -0.0176133 1 0 1 1 0 0 +EDGE2 5423 4744 0.978846 -0.0834058 0.0182591 1 0 1 1 0 0 +EDGE2 5424 4745 0.910685 0.0125086 0.012552 1 0 1 1 0 0 +EDGE2 5424 2843 -1.08644 -0.0232089 0.0214242 1 0 1 1 0 0 +EDGE2 5424 4743 -0.886282 -0.04954 -0.036749 1 0 1 1 0 0 +EDGE2 5424 5423 -0.916994 -0.0480774 0.00632414 1 0 1 1 0 0 +EDGE2 5424 2803 -0.932583 -0.0633353 -0.0166637 1 0 1 1 0 0 +EDGE2 5424 2804 -0.0041869 0.0253953 -0.0169404 1 0 1 1 0 0 +EDGE2 5424 2844 0.0518546 0.115757 0.0339176 1 0 1 1 0 0 +EDGE2 5424 4744 -0.0348883 -0.0370753 0.0115636 1 0 1 1 0 0 +EDGE2 5424 2685 0.881333 -0.0415876 -3.17455 1 0 1 1 0 0 +EDGE2 5424 2785 1.01634 -0.0287264 -3.13633 1 0 1 1 0 0 +EDGE2 5424 2805 1.0487 -0.0288408 0.0151813 1 0 1 1 0 0 +EDGE2 5424 2845 1.04948 -0.0704126 0.0206908 1 0 1 1 0 0 +EDGE2 5424 2765 0.984915 -0.0172753 -3.12043 1 0 1 1 0 0 +EDGE2 5424 2625 0.945168 -0.0712368 -3.15067 1 0 1 1 0 0 +EDGE2 5425 2766 0.025177 -1.05098 -1.57195 1 0 1 1 0 0 +EDGE2 5425 2846 0.00414783 -0.950809 -1.56569 1 0 1 1 0 0 +EDGE2 5425 2686 -0.0277585 -0.906883 -1.57644 1 0 1 1 0 0 +EDGE2 5425 2626 -0.017902 -1.01693 -1.591 1 0 1 1 0 0 +EDGE2 5425 2786 0.0158835 0.986306 1.56532 1 0 1 1 0 0 +EDGE2 5425 2624 1.00225 -0.00616981 -3.12627 1 0 1 1 0 0 +EDGE2 5425 4745 -0.0585661 -0.0354407 -0.0219245 1 0 1 1 0 0 +EDGE2 5425 5424 -1.0135 0.0660343 0.0316119 1 0 1 1 0 0 +EDGE2 5425 2804 -0.966895 0.0449148 -0.0290561 1 0 1 1 0 0 +EDGE2 5425 2844 -0.977942 -0.0207848 -0.0254482 1 0 1 1 0 0 +EDGE2 5425 4744 -0.973757 0.0374256 0.0158213 1 0 1 1 0 0 +EDGE2 5425 2685 -0.0617215 -0.0267573 -3.14225 1 0 1 1 0 0 +EDGE2 5425 2785 -0.0021984 0.0104368 -3.18008 1 0 1 1 0 0 +EDGE2 5425 2805 0.121077 0.0372164 0.00843912 1 0 1 1 0 0 +EDGE2 5425 2845 0.0175949 0.0278318 -0.0495307 1 0 1 1 0 0 +EDGE2 5425 2765 0.0133154 0.0324818 -3.16807 1 0 1 1 0 0 +EDGE2 5425 2764 0.998456 0.11404 -3.15191 1 0 1 1 0 0 +EDGE2 5425 2784 0.989779 -0.0442962 -3.16749 1 0 1 1 0 0 +EDGE2 5425 2625 -0.0107553 -0.0290482 -3.16026 1 0 1 1 0 0 +EDGE2 5425 2684 0.941564 0.0457378 -3.18076 1 0 1 1 0 0 +EDGE2 5425 4746 0.0360983 0.995492 1.5545 1 0 1 1 0 0 +EDGE2 5425 2806 0.0227423 0.983026 1.55378 1 0 1 1 0 0 +EDGE2 5426 2766 -0.0700324 -0.0268407 -0.0173738 1 0 1 1 0 0 +EDGE2 5426 2687 0.998478 0.0243933 0.0118439 1 0 1 1 0 0 +EDGE2 5426 2847 1.10335 -0.0430852 -0.0267512 1 0 1 1 0 0 +EDGE2 5426 2767 0.881239 -0.000275498 0.03702 1 0 1 1 0 0 +EDGE2 5426 2627 1.02524 -0.0167035 0.0152573 1 0 1 1 0 0 +EDGE2 5426 2846 -0.0326437 0.0312054 0.0166983 1 0 1 1 0 0 +EDGE2 5426 2686 -0.0101338 0.0069654 0.00733445 1 0 1 1 0 0 +EDGE2 5426 2626 -0.0439858 0.00156313 -0.0284005 1 0 1 1 0 0 +EDGE2 5426 4745 -0.990525 -0.0483066 1.54051 1 0 1 1 0 0 +EDGE2 5426 5425 -0.984787 0.0268577 1.57503 1 0 1 1 0 0 +EDGE2 5426 2685 -1.04769 0.0489465 -1.56269 1 0 1 1 0 0 +EDGE2 5426 2785 -1.02116 0.0414096 -1.55687 1 0 1 1 0 0 +EDGE2 5426 2805 -0.959333 -0.0177998 1.55954 1 0 1 1 0 0 +EDGE2 5426 2845 -0.914375 0.0309475 1.58674 1 0 1 1 0 0 +EDGE2 5426 2765 -0.957931 -0.0771225 -1.5913 1 0 1 1 0 0 +EDGE2 5426 2625 -1.05418 0.0022683 -1.56262 1 0 1 1 0 0 +EDGE2 5427 2766 -1.05956 0.0176853 -0.0122757 1 0 1 1 0 0 +EDGE2 5427 2687 0.0110164 -0.0847674 -0.00610411 1 0 1 1 0 0 +EDGE2 5427 2688 1.03307 -0.0244937 0.0122745 1 0 1 1 0 0 +EDGE2 5427 2848 1.04922 0.0161872 0.0148112 1 0 1 1 0 0 +EDGE2 5427 2768 0.92239 -0.0714379 0.023205 1 0 1 1 0 0 +EDGE2 5427 2847 -0.0203337 0.0148391 0.0308343 1 0 1 1 0 0 +EDGE2 5427 2628 0.98771 0.0713808 0.0116659 1 0 1 1 0 0 +EDGE2 5427 2767 0.0517361 0.114456 0.00591794 1 0 1 1 0 0 +EDGE2 5427 5426 -0.964818 0.000612641 -0.00622641 1 0 1 1 0 0 +EDGE2 5427 2627 0.00662328 0.0251189 0.0114038 1 0 1 1 0 0 +EDGE2 5427 2846 -0.917793 0.00599421 0.0435555 1 0 1 1 0 0 +EDGE2 5427 2686 -0.954179 0.0234147 0.0300128 1 0 1 1 0 0 +EDGE2 5427 2626 -1.027 -0.00237503 -0.0163712 1 0 1 1 0 0 +EDGE2 5428 2689 1.06343 -0.0153488 -0.00667592 1 0 1 1 0 0 +EDGE2 5428 2849 0.979479 -0.0436957 0.0010667 1 0 1 1 0 0 +EDGE2 5428 2769 1.04162 0.0372334 -0.0255548 1 0 1 1 0 0 +EDGE2 5428 2687 -1.05164 -0.0396062 -0.049724 1 0 1 1 0 0 +EDGE2 5428 2688 -0.0369851 0.0581825 -0.0220316 1 0 1 1 0 0 +EDGE2 5428 2848 0.00772905 0.0288078 0.0118494 1 0 1 1 0 0 +EDGE2 5428 2629 1.05349 -0.00925221 -0.00962555 1 0 1 1 0 0 +EDGE2 5428 2768 0.0507799 0.111407 0.00807028 1 0 1 1 0 0 +EDGE2 5428 2847 -0.894633 0.0166422 -0.00590634 1 0 1 1 0 0 +EDGE2 5428 5427 -1.03616 0.00343613 0.00339442 1 0 1 1 0 0 +EDGE2 5428 2628 0.0052432 0.00879753 0.00676891 1 0 1 1 0 0 +EDGE2 5428 2767 -1.06247 -0.108658 0.0249529 1 0 1 1 0 0 +EDGE2 5428 2627 -0.954361 0.0460451 0.000165272 1 0 1 1 0 0 +EDGE2 5429 2689 0.0250722 -0.0617383 -0.000156407 1 0 1 1 0 0 +EDGE2 5429 2690 1.03053 0.00212344 0.0105423 1 0 1 1 0 0 +EDGE2 5429 2850 1.03372 0.063617 -0.0217256 1 0 1 1 0 0 +EDGE2 5429 2770 0.939356 0.01183 0.0106056 1 0 1 1 0 0 +EDGE2 5429 2510 1.0054 -0.0887681 -3.14224 1 0 1 1 0 0 +EDGE2 5429 2630 1.0396 0.0594393 -0.01862 1 0 1 1 0 0 +EDGE2 5429 2650 0.957337 0.0187364 -3.12855 1 0 1 1 0 0 +EDGE2 5429 2670 0.983519 -0.0238281 -3.18585 1 0 1 1 0 0 +EDGE2 5429 2610 1.03871 -0.044952 -3.15544 1 0 1 1 0 0 +EDGE2 5429 2849 -0.0369492 -0.13777 -0.00534098 1 0 1 1 0 0 +EDGE2 5429 2769 -0.026132 -0.0451777 -0.0172655 1 0 1 1 0 0 +EDGE2 5429 2688 -1.13095 0.0914125 0.00419437 1 0 1 1 0 0 +EDGE2 5429 2848 -1.01257 -0.0347461 0.00224505 1 0 1 1 0 0 +EDGE2 5429 5428 -0.965682 0.0581683 0.00772077 1 0 1 1 0 0 +EDGE2 5429 2629 -0.0472333 0.00563769 0.0124891 1 0 1 1 0 0 +EDGE2 5429 2768 -0.953959 0.0954477 0.0279781 1 0 1 1 0 0 +EDGE2 5429 2628 -1.0127 0.0128275 0.0258957 1 0 1 1 0 0 +EDGE2 5430 2609 0.976115 -0.0384586 -3.17066 1 0 1 1 0 0 +EDGE2 5430 2649 1.04634 0.0784947 -3.15091 1 0 1 1 0 0 +EDGE2 5430 2669 0.995934 0.101279 -3.16397 1 0 1 1 0 0 +EDGE2 5430 2509 1.0476 0.0161223 -3.13146 1 0 1 1 0 0 +EDGE2 5430 2689 -1.04488 0.0433897 0.0112503 1 0 1 1 0 0 +EDGE2 5430 2631 -0.100913 -0.993675 -1.59779 1 0 1 1 0 0 +EDGE2 5430 2651 0.00755946 -0.991001 -1.53655 1 0 1 1 0 0 +EDGE2 5430 2690 0.0590403 0.00574696 0.0287552 1 0 1 1 0 0 +EDGE2 5430 2850 0.0574567 0.015895 0.0137922 1 0 1 1 0 0 +EDGE2 5430 2511 0.0313682 -1.03914 -1.5593 1 0 1 1 0 0 +EDGE2 5430 2770 0.0512256 -0.0304506 0.00137191 1 0 1 1 0 0 +EDGE2 5430 2510 -0.057914 0.0359048 -3.15302 1 0 1 1 0 0 +EDGE2 5430 2630 0.0257146 -0.0500142 0.0226903 1 0 1 1 0 0 +EDGE2 5430 2650 0.0352717 0.0474127 -3.15575 1 0 1 1 0 0 +EDGE2 5430 2670 -0.0357144 -0.0866031 -3.13038 1 0 1 1 0 0 +EDGE2 5430 2610 -0.0776011 0.0517989 -3.13041 1 0 1 1 0 0 +EDGE2 5430 2849 -0.921129 0.112431 0.0307392 1 0 1 1 0 0 +EDGE2 5430 5429 -1.07252 0.0569208 0.00350325 1 0 1 1 0 0 +EDGE2 5430 2769 -0.98373 0.027437 -0.0315047 1 0 1 1 0 0 +EDGE2 5430 2629 -0.98566 -0.0187008 0.0172912 1 0 1 1 0 0 +EDGE2 5430 2671 0.0497355 0.983758 1.59762 1 0 1 1 0 0 +EDGE2 5430 2771 -0.0521464 0.969186 1.57368 1 0 1 1 0 0 +EDGE2 5430 2851 -0.0370964 0.899921 1.59792 1 0 1 1 0 0 +EDGE2 5430 2691 0.111188 1.10759 1.55981 1 0 1 1 0 0 +EDGE2 5430 2611 -0.0113593 0.985091 1.57962 1 0 1 1 0 0 +EDGE2 5431 2690 -0.997504 -0.0657807 -1.54612 1 0 1 1 0 0 +EDGE2 5431 2850 -1.00615 -0.0173678 -1.55427 1 0 1 1 0 0 +EDGE2 5431 5430 -0.97708 -0.0662879 -1.57743 1 0 1 1 0 0 +EDGE2 5431 2770 -0.882462 0.083874 -1.60164 1 0 1 1 0 0 +EDGE2 5431 2510 -1.05075 -0.0186034 1.58306 1 0 1 1 0 0 +EDGE2 5431 2630 -0.970731 -0.0710763 -1.55487 1 0 1 1 0 0 +EDGE2 5431 2650 -1.02552 -0.0284835 1.58357 1 0 1 1 0 0 +EDGE2 5431 2670 -1.01445 -0.034742 1.57309 1 0 1 1 0 0 +EDGE2 5431 2610 -1.00081 -0.0211417 1.60104 1 0 1 1 0 0 +EDGE2 5431 2692 0.993337 0.102929 -0.0420138 1 0 1 1 0 0 +EDGE2 5431 2671 -0.0607365 -0.0608224 0.0187968 1 0 1 1 0 0 +EDGE2 5431 2771 -0.00420639 0.0169583 -0.00307913 1 0 1 1 0 0 +EDGE2 5431 2851 0.0610358 -0.00301857 0.00885746 1 0 1 1 0 0 +EDGE2 5431 2691 0.0706948 -0.0404921 -0.00458388 1 0 1 1 0 0 +EDGE2 5431 2852 0.960984 0.0532224 0.0219195 1 0 1 1 0 0 +EDGE2 5431 2611 -0.0701613 -0.0190272 -0.00643619 1 0 1 1 0 0 +EDGE2 5431 2772 1.04335 0.0256847 0.0134842 1 0 1 1 0 0 +EDGE2 5431 2612 1.06102 0.0287461 0.0246501 1 0 1 1 0 0 +EDGE2 5431 2672 1.01719 0.12049 -0.00849178 1 0 1 1 0 0 +EDGE2 5432 2692 0.0405928 0.0264562 0.0242893 1 0 1 1 0 0 +EDGE2 5432 2671 -1.04083 0.0605412 -0.00281881 1 0 1 1 0 0 +EDGE2 5432 2771 -1.00901 0.0234262 -0.00968639 1 0 1 1 0 0 +EDGE2 5432 2851 -0.970658 0.0200101 -0.0112419 1 0 1 1 0 0 +EDGE2 5432 5431 -1.13762 -0.0172537 0.0102065 1 0 1 1 0 0 +EDGE2 5432 2691 -0.940661 0.0208551 0.0395719 1 0 1 1 0 0 +EDGE2 5432 2852 -0.0485486 0.0342695 -0.0172512 1 0 1 1 0 0 +EDGE2 5432 2611 -0.918363 0.0440615 0.0485321 1 0 1 1 0 0 +EDGE2 5432 2772 -0.0844644 0.0228095 -0.01927 1 0 1 1 0 0 +EDGE2 5432 2773 1.02697 -0.00892108 0.00573275 1 0 1 1 0 0 +EDGE2 5432 2612 0.0305389 0.0693221 -0.00445492 1 0 1 1 0 0 +EDGE2 5432 2672 -0.0504027 -0.00046457 -0.0314204 1 0 1 1 0 0 +EDGE2 5432 2853 0.983807 -0.0395178 0.00137146 1 0 1 1 0 0 +EDGE2 5432 2613 0.961213 -0.0201194 0.00468709 1 0 1 1 0 0 +EDGE2 5432 2673 0.985619 -0.090732 0.00800829 1 0 1 1 0 0 +EDGE2 5432 2693 1.0803 -0.0162814 -0.0250978 1 0 1 1 0 0 +EDGE2 5433 2854 0.977158 0.014811 -0.0302807 1 0 1 1 0 0 +EDGE2 5433 2692 -1.01958 -0.00998586 -0.0258463 1 0 1 1 0 0 +EDGE2 5433 2852 -1.03357 0.118638 0.0211522 1 0 1 1 0 0 +EDGE2 5433 5432 -0.997905 0.0789242 -0.00979786 1 0 1 1 0 0 +EDGE2 5433 2772 -1.05759 -0.041601 0.00734291 1 0 1 1 0 0 +EDGE2 5433 2773 -0.00133093 -0.013966 0.00737376 1 0 1 1 0 0 +EDGE2 5433 2612 -1.05001 -0.0436994 -0.0182354 1 0 1 1 0 0 +EDGE2 5433 2672 -1.02735 -0.021604 -0.0290049 1 0 1 1 0 0 +EDGE2 5433 2853 0.0715787 -0.0205852 -0.000723099 1 0 1 1 0 0 +EDGE2 5433 2613 -0.0156096 0.0146113 -0.00383766 1 0 1 1 0 0 +EDGE2 5433 2673 0.01944 0.15084 0.0065864 1 0 1 1 0 0 +EDGE2 5433 2693 -0.0242951 0.0234516 -0.00635278 1 0 1 1 0 0 +EDGE2 5433 2674 1.06312 -0.0557389 0.0318947 1 0 1 1 0 0 +EDGE2 5433 2694 0.992543 0.0324069 0.0239049 1 0 1 1 0 0 +EDGE2 5433 2774 0.928086 0.0065105 0.00983024 1 0 1 1 0 0 +EDGE2 5433 2614 1.0773 -0.0358303 -0.0226665 1 0 1 1 0 0 +EDGE2 5434 2854 -0.00611947 0.0234742 -0.00227518 1 0 1 1 0 0 +EDGE2 5434 2773 -1.02196 0.0641644 0.00451263 1 0 1 1 0 0 +EDGE2 5434 5433 -1.00095 0.0134354 -0.0411421 1 0 1 1 0 0 +EDGE2 5434 2853 -0.986612 0.073423 0.0335837 1 0 1 1 0 0 +EDGE2 5434 2613 -1.0409 0.0304897 0.0338187 1 0 1 1 0 0 +EDGE2 5434 2673 -1.13249 -0.0165013 -0.0163542 1 0 1 1 0 0 +EDGE2 5434 2693 -1.01887 0.0280354 -0.010619 1 0 1 1 0 0 +EDGE2 5434 2775 0.939722 -0.020208 0.00744741 1 0 1 1 0 0 +EDGE2 5434 2674 -0.010647 0.0134044 5.21169e-05 1 0 1 1 0 0 +EDGE2 5434 2694 0.0627972 -0.0575855 -0.00797205 1 0 1 1 0 0 +EDGE2 5434 2774 0.0465224 -0.0180449 -0.0114665 1 0 1 1 0 0 +EDGE2 5434 2614 -0.077526 0.0676676 0.018555 1 0 1 1 0 0 +EDGE2 5434 2975 0.981211 0.0103434 -3.12742 1 0 1 1 0 0 +EDGE2 5434 3275 1.00159 0.0706298 -3.13692 1 0 1 1 0 0 +EDGE2 5434 3295 0.992862 0.0849309 -3.15417 1 0 1 1 0 0 +EDGE2 5434 2855 0.911893 -0.0221666 0.0138685 1 0 1 1 0 0 +EDGE2 5434 2615 1.01419 -0.0195918 -0.0158553 1 0 1 1 0 0 +EDGE2 5434 2675 1.06595 0.0104607 -0.0162131 1 0 1 1 0 0 +EDGE2 5434 2695 1.06397 -0.0337981 -0.0158382 1 0 1 1 0 0 +EDGE2 5435 3296 0.10863 -0.941162 -1.54672 1 0 1 1 0 0 +EDGE2 5435 2976 -0.0787667 -0.964829 -1.55936 1 0 1 1 0 0 +EDGE2 5435 3276 0.108434 -0.856672 -1.57855 1 0 1 1 0 0 +EDGE2 5435 2854 -0.993798 0.0322278 -0.00535522 1 0 1 1 0 0 +EDGE2 5435 5434 -1.00322 -0.0453946 -0.0051166 1 0 1 1 0 0 +EDGE2 5435 2775 0.0124102 0.00572683 -0.017557 1 0 1 1 0 0 +EDGE2 5435 2674 -1.03941 0.0418735 -0.00711999 1 0 1 1 0 0 +EDGE2 5435 2694 -0.942237 -0.0720938 -0.0146174 1 0 1 1 0 0 +EDGE2 5435 2774 -0.983766 -0.0112632 0.0162175 1 0 1 1 0 0 +EDGE2 5435 2614 -0.989228 0.0230573 -0.0208164 1 0 1 1 0 0 +EDGE2 5435 2975 -0.060906 -0.0186016 -3.12952 1 0 1 1 0 0 +EDGE2 5435 3275 -0.065964 -0.0314693 -3.15617 1 0 1 1 0 0 +EDGE2 5435 3295 -0.0750659 -0.0524656 -3.12163 1 0 1 1 0 0 +EDGE2 5435 2855 0.0522416 0.0561074 -0.004693 1 0 1 1 0 0 +EDGE2 5435 3274 0.9415 -0.0319257 -3.14085 1 0 1 1 0 0 +EDGE2 5435 2615 0.00743335 -0.0362131 -0.00148239 1 0 1 1 0 0 +EDGE2 5435 2675 0.0770283 0.0710431 0.0256552 1 0 1 1 0 0 +EDGE2 5435 2695 0.055236 -0.0570928 -0.00679235 1 0 1 1 0 0 +EDGE2 5435 3294 0.955706 -0.050853 -3.13801 1 0 1 1 0 0 +EDGE2 5435 2974 0.97814 0.0195638 -3.15732 1 0 1 1 0 0 +EDGE2 5435 2676 -0.0538591 1.0227 1.5503 1 0 1 1 0 0 +EDGE2 5435 2776 0.138949 1.02952 1.57847 1 0 1 1 0 0 +EDGE2 5435 2856 -0.0665279 0.908958 1.53737 1 0 1 1 0 0 +EDGE2 5435 2696 -0.0220886 0.986434 1.59026 1 0 1 1 0 0 +EDGE2 5435 2616 -0.103338 0.91755 1.56825 1 0 1 1 0 0 +EDGE2 5436 2775 -1.02279 -0.0125886 -1.57962 1 0 1 1 0 0 +EDGE2 5436 5435 -0.981869 -0.0654814 -1.57093 1 0 1 1 0 0 +EDGE2 5436 2975 -1.0205 -0.0812594 1.60057 1 0 1 1 0 0 +EDGE2 5436 3275 -1.00732 0.019466 1.56899 1 0 1 1 0 0 +EDGE2 5436 3295 -1.01287 -0.0499112 1.56785 1 0 1 1 0 0 +EDGE2 5436 2855 -0.908889 0.0467312 -1.57386 1 0 1 1 0 0 +EDGE2 5436 2615 -0.963145 0.0568683 -1.5542 1 0 1 1 0 0 +EDGE2 5436 2675 -1.0081 0.00862137 -1.56856 1 0 1 1 0 0 +EDGE2 5436 2695 -1.02865 -0.00812264 -1.5934 1 0 1 1 0 0 +EDGE2 5436 2677 0.984296 0.0084483 -0.00534181 1 0 1 1 0 0 +EDGE2 5436 2697 1.04049 -0.0274092 0.027727 1 0 1 1 0 0 +EDGE2 5436 2676 -0.117086 0.12675 -0.0255203 1 0 1 1 0 0 +EDGE2 5436 2776 -0.0444089 -0.00923504 0.00153543 1 0 1 1 0 0 +EDGE2 5436 2856 0.0898881 0.0391291 0.0107071 1 0 1 1 0 0 +EDGE2 5436 2696 0.0541425 0.00812768 0.0185214 1 0 1 1 0 0 +EDGE2 5436 2857 1.04826 0.015269 -0.0371232 1 0 1 1 0 0 +EDGE2 5436 2616 0.0131336 -0.0223012 0.00634478 1 0 1 1 0 0 +EDGE2 5436 2777 0.947753 0.0275691 0.00359046 1 0 1 1 0 0 +EDGE2 5436 2617 0.971938 0.0445324 0.000914321 1 0 1 1 0 0 +EDGE2 5437 2677 -0.00339524 -0.00113079 -0.00946867 1 0 1 1 0 0 +EDGE2 5437 2697 -0.00306135 0.0108004 0.00298621 1 0 1 1 0 0 +EDGE2 5437 2676 -0.867921 -0.00768998 -0.00204662 1 0 1 1 0 0 +EDGE2 5437 2776 -0.984628 -0.0852701 -0.01192 1 0 1 1 0 0 +EDGE2 5437 2856 -1.02089 -0.014664 0.00178301 1 0 1 1 0 0 +EDGE2 5437 5436 -1.00868 -0.0401158 0.000985737 1 0 1 1 0 0 +EDGE2 5437 2696 -1.0563 0.0884877 -0.0621789 1 0 1 1 0 0 +EDGE2 5437 2857 0.0533126 -0.0355357 0.019766 1 0 1 1 0 0 +EDGE2 5437 2616 -0.916336 -0.0230928 0.00378997 1 0 1 1 0 0 +EDGE2 5437 2777 -0.0843364 -0.0451806 0.0309728 1 0 1 1 0 0 +EDGE2 5437 2698 0.953405 -0.0255617 -0.0265438 1 0 1 1 0 0 +EDGE2 5437 2858 1.07012 0.000892019 0.0188688 1 0 1 1 0 0 +EDGE2 5437 2617 -0.0199749 -0.00762168 -0.0272608 1 0 1 1 0 0 +EDGE2 5437 2778 0.999151 -0.0673969 -0.0254814 1 0 1 1 0 0 +EDGE2 5437 2618 1.03257 0.0303313 -0.013005 1 0 1 1 0 0 +EDGE2 5437 2678 1.05005 0.00792102 0.0431702 1 0 1 1 0 0 +EDGE2 5438 2677 -1.02626 -0.0674779 0.0544987 1 0 1 1 0 0 +EDGE2 5438 2697 -0.944715 -0.0908998 -0.0221622 1 0 1 1 0 0 +EDGE2 5438 2857 -0.991777 0.0194572 0.00713608 1 0 1 1 0 0 +EDGE2 5438 5437 -0.96754 -0.0139562 0.0126493 1 0 1 1 0 0 +EDGE2 5438 2777 -0.999155 0.0450632 0.019027 1 0 1 1 0 0 +EDGE2 5438 2698 -0.013201 0.017947 -0.00489164 1 0 1 1 0 0 +EDGE2 5438 2858 -0.00456466 0.0819546 -0.00312951 1 0 1 1 0 0 +EDGE2 5438 2617 -1.02702 -0.0487223 -0.0228381 1 0 1 1 0 0 +EDGE2 5438 2778 -0.0313893 -0.0863253 0.0172832 1 0 1 1 0 0 +EDGE2 5438 2618 -0.0763097 0.0554404 0.0267621 1 0 1 1 0 0 +EDGE2 5438 2678 -0.0759255 0.0425357 0.0148999 1 0 1 1 0 0 +EDGE2 5438 2699 1.07672 0.0616158 -0.00781116 1 0 1 1 0 0 +EDGE2 5438 2859 1.08754 -0.0530832 0.00840661 1 0 1 1 0 0 +EDGE2 5438 2779 0.936745 0.00739407 -0.0216241 1 0 1 1 0 0 +EDGE2 5438 2619 1.01275 0.0292359 -0.00499846 1 0 1 1 0 0 +EDGE2 5438 2679 0.997414 -0.00447317 -0.0120775 1 0 1 1 0 0 +EDGE2 5439 2698 -0.997403 0.00552314 0.0346798 1 0 1 1 0 0 +EDGE2 5439 2858 -1.03096 0.0152615 0.0367588 1 0 1 1 0 0 +EDGE2 5439 5438 -0.975073 -0.0112467 0.00949035 1 0 1 1 0 0 +EDGE2 5439 2778 -1.04078 -0.0497136 -0.0407995 1 0 1 1 0 0 +EDGE2 5439 2618 -0.992814 -0.0427368 -0.0233529 1 0 1 1 0 0 +EDGE2 5439 2678 -1.03703 0.0104294 -0.00171376 1 0 1 1 0 0 +EDGE2 5439 2699 0.0445954 0.0434169 0.00145518 1 0 1 1 0 0 +EDGE2 5439 2859 0.038385 -0.0304812 -0.00733138 1 0 1 1 0 0 +EDGE2 5439 2779 0.116142 -0.00137855 -0.0476002 1 0 1 1 0 0 +EDGE2 5439 2619 -0.0160111 0.0269056 -0.00742626 1 0 1 1 0 0 +EDGE2 5439 2679 -0.0273797 -0.0399106 0.00943598 1 0 1 1 0 0 +EDGE2 5439 2760 0.926666 -0.0169308 -3.136 1 0 1 1 0 0 +EDGE2 5439 2860 0.972561 0.0225917 0.0250278 1 0 1 1 0 0 +EDGE2 5439 2880 1.02074 0.0508241 -3.12339 1 0 1 1 0 0 +EDGE2 5439 2960 0.960667 0.00652717 -3.15204 1 0 1 1 0 0 +EDGE2 5439 2780 1.01045 -0.0247013 -0.0257674 1 0 1 1 0 0 +EDGE2 5439 2620 0.945544 -0.0176348 0.0375511 1 0 1 1 0 0 +EDGE2 5439 2680 0.961685 0.05027 0.006051 1 0 1 1 0 0 +EDGE2 5439 2700 1.03256 -0.031575 -0.00594582 1 0 1 1 0 0 +EDGE2 5440 5439 -0.947381 0.0245076 -0.0238859 1 0 1 1 0 0 +EDGE2 5440 2699 -0.973352 -0.0275198 0.0602941 1 0 1 1 0 0 +EDGE2 5440 2859 -0.938313 -0.0486553 0.00747469 1 0 1 1 0 0 +EDGE2 5440 2779 -1.03826 0.0806531 0.00132612 1 0 1 1 0 0 +EDGE2 5440 2619 -1.03553 -0.0494285 0.0132506 1 0 1 1 0 0 +EDGE2 5440 2679 -0.904159 0.0271765 -0.0173505 1 0 1 1 0 0 +EDGE2 5440 2760 0.0672955 0.0412361 -3.15807 1 0 1 1 0 0 +EDGE2 5440 2681 0.0134487 1.03133 1.55607 1 0 1 1 0 0 +EDGE2 5440 2761 0.00961079 0.864927 1.5661 1 0 1 1 0 0 +EDGE2 5440 2781 -0.0103807 0.965868 1.56867 1 0 1 1 0 0 +EDGE2 5440 2621 -0.0712762 0.952978 1.5882 1 0 1 1 0 0 +EDGE2 5440 2860 -0.0316664 -0.00690627 -0.00898606 1 0 1 1 0 0 +EDGE2 5440 2880 -0.0784212 0.04514 -3.14774 1 0 1 1 0 0 +EDGE2 5440 2960 -0.0104001 0.0216984 -3.15094 1 0 1 1 0 0 +EDGE2 5440 2780 0.0144539 -0.0207673 -0.00833784 1 0 1 1 0 0 +EDGE2 5440 2961 -0.0616862 -0.962332 -1.5641 1 0 1 1 0 0 +EDGE2 5440 2620 -0.00394106 -0.00559215 -0.0137499 1 0 1 1 0 0 +EDGE2 5440 2680 -0.0824516 0.0240132 -0.0149643 1 0 1 1 0 0 +EDGE2 5440 2700 0.0221741 -0.0886151 0.00424139 1 0 1 1 0 0 +EDGE2 5440 2701 -0.0218898 -1.03723 -1.57001 1 0 1 1 0 0 +EDGE2 5440 2861 -0.00878131 -0.877503 -1.59113 1 0 1 1 0 0 +EDGE2 5440 2881 -0.0498174 -0.978349 -1.59903 1 0 1 1 0 0 +EDGE2 5440 2759 1.06652 0.0859939 -3.12187 1 0 1 1 0 0 +EDGE2 5440 2879 1.03202 0.123514 -3.12437 1 0 1 1 0 0 +EDGE2 5440 2959 1.05509 -0.0722736 -3.14623 1 0 1 1 0 0 +EDGE2 5441 2760 -1.08086 0.00806297 -1.5997 1 0 1 1 0 0 +EDGE2 5441 5440 -1.01192 0.0273204 1.57918 1 0 1 1 0 0 +EDGE2 5441 2860 -0.987988 -0.0562979 1.57758 1 0 1 1 0 0 +EDGE2 5441 2880 -1.08518 -0.06937 -1.54414 1 0 1 1 0 0 +EDGE2 5441 2960 -0.95928 0.0506057 -1.57412 1 0 1 1 0 0 +EDGE2 5441 2780 -0.978167 -0.0612945 1.6069 1 0 1 1 0 0 +EDGE2 5441 2962 0.930954 -0.0154924 0.00401742 1 0 1 1 0 0 +EDGE2 5441 2961 0.0327858 -0.0221576 -0.0208661 1 0 1 1 0 0 +EDGE2 5441 2620 -1.04643 0.00566497 1.58418 1 0 1 1 0 0 +EDGE2 5441 2680 -1.00418 0.0978416 1.55933 1 0 1 1 0 0 +EDGE2 5441 2700 -0.993852 -0.0366508 1.59192 1 0 1 1 0 0 +EDGE2 5441 2701 -0.0208694 0.0644486 0.0218137 1 0 1 1 0 0 +EDGE2 5441 2861 0.032934 0.0327888 -0.00982379 1 0 1 1 0 0 +EDGE2 5441 2881 0.00690543 -0.0461265 -0.00959895 1 0 1 1 0 0 +EDGE2 5441 2702 0.927913 0.0282659 -0.00134648 1 0 1 1 0 0 +EDGE2 5441 2862 0.994567 -0.0050707 0.014965 1 0 1 1 0 0 +EDGE2 5441 2882 0.953495 -0.0180922 0.0575579 1 0 1 1 0 0 +EDGE2 5442 2962 -0.0428079 0.0537422 0.0198586 1 0 1 1 0 0 +EDGE2 5442 2961 -0.999923 -0.0737147 -0.00265274 1 0 1 1 0 0 +EDGE2 5442 5441 -1.10114 -0.0618611 0.0151995 1 0 1 1 0 0 +EDGE2 5442 2701 -0.989384 0.0487652 0.0091471 1 0 1 1 0 0 +EDGE2 5442 2861 -0.984426 0.0746393 0.0228985 1 0 1 1 0 0 +EDGE2 5442 2881 -0.896194 0.0462452 0.0141449 1 0 1 1 0 0 +EDGE2 5442 2963 0.969629 0.018732 0.00671013 1 0 1 1 0 0 +EDGE2 5442 2702 0.00734298 -0.0412381 0.0204262 1 0 1 1 0 0 +EDGE2 5442 2862 0.0102106 -0.0911646 -0.0119878 1 0 1 1 0 0 +EDGE2 5442 2882 0.00714443 -0.0816825 -0.0337575 1 0 1 1 0 0 +EDGE2 5442 2703 0.944601 -0.0059425 -0.011906 1 0 1 1 0 0 +EDGE2 5442 2863 0.956772 0.0174174 0.00103965 1 0 1 1 0 0 +EDGE2 5442 2883 1.0072 -0.0488861 0.0110344 1 0 1 1 0 0 +EDGE2 5443 2964 1.0282 0.000202102 0.00948646 1 0 1 1 0 0 +EDGE2 5443 2962 -1.00771 -0.0126808 -0.00273467 1 0 1 1 0 0 +EDGE2 5443 5442 -1.09144 0.00432335 0.0229813 1 0 1 1 0 0 +EDGE2 5443 2963 0.104232 -0.00988212 0.0301016 1 0 1 1 0 0 +EDGE2 5443 2702 -1.04142 0.00326783 -0.0123444 1 0 1 1 0 0 +EDGE2 5443 2862 -1.06955 -0.00487545 -0.0133674 1 0 1 1 0 0 +EDGE2 5443 2882 -1.04153 -0.0196977 -0.00866113 1 0 1 1 0 0 +EDGE2 5443 2703 0.0984693 0.038827 0.000163963 1 0 1 1 0 0 +EDGE2 5443 2863 -0.0179996 -0.0518736 -0.0401844 1 0 1 1 0 0 +EDGE2 5443 2883 -0.0585003 0.0408232 -0.0135867 1 0 1 1 0 0 +EDGE2 5443 2704 0.905116 0.0345982 0.0322101 1 0 1 1 0 0 +EDGE2 5443 2864 0.978404 0.00669463 0.0200737 1 0 1 1 0 0 +EDGE2 5443 2884 0.97299 -0.0572954 0.0261302 1 0 1 1 0 0 +EDGE2 5444 2964 0.0339637 -0.0894315 -0.0288885 1 0 1 1 0 0 +EDGE2 5444 2963 -0.994553 0.0330293 0.0284948 1 0 1 1 0 0 +EDGE2 5444 5443 -1.04225 -0.054445 -0.0164465 1 0 1 1 0 0 +EDGE2 5444 2703 -1.02918 0.0163915 -0.00207224 1 0 1 1 0 0 +EDGE2 5444 2863 -1.00308 -0.0226302 0.00760196 1 0 1 1 0 0 +EDGE2 5444 2883 -1.03515 0.0182093 0.031299 1 0 1 1 0 0 +EDGE2 5444 2704 0.00927242 0.0341204 -0.00184454 1 0 1 1 0 0 +EDGE2 5444 2864 -0.0109285 -0.0110609 0.00289975 1 0 1 1 0 0 +EDGE2 5444 2884 -0.0256077 0.0501577 -0.0218035 1 0 1 1 0 0 +EDGE2 5444 2705 1.08434 0.0466993 -0.008304 1 0 1 1 0 0 +EDGE2 5444 2865 0.997305 -0.0385271 0.0153988 1 0 1 1 0 0 +EDGE2 5444 2885 0.951239 -0.0170558 -0.00636056 1 0 1 1 0 0 +EDGE2 5444 2965 1.00279 -0.0174069 -0.0310693 1 0 1 1 0 0 +EDGE2 5444 2745 1.01338 -0.0293556 -3.11541 1 0 1 1 0 0 +EDGE2 5445 2964 -0.991855 0.040431 0.000565654 1 0 1 1 0 0 +EDGE2 5445 5444 -1.02492 0.0399372 -0.00924005 1 0 1 1 0 0 +EDGE2 5445 2704 -0.927779 -0.00569596 -0.0177817 1 0 1 1 0 0 +EDGE2 5445 2864 -1.03627 0.0110159 0.00615452 1 0 1 1 0 0 +EDGE2 5445 2884 -0.949391 -0.0164337 0.0518778 1 0 1 1 0 0 +EDGE2 5445 2706 0.0286701 -1.015 -1.55697 1 0 1 1 0 0 +EDGE2 5445 2966 -0.0422227 -1.06874 -1.58195 1 0 1 1 0 0 +EDGE2 5445 2705 -0.0140199 0.0943922 0.0300938 1 0 1 1 0 0 +EDGE2 5445 2865 -0.000514431 -0.00242222 -0.00162857 1 0 1 1 0 0 +EDGE2 5445 2885 -0.0835901 0.0280723 -0.00311513 1 0 1 1 0 0 +EDGE2 5445 2965 0.000358701 0.0634343 0.0219779 1 0 1 1 0 0 +EDGE2 5445 2745 -0.00655891 -0.0425434 -3.16668 1 0 1 1 0 0 +EDGE2 5445 2746 -0.0137629 0.982086 1.56299 1 0 1 1 0 0 +EDGE2 5445 2866 -0.00102705 0.996787 1.5544 1 0 1 1 0 0 +EDGE2 5445 2886 -0.0122943 1.0392 1.61563 1 0 1 1 0 0 +EDGE2 5445 2744 1.00445 -0.00175519 -3.14374 1 0 1 1 0 0 +EDGE2 5446 5445 -1.05194 0.0225034 1.61139 1 0 1 1 0 0 +EDGE2 5446 2706 -0.00206439 -0.000197298 0.0119143 1 0 1 1 0 0 +EDGE2 5446 2707 1.07987 0.0308616 -0.0373941 1 0 1 1 0 0 +EDGE2 5446 2967 1.06936 -0.0136578 -0.0421881 1 0 1 1 0 0 +EDGE2 5446 2966 0.0395572 -0.0956766 0.000141774 1 0 1 1 0 0 +EDGE2 5446 2705 -1.0041 0.0304257 1.55153 1 0 1 1 0 0 +EDGE2 5446 2865 -0.995411 0.0844744 1.58857 1 0 1 1 0 0 +EDGE2 5446 2885 -1.00944 -0.0451567 1.58265 1 0 1 1 0 0 +EDGE2 5446 2965 -0.864327 0.046229 1.58212 1 0 1 1 0 0 +EDGE2 5446 2745 -0.893985 -0.00708145 -1.57324 1 0 1 1 0 0 +EDGE2 5447 5446 -1.05721 -0.00568346 0.048196 1 0 1 1 0 0 +EDGE2 5447 2706 -1.04455 -0.00643655 -0.012197 1 0 1 1 0 0 +EDGE2 5447 2968 0.947237 0.0761849 -0.0352038 1 0 1 1 0 0 +EDGE2 5447 2707 -0.0493819 0.0655387 -0.00823699 1 0 1 1 0 0 +EDGE2 5447 2967 0.0337558 -0.0438636 0.0142451 1 0 1 1 0 0 +EDGE2 5447 2708 1.08899 -0.0470628 0.00130445 1 0 1 1 0 0 +EDGE2 5447 2966 -0.997585 -0.0809064 -0.0192086 1 0 1 1 0 0 +EDGE2 5448 5447 -1.01497 -0.0463363 -0.0484244 1 0 1 1 0 0 +EDGE2 5448 2968 0.045448 0.015772 0.000926199 1 0 1 1 0 0 +EDGE2 5448 2969 0.976524 0.0188243 -0.0334078 1 0 1 1 0 0 +EDGE2 5448 2709 0.940408 0.0459804 -0.0353415 1 0 1 1 0 0 +EDGE2 5448 2707 -0.959005 -0.0695704 0.00573255 1 0 1 1 0 0 +EDGE2 5448 2967 -1.03595 0.0267916 0.00021411 1 0 1 1 0 0 +EDGE2 5448 2708 -0.0379225 -0.0267724 -0.00718171 1 0 1 1 0 0 +EDGE2 5449 5448 -1.03395 -0.0471147 0.00321065 1 0 1 1 0 0 +EDGE2 5449 3290 1.02688 0.00334857 -3.12468 1 0 1 1 0 0 +EDGE2 5449 2970 1.07171 0.0228471 0.00536678 1 0 1 1 0 0 +EDGE2 5449 3270 1.01779 -0.0229712 -3.11326 1 0 1 1 0 0 +EDGE2 5449 3010 0.897243 0.0239858 -3.1347 1 0 1 1 0 0 +EDGE2 5449 2710 0.984859 0.021071 0.0254445 1 0 1 1 0 0 +EDGE2 5449 2968 -1.00395 -0.0514209 -0.0270074 1 0 1 1 0 0 +EDGE2 5449 2969 -0.0372823 0.0802448 0.00701713 1 0 1 1 0 0 +EDGE2 5449 2709 0.0520209 -0.0372973 0.06495 1 0 1 1 0 0 +EDGE2 5449 2708 -0.971124 -0.0323129 -0.00919458 1 0 1 1 0 0 +EDGE2 5450 3271 0.0386569 -0.961767 -1.55089 1 0 1 1 0 0 +EDGE2 5450 3291 0.0529039 -1.03267 -1.54637 1 0 1 1 0 0 +EDGE2 5450 2971 -0.011588 -1.0124 -1.52492 1 0 1 1 0 0 +EDGE2 5450 5449 -0.932156 0.00895716 -0.0253367 1 0 1 1 0 0 +EDGE2 5450 2711 -0.0868106 0.943929 1.55152 1 0 1 1 0 0 +EDGE2 5450 3290 -0.106542 -0.0226484 -3.12732 1 0 1 1 0 0 +EDGE2 5450 3269 1.04375 0.0384184 -3.18425 1 0 1 1 0 0 +EDGE2 5450 3289 0.971325 0.0215844 -3.14358 1 0 1 1 0 0 +EDGE2 5450 3009 1.01352 -0.158018 -3.16345 1 0 1 1 0 0 +EDGE2 5450 2970 -0.00445786 -0.0262236 -0.00565495 1 0 1 1 0 0 +EDGE2 5450 3270 0.0476385 0.0852553 -3.13642 1 0 1 1 0 0 +EDGE2 5450 3010 -0.080064 -0.0625476 -3.15555 1 0 1 1 0 0 +EDGE2 5450 2710 0.101129 0.0597644 0.0208397 1 0 1 1 0 0 +EDGE2 5450 3011 -0.0322079 0.946561 1.57654 1 0 1 1 0 0 +EDGE2 5450 2969 -1.03929 0.125621 -0.00454717 1 0 1 1 0 0 +EDGE2 5450 2709 -0.915842 -0.0292461 0.0486969 1 0 1 1 0 0 +EDGE2 5451 5450 -0.991031 -0.0151178 -1.5834 1 0 1 1 0 0 +EDGE2 5451 2711 0.0651044 0.0612599 -0.033261 1 0 1 1 0 0 +EDGE2 5451 3290 -0.96062 -0.0355847 1.58067 1 0 1 1 0 0 +EDGE2 5451 2970 -1.0031 -0.0640752 -1.58634 1 0 1 1 0 0 +EDGE2 5451 3270 -0.883708 0.00562744 1.54991 1 0 1 1 0 0 +EDGE2 5451 3010 -1.01886 0.0851955 1.56828 1 0 1 1 0 0 +EDGE2 5451 2710 -1.02302 -0.0386472 -1.5688 1 0 1 1 0 0 +EDGE2 5451 3011 -0.021137 0.0316216 -0.00539815 1 0 1 1 0 0 +EDGE2 5451 3012 1.02245 -0.023771 -0.0111527 1 0 1 1 0 0 +EDGE2 5451 2712 1.11184 -0.030268 0.0341139 1 0 1 1 0 0 +EDGE2 5452 2711 -0.998808 0.105253 0.0136981 1 0 1 1 0 0 +EDGE2 5452 5451 -1.0175 -0.0511386 0.00855311 1 0 1 1 0 0 +EDGE2 5452 3011 -0.979762 -0.0438438 -0.0532323 1 0 1 1 0 0 +EDGE2 5452 3012 0.060328 -0.026179 -0.0352789 1 0 1 1 0 0 +EDGE2 5452 2713 1.02528 0.0600021 0.0190169 1 0 1 1 0 0 +EDGE2 5452 2712 0.0202993 -0.0466735 -0.0359036 1 0 1 1 0 0 +EDGE2 5452 3013 0.956924 0.0252621 -0.00481576 1 0 1 1 0 0 +EDGE2 5453 3012 -0.973654 -0.00940534 -0.012141 1 0 1 1 0 0 +EDGE2 5453 5452 -1.05153 -0.0384064 0.0113504 1 0 1 1 0 0 +EDGE2 5453 2713 -0.00831745 -0.0580093 -0.0197782 1 0 1 1 0 0 +EDGE2 5453 2712 -0.987311 -0.025023 0.00239171 1 0 1 1 0 0 +EDGE2 5453 3013 -0.0727615 0.0337865 0.0303128 1 0 1 1 0 0 +EDGE2 5453 3014 1.04499 0.0469469 0.00869252 1 0 1 1 0 0 +EDGE2 5453 2714 1.01823 -0.0692708 -0.0117581 1 0 1 1 0 0 +EDGE2 5454 2713 -0.958212 0.0105368 0.0399682 1 0 1 1 0 0 +EDGE2 5454 5453 -0.973715 -0.00914902 0.00230441 1 0 1 1 0 0 +EDGE2 5454 3013 -1.01001 -0.069152 -0.000793998 1 0 1 1 0 0 +EDGE2 5454 3014 0.0594525 0.056843 -0.0299797 1 0 1 1 0 0 +EDGE2 5454 2714 0.0323954 0.0172202 0.0147947 1 0 1 1 0 0 +EDGE2 5454 2715 0.987883 -0.0451532 -0.0202624 1 0 1 1 0 0 +EDGE2 5454 3015 0.953513 -0.0387328 -0.0151457 1 0 1 1 0 0 +EDGE2 5454 3515 1.06684 0.100059 -3.15333 1 0 1 1 0 0 +EDGE2 5455 3014 -0.970553 0.0206148 0.00669303 1 0 1 1 0 0 +EDGE2 5455 5454 -1.01191 0.0514419 0.0109532 1 0 1 1 0 0 +EDGE2 5455 2714 -1.01819 -0.0452823 0.000844707 1 0 1 1 0 0 +EDGE2 5455 3516 -0.0345938 0.967116 1.58323 1 0 1 1 0 0 +EDGE2 5455 3016 -0.0101738 -1.03617 -1.58748 1 0 1 1 0 0 +EDGE2 5455 2715 0.0295141 0.0311739 -0.0292933 1 0 1 1 0 0 +EDGE2 5455 3015 -0.117122 -0.0104168 0.0057584 1 0 1 1 0 0 +EDGE2 5455 3515 -0.0192176 0.0333763 -3.15105 1 0 1 1 0 0 +EDGE2 5455 3514 0.965199 0.0761477 -3.14093 1 0 1 1 0 0 +EDGE2 5455 2716 0.0223114 1.074 1.56812 1 0 1 1 0 0 +EDGE2 5456 3516 -0.00642412 0.0235246 0.0370279 1 0 1 1 0 0 +EDGE2 5456 5455 -1.09957 0.0130679 -1.56291 1 0 1 1 0 0 +EDGE2 5456 2715 -1.0695 -0.00460621 -1.58281 1 0 1 1 0 0 +EDGE2 5456 3015 -1.03871 0.0106707 -1.54748 1 0 1 1 0 0 +EDGE2 5456 3515 -0.995541 -0.108571 1.56514 1 0 1 1 0 0 +EDGE2 5456 2716 -0.064414 -0.0267873 -0.0118477 1 0 1 1 0 0 +EDGE2 5456 2717 1.0387 0.02596 -0.0379232 1 0 1 1 0 0 +EDGE2 5456 3517 0.982376 -0.024733 0.00424825 1 0 1 1 0 0 +EDGE2 5457 3516 -1.04503 -0.0258575 0.00932232 1 0 1 1 0 0 +EDGE2 5457 5456 -1.05833 0.0353316 0.00237844 1 0 1 1 0 0 +EDGE2 5457 2716 -1.02901 0.0560694 -0.0204404 1 0 1 1 0 0 +EDGE2 5457 2718 1.00745 -0.0187632 0.0135623 1 0 1 1 0 0 +EDGE2 5457 2717 -0.091101 -0.0262066 -0.00927931 1 0 1 1 0 0 +EDGE2 5457 3517 -0.0329886 -0.0207873 0.0080944 1 0 1 1 0 0 +EDGE2 5457 3518 1.01775 -0.00441292 0.00229279 1 0 1 1 0 0 +EDGE2 5458 5457 -1.00821 0.0115338 0.00826852 1 0 1 1 0 0 +EDGE2 5458 2718 -0.0506002 -0.00130717 0.0138358 1 0 1 1 0 0 +EDGE2 5458 2717 -0.972867 -0.0262517 -0.00803087 1 0 1 1 0 0 +EDGE2 5458 3517 -1.0446 -0.0735404 0.00798423 1 0 1 1 0 0 +EDGE2 5458 3518 -0.00227314 0.0593627 0.0129518 1 0 1 1 0 0 +EDGE2 5458 2719 0.972336 0.00745452 0.0353406 1 0 1 1 0 0 +EDGE2 5458 3519 1.01323 0.0896349 0.00849053 1 0 1 1 0 0 +EDGE2 5459 3520 0.902586 -0.00535427 0.033349 1 0 1 1 0 0 +EDGE2 5459 2718 -0.985621 0.0309788 0.0143094 1 0 1 1 0 0 +EDGE2 5459 5458 -0.96406 0.0404491 -0.0119917 1 0 1 1 0 0 +EDGE2 5459 3518 -0.969733 -0.00906506 -0.014805 1 0 1 1 0 0 +EDGE2 5459 2719 0.0143834 -0.0541905 0.0125876 1 0 1 1 0 0 +EDGE2 5459 3519 -0.0578641 0.0381184 -0.0329894 1 0 1 1 0 0 +EDGE2 5459 2720 0.963987 -0.158189 -0.0245735 1 0 1 1 0 0 +EDGE2 5459 2740 1.02139 -0.0459675 -3.15081 1 0 1 1 0 0 +EDGE2 5460 2741 0.0498689 1.03464 1.53186 1 0 1 1 0 0 +EDGE2 5460 3520 0.0374248 -0.0484004 -0.0314317 1 0 1 1 0 0 +EDGE2 5460 2719 -0.959696 -0.0379185 -0.00201051 1 0 1 1 0 0 +EDGE2 5460 3519 -0.886097 0.0955929 0.0123774 1 0 1 1 0 0 +EDGE2 5460 5459 -0.993277 -0.0166632 -0.0258687 1 0 1 1 0 0 +EDGE2 5460 2721 0.0691419 -1.01566 -1.57592 1 0 1 1 0 0 +EDGE2 5460 2720 0.0305708 -0.0362027 0.0182942 1 0 1 1 0 0 +EDGE2 5460 2740 0.0554994 -0.0597679 -3.13747 1 0 1 1 0 0 +EDGE2 5460 3521 0.0764508 -0.994298 -1.59232 1 0 1 1 0 0 +EDGE2 5460 2739 1.07451 -0.0556996 -3.126 1 0 1 1 0 0 +EDGE2 5461 3520 -0.996816 -0.00898265 1.58725 1 0 1 1 0 0 +EDGE2 5461 5460 -0.976047 -0.00621907 1.58254 1 0 1 1 0 0 +EDGE2 5461 2721 -0.028264 -0.00489509 -0.0123667 1 0 1 1 0 0 +EDGE2 5461 2720 -1.04219 -0.0800248 1.57832 1 0 1 1 0 0 +EDGE2 5461 2740 -1.03699 -0.00537639 -1.56211 1 0 1 1 0 0 +EDGE2 5461 3521 0.0530106 0.0125468 0.0177124 1 0 1 1 0 0 +EDGE2 5461 3522 1.05986 -0.0132325 0.0136456 1 0 1 1 0 0 +EDGE2 5461 2722 0.957826 0.00236215 0.0197944 1 0 1 1 0 0 +EDGE2 5462 2721 -0.994736 0.0596105 -0.0138008 1 0 1 1 0 0 +EDGE2 5462 5461 -0.969893 0.068192 0.00388619 1 0 1 1 0 0 +EDGE2 5462 3521 -1.01554 -0.0388163 -0.0146927 1 0 1 1 0 0 +EDGE2 5462 3522 0.058987 0.0277439 -0.00542416 1 0 1 1 0 0 +EDGE2 5462 2722 0.0367417 0.121592 -0.000337712 1 0 1 1 0 0 +EDGE2 5462 2723 1.01133 0.0378105 -0.0233223 1 0 1 1 0 0 +EDGE2 5462 3523 0.942739 -0.0132699 -0.0176673 1 0 1 1 0 0 +EDGE2 5463 3522 -1.04293 -0.120639 -0.00246105 1 0 1 1 0 0 +EDGE2 5463 5462 -1.06026 0.0224984 0.0017427 1 0 1 1 0 0 +EDGE2 5463 2722 -0.910722 0.0410601 -0.0206673 1 0 1 1 0 0 +EDGE2 5463 2724 1.00963 0.153533 -0.0234729 1 0 1 1 0 0 +EDGE2 5463 2723 0.0536066 -0.062394 -0.00309272 1 0 1 1 0 0 +EDGE2 5463 3523 -0.0118155 0.0544866 -0.00479104 1 0 1 1 0 0 +EDGE2 5463 3524 0.984261 -0.0641546 0.0235867 1 0 1 1 0 0 +EDGE2 5464 5463 -0.962663 -0.00550272 -0.0125576 1 0 1 1 0 0 +EDGE2 5464 3525 1.01365 0.0578057 0.00254471 1 0 1 1 0 0 +EDGE2 5464 2724 0.0854062 -0.0319185 0.0137717 1 0 1 1 0 0 +EDGE2 5464 2723 -0.959592 0.0374844 -0.00971733 1 0 1 1 0 0 +EDGE2 5464 3523 -0.968535 -0.0491177 -0.000364198 1 0 1 1 0 0 +EDGE2 5464 3524 -0.00863838 -0.00401782 0.0164497 1 0 1 1 0 0 +EDGE2 5464 2725 0.973522 -0.00356406 -0.0349266 1 0 1 1 0 0 +EDGE2 5465 3525 -0.0597786 0.0781142 -0.0367132 1 0 1 1 0 0 +EDGE2 5465 2724 -0.906933 -0.00299434 -0.000147226 1 0 1 1 0 0 +EDGE2 5465 5464 -0.981234 0.0379077 0.0155636 1 0 1 1 0 0 +EDGE2 5465 3524 -0.981199 0.0988124 0.023268 1 0 1 1 0 0 +EDGE2 5465 3526 -0.00259357 0.965183 1.5385 1 0 1 1 0 0 +EDGE2 5465 2725 0.121813 0.100594 0.0115172 1 0 1 1 0 0 +EDGE2 5465 2726 0.060799 0.992137 1.53961 1 0 1 1 0 0 +EDGE2 5466 3525 -1.07518 -0.0324879 -1.56575 1 0 1 1 0 0 +EDGE2 5466 5465 -1.01005 0.000514666 -1.58014 1 0 1 1 0 0 +EDGE2 5466 3526 -0.00837923 0.0372412 0.00628945 1 0 1 1 0 0 +EDGE2 5466 2725 -0.933781 -0.0256554 -1.56584 1 0 1 1 0 0 +EDGE2 5466 2726 0.000437871 -0.00172752 -0.0147781 1 0 1 1 0 0 +EDGE2 5466 2727 1.11411 0.112578 -0.012346 1 0 1 1 0 0 +EDGE2 5466 3527 0.955374 0.00834124 0.00108735 1 0 1 1 0 0 +EDGE2 5467 2728 0.984456 0.0215898 -0.00461514 1 0 1 1 0 0 +EDGE2 5467 3526 -1.02858 -0.010005 4.55697e-05 1 0 1 1 0 0 +EDGE2 5467 5466 -0.910248 -0.0889884 0.0254269 1 0 1 1 0 0 +EDGE2 5467 2726 -1.06279 -0.0646316 0.0245769 1 0 1 1 0 0 +EDGE2 5467 2727 0.0223985 -0.0467721 0.0145214 1 0 1 1 0 0 +EDGE2 5467 3527 -0.0667714 0.0138586 -0.0202044 1 0 1 1 0 0 +EDGE2 5467 3528 1.10909 -0.0107408 -0.00459823 1 0 1 1 0 0 +EDGE2 5468 2728 0.012791 -0.00616791 -0.0222524 1 0 1 1 0 0 +EDGE2 5468 5467 -1.06409 -0.0166656 -0.00572615 1 0 1 1 0 0 +EDGE2 5468 2727 -0.959986 -0.0132047 -0.0213942 1 0 1 1 0 0 +EDGE2 5468 3527 -1.02294 -0.0612342 -0.0105441 1 0 1 1 0 0 +EDGE2 5468 3528 0.0527718 0.0266643 -0.0080892 1 0 1 1 0 0 +EDGE2 5468 2729 0.998704 0.0634471 -0.00667203 1 0 1 1 0 0 +EDGE2 5468 3529 1.04617 -0.057837 -0.031488 1 0 1 1 0 0 +EDGE2 5469 2728 -1.05541 0.0452765 0.00539941 1 0 1 1 0 0 +EDGE2 5469 5468 -0.956655 -0.0659557 -0.0216557 1 0 1 1 0 0 +EDGE2 5469 3528 -0.965391 0.00432024 -0.0122585 1 0 1 1 0 0 +EDGE2 5469 2729 0.0677638 0.0173163 -0.00814809 1 0 1 1 0 0 +EDGE2 5469 3529 -0.0411782 -0.0341944 -0.035243 1 0 1 1 0 0 +EDGE2 5469 2730 1.00187 -0.00493575 0.0273938 1 0 1 1 0 0 +EDGE2 5469 3530 0.986228 -0.0303463 0.0227845 1 0 1 1 0 0 +EDGE2 5470 2731 -0.0953631 0.968685 1.57175 1 0 1 1 0 0 +EDGE2 5470 2729 -1.11874 -0.00591029 -0.00746757 1 0 1 1 0 0 +EDGE2 5470 3529 -0.977508 0.0243908 -0.045297 1 0 1 1 0 0 +EDGE2 5470 5469 -1.03504 0.0281733 0.00789191 1 0 1 1 0 0 +EDGE2 5470 2730 0.0191801 0.0244261 0.00519876 1 0 1 1 0 0 +EDGE2 5470 3530 -0.0175909 0.0119374 -0.0310994 1 0 1 1 0 0 +EDGE2 5470 3531 0.0305108 -1.04776 -1.58874 1 0 1 1 0 0 +EDGE2 5471 5470 -0.914289 0.0127147 1.55585 1 0 1 1 0 0 +EDGE2 5471 2730 -1.02567 0.0292182 1.59476 1 0 1 1 0 0 +EDGE2 5471 3530 -0.923262 0.0290402 1.58448 1 0 1 1 0 0 +EDGE2 5471 3532 0.98761 0.0204229 0.00370102 1 0 1 1 0 0 +EDGE2 5471 3531 -0.0341796 -0.0359225 -0.00352408 1 0 1 1 0 0 +EDGE2 5472 3532 -0.0458806 -0.0506798 -0.0194448 1 0 1 1 0 0 +EDGE2 5472 3531 -0.968409 0.0616441 0.0148075 1 0 1 1 0 0 +EDGE2 5472 5471 -1.00726 -0.121837 0.00661022 1 0 1 1 0 0 +EDGE2 5472 3533 0.934635 -0.00258897 -0.0333936 1 0 1 1 0 0 +EDGE2 5473 3532 -0.950525 -0.0322668 0.0138532 1 0 1 1 0 0 +EDGE2 5473 5472 -0.960528 -0.0493245 -0.014462 1 0 1 1 0 0 +EDGE2 5473 3533 -0.0029061 -0.0228667 -0.00974021 1 0 1 1 0 0 +EDGE2 5473 3534 1.06514 0.00140845 0.018805 1 0 1 1 0 0 +EDGE2 5474 3533 -1.04568 0.0427551 -0.0307324 1 0 1 1 0 0 +EDGE2 5474 5473 -1.00183 -0.0577262 0.00516223 1 0 1 1 0 0 +EDGE2 5474 3534 0.00777352 -0.065547 0.025596 1 0 1 1 0 0 +EDGE2 5474 3535 1.00788 -0.0532083 -0.0135829 1 0 1 1 0 0 +EDGE2 5475 5474 -0.954964 -0.00817192 -0.0475384 1 0 1 1 0 0 +EDGE2 5475 3534 -1.006 -0.118193 0.00131921 1 0 1 1 0 0 +EDGE2 5475 3535 0.0281421 0.0254834 -0.0229053 1 0 1 1 0 0 +EDGE2 5475 3536 0.0821158 1.05076 1.55923 1 0 1 1 0 0 +EDGE2 5476 5475 -0.97114 -0.0631036 -1.56368 1 0 1 1 0 0 +EDGE2 5476 3535 -0.92363 0.0343284 -1.55337 1 0 1 1 0 0 +EDGE2 5476 3537 0.968359 -0.016146 0.0417199 1 0 1 1 0 0 +EDGE2 5476 3536 0.00657651 -0.0119681 0.0217276 1 0 1 1 0 0 +EDGE2 5477 3537 -0.0427916 0.00402032 -0.0165764 1 0 1 1 0 0 +EDGE2 5477 3536 -0.942478 0.0412546 0.0139876 1 0 1 1 0 0 +EDGE2 5477 5476 -1.02711 0.0103013 0.020726 1 0 1 1 0 0 +EDGE2 5477 3538 1.13789 -0.0702778 -0.0161968 1 0 1 1 0 0 +EDGE2 5478 3537 -0.988641 -0.0502825 -0.00410748 1 0 1 1 0 0 +EDGE2 5478 5477 -0.987157 0.0125715 0.0253096 1 0 1 1 0 0 +EDGE2 5478 3538 -0.0437756 0.0501353 0.00842707 1 0 1 1 0 0 +EDGE2 5478 3539 1.02201 -0.0923863 -0.0289151 1 0 1 1 0 0 +EDGE2 5479 3538 -1.00817 -0.0270346 -0.0088059 1 0 1 1 0 0 +EDGE2 5479 5478 -1.00436 0.0717478 0.0378562 1 0 1 1 0 0 +EDGE2 5479 3539 0.0290892 0.00714312 -0.0229678 1 0 1 1 0 0 +EDGE2 5479 3540 0.995231 0.072689 -0.00538429 1 0 1 1 0 0 +EDGE2 5480 5479 -1.07137 0.0488665 0.0117976 1 0 1 1 0 0 +EDGE2 5480 3539 -1.07101 -0.060019 -0.00488292 1 0 1 1 0 0 +EDGE2 5480 3541 0.0563214 0.848977 1.6033 1 0 1 1 0 0 +EDGE2 5480 3540 0.0814647 -0.00534051 -0.0065385 1 0 1 1 0 0 +EDGE2 5481 3542 0.96882 -0.0788754 0.01063 1 0 1 1 0 0 +EDGE2 5481 5480 -0.949201 -0.142451 -1.58051 1 0 1 1 0 0 +EDGE2 5481 3541 -0.0293634 -0.0276712 -0.014939 1 0 1 1 0 0 +EDGE2 5481 3540 -1.0425 -0.0228438 -1.55331 1 0 1 1 0 0 +EDGE2 5482 3542 -0.0218962 -0.00408311 -0.000728285 1 0 1 1 0 0 +EDGE2 5482 3543 0.966956 -0.03664 -0.0197083 1 0 1 1 0 0 +EDGE2 5482 3541 -1.02105 -0.161868 -0.00655564 1 0 1 1 0 0 +EDGE2 5482 5481 -0.9583 -0.0457337 0.0349897 1 0 1 1 0 0 +EDGE2 5483 3542 -0.951808 0.0284663 -0.0383362 1 0 1 1 0 0 +EDGE2 5483 3543 -0.0212814 0.0252384 -0.0145328 1 0 1 1 0 0 +EDGE2 5483 3544 1.08327 -0.0946563 0.0136926 1 0 1 1 0 0 +EDGE2 5483 5482 -0.969771 0.014328 -0.0100358 1 0 1 1 0 0 +EDGE2 5484 3545 1.02885 0.0571643 -0.00905613 1 0 1 1 0 0 +EDGE2 5484 3543 -1.01804 -0.0926084 0.0258583 1 0 1 1 0 0 +EDGE2 5484 5483 -0.992313 0.0471229 -0.0320113 1 0 1 1 0 0 +EDGE2 5484 3544 0.104673 0.00392978 0.0254136 1 0 1 1 0 0 +EDGE2 5485 3546 0.0130212 -1.02643 -1.60552 1 0 1 1 0 0 +EDGE2 5485 3545 -0.0297324 -0.00111204 0.0193395 1 0 1 1 0 0 +EDGE2 5485 5484 -1.00813 0.0193013 -0.0383478 1 0 1 1 0 0 +EDGE2 5485 3544 -1.0302 0.0273556 0.0299175 1 0 1 1 0 0 +EDGE2 5486 5485 -1.03005 -0.0935227 -1.53964 1 0 1 1 0 0 +EDGE2 5486 3545 -0.992358 0.0669536 -1.61447 1 0 1 1 0 0 +EDGE2 5487 5486 -1.0237 0.0113261 0.0267554 1 0 1 1 0 0 +EDGE2 5488 5487 -0.960114 -0.00353773 0.0327925 1 0 1 1 0 0 +EDGE2 5489 5470 1.01583 -0.034929 -3.14617 1 0 1 1 0 0 +EDGE2 5489 2730 0.926735 0.0419264 -3.13893 1 0 1 1 0 0 +EDGE2 5489 3530 0.922334 0.0447093 -3.13607 1 0 1 1 0 0 +EDGE2 5489 5488 -1.05387 0.00909808 0.00453404 1 0 1 1 0 0 +EDGE2 5490 2731 -0.00820173 -1.09198 -1.54506 1 0 1 1 0 0 +EDGE2 5490 5470 0.0196945 -0.133147 -3.12313 1 0 1 1 0 0 +EDGE2 5490 2729 1.03054 -9.84693e-05 -3.12317 1 0 1 1 0 0 +EDGE2 5490 3529 1.02485 0.0301053 -3.14197 1 0 1 1 0 0 +EDGE2 5490 5469 1.01921 0.0368063 -3.17026 1 0 1 1 0 0 +EDGE2 5490 2730 -0.096253 -0.017622 -3.1474 1 0 1 1 0 0 +EDGE2 5490 3530 -0.0209606 -0.00981499 -3.13676 1 0 1 1 0 0 +EDGE2 5490 5489 -1.0681 0.0502191 0.0153667 1 0 1 1 0 0 +EDGE2 5490 3531 0.0165614 1.05657 1.55058 1 0 1 1 0 0 +EDGE2 5490 5471 0.0225136 0.907808 1.56669 1 0 1 1 0 0 +EDGE2 5491 5470 -1.06207 -0.0250129 1.59644 1 0 1 1 0 0 +EDGE2 5491 5490 -0.959857 0.0149538 -1.56566 1 0 1 1 0 0 +EDGE2 5491 2730 -1.04596 -0.0574438 1.54115 1 0 1 1 0 0 +EDGE2 5491 3530 -1.0469 0.063074 1.60074 1 0 1 1 0 0 +EDGE2 5491 3532 0.932325 0.00238772 -0.00522192 1 0 1 1 0 0 +EDGE2 5491 3531 0.0437782 0.0552565 0.00825349 1 0 1 1 0 0 +EDGE2 5491 5471 -0.00495777 -0.0229481 0.0102 1 0 1 1 0 0 +EDGE2 5491 5472 0.975015 -0.0100487 -0.0137493 1 0 1 1 0 0 +EDGE2 5492 3532 0.0562077 0.0163898 0.0240757 1 0 1 1 0 0 +EDGE2 5492 5491 -0.998068 0.0458671 -0.0090741 1 0 1 1 0 0 +EDGE2 5492 3531 -0.922716 -0.153843 -0.00431374 1 0 1 1 0 0 +EDGE2 5492 5471 -1.00901 -0.00683 -0.018662 1 0 1 1 0 0 +EDGE2 5492 5472 0.0113655 -0.0242107 -0.0303065 1 0 1 1 0 0 +EDGE2 5492 3533 0.982859 -0.0724694 -0.0199603 1 0 1 1 0 0 +EDGE2 5492 5473 0.975152 0.0628792 -0.0111384 1 0 1 1 0 0 +EDGE2 5493 3532 -1.06484 -0.0813704 -0.00798507 1 0 1 1 0 0 +EDGE2 5493 5492 -1.0052 0.0134163 -0.00835963 1 0 1 1 0 0 +EDGE2 5493 5472 -0.999971 -0.078889 0.00970958 1 0 1 1 0 0 +EDGE2 5493 5474 0.950205 -0.0551664 -0.00113231 1 0 1 1 0 0 +EDGE2 5493 3533 -0.0123077 -0.0934761 0.0150955 1 0 1 1 0 0 +EDGE2 5493 5473 -0.0365331 0.0434332 -0.00105783 1 0 1 1 0 0 +EDGE2 5493 3534 0.907961 -0.00585465 -0.00855868 1 0 1 1 0 0 +EDGE2 5494 5474 -0.0681711 -0.0785427 -0.016384 1 0 1 1 0 0 +EDGE2 5494 3533 -0.984666 0.0124765 -0.0367806 1 0 1 1 0 0 +EDGE2 5494 5473 -1.00176 0.067934 -0.0364695 1 0 1 1 0 0 +EDGE2 5494 5493 -1.04505 0.0911452 0.00071212 1 0 1 1 0 0 +EDGE2 5494 5475 0.943002 0.0869422 -0.00307814 1 0 1 1 0 0 +EDGE2 5494 3534 -0.0418783 0.0397011 -0.0268658 1 0 1 1 0 0 +EDGE2 5494 3535 0.983344 -0.00646416 0.0250372 1 0 1 1 0 0 +EDGE2 5495 5474 -1.04265 0.0124883 0.0150997 1 0 1 1 0 0 +EDGE2 5495 5494 -1.08655 0.01973 0.00533793 1 0 1 1 0 0 +EDGE2 5495 5475 -0.0491407 0.0145944 -0.0294361 1 0 1 1 0 0 +EDGE2 5495 3534 -0.986117 -0.0745863 0.0236998 1 0 1 1 0 0 +EDGE2 5495 3535 0.0940396 0.0432131 -0.00347031 1 0 1 1 0 0 +EDGE2 5495 3536 0.000768307 1.07525 1.55102 1 0 1 1 0 0 +EDGE2 5495 5476 -0.0787842 1.07608 1.61037 1 0 1 1 0 0 +EDGE2 5496 5475 -0.9755 0.0973069 1.60163 1 0 1 1 0 0 +EDGE2 5496 5495 -0.979934 -0.021096 1.60088 1 0 1 1 0 0 +EDGE2 5496 3535 -0.915248 0.0384157 1.58395 1 0 1 1 0 0 +EDGE2 5497 5496 -0.986819 0.013151 -0.0186979 1 0 1 1 0 0 +EDGE2 5498 5497 -1.01227 0.0108896 0.0178248 1 0 1 1 0 0 +EDGE2 5499 5498 -1.02902 0.0953755 0.0145477 1 0 1 1 0 0 +EDGE2 5500 5499 -1.03139 0.0509302 0.00596699 1 0 1 1 0 0 +EDGE2 5501 5500 -0.962543 0.0677851 -1.55551 1 0 1 1 0 0 +EDGE2 5502 5501 -0.99767 0.0260894 -0.0139167 1 0 1 1 0 0 +EDGE2 5503 5502 -0.989399 0.0406586 -0.0170057 1 0 1 1 0 0 +EDGE2 5504 5503 -0.915252 -0.015484 0.0207171 1 0 1 1 0 0 +EDGE2 5505 5504 -0.946737 0.0401526 -0.0248791 1 0 1 1 0 0 +EDGE2 5506 5505 -1.07947 -0.0530967 -1.57027 1 0 1 1 0 0 +EDGE2 5507 5506 -0.964162 -0.0895522 -0.0059465 1 0 1 1 0 0 +EDGE2 5508 5507 -0.970574 0.0528561 0.0317861 1 0 1 1 0 0 +EDGE2 5509 5508 -1.05736 -0.0602671 0.0167329 1 0 1 1 0 0 +EDGE2 5510 5509 -1.11033 0.0166669 -0.0272448 1 0 1 1 0 0 +EDGE2 5511 5510 -0.997534 -0.0188242 1.55938 1 0 1 1 0 0 +EDGE2 5512 5511 -0.957683 0.0110492 0.0553125 1 0 1 1 0 0 +EDGE2 5513 5512 -1.07324 0.0330864 0.0233987 1 0 1 1 0 0 +EDGE2 5514 5513 -1.02348 -0.0680962 0.0234293 1 0 1 1 0 0 +EDGE2 5515 5514 -0.965323 0.0424829 0.0018701 1 0 1 1 0 0 +EDGE2 5516 5515 -1.03562 0.0298329 -1.59205 1 0 1 1 0 0 +EDGE2 5517 5516 -1.06267 -0.00092706 0.0171815 1 0 1 1 0 0 +EDGE2 5518 5517 -0.909519 -0.0890094 -0.00855964 1 0 1 1 0 0 +EDGE2 5519 4380 1.04685 0.0253712 -3.10839 1 0 1 1 0 0 +EDGE2 5519 5518 -0.968463 0.0182027 0.00134151 1 0 1 1 0 0 +EDGE2 5519 4420 1.10317 0.0135302 -3.14156 1 0 1 1 0 0 +EDGE2 5519 4400 1.01518 0.159491 -3.14062 1 0 1 1 0 0 +EDGE2 5520 4381 -0.0131538 1.06614 1.58763 1 0 1 1 0 0 +EDGE2 5520 4380 -0.0559595 -0.0647399 -3.12131 1 0 1 1 0 0 +EDGE2 5520 5519 -1.00703 0.0422 0.0220626 1 0 1 1 0 0 +EDGE2 5520 4420 0.0209659 -0.00908002 -3.13271 1 0 1 1 0 0 +EDGE2 5520 4400 0.00091361 -0.00734493 -3.16109 1 0 1 1 0 0 +EDGE2 5520 4401 0.0234111 -0.904321 -1.57313 1 0 1 1 0 0 +EDGE2 5520 4421 -0.0387902 -1.02309 -1.58064 1 0 1 1 0 0 +EDGE2 5520 4399 1.04411 0.0488138 -3.16258 1 0 1 1 0 0 +EDGE2 5520 4419 0.984967 -0.010816 -3.14105 1 0 1 1 0 0 +EDGE2 5520 4379 0.970349 0.0203479 -3.1497 1 0 1 1 0 0 +EDGE2 5521 4382 1.0018 -0.0140632 0.00551947 1 0 1 1 0 0 +EDGE2 5521 4381 -0.110819 0.00996675 -0.0279334 1 0 1 1 0 0 +EDGE2 5521 4380 -0.947136 -0.0311906 1.57419 1 0 1 1 0 0 +EDGE2 5521 4420 -0.96121 -0.0637292 1.57428 1 0 1 1 0 0 +EDGE2 5521 5520 -1.05908 -0.0227243 -1.54925 1 0 1 1 0 0 +EDGE2 5521 4400 -0.887231 -0.0158133 1.56455 1 0 1 1 0 0 +EDGE2 5522 4382 -0.0117471 -0.0844899 -0.0348444 1 0 1 1 0 0 +EDGE2 5522 4383 0.987289 0.0156142 0.0180415 1 0 1 1 0 0 +EDGE2 5522 5521 -0.895312 0.0134232 0.00863828 1 0 1 1 0 0 +EDGE2 5522 4381 -0.931414 0.0203535 -0.00321372 1 0 1 1 0 0 +EDGE2 5523 4382 -1.04195 0.0685041 0.00424313 1 0 1 1 0 0 +EDGE2 5523 4384 1.09958 -0.0126098 0.0302473 1 0 1 1 0 0 +EDGE2 5523 4383 0.00895573 0.0367183 -0.000167394 1 0 1 1 0 0 +EDGE2 5523 5522 -0.909643 -0.00565017 0.019961 1 0 1 1 0 0 +EDGE2 5524 4385 0.941576 -0.0565184 -0.0130005 1 0 1 1 0 0 +EDGE2 5524 5523 -0.973284 -0.00487397 -0.000662618 1 0 1 1 0 0 +EDGE2 5524 4384 -0.0703121 -0.0541327 0.0434569 1 0 1 1 0 0 +EDGE2 5524 4383 -1.05017 0.0772045 0.0253706 1 0 1 1 0 0 +EDGE2 5525 4385 0.00581554 -0.0589266 0.0384874 1 0 1 1 0 0 +EDGE2 5525 4384 -1.03035 0.0250052 -0.0296818 1 0 1 1 0 0 +EDGE2 5525 5524 -0.985907 0.0532984 -0.0134715 1 0 1 1 0 0 +EDGE2 5525 4386 0.0147333 -1.05087 -1.58915 1 0 1 1 0 0 +EDGE2 5526 4385 -0.966422 -0.0119651 -1.55199 1 0 1 1 0 0 +EDGE2 5526 5525 -0.993078 0.0469307 -1.57867 1 0 1 1 0 0 +EDGE2 5527 5526 -0.921363 0.0126199 0.0207944 1 0 1 1 0 0 +EDGE2 5528 5527 -0.909645 0.0139618 -0.0158661 1 0 1 1 0 0 +EDGE2 5529 5510 0.964038 0.0583879 -3.12343 1 0 1 1 0 0 +EDGE2 5529 5528 -0.980476 0.109599 -0.0200612 1 0 1 1 0 0 +EDGE2 5530 5509 1.00972 -0.0188511 -3.14953 1 0 1 1 0 0 +EDGE2 5530 5510 -0.0592085 -0.00947353 -3.10976 1 0 1 1 0 0 +EDGE2 5530 5511 0.0331983 1.05248 1.54504 1 0 1 1 0 0 +EDGE2 5530 5529 -1.0224 0.0534668 -0.01281 1 0 1 1 0 0 +EDGE2 5531 5510 -1.00492 -0.0107613 1.58598 1 0 1 1 0 0 +EDGE2 5531 5530 -1.09316 0.0552036 -1.57749 1 0 1 1 0 0 +EDGE2 5531 5511 -0.0722117 -0.0076145 0.00241334 1 0 1 1 0 0 +EDGE2 5531 5512 0.975047 0.0357637 -0.0230758 1 0 1 1 0 0 +EDGE2 5532 5511 -0.97076 0.0645032 0.0248184 1 0 1 1 0 0 +EDGE2 5532 5531 -0.997629 0.0570761 -0.00902674 1 0 1 1 0 0 +EDGE2 5532 5512 -0.0194734 -0.111938 -0.00963286 1 0 1 1 0 0 +EDGE2 5532 5513 0.978973 -0.00557859 -0.00724414 1 0 1 1 0 0 +EDGE2 5533 5512 -0.981248 -0.0196513 -0.0155337 1 0 1 1 0 0 +EDGE2 5533 5532 -0.976654 0.0553332 0.00868103 1 0 1 1 0 0 +EDGE2 5533 5513 0.0571932 0.0286693 0.0106209 1 0 1 1 0 0 +EDGE2 5533 5514 0.99892 -0.0207748 -0.0316596 1 0 1 1 0 0 +EDGE2 5534 5513 -1.04687 0.0308102 -0.00270588 1 0 1 1 0 0 +EDGE2 5534 5533 -0.921904 -0.0667493 -0.0126769 1 0 1 1 0 0 +EDGE2 5534 5514 -0.0232288 -0.000619822 -0.00607836 1 0 1 1 0 0 +EDGE2 5534 5515 0.942328 -0.0348029 -0.00271928 1 0 1 1 0 0 +EDGE2 5535 5534 -1.02728 -0.109747 0.00906913 1 0 1 1 0 0 +EDGE2 5535 5514 -1.0343 -0.0140781 -0.00735097 1 0 1 1 0 0 +EDGE2 5535 5515 0.024632 -0.0412583 -0.0278086 1 0 1 1 0 0 +EDGE2 5535 5516 0.0465405 1.00919 1.54134 1 0 1 1 0 0 +EDGE2 5536 5515 -1.02875 -0.00961655 -1.58177 1 0 1 1 0 0 +EDGE2 5536 5535 -0.965224 0.0899546 -1.59376 1 0 1 1 0 0 +EDGE2 5536 5516 0.0147547 0.0254739 0.0047166 1 0 1 1 0 0 +EDGE2 5536 5517 1.02522 0.000148643 0.00216704 1 0 1 1 0 0 +EDGE2 5537 5516 -1.04737 0.11636 0.0286891 1 0 1 1 0 0 +EDGE2 5537 5536 -1.02492 0.0458209 -0.00522382 1 0 1 1 0 0 +EDGE2 5537 5518 1.06795 -0.0418792 -0.011972 1 0 1 1 0 0 +EDGE2 5537 5517 -0.0615742 -0.0864761 0.00445007 1 0 1 1 0 0 +EDGE2 5538 5537 -0.973546 0.0534118 0.00832277 1 0 1 1 0 0 +EDGE2 5538 5518 -0.0181143 0.0361903 -0.0164314 1 0 1 1 0 0 +EDGE2 5538 5517 -1.00679 -0.0823869 -0.00323152 1 0 1 1 0 0 +EDGE2 5538 5519 1.0363 -0.00615737 0.00966918 1 0 1 1 0 0 +EDGE2 5539 4380 0.962417 -0.0411876 -3.13767 1 0 1 1 0 0 +EDGE2 5539 5518 -1.02648 -0.0367531 -0.0165546 1 0 1 1 0 0 +EDGE2 5539 5538 -1.05181 -0.133966 0.00536282 1 0 1 1 0 0 +EDGE2 5539 5519 0.0470819 -0.028315 -0.0224523 1 0 1 1 0 0 +EDGE2 5539 4420 1.03173 0.0121244 -3.1212 1 0 1 1 0 0 +EDGE2 5539 5520 1.07503 -0.0148528 0.0195521 1 0 1 1 0 0 +EDGE2 5539 4400 0.988221 -0.0386808 -3.14399 1 0 1 1 0 0 +EDGE2 5540 5521 -0.00134066 0.99654 1.57976 1 0 1 1 0 0 +EDGE2 5540 4381 -0.00930354 1.04081 1.57369 1 0 1 1 0 0 +EDGE2 5540 4380 -0.0526984 -0.0500519 -3.08747 1 0 1 1 0 0 +EDGE2 5540 5539 -0.999217 0.011879 -0.0132042 1 0 1 1 0 0 +EDGE2 5540 5519 -1.02834 0.0137091 0.0168622 1 0 1 1 0 0 +EDGE2 5540 4420 0.0963784 0.0296252 -3.13447 1 0 1 1 0 0 +EDGE2 5540 5520 -0.048424 0.0153575 0.00801885 1 0 1 1 0 0 +EDGE2 5540 4400 -0.00457805 -0.0713842 -3.15493 1 0 1 1 0 0 +EDGE2 5540 4401 0.0052971 -0.988817 -1.52426 1 0 1 1 0 0 +EDGE2 5540 4421 -0.0571642 -1.01094 -1.55203 1 0 1 1 0 0 +EDGE2 5540 4399 0.938102 0.0130947 -3.13647 1 0 1 1 0 0 +EDGE2 5540 4419 1.02278 0.00031818 -3.13161 1 0 1 1 0 0 +EDGE2 5540 4379 1.03193 -0.0440027 -3.12537 1 0 1 1 0 0 +EDGE2 5541 4380 -1.01024 0.0878831 -1.57555 1 0 1 1 0 0 +EDGE2 5541 5540 -1.00013 0.0230832 1.58891 1 0 1 1 0 0 +EDGE2 5541 4420 -1.14301 0.0236914 -1.60575 1 0 1 1 0 0 +EDGE2 5541 5520 -0.965705 0.00277248 1.58587 1 0 1 1 0 0 +EDGE2 5541 4400 -1.05352 -0.0423575 -1.59812 1 0 1 1 0 0 +EDGE2 5541 4422 0.961667 0.0209943 -0.022742 1 0 1 1 0 0 +EDGE2 5541 4401 0.0307859 0.00797314 0.0102039 1 0 1 1 0 0 +EDGE2 5541 4421 -0.0617114 -0.0185945 -0.00462612 1 0 1 1 0 0 +EDGE2 5541 4402 0.968672 0.0373619 -0.0197402 1 0 1 1 0 0 +EDGE2 5542 4422 -0.0167171 -0.00915935 -0.00753017 1 0 1 1 0 0 +EDGE2 5542 4401 -1.00354 0.0718167 0.0108458 1 0 1 1 0 0 +EDGE2 5542 4421 -0.999302 0.0146386 0.0247366 1 0 1 1 0 0 +EDGE2 5542 5541 -0.912322 -0.0379548 0.0038117 1 0 1 1 0 0 +EDGE2 5542 4402 -0.0718677 -0.00832799 0.0479352 1 0 1 1 0 0 +EDGE2 5542 4403 1.01905 -0.0762246 -0.0134414 1 0 1 1 0 0 +EDGE2 5542 4423 0.981312 -0.037875 -0.0536965 1 0 1 1 0 0 +EDGE2 5543 4422 -0.952806 -0.0705434 -0.0179045 1 0 1 1 0 0 +EDGE2 5543 5542 -0.994619 0.0468616 -0.0347615 1 0 1 1 0 0 +EDGE2 5543 4402 -0.948709 0.0184918 -0.00209015 1 0 1 1 0 0 +EDGE2 5543 4404 1.01778 -0.0173967 -0.0153394 1 0 1 1 0 0 +EDGE2 5543 4403 -0.0714013 -0.024016 0.0317086 1 0 1 1 0 0 +EDGE2 5543 4423 -0.0525999 -0.0333757 -0.00479418 1 0 1 1 0 0 +EDGE2 5543 4424 0.884678 0.0527295 0.0120498 1 0 1 1 0 0 +EDGE2 5544 5543 -1.01578 -0.0162642 0.0380631 1 0 1 1 0 0 +EDGE2 5544 4404 0.0457978 -0.0489292 0.0220261 1 0 1 1 0 0 +EDGE2 5544 4403 -1.01668 -0.0567708 0.0175248 1 0 1 1 0 0 +EDGE2 5544 4423 -1.00405 0.0259065 0.0188346 1 0 1 1 0 0 +EDGE2 5544 4424 0.0251465 0.115712 -0.0225374 1 0 1 1 0 0 +EDGE2 5544 4405 1.00542 -0.0560929 -0.00700931 1 0 1 1 0 0 +EDGE2 5544 4425 0.998236 -0.0317403 -0.0199164 1 0 1 1 0 0 +EDGE2 5545 4406 -0.0198425 0.94884 1.62404 1 0 1 1 0 0 +EDGE2 5545 4404 -0.972583 -0.0251939 -0.0179843 1 0 1 1 0 0 +EDGE2 5545 5544 -1.00766 -0.00486533 0.0057856 1 0 1 1 0 0 +EDGE2 5545 4424 -1.0615 0.00316533 -0.00805178 1 0 1 1 0 0 +EDGE2 5545 4405 0.0789575 -0.0767277 0.0118505 1 0 1 1 0 0 +EDGE2 5545 4425 0.0426282 0.0586145 -0.0167398 1 0 1 1 0 0 +EDGE2 5545 4426 -0.0449282 1.0224 1.5669 1 0 1 1 0 0 +EDGE2 5546 4405 -0.969718 -0.0209433 1.57518 1 0 1 1 0 0 +EDGE2 5546 4425 -1.11318 0.0916547 1.55536 1 0 1 1 0 0 +EDGE2 5546 5545 -0.925502 -0.0453573 1.55578 1 0 1 1 0 0 +EDGE2 5547 5546 -0.998684 -0.0548891 0.0134128 1 0 1 1 0 0 +EDGE2 5548 5547 -0.983816 -0.0352137 -0.0257052 1 0 1 1 0 0 +EDGE2 5549 5548 -1.06188 -0.093958 0.00745593 1 0 1 1 0 0 +EDGE2 5550 5549 -1.04023 -0.00737051 0.035038 1 0 1 1 0 0 +EDGE2 5551 5550 -1.03494 -0.0299454 1.58037 1 0 1 1 0 0 +EDGE2 5552 5551 -1.01629 0.0222933 0.0148386 1 0 1 1 0 0 +EDGE2 5553 5552 -1.05517 -0.0128232 0.0123587 1 0 1 1 0 0 +EDGE2 5554 5515 0.989443 0.10762 -3.13933 1 0 1 1 0 0 +EDGE2 5554 5535 0.975059 -0.000436417 -3.13014 1 0 1 1 0 0 +EDGE2 5554 5553 -1.0166 -0.0092698 -0.0197124 1 0 1 1 0 0 +EDGE2 5555 5534 1.03095 -0.100167 -3.13234 1 0 1 1 0 0 +EDGE2 5555 5514 1.02395 -0.0142495 -3.12422 1 0 1 1 0 0 +EDGE2 5555 5554 -0.935252 0.00401272 -0.0210743 1 0 1 1 0 0 +EDGE2 5555 5515 0.0392301 -0.0650125 -3.13457 1 0 1 1 0 0 +EDGE2 5555 5535 -0.00336675 -0.0527951 -3.14409 1 0 1 1 0 0 +EDGE2 5555 5516 -0.00422992 -0.976577 -1.55764 1 0 1 1 0 0 +EDGE2 5555 5536 -0.00677779 -0.988557 -1.57827 1 0 1 1 0 0 +EDGE2 5556 5555 -0.9878 0.0576572 1.58152 1 0 1 1 0 0 +EDGE2 5556 5537 1.13587 0.00369295 0.00879822 1 0 1 1 0 0 +EDGE2 5556 5515 -0.980412 -0.144005 -1.55154 1 0 1 1 0 0 +EDGE2 5556 5535 -0.97261 -0.0821417 -1.57531 1 0 1 1 0 0 +EDGE2 5556 5516 -0.0726014 0.071171 -0.0202178 1 0 1 1 0 0 +EDGE2 5556 5536 -0.0499991 -0.00627654 -0.0210627 1 0 1 1 0 0 +EDGE2 5556 5517 0.981113 -0.0572251 -0.00991463 1 0 1 1 0 0 +EDGE2 5557 5537 -0.0227599 -0.0176616 0.0288586 1 0 1 1 0 0 +EDGE2 5557 5556 -1.03013 -0.100272 -0.00978343 1 0 1 1 0 0 +EDGE2 5557 5516 -0.995549 0.000942048 0.011814 1 0 1 1 0 0 +EDGE2 5557 5536 -0.955296 -0.0621334 0.00914375 1 0 1 1 0 0 +EDGE2 5557 5518 0.934566 -0.089748 0.00469588 1 0 1 1 0 0 +EDGE2 5557 5517 -0.0761441 0.0638913 -0.00992097 1 0 1 1 0 0 +EDGE2 5557 5538 0.993897 0.00314902 -0.0135512 1 0 1 1 0 0 +EDGE2 5558 5537 -1.00579 -0.0963896 0.0171741 1 0 1 1 0 0 +EDGE2 5558 5557 -0.945549 0.0185054 -0.0162755 1 0 1 1 0 0 +EDGE2 5558 5518 -0.0108015 0.0177646 -0.0165225 1 0 1 1 0 0 +EDGE2 5558 5517 -1.08048 -0.0293759 0.030216 1 0 1 1 0 0 +EDGE2 5558 5538 0.0183929 0.0253366 0.0185778 1 0 1 1 0 0 +EDGE2 5558 5539 1.00567 0.0434002 -0.0104429 1 0 1 1 0 0 +EDGE2 5558 5519 0.895625 -0.0898521 0.0139464 1 0 1 1 0 0 +EDGE2 5559 4380 1.01685 -0.0154992 -3.17322 1 0 1 1 0 0 +EDGE2 5559 5518 -1.06533 0.0381282 0.0090877 1 0 1 1 0 0 +EDGE2 5559 5558 -1.04465 0.0257437 0.0365778 1 0 1 1 0 0 +EDGE2 5559 5538 -1.00729 -0.000595701 -0.0148032 1 0 1 1 0 0 +EDGE2 5559 5539 0.0161745 -0.0896253 -0.0164524 1 0 1 1 0 0 +EDGE2 5559 5519 -0.00857632 0.00647657 -0.0227372 1 0 1 1 0 0 +EDGE2 5559 5540 1.09727 -0.0415134 -0.0143972 1 0 1 1 0 0 +EDGE2 5559 4420 0.983841 -0.0289465 -3.11409 1 0 1 1 0 0 +EDGE2 5559 5520 1.05441 -0.00914238 -0.00723574 1 0 1 1 0 0 +EDGE2 5559 4400 0.890662 0.049061 -3.13901 1 0 1 1 0 0 +EDGE2 5560 5521 0.106729 1.07225 1.56451 1 0 1 1 0 0 +EDGE2 5560 4381 0.0177627 1.02998 1.56063 1 0 1 1 0 0 +EDGE2 5560 4380 0.0656555 0.0671788 -3.14072 1 0 1 1 0 0 +EDGE2 5560 5539 -1.01925 -0.102232 -0.00077012 1 0 1 1 0 0 +EDGE2 5560 5559 -0.880281 -0.0620249 0.0119599 1 0 1 1 0 0 +EDGE2 5560 5519 -1.02091 -0.0900179 -0.0673199 1 0 1 1 0 0 +EDGE2 5560 5540 0.0621218 0.00742923 -0.00731956 1 0 1 1 0 0 +EDGE2 5560 4420 -0.0265302 0.0876312 -3.13312 1 0 1 1 0 0 +EDGE2 5560 5520 0.0305457 0.019989 -0.044016 1 0 1 1 0 0 +EDGE2 5560 4400 0.0243743 0.0622836 -3.16604 1 0 1 1 0 0 +EDGE2 5560 4401 0.0444453 -0.98221 -1.56349 1 0 1 1 0 0 +EDGE2 5560 4421 -0.0896976 -0.956784 -1.55824 1 0 1 1 0 0 +EDGE2 5560 5541 -0.0955508 -1.01425 -1.54327 1 0 1 1 0 0 +EDGE2 5560 4399 0.990094 -0.0318129 -3.14058 1 0 1 1 0 0 +EDGE2 5560 4419 1.05312 -0.0906511 -3.12211 1 0 1 1 0 0 +EDGE2 5560 4379 0.965322 -0.069516 -3.12012 1 0 1 1 0 0 +EDGE2 5561 4382 1.05606 0.061508 0.0292643 1 0 1 1 0 0 +EDGE2 5561 5522 1.02564 -0.0720227 -0.0173264 1 0 1 1 0 0 +EDGE2 5561 5521 -0.00741426 0.0624967 -0.0345068 1 0 1 1 0 0 +EDGE2 5561 4381 0.00324412 0.00105709 0.00234211 1 0 1 1 0 0 +EDGE2 5561 4380 -1.07853 0.0716153 1.54501 1 0 1 1 0 0 +EDGE2 5561 5540 -1.11879 -0.0460783 -1.56116 1 0 1 1 0 0 +EDGE2 5561 5560 -1.02731 0.0368268 -1.55083 1 0 1 1 0 0 +EDGE2 5561 4420 -0.976391 0.0302509 1.56392 1 0 1 1 0 0 +EDGE2 5561 5520 -0.959234 -0.104352 -1.5722 1 0 1 1 0 0 +EDGE2 5561 4400 -0.964214 0.0404919 1.5551 1 0 1 1 0 0 +EDGE2 5562 4382 -0.0745894 0.0463431 0.0439333 1 0 1 1 0 0 +EDGE2 5562 5523 0.977996 0.00111593 0.0239495 1 0 1 1 0 0 +EDGE2 5562 4383 0.990287 0.020876 0.00249746 1 0 1 1 0 0 +EDGE2 5562 5522 0.00655313 -0.0519058 -0.0236874 1 0 1 1 0 0 +EDGE2 5562 5521 -1.04553 0.0115124 0.0290991 1 0 1 1 0 0 +EDGE2 5562 5561 -1.00783 -0.0474113 -0.0211185 1 0 1 1 0 0 +EDGE2 5562 4381 -0.952362 0.111641 0.03785 1 0 1 1 0 0 +EDGE2 5563 4382 -1.02952 0.0304256 -0.0252769 1 0 1 1 0 0 +EDGE2 5563 5523 -0.0184388 -0.00528094 0.0132323 1 0 1 1 0 0 +EDGE2 5563 4384 0.976761 0.126044 0.000253153 1 0 1 1 0 0 +EDGE2 5563 5524 0.969592 -0.0426484 0.0235759 1 0 1 1 0 0 +EDGE2 5563 5562 -0.952982 0.0267706 0.0152757 1 0 1 1 0 0 +EDGE2 5563 4383 -0.00984991 -0.0410823 0.00668797 1 0 1 1 0 0 +EDGE2 5563 5522 -1.04883 0.0341061 -0.0315959 1 0 1 1 0 0 +EDGE2 5564 4385 1.0508 0.0179801 -0.0278842 1 0 1 1 0 0 +EDGE2 5564 5525 1.02004 -0.057257 0.0112911 1 0 1 1 0 0 +EDGE2 5564 5523 -0.964957 -0.0450962 -0.00595585 1 0 1 1 0 0 +EDGE2 5564 4384 -0.00430211 0.0333283 -0.00465958 1 0 1 1 0 0 +EDGE2 5564 5524 0.0455939 0.0186813 0.0135834 1 0 1 1 0 0 +EDGE2 5564 5563 -1.01188 -0.0212948 0.0141468 1 0 1 1 0 0 +EDGE2 5564 4383 -1.06144 0.0415828 0.00148001 1 0 1 1 0 0 +EDGE2 5565 5526 -0.121092 0.975916 1.49854 1 0 1 1 0 0 +EDGE2 5565 5564 -0.9076 -0.0227573 0.00956767 1 0 1 1 0 0 +EDGE2 5565 4385 0.00277931 0.0431357 0.0265621 1 0 1 1 0 0 +EDGE2 5565 5525 -0.0617044 0.045472 0.0117596 1 0 1 1 0 0 +EDGE2 5565 4384 -0.986163 -0.0728988 -0.0014082 1 0 1 1 0 0 +EDGE2 5565 5524 -0.951941 0.0428234 0.013572 1 0 1 1 0 0 +EDGE2 5565 4386 0.00604725 -1.02288 -1.59498 1 0 1 1 0 0 +EDGE2 5566 5527 1.03186 -0.0434652 0.00877241 1 0 1 1 0 0 +EDGE2 5566 5526 0.014877 0.104323 -0.0375894 1 0 1 1 0 0 +EDGE2 5566 4385 -0.960604 -0.00195718 -1.57711 1 0 1 1 0 0 +EDGE2 5566 5525 -0.997394 -0.0323354 -1.60222 1 0 1 1 0 0 +EDGE2 5566 5565 -0.965136 0.00732629 -1.57405 1 0 1 1 0 0 +EDGE2 5567 5527 0.0256422 -0.0515755 0.00166453 1 0 1 1 0 0 +EDGE2 5567 5528 0.999703 -0.0678167 0.00542141 1 0 1 1 0 0 +EDGE2 5567 5566 -1.08559 -0.0504219 -0.00978942 1 0 1 1 0 0 +EDGE2 5567 5526 -1.0204 -0.00107762 0.0194606 1 0 1 1 0 0 +EDGE2 5568 5529 0.903043 0.0172695 0.0346246 1 0 1 1 0 0 +EDGE2 5568 5527 -1.01156 0.0436343 -0.00352274 1 0 1 1 0 0 +EDGE2 5568 5528 0.0262125 -0.163722 0.00950979 1 0 1 1 0 0 +EDGE2 5568 5567 -1.02389 -0.0290554 -0.024945 1 0 1 1 0 0 +EDGE2 5569 5510 1.04546 0.140926 -3.16049 1 0 1 1 0 0 +EDGE2 5569 5530 1.00295 -0.0443676 -0.0152295 1 0 1 1 0 0 +EDGE2 5569 5529 0.016596 -0.0168065 0.00207078 1 0 1 1 0 0 +EDGE2 5569 5528 -1.11215 0.0386442 0.0135502 1 0 1 1 0 0 +EDGE2 5569 5568 -1.07094 -0.0267319 0.0104038 1 0 1 1 0 0 +EDGE2 5570 5509 1.02845 -0.0490298 -3.11714 1 0 1 1 0 0 +EDGE2 5570 5510 0.0098649 0.0421772 -3.1388 1 0 1 1 0 0 +EDGE2 5570 5530 -0.0859891 0.0392721 0.0250509 1 0 1 1 0 0 +EDGE2 5570 5511 -0.0191763 1.01575 1.58461 1 0 1 1 0 0 +EDGE2 5570 5531 -0.00436249 1.01793 1.60258 1 0 1 1 0 0 +EDGE2 5570 5529 -0.960226 0.0155418 -0.0190902 1 0 1 1 0 0 +EDGE2 5570 5569 -0.98271 -0.0599432 -0.0126804 1 0 1 1 0 0 +EDGE2 5571 5510 -0.974688 0.10701 1.58169 1 0 1 1 0 0 +EDGE2 5571 5530 -0.98078 0.0198019 -1.54187 1 0 1 1 0 0 +EDGE2 5571 5570 -1.06455 -0.0375952 -1.57451 1 0 1 1 0 0 +EDGE2 5571 5511 0.0117193 -0.00803684 0.00461147 1 0 1 1 0 0 +EDGE2 5571 5531 -0.115256 0.00063685 -0.030237 1 0 1 1 0 0 +EDGE2 5571 5512 1.04201 0.00554099 0.0391037 1 0 1 1 0 0 +EDGE2 5571 5532 0.930597 -0.0128571 -0.00649869 1 0 1 1 0 0 +EDGE2 5572 5571 -0.987994 0.0373893 -0.0183405 1 0 1 1 0 0 +EDGE2 5572 5511 -1.0061 0.0214148 -0.0167851 1 0 1 1 0 0 +EDGE2 5572 5531 -0.991644 0.0261333 -0.0244496 1 0 1 1 0 0 +EDGE2 5572 5512 -0.0159087 0.0612544 -0.00461148 1 0 1 1 0 0 +EDGE2 5572 5532 -0.0626417 -0.00320512 0.00712806 1 0 1 1 0 0 +EDGE2 5572 5513 0.945252 0.0610167 0.0024229 1 0 1 1 0 0 +EDGE2 5572 5533 0.892165 0.0348075 -0.0222419 1 0 1 1 0 0 +EDGE2 5573 5572 -0.985293 -0.0155134 0.00666448 1 0 1 1 0 0 +EDGE2 5573 5512 -0.996726 -0.00189243 0.0153556 1 0 1 1 0 0 +EDGE2 5573 5532 -0.942835 0.0081481 -0.0304317 1 0 1 1 0 0 +EDGE2 5573 5534 1.02889 -0.0495688 0.0486857 1 0 1 1 0 0 +EDGE2 5573 5513 -0.0101276 -0.0832449 0.0119881 1 0 1 1 0 0 +EDGE2 5573 5533 0.0757553 -0.0347475 0.000662969 1 0 1 1 0 0 +EDGE2 5573 5514 1.00258 -0.103631 -0.0190347 1 0 1 1 0 0 +EDGE2 5574 5555 0.963069 0.0059855 -3.15485 1 0 1 1 0 0 +EDGE2 5574 5573 -1.022 0.0132666 -0.0115146 1 0 1 1 0 0 +EDGE2 5574 5534 0.0755255 0.00238739 -0.032442 1 0 1 1 0 0 +EDGE2 5574 5513 -0.986928 -0.0324583 0.00104973 1 0 1 1 0 0 +EDGE2 5574 5533 -0.950276 -0.00957071 0.0298422 1 0 1 1 0 0 +EDGE2 5574 5514 -0.0276539 -0.0459821 -0.025232 1 0 1 1 0 0 +EDGE2 5574 5515 0.974163 -0.0097001 0.018069 1 0 1 1 0 0 +EDGE2 5574 5535 0.985698 -0.00891785 -0.00429623 1 0 1 1 0 0 +EDGE2 5575 5555 -0.0567828 0.0552327 -3.14162 1 0 1 1 0 0 +EDGE2 5575 5534 -1.04974 -0.00947015 -0.00622134 1 0 1 1 0 0 +EDGE2 5575 5574 -0.961639 0.030412 0.0185908 1 0 1 1 0 0 +EDGE2 5575 5514 -1.01974 -0.00311678 0.00191253 1 0 1 1 0 0 +EDGE2 5575 5554 1.00227 0.00482752 -3.13811 1 0 1 1 0 0 +EDGE2 5575 5556 -0.107031 1.04245 1.53841 1 0 1 1 0 0 +EDGE2 5575 5515 0.030078 0.131456 -0.023751 1 0 1 1 0 0 +EDGE2 5575 5535 0.0473953 0.0472574 -0.0267987 1 0 1 1 0 0 +EDGE2 5575 5516 0.0342013 1.01535 1.57874 1 0 1 1 0 0 +EDGE2 5575 5536 -0.0616811 1.05565 1.59893 1 0 1 1 0 0 +EDGE2 5576 5555 -1.01676 -0.115916 -1.58119 1 0 1 1 0 0 +EDGE2 5576 5575 -0.973456 -0.0511817 1.56992 1 0 1 1 0 0 +EDGE2 5576 5515 -0.942279 -0.0365528 1.58767 1 0 1 1 0 0 +EDGE2 5576 5535 -1.01038 0.0444441 1.56237 1 0 1 1 0 0 +EDGE2 5577 5576 -1.02204 -0.0559235 -0.00330082 1 0 1 1 0 0 +EDGE2 5578 5577 -1.01657 -0.100273 -0.0330045 1 0 1 1 0 0 +EDGE2 5579 5578 -1.01113 -0.0253654 -0.0123947 1 0 1 1 0 0 +EDGE2 5580 5579 -1.0625 -0.0135522 0.00135538 1 0 1 1 0 0 +EDGE2 5581 5580 -1.06538 -0.067365 -1.57729 1 0 1 1 0 0 +EDGE2 5582 5581 -1.06128 -0.0461207 0.0030049 1 0 1 1 0 0 +EDGE2 5583 5582 -0.902825 0.0335849 0.00245017 1 0 1 1 0 0 +EDGE2 5584 5583 -0.935753 -0.0458598 0.0132041 1 0 1 1 0 0 +EDGE2 5585 5584 -1.02603 -0.000805101 0.00782514 1 0 1 1 0 0 +EDGE2 5586 5585 -1.03916 0.0221907 -1.56168 1 0 1 1 0 0 +EDGE2 5587 5586 -1.0454 -0.0466807 -0.0254831 1 0 1 1 0 0 +EDGE2 5588 5587 -0.930901 -0.0600826 -0.0317464 1 0 1 1 0 0 +EDGE2 5589 5588 -1.00871 0.0791594 0.000103321 1 0 1 1 0 0 +EDGE2 5589 5550 0.93057 -0.0305083 -3.16369 1 0 1 1 0 0 +EDGE2 5590 5589 -0.964241 -0.0367675 0.00873688 1 0 1 1 0 0 +EDGE2 5590 5550 -0.0631271 -0.00505293 -3.15129 1 0 1 1 0 0 +EDGE2 5590 5551 0.0624546 1.01643 1.58104 1 0 1 1 0 0 +EDGE2 5590 5549 1.02133 -0.00989487 -3.16956 1 0 1 1 0 0 +EDGE2 5591 5552 0.965796 0.0508154 0.0146767 1 0 1 1 0 0 +EDGE2 5591 5550 -1.08553 -0.0117849 1.58827 1 0 1 1 0 0 +EDGE2 5591 5590 -0.926395 -0.0640331 -1.54461 1 0 1 1 0 0 +EDGE2 5591 5551 0.0657503 0.0450618 -0.0352451 1 0 1 1 0 0 +EDGE2 5592 5591 -1.15016 0.0884517 -0.0258189 1 0 1 1 0 0 +EDGE2 5592 5553 1.05154 -0.000479302 -0.0153861 1 0 1 1 0 0 +EDGE2 5592 5552 0.00935489 -0.031094 -0.0089798 1 0 1 1 0 0 +EDGE2 5592 5551 -0.9459 -0.0530339 0.0132592 1 0 1 1 0 0 +EDGE2 5593 5554 1.00558 -0.0276107 0.00969092 1 0 1 1 0 0 +EDGE2 5593 5592 -1.13731 -0.0116892 0.0237463 1 0 1 1 0 0 +EDGE2 5593 5553 0.0193708 -0.0499648 -0.00597616 1 0 1 1 0 0 +EDGE2 5593 5552 -1.02147 -0.0556812 -0.0199269 1 0 1 1 0 0 +EDGE2 5594 5555 1.05698 0.0473743 -0.0144637 1 0 1 1 0 0 +EDGE2 5594 5575 0.996962 0.0422767 -3.1725 1 0 1 1 0 0 +EDGE2 5594 5554 -0.0792135 -0.0965808 -0.0184516 1 0 1 1 0 0 +EDGE2 5594 5515 0.931226 -0.0277313 -3.15363 1 0 1 1 0 0 +EDGE2 5594 5535 0.964655 -0.0153993 -3.12834 1 0 1 1 0 0 +EDGE2 5594 5553 -0.986951 -0.0445358 -0.00448557 1 0 1 1 0 0 +EDGE2 5594 5593 -1.01305 -0.00518059 0.0620369 1 0 1 1 0 0 +EDGE2 5595 5576 0.0297574 0.905012 1.57763 1 0 1 1 0 0 +EDGE2 5595 5555 -0.110273 0.0181201 -0.0202472 1 0 1 1 0 0 +EDGE2 5595 5534 0.961912 -0.0251332 -3.16634 1 0 1 1 0 0 +EDGE2 5595 5574 1.0047 0.0668769 -3.14542 1 0 1 1 0 0 +EDGE2 5595 5514 0.939233 0.0549808 -3.12976 1 0 1 1 0 0 +EDGE2 5595 5575 0.00973606 0.017988 -3.13907 1 0 1 1 0 0 +EDGE2 5595 5554 -1.12992 0.00777537 -0.0357042 1 0 1 1 0 0 +EDGE2 5595 5556 -0.0207817 -1.01966 -1.55608 1 0 1 1 0 0 +EDGE2 5595 5594 -0.932572 -0.0437506 -0.000714085 1 0 1 1 0 0 +EDGE2 5595 5515 -0.0459588 -0.00860468 -3.11915 1 0 1 1 0 0 +EDGE2 5595 5535 0.00460816 0.0688899 -3.15244 1 0 1 1 0 0 +EDGE2 5595 5516 -0.0216639 -1.02596 -1.55584 1 0 1 1 0 0 +EDGE2 5595 5536 0.0388705 -0.978256 -1.59139 1 0 1 1 0 0 +EDGE2 5596 5555 -1.03946 -0.0783485 1.54885 1 0 1 1 0 0 +EDGE2 5596 5595 -1.02508 0.042334 1.58991 1 0 1 1 0 0 +EDGE2 5596 5575 -0.927183 -0.0268527 -1.54245 1 0 1 1 0 0 +EDGE2 5596 5537 1.08029 -0.0231945 -0.0130297 1 0 1 1 0 0 +EDGE2 5596 5556 -0.00599277 0.103052 0.0170835 1 0 1 1 0 0 +EDGE2 5596 5515 -1.00131 0.0465675 -1.57586 1 0 1 1 0 0 +EDGE2 5596 5535 -0.943473 0.0589622 -1.60729 1 0 1 1 0 0 +EDGE2 5596 5516 -0.0396238 0.0989814 -0.0417906 1 0 1 1 0 0 +EDGE2 5596 5536 0.0650009 0.0361563 0.00683937 1 0 1 1 0 0 +EDGE2 5596 5557 0.996758 -0.0157819 -0.0162782 1 0 1 1 0 0 +EDGE2 5596 5517 1.01426 -0.0091941 -0.000438761 1 0 1 1 0 0 +EDGE2 5597 5537 -0.0435525 0.025815 0.00556619 1 0 1 1 0 0 +EDGE2 5597 5556 -0.92961 0.0636237 -0.0113726 1 0 1 1 0 0 +EDGE2 5597 5596 -0.964185 -0.0416004 -0.0471068 1 0 1 1 0 0 +EDGE2 5597 5516 -0.995122 -0.00185537 0.0306985 1 0 1 1 0 0 +EDGE2 5597 5536 -1.01347 -0.0797316 0.00746162 1 0 1 1 0 0 +EDGE2 5597 5557 0.0319042 0.0718649 -0.00453628 1 0 1 1 0 0 +EDGE2 5597 5518 1.02889 0.0372525 0.0020281 1 0 1 1 0 0 +EDGE2 5597 5558 1.08619 0.00616897 -0.0172189 1 0 1 1 0 0 +EDGE2 5597 5517 -0.0748543 -0.00107413 0.0136639 1 0 1 1 0 0 +EDGE2 5597 5538 0.976026 0.032922 0.0163332 1 0 1 1 0 0 +EDGE2 5598 5537 -0.942518 -0.0435492 -0.0199579 1 0 1 1 0 0 +EDGE2 5598 5597 -1.07579 0.00417986 -0.00301694 1 0 1 1 0 0 +EDGE2 5598 5557 -1.07177 -0.00453194 0.0305031 1 0 1 1 0 0 +EDGE2 5598 5518 0.0200126 0.0381209 0.0160992 1 0 1 1 0 0 +EDGE2 5598 5558 0.0326501 0.0089792 -0.0048338 1 0 1 1 0 0 +EDGE2 5598 5517 -1.00824 -0.0110369 -0.0122687 1 0 1 1 0 0 +EDGE2 5598 5538 0.0112907 0.048907 0.0144166 1 0 1 1 0 0 +EDGE2 5598 5539 1.0724 -0.0199218 -0.010383 1 0 1 1 0 0 +EDGE2 5598 5559 1.01368 0.126668 -0.00789776 1 0 1 1 0 0 +EDGE2 5598 5519 0.974105 0.0839043 0.0345429 1 0 1 1 0 0 +EDGE2 5599 4380 1.06805 -0.0606801 -3.15888 1 0 1 1 0 0 +EDGE2 5599 5518 -0.889554 -0.00386436 0.0336562 1 0 1 1 0 0 +EDGE2 5599 5558 -1.01046 -0.0117044 0.000937563 1 0 1 1 0 0 +EDGE2 5599 5598 -0.996515 -0.0324813 0.0240499 1 0 1 1 0 0 +EDGE2 5599 5538 -0.99792 0.016542 -0.00316568 1 0 1 1 0 0 +EDGE2 5599 5539 -0.00409956 -0.00113606 -0.0370892 1 0 1 1 0 0 +EDGE2 5599 5559 0.02059 0.00992376 -0.0205031 1 0 1 1 0 0 +EDGE2 5599 5519 0.0622038 0.0250667 -0.00597935 1 0 1 1 0 0 +EDGE2 5599 5540 0.970279 0.0202847 -0.0227668 1 0 1 1 0 0 +EDGE2 5599 5560 1.02057 -0.0321616 -0.00686849 1 0 1 1 0 0 +EDGE2 5599 4420 0.994303 0.0175753 -3.13631 1 0 1 1 0 0 +EDGE2 5599 5520 1.01318 -0.137403 -0.00242878 1 0 1 1 0 0 +EDGE2 5599 4400 1.04511 -0.0202167 -3.09678 1 0 1 1 0 0 +EDGE2 5600 5521 -0.0404785 0.916537 1.56322 1 0 1 1 0 0 +EDGE2 5600 5561 0.0042417 0.943423 1.5736 1 0 1 1 0 0 +EDGE2 5600 4381 -0.104934 1.05715 1.59344 1 0 1 1 0 0 +EDGE2 5600 4380 0.0909086 -0.04174 -3.15862 1 0 1 1 0 0 +EDGE2 5600 5539 -1.05124 0.0386832 -0.0130767 1 0 1 1 0 0 +EDGE2 5600 5559 -1.14279 -0.0495072 0.0269641 1 0 1 1 0 0 +EDGE2 5600 5599 -0.977417 -0.00244915 0.0177674 1 0 1 1 0 0 +EDGE2 5600 5519 -0.988793 -0.00510951 0.0119245 1 0 1 1 0 0 +EDGE2 5600 5540 0.13267 -0.0579694 0.00534098 1 0 1 1 0 0 +EDGE2 5600 5560 -0.0622188 0.0148532 -0.00322047 1 0 1 1 0 0 +EDGE2 5600 4420 -0.0648949 -0.069936 -3.14993 1 0 1 1 0 0 +EDGE2 5600 5520 0.0163328 0.0357637 0.000915581 1 0 1 1 0 0 +EDGE2 5600 4400 -0.0211434 0.08036 -3.16541 1 0 1 1 0 0 +EDGE2 5600 4401 -0.0108134 -1.04543 -1.57071 1 0 1 1 0 0 +EDGE2 5600 4421 0.0462378 -1.01364 -1.56106 1 0 1 1 0 0 +EDGE2 5600 5541 0.0489351 -0.933808 -1.54213 1 0 1 1 0 0 +EDGE2 5600 4399 0.942996 -0.00222779 -3.13528 1 0 1 1 0 0 +EDGE2 5600 4419 1.03316 -0.00793998 -3.15701 1 0 1 1 0 0 +EDGE2 5600 4379 0.991554 0.0559245 -3.12187 1 0 1 1 0 0 +EDGE2 5601 4382 1.04527 0.00873037 0.00609214 1 0 1 1 0 0 +EDGE2 5601 5562 0.986726 0.0211329 -0.0118625 1 0 1 1 0 0 +EDGE2 5601 5522 0.917104 0.0590061 -0.0100236 1 0 1 1 0 0 +EDGE2 5601 5521 0.0208175 -0.00373351 -0.0147144 1 0 1 1 0 0 +EDGE2 5601 5561 -0.0568311 -0.0583017 -0.0265922 1 0 1 1 0 0 +EDGE2 5601 4381 0.0526322 0.00860136 -0.0266192 1 0 1 1 0 0 +EDGE2 5601 4380 -1.00278 -0.0505633 1.54967 1 0 1 1 0 0 +EDGE2 5601 5600 -0.991773 -0.0373291 -1.5769 1 0 1 1 0 0 +EDGE2 5601 5540 -1.09131 -0.0373753 -1.57048 1 0 1 1 0 0 +EDGE2 5601 5560 -1.04928 -0.038083 -1.54812 1 0 1 1 0 0 +EDGE2 5601 4420 -0.998643 0.110722 1.56794 1 0 1 1 0 0 +EDGE2 5601 5520 -0.967954 0.00120084 -1.56617 1 0 1 1 0 0 +EDGE2 5601 4400 -0.888716 -0.0957043 1.59353 1 0 1 1 0 0 +EDGE2 5602 4382 0.00725949 0.000142828 -0.0197283 1 0 1 1 0 0 +EDGE2 5602 5523 1.06389 -0.0267965 0.000111108 1 0 1 1 0 0 +EDGE2 5602 5563 0.982397 0.0298413 0.0207216 1 0 1 1 0 0 +EDGE2 5602 5562 -0.00587318 0.0469553 0.0246288 1 0 1 1 0 0 +EDGE2 5602 4383 0.956787 0.0334357 0.00910158 1 0 1 1 0 0 +EDGE2 5602 5522 0.0366835 0.0307879 0.0196428 1 0 1 1 0 0 +EDGE2 5602 5521 -1.02592 0.0129547 0.0134532 1 0 1 1 0 0 +EDGE2 5602 5561 -0.994545 0.0219626 -0.0173924 1 0 1 1 0 0 +EDGE2 5602 5601 -0.992233 -0.0327072 0.0158181 1 0 1 1 0 0 +EDGE2 5602 4381 -1.10529 0.0524237 0.0109999 1 0 1 1 0 0 +EDGE2 5603 4382 -0.97668 0.0162604 -0.0165784 1 0 1 1 0 0 +EDGE2 5603 5564 1.05727 -0.000890277 0.00895334 1 0 1 1 0 0 +EDGE2 5603 5523 -0.0142174 -0.082073 0.0158504 1 0 1 1 0 0 +EDGE2 5603 4384 1.03798 0.00684833 -0.00503895 1 0 1 1 0 0 +EDGE2 5603 5524 1.03328 0.034365 0.0141284 1 0 1 1 0 0 +EDGE2 5603 5563 -0.0673488 0.0616755 -0.0168075 1 0 1 1 0 0 +EDGE2 5603 5562 -0.934867 0.0270749 0.0102439 1 0 1 1 0 0 +EDGE2 5603 5602 -0.985274 0.0970829 -0.0125773 1 0 1 1 0 0 +EDGE2 5603 4383 -0.0229238 -0.0258253 -0.0155262 1 0 1 1 0 0 +EDGE2 5603 5522 -1.00281 0.0899237 0.0123423 1 0 1 1 0 0 +EDGE2 5604 5564 -0.0105325 -0.0228433 -0.00157612 1 0 1 1 0 0 +EDGE2 5604 4385 0.976052 -0.0549723 -0.0263226 1 0 1 1 0 0 +EDGE2 5604 5525 1.01164 0.0113681 0.00982913 1 0 1 1 0 0 +EDGE2 5604 5565 1.05808 0.015057 0.000565102 1 0 1 1 0 0 +EDGE2 5604 5523 -0.908039 -0.0244109 0.0388178 1 0 1 1 0 0 +EDGE2 5604 5603 -1.04684 -0.0358471 0.00506447 1 0 1 1 0 0 +EDGE2 5604 4384 -0.0279886 -0.0039272 -0.00861361 1 0 1 1 0 0 +EDGE2 5604 5524 -0.00349828 -0.0500637 -0.0232061 1 0 1 1 0 0 +EDGE2 5604 5563 -1.011 -0.0348057 2.42304e-05 1 0 1 1 0 0 +EDGE2 5604 4383 -0.909095 -0.00934191 -0.00591546 1 0 1 1 0 0 +EDGE2 5605 5566 -0.00905839 0.915073 1.56243 1 0 1 1 0 0 +EDGE2 5605 5526 0.0595762 0.929722 1.59658 1 0 1 1 0 0 +EDGE2 5605 5564 -0.977114 0.00202821 -0.00752472 1 0 1 1 0 0 +EDGE2 5605 4385 0.00163055 -0.00902092 -0.0135088 1 0 1 1 0 0 +EDGE2 5605 5525 -0.029181 0.0192995 0.0173772 1 0 1 1 0 0 +EDGE2 5605 5565 -0.0427092 0.0640282 0.0303009 1 0 1 1 0 0 +EDGE2 5605 5604 -1.04646 0.0287117 -0.0239757 1 0 1 1 0 0 +EDGE2 5605 4384 -0.958212 0.0500173 0.0275902 1 0 1 1 0 0 +EDGE2 5605 5524 -0.997334 0.00480571 -0.00642989 1 0 1 1 0 0 +EDGE2 5605 4386 0.0847198 -0.983478 -1.58475 1 0 1 1 0 0 +EDGE2 5606 5527 0.992589 0.00194138 -0.012107 1 0 1 1 0 0 +EDGE2 5606 5567 1.11789 0.0979831 0.0171618 1 0 1 1 0 0 +EDGE2 5606 5566 -0.0109637 -0.00512971 -0.000457066 1 0 1 1 0 0 +EDGE2 5606 5526 0.0273169 0.0397596 0.0229125 1 0 1 1 0 0 +EDGE2 5606 5605 -0.986904 0.0117374 -1.55272 1 0 1 1 0 0 +EDGE2 5606 4385 -1.06053 -0.0154101 -1.58709 1 0 1 1 0 0 +EDGE2 5606 5525 -1.05165 -0.0484347 -1.58061 1 0 1 1 0 0 +EDGE2 5606 5565 -1.1223 -0.0780676 -1.57283 1 0 1 1 0 0 +EDGE2 5607 5527 0.0735762 0.00265275 8.97801e-05 1 0 1 1 0 0 +EDGE2 5607 5528 0.974414 0.00362935 -0.00585268 1 0 1 1 0 0 +EDGE2 5607 5568 1.00429 0.0286094 -0.0336157 1 0 1 1 0 0 +EDGE2 5607 5567 0.0491434 -0.0292405 -0.0239102 1 0 1 1 0 0 +EDGE2 5607 5566 -0.993641 0.0301248 0.0357276 1 0 1 1 0 0 +EDGE2 5607 5606 -0.967594 0.0429976 0.0293094 1 0 1 1 0 0 +EDGE2 5607 5526 -0.977476 0.0522765 -0.0160491 1 0 1 1 0 0 +EDGE2 5608 5529 1.00253 -0.00799848 0.0291718 1 0 1 1 0 0 +EDGE2 5608 5569 1.00708 0.00635183 0.0203268 1 0 1 1 0 0 +EDGE2 5608 5527 -1.05967 -0.0226007 -0.0262406 1 0 1 1 0 0 +EDGE2 5608 5607 -1.0254 0.0512847 -0.0125727 1 0 1 1 0 0 +EDGE2 5608 5528 -0.00760775 0.0486096 -0.00586206 1 0 1 1 0 0 +EDGE2 5608 5568 -0.0597623 -0.0114014 0.00984918 1 0 1 1 0 0 +EDGE2 5608 5567 -1.0145 0.036039 0.0137854 1 0 1 1 0 0 +EDGE2 5609 5510 0.98361 0.0213576 -3.1221 1 0 1 1 0 0 +EDGE2 5609 5530 1.01996 -0.0723639 -0.0329801 1 0 1 1 0 0 +EDGE2 5609 5570 1.06868 0.00635492 0.0115249 1 0 1 1 0 0 +EDGE2 5609 5529 -0.0361102 0.0395276 -0.00735461 1 0 1 1 0 0 +EDGE2 5609 5569 -0.030653 0.0703652 0.0323817 1 0 1 1 0 0 +EDGE2 5609 5608 -1.04827 -0.0162169 0.00286254 1 0 1 1 0 0 +EDGE2 5609 5528 -0.969021 0.0606315 0.00360803 1 0 1 1 0 0 +EDGE2 5609 5568 -0.830523 -0.040771 0.00739105 1 0 1 1 0 0 +EDGE2 5610 5509 0.99615 0.0231017 -3.13541 1 0 1 1 0 0 +EDGE2 5610 5571 0.0454572 0.944859 1.56646 1 0 1 1 0 0 +EDGE2 5610 5510 -0.0104879 -0.0568735 -3.1407 1 0 1 1 0 0 +EDGE2 5610 5530 -0.0168183 0.077355 -0.0384304 1 0 1 1 0 0 +EDGE2 5610 5570 -0.0186786 -0.0539411 0.00245715 1 0 1 1 0 0 +EDGE2 5610 5511 -0.032444 1.0057 1.57302 1 0 1 1 0 0 +EDGE2 5610 5531 -0.040271 0.969277 1.54904 1 0 1 1 0 0 +EDGE2 5610 5529 -1.12941 -0.02466 -0.00485234 1 0 1 1 0 0 +EDGE2 5610 5569 -0.940078 -0.0738214 -0.0174067 1 0 1 1 0 0 +EDGE2 5610 5609 -0.996661 0.0239587 -0.00250387 1 0 1 1 0 0 +EDGE2 5611 5572 0.932885 0.041001 -0.0202211 1 0 1 1 0 0 +EDGE2 5611 5610 -1.02142 0.0783942 -1.55812 1 0 1 1 0 0 +EDGE2 5611 5571 -0.076769 -0.057197 -0.00378771 1 0 1 1 0 0 +EDGE2 5611 5510 -0.973703 -0.0402975 1.562 1 0 1 1 0 0 +EDGE2 5611 5530 -1.0387 0.0598485 -1.56733 1 0 1 1 0 0 +EDGE2 5611 5570 -1.06719 0.0582458 -1.56157 1 0 1 1 0 0 +EDGE2 5611 5511 0.0835993 -0.0139979 -0.0137372 1 0 1 1 0 0 +EDGE2 5611 5531 0.0573051 0.0836814 -0.0202787 1 0 1 1 0 0 +EDGE2 5611 5512 1.02783 0.0555113 0.00656924 1 0 1 1 0 0 +EDGE2 5611 5532 1.03128 -0.0840132 0.00219407 1 0 1 1 0 0 +EDGE2 5612 5572 0.0791622 0.030322 0.017884 1 0 1 1 0 0 +EDGE2 5612 5571 -1.08082 0.00339636 0.0207094 1 0 1 1 0 0 +EDGE2 5612 5611 -1.00732 0.0188058 0.017987 1 0 1 1 0 0 +EDGE2 5612 5511 -1.07138 0.0517393 -0.0516738 1 0 1 1 0 0 +EDGE2 5612 5531 -1.04453 0.0441766 -0.00634514 1 0 1 1 0 0 +EDGE2 5612 5573 1.04698 0.0167095 0.00391987 1 0 1 1 0 0 +EDGE2 5612 5512 0.13363 0.015908 0.0310549 1 0 1 1 0 0 +EDGE2 5612 5532 0.0326143 -0.0607745 0.0256599 1 0 1 1 0 0 +EDGE2 5612 5513 0.93821 -0.0391077 0.00273096 1 0 1 1 0 0 +EDGE2 5612 5533 1.03414 -0.0331557 0.0119983 1 0 1 1 0 0 +EDGE2 5613 5572 -0.996264 -0.0915821 -0.00866295 1 0 1 1 0 0 +EDGE2 5613 5612 -0.979345 -0.0321636 -0.0188243 1 0 1 1 0 0 +EDGE2 5613 5573 0.0674062 -0.0437982 0.00471038 1 0 1 1 0 0 +EDGE2 5613 5512 -1.01395 0.00358254 0.0099569 1 0 1 1 0 0 +EDGE2 5613 5532 -0.889272 -0.0914032 -0.00473021 1 0 1 1 0 0 +EDGE2 5613 5534 0.969568 -0.00875319 -0.0163267 1 0 1 1 0 0 +EDGE2 5613 5513 0.0386166 0.0179266 0.0444997 1 0 1 1 0 0 +EDGE2 5613 5533 -0.0112293 -0.0692562 0.0112944 1 0 1 1 0 0 +EDGE2 5613 5574 1.05447 0.00894296 -0.00537656 1 0 1 1 0 0 +EDGE2 5613 5514 0.958845 -0.0194297 0.00183112 1 0 1 1 0 0 +EDGE2 5614 5555 1.01691 0.00357357 -3.14478 1 0 1 1 0 0 +EDGE2 5614 5573 -0.949591 -0.00772748 0.0128108 1 0 1 1 0 0 +EDGE2 5614 5613 -1.01685 0.00121947 -0.0124156 1 0 1 1 0 0 +EDGE2 5614 5534 -0.0542874 0.0379432 -0.0331927 1 0 1 1 0 0 +EDGE2 5614 5513 -0.971066 -0.00320739 -0.0160781 1 0 1 1 0 0 +EDGE2 5614 5533 -1.0258 0.000510299 0.00570684 1 0 1 1 0 0 +EDGE2 5614 5574 -0.0909497 0.0010197 -0.021396 1 0 1 1 0 0 +EDGE2 5614 5595 1.07862 -0.143482 -3.15704 1 0 1 1 0 0 +EDGE2 5614 5514 -0.0843995 0.000610538 -0.00577836 1 0 1 1 0 0 +EDGE2 5614 5575 0.919668 -0.0498548 -0.00726621 1 0 1 1 0 0 +EDGE2 5614 5515 1.03103 -0.0487181 0.00454813 1 0 1 1 0 0 +EDGE2 5614 5535 1.02899 0.0769266 0.000173387 1 0 1 1 0 0 +EDGE2 5615 5576 -0.0505091 -0.990846 -1.56703 1 0 1 1 0 0 +EDGE2 5615 5555 -0.0358362 0.0633351 -3.17402 1 0 1 1 0 0 +EDGE2 5615 5534 -1.03389 0.0568676 0.0041238 1 0 1 1 0 0 +EDGE2 5615 5614 -0.919408 -0.0371425 0.0199189 1 0 1 1 0 0 +EDGE2 5615 5574 -1.05417 0.0635488 0.0153252 1 0 1 1 0 0 +EDGE2 5615 5595 -0.0676885 0.0337168 -3.13417 1 0 1 1 0 0 +EDGE2 5615 5514 -0.957789 0.0276902 -0.00270574 1 0 1 1 0 0 +EDGE2 5615 5575 -0.0264394 -0.0415322 0.00558627 1 0 1 1 0 0 +EDGE2 5615 5554 0.95349 0.0492804 -3.1701 1 0 1 1 0 0 +EDGE2 5615 5556 0.00465809 0.939362 1.60271 1 0 1 1 0 0 +EDGE2 5615 5594 0.973835 -0.0225918 -3.11109 1 0 1 1 0 0 +EDGE2 5615 5515 0.0384346 -0.102694 0.0210579 1 0 1 1 0 0 +EDGE2 5615 5535 0.0451052 0.0335509 -0.00254127 1 0 1 1 0 0 +EDGE2 5615 5596 0.0560782 1.02723 1.57397 1 0 1 1 0 0 +EDGE2 5615 5516 -0.0447444 0.893645 1.57376 1 0 1 1 0 0 +EDGE2 5615 5536 0.0151744 0.984928 1.56046 1 0 1 1 0 0 +EDGE2 5616 5577 1.04788 -0.00509842 0.00890747 1 0 1 1 0 0 +EDGE2 5616 5576 0.0352699 -0.00170315 0.00391585 1 0 1 1 0 0 +EDGE2 5616 5555 -1.0049 -0.0307287 -1.5684 1 0 1 1 0 0 +EDGE2 5616 5595 -1.02089 0.0325963 -1.58328 1 0 1 1 0 0 +EDGE2 5616 5615 -1.01814 -0.0278347 1.5664 1 0 1 1 0 0 +EDGE2 5616 5575 -0.941096 -0.0171808 1.55052 1 0 1 1 0 0 +EDGE2 5616 5515 -0.910974 -0.0285127 1.58384 1 0 1 1 0 0 +EDGE2 5616 5535 -1.08115 0.0194256 1.59583 1 0 1 1 0 0 +EDGE2 5617 5578 0.962825 0.0395574 -0.0191002 1 0 1 1 0 0 +EDGE2 5617 5616 -1.03834 0.0292256 0.00967056 1 0 1 1 0 0 +EDGE2 5617 5577 -0.0151367 0.0474806 -0.0505582 1 0 1 1 0 0 +EDGE2 5617 5576 -1.06529 -0.0222785 0.0165467 1 0 1 1 0 0 +EDGE2 5618 5578 -0.0219413 -0.0466319 -0.0101329 1 0 1 1 0 0 +EDGE2 5618 5579 1.07572 0.0091286 -0.0549353 1 0 1 1 0 0 +EDGE2 5618 5577 -1.01899 -0.0186729 0.018618 1 0 1 1 0 0 +EDGE2 5618 5617 -1.00835 0.024383 -0.00270105 1 0 1 1 0 0 +EDGE2 5619 5580 1.09437 -0.05553 -0.0211936 1 0 1 1 0 0 +EDGE2 5619 5578 -1.1002 0.0222559 -0.013955 1 0 1 1 0 0 +EDGE2 5619 5579 -0.067671 0.0413271 -0.000921614 1 0 1 1 0 0 +EDGE2 5619 5618 -0.950901 -0.0485677 -0.0345646 1 0 1 1 0 0 +EDGE2 5620 5580 -0.0365335 0.0717117 0.0148015 1 0 1 1 0 0 +EDGE2 5620 5581 0.00631918 0.983116 1.54991 1 0 1 1 0 0 +EDGE2 5620 5579 -1.00692 -0.0150573 0.0344077 1 0 1 1 0 0 +EDGE2 5620 5619 -1.0984 -0.0342682 0.0136681 1 0 1 1 0 0 +EDGE2 5621 5582 0.960638 -0.0284802 0.0283163 1 0 1 1 0 0 +EDGE2 5621 5580 -1.0247 0.0702764 -1.58192 1 0 1 1 0 0 +EDGE2 5621 5620 -1.01497 -0.0408294 -1.60336 1 0 1 1 0 0 +EDGE2 5621 5581 0.0741634 0.0412287 0.0141852 1 0 1 1 0 0 +EDGE2 5622 5582 -0.103997 -0.0462698 0.0417247 1 0 1 1 0 0 +EDGE2 5622 5621 -1.0128 -0.000410288 -0.0281175 1 0 1 1 0 0 +EDGE2 5622 5581 -0.98125 -0.0744587 0.000972331 1 0 1 1 0 0 +EDGE2 5622 5583 1.05746 0.0136186 0.00910964 1 0 1 1 0 0 +EDGE2 5623 5582 -0.958395 0.0916947 0.0219981 1 0 1 1 0 0 +EDGE2 5623 5622 -1.0236 0.0460708 -0.0140499 1 0 1 1 0 0 +EDGE2 5623 5583 -0.0904353 -0.00538127 0.00575772 1 0 1 1 0 0 +EDGE2 5623 5584 1.04762 -0.00316311 -0.0389313 1 0 1 1 0 0 +EDGE2 5624 5583 -0.962967 0.0152995 0.0320734 1 0 1 1 0 0 +EDGE2 5624 5623 -1.01279 -0.0335861 -0.0210842 1 0 1 1 0 0 +EDGE2 5624 5584 0.046304 0.0596624 -0.000333662 1 0 1 1 0 0 +EDGE2 5624 5585 0.924321 0.0148721 0.00542607 1 0 1 1 0 0 +EDGE2 5625 5586 0.020351 1.03473 1.5235 1 0 1 1 0 0 +EDGE2 5625 5584 -0.840571 -0.0817899 -0.0156872 1 0 1 1 0 0 +EDGE2 5625 5624 -1.01732 -0.025478 0.00981997 1 0 1 1 0 0 +EDGE2 5625 5585 0.0179538 0.0366523 0.00978411 1 0 1 1 0 0 +EDGE2 5626 5625 -0.939864 0.0639613 1.54685 1 0 1 1 0 0 +EDGE2 5626 5585 -0.939198 -0.0418261 1.57597 1 0 1 1 0 0 +EDGE2 5627 5626 -0.934942 -0.0550453 -0.0124083 1 0 1 1 0 0 +EDGE2 5628 5627 -1.01378 0.0991454 -0.00522852 1 0 1 1 0 0 +EDGE2 5629 5628 -0.965434 -0.0691538 -0.0173571 1 0 1 1 0 0 +EDGE2 5630 5629 -1.06919 0.0731312 0.00215542 1 0 1 1 0 0 +EDGE2 5631 5630 -1.00665 0.0215994 1.58349 1 0 1 1 0 0 +EDGE2 5632 5631 -0.979256 0.096283 -0.00796855 1 0 1 1 0 0 +EDGE2 5633 5632 -0.906495 -0.0401249 -0.0395671 1 0 1 1 0 0 +EDGE2 5634 5633 -1.10103 -0.0405885 -0.00886672 1 0 1 1 0 0 +EDGE2 5635 5634 -0.962956 0.0391064 0.0309699 1 0 1 1 0 0 +EDGE2 5636 5635 -1.00049 0.0726056 -1.59502 1 0 1 1 0 0 +EDGE2 5637 5636 -0.99036 -0.0727395 -0.0172959 1 0 1 1 0 0 +EDGE2 5638 5637 -1.0535 -0.0830581 0.0562286 1 0 1 1 0 0 +EDGE2 5639 5638 -0.978138 -0.0257023 -0.0520478 1 0 1 1 0 0 +EDGE2 5640 5639 -1.0335 -0.056329 -0.0270653 1 0 1 1 0 0 +EDGE2 5641 5640 -1.00387 0.0412721 1.58741 1 0 1 1 0 0 +EDGE2 5642 5641 -1.09773 -0.0115244 0.000182772 1 0 1 1 0 0 +EDGE2 5643 5642 -1.10092 0.0493938 0.0274005 1 0 1 1 0 0 +EDGE2 5644 5643 -0.963893 0.0388961 -0.00524579 1 0 1 1 0 0 +EDGE2 5645 5644 -0.946325 -0.0370551 0.000736454 1 0 1 1 0 0 +EDGE2 5646 5645 -0.965355 -0.00485282 1.5414 1 0 1 1 0 0 +EDGE2 5647 5646 -0.978013 0.0679479 0.0148377 1 0 1 1 0 0 +EDGE2 5648 5647 -1.00283 -0.007543 0.0025815 1 0 1 1 0 0 +EDGE2 5649 5648 -0.965652 -0.0175083 -0.0155776 1 0 1 1 0 0 +EDGE2 5650 5649 -0.9792 -0.0649283 -0.0254969 1 0 1 1 0 0 +EDGE2 5651 5650 -0.938906 0.0043209 -1.56337 1 0 1 1 0 0 +EDGE2 5652 5651 -0.952323 -0.0161103 -0.0076914 1 0 1 1 0 0 +EDGE2 5653 5652 -0.985153 -0.0393644 0.00551452 1 0 1 1 0 0 +EDGE2 5654 5653 -0.995504 0.0188228 0.0375876 1 0 1 1 0 0 +EDGE2 5655 5654 -0.924569 -0.0505017 0.013666 1 0 1 1 0 0 +EDGE2 5656 5655 -0.95401 0.084506 -1.56545 1 0 1 1 0 0 +EDGE2 5657 5656 -1.03211 0.0180179 0.0223369 1 0 1 1 0 0 +EDGE2 5658 5657 -1.04694 -0.0338072 -0.0147197 1 0 1 1 0 0 +EDGE2 5659 1100 1.02052 0.0934587 -3.13384 1 0 1 1 0 0 +EDGE2 5659 1140 0.910377 -0.0750065 -3.11423 1 0 1 1 0 0 +EDGE2 5659 3040 0.94088 -0.0302489 -3.15278 1 0 1 1 0 0 +EDGE2 5659 1120 0.929562 -0.0172944 -3.17751 1 0 1 1 0 0 +EDGE2 5659 5658 -0.999279 -0.0292932 0.00542126 1 0 1 1 0 0 +EDGE2 5660 1139 1.03338 -0.055463 -3.15084 1 0 1 1 0 0 +EDGE2 5660 3039 0.990017 -0.106423 -3.18028 1 0 1 1 0 0 +EDGE2 5660 1099 1.02656 -0.0106014 -3.13307 1 0 1 1 0 0 +EDGE2 5660 1119 1.04672 -0.00879352 -3.1478 1 0 1 1 0 0 +EDGE2 5660 1121 -0.00574256 -0.977798 -1.60649 1 0 1 1 0 0 +EDGE2 5660 3041 -0.0184464 -0.997171 -1.57309 1 0 1 1 0 0 +EDGE2 5660 1141 -0.0789482 -1.06019 -1.56511 1 0 1 1 0 0 +EDGE2 5660 1101 0.0793378 -1.00679 -1.60997 1 0 1 1 0 0 +EDGE2 5660 1100 -0.0182325 0.037923 -3.16022 1 0 1 1 0 0 +EDGE2 5660 1140 -0.0157685 -0.0447879 -3.13358 1 0 1 1 0 0 +EDGE2 5660 3040 -0.00246034 0.0218549 -3.16327 1 0 1 1 0 0 +EDGE2 5660 1120 -0.0264822 0.00927333 -3.12315 1 0 1 1 0 0 +EDGE2 5660 5659 -0.957206 0.0689828 0.00889597 1 0 1 1 0 0 +EDGE2 5661 1100 -1.02841 0.0538664 1.56055 1 0 1 1 0 0 +EDGE2 5661 1140 -1.04218 -0.0868703 1.5911 1 0 1 1 0 0 +EDGE2 5661 3040 -0.95122 0.0184177 1.56803 1 0 1 1 0 0 +EDGE2 5661 5660 -1.00934 0.0398368 -1.57457 1 0 1 1 0 0 +EDGE2 5661 1120 -0.96255 -0.00739571 1.57737 1 0 1 1 0 0 +EDGE2 5662 5661 -0.926086 -0.0180088 0.00125543 1 0 1 1 0 0 +EDGE2 5663 5662 -1.03765 0.0227414 -0.0356762 1 0 1 1 0 0 +EDGE2 5664 5645 1.04943 -0.0504127 -3.13197 1 0 1 1 0 0 +EDGE2 5664 5663 -1.08161 0.0114507 0.00470599 1 0 1 1 0 0 +EDGE2 5665 5645 0.0414791 -0.0437517 -3.1416 1 0 1 1 0 0 +EDGE2 5665 5664 -1.00717 -0.106893 0.011218 1 0 1 1 0 0 +EDGE2 5665 5644 1.10758 0.0610699 -3.16273 1 0 1 1 0 0 +EDGE2 5665 5646 -0.061676 0.944001 1.53683 1 0 1 1 0 0 +EDGE2 5666 5645 -1.0019 0.0465332 1.55131 1 0 1 1 0 0 +EDGE2 5666 5665 -1.07731 0.0204568 -1.55478 1 0 1 1 0 0 +EDGE2 5666 5646 0.0242277 0.0880767 -0.00549725 1 0 1 1 0 0 +EDGE2 5666 5647 1.03995 0.073924 -0.0213044 1 0 1 1 0 0 +EDGE2 5667 5646 -0.932418 -0.0165992 -0.0289922 1 0 1 1 0 0 +EDGE2 5667 5666 -0.99427 -0.0233291 0.00358121 1 0 1 1 0 0 +EDGE2 5667 5647 0.0184244 -0.00602332 0.000192032 1 0 1 1 0 0 +EDGE2 5667 5648 0.991057 -0.00283271 0.0107889 1 0 1 1 0 0 +EDGE2 5668 5647 -0.97004 0.0289863 0.0106846 1 0 1 1 0 0 +EDGE2 5668 5667 -0.996569 0.0352936 -0.0173695 1 0 1 1 0 0 +EDGE2 5668 5649 0.959928 -0.000861558 0.0217405 1 0 1 1 0 0 +EDGE2 5668 5648 0.00751665 -0.0162084 -0.00541374 1 0 1 1 0 0 +EDGE2 5669 5668 -1.02764 -0.093897 -0.0111502 1 0 1 1 0 0 +EDGE2 5669 5649 0.0425707 -0.00441475 -0.0173384 1 0 1 1 0 0 +EDGE2 5669 5648 -1.03847 0.0233372 -0.0111442 1 0 1 1 0 0 +EDGE2 5669 5650 0.928892 0.0931789 0.0308664 1 0 1 1 0 0 +EDGE2 5670 5649 -0.929263 0.0559609 -0.0303804 1 0 1 1 0 0 +EDGE2 5670 5669 -0.947899 -0.0165106 0.0025922 1 0 1 1 0 0 +EDGE2 5670 5651 -0.00532147 0.965314 1.57133 1 0 1 1 0 0 +EDGE2 5670 5650 -0.0224916 -0.00953788 0.0296001 1 0 1 1 0 0 +EDGE2 5671 5670 -0.917319 0.082375 1.5726 1 0 1 1 0 0 +EDGE2 5671 5650 -1.00884 -0.0247648 1.57177 1 0 1 1 0 0 +EDGE2 5672 5671 -0.972108 -0.00666474 -0.00492308 1 0 1 1 0 0 +EDGE2 5673 5672 -0.991941 0.0335271 -0.00105975 1 0 1 1 0 0 +EDGE2 5674 5673 -1.03 -0.000817824 -0.00598553 1 0 1 1 0 0 +EDGE2 5674 5635 1.05028 -0.00483813 -3.1524 1 0 1 1 0 0 +EDGE2 5675 5674 -0.989081 -0.0518148 -0.00289784 1 0 1 1 0 0 +EDGE2 5675 5636 -0.00535109 -1.00637 -1.58001 1 0 1 1 0 0 +EDGE2 5675 5635 0.00250519 -0.0829159 -3.11011 1 0 1 1 0 0 +EDGE2 5675 5634 1.08268 -0.0611927 -3.15052 1 0 1 1 0 0 +EDGE2 5676 5637 1.01605 0.0413248 -0.00432648 1 0 1 1 0 0 +EDGE2 5676 5636 0.0127824 0.024491 -0.0169869 1 0 1 1 0 0 +EDGE2 5676 5675 -0.951133 0.0709974 1.58738 1 0 1 1 0 0 +EDGE2 5676 5635 -0.974775 0.0773128 -1.5627 1 0 1 1 0 0 +EDGE2 5677 5637 -0.0265016 -0.0541173 0.0038782 1 0 1 1 0 0 +EDGE2 5677 5638 0.988582 0.00461571 0.00971921 1 0 1 1 0 0 +EDGE2 5677 5676 -0.995163 -0.0874755 0.0211902 1 0 1 1 0 0 +EDGE2 5677 5636 -1.01027 -0.0355479 -0.00489178 1 0 1 1 0 0 +EDGE2 5678 5639 0.966471 -0.0903209 0.0276319 1 0 1 1 0 0 +EDGE2 5678 5637 -0.901824 0.0603928 -0.00546298 1 0 1 1 0 0 +EDGE2 5678 5638 0.083529 -0.0329222 0.00925087 1 0 1 1 0 0 +EDGE2 5678 5677 -1.05371 0.0483277 0.0119152 1 0 1 1 0 0 +EDGE2 5679 5640 1.12073 0.0263304 0.0143428 1 0 1 1 0 0 +EDGE2 5679 5639 -0.0561627 -0.0548797 -0.0140648 1 0 1 1 0 0 +EDGE2 5679 5678 -0.930656 -0.0239581 0.0216955 1 0 1 1 0 0 +EDGE2 5679 5638 -0.988968 0.0572449 0.00203356 1 0 1 1 0 0 +EDGE2 5680 5641 -0.00259735 -1.00992 -1.59553 1 0 1 1 0 0 +EDGE2 5680 5640 0.0167658 -0.0446966 -0.0146818 1 0 1 1 0 0 +EDGE2 5680 5679 -1.01366 -0.0428331 -0.0158763 1 0 1 1 0 0 +EDGE2 5680 5639 -0.949792 0.0771882 -0.0126833 1 0 1 1 0 0 +EDGE2 5681 5640 -0.979005 -0.0451625 -1.59437 1 0 1 1 0 0 +EDGE2 5681 5680 -1.08292 0.0142352 -1.57307 1 0 1 1 0 0 +EDGE2 5682 5681 -0.960474 -0.0102418 0.0253996 1 0 1 1 0 0 +EDGE2 5683 5682 -1.00974 -0.0443995 0.00945395 1 0 1 1 0 0 +EDGE2 5684 5683 -1.03082 -0.0131635 0.0292445 1 0 1 1 0 0 +EDGE2 5685 5684 -1.00235 0.0550934 0.0149314 1 0 1 1 0 0 +EDGE2 5686 5685 -1.03056 -0.0324873 -1.57131 1 0 1 1 0 0 +EDGE2 5687 5686 -0.9798 -0.0246418 0.00670152 1 0 1 1 0 0 +EDGE2 5688 5687 -0.950505 0.0219769 -0.0298535 1 0 1 1 0 0 +EDGE2 5689 5688 -1.01238 0.100442 0.0241934 1 0 1 1 0 0 +EDGE2 5689 5630 1.03513 -0.103034 -3.10064 1 0 1 1 0 0 +EDGE2 5690 5689 -1.02323 0.0402727 0.0198596 1 0 1 1 0 0 +EDGE2 5690 5630 0.0174647 -0.0201397 -3.1231 1 0 1 1 0 0 +EDGE2 5690 5631 0.0136592 0.993154 1.55505 1 0 1 1 0 0 +EDGE2 5690 5629 1.04377 -0.0613469 -3.14987 1 0 1 1 0 0 +EDGE2 5691 5632 0.938851 0.0130832 -0.0067538 1 0 1 1 0 0 +EDGE2 5691 5630 -0.978969 0.130033 1.51811 1 0 1 1 0 0 +EDGE2 5691 5631 0.0294211 -0.0078625 0.0239059 1 0 1 1 0 0 +EDGE2 5691 5690 -0.976877 -0.074259 -1.56495 1 0 1 1 0 0 +EDGE2 5692 5691 -1.0239 0.00119135 0.0238833 1 0 1 1 0 0 +EDGE2 5692 5633 0.98679 0.0423495 -0.019839 1 0 1 1 0 0 +EDGE2 5692 5632 -0.0441904 -0.0276909 0.0196061 1 0 1 1 0 0 +EDGE2 5692 5631 -1.02085 0.0794609 0.00616079 1 0 1 1 0 0 +EDGE2 5693 5634 0.941885 -0.0646055 0.00559655 1 0 1 1 0 0 +EDGE2 5693 5692 -0.923491 -0.0576368 -0.00983112 1 0 1 1 0 0 +EDGE2 5693 5633 -0.0492668 0.0146008 0.0281911 1 0 1 1 0 0 +EDGE2 5693 5632 -1.05317 -0.073896 -0.0077146 1 0 1 1 0 0 +EDGE2 5694 5675 0.983793 -0.00960534 -3.16144 1 0 1 1 0 0 +EDGE2 5694 5635 0.906217 0.0522282 -0.00239934 1 0 1 1 0 0 +EDGE2 5694 5634 0.0196866 -0.0431814 0.0243227 1 0 1 1 0 0 +EDGE2 5694 5633 -0.972514 0.0390218 0.0187611 1 0 1 1 0 0 +EDGE2 5694 5693 -1.00411 -0.0081527 -0.0139874 1 0 1 1 0 0 +EDGE2 5695 5674 0.88929 0.0134077 -3.13178 1 0 1 1 0 0 +EDGE2 5695 5676 -0.0191912 1.00367 1.55765 1 0 1 1 0 0 +EDGE2 5695 5636 -0.0433462 1.05296 1.564 1 0 1 1 0 0 +EDGE2 5695 5675 -0.00886758 -0.03883 -3.14786 1 0 1 1 0 0 +EDGE2 5695 5635 -0.0591431 -0.00219517 0.0240503 1 0 1 1 0 0 +EDGE2 5695 5634 -1.00946 -0.0516264 0.00460906 1 0 1 1 0 0 +EDGE2 5695 5694 -1.02213 -0.0782521 0.0240025 1 0 1 1 0 0 +EDGE2 5696 5637 1.04063 0.0111445 0.0174901 1 0 1 1 0 0 +EDGE2 5696 5677 1.01624 0.00889355 -0.000615438 1 0 1 1 0 0 +EDGE2 5696 5676 0.019524 0.0249013 -0.00574941 1 0 1 1 0 0 +EDGE2 5696 5636 0.052503 0.114656 0.00699997 1 0 1 1 0 0 +EDGE2 5696 5675 -1.0356 -0.01871 1.5433 1 0 1 1 0 0 +EDGE2 5696 5695 -0.999194 -0.0325419 -1.53831 1 0 1 1 0 0 +EDGE2 5696 5635 -1.02015 0.00982982 -1.58869 1 0 1 1 0 0 +EDGE2 5697 5678 0.957558 -0.0979956 0.00568669 1 0 1 1 0 0 +EDGE2 5697 5637 -0.0682737 0.0450081 0.00897781 1 0 1 1 0 0 +EDGE2 5697 5638 0.976738 0.0196596 -0.00852443 1 0 1 1 0 0 +EDGE2 5697 5677 -0.0250412 0.00319227 -0.0281935 1 0 1 1 0 0 +EDGE2 5697 5676 -0.985232 -0.023886 -0.0184643 1 0 1 1 0 0 +EDGE2 5697 5696 -1.02447 -0.0712495 0.00598645 1 0 1 1 0 0 +EDGE2 5697 5636 -0.97366 0.0796619 0.010677 1 0 1 1 0 0 +EDGE2 5698 5679 0.984255 -0.0492206 0.000797466 1 0 1 1 0 0 +EDGE2 5698 5639 0.993787 0.0408519 -0.0113906 1 0 1 1 0 0 +EDGE2 5698 5678 0.0594285 -0.0423138 0.00441168 1 0 1 1 0 0 +EDGE2 5698 5637 -1.07715 -0.0275047 -0.0196054 1 0 1 1 0 0 +EDGE2 5698 5697 -1.06487 0.0155008 -0.0165646 1 0 1 1 0 0 +EDGE2 5698 5638 -0.0222032 0.060198 0.00387449 1 0 1 1 0 0 +EDGE2 5698 5677 -1.02632 -0.110196 0.00298946 1 0 1 1 0 0 +EDGE2 5699 5640 1.06661 -0.0382269 0.0172705 1 0 1 1 0 0 +EDGE2 5699 5680 1.07306 0.0284276 -0.0306029 1 0 1 1 0 0 +EDGE2 5699 5679 -5.37508e-05 -0.00703896 -0.01057 1 0 1 1 0 0 +EDGE2 5699 5639 -0.00184962 0.0593293 -0.00252982 1 0 1 1 0 0 +EDGE2 5699 5678 -1.03167 0.0336647 0.0081442 1 0 1 1 0 0 +EDGE2 5699 5698 -1.00974 -0.012782 -0.0050785 1 0 1 1 0 0 +EDGE2 5699 5638 -1.0307 0.0631802 -0.00485763 1 0 1 1 0 0 +EDGE2 5700 5641 -0.00637921 -0.996112 -1.54873 1 0 1 1 0 0 +EDGE2 5700 5640 0.099951 0.0486585 -0.0371624 1 0 1 1 0 0 +EDGE2 5700 5680 0.0329029 -0.142198 -0.00254162 1 0 1 1 0 0 +EDGE2 5700 5681 0.0864242 0.98173 1.51364 1 0 1 1 0 0 +EDGE2 5700 5679 -1.00949 0.0119276 -0.0054642 1 0 1 1 0 0 +EDGE2 5700 5699 -0.946796 0.0793327 -0.00745698 1 0 1 1 0 0 +EDGE2 5700 5639 -1.0046 0.010214 0.0493142 1 0 1 1 0 0 +EDGE2 5701 5640 -0.972064 0.0309291 -1.57062 1 0 1 1 0 0 +EDGE2 5701 5680 -0.960804 -0.00755128 -1.58261 1 0 1 1 0 0 +EDGE2 5701 5700 -0.861187 0.0311411 -1.56779 1 0 1 1 0 0 +EDGE2 5701 5681 -0.000859189 0.00261805 0.0115094 1 0 1 1 0 0 +EDGE2 5701 5682 0.956553 0.0724728 -0.00297101 1 0 1 1 0 0 +EDGE2 5702 5701 -0.962795 -0.0357105 0.0122046 1 0 1 1 0 0 +EDGE2 5702 5681 -1.03344 -0.0351572 0.010614 1 0 1 1 0 0 +EDGE2 5702 5682 -0.0446942 0.0152023 0.0145476 1 0 1 1 0 0 +EDGE2 5702 5683 0.915674 -0.0565518 -0.010839 1 0 1 1 0 0 +EDGE2 5703 5684 1.03076 -0.0239694 0.0249847 1 0 1 1 0 0 +EDGE2 5703 5702 -1.0505 -0.0713046 -0.000673079 1 0 1 1 0 0 +EDGE2 5703 5682 -0.905069 -0.00863705 0.0108502 1 0 1 1 0 0 +EDGE2 5703 5683 0.0122862 0.021152 -0.00442529 1 0 1 1 0 0 +EDGE2 5704 5684 6.53937e-05 -0.0668868 0.0145908 1 0 1 1 0 0 +EDGE2 5704 5683 -1.00094 0.015151 -0.0261569 1 0 1 1 0 0 +EDGE2 5704 5703 -0.917278 0.071035 -0.0337736 1 0 1 1 0 0 +EDGE2 5704 5685 0.941018 0.0400171 -0.0206944 1 0 1 1 0 0 +EDGE2 5705 5684 -1.03473 0.101306 -0.0427428 1 0 1 1 0 0 +EDGE2 5705 5704 -0.97501 -0.0491182 -0.0269892 1 0 1 1 0 0 +EDGE2 5705 5685 -0.0375569 0.142535 0.00206529 1 0 1 1 0 0 +EDGE2 5705 5686 0.00868673 0.967337 1.57783 1 0 1 1 0 0 +EDGE2 5706 5685 -0.88174 -0.0235385 -1.60489 1 0 1 1 0 0 +EDGE2 5706 5705 -1.08958 -0.00551224 -1.59669 1 0 1 1 0 0 +EDGE2 5706 5686 0.088344 0.0259825 -0.0221309 1 0 1 1 0 0 +EDGE2 5706 5687 0.921757 -0.0865436 0.0104859 1 0 1 1 0 0 +EDGE2 5707 5706 -0.946687 -0.039831 0.00250216 1 0 1 1 0 0 +EDGE2 5707 5686 -0.998225 -0.0062552 0.0149683 1 0 1 1 0 0 +EDGE2 5707 5687 0.000857749 -0.0134576 -0.0221776 1 0 1 1 0 0 +EDGE2 5707 5688 1.02006 -0.093754 0.028182 1 0 1 1 0 0 +EDGE2 5708 5687 -0.913802 0.0489468 -0.0132963 1 0 1 1 0 0 +EDGE2 5708 5707 -1.0618 0.066878 -0.0351834 1 0 1 1 0 0 +EDGE2 5708 5688 -0.0406031 0.0151813 -0.0243224 1 0 1 1 0 0 +EDGE2 5708 5689 0.995485 -0.0321183 0.0209252 1 0 1 1 0 0 +EDGE2 5709 5708 -1.00413 -0.0130217 -0.0129223 1 0 1 1 0 0 +EDGE2 5709 5688 -0.927936 0.0381412 0.010029 1 0 1 1 0 0 +EDGE2 5709 5689 -0.0856179 0.135097 -0.0018793 1 0 1 1 0 0 +EDGE2 5709 5630 0.964864 -0.00819968 -3.14586 1 0 1 1 0 0 +EDGE2 5709 5690 0.985433 -0.00904194 -0.0153335 1 0 1 1 0 0 +EDGE2 5710 5691 0.0724807 0.971779 1.60087 1 0 1 1 0 0 +EDGE2 5710 5709 -1.06532 -0.0602574 0.00279587 1 0 1 1 0 0 +EDGE2 5710 5689 -0.977826 0.00646684 0.0112316 1 0 1 1 0 0 +EDGE2 5710 5630 0.0300863 -0.0104204 -3.14165 1 0 1 1 0 0 +EDGE2 5710 5631 -0.0154357 1.04793 1.56013 1 0 1 1 0 0 +EDGE2 5710 5690 -0.0301507 -0.0317482 0.0100974 1 0 1 1 0 0 +EDGE2 5710 5629 0.982284 -0.13565 -3.13423 1 0 1 1 0 0 +EDGE2 5711 5691 0.0729259 -0.0249038 -0.0356263 1 0 1 1 0 0 +EDGE2 5711 5692 1.00773 -0.0837746 -0.000505756 1 0 1 1 0 0 +EDGE2 5711 5632 1.04952 0.0399132 -0.0297891 1 0 1 1 0 0 +EDGE2 5711 5630 -0.894289 0.0488592 1.55893 1 0 1 1 0 0 +EDGE2 5711 5710 -1.07202 -0.0243543 -1.54171 1 0 1 1 0 0 +EDGE2 5711 5631 0.0547135 0.00715827 -0.00551159 1 0 1 1 0 0 +EDGE2 5711 5690 -0.952964 0.0765554 -1.55783 1 0 1 1 0 0 +EDGE2 5712 5691 -0.97679 -0.0408587 0.0457082 1 0 1 1 0 0 +EDGE2 5712 5692 0.0236965 0.0338704 -0.00264131 1 0 1 1 0 0 +EDGE2 5712 5633 1.07567 -0.050022 0.00694033 1 0 1 1 0 0 +EDGE2 5712 5693 0.978959 -0.0239838 -0.00661317 1 0 1 1 0 0 +EDGE2 5712 5632 0.0348526 -0.0392662 -0.00976835 1 0 1 1 0 0 +EDGE2 5712 5711 -0.96899 0.0261486 -0.0118273 1 0 1 1 0 0 +EDGE2 5712 5631 -0.968168 0.084076 -0.0172272 1 0 1 1 0 0 +EDGE2 5713 5634 0.959669 -0.0387879 -0.0012775 1 0 1 1 0 0 +EDGE2 5713 5694 0.966724 -0.0817555 0.00781454 1 0 1 1 0 0 +EDGE2 5713 5692 -0.986434 -0.078463 0.0431706 1 0 1 1 0 0 +EDGE2 5713 5633 0.101121 -0.00439182 0.00107345 1 0 1 1 0 0 +EDGE2 5713 5693 -0.0202027 0.0841958 0.0205041 1 0 1 1 0 0 +EDGE2 5713 5712 -0.967864 -0.0301977 -0.0186662 1 0 1 1 0 0 +EDGE2 5713 5632 -1.01119 -0.0399044 -0.0105259 1 0 1 1 0 0 +EDGE2 5714 5713 -0.914067 0.0128889 0.00864445 1 0 1 1 0 0 +EDGE2 5714 5675 0.932286 -0.0213773 -3.13543 1 0 1 1 0 0 +EDGE2 5714 5695 1.01844 0.00729164 0.00545796 1 0 1 1 0 0 +EDGE2 5714 5635 1.03498 0.00834565 -0.00668297 1 0 1 1 0 0 +EDGE2 5714 5634 0.0136914 -0.0131062 0.0112905 1 0 1 1 0 0 +EDGE2 5714 5694 0.00764712 0.0873553 0.00916643 1 0 1 1 0 0 +EDGE2 5714 5633 -1.07822 0.0342629 0.00161404 1 0 1 1 0 0 +EDGE2 5714 5693 -0.989311 0.0848511 -0.00317189 1 0 1 1 0 0 +EDGE2 5715 5674 0.976157 -0.0359112 -3.11345 1 0 1 1 0 0 +EDGE2 5715 5676 -0.0521788 0.988118 1.57052 1 0 1 1 0 0 +EDGE2 5715 5696 0.0609101 0.930959 1.54429 1 0 1 1 0 0 +EDGE2 5715 5636 -0.0334349 0.873457 1.55204 1 0 1 1 0 0 +EDGE2 5715 5675 0.0342838 0.0202709 -3.138 1 0 1 1 0 0 +EDGE2 5715 5695 -0.102987 0.0570366 0.0295172 1 0 1 1 0 0 +EDGE2 5715 5635 0.0194868 -0.0687694 0.0146558 1 0 1 1 0 0 +EDGE2 5715 5634 -0.985309 0.0091167 -0.00701922 1 0 1 1 0 0 +EDGE2 5715 5694 -1.01604 -0.0186979 -0.0229999 1 0 1 1 0 0 +EDGE2 5715 5714 -1.00273 -0.105559 0.0344 1 0 1 1 0 0 +EDGE2 5716 5637 1.01833 -0.0716375 0.0201517 1 0 1 1 0 0 +EDGE2 5716 5697 0.98647 -0.0663136 0.0201496 1 0 1 1 0 0 +EDGE2 5716 5677 0.96693 -0.0183227 0.0281038 1 0 1 1 0 0 +EDGE2 5716 5676 0.0346904 0.0158308 -0.0375821 1 0 1 1 0 0 +EDGE2 5716 5696 -0.0187888 -0.00840143 -0.00147361 1 0 1 1 0 0 +EDGE2 5716 5636 -0.0345281 -0.0333064 -0.0155805 1 0 1 1 0 0 +EDGE2 5716 5675 -0.969058 -0.0327446 1.55823 1 0 1 1 0 0 +EDGE2 5716 5695 -1.10149 0.106067 -1.60079 1 0 1 1 0 0 +EDGE2 5716 5715 -0.963485 0.0554216 -1.58689 1 0 1 1 0 0 +EDGE2 5716 5635 -1.0588 0.017867 -1.54403 1 0 1 1 0 0 +EDGE2 5717 5678 0.971445 -0.0811021 0.0477145 1 0 1 1 0 0 +EDGE2 5717 5698 0.888133 0.111571 -0.00218276 1 0 1 1 0 0 +EDGE2 5717 5637 0.0197276 -0.0280716 -0.00220577 1 0 1 1 0 0 +EDGE2 5717 5697 0.0749002 0.099697 0.000173311 1 0 1 1 0 0 +EDGE2 5717 5638 1.02874 -0.0432406 -0.0162459 1 0 1 1 0 0 +EDGE2 5717 5677 -0.0204973 -0.106141 -9.83706e-05 1 0 1 1 0 0 +EDGE2 5717 5676 -1.06458 0.0420872 0.0146939 1 0 1 1 0 0 +EDGE2 5717 5696 -0.925361 0.0503172 -0.00289962 1 0 1 1 0 0 +EDGE2 5717 5716 -1.01184 -0.0447324 -0.0519374 1 0 1 1 0 0 +EDGE2 5717 5636 -0.98074 0.000413961 0.00179102 1 0 1 1 0 0 +EDGE2 5718 5679 0.91767 0.0541724 -0.00482425 1 0 1 1 0 0 +EDGE2 5718 5699 0.968746 0.023332 -0.00953609 1 0 1 1 0 0 +EDGE2 5718 5639 0.932853 0.00748942 0.0226809 1 0 1 1 0 0 +EDGE2 5718 5678 -0.00943214 0.0225176 0.00353228 1 0 1 1 0 0 +EDGE2 5718 5698 -0.0224032 -0.0242658 -0.00638576 1 0 1 1 0 0 +EDGE2 5718 5637 -0.955505 0.0468718 -0.0131902 1 0 1 1 0 0 +EDGE2 5718 5697 -0.986277 -0.0232932 0.00500491 1 0 1 1 0 0 +EDGE2 5718 5717 -1.08272 -0.0380022 -0.00161238 1 0 1 1 0 0 +EDGE2 5718 5638 -0.0337348 -0.0071214 -0.0091684 1 0 1 1 0 0 +EDGE2 5718 5677 -1.02899 -0.017231 -0.021981 1 0 1 1 0 0 +EDGE2 5719 5640 1.10408 0.0209853 -0.00441902 1 0 1 1 0 0 +EDGE2 5719 5680 0.953615 -0.0201603 0.0210808 1 0 1 1 0 0 +EDGE2 5719 5700 1.01974 -0.106711 0.0217152 1 0 1 1 0 0 +EDGE2 5719 5679 0.0180141 0.162021 0.0116932 1 0 1 1 0 0 +EDGE2 5719 5699 0.0479011 -0.0262501 -0.0167344 1 0 1 1 0 0 +EDGE2 5719 5639 0.00633723 -0.0102914 -0.0140452 1 0 1 1 0 0 +EDGE2 5719 5678 -1.0147 0.119459 -0.0254323 1 0 1 1 0 0 +EDGE2 5719 5718 -1.04392 -0.0166286 0.0317503 1 0 1 1 0 0 +EDGE2 5719 5698 -1.01263 -0.0114833 -0.0261466 1 0 1 1 0 0 +EDGE2 5719 5638 -1.08241 -0.0410528 0.000127896 1 0 1 1 0 0 +EDGE2 5720 5701 0.0401851 1.01023 1.55309 1 0 1 1 0 0 +EDGE2 5720 5641 0.0117198 -1.10227 -1.54559 1 0 1 1 0 0 +EDGE2 5720 5640 0.00213183 0.0348502 0.00870341 1 0 1 1 0 0 +EDGE2 5720 5680 -0.0229034 0.00846884 -0.0111995 1 0 1 1 0 0 +EDGE2 5720 5700 0.0507438 -0.00629162 -0.0147293 1 0 1 1 0 0 +EDGE2 5720 5681 -0.00857749 1.0558 1.55046 1 0 1 1 0 0 +EDGE2 5720 5679 -0.989619 0.0881455 0.00616248 1 0 1 1 0 0 +EDGE2 5720 5699 -1.08708 0.0296694 0.0244788 1 0 1 1 0 0 +EDGE2 5720 5719 -0.972444 0.00104918 0.00174524 1 0 1 1 0 0 +EDGE2 5720 5639 -0.934141 -0.0161952 0.00860409 1 0 1 1 0 0 +EDGE2 5721 5701 -0.000742319 0.0248634 -0.0230121 1 0 1 1 0 0 +EDGE2 5721 5720 -1.08194 -0.0555841 -1.60331 1 0 1 1 0 0 +EDGE2 5721 5640 -1.03136 -0.0196174 -1.57041 1 0 1 1 0 0 +EDGE2 5721 5680 -0.969454 0.000672421 -1.56082 1 0 1 1 0 0 +EDGE2 5721 5700 -0.982498 0.0112295 -1.55607 1 0 1 1 0 0 +EDGE2 5721 5702 1.05194 0.0436685 0.0357851 1 0 1 1 0 0 +EDGE2 5721 5681 -0.0557295 0.0155543 0.0103547 1 0 1 1 0 0 +EDGE2 5721 5682 1.03344 0.0140664 0.0241277 1 0 1 1 0 0 +EDGE2 5722 5701 -1.03646 0.0132363 0.00716884 1 0 1 1 0 0 +EDGE2 5722 5721 -1.0871 -0.0390481 -0.00790123 1 0 1 1 0 0 +EDGE2 5722 5702 0.000394727 -0.0396551 -0.00303433 1 0 1 1 0 0 +EDGE2 5722 5681 -0.928992 0.0388957 0.0017297 1 0 1 1 0 0 +EDGE2 5722 5682 0.000976832 -0.0611595 0.0054014 1 0 1 1 0 0 +EDGE2 5722 5683 1.08831 -0.0205044 0.0184005 1 0 1 1 0 0 +EDGE2 5722 5703 0.928883 0.0744232 -0.0119136 1 0 1 1 0 0 +EDGE2 5723 5684 1.05078 -0.0464491 -0.00754812 1 0 1 1 0 0 +EDGE2 5723 5702 -0.961467 -0.098545 0.00480388 1 0 1 1 0 0 +EDGE2 5723 5722 -1.00628 0.0141613 -0.0144108 1 0 1 1 0 0 +EDGE2 5723 5682 -0.937198 0.0474305 -0.012755 1 0 1 1 0 0 +EDGE2 5723 5683 -0.0553702 -0.0968616 -0.00489983 1 0 1 1 0 0 +EDGE2 5723 5703 -0.0528184 0.0218222 0.0152117 1 0 1 1 0 0 +EDGE2 5723 5704 0.91653 -0.0452715 0.023133 1 0 1 1 0 0 +EDGE2 5724 5684 -0.0195655 0.0129121 -0.00693599 1 0 1 1 0 0 +EDGE2 5724 5723 -1.02278 -0.0321339 -0.0134703 1 0 1 1 0 0 +EDGE2 5724 5683 -1.02957 0.0136057 -0.00485144 1 0 1 1 0 0 +EDGE2 5724 5703 -0.992914 -0.0663229 -0.0165321 1 0 1 1 0 0 +EDGE2 5724 5704 -0.0269564 -0.0228652 -0.0145088 1 0 1 1 0 0 +EDGE2 5724 5685 1.01671 -0.0134005 0.0373393 1 0 1 1 0 0 +EDGE2 5724 5705 0.967528 -0.0405399 -0.00885996 1 0 1 1 0 0 +EDGE2 5725 5706 0.0675303 1.01093 1.5702 1 0 1 1 0 0 +EDGE2 5725 5684 -1.01407 -0.0138015 -0.01414 1 0 1 1 0 0 +EDGE2 5725 5724 -0.986593 0.0309608 0.0297516 1 0 1 1 0 0 +EDGE2 5725 5704 -1.00106 0.0222298 0.0150709 1 0 1 1 0 0 +EDGE2 5725 5685 0.054352 -0.0257139 0.0210254 1 0 1 1 0 0 +EDGE2 5725 5705 -0.0195794 0.0158266 0.00941398 1 0 1 1 0 0 +EDGE2 5725 5686 0.00876612 0.987625 1.59104 1 0 1 1 0 0 +EDGE2 5726 5725 -0.95795 -0.0644105 1.57984 1 0 1 1 0 0 +EDGE2 5726 5685 -1.0413 0.00371721 1.55661 1 0 1 1 0 0 +EDGE2 5726 5705 -0.933129 0.0224103 1.56291 1 0 1 1 0 0 +EDGE2 5727 5726 -1.0248 -0.0437019 0.0100027 1 0 1 1 0 0 +EDGE2 5728 5727 -0.955343 -0.0487613 0.0301041 1 0 1 1 0 0 +EDGE2 5729 5728 -0.982089 0.0409844 -0.0324323 1 0 1 1 0 0 +EDGE2 5730 5729 -1.04335 -0.00116114 -0.0163351 1 0 1 1 0 0 +EDGE2 5731 5730 -0.937135 -0.00887729 -1.55226 1 0 1 1 0 0 +EDGE2 5732 5731 -0.935764 -0.0376213 -0.0198239 1 0 1 1 0 0 +EDGE2 5733 5732 -1.01199 0.0356001 0.00369964 1 0 1 1 0 0 +EDGE2 5734 5733 -1.08183 -0.111736 -0.0220556 1 0 1 1 0 0 +EDGE2 5735 5734 -0.980776 -0.00415275 0.0303629 1 0 1 1 0 0 +EDGE2 5736 5735 -0.993207 -0.00158724 -1.55398 1 0 1 1 0 0 +EDGE2 5737 5736 -0.998285 0.00415489 -0.00445087 1 0 1 1 0 0 +EDGE2 5738 5737 -0.990926 0.0245657 -0.0499271 1 0 1 1 0 0 +EDGE2 5739 5738 -0.991654 -0.0526452 -0.0335237 1 0 1 1 0 0 +EDGE2 5740 5739 -0.930016 -0.0662884 -0.0159492 1 0 1 1 0 0 +EDGE2 5741 5740 -1.1176 0.0236827 -1.56763 1 0 1 1 0 0 +EDGE2 5742 5741 -1.09357 -0.0528214 -0.00362597 1 0 1 1 0 0 +EDGE2 5743 5742 -0.966828 -0.0275578 -0.0134522 1 0 1 1 0 0 +EDGE2 5744 5725 1.05635 0.0265957 -3.13379 1 0 1 1 0 0 +EDGE2 5744 5685 0.993928 -0.0961532 -3.14754 1 0 1 1 0 0 +EDGE2 5744 5705 0.952045 0.0490801 -3.16651 1 0 1 1 0 0 +EDGE2 5744 5743 -0.952911 -0.0279204 0.0159659 1 0 1 1 0 0 +EDGE2 5745 5706 0.0732243 -1.0627 -1.55047 1 0 1 1 0 0 +EDGE2 5745 5726 -0.0448947 1.00267 1.57757 1 0 1 1 0 0 +EDGE2 5745 5684 0.868633 0.0147174 -3.15725 1 0 1 1 0 0 +EDGE2 5745 5724 0.9971 0.0440542 -3.14692 1 0 1 1 0 0 +EDGE2 5745 5704 1.06231 -0.0203496 -3.11371 1 0 1 1 0 0 +EDGE2 5745 5725 0.0767528 0.0250077 -3.13988 1 0 1 1 0 0 +EDGE2 5745 5744 -0.95718 0.0169005 -0.018753 1 0 1 1 0 0 +EDGE2 5745 5685 0.0180171 -0.0197073 -3.15003 1 0 1 1 0 0 +EDGE2 5745 5705 -0.00595949 -0.0442251 -3.13015 1 0 1 1 0 0 +EDGE2 5745 5686 0.0427464 -0.986788 -1.58462 1 0 1 1 0 0 +EDGE2 5746 5706 -0.00787237 0.0559339 -0.00096375 1 0 1 1 0 0 +EDGE2 5746 5725 -1.01944 0.0794394 -1.59763 1 0 1 1 0 0 +EDGE2 5746 5745 -1.03595 -0.00234652 1.56406 1 0 1 1 0 0 +EDGE2 5746 5685 -1.07354 -0.166661 -1.58033 1 0 1 1 0 0 +EDGE2 5746 5705 -1.02994 -0.0327671 -1.54702 1 0 1 1 0 0 +EDGE2 5746 5686 0.0440232 0.0181973 -0.0354349 1 0 1 1 0 0 +EDGE2 5746 5687 1.034 0.0408971 -0.0247498 1 0 1 1 0 0 +EDGE2 5746 5707 0.971651 0.00659821 0.00197743 1 0 1 1 0 0 +EDGE2 5747 5706 -1.08463 -0.10784 0.00251703 1 0 1 1 0 0 +EDGE2 5747 5746 -0.930463 -0.00612467 -0.00320888 1 0 1 1 0 0 +EDGE2 5747 5686 -1.03465 -0.0265688 -0.0186792 1 0 1 1 0 0 +EDGE2 5747 5708 0.970692 -0.0900398 0.0118937 1 0 1 1 0 0 +EDGE2 5747 5687 0.0194789 0.0312107 -0.0160552 1 0 1 1 0 0 +EDGE2 5747 5707 -0.00559284 0.039172 -0.0119467 1 0 1 1 0 0 +EDGE2 5747 5688 1.07386 0.074763 -0.00117037 1 0 1 1 0 0 +EDGE2 5748 5708 -0.0794203 -0.00639552 -0.00508554 1 0 1 1 0 0 +EDGE2 5748 5687 -0.938949 0.0388839 -0.00113701 1 0 1 1 0 0 +EDGE2 5748 5707 -1.033 -0.0185925 0.0167381 1 0 1 1 0 0 +EDGE2 5748 5747 -1.02723 -0.0750111 0.0253469 1 0 1 1 0 0 +EDGE2 5748 5709 1.00231 0.0455711 -0.0183136 1 0 1 1 0 0 +EDGE2 5748 5688 0.0870498 -0.0394494 0.0278524 1 0 1 1 0 0 +EDGE2 5748 5689 0.887723 0.00343707 -0.0283856 1 0 1 1 0 0 +EDGE2 5749 5708 -1.00549 -0.0578854 0.00478209 1 0 1 1 0 0 +EDGE2 5749 5748 -0.999591 0.0253028 -0.00250434 1 0 1 1 0 0 +EDGE2 5749 5709 0.0696301 0.0460579 -0.030235 1 0 1 1 0 0 +EDGE2 5749 5688 -1.04474 0.0120954 -0.00967497 1 0 1 1 0 0 +EDGE2 5749 5689 -0.0195887 -0.0872883 0.00780532 1 0 1 1 0 0 +EDGE2 5749 5630 1.00654 0.0176823 -3.16254 1 0 1 1 0 0 +EDGE2 5749 5710 0.948979 -0.0483957 0.0270389 1 0 1 1 0 0 +EDGE2 5749 5690 1.16799 0.00111332 -0.0383136 1 0 1 1 0 0 +EDGE2 5750 5691 0.033923 0.899383 1.57963 1 0 1 1 0 0 +EDGE2 5750 5709 -0.941691 -0.0687632 -0.00248893 1 0 1 1 0 0 +EDGE2 5750 5749 -1.01752 -0.0385182 0.0246007 1 0 1 1 0 0 +EDGE2 5750 5689 -0.934685 -0.00919919 0.00823809 1 0 1 1 0 0 +EDGE2 5750 5711 0.0301458 1.00324 1.59964 1 0 1 1 0 0 +EDGE2 5750 5630 0.00659463 -0.0339968 -3.1206 1 0 1 1 0 0 +EDGE2 5750 5710 -0.00411846 -0.0263414 0.0092028 1 0 1 1 0 0 +EDGE2 5750 5631 -0.08292 1.0237 1.56998 1 0 1 1 0 0 +EDGE2 5750 5690 0.0379132 0.0072247 0.0177551 1 0 1 1 0 0 +EDGE2 5750 5629 0.92523 -0.0195829 -3.12288 1 0 1 1 0 0 +EDGE2 5751 5691 -0.0133691 -0.026008 -0.0376719 1 0 1 1 0 0 +EDGE2 5751 5692 0.848792 0.0691558 -0.0136244 1 0 1 1 0 0 +EDGE2 5751 5712 1.02857 0.0343376 0.00400283 1 0 1 1 0 0 +EDGE2 5751 5632 0.948828 -0.0570284 -0.0207393 1 0 1 1 0 0 +EDGE2 5751 5711 -0.0236289 0.00595004 0.00454198 1 0 1 1 0 0 +EDGE2 5751 5630 -1.04602 0.0166813 1.56838 1 0 1 1 0 0 +EDGE2 5751 5710 -0.95518 -0.0684296 -1.56785 1 0 1 1 0 0 +EDGE2 5751 5750 -1.02432 -0.00522536 -1.58267 1 0 1 1 0 0 +EDGE2 5751 5631 -0.0556993 0.0252208 -0.0241681 1 0 1 1 0 0 +EDGE2 5751 5690 -1.02541 0.02179 -1.57745 1 0 1 1 0 0 +EDGE2 5752 5691 -0.942784 -0.0209537 0.02442 1 0 1 1 0 0 +EDGE2 5752 5713 1.04535 -0.029936 0.0112307 1 0 1 1 0 0 +EDGE2 5752 5692 -0.017168 0.0377476 -0.010334 1 0 1 1 0 0 +EDGE2 5752 5633 1.02172 -0.0364724 0.0321036 1 0 1 1 0 0 +EDGE2 5752 5693 0.962031 -0.00799679 0.0240106 1 0 1 1 0 0 +EDGE2 5752 5712 -0.0202809 -0.0290953 7.98196e-05 1 0 1 1 0 0 +EDGE2 5752 5751 -0.977476 -0.0166982 0.00995688 1 0 1 1 0 0 +EDGE2 5752 5632 0.0254765 0.0922651 -0.0179402 1 0 1 1 0 0 +EDGE2 5752 5711 -0.957173 0.0374904 -0.0259991 1 0 1 1 0 0 +EDGE2 5752 5631 -0.967755 -0.00850212 -0.025536 1 0 1 1 0 0 +EDGE2 5753 5713 0.108276 0.0202587 0.00837548 1 0 1 1 0 0 +EDGE2 5753 5634 1.06785 0.00120635 -0.0103399 1 0 1 1 0 0 +EDGE2 5753 5694 0.973659 -0.0544816 0.0108354 1 0 1 1 0 0 +EDGE2 5753 5714 0.983582 0.0513876 -0.000359111 1 0 1 1 0 0 +EDGE2 5753 5692 -1.04453 -0.0198075 0.00296616 1 0 1 1 0 0 +EDGE2 5753 5752 -0.951171 0.00817557 0.0358213 1 0 1 1 0 0 +EDGE2 5753 5633 0.0291447 0.0741574 -0.0243959 1 0 1 1 0 0 +EDGE2 5753 5693 0.0393211 -0.0376987 0.0220871 1 0 1 1 0 0 +EDGE2 5753 5712 -1.03453 -0.0666251 0.0385878 1 0 1 1 0 0 +EDGE2 5753 5632 -0.884133 -0.0403943 -0.0272244 1 0 1 1 0 0 +EDGE2 5754 5713 -0.999461 0.00721543 0.00868304 1 0 1 1 0 0 +EDGE2 5754 5675 0.92826 -0.0458337 -3.16952 1 0 1 1 0 0 +EDGE2 5754 5695 1.10383 0.0835578 -0.0159847 1 0 1 1 0 0 +EDGE2 5754 5715 0.918929 -0.0102096 -0.00348758 1 0 1 1 0 0 +EDGE2 5754 5635 0.982982 -0.025146 0.0236426 1 0 1 1 0 0 +EDGE2 5754 5634 0.0181968 0.00355081 0.0205409 1 0 1 1 0 0 +EDGE2 5754 5694 -0.0391811 0.00347977 -0.00493081 1 0 1 1 0 0 +EDGE2 5754 5714 0.00248247 0.070983 0.045137 1 0 1 1 0 0 +EDGE2 5754 5753 -0.993807 -0.0351517 0.0205648 1 0 1 1 0 0 +EDGE2 5754 5633 -0.97822 -0.0112592 -0.00109877 1 0 1 1 0 0 +EDGE2 5754 5693 -0.994416 0.00901089 0.00302374 1 0 1 1 0 0 +EDGE2 5755 5674 1.02546 0.038381 -3.11119 1 0 1 1 0 0 +EDGE2 5755 5676 0.0218013 0.928753 1.52619 1 0 1 1 0 0 +EDGE2 5755 5696 0.00487608 1.01088 1.54975 1 0 1 1 0 0 +EDGE2 5755 5716 0.04318 0.948487 1.5409 1 0 1 1 0 0 +EDGE2 5755 5636 0.0541424 1.03496 1.53799 1 0 1 1 0 0 +EDGE2 5755 5754 -0.994784 -0.0178446 0.0021017 1 0 1 1 0 0 +EDGE2 5755 5675 0.0297002 -0.0664876 -3.11449 1 0 1 1 0 0 +EDGE2 5755 5695 0.0760548 -0.00924402 0.00885124 1 0 1 1 0 0 +EDGE2 5755 5715 -0.0122105 0.0718071 -0.0131719 1 0 1 1 0 0 +EDGE2 5755 5635 -0.00378342 -0.0338308 -0.0185641 1 0 1 1 0 0 +EDGE2 5755 5634 -0.995081 -0.096453 -0.0143182 1 0 1 1 0 0 +EDGE2 5755 5694 -0.970608 0.0457555 0.009582 1 0 1 1 0 0 +EDGE2 5755 5714 -0.974669 -0.044265 -0.0111 1 0 1 1 0 0 +EDGE2 5756 5755 -0.931041 -0.0216666 1.56379 1 0 1 1 0 0 +EDGE2 5756 5675 -0.989897 0.0554864 -1.57184 1 0 1 1 0 0 +EDGE2 5756 5695 -1.02701 0.0940169 1.59882 1 0 1 1 0 0 +EDGE2 5756 5715 -1.05252 0.108025 1.53443 1 0 1 1 0 0 +EDGE2 5756 5635 -1.02708 -0.0185414 1.57461 1 0 1 1 0 0 +EDGE2 5757 5756 -0.999549 -0.0318567 -0.00916053 1 0 1 1 0 0 +EDGE2 5758 5757 -0.927625 -0.0169195 -0.0257997 1 0 1 1 0 0 +EDGE2 5759 5758 -1.08697 -0.00122151 0.0118972 1 0 1 1 0 0 +EDGE2 5759 5580 1.01471 0.0742024 -3.12631 1 0 1 1 0 0 +EDGE2 5759 5620 1.02659 0.0252825 -3.1472 1 0 1 1 0 0 +EDGE2 5760 5759 -1.02556 0.0180629 -0.0053662 1 0 1 1 0 0 +EDGE2 5760 5621 0.00201691 -1.02768 -1.5466 1 0 1 1 0 0 +EDGE2 5760 5580 -0.0303722 0.0246991 -3.14816 1 0 1 1 0 0 +EDGE2 5760 5620 -0.0242087 0.0369004 -3.15588 1 0 1 1 0 0 +EDGE2 5760 5581 0.054364 -1.03341 -1.57074 1 0 1 1 0 0 +EDGE2 5760 5579 0.981043 0.0493281 -3.1415 1 0 1 1 0 0 +EDGE2 5760 5619 0.957635 0.0878662 -3.15719 1 0 1 1 0 0 +EDGE2 5761 5760 -1.09074 -0.0569773 -1.57179 1 0 1 1 0 0 +EDGE2 5761 5580 -0.927972 -0.0606328 1.55157 1 0 1 1 0 0 +EDGE2 5761 5620 -1.01407 -0.0313761 1.54774 1 0 1 1 0 0 +EDGE2 5762 5761 -1.00968 0.0487992 -0.023872 1 0 1 1 0 0 +EDGE2 5763 5762 -1.00229 0.0203786 -0.00695294 1 0 1 1 0 0 +EDGE2 5764 5763 -1.00696 0.0223978 0.00166843 1 0 1 1 0 0 +EDGE2 5764 5505 1.02563 0.0238481 -3.14495 1 0 1 1 0 0 +EDGE2 5765 5504 1.01676 0.106674 -3.14569 1 0 1 1 0 0 +EDGE2 5765 5764 -1.02949 -0.0316076 -0.0261203 1 0 1 1 0 0 +EDGE2 5765 5505 0.0415425 -0.067758 -3.16047 1 0 1 1 0 0 +EDGE2 5765 5506 0.0673038 -1.0643 -1.56949 1 0 1 1 0 0 +EDGE2 5766 5765 -0.928322 -0.0764834 -1.57697 1 0 1 1 0 0 +EDGE2 5766 5505 -1.05216 -0.00196503 1.55942 1 0 1 1 0 0 +EDGE2 5767 5766 -0.932467 0.0696514 0.0129024 1 0 1 1 0 0 +EDGE2 5768 5767 -1.09146 0.0748512 0.00889587 1 0 1 1 0 0 +EDGE2 5769 5670 1.05102 -0.00195358 -3.13035 1 0 1 1 0 0 +EDGE2 5769 5650 1.0594 0.0169027 -3.15296 1 0 1 1 0 0 +EDGE2 5769 5768 -1.10343 0.0507024 -0.0134772 1 0 1 1 0 0 +EDGE2 5770 5649 1.00366 0.0754315 -3.15641 1 0 1 1 0 0 +EDGE2 5770 5669 0.96794 0.00782518 -3.14011 1 0 1 1 0 0 +EDGE2 5770 5670 0.0732902 0.00909325 -3.10968 1 0 1 1 0 0 +EDGE2 5770 5651 -0.0579463 -1.03392 -1.58218 1 0 1 1 0 0 +EDGE2 5770 5671 -0.0194482 0.905998 1.54019 1 0 1 1 0 0 +EDGE2 5770 5650 0.00571108 0.113157 -3.1383 1 0 1 1 0 0 +EDGE2 5770 5769 -1.12048 -0.0146309 -0.0144317 1 0 1 1 0 0 +EDGE2 5771 5670 -1.04046 0.0453373 -1.60223 1 0 1 1 0 0 +EDGE2 5771 5770 -0.961749 0.0196508 1.55347 1 0 1 1 0 0 +EDGE2 5771 5652 1.00653 0.0176753 -0.00254288 1 0 1 1 0 0 +EDGE2 5771 5651 0.0263128 -0.00293828 -0.00755702 1 0 1 1 0 0 +EDGE2 5771 5650 -0.881811 -0.0619756 -1.56721 1 0 1 1 0 0 +EDGE2 5772 5653 0.988201 0.0267313 -0.0127291 1 0 1 1 0 0 +EDGE2 5772 5771 -0.994428 -0.0665158 0.00481078 1 0 1 1 0 0 +EDGE2 5772 5652 -0.083788 0.0295669 -0.0148717 1 0 1 1 0 0 +EDGE2 5772 5651 -1.01416 0.00672026 0.00552847 1 0 1 1 0 0 +EDGE2 5773 5653 0.0273437 0.0156882 -0.0233849 1 0 1 1 0 0 +EDGE2 5773 5654 1.01867 -0.051816 -0.014187 1 0 1 1 0 0 +EDGE2 5773 5652 -0.935372 0.0477775 0.0110994 1 0 1 1 0 0 +EDGE2 5773 5772 -1.12654 -0.00707788 0.0249886 1 0 1 1 0 0 +EDGE2 5774 5653 -1.03066 0.0306288 0.0141664 1 0 1 1 0 0 +EDGE2 5774 5654 0.00846435 -0.0403109 0.0117923 1 0 1 1 0 0 +EDGE2 5774 5655 1.03103 -0.0809835 -0.00755954 1 0 1 1 0 0 +EDGE2 5774 5773 -0.915884 -0.0621671 -0.00248193 1 0 1 1 0 0 +EDGE2 5775 5654 -1.00006 0.0927736 0.0117835 1 0 1 1 0 0 +EDGE2 5775 5655 0.0205191 0.0209715 -0.0376671 1 0 1 1 0 0 +EDGE2 5775 5656 -0.003496 1.00122 1.5836 1 0 1 1 0 0 +EDGE2 5775 5774 -0.901936 -0.0343662 -0.00308491 1 0 1 1 0 0 +EDGE2 5776 5657 1.13036 0.0298546 -0.00854678 1 0 1 1 0 0 +EDGE2 5776 5655 -0.936624 -0.00633122 -1.62785 1 0 1 1 0 0 +EDGE2 5776 5775 -0.959444 0.00892831 -1.52477 1 0 1 1 0 0 +EDGE2 5776 5656 -0.0257729 0.0145203 -0.011692 1 0 1 1 0 0 +EDGE2 5777 5776 -1.01318 -0.0868874 0.0125694 1 0 1 1 0 0 +EDGE2 5777 5658 1.02523 -0.0199154 -0.0110538 1 0 1 1 0 0 +EDGE2 5777 5657 0.0593327 -0.0450468 0.00347392 1 0 1 1 0 0 +EDGE2 5777 5656 -0.963075 -0.0266522 -0.0272681 1 0 1 1 0 0 +EDGE2 5778 5659 0.943284 0.042467 -0.029903 1 0 1 1 0 0 +EDGE2 5778 5777 -0.986733 0.0828542 -0.0195788 1 0 1 1 0 0 +EDGE2 5778 5658 0.00866457 0.0430849 0.0105404 1 0 1 1 0 0 +EDGE2 5778 5657 -1.04386 0.00772358 -0.0125687 1 0 1 1 0 0 +EDGE2 5779 1100 0.994528 -0.0880463 -3.1316 1 0 1 1 0 0 +EDGE2 5779 1140 1.03513 -0.0343502 -3.11657 1 0 1 1 0 0 +EDGE2 5779 3040 0.99542 -0.0143245 -3.13285 1 0 1 1 0 0 +EDGE2 5779 5660 1.12267 -0.00930126 0.00101044 1 0 1 1 0 0 +EDGE2 5779 1120 0.931864 0.0330786 -3.10895 1 0 1 1 0 0 +EDGE2 5779 5659 0.0719599 -0.00626951 -0.00359977 1 0 1 1 0 0 +EDGE2 5779 5658 -0.953302 0.00286424 0.00148453 1 0 1 1 0 0 +EDGE2 5779 5778 -1.04194 -0.0224379 -0.0195295 1 0 1 1 0 0 +EDGE2 5780 1139 1.03279 0.10737 -3.15239 1 0 1 1 0 0 +EDGE2 5780 3039 1.05847 -0.0304057 -3.17225 1 0 1 1 0 0 +EDGE2 5780 1099 0.918591 0.0251866 -3.15728 1 0 1 1 0 0 +EDGE2 5780 1119 1.07737 -0.0130849 -3.12439 1 0 1 1 0 0 +EDGE2 5780 1121 -0.00289441 -1.04633 -1.55314 1 0 1 1 0 0 +EDGE2 5780 3041 -0.0103097 -1.02697 -1.5673 1 0 1 1 0 0 +EDGE2 5780 1141 -0.00447499 -0.963622 -1.56346 1 0 1 1 0 0 +EDGE2 5780 1101 0.00989883 -0.983155 -1.54286 1 0 1 1 0 0 +EDGE2 5780 1100 0.0430632 -0.039854 -3.12526 1 0 1 1 0 0 +EDGE2 5780 1140 0.0678917 0.00768416 -3.10663 1 0 1 1 0 0 +EDGE2 5780 3040 -0.0392669 0.0667629 -3.10897 1 0 1 1 0 0 +EDGE2 5780 5660 0.102341 -0.0677405 -0.0138688 1 0 1 1 0 0 +EDGE2 5780 1120 -0.0688471 -0.0760947 -3.12435 1 0 1 1 0 0 +EDGE2 5780 5661 -0.0313106 1.02289 1.59881 1 0 1 1 0 0 +EDGE2 5780 5659 -0.964094 -0.0759186 0.00131585 1 0 1 1 0 0 +EDGE2 5780 5779 -0.883794 -0.0541985 -0.00920143 1 0 1 1 0 0 +EDGE2 5781 5780 -1.06947 -0.0672274 1.56744 1 0 1 1 0 0 +EDGE2 5781 3042 0.988552 0.0646545 -0.0218575 1 0 1 1 0 0 +EDGE2 5781 1102 1.01532 -0.0335976 0.00221539 1 0 1 1 0 0 +EDGE2 5781 1122 0.971496 0.0329106 -0.0406401 1 0 1 1 0 0 +EDGE2 5781 1142 0.994487 0.00937871 0.0131837 1 0 1 1 0 0 +EDGE2 5781 1121 -0.0472061 -0.0508538 0.0102784 1 0 1 1 0 0 +EDGE2 5781 3041 -0.0496636 0.0320359 0.00416302 1 0 1 1 0 0 +EDGE2 5781 1141 -0.0854758 -0.0104149 -0.0181604 1 0 1 1 0 0 +EDGE2 5781 1101 -0.0369311 0.0326268 -0.0516752 1 0 1 1 0 0 +EDGE2 5781 1100 -1.03592 -0.0145142 -1.58472 1 0 1 1 0 0 +EDGE2 5781 1140 -0.999786 -0.0161985 -1.58225 1 0 1 1 0 0 +EDGE2 5781 3040 -1.04098 0.00754898 -1.58095 1 0 1 1 0 0 +EDGE2 5781 5660 -0.994759 -0.0456264 1.62584 1 0 1 1 0 0 +EDGE2 5781 1120 -1.00752 0.0273897 -1.56944 1 0 1 1 0 0 +EDGE2 5782 1123 1.00727 0.0978742 0.0200245 1 0 1 1 0 0 +EDGE2 5782 3043 1.16301 -0.0111055 -0.0102213 1 0 1 1 0 0 +EDGE2 5782 1143 1.01439 -0.0556805 0.000293675 1 0 1 1 0 0 +EDGE2 5782 3042 -0.0146821 -0.117194 0.00781283 1 0 1 1 0 0 +EDGE2 5782 1103 0.957312 -0.118721 0.00657631 1 0 1 1 0 0 +EDGE2 5782 1102 0.102056 0.0750241 -0.0220891 1 0 1 1 0 0 +EDGE2 5782 1122 -0.0579837 -0.0449669 -0.0163958 1 0 1 1 0 0 +EDGE2 5782 1142 -0.0311001 0.0564839 0.00384757 1 0 1 1 0 0 +EDGE2 5782 1121 -1.0734 -0.006179 0.0129766 1 0 1 1 0 0 +EDGE2 5782 3041 -1.0012 0.0181766 -0.0136935 1 0 1 1 0 0 +EDGE2 5782 5781 -0.946681 -0.0236612 0.0210068 1 0 1 1 0 0 +EDGE2 5782 1141 -0.994945 0.0314653 -0.0176421 1 0 1 1 0 0 +EDGE2 5782 1101 -0.987788 -0.0278759 -0.00878325 1 0 1 1 0 0 +EDGE2 5783 1123 0.0577708 0.0449435 0.0110827 1 0 1 1 0 0 +EDGE2 5783 1124 0.952842 0.00997107 -0.0117968 1 0 1 1 0 0 +EDGE2 5783 1144 1.06436 -0.0250031 -0.0194588 1 0 1 1 0 0 +EDGE2 5783 3044 0.982368 0.0428586 0.0382007 1 0 1 1 0 0 +EDGE2 5783 1104 0.984881 -0.0080618 0.0167611 1 0 1 1 0 0 +EDGE2 5783 3043 0.111715 0.0430785 0.0433111 1 0 1 1 0 0 +EDGE2 5783 1143 0.0423269 0.0179583 -0.00764311 1 0 1 1 0 0 +EDGE2 5783 3042 -1.01667 0.00635629 -0.0151639 1 0 1 1 0 0 +EDGE2 5783 1103 -0.0146442 -0.0611279 -0.0154023 1 0 1 1 0 0 +EDGE2 5783 5782 -0.981967 -0.0141877 -0.0727848 1 0 1 1 0 0 +EDGE2 5783 1102 -1.01296 -0.000985006 0.0140708 1 0 1 1 0 0 +EDGE2 5783 1122 -1.02385 -0.0287552 0.00191414 1 0 1 1 0 0 +EDGE2 5783 1142 -0.994824 0.00752594 0.0378476 1 0 1 1 0 0 +EDGE2 5784 1123 -1.01257 0.0858971 -0.00256464 1 0 1 1 0 0 +EDGE2 5784 1145 1.04306 0.00864368 -0.00355812 1 0 1 1 0 0 +EDGE2 5784 3045 0.924202 -0.0110426 0.0275773 1 0 1 1 0 0 +EDGE2 5784 3505 1.03811 0.0165889 -3.1459 1 0 1 1 0 0 +EDGE2 5784 3025 0.959946 -0.0263981 -3.14299 1 0 1 1 0 0 +EDGE2 5784 1105 0.889327 -0.0568909 -0.0254258 1 0 1 1 0 0 +EDGE2 5784 1125 1.02687 -0.00798382 0.000791148 1 0 1 1 0 0 +EDGE2 5784 1124 0.0274752 -0.00515835 -0.0176217 1 0 1 1 0 0 +EDGE2 5784 1144 0.086326 -0.0782091 -0.00639159 1 0 1 1 0 0 +EDGE2 5784 3044 0.00884133 -0.109123 0.024993 1 0 1 1 0 0 +EDGE2 5784 1104 0.00833217 -0.0901273 -0.0219098 1 0 1 1 0 0 +EDGE2 5784 3043 -1.02812 -0.021049 -0.00607461 1 0 1 1 0 0 +EDGE2 5784 5783 -0.953131 0.0151048 0.0240781 1 0 1 1 0 0 +EDGE2 5784 1143 -1.05045 -0.0351314 0.0371242 1 0 1 1 0 0 +EDGE2 5784 1103 -1.01339 0.123231 0.00502149 1 0 1 1 0 0 +EDGE2 5785 3504 0.915075 0.022495 -3.1271 1 0 1 1 0 0 +EDGE2 5785 3024 1.07181 -0.0703042 -3.14048 1 0 1 1 0 0 +EDGE2 5785 3046 0.00712968 0.969038 1.57633 1 0 1 1 0 0 +EDGE2 5785 1126 -0.000198642 0.985304 1.6063 1 0 1 1 0 0 +EDGE2 5785 1146 -0.0548391 1.08795 1.57535 1 0 1 1 0 0 +EDGE2 5785 3026 0.0495628 1.07104 1.52103 1 0 1 1 0 0 +EDGE2 5785 1106 -0.0269128 0.998288 1.56928 1 0 1 1 0 0 +EDGE2 5785 5784 -1.08288 0.0466073 0.0217467 1 0 1 1 0 0 +EDGE2 5785 1145 -0.0859285 -0.00930973 -0.000612331 1 0 1 1 0 0 +EDGE2 5785 3045 -0.0872379 -0.00292062 -0.0218259 1 0 1 1 0 0 +EDGE2 5785 3505 -0.159749 -0.0596411 -3.14433 1 0 1 1 0 0 +EDGE2 5785 3025 -0.0356738 -0.111139 -3.13578 1 0 1 1 0 0 +EDGE2 5785 1105 0.0224492 0.0017063 0.0341946 1 0 1 1 0 0 +EDGE2 5785 1125 -0.0325434 -0.0808742 0.00105063 1 0 1 1 0 0 +EDGE2 5785 1124 -0.949305 0.0810353 0.00378822 1 0 1 1 0 0 +EDGE2 5785 1144 -0.987441 0.0381347 -0.0343812 1 0 1 1 0 0 +EDGE2 5785 3044 -1.07318 -0.0647052 0.0227028 1 0 1 1 0 0 +EDGE2 5785 1104 -1.01313 0.0343761 0.00318807 1 0 1 1 0 0 +EDGE2 5785 3506 -0.038079 -0.893027 -1.54762 1 0 1 1 0 0 +EDGE2 5786 3027 0.969539 -0.0221937 0.0100915 1 0 1 1 0 0 +EDGE2 5786 3047 1.0647 -0.00710739 0.0130525 1 0 1 1 0 0 +EDGE2 5786 1127 1.02796 -0.0105091 -0.00383938 1 0 1 1 0 0 +EDGE2 5786 1147 0.987881 -0.0598058 0.0303767 1 0 1 1 0 0 +EDGE2 5786 1107 1.04427 -0.0485172 -0.00608583 1 0 1 1 0 0 +EDGE2 5786 3046 0.0307762 0.0157779 -0.00252327 1 0 1 1 0 0 +EDGE2 5786 1126 0.0458881 0.0134768 -0.0221517 1 0 1 1 0 0 +EDGE2 5786 1146 -0.0114814 0.00880725 0.00283665 1 0 1 1 0 0 +EDGE2 5786 3026 0.04457 -0.0103869 -0.0188595 1 0 1 1 0 0 +EDGE2 5786 1106 -0.0896801 -0.0550329 0.0216974 1 0 1 1 0 0 +EDGE2 5786 1145 -1.0081 -0.10236 -1.55014 1 0 1 1 0 0 +EDGE2 5786 3045 -0.978571 -0.0163429 -1.59023 1 0 1 1 0 0 +EDGE2 5786 3505 -0.995469 0.0622206 1.57013 1 0 1 1 0 0 +EDGE2 5786 5785 -0.969395 0.0601262 -1.59971 1 0 1 1 0 0 +EDGE2 5786 3025 -1.03036 0.0369564 1.57458 1 0 1 1 0 0 +EDGE2 5786 1105 -0.96741 -0.000539596 -1.58867 1 0 1 1 0 0 +EDGE2 5786 1125 -1.01801 0.0176006 -1.55325 1 0 1 1 0 0 +EDGE2 5787 3027 -0.0169172 0.0817986 -0.00805036 1 0 1 1 0 0 +EDGE2 5787 3048 1.02684 0.0655219 0.0158583 1 0 1 1 0 0 +EDGE2 5787 3028 0.991329 -0.0596546 0.0346082 1 0 1 1 0 0 +EDGE2 5787 1108 0.989248 0.0156889 0.0086202 1 0 1 1 0 0 +EDGE2 5787 1128 1.06356 -0.0156307 0.00927848 1 0 1 1 0 0 +EDGE2 5787 1148 1.08117 -0.00358876 -0.00251339 1 0 1 1 0 0 +EDGE2 5787 3047 -0.0127613 0.0151346 0.0109569 1 0 1 1 0 0 +EDGE2 5787 1127 -0.00297504 -0.0463747 -0.0149414 1 0 1 1 0 0 +EDGE2 5787 1147 -0.0511359 -0.0395428 0.0266994 1 0 1 1 0 0 +EDGE2 5787 1107 -0.0128455 -0.0846175 0.00709571 1 0 1 1 0 0 +EDGE2 5787 3046 -1.11943 -0.0708139 0.00257245 1 0 1 1 0 0 +EDGE2 5787 5786 -0.960919 -0.146706 0.00741887 1 0 1 1 0 0 +EDGE2 5787 1126 -0.940694 -0.0317779 0.0160223 1 0 1 1 0 0 +EDGE2 5787 1146 -0.854687 -0.0447367 0.00215224 1 0 1 1 0 0 +EDGE2 5787 3026 -1.04602 0.010759 0.0059545 1 0 1 1 0 0 +EDGE2 5787 1106 -0.964428 -0.0117282 0.0144558 1 0 1 1 0 0 +EDGE2 5788 3027 -0.87091 0.01325 0.0194598 1 0 1 1 0 0 +EDGE2 5788 3048 0.0145382 -0.0744374 0.033594 1 0 1 1 0 0 +EDGE2 5788 1109 1.04759 0.0112165 -0.00694464 1 0 1 1 0 0 +EDGE2 5788 1149 1.09245 -0.00672455 -0.022794 1 0 1 1 0 0 +EDGE2 5788 3029 1.03506 -0.0659904 -0.0156151 1 0 1 1 0 0 +EDGE2 5788 3049 1.03994 0.00117497 0.0401816 1 0 1 1 0 0 +EDGE2 5788 1129 0.981126 0.0360956 0.0134228 1 0 1 1 0 0 +EDGE2 5788 3028 0.0665222 0.0507567 0.00508069 1 0 1 1 0 0 +EDGE2 5788 1108 -0.0222478 -0.0459138 0.0147434 1 0 1 1 0 0 +EDGE2 5788 1128 0.0654702 0.000759567 -0.00723736 1 0 1 1 0 0 +EDGE2 5788 1148 0.0187827 0.0259599 -0.0253563 1 0 1 1 0 0 +EDGE2 5788 5787 -1.06368 -0.0479735 -0.0178326 1 0 1 1 0 0 +EDGE2 5788 3047 -1.00905 0.0455251 -0.00787706 1 0 1 1 0 0 +EDGE2 5788 1127 -1.00796 0.0626649 0.0218713 1 0 1 1 0 0 +EDGE2 5788 1147 -0.984681 -0.00340504 -0.0302753 1 0 1 1 0 0 +EDGE2 5788 1107 -0.902419 0.0107514 -0.0462911 1 0 1 1 0 0 +EDGE2 5789 3050 0.995657 0.0742525 0.00311352 1 0 1 1 0 0 +EDGE2 5789 3170 0.998214 -0.011824 -3.14998 1 0 1 1 0 0 +EDGE2 5789 3490 1.02528 -0.047411 -3.15071 1 0 1 1 0 0 +EDGE2 5789 3110 0.985482 0.0449769 -3.14715 1 0 1 1 0 0 +EDGE2 5789 3130 0.990735 0.00832628 -3.16106 1 0 1 1 0 0 +EDGE2 5789 3090 1.03216 -0.0397517 -3.1061 1 0 1 1 0 0 +EDGE2 5789 3048 -1.01861 0.111027 -0.00247102 1 0 1 1 0 0 +EDGE2 5789 1130 1.01453 0.063551 -0.017071 1 0 1 1 0 0 +EDGE2 5789 1170 0.926644 -0.0388625 -3.1395 1 0 1 1 0 0 +EDGE2 5789 1190 1.05261 0.0651848 -3.09893 1 0 1 1 0 0 +EDGE2 5789 3030 1.00859 -0.0175239 -0.00845923 1 0 1 1 0 0 +EDGE2 5789 1150 0.989475 -0.0674556 -0.0215733 1 0 1 1 0 0 +EDGE2 5789 1110 0.936845 0.0368211 -0.0132957 1 0 1 1 0 0 +EDGE2 5789 1109 -0.0583763 0.00231287 -0.0111337 1 0 1 1 0 0 +EDGE2 5789 1149 0.0356191 -0.049476 -0.000981894 1 0 1 1 0 0 +EDGE2 5789 3029 -0.050387 0.0639669 0.0253612 1 0 1 1 0 0 +EDGE2 5789 3049 -0.0212398 0.00465295 -0.0102235 1 0 1 1 0 0 +EDGE2 5789 1129 0.128909 -0.0387164 -0.0145395 1 0 1 1 0 0 +EDGE2 5789 5788 -0.9905 0.0285061 0.0127572 1 0 1 1 0 0 +EDGE2 5789 3028 -0.968163 -0.0285698 -0.0100057 1 0 1 1 0 0 +EDGE2 5789 1108 -1.01922 -0.0442611 -0.00113759 1 0 1 1 0 0 +EDGE2 5789 1128 -1.08883 0.00335769 -0.0327181 1 0 1 1 0 0 +EDGE2 5789 1148 -1.00365 0.0335785 -0.0184927 1 0 1 1 0 0 +EDGE2 5790 3109 1.00611 -0.038404 -3.15664 1 0 1 1 0 0 +EDGE2 5790 3169 0.949083 -0.0469906 -3.14473 1 0 1 1 0 0 +EDGE2 5790 3489 1.01432 0.0184364 -3.14297 1 0 1 1 0 0 +EDGE2 5790 3129 0.935167 -0.00900245 -3.1738 1 0 1 1 0 0 +EDGE2 5790 1189 0.978559 -0.042023 -3.1483 1 0 1 1 0 0 +EDGE2 5790 3089 1.01624 -0.101249 -3.1622 1 0 1 1 0 0 +EDGE2 5790 1169 0.984064 0.00437128 -3.13982 1 0 1 1 0 0 +EDGE2 5790 3050 0.0267955 0.048369 -0.0191271 1 0 1 1 0 0 +EDGE2 5790 3131 0.0149793 -1.01896 -1.55079 1 0 1 1 0 0 +EDGE2 5790 3491 0.0683994 -0.993529 -1.5863 1 0 1 1 0 0 +EDGE2 5790 3171 -0.0154521 -1.00929 -1.57674 1 0 1 1 0 0 +EDGE2 5790 1151 0.00724067 -0.949478 -1.56116 1 0 1 1 0 0 +EDGE2 5790 1191 0.0943266 -1.02754 -1.57394 1 0 1 1 0 0 +EDGE2 5790 3091 0.0270639 -0.997524 -1.56291 1 0 1 1 0 0 +EDGE2 5790 3111 0.0383553 -0.878305 -1.54987 1 0 1 1 0 0 +EDGE2 5790 1171 0.0468553 -0.998949 -1.5658 1 0 1 1 0 0 +EDGE2 5790 3170 -0.0213304 -0.0776773 -3.14761 1 0 1 1 0 0 +EDGE2 5790 3490 0.0565151 -0.00561576 -3.13606 1 0 1 1 0 0 +EDGE2 5790 3110 0.123339 0.0147303 -3.0997 1 0 1 1 0 0 +EDGE2 5790 3130 -0.00185372 -0.0437985 -3.14194 1 0 1 1 0 0 +EDGE2 5790 3090 0.042559 -0.0853401 -3.12695 1 0 1 1 0 0 +EDGE2 5790 5789 -1.02398 -0.0138737 -0.019013 1 0 1 1 0 0 +EDGE2 5790 1130 -0.00405548 -0.0892562 -0.0233811 1 0 1 1 0 0 +EDGE2 5790 1170 0.0518675 0.0736979 -3.14405 1 0 1 1 0 0 +EDGE2 5790 1190 0.0416005 0.0762569 -3.13571 1 0 1 1 0 0 +EDGE2 5790 3030 -0.0326819 0.0624373 0.00735701 1 0 1 1 0 0 +EDGE2 5790 1150 0.0836883 0.100416 -0.0343275 1 0 1 1 0 0 +EDGE2 5790 1110 0.0603869 -0.0867965 -0.0333996 1 0 1 1 0 0 +EDGE2 5790 1109 -1.00692 -0.00390911 -0.0225093 1 0 1 1 0 0 +EDGE2 5790 1149 -1.01083 -0.0599253 -0.00117231 1 0 1 1 0 0 +EDGE2 5790 3029 -0.96845 -0.0261321 -0.00869587 1 0 1 1 0 0 +EDGE2 5790 3049 -1.03436 0.051622 0.00635252 1 0 1 1 0 0 +EDGE2 5790 1129 -1.05386 -0.0257394 -0.0190975 1 0 1 1 0 0 +EDGE2 5790 1111 0.0142681 1.06056 1.55329 1 0 1 1 0 0 +EDGE2 5790 3031 0.0539913 0.951107 1.54821 1 0 1 1 0 0 +EDGE2 5790 3051 -0.0875401 0.895334 1.57495 1 0 1 1 0 0 +EDGE2 5790 1131 0.0803119 0.902266 1.58198 1 0 1 1 0 0 +EDGE2 5791 3050 -0.992907 -0.00982634 -1.60756 1 0 1 1 0 0 +EDGE2 5791 3170 -0.979734 0.107993 1.58479 1 0 1 1 0 0 +EDGE2 5791 5790 -0.962253 0.00971118 -1.56426 1 0 1 1 0 0 +EDGE2 5791 3490 -0.970704 -0.010287 1.55355 1 0 1 1 0 0 +EDGE2 5791 3110 -0.915885 -0.0301099 1.60032 1 0 1 1 0 0 +EDGE2 5791 3130 -1.14143 -0.0512403 1.56275 1 0 1 1 0 0 +EDGE2 5791 3090 -0.995292 -0.0178856 1.56549 1 0 1 1 0 0 +EDGE2 5791 1130 -0.983767 0.013307 -1.55704 1 0 1 1 0 0 +EDGE2 5791 1170 -0.963102 0.0172701 1.57908 1 0 1 1 0 0 +EDGE2 5791 1190 -0.956343 0.0633194 1.57792 1 0 1 1 0 0 +EDGE2 5791 3030 -1.00915 -0.00337341 -1.58567 1 0 1 1 0 0 +EDGE2 5791 1150 -0.952467 -0.0462202 -1.58823 1 0 1 1 0 0 +EDGE2 5791 1110 -1.03139 0.043116 -1.56421 1 0 1 1 0 0 +EDGE2 5791 3052 0.987939 -0.00975332 -0.0137663 1 0 1 1 0 0 +EDGE2 5791 1111 -0.0174698 0.0369132 -0.0362322 1 0 1 1 0 0 +EDGE2 5791 3031 -0.0262632 -0.0370994 0.0216196 1 0 1 1 0 0 +EDGE2 5791 3051 -0.0252204 0.0501588 -0.000951565 1 0 1 1 0 0 +EDGE2 5791 1131 0.0349891 0.0569402 -0.0176706 1 0 1 1 0 0 +EDGE2 5791 1112 1.06406 0.0251227 0.0140428 1 0 1 1 0 0 +EDGE2 5791 1132 1.07452 0.0554756 0.0256807 1 0 1 1 0 0 +EDGE2 5791 3032 0.981992 0.0799401 -0.00306674 1 0 1 1 0 0 +EDGE2 5792 1133 1.00187 0.00214653 0.00144896 1 0 1 1 0 0 +EDGE2 5792 3052 0.0735333 0.0390321 0.00890771 1 0 1 1 0 0 +EDGE2 5792 1111 -0.95104 -0.0465381 -0.014026 1 0 1 1 0 0 +EDGE2 5792 3031 -1.01615 -0.0269659 -0.0284647 1 0 1 1 0 0 +EDGE2 5792 3051 -1.03222 0.00930122 -0.00978173 1 0 1 1 0 0 +EDGE2 5792 5791 -0.857185 -0.0298674 -5.15535e-05 1 0 1 1 0 0 +EDGE2 5792 1131 -0.985479 -0.0148175 -0.0280352 1 0 1 1 0 0 +EDGE2 5792 1112 0.0567258 -0.00354681 0.00932326 1 0 1 1 0 0 +EDGE2 5792 1132 0.0490587 0.0153644 -0.00386634 1 0 1 1 0 0 +EDGE2 5792 3032 0.011011 -0.0230634 0.00691368 1 0 1 1 0 0 +EDGE2 5792 3053 1.00994 -0.0606255 -0.0298498 1 0 1 1 0 0 +EDGE2 5792 3033 0.997429 0.0351163 0.0287152 1 0 1 1 0 0 +EDGE2 5792 1113 0.973081 -0.0784487 -0.00367469 1 0 1 1 0 0 +EDGE2 5793 1133 0.00533666 0.0638285 -0.0329565 1 0 1 1 0 0 +EDGE2 5793 3052 -1.06315 0.00625199 -0.0117059 1 0 1 1 0 0 +EDGE2 5793 5792 -1.10534 -0.0214386 -0.00111503 1 0 1 1 0 0 +EDGE2 5793 1112 -0.979272 -0.109653 -0.0182419 1 0 1 1 0 0 +EDGE2 5793 1132 -1.01192 0.0180207 0.00687885 1 0 1 1 0 0 +EDGE2 5793 3032 -1.06714 -0.0672049 0.0285199 1 0 1 1 0 0 +EDGE2 5793 3053 0.00532382 -0.0316755 0.0403142 1 0 1 1 0 0 +EDGE2 5793 3033 0.0036569 -0.025263 0.00631438 1 0 1 1 0 0 +EDGE2 5793 1113 0.0341096 -0.0549257 -0.0132312 1 0 1 1 0 0 +EDGE2 5793 1134 0.998063 -0.00708469 -0.00441011 1 0 1 1 0 0 +EDGE2 5793 3034 0.905586 0.0716001 -0.00661629 1 0 1 1 0 0 +EDGE2 5793 3054 1.04156 0.0185699 0.0264814 1 0 1 1 0 0 +EDGE2 5793 1114 0.940866 0.00448721 0.00418395 1 0 1 1 0 0 +EDGE2 5794 1133 -0.970758 0.0601556 -0.00311572 1 0 1 1 0 0 +EDGE2 5794 3053 -1.04779 -0.0314783 0.00222199 1 0 1 1 0 0 +EDGE2 5794 5793 -0.999076 0.0250384 -0.00200498 1 0 1 1 0 0 +EDGE2 5794 3033 -0.99832 -0.0135169 0.0287519 1 0 1 1 0 0 +EDGE2 5794 1113 -0.965156 -0.0227783 0.0114836 1 0 1 1 0 0 +EDGE2 5794 1134 -0.0512034 -0.0308728 -0.0176283 1 0 1 1 0 0 +EDGE2 5794 3034 0.0143794 0.0559616 0.0224367 1 0 1 1 0 0 +EDGE2 5794 3054 -0.0216278 -0.0674924 0.000453957 1 0 1 1 0 0 +EDGE2 5794 1114 -0.0600221 0.0154625 0.000315385 1 0 1 1 0 0 +EDGE2 5794 3035 0.917944 -0.135786 -0.00764286 1 0 1 1 0 0 +EDGE2 5794 3055 0.933449 0.0842148 0.0151863 1 0 1 1 0 0 +EDGE2 5794 1095 1.11108 -0.0368591 -3.15562 1 0 1 1 0 0 +EDGE2 5794 1115 1.06416 0.0850726 0.0167899 1 0 1 1 0 0 +EDGE2 5794 1135 0.969232 0.0402946 -0.0246951 1 0 1 1 0 0 +EDGE2 5795 3056 -0.0487615 -1.02488 -1.56996 1 0 1 1 0 0 +EDGE2 5795 5794 -1.01546 -0.0291625 -0.00847492 1 0 1 1 0 0 +EDGE2 5795 1134 -0.962294 -0.0208051 0.00189894 1 0 1 1 0 0 +EDGE2 5795 3034 -0.960865 0.0507964 0.0159471 1 0 1 1 0 0 +EDGE2 5795 3054 -0.991357 0.0246889 0.0294995 1 0 1 1 0 0 +EDGE2 5795 1114 -1.04185 0.00198611 0.0348696 1 0 1 1 0 0 +EDGE2 5795 3035 -0.00608517 -0.021729 -0.00287249 1 0 1 1 0 0 +EDGE2 5795 3055 -0.0818183 0.0367917 0.0143119 1 0 1 1 0 0 +EDGE2 5795 1095 0.0327244 -0.0303043 -3.1734 1 0 1 1 0 0 +EDGE2 5795 1115 0.0246981 0.00631864 -0.0280241 1 0 1 1 0 0 +EDGE2 5795 1135 -0.0454348 0.0428436 -0.00835347 1 0 1 1 0 0 +EDGE2 5795 1094 0.97626 0.013919 -3.14559 1 0 1 1 0 0 +EDGE2 5795 1116 0.00688281 0.949963 1.53549 1 0 1 1 0 0 +EDGE2 5795 3036 0.0400475 1.002 1.54246 1 0 1 1 0 0 +EDGE2 5795 1136 0.0110392 0.983811 1.57895 1 0 1 1 0 0 +EDGE2 5795 1096 0.174465 1.06105 1.58056 1 0 1 1 0 0 +EDGE2 5796 5795 -1.07018 -0.0320498 -1.5838 1 0 1 1 0 0 +EDGE2 5796 3035 -0.990628 -0.0270245 -1.56851 1 0 1 1 0 0 +EDGE2 5796 3055 -0.981832 -0.0131589 -1.57489 1 0 1 1 0 0 +EDGE2 5796 1095 -0.938951 -0.0145294 1.57208 1 0 1 1 0 0 +EDGE2 5796 1115 -1.01239 -0.028731 -1.54577 1 0 1 1 0 0 +EDGE2 5796 1135 -1.00628 0.095966 -1.58018 1 0 1 1 0 0 +EDGE2 5796 1116 0.012401 0.0599396 0.00337402 1 0 1 1 0 0 +EDGE2 5796 3036 0.025469 0.036071 -0.0422358 1 0 1 1 0 0 +EDGE2 5796 1136 0.0665719 0.0274074 -0.00752535 1 0 1 1 0 0 +EDGE2 5796 1096 -0.00228863 0.0526825 0.0632706 1 0 1 1 0 0 +EDGE2 5796 1097 0.976905 -0.0659088 0.000147259 1 0 1 1 0 0 +EDGE2 5796 1137 1.06798 -0.0643816 -0.00502091 1 0 1 1 0 0 +EDGE2 5796 3037 1.04107 -0.0698125 -0.00390248 1 0 1 1 0 0 +EDGE2 5796 1117 1.0126 -0.0664425 0.02533 1 0 1 1 0 0 +EDGE2 5797 1118 0.941048 -0.0361425 -0.000322059 1 0 1 1 0 0 +EDGE2 5797 1116 -1.12061 0.0653338 -0.0151822 1 0 1 1 0 0 +EDGE2 5797 3036 -1.10558 0.102195 -0.00406143 1 0 1 1 0 0 +EDGE2 5797 5796 -1.01427 0.0086342 0.0383656 1 0 1 1 0 0 +EDGE2 5797 1136 -1.01958 0.0341676 -0.0205335 1 0 1 1 0 0 +EDGE2 5797 1096 -1.01348 -0.0361956 -0.0132973 1 0 1 1 0 0 +EDGE2 5797 1097 0.0355435 -0.0706063 -0.00126165 1 0 1 1 0 0 +EDGE2 5797 1137 -0.0372844 0.0195631 0.0217845 1 0 1 1 0 0 +EDGE2 5797 3037 -0.0327618 -0.044245 -0.0024638 1 0 1 1 0 0 +EDGE2 5797 1117 0.0606951 -0.0594347 -0.0182417 1 0 1 1 0 0 +EDGE2 5797 3038 0.933148 0.00617348 -0.0200324 1 0 1 1 0 0 +EDGE2 5797 1138 1.09556 -0.0155798 0.0238169 1 0 1 1 0 0 +EDGE2 5797 1098 0.968603 0.0571346 -0.0375014 1 0 1 1 0 0 +EDGE2 5798 1118 -0.14588 -0.00592876 0.000919051 1 0 1 1 0 0 +EDGE2 5798 1097 -0.975077 0.0380195 -0.0358957 1 0 1 1 0 0 +EDGE2 5798 1137 -0.988421 -0.062324 -0.00471505 1 0 1 1 0 0 +EDGE2 5798 3037 -1.03544 0.0222619 -0.0100416 1 0 1 1 0 0 +EDGE2 5798 5797 -1.02002 -0.00141232 -0.0177404 1 0 1 1 0 0 +EDGE2 5798 1117 -1.00429 0.0347418 0.00679684 1 0 1 1 0 0 +EDGE2 5798 3038 0.0176775 -0.0556233 -0.023804 1 0 1 1 0 0 +EDGE2 5798 1138 0.00186733 -0.0762432 -0.0333355 1 0 1 1 0 0 +EDGE2 5798 1139 1.00017 -0.056224 0.0133907 1 0 1 1 0 0 +EDGE2 5798 1098 0.0678531 -0.0383565 0.0489189 1 0 1 1 0 0 +EDGE2 5798 3039 0.985652 0.00637288 -0.0095553 1 0 1 1 0 0 +EDGE2 5798 1099 0.928167 -0.0277554 -0.0117859 1 0 1 1 0 0 +EDGE2 5798 1119 0.93809 0.0542868 0.0226778 1 0 1 1 0 0 +EDGE2 5799 5780 1.02944 0.0517251 -3.15186 1 0 1 1 0 0 +EDGE2 5799 1118 -1.06698 -0.0569022 -0.0251865 1 0 1 1 0 0 +EDGE2 5799 3038 -1.01103 0.0143862 -0.0124077 1 0 1 1 0 0 +EDGE2 5799 5798 -0.982738 0.0254064 -0.0122625 1 0 1 1 0 0 +EDGE2 5799 1138 -1.01739 -0.0524549 0.0328057 1 0 1 1 0 0 +EDGE2 5799 1139 -0.0288282 0.0206782 -0.00574568 1 0 1 1 0 0 +EDGE2 5799 1098 -1.05539 -0.0269509 -0.0145415 1 0 1 1 0 0 +EDGE2 5799 3039 -0.0102597 -0.0236878 0.0130445 1 0 1 1 0 0 +EDGE2 5799 1099 0.0294151 -0.0423845 -0.0146163 1 0 1 1 0 0 +EDGE2 5799 1119 0.00262314 0.0410719 -0.00104317 1 0 1 1 0 0 +EDGE2 5799 1100 0.974641 -0.0552485 -0.00550317 1 0 1 1 0 0 +EDGE2 5799 1140 0.958276 -0.030735 -0.00372728 1 0 1 1 0 0 +EDGE2 5799 3040 0.974646 0.0234632 -0.035899 1 0 1 1 0 0 +EDGE2 5799 5660 0.987967 -0.0122537 -3.12843 1 0 1 1 0 0 +EDGE2 5799 1120 1.03893 -0.0616684 0.0211339 1 0 1 1 0 0 +EDGE2 5800 5780 -0.036396 -0.0453306 -3.11251 1 0 1 1 0 0 +EDGE2 5800 1139 -1.0768 0.0227055 -0.0481731 1 0 1 1 0 0 +EDGE2 5800 5799 -1.00522 -0.0159401 0.0135577 1 0 1 1 0 0 +EDGE2 5800 3039 -1.03871 0.017623 -0.0136377 1 0 1 1 0 0 +EDGE2 5800 1099 -1.0295 0.0269268 -0.017526 1 0 1 1 0 0 +EDGE2 5800 1119 -0.976217 0.0191867 -0.0503126 1 0 1 1 0 0 +EDGE2 5800 1121 0.067866 0.971487 1.58619 1 0 1 1 0 0 +EDGE2 5800 3041 0.0289275 1.05694 1.56063 1 0 1 1 0 0 +EDGE2 5800 5781 -0.0795369 1.07202 1.60935 1 0 1 1 0 0 +EDGE2 5800 1141 0.0184716 0.937392 1.55511 1 0 1 1 0 0 +EDGE2 5800 1101 -0.0452513 1.05623 1.57395 1 0 1 1 0 0 +EDGE2 5800 1100 -0.0108887 -0.0273332 0.00861396 1 0 1 1 0 0 +EDGE2 5800 1140 -0.0391825 -0.110017 0.00796344 1 0 1 1 0 0 +EDGE2 5800 3040 0.0637762 0.0315062 0.00390588 1 0 1 1 0 0 +EDGE2 5800 5660 0.00740488 -0.0926295 -3.13437 1 0 1 1 0 0 +EDGE2 5800 1120 -0.056182 0.127596 0.0312248 1 0 1 1 0 0 +EDGE2 5800 5661 0.0576434 -1.01364 -1.53463 1 0 1 1 0 0 +EDGE2 5800 5659 0.929229 0.0217993 -3.13674 1 0 1 1 0 0 +EDGE2 5800 5779 1.06396 -0.00951628 -3.14235 1 0 1 1 0 0 +EDGE2 5801 5780 -1.08328 0.0170305 1.56769 1 0 1 1 0 0 +EDGE2 5801 3042 1.12246 0.0707711 0.0168492 1 0 1 1 0 0 +EDGE2 5801 5782 0.98252 0.0802634 -0.0136386 1 0 1 1 0 0 +EDGE2 5801 1102 0.888709 0.0302491 -0.00287025 1 0 1 1 0 0 +EDGE2 5801 1122 0.989296 0.0720334 -0.0449058 1 0 1 1 0 0 +EDGE2 5801 1142 0.976943 -0.00786181 -0.00106732 1 0 1 1 0 0 +EDGE2 5801 1121 0.0771821 -0.00650932 -0.00730637 1 0 1 1 0 0 +EDGE2 5801 3041 -0.0404272 -0.0433343 0.00350053 1 0 1 1 0 0 +EDGE2 5801 5781 -0.0434142 0.0431839 0.00887177 1 0 1 1 0 0 +EDGE2 5801 1141 0.076687 -0.0384563 0.0422191 1 0 1 1 0 0 +EDGE2 5801 1101 0.0661698 0.0562228 0.000717177 1 0 1 1 0 0 +EDGE2 5801 5800 -0.961844 0.0103612 -1.55797 1 0 1 1 0 0 +EDGE2 5801 1100 -0.974602 0.0752881 -1.58062 1 0 1 1 0 0 +EDGE2 5801 1140 -1.04781 -0.0513403 -1.58141 1 0 1 1 0 0 +EDGE2 5801 3040 -1.04347 0.0150402 -1.52724 1 0 1 1 0 0 +EDGE2 5801 5660 -1.10528 -0.0675629 1.59143 1 0 1 1 0 0 +EDGE2 5801 1120 -1.06152 -0.0138554 -1.55533 1 0 1 1 0 0 +EDGE2 5802 1123 0.985113 0.0291417 0.0422167 1 0 1 1 0 0 +EDGE2 5802 3043 1.00794 -0.0423495 0.00393973 1 0 1 1 0 0 +EDGE2 5802 5783 1.13715 -0.057612 0.0171061 1 0 1 1 0 0 +EDGE2 5802 1143 1.03152 0.0617196 0.00487638 1 0 1 1 0 0 +EDGE2 5802 3042 0.0386966 0.0945041 0.0317064 1 0 1 1 0 0 +EDGE2 5802 1103 0.911982 -0.0293667 -0.0157 1 0 1 1 0 0 +EDGE2 5802 5782 0.113226 -0.0301062 -0.00630456 1 0 1 1 0 0 +EDGE2 5802 1102 -0.0676171 0.0384779 -0.01999 1 0 1 1 0 0 +EDGE2 5802 1122 0.0126648 0.00352717 0.0211935 1 0 1 1 0 0 +EDGE2 5802 1142 -0.0714102 -0.0607481 -0.0271043 1 0 1 1 0 0 +EDGE2 5802 1121 -0.96306 0.04746 0.019763 1 0 1 1 0 0 +EDGE2 5802 3041 -1.07189 0.13996 -0.00176078 1 0 1 1 0 0 +EDGE2 5802 5781 -0.969159 -0.0101568 -0.00299407 1 0 1 1 0 0 +EDGE2 5802 5801 -1.03865 -0.0101698 -0.00754241 1 0 1 1 0 0 +EDGE2 5802 1141 -1.03028 0.0188115 0.0111389 1 0 1 1 0 0 +EDGE2 5802 1101 -1.10359 0.0184631 0.0139389 1 0 1 1 0 0 +EDGE2 5803 1123 0.0745358 -0.0291005 -0.0126556 1 0 1 1 0 0 +EDGE2 5803 5784 1.03729 0.0548593 0.0322284 1 0 1 1 0 0 +EDGE2 5803 1124 0.886925 -0.115335 -0.0396738 1 0 1 1 0 0 +EDGE2 5803 1144 1.00075 0.00116216 0.0044304 1 0 1 1 0 0 +EDGE2 5803 3044 1.02377 0.0394755 0.0136432 1 0 1 1 0 0 +EDGE2 5803 1104 1.10619 0.014414 0.00923579 1 0 1 1 0 0 +EDGE2 5803 3043 -0.0474878 -0.00446884 -0.0220774 1 0 1 1 0 0 +EDGE2 5803 5783 -0.0750428 -0.0503145 0.0432691 1 0 1 1 0 0 +EDGE2 5803 1143 0.0735156 -0.0513683 -0.0388827 1 0 1 1 0 0 +EDGE2 5803 3042 -0.993781 -0.0294752 0.068962 1 0 1 1 0 0 +EDGE2 5803 5802 -1.01787 0.080946 0.0064925 1 0 1 1 0 0 +EDGE2 5803 1103 0.000783718 -0.00629618 0.0159937 1 0 1 1 0 0 +EDGE2 5803 5782 -1.09851 -0.00239004 0.00964372 1 0 1 1 0 0 +EDGE2 5803 1102 -0.956493 0.0403268 0.00551447 1 0 1 1 0 0 +EDGE2 5803 1122 -1.0474 0.0145517 0.033634 1 0 1 1 0 0 +EDGE2 5803 1142 -1.0017 0.000607017 -0.00734016 1 0 1 1 0 0 +EDGE2 5804 1123 -1.05541 -0.027289 -0.00167528 1 0 1 1 0 0 +EDGE2 5804 5784 0.0314567 -0.0752461 -0.00490428 1 0 1 1 0 0 +EDGE2 5804 1145 0.965194 -0.0404261 -0.0418653 1 0 1 1 0 0 +EDGE2 5804 3045 0.96389 0.102439 -0.0358645 1 0 1 1 0 0 +EDGE2 5804 3505 0.983897 0.0450495 -3.12836 1 0 1 1 0 0 +EDGE2 5804 5785 0.911261 0.0354593 0.000372761 1 0 1 1 0 0 +EDGE2 5804 3025 1.01817 0.00240041 -3.13032 1 0 1 1 0 0 +EDGE2 5804 1105 1.05324 -0.12621 0.0216228 1 0 1 1 0 0 +EDGE2 5804 1125 1.04483 -0.00553785 -0.0173663 1 0 1 1 0 0 +EDGE2 5804 1124 0.0047089 0.00138959 -0.000425058 1 0 1 1 0 0 +EDGE2 5804 1144 0.0161204 -0.070763 -0.00992886 1 0 1 1 0 0 +EDGE2 5804 3044 0.0282126 -0.0940628 0.0357694 1 0 1 1 0 0 +EDGE2 5804 1104 0.0667851 -0.00393974 -0.0221493 1 0 1 1 0 0 +EDGE2 5804 3043 -1.03468 -0.0316759 -0.0379923 1 0 1 1 0 0 +EDGE2 5804 5783 -0.942158 -0.000813774 -0.0107768 1 0 1 1 0 0 +EDGE2 5804 5803 -1.04254 0.00499488 -0.00902844 1 0 1 1 0 0 +EDGE2 5804 1143 -0.947389 0.000243325 0.0212599 1 0 1 1 0 0 +EDGE2 5804 1103 -0.977245 -0.0715046 -0.0104722 1 0 1 1 0 0 +EDGE2 5805 3504 0.966898 0.036552 -3.14193 1 0 1 1 0 0 +EDGE2 5805 3024 1.00492 -0.0474605 -3.121 1 0 1 1 0 0 +EDGE2 5805 3046 -0.00531113 0.975532 1.56344 1 0 1 1 0 0 +EDGE2 5805 5786 0.0331357 0.958955 1.60297 1 0 1 1 0 0 +EDGE2 5805 1126 -0.0189947 0.929021 1.57737 1 0 1 1 0 0 +EDGE2 5805 1146 -0.0702573 0.958371 1.56781 1 0 1 1 0 0 +EDGE2 5805 3026 -0.0640797 0.986117 1.6072 1 0 1 1 0 0 +EDGE2 5805 1106 -0.0373632 0.95742 1.57888 1 0 1 1 0 0 +EDGE2 5805 5784 -1.00847 0.0260401 0.00876033 1 0 1 1 0 0 +EDGE2 5805 1145 0.0807164 -0.0115397 0.0243249 1 0 1 1 0 0 +EDGE2 5805 3045 0.00533647 0.0138581 0.00350332 1 0 1 1 0 0 +EDGE2 5805 3505 -0.0194318 0.0738201 -3.11137 1 0 1 1 0 0 +EDGE2 5805 5785 0.0673045 -0.0002316 -0.0173056 1 0 1 1 0 0 +EDGE2 5805 3025 -0.0191307 -0.00926823 -3.11315 1 0 1 1 0 0 +EDGE2 5805 1105 -0.0226761 0.0415359 0.0171365 1 0 1 1 0 0 +EDGE2 5805 1125 -0.075353 -0.0559841 -0.0202977 1 0 1 1 0 0 +EDGE2 5805 5804 -1.01603 -0.0569096 0.0739798 1 0 1 1 0 0 +EDGE2 5805 1124 -0.977134 0.0250114 -0.0244379 1 0 1 1 0 0 +EDGE2 5805 1144 -0.924705 -0.0577234 0.00772199 1 0 1 1 0 0 +EDGE2 5805 3044 -1.01884 0.036566 -0.0102548 1 0 1 1 0 0 +EDGE2 5805 1104 -1.03251 0.0685606 -1.53753e-05 1 0 1 1 0 0 +EDGE2 5805 3506 0.0276434 -0.927256 -1.5944 1 0 1 1 0 0 +EDGE2 5806 3027 0.981869 0.0045911 0.0220361 1 0 1 1 0 0 +EDGE2 5806 5787 1.02468 0.0455282 0.0288927 1 0 1 1 0 0 +EDGE2 5806 3047 0.961935 0.00235784 -0.00118665 1 0 1 1 0 0 +EDGE2 5806 5805 -0.916995 0.0750316 -1.57856 1 0 1 1 0 0 +EDGE2 5806 1127 0.977654 -0.061025 -0.00671486 1 0 1 1 0 0 +EDGE2 5806 1147 0.985989 -0.072415 -0.0103241 1 0 1 1 0 0 +EDGE2 5806 1107 0.970895 -0.0617124 -0.00444174 1 0 1 1 0 0 +EDGE2 5806 3046 0.00941442 0.0683145 0.00895996 1 0 1 1 0 0 +EDGE2 5806 5786 0.0143201 0.0507804 -0.00748671 1 0 1 1 0 0 +EDGE2 5806 1126 0.0974329 0.0308044 0.0155145 1 0 1 1 0 0 +EDGE2 5806 1146 -0.111539 0.00893252 0.0144287 1 0 1 1 0 0 +EDGE2 5806 3026 0.0110308 0.0816539 0.037831 1 0 1 1 0 0 +EDGE2 5806 1106 -0.00961355 -0.00791328 -0.0185612 1 0 1 1 0 0 +EDGE2 5806 1145 -1.05969 -0.126267 -1.54738 1 0 1 1 0 0 +EDGE2 5806 3045 -1.0418 0.0108416 -1.59956 1 0 1 1 0 0 +EDGE2 5806 3505 -0.968653 0.025112 1.56892 1 0 1 1 0 0 +EDGE2 5806 5785 -1.01645 -0.0432979 -1.57362 1 0 1 1 0 0 +EDGE2 5806 3025 -0.970712 -0.0629025 1.59459 1 0 1 1 0 0 +EDGE2 5806 1105 -0.974703 -0.0101133 -1.59027 1 0 1 1 0 0 +EDGE2 5806 1125 -1.10627 0.00859208 -1.58735 1 0 1 1 0 0 +EDGE2 5807 3027 0.0080061 -0.00238671 -0.00541063 1 0 1 1 0 0 +EDGE2 5807 3048 1.04751 0.0246294 3.95906e-05 1 0 1 1 0 0 +EDGE2 5807 5788 1.01074 0.00917638 0.0272251 1 0 1 1 0 0 +EDGE2 5807 3028 0.893887 0.106779 0.00690121 1 0 1 1 0 0 +EDGE2 5807 1108 1.00764 -0.0390568 0.0190313 1 0 1 1 0 0 +EDGE2 5807 1128 0.940954 0.0215759 0.000841032 1 0 1 1 0 0 +EDGE2 5807 1148 0.970855 0.0108553 0.00624594 1 0 1 1 0 0 +EDGE2 5807 5787 -0.0161348 -0.0196644 -0.0309437 1 0 1 1 0 0 +EDGE2 5807 3047 0.0723058 0.0539386 -0.019645 1 0 1 1 0 0 +EDGE2 5807 1127 -0.0509401 -0.0251243 -0.0180821 1 0 1 1 0 0 +EDGE2 5807 1147 0.00828243 0.00923872 0.000955541 1 0 1 1 0 0 +EDGE2 5807 1107 -0.0693175 0.0585755 0.0115701 1 0 1 1 0 0 +EDGE2 5807 3046 -1.11397 0.0228496 0.0031434 1 0 1 1 0 0 +EDGE2 5807 5806 -0.941712 -0.0232058 -0.02186 1 0 1 1 0 0 +EDGE2 5807 5786 -1.01997 0.00235784 0.0129464 1 0 1 1 0 0 +EDGE2 5807 1126 -1.03469 0.0823176 -0.0176049 1 0 1 1 0 0 +EDGE2 5807 1146 -1.06658 0.0168464 0.0114307 1 0 1 1 0 0 +EDGE2 5807 3026 -0.999344 -0.0177015 -0.0109067 1 0 1 1 0 0 +EDGE2 5807 1106 -1.02943 -0.028196 0.000193521 1 0 1 1 0 0 +EDGE2 5808 3027 -0.998404 0.0428317 -0.0295123 1 0 1 1 0 0 +EDGE2 5808 3048 -0.0234559 0.0122816 -0.0131549 1 0 1 1 0 0 +EDGE2 5808 5789 1.03364 -0.0460728 -0.00698123 1 0 1 1 0 0 +EDGE2 5808 1109 1.04429 -0.0152832 -0.0106032 1 0 1 1 0 0 +EDGE2 5808 1149 1.00486 -0.0801656 0.0159768 1 0 1 1 0 0 +EDGE2 5808 3029 0.967353 -0.0217705 0.0228667 1 0 1 1 0 0 +EDGE2 5808 3049 0.995929 -0.0985821 0.0117179 1 0 1 1 0 0 +EDGE2 5808 1129 1.06924 -0.0272712 0.0221447 1 0 1 1 0 0 +EDGE2 5808 5788 -0.0648073 -0.0664158 0.00320289 1 0 1 1 0 0 +EDGE2 5808 3028 -0.000462832 0.0771577 -0.00545638 1 0 1 1 0 0 +EDGE2 5808 1108 0.0305969 -0.119405 -0.00906469 1 0 1 1 0 0 +EDGE2 5808 1128 -0.0420678 0.0583917 0.00563982 1 0 1 1 0 0 +EDGE2 5808 1148 -0.0573715 0.0469457 -0.0245369 1 0 1 1 0 0 +EDGE2 5808 5787 -0.931956 -0.009982 0.0165079 1 0 1 1 0 0 +EDGE2 5808 5807 -1.05076 -0.0140725 -0.0238076 1 0 1 1 0 0 +EDGE2 5808 3047 -0.944611 -0.0698366 0.0117309 1 0 1 1 0 0 +EDGE2 5808 1127 -0.983258 0.0214202 -0.0239035 1 0 1 1 0 0 +EDGE2 5808 1147 -1.02227 -0.0381676 0.0255481 1 0 1 1 0 0 +EDGE2 5808 1107 -0.992083 -0.0268149 0.00621679 1 0 1 1 0 0 +EDGE2 5809 3050 0.926858 -0.053706 0.00549443 1 0 1 1 0 0 +EDGE2 5809 3170 1.06144 0.0181564 -3.18484 1 0 1 1 0 0 +EDGE2 5809 5790 0.965374 0.0317921 0.0402253 1 0 1 1 0 0 +EDGE2 5809 3490 0.946168 0.0657984 -3.13988 1 0 1 1 0 0 +EDGE2 5809 3110 0.97372 0.0666404 -3.1645 1 0 1 1 0 0 +EDGE2 5809 3130 1.01202 -0.0464048 -3.13587 1 0 1 1 0 0 +EDGE2 5809 3090 0.956312 0.0612229 -3.12332 1 0 1 1 0 0 +EDGE2 5809 3048 -1.07348 0.0238382 -0.00878527 1 0 1 1 0 0 +EDGE2 5809 5789 -0.0401958 -0.0252956 0.00976843 1 0 1 1 0 0 +EDGE2 5809 1130 0.960968 0.022859 -0.00480002 1 0 1 1 0 0 +EDGE2 5809 1170 1.04707 0.0918589 -3.14921 1 0 1 1 0 0 +EDGE2 5809 1190 1.0734 -0.0807026 -3.13893 1 0 1 1 0 0 +EDGE2 5809 3030 1.07008 -0.00213512 0.00766733 1 0 1 1 0 0 +EDGE2 5809 1150 1.00848 -0.0404334 0.0118699 1 0 1 1 0 0 +EDGE2 5809 1110 0.895659 -0.0398227 0.00200915 1 0 1 1 0 0 +EDGE2 5809 1109 0.0152716 -0.0314801 0.00539183 1 0 1 1 0 0 +EDGE2 5809 1149 0.0280857 0.03904 -0.00806958 1 0 1 1 0 0 +EDGE2 5809 3029 0.0607534 0.0473635 0.0136751 1 0 1 1 0 0 +EDGE2 5809 3049 0.00378409 -0.0901298 -0.0538719 1 0 1 1 0 0 +EDGE2 5809 1129 -0.00196707 -0.0395512 -0.00280319 1 0 1 1 0 0 +EDGE2 5809 5808 -0.985122 0.0407252 0.0114461 1 0 1 1 0 0 +EDGE2 5809 5788 -1.02087 0.0687247 -0.000922273 1 0 1 1 0 0 +EDGE2 5809 3028 -0.932377 -0.0121321 -0.00406198 1 0 1 1 0 0 +EDGE2 5809 1108 -0.901085 0.0610552 -0.000686373 1 0 1 1 0 0 +EDGE2 5809 1128 -0.995043 -0.0143539 -0.0129361 1 0 1 1 0 0 +EDGE2 5809 1148 -0.943051 -0.0622281 0.0105032 1 0 1 1 0 0 +EDGE2 5810 3109 0.991518 -0.023098 -3.14673 1 0 1 1 0 0 +EDGE2 5810 3169 1.03455 0.0311271 -3.14699 1 0 1 1 0 0 +EDGE2 5810 3489 1.04606 -0.00925903 -3.11731 1 0 1 1 0 0 +EDGE2 5810 3129 0.991293 -0.0452282 -3.14929 1 0 1 1 0 0 +EDGE2 5810 1189 1.02276 -0.040664 -3.14054 1 0 1 1 0 0 +EDGE2 5810 3089 1.0057 0.00734043 -3.16014 1 0 1 1 0 0 +EDGE2 5810 1169 0.978823 0.0184004 -3.11675 1 0 1 1 0 0 +EDGE2 5810 3050 -0.0531599 0.0442676 -0.0205119 1 0 1 1 0 0 +EDGE2 5810 3131 0.0584822 -1.01916 -1.56294 1 0 1 1 0 0 +EDGE2 5810 3491 -0.0228706 -0.931741 -1.58411 1 0 1 1 0 0 +EDGE2 5810 3171 0.0216293 -0.977672 -1.55927 1 0 1 1 0 0 +EDGE2 5810 1151 0.0124003 -1.08818 -1.56689 1 0 1 1 0 0 +EDGE2 5810 1191 0.0589778 -1.0489 -1.59119 1 0 1 1 0 0 +EDGE2 5810 3091 0.0331161 -1.02038 -1.55047 1 0 1 1 0 0 +EDGE2 5810 3111 0.00200945 -0.976569 -1.57338 1 0 1 1 0 0 +EDGE2 5810 1171 -0.00534234 -0.874385 -1.57263 1 0 1 1 0 0 +EDGE2 5810 3170 0.0171435 0.0555397 -3.16355 1 0 1 1 0 0 +EDGE2 5810 5790 0.034244 -0.0564341 -0.0135826 1 0 1 1 0 0 +EDGE2 5810 3490 -0.067005 -0.052946 -3.13441 1 0 1 1 0 0 +EDGE2 5810 3110 -0.0490606 0.0642742 -3.13882 1 0 1 1 0 0 +EDGE2 5810 3130 0.0192074 0.0388613 -3.12703 1 0 1 1 0 0 +EDGE2 5810 3090 -0.000414475 -0.00933235 -3.15226 1 0 1 1 0 0 +EDGE2 5810 5789 -0.961596 0.00295445 0.0246199 1 0 1 1 0 0 +EDGE2 5810 1130 -0.0724664 0.157313 -0.0101171 1 0 1 1 0 0 +EDGE2 5810 1170 0.0797263 0.0369377 -3.12644 1 0 1 1 0 0 +EDGE2 5810 1190 0.0220254 -0.0424864 -3.13945 1 0 1 1 0 0 +EDGE2 5810 3030 0.108104 -0.00334253 -0.0272288 1 0 1 1 0 0 +EDGE2 5810 1150 -0.0127573 -0.0361085 0.00996859 1 0 1 1 0 0 +EDGE2 5810 1110 0.0275136 -0.0230993 0.0229151 1 0 1 1 0 0 +EDGE2 5810 5809 -0.944328 0.03798 -0.0158905 1 0 1 1 0 0 +EDGE2 5810 1109 -1.03206 -0.00997729 0.0178804 1 0 1 1 0 0 +EDGE2 5810 1149 -1.04479 -0.0275102 -0.0175858 1 0 1 1 0 0 +EDGE2 5810 3029 -1.07417 0.0341852 -0.0179396 1 0 1 1 0 0 +EDGE2 5810 3049 -1.06836 0.0157936 -0.0154274 1 0 1 1 0 0 +EDGE2 5810 1129 -1.0624 -0.0084606 0.00795808 1 0 1 1 0 0 +EDGE2 5810 1111 -0.0239769 0.975591 1.57819 1 0 1 1 0 0 +EDGE2 5810 3031 -0.069641 1.01559 1.61019 1 0 1 1 0 0 +EDGE2 5810 3051 -0.00906185 1.00118 1.58387 1 0 1 1 0 0 +EDGE2 5810 5791 -0.00848222 0.966713 1.57374 1 0 1 1 0 0 +EDGE2 5810 1131 0.0612634 1.02014 1.58063 1 0 1 1 0 0 +EDGE2 5811 3050 -1.03459 -0.137015 1.53197 1 0 1 1 0 0 +EDGE2 5811 3131 0.00321725 -0.0780349 -0.00631666 1 0 1 1 0 0 +EDGE2 5811 3092 0.962477 -0.00351945 -0.0146986 1 0 1 1 0 0 +EDGE2 5811 3132 1.01369 -0.0655715 -0.0291867 1 0 1 1 0 0 +EDGE2 5811 3172 1.00829 0.00578529 -0.0350987 1 0 1 1 0 0 +EDGE2 5811 3492 1.0047 0.0140584 -0.0335509 1 0 1 1 0 0 +EDGE2 5811 3112 1.06974 0.0374483 0.0012496 1 0 1 1 0 0 +EDGE2 5811 1152 0.991271 0.0433317 -0.00244587 1 0 1 1 0 0 +EDGE2 5811 1172 0.988297 -0.138673 0.00748986 1 0 1 1 0 0 +EDGE2 5811 1192 0.960598 -0.0277088 -0.00471841 1 0 1 1 0 0 +EDGE2 5811 3491 -0.0475644 -0.0426352 -0.0067524 1 0 1 1 0 0 +EDGE2 5811 3171 0.0439002 0.0962614 -0.0330034 1 0 1 1 0 0 +EDGE2 5811 1151 -0.0486322 -0.00625259 -0.0485517 1 0 1 1 0 0 +EDGE2 5811 1191 -0.0482737 -0.0483211 -0.00434439 1 0 1 1 0 0 +EDGE2 5811 3091 0.0249666 0.0127176 0.0553404 1 0 1 1 0 0 +EDGE2 5811 3111 -0.0351684 -0.0584349 -0.0107861 1 0 1 1 0 0 +EDGE2 5811 1171 -0.0767522 -0.030088 0.00571732 1 0 1 1 0 0 +EDGE2 5811 3170 -0.990851 -0.104846 -1.54619 1 0 1 1 0 0 +EDGE2 5811 5790 -0.98001 -0.057805 1.58995 1 0 1 1 0 0 +EDGE2 5811 5810 -0.864794 0.00602944 1.57313 1 0 1 1 0 0 +EDGE2 5811 3490 -1.02771 0.077997 -1.57216 1 0 1 1 0 0 +EDGE2 5811 3110 -1.00264 0.0655086 -1.54535 1 0 1 1 0 0 +EDGE2 5811 3130 -0.967304 -0.0438375 -1.54887 1 0 1 1 0 0 +EDGE2 5811 3090 -1.06013 0.0300611 -1.56531 1 0 1 1 0 0 +EDGE2 5811 1130 -1.03572 0.0567428 1.59025 1 0 1 1 0 0 +EDGE2 5811 1170 -1.03094 -0.124528 -1.55187 1 0 1 1 0 0 +EDGE2 5811 1190 -1.03778 0.00345663 -1.57835 1 0 1 1 0 0 +EDGE2 5811 3030 -1.06793 0.0668426 1.6181 1 0 1 1 0 0 +EDGE2 5811 1150 -0.973431 -0.00967713 1.57591 1 0 1 1 0 0 +EDGE2 5811 1110 -0.991821 -0.00677751 1.57024 1 0 1 1 0 0 +EDGE2 5812 1173 0.991535 -0.0275764 -0.0378206 1 0 1 1 0 0 +EDGE2 5812 3133 0.949128 0.0137895 -0.0223085 1 0 1 1 0 0 +EDGE2 5812 3493 0.961314 -0.103531 -0.00432007 1 0 1 1 0 0 +EDGE2 5812 3173 0.869154 0.0215473 0.0243014 1 0 1 1 0 0 +EDGE2 5812 3093 1.0365 -0.102609 0.00585874 1 0 1 1 0 0 +EDGE2 5812 3113 1.00524 0.0253477 -0.0118192 1 0 1 1 0 0 +EDGE2 5812 1193 1.12277 -0.0275863 0.0158636 1 0 1 1 0 0 +EDGE2 5812 3131 -0.978919 0.0470878 0.015105 1 0 1 1 0 0 +EDGE2 5812 3092 0.0403685 -0.0167553 0.00928218 1 0 1 1 0 0 +EDGE2 5812 1153 1.02704 0.0395921 -0.00169568 1 0 1 1 0 0 +EDGE2 5812 3132 -0.0807144 -0.0166314 -0.00258397 1 0 1 1 0 0 +EDGE2 5812 3172 -0.0471545 0.0831993 -0.0203421 1 0 1 1 0 0 +EDGE2 5812 3492 -0.122198 -0.0221603 0.0172997 1 0 1 1 0 0 +EDGE2 5812 3112 -0.0253384 -0.02648 -0.0208291 1 0 1 1 0 0 +EDGE2 5812 1152 -0.034459 -0.0147103 0.00462585 1 0 1 1 0 0 +EDGE2 5812 1172 -0.0464027 -0.0181968 -0.0224751 1 0 1 1 0 0 +EDGE2 5812 1192 0.0258116 -0.0288794 -0.0224465 1 0 1 1 0 0 +EDGE2 5812 3491 -1.02172 0.0282031 -0.00753554 1 0 1 1 0 0 +EDGE2 5812 5811 -0.985524 -0.0192596 0.0204827 1 0 1 1 0 0 +EDGE2 5812 3171 -0.948322 -0.00328934 0.0158943 1 0 1 1 0 0 +EDGE2 5812 1151 -1.09477 0.0165991 -0.0083689 1 0 1 1 0 0 +EDGE2 5812 1191 -1.02238 -0.00735286 -0.0188478 1 0 1 1 0 0 +EDGE2 5812 3091 -1.09311 -0.0954214 0.00367195 1 0 1 1 0 0 +EDGE2 5812 3111 -1.05818 -0.0142334 0.00780787 1 0 1 1 0 0 +EDGE2 5812 1171 -0.996526 -0.0597615 -0.00498216 1 0 1 1 0 0 +EDGE2 5813 1173 0.0274422 -0.0814387 0.00717632 1 0 1 1 0 0 +EDGE2 5813 1174 1.00138 0.0117289 -0.00504518 1 0 1 1 0 0 +EDGE2 5813 3174 1.06 0.0576235 -0.0368787 1 0 1 1 0 0 +EDGE2 5813 3494 1.04712 -0.0321852 -0.0261577 1 0 1 1 0 0 +EDGE2 5813 3094 0.994148 0.057675 -0.00424889 1 0 1 1 0 0 +EDGE2 5813 3114 0.967422 0.0456616 -0.0124586 1 0 1 1 0 0 +EDGE2 5813 3134 1.00184 -0.08493 0.00603485 1 0 1 1 0 0 +EDGE2 5813 1194 1.08015 -0.0732559 -0.022188 1 0 1 1 0 0 +EDGE2 5813 1154 1.04017 0.0296415 0.0155073 1 0 1 1 0 0 +EDGE2 5813 3133 -0.0853477 0.0125983 0.0377029 1 0 1 1 0 0 +EDGE2 5813 3493 0.0553224 0.0216043 -0.0159371 1 0 1 1 0 0 +EDGE2 5813 3173 -0.04573 -0.0872958 0.0123501 1 0 1 1 0 0 +EDGE2 5813 3093 0.0169498 -0.101035 0.0448322 1 0 1 1 0 0 +EDGE2 5813 3113 -0.0013892 -0.05983 -0.00820712 1 0 1 1 0 0 +EDGE2 5813 1193 -0.0266931 -0.033276 0.00105162 1 0 1 1 0 0 +EDGE2 5813 3092 -1.05934 0.0392893 -0.0371053 1 0 1 1 0 0 +EDGE2 5813 5812 -0.976938 0.0642123 -0.0256287 1 0 1 1 0 0 +EDGE2 5813 1153 0.0641185 -0.0973384 0.00307259 1 0 1 1 0 0 +EDGE2 5813 3132 -0.971364 0.00345957 -0.0296983 1 0 1 1 0 0 +EDGE2 5813 3172 -0.95103 0.0458687 0.00123773 1 0 1 1 0 0 +EDGE2 5813 3492 -1.02677 0.0247817 0.0101135 1 0 1 1 0 0 +EDGE2 5813 3112 -1.02896 0.0559548 -0.0367643 1 0 1 1 0 0 +EDGE2 5813 1152 -0.984836 -0.0292667 -0.0269517 1 0 1 1 0 0 +EDGE2 5813 1172 -0.943207 0.0413662 0.000890213 1 0 1 1 0 0 +EDGE2 5813 1192 -1.08967 -0.0842654 -0.0199523 1 0 1 1 0 0 +EDGE2 5814 3495 0.995055 -0.0568003 0.0561335 1 0 1 1 0 0 +EDGE2 5814 1173 -0.948695 0.0562473 -0.000298415 1 0 1 1 0 0 +EDGE2 5814 1174 -0.0646775 0.0281583 0.0126467 1 0 1 1 0 0 +EDGE2 5814 3115 0.95172 -0.0666094 0.0117126 1 0 1 1 0 0 +EDGE2 5814 3175 0.966935 -0.06411 -0.0192389 1 0 1 1 0 0 +EDGE2 5814 3375 0.953117 -0.0590386 -3.14708 1 0 1 1 0 0 +EDGE2 5814 3475 0.958571 -0.0187305 -3.14113 1 0 1 1 0 0 +EDGE2 5814 3135 1.0123 0.0351294 -0.00280062 1 0 1 1 0 0 +EDGE2 5814 1175 1.04012 -0.00442362 -0.0320981 1 0 1 1 0 0 +EDGE2 5814 1195 0.994157 -0.00879488 0.0181681 1 0 1 1 0 0 +EDGE2 5814 3095 1.04083 0.0229465 0.0202407 1 0 1 1 0 0 +EDGE2 5814 1155 0.944753 0.0094457 0.0184819 1 0 1 1 0 0 +EDGE2 5814 3174 0.00403455 -0.0183646 0.0435866 1 0 1 1 0 0 +EDGE2 5814 3494 0.0281379 -0.0899413 -0.0180599 1 0 1 1 0 0 +EDGE2 5814 3094 -0.0507404 -0.07066 0.0134654 1 0 1 1 0 0 +EDGE2 5814 3114 0.0182188 0.0150101 0.0171309 1 0 1 1 0 0 +EDGE2 5814 3134 -0.036053 -0.0138724 -0.0180912 1 0 1 1 0 0 +EDGE2 5814 1194 -0.0385946 -0.0458048 0.00426062 1 0 1 1 0 0 +EDGE2 5814 1154 0.115232 -0.00594469 0.00659279 1 0 1 1 0 0 +EDGE2 5814 3133 -1.07548 0.00904212 0.0310556 1 0 1 1 0 0 +EDGE2 5814 3493 -0.969472 -0.0295951 -0.00796368 1 0 1 1 0 0 +EDGE2 5814 5813 -1.05207 0.000984554 -0.0029316 1 0 1 1 0 0 +EDGE2 5814 3173 -0.905785 -0.00398699 -0.0129445 1 0 1 1 0 0 +EDGE2 5814 3093 -0.972854 -0.0354158 -0.00241068 1 0 1 1 0 0 +EDGE2 5814 3113 -0.98786 0.00471231 -0.011062 1 0 1 1 0 0 +EDGE2 5814 1193 -1.05804 0.047708 0.0167343 1 0 1 1 0 0 +EDGE2 5814 1153 -0.978317 0.0358447 -0.00665281 1 0 1 1 0 0 +EDGE2 5815 3495 -0.0670359 0.0547012 0.00117819 1 0 1 1 0 0 +EDGE2 5815 3474 0.969456 0.114036 -3.12003 1 0 1 1 0 0 +EDGE2 5815 3374 0.937586 -0.0206108 -3.14981 1 0 1 1 0 0 +EDGE2 5815 1196 -0.0172017 0.933567 1.56592 1 0 1 1 0 0 +EDGE2 5815 3476 0.0157649 0.922771 1.55479 1 0 1 1 0 0 +EDGE2 5815 3116 -0.00605113 1.02056 1.55758 1 0 1 1 0 0 +EDGE2 5815 3136 0.034534 1.01941 1.55475 1 0 1 1 0 0 +EDGE2 5815 3376 -0.0161757 1.01073 1.54785 1 0 1 1 0 0 +EDGE2 5815 3096 -0.0103125 0.882005 1.59298 1 0 1 1 0 0 +EDGE2 5815 1156 0.0259684 1.00323 1.56548 1 0 1 1 0 0 +EDGE2 5815 1176 -0.0120271 0.93965 1.58966 1 0 1 1 0 0 +EDGE2 5815 1174 -0.988789 0.0729016 -0.00682777 1 0 1 1 0 0 +EDGE2 5815 3115 0.0390445 0.0202287 0.00469326 1 0 1 1 0 0 +EDGE2 5815 3175 -0.0261494 -0.113384 -0.00554806 1 0 1 1 0 0 +EDGE2 5815 3375 0.0187113 -0.0194824 -3.13305 1 0 1 1 0 0 +EDGE2 5815 3475 -0.00820761 0.0314746 -3.14815 1 0 1 1 0 0 +EDGE2 5815 3135 0.0410563 -0.0807411 0.00414832 1 0 1 1 0 0 +EDGE2 5815 1175 0.0833747 0.0394213 -0.0164842 1 0 1 1 0 0 +EDGE2 5815 1195 -0.0833506 -0.0150891 -0.0078077 1 0 1 1 0 0 +EDGE2 5815 3095 0.00725967 -0.0667147 0.0293194 1 0 1 1 0 0 +EDGE2 5815 1155 0.110131 0.0260035 -0.0249412 1 0 1 1 0 0 +EDGE2 5815 3174 -0.917518 0.0787447 -0.00524996 1 0 1 1 0 0 +EDGE2 5815 5814 -0.935181 0.00822131 -0.0193373 1 0 1 1 0 0 +EDGE2 5815 3494 -0.99838 0.0961335 -0.00689942 1 0 1 1 0 0 +EDGE2 5815 3094 -1.02437 -0.0566494 0.0282575 1 0 1 1 0 0 +EDGE2 5815 3114 -1.08774 -0.0904351 0.000240527 1 0 1 1 0 0 +EDGE2 5815 3134 -1.07557 0.0406912 0.0288349 1 0 1 1 0 0 +EDGE2 5815 1194 -1.0104 -0.0112269 0.0106758 1 0 1 1 0 0 +EDGE2 5815 1154 -0.982371 -0.0193887 0.00193176 1 0 1 1 0 0 +EDGE2 5815 3176 -0.0112501 -0.985415 -1.56857 1 0 1 1 0 0 +EDGE2 5815 3496 0.00886095 -1.00374 -1.57994 1 0 1 1 0 0 +EDGE2 5816 3495 -1.02644 -0.0586772 -1.58961 1 0 1 1 0 0 +EDGE2 5816 1197 1.00603 -0.0141765 -0.0227097 1 0 1 1 0 0 +EDGE2 5816 3477 1.0177 0.0526943 -0.0341231 1 0 1 1 0 0 +EDGE2 5816 3117 1.06374 -0.0211216 -0.0261577 1 0 1 1 0 0 +EDGE2 5816 3137 0.93917 -0.0336117 0.00692998 1 0 1 1 0 0 +EDGE2 5816 3377 0.999742 0.0407755 0.0154553 1 0 1 1 0 0 +EDGE2 5816 3097 1.07637 0.0209519 0.00215586 1 0 1 1 0 0 +EDGE2 5816 1177 0.918316 0.0160449 -0.0133258 1 0 1 1 0 0 +EDGE2 5816 1157 0.883609 0.0825668 -0.0282012 1 0 1 1 0 0 +EDGE2 5816 1196 0.068565 -0.0411364 0.0208899 1 0 1 1 0 0 +EDGE2 5816 3476 -0.0632099 -0.0308197 6.79246e-05 1 0 1 1 0 0 +EDGE2 5816 3116 0.0647448 0.0509255 -0.00162977 1 0 1 1 0 0 +EDGE2 5816 3136 0.0187264 -0.042169 0.00545588 1 0 1 1 0 0 +EDGE2 5816 3376 -0.00934341 -0.00579873 -0.0117668 1 0 1 1 0 0 +EDGE2 5816 3096 -0.0425633 0.0116569 -0.012677 1 0 1 1 0 0 +EDGE2 5816 1156 -0.0135663 0.0773634 0.00196672 1 0 1 1 0 0 +EDGE2 5816 1176 -0.0337146 -0.0184649 0.028249 1 0 1 1 0 0 +EDGE2 5816 5815 -1.05118 0.0103381 -1.60282 1 0 1 1 0 0 +EDGE2 5816 3115 -0.975706 0.0375976 -1.57435 1 0 1 1 0 0 +EDGE2 5816 3175 -1.0107 -0.0316289 -1.57726 1 0 1 1 0 0 +EDGE2 5816 3375 -1.02467 0.0399428 1.58622 1 0 1 1 0 0 +EDGE2 5816 3475 -0.989006 0.0658555 1.56343 1 0 1 1 0 0 +EDGE2 5816 3135 -0.971912 0.0500158 -1.54705 1 0 1 1 0 0 +EDGE2 5816 1175 -0.989466 0.021381 -1.57497 1 0 1 1 0 0 +EDGE2 5816 1195 -1.04457 -0.0699164 -1.58767 1 0 1 1 0 0 +EDGE2 5816 3095 -0.971575 0.011533 -1.54629 1 0 1 1 0 0 +EDGE2 5816 1155 -0.992501 0.0381899 -1.56018 1 0 1 1 0 0 +EDGE2 5817 1197 -0.0755496 0.0938387 -0.00103047 1 0 1 1 0 0 +EDGE2 5817 3098 0.977563 0.0137506 0.0233903 1 0 1 1 0 0 +EDGE2 5817 3138 0.91917 -0.0718017 -0.00353098 1 0 1 1 0 0 +EDGE2 5817 3378 0.916063 0.0226593 0.00934124 1 0 1 1 0 0 +EDGE2 5817 3478 1.09059 0.0424973 0.0452185 1 0 1 1 0 0 +EDGE2 5817 3118 1.12031 -0.0637395 -0.00157668 1 0 1 1 0 0 +EDGE2 5817 1178 0.887606 -0.0168481 -0.0260467 1 0 1 1 0 0 +EDGE2 5817 1198 1.11015 0.0213203 -0.0113642 1 0 1 1 0 0 +EDGE2 5817 1158 1.04523 0.0616082 -0.0117867 1 0 1 1 0 0 +EDGE2 5817 3477 0.0322029 -0.069191 -0.0319221 1 0 1 1 0 0 +EDGE2 5817 3117 0.0338327 0.0264676 0.0193868 1 0 1 1 0 0 +EDGE2 5817 3137 0.041075 -0.0111306 0.0086001 1 0 1 1 0 0 +EDGE2 5817 3377 -0.0365215 0.0354126 -0.0194073 1 0 1 1 0 0 +EDGE2 5817 3097 0.00979541 -0.0452854 -0.00179824 1 0 1 1 0 0 +EDGE2 5817 1177 0.0881722 -0.116454 0.00343285 1 0 1 1 0 0 +EDGE2 5817 1157 -0.012314 0.0977727 0.0105646 1 0 1 1 0 0 +EDGE2 5817 1196 -1.0323 0.012891 0.0241677 1 0 1 1 0 0 +EDGE2 5817 3476 -0.989024 -0.0527841 0.0164728 1 0 1 1 0 0 +EDGE2 5817 5816 -1.00375 -0.0183612 -0.015013 1 0 1 1 0 0 +EDGE2 5817 3116 -0.974186 0.00922352 -0.0263496 1 0 1 1 0 0 +EDGE2 5817 3136 -1.01427 -0.0311145 -0.0174249 1 0 1 1 0 0 +EDGE2 5817 3376 -0.984125 0.0836633 0.0115842 1 0 1 1 0 0 +EDGE2 5817 3096 -1.08728 0.0691576 0.0101285 1 0 1 1 0 0 +EDGE2 5817 1156 -1.03917 0.0305038 -0.0161342 1 0 1 1 0 0 +EDGE2 5817 1176 -0.916058 -0.0203951 0.00959251 1 0 1 1 0 0 +EDGE2 5818 1197 -1.03868 -0.0606241 0.0277994 1 0 1 1 0 0 +EDGE2 5818 3119 1.11426 0.01943 -0.00304226 1 0 1 1 0 0 +EDGE2 5818 3379 0.965556 0.000102848 -0.0020186 1 0 1 1 0 0 +EDGE2 5818 3479 0.998102 -0.00090473 0.0308008 1 0 1 1 0 0 +EDGE2 5818 3139 0.964029 -0.0400959 -0.0213827 1 0 1 1 0 0 +EDGE2 5818 1179 1.066 0.0228619 0.00292957 1 0 1 1 0 0 +EDGE2 5818 1199 1.0538 -0.0126937 0.0136032 1 0 1 1 0 0 +EDGE2 5818 3099 1.00244 0.0513659 0.0209278 1 0 1 1 0 0 +EDGE2 5818 1159 0.944532 -0.00785547 0.0248641 1 0 1 1 0 0 +EDGE2 5818 3098 0.0721242 0.00260759 0.0154619 1 0 1 1 0 0 +EDGE2 5818 3138 0.00499805 0.0198732 -0.0165124 1 0 1 1 0 0 +EDGE2 5818 3378 0.0071289 0.0196625 0.0104414 1 0 1 1 0 0 +EDGE2 5818 3478 0.0284383 -0.0240936 -0.00315581 1 0 1 1 0 0 +EDGE2 5818 3118 0.0101249 -0.0167527 -3.26957e-05 1 0 1 1 0 0 +EDGE2 5818 1178 0.0468721 0.0179926 -0.0145689 1 0 1 1 0 0 +EDGE2 5818 1198 -0.0488805 -8.43271e-06 -0.000784099 1 0 1 1 0 0 +EDGE2 5818 1158 -0.0243007 0.0551571 -0.0168255 1 0 1 1 0 0 +EDGE2 5818 3477 -1.02784 0.0243686 0.0128214 1 0 1 1 0 0 +EDGE2 5818 5817 -0.924601 -0.0478519 0.0215485 1 0 1 1 0 0 +EDGE2 5818 3117 -0.972546 -0.0162599 -0.0143618 1 0 1 1 0 0 +EDGE2 5818 3137 -1.03814 -0.00739619 -0.017669 1 0 1 1 0 0 +EDGE2 5818 3377 -0.941056 -0.0513089 -0.0305472 1 0 1 1 0 0 +EDGE2 5818 3097 -0.95214 0.0525486 0.0108036 1 0 1 1 0 0 +EDGE2 5818 1177 -1.00651 0.0172518 -0.00920563 1 0 1 1 0 0 +EDGE2 5818 1157 -0.976064 0.065867 0.0184348 1 0 1 1 0 0 +EDGE2 5819 1160 1.12102 -0.00989139 -0.023894 1 0 1 1 0 0 +EDGE2 5819 3140 0.996059 -0.0485046 -0.0103226 1 0 1 1 0 0 +EDGE2 5819 3420 1.0612 -0.107091 -3.14672 1 0 1 1 0 0 +EDGE2 5819 3440 1.13544 -0.0360972 -3.13355 1 0 1 1 0 0 +EDGE2 5819 3480 0.974184 0.0190593 0.0356669 1 0 1 1 0 0 +EDGE2 5819 3380 0.973772 -0.00590175 0.0094994 1 0 1 1 0 0 +EDGE2 5819 1200 0.934636 0.000205708 -0.0436082 1 0 1 1 0 0 +EDGE2 5819 3100 1.0545 -0.0568163 -0.00191968 1 0 1 1 0 0 +EDGE2 5819 3120 0.978317 -0.00707629 -0.0188291 1 0 1 1 0 0 +EDGE2 5819 1180 0.954161 -0.0182222 0.00151279 1 0 1 1 0 0 +EDGE2 5819 900 0.98773 0.0369139 -3.09597 1 0 1 1 0 0 +EDGE2 5819 840 0.98648 -0.0807375 -3.10141 1 0 1 1 0 0 +EDGE2 5819 860 1.0252 -0.0276506 -3.14658 1 0 1 1 0 0 +EDGE2 5819 3119 -0.0149729 -0.0148811 0.00673133 1 0 1 1 0 0 +EDGE2 5819 3379 -0.0642777 -0.019803 0.0268746 1 0 1 1 0 0 +EDGE2 5819 3479 -0.0112978 0.0264541 -0.0104435 1 0 1 1 0 0 +EDGE2 5819 3139 0.0233075 -0.0140606 -0.0144575 1 0 1 1 0 0 +EDGE2 5819 1179 -0.0334372 0.00744511 0.0200079 1 0 1 1 0 0 +EDGE2 5819 1199 -0.00187028 -0.0686668 0.00639822 1 0 1 1 0 0 +EDGE2 5819 3099 0.0177704 -0.0177338 0.00330049 1 0 1 1 0 0 +EDGE2 5819 1159 0.0631305 0.0064436 0.0225391 1 0 1 1 0 0 +EDGE2 5819 5818 -1.07876 -0.0201645 0.00579756 1 0 1 1 0 0 +EDGE2 5819 3098 -1.07897 0.0682034 -0.0179767 1 0 1 1 0 0 +EDGE2 5819 3138 -1.04413 0.0123697 -0.027958 1 0 1 1 0 0 +EDGE2 5819 3378 -0.983585 0.0310937 -0.0222397 1 0 1 1 0 0 +EDGE2 5819 3478 -0.937017 0.0574872 -0.0110924 1 0 1 1 0 0 +EDGE2 5819 3118 -0.986755 -0.0392908 0.0306678 1 0 1 1 0 0 +EDGE2 5819 1178 -0.986977 -0.0244698 -0.00955114 1 0 1 1 0 0 +EDGE2 5819 1198 -0.989546 -0.0244749 0.0168133 1 0 1 1 0 0 +EDGE2 5819 1158 -0.999517 -0.0427846 0.0108722 1 0 1 1 0 0 +EDGE2 5820 839 1.02682 0.0236568 -3.14599 1 0 1 1 0 0 +EDGE2 5820 899 1.05302 0.0029801 -3.14853 1 0 1 1 0 0 +EDGE2 5820 3419 1.01077 -0.0543036 -3.13491 1 0 1 1 0 0 +EDGE2 5820 3439 1.04205 -0.066682 -3.13889 1 0 1 1 0 0 +EDGE2 5820 859 1.04377 0.0198616 -3.12722 1 0 1 1 0 0 +EDGE2 5820 3441 0.0267161 -1.06329 -1.54904 1 0 1 1 0 0 +EDGE2 5820 841 0.0481135 -1.02396 -1.57539 1 0 1 1 0 0 +EDGE2 5820 901 -0.00317033 -1.055 -1.59554 1 0 1 1 0 0 +EDGE2 5820 1201 0.0205308 -0.979713 -1.55942 1 0 1 1 0 0 +EDGE2 5820 3421 -0.0280272 -0.99707 -1.57904 1 0 1 1 0 0 +EDGE2 5820 861 0.0341866 -0.934101 -1.5694 1 0 1 1 0 0 +EDGE2 5820 1160 -0.0683256 0.0538806 -0.00699938 1 0 1 1 0 0 +EDGE2 5820 3140 -0.0389546 0.00976501 0.00602078 1 0 1 1 0 0 +EDGE2 5820 3420 0.0565921 0.0567762 -3.14705 1 0 1 1 0 0 +EDGE2 5820 3440 0.10726 0.0176327 -3.1523 1 0 1 1 0 0 +EDGE2 5820 3480 -0.0728691 0.0555917 -0.0315427 1 0 1 1 0 0 +EDGE2 5820 3380 -0.00093224 0.00087704 0.0386238 1 0 1 1 0 0 +EDGE2 5820 1200 -0.0206004 0.0156338 -0.0100889 1 0 1 1 0 0 +EDGE2 5820 3100 -0.0513196 0.0607823 0.015647 1 0 1 1 0 0 +EDGE2 5820 3120 -0.0724028 0.0334182 -0.00109443 1 0 1 1 0 0 +EDGE2 5820 1180 0.0709643 0.00877407 0.0119054 1 0 1 1 0 0 +EDGE2 5820 900 -0.0730745 0.0466666 -3.15939 1 0 1 1 0 0 +EDGE2 5820 840 0.01591 -0.047308 -3.10924 1 0 1 1 0 0 +EDGE2 5820 860 -0.0267376 -0.0430422 -3.14554 1 0 1 1 0 0 +EDGE2 5820 3101 0.0970732 0.982277 1.58632 1 0 1 1 0 0 +EDGE2 5820 3141 0.0196911 1.01135 1.58827 1 0 1 1 0 0 +EDGE2 5820 3381 -0.0453147 0.963328 1.58751 1 0 1 1 0 0 +EDGE2 5820 3481 0.0341518 1.0066 1.61804 1 0 1 1 0 0 +EDGE2 5820 3121 -0.0379213 0.980462 1.58265 1 0 1 1 0 0 +EDGE2 5820 1161 -0.012 0.841189 1.55996 1 0 1 1 0 0 +EDGE2 5820 1181 0.021856 1.02908 1.59844 1 0 1 1 0 0 +EDGE2 5820 3119 -0.976047 0.0509836 -0.00408957 1 0 1 1 0 0 +EDGE2 5820 3379 -1.01925 0.0856444 0.0128712 1 0 1 1 0 0 +EDGE2 5820 3479 -0.963344 -0.109764 -0.00214295 1 0 1 1 0 0 +EDGE2 5820 5819 -1.08012 0.0078908 0.0147972 1 0 1 1 0 0 +EDGE2 5820 3139 -0.991002 0.0307059 -0.0113214 1 0 1 1 0 0 +EDGE2 5820 1179 -1.02078 0.0212503 -0.00471932 1 0 1 1 0 0 +EDGE2 5820 1199 -1.02216 0.059374 -0.00671941 1 0 1 1 0 0 +EDGE2 5820 3099 -0.967682 0.0343342 0.0174074 1 0 1 1 0 0 +EDGE2 5820 1159 -0.978206 -0.0119463 -0.0170898 1 0 1 1 0 0 +EDGE2 5821 5820 -0.957055 0.020811 -1.58994 1 0 1 1 0 0 +EDGE2 5821 1160 -1.02556 0.0282263 -1.57705 1 0 1 1 0 0 +EDGE2 5821 3140 -0.966221 0.0694155 -1.57795 1 0 1 1 0 0 +EDGE2 5821 3420 -1.06682 0.0323947 1.55814 1 0 1 1 0 0 +EDGE2 5821 3440 -0.936227 0.0470155 1.54788 1 0 1 1 0 0 +EDGE2 5821 3480 -1.02945 0.0785372 -1.59726 1 0 1 1 0 0 +EDGE2 5821 3380 -1.00961 0.00800607 -1.56254 1 0 1 1 0 0 +EDGE2 5821 1200 -0.986481 -0.0153826 -1.60006 1 0 1 1 0 0 +EDGE2 5821 3100 -0.951808 0.0642288 -1.61282 1 0 1 1 0 0 +EDGE2 5821 3120 -0.965794 0.0451049 -1.57671 1 0 1 1 0 0 +EDGE2 5821 1180 -1.02393 0.047169 -1.57832 1 0 1 1 0 0 +EDGE2 5821 900 -1.01843 0.0346772 1.55066 1 0 1 1 0 0 +EDGE2 5821 840 -1.0967 -0.0356889 1.57212 1 0 1 1 0 0 +EDGE2 5821 860 -0.987687 -0.0433006 1.58187 1 0 1 1 0 0 +EDGE2 5821 3482 0.998979 -0.029806 -0.0128825 1 0 1 1 0 0 +EDGE2 5821 3101 0.00565529 -1.58936e-05 -0.0221866 1 0 1 1 0 0 +EDGE2 5821 3141 -0.0186879 0.0133833 -0.0562523 1 0 1 1 0 0 +EDGE2 5821 3381 0.0504026 -0.0720605 0.00832163 1 0 1 1 0 0 +EDGE2 5821 3481 -0.0314127 0.0125133 0.00724429 1 0 1 1 0 0 +EDGE2 5821 3121 -0.0382853 -0.0454872 -0.00921854 1 0 1 1 0 0 +EDGE2 5821 1161 -0.0872425 0.016916 0.0288721 1 0 1 1 0 0 +EDGE2 5821 1181 -0.0655904 -0.0375772 0.0356872 1 0 1 1 0 0 +EDGE2 5821 1182 1.05442 0.1076 0.0252252 1 0 1 1 0 0 +EDGE2 5821 3122 1.05574 -0.100186 -0.0374581 1 0 1 1 0 0 +EDGE2 5821 3142 1.018 -0.0418106 -0.0016153 1 0 1 1 0 0 +EDGE2 5821 3382 0.94653 0.0339379 -0.0284284 1 0 1 1 0 0 +EDGE2 5821 3102 0.957703 0.0360933 -0.00978794 1 0 1 1 0 0 +EDGE2 5821 1162 0.943142 0.0646133 -0.0137074 1 0 1 1 0 0 +EDGE2 5822 5821 -1.01714 -0.0167505 0.00992057 1 0 1 1 0 0 +EDGE2 5822 3383 1.00017 0.009642 -0.00192079 1 0 1 1 0 0 +EDGE2 5822 3482 0.101572 0.0489891 0.00773003 1 0 1 1 0 0 +EDGE2 5822 3101 -1.0349 -0.06662 0.00315598 1 0 1 1 0 0 +EDGE2 5822 3141 -0.980183 0.040125 -0.0199285 1 0 1 1 0 0 +EDGE2 5822 3381 -0.981648 0.0547265 -0.00230297 1 0 1 1 0 0 +EDGE2 5822 3481 -1.0014 0.0048132 -0.0214248 1 0 1 1 0 0 +EDGE2 5822 3121 -1.03817 0.0271326 -0.0137688 1 0 1 1 0 0 +EDGE2 5822 1161 -1.08499 0.0303107 0.0270696 1 0 1 1 0 0 +EDGE2 5822 1181 -1.01084 0.0426795 0.0195062 1 0 1 1 0 0 +EDGE2 5822 1182 -0.10002 0.0502105 -0.0256355 1 0 1 1 0 0 +EDGE2 5822 3122 0.0674255 0.0294143 0.0174215 1 0 1 1 0 0 +EDGE2 5822 3142 0.000580044 -0.0346749 0.0229281 1 0 1 1 0 0 +EDGE2 5822 3382 0.000498628 0.0628789 0.00272841 1 0 1 1 0 0 +EDGE2 5822 3102 -0.0114886 -0.0700994 0.0115834 1 0 1 1 0 0 +EDGE2 5822 1162 -0.00372661 -0.0111028 -0.000325455 1 0 1 1 0 0 +EDGE2 5822 3483 0.951666 -0.0973918 0.00612236 1 0 1 1 0 0 +EDGE2 5822 1163 1.02021 0.0634972 0.0166228 1 0 1 1 0 0 +EDGE2 5822 3103 1.02626 -0.00706809 -0.00067035 1 0 1 1 0 0 +EDGE2 5822 3123 0.99889 -0.0131542 0.00184655 1 0 1 1 0 0 +EDGE2 5822 3143 0.934274 -0.0308456 -0.00746999 1 0 1 1 0 0 +EDGE2 5822 1183 0.963112 -0.00766764 0.0251876 1 0 1 1 0 0 +EDGE2 5823 3383 -0.0887054 0.0415112 0.0038914 1 0 1 1 0 0 +EDGE2 5823 3482 -0.975677 0.0344795 -0.0272447 1 0 1 1 0 0 +EDGE2 5823 5822 -1.07857 -0.0516464 -0.00149546 1 0 1 1 0 0 +EDGE2 5823 1182 -0.966241 0.0307547 0.0181737 1 0 1 1 0 0 +EDGE2 5823 3122 -1.08334 -0.00427007 -0.0114743 1 0 1 1 0 0 +EDGE2 5823 3142 -0.994154 -0.000795585 -0.0127647 1 0 1 1 0 0 +EDGE2 5823 3382 -1.07464 0.0233541 0.000896201 1 0 1 1 0 0 +EDGE2 5823 3102 -1.02601 0.00807345 -0.011148 1 0 1 1 0 0 +EDGE2 5823 1162 -1.04459 -0.143997 0.00596534 1 0 1 1 0 0 +EDGE2 5823 3483 0.020054 0.0407689 -0.0265881 1 0 1 1 0 0 +EDGE2 5823 3144 0.989641 0.0355192 0.0199085 1 0 1 1 0 0 +EDGE2 5823 1163 0.0866952 -0.00690823 0.00508778 1 0 1 1 0 0 +EDGE2 5823 3103 0.0129361 0.0566532 -0.00806395 1 0 1 1 0 0 +EDGE2 5823 3123 -0.0270795 0.0255924 0.00646866 1 0 1 1 0 0 +EDGE2 5823 3143 0.0254053 0.0715508 -0.0204193 1 0 1 1 0 0 +EDGE2 5823 1183 -0.0304692 0.0601918 -0.00819514 1 0 1 1 0 0 +EDGE2 5823 3484 1.07757 0.0170058 0.0086472 1 0 1 1 0 0 +EDGE2 5823 3384 0.96001 -0.0441552 -0.0121466 1 0 1 1 0 0 +EDGE2 5823 1184 0.954984 0.0526606 -0.0146245 1 0 1 1 0 0 +EDGE2 5823 3104 0.885091 -0.0555291 0.0270622 1 0 1 1 0 0 +EDGE2 5823 3124 0.939846 -0.0089881 -0.000627406 1 0 1 1 0 0 +EDGE2 5823 1164 0.949336 0.0233085 -0.00982021 1 0 1 1 0 0 +EDGE2 5824 3383 -1.09478 0.00744969 0.00851915 1 0 1 1 0 0 +EDGE2 5824 5823 -0.984461 -0.0255688 -0.00962754 1 0 1 1 0 0 +EDGE2 5824 3483 -1.00511 0.0501643 0.029798 1 0 1 1 0 0 +EDGE2 5824 3144 -0.0404402 -0.021387 -0.0246496 1 0 1 1 0 0 +EDGE2 5824 1163 -1.02878 -0.0316747 0.00630351 1 0 1 1 0 0 +EDGE2 5824 3103 -0.956998 -0.0193411 -0.000121027 1 0 1 1 0 0 +EDGE2 5824 3123 -0.9582 -0.0528399 -0.0239994 1 0 1 1 0 0 +EDGE2 5824 3143 -0.99825 0.0595232 0.0199789 1 0 1 1 0 0 +EDGE2 5824 1183 -0.924439 -0.0377183 0.0210855 1 0 1 1 0 0 +EDGE2 5824 3484 0.0186335 0.0359345 -0.00670479 1 0 1 1 0 0 +EDGE2 5824 3384 0.116241 -0.0736797 0.0222835 1 0 1 1 0 0 +EDGE2 5824 1184 -0.0297582 -0.0634168 -0.0147744 1 0 1 1 0 0 +EDGE2 5824 3104 -0.0202119 -0.0279709 -0.0176368 1 0 1 1 0 0 +EDGE2 5824 3124 -0.0119856 -0.0624875 -0.0327323 1 0 1 1 0 0 +EDGE2 5824 1164 -0.0214679 -0.064162 -0.0423062 1 0 1 1 0 0 +EDGE2 5824 3105 1.02208 0.106088 -0.00903641 1 0 1 1 0 0 +EDGE2 5824 3485 0.995443 0.037212 -0.0243798 1 0 1 1 0 0 +EDGE2 5824 3145 1.00011 0.0672746 0.0231977 1 0 1 1 0 0 +EDGE2 5824 3165 0.97304 0.00123174 -3.10982 1 0 1 1 0 0 +EDGE2 5824 3385 0.94204 -0.0152 -0.0122481 1 0 1 1 0 0 +EDGE2 5824 3125 0.984202 0.0601236 -0.0259737 1 0 1 1 0 0 +EDGE2 5824 1185 0.983218 0.0256898 -0.0268825 1 0 1 1 0 0 +EDGE2 5824 3065 1.02001 0.00895864 -3.13708 1 0 1 1 0 0 +EDGE2 5824 3085 0.986254 9.38321e-05 -3.17591 1 0 1 1 0 0 +EDGE2 5824 1165 0.9748 0.0174712 0.0223341 1 0 1 1 0 0 +EDGE2 5825 3146 0.0638143 -1.01746 -1.59355 1 0 1 1 0 0 +EDGE2 5825 3386 -0.0108161 -0.908039 -1.54832 1 0 1 1 0 0 +EDGE2 5825 3066 0.0568504 -1.03304 -1.60635 1 0 1 1 0 0 +EDGE2 5825 3144 -0.959066 -0.00233882 0.0113538 1 0 1 1 0 0 +EDGE2 5825 3484 -0.960561 -0.0243063 0.0633352 1 0 1 1 0 0 +EDGE2 5825 5824 -1.08454 0.0012006 -0.0027679 1 0 1 1 0 0 +EDGE2 5825 3384 -1.07147 0.0191785 -0.00947797 1 0 1 1 0 0 +EDGE2 5825 1184 -0.999574 0.0185047 0.0141575 1 0 1 1 0 0 +EDGE2 5825 3104 -0.97237 0.0759453 0.00236017 1 0 1 1 0 0 +EDGE2 5825 3124 -0.995851 -0.0106337 -0.0296724 1 0 1 1 0 0 +EDGE2 5825 1164 -0.940711 0.0171245 -0.0426385 1 0 1 1 0 0 +EDGE2 5825 3166 -0.0205702 0.994566 1.57872 1 0 1 1 0 0 +EDGE2 5825 3105 -0.0546165 0.0580748 0.00405718 1 0 1 1 0 0 +EDGE2 5825 3485 0.027749 -0.0627947 -0.0314625 1 0 1 1 0 0 +EDGE2 5825 3145 0.0328284 0.0568008 -0.00325802 1 0 1 1 0 0 +EDGE2 5825 3165 -0.0398889 0.169438 -3.15425 1 0 1 1 0 0 +EDGE2 5825 3385 0.0207171 0.0389734 -0.00876517 1 0 1 1 0 0 +EDGE2 5825 3125 -0.0442883 0.0235978 0.0165582 1 0 1 1 0 0 +EDGE2 5825 1185 -0.0164345 -0.0208576 0.00872122 1 0 1 1 0 0 +EDGE2 5825 3065 -0.0462855 -0.0149072 -3.14704 1 0 1 1 0 0 +EDGE2 5825 3085 -0.0563797 -0.0348444 -3.11766 1 0 1 1 0 0 +EDGE2 5825 1165 -0.0375866 0.00425228 0.00519124 1 0 1 1 0 0 +EDGE2 5825 3486 0.0224583 0.973656 1.55864 1 0 1 1 0 0 +EDGE2 5825 1166 0.0312689 1.00299 1.54732 1 0 1 1 0 0 +EDGE2 5825 3086 0.008572 0.973751 1.58651 1 0 1 1 0 0 +EDGE2 5825 3106 0.00181572 1.06074 1.56815 1 0 1 1 0 0 +EDGE2 5825 3126 0.118095 1.06077 1.59983 1 0 1 1 0 0 +EDGE2 5825 1186 -0.0397299 0.960395 1.60216 1 0 1 1 0 0 +EDGE2 5825 3064 1.13899 0.00865031 -3.15035 1 0 1 1 0 0 +EDGE2 5825 3164 1.04149 -0.0174262 -3.12258 1 0 1 1 0 0 +EDGE2 5825 3084 1.04309 0.0207143 -3.12096 1 0 1 1 0 0 +EDGE2 5826 3166 -0.0187821 -0.0509189 -0.0243249 1 0 1 1 0 0 +EDGE2 5826 3105 -0.997674 0.00171933 -1.57434 1 0 1 1 0 0 +EDGE2 5826 3485 -1.0184 0.0701786 -1.57922 1 0 1 1 0 0 +EDGE2 5826 5825 -0.965905 0.0105939 -1.59827 1 0 1 1 0 0 +EDGE2 5826 3145 -0.938156 0.0315366 -1.54106 1 0 1 1 0 0 +EDGE2 5826 3165 -0.905985 0.0243126 1.51615 1 0 1 1 0 0 +EDGE2 5826 3385 -0.935037 0.0380692 -1.5788 1 0 1 1 0 0 +EDGE2 5826 3125 -0.992678 -0.00252629 -1.55238 1 0 1 1 0 0 +EDGE2 5826 1185 -0.960233 -0.0081153 -1.56885 1 0 1 1 0 0 +EDGE2 5826 3065 -1.02021 0.0116995 1.56969 1 0 1 1 0 0 +EDGE2 5826 3085 -1.05648 -0.0211441 1.55413 1 0 1 1 0 0 +EDGE2 5826 1165 -0.969304 -0.0333599 -1.53891 1 0 1 1 0 0 +EDGE2 5826 3486 -0.000937639 -0.029505 0.0241872 1 0 1 1 0 0 +EDGE2 5826 1166 0.0254833 -0.0229351 -0.0115696 1 0 1 1 0 0 +EDGE2 5826 3086 0.0710262 -0.00965836 0.0341529 1 0 1 1 0 0 +EDGE2 5826 3106 0.0897915 0.0128303 0.00327493 1 0 1 1 0 0 +EDGE2 5826 3126 0.0697535 0.0788774 0.0351259 1 0 1 1 0 0 +EDGE2 5826 1186 -0.0590022 -0.168184 -0.00742529 1 0 1 1 0 0 +EDGE2 5826 3107 1.01253 -0.0323621 0.044545 1 0 1 1 0 0 +EDGE2 5826 3167 1.0021 0.0236387 -0.0138136 1 0 1 1 0 0 +EDGE2 5826 3487 0.901687 0.00708668 0.00384847 1 0 1 1 0 0 +EDGE2 5826 3127 1.06823 -0.0315085 0.00462184 1 0 1 1 0 0 +EDGE2 5826 1187 1.04291 -0.00224082 -0.0134448 1 0 1 1 0 0 +EDGE2 5826 3087 0.957317 0.0786947 0.0146964 1 0 1 1 0 0 +EDGE2 5826 1167 1.04906 0.0459195 -0.0209597 1 0 1 1 0 0 +EDGE2 5827 3166 -0.941067 0.0235158 -0.0380782 1 0 1 1 0 0 +EDGE2 5827 5826 -1.01848 0.00268157 -0.0334852 1 0 1 1 0 0 +EDGE2 5827 3486 -0.919376 0.035841 -0.00130357 1 0 1 1 0 0 +EDGE2 5827 1166 -0.933261 0.0370728 -0.0121744 1 0 1 1 0 0 +EDGE2 5827 3086 -1.05275 -0.00826867 -0.000761889 1 0 1 1 0 0 +EDGE2 5827 3106 -0.967475 0.112233 0.0208106 1 0 1 1 0 0 +EDGE2 5827 3126 -1.07138 -0.0255241 0.0188667 1 0 1 1 0 0 +EDGE2 5827 1186 -0.892961 0.0264318 -0.00599767 1 0 1 1 0 0 +EDGE2 5827 3107 -0.0396228 0.0233233 0.0224317 1 0 1 1 0 0 +EDGE2 5827 3167 -0.0415705 -0.0605916 -0.00776889 1 0 1 1 0 0 +EDGE2 5827 3487 -0.00327082 0.0369419 -0.0123608 1 0 1 1 0 0 +EDGE2 5827 3127 0.0248561 0.0139604 -0.0461288 1 0 1 1 0 0 +EDGE2 5827 1187 0.0405198 0.00255097 -0.00437987 1 0 1 1 0 0 +EDGE2 5827 3087 0.0123746 0.0747024 0.000777394 1 0 1 1 0 0 +EDGE2 5827 1167 -0.0505262 0.0943507 -0.00867129 1 0 1 1 0 0 +EDGE2 5827 3128 0.93761 -0.0341789 -0.0172866 1 0 1 1 0 0 +EDGE2 5827 3488 0.940899 0.0669007 0.0251683 1 0 1 1 0 0 +EDGE2 5827 3168 0.907961 0.0465239 -0.00241533 1 0 1 1 0 0 +EDGE2 5827 1188 1.02674 -0.0557427 -0.0268496 1 0 1 1 0 0 +EDGE2 5827 3088 1.07869 0.13719 -0.00415825 1 0 1 1 0 0 +EDGE2 5827 3108 1.07116 -0.0747988 -0.0100256 1 0 1 1 0 0 +EDGE2 5827 1168 1.09652 -0.00275676 -0.0225187 1 0 1 1 0 0 +EDGE2 5828 3107 -1.04712 0.0613281 -0.00694989 1 0 1 1 0 0 +EDGE2 5828 3167 -0.975431 -0.014432 0.0198916 1 0 1 1 0 0 +EDGE2 5828 3487 -0.998187 0.0594165 -0.0168531 1 0 1 1 0 0 +EDGE2 5828 5827 -1.02148 0.00690423 -0.053339 1 0 1 1 0 0 +EDGE2 5828 3127 -1.02082 0.0107675 0.00920305 1 0 1 1 0 0 +EDGE2 5828 1187 -1.02596 0.00169648 0.0290065 1 0 1 1 0 0 +EDGE2 5828 3087 -0.973579 -0.0686922 -0.00653748 1 0 1 1 0 0 +EDGE2 5828 1167 -1.00928 0.0143247 0.00960502 1 0 1 1 0 0 +EDGE2 5828 3128 0.0182431 0.0570733 0.0309625 1 0 1 1 0 0 +EDGE2 5828 3488 0.0451968 -0.0180292 -0.00942031 1 0 1 1 0 0 +EDGE2 5828 3168 0.0212902 0.0550192 0.0147384 1 0 1 1 0 0 +EDGE2 5828 1188 0.00262342 0.058765 -0.0140794 1 0 1 1 0 0 +EDGE2 5828 3088 -0.0238432 0.00348173 0.00122535 1 0 1 1 0 0 +EDGE2 5828 3108 -0.0243134 0.0140867 -0.0149432 1 0 1 1 0 0 +EDGE2 5828 1168 0.00348101 -0.0275953 -0.0205133 1 0 1 1 0 0 +EDGE2 5828 3109 0.942997 0.0062934 -0.00917292 1 0 1 1 0 0 +EDGE2 5828 3169 1.02427 0.0196285 -0.0133383 1 0 1 1 0 0 +EDGE2 5828 3489 1.04593 0.0861104 0.0150119 1 0 1 1 0 0 +EDGE2 5828 3129 0.980137 0.0414948 -0.00510059 1 0 1 1 0 0 +EDGE2 5828 1189 1.06144 0.0267936 0.033979 1 0 1 1 0 0 +EDGE2 5828 3089 1.03718 0.101436 -0.0215516 1 0 1 1 0 0 +EDGE2 5828 1169 1.03094 -0.0142616 0.000833881 1 0 1 1 0 0 +EDGE2 5829 3128 -0.917403 -0.115134 0.00431293 1 0 1 1 0 0 +EDGE2 5829 3488 -1.01577 0.0468098 -0.0172278 1 0 1 1 0 0 +EDGE2 5829 5828 -1.00816 0.0581819 0.00811929 1 0 1 1 0 0 +EDGE2 5829 3168 -0.940761 0.00302733 -0.00197157 1 0 1 1 0 0 +EDGE2 5829 1188 -1.04314 0.0764145 -0.00913358 1 0 1 1 0 0 +EDGE2 5829 3088 -1.03099 0.00494391 -0.0166291 1 0 1 1 0 0 +EDGE2 5829 3108 -0.959929 0.0462144 -0.0277123 1 0 1 1 0 0 +EDGE2 5829 1168 -1.04757 -0.0340484 0.0197866 1 0 1 1 0 0 +EDGE2 5829 3109 -0.0388473 -0.0129505 0.00749002 1 0 1 1 0 0 +EDGE2 5829 3169 0.0479954 -0.0449114 0.0317955 1 0 1 1 0 0 +EDGE2 5829 3489 0.0144649 -0.0333447 0.0017074 1 0 1 1 0 0 +EDGE2 5829 3129 0.0123771 0.0241899 -0.00792688 1 0 1 1 0 0 +EDGE2 5829 1189 -0.0714139 0.0173675 0.00279654 1 0 1 1 0 0 +EDGE2 5829 3089 -0.0387517 0.0340261 0.0117532 1 0 1 1 0 0 +EDGE2 5829 1169 -0.0456773 -0.0547456 -0.0300465 1 0 1 1 0 0 +EDGE2 5829 3050 1.01759 -0.0137558 -3.14933 1 0 1 1 0 0 +EDGE2 5829 3170 0.925036 0.00871979 0.0321846 1 0 1 1 0 0 +EDGE2 5829 5790 0.995839 -0.0208781 -3.10856 1 0 1 1 0 0 +EDGE2 5829 5810 0.923728 -0.0580061 -3.12833 1 0 1 1 0 0 +EDGE2 5829 3490 0.986165 -0.0202643 -0.0110443 1 0 1 1 0 0 +EDGE2 5829 3110 1.02109 0.0495772 0.0101195 1 0 1 1 0 0 +EDGE2 5829 3130 0.955508 -0.0304996 -0.00501243 1 0 1 1 0 0 +EDGE2 5829 3090 1.06738 0.0791013 0.00623838 1 0 1 1 0 0 +EDGE2 5829 1130 0.945767 -0.023023 -3.13961 1 0 1 1 0 0 +EDGE2 5829 1170 1.02669 0.0223907 -0.00703587 1 0 1 1 0 0 +EDGE2 5829 1190 1.06001 0.0125864 -0.0453762 1 0 1 1 0 0 +EDGE2 5829 3030 1.00559 -0.0210227 -3.09888 1 0 1 1 0 0 +EDGE2 5829 1150 1.0862 0.0232838 -3.13747 1 0 1 1 0 0 +EDGE2 5829 1110 1.05706 -0.0563812 -3.1372 1 0 1 1 0 0 +EDGE2 5830 3109 -0.993342 -0.0617275 -0.000504946 1 0 1 1 0 0 +EDGE2 5830 3169 -1.06991 -0.0268109 0.0253286 1 0 1 1 0 0 +EDGE2 5830 3489 -1.06157 0.0971179 0.000953215 1 0 1 1 0 0 +EDGE2 5830 5829 -1.08647 0.0237439 -0.0232411 1 0 1 1 0 0 +EDGE2 5830 3129 -1.0722 -0.0391729 -0.00163242 1 0 1 1 0 0 +EDGE2 5830 1189 -1.05934 0.0562514 -0.0135008 1 0 1 1 0 0 +EDGE2 5830 3089 -0.954282 -0.086311 0.00681432 1 0 1 1 0 0 +EDGE2 5830 1169 -0.951255 -0.014258 0.0306581 1 0 1 1 0 0 +EDGE2 5830 3050 -0.0750397 -0.0216022 -3.15986 1 0 1 1 0 0 +EDGE2 5830 3131 -0.0566528 1.05648 1.56253 1 0 1 1 0 0 +EDGE2 5830 3491 -0.105522 1.03838 1.54988 1 0 1 1 0 0 +EDGE2 5830 5811 -0.0160463 1.03826 1.57869 1 0 1 1 0 0 +EDGE2 5830 3171 -0.0711013 1.04149 1.58261 1 0 1 1 0 0 +EDGE2 5830 1151 0.067688 0.962721 1.54633 1 0 1 1 0 0 +EDGE2 5830 1191 0.0527006 0.929317 1.58151 1 0 1 1 0 0 +EDGE2 5830 3091 -0.032434 0.9579 1.5959 1 0 1 1 0 0 +EDGE2 5830 3111 0.0233891 0.93653 1.54935 1 0 1 1 0 0 +EDGE2 5830 1171 0.0769558 0.977988 1.55508 1 0 1 1 0 0 +EDGE2 5830 3170 -0.0760236 -0.0689977 0.0140194 1 0 1 1 0 0 +EDGE2 5830 5790 0.0801987 -0.0104884 -3.13898 1 0 1 1 0 0 +EDGE2 5830 5810 -0.0816235 -0.0335954 -3.13354 1 0 1 1 0 0 +EDGE2 5830 3490 -0.0218736 -0.0174951 0.0271291 1 0 1 1 0 0 +EDGE2 5830 3110 0.0305959 0.00947182 -0.0140634 1 0 1 1 0 0 +EDGE2 5830 3130 -0.0487736 -0.124961 -0.00114854 1 0 1 1 0 0 +EDGE2 5830 3090 -0.0251415 -0.00417359 -0.0122191 1 0 1 1 0 0 +EDGE2 5830 5789 0.992109 -0.0450471 -3.10807 1 0 1 1 0 0 +EDGE2 5830 1130 -0.0417744 -0.0882674 -3.13335 1 0 1 1 0 0 +EDGE2 5830 1170 0.0695116 -0.0373555 -0.012516 1 0 1 1 0 0 +EDGE2 5830 1190 -0.00907533 -0.101445 0.00398893 1 0 1 1 0 0 +EDGE2 5830 3030 0.00773219 -0.00222858 -3.12424 1 0 1 1 0 0 +EDGE2 5830 1150 -0.0722599 0.073289 -3.1261 1 0 1 1 0 0 +EDGE2 5830 1110 -0.0489218 0.008192 -3.14799 1 0 1 1 0 0 +EDGE2 5830 5809 1.02171 -0.115774 -3.16126 1 0 1 1 0 0 +EDGE2 5830 1109 1.1523 0.055124 -3.15682 1 0 1 1 0 0 +EDGE2 5830 1149 0.909115 -0.0866419 -3.16386 1 0 1 1 0 0 +EDGE2 5830 3029 0.951417 0.0229122 -3.09972 1 0 1 1 0 0 +EDGE2 5830 3049 1.01098 -0.0128428 -3.12166 1 0 1 1 0 0 +EDGE2 5830 1129 0.904053 0.0206574 -3.09254 1 0 1 1 0 0 +EDGE2 5830 1111 -0.0100182 -1.00976 -1.57463 1 0 1 1 0 0 +EDGE2 5830 3031 0.0271071 -0.955185 -1.55495 1 0 1 1 0 0 +EDGE2 5830 3051 0.0151736 -1.0172 -1.53101 1 0 1 1 0 0 +EDGE2 5830 5791 0.0700941 -1.02887 -1.52827 1 0 1 1 0 0 +EDGE2 5830 1131 -0.00756333 -0.98493 -1.56092 1 0 1 1 0 0 +EDGE2 5831 3050 -1.0152 0.0241698 1.55889 1 0 1 1 0 0 +EDGE2 5831 3131 -0.0393713 0.0154893 -0.00303952 1 0 1 1 0 0 +EDGE2 5831 3092 1.01595 0.00322029 0.0271306 1 0 1 1 0 0 +EDGE2 5831 5812 1.01541 0.0609014 -0.0128266 1 0 1 1 0 0 +EDGE2 5831 3132 0.961032 -0.0544032 0.0292984 1 0 1 1 0 0 +EDGE2 5831 3172 1.04095 0.0413051 -0.012434 1 0 1 1 0 0 +EDGE2 5831 3492 1.03471 0.0281965 -0.0180654 1 0 1 1 0 0 +EDGE2 5831 3112 1.00999 0.0161998 -0.0339724 1 0 1 1 0 0 +EDGE2 5831 1152 1.08827 0.0985009 0.0365629 1 0 1 1 0 0 +EDGE2 5831 1172 1.00209 -0.0353299 0.0438177 1 0 1 1 0 0 +EDGE2 5831 1192 1.01444 0.0216285 0.0184671 1 0 1 1 0 0 +EDGE2 5831 3491 0.0695792 -0.090199 -0.00737172 1 0 1 1 0 0 +EDGE2 5831 5811 0.0809512 -0.109722 -0.0135604 1 0 1 1 0 0 +EDGE2 5831 3171 -0.00212894 0.00302695 0.0157908 1 0 1 1 0 0 +EDGE2 5831 1151 -0.00342258 0.0104069 -0.00298216 1 0 1 1 0 0 +EDGE2 5831 1191 0.0470051 0.00827888 0.0367361 1 0 1 1 0 0 +EDGE2 5831 3091 -0.0759792 0.0149708 0.0244856 1 0 1 1 0 0 +EDGE2 5831 3111 0.0313252 0.0632387 0.00372176 1 0 1 1 0 0 +EDGE2 5831 1171 0.00637641 -0.0676529 -0.00200857 1 0 1 1 0 0 +EDGE2 5831 3170 -0.933418 0.0808546 -1.57774 1 0 1 1 0 0 +EDGE2 5831 5790 -0.965262 -0.0859912 1.55278 1 0 1 1 0 0 +EDGE2 5831 5810 -0.972591 -0.0906598 1.54821 1 0 1 1 0 0 +EDGE2 5831 5830 -0.978612 -0.0106355 -1.60169 1 0 1 1 0 0 +EDGE2 5831 3490 -0.979887 0.00587514 -1.54555 1 0 1 1 0 0 +EDGE2 5831 3110 -0.946779 0.0164851 -1.56614 1 0 1 1 0 0 +EDGE2 5831 3130 -0.928566 0.00961966 -1.5652 1 0 1 1 0 0 +EDGE2 5831 3090 -1.04247 -0.0345194 -1.54249 1 0 1 1 0 0 +EDGE2 5831 1130 -1.05273 0.0778359 1.58799 1 0 1 1 0 0 +EDGE2 5831 1170 -0.996893 -0.0671391 -1.55195 1 0 1 1 0 0 +EDGE2 5831 1190 -0.928643 -0.029989 -1.57355 1 0 1 1 0 0 +EDGE2 5831 3030 -0.996854 0.0108702 1.56604 1 0 1 1 0 0 +EDGE2 5831 1150 -0.943735 0.022433 1.56373 1 0 1 1 0 0 +EDGE2 5831 1110 -1.00623 -0.0440341 1.56077 1 0 1 1 0 0 +EDGE2 5832 1173 1.03391 -0.0149476 0.00157379 1 0 1 1 0 0 +EDGE2 5832 3133 1.01341 0.0675325 -0.0127162 1 0 1 1 0 0 +EDGE2 5832 3493 1.07939 -0.0737158 -0.0430222 1 0 1 1 0 0 +EDGE2 5832 5813 1.0534 0.00877466 0.00910921 1 0 1 1 0 0 +EDGE2 5832 3173 0.971413 -0.0193239 -0.0159623 1 0 1 1 0 0 +EDGE2 5832 3093 0.990784 -0.00951789 0.0138481 1 0 1 1 0 0 +EDGE2 5832 3113 1.02044 0.000325583 0.0229537 1 0 1 1 0 0 +EDGE2 5832 1193 0.998604 -0.0275426 0.0479163 1 0 1 1 0 0 +EDGE2 5832 3131 -0.983787 0.0679282 -0.0077801 1 0 1 1 0 0 +EDGE2 5832 3092 -0.0379402 -0.0672531 0.0281459 1 0 1 1 0 0 +EDGE2 5832 5812 -0.00739206 -0.0161493 0.0365994 1 0 1 1 0 0 +EDGE2 5832 1153 1.03242 0.0866366 0.00441536 1 0 1 1 0 0 +EDGE2 5832 3132 0.0469894 -0.0175676 -0.019266 1 0 1 1 0 0 +EDGE2 5832 3172 -0.036074 -0.0697112 -0.0145327 1 0 1 1 0 0 +EDGE2 5832 3492 -0.0416834 0.0664303 -0.0387618 1 0 1 1 0 0 +EDGE2 5832 3112 0.0835929 -0.0269207 0.00462826 1 0 1 1 0 0 +EDGE2 5832 1152 0.0113659 0.0430896 0.0166521 1 0 1 1 0 0 +EDGE2 5832 1172 -0.00821011 0.0260688 -0.0126241 1 0 1 1 0 0 +EDGE2 5832 1192 -0.0475196 0.0582745 -0.0234974 1 0 1 1 0 0 +EDGE2 5832 3491 -1.00707 -0.0140342 -0.00882183 1 0 1 1 0 0 +EDGE2 5832 5811 -0.963039 -0.043265 -0.0162256 1 0 1 1 0 0 +EDGE2 5832 5831 -1.01894 -0.0670704 0.0114072 1 0 1 1 0 0 +EDGE2 5832 3171 -0.914219 0.0227543 -0.00805264 1 0 1 1 0 0 +EDGE2 5832 1151 -1.04398 0.055523 -0.0181533 1 0 1 1 0 0 +EDGE2 5832 1191 -0.963386 0.0139316 -0.0258304 1 0 1 1 0 0 +EDGE2 5832 3091 -1.00583 0.0329617 -0.00534041 1 0 1 1 0 0 +EDGE2 5832 3111 -0.942233 0.0367778 -0.0328463 1 0 1 1 0 0 +EDGE2 5832 1171 -0.993776 -0.0546726 -0.00187313 1 0 1 1 0 0 +EDGE2 5833 1173 -0.00516297 -0.0409377 0.0269697 1 0 1 1 0 0 +EDGE2 5833 1174 0.993118 -0.0432737 0.0115075 1 0 1 1 0 0 +EDGE2 5833 3174 0.962821 0.0131652 -0.0157068 1 0 1 1 0 0 +EDGE2 5833 5814 0.943873 -0.10312 -0.0454084 1 0 1 1 0 0 +EDGE2 5833 3494 1.01851 -0.00392269 0.00154316 1 0 1 1 0 0 +EDGE2 5833 3094 1.06067 -0.030192 0.0360081 1 0 1 1 0 0 +EDGE2 5833 3114 0.922108 -0.0676365 0.00137167 1 0 1 1 0 0 +EDGE2 5833 3134 1.0122 -0.00791027 -0.00393834 1 0 1 1 0 0 +EDGE2 5833 1194 1.0953 0.0653433 0.00831504 1 0 1 1 0 0 +EDGE2 5833 1154 1.01951 0.0607063 -0.000209036 1 0 1 1 0 0 +EDGE2 5833 3133 -0.0608758 -0.0522791 0.000472637 1 0 1 1 0 0 +EDGE2 5833 3493 0.0632979 -0.0159946 0.00437301 1 0 1 1 0 0 +EDGE2 5833 5813 -0.0927241 -0.0112645 -6.89701e-05 1 0 1 1 0 0 +EDGE2 5833 3173 -0.0333699 0.0420925 -0.00930933 1 0 1 1 0 0 +EDGE2 5833 3093 0.00826986 0.0427905 -0.0126712 1 0 1 1 0 0 +EDGE2 5833 3113 0.0537567 0.0794896 0.00406807 1 0 1 1 0 0 +EDGE2 5833 1193 0.0742357 0.0364821 -0.0141658 1 0 1 1 0 0 +EDGE2 5833 3092 -0.951486 0.0455603 0.00225083 1 0 1 1 0 0 +EDGE2 5833 5812 -1.0221 0.0390132 0.0233116 1 0 1 1 0 0 +EDGE2 5833 1153 -0.0738534 -0.0508277 0.0181094 1 0 1 1 0 0 +EDGE2 5833 5832 -0.990847 0.0387551 0.0312981 1 0 1 1 0 0 +EDGE2 5833 3132 -1.07498 -0.0268174 0.0152595 1 0 1 1 0 0 +EDGE2 5833 3172 -0.970953 -0.0971614 0.0475116 1 0 1 1 0 0 +EDGE2 5833 3492 -0.957613 -0.0260221 0.00280712 1 0 1 1 0 0 +EDGE2 5833 3112 -1.0096 -0.00815101 -0.0178324 1 0 1 1 0 0 +EDGE2 5833 1152 -1.03402 0.0685112 -0.00239808 1 0 1 1 0 0 +EDGE2 5833 1172 -1.00718 -0.00517902 0.0228289 1 0 1 1 0 0 +EDGE2 5833 1192 -1.07307 -0.0407922 -0.00346571 1 0 1 1 0 0 +EDGE2 5834 3495 0.999867 -0.0460891 -0.00763946 1 0 1 1 0 0 +EDGE2 5834 5815 0.950069 0.127927 0.0326778 1 0 1 1 0 0 +EDGE2 5834 1173 -1.02955 -0.0110635 -0.0336967 1 0 1 1 0 0 +EDGE2 5834 1174 0.00874654 -0.00180553 0.0102897 1 0 1 1 0 0 +EDGE2 5834 3115 1.00011 0.0156236 -0.0014748 1 0 1 1 0 0 +EDGE2 5834 3175 0.987301 -0.0486492 -0.00570797 1 0 1 1 0 0 +EDGE2 5834 3375 1.02833 0.0450977 -3.14328 1 0 1 1 0 0 +EDGE2 5834 3475 1.03516 -0.101417 -3.15568 1 0 1 1 0 0 +EDGE2 5834 3135 1.00904 -0.0748833 0.00103141 1 0 1 1 0 0 +EDGE2 5834 1175 1.0218 -0.0654981 -0.00364735 1 0 1 1 0 0 +EDGE2 5834 1195 1.00887 0.0402392 -0.023768 1 0 1 1 0 0 +EDGE2 5834 3095 0.956931 -0.0336504 0.00791851 1 0 1 1 0 0 +EDGE2 5834 1155 0.967724 0.0158831 0.0148405 1 0 1 1 0 0 +EDGE2 5834 3174 0.00796076 0.0834186 0.00958499 1 0 1 1 0 0 +EDGE2 5834 5814 -0.050067 0.00927829 0.017981 1 0 1 1 0 0 +EDGE2 5834 3494 0.00613159 -0.0942475 -0.000468056 1 0 1 1 0 0 +EDGE2 5834 3094 -0.032224 0.0429827 0.021991 1 0 1 1 0 0 +EDGE2 5834 3114 -0.0789845 -0.00589727 0.0156525 1 0 1 1 0 0 +EDGE2 5834 3134 0.0619449 0.0251783 -0.00407141 1 0 1 1 0 0 +EDGE2 5834 1194 -0.111524 -0.0105524 -0.00565318 1 0 1 1 0 0 +EDGE2 5834 1154 -0.0495179 -0.0840059 -0.012448 1 0 1 1 0 0 +EDGE2 5834 3133 -0.952578 -0.024919 0.0190132 1 0 1 1 0 0 +EDGE2 5834 3493 -1.0183 0.0168361 -0.0133722 1 0 1 1 0 0 +EDGE2 5834 5813 -0.921699 0.0363926 -0.000548368 1 0 1 1 0 0 +EDGE2 5834 5833 -0.980362 -0.10485 0.00415972 1 0 1 1 0 0 +EDGE2 5834 3173 -0.956345 -0.033494 -0.0032555 1 0 1 1 0 0 +EDGE2 5834 3093 -1.0097 0.0215435 0.00412133 1 0 1 1 0 0 +EDGE2 5834 3113 -1.00326 -0.0177135 0.0131835 1 0 1 1 0 0 +EDGE2 5834 1193 -0.948394 0.0167744 -0.0164811 1 0 1 1 0 0 +EDGE2 5834 1153 -0.994876 -0.013331 -0.00872757 1 0 1 1 0 0 +EDGE2 5835 3495 -0.0962274 0.0830559 -0.000860276 1 0 1 1 0 0 +EDGE2 5835 3474 0.920668 0.00956734 -3.14086 1 0 1 1 0 0 +EDGE2 5835 3374 0.964467 -0.0546238 -3.18473 1 0 1 1 0 0 +EDGE2 5835 1196 -0.0487933 0.988427 1.57764 1 0 1 1 0 0 +EDGE2 5835 3476 0.00755273 1.09612 1.56104 1 0 1 1 0 0 +EDGE2 5835 5816 -0.0554044 0.996026 1.54909 1 0 1 1 0 0 +EDGE2 5835 3116 0.0623 1.05551 1.53484 1 0 1 1 0 0 +EDGE2 5835 3136 -0.0248098 1.05162 1.57499 1 0 1 1 0 0 +EDGE2 5835 3376 0.101952 1.01177 1.55025 1 0 1 1 0 0 +EDGE2 5835 3096 -0.063352 0.964793 1.57137 1 0 1 1 0 0 +EDGE2 5835 1156 0.0032392 1.09504 1.56273 1 0 1 1 0 0 +EDGE2 5835 1176 -0.0180416 1.07374 1.57541 1 0 1 1 0 0 +EDGE2 5835 5815 -0.0131278 -0.0267666 -0.0145429 1 0 1 1 0 0 +EDGE2 5835 1174 -1.04602 0.0479665 -0.0113136 1 0 1 1 0 0 +EDGE2 5835 3115 0.0694322 -0.00470682 0.0066071 1 0 1 1 0 0 +EDGE2 5835 3175 -0.050956 0.0189308 -0.0375428 1 0 1 1 0 0 +EDGE2 5835 3375 0.0385477 0.0405124 -3.14252 1 0 1 1 0 0 +EDGE2 5835 3475 -0.0105384 0.0188508 -3.168 1 0 1 1 0 0 +EDGE2 5835 3135 -0.101099 0.0894794 0.0130588 1 0 1 1 0 0 +EDGE2 5835 1175 0.00073659 0.0586132 -0.0425767 1 0 1 1 0 0 +EDGE2 5835 1195 -0.0110984 -0.0256897 -0.00439732 1 0 1 1 0 0 +EDGE2 5835 3095 0.0951905 0.0137378 -0.0137175 1 0 1 1 0 0 +EDGE2 5835 1155 -0.0345782 -0.0862056 -0.0320884 1 0 1 1 0 0 +EDGE2 5835 3174 -0.951382 -0.0594066 0.0260088 1 0 1 1 0 0 +EDGE2 5835 5814 -1.021 0.0784033 -0.0142656 1 0 1 1 0 0 +EDGE2 5835 5834 -0.96642 0.0423398 -0.0241624 1 0 1 1 0 0 +EDGE2 5835 3494 -0.915323 -0.0385439 0.00147904 1 0 1 1 0 0 +EDGE2 5835 3094 -0.99021 -0.00349457 0.0116425 1 0 1 1 0 0 +EDGE2 5835 3114 -0.977562 0.0582515 0.0338268 1 0 1 1 0 0 +EDGE2 5835 3134 -1.07795 0.0583212 -0.0207429 1 0 1 1 0 0 +EDGE2 5835 1194 -1.04021 -0.0616755 -0.0227155 1 0 1 1 0 0 +EDGE2 5835 1154 -1.04249 -0.0169374 0.0225446 1 0 1 1 0 0 +EDGE2 5835 3176 0.0575371 -0.993296 -1.54174 1 0 1 1 0 0 +EDGE2 5835 3496 -0.0364754 -1.11068 -1.56364 1 0 1 1 0 0 +EDGE2 5836 3495 -0.990408 0.00766455 -1.5747 1 0 1 1 0 0 +EDGE2 5836 1197 1.05018 -0.040897 -0.00468351 1 0 1 1 0 0 +EDGE2 5836 3477 1.03021 -0.0269716 -0.0360846 1 0 1 1 0 0 +EDGE2 5836 5817 1.01406 -0.032596 0.00821976 1 0 1 1 0 0 +EDGE2 5836 3117 1.04724 0.0346442 -0.00576492 1 0 1 1 0 0 +EDGE2 5836 3137 1.02556 0.0594945 -0.0030695 1 0 1 1 0 0 +EDGE2 5836 3377 1.04424 0.0532624 -0.0152996 1 0 1 1 0 0 +EDGE2 5836 3097 0.938501 0.00878543 -0.00813397 1 0 1 1 0 0 +EDGE2 5836 1177 1.09123 0.0726669 0.00192555 1 0 1 1 0 0 +EDGE2 5836 1157 0.985771 0.00610308 0.0299611 1 0 1 1 0 0 +EDGE2 5836 1196 0.0294507 -0.0264418 0.00422834 1 0 1 1 0 0 +EDGE2 5836 3476 0.00593198 0.0617477 0.00962947 1 0 1 1 0 0 +EDGE2 5836 5816 0.0122923 0.0473303 -0.0218031 1 0 1 1 0 0 +EDGE2 5836 3116 -0.0941082 0.0158498 0.0103073 1 0 1 1 0 0 +EDGE2 5836 3136 -0.0168237 0.031151 -0.0226347 1 0 1 1 0 0 +EDGE2 5836 3376 -0.0175357 -0.0115346 -0.00578093 1 0 1 1 0 0 +EDGE2 5836 3096 -0.124673 -0.00252489 -0.0239676 1 0 1 1 0 0 +EDGE2 5836 1156 -0.0251265 -0.0210597 -0.0517897 1 0 1 1 0 0 +EDGE2 5836 1176 -0.0094769 0.0593575 0.00743293 1 0 1 1 0 0 +EDGE2 5836 5835 -0.958986 -0.0782218 -1.59748 1 0 1 1 0 0 +EDGE2 5836 5815 -0.988512 0.0590059 -1.58142 1 0 1 1 0 0 +EDGE2 5836 3115 -0.982227 0.030567 -1.57479 1 0 1 1 0 0 +EDGE2 5836 3175 -0.987152 -0.016523 -1.56069 1 0 1 1 0 0 +EDGE2 5836 3375 -1.02524 0.0690072 1.53966 1 0 1 1 0 0 +EDGE2 5836 3475 -0.947317 -0.0564536 1.56862 1 0 1 1 0 0 +EDGE2 5836 3135 -0.974751 0.00273845 -1.52064 1 0 1 1 0 0 +EDGE2 5836 1175 -1.05796 -0.0522944 -1.56827 1 0 1 1 0 0 +EDGE2 5836 1195 -1.04217 -0.0563574 -1.58134 1 0 1 1 0 0 +EDGE2 5836 3095 -1.00046 0.00592968 -1.55039 1 0 1 1 0 0 +EDGE2 5836 1155 -0.995209 -0.0205192 -1.56902 1 0 1 1 0 0 +EDGE2 5837 1197 -0.0366238 0.0651298 -0.0128598 1 0 1 1 0 0 +EDGE2 5837 5818 0.962877 -0.0660324 0.00979427 1 0 1 1 0 0 +EDGE2 5837 3098 1.07063 0.00719258 -0.00235907 1 0 1 1 0 0 +EDGE2 5837 3138 0.942941 0.00894118 0.00849347 1 0 1 1 0 0 +EDGE2 5837 3378 0.977111 0.0349255 0.00576044 1 0 1 1 0 0 +EDGE2 5837 3478 1.08746 -0.0154055 -0.0100669 1 0 1 1 0 0 +EDGE2 5837 3118 0.90654 -0.0308782 -0.0281204 1 0 1 1 0 0 +EDGE2 5837 1178 1.02055 0.0109427 -0.00179828 1 0 1 1 0 0 +EDGE2 5837 1198 1.00409 0.085357 -0.012764 1 0 1 1 0 0 +EDGE2 5837 1158 0.909566 0.0501676 0.016012 1 0 1 1 0 0 +EDGE2 5837 3477 -0.0124515 0.0127165 0.00785173 1 0 1 1 0 0 +EDGE2 5837 5817 0.037171 0.0571637 -0.0320769 1 0 1 1 0 0 +EDGE2 5837 3117 -0.114892 -0.0665254 0.0196462 1 0 1 1 0 0 +EDGE2 5837 3137 0.0956646 -0.149981 -0.000329709 1 0 1 1 0 0 +EDGE2 5837 3377 0.0238703 -0.038256 -0.0210565 1 0 1 1 0 0 +EDGE2 5837 3097 -0.0270405 0.0286075 -0.026319 1 0 1 1 0 0 +EDGE2 5837 1177 -0.0544248 -0.11279 0.0263407 1 0 1 1 0 0 +EDGE2 5837 1157 -0.0462131 -0.0198755 0.00577034 1 0 1 1 0 0 +EDGE2 5837 1196 -0.986726 -0.0138495 0.0228256 1 0 1 1 0 0 +EDGE2 5837 3476 -0.995181 -0.0616314 0.0349104 1 0 1 1 0 0 +EDGE2 5837 5836 -1.02008 0.00904543 0.0230179 1 0 1 1 0 0 +EDGE2 5837 5816 -1.0007 0.0134979 -0.0117669 1 0 1 1 0 0 +EDGE2 5837 3116 -0.924895 -0.0671696 -0.0208853 1 0 1 1 0 0 +EDGE2 5837 3136 -0.939487 -0.0596039 0.00491761 1 0 1 1 0 0 +EDGE2 5837 3376 -1.06024 0.0348135 -0.00323544 1 0 1 1 0 0 +EDGE2 5837 3096 -0.951979 -0.0775429 -0.017306 1 0 1 1 0 0 +EDGE2 5837 1156 -0.92737 0.00810975 0.0121796 1 0 1 1 0 0 +EDGE2 5837 1176 -0.961565 -0.0662728 0.00205295 1 0 1 1 0 0 +EDGE2 5838 1197 -1.11237 0.0320801 -0.00826218 1 0 1 1 0 0 +EDGE2 5838 3119 1.06753 -0.00720885 0.0170858 1 0 1 1 0 0 +EDGE2 5838 3379 0.99576 0.0448079 0.00916991 1 0 1 1 0 0 +EDGE2 5838 3479 0.963733 0.0391005 -0.028866 1 0 1 1 0 0 +EDGE2 5838 5819 0.99652 -0.0897214 -0.00685478 1 0 1 1 0 0 +EDGE2 5838 3139 0.985658 -0.0509804 -0.00092935 1 0 1 1 0 0 +EDGE2 5838 1179 0.941573 0.048773 3.3124e-05 1 0 1 1 0 0 +EDGE2 5838 1199 1.01942 -6.47611e-05 -0.0228037 1 0 1 1 0 0 +EDGE2 5838 3099 1.07369 -0.00735573 -0.0287521 1 0 1 1 0 0 +EDGE2 5838 1159 1.0686 -0.0725647 -0.0223093 1 0 1 1 0 0 +EDGE2 5838 5818 0.01883 0.00831573 0.0160282 1 0 1 1 0 0 +EDGE2 5838 3098 0.0432192 0.0415582 0.00709586 1 0 1 1 0 0 +EDGE2 5838 3138 0.037252 0.0809651 -0.0189217 1 0 1 1 0 0 +EDGE2 5838 3378 -0.0354808 0.0615708 0.00413033 1 0 1 1 0 0 +EDGE2 5838 3478 0.00176575 0.0599448 -0.0405451 1 0 1 1 0 0 +EDGE2 5838 3118 -0.0182902 0.032641 0.000632855 1 0 1 1 0 0 +EDGE2 5838 1178 0.0347201 -0.0935505 -0.0120119 1 0 1 1 0 0 +EDGE2 5838 1198 -0.00438477 -0.0198183 -0.00336568 1 0 1 1 0 0 +EDGE2 5838 1158 -0.0111767 -0.0256391 0.0165359 1 0 1 1 0 0 +EDGE2 5838 3477 -0.951797 0.0156688 -0.0032723 1 0 1 1 0 0 +EDGE2 5838 5837 -1.03305 0.064624 0.0370587 1 0 1 1 0 0 +EDGE2 5838 5817 -0.979053 0.0197294 0.00421171 1 0 1 1 0 0 +EDGE2 5838 3117 -1.09761 0.0686815 -0.00952613 1 0 1 1 0 0 +EDGE2 5838 3137 -0.968665 0.0100147 0.0128513 1 0 1 1 0 0 +EDGE2 5838 3377 -1.03475 -0.017725 0.0220018 1 0 1 1 0 0 +EDGE2 5838 3097 -0.991566 0.0915039 -0.0147416 1 0 1 1 0 0 +EDGE2 5838 1177 -0.942667 -0.0228049 -0.00713766 1 0 1 1 0 0 +EDGE2 5838 1157 -1.07886 -0.0671884 -0.0084906 1 0 1 1 0 0 +EDGE2 5839 5820 0.994701 0.0646403 0.00848999 1 0 1 1 0 0 +EDGE2 5839 1160 1.0844 -0.0178681 0.0343489 1 0 1 1 0 0 +EDGE2 5839 3140 1.05027 -0.0221818 0.00877048 1 0 1 1 0 0 +EDGE2 5839 3420 1.03751 -0.0176273 -3.20168 1 0 1 1 0 0 +EDGE2 5839 3440 0.998774 0.0944424 -3.12821 1 0 1 1 0 0 +EDGE2 5839 3480 1.00452 -0.0727092 -0.00455694 1 0 1 1 0 0 +EDGE2 5839 3380 0.968054 0.0544201 0.00868648 1 0 1 1 0 0 +EDGE2 5839 1200 0.973674 0.0665092 0.0134062 1 0 1 1 0 0 +EDGE2 5839 3100 1.01734 -0.0213113 0.00909304 1 0 1 1 0 0 +EDGE2 5839 3120 0.990376 -0.0597018 -0.0190796 1 0 1 1 0 0 +EDGE2 5839 1180 1.02653 -0.106012 -0.0122366 1 0 1 1 0 0 +EDGE2 5839 900 1.01499 0.0181693 -3.15451 1 0 1 1 0 0 +EDGE2 5839 840 1.02732 -0.0625444 -3.11958 1 0 1 1 0 0 +EDGE2 5839 860 1.04497 0.0465143 -3.15596 1 0 1 1 0 0 +EDGE2 5839 3119 -0.0432334 -0.0381041 -0.00393466 1 0 1 1 0 0 +EDGE2 5839 3379 -0.0143652 0.00929342 0.0212365 1 0 1 1 0 0 +EDGE2 5839 3479 0.0304538 -0.0985547 0.0200013 1 0 1 1 0 0 +EDGE2 5839 5819 -0.0506768 -0.0648019 0.00757462 1 0 1 1 0 0 +EDGE2 5839 3139 0.0148457 0.0109194 -0.0189923 1 0 1 1 0 0 +EDGE2 5839 1179 -0.0334367 0.0239894 0.0140502 1 0 1 1 0 0 +EDGE2 5839 1199 -0.0413118 -0.00833922 -0.0172561 1 0 1 1 0 0 +EDGE2 5839 3099 -0.00760933 -0.0046159 -0.00487569 1 0 1 1 0 0 +EDGE2 5839 1159 0.00934091 0.0343737 -0.0106124 1 0 1 1 0 0 +EDGE2 5839 5818 -0.957254 -0.0890446 -0.00407182 1 0 1 1 0 0 +EDGE2 5839 5838 -0.968963 0.023612 0.00239656 1 0 1 1 0 0 +EDGE2 5839 3098 -1.00636 -0.099952 0.0280358 1 0 1 1 0 0 +EDGE2 5839 3138 -0.949792 -0.0969036 0.00645159 1 0 1 1 0 0 +EDGE2 5839 3378 -0.961 0.0324034 -0.0211998 1 0 1 1 0 0 +EDGE2 5839 3478 -0.940487 0.0880922 -0.00695938 1 0 1 1 0 0 +EDGE2 5839 3118 -1.04174 -0.0299193 -0.000313478 1 0 1 1 0 0 +EDGE2 5839 1178 -0.921034 0.00567575 -0.000134768 1 0 1 1 0 0 +EDGE2 5839 1198 -1.04134 -0.0379148 -0.0289917 1 0 1 1 0 0 +EDGE2 5839 1158 -0.940769 -0.0175641 -0.000717335 1 0 1 1 0 0 +EDGE2 5840 5820 0.00352297 -0.0376198 -0.00325618 1 0 1 1 0 0 +EDGE2 5840 839 0.952587 0.0400445 -3.13443 1 0 1 1 0 0 +EDGE2 5840 899 1.05803 0.0383379 -3.15787 1 0 1 1 0 0 +EDGE2 5840 3419 1.02308 -0.0922433 -3.14502 1 0 1 1 0 0 +EDGE2 5840 3439 0.977626 -0.0323415 -3.15087 1 0 1 1 0 0 +EDGE2 5840 859 1.04191 -0.0852185 -3.14639 1 0 1 1 0 0 +EDGE2 5840 3441 -0.0251009 -1.03364 -1.58203 1 0 1 1 0 0 +EDGE2 5840 841 0.0518016 -0.968931 -1.58989 1 0 1 1 0 0 +EDGE2 5840 901 0.0842034 -1.02072 -1.59367 1 0 1 1 0 0 +EDGE2 5840 1201 0.029734 -1.09513 -1.59126 1 0 1 1 0 0 +EDGE2 5840 3421 -0.0102455 -0.980214 -1.57288 1 0 1 1 0 0 +EDGE2 5840 861 -0.0328688 -1.02149 -1.62696 1 0 1 1 0 0 +EDGE2 5840 5821 0.0225404 1.06153 1.58276 1 0 1 1 0 0 +EDGE2 5840 1160 -0.00124515 -0.0640258 -0.0106139 1 0 1 1 0 0 +EDGE2 5840 3140 0.0636225 -0.0470096 0.0267799 1 0 1 1 0 0 +EDGE2 5840 3420 -0.0462324 0.078001 -3.14357 1 0 1 1 0 0 +EDGE2 5840 3440 0.0116292 -0.0136152 -3.15294 1 0 1 1 0 0 +EDGE2 5840 3480 0.176224 0.0252221 -0.0281193 1 0 1 1 0 0 +EDGE2 5840 3380 0.0656899 0.0240283 0.0408684 1 0 1 1 0 0 +EDGE2 5840 1200 0.107021 -0.0589744 -0.041806 1 0 1 1 0 0 +EDGE2 5840 3100 -0.0260602 -0.0881714 0.01263 1 0 1 1 0 0 +EDGE2 5840 3120 0.104741 0.0135268 0.0156985 1 0 1 1 0 0 +EDGE2 5840 1180 0.0102496 0.0233502 -0.0162864 1 0 1 1 0 0 +EDGE2 5840 900 -0.00329379 -0.0189518 -3.15093 1 0 1 1 0 0 +EDGE2 5840 840 0.0171252 -0.0253855 -3.1011 1 0 1 1 0 0 +EDGE2 5840 860 -0.00244245 -0.0878842 -3.13254 1 0 1 1 0 0 +EDGE2 5840 3101 0.0149872 1.02482 1.54778 1 0 1 1 0 0 +EDGE2 5840 3141 0.0234112 1.00606 1.53812 1 0 1 1 0 0 +EDGE2 5840 3381 -0.0294102 0.993642 1.59175 1 0 1 1 0 0 +EDGE2 5840 3481 -0.0666335 0.979781 1.60971 1 0 1 1 0 0 +EDGE2 5840 3121 0.0126022 0.947859 1.54824 1 0 1 1 0 0 +EDGE2 5840 1161 -0.0310787 0.949949 1.58034 1 0 1 1 0 0 +EDGE2 5840 1181 -0.0112058 0.96384 1.5068 1 0 1 1 0 0 +EDGE2 5840 5839 -1.02158 0.044937 -0.0117759 1 0 1 1 0 0 +EDGE2 5840 3119 -1.07497 -0.0208057 0.00493443 1 0 1 1 0 0 +EDGE2 5840 3379 -0.909517 0.00589824 0.0371077 1 0 1 1 0 0 +EDGE2 5840 3479 -1.01069 -0.0509545 -0.0145866 1 0 1 1 0 0 +EDGE2 5840 5819 -1.0478 0.0531458 -0.0126657 1 0 1 1 0 0 +EDGE2 5840 3139 -0.995088 -0.0027751 0.0164691 1 0 1 1 0 0 +EDGE2 5840 1179 -0.990556 -0.0599332 0.0125914 1 0 1 1 0 0 +EDGE2 5840 1199 -0.991917 -0.0751453 0.00265244 1 0 1 1 0 0 +EDGE2 5840 3099 -1.06203 0.0767376 0.0262868 1 0 1 1 0 0 +EDGE2 5840 1159 -1.06356 -0.0294165 0.00655818 1 0 1 1 0 0 +EDGE2 5841 5820 -0.995302 0.00361082 -1.58396 1 0 1 1 0 0 +EDGE2 5841 5840 -1.00995 -0.0331678 -1.56546 1 0 1 1 0 0 +EDGE2 5841 5821 -0.0010666 0.0427756 -0.00211387 1 0 1 1 0 0 +EDGE2 5841 1160 -0.983689 0.00919521 -1.54195 1 0 1 1 0 0 +EDGE2 5841 3140 -1.09033 -0.0829718 -1.56872 1 0 1 1 0 0 +EDGE2 5841 3420 -1.01253 0.00857046 1.54185 1 0 1 1 0 0 +EDGE2 5841 3440 -0.961478 0.0213536 1.58962 1 0 1 1 0 0 +EDGE2 5841 3480 -0.983705 0.0403355 -1.60033 1 0 1 1 0 0 +EDGE2 5841 3380 -0.987505 -0.0272645 -1.57022 1 0 1 1 0 0 +EDGE2 5841 1200 -0.91964 -0.0107868 -1.53498 1 0 1 1 0 0 +EDGE2 5841 3100 -1.09812 0.145103 -1.58068 1 0 1 1 0 0 +EDGE2 5841 3120 -0.961024 -0.0532275 -1.54459 1 0 1 1 0 0 +EDGE2 5841 1180 -0.991876 0.00549089 -1.57842 1 0 1 1 0 0 +EDGE2 5841 900 -1.03753 -0.0206531 1.58156 1 0 1 1 0 0 +EDGE2 5841 840 -0.975928 0.0139919 1.56187 1 0 1 1 0 0 +EDGE2 5841 860 -1.0048 0.0524264 1.54697 1 0 1 1 0 0 +EDGE2 5841 3482 0.949084 -0.111255 -0.00599715 1 0 1 1 0 0 +EDGE2 5841 3101 0.048429 0.126296 -0.00263891 1 0 1 1 0 0 +EDGE2 5841 3141 0.0185522 0.0771375 -0.000703039 1 0 1 1 0 0 +EDGE2 5841 3381 -0.0484243 -0.0634358 0.0182929 1 0 1 1 0 0 +EDGE2 5841 3481 -0.0472953 0.0254711 -0.00611226 1 0 1 1 0 0 +EDGE2 5841 3121 -0.0632999 0.0162586 -0.0320875 1 0 1 1 0 0 +EDGE2 5841 1161 0.00823227 0.0173002 -0.00400524 1 0 1 1 0 0 +EDGE2 5841 1181 -0.0120757 0.00908895 -0.0118657 1 0 1 1 0 0 +EDGE2 5841 5822 0.995019 0.0129981 -0.00799603 1 0 1 1 0 0 +EDGE2 5841 1182 0.962764 -0.0644855 -0.0070097 1 0 1 1 0 0 +EDGE2 5841 3122 0.987362 0.0440074 -0.0319654 1 0 1 1 0 0 +EDGE2 5841 3142 1.01868 0.0538767 -0.00941439 1 0 1 1 0 0 +EDGE2 5841 3382 0.931854 -0.0376453 0.0113585 1 0 1 1 0 0 +EDGE2 5841 3102 0.973611 0.0833999 -0.00274506 1 0 1 1 0 0 +EDGE2 5841 1162 1.03637 -0.0340784 -0.0100399 1 0 1 1 0 0 +EDGE2 5842 5821 -0.999659 0.0702157 0.0404106 1 0 1 1 0 0 +EDGE2 5842 5841 -0.928848 0.00614931 0.0218015 1 0 1 1 0 0 +EDGE2 5842 3383 1.13148 -0.0667071 -0.00441491 1 0 1 1 0 0 +EDGE2 5842 3482 -0.0567396 -0.0329099 -0.0161657 1 0 1 1 0 0 +EDGE2 5842 3101 -0.93015 0.00656454 0.00873579 1 0 1 1 0 0 +EDGE2 5842 3141 -1.03206 -0.0497053 0.00668379 1 0 1 1 0 0 +EDGE2 5842 3381 -0.946846 -0.0355166 0.00659864 1 0 1 1 0 0 +EDGE2 5842 3481 -1.07805 0.0115448 0.030971 1 0 1 1 0 0 +EDGE2 5842 3121 -0.947516 -0.023837 -0.0186792 1 0 1 1 0 0 +EDGE2 5842 1161 -1.07657 0.105225 -0.00343687 1 0 1 1 0 0 +EDGE2 5842 1181 -0.992343 0.0259861 0.0248983 1 0 1 1 0 0 +EDGE2 5842 5822 0.0175399 -0.00425106 0.00631981 1 0 1 1 0 0 +EDGE2 5842 1182 -0.0797372 -0.00846542 0.0161051 1 0 1 1 0 0 +EDGE2 5842 3122 -0.139517 0.0309047 0.0475954 1 0 1 1 0 0 +EDGE2 5842 3142 -0.0097739 -0.0488378 0.00471289 1 0 1 1 0 0 +EDGE2 5842 3382 0.00596302 -0.0255805 -0.0761176 1 0 1 1 0 0 +EDGE2 5842 3102 0.0139014 0.00600905 0.0017041 1 0 1 1 0 0 +EDGE2 5842 5823 0.995801 0.071211 -0.00340413 1 0 1 1 0 0 +EDGE2 5842 1162 -0.027847 0.0361016 0.0112292 1 0 1 1 0 0 +EDGE2 5842 3483 1.08919 -0.0327379 -0.0101004 1 0 1 1 0 0 +EDGE2 5842 1163 0.99456 -0.0576897 -0.00130368 1 0 1 1 0 0 +EDGE2 5842 3103 1.05232 -0.0109895 -0.0103682 1 0 1 1 0 0 +EDGE2 5842 3123 1.1313 0.00420563 0.0260363 1 0 1 1 0 0 +EDGE2 5842 3143 1.04853 -0.0248107 -0.0251043 1 0 1 1 0 0 +EDGE2 5842 1183 1.02734 -0.0351421 0.0250819 1 0 1 1 0 0 +EDGE2 5843 3383 -0.00451957 -0.0826353 -0.0140567 1 0 1 1 0 0 +EDGE2 5843 3482 -0.904084 -0.0589281 0.00291081 1 0 1 1 0 0 +EDGE2 5843 5842 -0.934078 0.0317922 -0.0158437 1 0 1 1 0 0 +EDGE2 5843 5822 -1.02145 -0.0238322 -0.0151998 1 0 1 1 0 0 +EDGE2 5843 1182 -0.968617 0.0361681 -0.0224719 1 0 1 1 0 0 +EDGE2 5843 3122 -0.935444 0.00214701 0.00931891 1 0 1 1 0 0 +EDGE2 5843 3142 -0.992114 0.114484 -0.00573887 1 0 1 1 0 0 +EDGE2 5843 3382 -1.03883 -0.000502463 -0.000597334 1 0 1 1 0 0 +EDGE2 5843 3102 -1.02663 0.0353486 0.0019232 1 0 1 1 0 0 +EDGE2 5843 5823 -0.0476364 -0.0318962 -0.0197369 1 0 1 1 0 0 +EDGE2 5843 1162 -0.998886 -0.0177535 0.0186306 1 0 1 1 0 0 +EDGE2 5843 3483 0.00500337 0.0696502 -0.0297319 1 0 1 1 0 0 +EDGE2 5843 3144 1.05035 0.0348833 0.0208958 1 0 1 1 0 0 +EDGE2 5843 1163 -0.0374294 -0.0591243 0.0258174 1 0 1 1 0 0 +EDGE2 5843 3103 -0.0222236 -0.0289212 0.0218555 1 0 1 1 0 0 +EDGE2 5843 3123 0.00249146 -0.0195568 0.0219591 1 0 1 1 0 0 +EDGE2 5843 3143 0.0296819 -0.0341446 0.0496593 1 0 1 1 0 0 +EDGE2 5843 1183 -0.0422297 -0.0210469 0.0384184 1 0 1 1 0 0 +EDGE2 5843 3484 0.974634 0.0189813 0.0148876 1 0 1 1 0 0 +EDGE2 5843 5824 1.01546 0.00597535 -0.0193796 1 0 1 1 0 0 +EDGE2 5843 3384 0.978928 0.0287892 -0.0183949 1 0 1 1 0 0 +EDGE2 5843 1184 1.05669 -0.0996752 0.00273115 1 0 1 1 0 0 +EDGE2 5843 3104 0.961225 -0.0488985 0.0185984 1 0 1 1 0 0 +EDGE2 5843 3124 0.980754 0.0517931 -8.2528e-05 1 0 1 1 0 0 +EDGE2 5843 1164 0.92613 -0.0377607 -0.0218414 1 0 1 1 0 0 +EDGE2 5844 3383 -0.973026 -0.0386909 0.0204542 1 0 1 1 0 0 +EDGE2 5844 5823 -0.964249 0.07535 -0.0141355 1 0 1 1 0 0 +EDGE2 5844 5843 -0.989837 -0.0070948 -0.00760413 1 0 1 1 0 0 +EDGE2 5844 3483 -0.993466 0.0393935 0.00304014 1 0 1 1 0 0 +EDGE2 5844 3144 -0.0802983 -0.0294559 0.048682 1 0 1 1 0 0 +EDGE2 5844 1163 -1.02724 -0.0219033 -0.0295869 1 0 1 1 0 0 +EDGE2 5844 3103 -1.01225 -0.0447338 -0.0243828 1 0 1 1 0 0 +EDGE2 5844 3123 -1.05554 0.0595684 -0.00291405 1 0 1 1 0 0 +EDGE2 5844 3143 -1.10175 0.0592126 -0.0261977 1 0 1 1 0 0 +EDGE2 5844 1183 -1.07999 -0.00947798 -0.0126788 1 0 1 1 0 0 +EDGE2 5844 3484 0.0406053 -0.0567633 -0.000461685 1 0 1 1 0 0 +EDGE2 5844 5824 0.0349045 -0.0214004 -0.0123017 1 0 1 1 0 0 +EDGE2 5844 3384 -0.0598492 -0.0333112 -0.0107992 1 0 1 1 0 0 +EDGE2 5844 1184 0.0350916 -0.00468845 0.0307324 1 0 1 1 0 0 +EDGE2 5844 3104 0.00264656 -0.0248218 0.00121387 1 0 1 1 0 0 +EDGE2 5844 3124 0.00585533 0.00454218 0.00428411 1 0 1 1 0 0 +EDGE2 5844 1164 0.0463453 0.0704986 0.0049702 1 0 1 1 0 0 +EDGE2 5844 3105 1.03706 -0.0789771 0.00449013 1 0 1 1 0 0 +EDGE2 5844 3485 0.970782 0.0491684 0.015037 1 0 1 1 0 0 +EDGE2 5844 5825 0.944178 -0.022685 -0.0056868 1 0 1 1 0 0 +EDGE2 5844 3145 0.983992 -0.0100436 0.0159013 1 0 1 1 0 0 +EDGE2 5844 3165 1.04746 0.0111497 -3.12857 1 0 1 1 0 0 +EDGE2 5844 3385 1.04975 -0.0279401 -0.0161567 1 0 1 1 0 0 +EDGE2 5844 3125 0.924507 -0.0374058 0.00674087 1 0 1 1 0 0 +EDGE2 5844 1185 0.936185 0.0386319 -0.00675012 1 0 1 1 0 0 +EDGE2 5844 3065 1.01069 0.0509371 -3.11996 1 0 1 1 0 0 +EDGE2 5844 3085 1.05367 0.0274889 -3.16932 1 0 1 1 0 0 +EDGE2 5844 1165 1.00392 -0.0111095 0.00494838 1 0 1 1 0 0 +EDGE2 5845 3146 -0.0230717 -1.02517 -1.55467 1 0 1 1 0 0 +EDGE2 5845 3386 -0.0112204 -1.02101 -1.55375 1 0 1 1 0 0 +EDGE2 5845 3066 0.0119831 -1.0813 -1.56612 1 0 1 1 0 0 +EDGE2 5845 3144 -0.978582 -0.0123083 -0.0345864 1 0 1 1 0 0 +EDGE2 5845 3484 -0.980318 0.0644553 -0.0244603 1 0 1 1 0 0 +EDGE2 5845 5824 -1.04429 -0.0919646 -0.0300307 1 0 1 1 0 0 +EDGE2 5845 5844 -1.03447 0.0494002 0.045888 1 0 1 1 0 0 +EDGE2 5845 3384 -0.954797 0.064174 -0.00286559 1 0 1 1 0 0 +EDGE2 5845 1184 -1.0645 0.0136646 -0.000710202 1 0 1 1 0 0 +EDGE2 5845 3104 -1.06972 -0.00738304 0.00274362 1 0 1 1 0 0 +EDGE2 5845 3124 -1.01575 0.0307319 0.00811166 1 0 1 1 0 0 +EDGE2 5845 1164 -0.960042 -0.0622779 -0.0121284 1 0 1 1 0 0 +EDGE2 5845 3166 -0.101939 0.997516 1.55071 1 0 1 1 0 0 +EDGE2 5845 3105 0.0175082 0.0405137 -0.0286151 1 0 1 1 0 0 +EDGE2 5845 3485 -0.0279177 0.0246528 0.0109331 1 0 1 1 0 0 +EDGE2 5845 5825 -0.0137947 -0.04361 -0.032921 1 0 1 1 0 0 +EDGE2 5845 3145 -0.0775682 0.0589747 0.00029713 1 0 1 1 0 0 +EDGE2 5845 3165 0.0330782 -0.0580732 -3.16014 1 0 1 1 0 0 +EDGE2 5845 3385 -0.0898523 -0.0154636 0.00586352 1 0 1 1 0 0 +EDGE2 5845 3125 -0.0142648 0.0353332 -0.0107495 1 0 1 1 0 0 +EDGE2 5845 1185 -0.00181478 0.00452918 0.0467737 1 0 1 1 0 0 +EDGE2 5845 3065 -0.00692099 -0.0240282 -3.11613 1 0 1 1 0 0 +EDGE2 5845 3085 0.0560715 0.00337398 -3.162 1 0 1 1 0 0 +EDGE2 5845 1165 -0.0425647 -0.047006 0.020041 1 0 1 1 0 0 +EDGE2 5845 5826 0.028502 0.980107 1.59189 1 0 1 1 0 0 +EDGE2 5845 3486 0.143528 1.00545 1.56259 1 0 1 1 0 0 +EDGE2 5845 1166 0.0024635 0.986974 1.55388 1 0 1 1 0 0 +EDGE2 5845 3086 -0.0181188 1.00882 1.53888 1 0 1 1 0 0 +EDGE2 5845 3106 -0.0208086 1.01551 1.5885 1 0 1 1 0 0 +EDGE2 5845 3126 0.0352874 0.992455 1.55284 1 0 1 1 0 0 +EDGE2 5845 1186 0.090289 1.00788 1.57783 1 0 1 1 0 0 +EDGE2 5845 3064 0.959448 -0.00818438 -3.14492 1 0 1 1 0 0 +EDGE2 5845 3164 0.9141 -0.0773309 -3.17327 1 0 1 1 0 0 +EDGE2 5845 3084 1.05544 0.0106772 -3.16645 1 0 1 1 0 0 +EDGE2 5846 3166 -0.112328 0.0378254 -0.0189189 1 0 1 1 0 0 +EDGE2 5846 3105 -0.937989 0.0256434 -1.5771 1 0 1 1 0 0 +EDGE2 5846 3485 -1.0527 -0.0512639 -1.59361 1 0 1 1 0 0 +EDGE2 5846 5845 -0.984844 0.0271676 -1.54904 1 0 1 1 0 0 +EDGE2 5846 5825 -1.0256 -0.0688933 -1.5956 1 0 1 1 0 0 +EDGE2 5846 3145 -1.04702 -0.0504771 -1.56243 1 0 1 1 0 0 +EDGE2 5846 3165 -0.994817 -0.13334 1.5643 1 0 1 1 0 0 +EDGE2 5846 3385 -1.00039 0.047538 -1.58263 1 0 1 1 0 0 +EDGE2 5846 3125 -1.05712 0.0669259 -1.55032 1 0 1 1 0 0 +EDGE2 5846 1185 -1.03249 -0.0284871 -1.56764 1 0 1 1 0 0 +EDGE2 5846 3065 -0.974288 0.0314172 1.52001 1 0 1 1 0 0 +EDGE2 5846 3085 -0.999757 -0.0734466 1.58402 1 0 1 1 0 0 +EDGE2 5846 1165 -0.977187 -0.0893585 -1.55054 1 0 1 1 0 0 +EDGE2 5846 5826 -0.0280483 -0.0485182 -0.0215914 1 0 1 1 0 0 +EDGE2 5846 3486 -0.0558325 0.0335642 0.0148392 1 0 1 1 0 0 +EDGE2 5846 1166 9.9058e-05 -0.0547065 -0.0229194 1 0 1 1 0 0 +EDGE2 5846 3086 -0.110125 -0.0122302 0.0214288 1 0 1 1 0 0 +EDGE2 5846 3106 0.0675361 -0.0942875 -0.0193672 1 0 1 1 0 0 +EDGE2 5846 3126 -0.0103159 0.0410353 -0.0170886 1 0 1 1 0 0 +EDGE2 5846 1186 0.0471719 0.00259786 0.0154377 1 0 1 1 0 0 +EDGE2 5846 3107 0.929102 0.0205396 -0.0223486 1 0 1 1 0 0 +EDGE2 5846 3167 0.970406 -0.00299746 -0.00107874 1 0 1 1 0 0 +EDGE2 5846 3487 1.00448 0.0547487 0.0135202 1 0 1 1 0 0 +EDGE2 5846 5827 1.02062 -0.0393718 0.00165786 1 0 1 1 0 0 +EDGE2 5846 3127 1.0118 0.0480387 -0.0271439 1 0 1 1 0 0 +EDGE2 5846 1187 1.00005 -0.0650887 0.0101363 1 0 1 1 0 0 +EDGE2 5846 3087 1.16121 0.0492261 0.0155251 1 0 1 1 0 0 +EDGE2 5846 1167 0.959479 -0.133616 0.0227271 1 0 1 1 0 0 +EDGE2 5847 3166 -0.963981 0.0384419 -0.0288047 1 0 1 1 0 0 +EDGE2 5847 5826 -1.01911 -0.0920848 0.0107744 1 0 1 1 0 0 +EDGE2 5847 5846 -1.08293 0.0802773 -0.0119191 1 0 1 1 0 0 +EDGE2 5847 3486 -0.984669 -0.0191794 0.00270338 1 0 1 1 0 0 +EDGE2 5847 1166 -0.985619 -0.00264491 0.01634 1 0 1 1 0 0 +EDGE2 5847 3086 -1.00671 0.0165834 0.0124665 1 0 1 1 0 0 +EDGE2 5847 3106 -0.972985 0.0115592 -0.0147091 1 0 1 1 0 0 +EDGE2 5847 3126 -0.984223 -0.0280975 -0.00226341 1 0 1 1 0 0 +EDGE2 5847 1186 -0.85588 0.0860107 0.00772475 1 0 1 1 0 0 +EDGE2 5847 3107 -0.00826332 -0.0328107 -0.0248428 1 0 1 1 0 0 +EDGE2 5847 3167 0.0468171 0.00849193 0.0358223 1 0 1 1 0 0 +EDGE2 5847 3487 -0.00839208 -0.0663677 0.0361516 1 0 1 1 0 0 +EDGE2 5847 5827 -0.0025373 0.0274642 0.0252604 1 0 1 1 0 0 +EDGE2 5847 3127 -0.00722706 -0.0370699 -0.0242087 1 0 1 1 0 0 +EDGE2 5847 1187 0.0425365 -0.00449841 -0.00480894 1 0 1 1 0 0 +EDGE2 5847 3087 0.0423079 -0.0789425 -0.0254998 1 0 1 1 0 0 +EDGE2 5847 1167 -0.0435471 -0.0605863 -0.000477066 1 0 1 1 0 0 +EDGE2 5847 3128 0.977793 -0.0359616 -0.0579983 1 0 1 1 0 0 +EDGE2 5847 3488 1.04752 -0.0354187 0.00180622 1 0 1 1 0 0 +EDGE2 5847 5828 1.02091 -0.0186036 0.00275093 1 0 1 1 0 0 +EDGE2 5847 3168 0.996864 -0.0122352 -0.0218273 1 0 1 1 0 0 +EDGE2 5847 1188 1.059 0.0305908 0.00180587 1 0 1 1 0 0 +EDGE2 5847 3088 0.997102 -0.039939 -0.0375701 1 0 1 1 0 0 +EDGE2 5847 3108 0.977336 -0.0168064 -0.0137599 1 0 1 1 0 0 +EDGE2 5847 1168 0.952018 -0.0157372 0.0172925 1 0 1 1 0 0 +EDGE2 5848 5847 -1.03483 0.0386238 0.00800761 1 0 1 1 0 0 +EDGE2 5848 3107 -1.0049 -0.0246444 -0.00881265 1 0 1 1 0 0 +EDGE2 5848 3167 -1.03245 -0.091485 0.0137168 1 0 1 1 0 0 +EDGE2 5848 3487 -1.03678 -0.00796299 0.00288673 1 0 1 1 0 0 +EDGE2 5848 5827 -1.01198 -0.0353872 -0.0137719 1 0 1 1 0 0 +EDGE2 5848 3127 -1.07391 -0.045061 -0.0141807 1 0 1 1 0 0 +EDGE2 5848 1187 -0.91873 -0.0279152 -0.0251151 1 0 1 1 0 0 +EDGE2 5848 3087 -1.06696 0.0111349 -0.0475052 1 0 1 1 0 0 +EDGE2 5848 1167 -0.930576 -0.0550825 -0.0402399 1 0 1 1 0 0 +EDGE2 5848 3128 -0.044086 0.0931242 0.00166765 1 0 1 1 0 0 +EDGE2 5848 3488 -0.0844357 -0.00735101 0.0241725 1 0 1 1 0 0 +EDGE2 5848 5828 0.0927892 0.100157 0.0134333 1 0 1 1 0 0 +EDGE2 5848 3168 0.00227308 0.00875912 0.00262107 1 0 1 1 0 0 +EDGE2 5848 1188 -0.072766 -0.02272 0.00067779 1 0 1 1 0 0 +EDGE2 5848 3088 -0.0795264 0.0154776 -0.00200098 1 0 1 1 0 0 +EDGE2 5848 3108 0.0196549 -0.021153 0.0358054 1 0 1 1 0 0 +EDGE2 5848 1168 -0.112953 0.0229721 0.000963773 1 0 1 1 0 0 +EDGE2 5848 3109 1.01035 -0.054558 0.00470086 1 0 1 1 0 0 +EDGE2 5848 3169 1.00437 -0.00832714 0.0217868 1 0 1 1 0 0 +EDGE2 5848 3489 0.980819 -0.1142 0.0385459 1 0 1 1 0 0 +EDGE2 5848 5829 1.03219 -0.0173432 -0.0141174 1 0 1 1 0 0 +EDGE2 5848 3129 0.953992 -0.0747346 -0.00633212 1 0 1 1 0 0 +EDGE2 5848 1189 1.06891 0.0786016 0.0355692 1 0 1 1 0 0 +EDGE2 5848 3089 0.925957 -0.0243329 0.00116837 1 0 1 1 0 0 +EDGE2 5848 1169 1.07317 0.0657221 0.0244601 1 0 1 1 0 0 +EDGE2 5849 3128 -0.94221 0.0788226 0.0018069 1 0 1 1 0 0 +EDGE2 5849 3488 -0.91634 -0.00725549 -0.00267457 1 0 1 1 0 0 +EDGE2 5849 5828 -0.919413 -0.104238 0.0154216 1 0 1 1 0 0 +EDGE2 5849 5848 -0.990456 -0.0420789 -0.0210376 1 0 1 1 0 0 +EDGE2 5849 3168 -1.04938 -0.0343609 -0.00820367 1 0 1 1 0 0 +EDGE2 5849 1188 -0.973291 -0.103692 -0.0148029 1 0 1 1 0 0 +EDGE2 5849 3088 -0.974484 0.0380779 -0.0090391 1 0 1 1 0 0 +EDGE2 5849 3108 -1.05568 0.0400713 0.0197063 1 0 1 1 0 0 +EDGE2 5849 1168 -0.968176 0.0439531 -0.000673787 1 0 1 1 0 0 +EDGE2 5849 3109 0.0645289 -0.0049024 -0.00856961 1 0 1 1 0 0 +EDGE2 5849 3169 -0.0374461 -0.0166084 0.0270185 1 0 1 1 0 0 +EDGE2 5849 3489 0.00199654 -0.0581814 -0.0169554 1 0 1 1 0 0 +EDGE2 5849 5829 0.0665005 0.0638513 -0.0388794 1 0 1 1 0 0 +EDGE2 5849 3129 0.012814 -0.0424938 -0.0059475 1 0 1 1 0 0 +EDGE2 5849 1189 -0.0641519 -0.00897512 -0.000944238 1 0 1 1 0 0 +EDGE2 5849 3089 0.00798149 -0.0816608 -0.0207457 1 0 1 1 0 0 +EDGE2 5849 1169 0.0343622 -0.113649 -0.0094288 1 0 1 1 0 0 +EDGE2 5849 3050 1.03883 0.0405734 -3.16306 1 0 1 1 0 0 +EDGE2 5849 3170 1.06908 -0.0338932 -0.0106852 1 0 1 1 0 0 +EDGE2 5849 5790 0.979836 -0.0038454 -3.1191 1 0 1 1 0 0 +EDGE2 5849 5810 0.935097 0.0757723 -3.11005 1 0 1 1 0 0 +EDGE2 5849 5830 1.07174 0.0298279 -0.0291198 1 0 1 1 0 0 +EDGE2 5849 3490 1.0718 -0.0141216 0.0164797 1 0 1 1 0 0 +EDGE2 5849 3110 1.02639 -0.00375093 0.0287445 1 0 1 1 0 0 +EDGE2 5849 3130 1.09422 -0.0672006 0.00641415 1 0 1 1 0 0 +EDGE2 5849 3090 0.871815 -0.0667272 -0.00951887 1 0 1 1 0 0 +EDGE2 5849 1130 1.1284 -0.0258099 -3.16409 1 0 1 1 0 0 +EDGE2 5849 1170 0.983261 0.0649253 -0.0185991 1 0 1 1 0 0 +EDGE2 5849 1190 1.01823 -0.0134641 -0.0444223 1 0 1 1 0 0 +EDGE2 5849 3030 1.02253 -0.0568124 -3.13451 1 0 1 1 0 0 +EDGE2 5849 1150 1.00735 0.049168 -3.1124 1 0 1 1 0 0 +EDGE2 5849 1110 1.0357 -0.0107032 -3.12148 1 0 1 1 0 0 +EDGE2 5850 5849 -1.08406 -0.0330204 -0.0051571 1 0 1 1 0 0 +EDGE2 5850 3109 -0.938779 0.02399 0.00835711 1 0 1 1 0 0 +EDGE2 5850 3169 -1.00529 -0.000647391 0.0259016 1 0 1 1 0 0 +EDGE2 5850 3489 -1.00763 -0.0696958 -0.0221453 1 0 1 1 0 0 +EDGE2 5850 5829 -1.10064 -0.0363141 0.0266788 1 0 1 1 0 0 +EDGE2 5850 3129 -0.989828 0.000437274 0.0139152 1 0 1 1 0 0 +EDGE2 5850 1189 -0.978725 0.0304295 -0.0215451 1 0 1 1 0 0 +EDGE2 5850 3089 -0.951559 -0.0162319 0.0304497 1 0 1 1 0 0 +EDGE2 5850 1169 -0.991146 0.0806296 -0.00297123 1 0 1 1 0 0 +EDGE2 5850 3050 0.0143173 -0.0174938 -3.14641 1 0 1 1 0 0 +EDGE2 5850 3131 0.0292954 1.00501 1.57515 1 0 1 1 0 0 +EDGE2 5850 3491 -0.124483 1.06946 1.58655 1 0 1 1 0 0 +EDGE2 5850 5811 0.0172188 0.982242 1.60449 1 0 1 1 0 0 +EDGE2 5850 5831 0.155022 1.02434 1.58435 1 0 1 1 0 0 +EDGE2 5850 3171 0.0698216 1.04973 1.5633 1 0 1 1 0 0 +EDGE2 5850 1151 -0.0783978 0.959263 1.56753 1 0 1 1 0 0 +EDGE2 5850 1191 -0.0521693 1.03797 1.56535 1 0 1 1 0 0 +EDGE2 5850 3091 0.0290024 0.957587 1.57582 1 0 1 1 0 0 +EDGE2 5850 3111 0.0167603 0.947028 1.56787 1 0 1 1 0 0 +EDGE2 5850 1171 -0.066065 1.00486 1.53189 1 0 1 1 0 0 +EDGE2 5850 3170 0.0556671 -0.00330068 -0.00443857 1 0 1 1 0 0 +EDGE2 5850 5790 0.119377 -0.0793147 -3.15202 1 0 1 1 0 0 +EDGE2 5850 5810 -0.0206857 -0.0250614 -3.14809 1 0 1 1 0 0 +EDGE2 5850 5830 0.0208997 -0.073185 -0.0178869 1 0 1 1 0 0 +EDGE2 5850 3490 0.0151617 -0.0801494 0.00758626 1 0 1 1 0 0 +EDGE2 5850 3110 0.0104374 0.0206989 -0.0167273 1 0 1 1 0 0 +EDGE2 5850 3130 0.0860782 2.96971e-05 -0.0144257 1 0 1 1 0 0 +EDGE2 5850 3090 -0.013029 -0.0180004 0.00952887 1 0 1 1 0 0 +EDGE2 5850 5789 1.0243 -0.078192 -3.10586 1 0 1 1 0 0 +EDGE2 5850 1130 -0.0719319 -0.057998 -3.16438 1 0 1 1 0 0 +EDGE2 5850 1170 -0.0486546 0.0283656 -0.0332969 1 0 1 1 0 0 +EDGE2 5850 1190 -0.0329316 -0.0423488 0.0512677 1 0 1 1 0 0 +EDGE2 5850 3030 -0.0545769 0.0249374 -3.12374 1 0 1 1 0 0 +EDGE2 5850 1150 -0.0762982 -0.0795878 -3.14678 1 0 1 1 0 0 +EDGE2 5850 1110 0.0678473 -0.0449622 -3.14062 1 0 1 1 0 0 +EDGE2 5850 5809 1.01685 0.0233185 -3.12705 1 0 1 1 0 0 +EDGE2 5850 1109 1.08077 0.0585085 -3.17586 1 0 1 1 0 0 +EDGE2 5850 1149 0.954684 -0.0697378 -3.11103 1 0 1 1 0 0 +EDGE2 5850 3029 1.04531 -0.00507989 -3.13309 1 0 1 1 0 0 +EDGE2 5850 3049 0.997891 0.0180225 -3.11266 1 0 1 1 0 0 +EDGE2 5850 1129 1.04167 0.0345157 -3.14157 1 0 1 1 0 0 +EDGE2 5850 1111 -0.00716052 -0.986826 -1.54756 1 0 1 1 0 0 +EDGE2 5850 3031 -0.0897165 -1.04507 -1.5567 1 0 1 1 0 0 +EDGE2 5850 3051 -0.00694713 -0.99854 -1.56808 1 0 1 1 0 0 +EDGE2 5850 5791 0.0969965 -0.977071 -1.5691 1 0 1 1 0 0 +EDGE2 5850 1131 0.00309561 -0.938568 -1.60038 1 0 1 1 0 0 +EDGE2 5851 3050 -1.00024 -0.00957742 -1.57537 1 0 1 1 0 0 +EDGE2 5851 5850 -1.03801 0.00670448 1.59446 1 0 1 1 0 0 +EDGE2 5851 3170 -1.04343 0.0557743 1.5612 1 0 1 1 0 0 +EDGE2 5851 5790 -1.01708 -0.00619932 -1.58311 1 0 1 1 0 0 +EDGE2 5851 5810 -0.949357 0.0303251 -1.57919 1 0 1 1 0 0 +EDGE2 5851 5830 -0.99345 -0.0277555 1.57311 1 0 1 1 0 0 +EDGE2 5851 3490 -0.981459 -0.0605173 1.60387 1 0 1 1 0 0 +EDGE2 5851 3110 -0.936296 0.0291492 1.58877 1 0 1 1 0 0 +EDGE2 5851 3130 -1.04783 0.0804074 1.56006 1 0 1 1 0 0 +EDGE2 5851 3090 -0.949173 0.0222013 1.5428 1 0 1 1 0 0 +EDGE2 5851 1130 -0.985116 0.00318077 -1.55853 1 0 1 1 0 0 +EDGE2 5851 1170 -0.982475 -0.0264144 1.60258 1 0 1 1 0 0 +EDGE2 5851 1190 -1.01827 -0.0312068 1.56715 1 0 1 1 0 0 +EDGE2 5851 3030 -1.01745 -0.0200504 -1.5586 1 0 1 1 0 0 +EDGE2 5851 1150 -1.02521 -0.0350665 -1.56149 1 0 1 1 0 0 +EDGE2 5851 1110 -1.08798 -0.021277 -1.55974 1 0 1 1 0 0 +EDGE2 5851 3052 1.04804 -0.010253 0.0170162 1 0 1 1 0 0 +EDGE2 5851 1111 0.00016679 -0.0606826 0.0223349 1 0 1 1 0 0 +EDGE2 5851 3031 0.021471 0.000145942 -0.0165002 1 0 1 1 0 0 +EDGE2 5851 3051 -0.0604996 -0.109352 0.0226809 1 0 1 1 0 0 +EDGE2 5851 5791 -0.0998781 0.000900332 -0.0105927 1 0 1 1 0 0 +EDGE2 5851 1131 0.009242 0.0370342 -0.0134418 1 0 1 1 0 0 +EDGE2 5851 5792 1.05654 -0.0306895 -0.0132033 1 0 1 1 0 0 +EDGE2 5851 1112 0.987453 0.00511777 0.0176789 1 0 1 1 0 0 +EDGE2 5851 1132 1.00649 -0.0689072 0.00403878 1 0 1 1 0 0 +EDGE2 5851 3032 0.904054 -0.0553427 0.00715036 1 0 1 1 0 0 +EDGE2 5852 5851 -0.949011 -0.0147844 0.0265452 1 0 1 1 0 0 +EDGE2 5852 1133 0.975247 0.00429956 -0.0389821 1 0 1 1 0 0 +EDGE2 5852 3052 -0.090625 -0.0329614 -0.0351384 1 0 1 1 0 0 +EDGE2 5852 1111 -0.942907 -0.0283172 -0.0496403 1 0 1 1 0 0 +EDGE2 5852 3031 -0.911976 0.0370128 0.0152265 1 0 1 1 0 0 +EDGE2 5852 3051 -1.02615 0.0309064 0.000313169 1 0 1 1 0 0 +EDGE2 5852 5791 -0.999878 0.0636811 -0.0150762 1 0 1 1 0 0 +EDGE2 5852 1131 -1.04714 0.00853987 -0.0100489 1 0 1 1 0 0 +EDGE2 5852 5792 0.00481127 -0.00242169 0.0117663 1 0 1 1 0 0 +EDGE2 5852 1112 -0.0833328 0.0825485 -0.0024453 1 0 1 1 0 0 +EDGE2 5852 1132 0.0177596 0.0626107 -0.0466551 1 0 1 1 0 0 +EDGE2 5852 3032 -0.0712418 -0.0456918 0.036032 1 0 1 1 0 0 +EDGE2 5852 3053 0.993266 -0.0360246 0.00551234 1 0 1 1 0 0 +EDGE2 5852 5793 0.985425 -0.0391397 -0.021943 1 0 1 1 0 0 +EDGE2 5852 3033 1.01698 0.00105468 0.0155732 1 0 1 1 0 0 +EDGE2 5852 1113 1.04419 -0.0229965 -0.016933 1 0 1 1 0 0 +EDGE2 5853 1133 0.0536852 -0.0989702 0.00346474 1 0 1 1 0 0 +EDGE2 5853 3052 -0.99091 -0.0175555 -0.0428228 1 0 1 1 0 0 +EDGE2 5853 5852 -0.957031 0.0533304 0.00161952 1 0 1 1 0 0 +EDGE2 5853 5792 -1.08103 0.0125865 0.0144178 1 0 1 1 0 0 +EDGE2 5853 1112 -1.01129 0.00942517 0.0281146 1 0 1 1 0 0 +EDGE2 5853 1132 -0.976314 -0.0358533 -0.030179 1 0 1 1 0 0 +EDGE2 5853 3032 -1.04302 0.0565078 -0.000700371 1 0 1 1 0 0 +EDGE2 5853 3053 0.0270237 0.0170775 -0.00329602 1 0 1 1 0 0 +EDGE2 5853 5793 -0.08643 0.0143822 -0.00879255 1 0 1 1 0 0 +EDGE2 5853 3033 0.135095 -0.0765813 -0.0285662 1 0 1 1 0 0 +EDGE2 5853 5794 0.974886 -0.0708562 0.0138236 1 0 1 1 0 0 +EDGE2 5853 1113 0.0716734 0.0544278 -0.00496564 1 0 1 1 0 0 +EDGE2 5853 1134 0.977397 0.0440913 -0.00896112 1 0 1 1 0 0 +EDGE2 5853 3034 0.968588 -0.0595946 -0.00245782 1 0 1 1 0 0 +EDGE2 5853 3054 1.04191 0.0436626 -0.0211067 1 0 1 1 0 0 +EDGE2 5853 1114 0.983315 0.00578084 -0.0103152 1 0 1 1 0 0 +EDGE2 5854 5795 1.02744 0.111263 0.006542 1 0 1 1 0 0 +EDGE2 5854 1133 -0.990694 0.0113819 0.00116999 1 0 1 1 0 0 +EDGE2 5854 3053 -0.969537 0.0368224 0.00583558 1 0 1 1 0 0 +EDGE2 5854 5793 -0.946155 -0.0981925 0.00228664 1 0 1 1 0 0 +EDGE2 5854 5853 -1.05834 -0.0295343 0.0188738 1 0 1 1 0 0 +EDGE2 5854 3033 -1.06899 0.0970134 -0.00148039 1 0 1 1 0 0 +EDGE2 5854 5794 0.0516968 -0.00197141 0.0169774 1 0 1 1 0 0 +EDGE2 5854 1113 -1.01112 -0.039389 0.0128672 1 0 1 1 0 0 +EDGE2 5854 1134 0.0357492 -0.0652796 -0.0044278 1 0 1 1 0 0 +EDGE2 5854 3034 -0.0391056 -0.0260016 0.0365965 1 0 1 1 0 0 +EDGE2 5854 3054 0.00824102 -0.00725758 0.0075196 1 0 1 1 0 0 +EDGE2 5854 1114 0.00367733 0.0417572 0.00960472 1 0 1 1 0 0 +EDGE2 5854 3035 0.961837 0.0158735 -0.0206523 1 0 1 1 0 0 +EDGE2 5854 3055 1.00671 -0.030268 -0.0206833 1 0 1 1 0 0 +EDGE2 5854 1095 0.998444 0.017696 -3.16673 1 0 1 1 0 0 +EDGE2 5854 1115 1.05162 -0.0150725 -0.0188697 1 0 1 1 0 0 +EDGE2 5854 1135 0.972666 -0.0254579 -0.0287993 1 0 1 1 0 0 +EDGE2 5855 5795 -0.0452351 -0.101218 0.0109284 1 0 1 1 0 0 +EDGE2 5855 3056 -0.0427564 -0.994197 -1.58504 1 0 1 1 0 0 +EDGE2 5855 5794 -0.958416 0.031958 0.0103151 1 0 1 1 0 0 +EDGE2 5855 5854 -1.00354 -0.0164563 0.0243607 1 0 1 1 0 0 +EDGE2 5855 1134 -1.08545 0.0306168 -0.000680568 1 0 1 1 0 0 +EDGE2 5855 3034 -1.00171 0.0254846 0.0178729 1 0 1 1 0 0 +EDGE2 5855 3054 -1.10706 0.0162227 -0.00771158 1 0 1 1 0 0 +EDGE2 5855 1114 -0.966572 -0.00903288 -0.0239675 1 0 1 1 0 0 +EDGE2 5855 3035 0.00806892 -0.0379505 -0.0168069 1 0 1 1 0 0 +EDGE2 5855 3055 -0.00199207 -5.85189e-05 -0.0250126 1 0 1 1 0 0 +EDGE2 5855 1095 0.0543852 0.0277091 -3.15706 1 0 1 1 0 0 +EDGE2 5855 1115 0.0188329 -0.0653573 0.0265402 1 0 1 1 0 0 +EDGE2 5855 1135 -0.0683011 0.0360584 0.0056183 1 0 1 1 0 0 +EDGE2 5855 1094 1.00092 0.017782 -3.15271 1 0 1 1 0 0 +EDGE2 5855 1116 0.00210216 0.934157 1.54119 1 0 1 1 0 0 +EDGE2 5855 3036 -0.0111268 0.968857 1.57628 1 0 1 1 0 0 +EDGE2 5855 5796 0.0411762 1.00123 1.59207 1 0 1 1 0 0 +EDGE2 5855 1136 0.076524 0.966034 1.56959 1 0 1 1 0 0 +EDGE2 5855 1096 0.0414922 0.94181 1.57069 1 0 1 1 0 0 +EDGE2 5856 5795 -1.01134 0.034362 1.57342 1 0 1 1 0 0 +EDGE2 5856 3057 0.918896 -0.00671488 -0.00195835 1 0 1 1 0 0 +EDGE2 5856 3056 0.0303115 0.0471437 -0.0169377 1 0 1 1 0 0 +EDGE2 5856 5855 -1.04535 -0.0502096 1.5327 1 0 1 1 0 0 +EDGE2 5856 3035 -1.02232 -0.00723111 1.56149 1 0 1 1 0 0 +EDGE2 5856 3055 -1.07139 0.0311711 1.57525 1 0 1 1 0 0 +EDGE2 5856 1095 -0.954832 0.0416168 -1.59018 1 0 1 1 0 0 +EDGE2 5856 1115 -0.960248 -0.0397608 1.53311 1 0 1 1 0 0 +EDGE2 5856 1135 -1.01835 0.0428858 1.55172 1 0 1 1 0 0 +EDGE2 5857 3058 1.08903 0.0679121 0.012346 1 0 1 1 0 0 +EDGE2 5857 3057 -0.00629212 0.0637192 0.014397 1 0 1 1 0 0 +EDGE2 5857 5856 -1.08013 0.00620186 0.008346 1 0 1 1 0 0 +EDGE2 5857 3056 -1.09897 -0.0211542 -0.00617886 1 0 1 1 0 0 +EDGE2 5858 3059 0.999589 -0.0123544 -0.0335797 1 0 1 1 0 0 +EDGE2 5858 3058 -0.0251026 -0.0598099 -0.040031 1 0 1 1 0 0 +EDGE2 5858 3057 -1.03466 -0.00225677 0.0153277 1 0 1 1 0 0 +EDGE2 5858 5857 -1.05522 -0.0756431 -0.00558719 1 0 1 1 0 0 +EDGE2 5859 3060 1.02172 -0.0312827 0.0267106 1 0 1 1 0 0 +EDGE2 5859 3160 1.04936 -0.0317676 -3.10764 1 0 1 1 0 0 +EDGE2 5859 3080 0.929081 -0.00557176 -3.16873 1 0 1 1 0 0 +EDGE2 5859 1080 0.933818 -0.0624979 -3.15688 1 0 1 1 0 0 +EDGE2 5859 3059 0.0114421 0.0609855 5.58572e-05 1 0 1 1 0 0 +EDGE2 5859 3058 -1.08633 -0.00474546 0.0474725 1 0 1 1 0 0 +EDGE2 5859 5858 -0.98606 -0.00283339 -0.0189601 1 0 1 1 0 0 +EDGE2 5860 3079 0.995912 0.0601609 -3.15092 1 0 1 1 0 0 +EDGE2 5860 3159 0.984633 0.0318988 -3.17812 1 0 1 1 0 0 +EDGE2 5860 1079 1.01772 -0.0189516 -3.13285 1 0 1 1 0 0 +EDGE2 5860 3081 0.00494724 -0.97039 -1.59014 1 0 1 1 0 0 +EDGE2 5860 3161 -0.0595056 -1.0449 -1.56014 1 0 1 1 0 0 +EDGE2 5860 3061 -0.00526786 -1.01749 -1.57793 1 0 1 1 0 0 +EDGE2 5860 3060 -0.0133134 -0.0136045 -0.0292292 1 0 1 1 0 0 +EDGE2 5860 3160 -0.0667051 -0.0363093 -3.15482 1 0 1 1 0 0 +EDGE2 5860 3080 -0.0403806 -0.00394014 -3.16784 1 0 1 1 0 0 +EDGE2 5860 1080 0.0554232 -0.0293471 -3.1622 1 0 1 1 0 0 +EDGE2 5860 1081 0.0245177 1.02696 1.57801 1 0 1 1 0 0 +EDGE2 5860 5859 -1.07282 0.0136481 -0.00085236 1 0 1 1 0 0 +EDGE2 5860 3059 -1.00215 0.000171934 0.0132054 1 0 1 1 0 0 +EDGE2 5861 3060 -0.957245 -0.0495191 -1.57354 1 0 1 1 0 0 +EDGE2 5861 3160 -0.974647 0.0135685 1.54134 1 0 1 1 0 0 +EDGE2 5861 5860 -0.949086 0.000339635 -1.61563 1 0 1 1 0 0 +EDGE2 5861 3080 -1.02516 0.0282131 1.56839 1 0 1 1 0 0 +EDGE2 5861 1080 -0.956404 -0.0533934 1.57103 1 0 1 1 0 0 +EDGE2 5861 1081 0.0770075 -0.00891379 -0.0354902 1 0 1 1 0 0 +EDGE2 5861 1082 0.970567 0.0103767 -0.0271356 1 0 1 1 0 0 +EDGE2 5862 1081 -0.872186 0.0382465 -0.0088685 1 0 1 1 0 0 +EDGE2 5862 5861 -1.10463 0.0440031 0.00568731 1 0 1 1 0 0 +EDGE2 5862 1082 -0.0610153 -0.00438441 0.00872286 1 0 1 1 0 0 +EDGE2 5862 1083 1.05108 0.0657084 0.000336464 1 0 1 1 0 0 +EDGE2 5863 5862 -0.918782 0.0355926 0.034817 1 0 1 1 0 0 +EDGE2 5863 1082 -1.00814 0.0350612 -0.0183793 1 0 1 1 0 0 +EDGE2 5863 1083 0.044642 -0.0184455 -0.0225441 1 0 1 1 0 0 +EDGE2 5863 1084 0.936579 -0.00823038 0.0068091 1 0 1 1 0 0 +EDGE2 5864 1083 -0.981261 0.0310585 0.00490039 1 0 1 1 0 0 +EDGE2 5864 5863 -0.99435 0.0927814 0.0118505 1 0 1 1 0 0 +EDGE2 5864 1084 -0.0257052 0.0578918 -0.0249868 1 0 1 1 0 0 +EDGE2 5864 1045 0.938793 -0.0122714 -3.15699 1 0 1 1 0 0 +EDGE2 5864 1085 0.981739 0.0734038 -0.0134827 1 0 1 1 0 0 +EDGE2 5865 1046 0.0121443 -0.983015 -1.58589 1 0 1 1 0 0 +EDGE2 5865 1084 -1.05716 -0.0362766 -0.047644 1 0 1 1 0 0 +EDGE2 5865 5864 -1.01015 0.075501 -0.00220758 1 0 1 1 0 0 +EDGE2 5865 1045 -0.0112362 0.101245 -3.13051 1 0 1 1 0 0 +EDGE2 5865 1085 0.054892 0.123333 0.00750364 1 0 1 1 0 0 +EDGE2 5865 1044 0.907034 -0.0255322 -3.15347 1 0 1 1 0 0 +EDGE2 5865 1086 0.0290337 0.962643 1.57453 1 0 1 1 0 0 +EDGE2 5866 1045 -0.901193 -0.0285811 1.56335 1 0 1 1 0 0 +EDGE2 5866 1085 -1.01634 0.0494764 -1.59988 1 0 1 1 0 0 +EDGE2 5866 5865 -1.02526 -0.0526893 -1.55266 1 0 1 1 0 0 +EDGE2 5866 1086 0.0131923 -0.105401 0.0210995 1 0 1 1 0 0 +EDGE2 5866 1087 0.881723 0.0468639 0.017652 1 0 1 1 0 0 +EDGE2 5867 1086 -0.976428 0.0280419 0.0493539 1 0 1 1 0 0 +EDGE2 5867 5866 -1.06889 -0.0412442 0.0260412 1 0 1 1 0 0 +EDGE2 5867 1087 0.00258525 -0.0436985 -0.0242666 1 0 1 1 0 0 +EDGE2 5867 1088 0.950739 -0.00501604 -0.0142727 1 0 1 1 0 0 +EDGE2 5868 5867 -1.00776 -0.13984 -0.0282545 1 0 1 1 0 0 +EDGE2 5868 1087 -1.10809 -0.0917262 0.0300222 1 0 1 1 0 0 +EDGE2 5868 1088 0.0303408 -0.0138424 0.00853765 1 0 1 1 0 0 +EDGE2 5868 1089 1.00032 0.0749942 -0.0353299 1 0 1 1 0 0 +EDGE2 5869 1088 -1.00634 -0.00754755 0.00499839 1 0 1 1 0 0 +EDGE2 5869 5868 -1.07628 0.0529576 -0.0425386 1 0 1 1 0 0 +EDGE2 5869 1089 -0.0531092 -0.0295159 0.0513977 1 0 1 1 0 0 +EDGE2 5869 1090 1.0102 0.0138115 -0.000322464 1 0 1 1 0 0 +EDGE2 5870 5869 -0.988729 0.0366812 0.0327551 1 0 1 1 0 0 +EDGE2 5870 1089 -1.00064 0.0574371 0.0170204 1 0 1 1 0 0 +EDGE2 5870 1091 0.0322446 0.972097 1.50909 1 0 1 1 0 0 +EDGE2 5870 1090 -0.0269251 0.0581025 -0.00702439 1 0 1 1 0 0 +EDGE2 5871 1092 1.03042 -0.100192 -0.00860832 1 0 1 1 0 0 +EDGE2 5871 1091 -0.0278408 0.0154648 0.0209281 1 0 1 1 0 0 +EDGE2 5871 5870 -0.964481 0.0582638 -1.5672 1 0 1 1 0 0 +EDGE2 5871 1090 -0.996796 0.073761 -1.58589 1 0 1 1 0 0 +EDGE2 5872 1092 -0.068085 -0.0173163 0.00288168 1 0 1 1 0 0 +EDGE2 5872 1093 1.02893 0.00722544 0.0137359 1 0 1 1 0 0 +EDGE2 5872 1091 -1.06391 -0.0484567 0.0463225 1 0 1 1 0 0 +EDGE2 5872 5871 -0.981304 -0.0237349 0.010047 1 0 1 1 0 0 +EDGE2 5873 1092 -0.984442 0.0482393 0.00496475 1 0 1 1 0 0 +EDGE2 5873 1094 0.98491 -0.0872768 0.00114412 1 0 1 1 0 0 +EDGE2 5873 1093 0.0162169 -0.00498161 -0.00910842 1 0 1 1 0 0 +EDGE2 5873 5872 -0.978747 0.0283721 -0.000763067 1 0 1 1 0 0 +EDGE2 5874 5795 0.981973 0.00985627 -3.1238 1 0 1 1 0 0 +EDGE2 5874 5855 1.01116 0.0676273 -3.12701 1 0 1 1 0 0 +EDGE2 5874 3035 0.965896 0.0358321 -3.14228 1 0 1 1 0 0 +EDGE2 5874 3055 0.941533 0.0339368 -3.12279 1 0 1 1 0 0 +EDGE2 5874 1095 0.928174 -0.0363167 -0.0112572 1 0 1 1 0 0 +EDGE2 5874 1115 1.03141 0.111942 -3.15083 1 0 1 1 0 0 +EDGE2 5874 1135 1.03427 0.0770016 -3.16762 1 0 1 1 0 0 +EDGE2 5874 1094 -0.00685946 -0.0260058 -0.00617879 1 0 1 1 0 0 +EDGE2 5874 1093 -0.99062 -0.0495206 0.00759956 1 0 1 1 0 0 +EDGE2 5874 5873 -0.95661 0.0336819 0.0222269 1 0 1 1 0 0 +EDGE2 5875 5795 -0.0361365 -0.0763957 -3.13548 1 0 1 1 0 0 +EDGE2 5875 5856 0.0465892 0.986468 1.61007 1 0 1 1 0 0 +EDGE2 5875 3056 -0.0400591 1.0081 1.55971 1 0 1 1 0 0 +EDGE2 5875 5794 1.04287 -0.0544092 -3.12745 1 0 1 1 0 0 +EDGE2 5875 5854 1.00543 0.0446192 -3.13229 1 0 1 1 0 0 +EDGE2 5875 1134 1.0102 -0.0834647 -3.17969 1 0 1 1 0 0 +EDGE2 5875 3034 1.02568 0.0433976 -3.14463 1 0 1 1 0 0 +EDGE2 5875 3054 0.964164 0.0117473 -3.16511 1 0 1 1 0 0 +EDGE2 5875 1114 0.989549 -0.0778053 -3.12211 1 0 1 1 0 0 +EDGE2 5875 5855 0.0843133 0.0546698 -3.13084 1 0 1 1 0 0 +EDGE2 5875 3035 -0.0152276 0.118837 -3.1461 1 0 1 1 0 0 +EDGE2 5875 3055 0.0208384 -0.0463834 -3.10096 1 0 1 1 0 0 +EDGE2 5875 1095 0.00944145 0.0419852 0.0223523 1 0 1 1 0 0 +EDGE2 5875 1115 -0.096743 0.00475188 -3.12003 1 0 1 1 0 0 +EDGE2 5875 1135 -0.0578131 -0.00221175 -3.11189 1 0 1 1 0 0 +EDGE2 5875 1094 -1.03139 -0.0441736 0.0288005 1 0 1 1 0 0 +EDGE2 5875 5874 -1.05085 -0.0138259 -0.0257387 1 0 1 1 0 0 +EDGE2 5875 1116 0.0851923 -0.993305 -1.56959 1 0 1 1 0 0 +EDGE2 5875 3036 0.102433 -0.992904 -1.58645 1 0 1 1 0 0 +EDGE2 5875 5796 0.0837735 -1.07843 -1.57016 1 0 1 1 0 0 +EDGE2 5875 1136 0.0461125 -1.01656 -1.54657 1 0 1 1 0 0 +EDGE2 5875 1096 0.0196196 -1.02464 -1.57606 1 0 1 1 0 0 +EDGE2 5876 5795 -0.941401 -0.0188391 1.58023 1 0 1 1 0 0 +EDGE2 5876 3057 0.994013 -0.115714 0.00183359 1 0 1 1 0 0 +EDGE2 5876 5857 1.04262 0.0518359 -0.0170453 1 0 1 1 0 0 +EDGE2 5876 5856 0.0441315 0.0447515 0.0358456 1 0 1 1 0 0 +EDGE2 5876 3056 0.0546653 0.043812 -0.0089199 1 0 1 1 0 0 +EDGE2 5876 5875 -0.956402 0.0176792 -1.53597 1 0 1 1 0 0 +EDGE2 5876 5855 -1.04995 0.0433102 1.586 1 0 1 1 0 0 +EDGE2 5876 3035 -0.992851 0.0371227 1.61358 1 0 1 1 0 0 +EDGE2 5876 3055 -0.96886 -0.0487052 1.56915 1 0 1 1 0 0 +EDGE2 5876 1095 -1.01067 -0.0129159 -1.59174 1 0 1 1 0 0 +EDGE2 5876 1115 -1.10645 -0.019517 1.55415 1 0 1 1 0 0 +EDGE2 5876 1135 -1.07355 0.0254447 1.554 1 0 1 1 0 0 +EDGE2 5877 3058 0.947152 0.000871503 -0.0110685 1 0 1 1 0 0 +EDGE2 5877 5858 1.00631 0.0118134 0.0134291 1 0 1 1 0 0 +EDGE2 5877 3057 0.0041379 0.0446697 0.0111271 1 0 1 1 0 0 +EDGE2 5877 5857 -0.108369 0.00217424 0.0261157 1 0 1 1 0 0 +EDGE2 5877 5856 -0.986156 -0.0322935 -0.0082055 1 0 1 1 0 0 +EDGE2 5877 5876 -1.03007 -0.049056 -0.0297607 1 0 1 1 0 0 +EDGE2 5877 3056 -1.0274 -0.0269938 -0.0192937 1 0 1 1 0 0 +EDGE2 5878 5859 0.963254 -0.00272381 -0.0252901 1 0 1 1 0 0 +EDGE2 5878 3059 0.90094 0.0879377 -0.0367792 1 0 1 1 0 0 +EDGE2 5878 3058 0.0882936 0.0172339 -0.0181171 1 0 1 1 0 0 +EDGE2 5878 5858 -0.0508434 0.0551115 -0.013665 1 0 1 1 0 0 +EDGE2 5878 5877 -0.945468 0.020009 0.0224678 1 0 1 1 0 0 +EDGE2 5878 3057 -0.991765 0.0891631 0.0345879 1 0 1 1 0 0 +EDGE2 5878 5857 -1.03299 0.0838891 -0.0352395 1 0 1 1 0 0 +EDGE2 5879 3060 0.947056 -0.0219718 0.00410144 1 0 1 1 0 0 +EDGE2 5879 3160 1.00938 -0.0664285 -3.15971 1 0 1 1 0 0 +EDGE2 5879 5860 1.11326 0.0276094 0.00586969 1 0 1 1 0 0 +EDGE2 5879 3080 1.03915 0.0435145 -3.13666 1 0 1 1 0 0 +EDGE2 5879 1080 1.05114 0.0711912 -3.13935 1 0 1 1 0 0 +EDGE2 5879 5859 0.121078 -0.0203438 0.00439041 1 0 1 1 0 0 +EDGE2 5879 3059 -0.039559 -0.110119 0.00529708 1 0 1 1 0 0 +EDGE2 5879 3058 -1.0289 -0.00598796 0.00110774 1 0 1 1 0 0 +EDGE2 5879 5858 -0.998288 -0.0707823 -0.0256426 1 0 1 1 0 0 +EDGE2 5879 5878 -0.963022 -0.0118118 0.00918707 1 0 1 1 0 0 +EDGE2 5880 3079 0.927468 0.11034 -3.12159 1 0 1 1 0 0 +EDGE2 5880 3159 1.07516 -0.0223973 -3.13903 1 0 1 1 0 0 +EDGE2 5880 1079 1.01245 0.0101834 -3.12586 1 0 1 1 0 0 +EDGE2 5880 3081 -0.0320795 -0.925892 -1.58646 1 0 1 1 0 0 +EDGE2 5880 3161 -0.0129016 -0.997106 -1.56167 1 0 1 1 0 0 +EDGE2 5880 3061 -0.092891 -0.949346 -1.59514 1 0 1 1 0 0 +EDGE2 5880 3060 0.12116 -0.000937437 0.0175757 1 0 1 1 0 0 +EDGE2 5880 3160 -0.0280746 -0.0225264 -3.1627 1 0 1 1 0 0 +EDGE2 5880 5860 -0.00735381 -0.00643613 -0.0109349 1 0 1 1 0 0 +EDGE2 5880 3080 -0.0132063 -0.0742967 -3.13296 1 0 1 1 0 0 +EDGE2 5880 1080 -0.0179139 -0.0389757 -3.14615 1 0 1 1 0 0 +EDGE2 5880 1081 -0.014057 0.93494 1.6123 1 0 1 1 0 0 +EDGE2 5880 5861 0.0894116 0.937059 1.5427 1 0 1 1 0 0 +EDGE2 5880 5859 -0.956723 -0.00532922 0.0329012 1 0 1 1 0 0 +EDGE2 5880 5879 -0.935379 0.0151751 0.00585871 1 0 1 1 0 0 +EDGE2 5880 3059 -0.946056 -0.0139496 0.00682158 1 0 1 1 0 0 +EDGE2 5881 3082 1.07585 -0.0504645 0.00586187 1 0 1 1 0 0 +EDGE2 5881 3162 1.01284 -0.0378522 -0.0293096 1 0 1 1 0 0 +EDGE2 5881 3062 0.999906 -0.0361194 -0.00875857 1 0 1 1 0 0 +EDGE2 5881 3081 -0.100459 0.0220875 0.000240605 1 0 1 1 0 0 +EDGE2 5881 3161 0.0101204 0.0542268 0.00966796 1 0 1 1 0 0 +EDGE2 5881 3061 0.0324983 0.0356843 0.0127988 1 0 1 1 0 0 +EDGE2 5881 3060 -1.00487 0.0329676 1.56346 1 0 1 1 0 0 +EDGE2 5881 3160 -0.988028 -0.0526581 -1.55149 1 0 1 1 0 0 +EDGE2 5881 5860 -1.00906 -0.0358545 1.55991 1 0 1 1 0 0 +EDGE2 5881 5880 -1.07062 -0.0123997 1.56411 1 0 1 1 0 0 +EDGE2 5881 3080 -1.0039 0.0657655 -1.53934 1 0 1 1 0 0 +EDGE2 5881 1080 -0.969322 -0.078424 -1.59878 1 0 1 1 0 0 +EDGE2 5882 3083 1.01797 0.00145688 -0.0274897 1 0 1 1 0 0 +EDGE2 5882 3163 0.932942 -0.0273837 -0.00263323 1 0 1 1 0 0 +EDGE2 5882 3063 0.93326 0.0197177 0.0186728 1 0 1 1 0 0 +EDGE2 5882 3082 0.00792749 -0.0246023 0.0130996 1 0 1 1 0 0 +EDGE2 5882 3162 -0.0357341 0.0792416 0.00434452 1 0 1 1 0 0 +EDGE2 5882 3062 0.0405246 0.0164561 0.00939946 1 0 1 1 0 0 +EDGE2 5882 3081 -1.00717 -0.0375445 0.0119884 1 0 1 1 0 0 +EDGE2 5882 3161 -1.01839 -0.0115731 0.00608877 1 0 1 1 0 0 +EDGE2 5882 5881 -0.930263 0.0045959 -0.00668456 1 0 1 1 0 0 +EDGE2 5882 3061 -0.969998 0.00164784 0.0217645 1 0 1 1 0 0 +EDGE2 5883 3064 1.00391 0.0867076 -0.0338142 1 0 1 1 0 0 +EDGE2 5883 3164 1.00149 0.0752974 -0.00309904 1 0 1 1 0 0 +EDGE2 5883 3084 1.10863 -0.0235787 0.00945568 1 0 1 1 0 0 +EDGE2 5883 3083 -0.00563469 0.0217865 -0.0119227 1 0 1 1 0 0 +EDGE2 5883 3163 0.0104798 -0.0859804 -0.0149393 1 0 1 1 0 0 +EDGE2 5883 3063 0.0208337 -0.0367257 -0.0417356 1 0 1 1 0 0 +EDGE2 5883 3082 -0.980125 0.0228017 0.0303994 1 0 1 1 0 0 +EDGE2 5883 3162 -1.1379 -0.0226273 0.0390922 1 0 1 1 0 0 +EDGE2 5883 5882 -0.995566 0.0259375 0.0013805 1 0 1 1 0 0 +EDGE2 5883 3062 -0.946825 -0.0114992 -0.012244 1 0 1 1 0 0 +EDGE2 5884 3105 1.05302 -0.033479 -3.14927 1 0 1 1 0 0 +EDGE2 5884 3485 1.08951 0.0442988 -3.14085 1 0 1 1 0 0 +EDGE2 5884 5845 1.01033 -0.0147577 -3.17669 1 0 1 1 0 0 +EDGE2 5884 5825 1.04389 -0.0159723 -3.10155 1 0 1 1 0 0 +EDGE2 5884 3145 1.04795 -0.115526 -3.14097 1 0 1 1 0 0 +EDGE2 5884 3165 1.01947 -0.0550297 -0.0399938 1 0 1 1 0 0 +EDGE2 5884 3385 0.997614 -0.0369504 -3.15849 1 0 1 1 0 0 +EDGE2 5884 3125 1.00616 -0.0677575 -3.13712 1 0 1 1 0 0 +EDGE2 5884 1185 1.04252 -0.038066 -3.15461 1 0 1 1 0 0 +EDGE2 5884 3065 0.992692 -0.0382975 0.00841777 1 0 1 1 0 0 +EDGE2 5884 3085 0.903378 -0.0550893 0.00188489 1 0 1 1 0 0 +EDGE2 5884 1165 0.970896 -0.100325 -3.10564 1 0 1 1 0 0 +EDGE2 5884 3064 -0.14848 -0.0208673 -0.00403429 1 0 1 1 0 0 +EDGE2 5884 3164 -0.00616877 0.0536738 0.00501557 1 0 1 1 0 0 +EDGE2 5884 3084 0.0698326 0.0229447 -0.0257836 1 0 1 1 0 0 +EDGE2 5884 3083 -0.985242 -0.0722352 -0.0159732 1 0 1 1 0 0 +EDGE2 5884 3163 -0.981255 0.0947204 -0.025067 1 0 1 1 0 0 +EDGE2 5884 5883 -0.8904 -0.0137939 -0.0107886 1 0 1 1 0 0 +EDGE2 5884 3063 -1.03666 -0.0131044 -0.0107336 1 0 1 1 0 0 +EDGE2 5885 3146 0.018944 0.990923 1.609 1 0 1 1 0 0 +EDGE2 5885 3386 0.00484625 0.957726 1.56867 1 0 1 1 0 0 +EDGE2 5885 3066 -0.0454923 1.00484 1.59263 1 0 1 1 0 0 +EDGE2 5885 3144 1.03324 -0.0628204 -3.12053 1 0 1 1 0 0 +EDGE2 5885 3484 0.919764 0.0634802 -3.14769 1 0 1 1 0 0 +EDGE2 5885 5824 0.947687 -0.0706009 -3.17403 1 0 1 1 0 0 +EDGE2 5885 5844 0.983589 0.00854534 -3.1486 1 0 1 1 0 0 +EDGE2 5885 3384 0.985255 -0.0739725 -3.13077 1 0 1 1 0 0 +EDGE2 5885 1184 0.9358 -0.00993438 -3.1289 1 0 1 1 0 0 +EDGE2 5885 3104 1.06056 0.0850013 -3.14445 1 0 1 1 0 0 +EDGE2 5885 3124 1.02591 -0.0165658 -3.1227 1 0 1 1 0 0 +EDGE2 5885 1164 1.00817 -0.0492453 -3.17394 1 0 1 1 0 0 +EDGE2 5885 3166 0.00907181 -0.995231 -1.58349 1 0 1 1 0 0 +EDGE2 5885 3105 0.0571658 -0.00512851 -3.09884 1 0 1 1 0 0 +EDGE2 5885 3485 -0.110813 -0.0343521 -3.15384 1 0 1 1 0 0 +EDGE2 5885 5845 -0.00655282 0.0715185 -3.13003 1 0 1 1 0 0 +EDGE2 5885 5825 -0.0154937 -0.00762054 -3.13212 1 0 1 1 0 0 +EDGE2 5885 3145 0.0766535 -0.00876101 -3.16107 1 0 1 1 0 0 +EDGE2 5885 3165 -0.0117359 -0.0557764 0.00828921 1 0 1 1 0 0 +EDGE2 5885 3385 -0.0565622 0.045581 -3.15315 1 0 1 1 0 0 +EDGE2 5885 3125 -0.0464584 0.0190091 -3.11325 1 0 1 1 0 0 +EDGE2 5885 1185 0.04624 -0.0412925 -3.14813 1 0 1 1 0 0 +EDGE2 5885 3065 -0.0147208 -0.0720383 -0.0105864 1 0 1 1 0 0 +EDGE2 5885 3085 -0.0419133 0.0233474 0.00641834 1 0 1 1 0 0 +EDGE2 5885 1165 -0.0580939 -0.00833285 -3.14213 1 0 1 1 0 0 +EDGE2 5885 5826 0.012855 -0.912515 -1.60055 1 0 1 1 0 0 +EDGE2 5885 5846 -0.0466384 -0.94148 -1.56608 1 0 1 1 0 0 +EDGE2 5885 3486 -0.0468964 -0.944632 -1.55841 1 0 1 1 0 0 +EDGE2 5885 1166 0.0607415 -1.04314 -1.59444 1 0 1 1 0 0 +EDGE2 5885 3086 0.0596516 -0.983952 -1.57115 1 0 1 1 0 0 +EDGE2 5885 3106 -0.0360414 -1.08609 -1.57502 1 0 1 1 0 0 +EDGE2 5885 3126 0.0191212 -0.966451 -1.53144 1 0 1 1 0 0 +EDGE2 5885 1186 -0.0250838 -0.951002 -1.53244 1 0 1 1 0 0 +EDGE2 5885 3064 -0.937628 0.0196134 0.0167085 1 0 1 1 0 0 +EDGE2 5885 3164 -0.947413 0.0288499 -0.0264355 1 0 1 1 0 0 +EDGE2 5885 5884 -0.944129 -0.0444946 -0.0249114 1 0 1 1 0 0 +EDGE2 5885 3084 -1.04038 0.058773 -0.0119084 1 0 1 1 0 0 +EDGE2 5886 3147 1.00966 0.026183 -0.0161355 1 0 1 1 0 0 +EDGE2 5886 3387 0.9767 -0.0421237 0.00852736 1 0 1 1 0 0 +EDGE2 5886 3067 1.05889 -0.00178432 -0.0275723 1 0 1 1 0 0 +EDGE2 5886 3146 0.0281725 -0.0887476 -0.0174993 1 0 1 1 0 0 +EDGE2 5886 3386 -0.0296272 0.0926074 -0.00464071 1 0 1 1 0 0 +EDGE2 5886 3066 -0.0630094 0.00618731 0.0172847 1 0 1 1 0 0 +EDGE2 5886 3105 -0.961881 0.0831537 1.5675 1 0 1 1 0 0 +EDGE2 5886 3485 -1.00515 0.00482632 1.57111 1 0 1 1 0 0 +EDGE2 5886 5845 -1.00226 0.00494509 1.58166 1 0 1 1 0 0 +EDGE2 5886 5885 -0.948046 -0.0639468 -1.56124 1 0 1 1 0 0 +EDGE2 5886 5825 -0.98116 0.102357 1.61259 1 0 1 1 0 0 +EDGE2 5886 3145 -1.00612 0.0643939 1.62172 1 0 1 1 0 0 +EDGE2 5886 3165 -0.994134 -0.0388104 -1.59046 1 0 1 1 0 0 +EDGE2 5886 3385 -0.941593 0.0184042 1.5876 1 0 1 1 0 0 +EDGE2 5886 3125 -1.03951 0.00531972 1.54752 1 0 1 1 0 0 +EDGE2 5886 1185 -1.03885 -0.0180731 1.58165 1 0 1 1 0 0 +EDGE2 5886 3065 -1.05286 0.0751518 -1.58352 1 0 1 1 0 0 +EDGE2 5886 3085 -1.04252 -0.193636 -1.59984 1 0 1 1 0 0 +EDGE2 5886 1165 -0.969136 0.0290491 1.53451 1 0 1 1 0 0 +EDGE2 5887 3068 1.0073 -0.0223217 0.00479339 1 0 1 1 0 0 +EDGE2 5887 3148 0.990242 0.00453602 0.00525036 1 0 1 1 0 0 +EDGE2 5887 3388 1.06168 0.0554831 0.0104737 1 0 1 1 0 0 +EDGE2 5887 3147 -0.0501975 0.023598 -0.0168035 1 0 1 1 0 0 +EDGE2 5887 3387 0.00829227 -0.0147108 0.0323277 1 0 1 1 0 0 +EDGE2 5887 3067 0.030802 -0.0642954 -0.00388256 1 0 1 1 0 0 +EDGE2 5887 3146 -1.04616 -0.0271891 -0.00603021 1 0 1 1 0 0 +EDGE2 5887 3386 -0.982208 -0.0312929 0.0112962 1 0 1 1 0 0 +EDGE2 5887 5886 -0.985523 -0.0497438 -0.000320234 1 0 1 1 0 0 +EDGE2 5887 3066 -1.14794 0.0375852 -0.0255893 1 0 1 1 0 0 +EDGE2 5888 3149 0.970719 0.0447412 0.000666545 1 0 1 1 0 0 +EDGE2 5888 3389 0.996583 -0.0715544 -0.0230795 1 0 1 1 0 0 +EDGE2 5888 3069 1.04723 -0.075417 -0.00730932 1 0 1 1 0 0 +EDGE2 5888 3068 -0.0314272 -0.0456152 0.0347099 1 0 1 1 0 0 +EDGE2 5888 3148 -0.0772317 -0.0490994 -0.0270402 1 0 1 1 0 0 +EDGE2 5888 3388 -0.0683486 -0.0131655 -0.00651438 1 0 1 1 0 0 +EDGE2 5888 3147 -0.989631 -0.0799932 0.00104836 1 0 1 1 0 0 +EDGE2 5888 5887 -1.02514 0.101734 -0.0341832 1 0 1 1 0 0 +EDGE2 5888 3387 -0.981111 0.0265032 0.036773 1 0 1 1 0 0 +EDGE2 5888 3067 -1.10426 0.0724751 0.000490069 1 0 1 1 0 0 +EDGE2 5889 3070 1.08299 -0.0398351 0.00295314 1 0 1 1 0 0 +EDGE2 5889 3390 0.999994 0.059073 -0.0194307 1 0 1 1 0 0 +EDGE2 5889 3410 0.975042 -0.0806284 -3.09989 1 0 1 1 0 0 +EDGE2 5889 3150 1.01436 0.0260804 -0.0385827 1 0 1 1 0 0 +EDGE2 5889 3149 0.00136014 0.0934796 -0.00373616 1 0 1 1 0 0 +EDGE2 5889 3389 -0.0832218 0.00313097 -0.0051261 1 0 1 1 0 0 +EDGE2 5889 3069 0.073507 -0.0367328 0.0136783 1 0 1 1 0 0 +EDGE2 5889 5888 -0.986963 0.0475924 -0.00664097 1 0 1 1 0 0 +EDGE2 5889 3068 -1.07888 0.079414 -0.0135297 1 0 1 1 0 0 +EDGE2 5889 3148 -0.960205 -0.0412418 -0.0426238 1 0 1 1 0 0 +EDGE2 5889 3388 -0.99888 0.0482661 -0.016384 1 0 1 1 0 0 +EDGE2 5890 3409 0.972005 0.0798969 -3.16476 1 0 1 1 0 0 +EDGE2 5890 3411 0.108688 -1.07615 -1.55517 1 0 1 1 0 0 +EDGE2 5890 3391 -0.0858083 -1.01473 -1.56059 1 0 1 1 0 0 +EDGE2 5890 3070 -0.00409075 0.0317232 0.0212224 1 0 1 1 0 0 +EDGE2 5890 3390 0.00278873 -0.0658532 0.00792799 1 0 1 1 0 0 +EDGE2 5890 3410 -0.0850121 0.0221299 -3.14292 1 0 1 1 0 0 +EDGE2 5890 3150 0.031617 0.0564294 -0.00811026 1 0 1 1 0 0 +EDGE2 5890 5889 -0.936463 0.0574837 0.00587907 1 0 1 1 0 0 +EDGE2 5890 3149 -1.04582 -0.0392446 -0.0085372 1 0 1 1 0 0 +EDGE2 5890 3389 -0.939147 -0.0112168 -0.0268289 1 0 1 1 0 0 +EDGE2 5890 3069 -0.99282 0.0242497 -0.0016073 1 0 1 1 0 0 +EDGE2 5890 3151 0.08474 0.979447 1.55663 1 0 1 1 0 0 +EDGE2 5890 3071 0.0570963 0.991224 1.57605 1 0 1 1 0 0 +EDGE2 5891 3412 0.999689 -0.0239317 0.00037576 1 0 1 1 0 0 +EDGE2 5891 3392 1.00008 0.046025 -0.0317244 1 0 1 1 0 0 +EDGE2 5891 3411 0.0608709 0.0161349 -0.00760813 1 0 1 1 0 0 +EDGE2 5891 3391 -0.0282814 0.0581364 0.00301801 1 0 1 1 0 0 +EDGE2 5891 3070 -1.06972 -0.0705371 1.56177 1 0 1 1 0 0 +EDGE2 5891 3390 -1.03437 -0.0197629 1.5738 1 0 1 1 0 0 +EDGE2 5891 3410 -0.985701 -0.0143083 -1.58129 1 0 1 1 0 0 +EDGE2 5891 5890 -0.883793 0.0587324 1.58063 1 0 1 1 0 0 +EDGE2 5891 3150 -1.03633 0.0294743 1.55642 1 0 1 1 0 0 +EDGE2 5892 3413 0.918912 -0.00770341 -0.0423393 1 0 1 1 0 0 +EDGE2 5892 3393 0.978861 -0.0225362 0.00707184 1 0 1 1 0 0 +EDGE2 5892 3412 -0.0309208 -0.0523449 0.00870268 1 0 1 1 0 0 +EDGE2 5892 3392 0.0167728 -0.0141291 0.0259557 1 0 1 1 0 0 +EDGE2 5892 3411 -0.957364 -0.0263066 0.00664064 1 0 1 1 0 0 +EDGE2 5892 5891 -1.08733 -0.0068822 -0.0138277 1 0 1 1 0 0 +EDGE2 5892 3391 -1.01877 -0.053653 0.0294327 1 0 1 1 0 0 +EDGE2 5893 3414 1.00163 0.0182921 -0.00552372 1 0 1 1 0 0 +EDGE2 5893 3394 1.02815 -0.0584256 -0.000816173 1 0 1 1 0 0 +EDGE2 5893 3413 -0.0935673 0.00483767 -0.0148791 1 0 1 1 0 0 +EDGE2 5893 3393 0.046047 0.065798 0.00664288 1 0 1 1 0 0 +EDGE2 5893 3412 -0.953911 -0.013939 -0.0101542 1 0 1 1 0 0 +EDGE2 5893 5892 -0.950371 -0.0348698 0.0627038 1 0 1 1 0 0 +EDGE2 5893 3392 -0.995314 -0.0313465 0.00115391 1 0 1 1 0 0 +EDGE2 5894 3395 0.964286 0.0439686 0.012128 1 0 1 1 0 0 +EDGE2 5894 3435 1.04089 -0.00669628 -3.11966 1 0 1 1 0 0 +EDGE2 5894 3415 0.892874 -0.0289784 0.0178081 1 0 1 1 0 0 +EDGE2 5894 855 1.04373 0.0613242 -3.16367 1 0 1 1 0 0 +EDGE2 5894 895 0.909862 0.101158 -3.13746 1 0 1 1 0 0 +EDGE2 5894 915 1.01834 -0.098215 -3.16542 1 0 1 1 0 0 +EDGE2 5894 835 1.05927 -0.0429011 -3.13373 1 0 1 1 0 0 +EDGE2 5894 3414 0.0306605 -0.0643315 -0.0338704 1 0 1 1 0 0 +EDGE2 5894 3394 0.0464893 0.0262122 -0.0105657 1 0 1 1 0 0 +EDGE2 5894 3413 -1.00295 -0.0545737 0.00340819 1 0 1 1 0 0 +EDGE2 5894 5893 -1.02911 -0.0476606 0.00818703 1 0 1 1 0 0 +EDGE2 5894 3393 -0.985774 -0.0177065 -0.0324499 1 0 1 1 0 0 +EDGE2 5895 3395 0.0328747 0.0180143 -0.0334215 1 0 1 1 0 0 +EDGE2 5895 3396 -0.0462655 1.06849 1.58202 1 0 1 1 0 0 +EDGE2 5895 916 0.00107568 0.987155 1.5262 1 0 1 1 0 0 +EDGE2 5895 3434 1.05172 -0.0752918 -3.15806 1 0 1 1 0 0 +EDGE2 5895 894 0.952129 -0.0166856 -3.13938 1 0 1 1 0 0 +EDGE2 5895 914 0.985655 -0.0475489 -3.12632 1 0 1 1 0 0 +EDGE2 5895 834 0.971902 -0.0839196 -3.18767 1 0 1 1 0 0 +EDGE2 5895 854 0.967016 -0.0324339 -3.1613 1 0 1 1 0 0 +EDGE2 5895 3435 0.0464604 -0.00431924 -3.17027 1 0 1 1 0 0 +EDGE2 5895 3415 0.0282362 -0.0455433 0.0337948 1 0 1 1 0 0 +EDGE2 5895 855 -0.0908487 -0.08693 -3.16575 1 0 1 1 0 0 +EDGE2 5895 895 -0.0178526 -0.0230808 -3.16014 1 0 1 1 0 0 +EDGE2 5895 915 -0.101118 -0.0603039 -3.15808 1 0 1 1 0 0 +EDGE2 5895 835 -0.0699059 0.046786 -3.1414 1 0 1 1 0 0 +EDGE2 5895 3414 -0.961732 -0.0260122 -0.0172715 1 0 1 1 0 0 +EDGE2 5895 5894 -0.928443 -0.0144001 -0.00233628 1 0 1 1 0 0 +EDGE2 5895 3394 -1.04123 -0.085502 -0.00327231 1 0 1 1 0 0 +EDGE2 5895 3436 -0.0176503 -0.99901 -1.57265 1 0 1 1 0 0 +EDGE2 5895 856 -0.0177735 -0.992452 -1.58021 1 0 1 1 0 0 +EDGE2 5895 896 -0.0219932 -0.95303 -1.56384 1 0 1 1 0 0 +EDGE2 5895 3416 -0.038791 -0.99389 -1.55619 1 0 1 1 0 0 +EDGE2 5895 836 -0.0520236 -0.971541 -1.56222 1 0 1 1 0 0 +EDGE2 5896 3395 -1.00429 -0.0573778 -1.5228 1 0 1 1 0 0 +EDGE2 5896 917 0.999581 0.0409856 -0.021031 1 0 1 1 0 0 +EDGE2 5896 3397 1.03248 0.0122743 -0.00206932 1 0 1 1 0 0 +EDGE2 5896 3396 0.11328 0.0242551 0.00383213 1 0 1 1 0 0 +EDGE2 5896 916 0.0403305 0.0145918 0.0020115 1 0 1 1 0 0 +EDGE2 5896 3435 -1.00756 0.092279 1.53966 1 0 1 1 0 0 +EDGE2 5896 5895 -1.01496 -0.0595422 -1.56002 1 0 1 1 0 0 +EDGE2 5896 3415 -1.02685 -0.00542749 -1.55735 1 0 1 1 0 0 +EDGE2 5896 855 -0.94183 -0.0422458 1.56539 1 0 1 1 0 0 +EDGE2 5896 895 -0.994706 0.0840689 1.56604 1 0 1 1 0 0 +EDGE2 5896 915 -1.00959 0.07571 1.57391 1 0 1 1 0 0 +EDGE2 5896 835 -1.01622 0.120725 1.58153 1 0 1 1 0 0 +EDGE2 5897 918 0.880801 0.0623507 9.00877e-05 1 0 1 1 0 0 +EDGE2 5897 3398 1.00144 -0.0164549 0.0305174 1 0 1 1 0 0 +EDGE2 5897 917 0.0443378 -0.0266231 0.0136208 1 0 1 1 0 0 +EDGE2 5897 3397 0.025606 -0.0146116 -0.0191851 1 0 1 1 0 0 +EDGE2 5897 3396 -0.948574 0.0266711 0.0113974 1 0 1 1 0 0 +EDGE2 5897 5896 -1.00069 -0.0418802 0.021279 1 0 1 1 0 0 +EDGE2 5897 916 -0.982059 -0.000782588 -0.0313386 1 0 1 1 0 0 +EDGE2 5898 919 1.06046 -0.00829068 0.0270632 1 0 1 1 0 0 +EDGE2 5898 3399 0.984832 0.0099123 0.0234244 1 0 1 1 0 0 +EDGE2 5898 918 0.044975 0.0220932 0.0249076 1 0 1 1 0 0 +EDGE2 5898 3398 -0.0436779 -0.00844181 0.0184924 1 0 1 1 0 0 +EDGE2 5898 917 -0.934523 -0.0181749 -0.0270486 1 0 1 1 0 0 +EDGE2 5898 3397 -1.04455 0.0599953 -0.0403546 1 0 1 1 0 0 +EDGE2 5898 5897 -1.04339 -0.0171327 0.00401612 1 0 1 1 0 0 +EDGE2 5899 920 0.953232 -0.00554041 -0.0263598 1 0 1 1 0 0 +EDGE2 5899 3400 1.0187 -0.0881881 0.0165385 1 0 1 1 0 0 +EDGE2 5899 680 1.00739 0.0371848 -3.10347 1 0 1 1 0 0 +EDGE2 5899 919 -0.00500479 0.0579415 0.00411693 1 0 1 1 0 0 +EDGE2 5899 3399 0.0580466 0.0196906 -0.00458826 1 0 1 1 0 0 +EDGE2 5899 918 -0.978454 -0.0335235 0.0328199 1 0 1 1 0 0 +EDGE2 5899 3398 -0.98131 -0.0624656 0.0174176 1 0 1 1 0 0 +EDGE2 5899 5898 -1.01965 -0.0226319 -0.0187115 1 0 1 1 0 0 +EDGE2 5900 921 -0.0675098 0.946493 1.56536 1 0 1 1 0 0 +EDGE2 5900 679 0.872847 0.0171644 -3.12166 1 0 1 1 0 0 +EDGE2 5900 681 0.0273273 -1.03632 -1.55173 1 0 1 1 0 0 +EDGE2 5900 920 -0.0489079 0.0724373 0.00491812 1 0 1 1 0 0 +EDGE2 5900 3400 0.0668999 -0.044265 -0.0150805 1 0 1 1 0 0 +EDGE2 5900 680 -0.0111889 0.0501518 -3.12689 1 0 1 1 0 0 +EDGE2 5900 3401 -0.0284158 0.99352 1.62396 1 0 1 1 0 0 +EDGE2 5900 5899 -0.919756 -0.0108871 -0.0260771 1 0 1 1 0 0 +EDGE2 5900 919 -0.995236 0.0710838 -0.032049 1 0 1 1 0 0 +EDGE2 5900 3399 -0.912642 -0.0635976 0.0115665 1 0 1 1 0 0 +EDGE2 5901 681 0.0189811 -0.0328852 -0.0013056 1 0 1 1 0 0 +EDGE2 5901 682 0.896963 -0.00748104 -0.0074836 1 0 1 1 0 0 +EDGE2 5901 5900 -1.0171 -0.0370982 1.56303 1 0 1 1 0 0 +EDGE2 5901 920 -0.973191 -0.0279207 1.58728 1 0 1 1 0 0 +EDGE2 5901 3400 -0.941244 0.0520882 1.54124 1 0 1 1 0 0 +EDGE2 5901 680 -0.981596 0.0235941 -1.55397 1 0 1 1 0 0 +EDGE2 5902 681 -1.00965 0.021303 0.0129647 1 0 1 1 0 0 +EDGE2 5902 683 0.997873 -0.0355448 0.00298161 1 0 1 1 0 0 +EDGE2 5902 682 0.0297829 0.0287232 -0.0142657 1 0 1 1 0 0 +EDGE2 5902 5901 -0.879135 0.00386713 0.00673905 1 0 1 1 0 0 +EDGE2 5903 684 0.865321 -0.0651834 -0.00465009 1 0 1 1 0 0 +EDGE2 5903 5902 -0.991997 -0.0522398 -0.0135333 1 0 1 1 0 0 +EDGE2 5903 683 -0.0816201 0.0283733 0.0191963 1 0 1 1 0 0 +EDGE2 5903 682 -0.974633 -0.0990649 -0.000671409 1 0 1 1 0 0 +EDGE2 5904 885 0.92142 -0.0172342 -3.16563 1 0 1 1 0 0 +EDGE2 5904 685 1.09773 -0.00443154 0.020808 1 0 1 1 0 0 +EDGE2 5904 684 0.0360188 0.0815948 -0.0139217 1 0 1 1 0 0 +EDGE2 5904 683 -1.0539 -0.075001 -0.0140808 1 0 1 1 0 0 +EDGE2 5904 5903 -1.07085 -0.0810238 -0.00401934 1 0 1 1 0 0 +EDGE2 5905 884 1.01095 0.127106 -3.12562 1 0 1 1 0 0 +EDGE2 5905 885 -0.0534073 -0.102067 -3.1326 1 0 1 1 0 0 +EDGE2 5905 685 -0.000684469 -0.0379002 -0.0244542 1 0 1 1 0 0 +EDGE2 5905 684 -0.975823 0.00903269 -0.0058318 1 0 1 1 0 0 +EDGE2 5905 5904 -0.982948 -0.0439104 0.0108565 1 0 1 1 0 0 +EDGE2 5905 686 0.0145297 -0.923266 -1.61743 1 0 1 1 0 0 +EDGE2 5905 886 0.0242972 -1.00225 -1.58731 1 0 1 1 0 0 +EDGE2 5906 5905 -1.051 -0.0306942 -1.57717 1 0 1 1 0 0 +EDGE2 5906 885 -1.02692 -0.028823 1.57937 1 0 1 1 0 0 +EDGE2 5906 685 -1.01093 0.0258502 -1.59529 1 0 1 1 0 0 +EDGE2 5907 5906 -1.04038 0.0225394 -0.00393698 1 0 1 1 0 0 +EDGE2 5908 5907 -1.03209 -0.0579571 0.0448676 1 0 1 1 0 0 +EDGE2 5909 5908 -1.01387 -0.03424 -0.0020222 1 0 1 1 0 0 +EDGE2 5910 5909 -0.957992 0.0211762 -0.0151598 1 0 1 1 0 0 +EDGE2 5911 5910 -1.00887 -0.0354858 1.59413 1 0 1 1 0 0 +EDGE2 5912 5911 -1.02804 0.00651606 0.0273263 1 0 1 1 0 0 +EDGE2 5913 5912 -1.03976 -0.0120864 -0.0152428 1 0 1 1 0 0 +EDGE2 5914 5913 -1.04071 -0.0631845 -0.0133238 1 0 1 1 0 0 +EDGE2 5915 5914 -1.00217 -0.0326529 -2.99029e-05 1 0 1 1 0 0 +EDGE2 5916 5915 -0.924225 -0.00102355 -1.594 1 0 1 1 0 0 +EDGE2 5917 5916 -0.959631 -0.0118017 0.0143942 1 0 1 1 0 0 +EDGE2 5918 5917 -1.04716 0.0843496 -0.00350692 1 0 1 1 0 0 +EDGE2 5919 620 0.938054 -0.0774085 -3.12151 1 0 1 1 0 0 +EDGE2 5919 5918 -1.09618 0.0415552 -0.0054246 1 0 1 1 0 0 +EDGE2 5920 620 0.0723999 -0.0513147 -3.17198 1 0 1 1 0 0 +EDGE2 5920 619 1.06513 0.0400474 -3.12987 1 0 1 1 0 0 +EDGE2 5920 621 0.0138969 1.00726 1.58413 1 0 1 1 0 0 +EDGE2 5920 5919 -1.01581 -0.116778 0.018051 1 0 1 1 0 0 +EDGE2 5921 620 -1.02328 -0.00146608 1.5566 1 0 1 1 0 0 +EDGE2 5921 5920 -0.964433 0.0277758 -1.55083 1 0 1 1 0 0 +EDGE2 5921 622 0.951249 0.117578 0.0195252 1 0 1 1 0 0 +EDGE2 5921 621 0.00829327 -0.0738574 0.00118269 1 0 1 1 0 0 +EDGE2 5922 622 0.0276404 -0.000175274 0.00101497 1 0 1 1 0 0 +EDGE2 5922 621 -1.06535 -0.063147 -0.0147562 1 0 1 1 0 0 +EDGE2 5922 5921 -0.984644 -0.00487596 0.0090733 1 0 1 1 0 0 +EDGE2 5922 623 0.925284 -0.0158849 -0.0186244 1 0 1 1 0 0 +EDGE2 5923 622 -0.981962 -0.0384827 -0.0140181 1 0 1 1 0 0 +EDGE2 5923 5922 -1.01286 -0.028017 0.0180841 1 0 1 1 0 0 +EDGE2 5923 623 0.0519298 0.016032 -0.0443051 1 0 1 1 0 0 +EDGE2 5923 624 1.0426 -0.028546 0.0175727 1 0 1 1 0 0 +EDGE2 5924 623 -1.0323 0.0808865 0.0235028 1 0 1 1 0 0 +EDGE2 5924 5923 -1.11001 -0.087064 -0.00739996 1 0 1 1 0 0 +EDGE2 5924 624 -0.0253777 0.0444354 -0.024642 1 0 1 1 0 0 +EDGE2 5924 625 1.007 -0.0257162 -0.0190258 1 0 1 1 0 0 +EDGE2 5924 645 1.00309 -0.124878 -3.16809 1 0 1 1 0 0 +EDGE2 5925 5924 -1.08805 0.0419754 0.00722213 1 0 1 1 0 0 +EDGE2 5925 624 -1.08191 -0.0402773 -0.0256462 1 0 1 1 0 0 +EDGE2 5925 626 -0.0727044 -0.976271 -1.60424 1 0 1 1 0 0 +EDGE2 5925 646 0.0352533 -0.991314 -1.57019 1 0 1 1 0 0 +EDGE2 5925 644 1.0209 0.0265292 -3.13849 1 0 1 1 0 0 +EDGE2 5925 625 0.0263637 0.0588904 0.00271328 1 0 1 1 0 0 +EDGE2 5925 645 -0.0131177 -0.0574815 -3.16278 1 0 1 1 0 0 +EDGE2 5926 5925 -0.969361 0.0360143 -1.55539 1 0 1 1 0 0 +EDGE2 5926 625 -0.922758 0.0365378 -1.5754 1 0 1 1 0 0 +EDGE2 5926 645 -0.999339 -0.0682909 1.57158 1 0 1 1 0 0 +EDGE2 5927 5926 -0.979918 0.0075476 -0.0196731 1 0 1 1 0 0 +EDGE2 5928 5927 -0.922871 -0.0374551 -0.028443 1 0 1 1 0 0 +EDGE2 5929 5928 -1.08958 -0.0581733 0.0112366 1 0 1 1 0 0 +EDGE2 5929 5910 0.939307 0.0366444 -3.14145 1 0 1 1 0 0 +EDGE2 5930 5929 -0.955272 -0.067741 -0.0157952 1 0 1 1 0 0 +EDGE2 5930 5911 0.0100238 1.01024 1.58732 1 0 1 1 0 0 +EDGE2 5930 5910 0.0384654 -0.0594792 -3.13169 1 0 1 1 0 0 +EDGE2 5930 5909 1.01965 -0.0131708 -3.15349 1 0 1 1 0 0 +EDGE2 5931 5912 0.982565 0.0416632 -0.00909659 1 0 1 1 0 0 +EDGE2 5931 5911 0.0226031 0.101011 0.0105881 1 0 1 1 0 0 +EDGE2 5931 5910 -1.05537 0.0051187 1.57179 1 0 1 1 0 0 +EDGE2 5931 5930 -1.01342 0.0402112 -1.55978 1 0 1 1 0 0 +EDGE2 5932 5912 -0.037103 0.0158274 -0.00159061 1 0 1 1 0 0 +EDGE2 5932 5913 0.994934 -0.0602802 -0.0133772 1 0 1 1 0 0 +EDGE2 5932 5911 -1.07065 0.0821218 0.00152833 1 0 1 1 0 0 +EDGE2 5932 5931 -1.02269 0.0116274 0.0335306 1 0 1 1 0 0 +EDGE2 5933 5914 0.997924 0.0804017 0.00236046 1 0 1 1 0 0 +EDGE2 5933 5912 -0.965695 -0.053442 0.00814557 1 0 1 1 0 0 +EDGE2 5933 5913 0.072862 -0.0275469 -0.00225074 1 0 1 1 0 0 +EDGE2 5933 5932 -0.912235 -0.055793 0.0188456 1 0 1 1 0 0 +EDGE2 5934 5915 1.10098 -0.0207993 -0.0136575 1 0 1 1 0 0 +EDGE2 5934 5914 -0.00476542 0.0596179 0.0145739 1 0 1 1 0 0 +EDGE2 5934 5913 -1.03445 -0.00233718 0.00716518 1 0 1 1 0 0 +EDGE2 5934 5933 -1.05437 -0.00222747 -0.00603623 1 0 1 1 0 0 +EDGE2 5935 5915 -0.032346 -0.0247939 0.0209879 1 0 1 1 0 0 +EDGE2 5935 5916 0.0172092 0.996942 1.54856 1 0 1 1 0 0 +EDGE2 5935 5934 -1.03089 -0.0146903 -0.00263981 1 0 1 1 0 0 +EDGE2 5935 5914 -0.942951 -0.00874583 -0.000150406 1 0 1 1 0 0 +EDGE2 5936 5915 -1.0362 -0.031792 1.60643 1 0 1 1 0 0 +EDGE2 5936 5935 -1.01659 -0.0177696 1.55823 1 0 1 1 0 0 +EDGE2 5937 5936 -0.990474 0.0265172 0.00662007 1 0 1 1 0 0 +EDGE2 5938 5937 -0.912362 -0.0740271 0.00397294 1 0 1 1 0 0 +EDGE2 5939 5938 -1.09266 -0.0634145 -0.0349291 1 0 1 1 0 0 +EDGE2 5939 880 1.03176 -0.0187472 -3.16588 1 0 1 1 0 0 +EDGE2 5940 5939 -1.01027 0.0501664 0.0100461 1 0 1 1 0 0 +EDGE2 5940 880 -0.0727593 0.00263132 -3.13097 1 0 1 1 0 0 +EDGE2 5940 879 0.93958 0.0084993 -3.17518 1 0 1 1 0 0 +EDGE2 5940 881 0.0420091 -0.91425 -1.58061 1 0 1 1 0 0 +EDGE2 5941 880 -1.0338 0.103663 -1.5681 1 0 1 1 0 0 +EDGE2 5941 5940 -0.97058 0.0526229 1.6013 1 0 1 1 0 0 +EDGE2 5941 881 0.0377429 0.0146688 0.00256537 1 0 1 1 0 0 +EDGE2 5941 882 0.886874 0.0288947 0.0228717 1 0 1 1 0 0 +EDGE2 5942 883 0.867219 -0.0353765 0.030595 1 0 1 1 0 0 +EDGE2 5942 881 -1.06684 0.00416655 0.041804 1 0 1 1 0 0 +EDGE2 5942 5941 -0.975405 0.0816639 -0.00928083 1 0 1 1 0 0 +EDGE2 5942 882 0.000213308 0.0744123 0.00513338 1 0 1 1 0 0 +EDGE2 5943 884 1.00456 -0.00212935 0.027458 1 0 1 1 0 0 +EDGE2 5943 883 0.0227799 -0.0449385 0.0060875 1 0 1 1 0 0 +EDGE2 5943 5942 -0.958043 0.0137492 -0.0262263 1 0 1 1 0 0 +EDGE2 5943 882 -0.957186 -0.05967 0.00280463 1 0 1 1 0 0 +EDGE2 5944 884 -0.0635228 0.0409927 -0.00964226 1 0 1 1 0 0 +EDGE2 5944 883 -0.954664 0.0365062 -0.0248451 1 0 1 1 0 0 +EDGE2 5944 5943 -1.02241 0.0283486 0.0276731 1 0 1 1 0 0 +EDGE2 5944 5905 1.02196 0.0828328 -3.12277 1 0 1 1 0 0 +EDGE2 5944 885 1.01124 -0.108543 0.0163976 1 0 1 1 0 0 +EDGE2 5944 685 1.03523 0.0463609 -3.12886 1 0 1 1 0 0 +EDGE2 5945 884 -0.988189 -0.0564218 0.0330737 1 0 1 1 0 0 +EDGE2 5945 5906 0.0110744 -0.933292 -1.62168 1 0 1 1 0 0 +EDGE2 5945 5944 -1.05635 0.0905014 -0.00622321 1 0 1 1 0 0 +EDGE2 5945 5905 0.0207746 -0.0106923 -3.16837 1 0 1 1 0 0 +EDGE2 5945 885 0.00655757 -0.0289798 0.02697 1 0 1 1 0 0 +EDGE2 5945 685 0.00308906 0.0583272 -3.13767 1 0 1 1 0 0 +EDGE2 5945 684 0.916652 0.0458217 -3.13807 1 0 1 1 0 0 +EDGE2 5945 5904 0.929081 0.0150403 -3.15989 1 0 1 1 0 0 +EDGE2 5945 686 0.0127032 0.972531 1.54579 1 0 1 1 0 0 +EDGE2 5945 886 -0.0900532 0.968727 1.58236 1 0 1 1 0 0 +EDGE2 5946 5945 -0.939732 -0.0283338 -1.60031 1 0 1 1 0 0 +EDGE2 5946 5905 -1.01179 0.0118702 1.57353 1 0 1 1 0 0 +EDGE2 5946 885 -0.917403 -0.0276702 -1.56516 1 0 1 1 0 0 +EDGE2 5946 685 -1.097 0.0373746 1.56955 1 0 1 1 0 0 +EDGE2 5946 686 -0.0295901 -0.0314988 -0.00955872 1 0 1 1 0 0 +EDGE2 5946 886 -0.0465953 -0.0154934 0.0109526 1 0 1 1 0 0 +EDGE2 5946 687 1.02259 -0.0849077 -0.0233537 1 0 1 1 0 0 +EDGE2 5946 887 0.974316 -0.0535125 0.0174622 1 0 1 1 0 0 +EDGE2 5947 5946 -1.02436 -0.00180978 0.00453878 1 0 1 1 0 0 +EDGE2 5947 686 -1.01931 0.0377596 -0.0129802 1 0 1 1 0 0 +EDGE2 5947 886 -1.04567 0.018789 -0.0111921 1 0 1 1 0 0 +EDGE2 5947 888 1.0276 0.00973582 -0.0211338 1 0 1 1 0 0 +EDGE2 5947 687 -0.0226886 0.0330999 0.00541486 1 0 1 1 0 0 +EDGE2 5947 887 -0.100188 -0.0175646 -0.0121616 1 0 1 1 0 0 +EDGE2 5947 688 1.01491 -0.0830191 0.00927296 1 0 1 1 0 0 +EDGE2 5948 5947 -1.03312 0.103778 -0.00261084 1 0 1 1 0 0 +EDGE2 5948 888 0.0199207 0.0394359 -0.0160697 1 0 1 1 0 0 +EDGE2 5948 687 -0.9791 -0.00291143 0.017083 1 0 1 1 0 0 +EDGE2 5948 887 -0.935095 0.0999264 -0.0122603 1 0 1 1 0 0 +EDGE2 5948 688 0.044282 0.0364098 0.00280916 1 0 1 1 0 0 +EDGE2 5948 689 0.928204 0.0561959 -0.00942968 1 0 1 1 0 0 +EDGE2 5948 889 1.13385 0.0700248 -0.0024189 1 0 1 1 0 0 +EDGE2 5949 5948 -1.06151 0.00331545 -0.00231026 1 0 1 1 0 0 +EDGE2 5949 690 1.01512 -0.0118375 -0.01491 1 0 1 1 0 0 +EDGE2 5949 888 -0.997256 -0.0400834 -0.0324894 1 0 1 1 0 0 +EDGE2 5949 688 -0.988429 0.0032121 0.0243052 1 0 1 1 0 0 +EDGE2 5949 910 1.01436 0.0482001 -3.134 1 0 1 1 0 0 +EDGE2 5949 3450 0.968656 0.0749874 -3.119 1 0 1 1 0 0 +EDGE2 5949 689 0.00151211 -0.0205218 -0.0186154 1 0 1 1 0 0 +EDGE2 5949 889 -0.010115 0.0344776 0.000978716 1 0 1 1 0 0 +EDGE2 5949 3430 1.04522 0.0150856 -3.1383 1 0 1 1 0 0 +EDGE2 5949 850 1.02824 0.0566988 -3.15078 1 0 1 1 0 0 +EDGE2 5949 870 0.862233 0.0384214 -3.15062 1 0 1 1 0 0 +EDGE2 5949 890 1.03946 -0.0751727 -0.00122273 1 0 1 1 0 0 +EDGE2 5949 830 1.03697 0.0755708 -3.13682 1 0 1 1 0 0 +EDGE2 5950 5949 -0.927515 0.00506964 -0.0135312 1 0 1 1 0 0 +EDGE2 5950 691 0.0960983 0.954523 1.5608 1 0 1 1 0 0 +EDGE2 5950 871 -0.0347564 0.980485 1.56961 1 0 1 1 0 0 +EDGE2 5950 3451 -0.170676 1.01828 1.58224 1 0 1 1 0 0 +EDGE2 5950 690 0.0714347 0.0428394 -0.0232971 1 0 1 1 0 0 +EDGE2 5950 910 -0.0381429 -0.0098176 -3.14507 1 0 1 1 0 0 +EDGE2 5950 3450 0.0102839 0.0100071 -3.14271 1 0 1 1 0 0 +EDGE2 5950 689 -0.986619 0.043831 -0.0235029 1 0 1 1 0 0 +EDGE2 5950 889 -1.01094 -0.00779836 -0.0129408 1 0 1 1 0 0 +EDGE2 5950 3430 0.0329024 -0.0354282 -3.1678 1 0 1 1 0 0 +EDGE2 5950 850 -0.0109704 -0.0193521 -3.13502 1 0 1 1 0 0 +EDGE2 5950 870 -0.0324354 0.0483692 -3.12814 1 0 1 1 0 0 +EDGE2 5950 890 -0.119042 -0.0119744 0.019555 1 0 1 1 0 0 +EDGE2 5950 830 -0.0810725 0.0118259 -3.13669 1 0 1 1 0 0 +EDGE2 5950 851 0.097199 -0.896365 -1.56164 1 0 1 1 0 0 +EDGE2 5950 911 0.00696995 -0.952887 -1.57379 1 0 1 1 0 0 +EDGE2 5950 3431 -0.0432859 -1.07825 -1.53091 1 0 1 1 0 0 +EDGE2 5950 891 0.003971 -1.01532 -1.58573 1 0 1 1 0 0 +EDGE2 5950 831 0.0769814 -0.90397 -1.57783 1 0 1 1 0 0 +EDGE2 5950 869 0.980101 -0.0449626 -3.14973 1 0 1 1 0 0 +EDGE2 5950 3429 0.864703 0.0867734 -3.14668 1 0 1 1 0 0 +EDGE2 5950 3449 1.0398 0.019846 -3.14085 1 0 1 1 0 0 +EDGE2 5950 909 0.976294 0.074859 -3.12645 1 0 1 1 0 0 +EDGE2 5950 829 0.982735 -0.0631485 -3.13698 1 0 1 1 0 0 +EDGE2 5950 849 0.953935 0.00653141 -3.1768 1 0 1 1 0 0 +EDGE2 5951 872 0.976064 -0.0769624 -0.00135381 1 0 1 1 0 0 +EDGE2 5951 3452 0.980221 0.0197733 -0.0104233 1 0 1 1 0 0 +EDGE2 5951 692 1.02876 0.0587242 0.0189463 1 0 1 1 0 0 +EDGE2 5951 691 -0.0216259 0.00142575 0.00083627 1 0 1 1 0 0 +EDGE2 5951 871 0.0344424 -0.089991 -0.0059455 1 0 1 1 0 0 +EDGE2 5951 3451 -0.0423143 -0.0668279 -0.0291241 1 0 1 1 0 0 +EDGE2 5951 5950 -0.882118 -0.0583937 -1.60142 1 0 1 1 0 0 +EDGE2 5951 690 -1.03588 -0.0214209 -1.61588 1 0 1 1 0 0 +EDGE2 5951 910 -1.06925 0.0187523 1.59033 1 0 1 1 0 0 +EDGE2 5951 3450 -0.993378 -0.0110955 1.56016 1 0 1 1 0 0 +EDGE2 5951 3430 -1.14842 0.0348877 1.54234 1 0 1 1 0 0 +EDGE2 5951 850 -0.960346 0.0559021 1.58378 1 0 1 1 0 0 +EDGE2 5951 870 -1.0152 -0.00360096 1.56666 1 0 1 1 0 0 +EDGE2 5951 890 -1.00427 0.0720603 -1.58901 1 0 1 1 0 0 +EDGE2 5951 830 -0.990149 0.0442766 1.59106 1 0 1 1 0 0 +EDGE2 5952 5951 -0.970075 0.012954 -0.0366674 1 0 1 1 0 0 +EDGE2 5952 693 1.09065 0.0182135 0.0197498 1 0 1 1 0 0 +EDGE2 5952 3453 0.9958 0.00334884 -0.00143834 1 0 1 1 0 0 +EDGE2 5952 873 0.99489 -0.00426179 0.0145116 1 0 1 1 0 0 +EDGE2 5952 872 -0.0561385 0.0591018 -0.00759865 1 0 1 1 0 0 +EDGE2 5952 3452 0.0682752 -0.062486 0.0234156 1 0 1 1 0 0 +EDGE2 5952 692 0.1001 0.106014 0.0134377 1 0 1 1 0 0 +EDGE2 5952 691 -1.04271 0.00417752 -0.0448014 1 0 1 1 0 0 +EDGE2 5952 871 -0.988942 0.0244252 0.00647223 1 0 1 1 0 0 +EDGE2 5952 3451 -1.04817 0.0106911 -0.0456981 1 0 1 1 0 0 +EDGE2 5953 693 0.0804374 -0.0874708 -0.0031647 1 0 1 1 0 0 +EDGE2 5953 874 1.01001 -0.0699433 -0.0234443 1 0 1 1 0 0 +EDGE2 5953 3454 0.948825 -0.108026 0.00803057 1 0 1 1 0 0 +EDGE2 5953 694 0.953927 0.0329262 0.0282251 1 0 1 1 0 0 +EDGE2 5953 3453 -0.00391265 -0.0173747 0.0159193 1 0 1 1 0 0 +EDGE2 5953 873 -0.0374805 -0.0627645 -0.0135886 1 0 1 1 0 0 +EDGE2 5953 872 -0.991088 0.000738093 0.00718808 1 0 1 1 0 0 +EDGE2 5953 5952 -1.01192 0.0373032 -0.000425876 1 0 1 1 0 0 +EDGE2 5953 3452 -1.00161 -0.0193841 0.0400832 1 0 1 1 0 0 +EDGE2 5953 692 -0.978273 -0.0291134 0.0154972 1 0 1 1 0 0 +EDGE2 5954 3455 1.0428 -0.0713197 0.0285474 1 0 1 1 0 0 +EDGE2 5954 795 0.958105 0.0131143 -3.12714 1 0 1 1 0 0 +EDGE2 5954 875 0.958873 0.00694204 0.0220398 1 0 1 1 0 0 +EDGE2 5954 3335 1.01099 -0.0374768 -3.14262 1 0 1 1 0 0 +EDGE2 5954 3355 0.927766 -0.0489228 -3.1163 1 0 1 1 0 0 +EDGE2 5954 815 1.02866 -0.0429755 -3.17487 1 0 1 1 0 0 +EDGE2 5954 755 0.987821 -0.0177441 -3.15489 1 0 1 1 0 0 +EDGE2 5954 775 0.924192 0.017038 -3.11745 1 0 1 1 0 0 +EDGE2 5954 695 1.02001 -0.00249363 -0.00858843 1 0 1 1 0 0 +EDGE2 5954 693 -0.95068 0.0228743 0.0274932 1 0 1 1 0 0 +EDGE2 5954 874 0.0381326 0.092716 -0.0150609 1 0 1 1 0 0 +EDGE2 5954 3454 0.0356257 -0.0750818 -0.000714692 1 0 1 1 0 0 +EDGE2 5954 694 0.0474798 0.0176284 0.00361778 1 0 1 1 0 0 +EDGE2 5954 3453 -0.957759 -0.127269 0.0556003 1 0 1 1 0 0 +EDGE2 5954 5953 -0.9263 -0.0181661 0.0399205 1 0 1 1 0 0 +EDGE2 5954 873 -0.995566 -0.0180504 -0.00432859 1 0 1 1 0 0 +EDGE2 5955 876 -0.0458966 0.951655 1.55837 1 0 1 1 0 0 +EDGE2 5955 3455 -0.00345734 -0.0104395 -0.00455498 1 0 1 1 0 0 +EDGE2 5955 774 0.971934 -0.0218036 -3.1144 1 0 1 1 0 0 +EDGE2 5955 814 0.883715 -0.0231034 -3.1245 1 0 1 1 0 0 +EDGE2 5955 3334 1.01703 0.0786321 -3.12401 1 0 1 1 0 0 +EDGE2 5955 3354 1.03851 -0.0408588 -3.13849 1 0 1 1 0 0 +EDGE2 5955 794 1.09135 0.0710799 -3.13062 1 0 1 1 0 0 +EDGE2 5955 754 0.961377 -0.00375529 -3.16311 1 0 1 1 0 0 +EDGE2 5955 795 0.0397547 0.0404397 -3.10566 1 0 1 1 0 0 +EDGE2 5955 875 -0.00987845 0.0381429 0.0116467 1 0 1 1 0 0 +EDGE2 5955 3335 -0.0140941 0.0188838 -3.10967 1 0 1 1 0 0 +EDGE2 5955 3355 -0.0196234 -0.0893561 -3.13507 1 0 1 1 0 0 +EDGE2 5955 815 0.0395326 0.0305638 -3.12432 1 0 1 1 0 0 +EDGE2 5955 755 -0.0220174 0.0194328 -3.14273 1 0 1 1 0 0 +EDGE2 5955 775 0.00680155 -0.0447327 -3.16589 1 0 1 1 0 0 +EDGE2 5955 695 0.0210298 -0.00418837 -0.0113478 1 0 1 1 0 0 +EDGE2 5955 874 -1.05532 0.000867907 -0.00296919 1 0 1 1 0 0 +EDGE2 5955 3454 -0.953266 0.024459 -0.00407478 1 0 1 1 0 0 +EDGE2 5955 5954 -1.00413 0.0160493 0.0123519 1 0 1 1 0 0 +EDGE2 5955 694 -1.06235 0.0320623 0.0165496 1 0 1 1 0 0 +EDGE2 5955 796 -0.00986416 -1.1228 -1.58633 1 0 1 1 0 0 +EDGE2 5955 3336 -0.0217295 -1.05157 -1.55505 1 0 1 1 0 0 +EDGE2 5955 3356 -0.0123395 -1.01259 -1.58787 1 0 1 1 0 0 +EDGE2 5955 3456 -0.0322387 -0.945682 -1.57876 1 0 1 1 0 0 +EDGE2 5955 816 -0.0625269 -0.98541 -1.5577 1 0 1 1 0 0 +EDGE2 5955 696 -0.0481332 -0.934463 -1.58029 1 0 1 1 0 0 +EDGE2 5955 756 -0.00335837 -1.09139 -1.57003 1 0 1 1 0 0 +EDGE2 5955 776 -0.0162808 -1.1046 -1.53402 1 0 1 1 0 0 +EDGE2 5956 877 0.912192 0.025313 -0.00504981 1 0 1 1 0 0 +EDGE2 5956 876 -0.0699894 -0.0344092 -0.0064568 1 0 1 1 0 0 +EDGE2 5956 3455 -1.05531 0.0330113 -1.59841 1 0 1 1 0 0 +EDGE2 5956 5955 -0.925319 -0.00395151 -1.55493 1 0 1 1 0 0 +EDGE2 5956 795 -1.01163 0.0513699 1.57674 1 0 1 1 0 0 +EDGE2 5956 875 -0.895756 0.0937029 -1.58013 1 0 1 1 0 0 +EDGE2 5956 3335 -0.996435 -0.0075283 1.5915 1 0 1 1 0 0 +EDGE2 5956 3355 -0.997676 -0.0500921 1.56686 1 0 1 1 0 0 +EDGE2 5956 815 -1.01606 -0.00761311 1.57847 1 0 1 1 0 0 +EDGE2 5956 755 -1.06759 0.0121264 1.58563 1 0 1 1 0 0 +EDGE2 5956 775 -0.997363 0.0490982 1.56832 1 0 1 1 0 0 +EDGE2 5956 695 -0.906223 -0.0445281 -1.59651 1 0 1 1 0 0 +EDGE2 5957 878 1.02375 0.110589 0.0158649 1 0 1 1 0 0 +EDGE2 5957 877 -0.0106244 -0.0392199 -0.0253969 1 0 1 1 0 0 +EDGE2 5957 5956 -1.03506 0.0292792 -0.0483134 1 0 1 1 0 0 +EDGE2 5957 876 -1.01099 -0.0406085 0.00689379 1 0 1 1 0 0 +EDGE2 5958 878 0.13624 -0.047268 -0.00243157 1 0 1 1 0 0 +EDGE2 5958 879 1.01546 -0.0491863 -0.0125644 1 0 1 1 0 0 +EDGE2 5958 5957 -1.05244 -0.00296124 0.0126731 1 0 1 1 0 0 +EDGE2 5958 877 -0.999023 -0.0450488 0.0106078 1 0 1 1 0 0 +EDGE2 5959 880 1.0362 0.0103382 -0.0206685 1 0 1 1 0 0 +EDGE2 5959 5940 0.978996 -0.00862714 -3.17529 1 0 1 1 0 0 +EDGE2 5959 878 -0.918262 -0.0620102 0.00342278 1 0 1 1 0 0 +EDGE2 5959 879 -0.0341995 -0.0806066 0.000530025 1 0 1 1 0 0 +EDGE2 5959 5958 -1.10095 -0.0235088 0.0228231 1 0 1 1 0 0 +EDGE2 5960 5939 1.07812 -0.108365 -3.15484 1 0 1 1 0 0 +EDGE2 5960 880 -0.0199712 -0.0329708 -0.00408714 1 0 1 1 0 0 +EDGE2 5960 5940 -0.0791205 -0.0313864 -3.1636 1 0 1 1 0 0 +EDGE2 5960 879 -0.988111 -0.000374265 0.0174549 1 0 1 1 0 0 +EDGE2 5960 5959 -0.962346 -0.0457982 -0.00884521 1 0 1 1 0 0 +EDGE2 5960 881 0.131861 1.09273 1.58391 1 0 1 1 0 0 +EDGE2 5960 5941 -0.0173128 1.00843 1.56385 1 0 1 1 0 0 +EDGE2 5961 880 -1.06589 0.062805 -1.6091 1 0 1 1 0 0 +EDGE2 5961 5940 -1.00902 0.05407 1.58412 1 0 1 1 0 0 +EDGE2 5961 5960 -1.01207 -0.0490635 -1.57733 1 0 1 1 0 0 +EDGE2 5961 5942 0.985877 0.0212371 0.00743219 1 0 1 1 0 0 +EDGE2 5961 881 0.0312571 0.00717392 -0.00519233 1 0 1 1 0 0 +EDGE2 5961 5941 -0.0724936 0.0681319 -0.0291494 1 0 1 1 0 0 +EDGE2 5961 882 0.977497 0.0953244 0.0236838 1 0 1 1 0 0 +EDGE2 5962 5961 -0.974287 -0.00519028 -0.015645 1 0 1 1 0 0 +EDGE2 5962 883 0.983487 -0.0505446 0.00747959 1 0 1 1 0 0 +EDGE2 5962 5942 -0.0320488 0.00235218 0.00429223 1 0 1 1 0 0 +EDGE2 5962 881 -0.94232 0.0276899 -0.0015437 1 0 1 1 0 0 +EDGE2 5962 5941 -1.08577 0.0144713 0.00171599 1 0 1 1 0 0 +EDGE2 5962 882 -0.0448157 -0.035585 -0.0341029 1 0 1 1 0 0 +EDGE2 5962 5943 1.04155 0.0141993 -0.0144 1 0 1 1 0 0 +EDGE2 5963 884 1.06919 -0.0446444 0.0142279 1 0 1 1 0 0 +EDGE2 5963 883 -0.0465259 0.126597 -0.0345183 1 0 1 1 0 0 +EDGE2 5963 5942 -1.02926 0.0319138 -0.0210422 1 0 1 1 0 0 +EDGE2 5963 5962 -0.94643 -0.112976 0.0217693 1 0 1 1 0 0 +EDGE2 5963 882 -1.03603 0.0236726 0.0150133 1 0 1 1 0 0 +EDGE2 5963 5943 0.031874 0.0819599 0.00830257 1 0 1 1 0 0 +EDGE2 5963 5944 0.940177 -0.0454384 -0.0263714 1 0 1 1 0 0 +EDGE2 5964 884 -0.0766544 0.0176564 -0.010043 1 0 1 1 0 0 +EDGE2 5964 883 -1.07734 0.0616582 0.00967134 1 0 1 1 0 0 +EDGE2 5964 5963 -1.10722 0.0484876 0.0210348 1 0 1 1 0 0 +EDGE2 5964 5943 -0.969559 0.00744058 -0.000210189 1 0 1 1 0 0 +EDGE2 5964 5944 -0.0119506 -0.0342685 -0.0166518 1 0 1 1 0 0 +EDGE2 5964 5945 1.06854 0.00086221 -0.0249509 1 0 1 1 0 0 +EDGE2 5964 5905 0.965369 0.0281417 -3.20141 1 0 1 1 0 0 +EDGE2 5964 885 0.971213 0.0742041 0.0248792 1 0 1 1 0 0 +EDGE2 5964 685 0.987127 0.105263 -3.1516 1 0 1 1 0 0 +EDGE2 5965 884 -0.893284 0.00562309 0.0295908 1 0 1 1 0 0 +EDGE2 5965 5906 -0.0596493 -0.948719 -1.54235 1 0 1 1 0 0 +EDGE2 5965 5964 -1.03348 0.0693259 0.0350949 1 0 1 1 0 0 +EDGE2 5965 5944 -0.963999 -0.0499382 0.000200798 1 0 1 1 0 0 +EDGE2 5965 5946 -0.0678396 1.02626 1.55626 1 0 1 1 0 0 +EDGE2 5965 5945 0.00142767 0.0622401 -0.0208587 1 0 1 1 0 0 +EDGE2 5965 5905 -0.0396645 0.00832256 -3.13395 1 0 1 1 0 0 +EDGE2 5965 885 0.0343676 -0.0232487 0.00514671 1 0 1 1 0 0 +EDGE2 5965 685 -0.0225154 0.00757829 -3.13274 1 0 1 1 0 0 +EDGE2 5965 684 0.941847 0.0089448 -3.13161 1 0 1 1 0 0 +EDGE2 5965 5904 0.991555 -0.0456138 -3.13775 1 0 1 1 0 0 +EDGE2 5965 686 -0.0139878 1.07751 1.56917 1 0 1 1 0 0 +EDGE2 5965 886 -0.00104295 1.03503 1.57496 1 0 1 1 0 0 +EDGE2 5966 5946 0.0442895 -0.0193269 0.00775559 1 0 1 1 0 0 +EDGE2 5966 5945 -0.996971 0.0202584 -1.58593 1 0 1 1 0 0 +EDGE2 5966 5965 -1.00543 0.0163535 -1.56891 1 0 1 1 0 0 +EDGE2 5966 5905 -1.0071 -0.0553993 1.56911 1 0 1 1 0 0 +EDGE2 5966 5947 0.861802 0.0625472 0.00551724 1 0 1 1 0 0 +EDGE2 5966 885 -1.09573 0.0384256 -1.54889 1 0 1 1 0 0 +EDGE2 5966 685 -1.01498 0.0182806 1.55551 1 0 1 1 0 0 +EDGE2 5966 686 0.0500116 0.00663777 -0.00309356 1 0 1 1 0 0 +EDGE2 5966 886 0.00781204 0.0101612 -0.0139341 1 0 1 1 0 0 +EDGE2 5966 687 1.01383 0.0822412 -0.0254029 1 0 1 1 0 0 +EDGE2 5966 887 0.95576 0.0537125 -0.0177627 1 0 1 1 0 0 +EDGE2 5967 5946 -1.0779 0.0345368 0.017472 1 0 1 1 0 0 +EDGE2 5967 5966 -0.97988 -0.00750044 0.0132401 1 0 1 1 0 0 +EDGE2 5967 5947 0.0056077 0.0614738 0.0111533 1 0 1 1 0 0 +EDGE2 5967 5948 1.09123 0.0278506 0.0358633 1 0 1 1 0 0 +EDGE2 5967 686 -1.05258 -0.0501891 -0.00523652 1 0 1 1 0 0 +EDGE2 5967 886 -0.986011 0.125519 -0.0132283 1 0 1 1 0 0 +EDGE2 5967 888 1.04003 0.0585819 -0.0173531 1 0 1 1 0 0 +EDGE2 5967 687 0.0598057 0.0674087 0.0131624 1 0 1 1 0 0 +EDGE2 5967 887 0.0761945 0.0583078 -0.0354358 1 0 1 1 0 0 +EDGE2 5967 688 0.970504 0.0715806 -0.0217108 1 0 1 1 0 0 +EDGE2 5968 5947 -0.895491 0.0197186 -0.00943746 1 0 1 1 0 0 +EDGE2 5968 5967 -1.11732 -0.0214862 0.0217476 1 0 1 1 0 0 +EDGE2 5968 5948 0.00198131 -0.0194985 0.000275465 1 0 1 1 0 0 +EDGE2 5968 5949 1.05828 0.0450063 -0.0544792 1 0 1 1 0 0 +EDGE2 5968 888 -0.0187535 0.127229 0.0237114 1 0 1 1 0 0 +EDGE2 5968 687 -1.02 0.0936763 0.0208726 1 0 1 1 0 0 +EDGE2 5968 887 -0.980827 -0.0847736 -0.0234868 1 0 1 1 0 0 +EDGE2 5968 688 -0.046193 -0.0654545 -0.0117906 1 0 1 1 0 0 +EDGE2 5968 689 1.09084 -0.0674194 0.05173 1 0 1 1 0 0 +EDGE2 5968 889 1.02117 0.0172465 0.000347591 1 0 1 1 0 0 +EDGE2 5969 5968 -0.966289 -0.0331311 0.0217433 1 0 1 1 0 0 +EDGE2 5969 5948 -0.863396 -0.00351194 0.0187605 1 0 1 1 0 0 +EDGE2 5969 5949 -0.0212422 0.0619117 0.0150562 1 0 1 1 0 0 +EDGE2 5969 5950 1.02131 0.0160732 -0.0257202 1 0 1 1 0 0 +EDGE2 5969 690 0.953766 -0.00108066 0.0478685 1 0 1 1 0 0 +EDGE2 5969 888 -0.992105 0.0771787 0.0117258 1 0 1 1 0 0 +EDGE2 5969 688 -0.935212 0.00764804 0.0186325 1 0 1 1 0 0 +EDGE2 5969 910 0.960823 0.0537719 -3.14903 1 0 1 1 0 0 +EDGE2 5969 3450 1.06152 -0.0311774 -3.1532 1 0 1 1 0 0 +EDGE2 5969 689 0.0445569 0.0211101 -0.00254755 1 0 1 1 0 0 +EDGE2 5969 889 0.0608898 -0.133444 0.0199692 1 0 1 1 0 0 +EDGE2 5969 3430 0.978592 0.00425459 -3.16376 1 0 1 1 0 0 +EDGE2 5969 850 1.06063 -0.0272923 -3.13007 1 0 1 1 0 0 +EDGE2 5969 870 0.949799 0.0525263 -3.13146 1 0 1 1 0 0 +EDGE2 5969 890 1.10434 -0.102808 -0.00748368 1 0 1 1 0 0 +EDGE2 5969 830 0.983479 0.0114856 -3.14955 1 0 1 1 0 0 +EDGE2 5970 5951 -0.0953051 1.01638 1.56262 1 0 1 1 0 0 +EDGE2 5970 5969 -0.87595 0.0209348 0.0294046 1 0 1 1 0 0 +EDGE2 5970 5949 -1.02287 -0.0322899 0.00923668 1 0 1 1 0 0 +EDGE2 5970 691 -0.0438204 1.01958 1.55811 1 0 1 1 0 0 +EDGE2 5970 871 -0.0890244 1.00074 1.5689 1 0 1 1 0 0 +EDGE2 5970 3451 -0.0644271 1.07204 1.56754 1 0 1 1 0 0 +EDGE2 5970 5950 -0.00727098 0.0430589 0.0202526 1 0 1 1 0 0 +EDGE2 5970 690 -0.0152091 0.025208 0.00951245 1 0 1 1 0 0 +EDGE2 5970 910 0.00821682 -0.0769774 -3.13529 1 0 1 1 0 0 +EDGE2 5970 3450 5.74766e-05 -0.0306496 -3.13704 1 0 1 1 0 0 +EDGE2 5970 689 -0.954942 0.0356051 0.0187066 1 0 1 1 0 0 +EDGE2 5970 889 -0.984938 0.00686263 0.0227938 1 0 1 1 0 0 +EDGE2 5970 3430 -0.0547745 -0.0206839 -3.12977 1 0 1 1 0 0 +EDGE2 5970 850 -0.0168394 0.0814057 -3.11717 1 0 1 1 0 0 +EDGE2 5970 870 -0.037501 -0.0908197 -3.15757 1 0 1 1 0 0 +EDGE2 5970 890 -0.0116414 0.0566595 0.0213252 1 0 1 1 0 0 +EDGE2 5970 830 0.0741046 -0.00579416 -3.15464 1 0 1 1 0 0 +EDGE2 5970 851 0.0456407 -1.05292 -1.57243 1 0 1 1 0 0 +EDGE2 5970 911 -0.0327908 -0.944828 -1.57889 1 0 1 1 0 0 +EDGE2 5970 3431 -0.00224583 -0.96822 -1.58415 1 0 1 1 0 0 +EDGE2 5970 891 -0.0650248 -1.06464 -1.54853 1 0 1 1 0 0 +EDGE2 5970 831 -0.0165911 -0.922392 -1.56662 1 0 1 1 0 0 +EDGE2 5970 869 1.04447 -0.0849937 -3.16051 1 0 1 1 0 0 +EDGE2 5970 3429 0.966771 0.00983454 -3.10853 1 0 1 1 0 0 +EDGE2 5970 3449 0.912102 -0.0769265 -3.15306 1 0 1 1 0 0 +EDGE2 5970 909 0.944146 0.00956564 -3.14676 1 0 1 1 0 0 +EDGE2 5970 829 1.03217 -0.130036 -3.15413 1 0 1 1 0 0 +EDGE2 5970 849 0.992212 -0.0312815 -3.12978 1 0 1 1 0 0 +EDGE2 5971 5951 0.0282988 -0.00626222 -0.0183756 1 0 1 1 0 0 +EDGE2 5971 872 1.01575 -0.0507021 -0.0189351 1 0 1 1 0 0 +EDGE2 5971 5952 1.03689 -0.0990425 0.00505947 1 0 1 1 0 0 +EDGE2 5971 3452 0.981309 -0.0934187 0.0155019 1 0 1 1 0 0 +EDGE2 5971 692 0.971573 -0.0815183 0.0312971 1 0 1 1 0 0 +EDGE2 5971 691 -0.0123075 0.00901939 0.0145082 1 0 1 1 0 0 +EDGE2 5971 871 -0.0141031 0.0737363 0.0197104 1 0 1 1 0 0 +EDGE2 5971 3451 0.0736486 -0.00809811 0.0318966 1 0 1 1 0 0 +EDGE2 5971 5950 -0.986376 0.0463627 -1.57489 1 0 1 1 0 0 +EDGE2 5971 5970 -0.978825 -0.0352439 -1.5553 1 0 1 1 0 0 +EDGE2 5971 690 -0.956717 0.0421686 -1.59099 1 0 1 1 0 0 +EDGE2 5971 910 -0.856948 -0.0128543 1.59497 1 0 1 1 0 0 +EDGE2 5971 3450 -1.08769 0.034088 1.56546 1 0 1 1 0 0 +EDGE2 5971 3430 -1.05916 0.00941781 1.58257 1 0 1 1 0 0 +EDGE2 5971 850 -1.01807 0.0602631 1.56554 1 0 1 1 0 0 +EDGE2 5971 870 -1.01679 0.0160059 1.58847 1 0 1 1 0 0 +EDGE2 5971 890 -0.914925 -0.00929099 -1.56624 1 0 1 1 0 0 +EDGE2 5971 830 -1.0768 0.139464 1.54565 1 0 1 1 0 0 +EDGE2 5972 5951 -1.05683 0.00225654 0.0185874 1 0 1 1 0 0 +EDGE2 5972 693 1.09333 0.0461168 -0.0159107 1 0 1 1 0 0 +EDGE2 5972 3453 0.995339 0.00988902 -0.0436212 1 0 1 1 0 0 +EDGE2 5972 5953 0.970121 0.019753 0.00238349 1 0 1 1 0 0 +EDGE2 5972 873 1.01699 -0.0359445 -0.013635 1 0 1 1 0 0 +EDGE2 5972 872 -0.0152254 -0.0909164 -0.00402584 1 0 1 1 0 0 +EDGE2 5972 5952 0.0485911 -0.0296496 -0.0194624 1 0 1 1 0 0 +EDGE2 5972 3452 0.0105806 -0.00355612 0.0301023 1 0 1 1 0 0 +EDGE2 5972 692 0.0550616 0.0433835 -0.0610723 1 0 1 1 0 0 +EDGE2 5972 5971 -0.940958 -0.0226215 0.00788046 1 0 1 1 0 0 +EDGE2 5972 691 -1.03184 -0.0447228 -0.0215553 1 0 1 1 0 0 +EDGE2 5972 871 -1.04787 0.00419734 -0.0105262 1 0 1 1 0 0 +EDGE2 5972 3451 -1.00097 0.0262973 0.0123295 1 0 1 1 0 0 +EDGE2 5973 693 -0.0261888 0.0981717 0.00924559 1 0 1 1 0 0 +EDGE2 5973 874 0.930942 -0.00513661 0.042215 1 0 1 1 0 0 +EDGE2 5973 3454 0.94843 -0.0356293 -0.00390414 1 0 1 1 0 0 +EDGE2 5973 5954 1.05403 -0.16013 -0.0213867 1 0 1 1 0 0 +EDGE2 5973 694 1.01591 -0.0204054 0.0162269 1 0 1 1 0 0 +EDGE2 5973 3453 -0.0258176 0.0128032 0.0257988 1 0 1 1 0 0 +EDGE2 5973 5953 -0.0491847 0.0388153 -0.023039 1 0 1 1 0 0 +EDGE2 5973 873 0.00977498 -0.112603 0.00239652 1 0 1 1 0 0 +EDGE2 5973 872 -0.999456 0.0438661 -0.00350874 1 0 1 1 0 0 +EDGE2 5973 5952 -1.00699 0.0605006 0.0102048 1 0 1 1 0 0 +EDGE2 5973 5972 -1.11839 0.0113047 -0.0157324 1 0 1 1 0 0 +EDGE2 5973 3452 -0.940732 -0.12485 -0.00322116 1 0 1 1 0 0 +EDGE2 5973 692 -1.02311 0.00820036 -0.0215686 1 0 1 1 0 0 +EDGE2 5974 3455 1.02484 -0.0735242 -0.0251492 1 0 1 1 0 0 +EDGE2 5974 5955 1.01985 0.0127954 0.028914 1 0 1 1 0 0 +EDGE2 5974 795 1.01576 0.0846249 -3.15685 1 0 1 1 0 0 +EDGE2 5974 875 1.03392 -0.0806242 -0.0199155 1 0 1 1 0 0 +EDGE2 5974 3335 0.939621 0.0142834 -3.16128 1 0 1 1 0 0 +EDGE2 5974 3355 1.05771 0.0199137 -3.14985 1 0 1 1 0 0 +EDGE2 5974 815 1.01143 -0.000401961 -3.14861 1 0 1 1 0 0 +EDGE2 5974 755 0.972162 0.0544318 -3.11332 1 0 1 1 0 0 +EDGE2 5974 775 1.04349 -0.071869 -3.1543 1 0 1 1 0 0 +EDGE2 5974 695 0.952906 -0.0168154 -0.00902389 1 0 1 1 0 0 +EDGE2 5974 693 -1.05118 0.00238574 -0.036384 1 0 1 1 0 0 +EDGE2 5974 874 0.0700091 0.016819 -0.0107109 1 0 1 1 0 0 +EDGE2 5974 3454 0.0462953 0.0340487 0.0468959 1 0 1 1 0 0 +EDGE2 5974 5954 -0.0128585 -0.0166612 -0.00786451 1 0 1 1 0 0 +EDGE2 5974 694 -0.0500002 -0.024154 0.00946625 1 0 1 1 0 0 +EDGE2 5974 3453 -0.949328 -0.0141787 0.0334776 1 0 1 1 0 0 +EDGE2 5974 5953 -1.01253 0.0109235 0.0258681 1 0 1 1 0 0 +EDGE2 5974 5973 -0.912679 0.0527756 0.0024636 1 0 1 1 0 0 +EDGE2 5974 873 -1.08756 -0.038446 -0.0221607 1 0 1 1 0 0 +EDGE2 5975 5956 -0.0957099 0.995741 1.55767 1 0 1 1 0 0 +EDGE2 5975 876 -0.0641821 0.921924 1.6024 1 0 1 1 0 0 +EDGE2 5975 3455 0.0142546 0.0120532 0.0165281 1 0 1 1 0 0 +EDGE2 5975 774 0.995896 0.088266 -3.12431 1 0 1 1 0 0 +EDGE2 5975 814 1.00397 -0.0380769 -3.11542 1 0 1 1 0 0 +EDGE2 5975 3334 1.0151 0.0330258 -3.16425 1 0 1 1 0 0 +EDGE2 5975 3354 1.03184 0.000432202 -3.11439 1 0 1 1 0 0 +EDGE2 5975 794 0.906149 -0.0490334 -3.10364 1 0 1 1 0 0 +EDGE2 5975 754 0.962793 -0.108746 -3.12783 1 0 1 1 0 0 +EDGE2 5975 5955 0.00587088 -0.0913397 -0.0333052 1 0 1 1 0 0 +EDGE2 5975 795 0.0559941 0.039046 -3.1278 1 0 1 1 0 0 +EDGE2 5975 875 0.00434152 0.0710377 0.0027065 1 0 1 1 0 0 +EDGE2 5975 3335 -0.008211 0.0664735 -3.16745 1 0 1 1 0 0 +EDGE2 5975 3355 -0.00355974 0.0179063 -3.11642 1 0 1 1 0 0 +EDGE2 5975 815 0.0728917 0.00374793 -3.12084 1 0 1 1 0 0 +EDGE2 5975 755 0.0161462 -0.0196979 -3.13543 1 0 1 1 0 0 +EDGE2 5975 775 0.00772479 -0.0601316 -3.14727 1 0 1 1 0 0 +EDGE2 5975 695 -0.0402926 -0.0449001 0.0109553 1 0 1 1 0 0 +EDGE2 5975 5974 -0.982398 -0.00413194 -0.00484909 1 0 1 1 0 0 +EDGE2 5975 874 -0.96008 0.00817981 -0.0416596 1 0 1 1 0 0 +EDGE2 5975 3454 -0.999257 0.00119782 -0.0154743 1 0 1 1 0 0 +EDGE2 5975 5954 -1.05221 0.0818364 -0.0132353 1 0 1 1 0 0 +EDGE2 5975 694 -1.03963 -0.00547154 -0.00772686 1 0 1 1 0 0 +EDGE2 5975 796 0.00207565 -0.995198 -1.61136 1 0 1 1 0 0 +EDGE2 5975 3336 -0.00769779 -1.09066 -1.60617 1 0 1 1 0 0 +EDGE2 5975 3356 0.05284 -0.978638 -1.57067 1 0 1 1 0 0 +EDGE2 5975 3456 -0.018148 -1.01316 -1.61543 1 0 1 1 0 0 +EDGE2 5975 816 -0.065971 -0.995779 -1.57525 1 0 1 1 0 0 +EDGE2 5975 696 -0.0050489 -0.926968 -1.59233 1 0 1 1 0 0 +EDGE2 5975 756 0.0117694 -1.0416 -1.57907 1 0 1 1 0 0 +EDGE2 5975 776 0.0162156 -1.08014 -1.56838 1 0 1 1 0 0 +EDGE2 5976 5957 1.0071 -0.0127625 -0.0170832 1 0 1 1 0 0 +EDGE2 5976 877 0.971125 -0.0333057 -0.00651575 1 0 1 1 0 0 +EDGE2 5976 5956 -0.0527307 0.044585 -0.0341585 1 0 1 1 0 0 +EDGE2 5976 876 0.0570308 -0.0882961 0.00575029 1 0 1 1 0 0 +EDGE2 5976 3455 -0.918217 -0.0294722 -1.58576 1 0 1 1 0 0 +EDGE2 5976 5975 -0.953704 0.023028 -1.55547 1 0 1 1 0 0 +EDGE2 5976 5955 -0.985762 0.0594995 -1.59674 1 0 1 1 0 0 +EDGE2 5976 795 -1.06807 -0.0281297 1.51537 1 0 1 1 0 0 +EDGE2 5976 875 -1.04658 -0.0307819 -1.5689 1 0 1 1 0 0 +EDGE2 5976 3335 -1.04276 -0.0147605 1.59394 1 0 1 1 0 0 +EDGE2 5976 3355 -1.01831 0.0261041 1.56296 1 0 1 1 0 0 +EDGE2 5976 815 -1.09013 -0.106445 1.55204 1 0 1 1 0 0 +EDGE2 5976 755 -1.02556 0.024542 1.58331 1 0 1 1 0 0 +EDGE2 5976 775 -0.989257 0.0171006 1.59085 1 0 1 1 0 0 +EDGE2 5976 695 -0.952421 -0.0641327 -1.58281 1 0 1 1 0 0 +EDGE2 5977 878 0.975846 0.034702 -0.000723329 1 0 1 1 0 0 +EDGE2 5977 5958 0.961599 -0.0588299 0.00523796 1 0 1 1 0 0 +EDGE2 5977 5957 0.0116608 0.00901588 0.00354446 1 0 1 1 0 0 +EDGE2 5977 877 0.0730764 -0.00896608 -0.0114152 1 0 1 1 0 0 +EDGE2 5977 5956 -0.982051 0.00845654 -0.0257943 1 0 1 1 0 0 +EDGE2 5977 5976 -0.988502 0.013909 0.0179541 1 0 1 1 0 0 +EDGE2 5977 876 -0.950516 0.0124029 0.00201409 1 0 1 1 0 0 +EDGE2 5978 878 -0.0251241 0.0370302 0.0265329 1 0 1 1 0 0 +EDGE2 5978 879 0.974116 -0.0687906 -0.0138168 1 0 1 1 0 0 +EDGE2 5978 5959 0.989604 -0.0185963 0.02747 1 0 1 1 0 0 +EDGE2 5978 5958 0.0112569 0.0521147 0.000630158 1 0 1 1 0 0 +EDGE2 5978 5957 -1.05927 -0.000645097 -0.0675219 1 0 1 1 0 0 +EDGE2 5978 5977 -0.950427 -0.0132323 0.010222 1 0 1 1 0 0 +EDGE2 5978 877 -1.03808 -0.0163357 -0.0115631 1 0 1 1 0 0 +EDGE2 5979 880 0.973072 0.01804 -0.0106868 1 0 1 1 0 0 +EDGE2 5979 5940 0.985336 0.0119032 -3.0939 1 0 1 1 0 0 +EDGE2 5979 5960 1.04059 0.00985611 0.0247872 1 0 1 1 0 0 +EDGE2 5979 878 -0.947691 -0.129135 0.0262514 1 0 1 1 0 0 +EDGE2 5979 5978 -0.996552 0.0179771 0.00128994 1 0 1 1 0 0 +EDGE2 5979 879 0.0298933 -0.0618009 -0.0120218 1 0 1 1 0 0 +EDGE2 5979 5959 -0.00399158 -0.036587 0.0100784 1 0 1 1 0 0 +EDGE2 5979 5958 -0.989184 0.0538199 -0.0115305 1 0 1 1 0 0 +EDGE2 5980 5961 0.0265214 0.899531 1.54212 1 0 1 1 0 0 +EDGE2 5980 5939 1.00946 -0.0133857 -3.16758 1 0 1 1 0 0 +EDGE2 5980 880 -0.123799 0.117886 -0.00636961 1 0 1 1 0 0 +EDGE2 5980 5940 0.0212919 0.0391047 -3.12294 1 0 1 1 0 0 +EDGE2 5980 5960 -0.0228226 0.0249868 -0.0140956 1 0 1 1 0 0 +EDGE2 5980 879 -0.968964 0.0954431 -0.00501009 1 0 1 1 0 0 +EDGE2 5980 5959 -1.03718 -0.0418276 -0.00362471 1 0 1 1 0 0 +EDGE2 5980 5979 -1.01117 -0.00396433 -0.0136074 1 0 1 1 0 0 +EDGE2 5980 881 -0.0259938 0.937588 1.58994 1 0 1 1 0 0 +EDGE2 5980 5941 -0.0838492 0.938233 1.57356 1 0 1 1 0 0 +EDGE2 5981 5961 -0.0422761 0.015549 0.0125634 1 0 1 1 0 0 +EDGE2 5981 5980 -0.973133 -0.0359868 -1.57729 1 0 1 1 0 0 +EDGE2 5981 880 -1.00345 0.00349466 -1.5776 1 0 1 1 0 0 +EDGE2 5981 5940 -0.98369 -0.0613868 1.57483 1 0 1 1 0 0 +EDGE2 5981 5960 -1.03831 0.0322365 -1.53489 1 0 1 1 0 0 +EDGE2 5981 5942 1.0269 -0.0159651 -0.0126192 1 0 1 1 0 0 +EDGE2 5981 881 -0.0816518 -0.052832 -0.00402168 1 0 1 1 0 0 +EDGE2 5981 5941 -0.0565998 0.039316 0.0013767 1 0 1 1 0 0 +EDGE2 5981 5962 0.900621 -0.00150789 -0.00872246 1 0 1 1 0 0 +EDGE2 5981 882 1.00098 0.0210469 0.00934341 1 0 1 1 0 0 +EDGE2 5982 5961 -0.953496 0.0715349 0.0144518 1 0 1 1 0 0 +EDGE2 5982 5981 -0.96079 0.0527324 0.0104874 1 0 1 1 0 0 +EDGE2 5982 883 0.918524 0.0448879 -0.0134291 1 0 1 1 0 0 +EDGE2 5982 5942 -0.0371909 -0.0659898 0.00147166 1 0 1 1 0 0 +EDGE2 5982 881 -0.970044 -0.11483 0.0371138 1 0 1 1 0 0 +EDGE2 5982 5941 -1.12052 0.0105723 0.00996941 1 0 1 1 0 0 +EDGE2 5982 5962 -0.0602236 0.0399215 0.00659797 1 0 1 1 0 0 +EDGE2 5982 5963 1.02406 -0.0655452 0.00609855 1 0 1 1 0 0 +EDGE2 5982 882 0.0209863 -0.014196 -0.0312665 1 0 1 1 0 0 +EDGE2 5982 5943 1.02965 -0.0342227 0.0247259 1 0 1 1 0 0 +EDGE2 5983 884 0.99134 -0.0242326 0.0106342 1 0 1 1 0 0 +EDGE2 5983 883 0.0069461 0.0648264 -0.000119301 1 0 1 1 0 0 +EDGE2 5983 5942 -1.01128 -0.0278186 0.021192 1 0 1 1 0 0 +EDGE2 5983 5982 -1.0984 0.0284237 0.0229914 1 0 1 1 0 0 +EDGE2 5983 5962 -0.984154 -0.0316196 -0.0223095 1 0 1 1 0 0 +EDGE2 5983 5963 -0.0377497 -0.0458437 -0.0242541 1 0 1 1 0 0 +EDGE2 5983 882 -1.02884 -0.0246324 0.0265018 1 0 1 1 0 0 +EDGE2 5983 5943 0.0810804 -0.00528801 -0.0104754 1 0 1 1 0 0 +EDGE2 5983 5964 0.998197 0.0525903 -0.00655917 1 0 1 1 0 0 +EDGE2 5983 5944 1.00304 0.0754539 -0.0268871 1 0 1 1 0 0 +EDGE2 5984 884 0.0428818 0.0532366 0.00851301 1 0 1 1 0 0 +EDGE2 5984 883 -0.945155 -0.0305892 0.0133558 1 0 1 1 0 0 +EDGE2 5984 5963 -0.94409 0.0416538 0.0191396 1 0 1 1 0 0 +EDGE2 5984 5983 -0.977218 0.0356687 -0.00729789 1 0 1 1 0 0 +EDGE2 5984 5943 -1.01591 -0.0587212 0.0086247 1 0 1 1 0 0 +EDGE2 5984 5964 -0.0813764 -0.0325834 0.00256988 1 0 1 1 0 0 +EDGE2 5984 5944 0.155088 -0.0460851 -0.00465225 1 0 1 1 0 0 +EDGE2 5984 5945 1.00194 -0.0865994 0.00204945 1 0 1 1 0 0 +EDGE2 5984 5965 1.04501 0.064049 -0.0115664 1 0 1 1 0 0 +EDGE2 5984 5905 1.05555 0.0831911 -3.16246 1 0 1 1 0 0 +EDGE2 5984 885 1.05458 0.0506234 0.00903211 1 0 1 1 0 0 +EDGE2 5984 685 0.963971 0.0512849 -3.15487 1 0 1 1 0 0 +EDGE2 5985 884 -0.967732 0.013953 0.00984063 1 0 1 1 0 0 +EDGE2 5985 5906 0.0414023 -0.956943 -1.58228 1 0 1 1 0 0 +EDGE2 5985 5964 -1.02164 -0.0317414 0.00535815 1 0 1 1 0 0 +EDGE2 5985 5984 -0.953472 -0.0993526 -0.017866 1 0 1 1 0 0 +EDGE2 5985 5944 -0.926795 0.0483653 -0.0230034 1 0 1 1 0 0 +EDGE2 5985 5946 -0.0924816 0.989343 1.63667 1 0 1 1 0 0 +EDGE2 5985 5945 0.0211003 0.0507259 0.0221428 1 0 1 1 0 0 +EDGE2 5985 5965 0.0771904 0.0530462 0.00927466 1 0 1 1 0 0 +EDGE2 5985 5966 -0.0281744 1.00925 1.54824 1 0 1 1 0 0 +EDGE2 5985 5905 0.0926724 -0.0292905 -3.15062 1 0 1 1 0 0 +EDGE2 5985 885 0.0666006 -0.00199553 -0.0353454 1 0 1 1 0 0 +EDGE2 5985 685 -0.111024 -0.0357497 -3.1016 1 0 1 1 0 0 +EDGE2 5985 684 1.08726 -0.0309569 -3.15485 1 0 1 1 0 0 +EDGE2 5985 5904 0.926338 0.0142068 -3.13129 1 0 1 1 0 0 +EDGE2 5985 686 0.00774345 1.03827 1.5648 1 0 1 1 0 0 +EDGE2 5985 886 -0.0389404 1.00837 1.55424 1 0 1 1 0 0 +EDGE2 5986 5946 0.10236 -0.12588 -0.0171238 1 0 1 1 0 0 +EDGE2 5986 5945 -0.957119 -0.0832704 -1.60658 1 0 1 1 0 0 +EDGE2 5986 5985 -0.965528 0.0521645 -1.58028 1 0 1 1 0 0 +EDGE2 5986 5965 -1.09733 0.0207958 -1.56722 1 0 1 1 0 0 +EDGE2 5986 5966 -0.0466812 -0.0212956 -0.0165152 1 0 1 1 0 0 +EDGE2 5986 5905 -0.994134 0.0304213 1.55569 1 0 1 1 0 0 +EDGE2 5986 5947 0.979591 -0.0179822 0.0300153 1 0 1 1 0 0 +EDGE2 5986 5967 1.03056 0.0981744 -0.00113697 1 0 1 1 0 0 +EDGE2 5986 885 -0.944094 0.00227095 -1.55756 1 0 1 1 0 0 +EDGE2 5986 685 -0.948279 -0.0416298 1.56898 1 0 1 1 0 0 +EDGE2 5986 686 0.0447648 -0.0455222 -0.00170495 1 0 1 1 0 0 +EDGE2 5986 886 -0.0347932 -0.0867583 -0.0189194 1 0 1 1 0 0 +EDGE2 5986 687 0.97431 0.0353003 0.00348485 1 0 1 1 0 0 +EDGE2 5986 887 1.08654 -0.019364 -0.0164837 1 0 1 1 0 0 +EDGE2 5987 5946 -0.950001 0.0232157 0.0149646 1 0 1 1 0 0 +EDGE2 5987 5966 -1.06204 -0.125625 0.0112359 1 0 1 1 0 0 +EDGE2 5987 5986 -1.03446 0.00764629 0.0109573 1 0 1 1 0 0 +EDGE2 5987 5968 0.962372 0.0716184 -0.0433234 1 0 1 1 0 0 +EDGE2 5987 5947 0.00161958 -0.0282346 0.0186522 1 0 1 1 0 0 +EDGE2 5987 5967 0.045607 0.10981 -0.0012517 1 0 1 1 0 0 +EDGE2 5987 5948 1.04844 0.0854689 -0.0179554 1 0 1 1 0 0 +EDGE2 5987 686 -1.00491 0.0180307 0.0381509 1 0 1 1 0 0 +EDGE2 5987 886 -0.962891 0.0512851 0.0135553 1 0 1 1 0 0 +EDGE2 5987 888 1.00125 0.0636537 0.0234976 1 0 1 1 0 0 +EDGE2 5987 687 0.0442681 -0.00684862 -0.0162657 1 0 1 1 0 0 +EDGE2 5987 887 0.049231 -0.066165 -0.00304018 1 0 1 1 0 0 +EDGE2 5987 688 1.14015 0.00718728 0.0255523 1 0 1 1 0 0 +EDGE2 5988 5968 -0.0605535 -0.0578574 0.0119449 1 0 1 1 0 0 +EDGE2 5988 5947 -0.993765 0.10843 -0.00509594 1 0 1 1 0 0 +EDGE2 5988 5967 -1.06549 -0.0144657 0.0240552 1 0 1 1 0 0 +EDGE2 5988 5987 -1.07745 0.0379275 -0.00485457 1 0 1 1 0 0 +EDGE2 5988 5969 0.96789 -0.045262 -0.0156046 1 0 1 1 0 0 +EDGE2 5988 5948 -0.000187579 -0.105262 -0.0205134 1 0 1 1 0 0 +EDGE2 5988 5949 1.05065 -0.0310461 -0.029102 1 0 1 1 0 0 +EDGE2 5988 888 0.000107607 -0.0229327 -0.00208121 1 0 1 1 0 0 +EDGE2 5988 687 -0.955615 0.0669375 -0.00223513 1 0 1 1 0 0 +EDGE2 5988 887 -1.04162 0.0408671 -0.00656796 1 0 1 1 0 0 +EDGE2 5988 688 -0.00331903 0.0558186 0.0254437 1 0 1 1 0 0 +EDGE2 5988 689 1.08025 -0.0177793 -0.00794889 1 0 1 1 0 0 +EDGE2 5988 889 0.979442 0.0506599 0.0244206 1 0 1 1 0 0 +EDGE2 5989 5968 -0.96442 -0.0588794 -0.00746839 1 0 1 1 0 0 +EDGE2 5989 5988 -0.99787 -0.0367236 0.0154779 1 0 1 1 0 0 +EDGE2 5989 5969 0.0156848 0.0170134 -0.00551707 1 0 1 1 0 0 +EDGE2 5989 5948 -1.03104 -0.0360954 0.00965889 1 0 1 1 0 0 +EDGE2 5989 5949 -0.00657327 -0.053525 0.0352437 1 0 1 1 0 0 +EDGE2 5989 5950 0.996115 -0.0174974 -0.00522089 1 0 1 1 0 0 +EDGE2 5989 5970 1.02422 0.0787089 0.00572821 1 0 1 1 0 0 +EDGE2 5989 690 1.05171 -0.0684744 0.0243273 1 0 1 1 0 0 +EDGE2 5989 888 -0.955323 0.0840949 0.0166897 1 0 1 1 0 0 +EDGE2 5989 688 -1.01132 0.029104 -0.00220373 1 0 1 1 0 0 +EDGE2 5989 910 0.904077 0.0415503 -3.14084 1 0 1 1 0 0 +EDGE2 5989 3450 0.94748 0.0382019 -3.1249 1 0 1 1 0 0 +EDGE2 5989 689 0.0400918 -0.0229244 -0.0281806 1 0 1 1 0 0 +EDGE2 5989 889 -0.0596094 0.0702688 -0.0155421 1 0 1 1 0 0 +EDGE2 5989 3430 1.02832 0.0474571 -3.17195 1 0 1 1 0 0 +EDGE2 5989 850 0.972804 0.0261695 -3.12663 1 0 1 1 0 0 +EDGE2 5989 870 0.973307 -0.0811276 -3.14783 1 0 1 1 0 0 +EDGE2 5989 890 0.985503 0.0494088 -0.021982 1 0 1 1 0 0 +EDGE2 5989 830 1.01442 -0.00589948 -3.14849 1 0 1 1 0 0 +EDGE2 5990 5951 0.00605801 0.940268 1.55308 1 0 1 1 0 0 +EDGE2 5990 5969 -1.00157 -0.0279233 -0.0198163 1 0 1 1 0 0 +EDGE2 5990 5989 -1.02245 0.000867548 -0.0120493 1 0 1 1 0 0 +EDGE2 5990 5949 -0.952596 0.0419967 -0.0116205 1 0 1 1 0 0 +EDGE2 5990 5971 -0.00492049 0.94037 1.55729 1 0 1 1 0 0 +EDGE2 5990 691 -0.0497872 0.998776 1.57393 1 0 1 1 0 0 +EDGE2 5990 871 -0.0258418 0.999089 1.55943 1 0 1 1 0 0 +EDGE2 5990 3451 0.0286731 0.941613 1.58452 1 0 1 1 0 0 +EDGE2 5990 5950 -0.122308 0.0155429 -0.0110281 1 0 1 1 0 0 +EDGE2 5990 5970 -0.146302 -0.013617 -0.0216969 1 0 1 1 0 0 +EDGE2 5990 690 0.0459093 0.00227041 0.00702293 1 0 1 1 0 0 +EDGE2 5990 910 -0.0585017 0.0196259 -3.12042 1 0 1 1 0 0 +EDGE2 5990 3450 -0.041938 0.0412832 -3.16422 1 0 1 1 0 0 +EDGE2 5990 689 -1.07715 0.0206527 0.0207296 1 0 1 1 0 0 +EDGE2 5990 889 -1.05269 -0.051597 0.020876 1 0 1 1 0 0 +EDGE2 5990 3430 -0.0607852 -0.0327003 -3.12584 1 0 1 1 0 0 +EDGE2 5990 850 -0.0145876 -0.000197312 -3.15974 1 0 1 1 0 0 +EDGE2 5990 870 0.00147601 0.0137194 -3.13793 1 0 1 1 0 0 +EDGE2 5990 890 0.0415012 -0.0525501 -0.00466519 1 0 1 1 0 0 +EDGE2 5990 830 -0.0704289 -0.0583126 -3.13499 1 0 1 1 0 0 +EDGE2 5990 851 -0.0209273 -1.03679 -1.57647 1 0 1 1 0 0 +EDGE2 5990 911 -0.0835583 -0.972212 -1.55204 1 0 1 1 0 0 +EDGE2 5990 3431 0.0553282 -0.908301 -1.58013 1 0 1 1 0 0 +EDGE2 5990 891 -0.041405 -0.981906 -1.58787 1 0 1 1 0 0 +EDGE2 5990 831 0.0268448 -1.04768 -1.56377 1 0 1 1 0 0 +EDGE2 5990 869 1.01873 0.0088603 -3.16018 1 0 1 1 0 0 +EDGE2 5990 3429 1.03673 -0.0378434 -3.12093 1 0 1 1 0 0 +EDGE2 5990 3449 1.00195 -0.0266014 -3.19712 1 0 1 1 0 0 +EDGE2 5990 909 1.04534 -0.00578441 -3.12389 1 0 1 1 0 0 +EDGE2 5990 829 1.06276 0.0206882 -3.14066 1 0 1 1 0 0 +EDGE2 5990 849 0.946015 -0.00641602 -3.13956 1 0 1 1 0 0 +EDGE2 5991 5951 -0.0682564 -0.0705645 0.0229661 1 0 1 1 0 0 +EDGE2 5991 872 0.911153 -0.10865 0.00329731 1 0 1 1 0 0 +EDGE2 5991 5952 0.958886 -0.0746313 -0.0191197 1 0 1 1 0 0 +EDGE2 5991 5972 0.976549 0.00752963 0.0368559 1 0 1 1 0 0 +EDGE2 5991 3452 1.01044 -0.011043 0.0191204 1 0 1 1 0 0 +EDGE2 5991 692 0.990275 0.0220476 0.0298265 1 0 1 1 0 0 +EDGE2 5991 5971 0.0591931 -0.010328 -0.00723785 1 0 1 1 0 0 +EDGE2 5991 5990 -0.948581 -0.0780669 -1.58855 1 0 1 1 0 0 +EDGE2 5991 691 -0.00278126 0.0758333 0.0117807 1 0 1 1 0 0 +EDGE2 5991 871 -0.0272264 0.0761335 0.0133487 1 0 1 1 0 0 +EDGE2 5991 3451 -0.0573871 0.0237517 -0.0282503 1 0 1 1 0 0 +EDGE2 5991 5950 -0.885894 0.112628 -1.56793 1 0 1 1 0 0 +EDGE2 5991 5970 -0.971161 -0.0898951 -1.58112 1 0 1 1 0 0 +EDGE2 5991 690 -0.989983 0.0719239 -1.55535 1 0 1 1 0 0 +EDGE2 5991 910 -0.994914 -0.0315328 1.55109 1 0 1 1 0 0 +EDGE2 5991 3450 -0.960341 0.00367032 1.56654 1 0 1 1 0 0 +EDGE2 5991 3430 -1.0734 0.0541729 1.5615 1 0 1 1 0 0 +EDGE2 5991 850 -1.0225 -0.00244476 1.57774 1 0 1 1 0 0 +EDGE2 5991 870 -0.945677 0.0155983 1.58111 1 0 1 1 0 0 +EDGE2 5991 890 -1.01695 0.088773 -1.592 1 0 1 1 0 0 +EDGE2 5991 830 -1.03918 -0.0125045 1.56078 1 0 1 1 0 0 +EDGE2 5992 5951 -1.07828 0.130953 -0.00562668 1 0 1 1 0 0 +EDGE2 5992 693 0.998094 -0.0154866 0.0281064 1 0 1 1 0 0 +EDGE2 5992 3453 0.942517 0.0679932 0.0018707 1 0 1 1 0 0 +EDGE2 5992 5953 0.998438 -0.00882315 -0.00929393 1 0 1 1 0 0 +EDGE2 5992 5973 0.953202 -0.0248515 0.0443022 1 0 1 1 0 0 +EDGE2 5992 873 1.09606 0.000747855 0.0185756 1 0 1 1 0 0 +EDGE2 5992 872 -0.0460792 -0.051998 -0.0505004 1 0 1 1 0 0 +EDGE2 5992 5952 0.00897384 0.001521 0.0245226 1 0 1 1 0 0 +EDGE2 5992 5972 0.0287014 0.0230101 -0.0104675 1 0 1 1 0 0 +EDGE2 5992 3452 0.00957132 -0.0841507 -0.0117867 1 0 1 1 0 0 +EDGE2 5992 5991 -0.922645 0.0330007 -0.0111199 1 0 1 1 0 0 +EDGE2 5992 692 -0.031432 0.0723496 -0.0320069 1 0 1 1 0 0 +EDGE2 5992 5971 -1.01523 -0.0386277 -0.0058427 1 0 1 1 0 0 +EDGE2 5992 691 -1.01325 -0.0362667 0.0371249 1 0 1 1 0 0 +EDGE2 5992 871 -0.99271 0.0650137 -0.0166849 1 0 1 1 0 0 +EDGE2 5992 3451 -1.00835 0.0592558 0.0103469 1 0 1 1 0 0 +EDGE2 5993 5974 1.02585 -0.0282021 0.00627385 1 0 1 1 0 0 +EDGE2 5993 693 0.038141 -0.0638397 0.0375614 1 0 1 1 0 0 +EDGE2 5993 874 0.95082 -0.0286432 -0.0443549 1 0 1 1 0 0 +EDGE2 5993 3454 0.975928 -0.0362361 -0.00333405 1 0 1 1 0 0 +EDGE2 5993 5954 1.03493 -0.00438124 0.0257076 1 0 1 1 0 0 +EDGE2 5993 694 1.0382 -0.0224388 -0.0265031 1 0 1 1 0 0 +EDGE2 5993 3453 0.0323737 -0.0103144 0.0121481 1 0 1 1 0 0 +EDGE2 5993 5953 0.0632683 0.0175981 0.0249603 1 0 1 1 0 0 +EDGE2 5993 5973 -0.0228788 2.8995e-05 -0.00682226 1 0 1 1 0 0 +EDGE2 5993 873 -0.0116768 0.100394 0.00871253 1 0 1 1 0 0 +EDGE2 5993 872 -0.951501 0.00375516 0.0307082 1 0 1 1 0 0 +EDGE2 5993 5952 -1.02579 -0.110589 0.00769457 1 0 1 1 0 0 +EDGE2 5993 5972 -1.00169 -0.00928937 -0.026462 1 0 1 1 0 0 +EDGE2 5993 5992 -0.954431 -0.0432124 -0.00268983 1 0 1 1 0 0 +EDGE2 5993 3452 -1.00441 0.0173018 0.00430982 1 0 1 1 0 0 +EDGE2 5993 692 -0.973595 -0.0462045 -0.0250763 1 0 1 1 0 0 +EDGE2 5994 3455 1.05205 0.00518629 -0.00969998 1 0 1 1 0 0 +EDGE2 5994 5975 1.07832 0.0703221 0.0138137 1 0 1 1 0 0 +EDGE2 5994 5955 0.899243 -0.0725163 -0.0229605 1 0 1 1 0 0 +EDGE2 5994 795 0.982164 -0.0192555 -3.12971 1 0 1 1 0 0 +EDGE2 5994 875 1.08388 0.0686278 -0.0154005 1 0 1 1 0 0 +EDGE2 5994 3335 0.907015 0.0556313 -3.15027 1 0 1 1 0 0 +EDGE2 5994 3355 1.09658 0.0246649 -3.15073 1 0 1 1 0 0 +EDGE2 5994 815 1.00054 0.032434 -3.13594 1 0 1 1 0 0 +EDGE2 5994 755 0.927314 -0.0377605 -3.11992 1 0 1 1 0 0 +EDGE2 5994 775 0.938703 0.00283915 -3.11948 1 0 1 1 0 0 +EDGE2 5994 695 1.02899 -0.0188628 0.00201431 1 0 1 1 0 0 +EDGE2 5994 5974 0.0918096 0.0347537 -0.0325737 1 0 1 1 0 0 +EDGE2 5994 693 -0.905245 0.0748105 0.0548175 1 0 1 1 0 0 +EDGE2 5994 5993 -1.00533 0.0289779 -0.0448774 1 0 1 1 0 0 +EDGE2 5994 874 0.0199562 0.0156496 -0.00884175 1 0 1 1 0 0 +EDGE2 5994 3454 -0.0755329 0.0219223 0.0181882 1 0 1 1 0 0 +EDGE2 5994 5954 0.0692074 -0.0565398 -0.00181409 1 0 1 1 0 0 +EDGE2 5994 694 0.0277851 0.0194257 -0.0427952 1 0 1 1 0 0 +EDGE2 5994 3453 -1.06575 -0.00117385 -0.0146006 1 0 1 1 0 0 +EDGE2 5994 5953 -0.873821 -0.0130833 -0.0246507 1 0 1 1 0 0 +EDGE2 5994 5973 -0.983238 0.0517507 0.0131075 1 0 1 1 0 0 +EDGE2 5994 873 -1.02785 -0.0516075 0.0227305 1 0 1 1 0 0 +EDGE2 5995 5956 -0.0301826 0.981685 1.56126 1 0 1 1 0 0 +EDGE2 5995 5976 -0.0314126 0.963785 1.5733 1 0 1 1 0 0 +EDGE2 5995 876 0.0141403 0.954112 1.54034 1 0 1 1 0 0 +EDGE2 5995 3455 0.000762195 0.100216 -0.00107569 1 0 1 1 0 0 +EDGE2 5995 774 1.04814 -0.0562501 -3.15932 1 0 1 1 0 0 +EDGE2 5995 814 0.946969 0.10264 -3.13105 1 0 1 1 0 0 +EDGE2 5995 3334 1.00096 -0.0392191 -3.15559 1 0 1 1 0 0 +EDGE2 5995 3354 1.06547 0.0463255 -3.15684 1 0 1 1 0 0 +EDGE2 5995 794 0.985602 0.0849572 -3.12781 1 0 1 1 0 0 +EDGE2 5995 5975 -0.0176606 0.0840043 -0.00809804 1 0 1 1 0 0 +EDGE2 5995 754 1.04775 -0.0347606 -3.14035 1 0 1 1 0 0 +EDGE2 5995 5955 -0.0824671 0.0425127 0.00283828 1 0 1 1 0 0 +EDGE2 5995 795 0.0120021 0.00707797 -3.12963 1 0 1 1 0 0 +EDGE2 5995 875 -0.0934945 0.00993316 -0.0416623 1 0 1 1 0 0 +EDGE2 5995 3335 0.00564171 0.0235925 -3.11878 1 0 1 1 0 0 +EDGE2 5995 3355 -0.0545071 -0.0491312 -3.15436 1 0 1 1 0 0 +EDGE2 5995 815 -0.0144619 -0.0391919 -3.15833 1 0 1 1 0 0 +EDGE2 5995 755 0.0355937 0.0131277 -3.16114 1 0 1 1 0 0 +EDGE2 5995 775 -0.0257585 -0.0343628 -3.1326 1 0 1 1 0 0 +EDGE2 5995 695 0.0219974 -0.00661182 0.00901603 1 0 1 1 0 0 +EDGE2 5995 5974 -0.986305 0.111887 -0.0185101 1 0 1 1 0 0 +EDGE2 5995 5994 -1.04081 -0.0153957 0.0105644 1 0 1 1 0 0 +EDGE2 5995 874 -1.03199 0.0444818 0.0215168 1 0 1 1 0 0 +EDGE2 5995 3454 -1.00463 -0.0941957 -0.00221442 1 0 1 1 0 0 +EDGE2 5995 5954 -0.960003 -0.0550476 0.0159564 1 0 1 1 0 0 +EDGE2 5995 694 -1.08213 -0.0138121 -0.00239102 1 0 1 1 0 0 +EDGE2 5995 796 -0.110523 -0.968683 -1.6039 1 0 1 1 0 0 +EDGE2 5995 3336 -0.0206407 -0.952059 -1.57094 1 0 1 1 0 0 +EDGE2 5995 3356 -0.0697069 -1.05438 -1.57055 1 0 1 1 0 0 +EDGE2 5995 3456 0.0595391 -1.00331 -1.57921 1 0 1 1 0 0 +EDGE2 5995 816 0.0278338 -0.9228 -1.55692 1 0 1 1 0 0 +EDGE2 5995 696 0.0317702 -0.948519 -1.55659 1 0 1 1 0 0 +EDGE2 5995 756 0.00749311 -0.969543 -1.56 1 0 1 1 0 0 +EDGE2 5995 776 0.0278826 -1.02092 -1.56303 1 0 1 1 0 0 +EDGE2 5996 5957 1.02771 0.00927184 -0.0129605 1 0 1 1 0 0 +EDGE2 5996 5977 1.01686 -0.110612 -0.00350356 1 0 1 1 0 0 +EDGE2 5996 877 0.967782 -0.0710836 -0.0142013 1 0 1 1 0 0 +EDGE2 5996 5956 -0.0247829 0.00439556 -0.0130555 1 0 1 1 0 0 +EDGE2 5996 5976 -0.0398246 0.0254797 -0.0153757 1 0 1 1 0 0 +EDGE2 5996 876 0.0120263 0.0798148 0.00242808 1 0 1 1 0 0 +EDGE2 5996 3455 -1.01949 -0.052525 -1.57197 1 0 1 1 0 0 +EDGE2 5996 5975 -0.95467 0.0937467 -1.55453 1 0 1 1 0 0 +EDGE2 5996 5995 -0.981369 0.0374862 -1.56491 1 0 1 1 0 0 +EDGE2 5996 5955 -0.964051 -0.101889 -1.55421 1 0 1 1 0 0 +EDGE2 5996 795 -0.931004 -0.0493943 1.56633 1 0 1 1 0 0 +EDGE2 5996 875 -0.967914 0.0138531 -1.58682 1 0 1 1 0 0 +EDGE2 5996 3335 -0.973941 -0.0230944 1.57486 1 0 1 1 0 0 +EDGE2 5996 3355 -1.05939 0.01165 1.59782 1 0 1 1 0 0 +EDGE2 5996 815 -0.996537 0.108027 1.55601 1 0 1 1 0 0 +EDGE2 5996 755 -0.886473 0.0111361 1.55643 1 0 1 1 0 0 +EDGE2 5996 775 -0.986656 -0.0778468 1.57266 1 0 1 1 0 0 +EDGE2 5996 695 -1.01617 0.0945633 -1.54787 1 0 1 1 0 0 +EDGE2 5997 878 1.00967 0.102822 0.00917634 1 0 1 1 0 0 +EDGE2 5997 5978 0.946221 0.02719 -0.0133208 1 0 1 1 0 0 +EDGE2 5997 5958 1.05243 -0.0306386 -0.0372259 1 0 1 1 0 0 +EDGE2 5997 5996 -0.930226 0.00344549 0.0178446 1 0 1 1 0 0 +EDGE2 5997 5957 0.0148624 0.0240424 -0.0133621 1 0 1 1 0 0 +EDGE2 5997 5977 0.0536156 -0.023168 0.000835743 1 0 1 1 0 0 +EDGE2 5997 877 0.047603 0.0864813 0.0122882 1 0 1 1 0 0 +EDGE2 5997 5956 -0.988951 -0.00024233 0.00586599 1 0 1 1 0 0 +EDGE2 5997 5976 -1.07937 -0.0252083 0.00612502 1 0 1 1 0 0 +EDGE2 5997 876 -1.0944 0.00960104 0.00528765 1 0 1 1 0 0 +EDGE2 5998 878 0.0221247 -0.13085 -0.0149966 1 0 1 1 0 0 +EDGE2 5998 5978 -0.0350452 0.0208247 0.00999526 1 0 1 1 0 0 +EDGE2 5998 879 1.0006 0.0509178 -0.0105578 1 0 1 1 0 0 +EDGE2 5998 5959 1.01339 -0.0248421 0.00443313 1 0 1 1 0 0 +EDGE2 5998 5979 1.02479 0.0222981 -0.0315858 1 0 1 1 0 0 +EDGE2 5998 5958 0.00252001 -0.0358069 -0.000988678 1 0 1 1 0 0 +EDGE2 5998 5957 -0.923445 0.0649407 -0.00462589 1 0 1 1 0 0 +EDGE2 5998 5977 -1.00049 0.065197 -0.0313009 1 0 1 1 0 0 +EDGE2 5998 5997 -0.943973 0.0411785 -0.0128318 1 0 1 1 0 0 +EDGE2 5998 877 -1.03682 -0.066372 -0.0307822 1 0 1 1 0 0 +EDGE2 5999 5980 1.01871 0.0155773 0.0202135 1 0 1 1 0 0 +EDGE2 5999 880 0.909204 0.0637552 -0.0138115 1 0 1 1 0 0 +EDGE2 5999 5940 1.06179 -0.027163 -3.1837 1 0 1 1 0 0 +EDGE2 5999 5960 1.03863 0.0360115 -0.0268404 1 0 1 1 0 0 +EDGE2 5999 878 -1.0522 0.0122595 -0.0188391 1 0 1 1 0 0 +EDGE2 5999 5978 -0.971953 0.0726667 -0.0421056 1 0 1 1 0 0 +EDGE2 5999 879 0.0572238 -0.0498644 -0.0119919 1 0 1 1 0 0 +EDGE2 5999 5959 -0.00959828 0.00693465 -0.000480963 1 0 1 1 0 0 +EDGE2 5999 5979 0.046367 -0.0228197 0.0106845 1 0 1 1 0 0 +EDGE2 5999 5998 -1.00438 -0.0222191 -0.0622437 1 0 1 1 0 0 +EDGE2 5999 5958 -1.01209 -0.088004 -0.0193725 1 0 1 1 0 0 +EDGE2 6000 5961 -0.0814838 1.04916 1.5712 1 0 1 1 0 0 +EDGE2 6000 5999 -1.03211 0.0999407 0.0111821 1 0 1 1 0 0 +EDGE2 6000 5980 -0.00541918 -0.0187298 -0.0305865 1 0 1 1 0 0 +EDGE2 6000 5939 1.03381 -0.0467997 -3.14468 1 0 1 1 0 0 +EDGE2 6000 880 -0.0311591 -0.0145484 0.0350423 1 0 1 1 0 0 +EDGE2 6000 5940 -0.0558914 0.00194215 -3.10835 1 0 1 1 0 0 +EDGE2 6000 5960 0.0885957 0.0217567 0.00702819 1 0 1 1 0 0 +EDGE2 6000 5981 0.0477513 0.939243 1.57736 1 0 1 1 0 0 +EDGE2 6000 879 -1.04869 -0.0424084 0.0140659 1 0 1 1 0 0 +EDGE2 6000 5959 -0.985127 0.0296497 0.0217694 1 0 1 1 0 0 +EDGE2 6000 5979 -0.993195 -0.0214953 0.014427 1 0 1 1 0 0 +EDGE2 6000 881 -0.0302314 0.889609 1.54978 1 0 1 1 0 0 +EDGE2 6000 5941 -0.0347338 1.05587 1.58525 1 0 1 1 0 0 +EDGE2 6001 5980 -0.985501 0.00789398 1.53192 1 0 1 1 0 0 +EDGE2 6001 6000 -0.951332 0.00452475 1.55792 1 0 1 1 0 0 +EDGE2 6001 880 -1.05292 -0.0403647 1.5798 1 0 1 1 0 0 +EDGE2 6001 5940 -1.07391 -0.0284621 -1.55353 1 0 1 1 0 0 +EDGE2 6001 5960 -0.969429 0.00224222 1.56207 1 0 1 1 0 0 +EDGE2 6002 6001 -1.01192 -0.0142399 -0.0349568 1 0 1 1 0 0 +EDGE2 6003 6002 -0.938653 0.0511478 0.00967672 1 0 1 1 0 0 +EDGE2 6004 6003 -1.01395 0.00275547 0.0292429 1 0 1 1 0 0 +EDGE2 6005 6004 -1.04455 -0.0674447 0.00535435 1 0 1 1 0 0 +EDGE2 6006 6005 -1.02144 0.0622896 -1.58847 1 0 1 1 0 0 +EDGE2 6007 6006 -0.913917 -0.00121437 0.00722413 1 0 1 1 0 0 +EDGE2 6008 6007 -0.940787 0.023617 0.0126528 1 0 1 1 0 0 +EDGE2 6009 6008 -0.935458 0.0564737 0.0114751 1 0 1 1 0 0 +EDGE2 6010 6009 -1.05926 0.0584951 -0.0073357 1 0 1 1 0 0 +EDGE2 6011 6010 -1.0407 -0.0513418 -1.55194 1 0 1 1 0 0 +EDGE2 6012 6011 -1.07595 0.00410099 0.00592915 1 0 1 1 0 0 +EDGE2 6013 6012 -0.954388 0.0608095 0.0166437 1 0 1 1 0 0 +EDGE2 6014 6013 -1.00897 -0.0171936 -0.000837009 1 0 1 1 0 0 +EDGE2 6014 5915 1.0002 -0.00541043 -3.1273 1 0 1 1 0 0 +EDGE2 6014 5935 0.995073 0.0852326 -3.11712 1 0 1 1 0 0 +EDGE2 6015 6014 -1.03877 0.0505328 -0.00605887 1 0 1 1 0 0 +EDGE2 6015 5915 -0.0145104 0.0597542 -3.11367 1 0 1 1 0 0 +EDGE2 6015 5916 -0.138408 -0.991402 -1.5518 1 0 1 1 0 0 +EDGE2 6015 5935 0.0836885 0.0120897 -3.15383 1 0 1 1 0 0 +EDGE2 6015 5934 1.03044 0.0476625 -3.1525 1 0 1 1 0 0 +EDGE2 6015 5914 1.01297 -0.0535162 -3.12977 1 0 1 1 0 0 +EDGE2 6015 5936 0.0158882 0.974779 1.59322 1 0 1 1 0 0 +EDGE2 6016 5915 -1.02078 0.0499327 -1.55142 1 0 1 1 0 0 +EDGE2 6016 5917 1.08058 0.112877 -0.0196127 1 0 1 1 0 0 +EDGE2 6016 6015 -0.941235 0.00682262 1.5795 1 0 1 1 0 0 +EDGE2 6016 5916 0.0831704 -0.0752677 0.011945 1 0 1 1 0 0 +EDGE2 6016 5935 -1.10785 -0.0670025 -1.56137 1 0 1 1 0 0 +EDGE2 6017 5918 1.02543 -0.0502373 0.00235267 1 0 1 1 0 0 +EDGE2 6017 6016 -1.01172 0.0125101 0.030187 1 0 1 1 0 0 +EDGE2 6017 5917 -0.0494838 -0.0220979 -0.0168945 1 0 1 1 0 0 +EDGE2 6017 5916 -0.922181 -0.0493979 0.0158454 1 0 1 1 0 0 +EDGE2 6018 5919 0.969004 -0.0545833 -0.0326953 1 0 1 1 0 0 +EDGE2 6018 5918 0.0571227 0.035388 -0.018768 1 0 1 1 0 0 +EDGE2 6018 5917 -0.949384 -0.160306 0.00844459 1 0 1 1 0 0 +EDGE2 6018 6017 -1.05567 -0.0155429 0.0129097 1 0 1 1 0 0 +EDGE2 6019 620 1.01714 -0.0351386 -3.08948 1 0 1 1 0 0 +EDGE2 6019 5920 0.895585 -0.105987 -0.00275209 1 0 1 1 0 0 +EDGE2 6019 6018 -0.952021 -0.000910474 0.027373 1 0 1 1 0 0 +EDGE2 6019 5919 0.0428971 0.0216896 -0.0150183 1 0 1 1 0 0 +EDGE2 6019 5918 -0.977105 -0.00591356 0.00223681 1 0 1 1 0 0 +EDGE2 6020 620 -0.135885 -0.0313246 -3.10862 1 0 1 1 0 0 +EDGE2 6020 619 0.962133 -0.0546695 -3.1836 1 0 1 1 0 0 +EDGE2 6020 5920 -0.0140788 -0.0175252 -0.0222705 1 0 1 1 0 0 +EDGE2 6020 6019 -0.928958 -0.0728889 0.0228508 1 0 1 1 0 0 +EDGE2 6020 621 0.0116003 1.03816 1.6204 1 0 1 1 0 0 +EDGE2 6020 5921 -0.0712825 0.974562 1.56597 1 0 1 1 0 0 +EDGE2 6020 5919 -0.907975 0.119294 -0.0166095 1 0 1 1 0 0 +EDGE2 6021 620 -0.929474 -0.00694678 -1.55766 1 0 1 1 0 0 +EDGE2 6021 6020 -0.967914 -0.0620305 1.56061 1 0 1 1 0 0 +EDGE2 6021 5920 -1.01953 0.00999227 1.56366 1 0 1 1 0 0 +EDGE2 6022 6021 -1.03099 -0.00456802 0.00203327 1 0 1 1 0 0 +EDGE2 6023 6022 -0.968201 0.00711855 -0.00308304 1 0 1 1 0 0 +EDGE2 6024 6023 -1.1311 0.00848788 -0.0312056 1 0 1 1 0 0 +EDGE2 6025 6024 -1.02702 0.0514004 -0.0168246 1 0 1 1 0 0 +EDGE2 6026 6025 -1.03708 -0.00680539 -1.54221 1 0 1 1 0 0 +EDGE2 6027 6026 -1.09648 0.0387784 -0.00671976 1 0 1 1 0 0 +EDGE2 6028 6027 -1.03508 0.0174602 -0.0104004 1 0 1 1 0 0 +EDGE2 6029 610 0.950362 0.0116636 -3.10137 1 0 1 1 0 0 +EDGE2 6029 6028 -0.955959 0.0920388 -0.00348489 1 0 1 1 0 0 +EDGE2 6030 609 0.995329 0.0649051 -3.15066 1 0 1 1 0 0 +EDGE2 6030 610 -0.0548276 -0.00108034 -3.13596 1 0 1 1 0 0 +EDGE2 6030 6029 -0.874915 0.0178648 0.00323721 1 0 1 1 0 0 +EDGE2 6030 611 0.0832452 0.947166 1.52726 1 0 1 1 0 0 +EDGE2 6031 610 -0.963771 -0.0519213 -1.57205 1 0 1 1 0 0 +EDGE2 6031 6030 -0.959587 0.0332734 1.58606 1 0 1 1 0 0 +EDGE2 6032 6031 -0.947756 0.00229109 0.035713 1 0 1 1 0 0 +EDGE2 6033 6032 -1.06028 0.0796525 0.0180005 1 0 1 1 0 0 +EDGE2 6034 6033 -0.955627 0.00947163 0.0252185 1 0 1 1 0 0 +EDGE2 6035 6034 -1.0103 0.0202889 -0.0155631 1 0 1 1 0 0 +EDGE2 6036 6035 -0.976529 -0.0584018 -1.57758 1 0 1 1 0 0 +EDGE2 6037 6036 -0.989673 0.0517766 0.00718123 1 0 1 1 0 0 +EDGE2 6038 6037 -1.04423 0.0232485 -0.00987611 1 0 1 1 0 0 +EDGE2 6039 6038 -1.1129 0.010979 0.00814004 1 0 1 1 0 0 +EDGE2 6040 6039 -1.05523 0.0396535 0.0472323 1 0 1 1 0 0 +EDGE2 6041 6040 -0.899442 -0.000432925 -1.55127 1 0 1 1 0 0 +EDGE2 6042 6041 -0.980601 0.0285392 0.0362234 1 0 1 1 0 0 +EDGE2 6043 6042 -0.962295 0.0416615 -0.00965681 1 0 1 1 0 0 +EDGE2 6044 6043 -1.00614 0.110515 -0.00891574 1 0 1 1 0 0 +EDGE2 6044 605 1.05124 -0.047358 -3.11887 1 0 1 1 0 0 +EDGE2 6045 6044 -0.97355 -0.00199228 -0.0114506 1 0 1 1 0 0 +EDGE2 6045 605 -0.0493395 -0.0240692 -3.12954 1 0 1 1 0 0 +EDGE2 6045 604 0.939621 -0.00833829 -3.14643 1 0 1 1 0 0 +EDGE2 6045 606 0.0174444 0.997153 1.58696 1 0 1 1 0 0 +EDGE2 6046 6045 -0.90118 0.0473239 -1.59897 1 0 1 1 0 0 +EDGE2 6046 605 -1.02279 0.057017 1.5383 1 0 1 1 0 0 +EDGE2 6046 607 1.06082 -0.0485608 -0.00207108 1 0 1 1 0 0 +EDGE2 6046 606 0.080561 -0.0584921 0.00709085 1 0 1 1 0 0 +EDGE2 6047 607 -0.0100024 0.0382204 -0.0193161 1 0 1 1 0 0 +EDGE2 6047 6046 -0.944687 0.0303391 0.00213716 1 0 1 1 0 0 +EDGE2 6047 606 -1.01358 -0.0290356 -0.00689455 1 0 1 1 0 0 +EDGE2 6047 608 0.970627 0.0514844 -0.00258216 1 0 1 1 0 0 +EDGE2 6048 607 -1.0211 -0.0279257 -0.0187853 1 0 1 1 0 0 +EDGE2 6048 6047 -1.00421 0.01899 -0.0334897 1 0 1 1 0 0 +EDGE2 6048 608 0.000583235 0.0107895 0.0186014 1 0 1 1 0 0 +EDGE2 6048 609 1.04067 -0.0217815 0.0177463 1 0 1 1 0 0 +EDGE2 6049 608 -0.889144 -0.0897237 0.00685032 1 0 1 1 0 0 +EDGE2 6049 6048 -0.926196 -0.088287 0.00582824 1 0 1 1 0 0 +EDGE2 6049 609 0.0766521 -0.0417893 -0.00865715 1 0 1 1 0 0 +EDGE2 6049 610 1.04997 0.0181911 0.0195716 1 0 1 1 0 0 +EDGE2 6049 6030 1.08787 -0.0486006 -3.1186 1 0 1 1 0 0 +EDGE2 6050 6031 0.0697676 1.01651 1.58082 1 0 1 1 0 0 +EDGE2 6050 6049 -1.01958 0.0212216 -0.00559467 1 0 1 1 0 0 +EDGE2 6050 609 -1.04448 -0.0900704 0.00290964 1 0 1 1 0 0 +EDGE2 6050 610 0.0165269 -0.0975932 0.00418249 1 0 1 1 0 0 +EDGE2 6050 6030 -0.0457496 0.020776 -3.13702 1 0 1 1 0 0 +EDGE2 6050 6029 1.01642 0.0626821 -3.16411 1 0 1 1 0 0 +EDGE2 6050 611 -0.0558894 -0.955554 -1.55095 1 0 1 1 0 0 +EDGE2 6051 6032 0.951678 0.0739475 0.0292717 1 0 1 1 0 0 +EDGE2 6051 6031 0.0136108 0.1082 -0.00597391 1 0 1 1 0 0 +EDGE2 6051 6050 -0.926877 0.0580836 -1.53531 1 0 1 1 0 0 +EDGE2 6051 610 -1.03953 -0.159239 -1.56389 1 0 1 1 0 0 +EDGE2 6051 6030 -1.01881 0.00473993 1.54114 1 0 1 1 0 0 +EDGE2 6052 6032 0.0494746 0.0501923 0.00411507 1 0 1 1 0 0 +EDGE2 6052 6033 0.993275 -0.0844187 -0.00724998 1 0 1 1 0 0 +EDGE2 6052 6051 -1.0149 -0.0266627 -0.0272488 1 0 1 1 0 0 +EDGE2 6052 6031 -0.970142 0.00969309 -0.00833164 1 0 1 1 0 0 +EDGE2 6053 6032 -1.00614 -0.0360156 0.0405827 1 0 1 1 0 0 +EDGE2 6053 6034 0.954473 -0.00137778 0.0352026 1 0 1 1 0 0 +EDGE2 6053 6033 0.0159267 0.0132277 -0.0245986 1 0 1 1 0 0 +EDGE2 6053 6052 -1.07045 -0.0963915 -0.0061237 1 0 1 1 0 0 +EDGE2 6054 6035 0.970432 0.0164145 -0.0155613 1 0 1 1 0 0 +EDGE2 6054 6034 -0.000201493 -0.00344527 -0.000425148 1 0 1 1 0 0 +EDGE2 6054 6033 -1.0415 0.0226315 0.0162022 1 0 1 1 0 0 +EDGE2 6054 6053 -1.04591 0.0129012 0.0155063 1 0 1 1 0 0 +EDGE2 6055 6036 -0.0626831 1.06835 1.6018 1 0 1 1 0 0 +EDGE2 6055 6035 -0.0240579 -0.108576 0.0182245 1 0 1 1 0 0 +EDGE2 6055 6034 -1.01606 0.0514345 0.015874 1 0 1 1 0 0 +EDGE2 6055 6054 -0.984199 -0.0245173 -0.0142295 1 0 1 1 0 0 +EDGE2 6056 6037 0.986563 -0.0851031 -0.0155829 1 0 1 1 0 0 +EDGE2 6056 6036 0.00166616 0.00472799 -0.0130965 1 0 1 1 0 0 +EDGE2 6056 6035 -1.01754 0.0342103 -1.58141 1 0 1 1 0 0 +EDGE2 6056 6055 -1.02008 0.0115728 -1.53817 1 0 1 1 0 0 +EDGE2 6057 6038 1.01883 0.0298481 -0.0342893 1 0 1 1 0 0 +EDGE2 6057 6056 -0.959896 0.00366867 -0.00644125 1 0 1 1 0 0 +EDGE2 6057 6037 0.0185462 -0.0433584 -0.0146978 1 0 1 1 0 0 +EDGE2 6057 6036 -1.052 0.00378064 -0.00885285 1 0 1 1 0 0 +EDGE2 6058 6039 1.05338 0.0428974 0.0066394 1 0 1 1 0 0 +EDGE2 6058 6038 0.0303858 -0.0100884 -0.0155606 1 0 1 1 0 0 +EDGE2 6058 6037 -1.01092 0.0069953 -0.038837 1 0 1 1 0 0 +EDGE2 6058 6057 -0.95561 -0.0591065 -0.00166881 1 0 1 1 0 0 +EDGE2 6059 6040 1.03811 0.0593619 0.0191549 1 0 1 1 0 0 +EDGE2 6059 6039 -0.0915733 0.0368585 -0.0099937 1 0 1 1 0 0 +EDGE2 6059 6058 -1.01183 0.00891957 -0.00286754 1 0 1 1 0 0 +EDGE2 6059 6038 -0.994439 -0.121337 0.0346979 1 0 1 1 0 0 +EDGE2 6060 6040 0.0386651 -0.0459243 0.00574297 1 0 1 1 0 0 +EDGE2 6060 6041 -0.0772789 0.952314 1.57934 1 0 1 1 0 0 +EDGE2 6060 6059 -1.058 -0.0492426 0.0045101 1 0 1 1 0 0 +EDGE2 6060 6039 -1.07608 0.0354102 0.00984935 1 0 1 1 0 0 +EDGE2 6061 6042 0.988548 -0.031767 0.00891833 1 0 1 1 0 0 +EDGE2 6061 6040 -0.949379 0.103388 -1.58468 1 0 1 1 0 0 +EDGE2 6061 6060 -1.00598 -0.0367458 -1.57663 1 0 1 1 0 0 +EDGE2 6061 6041 0.0559733 0.00549811 0.0232323 1 0 1 1 0 0 +EDGE2 6062 6042 -0.00617691 0.0842473 0.0010846 1 0 1 1 0 0 +EDGE2 6062 6061 -1.01328 -0.114561 0.0127125 1 0 1 1 0 0 +EDGE2 6062 6041 -1.06334 -0.00738222 -0.0102028 1 0 1 1 0 0 +EDGE2 6062 6043 0.94908 -0.0886386 -0.0270096 1 0 1 1 0 0 +EDGE2 6063 6042 -1.10869 -0.0693362 -0.0435211 1 0 1 1 0 0 +EDGE2 6063 6062 -0.932264 0.00707861 0.0039009 1 0 1 1 0 0 +EDGE2 6063 6043 0.0209904 -0.0392385 0.0180314 1 0 1 1 0 0 +EDGE2 6063 6044 0.98285 -0.0277663 -0.00830757 1 0 1 1 0 0 +EDGE2 6064 6063 -1.03559 0.0568536 0.0016787 1 0 1 1 0 0 +EDGE2 6064 6043 -1.04045 -0.00703155 0.0150764 1 0 1 1 0 0 +EDGE2 6064 6044 0.165236 -0.0768536 0.00152723 1 0 1 1 0 0 +EDGE2 6064 6045 1.02189 0.00194328 0.0272219 1 0 1 1 0 0 +EDGE2 6064 605 0.967843 0.0287453 -3.14619 1 0 1 1 0 0 +EDGE2 6065 6044 -1.01306 0.0339775 0.0216076 1 0 1 1 0 0 +EDGE2 6065 6064 -1.06082 -0.0198982 0.0133855 1 0 1 1 0 0 +EDGE2 6065 6045 -0.0254329 0.0581393 -0.0243443 1 0 1 1 0 0 +EDGE2 6065 605 -0.0319218 -0.0389536 -3.14237 1 0 1 1 0 0 +EDGE2 6065 604 1.00057 -0.0149375 -3.16211 1 0 1 1 0 0 +EDGE2 6065 6046 0.0113352 0.920736 1.58182 1 0 1 1 0 0 +EDGE2 6065 606 -0.0417325 0.992501 1.55597 1 0 1 1 0 0 +EDGE2 6066 6045 -1.01137 -0.149767 -1.58091 1 0 1 1 0 0 +EDGE2 6066 6065 -0.970155 -0.0327844 -1.5217 1 0 1 1 0 0 +EDGE2 6066 605 -1.04554 -0.0513223 1.56969 1 0 1 1 0 0 +EDGE2 6066 607 1.03608 0.0509307 0.0194299 1 0 1 1 0 0 +EDGE2 6066 6046 -0.0174824 -0.0132189 0.0150086 1 0 1 1 0 0 +EDGE2 6066 606 0.0461207 -0.0165825 -0.0263098 1 0 1 1 0 0 +EDGE2 6066 6047 1.03542 -0.0073855 0.0278113 1 0 1 1 0 0 +EDGE2 6067 607 0.0621998 0.00539037 0.00668989 1 0 1 1 0 0 +EDGE2 6067 6046 -0.973475 0.0388977 -0.00846458 1 0 1 1 0 0 +EDGE2 6067 6066 -0.947062 0.0256407 0.00342203 1 0 1 1 0 0 +EDGE2 6067 606 -0.986207 -0.056998 0.000286689 1 0 1 1 0 0 +EDGE2 6067 6047 -0.00988652 0.0577671 0.0092356 1 0 1 1 0 0 +EDGE2 6067 608 0.96853 0.0173906 -0.0118379 1 0 1 1 0 0 +EDGE2 6067 6048 1.05623 -0.0347427 -0.0078374 1 0 1 1 0 0 +EDGE2 6068 607 -1.02812 0.00930931 -0.0315313 1 0 1 1 0 0 +EDGE2 6068 6067 -1.08778 -0.142951 -0.0482475 1 0 1 1 0 0 +EDGE2 6068 6047 -0.967942 -0.0217941 -0.0118564 1 0 1 1 0 0 +EDGE2 6068 608 -0.109335 -0.0475708 -0.0284858 1 0 1 1 0 0 +EDGE2 6068 6048 -0.0449739 -0.0938029 -0.00542792 1 0 1 1 0 0 +EDGE2 6068 6049 0.946159 -0.018263 -0.00686586 1 0 1 1 0 0 +EDGE2 6068 609 0.986083 0.00852785 -0.015587 1 0 1 1 0 0 +EDGE2 6069 6068 -0.995586 0.0341773 0.00787584 1 0 1 1 0 0 +EDGE2 6069 608 -1.03916 0.0642243 0.00541983 1 0 1 1 0 0 +EDGE2 6069 6048 -0.973043 0.00124316 0.00281769 1 0 1 1 0 0 +EDGE2 6069 6049 -0.000682864 -0.0245991 0.0148316 1 0 1 1 0 0 +EDGE2 6069 609 0.00144313 -0.00238004 0.00536492 1 0 1 1 0 0 +EDGE2 6069 6050 1.03591 -0.0192069 -0.000775468 1 0 1 1 0 0 +EDGE2 6069 610 1.09781 -0.0690651 -0.00445338 1 0 1 1 0 0 +EDGE2 6069 6030 1.0087 0.141932 -3.13447 1 0 1 1 0 0 +EDGE2 6070 6051 -0.103285 0.985406 1.5966 1 0 1 1 0 0 +EDGE2 6070 6031 0.0715853 1.03355 1.60501 1 0 1 1 0 0 +EDGE2 6070 6049 -0.962993 0.0180324 -0.0220381 1 0 1 1 0 0 +EDGE2 6070 6069 -1.07399 0.0280163 0.0050799 1 0 1 1 0 0 +EDGE2 6070 609 -0.97392 0.0862232 0.00285106 1 0 1 1 0 0 +EDGE2 6070 6050 0.0781741 0.0449995 -0.00569825 1 0 1 1 0 0 +EDGE2 6070 610 0.0345048 -0.0687761 -0.0229272 1 0 1 1 0 0 +EDGE2 6070 6030 -0.0232671 -0.0355417 -3.15574 1 0 1 1 0 0 +EDGE2 6070 6029 1.00134 0.0271969 -3.14282 1 0 1 1 0 0 +EDGE2 6070 611 0.106556 -0.944229 -1.56287 1 0 1 1 0 0 +EDGE2 6071 6032 1.04829 0.00680562 0.00132938 1 0 1 1 0 0 +EDGE2 6071 6052 0.969237 0.0409677 -0.00761947 1 0 1 1 0 0 +EDGE2 6071 6051 0.00803238 -0.0488852 -0.00746034 1 0 1 1 0 0 +EDGE2 6071 6031 0.0489005 0.0665708 0.0041565 1 0 1 1 0 0 +EDGE2 6071 6050 -0.97145 -0.0458853 -1.58066 1 0 1 1 0 0 +EDGE2 6071 6070 -0.969855 0.10175 -1.58626 1 0 1 1 0 0 +EDGE2 6071 610 -0.873645 -0.0529281 -1.57446 1 0 1 1 0 0 +EDGE2 6071 6030 -0.899038 -0.0548448 1.57082 1 0 1 1 0 0 +EDGE2 6072 6032 0.00804415 -0.0350019 -0.0165435 1 0 1 1 0 0 +EDGE2 6072 6033 0.917139 -0.021172 -0.0136374 1 0 1 1 0 0 +EDGE2 6072 6053 1.00167 -0.0151493 0.00284615 1 0 1 1 0 0 +EDGE2 6072 6052 0.0668931 -0.0163275 -0.0163874 1 0 1 1 0 0 +EDGE2 6072 6051 -0.956411 0.105841 -0.0184042 1 0 1 1 0 0 +EDGE2 6072 6071 -1.00103 -0.0650271 -0.0210766 1 0 1 1 0 0 +EDGE2 6072 6031 -0.98198 -0.0497178 0.0342121 1 0 1 1 0 0 +EDGE2 6073 6032 -1.02645 0.0472546 0.0210738 1 0 1 1 0 0 +EDGE2 6073 6034 0.968592 0.0545388 0.00139062 1 0 1 1 0 0 +EDGE2 6073 6054 0.973233 -0.00237523 0.00735968 1 0 1 1 0 0 +EDGE2 6073 6033 0.0267338 -0.00544605 -0.00965719 1 0 1 1 0 0 +EDGE2 6073 6053 -0.046575 0.0257586 -0.00261901 1 0 1 1 0 0 +EDGE2 6073 6072 -0.96714 -0.0176895 0.027202 1 0 1 1 0 0 +EDGE2 6073 6052 -0.866845 -0.0306541 0.0206323 1 0 1 1 0 0 +EDGE2 6074 6035 1.01159 -0.0287205 0.00369496 1 0 1 1 0 0 +EDGE2 6074 6055 1.02075 0.0368794 -0.00698419 1 0 1 1 0 0 +EDGE2 6074 6034 -0.0988661 0.0867229 0.00815615 1 0 1 1 0 0 +EDGE2 6074 6054 -0.00136922 0.00188396 0.00113609 1 0 1 1 0 0 +EDGE2 6074 6033 -1.0047 0.0521142 0.00190209 1 0 1 1 0 0 +EDGE2 6074 6053 -1.00777 0.017082 0.0042508 1 0 1 1 0 0 +EDGE2 6074 6073 -1.0335 -0.0508166 0.0306667 1 0 1 1 0 0 +EDGE2 6075 6056 -0.108893 1.00987 1.55097 1 0 1 1 0 0 +EDGE2 6075 6036 -0.118994 0.96481 1.60687 1 0 1 1 0 0 +EDGE2 6075 6035 0.0997793 -0.0378277 0.00255136 1 0 1 1 0 0 +EDGE2 6075 6055 0.00588891 0.00650003 0.00766613 1 0 1 1 0 0 +EDGE2 6075 6034 -0.999004 -0.0746109 0.0226121 1 0 1 1 0 0 +EDGE2 6075 6054 -0.944869 -0.0328339 -0.0062401 1 0 1 1 0 0 +EDGE2 6075 6074 -1.03382 -0.0644695 -0.0374084 1 0 1 1 0 0 +EDGE2 6076 6056 0.0186375 0.0273655 0.0255189 1 0 1 1 0 0 +EDGE2 6076 6037 0.933263 -0.0972666 -0.0405982 1 0 1 1 0 0 +EDGE2 6076 6057 0.956709 -0.0588107 0.00514206 1 0 1 1 0 0 +EDGE2 6076 6075 -1.01361 0.0747427 -1.59484 1 0 1 1 0 0 +EDGE2 6076 6036 -0.0635087 0.152912 -0.00131466 1 0 1 1 0 0 +EDGE2 6076 6035 -1.03684 0.00828724 -1.54255 1 0 1 1 0 0 +EDGE2 6076 6055 -1.03836 -0.00791041 -1.58662 1 0 1 1 0 0 +EDGE2 6077 6058 1.06784 0.040505 0.00491654 1 0 1 1 0 0 +EDGE2 6077 6038 0.975131 -0.0261794 0.00660216 1 0 1 1 0 0 +EDGE2 6077 6056 -1.00688 0.0121217 -0.00923968 1 0 1 1 0 0 +EDGE2 6077 6037 -0.0347099 -0.0870816 -0.0227211 1 0 1 1 0 0 +EDGE2 6077 6057 -0.0351831 -0.0267058 0.0105934 1 0 1 1 0 0 +EDGE2 6077 6076 -1.15046 0.00853446 0.0154716 1 0 1 1 0 0 +EDGE2 6077 6036 -1.02696 -0.0062164 0.00169379 1 0 1 1 0 0 +EDGE2 6078 6059 1.06287 0.0426481 0.0123621 1 0 1 1 0 0 +EDGE2 6078 6039 0.949701 -0.0343051 0.031877 1 0 1 1 0 0 +EDGE2 6078 6058 -0.00597923 -0.0210035 -0.0283304 1 0 1 1 0 0 +EDGE2 6078 6038 0.0616762 0.00127687 0.00823596 1 0 1 1 0 0 +EDGE2 6078 6037 -1.02611 0.07136 0.016688 1 0 1 1 0 0 +EDGE2 6078 6077 -1.02079 0.00959814 0.0281628 1 0 1 1 0 0 +EDGE2 6078 6057 -0.893882 -0.0685504 0.0229888 1 0 1 1 0 0 +EDGE2 6079 6040 0.973785 -0.00575511 0.0288856 1 0 1 1 0 0 +EDGE2 6079 6060 0.971836 -0.0164501 -0.0222454 1 0 1 1 0 0 +EDGE2 6079 6078 -1.03325 -0.010149 0.00512071 1 0 1 1 0 0 +EDGE2 6079 6059 0.0518426 0.039203 0.0280003 1 0 1 1 0 0 +EDGE2 6079 6039 0.0862081 -0.00765567 0.00114937 1 0 1 1 0 0 +EDGE2 6079 6058 -0.930152 0.0321582 0.00306027 1 0 1 1 0 0 +EDGE2 6079 6038 -0.957861 0.0726723 0.0188205 1 0 1 1 0 0 +EDGE2 6080 6040 0.0229621 -0.0211063 0.010947 1 0 1 1 0 0 +EDGE2 6080 6060 -0.00751205 0.0577597 -0.0102644 1 0 1 1 0 0 +EDGE2 6080 6061 0.0631018 0.922771 1.54341 1 0 1 1 0 0 +EDGE2 6080 6041 -0.116226 1.02988 1.55709 1 0 1 1 0 0 +EDGE2 6080 6059 -0.984424 -0.0639625 -0.0224353 1 0 1 1 0 0 +EDGE2 6080 6079 -1.02837 0.0952667 0.00472288 1 0 1 1 0 0 +EDGE2 6080 6039 -1.06458 0.0326778 -0.00733406 1 0 1 1 0 0 +EDGE2 6081 6042 0.919762 -0.0348998 0.000644075 1 0 1 1 0 0 +EDGE2 6081 6040 -1.04913 0.00610422 -1.55532 1 0 1 1 0 0 +EDGE2 6081 6060 -1.11889 0.0399421 -1.5628 1 0 1 1 0 0 +EDGE2 6081 6080 -1.03562 0.0270704 -1.55305 1 0 1 1 0 0 +EDGE2 6081 6061 0.0329174 -0.00648029 -0.0241419 1 0 1 1 0 0 +EDGE2 6081 6041 -0.0657303 -0.068994 0.0144584 1 0 1 1 0 0 +EDGE2 6081 6062 0.882341 -0.00650875 -0.00857913 1 0 1 1 0 0 +EDGE2 6082 6042 -0.0935713 0.0581489 0.0377641 1 0 1 1 0 0 +EDGE2 6082 6061 -0.929342 0.0612739 0.00515328 1 0 1 1 0 0 +EDGE2 6082 6081 -1.04449 -0.0254948 0.00439132 1 0 1 1 0 0 +EDGE2 6082 6041 -0.999222 -0.00827261 -0.000169978 1 0 1 1 0 0 +EDGE2 6082 6062 -0.00488645 -0.0141459 0.016547 1 0 1 1 0 0 +EDGE2 6082 6063 1.00868 0.047926 0.0236996 1 0 1 1 0 0 +EDGE2 6082 6043 0.940023 -0.0181099 0.0270199 1 0 1 1 0 0 +EDGE2 6083 6042 -0.890512 -0.0604801 0.0174611 1 0 1 1 0 0 +EDGE2 6083 6082 -1.14769 0.00646489 0.00928959 1 0 1 1 0 0 +EDGE2 6083 6062 -0.978182 -0.0261131 -0.00119395 1 0 1 1 0 0 +EDGE2 6083 6063 0.0414059 -0.0817713 -0.000388638 1 0 1 1 0 0 +EDGE2 6083 6043 -0.0707915 0.0487838 -0.00147933 1 0 1 1 0 0 +EDGE2 6083 6044 1.06468 0.0128176 0.0139975 1 0 1 1 0 0 +EDGE2 6083 6064 0.987262 -0.0378903 -0.0216368 1 0 1 1 0 0 +EDGE2 6084 6063 -0.992092 0.0351685 0.0113098 1 0 1 1 0 0 +EDGE2 6084 6083 -1.08107 0.100362 0.0222843 1 0 1 1 0 0 +EDGE2 6084 6043 -0.978478 0.0646599 -0.0055233 1 0 1 1 0 0 +EDGE2 6084 6044 0.0110312 -0.0315393 0.0357694 1 0 1 1 0 0 +EDGE2 6084 6064 -0.0183008 0.0759211 -0.00287721 1 0 1 1 0 0 +EDGE2 6084 6045 0.980684 0.0260793 -0.00559868 1 0 1 1 0 0 +EDGE2 6084 6065 0.958421 -0.0201774 -0.020073 1 0 1 1 0 0 +EDGE2 6084 605 0.965745 -0.000511181 -3.13269 1 0 1 1 0 0 +EDGE2 6085 6044 -0.987181 0.0667292 0.0137748 1 0 1 1 0 0 +EDGE2 6085 6084 -0.938321 -0.0166627 -0.000208883 1 0 1 1 0 0 +EDGE2 6085 6064 -1.0336 0.0917462 -0.0282539 1 0 1 1 0 0 +EDGE2 6085 6045 -0.0612142 -0.0878119 -0.0079722 1 0 1 1 0 0 +EDGE2 6085 6065 -0.0360486 -0.00650466 -0.033912 1 0 1 1 0 0 +EDGE2 6085 605 0.00305693 -0.0116848 -3.12965 1 0 1 1 0 0 +EDGE2 6085 604 1.01967 0.00266473 -3.15514 1 0 1 1 0 0 +EDGE2 6085 6046 0.0532358 1.03373 1.55238 1 0 1 1 0 0 +EDGE2 6085 6066 0.0378817 0.994811 1.58409 1 0 1 1 0 0 +EDGE2 6085 606 0.0102992 1.02985 1.55641 1 0 1 1 0 0 +EDGE2 6086 6045 -0.9699 -0.0549085 -1.56466 1 0 1 1 0 0 +EDGE2 6086 6065 -1.02321 0.107407 -1.59362 1 0 1 1 0 0 +EDGE2 6086 6085 -1.05989 -0.00687245 -1.56486 1 0 1 1 0 0 +EDGE2 6086 605 -1.01649 0.00641372 1.57157 1 0 1 1 0 0 +EDGE2 6086 607 0.948193 0.0252579 0.0147646 1 0 1 1 0 0 +EDGE2 6086 6067 1.00292 -0.00230829 -0.00372045 1 0 1 1 0 0 +EDGE2 6086 6046 0.00305101 0.0148354 0.0158704 1 0 1 1 0 0 +EDGE2 6086 6066 0.0912538 0.0192759 -0.000616311 1 0 1 1 0 0 +EDGE2 6086 606 -0.0591938 0.0237424 -0.00325254 1 0 1 1 0 0 +EDGE2 6086 6047 0.954928 0.0282306 -0.0125682 1 0 1 1 0 0 +EDGE2 6087 607 -0.0289416 -0.114896 0.00115142 1 0 1 1 0 0 +EDGE2 6087 6067 0.0423698 0.0365019 0.00396186 1 0 1 1 0 0 +EDGE2 6087 6046 -0.94767 0.0196853 0.0262795 1 0 1 1 0 0 +EDGE2 6087 6086 -1.04843 0.0934274 0.0069642 1 0 1 1 0 0 +EDGE2 6087 6066 -1.03239 0.0295738 0.00899388 1 0 1 1 0 0 +EDGE2 6087 606 -0.9201 0.0354133 -0.0156788 1 0 1 1 0 0 +EDGE2 6087 6047 0.113905 0.0436234 -0.01962 1 0 1 1 0 0 +EDGE2 6087 6068 0.966352 -0.0185458 -0.00670228 1 0 1 1 0 0 +EDGE2 6087 608 0.986558 -0.0578359 0.0245812 1 0 1 1 0 0 +EDGE2 6087 6048 0.97935 -0.0265214 0.0244145 1 0 1 1 0 0 +EDGE2 6088 607 -1.03721 -0.0234551 -0.0161545 1 0 1 1 0 0 +EDGE2 6088 6067 -0.971148 0.0774562 0.00559342 1 0 1 1 0 0 +EDGE2 6088 6087 -1.00407 -0.0998187 0.0118065 1 0 1 1 0 0 +EDGE2 6088 6047 -1.03634 0.0673195 -0.00787597 1 0 1 1 0 0 +EDGE2 6088 6068 -0.0594111 -0.0080667 -0.0138471 1 0 1 1 0 0 +EDGE2 6088 608 -0.0103655 -0.0630725 -0.0125274 1 0 1 1 0 0 +EDGE2 6088 6048 0.0373186 -0.144172 0.0204871 1 0 1 1 0 0 +EDGE2 6088 6049 0.975138 -0.0124565 0.0115566 1 0 1 1 0 0 +EDGE2 6088 6069 0.949938 -0.0639515 0.00339324 1 0 1 1 0 0 +EDGE2 6088 609 0.989988 0.0124816 0.0212522 1 0 1 1 0 0 +EDGE2 6089 6068 -1.02306 0.00824585 0.0112426 1 0 1 1 0 0 +EDGE2 6089 6088 -1.05277 -0.0800506 0.0171244 1 0 1 1 0 0 +EDGE2 6089 608 -1.03233 -0.05398 -0.0203628 1 0 1 1 0 0 +EDGE2 6089 6048 -1.11203 -0.0334392 0.0294349 1 0 1 1 0 0 +EDGE2 6089 6049 0.00721885 -0.0442389 0.0497468 1 0 1 1 0 0 +EDGE2 6089 6069 0.0133591 -0.0451125 0.0171677 1 0 1 1 0 0 +EDGE2 6089 609 0.0497796 -0.129623 -0.0030307 1 0 1 1 0 0 +EDGE2 6089 6050 1.04273 0.0274128 0.0178536 1 0 1 1 0 0 +EDGE2 6089 6070 1.02845 -0.0771745 -0.00509519 1 0 1 1 0 0 +EDGE2 6089 610 1.03299 -0.0444341 0.0251116 1 0 1 1 0 0 +EDGE2 6089 6030 1.00292 -0.00491566 -3.19465 1 0 1 1 0 0 +EDGE2 6090 6051 -0.0126033 1.01694 1.56673 1 0 1 1 0 0 +EDGE2 6090 6071 0.00297557 1.05125 1.54424 1 0 1 1 0 0 +EDGE2 6090 6031 -0.0574469 1.04471 1.57624 1 0 1 1 0 0 +EDGE2 6090 6089 -0.962117 -0.0824488 -0.0265726 1 0 1 1 0 0 +EDGE2 6090 6049 -0.981524 0.0322582 -0.0159879 1 0 1 1 0 0 +EDGE2 6090 6069 -0.979004 0.0316432 0.0277881 1 0 1 1 0 0 +EDGE2 6090 609 -1.00793 0.00482837 0.00999766 1 0 1 1 0 0 +EDGE2 6090 6050 0.0516434 0.0497981 0.0175725 1 0 1 1 0 0 +EDGE2 6090 6070 -0.0267627 0.0195064 0.0102723 1 0 1 1 0 0 +EDGE2 6090 610 0.083648 -0.0904157 0.000188554 1 0 1 1 0 0 +EDGE2 6090 6030 0.0104882 -0.00439951 -3.12765 1 0 1 1 0 0 +EDGE2 6090 6029 1.05772 -0.0685828 -3.14772 1 0 1 1 0 0 +EDGE2 6090 611 -0.00423991 -1.02041 -1.57506 1 0 1 1 0 0 +EDGE2 6091 6032 1.0276 0.126327 -0.0138216 1 0 1 1 0 0 +EDGE2 6091 6072 0.997917 -0.046683 0.029678 1 0 1 1 0 0 +EDGE2 6091 6052 1.01682 -0.00623141 -0.0279113 1 0 1 1 0 0 +EDGE2 6091 6051 -0.00785731 0.00314022 0.0272018 1 0 1 1 0 0 +EDGE2 6091 6071 -0.0591019 -0.00158715 0.00359122 1 0 1 1 0 0 +EDGE2 6091 6031 0.0661064 -0.0556614 0.00731891 1 0 1 1 0 0 +EDGE2 6091 6050 -0.953297 0.0247861 -1.58672 1 0 1 1 0 0 +EDGE2 6091 6090 -1.01738 -0.0283188 -1.57181 1 0 1 1 0 0 +EDGE2 6091 6070 -1.03046 0.0150249 -1.55144 1 0 1 1 0 0 +EDGE2 6091 610 -1.00703 -0.0589549 -1.54484 1 0 1 1 0 0 +EDGE2 6091 6030 -1.0095 -0.0788203 1.56247 1 0 1 1 0 0 +EDGE2 6092 6032 -0.0247904 0.00816672 0.0076291 1 0 1 1 0 0 +EDGE2 6092 6033 0.988119 -0.0464885 0.0224805 1 0 1 1 0 0 +EDGE2 6092 6053 1.0076 -0.0530325 -0.00146577 1 0 1 1 0 0 +EDGE2 6092 6073 0.954333 0.00241124 -0.022356 1 0 1 1 0 0 +EDGE2 6092 6072 -0.0590181 -0.029782 -0.0128828 1 0 1 1 0 0 +EDGE2 6092 6052 -0.00842478 0.0126246 0.0211275 1 0 1 1 0 0 +EDGE2 6092 6051 -1.04929 0.0153269 0.0259618 1 0 1 1 0 0 +EDGE2 6092 6071 -0.967601 0.0832879 -0.00113288 1 0 1 1 0 0 +EDGE2 6092 6091 -0.972919 -0.044857 0.00826511 1 0 1 1 0 0 +EDGE2 6092 6031 -1.02487 -0.0619126 0.0102737 1 0 1 1 0 0 +EDGE2 6093 6032 -0.888935 0.00926413 0.00257891 1 0 1 1 0 0 +EDGE2 6093 6034 0.988033 -0.0237696 -0.0319474 1 0 1 1 0 0 +EDGE2 6093 6054 1.04418 0.0181864 0.0103406 1 0 1 1 0 0 +EDGE2 6093 6074 1.02228 0.0173132 -0.00505527 1 0 1 1 0 0 +EDGE2 6093 6033 0.0726354 0.0992879 -0.0257755 1 0 1 1 0 0 +EDGE2 6093 6053 -0.0764553 0.00753315 -0.00816578 1 0 1 1 0 0 +EDGE2 6093 6073 -0.00681588 -0.073703 0.0114811 1 0 1 1 0 0 +EDGE2 6093 6072 -0.948956 -0.0492829 0.0321619 1 0 1 1 0 0 +EDGE2 6093 6092 -0.86366 0.0429066 -0.0370518 1 0 1 1 0 0 +EDGE2 6093 6052 -0.952386 0.0441718 -0.0101855 1 0 1 1 0 0 +EDGE2 6094 6075 1.02401 -0.0137089 0.0066424 1 0 1 1 0 0 +EDGE2 6094 6035 0.990986 -0.0864292 0.00238031 1 0 1 1 0 0 +EDGE2 6094 6055 1.06682 0.0110313 0.0138921 1 0 1 1 0 0 +EDGE2 6094 6093 -0.957009 -0.00273333 0.0304211 1 0 1 1 0 0 +EDGE2 6094 6034 0.014147 -0.0225885 0.00116389 1 0 1 1 0 0 +EDGE2 6094 6054 -0.021701 -0.0735004 0.0024759 1 0 1 1 0 0 +EDGE2 6094 6074 -0.0456484 0.0640375 -0.00797039 1 0 1 1 0 0 +EDGE2 6094 6033 -1.00997 -0.00141417 -0.00286324 1 0 1 1 0 0 +EDGE2 6094 6053 -1.01644 0.00172463 -0.000731922 1 0 1 1 0 0 +EDGE2 6094 6073 -1.02508 0.022193 -0.00922735 1 0 1 1 0 0 +EDGE2 6095 6094 -1.01664 -0.00507214 -0.00563092 1 0 1 1 0 0 +EDGE2 6095 6056 0.0411033 0.961826 1.5585 1 0 1 1 0 0 +EDGE2 6095 6076 0.0516676 0.990952 1.60389 1 0 1 1 0 0 +EDGE2 6095 6075 0.0927054 0.00933332 -0.038319 1 0 1 1 0 0 +EDGE2 6095 6036 0.0950929 1.01657 1.56697 1 0 1 1 0 0 +EDGE2 6095 6035 -0.0544311 -0.0419663 -0.0110467 1 0 1 1 0 0 +EDGE2 6095 6055 -0.100315 -0.0301302 -0.0303217 1 0 1 1 0 0 +EDGE2 6095 6034 -0.998594 0.104424 -0.00347558 1 0 1 1 0 0 +EDGE2 6095 6054 -1.01797 0.0527205 0.0255568 1 0 1 1 0 0 +EDGE2 6095 6074 -0.978247 0.0344669 0.00443788 1 0 1 1 0 0 +EDGE2 6096 6056 0.0251454 -0.00742691 -0.00769409 1 0 1 1 0 0 +EDGE2 6096 6037 1.07559 0.0251924 -0.00135111 1 0 1 1 0 0 +EDGE2 6096 6077 1.00302 0.034409 0.0314263 1 0 1 1 0 0 +EDGE2 6096 6057 0.924866 0.030187 -0.0099375 1 0 1 1 0 0 +EDGE2 6096 6076 0.0654303 -0.0514332 0.0167665 1 0 1 1 0 0 +EDGE2 6096 6075 -1.01468 -0.0447738 -1.57629 1 0 1 1 0 0 +EDGE2 6096 6036 -0.0501407 -0.0017283 -0.00782253 1 0 1 1 0 0 +EDGE2 6096 6095 -1.03003 0.0920384 -1.55715 1 0 1 1 0 0 +EDGE2 6096 6035 -1.02739 0.0357566 -1.56506 1 0 1 1 0 0 +EDGE2 6096 6055 -0.970353 -0.00445345 -1.56133 1 0 1 1 0 0 +EDGE2 6097 6078 0.943192 -0.0650351 0.00498997 1 0 1 1 0 0 +EDGE2 6097 6058 1.04495 -0.0515317 0.0137592 1 0 1 1 0 0 +EDGE2 6097 6038 0.977 0.0034245 -0.0047728 1 0 1 1 0 0 +EDGE2 6097 6056 -0.854416 -0.0415502 -0.015713 1 0 1 1 0 0 +EDGE2 6097 6037 0.0110664 -0.052664 0.0131281 1 0 1 1 0 0 +EDGE2 6097 6077 0.0220788 0.0567989 -0.00217562 1 0 1 1 0 0 +EDGE2 6097 6057 0.071624 0.0126944 -0.0174422 1 0 1 1 0 0 +EDGE2 6097 6096 -1.03203 0.0822943 0.0172555 1 0 1 1 0 0 +EDGE2 6097 6076 -1.00347 -0.00523179 0.0422517 1 0 1 1 0 0 +EDGE2 6097 6036 -0.992778 -0.105444 -0.0244358 1 0 1 1 0 0 +EDGE2 6098 6078 0.0110592 -0.00992171 0.00684472 1 0 1 1 0 0 +EDGE2 6098 6059 1.05494 -0.00899434 -0.00389345 1 0 1 1 0 0 +EDGE2 6098 6079 1.02528 -0.011829 -0.000934834 1 0 1 1 0 0 +EDGE2 6098 6039 1.12625 -0.0328519 -0.0210577 1 0 1 1 0 0 +EDGE2 6098 6058 -0.00390604 -0.0348644 -0.00345434 1 0 1 1 0 0 +EDGE2 6098 6038 -0.000992857 0.0524538 0.0304381 1 0 1 1 0 0 +EDGE2 6098 6037 -0.920054 0.030964 -0.0251355 1 0 1 1 0 0 +EDGE2 6098 6077 -0.999118 -0.0185314 0.0291107 1 0 1 1 0 0 +EDGE2 6098 6097 -1.00084 -0.0117244 0.00702964 1 0 1 1 0 0 +EDGE2 6098 6057 -0.993709 -0.0497924 -0.0213028 1 0 1 1 0 0 +EDGE2 6099 6040 1.04697 0.0427986 0.00499014 1 0 1 1 0 0 +EDGE2 6099 6060 1.05632 -0.0698364 -0.0090936 1 0 1 1 0 0 +EDGE2 6099 6080 1.02537 -0.0300162 0.0261917 1 0 1 1 0 0 +EDGE2 6099 6078 -1.01466 0.014095 0.000564112 1 0 1 1 0 0 +EDGE2 6099 6059 -0.0356877 -0.0632491 -0.00751641 1 0 1 1 0 0 +EDGE2 6099 6079 -0.00553447 -0.0187288 0.0293321 1 0 1 1 0 0 +EDGE2 6099 6039 -0.0227624 0.0395448 0.0448622 1 0 1 1 0 0 +EDGE2 6099 6098 -1.01868 0.0501386 0.0249723 1 0 1 1 0 0 +EDGE2 6099 6058 -0.966908 0.00444413 -0.0149487 1 0 1 1 0 0 +EDGE2 6099 6038 -1.04608 -0.0554222 -0.00843399 1 0 1 1 0 0 +EDGE2 6100 6040 -0.027787 -0.0752991 -0.0270645 1 0 1 1 0 0 +EDGE2 6100 6060 -0.0653333 -0.0341777 -0.0215354 1 0 1 1 0 0 +EDGE2 6100 6080 0.03259 -0.00981876 0.00960927 1 0 1 1 0 0 +EDGE2 6100 6061 -0.0155603 0.974445 1.57837 1 0 1 1 0 0 +EDGE2 6100 6081 0.0708992 1.00971 1.58092 1 0 1 1 0 0 +EDGE2 6100 6041 0.0457612 0.983402 1.59805 1 0 1 1 0 0 +EDGE2 6100 6059 -0.983207 0.023184 0.0110921 1 0 1 1 0 0 +EDGE2 6100 6099 -0.992559 -0.00107906 -0.0479902 1 0 1 1 0 0 +EDGE2 6100 6079 -1.01028 -0.0171487 0.00522792 1 0 1 1 0 0 +EDGE2 6100 6039 -0.995427 0.0955023 0.00206108 1 0 1 1 0 0 +EDGE2 6101 6100 -1.00837 0.0274971 1.56292 1 0 1 1 0 0 +EDGE2 6101 6040 -1.12602 -0.00217631 1.56853 1 0 1 1 0 0 +EDGE2 6101 6060 -1.07509 0.00575403 1.53853 1 0 1 1 0 0 +EDGE2 6101 6080 -0.945251 0.0196446 1.57879 1 0 1 1 0 0 +EDGE2 6102 6101 -0.989883 -0.0169223 0.0168082 1 0 1 1 0 0 +EDGE2 6103 6102 -1.05789 0.0409578 -0.00116741 1 0 1 1 0 0 +EDGE2 6104 6103 -1.07962 0.110624 0.0269128 1 0 1 1 0 0 +EDGE2 6105 6104 -0.97327 -0.07893 0.00469777 1 0 1 1 0 0 +EDGE2 6106 6105 -1.05606 0.0289009 -1.55457 1 0 1 1 0 0 +EDGE2 6107 6106 -0.941347 0.00717461 0.0324723 1 0 1 1 0 0 +EDGE2 6108 6107 -1.02336 -0.0982812 0.00563898 1 0 1 1 0 0 +EDGE2 6109 6108 -0.993088 0.0374829 -0.0133226 1 0 1 1 0 0 +EDGE2 6110 6109 -1.00683 0.0575327 0.0142501 1 0 1 1 0 0 +EDGE2 6111 6110 -1.07343 -0.0380083 1.55638 1 0 1 1 0 0 +EDGE2 6112 6111 -0.960453 0.015391 0.0416478 1 0 1 1 0 0 +EDGE2 6113 6112 -0.946421 0.00217077 0.0180705 1 0 1 1 0 0 +EDGE2 6114 6113 -0.974616 0.0178751 0.00650579 1 0 1 1 0 0 +EDGE2 6115 6114 -1.02794 -0.0370538 -0.0238593 1 0 1 1 0 0 +EDGE2 6116 6115 -0.952514 0.02763 -1.58028 1 0 1 1 0 0 +EDGE2 6117 6116 -1.02264 0.00544964 -0.00521542 1 0 1 1 0 0 +EDGE2 6118 6117 -0.924856 0.0184558 0.0122954 1 0 1 1 0 0 +EDGE2 6119 6118 -1.13195 -0.0334642 -0.0300777 1 0 1 1 0 0 +EDGE2 6120 6119 -1.01599 0.00489677 0.00786461 1 0 1 1 0 0 +EDGE2 6121 6120 -0.965308 -0.0185733 -1.55039 1 0 1 1 0 0 +EDGE2 6122 6121 -1.03933 -0.086664 0.0247681 1 0 1 1 0 0 +EDGE2 6123 6122 -1.05293 0.0302707 0.0432069 1 0 1 1 0 0 +EDGE2 6124 6123 -0.928541 0.0486654 0.00626891 1 0 1 1 0 0 +EDGE2 6125 6124 -1.00848 0.0165511 0.0193496 1 0 1 1 0 0 +EDGE2 6126 6125 -1.01425 -0.0855335 1.58489 1 0 1 1 0 0 +EDGE2 6127 6126 -1.03189 0.0312141 0.0155049 1 0 1 1 0 0 +EDGE2 6128 6127 -1.01809 -0.0408602 0.00184383 1 0 1 1 0 0 +EDGE2 6129 570 1.01956 -0.0730262 -3.13493 1 0 1 1 0 0 +EDGE2 6129 6128 -1.04618 -0.0068561 -0.0285917 1 0 1 1 0 0 +EDGE2 6130 570 0.0577671 0.0316071 -3.16928 1 0 1 1 0 0 +EDGE2 6130 569 1.07451 -0.0437882 -3.0985 1 0 1 1 0 0 +EDGE2 6130 571 -0.00944197 0.918289 1.57326 1 0 1 1 0 0 +EDGE2 6130 6129 -0.995264 -0.0165762 0.00348179 1 0 1 1 0 0 +EDGE2 6131 570 -0.964065 -0.0651476 -1.6114 1 0 1 1 0 0 +EDGE2 6131 6130 -0.952703 0.0603001 1.57789 1 0 1 1 0 0 +EDGE2 6132 6131 -0.96791 0.0157216 -0.0115322 1 0 1 1 0 0 +EDGE2 6133 6132 -0.931061 0.0685403 -0.00755537 1 0 1 1 0 0 +EDGE2 6134 6133 -0.924179 -0.0320642 0.0281501 1 0 1 1 0 0 +EDGE2 6135 6134 -1.02084 0.0275107 -0.0125705 1 0 1 1 0 0 +EDGE2 6136 6135 -0.943102 0.0323075 -1.58736 1 0 1 1 0 0 +EDGE2 6137 6136 -1.03601 0.0881508 0.000712304 1 0 1 1 0 0 +EDGE2 6138 6137 -0.955606 -0.063278 -0.0147561 1 0 1 1 0 0 +EDGE2 6139 560 0.98518 0.036756 -3.17256 1 0 1 1 0 0 +EDGE2 6139 6138 -0.984954 0.00957652 -0.0182967 1 0 1 1 0 0 +EDGE2 6140 561 -0.014766 0.956708 1.57172 1 0 1 1 0 0 +EDGE2 6140 560 0.0439342 -0.0443572 -3.13914 1 0 1 1 0 0 +EDGE2 6140 559 0.97798 0.0146103 -3.10901 1 0 1 1 0 0 +EDGE2 6140 6139 -1.02025 -0.0454221 0.0302454 1 0 1 1 0 0 +EDGE2 6141 561 -0.0985723 -0.0434343 -0.012299 1 0 1 1 0 0 +EDGE2 6141 560 -0.954332 -0.0106277 1.56562 1 0 1 1 0 0 +EDGE2 6141 6140 -1.03961 0.0558314 -1.5706 1 0 1 1 0 0 +EDGE2 6141 562 1.02443 0.0026548 -0.0333808 1 0 1 1 0 0 +EDGE2 6142 561 -1.04644 0.0341296 0.011806 1 0 1 1 0 0 +EDGE2 6142 6141 -0.954064 -0.025947 -0.0279748 1 0 1 1 0 0 +EDGE2 6142 562 0.0167857 -0.0030147 -0.00386933 1 0 1 1 0 0 +EDGE2 6142 563 1.05658 0.0178981 0.0176461 1 0 1 1 0 0 +EDGE2 6143 562 -1.0077 -0.00821121 0.00914652 1 0 1 1 0 0 +EDGE2 6143 6142 -1.0863 0.0163933 0.0269115 1 0 1 1 0 0 +EDGE2 6143 563 -0.00864368 0.00390436 -0.0161034 1 0 1 1 0 0 +EDGE2 6143 564 1.06142 0.0225309 0.0231858 1 0 1 1 0 0 +EDGE2 6144 6143 -0.970281 0.0293674 -0.0245118 1 0 1 1 0 0 +EDGE2 6144 563 -1.03665 -0.0438337 -0.0231191 1 0 1 1 0 0 +EDGE2 6144 564 -0.129937 0.0662374 -0.0265107 1 0 1 1 0 0 +EDGE2 6144 565 1.0272 -0.0634252 0.0295614 1 0 1 1 0 0 +EDGE2 6145 6144 -1.04272 -0.0244488 0.00669726 1 0 1 1 0 0 +EDGE2 6145 564 -1.00353 -0.0173103 -0.0119987 1 0 1 1 0 0 +EDGE2 6145 565 -0.00366035 -0.0792312 -0.0123803 1 0 1 1 0 0 +EDGE2 6145 566 0.0565112 1.00856 1.58194 1 0 1 1 0 0 +EDGE2 6146 565 -0.987297 -0.0477801 -1.55918 1 0 1 1 0 0 +EDGE2 6146 6145 -1.02209 -0.0926457 -1.57235 1 0 1 1 0 0 +EDGE2 6146 566 0.0528822 -0.0222353 -0.0301678 1 0 1 1 0 0 +EDGE2 6146 567 1.00232 0.099751 0.0138174 1 0 1 1 0 0 +EDGE2 6147 566 -1.00096 0.0257124 -0.0405171 1 0 1 1 0 0 +EDGE2 6147 6146 -1.01523 0.060772 -0.0229501 1 0 1 1 0 0 +EDGE2 6147 567 0.037304 -0.00485739 0.0150663 1 0 1 1 0 0 +EDGE2 6147 568 1.00391 0.0382825 -0.0279573 1 0 1 1 0 0 +EDGE2 6148 6147 -1.05769 0.00402686 -0.000177466 1 0 1 1 0 0 +EDGE2 6148 567 -0.973491 -0.0584776 -0.00995012 1 0 1 1 0 0 +EDGE2 6148 568 0.0114101 -0.0193678 -0.0123229 1 0 1 1 0 0 +EDGE2 6148 569 0.950234 0.0660626 -0.000552488 1 0 1 1 0 0 +EDGE2 6149 6148 -1.01624 -0.0713193 0.0156458 1 0 1 1 0 0 +EDGE2 6149 568 -0.973968 -0.0441989 -0.00184293 1 0 1 1 0 0 +EDGE2 6149 570 0.956505 -0.0363082 -0.0013322 1 0 1 1 0 0 +EDGE2 6149 569 -0.0440675 -0.0396887 0.00988775 1 0 1 1 0 0 +EDGE2 6149 6130 1.0461 0.00225025 -3.12508 1 0 1 1 0 0 +EDGE2 6150 570 -0.0199839 0.0445807 -0.0163487 1 0 1 1 0 0 +EDGE2 6150 569 -0.974346 -0.0338735 -0.0143812 1 0 1 1 0 0 +EDGE2 6150 6149 -0.941184 0.0416694 0.0530695 1 0 1 1 0 0 +EDGE2 6150 6131 -0.0724203 0.968275 1.58337 1 0 1 1 0 0 +EDGE2 6150 6130 -0.025842 0.0142908 -3.13114 1 0 1 1 0 0 +EDGE2 6150 571 0.066936 -1.05624 -1.58293 1 0 1 1 0 0 +EDGE2 6150 6129 0.926062 0.0163829 -3.11955 1 0 1 1 0 0 +EDGE2 6151 570 -0.980896 -0.00640926 1.57622 1 0 1 1 0 0 +EDGE2 6151 6150 -1.08225 -0.0595497 1.61025 1 0 1 1 0 0 +EDGE2 6151 6130 -1.02849 0.025901 -1.58964 1 0 1 1 0 0 +EDGE2 6151 572 1.01303 -0.0758506 -0.0136186 1 0 1 1 0 0 +EDGE2 6151 571 0.0739217 0.0662417 0.00323813 1 0 1 1 0 0 +EDGE2 6152 572 -0.021689 -0.0935379 0.000580981 1 0 1 1 0 0 +EDGE2 6152 571 -1.0137 0.0328784 0.0184197 1 0 1 1 0 0 +EDGE2 6152 6151 -0.970101 0.0791971 0.0308887 1 0 1 1 0 0 +EDGE2 6152 573 0.989784 0.00782968 0.00299739 1 0 1 1 0 0 +EDGE2 6153 572 -0.961553 -0.0858472 -0.00822594 1 0 1 1 0 0 +EDGE2 6153 6152 -0.978168 -0.0147594 -0.00638765 1 0 1 1 0 0 +EDGE2 6153 573 0.0567185 -0.0143836 0.00732876 1 0 1 1 0 0 +EDGE2 6153 574 0.982015 0.0245306 -0.0247715 1 0 1 1 0 0 +EDGE2 6154 573 -0.964991 -0.0401667 0.0267918 1 0 1 1 0 0 +EDGE2 6154 6153 -1.02617 -0.0323949 -0.0240397 1 0 1 1 0 0 +EDGE2 6154 574 0.039493 -0.0492772 -0.00949372 1 0 1 1 0 0 +EDGE2 6154 575 1.01397 0.00413026 -0.000495934 1 0 1 1 0 0 +EDGE2 6155 6154 -0.968431 0.00987848 -0.0217615 1 0 1 1 0 0 +EDGE2 6155 574 -0.997357 0.0304924 0.000497672 1 0 1 1 0 0 +EDGE2 6155 575 0.0250306 -0.0530761 0.0316837 1 0 1 1 0 0 +EDGE2 6155 576 -0.00730057 0.951862 1.55327 1 0 1 1 0 0 +EDGE2 6156 575 -0.976275 0.0445889 -1.57432 1 0 1 1 0 0 +EDGE2 6156 6155 -1.02012 -0.107726 -1.55909 1 0 1 1 0 0 +EDGE2 6156 576 -0.0574928 -0.0282312 0.00187538 1 0 1 1 0 0 +EDGE2 6156 577 1.02368 -0.0254718 -0.0164513 1 0 1 1 0 0 +EDGE2 6157 6156 -0.951642 0.0309739 0.0101856 1 0 1 1 0 0 +EDGE2 6157 576 -1.03918 -0.0345726 -0.000745585 1 0 1 1 0 0 +EDGE2 6157 577 0.019209 0.0115065 0.0103125 1 0 1 1 0 0 +EDGE2 6157 578 1.02344 0.0288826 0.0101521 1 0 1 1 0 0 +EDGE2 6158 577 -1.00897 0.0571317 -0.00622121 1 0 1 1 0 0 +EDGE2 6158 6157 -0.926137 0.14197 -0.0228018 1 0 1 1 0 0 +EDGE2 6158 578 -0.0836051 0.0254302 0.00622259 1 0 1 1 0 0 +EDGE2 6158 579 1.02103 0.000829176 0.0002692 1 0 1 1 0 0 +EDGE2 6159 6158 -0.976656 0.0225471 -0.00501128 1 0 1 1 0 0 +EDGE2 6159 578 -0.942136 -0.04335 0.0108236 1 0 1 1 0 0 +EDGE2 6159 579 0.0455754 0.0267488 -0.0733536 1 0 1 1 0 0 +EDGE2 6159 580 0.919589 0.00285521 0.0286248 1 0 1 1 0 0 +EDGE2 6160 579 -1.00948 -0.000967823 0.0278559 1 0 1 1 0 0 +EDGE2 6160 6159 -0.98281 -0.0768672 -0.0605407 1 0 1 1 0 0 +EDGE2 6160 581 0.00492873 -1.01706 -1.56432 1 0 1 1 0 0 +EDGE2 6160 580 -0.0315989 -0.104882 -0.00590476 1 0 1 1 0 0 +EDGE2 6161 6160 -1.01408 0.00914215 -1.55907 1 0 1 1 0 0 +EDGE2 6161 580 -1.07909 0.021925 -1.56093 1 0 1 1 0 0 +EDGE2 6162 6161 -1.0833 -0.00837414 0.00752303 1 0 1 1 0 0 +EDGE2 6163 6162 -0.953256 0.0689125 -0.00514257 1 0 1 1 0 0 +EDGE2 6164 6163 -1.00533 -0.046929 -0.0333047 1 0 1 1 0 0 +EDGE2 6164 6125 1.0362 -0.0307621 -3.14277 1 0 1 1 0 0 +EDGE2 6165 6164 -1.03442 -0.053341 -0.0366619 1 0 1 1 0 0 +EDGE2 6165 6126 0.120164 1.01853 1.59832 1 0 1 1 0 0 +EDGE2 6165 6124 0.921437 -0.0404498 -3.14987 1 0 1 1 0 0 +EDGE2 6165 6125 -0.0102776 -0.0487874 -3.1492 1 0 1 1 0 0 +EDGE2 6166 6165 -0.946453 -0.0631412 1.56954 1 0 1 1 0 0 +EDGE2 6166 6125 -0.984802 -0.0904282 -1.6006 1 0 1 1 0 0 +EDGE2 6167 6166 -1.08217 0.0733947 0.00248394 1 0 1 1 0 0 +EDGE2 6168 6167 -1.06011 0.000516623 -0.00513445 1 0 1 1 0 0 +EDGE2 6169 6168 -0.960479 0.0396915 -0.0207669 1 0 1 1 0 0 +EDGE2 6169 6110 0.992132 -0.0116144 -3.13296 1 0 1 1 0 0 +EDGE2 6170 6111 -0.0242697 0.940043 1.59884 1 0 1 1 0 0 +EDGE2 6170 6169 -0.987986 -0.00346757 -0.0158411 1 0 1 1 0 0 +EDGE2 6170 6110 0.0226598 0.040356 -3.13545 1 0 1 1 0 0 +EDGE2 6170 6109 0.965016 -0.0260531 -3.12395 1 0 1 1 0 0 +EDGE2 6171 6112 0.947114 0.0804227 0.0351337 1 0 1 1 0 0 +EDGE2 6171 6111 -0.0392084 -0.0341512 5.9754e-05 1 0 1 1 0 0 +EDGE2 6171 6110 -1.01825 0.00204771 1.56005 1 0 1 1 0 0 +EDGE2 6171 6170 -0.975244 0.126483 -1.58846 1 0 1 1 0 0 +EDGE2 6172 6113 0.957321 -0.0339783 -0.019525 1 0 1 1 0 0 +EDGE2 6172 6171 -1.06578 -0.05285 0.00339213 1 0 1 1 0 0 +EDGE2 6172 6112 -0.0099317 -0.0218875 -0.0307722 1 0 1 1 0 0 +EDGE2 6172 6111 -1.03839 -0.102173 -0.0169257 1 0 1 1 0 0 +EDGE2 6173 6114 0.914685 0.0042841 0.00755158 1 0 1 1 0 0 +EDGE2 6173 6113 0.0986554 -0.0325386 0.0100268 1 0 1 1 0 0 +EDGE2 6173 6112 -1.10138 -0.0487534 0.0278009 1 0 1 1 0 0 +EDGE2 6173 6172 -0.90391 -4.5719e-05 -0.00229429 1 0 1 1 0 0 +EDGE2 6174 6115 0.950338 -0.0137317 -0.043202 1 0 1 1 0 0 +EDGE2 6174 6114 0.105413 -0.118127 0.00366497 1 0 1 1 0 0 +EDGE2 6174 6113 -0.936227 -0.0373678 0.0034735 1 0 1 1 0 0 +EDGE2 6174 6173 -1.03323 -0.0348301 0.0097783 1 0 1 1 0 0 +EDGE2 6175 6116 0.100053 0.985359 1.58792 1 0 1 1 0 0 +EDGE2 6175 6174 -1.00602 0.110336 -0.0170949 1 0 1 1 0 0 +EDGE2 6175 6115 0.0913344 -0.0208687 0.00411293 1 0 1 1 0 0 +EDGE2 6175 6114 -1.05703 -0.0823236 0.00144093 1 0 1 1 0 0 +EDGE2 6176 6175 -1.0501 -0.0775977 -1.62482 1 0 1 1 0 0 +EDGE2 6176 6117 0.914173 0.0434089 -0.00943718 1 0 1 1 0 0 +EDGE2 6176 6116 0.0534369 0.0211859 -0.00667127 1 0 1 1 0 0 +EDGE2 6176 6115 -1.03082 -0.138639 -1.55198 1 0 1 1 0 0 +EDGE2 6177 6118 1.06139 0.102466 -0.0252934 1 0 1 1 0 0 +EDGE2 6177 6176 -1.08789 0.0278629 -0.0341772 1 0 1 1 0 0 +EDGE2 6177 6117 0.0166918 0.00769168 -0.0411705 1 0 1 1 0 0 +EDGE2 6177 6116 -0.981783 -0.0281442 0.0102982 1 0 1 1 0 0 +EDGE2 6178 6119 0.949668 0.0649231 -0.0153019 1 0 1 1 0 0 +EDGE2 6178 6118 0.0403331 -0.0127329 -0.00348532 1 0 1 1 0 0 +EDGE2 6178 6117 -0.997809 -0.0096612 0.00514339 1 0 1 1 0 0 +EDGE2 6178 6177 -0.967071 -0.0436549 -0.0264487 1 0 1 1 0 0 +EDGE2 6179 6120 1.06571 0.0148638 -0.00267715 1 0 1 1 0 0 +EDGE2 6179 6178 -1.03055 0.0288282 0.000530541 1 0 1 1 0 0 +EDGE2 6179 6119 -0.0550967 -0.0221789 -3.98796e-06 1 0 1 1 0 0 +EDGE2 6179 6118 -0.913676 0.0286636 -0.0153844 1 0 1 1 0 0 +EDGE2 6180 6121 -0.00381821 1.04796 1.56647 1 0 1 1 0 0 +EDGE2 6180 6120 -0.0795976 -0.0116847 0.0444432 1 0 1 1 0 0 +EDGE2 6180 6119 -1.05021 0.0312666 -0.00316678 1 0 1 1 0 0 +EDGE2 6180 6179 -0.979632 0.0258593 0.0123275 1 0 1 1 0 0 +EDGE2 6181 6122 0.96048 -0.0491423 -0.0047853 1 0 1 1 0 0 +EDGE2 6181 6121 -0.0721837 -0.0295054 -0.0113183 1 0 1 1 0 0 +EDGE2 6181 6180 -1.01833 0.0641478 -1.54643 1 0 1 1 0 0 +EDGE2 6181 6120 -0.988256 0.0145016 -1.57815 1 0 1 1 0 0 +EDGE2 6182 6122 -0.0358989 0.0279214 0.00146325 1 0 1 1 0 0 +EDGE2 6182 6181 -0.997136 -0.022507 -0.0482538 1 0 1 1 0 0 +EDGE2 6182 6121 -1.08403 -0.0124639 -0.0140126 1 0 1 1 0 0 +EDGE2 6182 6123 1.01175 0.0361455 -0.0115046 1 0 1 1 0 0 +EDGE2 6183 6122 -1.02575 0.010194 0.00093273 1 0 1 1 0 0 +EDGE2 6183 6182 -1.02746 0.0774743 0.00585391 1 0 1 1 0 0 +EDGE2 6183 6123 0.00890098 0.0490039 0.0341297 1 0 1 1 0 0 +EDGE2 6183 6124 0.922229 -0.021072 0.00164099 1 0 1 1 0 0 +EDGE2 6184 6165 1.00365 -0.0825542 -3.139 1 0 1 1 0 0 +EDGE2 6184 6123 -1.02546 0.0332593 -0.00649577 1 0 1 1 0 0 +EDGE2 6184 6183 -1.01022 -0.0218064 -0.012682 1 0 1 1 0 0 +EDGE2 6184 6124 0.0201005 0.0503656 -0.0199799 1 0 1 1 0 0 +EDGE2 6184 6125 0.917995 -0.0768141 -0.0152659 1 0 1 1 0 0 +EDGE2 6185 6164 1.01294 0.00147328 -3.15032 1 0 1 1 0 0 +EDGE2 6185 6165 -0.0605212 0.0453389 -3.16758 1 0 1 1 0 0 +EDGE2 6185 6126 0.0300455 -1.01118 -1.56954 1 0 1 1 0 0 +EDGE2 6185 6184 -0.937177 0.0298082 0.00702917 1 0 1 1 0 0 +EDGE2 6185 6124 -0.964898 -0.0304186 -0.0369354 1 0 1 1 0 0 +EDGE2 6185 6166 -0.016422 1.05053 1.52929 1 0 1 1 0 0 +EDGE2 6185 6125 -0.00121418 0.018043 -0.000118106 1 0 1 1 0 0 +EDGE2 6186 6165 -1.01459 0.00141535 1.57387 1 0 1 1 0 0 +EDGE2 6186 6166 0.0146486 0.115654 0.00138722 1 0 1 1 0 0 +EDGE2 6186 6125 -0.977337 0.00257589 -1.56619 1 0 1 1 0 0 +EDGE2 6186 6185 -1.0375 0.0135302 -1.55961 1 0 1 1 0 0 +EDGE2 6186 6167 1.01706 0.0179087 -0.0163799 1 0 1 1 0 0 +EDGE2 6187 6186 -0.971886 -0.0809317 -0.00965317 1 0 1 1 0 0 +EDGE2 6187 6166 -0.961171 0.0425011 -0.000735816 1 0 1 1 0 0 +EDGE2 6187 6168 0.973459 -0.000372805 -0.00277227 1 0 1 1 0 0 +EDGE2 6187 6167 0.0622032 0.104659 -0.0101247 1 0 1 1 0 0 +EDGE2 6188 6168 0.0597816 -0.0240808 0.0100342 1 0 1 1 0 0 +EDGE2 6188 6167 -1.01845 -0.00767467 -0.0290479 1 0 1 1 0 0 +EDGE2 6188 6187 -1.0054 -0.0410092 0.00449458 1 0 1 1 0 0 +EDGE2 6188 6169 0.998202 0.0275601 0.00825093 1 0 1 1 0 0 +EDGE2 6189 6168 -0.961796 0.0636095 0.016224 1 0 1 1 0 0 +EDGE2 6189 6188 -0.989841 0.0310443 -0.0272748 1 0 1 1 0 0 +EDGE2 6189 6169 0.0948806 -0.00554573 0.0113788 1 0 1 1 0 0 +EDGE2 6189 6110 0.93566 0.0298991 -3.13476 1 0 1 1 0 0 +EDGE2 6189 6170 0.967748 -0.0561021 0.0245463 1 0 1 1 0 0 +EDGE2 6190 6171 -0.000633302 0.980695 1.59361 1 0 1 1 0 0 +EDGE2 6190 6111 0.023559 0.996796 1.57359 1 0 1 1 0 0 +EDGE2 6190 6189 -1.01476 0.079965 0.0291836 1 0 1 1 0 0 +EDGE2 6190 6169 -0.922281 0.0209404 0.0129574 1 0 1 1 0 0 +EDGE2 6190 6110 0.0808817 -0.0970922 -3.12898 1 0 1 1 0 0 +EDGE2 6190 6170 0.0414082 0.0194576 -0.0242952 1 0 1 1 0 0 +EDGE2 6190 6109 0.944018 0.0872692 -3.15323 1 0 1 1 0 0 +EDGE2 6191 6110 -0.933542 0.00892502 -1.59444 1 0 1 1 0 0 +EDGE2 6191 6170 -1.00278 0.0588058 1.56695 1 0 1 1 0 0 +EDGE2 6191 6190 -1.02535 -0.0254158 1.58433 1 0 1 1 0 0 +EDGE2 6192 6191 -1.07595 -0.0298484 0.00417473 1 0 1 1 0 0 +EDGE2 6193 6192 -0.937328 -0.0900846 -0.00836023 1 0 1 1 0 0 +EDGE2 6194 6193 -0.978693 0.0129568 0.000588455 1 0 1 1 0 0 +EDGE2 6195 6194 -0.979422 -0.0239727 -0.0187786 1 0 1 1 0 0 +EDGE2 6196 6195 -0.99269 -0.0239908 -1.57271 1 0 1 1 0 0 +EDGE2 6197 6196 -0.967475 -0.0606199 0.0443389 1 0 1 1 0 0 +EDGE2 6198 6197 -1.03373 -0.0893864 -0.0367374 1 0 1 1 0 0 +EDGE2 6199 6198 -0.934249 -0.000883864 0.0186489 1 0 1 1 0 0 +EDGE2 6199 6100 0.982205 -0.00352719 -3.16819 1 0 1 1 0 0 +EDGE2 6199 6040 0.974381 0.055914 -3.17695 1 0 1 1 0 0 +EDGE2 6199 6060 1.03804 0.0785718 -3.13716 1 0 1 1 0 0 +EDGE2 6199 6080 1.0322 0.0808311 -3.14286 1 0 1 1 0 0 +EDGE2 6200 6101 0.037299 1.00504 1.56284 1 0 1 1 0 0 +EDGE2 6200 6199 -0.964773 -0.0749993 -0.00065186 1 0 1 1 0 0 +EDGE2 6200 6100 -0.0577838 -0.0487758 -3.11529 1 0 1 1 0 0 +EDGE2 6200 6040 -0.01246 0.00670523 -3.1658 1 0 1 1 0 0 +EDGE2 6200 6060 -0.0770823 0.026022 -3.1548 1 0 1 1 0 0 +EDGE2 6200 6080 0.0179863 -0.0314635 -3.12894 1 0 1 1 0 0 +EDGE2 6200 6061 0.0285617 -1.0001 -1.60426 1 0 1 1 0 0 +EDGE2 6200 6081 -0.01305 -1.02372 -1.57701 1 0 1 1 0 0 +EDGE2 6200 6041 -0.0415316 -0.914744 -1.57499 1 0 1 1 0 0 +EDGE2 6200 6059 0.909182 -0.0173883 -3.17436 1 0 1 1 0 0 +EDGE2 6200 6099 0.976473 -0.00762862 -3.15927 1 0 1 1 0 0 +EDGE2 6200 6079 1.12718 -0.0173286 -3.12703 1 0 1 1 0 0 +EDGE2 6200 6039 1.00073 0.0263315 -3.12905 1 0 1 1 0 0 +EDGE2 6201 6101 0.0326769 -0.039181 -0.0119724 1 0 1 1 0 0 +EDGE2 6201 6102 1.01091 -0.0719406 0.0118128 1 0 1 1 0 0 +EDGE2 6201 6100 -0.99325 -0.045991 1.58127 1 0 1 1 0 0 +EDGE2 6201 6200 -1.06882 -0.0217752 -1.57264 1 0 1 1 0 0 +EDGE2 6201 6040 -0.917356 0.0697803 1.62017 1 0 1 1 0 0 +EDGE2 6201 6060 -1.04183 -0.00440726 1.5566 1 0 1 1 0 0 +EDGE2 6201 6080 -1.00069 0.00906576 1.55619 1 0 1 1 0 0 +EDGE2 6202 6101 -1.02153 -0.0394022 0.00482676 1 0 1 1 0 0 +EDGE2 6202 6103 1.02648 0.0514915 0.0277317 1 0 1 1 0 0 +EDGE2 6202 6102 0.0290444 -0.0176008 -0.00398096 1 0 1 1 0 0 +EDGE2 6202 6201 -0.973668 -0.0571996 0.0288059 1 0 1 1 0 0 +EDGE2 6203 6103 -0.0314172 -0.0667286 -0.0236768 1 0 1 1 0 0 +EDGE2 6203 6104 0.950227 0.020219 -0.0218957 1 0 1 1 0 0 +EDGE2 6203 6102 -0.933695 0.0692437 0.00966029 1 0 1 1 0 0 +EDGE2 6203 6202 -1.12335 -0.0360624 0.0254423 1 0 1 1 0 0 +EDGE2 6204 6103 -1.04633 -0.0401443 -0.0140095 1 0 1 1 0 0 +EDGE2 6204 6104 -0.0821997 -0.051911 -0.0005232 1 0 1 1 0 0 +EDGE2 6204 6105 1.03034 0.0347965 0.0374837 1 0 1 1 0 0 +EDGE2 6204 6203 -0.944371 0.0427055 0.0153436 1 0 1 1 0 0 +EDGE2 6205 6106 -0.0557257 1.10198 1.59194 1 0 1 1 0 0 +EDGE2 6205 6104 -1.01806 0.0169617 0.0227611 1 0 1 1 0 0 +EDGE2 6205 6204 -1.03894 -0.0324173 0.0169962 1 0 1 1 0 0 +EDGE2 6205 6105 0.0363219 -0.0815139 -0.0134112 1 0 1 1 0 0 +EDGE2 6206 6205 -0.952472 0.0402918 -1.5673 1 0 1 1 0 0 +EDGE2 6206 6107 1.05396 0.0229934 -0.015865 1 0 1 1 0 0 +EDGE2 6206 6106 0.00421138 -0.00242885 0.0267538 1 0 1 1 0 0 +EDGE2 6206 6105 -0.99474 0.00269883 -1.56371 1 0 1 1 0 0 +EDGE2 6207 6108 1.03277 0.00486978 -0.0142056 1 0 1 1 0 0 +EDGE2 6207 6206 -1.06359 -0.017715 0.0455382 1 0 1 1 0 0 +EDGE2 6207 6107 -0.063892 -0.0409558 -0.0117914 1 0 1 1 0 0 +EDGE2 6207 6106 -0.976603 0.0636209 -0.0255568 1 0 1 1 0 0 +EDGE2 6208 6109 1.06251 -0.0518057 -0.039045 1 0 1 1 0 0 +EDGE2 6208 6108 -0.0153589 0.0949047 0.0230987 1 0 1 1 0 0 +EDGE2 6208 6107 -0.997989 -0.0513212 -0.0617254 1 0 1 1 0 0 +EDGE2 6208 6207 -1.02419 -0.0092146 -0.00799243 1 0 1 1 0 0 +EDGE2 6209 6110 0.980836 0.0806217 0.0044673 1 0 1 1 0 0 +EDGE2 6209 6170 0.983903 -0.0211396 -3.17651 1 0 1 1 0 0 +EDGE2 6209 6190 1.03319 0.0291203 -3.12385 1 0 1 1 0 0 +EDGE2 6209 6208 -0.96258 -0.0633907 -0.0121265 1 0 1 1 0 0 +EDGE2 6209 6109 0.0251187 0.0911347 0.0430249 1 0 1 1 0 0 +EDGE2 6209 6108 -1.00875 0.0498987 -0.0317428 1 0 1 1 0 0 +EDGE2 6210 6171 -0.00784066 -1.05781 -1.57861 1 0 1 1 0 0 +EDGE2 6210 6111 0.0526306 -1.10686 -1.59468 1 0 1 1 0 0 +EDGE2 6210 6189 0.979812 -0.0815198 -3.16207 1 0 1 1 0 0 +EDGE2 6210 6169 0.939657 0.0215649 -3.13192 1 0 1 1 0 0 +EDGE2 6210 6191 0.0696736 1.02407 1.6252 1 0 1 1 0 0 +EDGE2 6210 6110 0.0386162 0.0103303 -0.0294633 1 0 1 1 0 0 +EDGE2 6210 6170 0.21126 0.0140955 -3.15094 1 0 1 1 0 0 +EDGE2 6210 6190 -0.0728349 -0.0175499 -3.16868 1 0 1 1 0 0 +EDGE2 6210 6109 -1.07962 0.0561627 -0.0107038 1 0 1 1 0 0 +EDGE2 6210 6209 -1.06128 -0.026513 0.0260526 1 0 1 1 0 0 +EDGE2 6211 6210 -1.04237 0.0170623 -1.57916 1 0 1 1 0 0 +EDGE2 6211 6191 0.0549138 0.00335126 0.0181144 1 0 1 1 0 0 +EDGE2 6211 6110 -1.0203 -0.024057 -1.54855 1 0 1 1 0 0 +EDGE2 6211 6170 -1.01847 -0.00332644 1.56065 1 0 1 1 0 0 +EDGE2 6211 6190 -0.997839 -0.037784 1.52193 1 0 1 1 0 0 +EDGE2 6211 6192 0.996818 -0.00362102 -0.00401554 1 0 1 1 0 0 +EDGE2 6212 6191 -1.01304 -0.0356651 -0.0194962 1 0 1 1 0 0 +EDGE2 6212 6211 -0.943287 -0.0248588 -0.0130873 1 0 1 1 0 0 +EDGE2 6212 6193 1.01898 -0.0346589 -0.0150771 1 0 1 1 0 0 +EDGE2 6212 6192 -0.00726733 -0.0219356 0.01429 1 0 1 1 0 0 +EDGE2 6213 6212 -1.01789 0.0953381 -0.0175412 1 0 1 1 0 0 +EDGE2 6213 6194 1.07132 0.0315214 0.0401494 1 0 1 1 0 0 +EDGE2 6213 6193 -0.0626215 0.0169076 -0.0261985 1 0 1 1 0 0 +EDGE2 6213 6192 -0.938897 -0.0116123 0.0106293 1 0 1 1 0 0 +EDGE2 6214 6194 0.0025095 -0.0400978 0.00609916 1 0 1 1 0 0 +EDGE2 6214 6193 -0.890145 0.0252399 0.000575583 1 0 1 1 0 0 +EDGE2 6214 6213 -0.995425 -0.040121 0.00152447 1 0 1 1 0 0 +EDGE2 6214 6195 0.99882 -0.0258089 -0.0180827 1 0 1 1 0 0 +EDGE2 6215 6194 -0.968556 0.0690645 0.0161865 1 0 1 1 0 0 +EDGE2 6215 6214 -1.01777 0.0485091 0.00160633 1 0 1 1 0 0 +EDGE2 6215 6195 -0.00675926 0.015223 -0.0209067 1 0 1 1 0 0 +EDGE2 6215 6196 -0.0365533 0.924497 1.56591 1 0 1 1 0 0 +EDGE2 6216 6195 -0.986175 0.105508 -1.59923 1 0 1 1 0 0 +EDGE2 6216 6215 -1.00294 0.0678136 -1.57729 1 0 1 1 0 0 +EDGE2 6216 6196 0.0447927 0.0330222 -0.00487303 1 0 1 1 0 0 +EDGE2 6216 6197 0.922805 0.0094203 -0.00436457 1 0 1 1 0 0 +EDGE2 6217 6216 -0.995306 0.0118677 -0.00242594 1 0 1 1 0 0 +EDGE2 6217 6196 -1.04185 -0.0290737 0.014528 1 0 1 1 0 0 +EDGE2 6217 6198 1.08773 0.0218525 -0.00732841 1 0 1 1 0 0 +EDGE2 6217 6197 -0.0250505 0.00682697 0.00655949 1 0 1 1 0 0 +EDGE2 6218 6217 -1.00183 0.0319832 0.0211874 1 0 1 1 0 0 +EDGE2 6218 6199 1.03389 -0.0468678 0.0026732 1 0 1 1 0 0 +EDGE2 6218 6198 0.105082 0.0168096 -0.00559742 1 0 1 1 0 0 +EDGE2 6218 6197 -1.02351 -0.0520769 0.0192332 1 0 1 1 0 0 +EDGE2 6219 6199 -0.0112595 -0.110455 0.00632685 1 0 1 1 0 0 +EDGE2 6219 6198 -1.06434 -0.0795377 -0.0034506 1 0 1 1 0 0 +EDGE2 6219 6218 -1.02829 -0.0106666 -0.0305359 1 0 1 1 0 0 +EDGE2 6219 6100 1.03491 0.0523744 -3.13919 1 0 1 1 0 0 +EDGE2 6219 6200 0.95295 -0.110512 0.000240663 1 0 1 1 0 0 +EDGE2 6219 6040 0.964688 0.00624154 -3.16757 1 0 1 1 0 0 +EDGE2 6219 6060 1.04686 0.0617379 -3.15059 1 0 1 1 0 0 +EDGE2 6219 6080 1.06072 -0.0843008 -3.14731 1 0 1 1 0 0 +EDGE2 6220 6101 -0.0566141 0.994518 1.56558 1 0 1 1 0 0 +EDGE2 6220 6199 -1.00904 -0.0274706 -0.0147681 1 0 1 1 0 0 +EDGE2 6220 6219 -0.865207 -0.046897 0.00158454 1 0 1 1 0 0 +EDGE2 6220 6201 -0.0208405 0.939219 1.58585 1 0 1 1 0 0 +EDGE2 6220 6100 -0.0579951 -0.0563445 -3.11983 1 0 1 1 0 0 +EDGE2 6220 6200 -0.0338181 0.0168928 -0.0283523 1 0 1 1 0 0 +EDGE2 6220 6040 0.024028 0.0863803 -3.11739 1 0 1 1 0 0 +EDGE2 6220 6060 -0.02685 -0.0215939 -3.10709 1 0 1 1 0 0 +EDGE2 6220 6080 -0.0770883 0.0258872 -3.12397 1 0 1 1 0 0 +EDGE2 6220 6061 -0.0383476 -0.972828 -1.56841 1 0 1 1 0 0 +EDGE2 6220 6081 -0.0218816 -1.00197 -1.58774 1 0 1 1 0 0 +EDGE2 6220 6041 -0.0462061 -0.979752 -1.55015 1 0 1 1 0 0 +EDGE2 6220 6059 1.01956 0.0108953 -3.11474 1 0 1 1 0 0 +EDGE2 6220 6099 1.0465 0.0455675 -3.13216 1 0 1 1 0 0 +EDGE2 6220 6079 1.05776 -0.00319503 -3.16023 1 0 1 1 0 0 +EDGE2 6220 6039 0.945544 -0.0560004 -3.13738 1 0 1 1 0 0 +EDGE2 6221 6042 1.08057 -0.0391484 0.0204339 1 0 1 1 0 0 +EDGE2 6221 6100 -1.07002 -0.0175468 -1.61319 1 0 1 1 0 0 +EDGE2 6221 6220 -0.965819 -0.067993 1.5711 1 0 1 1 0 0 +EDGE2 6221 6200 -1.02957 0.0477071 1.57723 1 0 1 1 0 0 +EDGE2 6221 6040 -1.05116 -0.00948686 -1.58688 1 0 1 1 0 0 +EDGE2 6221 6060 -0.921798 -0.0049103 -1.59718 1 0 1 1 0 0 +EDGE2 6221 6080 -1.0667 -0.022388 -1.57702 1 0 1 1 0 0 +EDGE2 6221 6061 0.000346459 0.0411503 -0.0275183 1 0 1 1 0 0 +EDGE2 6221 6081 -0.0393105 -0.0384981 -0.0217857 1 0 1 1 0 0 +EDGE2 6221 6041 0.00144723 0.113413 -0.018101 1 0 1 1 0 0 +EDGE2 6221 6082 0.974991 0.0605798 0.0126967 1 0 1 1 0 0 +EDGE2 6221 6062 1.0519 -0.0179476 0.0302048 1 0 1 1 0 0 +EDGE2 6222 6042 0.0956844 -0.0154263 -0.00783909 1 0 1 1 0 0 +EDGE2 6222 6061 -0.971589 -0.00302629 -0.0301331 1 0 1 1 0 0 +EDGE2 6222 6081 -1.02342 -0.0766583 -0.00785621 1 0 1 1 0 0 +EDGE2 6222 6221 -0.99773 0.0269869 0.014715 1 0 1 1 0 0 +EDGE2 6222 6041 -1.01438 -0.000141616 0.00840146 1 0 1 1 0 0 +EDGE2 6222 6082 0.022275 -0.0151911 0.0246113 1 0 1 1 0 0 +EDGE2 6222 6062 0.0462349 -0.0667328 0.0106281 1 0 1 1 0 0 +EDGE2 6222 6063 0.959883 0.0474348 0.00792127 1 0 1 1 0 0 +EDGE2 6222 6083 1.01113 0.00850908 0.0122022 1 0 1 1 0 0 +EDGE2 6222 6043 1.03115 -0.0251827 0.0269509 1 0 1 1 0 0 +EDGE2 6223 6042 -1.02285 0.000628363 0.0241007 1 0 1 1 0 0 +EDGE2 6223 6082 -0.945484 -0.064469 -0.0567977 1 0 1 1 0 0 +EDGE2 6223 6222 -0.894625 0.00607945 -0.0029133 1 0 1 1 0 0 +EDGE2 6223 6062 -1.04831 0.0489522 0.00275992 1 0 1 1 0 0 +EDGE2 6223 6063 -0.0391868 -0.0827908 0.0216477 1 0 1 1 0 0 +EDGE2 6223 6083 -0.117944 0.010834 0.00238227 1 0 1 1 0 0 +EDGE2 6223 6043 0.0178115 -0.0616608 -0.0144903 1 0 1 1 0 0 +EDGE2 6223 6044 0.991222 0.0850658 -0.0160164 1 0 1 1 0 0 +EDGE2 6223 6084 1.04005 -0.00130232 -0.0235719 1 0 1 1 0 0 +EDGE2 6223 6064 0.953288 -0.0458351 0.0185018 1 0 1 1 0 0 +EDGE2 6224 6063 -0.995316 -0.0149178 -0.00974126 1 0 1 1 0 0 +EDGE2 6224 6223 -0.962469 0.0742843 0.0173695 1 0 1 1 0 0 +EDGE2 6224 6083 -0.98349 0.0515163 0.00909838 1 0 1 1 0 0 +EDGE2 6224 6043 -0.967715 0.0186814 0.00928663 1 0 1 1 0 0 +EDGE2 6224 6044 0.0688102 0.0254051 0.0208242 1 0 1 1 0 0 +EDGE2 6224 6084 -0.120617 0.0424107 0.019043 1 0 1 1 0 0 +EDGE2 6224 6064 0.047991 0.0568883 0.0067696 1 0 1 1 0 0 +EDGE2 6224 6045 0.932666 0.0581883 -0.0107597 1 0 1 1 0 0 +EDGE2 6224 6065 0.886421 -0.0436244 0.0134942 1 0 1 1 0 0 +EDGE2 6224 6085 1.00057 0.0216818 0.0214421 1 0 1 1 0 0 +EDGE2 6224 605 0.983593 -0.0404858 -3.08524 1 0 1 1 0 0 +EDGE2 6225 6044 -1.0494 0.00728612 0.00788883 1 0 1 1 0 0 +EDGE2 6225 6084 -1.03068 0.0194942 0.00963648 1 0 1 1 0 0 +EDGE2 6225 6224 -0.999209 -0.0221621 -0.0110171 1 0 1 1 0 0 +EDGE2 6225 6064 -0.985447 -0.0153921 -0.00442938 1 0 1 1 0 0 +EDGE2 6225 6045 -0.0797693 0.041111 0.00841737 1 0 1 1 0 0 +EDGE2 6225 6065 -0.00972784 -0.0525969 -0.00387183 1 0 1 1 0 0 +EDGE2 6225 6085 -0.0484169 0.0240169 0.0191462 1 0 1 1 0 0 +EDGE2 6225 605 0.0656334 0.00351231 -3.13499 1 0 1 1 0 0 +EDGE2 6225 604 0.922909 0.01326 -3.15821 1 0 1 1 0 0 +EDGE2 6225 6046 -0.0489669 0.935638 1.58266 1 0 1 1 0 0 +EDGE2 6225 6086 0.0694971 1.05475 1.59627 1 0 1 1 0 0 +EDGE2 6225 6066 -0.0403748 0.952013 1.56592 1 0 1 1 0 0 +EDGE2 6225 606 0.089272 0.947151 1.56921 1 0 1 1 0 0 +EDGE2 6226 6225 -1.08139 0.0187736 1.55941 1 0 1 1 0 0 +EDGE2 6226 6045 -0.955669 -0.0125807 1.53815 1 0 1 1 0 0 +EDGE2 6226 6065 -0.947317 -0.0171626 1.57724 1 0 1 1 0 0 +EDGE2 6226 6085 -0.987377 0.0835871 1.57826 1 0 1 1 0 0 +EDGE2 6226 605 -1.05639 0.00513714 -1.56695 1 0 1 1 0 0 +EDGE2 6227 6226 -1.0469 0.109377 0.0043111 1 0 1 1 0 0 +EDGE2 6228 6227 -0.993942 -0.0611426 0.00358397 1 0 1 1 0 0 +EDGE2 6229 590 1.00636 0.0241651 -3.13333 1 0 1 1 0 0 +EDGE2 6229 6228 -1.03694 0.0287679 -0.0153228 1 0 1 1 0 0 +EDGE2 6230 591 0.0555754 1.11797 1.58689 1 0 1 1 0 0 +EDGE2 6230 589 1.05081 0.0253556 -3.15608 1 0 1 1 0 0 +EDGE2 6230 590 0.0134008 -0.00804338 -3.16402 1 0 1 1 0 0 +EDGE2 6230 6229 -1.04922 -0.0450497 -0.0452297 1 0 1 1 0 0 +EDGE2 6231 592 1.03719 -0.0244763 -0.0308976 1 0 1 1 0 0 +EDGE2 6231 591 0.0511238 0.048886 -0.0105647 1 0 1 1 0 0 +EDGE2 6231 6230 -1.00313 -0.00347454 -1.55503 1 0 1 1 0 0 +EDGE2 6231 590 -1.00663 0.0935535 1.54637 1 0 1 1 0 0 +EDGE2 6232 592 0.0283317 0.0929326 -0.0202556 1 0 1 1 0 0 +EDGE2 6232 591 -1.02866 -0.0467519 -0.0171792 1 0 1 1 0 0 +EDGE2 6232 6231 -0.921382 0.0293341 -0.00319812 1 0 1 1 0 0 +EDGE2 6232 593 0.998007 0.082976 -0.0254211 1 0 1 1 0 0 +EDGE2 6233 592 -1.03581 -0.0197379 -0.0111766 1 0 1 1 0 0 +EDGE2 6233 6232 -0.99172 0.0110569 -0.0512668 1 0 1 1 0 0 +EDGE2 6233 594 1.03922 -0.071482 -0.0173025 1 0 1 1 0 0 +EDGE2 6233 593 0.0558602 -0.115097 0.0148655 1 0 1 1 0 0 +EDGE2 6234 6233 -1.007 -0.0539349 -0.00542879 1 0 1 1 0 0 +EDGE2 6234 594 0.00249005 0.0610418 -0.0137046 1 0 1 1 0 0 +EDGE2 6234 593 -0.959203 -0.0440049 0.000968433 1 0 1 1 0 0 +EDGE2 6234 595 0.986432 -0.0134915 -0.0105058 1 0 1 1 0 0 +EDGE2 6235 6234 -1.01502 -0.0101789 0.0292689 1 0 1 1 0 0 +EDGE2 6235 594 -1.06642 -0.0943392 -0.0299719 1 0 1 1 0 0 +EDGE2 6235 596 -0.0345781 1.06491 1.57103 1 0 1 1 0 0 +EDGE2 6235 595 0.0632805 0.0026977 -0.00495763 1 0 1 1 0 0 +EDGE2 6236 596 0.00978972 0.00806133 0.00999008 1 0 1 1 0 0 +EDGE2 6236 6235 -1.04627 0.0515057 -1.56904 1 0 1 1 0 0 +EDGE2 6236 595 -0.983513 -0.0827586 -1.58687 1 0 1 1 0 0 +EDGE2 6236 597 0.941506 -0.00720226 -0.00914487 1 0 1 1 0 0 +EDGE2 6237 596 -1.07669 -0.0389218 0.0321975 1 0 1 1 0 0 +EDGE2 6237 6236 -0.959771 -0.0270806 -0.00956929 1 0 1 1 0 0 +EDGE2 6237 597 -0.0251403 -0.112852 0.00653611 1 0 1 1 0 0 +EDGE2 6237 598 1.00086 -0.0941613 0.0103658 1 0 1 1 0 0 +EDGE2 6238 597 -0.963574 -0.0227788 -0.00686549 1 0 1 1 0 0 +EDGE2 6238 6237 -1.0568 0.0231651 0.0262274 1 0 1 1 0 0 +EDGE2 6238 598 0.0201669 -0.0114183 -0.0305886 1 0 1 1 0 0 +EDGE2 6238 599 1.09583 0.0324888 -0.0142916 1 0 1 1 0 0 +EDGE2 6239 598 -0.981718 0.0295659 0.0129181 1 0 1 1 0 0 +EDGE2 6239 6238 -1.00393 -0.019572 0.00304074 1 0 1 1 0 0 +EDGE2 6239 599 -0.0010418 0.00940618 -0.00730192 1 0 1 1 0 0 +EDGE2 6239 600 1.00716 0.0513031 0.00490922 1 0 1 1 0 0 +EDGE2 6240 6239 -1.02701 -0.0524586 -0.00544816 1 0 1 1 0 0 +EDGE2 6240 599 -0.984287 -0.0236354 -0.0187628 1 0 1 1 0 0 +EDGE2 6240 601 0.0664238 1.01677 1.55754 1 0 1 1 0 0 +EDGE2 6240 600 0.0498242 0.127715 0.0249832 1 0 1 1 0 0 +EDGE2 6241 602 0.965272 0.0381796 0.00847282 1 0 1 1 0 0 +EDGE2 6241 6240 -0.923261 0.0569678 -1.60322 1 0 1 1 0 0 +EDGE2 6241 601 -0.0565576 0.056236 0.0158298 1 0 1 1 0 0 +EDGE2 6241 600 -1.06705 -0.0857578 -1.58733 1 0 1 1 0 0 +EDGE2 6242 603 1.01308 -0.0522187 -0.04847 1 0 1 1 0 0 +EDGE2 6242 602 -0.031208 -0.0554959 -0.00460335 1 0 1 1 0 0 +EDGE2 6242 601 -0.992787 -0.0231537 -0.000818596 1 0 1 1 0 0 +EDGE2 6242 6241 -1.13564 -0.0384694 -0.00632898 1 0 1 1 0 0 +EDGE2 6243 603 0.0103267 -0.0529923 -0.0410864 1 0 1 1 0 0 +EDGE2 6243 604 1.04224 -0.0886016 -0.0150446 1 0 1 1 0 0 +EDGE2 6243 6242 -1.01058 0.00822911 -0.00208968 1 0 1 1 0 0 +EDGE2 6243 602 -0.907415 0.077232 -0.00108472 1 0 1 1 0 0 +EDGE2 6244 6225 1.04771 0.0412686 -3.11217 1 0 1 1 0 0 +EDGE2 6244 6045 0.997077 -0.0298787 -3.13087 1 0 1 1 0 0 +EDGE2 6244 6065 0.950167 -0.0603348 -3.18048 1 0 1 1 0 0 +EDGE2 6244 6085 1.04742 0.0458454 -3.17516 1 0 1 1 0 0 +EDGE2 6244 605 1.05094 0.0773669 -0.0246909 1 0 1 1 0 0 +EDGE2 6244 603 -0.910987 -0.0504683 0.0384856 1 0 1 1 0 0 +EDGE2 6244 604 -0.0148298 -0.026165 0.0284767 1 0 1 1 0 0 +EDGE2 6244 6243 -0.907825 -0.0333182 0.00837803 1 0 1 1 0 0 +EDGE2 6245 6044 1.01012 -0.0453667 -3.12418 1 0 1 1 0 0 +EDGE2 6245 6084 1.0489 0.00910942 -3.13362 1 0 1 1 0 0 +EDGE2 6245 6224 0.975559 -0.023888 -3.153 1 0 1 1 0 0 +EDGE2 6245 6064 1.12943 0.00842328 -3.1399 1 0 1 1 0 0 +EDGE2 6245 6226 -0.00342572 0.909396 1.60415 1 0 1 1 0 0 +EDGE2 6245 6225 -0.00482368 -0.0314227 -3.13197 1 0 1 1 0 0 +EDGE2 6245 6045 -0.026558 0.0361719 -3.11789 1 0 1 1 0 0 +EDGE2 6245 6065 -0.0326399 0.0570883 -3.14327 1 0 1 1 0 0 +EDGE2 6245 6085 0.0483579 -0.0235107 -3.16128 1 0 1 1 0 0 +EDGE2 6245 605 0.0132591 -0.01851 -0.00816476 1 0 1 1 0 0 +EDGE2 6245 604 -0.969878 0.0998294 0.0404261 1 0 1 1 0 0 +EDGE2 6245 6244 -1.02637 0.0182972 -0.0217629 1 0 1 1 0 0 +EDGE2 6245 6046 -0.00789238 -1.02819 -1.56449 1 0 1 1 0 0 +EDGE2 6245 6086 0.00143633 -1.01251 -1.57465 1 0 1 1 0 0 +EDGE2 6245 6066 -0.0185829 -1.05016 -1.57328 1 0 1 1 0 0 +EDGE2 6245 606 0.00195325 -1.03022 -1.57163 1 0 1 1 0 0 +EDGE2 6246 6225 -0.972753 -0.00722641 -1.54723 1 0 1 1 0 0 +EDGE2 6246 6245 -1.00893 -0.0728945 1.57905 1 0 1 1 0 0 +EDGE2 6246 6045 -1.0104 0.066103 -1.59301 1 0 1 1 0 0 +EDGE2 6246 6065 -0.970999 0.072061 -1.59078 1 0 1 1 0 0 +EDGE2 6246 6085 -0.978589 -0.0253497 -1.58378 1 0 1 1 0 0 +EDGE2 6246 605 -0.897362 -0.0293782 1.53677 1 0 1 1 0 0 +EDGE2 6246 607 1.00236 -0.133845 0.00372815 1 0 1 1 0 0 +EDGE2 6246 6067 0.921481 -0.0630922 0.00858028 1 0 1 1 0 0 +EDGE2 6246 6046 0.0307212 0.0251448 0.0105278 1 0 1 1 0 0 +EDGE2 6246 6086 0.014915 0.00805064 0.00951904 1 0 1 1 0 0 +EDGE2 6246 6066 -0.000661023 -0.0353162 -0.026101 1 0 1 1 0 0 +EDGE2 6246 606 -0.0453881 0.0108552 -0.034295 1 0 1 1 0 0 +EDGE2 6246 6087 1.02658 -0.15181 0.0265606 1 0 1 1 0 0 +EDGE2 6246 6047 1.00747 0.0442874 -0.0217869 1 0 1 1 0 0 +EDGE2 6247 607 0.0434579 0.0132598 -0.0108708 1 0 1 1 0 0 +EDGE2 6247 6067 0.0216859 -0.116382 0.0051061 1 0 1 1 0 0 +EDGE2 6247 6046 -1.09342 -0.0722452 0.00235038 1 0 1 1 0 0 +EDGE2 6247 6086 -1.02666 0.0432638 -8.41273e-05 1 0 1 1 0 0 +EDGE2 6247 6246 -0.995602 0.0686913 0.0157043 1 0 1 1 0 0 +EDGE2 6247 6066 -0.928555 0.0107809 -0.0560748 1 0 1 1 0 0 +EDGE2 6247 606 -0.982105 0.0140374 -0.0202586 1 0 1 1 0 0 +EDGE2 6247 6087 -0.0161407 0.00530687 0.0247949 1 0 1 1 0 0 +EDGE2 6247 6047 -0.0261449 0.0206312 0.00978606 1 0 1 1 0 0 +EDGE2 6247 6068 0.939231 -0.0538687 -0.00726838 1 0 1 1 0 0 +EDGE2 6247 6088 1.01127 0.0440064 -0.000265453 1 0 1 1 0 0 +EDGE2 6247 608 0.952118 0.0139652 -0.016495 1 0 1 1 0 0 +EDGE2 6247 6048 0.998613 -0.0719872 -0.00622948 1 0 1 1 0 0 +EDGE2 6248 607 -1.04122 0.0419026 -0.0115517 1 0 1 1 0 0 +EDGE2 6248 6067 -0.990295 0.0817238 -0.00749642 1 0 1 1 0 0 +EDGE2 6248 6247 -1.02055 0.0600378 0.0505705 1 0 1 1 0 0 +EDGE2 6248 6087 -1.06293 -0.0202098 -0.0268368 1 0 1 1 0 0 +EDGE2 6248 6047 -1.01968 -0.0348184 -0.00741286 1 0 1 1 0 0 +EDGE2 6248 6068 -0.0116132 -0.0344407 0.0370165 1 0 1 1 0 0 +EDGE2 6248 6088 -0.0471163 -0.00306532 -0.00320642 1 0 1 1 0 0 +EDGE2 6248 6089 1.06596 -0.0241902 0.0397194 1 0 1 1 0 0 +EDGE2 6248 608 -0.0205709 0.0558187 0.0320803 1 0 1 1 0 0 +EDGE2 6248 6048 -0.062554 -0.00333912 -0.00273477 1 0 1 1 0 0 +EDGE2 6248 6049 1.0193 0.0994073 0.017888 1 0 1 1 0 0 +EDGE2 6248 6069 0.999954 0.017458 0.0020524 1 0 1 1 0 0 +EDGE2 6248 609 0.992101 -0.0486751 -0.0233645 1 0 1 1 0 0 +EDGE2 6249 6068 -1.02282 -0.0377455 0.0282906 1 0 1 1 0 0 +EDGE2 6249 6088 -0.918987 0.000225518 0.00250411 1 0 1 1 0 0 +EDGE2 6249 6248 -0.969139 0.0687997 0.00543561 1 0 1 1 0 0 +EDGE2 6249 6089 -0.0503228 0.0533957 0.00379532 1 0 1 1 0 0 +EDGE2 6249 608 -1.03936 0.0406295 -0.00255512 1 0 1 1 0 0 +EDGE2 6249 6048 -0.994624 -0.046152 0.0266338 1 0 1 1 0 0 +EDGE2 6249 6049 -0.0641997 0.0219476 -0.0683629 1 0 1 1 0 0 +EDGE2 6249 6069 -0.0643704 0.0541384 -0.0298837 1 0 1 1 0 0 +EDGE2 6249 609 0.0859526 -0.0767743 0.0270469 1 0 1 1 0 0 +EDGE2 6249 6050 0.990133 0.0685463 -0.0171076 1 0 1 1 0 0 +EDGE2 6249 6090 0.992144 0.0389136 0.00242822 1 0 1 1 0 0 +EDGE2 6249 6070 0.965504 -0.0473655 -0.0586479 1 0 1 1 0 0 +EDGE2 6249 610 1.09663 -0.0689701 0.0149907 1 0 1 1 0 0 +EDGE2 6249 6030 0.98989 0.00544804 -3.11825 1 0 1 1 0 0 +EDGE2 6250 6051 -0.0436705 1.01688 1.58093 1 0 1 1 0 0 +EDGE2 6250 6071 -0.0742848 0.984057 1.56627 1 0 1 1 0 0 +EDGE2 6250 6091 0.0291348 0.959444 1.56896 1 0 1 1 0 0 +EDGE2 6250 6031 -0.0650965 0.938919 1.55238 1 0 1 1 0 0 +EDGE2 6250 6089 -1.02593 -0.00926699 0.00363573 1 0 1 1 0 0 +EDGE2 6250 6249 -0.955095 -0.0475018 -0.0142899 1 0 1 1 0 0 +EDGE2 6250 6049 -1.02622 -0.056355 0.0100886 1 0 1 1 0 0 +EDGE2 6250 6069 -0.988341 0.0301299 -0.00590292 1 0 1 1 0 0 +EDGE2 6250 609 -0.960745 0.0101075 -0.00321803 1 0 1 1 0 0 +EDGE2 6250 6050 0.00498554 0.0532269 -0.00705723 1 0 1 1 0 0 +EDGE2 6250 6090 -0.109013 0.0762918 0.0187772 1 0 1 1 0 0 +EDGE2 6250 6070 0.0414294 0.0237126 -0.00395431 1 0 1 1 0 0 +EDGE2 6250 610 -0.0268306 -0.0198132 -0.0105509 1 0 1 1 0 0 +EDGE2 6250 6030 -0.0694573 -0.0368711 -3.14994 1 0 1 1 0 0 +EDGE2 6250 6029 1.04613 -0.0243596 -3.15148 1 0 1 1 0 0 +EDGE2 6250 611 -0.0834962 -1.12246 -1.54379 1 0 1 1 0 0 +EDGE2 6251 6032 1.03955 0.039853 -0.0516672 1 0 1 1 0 0 +EDGE2 6251 6072 0.983728 -0.0499638 0.0161308 1 0 1 1 0 0 +EDGE2 6251 6092 1.04743 -0.00138091 -0.0490167 1 0 1 1 0 0 +EDGE2 6251 6052 1.04904 -0.019303 -0.0154973 1 0 1 1 0 0 +EDGE2 6251 6051 -0.0057998 0.0307517 0.0202229 1 0 1 1 0 0 +EDGE2 6251 6071 0.0730884 0.0874675 -0.00559189 1 0 1 1 0 0 +EDGE2 6251 6091 0.0394376 -0.0327509 0.00262722 1 0 1 1 0 0 +EDGE2 6251 6031 -0.0270545 0.0396791 -0.00744132 1 0 1 1 0 0 +EDGE2 6251 6050 -0.985323 -0.0322478 -1.59811 1 0 1 1 0 0 +EDGE2 6251 6090 -1.01321 -0.0234751 -1.57845 1 0 1 1 0 0 +EDGE2 6251 6250 -1.03804 0.0364186 -1.57597 1 0 1 1 0 0 +EDGE2 6251 6070 -0.96578 -0.0392543 -1.54923 1 0 1 1 0 0 +EDGE2 6251 610 -1.05473 0.0136887 -1.53609 1 0 1 1 0 0 +EDGE2 6251 6030 -0.928956 0.0991333 1.55626 1 0 1 1 0 0 +EDGE2 6252 6032 0.00342281 0.00816323 0.016424 1 0 1 1 0 0 +EDGE2 6252 6093 0.911522 -0.0260811 -0.0185266 1 0 1 1 0 0 +EDGE2 6252 6033 1.00285 -0.0162161 -0.0328193 1 0 1 1 0 0 +EDGE2 6252 6053 0.967524 0.0560489 0.00194191 1 0 1 1 0 0 +EDGE2 6252 6073 1.05631 0.036926 0.012668 1 0 1 1 0 0 +EDGE2 6252 6072 -0.0617508 0.0241982 0.0262605 1 0 1 1 0 0 +EDGE2 6252 6092 -0.0170738 0.0243364 -0.0153504 1 0 1 1 0 0 +EDGE2 6252 6052 -0.144613 -0.0238439 0.0153439 1 0 1 1 0 0 +EDGE2 6252 6251 -0.985219 -0.0357205 -0.00781525 1 0 1 1 0 0 +EDGE2 6252 6051 -0.962814 -0.0375178 0.00198672 1 0 1 1 0 0 +EDGE2 6252 6071 -0.971468 -0.0326465 0.0159701 1 0 1 1 0 0 +EDGE2 6252 6091 -1.00487 0.0442355 0.0241485 1 0 1 1 0 0 +EDGE2 6252 6031 -1.03146 -0.0316284 -0.0220728 1 0 1 1 0 0 +EDGE2 6253 6032 -1.00529 -0.0223152 -0.00982191 1 0 1 1 0 0 +EDGE2 6253 6094 0.98868 -0.0622737 -0.000857914 1 0 1 1 0 0 +EDGE2 6253 6093 0.118958 0.0330892 0.00304014 1 0 1 1 0 0 +EDGE2 6253 6034 0.99548 -0.0276639 -0.00564833 1 0 1 1 0 0 +EDGE2 6253 6054 1.05087 -0.0574114 -0.0105387 1 0 1 1 0 0 +EDGE2 6253 6074 0.997145 -0.0464834 0.0162166 1 0 1 1 0 0 +EDGE2 6253 6252 -0.968049 0.00201864 -0.00862206 1 0 1 1 0 0 +EDGE2 6253 6033 0.0431596 -0.11553 -0.0107029 1 0 1 1 0 0 +EDGE2 6253 6053 -0.113293 -0.0846499 -0.0292821 1 0 1 1 0 0 +EDGE2 6253 6073 0.00217098 -0.0219259 0.0288191 1 0 1 1 0 0 +EDGE2 6253 6072 -1.01595 -0.042485 -0.0284898 1 0 1 1 0 0 +EDGE2 6253 6092 -0.979064 0.0268853 -0.0103234 1 0 1 1 0 0 +EDGE2 6253 6052 -0.998762 0.00074109 -0.000744304 1 0 1 1 0 0 +EDGE2 6254 6094 0.110096 -0.0410723 -0.0460156 1 0 1 1 0 0 +EDGE2 6254 6075 1.07722 0.0574459 -0.0270913 1 0 1 1 0 0 +EDGE2 6254 6095 0.963614 -0.0615536 -0.0146986 1 0 1 1 0 0 +EDGE2 6254 6035 1.08393 -0.0334668 0.00226328 1 0 1 1 0 0 +EDGE2 6254 6055 1.08483 -0.149322 -0.0213031 1 0 1 1 0 0 +EDGE2 6254 6093 -1.0397 0.0384312 0.000345321 1 0 1 1 0 0 +EDGE2 6254 6253 -0.925072 -0.0506138 -0.00742753 1 0 1 1 0 0 +EDGE2 6254 6034 -0.0414833 0.0315324 0.0192454 1 0 1 1 0 0 +EDGE2 6254 6054 -0.00506232 0.119007 0.00767514 1 0 1 1 0 0 +EDGE2 6254 6074 -0.0988784 -0.019059 3.99657e-05 1 0 1 1 0 0 +EDGE2 6254 6033 -1.07658 -0.0722046 0.0251079 1 0 1 1 0 0 +EDGE2 6254 6053 -1.10061 0.000621614 0.0186296 1 0 1 1 0 0 +EDGE2 6254 6073 -0.979798 -0.0222115 0.0122165 1 0 1 1 0 0 +EDGE2 6255 6094 -0.988972 0.0545016 -0.0164472 1 0 1 1 0 0 +EDGE2 6255 6056 -0.017846 0.955396 1.59231 1 0 1 1 0 0 +EDGE2 6255 6096 0.0579914 0.946836 1.55683 1 0 1 1 0 0 +EDGE2 6255 6076 -0.0974706 1.03275 1.56248 1 0 1 1 0 0 +EDGE2 6255 6075 -0.052643 0.0538223 -0.0272271 1 0 1 1 0 0 +EDGE2 6255 6036 0.0653142 0.980323 1.55392 1 0 1 1 0 0 +EDGE2 6255 6095 -0.0148848 -0.0514566 -0.0315482 1 0 1 1 0 0 +EDGE2 6255 6035 -0.000724228 0.087116 0.00914471 1 0 1 1 0 0 +EDGE2 6255 6055 0.067365 0.00734781 -0.0147551 1 0 1 1 0 0 +EDGE2 6255 6254 -1.01932 0.0966537 -0.0110795 1 0 1 1 0 0 +EDGE2 6255 6034 -0.960841 0.00997917 0.00244943 1 0 1 1 0 0 +EDGE2 6255 6054 -1.06331 -0.0634903 0.0115513 1 0 1 1 0 0 +EDGE2 6255 6074 -1.00991 -0.032275 0.0100117 1 0 1 1 0 0 +EDGE2 6256 6056 -0.0596316 0.0137706 0.0129512 1 0 1 1 0 0 +EDGE2 6256 6037 0.976075 0.00574792 0.0163623 1 0 1 1 0 0 +EDGE2 6256 6077 0.969437 0.00115132 0.0275231 1 0 1 1 0 0 +EDGE2 6256 6097 0.918441 -0.0049582 -0.0556154 1 0 1 1 0 0 +EDGE2 6256 6057 1.01182 -0.034437 0.012544 1 0 1 1 0 0 +EDGE2 6256 6096 -0.0178318 -0.0123371 -0.00090678 1 0 1 1 0 0 +EDGE2 6256 6076 0.0314499 -0.00380904 0.00105947 1 0 1 1 0 0 +EDGE2 6256 6075 -0.95583 0.0824017 -1.57115 1 0 1 1 0 0 +EDGE2 6256 6255 -1.05722 -0.0176987 -1.56291 1 0 1 1 0 0 +EDGE2 6256 6036 -0.024234 -0.00442869 -0.0132573 1 0 1 1 0 0 +EDGE2 6256 6095 -0.923783 0.00618691 -1.5756 1 0 1 1 0 0 +EDGE2 6256 6035 -1.022 0.0115221 -1.54869 1 0 1 1 0 0 +EDGE2 6256 6055 -1.02501 -0.0316123 -1.56283 1 0 1 1 0 0 +EDGE2 6257 6078 1.00866 -0.0196297 0.0279008 1 0 1 1 0 0 +EDGE2 6257 6098 1.03076 -0.0707869 -0.0293693 1 0 1 1 0 0 +EDGE2 6257 6058 0.948749 0.0106732 0.0116262 1 0 1 1 0 0 +EDGE2 6257 6038 1.0056 0.0867314 0.0244206 1 0 1 1 0 0 +EDGE2 6257 6056 -0.969788 -0.0313979 -0.0313514 1 0 1 1 0 0 +EDGE2 6257 6037 0.0103468 0.0542243 0.0171475 1 0 1 1 0 0 +EDGE2 6257 6077 0.0536456 0.0167784 -0.00660292 1 0 1 1 0 0 +EDGE2 6257 6097 0.0232664 -0.0291299 -0.00683202 1 0 1 1 0 0 +EDGE2 6257 6057 -0.0167935 -0.0223354 -0.043761 1 0 1 1 0 0 +EDGE2 6257 6096 -0.999004 0.0347025 0.0265586 1 0 1 1 0 0 +EDGE2 6257 6256 -0.957946 0.000217279 0.0430583 1 0 1 1 0 0 +EDGE2 6257 6076 -0.974291 -0.0826105 -0.031459 1 0 1 1 0 0 +EDGE2 6257 6036 -0.979083 0.0154515 -0.00464521 1 0 1 1 0 0 +EDGE2 6258 6078 0.0143571 -0.107511 -0.0041719 1 0 1 1 0 0 +EDGE2 6258 6059 1.00665 -0.0669278 0.0135607 1 0 1 1 0 0 +EDGE2 6258 6099 0.965243 0.0706964 -0.0104176 1 0 1 1 0 0 +EDGE2 6258 6079 1.02491 -0.0691412 0.0105193 1 0 1 1 0 0 +EDGE2 6258 6039 1.0069 -0.121925 -0.00847591 1 0 1 1 0 0 +EDGE2 6258 6098 0.0205319 0.0451277 0.0224418 1 0 1 1 0 0 +EDGE2 6258 6058 -0.00136851 -0.0586862 0.0112424 1 0 1 1 0 0 +EDGE2 6258 6038 -0.0125488 -0.0238137 0.023515 1 0 1 1 0 0 +EDGE2 6258 6037 -1.01631 0.0203513 -0.0214411 1 0 1 1 0 0 +EDGE2 6258 6077 -0.919809 -0.104118 -0.00348778 1 0 1 1 0 0 +EDGE2 6258 6097 -0.997956 -0.00458987 0.00795065 1 0 1 1 0 0 +EDGE2 6258 6257 -1.01343 0.047063 -0.0091698 1 0 1 1 0 0 +EDGE2 6258 6057 -0.974132 -0.0851534 -0.0109082 1 0 1 1 0 0 +EDGE2 6259 6100 1.01736 0.0228302 -0.00599129 1 0 1 1 0 0 +EDGE2 6259 6220 0.975885 -0.00846837 -3.13974 1 0 1 1 0 0 +EDGE2 6259 6200 0.921656 0.0461793 -3.14948 1 0 1 1 0 0 +EDGE2 6259 6040 0.939833 -0.107133 -0.0176477 1 0 1 1 0 0 +EDGE2 6259 6060 1.03947 0.00696968 0.0295293 1 0 1 1 0 0 +EDGE2 6259 6080 1.01451 0.0550957 0.0043441 1 0 1 1 0 0 +EDGE2 6259 6078 -1.05817 0.0922491 -0.00572673 1 0 1 1 0 0 +EDGE2 6259 6059 0.0750517 -0.0620276 0.0110856 1 0 1 1 0 0 +EDGE2 6259 6099 -0.00645337 -0.00570162 0.0145456 1 0 1 1 0 0 +EDGE2 6259 6079 -0.100751 0.0456191 -0.0130919 1 0 1 1 0 0 +EDGE2 6259 6258 -1.01416 0.0747243 0.00150624 1 0 1 1 0 0 +EDGE2 6259 6039 -0.00276922 0.0342547 0.0171942 1 0 1 1 0 0 +EDGE2 6259 6098 -1.14261 -0.000102453 -0.00982534 1 0 1 1 0 0 +EDGE2 6259 6058 -0.992209 -0.0396971 -0.04285 1 0 1 1 0 0 +EDGE2 6259 6038 -0.957325 0.0607781 -0.0127837 1 0 1 1 0 0 +EDGE2 6260 6101 0.035579 -0.9709 -1.56159 1 0 1 1 0 0 +EDGE2 6260 6199 0.941025 0.0506865 -3.16379 1 0 1 1 0 0 +EDGE2 6260 6219 0.998387 0.0382229 -3.12359 1 0 1 1 0 0 +EDGE2 6260 6201 -0.00325245 -1.09439 -1.59646 1 0 1 1 0 0 +EDGE2 6260 6100 0.0637004 0.0153441 -0.0076326 1 0 1 1 0 0 +EDGE2 6260 6220 -0.0498165 0.0098357 -3.19301 1 0 1 1 0 0 +EDGE2 6260 6200 0.0570681 -0.00544024 -3.12418 1 0 1 1 0 0 +EDGE2 6260 6040 0.101244 -0.0213107 -0.0196401 1 0 1 1 0 0 +EDGE2 6260 6060 -0.0446767 -0.0750612 0.0144261 1 0 1 1 0 0 +EDGE2 6260 6080 0.0376557 -0.00143208 0.0189609 1 0 1 1 0 0 +EDGE2 6260 6061 0.051291 0.986751 1.56087 1 0 1 1 0 0 +EDGE2 6260 6081 -0.0721946 1.02895 1.54256 1 0 1 1 0 0 +EDGE2 6260 6221 0.0167215 0.926982 1.5775 1 0 1 1 0 0 +EDGE2 6260 6041 -0.0201915 0.971436 1.59895 1 0 1 1 0 0 +EDGE2 6260 6059 -1.029 -0.00249794 -0.000975677 1 0 1 1 0 0 +EDGE2 6260 6099 -1.06503 0.0796847 -0.009715 1 0 1 1 0 0 +EDGE2 6260 6259 -1.03366 -0.00604431 -0.00325624 1 0 1 1 0 0 +EDGE2 6260 6079 -0.964901 0.058376 0.00332608 1 0 1 1 0 0 +EDGE2 6260 6039 -0.979336 -0.0470153 0.0159163 1 0 1 1 0 0 +EDGE2 6261 6042 0.973221 -0.0325628 0.0312208 1 0 1 1 0 0 +EDGE2 6261 6100 -1.02366 -0.053107 -1.53887 1 0 1 1 0 0 +EDGE2 6261 6220 -0.907041 0.0591188 1.55636 1 0 1 1 0 0 +EDGE2 6261 6260 -0.983306 0.129777 -1.6093 1 0 1 1 0 0 +EDGE2 6261 6200 -0.96455 0.0438553 1.57217 1 0 1 1 0 0 +EDGE2 6261 6040 -1.05294 0.0129689 -1.57747 1 0 1 1 0 0 +EDGE2 6261 6060 -1.05441 -0.0446183 -1.56166 1 0 1 1 0 0 +EDGE2 6261 6080 -0.988558 0.0088462 -1.57509 1 0 1 1 0 0 +EDGE2 6261 6061 -0.0728373 -0.126942 -0.0188664 1 0 1 1 0 0 +EDGE2 6261 6081 0.00919225 0.0492089 -0.000518472 1 0 1 1 0 0 +EDGE2 6261 6221 0.00102333 0.0581623 -0.00351506 1 0 1 1 0 0 +EDGE2 6261 6041 -0.0310216 0.0327517 -0.00749357 1 0 1 1 0 0 +EDGE2 6261 6082 0.99768 0.0187394 -0.00741418 1 0 1 1 0 0 +EDGE2 6261 6222 1.04846 -0.00932878 -0.00264191 1 0 1 1 0 0 +EDGE2 6261 6062 0.936448 0.0750918 -0.00881051 1 0 1 1 0 0 +EDGE2 6262 6042 -0.028554 -0.0586496 -0.0078454 1 0 1 1 0 0 +EDGE2 6262 6261 -1.01559 -0.0323743 0.0055111 1 0 1 1 0 0 +EDGE2 6262 6061 -0.929215 -0.000289171 -0.036229 1 0 1 1 0 0 +EDGE2 6262 6081 -1.02317 -0.128609 -0.00320441 1 0 1 1 0 0 +EDGE2 6262 6221 -1.04814 -0.0247196 0.00947471 1 0 1 1 0 0 +EDGE2 6262 6041 -1.02181 -0.0699611 0.0161967 1 0 1 1 0 0 +EDGE2 6262 6082 0.0200563 -0.0318606 0.0134671 1 0 1 1 0 0 +EDGE2 6262 6222 0.0425891 -0.00715645 0.00401597 1 0 1 1 0 0 +EDGE2 6262 6062 -0.0297566 -0.0408548 0.000837993 1 0 1 1 0 0 +EDGE2 6262 6063 0.942248 -0.0255534 -0.0367832 1 0 1 1 0 0 +EDGE2 6262 6223 1.05304 0.0766467 0.0016731 1 0 1 1 0 0 +EDGE2 6262 6083 1.00787 -0.0573129 -0.00377388 1 0 1 1 0 0 +EDGE2 6262 6043 1.00701 -0.0739774 -0.00396257 1 0 1 1 0 0 +EDGE2 6263 6042 -1.0318 -0.0300958 0.0023969 1 0 1 1 0 0 +EDGE2 6263 6082 -1.03115 0.038973 -0.00130443 1 0 1 1 0 0 +EDGE2 6263 6222 -0.961056 -0.0297617 0.028215 1 0 1 1 0 0 +EDGE2 6263 6262 -1.0035 0.0307876 0.0218944 1 0 1 1 0 0 +EDGE2 6263 6062 -1.00952 0.0724655 -0.0324968 1 0 1 1 0 0 +EDGE2 6263 6063 -0.0357015 -0.0317336 0.0115496 1 0 1 1 0 0 +EDGE2 6263 6223 -0.11276 0.054368 -0.0188745 1 0 1 1 0 0 +EDGE2 6263 6083 0.00702346 -0.037646 0.0222389 1 0 1 1 0 0 +EDGE2 6263 6043 -0.047656 -0.0470746 0.00850178 1 0 1 1 0 0 +EDGE2 6263 6044 0.957462 -0.0265303 0.00795949 1 0 1 1 0 0 +EDGE2 6263 6084 0.994192 -0.0370506 -0.0134183 1 0 1 1 0 0 +EDGE2 6263 6224 1.03991 0.0473629 -0.00337553 1 0 1 1 0 0 +EDGE2 6263 6064 1.01242 -0.00981447 -0.00338306 1 0 1 1 0 0 +EDGE2 6264 6063 -0.963989 -0.0237177 -0.00901583 1 0 1 1 0 0 +EDGE2 6264 6223 -1.09602 0.043712 0.0135389 1 0 1 1 0 0 +EDGE2 6264 6263 -0.996168 0.00827714 0.0061729 1 0 1 1 0 0 +EDGE2 6264 6083 -1.02011 0.0021764 0.042723 1 0 1 1 0 0 +EDGE2 6264 6043 -1.0634 0.0661181 0.00312914 1 0 1 1 0 0 +EDGE2 6264 6044 0.00593616 -0.06603 -0.00179365 1 0 1 1 0 0 +EDGE2 6264 6084 0.0101727 -0.0380455 -0.0273757 1 0 1 1 0 0 +EDGE2 6264 6224 0.0298739 0.00323043 0.0131207 1 0 1 1 0 0 +EDGE2 6264 6064 -0.00696203 0.0257637 0.0182991 1 0 1 1 0 0 +EDGE2 6264 6225 1.00518 0.144054 -0.0339783 1 0 1 1 0 0 +EDGE2 6264 6245 0.990349 -0.139061 -3.13684 1 0 1 1 0 0 +EDGE2 6264 6045 0.98201 -0.145885 -0.00506874 1 0 1 1 0 0 +EDGE2 6264 6065 0.951385 0.0753529 0.0174146 1 0 1 1 0 0 +EDGE2 6264 6085 1.01527 -0.0337672 -0.00141858 1 0 1 1 0 0 +EDGE2 6264 605 0.997975 0.0475233 -3.15519 1 0 1 1 0 0 +EDGE2 6265 6044 -1.05027 -0.00621183 0.000529125 1 0 1 1 0 0 +EDGE2 6265 6084 -1.03581 0.0289188 0.0302298 1 0 1 1 0 0 +EDGE2 6265 6224 -0.950011 -0.00523713 -0.000165899 1 0 1 1 0 0 +EDGE2 6265 6264 -1.04503 -0.0206384 0.0194213 1 0 1 1 0 0 +EDGE2 6265 6064 -1.01664 0.0317532 0.0238949 1 0 1 1 0 0 +EDGE2 6265 6226 0.0750552 -0.984465 -1.55511 1 0 1 1 0 0 +EDGE2 6265 6225 -0.0344901 0.00971858 -0.0375259 1 0 1 1 0 0 +EDGE2 6265 6245 -0.04476 0.0289012 -3.14211 1 0 1 1 0 0 +EDGE2 6265 6045 -0.00594449 -0.0394636 0.0179963 1 0 1 1 0 0 +EDGE2 6265 6065 0.0474249 -0.0132865 0.00143718 1 0 1 1 0 0 +EDGE2 6265 6085 -0.0543914 0.0193536 0.0305038 1 0 1 1 0 0 +EDGE2 6265 605 -0.0393535 0.0637043 -3.15215 1 0 1 1 0 0 +EDGE2 6265 604 1.01914 -0.0509663 -3.12755 1 0 1 1 0 0 +EDGE2 6265 6244 0.985262 -0.0461675 -3.14786 1 0 1 1 0 0 +EDGE2 6265 6046 0.0612496 0.994808 1.57808 1 0 1 1 0 0 +EDGE2 6265 6086 0.00286934 0.979323 1.56488 1 0 1 1 0 0 +EDGE2 6265 6246 0.0290372 1.00951 1.54329 1 0 1 1 0 0 +EDGE2 6265 6066 -0.12437 0.991156 1.52895 1 0 1 1 0 0 +EDGE2 6265 606 -0.0802077 0.961049 1.56362 1 0 1 1 0 0 +EDGE2 6266 6227 1.0348 0.062556 0.0242057 1 0 1 1 0 0 +EDGE2 6266 6226 0.0113138 -0.00744566 0.0104183 1 0 1 1 0 0 +EDGE2 6266 6225 -0.883228 0.123033 1.55202 1 0 1 1 0 0 +EDGE2 6266 6265 -1.09743 0.0050392 1.57216 1 0 1 1 0 0 +EDGE2 6266 6245 -1.01026 -0.0653393 -1.55223 1 0 1 1 0 0 +EDGE2 6266 6045 -1.05159 -0.00395631 1.59102 1 0 1 1 0 0 +EDGE2 6266 6065 -0.948634 -0.0079963 1.58967 1 0 1 1 0 0 +EDGE2 6266 6085 -1.11122 -0.029964 1.57658 1 0 1 1 0 0 +EDGE2 6266 605 -0.982631 -0.0586863 -1.6008 1 0 1 1 0 0 +EDGE2 6267 6228 0.922129 -0.0212679 0.0132411 1 0 1 1 0 0 +EDGE2 6267 6266 -1.04152 0.0259346 -0.01314 1 0 1 1 0 0 +EDGE2 6267 6227 0.0154147 0.0548405 -0.0239497 1 0 1 1 0 0 +EDGE2 6267 6226 -1.05086 -0.0195769 0.0166606 1 0 1 1 0 0 +EDGE2 6268 6229 0.995666 0.0069811 -0.0184758 1 0 1 1 0 0 +EDGE2 6268 6267 -1.04768 -0.0498054 0.0265315 1 0 1 1 0 0 +EDGE2 6268 6228 0.0387137 0.0721989 0.0181599 1 0 1 1 0 0 +EDGE2 6268 6227 -1.02021 -0.0474221 0.00421473 1 0 1 1 0 0 +EDGE2 6269 6230 0.995904 0.0647015 -0.00586974 1 0 1 1 0 0 +EDGE2 6269 590 1.02709 0.0615323 -3.1549 1 0 1 1 0 0 +EDGE2 6269 6268 -1.02493 0.0141793 0.0066354 1 0 1 1 0 0 +EDGE2 6269 6229 0.0332579 -0.00571201 -0.0113188 1 0 1 1 0 0 +EDGE2 6269 6228 -0.971731 0.0466411 -0.00986124 1 0 1 1 0 0 +EDGE2 6270 591 0.030028 1.00241 1.55344 1 0 1 1 0 0 +EDGE2 6270 6230 0.0602702 0.0740497 0.0110342 1 0 1 1 0 0 +EDGE2 6270 589 0.936256 -0.00708468 -3.13135 1 0 1 1 0 0 +EDGE2 6270 6231 0.00115426 0.8939 1.5875 1 0 1 1 0 0 +EDGE2 6270 590 -0.0855511 -0.0633214 -3.14532 1 0 1 1 0 0 +EDGE2 6270 6229 -1.02341 0.0188652 -0.0107639 1 0 1 1 0 0 +EDGE2 6270 6269 -0.960136 0.0136522 0.0304575 1 0 1 1 0 0 +EDGE2 6271 592 0.953157 -0.0400259 -0.000401184 1 0 1 1 0 0 +EDGE2 6271 591 -0.0546644 0.0226003 0.0355217 1 0 1 1 0 0 +EDGE2 6271 6230 -0.939326 -0.0177389 -1.56843 1 0 1 1 0 0 +EDGE2 6271 6270 -1.03407 -0.0839841 -1.57018 1 0 1 1 0 0 +EDGE2 6271 6231 -0.115281 0.0508677 0.000683117 1 0 1 1 0 0 +EDGE2 6271 590 -1.01416 -0.00066278 1.54326 1 0 1 1 0 0 +EDGE2 6271 6232 0.984438 -0.0418458 0.00381356 1 0 1 1 0 0 +EDGE2 6272 592 0.0217132 0.0417126 0.014079 1 0 1 1 0 0 +EDGE2 6272 591 -1.11708 0.00897092 -0.0363722 1 0 1 1 0 0 +EDGE2 6272 6231 -1.00033 -0.0116815 -0.0404687 1 0 1 1 0 0 +EDGE2 6272 6271 -1.08393 0.0447594 -0.0180496 1 0 1 1 0 0 +EDGE2 6272 6232 0.0522934 0.0934457 -0.0140986 1 0 1 1 0 0 +EDGE2 6272 6233 1.04562 -0.0991403 0.00076121 1 0 1 1 0 0 +EDGE2 6272 593 1.09724 -0.0126322 0.00087572 1 0 1 1 0 0 +EDGE2 6273 592 -0.967903 -0.0868364 0.0123231 1 0 1 1 0 0 +EDGE2 6273 6232 -0.999489 0.0757395 -0.00841447 1 0 1 1 0 0 +EDGE2 6273 6272 -1.02312 -0.0515285 -0.000789891 1 0 1 1 0 0 +EDGE2 6273 6233 0.0452673 -0.0139048 4.61279e-05 1 0 1 1 0 0 +EDGE2 6273 6234 1.004 0.00613869 0.0308075 1 0 1 1 0 0 +EDGE2 6273 594 0.978753 -0.0421939 0.0430245 1 0 1 1 0 0 +EDGE2 6273 593 0.0186085 -0.0286567 0.0216836 1 0 1 1 0 0 +EDGE2 6274 6273 -1.04281 0.12276 0.00918327 1 0 1 1 0 0 +EDGE2 6274 6233 -1.02987 -0.040832 -0.00418304 1 0 1 1 0 0 +EDGE2 6274 6234 0.0246165 0.00838917 0.0316078 1 0 1 1 0 0 +EDGE2 6274 594 -0.0204845 0.0332539 0.00207484 1 0 1 1 0 0 +EDGE2 6274 593 -1.02737 -0.0661706 0.02985 1 0 1 1 0 0 +EDGE2 6274 6235 1.01443 0.00598134 -0.0139521 1 0 1 1 0 0 +EDGE2 6274 595 0.965712 0.0896427 -0.0131781 1 0 1 1 0 0 +EDGE2 6275 6274 -1.00791 -0.0474171 -0.0218253 1 0 1 1 0 0 +EDGE2 6275 6234 -0.986574 0.00691009 0.0317458 1 0 1 1 0 0 +EDGE2 6275 594 -1.12548 0.0274639 0.0212524 1 0 1 1 0 0 +EDGE2 6275 596 0.0177339 1.12728 1.55143 1 0 1 1 0 0 +EDGE2 6275 6235 0.00646379 0.00108226 0.0142883 1 0 1 1 0 0 +EDGE2 6275 595 0.0691691 0.0722376 0.00100045 1 0 1 1 0 0 +EDGE2 6275 6236 -0.0315189 0.974843 1.55386 1 0 1 1 0 0 +EDGE2 6276 6235 -0.930569 0.00159329 1.59279 1 0 1 1 0 0 +EDGE2 6276 6275 -0.914645 0.0761971 1.54456 1 0 1 1 0 0 +EDGE2 6276 595 -0.978883 0.041646 1.59601 1 0 1 1 0 0 +EDGE2 6277 6276 -1.01894 0.0809032 0.00577106 1 0 1 1 0 0 +EDGE2 6278 6277 -0.965834 -0.0118757 0.020605 1 0 1 1 0 0 +EDGE2 6279 6278 -0.92859 0.0439428 -0.00995145 1 0 1 1 0 0 +EDGE2 6280 6279 -1.00086 0.0576712 0.0106328 1 0 1 1 0 0 +EDGE2 6281 6280 -1.02279 -0.000902463 1.57936 1 0 1 1 0 0 +EDGE2 6282 6281 -0.984162 0.032091 -0.0016596 1 0 1 1 0 0 +EDGE2 6283 6282 -1.00292 -0.0686345 0.0461624 1 0 1 1 0 0 +EDGE2 6284 585 0.937536 -0.0438293 -3.144 1 0 1 1 0 0 +EDGE2 6284 6283 -0.912881 -0.0540886 0.014264 1 0 1 1 0 0 +EDGE2 6285 584 1.0669 0.0328003 -3.13375 1 0 1 1 0 0 +EDGE2 6285 585 0.0524196 0.001908 -3.15221 1 0 1 1 0 0 +EDGE2 6285 6284 -0.940626 0.0228685 -0.00798552 1 0 1 1 0 0 +EDGE2 6285 586 -0.0890398 -0.96594 -1.53343 1 0 1 1 0 0 +EDGE2 6286 6285 -0.881376 -0.00469098 -1.56486 1 0 1 1 0 0 +EDGE2 6286 585 -1.05661 0.0887832 1.56626 1 0 1 1 0 0 +EDGE2 6287 6286 -0.933469 -0.0743466 0.0111117 1 0 1 1 0 0 +EDGE2 6288 6287 -1.03934 0.118107 0.0117607 1 0 1 1 0 0 +EDGE2 6289 6288 -0.939755 0.034122 0.000529492 1 0 1 1 0 0 +EDGE2 6290 6289 -0.979097 0.00956718 -0.0109231 1 0 1 1 0 0 +EDGE2 6291 6290 -0.893808 0.000885768 -1.55728 1 0 1 1 0 0 +EDGE2 6292 6291 -0.978057 -0.0212416 0.0308204 1 0 1 1 0 0 +EDGE2 6293 6292 -0.960665 -0.0338108 -0.0278178 1 0 1 1 0 0 +EDGE2 6294 6293 -1.00923 0.0116356 -0.0160136 1 0 1 1 0 0 +EDGE2 6295 6294 -1.01399 0.0262937 -0.0113151 1 0 1 1 0 0 +EDGE2 6296 6295 -1.05413 -0.0100391 -1.54756 1 0 1 1 0 0 +EDGE2 6297 6296 -1.02195 0.0535976 -0.00399999 1 0 1 1 0 0 +EDGE2 6298 6297 -0.980921 -0.0263429 -0.0321651 1 0 1 1 0 0 +EDGE2 6299 6298 -1.08513 0.0157206 0.0286177 1 0 1 1 0 0 +EDGE2 6299 6280 0.94243 -0.0349953 -3.11344 1 0 1 1 0 0 +EDGE2 6300 6299 -1.03914 -0.077066 -0.000453801 1 0 1 1 0 0 +EDGE2 6300 6281 0.0531959 0.995279 1.54645 1 0 1 1 0 0 +EDGE2 6300 6279 1.12029 0.0255615 -3.12067 1 0 1 1 0 0 +EDGE2 6300 6280 -0.0822281 0.0628449 -3.13021 1 0 1 1 0 0 +EDGE2 6301 6300 -1.01518 -0.00828154 1.59345 1 0 1 1 0 0 +EDGE2 6301 6280 -0.971508 0.00623601 -1.5664 1 0 1 1 0 0 +EDGE2 6302 6301 -0.962517 0.0334232 -0.0271205 1 0 1 1 0 0 +EDGE2 6303 6302 -0.978309 0.055487 0.00579222 1 0 1 1 0 0 +EDGE2 6304 6303 -0.979782 -0.0460684 -0.000524143 1 0 1 1 0 0 +EDGE2 6305 6304 -1.05723 -0.0295265 -0.00864984 1 0 1 1 0 0 +EDGE2 6306 6305 -1.00846 0.0206872 -1.58178 1 0 1 1 0 0 +EDGE2 6307 6306 -0.979204 -0.0128417 0.0135042 1 0 1 1 0 0 +EDGE2 6308 6307 -0.949428 0.0310708 -0.0107005 1 0 1 1 0 0 +EDGE2 6309 6308 -0.889439 -0.0451413 0.00600008 1 0 1 1 0 0 +EDGE2 6310 6309 -1.03497 -0.01188 0.00242602 1 0 1 1 0 0 +EDGE2 6311 6310 -1.09797 -0.0331201 -1.56975 1 0 1 1 0 0 +EDGE2 6312 6311 -1.02365 -0.0766337 0.0260305 1 0 1 1 0 0 +EDGE2 6313 6312 -1.0033 0.0555635 0.0142763 1 0 1 1 0 0 +EDGE2 6314 6235 1.00253 0.0091537 -3.13395 1 0 1 1 0 0 +EDGE2 6314 6275 0.975974 0.0202039 -3.13352 1 0 1 1 0 0 +EDGE2 6314 595 1.06076 0.0336064 -3.14734 1 0 1 1 0 0 +EDGE2 6314 6313 -1.07331 0.0607306 -0.0232485 1 0 1 1 0 0 +EDGE2 6315 6274 1.10247 -0.08312 -3.11145 1 0 1 1 0 0 +EDGE2 6315 6234 0.994272 -0.052661 -3.16011 1 0 1 1 0 0 +EDGE2 6315 594 1.02763 0.00810335 -3.13472 1 0 1 1 0 0 +EDGE2 6315 6276 -0.0359238 0.952297 1.56877 1 0 1 1 0 0 +EDGE2 6315 596 0.0463288 -0.988943 -1.57504 1 0 1 1 0 0 +EDGE2 6315 6314 -1.07706 -0.0573345 0.00382636 1 0 1 1 0 0 +EDGE2 6315 6235 0.0520677 -0.0417569 -3.12087 1 0 1 1 0 0 +EDGE2 6315 6275 0.00832025 0.010086 -3.12161 1 0 1 1 0 0 +EDGE2 6315 595 0.0265849 -0.0499162 -3.16656 1 0 1 1 0 0 +EDGE2 6315 6236 -0.0106576 -0.951685 -1.58075 1 0 1 1 0 0 +EDGE2 6316 6277 1.0465 0.026064 -0.022652 1 0 1 1 0 0 +EDGE2 6316 6276 0.0634015 0.0200637 0.00757154 1 0 1 1 0 0 +EDGE2 6316 6315 -1.00359 0.00443446 -1.55161 1 0 1 1 0 0 +EDGE2 6316 6235 -0.889909 -0.00440453 1.57096 1 0 1 1 0 0 +EDGE2 6316 6275 -1.05288 -0.0681333 1.60509 1 0 1 1 0 0 +EDGE2 6316 595 -1.02679 -0.0175073 1.58846 1 0 1 1 0 0 +EDGE2 6317 6316 -1.07513 -0.027138 -0.00880032 1 0 1 1 0 0 +EDGE2 6317 6278 0.955606 0.00924151 0.0197068 1 0 1 1 0 0 +EDGE2 6317 6277 0.079891 0.0216162 0.0319735 1 0 1 1 0 0 +EDGE2 6317 6276 -1.01625 -0.00308512 -0.0282739 1 0 1 1 0 0 +EDGE2 6318 6279 1.00773 -0.0261114 0.00251888 1 0 1 1 0 0 +EDGE2 6318 6278 0.048141 0.00458399 -0.0117026 1 0 1 1 0 0 +EDGE2 6318 6317 -1.03161 0.0168004 -0.0170905 1 0 1 1 0 0 +EDGE2 6318 6277 -0.9676 0.0223315 -0.00468951 1 0 1 1 0 0 +EDGE2 6319 6279 -0.0360139 -0.0254039 0.0161562 1 0 1 1 0 0 +EDGE2 6319 6300 1.04196 -0.090724 -3.11849 1 0 1 1 0 0 +EDGE2 6319 6280 1.06833 0.031193 0.0206062 1 0 1 1 0 0 +EDGE2 6319 6278 -1.01433 0.0244543 -0.021472 1 0 1 1 0 0 +EDGE2 6319 6318 -1.01758 0.0587858 -0.0284536 1 0 1 1 0 0 +EDGE2 6320 6299 1.00439 -0.0338814 -3.08046 1 0 1 1 0 0 +EDGE2 6320 6281 0.0576676 -0.979881 -1.57809 1 0 1 1 0 0 +EDGE2 6320 6279 -1.1122 0.0183989 0.0234074 1 0 1 1 0 0 +EDGE2 6320 6300 -0.0203575 0.0152362 -3.17765 1 0 1 1 0 0 +EDGE2 6320 6280 -0.0777154 0.0318764 -0.0131213 1 0 1 1 0 0 +EDGE2 6320 6301 0.0104391 0.983158 1.5882 1 0 1 1 0 0 +EDGE2 6320 6319 -0.968907 -0.0009244 -0.0111553 1 0 1 1 0 0 +EDGE2 6321 6282 1.01063 -0.00983147 0.0194472 1 0 1 1 0 0 +EDGE2 6321 6281 -0.0231909 0.0251713 0.00831534 1 0 1 1 0 0 +EDGE2 6321 6300 -1.07084 0.0216017 -1.55185 1 0 1 1 0 0 +EDGE2 6321 6280 -1.0815 0.0112948 1.55812 1 0 1 1 0 0 +EDGE2 6321 6320 -0.953319 0.000144071 1.5786 1 0 1 1 0 0 +EDGE2 6322 6282 -0.0104417 0.0242955 -0.01466 1 0 1 1 0 0 +EDGE2 6322 6283 1.04651 -0.0475482 0.0183436 1 0 1 1 0 0 +EDGE2 6322 6281 -0.90391 0.0185073 -0.0186892 1 0 1 1 0 0 +EDGE2 6322 6321 -1.00482 0.0413886 -0.0193312 1 0 1 1 0 0 +EDGE2 6323 6282 -0.89927 0.0167134 0.0122557 1 0 1 1 0 0 +EDGE2 6323 6283 0.0126824 -0.0877403 -0.0270457 1 0 1 1 0 0 +EDGE2 6323 6284 0.962153 0.0447996 -0.0125302 1 0 1 1 0 0 +EDGE2 6323 6322 -1.05475 0.0161158 -0.0224053 1 0 1 1 0 0 +EDGE2 6324 6285 1.02975 -0.0626406 -0.0113663 1 0 1 1 0 0 +EDGE2 6324 585 1.1021 -0.030775 -3.1413 1 0 1 1 0 0 +EDGE2 6324 6283 -1.08868 -0.00959446 0.00675451 1 0 1 1 0 0 +EDGE2 6324 6284 -0.00418635 -0.0729086 -0.026065 1 0 1 1 0 0 +EDGE2 6324 6323 -1.04889 0.0763978 -0.00571816 1 0 1 1 0 0 +EDGE2 6325 6285 0.0810625 0.0120232 0.0284958 1 0 1 1 0 0 +EDGE2 6325 6286 0.0128251 0.981432 1.56763 1 0 1 1 0 0 +EDGE2 6325 584 0.86848 0.0661818 -3.13361 1 0 1 1 0 0 +EDGE2 6325 585 -0.0295928 -0.0154693 -3.1164 1 0 1 1 0 0 +EDGE2 6325 6324 -0.950752 -0.0114254 -0.0290823 1 0 1 1 0 0 +EDGE2 6325 6284 -0.920091 -0.0329855 0.0328679 1 0 1 1 0 0 +EDGE2 6325 586 -0.0576486 -1.01129 -1.56516 1 0 1 1 0 0 +EDGE2 6326 6287 0.980082 -0.00576741 -0.0178309 1 0 1 1 0 0 +EDGE2 6326 6325 -0.974214 -0.00707437 -1.55567 1 0 1 1 0 0 +EDGE2 6326 6285 -1.02489 0.0243006 -1.59934 1 0 1 1 0 0 +EDGE2 6326 6286 -0.0286207 0.0248632 0.00499394 1 0 1 1 0 0 +EDGE2 6326 585 -1.03092 0.00363761 1.57228 1 0 1 1 0 0 +EDGE2 6327 6288 0.977613 0.0450748 0.0147021 1 0 1 1 0 0 +EDGE2 6327 6287 0.0609604 0.0259202 0.0113752 1 0 1 1 0 0 +EDGE2 6327 6286 -0.991323 -0.0665961 0.00444737 1 0 1 1 0 0 +EDGE2 6327 6326 -1.01267 -0.00531368 0.0245932 1 0 1 1 0 0 +EDGE2 6328 6289 0.995861 -0.0126095 -0.00641737 1 0 1 1 0 0 +EDGE2 6328 6288 0.0813007 0.00261633 0.00189706 1 0 1 1 0 0 +EDGE2 6328 6287 -1.03752 -0.0236716 0.00175724 1 0 1 1 0 0 +EDGE2 6328 6327 -1.04492 -0.0139825 -0.0348609 1 0 1 1 0 0 +EDGE2 6329 6290 0.902995 0.0314206 0.0317131 1 0 1 1 0 0 +EDGE2 6329 6328 -0.997389 -0.0937098 -0.00571567 1 0 1 1 0 0 +EDGE2 6329 6289 0.0130194 -0.047486 -0.0089275 1 0 1 1 0 0 +EDGE2 6329 6288 -0.973237 -0.0428639 0.0225568 1 0 1 1 0 0 +EDGE2 6330 6291 -0.0418923 1.00273 1.56597 1 0 1 1 0 0 +EDGE2 6330 6290 0.0508136 0.0614343 0.0033591 1 0 1 1 0 0 +EDGE2 6330 6289 -0.963571 0.0769973 0.0333709 1 0 1 1 0 0 +EDGE2 6330 6329 -1.04351 0.000775381 -0.0135069 1 0 1 1 0 0 +EDGE2 6331 6290 -0.876278 -0.0535537 1.55956 1 0 1 1 0 0 +EDGE2 6331 6330 -1.08972 -0.016125 1.56593 1 0 1 1 0 0 +EDGE2 6332 6331 -0.98934 -0.0117513 -0.0136982 1 0 1 1 0 0 +EDGE2 6333 6332 -0.954104 0.00719922 0.000729645 1 0 1 1 0 0 +EDGE2 6334 6333 -1.00004 0.00449629 -0.00119313 1 0 1 1 0 0 +EDGE2 6334 575 0.996606 -0.0510414 -3.1453 1 0 1 1 0 0 +EDGE2 6334 6155 1.07428 0.0186698 -3.14175 1 0 1 1 0 0 +EDGE2 6335 6154 1.01195 0.0324339 -3.1153 1 0 1 1 0 0 +EDGE2 6335 574 0.991158 -0.0166083 -3.16257 1 0 1 1 0 0 +EDGE2 6335 6156 5.20852e-05 -0.939328 -1.55532 1 0 1 1 0 0 +EDGE2 6335 575 -0.00281165 0.039031 -3.14291 1 0 1 1 0 0 +EDGE2 6335 6155 0.0486737 -0.0273266 -3.14534 1 0 1 1 0 0 +EDGE2 6335 576 -0.0881982 -0.915165 -1.54324 1 0 1 1 0 0 +EDGE2 6335 6334 -1.01577 0.0173555 0.0404893 1 0 1 1 0 0 +EDGE2 6336 6335 -1.12494 -0.0189619 -1.58281 1 0 1 1 0 0 +EDGE2 6336 575 -1.03362 0.0127533 1.57089 1 0 1 1 0 0 +EDGE2 6336 6155 -1.01447 0.0276652 1.5845 1 0 1 1 0 0 +EDGE2 6337 6336 -0.97756 -0.0231145 0.00647012 1 0 1 1 0 0 +EDGE2 6338 6337 -1.04074 0.101017 0.00463429 1 0 1 1 0 0 +EDGE2 6339 6338 -0.999459 -0.0260707 -0.00783132 1 0 1 1 0 0 +EDGE2 6340 6339 -0.994272 -0.0102393 -0.0288288 1 0 1 1 0 0 +EDGE2 6341 6340 -1.0125 -0.043399 1.54728 1 0 1 1 0 0 +EDGE2 6342 6341 -1.00215 0.0310697 -0.00168315 1 0 1 1 0 0 +EDGE2 6343 6342 -1.04492 0.0416262 -0.0333121 1 0 1 1 0 0 +EDGE2 6344 6343 -0.993016 -0.0773324 0.00649388 1 0 1 1 0 0 +EDGE2 6344 565 0.953198 0.0873157 -3.13259 1 0 1 1 0 0 +EDGE2 6344 6145 0.984266 0.0416085 -3.12008 1 0 1 1 0 0 +EDGE2 6345 6144 0.963599 -0.0357146 -3.19849 1 0 1 1 0 0 +EDGE2 6345 564 1.02852 -0.0804869 -3.0973 1 0 1 1 0 0 +EDGE2 6345 565 0.0542598 0.105844 -3.18093 1 0 1 1 0 0 +EDGE2 6345 6145 -0.0860994 0.0302702 -3.15611 1 0 1 1 0 0 +EDGE2 6345 6344 -1.03823 0.0268954 -0.00519211 1 0 1 1 0 0 +EDGE2 6345 566 0.0670039 -1.08173 -1.59743 1 0 1 1 0 0 +EDGE2 6345 6146 0.0064455 -0.990517 -1.60954 1 0 1 1 0 0 +EDGE2 6346 565 -0.9827 0.0202287 1.57094 1 0 1 1 0 0 +EDGE2 6346 6145 -0.942844 0.0111312 1.53892 1 0 1 1 0 0 +EDGE2 6346 6345 -0.980927 -0.0965946 -1.54404 1 0 1 1 0 0 +EDGE2 6347 6346 -1.02419 -0.0609974 -0.0163613 1 0 1 1 0 0 +EDGE2 6348 6347 -1.0528 0.0560285 0.0598196 1 0 1 1 0 0 +EDGE2 6349 530 0.930638 -0.0125812 -3.16129 1 0 1 1 0 0 +EDGE2 6349 6348 -0.937366 -0.0344223 -0.00159592 1 0 1 1 0 0 +EDGE2 6350 529 0.983242 -0.0114369 -3.11887 1 0 1 1 0 0 +EDGE2 6350 531 0.0779283 -1.02845 -1.59896 1 0 1 1 0 0 +EDGE2 6350 530 0.0620053 0.00993364 -3.17152 1 0 1 1 0 0 +EDGE2 6350 6349 -1.00182 -0.0840324 -0.00650314 1 0 1 1 0 0 +EDGE2 6351 6350 -0.982873 0.0317764 -1.55508 1 0 1 1 0 0 +EDGE2 6351 530 -1.00657 -0.0558087 1.57782 1 0 1 1 0 0 +EDGE2 6352 6351 -1.10695 -0.0635737 -0.0101601 1 0 1 1 0 0 +EDGE2 6353 6352 -0.933899 -0.0328616 -0.0116363 1 0 1 1 0 0 +EDGE2 6354 6353 -1.01345 -0.03193 0.00391108 1 0 1 1 0 0 +EDGE2 6355 6354 -1.03267 -0.0508094 0.0052916 1 0 1 1 0 0 +EDGE2 6356 6355 -0.906023 -0.086875 1.57374 1 0 1 1 0 0 +EDGE2 6357 6356 -0.951909 0.0117465 0.0207108 1 0 1 1 0 0 +EDGE2 6358 6357 -0.991919 0.0491482 -0.0109558 1 0 1 1 0 0 +EDGE2 6359 6358 -1.08331 -0.069778 0.0126886 1 0 1 1 0 0 +EDGE2 6360 6359 -0.934664 0.0534545 -0.00940825 1 0 1 1 0 0 +EDGE2 6361 6360 -1.02114 -0.0173681 -1.56225 1 0 1 1 0 0 +EDGE2 6362 6361 -0.986961 -0.0771502 0.036059 1 0 1 1 0 0 +EDGE2 6363 6362 -1.00883 -0.0276127 0.00169801 1 0 1 1 0 0 +EDGE2 6364 6363 -1.02669 -0.0764372 0.00343927 1 0 1 1 0 0 +EDGE2 6365 6364 -0.95301 0.0188724 -0.0310968 1 0 1 1 0 0 +EDGE2 6366 6365 -1.1006 0.0230812 -1.57277 1 0 1 1 0 0 +EDGE2 6367 6366 -1.00879 -0.0533476 0.0141846 1 0 1 1 0 0 +EDGE2 6368 6367 -0.980716 0.030015 0.0157055 1 0 1 1 0 0 +EDGE2 6369 6368 -0.992272 -0.0748943 0.0228825 1 0 1 1 0 0 +EDGE2 6370 6369 -1.03831 0.139287 0.030957 1 0 1 1 0 0 +EDGE2 6371 6370 -1.02216 -0.0151279 -1.57106 1 0 1 1 0 0 +EDGE2 6372 6371 -0.979463 0.0759807 -0.0215179 1 0 1 1 0 0 +EDGE2 6373 6372 -0.932293 0.103897 -0.00159063 1 0 1 1 0 0 +EDGE2 6374 6355 1.02265 -0.0645135 -3.13907 1 0 1 1 0 0 +EDGE2 6374 6373 -1.05312 0.0207144 0.0161857 1 0 1 1 0 0 +EDGE2 6375 6356 -0.00373682 1.06861 1.56272 1 0 1 1 0 0 +EDGE2 6375 6354 0.965246 0.0058958 -3.1194 1 0 1 1 0 0 +EDGE2 6375 6355 -0.0290679 0.0488869 -3.15163 1 0 1 1 0 0 +EDGE2 6375 6374 -1.01277 -0.000544361 0.0288787 1 0 1 1 0 0 +EDGE2 6376 6355 -0.99058 -0.0708732 -1.57354 1 0 1 1 0 0 +EDGE2 6376 6375 -0.904383 -0.0142861 1.54906 1 0 1 1 0 0 +EDGE2 6377 6376 -1.05049 0.0380618 0.0232582 1 0 1 1 0 0 +EDGE2 6378 6377 -1.08082 0.000247627 -0.0215786 1 0 1 1 0 0 +EDGE2 6379 6378 -1.02699 -0.0986495 0.0158049 1 0 1 1 0 0 +EDGE2 6379 6340 1.00282 -0.0679502 -3.14294 1 0 1 1 0 0 +EDGE2 6380 6379 -0.938779 -0.0400169 0.00946409 1 0 1 1 0 0 +EDGE2 6380 6340 -0.00224785 0.00816364 -3.13427 1 0 1 1 0 0 +EDGE2 6380 6341 0.010708 1.04472 1.54975 1 0 1 1 0 0 +EDGE2 6380 6339 0.950758 -0.0444235 -3.12277 1 0 1 1 0 0 +EDGE2 6381 6340 -0.955898 -0.0179072 -1.56737 1 0 1 1 0 0 +EDGE2 6381 6380 -0.90214 0.0259709 1.56916 1 0 1 1 0 0 +EDGE2 6382 6381 -1.05596 0.0884455 -0.0142129 1 0 1 1 0 0 +EDGE2 6383 6382 -0.935728 -0.00416111 0.0439182 1 0 1 1 0 0 +EDGE2 6384 6383 -0.987047 0.0589802 -0.0008911 1 0 1 1 0 0 +EDGE2 6385 6384 -0.933135 -0.12945 0.021484 1 0 1 1 0 0 +EDGE2 6386 6385 -1.05834 -0.0317573 -1.59335 1 0 1 1 0 0 +EDGE2 6387 6386 -0.987865 -0.0115736 0.019149 1 0 1 1 0 0 +EDGE2 6388 6387 -1.04859 -0.0276184 0.0207567 1 0 1 1 0 0 +EDGE2 6389 6388 -1.02752 -0.0360844 0.020342 1 0 1 1 0 0 +EDGE2 6389 6290 1.0066 0.0542011 -3.13008 1 0 1 1 0 0 +EDGE2 6389 6330 1.02253 0.100534 -3.14476 1 0 1 1 0 0 +EDGE2 6390 6291 -0.0783295 -1.05189 -1.57519 1 0 1 1 0 0 +EDGE2 6390 6389 -0.990232 0.0489161 -0.00611006 1 0 1 1 0 0 +EDGE2 6390 6290 0.0444822 -0.00326697 -3.10673 1 0 1 1 0 0 +EDGE2 6390 6289 1.10239 0.0322329 -3.12064 1 0 1 1 0 0 +EDGE2 6390 6331 -0.00752801 0.974513 1.55892 1 0 1 1 0 0 +EDGE2 6390 6330 -0.0692299 -0.0224151 -3.14918 1 0 1 1 0 0 +EDGE2 6390 6329 0.952146 -0.0241021 -3.14259 1 0 1 1 0 0 +EDGE2 6391 6390 -0.966014 -0.0094629 -1.56071 1 0 1 1 0 0 +EDGE2 6391 6290 -1.01156 -0.0345581 1.56386 1 0 1 1 0 0 +EDGE2 6391 6331 0.10964 -0.0130029 0.0239133 1 0 1 1 0 0 +EDGE2 6391 6332 0.970865 0.092592 0.00475386 1 0 1 1 0 0 +EDGE2 6391 6330 -0.971244 0.0468869 1.55836 1 0 1 1 0 0 +EDGE2 6392 6333 0.930989 0.0270826 -0.0110099 1 0 1 1 0 0 +EDGE2 6392 6391 -0.991814 0.0267207 0.00041601 1 0 1 1 0 0 +EDGE2 6392 6331 -0.905542 0.0145845 -0.00257348 1 0 1 1 0 0 +EDGE2 6392 6332 0.00584638 -0.0886726 -0.0267939 1 0 1 1 0 0 +EDGE2 6393 6333 0.0684228 -0.019977 0.00966467 1 0 1 1 0 0 +EDGE2 6393 6334 0.943108 -0.0465012 0.0677367 1 0 1 1 0 0 +EDGE2 6393 6392 -0.98201 -0.00479205 -0.00424443 1 0 1 1 0 0 +EDGE2 6393 6332 -1.02733 -0.0323259 0.0273395 1 0 1 1 0 0 +EDGE2 6394 6333 -0.952172 0.039796 0.0154793 1 0 1 1 0 0 +EDGE2 6394 6335 1.11106 -0.00976794 0.00763613 1 0 1 1 0 0 +EDGE2 6394 575 1.0701 0.00138305 -3.1444 1 0 1 1 0 0 +EDGE2 6394 6155 0.976817 0.0522472 -3.11845 1 0 1 1 0 0 +EDGE2 6394 6334 0.0659192 -0.00370041 -0.0115589 1 0 1 1 0 0 +EDGE2 6394 6393 -1.00316 0.0198939 0.00324688 1 0 1 1 0 0 +EDGE2 6395 6336 -0.0224501 1.0281 1.5856 1 0 1 1 0 0 +EDGE2 6395 6154 1.08499 -0.0680774 -3.15671 1 0 1 1 0 0 +EDGE2 6395 574 0.931151 -0.0458008 -3.16 1 0 1 1 0 0 +EDGE2 6395 6156 0.0243023 -1.05511 -1.56978 1 0 1 1 0 0 +EDGE2 6395 6335 0.0544979 0.027159 0.0118985 1 0 1 1 0 0 +EDGE2 6395 575 0.0145078 -0.0530414 -3.13109 1 0 1 1 0 0 +EDGE2 6395 6155 0.0226645 0.057482 -3.15822 1 0 1 1 0 0 +EDGE2 6395 576 0.0533768 -1.03248 -1.57492 1 0 1 1 0 0 +EDGE2 6395 6334 -1.01919 0.0166216 -0.0026002 1 0 1 1 0 0 +EDGE2 6395 6394 -0.951051 -0.0261252 0.0193006 1 0 1 1 0 0 +EDGE2 6396 6395 -0.917968 -0.00460195 1.55544 1 0 1 1 0 0 +EDGE2 6396 6156 -0.00627213 0.0511407 0.000998706 1 0 1 1 0 0 +EDGE2 6396 6335 -0.995854 0.0439511 1.58163 1 0 1 1 0 0 +EDGE2 6396 575 -0.963752 -0.037118 -1.62405 1 0 1 1 0 0 +EDGE2 6396 6155 -1.06926 -0.0737484 -1.50683 1 0 1 1 0 0 +EDGE2 6396 576 -0.0798394 -0.0197791 0.00689546 1 0 1 1 0 0 +EDGE2 6396 577 1.04031 0.0515194 0.00108267 1 0 1 1 0 0 +EDGE2 6396 6157 1.02191 -0.0474739 -0.020355 1 0 1 1 0 0 +EDGE2 6397 6156 -1.04147 -0.0189231 0.00180689 1 0 1 1 0 0 +EDGE2 6397 6396 -0.993264 -0.0209315 0.0199612 1 0 1 1 0 0 +EDGE2 6397 576 -1.02913 0.0575631 -0.00693175 1 0 1 1 0 0 +EDGE2 6397 577 -0.078259 0.0129227 -0.0414343 1 0 1 1 0 0 +EDGE2 6397 6157 0.0405395 0.0734996 -0.00197107 1 0 1 1 0 0 +EDGE2 6397 6158 0.980158 -0.0360129 0.0460902 1 0 1 1 0 0 +EDGE2 6397 578 1.0538 -0.0323495 0.0035953 1 0 1 1 0 0 +EDGE2 6398 6397 -0.993896 0.0818748 -0.00564576 1 0 1 1 0 0 +EDGE2 6398 577 -0.97454 -0.0829841 -0.0165591 1 0 1 1 0 0 +EDGE2 6398 6157 -0.982461 -0.0944104 0.0242846 1 0 1 1 0 0 +EDGE2 6398 6158 0.0406666 -0.0394256 0.0369505 1 0 1 1 0 0 +EDGE2 6398 578 -0.0239495 0.0941476 -0.00671406 1 0 1 1 0 0 +EDGE2 6398 579 0.989246 0.0435763 -0.0251747 1 0 1 1 0 0 +EDGE2 6398 6159 0.969631 -0.0182474 0.0169768 1 0 1 1 0 0 +EDGE2 6399 6158 -1.00915 -0.0893292 0.00234963 1 0 1 1 0 0 +EDGE2 6399 6398 -0.991254 0.0160448 -0.00871506 1 0 1 1 0 0 +EDGE2 6399 578 -0.982823 -0.00513223 -0.041604 1 0 1 1 0 0 +EDGE2 6399 6160 0.988127 -0.0726679 -0.00719311 1 0 1 1 0 0 +EDGE2 6399 579 0.0221062 0.0302628 0.0010102 1 0 1 1 0 0 +EDGE2 6399 6159 0.0189768 -0.0682853 -0.0121612 1 0 1 1 0 0 +EDGE2 6399 580 0.95211 0.00489938 -0.00907444 1 0 1 1 0 0 +EDGE2 6400 6161 -0.0098604 1.02665 1.59898 1 0 1 1 0 0 +EDGE2 6400 6160 -0.0202772 0.0424607 -0.0341145 1 0 1 1 0 0 +EDGE2 6400 579 -0.955416 0.0187077 0.0206749 1 0 1 1 0 0 +EDGE2 6400 6159 -1.02194 -0.0272073 -0.0414203 1 0 1 1 0 0 +EDGE2 6400 6399 -0.961102 -0.00541366 0.0347238 1 0 1 1 0 0 +EDGE2 6400 581 0.053679 -1.02921 -1.58448 1 0 1 1 0 0 +EDGE2 6400 580 -0.00914669 -0.0127227 0.0017816 1 0 1 1 0 0 +EDGE2 6401 582 1.06055 0.0629278 -0.0431555 1 0 1 1 0 0 +EDGE2 6401 6160 -1.04128 -0.0138528 1.54823 1 0 1 1 0 0 +EDGE2 6401 6400 -0.979605 -0.0576644 1.58065 1 0 1 1 0 0 +EDGE2 6401 581 -0.020556 -0.0390791 -0.0203794 1 0 1 1 0 0 +EDGE2 6401 580 -1.03697 0.0889862 1.56927 1 0 1 1 0 0 +EDGE2 6402 582 -0.0603104 0.00417423 0.0105047 1 0 1 1 0 0 +EDGE2 6402 581 -0.921977 -0.152865 -0.046934 1 0 1 1 0 0 +EDGE2 6402 6401 -1.04108 -0.0343694 -0.0161673 1 0 1 1 0 0 +EDGE2 6402 583 1.04271 0.071576 0.0216855 1 0 1 1 0 0 +EDGE2 6403 582 -0.976718 -0.198086 0.0153612 1 0 1 1 0 0 +EDGE2 6403 6402 -0.957168 -0.00970335 -0.00445838 1 0 1 1 0 0 +EDGE2 6403 583 -0.0180174 0.0433281 -0.0397956 1 0 1 1 0 0 +EDGE2 6403 584 0.986966 -0.0296977 -0.00998792 1 0 1 1 0 0 +EDGE2 6404 583 -0.935696 0.060097 -0.017027 1 0 1 1 0 0 +EDGE2 6404 6403 -1.05181 0.011467 0.00405426 1 0 1 1 0 0 +EDGE2 6404 6325 0.998943 -0.0175037 -3.13248 1 0 1 1 0 0 +EDGE2 6404 6285 1.02993 -0.0417675 -3.13009 1 0 1 1 0 0 +EDGE2 6404 584 -0.0696197 0.0158754 -0.0279436 1 0 1 1 0 0 +EDGE2 6404 585 1.00589 0.0180067 0.0050973 1 0 1 1 0 0 +EDGE2 6405 6325 -0.000612351 0.034431 -3.15534 1 0 1 1 0 0 +EDGE2 6405 6285 0.000967579 -0.056248 -3.14677 1 0 1 1 0 0 +EDGE2 6405 6286 -0.0344684 -1.06546 -1.57346 1 0 1 1 0 0 +EDGE2 6405 6326 0.0366615 -1.02618 -1.59408 1 0 1 1 0 0 +EDGE2 6405 584 -1.0295 0.0229302 0.00176143 1 0 1 1 0 0 +EDGE2 6405 6404 -1.07078 0.0309242 0.00530168 1 0 1 1 0 0 +EDGE2 6405 585 0.00405017 -0.125541 0.00645396 1 0 1 1 0 0 +EDGE2 6405 6324 0.989186 -0.0203256 -3.13708 1 0 1 1 0 0 +EDGE2 6405 6284 1.00013 0.00495805 -3.13785 1 0 1 1 0 0 +EDGE2 6405 586 0.0280241 0.956064 1.53891 1 0 1 1 0 0 +EDGE2 6406 6287 0.977221 0.053021 0.01191 1 0 1 1 0 0 +EDGE2 6406 6325 -0.907292 -0.138057 -1.58711 1 0 1 1 0 0 +EDGE2 6406 6285 -1.06191 -0.0778125 -1.57193 1 0 1 1 0 0 +EDGE2 6406 6286 -0.0168909 -0.0289392 -0.0315359 1 0 1 1 0 0 +EDGE2 6406 6327 0.964242 0.00619641 -0.0193963 1 0 1 1 0 0 +EDGE2 6406 6326 0.0225723 0.00640698 0.00350837 1 0 1 1 0 0 +EDGE2 6406 6405 -0.961322 -0.0220476 1.58373 1 0 1 1 0 0 +EDGE2 6406 585 -1.11376 -0.0664356 1.58009 1 0 1 1 0 0 +EDGE2 6407 6328 0.917918 0.0980652 0.0221786 1 0 1 1 0 0 +EDGE2 6407 6288 0.992987 0.0197702 -0.0202742 1 0 1 1 0 0 +EDGE2 6407 6287 -0.047487 -0.00141967 0.0265099 1 0 1 1 0 0 +EDGE2 6407 6406 -0.966664 0.0372979 -0.00684239 1 0 1 1 0 0 +EDGE2 6407 6286 -1.0375 -0.0795338 -0.0353397 1 0 1 1 0 0 +EDGE2 6407 6327 -0.0355072 0.0296185 -0.0168521 1 0 1 1 0 0 +EDGE2 6407 6326 -1.00575 0.0790302 0.0055594 1 0 1 1 0 0 +EDGE2 6408 6407 -1.04216 -0.0100098 0.0251595 1 0 1 1 0 0 +EDGE2 6408 6328 -0.0561075 -0.0370655 -0.00680938 1 0 1 1 0 0 +EDGE2 6408 6289 1.04666 -0.0294555 -0.00484666 1 0 1 1 0 0 +EDGE2 6408 6288 0.0622165 0.0195255 -0.0467889 1 0 1 1 0 0 +EDGE2 6408 6329 0.983671 -0.0926441 -0.0102843 1 0 1 1 0 0 +EDGE2 6408 6287 -1.0115 -0.0365216 -0.00979291 1 0 1 1 0 0 +EDGE2 6408 6327 -1.02438 -0.0236388 0.00493193 1 0 1 1 0 0 +EDGE2 6409 6390 0.970162 0.0160688 -3.1441 1 0 1 1 0 0 +EDGE2 6409 6290 0.972993 0.0401895 0.00433734 1 0 1 1 0 0 +EDGE2 6409 6328 -0.918629 0.017882 0.0209007 1 0 1 1 0 0 +EDGE2 6409 6289 0.0882443 -0.0293735 0.00811061 1 0 1 1 0 0 +EDGE2 6409 6330 1.05853 -0.023445 -0.0241215 1 0 1 1 0 0 +EDGE2 6409 6288 -1.09818 0.0279868 -0.0131434 1 0 1 1 0 0 +EDGE2 6409 6329 -0.0648782 0.0226341 -0.00854848 1 0 1 1 0 0 +EDGE2 6409 6408 -1.011 0.0525822 -0.00433293 1 0 1 1 0 0 +EDGE2 6410 6291 -0.0157839 0.962048 1.55808 1 0 1 1 0 0 +EDGE2 6410 6391 0.00137477 -0.978764 -1.5643 1 0 1 1 0 0 +EDGE2 6410 6390 -0.1204 -0.069548 -3.15739 1 0 1 1 0 0 +EDGE2 6410 6389 0.940093 0.0998456 -3.1369 1 0 1 1 0 0 +EDGE2 6410 6290 0.0325964 -0.027315 -0.0223739 1 0 1 1 0 0 +EDGE2 6410 6289 -1.06804 -0.0156111 -0.0120026 1 0 1 1 0 0 +EDGE2 6410 6331 0.0133108 -0.997954 -1.60036 1 0 1 1 0 0 +EDGE2 6410 6330 0.0192288 -0.0181129 0.0435849 1 0 1 1 0 0 +EDGE2 6410 6329 -1.07195 -0.0145424 -0.0143271 1 0 1 1 0 0 +EDGE2 6410 6409 -1.02222 -0.0344198 0.00723362 1 0 1 1 0 0 +EDGE2 6411 6291 -0.00582945 -0.0148418 0.00316014 1 0 1 1 0 0 +EDGE2 6411 6390 -0.98288 -0.0182976 1.5865 1 0 1 1 0 0 +EDGE2 6411 6290 -1.02956 -0.0133775 -1.55898 1 0 1 1 0 0 +EDGE2 6411 6410 -0.977483 0.00391806 -1.58267 1 0 1 1 0 0 +EDGE2 6411 6330 -0.971056 -0.0485604 -1.5275 1 0 1 1 0 0 +EDGE2 6411 6292 1.02764 -0.0628184 0.0202035 1 0 1 1 0 0 +EDGE2 6412 6291 -0.98916 -0.0125789 0.0257958 1 0 1 1 0 0 +EDGE2 6412 6293 1.05074 0.0403038 0.0336238 1 0 1 1 0 0 +EDGE2 6412 6292 -0.0803887 0.0750043 0.0100664 1 0 1 1 0 0 +EDGE2 6412 6411 -1.03909 -0.0602613 -0.0166959 1 0 1 1 0 0 +EDGE2 6413 6412 -0.943366 0.0594171 -0.0377779 1 0 1 1 0 0 +EDGE2 6413 6294 0.914503 -0.0012005 0.00343851 1 0 1 1 0 0 +EDGE2 6413 6293 0.0498612 0.0973935 -0.0276539 1 0 1 1 0 0 +EDGE2 6413 6292 -1.01302 -0.0710833 0.000202589 1 0 1 1 0 0 +EDGE2 6414 6294 -0.0136215 0.088741 0.00790516 1 0 1 1 0 0 +EDGE2 6414 6293 -1.03483 -0.00494541 0.0294715 1 0 1 1 0 0 +EDGE2 6414 6413 -1.04344 -0.0400249 -0.0278204 1 0 1 1 0 0 +EDGE2 6414 6295 1.05568 0.0381545 0.0122219 1 0 1 1 0 0 +EDGE2 6415 6294 -1.09721 0.0115319 0.000240999 1 0 1 1 0 0 +EDGE2 6415 6414 -0.973965 0.0736807 -0.00359314 1 0 1 1 0 0 +EDGE2 6415 6295 0.0421588 -0.106752 0.00505119 1 0 1 1 0 0 +EDGE2 6415 6296 -0.0150501 1.01884 1.53597 1 0 1 1 0 0 +EDGE2 6416 6295 -1.046 -0.0165709 1.6069 1 0 1 1 0 0 +EDGE2 6416 6415 -0.997775 -0.0404267 1.54618 1 0 1 1 0 0 +EDGE2 6417 6416 -1.01701 0.00221982 -0.0434177 1 0 1 1 0 0 +EDGE2 6418 6417 -0.977114 -0.0372988 -0.0164627 1 0 1 1 0 0 +EDGE2 6419 6418 -0.9479 -0.136972 0.00277111 1 0 1 1 0 0 +EDGE2 6420 6419 -0.958923 -0.011587 -0.00928668 1 0 1 1 0 0 +EDGE2 6421 6420 -1.08706 0.0589066 -1.58242 1 0 1 1 0 0 +EDGE2 6422 6421 -0.903927 0.0220186 0.0203602 1 0 1 1 0 0 +EDGE2 6423 6422 -0.959419 -0.0213562 -0.0206226 1 0 1 1 0 0 +EDGE2 6424 6423 -1.00911 -0.0469713 0.00847195 1 0 1 1 0 0 +EDGE2 6425 6424 -0.962816 -0.0429088 -0.0338076 1 0 1 1 0 0 +EDGE2 6426 6425 -1.03283 -0.111118 -1.53982 1 0 1 1 0 0 +EDGE2 6427 6426 -1.06492 -0.0150677 -0.0188483 1 0 1 1 0 0 +EDGE2 6428 6427 -0.969021 0.0634817 -0.0256095 1 0 1 1 0 0 +EDGE2 6429 6428 -0.977441 -0.010259 -0.00793714 1 0 1 1 0 0 +EDGE2 6430 6429 -1.01358 0.0461651 -0.000767816 1 0 1 1 0 0 +EDGE2 6431 6430 -0.993359 -0.0210551 -1.56339 1 0 1 1 0 0 +EDGE2 6432 6431 -1.00183 0.00899543 -0.0413052 1 0 1 1 0 0 +EDGE2 6433 6432 -0.944299 0.0286149 0.0160187 1 0 1 1 0 0 +EDGE2 6434 6295 0.934927 0.0227054 -3.11304 1 0 1 1 0 0 +EDGE2 6434 6433 -0.940588 0.0177207 0.0236926 1 0 1 1 0 0 +EDGE2 6434 6415 0.854812 0.0711213 -3.11201 1 0 1 1 0 0 +EDGE2 6435 6294 1.06302 -0.0125828 -3.16818 1 0 1 1 0 0 +EDGE2 6435 6414 0.955892 -0.011327 -3.14442 1 0 1 1 0 0 +EDGE2 6435 6416 -0.0228515 0.983179 1.5492 1 0 1 1 0 0 +EDGE2 6435 6295 0.0545401 0.0134343 -3.15311 1 0 1 1 0 0 +EDGE2 6435 6434 -1.08385 0.0843459 0.0162761 1 0 1 1 0 0 +EDGE2 6435 6296 0.0540541 -0.997688 -1.53884 1 0 1 1 0 0 +EDGE2 6435 6415 0.0102475 -0.116999 -3.15871 1 0 1 1 0 0 +EDGE2 6436 6417 1.04573 0.00567772 0.0238728 1 0 1 1 0 0 +EDGE2 6436 6435 -0.982637 -0.01339 -1.54061 1 0 1 1 0 0 +EDGE2 6436 6416 -0.0166431 -0.115886 -0.00665285 1 0 1 1 0 0 +EDGE2 6436 6295 -1.0533 -0.0154894 1.54608 1 0 1 1 0 0 +EDGE2 6436 6415 -0.991397 -0.0158579 1.54782 1 0 1 1 0 0 +EDGE2 6437 6418 1.00047 -0.0512708 0.032605 1 0 1 1 0 0 +EDGE2 6437 6436 -1.03575 -0.0717289 0.0137534 1 0 1 1 0 0 +EDGE2 6437 6417 -0.00365966 0.0298525 -0.0387293 1 0 1 1 0 0 +EDGE2 6437 6416 -1.00873 0.0693041 -0.00516691 1 0 1 1 0 0 +EDGE2 6438 6418 -0.0180848 -0.0123542 -0.00157993 1 0 1 1 0 0 +EDGE2 6438 6419 0.94944 0.00870537 0.0228712 1 0 1 1 0 0 +EDGE2 6438 6417 -0.950321 0.0549947 -0.00635847 1 0 1 1 0 0 +EDGE2 6438 6437 -1.03426 0.0509825 -0.0268768 1 0 1 1 0 0 +EDGE2 6439 6418 -0.955752 -0.0166762 -0.0308551 1 0 1 1 0 0 +EDGE2 6439 6420 0.947736 0.0693713 -0.00957044 1 0 1 1 0 0 +EDGE2 6439 6419 -0.0286742 0.0365242 0.0146235 1 0 1 1 0 0 +EDGE2 6439 6438 -0.922847 0.0248285 0.0125009 1 0 1 1 0 0 +EDGE2 6440 6420 0.0755416 -0.019982 0.00433039 1 0 1 1 0 0 +EDGE2 6440 6421 -0.0315353 1.03374 1.60027 1 0 1 1 0 0 +EDGE2 6440 6419 -1.03437 0.00800773 -0.0163157 1 0 1 1 0 0 +EDGE2 6440 6439 -1.0058 -0.0544083 -0.0113818 1 0 1 1 0 0 +EDGE2 6441 6422 1.02111 -0.0244479 -0.0410103 1 0 1 1 0 0 +EDGE2 6441 6440 -0.964206 0.0541625 -1.56799 1 0 1 1 0 0 +EDGE2 6441 6420 -0.977115 -0.0173841 -1.5661 1 0 1 1 0 0 +EDGE2 6441 6421 0.0312865 0.00907525 0.0121674 1 0 1 1 0 0 +EDGE2 6442 6422 -0.0123273 -0.0283631 0.00435477 1 0 1 1 0 0 +EDGE2 6442 6421 -1.0532 -0.0761706 0.0227628 1 0 1 1 0 0 +EDGE2 6442 6441 -1.02014 0.0475912 0.0202137 1 0 1 1 0 0 +EDGE2 6442 6423 1.09212 0.0324288 0.0192916 1 0 1 1 0 0 +EDGE2 6443 6422 -0.989861 -0.0323482 0.00272518 1 0 1 1 0 0 +EDGE2 6443 6442 -0.96519 0.0901061 -0.0130952 1 0 1 1 0 0 +EDGE2 6443 6423 0.0479709 0.0640223 0.00722568 1 0 1 1 0 0 +EDGE2 6443 6424 1.07951 -0.0135989 0.0100484 1 0 1 1 0 0 +EDGE2 6444 6443 -1.04297 0.0121331 0.0191103 1 0 1 1 0 0 +EDGE2 6444 6423 -0.977688 0.058518 0.00266813 1 0 1 1 0 0 +EDGE2 6444 6424 -0.0639299 -0.0801655 -0.0122113 1 0 1 1 0 0 +EDGE2 6444 6425 1.05059 -0.0230639 0.0298417 1 0 1 1 0 0 +EDGE2 6445 6444 -1.00361 0.0487253 0.0100749 1 0 1 1 0 0 +EDGE2 6445 6424 -1.03938 -0.0260151 0.0129282 1 0 1 1 0 0 +EDGE2 6445 6426 0.0505199 1.00522 1.57778 1 0 1 1 0 0 +EDGE2 6445 6425 0.00792897 -0.0490029 0.00860707 1 0 1 1 0 0 +EDGE2 6446 6426 -0.0393648 0.0643326 -0.0282184 1 0 1 1 0 0 +EDGE2 6446 6425 -0.947749 -0.0713132 -1.55466 1 0 1 1 0 0 +EDGE2 6446 6445 -1.02344 -0.0138639 -1.57742 1 0 1 1 0 0 +EDGE2 6446 6427 1.06582 0.118653 -0.00904984 1 0 1 1 0 0 +EDGE2 6447 6426 -0.962169 0.0181327 -0.0147945 1 0 1 1 0 0 +EDGE2 6447 6446 -0.997643 -0.0479809 0.0163694 1 0 1 1 0 0 +EDGE2 6447 6427 0.00596747 -0.0556834 0.0169507 1 0 1 1 0 0 +EDGE2 6447 6428 1.01644 -0.0100988 -0.0128121 1 0 1 1 0 0 +EDGE2 6448 6447 -1.08415 0.0857467 0.00626719 1 0 1 1 0 0 +EDGE2 6448 6427 -1.01784 -0.0207522 0.0121122 1 0 1 1 0 0 +EDGE2 6448 6428 -0.0813179 0.00977965 -0.0108912 1 0 1 1 0 0 +EDGE2 6448 6429 1.0038 -0.00536819 0.0258361 1 0 1 1 0 0 +EDGE2 6449 6428 -0.931978 0.0433078 -0.0278988 1 0 1 1 0 0 +EDGE2 6449 6448 -1.02469 -0.0080221 0.011664 1 0 1 1 0 0 +EDGE2 6449 6429 0.0537626 0.00719764 0.0331362 1 0 1 1 0 0 +EDGE2 6449 6430 1.02248 -0.0130097 0.0284972 1 0 1 1 0 0 +EDGE2 6450 6449 -0.95216 0.0416121 -0.0133758 1 0 1 1 0 0 +EDGE2 6450 6429 -1.06373 0.0190256 -0.0221375 1 0 1 1 0 0 +EDGE2 6450 6431 -0.108884 1.00625 1.57969 1 0 1 1 0 0 +EDGE2 6450 6430 -0.0393903 0.033228 0.00473785 1 0 1 1 0 0 +EDGE2 6451 6431 0.0638952 -0.0271232 -0.0119976 1 0 1 1 0 0 +EDGE2 6451 6432 1.13184 -0.0161308 0.00321124 1 0 1 1 0 0 +EDGE2 6451 6430 -0.952815 -0.0121214 -1.57469 1 0 1 1 0 0 +EDGE2 6451 6450 -0.96322 -0.00929541 -1.5574 1 0 1 1 0 0 +EDGE2 6452 6433 1.01726 -0.00524924 0.00922794 1 0 1 1 0 0 +EDGE2 6452 6431 -0.957932 0.0166703 0.0138578 1 0 1 1 0 0 +EDGE2 6452 6451 -0.970693 -0.0315534 0.00193279 1 0 1 1 0 0 +EDGE2 6452 6432 0.0515787 0.0261536 -0.00530363 1 0 1 1 0 0 +EDGE2 6453 6452 -1.06312 -0.0359914 -0.00707771 1 0 1 1 0 0 +EDGE2 6453 6434 0.979842 -0.0299009 -0.0238326 1 0 1 1 0 0 +EDGE2 6453 6433 -0.023648 0.0525166 -0.00387437 1 0 1 1 0 0 +EDGE2 6453 6432 -1.0128 -0.0615644 -0.00476322 1 0 1 1 0 0 +EDGE2 6454 6435 0.925483 0.0158163 -0.0413164 1 0 1 1 0 0 +EDGE2 6454 6295 0.941682 -0.0124093 -3.13306 1 0 1 1 0 0 +EDGE2 6454 6453 -1.09914 -0.109268 0.0115371 1 0 1 1 0 0 +EDGE2 6454 6434 0.0134844 0.0182618 0.010213 1 0 1 1 0 0 +EDGE2 6454 6433 -1.00077 -0.0582837 0.0082033 1 0 1 1 0 0 +EDGE2 6454 6415 1.00959 0.0425615 -3.15433 1 0 1 1 0 0 +EDGE2 6455 6294 1.02441 -0.00920279 -3.12834 1 0 1 1 0 0 +EDGE2 6455 6414 1.05499 0.0237273 -3.15574 1 0 1 1 0 0 +EDGE2 6455 6454 -1.04619 0.0288878 -0.0176821 1 0 1 1 0 0 +EDGE2 6455 6436 -0.0136168 0.963987 1.56603 1 0 1 1 0 0 +EDGE2 6455 6435 -0.0655059 -0.0416678 -0.022671 1 0 1 1 0 0 +EDGE2 6455 6416 -0.0485013 0.993031 1.55518 1 0 1 1 0 0 +EDGE2 6455 6295 0.0464413 -0.00198088 -3.1434 1 0 1 1 0 0 +EDGE2 6455 6434 -1.00593 0.0270119 0.00729557 1 0 1 1 0 0 +EDGE2 6455 6296 0.0920354 -1.02472 -1.60397 1 0 1 1 0 0 +EDGE2 6455 6415 -0.0456406 0.182972 -3.1773 1 0 1 1 0 0 +EDGE2 6456 6436 0.0141671 0.00660599 0.00543354 1 0 1 1 0 0 +EDGE2 6456 6417 0.941723 -0.0341914 0.0531632 1 0 1 1 0 0 +EDGE2 6456 6437 1.0442 0.045604 0.00587701 1 0 1 1 0 0 +EDGE2 6456 6435 -0.938361 -0.0250362 -1.56294 1 0 1 1 0 0 +EDGE2 6456 6455 -1.01788 0.0475405 -1.53306 1 0 1 1 0 0 +EDGE2 6456 6416 0.00738268 -0.0559195 0.028118 1 0 1 1 0 0 +EDGE2 6456 6295 -0.948474 0.162229 1.59144 1 0 1 1 0 0 +EDGE2 6456 6415 -0.955243 -0.0675786 1.52577 1 0 1 1 0 0 +EDGE2 6457 6418 1.10655 0.0785072 -0.00931178 1 0 1 1 0 0 +EDGE2 6457 6438 1.01351 -0.0187002 -0.00877639 1 0 1 1 0 0 +EDGE2 6457 6436 -0.959904 -0.0691439 0.0203473 1 0 1 1 0 0 +EDGE2 6457 6417 0.0500544 0.0122909 0.00350588 1 0 1 1 0 0 +EDGE2 6457 6437 0.0351761 -0.0536919 0.0261492 1 0 1 1 0 0 +EDGE2 6457 6456 -1.07307 -0.0295591 0.022329 1 0 1 1 0 0 +EDGE2 6457 6416 -1.00254 0.0172111 0.0394727 1 0 1 1 0 0 +EDGE2 6458 6418 -0.0169233 -0.0340685 0.0155469 1 0 1 1 0 0 +EDGE2 6458 6419 0.982738 -0.0453774 -0.0482832 1 0 1 1 0 0 +EDGE2 6458 6439 0.944879 0.0538577 0.0034865 1 0 1 1 0 0 +EDGE2 6458 6438 0.053213 -0.016586 -0.0146426 1 0 1 1 0 0 +EDGE2 6458 6417 -0.931214 -0.0830813 0.0107718 1 0 1 1 0 0 +EDGE2 6458 6437 -1.01664 0.00189617 0.00146254 1 0 1 1 0 0 +EDGE2 6458 6457 -1.09194 -0.06393 -0.0015617 1 0 1 1 0 0 +EDGE2 6459 6418 -0.901727 0.0603112 -0.0180821 1 0 1 1 0 0 +EDGE2 6459 6440 1.01886 0.025541 0.00367258 1 0 1 1 0 0 +EDGE2 6459 6420 0.99235 -0.0858071 0.0321059 1 0 1 1 0 0 +EDGE2 6459 6458 -0.936867 0.00237126 0.00879332 1 0 1 1 0 0 +EDGE2 6459 6419 0.0198549 -0.0229486 -0.00665656 1 0 1 1 0 0 +EDGE2 6459 6439 -0.0193421 -0.00563437 0.00340722 1 0 1 1 0 0 +EDGE2 6459 6438 -1.01591 0.0537376 -0.0364221 1 0 1 1 0 0 +EDGE2 6460 6440 -0.0866047 -0.0461133 0.00954747 1 0 1 1 0 0 +EDGE2 6460 6420 0.133406 -0.0307905 0.0149164 1 0 1 1 0 0 +EDGE2 6460 6421 -0.0435289 1.00861 1.56823 1 0 1 1 0 0 +EDGE2 6460 6441 0.00551253 1.15064 1.59723 1 0 1 1 0 0 +EDGE2 6460 6459 -1.10581 0.0711123 -0.0324692 1 0 1 1 0 0 +EDGE2 6460 6419 -0.947419 0.109094 0.010964 1 0 1 1 0 0 +EDGE2 6460 6439 -0.937123 0.067551 0.01388 1 0 1 1 0 0 +EDGE2 6461 6460 -0.952088 -0.00437353 -1.58728 1 0 1 1 0 0 +EDGE2 6461 6422 1.0951 -0.0552122 -0.0308932 1 0 1 1 0 0 +EDGE2 6461 6440 -0.915211 0.0409528 -1.55496 1 0 1 1 0 0 +EDGE2 6461 6420 -1.01864 -0.0292218 -1.52558 1 0 1 1 0 0 +EDGE2 6461 6421 -0.126151 0.0763698 0.0481801 1 0 1 1 0 0 +EDGE2 6461 6441 -0.0567782 -0.067848 -0.00252549 1 0 1 1 0 0 +EDGE2 6461 6442 1.04941 0.116022 -0.00811061 1 0 1 1 0 0 +EDGE2 6462 6443 0.970869 -0.0679824 -0.0326871 1 0 1 1 0 0 +EDGE2 6462 6422 -0.0260324 0.0117161 -0.0280437 1 0 1 1 0 0 +EDGE2 6462 6461 -1.0094 0.0137986 0.00319111 1 0 1 1 0 0 +EDGE2 6462 6421 -1.00344 -0.00152932 -0.00676086 1 0 1 1 0 0 +EDGE2 6462 6441 -0.962916 -0.00705257 0.0267005 1 0 1 1 0 0 +EDGE2 6462 6442 0.00232674 -0.0381324 -0.0158234 1 0 1 1 0 0 +EDGE2 6462 6423 0.944006 -0.0205935 0.0310155 1 0 1 1 0 0 +EDGE2 6463 6443 -0.0278652 -0.072631 0.0175699 1 0 1 1 0 0 +EDGE2 6463 6422 -0.909871 0.0300915 -0.0240364 1 0 1 1 0 0 +EDGE2 6463 6462 -1.06426 0.0485688 -0.00554645 1 0 1 1 0 0 +EDGE2 6463 6442 -1.0982 -0.0392716 -0.0167627 1 0 1 1 0 0 +EDGE2 6463 6444 1.01749 0.0325248 0.0386368 1 0 1 1 0 0 +EDGE2 6463 6423 -0.014689 -0.016762 -0.00643586 1 0 1 1 0 0 +EDGE2 6463 6424 1.00359 0.024556 -0.0117046 1 0 1 1 0 0 +EDGE2 6464 6443 -0.998579 -0.0692748 -0.00173166 1 0 1 1 0 0 +EDGE2 6464 6463 -0.932261 0.0129686 0.00628314 1 0 1 1 0 0 +EDGE2 6464 6444 0.0460997 -0.0216729 -0.00211136 1 0 1 1 0 0 +EDGE2 6464 6423 -1.10144 0.01413 -0.0233701 1 0 1 1 0 0 +EDGE2 6464 6424 -0.0374717 0.0447938 0.0102123 1 0 1 1 0 0 +EDGE2 6464 6425 0.996553 0.0424031 -0.00799359 1 0 1 1 0 0 +EDGE2 6464 6445 0.965957 -0.00141469 0.00969802 1 0 1 1 0 0 +EDGE2 6465 6444 -1.02502 -0.0308838 -0.0129677 1 0 1 1 0 0 +EDGE2 6465 6464 -0.9923 -0.00331097 0.0173864 1 0 1 1 0 0 +EDGE2 6465 6424 -0.992266 -0.0290676 0.0224795 1 0 1 1 0 0 +EDGE2 6465 6426 0.0262968 1.01816 1.57831 1 0 1 1 0 0 +EDGE2 6465 6425 0.0284247 -0.0131511 0.030583 1 0 1 1 0 0 +EDGE2 6465 6445 0.00309763 -0.100698 0.00218138 1 0 1 1 0 0 +EDGE2 6465 6446 0.0209167 0.96038 1.54345 1 0 1 1 0 0 +EDGE2 6466 6465 -1.06405 0.0291077 -1.5398 1 0 1 1 0 0 +EDGE2 6466 6426 -0.0523679 0.0391414 -0.0113628 1 0 1 1 0 0 +EDGE2 6466 6425 -1.0232 0.0435223 -1.55804 1 0 1 1 0 0 +EDGE2 6466 6445 -0.91644 -0.0293727 -1.57515 1 0 1 1 0 0 +EDGE2 6466 6446 -0.0133622 -0.0153561 0.00616466 1 0 1 1 0 0 +EDGE2 6466 6447 0.918217 -0.0531843 0.0193162 1 0 1 1 0 0 +EDGE2 6466 6427 1.02415 -0.0303205 0.00220514 1 0 1 1 0 0 +EDGE2 6467 6426 -0.985489 -0.106292 0.0191138 1 0 1 1 0 0 +EDGE2 6467 6466 -0.979291 -0.0454561 0.0189751 1 0 1 1 0 0 +EDGE2 6467 6446 -0.948815 -0.0344118 0.0301454 1 0 1 1 0 0 +EDGE2 6467 6447 -0.0220882 -0.0239401 -0.00252078 1 0 1 1 0 0 +EDGE2 6467 6427 -0.0249456 0.0109874 -0.00446126 1 0 1 1 0 0 +EDGE2 6467 6428 0.972684 -0.0333656 -0.00896722 1 0 1 1 0 0 +EDGE2 6467 6448 0.945415 -0.0134943 0.0230889 1 0 1 1 0 0 +EDGE2 6468 6447 -0.977753 -0.0961592 0.0273782 1 0 1 1 0 0 +EDGE2 6468 6467 -0.927881 0.0285022 -0.0102136 1 0 1 1 0 0 +EDGE2 6468 6427 -0.928874 -0.0954104 -0.000699728 1 0 1 1 0 0 +EDGE2 6468 6449 1.01516 0.0324396 -0.0331455 1 0 1 1 0 0 +EDGE2 6468 6428 0.0810271 -0.0323371 0.000581236 1 0 1 1 0 0 +EDGE2 6468 6448 0.092663 -0.032636 -0.0223153 1 0 1 1 0 0 +EDGE2 6468 6429 1.03234 -0.106172 -0.0447073 1 0 1 1 0 0 +EDGE2 6469 6449 -0.00834029 -0.0790401 -0.00558227 1 0 1 1 0 0 +EDGE2 6469 6428 -1.03344 0.0105018 0.010276 1 0 1 1 0 0 +EDGE2 6469 6448 -1.07358 0.0065158 -0.00193735 1 0 1 1 0 0 +EDGE2 6469 6468 -1.07538 0.00806873 0.0165961 1 0 1 1 0 0 +EDGE2 6469 6429 -0.00592678 0.0497773 0.0167618 1 0 1 1 0 0 +EDGE2 6469 6430 0.963986 -0.0762775 -0.00856175 1 0 1 1 0 0 +EDGE2 6469 6450 1.00363 -0.0327153 -0.0322034 1 0 1 1 0 0 +EDGE2 6470 6449 -0.995161 -0.061202 0.0328272 1 0 1 1 0 0 +EDGE2 6470 6469 -1.02879 -0.0909219 -0.014023 1 0 1 1 0 0 +EDGE2 6470 6429 -0.945989 0.123825 -0.0171182 1 0 1 1 0 0 +EDGE2 6470 6431 0.0362442 0.961839 1.60955 1 0 1 1 0 0 +EDGE2 6470 6451 0.0629077 1.03853 1.58764 1 0 1 1 0 0 +EDGE2 6470 6430 -0.0337209 0.0481459 -0.00678487 1 0 1 1 0 0 +EDGE2 6470 6450 -0.0821537 -0.115203 -0.00137037 1 0 1 1 0 0 +EDGE2 6471 6470 -1.0444 -0.0552565 1.58193 1 0 1 1 0 0 +EDGE2 6471 6430 -0.983407 -0.0658081 1.51456 1 0 1 1 0 0 +EDGE2 6471 6450 -1.0508 0.100156 1.57329 1 0 1 1 0 0 +EDGE2 6472 6471 -1.07967 -0.0225864 0.0264478 1 0 1 1 0 0 +EDGE2 6473 6472 -0.93005 0.00733754 -0.041604 1 0 1 1 0 0 +EDGE2 6474 6473 -1.00551 -0.0245083 -6.20648e-05 1 0 1 1 0 0 +EDGE2 6475 6474 -1.05014 0.0460021 -0.0257857 1 0 1 1 0 0 +EDGE2 6476 6475 -0.95343 -0.00795432 -1.552 1 0 1 1 0 0 +EDGE2 6477 6476 -1.05585 -0.0581938 0.0271529 1 0 1 1 0 0 +EDGE2 6478 6477 -1.0349 -0.135903 -0.0132525 1 0 1 1 0 0 +EDGE2 6479 6478 -0.899318 -0.0982773 0.0171633 1 0 1 1 0 0 +EDGE2 6480 6479 -1.06617 0.00383263 -0.0171552 1 0 1 1 0 0 +EDGE2 6481 6480 -0.938234 0.00809921 -1.55697 1 0 1 1 0 0 +EDGE2 6482 6481 -0.866104 0.048882 -0.00356941 1 0 1 1 0 0 +EDGE2 6483 6482 -1.01845 -0.0564921 -0.0314355 1 0 1 1 0 0 +EDGE2 6484 6305 1.02727 0.0498215 -3.15222 1 0 1 1 0 0 +EDGE2 6484 6483 -0.991235 -0.017459 0.0172641 1 0 1 1 0 0 +EDGE2 6485 6304 1.00719 -0.0244531 -3.13364 1 0 1 1 0 0 +EDGE2 6485 6305 0.137273 -0.0192672 -3.11508 1 0 1 1 0 0 +EDGE2 6485 6306 0.046792 -1.01581 -1.58913 1 0 1 1 0 0 +EDGE2 6485 6484 -0.992702 -0.0197948 0.00459888 1 0 1 1 0 0 +EDGE2 6486 6485 -0.980862 -0.00122474 -1.60089 1 0 1 1 0 0 +EDGE2 6486 6305 -1.03239 0.0735014 1.57203 1 0 1 1 0 0 +EDGE2 6487 6486 -0.960119 0.0835404 -0.0221673 1 0 1 1 0 0 +EDGE2 6488 6487 -0.982256 -0.079014 -0.0238643 1 0 1 1 0 0 +EDGE2 6489 6470 0.929884 -0.0839492 -3.15685 1 0 1 1 0 0 +EDGE2 6489 6430 1.01217 -0.00297074 -3.13242 1 0 1 1 0 0 +EDGE2 6489 6450 0.993519 -0.0594184 -3.13436 1 0 1 1 0 0 +EDGE2 6489 6488 -1.00865 0.0256163 -0.002689 1 0 1 1 0 0 +EDGE2 6490 6449 1.0216 -0.0403913 -3.1605 1 0 1 1 0 0 +EDGE2 6490 6469 1.00871 0.0422693 -3.1168 1 0 1 1 0 0 +EDGE2 6490 6429 1.04231 -0.0674844 -3.12159 1 0 1 1 0 0 +EDGE2 6490 6470 -0.0584899 -0.0333424 -3.12586 1 0 1 1 0 0 +EDGE2 6490 6431 -0.0341227 -0.958957 -1.56975 1 0 1 1 0 0 +EDGE2 6490 6451 0.0466463 -0.973817 -1.57279 1 0 1 1 0 0 +EDGE2 6490 6430 0.0451107 -0.0495126 -3.152 1 0 1 1 0 0 +EDGE2 6490 6450 -0.0163935 -0.0308043 -3.13914 1 0 1 1 0 0 +EDGE2 6490 6489 -0.923792 -0.0245675 0.0318297 1 0 1 1 0 0 +EDGE2 6490 6471 0.0882305 0.964294 1.55686 1 0 1 1 0 0 +EDGE2 6491 6470 -1.013 -0.00983221 1.5703 1 0 1 1 0 0 +EDGE2 6491 6490 -0.931016 -0.0102229 -1.57678 1 0 1 1 0 0 +EDGE2 6491 6430 -1.01816 0.00637632 1.53946 1 0 1 1 0 0 +EDGE2 6491 6450 -0.916951 -0.0287952 1.55372 1 0 1 1 0 0 +EDGE2 6491 6471 -0.0461394 0.0471161 -0.0054127 1 0 1 1 0 0 +EDGE2 6491 6472 1.04837 -0.0243104 0.00623268 1 0 1 1 0 0 +EDGE2 6492 6491 -0.991873 0.0523849 -0.00377134 1 0 1 1 0 0 +EDGE2 6492 6471 -0.954515 0.0447486 -0.021566 1 0 1 1 0 0 +EDGE2 6492 6472 -0.00939897 0.0969295 -0.000661315 1 0 1 1 0 0 +EDGE2 6492 6473 1.11542 0.0430807 -0.000427665 1 0 1 1 0 0 +EDGE2 6493 6474 0.987731 -0.0178394 -0.0227273 1 0 1 1 0 0 +EDGE2 6493 6492 -1.07315 0.0251378 -0.0231214 1 0 1 1 0 0 +EDGE2 6493 6472 -1.03625 -0.0109654 0.0071764 1 0 1 1 0 0 +EDGE2 6493 6473 0.00483057 -0.0796141 0.0136399 1 0 1 1 0 0 +EDGE2 6494 6474 -0.00728285 -0.044018 -0.0128322 1 0 1 1 0 0 +EDGE2 6494 6473 -1.03966 -0.0414637 -0.0351763 1 0 1 1 0 0 +EDGE2 6494 6493 -1.01441 -0.0737667 -0.00196566 1 0 1 1 0 0 +EDGE2 6494 6475 1.01065 -0.0214524 -0.0138496 1 0 1 1 0 0 +EDGE2 6495 6474 -1.05039 -0.00271642 0.0153844 1 0 1 1 0 0 +EDGE2 6495 6494 -0.996815 0.0364847 -0.00631731 1 0 1 1 0 0 +EDGE2 6495 6475 0.0338508 -0.0225554 0.00938927 1 0 1 1 0 0 +EDGE2 6495 6476 0.0347881 1.02143 1.62776 1 0 1 1 0 0 +EDGE2 6496 6495 -0.982559 0.0201267 -1.5667 1 0 1 1 0 0 +EDGE2 6496 6475 -0.933533 -0.0338686 -1.56955 1 0 1 1 0 0 +EDGE2 6496 6476 0.00472722 -0.039175 0.00964223 1 0 1 1 0 0 +EDGE2 6496 6477 1.03048 -0.037222 -0.00226082 1 0 1 1 0 0 +EDGE2 6497 6478 1.03959 0.0356088 0.00914404 1 0 1 1 0 0 +EDGE2 6497 6476 -0.968145 0.0572946 -0.00156387 1 0 1 1 0 0 +EDGE2 6497 6496 -0.951046 0.0499999 -0.0184489 1 0 1 1 0 0 +EDGE2 6497 6477 -0.0360546 0.00295672 0.00473834 1 0 1 1 0 0 +EDGE2 6498 6478 0.0169801 -0.0135801 0.0161289 1 0 1 1 0 0 +EDGE2 6498 6497 -0.975796 0.0155194 0.0142382 1 0 1 1 0 0 +EDGE2 6498 6477 -1.14072 -0.03925 -0.0117796 1 0 1 1 0 0 +EDGE2 6498 6479 1.10106 -0.0850721 0.00151985 1 0 1 1 0 0 +EDGE2 6499 6478 -1.01023 0.0379823 0.0178155 1 0 1 1 0 0 +EDGE2 6499 6498 -0.982199 0.0624788 -0.0105131 1 0 1 1 0 0 +EDGE2 6499 6479 -0.0258456 -0.022777 -0.00628859 1 0 1 1 0 0 +EDGE2 6499 6480 1.0929 0.0860748 0.0139342 1 0 1 1 0 0 +EDGE2 6500 6479 -0.960573 0.0488909 -0.0364961 1 0 1 1 0 0 +EDGE2 6500 6499 -0.983321 -0.0254654 0.0103416 1 0 1 1 0 0 +EDGE2 6500 6480 0.0897585 0.0631998 0.0334648 1 0 1 1 0 0 +EDGE2 6500 6481 -0.0147013 1.0482 1.57242 1 0 1 1 0 0 +EDGE2 6501 6480 -1.00832 0.0175441 -1.54261 1 0 1 1 0 0 +EDGE2 6501 6482 1.04812 -0.0121319 0.020359 1 0 1 1 0 0 +EDGE2 6501 6481 0.0253403 0.0384019 0.0247949 1 0 1 1 0 0 +EDGE2 6501 6500 -1.02863 0.00659577 -1.6145 1 0 1 1 0 0 +EDGE2 6502 6501 -1.01804 -0.100314 0.0180276 1 0 1 1 0 0 +EDGE2 6502 6483 1.06597 -0.0175462 -0.0164323 1 0 1 1 0 0 +EDGE2 6502 6482 0.00586132 0.00475863 0.0106922 1 0 1 1 0 0 +EDGE2 6502 6481 -1.03336 0.0596592 0.0118088 1 0 1 1 0 0 +EDGE2 6503 6484 1.09142 -0.0356127 0.0048495 1 0 1 1 0 0 +EDGE2 6503 6502 -0.953466 -0.00912508 -0.00824372 1 0 1 1 0 0 +EDGE2 6503 6483 0.0620364 -0.00381018 -0.00961812 1 0 1 1 0 0 +EDGE2 6503 6482 -1.00617 -0.062392 0.010761 1 0 1 1 0 0 +EDGE2 6504 6485 1.05653 -0.048862 -0.00731684 1 0 1 1 0 0 +EDGE2 6504 6305 1.01436 0.059352 -3.1451 1 0 1 1 0 0 +EDGE2 6504 6484 0.0206548 -0.0168571 0.00336473 1 0 1 1 0 0 +EDGE2 6504 6483 -1.00899 -0.00498242 0.0103412 1 0 1 1 0 0 +EDGE2 6504 6503 -0.866791 0.046556 0.0215585 1 0 1 1 0 0 +EDGE2 6505 6486 -0.0365247 0.973051 1.57419 1 0 1 1 0 0 +EDGE2 6505 6485 -0.0517982 0.0219832 -0.041258 1 0 1 1 0 0 +EDGE2 6505 6304 1.07434 0.0837509 -3.16331 1 0 1 1 0 0 +EDGE2 6505 6305 -0.0538075 -0.0408298 -3.1298 1 0 1 1 0 0 +EDGE2 6505 6306 -0.0432563 -0.958611 -1.57746 1 0 1 1 0 0 +EDGE2 6505 6484 -1.00634 0.0658537 0.00210394 1 0 1 1 0 0 +EDGE2 6505 6504 -1.01479 0.0150094 0.0218118 1 0 1 1 0 0 +EDGE2 6506 6487 0.995638 0.0558844 0.00178623 1 0 1 1 0 0 +EDGE2 6506 6505 -0.993349 0.003359 -1.58842 1 0 1 1 0 0 +EDGE2 6506 6486 0.0924011 0.00124969 0.025554 1 0 1 1 0 0 +EDGE2 6506 6485 -1.06234 0.0555086 -1.56505 1 0 1 1 0 0 +EDGE2 6506 6305 -1.04899 -0.0398383 1.60881 1 0 1 1 0 0 +EDGE2 6507 6488 0.928535 -0.0405983 0.0142523 1 0 1 1 0 0 +EDGE2 6507 6487 -0.0151767 -0.0305554 0.00366422 1 0 1 1 0 0 +EDGE2 6507 6486 -1.12885 -0.0126587 -0.0256325 1 0 1 1 0 0 +EDGE2 6507 6506 -1.03775 -0.0794085 -0.0405723 1 0 1 1 0 0 +EDGE2 6508 6489 1.0989 0.0175344 -0.0145437 1 0 1 1 0 0 +EDGE2 6508 6507 -0.944736 0.0639676 -0.00660132 1 0 1 1 0 0 +EDGE2 6508 6488 -0.0395962 -0.0376984 0.0451469 1 0 1 1 0 0 +EDGE2 6508 6487 -1.02363 0.0126469 0.00793936 1 0 1 1 0 0 +EDGE2 6509 6470 0.95708 0.135417 -3.16797 1 0 1 1 0 0 +EDGE2 6509 6490 0.95781 0.022253 0.0060193 1 0 1 1 0 0 +EDGE2 6509 6508 -1.00804 0.0627663 -0.0185789 1 0 1 1 0 0 +EDGE2 6509 6430 1.03194 -0.0277902 -3.13097 1 0 1 1 0 0 +EDGE2 6509 6450 1.02625 0.0044282 -3.14257 1 0 1 1 0 0 +EDGE2 6509 6489 0.0226871 0.00446727 -0.0282705 1 0 1 1 0 0 +EDGE2 6509 6488 -0.953269 -0.031686 -0.0321346 1 0 1 1 0 0 +EDGE2 6510 6449 1.05306 -0.02297 -3.1445 1 0 1 1 0 0 +EDGE2 6510 6469 1.02964 -0.0475466 -3.1362 1 0 1 1 0 0 +EDGE2 6510 6429 1.07926 0.00786263 -3.14153 1 0 1 1 0 0 +EDGE2 6510 6470 -0.00993863 -0.0201057 -3.11424 1 0 1 1 0 0 +EDGE2 6510 6490 -0.0357904 -0.0481598 -0.0170489 1 0 1 1 0 0 +EDGE2 6510 6431 -0.0667233 -0.980618 -1.56807 1 0 1 1 0 0 +EDGE2 6510 6451 -0.0881231 -0.937844 -1.56061 1 0 1 1 0 0 +EDGE2 6510 6509 -1.0637 0.0211326 -0.0240593 1 0 1 1 0 0 +EDGE2 6510 6430 0.0421468 0.0134483 -3.13314 1 0 1 1 0 0 +EDGE2 6510 6450 -0.0703601 0.0023569 -3.13024 1 0 1 1 0 0 +EDGE2 6510 6489 -1.0136 0.0124404 0.000592339 1 0 1 1 0 0 +EDGE2 6510 6491 0.0357701 1.04941 1.5915 1 0 1 1 0 0 +EDGE2 6510 6471 0.0629663 1.00672 1.56416 1 0 1 1 0 0 +EDGE2 6511 6470 -1.0446 0.000383542 1.576 1 0 1 1 0 0 +EDGE2 6511 6490 -1.05021 0.0346934 -1.57286 1 0 1 1 0 0 +EDGE2 6511 6510 -1.01424 0.026041 -1.59623 1 0 1 1 0 0 +EDGE2 6511 6430 -0.986347 0.00612925 1.54749 1 0 1 1 0 0 +EDGE2 6511 6450 -0.943834 -0.0587673 1.54739 1 0 1 1 0 0 +EDGE2 6511 6491 0.0336105 -0.0283895 -0.0285141 1 0 1 1 0 0 +EDGE2 6511 6492 0.994039 -0.0594698 0.00899837 1 0 1 1 0 0 +EDGE2 6511 6471 0.0136599 -0.0415878 -0.00317971 1 0 1 1 0 0 +EDGE2 6511 6472 1.0383 0.0400801 -0.0213243 1 0 1 1 0 0 +EDGE2 6512 6491 -0.876578 0.0485493 -0.00600031 1 0 1 1 0 0 +EDGE2 6512 6511 -0.937391 0.00370642 -0.0113868 1 0 1 1 0 0 +EDGE2 6512 6492 0.00828571 0.0590049 0.0184987 1 0 1 1 0 0 +EDGE2 6512 6471 -0.991365 0.0628902 -0.0100339 1 0 1 1 0 0 +EDGE2 6512 6472 -0.0112567 -0.0480332 0.00815486 1 0 1 1 0 0 +EDGE2 6512 6473 0.968775 0.0498599 -0.0423017 1 0 1 1 0 0 +EDGE2 6512 6493 0.924751 0.102908 0.010013 1 0 1 1 0 0 +EDGE2 6513 6474 0.949596 -0.0638547 -0.00431504 1 0 1 1 0 0 +EDGE2 6513 6492 -0.921309 0.00591398 0.00228515 1 0 1 1 0 0 +EDGE2 6513 6512 -1.09546 -0.0204726 0.00406273 1 0 1 1 0 0 +EDGE2 6513 6472 -0.997767 -0.024738 -0.0276793 1 0 1 1 0 0 +EDGE2 6513 6473 -0.0401416 0.0293982 -0.00723068 1 0 1 1 0 0 +EDGE2 6513 6493 -0.0328967 -0.0268121 0.00818134 1 0 1 1 0 0 +EDGE2 6513 6494 1.09676 0.0409655 0.0276499 1 0 1 1 0 0 +EDGE2 6514 6474 0.00803133 -0.0315378 0.00542581 1 0 1 1 0 0 +EDGE2 6514 6513 -1.01906 0.0376016 0.0227188 1 0 1 1 0 0 +EDGE2 6514 6473 -1.00144 -0.0652723 -0.0156265 1 0 1 1 0 0 +EDGE2 6514 6493 -1.02107 0.0192857 0.00862902 1 0 1 1 0 0 +EDGE2 6514 6494 -0.0800573 -0.0530148 0.0327334 1 0 1 1 0 0 +EDGE2 6514 6495 0.995164 -0.0930571 -0.013335 1 0 1 1 0 0 +EDGE2 6514 6475 0.954168 0.0294467 -0.00960611 1 0 1 1 0 0 +EDGE2 6515 6474 -0.974431 -0.0928451 0.0154738 1 0 1 1 0 0 +EDGE2 6515 6514 -0.953664 -0.0529776 0.00842349 1 0 1 1 0 0 +EDGE2 6515 6494 -0.977851 -0.0768283 0.017585 1 0 1 1 0 0 +EDGE2 6515 6495 -0.0199847 -0.020669 -0.0269923 1 0 1 1 0 0 +EDGE2 6515 6475 0.103642 -0.0611493 -0.0124082 1 0 1 1 0 0 +EDGE2 6515 6476 0.00442771 1.01652 1.53317 1 0 1 1 0 0 +EDGE2 6515 6496 -0.00742338 1.09908 1.55297 1 0 1 1 0 0 +EDGE2 6516 6495 -0.999605 0.0788821 1.58398 1 0 1 1 0 0 +EDGE2 6516 6515 -0.938676 0.0134526 1.57057 1 0 1 1 0 0 +EDGE2 6516 6475 -1.06416 -0.0566797 1.6261 1 0 1 1 0 0 +EDGE2 6517 6516 -1.01756 -0.0271169 0.0277592 1 0 1 1 0 0 +EDGE2 6518 6517 -0.992041 -0.0722267 -0.0132867 1 0 1 1 0 0 +EDGE2 6519 6518 -0.928467 0.0187319 0.0217523 1 0 1 1 0 0 +EDGE2 6520 6519 -1.01285 -0.0262238 -0.0270387 1 0 1 1 0 0 +EDGE2 6521 6520 -0.995293 0.0388407 -1.54818 1 0 1 1 0 0 +EDGE2 6522 6521 -1.04556 -0.0131044 0.0169813 1 0 1 1 0 0 +EDGE2 6523 6522 -0.955391 -0.016226 0.0140141 1 0 1 1 0 0 +EDGE2 6524 6523 -1.04124 -0.0744847 0.00664248 1 0 1 1 0 0 +EDGE2 6525 6524 -0.973004 -0.0128388 -0.00774248 1 0 1 1 0 0 +EDGE2 6526 6525 -1.02719 -0.0304877 1.56897 1 0 1 1 0 0 +EDGE2 6527 6526 -1.04196 -0.0660197 -0.0357296 1 0 1 1 0 0 +EDGE2 6528 6527 -1.05951 0.0259455 0.0102039 1 0 1 1 0 0 +EDGE2 6529 6528 -1.00925 0.0426084 0.0457933 1 0 1 1 0 0 +EDGE2 6530 6529 -0.915593 -0.0614415 -0.00871425 1 0 1 1 0 0 +EDGE2 6531 6530 -0.971531 0.0305969 -1.5747 1 0 1 1 0 0 +EDGE2 6532 6531 -0.959772 -0.0714341 -0.0291275 1 0 1 1 0 0 +EDGE2 6533 6532 -1.07511 0.032212 -0.00881406 1 0 1 1 0 0 +EDGE2 6534 6533 -1.02813 0.109376 0.0258584 1 0 1 1 0 0 +EDGE2 6535 6534 -0.99139 0.00278093 0.0491324 1 0 1 1 0 0 +EDGE2 6536 6535 -1.02348 0.0394468 -1.57387 1 0 1 1 0 0 +EDGE2 6537 6536 -0.975512 0.0098951 -0.0348001 1 0 1 1 0 0 +EDGE2 6538 6537 -1.05129 -0.0797918 -0.00538254 1 0 1 1 0 0 +EDGE2 6539 6538 -0.922865 -0.0343839 0.0146701 1 0 1 1 0 0 +EDGE2 6540 6539 -1.04049 0.00308531 -0.00780777 1 0 1 1 0 0 +EDGE2 6541 6540 -1.13859 0.0327753 1.5559 1 0 1 1 0 0 +EDGE2 6542 6541 -0.968878 0.0214732 -0.0232122 1 0 1 1 0 0 +EDGE2 6543 6542 -1.01211 -0.0248112 -0.0133146 1 0 1 1 0 0 +EDGE2 6544 6543 -1.06572 -0.0252322 0.00724076 1 0 1 1 0 0 +EDGE2 6545 6544 -1.0575 0.0173484 -0.0134029 1 0 1 1 0 0 +EDGE2 6546 6545 -1.0333 0.153061 1.56244 1 0 1 1 0 0 +EDGE2 6547 6546 -1.04182 0.0143582 0.0230068 1 0 1 1 0 0 +EDGE2 6548 6547 -1.05018 0.0446442 -0.00992655 1 0 1 1 0 0 +EDGE2 6549 6548 -0.998091 0.014299 0.00582534 1 0 1 1 0 0 +EDGE2 6550 6549 -0.983608 0.0075052 0.00732095 1 0 1 1 0 0 +EDGE2 6551 6550 -0.976403 -0.0249456 -1.57527 1 0 1 1 0 0 +EDGE2 6552 6551 -1.03519 0.0344778 -0.0193579 1 0 1 1 0 0 +EDGE2 6553 6552 -0.88564 0.0348825 -0.0214867 1 0 1 1 0 0 +EDGE2 6554 6553 -0.93633 -0.0806563 0.0182745 1 0 1 1 0 0 +EDGE2 6555 6554 -0.979935 0.0703755 -0.000442551 1 0 1 1 0 0 +EDGE2 6556 6555 -1.00988 0.0224117 -1.56585 1 0 1 1 0 0 +EDGE2 6557 6556 -1.01354 -0.0249994 -0.0209873 1 0 1 1 0 0 +EDGE2 6558 6557 -1.02041 -0.0160219 0.00011529 1 0 1 1 0 0 +EDGE2 6559 6558 -1.07953 -0.0626671 -0.000478568 1 0 1 1 0 0 +EDGE2 6560 6559 -1.02251 0.0356972 -0.0270716 1 0 1 1 0 0 +EDGE2 6561 6560 -1.05155 -0.0465229 -1.59062 1 0 1 1 0 0 +EDGE2 6562 6561 -0.986253 -0.0750576 0.00238726 1 0 1 1 0 0 +EDGE2 6563 6562 -0.931721 -0.0864482 -0.00551096 1 0 1 1 0 0 +EDGE2 6564 6545 1.01314 0.0500829 -3.09671 1 0 1 1 0 0 +EDGE2 6564 6563 -1.02782 -0.0669074 -0.0175221 1 0 1 1 0 0 +EDGE2 6565 6545 0.0509271 -0.027728 -3.15339 1 0 1 1 0 0 +EDGE2 6565 6546 -0.0544505 1.01132 1.58048 1 0 1 1 0 0 +EDGE2 6565 6544 1.02863 -0.0178658 -3.12783 1 0 1 1 0 0 +EDGE2 6565 6564 -0.959833 0.00764922 0.00403706 1 0 1 1 0 0 +EDGE2 6566 6545 -0.93035 -0.00337164 1.58151 1 0 1 1 0 0 +EDGE2 6566 6547 0.9576 0.00125288 -0.00497345 1 0 1 1 0 0 +EDGE2 6566 6546 0.0356184 -0.00688192 0.0151629 1 0 1 1 0 0 +EDGE2 6566 6565 -1.04413 0.0040907 -1.57778 1 0 1 1 0 0 +EDGE2 6567 6548 1.01454 0.0482063 0.0102512 1 0 1 1 0 0 +EDGE2 6567 6566 -1.02257 0.0211766 -0.00535061 1 0 1 1 0 0 +EDGE2 6567 6547 0.03707 0.0084498 0.0251187 1 0 1 1 0 0 +EDGE2 6567 6546 -1.00968 0.0286322 0.0247821 1 0 1 1 0 0 +EDGE2 6568 6549 0.957261 -0.0219817 -0.0113986 1 0 1 1 0 0 +EDGE2 6568 6548 -0.0444714 0.017665 0.0158978 1 0 1 1 0 0 +EDGE2 6568 6547 -1.00746 0.100071 -0.0130574 1 0 1 1 0 0 +EDGE2 6568 6567 -0.979215 0.0664599 0.013511 1 0 1 1 0 0 +EDGE2 6569 6550 1.04836 -0.0112824 0.00176623 1 0 1 1 0 0 +EDGE2 6569 6549 -0.0180551 -0.0218788 -1.24607e-05 1 0 1 1 0 0 +EDGE2 6569 6548 -0.911142 0.00144936 0.00756167 1 0 1 1 0 0 +EDGE2 6569 6568 -1.01292 -0.000324022 -0.00913599 1 0 1 1 0 0 +EDGE2 6570 6550 0.0220633 0.0318155 -0.0199068 1 0 1 1 0 0 +EDGE2 6570 6551 -0.0081112 0.984271 1.53247 1 0 1 1 0 0 +EDGE2 6570 6549 -0.999527 -0.0234459 -0.0373143 1 0 1 1 0 0 +EDGE2 6570 6569 -0.961533 0.00185616 0.0127886 1 0 1 1 0 0 +EDGE2 6571 6550 -1.04039 -0.0521991 -1.5291 1 0 1 1 0 0 +EDGE2 6571 6570 -1.05926 -0.0911648 -1.59291 1 0 1 1 0 0 +EDGE2 6571 6551 0.0491248 0.0607193 -0.00560591 1 0 1 1 0 0 +EDGE2 6571 6552 0.977977 -0.0290401 -0.0157585 1 0 1 1 0 0 +EDGE2 6572 6571 -1.01216 0.0800945 -0.0161749 1 0 1 1 0 0 +EDGE2 6572 6551 -1.01344 0.0264036 0.00429655 1 0 1 1 0 0 +EDGE2 6572 6552 -0.0648206 -0.0336731 -0.00538754 1 0 1 1 0 0 +EDGE2 6572 6553 0.915455 -0.0555201 -0.00544291 1 0 1 1 0 0 +EDGE2 6573 6554 0.999157 -0.0105637 0.0307762 1 0 1 1 0 0 +EDGE2 6573 6572 -0.948137 0.0015001 -0.0341185 1 0 1 1 0 0 +EDGE2 6573 6552 -1.04838 -0.0510051 0.036092 1 0 1 1 0 0 +EDGE2 6573 6553 -0.0135074 0.0328306 -0.00530985 1 0 1 1 0 0 +EDGE2 6574 6554 0.0220782 0.0307425 0.0189462 1 0 1 1 0 0 +EDGE2 6574 6553 -0.971982 -0.0151086 -0.00195431 1 0 1 1 0 0 +EDGE2 6574 6573 -0.969649 0.037785 -0.0139834 1 0 1 1 0 0 +EDGE2 6574 6555 1.05279 -0.0113278 -0.00848698 1 0 1 1 0 0 +EDGE2 6575 6554 -1.04444 0.0603389 0.0411724 1 0 1 1 0 0 +EDGE2 6575 6574 -0.970289 0.0308217 0.0432798 1 0 1 1 0 0 +EDGE2 6575 6555 -0.0781302 0.0809938 0.0238886 1 0 1 1 0 0 +EDGE2 6575 6556 0.0563774 1.05318 1.60737 1 0 1 1 0 0 +EDGE2 6576 6557 1.00799 -0.0298971 0.0351475 1 0 1 1 0 0 +EDGE2 6576 6555 -1.00918 -0.0984071 -1.58921 1 0 1 1 0 0 +EDGE2 6576 6575 -0.981564 0.0378344 -1.59161 1 0 1 1 0 0 +EDGE2 6576 6556 -0.127282 -0.0338008 -0.00884516 1 0 1 1 0 0 +EDGE2 6577 6557 -0.0358468 0.0232706 0.00312719 1 0 1 1 0 0 +EDGE2 6577 6556 -1.03111 -0.0674857 -0.0134105 1 0 1 1 0 0 +EDGE2 6577 6576 -0.987315 0.0311552 -0.00951154 1 0 1 1 0 0 +EDGE2 6577 6558 0.977302 0.0322736 -0.0107138 1 0 1 1 0 0 +EDGE2 6578 6557 -0.906823 -0.00293199 -0.00319549 1 0 1 1 0 0 +EDGE2 6578 6577 -0.973162 0.0433261 -0.0112695 1 0 1 1 0 0 +EDGE2 6578 6558 0.00119744 0.0292426 -0.0132273 1 0 1 1 0 0 +EDGE2 6578 6559 0.961224 -0.0447821 -0.0234196 1 0 1 1 0 0 +EDGE2 6579 6558 -0.96286 -0.0037175 0.0222982 1 0 1 1 0 0 +EDGE2 6579 6578 -0.917267 0.0404599 0.000153266 1 0 1 1 0 0 +EDGE2 6579 6559 -0.0266826 0.0158908 -0.0259036 1 0 1 1 0 0 +EDGE2 6579 6560 0.983994 -0.0742794 0.00522375 1 0 1 1 0 0 +EDGE2 6580 6579 -0.951196 -0.131975 0.0248327 1 0 1 1 0 0 +EDGE2 6580 6559 -0.981266 0.0726768 -0.00145825 1 0 1 1 0 0 +EDGE2 6580 6560 0.0419377 0.0245187 0.0233851 1 0 1 1 0 0 +EDGE2 6580 6561 0.033529 1.05087 1.55731 1 0 1 1 0 0 +EDGE2 6581 6562 0.919346 0.0248146 0.00807502 1 0 1 1 0 0 +EDGE2 6581 6560 -1.05726 -0.0604825 -1.57523 1 0 1 1 0 0 +EDGE2 6581 6561 -0.00606321 -0.0506104 -0.000616621 1 0 1 1 0 0 +EDGE2 6581 6580 -1.0439 0.0387642 -1.54761 1 0 1 1 0 0 +EDGE2 6582 6562 0.00171311 0.0171267 -0.00836722 1 0 1 1 0 0 +EDGE2 6582 6563 1.00436 0.0807755 -0.00845166 1 0 1 1 0 0 +EDGE2 6582 6561 -0.9323 -0.0554863 -0.00960151 1 0 1 1 0 0 +EDGE2 6582 6581 -1.0258 -0.0114532 -0.00679024 1 0 1 1 0 0 +EDGE2 6583 6562 -0.971936 -0.0690546 -0.0169729 1 0 1 1 0 0 +EDGE2 6583 6563 -0.0243883 -0.0696999 -0.0275858 1 0 1 1 0 0 +EDGE2 6583 6564 1.02976 -0.119834 -0.0431094 1 0 1 1 0 0 +EDGE2 6583 6582 -0.99427 0.0597421 -0.014474 1 0 1 1 0 0 +EDGE2 6584 6545 1.01492 -0.02271 -3.12463 1 0 1 1 0 0 +EDGE2 6584 6565 0.976112 0.061086 0.0227826 1 0 1 1 0 0 +EDGE2 6584 6563 -0.995759 -0.016074 0.00259962 1 0 1 1 0 0 +EDGE2 6584 6583 -0.984119 -0.0550455 0.00781259 1 0 1 1 0 0 +EDGE2 6584 6564 0.0236754 -0.0113518 0.00530793 1 0 1 1 0 0 +EDGE2 6585 6545 0.0088084 0.0795093 -3.16827 1 0 1 1 0 0 +EDGE2 6585 6566 -0.0311075 1.03414 1.55658 1 0 1 1 0 0 +EDGE2 6585 6546 -0.0278951 0.991727 1.57146 1 0 1 1 0 0 +EDGE2 6585 6544 1.05792 0.0610371 -3.17183 1 0 1 1 0 0 +EDGE2 6585 6565 0.0874322 0.0585635 -0.00463226 1 0 1 1 0 0 +EDGE2 6585 6584 -0.999225 0.0531246 -0.0288277 1 0 1 1 0 0 +EDGE2 6585 6564 -0.99226 0.0606292 -0.0242436 1 0 1 1 0 0 +EDGE2 6586 6545 -1.03349 -0.104725 1.58829 1 0 1 1 0 0 +EDGE2 6586 6566 -0.0404274 0.0552245 0.00351911 1 0 1 1 0 0 +EDGE2 6586 6547 0.983155 -0.046655 -0.0149918 1 0 1 1 0 0 +EDGE2 6586 6567 1.08075 -0.00336486 0.0169676 1 0 1 1 0 0 +EDGE2 6586 6585 -1.088 0.00342871 -1.58309 1 0 1 1 0 0 +EDGE2 6586 6546 -0.0522191 0.0679792 0.0209865 1 0 1 1 0 0 +EDGE2 6586 6565 -1.02833 -0.0471281 -1.57078 1 0 1 1 0 0 +EDGE2 6587 6548 0.995971 -0.0259772 -0.0110482 1 0 1 1 0 0 +EDGE2 6587 6568 0.986853 -0.0155258 0.0268433 1 0 1 1 0 0 +EDGE2 6587 6566 -1.00653 0.0231842 -0.0183666 1 0 1 1 0 0 +EDGE2 6587 6547 -0.0971772 -0.00566436 0.00432754 1 0 1 1 0 0 +EDGE2 6587 6567 0.0288757 -0.0140737 -0.0290888 1 0 1 1 0 0 +EDGE2 6587 6586 -1.01766 0.0203493 -0.0064118 1 0 1 1 0 0 +EDGE2 6587 6546 -0.940562 0.0012898 -0.00855487 1 0 1 1 0 0 +EDGE2 6588 6549 1.02282 0.0194218 0.0166563 1 0 1 1 0 0 +EDGE2 6588 6569 1.08431 0.0133818 0.0350939 1 0 1 1 0 0 +EDGE2 6588 6548 0.00853966 -0.0148996 0.0192457 1 0 1 1 0 0 +EDGE2 6588 6568 0.0789936 0.00150995 0.0396196 1 0 1 1 0 0 +EDGE2 6588 6547 -1.03719 0.0384421 0.0198479 1 0 1 1 0 0 +EDGE2 6588 6567 -0.961292 0.00195106 0.0156524 1 0 1 1 0 0 +EDGE2 6588 6587 -0.96074 -0.0611346 -0.0130109 1 0 1 1 0 0 +EDGE2 6589 6550 0.926371 0.0397117 -0.0207536 1 0 1 1 0 0 +EDGE2 6589 6570 0.974088 0.0358648 0.00788682 1 0 1 1 0 0 +EDGE2 6589 6549 -0.150025 -0.0407578 -0.0442043 1 0 1 1 0 0 +EDGE2 6589 6569 0.0508495 -0.00476656 -0.00302583 1 0 1 1 0 0 +EDGE2 6589 6548 -0.966472 0.0472483 0.0171398 1 0 1 1 0 0 +EDGE2 6589 6568 -0.986158 0.0215646 -0.00589508 1 0 1 1 0 0 +EDGE2 6589 6588 -0.97436 0.0163665 -0.0339936 1 0 1 1 0 0 +EDGE2 6590 6571 -0.000765013 1.03777 1.55531 1 0 1 1 0 0 +EDGE2 6590 6550 -0.0140388 -0.0964293 0.0258969 1 0 1 1 0 0 +EDGE2 6590 6570 -0.0460851 -0.0192802 0.0124364 1 0 1 1 0 0 +EDGE2 6590 6551 0.0301564 1.05712 1.55091 1 0 1 1 0 0 +EDGE2 6590 6549 -1.00755 -0.0209161 -0.00821053 1 0 1 1 0 0 +EDGE2 6590 6569 -1.0619 -0.0176796 -0.018091 1 0 1 1 0 0 +EDGE2 6590 6589 -1.05888 -0.0750174 -0.0412171 1 0 1 1 0 0 +EDGE2 6591 6550 -0.973328 0.0180909 1.5586 1 0 1 1 0 0 +EDGE2 6591 6590 -1.03247 -0.00106542 1.60613 1 0 1 1 0 0 +EDGE2 6591 6570 -1.03498 0.00628797 1.57384 1 0 1 1 0 0 +EDGE2 6592 6591 -0.972465 0.0479156 -0.0432633 1 0 1 1 0 0 +EDGE2 6593 6592 -1.00214 0.0144915 -0.0139048 1 0 1 1 0 0 +EDGE2 6594 6535 1.04088 0.0970332 -3.13502 1 0 1 1 0 0 +EDGE2 6594 6593 -0.967278 -0.00441965 -0.00575924 1 0 1 1 0 0 +EDGE2 6595 6535 -0.0253305 0.04292 -3.14063 1 0 1 1 0 0 +EDGE2 6595 6534 1.087 0.0655362 -3.1329 1 0 1 1 0 0 +EDGE2 6595 6536 0.0489449 -1.0108 -1.57302 1 0 1 1 0 0 +EDGE2 6595 6594 -1.03406 0.0592612 -0.00943936 1 0 1 1 0 0 +EDGE2 6596 6535 -1.10278 -0.0453553 1.60171 1 0 1 1 0 0 +EDGE2 6596 6595 -0.973836 -0.113681 -1.56009 1 0 1 1 0 0 +EDGE2 6597 6596 -0.99366 -0.0178803 -0.0194912 1 0 1 1 0 0 +EDGE2 6598 6597 -0.907312 0.0466274 -0.0129963 1 0 1 1 0 0 +EDGE2 6599 6598 -1.08457 0.00360315 -0.00374097 1 0 1 1 0 0 +EDGE2 6600 6599 -0.933642 0.0770799 -0.00720569 1 0 1 1 0 0 +EDGE2 6601 6600 -0.947559 0.0081954 1.57192 1 0 1 1 0 0 +EDGE2 6602 6601 -0.950578 -0.0576719 0.015422 1 0 1 1 0 0 +EDGE2 6603 6602 -0.989556 0.05563 0.0076224 1 0 1 1 0 0 +EDGE2 6604 6603 -0.96889 0.0109389 -0.021986 1 0 1 1 0 0 +EDGE2 6605 6604 -1.05593 0.0592428 0.0251174 1 0 1 1 0 0 +EDGE2 6606 6605 -0.924653 -0.0100723 -1.59263 1 0 1 1 0 0 +EDGE2 6607 6606 -1.06833 0.00875984 -0.028929 1 0 1 1 0 0 +EDGE2 6608 6607 -1.07119 -0.0188534 -0.0116049 1 0 1 1 0 0 +EDGE2 6609 6608 -1.01072 0.0674371 0.00565652 1 0 1 1 0 0 +EDGE2 6610 6609 -1.07683 -0.00364314 0.0138469 1 0 1 1 0 0 +EDGE2 6611 6610 -1.03558 0.010353 -1.57281 1 0 1 1 0 0 +EDGE2 6612 6611 -1.03225 0.0823569 0.0108139 1 0 1 1 0 0 +EDGE2 6613 6612 -0.97938 -0.0502496 0.0299294 1 0 1 1 0 0 +EDGE2 6614 6613 -1.00876 0.021502 0.0121987 1 0 1 1 0 0 +EDGE2 6615 6614 -1.01676 -0.0441957 -0.0150352 1 0 1 1 0 0 +EDGE2 6616 6615 -0.984523 0.113123 -1.57605 1 0 1 1 0 0 +EDGE2 6617 6616 -1.05026 -0.0966355 -0.047681 1 0 1 1 0 0 +EDGE2 6618 6617 -0.969816 0.0695585 -0.0103821 1 0 1 1 0 0 +EDGE2 6619 6618 -0.906596 0.056958 0.0208139 1 0 1 1 0 0 +EDGE2 6619 6600 0.918018 -0.0254604 -3.12862 1 0 1 1 0 0 +EDGE2 6620 6619 -0.94743 0.0436417 0.0221973 1 0 1 1 0 0 +EDGE2 6620 6601 0.00357069 1.01364 1.56732 1 0 1 1 0 0 +EDGE2 6620 6600 -0.0588528 -0.0373115 -3.12989 1 0 1 1 0 0 +EDGE2 6620 6599 0.943709 0.0115559 -3.17461 1 0 1 1 0 0 +EDGE2 6621 6600 -1.0145 -0.0506938 -1.56791 1 0 1 1 0 0 +EDGE2 6621 6620 -0.98071 0.0049138 1.56926 1 0 1 1 0 0 +EDGE2 6622 6621 -1.02969 -0.00566899 -0.00696818 1 0 1 1 0 0 +EDGE2 6623 6622 -0.985533 0.0159731 0.00446203 1 0 1 1 0 0 +EDGE2 6624 6623 -1.04402 -0.0503096 0.017675 1 0 1 1 0 0 +EDGE2 6625 6624 -0.910242 -0.0797237 -0.0088239 1 0 1 1 0 0 +EDGE2 6626 6625 -0.940047 0.0883563 -1.54024 1 0 1 1 0 0 +EDGE2 6627 6626 -0.996419 -0.0355729 0.0173275 1 0 1 1 0 0 +EDGE2 6628 6627 -1.04541 -0.019244 0.0192914 1 0 1 1 0 0 +EDGE2 6629 6628 -0.981241 0.0168214 0.0025986 1 0 1 1 0 0 +EDGE2 6629 6550 0.978845 0.0573501 -3.14698 1 0 1 1 0 0 +EDGE2 6629 6590 0.967512 -0.0218039 -3.14417 1 0 1 1 0 0 +EDGE2 6629 6570 0.967776 -0.0314518 -3.16607 1 0 1 1 0 0 +EDGE2 6630 6571 -0.0780404 -0.955234 -1.59579 1 0 1 1 0 0 +EDGE2 6630 6550 0.00737668 -0.00917816 -3.15154 1 0 1 1 0 0 +EDGE2 6630 6629 -0.924486 -0.0397665 -0.0227528 1 0 1 1 0 0 +EDGE2 6630 6591 0.0492961 1.0301 1.59846 1 0 1 1 0 0 +EDGE2 6630 6590 0.000894318 0.0267566 -3.14119 1 0 1 1 0 0 +EDGE2 6630 6570 0.0635925 -0.0316774 -3.1484 1 0 1 1 0 0 +EDGE2 6630 6551 0.0383501 -0.942751 -1.5667 1 0 1 1 0 0 +EDGE2 6630 6549 1.0814 -0.0299761 -3.11957 1 0 1 1 0 0 +EDGE2 6630 6569 0.922531 -0.0948638 -3.18103 1 0 1 1 0 0 +EDGE2 6630 6589 1.00697 0.00598512 -3.12861 1 0 1 1 0 0 +EDGE2 6631 6592 0.980305 -0.100507 -0.00788868 1 0 1 1 0 0 +EDGE2 6631 6550 -1.02131 -0.0590186 1.57339 1 0 1 1 0 0 +EDGE2 6631 6591 0.011195 -0.0300841 0.0163477 1 0 1 1 0 0 +EDGE2 6631 6590 -1.00141 -0.0926367 1.58513 1 0 1 1 0 0 +EDGE2 6631 6630 -1.03804 0.00863474 -1.58626 1 0 1 1 0 0 +EDGE2 6631 6570 -1.00874 0.10468 1.53546 1 0 1 1 0 0 +EDGE2 6632 6631 -1.04776 -0.00413801 0.0260473 1 0 1 1 0 0 +EDGE2 6632 6593 1.05811 0.0104006 0.0100761 1 0 1 1 0 0 +EDGE2 6632 6592 -0.00931845 -0.0256584 0.00424446 1 0 1 1 0 0 +EDGE2 6632 6591 -1.05135 0.0274697 -0.0167428 1 0 1 1 0 0 +EDGE2 6633 6593 0.0586025 -0.107287 -0.00111661 1 0 1 1 0 0 +EDGE2 6633 6594 0.945347 0.0467719 -0.0112683 1 0 1 1 0 0 +EDGE2 6633 6592 -0.998111 -0.00521006 0.0097815 1 0 1 1 0 0 +EDGE2 6633 6632 -0.910366 0.0191962 0.0137671 1 0 1 1 0 0 +EDGE2 6634 6535 0.922409 -0.0674123 -3.13758 1 0 1 1 0 0 +EDGE2 6634 6595 1.00665 0.0180753 -0.0155796 1 0 1 1 0 0 +EDGE2 6634 6593 -1.07533 0.0701649 0.0360179 1 0 1 1 0 0 +EDGE2 6634 6594 -0.0466921 -0.0645149 -0.0402564 1 0 1 1 0 0 +EDGE2 6634 6633 -1.03334 -0.0746025 -0.0176037 1 0 1 1 0 0 +EDGE2 6635 6535 -0.016095 -0.0699329 -3.12655 1 0 1 1 0 0 +EDGE2 6635 6534 1.04479 -0.0523531 -3.16446 1 0 1 1 0 0 +EDGE2 6635 6596 -0.0811747 0.969815 1.53452 1 0 1 1 0 0 +EDGE2 6635 6595 -0.0123615 0.0902266 0.0287313 1 0 1 1 0 0 +EDGE2 6635 6536 0.00984833 -1.06843 -1.58247 1 0 1 1 0 0 +EDGE2 6635 6594 -0.980129 0.0489598 -0.0260127 1 0 1 1 0 0 +EDGE2 6635 6634 -1.07431 -0.00681136 0.0251898 1 0 1 1 0 0 +EDGE2 6636 6535 -0.976099 -0.076689 1.58611 1 0 1 1 0 0 +EDGE2 6636 6597 1.0937 0.0294498 -0.00813483 1 0 1 1 0 0 +EDGE2 6636 6596 0.0194729 -0.0879517 0.026263 1 0 1 1 0 0 +EDGE2 6636 6635 -1.00217 -0.00981469 -1.57187 1 0 1 1 0 0 +EDGE2 6636 6595 -0.957581 -0.0596988 -1.57932 1 0 1 1 0 0 +EDGE2 6637 6636 -1.01548 0.0321426 0.00808654 1 0 1 1 0 0 +EDGE2 6637 6598 1.06251 0.0211402 0.013245 1 0 1 1 0 0 +EDGE2 6637 6597 -0.0212588 -0.0148345 -0.0042155 1 0 1 1 0 0 +EDGE2 6637 6596 -1.1021 -0.0109273 0.0018782 1 0 1 1 0 0 +EDGE2 6638 6599 0.960506 -0.0152155 -0.00652886 1 0 1 1 0 0 +EDGE2 6638 6598 -0.0780696 -0.068046 -0.00404642 1 0 1 1 0 0 +EDGE2 6638 6597 -0.980315 0.130521 -0.0121661 1 0 1 1 0 0 +EDGE2 6638 6637 -0.974007 0.0335369 -0.0164299 1 0 1 1 0 0 +EDGE2 6639 6600 0.974902 0.0212011 0.0395035 1 0 1 1 0 0 +EDGE2 6639 6620 1.04313 -0.00986147 -3.11694 1 0 1 1 0 0 +EDGE2 6639 6599 0.032134 0.0472168 -0.0201606 1 0 1 1 0 0 +EDGE2 6639 6598 -1.07143 -0.0146729 0.0111273 1 0 1 1 0 0 +EDGE2 6639 6638 -0.988276 -0.0178465 -0.000676091 1 0 1 1 0 0 +EDGE2 6640 6619 0.899986 -0.00711284 -3.14644 1 0 1 1 0 0 +EDGE2 6640 6601 0.00992015 -1.01416 -1.56741 1 0 1 1 0 0 +EDGE2 6640 6600 -0.0267667 0.0256143 -0.0333457 1 0 1 1 0 0 +EDGE2 6640 6620 0.00556844 -0.00200222 -3.17411 1 0 1 1 0 0 +EDGE2 6640 6621 -0.0269145 1.02258 1.55459 1 0 1 1 0 0 +EDGE2 6640 6639 -1.04137 0.0213301 -0.0118833 1 0 1 1 0 0 +EDGE2 6640 6599 -1.00023 -0.0516739 -0.0261146 1 0 1 1 0 0 +EDGE2 6641 6600 -0.915417 0.038048 -1.59223 1 0 1 1 0 0 +EDGE2 6641 6620 -0.974877 -0.040698 1.57669 1 0 1 1 0 0 +EDGE2 6641 6640 -0.917026 0.0181139 -1.54629 1 0 1 1 0 0 +EDGE2 6641 6621 0.0347618 -0.026543 -0.00460718 1 0 1 1 0 0 +EDGE2 6641 6622 0.986746 -0.00621384 0.0162456 1 0 1 1 0 0 +EDGE2 6642 6621 -0.926389 -0.071556 -0.0504693 1 0 1 1 0 0 +EDGE2 6642 6641 -1.05446 0.00481811 -0.0203211 1 0 1 1 0 0 +EDGE2 6642 6622 -0.0176407 0.0930319 -0.00476136 1 0 1 1 0 0 +EDGE2 6642 6623 0.947765 -0.0406063 0.00734838 1 0 1 1 0 0 +EDGE2 6643 6642 -1.06453 -0.0279573 -0.0164084 1 0 1 1 0 0 +EDGE2 6643 6622 -1.00752 0.00529588 -0.0201979 1 0 1 1 0 0 +EDGE2 6643 6624 1.05457 -0.097211 0.00352968 1 0 1 1 0 0 +EDGE2 6643 6623 0.0146418 0.0662273 0.00411689 1 0 1 1 0 0 +EDGE2 6644 6643 -0.975644 -0.110736 0.0222569 1 0 1 1 0 0 +EDGE2 6644 6624 0.0715151 0.0227838 -0.0265524 1 0 1 1 0 0 +EDGE2 6644 6623 -1.09042 0.0050962 0.00116734 1 0 1 1 0 0 +EDGE2 6644 6625 1.02572 0.0215507 0.0189869 1 0 1 1 0 0 +EDGE2 6645 6624 -1.05362 0.0123778 -0.0308371 1 0 1 1 0 0 +EDGE2 6645 6644 -1.04425 -0.0328692 -0.0127904 1 0 1 1 0 0 +EDGE2 6645 6625 -0.0300435 -0.00394115 -0.0011499 1 0 1 1 0 0 +EDGE2 6645 6626 -0.0214633 1.03061 1.59833 1 0 1 1 0 0 +EDGE2 6646 6645 -1.04358 -0.0173067 -1.57493 1 0 1 1 0 0 +EDGE2 6646 6625 -0.993095 0.0210453 -1.55817 1 0 1 1 0 0 +EDGE2 6646 6626 -0.0862392 -0.040553 -0.0140593 1 0 1 1 0 0 +EDGE2 6646 6627 0.99172 -0.043792 -8.43026e-05 1 0 1 1 0 0 +EDGE2 6647 6626 -0.988188 -0.0169995 0.0209608 1 0 1 1 0 0 +EDGE2 6647 6646 -1.01694 -0.0736932 -0.00107977 1 0 1 1 0 0 +EDGE2 6647 6627 -0.0226258 -0.0742432 0.0170677 1 0 1 1 0 0 +EDGE2 6647 6628 1.01678 -0.030036 0.0264391 1 0 1 1 0 0 +EDGE2 6648 6627 -1.00316 0.025955 0.0318728 1 0 1 1 0 0 +EDGE2 6648 6647 -1.02869 0.0525164 0.00640451 1 0 1 1 0 0 +EDGE2 6648 6628 0.133965 -0.0675038 -0.00124343 1 0 1 1 0 0 +EDGE2 6648 6629 0.917721 0.0334392 -0.0565769 1 0 1 1 0 0 +EDGE2 6649 6628 -1.02092 -0.066508 -0.00802884 1 0 1 1 0 0 +EDGE2 6649 6648 -0.98447 -0.0490488 -0.0130645 1 0 1 1 0 0 +EDGE2 6649 6550 0.991513 -0.00754119 -3.14354 1 0 1 1 0 0 +EDGE2 6649 6629 0.00703106 -0.0395142 0.00200093 1 0 1 1 0 0 +EDGE2 6649 6590 0.906461 0.0664798 -3.14447 1 0 1 1 0 0 +EDGE2 6649 6630 1.04527 0.128903 0.0126512 1 0 1 1 0 0 +EDGE2 6649 6570 0.941086 0.0891783 -3.17119 1 0 1 1 0 0 +EDGE2 6650 6631 -0.0468885 1.06671 1.56806 1 0 1 1 0 0 +EDGE2 6650 6571 0.0145085 -1.021 -1.59602 1 0 1 1 0 0 +EDGE2 6650 6550 -0.0183812 -0.00788028 -3.1736 1 0 1 1 0 0 +EDGE2 6650 6629 -1.00943 0.0108335 -0.0159432 1 0 1 1 0 0 +EDGE2 6650 6649 -1.03219 0.0283491 0.00318209 1 0 1 1 0 0 +EDGE2 6650 6591 0.101691 1.05077 1.58778 1 0 1 1 0 0 +EDGE2 6650 6590 -0.0595533 -0.0906367 -3.1628 1 0 1 1 0 0 +EDGE2 6650 6630 0.0460979 -0.0657108 -0.0214564 1 0 1 1 0 0 +EDGE2 6650 6570 -0.0670233 0.045455 -3.14973 1 0 1 1 0 0 +EDGE2 6650 6551 0.0488709 -1.05477 -1.56293 1 0 1 1 0 0 +EDGE2 6650 6549 1.0373 0.0375923 -3.12563 1 0 1 1 0 0 +EDGE2 6650 6569 1.01038 -0.111816 -3.13867 1 0 1 1 0 0 +EDGE2 6650 6589 0.992982 0.0115855 -3.12832 1 0 1 1 0 0 +EDGE2 6651 6631 0.0155345 -0.00956115 -0.00687832 1 0 1 1 0 0 +EDGE2 6651 6592 1.00956 0.0453997 0.0289024 1 0 1 1 0 0 +EDGE2 6651 6632 0.988928 0.0224848 -0.0231779 1 0 1 1 0 0 +EDGE2 6651 6550 -1.01697 -0.0234783 1.62921 1 0 1 1 0 0 +EDGE2 6651 6591 -0.00607035 -0.0122487 -0.000438058 1 0 1 1 0 0 +EDGE2 6651 6590 -1.10186 -0.028142 1.52774 1 0 1 1 0 0 +EDGE2 6651 6630 -0.96948 -0.0449447 -1.57982 1 0 1 1 0 0 +EDGE2 6651 6650 -1.0236 0.0107333 -1.59891 1 0 1 1 0 0 +EDGE2 6651 6570 -1.04545 -0.0136439 1.53888 1 0 1 1 0 0 +EDGE2 6652 6631 -0.960851 0.0513165 -0.0491939 1 0 1 1 0 0 +EDGE2 6652 6593 0.974054 0.0656672 0.0144073 1 0 1 1 0 0 +EDGE2 6652 6633 1.03607 0.0376673 -0.0234665 1 0 1 1 0 0 +EDGE2 6652 6592 -0.0438335 0.00175296 0.0224135 1 0 1 1 0 0 +EDGE2 6652 6632 0.0431116 -0.00215281 -0.0467406 1 0 1 1 0 0 +EDGE2 6652 6651 -0.993186 -0.00532766 -0.0035589 1 0 1 1 0 0 +EDGE2 6652 6591 -0.938631 -0.00177786 0.014697 1 0 1 1 0 0 +EDGE2 6653 6593 -0.0260913 0.0480731 -0.0116727 1 0 1 1 0 0 +EDGE2 6653 6594 1.01496 -0.0369012 0.0158227 1 0 1 1 0 0 +EDGE2 6653 6634 0.945615 -0.0251674 0.0126191 1 0 1 1 0 0 +EDGE2 6653 6633 -0.0608497 -0.0134266 -0.00643937 1 0 1 1 0 0 +EDGE2 6653 6592 -0.925735 0.0595684 -0.00387705 1 0 1 1 0 0 +EDGE2 6653 6632 -0.907134 0.0916693 0.0147001 1 0 1 1 0 0 +EDGE2 6653 6652 -1.02005 0.0735843 0.0318886 1 0 1 1 0 0 +EDGE2 6654 6535 0.993079 -0.00410881 -3.1405 1 0 1 1 0 0 +EDGE2 6654 6635 1.06097 0.0412517 0.0391796 1 0 1 1 0 0 +EDGE2 6654 6595 0.940687 0.00269835 0.00789619 1 0 1 1 0 0 +EDGE2 6654 6593 -0.957691 0.00760842 0.0119923 1 0 1 1 0 0 +EDGE2 6654 6653 -0.945961 0.0344367 0.00960489 1 0 1 1 0 0 +EDGE2 6654 6594 0.0128763 0.0198383 0.0158374 1 0 1 1 0 0 +EDGE2 6654 6634 -0.0120489 -0.0760712 -0.00501185 1 0 1 1 0 0 +EDGE2 6654 6633 -1.00077 0.0323712 0.020653 1 0 1 1 0 0 +EDGE2 6655 6535 0.0316515 -0.0465498 -3.11856 1 0 1 1 0 0 +EDGE2 6655 6636 -0.017778 0.991019 1.59357 1 0 1 1 0 0 +EDGE2 6655 6534 0.951413 0.0236679 -3.12692 1 0 1 1 0 0 +EDGE2 6655 6596 0.0541815 1.03819 1.61052 1 0 1 1 0 0 +EDGE2 6655 6635 -0.0327251 0.0241345 0.0221311 1 0 1 1 0 0 +EDGE2 6655 6595 -0.0594327 0.00483012 0.00527062 1 0 1 1 0 0 +EDGE2 6655 6654 -1.01663 0.0212064 -0.00494953 1 0 1 1 0 0 +EDGE2 6655 6536 0.0364945 -0.971714 -1.57199 1 0 1 1 0 0 +EDGE2 6655 6594 -0.921112 0.0573418 -0.0142067 1 0 1 1 0 0 +EDGE2 6655 6634 -0.88369 -0.0112562 -0.023032 1 0 1 1 0 0 +EDGE2 6656 6535 -1.11706 0.00736301 -1.57352 1 0 1 1 0 0 +EDGE2 6656 6635 -1.05294 0.0855192 1.55146 1 0 1 1 0 0 +EDGE2 6656 6655 -0.969344 0.0445106 1.57879 1 0 1 1 0 0 +EDGE2 6656 6595 -0.977845 -0.0474626 1.5856 1 0 1 1 0 0 +EDGE2 6656 6536 -0.0756198 -0.0975523 0.0210961 1 0 1 1 0 0 +EDGE2 6656 6537 1.01973 0.0319187 -0.00685805 1 0 1 1 0 0 +EDGE2 6657 6536 -1.00776 -0.0406206 -0.00825625 1 0 1 1 0 0 +EDGE2 6657 6656 -1.01786 -0.00237839 0.00411987 1 0 1 1 0 0 +EDGE2 6657 6537 -0.0215597 0.0967995 -0.0198016 1 0 1 1 0 0 +EDGE2 6657 6538 0.877883 -0.0225896 0.00424602 1 0 1 1 0 0 +EDGE2 6658 6657 -0.957706 -0.0384737 0.031923 1 0 1 1 0 0 +EDGE2 6658 6537 -0.996126 -0.00472398 0.00770729 1 0 1 1 0 0 +EDGE2 6658 6539 0.957792 0.00667415 -0.0226576 1 0 1 1 0 0 +EDGE2 6658 6538 -0.0598504 -0.0898373 0.0239762 1 0 1 1 0 0 +EDGE2 6659 6658 -0.997578 -0.0426802 -0.0164318 1 0 1 1 0 0 +EDGE2 6659 6539 0.0351033 0.0345803 0.0110266 1 0 1 1 0 0 +EDGE2 6659 6538 -0.997085 -0.0165867 0.000787994 1 0 1 1 0 0 +EDGE2 6659 6540 1.00252 -0.0328636 0.0265489 1 0 1 1 0 0 +EDGE2 6660 6539 -1.04261 -0.0268927 -0.0180882 1 0 1 1 0 0 +EDGE2 6660 6659 -1.0672 0.0615721 -0.00596394 1 0 1 1 0 0 +EDGE2 6660 6541 -0.0222584 -0.98995 -1.56354 1 0 1 1 0 0 +EDGE2 6660 6540 -0.0313683 0.0141046 -0.0231824 1 0 1 1 0 0 +EDGE2 6661 6660 -1.04406 -0.022857 -1.56174 1 0 1 1 0 0 +EDGE2 6661 6540 -1.01053 0.0477141 -1.58581 1 0 1 1 0 0 +EDGE2 6662 6661 -1.1149 0.088455 -0.0231548 1 0 1 1 0 0 +EDGE2 6663 6662 -1.03249 0.0522187 -0.000616116 1 0 1 1 0 0 +EDGE2 6664 6525 1.01562 -0.0154202 -3.13545 1 0 1 1 0 0 +EDGE2 6664 6663 -0.960444 -0.0592867 0.00819708 1 0 1 1 0 0 +EDGE2 6665 6526 0.0139684 0.971375 1.57345 1 0 1 1 0 0 +EDGE2 6665 6524 0.98608 -0.00711419 -3.12444 1 0 1 1 0 0 +EDGE2 6665 6525 -0.110121 -0.00335072 -3.1716 1 0 1 1 0 0 +EDGE2 6665 6664 -1.00608 0.0532793 0.0165848 1 0 1 1 0 0 +EDGE2 6666 6527 0.882524 -0.0276056 -0.0203211 1 0 1 1 0 0 +EDGE2 6666 6526 0.00143192 -0.0294845 -0.0156515 1 0 1 1 0 0 +EDGE2 6666 6525 -1.00221 0.0262414 1.60661 1 0 1 1 0 0 +EDGE2 6666 6665 -1.00658 -0.0848684 -1.5715 1 0 1 1 0 0 +EDGE2 6667 6528 0.89986 0.102594 -0.0619839 1 0 1 1 0 0 +EDGE2 6667 6666 -0.950455 0.00287799 -0.0225472 1 0 1 1 0 0 +EDGE2 6667 6527 0.00483471 0.0283992 -0.0309321 1 0 1 1 0 0 +EDGE2 6667 6526 -1.00123 -0.0222031 -0.0234553 1 0 1 1 0 0 +EDGE2 6668 6529 1.03234 -0.0519215 -0.00327863 1 0 1 1 0 0 +EDGE2 6668 6667 -0.980772 -0.0137036 -0.0124044 1 0 1 1 0 0 +EDGE2 6668 6528 -0.0596689 -0.000672338 -0.0318773 1 0 1 1 0 0 +EDGE2 6668 6527 -1.00228 -0.0151394 -0.0229544 1 0 1 1 0 0 +EDGE2 6669 6529 0.030681 0.106965 0.00170818 1 0 1 1 0 0 +EDGE2 6669 6530 1.00713 -0.0109459 0.0254267 1 0 1 1 0 0 +EDGE2 6669 6528 -0.914898 0.0420547 0.0184613 1 0 1 1 0 0 +EDGE2 6669 6668 -0.96519 -0.00801216 -0.0502577 1 0 1 1 0 0 +EDGE2 6670 6529 -0.925398 -0.00818008 -0.00189121 1 0 1 1 0 0 +EDGE2 6670 6669 -0.995097 -0.0192149 -0.00905692 1 0 1 1 0 0 +EDGE2 6670 6530 0.0926632 0.0991458 0.00992262 1 0 1 1 0 0 +EDGE2 6670 6531 0.0471445 0.947489 1.55703 1 0 1 1 0 0 +EDGE2 6671 6530 -0.986423 0.0835033 -1.55077 1 0 1 1 0 0 +EDGE2 6671 6670 -0.972099 -0.0180996 -1.5965 1 0 1 1 0 0 +EDGE2 6671 6531 -0.0406669 -0.026958 -0.0130543 1 0 1 1 0 0 +EDGE2 6671 6532 1.04693 -0.0806634 -0.00999368 1 0 1 1 0 0 +EDGE2 6672 6531 -0.992785 -0.0591209 -4.81702e-05 1 0 1 1 0 0 +EDGE2 6672 6671 -0.972976 0.047665 0.0039614 1 0 1 1 0 0 +EDGE2 6672 6532 -0.0327672 -0.0249713 -0.0343947 1 0 1 1 0 0 +EDGE2 6672 6533 1.06301 0.0534394 -0.00309145 1 0 1 1 0 0 +EDGE2 6673 6672 -1.03086 -0.0245329 -0.0270202 1 0 1 1 0 0 +EDGE2 6673 6532 -0.96043 0.0390682 -0.00263988 1 0 1 1 0 0 +EDGE2 6673 6533 -0.0427404 0.0252925 -0.00494374 1 0 1 1 0 0 +EDGE2 6673 6534 0.976371 0.0584413 0.00945253 1 0 1 1 0 0 +EDGE2 6674 6535 0.987852 0.0022803 -0.000411492 1 0 1 1 0 0 +EDGE2 6674 6673 -1.01513 0.00170503 -0.00737735 1 0 1 1 0 0 +EDGE2 6674 6533 -1.02823 -0.0371842 0.0318998 1 0 1 1 0 0 +EDGE2 6674 6534 0.0608405 -0.0988646 0.00364419 1 0 1 1 0 0 +EDGE2 6674 6635 1.05922 -0.0122011 -3.13739 1 0 1 1 0 0 +EDGE2 6674 6655 0.99951 -0.0200148 -3.14233 1 0 1 1 0 0 +EDGE2 6674 6595 1.02845 -0.000744979 -3.14974 1 0 1 1 0 0 +EDGE2 6675 6535 -0.000845077 -0.0502816 -0.019543 1 0 1 1 0 0 +EDGE2 6675 6636 0.0926551 -1.07433 -1.5737 1 0 1 1 0 0 +EDGE2 6675 6534 -0.948426 0.0158898 -0.0132447 1 0 1 1 0 0 +EDGE2 6675 6596 -0.00416862 -1.0446 -1.55534 1 0 1 1 0 0 +EDGE2 6675 6674 -1.06343 0.0187668 -0.00395432 1 0 1 1 0 0 +EDGE2 6675 6635 0.0817647 0.00146117 -3.19716 1 0 1 1 0 0 +EDGE2 6675 6655 -0.0591612 -0.0258204 -3.15884 1 0 1 1 0 0 +EDGE2 6675 6595 0.133962 -0.0848205 -3.14394 1 0 1 1 0 0 +EDGE2 6675 6654 0.908963 0.105718 -3.12832 1 0 1 1 0 0 +EDGE2 6675 6536 0.0678927 1.04867 1.60722 1 0 1 1 0 0 +EDGE2 6675 6656 -0.0431336 1.04776 1.57624 1 0 1 1 0 0 +EDGE2 6675 6594 1.0186 0.00320009 -3.14553 1 0 1 1 0 0 +EDGE2 6675 6634 0.997842 -0.033024 -3.15539 1 0 1 1 0 0 +EDGE2 6676 6535 -1.01095 -0.0404402 1.5817 1 0 1 1 0 0 +EDGE2 6676 6636 -0.0250491 -0.0328067 -0.0506481 1 0 1 1 0 0 +EDGE2 6676 6597 1.02148 -0.0289353 -0.0304612 1 0 1 1 0 0 +EDGE2 6676 6637 0.97304 0.0321491 -0.035161 1 0 1 1 0 0 +EDGE2 6676 6675 -1.01793 -0.020203 1.53365 1 0 1 1 0 0 +EDGE2 6676 6596 0.000300893 0.00804072 -0.0232178 1 0 1 1 0 0 +EDGE2 6676 6635 -0.884582 0.0102212 -1.55368 1 0 1 1 0 0 +EDGE2 6676 6655 -0.96622 0.0922364 -1.58498 1 0 1 1 0 0 +EDGE2 6676 6595 -0.95959 -0.0548006 -1.58225 1 0 1 1 0 0 +EDGE2 6677 6636 -1.00024 0.130425 0.00069498 1 0 1 1 0 0 +EDGE2 6677 6598 1.0111 -0.0283735 -0.0125745 1 0 1 1 0 0 +EDGE2 6677 6638 0.958815 0.031502 -0.0267898 1 0 1 1 0 0 +EDGE2 6677 6597 0.0138103 -0.00070952 0.00179242 1 0 1 1 0 0 +EDGE2 6677 6637 0.0206614 -0.0673232 0.0147165 1 0 1 1 0 0 +EDGE2 6677 6676 -1.10287 -0.0668214 0.00589571 1 0 1 1 0 0 +EDGE2 6677 6596 -0.931598 -0.015584 -0.0161255 1 0 1 1 0 0 +EDGE2 6678 6677 -0.96902 -0.041381 -0.00552908 1 0 1 1 0 0 +EDGE2 6678 6639 1.05551 0.0117386 -0.0157955 1 0 1 1 0 0 +EDGE2 6678 6599 1.0332 0.0194188 -0.0219183 1 0 1 1 0 0 +EDGE2 6678 6598 -0.0452131 -0.0711266 0.0015502 1 0 1 1 0 0 +EDGE2 6678 6638 0.0465618 -0.069051 0.012888 1 0 1 1 0 0 +EDGE2 6678 6597 -1.0289 0.0630792 -0.000945068 1 0 1 1 0 0 +EDGE2 6678 6637 -0.995235 0.0300157 -0.00505784 1 0 1 1 0 0 +EDGE2 6679 6600 0.98051 0.0247647 0.00178606 1 0 1 1 0 0 +EDGE2 6679 6620 0.909418 -0.00990768 -3.13637 1 0 1 1 0 0 +EDGE2 6679 6640 0.940766 0.00265377 -0.00520943 1 0 1 1 0 0 +EDGE2 6679 6639 -0.0299491 -0.0485188 0.0190759 1 0 1 1 0 0 +EDGE2 6679 6599 -0.0145439 -0.0359097 0.029327 1 0 1 1 0 0 +EDGE2 6679 6598 -1.04419 -0.0717614 -0.00968958 1 0 1 1 0 0 +EDGE2 6679 6638 -0.943385 0.0729391 0.00684357 1 0 1 1 0 0 +EDGE2 6679 6678 -0.984507 0.0501838 -0.0114971 1 0 1 1 0 0 +EDGE2 6680 6619 1.02179 0.0567919 -3.1375 1 0 1 1 0 0 +EDGE2 6680 6601 -0.0909282 -0.987394 -1.56899 1 0 1 1 0 0 +EDGE2 6680 6600 -0.0182977 0.0207944 -0.00365422 1 0 1 1 0 0 +EDGE2 6680 6620 -0.0281657 -0.0794652 -3.20512 1 0 1 1 0 0 +EDGE2 6680 6640 -0.0126129 0.0307395 -0.00815112 1 0 1 1 0 0 +EDGE2 6680 6621 0.0526816 0.956118 1.56392 1 0 1 1 0 0 +EDGE2 6680 6641 0.0253878 1.00754 1.56889 1 0 1 1 0 0 +EDGE2 6680 6639 -0.926938 0.00892926 0.019782 1 0 1 1 0 0 +EDGE2 6680 6679 -0.996632 -0.00849558 -0.0122099 1 0 1 1 0 0 +EDGE2 6680 6599 -0.983804 0.0128721 0.00658694 1 0 1 1 0 0 +EDGE2 6681 6680 -1.0367 -0.0046709 -1.56568 1 0 1 1 0 0 +EDGE2 6681 6600 -0.975727 -0.0423837 -1.54234 1 0 1 1 0 0 +EDGE2 6681 6620 -1.00124 0.0513827 1.55719 1 0 1 1 0 0 +EDGE2 6681 6640 -1.10454 0.127116 -1.58017 1 0 1 1 0 0 +EDGE2 6681 6642 0.924387 -0.0891103 0.0112549 1 0 1 1 0 0 +EDGE2 6681 6621 -0.0526482 0.0238324 -0.00169233 1 0 1 1 0 0 +EDGE2 6681 6641 -0.00955494 -0.0497574 -0.0245423 1 0 1 1 0 0 +EDGE2 6681 6622 1.04223 0.0890111 -0.0363438 1 0 1 1 0 0 +EDGE2 6682 6643 0.933006 0.0222862 0.0222254 1 0 1 1 0 0 +EDGE2 6682 6681 -1.07814 0.011458 0.0312368 1 0 1 1 0 0 +EDGE2 6682 6642 -0.0425306 -0.00310774 -0.0102892 1 0 1 1 0 0 +EDGE2 6682 6621 -1.01036 -0.0674759 -0.0379549 1 0 1 1 0 0 +EDGE2 6682 6641 -0.945467 0.0314326 -0.0148284 1 0 1 1 0 0 +EDGE2 6682 6622 -0.133182 0.0459612 0.00802228 1 0 1 1 0 0 +EDGE2 6682 6623 1.00906 -0.0158771 0.00795669 1 0 1 1 0 0 +EDGE2 6683 6643 -0.00500982 -0.00353806 0.00613307 1 0 1 1 0 0 +EDGE2 6683 6642 -1.00832 0.000997108 -0.0300776 1 0 1 1 0 0 +EDGE2 6683 6682 -0.928192 -0.0386227 -0.011246 1 0 1 1 0 0 +EDGE2 6683 6622 -1.04244 0.0634946 0.00330208 1 0 1 1 0 0 +EDGE2 6683 6624 1.0298 -0.0613226 -0.00081856 1 0 1 1 0 0 +EDGE2 6683 6623 0.0530585 0.0122329 -0.00175619 1 0 1 1 0 0 +EDGE2 6683 6644 0.89835 -0.0392132 -0.0370661 1 0 1 1 0 0 +EDGE2 6684 6643 -0.951594 -0.0403665 0.00359168 1 0 1 1 0 0 +EDGE2 6684 6683 -0.901793 0.0181669 0.0222886 1 0 1 1 0 0 +EDGE2 6684 6624 0.0481188 0.0522075 -0.00697717 1 0 1 1 0 0 +EDGE2 6684 6623 -0.980656 0.00422627 0.0104128 1 0 1 1 0 0 +EDGE2 6684 6644 0.0463156 -0.0124986 -0.00632417 1 0 1 1 0 0 +EDGE2 6684 6645 1.04451 -0.0326724 0.0239682 1 0 1 1 0 0 +EDGE2 6684 6625 0.994871 0.0957732 0.0380526 1 0 1 1 0 0 +EDGE2 6685 6624 -0.963735 -0.00546382 0.0330214 1 0 1 1 0 0 +EDGE2 6685 6684 -1.06625 0.0255384 0.00618837 1 0 1 1 0 0 +EDGE2 6685 6644 -1.03984 0.0658865 0.0301641 1 0 1 1 0 0 +EDGE2 6685 6645 0.0254772 -0.0138583 0.0025183 1 0 1 1 0 0 +EDGE2 6685 6625 0.00350108 0.0303267 -0.0171998 1 0 1 1 0 0 +EDGE2 6685 6626 -0.0652147 0.993995 1.55671 1 0 1 1 0 0 +EDGE2 6685 6646 -0.0297673 0.979601 1.57255 1 0 1 1 0 0 +EDGE2 6686 6645 -0.88706 0.0421254 -1.58138 1 0 1 1 0 0 +EDGE2 6686 6685 -1.06853 -0.0599196 -1.58217 1 0 1 1 0 0 +EDGE2 6686 6625 -0.981532 -0.00402304 -1.55581 1 0 1 1 0 0 +EDGE2 6686 6626 -0.0141398 -0.00814049 0.00740882 1 0 1 1 0 0 +EDGE2 6686 6646 -0.0573897 -0.0521141 0.0258747 1 0 1 1 0 0 +EDGE2 6686 6627 1.02621 -0.0577586 -0.0108921 1 0 1 1 0 0 +EDGE2 6686 6647 1.0023 -0.0816292 -0.000304717 1 0 1 1 0 0 +EDGE2 6687 6686 -1.0538 -0.0134302 -0.0124664 1 0 1 1 0 0 +EDGE2 6687 6626 -1.04521 -0.108572 0.00707498 1 0 1 1 0 0 +EDGE2 6687 6646 -1.02275 -0.0423805 -0.0200218 1 0 1 1 0 0 +EDGE2 6687 6627 -0.0430882 -0.023753 7.07981e-05 1 0 1 1 0 0 +EDGE2 6687 6647 0.00694346 -0.0752338 0.0252234 1 0 1 1 0 0 +EDGE2 6687 6628 0.991093 -0.0387592 0.0010423 1 0 1 1 0 0 +EDGE2 6687 6648 1.01519 0.0293266 -0.00331039 1 0 1 1 0 0 +EDGE2 6688 6627 -0.984217 -0.0769248 0.0188517 1 0 1 1 0 0 +EDGE2 6688 6647 -1.02098 0.0426806 -0.0116989 1 0 1 1 0 0 +EDGE2 6688 6687 -1.00079 -0.0333847 0.0413022 1 0 1 1 0 0 +EDGE2 6688 6628 0.0363344 -0.0445355 -0.0195469 1 0 1 1 0 0 +EDGE2 6688 6648 0.0693854 -0.0606473 -0.0168323 1 0 1 1 0 0 +EDGE2 6688 6629 1.02847 0.0528812 -0.0141779 1 0 1 1 0 0 +EDGE2 6688 6649 0.991341 -0.0543164 -0.020509 1 0 1 1 0 0 +EDGE2 6689 6628 -0.971484 -0.0424393 -0.0302669 1 0 1 1 0 0 +EDGE2 6689 6648 -0.902502 0.0366962 0.0132323 1 0 1 1 0 0 +EDGE2 6689 6688 -1.02711 0.0326856 0.0106183 1 0 1 1 0 0 +EDGE2 6689 6550 1.04268 0.00824892 -3.12189 1 0 1 1 0 0 +EDGE2 6689 6629 0.0138518 0.0587292 -0.00831957 1 0 1 1 0 0 +EDGE2 6689 6649 -0.0131195 -0.0485166 -0.0143054 1 0 1 1 0 0 +EDGE2 6689 6590 0.973205 -0.0287235 -3.14092 1 0 1 1 0 0 +EDGE2 6689 6630 0.922879 0.0437737 -0.0185097 1 0 1 1 0 0 +EDGE2 6689 6650 1.02714 -0.0372916 -0.0194267 1 0 1 1 0 0 +EDGE2 6689 6570 1.00768 0.00826765 -3.15508 1 0 1 1 0 0 +EDGE2 6690 6631 -0.0499398 1.09942 1.59096 1 0 1 1 0 0 +EDGE2 6690 6651 -0.031867 1.00841 1.55675 1 0 1 1 0 0 +EDGE2 6690 6571 -0.00293494 -0.960077 -1.58954 1 0 1 1 0 0 +EDGE2 6690 6550 0.0320027 0.0383274 -3.14138 1 0 1 1 0 0 +EDGE2 6690 6629 -0.90684 0.0384348 0.0244436 1 0 1 1 0 0 +EDGE2 6690 6649 -0.990212 0.0221589 -0.0184219 1 0 1 1 0 0 +EDGE2 6690 6689 -1.01325 0.0656376 -0.0251676 1 0 1 1 0 0 +EDGE2 6690 6591 0.0868872 0.991918 1.54664 1 0 1 1 0 0 +EDGE2 6690 6590 0.0212939 -0.05311 -3.13102 1 0 1 1 0 0 +EDGE2 6690 6630 -0.00840943 0.0554375 -0.0506672 1 0 1 1 0 0 +EDGE2 6690 6650 0.0961076 0.000152303 -0.021773 1 0 1 1 0 0 +EDGE2 6690 6570 -0.00818313 -0.00281522 -3.14655 1 0 1 1 0 0 +EDGE2 6690 6551 0.0355251 -0.871445 -1.57491 1 0 1 1 0 0 +EDGE2 6690 6549 0.987306 0.0105266 -3.17312 1 0 1 1 0 0 +EDGE2 6690 6569 0.991274 0.0121075 -3.13628 1 0 1 1 0 0 +EDGE2 6690 6589 1.07353 -0.00227959 -3.1186 1 0 1 1 0 0 +EDGE2 6691 6571 0.0665441 -0.0147761 0.0111764 1 0 1 1 0 0 +EDGE2 6691 6550 -0.955364 0.0749361 -1.58352 1 0 1 1 0 0 +EDGE2 6691 6690 -1.01531 0.0643547 1.5671 1 0 1 1 0 0 +EDGE2 6691 6590 -0.977623 0.00863741 -1.525 1 0 1 1 0 0 +EDGE2 6691 6630 -0.942724 0.0392182 1.54441 1 0 1 1 0 0 +EDGE2 6691 6650 -0.958931 0.0605814 1.56722 1 0 1 1 0 0 +EDGE2 6691 6570 -0.94527 -0.0115975 -1.54532 1 0 1 1 0 0 +EDGE2 6691 6572 1.00599 -0.00341486 0.00814413 1 0 1 1 0 0 +EDGE2 6691 6551 0.0169399 0.0520155 0.0175049 1 0 1 1 0 0 +EDGE2 6691 6552 1.07846 0.030998 -0.0169619 1 0 1 1 0 0 +EDGE2 6692 6571 -0.98703 -0.0540537 0.0105544 1 0 1 1 0 0 +EDGE2 6692 6691 -0.970995 0.0373696 -0.0358129 1 0 1 1 0 0 +EDGE2 6692 6572 0.0483864 0.0757531 0.000919219 1 0 1 1 0 0 +EDGE2 6692 6551 -0.9795 -0.0208941 0.0091874 1 0 1 1 0 0 +EDGE2 6692 6552 -0.0349682 -0.0721254 0.00954717 1 0 1 1 0 0 +EDGE2 6692 6553 0.979699 0.0830284 -0.012088 1 0 1 1 0 0 +EDGE2 6692 6573 0.993067 -0.0248925 -0.0277461 1 0 1 1 0 0 +EDGE2 6693 6554 1.10825 -0.0195267 0.00888601 1 0 1 1 0 0 +EDGE2 6693 6572 -0.996804 -0.001665 0.0048807 1 0 1 1 0 0 +EDGE2 6693 6692 -1.00917 -0.0326617 0.0159987 1 0 1 1 0 0 +EDGE2 6693 6552 -0.981763 -0.0204121 0.0232771 1 0 1 1 0 0 +EDGE2 6693 6553 -0.0357649 -0.0125204 0.00448599 1 0 1 1 0 0 +EDGE2 6693 6573 0.112547 0.0103087 -0.0192006 1 0 1 1 0 0 +EDGE2 6693 6574 1.02943 0.118652 0.0261405 1 0 1 1 0 0 +EDGE2 6694 6554 -0.0398397 0.0213405 0.0278892 1 0 1 1 0 0 +EDGE2 6694 6693 -0.98583 0.0408119 -0.00731576 1 0 1 1 0 0 +EDGE2 6694 6553 -0.968224 -0.00383578 0.0257316 1 0 1 1 0 0 +EDGE2 6694 6573 -1.01415 0.0457325 -0.00576254 1 0 1 1 0 0 +EDGE2 6694 6574 0.0102821 0.0547644 0.0230596 1 0 1 1 0 0 +EDGE2 6694 6555 1.08091 0.0517055 0.0212313 1 0 1 1 0 0 +EDGE2 6694 6575 0.981164 -0.0296319 -0.00462633 1 0 1 1 0 0 +EDGE2 6695 6554 -0.933485 -0.0532611 -0.0176347 1 0 1 1 0 0 +EDGE2 6695 6694 -1.00645 7.33011e-05 -0.0207081 1 0 1 1 0 0 +EDGE2 6695 6574 -0.986706 -0.0292318 -0.0126711 1 0 1 1 0 0 +EDGE2 6695 6555 0.0318857 -0.0386887 -0.00889606 1 0 1 1 0 0 +EDGE2 6695 6575 0.0172138 -0.028064 0.013809 1 0 1 1 0 0 +EDGE2 6695 6556 -0.034962 1.04402 1.54473 1 0 1 1 0 0 +EDGE2 6695 6576 0.0417397 0.945506 1.57117 1 0 1 1 0 0 +EDGE2 6696 6555 -0.958479 0.0550978 1.56234 1 0 1 1 0 0 +EDGE2 6696 6575 -1.0811 0.0657432 1.57643 1 0 1 1 0 0 +EDGE2 6696 6695 -0.985812 -0.0360146 1.59933 1 0 1 1 0 0 +EDGE2 6697 6696 -0.966965 0.00850442 0.000402099 1 0 1 1 0 0 +EDGE2 6698 6697 -1.06662 0.0029468 -0.025819 1 0 1 1 0 0 +EDGE2 6699 6698 -1.00746 0.00919402 0.0265569 1 0 1 1 0 0 +EDGE2 6700 6699 -0.975617 -0.00522565 0.00829747 1 0 1 1 0 0 +EDGE2 6701 6700 -1.00921 0.0791421 -1.626 1 0 1 1 0 0 +EDGE2 6702 6701 -0.883786 0.00773717 0.0431122 1 0 1 1 0 0 +EDGE2 6703 6702 -1.08052 0.0297723 -0.00880178 1 0 1 1 0 0 +EDGE2 6704 6703 -0.989235 -0.0772525 0.0240014 1 0 1 1 0 0 +EDGE2 6705 6704 -1.00432 0.0819087 -0.00376948 1 0 1 1 0 0 +EDGE2 6706 6705 -0.970821 0.0803442 -1.59186 1 0 1 1 0 0 +EDGE2 6707 6706 -1.09361 -0.0397151 0.0056825 1 0 1 1 0 0 +EDGE2 6708 6707 -1.02094 0.0213852 -0.0214025 1 0 1 1 0 0 +EDGE2 6709 6708 -0.90961 0.06859 -0.00990609 1 0 1 1 0 0 +EDGE2 6710 6709 -0.931248 0.00848462 -0.00876746 1 0 1 1 0 0 +EDGE2 6711 6710 -0.978718 -0.0262586 1.56515 1 0 1 1 0 0 +EDGE2 6712 6711 -1.01395 0.0297799 0.028936 1 0 1 1 0 0 +EDGE2 6713 6712 -1.03127 -0.00159609 -0.000862688 1 0 1 1 0 0 +EDGE2 6714 6713 -1.01065 0.0531632 -0.0150101 1 0 1 1 0 0 +EDGE2 6715 6714 -0.960276 0.0231712 -0.00795016 1 0 1 1 0 0 +EDGE2 6716 6715 -1.01093 0.0274791 1.6205 1 0 1 1 0 0 +EDGE2 6717 6716 -0.986625 -0.0159063 0.00748882 1 0 1 1 0 0 +EDGE2 6718 6717 -1.02349 0.0746753 -0.0395513 1 0 1 1 0 0 +EDGE2 6719 6718 -0.928937 0.0143078 -0.00490033 1 0 1 1 0 0 +EDGE2 6720 6719 -0.975427 -0.0670375 -0.0178961 1 0 1 1 0 0 +EDGE2 6721 6720 -1.07659 -0.0473814 -1.54225 1 0 1 1 0 0 +EDGE2 6722 6721 -0.986237 0.031996 0.00375894 1 0 1 1 0 0 +EDGE2 6723 6722 -1.01425 -0.0571399 -0.00500602 1 0 1 1 0 0 +EDGE2 6724 6723 -0.941113 0.0699007 -0.0443872 1 0 1 1 0 0 +EDGE2 6725 6724 -1.01504 0.0407064 -0.00547503 1 0 1 1 0 0 +EDGE2 6726 6725 -0.989671 0.0343744 -1.54467 1 0 1 1 0 0 +EDGE2 6727 6726 -1.01526 -0.0104078 -0.0144867 1 0 1 1 0 0 +EDGE2 6728 6727 -1.00411 -0.0533612 0.0149912 1 0 1 1 0 0 +EDGE2 6729 6728 -1.06895 0.054604 0.0285778 1 0 1 1 0 0 +EDGE2 6730 6729 -0.936162 -0.0731721 -0.0223986 1 0 1 1 0 0 +EDGE2 6731 6730 -1.05299 0.00632549 -1.56696 1 0 1 1 0 0 +EDGE2 6732 6731 -0.955663 0.0201099 -0.0243012 1 0 1 1 0 0 +EDGE2 6733 6732 -1.00616 -0.143889 0.017524 1 0 1 1 0 0 +EDGE2 6734 6715 1.03662 0.0528415 -3.1412 1 0 1 1 0 0 +EDGE2 6734 6733 -0.992296 0.0477707 0.0086754 1 0 1 1 0 0 +EDGE2 6735 6716 0.0216741 0.934078 1.57603 1 0 1 1 0 0 +EDGE2 6735 6715 -0.010603 0.0619426 -3.14902 1 0 1 1 0 0 +EDGE2 6735 6714 1.02439 -0.0733113 -3.17207 1 0 1 1 0 0 +EDGE2 6735 6734 -1.01844 -0.0181994 0.0124582 1 0 1 1 0 0 +EDGE2 6736 6717 0.888012 -0.0485045 -0.0114461 1 0 1 1 0 0 +EDGE2 6736 6716 -0.0102489 -0.0195971 -0.000529096 1 0 1 1 0 0 +EDGE2 6736 6715 -0.88303 -0.062312 1.55369 1 0 1 1 0 0 +EDGE2 6736 6735 -0.959315 0.0441898 -1.56491 1 0 1 1 0 0 +EDGE2 6737 6718 0.976911 -0.0713401 0.0305547 1 0 1 1 0 0 +EDGE2 6737 6717 -0.00711288 0.00358894 -0.0234282 1 0 1 1 0 0 +EDGE2 6737 6716 -1.03418 0.0693507 -0.0289356 1 0 1 1 0 0 +EDGE2 6737 6736 -0.935248 -0.0390683 -0.00450633 1 0 1 1 0 0 +EDGE2 6738 6718 0.0748083 0.0314791 0.0569239 1 0 1 1 0 0 +EDGE2 6738 6719 1.00493 0.0634779 0.0447538 1 0 1 1 0 0 +EDGE2 6738 6737 -1.03338 -0.0738105 0.0173875 1 0 1 1 0 0 +EDGE2 6738 6717 -0.954097 -0.000304527 0.0110672 1 0 1 1 0 0 +EDGE2 6739 6720 1.0668 -0.0595358 -0.0137165 1 0 1 1 0 0 +EDGE2 6739 6718 -0.969011 -0.0463664 0.00725562 1 0 1 1 0 0 +EDGE2 6739 6719 -0.0534692 0.0258367 0.00133419 1 0 1 1 0 0 +EDGE2 6739 6738 -1.06175 0.0357262 -0.00638838 1 0 1 1 0 0 +EDGE2 6740 6739 -1.0841 0.0308638 -0.0394113 1 0 1 1 0 0 +EDGE2 6740 6720 -0.0291201 -0.0378244 0.0193313 1 0 1 1 0 0 +EDGE2 6740 6721 -0.0320788 1.04476 1.55021 1 0 1 1 0 0 +EDGE2 6740 6719 -0.916261 -0.0789059 -0.0191056 1 0 1 1 0 0 +EDGE2 6741 6720 -1.03303 -0.0320341 1.5869 1 0 1 1 0 0 +EDGE2 6741 6740 -1.00447 -0.00407224 1.57074 1 0 1 1 0 0 +EDGE2 6742 6741 -0.982463 -0.00534417 0.00749437 1 0 1 1 0 0 +EDGE2 6743 6742 -1.0922 0.0546597 -0.00922289 1 0 1 1 0 0 +EDGE2 6744 6705 0.958444 -0.0452485 -3.15307 1 0 1 1 0 0 +EDGE2 6744 6743 -1.04203 -0.0243695 0.000133019 1 0 1 1 0 0 +EDGE2 6745 6704 1.06841 -0.0115788 -3.08691 1 0 1 1 0 0 +EDGE2 6745 6705 0.0324048 -0.024554 -3.1575 1 0 1 1 0 0 +EDGE2 6745 6744 -0.971317 0.0559842 0.012211 1 0 1 1 0 0 +EDGE2 6745 6706 -0.0523206 -1.06478 -1.55071 1 0 1 1 0 0 +EDGE2 6746 6705 -1.08007 0.0476965 1.57481 1 0 1 1 0 0 +EDGE2 6746 6745 -1.06244 0.020436 -1.60128 1 0 1 1 0 0 +EDGE2 6747 6746 -1.00224 0.0112748 0.0102402 1 0 1 1 0 0 +EDGE2 6748 6747 -0.98818 0.0498613 -0.0299997 1 0 1 1 0 0 +EDGE2 6749 6748 -0.940301 0.0561956 -0.0147279 1 0 1 1 0 0 +EDGE2 6750 6749 -0.986611 -0.00812655 -0.00953656 1 0 1 1 0 0 +EDGE2 6751 6750 -0.980455 0.0286109 1.53972 1 0 1 1 0 0 +EDGE2 6752 6751 -0.975539 -0.010705 -0.0181944 1 0 1 1 0 0 +EDGE2 6753 6752 -0.928189 -0.00912683 0.0083042 1 0 1 1 0 0 +EDGE2 6754 6753 -1.031 -0.0216435 -0.019688 1 0 1 1 0 0 +EDGE2 6755 6754 -0.973496 0.0609743 -0.0042924 1 0 1 1 0 0 +EDGE2 6756 6755 -0.984005 0.0438784 -1.55743 1 0 1 1 0 0 +EDGE2 6757 6756 -0.970677 -0.0584154 0.00172556 1 0 1 1 0 0 +EDGE2 6758 6757 -1.01841 -0.0774321 0.00503884 1 0 1 1 0 0 +EDGE2 6759 6758 -0.999978 0.027914 0.0169283 1 0 1 1 0 0 +EDGE2 6760 6759 -0.95092 0.0189056 -0.00659301 1 0 1 1 0 0 +EDGE2 6761 6760 -1.05462 -0.0563588 -1.60805 1 0 1 1 0 0 +EDGE2 6762 6761 -0.931189 0.00203352 -0.00572225 1 0 1 1 0 0 +EDGE2 6763 6762 -0.974431 0.0645465 0.030365 1 0 1 1 0 0 +EDGE2 6764 6763 -1.0323 0.0201501 0.00871601 1 0 1 1 0 0 +EDGE2 6765 6764 -0.993507 -0.0141769 -0.000989896 1 0 1 1 0 0 +EDGE2 6766 6765 -0.909564 -0.0422909 1.57727 1 0 1 1 0 0 +EDGE2 6767 6766 -1.04132 -0.0158413 -0.0201887 1 0 1 1 0 0 +EDGE2 6768 6767 -1.07844 0.0475554 -0.0373954 1 0 1 1 0 0 +EDGE2 6769 6768 -0.971435 0.0607018 0.0261701 1 0 1 1 0 0 +EDGE2 6770 6769 -0.986607 -0.0552595 -0.0167 1 0 1 1 0 0 +EDGE2 6771 6770 -0.942964 -0.00526883 -1.58093 1 0 1 1 0 0 +EDGE2 6772 6771 -1.03231 0.0141757 -0.00949484 1 0 1 1 0 0 +EDGE2 6773 6772 -0.9949 -0.0371795 0.0294803 1 0 1 1 0 0 +EDGE2 6774 6773 -1.01361 -0.0406845 0.0507202 1 0 1 1 0 0 +EDGE2 6775 6774 -0.888008 -0.0799015 0.0248196 1 0 1 1 0 0 +EDGE2 6776 6775 -1.00295 -0.0995987 -1.55432 1 0 1 1 0 0 +EDGE2 6777 6776 -0.95001 0.020308 -0.00272148 1 0 1 1 0 0 +EDGE2 6778 6777 -0.981897 0.00311459 0.015056 1 0 1 1 0 0 +EDGE2 6779 6778 -0.984105 -0.104822 -0.0119397 1 0 1 1 0 0 +EDGE2 6780 6779 -1.03448 -0.0104511 0.021987 1 0 1 1 0 0 +EDGE2 6781 6780 -1.01202 -0.0850321 -1.56259 1 0 1 1 0 0 +EDGE2 6782 6781 -0.945339 -0.0297623 -0.0270994 1 0 1 1 0 0 +EDGE2 6783 6782 -1.03705 -0.0414108 0.0191185 1 0 1 1 0 0 +EDGE2 6784 6765 0.917689 0.132895 -3.11033 1 0 1 1 0 0 +EDGE2 6784 6783 -1.05974 -0.0336866 -0.0317236 1 0 1 1 0 0 +EDGE2 6785 6784 -0.96017 0.0431722 0.00823527 1 0 1 1 0 0 +EDGE2 6785 6764 0.962481 -0.0043806 -3.14384 1 0 1 1 0 0 +EDGE2 6785 6766 0.0162967 0.891226 1.52975 1 0 1 1 0 0 +EDGE2 6785 6765 -0.0404317 -0.154118 -3.12719 1 0 1 1 0 0 +EDGE2 6786 6767 1.01084 -0.0171149 -0.0237734 1 0 1 1 0 0 +EDGE2 6786 6766 -0.0589826 0.0586789 -0.0354403 1 0 1 1 0 0 +EDGE2 6786 6785 -0.999715 -0.0182449 -1.56629 1 0 1 1 0 0 +EDGE2 6786 6765 -0.982144 0.00636906 1.56466 1 0 1 1 0 0 +EDGE2 6787 6768 0.994643 -0.0262892 0.00447556 1 0 1 1 0 0 +EDGE2 6787 6767 0.0237141 -0.0066608 -0.0367732 1 0 1 1 0 0 +EDGE2 6787 6766 -1.0534 0.0312993 0.0139107 1 0 1 1 0 0 +EDGE2 6787 6786 -1.02467 -0.00248338 -0.0108509 1 0 1 1 0 0 +EDGE2 6788 6769 0.994682 -0.0591828 -0.00162364 1 0 1 1 0 0 +EDGE2 6788 6787 -1.01883 -0.0357506 0.00270128 1 0 1 1 0 0 +EDGE2 6788 6768 0.0153915 -0.0739928 -0.00648704 1 0 1 1 0 0 +EDGE2 6788 6767 -1.00995 -0.0221263 0.0227261 1 0 1 1 0 0 +EDGE2 6789 6770 0.94054 0.0437079 0.0247061 1 0 1 1 0 0 +EDGE2 6789 6788 -0.977537 0.0309278 -0.039807 1 0 1 1 0 0 +EDGE2 6789 6769 -0.0143305 0.0518444 -0.0396772 1 0 1 1 0 0 +EDGE2 6789 6768 -1.00954 -0.0836389 -0.01037 1 0 1 1 0 0 +EDGE2 6790 6770 -0.0294256 -0.00266928 0.0305031 1 0 1 1 0 0 +EDGE2 6790 6771 -0.0669285 0.966329 1.57345 1 0 1 1 0 0 +EDGE2 6790 6769 -0.914908 -0.0476787 -0.0333522 1 0 1 1 0 0 +EDGE2 6790 6789 -1.02642 0.0119244 0.00798956 1 0 1 1 0 0 +EDGE2 6791 6770 -0.948009 0.00158288 -1.57741 1 0 1 1 0 0 +EDGE2 6791 6790 -1.0018 0.0330733 -1.5461 1 0 1 1 0 0 +EDGE2 6791 6771 -0.0300764 0.0559716 0.00693068 1 0 1 1 0 0 +EDGE2 6791 6772 0.949711 -0.0723239 -0.0116256 1 0 1 1 0 0 +EDGE2 6792 6791 -1.02893 0.027157 -0.011635 1 0 1 1 0 0 +EDGE2 6792 6771 -0.990002 -0.00161995 -0.020441 1 0 1 1 0 0 +EDGE2 6792 6773 1.0125 0.0671397 0.0374561 1 0 1 1 0 0 +EDGE2 6792 6772 0.0342958 0.0236563 0.0140982 1 0 1 1 0 0 +EDGE2 6793 6774 1.02835 -0.0392816 0.0235569 1 0 1 1 0 0 +EDGE2 6793 6792 -1.0386 0.0553877 -0.00202178 1 0 1 1 0 0 +EDGE2 6793 6773 -0.021201 -0.0219131 -0.0167038 1 0 1 1 0 0 +EDGE2 6793 6772 -0.991869 0.0503149 -0.00694513 1 0 1 1 0 0 +EDGE2 6794 6774 0.051442 -0.0312729 0.0022193 1 0 1 1 0 0 +EDGE2 6794 6773 -1.04029 -0.0558018 -0.00212183 1 0 1 1 0 0 +EDGE2 6794 6793 -1.00502 -0.0377534 0.0309526 1 0 1 1 0 0 +EDGE2 6794 6775 1.01445 -0.00800621 0.0166979 1 0 1 1 0 0 +EDGE2 6795 6774 -1.04318 -0.0377135 0.0129452 1 0 1 1 0 0 +EDGE2 6795 6794 -1.04214 -0.0470186 -0.0312906 1 0 1 1 0 0 +EDGE2 6795 6775 0.137446 0.0471087 0.00533628 1 0 1 1 0 0 +EDGE2 6795 6776 0.0227608 1.01379 1.52587 1 0 1 1 0 0 +EDGE2 6796 6795 -0.905605 0.0141908 -1.55612 1 0 1 1 0 0 +EDGE2 6796 6775 -1.00596 0.0377277 -1.57555 1 0 1 1 0 0 +EDGE2 6796 6777 0.894996 -0.0687088 0.0174851 1 0 1 1 0 0 +EDGE2 6796 6776 0.0160788 0.072439 -0.0137539 1 0 1 1 0 0 +EDGE2 6797 6777 0.0155633 -0.0372525 0.0110563 1 0 1 1 0 0 +EDGE2 6797 6796 -1.00022 0.00587718 -0.00591678 1 0 1 1 0 0 +EDGE2 6797 6776 -0.94022 -0.0178751 -0.00968125 1 0 1 1 0 0 +EDGE2 6797 6778 1.08331 0.0426647 0.010972 1 0 1 1 0 0 +EDGE2 6798 6777 -0.992075 -0.00338887 -0.0251918 1 0 1 1 0 0 +EDGE2 6798 6797 -1.11201 -0.032943 -0.027471 1 0 1 1 0 0 +EDGE2 6798 6778 0.0587886 -0.0517441 0.00707234 1 0 1 1 0 0 +EDGE2 6798 6779 1.00861 0.137723 -0.00171756 1 0 1 1 0 0 +EDGE2 6799 6778 -0.984376 2.71171e-06 -0.0110234 1 0 1 1 0 0 +EDGE2 6799 6798 -0.943201 0.0461196 0.0289955 1 0 1 1 0 0 +EDGE2 6799 6779 -0.00226844 0.0672526 -0.0221911 1 0 1 1 0 0 +EDGE2 6799 6780 1.06378 0.0456727 0.00666656 1 0 1 1 0 0 +EDGE2 6800 6799 -0.918085 0.0844833 0.0206558 1 0 1 1 0 0 +EDGE2 6800 6779 -1.01181 0.00429471 0.0234624 1 0 1 1 0 0 +EDGE2 6800 6781 -0.0833433 1.10566 1.5741 1 0 1 1 0 0 +EDGE2 6800 6780 0.0559523 -0.000232581 -0.0220104 1 0 1 1 0 0 +EDGE2 6801 6780 -1.04922 -0.00586348 1.57185 1 0 1 1 0 0 +EDGE2 6801 6800 -0.980281 0.0072517 1.55334 1 0 1 1 0 0 +EDGE2 6802 6801 -0.93132 -0.0295247 0.0200097 1 0 1 1 0 0 +EDGE2 6803 6802 -1.03692 -0.00543982 0.00804957 1 0 1 1 0 0 +EDGE2 6804 6803 -0.962045 0.0163574 -0.0239175 1 0 1 1 0 0 +EDGE2 6805 6804 -1.03365 -0.023386 0.00485597 1 0 1 1 0 0 +EDGE2 6806 6805 -0.981923 -0.00461987 -1.58175 1 0 1 1 0 0 +EDGE2 6807 6806 -1.00886 0.0294674 0.00423974 1 0 1 1 0 0 +EDGE2 6808 6807 -1.02842 -0.0533322 -0.00500681 1 0 1 1 0 0 +EDGE2 6809 6808 -1.01305 -0.0273015 0.000463718 1 0 1 1 0 0 +EDGE2 6810 6809 -0.933181 0.0172611 -0.00711977 1 0 1 1 0 0 +EDGE2 6811 6810 -1.04629 0.0863601 -1.60265 1 0 1 1 0 0 +EDGE2 6812 6811 -1.00391 0.00270128 0.00512399 1 0 1 1 0 0 +EDGE2 6813 6812 -0.981086 -0.104371 -0.0356402 1 0 1 1 0 0 +EDGE2 6814 6813 -0.963419 0.00846839 0.00989465 1 0 1 1 0 0 +EDGE2 6815 6814 -0.949039 0.00194526 0.0109431 1 0 1 1 0 0 +EDGE2 6816 6815 -0.999993 -0.0258195 -1.54693 1 0 1 1 0 0 +EDGE2 6817 6816 -1.03891 0.00449283 -0.00723911 1 0 1 1 0 0 +EDGE2 6818 6817 -1.0919 -0.00250936 0.0135443 1 0 1 1 0 0 +EDGE2 6819 6780 1.01103 0.000537977 -3.1549 1 0 1 1 0 0 +EDGE2 6819 6800 0.993548 0.0338247 -3.15455 1 0 1 1 0 0 +EDGE2 6819 6818 -1.04373 0.0680495 -0.00664147 1 0 1 1 0 0 +EDGE2 6820 6799 1.06196 0.0217646 -3.1302 1 0 1 1 0 0 +EDGE2 6820 6779 0.93718 0.057054 -3.1628 1 0 1 1 0 0 +EDGE2 6820 6801 0.0411648 0.96927 1.5699 1 0 1 1 0 0 +EDGE2 6820 6781 0.0526231 -1.01333 -1.60427 1 0 1 1 0 0 +EDGE2 6820 6780 0.0561846 0.0306492 -3.15215 1 0 1 1 0 0 +EDGE2 6820 6800 0.0203873 0.00626322 -3.11188 1 0 1 1 0 0 +EDGE2 6820 6819 -1.0017 0.0503009 -0.00520818 1 0 1 1 0 0 +EDGE2 6821 6801 0.0525588 -0.0203645 0.0159912 1 0 1 1 0 0 +EDGE2 6821 6820 -1.00201 -0.0130248 -1.61226 1 0 1 1 0 0 +EDGE2 6821 6780 -0.95503 0.0411414 1.56845 1 0 1 1 0 0 +EDGE2 6821 6800 -1.05836 -0.0248984 1.57427 1 0 1 1 0 0 +EDGE2 6821 6802 1.09782 -0.0164973 0.0232876 1 0 1 1 0 0 +EDGE2 6822 6801 -0.937782 0.0484649 0.0329778 1 0 1 1 0 0 +EDGE2 6822 6821 -0.945437 0.0210384 0.0124156 1 0 1 1 0 0 +EDGE2 6822 6802 -0.0078111 0.0618253 0.00334136 1 0 1 1 0 0 +EDGE2 6822 6803 1.02086 0.0345551 -0.0245779 1 0 1 1 0 0 +EDGE2 6823 6802 -0.980686 0.0449546 -0.00629811 1 0 1 1 0 0 +EDGE2 6823 6822 -0.948916 0.0115379 -0.0184596 1 0 1 1 0 0 +EDGE2 6823 6803 0.0437273 0.0378546 0.00642072 1 0 1 1 0 0 +EDGE2 6823 6804 1.02949 0.0143004 0.0202966 1 0 1 1 0 0 +EDGE2 6824 6823 -0.931947 0.0730576 -0.0205315 1 0 1 1 0 0 +EDGE2 6824 6803 -1.01735 0.00756533 0.0326327 1 0 1 1 0 0 +EDGE2 6824 6804 0.0979879 0.0159681 0.00436428 1 0 1 1 0 0 +EDGE2 6824 6805 0.989731 0.115894 -0.031172 1 0 1 1 0 0 +EDGE2 6825 6824 -0.919339 -0.0420517 -0.00392792 1 0 1 1 0 0 +EDGE2 6825 6804 -0.93219 -0.00972348 0.0297219 1 0 1 1 0 0 +EDGE2 6825 6805 0.115121 0.0419425 0.015261 1 0 1 1 0 0 +EDGE2 6825 6806 0.0169622 0.974223 1.59909 1 0 1 1 0 0 +EDGE2 6826 6825 -1.11125 0.0491745 -1.56889 1 0 1 1 0 0 +EDGE2 6826 6805 -0.964167 -0.0314865 -1.58129 1 0 1 1 0 0 +EDGE2 6826 6806 0.0298149 -0.0990601 0.0182513 1 0 1 1 0 0 +EDGE2 6826 6807 1.13019 -0.0612864 0.0575526 1 0 1 1 0 0 +EDGE2 6827 6826 -1.00422 0.0678633 0.0241736 1 0 1 1 0 0 +EDGE2 6827 6806 -0.989281 0.0200613 -0.0142917 1 0 1 1 0 0 +EDGE2 6827 6807 -0.0648461 0.0840006 0.0130315 1 0 1 1 0 0 +EDGE2 6827 6808 0.948702 0.0415332 0.0285227 1 0 1 1 0 0 +EDGE2 6828 6827 -0.944092 -0.0322496 0.0061815 1 0 1 1 0 0 +EDGE2 6828 6807 -1.02347 -0.0551614 -0.00349634 1 0 1 1 0 0 +EDGE2 6828 6808 0.043314 0.0151315 0.0140837 1 0 1 1 0 0 +EDGE2 6828 6809 1.00512 0.0610541 -0.0311674 1 0 1 1 0 0 +EDGE2 6829 6808 -1.01947 0.0400476 0.00456559 1 0 1 1 0 0 +EDGE2 6829 6828 -0.988123 0.0445474 0.0113933 1 0 1 1 0 0 +EDGE2 6829 6809 0.0374363 -0.0257168 0.055312 1 0 1 1 0 0 +EDGE2 6829 6810 0.928035 -0.0485503 0.0201953 1 0 1 1 0 0 +EDGE2 6830 6809 -1.01152 0.0380757 0.00566309 1 0 1 1 0 0 +EDGE2 6830 6829 -1.06226 -0.0330902 0.0291336 1 0 1 1 0 0 +EDGE2 6830 6810 0.00695118 -0.0594344 0.0169156 1 0 1 1 0 0 +EDGE2 6830 6811 0.00971501 0.931034 1.55932 1 0 1 1 0 0 +EDGE2 6831 6810 -1.04078 -0.0251926 -1.57636 1 0 1 1 0 0 +EDGE2 6831 6811 0.0389445 -0.0331163 0.000868163 1 0 1 1 0 0 +EDGE2 6831 6812 1.05502 -0.0469148 0.00388532 1 0 1 1 0 0 +EDGE2 6831 6830 -1.02801 0.0397636 -1.56992 1 0 1 1 0 0 +EDGE2 6832 6813 1.10231 -0.00287067 0.00491314 1 0 1 1 0 0 +EDGE2 6832 6811 -0.985089 0.0171506 0.0345777 1 0 1 1 0 0 +EDGE2 6832 6831 -1.02768 0.0540982 0.0318757 1 0 1 1 0 0 +EDGE2 6832 6812 0.0325169 -0.0464705 0.0203023 1 0 1 1 0 0 +EDGE2 6833 6832 -0.966341 0.0157541 -0.0128612 1 0 1 1 0 0 +EDGE2 6833 6814 1.01602 0.0509924 -0.0188738 1 0 1 1 0 0 +EDGE2 6833 6813 0.102299 0.126742 -0.0142453 1 0 1 1 0 0 +EDGE2 6833 6812 -0.960914 0.00237585 0.0229124 1 0 1 1 0 0 +EDGE2 6834 6815 0.930079 -0.0919635 0.0206659 1 0 1 1 0 0 +EDGE2 6834 6833 -0.996591 -0.024651 0.0091057 1 0 1 1 0 0 +EDGE2 6834 6814 0.0799797 0.0290584 0.0184281 1 0 1 1 0 0 +EDGE2 6834 6813 -0.994456 -0.0252325 0.00283939 1 0 1 1 0 0 +EDGE2 6835 6815 0.00696717 -0.0153221 -0.0116085 1 0 1 1 0 0 +EDGE2 6835 6816 0.0607963 0.967487 1.50755 1 0 1 1 0 0 +EDGE2 6835 6814 -0.933892 0.00866748 0.0236875 1 0 1 1 0 0 +EDGE2 6835 6834 -1.12874 0.0393619 0.000471286 1 0 1 1 0 0 +EDGE2 6836 6815 -1.0067 0.0387772 1.57699 1 0 1 1 0 0 +EDGE2 6836 6835 -1.04672 0.0123876 1.58702 1 0 1 1 0 0 +EDGE2 6837 6836 -0.985634 -0.032528 0.0138191 1 0 1 1 0 0 +EDGE2 6838 6837 -0.979203 -0.0476319 -0.00796542 1 0 1 1 0 0 +EDGE2 6839 6838 -0.970732 -0.0348185 0.00657318 1 0 1 1 0 0 +EDGE2 6839 6720 1.05012 -0.00991784 -3.14808 1 0 1 1 0 0 +EDGE2 6839 6740 0.857043 0.0570915 -3.11292 1 0 1 1 0 0 +EDGE2 6840 6839 -0.999362 0.00484435 -0.0351661 1 0 1 1 0 0 +EDGE2 6840 6739 0.937869 -0.0172457 -3.13345 1 0 1 1 0 0 +EDGE2 6840 6741 -0.035469 0.916999 1.54523 1 0 1 1 0 0 +EDGE2 6840 6720 -0.0652341 -0.0011329 -3.15027 1 0 1 1 0 0 +EDGE2 6840 6740 0.0234412 -0.0241196 -3.13073 1 0 1 1 0 0 +EDGE2 6840 6721 -0.0282563 -1.08491 -1.5657 1 0 1 1 0 0 +EDGE2 6840 6719 0.984968 -0.00798022 -3.13314 1 0 1 1 0 0 +EDGE2 6841 6741 -0.090141 0.0606514 0.00816836 1 0 1 1 0 0 +EDGE2 6841 6742 0.988926 -0.0401582 -0.00793874 1 0 1 1 0 0 +EDGE2 6841 6720 -1.09212 0.00480845 1.57305 1 0 1 1 0 0 +EDGE2 6841 6740 -1.04404 -0.0286516 1.56501 1 0 1 1 0 0 +EDGE2 6841 6840 -1.02362 -0.042468 -1.55361 1 0 1 1 0 0 +EDGE2 6842 6741 -1.11552 0.0225282 -0.0121417 1 0 1 1 0 0 +EDGE2 6842 6742 0.00658429 -0.0309279 -0.00314407 1 0 1 1 0 0 +EDGE2 6842 6743 0.970446 -0.0175227 0.0391254 1 0 1 1 0 0 +EDGE2 6842 6841 -0.939379 -0.120448 0.0036293 1 0 1 1 0 0 +EDGE2 6843 6744 0.974152 -0.0990446 0.00577737 1 0 1 1 0 0 +EDGE2 6843 6742 -1.06346 -0.0348043 0.00917845 1 0 1 1 0 0 +EDGE2 6843 6842 -1.0683 -0.00261044 0.0297618 1 0 1 1 0 0 +EDGE2 6843 6743 -0.0288881 0.00726848 -0.0160872 1 0 1 1 0 0 +EDGE2 6844 6843 -1.10335 -0.0558394 -0.042432 1 0 1 1 0 0 +EDGE2 6844 6705 1.01628 0.0295424 -3.20006 1 0 1 1 0 0 +EDGE2 6844 6745 1.11051 0.063579 0.0156669 1 0 1 1 0 0 +EDGE2 6844 6744 0.0018074 -0.00239935 -0.0401891 1 0 1 1 0 0 +EDGE2 6844 6743 -0.88404 0.0570399 -0.031614 1 0 1 1 0 0 +EDGE2 6845 6746 0.0283748 1.0651 1.57997 1 0 1 1 0 0 +EDGE2 6845 6704 1.03852 -0.0387648 -3.13571 1 0 1 1 0 0 +EDGE2 6845 6844 -0.921495 -0.0575706 -0.00564813 1 0 1 1 0 0 +EDGE2 6845 6705 0.0406032 0.00179415 -3.16561 1 0 1 1 0 0 +EDGE2 6845 6745 -0.0102646 -0.0613378 1.97156e-05 1 0 1 1 0 0 +EDGE2 6845 6744 -0.987547 -0.0571748 -0.0144867 1 0 1 1 0 0 +EDGE2 6845 6706 -0.0846739 -1.01649 -1.56648 1 0 1 1 0 0 +EDGE2 6846 6747 1.12778 0.0292852 0.00868205 1 0 1 1 0 0 +EDGE2 6846 6746 0.00257129 -0.0197682 0.00588922 1 0 1 1 0 0 +EDGE2 6846 6845 -1.02353 -0.0893108 -1.568 1 0 1 1 0 0 +EDGE2 6846 6705 -1.05953 0.00020146 1.5998 1 0 1 1 0 0 +EDGE2 6846 6745 -1.08422 -0.0477048 -1.59492 1 0 1 1 0 0 +EDGE2 6847 6748 0.960908 -0.0671744 -0.00636131 1 0 1 1 0 0 +EDGE2 6847 6846 -0.994098 -0.010363 0.0120806 1 0 1 1 0 0 +EDGE2 6847 6747 -0.0171643 -0.0069563 0.0331568 1 0 1 1 0 0 +EDGE2 6847 6746 -0.970065 0.0139533 0.00533023 1 0 1 1 0 0 +EDGE2 6848 6748 -0.0515815 -0.0145143 0.0377549 1 0 1 1 0 0 +EDGE2 6848 6749 0.975213 -0.0989821 0.00804656 1 0 1 1 0 0 +EDGE2 6848 6747 -1.05546 -0.0192296 -0.0255782 1 0 1 1 0 0 +EDGE2 6848 6847 -1.01499 -0.00867653 0.0184766 1 0 1 1 0 0 +EDGE2 6849 6750 0.949274 0.0215583 -0.0122387 1 0 1 1 0 0 +EDGE2 6849 6748 -0.924547 0.0369966 -0.0224542 1 0 1 1 0 0 +EDGE2 6849 6749 -0.0100945 0.0123748 0.00270511 1 0 1 1 0 0 +EDGE2 6849 6848 -1.04699 -0.0369128 0.0320331 1 0 1 1 0 0 +EDGE2 6850 6751 0.0121518 -1.09745 -1.56975 1 0 1 1 0 0 +EDGE2 6850 6750 -0.0153018 -0.00350928 0.00269315 1 0 1 1 0 0 +EDGE2 6850 6749 -1.05328 -0.0718928 0.0309367 1 0 1 1 0 0 +EDGE2 6850 6849 -0.925411 -0.0210357 -0.00850407 1 0 1 1 0 0 +EDGE2 6851 6750 -0.99972 -0.0594599 -1.55575 1 0 1 1 0 0 +EDGE2 6851 6850 -0.988041 -0.052997 -1.5697 1 0 1 1 0 0 +EDGE2 6852 6851 -0.99876 0.0736965 -0.00936694 1 0 1 1 0 0 +EDGE2 6853 6852 -1.00806 0.00208828 0.00467342 1 0 1 1 0 0 +EDGE2 6854 6815 0.952633 -0.0799291 -3.16471 1 0 1 1 0 0 +EDGE2 6854 6853 -0.97275 -0.089914 -0.0264553 1 0 1 1 0 0 +EDGE2 6854 6835 1.0128 0.00350961 -3.11602 1 0 1 1 0 0 +EDGE2 6855 6815 -0.0160579 0.108338 -3.15056 1 0 1 1 0 0 +EDGE2 6855 6816 -0.0470629 -0.889093 -1.55737 1 0 1 1 0 0 +EDGE2 6855 6854 -0.950793 0.0193594 -0.000256718 1 0 1 1 0 0 +EDGE2 6855 6835 0.0353318 -0.0248803 -3.15792 1 0 1 1 0 0 +EDGE2 6855 6814 1.10547 -0.00229643 -3.13278 1 0 1 1 0 0 +EDGE2 6855 6834 1.02142 0.0612551 -3.14395 1 0 1 1 0 0 +EDGE2 6855 6836 -0.0516063 0.961298 1.59174 1 0 1 1 0 0 +EDGE2 6856 6815 -0.981995 -0.00201066 -1.59106 1 0 1 1 0 0 +EDGE2 6856 6817 0.949148 -0.0210543 -0.040848 1 0 1 1 0 0 +EDGE2 6856 6816 -0.0428505 -0.0406079 -0.00347467 1 0 1 1 0 0 +EDGE2 6856 6855 -0.964782 -0.00539098 1.58274 1 0 1 1 0 0 +EDGE2 6856 6835 -1.01395 0.0229753 -1.56488 1 0 1 1 0 0 +EDGE2 6857 6818 0.960285 -0.0133121 0.00272651 1 0 1 1 0 0 +EDGE2 6857 6817 -0.015943 0.0291053 -0.0192037 1 0 1 1 0 0 +EDGE2 6857 6856 -0.983705 0.131281 0.0259658 1 0 1 1 0 0 +EDGE2 6857 6816 -0.993442 0.000710841 -0.00600105 1 0 1 1 0 0 +EDGE2 6858 6819 1.01591 -0.0202011 -0.00858875 1 0 1 1 0 0 +EDGE2 6858 6818 -0.0859789 0.0392384 -0.00607804 1 0 1 1 0 0 +EDGE2 6858 6857 -1.01483 -0.0518763 0.0204404 1 0 1 1 0 0 +EDGE2 6858 6817 -0.924844 0.00269148 0.00323179 1 0 1 1 0 0 +EDGE2 6859 6820 1.06846 0.0362023 9.49287e-05 1 0 1 1 0 0 +EDGE2 6859 6780 0.957624 -0.0335772 -3.1429 1 0 1 1 0 0 +EDGE2 6859 6800 0.970025 0.0107991 -3.14113 1 0 1 1 0 0 +EDGE2 6859 6819 -0.0161274 0.0282041 -0.0160755 1 0 1 1 0 0 +EDGE2 6859 6858 -0.981167 -0.00603729 -0.0195429 1 0 1 1 0 0 +EDGE2 6859 6818 -1.04421 0.0975724 0.0126784 1 0 1 1 0 0 +EDGE2 6860 6799 1.02418 0.0968033 -3.13849 1 0 1 1 0 0 +EDGE2 6860 6779 0.986953 0.041098 -3.15745 1 0 1 1 0 0 +EDGE2 6860 6801 -0.0135281 0.929892 1.59661 1 0 1 1 0 0 +EDGE2 6860 6820 -0.0083792 0.0335491 0.00934679 1 0 1 1 0 0 +EDGE2 6860 6781 0.00449929 -0.982661 -1.57125 1 0 1 1 0 0 +EDGE2 6860 6780 -0.125799 0.00813849 -3.12749 1 0 1 1 0 0 +EDGE2 6860 6800 0.016109 -0.0741146 -3.11105 1 0 1 1 0 0 +EDGE2 6860 6821 0.012216 0.983401 1.55532 1 0 1 1 0 0 +EDGE2 6860 6819 -1.08237 0.0763045 0.0115594 1 0 1 1 0 0 +EDGE2 6860 6859 -1.02781 -0.0508974 0.0119432 1 0 1 1 0 0 +EDGE2 6861 6801 0.00261022 -0.0512334 -0.0016877 1 0 1 1 0 0 +EDGE2 6861 6820 -0.921448 -0.0455046 -1.60567 1 0 1 1 0 0 +EDGE2 6861 6860 -1.00479 0.0328174 -1.56287 1 0 1 1 0 0 +EDGE2 6861 6780 -1.0189 0.0252194 1.55748 1 0 1 1 0 0 +EDGE2 6861 6800 -1.01846 0.0041146 1.59446 1 0 1 1 0 0 +EDGE2 6861 6821 -0.00627654 0.068237 -0.0254314 1 0 1 1 0 0 +EDGE2 6861 6802 1.00257 -0.0176705 -0.0535784 1 0 1 1 0 0 +EDGE2 6861 6822 1.1074 -0.0218145 0.00600754 1 0 1 1 0 0 +EDGE2 6862 6801 -1.00317 0.0266748 0.000296658 1 0 1 1 0 0 +EDGE2 6862 6861 -1.0401 0.0172019 -0.00251786 1 0 1 1 0 0 +EDGE2 6862 6821 -0.99782 -0.00693539 0.0148949 1 0 1 1 0 0 +EDGE2 6862 6823 0.953663 0.0530626 0.0106766 1 0 1 1 0 0 +EDGE2 6862 6802 0.00343705 -0.0285516 -0.00259394 1 0 1 1 0 0 +EDGE2 6862 6822 -0.00588645 0.0476545 0.00154472 1 0 1 1 0 0 +EDGE2 6862 6803 1.04134 -0.127961 0.0213323 1 0 1 1 0 0 +EDGE2 6863 6823 0.0935086 0.0232853 0.00251282 1 0 1 1 0 0 +EDGE2 6863 6802 -1.08095 0.0224027 0.000369779 1 0 1 1 0 0 +EDGE2 6863 6822 -0.953669 0.0570673 -0.0114912 1 0 1 1 0 0 +EDGE2 6863 6862 -1.07611 -0.0352006 -0.0042181 1 0 1 1 0 0 +EDGE2 6863 6824 1.03675 0.0300403 -0.034834 1 0 1 1 0 0 +EDGE2 6863 6803 -0.0105355 0.00144868 -0.0130538 1 0 1 1 0 0 +EDGE2 6863 6804 0.93179 -0.0729399 -0.0422087 1 0 1 1 0 0 +EDGE2 6864 6823 -0.968044 0.00815531 -0.0277743 1 0 1 1 0 0 +EDGE2 6864 6863 -1.07272 0.0717249 0.00390552 1 0 1 1 0 0 +EDGE2 6864 6824 -0.0362361 0.100122 0.0251213 1 0 1 1 0 0 +EDGE2 6864 6803 -0.914622 0.0414687 0.0194069 1 0 1 1 0 0 +EDGE2 6864 6804 0.0618166 -0.0418601 0.0233371 1 0 1 1 0 0 +EDGE2 6864 6825 1.01794 -0.017669 -0.0039913 1 0 1 1 0 0 +EDGE2 6864 6805 0.905591 0.0521834 -0.0115111 1 0 1 1 0 0 +EDGE2 6865 6824 -1.0128 -0.0356571 -0.0319603 1 0 1 1 0 0 +EDGE2 6865 6864 -1.03137 0.050991 0.0178788 1 0 1 1 0 0 +EDGE2 6865 6804 -1.00133 -0.0346178 -0.00960754 1 0 1 1 0 0 +EDGE2 6865 6825 0.0635757 0.0611282 -0.0138805 1 0 1 1 0 0 +EDGE2 6865 6826 0.0266675 0.882744 1.57301 1 0 1 1 0 0 +EDGE2 6865 6805 0.0717161 0.016189 -0.00940362 1 0 1 1 0 0 +EDGE2 6865 6806 -0.0509761 0.950667 1.55473 1 0 1 1 0 0 +EDGE2 6866 6825 -1.07352 0.0363724 1.56641 1 0 1 1 0 0 +EDGE2 6866 6865 -1.04081 0.045748 1.56609 1 0 1 1 0 0 +EDGE2 6866 6805 -0.956166 0.0162927 1.55478 1 0 1 1 0 0 +EDGE2 6867 6866 -0.997276 -0.0375496 -0.0134193 1 0 1 1 0 0 +EDGE2 6868 6867 -0.958497 0.0142009 0.00513234 1 0 1 1 0 0 +EDGE2 6869 6868 -1.01223 -0.00843349 0.00144482 1 0 1 1 0 0 +EDGE2 6870 6869 -1.05563 0.0211424 0.0233939 1 0 1 1 0 0 +EDGE2 6871 6870 -0.957324 -0.00638914 1.59169 1 0 1 1 0 0 +EDGE2 6872 6871 -0.957708 -0.0370894 -0.0164441 1 0 1 1 0 0 +EDGE2 6873 6872 -0.929793 0.0259883 -0.000558517 1 0 1 1 0 0 +EDGE2 6874 6795 0.987122 -0.0245372 -3.15003 1 0 1 1 0 0 +EDGE2 6874 6775 1.09686 -0.000482872 -3.13982 1 0 1 1 0 0 +EDGE2 6874 6873 -0.963327 -0.0145053 0.0202848 1 0 1 1 0 0 +EDGE2 6875 6774 0.941039 0.0040625 -3.14906 1 0 1 1 0 0 +EDGE2 6875 6794 0.947728 -0.0124406 -3.14884 1 0 1 1 0 0 +EDGE2 6875 6795 -0.0456869 0.0449999 -3.12047 1 0 1 1 0 0 +EDGE2 6875 6775 0.0788011 -0.058839 -3.1201 1 0 1 1 0 0 +EDGE2 6875 6874 -1.05192 -0.0396968 -0.0146023 1 0 1 1 0 0 +EDGE2 6875 6796 0.0509422 -0.965353 -1.5653 1 0 1 1 0 0 +EDGE2 6875 6776 -0.112919 -0.970646 -1.58012 1 0 1 1 0 0 +EDGE2 6876 6795 -1.02702 -0.0322221 1.52976 1 0 1 1 0 0 +EDGE2 6876 6875 -0.952618 -0.046872 -1.57351 1 0 1 1 0 0 +EDGE2 6876 6775 -0.973258 0.0619354 1.5754 1 0 1 1 0 0 +EDGE2 6877 6876 -1.06667 0.00584901 0.0390915 1 0 1 1 0 0 +EDGE2 6878 6877 -1.13407 0.131624 -0.021543 1 0 1 1 0 0 +EDGE2 6879 6878 -0.98917 -0.0533997 -0.00634692 1 0 1 1 0 0 +EDGE2 6880 6879 -1.01956 -0.0614095 -0.00542501 1 0 1 1 0 0 +EDGE2 6881 6880 -0.903028 -0.0760885 -1.53096 1 0 1 1 0 0 +EDGE2 6882 6881 -1.01127 0.0782721 0.035259 1 0 1 1 0 0 +EDGE2 6883 6882 -0.997052 -0.0223484 -0.0383921 1 0 1 1 0 0 +EDGE2 6884 6883 -1.05692 0.00345356 0.0263296 1 0 1 1 0 0 +EDGE2 6885 6884 -0.954236 -0.0666464 0.00728909 1 0 1 1 0 0 +EDGE2 6886 6885 -0.971764 -0.031858 -1.55973 1 0 1 1 0 0 +EDGE2 6887 6886 -0.897301 0.0214844 -0.0445588 1 0 1 1 0 0 +EDGE2 6888 6887 -0.938269 0.0398342 0.0132413 1 0 1 1 0 0 +EDGE2 6889 6888 -0.997242 -0.00086546 -0.0101877 1 0 1 1 0 0 +EDGE2 6889 6870 0.936165 -0.0391536 -3.12889 1 0 1 1 0 0 +EDGE2 6890 6889 -1.00405 0.0131946 -0.0118519 1 0 1 1 0 0 +EDGE2 6890 6871 -0.0196035 1.02439 1.57102 1 0 1 1 0 0 +EDGE2 6890 6870 -0.00985075 -0.0248935 -3.17114 1 0 1 1 0 0 +EDGE2 6890 6869 1.06352 0.0258585 -3.15032 1 0 1 1 0 0 +EDGE2 6891 6870 -1.13482 -0.0011195 -1.58019 1 0 1 1 0 0 +EDGE2 6891 6890 -1.01076 -0.0814897 1.55194 1 0 1 1 0 0 +EDGE2 6892 6891 -0.993942 0.081642 0.0318979 1 0 1 1 0 0 +EDGE2 6893 6892 -1.10378 0.0329814 0.0299208 1 0 1 1 0 0 +EDGE2 6894 6893 -1.03187 0.00956308 0.0110965 1 0 1 1 0 0 +EDGE2 6895 6894 -1.0442 0.0525595 0.0154567 1 0 1 1 0 0 +EDGE2 6896 6895 -1.04987 0.0111467 -1.54853 1 0 1 1 0 0 +EDGE2 6897 6896 -1.0662 0.0453219 -0.0194329 1 0 1 1 0 0 +EDGE2 6898 6897 -1.02594 -0.0974939 0.00506386 1 0 1 1 0 0 +EDGE2 6899 6898 -1.05413 -0.0552295 -0.00542424 1 0 1 1 0 0 +EDGE2 6900 6899 -1.02733 -0.101665 0.0073567 1 0 1 1 0 0 +EDGE2 6901 6900 -0.986991 -0.0175976 -1.58429 1 0 1 1 0 0 +EDGE2 6902 6901 -1.02784 0.044122 0.00651014 1 0 1 1 0 0 +EDGE2 6903 6902 -0.991784 -0.00719414 -0.016161 1 0 1 1 0 0 +EDGE2 6904 6825 0.963081 -0.046269 -3.12825 1 0 1 1 0 0 +EDGE2 6904 6865 0.939978 0.0226603 -3.16135 1 0 1 1 0 0 +EDGE2 6904 6903 -1.02082 -0.00835852 0.00861313 1 0 1 1 0 0 +EDGE2 6904 6805 0.960422 -0.052493 -3.14176 1 0 1 1 0 0 +EDGE2 6905 6866 -0.0502149 1.10632 1.58181 1 0 1 1 0 0 +EDGE2 6905 6824 1.00701 0.0449068 -3.14765 1 0 1 1 0 0 +EDGE2 6905 6864 0.939714 -0.00905088 -3.13313 1 0 1 1 0 0 +EDGE2 6905 6804 0.972512 0.023286 -3.12856 1 0 1 1 0 0 +EDGE2 6905 6825 -0.0418413 -0.0608514 -3.10147 1 0 1 1 0 0 +EDGE2 6905 6865 -0.0451647 -0.0495143 -3.15433 1 0 1 1 0 0 +EDGE2 6905 6826 0.113931 -1.05316 -1.55391 1 0 1 1 0 0 +EDGE2 6905 6904 -0.995816 -0.0336468 0.0153168 1 0 1 1 0 0 +EDGE2 6905 6805 0.0870933 -0.0190117 -3.14067 1 0 1 1 0 0 +EDGE2 6905 6806 0.00474511 -1.0518 -1.55804 1 0 1 1 0 0 +EDGE2 6906 6867 1.00588 -0.118691 0.0110609 1 0 1 1 0 0 +EDGE2 6906 6866 0.0298964 0.00222588 0.0331043 1 0 1 1 0 0 +EDGE2 6906 6905 -1.00968 -0.00183525 -1.57668 1 0 1 1 0 0 +EDGE2 6906 6825 -0.93748 0.0540464 1.58188 1 0 1 1 0 0 +EDGE2 6906 6865 -0.984381 0.0729517 1.54424 1 0 1 1 0 0 +EDGE2 6906 6805 -1.01503 -0.013199 1.5929 1 0 1 1 0 0 +EDGE2 6907 6867 0.00939407 0.0859091 0.0150836 1 0 1 1 0 0 +EDGE2 6907 6868 0.905308 -0.00725458 -0.0218211 1 0 1 1 0 0 +EDGE2 6907 6906 -0.999253 0.00153356 -0.000765435 1 0 1 1 0 0 +EDGE2 6907 6866 -0.911826 -0.023025 -0.021163 1 0 1 1 0 0 +EDGE2 6908 6867 -0.95906 0.0102414 0.0216748 1 0 1 1 0 0 +EDGE2 6908 6869 0.966651 -0.00423162 -0.0011751 1 0 1 1 0 0 +EDGE2 6908 6868 0.0674951 -0.0137834 0.00373227 1 0 1 1 0 0 +EDGE2 6908 6907 -1.0559 0.0339459 -0.0117738 1 0 1 1 0 0 +EDGE2 6909 6870 0.90076 0.0454038 0.017885 1 0 1 1 0 0 +EDGE2 6909 6890 0.924222 -0.0693674 -3.13591 1 0 1 1 0 0 +EDGE2 6909 6908 -1.04448 0.0723519 -0.0123014 1 0 1 1 0 0 +EDGE2 6909 6869 0.0420613 0.0586343 0.0186817 1 0 1 1 0 0 +EDGE2 6909 6868 -0.962044 -0.0503496 -0.0192244 1 0 1 1 0 0 +EDGE2 6910 6889 0.932106 0.0123981 -3.14838 1 0 1 1 0 0 +EDGE2 6910 6871 -0.033261 -1.06481 -1.59854 1 0 1 1 0 0 +EDGE2 6910 6870 0.0120851 0.0649761 0.0100655 1 0 1 1 0 0 +EDGE2 6910 6890 0.027949 0.00721076 -3.12252 1 0 1 1 0 0 +EDGE2 6910 6891 0.00105171 1.00854 1.58459 1 0 1 1 0 0 +EDGE2 6910 6909 -0.956425 -0.0265627 -0.0101108 1 0 1 1 0 0 +EDGE2 6910 6869 -1.05191 0.00179817 -0.0203516 1 0 1 1 0 0 +EDGE2 6911 6870 -0.997041 0.0406115 -1.52639 1 0 1 1 0 0 +EDGE2 6911 6890 -0.961108 -0.0346585 1.5913 1 0 1 1 0 0 +EDGE2 6911 6910 -1.00485 0.00136826 -1.56192 1 0 1 1 0 0 +EDGE2 6911 6892 0.917788 0.0725733 0.00961355 1 0 1 1 0 0 +EDGE2 6911 6891 -0.0179029 0.0421208 0.0388086 1 0 1 1 0 0 +EDGE2 6912 6911 -1.10697 0.0305918 -0.0115082 1 0 1 1 0 0 +EDGE2 6912 6892 -0.0277522 0.0283035 0.0208156 1 0 1 1 0 0 +EDGE2 6912 6891 -1.04496 0.0328163 -0.00467387 1 0 1 1 0 0 +EDGE2 6912 6893 0.956813 0.00781727 -0.0187226 1 0 1 1 0 0 +EDGE2 6913 6892 -1.03434 -0.00628339 0.006259 1 0 1 1 0 0 +EDGE2 6913 6912 -1.02835 -0.0267184 -0.00779457 1 0 1 1 0 0 +EDGE2 6913 6893 -0.0103137 0.0168309 0.0140962 1 0 1 1 0 0 +EDGE2 6913 6894 0.980829 -0.0576524 -0.00461909 1 0 1 1 0 0 +EDGE2 6914 6913 -0.975363 -0.0254536 0.00479712 1 0 1 1 0 0 +EDGE2 6914 6893 -0.979302 0.0712472 -0.0286643 1 0 1 1 0 0 +EDGE2 6914 6894 -0.0339341 0.0394061 0.0170527 1 0 1 1 0 0 +EDGE2 6914 6895 1.01369 0.0503772 -0.0368324 1 0 1 1 0 0 +EDGE2 6915 6894 -1.04851 -0.0105153 0.0210187 1 0 1 1 0 0 +EDGE2 6915 6914 -1.01459 -0.0104504 0.00793546 1 0 1 1 0 0 +EDGE2 6915 6895 -0.0328933 0.0701217 0.00924976 1 0 1 1 0 0 +EDGE2 6915 6896 -0.138372 0.955693 1.58126 1 0 1 1 0 0 +EDGE2 6916 6915 -0.978983 0.0648811 1.53558 1 0 1 1 0 0 +EDGE2 6916 6895 -0.921253 0.0487397 1.54096 1 0 1 1 0 0 +EDGE2 6917 6916 -1.00847 -0.0621948 0.0119389 1 0 1 1 0 0 +EDGE2 6918 6917 -1.0853 0.0376139 -0.0490891 1 0 1 1 0 0 +EDGE2 6919 6918 -1.01461 0.0390694 -0.0210409 1 0 1 1 0 0 +EDGE2 6920 6919 -1.07235 0.0858061 -0.0176153 1 0 1 1 0 0 +EDGE2 6921 6920 -1.07944 -0.0169158 -1.53255 1 0 1 1 0 0 +EDGE2 6922 6921 -0.954019 0.0358978 0.00494623 1 0 1 1 0 0 +EDGE2 6923 6922 -0.982753 0.0272373 0.0353044 1 0 1 1 0 0 +EDGE2 6924 6923 -0.941289 0.00806442 0.00623541 1 0 1 1 0 0 +EDGE2 6925 6924 -0.932992 0.0170983 -0.0200314 1 0 1 1 0 0 +EDGE2 6926 6925 -1.01718 0.0175469 -1.5786 1 0 1 1 0 0 +EDGE2 6927 6926 -1.02936 0.033602 -0.018634 1 0 1 1 0 0 +EDGE2 6928 6927 -1.00488 -0.0210106 0.00686654 1 0 1 1 0 0 +EDGE2 6929 6928 -1.03209 0.101198 -0.0268513 1 0 1 1 0 0 +EDGE2 6930 6929 -1.06975 0.0559025 -0.0105756 1 0 1 1 0 0 +EDGE2 6931 6930 -1.00995 0.03624 1.58338 1 0 1 1 0 0 +EDGE2 6932 6931 -0.987275 -0.0285565 -0.0163829 1 0 1 1 0 0 +EDGE2 6933 6932 -1.04179 -0.0349524 -0.00932975 1 0 1 1 0 0 +EDGE2 6934 6933 -0.986053 -0.0114849 0.0227618 1 0 1 1 0 0 +EDGE2 6935 6934 -1.00548 0.122881 0.0122585 1 0 1 1 0 0 +EDGE2 6936 6935 -1.15143 0.0551845 -1.55077 1 0 1 1 0 0 +EDGE2 6937 6936 -1.10673 -0.0328587 0.00700038 1 0 1 1 0 0 +EDGE2 6938 6937 -0.97124 -0.060463 -0.0273382 1 0 1 1 0 0 +EDGE2 6939 6938 -0.950743 0.0551085 -0.0124507 1 0 1 1 0 0 +EDGE2 6940 6939 -1.08106 0.00164804 0.012963 1 0 1 1 0 0 +EDGE2 6941 6940 -0.964415 0.0494283 -1.59315 1 0 1 1 0 0 +EDGE2 6942 6941 -0.947998 -0.0370224 0.00512268 1 0 1 1 0 0 +EDGE2 6943 6942 -1.09225 0.0577206 -0.0298611 1 0 1 1 0 0 +EDGE2 6944 6943 -1.02413 0.0617899 0.00576126 1 0 1 1 0 0 +EDGE2 6945 6944 -0.995572 0.10168 0.0331821 1 0 1 1 0 0 +EDGE2 6946 6945 -1.00856 -0.00902503 -1.55316 1 0 1 1 0 0 +EDGE2 6947 6946 -0.934982 0.0667726 0.00446471 1 0 1 1 0 0 +EDGE2 6948 6947 -0.98676 -0.0389927 0.0223597 1 0 1 1 0 0 +EDGE2 6949 6930 1.01274 -0.0151204 -3.14687 1 0 1 1 0 0 +EDGE2 6949 6948 -0.994197 -0.00744961 0.010373 1 0 1 1 0 0 +EDGE2 6950 6929 1.08381 -0.0150034 -3.11987 1 0 1 1 0 0 +EDGE2 6950 6931 -0.00789217 0.991726 1.56392 1 0 1 1 0 0 +EDGE2 6950 6930 -0.0409806 -0.0116146 -3.17421 1 0 1 1 0 0 +EDGE2 6950 6949 -1.05515 -0.0254275 -0.0228311 1 0 1 1 0 0 +EDGE2 6951 6930 -0.97482 -0.0569359 -1.59527 1 0 1 1 0 0 +EDGE2 6951 6950 -0.959188 0.0135209 1.51914 1 0 1 1 0 0 +EDGE2 6952 6951 -0.911717 -0.116452 0.0439353 1 0 1 1 0 0 +EDGE2 6953 6952 -1.02067 -0.0373452 0.00348226 1 0 1 1 0 0 +EDGE2 6954 6915 1.08955 -0.0327682 -3.17786 1 0 1 1 0 0 +EDGE2 6954 6895 0.90658 -0.0783993 -3.1493 1 0 1 1 0 0 +EDGE2 6954 6953 -1.02861 0.0421554 -0.0254398 1 0 1 1 0 0 +EDGE2 6955 6916 -0.0168712 1.09224 1.55385 1 0 1 1 0 0 +EDGE2 6955 6894 1.042 0.0413011 -3.12714 1 0 1 1 0 0 +EDGE2 6955 6914 0.956523 -0.0504939 -3.13733 1 0 1 1 0 0 +EDGE2 6955 6954 -1.05017 -0.0139464 0.0081905 1 0 1 1 0 0 +EDGE2 6955 6915 -0.0236148 -0.0636217 -3.16592 1 0 1 1 0 0 +EDGE2 6955 6895 0.0863861 0.0042761 -3.10185 1 0 1 1 0 0 +EDGE2 6955 6896 0.017795 -0.990818 -1.58148 1 0 1 1 0 0 +EDGE2 6956 6916 -0.0194274 -0.0415026 -0.0466619 1 0 1 1 0 0 +EDGE2 6956 6917 0.923482 -0.0267518 -0.0438423 1 0 1 1 0 0 +EDGE2 6956 6915 -1.01003 -0.0139037 1.56583 1 0 1 1 0 0 +EDGE2 6956 6955 -0.982035 -0.018302 -1.5912 1 0 1 1 0 0 +EDGE2 6956 6895 -1.05299 -0.0875589 1.60165 1 0 1 1 0 0 +EDGE2 6957 6916 -1.02513 -0.0212257 0.00232191 1 0 1 1 0 0 +EDGE2 6957 6918 0.990661 0.0487719 -0.00383611 1 0 1 1 0 0 +EDGE2 6957 6917 -0.132987 0.00646111 0.0213389 1 0 1 1 0 0 +EDGE2 6957 6956 -0.972501 -0.0740021 -0.0119581 1 0 1 1 0 0 +EDGE2 6958 6919 1.00336 0.0506341 -0.000700256 1 0 1 1 0 0 +EDGE2 6958 6918 0.0434969 0.0456221 -0.00660056 1 0 1 1 0 0 +EDGE2 6958 6917 -0.942225 -0.0183191 -0.0393286 1 0 1 1 0 0 +EDGE2 6958 6957 -1.05224 -4.73274e-05 0.0319667 1 0 1 1 0 0 +EDGE2 6959 6920 0.950667 0.0115272 -0.00923274 1 0 1 1 0 0 +EDGE2 6959 6958 -1.05014 0.0963642 0.0035494 1 0 1 1 0 0 +EDGE2 6959 6919 -0.041807 -0.0788188 0.0469483 1 0 1 1 0 0 +EDGE2 6959 6918 -0.985788 -0.0483949 -0.0044002 1 0 1 1 0 0 +EDGE2 6960 6920 0.022525 0.028986 0.00540751 1 0 1 1 0 0 +EDGE2 6960 6921 0.0463122 0.951895 1.56039 1 0 1 1 0 0 +EDGE2 6960 6959 -0.982569 -0.0419775 0.00599727 1 0 1 1 0 0 +EDGE2 6960 6919 -0.962033 -0.0316939 -0.00914566 1 0 1 1 0 0 +EDGE2 6961 6920 -0.955157 0.048739 1.54812 1 0 1 1 0 0 +EDGE2 6961 6960 -0.996311 -0.00767818 1.55094 1 0 1 1 0 0 +EDGE2 6962 6961 -0.930528 -0.0657597 -0.0299545 1 0 1 1 0 0 +EDGE2 6963 6962 -0.934161 0.0394567 0.0163969 1 0 1 1 0 0 +EDGE2 6964 6885 0.95823 -0.0760211 -3.10764 1 0 1 1 0 0 +EDGE2 6964 6963 -1.02145 -0.0990096 0.00626732 1 0 1 1 0 0 +EDGE2 6965 6886 -0.00899489 -1.04406 -1.57706 1 0 1 1 0 0 +EDGE2 6965 6885 0.0990768 -0.0671428 -3.14806 1 0 1 1 0 0 +EDGE2 6965 6884 1.09006 0.0136079 -3.14709 1 0 1 1 0 0 +EDGE2 6965 6964 -1.00082 0.0089012 -0.00172605 1 0 1 1 0 0 +EDGE2 6966 6886 0.114655 0.02182 0.00597172 1 0 1 1 0 0 +EDGE2 6966 6885 -1.0529 -0.0508118 -1.61452 1 0 1 1 0 0 +EDGE2 6966 6965 -0.975081 -0.0154167 1.51161 1 0 1 1 0 0 +EDGE2 6966 6887 0.982556 -0.0262254 0.061171 1 0 1 1 0 0 +EDGE2 6967 6886 -1.08194 -0.0152566 0.00161622 1 0 1 1 0 0 +EDGE2 6967 6966 -0.972643 -0.0561214 0.00176329 1 0 1 1 0 0 +EDGE2 6967 6887 -0.0835133 0.023732 0.011041 1 0 1 1 0 0 +EDGE2 6967 6888 1.05384 0.0125706 0.0610611 1 0 1 1 0 0 +EDGE2 6968 6887 -1.04803 -0.0369573 -0.0273297 1 0 1 1 0 0 +EDGE2 6968 6967 -0.937498 -0.051215 -0.0213978 1 0 1 1 0 0 +EDGE2 6968 6888 0.0761195 -0.0190373 -0.02276 1 0 1 1 0 0 +EDGE2 6968 6889 1.04076 0.0377347 0.0476341 1 0 1 1 0 0 +EDGE2 6969 6968 -1.05676 0.0176437 -0.000851924 1 0 1 1 0 0 +EDGE2 6969 6888 -1.00357 -0.0211146 -0.0251897 1 0 1 1 0 0 +EDGE2 6969 6889 -0.049376 -0.00544391 0.0167081 1 0 1 1 0 0 +EDGE2 6969 6870 0.930052 -0.0278288 -3.1063 1 0 1 1 0 0 +EDGE2 6969 6890 0.938357 -0.0662462 -0.0132786 1 0 1 1 0 0 +EDGE2 6969 6910 1.01767 -0.000252734 -3.14581 1 0 1 1 0 0 +EDGE2 6970 6969 -1.05339 0.00473708 -0.0219263 1 0 1 1 0 0 +EDGE2 6970 6889 -0.952854 -0.0278205 -0.025499 1 0 1 1 0 0 +EDGE2 6970 6911 0.00990752 -0.969869 -1.57176 1 0 1 1 0 0 +EDGE2 6970 6871 -0.00672785 0.986411 1.59874 1 0 1 1 0 0 +EDGE2 6970 6870 -0.0160265 -0.0432258 -3.16433 1 0 1 1 0 0 +EDGE2 6970 6890 -0.0869737 0.093625 -0.0212972 1 0 1 1 0 0 +EDGE2 6970 6910 0.0336213 0.0362396 -3.13897 1 0 1 1 0 0 +EDGE2 6970 6891 -0.0209072 -0.907912 -1.55709 1 0 1 1 0 0 +EDGE2 6970 6909 1.01097 0.0394012 -3.13284 1 0 1 1 0 0 +EDGE2 6970 6869 0.990673 0.0691995 -3.15038 1 0 1 1 0 0 +EDGE2 6971 6970 -0.967659 -0.0584338 -1.60404 1 0 1 1 0 0 +EDGE2 6971 6871 0.0191256 -0.00234505 0.000896945 1 0 1 1 0 0 +EDGE2 6971 6872 1.03612 0.0446069 0.0289803 1 0 1 1 0 0 +EDGE2 6971 6870 -0.943386 -0.04285 1.5668 1 0 1 1 0 0 +EDGE2 6971 6890 -1.04335 0.0485914 -1.58386 1 0 1 1 0 0 +EDGE2 6971 6910 -1.104 0.0163954 1.58318 1 0 1 1 0 0 +EDGE2 6972 6873 0.940279 0.0794562 -0.0208323 1 0 1 1 0 0 +EDGE2 6972 6871 -0.991975 -0.0218445 0.00940249 1 0 1 1 0 0 +EDGE2 6972 6971 -0.902808 0.00943607 0.0227446 1 0 1 1 0 0 +EDGE2 6972 6872 -0.00390764 -0.105845 0.0165459 1 0 1 1 0 0 +EDGE2 6973 6972 -0.948528 -0.0523376 0.0011077 1 0 1 1 0 0 +EDGE2 6973 6874 1.02414 -0.0670635 -0.0164608 1 0 1 1 0 0 +EDGE2 6973 6873 -0.0499112 -0.0350436 0.0508711 1 0 1 1 0 0 +EDGE2 6973 6872 -1.01256 0.0150181 0.00469656 1 0 1 1 0 0 +EDGE2 6974 6795 1.01233 0.00258474 -3.10259 1 0 1 1 0 0 +EDGE2 6974 6875 1.00424 0.0384398 -0.00472157 1 0 1 1 0 0 +EDGE2 6974 6775 1.0554 -0.0191295 -3.1224 1 0 1 1 0 0 +EDGE2 6974 6973 -0.951471 0.00764858 0.0273859 1 0 1 1 0 0 +EDGE2 6974 6874 0.0429466 0.0764161 -0.000723374 1 0 1 1 0 0 +EDGE2 6974 6873 -0.948379 0.00714287 -0.0147601 1 0 1 1 0 0 +EDGE2 6975 6876 0.0790115 0.991018 1.54258 1 0 1 1 0 0 +EDGE2 6975 6774 0.894354 -0.0361815 -3.1627 1 0 1 1 0 0 +EDGE2 6975 6794 1.00025 -0.0336657 -3.14498 1 0 1 1 0 0 +EDGE2 6975 6974 -0.972767 -0.0405851 -0.010467 1 0 1 1 0 0 +EDGE2 6975 6795 -0.0101914 -0.0229248 -3.13602 1 0 1 1 0 0 +EDGE2 6975 6875 -0.0749341 0.131595 0.0271251 1 0 1 1 0 0 +EDGE2 6975 6775 -0.155458 0.010329 -3.14848 1 0 1 1 0 0 +EDGE2 6975 6874 -1.02635 -0.0352742 0.0077111 1 0 1 1 0 0 +EDGE2 6975 6796 -0.0586358 -0.955269 -1.62467 1 0 1 1 0 0 +EDGE2 6975 6776 -0.0508443 -1.08242 -1.5724 1 0 1 1 0 0 +EDGE2 6976 6876 -0.0362608 0.0589895 -0.0345991 1 0 1 1 0 0 +EDGE2 6976 6877 0.862158 0.0452457 -0.0179051 1 0 1 1 0 0 +EDGE2 6976 6795 -0.92237 0.0208932 1.56061 1 0 1 1 0 0 +EDGE2 6976 6875 -1.00848 -0.059328 -1.5769 1 0 1 1 0 0 +EDGE2 6976 6975 -1.07447 -0.0777886 -1.59523 1 0 1 1 0 0 +EDGE2 6976 6775 -1.01917 0.0876562 1.59348 1 0 1 1 0 0 +EDGE2 6977 6876 -0.946765 0.0217088 -0.0116873 1 0 1 1 0 0 +EDGE2 6977 6877 0.00355422 -0.0562922 -0.0394499 1 0 1 1 0 0 +EDGE2 6977 6878 0.994979 -0.00589075 -0.00703312 1 0 1 1 0 0 +EDGE2 6977 6976 -0.886266 0.0566184 -0.029221 1 0 1 1 0 0 +EDGE2 6978 6879 1.04021 0.0149055 -0.0524564 1 0 1 1 0 0 +EDGE2 6978 6877 -1.11099 -0.0440776 0.0486665 1 0 1 1 0 0 +EDGE2 6978 6977 -0.974521 0.0259881 -0.010915 1 0 1 1 0 0 +EDGE2 6978 6878 -0.1141 -0.0151166 0.00260762 1 0 1 1 0 0 +EDGE2 6979 6880 0.987494 -0.0206474 -0.0105586 1 0 1 1 0 0 +EDGE2 6979 6978 -0.910168 0.0584337 -0.0242356 1 0 1 1 0 0 +EDGE2 6979 6879 0.0266649 0.064902 -0.0220454 1 0 1 1 0 0 +EDGE2 6979 6878 -0.951562 -0.00319754 0.000807522 1 0 1 1 0 0 +EDGE2 6980 6979 -0.970412 0.026267 0.0142408 1 0 1 1 0 0 +EDGE2 6980 6880 0.0133618 0.0130998 -0.00562269 1 0 1 1 0 0 +EDGE2 6980 6881 -0.0477025 0.977215 1.55599 1 0 1 1 0 0 +EDGE2 6980 6879 -0.950788 0.0119113 -0.0301853 1 0 1 1 0 0 +EDGE2 6981 6980 -0.93582 -0.00804575 1.57607 1 0 1 1 0 0 +EDGE2 6981 6880 -0.956188 0.0257014 1.56215 1 0 1 1 0 0 +EDGE2 6982 6981 -1.0426 0.0556854 0.024232 1 0 1 1 0 0 +EDGE2 6983 6982 -1.03624 -0.148047 -0.00411867 1 0 1 1 0 0 +EDGE2 6984 6983 -0.945301 -0.0144487 -0.0273141 1 0 1 1 0 0 +EDGE2 6985 6984 -1.09829 -0.0138132 0.00131831 1 0 1 1 0 0 +EDGE2 6986 6985 -0.926014 -0.127794 -1.57424 1 0 1 1 0 0 +EDGE2 6987 6986 -1.00277 -0.0585382 -0.0327707 1 0 1 1 0 0 +EDGE2 6988 6987 -0.936724 -0.0291748 -0.00178617 1 0 1 1 0 0 +EDGE2 6989 6988 -1.06684 -0.00675619 0.0184785 1 0 1 1 0 0 +EDGE2 6990 6989 -1.01116 -0.0312504 -0.0139623 1 0 1 1 0 0 +EDGE2 6991 6990 -0.938435 0.0486486 1.55754 1 0 1 1 0 0 +EDGE2 6992 6991 -1.0484 0.0153691 -0.0248302 1 0 1 1 0 0 +EDGE2 6993 6992 -1.09986 0.116696 -0.0432903 1 0 1 1 0 0 +EDGE2 6994 6993 -1.0663 -0.000125288 0.033188 1 0 1 1 0 0 +EDGE2 6995 6994 -1.01673 0.000700922 -0.00365712 1 0 1 1 0 0 +EDGE2 6996 6995 -1.03261 -0.00865619 1.55457 1 0 1 1 0 0 +EDGE2 6997 6996 -0.966386 0.090622 -0.0139471 1 0 1 1 0 0 +EDGE2 6998 6997 -1.03967 -0.11272 -0.0109436 1 0 1 1 0 0 +EDGE2 6999 6998 -0.991499 0.0039702 0.0221677 1 0 1 1 0 0 +EDGE2 7000 6999 -0.914988 0.00103078 -0.0261417 1 0 1 1 0 0 +EDGE2 7001 7000 -0.950272 -0.00518723 -1.55852 1 0 1 1 0 0 +EDGE2 7002 7001 -1.07639 0.0409521 -0.00872493 1 0 1 1 0 0 +EDGE2 7003 7002 -1.05868 0.00508698 0.00301099 1 0 1 1 0 0 +EDGE2 7004 7003 -1.02477 -0.0251036 -0.00359483 1 0 1 1 0 0 +EDGE2 7005 7004 -0.945891 -0.0186505 0.0120892 1 0 1 1 0 0 +EDGE2 7006 7005 -1.07276 -0.00274022 -1.57025 1 0 1 1 0 0 +EDGE2 7007 7006 -0.951148 0.0762679 -0.0321807 1 0 1 1 0 0 +EDGE2 7008 7007 -0.98095 0.0357657 0.0194568 1 0 1 1 0 0 +EDGE2 7009 7008 -1.00038 -0.00157911 0.0183403 1 0 1 1 0 0 +EDGE2 7010 7009 -1.02714 0.014737 -0.045947 1 0 1 1 0 0 +EDGE2 7011 7010 -1.03682 0.0696201 -1.58988 1 0 1 1 0 0 +EDGE2 7012 7011 -0.964927 0.0589713 -0.0179124 1 0 1 1 0 0 +EDGE2 7013 7012 -0.986912 -0.00922319 0.0148571 1 0 1 1 0 0 +EDGE2 7014 7013 -0.955428 -0.0280854 -0.00906926 1 0 1 1 0 0 +EDGE2 7014 6995 1.03314 -0.0129244 -3.15434 1 0 1 1 0 0 +EDGE2 7015 7014 -1.01786 -0.0146477 0.00754803 1 0 1 1 0 0 +EDGE2 7015 6995 0.0134603 0.0171705 -3.16338 1 0 1 1 0 0 +EDGE2 7015 6994 0.87866 -0.105129 -3.12427 1 0 1 1 0 0 +EDGE2 7015 6996 0.0123327 1.09302 1.60368 1 0 1 1 0 0 +EDGE2 7016 6995 -0.952294 -0.0669765 1.55678 1 0 1 1 0 0 +EDGE2 7016 7015 -1.02196 -0.0139802 -1.56584 1 0 1 1 0 0 +EDGE2 7016 6996 -0.0231409 0.00354893 -0.00272493 1 0 1 1 0 0 +EDGE2 7016 6997 1.09967 -0.113014 -0.00062182 1 0 1 1 0 0 +EDGE2 7017 7016 -1.03351 -0.0853158 0.0127197 1 0 1 1 0 0 +EDGE2 7017 6996 -0.909947 0.0253406 0.0546282 1 0 1 1 0 0 +EDGE2 7017 6997 -0.0547322 0.000950229 -0.00525911 1 0 1 1 0 0 +EDGE2 7017 6998 0.939655 0.0146546 -0.0094084 1 0 1 1 0 0 +EDGE2 7018 6999 1.05048 0.0324266 -0.0356358 1 0 1 1 0 0 +EDGE2 7018 6997 -1.03997 0.0436196 -0.00321932 1 0 1 1 0 0 +EDGE2 7018 7017 -1.09904 -0.0117234 -0.0379539 1 0 1 1 0 0 +EDGE2 7018 6998 -0.067109 -0.0999598 0.0279734 1 0 1 1 0 0 +EDGE2 7019 6999 -0.0226695 0.0200412 0.0249448 1 0 1 1 0 0 +EDGE2 7019 6998 -0.934674 0.0611244 0.0117649 1 0 1 1 0 0 +EDGE2 7019 7018 -1.00754 0.0342003 -0.0491771 1 0 1 1 0 0 +EDGE2 7019 7000 1.03722 0.00354997 -0.0301011 1 0 1 1 0 0 +EDGE2 7020 6999 -1.10765 0.0415665 -0.0400265 1 0 1 1 0 0 +EDGE2 7020 7019 -0.978168 0.035688 -0.0101602 1 0 1 1 0 0 +EDGE2 7020 7001 -0.0416706 0.936014 1.57737 1 0 1 1 0 0 +EDGE2 7020 7000 -0.0616798 0.0958192 0.0101824 1 0 1 1 0 0 +EDGE2 7021 7002 1.04456 -0.0502528 0.0234708 1 0 1 1 0 0 +EDGE2 7021 7001 -0.0278578 0.0181399 -0.0252894 1 0 1 1 0 0 +EDGE2 7021 7000 -1.00305 -0.0084154 -1.56961 1 0 1 1 0 0 +EDGE2 7021 7020 -0.963921 0.0546116 -1.56786 1 0 1 1 0 0 +EDGE2 7022 7003 0.981626 -0.0338009 -0.0248117 1 0 1 1 0 0 +EDGE2 7022 7002 3.2498e-05 -0.0557268 -0.0128317 1 0 1 1 0 0 +EDGE2 7022 7001 -1.05612 -0.0677512 0.0111273 1 0 1 1 0 0 +EDGE2 7022 7021 -1.03654 -0.0393655 0.0200353 1 0 1 1 0 0 +EDGE2 7023 7004 1.00756 -0.0267876 0.0181647 1 0 1 1 0 0 +EDGE2 7023 7003 0.11843 -0.00957694 0.0020945 1 0 1 1 0 0 +EDGE2 7023 7002 -1.04373 -0.0202556 -0.0219689 1 0 1 1 0 0 +EDGE2 7023 7022 -0.948803 -0.091817 0.0142932 1 0 1 1 0 0 +EDGE2 7024 7005 0.985773 0.117165 0.0122524 1 0 1 1 0 0 +EDGE2 7024 7004 0.0224069 0.0298507 -0.0473253 1 0 1 1 0 0 +EDGE2 7024 7003 -1.07627 0.0152124 -0.016945 1 0 1 1 0 0 +EDGE2 7024 7023 -1.11883 0.0287378 0.0258994 1 0 1 1 0 0 +EDGE2 7025 7006 0.0360419 0.998705 1.56593 1 0 1 1 0 0 +EDGE2 7025 7005 -0.0589325 0.105563 -0.000489971 1 0 1 1 0 0 +EDGE2 7025 7024 -1.05513 -0.0599366 -0.0271211 1 0 1 1 0 0 +EDGE2 7025 7004 -0.894224 0.00873133 0.0161941 1 0 1 1 0 0 +EDGE2 7026 7007 1.00625 -0.0185908 -0.0282592 1 0 1 1 0 0 +EDGE2 7026 7006 0.00758216 -0.0178949 -0.0296164 1 0 1 1 0 0 +EDGE2 7026 7005 -1.04729 0.0538348 -1.55089 1 0 1 1 0 0 +EDGE2 7026 7025 -1.07972 0.0601829 -1.55217 1 0 1 1 0 0 +EDGE2 7027 7007 0.0530114 -0.0427271 -0.0180721 1 0 1 1 0 0 +EDGE2 7027 7008 0.91194 -0.0151285 0.0467291 1 0 1 1 0 0 +EDGE2 7027 7006 -0.969219 0.0403771 0.0134545 1 0 1 1 0 0 +EDGE2 7027 7026 -1.01864 0.012722 -0.0237802 1 0 1 1 0 0 +EDGE2 7028 7009 0.940739 0.100249 0.000257463 1 0 1 1 0 0 +EDGE2 7028 7007 -0.892764 -0.0880242 0.00344668 1 0 1 1 0 0 +EDGE2 7028 7008 0.0476444 -0.0652052 -0.00716779 1 0 1 1 0 0 +EDGE2 7028 7027 -0.997993 -0.0549394 -0.00564057 1 0 1 1 0 0 +EDGE2 7029 7010 1.05569 -0.00280078 -0.0119773 1 0 1 1 0 0 +EDGE2 7029 7009 -0.00940892 0.00989657 0.0199197 1 0 1 1 0 0 +EDGE2 7029 7008 -0.970307 -0.115171 0.0166359 1 0 1 1 0 0 +EDGE2 7029 7028 -1.04551 -0.0392029 -0.0132269 1 0 1 1 0 0 +EDGE2 7030 7010 0.0346682 -0.0236963 0.014801 1 0 1 1 0 0 +EDGE2 7030 7029 -0.962175 -0.0648995 0.0133102 1 0 1 1 0 0 +EDGE2 7030 7009 -0.998014 0.0495257 0.00721129 1 0 1 1 0 0 +EDGE2 7030 7011 0.0962617 1.10538 1.54226 1 0 1 1 0 0 +EDGE2 7031 7010 -0.962863 0.0525767 -1.59196 1 0 1 1 0 0 +EDGE2 7031 7030 -0.956118 0.0221651 -1.57816 1 0 1 1 0 0 +EDGE2 7031 7011 0.0325244 0.0692526 -0.0385646 1 0 1 1 0 0 +EDGE2 7031 7012 0.901834 -0.0188481 -0.0194489 1 0 1 1 0 0 +EDGE2 7032 7031 -0.982543 -0.0367615 0.00308206 1 0 1 1 0 0 +EDGE2 7032 7011 -1.05361 -0.0309877 -0.0091966 1 0 1 1 0 0 +EDGE2 7032 7012 -0.0431692 0.0369125 0.0159452 1 0 1 1 0 0 +EDGE2 7032 7013 1.06945 0.0419306 0.0188081 1 0 1 1 0 0 +EDGE2 7033 7032 -0.999467 0.00272759 0.0151957 1 0 1 1 0 0 +EDGE2 7033 7012 -1.01567 -0.0147209 -0.00205898 1 0 1 1 0 0 +EDGE2 7033 7013 -0.029485 -0.0560148 -0.0279074 1 0 1 1 0 0 +EDGE2 7033 7014 1.01255 -0.0399575 0.0131004 1 0 1 1 0 0 +EDGE2 7034 7033 -1.01974 0.0256619 7.09278e-05 1 0 1 1 0 0 +EDGE2 7034 7013 -1.01465 0.0157345 0.0370394 1 0 1 1 0 0 +EDGE2 7034 7014 0.0398409 0.0938111 0.0284202 1 0 1 1 0 0 +EDGE2 7034 6995 1.04102 0.0515553 -3.17342 1 0 1 1 0 0 +EDGE2 7034 7015 1.00177 0.0491272 -0.00359788 1 0 1 1 0 0 +EDGE2 7035 7034 -0.932579 -0.0286213 0.00215579 1 0 1 1 0 0 +EDGE2 7035 7014 -1.02739 0.00583328 0.014333 1 0 1 1 0 0 +EDGE2 7035 6995 -0.0345716 -0.0279692 -3.13609 1 0 1 1 0 0 +EDGE2 7035 7015 -0.0084447 0.0100923 -0.0356186 1 0 1 1 0 0 +EDGE2 7035 6994 1.02221 -0.0466942 -3.13626 1 0 1 1 0 0 +EDGE2 7035 7016 -0.0161103 1.01266 1.59044 1 0 1 1 0 0 +EDGE2 7035 6996 -0.0422568 1.01162 1.60549 1 0 1 1 0 0 +EDGE2 7036 6995 -0.936317 0.136652 1.57906 1 0 1 1 0 0 +EDGE2 7036 7035 -1.03927 0.00439543 -1.55069 1 0 1 1 0 0 +EDGE2 7036 7015 -0.99588 -0.0801551 -1.56817 1 0 1 1 0 0 +EDGE2 7036 7016 0.0106259 -0.0820522 0.0116202 1 0 1 1 0 0 +EDGE2 7036 6996 0.0355111 0.00330937 0.0109423 1 0 1 1 0 0 +EDGE2 7036 6997 0.985413 -0.00694777 0.00793887 1 0 1 1 0 0 +EDGE2 7036 7017 1.09477 0.0259391 -0.00802999 1 0 1 1 0 0 +EDGE2 7037 7016 -0.991082 -0.0401732 0.00735747 1 0 1 1 0 0 +EDGE2 7037 7036 -0.984259 0.0315389 -0.00598296 1 0 1 1 0 0 +EDGE2 7037 6996 -1.00933 0.000494837 -0.0201897 1 0 1 1 0 0 +EDGE2 7037 6997 -0.017128 0.00898281 0.00572613 1 0 1 1 0 0 +EDGE2 7037 7017 0.00889602 -0.00855952 0.0325142 1 0 1 1 0 0 +EDGE2 7037 6998 0.960783 -0.0217917 -0.00341991 1 0 1 1 0 0 +EDGE2 7037 7018 1.0072 -0.0320667 -0.0207058 1 0 1 1 0 0 +EDGE2 7038 6999 0.952535 0.0208972 -0.017558 1 0 1 1 0 0 +EDGE2 7038 6997 -1.0314 0.00638167 0.0128683 1 0 1 1 0 0 +EDGE2 7038 7017 -1.02659 -0.0557733 -0.0258501 1 0 1 1 0 0 +EDGE2 7038 7037 -0.964897 -0.0620593 -0.0328329 1 0 1 1 0 0 +EDGE2 7038 6998 -0.0689573 0.0378398 0.0117538 1 0 1 1 0 0 +EDGE2 7038 7018 -0.0549851 -0.00518071 0.0148754 1 0 1 1 0 0 +EDGE2 7038 7019 0.888269 -0.0353096 -0.00364041 1 0 1 1 0 0 +EDGE2 7039 6999 0.0630443 0.0263792 0.0269015 1 0 1 1 0 0 +EDGE2 7039 7038 -1.05737 -0.0539368 0.0026365 1 0 1 1 0 0 +EDGE2 7039 6998 -1.13393 -0.049352 -0.013715 1 0 1 1 0 0 +EDGE2 7039 7018 -1.06812 0.0458174 0.00687499 1 0 1 1 0 0 +EDGE2 7039 7019 -0.0274487 0.0677148 -0.00811188 1 0 1 1 0 0 +EDGE2 7039 7000 1.08091 -0.120021 0.00621844 1 0 1 1 0 0 +EDGE2 7039 7020 1.0216 0.0762403 -0.031044 1 0 1 1 0 0 +EDGE2 7040 6999 -0.974377 0.0944643 -0.011542 1 0 1 1 0 0 +EDGE2 7040 7039 -0.980689 -0.000792005 -0.00169851 1 0 1 1 0 0 +EDGE2 7040 7019 -0.989811 -0.07826 -0.0117817 1 0 1 1 0 0 +EDGE2 7040 7001 0.0438465 0.967002 1.59771 1 0 1 1 0 0 +EDGE2 7040 7021 0.0497231 1.00857 1.5602 1 0 1 1 0 0 +EDGE2 7040 7000 0.0569685 0.0419562 0.00739392 1 0 1 1 0 0 +EDGE2 7040 7020 -0.0998601 -0.0953646 0.00838418 1 0 1 1 0 0 +EDGE2 7041 7040 -1.00603 0.0516753 -1.59957 1 0 1 1 0 0 +EDGE2 7041 7002 1.01203 -0.00444887 0.0220222 1 0 1 1 0 0 +EDGE2 7041 7022 0.988646 0.0728271 0.0118759 1 0 1 1 0 0 +EDGE2 7041 7001 -0.0373645 0.0449095 -0.0180975 1 0 1 1 0 0 +EDGE2 7041 7021 0.0547992 -0.0316375 0.032437 1 0 1 1 0 0 +EDGE2 7041 7000 -1.01983 0.0399107 -1.54643 1 0 1 1 0 0 +EDGE2 7041 7020 -1.07047 0.0598504 -1.57772 1 0 1 1 0 0 +EDGE2 7042 7003 1.04358 0.0336287 -0.0332733 1 0 1 1 0 0 +EDGE2 7042 7023 1.02516 -0.0336943 0.0115339 1 0 1 1 0 0 +EDGE2 7042 7041 -1.03382 0.0485624 0.0102266 1 0 1 1 0 0 +EDGE2 7042 7002 -0.0102915 -0.0219641 0.0190982 1 0 1 1 0 0 +EDGE2 7042 7022 0.0687893 -0.0414534 0.0117556 1 0 1 1 0 0 +EDGE2 7042 7001 -1.03901 0.0494572 -0.00620533 1 0 1 1 0 0 +EDGE2 7042 7021 -0.920147 0.0406242 -0.0171067 1 0 1 1 0 0 +EDGE2 7043 7042 -1.11722 -0.0438089 0.00808642 1 0 1 1 0 0 +EDGE2 7043 7024 0.963789 -0.0832891 0.0285143 1 0 1 1 0 0 +EDGE2 7043 7004 0.934068 -0.0534436 0.0123226 1 0 1 1 0 0 +EDGE2 7043 7003 0.0254213 0.0354446 0.0265269 1 0 1 1 0 0 +EDGE2 7043 7023 0.0758894 0.0790106 0.043647 1 0 1 1 0 0 +EDGE2 7043 7002 -0.988091 -0.0170247 0.0116835 1 0 1 1 0 0 +EDGE2 7043 7022 -1.03703 0.00471421 -0.00735059 1 0 1 1 0 0 +EDGE2 7044 7005 0.956915 -0.0191611 -0.0366539 1 0 1 1 0 0 +EDGE2 7044 7025 0.985859 0.0235654 0.016717 1 0 1 1 0 0 +EDGE2 7044 7024 0.0645046 -0.0285044 0.0135817 1 0 1 1 0 0 +EDGE2 7044 7004 0.0523933 -0.0172829 0.0377199 1 0 1 1 0 0 +EDGE2 7044 7003 -0.98308 0.0258906 -0.0130387 1 0 1 1 0 0 +EDGE2 7044 7023 -1.05072 -0.00539995 0.0245981 1 0 1 1 0 0 +EDGE2 7044 7043 -0.932015 -0.012488 0.0179002 1 0 1 1 0 0 +EDGE2 7045 7006 -0.0755958 1.02512 1.56953 1 0 1 1 0 0 +EDGE2 7045 7026 0.0179276 1.01157 1.56554 1 0 1 1 0 0 +EDGE2 7045 7005 0.0164941 0.0858951 -0.0045191 1 0 1 1 0 0 +EDGE2 7045 7025 0.0370961 0.00908194 0.0306979 1 0 1 1 0 0 +EDGE2 7045 7024 -1.00356 0.0193651 0.00776604 1 0 1 1 0 0 +EDGE2 7045 7044 -0.966775 -0.024804 0.00053947 1 0 1 1 0 0 +EDGE2 7045 7004 -0.943771 0.0621829 0.00360109 1 0 1 1 0 0 +EDGE2 7046 7007 1.00915 -0.0818107 -0.0273852 1 0 1 1 0 0 +EDGE2 7046 7027 1.07089 -0.119078 0.00331392 1 0 1 1 0 0 +EDGE2 7046 7006 0.0002024 0.132122 0.029956 1 0 1 1 0 0 +EDGE2 7046 7026 0.0663261 0.0195692 -0.0263244 1 0 1 1 0 0 +EDGE2 7046 7045 -0.978477 -0.0191082 -1.57166 1 0 1 1 0 0 +EDGE2 7046 7005 -0.998144 0.0029976 -1.58476 1 0 1 1 0 0 +EDGE2 7046 7025 -0.956514 0.0261657 -1.57632 1 0 1 1 0 0 +EDGE2 7047 7007 -0.0600513 -0.0118591 0.0101457 1 0 1 1 0 0 +EDGE2 7047 7008 1.03587 0.003765 -0.0102643 1 0 1 1 0 0 +EDGE2 7047 7028 0.984635 0.0960461 0.00864139 1 0 1 1 0 0 +EDGE2 7047 7027 0.0400901 -0.0601919 0.0197285 1 0 1 1 0 0 +EDGE2 7047 7046 -0.982821 0.00179192 0.0228327 1 0 1 1 0 0 +EDGE2 7047 7006 -1.06612 -0.0105621 -0.00636232 1 0 1 1 0 0 +EDGE2 7047 7026 -1.0439 0.0130195 0.00737761 1 0 1 1 0 0 +EDGE2 7048 7029 1.00105 0.0159559 -0.00690135 1 0 1 1 0 0 +EDGE2 7048 7009 0.950447 -0.0914653 0.013997 1 0 1 1 0 0 +EDGE2 7048 7007 -0.936129 -0.0194207 0.0148588 1 0 1 1 0 0 +EDGE2 7048 7008 -0.0207953 0.0104824 -0.0102619 1 0 1 1 0 0 +EDGE2 7048 7028 0.0307686 -0.0493614 0.0308292 1 0 1 1 0 0 +EDGE2 7048 7047 -0.975924 0.0918703 0.029391 1 0 1 1 0 0 +EDGE2 7048 7027 -1.02886 0.00189403 -0.00246953 1 0 1 1 0 0 +EDGE2 7049 7010 1.03511 -0.0217056 0.0256495 1 0 1 1 0 0 +EDGE2 7049 7030 0.958387 0.0968641 -0.0174663 1 0 1 1 0 0 +EDGE2 7049 7029 0.0115795 -0.0641076 0.0116112 1 0 1 1 0 0 +EDGE2 7049 7009 0.0252876 -0.0205049 0.0112154 1 0 1 1 0 0 +EDGE2 7049 7008 -0.972366 0.0406718 0.00541473 1 0 1 1 0 0 +EDGE2 7049 7048 -1.08791 -0.0344093 0.000426394 1 0 1 1 0 0 +EDGE2 7049 7028 -1.00064 -0.0664063 -0.00225665 1 0 1 1 0 0 +EDGE2 7050 7010 -0.0507689 0.0248234 0.00281938 1 0 1 1 0 0 +EDGE2 7050 7030 0.02352 0.018998 -0.00345042 1 0 1 1 0 0 +EDGE2 7050 7029 -1.00277 -0.0699864 -0.00656657 1 0 1 1 0 0 +EDGE2 7050 7049 -1.01192 0.0135597 0.00630239 1 0 1 1 0 0 +EDGE2 7050 7009 -0.971777 -0.000484891 0.0296137 1 0 1 1 0 0 +EDGE2 7050 7031 -0.0164233 0.98283 1.56258 1 0 1 1 0 0 +EDGE2 7050 7011 0.0737987 1.03934 1.57356 1 0 1 1 0 0 +EDGE2 7051 7010 -0.955487 0.0251672 1.54709 1 0 1 1 0 0 +EDGE2 7051 7030 -0.909364 -0.0155877 1.54338 1 0 1 1 0 0 +EDGE2 7051 7050 -0.944947 0.0148333 1.59555 1 0 1 1 0 0 +EDGE2 7052 7051 -0.994873 -0.0533539 -0.0125996 1 0 1 1 0 0 +EDGE2 7053 7052 -1.05161 0.0525351 0.0028005 1 0 1 1 0 0 +EDGE2 7054 7053 -0.88305 -0.0304953 -0.0336005 1 0 1 1 0 0 +EDGE2 7055 7054 -1.00006 -0.0825916 -0.00656092 1 0 1 1 0 0 +EDGE2 7056 7055 -0.952817 0.102661 -1.57333 1 0 1 1 0 0 +EDGE2 7057 7056 -1.01426 -0.0567163 0.0321449 1 0 1 1 0 0 +EDGE2 7058 7057 -1.06666 0.0327283 -0.0122784 1 0 1 1 0 0 +EDGE2 7059 7058 -1.01289 0.0387172 -0.00275712 1 0 1 1 0 0 +EDGE2 7060 7059 -0.929211 -0.0643779 -0.02047 1 0 1 1 0 0 +EDGE2 7061 7060 -0.935811 0.00723887 1.55034 1 0 1 1 0 0 +EDGE2 7062 7061 -1.02893 -0.0227661 0.0411737 1 0 1 1 0 0 +EDGE2 7063 7062 -0.954809 0.0955492 -0.0230957 1 0 1 1 0 0 +EDGE2 7064 7063 -1.03804 0.0554712 -0.0273523 1 0 1 1 0 0 +EDGE2 7065 7064 -0.942011 0.0206858 -0.0129971 1 0 1 1 0 0 +EDGE2 7066 7065 -0.979609 -0.00500152 -1.57101 1 0 1 1 0 0 +EDGE2 7067 7066 -1.0097 0.129693 0.0114845 1 0 1 1 0 0 +EDGE2 7068 7067 -0.959849 0.0466977 0.0108799 1 0 1 1 0 0 +EDGE2 7069 7068 -0.966476 -0.0682674 -0.0195541 1 0 1 1 0 0 +EDGE2 7070 7069 -1.05802 0.0718155 0.00739604 1 0 1 1 0 0 +EDGE2 7071 7070 -1.03659 -0.0255258 1.59557 1 0 1 1 0 0 +EDGE2 7072 7071 -0.980316 -0.0387479 -0.00666681 1 0 1 1 0 0 +EDGE2 7073 7072 -0.947477 -0.0179162 0.0282717 1 0 1 1 0 0 +EDGE2 7074 7073 -0.996457 0.0941157 -0.0224208 1 0 1 1 0 0 +EDGE2 7075 7074 -0.977471 -0.0342715 0.0168456 1 0 1 1 0 0 +EDGE2 7076 7075 -1.01214 0.0525396 -1.58068 1 0 1 1 0 0 +EDGE2 7077 7076 -1.00056 -0.0480342 0.0259562 1 0 1 1 0 0 +EDGE2 7078 7077 -1.02061 0.0681274 0.0383438 1 0 1 1 0 0 +EDGE2 7079 7078 -1.04935 0.00477107 -0.00732897 1 0 1 1 0 0 +EDGE2 7080 7079 -0.96832 -0.0259811 -0.0107211 1 0 1 1 0 0 +EDGE2 7081 7080 -0.966281 0.0577646 -1.52323 1 0 1 1 0 0 +EDGE2 7082 7081 -0.996225 -0.040226 0.00644288 1 0 1 1 0 0 +EDGE2 7083 7082 -1.0306 0.0110329 0.00533254 1 0 1 1 0 0 +EDGE2 7084 7083 -1.14818 -0.00440583 0.0151688 1 0 1 1 0 0 +EDGE2 7085 7084 -1.01202 -0.0600914 0.0252353 1 0 1 1 0 0 +EDGE2 7086 7085 -1.08752 0.0016655 -1.55647 1 0 1 1 0 0 +EDGE2 7087 7086 -0.974996 -0.0244532 -0.00239806 1 0 1 1 0 0 +EDGE2 7088 7087 -0.983807 0.0232354 0.00530222 1 0 1 1 0 0 +EDGE2 7089 7088 -0.976539 0.0548557 -0.0268706 1 0 1 1 0 0 +EDGE2 7089 7070 1.09971 -0.0433012 -3.10353 1 0 1 1 0 0 +EDGE2 7090 7089 -0.988133 0.0297909 0.040632 1 0 1 1 0 0 +EDGE2 7090 7071 0.0153756 0.987664 1.58971 1 0 1 1 0 0 +EDGE2 7090 7069 1.02766 0.0238015 -3.11038 1 0 1 1 0 0 +EDGE2 7090 7070 -0.0238568 -0.0113939 -3.17663 1 0 1 1 0 0 +EDGE2 7091 7090 -0.944945 0.056685 1.56888 1 0 1 1 0 0 +EDGE2 7091 7070 -1.01712 0.0220569 -1.54229 1 0 1 1 0 0 +EDGE2 7092 7091 -0.960147 0.0197118 -6.47259e-05 1 0 1 1 0 0 +EDGE2 7093 7092 -1.09922 0.0680964 0.022117 1 0 1 1 0 0 +EDGE2 7094 7093 -0.948307 0.0602438 0.000961113 1 0 1 1 0 0 +EDGE2 7095 7094 -0.934286 0.0108381 -0.0241759 1 0 1 1 0 0 +EDGE2 7096 7095 -0.990123 -0.0963352 -1.56892 1 0 1 1 0 0 +EDGE2 7097 7096 -0.963349 0.065122 0.0250317 1 0 1 1 0 0 +EDGE2 7098 7097 -0.961924 0.0360329 -0.0144598 1 0 1 1 0 0 +EDGE2 7099 7098 -0.994745 0.0193915 0.0240541 1 0 1 1 0 0 +EDGE2 7099 7060 0.985803 -0.0528702 -3.11719 1 0 1 1 0 0 +EDGE2 7100 7099 -1.0314 -0.00538007 -0.00227009 1 0 1 1 0 0 +EDGE2 7100 7061 0.0878383 0.987849 1.57985 1 0 1 1 0 0 +EDGE2 7100 7060 0.0377871 0.0348997 -3.14841 1 0 1 1 0 0 +EDGE2 7100 7059 0.982654 0.0403983 -3.17107 1 0 1 1 0 0 +EDGE2 7101 7061 -0.0460121 -0.00396435 0.00884475 1 0 1 1 0 0 +EDGE2 7101 7062 1.03926 0.0849314 -0.0343931 1 0 1 1 0 0 +EDGE2 7101 7060 -1.02828 0.000486798 1.58024 1 0 1 1 0 0 +EDGE2 7101 7100 -0.968555 0.044054 -1.5425 1 0 1 1 0 0 +EDGE2 7102 7061 -0.955989 -0.00230805 0.0331307 1 0 1 1 0 0 +EDGE2 7102 7062 0.0404033 0.053511 0.00125611 1 0 1 1 0 0 +EDGE2 7102 7063 0.954977 -0.0259595 -0.0202095 1 0 1 1 0 0 +EDGE2 7102 7101 -1.0878 0.0285441 0.0095216 1 0 1 1 0 0 +EDGE2 7103 7064 1.00031 0.138673 0.0288167 1 0 1 1 0 0 +EDGE2 7103 7062 -0.953812 -0.0655928 -0.0092508 1 0 1 1 0 0 +EDGE2 7103 7102 -1.01453 -0.0358436 0.0309215 1 0 1 1 0 0 +EDGE2 7103 7063 -0.0175188 -0.110743 -0.0122744 1 0 1 1 0 0 +EDGE2 7104 7103 -0.954925 0.0437347 -0.0295068 1 0 1 1 0 0 +EDGE2 7104 7065 0.989577 -0.0960804 0.00488675 1 0 1 1 0 0 +EDGE2 7104 7064 -0.00885257 0.0476065 -0.0291864 1 0 1 1 0 0 +EDGE2 7104 7063 -0.968392 0.0179584 -0.0433938 1 0 1 1 0 0 +EDGE2 7105 7066 -0.0157386 0.989066 1.5771 1 0 1 1 0 0 +EDGE2 7105 7104 -0.934266 0.006404 -0.0374043 1 0 1 1 0 0 +EDGE2 7105 7065 -0.154646 0.0484811 0.000878416 1 0 1 1 0 0 +EDGE2 7105 7064 -0.975742 -0.0569545 -0.0264631 1 0 1 1 0 0 +EDGE2 7106 7065 -1.10657 -0.00976506 1.56059 1 0 1 1 0 0 +EDGE2 7106 7105 -1.004 -0.0195966 1.59353 1 0 1 1 0 0 +EDGE2 7107 7106 -1.09031 -0.00531866 -0.0155316 1 0 1 1 0 0 +EDGE2 7108 7107 -1.01896 -0.076426 -0.00315929 1 0 1 1 0 0 +EDGE2 7109 7108 -0.871735 -0.0522213 -0.00107269 1 0 1 1 0 0 +EDGE2 7110 7109 -0.898777 -0.0550958 0.00495672 1 0 1 1 0 0 +EDGE2 7111 7110 -0.955709 0.0313805 -1.61838 1 0 1 1 0 0 +EDGE2 7112 7111 -1.03245 -0.0482623 -0.00616785 1 0 1 1 0 0 +EDGE2 7113 7112 -1.05111 0.00473091 0.0309623 1 0 1 1 0 0 +EDGE2 7114 7113 -0.96256 -0.0425437 -0.0114741 1 0 1 1 0 0 +EDGE2 7115 7114 -0.894361 0.0206866 0.0347694 1 0 1 1 0 0 +EDGE2 7116 7115 -1.02048 0.0535648 -1.58276 1 0 1 1 0 0 +EDGE2 7117 7116 -0.963461 0.0454374 -0.00916764 1 0 1 1 0 0 +EDGE2 7118 7117 -0.925301 -0.0194276 0.0252992 1 0 1 1 0 0 +EDGE2 7119 7118 -0.96389 0.122044 0.0260503 1 0 1 1 0 0 +EDGE2 7120 7119 -1.06307 0.0163544 0.0108771 1 0 1 1 0 0 +EDGE2 7121 7120 -0.940173 -0.0555594 -1.60635 1 0 1 1 0 0 +EDGE2 7122 7121 -1.03078 -0.0283724 0.00824713 1 0 1 1 0 0 +EDGE2 7123 7122 -1.00302 -0.044961 -0.00742833 1 0 1 1 0 0 +EDGE2 7124 7123 -1.03074 -0.0187789 -0.0408291 1 0 1 1 0 0 +EDGE2 7124 7065 0.980669 0.0160049 -3.13888 1 0 1 1 0 0 +EDGE2 7124 7105 1.05304 -0.0725473 -3.14294 1 0 1 1 0 0 +EDGE2 7125 7124 -1.0071 0.0266005 0.00888019 1 0 1 1 0 0 +EDGE2 7125 7066 0.00481671 -1.00309 -1.58131 1 0 1 1 0 0 +EDGE2 7125 7104 0.999872 -0.0701337 -3.1486 1 0 1 1 0 0 +EDGE2 7125 7065 -0.0018724 0.0719555 -3.11597 1 0 1 1 0 0 +EDGE2 7125 7105 0.0707817 0.0359906 -3.15233 1 0 1 1 0 0 +EDGE2 7125 7064 0.983672 0.00491053 -3.09837 1 0 1 1 0 0 +EDGE2 7125 7106 0.00165187 0.887338 1.56772 1 0 1 1 0 0 +EDGE2 7126 7125 -1.10524 0.048255 -1.56863 1 0 1 1 0 0 +EDGE2 7126 7065 -1.09949 0.0235269 1.53822 1 0 1 1 0 0 +EDGE2 7126 7105 -1.01437 -0.0531492 1.58818 1 0 1 1 0 0 +EDGE2 7126 7106 0.000584436 -0.00840985 -0.000166214 1 0 1 1 0 0 +EDGE2 7126 7107 1.03867 -0.0424697 0.00771318 1 0 1 1 0 0 +EDGE2 7127 7126 -1.05396 -0.0270526 -0.0108227 1 0 1 1 0 0 +EDGE2 7127 7106 -0.883368 0.00501981 0.0126031 1 0 1 1 0 0 +EDGE2 7127 7107 0.0837869 -0.0501792 0.0268775 1 0 1 1 0 0 +EDGE2 7127 7108 1.01316 0.125707 0.000675964 1 0 1 1 0 0 +EDGE2 7128 7107 -0.966707 0.000301571 -0.0215894 1 0 1 1 0 0 +EDGE2 7128 7127 -1.0378 0.0486278 -0.0108492 1 0 1 1 0 0 +EDGE2 7128 7108 -0.0332699 -0.0135694 -0.0458677 1 0 1 1 0 0 +EDGE2 7128 7109 1.00565 0.127765 0.00130752 1 0 1 1 0 0 +EDGE2 7129 7128 -0.976661 -0.00119905 -0.0302825 1 0 1 1 0 0 +EDGE2 7129 7108 -0.953931 -0.0805898 0.0326916 1 0 1 1 0 0 +EDGE2 7129 7109 0.038708 0.0786992 0.0278416 1 0 1 1 0 0 +EDGE2 7129 7110 0.978272 0.0269554 -0.0327086 1 0 1 1 0 0 +EDGE2 7130 7111 -0.00289849 1.09761 1.61029 1 0 1 1 0 0 +EDGE2 7130 7129 -1.00967 -0.0687412 -0.00368575 1 0 1 1 0 0 +EDGE2 7130 7109 -0.934513 0.0181807 -0.0284629 1 0 1 1 0 0 +EDGE2 7130 7110 -0.0250586 -0.00262547 -0.0141172 1 0 1 1 0 0 +EDGE2 7131 7112 0.925641 -0.0606036 -0.011332 1 0 1 1 0 0 +EDGE2 7131 7111 -0.0439827 -0.0115723 0.0167713 1 0 1 1 0 0 +EDGE2 7131 7110 -1.07068 -0.0136522 -1.60037 1 0 1 1 0 0 +EDGE2 7131 7130 -1.03533 -0.0563652 -1.59704 1 0 1 1 0 0 +EDGE2 7132 7113 0.963814 0.0644797 -0.0186077 1 0 1 1 0 0 +EDGE2 7132 7131 -0.9668 -0.0799058 -0.0155967 1 0 1 1 0 0 +EDGE2 7132 7112 0.0526683 0.13289 0.0166927 1 0 1 1 0 0 +EDGE2 7132 7111 -1.01442 -0.0262468 -0.00674286 1 0 1 1 0 0 +EDGE2 7133 7132 -1.10972 0.0314701 -0.0146193 1 0 1 1 0 0 +EDGE2 7133 7114 1.02361 0.0199574 -0.0394679 1 0 1 1 0 0 +EDGE2 7133 7113 -0.0574545 0.0117987 0.0376447 1 0 1 1 0 0 +EDGE2 7133 7112 -0.948829 0.0862376 -0.00555424 1 0 1 1 0 0 +EDGE2 7134 7115 0.994219 0.0261012 0.00460256 1 0 1 1 0 0 +EDGE2 7134 7133 -0.96136 0.0512045 -0.0017216 1 0 1 1 0 0 +EDGE2 7134 7114 -0.0393887 0.0319465 -0.0154991 1 0 1 1 0 0 +EDGE2 7134 7113 -0.92498 -0.00226702 -0.00598881 1 0 1 1 0 0 +EDGE2 7135 7116 0.056873 1.0173 1.57341 1 0 1 1 0 0 +EDGE2 7135 7134 -0.924639 -0.0336489 0.0665315 1 0 1 1 0 0 +EDGE2 7135 7115 0.0143237 -0.0573401 -0.00174092 1 0 1 1 0 0 +EDGE2 7135 7114 -0.997486 0.11559 0.0104137 1 0 1 1 0 0 +EDGE2 7136 7117 1.04186 -0.0199464 0.0266419 1 0 1 1 0 0 +EDGE2 7136 7116 0.0222785 -0.0394044 0.00802211 1 0 1 1 0 0 +EDGE2 7136 7135 -0.932581 -0.0282679 -1.57563 1 0 1 1 0 0 +EDGE2 7136 7115 -0.980379 0.0796039 -1.54361 1 0 1 1 0 0 +EDGE2 7137 7118 0.927389 0.00330762 0.00170608 1 0 1 1 0 0 +EDGE2 7137 7117 0.010771 -0.0878107 -0.0104426 1 0 1 1 0 0 +EDGE2 7137 7136 -0.977155 0.0323531 -0.00740019 1 0 1 1 0 0 +EDGE2 7137 7116 -1.03709 -0.0190124 0.00981013 1 0 1 1 0 0 +EDGE2 7138 7119 0.956807 -0.00317384 0.0167815 1 0 1 1 0 0 +EDGE2 7138 7118 -0.00860517 0.048979 0.0144528 1 0 1 1 0 0 +EDGE2 7138 7117 -0.968615 0.0227722 0.00554323 1 0 1 1 0 0 +EDGE2 7138 7137 -1.03975 -0.0159891 0.00649101 1 0 1 1 0 0 +EDGE2 7139 7120 0.969856 0.0148156 0.00145693 1 0 1 1 0 0 +EDGE2 7139 7119 -0.0757307 -0.03544 0.00313489 1 0 1 1 0 0 +EDGE2 7139 7138 -1.0673 0.0102094 -0.0165092 1 0 1 1 0 0 +EDGE2 7139 7118 -1.09581 0.0326865 0.0237804 1 0 1 1 0 0 +EDGE2 7140 7120 0.104543 -0.0530209 -0.00255174 1 0 1 1 0 0 +EDGE2 7140 7119 -1.07641 -0.00931954 -0.00788615 1 0 1 1 0 0 +EDGE2 7140 7121 -0.0336747 1.00326 1.57376 1 0 1 1 0 0 +EDGE2 7140 7139 -0.971324 -0.030427 -0.0332131 1 0 1 1 0 0 +EDGE2 7141 7120 -0.939308 -0.0133445 1.55742 1 0 1 1 0 0 +EDGE2 7141 7140 -0.94293 0.0650145 1.58683 1 0 1 1 0 0 +EDGE2 7142 7141 -1.04765 0.049056 -0.0123797 1 0 1 1 0 0 +EDGE2 7143 7142 -0.939798 -0.0909788 -0.00306385 1 0 1 1 0 0 +EDGE2 7144 7143 -0.998303 -0.0215675 -0.0155812 1 0 1 1 0 0 +EDGE2 7145 7144 -0.974991 0.0533777 -0.0453314 1 0 1 1 0 0 +EDGE2 7146 7145 -0.984447 -0.0489638 -1.57838 1 0 1 1 0 0 +EDGE2 7147 7146 -0.979819 -0.0263289 -0.00578839 1 0 1 1 0 0 +EDGE2 7148 7147 -0.97456 -0.0177353 -0.0119187 1 0 1 1 0 0 +EDGE2 7149 7148 -0.953519 0.0146358 -0.000540615 1 0 1 1 0 0 +EDGE2 7150 7149 -0.928508 0.0284495 0.0418891 1 0 1 1 0 0 +EDGE2 7151 7150 -0.991495 -0.0643542 -1.57038 1 0 1 1 0 0 +EDGE2 7152 7151 -1.018 -0.102966 -0.0208778 1 0 1 1 0 0 +EDGE2 7153 7152 -1.02951 -0.00735843 -0.0101583 1 0 1 1 0 0 +EDGE2 7154 7153 -1.03316 -0.00308946 0.0106826 1 0 1 1 0 0 +EDGE2 7154 7075 1.02768 0.031567 -3.15564 1 0 1 1 0 0 +EDGE2 7155 7076 -0.112518 -1.03397 -1.58615 1 0 1 1 0 0 +EDGE2 7155 7075 -0.0215981 -0.0567757 -3.13735 1 0 1 1 0 0 +EDGE2 7155 7154 -0.990596 0.00221 0.0216954 1 0 1 1 0 0 +EDGE2 7155 7074 1.03009 0.00227913 -3.17937 1 0 1 1 0 0 +EDGE2 7156 7075 -0.967478 0.00974306 1.61533 1 0 1 1 0 0 +EDGE2 7156 7155 -0.90594 0.0515279 -1.54743 1 0 1 1 0 0 +EDGE2 7157 7156 -0.956991 0.0121011 -0.0160946 1 0 1 1 0 0 +EDGE2 7158 7157 -1.0421 0.0447001 0.0208 1 0 1 1 0 0 +EDGE2 7159 7158 -1.06617 -0.0544833 0.0110296 1 0 1 1 0 0 +EDGE2 7159 7120 1.03057 0.0135296 -3.13665 1 0 1 1 0 0 +EDGE2 7159 7140 0.973926 0.0100732 -3.12674 1 0 1 1 0 0 +EDGE2 7160 7159 -1.10534 -0.0231051 -0.00650166 1 0 1 1 0 0 +EDGE2 7160 7141 0.0261018 1.05138 1.58595 1 0 1 1 0 0 +EDGE2 7160 7120 -0.0756429 -0.0303968 -3.15088 1 0 1 1 0 0 +EDGE2 7160 7140 -0.158635 -0.00683926 -3.13485 1 0 1 1 0 0 +EDGE2 7160 7119 0.941841 -0.0219725 -3.1475 1 0 1 1 0 0 +EDGE2 7160 7121 0.0437372 -0.937389 -1.5535 1 0 1 1 0 0 +EDGE2 7160 7139 1.09031 0.0849902 -3.16866 1 0 1 1 0 0 +EDGE2 7161 7142 0.989862 -0.0563464 -0.0163663 1 0 1 1 0 0 +EDGE2 7161 7141 0.0101432 0.0297565 0.0160243 1 0 1 1 0 0 +EDGE2 7161 7120 -0.921507 -0.0674213 1.5667 1 0 1 1 0 0 +EDGE2 7161 7140 -0.999113 -0.0441292 1.55897 1 0 1 1 0 0 +EDGE2 7161 7160 -0.95633 0.00813246 -1.58204 1 0 1 1 0 0 +EDGE2 7162 7143 1.0491 -0.0625159 0.00574082 1 0 1 1 0 0 +EDGE2 7162 7142 0.0298718 -0.0339702 -0.0105622 1 0 1 1 0 0 +EDGE2 7162 7141 -0.916245 0.0393704 -0.0130224 1 0 1 1 0 0 +EDGE2 7162 7161 -0.986271 0.0448661 0.0176539 1 0 1 1 0 0 +EDGE2 7163 7144 0.943376 0.0248955 -0.00449702 1 0 1 1 0 0 +EDGE2 7163 7162 -1.02755 -0.00485006 -0.00545967 1 0 1 1 0 0 +EDGE2 7163 7143 0.0289258 -0.0360573 -0.00483443 1 0 1 1 0 0 +EDGE2 7163 7142 -1.01748 0.0325586 0.0149113 1 0 1 1 0 0 +EDGE2 7164 7145 1.06755 0.0250642 0.00519382 1 0 1 1 0 0 +EDGE2 7164 7163 -1.03372 -0.112688 0.027164 1 0 1 1 0 0 +EDGE2 7164 7144 0.0622494 0.0334666 -0.0027985 1 0 1 1 0 0 +EDGE2 7164 7143 -0.947449 0.0208568 -0.025391 1 0 1 1 0 0 +EDGE2 7165 7146 0.0318544 1.01416 1.58551 1 0 1 1 0 0 +EDGE2 7165 7145 0.0752851 -0.00902927 0.00654448 1 0 1 1 0 0 +EDGE2 7165 7144 -0.941289 -0.0153944 0.00900824 1 0 1 1 0 0 +EDGE2 7165 7164 -0.949052 -0.0236966 -0.010418 1 0 1 1 0 0 +EDGE2 7166 7145 -0.976389 -0.0318437 1.6011 1 0 1 1 0 0 +EDGE2 7166 7165 -1.03306 0.0344037 1.56238 1 0 1 1 0 0 +EDGE2 7167 7166 -1.01301 -0.0471061 0.0479374 1 0 1 1 0 0 +EDGE2 7168 7167 -0.98137 -0.00521051 -0.001267 1 0 1 1 0 0 +EDGE2 7169 7168 -0.939186 -0.0142067 0.00364695 1 0 1 1 0 0 +EDGE2 7170 7169 -1.02195 -0.00354443 0.00085936 1 0 1 1 0 0 +EDGE2 7171 7170 -1.01315 -0.0849247 1.56455 1 0 1 1 0 0 +EDGE2 7172 7171 -0.983072 0.084532 0.0010368 1 0 1 1 0 0 +EDGE2 7173 7172 -0.980506 -0.0389689 0.0188213 1 0 1 1 0 0 +EDGE2 7174 7173 -1.12225 -0.0030487 -2.96491e-05 1 0 1 1 0 0 +EDGE2 7174 7135 0.939784 -0.00284316 -3.13909 1 0 1 1 0 0 +EDGE2 7174 7115 0.988444 -0.0344955 -3.13864 1 0 1 1 0 0 +EDGE2 7175 7136 0.00361475 -0.986401 -1.56203 1 0 1 1 0 0 +EDGE2 7175 7116 -0.0501497 -0.977386 -1.55265 1 0 1 1 0 0 +EDGE2 7175 7174 -0.999987 -0.107782 -0.0206478 1 0 1 1 0 0 +EDGE2 7175 7134 0.94321 0.00567769 -3.13784 1 0 1 1 0 0 +EDGE2 7175 7135 -0.0607927 -0.0506305 -3.15467 1 0 1 1 0 0 +EDGE2 7175 7115 0.0566321 -0.0895683 -3.15696 1 0 1 1 0 0 +EDGE2 7175 7114 1.01257 -0.0575455 -3.14672 1 0 1 1 0 0 +EDGE2 7176 7135 -0.952463 0.0515361 1.5697 1 0 1 1 0 0 +EDGE2 7176 7175 -1.02498 -0.0146699 -1.54032 1 0 1 1 0 0 +EDGE2 7176 7115 -1.00923 -0.0384823 1.54714 1 0 1 1 0 0 +EDGE2 7177 7176 -0.975252 -0.124013 -0.0046591 1 0 1 1 0 0 +EDGE2 7178 7177 -1.0464 -0.0432733 3.86746e-06 1 0 1 1 0 0 +EDGE2 7179 7178 -0.974769 0.0348052 0.0440564 1 0 1 1 0 0 +EDGE2 7180 7179 -1.00969 0.00782081 -0.0120096 1 0 1 1 0 0 +EDGE2 7181 7180 -0.942842 -0.115123 -1.57154 1 0 1 1 0 0 +EDGE2 7182 7181 -0.876036 -0.0144857 0.0269939 1 0 1 1 0 0 +EDGE2 7183 7182 -0.941692 0.000689227 -0.0330903 1 0 1 1 0 0 +EDGE2 7184 7183 -1.01999 -0.0221475 0.0138198 1 0 1 1 0 0 +EDGE2 7185 7184 -1.06182 0.0703342 -0.0299223 1 0 1 1 0 0 +EDGE2 7186 7185 -1.00283 -0.0456402 1.55986 1 0 1 1 0 0 +EDGE2 7187 7186 -1.05365 -0.0181409 0.0210679 1 0 1 1 0 0 +EDGE2 7188 7187 -0.940035 -0.0793007 -0.026813 1 0 1 1 0 0 +EDGE2 7189 7188 -0.992856 0.0432113 0.0318251 1 0 1 1 0 0 +EDGE2 7190 7189 -0.930221 0.067951 -0.000182849 1 0 1 1 0 0 +EDGE2 7191 7190 -1.00527 -0.0118595 1.54532 1 0 1 1 0 0 +EDGE2 7192 7191 -0.96864 -0.0103669 -0.00814984 1 0 1 1 0 0 +EDGE2 7193 7192 -0.964521 -0.0856727 -0.0316949 1 0 1 1 0 0 +EDGE2 7194 7193 -0.990911 -0.0196622 -0.0178749 1 0 1 1 0 0 +EDGE2 7195 7194 -0.991188 -0.0183609 -0.0177378 1 0 1 1 0 0 +EDGE2 7196 7195 -1.06083 0.0835484 -1.52376 1 0 1 1 0 0 +EDGE2 7197 7196 -0.934262 -0.0117585 0.00505612 1 0 1 1 0 0 +EDGE2 7198 7197 -0.974598 0.0414163 0.00757285 1 0 1 1 0 0 +EDGE2 7199 7198 -1.0633 0.0279699 0.0236764 1 0 1 1 0 0 +EDGE2 7200 7199 -1.0315 -0.00363884 0.002535 1 0 1 1 0 0 +EDGE2 7201 7200 -1.06181 -0.0390564 1.57846 1 0 1 1 0 0 +EDGE2 7202 7201 -0.947787 0.107251 -0.0382757 1 0 1 1 0 0 +EDGE2 7203 7202 -1.04134 0.00771679 -0.0229657 1 0 1 1 0 0 +EDGE2 7204 7203 -1.07713 -0.0314633 -0.0137719 1 0 1 1 0 0 +EDGE2 7205 7204 -1.02246 -0.0753176 0.0277824 1 0 1 1 0 0 +EDGE2 7206 7205 -0.950915 -0.0561191 -1.58227 1 0 1 1 0 0 +EDGE2 7207 7206 -0.972931 0.0280959 -0.0156205 1 0 1 1 0 0 +EDGE2 7208 7207 -1.02549 -0.098047 -0.0117213 1 0 1 1 0 0 +EDGE2 7209 7208 -1.021 0.0413069 0.0167686 1 0 1 1 0 0 +EDGE2 7209 6610 0.87361 0.0224125 -3.17696 1 0 1 1 0 0 +EDGE2 7210 7209 -1.01192 0.0240972 -0.00327566 1 0 1 1 0 0 +EDGE2 7210 6610 0.0347218 0.00654532 -3.17361 1 0 1 1 0 0 +EDGE2 7210 6611 -0.0308753 -0.930479 -1.5799 1 0 1 1 0 0 +EDGE2 7210 6609 0.910989 -0.0125727 -3.12984 1 0 1 1 0 0 +EDGE2 7211 6610 -1.0358 0.013834 1.56287 1 0 1 1 0 0 +EDGE2 7211 7210 -0.913927 0.0729544 -1.5493 1 0 1 1 0 0 +EDGE2 7212 7211 -1.058 0.0363029 0.0100019 1 0 1 1 0 0 +EDGE2 7213 7212 -0.995981 0.0301385 -0.00197951 1 0 1 1 0 0 +EDGE2 7214 7213 -1.00714 -0.000978134 0.0155174 1 0 1 1 0 0 +EDGE2 7215 7214 -1.06112 0.0652321 0.0170567 1 0 1 1 0 0 +EDGE2 7216 7215 -0.999453 0.0303593 -1.58523 1 0 1 1 0 0 +EDGE2 7217 7216 -1.00746 -0.00101042 -0.00705639 1 0 1 1 0 0 +EDGE2 7218 7217 -0.97754 0.0901492 0.0279503 1 0 1 1 0 0 +EDGE2 7219 7200 1.05417 0.0288152 -3.15219 1 0 1 1 0 0 +EDGE2 7219 7218 -0.988664 -0.0888766 -0.0387257 1 0 1 1 0 0 +EDGE2 7220 7199 1.03637 0.0225649 -3.14554 1 0 1 1 0 0 +EDGE2 7220 7201 0.0168734 0.980832 1.57968 1 0 1 1 0 0 +EDGE2 7220 7200 -0.00793474 -0.0103311 -3.13994 1 0 1 1 0 0 +EDGE2 7220 7219 -1.13394 0.024828 -0.000526726 1 0 1 1 0 0 +EDGE2 7221 7201 0.0108965 0.0482556 -0.017232 1 0 1 1 0 0 +EDGE2 7221 7200 -1.02922 0.0283733 1.56949 1 0 1 1 0 0 +EDGE2 7221 7220 -0.968861 -0.0278122 -1.5631 1 0 1 1 0 0 +EDGE2 7221 7202 0.943656 0.0160991 0.0187866 1 0 1 1 0 0 +EDGE2 7222 7201 -0.891245 -0.046006 -0.00711653 1 0 1 1 0 0 +EDGE2 7222 7221 -1.00074 0.0577311 -0.0280953 1 0 1 1 0 0 +EDGE2 7222 7202 -0.0165687 -0.0363748 -0.0379941 1 0 1 1 0 0 +EDGE2 7222 7203 0.861298 0.0337176 0.0205768 1 0 1 1 0 0 +EDGE2 7223 7204 0.971273 0.00573821 0.00641021 1 0 1 1 0 0 +EDGE2 7223 7202 -1.02212 0.150088 -0.0341564 1 0 1 1 0 0 +EDGE2 7223 7222 -1.01008 -0.00259361 -0.0157119 1 0 1 1 0 0 +EDGE2 7223 7203 -0.0367754 0.0474999 0.011955 1 0 1 1 0 0 +EDGE2 7224 7204 -0.00131235 -0.0710275 -0.0152585 1 0 1 1 0 0 +EDGE2 7224 7223 -1.03802 -0.00901497 0.0162669 1 0 1 1 0 0 +EDGE2 7224 7203 -0.952489 0.0233562 0.00795483 1 0 1 1 0 0 +EDGE2 7224 7205 0.97199 -0.000401481 -0.0184503 1 0 1 1 0 0 +EDGE2 7225 7204 -1.05153 -0.0273053 0.00200627 1 0 1 1 0 0 +EDGE2 7225 7224 -1.04051 -0.00285092 0.00948351 1 0 1 1 0 0 +EDGE2 7225 7205 0.0630286 -0.0104056 0.0376926 1 0 1 1 0 0 +EDGE2 7225 7206 0.0011779 0.993406 1.5541 1 0 1 1 0 0 +EDGE2 7226 7205 -1.07106 0.0121188 1.58992 1 0 1 1 0 0 +EDGE2 7226 7225 -0.95279 0.0139737 1.53975 1 0 1 1 0 0 +EDGE2 7227 7226 -0.951925 0.00291963 0.0164414 1 0 1 1 0 0 +EDGE2 7228 7227 -0.988107 0.0606862 0.00948748 1 0 1 1 0 0 +EDGE2 7229 7228 -1.01111 -0.0504851 0.0117575 1 0 1 1 0 0 +EDGE2 7230 7229 -0.984439 -0.0415118 -0.00752068 1 0 1 1 0 0 +EDGE2 7231 7230 -0.886678 0.0154316 -1.54474 1 0 1 1 0 0 +EDGE2 7232 7231 -1.04747 0.012407 -0.0113691 1 0 1 1 0 0 +EDGE2 7233 7232 -1.03999 0.0518016 0.00891913 1 0 1 1 0 0 +EDGE2 7234 7233 -0.971767 -0.0717425 0.015672 1 0 1 1 0 0 +EDGE2 7235 7234 -1.0079 -0.0163183 0.0354902 1 0 1 1 0 0 +EDGE2 7236 7235 -1.02609 0.0564565 1.57279 1 0 1 1 0 0 +EDGE2 7237 7236 -1.02035 -0.0563788 0.00889517 1 0 1 1 0 0 +EDGE2 7238 7237 -1.02731 0.0106105 -0.0218737 1 0 1 1 0 0 +EDGE2 7239 7238 -0.984498 -0.04758 -0.00592793 1 0 1 1 0 0 +EDGE2 7240 7239 -1.02918 -0.0340546 -0.0131084 1 0 1 1 0 0 +EDGE2 7241 7240 -1.0146 -0.129974 1.57684 1 0 1 1 0 0 +EDGE2 7242 7241 -1.01932 -0.0161921 0.0120723 1 0 1 1 0 0 +EDGE2 7243 7242 -0.942123 0.0299237 -0.0112929 1 0 1 1 0 0 +EDGE2 7244 7243 -0.952337 -0.0700389 0.00299373 1 0 1 1 0 0 +EDGE2 7245 7244 -1.0157 -0.00618578 -0.0153147 1 0 1 1 0 0 +EDGE2 7246 7245 -1.01624 -0.0319471 -1.53772 1 0 1 1 0 0 +EDGE2 7247 7246 -0.997022 -0.0595595 -0.0401918 1 0 1 1 0 0 +EDGE2 7248 7247 -0.986443 0.0538859 0.0218645 1 0 1 1 0 0 +EDGE2 7249 7110 0.963438 0.0800669 -3.15031 1 0 1 1 0 0 +EDGE2 7249 7130 0.995558 0.0375157 -3.09581 1 0 1 1 0 0 +EDGE2 7249 7248 -1.00081 -0.0918423 0.015871 1 0 1 1 0 0 +EDGE2 7250 7131 -0.0372444 -0.993146 -1.58885 1 0 1 1 0 0 +EDGE2 7250 7111 0.0108061 -1.06896 -1.61079 1 0 1 1 0 0 +EDGE2 7250 7129 1.01395 -0.0202755 -3.12403 1 0 1 1 0 0 +EDGE2 7250 7109 1.00942 -0.0365622 -3.16232 1 0 1 1 0 0 +EDGE2 7250 7110 -0.0100407 0.00223981 -3.1579 1 0 1 1 0 0 +EDGE2 7250 7130 0.00500335 -0.0229361 -3.13169 1 0 1 1 0 0 +EDGE2 7250 7249 -1.02776 0.0525537 0.0534465 1 0 1 1 0 0 +EDGE2 7251 7132 1.02449 0.0333262 -0.0158532 1 0 1 1 0 0 +EDGE2 7251 7131 0.0355363 0.00464424 0.00344849 1 0 1 1 0 0 +EDGE2 7251 7112 0.960493 -0.0338399 0.0189375 1 0 1 1 0 0 +EDGE2 7251 7111 0.00412179 0.0704303 0.0217589 1 0 1 1 0 0 +EDGE2 7251 7250 -0.932724 0.0042601 1.53631 1 0 1 1 0 0 +EDGE2 7251 7110 -0.993637 0.00526113 -1.58192 1 0 1 1 0 0 +EDGE2 7251 7130 -0.993528 -0.0555349 -1.56517 1 0 1 1 0 0 +EDGE2 7252 7132 0.0189352 0.00350804 -0.0201036 1 0 1 1 0 0 +EDGE2 7252 7133 1.04408 0.117019 0.0175444 1 0 1 1 0 0 +EDGE2 7252 7113 1.09042 0.0488241 -0.0261951 1 0 1 1 0 0 +EDGE2 7252 7131 -1.07741 -0.0638231 -0.014064 1 0 1 1 0 0 +EDGE2 7252 7112 0.0663381 0.00233643 0.0170011 1 0 1 1 0 0 +EDGE2 7252 7251 -1.08167 0.00451102 -0.0272685 1 0 1 1 0 0 +EDGE2 7252 7111 -1.02168 -0.0142404 0.000436984 1 0 1 1 0 0 +EDGE2 7253 7132 -0.880124 0.0432328 -0.00577439 1 0 1 1 0 0 +EDGE2 7253 7134 0.948407 -0.0340149 0.00768637 1 0 1 1 0 0 +EDGE2 7253 7133 -0.0298915 -0.0222576 0.00796883 1 0 1 1 0 0 +EDGE2 7253 7114 1.01416 -0.0637589 -0.0234723 1 0 1 1 0 0 +EDGE2 7253 7113 0.0973252 -0.00258976 0.0276626 1 0 1 1 0 0 +EDGE2 7253 7252 -1.08022 -0.0537992 -0.00885205 1 0 1 1 0 0 +EDGE2 7253 7112 -0.963173 -0.0117627 0.000386841 1 0 1 1 0 0 +EDGE2 7254 7134 0.000130938 -0.0235903 -0.0041853 1 0 1 1 0 0 +EDGE2 7254 7135 1.05552 -0.00835348 -0.0100311 1 0 1 1 0 0 +EDGE2 7254 7175 1.05969 0.00631371 -3.15109 1 0 1 1 0 0 +EDGE2 7254 7115 0.926655 0.0360906 0.0243441 1 0 1 1 0 0 +EDGE2 7254 7133 -1.01367 0.164858 -0.0460146 1 0 1 1 0 0 +EDGE2 7254 7114 -0.056485 -0.0176523 -0.0114803 1 0 1 1 0 0 +EDGE2 7254 7253 -1.01143 -0.056905 5.98246e-05 1 0 1 1 0 0 +EDGE2 7254 7113 -1.0167 0.0386379 -0.0263791 1 0 1 1 0 0 +EDGE2 7255 7136 -0.0326555 0.885173 1.54083 1 0 1 1 0 0 +EDGE2 7255 7116 -0.0518906 0.981365 1.58443 1 0 1 1 0 0 +EDGE2 7255 7174 1.02733 -0.0567889 -3.14153 1 0 1 1 0 0 +EDGE2 7255 7134 -0.971879 -0.0385153 -0.0236073 1 0 1 1 0 0 +EDGE2 7255 7135 0.0165974 -0.0383239 0.00681541 1 0 1 1 0 0 +EDGE2 7255 7175 -0.00272546 0.003418 -3.16922 1 0 1 1 0 0 +EDGE2 7255 7115 0.0751117 0.00391271 0.0229737 1 0 1 1 0 0 +EDGE2 7255 7254 -0.916845 -0.0758158 0.016434 1 0 1 1 0 0 +EDGE2 7255 7114 -1.05559 0.101295 -0.00184027 1 0 1 1 0 0 +EDGE2 7255 7176 -0.022991 -0.972764 -1.57008 1 0 1 1 0 0 +EDGE2 7256 7117 1.00371 0.0284819 0.00832786 1 0 1 1 0 0 +EDGE2 7256 7137 1.05979 -0.00248139 0.00411657 1 0 1 1 0 0 +EDGE2 7256 7136 0.0141678 -0.0197337 -0.0453335 1 0 1 1 0 0 +EDGE2 7256 7116 0.0333682 0.0908711 -0.00950663 1 0 1 1 0 0 +EDGE2 7256 7135 -1.06867 -0.00440555 -1.57828 1 0 1 1 0 0 +EDGE2 7256 7255 -0.98918 -0.0471604 -1.56392 1 0 1 1 0 0 +EDGE2 7256 7175 -0.993544 0.0246381 1.59289 1 0 1 1 0 0 +EDGE2 7256 7115 -0.889616 -0.0300137 -1.57174 1 0 1 1 0 0 +EDGE2 7257 7138 1.01284 -0.0696081 -0.000117117 1 0 1 1 0 0 +EDGE2 7257 7118 0.93216 0.00837919 0.0411534 1 0 1 1 0 0 +EDGE2 7257 7117 0.00804146 -0.032143 0.0247279 1 0 1 1 0 0 +EDGE2 7257 7137 -0.0226495 -0.00394088 0.0261425 1 0 1 1 0 0 +EDGE2 7257 7136 -1.02483 -0.0919845 0.00438867 1 0 1 1 0 0 +EDGE2 7257 7256 -0.964386 -0.0123319 -0.0171936 1 0 1 1 0 0 +EDGE2 7257 7116 -1.00494 0.064553 0.00909312 1 0 1 1 0 0 +EDGE2 7258 7119 1.01379 0.0439546 -0.0330817 1 0 1 1 0 0 +EDGE2 7258 7139 0.990309 0.0257105 -0.0026663 1 0 1 1 0 0 +EDGE2 7258 7138 0.033514 0.0194616 -0.0242721 1 0 1 1 0 0 +EDGE2 7258 7118 -0.0188943 -0.0161884 -0.0478141 1 0 1 1 0 0 +EDGE2 7258 7117 -0.936769 -0.0306253 0.0440826 1 0 1 1 0 0 +EDGE2 7258 7137 -1.06509 -0.076165 0.00156632 1 0 1 1 0 0 +EDGE2 7258 7257 -1.04962 0.0327886 -0.0402375 1 0 1 1 0 0 +EDGE2 7259 7120 0.939083 0.00632241 0.00420498 1 0 1 1 0 0 +EDGE2 7259 7140 1.05648 -0.0389695 0.00247612 1 0 1 1 0 0 +EDGE2 7259 7160 1.03077 -0.0360292 -3.16435 1 0 1 1 0 0 +EDGE2 7259 7119 0.0541662 -0.0602192 -0.0143197 1 0 1 1 0 0 +EDGE2 7259 7139 -0.00972945 -0.0168664 0.00912405 1 0 1 1 0 0 +EDGE2 7259 7138 -0.971735 -0.0374594 -0.0227204 1 0 1 1 0 0 +EDGE2 7259 7258 -0.976914 -0.0201307 0.000345329 1 0 1 1 0 0 +EDGE2 7259 7118 -1.0301 -0.0285569 -0.00111772 1 0 1 1 0 0 +EDGE2 7260 7159 1.03421 0.0836384 -3.11993 1 0 1 1 0 0 +EDGE2 7260 7141 -0.0400781 -1.0603 -1.5795 1 0 1 1 0 0 +EDGE2 7260 7161 -0.0675539 -0.998092 -1.60334 1 0 1 1 0 0 +EDGE2 7260 7120 0.0344135 0.0547316 -0.0150494 1 0 1 1 0 0 +EDGE2 7260 7140 0.128983 0.0270755 -0.0132372 1 0 1 1 0 0 +EDGE2 7260 7160 0.0247857 0.022788 -3.15995 1 0 1 1 0 0 +EDGE2 7260 7119 -0.981171 0.071433 -0.0177763 1 0 1 1 0 0 +EDGE2 7260 7259 -1.01936 0.00935501 0.00952813 1 0 1 1 0 0 +EDGE2 7260 7121 -0.025532 0.984317 1.59247 1 0 1 1 0 0 +EDGE2 7260 7139 -1.03482 -0.027505 -0.0358867 1 0 1 1 0 0 +EDGE2 7261 7260 -1.05128 0.020819 -1.53287 1 0 1 1 0 0 +EDGE2 7261 7120 -1.03298 0.0278082 -1.53906 1 0 1 1 0 0 +EDGE2 7261 7140 -1.06977 -0.00209425 -1.57209 1 0 1 1 0 0 +EDGE2 7261 7160 -1.01311 0.056493 1.59115 1 0 1 1 0 0 +EDGE2 7261 7121 -0.0102166 0.00504672 0.023197 1 0 1 1 0 0 +EDGE2 7261 7122 1.01068 0.0628986 -0.00213302 1 0 1 1 0 0 +EDGE2 7262 7261 -0.938955 0.0531934 -0.00472962 1 0 1 1 0 0 +EDGE2 7262 7121 -1.01588 0.0686224 0.0372394 1 0 1 1 0 0 +EDGE2 7262 7123 1.0193 -0.0974633 0.00838533 1 0 1 1 0 0 +EDGE2 7262 7122 0.0393038 0.0249602 -0.034625 1 0 1 1 0 0 +EDGE2 7263 7123 0.107152 -0.0135242 -0.00584488 1 0 1 1 0 0 +EDGE2 7263 7122 -1.02983 -0.00922848 0.00163538 1 0 1 1 0 0 +EDGE2 7263 7262 -0.963596 -0.0286991 -0.0070185 1 0 1 1 0 0 +EDGE2 7263 7124 0.928422 0.0885521 -0.0243031 1 0 1 1 0 0 +EDGE2 7264 7123 -1.01246 -0.00665396 0.0277267 1 0 1 1 0 0 +EDGE2 7264 7263 -1.02951 -0.0227425 -0.0113871 1 0 1 1 0 0 +EDGE2 7264 7124 0.0385363 0.0384758 0.00947324 1 0 1 1 0 0 +EDGE2 7264 7125 1.04934 -0.0497449 0.0213838 1 0 1 1 0 0 +EDGE2 7264 7065 1.06408 0.047349 -3.15869 1 0 1 1 0 0 +EDGE2 7264 7105 1.01729 -0.00249645 -3.14998 1 0 1 1 0 0 +EDGE2 7265 7264 -0.999518 -0.00692784 0.00470083 1 0 1 1 0 0 +EDGE2 7265 7124 -1.08851 0.0209422 0.00121743 1 0 1 1 0 0 +EDGE2 7265 7125 -0.0321167 -0.0296994 -0.0125439 1 0 1 1 0 0 +EDGE2 7265 7066 -0.116847 -1.09623 -1.55521 1 0 1 1 0 0 +EDGE2 7265 7104 1.03066 -0.0525257 -3.18014 1 0 1 1 0 0 +EDGE2 7265 7065 0.0205339 0.00204708 -3.11268 1 0 1 1 0 0 +EDGE2 7265 7105 0.0278002 0.114702 -3.13083 1 0 1 1 0 0 +EDGE2 7265 7064 1.05183 0.0409461 -3.10874 1 0 1 1 0 0 +EDGE2 7265 7126 -0.0390635 1.07387 1.55505 1 0 1 1 0 0 +EDGE2 7265 7106 0.116216 1.02178 1.55026 1 0 1 1 0 0 +EDGE2 7266 7125 -1.04246 0.0314287 -1.58183 1 0 1 1 0 0 +EDGE2 7266 7265 -1.01204 0.0488044 -1.60539 1 0 1 1 0 0 +EDGE2 7266 7065 -0.977436 -0.00357736 1.5811 1 0 1 1 0 0 +EDGE2 7266 7105 -1.00711 -0.028178 1.57557 1 0 1 1 0 0 +EDGE2 7266 7126 0.0202989 0.0321934 0.0429233 1 0 1 1 0 0 +EDGE2 7266 7106 -0.066991 -0.00330255 0.0114532 1 0 1 1 0 0 +EDGE2 7266 7107 1.08511 -0.0447035 -0.00595189 1 0 1 1 0 0 +EDGE2 7266 7127 1.06629 0.0362945 0.0160125 1 0 1 1 0 0 +EDGE2 7267 7126 -0.981176 -0.034655 -0.0112853 1 0 1 1 0 0 +EDGE2 7267 7266 -0.948616 -0.0208779 -0.0181906 1 0 1 1 0 0 +EDGE2 7267 7106 -1.06088 -0.012134 -0.000714802 1 0 1 1 0 0 +EDGE2 7267 7107 0.0473095 0.023625 -0.00344752 1 0 1 1 0 0 +EDGE2 7267 7127 -0.0415799 -0.0276119 0.00745142 1 0 1 1 0 0 +EDGE2 7267 7128 1.05962 -0.0149867 -0.0287297 1 0 1 1 0 0 +EDGE2 7267 7108 0.993076 -0.0718359 0.00696313 1 0 1 1 0 0 +EDGE2 7268 7267 -1.01539 0.084116 -0.0303041 1 0 1 1 0 0 +EDGE2 7268 7107 -1.01193 -0.0336702 0.000557031 1 0 1 1 0 0 +EDGE2 7268 7127 -0.982558 -0.0277702 0.00184186 1 0 1 1 0 0 +EDGE2 7268 7128 -0.0201024 0.0241276 0.00997088 1 0 1 1 0 0 +EDGE2 7268 7108 -0.0107619 0.00200711 -0.00503501 1 0 1 1 0 0 +EDGE2 7268 7129 0.988905 -0.0425334 -0.0228643 1 0 1 1 0 0 +EDGE2 7268 7109 0.951904 0.103856 0.0260522 1 0 1 1 0 0 +EDGE2 7269 7128 -0.922736 -0.0103813 0.00480828 1 0 1 1 0 0 +EDGE2 7269 7268 -1.07937 -0.0312643 0.0120776 1 0 1 1 0 0 +EDGE2 7269 7108 -0.949373 0.00957107 -0.000194402 1 0 1 1 0 0 +EDGE2 7269 7129 -0.0897328 1.09125e-05 -0.0179896 1 0 1 1 0 0 +EDGE2 7269 7109 0.0126589 -0.034668 0.00928043 1 0 1 1 0 0 +EDGE2 7269 7250 0.937532 -0.0132115 -3.12857 1 0 1 1 0 0 +EDGE2 7269 7110 0.990972 0.0185228 -0.00458354 1 0 1 1 0 0 +EDGE2 7269 7130 0.968093 0.0741643 0.0190115 1 0 1 1 0 0 +EDGE2 7270 7131 -0.0536239 0.996728 1.57405 1 0 1 1 0 0 +EDGE2 7270 7251 -0.0323511 0.988424 1.52641 1 0 1 1 0 0 +EDGE2 7270 7111 0.0853947 0.990127 1.60303 1 0 1 1 0 0 +EDGE2 7270 7129 -1.06859 -0.0990343 0.0147237 1 0 1 1 0 0 +EDGE2 7270 7269 -0.992632 -0.0678224 0.000475653 1 0 1 1 0 0 +EDGE2 7270 7109 -0.942042 0.046648 0.00680486 1 0 1 1 0 0 +EDGE2 7270 7250 -0.10249 0.0525221 -3.15203 1 0 1 1 0 0 +EDGE2 7270 7110 -0.0164071 0.0077666 -0.000966022 1 0 1 1 0 0 +EDGE2 7270 7130 0.0319541 0.0267578 -0.00851452 1 0 1 1 0 0 +EDGE2 7270 7249 0.960631 0.0586341 -3.17771 1 0 1 1 0 0 +EDGE2 7271 7132 1.0123 -0.00446459 0.0120014 1 0 1 1 0 0 +EDGE2 7271 7252 0.932479 -0.00719726 0.0186875 1 0 1 1 0 0 +EDGE2 7271 7131 0.00916115 0.125583 -0.0040231 1 0 1 1 0 0 +EDGE2 7271 7112 1.04366 -0.0295918 -0.0139246 1 0 1 1 0 0 +EDGE2 7271 7251 -0.11183 0.0060813 0.00319187 1 0 1 1 0 0 +EDGE2 7271 7111 -0.0190587 0.06261 0.0287181 1 0 1 1 0 0 +EDGE2 7271 7250 -1.00701 0.0740994 1.57123 1 0 1 1 0 0 +EDGE2 7271 7270 -0.965678 0.107913 -1.56914 1 0 1 1 0 0 +EDGE2 7271 7110 -0.953506 0.0191586 -1.55421 1 0 1 1 0 0 +EDGE2 7271 7130 -0.905215 -0.0514114 -1.53664 1 0 1 1 0 0 +EDGE2 7272 7132 0.0378618 -0.0465686 0.000618747 1 0 1 1 0 0 +EDGE2 7272 7133 1.0125 0.00773397 -0.0365984 1 0 1 1 0 0 +EDGE2 7272 7253 0.985105 -0.0184987 0.00610694 1 0 1 1 0 0 +EDGE2 7272 7113 1.00135 0.0144976 -0.0201767 1 0 1 1 0 0 +EDGE2 7272 7252 0.0512243 -0.02616 0.0102656 1 0 1 1 0 0 +EDGE2 7272 7131 -1.07158 -0.0376881 0.0246799 1 0 1 1 0 0 +EDGE2 7272 7271 -0.936792 0.0135817 0.0337348 1 0 1 1 0 0 +EDGE2 7272 7112 -0.00818436 0.00901373 -0.0220624 1 0 1 1 0 0 +EDGE2 7272 7251 -0.983904 0.0205079 -0.0114556 1 0 1 1 0 0 +EDGE2 7272 7111 -1.09433 -0.0912009 0.00701309 1 0 1 1 0 0 +EDGE2 7273 7132 -0.989749 0.075317 0.0193004 1 0 1 1 0 0 +EDGE2 7273 7134 0.960023 -0.0558804 0.0175326 1 0 1 1 0 0 +EDGE2 7273 7254 0.98196 -0.0144315 -0.00144447 1 0 1 1 0 0 +EDGE2 7273 7133 0.0224221 0.0366981 0.00977201 1 0 1 1 0 0 +EDGE2 7273 7114 0.964111 0.0423008 0.0104355 1 0 1 1 0 0 +EDGE2 7273 7253 0.00273279 -0.0314633 -0.0130187 1 0 1 1 0 0 +EDGE2 7273 7272 -0.980706 0.0202648 -0.011947 1 0 1 1 0 0 +EDGE2 7273 7113 0.00369812 0.0541627 0.0281672 1 0 1 1 0 0 +EDGE2 7273 7252 -1.00475 -0.0420383 0.000879116 1 0 1 1 0 0 +EDGE2 7273 7112 -0.951464 0.0702986 -0.00728389 1 0 1 1 0 0 +EDGE2 7274 7134 -0.0940889 -0.0487028 0.0112214 1 0 1 1 0 0 +EDGE2 7274 7135 1.00713 0.0233086 0.0112274 1 0 1 1 0 0 +EDGE2 7274 7255 0.928681 0.0560118 0.0144981 1 0 1 1 0 0 +EDGE2 7274 7175 1.00679 -0.0111031 -3.16263 1 0 1 1 0 0 +EDGE2 7274 7115 0.988373 -0.0545026 0.0188789 1 0 1 1 0 0 +EDGE2 7274 7254 0.0236163 -0.0325791 -0.00399371 1 0 1 1 0 0 +EDGE2 7274 7133 -0.932552 -0.0221034 -0.000971458 1 0 1 1 0 0 +EDGE2 7274 7273 -0.966169 -0.028896 0.0305067 1 0 1 1 0 0 +EDGE2 7274 7114 -0.0819027 -0.0554208 -0.00269708 1 0 1 1 0 0 +EDGE2 7274 7253 -1.01523 0.0488917 -0.000325381 1 0 1 1 0 0 +EDGE2 7274 7113 -0.971918 0.035123 0.000708154 1 0 1 1 0 0 +EDGE2 7275 7136 0.0123225 0.972376 1.57204 1 0 1 1 0 0 +EDGE2 7275 7256 7.41335e-05 1.07343 1.58473 1 0 1 1 0 0 +EDGE2 7275 7116 -0.0340043 1.02049 1.56595 1 0 1 1 0 0 +EDGE2 7275 7174 1.00276 0.00959119 -3.16807 1 0 1 1 0 0 +EDGE2 7275 7134 -0.984422 -0.0832096 -0.00328639 1 0 1 1 0 0 +EDGE2 7275 7135 -0.129051 0.0507272 -0.00413453 1 0 1 1 0 0 +EDGE2 7275 7255 0.0219135 -0.0745678 -0.0089715 1 0 1 1 0 0 +EDGE2 7275 7175 0.0133673 -0.0112954 -3.13926 1 0 1 1 0 0 +EDGE2 7275 7274 -0.961326 -0.0449403 0.0369116 1 0 1 1 0 0 +EDGE2 7275 7115 -0.0649412 0.0232015 -0.0257242 1 0 1 1 0 0 +EDGE2 7275 7254 -1.04293 -0.0639727 0.0126372 1 0 1 1 0 0 +EDGE2 7275 7114 -0.926026 0.0553744 0.025843 1 0 1 1 0 0 +EDGE2 7275 7176 0.0118748 -0.897536 -1.56803 1 0 1 1 0 0 +EDGE2 7276 7135 -0.976091 0.155891 1.59861 1 0 1 1 0 0 +EDGE2 7276 7255 -0.974087 0.014201 1.57335 1 0 1 1 0 0 +EDGE2 7276 7275 -1.09578 0.00757835 1.5752 1 0 1 1 0 0 +EDGE2 7276 7175 -0.917539 -0.0181797 -1.56901 1 0 1 1 0 0 +EDGE2 7276 7115 -0.944695 -0.027349 1.57338 1 0 1 1 0 0 +EDGE2 7276 7176 0.0275859 0.0296663 -0.0169051 1 0 1 1 0 0 +EDGE2 7276 7177 1.06704 -0.0553136 0.00354709 1 0 1 1 0 0 +EDGE2 7277 7176 -1.05198 -0.0460754 0.00499156 1 0 1 1 0 0 +EDGE2 7277 7276 -0.972857 0.00507687 -0.00087016 1 0 1 1 0 0 +EDGE2 7277 7177 -0.0792187 0.0322334 -0.000256417 1 0 1 1 0 0 +EDGE2 7277 7178 0.950253 0.0625466 -0.00270024 1 0 1 1 0 0 +EDGE2 7278 7277 -0.954685 -0.0279349 -0.00597403 1 0 1 1 0 0 +EDGE2 7278 7177 -0.994159 -0.0368521 -0.00523795 1 0 1 1 0 0 +EDGE2 7278 7178 -0.0134376 0.0854195 0.000416417 1 0 1 1 0 0 +EDGE2 7278 7179 1.00149 -0.0294315 -0.00621563 1 0 1 1 0 0 +EDGE2 7279 7178 -0.993142 0.0441167 0.0196765 1 0 1 1 0 0 +EDGE2 7279 7278 -0.990992 -0.0910716 -0.0191034 1 0 1 1 0 0 +EDGE2 7279 7179 -0.0623216 -0.0171558 -0.0114935 1 0 1 1 0 0 +EDGE2 7279 7180 0.922314 -0.0540253 0.00883385 1 0 1 1 0 0 +EDGE2 7280 7279 -0.947602 0.0621086 0.00152276 1 0 1 1 0 0 +EDGE2 7280 7179 -1.0964 -0.028535 -0.0131159 1 0 1 1 0 0 +EDGE2 7280 7181 -0.0569685 0.924714 1.56272 1 0 1 1 0 0 +EDGE2 7280 7180 0.0364644 -0.0285857 0.0528046 1 0 1 1 0 0 +EDGE2 7281 7182 0.967822 -0.0160509 -0.019574 1 0 1 1 0 0 +EDGE2 7281 7181 -0.0270411 0.0361855 0.0171846 1 0 1 1 0 0 +EDGE2 7281 7180 -0.941856 0.0198949 -1.56662 1 0 1 1 0 0 +EDGE2 7281 7280 -1.07913 -0.0655138 -1.54725 1 0 1 1 0 0 +EDGE2 7282 7183 0.964802 0.103748 0.0227367 1 0 1 1 0 0 +EDGE2 7282 7182 -0.00444341 -0.0430399 -0.000129939 1 0 1 1 0 0 +EDGE2 7282 7281 -0.977339 -0.0363614 -0.0164172 1 0 1 1 0 0 +EDGE2 7282 7181 -1.00523 0.0450765 0.00314408 1 0 1 1 0 0 +EDGE2 7283 7184 0.979764 0.0434539 -0.0120086 1 0 1 1 0 0 +EDGE2 7283 7183 0.0548491 -0.00351951 -0.0173696 1 0 1 1 0 0 +EDGE2 7283 7282 -1.0786 0.0260099 0.00608998 1 0 1 1 0 0 +EDGE2 7283 7182 -0.940846 -0.0358563 -0.000570037 1 0 1 1 0 0 +EDGE2 7284 7185 0.945177 0.015278 0.0324966 1 0 1 1 0 0 +EDGE2 7284 7184 0.135529 0.0870966 0.0198111 1 0 1 1 0 0 +EDGE2 7284 7283 -0.971166 0.00656428 -0.016393 1 0 1 1 0 0 +EDGE2 7284 7183 -1.0422 0.0177533 0.00680215 1 0 1 1 0 0 +EDGE2 7285 7185 -0.0192138 0.0134041 0.012038 1 0 1 1 0 0 +EDGE2 7285 7186 -0.00341472 -0.973888 -1.57858 1 0 1 1 0 0 +EDGE2 7285 7184 -1.0684 -0.0311854 -0.0412178 1 0 1 1 0 0 +EDGE2 7285 7284 -0.99117 0.056652 0.00956342 1 0 1 1 0 0 +EDGE2 7286 7285 -1.04235 -0.0518288 -1.53224 1 0 1 1 0 0 +EDGE2 7286 7185 -0.967556 -0.0610111 -1.60626 1 0 1 1 0 0 +EDGE2 7287 7286 -0.981913 0.00989455 -0.00493349 1 0 1 1 0 0 +EDGE2 7288 7287 -0.968537 -0.00671822 0.00446102 1 0 1 1 0 0 +EDGE2 7289 7170 0.983837 -0.0280074 -3.13491 1 0 1 1 0 0 +EDGE2 7289 7288 -1.04538 0.019313 0.0232834 1 0 1 1 0 0 +EDGE2 7290 7169 0.965047 -0.0240579 -3.12837 1 0 1 1 0 0 +EDGE2 7290 7170 0.0813205 0.00467651 -3.1211 1 0 1 1 0 0 +EDGE2 7290 7289 -0.950897 0.0671127 0.0303131 1 0 1 1 0 0 +EDGE2 7290 7171 0.0837626 0.993741 1.60457 1 0 1 1 0 0 +EDGE2 7291 7170 -1.06434 -0.0177042 1.56459 1 0 1 1 0 0 +EDGE2 7291 7290 -1.03405 -0.0697803 -1.56479 1 0 1 1 0 0 +EDGE2 7291 7171 0.00204739 -0.0569242 0.012777 1 0 1 1 0 0 +EDGE2 7291 7172 1.07117 -0.00579045 -0.00560374 1 0 1 1 0 0 +EDGE2 7292 7291 -1.02661 0.0677262 -0.000701786 1 0 1 1 0 0 +EDGE2 7292 7171 -0.996702 0.0377867 -0.0223413 1 0 1 1 0 0 +EDGE2 7292 7172 0.0984388 0.0220126 0.00516788 1 0 1 1 0 0 +EDGE2 7292 7173 1.0097 0.0444495 0.0210774 1 0 1 1 0 0 +EDGE2 7293 7172 -1.03851 -0.0986714 0.0117127 1 0 1 1 0 0 +EDGE2 7293 7292 -0.982061 0.00554217 -0.0059665 1 0 1 1 0 0 +EDGE2 7293 7173 -0.0086069 0.0450548 0.0244766 1 0 1 1 0 0 +EDGE2 7293 7174 0.993836 0.106511 0.0153165 1 0 1 1 0 0 +EDGE2 7294 7173 -0.990759 0.0557452 0.00856986 1 0 1 1 0 0 +EDGE2 7294 7293 -1.0907 -0.0854625 -0.0060735 1 0 1 1 0 0 +EDGE2 7294 7174 -0.0367812 0.00208319 -0.0173808 1 0 1 1 0 0 +EDGE2 7294 7135 0.965437 -0.0237857 -3.15243 1 0 1 1 0 0 +EDGE2 7294 7255 0.97128 -0.00951325 -3.1519 1 0 1 1 0 0 +EDGE2 7294 7275 1.00929 0.0537848 -3.15143 1 0 1 1 0 0 +EDGE2 7294 7175 1.0005 -0.000900149 -0.000278538 1 0 1 1 0 0 +EDGE2 7294 7115 0.961451 0.0537371 -3.14902 1 0 1 1 0 0 +EDGE2 7295 7136 0.0458138 -1.02383 -1.57117 1 0 1 1 0 0 +EDGE2 7295 7256 0.0444229 -1.04511 -1.55261 1 0 1 1 0 0 +EDGE2 7295 7116 0.00965943 -0.98847 -1.57027 1 0 1 1 0 0 +EDGE2 7295 7294 -1.19985 0.0898148 0.0212783 1 0 1 1 0 0 +EDGE2 7295 7174 -0.986246 -0.0699931 0.0214972 1 0 1 1 0 0 +EDGE2 7295 7134 0.969453 0.0597752 -3.1345 1 0 1 1 0 0 +EDGE2 7295 7135 0.0151479 0.02252 -3.15777 1 0 1 1 0 0 +EDGE2 7295 7255 0.0424163 0.0242444 -3.16573 1 0 1 1 0 0 +EDGE2 7295 7275 -0.037725 -0.00800932 -3.11208 1 0 1 1 0 0 +EDGE2 7295 7175 0.0689713 -0.0131381 0.0152494 1 0 1 1 0 0 +EDGE2 7295 7274 0.914602 0.028168 -3.15269 1 0 1 1 0 0 +EDGE2 7295 7115 -0.0627902 0.0407557 -3.13974 1 0 1 1 0 0 +EDGE2 7295 7254 0.892691 0.00145127 -3.14903 1 0 1 1 0 0 +EDGE2 7295 7114 1.00537 0.00239168 -3.11394 1 0 1 1 0 0 +EDGE2 7295 7176 -0.000104863 0.958251 1.55524 1 0 1 1 0 0 +EDGE2 7295 7276 -0.0421046 1.00335 1.54752 1 0 1 1 0 0 +EDGE2 7296 7277 1.0602 0.0271819 -0.0259021 1 0 1 1 0 0 +EDGE2 7296 7135 -1.00055 0.000690024 1.57186 1 0 1 1 0 0 +EDGE2 7296 7255 -1.02167 -0.0137253 1.62597 1 0 1 1 0 0 +EDGE2 7296 7275 -0.943783 -0.0422738 1.57798 1 0 1 1 0 0 +EDGE2 7296 7295 -0.968187 0.00391853 -1.60475 1 0 1 1 0 0 +EDGE2 7296 7175 -1.06468 -0.0476372 -1.57936 1 0 1 1 0 0 +EDGE2 7296 7115 -0.890256 -0.0130099 1.55514 1 0 1 1 0 0 +EDGE2 7296 7176 0.0875524 -0.0515363 0.0152878 1 0 1 1 0 0 +EDGE2 7296 7276 0.0595431 -0.00698616 -0.0331859 1 0 1 1 0 0 +EDGE2 7296 7177 0.99895 -0.0230168 0.00800502 1 0 1 1 0 0 +EDGE2 7297 7277 -0.0643521 0.030836 -0.0165171 1 0 1 1 0 0 +EDGE2 7297 7296 -0.966257 -0.129931 0.00178378 1 0 1 1 0 0 +EDGE2 7297 7176 -0.965222 0.0158256 -0.0145532 1 0 1 1 0 0 +EDGE2 7297 7276 -1.05295 0.0323729 0.0134983 1 0 1 1 0 0 +EDGE2 7297 7177 0.00960333 -0.0065617 0.0105354 1 0 1 1 0 0 +EDGE2 7297 7178 0.997345 -0.0383846 0.0303598 1 0 1 1 0 0 +EDGE2 7297 7278 1.01314 -0.00772242 -0.0216789 1 0 1 1 0 0 +EDGE2 7298 7277 -0.927106 -0.0482982 0.0441924 1 0 1 1 0 0 +EDGE2 7298 7297 -1.02708 -0.0190067 -0.0120382 1 0 1 1 0 0 +EDGE2 7298 7177 -0.998387 -0.0228504 -0.0203833 1 0 1 1 0 0 +EDGE2 7298 7178 0.0228698 -0.0115872 0.0590438 1 0 1 1 0 0 +EDGE2 7298 7278 0.0114986 0.0481207 -0.0176458 1 0 1 1 0 0 +EDGE2 7298 7279 0.969095 -0.0252373 -0.00460895 1 0 1 1 0 0 +EDGE2 7298 7179 0.954448 -0.00987721 0.0180292 1 0 1 1 0 0 +EDGE2 7299 7298 -1.01798 0.000400951 -0.0104203 1 0 1 1 0 0 +EDGE2 7299 7178 -0.987177 -0.0123495 0.00211672 1 0 1 1 0 0 +EDGE2 7299 7278 -0.95337 0.0238003 -0.000795917 1 0 1 1 0 0 +EDGE2 7299 7279 0.00990547 -0.0312823 -0.00171658 1 0 1 1 0 0 +EDGE2 7299 7179 0.0321124 0.0326288 -0.00510738 1 0 1 1 0 0 +EDGE2 7299 7180 0.986312 -0.000211819 0.00686452 1 0 1 1 0 0 +EDGE2 7299 7280 1.04033 -0.0470001 -0.00125407 1 0 1 1 0 0 +EDGE2 7300 7279 -1.00988 0.000627653 -0.00693985 1 0 1 1 0 0 +EDGE2 7300 7299 -0.996364 0.0314166 -0.0018572 1 0 1 1 0 0 +EDGE2 7300 7179 -0.993398 0.0989714 0.00176127 1 0 1 1 0 0 +EDGE2 7300 7281 -0.0818934 1.05448 1.56082 1 0 1 1 0 0 +EDGE2 7300 7181 0.0759404 1.00331 1.59487 1 0 1 1 0 0 +EDGE2 7300 7180 0.036245 -0.0322417 -0.0129183 1 0 1 1 0 0 +EDGE2 7300 7280 -0.0211952 -0.023515 -0.0189907 1 0 1 1 0 0 +EDGE2 7301 7282 1.07173 0.0598291 0.0026855 1 0 1 1 0 0 +EDGE2 7301 7182 0.913759 -0.0316244 -0.0177883 1 0 1 1 0 0 +EDGE2 7301 7281 -0.0114465 0.0889088 -0.00201503 1 0 1 1 0 0 +EDGE2 7301 7181 0.0675097 -0.0282572 0.0163099 1 0 1 1 0 0 +EDGE2 7301 7180 -1.01858 -0.0225949 -1.59101 1 0 1 1 0 0 +EDGE2 7301 7280 -0.895116 0.010475 -1.58079 1 0 1 1 0 0 +EDGE2 7301 7300 -1.0453 -0.0412807 -1.52793 1 0 1 1 0 0 +EDGE2 7302 7283 1.00082 0.0707723 0.00740535 1 0 1 1 0 0 +EDGE2 7302 7183 0.971059 0.0473443 0.035973 1 0 1 1 0 0 +EDGE2 7302 7282 0.0493927 -0.0373729 0.0124209 1 0 1 1 0 0 +EDGE2 7302 7182 -0.0845276 0.0117507 0.00882735 1 0 1 1 0 0 +EDGE2 7302 7281 -1.03681 0.0515496 -0.00494539 1 0 1 1 0 0 +EDGE2 7302 7301 -0.959336 -0.0500558 -0.0127382 1 0 1 1 0 0 +EDGE2 7302 7181 -1.05102 -0.00241671 -0.0210549 1 0 1 1 0 0 +EDGE2 7303 7184 1.01911 0.0275837 0.0054889 1 0 1 1 0 0 +EDGE2 7303 7284 1.10415 0.116254 0.0286109 1 0 1 1 0 0 +EDGE2 7303 7283 0.0521816 0.0311492 -0.0122991 1 0 1 1 0 0 +EDGE2 7303 7183 -0.0475973 -0.0421033 -0.0263897 1 0 1 1 0 0 +EDGE2 7303 7282 -0.984345 -0.0183354 -0.0193065 1 0 1 1 0 0 +EDGE2 7303 7302 -1.0403 0.0205902 -0.0348688 1 0 1 1 0 0 +EDGE2 7303 7182 -0.980633 0.0283442 0.0431186 1 0 1 1 0 0 +EDGE2 7304 7285 1.00187 0.0273638 0.0103405 1 0 1 1 0 0 +EDGE2 7304 7185 1.0159 0.00301087 0.00755705 1 0 1 1 0 0 +EDGE2 7304 7184 -0.0644928 0.0170074 0.00730312 1 0 1 1 0 0 +EDGE2 7304 7284 -0.0323208 0.0237101 0.0179071 1 0 1 1 0 0 +EDGE2 7304 7283 -0.988356 -0.0236883 -0.00175863 1 0 1 1 0 0 +EDGE2 7304 7303 -1.0293 -0.0173141 -0.0403494 1 0 1 1 0 0 +EDGE2 7304 7183 -1.02995 0.066789 0.0379845 1 0 1 1 0 0 +EDGE2 7305 7286 0.130674 1.01344 1.58738 1 0 1 1 0 0 +EDGE2 7305 7285 -0.0335455 0.0245259 -0.0105323 1 0 1 1 0 0 +EDGE2 7305 7185 -0.00492619 0.0157072 -0.00161299 1 0 1 1 0 0 +EDGE2 7305 7186 -0.0015397 -1.09751 -1.56049 1 0 1 1 0 0 +EDGE2 7305 7304 -0.987211 -0.0651465 -0.00830581 1 0 1 1 0 0 +EDGE2 7305 7184 -1.02033 0.0466871 -0.00451749 1 0 1 1 0 0 +EDGE2 7305 7284 -1.03608 -0.0348647 0.00274765 1 0 1 1 0 0 +EDGE2 7306 7287 0.993442 0.0240259 0.00904154 1 0 1 1 0 0 +EDGE2 7306 7286 0.0666326 0.0671266 -0.013427 1 0 1 1 0 0 +EDGE2 7306 7285 -1.01679 -0.0267978 -1.57986 1 0 1 1 0 0 +EDGE2 7306 7305 -0.919011 0.012083 -1.54783 1 0 1 1 0 0 +EDGE2 7306 7185 -1.03397 -0.0381723 -1.61711 1 0 1 1 0 0 +EDGE2 7307 7288 0.943912 0.00998225 0.00446899 1 0 1 1 0 0 +EDGE2 7307 7287 -0.020411 -0.0781678 0.0369979 1 0 1 1 0 0 +EDGE2 7307 7286 -1.02124 0.0879103 -0.00651623 1 0 1 1 0 0 +EDGE2 7307 7306 -1.02387 0.0849415 -0.0193851 1 0 1 1 0 0 +EDGE2 7308 7289 1.02039 0.0193911 -0.0536688 1 0 1 1 0 0 +EDGE2 7308 7288 0.0124442 0.0503533 -0.0106004 1 0 1 1 0 0 +EDGE2 7308 7307 -0.956203 0.034598 0.00228291 1 0 1 1 0 0 +EDGE2 7308 7287 -0.942516 0.02008 -0.0224902 1 0 1 1 0 0 +EDGE2 7309 7170 1.03014 0.0641012 -3.14089 1 0 1 1 0 0 +EDGE2 7309 7290 0.964648 -0.060995 0.0725537 1 0 1 1 0 0 +EDGE2 7309 7289 0.0522753 0.00168143 -0.00869527 1 0 1 1 0 0 +EDGE2 7309 7308 -0.98355 0.0584471 -0.0346613 1 0 1 1 0 0 +EDGE2 7309 7288 -1.01245 0.0357046 0.0277267 1 0 1 1 0 0 +EDGE2 7310 7169 1.14644 -0.018407 -3.1596 1 0 1 1 0 0 +EDGE2 7310 7170 0.0508234 -0.038256 -3.17455 1 0 1 1 0 0 +EDGE2 7310 7290 -0.036536 0.0269013 -0.0534767 1 0 1 1 0 0 +EDGE2 7310 7289 -1.03088 -0.0877408 0.0193733 1 0 1 1 0 0 +EDGE2 7310 7309 -0.983553 0.0639783 0.0232895 1 0 1 1 0 0 +EDGE2 7310 7291 0.00386576 0.984856 1.54463 1 0 1 1 0 0 +EDGE2 7310 7171 -0.0633112 1.05205 1.56032 1 0 1 1 0 0 +EDGE2 7311 7310 -1.00069 -0.033143 -1.58364 1 0 1 1 0 0 +EDGE2 7311 7170 -1.09026 0.0387137 1.56682 1 0 1 1 0 0 +EDGE2 7311 7290 -0.993339 -0.05896 -1.55213 1 0 1 1 0 0 +EDGE2 7311 7291 0.0154999 -0.148059 0.0156585 1 0 1 1 0 0 +EDGE2 7311 7171 0.0919464 0.021045 0.0197385 1 0 1 1 0 0 +EDGE2 7311 7172 0.986209 0.0140196 0.011652 1 0 1 1 0 0 +EDGE2 7311 7292 1.08958 -0.0106887 0.0223221 1 0 1 1 0 0 +EDGE2 7312 7291 -1.0829 0.0490251 -0.014094 1 0 1 1 0 0 +EDGE2 7312 7311 -0.966847 0.0137415 0.00383174 1 0 1 1 0 0 +EDGE2 7312 7171 -0.936797 0.0080538 0.00542228 1 0 1 1 0 0 +EDGE2 7312 7172 -0.0787698 -0.00915168 0.00874795 1 0 1 1 0 0 +EDGE2 7312 7292 -0.0518772 -0.085828 0.0226681 1 0 1 1 0 0 +EDGE2 7312 7173 1.07609 0.00334749 -0.00766162 1 0 1 1 0 0 +EDGE2 7312 7293 1.04191 0.00183681 0.0181492 1 0 1 1 0 0 +EDGE2 7313 7312 -0.953337 0.0630582 0.00746404 1 0 1 1 0 0 +EDGE2 7313 7172 -1.01402 0.0632292 0.021136 1 0 1 1 0 0 +EDGE2 7313 7292 -0.918386 0.0243038 0.00666447 1 0 1 1 0 0 +EDGE2 7313 7173 0.00787224 0.0386014 0.0144302 1 0 1 1 0 0 +EDGE2 7313 7293 -0.0111502 -0.024723 -0.0238737 1 0 1 1 0 0 +EDGE2 7313 7294 0.98457 -0.0314324 0.0247503 1 0 1 1 0 0 +EDGE2 7313 7174 1.0171 -0.0627059 -0.0450254 1 0 1 1 0 0 +EDGE2 7314 7173 -1.04565 0.0457908 0.00727743 1 0 1 1 0 0 +EDGE2 7314 7293 -1.07911 0.0310705 -0.0269772 1 0 1 1 0 0 +EDGE2 7314 7313 -1.01578 0.00675738 0.0398975 1 0 1 1 0 0 +EDGE2 7314 7294 -0.0103207 0.0700443 0.00281383 1 0 1 1 0 0 +EDGE2 7314 7174 -0.00755537 -0.0658599 -0.0108411 1 0 1 1 0 0 +EDGE2 7314 7135 1.03044 0.0482812 -3.15712 1 0 1 1 0 0 +EDGE2 7314 7255 0.954725 0.0784922 -3.13002 1 0 1 1 0 0 +EDGE2 7314 7275 1.01549 0.0466703 -3.17872 1 0 1 1 0 0 +EDGE2 7314 7295 0.97231 -0.0096503 -0.00613905 1 0 1 1 0 0 +EDGE2 7314 7175 1.0375 0.0538469 -0.0200528 1 0 1 1 0 0 +EDGE2 7314 7115 1.07561 0.0857973 -3.11711 1 0 1 1 0 0 +EDGE2 7315 7136 0.0394269 -0.953651 -1.59295 1 0 1 1 0 0 +EDGE2 7315 7256 0.019107 -1.04771 -1.56502 1 0 1 1 0 0 +EDGE2 7315 7116 0.0169355 -1.0654 -1.58068 1 0 1 1 0 0 +EDGE2 7315 7294 -0.995028 0.0235392 -0.00560724 1 0 1 1 0 0 +EDGE2 7315 7314 -1.00461 -0.0198626 0.0409844 1 0 1 1 0 0 +EDGE2 7315 7174 -0.979508 0.022577 0.0121165 1 0 1 1 0 0 +EDGE2 7315 7134 0.99281 -0.0824781 -3.12555 1 0 1 1 0 0 +EDGE2 7315 7135 0.0650169 -0.0659747 -3.18047 1 0 1 1 0 0 +EDGE2 7315 7255 0.0292203 -0.113578 -3.16756 1 0 1 1 0 0 +EDGE2 7315 7275 -0.029024 0.0873603 -3.11202 1 0 1 1 0 0 +EDGE2 7315 7295 0.0311039 -0.00623414 0.0101517 1 0 1 1 0 0 +EDGE2 7315 7175 -0.0497983 -0.0118161 0.00176209 1 0 1 1 0 0 +EDGE2 7315 7274 1.06212 -0.0172682 -3.15012 1 0 1 1 0 0 +EDGE2 7315 7115 -0.00648613 0.0821977 -3.16228 1 0 1 1 0 0 +EDGE2 7315 7254 1.13065 -0.00195811 -3.11181 1 0 1 1 0 0 +EDGE2 7315 7114 0.920507 -0.00218987 -3.15225 1 0 1 1 0 0 +EDGE2 7315 7296 -0.0462335 0.994957 1.56714 1 0 1 1 0 0 +EDGE2 7315 7176 -0.0722548 0.944275 1.57897 1 0 1 1 0 0 +EDGE2 7315 7276 0.00575923 0.958194 1.55436 1 0 1 1 0 0 +EDGE2 7316 7277 1.09696 -0.0942419 5.9476e-05 1 0 1 1 0 0 +EDGE2 7316 7315 -1.05294 -0.00566255 -1.56874 1 0 1 1 0 0 +EDGE2 7316 7135 -1.08041 0.0194847 1.55936 1 0 1 1 0 0 +EDGE2 7316 7255 -1.03558 0.0564329 1.61167 1 0 1 1 0 0 +EDGE2 7316 7275 -0.951868 -0.0161589 1.62407 1 0 1 1 0 0 +EDGE2 7316 7295 -0.971766 0.0646575 -1.58442 1 0 1 1 0 0 +EDGE2 7316 7175 -0.903387 0.0236903 -1.5569 1 0 1 1 0 0 +EDGE2 7316 7115 -1.03415 -0.00893022 1.58079 1 0 1 1 0 0 +EDGE2 7316 7296 0.0222799 -0.000328019 0.0140092 1 0 1 1 0 0 +EDGE2 7316 7176 0.10723 -0.0409835 0.0195106 1 0 1 1 0 0 +EDGE2 7316 7276 0.0204766 0.00913243 -0.00357625 1 0 1 1 0 0 +EDGE2 7316 7297 0.981547 -0.0202143 -0.0249374 1 0 1 1 0 0 +EDGE2 7316 7177 0.982503 0.0708037 0.020536 1 0 1 1 0 0 +EDGE2 7317 7277 0.0378399 0.0292046 -0.00112491 1 0 1 1 0 0 +EDGE2 7317 7296 -0.964632 0.0192922 0.0392266 1 0 1 1 0 0 +EDGE2 7317 7316 -1.03644 -0.00286109 0.0069098 1 0 1 1 0 0 +EDGE2 7317 7176 -0.930069 0.00208465 0.0254758 1 0 1 1 0 0 +EDGE2 7317 7276 -1.07131 0.0218172 -0.00290442 1 0 1 1 0 0 +EDGE2 7317 7297 -0.104723 -0.115219 -0.0113261 1 0 1 1 0 0 +EDGE2 7317 7298 1.00296 -0.0316934 -0.0261321 1 0 1 1 0 0 +EDGE2 7317 7177 0.0188708 -0.0180094 0.00209368 1 0 1 1 0 0 +EDGE2 7317 7178 0.931214 -0.0490096 0.0103656 1 0 1 1 0 0 +EDGE2 7317 7278 1.01672 0.136028 -0.0120395 1 0 1 1 0 0 +EDGE2 7318 7277 -0.975544 -0.114549 0.0178663 1 0 1 1 0 0 +EDGE2 7318 7317 -0.968332 -0.0186148 0.0273233 1 0 1 1 0 0 +EDGE2 7318 7297 -1.08911 0.0129778 0.0217927 1 0 1 1 0 0 +EDGE2 7318 7298 0.0444373 0.0138906 0.000805396 1 0 1 1 0 0 +EDGE2 7318 7177 -0.848933 -0.00163615 -0.0580437 1 0 1 1 0 0 +EDGE2 7318 7178 0.107593 0.0168552 -0.00551514 1 0 1 1 0 0 +EDGE2 7318 7278 -0.0342314 0.0205367 -0.0141722 1 0 1 1 0 0 +EDGE2 7318 7279 0.998089 0.0425492 -0.0155437 1 0 1 1 0 0 +EDGE2 7318 7299 0.993882 -0.0182237 0.00898525 1 0 1 1 0 0 +EDGE2 7318 7179 0.981756 -0.00421741 -0.000474219 1 0 1 1 0 0 +EDGE2 7319 7298 -0.981616 0.125579 -0.0108788 1 0 1 1 0 0 +EDGE2 7319 7318 -1.07137 -0.0555021 0.0337405 1 0 1 1 0 0 +EDGE2 7319 7178 -1.09297 0.00970986 0.011519 1 0 1 1 0 0 +EDGE2 7319 7278 -1.00568 -0.0417703 0.0132593 1 0 1 1 0 0 +EDGE2 7319 7279 -0.0348647 0.0192553 0.0126718 1 0 1 1 0 0 +EDGE2 7319 7299 0.0507857 0.0113384 -0.00468366 1 0 1 1 0 0 +EDGE2 7319 7179 0.0022546 -0.0737948 0.0151956 1 0 1 1 0 0 +EDGE2 7319 7180 0.954141 -0.0991937 0.000604857 1 0 1 1 0 0 +EDGE2 7319 7280 0.979074 -0.0179112 0.00610324 1 0 1 1 0 0 +EDGE2 7319 7300 1.04199 -0.0601929 -0.0235228 1 0 1 1 0 0 +EDGE2 7320 7279 -1.0211 0.0177534 -0.0226043 1 0 1 1 0 0 +EDGE2 7320 7299 -0.983124 0.0231522 -0.0124687 1 0 1 1 0 0 +EDGE2 7320 7319 -1.08762 -0.0156298 0.0391478 1 0 1 1 0 0 +EDGE2 7320 7179 -1.04658 -0.0259703 0.0100989 1 0 1 1 0 0 +EDGE2 7320 7281 -0.0309084 0.933755 1.62041 1 0 1 1 0 0 +EDGE2 7320 7301 0.0334557 1.01325 1.56448 1 0 1 1 0 0 +EDGE2 7320 7181 -0.0263881 0.987481 1.59078 1 0 1 1 0 0 +EDGE2 7320 7180 0.0169055 -0.0079358 -0.0201168 1 0 1 1 0 0 +EDGE2 7320 7280 0.0354773 0.0480119 -0.00860852 1 0 1 1 0 0 +EDGE2 7320 7300 -0.0274493 -0.0708239 -0.00162729 1 0 1 1 0 0 +EDGE2 7321 7282 0.987219 -0.103221 0.0216341 1 0 1 1 0 0 +EDGE2 7321 7302 1.00646 0.0575049 -0.0197853 1 0 1 1 0 0 +EDGE2 7321 7182 1.0185 0.00825258 -0.0228808 1 0 1 1 0 0 +EDGE2 7321 7320 -0.93961 -0.0744285 -1.60255 1 0 1 1 0 0 +EDGE2 7321 7281 0.00289439 0.051722 0.00381003 1 0 1 1 0 0 +EDGE2 7321 7301 0.00487038 0.0251103 -0.00946825 1 0 1 1 0 0 +EDGE2 7321 7181 -0.00419983 0.00757052 -0.00868327 1 0 1 1 0 0 +EDGE2 7321 7180 -1.03396 -0.00415682 -1.56886 1 0 1 1 0 0 +EDGE2 7321 7280 -0.98011 0.0549055 -1.5851 1 0 1 1 0 0 +EDGE2 7321 7300 -0.941635 -0.00184031 -1.562 1 0 1 1 0 0 +EDGE2 7322 7283 0.908725 0.00678392 0.00714437 1 0 1 1 0 0 +EDGE2 7322 7303 1.04065 0.00992848 0.00612445 1 0 1 1 0 0 +EDGE2 7322 7183 0.973993 -0.00307356 0.0101718 1 0 1 1 0 0 +EDGE2 7322 7282 -0.0613419 -0.036762 0.00354086 1 0 1 1 0 0 +EDGE2 7322 7302 0.000177315 -0.0184251 -0.00664487 1 0 1 1 0 0 +EDGE2 7322 7182 -0.0348723 -0.0369561 0.00962396 1 0 1 1 0 0 +EDGE2 7322 7281 -1.08439 0.0700477 -0.00297083 1 0 1 1 0 0 +EDGE2 7322 7301 -1.07766 -0.0563008 0.0023828 1 0 1 1 0 0 +EDGE2 7322 7321 -0.966381 0.0453929 0.0177495 1 0 1 1 0 0 +EDGE2 7322 7181 -1.04016 0.00870631 0.0107805 1 0 1 1 0 0 +EDGE2 7323 7304 0.987888 -0.0128371 -0.0133916 1 0 1 1 0 0 +EDGE2 7323 7184 0.922809 0.0167854 0.0231969 1 0 1 1 0 0 +EDGE2 7323 7284 1.06121 0.0704489 -0.00781152 1 0 1 1 0 0 +EDGE2 7323 7283 0.0432894 0.0243407 -0.0126161 1 0 1 1 0 0 +EDGE2 7323 7303 0.0644287 0.000118975 0.0245689 1 0 1 1 0 0 +EDGE2 7323 7183 0.0273382 0.079131 -0.00595754 1 0 1 1 0 0 +EDGE2 7323 7282 -1.0138 -0.0116684 0.0364422 1 0 1 1 0 0 +EDGE2 7323 7322 -0.977635 -0.0142629 -0.0167684 1 0 1 1 0 0 +EDGE2 7323 7302 -1.02228 -0.0255971 0.0478488 1 0 1 1 0 0 +EDGE2 7323 7182 -1.01719 -0.0340747 -0.016467 1 0 1 1 0 0 +EDGE2 7324 7285 0.95402 0.0378771 -0.0246033 1 0 1 1 0 0 +EDGE2 7324 7305 0.983749 -0.0663427 0.00870997 1 0 1 1 0 0 +EDGE2 7324 7185 0.988693 0.0266058 0.0374624 1 0 1 1 0 0 +EDGE2 7324 7304 -0.0281097 -0.0643046 0.0400778 1 0 1 1 0 0 +EDGE2 7324 7184 0.00620647 0.088616 0.00346551 1 0 1 1 0 0 +EDGE2 7324 7284 0.0283007 -0.0271894 -0.0285178 1 0 1 1 0 0 +EDGE2 7324 7283 -1.04136 0.0225126 -0.00399147 1 0 1 1 0 0 +EDGE2 7324 7303 -0.944114 0.00420086 -0.0145561 1 0 1 1 0 0 +EDGE2 7324 7323 -0.981559 -0.0102165 0.00812816 1 0 1 1 0 0 +EDGE2 7324 7183 -1.04712 -0.0894773 0.000164247 1 0 1 1 0 0 +EDGE2 7325 7286 0.0254588 0.942189 1.56217 1 0 1 1 0 0 +EDGE2 7325 7306 0.0364882 1.0321 1.57269 1 0 1 1 0 0 +EDGE2 7325 7285 -0.0215899 0.0157492 -0.00338748 1 0 1 1 0 0 +EDGE2 7325 7305 0.0196226 -0.0658722 -0.0121237 1 0 1 1 0 0 +EDGE2 7325 7185 0.0606031 0.018124 0.032046 1 0 1 1 0 0 +EDGE2 7325 7186 0.0226434 -1.04515 -1.58553 1 0 1 1 0 0 +EDGE2 7325 7304 -0.972951 0.117994 -0.00675369 1 0 1 1 0 0 +EDGE2 7325 7324 -0.9931 0.0110802 0.0168244 1 0 1 1 0 0 +EDGE2 7325 7184 -1.06599 0.0500037 -0.0061865 1 0 1 1 0 0 +EDGE2 7325 7284 -1.01524 0.0493844 0.00748028 1 0 1 1 0 0 +EDGE2 7326 7307 0.953665 -0.101951 -0.0157341 1 0 1 1 0 0 +EDGE2 7326 7287 0.993388 0.115784 -0.0305694 1 0 1 1 0 0 +EDGE2 7326 7286 -0.00464118 0.00142094 -0.0415101 1 0 1 1 0 0 +EDGE2 7326 7306 -0.000583973 -0.0921534 -0.00971626 1 0 1 1 0 0 +EDGE2 7326 7285 -0.98731 0.0324444 -1.54616 1 0 1 1 0 0 +EDGE2 7326 7325 -0.998232 -0.0398876 -1.58128 1 0 1 1 0 0 +EDGE2 7326 7305 -1.02135 0.023262 -1.58001 1 0 1 1 0 0 +EDGE2 7326 7185 -1.00138 0.0159834 -1.55712 1 0 1 1 0 0 +EDGE2 7327 7326 -0.974514 -0.00324164 -0.0102437 1 0 1 1 0 0 +EDGE2 7327 7308 1.05828 -0.0398068 0.0121243 1 0 1 1 0 0 +EDGE2 7327 7288 0.932083 0.0609248 0.00543869 1 0 1 1 0 0 +EDGE2 7327 7307 0.0203018 -0.0424235 -0.0225793 1 0 1 1 0 0 +EDGE2 7327 7287 -0.0305243 -0.0420604 0.0235209 1 0 1 1 0 0 +EDGE2 7327 7286 -1.02836 0.0105513 -0.0298572 1 0 1 1 0 0 +EDGE2 7327 7306 -1.08794 -0.0456013 -0.00352389 1 0 1 1 0 0 +EDGE2 7328 7289 1.03431 -0.062081 0.0173624 1 0 1 1 0 0 +EDGE2 7328 7309 1.01884 -0.0280463 0.0046127 1 0 1 1 0 0 +EDGE2 7328 7308 -0.0493394 -0.0324718 0.0013097 1 0 1 1 0 0 +EDGE2 7328 7288 0.0851133 -0.0583426 -0.0119055 1 0 1 1 0 0 +EDGE2 7328 7307 -0.989345 -0.0880563 0.0364789 1 0 1 1 0 0 +EDGE2 7328 7327 -0.96161 0.0606893 -0.00435807 1 0 1 1 0 0 +EDGE2 7328 7287 -0.964969 0.016258 -0.0154643 1 0 1 1 0 0 +EDGE2 7329 7310 1.07168 0.0283721 -0.0034722 1 0 1 1 0 0 +EDGE2 7329 7170 0.909826 0.021868 -3.13786 1 0 1 1 0 0 +EDGE2 7329 7290 0.97292 -0.0491464 -0.014589 1 0 1 1 0 0 +EDGE2 7329 7289 0.0782168 0.0144556 0.0186897 1 0 1 1 0 0 +EDGE2 7329 7309 0.0138237 -0.139658 -0.0447286 1 0 1 1 0 0 +EDGE2 7329 7308 -0.953936 0.042948 -0.0165379 1 0 1 1 0 0 +EDGE2 7329 7328 -0.945957 -0.0289137 0.00180758 1 0 1 1 0 0 +EDGE2 7329 7288 -0.985124 -0.0310616 0.00562644 1 0 1 1 0 0 +EDGE2 7330 7169 1.07893 0.000603319 -3.11964 1 0 1 1 0 0 +EDGE2 7330 7310 0.0595512 -0.0337337 0.000467145 1 0 1 1 0 0 +EDGE2 7330 7170 0.0472516 0.0339845 -3.13661 1 0 1 1 0 0 +EDGE2 7330 7290 -0.0247967 -0.037533 0.0269759 1 0 1 1 0 0 +EDGE2 7330 7329 -0.963289 0.0361287 0.0127574 1 0 1 1 0 0 +EDGE2 7330 7289 -0.953851 0.0543882 0.00781443 1 0 1 1 0 0 +EDGE2 7330 7309 -0.994517 -0.00148237 0.00270653 1 0 1 1 0 0 +EDGE2 7330 7291 -0.0299489 1.11579 1.56816 1 0 1 1 0 0 +EDGE2 7330 7311 0.0194116 1.07925 1.57354 1 0 1 1 0 0 +EDGE2 7330 7171 0.0187804 1.01171 1.59642 1 0 1 1 0 0 +EDGE2 7331 7310 -0.959821 -0.0303143 -1.5907 1 0 1 1 0 0 +EDGE2 7331 7330 -1.07712 0.0409167 -1.53932 1 0 1 1 0 0 +EDGE2 7331 7170 -1.0701 0.0405184 1.54857 1 0 1 1 0 0 +EDGE2 7331 7290 -1.00432 0.0503242 -1.58493 1 0 1 1 0 0 +EDGE2 7331 7312 0.920715 0.00630024 -0.00600266 1 0 1 1 0 0 +EDGE2 7331 7291 -0.123119 -0.135156 -0.0165265 1 0 1 1 0 0 +EDGE2 7331 7311 0.0228903 0.0208539 -0.0160006 1 0 1 1 0 0 +EDGE2 7331 7171 0.0434666 0.0195748 0.018034 1 0 1 1 0 0 +EDGE2 7331 7172 0.989336 -0.087031 -0.0109683 1 0 1 1 0 0 +EDGE2 7331 7292 1.04304 -0.0407684 0.00151012 1 0 1 1 0 0 +EDGE2 7332 7312 -0.0473399 0.00801082 -0.00782518 1 0 1 1 0 0 +EDGE2 7332 7291 -1.01698 -0.0651059 -0.00482877 1 0 1 1 0 0 +EDGE2 7332 7331 -1.02706 0.129819 0.0318166 1 0 1 1 0 0 +EDGE2 7332 7311 -0.99633 -0.0431136 -0.00116747 1 0 1 1 0 0 +EDGE2 7332 7171 -1.00437 -0.0617731 0.00421504 1 0 1 1 0 0 +EDGE2 7332 7172 0.0808556 -0.0613182 -0.00731054 1 0 1 1 0 0 +EDGE2 7332 7292 -0.034341 -0.0585865 0.0227436 1 0 1 1 0 0 +EDGE2 7332 7173 0.937671 -0.12571 -0.0228148 1 0 1 1 0 0 +EDGE2 7332 7293 1.07237 -0.0702496 0.00159392 1 0 1 1 0 0 +EDGE2 7332 7313 0.991079 -0.0421066 0.00888916 1 0 1 1 0 0 +EDGE2 7333 7312 -1.03928 -0.0388959 0.0132067 1 0 1 1 0 0 +EDGE2 7333 7332 -0.95247 0.0547166 -0.00915155 1 0 1 1 0 0 +EDGE2 7333 7172 -0.909822 0.0662434 -0.0129634 1 0 1 1 0 0 +EDGE2 7333 7292 -1.04326 0.0998344 0.00120862 1 0 1 1 0 0 +EDGE2 7333 7173 0.0320179 0.0254255 0.00943173 1 0 1 1 0 0 +EDGE2 7333 7293 -0.0384737 0.0947182 0.0129235 1 0 1 1 0 0 +EDGE2 7333 7313 0.0346859 0.0478693 -0.0106069 1 0 1 1 0 0 +EDGE2 7333 7294 1.04475 -0.0081967 -0.029274 1 0 1 1 0 0 +EDGE2 7333 7314 0.954011 -0.0280286 -0.0276662 1 0 1 1 0 0 +EDGE2 7333 7174 1.01894 -0.0568195 0.0218735 1 0 1 1 0 0 +EDGE2 7334 7315 1.04925 -0.0834586 -0.0169357 1 0 1 1 0 0 +EDGE2 7334 7333 -1.00388 -0.00965746 -0.0321148 1 0 1 1 0 0 +EDGE2 7334 7173 -1.0118 -0.0932322 0.0246079 1 0 1 1 0 0 +EDGE2 7334 7293 -0.962275 0.047423 0.019639 1 0 1 1 0 0 +EDGE2 7334 7313 -1.08349 0.0490761 -0.00872698 1 0 1 1 0 0 +EDGE2 7334 7294 -0.0190896 0.0134889 -0.0208281 1 0 1 1 0 0 +EDGE2 7334 7314 -0.0604135 -0.0283969 0.0185486 1 0 1 1 0 0 +EDGE2 7334 7174 0.0472303 -0.0370424 -0.018467 1 0 1 1 0 0 +EDGE2 7334 7135 0.917042 0.0557804 -3.17414 1 0 1 1 0 0 +EDGE2 7334 7255 0.943512 0.0456985 -3.12387 1 0 1 1 0 0 +EDGE2 7334 7275 0.913199 -0.0468765 -3.11782 1 0 1 1 0 0 +EDGE2 7334 7295 1.02036 0.0477103 0.0314286 1 0 1 1 0 0 +EDGE2 7334 7175 0.988236 -0.00431309 -0.0289501 1 0 1 1 0 0 +EDGE2 7334 7115 0.99475 0.0327186 -3.18659 1 0 1 1 0 0 +EDGE2 7335 7315 -0.0796185 0.0417478 0.00678025 1 0 1 1 0 0 +EDGE2 7335 7136 0.0930087 -1.01714 -1.56966 1 0 1 1 0 0 +EDGE2 7335 7256 0.0284826 -1.0639 -1.54572 1 0 1 1 0 0 +EDGE2 7335 7116 -0.0993733 -0.954344 -1.58198 1 0 1 1 0 0 +EDGE2 7335 7294 -0.863557 0.03456 -0.0335989 1 0 1 1 0 0 +EDGE2 7335 7314 -1.06623 0.0129421 -0.00651271 1 0 1 1 0 0 +EDGE2 7335 7334 -1.04037 0.0224309 -0.0178697 1 0 1 1 0 0 +EDGE2 7335 7174 -1.00908 -0.0355858 0.0262768 1 0 1 1 0 0 +EDGE2 7335 7134 0.993514 -0.0029626 -3.09544 1 0 1 1 0 0 +EDGE2 7335 7135 0.0115061 -0.0772825 -3.14558 1 0 1 1 0 0 +EDGE2 7335 7255 -0.0408872 0.0654296 -3.12198 1 0 1 1 0 0 +EDGE2 7335 7275 0.0544705 -0.0203012 -3.1277 1 0 1 1 0 0 +EDGE2 7335 7295 0.0101043 0.084126 0.0121809 1 0 1 1 0 0 +EDGE2 7335 7175 -0.0303028 -0.0212589 0.0070899 1 0 1 1 0 0 +EDGE2 7335 7274 1.01145 -0.0173235 -3.12034 1 0 1 1 0 0 +EDGE2 7335 7115 -0.0365731 -0.0360779 -3.14102 1 0 1 1 0 0 +EDGE2 7335 7254 1.0542 -0.0259066 -3.16226 1 0 1 1 0 0 +EDGE2 7335 7114 0.98972 0.0266652 -3.16432 1 0 1 1 0 0 +EDGE2 7335 7296 -0.0697997 0.974943 1.5712 1 0 1 1 0 0 +EDGE2 7335 7316 -0.0194991 1.0796 1.56441 1 0 1 1 0 0 +EDGE2 7335 7176 -0.0153124 0.994844 1.56612 1 0 1 1 0 0 +EDGE2 7335 7276 -0.019446 0.96052 1.57646 1 0 1 1 0 0 +EDGE2 7336 7277 0.98695 0.0260155 0.0432283 1 0 1 1 0 0 +EDGE2 7336 7315 -1.00401 0.0580156 -1.57582 1 0 1 1 0 0 +EDGE2 7336 7335 -1.02358 0.0435817 -1.60564 1 0 1 1 0 0 +EDGE2 7336 7135 -0.905951 -0.0303553 1.56961 1 0 1 1 0 0 +EDGE2 7336 7255 -1.01089 -0.0442844 1.57196 1 0 1 1 0 0 +EDGE2 7336 7275 -1.07914 -0.0275186 1.58259 1 0 1 1 0 0 +EDGE2 7336 7295 -1.07446 0.0351928 -1.55186 1 0 1 1 0 0 +EDGE2 7336 7175 -1.08004 0.0417568 -1.5707 1 0 1 1 0 0 +EDGE2 7336 7115 -1.06306 0.0149925 1.58683 1 0 1 1 0 0 +EDGE2 7336 7296 -0.0642318 0.0434573 0.00322603 1 0 1 1 0 0 +EDGE2 7336 7316 -0.0363367 -0.00827911 -0.0113657 1 0 1 1 0 0 +EDGE2 7336 7176 0.0175509 0.0368003 0.0163525 1 0 1 1 0 0 +EDGE2 7336 7276 -0.0589753 0.0115288 -0.0139873 1 0 1 1 0 0 +EDGE2 7336 7317 0.980902 -0.0221989 0.00111617 1 0 1 1 0 0 +EDGE2 7336 7297 1.0622 -0.0318284 0.00560073 1 0 1 1 0 0 +EDGE2 7336 7177 0.990124 -0.0835102 -0.0368624 1 0 1 1 0 0 +EDGE2 7337 7277 -0.00774427 0.10821 0.00379832 1 0 1 1 0 0 +EDGE2 7337 7296 -0.903175 -0.00747151 0.00976973 1 0 1 1 0 0 +EDGE2 7337 7336 -1.04433 0.00215781 -0.00232033 1 0 1 1 0 0 +EDGE2 7337 7316 -0.994343 0.0365402 -0.00305511 1 0 1 1 0 0 +EDGE2 7337 7176 -0.977207 -0.0376348 0.0294798 1 0 1 1 0 0 +EDGE2 7337 7276 -1.00451 -0.0608681 -0.0660493 1 0 1 1 0 0 +EDGE2 7337 7317 -0.0214576 -0.0286819 -0.0145939 1 0 1 1 0 0 +EDGE2 7337 7297 0.0117777 0.00411719 0.0568098 1 0 1 1 0 0 +EDGE2 7337 7298 1.07671 -0.0635761 0.0295956 1 0 1 1 0 0 +EDGE2 7337 7318 1.05357 -0.0247107 -0.0118191 1 0 1 1 0 0 +EDGE2 7337 7177 -0.0296528 0.0305983 0.0314799 1 0 1 1 0 0 +EDGE2 7337 7178 1.02449 -0.0576773 0.00771565 1 0 1 1 0 0 +EDGE2 7337 7278 1.02837 -0.0168375 0.00829917 1 0 1 1 0 0 +EDGE2 7338 7277 -1.04514 -0.0155222 0.0139759 1 0 1 1 0 0 +EDGE2 7338 7337 -1.13506 0.07098 -0.000429777 1 0 1 1 0 0 +EDGE2 7338 7317 -1.02214 0.093179 0.0212298 1 0 1 1 0 0 +EDGE2 7338 7297 -0.945336 0.0626475 0.00264978 1 0 1 1 0 0 +EDGE2 7338 7298 0.013681 0.0665444 0.00844851 1 0 1 1 0 0 +EDGE2 7338 7318 -0.0758667 0.0616637 0.0166825 1 0 1 1 0 0 +EDGE2 7338 7177 -0.974594 0.0279807 0.0116537 1 0 1 1 0 0 +EDGE2 7338 7178 -0.0287847 -0.0491436 -0.00457203 1 0 1 1 0 0 +EDGE2 7338 7278 -0.0253248 -0.0625158 0.00238621 1 0 1 1 0 0 +EDGE2 7338 7279 1.06364 0.0291928 0.000949015 1 0 1 1 0 0 +EDGE2 7338 7299 0.98448 0.0235141 -0.0146179 1 0 1 1 0 0 +EDGE2 7338 7319 0.944713 -0.0317649 -0.0117386 1 0 1 1 0 0 +EDGE2 7338 7179 0.979678 0.0221734 0.034928 1 0 1 1 0 0 +EDGE2 7339 7298 -0.926306 0.113819 0.00446711 1 0 1 1 0 0 +EDGE2 7339 7318 -1.02584 0.044912 0.0498683 1 0 1 1 0 0 +EDGE2 7339 7338 -1.04023 0.0219943 0.0520861 1 0 1 1 0 0 +EDGE2 7339 7178 -1.1244 -0.0687054 -0.0114744 1 0 1 1 0 0 +EDGE2 7339 7278 -1.00744 -0.0796148 -0.0235793 1 0 1 1 0 0 +EDGE2 7339 7279 -0.0343468 0.0396604 -0.0246376 1 0 1 1 0 0 +EDGE2 7339 7299 -0.00492952 -0.0296116 0.00989458 1 0 1 1 0 0 +EDGE2 7339 7319 0.0296631 -0.0015173 0.0179188 1 0 1 1 0 0 +EDGE2 7339 7179 0.0417062 0.0683997 -0.00620956 1 0 1 1 0 0 +EDGE2 7339 7320 0.971948 -0.0324238 0.00589709 1 0 1 1 0 0 +EDGE2 7339 7180 0.965687 -0.0476864 -0.0193233 1 0 1 1 0 0 +EDGE2 7339 7280 0.954469 -0.0999142 -0.00775442 1 0 1 1 0 0 +EDGE2 7339 7300 1.0272 0.0151973 0.0323562 1 0 1 1 0 0 +EDGE2 7340 7339 -1.01253 0.0283444 0.000545843 1 0 1 1 0 0 +EDGE2 7340 7279 -1.00788 -0.0698331 0.00983988 1 0 1 1 0 0 +EDGE2 7340 7299 -1.04594 0.0637397 0.0343218 1 0 1 1 0 0 +EDGE2 7340 7319 -1.08373 0.0707571 -0.00360667 1 0 1 1 0 0 +EDGE2 7340 7179 -1.0356 -0.126765 -0.0431332 1 0 1 1 0 0 +EDGE2 7340 7320 -0.0653779 -0.0102119 0.024716 1 0 1 1 0 0 +EDGE2 7340 7281 -0.0529438 0.946679 1.58991 1 0 1 1 0 0 +EDGE2 7340 7301 -0.0188341 1.06408 1.58682 1 0 1 1 0 0 +EDGE2 7340 7321 0.0559149 0.923098 1.57716 1 0 1 1 0 0 +EDGE2 7340 7181 0.0162913 1.0521 1.60067 1 0 1 1 0 0 +EDGE2 7340 7180 0.00744662 -0.10664 0.0141428 1 0 1 1 0 0 +EDGE2 7340 7280 0.000887269 -0.0655555 0.0054445 1 0 1 1 0 0 +EDGE2 7340 7300 0.00171526 0.0439325 -0.0109394 1 0 1 1 0 0 +EDGE2 7341 7282 1.00953 -0.0312166 0.0150614 1 0 1 1 0 0 +EDGE2 7341 7322 0.984062 0.0433545 -0.0128849 1 0 1 1 0 0 +EDGE2 7341 7302 1.02108 0.128681 0.0142912 1 0 1 1 0 0 +EDGE2 7341 7182 1.02526 0.00543122 0.016458 1 0 1 1 0 0 +EDGE2 7341 7320 -0.954746 0.013251 -1.5686 1 0 1 1 0 0 +EDGE2 7341 7281 0.0531497 0.0412576 0.00462941 1 0 1 1 0 0 +EDGE2 7341 7301 -0.0457044 -0.0194221 0.00456384 1 0 1 1 0 0 +EDGE2 7341 7321 -0.0258289 0.0942987 -0.00037073 1 0 1 1 0 0 +EDGE2 7341 7181 0.0768773 -0.0111987 -0.0127241 1 0 1 1 0 0 +EDGE2 7341 7340 -0.983411 -0.0858371 -1.5635 1 0 1 1 0 0 +EDGE2 7341 7180 -0.982298 -0.00375384 -1.59022 1 0 1 1 0 0 +EDGE2 7341 7280 -0.994603 -0.0391052 -1.57778 1 0 1 1 0 0 +EDGE2 7341 7300 -0.974754 0.0704583 -1.61579 1 0 1 1 0 0 +EDGE2 7342 7341 -0.987299 -0.0355662 0.0109235 1 0 1 1 0 0 +EDGE2 7342 7283 0.902492 -0.0414819 -0.0223926 1 0 1 1 0 0 +EDGE2 7342 7303 0.996623 0.00731434 0.0372041 1 0 1 1 0 0 +EDGE2 7342 7323 0.986595 -0.0209126 0.00740642 1 0 1 1 0 0 +EDGE2 7342 7183 1.00623 -0.0322432 0.0173974 1 0 1 1 0 0 +EDGE2 7342 7282 0.0295847 0.0100665 0.0156547 1 0 1 1 0 0 +EDGE2 7342 7322 0.0118078 -0.0460345 -0.0145081 1 0 1 1 0 0 +EDGE2 7342 7302 -0.0994865 -0.0435646 0.0306669 1 0 1 1 0 0 +EDGE2 7342 7182 -0.058094 -0.0199172 -0.0109161 1 0 1 1 0 0 +EDGE2 7342 7281 -0.966016 0.0657904 0.0455526 1 0 1 1 0 0 +EDGE2 7342 7301 -1.11572 0.00409905 0.0143417 1 0 1 1 0 0 +EDGE2 7342 7321 -1.03593 -0.0105058 0.0267995 1 0 1 1 0 0 +EDGE2 7342 7181 -0.976554 -0.0429522 0.0201302 1 0 1 1 0 0 +EDGE2 7343 7304 1.02224 0.0354497 -0.0364773 1 0 1 1 0 0 +EDGE2 7343 7324 0.907531 0.0197862 0.0176389 1 0 1 1 0 0 +EDGE2 7343 7184 0.973409 -0.0449983 -0.055175 1 0 1 1 0 0 +EDGE2 7343 7284 1.08163 0.0334911 -0.0143643 1 0 1 1 0 0 +EDGE2 7343 7283 -0.0180588 0.0295289 -0.00487064 1 0 1 1 0 0 +EDGE2 7343 7303 -0.0386264 0.0186535 9.70352e-05 1 0 1 1 0 0 +EDGE2 7343 7323 -0.0103175 0.0243393 -0.00988022 1 0 1 1 0 0 +EDGE2 7343 7183 0.0419072 -0.000759671 -0.0138025 1 0 1 1 0 0 +EDGE2 7343 7282 -0.933232 -0.0417576 0.0320399 1 0 1 1 0 0 +EDGE2 7343 7322 -1.01584 0.0839981 -0.00651465 1 0 1 1 0 0 +EDGE2 7343 7342 -0.999326 -0.0125239 0.0155367 1 0 1 1 0 0 +EDGE2 7343 7302 -1.00663 -0.0176077 -0.000757469 1 0 1 1 0 0 +EDGE2 7343 7182 -1.10248 0.0820024 0.0276898 1 0 1 1 0 0 +EDGE2 7344 7285 0.998062 0.076745 -0.00340588 1 0 1 1 0 0 +EDGE2 7344 7325 1.0418 0.0582246 0.00601801 1 0 1 1 0 0 +EDGE2 7344 7305 1.04189 -0.0408389 0.00806611 1 0 1 1 0 0 +EDGE2 7344 7185 1.04578 -0.0500211 -0.00752591 1 0 1 1 0 0 +EDGE2 7344 7304 0.0409436 -0.0334959 -0.0099031 1 0 1 1 0 0 +EDGE2 7344 7324 -0.074065 -0.00976608 0.0179335 1 0 1 1 0 0 +EDGE2 7344 7343 -1.00485 -0.0141838 0.0278413 1 0 1 1 0 0 +EDGE2 7344 7184 -0.024886 -0.116628 0.0307625 1 0 1 1 0 0 +EDGE2 7344 7284 -0.0211858 0.0266528 -0.0139615 1 0 1 1 0 0 +EDGE2 7344 7283 -1.06386 0.060836 -0.0169226 1 0 1 1 0 0 +EDGE2 7344 7303 -0.996213 -0.0141051 -0.0115602 1 0 1 1 0 0 +EDGE2 7344 7323 -0.996166 0.02277 0.0030295 1 0 1 1 0 0 +EDGE2 7344 7183 -1.12473 -0.0191811 -0.0240471 1 0 1 1 0 0 +EDGE2 7345 7326 0.0403753 1.07334 1.56161 1 0 1 1 0 0 +EDGE2 7345 7286 -0.0585752 0.999989 1.54468 1 0 1 1 0 0 +EDGE2 7345 7306 -0.0126468 1.01367 1.55614 1 0 1 1 0 0 +EDGE2 7345 7285 0.0315643 0.0208868 0.0153431 1 0 1 1 0 0 +EDGE2 7345 7325 -0.0106481 0.0490726 -0.0076021 1 0 1 1 0 0 +EDGE2 7345 7305 -0.010338 0.0473494 0.0192477 1 0 1 1 0 0 +EDGE2 7345 7185 -0.000852531 -0.0997747 0.00874585 1 0 1 1 0 0 +EDGE2 7345 7186 0.0417058 -0.975931 -1.59702 1 0 1 1 0 0 +EDGE2 7345 7304 -1.01768 0.0469823 -0.00189479 1 0 1 1 0 0 +EDGE2 7345 7344 -0.952727 0.0100515 0.013031 1 0 1 1 0 0 +EDGE2 7345 7324 -1.07155 0.0251637 -0.00931198 1 0 1 1 0 0 +EDGE2 7345 7184 -1.07739 0.0701321 0.00952396 1 0 1 1 0 0 +EDGE2 7345 7284 -1.02061 -0.0577405 -0.00378083 1 0 1 1 0 0 +EDGE2 7346 7326 -0.0320058 0.000715254 0.00429387 1 0 1 1 0 0 +EDGE2 7346 7307 1.02808 0.0482851 -0.00526751 1 0 1 1 0 0 +EDGE2 7346 7327 0.967998 0.0837016 0.0398804 1 0 1 1 0 0 +EDGE2 7346 7287 1.06724 -0.0848501 -0.00364352 1 0 1 1 0 0 +EDGE2 7346 7286 -0.0829112 0.0145256 0.0056449 1 0 1 1 0 0 +EDGE2 7346 7306 0.0339751 -0.0645859 0.0030572 1 0 1 1 0 0 +EDGE2 7346 7285 -1.0377 -0.0692824 -1.55434 1 0 1 1 0 0 +EDGE2 7346 7325 -1.04798 0.0972931 -1.6005 1 0 1 1 0 0 +EDGE2 7346 7345 -0.94916 0.0330688 -1.54465 1 0 1 1 0 0 +EDGE2 7346 7305 -0.999504 -0.084821 -1.58524 1 0 1 1 0 0 +EDGE2 7346 7185 -1.06535 -0.0371846 -1.56884 1 0 1 1 0 0 +EDGE2 7347 7326 -0.993759 -0.0810324 -0.0408505 1 0 1 1 0 0 +EDGE2 7347 7308 0.962142 0.0493245 0.0147549 1 0 1 1 0 0 +EDGE2 7347 7328 1.07689 -0.0246632 0.0160909 1 0 1 1 0 0 +EDGE2 7347 7288 1.04111 0.0508692 0.0335299 1 0 1 1 0 0 +EDGE2 7347 7307 0.0476165 -0.00682095 0.0361299 1 0 1 1 0 0 +EDGE2 7347 7327 -0.0692193 -0.00803762 0.0218669 1 0 1 1 0 0 +EDGE2 7347 7287 0.0764396 0.0839033 0.017636 1 0 1 1 0 0 +EDGE2 7347 7346 -1.06255 -0.0490545 -0.0210135 1 0 1 1 0 0 +EDGE2 7347 7286 -1.04644 0.0366609 -0.00978886 1 0 1 1 0 0 +EDGE2 7347 7306 -0.912999 -0.0122427 -0.0110453 1 0 1 1 0 0 +EDGE2 7348 7329 1.02618 0.00133077 0.00197585 1 0 1 1 0 0 +EDGE2 7348 7289 0.984674 -0.0295869 -0.00337116 1 0 1 1 0 0 +EDGE2 7348 7309 1.00221 0.0840356 -0.021842 1 0 1 1 0 0 +EDGE2 7348 7308 0.0215707 0.0601693 0.0192853 1 0 1 1 0 0 +EDGE2 7348 7328 -0.0215273 -0.0109722 -0.01449 1 0 1 1 0 0 +EDGE2 7348 7288 -0.00592889 0.0498868 -0.0083454 1 0 1 1 0 0 +EDGE2 7348 7307 -1.03515 -0.144243 -0.00946616 1 0 1 1 0 0 +EDGE2 7348 7327 -1.03291 0.0679344 -0.0016875 1 0 1 1 0 0 +EDGE2 7348 7347 -1.0883 0.01142 0.0120886 1 0 1 1 0 0 +EDGE2 7348 7287 -0.979885 -0.0842831 -0.00115132 1 0 1 1 0 0 +EDGE2 7349 7310 0.928194 0.028823 -0.0129801 1 0 1 1 0 0 +EDGE2 7349 7330 0.955332 0.0518461 -0.000948862 1 0 1 1 0 0 +EDGE2 7349 7170 1.07421 -0.0431632 -3.13305 1 0 1 1 0 0 +EDGE2 7349 7290 0.953794 -0.0273767 0.0053205 1 0 1 1 0 0 +EDGE2 7349 7329 -0.0358618 -0.0363704 0.0226439 1 0 1 1 0 0 +EDGE2 7349 7289 0.0584024 0.00414144 0.0225777 1 0 1 1 0 0 +EDGE2 7349 7309 -0.0436332 -0.0537161 -0.00993498 1 0 1 1 0 0 +EDGE2 7349 7308 -0.960529 0.0192461 0.0194097 1 0 1 1 0 0 +EDGE2 7349 7348 -0.894889 0.0888914 -0.0104823 1 0 1 1 0 0 +EDGE2 7349 7328 -1.02992 0.0718864 -0.0162741 1 0 1 1 0 0 +EDGE2 7349 7288 -1.02681 -0.0746882 -0.0130241 1 0 1 1 0 0 +EDGE2 7350 7169 1.01219 0.0180161 -3.13621 1 0 1 1 0 0 +EDGE2 7350 7310 -0.0465289 0.0896875 0.00835304 1 0 1 1 0 0 +EDGE2 7350 7330 0.083654 0.00420381 0.0265194 1 0 1 1 0 0 +EDGE2 7350 7170 0.0216644 -0.0194822 -3.14228 1 0 1 1 0 0 +EDGE2 7350 7290 -0.0461414 -0.0556252 -0.0381663 1 0 1 1 0 0 +EDGE2 7350 7329 -0.956246 0.00835961 -0.0167245 1 0 1 1 0 0 +EDGE2 7350 7349 -0.983745 0.0657499 0.0212614 1 0 1 1 0 0 +EDGE2 7350 7289 -1.0777 -0.0804758 0.0397896 1 0 1 1 0 0 +EDGE2 7350 7309 -1.06571 0.0110377 -0.0334698 1 0 1 1 0 0 +EDGE2 7350 7291 -0.0138296 0.959807 1.59689 1 0 1 1 0 0 +EDGE2 7350 7331 0.00764311 1.03544 1.55531 1 0 1 1 0 0 +EDGE2 7350 7311 0.0252374 0.910827 1.5757 1 0 1 1 0 0 +EDGE2 7350 7171 0.0257746 0.944094 1.58594 1 0 1 1 0 0 +EDGE2 7351 7310 -0.867603 0.0922037 -1.55661 1 0 1 1 0 0 +EDGE2 7351 7350 -1.02115 -0.0256595 -1.57523 1 0 1 1 0 0 +EDGE2 7351 7330 -1.01851 0.00185402 -1.57957 1 0 1 1 0 0 +EDGE2 7351 7170 -1.03546 0.0805187 1.56889 1 0 1 1 0 0 +EDGE2 7351 7290 -1.03274 0.00385559 -1.56352 1 0 1 1 0 0 +EDGE2 7351 7312 1.03272 -0.10782 0.0246766 1 0 1 1 0 0 +EDGE2 7351 7291 -0.0149337 0.0823339 -0.0187708 1 0 1 1 0 0 +EDGE2 7351 7331 -0.0278565 -0.0237201 -0.0399835 1 0 1 1 0 0 +EDGE2 7351 7311 -0.0693894 0.026395 0.0151872 1 0 1 1 0 0 +EDGE2 7351 7171 0.060676 0.0229785 0.00645944 1 0 1 1 0 0 +EDGE2 7351 7332 1.01525 -0.0383817 -0.00687314 1 0 1 1 0 0 +EDGE2 7351 7172 0.892119 -0.0254211 0.0128538 1 0 1 1 0 0 +EDGE2 7351 7292 1.01561 9.83414e-05 0.00868767 1 0 1 1 0 0 +EDGE2 7352 7312 -0.0763731 0.105928 -0.0126833 1 0 1 1 0 0 +EDGE2 7352 7291 -0.906867 0.0446863 0.00296621 1 0 1 1 0 0 +EDGE2 7352 7331 -1.01964 -0.0491984 -0.00845484 1 0 1 1 0 0 +EDGE2 7352 7351 -0.976956 -0.0146389 0.0505411 1 0 1 1 0 0 +EDGE2 7352 7311 -0.921429 0.0281088 -0.000284931 1 0 1 1 0 0 +EDGE2 7352 7171 -0.994633 -0.0109266 -0.0130466 1 0 1 1 0 0 +EDGE2 7352 7332 0.0551196 0.0338154 -0.0271999 1 0 1 1 0 0 +EDGE2 7352 7333 0.970246 -0.0840537 -0.021273 1 0 1 1 0 0 +EDGE2 7352 7172 -0.033589 -0.108437 0.00864715 1 0 1 1 0 0 +EDGE2 7352 7292 -0.106691 -0.0504437 0.0183783 1 0 1 1 0 0 +EDGE2 7352 7173 1.03684 0.0720993 -0.00873682 1 0 1 1 0 0 +EDGE2 7352 7293 0.99967 0.0495731 -0.00369825 1 0 1 1 0 0 +EDGE2 7352 7313 0.937821 0.0169127 0.000406836 1 0 1 1 0 0 +EDGE2 7353 7312 -1.06802 -0.0878978 -0.0193046 1 0 1 1 0 0 +EDGE2 7353 7352 -1.01184 0.0961913 0.0113461 1 0 1 1 0 0 +EDGE2 7353 7332 -0.973664 0.0329634 -0.013091 1 0 1 1 0 0 +EDGE2 7353 7333 -0.0446126 -0.00268822 -0.00947467 1 0 1 1 0 0 +EDGE2 7353 7172 -0.918868 -0.00887961 -0.0444338 1 0 1 1 0 0 +EDGE2 7353 7292 -1.02256 -0.0155865 -0.0214909 1 0 1 1 0 0 +EDGE2 7353 7173 0.108126 -0.00210117 0.00560176 1 0 1 1 0 0 +EDGE2 7353 7293 -0.00734482 -0.0266409 0.0118162 1 0 1 1 0 0 +EDGE2 7353 7313 -0.0295202 -0.00155979 0.00734542 1 0 1 1 0 0 +EDGE2 7353 7294 0.975624 -0.131272 -0.00238612 1 0 1 1 0 0 +EDGE2 7353 7314 1.1023 0.00513011 0.0188021 1 0 1 1 0 0 +EDGE2 7353 7334 0.978274 -0.0533014 0.00887886 1 0 1 1 0 0 +EDGE2 7353 7174 0.981958 0.0580442 0.0143792 1 0 1 1 0 0 +EDGE2 7354 7315 1.01268 0.00814355 0.00301451 1 0 1 1 0 0 +EDGE2 7354 7333 -0.946074 6.17021e-06 -0.0216035 1 0 1 1 0 0 +EDGE2 7354 7353 -1.06167 -0.0472261 0.0159697 1 0 1 1 0 0 +EDGE2 7354 7173 -0.959504 0.00925092 0.0153051 1 0 1 1 0 0 +EDGE2 7354 7293 -0.993073 -0.0611243 0.0199559 1 0 1 1 0 0 +EDGE2 7354 7313 -0.994248 0.0130258 0.0168184 1 0 1 1 0 0 +EDGE2 7354 7294 -0.00747273 -0.0371891 0.00191603 1 0 1 1 0 0 +EDGE2 7354 7314 -0.0717072 0.021988 0.0162003 1 0 1 1 0 0 +EDGE2 7354 7334 0.0427546 0.00742206 0.0206098 1 0 1 1 0 0 +EDGE2 7354 7174 -0.0181274 -0.0582782 -0.0145592 1 0 1 1 0 0 +EDGE2 7354 7335 1.03505 -0.0108941 0.0111159 1 0 1 1 0 0 +EDGE2 7354 7135 1.07649 0.0399605 -3.16274 1 0 1 1 0 0 +EDGE2 7354 7255 1.03319 -0.0680412 -3.15808 1 0 1 1 0 0 +EDGE2 7354 7275 0.991912 -0.094863 -3.13583 1 0 1 1 0 0 +EDGE2 7354 7295 1.04522 0.0110011 -0.0159916 1 0 1 1 0 0 +EDGE2 7354 7175 0.968444 -0.0598561 0.0190321 1 0 1 1 0 0 +EDGE2 7354 7115 1.01051 0.0303389 -3.15821 1 0 1 1 0 0 +EDGE2 7355 7315 -0.0363856 0.000176088 0.00597379 1 0 1 1 0 0 +EDGE2 7355 7136 0.0267289 -0.936198 -1.55661 1 0 1 1 0 0 +EDGE2 7355 7256 0.0262316 -1.04111 -1.58012 1 0 1 1 0 0 +EDGE2 7355 7116 0.00182354 -1.04812 -1.60424 1 0 1 1 0 0 +EDGE2 7355 7354 -1.01404 0.0136149 0.011901 1 0 1 1 0 0 +EDGE2 7355 7294 -0.970116 0.0271157 0.0148275 1 0 1 1 0 0 +EDGE2 7355 7314 -0.98 0.0352995 0.0181365 1 0 1 1 0 0 +EDGE2 7355 7334 -1.08087 0.00531601 -0.0095898 1 0 1 1 0 0 +EDGE2 7355 7174 -0.951817 0.0378429 -0.00173031 1 0 1 1 0 0 +EDGE2 7355 7335 -0.0212324 0.0382487 -0.0258508 1 0 1 1 0 0 +EDGE2 7355 7134 0.971776 -0.0678022 -3.12831 1 0 1 1 0 0 +EDGE2 7355 7135 -0.0230324 0.019073 -3.1534 1 0 1 1 0 0 +EDGE2 7355 7255 -0.0488386 0.0228733 -3.14238 1 0 1 1 0 0 +EDGE2 7355 7275 0.0920585 0.044677 -3.1443 1 0 1 1 0 0 +EDGE2 7355 7295 -0.0495735 0.0227258 0.0155302 1 0 1 1 0 0 +EDGE2 7355 7175 -0.0401575 -0.0166701 -0.0402381 1 0 1 1 0 0 +EDGE2 7355 7274 1.01982 0.0115748 -3.16918 1 0 1 1 0 0 +EDGE2 7355 7115 0.0254723 -0.0283687 -3.11417 1 0 1 1 0 0 +EDGE2 7355 7254 0.964397 -0.0235151 -3.15236 1 0 1 1 0 0 +EDGE2 7355 7114 1.00187 0.0638782 -3.15361 1 0 1 1 0 0 +EDGE2 7355 7296 -0.0820603 0.895789 1.5606 1 0 1 1 0 0 +EDGE2 7355 7336 -0.00221517 0.998082 1.57495 1 0 1 1 0 0 +EDGE2 7355 7316 -0.0752909 1.03104 1.58388 1 0 1 1 0 0 +EDGE2 7355 7176 -0.0351127 1.00638 1.52772 1 0 1 1 0 0 +EDGE2 7355 7276 0.0299853 1.00752 1.60641 1 0 1 1 0 0 +EDGE2 7356 7277 1.029 -0.0550369 0.0257409 1 0 1 1 0 0 +EDGE2 7356 7315 -1.02479 -0.00741316 -1.59133 1 0 1 1 0 0 +EDGE2 7356 7355 -1.01723 -0.0968104 -1.56739 1 0 1 1 0 0 +EDGE2 7356 7335 -0.927633 0.0047543 -1.57149 1 0 1 1 0 0 +EDGE2 7356 7135 -1.02853 0.0106141 1.5821 1 0 1 1 0 0 +EDGE2 7356 7255 -0.963502 0.018934 1.57714 1 0 1 1 0 0 +EDGE2 7356 7275 -1.01736 -0.00748492 1.60587 1 0 1 1 0 0 +EDGE2 7356 7295 -0.970221 -0.0481365 -1.58972 1 0 1 1 0 0 +EDGE2 7356 7175 -1.03819 -0.0946633 -1.54957 1 0 1 1 0 0 +EDGE2 7356 7115 -0.962734 0.0748012 1.55773 1 0 1 1 0 0 +EDGE2 7356 7337 1.02182 -0.0243078 0.0152075 1 0 1 1 0 0 +EDGE2 7356 7296 -0.0101566 -0.0650143 -0.00670735 1 0 1 1 0 0 +EDGE2 7356 7336 -0.023394 0.0293727 0.0323712 1 0 1 1 0 0 +EDGE2 7356 7316 0.0746389 -0.0278952 0.00717583 1 0 1 1 0 0 +EDGE2 7356 7176 -0.0223059 0.00348736 -0.029135 1 0 1 1 0 0 +EDGE2 7356 7276 0.0194409 0.01117 0.0197387 1 0 1 1 0 0 +EDGE2 7356 7317 1.00764 0.0380723 -0.00113714 1 0 1 1 0 0 +EDGE2 7356 7297 0.974148 -0.082694 -0.0230099 1 0 1 1 0 0 +EDGE2 7356 7177 1.02244 0.0120668 -0.0292576 1 0 1 1 0 0 +EDGE2 7357 7277 -0.0862765 0.00595251 -0.00625393 1 0 1 1 0 0 +EDGE2 7357 7337 -0.0262715 0.000809319 -0.00226667 1 0 1 1 0 0 +EDGE2 7357 7296 -1.01611 0.000751186 0.0137593 1 0 1 1 0 0 +EDGE2 7357 7336 -0.997312 -0.0214383 -0.00814898 1 0 1 1 0 0 +EDGE2 7357 7356 -0.995057 -0.035459 -0.0171034 1 0 1 1 0 0 +EDGE2 7357 7316 -0.970941 -0.0927249 -0.00408964 1 0 1 1 0 0 +EDGE2 7357 7176 -0.964984 -0.0582784 -0.0366063 1 0 1 1 0 0 +EDGE2 7357 7276 -1.03868 0.00422713 -0.00730326 1 0 1 1 0 0 +EDGE2 7357 7317 -0.0282372 -0.0240008 0.0263596 1 0 1 1 0 0 +EDGE2 7357 7297 0.011817 0.108345 0.0140106 1 0 1 1 0 0 +EDGE2 7357 7298 0.987405 0.0416159 0.0211351 1 0 1 1 0 0 +EDGE2 7357 7318 0.937954 0.00526006 -0.0110017 1 0 1 1 0 0 +EDGE2 7357 7177 0.0220537 -0.0121792 -0.0277452 1 0 1 1 0 0 +EDGE2 7357 7338 1.03517 0.0104485 -0.0129541 1 0 1 1 0 0 +EDGE2 7357 7178 1.00856 0.0562913 -0.00911366 1 0 1 1 0 0 +EDGE2 7357 7278 1.01045 0.00604789 0.0218751 1 0 1 1 0 0 +EDGE2 7358 7277 -1.09034 -0.0491133 0.0377331 1 0 1 1 0 0 +EDGE2 7358 7337 -1.0317 0.0106773 -0.00936404 1 0 1 1 0 0 +EDGE2 7358 7357 -0.945497 0.00302304 -0.0243974 1 0 1 1 0 0 +EDGE2 7358 7317 -1.04005 0.000552368 -0.0185694 1 0 1 1 0 0 +EDGE2 7358 7297 -1.04533 -0.0173555 -0.000402104 1 0 1 1 0 0 +EDGE2 7358 7298 0.00428103 -0.0329081 -0.00254416 1 0 1 1 0 0 +EDGE2 7358 7318 -0.0383855 0.0632254 -0.00833389 1 0 1 1 0 0 +EDGE2 7358 7177 -0.960116 -0.0107465 -0.0353155 1 0 1 1 0 0 +EDGE2 7358 7338 0.062688 -0.0139314 -0.0279295 1 0 1 1 0 0 +EDGE2 7358 7339 0.871277 0.0117301 -0.0321523 1 0 1 1 0 0 +EDGE2 7358 7178 -0.0302538 -0.047693 0.0132193 1 0 1 1 0 0 +EDGE2 7358 7278 0.0230321 -0.00626055 0.0475826 1 0 1 1 0 0 +EDGE2 7358 7279 1.00749 -0.0333718 -0.0168715 1 0 1 1 0 0 +EDGE2 7358 7299 1.05389 -0.0135606 0.0184986 1 0 1 1 0 0 +EDGE2 7358 7319 0.974966 0.0344248 -0.0128413 1 0 1 1 0 0 +EDGE2 7358 7179 0.934429 0.0162718 0.029174 1 0 1 1 0 0 +EDGE2 7359 7298 -1.05143 -0.027525 0.000233839 1 0 1 1 0 0 +EDGE2 7359 7318 -1.00132 -0.090668 0.00616908 1 0 1 1 0 0 +EDGE2 7359 7358 -0.955237 -0.115768 0.00851454 1 0 1 1 0 0 +EDGE2 7359 7338 -0.895298 0.117617 -0.0200311 1 0 1 1 0 0 +EDGE2 7359 7339 -0.0699505 -0.0224349 0.00265725 1 0 1 1 0 0 +EDGE2 7359 7178 -1.03584 -0.0172127 -0.00895811 1 0 1 1 0 0 +EDGE2 7359 7278 -0.987573 0.0011668 0.0327613 1 0 1 1 0 0 +EDGE2 7359 7279 0.097219 -0.046841 0.0312536 1 0 1 1 0 0 +EDGE2 7359 7299 -0.0442709 -0.0265035 0.0253164 1 0 1 1 0 0 +EDGE2 7359 7319 -0.0382014 -0.0915416 -0.0143761 1 0 1 1 0 0 +EDGE2 7359 7179 0.0111526 -0.00304861 0.0136185 1 0 1 1 0 0 +EDGE2 7359 7320 0.908391 -0.00146648 -0.0159557 1 0 1 1 0 0 +EDGE2 7359 7340 0.965784 -0.0324953 0.0090656 1 0 1 1 0 0 +EDGE2 7359 7180 0.969375 0.00762098 -0.0244361 1 0 1 1 0 0 +EDGE2 7359 7280 1.00159 -0.0352649 -0.0086622 1 0 1 1 0 0 +EDGE2 7359 7300 0.99172 0.022676 0.00474252 1 0 1 1 0 0 +EDGE2 7360 7341 -0.00170725 1.06076 1.58566 1 0 1 1 0 0 +EDGE2 7360 7339 -0.868351 -0.0232337 0.039756 1 0 1 1 0 0 +EDGE2 7360 7359 -1.00078 0.0914926 0.000299336 1 0 1 1 0 0 +EDGE2 7360 7279 -0.924405 -0.050564 -0.0236952 1 0 1 1 0 0 +EDGE2 7360 7299 -0.973929 -0.0481229 -0.00582341 1 0 1 1 0 0 +EDGE2 7360 7319 -0.918949 -0.108169 -0.00626922 1 0 1 1 0 0 +EDGE2 7360 7179 -1.01951 0.0465789 0.0159472 1 0 1 1 0 0 +EDGE2 7360 7320 0.0339931 0.00322314 -0.009118 1 0 1 1 0 0 +EDGE2 7360 7281 0.0728842 0.98125 1.55128 1 0 1 1 0 0 +EDGE2 7360 7301 0.0964499 1.01986 1.60834 1 0 1 1 0 0 +EDGE2 7360 7321 0.00478881 1.03716 1.56664 1 0 1 1 0 0 +EDGE2 7360 7181 0.104878 1.09879 1.53218 1 0 1 1 0 0 +EDGE2 7360 7340 0.00401757 0.139611 -0.0448108 1 0 1 1 0 0 +EDGE2 7360 7180 0.0406737 0.0396976 -0.0208796 1 0 1 1 0 0 +EDGE2 7360 7280 -0.057909 -0.0386286 0.0378922 1 0 1 1 0 0 +EDGE2 7360 7300 -0.0179248 -0.01706 0.0200157 1 0 1 1 0 0 +EDGE2 7361 7341 -0.00730955 -0.067533 0.00469686 1 0 1 1 0 0 +EDGE2 7361 7282 1.07267 0.0154111 -0.0327392 1 0 1 1 0 0 +EDGE2 7361 7322 0.983741 0.0136614 0.00655898 1 0 1 1 0 0 +EDGE2 7361 7342 1.07533 0.0361039 -0.00552051 1 0 1 1 0 0 +EDGE2 7361 7302 1.00321 0.0356227 -0.0119825 1 0 1 1 0 0 +EDGE2 7361 7182 1.03093 -0.013643 -0.00238182 1 0 1 1 0 0 +EDGE2 7361 7320 -0.994207 0.0723062 -1.55147 1 0 1 1 0 0 +EDGE2 7361 7281 0.0274953 0.00784777 0.0104552 1 0 1 1 0 0 +EDGE2 7361 7301 -0.0479164 -0.0774463 0.00508234 1 0 1 1 0 0 +EDGE2 7361 7321 -0.0657296 0.00540092 0.0231134 1 0 1 1 0 0 +EDGE2 7361 7181 -0.0164804 -0.0023081 0.0132156 1 0 1 1 0 0 +EDGE2 7361 7360 -1.0006 0.00630857 -1.59965 1 0 1 1 0 0 +EDGE2 7361 7340 -1.00606 -0.0134832 -1.58404 1 0 1 1 0 0 +EDGE2 7361 7180 -1.01907 0.00227983 -1.60288 1 0 1 1 0 0 +EDGE2 7361 7280 -0.989347 0.0720287 -1.56033 1 0 1 1 0 0 +EDGE2 7361 7300 -0.93892 0.0364308 -1.55541 1 0 1 1 0 0 +EDGE2 7362 7341 -1.00358 -0.029511 -0.016562 1 0 1 1 0 0 +EDGE2 7362 7343 0.945876 0.0590644 0.0666752 1 0 1 1 0 0 +EDGE2 7362 7283 1.04355 0.108492 -0.0153989 1 0 1 1 0 0 +EDGE2 7362 7303 1.06418 -0.113098 0.0170151 1 0 1 1 0 0 +EDGE2 7362 7323 0.938775 -0.0455991 0.0199077 1 0 1 1 0 0 +EDGE2 7362 7183 0.951258 -0.0442188 0.0216787 1 0 1 1 0 0 +EDGE2 7362 7282 -0.00886991 -0.0109727 0.00305109 1 0 1 1 0 0 +EDGE2 7362 7322 0.031344 -0.0447522 -0.0285947 1 0 1 1 0 0 +EDGE2 7362 7342 -0.0609804 0.00887612 0.0281448 1 0 1 1 0 0 +EDGE2 7362 7302 -0.018749 -0.0542538 -0.0102513 1 0 1 1 0 0 +EDGE2 7362 7182 0.0597103 0.0950848 -0.0368129 1 0 1 1 0 0 +EDGE2 7362 7361 -1.01772 0.01034 0.0173714 1 0 1 1 0 0 +EDGE2 7362 7281 -1.03659 0.0579968 -0.0080321 1 0 1 1 0 0 +EDGE2 7362 7301 -1.06575 -0.112791 0.00294273 1 0 1 1 0 0 +EDGE2 7362 7321 -1.05524 -0.0553984 0.00102592 1 0 1 1 0 0 +EDGE2 7362 7181 -1.07641 -0.0494588 0.0196367 1 0 1 1 0 0 +EDGE2 7363 7304 1.04512 -0.020222 0.0131488 1 0 1 1 0 0 +EDGE2 7363 7344 0.986967 -0.0182699 0.00148064 1 0 1 1 0 0 +EDGE2 7363 7324 0.95172 0.0756227 -0.0278643 1 0 1 1 0 0 +EDGE2 7363 7343 -0.0384159 0.0462554 -0.0148179 1 0 1 1 0 0 +EDGE2 7363 7184 1.03862 -0.0400733 -0.0576732 1 0 1 1 0 0 +EDGE2 7363 7284 1.05237 0.0504344 0.00610244 1 0 1 1 0 0 +EDGE2 7363 7283 -0.00455039 0.0332229 -0.00213894 1 0 1 1 0 0 +EDGE2 7363 7303 -0.021474 -0.0813039 -0.0197415 1 0 1 1 0 0 +EDGE2 7363 7323 0.0348149 -0.0599714 -0.00457408 1 0 1 1 0 0 +EDGE2 7363 7183 0.0600972 0.0521559 0.0315527 1 0 1 1 0 0 +EDGE2 7363 7282 -1.07965 -0.0839726 0.00782806 1 0 1 1 0 0 +EDGE2 7363 7322 -1.0396 -0.019508 0.00372438 1 0 1 1 0 0 +EDGE2 7363 7342 -1.06662 0.0337932 -0.0390161 1 0 1 1 0 0 +EDGE2 7363 7362 -1.04666 0.0507772 0.0169072 1 0 1 1 0 0 +EDGE2 7363 7302 -0.934557 -0.0163176 0.00573116 1 0 1 1 0 0 +EDGE2 7363 7182 -0.965731 0.026401 0.0235546 1 0 1 1 0 0 +EDGE2 7364 7285 1.02876 -0.0196651 0.0505761 1 0 1 1 0 0 +EDGE2 7364 7325 0.990981 -0.0260993 -0.0192537 1 0 1 1 0 0 +EDGE2 7364 7345 1.0199 0.0835343 0.0209155 1 0 1 1 0 0 +EDGE2 7364 7305 1.03929 -0.0376838 -0.00150156 1 0 1 1 0 0 +EDGE2 7364 7185 1.03821 -0.0263172 -0.0109337 1 0 1 1 0 0 +EDGE2 7364 7304 0.0272455 -0.133593 -0.0057928 1 0 1 1 0 0 +EDGE2 7364 7344 0.0330946 0.0548658 -0.0167558 1 0 1 1 0 0 +EDGE2 7364 7324 -0.0225195 -0.0429643 0.00439005 1 0 1 1 0 0 +EDGE2 7364 7343 -0.983393 0.00626065 -0.0162562 1 0 1 1 0 0 +EDGE2 7364 7184 -0.0756806 0.0404411 -0.0147675 1 0 1 1 0 0 +EDGE2 7364 7284 0.0115446 0.0708078 0.0202594 1 0 1 1 0 0 +EDGE2 7364 7363 -1.02445 -0.0468826 -0.0290139 1 0 1 1 0 0 +EDGE2 7364 7283 -0.903536 -0.0836196 0.0178355 1 0 1 1 0 0 +EDGE2 7364 7303 -0.981045 -0.010609 -0.00451264 1 0 1 1 0 0 +EDGE2 7364 7323 -1.07769 0.0198844 0.00375456 1 0 1 1 0 0 +EDGE2 7364 7183 -0.950293 -0.0744158 0.0250179 1 0 1 1 0 0 +EDGE2 7365 7326 -0.0510605 1.00823 1.56488 1 0 1 1 0 0 +EDGE2 7365 7346 -0.00724053 0.97103 1.56732 1 0 1 1 0 0 +EDGE2 7365 7286 -0.0477264 0.937055 1.59507 1 0 1 1 0 0 +EDGE2 7365 7306 0.0522125 1.01885 1.59846 1 0 1 1 0 0 +EDGE2 7365 7285 0.0392745 0.0251384 0.00319773 1 0 1 1 0 0 +EDGE2 7365 7325 -0.0148857 -0.0671532 0.0186754 1 0 1 1 0 0 +EDGE2 7365 7345 -0.074927 -0.00261045 0.0389403 1 0 1 1 0 0 +EDGE2 7365 7305 -0.0046629 0.0282925 -0.0490449 1 0 1 1 0 0 +EDGE2 7365 7185 -0.0450698 -0.029258 -0.0183797 1 0 1 1 0 0 +EDGE2 7365 7186 -0.0945521 -0.910313 -1.57211 1 0 1 1 0 0 +EDGE2 7365 7304 -0.894379 -0.0725391 -0.00856381 1 0 1 1 0 0 +EDGE2 7365 7344 -0.97115 0.0672654 -0.0127258 1 0 1 1 0 0 +EDGE2 7365 7364 -0.940697 0.0457477 -0.0390055 1 0 1 1 0 0 +EDGE2 7365 7324 -1.01848 0.000516027 0.0127261 1 0 1 1 0 0 +EDGE2 7365 7184 -1.04359 0.00200339 -0.00240692 1 0 1 1 0 0 +EDGE2 7365 7284 -0.992041 -0.0501945 -0.000729874 1 0 1 1 0 0 +EDGE2 7366 7285 -0.976742 -0.0240812 1.59251 1 0 1 1 0 0 +EDGE2 7366 7325 -0.957144 -0.0855996 1.63715 1 0 1 1 0 0 +EDGE2 7366 7345 -0.923728 -0.0581034 1.55014 1 0 1 1 0 0 +EDGE2 7366 7365 -1.02336 0.0043809 1.56289 1 0 1 1 0 0 +EDGE2 7366 7305 -1.06931 0.0640815 1.54 1 0 1 1 0 0 +EDGE2 7366 7185 -0.947568 -0.0632093 1.57801 1 0 1 1 0 0 +EDGE2 7366 7186 -0.0070304 0.0401302 0.0192936 1 0 1 1 0 0 +EDGE2 7366 7187 1.01566 -0.0201433 0.00390818 1 0 1 1 0 0 +EDGE2 7367 7366 -1.04724 -0.053407 -0.0162798 1 0 1 1 0 0 +EDGE2 7367 7186 -1.01702 -0.0071347 0.0053293 1 0 1 1 0 0 +EDGE2 7367 7188 1.07684 -0.0755124 -0.0169889 1 0 1 1 0 0 +EDGE2 7367 7187 -0.0673777 -0.0473209 -0.0230387 1 0 1 1 0 0 +EDGE2 7368 7188 0.0763561 0.0490831 0.0119423 1 0 1 1 0 0 +EDGE2 7368 7187 -1.02652 0.0418913 -0.0280523 1 0 1 1 0 0 +EDGE2 7368 7367 -1.0713 0.0326685 -0.0291385 1 0 1 1 0 0 +EDGE2 7368 7189 1.03799 0.0401624 -0.0142336 1 0 1 1 0 0 +EDGE2 7369 7188 -0.953149 0.0220723 0.00378842 1 0 1 1 0 0 +EDGE2 7369 7368 -0.966464 -0.0455113 -0.00907248 1 0 1 1 0 0 +EDGE2 7369 7189 -0.0268552 0.0532679 0.00118631 1 0 1 1 0 0 +EDGE2 7369 7190 0.966115 0.0364939 0.00653818 1 0 1 1 0 0 +EDGE2 7370 7369 -0.957636 -0.0667733 0.0355038 1 0 1 1 0 0 +EDGE2 7370 7189 -1.02264 -0.0434302 -0.0184153 1 0 1 1 0 0 +EDGE2 7370 7190 0.0104968 -0.0496784 -0.000660842 1 0 1 1 0 0 +EDGE2 7370 7191 0.0193284 -0.983268 -1.5673 1 0 1 1 0 0 +EDGE2 7371 7370 -0.969224 -0.0189921 -1.59202 1 0 1 1 0 0 +EDGE2 7371 7190 -1.0398 -0.0405903 -1.55368 1 0 1 1 0 0 +EDGE2 7372 7371 -1.02626 0.0866482 -0.00733489 1 0 1 1 0 0 +EDGE2 7373 7372 -0.93541 0.0501011 -0.00921515 1 0 1 1 0 0 +EDGE2 7374 7373 -0.965073 0.01477 0.021602 1 0 1 1 0 0 +EDGE2 7375 7374 -0.966643 -0.0318757 0.0522973 1 0 1 1 0 0 +EDGE2 7376 7375 -1.00237 0.023227 -1.56637 1 0 1 1 0 0 +EDGE2 7377 7376 -1.00433 0.0317478 0.034024 1 0 1 1 0 0 +EDGE2 7378 7377 -0.939082 -0.0700903 0.00873321 1 0 1 1 0 0 +EDGE2 7379 7378 -1.03257 -0.0281195 -0.0297692 1 0 1 1 0 0 +EDGE2 7380 7379 -1.00856 -0.0229313 -0.0208595 1 0 1 1 0 0 +EDGE2 7381 7380 -1.00516 0.0143993 1.55183 1 0 1 1 0 0 +EDGE2 7382 7381 -0.968232 0.0284278 -0.00640147 1 0 1 1 0 0 +EDGE2 7383 7382 -1.06232 0.0503573 0.0176687 1 0 1 1 0 0 +EDGE2 7384 7383 -1.04608 0.0397262 0.00216835 1 0 1 1 0 0 +EDGE2 7385 7384 -0.950615 -0.0618271 0.00315023 1 0 1 1 0 0 +EDGE2 7386 7385 -0.914358 -0.0805344 -1.57673 1 0 1 1 0 0 +EDGE2 7387 7386 -0.994975 -0.0340819 0.0338766 1 0 1 1 0 0 +EDGE2 7388 7387 -1.01891 -0.0546239 -0.0143113 1 0 1 1 0 0 +EDGE2 7389 7388 -1.01286 -0.000640674 0.0137569 1 0 1 1 0 0 +EDGE2 7390 7389 -1.06014 0.125797 -0.00490775 1 0 1 1 0 0 +EDGE2 7391 7390 -0.975578 0.0741016 -1.63667 1 0 1 1 0 0 +EDGE2 7392 7391 -0.916468 0.0530878 -0.0205939 1 0 1 1 0 0 +EDGE2 7393 7392 -1.06736 0.0050808 0.0304091 1 0 1 1 0 0 +EDGE2 7394 7393 -0.994766 -0.0627294 -0.0178386 1 0 1 1 0 0 +EDGE2 7395 7394 -0.954041 -0.00628278 -0.000288014 1 0 1 1 0 0 +EDGE2 7396 7395 -0.96795 -0.0205946 1.54513 1 0 1 1 0 0 +EDGE2 7397 7396 -1.02942 -0.034051 0.0182068 1 0 1 1 0 0 +EDGE2 7398 7397 -0.994182 0.0121436 -0.0358304 1 0 1 1 0 0 +EDGE2 7399 7398 -1.00809 0.00971919 0.0440094 1 0 1 1 0 0 +EDGE2 7400 7399 -0.965961 0.103117 0.00469553 1 0 1 1 0 0 +EDGE2 7401 7400 -0.931037 0.0533331 -1.5564 1 0 1 1 0 0 +EDGE2 7402 7401 -0.896107 0.0494113 -0.0100615 1 0 1 1 0 0 +EDGE2 7403 7402 -0.952957 -0.0657768 -0.00810686 1 0 1 1 0 0 +EDGE2 7404 7403 -0.891881 0.0554116 0.00931895 1 0 1 1 0 0 +EDGE2 7404 7145 1.04675 -0.0379913 -3.11853 1 0 1 1 0 0 +EDGE2 7404 7165 1.00028 0.0340179 -3.14244 1 0 1 1 0 0 +EDGE2 7405 7404 -1.02496 -0.0584943 0.0129525 1 0 1 1 0 0 +EDGE2 7405 7146 0.0362897 -1.12057 -1.534 1 0 1 1 0 0 +EDGE2 7405 7145 -0.0444959 -0.0125451 -3.14221 1 0 1 1 0 0 +EDGE2 7405 7165 0.0781544 0.0279027 -3.1352 1 0 1 1 0 0 +EDGE2 7405 7166 -0.013659 1.01944 1.5568 1 0 1 1 0 0 +EDGE2 7405 7144 1.01761 0.00607026 -3.1293 1 0 1 1 0 0 +EDGE2 7405 7164 0.966703 -0.0467115 -3.15677 1 0 1 1 0 0 +EDGE2 7406 7146 0.0235958 -0.117408 -0.00513641 1 0 1 1 0 0 +EDGE2 7406 7147 0.997425 -0.00789478 0.000941948 1 0 1 1 0 0 +EDGE2 7406 7145 -0.939472 0.0961563 -1.59231 1 0 1 1 0 0 +EDGE2 7406 7165 -1.0379 0.0520543 -1.57849 1 0 1 1 0 0 +EDGE2 7406 7405 -0.995003 0.0384766 1.62431 1 0 1 1 0 0 +EDGE2 7407 7148 0.968909 -0.00372891 -0.0245595 1 0 1 1 0 0 +EDGE2 7407 7146 -1.03835 -0.00650595 -0.0221437 1 0 1 1 0 0 +EDGE2 7407 7406 -1.04559 0.00715536 0.00289969 1 0 1 1 0 0 +EDGE2 7407 7147 -0.0020745 -0.0557608 -0.0110196 1 0 1 1 0 0 +EDGE2 7408 7407 -1.05255 -0.0315297 -0.0166981 1 0 1 1 0 0 +EDGE2 7408 7149 1.04732 0.0469695 0.0266534 1 0 1 1 0 0 +EDGE2 7408 7148 0.0341954 -0.0502776 0.0213455 1 0 1 1 0 0 +EDGE2 7408 7147 -1.00777 0.0104962 -0.015589 1 0 1 1 0 0 +EDGE2 7409 7150 1.01884 -0.026044 -0.00999982 1 0 1 1 0 0 +EDGE2 7409 7408 -1.08738 -0.00183421 0.00507725 1 0 1 1 0 0 +EDGE2 7409 7149 0.0192003 0.0200507 -0.00353678 1 0 1 1 0 0 +EDGE2 7409 7148 -1.03952 -0.135928 0.0397844 1 0 1 1 0 0 +EDGE2 7410 7150 -0.0048642 -0.0508019 0.03063 1 0 1 1 0 0 +EDGE2 7410 7149 -1.07431 -0.0226572 -0.0311677 1 0 1 1 0 0 +EDGE2 7410 7409 -0.973439 -0.0270293 0.0307287 1 0 1 1 0 0 +EDGE2 7410 7151 -0.0077174 0.954786 1.60739 1 0 1 1 0 0 +EDGE2 7411 7150 -1.02391 -0.0155957 -1.54287 1 0 1 1 0 0 +EDGE2 7411 7410 -1.02552 0.00633584 -1.59887 1 0 1 1 0 0 +EDGE2 7411 7152 0.966449 0.0704943 0.010444 1 0 1 1 0 0 +EDGE2 7411 7151 -0.0164909 -0.0079009 -0.00545531 1 0 1 1 0 0 +EDGE2 7412 7153 0.921307 -0.0253183 -0.0308656 1 0 1 1 0 0 +EDGE2 7412 7411 -1.0511 0.0147771 -0.0130287 1 0 1 1 0 0 +EDGE2 7412 7152 0.0433739 -0.00158724 -0.0128285 1 0 1 1 0 0 +EDGE2 7412 7151 -0.966464 0.00627583 -0.00334682 1 0 1 1 0 0 +EDGE2 7413 7153 -0.0369802 -0.0779486 -0.00622643 1 0 1 1 0 0 +EDGE2 7413 7152 -0.999642 0.0251101 -0.0123436 1 0 1 1 0 0 +EDGE2 7413 7412 -0.963538 0.0163642 -0.00141329 1 0 1 1 0 0 +EDGE2 7413 7154 1.02882 -0.031686 0.0144299 1 0 1 1 0 0 +EDGE2 7414 7153 -0.940501 0.0358815 0.0226055 1 0 1 1 0 0 +EDGE2 7414 7413 -1.03146 0.0550636 -0.00419306 1 0 1 1 0 0 +EDGE2 7414 7075 0.958667 0.0522387 -3.1336 1 0 1 1 0 0 +EDGE2 7414 7154 -0.0904658 -0.0278806 0.00338015 1 0 1 1 0 0 +EDGE2 7414 7155 1.01679 0.048353 0.00817511 1 0 1 1 0 0 +EDGE2 7415 7076 -0.0154946 -1.00645 -1.57323 1 0 1 1 0 0 +EDGE2 7415 7075 0.0507705 -0.0657639 -3.14184 1 0 1 1 0 0 +EDGE2 7415 7154 -0.969439 -0.0980396 -0.0514268 1 0 1 1 0 0 +EDGE2 7415 7414 -0.942976 -0.00176073 0.0055007 1 0 1 1 0 0 +EDGE2 7415 7155 -0.00836603 0.00642244 -0.0210889 1 0 1 1 0 0 +EDGE2 7415 7156 0.0198355 0.932511 1.55862 1 0 1 1 0 0 +EDGE2 7415 7074 0.924574 -0.0562248 -3.18113 1 0 1 1 0 0 +EDGE2 7416 7075 -0.987829 0.0119014 1.57106 1 0 1 1 0 0 +EDGE2 7416 7415 -1.00431 0.00304788 -1.58555 1 0 1 1 0 0 +EDGE2 7416 7155 -1.05362 -0.0188105 -1.59485 1 0 1 1 0 0 +EDGE2 7416 7156 -0.0332655 0.0551643 -0.0319537 1 0 1 1 0 0 +EDGE2 7416 7157 0.957416 -0.0114896 0.0068386 1 0 1 1 0 0 +EDGE2 7417 7156 -1.12908 -0.0150569 0.0316051 1 0 1 1 0 0 +EDGE2 7417 7416 -0.992543 -0.00552953 0.019254 1 0 1 1 0 0 +EDGE2 7417 7157 -0.0675044 0.0702519 0.0032594 1 0 1 1 0 0 +EDGE2 7417 7158 1.00021 -0.070713 0.0125661 1 0 1 1 0 0 +EDGE2 7418 7159 1.02423 -0.00614827 0.00929342 1 0 1 1 0 0 +EDGE2 7418 7417 -1.01099 -0.14176 0.0119598 1 0 1 1 0 0 +EDGE2 7418 7157 -0.938734 0.101718 -0.00147701 1 0 1 1 0 0 +EDGE2 7418 7158 -0.0536138 0.0387886 0.00193382 1 0 1 1 0 0 +EDGE2 7419 7159 -0.0746057 -0.0274029 -0.00156855 1 0 1 1 0 0 +EDGE2 7419 7418 -1.05529 0.0390842 0.0155958 1 0 1 1 0 0 +EDGE2 7419 7158 -1.0081 -0.0372157 0.0248533 1 0 1 1 0 0 +EDGE2 7419 7260 0.944173 0.0722477 -3.14801 1 0 1 1 0 0 +EDGE2 7419 7120 1.14567 -0.0186372 -3.1314 1 0 1 1 0 0 +EDGE2 7419 7140 1.02456 0.0221988 -3.11952 1 0 1 1 0 0 +EDGE2 7419 7160 0.962392 -0.127559 0.00680355 1 0 1 1 0 0 +EDGE2 7420 7159 -0.918282 -0.0071444 0.00731787 1 0 1 1 0 0 +EDGE2 7420 7419 -1.02184 -0.0128542 0.0528582 1 0 1 1 0 0 +EDGE2 7420 7261 -0.0491904 -0.946578 -1.5915 1 0 1 1 0 0 +EDGE2 7420 7260 -0.01852 -0.122755 -3.16945 1 0 1 1 0 0 +EDGE2 7420 7141 0.0493408 1.0118 1.55266 1 0 1 1 0 0 +EDGE2 7420 7161 0.0578199 1.018 1.57478 1 0 1 1 0 0 +EDGE2 7420 7120 0.0321326 0.0239608 -3.11017 1 0 1 1 0 0 +EDGE2 7420 7140 -0.0702728 0.0389657 -3.10901 1 0 1 1 0 0 +EDGE2 7420 7160 0.0285755 0.00669165 0.00560855 1 0 1 1 0 0 +EDGE2 7420 7119 0.986891 -0.0273851 -3.11458 1 0 1 1 0 0 +EDGE2 7420 7259 0.976389 0.0233222 -3.10861 1 0 1 1 0 0 +EDGE2 7420 7121 -0.0273219 -1.02132 -1.5591 1 0 1 1 0 0 +EDGE2 7420 7139 1.02903 -0.0174524 -3.12817 1 0 1 1 0 0 +EDGE2 7421 7261 0.0279092 -0.015875 0.014447 1 0 1 1 0 0 +EDGE2 7421 7260 -0.99343 -0.00249677 -1.56904 1 0 1 1 0 0 +EDGE2 7421 7420 -1.03288 -0.0100972 1.58324 1 0 1 1 0 0 +EDGE2 7421 7120 -1.07934 -0.00912064 -1.58581 1 0 1 1 0 0 +EDGE2 7421 7140 -1.04113 0.0315863 -1.55338 1 0 1 1 0 0 +EDGE2 7421 7160 -0.996385 -0.00838609 1.57779 1 0 1 1 0 0 +EDGE2 7421 7121 -0.0223982 -0.00468885 0.000191207 1 0 1 1 0 0 +EDGE2 7421 7122 1.01734 -0.0734547 0.0140291 1 0 1 1 0 0 +EDGE2 7421 7262 1.04425 0.0828878 -0.0398251 1 0 1 1 0 0 +EDGE2 7422 7261 -1.01585 -0.0172444 0.0276653 1 0 1 1 0 0 +EDGE2 7422 7421 -0.935273 -0.0835041 0.026775 1 0 1 1 0 0 +EDGE2 7422 7121 -1.09112 -0.00833157 -0.00162304 1 0 1 1 0 0 +EDGE2 7422 7123 1.03828 -0.0699348 0.0188112 1 0 1 1 0 0 +EDGE2 7422 7122 -0.029268 -0.0118781 0.0102229 1 0 1 1 0 0 +EDGE2 7422 7262 0.0806196 0.000315182 0.0159337 1 0 1 1 0 0 +EDGE2 7422 7263 1.0058 -0.0395058 0.00891935 1 0 1 1 0 0 +EDGE2 7423 7422 -0.908909 0.00984342 -0.0459431 1 0 1 1 0 0 +EDGE2 7423 7123 0.062308 -0.0643111 0.00110287 1 0 1 1 0 0 +EDGE2 7423 7122 -0.968292 0.0399693 -0.0184309 1 0 1 1 0 0 +EDGE2 7423 7262 -1.03364 0.00602732 0.0238698 1 0 1 1 0 0 +EDGE2 7423 7263 0.0627804 -0.0567171 -0.00621282 1 0 1 1 0 0 +EDGE2 7423 7264 0.948642 -0.0304915 0.00704344 1 0 1 1 0 0 +EDGE2 7423 7124 1.03128 0.0313181 0.00872199 1 0 1 1 0 0 +EDGE2 7424 7123 -1.01806 0.0438877 0.0166176 1 0 1 1 0 0 +EDGE2 7424 7423 -1.02281 -0.0779496 0.027056 1 0 1 1 0 0 +EDGE2 7424 7263 -0.966716 0.0279161 -0.00981213 1 0 1 1 0 0 +EDGE2 7424 7264 -0.0283999 0.0998008 0.00140004 1 0 1 1 0 0 +EDGE2 7424 7124 -0.0202103 -0.0406662 0.0324762 1 0 1 1 0 0 +EDGE2 7424 7125 0.973114 0.0020752 0.000165498 1 0 1 1 0 0 +EDGE2 7424 7265 0.954757 0.00821994 -0.00680846 1 0 1 1 0 0 +EDGE2 7424 7065 1.04669 -0.0080362 -3.13492 1 0 1 1 0 0 +EDGE2 7424 7105 1.01353 -0.0524473 -3.10965 1 0 1 1 0 0 +EDGE2 7425 7264 -1.01442 -0.0178245 -0.00772415 1 0 1 1 0 0 +EDGE2 7425 7424 -0.954715 -0.032648 0.0117029 1 0 1 1 0 0 +EDGE2 7425 7124 -0.988444 0.0387108 -0.00713438 1 0 1 1 0 0 +EDGE2 7425 7125 -0.0340732 0.0542537 0.00479043 1 0 1 1 0 0 +EDGE2 7425 7066 -0.0237008 -1.04297 -1.56707 1 0 1 1 0 0 +EDGE2 7425 7265 -0.0833001 0.0639772 -0.0151007 1 0 1 1 0 0 +EDGE2 7425 7104 1.03889 0.0179302 -3.14257 1 0 1 1 0 0 +EDGE2 7425 7065 0.0424531 -0.0190765 -3.16289 1 0 1 1 0 0 +EDGE2 7425 7105 0.0279892 -0.0597728 -3.16574 1 0 1 1 0 0 +EDGE2 7425 7064 1.01724 0.0571146 -3.14201 1 0 1 1 0 0 +EDGE2 7425 7126 -0.0398049 1.03653 1.58733 1 0 1 1 0 0 +EDGE2 7425 7266 -0.122993 1.08543 1.56856 1 0 1 1 0 0 +EDGE2 7425 7106 0.0436787 0.991616 1.54734 1 0 1 1 0 0 +EDGE2 7426 7125 -1.02762 -0.0036347 -1.58807 1 0 1 1 0 0 +EDGE2 7426 7425 -1.03795 -0.0634043 -1.56891 1 0 1 1 0 0 +EDGE2 7426 7265 -1.09309 -0.0133704 -1.57805 1 0 1 1 0 0 +EDGE2 7426 7065 -1.06732 0.0772391 1.56345 1 0 1 1 0 0 +EDGE2 7426 7105 -0.98575 0.0270963 1.55559 1 0 1 1 0 0 +EDGE2 7426 7126 0.05187 -0.0337359 0.0256518 1 0 1 1 0 0 +EDGE2 7426 7266 -0.0325985 0.117412 -0.0119 1 0 1 1 0 0 +EDGE2 7426 7106 -0.0532684 0.0253604 -0.0294404 1 0 1 1 0 0 +EDGE2 7426 7267 1.01425 -0.0861959 0.010085 1 0 1 1 0 0 +EDGE2 7426 7107 1.09379 0.0963456 -0.0176829 1 0 1 1 0 0 +EDGE2 7426 7127 1.0349 -0.00341703 0.0434773 1 0 1 1 0 0 +EDGE2 7427 7126 -0.904642 0.015386 0.0286176 1 0 1 1 0 0 +EDGE2 7427 7266 -0.963553 -0.0296649 0.031216 1 0 1 1 0 0 +EDGE2 7427 7426 -1.03825 -0.0825992 0.00186043 1 0 1 1 0 0 +EDGE2 7427 7106 -0.985331 -0.10254 0.0128567 1 0 1 1 0 0 +EDGE2 7427 7267 0.0223277 -0.00149294 0.00964807 1 0 1 1 0 0 +EDGE2 7427 7107 0.089607 0.0301383 -0.0178239 1 0 1 1 0 0 +EDGE2 7427 7127 -0.0293248 0.00927099 0.0184741 1 0 1 1 0 0 +EDGE2 7427 7128 0.922507 -0.0339189 0.0196954 1 0 1 1 0 0 +EDGE2 7427 7268 0.990312 -0.0756491 0.0107017 1 0 1 1 0 0 +EDGE2 7427 7108 0.942335 0.00590627 0.0162345 1 0 1 1 0 0 +EDGE2 7428 7267 -1.10001 0.0186103 0.0217332 1 0 1 1 0 0 +EDGE2 7428 7427 -1.06511 -0.000359547 0.0203391 1 0 1 1 0 0 +EDGE2 7428 7107 -1.0043 0.0157177 -0.0150844 1 0 1 1 0 0 +EDGE2 7428 7127 -0.970819 -0.0138428 0.0271851 1 0 1 1 0 0 +EDGE2 7428 7128 -0.0266776 0.0144376 0.00958687 1 0 1 1 0 0 +EDGE2 7428 7268 0.0154452 0.0753163 0.0215431 1 0 1 1 0 0 +EDGE2 7428 7108 0.0333727 0.0590458 0.00766534 1 0 1 1 0 0 +EDGE2 7428 7129 1.02095 -0.0868455 -0.027026 1 0 1 1 0 0 +EDGE2 7428 7269 1.01212 -0.0270219 -0.00570882 1 0 1 1 0 0 +EDGE2 7428 7109 1.05219 0.0266642 0.0115949 1 0 1 1 0 0 +EDGE2 7429 7128 -0.962099 -0.00902607 0.0148201 1 0 1 1 0 0 +EDGE2 7429 7268 -0.930679 0.0264002 0.00919747 1 0 1 1 0 0 +EDGE2 7429 7428 -1.05367 -0.00555982 -0.0191707 1 0 1 1 0 0 +EDGE2 7429 7108 -1.01359 0.0230277 0.0186426 1 0 1 1 0 0 +EDGE2 7429 7129 -0.0730437 -0.0173372 -0.0317809 1 0 1 1 0 0 +EDGE2 7429 7269 0.0384321 -0.0574053 -0.0138454 1 0 1 1 0 0 +EDGE2 7429 7109 0.035995 -0.0358102 0.00721262 1 0 1 1 0 0 +EDGE2 7429 7250 0.94117 0.0137412 -3.14562 1 0 1 1 0 0 +EDGE2 7429 7270 0.997664 0.039821 -0.0100802 1 0 1 1 0 0 +EDGE2 7429 7110 0.951962 -0.0112979 -0.0189228 1 0 1 1 0 0 +EDGE2 7429 7130 0.97382 0.0729709 -0.0356381 1 0 1 1 0 0 +EDGE2 7430 7131 -0.0204053 1.00121 1.5784 1 0 1 1 0 0 +EDGE2 7430 7271 0.0547973 0.98109 1.57117 1 0 1 1 0 0 +EDGE2 7430 7251 0.0358793 0.980206 1.61142 1 0 1 1 0 0 +EDGE2 7430 7111 0.0432118 1.05933 1.5626 1 0 1 1 0 0 +EDGE2 7430 7129 -0.985113 -0.0592524 -0.00575149 1 0 1 1 0 0 +EDGE2 7430 7269 -1.07851 -0.0363644 0.0247429 1 0 1 1 0 0 +EDGE2 7430 7429 -1.00417 0.046147 0.00899993 1 0 1 1 0 0 +EDGE2 7430 7109 -0.90754 0.0208616 0.0141183 1 0 1 1 0 0 +EDGE2 7430 7250 -0.0415147 -0.058269 -3.14376 1 0 1 1 0 0 +EDGE2 7430 7270 0.0322392 0.00299285 0.0376894 1 0 1 1 0 0 +EDGE2 7430 7110 -0.0133755 -8.80546e-05 -0.0155833 1 0 1 1 0 0 +EDGE2 7430 7130 0.0598326 -0.00327908 0.017201 1 0 1 1 0 0 +EDGE2 7430 7249 1.01613 0.0531524 -3.12571 1 0 1 1 0 0 +EDGE2 7431 7132 1.00231 0.0145889 7.71719e-06 1 0 1 1 0 0 +EDGE2 7431 7272 1.02023 0.0981502 0.00553748 1 0 1 1 0 0 +EDGE2 7431 7252 1.03084 0.067313 0.0178092 1 0 1 1 0 0 +EDGE2 7431 7131 0.0730546 0.0949485 0.00142199 1 0 1 1 0 0 +EDGE2 7431 7271 0.0226786 -0.00588895 0.0184624 1 0 1 1 0 0 +EDGE2 7431 7112 1.02863 -0.0465993 -0.0230646 1 0 1 1 0 0 +EDGE2 7431 7251 0.0763353 -0.0348076 0.0160465 1 0 1 1 0 0 +EDGE2 7431 7111 -0.00704324 0.0162991 -0.0195903 1 0 1 1 0 0 +EDGE2 7431 7250 -1.01854 0.00273238 1.55688 1 0 1 1 0 0 +EDGE2 7431 7430 -1.02829 -0.0107232 -1.60166 1 0 1 1 0 0 +EDGE2 7431 7270 -0.964238 0.0224239 -1.58367 1 0 1 1 0 0 +EDGE2 7431 7110 -0.959795 -0.0314101 -1.58341 1 0 1 1 0 0 +EDGE2 7431 7130 -0.942517 0.0724717 -1.60457 1 0 1 1 0 0 +EDGE2 7432 7132 -0.0733171 0.0564054 0.0270298 1 0 1 1 0 0 +EDGE2 7432 7133 1.05133 -0.0323119 0.00397063 1 0 1 1 0 0 +EDGE2 7432 7273 1.02068 -0.00065265 0.0135674 1 0 1 1 0 0 +EDGE2 7432 7253 0.904216 -0.0535148 0.0303554 1 0 1 1 0 0 +EDGE2 7432 7272 0.01711 0.0825283 0.00848554 1 0 1 1 0 0 +EDGE2 7432 7113 0.95834 -0.070422 -0.0265302 1 0 1 1 0 0 +EDGE2 7432 7252 -0.0372657 0.0553336 0.00225873 1 0 1 1 0 0 +EDGE2 7432 7131 -1.01163 0.0933388 -0.0279562 1 0 1 1 0 0 +EDGE2 7432 7271 -1.04191 -0.0418431 -0.0169462 1 0 1 1 0 0 +EDGE2 7432 7431 -0.961576 -0.0543093 -0.0168845 1 0 1 1 0 0 +EDGE2 7432 7112 0.0318678 -0.0422283 0.0358479 1 0 1 1 0 0 +EDGE2 7432 7251 -1.03072 0.0144103 0.00702621 1 0 1 1 0 0 +EDGE2 7432 7111 -0.92811 -0.0344016 0.0409291 1 0 1 1 0 0 +EDGE2 7433 7132 -1.06623 -0.0923476 -0.0124493 1 0 1 1 0 0 +EDGE2 7433 7134 1.06364 0.0406144 -0.00139981 1 0 1 1 0 0 +EDGE2 7433 7274 1.0166 -0.00826142 0.0147835 1 0 1 1 0 0 +EDGE2 7433 7254 0.946321 -0.0427066 -0.0339328 1 0 1 1 0 0 +EDGE2 7433 7133 -0.0187597 -0.0097062 -0.000152738 1 0 1 1 0 0 +EDGE2 7433 7273 0.0388196 0.0487114 0.0333092 1 0 1 1 0 0 +EDGE2 7433 7114 0.998961 -0.0329663 0.00690023 1 0 1 1 0 0 +EDGE2 7433 7253 0.00335608 0.057839 -0.0276221 1 0 1 1 0 0 +EDGE2 7433 7272 -1.00605 0.0348073 0.00241528 1 0 1 1 0 0 +EDGE2 7433 7432 -0.957142 -0.00897804 -0.0150746 1 0 1 1 0 0 +EDGE2 7433 7113 -0.00383226 -0.0108078 0.030695 1 0 1 1 0 0 +EDGE2 7433 7252 -0.944494 0.0511712 0.0132821 1 0 1 1 0 0 +EDGE2 7433 7112 -1.00104 -0.0929063 0.0150195 1 0 1 1 0 0 +EDGE2 7434 7315 1.03016 0.021135 -3.1281 1 0 1 1 0 0 +EDGE2 7434 7355 0.94671 -0.110336 -3.12639 1 0 1 1 0 0 +EDGE2 7434 7335 1.02246 -0.0512413 -3.12547 1 0 1 1 0 0 +EDGE2 7434 7134 0.0412147 -0.0797763 -0.0202103 1 0 1 1 0 0 +EDGE2 7434 7135 0.995476 0.0118635 -0.00309561 1 0 1 1 0 0 +EDGE2 7434 7255 0.987454 0.0431212 0.0260515 1 0 1 1 0 0 +EDGE2 7434 7275 1.03244 -0.0100487 -0.0150567 1 0 1 1 0 0 +EDGE2 7434 7295 0.933428 -0.0719278 -3.14692 1 0 1 1 0 0 +EDGE2 7434 7175 0.923478 0.0189277 -3.15594 1 0 1 1 0 0 +EDGE2 7434 7274 0.0131589 -0.0267897 -0.033485 1 0 1 1 0 0 +EDGE2 7434 7115 0.983388 -0.0352295 0.0235387 1 0 1 1 0 0 +EDGE2 7434 7254 -0.00744165 0.0695954 -0.0045531 1 0 1 1 0 0 +EDGE2 7434 7133 -0.977896 -0.0246253 0.0121295 1 0 1 1 0 0 +EDGE2 7434 7273 -0.989073 0.0183242 0.00281785 1 0 1 1 0 0 +EDGE2 7434 7433 -1.04654 -0.0635005 0.00329895 1 0 1 1 0 0 +EDGE2 7434 7114 -0.0312904 -0.0622277 0.0327751 1 0 1 1 0 0 +EDGE2 7434 7253 -0.967179 -0.0768722 0.00260356 1 0 1 1 0 0 +EDGE2 7434 7113 -0.999044 -0.0478358 -0.0362585 1 0 1 1 0 0 +EDGE2 7435 7315 0.0522407 0.00143772 -3.1144 1 0 1 1 0 0 +EDGE2 7435 7136 -0.033454 0.983475 1.56815 1 0 1 1 0 0 +EDGE2 7435 7256 -0.0281671 1.0163 1.54705 1 0 1 1 0 0 +EDGE2 7435 7116 -0.0399259 0.969646 1.55936 1 0 1 1 0 0 +EDGE2 7435 7354 1.07698 -0.0132533 -3.12431 1 0 1 1 0 0 +EDGE2 7435 7294 0.924454 0.161195 -3.15676 1 0 1 1 0 0 +EDGE2 7435 7314 0.996568 0.0696316 -3.11978 1 0 1 1 0 0 +EDGE2 7435 7334 1.12692 -0.0295472 -3.11992 1 0 1 1 0 0 +EDGE2 7435 7174 0.958143 -0.0825985 -3.13265 1 0 1 1 0 0 +EDGE2 7435 7355 -0.0179218 -0.0360897 -3.13991 1 0 1 1 0 0 +EDGE2 7435 7335 -0.0128029 0.00842095 -3.15969 1 0 1 1 0 0 +EDGE2 7435 7134 -1.03271 -0.00177163 -0.00725798 1 0 1 1 0 0 +EDGE2 7435 7135 -0.0580055 0.000748602 -0.0139144 1 0 1 1 0 0 +EDGE2 7435 7255 -0.0341357 -0.0288022 -0.00642174 1 0 1 1 0 0 +EDGE2 7435 7275 0.069162 0.0183235 -0.00100603 1 0 1 1 0 0 +EDGE2 7435 7295 0.0200322 0.0271338 -3.15293 1 0 1 1 0 0 +EDGE2 7435 7175 0.0177364 0.00131124 -3.15606 1 0 1 1 0 0 +EDGE2 7435 7274 -0.963456 -0.0374925 0.0365649 1 0 1 1 0 0 +EDGE2 7435 7434 -1.11555 0.067551 0.0123879 1 0 1 1 0 0 +EDGE2 7435 7115 -0.0404624 0.0033451 0.00450493 1 0 1 1 0 0 +EDGE2 7435 7254 -0.970028 -0.0467936 -0.00457765 1 0 1 1 0 0 +EDGE2 7435 7114 -0.905624 -0.0179432 0.0422072 1 0 1 1 0 0 +EDGE2 7435 7296 0.106722 -0.976126 -1.57838 1 0 1 1 0 0 +EDGE2 7435 7336 0.0628796 -0.957246 -1.57495 1 0 1 1 0 0 +EDGE2 7435 7356 0.0681049 -1.02454 -1.57806 1 0 1 1 0 0 +EDGE2 7435 7316 -0.0439917 -1.02282 -1.56801 1 0 1 1 0 0 +EDGE2 7435 7176 -0.019058 -0.954685 -1.55687 1 0 1 1 0 0 +EDGE2 7435 7276 0.0628751 -1.02221 -1.54721 1 0 1 1 0 0 +EDGE2 7436 7315 -0.955848 0.0316058 1.53075 1 0 1 1 0 0 +EDGE2 7436 7117 1.02423 -0.1125 -0.0066427 1 0 1 1 0 0 +EDGE2 7436 7137 1.04794 -0.00954762 -0.0253432 1 0 1 1 0 0 +EDGE2 7436 7257 0.933237 0.0905449 0.0023301 1 0 1 1 0 0 +EDGE2 7436 7136 0.0280783 -0.0571146 0.000492027 1 0 1 1 0 0 +EDGE2 7436 7256 -0.109159 0.024187 0.0150708 1 0 1 1 0 0 +EDGE2 7436 7116 0.0489105 0.0315347 0.00664924 1 0 1 1 0 0 +EDGE2 7436 7355 -1.05241 -0.0778225 1.55616 1 0 1 1 0 0 +EDGE2 7436 7435 -0.98941 0.0548522 -1.56959 1 0 1 1 0 0 +EDGE2 7436 7335 -1.04565 -0.0320408 1.61272 1 0 1 1 0 0 +EDGE2 7436 7135 -0.989587 -0.0636225 -1.54162 1 0 1 1 0 0 +EDGE2 7436 7255 -1.02233 0.0041971 -1.58565 1 0 1 1 0 0 +EDGE2 7436 7275 -0.984385 -0.0192005 -1.52717 1 0 1 1 0 0 +EDGE2 7436 7295 -1.10963 -0.0701958 1.57222 1 0 1 1 0 0 +EDGE2 7436 7175 -1.00655 0.0275163 1.54291 1 0 1 1 0 0 +EDGE2 7436 7115 -1.02798 -0.0311439 -1.57779 1 0 1 1 0 0 +EDGE2 7437 7138 0.941502 -0.103871 -0.010806 1 0 1 1 0 0 +EDGE2 7437 7258 1.05575 -0.0453483 0.000110192 1 0 1 1 0 0 +EDGE2 7437 7118 0.952548 -0.122171 -0.001726 1 0 1 1 0 0 +EDGE2 7437 7117 -0.0169001 -0.0440389 -0.0167683 1 0 1 1 0 0 +EDGE2 7437 7137 0.0601251 0.00183038 -0.00479681 1 0 1 1 0 0 +EDGE2 7437 7257 -0.0188129 0.0814195 -0.011979 1 0 1 1 0 0 +EDGE2 7437 7136 -0.952444 -0.0188692 0.00560397 1 0 1 1 0 0 +EDGE2 7437 7256 -0.995994 0.0894792 0.0354787 1 0 1 1 0 0 +EDGE2 7437 7436 -0.871875 -0.0323652 -0.0065384 1 0 1 1 0 0 +EDGE2 7437 7116 -0.998569 0.0906266 0.00561174 1 0 1 1 0 0 +EDGE2 7438 7119 1.04017 -0.0391823 0.0025306 1 0 1 1 0 0 +EDGE2 7438 7259 1.07426 0.0302574 0.00316806 1 0 1 1 0 0 +EDGE2 7438 7139 0.986692 0.0603947 -0.0193887 1 0 1 1 0 0 +EDGE2 7438 7138 -0.0126901 0.0301499 -0.00921273 1 0 1 1 0 0 +EDGE2 7438 7258 -0.058858 0.0281715 0.0125287 1 0 1 1 0 0 +EDGE2 7438 7118 0.0439439 0.0170457 -0.00368436 1 0 1 1 0 0 +EDGE2 7438 7437 -1.00615 -0.00354667 -0.0222237 1 0 1 1 0 0 +EDGE2 7438 7117 -1.01126 -0.02523 -0.035732 1 0 1 1 0 0 +EDGE2 7438 7137 -1.00014 0.0308332 -0.0138913 1 0 1 1 0 0 +EDGE2 7438 7257 -0.946406 0.0478981 -0.0161169 1 0 1 1 0 0 +EDGE2 7439 7260 1.03807 -0.0441526 0.000940124 1 0 1 1 0 0 +EDGE2 7439 7420 0.909673 0.0374233 -3.16232 1 0 1 1 0 0 +EDGE2 7439 7120 1.07684 0.00299453 -0.0060164 1 0 1 1 0 0 +EDGE2 7439 7140 1.07445 -0.0515521 0.00651834 1 0 1 1 0 0 +EDGE2 7439 7160 0.932447 -0.0276342 -3.14328 1 0 1 1 0 0 +EDGE2 7439 7119 0.0130482 -0.0109509 -0.0041419 1 0 1 1 0 0 +EDGE2 7439 7259 0.00274862 -0.0489414 -0.0195742 1 0 1 1 0 0 +EDGE2 7439 7139 -0.0677525 0.0564311 -0.0201543 1 0 1 1 0 0 +EDGE2 7439 7138 -1.02759 0.0649115 -0.0126215 1 0 1 1 0 0 +EDGE2 7439 7258 -1.02805 0.0542151 -0.00732147 1 0 1 1 0 0 +EDGE2 7439 7438 -1.00229 0.0932718 -0.0206057 1 0 1 1 0 0 +EDGE2 7439 7118 -1.05311 0.0753564 -0.0145595 1 0 1 1 0 0 +EDGE2 7440 7159 1.05083 0.00856309 -3.13253 1 0 1 1 0 0 +EDGE2 7440 7419 0.926471 0.00962137 -3.115 1 0 1 1 0 0 +EDGE2 7440 7261 0.00565837 0.993344 1.58457 1 0 1 1 0 0 +EDGE2 7440 7260 -0.0447423 0.0119562 -0.0248396 1 0 1 1 0 0 +EDGE2 7440 7141 -0.0957766 -1.04099 -1.54051 1 0 1 1 0 0 +EDGE2 7440 7161 0.0490846 -0.965739 -1.55473 1 0 1 1 0 0 +EDGE2 7440 7420 -0.0417349 0.0191361 -3.17249 1 0 1 1 0 0 +EDGE2 7440 7120 0.00348544 -0.0208874 0.00970087 1 0 1 1 0 0 +EDGE2 7440 7140 0.0202385 0.0539232 0.0025427 1 0 1 1 0 0 +EDGE2 7440 7160 0.0399033 0.0319975 -3.13172 1 0 1 1 0 0 +EDGE2 7440 7421 -0.0366805 1.04716 1.55138 1 0 1 1 0 0 +EDGE2 7440 7119 -0.9848 -0.0606307 0.00213861 1 0 1 1 0 0 +EDGE2 7440 7259 -0.970181 0.0473771 0.0133712 1 0 1 1 0 0 +EDGE2 7440 7121 -0.0656128 0.995853 1.56518 1 0 1 1 0 0 +EDGE2 7440 7439 -0.99563 0.115816 0.00675941 1 0 1 1 0 0 +EDGE2 7440 7139 -0.968842 0.0020204 -0.0222781 1 0 1 1 0 0 +EDGE2 7441 7162 0.892626 0.00669559 -0.022802 1 0 1 1 0 0 +EDGE2 7441 7142 0.978492 0.0226512 0.00420895 1 0 1 1 0 0 +EDGE2 7441 7260 -0.974858 0.0631254 1.58043 1 0 1 1 0 0 +EDGE2 7441 7440 -0.986579 -0.0116125 1.59145 1 0 1 1 0 0 +EDGE2 7441 7141 0.0153081 0.00866858 -0.0341234 1 0 1 1 0 0 +EDGE2 7441 7161 0.025619 0.0790459 0.0199856 1 0 1 1 0 0 +EDGE2 7441 7420 -1.02979 0.0243813 -1.57705 1 0 1 1 0 0 +EDGE2 7441 7120 -1.06606 0.0205004 1.53937 1 0 1 1 0 0 +EDGE2 7441 7140 -0.922685 0.0542454 1.59935 1 0 1 1 0 0 +EDGE2 7441 7160 -0.965459 -0.00470146 -1.60752 1 0 1 1 0 0 +EDGE2 7442 7441 -0.921075 -0.00117158 0.00766186 1 0 1 1 0 0 +EDGE2 7442 7163 1.1191 0.0313604 0.0102932 1 0 1 1 0 0 +EDGE2 7442 7162 0.0768882 -0.0727126 0.0113542 1 0 1 1 0 0 +EDGE2 7442 7143 1.06858 0.0760561 0.0186999 1 0 1 1 0 0 +EDGE2 7442 7142 0.0525477 -0.0638345 -0.00738935 1 0 1 1 0 0 +EDGE2 7442 7141 -1.03601 0.00113933 -0.0179556 1 0 1 1 0 0 +EDGE2 7442 7161 -1.00639 0.0200988 -0.0192006 1 0 1 1 0 0 +EDGE2 7443 7163 0.0705049 0.0657046 0.00833776 1 0 1 1 0 0 +EDGE2 7443 7144 0.910608 -0.00153622 0.0430833 1 0 1 1 0 0 +EDGE2 7443 7164 0.952787 0.0561901 -0.0240165 1 0 1 1 0 0 +EDGE2 7443 7162 -0.926874 -0.0237545 -0.0107282 1 0 1 1 0 0 +EDGE2 7443 7442 -1.0784 0.0116599 0.010603 1 0 1 1 0 0 +EDGE2 7443 7143 -0.0268537 -0.126827 -0.00784089 1 0 1 1 0 0 +EDGE2 7443 7142 -1.08879 -0.0103298 -2.81163e-05 1 0 1 1 0 0 +EDGE2 7444 7145 1.05551 0.0110665 -0.0166567 1 0 1 1 0 0 +EDGE2 7444 7165 1.0041 -0.0249464 0.00314795 1 0 1 1 0 0 +EDGE2 7444 7405 1.0219 0.00354954 -3.18393 1 0 1 1 0 0 +EDGE2 7444 7163 -1.03273 0.0704119 0.0217265 1 0 1 1 0 0 +EDGE2 7444 7144 0.0172369 -0.0492935 0.00912893 1 0 1 1 0 0 +EDGE2 7444 7164 -0.136984 -0.0163424 0.0349616 1 0 1 1 0 0 +EDGE2 7444 7443 -0.964317 -0.0146682 -0.00728085 1 0 1 1 0 0 +EDGE2 7444 7143 -0.984082 0.0663831 0.0166791 1 0 1 1 0 0 +EDGE2 7445 7404 1.03606 -0.014295 -3.14916 1 0 1 1 0 0 +EDGE2 7445 7146 0.00590267 0.912218 1.5678 1 0 1 1 0 0 +EDGE2 7445 7406 -0.0248743 1.13243 1.5719 1 0 1 1 0 0 +EDGE2 7445 7145 0.0793248 -0.070602 0.00844494 1 0 1 1 0 0 +EDGE2 7445 7165 -0.125076 0.00920826 0.00458132 1 0 1 1 0 0 +EDGE2 7445 7405 0.00794143 -0.0289163 -3.16477 1 0 1 1 0 0 +EDGE2 7445 7166 0.0475467 -0.915921 -1.5786 1 0 1 1 0 0 +EDGE2 7445 7144 -0.97843 0.0496169 0.0312379 1 0 1 1 0 0 +EDGE2 7445 7164 -0.989021 -0.0240053 -0.0160609 1 0 1 1 0 0 +EDGE2 7445 7444 -1.03137 -0.049672 -0.00394957 1 0 1 1 0 0 +EDGE2 7446 7445 -1.11361 0.0103665 1.57158 1 0 1 1 0 0 +EDGE2 7446 7145 -0.946707 -0.0214743 1.58448 1 0 1 1 0 0 +EDGE2 7446 7165 -1.02661 -0.0667953 1.58074 1 0 1 1 0 0 +EDGE2 7446 7405 -0.929461 0.0362364 -1.57416 1 0 1 1 0 0 +EDGE2 7446 7166 -0.0211487 0.0323555 0.0260266 1 0 1 1 0 0 +EDGE2 7446 7167 1.00659 0.0305543 -0.035064 1 0 1 1 0 0 +EDGE2 7447 7446 -0.94644 -0.0296929 0.0122918 1 0 1 1 0 0 +EDGE2 7447 7166 -1.04763 0.0827637 -0.040855 1 0 1 1 0 0 +EDGE2 7447 7168 0.967081 -0.0290668 -0.0283989 1 0 1 1 0 0 +EDGE2 7447 7167 0.00704877 0.0548014 -0.0189432 1 0 1 1 0 0 +EDGE2 7448 7168 -0.049346 0.0229741 0.00389532 1 0 1 1 0 0 +EDGE2 7448 7167 -1.00557 0.0264302 -0.0375026 1 0 1 1 0 0 +EDGE2 7448 7447 -0.946549 0.0241255 -0.0199212 1 0 1 1 0 0 +EDGE2 7448 7169 0.979045 0.00690863 0.010776 1 0 1 1 0 0 +EDGE2 7449 7168 -0.994453 0.0576868 -0.0163134 1 0 1 1 0 0 +EDGE2 7449 7448 -1.06444 -0.0517258 -0.0313889 1 0 1 1 0 0 +EDGE2 7449 7169 0.000822457 -0.0512069 0.017229 1 0 1 1 0 0 +EDGE2 7449 7310 1.05284 0.104407 -3.11826 1 0 1 1 0 0 +EDGE2 7449 7350 1.03403 -0.0323671 -3.1167 1 0 1 1 0 0 +EDGE2 7449 7330 0.943464 0.0371789 -3.1787 1 0 1 1 0 0 +EDGE2 7449 7170 1.08465 -0.0156517 -0.0212099 1 0 1 1 0 0 +EDGE2 7449 7290 1.04321 -0.0537707 -3.17241 1 0 1 1 0 0 +EDGE2 7450 7449 -0.956075 0.041605 -0.0105322 1 0 1 1 0 0 +EDGE2 7450 7169 -0.900165 -0.0377876 -0.00117628 1 0 1 1 0 0 +EDGE2 7450 7310 0.0167863 0.0109142 -3.13755 1 0 1 1 0 0 +EDGE2 7450 7350 -0.0618434 0.00744953 -3.11603 1 0 1 1 0 0 +EDGE2 7450 7330 -0.0636279 0.0105647 -3.14341 1 0 1 1 0 0 +EDGE2 7450 7170 -0.0247145 0.0457035 -0.0143504 1 0 1 1 0 0 +EDGE2 7450 7290 0.00764321 0.00524513 -3.1436 1 0 1 1 0 0 +EDGE2 7450 7329 1.09558 -0.0181138 -3.10652 1 0 1 1 0 0 +EDGE2 7450 7349 0.967365 -0.0966254 -3.12277 1 0 1 1 0 0 +EDGE2 7450 7289 1.03652 -0.0319274 -3.13615 1 0 1 1 0 0 +EDGE2 7450 7309 0.96918 0.0495058 -3.13164 1 0 1 1 0 0 +EDGE2 7450 7291 0.0763601 -0.951591 -1.55088 1 0 1 1 0 0 +EDGE2 7450 7331 -0.0669547 -1.0511 -1.5834 1 0 1 1 0 0 +EDGE2 7450 7351 -0.00587 -1.09912 -1.56994 1 0 1 1 0 0 +EDGE2 7450 7311 0.0145646 -0.902307 -1.5577 1 0 1 1 0 0 +EDGE2 7450 7171 0.0183122 -1.00904 -1.53074 1 0 1 1 0 0 +EDGE2 7451 7310 -0.966338 -0.079898 1.59019 1 0 1 1 0 0 +EDGE2 7451 7350 -1.04664 0.0663261 1.56996 1 0 1 1 0 0 +EDGE2 7451 7450 -0.969881 -0.00875351 -1.52214 1 0 1 1 0 0 +EDGE2 7451 7330 -0.995774 0.0212381 1.52818 1 0 1 1 0 0 +EDGE2 7451 7170 -0.951458 -0.0856998 -1.58727 1 0 1 1 0 0 +EDGE2 7451 7290 -1.00085 0.0524276 1.58768 1 0 1 1 0 0 +EDGE2 7452 7451 -1.02906 -0.0681868 0.000306266 1 0 1 1 0 0 +EDGE2 7453 7452 -0.977269 -0.0533609 -0.0149381 1 0 1 1 0 0 +EDGE2 7454 7395 1.0547 0.0867507 -3.11714 1 0 1 1 0 0 +EDGE2 7454 7453 -1.05494 0.0991136 -0.0127836 1 0 1 1 0 0 +EDGE2 7455 7396 0.0664604 0.964875 1.55627 1 0 1 1 0 0 +EDGE2 7455 7394 1.00763 0.0431185 -3.15233 1 0 1 1 0 0 +EDGE2 7455 7395 -0.00979179 -0.0177197 -3.09706 1 0 1 1 0 0 +EDGE2 7455 7454 -0.987491 0.0210078 0.0582346 1 0 1 1 0 0 +EDGE2 7456 7455 -0.965921 -0.0214963 1.5859 1 0 1 1 0 0 +EDGE2 7456 7395 -0.975658 0.0538684 -1.58879 1 0 1 1 0 0 +EDGE2 7457 7456 -0.97379 -0.0411745 0.0528769 1 0 1 1 0 0 +EDGE2 7458 7457 -0.953919 -0.0602428 -0.054226 1 0 1 1 0 0 +EDGE2 7459 7458 -1.01179 -0.0302505 0.0373182 1 0 1 1 0 0 +EDGE2 7459 7380 0.9611 0.00898085 -3.12994 1 0 1 1 0 0 +EDGE2 7460 7459 -1.05369 -0.0639529 0.00434863 1 0 1 1 0 0 +EDGE2 7460 7381 -0.0733851 1.0085 1.541 1 0 1 1 0 0 +EDGE2 7460 7380 -0.0686482 0.0473336 -3.17732 1 0 1 1 0 0 +EDGE2 7460 7379 0.913368 -0.0379641 -3.15324 1 0 1 1 0 0 +EDGE2 7461 7382 1.08036 -0.0682246 0.0110046 1 0 1 1 0 0 +EDGE2 7461 7381 -0.0687174 -0.0153453 0.00270995 1 0 1 1 0 0 +EDGE2 7461 7380 -1.049 0.0657216 1.5906 1 0 1 1 0 0 +EDGE2 7461 7460 -0.954937 -0.0458118 -1.57995 1 0 1 1 0 0 +EDGE2 7462 7383 1.04761 -0.00293686 -0.0411596 1 0 1 1 0 0 +EDGE2 7462 7382 0.00814577 0.0191568 -0.026645 1 0 1 1 0 0 +EDGE2 7462 7381 -0.998504 0.152248 0.0106713 1 0 1 1 0 0 +EDGE2 7462 7461 -1.04647 -0.0258676 0.0080027 1 0 1 1 0 0 +EDGE2 7463 7384 0.945757 0.0687539 -0.00855474 1 0 1 1 0 0 +EDGE2 7463 7383 -0.0353124 -0.0186902 -0.0422089 1 0 1 1 0 0 +EDGE2 7463 7382 -0.948151 -0.0243451 -0.00647452 1 0 1 1 0 0 +EDGE2 7463 7462 -1.03054 0.0353668 -0.00733536 1 0 1 1 0 0 +EDGE2 7464 7463 -0.946103 -0.0202346 -0.0203339 1 0 1 1 0 0 +EDGE2 7464 7385 1.07519 -0.0372002 -0.0316113 1 0 1 1 0 0 +EDGE2 7464 7384 -0.0270245 -0.0748217 0.0164193 1 0 1 1 0 0 +EDGE2 7464 7383 -0.942434 0.0342703 -0.00918491 1 0 1 1 0 0 +EDGE2 7465 7386 -0.0263442 1.02556 1.55571 1 0 1 1 0 0 +EDGE2 7465 7385 0.0210062 -0.0523626 0.00899165 1 0 1 1 0 0 +EDGE2 7465 7464 -1.0155 -0.0209041 -0.0108506 1 0 1 1 0 0 +EDGE2 7465 7384 -0.97008 -0.0919302 -0.0466448 1 0 1 1 0 0 +EDGE2 7466 7387 1.02319 0.0709182 -0.00714315 1 0 1 1 0 0 +EDGE2 7466 7386 -0.0478835 -0.0136054 -0.0191939 1 0 1 1 0 0 +EDGE2 7466 7465 -0.99393 0.0523465 -1.59024 1 0 1 1 0 0 +EDGE2 7466 7385 -0.965597 -0.0156977 -1.5724 1 0 1 1 0 0 +EDGE2 7467 7388 0.998748 -0.0189407 0.00690877 1 0 1 1 0 0 +EDGE2 7467 7387 0.0696015 0.0565272 0.0208335 1 0 1 1 0 0 +EDGE2 7467 7466 -0.978206 -0.00432133 -0.0219215 1 0 1 1 0 0 +EDGE2 7467 7386 -0.935624 0.0413951 0.00806127 1 0 1 1 0 0 +EDGE2 7468 7389 1.04068 0.07997 -0.00417719 1 0 1 1 0 0 +EDGE2 7468 7388 0.0393477 0.028377 0.00882799 1 0 1 1 0 0 +EDGE2 7468 7467 -0.952912 0.102248 -0.00904702 1 0 1 1 0 0 +EDGE2 7468 7387 -1.01427 -0.0119695 -0.00299492 1 0 1 1 0 0 +EDGE2 7469 7390 1.04408 0.00802684 0.0346075 1 0 1 1 0 0 +EDGE2 7469 7389 0.0470846 -0.000175758 -0.00782122 1 0 1 1 0 0 +EDGE2 7469 7468 -1.0427 -0.0815141 -0.00449701 1 0 1 1 0 0 +EDGE2 7469 7388 -1.04247 0.00258009 0.0110986 1 0 1 1 0 0 +EDGE2 7470 7390 -0.01199 -0.0395744 0.00214002 1 0 1 1 0 0 +EDGE2 7470 7391 0.0357707 1.01396 1.59792 1 0 1 1 0 0 +EDGE2 7470 7389 -1.09241 0.0590142 -0.0034752 1 0 1 1 0 0 +EDGE2 7470 7469 -0.995424 -0.0226159 0.000214252 1 0 1 1 0 0 +EDGE2 7471 7470 -0.879988 -0.048985 -1.63093 1 0 1 1 0 0 +EDGE2 7471 7390 -0.971202 0.0448676 -1.54474 1 0 1 1 0 0 +EDGE2 7471 7391 -0.0415496 0.0866812 -0.00690879 1 0 1 1 0 0 +EDGE2 7471 7392 1.02672 0.0132117 0.00310716 1 0 1 1 0 0 +EDGE2 7472 7391 -1.00316 -0.0688357 -0.00871657 1 0 1 1 0 0 +EDGE2 7472 7471 -1.02743 0.0594405 0.00629077 1 0 1 1 0 0 +EDGE2 7472 7392 -0.00353846 -0.0175718 0.0124385 1 0 1 1 0 0 +EDGE2 7472 7393 0.918409 -0.08007 0.000182474 1 0 1 1 0 0 +EDGE2 7473 7394 1.00817 0.0394819 0.00781956 1 0 1 1 0 0 +EDGE2 7473 7392 -1.04211 -0.0178519 0.000854905 1 0 1 1 0 0 +EDGE2 7473 7472 -1.06646 0.0440706 0.0073232 1 0 1 1 0 0 +EDGE2 7473 7393 -0.0732348 0.0254951 0.00173727 1 0 1 1 0 0 +EDGE2 7474 7394 0.0456586 0.0341448 -0.0383593 1 0 1 1 0 0 +EDGE2 7474 7473 -1.0178 -0.00105021 0.0231489 1 0 1 1 0 0 +EDGE2 7474 7393 -0.987386 -0.0426821 0.00138474 1 0 1 1 0 0 +EDGE2 7474 7455 1.0649 0.0178862 -3.16414 1 0 1 1 0 0 +EDGE2 7474 7395 0.984393 -0.0169633 -0.0338751 1 0 1 1 0 0 +EDGE2 7475 7396 0.0424576 -1.03225 -1.56823 1 0 1 1 0 0 +EDGE2 7475 7394 -1.02292 0.0696445 -0.029233 1 0 1 1 0 0 +EDGE2 7475 7474 -1.03481 -0.0116582 -0.00595327 1 0 1 1 0 0 +EDGE2 7475 7455 -0.0221586 -0.0231285 -3.17185 1 0 1 1 0 0 +EDGE2 7475 7395 0.024701 0.0176134 0.00820369 1 0 1 1 0 0 +EDGE2 7475 7456 0.0518399 0.989142 1.57189 1 0 1 1 0 0 +EDGE2 7475 7454 1.03511 0.0653758 -3.13853 1 0 1 1 0 0 +EDGE2 7476 7397 1.01449 -0.0123165 -0.0110832 1 0 1 1 0 0 +EDGE2 7476 7396 -0.0392035 0.0159933 -0.0142035 1 0 1 1 0 0 +EDGE2 7476 7455 -1.0223 -0.0186667 -1.53151 1 0 1 1 0 0 +EDGE2 7476 7475 -0.96737 0.0782176 1.51591 1 0 1 1 0 0 +EDGE2 7476 7395 -1.00895 0.0107555 1.52267 1 0 1 1 0 0 +EDGE2 7477 7398 0.993643 0.0845375 0.0490019 1 0 1 1 0 0 +EDGE2 7477 7476 -0.931641 0.0523809 0.0350699 1 0 1 1 0 0 +EDGE2 7477 7397 -0.0307311 0.0319805 0.0385912 1 0 1 1 0 0 +EDGE2 7477 7396 -0.971751 -0.0344756 0.00381128 1 0 1 1 0 0 +EDGE2 7478 7398 0.0202891 0.00100349 0.0414789 1 0 1 1 0 0 +EDGE2 7478 7399 1.02009 -0.0297906 0.00899015 1 0 1 1 0 0 +EDGE2 7478 7397 -0.961953 -0.0322701 -0.0241832 1 0 1 1 0 0 +EDGE2 7478 7477 -0.961082 -0.0771178 -0.0102098 1 0 1 1 0 0 +EDGE2 7479 7398 -0.968617 0.0621051 -0.00891432 1 0 1 1 0 0 +EDGE2 7479 7399 -0.0475688 0.0497637 0.000399489 1 0 1 1 0 0 +EDGE2 7479 7400 1.02447 0.0192241 0.0075364 1 0 1 1 0 0 +EDGE2 7479 7478 -0.950832 -0.12189 -0.0123148 1 0 1 1 0 0 +EDGE2 7480 7399 -0.989007 -0.0412495 0.0147024 1 0 1 1 0 0 +EDGE2 7480 7479 -0.986577 0.0429507 0.0104761 1 0 1 1 0 0 +EDGE2 7480 7400 -0.035906 0.0220304 0.00990777 1 0 1 1 0 0 +EDGE2 7480 7401 0.0867966 1.01655 1.55654 1 0 1 1 0 0 +EDGE2 7481 7480 -1.00752 -0.0160873 1.59545 1 0 1 1 0 0 +EDGE2 7481 7400 -1.03408 0.108723 1.53544 1 0 1 1 0 0 +EDGE2 7482 7481 -1.03849 -0.0946011 -0.0345964 1 0 1 1 0 0 +EDGE2 7483 7482 -0.950334 -0.00567495 0.00448987 1 0 1 1 0 0 +EDGE2 7484 7483 -0.957905 0.0163563 0.000951694 1 0 1 1 0 0 +EDGE2 7485 7484 -0.994488 0.0569463 -0.00638143 1 0 1 1 0 0 +EDGE2 7486 7485 -1.02642 -0.0867701 -1.56679 1 0 1 1 0 0 +EDGE2 7487 7486 -1.06919 -0.0582844 -0.0306085 1 0 1 1 0 0 +EDGE2 7488 7487 -0.941999 0.0150404 -0.0107826 1 0 1 1 0 0 +EDGE2 7489 7488 -0.992502 0.0204833 -0.0360616 1 0 1 1 0 0 +EDGE2 7490 7489 -0.978241 -0.00231465 -0.0286815 1 0 1 1 0 0 +EDGE2 7491 7490 -1.00664 -0.0351887 -1.5427 1 0 1 1 0 0 +EDGE2 7492 7491 -1.0056 -0.101319 0.0226446 1 0 1 1 0 0 +EDGE2 7493 7492 -1.01452 -0.00728301 0.0204567 1 0 1 1 0 0 +EDGE2 7494 7493 -0.961737 -0.0592969 -0.0176537 1 0 1 1 0 0 +EDGE2 7495 7494 -1.01988 0.0972053 -0.0117443 1 0 1 1 0 0 +EDGE2 7496 7495 -1.01743 0.0691294 -1.5962 1 0 1 1 0 0 +EDGE2 7497 7496 -1.09216 0.0471523 0.00444813 1 0 1 1 0 0 +EDGE2 7498 7497 -0.984911 -0.025936 0.00769833 1 0 1 1 0 0 +EDGE2 7499 7498 -1.09348 0.028005 -0.019144 1 0 1 1 0 0 +EDGE2 7499 7480 0.888145 0.0459484 -3.12544 1 0 1 1 0 0 +EDGE2 7499 7400 1.00731 -0.0454239 -3.13397 1 0 1 1 0 0 +EDGE2 7500 7499 -0.992034 -0.0164651 0.0406901 1 0 1 1 0 0 +EDGE2 7500 7481 -0.0925081 0.910227 1.59092 1 0 1 1 0 0 +EDGE2 7500 7480 -0.0526267 0.0613021 -3.1166 1 0 1 1 0 0 +EDGE2 7500 7399 1.00907 -0.0362161 -3.12165 1 0 1 1 0 0 +EDGE2 7500 7479 0.986986 -0.0267 -3.14858 1 0 1 1 0 0 +EDGE2 7500 7400 -0.0131441 0.0707499 -3.13617 1 0 1 1 0 0 +EDGE2 7500 7401 0.0585679 -1.01458 -1.59155 1 0 1 1 0 0 +EDGE2 7501 7500 -0.92391 -0.0349436 1.5539 1 0 1 1 0 0 +EDGE2 7501 7480 -0.99403 -0.0816586 -1.53233 1 0 1 1 0 0 +EDGE2 7501 7400 -0.99526 -0.00201295 -1.56593 1 0 1 1 0 0 +EDGE2 7501 7402 1.00537 0.0191708 0.00254712 1 0 1 1 0 0 +EDGE2 7501 7401 -0.0158173 0.0495104 -0.010355 1 0 1 1 0 0 +EDGE2 7502 7402 -0.0259221 0.0122315 -0.0211161 1 0 1 1 0 0 +EDGE2 7502 7401 -0.995505 0.0120555 0.00199435 1 0 1 1 0 0 +EDGE2 7502 7501 -1.02867 0.0129018 0.0011452 1 0 1 1 0 0 +EDGE2 7502 7403 0.97946 -0.0114744 0.00237922 1 0 1 1 0 0 +EDGE2 7503 7402 -0.95037 -0.0821666 -0.0316804 1 0 1 1 0 0 +EDGE2 7503 7502 -0.944255 0.033699 0.0337335 1 0 1 1 0 0 +EDGE2 7503 7403 -0.00508676 -0.042032 -0.0202973 1 0 1 1 0 0 +EDGE2 7503 7404 0.986256 -0.0204832 -0.0243136 1 0 1 1 0 0 +EDGE2 7504 7445 1.01346 0.00879294 -3.14335 1 0 1 1 0 0 +EDGE2 7504 7403 -0.969179 -0.0186424 0.000356951 1 0 1 1 0 0 +EDGE2 7504 7503 -1.04018 0.0167378 0.00747468 1 0 1 1 0 0 +EDGE2 7504 7404 0.0488559 0.0293897 0.00937557 1 0 1 1 0 0 +EDGE2 7504 7145 0.931586 0.0458079 -3.10576 1 0 1 1 0 0 +EDGE2 7504 7165 0.969415 -0.00920746 -3.16044 1 0 1 1 0 0 +EDGE2 7504 7405 0.975849 -0.0473039 0.0331237 1 0 1 1 0 0 +EDGE2 7505 7445 -0.0388957 -0.0157358 -3.1296 1 0 1 1 0 0 +EDGE2 7505 7504 -0.987952 0.0367501 0.0452985 1 0 1 1 0 0 +EDGE2 7505 7404 -1.00314 -0.0449715 0.00819838 1 0 1 1 0 0 +EDGE2 7505 7146 0.0327377 -0.969918 -1.57624 1 0 1 1 0 0 +EDGE2 7505 7406 -0.00438048 -0.996235 -1.57377 1 0 1 1 0 0 +EDGE2 7505 7446 -0.0356612 1.09049 1.59962 1 0 1 1 0 0 +EDGE2 7505 7145 0.0120665 -0.051472 -3.16494 1 0 1 1 0 0 +EDGE2 7505 7165 0.0663644 0.0693997 -3.11473 1 0 1 1 0 0 +EDGE2 7505 7405 -0.0344019 0.00387243 0.0203436 1 0 1 1 0 0 +EDGE2 7505 7166 0.0233504 1.01205 1.60773 1 0 1 1 0 0 +EDGE2 7505 7144 0.963078 0.00568695 -3.15284 1 0 1 1 0 0 +EDGE2 7505 7164 1.00145 0.00876694 -3.14519 1 0 1 1 0 0 +EDGE2 7505 7444 0.872334 -0.0138701 -3.13541 1 0 1 1 0 0 +EDGE2 7506 7445 -1.0255 0.0871399 1.5783 1 0 1 1 0 0 +EDGE2 7506 7505 -1.00742 -0.006013 -1.59303 1 0 1 1 0 0 +EDGE2 7506 7446 -0.0436181 -0.0306831 -0.0103852 1 0 1 1 0 0 +EDGE2 7506 7145 -0.949027 -0.0717467 1.56592 1 0 1 1 0 0 +EDGE2 7506 7165 -0.982799 0.0158358 1.53385 1 0 1 1 0 0 +EDGE2 7506 7405 -0.972288 -0.0107573 -1.55346 1 0 1 1 0 0 +EDGE2 7506 7166 -0.055493 0.051171 0.0346747 1 0 1 1 0 0 +EDGE2 7506 7167 1.06693 0.0537062 0.0193024 1 0 1 1 0 0 +EDGE2 7506 7447 1.02895 -0.0269556 -0.0209448 1 0 1 1 0 0 +EDGE2 7507 7446 -1.02586 -0.0434247 0.00208351 1 0 1 1 0 0 +EDGE2 7507 7506 -0.95342 0.0419936 0.0311192 1 0 1 1 0 0 +EDGE2 7507 7166 -0.998211 0.0273174 0.00865536 1 0 1 1 0 0 +EDGE2 7507 7168 0.951148 -0.0337716 0.00426068 1 0 1 1 0 0 +EDGE2 7507 7167 -0.0900185 -0.0409052 -0.000355587 1 0 1 1 0 0 +EDGE2 7507 7447 -0.0147489 -0.0693304 -0.00974085 1 0 1 1 0 0 +EDGE2 7507 7448 0.983321 0.00174528 -0.00415529 1 0 1 1 0 0 +EDGE2 7508 7507 -0.956659 0.051613 0.0244712 1 0 1 1 0 0 +EDGE2 7508 7168 0.0254952 0.0550575 -0.0142784 1 0 1 1 0 0 +EDGE2 7508 7167 -0.955202 -0.0399902 0.0220127 1 0 1 1 0 0 +EDGE2 7508 7447 -1.00551 -0.0146312 0.000520934 1 0 1 1 0 0 +EDGE2 7508 7448 -0.0174297 0.0617579 0.0216993 1 0 1 1 0 0 +EDGE2 7508 7449 0.978296 0.0115243 0.0207949 1 0 1 1 0 0 +EDGE2 7508 7169 1.06345 0.00844552 -0.0130593 1 0 1 1 0 0 +EDGE2 7509 7168 -0.991519 0.0448214 0.0263783 1 0 1 1 0 0 +EDGE2 7509 7508 -1.03776 -0.072817 -0.00836656 1 0 1 1 0 0 +EDGE2 7509 7448 -0.989641 -0.0260582 -0.0146577 1 0 1 1 0 0 +EDGE2 7509 7449 0.0262164 0.0515858 0.0294117 1 0 1 1 0 0 +EDGE2 7509 7169 -0.0195795 -0.0111182 0.018681 1 0 1 1 0 0 +EDGE2 7509 7310 1.01905 0.0371216 -3.13666 1 0 1 1 0 0 +EDGE2 7509 7350 0.994946 -0.111709 -3.13647 1 0 1 1 0 0 +EDGE2 7509 7450 0.961573 -0.0115245 -0.0407687 1 0 1 1 0 0 +EDGE2 7509 7330 1.03696 -0.00757731 -3.15118 1 0 1 1 0 0 +EDGE2 7509 7170 1.04745 -0.0424867 0.0142472 1 0 1 1 0 0 +EDGE2 7509 7290 1.0505 -0.0254909 -3.16532 1 0 1 1 0 0 +EDGE2 7510 7449 -0.93656 -0.113489 0.0391749 1 0 1 1 0 0 +EDGE2 7510 7509 -0.990957 -0.0269642 0.00583412 1 0 1 1 0 0 +EDGE2 7510 7169 -0.961843 -0.0133568 -0.00670547 1 0 1 1 0 0 +EDGE2 7510 7451 -0.0286041 0.968973 1.57808 1 0 1 1 0 0 +EDGE2 7510 7310 -0.0238157 0.0747547 -3.13844 1 0 1 1 0 0 +EDGE2 7510 7350 -0.0143485 0.0738663 -3.17111 1 0 1 1 0 0 +EDGE2 7510 7450 -0.0276213 -0.11177 -0.0148553 1 0 1 1 0 0 +EDGE2 7510 7330 -0.0253135 -0.00962008 -3.1594 1 0 1 1 0 0 +EDGE2 7510 7170 0.0588121 0.0589987 -0.0200544 1 0 1 1 0 0 +EDGE2 7510 7290 -0.0133133 -0.00436642 -3.16925 1 0 1 1 0 0 +EDGE2 7510 7329 1.0605 -0.00181682 -3.14285 1 0 1 1 0 0 +EDGE2 7510 7349 1.02196 0.0139533 -3.14649 1 0 1 1 0 0 +EDGE2 7510 7289 1.00466 0.0307892 -3.14199 1 0 1 1 0 0 +EDGE2 7510 7309 0.966447 -0.00987421 -3.09937 1 0 1 1 0 0 +EDGE2 7510 7291 0.0505494 -0.985363 -1.56088 1 0 1 1 0 0 +EDGE2 7510 7331 -0.0623827 -1.02524 -1.61056 1 0 1 1 0 0 +EDGE2 7510 7351 -0.0107456 -1.08177 -1.58015 1 0 1 1 0 0 +EDGE2 7510 7311 -0.112689 -1.00542 -1.53033 1 0 1 1 0 0 +EDGE2 7510 7171 0.0138536 -0.939999 -1.55774 1 0 1 1 0 0 +EDGE2 7511 7452 1.06151 -0.0184284 0.0264356 1 0 1 1 0 0 +EDGE2 7511 7451 -0.0535045 -0.0666057 -0.0204022 1 0 1 1 0 0 +EDGE2 7511 7310 -0.971611 -0.0121371 1.5837 1 0 1 1 0 0 +EDGE2 7511 7350 -0.919885 -0.00538666 1.56213 1 0 1 1 0 0 +EDGE2 7511 7450 -0.878372 0.0159173 -1.51493 1 0 1 1 0 0 +EDGE2 7511 7510 -0.881668 -0.0248215 -1.57128 1 0 1 1 0 0 +EDGE2 7511 7330 -1.00642 0.148144 1.58183 1 0 1 1 0 0 +EDGE2 7511 7170 -0.988214 -0.0243061 -1.5717 1 0 1 1 0 0 +EDGE2 7511 7290 -0.980837 -0.052738 1.55633 1 0 1 1 0 0 +EDGE2 7512 7453 0.952374 0.0859917 -0.0323092 1 0 1 1 0 0 +EDGE2 7512 7511 -0.971246 0.0514573 0.00565273 1 0 1 1 0 0 +EDGE2 7512 7452 0.0422901 0.0425713 -0.020051 1 0 1 1 0 0 +EDGE2 7512 7451 -1.02953 0.0608414 0.0108199 1 0 1 1 0 0 +EDGE2 7513 7512 -1.01445 -0.0432412 0.0023343 1 0 1 1 0 0 +EDGE2 7513 7454 0.933146 -0.0336292 0.00575684 1 0 1 1 0 0 +EDGE2 7513 7453 0.0592127 0.0163712 -0.00712681 1 0 1 1 0 0 +EDGE2 7513 7452 -0.928791 0.019553 -0.0340241 1 0 1 1 0 0 +EDGE2 7514 7455 0.978721 0.0134438 -0.0260029 1 0 1 1 0 0 +EDGE2 7514 7475 0.90039 0.0628391 -3.1627 1 0 1 1 0 0 +EDGE2 7514 7395 0.994016 -0.0072506 -3.14124 1 0 1 1 0 0 +EDGE2 7514 7513 -0.943708 0.0469866 0.00585935 1 0 1 1 0 0 +EDGE2 7514 7454 -0.0136342 0.00991731 0.00721725 1 0 1 1 0 0 +EDGE2 7514 7453 -0.992864 0.048709 0.0138742 1 0 1 1 0 0 +EDGE2 7515 7476 -0.0265096 0.975769 1.57812 1 0 1 1 0 0 +EDGE2 7515 7396 0.0758858 0.945507 1.57522 1 0 1 1 0 0 +EDGE2 7515 7394 1.06955 -0.0184934 -3.1481 1 0 1 1 0 0 +EDGE2 7515 7474 1.01932 0.0427979 -3.13982 1 0 1 1 0 0 +EDGE2 7515 7455 0.031972 -0.00349462 -0.000126587 1 0 1 1 0 0 +EDGE2 7515 7475 -0.0234919 0.00520804 -3.1419 1 0 1 1 0 0 +EDGE2 7515 7395 0.0306861 0.0296467 -3.12026 1 0 1 1 0 0 +EDGE2 7515 7456 -0.0485369 -1.02465 -1.55417 1 0 1 1 0 0 +EDGE2 7515 7514 -0.926324 0.0508372 -0.0417517 1 0 1 1 0 0 +EDGE2 7515 7454 -0.947556 0.0244947 0.025917 1 0 1 1 0 0 +EDGE2 7516 7455 -1.01647 -0.0785223 1.59891 1 0 1 1 0 0 +EDGE2 7516 7475 -0.98224 -0.0534717 -1.54962 1 0 1 1 0 0 +EDGE2 7516 7515 -0.979376 -0.0263597 1.59187 1 0 1 1 0 0 +EDGE2 7516 7395 -1.08134 -0.0225746 -1.60372 1 0 1 1 0 0 +EDGE2 7516 7456 -0.0338075 -0.0614552 0.00124579 1 0 1 1 0 0 +EDGE2 7516 7457 0.971947 0.0763262 0.0140424 1 0 1 1 0 0 +EDGE2 7517 7516 -0.99237 0.0134622 0.00232874 1 0 1 1 0 0 +EDGE2 7517 7456 -1.04231 -0.00808362 0.011447 1 0 1 1 0 0 +EDGE2 7517 7457 0.00873099 -0.0545762 0.0257896 1 0 1 1 0 0 +EDGE2 7517 7458 1.05027 -0.0558424 0.0133974 1 0 1 1 0 0 +EDGE2 7518 7517 -0.988587 0.0604829 -0.0182364 1 0 1 1 0 0 +EDGE2 7518 7457 -0.93719 -0.0156585 0.0341771 1 0 1 1 0 0 +EDGE2 7518 7458 -0.0330132 0.0552932 0.00446106 1 0 1 1 0 0 +EDGE2 7518 7459 1.06748 -0.0340094 0.023228 1 0 1 1 0 0 +EDGE2 7519 7458 -1.03953 -0.0472802 -0.00612641 1 0 1 1 0 0 +EDGE2 7519 7518 -0.9332 -0.0747384 0.00527888 1 0 1 1 0 0 +EDGE2 7519 7459 -0.0317088 -0.0108 -0.00601067 1 0 1 1 0 0 +EDGE2 7519 7380 0.971562 0.0935714 -3.12689 1 0 1 1 0 0 +EDGE2 7519 7460 0.939712 -0.0421886 0.0226109 1 0 1 1 0 0 +EDGE2 7520 7459 -1.05701 0.0734269 -0.0046076 1 0 1 1 0 0 +EDGE2 7520 7519 -0.931292 -0.0623992 -0.015994 1 0 1 1 0 0 +EDGE2 7520 7381 0.043431 1.08111 1.52816 1 0 1 1 0 0 +EDGE2 7520 7461 -0.0281861 0.973682 1.58945 1 0 1 1 0 0 +EDGE2 7520 7380 0.0223979 -0.0381856 -3.11009 1 0 1 1 0 0 +EDGE2 7520 7460 0.0210724 0.0276414 -0.0331039 1 0 1 1 0 0 +EDGE2 7520 7379 1.07004 0.0498515 -3.11687 1 0 1 1 0 0 +EDGE2 7521 7520 -1.01395 -0.00462724 1.57486 1 0 1 1 0 0 +EDGE2 7521 7380 -0.896126 0.0100728 -1.61178 1 0 1 1 0 0 +EDGE2 7521 7460 -1.00074 -0.0180664 1.55856 1 0 1 1 0 0 +EDGE2 7522 7521 -0.986785 0.0304751 -0.00360129 1 0 1 1 0 0 +EDGE2 7523 7522 -1.14276 0.0193496 0.00974776 1 0 1 1 0 0 +EDGE2 7524 7523 -0.918127 -0.0428916 -0.0161206 1 0 1 1 0 0 +EDGE2 7524 7285 1.00219 0.00735451 -3.1339 1 0 1 1 0 0 +EDGE2 7524 7325 0.98191 0.0118974 -3.14391 1 0 1 1 0 0 +EDGE2 7524 7345 1.02212 0.0657386 -3.1224 1 0 1 1 0 0 +EDGE2 7524 7365 1.03944 -0.0788038 -3.12079 1 0 1 1 0 0 +EDGE2 7524 7305 0.948129 0.0299217 -3.1401 1 0 1 1 0 0 +EDGE2 7524 7185 0.881981 -0.0111134 -3.15317 1 0 1 1 0 0 +EDGE2 7525 7326 -0.00224048 -1.04456 -1.55778 1 0 1 1 0 0 +EDGE2 7525 7346 0.0143432 -1.036 -1.56354 1 0 1 1 0 0 +EDGE2 7525 7286 -0.00368185 -0.939245 -1.58894 1 0 1 1 0 0 +EDGE2 7525 7306 0.0642671 -0.97257 -1.51417 1 0 1 1 0 0 +EDGE2 7525 7524 -0.998689 -0.00420738 0.00567713 1 0 1 1 0 0 +EDGE2 7525 7285 0.0958542 -0.00982548 -3.12817 1 0 1 1 0 0 +EDGE2 7525 7325 -0.0556585 0.0592284 -3.11102 1 0 1 1 0 0 +EDGE2 7525 7345 -0.0291952 -0.0522557 -3.14827 1 0 1 1 0 0 +EDGE2 7525 7365 0.0162307 -0.0377949 -3.1227 1 0 1 1 0 0 +EDGE2 7525 7305 0.103623 -0.0222759 -3.15322 1 0 1 1 0 0 +EDGE2 7525 7366 0.0479685 0.957195 1.54963 1 0 1 1 0 0 +EDGE2 7525 7185 0.00438547 0.0718195 -3.13821 1 0 1 1 0 0 +EDGE2 7525 7186 0.0315647 0.979586 1.58703 1 0 1 1 0 0 +EDGE2 7525 7304 0.976106 0.00559103 -3.13377 1 0 1 1 0 0 +EDGE2 7525 7344 1.00326 -0.0219122 -3.14266 1 0 1 1 0 0 +EDGE2 7525 7364 0.926802 -0.0936412 -3.17359 1 0 1 1 0 0 +EDGE2 7525 7324 1.01914 0.0571174 -3.13821 1 0 1 1 0 0 +EDGE2 7525 7184 1.05488 0.0783584 -3.13546 1 0 1 1 0 0 +EDGE2 7525 7284 1.03802 0.133023 -3.137 1 0 1 1 0 0 +EDGE2 7526 7326 0.0880386 0.00393889 0.00682829 1 0 1 1 0 0 +EDGE2 7526 7307 1.05663 0.0473242 -0.0496966 1 0 1 1 0 0 +EDGE2 7526 7327 1.06832 0.136772 0.0170952 1 0 1 1 0 0 +EDGE2 7526 7347 1.03641 0.0536129 -0.00474478 1 0 1 1 0 0 +EDGE2 7526 7287 0.926506 -0.00547919 -0.0340863 1 0 1 1 0 0 +EDGE2 7526 7346 -0.000910386 -0.0122248 0.00846389 1 0 1 1 0 0 +EDGE2 7526 7286 0.0179162 0.0579766 0.00653499 1 0 1 1 0 0 +EDGE2 7526 7306 0.045188 -0.0382234 0.0083242 1 0 1 1 0 0 +EDGE2 7526 7525 -0.994961 -0.0560913 1.53228 1 0 1 1 0 0 +EDGE2 7526 7285 -0.948069 -0.00795642 -1.57218 1 0 1 1 0 0 +EDGE2 7526 7325 -0.939998 -0.0998412 -1.61692 1 0 1 1 0 0 +EDGE2 7526 7345 -0.985671 0.00677871 -1.59024 1 0 1 1 0 0 +EDGE2 7526 7365 -1.03602 -0.00547154 -1.5689 1 0 1 1 0 0 +EDGE2 7526 7305 -0.994015 0.0247924 -1.56365 1 0 1 1 0 0 +EDGE2 7526 7185 -0.972421 0.0632478 -1.5437 1 0 1 1 0 0 +EDGE2 7527 7326 -1.03771 -0.0401413 0.00322834 1 0 1 1 0 0 +EDGE2 7527 7308 0.988806 0.068938 -0.00563363 1 0 1 1 0 0 +EDGE2 7527 7348 1.0926 -0.0250385 -0.0139457 1 0 1 1 0 0 +EDGE2 7527 7328 0.960546 -0.0226587 0.0138995 1 0 1 1 0 0 +EDGE2 7527 7288 1.00176 -0.0201612 0.0225778 1 0 1 1 0 0 +EDGE2 7527 7307 -0.0375463 0.0321874 0.0221125 1 0 1 1 0 0 +EDGE2 7527 7327 -0.0253263 -0.0198735 0.0148754 1 0 1 1 0 0 +EDGE2 7527 7347 -0.0132872 0.0632888 0.00714094 1 0 1 1 0 0 +EDGE2 7527 7287 -0.0331798 0.0496906 0.0152938 1 0 1 1 0 0 +EDGE2 7527 7526 -1.04055 0.0629669 -0.0135346 1 0 1 1 0 0 +EDGE2 7527 7346 -0.993645 0.0164959 0.0256713 1 0 1 1 0 0 +EDGE2 7527 7286 -1.00402 0.0205522 -0.00488914 1 0 1 1 0 0 +EDGE2 7527 7306 -1.02471 -0.0256046 -0.0275561 1 0 1 1 0 0 +EDGE2 7528 7329 0.996602 0.00366603 0.00231994 1 0 1 1 0 0 +EDGE2 7528 7349 0.966885 0.0687393 0.000554028 1 0 1 1 0 0 +EDGE2 7528 7289 0.954981 0.0458477 -0.0131978 1 0 1 1 0 0 +EDGE2 7528 7309 0.909459 -0.0440378 -0.00147829 1 0 1 1 0 0 +EDGE2 7528 7527 -1.01477 0.0132542 0.000516446 1 0 1 1 0 0 +EDGE2 7528 7308 -0.0909658 -0.0295186 -0.00192113 1 0 1 1 0 0 +EDGE2 7528 7348 0.145511 -0.0526553 -0.00487056 1 0 1 1 0 0 +EDGE2 7528 7328 -0.0711012 0.0527255 -0.00632991 1 0 1 1 0 0 +EDGE2 7528 7288 0.0906228 0.0581758 0.025706 1 0 1 1 0 0 +EDGE2 7528 7307 -1.03289 0.0200045 0.0275358 1 0 1 1 0 0 +EDGE2 7528 7327 -1.00432 -0.0627746 0.0122488 1 0 1 1 0 0 +EDGE2 7528 7347 -0.98629 0.00842132 -0.0269798 1 0 1 1 0 0 +EDGE2 7528 7287 -1.12534 0.0925738 -0.0121875 1 0 1 1 0 0 +EDGE2 7529 7310 1.05847 0.0425121 -0.000283454 1 0 1 1 0 0 +EDGE2 7529 7350 1.00254 0.0210185 0.00653459 1 0 1 1 0 0 +EDGE2 7529 7450 0.948486 -0.0391122 -3.14751 1 0 1 1 0 0 +EDGE2 7529 7510 1.04411 0.020219 -3.1503 1 0 1 1 0 0 +EDGE2 7529 7330 0.985175 0.00296562 -0.0154184 1 0 1 1 0 0 +EDGE2 7529 7170 0.989863 0.0269121 -3.12964 1 0 1 1 0 0 +EDGE2 7529 7290 1.05763 -0.0015695 0.00291121 1 0 1 1 0 0 +EDGE2 7529 7329 0.0478069 -0.0568585 -0.00577229 1 0 1 1 0 0 +EDGE2 7529 7349 -0.00604862 0.0284556 -0.00831967 1 0 1 1 0 0 +EDGE2 7529 7289 0.00591457 0.00779623 -0.00240152 1 0 1 1 0 0 +EDGE2 7529 7309 0.0497912 -0.0310739 0.0162368 1 0 1 1 0 0 +EDGE2 7529 7308 -1.0013 -0.0288492 0.0135176 1 0 1 1 0 0 +EDGE2 7529 7348 -0.938551 -0.0400112 -0.0116668 1 0 1 1 0 0 +EDGE2 7529 7528 -0.930683 0.045537 0.00374512 1 0 1 1 0 0 +EDGE2 7529 7328 -0.963692 -0.043851 -0.0245965 1 0 1 1 0 0 +EDGE2 7529 7288 -1.02117 0.0479365 -0.0282741 1 0 1 1 0 0 +EDGE2 7530 7449 0.926847 0.0361105 -3.13961 1 0 1 1 0 0 +EDGE2 7530 7509 1.07307 -0.0208055 -3.14269 1 0 1 1 0 0 +EDGE2 7530 7169 1.02979 -0.0214056 -3.10308 1 0 1 1 0 0 +EDGE2 7530 7511 0.0921941 -1.0081 -1.59392 1 0 1 1 0 0 +EDGE2 7530 7451 0.051991 -0.981818 -1.58134 1 0 1 1 0 0 +EDGE2 7530 7310 -0.0130148 0.00560438 -0.0091501 1 0 1 1 0 0 +EDGE2 7530 7350 -0.103028 -0.0425104 0.0174715 1 0 1 1 0 0 +EDGE2 7530 7450 -0.0362129 0.0190036 -3.14884 1 0 1 1 0 0 +EDGE2 7530 7510 0.0215275 0.0842346 -3.13713 1 0 1 1 0 0 +EDGE2 7530 7330 -0.00103504 0.0204421 0.0526532 1 0 1 1 0 0 +EDGE2 7530 7170 -0.0931613 -0.0328105 -3.12857 1 0 1 1 0 0 +EDGE2 7530 7290 -0.057429 0.00745822 0.0284524 1 0 1 1 0 0 +EDGE2 7530 7329 -0.943633 0.0232586 -0.0394014 1 0 1 1 0 0 +EDGE2 7530 7529 -1.05891 -0.0127056 -0.00407667 1 0 1 1 0 0 +EDGE2 7530 7349 -0.973731 -0.0238916 -0.00304013 1 0 1 1 0 0 +EDGE2 7530 7289 -1.03886 -0.0350367 0.0328565 1 0 1 1 0 0 +EDGE2 7530 7309 -0.989927 -0.111798 0.0144922 1 0 1 1 0 0 +EDGE2 7530 7291 -0.0211893 0.99469 1.57265 1 0 1 1 0 0 +EDGE2 7530 7331 -0.0489715 0.945088 1.57882 1 0 1 1 0 0 +EDGE2 7530 7351 0.00538673 1.04765 1.57824 1 0 1 1 0 0 +EDGE2 7530 7311 -0.0556848 0.947373 1.54004 1 0 1 1 0 0 +EDGE2 7530 7171 -0.0317799 0.93301 1.57236 1 0 1 1 0 0 +EDGE2 7531 7530 -1.10633 0.0405008 1.55832 1 0 1 1 0 0 +EDGE2 7531 7512 0.987158 0.0107816 0.00668034 1 0 1 1 0 0 +EDGE2 7531 7511 0.0566333 -0.0242658 -0.0154429 1 0 1 1 0 0 +EDGE2 7531 7452 0.977234 0.0418672 -0.00537546 1 0 1 1 0 0 +EDGE2 7531 7451 0.0108552 -0.0173075 -0.00247681 1 0 1 1 0 0 +EDGE2 7531 7310 -0.964967 -0.0191919 1.56521 1 0 1 1 0 0 +EDGE2 7531 7350 -1.01441 0.0802902 1.57567 1 0 1 1 0 0 +EDGE2 7531 7450 -1.0622 -0.00449229 -1.58163 1 0 1 1 0 0 +EDGE2 7531 7510 -0.97983 -0.0617341 -1.57719 1 0 1 1 0 0 +EDGE2 7531 7330 -1.02691 0.042254 1.5657 1 0 1 1 0 0 +EDGE2 7531 7170 -0.997668 -0.00535552 -1.60888 1 0 1 1 0 0 +EDGE2 7531 7290 -0.904001 -0.0243027 1.56543 1 0 1 1 0 0 +EDGE2 7532 7512 0.0153778 -0.0107614 0.00292912 1 0 1 1 0 0 +EDGE2 7532 7513 1.0309 0.0401574 0.0262606 1 0 1 1 0 0 +EDGE2 7532 7453 0.932833 -0.00522989 -0.00790505 1 0 1 1 0 0 +EDGE2 7532 7511 -0.96626 -0.00707997 0.0260076 1 0 1 1 0 0 +EDGE2 7532 7452 0.0112429 -0.0108293 -0.0104558 1 0 1 1 0 0 +EDGE2 7532 7531 -1.04675 0.0726516 0.000490324 1 0 1 1 0 0 +EDGE2 7532 7451 -0.884988 0.0772615 0.00596012 1 0 1 1 0 0 +EDGE2 7533 7514 0.955369 -0.0234291 0.000361965 1 0 1 1 0 0 +EDGE2 7533 7512 -0.929244 -0.0109896 0.0165982 1 0 1 1 0 0 +EDGE2 7533 7513 0.0170219 0.00404703 0.002768 1 0 1 1 0 0 +EDGE2 7533 7454 0.957025 -0.0844574 -0.00618406 1 0 1 1 0 0 +EDGE2 7533 7453 -0.0550629 -0.0197615 -0.029387 1 0 1 1 0 0 +EDGE2 7533 7532 -0.94819 -0.0763883 0.0295898 1 0 1 1 0 0 +EDGE2 7533 7452 -1.05486 0.0470772 0.00570041 1 0 1 1 0 0 +EDGE2 7534 7455 0.989424 -0.0388033 -0.0042629 1 0 1 1 0 0 +EDGE2 7534 7475 1.03211 -0.110929 -3.11039 1 0 1 1 0 0 +EDGE2 7534 7515 1.01936 7.87221e-05 -0.00607792 1 0 1 1 0 0 +EDGE2 7534 7395 1.0462 0.0503453 -3.12681 1 0 1 1 0 0 +EDGE2 7534 7514 0.000356844 0.0160199 0.0251896 1 0 1 1 0 0 +EDGE2 7534 7513 -1.00482 -0.0365471 0.0219159 1 0 1 1 0 0 +EDGE2 7534 7454 -0.000601621 0.0358651 -0.0178755 1 0 1 1 0 0 +EDGE2 7534 7533 -0.929766 -0.0200371 0.0262362 1 0 1 1 0 0 +EDGE2 7534 7453 -0.94004 -0.00092174 0.0469088 1 0 1 1 0 0 +EDGE2 7535 7476 -0.0976892 1.04041 1.55842 1 0 1 1 0 0 +EDGE2 7535 7396 -0.0940928 1.00322 1.61484 1 0 1 1 0 0 +EDGE2 7535 7394 1.06897 0.0787003 -3.15702 1 0 1 1 0 0 +EDGE2 7535 7474 1.02438 -0.0679988 -3.18094 1 0 1 1 0 0 +EDGE2 7535 7455 -0.0378985 0.0393383 -0.0130778 1 0 1 1 0 0 +EDGE2 7535 7475 0.0110767 -0.0897728 -3.14078 1 0 1 1 0 0 +EDGE2 7535 7515 0.0666646 0.0556962 0.0192866 1 0 1 1 0 0 +EDGE2 7535 7395 -0.0108874 0.094968 -3.14036 1 0 1 1 0 0 +EDGE2 7535 7516 0.00540912 -1.01222 -1.5648 1 0 1 1 0 0 +EDGE2 7535 7456 0.0728016 -1.05117 -1.57828 1 0 1 1 0 0 +EDGE2 7535 7514 -0.998512 0.0891118 0.00251809 1 0 1 1 0 0 +EDGE2 7535 7534 -1.03805 0.0707604 0.00708209 1 0 1 1 0 0 +EDGE2 7535 7454 -1.00299 0.0048631 -0.0138979 1 0 1 1 0 0 +EDGE2 7536 7535 -0.938758 0.0125085 1.57096 1 0 1 1 0 0 +EDGE2 7536 7455 -1.08662 -0.0536868 1.53725 1 0 1 1 0 0 +EDGE2 7536 7475 -0.94879 0.017465 -1.5663 1 0 1 1 0 0 +EDGE2 7536 7515 -1.0789 -0.0264715 1.57834 1 0 1 1 0 0 +EDGE2 7536 7395 -0.981172 0.0494329 -1.58005 1 0 1 1 0 0 +EDGE2 7536 7516 0.0436717 -0.0159179 0.0254776 1 0 1 1 0 0 +EDGE2 7536 7456 -0.050754 -0.0313855 -0.00580897 1 0 1 1 0 0 +EDGE2 7536 7517 0.997312 0.0516001 0.0147028 1 0 1 1 0 0 +EDGE2 7536 7457 0.959294 0.0067466 0.0140573 1 0 1 1 0 0 +EDGE2 7537 7516 -0.97033 0.00110466 0.0198659 1 0 1 1 0 0 +EDGE2 7537 7536 -0.942456 0.00332047 0.00683525 1 0 1 1 0 0 +EDGE2 7537 7456 -1.06792 0.0199003 -0.0101691 1 0 1 1 0 0 +EDGE2 7537 7517 0.050711 -0.0515519 -0.0202018 1 0 1 1 0 0 +EDGE2 7537 7457 0.0337144 0.00394251 0.0143853 1 0 1 1 0 0 +EDGE2 7537 7458 1.08333 -0.0187239 -0.00322492 1 0 1 1 0 0 +EDGE2 7537 7518 1.04333 0.0056962 -0.00904569 1 0 1 1 0 0 +EDGE2 7538 7537 -1.00526 -0.0541947 0.00516356 1 0 1 1 0 0 +EDGE2 7538 7517 -1.02076 -0.0235385 -0.0117278 1 0 1 1 0 0 +EDGE2 7538 7457 -0.993295 0.0470638 -0.0184694 1 0 1 1 0 0 +EDGE2 7538 7458 0.0224837 0.0137903 -0.0216465 1 0 1 1 0 0 +EDGE2 7538 7518 0.0367338 0.0660984 0.00131469 1 0 1 1 0 0 +EDGE2 7538 7459 0.983636 0.0264369 -0.00561561 1 0 1 1 0 0 +EDGE2 7538 7519 0.96785 0.0586821 0.0136681 1 0 1 1 0 0 +EDGE2 7539 7520 1.00523 0.0433738 0.0173702 1 0 1 1 0 0 +EDGE2 7539 7458 -1.06444 -0.0508146 -0.00565565 1 0 1 1 0 0 +EDGE2 7539 7538 -0.985089 0.0829127 -0.010893 1 0 1 1 0 0 +EDGE2 7539 7518 -1.00514 0.0209195 -0.0223043 1 0 1 1 0 0 +EDGE2 7539 7459 -0.0100294 -0.0128004 0.0053174 1 0 1 1 0 0 +EDGE2 7539 7519 -0.0459515 0.106704 -0.0233203 1 0 1 1 0 0 +EDGE2 7539 7380 0.932144 0.0155782 -3.09292 1 0 1 1 0 0 +EDGE2 7539 7460 0.952504 -0.0621438 -0.0050626 1 0 1 1 0 0 +EDGE2 7540 7520 -0.0603819 -0.0459101 0.0134051 1 0 1 1 0 0 +EDGE2 7540 7539 -1.00225 -0.0545959 0.0260224 1 0 1 1 0 0 +EDGE2 7540 7459 -1.03225 -0.00581453 -0.00712915 1 0 1 1 0 0 +EDGE2 7540 7519 -1.01137 0.0199513 0.00512559 1 0 1 1 0 0 +EDGE2 7540 7381 0.0477221 1.07842 1.55413 1 0 1 1 0 0 +EDGE2 7540 7461 0.0463606 0.942716 1.58093 1 0 1 1 0 0 +EDGE2 7540 7380 -0.0317214 0.0590612 -3.14849 1 0 1 1 0 0 +EDGE2 7540 7460 0.0303684 -0.0363591 0.0192192 1 0 1 1 0 0 +EDGE2 7540 7521 -0.0393543 -1.03636 -1.58426 1 0 1 1 0 0 +EDGE2 7540 7379 1.05052 -0.0134315 -3.14576 1 0 1 1 0 0 +EDGE2 7541 7520 -1.01671 0.0325525 -1.56426 1 0 1 1 0 0 +EDGE2 7541 7540 -1.04227 0.0399156 -1.60619 1 0 1 1 0 0 +EDGE2 7541 7382 0.979797 0.00420611 -0.00860207 1 0 1 1 0 0 +EDGE2 7541 7462 1.02308 -0.00655222 -0.00286137 1 0 1 1 0 0 +EDGE2 7541 7381 0.0387916 0.0351095 0.00491785 1 0 1 1 0 0 +EDGE2 7541 7461 -0.00580812 -0.052351 -0.0246796 1 0 1 1 0 0 +EDGE2 7541 7380 -1.01057 -0.0525706 1.58269 1 0 1 1 0 0 +EDGE2 7541 7460 -1.03082 -0.048815 -1.55527 1 0 1 1 0 0 +EDGE2 7542 7463 0.978586 -0.0305002 -0.000449039 1 0 1 1 0 0 +EDGE2 7542 7383 1.05927 0.00610992 -0.0433116 1 0 1 1 0 0 +EDGE2 7542 7382 -0.0144815 0.00691979 -0.0161778 1 0 1 1 0 0 +EDGE2 7542 7462 -0.0133057 -0.113306 0.0222945 1 0 1 1 0 0 +EDGE2 7542 7381 -0.976715 -0.0543245 0.0102063 1 0 1 1 0 0 +EDGE2 7542 7461 -0.982732 -0.0891692 -0.00440198 1 0 1 1 0 0 +EDGE2 7542 7541 -1.12299 -0.0323359 -0.00623987 1 0 1 1 0 0 +EDGE2 7543 7463 -0.0367809 -0.0627843 0.00629722 1 0 1 1 0 0 +EDGE2 7543 7464 0.981149 -0.0142469 0.0233463 1 0 1 1 0 0 +EDGE2 7543 7384 0.96836 -0.0242017 -0.0240294 1 0 1 1 0 0 +EDGE2 7543 7542 -1.01775 -0.0218361 -0.0213835 1 0 1 1 0 0 +EDGE2 7543 7383 0.0485078 0.0347956 -0.0160996 1 0 1 1 0 0 +EDGE2 7543 7382 -1.00849 -0.0632791 0.00593092 1 0 1 1 0 0 +EDGE2 7543 7462 -0.978414 0.0152962 -0.0114758 1 0 1 1 0 0 +EDGE2 7544 7463 -0.983531 -0.0649999 0.0195318 1 0 1 1 0 0 +EDGE2 7544 7465 1.07969 0.0751406 -0.0255103 1 0 1 1 0 0 +EDGE2 7544 7385 1.00251 0.0259959 0.0171164 1 0 1 1 0 0 +EDGE2 7544 7464 0.0866582 0.00656348 -0.00040222 1 0 1 1 0 0 +EDGE2 7544 7384 -0.0490457 0.065789 -0.000930316 1 0 1 1 0 0 +EDGE2 7544 7543 -0.911544 0.0443391 -0.0176232 1 0 1 1 0 0 +EDGE2 7544 7383 -1.03203 0.00667719 0.0018449 1 0 1 1 0 0 +EDGE2 7545 7466 -0.0286662 0.995041 1.62548 1 0 1 1 0 0 +EDGE2 7545 7386 0.0415255 0.911054 1.58668 1 0 1 1 0 0 +EDGE2 7545 7544 -0.983025 0.00138737 -0.0112843 1 0 1 1 0 0 +EDGE2 7545 7465 -0.0451767 0.040349 -0.00978302 1 0 1 1 0 0 +EDGE2 7545 7385 0.0205095 -0.0107534 -0.0197089 1 0 1 1 0 0 +EDGE2 7545 7464 -0.881167 0.0570981 0.00319788 1 0 1 1 0 0 +EDGE2 7545 7384 -0.928983 0.0475561 0.00482836 1 0 1 1 0 0 +EDGE2 7546 7467 0.995451 -0.00944718 0.0133258 1 0 1 1 0 0 +EDGE2 7546 7387 0.950437 -0.0258716 0.00578964 1 0 1 1 0 0 +EDGE2 7546 7466 -0.0200092 -0.0589683 0.00107113 1 0 1 1 0 0 +EDGE2 7546 7386 -0.0420755 0.0638181 -0.0168322 1 0 1 1 0 0 +EDGE2 7546 7465 -0.97828 0.0538481 -1.56723 1 0 1 1 0 0 +EDGE2 7546 7545 -1.0046 -0.13882 -1.5676 1 0 1 1 0 0 +EDGE2 7546 7385 -1.00969 0.0572464 -1.5947 1 0 1 1 0 0 +EDGE2 7547 7468 1.06037 -0.00207434 -0.0271841 1 0 1 1 0 0 +EDGE2 7547 7388 0.987866 -0.0270903 -0.0188472 1 0 1 1 0 0 +EDGE2 7547 7467 -0.0193661 -0.0612986 -0.0155096 1 0 1 1 0 0 +EDGE2 7547 7387 -0.0106079 0.0386547 0.0152323 1 0 1 1 0 0 +EDGE2 7547 7466 -0.95786 0.0427955 0.00718026 1 0 1 1 0 0 +EDGE2 7547 7546 -1.00634 -0.116262 0.0188784 1 0 1 1 0 0 +EDGE2 7547 7386 -1.05507 -0.0127067 -0.0358023 1 0 1 1 0 0 +EDGE2 7548 7389 0.986623 0.00638004 0.0326392 1 0 1 1 0 0 +EDGE2 7548 7469 1.02268 0.0664867 -0.0118941 1 0 1 1 0 0 +EDGE2 7548 7468 -0.0954885 0.0523971 -0.0148553 1 0 1 1 0 0 +EDGE2 7548 7388 0.0479126 -0.0129459 -0.0123155 1 0 1 1 0 0 +EDGE2 7548 7467 -1.02096 0.0740396 0.0168848 1 0 1 1 0 0 +EDGE2 7548 7547 -0.957832 0.0818547 -0.0223269 1 0 1 1 0 0 +EDGE2 7548 7387 -1.00149 -0.0532244 -0.0132286 1 0 1 1 0 0 +EDGE2 7549 7470 0.971969 0.013677 -0.0147917 1 0 1 1 0 0 +EDGE2 7549 7390 0.969516 0.0352989 0.00295014 1 0 1 1 0 0 +EDGE2 7549 7389 0.0551335 -0.0514971 -0.039569 1 0 1 1 0 0 +EDGE2 7549 7469 -0.00128929 -0.0474233 -0.021039 1 0 1 1 0 0 +EDGE2 7549 7468 -0.9481 -0.0014114 0.011451 1 0 1 1 0 0 +EDGE2 7549 7548 -0.963388 -0.00954504 0.00245908 1 0 1 1 0 0 +EDGE2 7549 7388 -1.06588 -0.0688972 -0.0241517 1 0 1 1 0 0 +EDGE2 7550 7470 -0.0331232 0.126647 0.00395742 1 0 1 1 0 0 +EDGE2 7550 7390 0.0207269 -0.069138 -0.00810426 1 0 1 1 0 0 +EDGE2 7550 7391 0.0711128 0.965321 1.55072 1 0 1 1 0 0 +EDGE2 7550 7471 -0.00488135 1.03391 1.58166 1 0 1 1 0 0 +EDGE2 7550 7389 -0.928761 0.0017381 -0.00723988 1 0 1 1 0 0 +EDGE2 7550 7469 -1.02592 0.0768249 0.0216419 1 0 1 1 0 0 +EDGE2 7550 7549 -1.10209 -0.0472629 0.00749526 1 0 1 1 0 0 +EDGE2 7551 7470 -1.03848 0.0159899 -1.61818 1 0 1 1 0 0 +EDGE2 7551 7550 -1.05701 -0.0129566 -1.58342 1 0 1 1 0 0 +EDGE2 7551 7390 -0.948347 -0.00459994 -1.58098 1 0 1 1 0 0 +EDGE2 7551 7391 0.035239 0.0419812 -0.00815496 1 0 1 1 0 0 +EDGE2 7551 7471 0.0525773 -0.0768354 -0.0184097 1 0 1 1 0 0 +EDGE2 7551 7392 0.95954 0.0371814 0.0171009 1 0 1 1 0 0 +EDGE2 7551 7472 0.976183 -0.0210679 -0.00884503 1 0 1 1 0 0 +EDGE2 7552 7391 -1.00767 0.0320106 0.00472879 1 0 1 1 0 0 +EDGE2 7552 7471 -1.00728 -0.0132194 0.00324335 1 0 1 1 0 0 +EDGE2 7552 7551 -0.97998 -0.00959085 0.060866 1 0 1 1 0 0 +EDGE2 7552 7473 0.994562 0.00946255 0.021266 1 0 1 1 0 0 +EDGE2 7552 7392 -0.00473298 0.0243899 -0.01019 1 0 1 1 0 0 +EDGE2 7552 7472 -0.0774774 -0.125177 0.0024759 1 0 1 1 0 0 +EDGE2 7552 7393 0.987953 -0.0244552 0.00526269 1 0 1 1 0 0 +EDGE2 7553 7552 -0.962358 0.0352813 -0.0165943 1 0 1 1 0 0 +EDGE2 7553 7394 1.00897 -0.0443755 0.0120079 1 0 1 1 0 0 +EDGE2 7553 7473 -0.00675905 -0.0507044 -0.0029251 1 0 1 1 0 0 +EDGE2 7553 7392 -1.07424 -0.0138141 0.00531169 1 0 1 1 0 0 +EDGE2 7553 7472 -1.01339 0.0272337 -0.0132342 1 0 1 1 0 0 +EDGE2 7553 7393 0.0726515 0.070066 0.00103608 1 0 1 1 0 0 +EDGE2 7553 7474 0.947437 -0.0294014 0.0227385 1 0 1 1 0 0 +EDGE2 7554 7394 0.00278699 -0.0519648 0.00839229 1 0 1 1 0 0 +EDGE2 7554 7473 -1.06939 0.113693 -0.000521094 1 0 1 1 0 0 +EDGE2 7554 7553 -0.938854 -0.00469219 -0.00811776 1 0 1 1 0 0 +EDGE2 7554 7393 -0.902607 -0.0865505 -0.0352358 1 0 1 1 0 0 +EDGE2 7554 7474 -0.0647404 -0.00566872 0.0263989 1 0 1 1 0 0 +EDGE2 7554 7535 0.995128 0.00841284 -3.12953 1 0 1 1 0 0 +EDGE2 7554 7455 0.97132 -0.0163659 -3.18307 1 0 1 1 0 0 +EDGE2 7554 7475 1.05895 0.0512306 -0.00767867 1 0 1 1 0 0 +EDGE2 7554 7515 0.957605 0.105115 -3.13975 1 0 1 1 0 0 +EDGE2 7554 7395 1.05289 -0.0205677 0.0259092 1 0 1 1 0 0 +EDGE2 7555 7476 -0.0469674 -1.0929 -1.56561 1 0 1 1 0 0 +EDGE2 7555 7396 0.0515554 -1.00174 -1.59629 1 0 1 1 0 0 +EDGE2 7555 7394 -0.94423 0.0312175 -0.014954 1 0 1 1 0 0 +EDGE2 7555 7554 -0.94944 0.0380694 -0.0179061 1 0 1 1 0 0 +EDGE2 7555 7474 -0.942999 -0.0567402 -0.00409055 1 0 1 1 0 0 +EDGE2 7555 7535 0.0645165 0.00350791 -3.16074 1 0 1 1 0 0 +EDGE2 7555 7455 0.0963503 0.010091 -3.15064 1 0 1 1 0 0 +EDGE2 7555 7475 0.0164755 0.0515849 -0.0123746 1 0 1 1 0 0 +EDGE2 7555 7515 -0.0315621 -0.0208294 -3.13582 1 0 1 1 0 0 +EDGE2 7555 7395 -0.0291743 0.0540753 -0.0139349 1 0 1 1 0 0 +EDGE2 7555 7516 -0.0537535 1.00872 1.53756 1 0 1 1 0 0 +EDGE2 7555 7536 -0.0101414 0.969928 1.57132 1 0 1 1 0 0 +EDGE2 7555 7456 -0.0554497 1.02495 1.5593 1 0 1 1 0 0 +EDGE2 7555 7514 0.993301 0.0166824 -3.14241 1 0 1 1 0 0 +EDGE2 7555 7534 0.973903 0.00667301 -3.1638 1 0 1 1 0 0 +EDGE2 7555 7454 0.997322 -0.00985812 -3.10652 1 0 1 1 0 0 +EDGE2 7556 7537 0.980707 -0.0252271 0.0141546 1 0 1 1 0 0 +EDGE2 7556 7535 -0.91137 -0.0109 1.57381 1 0 1 1 0 0 +EDGE2 7556 7555 -0.94014 -0.0834771 -1.57875 1 0 1 1 0 0 +EDGE2 7556 7455 -0.992592 0.0478991 1.60919 1 0 1 1 0 0 +EDGE2 7556 7475 -1.07623 0.0711315 -1.58075 1 0 1 1 0 0 +EDGE2 7556 7515 -1.11552 -0.0418876 1.587 1 0 1 1 0 0 +EDGE2 7556 7395 -1.01122 0.0195595 -1.56169 1 0 1 1 0 0 +EDGE2 7556 7516 0.0401419 -0.0184553 -0.00638819 1 0 1 1 0 0 +EDGE2 7556 7536 -0.0788302 -0.137977 -0.0333742 1 0 1 1 0 0 +EDGE2 7556 7456 0.0369286 -0.0536165 0.0292803 1 0 1 1 0 0 +EDGE2 7556 7517 0.8982 0.0647863 -0.0300738 1 0 1 1 0 0 +EDGE2 7556 7457 1.03569 0.00907948 0.0256038 1 0 1 1 0 0 +EDGE2 7557 7537 -0.00724845 0.00435332 -0.0156731 1 0 1 1 0 0 +EDGE2 7557 7516 -0.982566 0.0293209 -0.0265368 1 0 1 1 0 0 +EDGE2 7557 7536 -0.970961 0.00691281 9.29118e-05 1 0 1 1 0 0 +EDGE2 7557 7556 -0.967315 0.010392 0.00309709 1 0 1 1 0 0 +EDGE2 7557 7456 -1.00993 0.0404322 0.00432938 1 0 1 1 0 0 +EDGE2 7557 7517 0.108959 -0.00673389 -0.00981089 1 0 1 1 0 0 +EDGE2 7557 7457 0.0787924 -0.0653127 0.0266171 1 0 1 1 0 0 +EDGE2 7557 7458 0.947074 0.0124552 -0.000712867 1 0 1 1 0 0 +EDGE2 7557 7538 1.01891 0.0194074 0.0269338 1 0 1 1 0 0 +EDGE2 7557 7518 1.08508 -0.0155049 0.0186762 1 0 1 1 0 0 +EDGE2 7558 7537 -1.02007 0.0210939 -0.00373424 1 0 1 1 0 0 +EDGE2 7558 7557 -0.951085 -0.00373434 0.0221032 1 0 1 1 0 0 +EDGE2 7558 7517 -0.984348 0.0283307 -0.00229461 1 0 1 1 0 0 +EDGE2 7558 7457 -1.00058 -0.017053 -0.00298744 1 0 1 1 0 0 +EDGE2 7558 7539 1.01037 -0.050363 -0.00304692 1 0 1 1 0 0 +EDGE2 7558 7458 0.0391881 -0.0161777 0.0174449 1 0 1 1 0 0 +EDGE2 7558 7538 -0.0150291 0.0353032 -0.0210289 1 0 1 1 0 0 +EDGE2 7558 7518 0.0444762 0.0368733 0.0178404 1 0 1 1 0 0 +EDGE2 7558 7459 0.962358 0.0680608 0.0252547 1 0 1 1 0 0 +EDGE2 7558 7519 1.08165 -0.0185434 0.0068936 1 0 1 1 0 0 +EDGE2 7559 7520 0.996554 0.00222509 0.0252919 1 0 1 1 0 0 +EDGE2 7559 7539 0.0366358 0.0333422 -0.0381759 1 0 1 1 0 0 +EDGE2 7559 7458 -1.05374 0.0299071 -3.4767e-05 1 0 1 1 0 0 +EDGE2 7559 7538 -1.08346 0.0117249 -0.00268606 1 0 1 1 0 0 +EDGE2 7559 7558 -0.897711 0.0261689 -0.0101715 1 0 1 1 0 0 +EDGE2 7559 7518 -1.05092 -0.0748629 0.00829883 1 0 1 1 0 0 +EDGE2 7559 7459 -0.041008 0.0223063 -0.0213112 1 0 1 1 0 0 +EDGE2 7559 7519 0.0193261 0.0181395 0.00493665 1 0 1 1 0 0 +EDGE2 7559 7540 0.945245 -0.0222421 0.00317239 1 0 1 1 0 0 +EDGE2 7559 7380 1.00945 0.0404802 -3.15117 1 0 1 1 0 0 +EDGE2 7559 7460 1.15149 0.0260896 -0.000340934 1 0 1 1 0 0 +EDGE2 7560 7520 0.0195118 0.0818529 -0.00322098 1 0 1 1 0 0 +EDGE2 7560 7539 -0.971508 -0.000715809 0.0271969 1 0 1 1 0 0 +EDGE2 7560 7559 -0.925665 -0.024249 -0.00133782 1 0 1 1 0 0 +EDGE2 7560 7459 -0.948784 0.0601527 -0.0108545 1 0 1 1 0 0 +EDGE2 7560 7519 -1.04926 0.0227946 -0.0201698 1 0 1 1 0 0 +EDGE2 7560 7540 -0.0112316 0.0220232 -0.0100158 1 0 1 1 0 0 +EDGE2 7560 7381 0.00160594 0.981912 1.60346 1 0 1 1 0 0 +EDGE2 7560 7461 0.0347019 1.08817 1.59441 1 0 1 1 0 0 +EDGE2 7560 7541 -0.0646574 1.0283 1.58583 1 0 1 1 0 0 +EDGE2 7560 7380 -0.0560777 -0.0180182 -3.12279 1 0 1 1 0 0 +EDGE2 7560 7460 -0.0091141 0.00789537 -0.0328085 1 0 1 1 0 0 +EDGE2 7560 7521 -0.0586111 -0.964511 -1.60997 1 0 1 1 0 0 +EDGE2 7560 7379 0.95949 -0.0198794 -3.13365 1 0 1 1 0 0 +EDGE2 7561 7520 -0.986909 -0.00635328 -1.59375 1 0 1 1 0 0 +EDGE2 7561 7540 -1.0567 -0.0241067 -1.55413 1 0 1 1 0 0 +EDGE2 7561 7542 1.09825 0.0074845 0.0298726 1 0 1 1 0 0 +EDGE2 7561 7382 0.98668 0.0256656 0.0252376 1 0 1 1 0 0 +EDGE2 7561 7462 1.03319 0.0540032 0.0136505 1 0 1 1 0 0 +EDGE2 7561 7381 0.0528345 -0.0344926 -0.0104991 1 0 1 1 0 0 +EDGE2 7561 7461 -0.014152 -0.0442279 0.0292868 1 0 1 1 0 0 +EDGE2 7561 7541 -0.0296811 -0.00324864 0.000835849 1 0 1 1 0 0 +EDGE2 7561 7560 -1.06509 0.0461697 -1.57987 1 0 1 1 0 0 +EDGE2 7561 7380 -1.00589 -0.0769352 1.56707 1 0 1 1 0 0 +EDGE2 7561 7460 -0.973244 -0.0637769 -1.53264 1 0 1 1 0 0 +EDGE2 7562 7463 0.945929 -0.0282625 0.026934 1 0 1 1 0 0 +EDGE2 7562 7543 1.0771 0.0275736 0.0147807 1 0 1 1 0 0 +EDGE2 7562 7561 -1.01002 -0.137541 0.0156302 1 0 1 1 0 0 +EDGE2 7562 7542 0.0325908 0.0333818 -0.0106369 1 0 1 1 0 0 +EDGE2 7562 7383 0.906625 0.00185344 -0.0183265 1 0 1 1 0 0 +EDGE2 7562 7382 0.0348518 0.0139581 -0.00223202 1 0 1 1 0 0 +EDGE2 7562 7462 -0.0579945 -0.0184896 0.0136455 1 0 1 1 0 0 +EDGE2 7562 7381 -0.980797 -0.0133776 0.00897377 1 0 1 1 0 0 +EDGE2 7562 7461 -1.02191 -0.0491875 -0.0416732 1 0 1 1 0 0 +EDGE2 7562 7541 -0.940278 0.0660987 -0.0289924 1 0 1 1 0 0 +EDGE2 7563 7463 -0.0100186 -0.0126575 -0.00316733 1 0 1 1 0 0 +EDGE2 7563 7544 0.838365 0.057234 0.0596094 1 0 1 1 0 0 +EDGE2 7563 7464 0.964375 -0.0494355 0.00742629 1 0 1 1 0 0 +EDGE2 7563 7384 1.04633 0.00274815 0.00521209 1 0 1 1 0 0 +EDGE2 7563 7543 0.0241643 -0.0732569 -0.015667 1 0 1 1 0 0 +EDGE2 7563 7542 -0.952383 -0.00312754 -0.00174701 1 0 1 1 0 0 +EDGE2 7563 7383 0.0225777 0.0153736 0.0229928 1 0 1 1 0 0 +EDGE2 7563 7562 -0.984139 -0.0325658 0.01972 1 0 1 1 0 0 +EDGE2 7563 7382 -1.01509 -0.0340919 0.00194784 1 0 1 1 0 0 +EDGE2 7563 7462 -1.07685 0.0383044 0.0108843 1 0 1 1 0 0 +EDGE2 7564 7463 -0.954713 0.0294569 0.0100302 1 0 1 1 0 0 +EDGE2 7564 7544 -0.102423 0.0941851 0.00356432 1 0 1 1 0 0 +EDGE2 7564 7465 0.956224 0.00593118 0.0321411 1 0 1 1 0 0 +EDGE2 7564 7545 1.03388 -0.0401484 -0.00197047 1 0 1 1 0 0 +EDGE2 7564 7385 1.065 -0.0286649 -0.0276818 1 0 1 1 0 0 +EDGE2 7564 7464 -0.0725298 -0.0278675 -0.0442188 1 0 1 1 0 0 +EDGE2 7564 7384 -0.0352843 -0.0446474 0.0257602 1 0 1 1 0 0 +EDGE2 7564 7563 -1.01125 -0.0197638 0.00386137 1 0 1 1 0 0 +EDGE2 7564 7543 -0.997987 -0.0817589 -0.00681918 1 0 1 1 0 0 +EDGE2 7564 7383 -0.930711 0.0105039 0.0217063 1 0 1 1 0 0 +EDGE2 7565 7466 -0.0356829 0.936337 1.57472 1 0 1 1 0 0 +EDGE2 7565 7546 -0.00682374 0.988007 1.59096 1 0 1 1 0 0 +EDGE2 7565 7386 -0.00927964 0.952752 1.53931 1 0 1 1 0 0 +EDGE2 7565 7544 -0.955687 0.0444857 -0.0216927 1 0 1 1 0 0 +EDGE2 7565 7465 -0.0174868 -0.0282627 0.000179069 1 0 1 1 0 0 +EDGE2 7565 7545 0.0742481 -0.0281805 0.00229023 1 0 1 1 0 0 +EDGE2 7565 7385 7.76058e-05 0.0704123 -0.00352883 1 0 1 1 0 0 +EDGE2 7565 7564 -1.02058 0.00357892 -0.00520687 1 0 1 1 0 0 +EDGE2 7565 7464 -1.01751 0.0728724 -0.00288039 1 0 1 1 0 0 +EDGE2 7565 7384 -1.04188 -0.0243056 -0.00835209 1 0 1 1 0 0 +EDGE2 7566 7467 1.05726 0.0390714 0.0193396 1 0 1 1 0 0 +EDGE2 7566 7547 1.01937 0.0114605 -0.00614423 1 0 1 1 0 0 +EDGE2 7566 7387 0.93399 -0.0440787 -0.0169005 1 0 1 1 0 0 +EDGE2 7566 7466 -0.0560235 -0.0032838 -0.00191176 1 0 1 1 0 0 +EDGE2 7566 7546 -0.0274251 0.000109549 0.0241502 1 0 1 1 0 0 +EDGE2 7566 7386 -0.00389202 0.0114376 -0.0194565 1 0 1 1 0 0 +EDGE2 7566 7465 -1.00067 -0.0797709 -1.57211 1 0 1 1 0 0 +EDGE2 7566 7565 -0.994863 0.0108216 -1.58069 1 0 1 1 0 0 +EDGE2 7566 7545 -1.0486 -0.13068 -1.57105 1 0 1 1 0 0 +EDGE2 7566 7385 -0.9972 0.0254903 -1.56901 1 0 1 1 0 0 +EDGE2 7567 7468 0.938054 0.0641004 -0.0332485 1 0 1 1 0 0 +EDGE2 7567 7548 0.984706 -0.0773277 0.00594254 1 0 1 1 0 0 +EDGE2 7567 7388 1.01817 0.0209387 -0.0452736 1 0 1 1 0 0 +EDGE2 7567 7467 0.0443268 0.00998353 0.0316775 1 0 1 1 0 0 +EDGE2 7567 7547 -0.0140324 0.039811 -0.0641186 1 0 1 1 0 0 +EDGE2 7567 7387 -0.00245698 -0.0223403 -0.0192535 1 0 1 1 0 0 +EDGE2 7567 7466 -0.99997 -0.0657534 0.020999 1 0 1 1 0 0 +EDGE2 7567 7546 -1.05752 0.00665585 -0.00236582 1 0 1 1 0 0 +EDGE2 7567 7566 -0.987014 -0.0340844 -0.00218322 1 0 1 1 0 0 +EDGE2 7567 7386 -1.00922 -0.0556859 0.00424987 1 0 1 1 0 0 +EDGE2 7568 7389 0.983927 0.0339845 -0.0182124 1 0 1 1 0 0 +EDGE2 7568 7469 0.951985 -0.0632899 0.0251033 1 0 1 1 0 0 +EDGE2 7568 7549 0.942212 0.0213713 -0.0071616 1 0 1 1 0 0 +EDGE2 7568 7468 -0.0196296 -0.143523 0.0602515 1 0 1 1 0 0 +EDGE2 7568 7548 -0.0121771 -0.0699967 -0.00780514 1 0 1 1 0 0 +EDGE2 7568 7388 0.0455798 -0.0324488 0.00579368 1 0 1 1 0 0 +EDGE2 7568 7467 -1.01907 0.0304433 -0.000427117 1 0 1 1 0 0 +EDGE2 7568 7547 -0.935822 0.0221634 0.000587113 1 0 1 1 0 0 +EDGE2 7568 7567 -1.01157 -0.012949 -0.0352953 1 0 1 1 0 0 +EDGE2 7568 7387 -1.03676 0.0225158 0.0098105 1 0 1 1 0 0 +EDGE2 7569 7470 0.983144 0.00949048 -0.0162106 1 0 1 1 0 0 +EDGE2 7569 7550 1.06412 -0.00344942 -0.00133574 1 0 1 1 0 0 +EDGE2 7569 7390 0.984442 -0.023354 0.00754278 1 0 1 1 0 0 +EDGE2 7569 7389 0.0249201 0.0378252 -0.0109148 1 0 1 1 0 0 +EDGE2 7569 7469 -0.0013513 0.0131991 0.00117092 1 0 1 1 0 0 +EDGE2 7569 7549 0.0516238 0.0240797 0.0051326 1 0 1 1 0 0 +EDGE2 7569 7468 -0.914322 -0.0359106 0.0102139 1 0 1 1 0 0 +EDGE2 7569 7548 -0.942105 -0.0294055 0.00382699 1 0 1 1 0 0 +EDGE2 7569 7568 -1.04294 -0.0672908 0.00516051 1 0 1 1 0 0 +EDGE2 7569 7388 -0.94976 -0.0210334 -0.00538547 1 0 1 1 0 0 +EDGE2 7570 7470 0.0286405 -0.0183238 0.0263731 1 0 1 1 0 0 +EDGE2 7570 7550 0.00482844 -0.0406669 0.000483426 1 0 1 1 0 0 +EDGE2 7570 7390 -0.0781592 -0.0423919 -0.0106968 1 0 1 1 0 0 +EDGE2 7570 7391 0.0145445 1.02907 1.55683 1 0 1 1 0 0 +EDGE2 7570 7471 -0.033955 0.983525 1.56456 1 0 1 1 0 0 +EDGE2 7570 7551 -0.0949595 1.00089 1.60036 1 0 1 1 0 0 +EDGE2 7570 7569 -0.986634 -0.00108226 0.00617797 1 0 1 1 0 0 +EDGE2 7570 7389 -0.935889 -0.0387156 0.0306973 1 0 1 1 0 0 +EDGE2 7570 7469 -1.01264 -0.0526726 -0.00564556 1 0 1 1 0 0 +EDGE2 7570 7549 -0.937484 -0.00984769 0.0142266 1 0 1 1 0 0 +EDGE2 7571 7552 1.03102 -0.0897148 -0.0174074 1 0 1 1 0 0 +EDGE2 7571 7470 -0.992655 0.0522216 -1.57644 1 0 1 1 0 0 +EDGE2 7571 7550 -1.05972 0.0188409 -1.59356 1 0 1 1 0 0 +EDGE2 7571 7570 -1.02449 -0.0528541 -1.56982 1 0 1 1 0 0 +EDGE2 7571 7390 -1.00628 0.0319134 -1.57551 1 0 1 1 0 0 +EDGE2 7571 7391 -0.044729 -0.0348677 0.020101 1 0 1 1 0 0 +EDGE2 7571 7471 -0.00885537 -0.0284562 0.00774547 1 0 1 1 0 0 +EDGE2 7571 7551 0.0274679 -0.0344994 0.00267929 1 0 1 1 0 0 +EDGE2 7571 7392 0.957683 0.0381605 0.0248752 1 0 1 1 0 0 +EDGE2 7571 7472 1.14667 -0.0257784 -0.0145457 1 0 1 1 0 0 +EDGE2 7572 7552 -0.0512127 -0.0369518 -0.00759026 1 0 1 1 0 0 +EDGE2 7572 7571 -0.964354 0.0379272 0.00342442 1 0 1 1 0 0 +EDGE2 7572 7391 -1.06736 -0.0460888 -0.00703552 1 0 1 1 0 0 +EDGE2 7572 7471 -0.942678 -0.0205833 -0.00612549 1 0 1 1 0 0 +EDGE2 7572 7551 -0.951416 -0.0207428 -0.0210849 1 0 1 1 0 0 +EDGE2 7572 7473 1.04955 0.00677515 -0.012325 1 0 1 1 0 0 +EDGE2 7572 7392 0.00947813 -0.0799994 0.00473177 1 0 1 1 0 0 +EDGE2 7572 7472 -0.0203903 0.00575568 -0.0435554 1 0 1 1 0 0 +EDGE2 7572 7553 0.915763 -0.0225097 -0.0253295 1 0 1 1 0 0 +EDGE2 7572 7393 0.954921 -0.0172114 0.00291096 1 0 1 1 0 0 +EDGE2 7573 7552 -1.00491 -0.0324764 -0.0391587 1 0 1 1 0 0 +EDGE2 7573 7572 -1.00316 -0.0309164 -0.0127797 1 0 1 1 0 0 +EDGE2 7573 7394 0.950692 0.0367083 0.0215978 1 0 1 1 0 0 +EDGE2 7573 7473 0.0235918 0.043767 -0.0343413 1 0 1 1 0 0 +EDGE2 7573 7392 -0.996237 0.00694754 0.00351788 1 0 1 1 0 0 +EDGE2 7573 7472 -0.959988 -0.0406125 -0.0232258 1 0 1 1 0 0 +EDGE2 7573 7553 -0.0420673 0.0226787 0.00551462 1 0 1 1 0 0 +EDGE2 7573 7554 1.00042 0.0457926 0.0123912 1 0 1 1 0 0 +EDGE2 7573 7393 -0.039304 0.0118184 0.0177136 1 0 1 1 0 0 +EDGE2 7573 7474 1.0197 -0.0146788 -0.0208871 1 0 1 1 0 0 +EDGE2 7574 7394 0.00541664 0.00983925 -0.0305671 1 0 1 1 0 0 +EDGE2 7574 7473 -0.964781 0.0234482 -0.0172703 1 0 1 1 0 0 +EDGE2 7574 7573 -0.877018 0.0538792 -0.00782226 1 0 1 1 0 0 +EDGE2 7574 7553 -0.953533 -0.0416838 0.00186656 1 0 1 1 0 0 +EDGE2 7574 7554 0.0279729 -0.0594081 -0.0195505 1 0 1 1 0 0 +EDGE2 7574 7393 -1.05905 0.0572622 0.019426 1 0 1 1 0 0 +EDGE2 7574 7474 -0.0578462 0.0619154 0.00557964 1 0 1 1 0 0 +EDGE2 7574 7535 0.949082 0.00854716 -3.18841 1 0 1 1 0 0 +EDGE2 7574 7555 1.04045 -0.0159632 -0.00489951 1 0 1 1 0 0 +EDGE2 7574 7455 0.906948 0.0411883 -3.13797 1 0 1 1 0 0 +EDGE2 7574 7475 1.00708 -0.037226 -0.000502868 1 0 1 1 0 0 +EDGE2 7574 7515 0.978693 0.0338711 -3.15699 1 0 1 1 0 0 +EDGE2 7574 7395 0.918573 -0.0299207 -0.0155647 1 0 1 1 0 0 +EDGE2 7575 7476 0.0072452 -0.980574 -1.58481 1 0 1 1 0 0 +EDGE2 7575 7396 0.0322494 -0.956043 -1.59232 1 0 1 1 0 0 +EDGE2 7575 7394 -1.01641 0.017352 0.032631 1 0 1 1 0 0 +EDGE2 7575 7554 -0.987305 0.0312887 -0.0322161 1 0 1 1 0 0 +EDGE2 7575 7574 -1.06407 -0.00123119 -0.0154164 1 0 1 1 0 0 +EDGE2 7575 7474 -1.04555 0.0894969 0.00607353 1 0 1 1 0 0 +EDGE2 7575 7535 -0.0351923 0.00204465 -3.11975 1 0 1 1 0 0 +EDGE2 7575 7555 0.0593129 -0.0523347 -0.0177111 1 0 1 1 0 0 +EDGE2 7575 7455 0.0438961 -0.00803822 -3.15511 1 0 1 1 0 0 +EDGE2 7575 7475 0.00908491 -0.0660473 0.00323039 1 0 1 1 0 0 +EDGE2 7575 7515 0.0200778 -0.0111108 -3.15884 1 0 1 1 0 0 +EDGE2 7575 7395 0.0504909 0.0403455 0.00283295 1 0 1 1 0 0 +EDGE2 7575 7516 -0.00226489 0.98276 1.61384 1 0 1 1 0 0 +EDGE2 7575 7536 0.00546074 0.982992 1.54837 1 0 1 1 0 0 +EDGE2 7575 7556 0.0707774 0.99328 1.54525 1 0 1 1 0 0 +EDGE2 7575 7456 -0.0564602 1.04682 1.57194 1 0 1 1 0 0 +EDGE2 7575 7514 0.953391 -0.0173349 -3.11699 1 0 1 1 0 0 +EDGE2 7575 7534 0.962129 -0.0387381 -3.18342 1 0 1 1 0 0 +EDGE2 7575 7454 1.01747 -0.0574334 -3.14172 1 0 1 1 0 0 +EDGE2 7576 7537 1.10026 -0.041901 0.00697004 1 0 1 1 0 0 +EDGE2 7576 7535 -1.01162 0.0235791 1.52242 1 0 1 1 0 0 +EDGE2 7576 7575 -0.99602 0.0274392 -1.53925 1 0 1 1 0 0 +EDGE2 7576 7555 -0.95274 -0.0909787 -1.58506 1 0 1 1 0 0 +EDGE2 7576 7455 -0.934707 -0.00919292 1.59394 1 0 1 1 0 0 +EDGE2 7576 7475 -0.965155 -0.0176589 -1.54928 1 0 1 1 0 0 +EDGE2 7576 7515 -1.03691 0.0127559 1.56282 1 0 1 1 0 0 +EDGE2 7576 7395 -1.09477 0.0730458 -1.5598 1 0 1 1 0 0 +EDGE2 7576 7516 -0.0475554 0.00184305 -0.000121199 1 0 1 1 0 0 +EDGE2 7576 7536 -0.0449644 -0.00777844 0.0158757 1 0 1 1 0 0 +EDGE2 7576 7556 0.0592987 -0.0178205 0.00865866 1 0 1 1 0 0 +EDGE2 7576 7456 0.00464389 -0.0349938 -0.0169856 1 0 1 1 0 0 +EDGE2 7576 7557 0.990111 -0.062389 0.0243108 1 0 1 1 0 0 +EDGE2 7576 7517 0.987508 0.0185345 -0.0194294 1 0 1 1 0 0 +EDGE2 7576 7457 1.0095 0.0437922 -0.0189798 1 0 1 1 0 0 +EDGE2 7577 7537 -0.0648939 0.0537278 0.004947 1 0 1 1 0 0 +EDGE2 7577 7576 -0.953052 0.0296923 0.0105577 1 0 1 1 0 0 +EDGE2 7577 7516 -0.980732 0.0282872 -0.016377 1 0 1 1 0 0 +EDGE2 7577 7536 -0.982445 0.0336453 0.011524 1 0 1 1 0 0 +EDGE2 7577 7556 -0.957193 -0.0305205 -0.0350662 1 0 1 1 0 0 +EDGE2 7577 7456 -1.06356 -0.0679999 0.00288016 1 0 1 1 0 0 +EDGE2 7577 7557 -0.00658731 0.0501665 0.0370923 1 0 1 1 0 0 +EDGE2 7577 7517 0.0272201 -0.0195637 -0.0102854 1 0 1 1 0 0 +EDGE2 7577 7457 0.0405453 0.0480519 0.0133151 1 0 1 1 0 0 +EDGE2 7577 7458 0.949989 0.0609511 -0.00914433 1 0 1 1 0 0 +EDGE2 7577 7538 0.909162 0.0758457 0.0291126 1 0 1 1 0 0 +EDGE2 7577 7558 0.96377 0.0334859 -0.046223 1 0 1 1 0 0 +EDGE2 7577 7518 1.02305 -0.0270408 0.00883771 1 0 1 1 0 0 +EDGE2 7578 7537 -1.05128 -0.120059 -0.0187878 1 0 1 1 0 0 +EDGE2 7578 7577 -0.935181 -0.00174016 0.00794676 1 0 1 1 0 0 +EDGE2 7578 7557 -0.882926 0.0421069 0.00103761 1 0 1 1 0 0 +EDGE2 7578 7517 -1.03139 0.0479995 0.00246552 1 0 1 1 0 0 +EDGE2 7578 7457 -0.93115 0.0113175 0.01243 1 0 1 1 0 0 +EDGE2 7578 7539 1.01008 -0.0235547 -0.0243529 1 0 1 1 0 0 +EDGE2 7578 7458 0.0256329 -0.00056635 -0.0143508 1 0 1 1 0 0 +EDGE2 7578 7538 -0.0536575 -0.00136702 -0.0181702 1 0 1 1 0 0 +EDGE2 7578 7558 -0.0726595 -0.0104017 -0.032785 1 0 1 1 0 0 +EDGE2 7578 7518 -0.0970702 -0.00280766 0.0146728 1 0 1 1 0 0 +EDGE2 7578 7559 1.04683 0.045135 -0.0105221 1 0 1 1 0 0 +EDGE2 7578 7459 0.961015 -0.0343655 -0.0152038 1 0 1 1 0 0 +EDGE2 7578 7519 0.945992 0.0379223 -0.0256612 1 0 1 1 0 0 +EDGE2 7579 7520 0.947424 -0.0141112 -0.0461045 1 0 1 1 0 0 +EDGE2 7579 7539 0.0289773 0.0117177 0.0226545 1 0 1 1 0 0 +EDGE2 7579 7458 -0.977726 -0.106211 -0.0382438 1 0 1 1 0 0 +EDGE2 7579 7538 -0.974345 -0.026275 0.0263011 1 0 1 1 0 0 +EDGE2 7579 7558 -1.00454 0.0731588 0.00644825 1 0 1 1 0 0 +EDGE2 7579 7578 -0.980539 0.0573045 0.00330117 1 0 1 1 0 0 +EDGE2 7579 7518 -0.913159 0.028126 0.0118746 1 0 1 1 0 0 +EDGE2 7579 7559 0.0496286 -0.0329686 -0.00799336 1 0 1 1 0 0 +EDGE2 7579 7459 0.0241313 0.0177849 -0.0185241 1 0 1 1 0 0 +EDGE2 7579 7519 0.00465941 -0.0802001 0.0262243 1 0 1 1 0 0 +EDGE2 7579 7540 1.05776 0.0318245 -0.0087433 1 0 1 1 0 0 +EDGE2 7579 7560 1.04109 -0.0263002 -0.00287152 1 0 1 1 0 0 +EDGE2 7579 7380 0.96718 -0.0891265 -3.19822 1 0 1 1 0 0 +EDGE2 7579 7460 1.03149 0.0422937 0.0122284 1 0 1 1 0 0 +EDGE2 7580 7520 0.11029 0.0673769 -0.00772661 1 0 1 1 0 0 +EDGE2 7580 7539 -1.02853 0.0300899 0.0131053 1 0 1 1 0 0 +EDGE2 7580 7579 -0.99204 -0.00772884 0.0340034 1 0 1 1 0 0 +EDGE2 7580 7559 -0.941471 0.0730958 0.0114039 1 0 1 1 0 0 +EDGE2 7580 7459 -1.01245 -0.0378355 0.0432279 1 0 1 1 0 0 +EDGE2 7580 7519 -1.00204 -0.0910616 0.00399065 1 0 1 1 0 0 +EDGE2 7580 7540 -0.0815236 -0.0756726 -0.00936554 1 0 1 1 0 0 +EDGE2 7580 7561 0.0207196 1.00667 1.52983 1 0 1 1 0 0 +EDGE2 7580 7381 0.0182266 0.965128 1.55405 1 0 1 1 0 0 +EDGE2 7580 7461 -0.0188317 0.882702 1.54822 1 0 1 1 0 0 +EDGE2 7580 7541 0.0376506 0.939513 1.5645 1 0 1 1 0 0 +EDGE2 7580 7560 -0.081344 0.0414675 0.0102804 1 0 1 1 0 0 +EDGE2 7580 7380 -0.0207224 -0.0333912 -3.14947 1 0 1 1 0 0 +EDGE2 7580 7460 0.0702202 -0.0385131 -0.0181774 1 0 1 1 0 0 +EDGE2 7580 7521 0.0609619 -0.987015 -1.54969 1 0 1 1 0 0 +EDGE2 7580 7379 1.07873 0.0444332 -3.12384 1 0 1 1 0 0 +EDGE2 7581 7520 -1.144 -0.00683667 -1.57089 1 0 1 1 0 0 +EDGE2 7581 7540 -1.00313 -0.0806737 -1.55445 1 0 1 1 0 0 +EDGE2 7581 7561 0.0161513 -0.125768 -0.00546935 1 0 1 1 0 0 +EDGE2 7581 7542 1.02691 0.0739786 0.00781492 1 0 1 1 0 0 +EDGE2 7581 7562 1.01932 0.0399965 -0.0176577 1 0 1 1 0 0 +EDGE2 7581 7382 0.971899 0.0990161 0.0167837 1 0 1 1 0 0 +EDGE2 7581 7462 1.0486 -0.0508303 -0.00919719 1 0 1 1 0 0 +EDGE2 7581 7381 -0.0320595 -0.0101104 -0.00339325 1 0 1 1 0 0 +EDGE2 7581 7461 0.0260022 0.0166171 0.0395594 1 0 1 1 0 0 +EDGE2 7581 7541 0.0390226 -0.0542289 0.0180106 1 0 1 1 0 0 +EDGE2 7581 7580 -1.00916 -0.0247362 -1.54439 1 0 1 1 0 0 +EDGE2 7581 7560 -0.985652 -0.115635 -1.57239 1 0 1 1 0 0 +EDGE2 7581 7380 -1.01142 -0.0292725 1.60663 1 0 1 1 0 0 +EDGE2 7581 7460 -0.984681 -0.0165221 -1.56104 1 0 1 1 0 0 +EDGE2 7582 7463 0.96236 -0.0382375 0.00997084 1 0 1 1 0 0 +EDGE2 7582 7563 0.895633 -0.0372199 -0.0217862 1 0 1 1 0 0 +EDGE2 7582 7543 1.04096 -0.0248668 -0.0407837 1 0 1 1 0 0 +EDGE2 7582 7561 -1.10406 0.0788693 0.0114506 1 0 1 1 0 0 +EDGE2 7582 7542 0.0112261 0.0600715 -0.00692115 1 0 1 1 0 0 +EDGE2 7582 7383 1.03178 0.00436385 0.0126333 1 0 1 1 0 0 +EDGE2 7582 7562 -0.0569273 0.0183358 -0.0162776 1 0 1 1 0 0 +EDGE2 7582 7382 0.0184435 0.0323071 -0.025091 1 0 1 1 0 0 +EDGE2 7582 7462 -0.0324288 -0.109356 0.0179452 1 0 1 1 0 0 +EDGE2 7582 7581 -1.06964 0.0153612 -0.0138258 1 0 1 1 0 0 +EDGE2 7582 7381 -1.0401 -0.0501003 0.0122375 1 0 1 1 0 0 +EDGE2 7582 7461 -0.934999 0.00997443 -0.0165666 1 0 1 1 0 0 +EDGE2 7582 7541 -1.00375 -0.109676 0.0172715 1 0 1 1 0 0 +EDGE2 7583 7463 0.055368 0.0338113 -0.00621102 1 0 1 1 0 0 +EDGE2 7583 7544 0.976455 0.000118671 0.000418732 1 0 1 1 0 0 +EDGE2 7583 7564 1.04094 0.0469465 -4.41607e-05 1 0 1 1 0 0 +EDGE2 7583 7464 1.08302 0.0270164 0.00413721 1 0 1 1 0 0 +EDGE2 7583 7384 1.06146 -0.0296877 0.0248454 1 0 1 1 0 0 +EDGE2 7583 7563 -0.0898731 -0.0106986 -0.0233264 1 0 1 1 0 0 +EDGE2 7583 7543 -0.0109393 0.0412241 0.0143351 1 0 1 1 0 0 +EDGE2 7583 7542 -1.06703 0.0297771 0.00289905 1 0 1 1 0 0 +EDGE2 7583 7582 -0.929709 0.00804752 -0.00735113 1 0 1 1 0 0 +EDGE2 7583 7383 -0.0216976 -0.046693 -0.0161094 1 0 1 1 0 0 +EDGE2 7583 7562 -0.972234 0.0130737 -0.0169295 1 0 1 1 0 0 +EDGE2 7583 7382 -1.01704 0.0464533 0.0208388 1 0 1 1 0 0 +EDGE2 7583 7462 -1.02078 0.0495945 -0.00503633 1 0 1 1 0 0 +EDGE2 7584 7463 -1.07626 0.102143 -0.0158738 1 0 1 1 0 0 +EDGE2 7584 7544 0.0380368 -0.0260053 0.00933289 1 0 1 1 0 0 +EDGE2 7584 7465 1.01174 0.0417361 0.0184579 1 0 1 1 0 0 +EDGE2 7584 7565 0.998353 0.015324 0.013643 1 0 1 1 0 0 +EDGE2 7584 7545 1.00117 -0.0312917 0.0384667 1 0 1 1 0 0 +EDGE2 7584 7385 1.03317 -0.0410124 -0.0395004 1 0 1 1 0 0 +EDGE2 7584 7564 -0.0144814 -0.0662246 0.025872 1 0 1 1 0 0 +EDGE2 7584 7464 0.0516884 0.0122636 0.00544122 1 0 1 1 0 0 +EDGE2 7584 7384 -0.065687 0.0918326 -0.0324841 1 0 1 1 0 0 +EDGE2 7584 7563 -0.987969 -0.0297698 -0.0237698 1 0 1 1 0 0 +EDGE2 7584 7583 -0.895988 -0.00285092 -0.0306827 1 0 1 1 0 0 +EDGE2 7584 7543 -1.01757 0.00950242 -0.0534528 1 0 1 1 0 0 +EDGE2 7584 7383 -0.916126 0.0263342 -0.0137987 1 0 1 1 0 0 +EDGE2 7585 7466 -0.0196484 0.970181 1.61798 1 0 1 1 0 0 +EDGE2 7585 7546 0.0149112 0.976997 1.53545 1 0 1 1 0 0 +EDGE2 7585 7566 -0.0372487 0.984447 1.54669 1 0 1 1 0 0 +EDGE2 7585 7386 0.0523953 1.02278 1.56492 1 0 1 1 0 0 +EDGE2 7585 7544 -0.990349 0.0179012 0.0043605 1 0 1 1 0 0 +EDGE2 7585 7465 0.0275088 -0.00322384 -0.0135534 1 0 1 1 0 0 +EDGE2 7585 7565 0.0135905 -0.0568229 -0.0109616 1 0 1 1 0 0 +EDGE2 7585 7545 0.00701411 0.0568203 0.00222683 1 0 1 1 0 0 +EDGE2 7585 7584 -1.06468 0.0264386 -0.00353895 1 0 1 1 0 0 +EDGE2 7585 7385 0.00239595 0.0512802 -0.0341753 1 0 1 1 0 0 +EDGE2 7585 7564 -1.01099 0.0601972 0.0107919 1 0 1 1 0 0 +EDGE2 7585 7464 -0.99313 0.0776841 -0.00280732 1 0 1 1 0 0 +EDGE2 7585 7384 -0.900735 0.0206392 -0.0228644 1 0 1 1 0 0 +EDGE2 7586 7465 -0.931518 0.014323 1.53413 1 0 1 1 0 0 +EDGE2 7586 7565 -1.08781 0.0765272 1.55224 1 0 1 1 0 0 +EDGE2 7586 7585 -1.05772 0.000715728 1.60419 1 0 1 1 0 0 +EDGE2 7586 7545 -1.05117 -0.0488454 1.60324 1 0 1 1 0 0 +EDGE2 7586 7385 -1.05122 0.0305385 1.53379 1 0 1 1 0 0 +EDGE2 7587 7586 -1.03628 0.0363064 -0.0186518 1 0 1 1 0 0 +EDGE2 7588 7587 -1.02098 -0.0252845 0.0215373 1 0 1 1 0 0 +EDGE2 7589 7588 -1.02429 -0.0397623 -0.0146604 1 0 1 1 0 0 +EDGE2 7590 7589 -0.975246 0.0226202 -0.0151543 1 0 1 1 0 0 +EDGE2 7591 7590 -1.045 0.0478534 1.54433 1 0 1 1 0 0 +EDGE2 7592 7591 -1.07723 -0.00162497 0.00592065 1 0 1 1 0 0 +EDGE2 7593 7592 -0.942063 0.0193527 0.00898162 1 0 1 1 0 0 +EDGE2 7594 7593 -1.03708 0.119584 -0.0251247 1 0 1 1 0 0 +EDGE2 7594 7375 0.995297 -0.0182929 -3.11228 1 0 1 1 0 0 +EDGE2 7595 7594 -0.970894 0.0083259 -0.00924911 1 0 1 1 0 0 +EDGE2 7595 7376 0.033146 -0.860462 -1.56048 1 0 1 1 0 0 +EDGE2 7595 7375 0.0546432 -0.0591645 -3.13715 1 0 1 1 0 0 +EDGE2 7595 7374 0.990864 -0.130096 -3.12679 1 0 1 1 0 0 +EDGE2 7596 7375 -1.04543 0.0156891 1.55722 1 0 1 1 0 0 +EDGE2 7596 7595 -1.07504 0.0535042 -1.55561 1 0 1 1 0 0 +EDGE2 7597 7596 -1.06914 -0.00245347 0.00757112 1 0 1 1 0 0 +EDGE2 7598 7597 -1.05441 -0.0202695 -0.00213967 1 0 1 1 0 0 +EDGE2 7599 7598 -1.02363 -0.0558849 -0.0207737 1 0 1 1 0 0 +EDGE2 7600 7599 -0.965334 0.00943863 -0.0120095 1 0 1 1 0 0 +EDGE2 7601 7600 -1.06624 0.00145115 1.54363 1 0 1 1 0 0 +EDGE2 7602 7601 -0.984018 0.0601472 -0.0062585 1 0 1 1 0 0 +EDGE2 7603 7602 -0.935763 0.0161399 -0.0305676 1 0 1 1 0 0 +EDGE2 7604 7603 -0.957182 0.0490393 0.00304448 1 0 1 1 0 0 +EDGE2 7605 7604 -0.961744 0.0670812 -0.0438224 1 0 1 1 0 0 +EDGE2 7606 7605 -1.07485 -0.0231511 -1.5675 1 0 1 1 0 0 +EDGE2 7607 7606 -0.993916 -0.0461874 -0.00979683 1 0 1 1 0 0 +EDGE2 7608 7607 -0.967559 0.0296598 -0.026852 1 0 1 1 0 0 +EDGE2 7609 7608 -0.979864 -0.0196866 0.0427352 1 0 1 1 0 0 +EDGE2 7610 7609 -0.978988 0.0344291 -0.0134732 1 0 1 1 0 0 +EDGE2 7611 7610 -1.00958 -0.066355 -1.56247 1 0 1 1 0 0 +EDGE2 7612 7611 -0.903064 -0.00572682 -0.0166644 1 0 1 1 0 0 +EDGE2 7613 7612 -0.935669 -0.0403932 -0.0190786 1 0 1 1 0 0 +EDGE2 7614 7613 -1.0644 -0.083218 -0.0256736 1 0 1 1 0 0 +EDGE2 7615 7614 -0.95278 -0.00756039 -0.000742325 1 0 1 1 0 0 +EDGE2 7616 7615 -0.970445 -0.043688 -1.56726 1 0 1 1 0 0 +EDGE2 7617 7616 -0.949312 0.0529364 -0.00333922 1 0 1 1 0 0 +EDGE2 7618 7617 -0.98301 0.0569665 0.0350629 1 0 1 1 0 0 +EDGE2 7619 7600 0.980742 0.00533061 -3.1412 1 0 1 1 0 0 +EDGE2 7619 7618 -0.973446 0.0284806 -0.00716511 1 0 1 1 0 0 +EDGE2 7620 7599 0.943879 -0.00446807 -3.13753 1 0 1 1 0 0 +EDGE2 7620 7600 -0.0872049 -0.0217757 -3.1462 1 0 1 1 0 0 +EDGE2 7620 7619 -1.0213 -0.0307399 0.0456589 1 0 1 1 0 0 +EDGE2 7620 7601 -0.0267523 0.985478 1.61708 1 0 1 1 0 0 +EDGE2 7621 7600 -1.00835 0.00151336 1.55737 1 0 1 1 0 0 +EDGE2 7621 7620 -1.02127 -0.0204576 -1.56237 1 0 1 1 0 0 +EDGE2 7621 7602 0.956056 -0.0278823 0.0149401 1 0 1 1 0 0 +EDGE2 7621 7601 -0.0297732 -0.0624316 0.00899577 1 0 1 1 0 0 +EDGE2 7622 7602 -0.00109041 -0.0502857 -0.0215782 1 0 1 1 0 0 +EDGE2 7622 7601 -0.999902 -0.00168592 0.0012047 1 0 1 1 0 0 +EDGE2 7622 7621 -0.915226 -0.0163552 0.000854006 1 0 1 1 0 0 +EDGE2 7622 7603 0.975486 -0.0220251 0.0014637 1 0 1 1 0 0 +EDGE2 7623 7602 -1.00403 0.0272156 -0.02383 1 0 1 1 0 0 +EDGE2 7623 7622 -1.08303 -0.0349042 0.00741458 1 0 1 1 0 0 +EDGE2 7623 7603 -0.0810158 -0.00127992 0.0259797 1 0 1 1 0 0 +EDGE2 7623 7604 1.01985 -0.00522136 -0.0335072 1 0 1 1 0 0 +EDGE2 7624 7603 -0.936693 0.0597055 0.020784 1 0 1 1 0 0 +EDGE2 7624 7623 -0.944971 0.0454887 0.00928967 1 0 1 1 0 0 +EDGE2 7624 7604 -0.0460448 -0.0102741 -0.000783927 1 0 1 1 0 0 +EDGE2 7624 7605 0.952136 0.0121521 0.000716217 1 0 1 1 0 0 +EDGE2 7625 7624 -0.973134 -0.0502048 -0.0107801 1 0 1 1 0 0 +EDGE2 7625 7604 -1.01258 0.0274258 -0.00430572 1 0 1 1 0 0 +EDGE2 7625 7606 -0.0630983 1.05709 1.59414 1 0 1 1 0 0 +EDGE2 7625 7605 -0.0268452 -0.0135761 -0.00935063 1 0 1 1 0 0 +EDGE2 7626 7625 -0.913883 -0.0494957 1.56705 1 0 1 1 0 0 +EDGE2 7626 7605 -0.99951 -0.0842192 1.57875 1 0 1 1 0 0 +EDGE2 7627 7626 -1.01482 -0.101998 -0.00294362 1 0 1 1 0 0 +EDGE2 7628 7627 -1.01187 0.0268844 0.0300085 1 0 1 1 0 0 +EDGE2 7629 7370 0.97863 0.0134016 -3.1226 1 0 1 1 0 0 +EDGE2 7629 7190 0.97651 -0.0433074 -3.16516 1 0 1 1 0 0 +EDGE2 7629 7628 -0.994583 0.00258724 -0.00162698 1 0 1 1 0 0 +EDGE2 7630 7369 1.02168 -0.000787164 -3.18276 1 0 1 1 0 0 +EDGE2 7630 7189 0.937679 0.0825449 -3.12992 1 0 1 1 0 0 +EDGE2 7630 7370 -0.043238 -0.0521915 -3.16691 1 0 1 1 0 0 +EDGE2 7630 7371 0.0133106 -0.946467 -1.59694 1 0 1 1 0 0 +EDGE2 7630 7190 0.0525038 -0.0045742 -3.15895 1 0 1 1 0 0 +EDGE2 7630 7629 -1.11606 -0.0111418 0.0267348 1 0 1 1 0 0 +EDGE2 7630 7191 0.0176589 1.05181 1.55298 1 0 1 1 0 0 +EDGE2 7631 7370 -1.04209 0.0209783 -1.56003 1 0 1 1 0 0 +EDGE2 7631 7372 0.976747 -0.0327184 -0.0182908 1 0 1 1 0 0 +EDGE2 7631 7371 0.0314501 -0.0638881 0.017786 1 0 1 1 0 0 +EDGE2 7631 7630 -1.02808 0.00148422 1.61501 1 0 1 1 0 0 +EDGE2 7631 7190 -0.88134 -0.0301445 -1.58791 1 0 1 1 0 0 +EDGE2 7632 7373 1.01527 -0.0132033 -0.00510325 1 0 1 1 0 0 +EDGE2 7632 7631 -1.07778 -0.056485 0.0383488 1 0 1 1 0 0 +EDGE2 7632 7372 -0.000791947 -0.0309149 0.00587743 1 0 1 1 0 0 +EDGE2 7632 7371 -0.937763 -0.0755957 0.00131517 1 0 1 1 0 0 +EDGE2 7633 7374 0.923891 -0.0224906 0.0451883 1 0 1 1 0 0 +EDGE2 7633 7373 -0.0112613 -0.00246759 0.0282748 1 0 1 1 0 0 +EDGE2 7633 7372 -0.971176 0.00935412 -0.0101783 1 0 1 1 0 0 +EDGE2 7633 7632 -1.05177 0.0534933 -0.00388629 1 0 1 1 0 0 +EDGE2 7634 7375 1.01491 0.0196326 0.0156671 1 0 1 1 0 0 +EDGE2 7634 7595 1.00041 0.0227413 -3.13552 1 0 1 1 0 0 +EDGE2 7634 7374 -0.0844636 -0.0156494 -0.0105146 1 0 1 1 0 0 +EDGE2 7634 7373 -0.993036 -0.0165646 0.00665774 1 0 1 1 0 0 +EDGE2 7634 7633 -0.940714 0.0264179 0.0268777 1 0 1 1 0 0 +EDGE2 7635 7594 0.968211 0.00395031 -3.14195 1 0 1 1 0 0 +EDGE2 7635 7376 -0.0467803 0.99187 1.5657 1 0 1 1 0 0 +EDGE2 7635 7596 -0.0869019 -0.989841 -1.56529 1 0 1 1 0 0 +EDGE2 7635 7375 -0.0192977 0.053506 -0.00619238 1 0 1 1 0 0 +EDGE2 7635 7595 0.0548123 0.0193611 -3.14113 1 0 1 1 0 0 +EDGE2 7635 7634 -0.954111 -0.052202 -0.00424214 1 0 1 1 0 0 +EDGE2 7635 7374 -1.03494 0.0120742 0.021427 1 0 1 1 0 0 +EDGE2 7636 7596 -0.00237743 0.0395097 -0.0263112 1 0 1 1 0 0 +EDGE2 7636 7375 -1.02914 -0.112468 1.5612 1 0 1 1 0 0 +EDGE2 7636 7595 -1.05872 0.078294 -1.56704 1 0 1 1 0 0 +EDGE2 7636 7635 -1.08679 0.0198616 1.56627 1 0 1 1 0 0 +EDGE2 7636 7597 0.938833 -0.026741 0.00229021 1 0 1 1 0 0 +EDGE2 7637 7596 -0.953147 -0.027022 0.0257012 1 0 1 1 0 0 +EDGE2 7637 7636 -0.952641 -0.0231422 -0.0015416 1 0 1 1 0 0 +EDGE2 7637 7597 0.012731 0.0946443 -0.0130114 1 0 1 1 0 0 +EDGE2 7637 7598 1.04621 -0.0249052 0.0136427 1 0 1 1 0 0 +EDGE2 7638 7597 -0.98854 -0.0267542 -0.0317157 1 0 1 1 0 0 +EDGE2 7638 7637 -0.972718 0.0749373 -0.0244425 1 0 1 1 0 0 +EDGE2 7638 7598 -0.0328039 0.0735137 0.0229188 1 0 1 1 0 0 +EDGE2 7638 7599 0.969346 -0.0189583 -0.0103997 1 0 1 1 0 0 +EDGE2 7639 7638 -0.992004 0.0114358 0.0226311 1 0 1 1 0 0 +EDGE2 7639 7598 -0.933326 -0.0288549 0.0207104 1 0 1 1 0 0 +EDGE2 7639 7599 -0.0199287 0.0609845 0.0199497 1 0 1 1 0 0 +EDGE2 7639 7600 0.941648 -0.0241324 0.011455 1 0 1 1 0 0 +EDGE2 7639 7620 1.02268 -0.0602966 -3.1661 1 0 1 1 0 0 +EDGE2 7640 7639 -0.941271 0.0295078 0.00942691 1 0 1 1 0 0 +EDGE2 7640 7599 -0.928726 0.0260937 -0.0169057 1 0 1 1 0 0 +EDGE2 7640 7600 0.111947 -0.0214875 0.0320076 1 0 1 1 0 0 +EDGE2 7640 7620 0.0927497 0.0208246 -3.11819 1 0 1 1 0 0 +EDGE2 7640 7619 1.11024 0.0176599 -3.14103 1 0 1 1 0 0 +EDGE2 7640 7601 0.023197 -0.958692 -1.58661 1 0 1 1 0 0 +EDGE2 7640 7621 -0.0331252 -1.02721 -1.54691 1 0 1 1 0 0 +EDGE2 7641 7600 -1.00865 0.10994 -1.60736 1 0 1 1 0 0 +EDGE2 7641 7640 -0.955965 -0.0481801 -1.55121 1 0 1 1 0 0 +EDGE2 7641 7620 -1.01159 -0.00399136 1.56692 1 0 1 1 0 0 +EDGE2 7642 7641 -0.9876 0.00144366 -0.0160954 1 0 1 1 0 0 +EDGE2 7643 7642 -0.980482 -0.0498906 0.028872 1 0 1 1 0 0 +EDGE2 7644 7643 -0.958591 -0.0234323 0.0136217 1 0 1 1 0 0 +EDGE2 7645 7644 -1.00076 -0.0466427 -0.014135 1 0 1 1 0 0 +EDGE2 7646 7645 -1.01029 0.0579536 1.55587 1 0 1 1 0 0 +EDGE2 7647 7646 -0.995185 -0.0249348 0.0304577 1 0 1 1 0 0 +EDGE2 7648 7647 -0.95813 -0.0492409 -0.0337741 1 0 1 1 0 0 +EDGE2 7649 7648 -0.989923 0.052787 0.0136476 1 0 1 1 0 0 +EDGE2 7650 7649 -0.993747 0.0964339 -0.0208617 1 0 1 1 0 0 +EDGE2 7651 7650 -0.992979 -1.15577e-05 -1.56121 1 0 1 1 0 0 +EDGE2 7652 7651 -0.974913 -0.0292856 -0.00968415 1 0 1 1 0 0 +EDGE2 7653 7652 -1.0195 0.0113618 -0.00254018 1 0 1 1 0 0 +EDGE2 7654 7653 -0.992604 0.0150698 -0.0331273 1 0 1 1 0 0 +EDGE2 7655 7654 -1.0545 -0.000241092 -0.0196502 1 0 1 1 0 0 +EDGE2 7656 7655 -0.945166 -0.0448567 1.57737 1 0 1 1 0 0 +EDGE2 7657 7656 -1.02491 -0.0360306 0.0160194 1 0 1 1 0 0 +EDGE2 7658 7657 -1.06196 -0.0310257 -0.00141744 1 0 1 1 0 0 +EDGE2 7659 7658 -0.991953 0.0579358 -0.0062787 1 0 1 1 0 0 +EDGE2 7659 6360 0.985226 0.032002 -3.1203 1 0 1 1 0 0 +EDGE2 7660 7659 -1.05566 0.0515491 0.0254965 1 0 1 1 0 0 +EDGE2 7660 6360 0.0308701 0.0784035 -3.14962 1 0 1 1 0 0 +EDGE2 7660 6359 1.13685 0.0165921 -3.16416 1 0 1 1 0 0 +EDGE2 7660 6361 -0.0234362 -0.989149 -1.56595 1 0 1 1 0 0 +EDGE2 7661 7660 -0.980598 -0.0307955 1.52553 1 0 1 1 0 0 +EDGE2 7661 6360 -0.972569 -0.0797293 -1.56134 1 0 1 1 0 0 +EDGE2 7661 6361 -0.0407203 0.0528141 0.0385949 1 0 1 1 0 0 +EDGE2 7661 6362 1.0315 0.0213683 -0.0112574 1 0 1 1 0 0 +EDGE2 7662 6361 -1.08142 -0.0286581 0.00206391 1 0 1 1 0 0 +EDGE2 7662 7661 -1.03371 -0.0412713 -0.00843649 1 0 1 1 0 0 +EDGE2 7662 6362 -0.0119714 0.0643592 0.0192241 1 0 1 1 0 0 +EDGE2 7662 6363 1.05379 -0.100134 -0.040896 1 0 1 1 0 0 +EDGE2 7663 6362 -1.05646 0.0450209 0.0177328 1 0 1 1 0 0 +EDGE2 7663 7662 -0.993158 0.0118097 -0.0117039 1 0 1 1 0 0 +EDGE2 7663 6363 -0.0357642 0.0382168 0.0138973 1 0 1 1 0 0 +EDGE2 7663 6364 1.03555 -0.0632013 -0.0129444 1 0 1 1 0 0 +EDGE2 7664 6363 -0.98651 -0.0576213 0.00502702 1 0 1 1 0 0 +EDGE2 7664 7663 -0.951235 -0.0410956 0.00898705 1 0 1 1 0 0 +EDGE2 7664 6364 0.0993514 0.06506 -0.0263602 1 0 1 1 0 0 +EDGE2 7664 6365 0.999912 0.0122441 -0.00896125 1 0 1 1 0 0 +EDGE2 7665 6364 -0.965618 0.0371847 -0.0104658 1 0 1 1 0 0 +EDGE2 7665 7664 -0.999048 0.0491001 -0.00957413 1 0 1 1 0 0 +EDGE2 7665 6366 -0.0126367 0.897136 1.55871 1 0 1 1 0 0 +EDGE2 7665 6365 0.0100363 0.0824185 0.0143681 1 0 1 1 0 0 +EDGE2 7666 7665 -1.04945 -0.0107858 -1.58596 1 0 1 1 0 0 +EDGE2 7666 6366 -0.00449757 -0.043045 0.0209419 1 0 1 1 0 0 +EDGE2 7666 6365 -0.979981 -0.096106 -1.56866 1 0 1 1 0 0 +EDGE2 7666 6367 1.07593 0.0418714 0.0396145 1 0 1 1 0 0 +EDGE2 7667 6366 -0.969359 0.0236495 -0.00994078 1 0 1 1 0 0 +EDGE2 7667 7666 -1.02062 0.0233829 -0.0138951 1 0 1 1 0 0 +EDGE2 7667 6367 0.0835166 -0.0213415 0.00924918 1 0 1 1 0 0 +EDGE2 7667 6368 1.05256 0.000956416 -0.0101103 1 0 1 1 0 0 +EDGE2 7668 7667 -1.00376 0.00400519 -0.000718252 1 0 1 1 0 0 +EDGE2 7668 6367 -0.987059 -0.0777795 0.0196086 1 0 1 1 0 0 +EDGE2 7668 6368 -0.00938106 -0.041528 0.00490261 1 0 1 1 0 0 +EDGE2 7668 6369 1.02443 0.105418 -0.0171777 1 0 1 1 0 0 +EDGE2 7669 7668 -0.980991 -0.0883509 -0.00948099 1 0 1 1 0 0 +EDGE2 7669 6368 -0.918264 -0.033825 0.00580037 1 0 1 1 0 0 +EDGE2 7669 6369 -0.0133251 0.0537659 0.00125743 1 0 1 1 0 0 +EDGE2 7669 6370 0.988764 0.0835904 -0.000262444 1 0 1 1 0 0 +EDGE2 7670 7669 -0.981912 0.0302391 -0.00758617 1 0 1 1 0 0 +EDGE2 7670 6369 -0.95629 -0.0454539 0.00523079 1 0 1 1 0 0 +EDGE2 7670 6371 -0.00368345 1.07143 1.53976 1 0 1 1 0 0 +EDGE2 7670 6370 -0.0407601 0.0098845 0.0400333 1 0 1 1 0 0 +EDGE2 7671 6371 -0.0193988 -0.0108727 0.0153235 1 0 1 1 0 0 +EDGE2 7671 6372 1.08067 0.0953129 0.0322219 1 0 1 1 0 0 +EDGE2 7671 6370 -0.990129 -0.0385948 -1.56825 1 0 1 1 0 0 +EDGE2 7671 7670 -0.982446 -0.020322 -1.51754 1 0 1 1 0 0 +EDGE2 7672 6373 0.961239 -0.0195557 -0.0229182 1 0 1 1 0 0 +EDGE2 7672 6371 -0.995222 -0.0218693 0.0247019 1 0 1 1 0 0 +EDGE2 7672 7671 -0.963137 -0.0297736 -0.00389556 1 0 1 1 0 0 +EDGE2 7672 6372 0.0218556 0.0748671 0.00299517 1 0 1 1 0 0 +EDGE2 7673 6374 0.953599 -0.0533542 0.0561734 1 0 1 1 0 0 +EDGE2 7673 6373 -0.00867881 -0.0182445 0.00567389 1 0 1 1 0 0 +EDGE2 7673 7672 -1.06773 -0.00638071 0.0178145 1 0 1 1 0 0 +EDGE2 7673 6372 -1.00588 0.054324 0.00819567 1 0 1 1 0 0 +EDGE2 7674 7673 -1.02568 -0.00554773 -0.0165824 1 0 1 1 0 0 +EDGE2 7674 6355 0.964984 -0.0913254 -3.14658 1 0 1 1 0 0 +EDGE2 7674 6375 1.07006 0.0201353 -0.00747602 1 0 1 1 0 0 +EDGE2 7674 6374 0.0387774 -0.0977528 0.0114374 1 0 1 1 0 0 +EDGE2 7674 6373 -0.973877 0.00411248 -0.0181154 1 0 1 1 0 0 +EDGE2 7675 6356 0.0579849 0.960723 1.56 1 0 1 1 0 0 +EDGE2 7675 6354 0.942408 0.0165488 -3.18496 1 0 1 1 0 0 +EDGE2 7675 7674 -1.03907 0.0312761 0.00360374 1 0 1 1 0 0 +EDGE2 7675 6355 0.0332574 -0.123886 -3.12179 1 0 1 1 0 0 +EDGE2 7675 6375 -0.0273091 -0.00348535 -0.0263966 1 0 1 1 0 0 +EDGE2 7675 6374 -0.963766 0.0111125 0.040317 1 0 1 1 0 0 +EDGE2 7675 6376 0.0347 -1.00537 -1.57412 1 0 1 1 0 0 +EDGE2 7676 6357 1.00742 -0.034892 0.0402414 1 0 1 1 0 0 +EDGE2 7676 6356 0.0741676 -0.0159846 -0.00613883 1 0 1 1 0 0 +EDGE2 7676 7675 -0.930929 0.000611964 -1.59639 1 0 1 1 0 0 +EDGE2 7676 6355 -1.00987 0.00763241 1.6034 1 0 1 1 0 0 +EDGE2 7676 6375 -0.954837 0.012686 -1.56861 1 0 1 1 0 0 +EDGE2 7677 6358 1.07871 -0.0754313 0.00218542 1 0 1 1 0 0 +EDGE2 7677 7676 -0.982999 0.00154815 -0.023683 1 0 1 1 0 0 +EDGE2 7677 6357 -0.0211799 0.0161365 0.0248255 1 0 1 1 0 0 +EDGE2 7677 6356 -1.03084 -0.00136337 -0.0219177 1 0 1 1 0 0 +EDGE2 7678 6359 0.987483 -0.103009 0.0117953 1 0 1 1 0 0 +EDGE2 7678 6358 0.00276803 0.04139 -0.0315898 1 0 1 1 0 0 +EDGE2 7678 6357 -0.976595 -0.00493014 -0.0162391 1 0 1 1 0 0 +EDGE2 7678 7677 -0.985669 -0.125237 0.0227941 1 0 1 1 0 0 +EDGE2 7679 7660 0.996397 -0.0454923 -3.13717 1 0 1 1 0 0 +EDGE2 7679 6360 0.99691 -0.0207649 0.0154067 1 0 1 1 0 0 +EDGE2 7679 7678 -1.01351 0.0262103 0.00939231 1 0 1 1 0 0 +EDGE2 7679 6359 0.0515067 0.0226564 -0.01181 1 0 1 1 0 0 +EDGE2 7679 6358 -1.03567 0.023201 0.0249186 1 0 1 1 0 0 +EDGE2 7680 7659 1.04011 0.00485439 -3.14677 1 0 1 1 0 0 +EDGE2 7680 7660 0.0299882 -0.103938 -3.10033 1 0 1 1 0 0 +EDGE2 7680 6360 -0.107115 0.0676865 0.00157856 1 0 1 1 0 0 +EDGE2 7680 6359 -0.95811 -0.0294868 0.0272448 1 0 1 1 0 0 +EDGE2 7680 7679 -1.00918 -0.0204691 -0.0210449 1 0 1 1 0 0 +EDGE2 7680 6361 -0.0451564 0.98404 1.5902 1 0 1 1 0 0 +EDGE2 7680 7661 -0.015895 0.943938 1.55259 1 0 1 1 0 0 +EDGE2 7681 7660 -1.05574 -0.0104648 1.58961 1 0 1 1 0 0 +EDGE2 7681 7680 -1.01016 -0.0843102 -1.53708 1 0 1 1 0 0 +EDGE2 7681 6360 -1.02579 0.0570816 -1.55613 1 0 1 1 0 0 +EDGE2 7681 6361 -0.0432807 0.0138409 0.00954591 1 0 1 1 0 0 +EDGE2 7681 7661 -0.0289971 0.0419658 0.0480319 1 0 1 1 0 0 +EDGE2 7681 6362 1.00804 -0.00823969 0.00438268 1 0 1 1 0 0 +EDGE2 7681 7662 1.00603 -0.0458894 0.0155747 1 0 1 1 0 0 +EDGE2 7682 6361 -1.01438 -0.0271905 0.0355105 1 0 1 1 0 0 +EDGE2 7682 7661 -1.00889 0.0274545 -0.0149072 1 0 1 1 0 0 +EDGE2 7682 7681 -1.00811 -0.0145986 0.0135016 1 0 1 1 0 0 +EDGE2 7682 6362 0.0428098 0.07283 -0.00729966 1 0 1 1 0 0 +EDGE2 7682 7662 0.0111272 -0.00180128 -0.0380192 1 0 1 1 0 0 +EDGE2 7682 6363 1.0607 -0.0983399 -0.0144315 1 0 1 1 0 0 +EDGE2 7682 7663 1.01084 0.0747451 -0.0076305 1 0 1 1 0 0 +EDGE2 7683 7682 -0.933521 -0.000308358 -0.0128479 1 0 1 1 0 0 +EDGE2 7683 6362 -0.959404 -0.0438282 0.0189871 1 0 1 1 0 0 +EDGE2 7683 7662 -0.913392 -0.0255219 0.0167599 1 0 1 1 0 0 +EDGE2 7683 6363 -0.0726682 0.00729486 -0.0155845 1 0 1 1 0 0 +EDGE2 7683 7663 0.0273994 0.0647864 -0.00624262 1 0 1 1 0 0 +EDGE2 7683 6364 0.976768 0.0232358 -0.013518 1 0 1 1 0 0 +EDGE2 7683 7664 0.964805 -0.0135065 -0.00961703 1 0 1 1 0 0 +EDGE2 7684 7665 0.969316 -0.00882832 0.0315065 1 0 1 1 0 0 +EDGE2 7684 6363 -1.05133 0.102654 0.0436152 1 0 1 1 0 0 +EDGE2 7684 7663 -1.07459 -0.0125376 -0.00404754 1 0 1 1 0 0 +EDGE2 7684 7683 -1.00843 0.0451912 0.00971697 1 0 1 1 0 0 +EDGE2 7684 6364 0.0198466 0.0719925 0.001284 1 0 1 1 0 0 +EDGE2 7684 7664 0.0211975 -0.0372998 0.0099568 1 0 1 1 0 0 +EDGE2 7684 6365 0.944219 0.0205086 -0.0222298 1 0 1 1 0 0 +EDGE2 7685 7665 0.0585163 0.00221211 0.00998142 1 0 1 1 0 0 +EDGE2 7685 7684 -1.01837 0.0393665 0.00276375 1 0 1 1 0 0 +EDGE2 7685 6364 -1.04027 0.0446287 -0.0212856 1 0 1 1 0 0 +EDGE2 7685 7664 -0.964297 -0.000528228 -0.00801613 1 0 1 1 0 0 +EDGE2 7685 6366 -0.0546536 0.965508 1.58322 1 0 1 1 0 0 +EDGE2 7685 6365 0.0439759 0.0629759 0.0163422 1 0 1 1 0 0 +EDGE2 7685 7666 -0.0555528 0.967008 1.59225 1 0 1 1 0 0 +EDGE2 7686 7665 -0.983366 0.0621989 -1.56646 1 0 1 1 0 0 +EDGE2 7686 7685 -1.06006 -0.0441083 -1.56419 1 0 1 1 0 0 +EDGE2 7686 6366 -0.0557462 0.00482818 0.00924836 1 0 1 1 0 0 +EDGE2 7686 6365 -1.02883 -0.0649534 -1.5605 1 0 1 1 0 0 +EDGE2 7686 7666 0.0155806 0.0176677 -0.0333804 1 0 1 1 0 0 +EDGE2 7686 7667 1.00074 0.0784865 -0.000658326 1 0 1 1 0 0 +EDGE2 7686 6367 1.02006 -0.0900361 -0.00730677 1 0 1 1 0 0 +EDGE2 7687 6366 -0.989373 -0.00570785 -0.0139701 1 0 1 1 0 0 +EDGE2 7687 7686 -0.955741 0.0537647 0.0411806 1 0 1 1 0 0 +EDGE2 7687 7666 -0.914778 0.00602185 0.0158099 1 0 1 1 0 0 +EDGE2 7687 7667 0.0429445 -0.0617533 -0.0165091 1 0 1 1 0 0 +EDGE2 7687 6367 -0.035099 0.0413063 -0.00268889 1 0 1 1 0 0 +EDGE2 7687 7668 0.925563 -0.0575024 0.00843365 1 0 1 1 0 0 +EDGE2 7687 6368 0.964986 -0.106605 0.0291853 1 0 1 1 0 0 +EDGE2 7688 7667 -0.999661 0.0246457 -0.00290509 1 0 1 1 0 0 +EDGE2 7688 7687 -0.986869 -0.0501935 0.00476245 1 0 1 1 0 0 +EDGE2 7688 6367 -0.94819 0.0674125 -0.00281064 1 0 1 1 0 0 +EDGE2 7688 7668 0.0222647 0.110607 -0.00411282 1 0 1 1 0 0 +EDGE2 7688 6368 -0.0240368 -0.0529897 -0.00452819 1 0 1 1 0 0 +EDGE2 7688 7669 0.922415 -0.0580651 0.0123523 1 0 1 1 0 0 +EDGE2 7688 6369 1.03153 0.0416782 0.0179379 1 0 1 1 0 0 +EDGE2 7689 7668 -1.00055 0.00106939 -0.00217872 1 0 1 1 0 0 +EDGE2 7689 7688 -1.10961 -0.0596616 0.0264862 1 0 1 1 0 0 +EDGE2 7689 6368 -1.07646 -0.0140805 0.0196083 1 0 1 1 0 0 +EDGE2 7689 7669 -0.00310439 -0.0993548 -0.00360926 1 0 1 1 0 0 +EDGE2 7689 6369 0.00346019 -0.00790744 0.00650462 1 0 1 1 0 0 +EDGE2 7689 6370 1.02655 0.0119099 -0.00122454 1 0 1 1 0 0 +EDGE2 7689 7670 1.00953 0.0227439 0.0171554 1 0 1 1 0 0 +EDGE2 7690 7669 -1.00475 0.0510629 -0.0198558 1 0 1 1 0 0 +EDGE2 7690 7689 -0.912486 -0.0399989 0.004968 1 0 1 1 0 0 +EDGE2 7690 6369 -0.953007 -0.00353515 0.00508696 1 0 1 1 0 0 +EDGE2 7690 6371 0.0434239 1.04884 1.53427 1 0 1 1 0 0 +EDGE2 7690 7671 0.0900413 1.00727 1.58213 1 0 1 1 0 0 +EDGE2 7690 6370 -0.0292116 0.0715546 0.010875 1 0 1 1 0 0 +EDGE2 7690 7670 0.00675786 0.000504513 -0.0047329 1 0 1 1 0 0 +EDGE2 7691 7690 -0.984702 0.0279231 1.58279 1 0 1 1 0 0 +EDGE2 7691 6370 -1.03279 0.0190335 1.59452 1 0 1 1 0 0 +EDGE2 7691 7670 -1.02291 -0.0372868 1.6072 1 0 1 1 0 0 +EDGE2 7692 7691 -1.06197 0.0155334 -0.0300349 1 0 1 1 0 0 +EDGE2 7693 7692 -0.955655 0.00377879 -0.0134242 1 0 1 1 0 0 +EDGE2 7694 7693 -1.03767 0.0280007 -0.0165078 1 0 1 1 0 0 +EDGE2 7695 7694 -0.88587 0.0310084 -0.0360798 1 0 1 1 0 0 +EDGE2 7696 7695 -1.03027 -0.0365373 1.56066 1 0 1 1 0 0 +EDGE2 7697 7696 -0.99418 0.0228172 -0.018529 1 0 1 1 0 0 +EDGE2 7698 7697 -0.916859 -0.0138569 0.00300929 1 0 1 1 0 0 +EDGE2 7699 7698 -0.993921 0.0325946 0.0301985 1 0 1 1 0 0 +EDGE2 7700 7699 -1.01525 0.0944166 0.0251476 1 0 1 1 0 0 +EDGE2 7701 7700 -1.0319 -0.0229553 -1.54533 1 0 1 1 0 0 +EDGE2 7702 7701 -1.02639 0.0403098 -0.00171555 1 0 1 1 0 0 +EDGE2 7703 7702 -0.970983 0.0505588 -0.0118202 1 0 1 1 0 0 +EDGE2 7704 7703 -0.991119 -0.0667184 -0.00810596 1 0 1 1 0 0 +EDGE2 7705 7704 -0.945882 -0.0020353 -0.00776999 1 0 1 1 0 0 +EDGE2 7706 7705 -1.00213 -0.0389188 -1.57685 1 0 1 1 0 0 +EDGE2 7707 7706 -1.00341 0.0607614 -0.0497035 1 0 1 1 0 0 +EDGE2 7708 7707 -1.01238 -0.0248675 0.0230084 1 0 1 1 0 0 +EDGE2 7709 7708 -1.00758 -0.0779934 -0.0443584 1 0 1 1 0 0 +EDGE2 7710 7709 -0.949949 0.0287772 0.0045069 1 0 1 1 0 0 +EDGE2 7711 7710 -1.09539 -0.0227572 -1.56335 1 0 1 1 0 0 +EDGE2 7712 7711 -0.956806 -0.0264431 0.0279557 1 0 1 1 0 0 +EDGE2 7713 7712 -0.983791 -0.0349029 0.023819 1 0 1 1 0 0 +EDGE2 7714 7695 1.05932 -0.00497213 -3.18116 1 0 1 1 0 0 +EDGE2 7714 7713 -0.961091 -0.0375419 -0.0446809 1 0 1 1 0 0 +EDGE2 7715 7696 -0.0238839 1.10093 1.57658 1 0 1 1 0 0 +EDGE2 7715 7694 1.02372 -0.00847375 -3.16412 1 0 1 1 0 0 +EDGE2 7715 7695 0.0490205 0.038591 -3.09272 1 0 1 1 0 0 +EDGE2 7715 7714 -1.05388 0.0199619 0.0283446 1 0 1 1 0 0 +EDGE2 7716 7697 1.07226 -0.124803 0.00952979 1 0 1 1 0 0 +EDGE2 7716 7696 -0.0168861 0.033335 0.019796 1 0 1 1 0 0 +EDGE2 7716 7715 -1.00151 -0.145851 -1.58403 1 0 1 1 0 0 +EDGE2 7716 7695 -0.962289 -0.0562409 1.57007 1 0 1 1 0 0 +EDGE2 7717 7698 0.978549 0.0441708 0.0173657 1 0 1 1 0 0 +EDGE2 7717 7716 -1.0371 0.0362353 -0.0353315 1 0 1 1 0 0 +EDGE2 7717 7697 -0.00369624 -0.037809 0.029486 1 0 1 1 0 0 +EDGE2 7717 7696 -0.99603 0.0422716 0.0130943 1 0 1 1 0 0 +EDGE2 7718 7717 -1.05121 0.102619 -0.00346472 1 0 1 1 0 0 +EDGE2 7718 7699 1.00223 -0.021274 -0.0351447 1 0 1 1 0 0 +EDGE2 7718 7698 -0.0169237 0.040875 0.0195516 1 0 1 1 0 0 +EDGE2 7718 7697 -0.931201 0.0148515 0.00931934 1 0 1 1 0 0 +EDGE2 7719 7699 -0.0775633 0.0337426 -0.00128249 1 0 1 1 0 0 +EDGE2 7719 7700 0.999192 -0.00328989 0.0257461 1 0 1 1 0 0 +EDGE2 7719 7698 -0.909602 -0.0854403 0.0420149 1 0 1 1 0 0 +EDGE2 7719 7718 -0.982383 -0.0742514 0.0138171 1 0 1 1 0 0 +EDGE2 7720 7699 -1.10176 0.0538208 -0.0353182 1 0 1 1 0 0 +EDGE2 7720 7719 -1.09122 0.031901 0.0234186 1 0 1 1 0 0 +EDGE2 7720 7700 -0.0784618 -0.033398 0.00729803 1 0 1 1 0 0 +EDGE2 7720 7701 -0.0519729 0.925 1.55598 1 0 1 1 0 0 +EDGE2 7721 7700 -1.0256 0.00353755 -1.57584 1 0 1 1 0 0 +EDGE2 7721 7720 -0.948627 -0.0703135 -1.56539 1 0 1 1 0 0 +EDGE2 7721 7701 -0.0550409 -0.0172577 0.00984836 1 0 1 1 0 0 +EDGE2 7721 7702 0.937858 -0.0248423 0.0106359 1 0 1 1 0 0 +EDGE2 7722 7701 -0.979609 -0.0662361 0.0214442 1 0 1 1 0 0 +EDGE2 7722 7721 -0.951266 -0.0803201 -0.0293335 1 0 1 1 0 0 +EDGE2 7722 7702 0.0628464 -0.0250796 -0.0148206 1 0 1 1 0 0 +EDGE2 7722 7703 1.08239 -0.0567825 0.0191401 1 0 1 1 0 0 +EDGE2 7723 7722 -1.09971 0.00856957 0.0183698 1 0 1 1 0 0 +EDGE2 7723 7702 -1.01349 -0.0361411 -0.0150056 1 0 1 1 0 0 +EDGE2 7723 7703 0.0284006 0.0061784 -0.00450005 1 0 1 1 0 0 +EDGE2 7723 7704 1.06993 -0.0170924 0.0466194 1 0 1 1 0 0 +EDGE2 7724 7723 -0.937211 0.00429828 -0.0101078 1 0 1 1 0 0 +EDGE2 7724 7703 -1.03373 -0.0391965 0.0343907 1 0 1 1 0 0 +EDGE2 7724 7704 0.0699759 -0.00517051 0.0592447 1 0 1 1 0 0 +EDGE2 7724 7705 1.08829 0.0317709 -0.00771436 1 0 1 1 0 0 +EDGE2 7725 7724 -0.993457 0.00120231 -0.000409947 1 0 1 1 0 0 +EDGE2 7725 7704 -0.985995 0.0732838 -0.0241066 1 0 1 1 0 0 +EDGE2 7725 7705 0.00167922 -0.000764892 -0.015754 1 0 1 1 0 0 +EDGE2 7725 7706 -0.0537273 0.987524 1.51779 1 0 1 1 0 0 +EDGE2 7726 7725 -1.0475 0.102268 1.55696 1 0 1 1 0 0 +EDGE2 7726 7705 -1.01776 -0.0291204 1.58549 1 0 1 1 0 0 +EDGE2 7727 7726 -0.959152 0.0546254 -0.0276064 1 0 1 1 0 0 +EDGE2 7728 7727 -0.967219 0.00455292 0.0328368 1 0 1 1 0 0 +EDGE2 7729 7610 0.975891 0.016299 -3.13707 1 0 1 1 0 0 +EDGE2 7729 7728 -1.0352 -0.0163356 0.00350086 1 0 1 1 0 0 +EDGE2 7730 7611 -0.0129366 -1.00535 -1.58004 1 0 1 1 0 0 +EDGE2 7730 7610 -0.00421042 -0.0479463 -3.12006 1 0 1 1 0 0 +EDGE2 7730 7609 0.904467 -0.0441601 -3.14275 1 0 1 1 0 0 +EDGE2 7730 7729 -1.06409 0.0445207 0.0076089 1 0 1 1 0 0 +EDGE2 7731 7610 -0.985296 0.0160408 1.55532 1 0 1 1 0 0 +EDGE2 7731 7730 -1.00639 -0.0653786 -1.55277 1 0 1 1 0 0 +EDGE2 7732 7731 -0.935674 -0.0394103 -0.0107518 1 0 1 1 0 0 +EDGE2 7733 7732 -1.03238 0.00619497 -0.009304 1 0 1 1 0 0 +EDGE2 7734 7215 0.955476 -0.00902426 -3.14038 1 0 1 1 0 0 +EDGE2 7734 7733 -0.981087 0.0186684 -0.00315327 1 0 1 1 0 0 +EDGE2 7735 7216 0.0425802 -1.0773 -1.59591 1 0 1 1 0 0 +EDGE2 7735 7215 0.0669729 -0.0456 -3.17777 1 0 1 1 0 0 +EDGE2 7735 7734 -0.980683 0.0035927 -0.00579215 1 0 1 1 0 0 +EDGE2 7735 7214 0.97001 0.0188712 -3.16335 1 0 1 1 0 0 +EDGE2 7736 7217 1.02393 0.00758785 0.0114362 1 0 1 1 0 0 +EDGE2 7736 7216 0.000800753 -0.0754476 -0.0304733 1 0 1 1 0 0 +EDGE2 7736 7215 -0.980516 0.0105909 -1.57349 1 0 1 1 0 0 +EDGE2 7736 7735 -0.980438 0.0508008 1.58424 1 0 1 1 0 0 +EDGE2 7737 7217 0.0277366 0.0328534 -0.000651868 1 0 1 1 0 0 +EDGE2 7737 7218 0.964526 0.0166904 -0.02137 1 0 1 1 0 0 +EDGE2 7737 7736 -0.985288 0.00881557 0.0231264 1 0 1 1 0 0 +EDGE2 7737 7216 -0.945628 -0.0601294 0.0079292 1 0 1 1 0 0 +EDGE2 7738 7217 -1.02414 0.114711 0.0510178 1 0 1 1 0 0 +EDGE2 7738 7219 1.05739 -0.0213698 0.00457014 1 0 1 1 0 0 +EDGE2 7738 7737 -1.00679 0.0156731 0.020059 1 0 1 1 0 0 +EDGE2 7738 7218 0.0232126 -0.0820727 0.00497777 1 0 1 1 0 0 +EDGE2 7739 7200 1.03478 -0.0568142 -3.12963 1 0 1 1 0 0 +EDGE2 7739 7220 0.973854 -0.0440149 -0.0261187 1 0 1 1 0 0 +EDGE2 7739 7738 -1.05264 0.0567116 0.0173465 1 0 1 1 0 0 +EDGE2 7739 7219 0.0128699 0.117129 0.00345343 1 0 1 1 0 0 +EDGE2 7739 7218 -0.938747 0.0701328 -0.00766208 1 0 1 1 0 0 +EDGE2 7740 7199 0.945126 0.00235151 -3.12982 1 0 1 1 0 0 +EDGE2 7740 7201 -0.0244965 1.05556 1.5791 1 0 1 1 0 0 +EDGE2 7740 7200 -0.0847867 0.0216112 -3.14034 1 0 1 1 0 0 +EDGE2 7740 7220 -0.0659394 0.0296598 -0.00132334 1 0 1 1 0 0 +EDGE2 7740 7221 -0.0432255 1.01615 1.59727 1 0 1 1 0 0 +EDGE2 7740 7219 -1.09963 0.0306576 0.0173654 1 0 1 1 0 0 +EDGE2 7740 7739 -0.999663 0.085454 -0.0626825 1 0 1 1 0 0 +EDGE2 7741 7201 -0.0349662 0.0525651 0.000380953 1 0 1 1 0 0 +EDGE2 7741 7740 -1.04891 0.0524447 -1.57062 1 0 1 1 0 0 +EDGE2 7741 7200 -1.07853 -0.0210448 1.57815 1 0 1 1 0 0 +EDGE2 7741 7220 -0.889485 -0.021965 -1.56004 1 0 1 1 0 0 +EDGE2 7741 7221 -0.0618782 0.0308517 -0.00437057 1 0 1 1 0 0 +EDGE2 7741 7202 1.09516 0.0270459 0.0162273 1 0 1 1 0 0 +EDGE2 7741 7222 0.955953 0.000879261 0.00387727 1 0 1 1 0 0 +EDGE2 7742 7201 -0.993697 -0.0146225 0.0190616 1 0 1 1 0 0 +EDGE2 7742 7741 -1.02999 -0.0572696 0.00259787 1 0 1 1 0 0 +EDGE2 7742 7221 -0.991922 0.0151276 0.00291763 1 0 1 1 0 0 +EDGE2 7742 7223 1.01818 -0.00806057 -0.0197844 1 0 1 1 0 0 +EDGE2 7742 7202 0.0539103 -0.0399589 0.00333092 1 0 1 1 0 0 +EDGE2 7742 7222 -0.0466987 -0.0185184 -0.0152743 1 0 1 1 0 0 +EDGE2 7742 7203 0.933076 0.0354277 0.00794984 1 0 1 1 0 0 +EDGE2 7743 7204 0.986412 -0.00722769 -0.00738695 1 0 1 1 0 0 +EDGE2 7743 7223 0.119456 0.0468883 -0.0257671 1 0 1 1 0 0 +EDGE2 7743 7202 -0.924437 -0.0293654 0.017961 1 0 1 1 0 0 +EDGE2 7743 7222 -1.0425 0.0164533 0.0225324 1 0 1 1 0 0 +EDGE2 7743 7742 -0.940872 -0.0684073 -0.00920322 1 0 1 1 0 0 +EDGE2 7743 7203 -0.0151527 -0.0574545 0.00457596 1 0 1 1 0 0 +EDGE2 7743 7224 0.971163 0.000386594 -0.000477482 1 0 1 1 0 0 +EDGE2 7744 7204 0.0710053 -0.00639429 -0.00269791 1 0 1 1 0 0 +EDGE2 7744 7223 -1.08053 -0.0375292 0.00358103 1 0 1 1 0 0 +EDGE2 7744 7743 -0.922644 0.106677 0.00315133 1 0 1 1 0 0 +EDGE2 7744 7203 -1.04052 -0.0216436 0.0133596 1 0 1 1 0 0 +EDGE2 7744 7224 0.0496963 0.0510349 -0.00272914 1 0 1 1 0 0 +EDGE2 7744 7205 1.02121 0.0681416 -0.0471002 1 0 1 1 0 0 +EDGE2 7744 7225 0.976381 -0.047598 -0.00920144 1 0 1 1 0 0 +EDGE2 7745 7204 -0.896662 -0.0151732 0.0442462 1 0 1 1 0 0 +EDGE2 7745 7226 -0.0166159 -0.938049 -1.56082 1 0 1 1 0 0 +EDGE2 7745 7744 -1.00667 -0.0403914 0.040984 1 0 1 1 0 0 +EDGE2 7745 7224 -0.980864 0.0625577 -0.000687648 1 0 1 1 0 0 +EDGE2 7745 7205 -0.0330799 -0.0114834 -0.0302124 1 0 1 1 0 0 +EDGE2 7745 7225 0.0562921 0.0782872 -0.0214169 1 0 1 1 0 0 +EDGE2 7745 7206 -0.0675562 1.04301 1.57213 1 0 1 1 0 0 +EDGE2 7746 7227 0.956448 0.00392678 -0.00523105 1 0 1 1 0 0 +EDGE2 7746 7226 -0.0848328 -0.0226848 -0.0239305 1 0 1 1 0 0 +EDGE2 7746 7205 -1.06405 -0.0200186 1.57161 1 0 1 1 0 0 +EDGE2 7746 7225 -0.939512 0.033638 1.56017 1 0 1 1 0 0 +EDGE2 7746 7745 -0.93994 -0.138758 1.56992 1 0 1 1 0 0 +EDGE2 7747 7228 1.00765 0.011649 0.00933032 1 0 1 1 0 0 +EDGE2 7747 7746 -1.02411 -0.0682539 -0.0266673 1 0 1 1 0 0 +EDGE2 7747 7227 -0.030726 0.0206646 0.0235646 1 0 1 1 0 0 +EDGE2 7747 7226 -1.01295 -0.0180274 0.0313005 1 0 1 1 0 0 +EDGE2 7748 7228 -0.0346699 -0.030565 0.0112516 1 0 1 1 0 0 +EDGE2 7748 7229 0.969346 0.0404487 -0.0150337 1 0 1 1 0 0 +EDGE2 7748 7227 -1.00465 0.0652594 0.0187614 1 0 1 1 0 0 +EDGE2 7748 7747 -0.975971 0.0584359 -0.050659 1 0 1 1 0 0 +EDGE2 7749 7228 -0.992449 0.0817644 -0.00564479 1 0 1 1 0 0 +EDGE2 7749 7229 -0.126153 0.00604955 -0.00591708 1 0 1 1 0 0 +EDGE2 7749 7230 0.888431 0.00136279 -0.0180197 1 0 1 1 0 0 +EDGE2 7749 7748 -0.997453 -0.0333757 0.0160575 1 0 1 1 0 0 +EDGE2 7750 7229 -1.06259 -0.0301909 0.0100613 1 0 1 1 0 0 +EDGE2 7750 7749 -1.02765 -0.100769 -0.0188811 1 0 1 1 0 0 +EDGE2 7750 7230 -0.055337 -0.0131728 -0.00908036 1 0 1 1 0 0 +EDGE2 7750 7231 0.00105493 0.978444 1.55693 1 0 1 1 0 0 +EDGE2 7751 7750 -0.995726 0.0525134 -1.58391 1 0 1 1 0 0 +EDGE2 7751 7230 -1.03447 -0.0655615 -1.582 1 0 1 1 0 0 +EDGE2 7751 7231 0.00491112 -0.0390968 0.0154086 1 0 1 1 0 0 +EDGE2 7751 7232 0.997555 -0.0188548 0.00220348 1 0 1 1 0 0 +EDGE2 7752 7233 0.92352 0.0670989 0.00615636 1 0 1 1 0 0 +EDGE2 7752 7231 -0.973577 -0.0329476 -0.00234274 1 0 1 1 0 0 +EDGE2 7752 7751 -1.01351 -0.0884208 -0.025526 1 0 1 1 0 0 +EDGE2 7752 7232 -0.0414516 -0.00435277 0.00865002 1 0 1 1 0 0 +EDGE2 7753 7233 0.0235931 0.0230281 0.0334732 1 0 1 1 0 0 +EDGE2 7753 7752 -0.993544 0.0273405 -0.0326039 1 0 1 1 0 0 +EDGE2 7753 7232 -0.981086 0.0648098 0.0270957 1 0 1 1 0 0 +EDGE2 7753 7234 0.948994 -0.0106095 -0.00259029 1 0 1 1 0 0 +EDGE2 7754 7233 -1.04818 -0.0366526 0.008173 1 0 1 1 0 0 +EDGE2 7754 7753 -0.98207 -0.0225474 -0.0271853 1 0 1 1 0 0 +EDGE2 7754 7234 0.0320033 0.00578054 -0.00627631 1 0 1 1 0 0 +EDGE2 7754 7235 1.00035 0.040384 -0.0398973 1 0 1 1 0 0 +EDGE2 7755 7236 0.00289515 -0.99118 -1.58177 1 0 1 1 0 0 +EDGE2 7755 7234 -1.00423 0.0740581 -0.0169417 1 0 1 1 0 0 +EDGE2 7755 7754 -0.976171 0.0828631 -0.00276979 1 0 1 1 0 0 +EDGE2 7755 7235 -0.0285734 0.0124359 0.012083 1 0 1 1 0 0 +EDGE2 7756 7237 1.00957 -0.0210893 0.00162537 1 0 1 1 0 0 +EDGE2 7756 7236 0.0116677 0.0702848 0.0123585 1 0 1 1 0 0 +EDGE2 7756 7755 -1.10748 0.0818742 1.60451 1 0 1 1 0 0 +EDGE2 7756 7235 -0.920918 0.0252927 1.56663 1 0 1 1 0 0 +EDGE2 7757 7238 1.01188 0.0204669 0.0145711 1 0 1 1 0 0 +EDGE2 7757 7756 -1.00976 -0.0101547 -0.00423232 1 0 1 1 0 0 +EDGE2 7757 7237 -0.0899523 0.0877021 -0.0195091 1 0 1 1 0 0 +EDGE2 7757 7236 -1.10481 -0.0131407 0.0264288 1 0 1 1 0 0 +EDGE2 7758 7239 1.0236 0.0040112 -0.023296 1 0 1 1 0 0 +EDGE2 7758 7757 -0.978133 -0.00325833 0.030209 1 0 1 1 0 0 +EDGE2 7758 7238 -0.0473564 -0.0933543 0.0124448 1 0 1 1 0 0 +EDGE2 7758 7237 -1.01244 0.0613932 0.0394028 1 0 1 1 0 0 +EDGE2 7759 7240 0.955692 -0.00561711 -0.0274491 1 0 1 1 0 0 +EDGE2 7759 7239 -0.04751 -0.030636 0.00351017 1 0 1 1 0 0 +EDGE2 7759 7758 -1.10756 0.104087 0.00252072 1 0 1 1 0 0 +EDGE2 7759 7238 -1.02756 -0.03578 -0.0141186 1 0 1 1 0 0 +EDGE2 7760 7241 0.00578645 -1.02026 -1.57357 1 0 1 1 0 0 +EDGE2 7760 7240 -0.0445502 0.0134599 0.0145591 1 0 1 1 0 0 +EDGE2 7760 7239 -0.982606 -0.00322809 0.00512832 1 0 1 1 0 0 +EDGE2 7760 7759 -1.02736 -0.0323561 -0.0005747 1 0 1 1 0 0 +EDGE2 7761 7240 -1.02957 0.0127637 -1.62007 1 0 1 1 0 0 +EDGE2 7761 7760 -1.00195 -0.0116793 -1.55022 1 0 1 1 0 0 +EDGE2 7762 7761 -1.05057 0.0261924 0.0334135 1 0 1 1 0 0 +EDGE2 7763 7762 -0.99369 0.0909911 -0.0120339 1 0 1 1 0 0 +EDGE2 7764 7045 1.03474 0.0647598 -3.12744 1 0 1 1 0 0 +EDGE2 7764 7763 -0.94981 -0.0199584 -0.0136275 1 0 1 1 0 0 +EDGE2 7764 7005 1.08539 0.00364128 -3.15288 1 0 1 1 0 0 +EDGE2 7764 7025 0.998742 0.02782 -3.18424 1 0 1 1 0 0 +EDGE2 7765 7046 -0.0189703 -1.09811 -1.53849 1 0 1 1 0 0 +EDGE2 7765 7006 -0.0498204 -0.940322 -1.58096 1 0 1 1 0 0 +EDGE2 7765 7026 0.0476848 -0.949726 -1.58117 1 0 1 1 0 0 +EDGE2 7765 7045 0.0516814 -0.0448403 -3.09426 1 0 1 1 0 0 +EDGE2 7765 7764 -0.938869 -0.0337022 -0.00229252 1 0 1 1 0 0 +EDGE2 7765 7005 -0.0750938 0.0100824 -3.14304 1 0 1 1 0 0 +EDGE2 7765 7025 0.0638372 -0.0742635 -3.15068 1 0 1 1 0 0 +EDGE2 7765 7024 1.0739 0.021282 -3.15282 1 0 1 1 0 0 +EDGE2 7765 7044 0.932333 0.0237736 -3.11304 1 0 1 1 0 0 +EDGE2 7765 7004 0.963881 -0.0835246 -3.15214 1 0 1 1 0 0 +EDGE2 7766 7007 0.949243 0.000608188 -0.000469459 1 0 1 1 0 0 +EDGE2 7766 7047 0.972147 -0.0378778 0.0168693 1 0 1 1 0 0 +EDGE2 7766 7027 1.04315 -0.0422815 0.0172078 1 0 1 1 0 0 +EDGE2 7766 7046 0.0232317 -0.0417432 0.002229 1 0 1 1 0 0 +EDGE2 7766 7006 0.113601 -0.000331322 -0.0170637 1 0 1 1 0 0 +EDGE2 7766 7026 -0.0301514 -0.0130236 -0.0166972 1 0 1 1 0 0 +EDGE2 7766 7045 -0.850848 0.0435267 -1.58431 1 0 1 1 0 0 +EDGE2 7766 7765 -1.05484 -0.0200228 1.60069 1 0 1 1 0 0 +EDGE2 7766 7005 -1.03595 -0.0358971 -1.58474 1 0 1 1 0 0 +EDGE2 7766 7025 -0.994368 -0.00482994 -1.53751 1 0 1 1 0 0 +EDGE2 7767 7007 -0.00766829 0.0420644 0.0214322 1 0 1 1 0 0 +EDGE2 7767 7008 0.96356 -0.0595196 0.0173935 1 0 1 1 0 0 +EDGE2 7767 7048 1.08318 0.0440408 -0.0207988 1 0 1 1 0 0 +EDGE2 7767 7028 1.06863 -0.121595 -0.0288489 1 0 1 1 0 0 +EDGE2 7767 7047 -0.0817757 0.00408474 -0.0352551 1 0 1 1 0 0 +EDGE2 7767 7027 0.0525361 0.0342867 -0.0114043 1 0 1 1 0 0 +EDGE2 7767 7046 -0.934889 0.0630175 -0.0150678 1 0 1 1 0 0 +EDGE2 7767 7766 -0.982858 -0.0520928 0.000598126 1 0 1 1 0 0 +EDGE2 7767 7006 -0.982378 -0.0120134 -0.0561229 1 0 1 1 0 0 +EDGE2 7767 7026 -0.959401 -0.0732746 0.0197785 1 0 1 1 0 0 +EDGE2 7768 7029 0.895515 -0.112255 -0.00108563 1 0 1 1 0 0 +EDGE2 7768 7049 0.980887 0.0676785 -0.0219307 1 0 1 1 0 0 +EDGE2 7768 7009 1.01223 0.00120159 0.000556375 1 0 1 1 0 0 +EDGE2 7768 7007 -0.966104 -0.0114445 0.00829719 1 0 1 1 0 0 +EDGE2 7768 7008 -0.0032766 0.0300091 -0.0318609 1 0 1 1 0 0 +EDGE2 7768 7048 0.0815678 -0.00427694 -0.0411117 1 0 1 1 0 0 +EDGE2 7768 7028 0.00571376 -0.0229692 0.0392331 1 0 1 1 0 0 +EDGE2 7768 7047 -0.99334 0.0631764 -0.0113515 1 0 1 1 0 0 +EDGE2 7768 7767 -0.9761 0.0564811 0.00785938 1 0 1 1 0 0 +EDGE2 7768 7027 -1.00991 0.0502743 -0.0266543 1 0 1 1 0 0 +EDGE2 7769 7010 0.97548 -0.0757705 -0.0224789 1 0 1 1 0 0 +EDGE2 7769 7030 1.09252 0.0809022 0.0253823 1 0 1 1 0 0 +EDGE2 7769 7050 1.03205 0.0265955 -0.00536715 1 0 1 1 0 0 +EDGE2 7769 7029 -0.0545991 0.0161147 0.0074823 1 0 1 1 0 0 +EDGE2 7769 7049 0.0018661 0.00643996 0.00695096 1 0 1 1 0 0 +EDGE2 7769 7009 -0.0244514 -0.0547182 -0.03132 1 0 1 1 0 0 +EDGE2 7769 7008 -0.941094 0.0444207 0.0268734 1 0 1 1 0 0 +EDGE2 7769 7048 -0.976364 0.0508619 -0.0143335 1 0 1 1 0 0 +EDGE2 7769 7768 -0.975473 -0.00621882 -0.0153178 1 0 1 1 0 0 +EDGE2 7769 7028 -0.978684 -0.0174953 -0.00779437 1 0 1 1 0 0 +EDGE2 7770 7051 0.0726011 -0.972444 -1.59718 1 0 1 1 0 0 +EDGE2 7770 7769 -0.95253 -0.0198479 0.00729929 1 0 1 1 0 0 +EDGE2 7770 7010 0.0106013 0.0494372 0.00307436 1 0 1 1 0 0 +EDGE2 7770 7030 -0.0950921 -0.0612331 0.00611745 1 0 1 1 0 0 +EDGE2 7770 7050 -0.0368033 0.0336684 0.00260256 1 0 1 1 0 0 +EDGE2 7770 7029 -0.973869 -0.00645839 -0.00139454 1 0 1 1 0 0 +EDGE2 7770 7049 -1.03268 0.0322421 0.013073 1 0 1 1 0 0 +EDGE2 7770 7009 -0.922072 0.0286204 -0.0169427 1 0 1 1 0 0 +EDGE2 7770 7031 0.00895925 1.00733 1.58173 1 0 1 1 0 0 +EDGE2 7770 7011 0.027958 1.02948 1.56777 1 0 1 1 0 0 +EDGE2 7771 7770 -1.02884 -0.0563881 -1.5728 1 0 1 1 0 0 +EDGE2 7771 7010 -1.00909 0.127035 -1.57332 1 0 1 1 0 0 +EDGE2 7771 7030 -1.03124 -0.0103364 -1.5709 1 0 1 1 0 0 +EDGE2 7771 7050 -1.08195 0.0275775 -1.55435 1 0 1 1 0 0 +EDGE2 7771 7031 -0.0942636 0.0138406 0.0284468 1 0 1 1 0 0 +EDGE2 7771 7011 -0.0475366 -0.099364 0.0148145 1 0 1 1 0 0 +EDGE2 7771 7032 1.06454 0.0288082 0.00262934 1 0 1 1 0 0 +EDGE2 7771 7012 1.01127 -0.116041 0.00499919 1 0 1 1 0 0 +EDGE2 7772 7031 -0.922823 -0.0810916 0.011296 1 0 1 1 0 0 +EDGE2 7772 7771 -0.904704 -0.101119 0.0139749 1 0 1 1 0 0 +EDGE2 7772 7011 -0.970437 -0.0484001 -0.00267814 1 0 1 1 0 0 +EDGE2 7772 7032 0.000694438 -0.027535 0.00207789 1 0 1 1 0 0 +EDGE2 7772 7012 0.0179419 -0.0464236 -0.0183123 1 0 1 1 0 0 +EDGE2 7772 7033 0.994121 -0.0794284 0.0149081 1 0 1 1 0 0 +EDGE2 7772 7013 1.02944 0.0573121 -0.031791 1 0 1 1 0 0 +EDGE2 7773 7032 -1.02191 0.108772 -0.00515878 1 0 1 1 0 0 +EDGE2 7773 7772 -0.961898 0.0693623 0.0256317 1 0 1 1 0 0 +EDGE2 7773 7012 -0.978356 0.0132606 -0.00197207 1 0 1 1 0 0 +EDGE2 7773 7033 0.0639632 -0.0369047 0.005243 1 0 1 1 0 0 +EDGE2 7773 7013 -0.00895248 -0.102097 0.0227025 1 0 1 1 0 0 +EDGE2 7773 7034 1.02955 -0.0181079 -0.00938953 1 0 1 1 0 0 +EDGE2 7773 7014 1.04008 0.0331367 0.0108206 1 0 1 1 0 0 +EDGE2 7774 7033 -0.96119 -0.0316708 0.0154491 1 0 1 1 0 0 +EDGE2 7774 7773 -1.09 -0.0226323 -0.0358774 1 0 1 1 0 0 +EDGE2 7774 7013 -0.999868 -0.0301206 -0.00423228 1 0 1 1 0 0 +EDGE2 7774 7034 -0.0155473 0.0208524 0.0265412 1 0 1 1 0 0 +EDGE2 7774 7014 -0.00827015 -0.0134035 0.0310593 1 0 1 1 0 0 +EDGE2 7774 6995 0.903619 -0.00590881 -3.16769 1 0 1 1 0 0 +EDGE2 7774 7035 1.07315 -0.0188064 -0.00749697 1 0 1 1 0 0 +EDGE2 7774 7015 1.13625 -0.0459506 0.0164493 1 0 1 1 0 0 +EDGE2 7775 7034 -1.05485 -0.0197187 -0.0126556 1 0 1 1 0 0 +EDGE2 7775 7774 -0.945301 0.0447678 -0.0084093 1 0 1 1 0 0 +EDGE2 7775 7014 -1.05028 -0.0416523 -0.00995793 1 0 1 1 0 0 +EDGE2 7775 6995 -0.00595475 0.0290348 -3.14066 1 0 1 1 0 0 +EDGE2 7775 7035 0.00975229 -0.0618943 0.0298374 1 0 1 1 0 0 +EDGE2 7775 7015 0.000202856 -0.0526624 0.0457651 1 0 1 1 0 0 +EDGE2 7775 6994 1.06814 -0.0570817 -3.12134 1 0 1 1 0 0 +EDGE2 7775 7016 -0.0387658 0.937747 1.56425 1 0 1 1 0 0 +EDGE2 7775 7036 0.0249127 0.997709 1.61623 1 0 1 1 0 0 +EDGE2 7775 6996 -0.00551508 1.00296 1.56049 1 0 1 1 0 0 +EDGE2 7776 6995 -0.973255 -0.00991875 1.58041 1 0 1 1 0 0 +EDGE2 7776 7035 -0.986906 0.0329392 -1.5773 1 0 1 1 0 0 +EDGE2 7776 7775 -0.920188 0.0362262 -1.57822 1 0 1 1 0 0 +EDGE2 7776 7015 -0.992564 -0.0186686 -1.55355 1 0 1 1 0 0 +EDGE2 7776 7016 0.0472233 0.0067073 -0.0211021 1 0 1 1 0 0 +EDGE2 7776 7036 -0.0713343 0.0627893 -0.0217716 1 0 1 1 0 0 +EDGE2 7776 6996 -0.0921159 -0.00105161 -0.0229165 1 0 1 1 0 0 +EDGE2 7776 6997 1.05 -0.0272538 0.0344217 1 0 1 1 0 0 +EDGE2 7776 7017 1.00287 -0.0505118 -0.0158263 1 0 1 1 0 0 +EDGE2 7776 7037 1.03394 0.0598933 -0.0238649 1 0 1 1 0 0 +EDGE2 7777 7038 1.04676 0.00295939 -0.0105103 1 0 1 1 0 0 +EDGE2 7777 7016 -0.979262 0.049763 0.0282854 1 0 1 1 0 0 +EDGE2 7777 7036 -0.957428 0.0493426 -0.0167063 1 0 1 1 0 0 +EDGE2 7777 7776 -1.01359 0.0694727 -0.0291 1 0 1 1 0 0 +EDGE2 7777 6996 -1.01875 -0.0409462 0.0289921 1 0 1 1 0 0 +EDGE2 7777 6997 0.0304652 0.0240586 -0.0040408 1 0 1 1 0 0 +EDGE2 7777 7017 -0.0112983 0.0109015 0.04315 1 0 1 1 0 0 +EDGE2 7777 7037 -0.0114037 0.087999 0.0251383 1 0 1 1 0 0 +EDGE2 7777 6998 0.985344 -0.0311645 -0.0282937 1 0 1 1 0 0 +EDGE2 7777 7018 0.930217 0.0078531 0.0189437 1 0 1 1 0 0 +EDGE2 7778 6999 0.938318 0.076671 -0.0200874 1 0 1 1 0 0 +EDGE2 7778 7038 -0.0142059 -0.0130585 -0.0322463 1 0 1 1 0 0 +EDGE2 7778 7777 -1.06131 -0.00677595 -0.025019 1 0 1 1 0 0 +EDGE2 7778 6997 -1.06912 0.108276 0.0293274 1 0 1 1 0 0 +EDGE2 7778 7017 -1.00095 -0.0205889 0.0203743 1 0 1 1 0 0 +EDGE2 7778 7037 -1.07507 0.000294257 -0.00296304 1 0 1 1 0 0 +EDGE2 7778 6998 0.0127841 -0.0130487 -0.018503 1 0 1 1 0 0 +EDGE2 7778 7018 -0.0826197 -0.0861341 -0.012465 1 0 1 1 0 0 +EDGE2 7778 7039 1.03042 0.105231 -0.00186583 1 0 1 1 0 0 +EDGE2 7778 7019 0.973061 0.0307113 0.0248272 1 0 1 1 0 0 +EDGE2 7779 7040 0.984488 -0.0359965 -0.0224024 1 0 1 1 0 0 +EDGE2 7779 6999 0.0444935 -0.0102576 0.0146048 1 0 1 1 0 0 +EDGE2 7779 7038 -0.999023 -0.00244955 0.00295088 1 0 1 1 0 0 +EDGE2 7779 7778 -0.91175 0.0069327 0.010731 1 0 1 1 0 0 +EDGE2 7779 6998 -1.03381 0.0683834 0.00986732 1 0 1 1 0 0 +EDGE2 7779 7018 -1.06831 0.0523535 0.0253107 1 0 1 1 0 0 +EDGE2 7779 7039 0.0112436 0.0363412 -0.018092 1 0 1 1 0 0 +EDGE2 7779 7019 0.0593389 0.0162296 0.0350463 1 0 1 1 0 0 +EDGE2 7779 7000 0.98115 0.0567888 0.0280052 1 0 1 1 0 0 +EDGE2 7779 7020 1.07026 -0.0180709 -0.0139779 1 0 1 1 0 0 +EDGE2 7780 7040 -0.0110935 -0.0713303 -0.0229025 1 0 1 1 0 0 +EDGE2 7780 6999 -1.02687 -0.0196402 -0.033243 1 0 1 1 0 0 +EDGE2 7780 7039 -0.998291 -0.0272073 0.0160118 1 0 1 1 0 0 +EDGE2 7780 7779 -1.04085 -0.025923 -0.0163047 1 0 1 1 0 0 +EDGE2 7780 7019 -0.995526 -0.0340481 -0.0286229 1 0 1 1 0 0 +EDGE2 7780 7041 0.0697932 1.00308 1.55664 1 0 1 1 0 0 +EDGE2 7780 7001 0.0738178 0.939786 1.52753 1 0 1 1 0 0 +EDGE2 7780 7021 -0.00756481 0.916083 1.53765 1 0 1 1 0 0 +EDGE2 7780 7000 -0.0393065 0.0186028 0.00207559 1 0 1 1 0 0 +EDGE2 7780 7020 -0.124014 0.0270847 0.0150487 1 0 1 1 0 0 +EDGE2 7781 7040 -0.93825 -0.00485196 -1.55641 1 0 1 1 0 0 +EDGE2 7781 7042 0.98472 0.0627224 0.0192579 1 0 1 1 0 0 +EDGE2 7781 7041 0.0364132 0.0660144 -0.0153362 1 0 1 1 0 0 +EDGE2 7781 7002 0.967347 0.0420376 0.0127163 1 0 1 1 0 0 +EDGE2 7781 7022 1.06455 0.0723682 -0.0266464 1 0 1 1 0 0 +EDGE2 7781 7001 0.0294903 -0.0670298 -0.012712 1 0 1 1 0 0 +EDGE2 7781 7021 0.0773994 0.00892761 0.0345238 1 0 1 1 0 0 +EDGE2 7781 7780 -1.02735 -0.0133829 -1.59081 1 0 1 1 0 0 +EDGE2 7781 7000 -0.960812 -0.0012774 -1.55412 1 0 1 1 0 0 +EDGE2 7781 7020 -0.940811 -0.00387089 -1.57039 1 0 1 1 0 0 +EDGE2 7782 7042 0.0733826 0.0103221 -0.00218159 1 0 1 1 0 0 +EDGE2 7782 7003 1.03269 -0.00486461 -0.00915445 1 0 1 1 0 0 +EDGE2 7782 7023 1.04743 0.0565201 -0.0108236 1 0 1 1 0 0 +EDGE2 7782 7043 0.866916 0.0268334 0.00396006 1 0 1 1 0 0 +EDGE2 7782 7041 -1.00002 0.0359258 0.00386229 1 0 1 1 0 0 +EDGE2 7782 7002 -0.0431174 -0.0222495 0.0258569 1 0 1 1 0 0 +EDGE2 7782 7022 -0.0682452 0.0394496 0.0186422 1 0 1 1 0 0 +EDGE2 7782 7781 -0.946667 -0.118887 0.0291199 1 0 1 1 0 0 +EDGE2 7782 7001 -0.93957 -0.0117791 -0.0279644 1 0 1 1 0 0 +EDGE2 7782 7021 -1.00966 0.0623016 0.0280637 1 0 1 1 0 0 +EDGE2 7783 7042 -0.964306 0.0717127 -0.00136356 1 0 1 1 0 0 +EDGE2 7783 7024 1.07439 -0.0782876 0.0198856 1 0 1 1 0 0 +EDGE2 7783 7044 1.03394 -0.0668896 -0.0173315 1 0 1 1 0 0 +EDGE2 7783 7004 1.04438 -0.0390794 -0.0099091 1 0 1 1 0 0 +EDGE2 7783 7003 -0.0334687 0.021785 -0.0245288 1 0 1 1 0 0 +EDGE2 7783 7023 0.0601997 0.0091072 -0.0359299 1 0 1 1 0 0 +EDGE2 7783 7043 0.019197 -0.0662845 -0.0194957 1 0 1 1 0 0 +EDGE2 7783 7782 -0.976546 -0.00615407 0.00623023 1 0 1 1 0 0 +EDGE2 7783 7002 -0.963474 -0.00760614 -0.029923 1 0 1 1 0 0 +EDGE2 7783 7022 -0.984672 0.0154591 0.0129429 1 0 1 1 0 0 +EDGE2 7784 7045 1.06136 -0.0476952 -0.0314718 1 0 1 1 0 0 +EDGE2 7784 7765 0.899641 -0.0736346 -3.13447 1 0 1 1 0 0 +EDGE2 7784 7005 1.02974 0.00404281 -0.0119922 1 0 1 1 0 0 +EDGE2 7784 7025 1.00934 0.0120906 0.00507183 1 0 1 1 0 0 +EDGE2 7784 7783 -1.0501 0.10145 -0.00884727 1 0 1 1 0 0 +EDGE2 7784 7024 0.0376786 0.0605878 0.0287416 1 0 1 1 0 0 +EDGE2 7784 7044 -0.00368094 -0.060399 0.0225149 1 0 1 1 0 0 +EDGE2 7784 7004 -0.017705 -0.0709693 0.0268346 1 0 1 1 0 0 +EDGE2 7784 7003 -1.03562 -0.0542322 0.0169134 1 0 1 1 0 0 +EDGE2 7784 7023 -1.11945 -0.0809346 -0.00909926 1 0 1 1 0 0 +EDGE2 7784 7043 -1.05186 0.00219944 0.00544433 1 0 1 1 0 0 +EDGE2 7785 7046 -0.045806 1.05182 1.58802 1 0 1 1 0 0 +EDGE2 7785 7766 0.0205924 0.957062 1.5396 1 0 1 1 0 0 +EDGE2 7785 7006 0.0504304 0.975992 1.57038 1 0 1 1 0 0 +EDGE2 7785 7026 -0.0137714 0.945495 1.59555 1 0 1 1 0 0 +EDGE2 7785 7045 -0.00483795 -0.021418 -0.0222838 1 0 1 1 0 0 +EDGE2 7785 7764 1.09847 0.0625906 -3.191 1 0 1 1 0 0 +EDGE2 7785 7765 0.0593955 0.033576 -3.14062 1 0 1 1 0 0 +EDGE2 7785 7005 0.0569442 0.197812 -0.0112146 1 0 1 1 0 0 +EDGE2 7785 7025 -0.107409 0.00619365 -0.0138564 1 0 1 1 0 0 +EDGE2 7785 7024 -1.00088 -0.0354819 0.0182869 1 0 1 1 0 0 +EDGE2 7785 7044 -0.915017 -0.0432334 -0.00364764 1 0 1 1 0 0 +EDGE2 7785 7784 -1.05339 0.00966987 0.0310721 1 0 1 1 0 0 +EDGE2 7785 7004 -0.963199 0.164508 -0.00490813 1 0 1 1 0 0 +EDGE2 7786 7007 0.98614 0.0148882 0.0319348 1 0 1 1 0 0 +EDGE2 7786 7047 0.985682 -0.0895062 0.0302567 1 0 1 1 0 0 +EDGE2 7786 7767 1.08603 0.046123 0.0203047 1 0 1 1 0 0 +EDGE2 7786 7027 1.04137 -0.0138932 0.00162548 1 0 1 1 0 0 +EDGE2 7786 7046 -0.0742944 0.0229794 0.00473945 1 0 1 1 0 0 +EDGE2 7786 7766 0.0125086 -0.0334411 -0.0280038 1 0 1 1 0 0 +EDGE2 7786 7006 0.0113585 -0.0437563 -0.00882366 1 0 1 1 0 0 +EDGE2 7786 7026 0.00575582 0.0470784 -0.0270233 1 0 1 1 0 0 +EDGE2 7786 7045 -1.00175 -0.0363158 -1.58007 1 0 1 1 0 0 +EDGE2 7786 7785 -0.99433 -0.0601844 -1.53482 1 0 1 1 0 0 +EDGE2 7786 7765 -0.970394 -0.0459171 1.56104 1 0 1 1 0 0 +EDGE2 7786 7005 -0.8494 -0.0180818 -1.55839 1 0 1 1 0 0 +EDGE2 7786 7025 -0.881504 0.0269637 -1.57757 1 0 1 1 0 0 +EDGE2 7787 7007 -0.0161592 0.0430476 -0.0128625 1 0 1 1 0 0 +EDGE2 7787 7008 1.01749 0.0167299 0.0343171 1 0 1 1 0 0 +EDGE2 7787 7048 1.10406 -0.0753834 -0.00519398 1 0 1 1 0 0 +EDGE2 7787 7768 1.02084 0.0537431 0.0193571 1 0 1 1 0 0 +EDGE2 7787 7028 1.10266 -0.0299237 -0.00190666 1 0 1 1 0 0 +EDGE2 7787 7047 0.0284758 0.059674 -0.0148699 1 0 1 1 0 0 +EDGE2 7787 7767 -0.04947 -0.0488176 0.0226902 1 0 1 1 0 0 +EDGE2 7787 7027 -0.00215332 0.00665769 0.00255377 1 0 1 1 0 0 +EDGE2 7787 7046 -0.956036 -0.0284406 -0.0139382 1 0 1 1 0 0 +EDGE2 7787 7786 -1.01086 -0.0860246 0.0218397 1 0 1 1 0 0 +EDGE2 7787 7766 -0.898928 -0.00331438 0.023292 1 0 1 1 0 0 +EDGE2 7787 7006 -0.982545 0.0821917 -0.000266187 1 0 1 1 0 0 +EDGE2 7787 7026 -0.972527 0.00256443 -0.000617097 1 0 1 1 0 0 +EDGE2 7788 7769 1.07631 -0.0931246 0.0178164 1 0 1 1 0 0 +EDGE2 7788 7029 0.979186 0.0443971 0.00420121 1 0 1 1 0 0 +EDGE2 7788 7049 1.02649 -0.0113843 -0.00368457 1 0 1 1 0 0 +EDGE2 7788 7009 1.07233 -0.00451564 -0.000536929 1 0 1 1 0 0 +EDGE2 7788 7007 -1.00441 0.0138318 -0.0237746 1 0 1 1 0 0 +EDGE2 7788 7008 0.0365308 0.00319182 0.00260428 1 0 1 1 0 0 +EDGE2 7788 7048 0.0145026 -0.0213386 0.00431591 1 0 1 1 0 0 +EDGE2 7788 7768 -0.0402571 0.0309988 0.0393363 1 0 1 1 0 0 +EDGE2 7788 7028 -0.00274398 0.0194439 -0.0269969 1 0 1 1 0 0 +EDGE2 7788 7047 -1.04666 0.0729909 -0.00885996 1 0 1 1 0 0 +EDGE2 7788 7767 -0.943501 0.0293005 -0.000383136 1 0 1 1 0 0 +EDGE2 7788 7787 -1.02464 0.0365322 -0.00323309 1 0 1 1 0 0 +EDGE2 7788 7027 -1.01119 -0.033743 0.0124295 1 0 1 1 0 0 +EDGE2 7789 7770 1.00064 -0.0179951 0.0132129 1 0 1 1 0 0 +EDGE2 7789 7769 -0.0820937 0.0440463 0.00593036 1 0 1 1 0 0 +EDGE2 7789 7010 0.986964 -0.0465846 0.00908982 1 0 1 1 0 0 +EDGE2 7789 7030 1.07304 0.0342553 0.0332759 1 0 1 1 0 0 +EDGE2 7789 7050 0.937621 -0.0625829 0.0152429 1 0 1 1 0 0 +EDGE2 7789 7029 -0.0379968 0.0432878 -0.00953828 1 0 1 1 0 0 +EDGE2 7789 7049 -0.0314111 -0.0169187 -0.0210517 1 0 1 1 0 0 +EDGE2 7789 7009 -0.0103931 -0.0459438 0.00943814 1 0 1 1 0 0 +EDGE2 7789 7008 -0.966144 -0.116041 0.0550898 1 0 1 1 0 0 +EDGE2 7789 7048 -0.976438 -0.0671454 0.00760804 1 0 1 1 0 0 +EDGE2 7789 7768 -1.01695 -0.06818 0.0192579 1 0 1 1 0 0 +EDGE2 7789 7788 -0.972242 0.0264673 -0.00274853 1 0 1 1 0 0 +EDGE2 7789 7028 -0.941658 -0.0946929 -0.0114552 1 0 1 1 0 0 +EDGE2 7790 7051 -0.0433764 -1.02642 -1.57403 1 0 1 1 0 0 +EDGE2 7790 7770 -0.0551946 -0.0492512 -0.000479556 1 0 1 1 0 0 +EDGE2 7790 7769 -0.976854 0.0755271 0.00925711 1 0 1 1 0 0 +EDGE2 7790 7010 -0.00843103 -0.0500074 -0.0078083 1 0 1 1 0 0 +EDGE2 7790 7030 0.0106424 -0.0311459 0.0229018 1 0 1 1 0 0 +EDGE2 7790 7050 -0.00897067 -0.00777265 -0.00951761 1 0 1 1 0 0 +EDGE2 7790 7789 -1.03413 0.0136887 -0.0076875 1 0 1 1 0 0 +EDGE2 7790 7029 -0.985196 -0.00866594 0.0136474 1 0 1 1 0 0 +EDGE2 7790 7049 -0.991388 -0.0490066 0.0227241 1 0 1 1 0 0 +EDGE2 7790 7009 -1.0527 0.0221866 0.0312963 1 0 1 1 0 0 +EDGE2 7790 7031 -0.0682265 1.01745 1.59806 1 0 1 1 0 0 +EDGE2 7790 7771 0.0509526 0.99505 1.54529 1 0 1 1 0 0 +EDGE2 7790 7011 0.10303 1.04952 1.54797 1 0 1 1 0 0 +EDGE2 7791 7770 -0.957497 0.00201356 -1.56894 1 0 1 1 0 0 +EDGE2 7791 7790 -0.995577 0.119164 -1.54355 1 0 1 1 0 0 +EDGE2 7791 7010 -1.04564 -0.0185559 -1.54567 1 0 1 1 0 0 +EDGE2 7791 7030 -0.946135 0.0419406 -1.55086 1 0 1 1 0 0 +EDGE2 7791 7050 -1.05796 0.0117831 -1.5943 1 0 1 1 0 0 +EDGE2 7791 7031 0.0305174 -0.0213604 0.0239215 1 0 1 1 0 0 +EDGE2 7791 7771 -0.0541956 0.0709039 0.0142268 1 0 1 1 0 0 +EDGE2 7791 7011 0.0276728 -0.00747668 -0.00405679 1 0 1 1 0 0 +EDGE2 7791 7032 0.948757 -0.029329 0.0116903 1 0 1 1 0 0 +EDGE2 7791 7772 1.04366 0.0310394 0.0174612 1 0 1 1 0 0 +EDGE2 7791 7012 1.01596 0.012437 0.0204525 1 0 1 1 0 0 +EDGE2 7792 7031 -1.0008 0.0559587 -0.011986 1 0 1 1 0 0 +EDGE2 7792 7771 -0.953679 0.0320049 -0.0571312 1 0 1 1 0 0 +EDGE2 7792 7791 -1.00913 0.0640186 -0.030021 1 0 1 1 0 0 +EDGE2 7792 7011 -1.05278 0.0294985 -0.00741334 1 0 1 1 0 0 +EDGE2 7792 7032 -0.0283832 0.0565563 -0.011697 1 0 1 1 0 0 +EDGE2 7792 7772 -0.0407002 0.0118238 0.00978831 1 0 1 1 0 0 +EDGE2 7792 7012 -0.0743812 -0.00674071 0.0338388 1 0 1 1 0 0 +EDGE2 7792 7033 0.994563 0.0515387 -0.0218983 1 0 1 1 0 0 +EDGE2 7792 7773 0.97376 -0.0228449 0.00223538 1 0 1 1 0 0 +EDGE2 7792 7013 1.01464 -0.0457683 0.0123248 1 0 1 1 0 0 +EDGE2 7793 7032 -0.987881 -0.00788822 0.0254167 1 0 1 1 0 0 +EDGE2 7793 7772 -1.11535 -0.0311101 0.0239734 1 0 1 1 0 0 +EDGE2 7793 7792 -0.998361 -0.00805758 0.0340598 1 0 1 1 0 0 +EDGE2 7793 7012 -0.969917 -0.0153704 0.00464379 1 0 1 1 0 0 +EDGE2 7793 7033 -0.0553447 -0.0104016 0.00291526 1 0 1 1 0 0 +EDGE2 7793 7773 0.049247 0.0471423 -0.0144704 1 0 1 1 0 0 +EDGE2 7793 7013 0.00443098 -0.105381 -0.00210905 1 0 1 1 0 0 +EDGE2 7793 7034 1.10916 0.1003 0.0180868 1 0 1 1 0 0 +EDGE2 7793 7774 0.958092 -0.0574536 0.00154858 1 0 1 1 0 0 +EDGE2 7793 7014 1.01992 -0.0131765 0.0388915 1 0 1 1 0 0 +EDGE2 7794 7033 -1.0845 0.00898959 0.00752753 1 0 1 1 0 0 +EDGE2 7794 7773 -1.06225 -0.036451 0.0616286 1 0 1 1 0 0 +EDGE2 7794 7793 -1.01654 -0.0695661 -0.00326446 1 0 1 1 0 0 +EDGE2 7794 7013 -0.999709 -0.0568903 -0.0462321 1 0 1 1 0 0 +EDGE2 7794 7034 -0.0216054 -0.00030185 0.00996844 1 0 1 1 0 0 +EDGE2 7794 7774 0.0317738 0.00478818 0.00969014 1 0 1 1 0 0 +EDGE2 7794 7014 -0.0036984 -0.0447471 -0.000806698 1 0 1 1 0 0 +EDGE2 7794 6995 0.921672 -0.0893304 -3.135 1 0 1 1 0 0 +EDGE2 7794 7035 0.93333 0.00703405 -0.00193844 1 0 1 1 0 0 +EDGE2 7794 7775 0.970032 0.055438 0.0268134 1 0 1 1 0 0 +EDGE2 7794 7015 0.912689 -0.00981203 -0.0166434 1 0 1 1 0 0 +EDGE2 7795 7034 -1.02718 -0.00351449 -0.0208158 1 0 1 1 0 0 +EDGE2 7795 7774 -1.04203 -0.000778447 0.00194302 1 0 1 1 0 0 +EDGE2 7795 7794 -0.986628 -0.00629057 -0.0297029 1 0 1 1 0 0 +EDGE2 7795 7014 -0.959279 0.0425454 -0.0207741 1 0 1 1 0 0 +EDGE2 7795 6995 0.0117717 -0.00653411 -3.14497 1 0 1 1 0 0 +EDGE2 7795 7035 -0.0686174 0.00329544 -0.00677495 1 0 1 1 0 0 +EDGE2 7795 7775 -0.0573316 -0.00675153 0.0200295 1 0 1 1 0 0 +EDGE2 7795 7015 -0.124257 0.00551957 -0.00235996 1 0 1 1 0 0 +EDGE2 7795 6994 1.02577 0.0318559 -3.15614 1 0 1 1 0 0 +EDGE2 7795 7016 0.046012 0.980029 1.6024 1 0 1 1 0 0 +EDGE2 7795 7036 -0.00456408 1.01742 1.53933 1 0 1 1 0 0 +EDGE2 7795 7776 0.0637498 0.976232 1.57196 1 0 1 1 0 0 +EDGE2 7795 6996 -0.0217198 1.09991 1.54169 1 0 1 1 0 0 +EDGE2 7796 6995 -1.04229 0.0392373 -1.57996 1 0 1 1 0 0 +EDGE2 7796 7035 -0.92043 -0.0253683 1.56612 1 0 1 1 0 0 +EDGE2 7796 7775 -1.05555 -0.0602183 1.55382 1 0 1 1 0 0 +EDGE2 7796 7795 -1.04544 -0.0263207 1.58996 1 0 1 1 0 0 +EDGE2 7796 7015 -1.00963 0.0400872 1.5758 1 0 1 1 0 0 +EDGE2 7797 7796 -0.894356 0.0560662 0.00851749 1 0 1 1 0 0 +EDGE2 7798 7797 -0.982027 0.0397075 -0.0123816 1 0 1 1 0 0 +EDGE2 7799 7798 -0.942773 -0.0284119 -0.00626183 1 0 1 1 0 0 +EDGE2 7800 7799 -0.978463 -0.0362521 -0.00868005 1 0 1 1 0 0 +EDGE2 7801 7800 -0.908608 0.0578838 1.60737 1 0 1 1 0 0 +EDGE2 7802 7801 -0.989758 -0.00672106 -0.0122755 1 0 1 1 0 0 +EDGE2 7803 7802 -0.896721 -0.00215849 0.0237431 1 0 1 1 0 0 +EDGE2 7804 7803 -1.06147 0.0315663 -0.0190051 1 0 1 1 0 0 +EDGE2 7805 7804 -0.906246 0.0216835 0.00206367 1 0 1 1 0 0 +EDGE2 7806 7805 -0.985764 0.0548182 1.58171 1 0 1 1 0 0 +EDGE2 7807 7806 -0.913925 0.0918026 -0.0218679 1 0 1 1 0 0 +EDGE2 7808 7807 -0.945153 -0.0112009 0.0280172 1 0 1 1 0 0 +EDGE2 7809 7808 -0.976122 -0.00201511 -0.00836688 1 0 1 1 0 0 +EDGE2 7809 7770 1.11779 -0.0444543 -3.1094 1 0 1 1 0 0 +EDGE2 7809 7790 0.994916 0.108601 -3.16882 1 0 1 1 0 0 +EDGE2 7809 7010 0.915369 0.059588 -3.15423 1 0 1 1 0 0 +EDGE2 7809 7030 1.00701 0.015785 -3.17797 1 0 1 1 0 0 +EDGE2 7809 7050 0.940841 -0.00957707 -3.15288 1 0 1 1 0 0 +EDGE2 7810 7809 -0.973821 0.0458766 -0.00895629 1 0 1 1 0 0 +EDGE2 7810 7051 -0.0491564 0.999023 1.57663 1 0 1 1 0 0 +EDGE2 7810 7770 -0.0668551 -0.0707962 -3.13596 1 0 1 1 0 0 +EDGE2 7810 7790 -0.0278399 0.0476926 -3.13709 1 0 1 1 0 0 +EDGE2 7810 7769 1.06593 -0.0128065 -3.13912 1 0 1 1 0 0 +EDGE2 7810 7010 0.0541507 0.0340828 -3.15582 1 0 1 1 0 0 +EDGE2 7810 7030 0.0135195 0.00276072 -3.15037 1 0 1 1 0 0 +EDGE2 7810 7050 -0.0509207 0.0654577 -3.15817 1 0 1 1 0 0 +EDGE2 7810 7789 1.08792 -0.0967975 -3.136 1 0 1 1 0 0 +EDGE2 7810 7029 1.05222 -0.0137847 -3.15542 1 0 1 1 0 0 +EDGE2 7810 7049 1.00865 -0.0331407 -3.12798 1 0 1 1 0 0 +EDGE2 7810 7009 0.956979 -0.0616951 -3.1338 1 0 1 1 0 0 +EDGE2 7810 7031 -0.054653 -0.975956 -1.57546 1 0 1 1 0 0 +EDGE2 7810 7771 0.0130097 -1.02687 -1.58075 1 0 1 1 0 0 +EDGE2 7810 7791 -0.0294535 -0.981075 -1.57034 1 0 1 1 0 0 +EDGE2 7810 7011 0.0228795 -1.02069 -1.56997 1 0 1 1 0 0 +EDGE2 7811 7052 1.02352 -0.0729995 0.0280471 1 0 1 1 0 0 +EDGE2 7811 7051 0.0332691 -0.0506958 -0.00305195 1 0 1 1 0 0 +EDGE2 7811 7770 -1.05011 0.00998115 1.56463 1 0 1 1 0 0 +EDGE2 7811 7810 -1.01523 -0.0653427 -1.59199 1 0 1 1 0 0 +EDGE2 7811 7790 -0.916316 -0.00470779 1.60265 1 0 1 1 0 0 +EDGE2 7811 7010 -1.11023 0.0540966 1.57826 1 0 1 1 0 0 +EDGE2 7811 7030 -0.978695 -0.0106204 1.57377 1 0 1 1 0 0 +EDGE2 7811 7050 -1.06162 -0.0535701 1.5359 1 0 1 1 0 0 +EDGE2 7812 7052 0.0246031 -0.0329498 0.0309503 1 0 1 1 0 0 +EDGE2 7812 7053 0.919377 0.0745721 -0.00375462 1 0 1 1 0 0 +EDGE2 7812 7811 -1.09241 0.0234882 0.000548278 1 0 1 1 0 0 +EDGE2 7812 7051 -0.940177 -0.0353683 0.0206119 1 0 1 1 0 0 +EDGE2 7813 7054 0.875186 0.0560281 0.0389871 1 0 1 1 0 0 +EDGE2 7813 7052 -0.899197 -0.0826496 -0.00873891 1 0 1 1 0 0 +EDGE2 7813 7053 -0.0400332 0.058873 -0.0135058 1 0 1 1 0 0 +EDGE2 7813 7812 -0.98822 -0.030015 -0.0353602 1 0 1 1 0 0 +EDGE2 7814 7813 -1.03147 -0.0113894 -0.0107108 1 0 1 1 0 0 +EDGE2 7814 7055 0.933272 0.00576784 -0.0266833 1 0 1 1 0 0 +EDGE2 7814 7054 -0.0175691 -0.0290283 -0.00895265 1 0 1 1 0 0 +EDGE2 7814 7053 -0.934024 -0.13336 -0.0258998 1 0 1 1 0 0 +EDGE2 7815 7056 0.00471899 0.971724 1.60221 1 0 1 1 0 0 +EDGE2 7815 7055 0.071088 0.0295724 0.0290928 1 0 1 1 0 0 +EDGE2 7815 7054 -0.976218 0.00676992 -0.020205 1 0 1 1 0 0 +EDGE2 7815 7814 -0.978752 -0.0175559 0.0138868 1 0 1 1 0 0 +EDGE2 7816 7057 0.97227 0.0172851 -0.00263573 1 0 1 1 0 0 +EDGE2 7816 7056 -0.0612741 0.0255384 0.00808889 1 0 1 1 0 0 +EDGE2 7816 7055 -1.00666 0.00551844 -1.55199 1 0 1 1 0 0 +EDGE2 7816 7815 -0.934595 -0.0499043 -1.59061 1 0 1 1 0 0 +EDGE2 7817 7058 0.984115 -0.0560666 0.0116311 1 0 1 1 0 0 +EDGE2 7817 7057 0.0263169 -0.0373289 -0.0150281 1 0 1 1 0 0 +EDGE2 7817 7056 -0.95389 0.0175813 -0.0338628 1 0 1 1 0 0 +EDGE2 7817 7816 -0.958217 -0.00299295 -0.0460948 1 0 1 1 0 0 +EDGE2 7818 7059 0.923137 0.0429065 0.0487757 1 0 1 1 0 0 +EDGE2 7818 7058 -0.0917738 -0.0159207 0.00556764 1 0 1 1 0 0 +EDGE2 7818 7057 -0.970499 -0.0139104 -0.00318833 1 0 1 1 0 0 +EDGE2 7818 7817 -1.03904 0.00495468 -0.0154078 1 0 1 1 0 0 +EDGE2 7819 7060 0.986377 0.0275757 -0.0239346 1 0 1 1 0 0 +EDGE2 7819 7100 0.902965 -0.0201395 -3.13928 1 0 1 1 0 0 +EDGE2 7819 7818 -1.08423 -0.0284262 0.0234446 1 0 1 1 0 0 +EDGE2 7819 7059 -0.0191637 0.0557174 0.00344493 1 0 1 1 0 0 +EDGE2 7819 7058 -1.0666 0.044181 0.00660444 1 0 1 1 0 0 +EDGE2 7820 7099 1.00292 0.0299298 -3.10985 1 0 1 1 0 0 +EDGE2 7820 7061 -0.0596121 -1.01 -1.54579 1 0 1 1 0 0 +EDGE2 7820 7101 0.064072 -1.03467 -1.59503 1 0 1 1 0 0 +EDGE2 7820 7060 0.053756 -0.00520584 0.0168862 1 0 1 1 0 0 +EDGE2 7820 7100 -0.0118602 -0.027293 -3.1571 1 0 1 1 0 0 +EDGE2 7820 7059 -1.04721 0.0129023 -0.043217 1 0 1 1 0 0 +EDGE2 7820 7819 -1.01231 0.0375586 0.00184777 1 0 1 1 0 0 +EDGE2 7821 7060 -1.00588 0.0611439 -1.54918 1 0 1 1 0 0 +EDGE2 7821 7820 -1.00057 0.0362594 -1.59721 1 0 1 1 0 0 +EDGE2 7821 7100 -1.02085 0.0453398 1.57527 1 0 1 1 0 0 +EDGE2 7822 7821 -0.922218 -0.0861999 0.00774977 1 0 1 1 0 0 +EDGE2 7823 7822 -0.896844 -0.0617398 -0.0248382 1 0 1 1 0 0 +EDGE2 7824 7823 -0.920775 0.00283408 0.00489219 1 0 1 1 0 0 +EDGE2 7824 7805 0.921727 -0.0104668 -3.12293 1 0 1 1 0 0 +EDGE2 7825 7824 -1.01218 -0.0414757 -0.00555575 1 0 1 1 0 0 +EDGE2 7825 7805 0.00740388 0.0864952 -3.12006 1 0 1 1 0 0 +EDGE2 7825 7804 0.97383 -0.00246406 -3.13675 1 0 1 1 0 0 +EDGE2 7825 7806 -0.0106975 1.02902 1.5211 1 0 1 1 0 0 +EDGE2 7826 7807 1.03936 0.00102701 -0.0074894 1 0 1 1 0 0 +EDGE2 7826 7805 -1.06095 0.0399249 1.56036 1 0 1 1 0 0 +EDGE2 7826 7825 -0.988075 -0.00743169 -1.5546 1 0 1 1 0 0 +EDGE2 7826 7806 0.00292526 0.0405017 0.0152134 1 0 1 1 0 0 +EDGE2 7827 7807 -0.0287706 0.0724521 -0.00653897 1 0 1 1 0 0 +EDGE2 7827 7826 -0.956189 -0.000973391 -0.0130352 1 0 1 1 0 0 +EDGE2 7827 7806 -0.997603 -0.0113984 0.000799632 1 0 1 1 0 0 +EDGE2 7827 7808 0.910581 -0.0670247 -0.00354745 1 0 1 1 0 0 +EDGE2 7828 7807 -0.942361 0.00409836 0.0221043 1 0 1 1 0 0 +EDGE2 7828 7827 -1.04315 0.00279873 0.00971469 1 0 1 1 0 0 +EDGE2 7828 7808 -0.0446175 0.0330011 -0.00106686 1 0 1 1 0 0 +EDGE2 7828 7809 0.99921 0.0283511 -0.0391927 1 0 1 1 0 0 +EDGE2 7829 7828 -1.06648 0.0249382 0.0014299 1 0 1 1 0 0 +EDGE2 7829 7808 -1.02942 0.0344852 -0.0255013 1 0 1 1 0 0 +EDGE2 7829 7809 0.0450616 0.0212665 -0.0112647 1 0 1 1 0 0 +EDGE2 7829 7770 0.981674 0.0780215 -3.13291 1 0 1 1 0 0 +EDGE2 7829 7810 1.03013 -0.0157244 0.0385793 1 0 1 1 0 0 +EDGE2 7829 7790 1.07321 -0.0361984 -3.11088 1 0 1 1 0 0 +EDGE2 7829 7010 1.0352 0.0552019 -3.16611 1 0 1 1 0 0 +EDGE2 7829 7030 0.938831 -0.00532208 -3.14155 1 0 1 1 0 0 +EDGE2 7829 7050 0.975928 -0.0441527 -3.12342 1 0 1 1 0 0 +EDGE2 7830 7829 -0.987491 -0.0471297 -0.0329704 1 0 1 1 0 0 +EDGE2 7830 7809 -1.01231 -0.0779141 -0.0274137 1 0 1 1 0 0 +EDGE2 7830 7811 -0.00422193 0.958756 1.55703 1 0 1 1 0 0 +EDGE2 7830 7051 0.0165367 1.02174 1.57469 1 0 1 1 0 0 +EDGE2 7830 7770 0.0642984 -0.0272851 -3.11779 1 0 1 1 0 0 +EDGE2 7830 7810 0.0279855 -0.0545373 -0.0236749 1 0 1 1 0 0 +EDGE2 7830 7790 -0.0564101 -0.0399398 -3.14497 1 0 1 1 0 0 +EDGE2 7830 7769 1.04375 0.00128685 -3.13518 1 0 1 1 0 0 +EDGE2 7830 7010 0.148407 -0.0148019 -3.17379 1 0 1 1 0 0 +EDGE2 7830 7030 -0.0522382 -0.0260743 -3.10554 1 0 1 1 0 0 +EDGE2 7830 7050 -0.00829267 0.0380382 -3.13759 1 0 1 1 0 0 +EDGE2 7830 7789 0.962166 0.0172498 -3.13792 1 0 1 1 0 0 +EDGE2 7830 7029 0.993641 0.0197998 -3.13297 1 0 1 1 0 0 +EDGE2 7830 7049 0.920775 0.023032 -3.15007 1 0 1 1 0 0 +EDGE2 7830 7009 0.92651 -0.0283189 -3.15483 1 0 1 1 0 0 +EDGE2 7830 7031 -0.0186476 -1.02938 -1.56369 1 0 1 1 0 0 +EDGE2 7830 7771 0.0323866 -0.979123 -1.56666 1 0 1 1 0 0 +EDGE2 7830 7791 0.0458249 -0.946472 -1.61026 1 0 1 1 0 0 +EDGE2 7830 7011 0.0166313 -1.03864 -1.5842 1 0 1 1 0 0 +EDGE2 7831 7052 1.02537 -0.0184562 0.0185932 1 0 1 1 0 0 +EDGE2 7831 7812 0.980318 0.0124051 0.0131753 1 0 1 1 0 0 +EDGE2 7831 7811 -0.103615 -0.0715406 0.00818369 1 0 1 1 0 0 +EDGE2 7831 7051 0.041834 -0.0239275 0.0106861 1 0 1 1 0 0 +EDGE2 7831 7770 -0.870193 0.0343428 1.56607 1 0 1 1 0 0 +EDGE2 7831 7810 -0.961543 0.00539081 -1.58231 1 0 1 1 0 0 +EDGE2 7831 7830 -1.06808 0.0363545 -1.56568 1 0 1 1 0 0 +EDGE2 7831 7790 -0.928996 0.108157 1.57008 1 0 1 1 0 0 +EDGE2 7831 7010 -1.0677 0.0526076 1.5941 1 0 1 1 0 0 +EDGE2 7831 7030 -1.01698 -0.00600476 1.55411 1 0 1 1 0 0 +EDGE2 7831 7050 -1.03787 0.0106217 1.60601 1 0 1 1 0 0 +EDGE2 7832 7813 1.0734 0.055006 -0.0193319 1 0 1 1 0 0 +EDGE2 7832 7052 -0.0525917 0.00641052 -0.014919 1 0 1 1 0 0 +EDGE2 7832 7053 0.973667 0.0339851 -0.0233849 1 0 1 1 0 0 +EDGE2 7832 7812 0.0497174 0.06719 -0.0114385 1 0 1 1 0 0 +EDGE2 7832 7811 -1.09745 0.00501587 0.0461643 1 0 1 1 0 0 +EDGE2 7832 7831 -0.976219 -0.02342 0.0250634 1 0 1 1 0 0 +EDGE2 7832 7051 -0.995071 0.106449 0.0064474 1 0 1 1 0 0 +EDGE2 7833 7813 0.0310762 -0.0941777 0.00984409 1 0 1 1 0 0 +EDGE2 7833 7054 1.03364 -0.0211049 -0.0103578 1 0 1 1 0 0 +EDGE2 7833 7814 0.969273 -0.0515629 -0.013703 1 0 1 1 0 0 +EDGE2 7833 7052 -1.00175 -0.0396773 0.00184948 1 0 1 1 0 0 +EDGE2 7833 7832 -1.00442 -0.0224244 -0.00587406 1 0 1 1 0 0 +EDGE2 7833 7053 0.0520392 -0.035054 0.0115711 1 0 1 1 0 0 +EDGE2 7833 7812 -1.08358 -0.00332699 -0.00231501 1 0 1 1 0 0 +EDGE2 7834 7813 -0.978003 -0.0493009 0.0399949 1 0 1 1 0 0 +EDGE2 7834 7055 1.00147 -0.00280444 0.011641 1 0 1 1 0 0 +EDGE2 7834 7815 0.935821 0.0736147 0.0127405 1 0 1 1 0 0 +EDGE2 7834 7054 0.0637253 0.028131 -0.00291385 1 0 1 1 0 0 +EDGE2 7834 7814 -0.0345982 -0.00688484 0.0225861 1 0 1 1 0 0 +EDGE2 7834 7833 -0.994172 0.0267547 0.00715748 1 0 1 1 0 0 +EDGE2 7834 7053 -0.901011 0.0180308 0.0216172 1 0 1 1 0 0 +EDGE2 7835 7056 0.0456681 0.953852 1.56593 1 0 1 1 0 0 +EDGE2 7835 7816 -0.043964 0.879313 1.57524 1 0 1 1 0 0 +EDGE2 7835 7834 -1.02571 0.0356721 -0.0161338 1 0 1 1 0 0 +EDGE2 7835 7055 0.0201913 0.0230072 -0.000720318 1 0 1 1 0 0 +EDGE2 7835 7815 -0.0695492 0.102626 -0.0547759 1 0 1 1 0 0 +EDGE2 7835 7054 -0.988607 0.0455022 0.0109064 1 0 1 1 0 0 +EDGE2 7835 7814 -0.936568 0.0429224 0.0137995 1 0 1 1 0 0 +EDGE2 7836 7057 1.00969 -0.0594974 -0.0133 1 0 1 1 0 0 +EDGE2 7836 7817 0.989929 -0.0367984 0.00435451 1 0 1 1 0 0 +EDGE2 7836 7056 0.0308559 0.0203134 0.0178917 1 0 1 1 0 0 +EDGE2 7836 7816 0.000139045 -0.00502035 0.0149995 1 0 1 1 0 0 +EDGE2 7836 7055 -1.02096 0.0340803 -1.54721 1 0 1 1 0 0 +EDGE2 7836 7815 -0.929604 -0.0297525 -1.59002 1 0 1 1 0 0 +EDGE2 7836 7835 -0.906816 -0.0537792 -1.56081 1 0 1 1 0 0 +EDGE2 7837 7818 0.982432 0.0672551 -0.0182329 1 0 1 1 0 0 +EDGE2 7837 7058 0.967374 -0.0280124 0.0161097 1 0 1 1 0 0 +EDGE2 7837 7057 -0.0135523 0.0368798 0.00839664 1 0 1 1 0 0 +EDGE2 7837 7817 -0.0737003 0.0440055 0.0070227 1 0 1 1 0 0 +EDGE2 7837 7836 -0.955388 -0.0109148 0.0131237 1 0 1 1 0 0 +EDGE2 7837 7056 -1.02889 0.0969002 -0.00663344 1 0 1 1 0 0 +EDGE2 7837 7816 -1.00826 0.000715077 -0.000923406 1 0 1 1 0 0 +EDGE2 7838 7818 0.0534016 0.0270672 -0.0320661 1 0 1 1 0 0 +EDGE2 7838 7059 0.928895 0.0314619 -0.0198441 1 0 1 1 0 0 +EDGE2 7838 7819 1.0263 0.0254216 -0.0202092 1 0 1 1 0 0 +EDGE2 7838 7058 0.0608535 0.0209478 0.0158375 1 0 1 1 0 0 +EDGE2 7838 7057 -1.0561 0.0304795 0.0118275 1 0 1 1 0 0 +EDGE2 7838 7837 -1.02614 -0.0206423 0.0242991 1 0 1 1 0 0 +EDGE2 7838 7817 -1.04205 0.0126716 -0.0303308 1 0 1 1 0 0 +EDGE2 7839 7060 1.04855 -0.0155359 0.015923 1 0 1 1 0 0 +EDGE2 7839 7820 1.05033 -0.0204847 0.0280235 1 0 1 1 0 0 +EDGE2 7839 7100 0.965224 -0.0928326 -3.15402 1 0 1 1 0 0 +EDGE2 7839 7818 -0.972439 0.129965 -0.0138769 1 0 1 1 0 0 +EDGE2 7839 7059 0.0624937 -0.0784029 0.00176921 1 0 1 1 0 0 +EDGE2 7839 7819 -0.090811 0.0656278 -0.0176826 1 0 1 1 0 0 +EDGE2 7839 7838 -0.932164 -0.0326602 0.0160416 1 0 1 1 0 0 +EDGE2 7839 7058 -1.0299 0.0378294 0.00567733 1 0 1 1 0 0 +EDGE2 7840 7099 1.0277 0.0563054 -3.11827 1 0 1 1 0 0 +EDGE2 7840 7061 -0.0942666 -1.09657 -1.54249 1 0 1 1 0 0 +EDGE2 7840 7101 0.0200805 -0.987493 -1.57417 1 0 1 1 0 0 +EDGE2 7840 7060 0.0319002 -0.0289847 0.00401635 1 0 1 1 0 0 +EDGE2 7840 7820 -0.00187729 0.0585636 0.051003 1 0 1 1 0 0 +EDGE2 7840 7100 0.057347 0.0416715 -3.16876 1 0 1 1 0 0 +EDGE2 7840 7821 0.00750454 0.927363 1.54007 1 0 1 1 0 0 +EDGE2 7840 7059 -1.0147 0.0757576 -0.0215364 1 0 1 1 0 0 +EDGE2 7840 7819 -0.922656 -0.0439377 0.0224984 1 0 1 1 0 0 +EDGE2 7840 7839 -1.03162 -0.0668605 0.0130229 1 0 1 1 0 0 +EDGE2 7841 7060 -0.993814 -0.0180046 -1.58327 1 0 1 1 0 0 +EDGE2 7841 7820 -1.00158 0.09021 -1.61422 1 0 1 1 0 0 +EDGE2 7841 7840 -1.06125 -0.0926519 -1.5737 1 0 1 1 0 0 +EDGE2 7841 7100 -0.899314 -0.0983898 1.51837 1 0 1 1 0 0 +EDGE2 7841 7821 0.084607 0.00094728 0.0123528 1 0 1 1 0 0 +EDGE2 7841 7822 1.00316 -0.0236521 -0.0416578 1 0 1 1 0 0 +EDGE2 7842 7841 -1.01874 -0.0918898 -0.00827908 1 0 1 1 0 0 +EDGE2 7842 7821 -0.954822 0.114806 0.0280743 1 0 1 1 0 0 +EDGE2 7842 7823 0.961906 0.0264152 0.00953112 1 0 1 1 0 0 +EDGE2 7842 7822 0.0605586 0.0273442 0.0128985 1 0 1 1 0 0 +EDGE2 7843 7823 -0.00419269 -0.00919815 -0.0399049 1 0 1 1 0 0 +EDGE2 7843 7822 -0.960153 0.0170956 -0.00585298 1 0 1 1 0 0 +EDGE2 7843 7842 -0.961896 0.00372947 0.00107483 1 0 1 1 0 0 +EDGE2 7843 7824 0.96911 0.0191193 0.00613951 1 0 1 1 0 0 +EDGE2 7844 7823 -1.03626 0.0129839 -0.0304635 1 0 1 1 0 0 +EDGE2 7844 7843 -1.02977 -0.0097093 0.0309636 1 0 1 1 0 0 +EDGE2 7844 7824 -0.0315634 -0.0499687 0.0128679 1 0 1 1 0 0 +EDGE2 7844 7805 1.07078 -0.00694146 -3.16597 1 0 1 1 0 0 +EDGE2 7844 7825 0.994705 -0.0845599 -0.000571763 1 0 1 1 0 0 +EDGE2 7845 7824 -1.03447 -0.00493146 -0.00318941 1 0 1 1 0 0 +EDGE2 7845 7844 -1.02949 0.143995 0.00578943 1 0 1 1 0 0 +EDGE2 7845 7805 0.0358372 0.0387547 -3.14772 1 0 1 1 0 0 +EDGE2 7845 7825 0.0442161 0.00489903 0.00510934 1 0 1 1 0 0 +EDGE2 7845 7804 1.01324 -0.0843328 -3.14107 1 0 1 1 0 0 +EDGE2 7845 7826 0.0140313 1.0792 1.56728 1 0 1 1 0 0 +EDGE2 7845 7806 -0.00447272 0.942621 1.53161 1 0 1 1 0 0 +EDGE2 7846 7807 1.03053 -0.0338473 -0.00834653 1 0 1 1 0 0 +EDGE2 7846 7845 -0.968421 0.0111212 -1.58091 1 0 1 1 0 0 +EDGE2 7846 7805 -0.962437 -0.0019137 1.56882 1 0 1 1 0 0 +EDGE2 7846 7825 -1.14769 0.0207084 -1.56415 1 0 1 1 0 0 +EDGE2 7846 7826 0.00471596 0.0691129 0.0110547 1 0 1 1 0 0 +EDGE2 7846 7806 -0.0804564 0.00407839 0.0198281 1 0 1 1 0 0 +EDGE2 7846 7827 0.977865 0.0467267 -0.0196498 1 0 1 1 0 0 +EDGE2 7847 7807 0.0874886 -0.103792 0.0273983 1 0 1 1 0 0 +EDGE2 7847 7826 -1.06641 0.0403586 -0.0038154 1 0 1 1 0 0 +EDGE2 7847 7846 -0.97813 0.0249809 -0.0462405 1 0 1 1 0 0 +EDGE2 7847 7806 -1.03478 -0.00143268 -0.0115078 1 0 1 1 0 0 +EDGE2 7847 7827 0.0456547 0.0220491 -0.00997874 1 0 1 1 0 0 +EDGE2 7847 7828 1.01591 -0.0150817 -0.027685 1 0 1 1 0 0 +EDGE2 7847 7808 0.85163 -0.02056 -0.000522273 1 0 1 1 0 0 +EDGE2 7848 7807 -0.96866 -0.0228694 -0.00966033 1 0 1 1 0 0 +EDGE2 7848 7847 -1.03938 -0.00664948 -0.00369149 1 0 1 1 0 0 +EDGE2 7848 7827 -1.00396 0.0452995 0.0102901 1 0 1 1 0 0 +EDGE2 7848 7829 1.03113 0.0042943 0.00882526 1 0 1 1 0 0 +EDGE2 7848 7828 0.0206759 0.0446412 -0.00497335 1 0 1 1 0 0 +EDGE2 7848 7808 -0.00164122 0.0447394 -0.0117281 1 0 1 1 0 0 +EDGE2 7848 7809 1.03726 0.0598913 -0.0234685 1 0 1 1 0 0 +EDGE2 7849 7829 -0.00442795 -0.0140178 0.0108501 1 0 1 1 0 0 +EDGE2 7849 7828 -0.940109 -0.0227354 0.033621 1 0 1 1 0 0 +EDGE2 7849 7848 -1.03054 -0.0443811 0.0212717 1 0 1 1 0 0 +EDGE2 7849 7808 -0.993115 0.0405042 0.00938242 1 0 1 1 0 0 +EDGE2 7849 7809 -0.0231241 -0.022903 0.0152877 1 0 1 1 0 0 +EDGE2 7849 7770 0.971951 -0.0327798 -3.15866 1 0 1 1 0 0 +EDGE2 7849 7810 0.94735 -0.05679 -0.0018866 1 0 1 1 0 0 +EDGE2 7849 7830 1.00636 0.0240474 -0.000764337 1 0 1 1 0 0 +EDGE2 7849 7790 0.959469 0.0070411 -3.15402 1 0 1 1 0 0 +EDGE2 7849 7010 1.05214 -0.00371398 -3.12663 1 0 1 1 0 0 +EDGE2 7849 7030 0.929358 -0.00142742 -3.16344 1 0 1 1 0 0 +EDGE2 7849 7050 1.08233 0.0776686 -3.15505 1 0 1 1 0 0 +EDGE2 7850 7829 -0.9279 -0.0119329 0.0159044 1 0 1 1 0 0 +EDGE2 7850 7849 -0.998105 -0.00476628 -0.00388305 1 0 1 1 0 0 +EDGE2 7850 7809 -1.0552 -0.0993681 -0.0170156 1 0 1 1 0 0 +EDGE2 7850 7811 -0.0590419 0.998963 1.58191 1 0 1 1 0 0 +EDGE2 7850 7831 -0.0845473 1.0285 1.55494 1 0 1 1 0 0 +EDGE2 7850 7051 0.0929055 1.10424 1.56171 1 0 1 1 0 0 +EDGE2 7850 7770 -0.039458 0.119165 -3.17086 1 0 1 1 0 0 +EDGE2 7850 7810 0.02432 -0.0430753 0.0277315 1 0 1 1 0 0 +EDGE2 7850 7830 0.057474 0.0435565 -0.0103378 1 0 1 1 0 0 +EDGE2 7850 7790 -0.00359089 -0.0156166 -3.16672 1 0 1 1 0 0 +EDGE2 7850 7769 0.992318 -0.0274663 -3.16263 1 0 1 1 0 0 +EDGE2 7850 7010 0.0107143 0.0166459 -3.1641 1 0 1 1 0 0 +EDGE2 7850 7030 -0.0596818 0.0917005 -3.13084 1 0 1 1 0 0 +EDGE2 7850 7050 0.0311084 -0.00235951 -3.13409 1 0 1 1 0 0 +EDGE2 7850 7789 0.986283 -0.0162762 -3.15092 1 0 1 1 0 0 +EDGE2 7850 7029 1.03344 0.00676416 -3.15444 1 0 1 1 0 0 +EDGE2 7850 7049 0.925653 0.00657009 -3.09715 1 0 1 1 0 0 +EDGE2 7850 7009 1.00475 -0.0820401 -3.15571 1 0 1 1 0 0 +EDGE2 7850 7031 0.0360668 -0.992301 -1.5674 1 0 1 1 0 0 +EDGE2 7850 7771 -0.0142411 -0.978227 -1.55976 1 0 1 1 0 0 +EDGE2 7850 7791 -0.0311725 -1.01948 -1.58685 1 0 1 1 0 0 +EDGE2 7850 7011 -0.0344876 -0.901889 -1.61299 1 0 1 1 0 0 +EDGE2 7851 7052 0.994133 0.13244 0.0353595 1 0 1 1 0 0 +EDGE2 7851 7832 0.93881 0.077866 -0.0102075 1 0 1 1 0 0 +EDGE2 7851 7812 1.04594 -0.0959644 0.00612152 1 0 1 1 0 0 +EDGE2 7851 7811 0.0832705 0.0618407 -0.0153137 1 0 1 1 0 0 +EDGE2 7851 7831 -0.0003678 -0.0474418 -0.0244926 1 0 1 1 0 0 +EDGE2 7851 7051 0.0223058 0.015945 0.0131004 1 0 1 1 0 0 +EDGE2 7851 7770 -0.971073 0.00049442 1.59186 1 0 1 1 0 0 +EDGE2 7851 7810 -0.902483 0.00551846 -1.55694 1 0 1 1 0 0 +EDGE2 7851 7830 -1.05592 0.0407705 -1.59069 1 0 1 1 0 0 +EDGE2 7851 7850 -0.9901 -0.0472141 -1.60787 1 0 1 1 0 0 +EDGE2 7851 7790 -0.991824 -0.0730151 1.57476 1 0 1 1 0 0 +EDGE2 7851 7010 -1.08004 0.065029 1.57219 1 0 1 1 0 0 +EDGE2 7851 7030 -1.12158 -0.0551087 1.57359 1 0 1 1 0 0 +EDGE2 7851 7050 -0.972077 0.00920141 1.57009 1 0 1 1 0 0 +EDGE2 7852 7813 1.00103 -0.00426365 0.00232006 1 0 1 1 0 0 +EDGE2 7852 7833 0.994942 0.0334791 -0.0278393 1 0 1 1 0 0 +EDGE2 7852 7052 0.037633 -0.0330654 0.0333678 1 0 1 1 0 0 +EDGE2 7852 7832 0.00806831 0.0214111 0.0377904 1 0 1 1 0 0 +EDGE2 7852 7053 1.00204 0.0607456 0.00698147 1 0 1 1 0 0 +EDGE2 7852 7812 0.0166266 0.0709814 0.00740505 1 0 1 1 0 0 +EDGE2 7852 7811 -0.969815 0.0169203 0.00100602 1 0 1 1 0 0 +EDGE2 7852 7831 -1.00656 -0.0248785 0.00228699 1 0 1 1 0 0 +EDGE2 7852 7851 -1.00908 -0.0144246 0.00235015 1 0 1 1 0 0 +EDGE2 7852 7051 -1.0888 -0.0084471 -0.00627648 1 0 1 1 0 0 +EDGE2 7853 7813 0.0681688 -0.0149295 -0.02234 1 0 1 1 0 0 +EDGE2 7853 7834 0.961873 -0.0301636 0.0186156 1 0 1 1 0 0 +EDGE2 7853 7054 0.997734 0.0178981 -0.0203939 1 0 1 1 0 0 +EDGE2 7853 7814 0.9783 -0.0257122 0.0122643 1 0 1 1 0 0 +EDGE2 7853 7833 -0.0227535 -0.0275477 0.0250977 1 0 1 1 0 0 +EDGE2 7853 7052 -0.99545 0.057519 0.0160302 1 0 1 1 0 0 +EDGE2 7853 7832 -0.99414 -0.0820219 0.0231281 1 0 1 1 0 0 +EDGE2 7853 7852 -1.01812 -0.0170738 -0.0391145 1 0 1 1 0 0 +EDGE2 7853 7053 -0.000270028 0.0402382 0.026014 1 0 1 1 0 0 +EDGE2 7853 7812 -1.04355 0.0722473 0.0216006 1 0 1 1 0 0 +EDGE2 7854 7813 -1.08631 -0.0281989 0.0269825 1 0 1 1 0 0 +EDGE2 7854 7834 0.0708919 -0.100975 0.0251594 1 0 1 1 0 0 +EDGE2 7854 7055 0.952606 -0.0156677 -0.00518213 1 0 1 1 0 0 +EDGE2 7854 7815 1.19991 -0.0339721 -0.00493832 1 0 1 1 0 0 +EDGE2 7854 7835 0.995715 -0.0677098 -0.0103323 1 0 1 1 0 0 +EDGE2 7854 7853 -0.963906 -0.0682357 -0.0151245 1 0 1 1 0 0 +EDGE2 7854 7054 -0.00712537 -0.0739565 0.0196256 1 0 1 1 0 0 +EDGE2 7854 7814 0.0108165 -0.0402535 0.0264659 1 0 1 1 0 0 +EDGE2 7854 7833 -1.02362 0.00288322 0.00208244 1 0 1 1 0 0 +EDGE2 7854 7053 -1.09191 -0.0302648 0.0035693 1 0 1 1 0 0 +EDGE2 7855 7836 -0.014284 0.997297 1.5665 1 0 1 1 0 0 +EDGE2 7855 7056 -0.0189251 0.98307 1.58849 1 0 1 1 0 0 +EDGE2 7855 7816 0.0646077 1.01286 1.57651 1 0 1 1 0 0 +EDGE2 7855 7834 -0.983099 0.119547 -0.0173435 1 0 1 1 0 0 +EDGE2 7855 7055 -0.0265039 -0.0111915 -0.0130018 1 0 1 1 0 0 +EDGE2 7855 7815 -0.0194238 -0.0395893 -0.0198907 1 0 1 1 0 0 +EDGE2 7855 7835 -0.0289404 0.0419733 0.015287 1 0 1 1 0 0 +EDGE2 7855 7854 -0.935852 -0.0528292 0.0275674 1 0 1 1 0 0 +EDGE2 7855 7054 -1.07251 0.0148297 0.0228275 1 0 1 1 0 0 +EDGE2 7855 7814 -0.936858 -0.0487309 0.0418336 1 0 1 1 0 0 +EDGE2 7856 7855 -0.983126 0.0173645 1.57321 1 0 1 1 0 0 +EDGE2 7856 7055 -0.981506 -0.00660086 1.57437 1 0 1 1 0 0 +EDGE2 7856 7815 -1.0316 -0.0228434 1.59268 1 0 1 1 0 0 +EDGE2 7856 7835 -0.96367 0.0142535 1.562 1 0 1 1 0 0 +EDGE2 7857 7856 -1.04854 -0.0709211 -0.00815895 1 0 1 1 0 0 +EDGE2 7858 7857 -1.07503 0.0300085 -0.00921609 1 0 1 1 0 0 +EDGE2 7859 7858 -0.96823 -0.000155464 0.0178143 1 0 1 1 0 0 +EDGE2 7859 7240 1.05659 -0.0417448 -3.13869 1 0 1 1 0 0 +EDGE2 7859 7760 0.952039 -0.0951129 -3.12811 1 0 1 1 0 0 +EDGE2 7860 7859 -0.959336 -0.0471927 0.0196319 1 0 1 1 0 0 +EDGE2 7860 7241 -0.059459 1.0241 1.57375 1 0 1 1 0 0 +EDGE2 7860 7240 0.00913618 0.0282501 -3.11982 1 0 1 1 0 0 +EDGE2 7860 7760 0.0176415 0.0089553 -3.17505 1 0 1 1 0 0 +EDGE2 7860 7761 -0.0177924 -1.07443 -1.60054 1 0 1 1 0 0 +EDGE2 7860 7239 0.972992 -0.0716354 -3.14299 1 0 1 1 0 0 +EDGE2 7860 7759 0.878275 0.11403 -3.14512 1 0 1 1 0 0 +EDGE2 7861 7242 0.959762 -0.0143691 -0.00784239 1 0 1 1 0 0 +EDGE2 7861 7241 0.00477621 0.0981689 -0.00321309 1 0 1 1 0 0 +EDGE2 7861 7240 -1.03231 -0.0735372 1.56965 1 0 1 1 0 0 +EDGE2 7861 7760 -0.968406 -0.0396581 1.58029 1 0 1 1 0 0 +EDGE2 7861 7860 -0.97715 0.00674402 -1.58944 1 0 1 1 0 0 +EDGE2 7862 7243 1.02205 0.0229933 -0.015804 1 0 1 1 0 0 +EDGE2 7862 7861 -1.0755 0.0897946 0.0111841 1 0 1 1 0 0 +EDGE2 7862 7242 -0.0295854 0.0225216 0.0210279 1 0 1 1 0 0 +EDGE2 7862 7241 -1.08474 0.0572114 0.00273034 1 0 1 1 0 0 +EDGE2 7863 7244 1.00751 0.0101365 0.0140244 1 0 1 1 0 0 +EDGE2 7863 7862 -0.892096 -0.0122608 0.0075371 1 0 1 1 0 0 +EDGE2 7863 7243 -0.0979867 0.110102 -0.00707548 1 0 1 1 0 0 +EDGE2 7863 7242 -0.90606 0.063736 0.0214823 1 0 1 1 0 0 +EDGE2 7864 7244 0.100737 -0.11289 -0.0168769 1 0 1 1 0 0 +EDGE2 7864 7245 1.06943 0.0531086 0.00105347 1 0 1 1 0 0 +EDGE2 7864 7243 -1.06619 0.0303313 -0.0064482 1 0 1 1 0 0 +EDGE2 7864 7863 -1.13973 0.0541901 0.0211063 1 0 1 1 0 0 +EDGE2 7865 7244 -1.02742 -0.0559581 0.00923712 1 0 1 1 0 0 +EDGE2 7865 7246 -0.015682 1.04838 1.57847 1 0 1 1 0 0 +EDGE2 7865 7245 -0.0596777 0.0367228 0.0254245 1 0 1 1 0 0 +EDGE2 7865 7864 -0.964902 0.0728873 -0.0557263 1 0 1 1 0 0 +EDGE2 7866 7247 1.02356 -0.0584138 -0.00104945 1 0 1 1 0 0 +EDGE2 7866 7246 -0.0828301 0.00898134 -0.0103573 1 0 1 1 0 0 +EDGE2 7866 7865 -0.996509 -0.0485895 -1.59089 1 0 1 1 0 0 +EDGE2 7866 7245 -1.02764 0.0785691 -1.59331 1 0 1 1 0 0 +EDGE2 7867 7248 1.03482 -0.0206034 0.0364417 1 0 1 1 0 0 +EDGE2 7867 7247 -0.0107211 -0.00384247 -0.00779443 1 0 1 1 0 0 +EDGE2 7867 7246 -0.988973 -0.00385903 0.00762058 1 0 1 1 0 0 +EDGE2 7867 7866 -0.990731 -0.0474358 0.00232716 1 0 1 1 0 0 +EDGE2 7868 7249 1.04512 -0.0479105 0.000925213 1 0 1 1 0 0 +EDGE2 7868 7248 0.0538559 0.0691219 -0.0132582 1 0 1 1 0 0 +EDGE2 7868 7247 -0.969 -0.0564931 -0.0452192 1 0 1 1 0 0 +EDGE2 7868 7867 -1.00139 -0.0165279 -0.0256673 1 0 1 1 0 0 +EDGE2 7869 7250 0.906215 -0.0278213 0.0175437 1 0 1 1 0 0 +EDGE2 7869 7430 1.02435 0.028199 -3.16592 1 0 1 1 0 0 +EDGE2 7869 7270 1.08918 0.0105364 -3.082 1 0 1 1 0 0 +EDGE2 7869 7110 0.990898 -0.0185771 -3.16803 1 0 1 1 0 0 +EDGE2 7869 7130 1.08089 0.0330099 -3.13948 1 0 1 1 0 0 +EDGE2 7869 7249 -0.0878743 -0.0382921 -0.00911466 1 0 1 1 0 0 +EDGE2 7869 7248 -0.892554 0.0266115 -0.000618181 1 0 1 1 0 0 +EDGE2 7869 7868 -0.970053 -3.66541e-05 -0.0318012 1 0 1 1 0 0 +EDGE2 7870 7131 0.039252 -0.995233 -1.57003 1 0 1 1 0 0 +EDGE2 7870 7271 0.133295 -0.984633 -1.57489 1 0 1 1 0 0 +EDGE2 7870 7431 -0.0675816 -0.945672 -1.55929 1 0 1 1 0 0 +EDGE2 7870 7251 -0.0649662 -0.988248 -1.55535 1 0 1 1 0 0 +EDGE2 7870 7111 0.0163369 -0.979573 -1.58015 1 0 1 1 0 0 +EDGE2 7870 7129 1.016 0.024028 -3.13959 1 0 1 1 0 0 +EDGE2 7870 7269 0.918261 0.100708 -3.15491 1 0 1 1 0 0 +EDGE2 7870 7429 1.0067 -0.089902 -3.1819 1 0 1 1 0 0 +EDGE2 7870 7109 0.91919 0.0458739 -3.13642 1 0 1 1 0 0 +EDGE2 7870 7250 0.0568572 0.151756 0.00774499 1 0 1 1 0 0 +EDGE2 7870 7430 -0.101657 0.0296647 -3.16945 1 0 1 1 0 0 +EDGE2 7870 7270 -0.0424202 -0.0163962 -3.14259 1 0 1 1 0 0 +EDGE2 7870 7110 0.00884067 0.016497 -3.1314 1 0 1 1 0 0 +EDGE2 7870 7130 -0.0631873 -0.0229669 -3.17096 1 0 1 1 0 0 +EDGE2 7870 7249 -0.9748 -0.0282938 0.0118178 1 0 1 1 0 0 +EDGE2 7870 7869 -0.952234 0.0378891 -0.00753693 1 0 1 1 0 0 +EDGE2 7871 7250 -0.991317 -0.123991 -1.5499 1 0 1 1 0 0 +EDGE2 7871 7430 -1.00778 -0.0790026 1.56345 1 0 1 1 0 0 +EDGE2 7871 7870 -0.927539 -0.00391398 -1.57297 1 0 1 1 0 0 +EDGE2 7871 7270 -1.0558 0.00250481 1.58338 1 0 1 1 0 0 +EDGE2 7871 7110 -0.961327 -0.0295237 1.58447 1 0 1 1 0 0 +EDGE2 7871 7130 -1.00278 0.0338968 1.59141 1 0 1 1 0 0 +EDGE2 7872 7871 -0.976895 -0.000476669 0.0458422 1 0 1 1 0 0 +EDGE2 7873 7872 -1.02859 0.0511548 -0.0386253 1 0 1 1 0 0 +EDGE2 7874 7855 0.96174 -0.0818705 -3.14269 1 0 1 1 0 0 +EDGE2 7874 7873 -0.976277 0.0507373 -0.00866979 1 0 1 1 0 0 +EDGE2 7874 7055 1.00215 -0.00779542 -3.19342 1 0 1 1 0 0 +EDGE2 7874 7815 1.02072 0.0158466 -3.14626 1 0 1 1 0 0 +EDGE2 7874 7835 0.876733 -0.0241971 -3.15999 1 0 1 1 0 0 +EDGE2 7875 7855 -0.104588 -0.00920554 -3.12621 1 0 1 1 0 0 +EDGE2 7875 7836 -0.0686793 -1.00397 -1.56503 1 0 1 1 0 0 +EDGE2 7875 7056 -0.0318743 -1.03405 -1.55108 1 0 1 1 0 0 +EDGE2 7875 7816 -0.164313 -0.996385 -1.57518 1 0 1 1 0 0 +EDGE2 7875 7874 -1.0399 0.0234029 -0.0178407 1 0 1 1 0 0 +EDGE2 7875 7834 0.978763 0.0519993 -3.15781 1 0 1 1 0 0 +EDGE2 7875 7055 -0.0462315 -0.0112469 -3.14027 1 0 1 1 0 0 +EDGE2 7875 7815 0.0334012 0.0682154 -3.1473 1 0 1 1 0 0 +EDGE2 7875 7835 -0.020931 -0.00437206 -3.13171 1 0 1 1 0 0 +EDGE2 7875 7854 0.99207 0.00309269 -3.10961 1 0 1 1 0 0 +EDGE2 7875 7054 1.01418 0.0921238 -3.11031 1 0 1 1 0 0 +EDGE2 7875 7814 1.00465 0.00218704 -3.12683 1 0 1 1 0 0 +EDGE2 7875 7856 0.0137226 0.991843 1.55368 1 0 1 1 0 0 +EDGE2 7876 7855 -1.06872 -0.0339584 1.56255 1 0 1 1 0 0 +EDGE2 7876 7875 -0.946763 -0.0191743 -1.55571 1 0 1 1 0 0 +EDGE2 7876 7055 -1.04416 -0.0734979 1.55413 1 0 1 1 0 0 +EDGE2 7876 7815 -1.02197 0.0248852 1.5898 1 0 1 1 0 0 +EDGE2 7876 7835 -0.991742 0.0132972 1.536 1 0 1 1 0 0 +EDGE2 7876 7856 0.0374034 0.00967965 0.0148597 1 0 1 1 0 0 +EDGE2 7876 7857 1.06153 -0.0746766 0.00140289 1 0 1 1 0 0 +EDGE2 7877 7876 -1.02252 -0.100376 -0.000777181 1 0 1 1 0 0 +EDGE2 7877 7856 -1.08088 -0.00103646 -0.00600358 1 0 1 1 0 0 +EDGE2 7877 7858 0.962422 0.0303968 0.0103943 1 0 1 1 0 0 +EDGE2 7877 7857 0.00129611 -0.00410442 -0.0104074 1 0 1 1 0 0 +EDGE2 7878 7858 0.0989834 0.141357 -0.00562491 1 0 1 1 0 0 +EDGE2 7878 7857 -1.04505 -0.000169862 -0.00646605 1 0 1 1 0 0 +EDGE2 7878 7877 -1.01067 0.0678966 0.0156296 1 0 1 1 0 0 +EDGE2 7878 7859 0.891809 -0.0120186 -0.0072382 1 0 1 1 0 0 +EDGE2 7879 7858 -1.0515 0.0690137 -0.0157107 1 0 1 1 0 0 +EDGE2 7879 7878 -1.01654 -0.00226433 0.0479755 1 0 1 1 0 0 +EDGE2 7879 7859 0.06191 0.0208669 0.0293277 1 0 1 1 0 0 +EDGE2 7879 7240 0.919815 -0.0112022 -3.15501 1 0 1 1 0 0 +EDGE2 7879 7760 1.04022 0.0245961 -3.17486 1 0 1 1 0 0 +EDGE2 7879 7860 0.948842 -0.00392586 0.0150266 1 0 1 1 0 0 +EDGE2 7880 7859 -0.987886 0.0171259 -0.00429359 1 0 1 1 0 0 +EDGE2 7880 7879 -1.04937 -0.00344638 -0.0210263 1 0 1 1 0 0 +EDGE2 7880 7861 -0.052847 0.994504 1.54553 1 0 1 1 0 0 +EDGE2 7880 7241 0.0819237 0.93254 1.59493 1 0 1 1 0 0 +EDGE2 7880 7240 0.0346965 0.0332175 -3.13717 1 0 1 1 0 0 +EDGE2 7880 7760 0.0479013 0.0334916 -3.13015 1 0 1 1 0 0 +EDGE2 7880 7860 0.00150262 -0.0584563 0.00404093 1 0 1 1 0 0 +EDGE2 7880 7761 -0.0255942 -1.07919 -1.5472 1 0 1 1 0 0 +EDGE2 7880 7239 1.08588 0.193344 -3.10787 1 0 1 1 0 0 +EDGE2 7880 7759 0.943151 -0.116492 -3.17768 1 0 1 1 0 0 +EDGE2 7881 7880 -1.05785 -0.061173 -1.55641 1 0 1 1 0 0 +EDGE2 7881 7862 1.02868 -0.0547352 0.0501746 1 0 1 1 0 0 +EDGE2 7881 7861 -0.0295177 0.0433567 0.0209791 1 0 1 1 0 0 +EDGE2 7881 7242 0.919797 -0.000303907 -0.00550582 1 0 1 1 0 0 +EDGE2 7881 7241 -0.0118913 0.00162061 0.0173587 1 0 1 1 0 0 +EDGE2 7881 7240 -0.893947 -0.0353191 1.56418 1 0 1 1 0 0 +EDGE2 7881 7760 -0.999299 0.0687145 1.56284 1 0 1 1 0 0 +EDGE2 7881 7860 -1.04382 -0.0595268 -1.5978 1 0 1 1 0 0 +EDGE2 7882 7862 -0.0194841 -0.00965064 0.00866435 1 0 1 1 0 0 +EDGE2 7882 7243 1.05021 -0.00373782 0.0229199 1 0 1 1 0 0 +EDGE2 7882 7863 0.986328 0.0176454 -0.0243974 1 0 1 1 0 0 +EDGE2 7882 7861 -0.962298 -0.0191071 -0.0135409 1 0 1 1 0 0 +EDGE2 7882 7881 -0.924587 -0.0135599 0.0199028 1 0 1 1 0 0 +EDGE2 7882 7242 -0.0508785 0.0510674 0.0199453 1 0 1 1 0 0 +EDGE2 7882 7241 -1.01643 0.0488397 -0.0224316 1 0 1 1 0 0 +EDGE2 7883 7244 0.939953 -0.0140354 0.0361558 1 0 1 1 0 0 +EDGE2 7883 7864 0.989978 0.015488 -0.0214196 1 0 1 1 0 0 +EDGE2 7883 7862 -0.968683 0.0917368 -0.0128299 1 0 1 1 0 0 +EDGE2 7883 7243 -0.0778208 0.0326526 0.000288407 1 0 1 1 0 0 +EDGE2 7883 7863 -0.016273 -0.09988 -0.00531794 1 0 1 1 0 0 +EDGE2 7883 7882 -1.0306 -2.87163e-05 0.0120753 1 0 1 1 0 0 +EDGE2 7883 7242 -1.03038 0.0242897 0.0116596 1 0 1 1 0 0 +EDGE2 7884 7244 -0.0629199 -0.00485225 0.00556246 1 0 1 1 0 0 +EDGE2 7884 7865 1.02503 0.136605 -0.0158114 1 0 1 1 0 0 +EDGE2 7884 7245 0.982732 -0.0141479 -0.0422283 1 0 1 1 0 0 +EDGE2 7884 7864 0.054043 -0.0361178 -0.0185791 1 0 1 1 0 0 +EDGE2 7884 7243 -0.989704 -0.0190127 0.0172637 1 0 1 1 0 0 +EDGE2 7884 7863 -0.964872 -0.0465566 0.00184731 1 0 1 1 0 0 +EDGE2 7884 7883 -1.02215 0.0389388 -0.00823857 1 0 1 1 0 0 +EDGE2 7885 7244 -1.03595 0.0372021 0.0285955 1 0 1 1 0 0 +EDGE2 7885 7884 -0.99756 -0.0570014 0.00326684 1 0 1 1 0 0 +EDGE2 7885 7246 0.0125511 0.97207 1.53989 1 0 1 1 0 0 +EDGE2 7885 7866 -0.0190545 0.985151 1.58537 1 0 1 1 0 0 +EDGE2 7885 7865 -0.0530497 0.0666216 0.00586103 1 0 1 1 0 0 +EDGE2 7885 7245 -0.0162239 -0.00463404 -0.0296855 1 0 1 1 0 0 +EDGE2 7885 7864 -1.06104 0.0235158 -0.0205788 1 0 1 1 0 0 +EDGE2 7886 7865 -1.00618 0.030454 1.58343 1 0 1 1 0 0 +EDGE2 7886 7885 -1.13566 -0.0251703 1.58677 1 0 1 1 0 0 +EDGE2 7886 7245 -0.918317 0.00148719 1.53704 1 0 1 1 0 0 +EDGE2 7887 7886 -0.945974 0.0219427 0.0254804 1 0 1 1 0 0 +EDGE2 7888 7887 -1.0057 0.0315152 -0.00551413 1 0 1 1 0 0 +EDGE2 7889 7888 -1.04886 -0.0653779 -0.00205751 1 0 1 1 0 0 +EDGE2 7889 7750 0.921057 0.00855081 -3.14282 1 0 1 1 0 0 +EDGE2 7889 7230 1.00359 -0.0664882 -3.15975 1 0 1 1 0 0 +EDGE2 7890 7889 -0.984094 0.0521721 0.0192744 1 0 1 1 0 0 +EDGE2 7890 7750 0.0525651 -0.0172893 -3.17056 1 0 1 1 0 0 +EDGE2 7890 7229 0.970633 0.0523091 -3.12588 1 0 1 1 0 0 +EDGE2 7890 7749 0.9012 0.0442101 -3.14825 1 0 1 1 0 0 +EDGE2 7890 7230 -0.0531811 0.016031 -3.10495 1 0 1 1 0 0 +EDGE2 7890 7231 -0.0139955 -0.987586 -1.59111 1 0 1 1 0 0 +EDGE2 7890 7751 -0.00112515 -0.970033 -1.56417 1 0 1 1 0 0 +EDGE2 7891 7750 -1.03737 -0.00445304 1.57607 1 0 1 1 0 0 +EDGE2 7891 7890 -1.05359 -0.00842776 -1.53865 1 0 1 1 0 0 +EDGE2 7891 7230 -0.977175 -0.0626582 1.58894 1 0 1 1 0 0 +EDGE2 7892 7891 -0.944264 0.00362039 -0.0105216 1 0 1 1 0 0 +EDGE2 7893 7892 -1.01098 -0.0358074 -0.00226676 1 0 1 1 0 0 +EDGE2 7894 7195 0.991379 -0.0103587 -3.15031 1 0 1 1 0 0 +EDGE2 7894 7893 -0.957115 0.0176135 0.00253152 1 0 1 1 0 0 +EDGE2 7895 7194 0.991559 -0.0204287 -3.10275 1 0 1 1 0 0 +EDGE2 7895 7195 0.0636971 -0.0299225 -3.12107 1 0 1 1 0 0 +EDGE2 7895 7894 -1.07852 0.0272948 0.0252318 1 0 1 1 0 0 +EDGE2 7895 7196 -0.0154492 -1.00938 -1.57749 1 0 1 1 0 0 +EDGE2 7896 7895 -1.00394 -0.00475068 -1.55832 1 0 1 1 0 0 +EDGE2 7896 7195 -1.0358 0.0307315 1.5686 1 0 1 1 0 0 +EDGE2 7897 7896 -0.957275 -0.0460648 -0.0108403 1 0 1 1 0 0 +EDGE2 7898 7897 -0.965652 0.0369479 0.0138561 1 0 1 1 0 0 +EDGE2 7899 7320 1.00353 -0.0111924 -3.10774 1 0 1 1 0 0 +EDGE2 7899 7360 0.987879 0.00950248 -3.15259 1 0 1 1 0 0 +EDGE2 7899 7340 0.921563 -0.0113993 -3.17214 1 0 1 1 0 0 +EDGE2 7899 7180 0.964322 0.00427183 -3.13801 1 0 1 1 0 0 +EDGE2 7899 7280 1.05794 -0.0140031 -3.15128 1 0 1 1 0 0 +EDGE2 7899 7300 1.00024 0.0609805 -3.12287 1 0 1 1 0 0 +EDGE2 7899 7898 -1.03663 0.000242299 -0.000982379 1 0 1 1 0 0 +EDGE2 7900 7341 -0.00486429 -0.994789 -1.55307 1 0 1 1 0 0 +EDGE2 7900 7339 0.950317 0.0666154 -3.18222 1 0 1 1 0 0 +EDGE2 7900 7359 1.04302 -0.0471969 -3.13487 1 0 1 1 0 0 +EDGE2 7900 7279 0.999254 0.0164032 -3.13783 1 0 1 1 0 0 +EDGE2 7900 7299 0.954945 -0.00013193 -3.17051 1 0 1 1 0 0 +EDGE2 7900 7319 1.03124 0.0727856 -3.14546 1 0 1 1 0 0 +EDGE2 7900 7179 1.00179 0.0116301 -3.14341 1 0 1 1 0 0 +EDGE2 7900 7361 -0.0343181 -1.04587 -1.59966 1 0 1 1 0 0 +EDGE2 7900 7320 -0.00666882 -0.0132202 -3.1563 1 0 1 1 0 0 +EDGE2 7900 7281 0.0244755 -1.00959 -1.56314 1 0 1 1 0 0 +EDGE2 7900 7301 0.0190482 -0.943517 -1.54294 1 0 1 1 0 0 +EDGE2 7900 7321 0.0410458 -0.991124 -1.57897 1 0 1 1 0 0 +EDGE2 7900 7181 -0.00186446 -1.01389 -1.57009 1 0 1 1 0 0 +EDGE2 7900 7360 0.0260069 0.0292574 -3.13375 1 0 1 1 0 0 +EDGE2 7900 7340 0.0246691 0.0545353 -3.14745 1 0 1 1 0 0 +EDGE2 7900 7180 0.0285629 0.0757595 -3.12532 1 0 1 1 0 0 +EDGE2 7900 7280 0.00220831 -0.0342417 -3.13616 1 0 1 1 0 0 +EDGE2 7900 7300 -0.0605944 0.0922246 -3.10633 1 0 1 1 0 0 +EDGE2 7900 7899 -0.969508 -0.0475296 -0.00125784 1 0 1 1 0 0 +EDGE2 7901 7320 -0.946372 0.0433553 1.54578 1 0 1 1 0 0 +EDGE2 7901 7360 -1.01436 -0.046312 1.58528 1 0 1 1 0 0 +EDGE2 7901 7900 -1.00785 -0.033386 -1.5507 1 0 1 1 0 0 +EDGE2 7901 7340 -0.959866 -0.00201527 1.57329 1 0 1 1 0 0 +EDGE2 7901 7180 -0.948422 0.0483277 1.56712 1 0 1 1 0 0 +EDGE2 7901 7280 -1.02801 0.0303698 1.57547 1 0 1 1 0 0 +EDGE2 7901 7300 -0.967808 0.0128117 1.57138 1 0 1 1 0 0 +EDGE2 7902 7901 -0.961157 0.0247437 0.000559758 1 0 1 1 0 0 +EDGE2 7903 7902 -0.920178 -0.0112478 0.0096771 1 0 1 1 0 0 +EDGE2 7904 7903 -1.05471 -0.0702125 0.0296867 1 0 1 1 0 0 +EDGE2 7904 7865 0.986378 -0.0601306 -3.12087 1 0 1 1 0 0 +EDGE2 7904 7885 0.988408 -0.0602637 -3.13387 1 0 1 1 0 0 +EDGE2 7904 7245 1.07327 0.0888529 -3.15151 1 0 1 1 0 0 +EDGE2 7905 7244 0.958104 0.0319657 -3.15314 1 0 1 1 0 0 +EDGE2 7905 7884 1.04537 0.0070283 -3.12171 1 0 1 1 0 0 +EDGE2 7905 7246 -0.00707576 -1.01761 -1.58661 1 0 1 1 0 0 +EDGE2 7905 7866 0.0447163 -0.992802 -1.55431 1 0 1 1 0 0 +EDGE2 7905 7904 -0.985625 0.0848625 0.00213001 1 0 1 1 0 0 +EDGE2 7905 7865 0.0657272 0.00400666 -3.13479 1 0 1 1 0 0 +EDGE2 7905 7885 -0.0133438 -0.0314552 -3.14913 1 0 1 1 0 0 +EDGE2 7905 7245 0.0158798 0.0698712 -3.12224 1 0 1 1 0 0 +EDGE2 7905 7864 0.893213 -0.0121491 -3.12852 1 0 1 1 0 0 +EDGE2 7905 7886 -0.0726989 0.904735 1.61591 1 0 1 1 0 0 +EDGE2 7906 7865 -0.941004 -0.0434627 1.55523 1 0 1 1 0 0 +EDGE2 7906 7885 -1.07517 0.0554084 1.56007 1 0 1 1 0 0 +EDGE2 7906 7905 -0.976985 -0.0174207 -1.56389 1 0 1 1 0 0 +EDGE2 7906 7245 -1.03526 -0.0125222 1.54665 1 0 1 1 0 0 +EDGE2 7906 7887 0.954812 0.0370948 0.0244018 1 0 1 1 0 0 +EDGE2 7906 7886 -0.0658322 0.0816236 0.010001 1 0 1 1 0 0 +EDGE2 7907 7887 -0.032938 -0.0394094 0.0170254 1 0 1 1 0 0 +EDGE2 7907 7886 -0.997169 0.0523109 -0.0181624 1 0 1 1 0 0 +EDGE2 7907 7906 -1.00517 -0.0227202 0.00178168 1 0 1 1 0 0 +EDGE2 7907 7888 0.918631 0.00253306 0.0122057 1 0 1 1 0 0 +EDGE2 7908 7887 -1.03422 -0.0126376 -0.0236727 1 0 1 1 0 0 +EDGE2 7908 7907 -1.04193 0.0163799 -0.021675 1 0 1 1 0 0 +EDGE2 7908 7888 -0.0119142 -0.0599603 -0.0273692 1 0 1 1 0 0 +EDGE2 7908 7889 0.989852 -0.0938567 0.0287391 1 0 1 1 0 0 +EDGE2 7909 7888 -0.95201 0.0524045 0.0104044 1 0 1 1 0 0 +EDGE2 7909 7908 -1.01094 0.0629664 0.0099637 1 0 1 1 0 0 +EDGE2 7909 7889 -0.0162408 0.0673665 0.0170346 1 0 1 1 0 0 +EDGE2 7909 7750 0.970968 -0.0885821 -3.09963 1 0 1 1 0 0 +EDGE2 7909 7890 1.06445 0.0787594 0.0121885 1 0 1 1 0 0 +EDGE2 7909 7230 1.05009 -0.0197586 -3.16485 1 0 1 1 0 0 +EDGE2 7910 7909 -0.98418 -0.0274399 0.0177947 1 0 1 1 0 0 +EDGE2 7910 7889 -1.01514 0.0308009 -0.0155756 1 0 1 1 0 0 +EDGE2 7910 7750 0.0564877 -0.00772912 -3.15196 1 0 1 1 0 0 +EDGE2 7910 7890 0.00846216 -0.0555308 0.00870728 1 0 1 1 0 0 +EDGE2 7910 7891 -0.0701179 0.95346 1.55086 1 0 1 1 0 0 +EDGE2 7910 7229 1.03819 -0.115782 -3.14231 1 0 1 1 0 0 +EDGE2 7910 7749 1.02025 0.0485642 -3.11054 1 0 1 1 0 0 +EDGE2 7910 7230 -0.059862 -0.0596751 -3.12857 1 0 1 1 0 0 +EDGE2 7910 7231 -0.022454 -1.01198 -1.5544 1 0 1 1 0 0 +EDGE2 7910 7751 -0.0582538 -0.981026 -1.58639 1 0 1 1 0 0 +EDGE2 7911 7750 -1.03985 -0.0932205 1.57301 1 0 1 1 0 0 +EDGE2 7911 7890 -0.967488 0.030902 -1.58372 1 0 1 1 0 0 +EDGE2 7911 7891 -0.0868874 0.0217321 -0.0113372 1 0 1 1 0 0 +EDGE2 7911 7892 1.04436 0.0301495 0.0135618 1 0 1 1 0 0 +EDGE2 7911 7910 -0.978907 0.0219189 -1.54286 1 0 1 1 0 0 +EDGE2 7911 7230 -0.938359 -0.0223616 1.56272 1 0 1 1 0 0 +EDGE2 7912 7893 0.965812 0.00186119 -0.0189276 1 0 1 1 0 0 +EDGE2 7912 7891 -0.949088 4.96698e-06 -0.0352433 1 0 1 1 0 0 +EDGE2 7912 7911 -1.06252 -0.00688984 -0.0016849 1 0 1 1 0 0 +EDGE2 7912 7892 -0.0197933 0.0280015 0.0218992 1 0 1 1 0 0 +EDGE2 7913 7912 -0.93147 0.000134971 -0.00669288 1 0 1 1 0 0 +EDGE2 7913 7894 0.981491 0.0211122 0.00506395 1 0 1 1 0 0 +EDGE2 7913 7893 -0.0212971 0.0159955 -0.0217398 1 0 1 1 0 0 +EDGE2 7913 7892 -0.934874 -0.0012263 -0.0497707 1 0 1 1 0 0 +EDGE2 7914 7895 0.891515 0.00751224 0.00618293 1 0 1 1 0 0 +EDGE2 7914 7195 1.05712 0.0294719 -3.14943 1 0 1 1 0 0 +EDGE2 7914 7913 -1.09593 0.0613709 -0.0104079 1 0 1 1 0 0 +EDGE2 7914 7894 -0.00481477 0.0147838 0.00846006 1 0 1 1 0 0 +EDGE2 7914 7893 -1.01282 0.0148514 -0.00966556 1 0 1 1 0 0 +EDGE2 7915 7194 1.01226 0.0264234 -3.13355 1 0 1 1 0 0 +EDGE2 7915 7914 -0.975904 -0.0199014 -0.0012398 1 0 1 1 0 0 +EDGE2 7915 7895 -0.0282231 -0.0411191 0.0102878 1 0 1 1 0 0 +EDGE2 7915 7896 0.0656715 1.03707 1.60928 1 0 1 1 0 0 +EDGE2 7915 7195 -0.028505 0.00126144 -3.11805 1 0 1 1 0 0 +EDGE2 7915 7894 -1.08795 0.0135754 0.00276965 1 0 1 1 0 0 +EDGE2 7915 7196 -0.0153015 -0.991105 -1.57569 1 0 1 1 0 0 +EDGE2 7916 7897 0.971072 0.037777 -0.0237855 1 0 1 1 0 0 +EDGE2 7916 7895 -0.909158 0.00815817 -1.54659 1 0 1 1 0 0 +EDGE2 7916 7915 -0.972677 -0.0786669 -1.58022 1 0 1 1 0 0 +EDGE2 7916 7896 0.0090186 0.0904594 -0.000272849 1 0 1 1 0 0 +EDGE2 7916 7195 -1.05756 0.0503228 1.55365 1 0 1 1 0 0 +EDGE2 7917 7916 -0.966206 -0.0126669 -0.0200132 1 0 1 1 0 0 +EDGE2 7917 7897 -0.0111747 0.0053941 0.0608893 1 0 1 1 0 0 +EDGE2 7917 7898 1.0111 0.0336532 0.0252699 1 0 1 1 0 0 +EDGE2 7917 7896 -0.978112 -0.0231737 -0.0124727 1 0 1 1 0 0 +EDGE2 7918 7897 -0.998404 -0.049349 0.0153015 1 0 1 1 0 0 +EDGE2 7918 7898 0.12221 -0.028872 -0.022519 1 0 1 1 0 0 +EDGE2 7918 7899 0.92471 -0.0600525 -0.0437903 1 0 1 1 0 0 +EDGE2 7918 7917 -1.08042 0.0362203 -0.00183467 1 0 1 1 0 0 +EDGE2 7919 7320 0.973814 -0.0264 -3.13017 1 0 1 1 0 0 +EDGE2 7919 7360 1.10616 0.0353606 -3.12208 1 0 1 1 0 0 +EDGE2 7919 7900 1.01597 -0.00410822 -0.033511 1 0 1 1 0 0 +EDGE2 7919 7340 1.02739 0.0578433 -3.17637 1 0 1 1 0 0 +EDGE2 7919 7180 1.05475 0.0783637 -3.19498 1 0 1 1 0 0 +EDGE2 7919 7280 1.05303 -0.0212922 -3.15001 1 0 1 1 0 0 +EDGE2 7919 7300 0.954786 -0.0783456 -3.12735 1 0 1 1 0 0 +EDGE2 7919 7898 -1.0274 0.0346024 -0.0112574 1 0 1 1 0 0 +EDGE2 7919 7918 -1.03055 0.000946815 0.0087993 1 0 1 1 0 0 +EDGE2 7919 7899 -0.0341694 -0.0189741 -0.0579749 1 0 1 1 0 0 +EDGE2 7920 7341 -0.0511952 -1.16866 -1.58577 1 0 1 1 0 0 +EDGE2 7920 7339 0.970355 -0.0494435 -3.16011 1 0 1 1 0 0 +EDGE2 7920 7359 1.01543 -0.0620746 -3.11178 1 0 1 1 0 0 +EDGE2 7920 7279 0.976163 -0.0125579 -3.15565 1 0 1 1 0 0 +EDGE2 7920 7299 0.964247 -0.0303233 -3.11099 1 0 1 1 0 0 +EDGE2 7920 7319 0.982534 0.071756 -3.16078 1 0 1 1 0 0 +EDGE2 7920 7179 1.00656 -0.007225 -3.13535 1 0 1 1 0 0 +EDGE2 7920 7361 0.0657676 -1.09846 -1.57586 1 0 1 1 0 0 +EDGE2 7920 7919 -0.964095 0.00882214 -0.0410449 1 0 1 1 0 0 +EDGE2 7920 7320 -0.0414854 -0.0551942 -3.10672 1 0 1 1 0 0 +EDGE2 7920 7281 -0.0223466 -0.959715 -1.59177 1 0 1 1 0 0 +EDGE2 7920 7301 -0.0354464 -1.02546 -1.54211 1 0 1 1 0 0 +EDGE2 7920 7321 -0.0275179 -1.06838 -1.53393 1 0 1 1 0 0 +EDGE2 7920 7181 -0.114394 -1.00949 -1.57485 1 0 1 1 0 0 +EDGE2 7920 7360 -0.000928563 0.000643331 -3.13817 1 0 1 1 0 0 +EDGE2 7920 7900 0.0353563 0.0329651 0.0230776 1 0 1 1 0 0 +EDGE2 7920 7340 0.0117227 -0.0390111 -3.11663 1 0 1 1 0 0 +EDGE2 7920 7901 -0.0311754 0.998649 1.52433 1 0 1 1 0 0 +EDGE2 7920 7180 0.00765093 -0.00458436 -3.14152 1 0 1 1 0 0 +EDGE2 7920 7280 -0.013626 0.0132403 -3.13402 1 0 1 1 0 0 +EDGE2 7920 7300 0.0691026 0.0690735 -3.15695 1 0 1 1 0 0 +EDGE2 7920 7899 -0.954244 0.131124 -0.00408808 1 0 1 1 0 0 +EDGE2 7921 7341 -0.0599737 -0.00199479 0.0206676 1 0 1 1 0 0 +EDGE2 7921 7282 0.955021 0.0895452 -0.0402246 1 0 1 1 0 0 +EDGE2 7921 7322 0.899858 0.0810931 0.00488883 1 0 1 1 0 0 +EDGE2 7921 7342 0.945045 -0.0465478 -0.0121556 1 0 1 1 0 0 +EDGE2 7921 7362 1.08117 0.0307783 0.0334888 1 0 1 1 0 0 +EDGE2 7921 7302 1.03092 -0.00291662 0.0194699 1 0 1 1 0 0 +EDGE2 7921 7182 0.994867 -0.0421005 -0.0169695 1 0 1 1 0 0 +EDGE2 7921 7361 0.034092 0.033034 0.00138663 1 0 1 1 0 0 +EDGE2 7921 7320 -0.971173 0.133148 -1.54548 1 0 1 1 0 0 +EDGE2 7921 7281 0.0149263 -0.0580397 0.016554 1 0 1 1 0 0 +EDGE2 7921 7301 0.0727474 0.0304481 0.0204505 1 0 1 1 0 0 +EDGE2 7921 7321 0.0301094 0.11038 -0.0110876 1 0 1 1 0 0 +EDGE2 7921 7181 0.0264806 0.01088 0.0186585 1 0 1 1 0 0 +EDGE2 7921 7360 -0.999396 -0.0128462 -1.5322 1 0 1 1 0 0 +EDGE2 7921 7900 -1.01572 -0.0383407 1.56372 1 0 1 1 0 0 +EDGE2 7921 7920 -0.871981 -0.0531651 1.549 1 0 1 1 0 0 +EDGE2 7921 7340 -1.02418 -0.0120534 -1.5457 1 0 1 1 0 0 +EDGE2 7921 7180 -0.909384 0.00321072 -1.54367 1 0 1 1 0 0 +EDGE2 7921 7280 -1.04096 0.0146618 -1.55948 1 0 1 1 0 0 +EDGE2 7921 7300 -1.07097 0.0431164 -1.59517 1 0 1 1 0 0 +EDGE2 7922 7341 -1.034 0.0463036 -0.00963435 1 0 1 1 0 0 +EDGE2 7922 7343 1.04901 -0.030907 0.0349985 1 0 1 1 0 0 +EDGE2 7922 7363 0.997118 -0.116714 0.0133235 1 0 1 1 0 0 +EDGE2 7922 7283 1.0707 -0.035844 -0.0396319 1 0 1 1 0 0 +EDGE2 7922 7303 1.06485 -0.0326638 0.00186465 1 0 1 1 0 0 +EDGE2 7922 7323 1.0921 -0.0206554 -0.00650742 1 0 1 1 0 0 +EDGE2 7922 7183 0.968921 0.0449934 -0.0172492 1 0 1 1 0 0 +EDGE2 7922 7282 0.0619509 -0.00390592 -0.00943832 1 0 1 1 0 0 +EDGE2 7922 7322 -0.000386434 0.032921 0.031156 1 0 1 1 0 0 +EDGE2 7922 7342 -0.102537 0.0991111 0.0116333 1 0 1 1 0 0 +EDGE2 7922 7362 -0.0552761 0.0413894 -0.0171511 1 0 1 1 0 0 +EDGE2 7922 7302 -0.0390238 0.0434983 -0.00723408 1 0 1 1 0 0 +EDGE2 7922 7921 -0.94434 0.0881783 -0.0160243 1 0 1 1 0 0 +EDGE2 7922 7182 -0.0158427 -0.0902484 -0.00748433 1 0 1 1 0 0 +EDGE2 7922 7361 -0.961815 0.0430309 0.000877668 1 0 1 1 0 0 +EDGE2 7922 7281 -1.07355 0.0253714 -0.0128102 1 0 1 1 0 0 +EDGE2 7922 7301 -0.956869 -0.00853594 -0.0350464 1 0 1 1 0 0 +EDGE2 7922 7321 -0.999306 -0.0330506 -0.0311093 1 0 1 1 0 0 +EDGE2 7922 7181 -1.05643 -0.00847022 0.00307688 1 0 1 1 0 0 +EDGE2 7923 7304 1.08598 -0.038085 0.0142186 1 0 1 1 0 0 +EDGE2 7923 7344 1.03906 -0.0276625 0.0160462 1 0 1 1 0 0 +EDGE2 7923 7364 1.05268 0.0322432 -0.032544 1 0 1 1 0 0 +EDGE2 7923 7324 1.10085 0.029243 -0.000666839 1 0 1 1 0 0 +EDGE2 7923 7922 -0.964351 -0.0194822 -0.00376672 1 0 1 1 0 0 +EDGE2 7923 7343 0.00945089 -0.0046289 0.0392233 1 0 1 1 0 0 +EDGE2 7923 7184 1.05784 0.0601826 0.0137874 1 0 1 1 0 0 +EDGE2 7923 7284 1.03071 0.0944599 -0.0308797 1 0 1 1 0 0 +EDGE2 7923 7363 0.0182714 0.0463652 6.77104e-05 1 0 1 1 0 0 +EDGE2 7923 7283 -0.0166554 0.0430252 -0.0511208 1 0 1 1 0 0 +EDGE2 7923 7303 0.015901 0.0936737 -0.0211312 1 0 1 1 0 0 +EDGE2 7923 7323 0.0736356 0.0132173 -0.0146051 1 0 1 1 0 0 +EDGE2 7923 7183 0.0288731 -0.00832316 -0.0146131 1 0 1 1 0 0 +EDGE2 7923 7282 -0.941348 -0.092506 -0.011063 1 0 1 1 0 0 +EDGE2 7923 7322 -0.961117 0.047203 0.000938404 1 0 1 1 0 0 +EDGE2 7923 7342 -1.04163 -0.00836424 0.00975402 1 0 1 1 0 0 +EDGE2 7923 7362 -0.945921 0.00902176 0.00387034 1 0 1 1 0 0 +EDGE2 7923 7302 -1.01307 0.0262104 -0.00155826 1 0 1 1 0 0 +EDGE2 7923 7182 -0.988882 0.083052 -0.000727794 1 0 1 1 0 0 +EDGE2 7924 7525 1.04569 -0.0119724 -3.09128 1 0 1 1 0 0 +EDGE2 7924 7285 0.963341 -0.0326066 -0.0198412 1 0 1 1 0 0 +EDGE2 7924 7325 0.9629 -0.0445504 0.0200074 1 0 1 1 0 0 +EDGE2 7924 7345 0.961627 -0.00837013 0.0195176 1 0 1 1 0 0 +EDGE2 7924 7365 0.974484 0.044705 -0.00906867 1 0 1 1 0 0 +EDGE2 7924 7305 0.965265 0.0932155 0.00114751 1 0 1 1 0 0 +EDGE2 7924 7185 0.94475 -0.0836355 -0.0502402 1 0 1 1 0 0 +EDGE2 7924 7304 0.0386451 0.0321042 0.0162298 1 0 1 1 0 0 +EDGE2 7924 7344 0.0212587 -0.071571 0.0278051 1 0 1 1 0 0 +EDGE2 7924 7364 0.0269701 -0.0527837 0.0504005 1 0 1 1 0 0 +EDGE2 7924 7324 0.068769 0.0431615 -0.0331858 1 0 1 1 0 0 +EDGE2 7924 7343 -1.01837 -0.0139852 0.0120663 1 0 1 1 0 0 +EDGE2 7924 7923 -0.975961 0.0247893 -0.0202641 1 0 1 1 0 0 +EDGE2 7924 7184 0.0353399 0.00407153 -0.0567251 1 0 1 1 0 0 +EDGE2 7924 7284 0.0391444 -0.0469344 -0.0364063 1 0 1 1 0 0 +EDGE2 7924 7363 -0.990941 -0.0619084 -0.0285301 1 0 1 1 0 0 +EDGE2 7924 7283 -0.989641 -0.0532154 -0.00269954 1 0 1 1 0 0 +EDGE2 7924 7303 -1.03304 0.0433757 -0.00445958 1 0 1 1 0 0 +EDGE2 7924 7323 -0.988111 0.00336109 -0.0112608 1 0 1 1 0 0 +EDGE2 7924 7183 -0.990533 0.00996624 0.00306977 1 0 1 1 0 0 +EDGE2 7925 7326 0.0157676 1.0572 1.56777 1 0 1 1 0 0 +EDGE2 7925 7526 -0.0520334 0.958798 1.56895 1 0 1 1 0 0 +EDGE2 7925 7346 -0.0182511 1.05755 1.59079 1 0 1 1 0 0 +EDGE2 7925 7286 0.103685 1.04577 1.5639 1 0 1 1 0 0 +EDGE2 7925 7306 0.085493 1.00266 1.57712 1 0 1 1 0 0 +EDGE2 7925 7525 0.153135 -0.0484773 -3.169 1 0 1 1 0 0 +EDGE2 7925 7524 0.945021 -0.0530157 -3.15864 1 0 1 1 0 0 +EDGE2 7925 7285 -0.0268728 0.0109084 0.0243353 1 0 1 1 0 0 +EDGE2 7925 7325 -0.040366 0.0738854 -0.0351973 1 0 1 1 0 0 +EDGE2 7925 7345 0.0347414 -0.0681868 0.00570085 1 0 1 1 0 0 +EDGE2 7925 7365 -0.0062955 0.0160869 -0.000846021 1 0 1 1 0 0 +EDGE2 7925 7305 0.083149 -0.02012 0.014367 1 0 1 1 0 0 +EDGE2 7925 7366 0.0090454 -1.0543 -1.55815 1 0 1 1 0 0 +EDGE2 7925 7185 0.0508058 -0.0784567 0.0259378 1 0 1 1 0 0 +EDGE2 7925 7186 0.0446853 -0.968678 -1.58583 1 0 1 1 0 0 +EDGE2 7925 7304 -1.03453 0.0230973 -0.000215634 1 0 1 1 0 0 +EDGE2 7925 7344 -1.06259 0.024008 0.00102788 1 0 1 1 0 0 +EDGE2 7925 7364 -0.960393 0.0208063 0.000199365 1 0 1 1 0 0 +EDGE2 7925 7924 -0.962333 0.0144137 0.0177413 1 0 1 1 0 0 +EDGE2 7925 7324 -0.966955 -0.0675138 -0.015111 1 0 1 1 0 0 +EDGE2 7925 7184 -1.04563 0.0112258 -0.0258253 1 0 1 1 0 0 +EDGE2 7925 7284 -0.894596 -0.045487 -0.0207617 1 0 1 1 0 0 +EDGE2 7926 7326 -0.0350129 0.0360791 0.00931685 1 0 1 1 0 0 +EDGE2 7926 7527 1.00198 -0.0568764 0.00759118 1 0 1 1 0 0 +EDGE2 7926 7307 1.03459 -0.0801639 0.028933 1 0 1 1 0 0 +EDGE2 7926 7327 1.00622 0.0250428 0.00783001 1 0 1 1 0 0 +EDGE2 7926 7347 1.03105 0.0166898 0.00797595 1 0 1 1 0 0 +EDGE2 7926 7287 1.06047 0.0272554 -0.0155607 1 0 1 1 0 0 +EDGE2 7926 7526 -0.0814654 0.106402 -0.0245931 1 0 1 1 0 0 +EDGE2 7926 7346 0.0147727 -0.0480384 -0.00828403 1 0 1 1 0 0 +EDGE2 7926 7286 0.0143111 -0.0476302 0.0231627 1 0 1 1 0 0 +EDGE2 7926 7306 0.0546754 0.0493164 -0.0254895 1 0 1 1 0 0 +EDGE2 7926 7525 -0.930523 -0.0664952 1.59085 1 0 1 1 0 0 +EDGE2 7926 7925 -1.10919 0.0223644 -1.57323 1 0 1 1 0 0 +EDGE2 7926 7285 -1.03596 0.0500894 -1.57251 1 0 1 1 0 0 +EDGE2 7926 7325 -1.03097 0.0106088 -1.56733 1 0 1 1 0 0 +EDGE2 7926 7345 -0.99257 -0.0430181 -1.57721 1 0 1 1 0 0 +EDGE2 7926 7365 -0.98592 -0.0811851 -1.5581 1 0 1 1 0 0 +EDGE2 7926 7305 -1.04873 0.0856905 -1.57743 1 0 1 1 0 0 +EDGE2 7926 7185 -0.967714 -0.0569433 -1.57597 1 0 1 1 0 0 +EDGE2 7927 7326 -0.995684 0.0292656 0.00370344 1 0 1 1 0 0 +EDGE2 7927 7527 0.0447996 -0.0023554 -0.0206028 1 0 1 1 0 0 +EDGE2 7927 7308 1.08158 -0.045737 -0.008221 1 0 1 1 0 0 +EDGE2 7927 7348 0.980517 0.00735484 -0.00259238 1 0 1 1 0 0 +EDGE2 7927 7528 1.07549 -0.0944261 -0.0222709 1 0 1 1 0 0 +EDGE2 7927 7328 0.962162 -0.00922772 0.00833522 1 0 1 1 0 0 +EDGE2 7927 7288 1.08333 0.0471416 -0.00444635 1 0 1 1 0 0 +EDGE2 7927 7307 0.0129217 0.00277868 -0.00777908 1 0 1 1 0 0 +EDGE2 7927 7327 0.00872556 0.0476739 0.00787549 1 0 1 1 0 0 +EDGE2 7927 7347 0.0816313 0.108817 0.0480564 1 0 1 1 0 0 +EDGE2 7927 7287 -0.115419 0.0217332 0.023495 1 0 1 1 0 0 +EDGE2 7927 7526 -1.06134 -0.125604 -0.0202479 1 0 1 1 0 0 +EDGE2 7927 7926 -0.933727 0.0690163 0.0111604 1 0 1 1 0 0 +EDGE2 7927 7346 -0.920766 -0.149713 -0.0182321 1 0 1 1 0 0 +EDGE2 7927 7286 -1.01706 -0.0520371 0.0299406 1 0 1 1 0 0 +EDGE2 7927 7306 -0.983524 -0.0605103 0.0136534 1 0 1 1 0 0 +EDGE2 7928 7329 0.96257 -0.0550763 -0.0192211 1 0 1 1 0 0 +EDGE2 7928 7529 1.03258 -0.0669577 0.0124219 1 0 1 1 0 0 +EDGE2 7928 7349 0.972988 -0.000435451 0.00391826 1 0 1 1 0 0 +EDGE2 7928 7289 1.04202 -0.0666556 0.0187679 1 0 1 1 0 0 +EDGE2 7928 7309 1.08327 -0.0640019 -0.0257925 1 0 1 1 0 0 +EDGE2 7928 7527 -0.968656 0.0303053 -0.0248116 1 0 1 1 0 0 +EDGE2 7928 7308 0.0269332 -0.0515454 0.0198749 1 0 1 1 0 0 +EDGE2 7928 7348 -0.0386398 0.0512327 -0.00256654 1 0 1 1 0 0 +EDGE2 7928 7528 0.022062 0.00125638 -0.00700179 1 0 1 1 0 0 +EDGE2 7928 7328 0.00260792 -0.032695 0.0286598 1 0 1 1 0 0 +EDGE2 7928 7288 0.038508 0.0334294 -0.0027947 1 0 1 1 0 0 +EDGE2 7928 7927 -1.01164 0.042373 -0.0187627 1 0 1 1 0 0 +EDGE2 7928 7307 -0.983324 -0.000122298 0.045902 1 0 1 1 0 0 +EDGE2 7928 7327 -1.02346 0.0672277 0.0184602 1 0 1 1 0 0 +EDGE2 7928 7347 -1.01926 0.0664969 -0.0318408 1 0 1 1 0 0 +EDGE2 7928 7287 -1.0052 -0.0323055 0.0200663 1 0 1 1 0 0 +EDGE2 7929 7530 1.05801 -0.0403587 -0.029014 1 0 1 1 0 0 +EDGE2 7929 7310 0.982231 -0.0106738 0.0121597 1 0 1 1 0 0 +EDGE2 7929 7350 0.997269 0.00541498 -0.00934731 1 0 1 1 0 0 +EDGE2 7929 7450 1.05585 0.0784478 -3.16164 1 0 1 1 0 0 +EDGE2 7929 7510 0.988132 0.0211518 -3.14701 1 0 1 1 0 0 +EDGE2 7929 7330 0.950711 -0.053191 -0.00820226 1 0 1 1 0 0 +EDGE2 7929 7170 1.03636 -0.00359561 -3.09623 1 0 1 1 0 0 +EDGE2 7929 7290 1.09294 -0.0364158 0.0104709 1 0 1 1 0 0 +EDGE2 7929 7329 0.0166136 0.0893958 -0.00856523 1 0 1 1 0 0 +EDGE2 7929 7529 0.00135489 0.0163858 0.00266428 1 0 1 1 0 0 +EDGE2 7929 7349 0.0414101 -0.0155259 0.026906 1 0 1 1 0 0 +EDGE2 7929 7289 0.0462995 -0.0346029 0.0342458 1 0 1 1 0 0 +EDGE2 7929 7309 -0.0544298 0.0961544 -0.00194014 1 0 1 1 0 0 +EDGE2 7929 7308 -1.04983 -0.0161207 -0.0216465 1 0 1 1 0 0 +EDGE2 7929 7348 -1.09116 -0.0429239 -0.0138026 1 0 1 1 0 0 +EDGE2 7929 7528 -1.07244 -0.00937234 0.0105061 1 0 1 1 0 0 +EDGE2 7929 7928 -1.07208 0.0681143 -0.0251608 1 0 1 1 0 0 +EDGE2 7929 7328 -1.02601 -0.0795738 -0.0242144 1 0 1 1 0 0 +EDGE2 7929 7288 -1.04179 -0.0586349 0.0114218 1 0 1 1 0 0 +EDGE2 7930 7449 1.06115 -0.023439 -3.12243 1 0 1 1 0 0 +EDGE2 7930 7509 1.00235 0.0857023 -3.13061 1 0 1 1 0 0 +EDGE2 7930 7169 0.892911 -0.0449193 -3.13478 1 0 1 1 0 0 +EDGE2 7930 7530 -0.0151346 -0.0101768 0.0138656 1 0 1 1 0 0 +EDGE2 7930 7511 0.00996249 -1.06085 -1.56832 1 0 1 1 0 0 +EDGE2 7930 7531 -0.0177816 -1.04398 -1.53987 1 0 1 1 0 0 +EDGE2 7930 7451 0.0847174 -0.995465 -1.58926 1 0 1 1 0 0 +EDGE2 7930 7310 0.0195294 -0.0183812 -0.0378788 1 0 1 1 0 0 +EDGE2 7930 7350 0.0314816 0.126069 -0.00774369 1 0 1 1 0 0 +EDGE2 7930 7450 -0.0246733 -0.0564683 -3.10459 1 0 1 1 0 0 +EDGE2 7930 7510 0.00977834 0.0410849 -3.16875 1 0 1 1 0 0 +EDGE2 7930 7330 0.0445754 0.0735598 -0.0020007 1 0 1 1 0 0 +EDGE2 7930 7170 0.0229204 0.0527421 -3.12236 1 0 1 1 0 0 +EDGE2 7930 7290 -0.00913126 0.0182436 -0.0067203 1 0 1 1 0 0 +EDGE2 7930 7329 -1.0539 -0.00518148 0.0113605 1 0 1 1 0 0 +EDGE2 7930 7529 -0.997684 -0.00276039 0.0081423 1 0 1 1 0 0 +EDGE2 7930 7929 -1.0559 0.0255395 0.041066 1 0 1 1 0 0 +EDGE2 7930 7349 -0.980999 0.104063 0.0125043 1 0 1 1 0 0 +EDGE2 7930 7289 -0.958702 0.0540541 0.0201443 1 0 1 1 0 0 +EDGE2 7930 7309 -0.900095 -0.0104184 0.0142008 1 0 1 1 0 0 +EDGE2 7930 7291 0.0200355 1.08469 1.56674 1 0 1 1 0 0 +EDGE2 7930 7331 -0.0710848 0.971738 1.55149 1 0 1 1 0 0 +EDGE2 7930 7351 -0.0295755 0.979677 1.58792 1 0 1 1 0 0 +EDGE2 7930 7311 -0.0358358 0.98326 1.58096 1 0 1 1 0 0 +EDGE2 7930 7171 0.0405608 1.06157 1.53817 1 0 1 1 0 0 +EDGE2 7931 7530 -1.04107 0.0357928 1.58435 1 0 1 1 0 0 +EDGE2 7931 7512 1.02552 0.0176688 -0.0103798 1 0 1 1 0 0 +EDGE2 7931 7532 0.999406 -0.0921431 -0.00437355 1 0 1 1 0 0 +EDGE2 7931 7511 -0.0175455 -0.00451163 -0.00653088 1 0 1 1 0 0 +EDGE2 7931 7452 0.977425 -0.0676666 0.00441055 1 0 1 1 0 0 +EDGE2 7931 7531 -0.00383005 0.0583881 0.022595 1 0 1 1 0 0 +EDGE2 7931 7451 0.0212399 0.0648731 0.000713379 1 0 1 1 0 0 +EDGE2 7931 7930 -0.981977 0.066665 1.55791 1 0 1 1 0 0 +EDGE2 7931 7310 -0.984539 -0.0399821 1.5523 1 0 1 1 0 0 +EDGE2 7931 7350 -0.988865 -0.00976766 1.53552 1 0 1 1 0 0 +EDGE2 7931 7450 -0.952683 -0.0262685 -1.6159 1 0 1 1 0 0 +EDGE2 7931 7510 -0.998412 -0.0381736 -1.54998 1 0 1 1 0 0 +EDGE2 7931 7330 -1.05274 0.00330587 1.56959 1 0 1 1 0 0 +EDGE2 7931 7170 -0.977678 0.00298375 -1.54373 1 0 1 1 0 0 +EDGE2 7931 7290 -0.926453 -0.0615049 1.58779 1 0 1 1 0 0 +EDGE2 7932 7512 -0.00626703 -0.133773 -0.0128949 1 0 1 1 0 0 +EDGE2 7932 7513 0.915326 0.0204424 -0.00277025 1 0 1 1 0 0 +EDGE2 7932 7533 0.929321 0.00282544 -0.0303475 1 0 1 1 0 0 +EDGE2 7932 7453 0.997339 0.0962585 -0.00923417 1 0 1 1 0 0 +EDGE2 7932 7532 -0.000999456 -0.0471484 0.0169616 1 0 1 1 0 0 +EDGE2 7932 7511 -0.981188 -0.0478585 0.0114879 1 0 1 1 0 0 +EDGE2 7932 7931 -0.946618 -0.118535 0.0158765 1 0 1 1 0 0 +EDGE2 7932 7452 -0.0140841 0.0312127 -0.0102607 1 0 1 1 0 0 +EDGE2 7932 7531 -1.00136 0.0167901 -0.0128659 1 0 1 1 0 0 +EDGE2 7932 7451 -1.01655 0.0373724 0.0162609 1 0 1 1 0 0 +EDGE2 7933 7514 1.00694 -0.0832118 0.00131153 1 0 1 1 0 0 +EDGE2 7933 7534 0.95928 -0.0570712 -0.0104255 1 0 1 1 0 0 +EDGE2 7933 7512 -1.04188 0.0370255 0.0292435 1 0 1 1 0 0 +EDGE2 7933 7513 0.0202295 -0.0961379 -0.0184384 1 0 1 1 0 0 +EDGE2 7933 7454 0.877415 -0.00707085 0.0115636 1 0 1 1 0 0 +EDGE2 7933 7533 -0.00427333 0.0171851 0.00238381 1 0 1 1 0 0 +EDGE2 7933 7932 -1.01958 0.0433991 0.0204379 1 0 1 1 0 0 +EDGE2 7933 7453 -0.0329829 -0.0202714 0.0205104 1 0 1 1 0 0 +EDGE2 7933 7532 -0.998081 -0.0533289 0.0204443 1 0 1 1 0 0 +EDGE2 7933 7452 -1.05792 0.015425 0.0173643 1 0 1 1 0 0 +EDGE2 7934 7535 1.03929 0.0456177 0.0105672 1 0 1 1 0 0 +EDGE2 7934 7575 0.977418 0.0021768 -3.13797 1 0 1 1 0 0 +EDGE2 7934 7555 0.923902 -0.00337776 -3.12126 1 0 1 1 0 0 +EDGE2 7934 7455 0.919329 0.0370226 -0.00169518 1 0 1 1 0 0 +EDGE2 7934 7475 0.990339 -0.0782363 -3.15316 1 0 1 1 0 0 +EDGE2 7934 7515 0.963631 0.026903 0.0126823 1 0 1 1 0 0 +EDGE2 7934 7395 0.985849 0.0192786 -3.11532 1 0 1 1 0 0 +EDGE2 7934 7514 0.0245834 0.0308035 -0.0323709 1 0 1 1 0 0 +EDGE2 7934 7534 -0.0366585 0.019555 0.0130112 1 0 1 1 0 0 +EDGE2 7934 7513 -1.01186 -0.0451867 0.00732678 1 0 1 1 0 0 +EDGE2 7934 7933 -1.02169 0.00484896 0.0201784 1 0 1 1 0 0 +EDGE2 7934 7454 0.0111059 0.0482515 0.00566332 1 0 1 1 0 0 +EDGE2 7934 7533 -1.07745 -0.0262463 0.0123237 1 0 1 1 0 0 +EDGE2 7934 7453 -1.10245 0.0423947 -0.00652379 1 0 1 1 0 0 +EDGE2 7935 7476 0.0592619 1.04936 1.58611 1 0 1 1 0 0 +EDGE2 7935 7396 0.00706119 0.994728 1.53762 1 0 1 1 0 0 +EDGE2 7935 7394 0.987647 -0.0352887 -3.1535 1 0 1 1 0 0 +EDGE2 7935 7554 1.08411 -0.101986 -3.16568 1 0 1 1 0 0 +EDGE2 7935 7574 1.08298 0.0250276 -3.1473 1 0 1 1 0 0 +EDGE2 7935 7474 0.989441 -0.0402517 -3.15742 1 0 1 1 0 0 +EDGE2 7935 7535 0.0583498 0.0330595 0.0153347 1 0 1 1 0 0 +EDGE2 7935 7575 -0.0108972 -0.0310058 -3.10753 1 0 1 1 0 0 +EDGE2 7935 7555 -0.0401999 -0.0614976 -3.1602 1 0 1 1 0 0 +EDGE2 7935 7455 0.0745536 0.0198037 -0.0093786 1 0 1 1 0 0 +EDGE2 7935 7475 -0.0170895 -0.0602044 -3.13429 1 0 1 1 0 0 +EDGE2 7935 7515 0.00511172 -0.00254941 -0.0222785 1 0 1 1 0 0 +EDGE2 7935 7395 0.0142775 0.0287385 -3.17239 1 0 1 1 0 0 +EDGE2 7935 7576 -0.00986444 -1.05454 -1.54899 1 0 1 1 0 0 +EDGE2 7935 7516 0.0790529 -0.891028 -1.5521 1 0 1 1 0 0 +EDGE2 7935 7536 0.0693028 -1.0533 -1.5681 1 0 1 1 0 0 +EDGE2 7935 7556 0.0195306 -1.03281 -1.56656 1 0 1 1 0 0 +EDGE2 7935 7456 0.035717 -0.964225 -1.60218 1 0 1 1 0 0 +EDGE2 7935 7514 -0.917347 -0.0728836 -0.0247304 1 0 1 1 0 0 +EDGE2 7935 7934 -1.02756 -0.014183 0.0242427 1 0 1 1 0 0 +EDGE2 7935 7534 -1.06854 -0.00256441 -0.0125099 1 0 1 1 0 0 +EDGE2 7935 7454 -0.986753 -0.0490206 -0.0131371 1 0 1 1 0 0 +EDGE2 7936 7537 0.970294 -0.02873 0.0279557 1 0 1 1 0 0 +EDGE2 7936 7535 -0.901004 0.159701 1.58694 1 0 1 1 0 0 +EDGE2 7936 7575 -1.01851 -0.0312536 -1.58684 1 0 1 1 0 0 +EDGE2 7936 7935 -1.05688 0.043597 1.60055 1 0 1 1 0 0 +EDGE2 7936 7555 -1.0182 -0.0154424 -1.53712 1 0 1 1 0 0 +EDGE2 7936 7455 -1.10192 0.0848083 1.57496 1 0 1 1 0 0 +EDGE2 7936 7475 -0.982502 0.0154758 -1.57912 1 0 1 1 0 0 +EDGE2 7936 7515 -1.02783 0.0744178 1.54826 1 0 1 1 0 0 +EDGE2 7936 7395 -1.09104 0.0338202 -1.55256 1 0 1 1 0 0 +EDGE2 7936 7576 0.0224564 -0.0753125 -0.0352027 1 0 1 1 0 0 +EDGE2 7936 7516 -0.0351805 -0.0021706 0.0117748 1 0 1 1 0 0 +EDGE2 7936 7536 0.115285 0.0729558 -0.0140438 1 0 1 1 0 0 +EDGE2 7936 7556 0.0305598 0.07211 0.00337967 1 0 1 1 0 0 +EDGE2 7936 7456 0.0011637 0.0732779 0.00440653 1 0 1 1 0 0 +EDGE2 7936 7577 1.02266 -0.0761414 -0.0340979 1 0 1 1 0 0 +EDGE2 7936 7557 1.00716 0.0341755 -0.0232547 1 0 1 1 0 0 +EDGE2 7936 7517 0.991147 0.00579415 -0.00475292 1 0 1 1 0 0 +EDGE2 7936 7457 0.98789 -0.139222 -0.0283235 1 0 1 1 0 0 +EDGE2 7937 7537 -0.0240408 0.0454713 0.0050141 1 0 1 1 0 0 +EDGE2 7937 7576 -1.00277 -0.00473114 0.0151834 1 0 1 1 0 0 +EDGE2 7937 7936 -1.03861 -0.0318645 -0.00613123 1 0 1 1 0 0 +EDGE2 7937 7516 -0.915516 -0.0784397 0.00164411 1 0 1 1 0 0 +EDGE2 7937 7536 -1.0882 -0.0795225 -0.0138353 1 0 1 1 0 0 +EDGE2 7937 7556 -0.984735 -0.049824 -0.0119635 1 0 1 1 0 0 +EDGE2 7937 7456 -0.935917 0.0276048 0.0448709 1 0 1 1 0 0 +EDGE2 7937 7577 -0.0357585 -0.0485276 -0.0176727 1 0 1 1 0 0 +EDGE2 7937 7557 0.035082 0.0252314 0.0142838 1 0 1 1 0 0 +EDGE2 7937 7517 -0.0438251 -0.0214827 -0.0291337 1 0 1 1 0 0 +EDGE2 7937 7457 0.0519908 -0.015978 0.00859695 1 0 1 1 0 0 +EDGE2 7937 7458 0.999821 -0.0604923 -0.0265862 1 0 1 1 0 0 +EDGE2 7937 7538 1.02623 -0.0276977 -0.012802 1 0 1 1 0 0 +EDGE2 7937 7558 0.986173 0.0309871 -0.028136 1 0 1 1 0 0 +EDGE2 7937 7578 1.05437 0.0497149 -0.0131777 1 0 1 1 0 0 +EDGE2 7937 7518 0.949633 -0.061542 0.00482981 1 0 1 1 0 0 +EDGE2 7938 7537 -0.906164 -0.0243584 -0.0287197 1 0 1 1 0 0 +EDGE2 7938 7577 -0.959396 -0.00114265 -0.000423718 1 0 1 1 0 0 +EDGE2 7938 7937 -0.956507 0.0277476 0.00388571 1 0 1 1 0 0 +EDGE2 7938 7557 -1.03578 0.0522953 0.00378507 1 0 1 1 0 0 +EDGE2 7938 7517 -1.01303 0.0354258 0.0211049 1 0 1 1 0 0 +EDGE2 7938 7457 -0.954297 -0.0622511 -0.0117295 1 0 1 1 0 0 +EDGE2 7938 7539 0.977901 0.00427575 -0.00551017 1 0 1 1 0 0 +EDGE2 7938 7458 -0.0245436 -0.0472593 0.000628863 1 0 1 1 0 0 +EDGE2 7938 7538 0.0501438 0.00413019 -0.00165223 1 0 1 1 0 0 +EDGE2 7938 7558 -0.024348 0.00489701 0.0142241 1 0 1 1 0 0 +EDGE2 7938 7578 -0.0221597 0.0281364 0.00513547 1 0 1 1 0 0 +EDGE2 7938 7518 0.0228139 -0.00604303 -0.00731868 1 0 1 1 0 0 +EDGE2 7938 7579 1.02357 0.0193569 -0.00254475 1 0 1 1 0 0 +EDGE2 7938 7559 1.01527 -0.0191599 -0.0318416 1 0 1 1 0 0 +EDGE2 7938 7459 1.00309 0.0271258 0.0155277 1 0 1 1 0 0 +EDGE2 7938 7519 1.00101 -0.0703728 0.00390114 1 0 1 1 0 0 +EDGE2 7939 7520 0.985359 0.0402202 -0.0464167 1 0 1 1 0 0 +EDGE2 7939 7539 -0.0140858 -0.0278011 -0.0107135 1 0 1 1 0 0 +EDGE2 7939 7938 -1.04025 -0.0418299 -0.00183089 1 0 1 1 0 0 +EDGE2 7939 7458 -0.901977 0.019742 0.000378304 1 0 1 1 0 0 +EDGE2 7939 7538 -0.955977 -0.0144256 0.0255116 1 0 1 1 0 0 +EDGE2 7939 7558 -0.945885 -0.0181989 -0.0333386 1 0 1 1 0 0 +EDGE2 7939 7578 -1.08945 0.0597271 -0.0327988 1 0 1 1 0 0 +EDGE2 7939 7518 -0.958028 -0.060942 0.00282471 1 0 1 1 0 0 +EDGE2 7939 7579 -0.0716426 -0.00284043 0.0313101 1 0 1 1 0 0 +EDGE2 7939 7559 -0.0229252 0.0432566 -0.014966 1 0 1 1 0 0 +EDGE2 7939 7459 -0.0147313 -0.0423053 -0.0232836 1 0 1 1 0 0 +EDGE2 7939 7519 0.0554123 -0.0604898 0.0167827 1 0 1 1 0 0 +EDGE2 7939 7540 0.971134 -0.00164424 0.00399078 1 0 1 1 0 0 +EDGE2 7939 7580 1.02646 -0.0467144 0.0226283 1 0 1 1 0 0 +EDGE2 7939 7560 1.01649 -0.0515503 0.0134365 1 0 1 1 0 0 +EDGE2 7939 7380 0.893052 0.0857469 -3.13769 1 0 1 1 0 0 +EDGE2 7939 7460 0.964654 -0.0565514 0.0469341 1 0 1 1 0 0 +EDGE2 7940 7520 0.0377598 0.000196989 0.0111299 1 0 1 1 0 0 +EDGE2 7940 7539 -0.927286 0.0442508 0.0200362 1 0 1 1 0 0 +EDGE2 7940 7579 -1.0258 0.092413 -0.0107488 1 0 1 1 0 0 +EDGE2 7940 7939 -0.987872 0.0424402 -0.00953477 1 0 1 1 0 0 +EDGE2 7940 7559 -0.995148 -0.00490435 -0.0157795 1 0 1 1 0 0 +EDGE2 7940 7459 -0.918984 -0.0383963 0.0112343 1 0 1 1 0 0 +EDGE2 7940 7519 -0.911617 -0.0709896 -0.02282 1 0 1 1 0 0 +EDGE2 7940 7540 -0.0286387 0.0554969 -0.0048928 1 0 1 1 0 0 +EDGE2 7940 7561 -0.145754 0.960046 1.5828 1 0 1 1 0 0 +EDGE2 7940 7581 0.0479949 0.994075 1.5433 1 0 1 1 0 0 +EDGE2 7940 7381 0.0431462 1.01405 1.55559 1 0 1 1 0 0 +EDGE2 7940 7461 -0.034938 1.03944 1.62014 1 0 1 1 0 0 +EDGE2 7940 7541 -0.00768998 0.983256 1.54471 1 0 1 1 0 0 +EDGE2 7940 7580 0.0519051 0.0573297 -0.00888277 1 0 1 1 0 0 +EDGE2 7940 7560 -0.0290402 0.0233409 0.0212213 1 0 1 1 0 0 +EDGE2 7940 7380 -0.0193872 -0.0113846 -3.15738 1 0 1 1 0 0 +EDGE2 7940 7460 0.0420602 0.0674208 -0.0257079 1 0 1 1 0 0 +EDGE2 7940 7521 0.0255848 -1.01113 -1.57052 1 0 1 1 0 0 +EDGE2 7940 7379 1.00566 -0.0559042 -3.14172 1 0 1 1 0 0 +EDGE2 7941 7520 -0.94884 -0.0190803 1.56519 1 0 1 1 0 0 +EDGE2 7941 7540 -1.00154 0.00452331 1.55671 1 0 1 1 0 0 +EDGE2 7941 7580 -1.03045 0.0222376 1.5723 1 0 1 1 0 0 +EDGE2 7941 7940 -0.918383 -0.0380612 1.5887 1 0 1 1 0 0 +EDGE2 7941 7560 -1.06673 -0.0355082 1.55283 1 0 1 1 0 0 +EDGE2 7941 7522 1.04179 -0.00320071 0.0210794 1 0 1 1 0 0 +EDGE2 7941 7380 -0.940014 0.0482894 -1.56347 1 0 1 1 0 0 +EDGE2 7941 7460 -1.04356 0.034362 1.56445 1 0 1 1 0 0 +EDGE2 7941 7521 -0.00428892 -0.0400993 -0.0202313 1 0 1 1 0 0 +EDGE2 7942 7522 0.0822951 0.0552657 -0.0162435 1 0 1 1 0 0 +EDGE2 7942 7941 -0.910929 -0.00716665 0.00757095 1 0 1 1 0 0 +EDGE2 7942 7521 -0.967013 0.0116245 0.0168994 1 0 1 1 0 0 +EDGE2 7942 7523 1.01125 0.0327676 -0.0380436 1 0 1 1 0 0 +EDGE2 7943 7522 -1.00847 -0.0520911 -0.000892589 1 0 1 1 0 0 +EDGE2 7943 7942 -0.978139 0.042962 -0.00627467 1 0 1 1 0 0 +EDGE2 7943 7523 -0.0201795 0.0348277 -0.0455873 1 0 1 1 0 0 +EDGE2 7943 7524 1.02779 -0.0589426 -0.0117034 1 0 1 1 0 0 +EDGE2 7944 7943 -1.01644 0.0381003 -0.00601772 1 0 1 1 0 0 +EDGE2 7944 7523 -1.00521 -0.0500633 -0.0239928 1 0 1 1 0 0 +EDGE2 7944 7525 1.02906 0.0637435 -0.0205696 1 0 1 1 0 0 +EDGE2 7944 7925 1.00684 0.132111 -3.11981 1 0 1 1 0 0 +EDGE2 7944 7524 0.0756461 0.0212707 0.0480689 1 0 1 1 0 0 +EDGE2 7944 7285 0.968575 0.0975558 -3.11793 1 0 1 1 0 0 +EDGE2 7944 7325 0.912662 -0.00290446 -3.12867 1 0 1 1 0 0 +EDGE2 7944 7345 0.889137 -0.0271841 -3.13758 1 0 1 1 0 0 +EDGE2 7944 7365 0.982086 -0.0289029 -3.15507 1 0 1 1 0 0 +EDGE2 7944 7305 0.950916 -0.066986 -3.14531 1 0 1 1 0 0 +EDGE2 7944 7185 0.967262 0.0116515 -3.17655 1 0 1 1 0 0 +EDGE2 7945 7944 -1.00655 0.0166095 0.00893242 1 0 1 1 0 0 +EDGE2 7945 7326 -0.0985146 -1.03093 -1.57658 1 0 1 1 0 0 +EDGE2 7945 7526 0.0637588 -1.00815 -1.57868 1 0 1 1 0 0 +EDGE2 7945 7926 0.00795857 -1.02891 -1.52831 1 0 1 1 0 0 +EDGE2 7945 7346 0.0104031 -0.979268 -1.56369 1 0 1 1 0 0 +EDGE2 7945 7286 0.0749116 -0.998741 -1.568 1 0 1 1 0 0 +EDGE2 7945 7306 -0.0572258 -1.00276 -1.56312 1 0 1 1 0 0 +EDGE2 7945 7525 -0.138937 0.0273254 0.00126412 1 0 1 1 0 0 +EDGE2 7945 7925 0.0501125 -0.0288943 -3.09026 1 0 1 1 0 0 +EDGE2 7945 7524 -0.953265 -0.13008 -0.00148323 1 0 1 1 0 0 +EDGE2 7945 7285 -0.0823337 -0.0103377 -3.14385 1 0 1 1 0 0 +EDGE2 7945 7325 0.0053135 0.0845869 -3.14768 1 0 1 1 0 0 +EDGE2 7945 7345 -0.050506 0.0626529 -3.14635 1 0 1 1 0 0 +EDGE2 7945 7365 -0.0296815 -0.0908305 -3.10903 1 0 1 1 0 0 +EDGE2 7945 7305 -0.080342 0.0593227 -3.15513 1 0 1 1 0 0 +EDGE2 7945 7366 -0.0258333 0.96721 1.57036 1 0 1 1 0 0 +EDGE2 7945 7185 -0.0459486 -0.0682586 -3.17286 1 0 1 1 0 0 +EDGE2 7945 7186 0.00796415 0.955449 1.55983 1 0 1 1 0 0 +EDGE2 7945 7304 1.033 0.0661143 -3.1631 1 0 1 1 0 0 +EDGE2 7945 7344 1.0236 0.0164343 -3.12636 1 0 1 1 0 0 +EDGE2 7945 7364 1.02436 0.0707492 -3.13243 1 0 1 1 0 0 +EDGE2 7945 7924 0.969717 0.0306038 -3.14401 1 0 1 1 0 0 +EDGE2 7945 7324 0.955298 -0.108133 -3.12392 1 0 1 1 0 0 +EDGE2 7945 7184 0.954454 -0.0323032 -3.15243 1 0 1 1 0 0 +EDGE2 7945 7284 0.913436 -0.00451201 -3.13689 1 0 1 1 0 0 +EDGE2 7946 7326 -0.00990228 0.0289554 0.0212579 1 0 1 1 0 0 +EDGE2 7946 7527 0.95113 0.0770315 -0.0577971 1 0 1 1 0 0 +EDGE2 7946 7927 1.0794 -0.0535493 0.0130268 1 0 1 1 0 0 +EDGE2 7946 7307 1.05307 0.0740085 -0.00733268 1 0 1 1 0 0 +EDGE2 7946 7327 1.09699 0.0107958 -0.0112192 1 0 1 1 0 0 +EDGE2 7946 7347 0.96276 -0.0473518 -0.0220631 1 0 1 1 0 0 +EDGE2 7946 7287 0.939798 -0.064626 -0.0175998 1 0 1 1 0 0 +EDGE2 7946 7526 -0.0778881 -0.059966 0.0103664 1 0 1 1 0 0 +EDGE2 7946 7926 0.00914456 -0.000920061 0.00653784 1 0 1 1 0 0 +EDGE2 7946 7346 -0.0487573 0.0783779 0.0047413 1 0 1 1 0 0 +EDGE2 7946 7286 -0.0294424 -0.0548839 -0.0127529 1 0 1 1 0 0 +EDGE2 7946 7306 -0.0527265 0.0107322 0.0064558 1 0 1 1 0 0 +EDGE2 7946 7525 -1.04429 0.0705756 1.58561 1 0 1 1 0 0 +EDGE2 7946 7925 -0.987227 0.059628 -1.56741 1 0 1 1 0 0 +EDGE2 7946 7945 -1.0935 0.0793188 1.57076 1 0 1 1 0 0 +EDGE2 7946 7285 -0.880327 -0.0369599 -1.58401 1 0 1 1 0 0 +EDGE2 7946 7325 -0.887645 0.0853877 -1.54075 1 0 1 1 0 0 +EDGE2 7946 7345 -1.02718 -0.0134151 -1.57287 1 0 1 1 0 0 +EDGE2 7946 7365 -0.981825 -0.00757927 -1.58979 1 0 1 1 0 0 +EDGE2 7946 7305 -1.0145 -0.0766013 -1.55644 1 0 1 1 0 0 +EDGE2 7946 7185 -1.00659 -0.0549663 -1.56777 1 0 1 1 0 0 +EDGE2 7947 7326 -0.965812 -0.0509874 -0.00581463 1 0 1 1 0 0 +EDGE2 7947 7527 -0.0158748 -0.00599787 0.00213707 1 0 1 1 0 0 +EDGE2 7947 7308 0.959439 0.0322587 0.0209766 1 0 1 1 0 0 +EDGE2 7947 7348 1.02385 -0.0395883 0.033297 1 0 1 1 0 0 +EDGE2 7947 7528 1.03263 -0.0302907 0.0228632 1 0 1 1 0 0 +EDGE2 7947 7928 1.05152 0.0444058 -0.0111162 1 0 1 1 0 0 +EDGE2 7947 7328 0.944887 0.0847969 0.021257 1 0 1 1 0 0 +EDGE2 7947 7288 1.07029 -0.0213169 0.0204391 1 0 1 1 0 0 +EDGE2 7947 7927 -0.000281513 -0.0344098 -0.00532983 1 0 1 1 0 0 +EDGE2 7947 7307 0.00117629 0.046728 0.0137369 1 0 1 1 0 0 +EDGE2 7947 7327 -0.014431 -0.0285601 -0.00763567 1 0 1 1 0 0 +EDGE2 7947 7347 0.0115193 -0.0987369 -0.0138829 1 0 1 1 0 0 +EDGE2 7947 7287 0.0187002 0.0888565 -0.00542681 1 0 1 1 0 0 +EDGE2 7947 7526 -0.94848 -0.0294872 0.00764238 1 0 1 1 0 0 +EDGE2 7947 7926 -1.00588 0.0329654 -0.00905726 1 0 1 1 0 0 +EDGE2 7947 7946 -1.00853 -0.123781 -0.0161127 1 0 1 1 0 0 +EDGE2 7947 7346 -0.963269 -0.0675148 0.00898821 1 0 1 1 0 0 +EDGE2 7947 7286 -0.952609 0.0754777 -0.0152371 1 0 1 1 0 0 +EDGE2 7947 7306 -0.985705 -0.00878792 0.0354405 1 0 1 1 0 0 +EDGE2 7948 7329 1.07471 0.0117347 -0.00614053 1 0 1 1 0 0 +EDGE2 7948 7529 1.08462 -0.0431017 -0.0139608 1 0 1 1 0 0 +EDGE2 7948 7929 1.00881 -0.0288682 0.0133428 1 0 1 1 0 0 +EDGE2 7948 7349 0.965599 -0.0389117 -0.0300084 1 0 1 1 0 0 +EDGE2 7948 7289 1.03801 0.0160788 0.007837 1 0 1 1 0 0 +EDGE2 7948 7309 1.01612 -0.0367119 -0.00497349 1 0 1 1 0 0 +EDGE2 7948 7527 -0.935451 -0.0438176 -0.01833 1 0 1 1 0 0 +EDGE2 7948 7308 -0.00680238 -0.0238754 -0.0223059 1 0 1 1 0 0 +EDGE2 7948 7348 -0.00842564 -0.0988586 0.0236482 1 0 1 1 0 0 +EDGE2 7948 7528 -0.00431005 -0.0465888 -0.00381415 1 0 1 1 0 0 +EDGE2 7948 7928 -0.0136109 0.0830808 0.0154424 1 0 1 1 0 0 +EDGE2 7948 7328 0.0385598 -0.0276317 -0.00915458 1 0 1 1 0 0 +EDGE2 7948 7947 -0.965111 0.0381609 0.0522248 1 0 1 1 0 0 +EDGE2 7948 7288 0.0177961 0.0465415 0.0176032 1 0 1 1 0 0 +EDGE2 7948 7927 -0.964007 0.100782 0.0411377 1 0 1 1 0 0 +EDGE2 7948 7307 -1.06607 -0.0123843 -0.00891662 1 0 1 1 0 0 +EDGE2 7948 7327 -1.00648 -0.00201393 0.00188897 1 0 1 1 0 0 +EDGE2 7948 7347 -0.966289 0.0371258 -0.0126249 1 0 1 1 0 0 +EDGE2 7948 7287 -1.07747 0.00849926 -0.018561 1 0 1 1 0 0 +EDGE2 7949 7948 -1.05453 0.0744164 0.0467672 1 0 1 1 0 0 +EDGE2 7949 7530 1.04678 -0.0941788 -0.0112863 1 0 1 1 0 0 +EDGE2 7949 7930 0.934284 0.0574199 -0.0226373 1 0 1 1 0 0 +EDGE2 7949 7310 1.00569 0.00888364 -0.0187695 1 0 1 1 0 0 +EDGE2 7949 7350 0.908776 0.037928 0.021156 1 0 1 1 0 0 +EDGE2 7949 7450 1.05493 -0.00506915 -3.12866 1 0 1 1 0 0 +EDGE2 7949 7510 0.936697 0.0285514 -3.14552 1 0 1 1 0 0 +EDGE2 7949 7330 0.961224 -0.00889942 0.017867 1 0 1 1 0 0 +EDGE2 7949 7170 0.997529 0.113944 -3.13598 1 0 1 1 0 0 +EDGE2 7949 7290 1.01621 0.00644006 0.0117007 1 0 1 1 0 0 +EDGE2 7949 7329 -0.0124205 -0.0159613 -0.014199 1 0 1 1 0 0 +EDGE2 7949 7529 0.0456211 0.0261958 -0.000976924 1 0 1 1 0 0 +EDGE2 7949 7929 -0.0252913 0.0102396 -0.020299 1 0 1 1 0 0 +EDGE2 7949 7349 -0.0063965 -0.0838168 -0.0299141 1 0 1 1 0 0 +EDGE2 7949 7289 0.0266237 -0.0760392 -0.00734742 1 0 1 1 0 0 +EDGE2 7949 7309 -0.0385947 0.0145171 -0.00562478 1 0 1 1 0 0 +EDGE2 7949 7308 -0.987025 -0.0633917 0.000752666 1 0 1 1 0 0 +EDGE2 7949 7348 -1.04193 -0.00931541 -0.00649721 1 0 1 1 0 0 +EDGE2 7949 7528 -0.993636 -0.0482162 -0.0141145 1 0 1 1 0 0 +EDGE2 7949 7928 -0.928066 0.125295 0.00465713 1 0 1 1 0 0 +EDGE2 7949 7328 -0.96479 -0.0509783 0.0122325 1 0 1 1 0 0 +EDGE2 7949 7288 -1.02212 -0.0306115 -0.0348998 1 0 1 1 0 0 +EDGE2 7950 7449 1.08851 0.0200467 -3.13837 1 0 1 1 0 0 +EDGE2 7950 7509 1.06309 0.00731443 -3.17178 1 0 1 1 0 0 +EDGE2 7950 7169 0.955064 0.0608803 -3.11975 1 0 1 1 0 0 +EDGE2 7950 7530 0.085079 -0.0890088 0.0396125 1 0 1 1 0 0 +EDGE2 7950 7511 0.00937272 -1.00767 -1.59216 1 0 1 1 0 0 +EDGE2 7950 7931 -0.0119185 -1.06794 -1.58705 1 0 1 1 0 0 +EDGE2 7950 7531 0.0349933 -1.02696 -1.58536 1 0 1 1 0 0 +EDGE2 7950 7451 -0.0368505 -1.0104 -1.61432 1 0 1 1 0 0 +EDGE2 7950 7930 0.0666858 -0.00320595 0.00959081 1 0 1 1 0 0 +EDGE2 7950 7310 0.0882136 0.0617153 0.0286825 1 0 1 1 0 0 +EDGE2 7950 7350 0.0160681 -0.0220703 -0.00674276 1 0 1 1 0 0 +EDGE2 7950 7450 -0.0648221 -0.0299119 -3.13604 1 0 1 1 0 0 +EDGE2 7950 7510 0.00418617 -0.0145084 -3.10344 1 0 1 1 0 0 +EDGE2 7950 7330 0.0890644 0.0895828 0.0268263 1 0 1 1 0 0 +EDGE2 7950 7170 -0.0350396 -0.0315559 -3.12335 1 0 1 1 0 0 +EDGE2 7950 7290 -0.0308746 -0.0212332 -0.0319854 1 0 1 1 0 0 +EDGE2 7950 7329 -0.967768 -0.0411068 -0.0236841 1 0 1 1 0 0 +EDGE2 7950 7529 -1.05261 0.00127068 -0.0178518 1 0 1 1 0 0 +EDGE2 7950 7929 -1.05556 0.0393329 0.0295605 1 0 1 1 0 0 +EDGE2 7950 7949 -1.01172 -0.00811853 0.0116465 1 0 1 1 0 0 +EDGE2 7950 7349 -1.03545 -0.0480529 -0.00375857 1 0 1 1 0 0 +EDGE2 7950 7289 -0.984525 0.0411503 0.00581437 1 0 1 1 0 0 +EDGE2 7950 7309 -0.951916 0.0548537 0.00333437 1 0 1 1 0 0 +EDGE2 7950 7291 -0.0196996 0.965256 1.56002 1 0 1 1 0 0 +EDGE2 7950 7331 0.00432592 0.971494 1.54689 1 0 1 1 0 0 +EDGE2 7950 7351 0.0355686 0.968026 1.57384 1 0 1 1 0 0 +EDGE2 7950 7311 -0.0346478 0.84758 1.57238 1 0 1 1 0 0 +EDGE2 7950 7171 0.0585071 1.05328 1.58303 1 0 1 1 0 0 +EDGE2 7951 7530 -0.976077 -0.0545282 1.57366 1 0 1 1 0 0 +EDGE2 7951 7512 0.966843 -0.0365524 -0.0239199 1 0 1 1 0 0 +EDGE2 7951 7932 0.952783 -0.0108675 -0.00966124 1 0 1 1 0 0 +EDGE2 7951 7532 0.986549 -0.00663946 0.00186442 1 0 1 1 0 0 +EDGE2 7951 7511 0.0906866 0.0790415 -0.0278425 1 0 1 1 0 0 +EDGE2 7951 7931 0.0252253 -0.0876294 -0.013798 1 0 1 1 0 0 +EDGE2 7951 7452 0.804952 -0.0299209 0.0171621 1 0 1 1 0 0 +EDGE2 7951 7531 0.0690191 -0.00733846 -0.0181855 1 0 1 1 0 0 +EDGE2 7951 7950 -1.04251 0.0262659 1.55605 1 0 1 1 0 0 +EDGE2 7951 7451 -0.0045296 0.0235379 0.00600744 1 0 1 1 0 0 +EDGE2 7951 7930 -0.975951 -0.128251 1.59543 1 0 1 1 0 0 +EDGE2 7951 7310 -1.02247 0.0530974 1.55151 1 0 1 1 0 0 +EDGE2 7951 7350 -1.01038 -0.00184741 1.58591 1 0 1 1 0 0 +EDGE2 7951 7450 -0.977821 0.047657 -1.5899 1 0 1 1 0 0 +EDGE2 7951 7510 -1.06778 0.0489599 -1.59464 1 0 1 1 0 0 +EDGE2 7951 7330 -0.955924 -0.0941973 1.5645 1 0 1 1 0 0 +EDGE2 7951 7170 -0.935866 0.0445643 -1.52232 1 0 1 1 0 0 +EDGE2 7951 7290 -1.06624 0.0649572 1.57282 1 0 1 1 0 0 +EDGE2 7952 7512 -0.0105832 -0.0438617 -0.0038771 1 0 1 1 0 0 +EDGE2 7952 7513 1.11312 0.0148959 -0.0201827 1 0 1 1 0 0 +EDGE2 7952 7933 0.984526 0.00380603 0.0276613 1 0 1 1 0 0 +EDGE2 7952 7533 0.980372 -0.0490682 0.0189227 1 0 1 1 0 0 +EDGE2 7952 7932 0.0805285 0.0305105 0.017091 1 0 1 1 0 0 +EDGE2 7952 7453 1.02305 0.00330772 -0.00511611 1 0 1 1 0 0 +EDGE2 7952 7532 0.0543572 0.0975551 0.0271233 1 0 1 1 0 0 +EDGE2 7952 7511 -1.01958 0.0393376 0.022765 1 0 1 1 0 0 +EDGE2 7952 7931 -1.01242 0.00243103 -0.0339549 1 0 1 1 0 0 +EDGE2 7952 7951 -1.01808 -0.025023 -0.00817977 1 0 1 1 0 0 +EDGE2 7952 7452 0.0863246 -0.00781519 -0.00290823 1 0 1 1 0 0 +EDGE2 7952 7531 -0.954671 -0.00572838 -0.0147985 1 0 1 1 0 0 +EDGE2 7952 7451 -1.00149 0.0369342 -0.0133823 1 0 1 1 0 0 +EDGE2 7953 7514 1.06264 0.0289503 0.0224134 1 0 1 1 0 0 +EDGE2 7953 7934 0.958437 0.0430918 -0.00132063 1 0 1 1 0 0 +EDGE2 7953 7534 1.06415 0.00741225 0.00925702 1 0 1 1 0 0 +EDGE2 7953 7512 -1.02273 -0.068351 0.0177647 1 0 1 1 0 0 +EDGE2 7953 7513 0.0427869 -0.0834806 -0.0146264 1 0 1 1 0 0 +EDGE2 7953 7933 -0.103301 -0.00809544 0.0267791 1 0 1 1 0 0 +EDGE2 7953 7454 0.984077 -0.0384805 0.0227691 1 0 1 1 0 0 +EDGE2 7953 7533 -0.0414794 -0.0299825 -0.0100362 1 0 1 1 0 0 +EDGE2 7953 7932 -0.943864 -0.034937 0.00919382 1 0 1 1 0 0 +EDGE2 7953 7952 -0.963327 0.0272773 -0.00332374 1 0 1 1 0 0 +EDGE2 7953 7453 0.00914917 0.0210188 0.0202562 1 0 1 1 0 0 +EDGE2 7953 7532 -0.953946 -0.0470864 -0.0170123 1 0 1 1 0 0 +EDGE2 7953 7452 -1.00657 0.063411 0.0340834 1 0 1 1 0 0 +EDGE2 7954 7535 1.03131 0.076403 -0.000340526 1 0 1 1 0 0 +EDGE2 7954 7575 1.07334 -0.00144474 -3.16664 1 0 1 1 0 0 +EDGE2 7954 7935 1.03965 0.0104468 0.0226554 1 0 1 1 0 0 +EDGE2 7954 7555 1.03414 0.0631652 -3.0967 1 0 1 1 0 0 +EDGE2 7954 7455 0.969476 -0.00531006 0.00592858 1 0 1 1 0 0 +EDGE2 7954 7475 0.943143 0.0721132 -3.14847 1 0 1 1 0 0 +EDGE2 7954 7515 0.968496 -0.0171156 0.0101525 1 0 1 1 0 0 +EDGE2 7954 7395 1.02601 -0.0258863 -3.15998 1 0 1 1 0 0 +EDGE2 7954 7514 -0.0337047 0.0285835 -0.0178994 1 0 1 1 0 0 +EDGE2 7954 7934 -0.0366132 -0.00917074 0.0403216 1 0 1 1 0 0 +EDGE2 7954 7534 0.0258924 -0.0384197 0.0156044 1 0 1 1 0 0 +EDGE2 7954 7513 -0.845401 -0.00119025 6.48723e-05 1 0 1 1 0 0 +EDGE2 7954 7933 -1.01889 0.0298402 -0.0148678 1 0 1 1 0 0 +EDGE2 7954 7953 -0.927999 -0.0246114 0.0137399 1 0 1 1 0 0 +EDGE2 7954 7454 0.0278105 0.045122 -0.0190201 1 0 1 1 0 0 +EDGE2 7954 7533 -1.025 -0.128318 -0.0384861 1 0 1 1 0 0 +EDGE2 7954 7453 -0.983631 -0.00848203 0.0613463 1 0 1 1 0 0 +EDGE2 7955 7476 -0.0142677 0.956913 1.55411 1 0 1 1 0 0 +EDGE2 7955 7396 0.0500897 1.02474 1.58232 1 0 1 1 0 0 +EDGE2 7955 7394 1.05902 0.0555546 -3.15436 1 0 1 1 0 0 +EDGE2 7955 7554 0.925757 0.0677885 -3.14695 1 0 1 1 0 0 +EDGE2 7955 7574 0.911889 -0.0134627 -3.12295 1 0 1 1 0 0 +EDGE2 7955 7474 1.01294 -0.0101338 -3.14468 1 0 1 1 0 0 +EDGE2 7955 7535 0.0100344 0.0170575 -0.0351485 1 0 1 1 0 0 +EDGE2 7955 7575 0.0297096 -0.0496143 -3.10458 1 0 1 1 0 0 +EDGE2 7955 7935 0.0112798 -0.0469758 -0.0168783 1 0 1 1 0 0 +EDGE2 7955 7555 0.00900605 -0.00836566 -3.09122 1 0 1 1 0 0 +EDGE2 7955 7455 0.0357318 0.00578744 -0.0116072 1 0 1 1 0 0 +EDGE2 7955 7475 -0.0230358 0.0104708 -3.13823 1 0 1 1 0 0 +EDGE2 7955 7515 -0.0464531 0.116349 -0.0283009 1 0 1 1 0 0 +EDGE2 7955 7395 0.0437604 -0.0512685 -3.14509 1 0 1 1 0 0 +EDGE2 7955 7576 0.0280576 -1.01929 -1.56595 1 0 1 1 0 0 +EDGE2 7955 7936 0.0704522 -0.973168 -1.55972 1 0 1 1 0 0 +EDGE2 7955 7516 0.0710944 -0.968593 -1.55099 1 0 1 1 0 0 +EDGE2 7955 7536 -0.0611009 -0.959912 -1.57777 1 0 1 1 0 0 +EDGE2 7955 7556 -0.0128794 -1.03401 -1.59205 1 0 1 1 0 0 +EDGE2 7955 7456 0.0343909 -1.02058 -1.53562 1 0 1 1 0 0 +EDGE2 7955 7514 -1.0169 -2.11525e-05 0.0242203 1 0 1 1 0 0 +EDGE2 7955 7934 -1.03966 0.0244777 -0.00204529 1 0 1 1 0 0 +EDGE2 7955 7954 -0.939247 0.0144061 0.0011067 1 0 1 1 0 0 +EDGE2 7955 7534 -0.982652 0.0186344 0.00592068 1 0 1 1 0 0 +EDGE2 7955 7454 -0.904012 0.0395384 0.0189752 1 0 1 1 0 0 +EDGE2 7956 7537 1.03573 -0.0285958 -0.00744222 1 0 1 1 0 0 +EDGE2 7956 7535 -1.03796 0.0171642 1.58256 1 0 1 1 0 0 +EDGE2 7956 7575 -1.00608 0.00221864 -1.56699 1 0 1 1 0 0 +EDGE2 7956 7935 -1.07901 0.0180427 1.55584 1 0 1 1 0 0 +EDGE2 7956 7955 -1.00413 -0.142472 1.54571 1 0 1 1 0 0 +EDGE2 7956 7555 -0.87318 0.0493891 -1.56553 1 0 1 1 0 0 +EDGE2 7956 7455 -1.03808 0.0217997 1.56068 1 0 1 1 0 0 +EDGE2 7956 7475 -0.925571 -0.0151462 -1.54465 1 0 1 1 0 0 +EDGE2 7956 7515 -1.04782 0.0220336 1.56486 1 0 1 1 0 0 +EDGE2 7956 7395 -0.996817 -0.0115906 -1.57616 1 0 1 1 0 0 +EDGE2 7956 7576 0.0521088 -0.0141861 0.000474656 1 0 1 1 0 0 +EDGE2 7956 7936 0.00302645 -0.0204133 0.00465899 1 0 1 1 0 0 +EDGE2 7956 7516 0.00941906 -0.0365836 -0.0308785 1 0 1 1 0 0 +EDGE2 7956 7536 -0.0381157 0.00550091 -0.010564 1 0 1 1 0 0 +EDGE2 7956 7556 0.0927983 -0.0175061 0.0139025 1 0 1 1 0 0 +EDGE2 7956 7456 -0.00262381 -0.0698224 -0.0268756 1 0 1 1 0 0 +EDGE2 7956 7577 1.0532 0.0805561 -0.00886824 1 0 1 1 0 0 +EDGE2 7956 7937 1.04055 -0.102249 0.00662223 1 0 1 1 0 0 +EDGE2 7956 7557 1.02273 -0.0468191 0.0161364 1 0 1 1 0 0 +EDGE2 7956 7517 0.993417 -0.0538175 0.030313 1 0 1 1 0 0 +EDGE2 7956 7457 0.99488 0.0372255 -0.0183232 1 0 1 1 0 0 +EDGE2 7957 7537 -0.125613 -0.0204462 0.0241657 1 0 1 1 0 0 +EDGE2 7957 7576 -0.981566 -0.0112125 -0.0301632 1 0 1 1 0 0 +EDGE2 7957 7936 -0.952109 -0.034295 0.0134012 1 0 1 1 0 0 +EDGE2 7957 7956 -0.913834 0.0185991 -0.00810879 1 0 1 1 0 0 +EDGE2 7957 7516 -0.994197 0.00513703 -0.00401442 1 0 1 1 0 0 +EDGE2 7957 7536 -0.985737 -0.074499 -0.0109569 1 0 1 1 0 0 +EDGE2 7957 7556 -1.03127 0.00935822 -0.0264714 1 0 1 1 0 0 +EDGE2 7957 7456 -1.06011 0.0769599 0.0181554 1 0 1 1 0 0 +EDGE2 7957 7577 -0.00734328 -0.0161823 -0.0293635 1 0 1 1 0 0 +EDGE2 7957 7937 -0.0208573 0.0168637 -0.00986614 1 0 1 1 0 0 +EDGE2 7957 7557 -0.0905074 0.00183318 0.046022 1 0 1 1 0 0 +EDGE2 7957 7517 -0.0023273 0.0380897 -0.00435903 1 0 1 1 0 0 +EDGE2 7957 7457 -0.0175886 0.0495648 0.0100459 1 0 1 1 0 0 +EDGE2 7957 7938 0.985327 -0.0952256 -0.00157988 1 0 1 1 0 0 +EDGE2 7957 7458 1.02462 0.028796 0.0078858 1 0 1 1 0 0 +EDGE2 7957 7538 1.02211 0.0288154 0.0315088 1 0 1 1 0 0 +EDGE2 7957 7558 0.972823 -0.0101522 -0.0183712 1 0 1 1 0 0 +EDGE2 7957 7578 0.98153 0.0515275 0.000504682 1 0 1 1 0 0 +EDGE2 7957 7518 1.03588 0.000780052 -0.0196258 1 0 1 1 0 0 +EDGE2 7958 7537 -1.02256 -0.0397586 -0.00890091 1 0 1 1 0 0 +EDGE2 7958 7957 -0.893759 0.038368 -0.00255241 1 0 1 1 0 0 +EDGE2 7958 7577 -0.980494 -0.0100565 0.0167182 1 0 1 1 0 0 +EDGE2 7958 7937 -0.976257 0.0224717 0.0161778 1 0 1 1 0 0 +EDGE2 7958 7557 -0.908827 -0.0177914 0.0222589 1 0 1 1 0 0 +EDGE2 7958 7517 -0.902678 0.00522485 0.0124407 1 0 1 1 0 0 +EDGE2 7958 7457 -0.98055 -0.00295289 0.00875451 1 0 1 1 0 0 +EDGE2 7958 7539 0.895241 0.0848452 0.0076137 1 0 1 1 0 0 +EDGE2 7958 7938 -0.0339668 -0.0710457 0.0310099 1 0 1 1 0 0 +EDGE2 7958 7458 -0.0982119 -0.0682521 0.0146379 1 0 1 1 0 0 +EDGE2 7958 7538 -0.0772768 -0.0416133 -0.0043892 1 0 1 1 0 0 +EDGE2 7958 7558 0.0636278 0.0652129 0.0238413 1 0 1 1 0 0 +EDGE2 7958 7578 0.0399795 0.0642873 -0.0130389 1 0 1 1 0 0 +EDGE2 7958 7518 0.0213753 -0.0270837 -0.00177331 1 0 1 1 0 0 +EDGE2 7958 7579 1.02316 0.135049 0.000662279 1 0 1 1 0 0 +EDGE2 7958 7939 1.05374 -0.0988941 0.0429634 1 0 1 1 0 0 +EDGE2 7958 7559 1.03495 -0.0792908 0.0113812 1 0 1 1 0 0 +EDGE2 7958 7459 0.998529 0.0531248 0.00729183 1 0 1 1 0 0 +EDGE2 7958 7519 0.985848 0.00724232 0.0195101 1 0 1 1 0 0 +EDGE2 7959 7520 0.952358 -0.00442205 0.0304354 1 0 1 1 0 0 +EDGE2 7959 7539 0.0422341 0.00252634 0.00723252 1 0 1 1 0 0 +EDGE2 7959 7938 -1.01818 -0.0567442 -0.0166965 1 0 1 1 0 0 +EDGE2 7959 7958 -0.949211 0.0519942 0.000357924 1 0 1 1 0 0 +EDGE2 7959 7458 -0.964003 0.0580471 0.0115476 1 0 1 1 0 0 +EDGE2 7959 7538 -0.963704 0.0466241 -0.00724327 1 0 1 1 0 0 +EDGE2 7959 7558 -1.00436 -0.00893332 -0.0237645 1 0 1 1 0 0 +EDGE2 7959 7578 -1.01825 -0.0452941 0.0227117 1 0 1 1 0 0 +EDGE2 7959 7518 -0.932626 -0.0117409 0.0114189 1 0 1 1 0 0 +EDGE2 7959 7579 0.0268321 0.0718273 0.0196636 1 0 1 1 0 0 +EDGE2 7959 7939 0.00762715 -0.0863391 0.00447668 1 0 1 1 0 0 +EDGE2 7959 7559 -0.0210384 -0.076952 0.0116532 1 0 1 1 0 0 +EDGE2 7959 7459 -0.016959 -0.0696301 0.0146831 1 0 1 1 0 0 +EDGE2 7959 7519 -0.0228943 -0.0046828 -0.0375426 1 0 1 1 0 0 +EDGE2 7959 7540 0.993731 -0.0691342 0.0385146 1 0 1 1 0 0 +EDGE2 7959 7580 0.903707 -0.0219111 -0.00271298 1 0 1 1 0 0 +EDGE2 7959 7940 1.0835 -0.0786757 -0.0152318 1 0 1 1 0 0 +EDGE2 7959 7560 1.05615 0.0174075 0.0115098 1 0 1 1 0 0 +EDGE2 7959 7380 0.894901 0.0294688 -3.13334 1 0 1 1 0 0 +EDGE2 7959 7460 1.00764 -0.0911865 0.0031876 1 0 1 1 0 0 +EDGE2 7960 7520 -0.0145503 0.061412 0.00832809 1 0 1 1 0 0 +EDGE2 7960 7539 -0.91068 -0.0517095 -0.0123099 1 0 1 1 0 0 +EDGE2 7960 7579 -0.947599 -0.0363531 0.0313637 1 0 1 1 0 0 +EDGE2 7960 7939 -0.978624 -0.00960131 0.0318086 1 0 1 1 0 0 +EDGE2 7960 7959 -1.0129 -0.00771373 -0.00268636 1 0 1 1 0 0 +EDGE2 7960 7559 -0.957473 -0.0861128 0.0230508 1 0 1 1 0 0 +EDGE2 7960 7459 -0.990693 0.0105829 0.0189796 1 0 1 1 0 0 +EDGE2 7960 7519 -1.05956 0.0523432 0.00198579 1 0 1 1 0 0 +EDGE2 7960 7540 -0.00104386 -0.0725516 -0.00536879 1 0 1 1 0 0 +EDGE2 7960 7561 -0.00499849 1.12375 1.54369 1 0 1 1 0 0 +EDGE2 7960 7581 0.0482804 0.98289 1.55012 1 0 1 1 0 0 +EDGE2 7960 7381 -0.000834468 0.965342 1.58004 1 0 1 1 0 0 +EDGE2 7960 7461 0.0579234 1.0519 1.55376 1 0 1 1 0 0 +EDGE2 7960 7541 -0.0945204 1.03024 1.57026 1 0 1 1 0 0 +EDGE2 7960 7580 0.00682933 0.0269542 0.0210632 1 0 1 1 0 0 +EDGE2 7960 7940 -0.0306422 0.00265122 -0.00311938 1 0 1 1 0 0 +EDGE2 7960 7560 -0.036388 0.0408254 -0.0311958 1 0 1 1 0 0 +EDGE2 7960 7941 0.0463052 -0.958286 -1.5671 1 0 1 1 0 0 +EDGE2 7960 7380 0.0194465 -0.0418214 -3.12546 1 0 1 1 0 0 +EDGE2 7960 7460 -0.0465372 0.00684951 0.0211217 1 0 1 1 0 0 +EDGE2 7960 7521 -0.0329859 -0.972519 -1.61197 1 0 1 1 0 0 +EDGE2 7960 7379 1.00987 -0.103284 -3.15081 1 0 1 1 0 0 +EDGE2 7961 7520 -0.991202 -0.0223055 -1.58328 1 0 1 1 0 0 +EDGE2 7961 7540 -1.06603 -0.0419706 -1.56644 1 0 1 1 0 0 +EDGE2 7961 7561 0.0481584 -0.0759265 0.0226096 1 0 1 1 0 0 +EDGE2 7961 7542 0.919058 0.00568669 0.0430619 1 0 1 1 0 0 +EDGE2 7961 7582 0.956085 0.0599941 -0.00761066 1 0 1 1 0 0 +EDGE2 7961 7562 0.989961 0.0327687 -0.0270225 1 0 1 1 0 0 +EDGE2 7961 7382 1.09899 -0.0841324 0.000827942 1 0 1 1 0 0 +EDGE2 7961 7462 0.926364 0.0157729 0.01349 1 0 1 1 0 0 +EDGE2 7961 7581 -0.0240515 -0.0255357 -0.00968197 1 0 1 1 0 0 +EDGE2 7961 7381 0.00623179 -0.100695 -0.000511127 1 0 1 1 0 0 +EDGE2 7961 7461 0.0443556 0.0381215 -0.0121837 1 0 1 1 0 0 +EDGE2 7961 7541 -0.0245778 -0.0466144 -0.0086948 1 0 1 1 0 0 +EDGE2 7961 7580 -1.03261 -0.0144657 -1.53414 1 0 1 1 0 0 +EDGE2 7961 7940 -1.0467 0.0241103 -1.56992 1 0 1 1 0 0 +EDGE2 7961 7960 -1.04875 0.0568576 -1.56674 1 0 1 1 0 0 +EDGE2 7961 7560 -1.0434 0.0821635 -1.57097 1 0 1 1 0 0 +EDGE2 7961 7380 -0.932775 -0.0513129 1.55896 1 0 1 1 0 0 +EDGE2 7961 7460 -1.13739 0.0525675 -1.5619 1 0 1 1 0 0 +EDGE2 7962 7463 0.902669 0.00338264 -0.0250573 1 0 1 1 0 0 +EDGE2 7962 7563 1.12107 -0.012773 0.00381413 1 0 1 1 0 0 +EDGE2 7962 7583 0.986724 -0.0851521 0.0536931 1 0 1 1 0 0 +EDGE2 7962 7543 1.00254 0.0371641 0.00554094 1 0 1 1 0 0 +EDGE2 7962 7561 -1.04159 0.0552706 0.00705511 1 0 1 1 0 0 +EDGE2 7962 7542 0.0513571 -0.0113792 -0.0225046 1 0 1 1 0 0 +EDGE2 7962 7582 -0.0181938 0.0772815 -0.0170027 1 0 1 1 0 0 +EDGE2 7962 7383 0.99226 0.0129964 -0.0290509 1 0 1 1 0 0 +EDGE2 7962 7562 0.0454914 0.0319699 -0.00899615 1 0 1 1 0 0 +EDGE2 7962 7961 -1.00309 0.0290103 -0.00572102 1 0 1 1 0 0 +EDGE2 7962 7382 -0.0189544 0.0305541 -0.0140168 1 0 1 1 0 0 +EDGE2 7962 7462 -0.0300914 0.116238 0.0194116 1 0 1 1 0 0 +EDGE2 7962 7581 -1.11767 0.102402 0.000585582 1 0 1 1 0 0 +EDGE2 7962 7381 -1.0191 -0.042838 0.00847879 1 0 1 1 0 0 +EDGE2 7962 7461 -0.949787 -1.28162e-05 0.028706 1 0 1 1 0 0 +EDGE2 7962 7541 -0.987012 -0.00699264 0.0403642 1 0 1 1 0 0 +EDGE2 7963 7463 -0.0749187 0.034761 0.0361641 1 0 1 1 0 0 +EDGE2 7963 7544 1.00782 -0.0160966 0.00896414 1 0 1 1 0 0 +EDGE2 7963 7584 1.01025 0.0208285 0.02069 1 0 1 1 0 0 +EDGE2 7963 7564 1.00953 -0.0608983 0.00562204 1 0 1 1 0 0 +EDGE2 7963 7464 0.983074 -0.042697 0.0298403 1 0 1 1 0 0 +EDGE2 7963 7384 0.88501 -0.00853804 -0.026667 1 0 1 1 0 0 +EDGE2 7963 7563 -0.0792221 0.0961298 0.0199654 1 0 1 1 0 0 +EDGE2 7963 7583 0.0796681 0.0179325 0.00211908 1 0 1 1 0 0 +EDGE2 7963 7543 -0.116281 -0.0267382 0.0135735 1 0 1 1 0 0 +EDGE2 7963 7542 -1.05587 0.0643272 -0.00804643 1 0 1 1 0 0 +EDGE2 7963 7582 -1.03227 0.00212077 -0.0382343 1 0 1 1 0 0 +EDGE2 7963 7962 -0.992519 0.124364 0.0180379 1 0 1 1 0 0 +EDGE2 7963 7383 0.00259074 0.015844 0.0416343 1 0 1 1 0 0 +EDGE2 7963 7562 -1.10514 -0.056179 -0.0286137 1 0 1 1 0 0 +EDGE2 7963 7382 -0.948378 0.0240686 -0.0190287 1 0 1 1 0 0 +EDGE2 7963 7462 -1.01544 0.0509983 -0.0420001 1 0 1 1 0 0 +EDGE2 7964 7463 -0.99089 -0.0481812 -0.0400785 1 0 1 1 0 0 +EDGE2 7964 7544 0.0101839 -0.00359383 0.0477054 1 0 1 1 0 0 +EDGE2 7964 7465 1.0441 -0.0646038 0.00705788 1 0 1 1 0 0 +EDGE2 7964 7565 1.02428 -0.064091 0.00241441 1 0 1 1 0 0 +EDGE2 7964 7585 0.910169 0.084306 0.00644819 1 0 1 1 0 0 +EDGE2 7964 7545 1.01725 -0.0514829 -0.0156259 1 0 1 1 0 0 +EDGE2 7964 7584 0.0506949 -0.00470065 0.0169612 1 0 1 1 0 0 +EDGE2 7964 7385 1.01989 -0.11015 0.0306691 1 0 1 1 0 0 +EDGE2 7964 7564 0.0539161 -0.0340083 0.00243813 1 0 1 1 0 0 +EDGE2 7964 7963 -1.0398 0.0590065 0.0167955 1 0 1 1 0 0 +EDGE2 7964 7464 0.0632443 -0.0649727 0.00289696 1 0 1 1 0 0 +EDGE2 7964 7384 -0.0463865 -0.0367235 0.0364297 1 0 1 1 0 0 +EDGE2 7964 7563 -1.00869 0.00972363 0.0182016 1 0 1 1 0 0 +EDGE2 7964 7583 -1.11824 -0.0630927 -0.0195656 1 0 1 1 0 0 +EDGE2 7964 7543 -0.923636 -0.0792993 0.00562784 1 0 1 1 0 0 +EDGE2 7964 7383 -1.01196 0.0273607 0.0627361 1 0 1 1 0 0 +EDGE2 7965 7466 -0.00544814 0.90199 1.57211 1 0 1 1 0 0 +EDGE2 7965 7546 -0.0182035 1.00542 1.56812 1 0 1 1 0 0 +EDGE2 7965 7566 -0.0200784 0.992799 1.54788 1 0 1 1 0 0 +EDGE2 7965 7386 0.0289413 1.01888 1.56864 1 0 1 1 0 0 +EDGE2 7965 7544 -0.993347 0.00168086 -0.00291542 1 0 1 1 0 0 +EDGE2 7965 7465 0.0382373 -0.062317 -0.0390162 1 0 1 1 0 0 +EDGE2 7965 7565 0.0745065 -0.0118876 0.0150751 1 0 1 1 0 0 +EDGE2 7965 7585 -0.0484634 0.0542794 -0.0237241 1 0 1 1 0 0 +EDGE2 7965 7545 0.0462624 0.0355382 -0.000600073 1 0 1 1 0 0 +EDGE2 7965 7584 -0.980018 -0.0435839 0.0393848 1 0 1 1 0 0 +EDGE2 7965 7964 -0.918651 -0.0622075 -0.0056042 1 0 1 1 0 0 +EDGE2 7965 7385 -0.0490862 -0.0436666 -0.0105202 1 0 1 1 0 0 +EDGE2 7965 7564 -0.952671 -0.0701328 -0.0300033 1 0 1 1 0 0 +EDGE2 7965 7464 -0.985429 -0.0678306 0.0394244 1 0 1 1 0 0 +EDGE2 7965 7384 -0.920246 0.0248839 -0.0105259 1 0 1 1 0 0 +EDGE2 7965 7586 -0.0647238 -1.01058 -1.56542 1 0 1 1 0 0 +EDGE2 7966 7465 -0.954026 0.00991253 1.60942 1 0 1 1 0 0 +EDGE2 7966 7565 -0.9459 0.025278 1.57723 1 0 1 1 0 0 +EDGE2 7966 7585 -1.00399 0.0995466 1.58273 1 0 1 1 0 0 +EDGE2 7966 7965 -1.02549 -0.0371799 1.53973 1 0 1 1 0 0 +EDGE2 7966 7545 -0.949415 -0.0290787 1.55662 1 0 1 1 0 0 +EDGE2 7966 7385 -1.01074 0.0429343 1.58027 1 0 1 1 0 0 +EDGE2 7966 7586 -0.0239404 0.0245358 -0.0182735 1 0 1 1 0 0 +EDGE2 7966 7587 0.974523 0.0313337 0.0161024 1 0 1 1 0 0 +EDGE2 7967 7586 -1.01853 -0.0290251 0.00615263 1 0 1 1 0 0 +EDGE2 7967 7966 -0.983285 0.00509609 0.0252735 1 0 1 1 0 0 +EDGE2 7967 7587 -0.0823766 -0.0559397 0.0181756 1 0 1 1 0 0 +EDGE2 7967 7588 0.942502 0.0157265 -0.0186778 1 0 1 1 0 0 +EDGE2 7968 7967 -0.997045 -0.073563 -0.0227092 1 0 1 1 0 0 +EDGE2 7968 7587 -0.953797 0.0141554 -0.016874 1 0 1 1 0 0 +EDGE2 7968 7589 1.05091 0.112914 -0.00535289 1 0 1 1 0 0 +EDGE2 7968 7588 -0.0241299 -0.0337294 -0.0302189 1 0 1 1 0 0 +EDGE2 7969 7590 1.03671 0.0139843 -0.0145605 1 0 1 1 0 0 +EDGE2 7969 7968 -0.965543 0.0336116 -0.010269 1 0 1 1 0 0 +EDGE2 7969 7589 -0.0488607 0.0396829 0.0372031 1 0 1 1 0 0 +EDGE2 7969 7588 -0.952854 -0.00547044 -0.000420098 1 0 1 1 0 0 +EDGE2 7970 7590 0.000848638 0.0793319 0.0102461 1 0 1 1 0 0 +EDGE2 7970 7589 -1.00187 -0.00839003 -0.026895 1 0 1 1 0 0 +EDGE2 7970 7969 -1.08466 -0.0891884 0.0121772 1 0 1 1 0 0 +EDGE2 7970 7591 0.0856388 -0.996895 -1.58911 1 0 1 1 0 0 +EDGE2 7971 7590 -0.945235 -0.0834241 1.5781 1 0 1 1 0 0 +EDGE2 7971 7970 -0.967481 -0.0238625 1.61079 1 0 1 1 0 0 +EDGE2 7971 7591 -0.00833139 0.0173389 0.0227573 1 0 1 1 0 0 +EDGE2 7971 7592 0.960711 0.00667706 -0.0159041 1 0 1 1 0 0 +EDGE2 7972 7591 -1.0286 0.0881727 -0.00669827 1 0 1 1 0 0 +EDGE2 7972 7971 -1.07867 0.0589512 0.0131541 1 0 1 1 0 0 +EDGE2 7972 7592 0.0750142 -0.049148 -0.0208141 1 0 1 1 0 0 +EDGE2 7972 7593 0.980591 -0.0232488 -0.00946741 1 0 1 1 0 0 +EDGE2 7973 7972 -1.02936 0.0254218 -0.00300876 1 0 1 1 0 0 +EDGE2 7973 7592 -0.997806 -0.0183116 0.0176708 1 0 1 1 0 0 +EDGE2 7973 7593 -0.0330615 0.0715535 0.0314852 1 0 1 1 0 0 +EDGE2 7973 7594 1.00951 -0.00554463 0.0012877 1 0 1 1 0 0 +EDGE2 7974 7973 -0.986775 0.0416137 0.00737054 1 0 1 1 0 0 +EDGE2 7974 7593 -1.06882 -0.051164 0.0340213 1 0 1 1 0 0 +EDGE2 7974 7594 0.0237411 -0.0101019 0.0333781 1 0 1 1 0 0 +EDGE2 7974 7375 1.04077 -0.051234 -3.11125 1 0 1 1 0 0 +EDGE2 7974 7595 0.955492 0.106093 0.00500917 1 0 1 1 0 0 +EDGE2 7974 7635 1.01242 0.0326554 -3.16652 1 0 1 1 0 0 +EDGE2 7975 7974 -0.981937 0.0196369 0.0542125 1 0 1 1 0 0 +EDGE2 7975 7594 -1.03251 0.0881201 -0.000258961 1 0 1 1 0 0 +EDGE2 7975 7376 0.0447479 -1.02494 -1.56376 1 0 1 1 0 0 +EDGE2 7975 7596 -0.0446807 1.03425 1.56263 1 0 1 1 0 0 +EDGE2 7975 7636 -0.0275952 0.943467 1.57355 1 0 1 1 0 0 +EDGE2 7975 7375 0.0285662 0.00802931 -3.15152 1 0 1 1 0 0 +EDGE2 7975 7595 0.0193409 -0.020229 0.0356101 1 0 1 1 0 0 +EDGE2 7975 7635 0.00925158 0.0823787 -3.13859 1 0 1 1 0 0 +EDGE2 7975 7634 1.122 -0.0222639 -3.16043 1 0 1 1 0 0 +EDGE2 7975 7374 1.03657 -0.0433401 -3.14246 1 0 1 1 0 0 +EDGE2 7976 7975 -1.05861 -0.152114 -1.58992 1 0 1 1 0 0 +EDGE2 7976 7596 -0.0718005 0.0454258 -0.00519885 1 0 1 1 0 0 +EDGE2 7976 7636 0.0937486 -0.0197372 -0.0275337 1 0 1 1 0 0 +EDGE2 7976 7375 -0.986156 -0.0525957 1.56609 1 0 1 1 0 0 +EDGE2 7976 7595 -1.09083 -0.000977385 -1.57442 1 0 1 1 0 0 +EDGE2 7976 7635 -0.951845 -0.0315598 1.55465 1 0 1 1 0 0 +EDGE2 7976 7597 1.04446 0.0596154 -0.016561 1 0 1 1 0 0 +EDGE2 7976 7637 1.06074 -0.0475522 -0.00709765 1 0 1 1 0 0 +EDGE2 7977 7596 -0.98696 -0.00241906 -0.042828 1 0 1 1 0 0 +EDGE2 7977 7636 -0.973103 0.0631096 -0.0317466 1 0 1 1 0 0 +EDGE2 7977 7976 -1.01069 -0.0339732 0.0026283 1 0 1 1 0 0 +EDGE2 7977 7638 0.942303 -0.0233714 0.0157827 1 0 1 1 0 0 +EDGE2 7977 7597 0.0225899 0.0175609 -0.00725878 1 0 1 1 0 0 +EDGE2 7977 7637 0.00863134 0.103317 -0.00330132 1 0 1 1 0 0 +EDGE2 7977 7598 1.04055 -0.0558845 0.0332294 1 0 1 1 0 0 +EDGE2 7978 7638 0.0601982 -0.0526442 -0.00648274 1 0 1 1 0 0 +EDGE2 7978 7597 -0.886597 -0.0341796 -0.026077 1 0 1 1 0 0 +EDGE2 7978 7637 -0.97594 -0.061733 -0.00445101 1 0 1 1 0 0 +EDGE2 7978 7977 -1.00476 0.00734439 -0.00208389 1 0 1 1 0 0 +EDGE2 7978 7639 0.98025 0.0531366 -0.020366 1 0 1 1 0 0 +EDGE2 7978 7598 -0.0896622 -0.05081 -0.010656 1 0 1 1 0 0 +EDGE2 7978 7599 0.986451 0.0539762 0.00685308 1 0 1 1 0 0 +EDGE2 7979 7638 -0.985234 0.0838345 0.0138127 1 0 1 1 0 0 +EDGE2 7979 7978 -1.01295 -0.0334517 -0.014634 1 0 1 1 0 0 +EDGE2 7979 7639 0.023743 0.0127025 0.026513 1 0 1 1 0 0 +EDGE2 7979 7598 -1.01398 -0.102406 0.0172744 1 0 1 1 0 0 +EDGE2 7979 7599 -0.0651453 -0.0874939 0.00351078 1 0 1 1 0 0 +EDGE2 7979 7600 1.0255 0.102469 0.0328236 1 0 1 1 0 0 +EDGE2 7979 7640 1.01095 0.0673852 -0.0153546 1 0 1 1 0 0 +EDGE2 7979 7620 1.04741 -0.0176958 -3.14067 1 0 1 1 0 0 +EDGE2 7980 7639 -0.918291 -0.00804611 0.00514524 1 0 1 1 0 0 +EDGE2 7980 7979 -1.09627 -0.0913505 0.0109036 1 0 1 1 0 0 +EDGE2 7980 7599 -0.922981 0.00758814 0.00935544 1 0 1 1 0 0 +EDGE2 7980 7600 -0.0592869 0.0139746 -0.0182246 1 0 1 1 0 0 +EDGE2 7980 7640 -0.0334105 -0.0211029 -0.0209304 1 0 1 1 0 0 +EDGE2 7980 7641 -0.0515374 1.09518 1.5549 1 0 1 1 0 0 +EDGE2 7980 7620 -0.00584301 -0.0536456 -3.1531 1 0 1 1 0 0 +EDGE2 7980 7619 0.974033 0.0409441 -3.16028 1 0 1 1 0 0 +EDGE2 7980 7601 0.0386468 -1.05852 -1.58053 1 0 1 1 0 0 +EDGE2 7980 7621 0.0164674 -0.998451 -1.55694 1 0 1 1 0 0 +EDGE2 7981 7642 1.01413 -0.0464947 0.0207753 1 0 1 1 0 0 +EDGE2 7981 7600 -1.05488 -0.0787795 -1.57407 1 0 1 1 0 0 +EDGE2 7981 7640 -1.02415 -0.0447589 -1.54919 1 0 1 1 0 0 +EDGE2 7981 7980 -1.03931 -0.00939016 -1.54481 1 0 1 1 0 0 +EDGE2 7981 7641 0.00589299 -0.00926025 0.0299855 1 0 1 1 0 0 +EDGE2 7981 7620 -1.0798 -0.0248021 1.56624 1 0 1 1 0 0 +EDGE2 7982 7981 -1.04671 -0.0209002 0.0112697 1 0 1 1 0 0 +EDGE2 7982 7642 0.000815773 0.0460842 0.0275262 1 0 1 1 0 0 +EDGE2 7982 7643 0.999976 0.00974802 0.00428861 1 0 1 1 0 0 +EDGE2 7982 7641 -1.00991 0.0937992 0.0265746 1 0 1 1 0 0 +EDGE2 7983 7644 1.03462 -0.0364512 -0.0237126 1 0 1 1 0 0 +EDGE2 7983 7642 -0.945965 0.0447026 0.0158803 1 0 1 1 0 0 +EDGE2 7983 7982 -1.0378 -0.0326164 -0.010661 1 0 1 1 0 0 +EDGE2 7983 7643 0.0185085 -0.00440588 0.0116977 1 0 1 1 0 0 +EDGE2 7984 7983 -1.10092 0.0306943 0.0101362 1 0 1 1 0 0 +EDGE2 7984 7645 1.06569 -0.0195771 -0.000907007 1 0 1 1 0 0 +EDGE2 7984 7644 0.0292767 0.0729244 -0.00589876 1 0 1 1 0 0 +EDGE2 7984 7643 -0.85892 0.0621585 -0.0147386 1 0 1 1 0 0 +EDGE2 7985 7984 -0.964744 -0.025941 0.0478365 1 0 1 1 0 0 +EDGE2 7985 7645 0.046722 -0.0665405 -0.00697521 1 0 1 1 0 0 +EDGE2 7985 7644 -0.921581 0.000938293 -0.0206804 1 0 1 1 0 0 +EDGE2 7985 7646 -0.0326102 -1.00808 -1.55315 1 0 1 1 0 0 +EDGE2 7986 7645 -0.919785 -0.0593162 1.56365 1 0 1 1 0 0 +EDGE2 7986 7985 -1.0621 -0.00873358 1.56958 1 0 1 1 0 0 +EDGE2 7986 7646 0.0599679 -0.124133 0.00551437 1 0 1 1 0 0 +EDGE2 7986 7647 1.08314 0.00547561 0.020946 1 0 1 1 0 0 +EDGE2 7987 7646 -0.976034 0.0201907 -0.000807101 1 0 1 1 0 0 +EDGE2 7987 7986 -0.949407 -0.0214869 -0.00647123 1 0 1 1 0 0 +EDGE2 7987 7647 -0.0805762 -0.0287559 -0.0266645 1 0 1 1 0 0 +EDGE2 7987 7648 0.971432 -0.0425621 -0.00370716 1 0 1 1 0 0 +EDGE2 7988 7647 -1.08662 -0.0206055 -0.000953088 1 0 1 1 0 0 +EDGE2 7988 7987 -1.00024 0.0537169 -0.0257941 1 0 1 1 0 0 +EDGE2 7988 7648 -0.0280126 -0.0508036 0.0274991 1 0 1 1 0 0 +EDGE2 7988 7649 0.890757 -0.0038909 0.0369297 1 0 1 1 0 0 +EDGE2 7989 7988 -1.10515 -0.00611368 -0.0249522 1 0 1 1 0 0 +EDGE2 7989 7648 -0.978212 -0.00552812 0.0129799 1 0 1 1 0 0 +EDGE2 7989 7649 -0.0455337 -0.0128468 -0.0482627 1 0 1 1 0 0 +EDGE2 7989 7650 1.06667 -0.090474 0.030638 1 0 1 1 0 0 +EDGE2 7990 7989 -0.992894 0.0112126 0.00280546 1 0 1 1 0 0 +EDGE2 7990 7651 0.0853524 0.950483 1.55954 1 0 1 1 0 0 +EDGE2 7990 7649 -1.04349 0.0897688 -1.70542e-05 1 0 1 1 0 0 +EDGE2 7990 7650 -0.0116657 0.028617 0.00937096 1 0 1 1 0 0 +EDGE2 7991 7652 0.876863 -0.0353998 0.00164617 1 0 1 1 0 0 +EDGE2 7991 7651 -0.0923908 -0.0957192 0.0210354 1 0 1 1 0 0 +EDGE2 7991 7990 -0.985197 -0.0611511 -1.60449 1 0 1 1 0 0 +EDGE2 7991 7650 -0.888991 0.0529885 -1.55691 1 0 1 1 0 0 +EDGE2 7992 7653 1.04412 -0.0293037 0.0136912 1 0 1 1 0 0 +EDGE2 7992 7991 -0.961867 -0.0375751 0.00441873 1 0 1 1 0 0 +EDGE2 7992 7652 -0.068768 0.081079 -0.0252032 1 0 1 1 0 0 +EDGE2 7992 7651 -1.00182 0.0657039 -0.0100296 1 0 1 1 0 0 +EDGE2 7993 7654 1.02257 0.0586338 0.00188565 1 0 1 1 0 0 +EDGE2 7993 7653 0.0593783 0.0177042 0.00959824 1 0 1 1 0 0 +EDGE2 7993 7652 -1.01821 0.0156164 0.0144091 1 0 1 1 0 0 +EDGE2 7993 7992 -1.07813 0.0134011 0.0092461 1 0 1 1 0 0 +EDGE2 7994 7654 -0.0387774 -0.0647463 -0.0226719 1 0 1 1 0 0 +EDGE2 7994 7655 1.05262 -0.0013732 0.0270303 1 0 1 1 0 0 +EDGE2 7994 7653 -0.971298 -0.0107554 0.0133662 1 0 1 1 0 0 +EDGE2 7994 7993 -0.890721 0.0158365 -0.0447389 1 0 1 1 0 0 +EDGE2 7995 7656 0.076482 -0.963502 -1.57985 1 0 1 1 0 0 +EDGE2 7995 7654 -1.01117 -0.134471 -0.0189871 1 0 1 1 0 0 +EDGE2 7995 7655 0.0243855 -0.0306284 -0.0354536 1 0 1 1 0 0 +EDGE2 7995 7994 -0.978932 -0.10748 0.0150863 1 0 1 1 0 0 +EDGE2 7996 7656 -0.077101 0.0449633 0.00760016 1 0 1 1 0 0 +EDGE2 7996 7655 -1.01918 0.0701514 1.55916 1 0 1 1 0 0 +EDGE2 7996 7995 -0.996415 0.116811 1.5517 1 0 1 1 0 0 +EDGE2 7996 7657 1.03141 -0.0424335 0.00540035 1 0 1 1 0 0 +EDGE2 7997 7656 -1.02877 -0.0146314 -0.0128987 1 0 1 1 0 0 +EDGE2 7997 7996 -1.01591 0.0468653 0.00838034 1 0 1 1 0 0 +EDGE2 7997 7658 1.00365 -0.00819669 0.0252863 1 0 1 1 0 0 +EDGE2 7997 7657 0.0212348 -0.0949369 0.017291 1 0 1 1 0 0 +EDGE2 7998 7658 0.0379251 0.0474992 -0.0188443 1 0 1 1 0 0 +EDGE2 7998 7657 -0.920849 0.0772162 0.0319731 1 0 1 1 0 0 +EDGE2 7998 7997 -1.02758 -0.0413692 -0.0249954 1 0 1 1 0 0 +EDGE2 7998 7659 1.01853 0.00352581 -0.0364714 1 0 1 1 0 0 +EDGE2 7999 7658 -1.0435 0.0820097 -0.010935 1 0 1 1 0 0 +EDGE2 7999 7998 -0.982946 -0.0293478 -0.00119184 1 0 1 1 0 0 +EDGE2 7999 7659 0.0321579 -0.0591873 -0.0145092 1 0 1 1 0 0 +EDGE2 7999 7660 0.942723 0.00945515 -0.0300498 1 0 1 1 0 0 +EDGE2 7999 7680 1.00483 0.0572231 -3.13238 1 0 1 1 0 0 +EDGE2 7999 6360 0.912992 -0.00882623 -3.15335 1 0 1 1 0 0 +EDGE2 8000 7999 -1.02094 -0.0223354 -0.012733 1 0 1 1 0 0 +EDGE2 8000 7659 -1.012 -0.0505403 -0.0104154 1 0 1 1 0 0 +EDGE2 8000 7660 0.0236036 0.00708783 -0.0141683 1 0 1 1 0 0 +EDGE2 8000 7680 -0.0452677 -0.0344366 -3.1496 1 0 1 1 0 0 +EDGE2 8000 6360 0.00386752 -0.0862352 -3.13057 1 0 1 1 0 0 +EDGE2 8000 6359 0.999264 0.0629235 -3.13159 1 0 1 1 0 0 +EDGE2 8000 7679 0.944452 0.00255616 -3.12474 1 0 1 1 0 0 +EDGE2 8000 6361 -0.0490985 -1.04837 -1.56977 1 0 1 1 0 0 +EDGE2 8000 7661 -0.0158736 -1.07844 -1.60928 1 0 1 1 0 0 +EDGE2 8000 7681 0.0203073 -1.00962 -1.59021 1 0 1 1 0 0 +EDGE2 8001 7660 -0.961536 0.0380677 1.56212 1 0 1 1 0 0 +EDGE2 8001 7680 -1.0287 -0.129854 -1.58201 1 0 1 1 0 0 +EDGE2 8001 8000 -0.98189 0.0246904 1.56314 1 0 1 1 0 0 +EDGE2 8001 6360 -0.967648 -0.0132066 -1.56304 1 0 1 1 0 0 +EDGE2 8001 7682 0.979325 -0.108248 0.0264448 1 0 1 1 0 0 +EDGE2 8001 6361 -0.0247338 -0.0529937 0.00741464 1 0 1 1 0 0 +EDGE2 8001 7661 0.0665159 -0.0356183 0.0180469 1 0 1 1 0 0 +EDGE2 8001 7681 -0.0240446 -0.0438778 -0.00586033 1 0 1 1 0 0 +EDGE2 8001 6362 0.977031 0.0244864 0.0144625 1 0 1 1 0 0 +EDGE2 8001 7662 1.0027 -0.00848325 0.00261826 1 0 1 1 0 0 +EDGE2 8002 8001 -0.938328 0.0143415 0.014201 1 0 1 1 0 0 +EDGE2 8002 7682 -0.0257582 -0.0651235 0.0145975 1 0 1 1 0 0 +EDGE2 8002 6361 -1.01393 0.00920844 0.0196852 1 0 1 1 0 0 +EDGE2 8002 7661 -0.953059 -0.0318633 -0.00729902 1 0 1 1 0 0 +EDGE2 8002 7681 -1.05752 0.0769404 0.0286289 1 0 1 1 0 0 +EDGE2 8002 6362 -0.0557226 -0.152686 0.0153142 1 0 1 1 0 0 +EDGE2 8002 7662 0.0183607 0.111572 -0.0151277 1 0 1 1 0 0 +EDGE2 8002 6363 1.07132 -0.0593021 0.0208769 1 0 1 1 0 0 +EDGE2 8002 7663 1.05999 0.0240182 0.0123469 1 0 1 1 0 0 +EDGE2 8002 7683 0.922079 -0.0322767 0.000811873 1 0 1 1 0 0 +EDGE2 8003 7682 -0.936345 0.0433664 -0.000379336 1 0 1 1 0 0 +EDGE2 8003 8002 -0.958986 0.0341575 0.0100683 1 0 1 1 0 0 +EDGE2 8003 6362 -1.03284 0.0208388 -0.0227858 1 0 1 1 0 0 +EDGE2 8003 7662 -1.01779 0.0291172 0.0214219 1 0 1 1 0 0 +EDGE2 8003 7684 0.956 -0.0502678 0.00105011 1 0 1 1 0 0 +EDGE2 8003 6363 0.0587677 -0.0254957 0.0102861 1 0 1 1 0 0 +EDGE2 8003 7663 0.0359612 -0.050626 -0.00235277 1 0 1 1 0 0 +EDGE2 8003 7683 0.0473312 0.0129646 0.00970064 1 0 1 1 0 0 +EDGE2 8003 6364 0.961391 -0.0363102 0.0191701 1 0 1 1 0 0 +EDGE2 8003 7664 1.06501 0.00700614 -0.00607152 1 0 1 1 0 0 +EDGE2 8004 7665 1.05978 0.0343976 -0.00504674 1 0 1 1 0 0 +EDGE2 8004 7684 -0.0890836 -0.0349331 0.0106776 1 0 1 1 0 0 +EDGE2 8004 8003 -0.948085 0.0256842 0.00928132 1 0 1 1 0 0 +EDGE2 8004 6363 -1.06555 -0.0580214 -0.00898348 1 0 1 1 0 0 +EDGE2 8004 7663 -1.05694 0.0310468 0.00628694 1 0 1 1 0 0 +EDGE2 8004 7683 -1.01829 0.0329592 -0.0221752 1 0 1 1 0 0 +EDGE2 8004 6364 0.0278218 -0.013291 -0.00364128 1 0 1 1 0 0 +EDGE2 8004 7664 -0.0485697 0.0634933 0.00542421 1 0 1 1 0 0 +EDGE2 8004 7685 0.983107 0.107808 -0.008646 1 0 1 1 0 0 +EDGE2 8004 6365 0.991477 0.0342773 -0.00275346 1 0 1 1 0 0 +EDGE2 8005 7665 -0.0806217 0.0539519 -0.00904252 1 0 1 1 0 0 +EDGE2 8005 7684 -0.977198 0.00591091 -0.0074708 1 0 1 1 0 0 +EDGE2 8005 8004 -1.04134 -0.0470644 -0.0136872 1 0 1 1 0 0 +EDGE2 8005 6364 -1.06057 -0.0439752 -0.0257429 1 0 1 1 0 0 +EDGE2 8005 7664 -0.980625 -0.0259995 0.0456925 1 0 1 1 0 0 +EDGE2 8005 7685 0.01455 0.00879169 0.00230361 1 0 1 1 0 0 +EDGE2 8005 6366 0.0447215 0.985952 1.54368 1 0 1 1 0 0 +EDGE2 8005 7686 -0.058958 0.968641 1.59123 1 0 1 1 0 0 +EDGE2 8005 6365 0.026716 -0.0691592 0.00577144 1 0 1 1 0 0 +EDGE2 8005 7666 0.0545476 0.909438 1.56393 1 0 1 1 0 0 +EDGE2 8006 7665 -1.04507 0.00150083 -1.55887 1 0 1 1 0 0 +EDGE2 8006 8005 -0.981053 0.00411178 -1.6024 1 0 1 1 0 0 +EDGE2 8006 7685 -0.959244 -0.0372334 -1.57605 1 0 1 1 0 0 +EDGE2 8006 6366 -0.0327169 0.048266 -0.0123009 1 0 1 1 0 0 +EDGE2 8006 7686 -0.022214 0.0199054 -0.0131403 1 0 1 1 0 0 +EDGE2 8006 6365 -0.88576 0.0178559 -1.58945 1 0 1 1 0 0 +EDGE2 8006 7666 0.000897113 -0.0570856 -0.00970336 1 0 1 1 0 0 +EDGE2 8006 7667 0.936487 0.0501963 -0.00820144 1 0 1 1 0 0 +EDGE2 8006 7687 1.00367 0.0555253 0.0137114 1 0 1 1 0 0 +EDGE2 8006 6367 0.992156 0.0195974 0.0201772 1 0 1 1 0 0 +EDGE2 8007 6366 -0.964581 0.0279473 0.0110787 1 0 1 1 0 0 +EDGE2 8007 7686 -1.03586 -0.0955757 0.0267529 1 0 1 1 0 0 +EDGE2 8007 8006 -0.987335 -0.0218126 0.0211407 1 0 1 1 0 0 +EDGE2 8007 7666 -0.989682 -0.0167293 -0.0143306 1 0 1 1 0 0 +EDGE2 8007 7667 0.0143105 0.0591506 0.0130429 1 0 1 1 0 0 +EDGE2 8007 7687 0.0469027 -0.0864207 0.034295 1 0 1 1 0 0 +EDGE2 8007 6367 0.0187412 -0.0417637 -0.00332724 1 0 1 1 0 0 +EDGE2 8007 7668 0.904306 0.103057 0.00359372 1 0 1 1 0 0 +EDGE2 8007 7688 1.00703 -0.0246579 -0.0174034 1 0 1 1 0 0 +EDGE2 8007 6368 0.981997 0.00180095 0.0232571 1 0 1 1 0 0 +EDGE2 8008 7667 -0.918215 0.0565282 -0.00279204 1 0 1 1 0 0 +EDGE2 8008 7687 -1.03588 0.014057 -0.0496059 1 0 1 1 0 0 +EDGE2 8008 8007 -0.940882 0.0236436 0.0081506 1 0 1 1 0 0 +EDGE2 8008 6367 -0.95073 0.000143895 0.0160517 1 0 1 1 0 0 +EDGE2 8008 7668 -0.0800137 0.0806524 -0.0142668 1 0 1 1 0 0 +EDGE2 8008 7688 0.0369242 -0.0483583 0.0214071 1 0 1 1 0 0 +EDGE2 8008 6368 0.0221481 -0.0670514 -0.0216076 1 0 1 1 0 0 +EDGE2 8008 7669 1.01164 0.00279631 -0.00429935 1 0 1 1 0 0 +EDGE2 8008 7689 1.09226 0.0183938 0.0205155 1 0 1 1 0 0 +EDGE2 8008 6369 0.917778 -0.0826949 -0.012888 1 0 1 1 0 0 +EDGE2 8009 8008 -0.929317 -0.0121571 -0.0165396 1 0 1 1 0 0 +EDGE2 8009 7668 -0.991515 -0.0435587 -0.00755787 1 0 1 1 0 0 +EDGE2 8009 7688 -0.900201 0.00965187 -0.0189921 1 0 1 1 0 0 +EDGE2 8009 6368 -1.04628 -0.0776108 0.0297212 1 0 1 1 0 0 +EDGE2 8009 7669 -0.0384895 -0.0732008 -0.0242585 1 0 1 1 0 0 +EDGE2 8009 7689 -0.014622 -0.00988011 -0.00681382 1 0 1 1 0 0 +EDGE2 8009 6369 0.0354058 0.00617091 -0.0223379 1 0 1 1 0 0 +EDGE2 8009 7690 1.00217 0.0471498 -0.0105416 1 0 1 1 0 0 +EDGE2 8009 6370 0.996309 0.0356181 0.00379552 1 0 1 1 0 0 +EDGE2 8009 7670 0.953989 0.0479517 -0.0177876 1 0 1 1 0 0 +EDGE2 8010 7691 0.0459062 -0.95331 -1.57632 1 0 1 1 0 0 +EDGE2 8010 7669 -0.988058 0.00850725 0.0177458 1 0 1 1 0 0 +EDGE2 8010 7689 -0.943594 0.00201895 0.00985289 1 0 1 1 0 0 +EDGE2 8010 8009 -0.970061 0.00388433 0.0380855 1 0 1 1 0 0 +EDGE2 8010 6369 -1.02445 0.0581751 0.000920258 1 0 1 1 0 0 +EDGE2 8010 6371 -0.0476177 1.01374 1.56986 1 0 1 1 0 0 +EDGE2 8010 7671 0.0237619 1.00116 1.56416 1 0 1 1 0 0 +EDGE2 8010 7690 -0.00469383 0.0465671 0.00343214 1 0 1 1 0 0 +EDGE2 8010 6370 0.0178242 -0.0544182 -0.00550525 1 0 1 1 0 0 +EDGE2 8010 7670 0.0531237 -0.0756904 0.0161453 1 0 1 1 0 0 +EDGE2 8011 7691 -0.0709643 0.0112706 -0.0285007 1 0 1 1 0 0 +EDGE2 8011 8010 -0.993219 0.047224 1.56408 1 0 1 1 0 0 +EDGE2 8011 7690 -0.99004 -0.00859269 1.60465 1 0 1 1 0 0 +EDGE2 8011 6370 -0.997131 -0.0378551 1.573 1 0 1 1 0 0 +EDGE2 8011 7670 -0.994055 0.0329469 1.56696 1 0 1 1 0 0 +EDGE2 8011 7692 0.99206 -0.120494 0.0191512 1 0 1 1 0 0 +EDGE2 8012 7691 -1.02611 0.0669668 0.00355723 1 0 1 1 0 0 +EDGE2 8012 8011 -1.00001 -0.000108434 -0.00540802 1 0 1 1 0 0 +EDGE2 8012 7692 -0.00136388 -0.11427 -0.0382923 1 0 1 1 0 0 +EDGE2 8012 7693 0.940126 0.027968 -0.0217302 1 0 1 1 0 0 +EDGE2 8013 7692 -1.01099 0.0427672 0.0160371 1 0 1 1 0 0 +EDGE2 8013 8012 -1.06246 0.0288041 0.0111472 1 0 1 1 0 0 +EDGE2 8013 7693 0.0569952 0.0522288 -0.0369245 1 0 1 1 0 0 +EDGE2 8013 7694 0.92919 -0.0398328 0.00428249 1 0 1 1 0 0 +EDGE2 8014 8013 -0.99504 0.0363154 0.0198293 1 0 1 1 0 0 +EDGE2 8014 7693 -1.00708 0.00946715 -0.000254413 1 0 1 1 0 0 +EDGE2 8014 7715 1.05868 -0.00683984 -3.1341 1 0 1 1 0 0 +EDGE2 8014 7694 -0.0281668 -0.0238007 0.00562984 1 0 1 1 0 0 +EDGE2 8014 7695 0.972421 -0.0149474 0.00685513 1 0 1 1 0 0 +EDGE2 8015 7716 -0.0761519 -1.01323 -1.5609 1 0 1 1 0 0 +EDGE2 8015 7696 -0.00703447 -1.06555 -1.55055 1 0 1 1 0 0 +EDGE2 8015 7715 0.0260842 -0.00966955 -3.14313 1 0 1 1 0 0 +EDGE2 8015 7694 -0.957443 0.0210435 0.00522529 1 0 1 1 0 0 +EDGE2 8015 8014 -0.948828 0.0184162 -0.0145521 1 0 1 1 0 0 +EDGE2 8015 7695 0.00193437 0.0254484 0.0110963 1 0 1 1 0 0 +EDGE2 8015 7714 0.973704 -0.0355531 -3.17728 1 0 1 1 0 0 +EDGE2 8016 7715 -1.05197 -0.0789734 1.58117 1 0 1 1 0 0 +EDGE2 8016 8015 -0.963828 0.0191885 -1.56617 1 0 1 1 0 0 +EDGE2 8016 7695 -1.01014 0.0479543 -1.57928 1 0 1 1 0 0 +EDGE2 8017 8016 -1.05473 -0.0619223 -0.018912 1 0 1 1 0 0 +EDGE2 8018 8017 -0.995357 0.0673293 0.0130838 1 0 1 1 0 0 +EDGE2 8019 6460 0.983109 -0.0364375 -3.13062 1 0 1 1 0 0 +EDGE2 8019 8018 -0.940582 0.00698694 0.0238933 1 0 1 1 0 0 +EDGE2 8019 6440 0.940989 0.0287962 -3.1315 1 0 1 1 0 0 +EDGE2 8019 6420 1.06491 -0.0179557 -3.16144 1 0 1 1 0 0 +EDGE2 8020 6460 0.0770644 0.00181794 -3.17004 1 0 1 1 0 0 +EDGE2 8020 8019 -1.00731 -0.101084 0.0251148 1 0 1 1 0 0 +EDGE2 8020 6461 0.0191836 -0.970192 -1.59219 1 0 1 1 0 0 +EDGE2 8020 6440 0.00694606 -0.0313208 -3.11794 1 0 1 1 0 0 +EDGE2 8020 6420 0.00513981 0.0104434 -3.1128 1 0 1 1 0 0 +EDGE2 8020 6421 0.0350864 -1.00484 -1.56617 1 0 1 1 0 0 +EDGE2 8020 6441 0.0235534 -1.052 -1.5978 1 0 1 1 0 0 +EDGE2 8020 6459 1.00692 0.101604 -3.15381 1 0 1 1 0 0 +EDGE2 8020 6419 0.955446 -0.0245672 -3.14852 1 0 1 1 0 0 +EDGE2 8020 6439 0.950322 0.0510958 -3.15471 1 0 1 1 0 0 +EDGE2 8021 6460 -1.05512 -0.00271352 1.5582 1 0 1 1 0 0 +EDGE2 8021 8020 -1.06881 -0.0557021 -1.57419 1 0 1 1 0 0 +EDGE2 8021 6440 -1.00004 -0.0562862 1.56358 1 0 1 1 0 0 +EDGE2 8021 6420 -0.92609 0.037107 1.56924 1 0 1 1 0 0 +EDGE2 8022 8021 -1.01674 0.0340929 -0.0225367 1 0 1 1 0 0 +EDGE2 8023 8022 -1.02965 -0.0198245 -0.00931661 1 0 1 1 0 0 +EDGE2 8024 6385 1.01459 0.0654946 -3.12043 1 0 1 1 0 0 +EDGE2 8024 8023 -0.990178 -0.0363448 -0.0241504 1 0 1 1 0 0 +EDGE2 8025 6385 -0.0224716 -0.0135788 -3.12683 1 0 1 1 0 0 +EDGE2 8025 6384 1.0752 -0.0474806 -3.17575 1 0 1 1 0 0 +EDGE2 8025 6386 0.0646203 -0.964293 -1.57511 1 0 1 1 0 0 +EDGE2 8025 8024 -1.08051 -0.0323606 0.0115142 1 0 1 1 0 0 +EDGE2 8026 6385 -1.02204 0.00100031 1.57581 1 0 1 1 0 0 +EDGE2 8026 8025 -0.920263 -0.0307882 -1.57959 1 0 1 1 0 0 +EDGE2 8027 8026 -1.00567 -0.0556055 0.00808194 1 0 1 1 0 0 +EDGE2 8028 8027 -1.08426 -0.00330118 0.00607383 1 0 1 1 0 0 +EDGE2 8029 8010 1.0613 -0.012041 -3.0978 1 0 1 1 0 0 +EDGE2 8029 7690 1.08562 -0.0544714 -3.21064 1 0 1 1 0 0 +EDGE2 8029 6370 0.952022 0.000927486 -3.16459 1 0 1 1 0 0 +EDGE2 8029 7670 0.958361 0.015635 -3.1377 1 0 1 1 0 0 +EDGE2 8029 8028 -0.931152 -0.061198 0.0160875 1 0 1 1 0 0 +EDGE2 8030 7691 0.0172473 0.969154 1.59862 1 0 1 1 0 0 +EDGE2 8030 8010 -0.0975632 0.0230537 -3.13929 1 0 1 1 0 0 +EDGE2 8030 7669 0.994782 0.0697981 -3.1337 1 0 1 1 0 0 +EDGE2 8030 7689 1.03504 0.0445995 -3.15777 1 0 1 1 0 0 +EDGE2 8030 8009 0.902439 -0.0425876 -3.15461 1 0 1 1 0 0 +EDGE2 8030 6369 0.955287 -0.00130488 -3.11618 1 0 1 1 0 0 +EDGE2 8030 6371 -0.090754 -1.08843 -1.58698 1 0 1 1 0 0 +EDGE2 8030 7671 0.0329184 -0.944542 -1.5645 1 0 1 1 0 0 +EDGE2 8030 7690 -0.0500056 0.096903 -3.14737 1 0 1 1 0 0 +EDGE2 8030 6370 0.00114115 -0.0418674 -3.14996 1 0 1 1 0 0 +EDGE2 8030 7670 0.000275416 0.0879539 -3.14969 1 0 1 1 0 0 +EDGE2 8030 8011 0.0836903 0.99773 1.5584 1 0 1 1 0 0 +EDGE2 8030 8029 -0.983714 0.005356 0.0312055 1 0 1 1 0 0 +EDGE2 8031 7691 0.0566389 0.0513334 -0.0290067 1 0 1 1 0 0 +EDGE2 8031 8010 -0.961589 -0.0451969 1.55632 1 0 1 1 0 0 +EDGE2 8031 8030 -0.90378 -0.00391036 -1.58808 1 0 1 1 0 0 +EDGE2 8031 7690 -1.01507 -0.00313988 1.60438 1 0 1 1 0 0 +EDGE2 8031 6370 -1.01711 -0.0426161 1.54138 1 0 1 1 0 0 +EDGE2 8031 7670 -1.05054 -0.0379413 1.56569 1 0 1 1 0 0 +EDGE2 8031 8011 0.0703477 0.0994479 -0.0240011 1 0 1 1 0 0 +EDGE2 8031 7692 0.992955 0.014539 0.00245236 1 0 1 1 0 0 +EDGE2 8031 8012 0.956066 -0.045733 0.0187739 1 0 1 1 0 0 +EDGE2 8032 7691 -1.07662 0.0468191 -0.0244001 1 0 1 1 0 0 +EDGE2 8032 8031 -0.989705 -0.0184992 -0.0105005 1 0 1 1 0 0 +EDGE2 8032 8011 -1.02343 0.0101817 0.00195708 1 0 1 1 0 0 +EDGE2 8032 8013 0.912424 0.0379568 -0.00285019 1 0 1 1 0 0 +EDGE2 8032 7692 0.0211728 -0.0207869 -0.00991654 1 0 1 1 0 0 +EDGE2 8032 8012 -0.0210767 -0.0286757 0.0261671 1 0 1 1 0 0 +EDGE2 8032 7693 0.990068 0.068728 0.0295653 1 0 1 1 0 0 +EDGE2 8033 8013 0.0183734 -0.0684988 0.00880613 1 0 1 1 0 0 +EDGE2 8033 7692 -0.972917 0.0457905 -0.0178282 1 0 1 1 0 0 +EDGE2 8033 8012 -0.92818 0.0663515 0.00326129 1 0 1 1 0 0 +EDGE2 8033 8032 -1.08655 0.0431431 -0.0282659 1 0 1 1 0 0 +EDGE2 8033 7693 -0.0625442 0.107035 0.000520447 1 0 1 1 0 0 +EDGE2 8033 7694 1.0483 -0.046553 -0.00490896 1 0 1 1 0 0 +EDGE2 8033 8014 0.902594 -0.0992718 -0.011163 1 0 1 1 0 0 +EDGE2 8034 8013 -0.915688 0.00829183 -0.0161782 1 0 1 1 0 0 +EDGE2 8034 8033 -0.994934 -0.00909549 -0.0203748 1 0 1 1 0 0 +EDGE2 8034 7693 -0.965387 -0.0358471 -0.0147921 1 0 1 1 0 0 +EDGE2 8034 7715 0.935418 0.0224028 -3.14536 1 0 1 1 0 0 +EDGE2 8034 7694 -0.0329004 -0.0702676 0.0278591 1 0 1 1 0 0 +EDGE2 8034 8014 0.0126527 -0.0229225 0.00594579 1 0 1 1 0 0 +EDGE2 8034 8015 0.980994 0.0275472 0.0181493 1 0 1 1 0 0 +EDGE2 8034 7695 1.02492 -0.013917 -0.0103504 1 0 1 1 0 0 +EDGE2 8035 7716 0.0940919 -1.11355 -1.57176 1 0 1 1 0 0 +EDGE2 8035 7696 0.0582091 -0.988134 -1.58727 1 0 1 1 0 0 +EDGE2 8035 8034 -0.971025 0.009234 0.00348534 1 0 1 1 0 0 +EDGE2 8035 7715 -0.0203541 -0.0860744 -3.12566 1 0 1 1 0 0 +EDGE2 8035 7694 -0.989305 -0.0761395 -0.0129011 1 0 1 1 0 0 +EDGE2 8035 8014 -1.07497 0.000239929 0.0400998 1 0 1 1 0 0 +EDGE2 8035 8015 0.151343 -0.0364523 -0.00176882 1 0 1 1 0 0 +EDGE2 8035 8016 0.074149 0.934477 1.58009 1 0 1 1 0 0 +EDGE2 8035 7695 -0.0181462 -0.0738238 0.00564014 1 0 1 1 0 0 +EDGE2 8035 7714 1.04104 0.0976615 -3.16763 1 0 1 1 0 0 +EDGE2 8036 7717 1.05642 0.0105425 0.0485276 1 0 1 1 0 0 +EDGE2 8036 7716 0.0565147 0.0278718 -0.0141911 1 0 1 1 0 0 +EDGE2 8036 7697 1.01202 0.00877927 -0.000543032 1 0 1 1 0 0 +EDGE2 8036 7696 0.102239 -0.0120967 0.00549643 1 0 1 1 0 0 +EDGE2 8036 7715 -1.05042 0.00414036 -1.55672 1 0 1 1 0 0 +EDGE2 8036 8035 -1.01206 -0.0347257 1.57799 1 0 1 1 0 0 +EDGE2 8036 8015 -0.983873 -0.00859645 1.57246 1 0 1 1 0 0 +EDGE2 8036 7695 -0.953052 0.0440938 1.60254 1 0 1 1 0 0 +EDGE2 8037 7717 0.0374034 0.00501476 -0.0203263 1 0 1 1 0 0 +EDGE2 8037 7698 0.941389 0.0320293 -0.00101598 1 0 1 1 0 0 +EDGE2 8037 7718 1.03707 -0.0277437 -0.0202528 1 0 1 1 0 0 +EDGE2 8037 7716 -0.969496 0.0573349 -0.00267791 1 0 1 1 0 0 +EDGE2 8037 8036 -0.976055 -0.0594668 -0.0288813 1 0 1 1 0 0 +EDGE2 8037 7697 0.0443538 0.0118686 -0.036403 1 0 1 1 0 0 +EDGE2 8037 7696 -0.940714 0.0694939 -0.023333 1 0 1 1 0 0 +EDGE2 8038 7717 -0.929445 -0.0491922 -0.0166331 1 0 1 1 0 0 +EDGE2 8038 7699 0.974162 0.0662217 0.0313938 1 0 1 1 0 0 +EDGE2 8038 7719 0.958778 -0.0290383 0.00199833 1 0 1 1 0 0 +EDGE2 8038 7698 -0.00619501 0.0815425 0.0180918 1 0 1 1 0 0 +EDGE2 8038 7718 -0.0066027 0.00337751 -0.00358692 1 0 1 1 0 0 +EDGE2 8038 8037 -1.02585 -0.00552929 0.000293994 1 0 1 1 0 0 +EDGE2 8038 7697 -0.985115 -0.0692767 0.00311034 1 0 1 1 0 0 +EDGE2 8039 7699 0.106675 -0.0432521 -0.0121195 1 0 1 1 0 0 +EDGE2 8039 7719 0.0326314 0.000154673 -0.0157513 1 0 1 1 0 0 +EDGE2 8039 7700 1.00716 0.103314 -0.0398154 1 0 1 1 0 0 +EDGE2 8039 7720 0.875557 -0.00784367 0.00278943 1 0 1 1 0 0 +EDGE2 8039 7698 -1.0039 -0.00409199 -0.0144066 1 0 1 1 0 0 +EDGE2 8039 7718 -1.05802 -0.0259807 -0.0242141 1 0 1 1 0 0 +EDGE2 8039 8038 -0.984595 -0.00618337 -0.00656442 1 0 1 1 0 0 +EDGE2 8040 7699 -1.11812 0.0204601 -0.000137178 1 0 1 1 0 0 +EDGE2 8040 7719 -0.900013 -0.0248021 0.00591669 1 0 1 1 0 0 +EDGE2 8040 7700 0.00258981 -0.01523 0.0057653 1 0 1 1 0 0 +EDGE2 8040 7720 0.0197826 -0.0973419 0.0358732 1 0 1 1 0 0 +EDGE2 8040 8039 -1.00967 -0.0381178 0.0294294 1 0 1 1 0 0 +EDGE2 8040 7701 -0.041374 1.01694 1.56476 1 0 1 1 0 0 +EDGE2 8040 7721 0.0451953 1.0674 1.55128 1 0 1 1 0 0 +EDGE2 8041 7700 -1.02888 -0.0290088 -1.58701 1 0 1 1 0 0 +EDGE2 8041 7720 -1.09769 0.0460167 -1.58354 1 0 1 1 0 0 +EDGE2 8041 8040 -0.891266 -0.0172381 -1.5598 1 0 1 1 0 0 +EDGE2 8041 7722 1.03689 0.0266095 0.00198869 1 0 1 1 0 0 +EDGE2 8041 7701 -0.0224956 -0.0146872 -0.010256 1 0 1 1 0 0 +EDGE2 8041 7721 0.0119723 0.0369996 -0.00173001 1 0 1 1 0 0 +EDGE2 8041 7702 0.93991 0.0387004 0.0129863 1 0 1 1 0 0 +EDGE2 8042 7722 -0.0641524 0.0755131 -0.0184556 1 0 1 1 0 0 +EDGE2 8042 7701 -1.00754 0.0850753 -0.00882911 1 0 1 1 0 0 +EDGE2 8042 7721 -0.930814 0.00555828 0.0160751 1 0 1 1 0 0 +EDGE2 8042 8041 -0.980559 0.0281997 -0.00234605 1 0 1 1 0 0 +EDGE2 8042 7723 0.961982 -0.0501654 -0.0340165 1 0 1 1 0 0 +EDGE2 8042 7702 0.052808 -0.054349 0.0117862 1 0 1 1 0 0 +EDGE2 8042 7703 1.00899 0.00663069 0.00900631 1 0 1 1 0 0 +EDGE2 8043 7722 -0.918652 0.0422514 0.0247204 1 0 1 1 0 0 +EDGE2 8043 8042 -1.04267 -0.0103375 0.0283456 1 0 1 1 0 0 +EDGE2 8043 7724 1.00612 0.0234937 0.0284286 1 0 1 1 0 0 +EDGE2 8043 7723 -0.00134919 -0.0170113 0.00946427 1 0 1 1 0 0 +EDGE2 8043 7702 -0.991729 0.0600538 -0.00769658 1 0 1 1 0 0 +EDGE2 8043 7703 -0.00595207 0.0202115 -0.000659036 1 0 1 1 0 0 +EDGE2 8043 7704 1.02423 0.0159345 -0.00863704 1 0 1 1 0 0 +EDGE2 8044 7724 -0.0270962 0.0628005 -0.0149583 1 0 1 1 0 0 +EDGE2 8044 7723 -0.995745 0.0513366 -0.022866 1 0 1 1 0 0 +EDGE2 8044 8043 -0.984253 -0.0549427 -0.0282861 1 0 1 1 0 0 +EDGE2 8044 7703 -0.985798 -0.0998413 0.0277224 1 0 1 1 0 0 +EDGE2 8044 7725 0.984351 -0.0163748 0.0110779 1 0 1 1 0 0 +EDGE2 8044 7704 -0.0782721 0.0339356 -0.00294341 1 0 1 1 0 0 +EDGE2 8044 7705 1.00277 -0.0365889 -0.00572368 1 0 1 1 0 0 +EDGE2 8045 7726 -0.0177469 -0.960071 -1.5943 1 0 1 1 0 0 +EDGE2 8045 7724 -1.11509 0.0443895 -0.0196554 1 0 1 1 0 0 +EDGE2 8045 8044 -0.999855 0.0066746 -0.00266591 1 0 1 1 0 0 +EDGE2 8045 7725 -0.00361668 0.00117396 -0.00235218 1 0 1 1 0 0 +EDGE2 8045 7704 -1.16857 -0.0923863 0.00351332 1 0 1 1 0 0 +EDGE2 8045 7705 0.00277118 -0.0674371 -0.0200828 1 0 1 1 0 0 +EDGE2 8045 7706 0.0662821 0.975125 1.59463 1 0 1 1 0 0 +EDGE2 8046 7725 -1.05543 -0.02662 -1.58191 1 0 1 1 0 0 +EDGE2 8046 8045 -0.977247 0.0101138 -1.56846 1 0 1 1 0 0 +EDGE2 8046 7705 -1.08215 0.0418292 -1.5949 1 0 1 1 0 0 +EDGE2 8046 7706 0.0305933 -0.0331305 0.00676048 1 0 1 1 0 0 +EDGE2 8046 7707 0.969057 0.0763332 -0.0246708 1 0 1 1 0 0 +EDGE2 8047 8046 -0.947161 0.0480451 -0.0112988 1 0 1 1 0 0 +EDGE2 8047 7706 -0.983445 -0.0816867 0.015071 1 0 1 1 0 0 +EDGE2 8047 7707 0.00661869 -0.00291549 0.0235704 1 0 1 1 0 0 +EDGE2 8047 7708 1.10466 0.0911022 -0.0110911 1 0 1 1 0 0 +EDGE2 8048 8047 -1.03828 -0.00809906 0.000749269 1 0 1 1 0 0 +EDGE2 8048 7707 -0.959658 0.0196645 0.000548849 1 0 1 1 0 0 +EDGE2 8048 7708 -0.105644 -0.0371646 -0.0427326 1 0 1 1 0 0 +EDGE2 8048 7709 0.960706 -0.0803025 -0.0463639 1 0 1 1 0 0 +EDGE2 8049 7708 -1.04983 0.0703248 0.0243387 1 0 1 1 0 0 +EDGE2 8049 8048 -0.954759 -0.0714291 0.00268885 1 0 1 1 0 0 +EDGE2 8049 7709 -0.00550146 0.0154489 0.0247941 1 0 1 1 0 0 +EDGE2 8049 7710 1.0048 -0.0626145 0.010436 1 0 1 1 0 0 +EDGE2 8050 8049 -1.07051 -0.0287956 -0.0145045 1 0 1 1 0 0 +EDGE2 8050 7709 -0.979371 -0.043811 -0.0160197 1 0 1 1 0 0 +EDGE2 8050 7710 0.0235282 0.0303688 0.00261751 1 0 1 1 0 0 +EDGE2 8050 7711 -0.0168019 0.92667 1.59752 1 0 1 1 0 0 +EDGE2 8051 7710 -1.09451 -0.0406403 1.5974 1 0 1 1 0 0 +EDGE2 8051 8050 -0.996429 -0.000939058 1.59975 1 0 1 1 0 0 +EDGE2 8052 8051 -1.0596 -0.0738648 -0.00478566 1 0 1 1 0 0 +EDGE2 8053 8052 -0.940834 -0.042316 -0.0324118 1 0 1 1 0 0 +EDGE2 8054 8053 -1.01818 -0.00543487 0.0153247 1 0 1 1 0 0 +EDGE2 8055 8054 -1.01298 0.0148396 0.0297748 1 0 1 1 0 0 +EDGE2 8056 8055 -1.00861 -0.0141718 1.56057 1 0 1 1 0 0 +EDGE2 8057 8056 -1.00042 -0.0148598 -0.0245793 1 0 1 1 0 0 +EDGE2 8058 8057 -1.04824 0.0735158 0.0101188 1 0 1 1 0 0 +EDGE2 8059 8058 -0.980863 0.0097301 0.00483767 1 0 1 1 0 0 +EDGE2 8060 8059 -0.983158 -0.0556283 -3.83322e-05 1 0 1 1 0 0 +EDGE2 8061 8060 -0.996617 -0.0133093 -1.56182 1 0 1 1 0 0 +EDGE2 8062 8061 -0.950803 0.0898241 -0.024565 1 0 1 1 0 0 +EDGE2 8063 8062 -1.06525 -0.0128265 0.0153357 1 0 1 1 0 0 +EDGE2 8064 8063 -1.01859 0.0308765 -0.0301201 1 0 1 1 0 0 +EDGE2 8064 6605 1.14324 -0.0204338 -3.12934 1 0 1 1 0 0 +EDGE2 8065 8064 -0.929735 -0.0932641 -0.00344696 1 0 1 1 0 0 +EDGE2 8065 6606 0.0161324 -1.01161 -1.55836 1 0 1 1 0 0 +EDGE2 8065 6605 0.0774731 -0.0346245 -3.13901 1 0 1 1 0 0 +EDGE2 8065 6604 0.989298 -0.0632114 -3.17227 1 0 1 1 0 0 +EDGE2 8066 6605 -0.974805 0.0243283 1.56522 1 0 1 1 0 0 +EDGE2 8066 8065 -1.01737 -0.0578707 -1.56107 1 0 1 1 0 0 +EDGE2 8067 8066 -0.980424 -0.0307662 0.0324148 1 0 1 1 0 0 +EDGE2 8068 8067 -0.899212 -0.0543025 0.0191105 1 0 1 1 0 0 +EDGE2 8069 8068 -1.0053 -0.0116186 -0.0287302 1 0 1 1 0 0 +EDGE2 8069 6530 1.0376 -0.0958687 -3.12348 1 0 1 1 0 0 +EDGE2 8069 6670 0.985834 0.0516335 -3.14258 1 0 1 1 0 0 +EDGE2 8070 8069 -1.08265 0.0385365 -0.0113541 1 0 1 1 0 0 +EDGE2 8070 6529 0.901012 -0.00527766 -3.12277 1 0 1 1 0 0 +EDGE2 8070 6669 1.03787 0.00548381 -3.13596 1 0 1 1 0 0 +EDGE2 8070 6530 -0.0189696 0.0471138 -3.10541 1 0 1 1 0 0 +EDGE2 8070 6670 -0.0447928 -0.0014759 -3.16918 1 0 1 1 0 0 +EDGE2 8070 6531 -0.0638332 -1.02476 -1.59701 1 0 1 1 0 0 +EDGE2 8070 6671 -0.0534382 -0.992411 -1.55725 1 0 1 1 0 0 +EDGE2 8071 8070 -0.90848 0.024262 -1.57709 1 0 1 1 0 0 +EDGE2 8071 6530 -0.965754 0.0640063 1.54968 1 0 1 1 0 0 +EDGE2 8071 6670 -0.917982 -0.0243969 1.53704 1 0 1 1 0 0 +EDGE2 8072 8071 -0.968355 0.027351 0.032341 1 0 1 1 0 0 +EDGE2 8073 8072 -0.943901 -0.0877849 -0.00538672 1 0 1 1 0 0 +EDGE2 8074 8055 0.998207 0.016593 -3.13485 1 0 1 1 0 0 +EDGE2 8074 8073 -0.969641 -0.00255919 -0.0303923 1 0 1 1 0 0 +EDGE2 8075 8055 -0.0281388 -0.0975018 -3.11957 1 0 1 1 0 0 +EDGE2 8075 8056 0.0610442 0.974581 1.58583 1 0 1 1 0 0 +EDGE2 8075 8054 1.03749 -0.036061 -3.14633 1 0 1 1 0 0 +EDGE2 8075 8074 -1.10432 -0.0364576 0.00211627 1 0 1 1 0 0 +EDGE2 8076 8055 -1.03344 -0.0179257 -1.57245 1 0 1 1 0 0 +EDGE2 8076 8075 -1.01934 -0.0840168 1.54465 1 0 1 1 0 0 +EDGE2 8077 8076 -0.962187 0.0244605 0.0285047 1 0 1 1 0 0 +EDGE2 8078 8077 -0.9546 -0.000616505 -0.0153679 1 0 1 1 0 0 +EDGE2 8079 6520 1.02595 0.122295 -3.14549 1 0 1 1 0 0 +EDGE2 8079 8078 -0.924171 0.00622517 -0.0194511 1 0 1 1 0 0 +EDGE2 8080 6520 -0.0306964 -0.00720928 -3.13219 1 0 1 1 0 0 +EDGE2 8080 8079 -1.02044 -0.0564299 0.00684934 1 0 1 1 0 0 +EDGE2 8080 6519 1.01356 0.00744113 -3.13104 1 0 1 1 0 0 +EDGE2 8080 6521 0.0279359 -1.03296 -1.55795 1 0 1 1 0 0 +EDGE2 8081 6520 -1.01578 0.00700516 -1.54982 1 0 1 1 0 0 +EDGE2 8081 8080 -0.97554 0.0525612 1.54077 1 0 1 1 0 0 +EDGE2 8081 6521 0.0354028 -0.0392579 0.0339609 1 0 1 1 0 0 +EDGE2 8081 6522 0.971136 0.00557266 -0.020067 1 0 1 1 0 0 +EDGE2 8082 6521 -1.05276 -0.0344058 -0.00477251 1 0 1 1 0 0 +EDGE2 8082 8081 -0.992244 -0.00787787 0.0136271 1 0 1 1 0 0 +EDGE2 8082 6522 -0.0263594 -0.00590971 -0.00917901 1 0 1 1 0 0 +EDGE2 8082 6523 1.00967 -0.0226518 -0.00797839 1 0 1 1 0 0 +EDGE2 8083 8082 -1.01452 0.0627059 -0.0304712 1 0 1 1 0 0 +EDGE2 8083 6522 -0.94411 0.0311484 0.0031434 1 0 1 1 0 0 +EDGE2 8083 6524 1.1088 0.0169157 0.00723465 1 0 1 1 0 0 +EDGE2 8083 6523 0.0724737 0.119036 -0.0181532 1 0 1 1 0 0 +EDGE2 8084 8083 -1.01098 0.0161587 -0.0113408 1 0 1 1 0 0 +EDGE2 8084 6524 -0.0892911 0.0699233 0.0167364 1 0 1 1 0 0 +EDGE2 8084 6523 -1.01158 -0.0451246 -0.010735 1 0 1 1 0 0 +EDGE2 8084 6525 0.991627 -0.0502232 0.0226439 1 0 1 1 0 0 +EDGE2 8084 6665 0.959565 -0.0291027 -3.12394 1 0 1 1 0 0 +EDGE2 8085 6666 0.000734005 -1.07762 -1.58113 1 0 1 1 0 0 +EDGE2 8085 6526 0.0600606 -1.11611 -1.56988 1 0 1 1 0 0 +EDGE2 8085 6524 -1.04531 0.0572903 0.00323579 1 0 1 1 0 0 +EDGE2 8085 8084 -1.05352 -0.0497426 0.00116394 1 0 1 1 0 0 +EDGE2 8085 6525 -0.0312085 0.0537541 -0.0163878 1 0 1 1 0 0 +EDGE2 8085 6665 -0.101985 0.0584296 -3.13788 1 0 1 1 0 0 +EDGE2 8085 6664 1.05465 0.0574258 -3.12006 1 0 1 1 0 0 +EDGE2 8086 8085 -1.01309 -0.0671949 -1.5105 1 0 1 1 0 0 +EDGE2 8086 6525 -1.02217 -0.0170228 -1.54305 1 0 1 1 0 0 +EDGE2 8086 6665 -1.04668 -0.0398469 1.56058 1 0 1 1 0 0 +EDGE2 8087 8086 -0.981098 0.00261995 0.0188771 1 0 1 1 0 0 +EDGE2 8088 8087 -0.936991 0.0543339 -0.0245479 1 0 1 1 0 0 +EDGE2 8089 8088 -1.02399 -0.0343852 -0.0266112 1 0 1 1 0 0 +EDGE2 8090 8089 -0.864989 -0.0470425 -0.0192481 1 0 1 1 0 0 +EDGE2 8091 8090 -1.02464 -0.0262449 -1.58001 1 0 1 1 0 0 +EDGE2 8092 8091 -1.04065 0.0685931 -0.0154147 1 0 1 1 0 0 +EDGE2 8093 8092 -1.09934 -0.0277239 -0.017614 1 0 1 1 0 0 +EDGE2 8094 6495 1.03727 0.0528413 -3.1373 1 0 1 1 0 0 +EDGE2 8094 6515 0.990218 -0.0770423 -3.16774 1 0 1 1 0 0 +EDGE2 8094 6475 0.989435 0.00905286 -3.15053 1 0 1 1 0 0 +EDGE2 8094 8093 -1.00392 -0.0557674 -0.037303 1 0 1 1 0 0 +EDGE2 8095 6516 0.0384304 1.09499 1.5908 1 0 1 1 0 0 +EDGE2 8095 6474 0.991272 0.0165542 -3.14605 1 0 1 1 0 0 +EDGE2 8095 6514 1.04933 -0.0266108 -3.15453 1 0 1 1 0 0 +EDGE2 8095 6494 0.942165 0.0106052 -3.15596 1 0 1 1 0 0 +EDGE2 8095 8094 -1.10658 -0.0977601 -0.0311885 1 0 1 1 0 0 +EDGE2 8095 6495 0.00115099 0.0595171 -3.12607 1 0 1 1 0 0 +EDGE2 8095 6515 0.0360514 0.058835 -3.12896 1 0 1 1 0 0 +EDGE2 8095 6475 0.0692094 -0.014875 -3.16777 1 0 1 1 0 0 +EDGE2 8095 6476 0.029781 -1.06239 -1.57118 1 0 1 1 0 0 +EDGE2 8095 6496 0.0339615 -0.934108 -1.55125 1 0 1 1 0 0 +EDGE2 8096 6495 -1.01877 -0.054732 -1.58333 1 0 1 1 0 0 +EDGE2 8096 6515 -1.05748 0.0275947 -1.56511 1 0 1 1 0 0 +EDGE2 8096 8095 -0.999466 -0.0198058 1.57388 1 0 1 1 0 0 +EDGE2 8096 6475 -1.02429 -0.0271789 -1.59919 1 0 1 1 0 0 +EDGE2 8096 6497 1.02683 -0.0147644 0.0153359 1 0 1 1 0 0 +EDGE2 8096 6476 -0.0540297 0.0441826 -0.00917079 1 0 1 1 0 0 +EDGE2 8096 6496 -0.0136764 -0.00708775 -0.0157976 1 0 1 1 0 0 +EDGE2 8096 6477 1.0858 0.0123968 0.0244029 1 0 1 1 0 0 +EDGE2 8097 6478 1.02091 -0.0476449 -0.00354776 1 0 1 1 0 0 +EDGE2 8097 6497 0.0259142 -0.0078098 -0.0117569 1 0 1 1 0 0 +EDGE2 8097 6476 -0.986174 0.0168337 0.00644602 1 0 1 1 0 0 +EDGE2 8097 6496 -1.05107 0.0124524 -0.0364669 1 0 1 1 0 0 +EDGE2 8097 8096 -0.957329 0.03961 0.0430858 1 0 1 1 0 0 +EDGE2 8097 6498 0.96052 -0.0225963 0.0283229 1 0 1 1 0 0 +EDGE2 8097 6477 0.0214917 0.00423996 -0.0377745 1 0 1 1 0 0 +EDGE2 8098 6478 0.013803 0.0914108 0.00571943 1 0 1 1 0 0 +EDGE2 8098 6497 -0.982736 -0.0126659 -0.00892226 1 0 1 1 0 0 +EDGE2 8098 8097 -0.945676 -0.00848902 -0.0127945 1 0 1 1 0 0 +EDGE2 8098 6498 -0.000959173 -0.0132122 -0.0139805 1 0 1 1 0 0 +EDGE2 8098 6477 -1.00356 -0.00425884 -0.0083119 1 0 1 1 0 0 +EDGE2 8098 6479 1.04497 0.0429625 -0.00474654 1 0 1 1 0 0 +EDGE2 8098 6499 0.998057 -0.0200443 -0.0221056 1 0 1 1 0 0 +EDGE2 8099 6478 -1.00498 0.060776 0.0316745 1 0 1 1 0 0 +EDGE2 8099 6498 -1.04493 -0.0156664 -0.0205441 1 0 1 1 0 0 +EDGE2 8099 8098 -0.944824 0.00657183 0.0279232 1 0 1 1 0 0 +EDGE2 8099 6479 -0.0702061 -0.0226804 -0.0177904 1 0 1 1 0 0 +EDGE2 8099 6499 0.0538556 -0.0282186 0.0103287 1 0 1 1 0 0 +EDGE2 8099 6480 0.994929 -0.0171268 -0.00599374 1 0 1 1 0 0 +EDGE2 8099 6500 1.04393 0.00320715 -0.010422 1 0 1 1 0 0 +EDGE2 8100 8099 -1.09196 -0.0738427 -0.00937679 1 0 1 1 0 0 +EDGE2 8100 6479 -0.973623 0.0435793 0.0342653 1 0 1 1 0 0 +EDGE2 8100 6499 -0.966081 -0.0698058 -0.00730638 1 0 1 1 0 0 +EDGE2 8100 6480 -0.00182611 -0.0132322 -0.00207515 1 0 1 1 0 0 +EDGE2 8100 6501 -0.0461493 1.02031 1.57317 1 0 1 1 0 0 +EDGE2 8100 6481 0.00905571 1.04338 1.60092 1 0 1 1 0 0 +EDGE2 8100 6500 -0.0160817 0.0473525 0.0382401 1 0 1 1 0 0 +EDGE2 8101 6480 -0.959155 -0.0585568 1.57493 1 0 1 1 0 0 +EDGE2 8101 8100 -0.956328 -0.0207646 1.56584 1 0 1 1 0 0 +EDGE2 8101 6500 -0.904097 0.0158171 1.55571 1 0 1 1 0 0 +EDGE2 8102 8101 -1.01732 0.0761737 0.00745055 1 0 1 1 0 0 +EDGE2 8103 8102 -0.952502 -0.0335665 0.00189129 1 0 1 1 0 0 +EDGE2 8104 8103 -0.932411 0.020957 0.00960426 1 0 1 1 0 0 +EDGE2 8105 8104 -0.924794 0.00900871 0.0167936 1 0 1 1 0 0 +EDGE2 8106 8105 -1.03912 0.007076 1.53672 1 0 1 1 0 0 +EDGE2 8107 8106 -0.962625 -0.00474052 0.0390225 1 0 1 1 0 0 +EDGE2 8108 8107 -0.985243 0.0316242 0.00943491 1 0 1 1 0 0 +EDGE2 8109 8090 1.04635 -0.0288676 -3.13446 1 0 1 1 0 0 +EDGE2 8109 8108 -1.07019 0.0293508 -0.0352289 1 0 1 1 0 0 +EDGE2 8110 8091 -0.0161716 -0.989445 -1.58766 1 0 1 1 0 0 +EDGE2 8110 8089 0.938172 -0.00829109 -3.15281 1 0 1 1 0 0 +EDGE2 8110 8090 -0.0480605 -0.00642014 -3.17195 1 0 1 1 0 0 +EDGE2 8110 8109 -0.993536 -0.0660013 0.00710509 1 0 1 1 0 0 +EDGE2 8111 8090 -1.04391 -0.0139114 1.59546 1 0 1 1 0 0 +EDGE2 8111 8110 -0.994447 0.0245514 -1.59746 1 0 1 1 0 0 +EDGE2 8112 8111 -1.03728 -0.0536202 0.00835514 1 0 1 1 0 0 +EDGE2 8113 8112 -1.00062 -0.0337125 -0.00658713 1 0 1 1 0 0 +EDGE2 8114 8113 -1.03713 -0.0668955 0.0106971 1 0 1 1 0 0 +EDGE2 8115 8114 -0.976242 -0.000719311 -0.0295924 1 0 1 1 0 0 +EDGE2 8116 8115 -1.06745 0.0302561 -1.54866 1 0 1 1 0 0 +EDGE2 8117 8116 -0.976202 0.0489069 0.00389636 1 0 1 1 0 0 +EDGE2 8118 8117 -0.95497 0.0280072 -0.00757542 1 0 1 1 0 0 +EDGE2 8119 8118 -0.92217 0.0439207 0.00407504 1 0 1 1 0 0 +EDGE2 8120 8119 -1.00586 0.0106479 0.0186129 1 0 1 1 0 0 +EDGE2 8121 8120 -1.03064 0.0416652 -1.57632 1 0 1 1 0 0 +EDGE2 8122 8121 -0.949793 0.00520528 0.0178764 1 0 1 1 0 0 +EDGE2 8123 8122 -1.05254 0.0565705 0.0178215 1 0 1 1 0 0 +EDGE2 8124 8105 1.07916 -0.0567538 -3.11845 1 0 1 1 0 0 +EDGE2 8124 8123 -0.99692 -0.0780337 0.0178461 1 0 1 1 0 0 +EDGE2 8125 8106 -0.0328556 1.07789 1.58639 1 0 1 1 0 0 +EDGE2 8125 8104 0.98122 0.0551303 -3.12112 1 0 1 1 0 0 +EDGE2 8125 8105 0.0448176 -0.00603444 -3.11854 1 0 1 1 0 0 +EDGE2 8125 8124 -0.993726 -0.00387071 0.00914878 1 0 1 1 0 0 +EDGE2 8126 8125 -0.981007 0.0728928 1.53107 1 0 1 1 0 0 +EDGE2 8126 8105 -0.976699 -0.0290851 -1.57848 1 0 1 1 0 0 +EDGE2 8127 8126 -1.04782 -0.10655 -0.0234167 1 0 1 1 0 0 +EDGE2 8128 8127 -0.985555 -0.0390518 0.0347001 1 0 1 1 0 0 +EDGE2 8129 8128 -0.917198 0.0837955 -0.00588139 1 0 1 1 0 0 +EDGE2 8130 8129 -1.03359 -0.00121868 -0.025086 1 0 1 1 0 0 +EDGE2 8131 8130 -1.13547 0.0188982 -1.57545 1 0 1 1 0 0 +EDGE2 8132 8131 -0.974791 -0.0827604 0.0104538 1 0 1 1 0 0 +EDGE2 8133 8132 -1.01202 0.0504618 0.0220273 1 0 1 1 0 0 +EDGE2 8134 8133 -0.930137 -0.0493171 0.00269888 1 0 1 1 0 0 +EDGE2 8135 8134 -0.946139 0.0210039 0.0251588 1 0 1 1 0 0 +EDGE2 8136 8135 -1.06759 -0.0178278 -1.5855 1 0 1 1 0 0 +EDGE2 8137 8136 -0.91633 -0.0241854 -0.00445839 1 0 1 1 0 0 +EDGE2 8138 8137 -1.04677 0.099559 -0.0261489 1 0 1 1 0 0 +EDGE2 8139 6480 0.898761 -0.0569289 -3.12719 1 0 1 1 0 0 +EDGE2 8139 8100 0.946994 -0.0144938 -3.10916 1 0 1 1 0 0 +EDGE2 8139 6500 1.07422 0.0192704 -3.11915 1 0 1 1 0 0 +EDGE2 8139 8138 -0.948373 0.106793 -0.00149887 1 0 1 1 0 0 +EDGE2 8140 8099 0.893271 -0.0204752 -3.12564 1 0 1 1 0 0 +EDGE2 8140 6479 0.867434 0.000192523 -3.11545 1 0 1 1 0 0 +EDGE2 8140 6499 1.06885 0.0227769 -3.17563 1 0 1 1 0 0 +EDGE2 8140 6480 -0.0522499 -0.0490698 -3.15384 1 0 1 1 0 0 +EDGE2 8140 6501 0.0893842 -1.02341 -1.53448 1 0 1 1 0 0 +EDGE2 8140 8100 0.0676207 -0.0261804 -3.16768 1 0 1 1 0 0 +EDGE2 8140 6481 -0.0811966 -1.08253 -1.56599 1 0 1 1 0 0 +EDGE2 8140 6500 -0.0658318 0.0995818 -3.15795 1 0 1 1 0 0 +EDGE2 8140 8101 -0.0614076 0.974777 1.55296 1 0 1 1 0 0 +EDGE2 8140 8139 -1.02507 0.0217727 0.0209331 1 0 1 1 0 0 +EDGE2 8141 8140 -0.93875 -0.00336131 -1.60334 1 0 1 1 0 0 +EDGE2 8141 6480 -1.01535 0.0464137 1.51922 1 0 1 1 0 0 +EDGE2 8141 8100 -1.02856 0.0294476 1.56068 1 0 1 1 0 0 +EDGE2 8141 6500 -1.06245 0.0397827 1.60952 1 0 1 1 0 0 +EDGE2 8141 8101 -0.0967581 -0.0422234 -0.026959 1 0 1 1 0 0 +EDGE2 8141 8102 1.00177 0.0556395 -0.00257502 1 0 1 1 0 0 +EDGE2 8142 8101 -1.06585 0.01974 0.000837421 1 0 1 1 0 0 +EDGE2 8142 8102 -0.0142644 -0.0934255 -0.0202787 1 0 1 1 0 0 +EDGE2 8142 8103 0.881173 -0.084096 0.0145826 1 0 1 1 0 0 +EDGE2 8142 8141 -1.05091 -0.00260111 -0.00118016 1 0 1 1 0 0 +EDGE2 8143 8102 -1.05318 -0.0131391 -0.0275491 1 0 1 1 0 0 +EDGE2 8143 8104 0.930386 -0.0225633 0.0013759 1 0 1 1 0 0 +EDGE2 8143 8103 -0.0384176 -0.0225458 -0.0155997 1 0 1 1 0 0 +EDGE2 8143 8142 -0.930714 -0.0163036 0.0087774 1 0 1 1 0 0 +EDGE2 8144 8104 0.0162584 0.0218776 0.0190924 1 0 1 1 0 0 +EDGE2 8144 8103 -1.07203 0.0893949 -0.0148336 1 0 1 1 0 0 +EDGE2 8144 8143 -1.04105 0.0257597 -0.00564387 1 0 1 1 0 0 +EDGE2 8144 8125 1.01353 0.0573326 -3.16208 1 0 1 1 0 0 +EDGE2 8144 8105 0.931267 -0.0559487 0.00464423 1 0 1 1 0 0 +EDGE2 8145 8106 -0.0687376 -0.982553 -1.56013 1 0 1 1 0 0 +EDGE2 8145 8104 -1.04616 -0.0663987 0.00978423 1 0 1 1 0 0 +EDGE2 8145 8144 -0.923513 0.0785093 -0.00944223 1 0 1 1 0 0 +EDGE2 8145 8125 0.0234898 0.0540078 -3.13805 1 0 1 1 0 0 +EDGE2 8145 8105 -0.102873 0.027446 0.00410015 1 0 1 1 0 0 +EDGE2 8145 8124 1.09633 -0.0366262 -3.12231 1 0 1 1 0 0 +EDGE2 8145 8126 -0.0385745 1.07844 1.57394 1 0 1 1 0 0 +EDGE2 8146 8125 -1.08835 -0.0397355 1.57331 1 0 1 1 0 0 +EDGE2 8146 8105 -0.983843 -0.0674818 -1.57825 1 0 1 1 0 0 +EDGE2 8146 8145 -1.01986 0.0196387 -1.57405 1 0 1 1 0 0 +EDGE2 8146 8126 0.0207367 0.145727 0.0498861 1 0 1 1 0 0 +EDGE2 8146 8127 0.966689 0.0240248 0.0175783 1 0 1 1 0 0 +EDGE2 8147 8146 -0.989664 0.0633169 -0.0225038 1 0 1 1 0 0 +EDGE2 8147 8126 -1.10432 0.0411719 -0.0518447 1 0 1 1 0 0 +EDGE2 8147 8127 0.0604893 -0.0804468 0.0110817 1 0 1 1 0 0 +EDGE2 8147 8128 1.0673 -0.00866952 0.0123558 1 0 1 1 0 0 +EDGE2 8148 8127 -1.04271 0.00317125 -0.00428507 1 0 1 1 0 0 +EDGE2 8148 8147 -1.04395 -0.0586819 -0.0142783 1 0 1 1 0 0 +EDGE2 8148 8128 -0.044296 -0.0186748 0.0295805 1 0 1 1 0 0 +EDGE2 8148 8129 0.931768 0.0052787 -0.0216193 1 0 1 1 0 0 +EDGE2 8149 8128 -0.964977 -0.009324 -0.0165202 1 0 1 1 0 0 +EDGE2 8149 8148 -1.03493 -0.00429212 0.000159084 1 0 1 1 0 0 +EDGE2 8149 8129 -0.0092268 -0.0142317 -0.0322599 1 0 1 1 0 0 +EDGE2 8149 8130 1.03349 -0.0544193 0.0284263 1 0 1 1 0 0 +EDGE2 8150 8129 -0.997938 -0.0461944 -0.0218545 1 0 1 1 0 0 +EDGE2 8150 8149 -0.961677 0.120499 0.01532 1 0 1 1 0 0 +EDGE2 8150 8130 -0.0391744 -0.00873818 -0.0170256 1 0 1 1 0 0 +EDGE2 8150 8131 0.0564319 1.0434 1.5879 1 0 1 1 0 0 +EDGE2 8151 8130 -0.962633 -0.0124438 -1.54804 1 0 1 1 0 0 +EDGE2 8151 8132 1.02091 -0.000971477 -0.00569662 1 0 1 1 0 0 +EDGE2 8151 8131 -0.0145176 0.0306823 -0.00310783 1 0 1 1 0 0 +EDGE2 8151 8150 -0.98258 -0.0167242 -1.55339 1 0 1 1 0 0 +EDGE2 8152 8132 0.0166556 -0.00244307 0.0277851 1 0 1 1 0 0 +EDGE2 8152 8133 0.972866 0.0363667 -0.0245982 1 0 1 1 0 0 +EDGE2 8152 8131 -0.976577 0.0569464 -0.00132342 1 0 1 1 0 0 +EDGE2 8152 8151 -0.939221 0.0473392 0.0258533 1 0 1 1 0 0 +EDGE2 8153 8132 -0.971419 0.0787149 0.00795307 1 0 1 1 0 0 +EDGE2 8153 8133 -0.0457546 0.0932704 0.0153134 1 0 1 1 0 0 +EDGE2 8153 8134 0.941149 0.0664412 0.000697386 1 0 1 1 0 0 +EDGE2 8153 8152 -1.06248 0.0370387 -0.000301305 1 0 1 1 0 0 +EDGE2 8154 8135 1.0592 0.0305116 -0.0186035 1 0 1 1 0 0 +EDGE2 8154 8133 -0.985147 0.118133 0.00820776 1 0 1 1 0 0 +EDGE2 8154 8134 -0.0138055 -0.0437329 -0.0220719 1 0 1 1 0 0 +EDGE2 8154 8153 -1.07538 0.0163546 -0.0317413 1 0 1 1 0 0 +EDGE2 8155 8136 0.0500754 1.00809 1.57001 1 0 1 1 0 0 +EDGE2 8155 8135 -0.0171441 -0.0412996 -0.0275929 1 0 1 1 0 0 +EDGE2 8155 8134 -1.0327 -0.0768589 -0.00618428 1 0 1 1 0 0 +EDGE2 8155 8154 -0.94575 -0.051487 -0.0315962 1 0 1 1 0 0 +EDGE2 8156 8137 0.982314 -0.00332207 0.00941676 1 0 1 1 0 0 +EDGE2 8156 8136 -0.0334632 0.0415245 -0.045785 1 0 1 1 0 0 +EDGE2 8156 8135 -1.08966 -0.0504118 -1.55818 1 0 1 1 0 0 +EDGE2 8156 8155 -1.04504 -0.0695828 -1.56768 1 0 1 1 0 0 +EDGE2 8157 8156 -0.971471 -0.0183337 0.0381383 1 0 1 1 0 0 +EDGE2 8157 8138 1.02483 0.0517737 -0.0251627 1 0 1 1 0 0 +EDGE2 8157 8137 -0.0208211 0.0623229 -0.0061386 1 0 1 1 0 0 +EDGE2 8157 8136 -1.00587 -0.128048 0.00631896 1 0 1 1 0 0 +EDGE2 8158 8157 -1.02213 0.00713918 0.0243024 1 0 1 1 0 0 +EDGE2 8158 8139 0.998314 -0.0137917 -0.0198931 1 0 1 1 0 0 +EDGE2 8158 8138 -0.0614901 -0.0530055 0.0124728 1 0 1 1 0 0 +EDGE2 8158 8137 -0.994385 -0.0311521 -0.0165986 1 0 1 1 0 0 +EDGE2 8159 8140 1.07128 -0.00790778 -0.0126659 1 0 1 1 0 0 +EDGE2 8159 6480 0.945293 0.0402722 -3.14614 1 0 1 1 0 0 +EDGE2 8159 8100 0.952349 0.0672806 -3.15273 1 0 1 1 0 0 +EDGE2 8159 6500 0.954693 0.0227943 -3.174 1 0 1 1 0 0 +EDGE2 8159 8139 -0.0410316 0.0443398 0.0231096 1 0 1 1 0 0 +EDGE2 8159 8158 -0.955965 -0.0434937 -0.0168629 1 0 1 1 0 0 +EDGE2 8159 8138 -1.02096 0.0061399 0.0175903 1 0 1 1 0 0 +EDGE2 8160 8140 0.0172483 -0.0250913 0.00745331 1 0 1 1 0 0 +EDGE2 8160 8099 0.903812 0.00730801 -3.14899 1 0 1 1 0 0 +EDGE2 8160 6479 1.06327 0.023152 -3.16176 1 0 1 1 0 0 +EDGE2 8160 6499 1.08623 0.012799 -3.14859 1 0 1 1 0 0 +EDGE2 8160 6480 0.0409959 -0.00748827 -3.09138 1 0 1 1 0 0 +EDGE2 8160 6501 0.0929508 -1.04492 -1.56048 1 0 1 1 0 0 +EDGE2 8160 8100 0.0563429 -0.128495 -3.14616 1 0 1 1 0 0 +EDGE2 8160 6481 -0.00716869 -1.06314 -1.6 1 0 1 1 0 0 +EDGE2 8160 6500 0.03639 0.00801948 -3.18248 1 0 1 1 0 0 +EDGE2 8160 8101 0.000175511 0.987164 1.56864 1 0 1 1 0 0 +EDGE2 8160 8141 0.0320273 1.05115 1.54949 1 0 1 1 0 0 +EDGE2 8160 8139 -1.14749 -0.0538691 -0.00305404 1 0 1 1 0 0 +EDGE2 8160 8159 -1.00447 -0.00786019 -0.0421331 1 0 1 1 0 0 +EDGE2 8161 8140 -0.99633 0.0224406 -1.58945 1 0 1 1 0 0 +EDGE2 8161 6480 -1.01476 -0.0554997 1.56589 1 0 1 1 0 0 +EDGE2 8161 8100 -1.02874 -0.0310268 1.59837 1 0 1 1 0 0 +EDGE2 8161 6500 -0.99663 0.0431115 1.51549 1 0 1 1 0 0 +EDGE2 8161 8101 -0.00110301 -0.00136871 0.00410231 1 0 1 1 0 0 +EDGE2 8161 8102 1.12129 -0.000957858 -0.0143177 1 0 1 1 0 0 +EDGE2 8161 8141 0.0305888 0.0278646 -0.0111587 1 0 1 1 0 0 +EDGE2 8161 8160 -0.92948 0.0236227 -1.60137 1 0 1 1 0 0 +EDGE2 8161 8142 1.05397 0.0315802 -0.0097087 1 0 1 1 0 0 +EDGE2 8162 8101 -0.959313 0.0128852 -0.0101279 1 0 1 1 0 0 +EDGE2 8162 8102 -0.0438099 -0.0797059 -0.00671798 1 0 1 1 0 0 +EDGE2 8162 8103 0.968238 0.0785871 0.00358281 1 0 1 1 0 0 +EDGE2 8162 8141 -0.993441 -0.0199718 0.00269534 1 0 1 1 0 0 +EDGE2 8162 8143 1.03515 0.0105822 -0.00197469 1 0 1 1 0 0 +EDGE2 8162 8142 0.0159348 -0.118239 0.0348652 1 0 1 1 0 0 +EDGE2 8162 8161 -0.992832 -0.0946818 0.0232969 1 0 1 1 0 0 +EDGE2 8163 8102 -0.954807 -0.0674779 -0.0135143 1 0 1 1 0 0 +EDGE2 8163 8104 1.04579 -0.0564789 0.036585 1 0 1 1 0 0 +EDGE2 8163 8103 0.0917867 -0.024465 -0.0427845 1 0 1 1 0 0 +EDGE2 8163 8162 -1.02617 0.00909507 -0.0029466 1 0 1 1 0 0 +EDGE2 8163 8144 1.06585 0.0327478 -0.00431686 1 0 1 1 0 0 +EDGE2 8163 8143 0.0140399 -0.00690036 0.00579839 1 0 1 1 0 0 +EDGE2 8163 8142 -0.970547 0.0112979 -0.0080944 1 0 1 1 0 0 +EDGE2 8164 8104 0.0735013 -0.0515392 0.0249155 1 0 1 1 0 0 +EDGE2 8164 8103 -1.02688 -0.0252804 -0.00191222 1 0 1 1 0 0 +EDGE2 8164 8144 -0.039466 -0.0209457 0.00949676 1 0 1 1 0 0 +EDGE2 8164 8143 -1.06142 0.0106064 0.0105386 1 0 1 1 0 0 +EDGE2 8164 8163 -1.07326 -0.0409643 -0.00250136 1 0 1 1 0 0 +EDGE2 8164 8125 0.991741 0.0808995 -3.15671 1 0 1 1 0 0 +EDGE2 8164 8105 1.0159 0.021723 -0.00953953 1 0 1 1 0 0 +EDGE2 8164 8145 1.0065 0.0245629 -0.0230529 1 0 1 1 0 0 +EDGE2 8165 8106 -0.0151742 -1.15777 -1.5547 1 0 1 1 0 0 +EDGE2 8165 8104 -0.965746 -0.0349165 -0.00372279 1 0 1 1 0 0 +EDGE2 8165 8144 -0.967543 0.0366966 0.00628277 1 0 1 1 0 0 +EDGE2 8165 8164 -0.975383 0.0724187 -0.0154916 1 0 1 1 0 0 +EDGE2 8165 8125 -0.0248457 0.0451462 -3.14004 1 0 1 1 0 0 +EDGE2 8165 8105 0.0284034 -0.0103725 -0.0169249 1 0 1 1 0 0 +EDGE2 8165 8124 0.997785 -0.0459234 -3.16925 1 0 1 1 0 0 +EDGE2 8165 8146 -0.0133041 0.886126 1.5794 1 0 1 1 0 0 +EDGE2 8165 8145 0.0212827 0.0527769 -0.00249058 1 0 1 1 0 0 +EDGE2 8165 8126 0.0359865 0.986921 1.57011 1 0 1 1 0 0 +EDGE2 8166 8125 -0.932181 -0.0250357 1.57089 1 0 1 1 0 0 +EDGE2 8166 8105 -1.00189 0.110882 -1.55575 1 0 1 1 0 0 +EDGE2 8166 8146 -0.0371744 0.0320802 0.0111861 1 0 1 1 0 0 +EDGE2 8166 8165 -0.962937 -0.0256373 -1.55514 1 0 1 1 0 0 +EDGE2 8166 8145 -1.11401 -0.0527284 -1.58585 1 0 1 1 0 0 +EDGE2 8166 8126 -0.0228182 -0.0500582 0.0251909 1 0 1 1 0 0 +EDGE2 8166 8127 1.00958 0.0319803 0.0057443 1 0 1 1 0 0 +EDGE2 8166 8147 1.00258 -0.0569155 0.0170024 1 0 1 1 0 0 +EDGE2 8167 8146 -0.995678 0.0532253 -0.00283514 1 0 1 1 0 0 +EDGE2 8167 8126 -1.0179 0.0403306 -0.00674472 1 0 1 1 0 0 +EDGE2 8167 8127 -0.0236357 0.015057 -0.01254 1 0 1 1 0 0 +EDGE2 8167 8166 -0.999953 0.017554 -0.00569014 1 0 1 1 0 0 +EDGE2 8167 8147 0.0133304 -0.0439686 -0.0102085 1 0 1 1 0 0 +EDGE2 8167 8128 0.916447 0.0479969 -0.0118815 1 0 1 1 0 0 +EDGE2 8167 8148 1.01117 -0.0055456 -0.0119594 1 0 1 1 0 0 +EDGE2 8168 8167 -1.04491 0.0275459 0.0367378 1 0 1 1 0 0 +EDGE2 8168 8127 -1.08899 -0.00300245 -0.019172 1 0 1 1 0 0 +EDGE2 8168 8147 -1.01305 0.00200891 -0.00750549 1 0 1 1 0 0 +EDGE2 8168 8128 0.00147682 0.0488145 0.012357 1 0 1 1 0 0 +EDGE2 8168 8148 -0.00453176 -0.0622796 0.0106215 1 0 1 1 0 0 +EDGE2 8168 8129 1.07848 0.0223801 0.0226699 1 0 1 1 0 0 +EDGE2 8168 8149 1.02894 -0.00678431 0.00645541 1 0 1 1 0 0 +EDGE2 8169 8168 -1.04825 -0.104034 -0.0122713 1 0 1 1 0 0 +EDGE2 8169 8128 -0.968503 -0.0292738 0.00663707 1 0 1 1 0 0 +EDGE2 8169 8148 -1.01165 0.0638643 -0.0122698 1 0 1 1 0 0 +EDGE2 8169 8129 0.121646 -0.0219265 -0.0297143 1 0 1 1 0 0 +EDGE2 8169 8149 0.00310871 0.0112719 -0.0116149 1 0 1 1 0 0 +EDGE2 8169 8130 0.986939 0.0460639 0.00665224 1 0 1 1 0 0 +EDGE2 8169 8150 0.91904 0.00777243 -0.0457178 1 0 1 1 0 0 +EDGE2 8170 8169 -1.039 -0.0416094 0.014382 1 0 1 1 0 0 +EDGE2 8170 8129 -0.995587 -0.0327285 -0.00739347 1 0 1 1 0 0 +EDGE2 8170 8149 -1.04257 -0.0855877 0.00558804 1 0 1 1 0 0 +EDGE2 8170 8130 -0.017479 0.048948 -0.00667299 1 0 1 1 0 0 +EDGE2 8170 8131 -0.142835 0.963871 1.55817 1 0 1 1 0 0 +EDGE2 8170 8151 -0.0126711 1.02794 1.57315 1 0 1 1 0 0 +EDGE2 8170 8150 0.0222419 -0.010164 0.00564633 1 0 1 1 0 0 +EDGE2 8171 8170 -0.967057 -0.0060429 1.57471 1 0 1 1 0 0 +EDGE2 8171 8130 -0.973404 -0.0328628 1.58226 1 0 1 1 0 0 +EDGE2 8171 8150 -0.937814 -0.0435285 1.54593 1 0 1 1 0 0 +EDGE2 8172 8171 -1.07155 -0.0784285 -0.00355796 1 0 1 1 0 0 +EDGE2 8173 8172 -0.975258 0.0133001 -0.0054551 1 0 1 1 0 0 +EDGE2 8174 8173 -0.998083 -0.0914053 -0.0283175 1 0 1 1 0 0 +EDGE2 8175 8174 -1.02804 -0.000149194 0.00858491 1 0 1 1 0 0 +EDGE2 8176 8175 -1.0143 -0.00114075 -1.56939 1 0 1 1 0 0 +EDGE2 8177 8176 -1.018 -0.00438593 -0.0158885 1 0 1 1 0 0 +EDGE2 8178 8177 -0.976568 0.000620969 0.0365558 1 0 1 1 0 0 +EDGE2 8179 8178 -1.04231 -0.0737934 -0.00814144 1 0 1 1 0 0 +EDGE2 8180 8179 -0.926113 0.0204665 0.0173872 1 0 1 1 0 0 +EDGE2 8181 8180 -0.936356 -0.0504502 1.60754 1 0 1 1 0 0 +EDGE2 8182 8181 -0.974147 0.0993544 0.0287152 1 0 1 1 0 0 +EDGE2 8183 8182 -0.963454 0.0584695 0.0177305 1 0 1 1 0 0 +EDGE2 8184 8183 -1.02578 0.0390635 0.00484441 1 0 1 1 0 0 +EDGE2 8185 8184 -1.00562 -0.0642128 -0.00225577 1 0 1 1 0 0 +EDGE2 8186 8185 -0.948321 0.0606064 -1.54331 1 0 1 1 0 0 +EDGE2 8187 8186 -0.902927 0.0745008 0.0283697 1 0 1 1 0 0 +EDGE2 8188 8187 -0.987162 0.0586616 0.00529636 1 0 1 1 0 0 +EDGE2 8189 8188 -0.985625 0.0125582 -0.00731126 1 0 1 1 0 0 +EDGE2 8190 8189 -0.962027 -0.00531442 -0.0511458 1 0 1 1 0 0 +EDGE2 8191 8190 -1.05116 -0.0377214 1.58473 1 0 1 1 0 0 +EDGE2 8192 8191 -0.939747 0.0830677 -0.00337321 1 0 1 1 0 0 +EDGE2 8193 8192 -1.00207 0.104111 0.00955612 1 0 1 1 0 0 +EDGE2 8194 8193 -0.92963 0.0321474 0.0053904 1 0 1 1 0 0 +EDGE2 8195 8194 -0.965737 0.061761 -0.0074091 1 0 1 1 0 0 +EDGE2 8196 8195 -0.994102 -0.0400327 -1.56756 1 0 1 1 0 0 +EDGE2 8197 8196 -1.04449 0.0187093 -0.0436798 1 0 1 1 0 0 +EDGE2 8198 8197 -0.996765 0.0510769 -0.0424784 1 0 1 1 0 0 +EDGE2 8199 8198 -1.0197 0.0228548 -0.021468 1 0 1 1 0 0 +EDGE2 8200 8199 -0.997507 0.0409383 -0.000598777 1 0 1 1 0 0 +EDGE2 8201 8200 -0.98848 -0.0615709 1.57089 1 0 1 1 0 0 +EDGE2 8202 8201 -0.91789 0.0538998 0.0263259 1 0 1 1 0 0 +EDGE2 8203 8202 -0.932141 0.0131801 -0.00678882 1 0 1 1 0 0 +EDGE2 8204 8203 -1.07757 0.00212096 0.0187143 1 0 1 1 0 0 +EDGE2 8205 8204 -1.01779 0.0917069 -0.00317718 1 0 1 1 0 0 +EDGE2 8206 8205 -0.957862 -0.0215063 -1.53985 1 0 1 1 0 0 +EDGE2 8207 8206 -1.04492 -0.0163928 -0.0125744 1 0 1 1 0 0 +EDGE2 8208 8207 -0.990464 -0.0112262 0.00263463 1 0 1 1 0 0 +EDGE2 8209 8208 -1.00078 0.0061434 0.0335579 1 0 1 1 0 0 +EDGE2 8210 8209 -0.995308 -0.0465638 -0.0126613 1 0 1 1 0 0 +EDGE2 8211 8210 -1.00081 -0.0394677 -1.5742 1 0 1 1 0 0 +EDGE2 8212 8211 -0.857882 -0.0413359 0.0151093 1 0 1 1 0 0 +EDGE2 8213 8212 -1.03015 0.0789654 0.0145017 1 0 1 1 0 0 +EDGE2 8214 8213 -1.00391 -0.0219983 0.00877725 1 0 1 1 0 0 +EDGE2 8215 8214 -1.01195 -0.055003 0.0113583 1 0 1 1 0 0 +EDGE2 8216 8215 -1.02249 0.0278952 -1.58059 1 0 1 1 0 0 +EDGE2 8217 8216 -0.998607 0.0267395 0.00375382 1 0 1 1 0 0 +EDGE2 8218 8217 -0.957869 0.0458553 0.0369184 1 0 1 1 0 0 +EDGE2 8219 8200 0.973876 0.0353012 -3.1337 1 0 1 1 0 0 +EDGE2 8219 8218 -0.951276 0.0363548 -0.0222328 1 0 1 1 0 0 +EDGE2 8220 8199 0.900426 -0.057171 -3.1469 1 0 1 1 0 0 +EDGE2 8220 8200 -0.0927208 0.0470347 -3.12632 1 0 1 1 0 0 +EDGE2 8220 8219 -1.03972 -0.0677521 -0.0532332 1 0 1 1 0 0 +EDGE2 8220 8201 0.0112237 1.02619 1.55485 1 0 1 1 0 0 +EDGE2 8221 8220 -0.98391 0.0630646 -1.56024 1 0 1 1 0 0 +EDGE2 8221 8200 -1.02188 -0.0232491 1.56471 1 0 1 1 0 0 +EDGE2 8221 8201 -0.0410917 -0.00518852 -0.00138268 1 0 1 1 0 0 +EDGE2 8221 8202 0.95881 -0.0583152 0.000919188 1 0 1 1 0 0 +EDGE2 8222 8201 -0.941925 0.00595798 -0.0120358 1 0 1 1 0 0 +EDGE2 8222 8221 -1.05607 0.0628922 0.0514248 1 0 1 1 0 0 +EDGE2 8222 8202 -0.00410431 -0.0178341 -0.02206 1 0 1 1 0 0 +EDGE2 8222 8203 0.934878 0.0638829 0.000363317 1 0 1 1 0 0 +EDGE2 8223 8202 -0.981752 0.00896076 -0.0253724 1 0 1 1 0 0 +EDGE2 8223 8222 -0.996035 0.02341 0.0077448 1 0 1 1 0 0 +EDGE2 8223 8203 -0.0833425 -0.0102974 -0.0046327 1 0 1 1 0 0 +EDGE2 8223 8204 1.02089 -0.0595527 0.0409907 1 0 1 1 0 0 +EDGE2 8224 8203 -1.09142 0.0126512 -0.00260876 1 0 1 1 0 0 +EDGE2 8224 8223 -1.02245 0.0360653 0.0136883 1 0 1 1 0 0 +EDGE2 8224 8204 -0.0307536 -0.0742528 -0.00743537 1 0 1 1 0 0 +EDGE2 8224 8205 1.06416 -0.0754742 -0.0049188 1 0 1 1 0 0 +EDGE2 8225 8224 -0.984813 0.057547 0.0052052 1 0 1 1 0 0 +EDGE2 8225 8204 -0.997749 0.0296311 0.00723238 1 0 1 1 0 0 +EDGE2 8225 8205 -0.0600381 -0.0267832 -0.00418346 1 0 1 1 0 0 +EDGE2 8225 8206 -0.00319798 0.977643 1.54897 1 0 1 1 0 0 +EDGE2 8226 8205 -1.1138 -0.0401427 -1.56396 1 0 1 1 0 0 +EDGE2 8226 8225 -0.982968 -0.0511002 -1.56424 1 0 1 1 0 0 +EDGE2 8226 8206 -0.0606519 -0.145029 -0.00802572 1 0 1 1 0 0 +EDGE2 8226 8207 0.933192 0.0124403 -0.0163438 1 0 1 1 0 0 +EDGE2 8227 8208 1.01463 -0.0664765 -0.0255294 1 0 1 1 0 0 +EDGE2 8227 8206 -1.00882 0.0277998 0.00899284 1 0 1 1 0 0 +EDGE2 8227 8226 -0.967217 -0.00808462 0.005978 1 0 1 1 0 0 +EDGE2 8227 8207 0.0601185 0.0934682 -0.0164005 1 0 1 1 0 0 +EDGE2 8228 8208 0.0787904 0.109736 0.00261293 1 0 1 1 0 0 +EDGE2 8228 8227 -0.975264 0.0054379 0.011034 1 0 1 1 0 0 +EDGE2 8228 8207 -0.865244 0.0538293 -0.0171382 1 0 1 1 0 0 +EDGE2 8228 8209 1.02331 0.00710876 0.0252061 1 0 1 1 0 0 +EDGE2 8229 8208 -0.996729 -0.0218075 -0.0219597 1 0 1 1 0 0 +EDGE2 8229 8228 -0.989628 0.0968652 -0.0266787 1 0 1 1 0 0 +EDGE2 8229 8209 -0.0298074 0.0605314 -0.0135421 1 0 1 1 0 0 +EDGE2 8229 8210 0.98458 -0.0596318 0.0147458 1 0 1 1 0 0 +EDGE2 8230 8209 -0.969695 0.0515749 0.0251675 1 0 1 1 0 0 +EDGE2 8230 8229 -1.06162 -0.00296372 -0.0218429 1 0 1 1 0 0 +EDGE2 8230 8211 -0.0299998 1.06327 1.56344 1 0 1 1 0 0 +EDGE2 8230 8210 0.0471677 -0.00535558 0.0237298 1 0 1 1 0 0 +EDGE2 8231 8211 0.0413223 0.0256558 0.0342799 1 0 1 1 0 0 +EDGE2 8231 8212 0.936773 -0.0306047 0.0201714 1 0 1 1 0 0 +EDGE2 8231 8210 -0.934913 -0.0117046 -1.55256 1 0 1 1 0 0 +EDGE2 8231 8230 -0.987923 0.0397304 -1.5747 1 0 1 1 0 0 +EDGE2 8232 8213 0.959174 0.0316397 -0.0385795 1 0 1 1 0 0 +EDGE2 8232 8211 -1.004 -0.0236485 0.0106632 1 0 1 1 0 0 +EDGE2 8232 8212 -0.0436342 -0.0375041 0.0115262 1 0 1 1 0 0 +EDGE2 8232 8231 -1.07883 0.0803251 -0.0262362 1 0 1 1 0 0 +EDGE2 8233 8214 0.947696 0.0239017 0.0162995 1 0 1 1 0 0 +EDGE2 8233 8213 0.0133726 0.0713189 -0.0318106 1 0 1 1 0 0 +EDGE2 8233 8212 -1.00107 -0.00379622 0.022695 1 0 1 1 0 0 +EDGE2 8233 8232 -0.948626 0.0146772 -0.0192269 1 0 1 1 0 0 +EDGE2 8234 8233 -0.919143 -0.0594702 0.00276401 1 0 1 1 0 0 +EDGE2 8234 8215 0.974512 0.0216003 -0.0259005 1 0 1 1 0 0 +EDGE2 8234 8214 0.0391165 0.0125846 -0.0193438 1 0 1 1 0 0 +EDGE2 8234 8213 -1.02292 -0.0263931 0.0163368 1 0 1 1 0 0 +EDGE2 8235 8216 -0.0429198 0.899594 1.55108 1 0 1 1 0 0 +EDGE2 8235 8215 0.017591 -0.0498934 0.00541529 1 0 1 1 0 0 +EDGE2 8235 8214 -0.952146 -0.0398544 0.0123152 1 0 1 1 0 0 +EDGE2 8235 8234 -0.917277 -0.0305086 0.0274208 1 0 1 1 0 0 +EDGE2 8236 8217 1.05692 -0.00446657 -0.00280084 1 0 1 1 0 0 +EDGE2 8236 8235 -1.0665 0.0172845 -1.51772 1 0 1 1 0 0 +EDGE2 8236 8216 0.012132 -0.0306854 0.00400759 1 0 1 1 0 0 +EDGE2 8236 8215 -0.960787 0.0157796 -1.55814 1 0 1 1 0 0 +EDGE2 8237 8218 0.980985 0.00534973 0.0255665 1 0 1 1 0 0 +EDGE2 8237 8217 -0.0611302 0.0327557 0.00557685 1 0 1 1 0 0 +EDGE2 8237 8236 -0.941904 -0.0871445 -0.0130777 1 0 1 1 0 0 +EDGE2 8237 8216 -0.995911 -0.0480912 0.00694205 1 0 1 1 0 0 +EDGE2 8238 8219 1.02352 -0.0133535 -0.00880879 1 0 1 1 0 0 +EDGE2 8238 8218 -0.0777623 0.0467875 0.0168031 1 0 1 1 0 0 +EDGE2 8238 8237 -1.01614 -0.0111624 -0.0474344 1 0 1 1 0 0 +EDGE2 8238 8217 -1.06509 0.0154833 -0.0438469 1 0 1 1 0 0 +EDGE2 8239 8220 1.01675 0.0124853 0.0194143 1 0 1 1 0 0 +EDGE2 8239 8200 0.992222 -0.0396589 -3.12606 1 0 1 1 0 0 +EDGE2 8239 8219 -0.0521372 0.0120699 -0.00314637 1 0 1 1 0 0 +EDGE2 8239 8218 -1.04821 -0.0399922 0.0177569 1 0 1 1 0 0 +EDGE2 8239 8238 -0.966805 0.0176086 -0.00166883 1 0 1 1 0 0 +EDGE2 8240 8199 1.04762 0.0446834 -3.17671 1 0 1 1 0 0 +EDGE2 8240 8220 0.00806645 -0.00980906 0.0220627 1 0 1 1 0 0 +EDGE2 8240 8200 0.0631744 -0.0151343 -3.16743 1 0 1 1 0 0 +EDGE2 8240 8239 -1.0485 -0.00191219 0.00436395 1 0 1 1 0 0 +EDGE2 8240 8219 -0.991266 -0.0769866 -0.00400622 1 0 1 1 0 0 +EDGE2 8240 8201 -0.0741952 1.07132 1.50734 1 0 1 1 0 0 +EDGE2 8240 8221 0.0156034 0.95158 1.58812 1 0 1 1 0 0 +EDGE2 8241 8220 -1.10354 -0.060127 -1.57664 1 0 1 1 0 0 +EDGE2 8241 8240 -1.03765 -0.0557537 -1.54686 1 0 1 1 0 0 +EDGE2 8241 8200 -0.985052 -0.0837294 1.55398 1 0 1 1 0 0 +EDGE2 8241 8201 0.0636216 -0.112447 -0.0230334 1 0 1 1 0 0 +EDGE2 8241 8221 -0.0427196 -0.0339851 0.0251208 1 0 1 1 0 0 +EDGE2 8241 8202 0.995644 0.0557472 -0.00526897 1 0 1 1 0 0 +EDGE2 8241 8222 1.02368 -0.0252593 -0.00403338 1 0 1 1 0 0 +EDGE2 8242 8201 -0.959662 -0.0405926 0.00416258 1 0 1 1 0 0 +EDGE2 8242 8221 -1.00342 0.0322407 0.02012 1 0 1 1 0 0 +EDGE2 8242 8241 -1.01605 -0.0752761 0.0345807 1 0 1 1 0 0 +EDGE2 8242 8202 0.00586799 -0.0806815 -0.0031694 1 0 1 1 0 0 +EDGE2 8242 8222 -0.0125575 0.0387267 -0.00234544 1 0 1 1 0 0 +EDGE2 8242 8203 0.976618 -0.0995313 -0.0255743 1 0 1 1 0 0 +EDGE2 8242 8223 1.0786 -0.0249911 -0.0203636 1 0 1 1 0 0 +EDGE2 8243 8242 -1.11882 -0.00561753 0.0126483 1 0 1 1 0 0 +EDGE2 8243 8202 -1.11618 -0.0316885 0.00952078 1 0 1 1 0 0 +EDGE2 8243 8222 -0.978275 0.0487618 -0.0205399 1 0 1 1 0 0 +EDGE2 8243 8203 -0.0140963 -0.0693724 -0.0173464 1 0 1 1 0 0 +EDGE2 8243 8223 0.078233 -0.0039025 -0.0364708 1 0 1 1 0 0 +EDGE2 8243 8224 1.03379 -0.0472122 0.0209807 1 0 1 1 0 0 +EDGE2 8243 8204 1.14769 -0.0144695 0.0195623 1 0 1 1 0 0 +EDGE2 8244 8203 -1.01934 0.0383502 0.0162059 1 0 1 1 0 0 +EDGE2 8244 8243 -0.988468 -0.0159494 0.022705 1 0 1 1 0 0 +EDGE2 8244 8223 -1.02882 0.00155906 -0.0132586 1 0 1 1 0 0 +EDGE2 8244 8224 0.0492092 0.0524925 -0.00420859 1 0 1 1 0 0 +EDGE2 8244 8204 0.00363722 0.0321229 -0.0300417 1 0 1 1 0 0 +EDGE2 8244 8205 1.04631 -0.0167465 0.0249674 1 0 1 1 0 0 +EDGE2 8244 8225 1.00888 0.0761576 0.00571119 1 0 1 1 0 0 +EDGE2 8245 8224 -1.02621 0.0533317 -0.00499299 1 0 1 1 0 0 +EDGE2 8245 8244 -1.03477 0.0442978 -0.00629713 1 0 1 1 0 0 +EDGE2 8245 8204 -0.949749 -0.104656 0.0151595 1 0 1 1 0 0 +EDGE2 8245 8205 -0.108452 0.0241207 -0.00473781 1 0 1 1 0 0 +EDGE2 8245 8225 0.0781798 -0.102384 -0.0135887 1 0 1 1 0 0 +EDGE2 8245 8206 -0.0347004 1.01868 1.58562 1 0 1 1 0 0 +EDGE2 8245 8226 0.0197745 0.947336 1.58772 1 0 1 1 0 0 +EDGE2 8246 8205 -1.07147 0.0146675 -1.59064 1 0 1 1 0 0 +EDGE2 8246 8245 -1.0176 0.067423 -1.5921 1 0 1 1 0 0 +EDGE2 8246 8225 -0.9694 0.0195784 -1.54593 1 0 1 1 0 0 +EDGE2 8246 8227 1.06213 -0.0369561 0.00546158 1 0 1 1 0 0 +EDGE2 8246 8206 0.0779591 -0.0216489 0.009646 1 0 1 1 0 0 +EDGE2 8246 8226 0.0207244 0.0123991 -0.0183528 1 0 1 1 0 0 +EDGE2 8246 8207 0.991896 0.0101491 0.000285459 1 0 1 1 0 0 +EDGE2 8247 8208 0.923725 -0.00738429 0.034984 1 0 1 1 0 0 +EDGE2 8247 8227 -0.012085 0.0838846 -0.00309352 1 0 1 1 0 0 +EDGE2 8247 8206 -1.04251 -0.0244071 -0.00689656 1 0 1 1 0 0 +EDGE2 8247 8226 -0.975514 0.01507 -0.0280038 1 0 1 1 0 0 +EDGE2 8247 8246 -0.926061 -0.0155432 0.0209068 1 0 1 1 0 0 +EDGE2 8247 8228 1.00102 0.0765454 0.0267351 1 0 1 1 0 0 +EDGE2 8247 8207 0.0499682 0.0024394 0.015593 1 0 1 1 0 0 +EDGE2 8248 8208 0.0958696 0.0368249 -0.00506488 1 0 1 1 0 0 +EDGE2 8248 8227 -1.02425 0.00875194 0.00406314 1 0 1 1 0 0 +EDGE2 8248 8247 -1.05428 -0.0397038 -0.0111132 1 0 1 1 0 0 +EDGE2 8248 8228 -0.0438545 0.0430628 -0.0204637 1 0 1 1 0 0 +EDGE2 8248 8207 -1.06862 -0.0352177 0.0182392 1 0 1 1 0 0 +EDGE2 8248 8209 0.987124 0.034211 0.0196021 1 0 1 1 0 0 +EDGE2 8248 8229 1.02275 -0.00112907 -0.000726807 1 0 1 1 0 0 +EDGE2 8249 8208 -0.992905 -0.039142 -0.0244395 1 0 1 1 0 0 +EDGE2 8249 8228 -1.06049 0.0108236 -0.0103398 1 0 1 1 0 0 +EDGE2 8249 8248 -0.984066 -0.0508106 -0.0014706 1 0 1 1 0 0 +EDGE2 8249 8209 0.0446784 0.0435243 -0.0022855 1 0 1 1 0 0 +EDGE2 8249 8229 0.0302183 -0.0108907 0.00060423 1 0 1 1 0 0 +EDGE2 8249 8210 1.04248 0.00340778 -0.028441 1 0 1 1 0 0 +EDGE2 8249 8230 0.924989 0.0149265 -0.0257998 1 0 1 1 0 0 +EDGE2 8250 8209 -1.05778 0.00393714 -0.0350344 1 0 1 1 0 0 +EDGE2 8250 8229 -0.922007 -0.0205619 -0.0219591 1 0 1 1 0 0 +EDGE2 8250 8249 -0.998538 0.0817909 -0.00896695 1 0 1 1 0 0 +EDGE2 8250 8211 0.00970567 0.953025 1.56445 1 0 1 1 0 0 +EDGE2 8250 8231 -0.003197 0.905957 1.58123 1 0 1 1 0 0 +EDGE2 8250 8210 -0.0113086 -0.0632451 -0.0436425 1 0 1 1 0 0 +EDGE2 8250 8230 0.000195542 -0.00793141 -0.00777217 1 0 1 1 0 0 +EDGE2 8251 8211 -0.0582759 0.0593612 0.0259978 1 0 1 1 0 0 +EDGE2 8251 8212 0.951623 -0.0608762 -0.00593987 1 0 1 1 0 0 +EDGE2 8251 8232 1.06404 -0.00114001 -0.013531 1 0 1 1 0 0 +EDGE2 8251 8231 -0.0228746 -0.112448 -0.0065588 1 0 1 1 0 0 +EDGE2 8251 8210 -1.03298 0.0285519 -1.5881 1 0 1 1 0 0 +EDGE2 8251 8230 -0.932585 -0.00768395 -1.53762 1 0 1 1 0 0 +EDGE2 8251 8250 -1.02611 0.0546 -1.56516 1 0 1 1 0 0 +EDGE2 8252 8233 1.02472 0.0435745 0.0314518 1 0 1 1 0 0 +EDGE2 8252 8213 1.01275 -0.0149466 0.00490286 1 0 1 1 0 0 +EDGE2 8252 8211 -1.04663 -0.05651 0.0369778 1 0 1 1 0 0 +EDGE2 8252 8251 -1.03912 0.0347417 0.0097549 1 0 1 1 0 0 +EDGE2 8252 8212 -0.016886 0.121479 -0.00226509 1 0 1 1 0 0 +EDGE2 8252 8232 0.00570242 -0.0925054 -0.00799102 1 0 1 1 0 0 +EDGE2 8252 8231 -0.987854 -0.00113289 0.0106011 1 0 1 1 0 0 +EDGE2 8253 8233 0.0734306 0.0271145 -0.00989951 1 0 1 1 0 0 +EDGE2 8253 8214 1.00871 0.0151939 -0.00167391 1 0 1 1 0 0 +EDGE2 8253 8234 0.973787 0.0682002 0.00991443 1 0 1 1 0 0 +EDGE2 8253 8252 -0.951457 -0.00561533 -0.00630559 1 0 1 1 0 0 +EDGE2 8253 8213 -0.0235969 0.0572674 0.00646703 1 0 1 1 0 0 +EDGE2 8253 8212 -0.990242 -0.0794413 0.00685245 1 0 1 1 0 0 +EDGE2 8253 8232 -0.987289 0.0464269 -0.00410796 1 0 1 1 0 0 +EDGE2 8254 8233 -1.03172 -0.00866802 -0.030299 1 0 1 1 0 0 +EDGE2 8254 8235 0.991829 -0.0154246 0.027304 1 0 1 1 0 0 +EDGE2 8254 8215 1.1073 0.0948951 0.0168342 1 0 1 1 0 0 +EDGE2 8254 8214 0.0568134 0.0450485 0.00289636 1 0 1 1 0 0 +EDGE2 8254 8234 -0.0151577 0.00398916 -0.0117083 1 0 1 1 0 0 +EDGE2 8254 8253 -0.944588 -0.041508 0.0313582 1 0 1 1 0 0 +EDGE2 8254 8213 -0.893095 0.0922574 -0.0174059 1 0 1 1 0 0 +EDGE2 8255 8236 -0.0261346 1.00967 1.56345 1 0 1 1 0 0 +EDGE2 8255 8254 -1.01912 -0.0555686 0.0377622 1 0 1 1 0 0 +EDGE2 8255 8235 -0.0669881 0.0574759 0.00567161 1 0 1 1 0 0 +EDGE2 8255 8216 -0.0687402 0.954604 1.57417 1 0 1 1 0 0 +EDGE2 8255 8215 -0.00500649 -0.0511609 -0.0200284 1 0 1 1 0 0 +EDGE2 8255 8214 -1.03057 0.0585836 0.023121 1 0 1 1 0 0 +EDGE2 8255 8234 -1.07977 0.0672256 -0.0193806 1 0 1 1 0 0 +EDGE2 8256 8237 0.946912 -0.0363607 0.0322854 1 0 1 1 0 0 +EDGE2 8256 8217 0.915046 -0.0114521 0.0184884 1 0 1 1 0 0 +EDGE2 8256 8236 0.00942112 -0.00862734 -0.00248278 1 0 1 1 0 0 +EDGE2 8256 8235 -1.00509 0.0292097 -1.57562 1 0 1 1 0 0 +EDGE2 8256 8255 -0.908613 0.015613 -1.56508 1 0 1 1 0 0 +EDGE2 8256 8216 -0.0784569 0.078957 -0.017907 1 0 1 1 0 0 +EDGE2 8256 8215 -0.961285 0.0909576 -1.54316 1 0 1 1 0 0 +EDGE2 8257 8218 0.990252 0.0070395 0.00864207 1 0 1 1 0 0 +EDGE2 8257 8238 0.953151 0.0054225 0.0169411 1 0 1 1 0 0 +EDGE2 8257 8237 -0.0552379 -0.0125173 -0.0145047 1 0 1 1 0 0 +EDGE2 8257 8217 -0.0519839 -0.0504452 0.024482 1 0 1 1 0 0 +EDGE2 8257 8236 -0.865035 0.0174861 0.00584965 1 0 1 1 0 0 +EDGE2 8257 8256 -1.02535 0.0623752 0.00200424 1 0 1 1 0 0 +EDGE2 8257 8216 -0.993653 0.025308 0.0216844 1 0 1 1 0 0 +EDGE2 8258 8257 -1.10913 0.0379823 -0.0232138 1 0 1 1 0 0 +EDGE2 8258 8239 1.09739 -0.100081 -0.0218964 1 0 1 1 0 0 +EDGE2 8258 8219 0.958461 0.0724047 -0.00192669 1 0 1 1 0 0 +EDGE2 8258 8218 -0.00947333 -0.029127 0.000162907 1 0 1 1 0 0 +EDGE2 8258 8238 -0.0528225 -0.075304 0.0164423 1 0 1 1 0 0 +EDGE2 8258 8237 -0.98629 0.0138728 0.00284631 1 0 1 1 0 0 +EDGE2 8258 8217 -0.907547 -0.0536092 0.0472199 1 0 1 1 0 0 +EDGE2 8259 8220 1.06737 -0.00487528 -0.0150582 1 0 1 1 0 0 +EDGE2 8259 8240 0.956087 -0.00302284 0.012077 1 0 1 1 0 0 +EDGE2 8259 8200 1.03815 -0.00440541 -3.15669 1 0 1 1 0 0 +EDGE2 8259 8239 -0.0376118 -0.0130869 -0.0225918 1 0 1 1 0 0 +EDGE2 8259 8219 0.0853862 -0.0571537 -0.0246668 1 0 1 1 0 0 +EDGE2 8259 8218 -0.90439 -0.0409916 -0.0136461 1 0 1 1 0 0 +EDGE2 8259 8238 -0.988361 0.0341223 -0.0206372 1 0 1 1 0 0 +EDGE2 8259 8258 -1.05446 -0.065474 0.00675505 1 0 1 1 0 0 +EDGE2 8260 8199 0.99643 0.037721 -3.13955 1 0 1 1 0 0 +EDGE2 8260 8220 -0.00758691 -0.047968 -0.0184265 1 0 1 1 0 0 +EDGE2 8260 8240 -0.0624102 -0.0469879 0.00959461 1 0 1 1 0 0 +EDGE2 8260 8200 -0.11754 -0.00115003 -3.15158 1 0 1 1 0 0 +EDGE2 8260 8239 -1.02416 0.0616588 0.0193192 1 0 1 1 0 0 +EDGE2 8260 8259 -1.12404 -0.079438 -0.0192838 1 0 1 1 0 0 +EDGE2 8260 8219 -0.948942 -0.00981219 0.00993347 1 0 1 1 0 0 +EDGE2 8260 8201 -0.0543415 1.10005 1.60329 1 0 1 1 0 0 +EDGE2 8260 8221 0.0278937 1.02334 1.61867 1 0 1 1 0 0 +EDGE2 8260 8241 0.0251447 0.950799 1.57682 1 0 1 1 0 0 +EDGE2 8261 8260 -1.07994 0.0145369 -1.55503 1 0 1 1 0 0 +EDGE2 8261 8220 -1.00615 0.0580551 -1.54857 1 0 1 1 0 0 +EDGE2 8261 8240 -0.958311 0.019829 -1.58694 1 0 1 1 0 0 +EDGE2 8261 8200 -0.947591 0.0419612 1.56499 1 0 1 1 0 0 +EDGE2 8261 8242 1.03079 -0.0106563 0.000162083 1 0 1 1 0 0 +EDGE2 8261 8201 -0.0768259 -0.025592 -0.0524239 1 0 1 1 0 0 +EDGE2 8261 8221 -0.123987 0.0087919 0.00920582 1 0 1 1 0 0 +EDGE2 8261 8241 0.0535429 0.0344224 0.0195281 1 0 1 1 0 0 +EDGE2 8261 8202 1.05116 -0.039574 -0.0213365 1 0 1 1 0 0 +EDGE2 8261 8222 0.974181 -0.0594749 0.00826368 1 0 1 1 0 0 +EDGE2 8262 8261 -1.00529 0.0141786 -0.0344171 1 0 1 1 0 0 +EDGE2 8262 8242 0.00903942 0.00716662 0.0103129 1 0 1 1 0 0 +EDGE2 8262 8201 -0.998896 0.00581125 -0.0246455 1 0 1 1 0 0 +EDGE2 8262 8221 -0.975419 0.0422453 -0.0115841 1 0 1 1 0 0 +EDGE2 8262 8241 -1.01195 -0.0465259 -0.0311389 1 0 1 1 0 0 +EDGE2 8262 8202 -0.0530466 0.0878077 -0.0181108 1 0 1 1 0 0 +EDGE2 8262 8222 0.064572 0.0364004 -0.00941935 1 0 1 1 0 0 +EDGE2 8262 8203 0.901386 0.0660768 -0.0101419 1 0 1 1 0 0 +EDGE2 8262 8243 1.00095 0.0229822 0.0219095 1 0 1 1 0 0 +EDGE2 8262 8223 1.02559 0.0928713 0.0134604 1 0 1 1 0 0 +EDGE2 8263 8242 -0.986957 0.0185063 -0.0105842 1 0 1 1 0 0 +EDGE2 8263 8262 -1.06302 -0.0279911 0.0219947 1 0 1 1 0 0 +EDGE2 8263 8202 -0.975403 0.0203895 -0.00244493 1 0 1 1 0 0 +EDGE2 8263 8222 -0.927388 0.00900546 -0.00310777 1 0 1 1 0 0 +EDGE2 8263 8203 0.0358739 0.0219437 0.0165182 1 0 1 1 0 0 +EDGE2 8263 8243 0.0253816 -0.0416419 0.00933062 1 0 1 1 0 0 +EDGE2 8263 8223 -0.0668649 -0.0263562 -0.0176944 1 0 1 1 0 0 +EDGE2 8263 8224 0.98876 -0.0223881 -0.0572485 1 0 1 1 0 0 +EDGE2 8263 8244 1.07861 -0.0705238 -0.032232 1 0 1 1 0 0 +EDGE2 8263 8204 0.97531 -0.025927 -0.00491311 1 0 1 1 0 0 +EDGE2 8264 8203 -1.01127 -0.0980026 0.0296459 1 0 1 1 0 0 +EDGE2 8264 8243 -1.00306 0.101294 -0.00942588 1 0 1 1 0 0 +EDGE2 8264 8263 -1.00629 0.0313574 0.00709064 1 0 1 1 0 0 +EDGE2 8264 8223 -1.10332 -0.0107614 -0.0152312 1 0 1 1 0 0 +EDGE2 8264 8224 -0.0110055 -0.0111078 0.00549138 1 0 1 1 0 0 +EDGE2 8264 8244 0.041313 0.0646115 0.0111575 1 0 1 1 0 0 +EDGE2 8264 8204 -0.00659897 -0.0413976 0.00293218 1 0 1 1 0 0 +EDGE2 8264 8205 1.00066 0.0245296 -0.00489627 1 0 1 1 0 0 +EDGE2 8264 8245 0.998337 0.0586882 0.0316349 1 0 1 1 0 0 +EDGE2 8264 8225 1.02801 -0.108694 -0.0248441 1 0 1 1 0 0 +EDGE2 8265 8224 -0.963769 0.0370291 -0.0111927 1 0 1 1 0 0 +EDGE2 8265 8244 -1.01302 0.0135025 -0.00140744 1 0 1 1 0 0 +EDGE2 8265 8264 -0.974084 -0.0439592 -0.0229289 1 0 1 1 0 0 +EDGE2 8265 8204 -1.04532 -0.0089798 -0.00640024 1 0 1 1 0 0 +EDGE2 8265 8205 0.052543 0.0105352 -0.0364164 1 0 1 1 0 0 +EDGE2 8265 8245 0.103919 -0.0653499 -0.021 1 0 1 1 0 0 +EDGE2 8265 8225 -0.000712426 0.0214877 -0.0135598 1 0 1 1 0 0 +EDGE2 8265 8206 -0.0292819 1.06155 1.57258 1 0 1 1 0 0 +EDGE2 8265 8226 0.0413064 1.04298 1.58166 1 0 1 1 0 0 +EDGE2 8265 8246 -0.0219061 1.04588 1.59624 1 0 1 1 0 0 +EDGE2 8266 8265 -0.941288 0.0377711 1.57521 1 0 1 1 0 0 +EDGE2 8266 8205 -0.911723 -0.0849228 1.59459 1 0 1 1 0 0 +EDGE2 8266 8245 -0.994284 0.00143679 1.57715 1 0 1 1 0 0 +EDGE2 8266 8225 -0.919164 0.0623346 1.53849 1 0 1 1 0 0 +EDGE2 8267 8266 -1.00635 0.0144186 0.0154127 1 0 1 1 0 0 +EDGE2 8268 8267 -1.02718 -0.0427451 -0.0240116 1 0 1 1 0 0 +EDGE2 8269 8268 -0.954938 -0.0295167 0.00891609 1 0 1 1 0 0 +EDGE2 8270 8269 -0.956308 -0.0309418 -0.0173789 1 0 1 1 0 0 +EDGE2 8271 8270 -0.958236 0.0881535 -1.59202 1 0 1 1 0 0 +EDGE2 8272 8271 -0.968465 0.0441416 0.0106201 1 0 1 1 0 0 +EDGE2 8273 8272 -1.01766 -0.0401473 -0.0293362 1 0 1 1 0 0 +EDGE2 8274 8273 -1.09491 0.040008 -0.0123149 1 0 1 1 0 0 +EDGE2 8275 8274 -0.979035 -0.100183 -0.0118611 1 0 1 1 0 0 +EDGE2 8276 8275 -0.907223 -0.03755 -1.58917 1 0 1 1 0 0 +EDGE2 8277 8276 -0.982108 -0.0235209 0.00569364 1 0 1 1 0 0 +EDGE2 8278 8277 -1.00126 -0.0663184 0.0440823 1 0 1 1 0 0 +EDGE2 8279 8278 -0.90294 -0.00498535 -0.0205709 1 0 1 1 0 0 +EDGE2 8280 8279 -1.0293 -0.0606119 0.0214781 1 0 1 1 0 0 +EDGE2 8281 8280 -0.942716 0.0138954 1.56831 1 0 1 1 0 0 +EDGE2 8282 8281 -1.06258 -0.0782851 -0.00944337 1 0 1 1 0 0 +EDGE2 8283 8282 -1.03519 -0.0915626 0.0306426 1 0 1 1 0 0 +EDGE2 8284 8283 -0.977934 -0.000833582 0.0135372 1 0 1 1 0 0 +EDGE2 8285 8284 -0.901379 -0.00392534 0.0187161 1 0 1 1 0 0 +EDGE2 8286 8285 -1.06212 -0.0301747 -1.57878 1 0 1 1 0 0 +EDGE2 8287 8286 -1.03498 -0.0364718 0.00866562 1 0 1 1 0 0 +EDGE2 8288 8287 -0.976351 -0.0429503 -0.00090334 1 0 1 1 0 0 +EDGE2 8289 8288 -0.942311 -0.0219986 0.0390854 1 0 1 1 0 0 +EDGE2 8290 8289 -1.00788 0.105388 0.0055603 1 0 1 1 0 0 +EDGE2 8291 8290 -1.05655 -0.0846853 1.56023 1 0 1 1 0 0 +EDGE2 8292 8291 -1.00676 0.0447434 -0.0223746 1 0 1 1 0 0 +EDGE2 8293 8292 -0.931496 0.00493539 -0.0356157 1 0 1 1 0 0 +EDGE2 8294 8293 -0.994634 0.00138965 -0.0190524 1 0 1 1 0 0 +EDGE2 8295 8294 -0.995063 -0.00268073 -0.0127557 1 0 1 1 0 0 +EDGE2 8296 8295 -1.11734 0.103544 -1.60163 1 0 1 1 0 0 +EDGE2 8297 8296 -1.04018 0.063289 0.0118917 1 0 1 1 0 0 +EDGE2 8298 8297 -0.904813 0.0250052 0.013651 1 0 1 1 0 0 +EDGE2 8299 8298 -1.06455 -0.00535263 -0.0194254 1 0 1 1 0 0 +EDGE2 8300 8299 -1.00205 0.0722661 -0.00457142 1 0 1 1 0 0 +EDGE2 8301 8300 -0.942757 -0.0589266 -1.57767 1 0 1 1 0 0 +EDGE2 8302 8301 -1.01506 0.0260259 0.0300158 1 0 1 1 0 0 +EDGE2 8303 8302 -1.02648 -0.0188646 -0.0179536 1 0 1 1 0 0 +EDGE2 8304 8303 -0.990227 0.0846377 0.00338221 1 0 1 1 0 0 +EDGE2 8305 8304 -0.993032 -0.0859318 0.00552084 1 0 1 1 0 0 +EDGE2 8306 8305 -0.968649 -0.0351358 1.59151 1 0 1 1 0 0 +EDGE2 8307 8306 -0.997834 0.0114945 0.0234466 1 0 1 1 0 0 +EDGE2 8308 8307 -0.974851 -0.0283284 0.00301839 1 0 1 1 0 0 +EDGE2 8309 8308 -0.998559 -0.0314259 0.0259718 1 0 1 1 0 0 +EDGE2 8310 8309 -0.950282 0.00721874 0.0366262 1 0 1 1 0 0 +EDGE2 8311 8310 -0.963365 0.0282924 -1.58288 1 0 1 1 0 0 +EDGE2 8312 8311 -1.02475 0.0720977 0.0237202 1 0 1 1 0 0 +EDGE2 8313 8312 -1.00507 0.000667639 0.0131713 1 0 1 1 0 0 +EDGE2 8314 8313 -0.995006 0.0636671 -0.000592387 1 0 1 1 0 0 +EDGE2 8315 8314 -1.07412 -0.0753124 -0.0231628 1 0 1 1 0 0 +EDGE2 8316 8315 -1.00819 -0.0167909 1.55222 1 0 1 1 0 0 +EDGE2 8317 8316 -0.987344 0.019905 -0.0313365 1 0 1 1 0 0 +EDGE2 8318 8317 -1.07677 0.00742557 0.00817737 1 0 1 1 0 0 +EDGE2 8319 8318 -1.03285 0.0704269 0.00755632 1 0 1 1 0 0 +EDGE2 8320 8319 -1.03817 -0.0650128 0.0191244 1 0 1 1 0 0 +EDGE2 8321 8320 -0.98758 -0.0978291 -1.5436 1 0 1 1 0 0 +EDGE2 8322 8321 -0.956268 0.0428623 0.0167698 1 0 1 1 0 0 +EDGE2 8323 8322 -0.981266 -0.0247861 0.0158988 1 0 1 1 0 0 +EDGE2 8324 8323 -1.0463 0.0331779 0.0105042 1 0 1 1 0 0 +EDGE2 8325 8324 -1.0314 0.00599357 -0.00246025 1 0 1 1 0 0 +EDGE2 8326 8325 -0.982981 -0.0347377 -1.55212 1 0 1 1 0 0 +EDGE2 8327 8326 -1.00482 0.00207504 0.0104544 1 0 1 1 0 0 +EDGE2 8328 8327 -0.962502 -0.0427496 -0.0089812 1 0 1 1 0 0 +EDGE2 8329 8328 -1.0715 -0.0548881 0.0150549 1 0 1 1 0 0 +EDGE2 8330 8329 -1.06461 -0.0320611 -0.00855143 1 0 1 1 0 0 +EDGE2 8331 8330 -0.99318 0.0673534 1.59307 1 0 1 1 0 0 +EDGE2 8332 8331 -1.05717 -0.0942832 -0.0289624 1 0 1 1 0 0 +EDGE2 8333 8332 -0.988874 -0.00610679 0.0202065 1 0 1 1 0 0 +EDGE2 8334 8333 -0.985325 0.0288358 -0.0145982 1 0 1 1 0 0 +EDGE2 8334 1035 0.983726 -0.00626209 -3.11685 1 0 1 1 0 0 +EDGE2 8335 1034 0.926488 0.0163502 -3.16581 1 0 1 1 0 0 +EDGE2 8335 1035 -0.0845504 0.0303833 -3.16057 1 0 1 1 0 0 +EDGE2 8335 8334 -1.01473 0.0405399 -0.0226731 1 0 1 1 0 0 +EDGE2 8335 1036 -0.00100295 -1.0201 -1.56764 1 0 1 1 0 0 +EDGE2 8336 1035 -0.938732 0.026625 -1.56629 1 0 1 1 0 0 +EDGE2 8336 8335 -1.04168 -0.0133955 1.55947 1 0 1 1 0 0 +EDGE2 8336 1036 -0.0628938 -0.00113116 0.0215106 1 0 1 1 0 0 +EDGE2 8336 1037 1.11127 0.00282963 0.030959 1 0 1 1 0 0 +EDGE2 8337 8336 -1.00494 0.057215 -0.0274568 1 0 1 1 0 0 +EDGE2 8337 1036 -0.965457 -0.0814007 -0.0177097 1 0 1 1 0 0 +EDGE2 8337 1037 0.0789457 -0.0287872 -0.0216048 1 0 1 1 0 0 +EDGE2 8337 1038 0.984362 0.0460225 -0.00674179 1 0 1 1 0 0 +EDGE2 8338 1037 -0.904236 -0.0366908 -0.0100138 1 0 1 1 0 0 +EDGE2 8338 8337 -1.03598 0.0433897 -0.0136407 1 0 1 1 0 0 +EDGE2 8338 1038 -0.0257328 0.0279855 0.0150889 1 0 1 1 0 0 +EDGE2 8338 1039 1.02173 0.0371314 -0.00162779 1 0 1 1 0 0 +EDGE2 8339 1038 -0.988109 -0.0307751 0.0121538 1 0 1 1 0 0 +EDGE2 8339 8338 -1.00469 0.0100636 0.00261918 1 0 1 1 0 0 +EDGE2 8339 1039 -0.0531329 -0.0572392 0.0324824 1 0 1 1 0 0 +EDGE2 8339 1040 1.03813 -0.0936912 -0.00919118 1 0 1 1 0 0 +EDGE2 8340 8339 -1.02501 0.00447523 -0.0102251 1 0 1 1 0 0 +EDGE2 8340 1039 -1.02938 0.016173 0.0225113 1 0 1 1 0 0 +EDGE2 8340 1041 -0.0283151 0.97386 1.56678 1 0 1 1 0 0 +EDGE2 8340 1040 -0.0144916 0.048323 -0.0267287 1 0 1 1 0 0 +EDGE2 8341 1041 0.0032282 0.057391 0.00184323 1 0 1 1 0 0 +EDGE2 8341 1042 0.999957 -0.0293606 -0.0244859 1 0 1 1 0 0 +EDGE2 8341 1040 -1.00816 0.0201555 -1.55255 1 0 1 1 0 0 +EDGE2 8341 8340 -0.95863 0.0132967 -1.56174 1 0 1 1 0 0 +EDGE2 8342 1043 1.01547 0.102641 -0.0277315 1 0 1 1 0 0 +EDGE2 8342 1041 -0.887899 -0.00392176 0.0158988 1 0 1 1 0 0 +EDGE2 8342 1042 -0.00602448 -0.0388916 0.0265587 1 0 1 1 0 0 +EDGE2 8342 8341 -0.9743 -0.031599 -0.00507944 1 0 1 1 0 0 +EDGE2 8343 1044 0.944621 0.0210264 0.000728439 1 0 1 1 0 0 +EDGE2 8343 1043 0.0388755 0.073532 0.000643332 1 0 1 1 0 0 +EDGE2 8343 1042 -1.01152 0.0513177 -0.0189371 1 0 1 1 0 0 +EDGE2 8343 8342 -1.06426 0.0204107 0.0211063 1 0 1 1 0 0 +EDGE2 8344 1045 0.950022 -0.0168195 0.0306276 1 0 1 1 0 0 +EDGE2 8344 1085 0.928894 0.0676654 -3.14144 1 0 1 1 0 0 +EDGE2 8344 5865 1.0866 -0.0346888 -3.16045 1 0 1 1 0 0 +EDGE2 8344 8343 -0.99789 0.039264 0.02358 1 0 1 1 0 0 +EDGE2 8344 1044 -0.0490418 -0.0328354 -0.0281196 1 0 1 1 0 0 +EDGE2 8344 1043 -0.967207 0.0589531 0.0300279 1 0 1 1 0 0 +EDGE2 8345 1046 0.040975 1.05292 1.59469 1 0 1 1 0 0 +EDGE2 8345 1084 1.0144 -0.0310385 -3.15911 1 0 1 1 0 0 +EDGE2 8345 5864 0.957501 0.0107063 -3.13837 1 0 1 1 0 0 +EDGE2 8345 8344 -1.01933 0.00583485 0.00723054 1 0 1 1 0 0 +EDGE2 8345 1045 0.0146836 -0.0165311 -0.00190273 1 0 1 1 0 0 +EDGE2 8345 1085 0.0639143 0.000882311 -3.15175 1 0 1 1 0 0 +EDGE2 8345 5865 0.00158965 -0.0320786 -3.12373 1 0 1 1 0 0 +EDGE2 8345 1044 -1.05398 -0.0133895 -0.00322953 1 0 1 1 0 0 +EDGE2 8345 1086 -0.0460747 -1.0137 -1.54343 1 0 1 1 0 0 +EDGE2 8345 5866 0.0341834 -1.08939 -1.57678 1 0 1 1 0 0 +EDGE2 8346 8345 -0.954924 -0.105969 1.56561 1 0 1 1 0 0 +EDGE2 8346 1045 -0.907399 0.0960528 1.54317 1 0 1 1 0 0 +EDGE2 8346 1085 -0.970203 -0.0109747 -1.55899 1 0 1 1 0 0 +EDGE2 8346 5865 -1.02914 -0.0726188 -1.61973 1 0 1 1 0 0 +EDGE2 8346 1086 0.00846889 0.0051395 0.022444 1 0 1 1 0 0 +EDGE2 8346 5866 0.0534146 -0.0472595 -0.0298847 1 0 1 1 0 0 +EDGE2 8346 5867 1.03258 -0.00261546 -0.0251514 1 0 1 1 0 0 +EDGE2 8346 1087 0.95803 -0.0856145 -0.00303461 1 0 1 1 0 0 +EDGE2 8347 8346 -1.0036 0.144212 0.00130264 1 0 1 1 0 0 +EDGE2 8347 1086 -0.934275 0.0271149 -0.0275958 1 0 1 1 0 0 +EDGE2 8347 5866 -1.01564 0.0297299 -0.00958669 1 0 1 1 0 0 +EDGE2 8347 5867 -0.0570014 -0.072246 -0.0427802 1 0 1 1 0 0 +EDGE2 8347 1087 -0.031044 0.0169927 -0.0219167 1 0 1 1 0 0 +EDGE2 8347 1088 1.07886 -0.04191 0.0132917 1 0 1 1 0 0 +EDGE2 8347 5868 1.00523 0.0309544 -0.0115291 1 0 1 1 0 0 +EDGE2 8348 5867 -0.979411 0.000760254 0.0216006 1 0 1 1 0 0 +EDGE2 8348 8347 -1.11359 0.0869817 -0.00552279 1 0 1 1 0 0 +EDGE2 8348 1087 -0.971593 0.156865 0.0122839 1 0 1 1 0 0 +EDGE2 8348 1088 -0.0713286 -0.0256676 -0.00915465 1 0 1 1 0 0 +EDGE2 8348 5868 0.0186402 -0.0255858 0.00204412 1 0 1 1 0 0 +EDGE2 8348 5869 0.971789 0.0199849 -0.0182341 1 0 1 1 0 0 +EDGE2 8348 1089 0.992336 -0.0334895 0.0101399 1 0 1 1 0 0 +EDGE2 8349 8348 -0.975686 0.00049856 -0.000590149 1 0 1 1 0 0 +EDGE2 8349 1088 -1.05631 -0.0180865 -0.00208703 1 0 1 1 0 0 +EDGE2 8349 5868 -1.03902 0.0837221 -0.00916629 1 0 1 1 0 0 +EDGE2 8349 5869 -0.0480763 0.0399073 -0.0228665 1 0 1 1 0 0 +EDGE2 8349 1089 0.0512875 -0.0797507 -0.0235099 1 0 1 1 0 0 +EDGE2 8349 5870 1.01538 0.00921775 0.0216227 1 0 1 1 0 0 +EDGE2 8349 1090 1.04995 0.0238249 -0.0315456 1 0 1 1 0 0 +EDGE2 8350 5869 -1.00395 -0.0809268 -0.0138427 1 0 1 1 0 0 +EDGE2 8350 8349 -0.97623 -0.0291937 0.0198145 1 0 1 1 0 0 +EDGE2 8350 1089 -1.01831 -0.00904495 0.0214068 1 0 1 1 0 0 +EDGE2 8350 1091 0.0156836 0.99497 1.56967 1 0 1 1 0 0 +EDGE2 8350 5871 -0.00286664 0.934753 1.53636 1 0 1 1 0 0 +EDGE2 8350 5870 -0.0854526 0.00782048 0.00982462 1 0 1 1 0 0 +EDGE2 8350 1090 -0.0603779 -0.0299098 0.00618456 1 0 1 1 0 0 +EDGE2 8351 1092 1.02028 -0.0444514 0.0136552 1 0 1 1 0 0 +EDGE2 8351 5872 0.981263 0.0082774 -0.0410109 1 0 1 1 0 0 +EDGE2 8351 1091 0.0132943 -0.0844699 0.0321715 1 0 1 1 0 0 +EDGE2 8351 5871 0.0292027 0.00167344 0.0166416 1 0 1 1 0 0 +EDGE2 8351 5870 -0.969995 -0.000547753 -1.57956 1 0 1 1 0 0 +EDGE2 8351 8350 -0.955348 0.0471393 -1.64242 1 0 1 1 0 0 +EDGE2 8351 1090 -0.991657 0.0582602 -1.5883 1 0 1 1 0 0 +EDGE2 8352 1092 0.0246491 0.059912 0.0413933 1 0 1 1 0 0 +EDGE2 8352 1093 1.03343 -0.101639 0.00360336 1 0 1 1 0 0 +EDGE2 8352 5873 1.04491 -0.0141495 0.0140547 1 0 1 1 0 0 +EDGE2 8352 5872 -0.0154579 -0.0788412 -0.00430099 1 0 1 1 0 0 +EDGE2 8352 8351 -1.02032 0.0481468 0.000148868 1 0 1 1 0 0 +EDGE2 8352 1091 -0.919984 0.00176231 -0.0197748 1 0 1 1 0 0 +EDGE2 8352 5871 -1.01977 0.063395 0.0408042 1 0 1 1 0 0 +EDGE2 8353 1092 -1.08548 -0.0554088 0.0391622 1 0 1 1 0 0 +EDGE2 8353 1094 1.03987 -0.0505809 -0.0110408 1 0 1 1 0 0 +EDGE2 8353 5874 0.991492 -0.0353811 -0.00330635 1 0 1 1 0 0 +EDGE2 8353 1093 0.00958209 0.0393288 0.00744628 1 0 1 1 0 0 +EDGE2 8353 5873 -0.0185244 0.00333488 -0.0147977 1 0 1 1 0 0 +EDGE2 8353 8352 -1.02559 0.0639091 -0.0127421 1 0 1 1 0 0 +EDGE2 8353 5872 -1.02477 0.0126999 0.00253497 1 0 1 1 0 0 +EDGE2 8354 5795 1.07504 -0.0184847 -3.13615 1 0 1 1 0 0 +EDGE2 8354 5875 0.975747 -0.0617497 0.0126418 1 0 1 1 0 0 +EDGE2 8354 5855 1.00566 0.0960294 -3.13584 1 0 1 1 0 0 +EDGE2 8354 3035 1.02259 0.0610321 -3.11769 1 0 1 1 0 0 +EDGE2 8354 3055 1.01297 -0.0187142 -3.13255 1 0 1 1 0 0 +EDGE2 8354 1095 0.97008 0.0365256 -0.0010313 1 0 1 1 0 0 +EDGE2 8354 1115 0.944079 0.0241147 -3.13621 1 0 1 1 0 0 +EDGE2 8354 1135 0.990434 0.0216261 -3.17186 1 0 1 1 0 0 +EDGE2 8354 8353 -0.998391 -0.0508572 0.00355966 1 0 1 1 0 0 +EDGE2 8354 1094 0.054814 0.0388071 0.00223324 1 0 1 1 0 0 +EDGE2 8354 5874 0.0124544 0.0743778 0.00957391 1 0 1 1 0 0 +EDGE2 8354 1093 -0.955711 -0.0374386 0.00067968 1 0 1 1 0 0 +EDGE2 8354 5873 -1.08889 0.030265 -0.020164 1 0 1 1 0 0 +EDGE2 8355 5795 -0.0669622 -0.0160392 -3.14223 1 0 1 1 0 0 +EDGE2 8355 5856 -0.00695653 0.935118 1.54986 1 0 1 1 0 0 +EDGE2 8355 5876 -0.00295778 0.942286 1.56755 1 0 1 1 0 0 +EDGE2 8355 3056 0.0441219 0.958686 1.57197 1 0 1 1 0 0 +EDGE2 8355 5794 0.931276 0.0367122 -3.12844 1 0 1 1 0 0 +EDGE2 8355 5854 1.06486 -0.0374804 -3.12423 1 0 1 1 0 0 +EDGE2 8355 1134 1.0129 -0.0862321 -3.13839 1 0 1 1 0 0 +EDGE2 8355 3034 1.04231 -0.15573 -3.1534 1 0 1 1 0 0 +EDGE2 8355 3054 0.977734 -0.000341297 -3.15257 1 0 1 1 0 0 +EDGE2 8355 1114 1.07347 0.0131571 -3.14801 1 0 1 1 0 0 +EDGE2 8355 5875 0.0456671 0.0279634 0.00665564 1 0 1 1 0 0 +EDGE2 8355 5855 -0.0276585 -0.0501733 -3.11786 1 0 1 1 0 0 +EDGE2 8355 3035 -0.0402656 -0.0697378 -3.17758 1 0 1 1 0 0 +EDGE2 8355 3055 0.111374 0.0268501 -3.09834 1 0 1 1 0 0 +EDGE2 8355 1095 0.0265923 0.0427477 0.0310679 1 0 1 1 0 0 +EDGE2 8355 1115 -0.0243167 0.0483864 -3.1455 1 0 1 1 0 0 +EDGE2 8355 1135 0.00986823 -0.0089143 -3.10865 1 0 1 1 0 0 +EDGE2 8355 1094 -0.957242 -0.0675052 0.00523016 1 0 1 1 0 0 +EDGE2 8355 8354 -1.019 0.0415643 0.0299274 1 0 1 1 0 0 +EDGE2 8355 5874 -1.05761 -0.109291 0.00411046 1 0 1 1 0 0 +EDGE2 8355 1116 -0.0186205 -1.01389 -1.57488 1 0 1 1 0 0 +EDGE2 8355 3036 0.065099 -1.07075 -1.5718 1 0 1 1 0 0 +EDGE2 8355 5796 0.0144618 -1.07297 -1.56015 1 0 1 1 0 0 +EDGE2 8355 1136 -0.131614 -1.00064 -1.54671 1 0 1 1 0 0 +EDGE2 8355 1096 -0.077958 -0.925835 -1.5649 1 0 1 1 0 0 +EDGE2 8356 5795 -1.0206 -0.0677107 1.60558 1 0 1 1 0 0 +EDGE2 8356 5877 0.920314 -0.00772245 -0.00824135 1 0 1 1 0 0 +EDGE2 8356 3057 1.06275 0.0319148 -0.00711023 1 0 1 1 0 0 +EDGE2 8356 5857 1.05213 0.00488905 0.0264737 1 0 1 1 0 0 +EDGE2 8356 5856 0.0344168 -0.0384883 0.00434067 1 0 1 1 0 0 +EDGE2 8356 5876 -0.00591577 0.016045 0.00438459 1 0 1 1 0 0 +EDGE2 8356 3056 -0.0129947 -0.0118143 0.00874494 1 0 1 1 0 0 +EDGE2 8356 5875 -1.02786 0.0222731 -1.59387 1 0 1 1 0 0 +EDGE2 8356 8355 -0.961041 -0.0335467 -1.58725 1 0 1 1 0 0 +EDGE2 8356 5855 -0.995425 -0.050431 1.56688 1 0 1 1 0 0 +EDGE2 8356 3035 -0.951584 0.0059293 1.57359 1 0 1 1 0 0 +EDGE2 8356 3055 -1.03091 -0.0325046 1.5465 1 0 1 1 0 0 +EDGE2 8356 1095 -1.05043 -0.0532849 -1.56668 1 0 1 1 0 0 +EDGE2 8356 1115 -0.978317 0.0118994 1.58522 1 0 1 1 0 0 +EDGE2 8356 1135 -1.00268 0.00181713 1.58608 1 0 1 1 0 0 +EDGE2 8357 3058 1.08251 0.00269528 -0.0115601 1 0 1 1 0 0 +EDGE2 8357 5858 1.00844 -0.0356759 0.0124239 1 0 1 1 0 0 +EDGE2 8357 5878 1.03876 -0.0438051 0.0278551 1 0 1 1 0 0 +EDGE2 8357 5877 -0.00509555 0.0329855 -0.00312811 1 0 1 1 0 0 +EDGE2 8357 3057 -0.00968417 -0.026897 -0.0269164 1 0 1 1 0 0 +EDGE2 8357 5857 -0.0251177 -0.14691 -0.0127888 1 0 1 1 0 0 +EDGE2 8357 8356 -0.895946 0.0289358 -0.0111657 1 0 1 1 0 0 +EDGE2 8357 5856 -0.962524 -0.0360048 -0.0173083 1 0 1 1 0 0 +EDGE2 8357 5876 -1.0092 -0.0100442 0.0117263 1 0 1 1 0 0 +EDGE2 8357 3056 -0.997683 0.0196381 0.00194269 1 0 1 1 0 0 +EDGE2 8358 5859 1.00899 0.048405 -0.0334763 1 0 1 1 0 0 +EDGE2 8358 5879 1.04498 0.00647456 0.0233711 1 0 1 1 0 0 +EDGE2 8358 3059 0.880133 -0.0221063 -0.0133388 1 0 1 1 0 0 +EDGE2 8358 3058 -0.0750112 -0.00497134 0.0163077 1 0 1 1 0 0 +EDGE2 8358 5858 0.0308309 -0.0282612 0.00186476 1 0 1 1 0 0 +EDGE2 8358 5878 -0.0369614 -0.0678813 -0.0112113 1 0 1 1 0 0 +EDGE2 8358 5877 -1.07664 0.0111854 -0.0164359 1 0 1 1 0 0 +EDGE2 8358 8357 -1.03125 -0.0040641 -0.0353455 1 0 1 1 0 0 +EDGE2 8358 3057 -1.05466 -0.0644414 -0.0465858 1 0 1 1 0 0 +EDGE2 8358 5857 -0.909559 0.021725 -0.0062589 1 0 1 1 0 0 +EDGE2 8359 3060 0.96123 0.0382903 -0.0129605 1 0 1 1 0 0 +EDGE2 8359 3160 0.974469 0.0814619 -3.1475 1 0 1 1 0 0 +EDGE2 8359 5860 0.978885 -0.0366526 0.00102912 1 0 1 1 0 0 +EDGE2 8359 5880 0.943371 -0.0386481 0.00985189 1 0 1 1 0 0 +EDGE2 8359 3080 0.927189 0.00718515 -3.18998 1 0 1 1 0 0 +EDGE2 8359 1080 1.06595 -0.046778 -3.17143 1 0 1 1 0 0 +EDGE2 8359 5859 0.00637283 0.0114403 0.00315414 1 0 1 1 0 0 +EDGE2 8359 5879 -0.0510442 0.0685943 -0.012232 1 0 1 1 0 0 +EDGE2 8359 3059 -0.0333005 0.00817277 0.00504925 1 0 1 1 0 0 +EDGE2 8359 8358 -0.858077 -0.0697078 -0.02797 1 0 1 1 0 0 +EDGE2 8359 3058 -0.993405 -0.0499889 0.00718726 1 0 1 1 0 0 +EDGE2 8359 5858 -0.939192 0.0929881 0.0279696 1 0 1 1 0 0 +EDGE2 8359 5878 -1.01327 0.00723679 0.0102709 1 0 1 1 0 0 +EDGE2 8360 3079 1.00344 -0.0243739 -3.15087 1 0 1 1 0 0 +EDGE2 8360 3159 1.05096 0.0168403 -3.1284 1 0 1 1 0 0 +EDGE2 8360 1079 1.06428 0.00420741 -3.12355 1 0 1 1 0 0 +EDGE2 8360 3081 -0.00346154 -0.921559 -1.59611 1 0 1 1 0 0 +EDGE2 8360 3161 -0.0241538 -0.981422 -1.56922 1 0 1 1 0 0 +EDGE2 8360 5881 -0.0624179 -1.04233 -1.54624 1 0 1 1 0 0 +EDGE2 8360 3061 -0.00662078 -1.03971 -1.56566 1 0 1 1 0 0 +EDGE2 8360 3060 0.0298069 -0.0934244 0.00369895 1 0 1 1 0 0 +EDGE2 8360 3160 0.0672475 0.00552454 -3.14581 1 0 1 1 0 0 +EDGE2 8360 5860 0.0208315 -0.0950223 0.0187945 1 0 1 1 0 0 +EDGE2 8360 5880 -0.07768 -0.0166747 0.0420726 1 0 1 1 0 0 +EDGE2 8360 3080 0.0205906 -0.00979243 -3.13376 1 0 1 1 0 0 +EDGE2 8360 1080 0.00640517 -0.0246162 -3.11565 1 0 1 1 0 0 +EDGE2 8360 1081 -0.0363262 0.973675 1.61042 1 0 1 1 0 0 +EDGE2 8360 5861 -0.0711699 1.02579 1.57289 1 0 1 1 0 0 +EDGE2 8360 5859 -1.11884 -0.0660198 -0.0100763 1 0 1 1 0 0 +EDGE2 8360 5879 -1.03245 -0.0500429 -0.00784783 1 0 1 1 0 0 +EDGE2 8360 8359 -0.951719 0.0230065 -0.022809 1 0 1 1 0 0 +EDGE2 8360 3059 -1.01654 0.0280306 0.0147095 1 0 1 1 0 0 +EDGE2 8361 8360 -0.948935 -0.0409575 1.56224 1 0 1 1 0 0 +EDGE2 8361 3082 1.05009 0.0368091 0.00213906 1 0 1 1 0 0 +EDGE2 8361 3162 1.05267 -0.0193065 -0.00342268 1 0 1 1 0 0 +EDGE2 8361 5882 0.966903 0.0129328 0.00447288 1 0 1 1 0 0 +EDGE2 8361 3062 1.02508 0.0115709 0.016656 1 0 1 1 0 0 +EDGE2 8361 3081 -0.0445139 0.0302517 0.00428872 1 0 1 1 0 0 +EDGE2 8361 3161 0.0173461 0.0723755 -0.0206553 1 0 1 1 0 0 +EDGE2 8361 5881 0.022966 -0.0168941 -0.00753164 1 0 1 1 0 0 +EDGE2 8361 3061 0.0340495 -0.0332258 -0.0186316 1 0 1 1 0 0 +EDGE2 8361 3060 -0.867634 0.0669599 1.57841 1 0 1 1 0 0 +EDGE2 8361 3160 -0.973133 0.0277637 -1.57799 1 0 1 1 0 0 +EDGE2 8361 5860 -1.0834 -0.0508176 1.53212 1 0 1 1 0 0 +EDGE2 8361 5880 -1.00406 -0.0442579 1.57053 1 0 1 1 0 0 +EDGE2 8361 3080 -0.961108 -0.00894358 -1.56005 1 0 1 1 0 0 +EDGE2 8361 1080 -0.964247 -0.00309066 -1.56955 1 0 1 1 0 0 +EDGE2 8362 3083 1.06186 0.013665 -0.0110525 1 0 1 1 0 0 +EDGE2 8362 3163 1.01026 0.0719865 0.0610941 1 0 1 1 0 0 +EDGE2 8362 5883 0.971012 -0.0267049 0.0152942 1 0 1 1 0 0 +EDGE2 8362 3063 1.00804 -0.00256671 -0.0157866 1 0 1 1 0 0 +EDGE2 8362 3082 0.0037228 0.0641659 -0.0435776 1 0 1 1 0 0 +EDGE2 8362 3162 -0.0136154 0.0120505 -0.0211345 1 0 1 1 0 0 +EDGE2 8362 5882 -0.0263777 0.0550672 0.0132726 1 0 1 1 0 0 +EDGE2 8362 3062 -0.00370079 0.0258113 0.0127268 1 0 1 1 0 0 +EDGE2 8362 8361 -1.00799 0.00564234 0.0156002 1 0 1 1 0 0 +EDGE2 8362 3081 -0.979528 0.0580985 -0.0254157 1 0 1 1 0 0 +EDGE2 8362 3161 -1.03181 0.0546613 -0.00118323 1 0 1 1 0 0 +EDGE2 8362 5881 -0.998859 0.00751679 -0.00514662 1 0 1 1 0 0 +EDGE2 8362 3061 -0.88301 -0.0419704 -0.00614184 1 0 1 1 0 0 +EDGE2 8363 3064 0.960936 -0.0507922 0.0145812 1 0 1 1 0 0 +EDGE2 8363 3164 0.969488 0.109309 0.000379516 1 0 1 1 0 0 +EDGE2 8363 5884 1.02159 -0.0465672 -0.0453088 1 0 1 1 0 0 +EDGE2 8363 3084 0.937429 0.0644956 -0.0306316 1 0 1 1 0 0 +EDGE2 8363 3083 0.0983464 0.00995207 -0.0197097 1 0 1 1 0 0 +EDGE2 8363 3163 0.0072796 -0.0105187 0.0286424 1 0 1 1 0 0 +EDGE2 8363 5883 -0.09258 0.0827895 0.0235548 1 0 1 1 0 0 +EDGE2 8363 3063 0.0242706 0.0469543 0.017293 1 0 1 1 0 0 +EDGE2 8363 8362 -1.05153 -0.0120179 0.0108657 1 0 1 1 0 0 +EDGE2 8363 3082 -1.00621 0.0436931 -0.0388398 1 0 1 1 0 0 +EDGE2 8363 3162 -0.976907 0.0422587 -0.0120935 1 0 1 1 0 0 +EDGE2 8363 5882 -0.972381 -0.0266282 -0.023573 1 0 1 1 0 0 +EDGE2 8363 3062 -1.05249 0.0376873 -0.00261131 1 0 1 1 0 0 +EDGE2 8364 3105 0.9823 0.09468 -3.15235 1 0 1 1 0 0 +EDGE2 8364 3485 1.08186 -0.0134979 -3.15196 1 0 1 1 0 0 +EDGE2 8364 5845 1.03711 0.0248295 -3.17392 1 0 1 1 0 0 +EDGE2 8364 5885 1.04157 -0.0171231 0.00938816 1 0 1 1 0 0 +EDGE2 8364 5825 0.982016 0.084249 -3.08616 1 0 1 1 0 0 +EDGE2 8364 3145 0.980252 -0.0860361 -3.16571 1 0 1 1 0 0 +EDGE2 8364 3165 0.941675 0.0533194 -0.00636664 1 0 1 1 0 0 +EDGE2 8364 3385 0.91028 -0.0845184 -3.16635 1 0 1 1 0 0 +EDGE2 8364 3125 0.979669 -0.0215459 -3.17151 1 0 1 1 0 0 +EDGE2 8364 1185 0.988475 -0.0180099 -3.14559 1 0 1 1 0 0 +EDGE2 8364 3065 0.910008 0.0162993 -0.00551151 1 0 1 1 0 0 +EDGE2 8364 3085 0.904436 0.0316895 0.0122023 1 0 1 1 0 0 +EDGE2 8364 1165 0.937446 0.0962993 -3.13749 1 0 1 1 0 0 +EDGE2 8364 3064 0.0100713 0.128239 0.00553831 1 0 1 1 0 0 +EDGE2 8364 3164 -0.0435665 0.0406291 0.000736719 1 0 1 1 0 0 +EDGE2 8364 5884 -0.111342 -0.0218738 0.0108543 1 0 1 1 0 0 +EDGE2 8364 3084 0.0230821 0.0676411 0.0287139 1 0 1 1 0 0 +EDGE2 8364 8363 -1.04685 -0.0268862 0.0136046 1 0 1 1 0 0 +EDGE2 8364 3083 -1.05774 0.0895436 0.00266362 1 0 1 1 0 0 +EDGE2 8364 3163 -0.861769 -0.00683727 -0.0144179 1 0 1 1 0 0 +EDGE2 8364 5883 -1.03305 0.0217901 0.0175587 1 0 1 1 0 0 +EDGE2 8364 3063 -0.922589 0.00137249 0.0393932 1 0 1 1 0 0 +EDGE2 8365 3146 0.060202 0.971162 1.56633 1 0 1 1 0 0 +EDGE2 8365 3386 -0.0785986 0.959516 1.58141 1 0 1 1 0 0 +EDGE2 8365 5886 -0.00787269 0.993204 1.57693 1 0 1 1 0 0 +EDGE2 8365 3066 -0.0416487 0.992335 1.55937 1 0 1 1 0 0 +EDGE2 8365 3144 1.04178 -0.00379803 -3.1303 1 0 1 1 0 0 +EDGE2 8365 3484 0.94384 0.103057 -3.1368 1 0 1 1 0 0 +EDGE2 8365 5824 0.968156 0.00290282 -3.16799 1 0 1 1 0 0 +EDGE2 8365 5844 0.998964 -0.0179187 -3.13288 1 0 1 1 0 0 +EDGE2 8365 3384 1.04598 -0.0650497 -3.1273 1 0 1 1 0 0 +EDGE2 8365 1184 0.974151 0.0201211 -3.14161 1 0 1 1 0 0 +EDGE2 8365 3104 0.989303 0.0857108 -3.17814 1 0 1 1 0 0 +EDGE2 8365 3124 0.970258 0.0351069 -3.15723 1 0 1 1 0 0 +EDGE2 8365 1164 0.968493 0.0420295 -3.16423 1 0 1 1 0 0 +EDGE2 8365 3166 -0.0288423 -1.08284 -1.55741 1 0 1 1 0 0 +EDGE2 8365 3105 -0.00150997 0.0210769 -3.14806 1 0 1 1 0 0 +EDGE2 8365 3485 -0.00809488 -0.042407 -3.13821 1 0 1 1 0 0 +EDGE2 8365 5845 -0.00780475 0.0357314 -3.1557 1 0 1 1 0 0 +EDGE2 8365 5885 0.0691255 0.0710438 -0.0645527 1 0 1 1 0 0 +EDGE2 8365 5825 -0.0427686 -0.0704206 -3.1361 1 0 1 1 0 0 +EDGE2 8365 3145 0.0438398 0.0765512 -3.13734 1 0 1 1 0 0 +EDGE2 8365 3165 0.00808329 0.0889539 0.00522607 1 0 1 1 0 0 +EDGE2 8365 3385 0.00201987 -0.0171066 -3.13729 1 0 1 1 0 0 +EDGE2 8365 3125 -0.0618322 0.0584497 -3.11343 1 0 1 1 0 0 +EDGE2 8365 1185 0.0123753 0.0170229 -3.13306 1 0 1 1 0 0 +EDGE2 8365 3065 -0.033651 0.0980071 0.0125513 1 0 1 1 0 0 +EDGE2 8365 3085 0.0094831 -0.0835472 0.02718 1 0 1 1 0 0 +EDGE2 8365 1165 -0.0583318 0.0545657 -3.16422 1 0 1 1 0 0 +EDGE2 8365 5826 0.000476004 -1.06532 -1.58458 1 0 1 1 0 0 +EDGE2 8365 5846 -0.0649247 -0.974559 -1.55722 1 0 1 1 0 0 +EDGE2 8365 3486 0.0396845 -1.01838 -1.59059 1 0 1 1 0 0 +EDGE2 8365 1166 -0.0283847 -1.00612 -1.58701 1 0 1 1 0 0 +EDGE2 8365 3086 0.0125482 -1.05683 -1.57892 1 0 1 1 0 0 +EDGE2 8365 3106 -0.0416894 -1.12551 -1.59279 1 0 1 1 0 0 +EDGE2 8365 3126 -0.0242734 -1.00436 -1.55966 1 0 1 1 0 0 +EDGE2 8365 1186 -0.0662879 -1.03614 -1.57064 1 0 1 1 0 0 +EDGE2 8365 3064 -0.947085 0.0176467 0.0176098 1 0 1 1 0 0 +EDGE2 8365 3164 -1.01113 0.00131755 -0.00672299 1 0 1 1 0 0 +EDGE2 8365 5884 -0.939048 -0.0371394 0.00895697 1 0 1 1 0 0 +EDGE2 8365 8364 -1.06047 0.012212 0.0262684 1 0 1 1 0 0 +EDGE2 8365 3084 -0.888647 -0.0149354 -0.00511329 1 0 1 1 0 0 +EDGE2 8366 3147 0.968208 -0.0733045 0.0126602 1 0 1 1 0 0 +EDGE2 8366 5887 1.04649 0.0115634 -0.0194502 1 0 1 1 0 0 +EDGE2 8366 3387 0.921888 -0.0106028 0.0051563 1 0 1 1 0 0 +EDGE2 8366 3067 0.982044 -0.001606 -0.00677339 1 0 1 1 0 0 +EDGE2 8366 3146 0.0204285 -0.0661794 0.00975276 1 0 1 1 0 0 +EDGE2 8366 3386 0.0666533 0.056182 0.00636953 1 0 1 1 0 0 +EDGE2 8366 5886 0.00881809 0.0371512 0.0153576 1 0 1 1 0 0 +EDGE2 8366 3066 -0.0127713 -0.0654988 -0.0316904 1 0 1 1 0 0 +EDGE2 8366 3105 -1.03338 0.0169455 1.59759 1 0 1 1 0 0 +EDGE2 8366 3485 -1.02606 0.0636591 1.57956 1 0 1 1 0 0 +EDGE2 8366 5845 -1.04175 -1.95537e-05 1.54475 1 0 1 1 0 0 +EDGE2 8366 5885 -0.951925 -0.0327463 -1.56609 1 0 1 1 0 0 +EDGE2 8366 8365 -1.02907 0.0183432 -1.57669 1 0 1 1 0 0 +EDGE2 8366 5825 -0.923971 -0.0385715 1.57151 1 0 1 1 0 0 +EDGE2 8366 3145 -0.98212 -0.0885231 1.59189 1 0 1 1 0 0 +EDGE2 8366 3165 -0.998988 -0.0636465 -1.59179 1 0 1 1 0 0 +EDGE2 8366 3385 -0.829953 0.00685682 1.56874 1 0 1 1 0 0 +EDGE2 8366 3125 -1.05334 0.0446135 1.59742 1 0 1 1 0 0 +EDGE2 8366 1185 -1.01506 0.0164292 1.58966 1 0 1 1 0 0 +EDGE2 8366 3065 -0.930767 -0.0131103 -1.57934 1 0 1 1 0 0 +EDGE2 8366 3085 -0.916145 0.0294138 -1.5902 1 0 1 1 0 0 +EDGE2 8366 1165 -1.00545 -0.0465997 1.60117 1 0 1 1 0 0 +EDGE2 8367 8366 -0.969396 -0.0288771 0.000638175 1 0 1 1 0 0 +EDGE2 8367 5888 0.964469 0.00868499 -0.00957197 1 0 1 1 0 0 +EDGE2 8367 3068 0.905052 0.037747 0.0130307 1 0 1 1 0 0 +EDGE2 8367 3148 0.982623 0.0603404 -0.0110758 1 0 1 1 0 0 +EDGE2 8367 3388 0.931265 0.0449331 -0.00548815 1 0 1 1 0 0 +EDGE2 8367 3147 -0.0258832 0.100352 -0.00953199 1 0 1 1 0 0 +EDGE2 8367 5887 -0.0123909 0.0242438 -0.00151144 1 0 1 1 0 0 +EDGE2 8367 3387 -0.0482362 0.0516723 0.00197583 1 0 1 1 0 0 +EDGE2 8367 3067 0.00535653 -0.00409862 0.00342775 1 0 1 1 0 0 +EDGE2 8367 3146 -0.963752 -0.0256356 -0.0113464 1 0 1 1 0 0 +EDGE2 8367 3386 -0.969408 0.0461552 -0.0304976 1 0 1 1 0 0 +EDGE2 8367 5886 -0.941607 0.0787203 -0.0310124 1 0 1 1 0 0 +EDGE2 8367 3066 -0.980575 0.0403886 0.00524959 1 0 1 1 0 0 +EDGE2 8368 5889 0.980821 -0.0689507 0.00599267 1 0 1 1 0 0 +EDGE2 8368 3149 0.926365 0.116306 0.00134381 1 0 1 1 0 0 +EDGE2 8368 3389 1.07704 0.0855227 -0.00701873 1 0 1 1 0 0 +EDGE2 8368 3069 0.992377 0.0121967 -0.0170227 1 0 1 1 0 0 +EDGE2 8368 5888 0.0329139 -0.0129702 -0.019959 1 0 1 1 0 0 +EDGE2 8368 3068 0.0465655 -0.0384647 0.0209278 1 0 1 1 0 0 +EDGE2 8368 3148 0.0158874 -0.0765245 -0.00971728 1 0 1 1 0 0 +EDGE2 8368 3388 -0.0269842 -0.00795409 -0.00402658 1 0 1 1 0 0 +EDGE2 8368 3147 -0.994475 0.0240222 0.0277975 1 0 1 1 0 0 +EDGE2 8368 5887 -1.05304 -0.0366555 -0.00415508 1 0 1 1 0 0 +EDGE2 8368 8367 -1.03688 -0.0453639 -0.00733157 1 0 1 1 0 0 +EDGE2 8368 3387 -0.999844 -0.0739508 -0.015795 1 0 1 1 0 0 +EDGE2 8368 3067 -1.10781 -0.0407386 0.0115255 1 0 1 1 0 0 +EDGE2 8369 3070 0.999 -0.0163623 -0.0027565 1 0 1 1 0 0 +EDGE2 8369 3390 1.03118 0.0502577 0.0185189 1 0 1 1 0 0 +EDGE2 8369 3410 0.999028 -0.0152333 -3.12431 1 0 1 1 0 0 +EDGE2 8369 5890 0.99726 -0.0504563 -0.055681 1 0 1 1 0 0 +EDGE2 8369 3150 1.01934 -0.0270941 0.0028302 1 0 1 1 0 0 +EDGE2 8369 5889 -0.0186162 -0.0293696 0.00639333 1 0 1 1 0 0 +EDGE2 8369 3149 0.109186 0.00784175 0.00849674 1 0 1 1 0 0 +EDGE2 8369 3389 -0.019378 -0.180167 -0.00543886 1 0 1 1 0 0 +EDGE2 8369 3069 -0.0950387 0.0548105 0.0147793 1 0 1 1 0 0 +EDGE2 8369 5888 -0.923967 0.0765383 -0.010634 1 0 1 1 0 0 +EDGE2 8369 8368 -0.957848 -0.0381793 -0.00906802 1 0 1 1 0 0 +EDGE2 8369 3068 -0.984859 0.0481013 -0.00152939 1 0 1 1 0 0 +EDGE2 8369 3148 -0.98925 0.0129531 -0.0080632 1 0 1 1 0 0 +EDGE2 8369 3388 -1.03957 0.0210243 0.0109309 1 0 1 1 0 0 +EDGE2 8370 3409 1.00096 -0.0407774 -3.12471 1 0 1 1 0 0 +EDGE2 8370 3411 0.034528 -1.00422 -1.54032 1 0 1 1 0 0 +EDGE2 8370 5891 -0.0139296 -1.01327 -1.5422 1 0 1 1 0 0 +EDGE2 8370 3391 0.0376012 -1.02675 -1.60767 1 0 1 1 0 0 +EDGE2 8370 3070 -0.141701 0.0643739 -0.0368344 1 0 1 1 0 0 +EDGE2 8370 3390 -0.0742186 -0.0334035 0.0206429 1 0 1 1 0 0 +EDGE2 8370 3410 -0.015944 0.0307166 -3.13744 1 0 1 1 0 0 +EDGE2 8370 5890 -0.0196362 -0.0876342 -0.0191562 1 0 1 1 0 0 +EDGE2 8370 3150 -0.0396578 -0.000816322 0.0090306 1 0 1 1 0 0 +EDGE2 8370 5889 -1.04637 -0.0309179 -0.0198014 1 0 1 1 0 0 +EDGE2 8370 8369 -0.981256 0.0781684 0.0149265 1 0 1 1 0 0 +EDGE2 8370 3149 -1.08553 -0.0345952 0.00694332 1 0 1 1 0 0 +EDGE2 8370 3389 -0.972657 -0.0100103 0.00587407 1 0 1 1 0 0 +EDGE2 8370 3069 -0.961294 0.0496305 0.0122777 1 0 1 1 0 0 +EDGE2 8370 3151 -0.00965765 0.999059 1.5644 1 0 1 1 0 0 +EDGE2 8370 3071 0.0425415 1.03831 1.53541 1 0 1 1 0 0 +EDGE2 8371 8370 -0.971439 0.000795609 -1.5969 1 0 1 1 0 0 +EDGE2 8371 3070 -1.04563 0.0276392 -1.60907 1 0 1 1 0 0 +EDGE2 8371 3390 -1.00019 0.00118845 -1.57979 1 0 1 1 0 0 +EDGE2 8371 3410 -1.00788 -0.0339629 1.55065 1 0 1 1 0 0 +EDGE2 8371 5890 -0.977724 0.0366724 -1.58002 1 0 1 1 0 0 +EDGE2 8371 3150 -1.07781 -0.0621672 -1.58983 1 0 1 1 0 0 +EDGE2 8371 3072 1.03701 0.00874824 0.00694282 1 0 1 1 0 0 +EDGE2 8371 3151 -0.0136816 -0.0140083 0.0145195 1 0 1 1 0 0 +EDGE2 8371 3071 0.0864168 3.17573e-05 -0.00421422 1 0 1 1 0 0 +EDGE2 8371 3152 1.05535 -0.0611482 -0.0113903 1 0 1 1 0 0 +EDGE2 8372 3072 0.0710648 -0.0144442 -0.0157011 1 0 1 1 0 0 +EDGE2 8372 3151 -0.986855 -0.0203287 0.00328293 1 0 1 1 0 0 +EDGE2 8372 8371 -0.997635 0.0681968 0.000262116 1 0 1 1 0 0 +EDGE2 8372 3071 -1.07662 0.0144876 -0.0123254 1 0 1 1 0 0 +EDGE2 8372 3152 0.0127461 -0.0485162 -0.0104188 1 0 1 1 0 0 +EDGE2 8372 3153 1.00137 0.0427952 0.0287036 1 0 1 1 0 0 +EDGE2 8372 3073 0.952037 0.0384966 0.03048 1 0 1 1 0 0 +EDGE2 8373 3072 -1.08856 0.0311329 -0.0348184 1 0 1 1 0 0 +EDGE2 8373 8372 -0.940824 -0.0201887 0.0051723 1 0 1 1 0 0 +EDGE2 8373 3152 -1.1081 0.0197607 0.0167574 1 0 1 1 0 0 +EDGE2 8373 3153 0.0830241 0.0283571 -0.0100862 1 0 1 1 0 0 +EDGE2 8373 3073 0.0467026 0.0138559 -0.00308091 1 0 1 1 0 0 +EDGE2 8373 3074 0.959167 0.0811737 0.0045789 1 0 1 1 0 0 +EDGE2 8373 3154 0.958834 0.0275593 0.016485 1 0 1 1 0 0 +EDGE2 8374 3153 -0.993406 0.00521496 -0.0155757 1 0 1 1 0 0 +EDGE2 8374 8373 -1.09893 -0.0986277 -0.00611893 1 0 1 1 0 0 +EDGE2 8374 3073 -1.0517 0.076525 0.0176337 1 0 1 1 0 0 +EDGE2 8374 1075 0.951413 0.0831981 -3.15044 1 0 1 1 0 0 +EDGE2 8374 3074 -0.00299306 -0.0618258 -0.028863 1 0 1 1 0 0 +EDGE2 8374 3154 0.0338993 0.0192182 -0.0222357 1 0 1 1 0 0 +EDGE2 8374 3155 1.03596 0.0256278 -0.00122062 1 0 1 1 0 0 +EDGE2 8374 3075 0.998324 0.0628143 -0.0271655 1 0 1 1 0 0 +EDGE2 8374 995 1.03124 0.0579976 -3.18393 1 0 1 1 0 0 +EDGE2 8374 1015 1.05954 0.0117634 -3.12188 1 0 1 1 0 0 +EDGE2 8374 1055 1.02136 -0.00697623 -3.16012 1 0 1 1 0 0 +EDGE2 8375 1016 -0.0268821 -0.941581 -1.56205 1 0 1 1 0 0 +EDGE2 8375 1056 0.0190941 -1.02726 -1.55527 1 0 1 1 0 0 +EDGE2 8375 996 0.0215202 -1.01437 -1.60311 1 0 1 1 0 0 +EDGE2 8375 8374 -0.962488 -0.0501018 -0.00520363 1 0 1 1 0 0 +EDGE2 8375 1075 -0.0386171 -0.112252 -3.11434 1 0 1 1 0 0 +EDGE2 8375 3074 -0.907128 -0.00601845 0.0379843 1 0 1 1 0 0 +EDGE2 8375 3154 -0.947482 0.0195779 -0.00110914 1 0 1 1 0 0 +EDGE2 8375 3155 0.0039299 0.0318113 0.00383448 1 0 1 1 0 0 +EDGE2 8375 3075 0.0034783 -0.0989351 -0.0195113 1 0 1 1 0 0 +EDGE2 8375 1074 0.923625 0.00412257 -3.15232 1 0 1 1 0 0 +EDGE2 8375 995 0.0178054 -0.0264284 -3.13797 1 0 1 1 0 0 +EDGE2 8375 1015 0.0125726 0.00707565 -3.14629 1 0 1 1 0 0 +EDGE2 8375 1055 0.080459 -0.0617009 -3.15913 1 0 1 1 0 0 +EDGE2 8375 1014 1.12181 0.0357268 -3.11145 1 0 1 1 0 0 +EDGE2 8375 1054 0.960458 0.00171702 -3.13584 1 0 1 1 0 0 +EDGE2 8375 994 1.04825 -0.00526683 -3.1631 1 0 1 1 0 0 +EDGE2 8375 3156 0.0646842 1.1236 1.54644 1 0 1 1 0 0 +EDGE2 8375 1076 -0.0253321 1.0227 1.57397 1 0 1 1 0 0 +EDGE2 8375 3076 -0.0446487 0.969148 1.56922 1 0 1 1 0 0 +EDGE2 8376 1075 -1.00317 -0.0513727 1.55557 1 0 1 1 0 0 +EDGE2 8376 3155 -0.996459 -0.00403081 -1.55726 1 0 1 1 0 0 +EDGE2 8376 8375 -0.8981 -0.0459212 -1.5391 1 0 1 1 0 0 +EDGE2 8376 3075 -1.0006 -0.0368307 -1.57586 1 0 1 1 0 0 +EDGE2 8376 995 -1.02292 -0.0331116 1.58875 1 0 1 1 0 0 +EDGE2 8376 1015 -1.0047 0.051865 1.52802 1 0 1 1 0 0 +EDGE2 8376 1055 -1.01858 -0.0129221 1.57393 1 0 1 1 0 0 +EDGE2 8376 3156 -0.0240537 0.0365096 -0.0221674 1 0 1 1 0 0 +EDGE2 8376 1076 0.0632261 0.046509 -0.0421871 1 0 1 1 0 0 +EDGE2 8376 3076 -0.0530174 0.0146357 -0.00581764 1 0 1 1 0 0 +EDGE2 8376 3077 0.976586 -0.0538604 -0.0132987 1 0 1 1 0 0 +EDGE2 8376 3157 0.997154 -0.0552041 0.0262191 1 0 1 1 0 0 +EDGE2 8376 1077 0.987911 -0.0259035 0.00952225 1 0 1 1 0 0 +EDGE2 8377 3078 0.951304 0.0074857 -0.00942838 1 0 1 1 0 0 +EDGE2 8377 3156 -1.02359 -0.0066523 0.0175951 1 0 1 1 0 0 +EDGE2 8377 8376 -0.919996 0.0541242 0.00587584 1 0 1 1 0 0 +EDGE2 8377 1076 -1.02261 0.0860701 0.00188703 1 0 1 1 0 0 +EDGE2 8377 3076 -1.0464 0.0708955 -0.00719257 1 0 1 1 0 0 +EDGE2 8377 3077 -0.0213766 -0.0484353 0.0442526 1 0 1 1 0 0 +EDGE2 8377 3157 -0.0487476 -0.0387514 -0.057458 1 0 1 1 0 0 +EDGE2 8377 1077 -0.0342758 0.0357091 -0.0339406 1 0 1 1 0 0 +EDGE2 8377 3158 0.918024 0.00758473 0.0339452 1 0 1 1 0 0 +EDGE2 8377 1078 1.00602 0.000632238 0.00754008 1 0 1 1 0 0 +EDGE2 8378 3078 -0.0200137 0.0234962 -0.00530616 1 0 1 1 0 0 +EDGE2 8378 3077 -0.974702 -0.0179912 0.00848501 1 0 1 1 0 0 +EDGE2 8378 3157 -0.935393 0.00704792 0.0235536 1 0 1 1 0 0 +EDGE2 8378 8377 -0.995309 0.0176207 0.000548129 1 0 1 1 0 0 +EDGE2 8378 1077 -1.00926 0.0899931 -0.00326191 1 0 1 1 0 0 +EDGE2 8378 3158 -0.00621703 0.0105963 -0.00636919 1 0 1 1 0 0 +EDGE2 8378 1078 0.000693676 -0.0289623 -0.0193111 1 0 1 1 0 0 +EDGE2 8378 3079 1.08441 -0.0256141 0.0275253 1 0 1 1 0 0 +EDGE2 8378 3159 0.972607 0.0728758 0.00520461 1 0 1 1 0 0 +EDGE2 8378 1079 0.998837 0.0197363 0.0199059 1 0 1 1 0 0 +EDGE2 8379 8360 1.02207 -0.0783783 -3.16458 1 0 1 1 0 0 +EDGE2 8379 3078 -1.00976 -0.00560395 0.00549705 1 0 1 1 0 0 +EDGE2 8379 8378 -0.881983 0.00924 -0.0110577 1 0 1 1 0 0 +EDGE2 8379 3158 -0.987385 -0.0681854 -0.0181387 1 0 1 1 0 0 +EDGE2 8379 1078 -1.11517 0.0517847 -0.00445577 1 0 1 1 0 0 +EDGE2 8379 3079 0.053798 0.0536419 -0.024722 1 0 1 1 0 0 +EDGE2 8379 3159 -0.0640472 -0.0694965 -0.014545 1 0 1 1 0 0 +EDGE2 8379 1079 -0.0399738 0.0581268 -0.0153121 1 0 1 1 0 0 +EDGE2 8379 3060 0.971285 -0.0294963 -3.17258 1 0 1 1 0 0 +EDGE2 8379 3160 1.01915 -0.0074813 0.00898697 1 0 1 1 0 0 +EDGE2 8379 5860 0.953563 -0.00999382 -3.1168 1 0 1 1 0 0 +EDGE2 8379 5880 1.07433 0.0215132 -3.12478 1 0 1 1 0 0 +EDGE2 8379 3080 0.95137 0.0329687 -0.00549904 1 0 1 1 0 0 +EDGE2 8379 1080 1.07214 -0.00329597 -0.0230253 1 0 1 1 0 0 +EDGE2 8380 8360 -0.0176057 0.0616172 -3.11405 1 0 1 1 0 0 +EDGE2 8380 8379 -0.979811 -0.0250241 0.0149522 1 0 1 1 0 0 +EDGE2 8380 3079 -1.01856 0.0495375 0.0437862 1 0 1 1 0 0 +EDGE2 8380 3159 -1.01168 0.00285736 -0.0022636 1 0 1 1 0 0 +EDGE2 8380 1079 -1.08672 0.00961142 -0.000357199 1 0 1 1 0 0 +EDGE2 8380 8361 0.0262997 0.981645 1.57551 1 0 1 1 0 0 +EDGE2 8380 3081 0.0275187 1.04306 1.59638 1 0 1 1 0 0 +EDGE2 8380 3161 0.0528153 0.978911 1.52982 1 0 1 1 0 0 +EDGE2 8380 5881 -0.0330245 1.03526 1.57581 1 0 1 1 0 0 +EDGE2 8380 3061 -0.0188203 0.987228 1.57471 1 0 1 1 0 0 +EDGE2 8380 3060 -0.0528533 -0.0362052 -3.15031 1 0 1 1 0 0 +EDGE2 8380 3160 -0.0351407 -0.00396333 -0.00877516 1 0 1 1 0 0 +EDGE2 8380 5860 -0.00650324 -0.042931 -3.1565 1 0 1 1 0 0 +EDGE2 8380 5880 0.0470553 -0.0411224 -3.1292 1 0 1 1 0 0 +EDGE2 8380 3080 -0.0607867 0.0480479 0.0153607 1 0 1 1 0 0 +EDGE2 8380 1080 -0.103709 -0.0172188 0.0121843 1 0 1 1 0 0 +EDGE2 8380 1081 -0.0522345 -1.04621 -1.57051 1 0 1 1 0 0 +EDGE2 8380 5861 0.0522086 -0.956086 -1.53391 1 0 1 1 0 0 +EDGE2 8380 5859 0.914765 0.0568291 -3.17285 1 0 1 1 0 0 +EDGE2 8380 5879 1.12371 0.0781161 -3.15767 1 0 1 1 0 0 +EDGE2 8380 8359 1.01353 0.00688701 -3.16232 1 0 1 1 0 0 +EDGE2 8380 3059 1.01405 0.0020972 -3.11178 1 0 1 1 0 0 +EDGE2 8381 8360 -0.919703 0.00719748 1.53808 1 0 1 1 0 0 +EDGE2 8381 8362 0.994138 0.0920136 -0.0122539 1 0 1 1 0 0 +EDGE2 8381 3082 1.02511 -0.133549 0.00694807 1 0 1 1 0 0 +EDGE2 8381 3162 1.03155 0.0405622 0.0253418 1 0 1 1 0 0 +EDGE2 8381 5882 1.08235 -0.0887232 -0.0389292 1 0 1 1 0 0 +EDGE2 8381 3062 0.970857 -0.0359301 0.00546304 1 0 1 1 0 0 +EDGE2 8381 8361 -0.00934201 0.0289893 -0.0175099 1 0 1 1 0 0 +EDGE2 8381 3081 -0.0621729 -0.112957 -0.0300075 1 0 1 1 0 0 +EDGE2 8381 3161 0.0277607 -0.0886474 0.0113715 1 0 1 1 0 0 +EDGE2 8381 5881 -0.0496401 -0.0035331 -0.029907 1 0 1 1 0 0 +EDGE2 8381 3061 -0.0180393 0.058052 -0.00113958 1 0 1 1 0 0 +EDGE2 8381 8380 -0.917033 0.0441233 -1.57455 1 0 1 1 0 0 +EDGE2 8381 3060 -1.01994 -0.0652554 1.57179 1 0 1 1 0 0 +EDGE2 8381 3160 -0.99977 0.0298887 -1.5616 1 0 1 1 0 0 +EDGE2 8381 5860 -1.03654 -0.0180155 1.55091 1 0 1 1 0 0 +EDGE2 8381 5880 -0.953267 -0.0345495 1.58262 1 0 1 1 0 0 +EDGE2 8381 3080 -0.998313 -0.00232886 -1.58457 1 0 1 1 0 0 +EDGE2 8381 1080 -1.03867 -0.00134402 -1.53925 1 0 1 1 0 0 +EDGE2 8382 8363 1.06128 0.0992337 0.0108591 1 0 1 1 0 0 +EDGE2 8382 3083 1.01046 0.0223286 0.0235829 1 0 1 1 0 0 +EDGE2 8382 3163 1.0675 -0.0373774 -0.0220883 1 0 1 1 0 0 +EDGE2 8382 5883 1.03161 0.0125618 -0.0173581 1 0 1 1 0 0 +EDGE2 8382 3063 0.947865 -0.0588583 -0.00894151 1 0 1 1 0 0 +EDGE2 8382 8362 0.0327109 0.0861455 -0.00154151 1 0 1 1 0 0 +EDGE2 8382 3082 -0.0022731 -0.0539905 0.0236412 1 0 1 1 0 0 +EDGE2 8382 3162 -0.0186851 -0.00129655 0.00187409 1 0 1 1 0 0 +EDGE2 8382 5882 -0.00406216 -0.0737181 0.00407331 1 0 1 1 0 0 +EDGE2 8382 3062 -0.0578929 0.0434534 0.00514888 1 0 1 1 0 0 +EDGE2 8382 8361 -0.985594 0.122847 -0.0095414 1 0 1 1 0 0 +EDGE2 8382 8381 -0.937735 0.0118176 0.000599667 1 0 1 1 0 0 +EDGE2 8382 3081 -0.988354 -0.012998 0.0209286 1 0 1 1 0 0 +EDGE2 8382 3161 -1.1817 -0.0968104 -0.0262531 1 0 1 1 0 0 +EDGE2 8382 5881 -1.04596 -0.0834344 0.00943718 1 0 1 1 0 0 +EDGE2 8382 3061 -0.975435 -0.0107779 -0.0024087 1 0 1 1 0 0 +EDGE2 8383 3064 0.927917 -0.0371637 -0.0112678 1 0 1 1 0 0 +EDGE2 8383 3164 0.993279 -0.0264326 -0.00882874 1 0 1 1 0 0 +EDGE2 8383 5884 0.882987 0.0920413 0.0100895 1 0 1 1 0 0 +EDGE2 8383 8364 1.0563 0.00620733 -0.00407965 1 0 1 1 0 0 +EDGE2 8383 3084 0.890828 -0.0195784 -0.00703987 1 0 1 1 0 0 +EDGE2 8383 8363 0.00617933 -0.0449126 -0.00699943 1 0 1 1 0 0 +EDGE2 8383 3083 -0.0430439 -0.0301082 0.0406981 1 0 1 1 0 0 +EDGE2 8383 3163 -0.0746531 0.0356696 0.00952364 1 0 1 1 0 0 +EDGE2 8383 5883 0.0115747 0.0240693 -0.0368292 1 0 1 1 0 0 +EDGE2 8383 3063 -0.0135809 -0.0254505 0.00439611 1 0 1 1 0 0 +EDGE2 8383 8362 -1.01152 0.0181891 -0.0158725 1 0 1 1 0 0 +EDGE2 8383 8382 -0.915233 0.0647363 -0.00217886 1 0 1 1 0 0 +EDGE2 8383 3082 -1.00004 0.0385197 -0.0315765 1 0 1 1 0 0 +EDGE2 8383 3162 -1.08762 0.0634215 -0.0125607 1 0 1 1 0 0 +EDGE2 8383 5882 -1.00439 0.00740063 0.00264451 1 0 1 1 0 0 +EDGE2 8383 3062 -0.968078 -0.0943244 -0.00108769 1 0 1 1 0 0 +EDGE2 8384 3105 0.925234 0.0689648 -3.13184 1 0 1 1 0 0 +EDGE2 8384 3485 0.971544 -0.0531197 -3.09197 1 0 1 1 0 0 +EDGE2 8384 5845 0.947939 0.0291598 -3.16378 1 0 1 1 0 0 +EDGE2 8384 5885 1.06857 -0.127068 -0.0394904 1 0 1 1 0 0 +EDGE2 8384 8365 1.03705 -0.00908587 0.00349937 1 0 1 1 0 0 +EDGE2 8384 5825 1.0009 0.034749 -3.11882 1 0 1 1 0 0 +EDGE2 8384 3145 1.0579 0.0349837 -3.16629 1 0 1 1 0 0 +EDGE2 8384 3165 1.00096 0.0543451 0.0239962 1 0 1 1 0 0 +EDGE2 8384 3385 1.07864 0.00946353 -3.15942 1 0 1 1 0 0 +EDGE2 8384 3125 1.03002 0.00169864 -3.13188 1 0 1 1 0 0 +EDGE2 8384 1185 0.947804 -0.0293471 -3.15397 1 0 1 1 0 0 +EDGE2 8384 3065 1.01882 -0.00330732 -0.0249259 1 0 1 1 0 0 +EDGE2 8384 3085 0.97469 0.00844589 0.000479658 1 0 1 1 0 0 +EDGE2 8384 1165 1.0092 0.0263209 -3.1365 1 0 1 1 0 0 +EDGE2 8384 3064 0.0798132 0.0758254 -0.0119389 1 0 1 1 0 0 +EDGE2 8384 3164 0.0334757 0.070482 0.0127712 1 0 1 1 0 0 +EDGE2 8384 5884 0.038782 0.00562686 -0.0077368 1 0 1 1 0 0 +EDGE2 8384 8364 0.0673608 0.00354234 -0.0243048 1 0 1 1 0 0 +EDGE2 8384 3084 0.0181362 -0.0147925 0.00630019 1 0 1 1 0 0 +EDGE2 8384 8363 -1.08361 -0.00535402 0.00189742 1 0 1 1 0 0 +EDGE2 8384 8383 -1.0772 -0.0315528 0.00679619 1 0 1 1 0 0 +EDGE2 8384 3083 -0.911186 -0.0617653 0.0234064 1 0 1 1 0 0 +EDGE2 8384 3163 -1.01347 -0.00634966 -0.0331188 1 0 1 1 0 0 +EDGE2 8384 5883 -1.00393 0.0753501 -0.00244764 1 0 1 1 0 0 +EDGE2 8384 3063 -0.986919 -0.0787053 -0.00601768 1 0 1 1 0 0 +EDGE2 8385 8366 -0.00309955 0.957329 1.5739 1 0 1 1 0 0 +EDGE2 8385 3146 -0.0540367 0.943853 1.57484 1 0 1 1 0 0 +EDGE2 8385 3386 0.016388 1.00569 1.55025 1 0 1 1 0 0 +EDGE2 8385 5886 -0.0775851 1.02112 1.59407 1 0 1 1 0 0 +EDGE2 8385 3066 -0.0408203 1.05127 1.55714 1 0 1 1 0 0 +EDGE2 8385 3144 1.06073 -0.0407544 -3.153 1 0 1 1 0 0 +EDGE2 8385 3484 1.08271 0.00750306 -3.1588 1 0 1 1 0 0 +EDGE2 8385 5824 1.03644 -0.07077 -3.13157 1 0 1 1 0 0 +EDGE2 8385 5844 0.994916 0.0658055 -3.12392 1 0 1 1 0 0 +EDGE2 8385 3384 0.992925 -0.0835143 -3.14751 1 0 1 1 0 0 +EDGE2 8385 1184 0.994443 -0.0703521 -3.15785 1 0 1 1 0 0 +EDGE2 8385 3104 0.964662 0.0169244 -3.13286 1 0 1 1 0 0 +EDGE2 8385 3124 1.04303 0.0367515 -3.16235 1 0 1 1 0 0 +EDGE2 8385 1164 0.942707 0.0453672 -3.14519 1 0 1 1 0 0 +EDGE2 8385 3166 0.0460184 -1.04706 -1.56613 1 0 1 1 0 0 +EDGE2 8385 3105 -0.11568 0.0432498 -3.13028 1 0 1 1 0 0 +EDGE2 8385 3485 -0.0470402 -0.00141859 -3.15793 1 0 1 1 0 0 +EDGE2 8385 5845 -0.0747098 0.0206871 -3.09682 1 0 1 1 0 0 +EDGE2 8385 5885 -0.127052 -0.00429426 -0.0251194 1 0 1 1 0 0 +EDGE2 8385 8365 -0.0439569 0.13111 0.0130645 1 0 1 1 0 0 +EDGE2 8385 5825 0.00216103 0.0163479 -3.13697 1 0 1 1 0 0 +EDGE2 8385 3145 0.0493556 0.103096 -3.15879 1 0 1 1 0 0 +EDGE2 8385 3165 -0.128087 -0.0191375 0.0103179 1 0 1 1 0 0 +EDGE2 8385 3385 -0.0337681 -0.0257814 -3.1168 1 0 1 1 0 0 +EDGE2 8385 3125 0.0166513 0.0577079 -3.13204 1 0 1 1 0 0 +EDGE2 8385 1185 -0.0119265 -0.0149111 -3.17534 1 0 1 1 0 0 +EDGE2 8385 3065 0.0342414 0.0332217 -0.0358709 1 0 1 1 0 0 +EDGE2 8385 3085 0.0167765 -0.0038314 0.00984239 1 0 1 1 0 0 +EDGE2 8385 1165 0.0188818 -0.0284886 -3.14214 1 0 1 1 0 0 +EDGE2 8385 5826 0.0343564 -1.01564 -1.61992 1 0 1 1 0 0 +EDGE2 8385 5846 0.0528645 -1.02046 -1.57456 1 0 1 1 0 0 +EDGE2 8385 3486 0.0198538 -0.985062 -1.56345 1 0 1 1 0 0 +EDGE2 8385 1166 -0.0147231 -0.956949 -1.5736 1 0 1 1 0 0 +EDGE2 8385 3086 -0.0233411 -1.00063 -1.57921 1 0 1 1 0 0 +EDGE2 8385 3106 -0.0350128 -0.914396 -1.53511 1 0 1 1 0 0 +EDGE2 8385 3126 -0.0570169 -0.99181 -1.59682 1 0 1 1 0 0 +EDGE2 8385 1186 -0.0466359 -1.0036 -1.57703 1 0 1 1 0 0 +EDGE2 8385 3064 -0.970537 -0.0313414 -0.0167615 1 0 1 1 0 0 +EDGE2 8385 8384 -1.0903 -0.0438546 -0.0156204 1 0 1 1 0 0 +EDGE2 8385 3164 -0.914896 -0.0784854 0.00545535 1 0 1 1 0 0 +EDGE2 8385 5884 -1.00834 -0.0270511 -0.0275491 1 0 1 1 0 0 +EDGE2 8385 8364 -1.09144 -0.0199826 0.00784037 1 0 1 1 0 0 +EDGE2 8385 3084 -0.947026 0.138297 0.0520089 1 0 1 1 0 0 +EDGE2 8386 8385 -0.971319 -0.0356481 1.57178 1 0 1 1 0 0 +EDGE2 8386 3166 0.0274315 0.00861304 0.015899 1 0 1 1 0 0 +EDGE2 8386 3105 -1.00834 0.0210729 -1.5723 1 0 1 1 0 0 +EDGE2 8386 3485 -0.969835 0.0194187 -1.54619 1 0 1 1 0 0 +EDGE2 8386 5845 -0.943335 -0.150826 -1.56878 1 0 1 1 0 0 +EDGE2 8386 5885 -1.05653 0.0371091 1.597 1 0 1 1 0 0 +EDGE2 8386 8365 -1.06112 -0.0177324 1.54742 1 0 1 1 0 0 +EDGE2 8386 5825 -1.06825 -0.097684 -1.579 1 0 1 1 0 0 +EDGE2 8386 3145 -0.997703 0.0431102 -1.56942 1 0 1 1 0 0 +EDGE2 8386 3165 -0.925406 0.0536024 1.61697 1 0 1 1 0 0 +EDGE2 8386 3385 -0.965748 -0.0659535 -1.56155 1 0 1 1 0 0 +EDGE2 8386 3125 -1.04447 -0.0575942 -1.59026 1 0 1 1 0 0 +EDGE2 8386 1185 -0.92646 0.0117204 -1.59546 1 0 1 1 0 0 +EDGE2 8386 3065 -0.914447 0.0294069 1.56214 1 0 1 1 0 0 +EDGE2 8386 3085 -0.996059 -0.0474151 1.56283 1 0 1 1 0 0 +EDGE2 8386 1165 -1.00447 0.031987 -1.58565 1 0 1 1 0 0 +EDGE2 8386 5826 0.0355601 0.00435899 0.0263478 1 0 1 1 0 0 +EDGE2 8386 5846 0.000762977 0.0264479 0.0202715 1 0 1 1 0 0 +EDGE2 8386 3486 0.0106875 -0.0172828 -0.00654756 1 0 1 1 0 0 +EDGE2 8386 5847 0.947939 0.0262352 -0.00191943 1 0 1 1 0 0 +EDGE2 8386 1166 0.0141236 -0.00709225 -0.0006718 1 0 1 1 0 0 +EDGE2 8386 3086 0.042078 0.0489972 -0.0332269 1 0 1 1 0 0 +EDGE2 8386 3106 -0.0237119 0.046715 -0.0107213 1 0 1 1 0 0 +EDGE2 8386 3126 -0.00549964 -0.00703469 0.00454335 1 0 1 1 0 0 +EDGE2 8386 1186 -0.0994099 -0.00928505 0.00211328 1 0 1 1 0 0 +EDGE2 8386 3107 0.98976 0.0436976 0.0152264 1 0 1 1 0 0 +EDGE2 8386 3167 0.982316 -0.0210628 -0.0146223 1 0 1 1 0 0 +EDGE2 8386 3487 1.06971 -0.0788594 0.00425506 1 0 1 1 0 0 +EDGE2 8386 5827 0.930971 0.0609663 0.0195145 1 0 1 1 0 0 +EDGE2 8386 3127 0.997451 -0.0462605 -0.00796933 1 0 1 1 0 0 +EDGE2 8386 1187 1.00594 0.0721806 0.0527566 1 0 1 1 0 0 +EDGE2 8386 3087 0.994221 0.0208518 0.0117191 1 0 1 1 0 0 +EDGE2 8386 1167 0.958035 0.107073 0.0136571 1 0 1 1 0 0 +EDGE2 8387 3166 -1.08906 0.017264 0.0147396 1 0 1 1 0 0 +EDGE2 8387 5826 -0.991878 0.0177176 -0.0221547 1 0 1 1 0 0 +EDGE2 8387 5846 -0.9654 0.00931268 0.0016267 1 0 1 1 0 0 +EDGE2 8387 8386 -0.980598 -0.011496 0.00105132 1 0 1 1 0 0 +EDGE2 8387 3486 -1.02449 0.00646555 -0.0117287 1 0 1 1 0 0 +EDGE2 8387 5847 -0.0655724 0.0154875 -0.0113563 1 0 1 1 0 0 +EDGE2 8387 1166 -1.0204 0.0179515 0.00143417 1 0 1 1 0 0 +EDGE2 8387 3086 -1.01854 0.0370327 -0.0144379 1 0 1 1 0 0 +EDGE2 8387 3106 -0.936481 -0.00125155 0.00164225 1 0 1 1 0 0 +EDGE2 8387 3126 -1.03567 -0.0867528 -0.00154442 1 0 1 1 0 0 +EDGE2 8387 1186 -1.03265 0.0191136 0.012591 1 0 1 1 0 0 +EDGE2 8387 3107 -0.0240357 0.0623771 -0.0218366 1 0 1 1 0 0 +EDGE2 8387 3167 -0.00556373 0.137328 -0.0448467 1 0 1 1 0 0 +EDGE2 8387 3487 0.0316434 -0.0849377 0.017137 1 0 1 1 0 0 +EDGE2 8387 5827 -0.000959532 0.0462706 0.0109018 1 0 1 1 0 0 +EDGE2 8387 3127 0.00134056 0.0820536 -0.032036 1 0 1 1 0 0 +EDGE2 8387 1187 0.0378994 0.00525171 -0.037661 1 0 1 1 0 0 +EDGE2 8387 3087 -0.030115 0.00835308 0.0097307 1 0 1 1 0 0 +EDGE2 8387 1167 -0.000934917 0.0602538 -0.0354746 1 0 1 1 0 0 +EDGE2 8387 3128 1.03739 0.00489329 -0.0242966 1 0 1 1 0 0 +EDGE2 8387 3488 0.949964 0.0173691 -0.00759763 1 0 1 1 0 0 +EDGE2 8387 5828 0.989745 -0.055769 -0.0366341 1 0 1 1 0 0 +EDGE2 8387 5848 0.837521 -0.0232463 -0.00728522 1 0 1 1 0 0 +EDGE2 8387 3168 1.08058 0.0473183 -0.0115029 1 0 1 1 0 0 +EDGE2 8387 1188 1.01025 0.0181799 0.00415194 1 0 1 1 0 0 +EDGE2 8387 3088 0.892363 0.0139334 -0.00162462 1 0 1 1 0 0 +EDGE2 8387 3108 0.995393 -0.0415889 0.0192667 1 0 1 1 0 0 +EDGE2 8387 1168 0.950243 0.00424 -0.0322593 1 0 1 1 0 0 +EDGE2 8388 5847 -1.00581 -0.0928856 -0.0165659 1 0 1 1 0 0 +EDGE2 8388 8387 -0.934575 0.0378315 -0.0120292 1 0 1 1 0 0 +EDGE2 8388 3107 -1.08453 -0.00464358 -0.0222112 1 0 1 1 0 0 +EDGE2 8388 3167 -1.00825 -0.0565848 0.0249263 1 0 1 1 0 0 +EDGE2 8388 3487 -1.00572 -0.0255762 -0.0070831 1 0 1 1 0 0 +EDGE2 8388 5827 -0.970347 -0.0371698 0.0251428 1 0 1 1 0 0 +EDGE2 8388 3127 -0.864851 0.100443 -0.00282997 1 0 1 1 0 0 +EDGE2 8388 1187 -1.02421 0.110585 -0.0616684 1 0 1 1 0 0 +EDGE2 8388 3087 -1.03505 -0.0158478 -0.0075351 1 0 1 1 0 0 +EDGE2 8388 1167 -0.964775 0.00545664 -0.00742402 1 0 1 1 0 0 +EDGE2 8388 3128 0.0467884 -0.0280935 -8.49602e-05 1 0 1 1 0 0 +EDGE2 8388 3488 -0.0259098 -0.0350649 -0.0238623 1 0 1 1 0 0 +EDGE2 8388 5828 0.0304312 -0.000214961 -0.00831001 1 0 1 1 0 0 +EDGE2 8388 5848 -0.0858175 -0.00745594 -0.00929419 1 0 1 1 0 0 +EDGE2 8388 3168 0.0879355 -0.0639577 -0.0149523 1 0 1 1 0 0 +EDGE2 8388 1188 -0.0551211 0.0712624 -0.0320533 1 0 1 1 0 0 +EDGE2 8388 3088 0.0815106 -0.00231671 -0.0148487 1 0 1 1 0 0 +EDGE2 8388 3108 0.0460456 -0.000778979 0.0109258 1 0 1 1 0 0 +EDGE2 8388 1168 0.0156072 -0.0453278 0.00574394 1 0 1 1 0 0 +EDGE2 8388 5849 0.981945 -0.0417176 0.0134409 1 0 1 1 0 0 +EDGE2 8388 3109 1.05664 -0.0987737 -0.0316008 1 0 1 1 0 0 +EDGE2 8388 3169 0.9645 0.0200971 0.0105114 1 0 1 1 0 0 +EDGE2 8388 3489 1.03446 -0.0111692 0.00804478 1 0 1 1 0 0 +EDGE2 8388 5829 1.07036 0.0200425 -0.000878521 1 0 1 1 0 0 +EDGE2 8388 3129 1.07959 0.0462179 0.00188831 1 0 1 1 0 0 +EDGE2 8388 1189 1.03295 0.103799 -0.00416167 1 0 1 1 0 0 +EDGE2 8388 3089 0.98894 -0.0583396 0.0120611 1 0 1 1 0 0 +EDGE2 8388 1169 0.978887 0.0310906 0.0275952 1 0 1 1 0 0 +EDGE2 8389 8388 -1.06744 -0.0700418 -0.0175662 1 0 1 1 0 0 +EDGE2 8389 3128 -0.965127 0.0629155 0.00144253 1 0 1 1 0 0 +EDGE2 8389 3488 -1.09624 -0.0303996 0.0032991 1 0 1 1 0 0 +EDGE2 8389 5828 -1.01937 -0.00192255 0.0129131 1 0 1 1 0 0 +EDGE2 8389 5848 -1.023 0.10399 -0.0106604 1 0 1 1 0 0 +EDGE2 8389 3168 -1.04563 -0.0353659 -0.00591635 1 0 1 1 0 0 +EDGE2 8389 1188 -1.05096 0.000266078 0.0238977 1 0 1 1 0 0 +EDGE2 8389 3088 -1.09094 0.00141596 -0.0337227 1 0 1 1 0 0 +EDGE2 8389 3108 -1.09502 -0.0578084 -0.0401637 1 0 1 1 0 0 +EDGE2 8389 1168 -0.992679 0.013452 0.00852585 1 0 1 1 0 0 +EDGE2 8389 5849 0.0589807 0.0817773 -0.000154845 1 0 1 1 0 0 +EDGE2 8389 3109 -0.0102467 0.0501761 0.0123017 1 0 1 1 0 0 +EDGE2 8389 3169 0.0123705 -0.0597551 0.0177525 1 0 1 1 0 0 +EDGE2 8389 3489 0.050473 -0.0629496 -0.0219415 1 0 1 1 0 0 +EDGE2 8389 5829 -0.0237361 -0.0177216 0.0331114 1 0 1 1 0 0 +EDGE2 8389 3129 -0.01737 0.0110509 -0.00641422 1 0 1 1 0 0 +EDGE2 8389 1189 0.00458172 0.0694178 0.000937055 1 0 1 1 0 0 +EDGE2 8389 3089 0.0360093 -0.0581616 -0.00650941 1 0 1 1 0 0 +EDGE2 8389 1169 0.0209252 -0.0158602 -0.0346418 1 0 1 1 0 0 +EDGE2 8389 3050 1.00162 -0.00241611 -3.17597 1 0 1 1 0 0 +EDGE2 8389 5850 0.964019 0.017646 0.0313472 1 0 1 1 0 0 +EDGE2 8389 3170 0.964579 0.0194016 0.0353391 1 0 1 1 0 0 +EDGE2 8389 5790 1.04287 -0.00148496 -3.12005 1 0 1 1 0 0 +EDGE2 8389 5810 1.02579 -0.0707821 -3.09287 1 0 1 1 0 0 +EDGE2 8389 5830 1.02009 -0.0237691 0.0104028 1 0 1 1 0 0 +EDGE2 8389 3490 1.06391 0.00715443 0.0208323 1 0 1 1 0 0 +EDGE2 8389 3110 1.12229 -0.0522074 0.00657122 1 0 1 1 0 0 +EDGE2 8389 3130 1.00716 -0.0493345 -0.00617931 1 0 1 1 0 0 +EDGE2 8389 3090 1.07084 0.0510556 0.0257949 1 0 1 1 0 0 +EDGE2 8389 1130 0.968408 0.0576859 -3.13783 1 0 1 1 0 0 +EDGE2 8389 1170 0.93638 -0.0410999 0.0307815 1 0 1 1 0 0 +EDGE2 8389 1190 1.01733 -0.0154505 -0.00152609 1 0 1 1 0 0 +EDGE2 8389 3030 0.916384 0.0227848 -3.16224 1 0 1 1 0 0 +EDGE2 8389 1150 0.985453 -0.0886901 -3.17904 1 0 1 1 0 0 +EDGE2 8389 1110 1.06788 -0.0449179 -3.15308 1 0 1 1 0 0 +EDGE2 8390 5849 -1.00503 -0.0361456 0.0141478 1 0 1 1 0 0 +EDGE2 8390 8389 -1.059 0.0230194 0.0216767 1 0 1 1 0 0 +EDGE2 8390 3109 -1.01899 -0.0644723 -0.0356485 1 0 1 1 0 0 +EDGE2 8390 3169 -0.978096 -0.015558 0.0275482 1 0 1 1 0 0 +EDGE2 8390 3489 -0.974666 -0.00582601 0.00430712 1 0 1 1 0 0 +EDGE2 8390 5829 -0.884567 0.0209435 -0.00932157 1 0 1 1 0 0 +EDGE2 8390 3129 -1.05119 -0.0085036 -0.0119844 1 0 1 1 0 0 +EDGE2 8390 1189 -0.974068 -0.0268235 -0.0343515 1 0 1 1 0 0 +EDGE2 8390 3089 -0.942586 -0.0175786 -0.0122499 1 0 1 1 0 0 +EDGE2 8390 1169 -1.03803 0.0838702 -0.0248767 1 0 1 1 0 0 +EDGE2 8390 3050 -0.0338393 0.00998399 -3.14594 1 0 1 1 0 0 +EDGE2 8390 3131 -0.0338619 0.946392 1.56938 1 0 1 1 0 0 +EDGE2 8390 3491 0.0156415 1.01175 1.54117 1 0 1 1 0 0 +EDGE2 8390 5811 0.0741277 1.03343 1.56878 1 0 1 1 0 0 +EDGE2 8390 5831 0.0796216 1.01251 1.58396 1 0 1 1 0 0 +EDGE2 8390 3171 0.0933809 0.964923 1.56248 1 0 1 1 0 0 +EDGE2 8390 5850 0.00938224 -0.00145108 0.0240788 1 0 1 1 0 0 +EDGE2 8390 1151 0.0405594 0.977034 1.60122 1 0 1 1 0 0 +EDGE2 8390 1191 -0.0343864 1.00098 1.53225 1 0 1 1 0 0 +EDGE2 8390 3091 0.014474 1.02889 1.58367 1 0 1 1 0 0 +EDGE2 8390 3111 -0.0397367 1.04573 1.56809 1 0 1 1 0 0 +EDGE2 8390 1171 -0.0394493 1.03236 1.56323 1 0 1 1 0 0 +EDGE2 8390 3170 0.00173797 0.0126807 0.0239237 1 0 1 1 0 0 +EDGE2 8390 5790 0.0232078 0.0771946 -3.13496 1 0 1 1 0 0 +EDGE2 8390 5810 0.132788 0.065721 -3.14406 1 0 1 1 0 0 +EDGE2 8390 5830 -0.0410338 0.0569874 0.00589544 1 0 1 1 0 0 +EDGE2 8390 3490 -0.0278022 -0.0689269 -0.00618602 1 0 1 1 0 0 +EDGE2 8390 3110 -0.065552 0.0705915 -0.00422049 1 0 1 1 0 0 +EDGE2 8390 3130 0.00787984 0.124992 0.00546227 1 0 1 1 0 0 +EDGE2 8390 3090 0.0846193 -0.0282163 0.00345561 1 0 1 1 0 0 +EDGE2 8390 5789 0.979117 -0.0578324 -3.11573 1 0 1 1 0 0 +EDGE2 8390 1130 0.0193525 -0.0102633 -3.16879 1 0 1 1 0 0 +EDGE2 8390 1170 0.0375905 -0.107795 -0.013586 1 0 1 1 0 0 +EDGE2 8390 1190 -0.0268232 0.000397896 0.00485811 1 0 1 1 0 0 +EDGE2 8390 3030 0.0280172 0.0150052 -3.18209 1 0 1 1 0 0 +EDGE2 8390 1150 -0.038359 -0.0270721 -3.10371 1 0 1 1 0 0 +EDGE2 8390 1110 0.0251592 -0.00989777 -3.18281 1 0 1 1 0 0 +EDGE2 8390 5809 1.02372 0.00977217 -3.15118 1 0 1 1 0 0 +EDGE2 8390 1109 0.97891 0.0396759 -3.12471 1 0 1 1 0 0 +EDGE2 8390 1149 1.08901 -0.050091 -3.11226 1 0 1 1 0 0 +EDGE2 8390 3029 0.994079 -0.048994 -3.146 1 0 1 1 0 0 +EDGE2 8390 3049 1.01003 0.0811372 -3.14824 1 0 1 1 0 0 +EDGE2 8390 1129 0.884 -0.0510128 -3.09718 1 0 1 1 0 0 +EDGE2 8390 5851 0.0472082 -0.956664 -1.55658 1 0 1 1 0 0 +EDGE2 8390 1111 -0.0270687 -1.03909 -1.54617 1 0 1 1 0 0 +EDGE2 8390 3031 -0.00732331 -1.07099 -1.56176 1 0 1 1 0 0 +EDGE2 8390 3051 -0.039449 -1.02107 -1.55036 1 0 1 1 0 0 +EDGE2 8390 5791 0.00420216 -1.00859 -1.58139 1 0 1 1 0 0 +EDGE2 8390 1131 0.0159628 -0.980306 -1.58383 1 0 1 1 0 0 +EDGE2 8391 3050 -1.06917 -0.00156507 -1.55933 1 0 1 1 0 0 +EDGE2 8391 5850 -0.91927 0.0783498 1.56189 1 0 1 1 0 0 +EDGE2 8391 8390 -0.977653 -0.0284292 1.59722 1 0 1 1 0 0 +EDGE2 8391 3170 -0.97897 -0.0201344 1.55363 1 0 1 1 0 0 +EDGE2 8391 5790 -1.04956 0.0432982 -1.56422 1 0 1 1 0 0 +EDGE2 8391 5810 -1.02622 -0.0129892 -1.60296 1 0 1 1 0 0 +EDGE2 8391 5830 -0.936213 -0.079729 1.55214 1 0 1 1 0 0 +EDGE2 8391 3490 -0.971242 -0.0338604 1.61096 1 0 1 1 0 0 +EDGE2 8391 3110 -1.01804 0.0369931 1.58491 1 0 1 1 0 0 +EDGE2 8391 3130 -0.939823 -0.0721421 1.58027 1 0 1 1 0 0 +EDGE2 8391 3090 -1.03209 -0.0144957 1.57745 1 0 1 1 0 0 +EDGE2 8391 1130 -1.01719 -0.0140556 -1.59198 1 0 1 1 0 0 +EDGE2 8391 1170 -0.985057 -0.0185565 1.55484 1 0 1 1 0 0 +EDGE2 8391 1190 -0.975301 0.0406337 1.5524 1 0 1 1 0 0 +EDGE2 8391 3030 -1.03428 0.0569539 -1.57061 1 0 1 1 0 0 +EDGE2 8391 1150 -0.913061 0.030031 -1.55012 1 0 1 1 0 0 +EDGE2 8391 1110 -0.981752 0.063412 -1.58674 1 0 1 1 0 0 +EDGE2 8391 5851 -0.0448715 -0.0366456 0.0144319 1 0 1 1 0 0 +EDGE2 8391 3052 0.950377 0.0399599 -0.03268 1 0 1 1 0 0 +EDGE2 8391 1111 -0.0136428 0.0315788 -0.0207544 1 0 1 1 0 0 +EDGE2 8391 3031 -0.0214954 -0.0509662 0.0451841 1 0 1 1 0 0 +EDGE2 8391 3051 -0.00391401 0.0111476 -0.0358212 1 0 1 1 0 0 +EDGE2 8391 5791 -0.0283676 -0.0300256 0.0182792 1 0 1 1 0 0 +EDGE2 8391 1131 0.00855096 -0.0345122 -0.000278607 1 0 1 1 0 0 +EDGE2 8391 5852 0.996915 -0.027855 -0.0143831 1 0 1 1 0 0 +EDGE2 8391 5792 0.973181 -0.00637013 0.0193716 1 0 1 1 0 0 +EDGE2 8391 1112 0.991215 -0.092557 0.0207694 1 0 1 1 0 0 +EDGE2 8391 1132 0.964339 -0.00702125 -0.0187183 1 0 1 1 0 0 +EDGE2 8391 3032 0.941681 0.0539275 -0.0138606 1 0 1 1 0 0 +EDGE2 8392 5851 -1.03278 -0.0985818 0.0106829 1 0 1 1 0 0 +EDGE2 8392 8391 -1.00494 -0.0316654 0.0168838 1 0 1 1 0 0 +EDGE2 8392 1133 0.949473 -0.0143605 -0.00111772 1 0 1 1 0 0 +EDGE2 8392 3052 -0.0103225 0.0912326 -0.0243031 1 0 1 1 0 0 +EDGE2 8392 1111 -0.940938 -0.0402935 0.0173244 1 0 1 1 0 0 +EDGE2 8392 3031 -1.0115 0.0479729 -0.0305779 1 0 1 1 0 0 +EDGE2 8392 3051 -0.989776 0.0454647 0.0178591 1 0 1 1 0 0 +EDGE2 8392 5791 -1.05824 0.0438291 0.0218465 1 0 1 1 0 0 +EDGE2 8392 1131 -0.942414 -0.0118352 0.0419934 1 0 1 1 0 0 +EDGE2 8392 5852 0.0161337 -0.0177624 0.00623261 1 0 1 1 0 0 +EDGE2 8392 5792 -0.00733562 -0.0592483 0.00116487 1 0 1 1 0 0 +EDGE2 8392 1112 0.00627999 -0.01058 -0.0137211 1 0 1 1 0 0 +EDGE2 8392 1132 0.0203142 0.00993097 0.00671153 1 0 1 1 0 0 +EDGE2 8392 3032 -0.0576132 -0.0311619 0.0176918 1 0 1 1 0 0 +EDGE2 8392 3053 1.0232 -0.00124717 0.0310823 1 0 1 1 0 0 +EDGE2 8392 5793 1.03434 0.0828516 0.00767529 1 0 1 1 0 0 +EDGE2 8392 5853 0.903039 0.00618305 0.0349277 1 0 1 1 0 0 +EDGE2 8392 3033 1.0581 0.0692214 -0.00175905 1 0 1 1 0 0 +EDGE2 8392 1113 0.990299 0.0108248 -0.00622533 1 0 1 1 0 0 +EDGE2 8393 1133 0.0149613 0.0704946 -0.018386 1 0 1 1 0 0 +EDGE2 8393 3052 -0.971307 0.00195815 0.0231547 1 0 1 1 0 0 +EDGE2 8393 5852 -0.981049 0.0565395 0.000800689 1 0 1 1 0 0 +EDGE2 8393 8392 -1.00292 -0.0233192 -0.014967 1 0 1 1 0 0 +EDGE2 8393 5792 -1.06647 0.108032 0.0328508 1 0 1 1 0 0 +EDGE2 8393 1112 -0.947719 -0.0525433 0.0273947 1 0 1 1 0 0 +EDGE2 8393 1132 -0.999449 0.0395161 -0.0111643 1 0 1 1 0 0 +EDGE2 8393 3032 -1.067 0.0166206 0.0293202 1 0 1 1 0 0 +EDGE2 8393 3053 0.0813059 -0.00727371 0.00768517 1 0 1 1 0 0 +EDGE2 8393 5793 -0.0986479 -0.0273653 -0.00426784 1 0 1 1 0 0 +EDGE2 8393 5853 0.00767748 -0.0606664 0.0347611 1 0 1 1 0 0 +EDGE2 8393 3033 0.00670126 0.00897322 0.00620829 1 0 1 1 0 0 +EDGE2 8393 5794 0.954354 -0.0309849 0.029616 1 0 1 1 0 0 +EDGE2 8393 1113 -0.00958143 0.0388794 0.000550498 1 0 1 1 0 0 +EDGE2 8393 5854 0.978381 0.0238371 0.0105447 1 0 1 1 0 0 +EDGE2 8393 1134 1.08625 0.0780337 0.0154769 1 0 1 1 0 0 +EDGE2 8393 3034 0.97887 0.0371597 0.00852483 1 0 1 1 0 0 +EDGE2 8393 3054 1.10469 0.0152801 0.0212371 1 0 1 1 0 0 +EDGE2 8393 1114 1.03184 0.129929 -0.0055517 1 0 1 1 0 0 +EDGE2 8394 5795 0.982667 -0.0250882 0.033595 1 0 1 1 0 0 +EDGE2 8394 1133 -0.983072 -0.0553876 -0.037077 1 0 1 1 0 0 +EDGE2 8394 8393 -1.07839 -0.0671554 0.00184562 1 0 1 1 0 0 +EDGE2 8394 3053 -1.08962 0.0420125 0.0226747 1 0 1 1 0 0 +EDGE2 8394 5793 -0.924181 0.0524171 -0.000500689 1 0 1 1 0 0 +EDGE2 8394 5853 -0.920542 -0.0198907 0.0303549 1 0 1 1 0 0 +EDGE2 8394 3033 -0.939807 0.0527489 -0.0177078 1 0 1 1 0 0 +EDGE2 8394 5794 0.0784292 0.0656141 0.0210325 1 0 1 1 0 0 +EDGE2 8394 1113 -1.02094 0.0594485 -0.00712826 1 0 1 1 0 0 +EDGE2 8394 5854 0.0462562 0.0936719 -0.0184734 1 0 1 1 0 0 +EDGE2 8394 1134 -0.0183917 0.0242255 -0.0160566 1 0 1 1 0 0 +EDGE2 8394 3034 -0.0672776 0.052292 0.0316707 1 0 1 1 0 0 +EDGE2 8394 3054 -0.0214965 -0.0637451 0.0116883 1 0 1 1 0 0 +EDGE2 8394 1114 0.0034267 -0.0354607 0.00922596 1 0 1 1 0 0 +EDGE2 8394 5875 0.965324 -0.0110831 -3.1308 1 0 1 1 0 0 +EDGE2 8394 8355 1.02495 -0.0109034 -3.13728 1 0 1 1 0 0 +EDGE2 8394 5855 0.96872 0.0344156 -0.0136915 1 0 1 1 0 0 +EDGE2 8394 3035 1.00693 0.00490083 -0.0159902 1 0 1 1 0 0 +EDGE2 8394 3055 1.02994 -0.0110784 0.0368441 1 0 1 1 0 0 +EDGE2 8394 1095 1.00247 -0.0178135 -3.1202 1 0 1 1 0 0 +EDGE2 8394 1115 0.973425 -0.0576647 -0.00477131 1 0 1 1 0 0 +EDGE2 8394 1135 0.967849 0.0401858 0.0319513 1 0 1 1 0 0 +EDGE2 8395 5795 -0.0494389 -0.050302 -0.00885078 1 0 1 1 0 0 +EDGE2 8395 8356 -0.11388 -1.03235 -1.57626 1 0 1 1 0 0 +EDGE2 8395 5856 0.0017317 -1.06591 -1.59646 1 0 1 1 0 0 +EDGE2 8395 5876 0.0887289 -0.982421 -1.55913 1 0 1 1 0 0 +EDGE2 8395 3056 -0.0901086 -1.00766 -1.58237 1 0 1 1 0 0 +EDGE2 8395 5794 -0.979491 0.0615609 0.0131087 1 0 1 1 0 0 +EDGE2 8395 8394 -1.06459 0.00698008 -0.0296346 1 0 1 1 0 0 +EDGE2 8395 5854 -1.01609 -0.0423141 0.00818039 1 0 1 1 0 0 +EDGE2 8395 1134 -1.02847 0.0186821 -0.0166592 1 0 1 1 0 0 +EDGE2 8395 3034 -0.917141 -0.0816442 0.013569 1 0 1 1 0 0 +EDGE2 8395 3054 -1.03845 -0.030628 -0.00715398 1 0 1 1 0 0 +EDGE2 8395 1114 -1.01898 0.0170871 -0.0193654 1 0 1 1 0 0 +EDGE2 8395 5875 0.0433443 -0.0229828 -3.13989 1 0 1 1 0 0 +EDGE2 8395 8355 0.0371893 -0.0447146 -3.14893 1 0 1 1 0 0 +EDGE2 8395 5855 -0.0113379 0.00101595 0.0257533 1 0 1 1 0 0 +EDGE2 8395 3035 0.0875516 0.0513008 0.0301417 1 0 1 1 0 0 +EDGE2 8395 3055 0.0569575 -0.0155407 -0.033052 1 0 1 1 0 0 +EDGE2 8395 1095 0.031956 -0.0129442 -3.16503 1 0 1 1 0 0 +EDGE2 8395 1115 0.0265658 -0.0545151 -0.0278707 1 0 1 1 0 0 +EDGE2 8395 1135 0.0145208 -0.0230354 0.0169853 1 0 1 1 0 0 +EDGE2 8395 1094 0.98926 0.0409841 -3.13943 1 0 1 1 0 0 +EDGE2 8395 8354 0.991012 -0.0718156 -3.11873 1 0 1 1 0 0 +EDGE2 8395 5874 1.00583 -0.0539358 -3.15202 1 0 1 1 0 0 +EDGE2 8395 1116 0.047309 1.04159 1.59259 1 0 1 1 0 0 +EDGE2 8395 3036 0.0380571 0.925063 1.60422 1 0 1 1 0 0 +EDGE2 8395 5796 0.0466173 0.97394 1.57042 1 0 1 1 0 0 +EDGE2 8395 1136 0.00670508 1.00493 1.58152 1 0 1 1 0 0 +EDGE2 8395 1096 0.00485552 1.03042 1.54466 1 0 1 1 0 0 +EDGE2 8396 5795 -1.02405 -0.0121587 1.55437 1 0 1 1 0 0 +EDGE2 8396 5877 1.01626 0.0331845 0.044645 1 0 1 1 0 0 +EDGE2 8396 8357 0.971003 -0.0243832 -0.0430381 1 0 1 1 0 0 +EDGE2 8396 3057 1.02439 0.0382029 0.0246694 1 0 1 1 0 0 +EDGE2 8396 5857 1.04282 0.0117125 -0.0196422 1 0 1 1 0 0 +EDGE2 8396 8356 -0.0578125 0.0631592 -0.01402 1 0 1 1 0 0 +EDGE2 8396 5856 0.0320587 0.0370999 -0.0134345 1 0 1 1 0 0 +EDGE2 8396 5876 -0.0322856 0.0119037 0.0230291 1 0 1 1 0 0 +EDGE2 8396 3056 -0.0547969 -0.0581062 -0.0117625 1 0 1 1 0 0 +EDGE2 8396 8395 -1.0112 -0.107989 1.55631 1 0 1 1 0 0 +EDGE2 8396 5875 -0.992907 0.0366171 -1.59254 1 0 1 1 0 0 +EDGE2 8396 8355 -0.970394 -0.0806407 -1.56941 1 0 1 1 0 0 +EDGE2 8396 5855 -1.0561 -0.0141376 1.55174 1 0 1 1 0 0 +EDGE2 8396 3035 -1.12975 -0.00103491 1.57336 1 0 1 1 0 0 +EDGE2 8396 3055 -0.999808 0.0439823 1.55296 1 0 1 1 0 0 +EDGE2 8396 1095 -0.991648 -0.046797 -1.59497 1 0 1 1 0 0 +EDGE2 8396 1115 -1.03755 0.0381556 1.58864 1 0 1 1 0 0 +EDGE2 8396 1135 -1.02654 -0.0099765 1.54907 1 0 1 1 0 0 +EDGE2 8397 8358 0.926899 -0.00387174 -0.011946 1 0 1 1 0 0 +EDGE2 8397 3058 1.01461 0.0180969 0.00249783 1 0 1 1 0 0 +EDGE2 8397 5858 0.92779 -0.0145451 -0.0249313 1 0 1 1 0 0 +EDGE2 8397 5878 1.03447 -0.102476 0.00123168 1 0 1 1 0 0 +EDGE2 8397 5877 0.0465288 0.0269251 -0.00386464 1 0 1 1 0 0 +EDGE2 8397 8357 -0.0777285 0.0134333 -0.0257079 1 0 1 1 0 0 +EDGE2 8397 3057 0.024553 0.0235538 0.000685649 1 0 1 1 0 0 +EDGE2 8397 5857 -0.0031575 0.0147115 0.0261218 1 0 1 1 0 0 +EDGE2 8397 8356 -0.968377 -0.0774541 0.0281205 1 0 1 1 0 0 +EDGE2 8397 8396 -0.987126 -0.102705 -0.028246 1 0 1 1 0 0 +EDGE2 8397 5856 -1.01472 -0.0207108 -0.0230815 1 0 1 1 0 0 +EDGE2 8397 5876 -1.04122 0.0064864 -0.0250867 1 0 1 1 0 0 +EDGE2 8397 3056 -1.07234 0.0460665 0.0108113 1 0 1 1 0 0 +EDGE2 8398 5859 0.933355 0.00485579 0.0190815 1 0 1 1 0 0 +EDGE2 8398 5879 0.886076 -0.00258147 -0.00757303 1 0 1 1 0 0 +EDGE2 8398 8359 0.961079 0.0163657 0.00578536 1 0 1 1 0 0 +EDGE2 8398 3059 0.952257 0.0184078 -0.0348467 1 0 1 1 0 0 +EDGE2 8398 8358 -0.0529279 0.0299727 0.00897993 1 0 1 1 0 0 +EDGE2 8398 3058 0.029014 0.0312877 -0.0244149 1 0 1 1 0 0 +EDGE2 8398 5858 0.0219387 0.00532229 -0.0270924 1 0 1 1 0 0 +EDGE2 8398 5878 0.0233925 0.0326812 0.000346343 1 0 1 1 0 0 +EDGE2 8398 5877 -1.07455 -0.029775 -0.000148816 1 0 1 1 0 0 +EDGE2 8398 8397 -1.05408 -0.000349956 -0.00759131 1 0 1 1 0 0 +EDGE2 8398 8357 -1.04443 0.0475225 0.0158024 1 0 1 1 0 0 +EDGE2 8398 3057 -1.00615 0.0187253 0.00864429 1 0 1 1 0 0 +EDGE2 8398 5857 -1.00914 0.0189214 -0.0028844 1 0 1 1 0 0 +EDGE2 8399 8360 0.950499 -0.0177382 -0.016208 1 0 1 1 0 0 +EDGE2 8399 8380 1.03951 -0.0767451 -3.14626 1 0 1 1 0 0 +EDGE2 8399 3060 0.989139 0.046389 0.00834717 1 0 1 1 0 0 +EDGE2 8399 3160 1.00706 0.0127389 -3.1468 1 0 1 1 0 0 +EDGE2 8399 5860 0.954139 0.0426919 0.0160678 1 0 1 1 0 0 +EDGE2 8399 5880 1.04564 -0.0333646 0.0201363 1 0 1 1 0 0 +EDGE2 8399 3080 1.0507 -0.0337575 -3.13021 1 0 1 1 0 0 +EDGE2 8399 1080 1.076 -0.022463 -3.15138 1 0 1 1 0 0 +EDGE2 8399 5859 0.0503171 -0.00798026 -0.00103676 1 0 1 1 0 0 +EDGE2 8399 5879 0.0182273 -0.0485341 -0.034275 1 0 1 1 0 0 +EDGE2 8399 8359 0.0368734 -0.0272063 -0.041888 1 0 1 1 0 0 +EDGE2 8399 3059 -0.093005 0.00498211 -0.0163567 1 0 1 1 0 0 +EDGE2 8399 8358 -0.907306 0.0638808 -0.00903116 1 0 1 1 0 0 +EDGE2 8399 8398 -1.01899 0.0172313 -0.014028 1 0 1 1 0 0 +EDGE2 8399 3058 -0.943962 0.0699691 0.0130005 1 0 1 1 0 0 +EDGE2 8399 5858 -0.999396 0.113076 0.0189849 1 0 1 1 0 0 +EDGE2 8399 5878 -1.01593 -0.0263072 -0.0207275 1 0 1 1 0 0 +EDGE2 8400 8360 -0.00233144 0.0758441 -0.0285794 1 0 1 1 0 0 +EDGE2 8400 8379 1.01693 0.0563809 -3.12032 1 0 1 1 0 0 +EDGE2 8400 3079 1.10691 0.0412302 -3.13925 1 0 1 1 0 0 +EDGE2 8400 3159 1.09981 -0.0715186 -3.13862 1 0 1 1 0 0 +EDGE2 8400 1079 1.02995 0.0810178 -3.12344 1 0 1 1 0 0 +EDGE2 8400 8361 0.0546611 -0.990673 -1.61137 1 0 1 1 0 0 +EDGE2 8400 8381 0.00663999 -0.993011 -1.62265 1 0 1 1 0 0 +EDGE2 8400 3081 -0.0266533 -0.971652 -1.57402 1 0 1 1 0 0 +EDGE2 8400 3161 -0.0124285 -1.06977 -1.58789 1 0 1 1 0 0 +EDGE2 8400 5881 0.0959483 -1.04372 -1.58919 1 0 1 1 0 0 +EDGE2 8400 3061 0.0579969 -1.05405 -1.57402 1 0 1 1 0 0 +EDGE2 8400 8380 -0.043018 -0.0481263 -3.18073 1 0 1 1 0 0 +EDGE2 8400 3060 0.0810678 -0.0448356 -0.0120399 1 0 1 1 0 0 +EDGE2 8400 3160 -0.0429232 -0.0278989 -3.1777 1 0 1 1 0 0 +EDGE2 8400 5860 -0.0213983 -0.0516045 -0.0182678 1 0 1 1 0 0 +EDGE2 8400 5880 0.0632228 -0.0258199 0.0164568 1 0 1 1 0 0 +EDGE2 8400 3080 -0.0675718 -0.0146829 -3.124 1 0 1 1 0 0 +EDGE2 8400 1080 0.0904858 -0.0252155 -3.1434 1 0 1 1 0 0 +EDGE2 8400 1081 0.0175256 0.986233 1.56935 1 0 1 1 0 0 +EDGE2 8400 5861 -0.0188111 1.08537 1.56228 1 0 1 1 0 0 +EDGE2 8400 8399 -0.999229 0.0472447 0.0223123 1 0 1 1 0 0 +EDGE2 8400 5859 -0.984019 -0.0243782 -0.0329205 1 0 1 1 0 0 +EDGE2 8400 5879 -1.05788 0.0771465 0.0239818 1 0 1 1 0 0 +EDGE2 8400 8359 -1.01679 -0.0234061 -0.0165975 1 0 1 1 0 0 +EDGE2 8400 3059 -0.961313 0.0343447 -0.0464619 1 0 1 1 0 0 +EDGE2 8401 8360 -0.992123 0.0585431 -1.55376 1 0 1 1 0 0 +EDGE2 8401 8400 -0.985849 -0.044537 -1.58969 1 0 1 1 0 0 +EDGE2 8401 8380 -0.997514 -0.00861828 1.5613 1 0 1 1 0 0 +EDGE2 8401 5862 1.02968 -0.0246443 0.0087413 1 0 1 1 0 0 +EDGE2 8401 3060 -0.981486 -0.0484276 -1.57294 1 0 1 1 0 0 +EDGE2 8401 3160 -1.05446 0.0667255 1.55937 1 0 1 1 0 0 +EDGE2 8401 5860 -0.886258 0.0790231 -1.584 1 0 1 1 0 0 +EDGE2 8401 5880 -1.02129 0.0372205 -1.60253 1 0 1 1 0 0 +EDGE2 8401 3080 -0.974821 -0.0656819 1.56837 1 0 1 1 0 0 +EDGE2 8401 1080 -1.04129 0.0424785 1.55173 1 0 1 1 0 0 +EDGE2 8401 1081 0.0407572 0.0314414 -0.021223 1 0 1 1 0 0 +EDGE2 8401 5861 -0.0177134 -0.0346836 -0.00355591 1 0 1 1 0 0 +EDGE2 8401 1082 1.05707 0.0734101 -0.00256626 1 0 1 1 0 0 +EDGE2 8402 5862 0.0382358 0.0659654 0.00448026 1 0 1 1 0 0 +EDGE2 8402 8401 -1.02663 -0.0829636 0.0199877 1 0 1 1 0 0 +EDGE2 8402 1081 -0.955102 -0.0040225 0.0112536 1 0 1 1 0 0 +EDGE2 8402 5861 -0.956745 0.0413226 0.0300808 1 0 1 1 0 0 +EDGE2 8402 1082 0.103658 -0.00691287 -0.000973953 1 0 1 1 0 0 +EDGE2 8402 1083 1.08876 0.0492807 0.0180104 1 0 1 1 0 0 +EDGE2 8402 5863 0.987507 0.0690848 0.0367817 1 0 1 1 0 0 +EDGE2 8403 5862 -1.09365 -0.0062145 0.0161142 1 0 1 1 0 0 +EDGE2 8403 8402 -1.00331 -0.0360036 -0.0372165 1 0 1 1 0 0 +EDGE2 8403 1082 -1.04863 -0.0320405 -0.00656451 1 0 1 1 0 0 +EDGE2 8403 1083 0.0913999 -0.0522141 -0.014316 1 0 1 1 0 0 +EDGE2 8403 5863 0.0555555 0.0189349 -0.000264667 1 0 1 1 0 0 +EDGE2 8403 1084 0.976918 0.0447336 0.0102225 1 0 1 1 0 0 +EDGE2 8403 5864 1.03513 -0.0764128 -0.0373121 1 0 1 1 0 0 +EDGE2 8404 8345 1.03157 0.0412329 -3.12752 1 0 1 1 0 0 +EDGE2 8404 8403 -1.00395 -0.00778589 0.0154062 1 0 1 1 0 0 +EDGE2 8404 1083 -1.0131 -0.052467 -0.0280232 1 0 1 1 0 0 +EDGE2 8404 5863 -0.949931 -0.0409166 0.021131 1 0 1 1 0 0 +EDGE2 8404 1084 0.0665378 -0.0800118 0.0116242 1 0 1 1 0 0 +EDGE2 8404 5864 0.0305894 0.0410098 0.0189741 1 0 1 1 0 0 +EDGE2 8404 1045 0.962771 -0.0511271 -3.12561 1 0 1 1 0 0 +EDGE2 8404 1085 0.995599 0.0673826 -0.00390009 1 0 1 1 0 0 +EDGE2 8404 5865 1.00396 -0.0498793 0.00655572 1 0 1 1 0 0 +EDGE2 8405 8345 -0.0293703 0.0539744 -3.14283 1 0 1 1 0 0 +EDGE2 8405 1046 0.0914494 -0.992779 -1.58769 1 0 1 1 0 0 +EDGE2 8405 1084 -1.00818 -0.0437025 0.00414805 1 0 1 1 0 0 +EDGE2 8405 5864 -0.945483 0.101342 0.0233207 1 0 1 1 0 0 +EDGE2 8405 8404 -1.01936 -0.0290537 -0.0168471 1 0 1 1 0 0 +EDGE2 8405 8344 0.993604 0.0122707 -3.12666 1 0 1 1 0 0 +EDGE2 8405 1045 -0.148796 0.0328021 -3.16586 1 0 1 1 0 0 +EDGE2 8405 1085 -0.0656238 0.00780738 -0.00830318 1 0 1 1 0 0 +EDGE2 8405 5865 0.0537181 -0.0470678 -0.0145502 1 0 1 1 0 0 +EDGE2 8405 1044 0.970374 0.0107784 -3.14537 1 0 1 1 0 0 +EDGE2 8405 8346 0.0355209 1.03229 1.60269 1 0 1 1 0 0 +EDGE2 8405 1086 0.0261045 1.05039 1.57512 1 0 1 1 0 0 +EDGE2 8405 5866 -0.012287 1.01301 1.54709 1 0 1 1 0 0 +EDGE2 8406 8345 -0.96705 -0.0775957 1.58467 1 0 1 1 0 0 +EDGE2 8406 8405 -1.03873 -0.00938384 -1.5524 1 0 1 1 0 0 +EDGE2 8406 1045 -1.02964 0.0771298 1.55624 1 0 1 1 0 0 +EDGE2 8406 1085 -0.998764 -0.00804507 -1.57465 1 0 1 1 0 0 +EDGE2 8406 5865 -1.01198 0.0280192 -1.55711 1 0 1 1 0 0 +EDGE2 8406 8346 0.0245895 0.0129579 0.0167026 1 0 1 1 0 0 +EDGE2 8406 1086 -0.0252423 0.0273847 -0.026363 1 0 1 1 0 0 +EDGE2 8406 5866 -0.00855379 0.0569865 -0.0183181 1 0 1 1 0 0 +EDGE2 8406 5867 0.970273 -0.0834243 -0.000481184 1 0 1 1 0 0 +EDGE2 8406 8347 0.994755 -0.0324134 0.0215296 1 0 1 1 0 0 +EDGE2 8406 1087 1.02683 0.0108528 0.00168721 1 0 1 1 0 0 +EDGE2 8407 8346 -0.978295 -0.028662 -0.012533 1 0 1 1 0 0 +EDGE2 8407 8406 -1.0067 0.0692965 0.0134396 1 0 1 1 0 0 +EDGE2 8407 1086 -1.02638 0.0487285 -0.0112223 1 0 1 1 0 0 +EDGE2 8407 5866 -1.02059 -0.0236333 0.0237162 1 0 1 1 0 0 +EDGE2 8407 5867 -0.0160337 0.0403017 -0.00378184 1 0 1 1 0 0 +EDGE2 8407 8347 -0.0249797 0.0232912 -0.00199943 1 0 1 1 0 0 +EDGE2 8407 1087 0.0416255 -0.0766608 -0.00371731 1 0 1 1 0 0 +EDGE2 8407 8348 0.984335 0.032611 0.0175251 1 0 1 1 0 0 +EDGE2 8407 1088 0.997983 0.0622938 0.00213482 1 0 1 1 0 0 +EDGE2 8407 5868 1.06234 0.00209184 0.0101088 1 0 1 1 0 0 +EDGE2 8408 8407 -0.990032 -0.049915 -0.0140444 1 0 1 1 0 0 +EDGE2 8408 5867 -0.911942 0.0403777 -0.0116132 1 0 1 1 0 0 +EDGE2 8408 8347 -0.995121 -0.0122237 0.00641681 1 0 1 1 0 0 +EDGE2 8408 1087 -1.02201 0.0169544 0.00796761 1 0 1 1 0 0 +EDGE2 8408 8348 0.0573447 -0.0210978 -0.00606164 1 0 1 1 0 0 +EDGE2 8408 1088 0.00714106 -0.00902972 0.0370764 1 0 1 1 0 0 +EDGE2 8408 5868 0.0114632 -0.0178941 -0.0232416 1 0 1 1 0 0 +EDGE2 8408 5869 1.02605 -0.0710651 -0.0274398 1 0 1 1 0 0 +EDGE2 8408 8349 0.950382 -0.00727946 -0.0171242 1 0 1 1 0 0 +EDGE2 8408 1089 0.898551 -0.020934 -0.0093257 1 0 1 1 0 0 +EDGE2 8409 8348 -0.927673 0.0086736 0.00703522 1 0 1 1 0 0 +EDGE2 8409 8408 -0.957449 -0.00693197 -0.0219768 1 0 1 1 0 0 +EDGE2 8409 1088 -1.02326 -0.103689 -0.030962 1 0 1 1 0 0 +EDGE2 8409 5868 -0.955601 -0.0186137 0.00596626 1 0 1 1 0 0 +EDGE2 8409 5869 -0.0583833 -0.0952929 0.0174248 1 0 1 1 0 0 +EDGE2 8409 8349 -0.116166 -0.0833179 -0.00516949 1 0 1 1 0 0 +EDGE2 8409 1089 0.0136141 -0.0456022 0.0085498 1 0 1 1 0 0 +EDGE2 8409 5870 1.12917 -0.0176875 -0.0115311 1 0 1 1 0 0 +EDGE2 8409 8350 1.01722 -0.064508 0.0151355 1 0 1 1 0 0 +EDGE2 8409 1090 0.919294 0.0052153 -0.00979899 1 0 1 1 0 0 +EDGE2 8410 5869 -1.00859 -0.105301 0.0279952 1 0 1 1 0 0 +EDGE2 8410 8349 -1.00786 -0.0291918 0.00443527 1 0 1 1 0 0 +EDGE2 8410 8409 -0.966005 0.0992435 -0.0416802 1 0 1 1 0 0 +EDGE2 8410 1089 -0.973354 0.0191244 -0.0331764 1 0 1 1 0 0 +EDGE2 8410 8351 -0.0327253 1.03236 1.57731 1 0 1 1 0 0 +EDGE2 8410 1091 0.0316279 0.980134 1.56557 1 0 1 1 0 0 +EDGE2 8410 5871 0.0292859 1.01874 1.56545 1 0 1 1 0 0 +EDGE2 8410 5870 -0.0371829 -0.045306 -0.0193194 1 0 1 1 0 0 +EDGE2 8410 8350 -0.046098 -0.0199221 0.00534246 1 0 1 1 0 0 +EDGE2 8410 1090 -0.0565903 -0.0490195 -0.0209638 1 0 1 1 0 0 +EDGE2 8411 1092 1.06885 0.00856392 0.017845 1 0 1 1 0 0 +EDGE2 8411 8352 0.959886 0.0434024 -0.000590642 1 0 1 1 0 0 +EDGE2 8411 5872 1.05143 0.00299852 -0.0131882 1 0 1 1 0 0 +EDGE2 8411 8351 -0.0492522 0.0213094 0.00783203 1 0 1 1 0 0 +EDGE2 8411 1091 -0.0405218 0.0415302 0.000523821 1 0 1 1 0 0 +EDGE2 8411 5871 0.00249264 0.00780879 -0.0343312 1 0 1 1 0 0 +EDGE2 8411 5870 -1.0087 0.0237231 -1.54414 1 0 1 1 0 0 +EDGE2 8411 8350 -1.00781 -0.0665332 -1.57652 1 0 1 1 0 0 +EDGE2 8411 8410 -0.94351 -0.00244677 -1.56232 1 0 1 1 0 0 +EDGE2 8411 1090 -0.96598 -0.0119878 -1.57542 1 0 1 1 0 0 +EDGE2 8412 1092 0.00784656 0.0598498 -0.019752 1 0 1 1 0 0 +EDGE2 8412 8353 1.01936 -0.0958395 -0.0159391 1 0 1 1 0 0 +EDGE2 8412 1093 0.927062 -0.0916371 -0.0204362 1 0 1 1 0 0 +EDGE2 8412 5873 0.98854 0.000478292 -0.00853875 1 0 1 1 0 0 +EDGE2 8412 8352 0.0132525 -0.0641419 -0.0145159 1 0 1 1 0 0 +EDGE2 8412 5872 0.0752637 -0.00308382 -0.0214766 1 0 1 1 0 0 +EDGE2 8412 8351 -0.905947 0.0242273 0.00362568 1 0 1 1 0 0 +EDGE2 8412 8411 -1.01432 0.0124147 0.0156648 1 0 1 1 0 0 +EDGE2 8412 1091 -1.00378 0.0628076 -0.0355976 1 0 1 1 0 0 +EDGE2 8412 5871 -0.965056 -0.0319562 0.013568 1 0 1 1 0 0 +EDGE2 8413 1092 -0.970234 0.00854647 -0.0255645 1 0 1 1 0 0 +EDGE2 8413 8353 -0.0516651 0.0265 -0.0109908 1 0 1 1 0 0 +EDGE2 8413 1094 0.996859 -0.00871278 -0.0108651 1 0 1 1 0 0 +EDGE2 8413 8354 1.03298 -0.0678209 -0.0100607 1 0 1 1 0 0 +EDGE2 8413 5874 0.891773 0.0333414 -0.0140134 1 0 1 1 0 0 +EDGE2 8413 1093 0.0501938 -0.0185882 0.0700886 1 0 1 1 0 0 +EDGE2 8413 5873 -0.0890863 -0.0699008 0.00353383 1 0 1 1 0 0 +EDGE2 8413 8352 -0.944905 0.068896 0.0152263 1 0 1 1 0 0 +EDGE2 8413 8412 -0.977154 -0.0141041 -0.00553474 1 0 1 1 0 0 +EDGE2 8413 5872 -1.01155 0.0139942 -0.00487234 1 0 1 1 0 0 +EDGE2 8414 5795 0.966214 -0.0884895 -3.14684 1 0 1 1 0 0 +EDGE2 8414 8395 0.911205 0.00810238 -3.12628 1 0 1 1 0 0 +EDGE2 8414 5875 0.964948 -0.0319092 0.00197279 1 0 1 1 0 0 +EDGE2 8414 8355 0.998927 0.045122 0.0274121 1 0 1 1 0 0 +EDGE2 8414 5855 0.843106 -0.0260203 -3.16473 1 0 1 1 0 0 +EDGE2 8414 3035 1.06272 0.0227246 -3.10807 1 0 1 1 0 0 +EDGE2 8414 3055 0.979542 0.0234438 -3.16417 1 0 1 1 0 0 +EDGE2 8414 1095 1.00525 -0.034597 0.000538603 1 0 1 1 0 0 +EDGE2 8414 1115 0.985976 -0.0792959 -3.15844 1 0 1 1 0 0 +EDGE2 8414 1135 0.957275 0.0582965 -3.1441 1 0 1 1 0 0 +EDGE2 8414 8353 -0.932233 -0.0487109 0.0193501 1 0 1 1 0 0 +EDGE2 8414 1094 0.048068 -0.0257896 0.0237445 1 0 1 1 0 0 +EDGE2 8414 8354 -0.0679834 0.0370288 0.0153893 1 0 1 1 0 0 +EDGE2 8414 5874 -0.111224 0.0333982 0.0207954 1 0 1 1 0 0 +EDGE2 8414 8413 -1.04675 0.0163553 -0.0143178 1 0 1 1 0 0 +EDGE2 8414 1093 -1.01109 -0.0387593 -0.0127297 1 0 1 1 0 0 +EDGE2 8414 5873 -0.962101 -0.0268876 -0.0179009 1 0 1 1 0 0 +EDGE2 8415 5795 0.0248507 -0.0537619 -3.15003 1 0 1 1 0 0 +EDGE2 8415 8356 0.0309058 0.977606 1.57559 1 0 1 1 0 0 +EDGE2 8415 8396 -0.0410029 1.02942 1.55121 1 0 1 1 0 0 +EDGE2 8415 5856 -0.0309726 0.929516 1.58418 1 0 1 1 0 0 +EDGE2 8415 5876 -0.123134 1.01469 1.57148 1 0 1 1 0 0 +EDGE2 8415 3056 0.048663 1.03787 1.59169 1 0 1 1 0 0 +EDGE2 8415 5794 0.983068 -0.0491684 -3.12807 1 0 1 1 0 0 +EDGE2 8415 8394 1.05108 -0.0010974 -3.17833 1 0 1 1 0 0 +EDGE2 8415 5854 0.937599 -0.0464391 -3.13652 1 0 1 1 0 0 +EDGE2 8415 1134 1.00302 0.000246036 -3.13419 1 0 1 1 0 0 +EDGE2 8415 3034 0.940859 -0.0166052 -3.12543 1 0 1 1 0 0 +EDGE2 8415 3054 1.03553 -0.0587637 -3.14158 1 0 1 1 0 0 +EDGE2 8415 1114 0.988157 -0.0201067 -3.14009 1 0 1 1 0 0 +EDGE2 8415 8395 -0.00325538 0.0185412 -3.12137 1 0 1 1 0 0 +EDGE2 8415 5875 0.142557 -0.0111587 0.0055024 1 0 1 1 0 0 +EDGE2 8415 8355 0.00650684 -0.101905 0.0125606 1 0 1 1 0 0 +EDGE2 8415 5855 -0.0490075 0.104624 -3.14544 1 0 1 1 0 0 +EDGE2 8415 3035 -0.0112592 0.0507718 -3.13985 1 0 1 1 0 0 +EDGE2 8415 3055 0.0416527 0.0137238 -3.15229 1 0 1 1 0 0 +EDGE2 8415 1095 0.0831293 -0.00176899 -0.013465 1 0 1 1 0 0 +EDGE2 8415 1115 0.0400407 -0.0366746 -3.15166 1 0 1 1 0 0 +EDGE2 8415 1135 0.0462338 0.0172778 -3.09363 1 0 1 1 0 0 +EDGE2 8415 1094 -1.0612 0.0377042 -0.0156249 1 0 1 1 0 0 +EDGE2 8415 8354 -1.01349 -0.0203954 -0.0536464 1 0 1 1 0 0 +EDGE2 8415 8414 -1.06135 -0.0386025 -0.00758083 1 0 1 1 0 0 +EDGE2 8415 5874 -0.990941 -0.12719 -0.00510938 1 0 1 1 0 0 +EDGE2 8415 1116 -0.0286705 -0.895544 -1.527 1 0 1 1 0 0 +EDGE2 8415 3036 0.069536 -1.00321 -1.59866 1 0 1 1 0 0 +EDGE2 8415 5796 0.0242787 -1.03151 -1.57858 1 0 1 1 0 0 +EDGE2 8415 1136 -0.04431 -1.04544 -1.52975 1 0 1 1 0 0 +EDGE2 8415 1096 -0.0520649 -0.941242 -1.58887 1 0 1 1 0 0 +EDGE2 8416 5795 -1.04628 -0.00355656 1.56109 1 0 1 1 0 0 +EDGE2 8416 5877 1.09731 0.0898746 -0.00265217 1 0 1 1 0 0 +EDGE2 8416 8397 1.0336 0.0312602 -0.00750709 1 0 1 1 0 0 +EDGE2 8416 8357 0.931509 0.00135091 -0.02981 1 0 1 1 0 0 +EDGE2 8416 3057 1.01728 -0.105909 0.0402428 1 0 1 1 0 0 +EDGE2 8416 5857 0.897019 -0.0103391 -0.0140885 1 0 1 1 0 0 +EDGE2 8416 8356 0.0186238 -0.0215087 -0.038421 1 0 1 1 0 0 +EDGE2 8416 8396 0.0337761 0.0516766 0.0229021 1 0 1 1 0 0 +EDGE2 8416 5856 0.0268347 0.01849 0.0208676 1 0 1 1 0 0 +EDGE2 8416 5876 0.0097499 0.00582124 0.0202912 1 0 1 1 0 0 +EDGE2 8416 3056 -0.0805757 0.0179674 0.00887195 1 0 1 1 0 0 +EDGE2 8416 8395 -1.12808 -0.065136 1.5961 1 0 1 1 0 0 +EDGE2 8416 8415 -0.910196 -0.0171822 -1.57544 1 0 1 1 0 0 +EDGE2 8416 5875 -0.992261 0.0605958 -1.56427 1 0 1 1 0 0 +EDGE2 8416 8355 -0.973065 -0.0383272 -1.56269 1 0 1 1 0 0 +EDGE2 8416 5855 -0.965522 0.0215783 1.57812 1 0 1 1 0 0 +EDGE2 8416 3035 -1.01309 0.0386247 1.53402 1 0 1 1 0 0 +EDGE2 8416 3055 -1.08723 0.0702184 1.58203 1 0 1 1 0 0 +EDGE2 8416 1095 -0.964058 -0.0129916 -1.59733 1 0 1 1 0 0 +EDGE2 8416 1115 -1.07104 0.0491011 1.57097 1 0 1 1 0 0 +EDGE2 8416 1135 -1.0092 -0.0142934 1.56914 1 0 1 1 0 0 +EDGE2 8417 8358 0.968204 0.0374317 -0.0100126 1 0 1 1 0 0 +EDGE2 8417 8398 1.08764 0.080013 -0.016118 1 0 1 1 0 0 +EDGE2 8417 3058 0.971686 0.044993 0.00793838 1 0 1 1 0 0 +EDGE2 8417 5858 1.06393 -0.0309022 0.0093972 1 0 1 1 0 0 +EDGE2 8417 5878 0.974864 -0.0804196 0.0163033 1 0 1 1 0 0 +EDGE2 8417 5877 0.0593304 0.0190355 0.0115493 1 0 1 1 0 0 +EDGE2 8417 8397 -0.00603931 -0.00386485 0.0215679 1 0 1 1 0 0 +EDGE2 8417 8357 0.025039 0.0931984 0.0171374 1 0 1 1 0 0 +EDGE2 8417 3057 -0.0415118 0.0236972 0.00440876 1 0 1 1 0 0 +EDGE2 8417 5857 -0.0267203 0.0631035 0.0139205 1 0 1 1 0 0 +EDGE2 8417 8356 -0.979574 0.00103042 -0.0231035 1 0 1 1 0 0 +EDGE2 8417 8416 -1.00468 -0.00187012 -0.0094408 1 0 1 1 0 0 +EDGE2 8417 8396 -0.982288 0.06815 -0.00709327 1 0 1 1 0 0 +EDGE2 8417 5856 -0.982156 -0.0139728 -0.0108449 1 0 1 1 0 0 +EDGE2 8417 5876 -0.982398 -0.0559706 0.0137937 1 0 1 1 0 0 +EDGE2 8417 3056 -0.973527 -0.0891236 -0.0105674 1 0 1 1 0 0 +EDGE2 8418 8399 1.04358 -0.0821306 -0.0162081 1 0 1 1 0 0 +EDGE2 8418 5859 1.01289 0.0249361 -0.0121378 1 0 1 1 0 0 +EDGE2 8418 5879 0.95471 0.0429154 -0.0258721 1 0 1 1 0 0 +EDGE2 8418 8359 1.08061 -0.012375 -0.019252 1 0 1 1 0 0 +EDGE2 8418 3059 0.906772 0.0239311 0.0163048 1 0 1 1 0 0 +EDGE2 8418 8358 0.0304408 0.0452167 -0.037342 1 0 1 1 0 0 +EDGE2 8418 8398 0.0390565 -0.072419 0.0167043 1 0 1 1 0 0 +EDGE2 8418 3058 -0.0183512 0.0244543 -0.0121556 1 0 1 1 0 0 +EDGE2 8418 5858 0.0436131 0.0503478 0.0224828 1 0 1 1 0 0 +EDGE2 8418 5878 0.0809539 0.0130526 0.0397758 1 0 1 1 0 0 +EDGE2 8418 5877 -0.976726 -0.0497466 -0.00520386 1 0 1 1 0 0 +EDGE2 8418 8397 -1.06412 -0.041917 0.00458844 1 0 1 1 0 0 +EDGE2 8418 8417 -0.969424 0.0871381 -0.010523 1 0 1 1 0 0 +EDGE2 8418 8357 -1.03305 -0.0247134 -0.000243761 1 0 1 1 0 0 +EDGE2 8418 3057 -0.958813 0.0111706 -0.0183168 1 0 1 1 0 0 +EDGE2 8418 5857 -0.990276 -0.0473674 0.00468877 1 0 1 1 0 0 +EDGE2 8419 8360 1.1436 0.0594521 0.0423785 1 0 1 1 0 0 +EDGE2 8419 8400 0.907559 -0.160237 -0.00455122 1 0 1 1 0 0 +EDGE2 8419 8380 0.945276 0.063246 -3.12871 1 0 1 1 0 0 +EDGE2 8419 3060 0.95925 0.0484254 0.00441512 1 0 1 1 0 0 +EDGE2 8419 3160 0.980067 -0.00105756 -3.10006 1 0 1 1 0 0 +EDGE2 8419 5860 1.06829 -0.0473658 -0.00663827 1 0 1 1 0 0 +EDGE2 8419 5880 0.999048 0.0111815 0.00177142 1 0 1 1 0 0 +EDGE2 8419 3080 0.966212 -0.0114385 -3.17318 1 0 1 1 0 0 +EDGE2 8419 1080 0.942863 -0.0526246 -3.15688 1 0 1 1 0 0 +EDGE2 8419 8399 -0.0474175 0.0204675 -0.0170867 1 0 1 1 0 0 +EDGE2 8419 5859 0.00291563 -0.0210869 0.0512879 1 0 1 1 0 0 +EDGE2 8419 5879 0.0375375 0.02606 0.0023928 1 0 1 1 0 0 +EDGE2 8419 8359 -0.100386 -0.0184803 -0.0279236 1 0 1 1 0 0 +EDGE2 8419 3059 -0.0771984 0.0905303 0.00534318 1 0 1 1 0 0 +EDGE2 8419 8358 -1.08199 0.0428654 0.00403603 1 0 1 1 0 0 +EDGE2 8419 8418 -1.08185 0.0745327 -0.000555607 1 0 1 1 0 0 +EDGE2 8419 8398 -1.08189 -0.015328 0.000812136 1 0 1 1 0 0 +EDGE2 8419 3058 -1.07776 0.0510013 -0.0452913 1 0 1 1 0 0 +EDGE2 8419 5858 -0.99655 0.0519082 0.0186564 1 0 1 1 0 0 +EDGE2 8419 5878 -0.772296 -0.0788498 0.0092513 1 0 1 1 0 0 +EDGE2 8420 8360 -0.0732625 -0.0153992 0.0234617 1 0 1 1 0 0 +EDGE2 8420 8379 1.03519 0.0324264 -3.15807 1 0 1 1 0 0 +EDGE2 8420 3079 1.00289 -0.0363822 -3.14588 1 0 1 1 0 0 +EDGE2 8420 3159 0.955204 -0.0343788 -3.13328 1 0 1 1 0 0 +EDGE2 8420 1079 0.966607 0.0249032 -3.10667 1 0 1 1 0 0 +EDGE2 8420 8361 -0.0875864 -1.06026 -1.57354 1 0 1 1 0 0 +EDGE2 8420 8381 0.0395412 -0.968184 -1.56031 1 0 1 1 0 0 +EDGE2 8420 3081 0.0765275 -0.981837 -1.52316 1 0 1 1 0 0 +EDGE2 8420 3161 -0.0502344 -1.00315 -1.60398 1 0 1 1 0 0 +EDGE2 8420 5881 -0.0688622 -1.10232 -1.54336 1 0 1 1 0 0 +EDGE2 8420 3061 0.0339013 -0.990089 -1.57071 1 0 1 1 0 0 +EDGE2 8420 8400 0.0346933 -0.0297728 0.00708281 1 0 1 1 0 0 +EDGE2 8420 8380 0.0334463 0.0322723 -3.11695 1 0 1 1 0 0 +EDGE2 8420 8401 0.0468454 1.02525 1.57067 1 0 1 1 0 0 +EDGE2 8420 3060 -0.00499067 -0.0282463 -0.00485181 1 0 1 1 0 0 +EDGE2 8420 3160 0.0572728 -0.0662547 -3.14744 1 0 1 1 0 0 +EDGE2 8420 5860 0.0600345 -0.0372762 -0.0115717 1 0 1 1 0 0 +EDGE2 8420 5880 0.0349649 -0.0847629 -0.0134262 1 0 1 1 0 0 +EDGE2 8420 3080 -0.0433621 -0.0219146 -3.15198 1 0 1 1 0 0 +EDGE2 8420 1080 -0.0347572 -0.0701144 -3.1076 1 0 1 1 0 0 +EDGE2 8420 1081 0.0206738 0.949791 1.57364 1 0 1 1 0 0 +EDGE2 8420 5861 0.0548742 1.04771 1.58098 1 0 1 1 0 0 +EDGE2 8420 8399 -0.991919 -0.0236049 -0.0257677 1 0 1 1 0 0 +EDGE2 8420 8419 -0.955396 0.0196707 0.0168899 1 0 1 1 0 0 +EDGE2 8420 5859 -0.974536 -0.0500877 -0.0150973 1 0 1 1 0 0 +EDGE2 8420 5879 -0.970605 0.109584 -0.0155065 1 0 1 1 0 0 +EDGE2 8420 8359 -1.05965 0.0222916 -0.0180696 1 0 1 1 0 0 +EDGE2 8420 3059 -0.914732 0.00369666 0.00907692 1 0 1 1 0 0 +EDGE2 8421 8360 -1.03003 -0.00408286 1.56423 1 0 1 1 0 0 +EDGE2 8421 8362 1.02102 0.0421355 0.0370512 1 0 1 1 0 0 +EDGE2 8421 8382 0.955457 -0.092106 0.0335582 1 0 1 1 0 0 +EDGE2 8421 3082 0.947417 0.0263519 0.0023986 1 0 1 1 0 0 +EDGE2 8421 3162 0.971779 0.0409701 0.0207177 1 0 1 1 0 0 +EDGE2 8421 5882 1.01487 -0.0609573 -0.0181244 1 0 1 1 0 0 +EDGE2 8421 3062 0.925117 0.0964457 -0.0356323 1 0 1 1 0 0 +EDGE2 8421 8361 0.0349705 -0.0435836 0.0368576 1 0 1 1 0 0 +EDGE2 8421 8381 -0.00302199 -0.0807081 -0.0149033 1 0 1 1 0 0 +EDGE2 8421 3081 0.044035 -0.0828869 0.029098 1 0 1 1 0 0 +EDGE2 8421 3161 0.0159788 0.0019708 0.026974 1 0 1 1 0 0 +EDGE2 8421 5881 -0.0589912 0.0372523 0.0389454 1 0 1 1 0 0 +EDGE2 8421 3061 0.0293885 -0.0262328 -0.00426437 1 0 1 1 0 0 +EDGE2 8421 8400 -0.901156 0.0461764 1.56726 1 0 1 1 0 0 +EDGE2 8421 8420 -0.96881 0.0179417 1.57233 1 0 1 1 0 0 +EDGE2 8421 8380 -0.975966 -0.0418414 -1.55785 1 0 1 1 0 0 +EDGE2 8421 3060 -0.971189 0.09021 1.59547 1 0 1 1 0 0 +EDGE2 8421 3160 -1.01339 -0.0273294 -1.59392 1 0 1 1 0 0 +EDGE2 8421 5860 -0.915681 0.00858565 1.57183 1 0 1 1 0 0 +EDGE2 8421 5880 -0.956754 0.0834762 1.5576 1 0 1 1 0 0 +EDGE2 8421 3080 -0.986869 -0.024395 -1.5837 1 0 1 1 0 0 +EDGE2 8421 1080 -1.01123 0.0387449 -1.5515 1 0 1 1 0 0 +EDGE2 8422 8363 0.952901 0.0103045 -0.0240137 1 0 1 1 0 0 +EDGE2 8422 8383 1.03755 0.0846337 0.0224972 1 0 1 1 0 0 +EDGE2 8422 3083 0.974099 0.0440621 0.013479 1 0 1 1 0 0 +EDGE2 8422 3163 1.04469 -0.102033 0.0116571 1 0 1 1 0 0 +EDGE2 8422 5883 1.10105 0.0150028 -0.00447232 1 0 1 1 0 0 +EDGE2 8422 3063 1.01388 -0.0231098 0.00560072 1 0 1 1 0 0 +EDGE2 8422 8362 -0.0764477 -0.00728988 0.0147378 1 0 1 1 0 0 +EDGE2 8422 8382 -0.0692266 -0.0226263 -0.0030421 1 0 1 1 0 0 +EDGE2 8422 3082 -0.0170675 -0.019817 -0.0122403 1 0 1 1 0 0 +EDGE2 8422 3162 -0.00188889 0.0120945 -0.0141557 1 0 1 1 0 0 +EDGE2 8422 5882 0.0464923 -0.0729425 0.00783158 1 0 1 1 0 0 +EDGE2 8422 3062 -0.0124231 0.0137651 0.00382413 1 0 1 1 0 0 +EDGE2 8422 8361 -1.03282 -0.0226785 -0.0180497 1 0 1 1 0 0 +EDGE2 8422 8421 -0.937064 -0.075585 -0.00415427 1 0 1 1 0 0 +EDGE2 8422 8381 -1.03713 0.00423922 -0.00501151 1 0 1 1 0 0 +EDGE2 8422 3081 -0.973473 -0.00897231 -0.00405082 1 0 1 1 0 0 +EDGE2 8422 3161 -0.971764 -0.0579206 -0.0142249 1 0 1 1 0 0 +EDGE2 8422 5881 -1.06853 0.0337899 0.0211559 1 0 1 1 0 0 +EDGE2 8422 3061 -0.908942 -0.0217506 0.00460748 1 0 1 1 0 0 +EDGE2 8423 3064 0.979508 -0.0674249 0.0329178 1 0 1 1 0 0 +EDGE2 8423 8384 0.95354 -0.0110803 -0.0155975 1 0 1 1 0 0 +EDGE2 8423 3164 0.97968 -0.0152114 -0.000519064 1 0 1 1 0 0 +EDGE2 8423 5884 1.02873 0.0126907 -0.00939896 1 0 1 1 0 0 +EDGE2 8423 8364 1.00254 0.0241888 0.0174906 1 0 1 1 0 0 +EDGE2 8423 3084 1.01267 6.33972e-07 0.00780197 1 0 1 1 0 0 +EDGE2 8423 8363 0.00689516 0.0235671 -0.0504364 1 0 1 1 0 0 +EDGE2 8423 8383 -0.0312696 0.0561737 -0.0177824 1 0 1 1 0 0 +EDGE2 8423 3083 -0.038198 -0.0489679 -0.0020806 1 0 1 1 0 0 +EDGE2 8423 3163 0.0436681 0.0456327 -0.0177529 1 0 1 1 0 0 +EDGE2 8423 5883 0.00613448 0.0113747 0.00577943 1 0 1 1 0 0 +EDGE2 8423 3063 0.0307745 0.049952 -0.013732 1 0 1 1 0 0 +EDGE2 8423 8362 -0.963381 -0.0373796 -0.00644727 1 0 1 1 0 0 +EDGE2 8423 8422 -0.999655 -0.0335442 -0.00491679 1 0 1 1 0 0 +EDGE2 8423 8382 -1.04314 0.0106207 -0.0366999 1 0 1 1 0 0 +EDGE2 8423 3082 -1.03369 0.154652 0.0162202 1 0 1 1 0 0 +EDGE2 8423 3162 -0.983593 -0.0244841 -0.0372884 1 0 1 1 0 0 +EDGE2 8423 5882 -1.08041 0.106725 -0.0249789 1 0 1 1 0 0 +EDGE2 8423 3062 -0.951612 -0.0847273 0.0154232 1 0 1 1 0 0 +EDGE2 8424 8385 1.01064 -0.00205338 -0.0194449 1 0 1 1 0 0 +EDGE2 8424 3105 1.10814 -0.000431645 -3.14082 1 0 1 1 0 0 +EDGE2 8424 3485 1.04251 -0.0653311 -3.09583 1 0 1 1 0 0 +EDGE2 8424 5845 1.08483 -0.0499478 -3.13278 1 0 1 1 0 0 +EDGE2 8424 5885 1.01896 0.0389715 0.0174533 1 0 1 1 0 0 +EDGE2 8424 8365 0.983914 -0.0240208 -0.0281883 1 0 1 1 0 0 +EDGE2 8424 5825 0.879446 0.00792798 -3.11013 1 0 1 1 0 0 +EDGE2 8424 3145 0.98997 -0.0602677 -3.16617 1 0 1 1 0 0 +EDGE2 8424 3165 1.07489 -0.00330571 -0.0351677 1 0 1 1 0 0 +EDGE2 8424 3385 0.99831 0.054285 -3.12349 1 0 1 1 0 0 +EDGE2 8424 3125 1.19365 0.020294 -3.1543 1 0 1 1 0 0 +EDGE2 8424 1185 1.04213 -0.085317 -3.09877 1 0 1 1 0 0 +EDGE2 8424 3065 1.03329 -0.0218792 -0.0121636 1 0 1 1 0 0 +EDGE2 8424 3085 0.997819 -0.0390049 0.00371553 1 0 1 1 0 0 +EDGE2 8424 1165 0.995589 0.0275137 -3.1419 1 0 1 1 0 0 +EDGE2 8424 3064 0.0861222 0.0421256 -0.0262218 1 0 1 1 0 0 +EDGE2 8424 8384 2.34909e-05 0.023761 -0.00804375 1 0 1 1 0 0 +EDGE2 8424 3164 -0.0177701 0.00115975 -0.0182824 1 0 1 1 0 0 +EDGE2 8424 5884 -0.0253041 0.050276 -0.00552217 1 0 1 1 0 0 +EDGE2 8424 8364 -0.039096 0.0817278 -0.032963 1 0 1 1 0 0 +EDGE2 8424 3084 0.00492884 0.00292604 0.0409986 1 0 1 1 0 0 +EDGE2 8424 8363 -1.00009 -0.0233018 -0.00900576 1 0 1 1 0 0 +EDGE2 8424 8423 -0.975923 -0.00868108 0.0051707 1 0 1 1 0 0 +EDGE2 8424 8383 -0.990502 -0.0415403 -0.0162326 1 0 1 1 0 0 +EDGE2 8424 3083 -0.982359 0.0880415 0.00756186 1 0 1 1 0 0 +EDGE2 8424 3163 -1.03603 0.0126883 0.0109768 1 0 1 1 0 0 +EDGE2 8424 5883 -0.976631 0.051134 -0.00129023 1 0 1 1 0 0 +EDGE2 8424 3063 -0.988837 0.00375053 -0.0273868 1 0 1 1 0 0 +EDGE2 8425 8385 0.0506505 0.014908 -0.0192405 1 0 1 1 0 0 +EDGE2 8425 8366 0.020614 0.926688 1.53142 1 0 1 1 0 0 +EDGE2 8425 3146 -0.00362339 0.982021 1.53638 1 0 1 1 0 0 +EDGE2 8425 3386 0.0594061 0.895683 1.56521 1 0 1 1 0 0 +EDGE2 8425 5886 0.0582071 0.973844 1.55037 1 0 1 1 0 0 +EDGE2 8425 3066 0.019446 1.06944 1.63355 1 0 1 1 0 0 +EDGE2 8425 3144 0.989212 0.0278119 -3.14419 1 0 1 1 0 0 +EDGE2 8425 3484 1.00488 -0.0271793 -3.1045 1 0 1 1 0 0 +EDGE2 8425 5824 0.957566 0.0180663 -3.13205 1 0 1 1 0 0 +EDGE2 8425 5844 1.04751 0.0460534 -3.13401 1 0 1 1 0 0 +EDGE2 8425 3384 0.904241 0.0343078 -3.14001 1 0 1 1 0 0 +EDGE2 8425 1184 1.0253 0.0700486 -3.13192 1 0 1 1 0 0 +EDGE2 8425 3104 0.949174 0.0159307 -3.14595 1 0 1 1 0 0 +EDGE2 8425 3124 0.970925 0.0470657 -3.16004 1 0 1 1 0 0 +EDGE2 8425 1164 1.00114 0.0356815 -3.1243 1 0 1 1 0 0 +EDGE2 8425 3166 -0.0272849 -0.983143 -1.60393 1 0 1 1 0 0 +EDGE2 8425 3105 -0.0215554 0.0232824 -3.15472 1 0 1 1 0 0 +EDGE2 8425 3485 -0.0763394 -0.156392 -3.15544 1 0 1 1 0 0 +EDGE2 8425 5845 0.0284012 0.0106987 -3.11775 1 0 1 1 0 0 +EDGE2 8425 5885 -0.0552982 -0.00271133 0.00435374 1 0 1 1 0 0 +EDGE2 8425 8365 0.00709731 -0.00659204 -0.00796669 1 0 1 1 0 0 +EDGE2 8425 5825 0.0155783 0.0607486 -3.1423 1 0 1 1 0 0 +EDGE2 8425 3145 -0.0136633 0.0570919 -3.14679 1 0 1 1 0 0 +EDGE2 8425 3165 -0.00992706 -0.107467 0.0144529 1 0 1 1 0 0 +EDGE2 8425 3385 0.105995 0.0740021 -3.14026 1 0 1 1 0 0 +EDGE2 8425 3125 0.00858979 0.008265 -3.15292 1 0 1 1 0 0 +EDGE2 8425 1185 -0.0357619 0.0547708 -3.11802 1 0 1 1 0 0 +EDGE2 8425 3065 -0.0349761 0.0320484 0.00961692 1 0 1 1 0 0 +EDGE2 8425 3085 0.0666539 -0.0169513 -0.0172278 1 0 1 1 0 0 +EDGE2 8425 1165 0.0103306 -0.0401994 -3.12076 1 0 1 1 0 0 +EDGE2 8425 5826 0.0129376 -1.05248 -1.58032 1 0 1 1 0 0 +EDGE2 8425 5846 0.0759961 -1.13105 -1.54253 1 0 1 1 0 0 +EDGE2 8425 8386 0.0667088 -1.13717 -1.56487 1 0 1 1 0 0 +EDGE2 8425 3486 -0.0408208 -0.971673 -1.58087 1 0 1 1 0 0 +EDGE2 8425 1166 -0.0269054 -1.06671 -1.57827 1 0 1 1 0 0 +EDGE2 8425 3086 0.0549432 -1.03246 -1.55611 1 0 1 1 0 0 +EDGE2 8425 3106 0.00144689 -1.02917 -1.54861 1 0 1 1 0 0 +EDGE2 8425 3126 -0.0083234 -1.05321 -1.55472 1 0 1 1 0 0 +EDGE2 8425 1186 0.015846 -1.08659 -1.60215 1 0 1 1 0 0 +EDGE2 8425 3064 -0.926184 -0.0720696 0.000708495 1 0 1 1 0 0 +EDGE2 8425 8384 -1.01097 0.0390928 0.0182582 1 0 1 1 0 0 +EDGE2 8425 8424 -1.03477 -0.0366238 0.00162742 1 0 1 1 0 0 +EDGE2 8425 3164 -1.04192 0.049626 0.0269002 1 0 1 1 0 0 +EDGE2 8425 5884 -1.028 -0.000677677 0.00369117 1 0 1 1 0 0 +EDGE2 8425 8364 -0.972905 -0.0184435 0.0423469 1 0 1 1 0 0 +EDGE2 8425 3084 -1.0354 0.0590343 -0.0041022 1 0 1 1 0 0 +EDGE2 8426 8385 -0.98168 -0.0304138 -1.57982 1 0 1 1 0 0 +EDGE2 8426 8366 0.0589356 -0.0201389 -0.00740711 1 0 1 1 0 0 +EDGE2 8426 3147 0.978872 0.0264755 0.00581854 1 0 1 1 0 0 +EDGE2 8426 5887 0.907276 0.00833539 0.0167502 1 0 1 1 0 0 +EDGE2 8426 8367 1.05246 -0.129674 0.000738575 1 0 1 1 0 0 +EDGE2 8426 3387 0.962392 0.00478847 -0.0106862 1 0 1 1 0 0 +EDGE2 8426 3067 0.98976 -0.0288296 -0.020024 1 0 1 1 0 0 +EDGE2 8426 3146 -0.0550003 -0.0655633 -0.0090623 1 0 1 1 0 0 +EDGE2 8426 3386 0.0222387 -0.0138495 -0.0246524 1 0 1 1 0 0 +EDGE2 8426 5886 -0.0613406 0.0636665 -0.000394407 1 0 1 1 0 0 +EDGE2 8426 3066 -0.0615617 0.0160215 -0.0121625 1 0 1 1 0 0 +EDGE2 8426 8425 -1.01926 -0.106747 -1.52212 1 0 1 1 0 0 +EDGE2 8426 3105 -1.02946 -0.0439944 1.55385 1 0 1 1 0 0 +EDGE2 8426 3485 -1.02025 0.0356011 1.57287 1 0 1 1 0 0 +EDGE2 8426 5845 -1.00495 -0.0261771 1.58569 1 0 1 1 0 0 +EDGE2 8426 5885 -0.944609 0.0210977 -1.53523 1 0 1 1 0 0 +EDGE2 8426 8365 -1.05454 0.0905726 -1.56568 1 0 1 1 0 0 +EDGE2 8426 5825 -0.999873 -0.0112772 1.57278 1 0 1 1 0 0 +EDGE2 8426 3145 -0.922388 -0.0282821 1.53975 1 0 1 1 0 0 +EDGE2 8426 3165 -1.00577 -0.0130378 -1.57174 1 0 1 1 0 0 +EDGE2 8426 3385 -1.00207 0.00951057 1.58365 1 0 1 1 0 0 +EDGE2 8426 3125 -1.05483 -0.0796023 1.56435 1 0 1 1 0 0 +EDGE2 8426 1185 -0.904428 -0.113894 1.55375 1 0 1 1 0 0 +EDGE2 8426 3065 -1.01733 -0.0486182 -1.54833 1 0 1 1 0 0 +EDGE2 8426 3085 -0.982939 -0.00379873 -1.55999 1 0 1 1 0 0 +EDGE2 8426 1165 -1.00776 -0.0230236 1.53835 1 0 1 1 0 0 +EDGE2 8427 8366 -1.0253 -0.00245014 -0.0156322 1 0 1 1 0 0 +EDGE2 8427 5888 1.01786 -0.0106331 0.00840586 1 0 1 1 0 0 +EDGE2 8427 8368 0.974375 0.000312161 -0.00584596 1 0 1 1 0 0 +EDGE2 8427 3068 0.987284 0.0176799 -0.00372174 1 0 1 1 0 0 +EDGE2 8427 3148 1.02224 0.0524768 -0.000811971 1 0 1 1 0 0 +EDGE2 8427 3388 0.891611 0.04506 -0.0595237 1 0 1 1 0 0 +EDGE2 8427 3147 -0.0718691 -0.101678 0.0182678 1 0 1 1 0 0 +EDGE2 8427 5887 0.00752428 -0.0717483 -0.0225841 1 0 1 1 0 0 +EDGE2 8427 8367 -0.0453565 0.00191145 -0.00716407 1 0 1 1 0 0 +EDGE2 8427 3387 0.073528 -0.0275634 0.00308887 1 0 1 1 0 0 +EDGE2 8427 3067 0.0211105 0.0327205 0.018536 1 0 1 1 0 0 +EDGE2 8427 8426 -0.960122 0.0477263 0.0132127 1 0 1 1 0 0 +EDGE2 8427 3146 -1.02235 0.0400152 -0.00310428 1 0 1 1 0 0 +EDGE2 8427 3386 -1.02377 0.00468195 0.0440544 1 0 1 1 0 0 +EDGE2 8427 5886 -1.04476 -0.040069 -0.050051 1 0 1 1 0 0 +EDGE2 8427 3066 -0.995988 -0.0540074 0.0151817 1 0 1 1 0 0 +EDGE2 8428 5889 0.989658 0.0406414 -0.039105 1 0 1 1 0 0 +EDGE2 8428 8369 0.919332 -0.0353217 0.0322696 1 0 1 1 0 0 +EDGE2 8428 3149 1.03216 -0.0525518 -0.00984701 1 0 1 1 0 0 +EDGE2 8428 3389 1.0313 0.112113 -0.0311443 1 0 1 1 0 0 +EDGE2 8428 3069 0.931279 -0.0127197 -0.00384727 1 0 1 1 0 0 +EDGE2 8428 5888 -0.100623 -0.0262412 -0.0234699 1 0 1 1 0 0 +EDGE2 8428 8368 -0.0781603 0.0381289 0.0037641 1 0 1 1 0 0 +EDGE2 8428 3068 -0.00661719 0.0384641 -0.0217704 1 0 1 1 0 0 +EDGE2 8428 3148 -0.0476265 0.0209039 0.0444677 1 0 1 1 0 0 +EDGE2 8428 3388 -0.0349442 -0.0662634 -0.00946715 1 0 1 1 0 0 +EDGE2 8428 3147 -1.05394 0.0297193 0.0153454 1 0 1 1 0 0 +EDGE2 8428 5887 -1.07807 -0.0628673 0.0177478 1 0 1 1 0 0 +EDGE2 8428 8367 -0.992315 -0.0101051 -0.00496294 1 0 1 1 0 0 +EDGE2 8428 8427 -0.979793 0.0763163 -0.0214749 1 0 1 1 0 0 +EDGE2 8428 3387 -0.925805 -0.0158038 0.0260705 1 0 1 1 0 0 +EDGE2 8428 3067 -0.940585 0.0334855 0.011734 1 0 1 1 0 0 +EDGE2 8429 8370 0.951165 -0.0113568 0.020723 1 0 1 1 0 0 +EDGE2 8429 3070 0.986277 -0.0234101 0.00220665 1 0 1 1 0 0 +EDGE2 8429 3390 1.0638 0.0210055 0.00163842 1 0 1 1 0 0 +EDGE2 8429 3410 0.984561 -0.0799562 -3.16352 1 0 1 1 0 0 +EDGE2 8429 5890 1.10663 -0.0265275 -0.0404818 1 0 1 1 0 0 +EDGE2 8429 3150 1.04756 -0.108069 -0.0223792 1 0 1 1 0 0 +EDGE2 8429 5889 -0.0384445 0.0913216 0.00310463 1 0 1 1 0 0 +EDGE2 8429 8369 0.00844446 -0.0759042 0.0192373 1 0 1 1 0 0 +EDGE2 8429 3149 -0.0292588 0.0383731 -0.017449 1 0 1 1 0 0 +EDGE2 8429 3389 -0.0907127 -0.0467157 -0.00864091 1 0 1 1 0 0 +EDGE2 8429 3069 -0.0341205 0.0320763 -0.00874952 1 0 1 1 0 0 +EDGE2 8429 5888 -1.05373 0.0975228 0.0195227 1 0 1 1 0 0 +EDGE2 8429 8428 -1.00144 0.00863867 -0.0252673 1 0 1 1 0 0 +EDGE2 8429 8368 -1.06587 0.0835436 0.00864748 1 0 1 1 0 0 +EDGE2 8429 3068 -1.04958 0.0520361 -0.0282595 1 0 1 1 0 0 +EDGE2 8429 3148 -0.883027 0.0346519 0.0263795 1 0 1 1 0 0 +EDGE2 8429 3388 -0.950883 0.00914942 0.0067829 1 0 1 1 0 0 +EDGE2 8430 3409 1.05103 -0.0703885 -3.14551 1 0 1 1 0 0 +EDGE2 8430 8370 0.0514844 -0.0616655 0.0204674 1 0 1 1 0 0 +EDGE2 8430 3411 -0.037963 -1.01785 -1.55825 1 0 1 1 0 0 +EDGE2 8430 5891 0.0472156 -0.948228 -1.57801 1 0 1 1 0 0 +EDGE2 8430 3391 -0.0712758 -0.965693 -1.53284 1 0 1 1 0 0 +EDGE2 8430 3070 0.0621391 -0.00774557 -0.00402013 1 0 1 1 0 0 +EDGE2 8430 3390 0.0279369 0.00519691 0.00440739 1 0 1 1 0 0 +EDGE2 8430 3410 -0.122916 -0.102908 -3.14998 1 0 1 1 0 0 +EDGE2 8430 5890 0.0139225 0.00760279 -0.0053891 1 0 1 1 0 0 +EDGE2 8430 3150 0.0148625 0.0621082 0.0351609 1 0 1 1 0 0 +EDGE2 8430 5889 -0.981746 -0.00916772 0.00402059 1 0 1 1 0 0 +EDGE2 8430 8429 -0.881449 -0.0687367 -0.0111107 1 0 1 1 0 0 +EDGE2 8430 8369 -1.09224 0.0230356 0.0016883 1 0 1 1 0 0 +EDGE2 8430 3149 -1.08284 0.0503122 -0.0214175 1 0 1 1 0 0 +EDGE2 8430 3389 -0.862647 -0.0570369 0.00157328 1 0 1 1 0 0 +EDGE2 8430 3069 -1.07421 -0.0590079 0.0293529 1 0 1 1 0 0 +EDGE2 8430 3151 -0.0451656 1.03172 1.52824 1 0 1 1 0 0 +EDGE2 8430 8371 -0.00988632 1.06501 1.5668 1 0 1 1 0 0 +EDGE2 8430 3071 0.0346742 1.02918 1.55231 1 0 1 1 0 0 +EDGE2 8431 8370 -0.916774 0.0109545 1.55289 1 0 1 1 0 0 +EDGE2 8431 3412 0.995304 -0.0908207 -0.0163406 1 0 1 1 0 0 +EDGE2 8431 5892 1.03049 -0.0815472 0.0196854 1 0 1 1 0 0 +EDGE2 8431 3392 1.00494 0.0201423 -0.0236085 1 0 1 1 0 0 +EDGE2 8431 3411 0.126473 0.0157364 -0.0232513 1 0 1 1 0 0 +EDGE2 8431 5891 0.0737113 -0.0268237 0.0284227 1 0 1 1 0 0 +EDGE2 8431 3391 -0.0615583 -0.0239269 -0.0213558 1 0 1 1 0 0 +EDGE2 8431 8430 -0.933668 -0.0441963 1.58188 1 0 1 1 0 0 +EDGE2 8431 3070 -0.979668 -0.0668062 1.62034 1 0 1 1 0 0 +EDGE2 8431 3390 -0.950298 0.0624719 1.57509 1 0 1 1 0 0 +EDGE2 8431 3410 -0.966258 -0.0273578 -1.54272 1 0 1 1 0 0 +EDGE2 8431 5890 -1.01389 0.0194049 1.59595 1 0 1 1 0 0 +EDGE2 8431 3150 -1.01338 -0.121866 1.54133 1 0 1 1 0 0 +EDGE2 8432 3413 1.08871 0.0905748 0.00682127 1 0 1 1 0 0 +EDGE2 8432 5893 0.955337 0.0315682 0.0255097 1 0 1 1 0 0 +EDGE2 8432 3393 0.885364 0.122132 0.0503374 1 0 1 1 0 0 +EDGE2 8432 3412 -0.0573552 0.00998076 0.00829245 1 0 1 1 0 0 +EDGE2 8432 5892 -0.0247738 -0.0560657 -0.00361032 1 0 1 1 0 0 +EDGE2 8432 3392 0.0151846 -0.0373536 0.0173605 1 0 1 1 0 0 +EDGE2 8432 3411 -0.964538 -0.0253827 -0.00685109 1 0 1 1 0 0 +EDGE2 8432 5891 -0.942308 0.00556454 -0.00946714 1 0 1 1 0 0 +EDGE2 8432 8431 -0.950725 0.0634293 -0.00364252 1 0 1 1 0 0 +EDGE2 8432 3391 -0.972154 -0.103733 -0.0143899 1 0 1 1 0 0 +EDGE2 8433 3414 1.0434 0.00963428 -0.000468842 1 0 1 1 0 0 +EDGE2 8433 5894 1.01847 -0.0415764 -0.0106149 1 0 1 1 0 0 +EDGE2 8433 3394 0.983366 -0.0325384 -0.00943365 1 0 1 1 0 0 +EDGE2 8433 3413 0.0135415 0.0502478 -0.040777 1 0 1 1 0 0 +EDGE2 8433 5893 0.024833 0.02996 0.00050388 1 0 1 1 0 0 +EDGE2 8433 3393 -0.0887292 0.0381983 0.0235702 1 0 1 1 0 0 +EDGE2 8433 3412 -0.978233 -0.00228983 0.00295705 1 0 1 1 0 0 +EDGE2 8433 5892 -1.01132 -0.00467299 -0.0139581 1 0 1 1 0 0 +EDGE2 8433 8432 -1.07499 0.0172194 0.0284746 1 0 1 1 0 0 +EDGE2 8433 3392 -1.01036 0.0457214 -0.0128902 1 0 1 1 0 0 +EDGE2 8434 3395 1.03371 -0.0566046 0.0162901 1 0 1 1 0 0 +EDGE2 8434 3435 0.99718 0.106919 -3.12768 1 0 1 1 0 0 +EDGE2 8434 5895 0.876306 -0.0854308 -0.0113108 1 0 1 1 0 0 +EDGE2 8434 3415 0.955965 0.0800738 -0.00373606 1 0 1 1 0 0 +EDGE2 8434 855 0.949649 -0.0454804 -3.10687 1 0 1 1 0 0 +EDGE2 8434 895 0.977683 -0.0145598 -3.11371 1 0 1 1 0 0 +EDGE2 8434 915 0.995142 -0.0348424 -3.15526 1 0 1 1 0 0 +EDGE2 8434 835 1.05143 0.0235002 -3.183 1 0 1 1 0 0 +EDGE2 8434 3414 0.0401894 0.0594101 0.0121645 1 0 1 1 0 0 +EDGE2 8434 5894 0.0173628 0.034935 0.0108437 1 0 1 1 0 0 +EDGE2 8434 3394 0.0199546 -0.0179806 0.0172337 1 0 1 1 0 0 +EDGE2 8434 3413 -0.984807 -0.0234942 -0.00142557 1 0 1 1 0 0 +EDGE2 8434 5893 -0.970231 0.0581652 -0.0150748 1 0 1 1 0 0 +EDGE2 8434 8433 -1.01664 0.0511732 -0.044897 1 0 1 1 0 0 +EDGE2 8434 3393 -1.0137 0.0204832 0.0323654 1 0 1 1 0 0 +EDGE2 8435 3395 -0.0414752 0.0681825 0.0101041 1 0 1 1 0 0 +EDGE2 8435 3396 -0.083697 0.983634 1.55108 1 0 1 1 0 0 +EDGE2 8435 5896 -0.00864432 1.00554 1.55622 1 0 1 1 0 0 +EDGE2 8435 916 0.0228252 1.01137 1.55664 1 0 1 1 0 0 +EDGE2 8435 3434 0.948152 -0.0744797 -3.14598 1 0 1 1 0 0 +EDGE2 8435 894 0.977599 -0.0743726 -3.166 1 0 1 1 0 0 +EDGE2 8435 914 0.97185 0.000387352 -3.15229 1 0 1 1 0 0 +EDGE2 8435 834 0.994122 -0.00702529 -3.10864 1 0 1 1 0 0 +EDGE2 8435 854 0.970868 0.0394569 -3.14107 1 0 1 1 0 0 +EDGE2 8435 3435 0.0311351 -0.00238325 -3.12901 1 0 1 1 0 0 +EDGE2 8435 5895 -0.0732357 -0.0244209 0.000804741 1 0 1 1 0 0 +EDGE2 8435 3415 0.0316311 -0.0145532 0.0257758 1 0 1 1 0 0 +EDGE2 8435 855 -0.0493252 0.0441905 -3.17074 1 0 1 1 0 0 +EDGE2 8435 895 -0.0114385 0.0379184 -3.1251 1 0 1 1 0 0 +EDGE2 8435 915 -0.0239597 -0.0353174 -3.10634 1 0 1 1 0 0 +EDGE2 8435 835 0.0241578 0.0182829 -3.15213 1 0 1 1 0 0 +EDGE2 8435 3414 -0.996914 -0.0163962 0.0344277 1 0 1 1 0 0 +EDGE2 8435 5894 -1.01444 0.0665922 -0.0319444 1 0 1 1 0 0 +EDGE2 8435 8434 -1.06365 0.0589021 0.018145 1 0 1 1 0 0 +EDGE2 8435 3394 -0.992558 0.0557507 0.00752404 1 0 1 1 0 0 +EDGE2 8435 3436 0.0888143 -1.00852 -1.54077 1 0 1 1 0 0 +EDGE2 8435 856 -0.0461703 -0.95057 -1.56953 1 0 1 1 0 0 +EDGE2 8435 896 0.00228264 -1.01347 -1.56878 1 0 1 1 0 0 +EDGE2 8435 3416 -0.079992 -0.984365 -1.57869 1 0 1 1 0 0 +EDGE2 8435 836 -0.0544042 -0.960657 -1.61592 1 0 1 1 0 0 +EDGE2 8436 3395 -0.990309 0.0246658 -1.57788 1 0 1 1 0 0 +EDGE2 8436 917 0.971926 0.0123818 -0.0370808 1 0 1 1 0 0 +EDGE2 8436 3397 1.05778 -0.021701 0.0119211 1 0 1 1 0 0 +EDGE2 8436 5897 1.01378 0.0126472 -0.0138461 1 0 1 1 0 0 +EDGE2 8436 3396 -0.0576402 -0.0351833 0.0227182 1 0 1 1 0 0 +EDGE2 8436 5896 -0.0620818 -0.000456091 0.0113207 1 0 1 1 0 0 +EDGE2 8436 916 -0.0147159 -0.0422282 0.0133071 1 0 1 1 0 0 +EDGE2 8436 8435 -0.999395 -0.0453763 -1.56362 1 0 1 1 0 0 +EDGE2 8436 3435 -1.00813 0.0452034 1.56256 1 0 1 1 0 0 +EDGE2 8436 5895 -0.994462 -0.0601218 -1.57466 1 0 1 1 0 0 +EDGE2 8436 3415 -0.952466 0.0107835 -1.57846 1 0 1 1 0 0 +EDGE2 8436 855 -1.03191 -0.0260295 1.57354 1 0 1 1 0 0 +EDGE2 8436 895 -1.01024 -0.0556945 1.59519 1 0 1 1 0 0 +EDGE2 8436 915 -0.978533 0.0479055 1.58162 1 0 1 1 0 0 +EDGE2 8436 835 -0.959429 0.0631418 1.54875 1 0 1 1 0 0 +EDGE2 8437 918 0.953955 -0.00743798 -0.00678102 1 0 1 1 0 0 +EDGE2 8437 3398 1.09998 0.0289501 -0.0306566 1 0 1 1 0 0 +EDGE2 8437 5898 0.965677 -0.0022581 -0.0147458 1 0 1 1 0 0 +EDGE2 8437 917 0.00648334 -0.0706044 -0.0297639 1 0 1 1 0 0 +EDGE2 8437 3397 0.0899366 0.0331519 -0.0210509 1 0 1 1 0 0 +EDGE2 8437 5897 0.022467 0.00162266 -0.00541621 1 0 1 1 0 0 +EDGE2 8437 3396 -0.898693 -0.00909246 -0.0117406 1 0 1 1 0 0 +EDGE2 8437 5896 -1.06416 -0.00147994 -0.0179319 1 0 1 1 0 0 +EDGE2 8437 8436 -1.05582 0.017351 -0.00967498 1 0 1 1 0 0 +EDGE2 8437 916 -0.945267 -0.058234 0.0480143 1 0 1 1 0 0 +EDGE2 8438 5899 1.03645 0.0725187 0.028234 1 0 1 1 0 0 +EDGE2 8438 919 0.943905 -0.0311689 0.0164014 1 0 1 1 0 0 +EDGE2 8438 3399 0.924763 -0.0156869 0.0196491 1 0 1 1 0 0 +EDGE2 8438 918 -0.0214396 0.0159655 0.0215367 1 0 1 1 0 0 +EDGE2 8438 3398 -0.060152 0.068066 -0.0277085 1 0 1 1 0 0 +EDGE2 8438 5898 -0.032331 -0.0552056 0.0263946 1 0 1 1 0 0 +EDGE2 8438 8437 -1.00598 -0.012645 -0.0238608 1 0 1 1 0 0 +EDGE2 8438 917 -1.03986 0.0622347 0.0415226 1 0 1 1 0 0 +EDGE2 8438 3397 -0.948442 0.0160023 -0.00711265 1 0 1 1 0 0 +EDGE2 8438 5897 -1.02831 0.0334101 0.0188663 1 0 1 1 0 0 +EDGE2 8439 5900 1.01281 0.00049892 0.0141603 1 0 1 1 0 0 +EDGE2 8439 920 1.0392 -0.0716912 0.00181023 1 0 1 1 0 0 +EDGE2 8439 3400 1.0421 0.0215843 -0.00584432 1 0 1 1 0 0 +EDGE2 8439 680 1.00351 -0.0156836 -3.14752 1 0 1 1 0 0 +EDGE2 8439 5899 -0.0709558 -0.0539258 -0.0214413 1 0 1 1 0 0 +EDGE2 8439 8438 -1.05397 -0.0699431 -0.0195618 1 0 1 1 0 0 +EDGE2 8439 919 0.101754 0.0344897 0.00064472 1 0 1 1 0 0 +EDGE2 8439 3399 0.00387903 0.0377794 -0.0133138 1 0 1 1 0 0 +EDGE2 8439 918 -0.972976 -0.0479999 -0.027439 1 0 1 1 0 0 +EDGE2 8439 3398 -0.931681 0.0373698 0.0372857 1 0 1 1 0 0 +EDGE2 8439 5898 -0.936435 0.00100517 0.0299862 1 0 1 1 0 0 +EDGE2 8440 921 -0.0225688 1.04708 1.59696 1 0 1 1 0 0 +EDGE2 8440 679 1.02614 -0.0604892 -3.15794 1 0 1 1 0 0 +EDGE2 8440 681 0.0963252 -1.02653 -1.57924 1 0 1 1 0 0 +EDGE2 8440 5901 -0.031388 -0.908649 -1.59367 1 0 1 1 0 0 +EDGE2 8440 5900 -0.0462604 0.0573766 0.0299747 1 0 1 1 0 0 +EDGE2 8440 920 0.0169649 0.0417616 -0.0584955 1 0 1 1 0 0 +EDGE2 8440 3400 -0.0426625 0.019845 -0.000594631 1 0 1 1 0 0 +EDGE2 8440 680 0.00290326 -0.0701386 -3.11798 1 0 1 1 0 0 +EDGE2 8440 3401 0.00907684 0.970274 1.55884 1 0 1 1 0 0 +EDGE2 8440 5899 -0.991129 0.0271991 -0.0193577 1 0 1 1 0 0 +EDGE2 8440 8439 -0.931264 -0.0318626 0.0220714 1 0 1 1 0 0 +EDGE2 8440 919 -0.991363 -0.0114008 -0.00586917 1 0 1 1 0 0 +EDGE2 8440 3399 -0.956257 -0.00603452 0.0124013 1 0 1 1 0 0 +EDGE2 8441 921 -0.0519487 -0.0273559 -0.0162891 1 0 1 1 0 0 +EDGE2 8441 5900 -1.00233 0.00508024 -1.54891 1 0 1 1 0 0 +EDGE2 8441 8440 -0.959039 -0.111245 -1.55979 1 0 1 1 0 0 +EDGE2 8441 920 -1.04818 0.0357436 -1.60047 1 0 1 1 0 0 +EDGE2 8441 3400 -0.90504 -0.0518258 -1.59332 1 0 1 1 0 0 +EDGE2 8441 680 -0.983059 0.0140709 1.54414 1 0 1 1 0 0 +EDGE2 8441 3401 0.0398287 0.0714674 0.0100613 1 0 1 1 0 0 +EDGE2 8441 3402 0.964977 0.0531129 0.00522374 1 0 1 1 0 0 +EDGE2 8441 922 0.951517 0.0699024 -0.0382069 1 0 1 1 0 0 +EDGE2 8442 921 -0.969958 -0.0558902 0.0138043 1 0 1 1 0 0 +EDGE2 8442 8441 -0.956767 -0.0455291 -0.00573053 1 0 1 1 0 0 +EDGE2 8442 3401 -0.969798 0.0191225 0.00313019 1 0 1 1 0 0 +EDGE2 8442 3402 -0.00346479 0.0171754 0.0365242 1 0 1 1 0 0 +EDGE2 8442 922 -0.0339591 -0.0500982 0.00621147 1 0 1 1 0 0 +EDGE2 8442 923 0.984614 0.0130867 -0.0148749 1 0 1 1 0 0 +EDGE2 8442 3403 1.04238 -0.0790451 0.0190386 1 0 1 1 0 0 +EDGE2 8443 3402 -1.02625 0.0021852 0.00144301 1 0 1 1 0 0 +EDGE2 8443 8442 -1.01369 0.0171877 0.0499492 1 0 1 1 0 0 +EDGE2 8443 922 -1.01574 -0.0394645 0.0143252 1 0 1 1 0 0 +EDGE2 8443 923 -0.00575957 0.0374733 0.00453285 1 0 1 1 0 0 +EDGE2 8443 3403 -0.0135896 0.0217826 0.00946001 1 0 1 1 0 0 +EDGE2 8443 924 1.03529 0.0101245 0.0249579 1 0 1 1 0 0 +EDGE2 8443 3404 1.08184 -0.0311689 -0.0232432 1 0 1 1 0 0 +EDGE2 8444 923 -0.941217 -0.0472914 0.00667045 1 0 1 1 0 0 +EDGE2 8444 3403 -0.967564 0.0272933 0.0170395 1 0 1 1 0 0 +EDGE2 8444 8443 -1.0775 -0.0509796 -0.00758208 1 0 1 1 0 0 +EDGE2 8444 924 -0.0828945 0.0442573 -0.0229214 1 0 1 1 0 0 +EDGE2 8444 3404 0.0162949 -0.0585524 -0.0293049 1 0 1 1 0 0 +EDGE2 8444 925 1.01358 0.0355941 -0.0209196 1 0 1 1 0 0 +EDGE2 8444 3405 0.990092 -0.0655825 0.00294408 1 0 1 1 0 0 +EDGE2 8445 926 -0.00182704 -0.939386 -1.5513 1 0 1 1 0 0 +EDGE2 8445 3406 -0.0228205 0.975685 1.56776 1 0 1 1 0 0 +EDGE2 8445 8444 -0.901393 -0.0138788 0.0233197 1 0 1 1 0 0 +EDGE2 8445 924 -1.0258 0.0461415 0.0269319 1 0 1 1 0 0 +EDGE2 8445 3404 -1.12586 0.00389259 -0.0122937 1 0 1 1 0 0 +EDGE2 8445 925 0.08249 0.00258264 -0.0106471 1 0 1 1 0 0 +EDGE2 8445 3405 0.0530166 -0.0556016 -0.00492279 1 0 1 1 0 0 +EDGE2 8446 927 0.97914 0.0391809 -0.000557829 1 0 1 1 0 0 +EDGE2 8446 926 -0.0537879 -0.0601419 -0.001819 1 0 1 1 0 0 +EDGE2 8446 8445 -1.01034 -0.0460637 1.58719 1 0 1 1 0 0 +EDGE2 8446 925 -0.91953 -0.0505005 1.58691 1 0 1 1 0 0 +EDGE2 8446 3405 -0.97646 0.111086 1.59477 1 0 1 1 0 0 +EDGE2 8447 8446 -1.03385 0.0265216 0.023953 1 0 1 1 0 0 +EDGE2 8447 928 0.988593 -0.0384658 0.0340004 1 0 1 1 0 0 +EDGE2 8447 927 0.0328535 -0.0238462 -0.00512795 1 0 1 1 0 0 +EDGE2 8447 926 -0.946259 0.0106155 -0.0314125 1 0 1 1 0 0 +EDGE2 8448 929 1.04134 0.0146717 0.00762673 1 0 1 1 0 0 +EDGE2 8448 8447 -1.02093 -0.0295769 -0.0460611 1 0 1 1 0 0 +EDGE2 8448 928 -0.00197575 -0.013681 0.00134722 1 0 1 1 0 0 +EDGE2 8448 927 -0.949009 -0.0705072 -0.0250881 1 0 1 1 0 0 +EDGE2 8449 930 1.02121 -0.0355951 -0.0151817 1 0 1 1 0 0 +EDGE2 8449 670 1.00824 -0.0886866 -3.1443 1 0 1 1 0 0 +EDGE2 8449 929 -0.0432732 0.0199794 -0.0200055 1 0 1 1 0 0 +EDGE2 8449 928 -0.980061 -0.0401721 -0.0234836 1 0 1 1 0 0 +EDGE2 8449 8448 -1.03994 0.0423848 0.0123809 1 0 1 1 0 0 +EDGE2 8450 669 1.08418 0.119761 -3.17489 1 0 1 1 0 0 +EDGE2 8450 671 -0.0361235 -0.979931 -1.54714 1 0 1 1 0 0 +EDGE2 8450 930 0.00242316 0.039317 0.000502331 1 0 1 1 0 0 +EDGE2 8450 670 0.0230875 -0.0197162 -3.11443 1 0 1 1 0 0 +EDGE2 8450 931 -0.0445056 0.963639 1.59165 1 0 1 1 0 0 +EDGE2 8450 8449 -1.02353 -0.0395345 0.00668026 1 0 1 1 0 0 +EDGE2 8450 929 -0.8971 -0.022429 0.0144826 1 0 1 1 0 0 +EDGE2 8451 930 -1.00049 0.0366226 -1.58132 1 0 1 1 0 0 +EDGE2 8451 8450 -0.940919 -0.0112612 -1.55919 1 0 1 1 0 0 +EDGE2 8451 670 -0.96055 0.0355748 1.57795 1 0 1 1 0 0 +EDGE2 8451 931 -0.0733506 0.0125994 0.0294185 1 0 1 1 0 0 +EDGE2 8451 932 0.891048 0.00142381 -0.0175165 1 0 1 1 0 0 +EDGE2 8452 8451 -0.980633 -0.147553 -0.015122 1 0 1 1 0 0 +EDGE2 8452 931 -1.03648 0.0143187 0.00735177 1 0 1 1 0 0 +EDGE2 8452 933 1.05644 0.0371714 -0.016236 1 0 1 1 0 0 +EDGE2 8452 932 0.0188439 0.065679 0.0188436 1 0 1 1 0 0 +EDGE2 8453 8452 -1.02483 -0.0102309 0.0130668 1 0 1 1 0 0 +EDGE2 8453 934 1.0035 -0.0213423 0.0370891 1 0 1 1 0 0 +EDGE2 8453 933 0.0286689 -0.00405805 0.0238835 1 0 1 1 0 0 +EDGE2 8453 932 -1.0012 0.0153163 -0.0189402 1 0 1 1 0 0 +EDGE2 8454 955 0.921997 0.0035128 -3.12589 1 0 1 1 0 0 +EDGE2 8454 934 -0.0302187 -0.00217693 0.0253185 1 0 1 1 0 0 +EDGE2 8454 933 -1.02646 -0.042132 0.00775976 1 0 1 1 0 0 +EDGE2 8454 8453 -0.930788 -0.0170123 -0.0186613 1 0 1 1 0 0 +EDGE2 8454 975 1.07437 0.0269607 -3.15272 1 0 1 1 0 0 +EDGE2 8454 935 1.05851 -0.0419645 -0.027962 1 0 1 1 0 0 +EDGE2 8455 956 -0.0335764 -0.98813 -1.59839 1 0 1 1 0 0 +EDGE2 8455 936 -0.0721665 1.06826 1.5738 1 0 1 1 0 0 +EDGE2 8455 955 -0.0102035 0.0105915 -3.13495 1 0 1 1 0 0 +EDGE2 8455 934 -1.10882 -0.0285499 0.00953896 1 0 1 1 0 0 +EDGE2 8455 8454 -1.01466 -0.0263373 -0.0159439 1 0 1 1 0 0 +EDGE2 8455 975 -0.0577684 -0.0191713 -3.16455 1 0 1 1 0 0 +EDGE2 8455 954 1.08592 0.0462519 -3.13429 1 0 1 1 0 0 +EDGE2 8455 974 0.962218 0.0209628 -3.13692 1 0 1 1 0 0 +EDGE2 8455 935 0.0446133 0.0196861 0.0106768 1 0 1 1 0 0 +EDGE2 8455 976 -0.0550961 1.04001 1.58049 1 0 1 1 0 0 +EDGE2 8456 936 0.0621716 0.0325553 -0.0242199 1 0 1 1 0 0 +EDGE2 8456 955 -1.02765 -0.0576428 1.6008 1 0 1 1 0 0 +EDGE2 8456 975 -0.916387 -0.00825272 1.55983 1 0 1 1 0 0 +EDGE2 8456 8455 -1.04423 -0.0137457 -1.5729 1 0 1 1 0 0 +EDGE2 8456 935 -1.00497 -0.0564671 -1.55626 1 0 1 1 0 0 +EDGE2 8456 976 0.0202367 0.0165748 -0.00266587 1 0 1 1 0 0 +EDGE2 8456 937 1.05185 -0.0225357 0.0110715 1 0 1 1 0 0 +EDGE2 8456 977 1.01897 0.0271545 -0.00473975 1 0 1 1 0 0 +EDGE2 8457 936 -0.95983 -0.0171943 0.0233212 1 0 1 1 0 0 +EDGE2 8457 8456 -0.991061 -0.0471606 -0.0177732 1 0 1 1 0 0 +EDGE2 8457 976 -1.09474 0.00873888 0.0448996 1 0 1 1 0 0 +EDGE2 8457 938 1.03421 0.0116271 0.0136339 1 0 1 1 0 0 +EDGE2 8457 937 0.00849165 -0.0564465 0.0261573 1 0 1 1 0 0 +EDGE2 8457 977 0.0654706 -0.0132891 0.00645609 1 0 1 1 0 0 +EDGE2 8457 978 0.899118 0.0208899 0.0123522 1 0 1 1 0 0 +EDGE2 8458 8457 -0.985033 -0.00734585 0.0154652 1 0 1 1 0 0 +EDGE2 8458 938 0.0598103 -0.0145616 0.00822245 1 0 1 1 0 0 +EDGE2 8458 937 -1.01273 -0.0345942 -0.029226 1 0 1 1 0 0 +EDGE2 8458 977 -0.988252 0.0349612 0.0105613 1 0 1 1 0 0 +EDGE2 8458 978 -0.0663502 -0.0392352 -0.00491074 1 0 1 1 0 0 +EDGE2 8458 979 1.06211 0.0285237 -0.00766872 1 0 1 1 0 0 +EDGE2 8458 939 0.955707 -0.0279197 0.00201589 1 0 1 1 0 0 +EDGE2 8459 938 -0.99597 -0.0744558 0.0187838 1 0 1 1 0 0 +EDGE2 8459 8458 -1.03621 0.0266282 0.0029111 1 0 1 1 0 0 +EDGE2 8459 978 -0.921264 0.0846932 0.00462033 1 0 1 1 0 0 +EDGE2 8459 979 -0.00743653 0.0481581 -0.0122207 1 0 1 1 0 0 +EDGE2 8459 939 0.0945017 -0.0791988 0.00970575 1 0 1 1 0 0 +EDGE2 8459 980 0.959163 -0.0302405 0.0204568 1 0 1 1 0 0 +EDGE2 8459 1020 1.03392 -0.105504 -3.14583 1 0 1 1 0 0 +EDGE2 8459 1060 0.958238 0.0446438 -3.11339 1 0 1 1 0 0 +EDGE2 8459 1000 1.01292 0.040951 -3.12907 1 0 1 1 0 0 +EDGE2 8459 940 0.978488 -0.0920757 0.011512 1 0 1 1 0 0 +EDGE2 8460 979 -1.02766 -0.00324778 0.0077972 1 0 1 1 0 0 +EDGE2 8460 8459 -1.0036 -0.0428635 0.0212841 1 0 1 1 0 0 +EDGE2 8460 939 -1.00616 0.0868349 0.0170742 1 0 1 1 0 0 +EDGE2 8460 980 -0.0186279 0.0372045 -0.0242401 1 0 1 1 0 0 +EDGE2 8460 1020 0.025034 0.133981 -3.16969 1 0 1 1 0 0 +EDGE2 8460 1060 -0.000817897 0.00977707 -3.13996 1 0 1 1 0 0 +EDGE2 8460 1000 -0.00704216 0.0480763 -3.14413 1 0 1 1 0 0 +EDGE2 8460 1001 0.000497228 -0.920384 -1.63093 1 0 1 1 0 0 +EDGE2 8460 1061 0.0386426 -0.984575 -1.57732 1 0 1 1 0 0 +EDGE2 8460 940 -0.031333 0.0734025 -0.0125074 1 0 1 1 0 0 +EDGE2 8460 1021 -0.0519507 -1.05433 -1.58975 1 0 1 1 0 0 +EDGE2 8460 941 -0.0141941 -1.01831 -1.53407 1 0 1 1 0 0 +EDGE2 8460 981 0.030565 -0.99654 -1.55721 1 0 1 1 0 0 +EDGE2 8460 1019 0.943602 0.00109557 -3.14278 1 0 1 1 0 0 +EDGE2 8460 1059 1.0076 0.0109091 -3.13115 1 0 1 1 0 0 +EDGE2 8460 999 0.995759 -0.0342146 -3.15941 1 0 1 1 0 0 +EDGE2 8461 980 -1.01977 0.0058925 -1.54886 1 0 1 1 0 0 +EDGE2 8461 1020 -0.99965 0.0235873 1.58348 1 0 1 1 0 0 +EDGE2 8461 1060 -0.944222 -0.00565869 1.58532 1 0 1 1 0 0 +EDGE2 8461 8460 -1.07359 0.0350427 -1.58944 1 0 1 1 0 0 +EDGE2 8461 1000 -1.01086 0.0116649 1.60068 1 0 1 1 0 0 +EDGE2 8461 940 -0.972641 -0.0610481 -1.60237 1 0 1 1 0 0 +EDGE2 8462 8461 -1.0338 0.00231069 0.0116543 1 0 1 1 0 0 +EDGE2 8463 8462 -1.03198 -0.0331213 -0.00682979 1 0 1 1 0 0 +EDGE2 8464 8445 0.992543 0.0556585 -3.10579 1 0 1 1 0 0 +EDGE2 8464 925 0.958413 -0.018447 -3.1119 1 0 1 1 0 0 +EDGE2 8464 3405 1.0005 -0.0517885 -3.14684 1 0 1 1 0 0 +EDGE2 8464 8463 -1.03163 0.0424769 0.00299595 1 0 1 1 0 0 +EDGE2 8465 8446 -0.0166483 1.02368 1.56445 1 0 1 1 0 0 +EDGE2 8465 926 -0.0525744 0.85794 1.54348 1 0 1 1 0 0 +EDGE2 8465 3406 -0.0397815 -0.931165 -1.54672 1 0 1 1 0 0 +EDGE2 8465 8444 0.993413 -0.0762085 -3.11425 1 0 1 1 0 0 +EDGE2 8465 8445 0.0376369 0.00759902 -3.12696 1 0 1 1 0 0 +EDGE2 8465 924 0.890949 0.0403828 -3.16319 1 0 1 1 0 0 +EDGE2 8465 3404 1.0087 0.0671201 -3.16257 1 0 1 1 0 0 +EDGE2 8465 925 -0.0721333 -0.112589 -3.13811 1 0 1 1 0 0 +EDGE2 8465 3405 -0.0320447 -0.043759 -3.14178 1 0 1 1 0 0 +EDGE2 8465 8464 -1.04484 -0.0128961 0.0290056 1 0 1 1 0 0 +EDGE2 8466 3406 -0.0594365 -0.0802608 0.014151 1 0 1 1 0 0 +EDGE2 8466 8445 -1.00603 -0.016384 -1.57913 1 0 1 1 0 0 +EDGE2 8466 8465 -1.11565 0.0128143 1.59872 1 0 1 1 0 0 +EDGE2 8466 925 -1.00514 0.0506991 -1.56158 1 0 1 1 0 0 +EDGE2 8466 3405 -0.992411 0.0434628 -1.5527 1 0 1 1 0 0 +EDGE2 8466 3407 1.04482 -0.0423862 0.00841152 1 0 1 1 0 0 +EDGE2 8467 3406 -0.907358 -0.0261291 -0.0183032 1 0 1 1 0 0 +EDGE2 8467 8466 -1.05745 0.0016526 0.0138913 1 0 1 1 0 0 +EDGE2 8467 3408 0.974408 0.00438032 0.0401732 1 0 1 1 0 0 +EDGE2 8467 3407 -0.00734386 -0.0429054 -0.0148571 1 0 1 1 0 0 +EDGE2 8468 3408 0.0119971 -0.0156153 -0.00590853 1 0 1 1 0 0 +EDGE2 8468 3407 -0.953044 0.00921886 -0.0138692 1 0 1 1 0 0 +EDGE2 8468 8467 -1.03436 0.00619559 -0.00182037 1 0 1 1 0 0 +EDGE2 8468 3409 1.01896 0.022356 0.0122699 1 0 1 1 0 0 +EDGE2 8469 3408 -0.993826 -0.05228 -0.00530604 1 0 1 1 0 0 +EDGE2 8469 8468 -1.02129 0.0573593 -0.0267788 1 0 1 1 0 0 +EDGE2 8469 3409 -0.047456 -0.0884896 0.0379651 1 0 1 1 0 0 +EDGE2 8469 8370 1.0643 -0.00101831 -3.10527 1 0 1 1 0 0 +EDGE2 8469 8430 0.966915 0.0167071 -3.15865 1 0 1 1 0 0 +EDGE2 8469 3070 1.0084 0.0147986 -3.18311 1 0 1 1 0 0 +EDGE2 8469 3390 1.0436 0.0225929 -3.13628 1 0 1 1 0 0 +EDGE2 8469 3410 1.01977 -0.0118001 -0.00940748 1 0 1 1 0 0 +EDGE2 8469 5890 1.0593 -0.107349 -3.17839 1 0 1 1 0 0 +EDGE2 8469 3150 0.886751 0.0418947 -3.12975 1 0 1 1 0 0 +EDGE2 8470 8469 -0.961506 -0.0228606 0.0139908 1 0 1 1 0 0 +EDGE2 8470 3409 -1.05607 0.00233537 -0.00220748 1 0 1 1 0 0 +EDGE2 8470 8370 0.0203482 0.0321956 -3.12666 1 0 1 1 0 0 +EDGE2 8470 3411 0.0069863 1.00499 1.5918 1 0 1 1 0 0 +EDGE2 8470 5891 -0.0656646 1.04061 1.55166 1 0 1 1 0 0 +EDGE2 8470 8431 -0.00691849 1.01669 1.52895 1 0 1 1 0 0 +EDGE2 8470 3391 0.00730091 1.09384 1.60458 1 0 1 1 0 0 +EDGE2 8470 8430 -0.0449705 0.013039 -3.14643 1 0 1 1 0 0 +EDGE2 8470 3070 -0.0774126 -0.0552081 -3.14732 1 0 1 1 0 0 +EDGE2 8470 3390 0.0608433 0.0581517 -3.15606 1 0 1 1 0 0 +EDGE2 8470 3410 0.0976874 -0.000201555 0.00741148 1 0 1 1 0 0 +EDGE2 8470 5890 -0.0174857 0.0348854 -3.14357 1 0 1 1 0 0 +EDGE2 8470 3150 -0.05863 0.073934 -3.12309 1 0 1 1 0 0 +EDGE2 8470 5889 0.940447 0.0192109 -3.13517 1 0 1 1 0 0 +EDGE2 8470 8429 0.892885 -0.0234869 -3.11304 1 0 1 1 0 0 +EDGE2 8470 8369 0.954232 -0.0289519 -3.1119 1 0 1 1 0 0 +EDGE2 8470 3149 1.04876 -0.0292139 -3.1002 1 0 1 1 0 0 +EDGE2 8470 3389 1.04605 0.0656397 -3.13557 1 0 1 1 0 0 +EDGE2 8470 3069 1.0494 -0.0112303 -3.13631 1 0 1 1 0 0 +EDGE2 8470 3151 -0.0267639 -0.894781 -1.57439 1 0 1 1 0 0 +EDGE2 8470 8371 -0.0746557 -1.02462 -1.5666 1 0 1 1 0 0 +EDGE2 8470 3071 -0.0625989 -0.965112 -1.58543 1 0 1 1 0 0 +EDGE2 8471 8370 -0.914983 0.0504525 -1.562 1 0 1 1 0 0 +EDGE2 8471 8470 -1.0095 0.0971591 1.60358 1 0 1 1 0 0 +EDGE2 8471 8430 -1.02157 -0.0172547 -1.55624 1 0 1 1 0 0 +EDGE2 8471 3070 -1.02847 -0.0643332 -1.56736 1 0 1 1 0 0 +EDGE2 8471 3390 -0.971032 -0.00553655 -1.56629 1 0 1 1 0 0 +EDGE2 8471 3410 -0.969594 0.0248546 1.55922 1 0 1 1 0 0 +EDGE2 8471 5890 -1.04427 0.0271901 -1.589 1 0 1 1 0 0 +EDGE2 8471 3150 -0.980083 0.0266445 -1.55488 1 0 1 1 0 0 +EDGE2 8471 3072 0.96727 0.0618882 -0.0194486 1 0 1 1 0 0 +EDGE2 8471 3151 -0.033688 0.0631583 0.0309273 1 0 1 1 0 0 +EDGE2 8471 8371 0.0384284 -0.0339532 -0.0137293 1 0 1 1 0 0 +EDGE2 8471 3071 0.00010086 -0.0524918 0.0115499 1 0 1 1 0 0 +EDGE2 8471 8372 0.931242 -0.0119415 0.0461948 1 0 1 1 0 0 +EDGE2 8471 3152 1.05462 -0.0896102 0.0236699 1 0 1 1 0 0 +EDGE2 8472 3072 0.0520174 -0.00242474 -0.00391326 1 0 1 1 0 0 +EDGE2 8472 3151 -1.05182 0.0233551 0.00216328 1 0 1 1 0 0 +EDGE2 8472 8371 -1.02093 -0.0483773 -0.0172463 1 0 1 1 0 0 +EDGE2 8472 8471 -0.956638 0.0086196 -0.00715883 1 0 1 1 0 0 +EDGE2 8472 3071 -0.916076 -0.0123744 -0.00237875 1 0 1 1 0 0 +EDGE2 8472 8372 -0.0142768 -0.0799805 0.0103217 1 0 1 1 0 0 +EDGE2 8472 3152 -0.000423989 0.0125024 -0.00249507 1 0 1 1 0 0 +EDGE2 8472 3153 0.96181 0.0664668 0.00949065 1 0 1 1 0 0 +EDGE2 8472 8373 1.08473 -0.0687087 -0.0128237 1 0 1 1 0 0 +EDGE2 8472 3073 0.91166 -0.0464132 -0.0152757 1 0 1 1 0 0 +EDGE2 8473 8374 1.0376 -0.00977809 0.014821 1 0 1 1 0 0 +EDGE2 8473 3072 -1.03062 -0.04209 -0.00699371 1 0 1 1 0 0 +EDGE2 8473 8372 -0.999362 -0.00036416 -0.00845266 1 0 1 1 0 0 +EDGE2 8473 8472 -0.951107 -0.0140869 0.0052113 1 0 1 1 0 0 +EDGE2 8473 3152 -0.960041 -0.00158292 -0.00478135 1 0 1 1 0 0 +EDGE2 8473 3153 -0.0864632 -0.0414943 0.00348072 1 0 1 1 0 0 +EDGE2 8473 8373 -0.0315312 0.070478 0.00296546 1 0 1 1 0 0 +EDGE2 8473 3073 -0.0408967 -0.0387466 0.0356053 1 0 1 1 0 0 +EDGE2 8473 3074 0.977674 -0.0318368 0.0834134 1 0 1 1 0 0 +EDGE2 8473 3154 0.973308 -0.0574784 0.0161979 1 0 1 1 0 0 +EDGE2 8474 8374 0.00968912 0.0254173 -0.016623 1 0 1 1 0 0 +EDGE2 8474 3153 -0.975348 0.0803229 0.0283866 1 0 1 1 0 0 +EDGE2 8474 8473 -0.999779 -0.0111666 -0.0104343 1 0 1 1 0 0 +EDGE2 8474 8373 -1.02232 0.0411769 -0.0102367 1 0 1 1 0 0 +EDGE2 8474 3073 -0.977661 -0.104021 -0.00595454 1 0 1 1 0 0 +EDGE2 8474 1075 1.01423 0.00615279 -3.12648 1 0 1 1 0 0 +EDGE2 8474 3074 0.126694 -0.0243001 -0.00656102 1 0 1 1 0 0 +EDGE2 8474 3154 -0.00454953 -0.0570302 0.00616219 1 0 1 1 0 0 +EDGE2 8474 3155 1.05332 0.0249799 -0.0179589 1 0 1 1 0 0 +EDGE2 8474 8375 1.00044 -0.024986 -0.0411526 1 0 1 1 0 0 +EDGE2 8474 3075 1.03655 0.100038 0.0111321 1 0 1 1 0 0 +EDGE2 8474 995 1.01985 0.0450155 -3.09557 1 0 1 1 0 0 +EDGE2 8474 1015 1.02488 -0.0607982 -3.12906 1 0 1 1 0 0 +EDGE2 8474 1055 1.06002 -0.0415776 -3.15263 1 0 1 1 0 0 +EDGE2 8475 1016 -0.0748539 -1.00064 -1.5639 1 0 1 1 0 0 +EDGE2 8475 1056 -0.0927295 -1.02512 -1.53604 1 0 1 1 0 0 +EDGE2 8475 996 -0.0301275 -1.01169 -1.58588 1 0 1 1 0 0 +EDGE2 8475 8374 -1.04628 0.000346322 -0.0150378 1 0 1 1 0 0 +EDGE2 8475 8474 -1.08437 -0.0259875 -0.00401357 1 0 1 1 0 0 +EDGE2 8475 1075 0.0105952 -0.0238961 -3.11414 1 0 1 1 0 0 +EDGE2 8475 3074 -0.893116 0.0264223 -0.01058 1 0 1 1 0 0 +EDGE2 8475 3154 -0.930535 -0.0438982 -0.0170133 1 0 1 1 0 0 +EDGE2 8475 3155 -0.0209852 0.0277421 -0.0288081 1 0 1 1 0 0 +EDGE2 8475 8375 -0.00480993 0.00753056 0.0234125 1 0 1 1 0 0 +EDGE2 8475 3075 -0.133958 -0.005091 -0.00430182 1 0 1 1 0 0 +EDGE2 8475 1074 0.995614 0.0474066 -3.11593 1 0 1 1 0 0 +EDGE2 8475 995 -0.0167839 0.00318554 -3.14441 1 0 1 1 0 0 +EDGE2 8475 1015 -0.0465683 -0.0111857 -3.15253 1 0 1 1 0 0 +EDGE2 8475 1055 0.0858545 -0.0275468 -3.12805 1 0 1 1 0 0 +EDGE2 8475 1014 1.01213 0.052428 -3.15154 1 0 1 1 0 0 +EDGE2 8475 1054 1.05633 0.0443423 -3.13801 1 0 1 1 0 0 +EDGE2 8475 994 0.990155 -0.0231193 -3.16115 1 0 1 1 0 0 +EDGE2 8475 3156 -0.0315191 0.964809 1.57642 1 0 1 1 0 0 +EDGE2 8475 8376 -0.0314801 0.943146 1.58025 1 0 1 1 0 0 +EDGE2 8475 1076 0.000406941 1.00329 1.58166 1 0 1 1 0 0 +EDGE2 8475 3076 0.0600462 0.939999 1.5879 1 0 1 1 0 0 +EDGE2 8476 1075 -0.954856 0.0592414 1.5674 1 0 1 1 0 0 +EDGE2 8476 3155 -0.961868 0.0330993 -1.55387 1 0 1 1 0 0 +EDGE2 8476 8375 -1.0067 -0.0228686 -1.59026 1 0 1 1 0 0 +EDGE2 8476 8475 -0.933768 -0.05012 -1.55843 1 0 1 1 0 0 +EDGE2 8476 3075 -1.07222 0.0398291 -1.55215 1 0 1 1 0 0 +EDGE2 8476 995 -0.941676 0.0885986 1.60378 1 0 1 1 0 0 +EDGE2 8476 1015 -0.999627 -0.0636066 1.57901 1 0 1 1 0 0 +EDGE2 8476 1055 -1.01485 0.0462208 1.59549 1 0 1 1 0 0 +EDGE2 8476 3156 -0.035407 0.0218357 0.0034911 1 0 1 1 0 0 +EDGE2 8476 8376 0.0484827 0.0567073 0.00731731 1 0 1 1 0 0 +EDGE2 8476 1076 0.00768893 0.0162265 0.0345801 1 0 1 1 0 0 +EDGE2 8476 3076 -0.0147822 -0.0423677 0.0174649 1 0 1 1 0 0 +EDGE2 8476 3077 1.02462 -0.0463912 -0.00815691 1 0 1 1 0 0 +EDGE2 8476 3157 0.989292 0.0068178 0.0288227 1 0 1 1 0 0 +EDGE2 8476 8377 1.02922 -0.0173133 0.0274569 1 0 1 1 0 0 +EDGE2 8476 1077 1.02519 -0.0500188 -0.00258107 1 0 1 1 0 0 +EDGE2 8477 3078 0.993605 0.0367279 -0.0336422 1 0 1 1 0 0 +EDGE2 8477 3156 -0.938299 -0.0348574 -0.00490406 1 0 1 1 0 0 +EDGE2 8477 8476 -1.06522 -0.0388397 -0.00102019 1 0 1 1 0 0 +EDGE2 8477 8376 -1.06458 0.0694966 -0.00592167 1 0 1 1 0 0 +EDGE2 8477 1076 -0.950006 0.0520378 -0.0134291 1 0 1 1 0 0 +EDGE2 8477 3076 -0.996859 0.0221128 0.00134702 1 0 1 1 0 0 +EDGE2 8477 3077 -0.0161165 -0.0320994 -0.0242546 1 0 1 1 0 0 +EDGE2 8477 3157 0.0246163 0.0498452 0.0249997 1 0 1 1 0 0 +EDGE2 8477 8377 -0.0140068 0.0331465 -0.000577835 1 0 1 1 0 0 +EDGE2 8477 1077 -0.0138173 0.01106 0.0233406 1 0 1 1 0 0 +EDGE2 8477 8378 1.05839 -0.109534 -0.0322285 1 0 1 1 0 0 +EDGE2 8477 3158 1.00408 0.00391381 -0.00815811 1 0 1 1 0 0 +EDGE2 8477 1078 0.960398 -0.0277935 -0.00563324 1 0 1 1 0 0 +EDGE2 8478 3078 0.0209723 -0.0322996 0.0163976 1 0 1 1 0 0 +EDGE2 8478 8477 -1.05448 0.0412326 0.0162878 1 0 1 1 0 0 +EDGE2 8478 3077 -0.939076 -0.024987 0.0130862 1 0 1 1 0 0 +EDGE2 8478 3157 -0.958101 -0.0246749 -0.0109577 1 0 1 1 0 0 +EDGE2 8478 8377 -1.04472 0.0241264 -0.0136892 1 0 1 1 0 0 +EDGE2 8478 1077 -1.02008 0.0325907 -0.0142633 1 0 1 1 0 0 +EDGE2 8478 8378 -0.0545033 -0.0630902 -0.0268689 1 0 1 1 0 0 +EDGE2 8478 3158 0.098221 -0.0770296 -0.020636 1 0 1 1 0 0 +EDGE2 8478 8379 1.02419 -0.0871778 0.013998 1 0 1 1 0 0 +EDGE2 8478 1078 -0.00884044 -0.0328645 0.00728555 1 0 1 1 0 0 +EDGE2 8478 3079 0.913362 -0.00347334 0.0237522 1 0 1 1 0 0 +EDGE2 8478 3159 0.893896 0.0413227 -0.00620381 1 0 1 1 0 0 +EDGE2 8478 1079 1.01532 -0.0463151 -0.0179428 1 0 1 1 0 0 +EDGE2 8479 8360 1.039 -0.0606058 -3.12434 1 0 1 1 0 0 +EDGE2 8479 3078 -1.01855 -0.0669216 -0.00428046 1 0 1 1 0 0 +EDGE2 8479 8378 -0.945638 0.0650962 -0.0547457 1 0 1 1 0 0 +EDGE2 8479 8478 -1.10729 0.12879 0.0344702 1 0 1 1 0 0 +EDGE2 8479 3158 -1.09539 -0.00627902 0.0146139 1 0 1 1 0 0 +EDGE2 8479 8379 -0.048439 -0.0123682 0.00423577 1 0 1 1 0 0 +EDGE2 8479 1078 -1.05804 -0.093977 0.0222558 1 0 1 1 0 0 +EDGE2 8479 3079 0.118764 -0.0975188 0.0328735 1 0 1 1 0 0 +EDGE2 8479 3159 -0.0348398 0.0301247 -0.0197091 1 0 1 1 0 0 +EDGE2 8479 1079 0.00497465 -0.0460615 -0.00785942 1 0 1 1 0 0 +EDGE2 8479 8400 0.967731 -0.0250047 -3.14774 1 0 1 1 0 0 +EDGE2 8479 8420 0.971571 -0.0556089 -3.1546 1 0 1 1 0 0 +EDGE2 8479 8380 0.973122 -0.0922925 0.0143986 1 0 1 1 0 0 +EDGE2 8479 3060 0.958892 0.00935222 -3.13709 1 0 1 1 0 0 +EDGE2 8479 3160 1.01404 -0.0394318 -0.00545328 1 0 1 1 0 0 +EDGE2 8479 5860 0.970289 0.0119028 -3.09922 1 0 1 1 0 0 +EDGE2 8479 5880 0.972129 -0.0224736 -3.11038 1 0 1 1 0 0 +EDGE2 8479 3080 0.927896 -0.0734693 0.000914948 1 0 1 1 0 0 +EDGE2 8479 1080 1.0306 -0.0273127 -0.0280611 1 0 1 1 0 0 +EDGE2 8480 8360 0.0769863 -0.00672074 -3.13562 1 0 1 1 0 0 +EDGE2 8480 8379 -1.04455 0.0212571 -0.0508223 1 0 1 1 0 0 +EDGE2 8480 8479 -1.00418 0.0212142 0.00102402 1 0 1 1 0 0 +EDGE2 8480 3079 -1.00963 0.0365684 -0.00269395 1 0 1 1 0 0 +EDGE2 8480 3159 -0.947101 -0.0189921 -0.0354577 1 0 1 1 0 0 +EDGE2 8480 1079 -0.897093 0.03557 -0.00604884 1 0 1 1 0 0 +EDGE2 8480 8361 -0.0330427 1.00016 1.54154 1 0 1 1 0 0 +EDGE2 8480 8421 -0.068285 1.09791 1.56661 1 0 1 1 0 0 +EDGE2 8480 8381 0.0409209 0.978251 1.58381 1 0 1 1 0 0 +EDGE2 8480 3081 0.0845381 1.04378 1.58812 1 0 1 1 0 0 +EDGE2 8480 3161 0.00715364 1.02291 1.5755 1 0 1 1 0 0 +EDGE2 8480 5881 -0.0126676 0.983286 1.57001 1 0 1 1 0 0 +EDGE2 8480 3061 0.0119929 0.951187 1.56893 1 0 1 1 0 0 +EDGE2 8480 8400 -0.0462189 -0.0171213 -3.12469 1 0 1 1 0 0 +EDGE2 8480 8420 0.0835054 0.0596357 -3.12481 1 0 1 1 0 0 +EDGE2 8480 8380 0.0180395 0.00930811 0.0171769 1 0 1 1 0 0 +EDGE2 8480 8401 -0.0273036 -1.00844 -1.58112 1 0 1 1 0 0 +EDGE2 8480 3060 -0.0136439 0.00772925 -3.10934 1 0 1 1 0 0 +EDGE2 8480 3160 -0.0799315 0.0540986 0.00689744 1 0 1 1 0 0 +EDGE2 8480 5860 0.0347049 -0.0410626 -3.15379 1 0 1 1 0 0 +EDGE2 8480 5880 -0.0403528 0.00759826 -3.15472 1 0 1 1 0 0 +EDGE2 8480 3080 -0.00984751 0.0286425 -0.0184727 1 0 1 1 0 0 +EDGE2 8480 1080 -0.0512225 0.0854297 -0.00473403 1 0 1 1 0 0 +EDGE2 8480 1081 -0.00543569 -1.0237 -1.55181 1 0 1 1 0 0 +EDGE2 8480 5861 -0.063584 -0.948173 -1.57795 1 0 1 1 0 0 +EDGE2 8480 8399 0.969952 0.0237281 -3.15184 1 0 1 1 0 0 +EDGE2 8480 8419 1.00126 0.0100237 -3.14212 1 0 1 1 0 0 +EDGE2 8480 5859 1.00358 -0.030501 -3.15451 1 0 1 1 0 0 +EDGE2 8480 5879 0.978979 -0.0476758 -3.15405 1 0 1 1 0 0 +EDGE2 8480 8359 1.07581 0.0484432 -3.08815 1 0 1 1 0 0 +EDGE2 8480 3059 0.958348 0.0878613 -3.18247 1 0 1 1 0 0 +EDGE2 8481 8360 -0.931145 0.00534896 1.58447 1 0 1 1 0 0 +EDGE2 8481 8362 1.00613 0.0307841 0.0241965 1 0 1 1 0 0 +EDGE2 8481 8422 1.01454 0.0486235 -0.0225361 1 0 1 1 0 0 +EDGE2 8481 8382 0.990936 0.0522799 0.0166791 1 0 1 1 0 0 +EDGE2 8481 3082 1.00329 0.0592527 0.0348889 1 0 1 1 0 0 +EDGE2 8481 3162 0.934262 0.0260361 0.00129246 1 0 1 1 0 0 +EDGE2 8481 5882 0.852099 -0.036381 0.000746864 1 0 1 1 0 0 +EDGE2 8481 3062 1.0974 0.10115 -0.0234318 1 0 1 1 0 0 +EDGE2 8481 8361 -0.13352 -0.0112141 -0.0180345 1 0 1 1 0 0 +EDGE2 8481 8421 -0.0389279 0.0282547 -0.0634489 1 0 1 1 0 0 +EDGE2 8481 8381 0.00699534 -0.00434542 -0.00495021 1 0 1 1 0 0 +EDGE2 8481 3081 -0.00840106 0.0278695 -0.00872105 1 0 1 1 0 0 +EDGE2 8481 3161 -0.065481 0.0331351 -0.00929717 1 0 1 1 0 0 +EDGE2 8481 5881 0.00184362 0.0439187 -0.0198661 1 0 1 1 0 0 +EDGE2 8481 3061 0.0670215 -0.0187455 -0.00554353 1 0 1 1 0 0 +EDGE2 8481 8480 -0.976195 -0.026801 -1.5919 1 0 1 1 0 0 +EDGE2 8481 8400 -1.04157 0.0267401 1.55664 1 0 1 1 0 0 +EDGE2 8481 8420 -0.994337 -0.0402304 1.54936 1 0 1 1 0 0 +EDGE2 8481 8380 -0.929113 -0.0419403 -1.5657 1 0 1 1 0 0 +EDGE2 8481 3060 -0.894577 0.0919284 1.57115 1 0 1 1 0 0 +EDGE2 8481 3160 -0.876023 0.0854331 -1.55457 1 0 1 1 0 0 +EDGE2 8481 5860 -0.880783 -0.138206 1.52783 1 0 1 1 0 0 +EDGE2 8481 5880 -1.02569 0.0615198 1.57674 1 0 1 1 0 0 +EDGE2 8481 3080 -0.995725 -0.0272364 -1.56459 1 0 1 1 0 0 +EDGE2 8481 1080 -1.05572 -0.0307147 -1.58864 1 0 1 1 0 0 +EDGE2 8482 8363 0.967637 0.000978887 0.0181485 1 0 1 1 0 0 +EDGE2 8482 8423 0.964247 0.0676167 0.00967093 1 0 1 1 0 0 +EDGE2 8482 8383 0.975852 -0.0269615 -0.0183289 1 0 1 1 0 0 +EDGE2 8482 3083 0.989887 -0.0236832 0.0560411 1 0 1 1 0 0 +EDGE2 8482 3163 1.02011 0.0657071 0.00318764 1 0 1 1 0 0 +EDGE2 8482 5883 1.04823 -0.0268279 0.00282884 1 0 1 1 0 0 +EDGE2 8482 3063 0.994199 -0.0155184 -0.0194131 1 0 1 1 0 0 +EDGE2 8482 8362 -0.00291669 0.00687896 -0.0234646 1 0 1 1 0 0 +EDGE2 8482 8422 0.0382259 -0.070819 -0.0154807 1 0 1 1 0 0 +EDGE2 8482 8382 -0.0114138 0.103323 0.0186638 1 0 1 1 0 0 +EDGE2 8482 3082 -0.0022891 -0.0687565 0.0202715 1 0 1 1 0 0 +EDGE2 8482 3162 0.0594667 0.0188701 0.00381593 1 0 1 1 0 0 +EDGE2 8482 5882 -0.0273241 -0.0316767 0.0131339 1 0 1 1 0 0 +EDGE2 8482 3062 -0.0348355 -0.0480818 0.00344883 1 0 1 1 0 0 +EDGE2 8482 8361 -1.00771 -0.0375683 0.00729271 1 0 1 1 0 0 +EDGE2 8482 8421 -0.934787 0.0567125 0.00357428 1 0 1 1 0 0 +EDGE2 8482 8481 -0.96958 0.0491035 0.0248942 1 0 1 1 0 0 +EDGE2 8482 8381 -1.01186 0.00732699 -0.00831726 1 0 1 1 0 0 +EDGE2 8482 3081 -0.987743 0.102936 0.0055151 1 0 1 1 0 0 +EDGE2 8482 3161 -1.0121 0.0484197 -0.017224 1 0 1 1 0 0 +EDGE2 8482 5881 -0.9978 -0.0182412 -0.0283731 1 0 1 1 0 0 +EDGE2 8482 3061 -1.01957 0.0454113 0.0117032 1 0 1 1 0 0 +EDGE2 8483 3064 0.988299 -0.0491815 -0.0245094 1 0 1 1 0 0 +EDGE2 8483 8384 0.931729 0.0162296 -0.0398566 1 0 1 1 0 0 +EDGE2 8483 8424 1.07133 0.0183406 0.0143293 1 0 1 1 0 0 +EDGE2 8483 3164 0.965856 0.0259544 0.0270056 1 0 1 1 0 0 +EDGE2 8483 5884 0.947868 -0.0553214 -2.29814e-05 1 0 1 1 0 0 +EDGE2 8483 8364 1.10485 -0.0190513 0.00525168 1 0 1 1 0 0 +EDGE2 8483 3084 0.975617 -0.0897843 -0.028428 1 0 1 1 0 0 +EDGE2 8483 8363 -0.0324041 -0.0393613 -0.00131687 1 0 1 1 0 0 +EDGE2 8483 8423 -0.0485718 0.0452735 0.0160017 1 0 1 1 0 0 +EDGE2 8483 8383 0.00298897 -0.0328139 -0.00709336 1 0 1 1 0 0 +EDGE2 8483 3083 -0.0330884 -0.0071977 0.0264424 1 0 1 1 0 0 +EDGE2 8483 3163 0.0900387 -0.081339 0.0313332 1 0 1 1 0 0 +EDGE2 8483 5883 0.149256 0.0649781 0.0451211 1 0 1 1 0 0 +EDGE2 8483 3063 -0.0209588 -0.0175005 0.0144109 1 0 1 1 0 0 +EDGE2 8483 8362 -1.07188 -0.10216 0.0316204 1 0 1 1 0 0 +EDGE2 8483 8422 -1.01047 -0.00662333 -0.00374286 1 0 1 1 0 0 +EDGE2 8483 8482 -0.891213 -0.0614246 -0.000773723 1 0 1 1 0 0 +EDGE2 8483 8382 -0.925898 -0.0306373 0.00531709 1 0 1 1 0 0 +EDGE2 8483 3082 -1.00987 0.01984 0.0451228 1 0 1 1 0 0 +EDGE2 8483 3162 -0.997286 0.0356064 0.0170482 1 0 1 1 0 0 +EDGE2 8483 5882 -1.0282 0.0481485 -0.0168616 1 0 1 1 0 0 +EDGE2 8483 3062 -0.958191 -0.0122259 -0.00936533 1 0 1 1 0 0 +EDGE2 8484 8385 0.887489 -0.0407497 -0.0126341 1 0 1 1 0 0 +EDGE2 8484 8425 0.981338 -0.059432 -0.00411992 1 0 1 1 0 0 +EDGE2 8484 3105 0.995558 0.0567723 -3.12674 1 0 1 1 0 0 +EDGE2 8484 3485 1.04207 0.00335514 -3.12463 1 0 1 1 0 0 +EDGE2 8484 5845 0.951671 0.0172342 -3.07814 1 0 1 1 0 0 +EDGE2 8484 5885 1.06813 -0.060178 -0.00292585 1 0 1 1 0 0 +EDGE2 8484 8365 1.0025 -0.0262524 0.031068 1 0 1 1 0 0 +EDGE2 8484 5825 0.979158 -0.0236714 -3.14858 1 0 1 1 0 0 +EDGE2 8484 3145 1.04382 -0.0264181 -3.14644 1 0 1 1 0 0 +EDGE2 8484 3165 1.01433 -0.0071918 -0.00319757 1 0 1 1 0 0 +EDGE2 8484 3385 1.01652 -0.0795904 -3.14334 1 0 1 1 0 0 +EDGE2 8484 3125 1.01338 0.0719331 -3.13898 1 0 1 1 0 0 +EDGE2 8484 1185 1.03973 0.000731936 -3.14033 1 0 1 1 0 0 +EDGE2 8484 3065 0.981461 0.100055 0.0119712 1 0 1 1 0 0 +EDGE2 8484 3085 0.908113 -0.0145952 -0.0177213 1 0 1 1 0 0 +EDGE2 8484 1165 1.03384 0.0211596 -3.14516 1 0 1 1 0 0 +EDGE2 8484 3064 -0.0153651 -0.0388033 0.0202545 1 0 1 1 0 0 +EDGE2 8484 8384 -0.026073 -0.0582933 0.00289165 1 0 1 1 0 0 +EDGE2 8484 8424 0.114988 0.0250179 -0.00134842 1 0 1 1 0 0 +EDGE2 8484 3164 0.018463 -0.00158304 -0.0150304 1 0 1 1 0 0 +EDGE2 8484 5884 0.086776 0.0445104 0.0284078 1 0 1 1 0 0 +EDGE2 8484 8364 -0.000104807 0.00235236 -0.00860525 1 0 1 1 0 0 +EDGE2 8484 3084 0.0716674 0.0175199 -0.0113233 1 0 1 1 0 0 +EDGE2 8484 8363 -0.934019 0.021045 -0.00339309 1 0 1 1 0 0 +EDGE2 8484 8423 -1.03856 -0.0395707 -0.0261029 1 0 1 1 0 0 +EDGE2 8484 8483 -1.04817 -0.0946912 -0.0522649 1 0 1 1 0 0 +EDGE2 8484 8383 -0.95995 0.0422203 -0.0188831 1 0 1 1 0 0 +EDGE2 8484 3083 -0.970702 0.020844 -0.033267 1 0 1 1 0 0 +EDGE2 8484 3163 -1.02532 -0.0279778 0.00434386 1 0 1 1 0 0 +EDGE2 8484 5883 -1.01401 0.0473267 -0.0364657 1 0 1 1 0 0 +EDGE2 8484 3063 -0.963598 -0.0457002 -0.0243283 1 0 1 1 0 0 +EDGE2 8485 8385 0.0661201 0.0130292 0.014699 1 0 1 1 0 0 +EDGE2 8485 8366 0.00963322 0.951203 1.58077 1 0 1 1 0 0 +EDGE2 8485 8426 -0.0379037 0.976616 1.54912 1 0 1 1 0 0 +EDGE2 8485 3146 0.0437169 1.01783 1.58546 1 0 1 1 0 0 +EDGE2 8485 3386 0.00721539 1.01142 1.57788 1 0 1 1 0 0 +EDGE2 8485 5886 0.00439486 0.991751 1.56909 1 0 1 1 0 0 +EDGE2 8485 3066 -0.0414938 0.934336 1.5366 1 0 1 1 0 0 +EDGE2 8485 3144 1.0191 -0.00843638 -3.15202 1 0 1 1 0 0 +EDGE2 8485 3484 0.878269 0.00683341 -3.14386 1 0 1 1 0 0 +EDGE2 8485 5824 0.929319 0.00825556 -3.13433 1 0 1 1 0 0 +EDGE2 8485 5844 0.904016 -0.0364119 -3.1495 1 0 1 1 0 0 +EDGE2 8485 3384 0.962419 -0.0140897 -3.13965 1 0 1 1 0 0 +EDGE2 8485 1184 1.0348 0.063472 -3.12714 1 0 1 1 0 0 +EDGE2 8485 3104 1.06232 0.021952 -3.17535 1 0 1 1 0 0 +EDGE2 8485 3124 1.05005 -0.0655415 -3.16305 1 0 1 1 0 0 +EDGE2 8485 1164 0.985073 -0.0328808 -3.15459 1 0 1 1 0 0 +EDGE2 8485 8425 -0.0208556 0.106693 -0.0150801 1 0 1 1 0 0 +EDGE2 8485 3166 0.0837337 -0.956191 -1.58273 1 0 1 1 0 0 +EDGE2 8485 3105 0.0197621 -0.00208633 -3.13338 1 0 1 1 0 0 +EDGE2 8485 3485 -0.0366672 -0.0692668 -3.15544 1 0 1 1 0 0 +EDGE2 8485 5845 -0.0298794 0.0117998 -3.13387 1 0 1 1 0 0 +EDGE2 8485 5885 -0.0812995 -0.0360512 -0.0205732 1 0 1 1 0 0 +EDGE2 8485 8365 -0.000227317 -0.0295076 -0.00320897 1 0 1 1 0 0 +EDGE2 8485 5825 0.0636388 0.0183335 -3.13446 1 0 1 1 0 0 +EDGE2 8485 3145 -0.0298711 -0.0687085 -3.16017 1 0 1 1 0 0 +EDGE2 8485 3165 -0.077821 -0.00454316 -0.00613116 1 0 1 1 0 0 +EDGE2 8485 3385 0.0586281 -0.0333917 -3.12411 1 0 1 1 0 0 +EDGE2 8485 3125 -0.081574 -0.0664304 -3.12127 1 0 1 1 0 0 +EDGE2 8485 1185 -0.00297359 -0.0171517 -3.13856 1 0 1 1 0 0 +EDGE2 8485 3065 0.0924665 0.0230891 -0.020369 1 0 1 1 0 0 +EDGE2 8485 3085 -0.0250404 0.0468518 0.0289379 1 0 1 1 0 0 +EDGE2 8485 1165 -0.023088 -0.0114422 -3.15255 1 0 1 1 0 0 +EDGE2 8485 5826 -0.0161887 -1.06072 -1.60132 1 0 1 1 0 0 +EDGE2 8485 5846 0.0431776 -1.01412 -1.56512 1 0 1 1 0 0 +EDGE2 8485 8386 -0.0638449 -1.04081 -1.60013 1 0 1 1 0 0 +EDGE2 8485 3486 -0.0671627 -0.991994 -1.57477 1 0 1 1 0 0 +EDGE2 8485 1166 0.0447762 -0.910857 -1.58201 1 0 1 1 0 0 +EDGE2 8485 3086 -0.000601106 -0.865363 -1.57394 1 0 1 1 0 0 +EDGE2 8485 3106 0.0160642 -1.00701 -1.59504 1 0 1 1 0 0 +EDGE2 8485 3126 0.00809832 -0.950509 -1.56569 1 0 1 1 0 0 +EDGE2 8485 1186 -0.0025137 -1.02709 -1.56369 1 0 1 1 0 0 +EDGE2 8485 3064 -0.984995 -0.0433283 0.0254258 1 0 1 1 0 0 +EDGE2 8485 8384 -1.00899 -0.0276098 -0.0126626 1 0 1 1 0 0 +EDGE2 8485 8484 -1.04436 -0.0230612 0.00221607 1 0 1 1 0 0 +EDGE2 8485 8424 -0.968693 0.0479899 -0.00236562 1 0 1 1 0 0 +EDGE2 8485 3164 -0.98803 0.0274673 -0.00851853 1 0 1 1 0 0 +EDGE2 8485 5884 -1.02276 -0.00382873 0.0323742 1 0 1 1 0 0 +EDGE2 8485 8364 -0.979969 0.0743783 0.0272273 1 0 1 1 0 0 +EDGE2 8485 3084 -1.09148 0.0128246 -0.0195867 1 0 1 1 0 0 +EDGE2 8486 8385 -0.979365 -0.104182 1.55796 1 0 1 1 0 0 +EDGE2 8486 8485 -0.99585 0.182166 1.557 1 0 1 1 0 0 +EDGE2 8486 8425 -1.05722 -0.0179798 1.60617 1 0 1 1 0 0 +EDGE2 8486 3166 -0.0271336 0.0689228 0.0112012 1 0 1 1 0 0 +EDGE2 8486 3105 -0.97437 -0.0155449 -1.60795 1 0 1 1 0 0 +EDGE2 8486 3485 -1.01499 0.0198615 -1.5505 1 0 1 1 0 0 +EDGE2 8486 5845 -0.994921 0.0135381 -1.5592 1 0 1 1 0 0 +EDGE2 8486 5885 -0.952139 -0.0794913 1.59054 1 0 1 1 0 0 +EDGE2 8486 8365 -1.06545 0.0201272 1.58085 1 0 1 1 0 0 +EDGE2 8486 5825 -0.983831 -0.0347338 -1.58167 1 0 1 1 0 0 +EDGE2 8486 3145 -1.0083 -0.0370197 -1.57564 1 0 1 1 0 0 +EDGE2 8486 3165 -1.00585 0.11422 1.53696 1 0 1 1 0 0 +EDGE2 8486 3385 -1.01389 0.0626183 -1.56032 1 0 1 1 0 0 +EDGE2 8486 3125 -0.995331 0.045772 -1.57321 1 0 1 1 0 0 +EDGE2 8486 1185 -0.966076 -0.0286821 -1.5589 1 0 1 1 0 0 +EDGE2 8486 3065 -0.973758 0.00652098 1.56806 1 0 1 1 0 0 +EDGE2 8486 3085 -1.03785 0.0242828 1.55812 1 0 1 1 0 0 +EDGE2 8486 1165 -0.985397 -0.084605 -1.56124 1 0 1 1 0 0 +EDGE2 8486 5826 0.0389275 -0.0176967 -0.0315087 1 0 1 1 0 0 +EDGE2 8486 5846 0.0514101 -0.0374273 0.00305913 1 0 1 1 0 0 +EDGE2 8486 8386 -0.122387 -0.0626534 -0.00520122 1 0 1 1 0 0 +EDGE2 8486 3486 0.071783 0.0734454 0.019159 1 0 1 1 0 0 +EDGE2 8486 5847 0.99007 0.0927153 -0.0101186 1 0 1 1 0 0 +EDGE2 8486 1166 -0.00881421 -0.0756517 0.0256656 1 0 1 1 0 0 +EDGE2 8486 3086 0.0603619 0.0103665 0.00842329 1 0 1 1 0 0 +EDGE2 8486 3106 0.0483331 -0.0431088 0.00317266 1 0 1 1 0 0 +EDGE2 8486 3126 0.0742434 -0.00994399 0.000981584 1 0 1 1 0 0 +EDGE2 8486 1186 0.0402645 -0.00423123 0.0281359 1 0 1 1 0 0 +EDGE2 8486 8387 1.05588 0.0594963 0.00449743 1 0 1 1 0 0 +EDGE2 8486 3107 0.927455 -0.0215107 0.00561063 1 0 1 1 0 0 +EDGE2 8486 3167 1.01216 -0.101822 0.00937281 1 0 1 1 0 0 +EDGE2 8486 3487 0.907372 -0.0106108 -0.0213115 1 0 1 1 0 0 +EDGE2 8486 5827 1.02505 -0.0339869 -0.032341 1 0 1 1 0 0 +EDGE2 8486 3127 1.0125 0.116125 0.00855086 1 0 1 1 0 0 +EDGE2 8486 1187 0.980159 0.0154872 -0.0210555 1 0 1 1 0 0 +EDGE2 8486 3087 1.05602 0.0967898 -0.0181881 1 0 1 1 0 0 +EDGE2 8486 1167 1.04332 0.0067407 -0.0348872 1 0 1 1 0 0 +EDGE2 8487 3166 -0.946632 -0.0110073 0.0455817 1 0 1 1 0 0 +EDGE2 8487 8486 -0.933826 -0.00958705 0.0110746 1 0 1 1 0 0 +EDGE2 8487 5826 -0.980214 -0.0594296 -0.0142406 1 0 1 1 0 0 +EDGE2 8487 5846 -0.940209 0.0387675 -0.00222696 1 0 1 1 0 0 +EDGE2 8487 8386 -1.01539 0.0379752 0.00101624 1 0 1 1 0 0 +EDGE2 8487 3486 -0.989165 0.00117301 0.0193548 1 0 1 1 0 0 +EDGE2 8487 5847 0.0562881 -0.0101977 -0.00714047 1 0 1 1 0 0 +EDGE2 8487 1166 -1.06109 -0.0500812 0.0103587 1 0 1 1 0 0 +EDGE2 8487 3086 -1.03867 -0.0469847 0.0217795 1 0 1 1 0 0 +EDGE2 8487 3106 -1.04018 -0.03611 -0.0128732 1 0 1 1 0 0 +EDGE2 8487 3126 -0.945172 0.028357 -0.00684679 1 0 1 1 0 0 +EDGE2 8487 1186 -1.00605 0.071309 -0.00079527 1 0 1 1 0 0 +EDGE2 8487 8387 0.0329827 0.0765856 0.00811933 1 0 1 1 0 0 +EDGE2 8487 3107 0.0156737 0.018766 0.018362 1 0 1 1 0 0 +EDGE2 8487 3167 0.00181723 0.0315204 -0.00552819 1 0 1 1 0 0 +EDGE2 8487 3487 0.0613419 0.0171391 0.00754284 1 0 1 1 0 0 +EDGE2 8487 5827 0.146255 -0.018025 -0.0356939 1 0 1 1 0 0 +EDGE2 8487 3127 0.0307089 0.0435526 -0.0312234 1 0 1 1 0 0 +EDGE2 8487 1187 0.0147551 0.0257496 -0.00991147 1 0 1 1 0 0 +EDGE2 8487 3087 -0.108399 0.0985567 0.0018629 1 0 1 1 0 0 +EDGE2 8487 1167 -0.0839914 -0.0205045 0.00141145 1 0 1 1 0 0 +EDGE2 8487 8388 0.988361 -0.0399884 0.00664416 1 0 1 1 0 0 +EDGE2 8487 3128 0.991207 -0.0695311 0.0197063 1 0 1 1 0 0 +EDGE2 8487 3488 1.01056 0.0499091 -0.0197134 1 0 1 1 0 0 +EDGE2 8487 5828 1.1547 0.0585168 -0.0225136 1 0 1 1 0 0 +EDGE2 8487 5848 0.997361 -0.0460343 0.00343123 1 0 1 1 0 0 +EDGE2 8487 3168 1.03376 -0.052005 -0.0125652 1 0 1 1 0 0 +EDGE2 8487 1188 1.02119 0.0319111 -0.00613276 1 0 1 1 0 0 +EDGE2 8487 3088 0.952901 0.0397591 0.0251439 1 0 1 1 0 0 +EDGE2 8487 3108 1.02264 -0.0844952 -0.00397766 1 0 1 1 0 0 +EDGE2 8487 1168 0.988144 0.099326 0.0137831 1 0 1 1 0 0 +EDGE2 8488 5847 -1.03747 0.0272903 0.00425713 1 0 1 1 0 0 +EDGE2 8488 8387 -0.942084 0.0446243 0.0281568 1 0 1 1 0 0 +EDGE2 8488 8487 -0.992749 0.070398 0.00794313 1 0 1 1 0 0 +EDGE2 8488 3107 -1.02243 -0.0104576 -0.0304027 1 0 1 1 0 0 +EDGE2 8488 3167 -1.02157 -0.0840906 0.00797633 1 0 1 1 0 0 +EDGE2 8488 3487 -0.977139 0.0212818 0.0113725 1 0 1 1 0 0 +EDGE2 8488 5827 -1.05332 -0.0425815 0.00943603 1 0 1 1 0 0 +EDGE2 8488 3127 -0.950949 -0.0817958 -0.0074567 1 0 1 1 0 0 +EDGE2 8488 1187 -1.015 0.0662637 -0.0280613 1 0 1 1 0 0 +EDGE2 8488 3087 -1.04421 -0.0141169 -0.015807 1 0 1 1 0 0 +EDGE2 8488 1167 -1.02593 -0.0170577 -0.00616291 1 0 1 1 0 0 +EDGE2 8488 8388 -0.0861533 0.0252936 -0.0163441 1 0 1 1 0 0 +EDGE2 8488 3128 0.0375568 -0.0218542 0.00318823 1 0 1 1 0 0 +EDGE2 8488 3488 0.102543 -0.0851185 -0.0250755 1 0 1 1 0 0 +EDGE2 8488 5828 0.0228526 -0.0730491 0.000263154 1 0 1 1 0 0 +EDGE2 8488 5848 0.0916936 0.032799 0.0159739 1 0 1 1 0 0 +EDGE2 8488 3168 -0.0383531 0.0171814 -0.0182455 1 0 1 1 0 0 +EDGE2 8488 1188 0.0867308 0.0271585 0.0128461 1 0 1 1 0 0 +EDGE2 8488 3088 -0.026908 0.0192716 -0.0342619 1 0 1 1 0 0 +EDGE2 8488 3108 0.0831245 -0.0124895 0.0209076 1 0 1 1 0 0 +EDGE2 8488 1168 0.0462458 0.0329351 -0.0177034 1 0 1 1 0 0 +EDGE2 8488 5849 1.04387 0.00502136 -0.0174978 1 0 1 1 0 0 +EDGE2 8488 8389 0.927117 0.0440811 0.0567701 1 0 1 1 0 0 +EDGE2 8488 3109 1.0077 0.00941419 -0.00758903 1 0 1 1 0 0 +EDGE2 8488 3169 1.01331 0.0148786 0.0250309 1 0 1 1 0 0 +EDGE2 8488 3489 1.01292 0.0687049 -0.0146948 1 0 1 1 0 0 +EDGE2 8488 5829 1.0995 0.0147458 -0.00521958 1 0 1 1 0 0 +EDGE2 8488 3129 1.01478 -0.0415653 -0.0172944 1 0 1 1 0 0 +EDGE2 8488 1189 0.998511 0.0136787 -0.00363874 1 0 1 1 0 0 +EDGE2 8488 3089 1.01899 -0.0271462 -0.00427848 1 0 1 1 0 0 +EDGE2 8488 1169 0.993444 -0.05249 -0.00497838 1 0 1 1 0 0 +EDGE2 8489 8488 -0.955331 0.0473867 -0.00815349 1 0 1 1 0 0 +EDGE2 8489 8388 -1.05495 -0.00938806 6.18882e-05 1 0 1 1 0 0 +EDGE2 8489 3128 -1.02375 -0.0345257 0.0136814 1 0 1 1 0 0 +EDGE2 8489 3488 -0.992896 0.041532 -0.0182174 1 0 1 1 0 0 +EDGE2 8489 5828 -1.09132 -0.0769319 0.00900002 1 0 1 1 0 0 +EDGE2 8489 5848 -1.03996 -0.0313715 -0.00806541 1 0 1 1 0 0 +EDGE2 8489 3168 -0.957563 -0.0278192 0.0277838 1 0 1 1 0 0 +EDGE2 8489 1188 -0.962896 -0.0157097 -0.0184612 1 0 1 1 0 0 +EDGE2 8489 3088 -0.94508 -0.0864841 0.0037718 1 0 1 1 0 0 +EDGE2 8489 3108 -1.02442 0.033123 -0.00122409 1 0 1 1 0 0 +EDGE2 8489 1168 -0.978742 -0.00371299 -0.00281528 1 0 1 1 0 0 +EDGE2 8489 5849 -0.0346869 0.0053993 0.0328748 1 0 1 1 0 0 +EDGE2 8489 8389 0.0383229 0.0122878 0.0298668 1 0 1 1 0 0 +EDGE2 8489 3109 0.0271335 0.0326227 -0.00240199 1 0 1 1 0 0 +EDGE2 8489 3169 0.0299835 -0.0326848 -0.00104255 1 0 1 1 0 0 +EDGE2 8489 3489 -0.0948177 0.00205054 -0.00560326 1 0 1 1 0 0 +EDGE2 8489 5829 0.073383 -0.0144005 0.0146138 1 0 1 1 0 0 +EDGE2 8489 3129 0.0449075 0.00990766 -0.0348616 1 0 1 1 0 0 +EDGE2 8489 1189 0.0199151 0.0391929 -0.000239135 1 0 1 1 0 0 +EDGE2 8489 3089 -0.0229492 0.0463052 -0.00391763 1 0 1 1 0 0 +EDGE2 8489 1169 0.00774341 0.020335 0.024552 1 0 1 1 0 0 +EDGE2 8489 3050 0.991293 0.0125819 -3.08575 1 0 1 1 0 0 +EDGE2 8489 5850 0.940047 -0.0885706 0.0128686 1 0 1 1 0 0 +EDGE2 8489 8390 1.00608 0.0367026 0.0137839 1 0 1 1 0 0 +EDGE2 8489 3170 1.02152 -0.0688097 0.00268282 1 0 1 1 0 0 +EDGE2 8489 5790 1.03772 -0.0564014 -3.12791 1 0 1 1 0 0 +EDGE2 8489 5810 1.0662 -0.00307222 -3.12185 1 0 1 1 0 0 +EDGE2 8489 5830 0.988374 -0.0325988 -0.0175193 1 0 1 1 0 0 +EDGE2 8489 3490 1.01048 0.0179896 -0.00552813 1 0 1 1 0 0 +EDGE2 8489 3110 0.985483 -0.00614279 0.0162455 1 0 1 1 0 0 +EDGE2 8489 3130 0.977869 -0.106257 -0.0344266 1 0 1 1 0 0 +EDGE2 8489 3090 1.03425 -0.025978 0.010284 1 0 1 1 0 0 +EDGE2 8489 1130 0.894881 -0.0733548 -3.13725 1 0 1 1 0 0 +EDGE2 8489 1170 1.05917 -0.110397 0.0108873 1 0 1 1 0 0 +EDGE2 8489 1190 1.03527 -0.0208365 0.0493017 1 0 1 1 0 0 +EDGE2 8489 3030 0.984758 0.0109252 -3.11081 1 0 1 1 0 0 +EDGE2 8489 1150 1.08819 -0.118296 -3.14736 1 0 1 1 0 0 +EDGE2 8489 1110 0.987998 -0.0283842 -3.1584 1 0 1 1 0 0 +EDGE2 8490 5849 -0.94742 -0.0159309 -0.0258722 1 0 1 1 0 0 +EDGE2 8490 8489 -1.0861 -0.0287581 0.00526703 1 0 1 1 0 0 +EDGE2 8490 8389 -0.920246 -0.0762085 -0.0184762 1 0 1 1 0 0 +EDGE2 8490 3109 -1.02249 0.0777006 0.0391499 1 0 1 1 0 0 +EDGE2 8490 3169 -1.00201 0.0233746 0.00516465 1 0 1 1 0 0 +EDGE2 8490 3489 -1.01141 0.0545159 0.0062772 1 0 1 1 0 0 +EDGE2 8490 5829 -0.966298 -0.0516348 0.0204903 1 0 1 1 0 0 +EDGE2 8490 3129 -0.971629 0.123576 -0.0115713 1 0 1 1 0 0 +EDGE2 8490 1189 -0.971093 -0.0162704 0.00826962 1 0 1 1 0 0 +EDGE2 8490 3089 -0.994995 -0.0129643 0.0105441 1 0 1 1 0 0 +EDGE2 8490 1169 -0.986304 0.0273737 0.0156838 1 0 1 1 0 0 +EDGE2 8490 3050 0.0672443 0.0505179 -3.15854 1 0 1 1 0 0 +EDGE2 8490 3131 -0.113825 0.950988 1.5459 1 0 1 1 0 0 +EDGE2 8490 3491 -0.0306326 0.981476 1.54237 1 0 1 1 0 0 +EDGE2 8490 5811 0.113437 1.02434 1.59572 1 0 1 1 0 0 +EDGE2 8490 5831 -0.0618729 0.963002 1.59392 1 0 1 1 0 0 +EDGE2 8490 3171 -0.0108991 0.919407 1.56391 1 0 1 1 0 0 +EDGE2 8490 5850 -0.0154367 0.00256953 -0.00596757 1 0 1 1 0 0 +EDGE2 8490 1151 -0.0378592 0.970171 1.56756 1 0 1 1 0 0 +EDGE2 8490 1191 0.0189248 0.975331 1.54971 1 0 1 1 0 0 +EDGE2 8490 3091 0.028091 1.00482 1.54782 1 0 1 1 0 0 +EDGE2 8490 3111 -0.0845137 0.972784 1.52076 1 0 1 1 0 0 +EDGE2 8490 1171 0.0166882 1.03585 1.56884 1 0 1 1 0 0 +EDGE2 8490 8390 0.0501692 -0.0195814 -0.00647424 1 0 1 1 0 0 +EDGE2 8490 3170 0.00384307 -0.0641366 0.00737033 1 0 1 1 0 0 +EDGE2 8490 5790 0.0659498 0.00865723 -3.13241 1 0 1 1 0 0 +EDGE2 8490 5810 -0.0173161 0.0251379 -3.10629 1 0 1 1 0 0 +EDGE2 8490 5830 -0.13741 -0.0283745 0.00351017 1 0 1 1 0 0 +EDGE2 8490 3490 0.0577754 -0.0418707 -0.0134975 1 0 1 1 0 0 +EDGE2 8490 3110 0.0337382 -0.0512955 0.0131145 1 0 1 1 0 0 +EDGE2 8490 3130 0.064602 0.013541 0.0147559 1 0 1 1 0 0 +EDGE2 8490 3090 0.0333155 0.0601229 -0.00329506 1 0 1 1 0 0 +EDGE2 8490 5789 1.01802 0.00417042 -3.15855 1 0 1 1 0 0 +EDGE2 8490 1130 -0.0354444 -0.03376 -3.10183 1 0 1 1 0 0 +EDGE2 8490 1170 0.0445137 -0.0250663 0.0137416 1 0 1 1 0 0 +EDGE2 8490 1190 0.0493779 -0.0437359 -0.0175915 1 0 1 1 0 0 +EDGE2 8490 3030 0.0438198 0.0164113 -3.20412 1 0 1 1 0 0 +EDGE2 8490 1150 0.0226473 -0.0249885 -3.14209 1 0 1 1 0 0 +EDGE2 8490 1110 -0.055273 0.0598184 -3.14755 1 0 1 1 0 0 +EDGE2 8490 5809 1.00406 0.0678119 -3.12082 1 0 1 1 0 0 +EDGE2 8490 1109 1.0378 -0.00291584 -3.1547 1 0 1 1 0 0 +EDGE2 8490 1149 0.978236 0.0384469 -3.13832 1 0 1 1 0 0 +EDGE2 8490 3029 1.0753 -0.0962519 -3.1479 1 0 1 1 0 0 +EDGE2 8490 3049 0.983055 -0.0180272 -3.13505 1 0 1 1 0 0 +EDGE2 8490 1129 0.969407 -0.0431938 -3.1433 1 0 1 1 0 0 +EDGE2 8490 5851 -0.0372798 -1.04338 -1.58866 1 0 1 1 0 0 +EDGE2 8490 8391 -0.0840043 -1.03532 -1.53897 1 0 1 1 0 0 +EDGE2 8490 1111 0.0117337 -0.986338 -1.55033 1 0 1 1 0 0 +EDGE2 8490 3031 -0.0612105 -0.988276 -1.54089 1 0 1 1 0 0 +EDGE2 8490 3051 -0.0210657 -0.897743 -1.57499 1 0 1 1 0 0 +EDGE2 8490 5791 0.0520649 -1.02735 -1.57928 1 0 1 1 0 0 +EDGE2 8490 1131 0.0622524 -1.02665 -1.56078 1 0 1 1 0 0 +EDGE2 8491 3050 -0.97843 -0.0261473 1.57972 1 0 1 1 0 0 +EDGE2 8491 3131 0.031904 -0.00549696 -0.0222556 1 0 1 1 0 0 +EDGE2 8491 3092 0.967269 -0.0748859 -0.00224439 1 0 1 1 0 0 +EDGE2 8491 5812 1.0403 0.0482572 -0.00226856 1 0 1 1 0 0 +EDGE2 8491 5832 0.962359 0.0412628 0.0212812 1 0 1 1 0 0 +EDGE2 8491 3132 0.970543 0.0180389 -0.0222609 1 0 1 1 0 0 +EDGE2 8491 3172 0.960641 0.0374456 0.00345639 1 0 1 1 0 0 +EDGE2 8491 3492 0.978582 -0.000884993 0.0145917 1 0 1 1 0 0 +EDGE2 8491 3112 0.899537 -0.0142292 -0.0097463 1 0 1 1 0 0 +EDGE2 8491 1152 1.03466 -0.00966775 0.0115458 1 0 1 1 0 0 +EDGE2 8491 1172 1.11294 -0.00249978 -0.0227026 1 0 1 1 0 0 +EDGE2 8491 1192 1.03163 0.0494085 0.00825562 1 0 1 1 0 0 +EDGE2 8491 3491 0.00930225 -0.0158411 -0.0304378 1 0 1 1 0 0 +EDGE2 8491 5811 0.0363826 -0.0254452 -0.0077423 1 0 1 1 0 0 +EDGE2 8491 5831 0.0501726 0.0320978 0.00752705 1 0 1 1 0 0 +EDGE2 8491 3171 -0.0194187 -0.00646561 -0.0263827 1 0 1 1 0 0 +EDGE2 8491 5850 -1.00592 0.117128 -1.53264 1 0 1 1 0 0 +EDGE2 8491 1151 0.0199522 0.0616917 -0.0180299 1 0 1 1 0 0 +EDGE2 8491 1191 -0.0610904 -0.0145481 0.00605192 1 0 1 1 0 0 +EDGE2 8491 3091 -0.00520928 -0.0810952 -0.00633566 1 0 1 1 0 0 +EDGE2 8491 3111 -0.0925107 0.0469276 -0.0444793 1 0 1 1 0 0 +EDGE2 8491 1171 0.075846 0.0233555 0.0153035 1 0 1 1 0 0 +EDGE2 8491 8490 -0.994663 0.0269222 -1.54356 1 0 1 1 0 0 +EDGE2 8491 8390 -1.0499 0.0464506 -1.57434 1 0 1 1 0 0 +EDGE2 8491 3170 -1.0659 0.0146745 -1.59067 1 0 1 1 0 0 +EDGE2 8491 5790 -1.0094 0.0593205 1.60513 1 0 1 1 0 0 +EDGE2 8491 5810 -1.02546 0.0207713 1.55672 1 0 1 1 0 0 +EDGE2 8491 5830 -0.943982 0.0467433 -1.57048 1 0 1 1 0 0 +EDGE2 8491 3490 -1.06528 -0.00590985 -1.5988 1 0 1 1 0 0 +EDGE2 8491 3110 -1.08202 -0.00236248 -1.58943 1 0 1 1 0 0 +EDGE2 8491 3130 -0.910222 -0.041626 -1.56559 1 0 1 1 0 0 +EDGE2 8491 3090 -1.03997 -0.0248052 -1.58622 1 0 1 1 0 0 +EDGE2 8491 1130 -0.972899 0.0774894 1.59036 1 0 1 1 0 0 +EDGE2 8491 1170 -0.963996 0.0262917 -1.56469 1 0 1 1 0 0 +EDGE2 8491 1190 -0.890342 0.0527715 -1.55956 1 0 1 1 0 0 +EDGE2 8491 3030 -0.997394 -0.0156426 1.57547 1 0 1 1 0 0 +EDGE2 8491 1150 -0.971125 -0.00531972 1.55957 1 0 1 1 0 0 +EDGE2 8491 1110 -0.984659 0.0144118 1.55063 1 0 1 1 0 0 +EDGE2 8492 1173 1.01097 -0.0808539 0.002275 1 0 1 1 0 0 +EDGE2 8492 3133 0.978748 0.0960621 0.0124002 1 0 1 1 0 0 +EDGE2 8492 3493 0.997504 0.0826619 0.01762 1 0 1 1 0 0 +EDGE2 8492 5813 1.06931 0.0380774 0.003189 1 0 1 1 0 0 +EDGE2 8492 5833 1.02978 -0.00600147 0.043215 1 0 1 1 0 0 +EDGE2 8492 3173 1.05488 0.0285646 -0.0432495 1 0 1 1 0 0 +EDGE2 8492 3093 1.03543 9.72713e-06 -0.0138616 1 0 1 1 0 0 +EDGE2 8492 3113 0.985582 0.0163734 0.0120064 1 0 1 1 0 0 +EDGE2 8492 1193 1.04166 -0.0372722 -0.0352839 1 0 1 1 0 0 +EDGE2 8492 3131 -0.974834 -0.0298404 -0.0218113 1 0 1 1 0 0 +EDGE2 8492 3092 -0.0308581 -0.00236445 0.014282 1 0 1 1 0 0 +EDGE2 8492 5812 -0.0223891 -0.0647304 -0.0347534 1 0 1 1 0 0 +EDGE2 8492 1153 1.00279 -0.0700735 -0.0344978 1 0 1 1 0 0 +EDGE2 8492 5832 0.0430584 -0.0385596 -0.00419892 1 0 1 1 0 0 +EDGE2 8492 3132 -0.0374059 0.0576674 0.0352979 1 0 1 1 0 0 +EDGE2 8492 3172 0.0329207 0.021046 0.026119 1 0 1 1 0 0 +EDGE2 8492 3492 -0.0372836 0.0240504 -0.00452234 1 0 1 1 0 0 +EDGE2 8492 3112 -0.00473393 0.0317967 -0.0332297 1 0 1 1 0 0 +EDGE2 8492 8491 -1.00143 0.0599849 -0.00812491 1 0 1 1 0 0 +EDGE2 8492 1152 0.029168 0.0227079 0.0180674 1 0 1 1 0 0 +EDGE2 8492 1172 -0.0758206 -0.0150098 0.0214345 1 0 1 1 0 0 +EDGE2 8492 1192 0.021295 0.00237146 0.000718514 1 0 1 1 0 0 +EDGE2 8492 3491 -1.03322 0.00592739 -0.0068434 1 0 1 1 0 0 +EDGE2 8492 5811 -0.99936 -0.0148375 -0.0248271 1 0 1 1 0 0 +EDGE2 8492 5831 -1.02616 0.00220862 0.0359964 1 0 1 1 0 0 +EDGE2 8492 3171 -1.01612 -0.0573169 -0.00113956 1 0 1 1 0 0 +EDGE2 8492 1151 -1.09308 -0.000952625 -0.00806569 1 0 1 1 0 0 +EDGE2 8492 1191 -1.02234 -0.0322752 0.000987657 1 0 1 1 0 0 +EDGE2 8492 3091 -1.02075 0.00997488 -0.0315844 1 0 1 1 0 0 +EDGE2 8492 3111 -1.01518 0.0165845 0.0454268 1 0 1 1 0 0 +EDGE2 8492 1171 -0.918643 0.00322461 -0.00786885 1 0 1 1 0 0 +EDGE2 8493 1173 0.0667679 -0.00984399 0.00565123 1 0 1 1 0 0 +EDGE2 8493 1174 0.95359 -0.0783955 -0.00705547 1 0 1 1 0 0 +EDGE2 8493 3174 1.06643 -0.0790424 -0.0173446 1 0 1 1 0 0 +EDGE2 8493 5814 0.975595 -0.0378991 0.000631191 1 0 1 1 0 0 +EDGE2 8493 5834 0.958127 -0.0768847 0.0110325 1 0 1 1 0 0 +EDGE2 8493 3494 1.02954 -0.0719894 0.00334498 1 0 1 1 0 0 +EDGE2 8493 3094 0.923743 0.00976816 -0.00621854 1 0 1 1 0 0 +EDGE2 8493 3114 0.963463 -0.0856464 0.00116837 1 0 1 1 0 0 +EDGE2 8493 3134 0.987972 0.0373857 0.0276552 1 0 1 1 0 0 +EDGE2 8493 1194 1.02878 -0.0423555 0.024645 1 0 1 1 0 0 +EDGE2 8493 1154 1.04696 -0.0370721 -0.0130754 1 0 1 1 0 0 +EDGE2 8493 3133 -0.0827791 -0.0569133 0.0194464 1 0 1 1 0 0 +EDGE2 8493 3493 0.0288176 0.00779554 0.0335766 1 0 1 1 0 0 +EDGE2 8493 5813 -0.0302402 -0.0628475 -0.0236662 1 0 1 1 0 0 +EDGE2 8493 5833 -0.0837528 0.0403707 -0.0219212 1 0 1 1 0 0 +EDGE2 8493 3173 -0.0711702 0.102065 0.00517378 1 0 1 1 0 0 +EDGE2 8493 3093 -0.0338552 0.0601696 -0.0151535 1 0 1 1 0 0 +EDGE2 8493 3113 0.0318568 -0.0191775 -0.00861876 1 0 1 1 0 0 +EDGE2 8493 1193 0.0147526 0.00377116 -0.00631789 1 0 1 1 0 0 +EDGE2 8493 3092 -1.02392 -0.0589245 -0.0439257 1 0 1 1 0 0 +EDGE2 8493 5812 -1.01829 -0.0483333 -0.00624869 1 0 1 1 0 0 +EDGE2 8493 8492 -0.98877 0.0662231 -0.016781 1 0 1 1 0 0 +EDGE2 8493 1153 0.0522348 -0.0480059 0.0125241 1 0 1 1 0 0 +EDGE2 8493 5832 -0.914382 0.0203181 0.0509374 1 0 1 1 0 0 +EDGE2 8493 3132 -1.02995 0.0313805 -0.022271 1 0 1 1 0 0 +EDGE2 8493 3172 -1.02839 0.0241989 0.0303756 1 0 1 1 0 0 +EDGE2 8493 3492 -0.989758 -0.0692278 -0.0063706 1 0 1 1 0 0 +EDGE2 8493 3112 -1.00405 0.0104116 0.0204111 1 0 1 1 0 0 +EDGE2 8493 1152 -1.06733 -0.0129983 -0.0166938 1 0 1 1 0 0 +EDGE2 8493 1172 -0.997353 -0.0203771 0.0366522 1 0 1 1 0 0 +EDGE2 8493 1192 -0.977305 -0.114681 -0.0138807 1 0 1 1 0 0 +EDGE2 8494 3495 0.973416 0.036674 0.0379745 1 0 1 1 0 0 +EDGE2 8494 5835 1.0671 -0.0611722 0.00575223 1 0 1 1 0 0 +EDGE2 8494 5815 0.986189 -0.0375123 0.0347621 1 0 1 1 0 0 +EDGE2 8494 1173 -0.986249 -0.0398649 0.0373968 1 0 1 1 0 0 +EDGE2 8494 1174 -0.000363146 0.0148378 0.00634558 1 0 1 1 0 0 +EDGE2 8494 3115 0.988503 -0.0540959 -0.0183026 1 0 1 1 0 0 +EDGE2 8494 3175 1.02883 -0.0862867 0.0118503 1 0 1 1 0 0 +EDGE2 8494 3375 1.0001 -0.0475366 -3.14683 1 0 1 1 0 0 +EDGE2 8494 3475 0.950327 -0.000696761 -3.12249 1 0 1 1 0 0 +EDGE2 8494 3135 1.12207 0.0168863 0.049187 1 0 1 1 0 0 +EDGE2 8494 1175 1.02991 -0.0436178 0.0188266 1 0 1 1 0 0 +EDGE2 8494 1195 1.00638 0.0997783 0.0125732 1 0 1 1 0 0 +EDGE2 8494 3095 1.06624 -0.124532 0.0050403 1 0 1 1 0 0 +EDGE2 8494 1155 0.989441 -0.0634619 -0.014607 1 0 1 1 0 0 +EDGE2 8494 3174 0.00821792 -0.00363013 -0.00663162 1 0 1 1 0 0 +EDGE2 8494 5814 -0.0132101 -0.0159752 -0.0258589 1 0 1 1 0 0 +EDGE2 8494 5834 0.0133853 -0.0170986 -0.00468502 1 0 1 1 0 0 +EDGE2 8494 3494 0.0649343 -0.01964 0.00766126 1 0 1 1 0 0 +EDGE2 8494 3094 -0.0256302 0.00683312 0.0124312 1 0 1 1 0 0 +EDGE2 8494 3114 -0.0254462 -0.0169414 0.00243073 1 0 1 1 0 0 +EDGE2 8494 3134 0.0125669 -0.0317947 0.0134633 1 0 1 1 0 0 +EDGE2 8494 1194 0.0157497 -0.0373042 -0.0337032 1 0 1 1 0 0 +EDGE2 8494 8493 -1.04916 -0.0345245 0.0184108 1 0 1 1 0 0 +EDGE2 8494 1154 0.0264936 -0.0149479 0.0261095 1 0 1 1 0 0 +EDGE2 8494 3133 -1.03719 0.0723721 0.0247804 1 0 1 1 0 0 +EDGE2 8494 3493 -1.01654 -0.0177132 0.0209741 1 0 1 1 0 0 +EDGE2 8494 5813 -0.965377 0.0826289 -0.0186215 1 0 1 1 0 0 +EDGE2 8494 5833 -0.980038 -0.0273997 -0.0234146 1 0 1 1 0 0 +EDGE2 8494 3173 -1.03818 0.0222956 0.00390033 1 0 1 1 0 0 +EDGE2 8494 3093 -1.02215 -0.0699952 -0.005505 1 0 1 1 0 0 +EDGE2 8494 3113 -0.971098 -0.0678927 -0.00897065 1 0 1 1 0 0 +EDGE2 8494 1193 -1.01664 -0.0350792 0.0104341 1 0 1 1 0 0 +EDGE2 8494 1153 -1.05602 0.0379138 -0.0165089 1 0 1 1 0 0 +EDGE2 8495 3495 -0.085969 0.0807071 0.0215593 1 0 1 1 0 0 +EDGE2 8495 3474 1.0665 -0.0583807 -3.16189 1 0 1 1 0 0 +EDGE2 8495 3374 1.07775 -0.0134863 -3.11551 1 0 1 1 0 0 +EDGE2 8495 1196 -0.00777772 0.965496 1.60059 1 0 1 1 0 0 +EDGE2 8495 3476 -0.0315875 1.03793 1.55557 1 0 1 1 0 0 +EDGE2 8495 5836 -0.071435 0.902459 1.56682 1 0 1 1 0 0 +EDGE2 8495 5816 -0.0613174 0.910218 1.57186 1 0 1 1 0 0 +EDGE2 8495 3116 -0.0221614 0.968551 1.55691 1 0 1 1 0 0 +EDGE2 8495 3136 0.0359972 1.02862 1.54669 1 0 1 1 0 0 +EDGE2 8495 3376 -0.0724242 0.903468 1.5627 1 0 1 1 0 0 +EDGE2 8495 3096 -0.11112 0.922659 1.56865 1 0 1 1 0 0 +EDGE2 8495 1156 -0.0504603 1.05843 1.5734 1 0 1 1 0 0 +EDGE2 8495 1176 0.0840749 1.02708 1.58936 1 0 1 1 0 0 +EDGE2 8495 5835 0.0968212 -0.0385527 -0.0446439 1 0 1 1 0 0 +EDGE2 8495 5815 -0.00633808 -0.048531 0.00837599 1 0 1 1 0 0 +EDGE2 8495 1174 -1.03339 -0.0244121 -0.0145059 1 0 1 1 0 0 +EDGE2 8495 3115 -0.0259727 0.00456535 0.0207272 1 0 1 1 0 0 +EDGE2 8495 3175 0.0532093 -0.0415846 0.00497289 1 0 1 1 0 0 +EDGE2 8495 3375 0.0573895 0.0753688 -3.13491 1 0 1 1 0 0 +EDGE2 8495 3475 0.0964407 -0.00489984 -3.15103 1 0 1 1 0 0 +EDGE2 8495 3135 -0.0850835 0.0579516 -0.0263596 1 0 1 1 0 0 +EDGE2 8495 1175 0.0401339 -0.0108323 0.00943977 1 0 1 1 0 0 +EDGE2 8495 1195 0.046487 0.025199 -0.0235648 1 0 1 1 0 0 +EDGE2 8495 3095 0.00751497 0.0181287 -0.0359981 1 0 1 1 0 0 +EDGE2 8495 1155 0.0274867 -0.0142495 -0.0159388 1 0 1 1 0 0 +EDGE2 8495 3174 -0.927155 -0.0560418 -0.00242022 1 0 1 1 0 0 +EDGE2 8495 5814 -0.921631 0.0363106 0.0174707 1 0 1 1 0 0 +EDGE2 8495 5834 -0.966929 -0.0563238 0.0126324 1 0 1 1 0 0 +EDGE2 8495 8494 -1.02038 -0.0711608 0.000881792 1 0 1 1 0 0 +EDGE2 8495 3494 -0.937263 0.0519178 -0.0092616 1 0 1 1 0 0 +EDGE2 8495 3094 -0.996142 0.086437 -0.0221431 1 0 1 1 0 0 +EDGE2 8495 3114 -1.04532 -0.00278675 -0.00449898 1 0 1 1 0 0 +EDGE2 8495 3134 -1.0392 0.00465641 0.0363126 1 0 1 1 0 0 +EDGE2 8495 1194 -1.03922 -0.0154311 -0.0302602 1 0 1 1 0 0 +EDGE2 8495 1154 -0.987854 -0.00648588 0.0715904 1 0 1 1 0 0 +EDGE2 8495 3176 0.0118204 -1.03684 -1.55528 1 0 1 1 0 0 +EDGE2 8495 3496 -0.000693156 -0.998986 -1.55641 1 0 1 1 0 0 +EDGE2 8496 3495 -0.989791 -0.00253653 -1.54885 1 0 1 1 0 0 +EDGE2 8496 1197 0.967309 0.0755657 -0.0362563 1 0 1 1 0 0 +EDGE2 8496 3477 0.952541 0.0436844 0.0179379 1 0 1 1 0 0 +EDGE2 8496 5837 1.04728 0.0203971 -0.0072211 1 0 1 1 0 0 +EDGE2 8496 5817 1.03887 0.0357453 -0.0281251 1 0 1 1 0 0 +EDGE2 8496 3117 1.00774 0.0334345 0.0453168 1 0 1 1 0 0 +EDGE2 8496 3137 1.10836 -0.0864853 -0.00820254 1 0 1 1 0 0 +EDGE2 8496 3377 1.02827 0.0210165 -0.0385877 1 0 1 1 0 0 +EDGE2 8496 3097 0.926219 -0.0632784 -0.0508223 1 0 1 1 0 0 +EDGE2 8496 1177 1.02598 0.0707083 0.0232702 1 0 1 1 0 0 +EDGE2 8496 1157 1.01504 0.0341774 -0.016015 1 0 1 1 0 0 +EDGE2 8496 1196 0.00217823 -0.0659997 -0.025895 1 0 1 1 0 0 +EDGE2 8496 3476 -0.059623 0.0671488 -0.00597865 1 0 1 1 0 0 +EDGE2 8496 5836 -0.0149789 0.0668109 0.00870256 1 0 1 1 0 0 +EDGE2 8496 5816 0.0814094 -0.0176132 -0.0296555 1 0 1 1 0 0 +EDGE2 8496 3116 0.115007 0.0301009 -0.0221435 1 0 1 1 0 0 +EDGE2 8496 3136 -0.057699 0.022388 -0.0224813 1 0 1 1 0 0 +EDGE2 8496 3376 -0.0379861 -0.0403786 -0.0251354 1 0 1 1 0 0 +EDGE2 8496 3096 0.047885 0.00171668 0.0253941 1 0 1 1 0 0 +EDGE2 8496 1156 -0.00594284 0.0548597 0.0115489 1 0 1 1 0 0 +EDGE2 8496 1176 0.0450381 -0.00918014 -0.0126002 1 0 1 1 0 0 +EDGE2 8496 5835 -1.09024 0.0430243 -1.57002 1 0 1 1 0 0 +EDGE2 8496 8495 -1.01978 0.0502915 -1.57596 1 0 1 1 0 0 +EDGE2 8496 5815 -0.979292 0.0231958 -1.55926 1 0 1 1 0 0 +EDGE2 8496 3115 -0.964475 -0.0344298 -1.57567 1 0 1 1 0 0 +EDGE2 8496 3175 -0.983416 0.026292 -1.5583 1 0 1 1 0 0 +EDGE2 8496 3375 -0.871944 -0.00874045 1.5655 1 0 1 1 0 0 +EDGE2 8496 3475 -0.996972 0.044076 1.58202 1 0 1 1 0 0 +EDGE2 8496 3135 -0.981596 -0.0496745 -1.54235 1 0 1 1 0 0 +EDGE2 8496 1175 -1.09206 0.0783286 -1.58768 1 0 1 1 0 0 +EDGE2 8496 1195 -1.08032 -0.0394675 -1.57902 1 0 1 1 0 0 +EDGE2 8496 3095 -0.970944 -0.0746312 -1.55685 1 0 1 1 0 0 +EDGE2 8496 1155 -1.05003 0.0120623 -1.55419 1 0 1 1 0 0 +EDGE2 8497 1197 -0.114698 0.107624 0.0239475 1 0 1 1 0 0 +EDGE2 8497 5818 1.01993 0.0595758 -0.017223 1 0 1 1 0 0 +EDGE2 8497 5838 1.06082 0.0234965 -0.0316342 1 0 1 1 0 0 +EDGE2 8497 3098 1.0289 0.034601 0.0220948 1 0 1 1 0 0 +EDGE2 8497 3138 1.0093 0.0527264 -0.00596318 1 0 1 1 0 0 +EDGE2 8497 3378 1.06953 -0.0377423 -0.0407128 1 0 1 1 0 0 +EDGE2 8497 3478 1.0103 -0.0241296 0.00189123 1 0 1 1 0 0 +EDGE2 8497 3118 0.995951 -0.0560574 0.012589 1 0 1 1 0 0 +EDGE2 8497 1178 1.04751 0.0450947 -0.02199 1 0 1 1 0 0 +EDGE2 8497 1198 1.05076 -0.0860897 0.0262352 1 0 1 1 0 0 +EDGE2 8497 1158 0.95608 0.0316927 -0.0171539 1 0 1 1 0 0 +EDGE2 8497 3477 0.06661 0.0122459 -0.00557784 1 0 1 1 0 0 +EDGE2 8497 5837 -0.0312875 0.0851669 -0.0299532 1 0 1 1 0 0 +EDGE2 8497 5817 -0.0489937 0.0586975 -0.00244994 1 0 1 1 0 0 +EDGE2 8497 3117 0.00121115 -0.0998224 0.00895267 1 0 1 1 0 0 +EDGE2 8497 3137 0.128678 -0.0296632 0.0315462 1 0 1 1 0 0 +EDGE2 8497 3377 0.109395 -0.052548 -0.0300427 1 0 1 1 0 0 +EDGE2 8497 3097 -0.0073225 -0.0676832 -0.0320592 1 0 1 1 0 0 +EDGE2 8497 1177 0.0691927 -0.0450873 -0.00856756 1 0 1 1 0 0 +EDGE2 8497 1157 0.0101787 0.0371247 0.0233644 1 0 1 1 0 0 +EDGE2 8497 1196 -0.953037 -0.0376975 0.0273727 1 0 1 1 0 0 +EDGE2 8497 3476 -1.03011 0.0315891 -0.00487659 1 0 1 1 0 0 +EDGE2 8497 5836 -0.958161 -0.0178031 -0.016083 1 0 1 1 0 0 +EDGE2 8497 8496 -0.940081 0.0214132 0.00978549 1 0 1 1 0 0 +EDGE2 8497 5816 -0.917021 -0.00341751 -0.0106489 1 0 1 1 0 0 +EDGE2 8497 3116 -0.910984 -0.0380532 0.00503941 1 0 1 1 0 0 +EDGE2 8497 3136 -1.10511 -0.0364296 -0.0127813 1 0 1 1 0 0 +EDGE2 8497 3376 -0.940918 0.0393548 0.0184428 1 0 1 1 0 0 +EDGE2 8497 3096 -1.03697 0.0350677 0.0268095 1 0 1 1 0 0 +EDGE2 8497 1156 -1.12865 -0.0549879 0.0300751 1 0 1 1 0 0 +EDGE2 8497 1176 -1.05695 0.0274295 0.0161382 1 0 1 1 0 0 +EDGE2 8498 1197 -0.915091 0.0239613 -0.0315371 1 0 1 1 0 0 +EDGE2 8498 5839 0.891779 -0.0431255 -0.0386281 1 0 1 1 0 0 +EDGE2 8498 3119 0.990851 0.00969651 -0.021953 1 0 1 1 0 0 +EDGE2 8498 3379 0.996709 -0.0247065 0.0167093 1 0 1 1 0 0 +EDGE2 8498 3479 1.01228 -0.0234768 0.0099503 1 0 1 1 0 0 +EDGE2 8498 5819 0.995121 -0.0402915 -0.0291295 1 0 1 1 0 0 +EDGE2 8498 3139 1.12022 0.00494703 -0.0017743 1 0 1 1 0 0 +EDGE2 8498 1179 0.934981 0.0588246 -0.00112999 1 0 1 1 0 0 +EDGE2 8498 1199 1.01238 0.0764317 -0.025062 1 0 1 1 0 0 +EDGE2 8498 3099 0.954618 0.0822735 0.00157953 1 0 1 1 0 0 +EDGE2 8498 1159 0.991654 0.0517566 -0.0231379 1 0 1 1 0 0 +EDGE2 8498 5818 -0.0331159 -0.0408627 -0.00356737 1 0 1 1 0 0 +EDGE2 8498 5838 -0.00617962 0.0527227 0.00948377 1 0 1 1 0 0 +EDGE2 8498 3098 -0.0392757 -0.0295371 0.00485999 1 0 1 1 0 0 +EDGE2 8498 3138 -0.0948545 0.0221557 -0.00235845 1 0 1 1 0 0 +EDGE2 8498 3378 0.00748231 0.0877727 0.00221732 1 0 1 1 0 0 +EDGE2 8498 3478 0.0560004 0.0246088 -0.0269332 1 0 1 1 0 0 +EDGE2 8498 3118 0.0520859 0.0550111 0.00233704 1 0 1 1 0 0 +EDGE2 8498 1178 0.0539046 0.0263604 0.023543 1 0 1 1 0 0 +EDGE2 8498 1198 -0.0319286 0.0326899 -0.0258293 1 0 1 1 0 0 +EDGE2 8498 1158 -0.0153525 0.00964929 0.00845217 1 0 1 1 0 0 +EDGE2 8498 3477 -1.00632 -0.0097858 -0.0194987 1 0 1 1 0 0 +EDGE2 8498 5837 -1.01672 -0.0314657 0.0233427 1 0 1 1 0 0 +EDGE2 8498 8497 -0.97928 -0.0305581 0.0113586 1 0 1 1 0 0 +EDGE2 8498 5817 -0.956549 -0.0737388 -0.0291696 1 0 1 1 0 0 +EDGE2 8498 3117 -1.0185 0.0700699 -0.0141783 1 0 1 1 0 0 +EDGE2 8498 3137 -1.04925 0.0941175 -0.0125087 1 0 1 1 0 0 +EDGE2 8498 3377 -0.955938 0.0233423 0.00888436 1 0 1 1 0 0 +EDGE2 8498 3097 -1.02918 0.000766967 -0.0362352 1 0 1 1 0 0 +EDGE2 8498 1177 -0.996096 -0.0125521 -0.02201 1 0 1 1 0 0 +EDGE2 8498 1157 -1.03312 -0.0435231 -0.0473953 1 0 1 1 0 0 +EDGE2 8499 5820 0.961216 -0.0393206 -0.0454888 1 0 1 1 0 0 +EDGE2 8499 5840 1.05065 0.028823 0.00721055 1 0 1 1 0 0 +EDGE2 8499 1160 1.10338 -0.0821124 -0.0137908 1 0 1 1 0 0 +EDGE2 8499 3140 0.992821 0.0121295 -0.0317643 1 0 1 1 0 0 +EDGE2 8499 3420 0.942337 0.0448471 -3.16188 1 0 1 1 0 0 +EDGE2 8499 3440 0.923608 -0.0138924 -3.14391 1 0 1 1 0 0 +EDGE2 8499 3480 1.10747 0.0203002 -0.00730007 1 0 1 1 0 0 +EDGE2 8499 3380 0.982383 0.0330067 0.00853545 1 0 1 1 0 0 +EDGE2 8499 1200 1.02836 0.0290378 -0.0379839 1 0 1 1 0 0 +EDGE2 8499 3100 1.0513 -0.00403724 0.0236414 1 0 1 1 0 0 +EDGE2 8499 3120 0.99323 0.0734997 -0.013212 1 0 1 1 0 0 +EDGE2 8499 1180 1.00405 0.0987982 0.000783278 1 0 1 1 0 0 +EDGE2 8499 900 1.06675 -0.0416209 -3.13486 1 0 1 1 0 0 +EDGE2 8499 840 1.02059 0.0355006 -3.14672 1 0 1 1 0 0 +EDGE2 8499 860 0.918931 0.0419898 -3.16369 1 0 1 1 0 0 +EDGE2 8499 5839 0.0139162 0.00355943 0.00401376 1 0 1 1 0 0 +EDGE2 8499 3119 0.0335863 0.00734373 -0.0377583 1 0 1 1 0 0 +EDGE2 8499 3379 0.0109556 -0.000161318 -0.00538689 1 0 1 1 0 0 +EDGE2 8499 3479 -0.0401429 -0.0458826 0.0115391 1 0 1 1 0 0 +EDGE2 8499 5819 0.0237555 -0.0134979 0.0123746 1 0 1 1 0 0 +EDGE2 8499 3139 0.0527618 -0.0251397 0.0361353 1 0 1 1 0 0 +EDGE2 8499 1179 0.0260867 -0.021694 0.0347916 1 0 1 1 0 0 +EDGE2 8499 1199 0.00457169 0.00473163 -0.0114438 1 0 1 1 0 0 +EDGE2 8499 3099 0.0287026 -0.0166642 0.0382799 1 0 1 1 0 0 +EDGE2 8499 1159 0.0108707 0.0265509 -0.0323661 1 0 1 1 0 0 +EDGE2 8499 5818 -1.033 -0.0287423 0.0261055 1 0 1 1 0 0 +EDGE2 8499 5838 -1.09529 -0.0453271 -0.0301148 1 0 1 1 0 0 +EDGE2 8499 8498 -1.03845 -0.0404222 0.0141428 1 0 1 1 0 0 +EDGE2 8499 3098 -0.937997 -0.00971295 -0.0334208 1 0 1 1 0 0 +EDGE2 8499 3138 -1.02172 -0.0279972 0.00136141 1 0 1 1 0 0 +EDGE2 8499 3378 -1.01558 0.0883214 0.0206534 1 0 1 1 0 0 +EDGE2 8499 3478 -0.986971 0.0331059 -0.00644236 1 0 1 1 0 0 +EDGE2 8499 3118 -0.998675 0.0197788 -0.00819824 1 0 1 1 0 0 +EDGE2 8499 1178 -0.980397 -0.0162112 0.014758 1 0 1 1 0 0 +EDGE2 8499 1198 -1.05705 -0.0702809 -0.0383107 1 0 1 1 0 0 +EDGE2 8499 1158 -1.02148 -0.0143168 0.0379838 1 0 1 1 0 0 +EDGE2 8500 5820 0.0668745 0.0514914 0.027383 1 0 1 1 0 0 +EDGE2 8500 839 0.925827 0.055132 -3.15896 1 0 1 1 0 0 +EDGE2 8500 899 1.0082 0.0412887 -3.12097 1 0 1 1 0 0 +EDGE2 8500 3419 0.928419 -0.0423933 -3.12607 1 0 1 1 0 0 +EDGE2 8500 3439 0.986779 0.0383358 -3.14578 1 0 1 1 0 0 +EDGE2 8500 859 0.951879 -0.0218211 -3.11802 1 0 1 1 0 0 +EDGE2 8500 3441 -0.0406472 -1.02306 -1.5657 1 0 1 1 0 0 +EDGE2 8500 841 0.00359312 -1.12039 -1.58284 1 0 1 1 0 0 +EDGE2 8500 901 0.00310334 -0.976032 -1.5826 1 0 1 1 0 0 +EDGE2 8500 1201 0.0321945 -1.00435 -1.55194 1 0 1 1 0 0 +EDGE2 8500 3421 -0.00647491 -0.949808 -1.56938 1 0 1 1 0 0 +EDGE2 8500 861 -0.036747 -0.953738 -1.55289 1 0 1 1 0 0 +EDGE2 8500 5840 -0.120541 -0.0527597 -0.0130779 1 0 1 1 0 0 +EDGE2 8500 5821 0.0230655 1.00829 1.5519 1 0 1 1 0 0 +EDGE2 8500 1160 0.0366443 0.0326635 0.00750525 1 0 1 1 0 0 +EDGE2 8500 3140 -0.0232848 0.0434362 -0.0111688 1 0 1 1 0 0 +EDGE2 8500 3420 -0.0958099 -0.0701512 -3.13092 1 0 1 1 0 0 +EDGE2 8500 3440 0.0469823 0.0525727 -3.18144 1 0 1 1 0 0 +EDGE2 8500 3480 -0.0372596 -0.0433505 -0.0140494 1 0 1 1 0 0 +EDGE2 8500 3380 0.0362176 0.0675489 0.00818393 1 0 1 1 0 0 +EDGE2 8500 1200 0.0539265 0.112196 0.0088651 1 0 1 1 0 0 +EDGE2 8500 3100 -0.00312269 -0.000248609 -0.0204217 1 0 1 1 0 0 +EDGE2 8500 3120 0.0388882 0.00141644 0.00511108 1 0 1 1 0 0 +EDGE2 8500 1180 -0.0320489 -0.0138076 0.00373042 1 0 1 1 0 0 +EDGE2 8500 900 0.0105986 0.012202 -3.1181 1 0 1 1 0 0 +EDGE2 8500 840 0.00427096 0.122216 -3.1173 1 0 1 1 0 0 +EDGE2 8500 860 -0.0362765 -0.11556 -3.09769 1 0 1 1 0 0 +EDGE2 8500 5841 0.0125988 0.992119 1.56156 1 0 1 1 0 0 +EDGE2 8500 3101 0.0262907 1.05464 1.57139 1 0 1 1 0 0 +EDGE2 8500 3141 0.0508802 1.09747 1.60816 1 0 1 1 0 0 +EDGE2 8500 3381 -0.0691379 1.0559 1.58886 1 0 1 1 0 0 +EDGE2 8500 3481 0.0673791 0.986967 1.59032 1 0 1 1 0 0 +EDGE2 8500 3121 0.0276869 0.814448 1.56477 1 0 1 1 0 0 +EDGE2 8500 1161 0.0642955 1.01656 1.54074 1 0 1 1 0 0 +EDGE2 8500 1181 -0.024418 0.966363 1.57837 1 0 1 1 0 0 +EDGE2 8500 5839 -1.00743 -0.0324841 0.0103808 1 0 1 1 0 0 +EDGE2 8500 8499 -0.974651 0.0514785 0.0448967 1 0 1 1 0 0 +EDGE2 8500 3119 -0.989438 0.121116 -0.0332745 1 0 1 1 0 0 +EDGE2 8500 3379 -1.05265 0.0246218 -0.0247693 1 0 1 1 0 0 +EDGE2 8500 3479 -0.983778 0.0245379 -0.0363887 1 0 1 1 0 0 +EDGE2 8500 5819 -1.01302 0.0568203 0.00412052 1 0 1 1 0 0 +EDGE2 8500 3139 -1.11561 -0.0183593 0.00685547 1 0 1 1 0 0 +EDGE2 8500 1179 -0.982071 0.0428896 -0.009868 1 0 1 1 0 0 +EDGE2 8500 1199 -0.960863 -0.090839 -0.0413685 1 0 1 1 0 0 +EDGE2 8500 3099 -0.989185 0.0411623 -0.00414062 1 0 1 1 0 0 +EDGE2 8500 1159 -1.02646 -0.0278235 -0.00562928 1 0 1 1 0 0 +EDGE2 8501 5820 -0.975544 -0.031833 1.54921 1 0 1 1 0 0 +EDGE2 8501 3441 -0.0613505 0.00783624 0.00976904 1 0 1 1 0 0 +EDGE2 8501 902 1.00658 -0.0515653 -0.0326839 1 0 1 1 0 0 +EDGE2 8501 3422 1.03294 0.080589 0.0154565 1 0 1 1 0 0 +EDGE2 8501 3442 0.951686 -0.0226783 0.0139284 1 0 1 1 0 0 +EDGE2 8501 1202 0.999955 0.0286505 -0.0359288 1 0 1 1 0 0 +EDGE2 8501 842 0.973192 -0.0360286 0.0147525 1 0 1 1 0 0 +EDGE2 8501 862 0.887368 -0.04059 0.00114132 1 0 1 1 0 0 +EDGE2 8501 841 -0.0421943 -0.0626383 0.00904553 1 0 1 1 0 0 +EDGE2 8501 901 0.0599979 0.0390503 -0.0097035 1 0 1 1 0 0 +EDGE2 8501 1201 -0.0680467 -0.0093342 -0.000313977 1 0 1 1 0 0 +EDGE2 8501 3421 0.0568369 -0.0715576 0.0167064 1 0 1 1 0 0 +EDGE2 8501 861 0.0207114 -0.00373438 -0.0205099 1 0 1 1 0 0 +EDGE2 8501 8500 -1.00943 -0.0203399 1.55935 1 0 1 1 0 0 +EDGE2 8501 5840 -1.02202 0.0296479 1.54726 1 0 1 1 0 0 +EDGE2 8501 1160 -1.03803 -0.0257256 1.5628 1 0 1 1 0 0 +EDGE2 8501 3140 -1.04138 -0.0308322 1.55685 1 0 1 1 0 0 +EDGE2 8501 3420 -1.06269 0.0274316 -1.565 1 0 1 1 0 0 +EDGE2 8501 3440 -0.984017 0.0385085 -1.5931 1 0 1 1 0 0 +EDGE2 8501 3480 -1.00412 -0.0683249 1.56451 1 0 1 1 0 0 +EDGE2 8501 3380 -0.969616 -0.0147728 1.54468 1 0 1 1 0 0 +EDGE2 8501 1200 -0.999375 -0.0432986 1.58077 1 0 1 1 0 0 +EDGE2 8501 3100 -0.964903 0.069776 1.56791 1 0 1 1 0 0 +EDGE2 8501 3120 -1.03143 0.0069348 1.55118 1 0 1 1 0 0 +EDGE2 8501 1180 -0.928737 -0.0230561 1.55676 1 0 1 1 0 0 +EDGE2 8501 900 -0.913894 -0.0101205 -1.58767 1 0 1 1 0 0 +EDGE2 8501 840 -1.01746 -0.00824292 -1.59275 1 0 1 1 0 0 +EDGE2 8501 860 -1.05324 -0.0472039 -1.57104 1 0 1 1 0 0 +EDGE2 8502 3423 0.912943 0.0166781 -0.00288224 1 0 1 1 0 0 +EDGE2 8502 3443 1.02535 -0.0333193 -0.020416 1 0 1 1 0 0 +EDGE2 8502 863 1.12248 0.0240349 0.0152584 1 0 1 1 0 0 +EDGE2 8502 903 0.948232 0.0700171 0.00627445 1 0 1 1 0 0 +EDGE2 8502 1203 0.990164 -0.0309881 -0.0200734 1 0 1 1 0 0 +EDGE2 8502 843 1.08916 -0.105577 -0.00625804 1 0 1 1 0 0 +EDGE2 8502 3441 -0.956057 -0.0745114 0.000488085 1 0 1 1 0 0 +EDGE2 8502 902 -0.0608422 -0.0035453 0.00345828 1 0 1 1 0 0 +EDGE2 8502 3422 -0.0231467 0.0352448 0.00467132 1 0 1 1 0 0 +EDGE2 8502 3442 0.0246441 -0.00883337 -0.0132868 1 0 1 1 0 0 +EDGE2 8502 1202 0.0239015 -0.025957 0.0054367 1 0 1 1 0 0 +EDGE2 8502 842 -0.0190078 0.0565875 -0.06036 1 0 1 1 0 0 +EDGE2 8502 862 -0.0271486 -0.025071 -0.0570664 1 0 1 1 0 0 +EDGE2 8502 8501 -0.935892 -0.00831486 -0.0229071 1 0 1 1 0 0 +EDGE2 8502 841 -1.06637 -0.00318684 -0.00629218 1 0 1 1 0 0 +EDGE2 8502 901 -1.07647 -0.0318056 -0.0383464 1 0 1 1 0 0 +EDGE2 8502 1201 -0.886989 0.0112371 0.00732986 1 0 1 1 0 0 +EDGE2 8502 3421 -0.944852 0.0578032 0.0137855 1 0 1 1 0 0 +EDGE2 8502 861 -1.02745 -0.0125013 0.00176137 1 0 1 1 0 0 +EDGE2 8503 864 0.97498 0.0397689 0.0139754 1 0 1 1 0 0 +EDGE2 8503 1204 0.983282 0.00199759 0.0125482 1 0 1 1 0 0 +EDGE2 8503 3424 0.954293 0.0360379 -0.00701794 1 0 1 1 0 0 +EDGE2 8503 3444 1.02276 -0.0596077 -0.00204846 1 0 1 1 0 0 +EDGE2 8503 904 0.99309 0.0125164 0.0183245 1 0 1 1 0 0 +EDGE2 8503 3423 -0.114687 0.13302 -0.000480513 1 0 1 1 0 0 +EDGE2 8503 844 0.946307 -0.00855892 0.0109829 1 0 1 1 0 0 +EDGE2 8503 3443 -0.00796959 0.0118149 -0.0428168 1 0 1 1 0 0 +EDGE2 8503 863 -0.0588801 -0.00440674 -0.0359242 1 0 1 1 0 0 +EDGE2 8503 903 0.00458252 0.0819566 0.0020675 1 0 1 1 0 0 +EDGE2 8503 1203 0.0515235 -0.0366809 0.0221059 1 0 1 1 0 0 +EDGE2 8503 843 -0.00820249 0.10794 0.0425374 1 0 1 1 0 0 +EDGE2 8503 902 -1.00664 0.104901 -0.0135498 1 0 1 1 0 0 +EDGE2 8503 3422 -1.07014 -0.0191966 -0.0286068 1 0 1 1 0 0 +EDGE2 8503 3442 -0.947526 -0.0477965 -0.0235161 1 0 1 1 0 0 +EDGE2 8503 8502 -0.89683 -0.00270211 0.0100733 1 0 1 1 0 0 +EDGE2 8503 1202 -1.01356 -0.0598953 -0.0111055 1 0 1 1 0 0 +EDGE2 8503 842 -0.964881 -0.0148063 0.014854 1 0 1 1 0 0 +EDGE2 8503 862 -1.05851 -0.0399257 0.0552662 1 0 1 1 0 0 +EDGE2 8504 865 1.03544 0.0819065 0.00555124 1 0 1 1 0 0 +EDGE2 8504 3225 0.986636 -0.0290619 -3.12009 1 0 1 1 0 0 +EDGE2 8504 3425 1.03974 0.018893 0.0301533 1 0 1 1 0 0 +EDGE2 8504 3445 1.03124 0.0476846 -0.00273969 1 0 1 1 0 0 +EDGE2 8504 3465 1.05529 -0.00281045 -3.10811 1 0 1 1 0 0 +EDGE2 8504 3365 1.04138 0.0862784 -3.10372 1 0 1 1 0 0 +EDGE2 8504 1205 0.969456 0.000917156 0.0170003 1 0 1 1 0 0 +EDGE2 8504 3205 1.0161 0.0642241 -3.11543 1 0 1 1 0 0 +EDGE2 8504 905 0.882107 -0.0252616 -0.0140009 1 0 1 1 0 0 +EDGE2 8504 864 0.0613024 -0.0361725 -0.00555773 1 0 1 1 0 0 +EDGE2 8504 705 1.06216 0.0727717 -3.14205 1 0 1 1 0 0 +EDGE2 8504 825 0.986534 0.0141879 -3.14536 1 0 1 1 0 0 +EDGE2 8504 845 0.982101 -0.0593817 0.0392839 1 0 1 1 0 0 +EDGE2 8504 1204 0.011775 -0.0885561 -0.0214946 1 0 1 1 0 0 +EDGE2 8504 3424 0.0289268 -0.0133285 -0.0111199 1 0 1 1 0 0 +EDGE2 8504 3444 -0.00988084 -0.0150992 0.0166364 1 0 1 1 0 0 +EDGE2 8504 904 -0.00197127 -0.0226021 0.0130296 1 0 1 1 0 0 +EDGE2 8504 3423 -0.947848 -0.0141052 0.0125008 1 0 1 1 0 0 +EDGE2 8504 8503 -0.997954 0.00713404 0.0177138 1 0 1 1 0 0 +EDGE2 8504 844 -0.0884272 -0.0673917 0.00396582 1 0 1 1 0 0 +EDGE2 8504 3443 -1.14625 -0.0630538 -0.0159048 1 0 1 1 0 0 +EDGE2 8504 863 -0.892734 0.045325 -0.0252243 1 0 1 1 0 0 +EDGE2 8504 903 -0.977541 -0.0512233 -0.0147662 1 0 1 1 0 0 +EDGE2 8504 1203 -0.937662 0.0294748 -0.0205147 1 0 1 1 0 0 +EDGE2 8504 843 -0.936431 -0.0514063 -0.0306279 1 0 1 1 0 0 +EDGE2 8505 3364 1.0448 -0.030201 -3.13653 1 0 1 1 0 0 +EDGE2 8505 3464 0.98301 0.018657 -3.17637 1 0 1 1 0 0 +EDGE2 8505 824 1.05667 -0.00669257 -3.13078 1 0 1 1 0 0 +EDGE2 8505 3204 0.99922 -0.00660691 -3.16219 1 0 1 1 0 0 +EDGE2 8505 3224 1.0356 -0.0439712 -3.17492 1 0 1 1 0 0 +EDGE2 8505 704 0.879629 -0.065612 -3.16726 1 0 1 1 0 0 +EDGE2 8505 865 0.0457543 -0.0345993 -0.0189705 1 0 1 1 0 0 +EDGE2 8505 3446 -0.000282495 1.00983 1.55403 1 0 1 1 0 0 +EDGE2 8505 3225 0.0322923 -0.0194631 -3.17903 1 0 1 1 0 0 +EDGE2 8505 826 0.0803868 0.984109 1.53737 1 0 1 1 0 0 +EDGE2 8505 866 0.0431314 1.01262 1.56842 1 0 1 1 0 0 +EDGE2 8505 906 0.0224522 1.0411 1.55869 1 0 1 1 0 0 +EDGE2 8505 3426 0.0818624 1.04651 1.54676 1 0 1 1 0 0 +EDGE2 8505 846 0.0220483 0.964413 1.54888 1 0 1 1 0 0 +EDGE2 8505 3425 0.0292751 -0.0952956 0.0138124 1 0 1 1 0 0 +EDGE2 8505 3445 0.00478747 0.00666019 0.00795038 1 0 1 1 0 0 +EDGE2 8505 3465 -0.0306774 -0.0506607 -3.13447 1 0 1 1 0 0 +EDGE2 8505 3365 -0.0674165 -0.0292805 -3.14171 1 0 1 1 0 0 +EDGE2 8505 1205 -0.0303649 0.0408569 -0.00375465 1 0 1 1 0 0 +EDGE2 8505 3205 -0.000877432 -0.00434317 -3.13951 1 0 1 1 0 0 +EDGE2 8505 905 0.0538482 0.0793261 0.0397373 1 0 1 1 0 0 +EDGE2 8505 864 -0.990735 0.0897173 -0.030891 1 0 1 1 0 0 +EDGE2 8505 8504 -0.962835 -0.0391402 -0.0197547 1 0 1 1 0 0 +EDGE2 8505 705 0.0345045 -0.0619823 -3.12931 1 0 1 1 0 0 +EDGE2 8505 825 -0.0599961 0.0218092 -3.13435 1 0 1 1 0 0 +EDGE2 8505 845 0.0101313 -0.00358385 0.0167822 1 0 1 1 0 0 +EDGE2 8505 1204 -0.976231 0.0235658 -0.00245758 1 0 1 1 0 0 +EDGE2 8505 3424 -1.13854 -0.0429804 -0.0219915 1 0 1 1 0 0 +EDGE2 8505 3444 -0.998654 0.0208114 -0.00141869 1 0 1 1 0 0 +EDGE2 8505 904 -0.98464 -0.0202215 -0.00208709 1 0 1 1 0 0 +EDGE2 8505 844 -0.932958 0.0143962 0.0258747 1 0 1 1 0 0 +EDGE2 8505 1206 -0.0102771 -1.03473 -1.55825 1 0 1 1 0 0 +EDGE2 8505 3226 0.0346601 -1.00941 -1.53338 1 0 1 1 0 0 +EDGE2 8505 3366 0.00155166 -0.903756 -1.57816 1 0 1 1 0 0 +EDGE2 8505 3466 -0.0240576 -0.933069 -1.57227 1 0 1 1 0 0 +EDGE2 8505 3206 0.0497161 -1.02934 -1.55841 1 0 1 1 0 0 +EDGE2 8505 706 -0.014685 -0.970546 -1.58825 1 0 1 1 0 0 +EDGE2 8506 8505 -0.982065 -9.01056e-05 1.55851 1 0 1 1 0 0 +EDGE2 8506 865 -0.990529 0.029271 1.5666 1 0 1 1 0 0 +EDGE2 8506 3225 -0.984996 -0.0415232 -1.54012 1 0 1 1 0 0 +EDGE2 8506 3425 -0.96176 -0.0554419 1.58153 1 0 1 1 0 0 +EDGE2 8506 3445 -1.05638 0.0259545 1.59656 1 0 1 1 0 0 +EDGE2 8506 3465 -1.01366 -0.00736928 -1.55364 1 0 1 1 0 0 +EDGE2 8506 3365 -1.04469 -0.0513688 -1.55254 1 0 1 1 0 0 +EDGE2 8506 1205 -1.0237 -0.0239682 1.57502 1 0 1 1 0 0 +EDGE2 8506 3205 -1.05923 0.0111951 -1.58116 1 0 1 1 0 0 +EDGE2 8506 905 -0.984165 -0.0743863 1.57411 1 0 1 1 0 0 +EDGE2 8506 705 -1.02639 0.122339 -1.58342 1 0 1 1 0 0 +EDGE2 8506 825 -0.999472 -0.00642937 -1.57158 1 0 1 1 0 0 +EDGE2 8506 845 -0.917807 -0.0289303 1.57035 1 0 1 1 0 0 +EDGE2 8506 3367 0.946137 0.0151894 0.030034 1 0 1 1 0 0 +EDGE2 8506 1206 0.026935 0.0302305 0.0375523 1 0 1 1 0 0 +EDGE2 8506 3226 0.000687988 0.0164873 0.000721934 1 0 1 1 0 0 +EDGE2 8506 3366 -0.00727948 0.0618444 0.00901196 1 0 1 1 0 0 +EDGE2 8506 3466 -0.0080424 -0.035484 -0.000793235 1 0 1 1 0 0 +EDGE2 8506 3206 -0.0116704 -0.0404779 0.0141202 1 0 1 1 0 0 +EDGE2 8506 706 -0.0153285 -0.0488307 -0.00295702 1 0 1 1 0 0 +EDGE2 8506 3467 1.00171 0.0184581 0.00858889 1 0 1 1 0 0 +EDGE2 8506 1207 1.02437 -0.00239317 -0.00111242 1 0 1 1 0 0 +EDGE2 8506 3207 1.0022 -0.0448977 0.000211931 1 0 1 1 0 0 +EDGE2 8506 3227 0.99559 -0.0454905 -0.0168172 1 0 1 1 0 0 +EDGE2 8506 707 1.08947 -0.0345899 0.0130204 1 0 1 1 0 0 +EDGE2 8507 8506 -0.938267 0.0157424 -0.0153841 1 0 1 1 0 0 +EDGE2 8507 3228 1.05785 -0.0726499 -0.00480648 1 0 1 1 0 0 +EDGE2 8507 3367 0.0274182 0.02929 0.016735 1 0 1 1 0 0 +EDGE2 8507 1206 -0.987587 0.00431223 0.0098038 1 0 1 1 0 0 +EDGE2 8507 3226 -1.00617 0.0821691 -0.0546365 1 0 1 1 0 0 +EDGE2 8507 3366 -0.984154 -0.028261 -0.0115561 1 0 1 1 0 0 +EDGE2 8507 3466 -0.931009 0.0489937 0.0224182 1 0 1 1 0 0 +EDGE2 8507 3206 -0.9363 -0.0277275 -0.00586785 1 0 1 1 0 0 +EDGE2 8507 706 -1.04993 -0.0152228 -0.00784218 1 0 1 1 0 0 +EDGE2 8507 3467 0.0452155 0.0456442 0.0225741 1 0 1 1 0 0 +EDGE2 8507 1207 0.0474495 0.0357111 -0.000978712 1 0 1 1 0 0 +EDGE2 8507 3207 -0.103593 0.0916186 -0.0322076 1 0 1 1 0 0 +EDGE2 8507 3227 -0.0352911 -0.0237273 -0.000447932 1 0 1 1 0 0 +EDGE2 8507 707 0.0214733 0.0122775 -0.0284281 1 0 1 1 0 0 +EDGE2 8507 3468 0.986068 0.0127272 0.00875951 1 0 1 1 0 0 +EDGE2 8507 3368 0.90837 -0.00534266 -0.0025973 1 0 1 1 0 0 +EDGE2 8507 708 1.04698 -0.0039047 0.00728074 1 0 1 1 0 0 +EDGE2 8507 1208 1.04252 -0.00377594 -0.0127916 1 0 1 1 0 0 +EDGE2 8507 3208 0.907183 0.00853424 0.0206982 1 0 1 1 0 0 +EDGE2 8508 8507 -0.980364 0.0331127 0.00663534 1 0 1 1 0 0 +EDGE2 8508 3228 -0.016425 -0.00488438 0.0174305 1 0 1 1 0 0 +EDGE2 8508 3367 -0.935347 0.0166121 -0.0151455 1 0 1 1 0 0 +EDGE2 8508 3467 -1.03426 -0.0163318 -0.017119 1 0 1 1 0 0 +EDGE2 8508 1207 -0.904075 0.0066681 0.0236847 1 0 1 1 0 0 +EDGE2 8508 3207 -1.01075 -0.068126 0.0119186 1 0 1 1 0 0 +EDGE2 8508 3227 -0.952339 -0.0421479 -0.0231871 1 0 1 1 0 0 +EDGE2 8508 707 -0.967739 -0.00363639 -0.00272226 1 0 1 1 0 0 +EDGE2 8508 3468 0.052628 -0.0402894 0.0461534 1 0 1 1 0 0 +EDGE2 8508 3368 -0.0305869 -0.0397433 -0.012156 1 0 1 1 0 0 +EDGE2 8508 3369 0.941285 -0.023056 0.032394 1 0 1 1 0 0 +EDGE2 8508 708 0.138966 0.0343023 0.0198573 1 0 1 1 0 0 +EDGE2 8508 1208 0.00519055 -0.132579 0.0380929 1 0 1 1 0 0 +EDGE2 8508 3208 0.0556467 -0.000115718 -0.0200506 1 0 1 1 0 0 +EDGE2 8508 3469 1.05785 0.0392844 0.00590299 1 0 1 1 0 0 +EDGE2 8508 1209 1.03167 -0.100653 0.00221553 1 0 1 1 0 0 +EDGE2 8508 3209 1.03142 0.106966 0.0185235 1 0 1 1 0 0 +EDGE2 8508 3229 0.94924 0.0582726 -0.0130225 1 0 1 1 0 0 +EDGE2 8508 709 0.89527 -0.0893312 0.000912034 1 0 1 1 0 0 +EDGE2 8509 8508 -0.979137 0.102292 0.032305 1 0 1 1 0 0 +EDGE2 8509 3228 -1.00972 0.0253734 0.000786058 1 0 1 1 0 0 +EDGE2 8509 3468 -0.985453 -0.0672655 0.0133747 1 0 1 1 0 0 +EDGE2 8509 3368 -1.01872 -0.0892647 0.0258356 1 0 1 1 0 0 +EDGE2 8509 3370 0.983011 -0.0190037 0.0244904 1 0 1 1 0 0 +EDGE2 8509 3470 0.898691 0.0831518 -0.0131519 1 0 1 1 0 0 +EDGE2 8509 3369 0.0103819 0.0848044 -0.00152307 1 0 1 1 0 0 +EDGE2 8509 708 -0.927042 -0.00217475 -0.00834817 1 0 1 1 0 0 +EDGE2 8509 1208 -1.05523 0.0720176 -0.00817594 1 0 1 1 0 0 +EDGE2 8509 3208 -1.07779 -0.00971095 0.0511016 1 0 1 1 0 0 +EDGE2 8509 3469 0.0460568 0.102868 0.00559125 1 0 1 1 0 0 +EDGE2 8509 1209 0.0656351 -0.0148884 -0.0046962 1 0 1 1 0 0 +EDGE2 8509 3209 0.138512 0.0508371 -0.0300448 1 0 1 1 0 0 +EDGE2 8509 3229 0.029886 0.0302163 -0.0226739 1 0 1 1 0 0 +EDGE2 8509 709 0.0929008 -0.018977 -0.0149437 1 0 1 1 0 0 +EDGE2 8509 730 1.02231 0.0162832 -3.13726 1 0 1 1 0 0 +EDGE2 8509 3190 0.946126 0.0186829 -3.17909 1 0 1 1 0 0 +EDGE2 8509 3210 1.0653 0.00756607 0.0046327 1 0 1 1 0 0 +EDGE2 8509 3230 1.01504 0.0115735 0.00075374 1 0 1 1 0 0 +EDGE2 8509 1210 1.05233 0.011499 0.0270718 1 0 1 1 0 0 +EDGE2 8509 710 1.08396 -0.0633161 0.0352492 1 0 1 1 0 0 +EDGE2 8510 8509 -0.937537 0.00603641 -0.0118067 1 0 1 1 0 0 +EDGE2 8510 1211 0.0532215 1.04418 1.56352 1 0 1 1 0 0 +EDGE2 8510 3211 -0.0573716 1.00705 1.56439 1 0 1 1 0 0 +EDGE2 8510 3231 0.011434 1.04967 1.59882 1 0 1 1 0 0 +EDGE2 8510 3191 -0.0273999 0.987885 1.57 1 0 1 1 0 0 +EDGE2 8510 711 -0.0218824 0.984713 1.55826 1 0 1 1 0 0 +EDGE2 8510 731 0.0827873 1.1009 1.56795 1 0 1 1 0 0 +EDGE2 8510 3370 -0.039049 0.0533181 0.00490648 1 0 1 1 0 0 +EDGE2 8510 3470 -0.0420375 -0.112981 -0.02267 1 0 1 1 0 0 +EDGE2 8510 3369 -1.11649 0.0640435 -0.0260092 1 0 1 1 0 0 +EDGE2 8510 3469 -0.995318 0.0125151 -0.00258656 1 0 1 1 0 0 +EDGE2 8510 1209 -1.00512 0.0192403 0.0106631 1 0 1 1 0 0 +EDGE2 8510 3209 -1.02534 0.00250195 0.00724972 1 0 1 1 0 0 +EDGE2 8510 3229 -0.979122 -0.0193517 -0.0311299 1 0 1 1 0 0 +EDGE2 8510 709 -1.0308 -0.0292625 -0.019765 1 0 1 1 0 0 +EDGE2 8510 730 0.10852 -0.0128877 -3.12778 1 0 1 1 0 0 +EDGE2 8510 3190 -0.0219572 0.00574092 -3.14993 1 0 1 1 0 0 +EDGE2 8510 3210 -0.0744554 0.0277734 0.0122644 1 0 1 1 0 0 +EDGE2 8510 3230 0.0645069 -0.0187104 -0.0411692 1 0 1 1 0 0 +EDGE2 8510 1210 0.0496362 0.0542729 0.00899549 1 0 1 1 0 0 +EDGE2 8510 3471 -0.118288 -1.03692 -1.57178 1 0 1 1 0 0 +EDGE2 8510 710 0.0401532 0.0872117 0.00253861 1 0 1 1 0 0 +EDGE2 8510 3371 -0.0345859 -1.09344 -1.5965 1 0 1 1 0 0 +EDGE2 8510 3189 0.957044 0.00883248 -3.14059 1 0 1 1 0 0 +EDGE2 8510 729 0.951169 0.0117877 -3.14859 1 0 1 1 0 0 +EDGE2 8511 8510 -0.980291 0.0621561 1.5752 1 0 1 1 0 0 +EDGE2 8511 3370 -1.01847 -0.0773079 1.58977 1 0 1 1 0 0 +EDGE2 8511 3470 -1.04006 -0.0280619 1.55225 1 0 1 1 0 0 +EDGE2 8511 730 -1.02024 0.0227693 -1.56983 1 0 1 1 0 0 +EDGE2 8511 3190 -0.946005 0.0840486 -1.5956 1 0 1 1 0 0 +EDGE2 8511 3210 -1.00664 -0.0576957 1.54477 1 0 1 1 0 0 +EDGE2 8511 3230 -0.995817 -0.112223 1.50152 1 0 1 1 0 0 +EDGE2 8511 1210 -0.994118 -0.041653 1.54948 1 0 1 1 0 0 +EDGE2 8511 3471 -0.0768089 -0.0360835 0.00739213 1 0 1 1 0 0 +EDGE2 8511 710 -0.933487 -0.0763536 1.55232 1 0 1 1 0 0 +EDGE2 8511 3371 -0.00124891 0.0390563 -0.0394423 1 0 1 1 0 0 +EDGE2 8511 3372 0.99324 0.0277395 -0.000554328 1 0 1 1 0 0 +EDGE2 8511 3472 1.00709 -0.0397864 -0.0149299 1 0 1 1 0 0 +EDGE2 8512 3471 -0.916037 0.0730819 -0.00832384 1 0 1 1 0 0 +EDGE2 8512 8511 -1.04596 -0.0199602 0.0187642 1 0 1 1 0 0 +EDGE2 8512 3371 -1.03467 0.109265 -0.00885873 1 0 1 1 0 0 +EDGE2 8512 3373 0.955998 -0.0380809 0.0344996 1 0 1 1 0 0 +EDGE2 8512 3372 0.103107 -0.0533613 0.0183869 1 0 1 1 0 0 +EDGE2 8512 3472 0.0593316 0.0310199 0.0115612 1 0 1 1 0 0 +EDGE2 8512 3473 1.05938 0.0449346 0.00251057 1 0 1 1 0 0 +EDGE2 8513 8512 -0.911497 -0.0200648 -0.0146571 1 0 1 1 0 0 +EDGE2 8513 3373 -0.0331087 0.0403428 0.00461183 1 0 1 1 0 0 +EDGE2 8513 3372 -0.957474 -0.0144111 0.0115914 1 0 1 1 0 0 +EDGE2 8513 3472 -1.05493 -0.0926595 -0.00979744 1 0 1 1 0 0 +EDGE2 8513 3473 -0.0482674 0.0126039 0.000844387 1 0 1 1 0 0 +EDGE2 8513 3474 1.02764 0.0317511 -0.0201157 1 0 1 1 0 0 +EDGE2 8513 3374 1.02937 -0.10453 -0.00449748 1 0 1 1 0 0 +EDGE2 8514 3495 1.03824 0.0225453 -3.13219 1 0 1 1 0 0 +EDGE2 8514 3373 -1.06182 -0.00252959 -0.0124619 1 0 1 1 0 0 +EDGE2 8514 8513 -1.12405 0.00257588 0.00129244 1 0 1 1 0 0 +EDGE2 8514 3473 -1.02461 0.0490836 -0.0349156 1 0 1 1 0 0 +EDGE2 8514 3474 -0.0760933 0.0831601 0.0093874 1 0 1 1 0 0 +EDGE2 8514 3374 0.0287561 -0.0294075 0.00691905 1 0 1 1 0 0 +EDGE2 8514 5835 1.0625 0.0265477 -3.16621 1 0 1 1 0 0 +EDGE2 8514 8495 0.962642 0.045109 -3.12196 1 0 1 1 0 0 +EDGE2 8514 5815 0.968693 -0.0639798 -3.1346 1 0 1 1 0 0 +EDGE2 8514 3115 1.00448 0.0128011 -3.13212 1 0 1 1 0 0 +EDGE2 8514 3175 1.05627 0.0432495 -3.11371 1 0 1 1 0 0 +EDGE2 8514 3375 0.950072 0.0487133 0.0114111 1 0 1 1 0 0 +EDGE2 8514 3475 1.01095 -0.0367319 -0.0300892 1 0 1 1 0 0 +EDGE2 8514 3135 1.07191 0.0382543 -3.15056 1 0 1 1 0 0 +EDGE2 8514 1175 1.02746 -0.0635775 -3.17427 1 0 1 1 0 0 +EDGE2 8514 1195 1.08175 -0.0499283 -3.13594 1 0 1 1 0 0 +EDGE2 8514 3095 0.968863 -0.0476347 -3.11617 1 0 1 1 0 0 +EDGE2 8514 1155 0.923453 -0.00176399 -3.11283 1 0 1 1 0 0 +EDGE2 8515 3495 0.0390567 0.00877213 -3.13084 1 0 1 1 0 0 +EDGE2 8515 3474 -0.975635 0.0121123 0.00547353 1 0 1 1 0 0 +EDGE2 8515 8514 -0.986177 0.0314105 -0.0345065 1 0 1 1 0 0 +EDGE2 8515 3374 -0.999593 0.0246753 -0.00995414 1 0 1 1 0 0 +EDGE2 8515 1196 -0.00581462 -1.1346 -1.56797 1 0 1 1 0 0 +EDGE2 8515 3476 -0.0202906 -1.0238 -1.57861 1 0 1 1 0 0 +EDGE2 8515 5836 0.0341585 -0.905392 -1.5414 1 0 1 1 0 0 +EDGE2 8515 8496 0.0126281 -1.01558 -1.56108 1 0 1 1 0 0 +EDGE2 8515 5816 0.0144288 -1.00857 -1.56824 1 0 1 1 0 0 +EDGE2 8515 3116 -0.022688 -0.975203 -1.58061 1 0 1 1 0 0 +EDGE2 8515 3136 -0.00812552 -1.06119 -1.52301 1 0 1 1 0 0 +EDGE2 8515 3376 0.0219679 -0.972887 -1.60401 1 0 1 1 0 0 +EDGE2 8515 3096 -0.00307245 -0.928658 -1.55548 1 0 1 1 0 0 +EDGE2 8515 1156 -0.0410711 -0.892241 -1.56982 1 0 1 1 0 0 +EDGE2 8515 1176 0.00847714 -0.992026 -1.57902 1 0 1 1 0 0 +EDGE2 8515 5835 -0.135 0.00270832 -3.13458 1 0 1 1 0 0 +EDGE2 8515 8495 -0.0178166 -0.00362484 -3.11386 1 0 1 1 0 0 +EDGE2 8515 5815 0.00582803 -0.0241117 -3.13762 1 0 1 1 0 0 +EDGE2 8515 1174 0.98781 -0.028884 -3.17913 1 0 1 1 0 0 +EDGE2 8515 3115 -0.0583876 -0.0608003 -3.12985 1 0 1 1 0 0 +EDGE2 8515 3175 -0.00977486 0.0445967 -3.12682 1 0 1 1 0 0 +EDGE2 8515 3375 0.0163816 0.0230193 -0.00726573 1 0 1 1 0 0 +EDGE2 8515 3475 0.0766543 0.0690102 -0.00932766 1 0 1 1 0 0 +EDGE2 8515 3135 -0.0511985 0.0221243 -3.12589 1 0 1 1 0 0 +EDGE2 8515 1175 0.00630034 -0.117974 -3.16117 1 0 1 1 0 0 +EDGE2 8515 1195 -0.0313219 -0.0213561 -3.15947 1 0 1 1 0 0 +EDGE2 8515 3095 -0.0671846 0.0234496 -3.16089 1 0 1 1 0 0 +EDGE2 8515 1155 0.0526773 0.0592449 -3.16211 1 0 1 1 0 0 +EDGE2 8515 3174 0.934366 0.0216774 -3.1278 1 0 1 1 0 0 +EDGE2 8515 5814 0.916373 -0.0392769 -3.12423 1 0 1 1 0 0 +EDGE2 8515 5834 0.969593 0.0124548 -3.16184 1 0 1 1 0 0 +EDGE2 8515 8494 0.950696 0.0780058 -3.13819 1 0 1 1 0 0 +EDGE2 8515 3494 1.00133 -0.129496 -3.13399 1 0 1 1 0 0 +EDGE2 8515 3094 1.00291 0.00777003 -3.14948 1 0 1 1 0 0 +EDGE2 8515 3114 0.995037 -0.00859454 -3.14786 1 0 1 1 0 0 +EDGE2 8515 3134 0.935614 0.0809567 -3.15645 1 0 1 1 0 0 +EDGE2 8515 1194 0.96148 -0.00981013 -3.15528 1 0 1 1 0 0 +EDGE2 8515 1154 0.914297 -0.0528652 -3.17595 1 0 1 1 0 0 +EDGE2 8515 3176 -0.0529295 0.955559 1.55574 1 0 1 1 0 0 +EDGE2 8515 3496 0.0335407 1.14722 1.59681 1 0 1 1 0 0 +EDGE2 8516 3495 -1.02394 0.0171448 1.55686 1 0 1 1 0 0 +EDGE2 8516 5835 -0.893459 -0.0358612 1.54885 1 0 1 1 0 0 +EDGE2 8516 8495 -1.00208 -0.0337422 1.57836 1 0 1 1 0 0 +EDGE2 8516 8515 -1.00226 -0.0403521 -1.56568 1 0 1 1 0 0 +EDGE2 8516 5815 -1.02996 0.020884 1.55375 1 0 1 1 0 0 +EDGE2 8516 3115 -0.963989 -0.01494 1.52039 1 0 1 1 0 0 +EDGE2 8516 3175 -0.975142 0.0397824 1.56274 1 0 1 1 0 0 +EDGE2 8516 3375 -1.01242 -0.0816319 -1.5882 1 0 1 1 0 0 +EDGE2 8516 3475 -1.02193 -0.0405188 -1.53631 1 0 1 1 0 0 +EDGE2 8516 3135 -1.02138 0.0676763 1.5555 1 0 1 1 0 0 +EDGE2 8516 1175 -1.04087 -0.0374348 1.59359 1 0 1 1 0 0 +EDGE2 8516 1195 -0.929504 0.0322871 1.57607 1 0 1 1 0 0 +EDGE2 8516 3095 -1.04392 -0.000437522 1.59725 1 0 1 1 0 0 +EDGE2 8516 1155 -1.02854 0.00174778 1.58051 1 0 1 1 0 0 +EDGE2 8516 3176 -0.0856847 0.110643 -0.0122844 1 0 1 1 0 0 +EDGE2 8516 3496 -0.0147519 0.135737 -0.0288334 1 0 1 1 0 0 +EDGE2 8516 3177 0.930424 -0.0472092 0.0104396 1 0 1 1 0 0 +EDGE2 8516 3497 0.967497 -0.0222188 -0.00536584 1 0 1 1 0 0 +EDGE2 8517 8516 -1.02383 -0.0298356 -0.00717714 1 0 1 1 0 0 +EDGE2 8517 3176 -1.00981 0.0403432 0.0151677 1 0 1 1 0 0 +EDGE2 8517 3496 -0.976532 -0.0162143 0.0279247 1 0 1 1 0 0 +EDGE2 8517 3178 0.936833 0.0208609 -0.0215487 1 0 1 1 0 0 +EDGE2 8517 3177 0.0636223 0.0101745 -0.0117496 1 0 1 1 0 0 +EDGE2 8517 3497 -0.0285089 -0.0108876 0.0335272 1 0 1 1 0 0 +EDGE2 8517 3498 1.03584 0.0504318 -0.0225566 1 0 1 1 0 0 +EDGE2 8518 8517 -1.05345 0.0448725 0.000719939 1 0 1 1 0 0 +EDGE2 8518 3178 -0.0161455 -0.0265319 0.0170294 1 0 1 1 0 0 +EDGE2 8518 3177 -1.08615 -0.108394 0.0169996 1 0 1 1 0 0 +EDGE2 8518 3497 -0.970399 0.0646501 -0.0500088 1 0 1 1 0 0 +EDGE2 8518 3498 -0.0686672 -0.0133926 0.0244506 1 0 1 1 0 0 +EDGE2 8518 3179 1.04395 0.0156433 0.00807514 1 0 1 1 0 0 +EDGE2 8518 3499 0.939016 -0.0587397 -0.00771164 1 0 1 1 0 0 +EDGE2 8519 3178 -1.06959 0.0863894 0.0115342 1 0 1 1 0 0 +EDGE2 8519 8518 -1.06019 -0.0455429 0.00744189 1 0 1 1 0 0 +EDGE2 8519 3498 -1.05135 0.00915382 0.0443552 1 0 1 1 0 0 +EDGE2 8519 3179 -0.0472768 0.0544561 -0.0142348 1 0 1 1 0 0 +EDGE2 8519 3499 0.0493071 -0.0133252 -0.00858555 1 0 1 1 0 0 +EDGE2 8519 3020 0.984113 0.0404522 -3.10934 1 0 1 1 0 0 +EDGE2 8519 3180 1.03173 0.0166219 0.00596885 1 0 1 1 0 0 +EDGE2 8519 3500 0.971098 -0.0135819 -0.0145183 1 0 1 1 0 0 +EDGE2 8520 3179 -1.02631 -0.0735458 -0.00666285 1 0 1 1 0 0 +EDGE2 8520 3499 -0.98433 0.113355 0.0223184 1 0 1 1 0 0 +EDGE2 8520 8519 -0.958214 -0.0149443 0.00182963 1 0 1 1 0 0 +EDGE2 8520 3181 -0.047898 1.00683 1.57061 1 0 1 1 0 0 +EDGE2 8520 3501 -0.0588275 -1.06939 -1.59305 1 0 1 1 0 0 +EDGE2 8520 3020 0.0204179 -0.00339043 -3.12837 1 0 1 1 0 0 +EDGE2 8520 3180 -0.0218847 -0.0411227 0.025619 1 0 1 1 0 0 +EDGE2 8520 3500 0.00231523 -0.102992 -0.0173279 1 0 1 1 0 0 +EDGE2 8520 3021 -0.0956044 -0.976044 -1.5679 1 0 1 1 0 0 +EDGE2 8520 3019 0.988299 -0.107637 -3.15854 1 0 1 1 0 0 +EDGE2 8521 8520 -1.02501 -0.00850143 -1.59482 1 0 1 1 0 0 +EDGE2 8521 3181 0.0115886 0.0436986 -0.00609878 1 0 1 1 0 0 +EDGE2 8521 3182 0.972 0.13496 0.00882208 1 0 1 1 0 0 +EDGE2 8521 3020 -0.998043 0.000198478 1.57138 1 0 1 1 0 0 +EDGE2 8521 3180 -0.968982 0.0446548 -1.55592 1 0 1 1 0 0 +EDGE2 8521 3500 -1.11928 -0.0145555 -1.60787 1 0 1 1 0 0 +EDGE2 8522 3181 -1.08622 -0.00153344 -0.00807366 1 0 1 1 0 0 +EDGE2 8522 3182 0.0344572 0.110593 0.00216546 1 0 1 1 0 0 +EDGE2 8522 3183 1.03827 0.0322981 -0.0318564 1 0 1 1 0 0 +EDGE2 8522 8521 -1.05881 -0.0685162 -0.0158432 1 0 1 1 0 0 +EDGE2 8523 3184 0.996013 0.064333 -0.00948874 1 0 1 1 0 0 +EDGE2 8523 3182 -1.06048 -0.00973169 0.00357517 1 0 1 1 0 0 +EDGE2 8523 8522 -0.932635 0.000622563 0.0213902 1 0 1 1 0 0 +EDGE2 8523 3183 0.00443844 0.103198 -0.00518324 1 0 1 1 0 0 +EDGE2 8524 8523 -1.03266 0.0501444 -0.0105607 1 0 1 1 0 0 +EDGE2 8524 3285 0.978624 -0.0356376 -3.16244 1 0 1 1 0 0 +EDGE2 8524 3005 1.00252 -0.0356597 -3.11032 1 0 1 1 0 0 +EDGE2 8524 3185 1.03877 -0.0205882 -0.00960591 1 0 1 1 0 0 +EDGE2 8524 3265 1.04754 0.0260604 -3.13262 1 0 1 1 0 0 +EDGE2 8524 725 1.01612 0.0395723 -3.11654 1 0 1 1 0 0 +EDGE2 8524 3184 0.0169825 -0.000114435 0.0275827 1 0 1 1 0 0 +EDGE2 8524 3183 -1.01695 0.0196844 0.00708095 1 0 1 1 0 0 +EDGE2 8525 3004 0.991169 -0.0328255 -3.10257 1 0 1 1 0 0 +EDGE2 8525 3284 1.04577 -0.0773959 -3.13619 1 0 1 1 0 0 +EDGE2 8525 3264 0.989564 0.0379992 -3.15581 1 0 1 1 0 0 +EDGE2 8525 724 0.931439 0.00846815 -3.11149 1 0 1 1 0 0 +EDGE2 8525 8524 -0.992139 -0.0147651 -0.0176939 1 0 1 1 0 0 +EDGE2 8525 3285 -0.0213766 -0.105451 -3.14405 1 0 1 1 0 0 +EDGE2 8525 3186 -0.0211909 0.980087 1.54598 1 0 1 1 0 0 +EDGE2 8525 726 0.0616181 0.982667 1.54924 1 0 1 1 0 0 +EDGE2 8525 3005 -0.0534312 0.0836252 -3.10544 1 0 1 1 0 0 +EDGE2 8525 3185 -0.0308241 -0.00902947 0.0182105 1 0 1 1 0 0 +EDGE2 8525 3265 0.0127567 0.0541845 -3.10987 1 0 1 1 0 0 +EDGE2 8525 725 -0.0379224 0.0588236 -3.11607 1 0 1 1 0 0 +EDGE2 8525 3184 -0.959824 -0.0464469 -0.00439243 1 0 1 1 0 0 +EDGE2 8525 3266 -0.0457079 -0.95449 -1.55419 1 0 1 1 0 0 +EDGE2 8525 3286 -0.0766602 -0.953707 -1.61842 1 0 1 1 0 0 +EDGE2 8525 3006 -0.0249645 -1.02138 -1.58694 1 0 1 1 0 0 +EDGE2 8526 8525 -0.975316 -0.0229759 1.59487 1 0 1 1 0 0 +EDGE2 8526 3285 -1.02127 0.0706955 -1.59623 1 0 1 1 0 0 +EDGE2 8526 3005 -0.971086 0.0932303 -1.59567 1 0 1 1 0 0 +EDGE2 8526 3185 -1.03975 0.0228088 1.58483 1 0 1 1 0 0 +EDGE2 8526 3265 -0.955503 -0.0771157 -1.54523 1 0 1 1 0 0 +EDGE2 8526 725 -0.949205 0.0777363 -1.57708 1 0 1 1 0 0 +EDGE2 8526 3266 0.0584789 0.00782398 -0.014651 1 0 1 1 0 0 +EDGE2 8526 3286 0.0965891 0.0117157 0.0216743 1 0 1 1 0 0 +EDGE2 8526 3006 0.066127 0.0138455 0.0189914 1 0 1 1 0 0 +EDGE2 8526 3007 0.97193 -0.000192402 -0.00760616 1 0 1 1 0 0 +EDGE2 8526 3267 0.94855 0.0549355 -0.0164138 1 0 1 1 0 0 +EDGE2 8526 3287 1.03217 -0.0279811 -0.0104773 1 0 1 1 0 0 +EDGE2 8527 8526 -1.0357 -0.00569691 -0.00216795 1 0 1 1 0 0 +EDGE2 8527 3266 -1.03509 -0.028281 -0.000165935 1 0 1 1 0 0 +EDGE2 8527 3286 -0.9353 -0.108393 -0.0187923 1 0 1 1 0 0 +EDGE2 8527 3006 -0.964125 0.0522842 0.00588677 1 0 1 1 0 0 +EDGE2 8527 3268 0.856754 -0.0730407 -0.0236968 1 0 1 1 0 0 +EDGE2 8527 3007 0.00130769 -0.0827327 -0.0191763 1 0 1 1 0 0 +EDGE2 8527 3267 0.0400187 -0.0390148 -0.0225189 1 0 1 1 0 0 +EDGE2 8527 3287 0.129364 0.000455304 -0.0084101 1 0 1 1 0 0 +EDGE2 8527 3288 0.932476 0.0119236 0.0525536 1 0 1 1 0 0 +EDGE2 8527 3008 0.909784 -0.0105004 -0.0567453 1 0 1 1 0 0 +EDGE2 8528 8527 -0.98628 0.00795341 0.0356536 1 0 1 1 0 0 +EDGE2 8528 3268 0.115348 -0.0521918 0.0121826 1 0 1 1 0 0 +EDGE2 8528 3007 -0.978661 -0.0901366 0.0187756 1 0 1 1 0 0 +EDGE2 8528 3267 -0.947377 -0.0403743 -0.0144917 1 0 1 1 0 0 +EDGE2 8528 3287 -1.00459 -0.0218151 0.00197005 1 0 1 1 0 0 +EDGE2 8528 3288 -0.0984608 -0.0811962 0.0105122 1 0 1 1 0 0 +EDGE2 8528 3269 1.01873 0.032554 -0.0270322 1 0 1 1 0 0 +EDGE2 8528 3289 1.02159 -0.0488154 -0.0119348 1 0 1 1 0 0 +EDGE2 8528 3008 0.0716595 0.00762234 -0.0129319 1 0 1 1 0 0 +EDGE2 8528 3009 0.961154 0.0262243 0.00632913 1 0 1 1 0 0 +EDGE2 8529 8528 -1.06983 -0.0764428 -0.0461746 1 0 1 1 0 0 +EDGE2 8529 5450 0.990913 0.02177 -3.14248 1 0 1 1 0 0 +EDGE2 8529 3290 1.04504 0.0512202 -0.0109784 1 0 1 1 0 0 +EDGE2 8529 3268 -0.969627 -0.00256519 0.0144649 1 0 1 1 0 0 +EDGE2 8529 3288 -1.01963 -0.0100831 0.0183458 1 0 1 1 0 0 +EDGE2 8529 3269 0.127243 0.052291 0.0162587 1 0 1 1 0 0 +EDGE2 8529 3289 0.037662 0.0667486 0.00399278 1 0 1 1 0 0 +EDGE2 8529 3008 -0.984156 0.0284648 -0.0224753 1 0 1 1 0 0 +EDGE2 8529 3009 -0.153896 -0.00368401 -0.0443517 1 0 1 1 0 0 +EDGE2 8529 2970 1.05859 -0.0529406 -3.15227 1 0 1 1 0 0 +EDGE2 8529 3270 1.06189 0.00192075 0.00944407 1 0 1 1 0 0 +EDGE2 8529 3010 1.02853 -0.0369169 -0.00375513 1 0 1 1 0 0 +EDGE2 8529 2710 0.991989 0.0655163 -3.12355 1 0 1 1 0 0 +EDGE2 8530 8529 -0.981853 0.0195701 0.0295633 1 0 1 1 0 0 +EDGE2 8530 3271 0.0267745 1.05171 1.56891 1 0 1 1 0 0 +EDGE2 8530 3291 -0.0228672 0.987142 1.56712 1 0 1 1 0 0 +EDGE2 8530 5450 -0.108135 -0.0243316 -3.12738 1 0 1 1 0 0 +EDGE2 8530 2971 0.0362831 1.08253 1.54309 1 0 1 1 0 0 +EDGE2 8530 5449 0.903374 -0.0631967 -3.14975 1 0 1 1 0 0 +EDGE2 8530 2711 -0.145547 -0.943629 -1.57665 1 0 1 1 0 0 +EDGE2 8530 3290 -0.0417284 -0.133089 -0.0507563 1 0 1 1 0 0 +EDGE2 8530 3269 -0.973687 -0.0639943 -0.016575 1 0 1 1 0 0 +EDGE2 8530 3289 -0.945552 -0.0331737 0.0149069 1 0 1 1 0 0 +EDGE2 8530 3009 -1.0642 -0.0575725 0.0308193 1 0 1 1 0 0 +EDGE2 8530 2970 -0.0675339 0.0660472 -3.15636 1 0 1 1 0 0 +EDGE2 8530 3270 -0.0208791 -0.0253559 -0.0128292 1 0 1 1 0 0 +EDGE2 8530 3010 -0.0657296 -0.0231863 0.0146214 1 0 1 1 0 0 +EDGE2 8530 5451 -0.0562392 -1.07931 -1.59375 1 0 1 1 0 0 +EDGE2 8530 2710 -0.0465929 -0.0144222 -3.14709 1 0 1 1 0 0 +EDGE2 8530 3011 0.00783044 -0.932468 -1.5478 1 0 1 1 0 0 +EDGE2 8530 2969 1.07394 -0.0476905 -3.12379 1 0 1 1 0 0 +EDGE2 8530 2709 1.03632 -0.0124447 -3.13184 1 0 1 1 0 0 +EDGE2 8531 5450 -0.952922 -0.0373509 -1.55442 1 0 1 1 0 0 +EDGE2 8531 8530 -1.03304 0.0411109 1.57685 1 0 1 1 0 0 +EDGE2 8531 2711 -0.0226425 0.0601158 -0.00346169 1 0 1 1 0 0 +EDGE2 8531 3290 -1.09157 0.0648836 1.55832 1 0 1 1 0 0 +EDGE2 8531 2970 -1.03778 -0.0172327 -1.59325 1 0 1 1 0 0 +EDGE2 8531 3270 -0.91165 0.0793603 1.54922 1 0 1 1 0 0 +EDGE2 8531 3010 -0.973312 0.0878863 1.5522 1 0 1 1 0 0 +EDGE2 8531 5451 -0.0365305 -0.0112913 -0.0120996 1 0 1 1 0 0 +EDGE2 8531 2710 -0.966254 0.0636101 -1.5796 1 0 1 1 0 0 +EDGE2 8531 3011 -0.036311 -0.0557312 -0.043301 1 0 1 1 0 0 +EDGE2 8531 3012 1.05355 0.0318191 0.0248755 1 0 1 1 0 0 +EDGE2 8531 5452 0.988199 0.0168665 -0.0312344 1 0 1 1 0 0 +EDGE2 8531 2712 0.965092 -0.00144676 -0.0522336 1 0 1 1 0 0 +EDGE2 8532 2711 -0.96014 -0.0424308 -0.0225958 1 0 1 1 0 0 +EDGE2 8532 5451 -1.05621 -0.0524769 0.0110673 1 0 1 1 0 0 +EDGE2 8532 8531 -1.0271 0.0697051 -0.00405238 1 0 1 1 0 0 +EDGE2 8532 3011 -1.00066 0.0402146 0.00923634 1 0 1 1 0 0 +EDGE2 8532 3012 0.00309138 -0.00653202 -0.0240798 1 0 1 1 0 0 +EDGE2 8532 5452 0.00473406 -0.00814874 0.00788363 1 0 1 1 0 0 +EDGE2 8532 2713 1.02776 -0.0101435 0.0152889 1 0 1 1 0 0 +EDGE2 8532 5453 1.04006 0.0125345 0.00638349 1 0 1 1 0 0 +EDGE2 8532 2712 -0.00169695 0.0516848 0.0141828 1 0 1 1 0 0 +EDGE2 8532 3013 1.02593 -0.0154095 0.024707 1 0 1 1 0 0 +EDGE2 8533 3012 -1.05675 0.0167478 0.0077111 1 0 1 1 0 0 +EDGE2 8533 5452 -1.01248 -0.0441799 -0.00683266 1 0 1 1 0 0 +EDGE2 8533 8532 -0.993244 0.0829904 0.018952 1 0 1 1 0 0 +EDGE2 8533 2713 -0.0405701 0.00317798 0.010579 1 0 1 1 0 0 +EDGE2 8533 5453 -0.030224 0.0322113 0.00506499 1 0 1 1 0 0 +EDGE2 8533 2712 -0.993426 -0.0307197 -0.00134895 1 0 1 1 0 0 +EDGE2 8533 3013 -0.0132607 -0.0261757 -0.0172556 1 0 1 1 0 0 +EDGE2 8533 3014 0.997928 0.0226017 0.00139552 1 0 1 1 0 0 +EDGE2 8533 5454 0.98801 -0.0784564 0.0300172 1 0 1 1 0 0 +EDGE2 8533 2714 1.09558 0.0130417 0.0100382 1 0 1 1 0 0 +EDGE2 8534 2713 -1.04763 0.0491774 -0.000850131 1 0 1 1 0 0 +EDGE2 8534 5453 -1.06599 -0.0267482 -0.00316499 1 0 1 1 0 0 +EDGE2 8534 8533 -1.04262 0.13162 0.0387707 1 0 1 1 0 0 +EDGE2 8534 3013 -0.950627 0.0601427 -0.0226663 1 0 1 1 0 0 +EDGE2 8534 3014 0.0583555 0.0444775 0.0128442 1 0 1 1 0 0 +EDGE2 8534 5454 -0.0304437 -0.0476054 0.0142136 1 0 1 1 0 0 +EDGE2 8534 2714 0.02716 -0.0207394 0.0109166 1 0 1 1 0 0 +EDGE2 8534 5455 1.05439 0.0346151 0.0157566 1 0 1 1 0 0 +EDGE2 8534 2715 0.983192 -0.0557759 0.0336659 1 0 1 1 0 0 +EDGE2 8534 3015 0.998512 0.0376078 -0.00620308 1 0 1 1 0 0 +EDGE2 8534 3515 0.906672 0.0182183 -3.13532 1 0 1 1 0 0 +EDGE2 8535 3014 -0.958573 0.0754999 0.0374905 1 0 1 1 0 0 +EDGE2 8535 5454 -0.958711 0.0605138 0.0287286 1 0 1 1 0 0 +EDGE2 8535 8534 -1.01557 -0.00725027 -0.017222 1 0 1 1 0 0 +EDGE2 8535 2714 -1.06346 0.0126474 -0.0305546 1 0 1 1 0 0 +EDGE2 8535 3516 0.00697512 1.00997 1.59054 1 0 1 1 0 0 +EDGE2 8535 5455 0.00596717 -0.000589813 0.0476456 1 0 1 1 0 0 +EDGE2 8535 3016 -0.0374004 -1.06529 -1.55403 1 0 1 1 0 0 +EDGE2 8535 2715 -0.0306142 -0.0678223 0.0354565 1 0 1 1 0 0 +EDGE2 8535 3015 -0.0399232 0.0621477 0.00108044 1 0 1 1 0 0 +EDGE2 8535 3515 0.0716001 0.00583422 -3.10348 1 0 1 1 0 0 +EDGE2 8535 5456 0.0463526 0.968678 1.57848 1 0 1 1 0 0 +EDGE2 8535 3514 0.986718 -0.0195873 -3.12312 1 0 1 1 0 0 +EDGE2 8535 2716 -0.00838445 1.05349 1.55402 1 0 1 1 0 0 +EDGE2 8536 5455 -0.999131 0.010512 1.55694 1 0 1 1 0 0 +EDGE2 8536 3016 -0.0470779 0.0408133 -0.00892497 1 0 1 1 0 0 +EDGE2 8536 3017 1.07632 0.0524717 0.0435214 1 0 1 1 0 0 +EDGE2 8536 8535 -1.00863 0.0990973 1.57652 1 0 1 1 0 0 +EDGE2 8536 2715 -0.948146 -0.0416957 1.58451 1 0 1 1 0 0 +EDGE2 8536 3015 -1.02243 -0.0587187 1.60931 1 0 1 1 0 0 +EDGE2 8536 3515 -1.0176 0.00470444 -1.54945 1 0 1 1 0 0 +EDGE2 8537 3018 1.02639 -0.0283757 0.00122416 1 0 1 1 0 0 +EDGE2 8537 3016 -1.08918 -0.0635635 -0.0306566 1 0 1 1 0 0 +EDGE2 8537 8536 -0.940661 -0.0664167 0.0153877 1 0 1 1 0 0 +EDGE2 8537 3017 0.00441106 -0.0187775 0.0046992 1 0 1 1 0 0 +EDGE2 8538 3019 0.971457 0.0932666 -0.00334355 1 0 1 1 0 0 +EDGE2 8538 8537 -0.986091 -0.0631279 0.0258764 1 0 1 1 0 0 +EDGE2 8538 3018 -0.0497025 -0.101837 0.0034726 1 0 1 1 0 0 +EDGE2 8538 3017 -0.959368 0.118941 0.0171915 1 0 1 1 0 0 +EDGE2 8539 8520 0.968268 -0.0247553 -3.14648 1 0 1 1 0 0 +EDGE2 8539 3020 0.967173 0.0526542 -0.0139581 1 0 1 1 0 0 +EDGE2 8539 3180 1.00491 0.00413924 -3.1755 1 0 1 1 0 0 +EDGE2 8539 3500 1.05846 0.0181954 -3.16366 1 0 1 1 0 0 +EDGE2 8539 3019 0.0168834 0.0411605 -0.0129623 1 0 1 1 0 0 +EDGE2 8539 3018 -0.960289 0.0182493 0.00902 1 0 1 1 0 0 +EDGE2 8539 8538 -1.0053 0.00555848 0.0253487 1 0 1 1 0 0 +EDGE2 8540 3179 1.00337 -0.0399419 -3.1604 1 0 1 1 0 0 +EDGE2 8540 3499 0.975465 -0.0599958 -3.13219 1 0 1 1 0 0 +EDGE2 8540 8519 0.965677 -0.0208411 -3.16475 1 0 1 1 0 0 +EDGE2 8540 8520 0.0952173 -0.0077082 -3.12499 1 0 1 1 0 0 +EDGE2 8540 3181 -0.0179863 -0.956326 -1.57863 1 0 1 1 0 0 +EDGE2 8540 8521 -0.00687558 -1.02533 -1.55035 1 0 1 1 0 0 +EDGE2 8540 3501 0.0191167 0.963331 1.54389 1 0 1 1 0 0 +EDGE2 8540 3020 0.00189266 0.016196 0.00410501 1 0 1 1 0 0 +EDGE2 8540 3180 0.0339513 0.0312088 -3.13876 1 0 1 1 0 0 +EDGE2 8540 3500 -0.0267717 -0.0037662 -3.13822 1 0 1 1 0 0 +EDGE2 8540 8539 -0.976293 0.0447632 -0.00757443 1 0 1 1 0 0 +EDGE2 8540 3021 -0.0410483 1.05907 1.5726 1 0 1 1 0 0 +EDGE2 8540 3019 -0.976683 0.0482652 -0.0269374 1 0 1 1 0 0 +EDGE2 8541 8520 -1.03721 0.103218 1.58121 1 0 1 1 0 0 +EDGE2 8541 8540 -0.959433 0.0434939 -1.57354 1 0 1 1 0 0 +EDGE2 8541 3501 0.00845399 0.0546866 0.0119106 1 0 1 1 0 0 +EDGE2 8541 3020 -1.0283 -0.0406985 -1.58595 1 0 1 1 0 0 +EDGE2 8541 3180 -0.948863 0.035906 1.60636 1 0 1 1 0 0 +EDGE2 8541 3500 -1.0046 -0.0518067 1.53969 1 0 1 1 0 0 +EDGE2 8541 3021 -0.0273184 0.0448484 0.0338942 1 0 1 1 0 0 +EDGE2 8541 3022 0.959695 0.0158158 0.0122036 1 0 1 1 0 0 +EDGE2 8541 3502 1.03426 -0.063078 0.0214949 1 0 1 1 0 0 +EDGE2 8542 3501 -0.984317 -0.0962709 -0.00350768 1 0 1 1 0 0 +EDGE2 8542 8541 -1.02058 0.0166494 -0.0148805 1 0 1 1 0 0 +EDGE2 8542 3021 -1.02535 0.0724745 -0.0306363 1 0 1 1 0 0 +EDGE2 8542 3503 0.980042 -0.0210843 0.00753299 1 0 1 1 0 0 +EDGE2 8542 3022 -0.0181114 -0.0856357 -0.00725399 1 0 1 1 0 0 +EDGE2 8542 3502 -0.0245954 0.157286 -0.00247664 1 0 1 1 0 0 +EDGE2 8542 3023 0.944922 0.0348001 -0.0130199 1 0 1 1 0 0 +EDGE2 8543 3503 0.0404156 -0.0467373 0.0279653 1 0 1 1 0 0 +EDGE2 8543 3022 -1.00077 -0.0460661 -6.36866e-07 1 0 1 1 0 0 +EDGE2 8543 3502 -0.956718 -0.0897402 -0.00162171 1 0 1 1 0 0 +EDGE2 8543 8542 -1.11091 -0.0403174 -0.00701344 1 0 1 1 0 0 +EDGE2 8543 3504 0.996123 -0.0854626 -0.0112791 1 0 1 1 0 0 +EDGE2 8543 3023 -0.0305728 -0.0183047 0.00458684 1 0 1 1 0 0 +EDGE2 8543 3024 0.968461 -0.0194558 0.0288725 1 0 1 1 0 0 +EDGE2 8544 3503 -0.956486 0.013347 0.0128177 1 0 1 1 0 0 +EDGE2 8544 8543 -1.0024 -0.0444824 -0.00422474 1 0 1 1 0 0 +EDGE2 8544 3504 -0.00906333 -0.0368056 -0.0377902 1 0 1 1 0 0 +EDGE2 8544 3023 -0.989155 -0.00123198 -0.00146819 1 0 1 1 0 0 +EDGE2 8544 3024 0.00889379 0.0854961 -0.0214328 1 0 1 1 0 0 +EDGE2 8544 5805 1.03356 -0.055873 -3.14588 1 0 1 1 0 0 +EDGE2 8544 1145 1.07408 0.0600063 -3.08344 1 0 1 1 0 0 +EDGE2 8544 3045 0.971588 -0.00589654 -3.10606 1 0 1 1 0 0 +EDGE2 8544 3505 0.951385 -0.059889 -0.0330371 1 0 1 1 0 0 +EDGE2 8544 5785 0.998258 -0.0325793 -3.12737 1 0 1 1 0 0 +EDGE2 8544 3025 0.989172 0.0209353 0.000891419 1 0 1 1 0 0 +EDGE2 8544 1105 1.07245 0.0361675 -3.13965 1 0 1 1 0 0 +EDGE2 8544 1125 0.969356 -0.0292503 -3.18064 1 0 1 1 0 0 +EDGE2 8545 3504 -1.04992 -0.0115594 0.00684191 1 0 1 1 0 0 +EDGE2 8545 8544 -1.06528 0.00611624 0.010994 1 0 1 1 0 0 +EDGE2 8545 3024 -0.977004 -0.0132827 -0.0412677 1 0 1 1 0 0 +EDGE2 8545 5805 -0.00188503 0.032032 -3.19094 1 0 1 1 0 0 +EDGE2 8545 3046 -0.0282124 -0.997634 -1.60719 1 0 1 1 0 0 +EDGE2 8545 5806 -0.0390477 -1.06781 -1.56731 1 0 1 1 0 0 +EDGE2 8545 5786 -0.0506785 -0.980305 -1.57032 1 0 1 1 0 0 +EDGE2 8545 1126 -0.054599 -0.983824 -1.5365 1 0 1 1 0 0 +EDGE2 8545 1146 -0.0159257 -0.980455 -1.56031 1 0 1 1 0 0 +EDGE2 8545 3026 -0.00806062 -1.0839 -1.56313 1 0 1 1 0 0 +EDGE2 8545 1106 0.0354712 -0.976437 -1.56287 1 0 1 1 0 0 +EDGE2 8545 5784 1.02036 0.0436899 -3.12381 1 0 1 1 0 0 +EDGE2 8545 1145 -0.00812703 0.014228 -3.14457 1 0 1 1 0 0 +EDGE2 8545 3045 0.0391034 0.00878821 -3.17454 1 0 1 1 0 0 +EDGE2 8545 3505 0.0124089 -0.0147519 -0.00892439 1 0 1 1 0 0 +EDGE2 8545 5785 -0.0421299 -0.00979434 -3.19836 1 0 1 1 0 0 +EDGE2 8545 3025 0.0880362 0.0480099 0.000989572 1 0 1 1 0 0 +EDGE2 8545 1105 -0.042609 0.0373991 -3.13293 1 0 1 1 0 0 +EDGE2 8545 1125 -0.0699615 0.0350082 -3.13835 1 0 1 1 0 0 +EDGE2 8545 5804 0.985223 0.0431225 -3.15697 1 0 1 1 0 0 +EDGE2 8545 1124 1.00437 0.0205948 -3.13635 1 0 1 1 0 0 +EDGE2 8545 1144 0.981772 0.0123587 -3.12092 1 0 1 1 0 0 +EDGE2 8545 3044 1.02262 -0.0135854 -3.17647 1 0 1 1 0 0 +EDGE2 8545 1104 0.950538 -0.0583333 -3.12581 1 0 1 1 0 0 +EDGE2 8545 3506 0.0565673 0.994183 1.54421 1 0 1 1 0 0 +EDGE2 8546 3027 1.04592 -0.0733452 0.00578824 1 0 1 1 0 0 +EDGE2 8546 5787 1.02713 0.00201254 0.0294899 1 0 1 1 0 0 +EDGE2 8546 5807 0.881563 0.0705918 0.0088916 1 0 1 1 0 0 +EDGE2 8546 3047 1.03106 0.0646416 -0.0189441 1 0 1 1 0 0 +EDGE2 8546 5805 -0.996282 -0.0176976 -1.53089 1 0 1 1 0 0 +EDGE2 8546 1127 0.931769 -0.0189084 0.0156995 1 0 1 1 0 0 +EDGE2 8546 1147 1.07534 -0.0539444 0.021357 1 0 1 1 0 0 +EDGE2 8546 1107 0.979142 0.0723511 0.0198818 1 0 1 1 0 0 +EDGE2 8546 3046 0.0892498 -0.0235792 -0.0220784 1 0 1 1 0 0 +EDGE2 8546 5806 0.0620982 0.00338042 0.0143523 1 0 1 1 0 0 +EDGE2 8546 5786 -0.0521619 0.0207994 0.0143485 1 0 1 1 0 0 +EDGE2 8546 1126 0.0918104 -0.0648544 -0.0161166 1 0 1 1 0 0 +EDGE2 8546 1146 0.00486581 -0.00984318 -0.00441303 1 0 1 1 0 0 +EDGE2 8546 3026 -0.0198497 0.0502937 0.0295467 1 0 1 1 0 0 +EDGE2 8546 1106 -0.00889201 0.0182407 0.0238479 1 0 1 1 0 0 +EDGE2 8546 8545 -1.03047 0.0446459 1.58735 1 0 1 1 0 0 +EDGE2 8546 1145 -1.05882 -0.0847147 -1.54604 1 0 1 1 0 0 +EDGE2 8546 3045 -1.01129 0.0199857 -1.57977 1 0 1 1 0 0 +EDGE2 8546 3505 -1.0261 0.0733278 1.59822 1 0 1 1 0 0 +EDGE2 8546 5785 -0.933452 -0.0999537 -1.58281 1 0 1 1 0 0 +EDGE2 8546 3025 -0.954183 0.03913 1.5449 1 0 1 1 0 0 +EDGE2 8546 1105 -1.00228 -0.107494 -1.55636 1 0 1 1 0 0 +EDGE2 8546 1125 -1.0451 -0.0284285 -1.5992 1 0 1 1 0 0 +EDGE2 8547 3027 0.0297565 0.0208425 -0.0115165 1 0 1 1 0 0 +EDGE2 8547 3048 0.924906 -0.0322406 0.00968363 1 0 1 1 0 0 +EDGE2 8547 5808 0.879772 -0.0605682 -0.0142084 1 0 1 1 0 0 +EDGE2 8547 5788 0.852197 0.0934535 0.0380115 1 0 1 1 0 0 +EDGE2 8547 3028 0.943028 -0.00406934 -0.00201891 1 0 1 1 0 0 +EDGE2 8547 1108 0.976112 0.0653576 -0.00983159 1 0 1 1 0 0 +EDGE2 8547 1128 0.934787 -0.0085535 -0.00194249 1 0 1 1 0 0 +EDGE2 8547 1148 0.953123 0.00973935 -0.0254725 1 0 1 1 0 0 +EDGE2 8547 5787 0.0125548 0.037294 -0.020839 1 0 1 1 0 0 +EDGE2 8547 5807 0.0538757 -0.0324532 -0.00769401 1 0 1 1 0 0 +EDGE2 8547 3047 0.05549 -0.0499823 0.0291302 1 0 1 1 0 0 +EDGE2 8547 1127 0.0299997 0.00383557 0.00901042 1 0 1 1 0 0 +EDGE2 8547 1147 -0.101411 0.053009 0.0157109 1 0 1 1 0 0 +EDGE2 8547 1107 0.0138788 0.0153452 -0.0150871 1 0 1 1 0 0 +EDGE2 8547 3046 -1.06594 -0.0160373 -0.0130946 1 0 1 1 0 0 +EDGE2 8547 5806 -1.07486 -0.0310644 -0.0250205 1 0 1 1 0 0 +EDGE2 8547 8546 -1.03625 -0.0349674 -0.0107347 1 0 1 1 0 0 +EDGE2 8547 5786 -0.98183 0.029067 0.0333694 1 0 1 1 0 0 +EDGE2 8547 1126 -0.944119 0.00969066 0.0314861 1 0 1 1 0 0 +EDGE2 8547 1146 -1.0045 -0.0145833 -0.0451091 1 0 1 1 0 0 +EDGE2 8547 3026 -0.980864 -0.0440774 -0.015084 1 0 1 1 0 0 +EDGE2 8547 1106 -1.01477 0.0165455 -0.012969 1 0 1 1 0 0 +EDGE2 8548 3027 -1.10676 -0.0551571 -0.0027983 1 0 1 1 0 0 +EDGE2 8548 3048 0.0170781 -0.0135699 0.0486023 1 0 1 1 0 0 +EDGE2 8548 5789 0.979237 -0.052337 0.00621872 1 0 1 1 0 0 +EDGE2 8548 5809 1.01498 -0.0375289 -0.00749995 1 0 1 1 0 0 +EDGE2 8548 1109 1.03364 -0.0291982 0.0130951 1 0 1 1 0 0 +EDGE2 8548 1149 0.975683 -0.118777 0.0125219 1 0 1 1 0 0 +EDGE2 8548 3029 0.985132 0.0269929 0.00366854 1 0 1 1 0 0 +EDGE2 8548 3049 1.07022 -0.0612528 0.0107617 1 0 1 1 0 0 +EDGE2 8548 1129 1.03315 0.0589446 0.0363676 1 0 1 1 0 0 +EDGE2 8548 5808 -0.053586 -0.0177126 0.00747192 1 0 1 1 0 0 +EDGE2 8548 5788 0.0428606 -0.0552904 -0.0247396 1 0 1 1 0 0 +EDGE2 8548 3028 -0.0306006 -0.01994 0.011806 1 0 1 1 0 0 +EDGE2 8548 8547 -0.978672 -0.0788941 -0.00854867 1 0 1 1 0 0 +EDGE2 8548 1108 0.0272174 -0.0348125 -0.00843824 1 0 1 1 0 0 +EDGE2 8548 1128 -0.00584606 -0.0643058 0.0347949 1 0 1 1 0 0 +EDGE2 8548 1148 0.0422778 -0.0123731 -0.0246708 1 0 1 1 0 0 +EDGE2 8548 5787 -0.980753 -0.026141 -0.008043 1 0 1 1 0 0 +EDGE2 8548 5807 -1.03829 0.0120234 -0.00641354 1 0 1 1 0 0 +EDGE2 8548 3047 -1.11775 0.00716843 0.00864967 1 0 1 1 0 0 +EDGE2 8548 1127 -0.902069 0.00182734 0.00400535 1 0 1 1 0 0 +EDGE2 8548 1147 -1.04792 0.0226661 0.0136911 1 0 1 1 0 0 +EDGE2 8548 1107 -0.983601 -0.0135091 0.00877999 1 0 1 1 0 0 +EDGE2 8549 3050 0.938479 0.0477339 0.0571174 1 0 1 1 0 0 +EDGE2 8549 5850 0.994893 -0.0159955 -3.16382 1 0 1 1 0 0 +EDGE2 8549 8490 1.0662 0.0496543 -3.13928 1 0 1 1 0 0 +EDGE2 8549 8390 0.998157 0.00494289 -3.15382 1 0 1 1 0 0 +EDGE2 8549 3170 0.933127 -0.0193737 -3.14044 1 0 1 1 0 0 +EDGE2 8549 5790 0.966619 0.022716 0.0155547 1 0 1 1 0 0 +EDGE2 8549 5810 1.05347 -0.028323 -0.0232665 1 0 1 1 0 0 +EDGE2 8549 5830 1.01234 0.0821708 -3.15866 1 0 1 1 0 0 +EDGE2 8549 3490 0.930812 -0.018857 -3.15102 1 0 1 1 0 0 +EDGE2 8549 3110 0.983744 -0.0242429 -3.15917 1 0 1 1 0 0 +EDGE2 8549 3130 0.972622 -0.0280545 -3.12406 1 0 1 1 0 0 +EDGE2 8549 3090 1.06719 -0.0587348 -3.15144 1 0 1 1 0 0 +EDGE2 8549 3048 -1.06233 -0.0217944 -0.0311613 1 0 1 1 0 0 +EDGE2 8549 5789 -0.0462872 -0.0679956 -0.00884618 1 0 1 1 0 0 +EDGE2 8549 1130 0.993328 0.00739656 -0.0387918 1 0 1 1 0 0 +EDGE2 8549 1170 0.981787 -0.0819259 -3.16311 1 0 1 1 0 0 +EDGE2 8549 1190 1.05214 0.104919 -3.1613 1 0 1 1 0 0 +EDGE2 8549 3030 1.02871 0.0779703 0.00707945 1 0 1 1 0 0 +EDGE2 8549 1150 0.986232 0.0114867 -0.0226151 1 0 1 1 0 0 +EDGE2 8549 1110 0.949123 -0.0328167 0.000935956 1 0 1 1 0 0 +EDGE2 8549 5809 -0.0319997 0.0055624 0.017719 1 0 1 1 0 0 +EDGE2 8549 1109 -0.00313 -0.00614282 0.018965 1 0 1 1 0 0 +EDGE2 8549 1149 0.134969 -0.00372877 0.00245705 1 0 1 1 0 0 +EDGE2 8549 3029 0.0386892 0.0113686 0.0407008 1 0 1 1 0 0 +EDGE2 8549 3049 0.0395553 0.0408376 0.0287848 1 0 1 1 0 0 +EDGE2 8549 1129 -0.0553176 0.0316388 -0.010733 1 0 1 1 0 0 +EDGE2 8549 5808 -0.898859 0.0471485 -0.00677652 1 0 1 1 0 0 +EDGE2 8549 8548 -1.04596 0.00492701 -0.00628157 1 0 1 1 0 0 +EDGE2 8549 5788 -0.953338 -0.0141393 -0.0212268 1 0 1 1 0 0 +EDGE2 8549 3028 -0.93861 0.00277347 -0.0124673 1 0 1 1 0 0 +EDGE2 8549 1108 -1.06008 0.0158967 -0.0309546 1 0 1 1 0 0 +EDGE2 8549 1128 -0.897399 0.0126141 0.000702667 1 0 1 1 0 0 +EDGE2 8549 1148 -0.993903 0.0532504 -0.033984 1 0 1 1 0 0 +EDGE2 8550 5849 1.02026 -0.0366387 -3.14325 1 0 1 1 0 0 +EDGE2 8550 8489 0.973853 -0.0771653 -3.12056 1 0 1 1 0 0 +EDGE2 8550 8389 0.97533 -0.0564348 -3.16196 1 0 1 1 0 0 +EDGE2 8550 3109 0.97719 -0.0133696 -3.13656 1 0 1 1 0 0 +EDGE2 8550 3169 1.10532 0.0372391 -3.12409 1 0 1 1 0 0 +EDGE2 8550 3489 0.991666 -0.0536955 -3.14813 1 0 1 1 0 0 +EDGE2 8550 5829 1.02443 -0.0168193 -3.17246 1 0 1 1 0 0 +EDGE2 8550 3129 1.07723 -0.011487 -3.15598 1 0 1 1 0 0 +EDGE2 8550 1189 1.0217 0.0742013 -3.13365 1 0 1 1 0 0 +EDGE2 8550 3089 0.916519 0.0277238 -3.11757 1 0 1 1 0 0 +EDGE2 8550 1169 1.00114 -0.0381267 -3.1137 1 0 1 1 0 0 +EDGE2 8550 3050 -0.0396128 -0.00234204 0.0215289 1 0 1 1 0 0 +EDGE2 8550 3131 0.0360805 -1.08244 -1.53421 1 0 1 1 0 0 +EDGE2 8550 8491 -0.0441649 -0.997775 -1.58197 1 0 1 1 0 0 +EDGE2 8550 3491 0.016452 -0.930682 -1.5695 1 0 1 1 0 0 +EDGE2 8550 5811 0.037408 -0.968996 -1.55076 1 0 1 1 0 0 +EDGE2 8550 5831 -0.0828036 -1.02954 -1.52251 1 0 1 1 0 0 +EDGE2 8550 3171 0.00528788 -1.0318 -1.57187 1 0 1 1 0 0 +EDGE2 8550 5850 -0.00332302 -0.136604 -3.13697 1 0 1 1 0 0 +EDGE2 8550 1151 -0.0554655 -0.983996 -1.57684 1 0 1 1 0 0 +EDGE2 8550 1191 -0.0080207 -0.949834 -1.59609 1 0 1 1 0 0 +EDGE2 8550 3091 -0.0617343 -0.893986 -1.59035 1 0 1 1 0 0 +EDGE2 8550 3111 0.0190046 -0.951344 -1.60068 1 0 1 1 0 0 +EDGE2 8550 1171 0.0469763 -1.0472 -1.58286 1 0 1 1 0 0 +EDGE2 8550 8490 -0.035442 0.046217 -3.12565 1 0 1 1 0 0 +EDGE2 8550 8390 0.159232 -0.0324455 -3.11499 1 0 1 1 0 0 +EDGE2 8550 3170 0.111253 -0.0191504 -3.15676 1 0 1 1 0 0 +EDGE2 8550 5790 -0.0898902 -0.0104208 -0.00216819 1 0 1 1 0 0 +EDGE2 8550 5810 -0.0516172 0.0292311 -0.0152659 1 0 1 1 0 0 +EDGE2 8550 5830 0.00109529 -0.0593849 -3.14013 1 0 1 1 0 0 +EDGE2 8550 3490 0.0115822 -0.0271899 -3.12604 1 0 1 1 0 0 +EDGE2 8550 3110 -0.0119345 -0.0321839 -3.11994 1 0 1 1 0 0 +EDGE2 8550 3130 0.0564561 -0.081939 -3.14327 1 0 1 1 0 0 +EDGE2 8550 3090 0.0733608 -0.0339402 -3.13996 1 0 1 1 0 0 +EDGE2 8550 5789 -0.964207 0.0600251 -0.0187894 1 0 1 1 0 0 +EDGE2 8550 1130 0.0720193 0.0167261 0.00789846 1 0 1 1 0 0 +EDGE2 8550 1170 0.0502078 0.0975093 -3.13448 1 0 1 1 0 0 +EDGE2 8550 1190 -0.0293203 -0.029913 -3.18156 1 0 1 1 0 0 +EDGE2 8550 3030 0.0142329 0.0185191 0.00500676 1 0 1 1 0 0 +EDGE2 8550 1150 0.0468505 0.0616754 0.00426793 1 0 1 1 0 0 +EDGE2 8550 8549 -1.05449 0.0467592 -0.0374337 1 0 1 1 0 0 +EDGE2 8550 1110 0.0587844 -0.0306589 -0.000703928 1 0 1 1 0 0 +EDGE2 8550 5809 -0.984637 0.0327991 0.0232893 1 0 1 1 0 0 +EDGE2 8550 1109 -0.930062 -0.0472193 -0.0166554 1 0 1 1 0 0 +EDGE2 8550 1149 -0.980469 0.00465926 -0.0125515 1 0 1 1 0 0 +EDGE2 8550 3029 -0.966511 0.0460157 0.00723237 1 0 1 1 0 0 +EDGE2 8550 3049 -0.995616 -0.0605315 -0.0135031 1 0 1 1 0 0 +EDGE2 8550 1129 -0.955746 -0.0155397 0.0104573 1 0 1 1 0 0 +EDGE2 8550 5851 -0.0433057 0.95213 1.6195 1 0 1 1 0 0 +EDGE2 8550 8391 0.00511928 0.97929 1.57097 1 0 1 1 0 0 +EDGE2 8550 1111 0.00112938 1.03447 1.61581 1 0 1 1 0 0 +EDGE2 8550 3031 0.000671164 1.02205 1.54732 1 0 1 1 0 0 +EDGE2 8550 3051 -0.0396522 1.01322 1.53372 1 0 1 1 0 0 +EDGE2 8550 5791 0.0132231 0.945781 1.55243 1 0 1 1 0 0 +EDGE2 8550 1131 -0.0261606 0.985211 1.56439 1 0 1 1 0 0 +EDGE2 8551 3050 -0.950968 -0.0382322 -1.55435 1 0 1 1 0 0 +EDGE2 8551 5850 -0.949841 0.0366084 1.61388 1 0 1 1 0 0 +EDGE2 8551 8490 -1.02534 -0.0659736 1.57653 1 0 1 1 0 0 +EDGE2 8551 8550 -1.06122 0.010764 -1.56988 1 0 1 1 0 0 +EDGE2 8551 8390 -0.954565 0.0115576 1.56389 1 0 1 1 0 0 +EDGE2 8551 3170 -0.964452 -0.00874041 1.55856 1 0 1 1 0 0 +EDGE2 8551 5790 -0.997602 -0.0214404 -1.56827 1 0 1 1 0 0 +EDGE2 8551 5810 -0.949134 -0.0447079 -1.56239 1 0 1 1 0 0 +EDGE2 8551 5830 -1.04515 0.103143 1.57017 1 0 1 1 0 0 +EDGE2 8551 3490 -0.971813 0.103278 1.55335 1 0 1 1 0 0 +EDGE2 8551 3110 -0.918433 0.0636683 1.56667 1 0 1 1 0 0 +EDGE2 8551 3130 -1.00526 -0.093092 1.55167 1 0 1 1 0 0 +EDGE2 8551 3090 -1.01043 0.0213429 1.56598 1 0 1 1 0 0 +EDGE2 8551 1130 -1.10351 0.0208776 -1.55663 1 0 1 1 0 0 +EDGE2 8551 1170 -0.993536 0.0291674 1.57527 1 0 1 1 0 0 +EDGE2 8551 1190 -1.01556 -0.031751 1.57164 1 0 1 1 0 0 +EDGE2 8551 3030 -0.966682 0.0427655 -1.56224 1 0 1 1 0 0 +EDGE2 8551 1150 -1.04946 -0.0375117 -1.59286 1 0 1 1 0 0 +EDGE2 8551 1110 -0.9995 0.0104117 -1.5734 1 0 1 1 0 0 +EDGE2 8551 5851 0.0440573 -0.0324123 0.0105736 1 0 1 1 0 0 +EDGE2 8551 8391 -0.0886928 0.103917 0.00606026 1 0 1 1 0 0 +EDGE2 8551 3052 1.04383 -0.0208667 0.00670444 1 0 1 1 0 0 +EDGE2 8551 1111 0.0191734 0.00778909 -0.00439866 1 0 1 1 0 0 +EDGE2 8551 3031 0.0282941 0.0138867 -0.00959096 1 0 1 1 0 0 +EDGE2 8551 3051 0.032966 0.035851 0.00903228 1 0 1 1 0 0 +EDGE2 8551 5791 0.0360027 -0.0708805 -0.00979741 1 0 1 1 0 0 +EDGE2 8551 1131 -0.0505211 0.0453837 -0.0100877 1 0 1 1 0 0 +EDGE2 8551 5852 1.03436 0.00340717 0.009546 1 0 1 1 0 0 +EDGE2 8551 8392 0.991953 0.0263912 -0.00583139 1 0 1 1 0 0 +EDGE2 8551 5792 1.03244 -0.00590424 0.00232594 1 0 1 1 0 0 +EDGE2 8551 1112 1.00737 -0.00241264 -0.0372707 1 0 1 1 0 0 +EDGE2 8551 1132 1.01959 0.0932999 -0.0126502 1 0 1 1 0 0 +EDGE2 8551 3032 1.00299 0.0407149 0.0270377 1 0 1 1 0 0 +EDGE2 8552 5851 -0.918932 0.027765 0.0179551 1 0 1 1 0 0 +EDGE2 8552 8551 -1.04494 0.0180021 -0.023472 1 0 1 1 0 0 +EDGE2 8552 8391 -1.01976 0.0520962 -0.00798945 1 0 1 1 0 0 +EDGE2 8552 1133 1.01174 -0.0108258 0.0200445 1 0 1 1 0 0 +EDGE2 8552 3052 -0.0456241 -0.0508078 -0.0367814 1 0 1 1 0 0 +EDGE2 8552 1111 -1.07672 -0.0152476 -0.0145822 1 0 1 1 0 0 +EDGE2 8552 3031 -0.971416 0.0206751 0.0215713 1 0 1 1 0 0 +EDGE2 8552 3051 -0.952946 -0.0665092 -0.00837405 1 0 1 1 0 0 +EDGE2 8552 5791 -1.10514 0.0484924 -0.017146 1 0 1 1 0 0 +EDGE2 8552 1131 -0.910893 0.042472 -0.011645 1 0 1 1 0 0 +EDGE2 8552 5852 0.0142883 -0.0279413 0.0417103 1 0 1 1 0 0 +EDGE2 8552 8392 0.00175438 0.0341456 0.00053029 1 0 1 1 0 0 +EDGE2 8552 5792 0.0229899 0.0301858 0.00821172 1 0 1 1 0 0 +EDGE2 8552 8393 1.18592 -0.025379 -0.0113949 1 0 1 1 0 0 +EDGE2 8552 1112 0.00878864 0.0276544 0.00356752 1 0 1 1 0 0 +EDGE2 8552 1132 0.0390098 -0.0824012 -0.00726672 1 0 1 1 0 0 +EDGE2 8552 3032 -0.0606075 0.00704091 0.0259294 1 0 1 1 0 0 +EDGE2 8552 3053 0.967024 0.0221096 0.0200085 1 0 1 1 0 0 +EDGE2 8552 5793 0.988524 0.0974079 -0.00453065 1 0 1 1 0 0 +EDGE2 8552 5853 1.04483 -0.0359293 -0.0208364 1 0 1 1 0 0 +EDGE2 8552 3033 0.982703 -0.00107796 -0.0367914 1 0 1 1 0 0 +EDGE2 8552 1113 1.00546 0.0657922 0.0148728 1 0 1 1 0 0 +EDGE2 8553 1133 0.0398459 -0.0608124 0.010296 1 0 1 1 0 0 +EDGE2 8553 3052 -0.942652 0.032114 0.000453464 1 0 1 1 0 0 +EDGE2 8553 5852 -0.995561 0.032075 0.0187238 1 0 1 1 0 0 +EDGE2 8553 8392 -1.00806 0.00941273 0.018005 1 0 1 1 0 0 +EDGE2 8553 8552 -1.05411 -0.0286602 -0.00471729 1 0 1 1 0 0 +EDGE2 8553 5792 -0.988657 -0.0361989 -0.0289192 1 0 1 1 0 0 +EDGE2 8553 8393 -0.0339881 -0.016905 0.0166535 1 0 1 1 0 0 +EDGE2 8553 1112 -0.950661 0.0320433 -0.00858845 1 0 1 1 0 0 +EDGE2 8553 1132 -1.00689 0.0713744 0.0228875 1 0 1 1 0 0 +EDGE2 8553 3032 -1.05088 -0.0633989 -0.016036 1 0 1 1 0 0 +EDGE2 8553 3053 0.0647382 -0.0686666 -0.0219394 1 0 1 1 0 0 +EDGE2 8553 5793 0.0372015 0.0184649 -0.00125685 1 0 1 1 0 0 +EDGE2 8553 5853 0.00893074 0.0150647 -0.0236552 1 0 1 1 0 0 +EDGE2 8553 3033 0.0249052 -0.0672263 0.00197087 1 0 1 1 0 0 +EDGE2 8553 5794 1.04445 0.046843 -0.0115315 1 0 1 1 0 0 +EDGE2 8553 8394 0.909066 -0.0525263 0.00524061 1 0 1 1 0 0 +EDGE2 8553 1113 -0.0507767 -0.0120534 0.000788387 1 0 1 1 0 0 +EDGE2 8553 5854 0.98978 0.0956324 0.0332375 1 0 1 1 0 0 +EDGE2 8553 1134 0.93402 -0.101042 0.00832551 1 0 1 1 0 0 +EDGE2 8553 3034 0.944224 -0.0141568 -0.0364058 1 0 1 1 0 0 +EDGE2 8553 3054 0.92978 0.0283936 0.0401606 1 0 1 1 0 0 +EDGE2 8553 1114 0.978584 -4.93268e-06 -0.0293708 1 0 1 1 0 0 +EDGE2 8554 5795 1.02404 0.107317 -0.0139341 1 0 1 1 0 0 +EDGE2 8554 1133 -0.958652 -0.0178261 -0.0182139 1 0 1 1 0 0 +EDGE2 8554 8393 -1.00384 -0.021613 -0.0312145 1 0 1 1 0 0 +EDGE2 8554 8553 -0.973579 -0.097048 0.0388574 1 0 1 1 0 0 +EDGE2 8554 3053 -0.977999 0.0214373 -0.0328374 1 0 1 1 0 0 +EDGE2 8554 5793 -1.00023 -0.0309347 0.0344933 1 0 1 1 0 0 +EDGE2 8554 5853 -0.918343 -0.0437575 0.00496773 1 0 1 1 0 0 +EDGE2 8554 3033 -1.01504 -0.0567443 -0.00854723 1 0 1 1 0 0 +EDGE2 8554 5794 -0.114249 -0.0215033 0.0105581 1 0 1 1 0 0 +EDGE2 8554 8394 0.0595165 -0.0345799 -0.0175788 1 0 1 1 0 0 +EDGE2 8554 1113 -1.00366 -0.0217978 -0.027922 1 0 1 1 0 0 +EDGE2 8554 5854 -0.0680695 0.0447798 0.00458041 1 0 1 1 0 0 +EDGE2 8554 1134 0.0439746 0.0359001 0.00313455 1 0 1 1 0 0 +EDGE2 8554 3034 0.0886411 0.010211 -0.0295758 1 0 1 1 0 0 +EDGE2 8554 3054 0.0293171 0.00340807 -0.0100302 1 0 1 1 0 0 +EDGE2 8554 1114 -0.0205991 -0.0307267 0.00575793 1 0 1 1 0 0 +EDGE2 8554 8395 0.978303 0.0394175 -0.00908822 1 0 1 1 0 0 +EDGE2 8554 8415 1.04817 -0.0985956 -3.12586 1 0 1 1 0 0 +EDGE2 8554 5875 1.01692 0.0652265 -3.13451 1 0 1 1 0 0 +EDGE2 8554 8355 1.0344 -0.00826833 -3.17865 1 0 1 1 0 0 +EDGE2 8554 5855 0.987215 -0.00379041 -0.00440699 1 0 1 1 0 0 +EDGE2 8554 3035 1.01918 -0.0111972 0.0241068 1 0 1 1 0 0 +EDGE2 8554 3055 0.960218 -0.0508476 -0.0346055 1 0 1 1 0 0 +EDGE2 8554 1095 0.987891 -0.0544112 -3.17555 1 0 1 1 0 0 +EDGE2 8554 1115 0.988595 0.0471398 -0.0221791 1 0 1 1 0 0 +EDGE2 8554 1135 1.06638 -0.0465148 -0.0102852 1 0 1 1 0 0 +EDGE2 8555 5795 -0.0163152 0.0616967 -0.0122326 1 0 1 1 0 0 +EDGE2 8555 8356 0.00895512 -0.961332 -1.54088 1 0 1 1 0 0 +EDGE2 8555 8416 0.0767657 -1.02453 -1.56599 1 0 1 1 0 0 +EDGE2 8555 8396 -0.0601421 -1.00854 -1.61763 1 0 1 1 0 0 +EDGE2 8555 5856 -0.0489347 -0.881435 -1.56008 1 0 1 1 0 0 +EDGE2 8555 5876 0.0594093 -1.01634 -1.5889 1 0 1 1 0 0 +EDGE2 8555 3056 -0.0642956 -0.960321 -1.57986 1 0 1 1 0 0 +EDGE2 8555 5794 -1.01185 -0.0576686 -0.0189203 1 0 1 1 0 0 +EDGE2 8555 8394 -0.990685 0.0378906 -0.0261597 1 0 1 1 0 0 +EDGE2 8555 8554 -1.05008 0.0147483 0.029545 1 0 1 1 0 0 +EDGE2 8555 5854 -1.01353 0.0158849 0.00342471 1 0 1 1 0 0 +EDGE2 8555 1134 -1.00523 0.00926111 -0.00695209 1 0 1 1 0 0 +EDGE2 8555 3034 -0.954412 0.0435718 -0.0136272 1 0 1 1 0 0 +EDGE2 8555 3054 -1.05191 -0.137484 0.0153261 1 0 1 1 0 0 +EDGE2 8555 1114 -1.00163 0.00818046 0.000471229 1 0 1 1 0 0 +EDGE2 8555 8395 0.0265377 -0.122795 -0.0211118 1 0 1 1 0 0 +EDGE2 8555 8415 0.0252872 0.00641434 -3.14592 1 0 1 1 0 0 +EDGE2 8555 5875 -0.114618 -0.0165183 -3.12522 1 0 1 1 0 0 +EDGE2 8555 8355 0.111062 -0.000947809 -3.15044 1 0 1 1 0 0 +EDGE2 8555 5855 0.0528625 -0.0522576 -0.00365156 1 0 1 1 0 0 +EDGE2 8555 3035 0.0664334 0.0729617 -0.0103243 1 0 1 1 0 0 +EDGE2 8555 3055 0.0141585 0.00382622 0.0215936 1 0 1 1 0 0 +EDGE2 8555 1095 0.0140722 0.00166457 -3.12558 1 0 1 1 0 0 +EDGE2 8555 1115 0.0164626 0.0509086 0.025856 1 0 1 1 0 0 +EDGE2 8555 1135 -0.0254286 -0.0810039 0.021974 1 0 1 1 0 0 +EDGE2 8555 1094 1.04969 0.0266411 -3.11939 1 0 1 1 0 0 +EDGE2 8555 8354 0.947974 0.0141895 -3.12476 1 0 1 1 0 0 +EDGE2 8555 8414 1.02037 -0.0077568 -3.10877 1 0 1 1 0 0 +EDGE2 8555 5874 0.976872 0.0832297 -3.19816 1 0 1 1 0 0 +EDGE2 8555 1116 -0.0285218 0.992926 1.57285 1 0 1 1 0 0 +EDGE2 8555 3036 0.0496876 0.958948 1.57314 1 0 1 1 0 0 +EDGE2 8555 5796 0.0655552 1.07767 1.55373 1 0 1 1 0 0 +EDGE2 8555 1136 0.0116029 1.03254 1.59591 1 0 1 1 0 0 +EDGE2 8555 1096 -0.0306067 1.06749 1.56439 1 0 1 1 0 0 +EDGE2 8556 5795 -0.985759 -0.00911503 -1.54889 1 0 1 1 0 0 +EDGE2 8556 8395 -0.959669 -0.00382095 -1.58217 1 0 1 1 0 0 +EDGE2 8556 8555 -1.06568 0.0684686 -1.58232 1 0 1 1 0 0 +EDGE2 8556 8415 -1.01753 -0.0346675 1.58837 1 0 1 1 0 0 +EDGE2 8556 5875 -0.933957 -0.0372538 1.6051 1 0 1 1 0 0 +EDGE2 8556 8355 -1.00203 -0.030966 1.57242 1 0 1 1 0 0 +EDGE2 8556 5855 -1.02171 0.0325394 -1.57758 1 0 1 1 0 0 +EDGE2 8556 3035 -1.01328 -0.0388173 -1.56353 1 0 1 1 0 0 +EDGE2 8556 3055 -1.06764 -0.00604877 -1.56562 1 0 1 1 0 0 +EDGE2 8556 1095 -1.05303 -0.0267598 1.53921 1 0 1 1 0 0 +EDGE2 8556 1115 -0.987673 0.0017965 -1.58723 1 0 1 1 0 0 +EDGE2 8556 1135 -0.990474 0.0409819 -1.54983 1 0 1 1 0 0 +EDGE2 8556 1116 0.0479328 -0.0537573 0.00598465 1 0 1 1 0 0 +EDGE2 8556 3036 -0.0425961 0.0410743 0.000245312 1 0 1 1 0 0 +EDGE2 8556 5796 0.0116277 0.0121288 0.00747163 1 0 1 1 0 0 +EDGE2 8556 1136 0.0541128 0.014579 -0.0203397 1 0 1 1 0 0 +EDGE2 8556 1096 -0.063157 -0.0519426 0.0132827 1 0 1 1 0 0 +EDGE2 8556 1097 0.982039 -0.0466627 0.00682656 1 0 1 1 0 0 +EDGE2 8556 1137 1.0014 0.00271997 -0.00862619 1 0 1 1 0 0 +EDGE2 8556 3037 1.00555 0.0201359 0.00744677 1 0 1 1 0 0 +EDGE2 8556 5797 1.10478 0.0387348 0.00989322 1 0 1 1 0 0 +EDGE2 8556 1117 1.04216 0.0803361 -6.16628e-05 1 0 1 1 0 0 +EDGE2 8557 1118 0.97997 0.0128879 0.0077669 1 0 1 1 0 0 +EDGE2 8557 1116 -0.979837 -0.0603778 0.00853534 1 0 1 1 0 0 +EDGE2 8557 3036 -1.11333 -0.155161 -0.00628057 1 0 1 1 0 0 +EDGE2 8557 5796 -1.00917 0.0508792 0.0158543 1 0 1 1 0 0 +EDGE2 8557 8556 -0.949 0.0969202 -0.000350549 1 0 1 1 0 0 +EDGE2 8557 1136 -0.948978 -0.0360288 -0.0050782 1 0 1 1 0 0 +EDGE2 8557 1096 -1.04079 -0.00777086 -0.00892365 1 0 1 1 0 0 +EDGE2 8557 1097 -0.031469 0.0773539 0.0030384 1 0 1 1 0 0 +EDGE2 8557 1137 -0.0321299 -0.0136198 -0.0117331 1 0 1 1 0 0 +EDGE2 8557 3037 0.0428638 -0.0747981 -0.0231154 1 0 1 1 0 0 +EDGE2 8557 5797 -0.0487533 -0.0511213 0.0162545 1 0 1 1 0 0 +EDGE2 8557 1117 -0.0432103 -0.0211231 -0.00175225 1 0 1 1 0 0 +EDGE2 8557 3038 1.03302 -0.071677 0.00884676 1 0 1 1 0 0 +EDGE2 8557 5798 0.949798 -0.0986827 -0.0092597 1 0 1 1 0 0 +EDGE2 8557 1138 0.963371 -0.0868321 0.0126955 1 0 1 1 0 0 +EDGE2 8557 1098 1.00251 -0.0755742 -0.0339412 1 0 1 1 0 0 +EDGE2 8558 1118 -0.00893193 -0.0407824 0.021992 1 0 1 1 0 0 +EDGE2 8558 8557 -1.06721 0.0160941 -0.0075535 1 0 1 1 0 0 +EDGE2 8558 1097 -0.993154 0.00319691 0.0132416 1 0 1 1 0 0 +EDGE2 8558 1137 -0.97516 -0.0893238 0.0202478 1 0 1 1 0 0 +EDGE2 8558 3037 -1.03531 0.0182565 0.0165407 1 0 1 1 0 0 +EDGE2 8558 5797 -0.94946 0.0125047 -0.000718849 1 0 1 1 0 0 +EDGE2 8558 1117 -1.03581 -0.00556742 -0.00834143 1 0 1 1 0 0 +EDGE2 8558 3038 -0.0485026 0.0160627 -0.00218717 1 0 1 1 0 0 +EDGE2 8558 5798 0.0183509 -0.00506771 -0.00694732 1 0 1 1 0 0 +EDGE2 8558 1138 0.0736236 0.0198241 -0.00489299 1 0 1 1 0 0 +EDGE2 8558 1139 1.06028 0.0495107 -0.00278315 1 0 1 1 0 0 +EDGE2 8558 5799 0.971027 -0.033332 0.0216608 1 0 1 1 0 0 +EDGE2 8558 1098 -0.00177384 -0.0216047 -0.0129161 1 0 1 1 0 0 +EDGE2 8558 3039 1.028 -0.0179026 -0.00763781 1 0 1 1 0 0 +EDGE2 8558 1099 1.1394 -0.0135643 0.0277393 1 0 1 1 0 0 +EDGE2 8558 1119 0.943414 -0.0917311 -0.0276358 1 0 1 1 0 0 +EDGE2 8559 5780 0.976157 -0.0218408 -3.18035 1 0 1 1 0 0 +EDGE2 8559 1118 -0.980815 0.00957904 -0.0383765 1 0 1 1 0 0 +EDGE2 8559 3038 -1.08022 0.0141098 0.021509 1 0 1 1 0 0 +EDGE2 8559 5798 -0.909365 -0.0213613 0.0318295 1 0 1 1 0 0 +EDGE2 8559 8558 -1.06258 -0.0226715 0.0126996 1 0 1 1 0 0 +EDGE2 8559 1138 -0.968146 0.0563384 0.00610908 1 0 1 1 0 0 +EDGE2 8559 1139 -0.00120483 0.0169954 -0.00677496 1 0 1 1 0 0 +EDGE2 8559 5799 -0.0624657 0.0314066 -0.0294906 1 0 1 1 0 0 +EDGE2 8559 1098 -0.989956 -0.000426049 -0.0398944 1 0 1 1 0 0 +EDGE2 8559 3039 0.0185536 -0.0543761 0.024075 1 0 1 1 0 0 +EDGE2 8559 1099 0.00209101 0.107746 0.018781 1 0 1 1 0 0 +EDGE2 8559 1119 -0.0310437 -0.00195088 0.0051169 1 0 1 1 0 0 +EDGE2 8559 5800 0.962128 -0.0178862 -0.00513912 1 0 1 1 0 0 +EDGE2 8559 1100 0.953363 -0.0268211 0.0136151 1 0 1 1 0 0 +EDGE2 8559 1140 1.06683 0.00854077 -0.00248535 1 0 1 1 0 0 +EDGE2 8559 3040 0.942801 -0.108252 -0.0242764 1 0 1 1 0 0 +EDGE2 8559 5660 0.955338 0.0949653 -3.10489 1 0 1 1 0 0 +EDGE2 8559 1120 1.11463 -0.0265721 -0.0098104 1 0 1 1 0 0 +EDGE2 8560 5780 -0.057794 -0.0188532 -3.16808 1 0 1 1 0 0 +EDGE2 8560 1139 -1.04288 0.0461383 -0.0292179 1 0 1 1 0 0 +EDGE2 8560 5799 -0.994373 0.0279104 0.00658569 1 0 1 1 0 0 +EDGE2 8560 8559 -1.10042 -0.0426768 -0.000301062 1 0 1 1 0 0 +EDGE2 8560 3039 -0.914611 0.00840254 -0.00975463 1 0 1 1 0 0 +EDGE2 8560 1099 -1.0863 -0.04814 0.0300661 1 0 1 1 0 0 +EDGE2 8560 1119 -0.991332 0.0031533 0.00763458 1 0 1 1 0 0 +EDGE2 8560 1121 0.0189906 0.987073 1.55165 1 0 1 1 0 0 +EDGE2 8560 3041 0.0592881 0.979012 1.5281 1 0 1 1 0 0 +EDGE2 8560 5781 0.00355937 0.998978 1.55362 1 0 1 1 0 0 +EDGE2 8560 5801 0.0526202 1.00464 1.58713 1 0 1 1 0 0 +EDGE2 8560 1141 -0.011527 0.994682 1.61499 1 0 1 1 0 0 +EDGE2 8560 1101 0.0250657 1.02785 1.578 1 0 1 1 0 0 +EDGE2 8560 5800 -0.0281613 0.04835 0.0316391 1 0 1 1 0 0 +EDGE2 8560 1100 0.0921456 0.0695683 0.017438 1 0 1 1 0 0 +EDGE2 8560 1140 -0.0241719 0.0638849 0.0150068 1 0 1 1 0 0 +EDGE2 8560 3040 0.0456759 -0.0417441 -0.00105114 1 0 1 1 0 0 +EDGE2 8560 5660 -0.0288081 -0.0192965 -3.16563 1 0 1 1 0 0 +EDGE2 8560 1120 -0.0734502 0.0657509 0.0213851 1 0 1 1 0 0 +EDGE2 8560 5661 0.0262121 -1.0325 -1.57454 1 0 1 1 0 0 +EDGE2 8560 5659 1.07018 0.0711309 -3.17642 1 0 1 1 0 0 +EDGE2 8560 5779 0.996523 0.0484331 -3.16122 1 0 1 1 0 0 +EDGE2 8561 5780 -0.964306 -0.005016 1.59933 1 0 1 1 0 0 +EDGE2 8561 3042 0.902462 0.0346429 0.00522305 1 0 1 1 0 0 +EDGE2 8561 5802 1.10594 0.088055 -0.0179437 1 0 1 1 0 0 +EDGE2 8561 5782 0.987611 0.0871572 0.0301796 1 0 1 1 0 0 +EDGE2 8561 1102 0.958741 -0.00182703 -0.00881996 1 0 1 1 0 0 +EDGE2 8561 1122 1.01334 -0.0295706 -0.0103057 1 0 1 1 0 0 +EDGE2 8561 1142 1.08001 0.112232 -0.00578742 1 0 1 1 0 0 +EDGE2 8561 1121 0.0343925 -0.0600783 0.015909 1 0 1 1 0 0 +EDGE2 8561 3041 0.0485805 -0.071739 -0.0498288 1 0 1 1 0 0 +EDGE2 8561 5781 -0.0327371 -0.00726107 0.0052218 1 0 1 1 0 0 +EDGE2 8561 5801 0.0254973 -0.00528934 -0.00281491 1 0 1 1 0 0 +EDGE2 8561 1141 0.0509195 -0.0614355 0.0149213 1 0 1 1 0 0 +EDGE2 8561 8560 -0.972433 0.0369116 -1.54123 1 0 1 1 0 0 +EDGE2 8561 1101 0.0251062 -0.000451556 0.00360081 1 0 1 1 0 0 +EDGE2 8561 5800 -1.00442 0.0460755 -1.56895 1 0 1 1 0 0 +EDGE2 8561 1100 -0.894562 -0.0559412 -1.59236 1 0 1 1 0 0 +EDGE2 8561 1140 -1.01354 -0.0188656 -1.57063 1 0 1 1 0 0 +EDGE2 8561 3040 -0.975305 -0.015569 -1.557 1 0 1 1 0 0 +EDGE2 8561 5660 -1.09088 -0.0199095 1.56498 1 0 1 1 0 0 +EDGE2 8561 1120 -0.97879 -0.0289009 -1.55454 1 0 1 1 0 0 +EDGE2 8562 1123 1.05211 0.049987 0.0052287 1 0 1 1 0 0 +EDGE2 8562 3043 1.12791 -0.0216964 0.00975291 1 0 1 1 0 0 +EDGE2 8562 5783 1.04673 0.0959645 0.0135681 1 0 1 1 0 0 +EDGE2 8562 5803 1.05713 -0.084653 0.0180248 1 0 1 1 0 0 +EDGE2 8562 1143 0.956886 0.01996 0.0194334 1 0 1 1 0 0 +EDGE2 8562 8561 -0.917036 0.0708259 -0.00203222 1 0 1 1 0 0 +EDGE2 8562 3042 -0.0430289 -0.0491576 0.0204983 1 0 1 1 0 0 +EDGE2 8562 5802 0.0226029 0.048418 -0.0091113 1 0 1 1 0 0 +EDGE2 8562 1103 0.974915 0.0295329 0.0272728 1 0 1 1 0 0 +EDGE2 8562 5782 -0.0512208 -0.0267614 0.0183358 1 0 1 1 0 0 +EDGE2 8562 1102 -0.0320942 0.0643087 0.0202948 1 0 1 1 0 0 +EDGE2 8562 1122 -0.00110776 -0.0267702 0.00701706 1 0 1 1 0 0 +EDGE2 8562 1142 -0.00968832 -0.0384591 -0.00516739 1 0 1 1 0 0 +EDGE2 8562 1121 -1.00475 -0.0129127 -0.0302535 1 0 1 1 0 0 +EDGE2 8562 3041 -1.18397 -0.066903 -0.00148529 1 0 1 1 0 0 +EDGE2 8562 5781 -1.08529 0.0567864 0.0207632 1 0 1 1 0 0 +EDGE2 8562 5801 -1.00727 -0.0204952 -0.0260053 1 0 1 1 0 0 +EDGE2 8562 1141 -1.03981 0.0170262 0.00814726 1 0 1 1 0 0 +EDGE2 8562 1101 -1.03711 -0.00230537 -0.0155251 1 0 1 1 0 0 +EDGE2 8563 1123 0.0156966 -0.0637656 -0.0136306 1 0 1 1 0 0 +EDGE2 8563 5784 1.04306 -0.0637162 -0.00225014 1 0 1 1 0 0 +EDGE2 8563 5804 0.951069 0.00876476 -0.0116055 1 0 1 1 0 0 +EDGE2 8563 1124 0.915487 0.0450759 0.00518138 1 0 1 1 0 0 +EDGE2 8563 1144 1.0163 0.0903808 -0.0306 1 0 1 1 0 0 +EDGE2 8563 3044 1.03136 0.0422556 -0.0190416 1 0 1 1 0 0 +EDGE2 8563 1104 0.965409 -0.0782994 -0.0144675 1 0 1 1 0 0 +EDGE2 8563 3043 0.0263091 0.0403863 0.00611275 1 0 1 1 0 0 +EDGE2 8563 5783 -0.0995715 0.039612 -0.00337832 1 0 1 1 0 0 +EDGE2 8563 5803 -0.00631308 0.0845932 0.0188831 1 0 1 1 0 0 +EDGE2 8563 1143 -0.0870871 0.0776488 -0.008824 1 0 1 1 0 0 +EDGE2 8563 3042 -1.01501 -0.024602 -0.0129368 1 0 1 1 0 0 +EDGE2 8563 5802 -1.0261 -0.00463978 -0.0188963 1 0 1 1 0 0 +EDGE2 8563 8562 -0.973833 0.00457665 0.0420642 1 0 1 1 0 0 +EDGE2 8563 1103 0.00622222 -0.0480168 -0.0307691 1 0 1 1 0 0 +EDGE2 8563 5782 -0.968775 0.0276422 -0.0126491 1 0 1 1 0 0 +EDGE2 8563 1102 -0.986474 -0.0158688 0.0217605 1 0 1 1 0 0 +EDGE2 8563 1122 -1.00698 -0.0826248 -0.00241408 1 0 1 1 0 0 +EDGE2 8563 1142 -0.977974 0.06953 -0.013499 1 0 1 1 0 0 +EDGE2 8564 5805 0.991566 -0.0433697 0.0250305 1 0 1 1 0 0 +EDGE2 8564 8545 0.970385 0.017268 -3.1217 1 0 1 1 0 0 +EDGE2 8564 1123 -0.891002 -0.0792577 0.0288352 1 0 1 1 0 0 +EDGE2 8564 5784 -0.00302025 0.093085 -0.0329032 1 0 1 1 0 0 +EDGE2 8564 1145 1.00533 0.0121962 0.0184158 1 0 1 1 0 0 +EDGE2 8564 3045 0.978223 0.0876204 0.00350297 1 0 1 1 0 0 +EDGE2 8564 3505 0.978532 -0.0056958 -3.16918 1 0 1 1 0 0 +EDGE2 8564 5785 1.0443 0.0701784 0.0314739 1 0 1 1 0 0 +EDGE2 8564 3025 1.08941 0.00332277 -3.10251 1 0 1 1 0 0 +EDGE2 8564 1105 1.00188 -0.00394369 0.0032284 1 0 1 1 0 0 +EDGE2 8564 1125 1.05428 0.0569528 -0.0137437 1 0 1 1 0 0 +EDGE2 8564 5804 -0.128755 -0.0162723 0.0216746 1 0 1 1 0 0 +EDGE2 8564 8563 -0.956562 0.0475169 -0.0431674 1 0 1 1 0 0 +EDGE2 8564 1124 0.00369722 -0.0537613 -0.0256537 1 0 1 1 0 0 +EDGE2 8564 1144 -0.0253125 -0.051172 -0.011763 1 0 1 1 0 0 +EDGE2 8564 3044 -0.00278229 -0.0832919 -0.033347 1 0 1 1 0 0 +EDGE2 8564 1104 -0.0206417 0.0790191 0.0170628 1 0 1 1 0 0 +EDGE2 8564 3043 -0.945732 -0.0150561 -0.0187557 1 0 1 1 0 0 +EDGE2 8564 5783 -0.916094 -0.0606868 -0.00215197 1 0 1 1 0 0 +EDGE2 8564 5803 -0.949752 -0.0401753 -0.00662248 1 0 1 1 0 0 +EDGE2 8564 1143 -1.0722 0.00489902 -0.0295269 1 0 1 1 0 0 +EDGE2 8564 1103 -0.935961 -0.0243723 -0.0289954 1 0 1 1 0 0 +EDGE2 8565 3504 0.943206 0.0555503 -3.15552 1 0 1 1 0 0 +EDGE2 8565 8544 0.953755 -0.00884781 -3.12179 1 0 1 1 0 0 +EDGE2 8565 3024 1.03601 -0.0477658 -3.1209 1 0 1 1 0 0 +EDGE2 8565 5805 -0.0013825 -0.0512123 0.0330344 1 0 1 1 0 0 +EDGE2 8565 3046 0.0221577 1.1023 1.54745 1 0 1 1 0 0 +EDGE2 8565 5806 -0.0552222 0.998299 1.54637 1 0 1 1 0 0 +EDGE2 8565 8546 -0.0338603 0.956252 1.59062 1 0 1 1 0 0 +EDGE2 8565 5786 -0.0646192 1.08861 1.58111 1 0 1 1 0 0 +EDGE2 8565 1126 0.0241836 1.01981 1.56991 1 0 1 1 0 0 +EDGE2 8565 1146 -0.0832888 0.952976 1.57602 1 0 1 1 0 0 +EDGE2 8565 3026 0.00433654 0.983269 1.55874 1 0 1 1 0 0 +EDGE2 8565 1106 -0.0219723 0.959627 1.56998 1 0 1 1 0 0 +EDGE2 8565 8545 0.0319945 0.0479018 -3.17444 1 0 1 1 0 0 +EDGE2 8565 5784 -0.962738 -0.0438261 0.0226417 1 0 1 1 0 0 +EDGE2 8565 1145 -0.0043139 0.0162808 0.0105171 1 0 1 1 0 0 +EDGE2 8565 3045 0.0268434 -0.0659611 0.0233293 1 0 1 1 0 0 +EDGE2 8565 3505 -0.0409379 -0.0116621 -3.12782 1 0 1 1 0 0 +EDGE2 8565 5785 0.0529929 -0.0198551 0.0394528 1 0 1 1 0 0 +EDGE2 8565 3025 0.0322142 0.0422557 -3.16023 1 0 1 1 0 0 +EDGE2 8565 8564 -1.06296 0.0330357 -0.0041127 1 0 1 1 0 0 +EDGE2 8565 1105 0.0129297 0.0339609 -0.00171382 1 0 1 1 0 0 +EDGE2 8565 1125 -0.020462 0.0515593 -0.00471971 1 0 1 1 0 0 +EDGE2 8565 5804 -1.09767 -0.0215392 0.00661523 1 0 1 1 0 0 +EDGE2 8565 1124 -0.999679 -0.0371649 0.0141077 1 0 1 1 0 0 +EDGE2 8565 1144 -1.04152 0.00330901 0.0114369 1 0 1 1 0 0 +EDGE2 8565 3044 -0.9521 -0.0749598 -0.021947 1 0 1 1 0 0 +EDGE2 8565 1104 -1.0263 0.0273272 0.0197987 1 0 1 1 0 0 +EDGE2 8565 3506 0.0480522 -0.962018 -1.57504 1 0 1 1 0 0 +EDGE2 8566 3027 0.970378 -0.0204859 -0.0117902 1 0 1 1 0 0 +EDGE2 8566 8547 1.02324 0.0052245 0.0115826 1 0 1 1 0 0 +EDGE2 8566 5787 0.955712 -0.0424752 0.0105307 1 0 1 1 0 0 +EDGE2 8566 5807 1.06012 -0.105438 0.00607127 1 0 1 1 0 0 +EDGE2 8566 3047 0.987225 0.00627324 0.0101971 1 0 1 1 0 0 +EDGE2 8566 5805 -0.968684 0.00542123 -1.56385 1 0 1 1 0 0 +EDGE2 8566 1127 0.977477 0.0859862 0.0015623 1 0 1 1 0 0 +EDGE2 8566 1147 1.0053 0.041206 -0.0174698 1 0 1 1 0 0 +EDGE2 8566 1107 0.992778 0.0140714 -0.0191068 1 0 1 1 0 0 +EDGE2 8566 8565 -1.00197 -0.00487857 -1.58179 1 0 1 1 0 0 +EDGE2 8566 3046 -0.0353845 -0.0612733 0.0230404 1 0 1 1 0 0 +EDGE2 8566 5806 -0.00439125 -0.0371708 0.00251826 1 0 1 1 0 0 +EDGE2 8566 8546 0.0275617 0.00611039 -0.00230922 1 0 1 1 0 0 +EDGE2 8566 5786 0.0213663 0.0113797 0.008572 1 0 1 1 0 0 +EDGE2 8566 1126 -0.00148746 -0.0237678 0.00204816 1 0 1 1 0 0 +EDGE2 8566 1146 -0.0445113 0.0266087 0.0212009 1 0 1 1 0 0 +EDGE2 8566 3026 -0.0438295 0.0759972 -0.0156514 1 0 1 1 0 0 +EDGE2 8566 1106 0.02089 -0.0168438 0.0269429 1 0 1 1 0 0 +EDGE2 8566 8545 -0.971922 -0.133526 1.57937 1 0 1 1 0 0 +EDGE2 8566 1145 -0.96977 -0.0530933 -1.56411 1 0 1 1 0 0 +EDGE2 8566 3045 -1.00415 0.00799119 -1.59452 1 0 1 1 0 0 +EDGE2 8566 3505 -1.04435 -0.0174256 1.57945 1 0 1 1 0 0 +EDGE2 8566 5785 -0.955515 -0.0311456 -1.56093 1 0 1 1 0 0 +EDGE2 8566 3025 -0.9763 -0.021461 1.54815 1 0 1 1 0 0 +EDGE2 8566 1105 -0.973467 0.115391 -1.55784 1 0 1 1 0 0 +EDGE2 8566 1125 -1.0289 -0.057838 -1.57076 1 0 1 1 0 0 +EDGE2 8567 3027 0.0274776 0.0392703 -0.00180233 1 0 1 1 0 0 +EDGE2 8567 3048 0.93361 0.0640328 0.0196503 1 0 1 1 0 0 +EDGE2 8567 5808 1.04002 0.0753603 0.000215974 1 0 1 1 0 0 +EDGE2 8567 8548 0.96829 0.0118653 0.0126562 1 0 1 1 0 0 +EDGE2 8567 5788 0.964899 -0.0549778 0.0147657 1 0 1 1 0 0 +EDGE2 8567 3028 1.06126 0.0878154 -0.0047951 1 0 1 1 0 0 +EDGE2 8567 8547 0.0621455 -0.0357261 -0.00169978 1 0 1 1 0 0 +EDGE2 8567 1108 0.919669 -0.0381528 -0.0147556 1 0 1 1 0 0 +EDGE2 8567 1128 0.899241 0.03086 -0.0237384 1 0 1 1 0 0 +EDGE2 8567 1148 1.05303 -0.00175251 0.0329052 1 0 1 1 0 0 +EDGE2 8567 5787 0.0441485 0.0155783 -0.0232438 1 0 1 1 0 0 +EDGE2 8567 5807 -0.0543764 0.00364144 0.00571249 1 0 1 1 0 0 +EDGE2 8567 3047 -0.0685559 -0.032819 -0.00391283 1 0 1 1 0 0 +EDGE2 8567 1127 -0.0569358 -0.0187297 0.00732713 1 0 1 1 0 0 +EDGE2 8567 1147 -0.00106696 0.0188566 0.00848572 1 0 1 1 0 0 +EDGE2 8567 1107 -0.0413356 0.0596183 -0.000842325 1 0 1 1 0 0 +EDGE2 8567 3046 -0.881667 -0.0456372 -0.0215181 1 0 1 1 0 0 +EDGE2 8567 5806 -1.02898 0.0573894 0.00745786 1 0 1 1 0 0 +EDGE2 8567 8546 -1.01926 -0.0165016 0.0124477 1 0 1 1 0 0 +EDGE2 8567 8566 -1.00094 0.0245632 0.0345289 1 0 1 1 0 0 +EDGE2 8567 5786 -0.98544 0.0138172 -0.0117942 1 0 1 1 0 0 +EDGE2 8567 1126 -1.00154 0.00821445 -0.0071707 1 0 1 1 0 0 +EDGE2 8567 1146 -1.04516 -0.0278554 -0.0020595 1 0 1 1 0 0 +EDGE2 8567 3026 -0.923578 -0.0333645 0.0204963 1 0 1 1 0 0 +EDGE2 8567 1106 -0.977656 0.0498244 -0.0104648 1 0 1 1 0 0 +EDGE2 8568 3027 -0.974793 0.0421167 -0.0031362 1 0 1 1 0 0 +EDGE2 8568 3048 0.00042496 -0.0494394 0.00982023 1 0 1 1 0 0 +EDGE2 8568 5789 1.01198 -0.0027497 -0.015804 1 0 1 1 0 0 +EDGE2 8568 8549 1.00712 -0.0251401 0.0353796 1 0 1 1 0 0 +EDGE2 8568 5809 1.00829 -0.0744874 -0.00599124 1 0 1 1 0 0 +EDGE2 8568 1109 0.98055 -0.00935898 -0.00965923 1 0 1 1 0 0 +EDGE2 8568 1149 0.983412 0.0514853 -0.0208584 1 0 1 1 0 0 +EDGE2 8568 3029 0.995671 0.0445476 0.0263965 1 0 1 1 0 0 +EDGE2 8568 3049 0.985312 0.0681573 0.00300435 1 0 1 1 0 0 +EDGE2 8568 1129 1.00954 0.0267633 0.0234286 1 0 1 1 0 0 +EDGE2 8568 5808 -0.0891336 0.037175 0.0179385 1 0 1 1 0 0 +EDGE2 8568 8548 -0.0070591 -0.045214 0.017617 1 0 1 1 0 0 +EDGE2 8568 5788 -0.0329847 0.000609831 -0.0156293 1 0 1 1 0 0 +EDGE2 8568 3028 -0.00313264 0.0372822 0.0156312 1 0 1 1 0 0 +EDGE2 8568 8547 -0.97975 -0.00211153 -0.0273011 1 0 1 1 0 0 +EDGE2 8568 1108 0.0934677 0.0172875 -0.00891871 1 0 1 1 0 0 +EDGE2 8568 1128 0.054634 0.0236895 -0.00877989 1 0 1 1 0 0 +EDGE2 8568 1148 0.0448052 -0.0861968 -0.00243962 1 0 1 1 0 0 +EDGE2 8568 8567 -1.01879 -0.0401251 0.0241288 1 0 1 1 0 0 +EDGE2 8568 5787 -1.02905 0.0464749 0.00542063 1 0 1 1 0 0 +EDGE2 8568 5807 -1.01265 0.0275694 -0.0235452 1 0 1 1 0 0 +EDGE2 8568 3047 -0.98229 0.0526238 0.0362833 1 0 1 1 0 0 +EDGE2 8568 1127 -0.965522 0.0704072 0.0193477 1 0 1 1 0 0 +EDGE2 8568 1147 -1.06609 -0.0163008 -0.0275528 1 0 1 1 0 0 +EDGE2 8568 1107 -0.958277 -0.0517303 -0.049876 1 0 1 1 0 0 +EDGE2 8569 3050 1.00947 0.0493102 -0.00347696 1 0 1 1 0 0 +EDGE2 8569 5850 0.960821 0.0846592 -3.1285 1 0 1 1 0 0 +EDGE2 8569 8490 1.04742 -0.0515638 -3.13541 1 0 1 1 0 0 +EDGE2 8569 8550 0.905423 -0.000790341 0.0220954 1 0 1 1 0 0 +EDGE2 8569 8390 0.972936 0.040279 -3.17194 1 0 1 1 0 0 +EDGE2 8569 3170 0.918359 0.0546959 -3.14672 1 0 1 1 0 0 +EDGE2 8569 5790 0.979597 0.0368806 0.0173837 1 0 1 1 0 0 +EDGE2 8569 5810 0.931134 0.0332899 -0.0189152 1 0 1 1 0 0 +EDGE2 8569 5830 1.00605 0.0193518 -3.14316 1 0 1 1 0 0 +EDGE2 8569 3490 1.00326 0.105519 -3.14852 1 0 1 1 0 0 +EDGE2 8569 3110 1.07313 -0.0201055 -3.11433 1 0 1 1 0 0 +EDGE2 8569 3130 1.05221 -0.0116489 -3.13616 1 0 1 1 0 0 +EDGE2 8569 3090 0.970599 -0.0227928 -3.12051 1 0 1 1 0 0 +EDGE2 8569 3048 -0.961689 0.0667626 -0.0156875 1 0 1 1 0 0 +EDGE2 8569 5789 -0.0458933 -0.0339875 0.0149738 1 0 1 1 0 0 +EDGE2 8569 1130 1.02604 0.00352189 1.97455e-05 1 0 1 1 0 0 +EDGE2 8569 1170 0.961581 -0.021288 -3.14258 1 0 1 1 0 0 +EDGE2 8569 1190 0.958252 -0.04698 -3.1618 1 0 1 1 0 0 +EDGE2 8569 3030 0.95575 -0.0444885 0.00834061 1 0 1 1 0 0 +EDGE2 8569 1150 1.01714 -0.0535254 0.00599714 1 0 1 1 0 0 +EDGE2 8569 8549 -0.0901658 -0.011565 0.00170869 1 0 1 1 0 0 +EDGE2 8569 1110 0.976311 0.0731466 0.0132186 1 0 1 1 0 0 +EDGE2 8569 5809 0.0577275 -0.0183557 0.00106381 1 0 1 1 0 0 +EDGE2 8569 1109 -0.0138384 -0.0722791 -0.00177261 1 0 1 1 0 0 +EDGE2 8569 1149 -0.0164018 -0.0434371 -0.00198148 1 0 1 1 0 0 +EDGE2 8569 3029 -0.00798249 -0.00372346 -0.0200564 1 0 1 1 0 0 +EDGE2 8569 3049 -0.00666976 0.0863783 -0.011914 1 0 1 1 0 0 +EDGE2 8569 1129 -0.041274 0.124613 -0.00215288 1 0 1 1 0 0 +EDGE2 8569 5808 -1.01552 0.132568 -0.020206 1 0 1 1 0 0 +EDGE2 8569 8548 -1.03321 0.0473237 -0.0143855 1 0 1 1 0 0 +EDGE2 8569 8568 -0.911495 -0.0414046 -0.013886 1 0 1 1 0 0 +EDGE2 8569 5788 -1.04809 0.0707754 -0.0050656 1 0 1 1 0 0 +EDGE2 8569 3028 -0.995753 -0.0549443 -0.000272405 1 0 1 1 0 0 +EDGE2 8569 1108 -1.02776 0.0206578 0.00798988 1 0 1 1 0 0 +EDGE2 8569 1128 -1.01927 -0.00754153 0.0295349 1 0 1 1 0 0 +EDGE2 8569 1148 -1.01346 -0.0164949 -0.00754541 1 0 1 1 0 0 +EDGE2 8570 5849 0.929715 -0.0188366 -3.13748 1 0 1 1 0 0 +EDGE2 8570 8489 0.974884 0.0177002 -3.12315 1 0 1 1 0 0 +EDGE2 8570 8389 0.985082 -0.072865 -3.11589 1 0 1 1 0 0 +EDGE2 8570 3109 1.07384 -0.0456077 -3.15208 1 0 1 1 0 0 +EDGE2 8570 3169 1.04122 0.00665254 -3.15509 1 0 1 1 0 0 +EDGE2 8570 3489 0.990937 0.0192521 -3.14644 1 0 1 1 0 0 +EDGE2 8570 5829 0.986124 -0.0880299 -3.15837 1 0 1 1 0 0 +EDGE2 8570 3129 1.07541 0.0061879 -3.15813 1 0 1 1 0 0 +EDGE2 8570 1189 1.01712 -0.0607251 -3.10868 1 0 1 1 0 0 +EDGE2 8570 3089 0.958366 -0.0574811 -3.11146 1 0 1 1 0 0 +EDGE2 8570 1169 1.02697 -0.00125845 -3.14622 1 0 1 1 0 0 +EDGE2 8570 3050 -0.0225021 0.0225792 0.0247633 1 0 1 1 0 0 +EDGE2 8570 3131 0.0368244 -1.07316 -1.62118 1 0 1 1 0 0 +EDGE2 8570 8491 0.0474539 -0.933739 -1.53989 1 0 1 1 0 0 +EDGE2 8570 3491 -0.0251013 -0.967256 -1.51871 1 0 1 1 0 0 +EDGE2 8570 5811 0.00805446 -0.907586 -1.55326 1 0 1 1 0 0 +EDGE2 8570 5831 0.0409766 -1.04038 -1.58114 1 0 1 1 0 0 +EDGE2 8570 3171 0.000799179 -0.981869 -1.56229 1 0 1 1 0 0 +EDGE2 8570 5850 -0.0204564 0.0536974 -3.11403 1 0 1 1 0 0 +EDGE2 8570 1151 -0.0719955 -0.954937 -1.59254 1 0 1 1 0 0 +EDGE2 8570 1191 -0.0190815 -0.957545 -1.57434 1 0 1 1 0 0 +EDGE2 8570 3091 -0.00705219 -1.05122 -1.56105 1 0 1 1 0 0 +EDGE2 8570 3111 0.0458814 -1.02573 -1.64471 1 0 1 1 0 0 +EDGE2 8570 1171 -0.043829 -1.01747 -1.56615 1 0 1 1 0 0 +EDGE2 8570 8490 -0.0856715 -0.044711 -3.08177 1 0 1 1 0 0 +EDGE2 8570 8550 0.0602352 0.0440243 0.0256116 1 0 1 1 0 0 +EDGE2 8570 8390 0.0545483 0.0232192 -3.15792 1 0 1 1 0 0 +EDGE2 8570 3170 0.0401039 -0.0645409 -3.13354 1 0 1 1 0 0 +EDGE2 8570 5790 -0.0140531 -0.00278616 0.0251686 1 0 1 1 0 0 +EDGE2 8570 5810 0.00574496 0.0882116 0.00183216 1 0 1 1 0 0 +EDGE2 8570 5830 0.00818461 -0.0116314 -3.14628 1 0 1 1 0 0 +EDGE2 8570 3490 -0.00400706 -0.012676 -3.14924 1 0 1 1 0 0 +EDGE2 8570 3110 0.0699707 -0.0514848 -3.10818 1 0 1 1 0 0 +EDGE2 8570 3130 0.0172888 -0.0151056 -3.14362 1 0 1 1 0 0 +EDGE2 8570 3090 -0.00385533 0.0427041 -3.12428 1 0 1 1 0 0 +EDGE2 8570 5789 -0.967963 -0.0216264 0.0108251 1 0 1 1 0 0 +EDGE2 8570 1130 -0.0222492 -0.0335822 0.0047008 1 0 1 1 0 0 +EDGE2 8570 1170 -0.0173452 -0.00741291 -3.14593 1 0 1 1 0 0 +EDGE2 8570 1190 0.0507859 0.0503832 -3.16544 1 0 1 1 0 0 +EDGE2 8570 3030 -0.00588426 -0.0835519 0.016368 1 0 1 1 0 0 +EDGE2 8570 1150 -0.0995339 -0.0107476 -0.0415674 1 0 1 1 0 0 +EDGE2 8570 8549 -1.06271 -0.057189 0.000817057 1 0 1 1 0 0 +EDGE2 8570 8569 -1.09013 0.0238131 0.0241011 1 0 1 1 0 0 +EDGE2 8570 1110 -0.0613912 -0.0534074 -0.00141881 1 0 1 1 0 0 +EDGE2 8570 5809 -1.0086 0.0561923 -0.0121084 1 0 1 1 0 0 +EDGE2 8570 1109 -0.870313 0.0542851 0.0157906 1 0 1 1 0 0 +EDGE2 8570 1149 -1.01754 0.0471038 -0.00441102 1 0 1 1 0 0 +EDGE2 8570 3029 -0.966655 0.100776 -0.019506 1 0 1 1 0 0 +EDGE2 8570 3049 -0.964807 0.0120897 -0.00749519 1 0 1 1 0 0 +EDGE2 8570 1129 -0.990033 0.0634439 0.0117207 1 0 1 1 0 0 +EDGE2 8570 5851 0.0470485 1.00878 1.58701 1 0 1 1 0 0 +EDGE2 8570 8551 -0.0799841 1.02353 1.57298 1 0 1 1 0 0 +EDGE2 8570 8391 -0.015953 0.983285 1.5222 1 0 1 1 0 0 +EDGE2 8570 1111 0.105781 0.976971 1.58355 1 0 1 1 0 0 +EDGE2 8570 3031 -0.0711255 0.982709 1.55024 1 0 1 1 0 0 +EDGE2 8570 3051 0.00274997 1.03191 1.5624 1 0 1 1 0 0 +EDGE2 8570 5791 -0.0165505 0.980073 1.59123 1 0 1 1 0 0 +EDGE2 8570 1131 -0.00704516 1.07224 1.57949 1 0 1 1 0 0 +EDGE2 8571 3050 -0.972607 -0.0184297 1.56333 1 0 1 1 0 0 +EDGE2 8571 3131 0.08408 -0.0133704 -0.0250245 1 0 1 1 0 0 +EDGE2 8571 3092 1.08757 0.0182902 0.0107205 1 0 1 1 0 0 +EDGE2 8571 5812 0.963137 0.0411587 0.00023847 1 0 1 1 0 0 +EDGE2 8571 8492 1.07416 -0.0105007 -0.012657 1 0 1 1 0 0 +EDGE2 8571 5832 0.993712 0.0500298 -0.0301579 1 0 1 1 0 0 +EDGE2 8571 3132 1.01655 0.0317516 0.0102566 1 0 1 1 0 0 +EDGE2 8571 3172 0.979923 -0.0532576 0.0306636 1 0 1 1 0 0 +EDGE2 8571 3492 1.03218 0.0974143 -0.0117834 1 0 1 1 0 0 +EDGE2 8571 3112 1.03024 0.110885 -0.00764552 1 0 1 1 0 0 +EDGE2 8571 8491 -0.071247 0.0411459 0.0106092 1 0 1 1 0 0 +EDGE2 8571 1152 0.991292 0.100381 -0.0182203 1 0 1 1 0 0 +EDGE2 8571 1172 1.07373 0.0648099 0.00373748 1 0 1 1 0 0 +EDGE2 8571 1192 0.984463 0.0383009 0.026496 1 0 1 1 0 0 +EDGE2 8571 3491 -0.0143056 0.0228424 -0.0274905 1 0 1 1 0 0 +EDGE2 8571 5811 -0.0115743 -0.00629611 -0.00319673 1 0 1 1 0 0 +EDGE2 8571 5831 0.0558585 0.0645084 -0.00917361 1 0 1 1 0 0 +EDGE2 8571 3171 -0.0585943 0.0392616 0.0433543 1 0 1 1 0 0 +EDGE2 8571 5850 -0.985771 0.0211271 -1.58795 1 0 1 1 0 0 +EDGE2 8571 1151 0.0778166 -0.0568518 -0.0289335 1 0 1 1 0 0 +EDGE2 8571 1191 0.0680629 -0.032453 0.0100807 1 0 1 1 0 0 +EDGE2 8571 3091 -0.0238427 0.0231131 -0.0259531 1 0 1 1 0 0 +EDGE2 8571 3111 0.0052294 -0.0802608 0.0133277 1 0 1 1 0 0 +EDGE2 8571 1171 -0.0160785 -0.111438 -0.0149485 1 0 1 1 0 0 +EDGE2 8571 8490 -1.00793 -0.0543341 -1.57922 1 0 1 1 0 0 +EDGE2 8571 8550 -0.905247 -0.0257169 1.60607 1 0 1 1 0 0 +EDGE2 8571 8570 -0.930645 -0.0276069 1.58077 1 0 1 1 0 0 +EDGE2 8571 8390 -1.00965 -0.0960041 -1.56112 1 0 1 1 0 0 +EDGE2 8571 3170 -1.02383 0.0986252 -1.5863 1 0 1 1 0 0 +EDGE2 8571 5790 -0.99683 -0.00186577 1.57593 1 0 1 1 0 0 +EDGE2 8571 5810 -0.906463 0.0160631 1.55466 1 0 1 1 0 0 +EDGE2 8571 5830 -1.04098 0.0247605 -1.56407 1 0 1 1 0 0 +EDGE2 8571 3490 -1.03178 0.00236575 -1.56977 1 0 1 1 0 0 +EDGE2 8571 3110 -1.01297 -0.0608037 -1.57679 1 0 1 1 0 0 +EDGE2 8571 3130 -0.99565 -0.0808131 -1.57039 1 0 1 1 0 0 +EDGE2 8571 3090 -0.93959 -0.0589965 -1.60381 1 0 1 1 0 0 +EDGE2 8571 1130 -1.10431 0.0564855 1.58568 1 0 1 1 0 0 +EDGE2 8571 1170 -1.08628 -0.0227811 -1.5605 1 0 1 1 0 0 +EDGE2 8571 1190 -1.0423 -0.0390989 -1.58066 1 0 1 1 0 0 +EDGE2 8571 3030 -1.03638 0.025513 1.58062 1 0 1 1 0 0 +EDGE2 8571 1150 -1.07559 -0.010248 1.56152 1 0 1 1 0 0 +EDGE2 8571 1110 -1.00073 0.0355921 1.58294 1 0 1 1 0 0 +EDGE2 8572 1173 0.977285 0.122434 -0.0163474 1 0 1 1 0 0 +EDGE2 8572 8493 1.01268 0.010456 0.0150643 1 0 1 1 0 0 +EDGE2 8572 3133 0.988118 0.110323 -0.00936875 1 0 1 1 0 0 +EDGE2 8572 3493 0.995205 0.0605143 -0.0211393 1 0 1 1 0 0 +EDGE2 8572 5813 1.01742 -0.0126933 0.00481305 1 0 1 1 0 0 +EDGE2 8572 5833 0.963608 0.0557912 0.0264738 1 0 1 1 0 0 +EDGE2 8572 3173 0.956217 -0.00130562 -0.00828276 1 0 1 1 0 0 +EDGE2 8572 3093 0.962414 0.0385597 0.0108794 1 0 1 1 0 0 +EDGE2 8572 3113 1.00028 0.0279878 0.0343633 1 0 1 1 0 0 +EDGE2 8572 1193 1.03045 -0.100094 0.011189 1 0 1 1 0 0 +EDGE2 8572 3131 -0.964792 0.0274823 0.0167199 1 0 1 1 0 0 +EDGE2 8572 3092 -0.00442453 -0.0791745 0.00517176 1 0 1 1 0 0 +EDGE2 8572 5812 0.0726694 -0.0727968 -0.0167432 1 0 1 1 0 0 +EDGE2 8572 8492 -0.0414795 -0.00424307 0.0266136 1 0 1 1 0 0 +EDGE2 8572 1153 1.08723 0.0364614 -0.00264515 1 0 1 1 0 0 +EDGE2 8572 5832 0.0552508 -0.0417031 0.010059 1 0 1 1 0 0 +EDGE2 8572 3132 -0.0322042 0.0660197 0.0234931 1 0 1 1 0 0 +EDGE2 8572 3172 -0.00124371 0.030658 -0.0250885 1 0 1 1 0 0 +EDGE2 8572 3492 -0.0996295 -0.0558916 -0.0455503 1 0 1 1 0 0 +EDGE2 8572 3112 -0.0169391 -0.0626113 0.0227643 1 0 1 1 0 0 +EDGE2 8572 8491 -0.867314 0.00229111 -0.000408445 1 0 1 1 0 0 +EDGE2 8572 1152 0.0106672 -0.0525048 -0.00846778 1 0 1 1 0 0 +EDGE2 8572 1172 -0.00276188 0.0762309 0.0156724 1 0 1 1 0 0 +EDGE2 8572 1192 0.00332893 0.0183372 0.0140538 1 0 1 1 0 0 +EDGE2 8572 8571 -0.962361 0.0028549 -0.0100717 1 0 1 1 0 0 +EDGE2 8572 3491 -1.03975 0.0121881 0.0240732 1 0 1 1 0 0 +EDGE2 8572 5811 -0.921122 0.106349 -0.000824396 1 0 1 1 0 0 +EDGE2 8572 5831 -1.05645 0.0475265 0.0354762 1 0 1 1 0 0 +EDGE2 8572 3171 -1.0319 -0.00747773 -0.00089803 1 0 1 1 0 0 +EDGE2 8572 1151 -0.972331 -0.00670719 0.0113007 1 0 1 1 0 0 +EDGE2 8572 1191 -1.05716 0.03087 -0.0223438 1 0 1 1 0 0 +EDGE2 8572 3091 -1.12915 0.0270653 0.000535863 1 0 1 1 0 0 +EDGE2 8572 3111 -1.02664 0.0193781 -0.0171118 1 0 1 1 0 0 +EDGE2 8572 1171 -0.952103 0.0557575 0.0227362 1 0 1 1 0 0 +EDGE2 8573 1173 -0.115817 -0.0657617 0.0256908 1 0 1 1 0 0 +EDGE2 8573 1174 0.951047 0.042135 -0.00681436 1 0 1 1 0 0 +EDGE2 8573 3174 0.958967 0.0790542 -0.00740837 1 0 1 1 0 0 +EDGE2 8573 5814 0.993038 0.00651821 0.0074069 1 0 1 1 0 0 +EDGE2 8573 5834 1.01019 -0.00603555 -0.0172018 1 0 1 1 0 0 +EDGE2 8573 8494 1.04026 -0.120023 -0.0230374 1 0 1 1 0 0 +EDGE2 8573 3494 1.02952 -0.00567617 0.0368488 1 0 1 1 0 0 +EDGE2 8573 3094 1.031 0.040961 -0.00351798 1 0 1 1 0 0 +EDGE2 8573 3114 1.05383 -0.0685544 -0.000100158 1 0 1 1 0 0 +EDGE2 8573 3134 1.0235 0.0288518 0.0101002 1 0 1 1 0 0 +EDGE2 8573 1194 0.922778 -0.0589279 0.0322524 1 0 1 1 0 0 +EDGE2 8573 8493 -0.0087585 0.0553629 -0.0173807 1 0 1 1 0 0 +EDGE2 8573 1154 0.970505 0.0228191 0.0282326 1 0 1 1 0 0 +EDGE2 8573 3133 0.0181535 -0.0250281 -0.0164052 1 0 1 1 0 0 +EDGE2 8573 3493 -0.0264645 0.10628 0.00424411 1 0 1 1 0 0 +EDGE2 8573 5813 -0.100462 0.0516759 -0.00204446 1 0 1 1 0 0 +EDGE2 8573 5833 0.0504246 -0.140602 0.0331278 1 0 1 1 0 0 +EDGE2 8573 3173 0.00277435 -0.0271602 -0.00602129 1 0 1 1 0 0 +EDGE2 8573 3093 -0.063997 0.0383046 -0.0113964 1 0 1 1 0 0 +EDGE2 8573 3113 -0.107703 0.0266436 0.00534152 1 0 1 1 0 0 +EDGE2 8573 1193 0.0140453 -0.00931854 0.0255473 1 0 1 1 0 0 +EDGE2 8573 3092 -1.03603 0.0235416 0.0129952 1 0 1 1 0 0 +EDGE2 8573 5812 -1.02488 0.082214 -0.00812597 1 0 1 1 0 0 +EDGE2 8573 8492 -1.01593 0.0198177 0.0234202 1 0 1 1 0 0 +EDGE2 8573 8572 -0.951801 -0.00486533 -0.00166864 1 0 1 1 0 0 +EDGE2 8573 1153 -0.0238073 0.0459464 0.0104667 1 0 1 1 0 0 +EDGE2 8573 5832 -1.03128 0.0140258 0.0324245 1 0 1 1 0 0 +EDGE2 8573 3132 -1.0392 0.0071152 -0.0274358 1 0 1 1 0 0 +EDGE2 8573 3172 -0.894812 -0.049089 -0.0271553 1 0 1 1 0 0 +EDGE2 8573 3492 -1.08329 0.0323126 0.0112076 1 0 1 1 0 0 +EDGE2 8573 3112 -1.03642 0.00122331 -0.0135071 1 0 1 1 0 0 +EDGE2 8573 1152 -1.02645 0.0112196 -0.0137982 1 0 1 1 0 0 +EDGE2 8573 1172 -1.10861 -0.0481689 0.00750656 1 0 1 1 0 0 +EDGE2 8573 1192 -1.13793 0.042421 -0.0225672 1 0 1 1 0 0 +EDGE2 8574 3495 1.00095 -0.00914792 -0.0237283 1 0 1 1 0 0 +EDGE2 8574 5835 0.959282 -0.12523 -0.0156952 1 0 1 1 0 0 +EDGE2 8574 8495 0.884192 0.093765 0.00780033 1 0 1 1 0 0 +EDGE2 8574 8515 1.05913 -0.0130802 -3.14251 1 0 1 1 0 0 +EDGE2 8574 5815 0.952283 0.0445215 0.0220422 1 0 1 1 0 0 +EDGE2 8574 1173 -1.00234 0.022384 -0.00245441 1 0 1 1 0 0 +EDGE2 8574 1174 0.0049976 0.0559274 -0.0308221 1 0 1 1 0 0 +EDGE2 8574 3115 1.01798 -0.0117263 -0.000737042 1 0 1 1 0 0 +EDGE2 8574 3175 1.03663 0.0363453 -0.00203816 1 0 1 1 0 0 +EDGE2 8574 3375 0.993105 0.086499 -3.123 1 0 1 1 0 0 +EDGE2 8574 3475 0.967686 0.0292769 -3.12019 1 0 1 1 0 0 +EDGE2 8574 3135 0.98613 -0.0356216 -0.0243116 1 0 1 1 0 0 +EDGE2 8574 1175 1.00125 -0.0589671 -0.00642881 1 0 1 1 0 0 +EDGE2 8574 1195 0.949852 -0.0302248 0.0222162 1 0 1 1 0 0 +EDGE2 8574 3095 0.899918 -0.0197855 0.00522832 1 0 1 1 0 0 +EDGE2 8574 1155 0.922627 0.0625975 0.00894196 1 0 1 1 0 0 +EDGE2 8574 3174 -0.0382137 -0.0633884 -0.0030764 1 0 1 1 0 0 +EDGE2 8574 5814 -0.0237167 0.0632583 -0.000882465 1 0 1 1 0 0 +EDGE2 8574 5834 -0.0666397 -0.0316828 0.015602 1 0 1 1 0 0 +EDGE2 8574 8494 -0.0697448 0.0548531 -0.0210157 1 0 1 1 0 0 +EDGE2 8574 3494 -0.0736675 0.0110037 0.0357135 1 0 1 1 0 0 +EDGE2 8574 3094 0.00340282 -0.0520147 -0.0131072 1 0 1 1 0 0 +EDGE2 8574 3114 0.0198072 0.0031635 0.00406198 1 0 1 1 0 0 +EDGE2 8574 3134 0.125319 0.00385376 -0.0118654 1 0 1 1 0 0 +EDGE2 8574 1194 0.0497429 0.0617806 -0.0210215 1 0 1 1 0 0 +EDGE2 8574 8493 -1.03225 -0.0527328 0.00575449 1 0 1 1 0 0 +EDGE2 8574 8573 -1.10395 0.0464356 -0.00599904 1 0 1 1 0 0 +EDGE2 8574 1154 0.0410301 0.000398798 -0.0154462 1 0 1 1 0 0 +EDGE2 8574 3133 -0.984147 -0.0657121 -0.0270055 1 0 1 1 0 0 +EDGE2 8574 3493 -1.02485 -0.0816726 -0.00576466 1 0 1 1 0 0 +EDGE2 8574 5813 -0.983947 0.0359385 -0.00492021 1 0 1 1 0 0 +EDGE2 8574 5833 -1.03269 -0.0158619 -0.0382008 1 0 1 1 0 0 +EDGE2 8574 3173 -0.989608 0.00418128 0.000222455 1 0 1 1 0 0 +EDGE2 8574 3093 -1.01894 0.0301373 -0.00033035 1 0 1 1 0 0 +EDGE2 8574 3113 -1.00128 -0.0262927 0.0130416 1 0 1 1 0 0 +EDGE2 8574 1193 -1.04872 0.04421 -0.0241699 1 0 1 1 0 0 +EDGE2 8574 1153 -1.01103 -0.0607628 -0.00873569 1 0 1 1 0 0 +EDGE2 8575 3495 0.0358982 0.00137743 -0.00249874 1 0 1 1 0 0 +EDGE2 8575 3474 1.04063 -0.0652102 -3.13969 1 0 1 1 0 0 +EDGE2 8575 8514 1.01791 -0.0767094 -3.15445 1 0 1 1 0 0 +EDGE2 8575 3374 1.02137 -0.0126639 -3.15914 1 0 1 1 0 0 +EDGE2 8575 1196 0.108109 1.03731 1.54835 1 0 1 1 0 0 +EDGE2 8575 3476 0.0383348 0.97921 1.56676 1 0 1 1 0 0 +EDGE2 8575 5836 0.0102327 1.00384 1.60675 1 0 1 1 0 0 +EDGE2 8575 8496 -0.00268785 0.932716 1.53902 1 0 1 1 0 0 +EDGE2 8575 5816 -0.00202847 0.966039 1.57388 1 0 1 1 0 0 +EDGE2 8575 3116 0.0154128 1.04551 1.57485 1 0 1 1 0 0 +EDGE2 8575 3136 0.0151336 0.991064 1.60331 1 0 1 1 0 0 +EDGE2 8575 3376 -0.0363063 0.955233 1.55958 1 0 1 1 0 0 +EDGE2 8575 3096 0.00214388 1.05455 1.58441 1 0 1 1 0 0 +EDGE2 8575 1156 -0.00183622 1.03668 1.53583 1 0 1 1 0 0 +EDGE2 8575 1176 0.0359553 0.891074 1.59857 1 0 1 1 0 0 +EDGE2 8575 5835 -0.0144968 -0.0677555 0.0166668 1 0 1 1 0 0 +EDGE2 8575 8495 0.021836 0.0331153 0.00403732 1 0 1 1 0 0 +EDGE2 8575 8515 0.00860292 -0.014733 -3.14046 1 0 1 1 0 0 +EDGE2 8575 5815 -0.0900499 -0.0646652 0.00750029 1 0 1 1 0 0 +EDGE2 8575 1174 -0.981684 0.0321139 0.0334728 1 0 1 1 0 0 +EDGE2 8575 8574 -0.99681 -0.022391 -0.00641769 1 0 1 1 0 0 +EDGE2 8575 3115 0.0111749 -0.0180021 -0.00157366 1 0 1 1 0 0 +EDGE2 8575 3175 0.114487 0.118166 -0.0135514 1 0 1 1 0 0 +EDGE2 8575 3375 0.00916542 -0.0456931 -3.12308 1 0 1 1 0 0 +EDGE2 8575 3475 0.0155624 0.0134918 -3.12376 1 0 1 1 0 0 +EDGE2 8575 3135 -0.00574465 0.0558422 -0.00814205 1 0 1 1 0 0 +EDGE2 8575 1175 0.0614591 -0.113651 -0.0127469 1 0 1 1 0 0 +EDGE2 8575 1195 0.0777886 0.0572084 0.0294661 1 0 1 1 0 0 +EDGE2 8575 3095 -0.00298917 -0.0229277 -0.0142162 1 0 1 1 0 0 +EDGE2 8575 1155 0.0283276 -0.0360102 0.0260004 1 0 1 1 0 0 +EDGE2 8575 3174 -0.87256 0.00992538 0.0230534 1 0 1 1 0 0 +EDGE2 8575 5814 -0.9418 0.0239555 0.0111468 1 0 1 1 0 0 +EDGE2 8575 5834 -1.00727 -0.00192125 0.0129839 1 0 1 1 0 0 +EDGE2 8575 8494 -1.05131 -0.0321333 -0.000552365 1 0 1 1 0 0 +EDGE2 8575 3494 -0.97977 -0.00142172 -0.0321007 1 0 1 1 0 0 +EDGE2 8575 3094 -0.999935 -0.00899597 -0.00413605 1 0 1 1 0 0 +EDGE2 8575 3114 -0.990582 -0.019603 -0.00416453 1 0 1 1 0 0 +EDGE2 8575 3134 -1.01727 -0.0188404 0.000233397 1 0 1 1 0 0 +EDGE2 8575 1194 -0.994172 -0.0156084 0.0200576 1 0 1 1 0 0 +EDGE2 8575 8516 0.0191853 -0.964099 -1.59297 1 0 1 1 0 0 +EDGE2 8575 1154 -1.03579 -0.0434396 0.0219726 1 0 1 1 0 0 +EDGE2 8575 3176 0.0303274 -0.964121 -1.56857 1 0 1 1 0 0 +EDGE2 8575 3496 0.0408363 -0.921416 -1.59274 1 0 1 1 0 0 +EDGE2 8576 3495 -1.00065 0.00763299 -1.55033 1 0 1 1 0 0 +EDGE2 8576 1197 0.941214 0.0981071 -0.0218187 1 0 1 1 0 0 +EDGE2 8576 3477 1.01871 -0.0795537 0.00302672 1 0 1 1 0 0 +EDGE2 8576 5837 1.00369 0.0744735 0.0172241 1 0 1 1 0 0 +EDGE2 8576 8497 1.00296 0.0780739 0.0357648 1 0 1 1 0 0 +EDGE2 8576 5817 1.04705 0.0533539 0.0127265 1 0 1 1 0 0 +EDGE2 8576 3117 0.988752 0.0314748 -0.0266853 1 0 1 1 0 0 +EDGE2 8576 3137 1.01774 0.00473461 -0.0102502 1 0 1 1 0 0 +EDGE2 8576 3377 0.991023 -0.032872 -0.00350263 1 0 1 1 0 0 +EDGE2 8576 3097 0.967396 -0.0390877 -0.0168083 1 0 1 1 0 0 +EDGE2 8576 1177 0.98996 0.0251357 0.0224551 1 0 1 1 0 0 +EDGE2 8576 1157 0.960648 0.0384357 0.0237552 1 0 1 1 0 0 +EDGE2 8576 1196 -0.0332949 0.0439697 0.014101 1 0 1 1 0 0 +EDGE2 8576 3476 0.0177124 -0.103602 0.0338671 1 0 1 1 0 0 +EDGE2 8576 5836 0.0162578 0.0360497 -0.00336861 1 0 1 1 0 0 +EDGE2 8576 8496 -0.0415836 -0.0960146 -0.00200959 1 0 1 1 0 0 +EDGE2 8576 5816 -0.0417968 0.0111512 -0.0194596 1 0 1 1 0 0 +EDGE2 8576 3116 -0.0692831 -0.0476569 -0.035897 1 0 1 1 0 0 +EDGE2 8576 3136 -0.0209814 0.0156711 -0.00811428 1 0 1 1 0 0 +EDGE2 8576 3376 -0.0189768 -0.0457965 0.00691339 1 0 1 1 0 0 +EDGE2 8576 3096 0.0466742 -0.00470076 -0.0158367 1 0 1 1 0 0 +EDGE2 8576 8575 -0.978283 -0.0348407 -1.59925 1 0 1 1 0 0 +EDGE2 8576 1156 0.013917 -0.0959989 0.0145086 1 0 1 1 0 0 +EDGE2 8576 1176 0.0125977 -0.00252002 -0.0111781 1 0 1 1 0 0 +EDGE2 8576 5835 -1.03555 0.0164813 -1.56103 1 0 1 1 0 0 +EDGE2 8576 8495 -0.950274 0.0726192 -1.53895 1 0 1 1 0 0 +EDGE2 8576 8515 -1.13098 -0.0674212 1.59084 1 0 1 1 0 0 +EDGE2 8576 5815 -1.04189 0.0156427 -1.60381 1 0 1 1 0 0 +EDGE2 8576 3115 -0.948985 -0.0940674 -1.63187 1 0 1 1 0 0 +EDGE2 8576 3175 -0.977612 0.0853183 -1.58624 1 0 1 1 0 0 +EDGE2 8576 3375 -1.07498 0.119375 1.54768 1 0 1 1 0 0 +EDGE2 8576 3475 -1.02025 0.0665508 1.58128 1 0 1 1 0 0 +EDGE2 8576 3135 -0.972097 0.0508577 -1.59757 1 0 1 1 0 0 +EDGE2 8576 1175 -1.01564 0.0951332 -1.56919 1 0 1 1 0 0 +EDGE2 8576 1195 -1.00023 0.00929513 -1.55159 1 0 1 1 0 0 +EDGE2 8576 3095 -0.965954 -0.0107587 -1.5564 1 0 1 1 0 0 +EDGE2 8576 1155 -0.988546 0.0635779 -1.58541 1 0 1 1 0 0 +EDGE2 8577 1197 0.000331197 -0.0249122 -0.0279702 1 0 1 1 0 0 +EDGE2 8577 5818 1.01496 0.0285424 0.0206004 1 0 1 1 0 0 +EDGE2 8577 5838 1.03307 0.0623328 -0.00419573 1 0 1 1 0 0 +EDGE2 8577 8498 1.10116 -0.0981267 0.0146024 1 0 1 1 0 0 +EDGE2 8577 3098 1.01716 0.00764475 0.0194579 1 0 1 1 0 0 +EDGE2 8577 3138 0.969366 0.011964 0.0124308 1 0 1 1 0 0 +EDGE2 8577 3378 1.03297 0.00165724 0.00601911 1 0 1 1 0 0 +EDGE2 8577 3478 0.983542 -0.0346403 0.00924219 1 0 1 1 0 0 +EDGE2 8577 3118 1.03966 -0.119459 -0.002682 1 0 1 1 0 0 +EDGE2 8577 1178 1.07602 0.078048 0.0229665 1 0 1 1 0 0 +EDGE2 8577 1198 1.00344 -0.077575 -0.00614056 1 0 1 1 0 0 +EDGE2 8577 1158 0.956035 0.0634051 -0.0399657 1 0 1 1 0 0 +EDGE2 8577 3477 -0.0013786 -0.0300228 -0.000300197 1 0 1 1 0 0 +EDGE2 8577 5837 0.105001 0.0344627 0.0127931 1 0 1 1 0 0 +EDGE2 8577 8497 -0.0553893 -0.045154 0.00759389 1 0 1 1 0 0 +EDGE2 8577 5817 -0.164153 0.0710378 -0.00740519 1 0 1 1 0 0 +EDGE2 8577 3117 -0.0522096 0.0784556 -0.0129634 1 0 1 1 0 0 +EDGE2 8577 3137 -0.0379991 -0.0290783 0.0135582 1 0 1 1 0 0 +EDGE2 8577 3377 -0.0317046 -0.023748 -0.00355466 1 0 1 1 0 0 +EDGE2 8577 3097 0.0244928 0.0840119 -0.00644605 1 0 1 1 0 0 +EDGE2 8577 1177 -0.00908056 -0.00782178 0.00160331 1 0 1 1 0 0 +EDGE2 8577 1157 -0.0949112 -0.00479084 -0.0485855 1 0 1 1 0 0 +EDGE2 8577 1196 -0.996229 -0.0555855 0.000454664 1 0 1 1 0 0 +EDGE2 8577 3476 -0.974397 0.0212837 0.00150482 1 0 1 1 0 0 +EDGE2 8577 5836 -0.957556 0.0797119 -0.0565578 1 0 1 1 0 0 +EDGE2 8577 8496 -1.0686 0.0517388 0.0389781 1 0 1 1 0 0 +EDGE2 8577 8576 -1.06958 0.080206 -0.00627566 1 0 1 1 0 0 +EDGE2 8577 5816 -0.957907 -0.0321265 -0.02702 1 0 1 1 0 0 +EDGE2 8577 3116 -1.02206 -0.0811107 -0.00773619 1 0 1 1 0 0 +EDGE2 8577 3136 -0.964762 -0.0538283 0.0163603 1 0 1 1 0 0 +EDGE2 8577 3376 -0.95543 0.0248342 -0.0330302 1 0 1 1 0 0 +EDGE2 8577 3096 -1.04325 0.0527816 0.00834914 1 0 1 1 0 0 +EDGE2 8577 1156 -1.0843 0.00839716 0.00169261 1 0 1 1 0 0 +EDGE2 8577 1176 -0.970583 -0.0280075 0.0225055 1 0 1 1 0 0 +EDGE2 8578 1197 -0.996403 0.0910695 0.0246827 1 0 1 1 0 0 +EDGE2 8578 5839 1.00638 0.0416701 -0.0171323 1 0 1 1 0 0 +EDGE2 8578 8499 0.986703 0.117064 0.0195745 1 0 1 1 0 0 +EDGE2 8578 3119 1.04647 0.0467404 0.0300986 1 0 1 1 0 0 +EDGE2 8578 3379 1.01708 -0.0716794 0.00917175 1 0 1 1 0 0 +EDGE2 8578 3479 1.067 -0.0735687 -0.00601124 1 0 1 1 0 0 +EDGE2 8578 5819 0.953139 -0.0472493 0.00395766 1 0 1 1 0 0 +EDGE2 8578 3139 1.1134 -0.0341773 0.0023219 1 0 1 1 0 0 +EDGE2 8578 1179 1.00295 0.0659086 -0.0301704 1 0 1 1 0 0 +EDGE2 8578 1199 1.07073 0.0830627 -0.000142794 1 0 1 1 0 0 +EDGE2 8578 3099 0.979432 -0.00952504 -0.0202448 1 0 1 1 0 0 +EDGE2 8578 1159 1.00203 0.0449484 -0.0299183 1 0 1 1 0 0 +EDGE2 8578 5818 -0.0214049 0.022307 0.0213154 1 0 1 1 0 0 +EDGE2 8578 5838 -0.0312324 0.0453221 -0.00825764 1 0 1 1 0 0 +EDGE2 8578 8498 0.0859149 0.0362767 -0.0487535 1 0 1 1 0 0 +EDGE2 8578 3098 -0.028799 0.0697894 -0.00697214 1 0 1 1 0 0 +EDGE2 8578 3138 0.00549043 -0.0611153 0.0294921 1 0 1 1 0 0 +EDGE2 8578 3378 -0.00427165 0.0156744 0.0190294 1 0 1 1 0 0 +EDGE2 8578 3478 0.00308364 -0.0862274 0.0193619 1 0 1 1 0 0 +EDGE2 8578 3118 -0.0132174 -0.0161602 0.0328016 1 0 1 1 0 0 +EDGE2 8578 1178 0.0894712 -0.127837 -0.0289459 1 0 1 1 0 0 +EDGE2 8578 1198 -0.112624 -0.039991 -0.0214369 1 0 1 1 0 0 +EDGE2 8578 1158 0.0375906 -0.0810504 -0.0262754 1 0 1 1 0 0 +EDGE2 8578 3477 -0.971655 0.106518 -0.0379509 1 0 1 1 0 0 +EDGE2 8578 5837 -1.06386 -0.0124813 0.00457027 1 0 1 1 0 0 +EDGE2 8578 8497 -1.06159 -0.0544124 -0.0286675 1 0 1 1 0 0 +EDGE2 8578 8577 -0.938461 -0.0187266 0.00909864 1 0 1 1 0 0 +EDGE2 8578 5817 -0.967888 0.0665868 -0.0145194 1 0 1 1 0 0 +EDGE2 8578 3117 -0.986301 -0.0102606 -0.025813 1 0 1 1 0 0 +EDGE2 8578 3137 -1.02173 0.00127079 0.0423036 1 0 1 1 0 0 +EDGE2 8578 3377 -1.06209 0.0803724 0.00388896 1 0 1 1 0 0 +EDGE2 8578 3097 -1.0256 -0.0411177 0.00636821 1 0 1 1 0 0 +EDGE2 8578 1177 -0.984246 0.0125055 -0.0118579 1 0 1 1 0 0 +EDGE2 8578 1157 -0.974101 -0.0414529 -0.0112788 1 0 1 1 0 0 +EDGE2 8579 5820 1.04728 0.0325222 0.0105939 1 0 1 1 0 0 +EDGE2 8579 8500 1.11649 -0.124303 -0.0166812 1 0 1 1 0 0 +EDGE2 8579 5840 0.935456 -0.0565033 -0.0294861 1 0 1 1 0 0 +EDGE2 8579 1160 0.980286 -0.0408745 -0.00487202 1 0 1 1 0 0 +EDGE2 8579 3140 1.06265 0.0634771 0.0163338 1 0 1 1 0 0 +EDGE2 8579 3420 0.975727 -0.00999801 -3.12691 1 0 1 1 0 0 +EDGE2 8579 3440 1.02455 0.00245617 -3.12988 1 0 1 1 0 0 +EDGE2 8579 3480 1.06813 0.00558325 0.0138921 1 0 1 1 0 0 +EDGE2 8579 3380 0.985655 -0.0182794 0.0142351 1 0 1 1 0 0 +EDGE2 8579 1200 1.05176 -0.0564598 0.00204817 1 0 1 1 0 0 +EDGE2 8579 3100 1.05819 0.0364911 0.0164837 1 0 1 1 0 0 +EDGE2 8579 3120 0.963073 -0.0439165 0.0118509 1 0 1 1 0 0 +EDGE2 8579 1180 1.00779 -0.0363012 -0.012533 1 0 1 1 0 0 +EDGE2 8579 900 1.03474 -0.0534603 -3.11534 1 0 1 1 0 0 +EDGE2 8579 840 1.03367 0.0172921 -3.11964 1 0 1 1 0 0 +EDGE2 8579 860 0.964265 0.114854 -3.1615 1 0 1 1 0 0 +EDGE2 8579 5839 -0.0120435 -0.0235696 0.0169398 1 0 1 1 0 0 +EDGE2 8579 8499 -0.0263579 -0.0400109 -0.0213159 1 0 1 1 0 0 +EDGE2 8579 3119 -0.017441 0.0243224 0.00517914 1 0 1 1 0 0 +EDGE2 8579 3379 0.0456835 0.0788519 -0.0507567 1 0 1 1 0 0 +EDGE2 8579 3479 -0.00895176 -0.0327235 -0.0073131 1 0 1 1 0 0 +EDGE2 8579 5819 -0.0835911 -0.0388126 -0.0179994 1 0 1 1 0 0 +EDGE2 8579 3139 0.0536575 -0.0677567 0.0180043 1 0 1 1 0 0 +EDGE2 8579 1179 0.0658991 0.0185765 0.0287708 1 0 1 1 0 0 +EDGE2 8579 1199 -0.0132579 0.0182284 -0.0185868 1 0 1 1 0 0 +EDGE2 8579 3099 -0.0798399 0.013802 0.0305843 1 0 1 1 0 0 +EDGE2 8579 1159 -0.0243996 0.00166773 -0.0220808 1 0 1 1 0 0 +EDGE2 8579 5818 -1.0099 0.0484439 -0.0250577 1 0 1 1 0 0 +EDGE2 8579 8578 -1.00955 -0.00591309 0.0128776 1 0 1 1 0 0 +EDGE2 8579 5838 -1.04278 -0.0330561 -0.00956599 1 0 1 1 0 0 +EDGE2 8579 8498 -1.09306 -0.043193 -0.0288293 1 0 1 1 0 0 +EDGE2 8579 3098 -1.02438 0.00399746 0.0150195 1 0 1 1 0 0 +EDGE2 8579 3138 -0.975378 0.0107308 0.0296369 1 0 1 1 0 0 +EDGE2 8579 3378 -0.97192 -0.116136 -0.00988798 1 0 1 1 0 0 +EDGE2 8579 3478 -1.04317 0.11054 0.0266201 1 0 1 1 0 0 +EDGE2 8579 3118 -0.91928 0.02836 0.0296009 1 0 1 1 0 0 +EDGE2 8579 1178 -0.979294 0.0600129 0.0108402 1 0 1 1 0 0 +EDGE2 8579 1198 -0.934355 0.0511521 0.00171708 1 0 1 1 0 0 +EDGE2 8579 1158 -1.01864 -0.0527784 -0.0305694 1 0 1 1 0 0 +EDGE2 8580 5820 0.105901 0.0449146 0.0178012 1 0 1 1 0 0 +EDGE2 8580 839 0.993634 0.0896185 -3.17148 1 0 1 1 0 0 +EDGE2 8580 899 0.922944 0.0278153 -3.13091 1 0 1 1 0 0 +EDGE2 8580 3419 0.960168 -0.0521928 -3.13818 1 0 1 1 0 0 +EDGE2 8580 3439 1.03793 -0.0551245 -3.13868 1 0 1 1 0 0 +EDGE2 8580 859 0.965961 0.0484409 -3.16308 1 0 1 1 0 0 +EDGE2 8580 3441 0.0303107 -0.956746 -1.5829 1 0 1 1 0 0 +EDGE2 8580 8501 0.0751206 -0.974087 -1.62275 1 0 1 1 0 0 +EDGE2 8580 841 -0.0555744 -1.00908 -1.54546 1 0 1 1 0 0 +EDGE2 8580 901 -0.0323767 -1.08128 -1.55998 1 0 1 1 0 0 +EDGE2 8580 1201 -0.0129355 -0.938513 -1.54684 1 0 1 1 0 0 +EDGE2 8580 3421 0.0365888 -1.08735 -1.56585 1 0 1 1 0 0 +EDGE2 8580 861 -0.0164315 -1.07102 -1.55357 1 0 1 1 0 0 +EDGE2 8580 8500 -0.0890739 -0.00294192 -0.0074194 1 0 1 1 0 0 +EDGE2 8580 5840 0.0104883 0.0414022 -0.00471156 1 0 1 1 0 0 +EDGE2 8580 5821 -0.0317627 1.02635 1.57859 1 0 1 1 0 0 +EDGE2 8580 1160 0.00935524 -0.00540538 -0.0168233 1 0 1 1 0 0 +EDGE2 8580 3140 0.0450344 0.0103624 -0.0136679 1 0 1 1 0 0 +EDGE2 8580 3420 -0.0378987 -0.0209393 -3.14825 1 0 1 1 0 0 +EDGE2 8580 3440 0.035608 0.00098112 -3.13074 1 0 1 1 0 0 +EDGE2 8580 3480 0.0752422 0.0474992 -0.00992351 1 0 1 1 0 0 +EDGE2 8580 3380 -0.0486208 0.0320099 -0.0116957 1 0 1 1 0 0 +EDGE2 8580 1200 0.0156326 0.00724343 0.0184854 1 0 1 1 0 0 +EDGE2 8580 3100 0.0351738 0.00533948 0.00572359 1 0 1 1 0 0 +EDGE2 8580 3120 -0.0280528 0.0606434 0.0528953 1 0 1 1 0 0 +EDGE2 8580 1180 -0.0333406 -0.153426 0.0254501 1 0 1 1 0 0 +EDGE2 8580 900 -0.0252808 -0.0475761 -3.17704 1 0 1 1 0 0 +EDGE2 8580 840 -0.010773 -0.0192179 -3.1374 1 0 1 1 0 0 +EDGE2 8580 860 -0.0176155 -0.0645064 -3.14469 1 0 1 1 0 0 +EDGE2 8580 5841 -0.0365352 0.999912 1.56937 1 0 1 1 0 0 +EDGE2 8580 3101 -0.00999684 1.04974 1.55234 1 0 1 1 0 0 +EDGE2 8580 3141 0.0222925 1.02355 1.60634 1 0 1 1 0 0 +EDGE2 8580 3381 -0.017198 1.02313 1.59872 1 0 1 1 0 0 +EDGE2 8580 3481 -0.00233959 0.991135 1.58755 1 0 1 1 0 0 +EDGE2 8580 3121 0.0299693 0.949383 1.56633 1 0 1 1 0 0 +EDGE2 8580 1161 0.0285178 1.11297 1.57167 1 0 1 1 0 0 +EDGE2 8580 1181 0.0821345 0.976012 1.58161 1 0 1 1 0 0 +EDGE2 8580 5839 -1.05136 -0.0129806 -0.000839408 1 0 1 1 0 0 +EDGE2 8580 8499 -0.924408 0.0420674 -0.0330471 1 0 1 1 0 0 +EDGE2 8580 8579 -0.975602 -0.0362715 -0.00374068 1 0 1 1 0 0 +EDGE2 8580 3119 -0.990803 -0.00096625 0.031763 1 0 1 1 0 0 +EDGE2 8580 3379 -0.961893 -0.0732719 0.0148733 1 0 1 1 0 0 +EDGE2 8580 3479 -1.02864 0.0301248 0.0350739 1 0 1 1 0 0 +EDGE2 8580 5819 -0.986554 -0.0161097 -0.0368831 1 0 1 1 0 0 +EDGE2 8580 3139 -0.953438 0.136565 -0.00737814 1 0 1 1 0 0 +EDGE2 8580 1179 -1.00494 0.062338 0.00414538 1 0 1 1 0 0 +EDGE2 8580 1199 -0.94447 0.00577035 0.00973444 1 0 1 1 0 0 +EDGE2 8580 3099 -1.05571 -0.0402343 0.00387775 1 0 1 1 0 0 +EDGE2 8580 1159 -1.01406 0.00406322 -0.0063066 1 0 1 1 0 0 +EDGE2 8581 5820 -0.995686 0.0206346 1.5981 1 0 1 1 0 0 +EDGE2 8581 3441 -0.00743757 0.0678778 0.0156022 1 0 1 1 0 0 +EDGE2 8581 902 1.07684 0.0640485 -0.0103575 1 0 1 1 0 0 +EDGE2 8581 3422 0.965302 -0.0543667 -0.0178992 1 0 1 1 0 0 +EDGE2 8581 3442 0.952713 -0.0599271 -0.0035221 1 0 1 1 0 0 +EDGE2 8581 8502 1.05727 -0.073113 0.00413624 1 0 1 1 0 0 +EDGE2 8581 1202 1.05559 -0.0954068 0.00233773 1 0 1 1 0 0 +EDGE2 8581 842 0.949821 -0.00138352 0.0106135 1 0 1 1 0 0 +EDGE2 8581 862 0.950411 0.0899299 -0.0204941 1 0 1 1 0 0 +EDGE2 8581 8501 0.05699 -0.100027 0.00740996 1 0 1 1 0 0 +EDGE2 8581 841 -0.0555674 -0.0536638 0.0102117 1 0 1 1 0 0 +EDGE2 8581 901 0.0354546 -0.0214002 0.0172242 1 0 1 1 0 0 +EDGE2 8581 1201 0.0341799 -0.0867713 -0.0225953 1 0 1 1 0 0 +EDGE2 8581 3421 -0.0726308 -0.0283918 -0.00118986 1 0 1 1 0 0 +EDGE2 8581 861 -0.0432323 -0.041475 0.0469305 1 0 1 1 0 0 +EDGE2 8581 8500 -0.928728 0.080099 1.55435 1 0 1 1 0 0 +EDGE2 8581 8580 -1.05565 -0.0211566 1.60313 1 0 1 1 0 0 +EDGE2 8581 5840 -1.03636 0.0213406 1.568 1 0 1 1 0 0 +EDGE2 8581 1160 -1.04835 -0.0463085 1.60075 1 0 1 1 0 0 +EDGE2 8581 3140 -0.989902 0.00818853 1.59217 1 0 1 1 0 0 +EDGE2 8581 3420 -0.999501 -0.127653 -1.57315 1 0 1 1 0 0 +EDGE2 8581 3440 -0.958779 -0.031168 -1.56196 1 0 1 1 0 0 +EDGE2 8581 3480 -1.03546 -0.0540221 1.56408 1 0 1 1 0 0 +EDGE2 8581 3380 -0.923836 -0.0065295 1.55932 1 0 1 1 0 0 +EDGE2 8581 1200 -0.990134 0.033399 1.5864 1 0 1 1 0 0 +EDGE2 8581 3100 -1.01018 -0.00180086 1.56367 1 0 1 1 0 0 +EDGE2 8581 3120 -1.04882 -0.0335641 1.5887 1 0 1 1 0 0 +EDGE2 8581 1180 -0.986738 -0.0973981 1.55363 1 0 1 1 0 0 +EDGE2 8581 900 -0.956976 -0.073165 -1.59528 1 0 1 1 0 0 +EDGE2 8581 840 -1.10685 -0.0302012 -1.55537 1 0 1 1 0 0 +EDGE2 8581 860 -0.942863 0.0102865 -1.56414 1 0 1 1 0 0 +EDGE2 8582 3423 1.06456 -0.046184 0.00657937 1 0 1 1 0 0 +EDGE2 8582 8503 1.00865 -0.0448469 -0.055731 1 0 1 1 0 0 +EDGE2 8582 3443 1.01017 0.0766785 0.00275605 1 0 1 1 0 0 +EDGE2 8582 863 0.986038 -0.135468 0.00287298 1 0 1 1 0 0 +EDGE2 8582 903 1.13287 -0.0329702 -0.0249071 1 0 1 1 0 0 +EDGE2 8582 1203 1.00253 -0.0225463 -0.0051631 1 0 1 1 0 0 +EDGE2 8582 843 0.99628 -0.0799428 0.00669335 1 0 1 1 0 0 +EDGE2 8582 3441 -0.958283 -0.139696 -0.0229443 1 0 1 1 0 0 +EDGE2 8582 902 -0.0739188 -0.118166 0.0234183 1 0 1 1 0 0 +EDGE2 8582 3422 -0.0395899 -0.0790188 -0.0214438 1 0 1 1 0 0 +EDGE2 8582 3442 0.018483 -0.116669 0.026441 1 0 1 1 0 0 +EDGE2 8582 8502 0.0153528 0.0411747 -0.00501554 1 0 1 1 0 0 +EDGE2 8582 1202 -0.057027 -0.0964029 -0.00345292 1 0 1 1 0 0 +EDGE2 8582 8581 -1.0365 -0.0257227 0.0161958 1 0 1 1 0 0 +EDGE2 8582 842 -0.0367116 -0.0154626 0.0163945 1 0 1 1 0 0 +EDGE2 8582 862 -0.0741228 0.0193737 0.00317398 1 0 1 1 0 0 +EDGE2 8582 8501 -0.976188 0.0490563 -0.000736964 1 0 1 1 0 0 +EDGE2 8582 841 -1.04277 0.0144775 0.00296093 1 0 1 1 0 0 +EDGE2 8582 901 -1.0272 0.0357266 -0.0397542 1 0 1 1 0 0 +EDGE2 8582 1201 -1.0013 -0.033316 -0.0221152 1 0 1 1 0 0 +EDGE2 8582 3421 -0.969413 -0.0315969 0.0137087 1 0 1 1 0 0 +EDGE2 8582 861 -1.05845 -0.0207855 -0.0357043 1 0 1 1 0 0 +EDGE2 8583 8582 -1.03554 -0.0628024 -0.0434501 1 0 1 1 0 0 +EDGE2 8583 864 0.965678 0.00253794 0.00365263 1 0 1 1 0 0 +EDGE2 8583 8504 1.13471 -0.0179421 0.0272173 1 0 1 1 0 0 +EDGE2 8583 1204 1.03767 -0.0662401 0.00953521 1 0 1 1 0 0 +EDGE2 8583 3424 0.986362 -0.0180526 0.00509146 1 0 1 1 0 0 +EDGE2 8583 3444 1.00083 -0.00653085 0.0209084 1 0 1 1 0 0 +EDGE2 8583 904 0.980669 0.0390316 -0.00193074 1 0 1 1 0 0 +EDGE2 8583 3423 0.0381706 -0.0122052 0.00932339 1 0 1 1 0 0 +EDGE2 8583 8503 -0.0134599 -0.0979853 0.0115497 1 0 1 1 0 0 +EDGE2 8583 844 1.01671 -0.0282493 -0.011062 1 0 1 1 0 0 +EDGE2 8583 3443 -0.0436569 -0.107708 0.017361 1 0 1 1 0 0 +EDGE2 8583 863 0.0416901 0.0170745 -0.0237707 1 0 1 1 0 0 +EDGE2 8583 903 -0.0492543 -0.00645989 0.012137 1 0 1 1 0 0 +EDGE2 8583 1203 0.0667791 -0.0572618 -0.014994 1 0 1 1 0 0 +EDGE2 8583 843 -0.0809854 -0.000963378 -0.0201635 1 0 1 1 0 0 +EDGE2 8583 902 -0.980714 0.0208191 0.0184706 1 0 1 1 0 0 +EDGE2 8583 3422 -1.03852 0.0207149 -0.00573122 1 0 1 1 0 0 +EDGE2 8583 3442 -1.00796 -0.0473562 -0.0268087 1 0 1 1 0 0 +EDGE2 8583 8502 -1.03824 -0.0247895 -0.0019836 1 0 1 1 0 0 +EDGE2 8583 1202 -1.01271 -0.0274461 -0.00712998 1 0 1 1 0 0 +EDGE2 8583 842 -1.02677 -0.0235811 0.014521 1 0 1 1 0 0 +EDGE2 8583 862 -0.985773 -0.0921655 -0.00726552 1 0 1 1 0 0 +EDGE2 8584 8505 0.95064 0.0665003 0.0262906 1 0 1 1 0 0 +EDGE2 8584 865 1.05659 -0.0344544 0.0234379 1 0 1 1 0 0 +EDGE2 8584 3225 0.986736 0.00593604 -3.11716 1 0 1 1 0 0 +EDGE2 8584 3425 0.928243 0.0870495 0.00707135 1 0 1 1 0 0 +EDGE2 8584 3445 0.941995 0.00458319 0.0293703 1 0 1 1 0 0 +EDGE2 8584 3465 0.971887 0.000942245 -3.13139 1 0 1 1 0 0 +EDGE2 8584 3365 1.00237 -0.0327046 -3.15545 1 0 1 1 0 0 +EDGE2 8584 1205 0.947135 -0.0863499 -0.0348979 1 0 1 1 0 0 +EDGE2 8584 3205 0.965745 0.00458541 -3.12687 1 0 1 1 0 0 +EDGE2 8584 905 1.01285 0.122691 0.0217155 1 0 1 1 0 0 +EDGE2 8584 864 -0.0288508 -0.0223898 -0.00240337 1 0 1 1 0 0 +EDGE2 8584 8504 0.0638962 0.0203514 0.0012751 1 0 1 1 0 0 +EDGE2 8584 705 1.05117 0.0380599 -3.1194 1 0 1 1 0 0 +EDGE2 8584 825 1.0076 0.0202185 -3.16754 1 0 1 1 0 0 +EDGE2 8584 845 0.99757 0.0689726 0.00594471 1 0 1 1 0 0 +EDGE2 8584 1204 -0.0142785 0.101887 0.0234118 1 0 1 1 0 0 +EDGE2 8584 3424 0.0475354 0.0587693 -0.0182081 1 0 1 1 0 0 +EDGE2 8584 3444 -0.0683275 -0.0119862 0.00506182 1 0 1 1 0 0 +EDGE2 8584 904 -0.113942 0.0053066 -0.00356095 1 0 1 1 0 0 +EDGE2 8584 3423 -1.0413 -0.0284104 -0.0329492 1 0 1 1 0 0 +EDGE2 8584 8503 -1.0434 -0.0215549 0.0161493 1 0 1 1 0 0 +EDGE2 8584 8583 -1.09394 -0.00972753 -0.00265359 1 0 1 1 0 0 +EDGE2 8584 844 0.00419562 -0.0246039 -0.0264832 1 0 1 1 0 0 +EDGE2 8584 3443 -0.99315 0.0223076 0.0134668 1 0 1 1 0 0 +EDGE2 8584 863 -0.93036 -0.0284983 0.00819313 1 0 1 1 0 0 +EDGE2 8584 903 -0.955923 0.00122628 0.034063 1 0 1 1 0 0 +EDGE2 8584 1203 -0.961512 0.0455208 -0.00869461 1 0 1 1 0 0 +EDGE2 8584 843 -1.03597 -0.0747804 0.01599 1 0 1 1 0 0 +EDGE2 8585 3364 1.01125 -0.0102504 -3.15239 1 0 1 1 0 0 +EDGE2 8585 3464 1.05534 -0.042124 -3.11616 1 0 1 1 0 0 +EDGE2 8585 824 1.00382 -0.00787872 -3.11571 1 0 1 1 0 0 +EDGE2 8585 3204 0.977499 0.0134399 -3.11292 1 0 1 1 0 0 +EDGE2 8585 3224 1.00319 -0.0444561 -3.12621 1 0 1 1 0 0 +EDGE2 8585 704 1.06117 -0.0305637 -3.1451 1 0 1 1 0 0 +EDGE2 8585 8506 0.0597373 -1.02655 -1.55477 1 0 1 1 0 0 +EDGE2 8585 8505 -0.0252972 -0.0203255 0.026747 1 0 1 1 0 0 +EDGE2 8585 865 -0.077158 0.0800323 -0.0242719 1 0 1 1 0 0 +EDGE2 8585 3446 -0.0068447 0.903881 1.54528 1 0 1 1 0 0 +EDGE2 8585 3225 0.0824635 0.0861401 -3.17852 1 0 1 1 0 0 +EDGE2 8585 826 0.0577188 0.896569 1.57731 1 0 1 1 0 0 +EDGE2 8585 866 0.0896444 0.987772 1.54407 1 0 1 1 0 0 +EDGE2 8585 906 0.0394539 1.01681 1.57798 1 0 1 1 0 0 +EDGE2 8585 3426 0.137246 0.988361 1.58856 1 0 1 1 0 0 +EDGE2 8585 846 0.0973101 0.98941 1.57991 1 0 1 1 0 0 +EDGE2 8585 3425 -0.0296946 -0.0883684 -0.00964052 1 0 1 1 0 0 +EDGE2 8585 3445 -0.0308553 0.023834 -0.0140378 1 0 1 1 0 0 +EDGE2 8585 3465 0.016865 -0.0034753 -3.10786 1 0 1 1 0 0 +EDGE2 8585 3365 0.0566891 0.029095 -3.1415 1 0 1 1 0 0 +EDGE2 8585 1205 0.0214911 0.00784549 0.0218403 1 0 1 1 0 0 +EDGE2 8585 3205 0.0438898 0.0215477 -3.10643 1 0 1 1 0 0 +EDGE2 8585 905 0.0498386 0.000823568 -0.0117696 1 0 1 1 0 0 +EDGE2 8585 864 -1.05351 -0.059348 -0.0435381 1 0 1 1 0 0 +EDGE2 8585 8504 -0.942861 0.0457675 -0.0188414 1 0 1 1 0 0 +EDGE2 8585 705 0.0286464 0.0173959 -3.1578 1 0 1 1 0 0 +EDGE2 8585 825 0.117607 0.0535318 -3.13897 1 0 1 1 0 0 +EDGE2 8585 845 0.0666997 -0.0858093 -0.0242756 1 0 1 1 0 0 +EDGE2 8585 8584 -1.02412 0.0241737 -0.00967382 1 0 1 1 0 0 +EDGE2 8585 1204 -0.97056 -0.0833829 0.00143108 1 0 1 1 0 0 +EDGE2 8585 3424 -1.01271 -0.0720683 0.00772423 1 0 1 1 0 0 +EDGE2 8585 3444 -0.978223 -0.00202903 0.0084492 1 0 1 1 0 0 +EDGE2 8585 904 -1.00368 0.0551704 0.012649 1 0 1 1 0 0 +EDGE2 8585 844 -1.05167 -0.0721294 -0.00806628 1 0 1 1 0 0 +EDGE2 8585 1206 0.02466 -1.01991 -1.55316 1 0 1 1 0 0 +EDGE2 8585 3226 0.0323145 -0.985376 -1.5478 1 0 1 1 0 0 +EDGE2 8585 3366 -0.0209749 -1.03071 -1.54912 1 0 1 1 0 0 +EDGE2 8585 3466 -0.021723 -0.911507 -1.58191 1 0 1 1 0 0 +EDGE2 8585 3206 -0.0666679 -1.00289 -1.57305 1 0 1 1 0 0 +EDGE2 8585 706 0.0435734 -0.945719 -1.55905 1 0 1 1 0 0 +EDGE2 8586 8585 -1.03451 0.0226424 -1.61639 1 0 1 1 0 0 +EDGE2 8586 8505 -0.922407 -0.066543 -1.5934 1 0 1 1 0 0 +EDGE2 8586 865 -1.03865 -0.0499047 -1.58201 1 0 1 1 0 0 +EDGE2 8586 3446 0.0871598 -0.0680907 0.00318812 1 0 1 1 0 0 +EDGE2 8586 3427 0.9971 0.0476486 0.0301987 1 0 1 1 0 0 +EDGE2 8586 3447 1.07071 -0.121675 0.011721 1 0 1 1 0 0 +EDGE2 8586 847 1.04758 -0.0714444 -0.0184127 1 0 1 1 0 0 +EDGE2 8586 867 0.986795 0.0095277 0.0220945 1 0 1 1 0 0 +EDGE2 8586 907 1.08818 -0.0151102 0.0250452 1 0 1 1 0 0 +EDGE2 8586 827 1.0345 -0.0259324 0.0102671 1 0 1 1 0 0 +EDGE2 8586 3225 -0.990448 -0.0557106 1.54953 1 0 1 1 0 0 +EDGE2 8586 826 0.0214537 -0.0462575 0.00348505 1 0 1 1 0 0 +EDGE2 8586 866 -0.00732531 -0.00379107 0.0219775 1 0 1 1 0 0 +EDGE2 8586 906 0.000531047 0.0740906 0.0464519 1 0 1 1 0 0 +EDGE2 8586 3426 0.0974696 0.0533631 -0.0348448 1 0 1 1 0 0 +EDGE2 8586 846 0.0403065 0.0210438 -0.0215692 1 0 1 1 0 0 +EDGE2 8586 3425 -0.929219 -0.0422608 -1.54895 1 0 1 1 0 0 +EDGE2 8586 3445 -0.962725 0.0336716 -1.58011 1 0 1 1 0 0 +EDGE2 8586 3465 -0.949373 -0.0852055 1.56199 1 0 1 1 0 0 +EDGE2 8586 3365 -1.03097 -0.0301648 1.55831 1 0 1 1 0 0 +EDGE2 8586 1205 -1.03253 -0.000930108 -1.5819 1 0 1 1 0 0 +EDGE2 8586 3205 -1.00284 -0.035793 1.57897 1 0 1 1 0 0 +EDGE2 8586 905 -0.943819 -0.0116761 -1.56868 1 0 1 1 0 0 +EDGE2 8586 705 -1.02864 -0.0530764 1.57667 1 0 1 1 0 0 +EDGE2 8586 825 -1.00658 -0.0361006 1.56684 1 0 1 1 0 0 +EDGE2 8586 845 -0.91042 -0.0126693 -1.54865 1 0 1 1 0 0 +EDGE2 8587 8586 -1.00967 0.0815568 -0.0088587 1 0 1 1 0 0 +EDGE2 8587 908 0.942283 0.00675747 -0.0306118 1 0 1 1 0 0 +EDGE2 8587 3448 0.955037 -0.0194051 -0.0327066 1 0 1 1 0 0 +EDGE2 8587 3428 0.982612 -0.0162442 0.0060037 1 0 1 1 0 0 +EDGE2 8587 3446 -0.975197 0.0678468 -0.0122772 1 0 1 1 0 0 +EDGE2 8587 3427 0.0350305 -0.00801295 0.00243384 1 0 1 1 0 0 +EDGE2 8587 828 0.942449 -0.0734858 0.00551657 1 0 1 1 0 0 +EDGE2 8587 848 0.962839 0.0401529 0.00827271 1 0 1 1 0 0 +EDGE2 8587 868 0.926758 0.0662003 0.00813438 1 0 1 1 0 0 +EDGE2 8587 3447 -0.0120572 0.0680521 -0.00458561 1 0 1 1 0 0 +EDGE2 8587 847 0.0237246 -0.102739 0.0107229 1 0 1 1 0 0 +EDGE2 8587 867 0.00667901 -0.0584045 0.0117845 1 0 1 1 0 0 +EDGE2 8587 907 0.0047225 -0.0268333 -0.00402278 1 0 1 1 0 0 +EDGE2 8587 827 -0.0457427 -0.0142464 -0.0194013 1 0 1 1 0 0 +EDGE2 8587 826 -0.933315 0.0335149 -0.00939276 1 0 1 1 0 0 +EDGE2 8587 866 -0.990413 0.0224677 -0.0277761 1 0 1 1 0 0 +EDGE2 8587 906 -1.02503 0.0548104 -0.0327976 1 0 1 1 0 0 +EDGE2 8587 3426 -0.939387 -0.0272476 -0.00537962 1 0 1 1 0 0 +EDGE2 8587 846 -1.00365 0.0170797 -0.0268206 1 0 1 1 0 0 +EDGE2 8588 8587 -0.995935 -0.0556471 0.0496873 1 0 1 1 0 0 +EDGE2 8588 908 0.0153575 0.0196575 -0.0299352 1 0 1 1 0 0 +EDGE2 8588 869 1.04462 0.0519392 -0.024845 1 0 1 1 0 0 +EDGE2 8588 3429 1.0237 -0.0318355 0.00401344 1 0 1 1 0 0 +EDGE2 8588 3449 0.898891 -0.0324701 -0.0128213 1 0 1 1 0 0 +EDGE2 8588 909 0.968692 0.0110417 0.00168546 1 0 1 1 0 0 +EDGE2 8588 3448 -0.015765 -0.0420756 0.0144429 1 0 1 1 0 0 +EDGE2 8588 829 1.00229 0.0157165 0.0165317 1 0 1 1 0 0 +EDGE2 8588 849 0.965592 0.0244475 0.00267436 1 0 1 1 0 0 +EDGE2 8588 3428 -0.0285186 0.112771 0.0016069 1 0 1 1 0 0 +EDGE2 8588 3427 -0.99625 -0.0576907 0.020881 1 0 1 1 0 0 +EDGE2 8588 828 0.0110903 -0.0538823 0.000317322 1 0 1 1 0 0 +EDGE2 8588 848 -0.0443182 0.0988413 -0.0254476 1 0 1 1 0 0 +EDGE2 8588 868 -0.0191907 0.0243521 -0.0350192 1 0 1 1 0 0 +EDGE2 8588 3447 -1.03479 -0.0427631 0.0116839 1 0 1 1 0 0 +EDGE2 8588 847 -1.08536 -0.0078966 0.00668404 1 0 1 1 0 0 +EDGE2 8588 867 -1.069 -0.034333 -0.0112512 1 0 1 1 0 0 +EDGE2 8588 907 -1.05687 0.0654805 0.00517791 1 0 1 1 0 0 +EDGE2 8588 827 -0.942431 -0.0217944 -0.00433492 1 0 1 1 0 0 +EDGE2 8589 5990 1.02427 0.0406171 -3.13166 1 0 1 1 0 0 +EDGE2 8589 5950 1.0166 -0.0716145 -3.11868 1 0 1 1 0 0 +EDGE2 8589 5970 1.04166 0.0492817 -3.12898 1 0 1 1 0 0 +EDGE2 8589 8588 -1.04554 -0.0669627 0.0342806 1 0 1 1 0 0 +EDGE2 8589 908 -1.03915 -0.0891778 -0.00141441 1 0 1 1 0 0 +EDGE2 8589 690 1.06757 -0.098729 -3.13216 1 0 1 1 0 0 +EDGE2 8589 910 1.011 0.0856704 0.000235916 1 0 1 1 0 0 +EDGE2 8589 3450 1.04654 -0.0951807 0.0125358 1 0 1 1 0 0 +EDGE2 8589 3430 1.0122 0.052465 -0.00763938 1 0 1 1 0 0 +EDGE2 8589 850 0.944649 0.0205424 0.0370965 1 0 1 1 0 0 +EDGE2 8589 870 0.938737 -0.0898591 -0.0127449 1 0 1 1 0 0 +EDGE2 8589 890 0.982084 -0.0505656 -3.1595 1 0 1 1 0 0 +EDGE2 8589 830 0.984169 0.00221136 -0.023714 1 0 1 1 0 0 +EDGE2 8589 869 -0.0734714 -0.0701531 0.0168647 1 0 1 1 0 0 +EDGE2 8589 3429 -0.0710827 -0.0189481 -0.0218512 1 0 1 1 0 0 +EDGE2 8589 3449 0.0479397 -0.0187987 -0.00837644 1 0 1 1 0 0 +EDGE2 8589 909 0.00527503 0.0527439 -0.0138703 1 0 1 1 0 0 +EDGE2 8589 3448 -0.994277 0.0475824 0.0152021 1 0 1 1 0 0 +EDGE2 8589 829 -0.0825488 -0.0706607 -0.0245587 1 0 1 1 0 0 +EDGE2 8589 849 0.0601716 -0.0325774 -0.0138498 1 0 1 1 0 0 +EDGE2 8589 3428 -1.02053 -0.00132447 -0.00931587 1 0 1 1 0 0 +EDGE2 8589 828 -1.0562 -0.0515699 -0.000973255 1 0 1 1 0 0 +EDGE2 8589 848 -1.06603 -0.0241935 0.0119918 1 0 1 1 0 0 +EDGE2 8589 868 -1.07021 0.0481972 0.0208219 1 0 1 1 0 0 +EDGE2 8590 5951 0.0366092 -1.04224 -1.58798 1 0 1 1 0 0 +EDGE2 8590 5969 0.975851 0.0307885 -3.14071 1 0 1 1 0 0 +EDGE2 8590 5989 0.917445 0.0476957 -3.11189 1 0 1 1 0 0 +EDGE2 8590 5949 0.910237 0.0172739 -3.1546 1 0 1 1 0 0 +EDGE2 8590 5991 -0.00792553 -1.09695 -1.58096 1 0 1 1 0 0 +EDGE2 8590 5971 0.019136 -1.03475 -1.56311 1 0 1 1 0 0 +EDGE2 8590 5990 0.0288584 -0.0100911 -3.14847 1 0 1 1 0 0 +EDGE2 8590 691 -0.01998 -1.06791 -1.55955 1 0 1 1 0 0 +EDGE2 8590 871 0.01213 -1.02981 -1.5859 1 0 1 1 0 0 +EDGE2 8590 3451 -7.34043e-05 -1.03017 -1.58724 1 0 1 1 0 0 +EDGE2 8590 8589 -0.954999 0.0201325 -0.0359613 1 0 1 1 0 0 +EDGE2 8590 5950 -0.0592549 -0.0364123 -3.15029 1 0 1 1 0 0 +EDGE2 8590 5970 0.0781234 0.000109144 -3.15159 1 0 1 1 0 0 +EDGE2 8590 690 0.0157565 0.00778389 -3.12195 1 0 1 1 0 0 +EDGE2 8590 910 0.0224895 0.0536685 -0.0272794 1 0 1 1 0 0 +EDGE2 8590 3450 0.112302 0.00761143 0.0165686 1 0 1 1 0 0 +EDGE2 8590 689 0.997419 -0.104479 -3.14836 1 0 1 1 0 0 +EDGE2 8590 889 1.01447 -0.0540854 -3.1309 1 0 1 1 0 0 +EDGE2 8590 3430 0.12067 -0.0817072 0.00113651 1 0 1 1 0 0 +EDGE2 8590 850 -0.0623319 0.0137835 0.00719275 1 0 1 1 0 0 +EDGE2 8590 870 0.0491291 -0.0342912 0.00355362 1 0 1 1 0 0 +EDGE2 8590 890 0.0378867 0.0442727 -3.16469 1 0 1 1 0 0 +EDGE2 8590 830 -0.0642901 0.0276017 -0.008762 1 0 1 1 0 0 +EDGE2 8590 851 0.00930024 1.02747 1.58556 1 0 1 1 0 0 +EDGE2 8590 911 -0.0104941 0.964557 1.55609 1 0 1 1 0 0 +EDGE2 8590 3431 0.0257533 1.02583 1.56087 1 0 1 1 0 0 +EDGE2 8590 891 0.0389746 1.03098 1.59515 1 0 1 1 0 0 +EDGE2 8590 831 -0.0795159 1.00019 1.58048 1 0 1 1 0 0 +EDGE2 8590 869 -1.09857 0.008781 -0.0159703 1 0 1 1 0 0 +EDGE2 8590 3429 -0.953577 0.0137918 -0.0193687 1 0 1 1 0 0 +EDGE2 8590 3449 -0.935968 -0.0844374 -0.00693459 1 0 1 1 0 0 +EDGE2 8590 909 -1.01173 -0.0535165 -0.00830757 1 0 1 1 0 0 +EDGE2 8590 829 -1.09091 0.0466642 0.00879501 1 0 1 1 0 0 +EDGE2 8590 849 -1.0233 -0.0609136 -0.032869 1 0 1 1 0 0 +EDGE2 8591 5990 -1.01398 0.0136881 1.53879 1 0 1 1 0 0 +EDGE2 8591 8590 -1.08025 -0.0278918 -1.54316 1 0 1 1 0 0 +EDGE2 8591 5950 -1.0078 0.0105714 1.56315 1 0 1 1 0 0 +EDGE2 8591 5970 -1.00316 -0.00633997 1.57034 1 0 1 1 0 0 +EDGE2 8591 690 -0.9467 0.0244661 1.52824 1 0 1 1 0 0 +EDGE2 8591 910 -0.972456 -0.00338812 -1.60191 1 0 1 1 0 0 +EDGE2 8591 3450 -0.979651 0.0464577 -1.56468 1 0 1 1 0 0 +EDGE2 8591 3430 -0.987611 0.0637419 -1.57938 1 0 1 1 0 0 +EDGE2 8591 850 -0.999754 -0.0803965 -1.60162 1 0 1 1 0 0 +EDGE2 8591 870 -1.00732 0.0294806 -1.55762 1 0 1 1 0 0 +EDGE2 8591 890 -1.01202 0.00178057 1.58754 1 0 1 1 0 0 +EDGE2 8591 830 -1.01045 -0.0426689 -1.56266 1 0 1 1 0 0 +EDGE2 8591 892 0.996028 -0.0608897 0.00575313 1 0 1 1 0 0 +EDGE2 8591 851 -0.00825748 0.0520212 0.00734871 1 0 1 1 0 0 +EDGE2 8591 911 0.00508116 0.0088337 0.00353706 1 0 1 1 0 0 +EDGE2 8591 3431 -0.031416 0.00886739 -0.0286634 1 0 1 1 0 0 +EDGE2 8591 891 0.040833 0.0111647 0.00819534 1 0 1 1 0 0 +EDGE2 8591 3432 1.0302 0.0249895 -0.00604994 1 0 1 1 0 0 +EDGE2 8591 831 0.0410281 0.0341696 -0.00043716 1 0 1 1 0 0 +EDGE2 8591 912 0.952987 -0.039487 -0.000713925 1 0 1 1 0 0 +EDGE2 8591 832 0.965542 0.0477926 0.00655082 1 0 1 1 0 0 +EDGE2 8591 852 0.972351 -0.00705069 0.0391355 1 0 1 1 0 0 +EDGE2 8592 892 0.130761 -0.0541609 -0.00663365 1 0 1 1 0 0 +EDGE2 8592 851 -0.999618 0.0959625 -0.0130793 1 0 1 1 0 0 +EDGE2 8592 911 -0.930289 -0.0444992 0.000867495 1 0 1 1 0 0 +EDGE2 8592 3431 -1.06327 -0.00875573 -0.0313195 1 0 1 1 0 0 +EDGE2 8592 8591 -0.956474 0.0102138 -0.0137297 1 0 1 1 0 0 +EDGE2 8592 891 -1.06325 -0.027742 -0.0183976 1 0 1 1 0 0 +EDGE2 8592 3432 0.0198715 0.02627 0.0173836 1 0 1 1 0 0 +EDGE2 8592 831 -1.00753 0.0196633 0.00105927 1 0 1 1 0 0 +EDGE2 8592 912 -0.00607951 -0.0408495 -0.00956011 1 0 1 1 0 0 +EDGE2 8592 913 1.01469 0.0401612 -0.0406138 1 0 1 1 0 0 +EDGE2 8592 832 -0.0238604 0.0111001 -0.0180563 1 0 1 1 0 0 +EDGE2 8592 852 0.0155269 -0.11305 0.00103452 1 0 1 1 0 0 +EDGE2 8592 3433 0.969941 -0.00410475 0.000410945 1 0 1 1 0 0 +EDGE2 8592 833 0.953003 0.0741795 -0.000562527 1 0 1 1 0 0 +EDGE2 8592 853 0.958412 0.0291955 0.000159638 1 0 1 1 0 0 +EDGE2 8592 893 1.02781 -0.0530667 0.00198526 1 0 1 1 0 0 +EDGE2 8593 3434 0.975664 -0.0181012 0.0070425 1 0 1 1 0 0 +EDGE2 8593 892 -1.09732 -0.053289 -0.0151723 1 0 1 1 0 0 +EDGE2 8593 3432 -0.968308 -0.0470342 0.0244051 1 0 1 1 0 0 +EDGE2 8593 8592 -1.0106 -0.0653252 -0.0275412 1 0 1 1 0 0 +EDGE2 8593 912 -0.988204 -0.0965079 0.0329633 1 0 1 1 0 0 +EDGE2 8593 913 -0.0766074 0.00590421 -0.00390251 1 0 1 1 0 0 +EDGE2 8593 832 -1.00162 0.0367833 0.00235231 1 0 1 1 0 0 +EDGE2 8593 852 -1.02345 -0.0733873 -0.00628049 1 0 1 1 0 0 +EDGE2 8593 3433 -0.0139632 0.00785963 -0.00783996 1 0 1 1 0 0 +EDGE2 8593 833 0.0641853 -0.0454201 -0.00818158 1 0 1 1 0 0 +EDGE2 8593 853 -0.0420544 -0.0390243 -0.0320001 1 0 1 1 0 0 +EDGE2 8593 893 -0.0419979 -0.00285137 -0.0403529 1 0 1 1 0 0 +EDGE2 8593 894 0.986883 -0.0294206 0.0114945 1 0 1 1 0 0 +EDGE2 8593 914 1.06226 -0.0359194 0.0236627 1 0 1 1 0 0 +EDGE2 8593 834 1.00832 -0.0525895 -0.00924292 1 0 1 1 0 0 +EDGE2 8593 854 0.979321 -0.00472478 0.00902401 1 0 1 1 0 0 +EDGE2 8594 3395 0.996735 -0.01487 -3.17962 1 0 1 1 0 0 +EDGE2 8594 3434 0.000167588 -0.0134454 0.00158693 1 0 1 1 0 0 +EDGE2 8594 913 -1.04394 0.0131313 0.0395704 1 0 1 1 0 0 +EDGE2 8594 8593 -1.01722 0.0546942 -0.0250064 1 0 1 1 0 0 +EDGE2 8594 3433 -0.926585 0.0162033 0.0185228 1 0 1 1 0 0 +EDGE2 8594 833 -1.04796 -0.0303979 -0.000444787 1 0 1 1 0 0 +EDGE2 8594 853 -0.938419 0.0428923 -0.0113515 1 0 1 1 0 0 +EDGE2 8594 893 -1.00176 -0.0124955 0.0158189 1 0 1 1 0 0 +EDGE2 8594 894 -0.0974603 -0.116381 -0.00348622 1 0 1 1 0 0 +EDGE2 8594 914 -0.0153391 -0.0172822 0.00419328 1 0 1 1 0 0 +EDGE2 8594 8435 1.0269 0.0238255 -3.14039 1 0 1 1 0 0 +EDGE2 8594 834 -0.0120136 -0.00350581 0.00279839 1 0 1 1 0 0 +EDGE2 8594 854 -0.0722644 -0.101782 0.000890816 1 0 1 1 0 0 +EDGE2 8594 3435 0.948693 0.0301533 0.0351734 1 0 1 1 0 0 +EDGE2 8594 5895 0.980254 -0.0777522 -3.13203 1 0 1 1 0 0 +EDGE2 8594 3415 1.00075 -0.0742548 -3.14962 1 0 1 1 0 0 +EDGE2 8594 855 1.00342 -0.063315 -0.000162893 1 0 1 1 0 0 +EDGE2 8594 895 0.929553 -0.0185325 -0.0144336 1 0 1 1 0 0 +EDGE2 8594 915 1.00717 -0.0168281 0.0234621 1 0 1 1 0 0 +EDGE2 8594 835 1.04899 0.0269094 -0.0265446 1 0 1 1 0 0 +EDGE2 8595 3395 -0.0448818 0.0153626 -3.14509 1 0 1 1 0 0 +EDGE2 8595 3396 0.0349622 -0.895739 -1.56168 1 0 1 1 0 0 +EDGE2 8595 5896 -0.0501067 -1.01334 -1.58026 1 0 1 1 0 0 +EDGE2 8595 8436 -0.0210885 -0.972119 -1.60085 1 0 1 1 0 0 +EDGE2 8595 916 -0.0130456 -1.00703 -1.55649 1 0 1 1 0 0 +EDGE2 8595 3434 -1.00928 0.0424677 0.0112674 1 0 1 1 0 0 +EDGE2 8595 8594 -0.921669 -0.00917784 0.0394485 1 0 1 1 0 0 +EDGE2 8595 894 -0.946395 0.0829533 -0.0204823 1 0 1 1 0 0 +EDGE2 8595 914 -0.993007 0.0580142 0.00934508 1 0 1 1 0 0 +EDGE2 8595 8435 -0.0153993 0.0886867 -3.16852 1 0 1 1 0 0 +EDGE2 8595 834 -1.04105 0.0227082 -0.00722525 1 0 1 1 0 0 +EDGE2 8595 854 -1.03397 0.00817387 -0.0115451 1 0 1 1 0 0 +EDGE2 8595 3435 -0.157738 0.0223567 -0.00410604 1 0 1 1 0 0 +EDGE2 8595 5895 -0.0340496 0.0980464 -3.1398 1 0 1 1 0 0 +EDGE2 8595 3415 -0.00428401 0.0137322 -3.11708 1 0 1 1 0 0 +EDGE2 8595 855 -0.0331297 0.0486395 -0.0171273 1 0 1 1 0 0 +EDGE2 8595 895 0.0169848 -0.027523 -0.0224163 1 0 1 1 0 0 +EDGE2 8595 915 -0.0140993 -0.0492046 0.00322135 1 0 1 1 0 0 +EDGE2 8595 835 -0.0322076 -0.0675266 -0.014883 1 0 1 1 0 0 +EDGE2 8595 3414 0.97852 0.0957642 -3.1108 1 0 1 1 0 0 +EDGE2 8595 5894 1.01341 -0.0875474 -3.13769 1 0 1 1 0 0 +EDGE2 8595 8434 1.05651 -0.0200211 -3.13429 1 0 1 1 0 0 +EDGE2 8595 3394 1.01792 0.00328723 -3.14877 1 0 1 1 0 0 +EDGE2 8595 3436 -0.102786 1.01532 1.55516 1 0 1 1 0 0 +EDGE2 8595 856 0.0469997 1.07654 1.57767 1 0 1 1 0 0 +EDGE2 8595 896 -0.031697 1.01356 1.57908 1 0 1 1 0 0 +EDGE2 8595 3416 -0.0921751 1.0292 1.57647 1 0 1 1 0 0 +EDGE2 8595 836 0.0994654 0.965523 1.57339 1 0 1 1 0 0 +EDGE2 8596 3395 -1.00299 0.0408906 -1.53699 1 0 1 1 0 0 +EDGE2 8596 8437 0.992219 -0.0120831 0.00917453 1 0 1 1 0 0 +EDGE2 8596 917 1.01344 0.0348309 0.00614558 1 0 1 1 0 0 +EDGE2 8596 3397 0.90094 0.0806176 -0.00139832 1 0 1 1 0 0 +EDGE2 8596 5897 0.974132 -0.0190167 0.0367195 1 0 1 1 0 0 +EDGE2 8596 3396 -0.0504632 -0.0277325 -0.036342 1 0 1 1 0 0 +EDGE2 8596 5896 -0.0061401 0.103605 -0.00702912 1 0 1 1 0 0 +EDGE2 8596 8436 0.0545496 -0.00800377 0.00941134 1 0 1 1 0 0 +EDGE2 8596 916 0.0115737 -0.0496783 0.0103531 1 0 1 1 0 0 +EDGE2 8596 8435 -1.02473 -0.00641881 -1.55778 1 0 1 1 0 0 +EDGE2 8596 8595 -1.08926 0.0734 1.55014 1 0 1 1 0 0 +EDGE2 8596 3435 -0.975666 0.0653303 1.54266 1 0 1 1 0 0 +EDGE2 8596 5895 -1.01412 -0.00611326 -1.58615 1 0 1 1 0 0 +EDGE2 8596 3415 -1.10607 0.0052081 -1.55301 1 0 1 1 0 0 +EDGE2 8596 855 -0.978831 0.0374433 1.57917 1 0 1 1 0 0 +EDGE2 8596 895 -0.919145 0.0533971 1.5761 1 0 1 1 0 0 +EDGE2 8596 915 -0.969875 0.0561765 1.56238 1 0 1 1 0 0 +EDGE2 8596 835 -1.02651 -0.0511749 1.56339 1 0 1 1 0 0 +EDGE2 8597 8438 0.896709 -0.0171701 0.0163208 1 0 1 1 0 0 +EDGE2 8597 918 1.01681 -0.0276393 0.0326623 1 0 1 1 0 0 +EDGE2 8597 3398 0.979649 0.0843351 -0.00831363 1 0 1 1 0 0 +EDGE2 8597 5898 1.03873 0.0140655 -0.00704568 1 0 1 1 0 0 +EDGE2 8597 8437 0.00857944 -0.0893859 -0.0188969 1 0 1 1 0 0 +EDGE2 8597 8596 -0.97902 0.0120473 0.0037059 1 0 1 1 0 0 +EDGE2 8597 917 -0.0388238 0.0258168 0.0229152 1 0 1 1 0 0 +EDGE2 8597 3397 -0.00127565 -0.0383383 -0.0110803 1 0 1 1 0 0 +EDGE2 8597 5897 0.0461566 0.00532147 -0.00208798 1 0 1 1 0 0 +EDGE2 8597 3396 -0.950911 0.0377701 -0.00624063 1 0 1 1 0 0 +EDGE2 8597 5896 -1.07047 -0.0483448 -0.0482087 1 0 1 1 0 0 +EDGE2 8597 8436 -0.939607 0.00643162 0.00429528 1 0 1 1 0 0 +EDGE2 8597 916 -1.03296 -0.0944963 0.0105438 1 0 1 1 0 0 +EDGE2 8598 8597 -0.945172 0.0227232 -0.000207757 1 0 1 1 0 0 +EDGE2 8598 5899 0.999403 -0.0287502 -0.0087552 1 0 1 1 0 0 +EDGE2 8598 8439 0.932331 -0.0386746 -0.0136164 1 0 1 1 0 0 +EDGE2 8598 8438 -0.0750378 0.0527681 -0.00707541 1 0 1 1 0 0 +EDGE2 8598 919 0.91443 0.0556999 -0.00452011 1 0 1 1 0 0 +EDGE2 8598 3399 0.934519 -0.0341606 -0.035037 1 0 1 1 0 0 +EDGE2 8598 918 0.0439534 -0.0218841 -0.000666214 1 0 1 1 0 0 +EDGE2 8598 3398 -0.0246663 -0.0108459 0.00278787 1 0 1 1 0 0 +EDGE2 8598 5898 0.013541 -0.00344677 0.0326471 1 0 1 1 0 0 +EDGE2 8598 8437 -0.925921 -0.0601155 -0.0113593 1 0 1 1 0 0 +EDGE2 8598 917 -1.01665 0.046805 0.0265101 1 0 1 1 0 0 +EDGE2 8598 3397 -0.96194 0.0691009 0.0154551 1 0 1 1 0 0 +EDGE2 8598 5897 -1.10194 -0.0156352 0.0201704 1 0 1 1 0 0 +EDGE2 8599 5900 0.98509 0.0342666 -0.0291293 1 0 1 1 0 0 +EDGE2 8599 8440 1.07136 0.0377408 0.029392 1 0 1 1 0 0 +EDGE2 8599 920 1.02687 0.0512125 0.0214333 1 0 1 1 0 0 +EDGE2 8599 3400 1.04938 0.0145448 0.0226846 1 0 1 1 0 0 +EDGE2 8599 680 0.985553 0.0527834 -3.12549 1 0 1 1 0 0 +EDGE2 8599 5899 -0.0809409 -0.118744 0.00521372 1 0 1 1 0 0 +EDGE2 8599 8439 -0.0181391 -0.0487762 0.000729139 1 0 1 1 0 0 +EDGE2 8599 8438 -1.05778 0.00589068 -0.0200951 1 0 1 1 0 0 +EDGE2 8599 919 -0.00281995 0.0400076 0.00495281 1 0 1 1 0 0 +EDGE2 8599 3399 -0.0535844 0.0249169 -0.00818835 1 0 1 1 0 0 +EDGE2 8599 8598 -0.96516 -0.0449132 -0.0479818 1 0 1 1 0 0 +EDGE2 8599 918 -0.987906 0.00514718 0.0380054 1 0 1 1 0 0 +EDGE2 8599 3398 -0.942858 0.0331147 0.004457 1 0 1 1 0 0 +EDGE2 8599 5898 -1.07858 -0.0011684 0.0229324 1 0 1 1 0 0 +EDGE2 8600 921 0.0256573 0.979985 1.5733 1 0 1 1 0 0 +EDGE2 8600 679 0.920003 0.0329287 -3.14499 1 0 1 1 0 0 +EDGE2 8600 681 0.012704 -1.12012 -1.58098 1 0 1 1 0 0 +EDGE2 8600 5901 -0.0237041 -0.959457 -1.56862 1 0 1 1 0 0 +EDGE2 8600 5900 0.0808251 -0.00235162 0.0189401 1 0 1 1 0 0 +EDGE2 8600 8440 0.0195978 0.043255 0.0022413 1 0 1 1 0 0 +EDGE2 8600 920 0.0784001 -0.024947 -0.000577032 1 0 1 1 0 0 +EDGE2 8600 3400 -0.0145637 0.0624632 0.0288109 1 0 1 1 0 0 +EDGE2 8600 680 0.0374055 0.0964581 -3.08444 1 0 1 1 0 0 +EDGE2 8600 8441 -0.0967527 0.979043 1.55336 1 0 1 1 0 0 +EDGE2 8600 3401 0.0356555 1.03311 1.5727 1 0 1 1 0 0 +EDGE2 8600 5899 -1.05645 0.0206722 -0.0145666 1 0 1 1 0 0 +EDGE2 8600 8439 -0.990849 -0.0428317 -0.00407527 1 0 1 1 0 0 +EDGE2 8600 8599 -1.02116 -0.0535425 0.00268385 1 0 1 1 0 0 +EDGE2 8600 919 -1.01559 0.0390209 -0.0038962 1 0 1 1 0 0 +EDGE2 8600 3399 -0.943299 0.00671004 -0.00647402 1 0 1 1 0 0 +EDGE2 8601 921 0.0588119 0.0256675 -0.0252705 1 0 1 1 0 0 +EDGE2 8601 5900 -1.00255 -0.0398945 -1.5739 1 0 1 1 0 0 +EDGE2 8601 8600 -1.03054 -0.0339093 -1.57969 1 0 1 1 0 0 +EDGE2 8601 8440 -1.03735 0.0129791 -1.56811 1 0 1 1 0 0 +EDGE2 8601 920 -1.01287 0.0274658 -1.55806 1 0 1 1 0 0 +EDGE2 8601 3400 -1.00025 0.0937684 -1.55044 1 0 1 1 0 0 +EDGE2 8601 680 -0.943671 -0.0471325 1.58596 1 0 1 1 0 0 +EDGE2 8601 8441 0.0294131 -0.0407288 0.0164219 1 0 1 1 0 0 +EDGE2 8601 3401 -0.0482844 0.0119343 -0.00362363 1 0 1 1 0 0 +EDGE2 8601 3402 0.957724 0.0832093 -0.0354503 1 0 1 1 0 0 +EDGE2 8601 8442 0.945223 0.00756315 0.0172772 1 0 1 1 0 0 +EDGE2 8601 922 0.954541 0.00569682 0.0413192 1 0 1 1 0 0 +EDGE2 8602 921 -1.00197 -0.0473455 -0.0159436 1 0 1 1 0 0 +EDGE2 8602 8441 -1.03127 -0.0872769 0.0334385 1 0 1 1 0 0 +EDGE2 8602 8601 -1.15236 0.0617278 0.0359251 1 0 1 1 0 0 +EDGE2 8602 3401 -1.01023 -0.101198 -0.0156934 1 0 1 1 0 0 +EDGE2 8602 3402 -0.00885615 0.0258213 -0.0126001 1 0 1 1 0 0 +EDGE2 8602 8442 0.0555519 -0.019043 0.0444553 1 0 1 1 0 0 +EDGE2 8602 922 -0.0423252 -0.00565503 -0.0100809 1 0 1 1 0 0 +EDGE2 8602 923 0.980725 -0.0349948 0.0843171 1 0 1 1 0 0 +EDGE2 8602 3403 0.992185 0.00616594 0.00917767 1 0 1 1 0 0 +EDGE2 8602 8443 1.07808 -0.00770883 -0.0135376 1 0 1 1 0 0 +EDGE2 8603 8444 0.977436 0.0110909 -0.0175305 1 0 1 1 0 0 +EDGE2 8603 3402 -0.985776 0.0537046 -0.0303443 1 0 1 1 0 0 +EDGE2 8603 8442 -0.978451 -0.0106762 -0.00186296 1 0 1 1 0 0 +EDGE2 8603 8602 -1.02628 0.0924632 0.0129064 1 0 1 1 0 0 +EDGE2 8603 922 -1.02101 -0.0214055 -0.00701558 1 0 1 1 0 0 +EDGE2 8603 923 -0.00503798 0.0707757 0.00473926 1 0 1 1 0 0 +EDGE2 8603 3403 0.0980945 -0.026581 -0.036487 1 0 1 1 0 0 +EDGE2 8603 8443 -0.0330668 -0.0265471 -0.0163201 1 0 1 1 0 0 +EDGE2 8603 924 0.994553 0.0267191 -0.00232653 1 0 1 1 0 0 +EDGE2 8603 3404 1.06933 -0.0578734 -0.00279577 1 0 1 1 0 0 +EDGE2 8604 8444 -0.0372689 0.0982281 -0.000731236 1 0 1 1 0 0 +EDGE2 8604 8603 -0.951867 0.0682229 0.00899754 1 0 1 1 0 0 +EDGE2 8604 923 -1.04257 0.0945535 0.0294453 1 0 1 1 0 0 +EDGE2 8604 3403 -1.03548 0.0319632 -0.0186841 1 0 1 1 0 0 +EDGE2 8604 8443 -1.05502 0.116644 0.0235262 1 0 1 1 0 0 +EDGE2 8604 8445 0.970371 -0.0504566 -0.0188435 1 0 1 1 0 0 +EDGE2 8604 924 0.0252521 -0.0574551 -0.000476866 1 0 1 1 0 0 +EDGE2 8604 3404 -0.0441646 -0.0839739 0.00381801 1 0 1 1 0 0 +EDGE2 8604 8465 1.00736 0.00727695 -3.1432 1 0 1 1 0 0 +EDGE2 8604 925 1.04381 -0.0589256 0.0184784 1 0 1 1 0 0 +EDGE2 8604 3405 0.965418 0.00639827 -0.0316913 1 0 1 1 0 0 +EDGE2 8605 8446 0.0158884 -1.03587 -1.54442 1 0 1 1 0 0 +EDGE2 8605 926 0.0102648 -0.944981 -1.57783 1 0 1 1 0 0 +EDGE2 8605 3406 0.0023123 0.983797 1.54178 1 0 1 1 0 0 +EDGE2 8605 8444 -1.00804 0.0468572 0.00275445 1 0 1 1 0 0 +EDGE2 8605 8604 -0.999968 0.0368041 -0.00149886 1 0 1 1 0 0 +EDGE2 8605 8445 0.049685 -0.0266296 -0.0153361 1 0 1 1 0 0 +EDGE2 8605 924 -1.03028 -0.000782863 0.0386025 1 0 1 1 0 0 +EDGE2 8605 3404 -1.0325 -0.0278204 0.012244 1 0 1 1 0 0 +EDGE2 8605 8465 -0.152311 -0.0715105 -3.1701 1 0 1 1 0 0 +EDGE2 8605 925 0.0211362 -0.025068 -0.0284388 1 0 1 1 0 0 +EDGE2 8605 3405 0.0163115 0.0247287 0.00764667 1 0 1 1 0 0 +EDGE2 8605 8466 -0.0428985 1.0163 1.5344 1 0 1 1 0 0 +EDGE2 8605 8464 1.02684 -0.0148299 -3.14389 1 0 1 1 0 0 +EDGE2 8606 3406 -0.0565871 0.10571 0.00638412 1 0 1 1 0 0 +EDGE2 8606 8445 -0.969119 0.00157449 -1.57694 1 0 1 1 0 0 +EDGE2 8606 8605 -0.990486 0.00147315 -1.55397 1 0 1 1 0 0 +EDGE2 8606 8465 -0.888014 0.00949554 1.57142 1 0 1 1 0 0 +EDGE2 8606 925 -0.942822 -0.0185914 -1.58821 1 0 1 1 0 0 +EDGE2 8606 3405 -0.997192 -0.0234998 -1.59729 1 0 1 1 0 0 +EDGE2 8606 8466 -0.0172155 -0.0770822 0.055137 1 0 1 1 0 0 +EDGE2 8606 3407 0.963166 -0.105305 -0.0308207 1 0 1 1 0 0 +EDGE2 8606 8467 0.972636 -0.0486908 -0.0230218 1 0 1 1 0 0 +EDGE2 8607 3406 -0.908173 0.0992088 0.0147072 1 0 1 1 0 0 +EDGE2 8607 8606 -0.937025 -0.000594197 -0.00201838 1 0 1 1 0 0 +EDGE2 8607 8466 -1.08277 -0.0386355 0.00660129 1 0 1 1 0 0 +EDGE2 8607 3408 0.959442 0.0290963 -0.00790547 1 0 1 1 0 0 +EDGE2 8607 3407 0.0577271 0.124644 8.93217e-06 1 0 1 1 0 0 +EDGE2 8607 8467 -0.0466306 0.0709383 0.0148988 1 0 1 1 0 0 +EDGE2 8607 8468 0.900097 0.00351652 0.0178161 1 0 1 1 0 0 +EDGE2 8608 8607 -1.04437 -0.0360401 -0.0457212 1 0 1 1 0 0 +EDGE2 8608 3408 0.0473203 0.0394105 -0.00421508 1 0 1 1 0 0 +EDGE2 8608 3407 -1.02501 -0.0224695 0.0180036 1 0 1 1 0 0 +EDGE2 8608 8467 -0.970048 0.051139 -0.0300485 1 0 1 1 0 0 +EDGE2 8608 8468 0.093239 -0.0119417 -0.0327109 1 0 1 1 0 0 +EDGE2 8608 8469 1.04417 0.0909635 0.0211668 1 0 1 1 0 0 +EDGE2 8608 3409 0.900104 -0.00783938 0.0252808 1 0 1 1 0 0 +EDGE2 8609 3408 -1.02117 0.101752 0.0127016 1 0 1 1 0 0 +EDGE2 8609 8608 -0.950699 0.0342377 -0.00617632 1 0 1 1 0 0 +EDGE2 8609 8468 -0.895367 -0.0369158 0.0149236 1 0 1 1 0 0 +EDGE2 8609 8469 0.0271185 -0.00490949 0.0255348 1 0 1 1 0 0 +EDGE2 8609 3409 -0.060779 0.0847465 -0.00687399 1 0 1 1 0 0 +EDGE2 8609 8370 0.959859 0.0271592 -3.12704 1 0 1 1 0 0 +EDGE2 8609 8470 1.05527 0.0314903 -0.0204517 1 0 1 1 0 0 +EDGE2 8609 8430 0.909493 -0.00877166 -3.15967 1 0 1 1 0 0 +EDGE2 8609 3070 0.992229 -0.028391 -3.15685 1 0 1 1 0 0 +EDGE2 8609 3390 1.04036 0.0427992 -3.11217 1 0 1 1 0 0 +EDGE2 8609 3410 1.00385 -0.0104098 -0.0273895 1 0 1 1 0 0 +EDGE2 8609 5890 1.06225 0.0308678 -3.12001 1 0 1 1 0 0 +EDGE2 8609 3150 1.02296 0.0373201 -3.124 1 0 1 1 0 0 +EDGE2 8610 8469 -0.995876 0.045819 -0.033584 1 0 1 1 0 0 +EDGE2 8610 8609 -0.968526 -0.020735 -0.0227357 1 0 1 1 0 0 +EDGE2 8610 3409 -0.988259 0.113488 -0.00315414 1 0 1 1 0 0 +EDGE2 8610 8370 0.0264877 0.0137168 -3.14138 1 0 1 1 0 0 +EDGE2 8610 3411 0.0130321 1.0359 1.5829 1 0 1 1 0 0 +EDGE2 8610 5891 0.0478553 0.953608 1.57437 1 0 1 1 0 0 +EDGE2 8610 8431 -0.0156827 0.949396 1.60885 1 0 1 1 0 0 +EDGE2 8610 3391 0.0148466 1.04719 1.54835 1 0 1 1 0 0 +EDGE2 8610 8470 -0.0182621 0.0234486 -0.0037074 1 0 1 1 0 0 +EDGE2 8610 8430 0.00217227 0.0151419 -3.1415 1 0 1 1 0 0 +EDGE2 8610 3070 -0.0773796 0.00207492 -3.1559 1 0 1 1 0 0 +EDGE2 8610 3390 0.010294 0.12957 -3.13553 1 0 1 1 0 0 +EDGE2 8610 3410 -0.000223914 0.10973 -0.0114576 1 0 1 1 0 0 +EDGE2 8610 5890 0.024152 -0.0323722 -3.15456 1 0 1 1 0 0 +EDGE2 8610 3150 -0.0881034 -0.0281026 -3.12863 1 0 1 1 0 0 +EDGE2 8610 5889 0.968699 -0.0967279 -3.11966 1 0 1 1 0 0 +EDGE2 8610 8429 1.01803 -0.0140372 -3.15147 1 0 1 1 0 0 +EDGE2 8610 8369 1.02724 -0.0914866 -3.14532 1 0 1 1 0 0 +EDGE2 8610 3149 0.973138 0.00458892 -3.1362 1 0 1 1 0 0 +EDGE2 8610 3389 0.990506 0.00322714 -3.16762 1 0 1 1 0 0 +EDGE2 8610 3069 1.08547 -0.0568144 -3.13639 1 0 1 1 0 0 +EDGE2 8610 3151 -0.0325781 -0.994623 -1.59176 1 0 1 1 0 0 +EDGE2 8610 8371 0.0638661 -0.999952 -1.60071 1 0 1 1 0 0 +EDGE2 8610 8471 0.0138538 -0.98373 -1.56527 1 0 1 1 0 0 +EDGE2 8610 3071 0.0323013 -1.013 -1.57153 1 0 1 1 0 0 +EDGE2 8611 8370 -1.01857 0.0319915 -1.56576 1 0 1 1 0 0 +EDGE2 8611 8470 -1.08926 0.0832418 1.55354 1 0 1 1 0 0 +EDGE2 8611 8610 -1.00652 -0.0292247 1.58875 1 0 1 1 0 0 +EDGE2 8611 8430 -1.04089 -0.0296356 -1.56886 1 0 1 1 0 0 +EDGE2 8611 3070 -0.881181 -0.032109 -1.57437 1 0 1 1 0 0 +EDGE2 8611 3390 -0.972601 -0.0179383 -1.57082 1 0 1 1 0 0 +EDGE2 8611 3410 -0.95432 -0.0301581 1.5687 1 0 1 1 0 0 +EDGE2 8611 5890 -0.965237 -0.0129623 -1.59167 1 0 1 1 0 0 +EDGE2 8611 3150 -1.01906 0.07287 -1.56608 1 0 1 1 0 0 +EDGE2 8611 3072 1.06616 0.161728 -0.00351737 1 0 1 1 0 0 +EDGE2 8611 3151 0.0632072 -0.0451872 0.00853052 1 0 1 1 0 0 +EDGE2 8611 8371 0.0341918 -0.00678242 0.0014237 1 0 1 1 0 0 +EDGE2 8611 8471 -0.0881218 -0.059776 -0.00014186 1 0 1 1 0 0 +EDGE2 8611 3071 -0.0127141 0.0532267 0.0217971 1 0 1 1 0 0 +EDGE2 8611 8372 1.01732 -0.00021984 0.00737922 1 0 1 1 0 0 +EDGE2 8611 8472 0.892172 0.0601286 0.0205378 1 0 1 1 0 0 +EDGE2 8611 3152 1.03463 -0.0502853 0.000158252 1 0 1 1 0 0 +EDGE2 8612 8611 -1.04092 0.0842418 -0.000917066 1 0 1 1 0 0 +EDGE2 8612 3072 -0.0478086 0.0760382 -0.0224804 1 0 1 1 0 0 +EDGE2 8612 3151 -1.00798 0.00627854 0.01222 1 0 1 1 0 0 +EDGE2 8612 8371 -1.01602 0.0539528 -0.0199192 1 0 1 1 0 0 +EDGE2 8612 8471 -1.01355 0.0467537 0.0255452 1 0 1 1 0 0 +EDGE2 8612 3071 -0.961641 -0.0220552 0.0242294 1 0 1 1 0 0 +EDGE2 8612 8372 0.00737357 0.0536157 0.0293822 1 0 1 1 0 0 +EDGE2 8612 8472 0.112346 0.0296004 0.00166839 1 0 1 1 0 0 +EDGE2 8612 3152 -0.0145402 0.02236 0.0511188 1 0 1 1 0 0 +EDGE2 8612 3153 1.08469 -0.0195216 -0.0101265 1 0 1 1 0 0 +EDGE2 8612 8473 1.01298 -0.108927 -0.0148194 1 0 1 1 0 0 +EDGE2 8612 8373 0.913349 -0.0502464 -0.0287657 1 0 1 1 0 0 +EDGE2 8612 3073 1.02385 0.136718 -0.0553739 1 0 1 1 0 0 +EDGE2 8613 8374 1.06113 0.0467976 0.0071371 1 0 1 1 0 0 +EDGE2 8613 3072 -1.0103 0.0252716 -0.0127692 1 0 1 1 0 0 +EDGE2 8613 8372 -1.00425 0.02688 -0.00576032 1 0 1 1 0 0 +EDGE2 8613 8472 -0.924722 0.0121596 0.00791079 1 0 1 1 0 0 +EDGE2 8613 8612 -1.05102 0.0124805 0.0130401 1 0 1 1 0 0 +EDGE2 8613 3152 -0.989299 -0.0450667 -0.0321853 1 0 1 1 0 0 +EDGE2 8613 3153 0.0286529 -0.0587663 -0.0234888 1 0 1 1 0 0 +EDGE2 8613 8473 -0.0593218 -0.0716708 0.0114017 1 0 1 1 0 0 +EDGE2 8613 8373 -0.0974012 -0.0248623 -0.0242248 1 0 1 1 0 0 +EDGE2 8613 3073 0.0255435 0.00297891 -0.00938286 1 0 1 1 0 0 +EDGE2 8613 8474 0.908008 -0.0351509 0.0177641 1 0 1 1 0 0 +EDGE2 8613 3074 0.955407 0.0243059 -0.0251169 1 0 1 1 0 0 +EDGE2 8613 3154 1.04171 -0.117266 -0.0217705 1 0 1 1 0 0 +EDGE2 8614 8374 0.0247652 0.0235957 0.0194901 1 0 1 1 0 0 +EDGE2 8614 3153 -0.973741 0.0378297 0.0130955 1 0 1 1 0 0 +EDGE2 8614 8473 -0.947313 0.0537989 0.034954 1 0 1 1 0 0 +EDGE2 8614 8613 -0.925664 0.0165414 -0.032018 1 0 1 1 0 0 +EDGE2 8614 8373 -1.00108 -0.0606784 0.0311743 1 0 1 1 0 0 +EDGE2 8614 3073 -0.933373 -0.0209483 0.00652232 1 0 1 1 0 0 +EDGE2 8614 8474 -0.0552701 0.0182519 0.0182191 1 0 1 1 0 0 +EDGE2 8614 1075 1.00473 -0.0060028 -3.12718 1 0 1 1 0 0 +EDGE2 8614 3074 0.0883355 0.0531579 -0.00537223 1 0 1 1 0 0 +EDGE2 8614 3154 0.0256759 -0.0867625 0.00436409 1 0 1 1 0 0 +EDGE2 8614 3155 1.03943 -0.032382 -0.000899133 1 0 1 1 0 0 +EDGE2 8614 8375 1.06652 -0.0111372 0.00239367 1 0 1 1 0 0 +EDGE2 8614 8475 1.00434 -0.000775922 -0.00923304 1 0 1 1 0 0 +EDGE2 8614 3075 0.968715 0.00237365 0.013877 1 0 1 1 0 0 +EDGE2 8614 995 0.963949 -0.0248579 -3.14288 1 0 1 1 0 0 +EDGE2 8614 1015 0.98082 0.00381867 -3.13423 1 0 1 1 0 0 +EDGE2 8614 1055 0.981183 -0.0228671 -3.12895 1 0 1 1 0 0 +EDGE2 8615 1016 0.0361141 -0.965796 -1.5526 1 0 1 1 0 0 +EDGE2 8615 1056 0.0439117 -0.923397 -1.56883 1 0 1 1 0 0 +EDGE2 8615 996 -0.0358146 -0.967535 -1.55751 1 0 1 1 0 0 +EDGE2 8615 8374 -1.03264 0.0019908 -0.0155136 1 0 1 1 0 0 +EDGE2 8615 8614 -0.962729 0.110952 0.0177652 1 0 1 1 0 0 +EDGE2 8615 8474 -1.00897 -0.0137821 -0.0375799 1 0 1 1 0 0 +EDGE2 8615 1075 -0.0390426 -0.0378829 -3.18253 1 0 1 1 0 0 +EDGE2 8615 3074 -0.988058 -0.0813935 0.00730329 1 0 1 1 0 0 +EDGE2 8615 3154 -0.897654 0.0113976 0.00905503 1 0 1 1 0 0 +EDGE2 8615 3155 -0.0194985 -0.0287961 0.000500446 1 0 1 1 0 0 +EDGE2 8615 8375 -0.000934588 0.0474772 0.0245027 1 0 1 1 0 0 +EDGE2 8615 8475 0.00863135 -0.030067 -0.0218884 1 0 1 1 0 0 +EDGE2 8615 3075 -0.023723 0.066593 -0.0452813 1 0 1 1 0 0 +EDGE2 8615 1074 1.06395 0.00817664 -3.1739 1 0 1 1 0 0 +EDGE2 8615 995 -0.00620975 -0.0326088 -3.16976 1 0 1 1 0 0 +EDGE2 8615 1015 -0.00509977 -0.0606233 -3.14687 1 0 1 1 0 0 +EDGE2 8615 1055 -0.0842923 0.000445939 -3.16733 1 0 1 1 0 0 +EDGE2 8615 1014 1.0255 -0.0373332 -3.1348 1 0 1 1 0 0 +EDGE2 8615 1054 1.05367 0.015909 -3.11074 1 0 1 1 0 0 +EDGE2 8615 994 1.07294 -0.0223713 -3.15028 1 0 1 1 0 0 +EDGE2 8615 3156 -0.013667 1.04421 1.56857 1 0 1 1 0 0 +EDGE2 8615 8476 -0.00436274 1.01918 1.56653 1 0 1 1 0 0 +EDGE2 8615 8376 0.03056 1.06474 1.56675 1 0 1 1 0 0 +EDGE2 8615 1076 0.121561 1.03632 1.56588 1 0 1 1 0 0 +EDGE2 8615 3076 -0.0291058 1.08618 1.53689 1 0 1 1 0 0 +EDGE2 8616 1075 -0.986042 -0.0337562 1.56279 1 0 1 1 0 0 +EDGE2 8616 8615 -0.963259 0.0202139 -1.56308 1 0 1 1 0 0 +EDGE2 8616 3155 -1.00658 0.0666347 -1.59548 1 0 1 1 0 0 +EDGE2 8616 8375 -0.944524 -0.0121787 -1.54594 1 0 1 1 0 0 +EDGE2 8616 8475 -0.939376 -0.00347369 -1.5364 1 0 1 1 0 0 +EDGE2 8616 3075 -1.01758 0.0527629 -1.54603 1 0 1 1 0 0 +EDGE2 8616 995 -1.01467 -0.0778384 1.57315 1 0 1 1 0 0 +EDGE2 8616 1015 -1.06252 -0.0451804 1.58309 1 0 1 1 0 0 +EDGE2 8616 1055 -0.963042 0.0354344 1.57367 1 0 1 1 0 0 +EDGE2 8616 8477 0.976416 0.0454998 0.00929761 1 0 1 1 0 0 +EDGE2 8616 3156 0.087713 -0.041354 0.0302604 1 0 1 1 0 0 +EDGE2 8616 8476 -0.0602916 -0.0542214 0.0026131 1 0 1 1 0 0 +EDGE2 8616 8376 0.0320451 -0.109024 -0.0146824 1 0 1 1 0 0 +EDGE2 8616 1076 -0.0266049 0.059879 0.0395434 1 0 1 1 0 0 +EDGE2 8616 3076 0.0130117 -0.0539819 -0.00181894 1 0 1 1 0 0 +EDGE2 8616 3077 1.0339 -0.0170491 0.0218465 1 0 1 1 0 0 +EDGE2 8616 3157 0.986596 0.0328383 -0.00633004 1 0 1 1 0 0 +EDGE2 8616 8377 1.09289 -0.0545397 0.00237321 1 0 1 1 0 0 +EDGE2 8616 1077 1.03191 0.00809018 -0.0104885 1 0 1 1 0 0 +EDGE2 8617 3078 1.01321 -0.0626724 -0.0419738 1 0 1 1 0 0 +EDGE2 8617 8477 -0.0927369 -0.101293 0.00171629 1 0 1 1 0 0 +EDGE2 8617 3156 -0.995189 -0.00977394 -0.0037757 1 0 1 1 0 0 +EDGE2 8617 8476 -0.966775 0.0470687 -0.00221908 1 0 1 1 0 0 +EDGE2 8617 8616 -0.94266 -0.122861 -0.0313693 1 0 1 1 0 0 +EDGE2 8617 8376 -0.958675 -0.0200785 0.0152714 1 0 1 1 0 0 +EDGE2 8617 1076 -1.00895 0.0349253 0.00215727 1 0 1 1 0 0 +EDGE2 8617 3076 -0.96107 -0.0517951 -0.013354 1 0 1 1 0 0 +EDGE2 8617 3077 0.0585315 0.0363395 0.025961 1 0 1 1 0 0 +EDGE2 8617 3157 0.0952032 -0.152933 -0.0107179 1 0 1 1 0 0 +EDGE2 8617 8377 0.0145006 -0.00470137 -0.0225992 1 0 1 1 0 0 +EDGE2 8617 1077 -0.115915 0.00303393 0.00699141 1 0 1 1 0 0 +EDGE2 8617 8378 1.00907 -0.019592 -0.035803 1 0 1 1 0 0 +EDGE2 8617 8478 0.974724 0.0787614 0.010008 1 0 1 1 0 0 +EDGE2 8617 3158 1.04794 -0.0196567 -0.00860796 1 0 1 1 0 0 +EDGE2 8617 1078 1.00322 -0.117524 -0.00305515 1 0 1 1 0 0 +EDGE2 8618 3078 -0.0388787 -0.00243526 0.0117692 1 0 1 1 0 0 +EDGE2 8618 8477 -1.0357 0.0820417 -0.00516055 1 0 1 1 0 0 +EDGE2 8618 8617 -1.13773 -0.0222605 0.0133194 1 0 1 1 0 0 +EDGE2 8618 3077 -0.990228 -0.0328824 -0.0110344 1 0 1 1 0 0 +EDGE2 8618 3157 -0.980571 -0.0218561 0.00729427 1 0 1 1 0 0 +EDGE2 8618 8377 -1.00502 -0.0125564 0.0270944 1 0 1 1 0 0 +EDGE2 8618 1077 -0.936832 -0.0520447 0.011504 1 0 1 1 0 0 +EDGE2 8618 8378 -0.0130946 0.0446002 -0.0149963 1 0 1 1 0 0 +EDGE2 8618 8478 -0.102267 0.0502402 -0.0226991 1 0 1 1 0 0 +EDGE2 8618 3158 0.0243609 0.00227071 0.0117991 1 0 1 1 0 0 +EDGE2 8618 8379 0.960961 -0.0443748 -0.012213 1 0 1 1 0 0 +EDGE2 8618 1078 0.0170629 0.000480051 -0.0175838 1 0 1 1 0 0 +EDGE2 8618 8479 0.921783 -0.00743041 0.000177785 1 0 1 1 0 0 +EDGE2 8618 3079 0.97481 -0.0193831 -0.0284641 1 0 1 1 0 0 +EDGE2 8618 3159 1.04541 0.0204067 0.00589725 1 0 1 1 0 0 +EDGE2 8618 1079 0.993006 -0.0890091 0.000163748 1 0 1 1 0 0 +EDGE2 8619 8360 1.0194 0.0124212 -3.18872 1 0 1 1 0 0 +EDGE2 8619 3078 -0.92393 0.0287453 0.00559149 1 0 1 1 0 0 +EDGE2 8619 8378 -1.01164 0.000366734 -0.0177954 1 0 1 1 0 0 +EDGE2 8619 8478 -1.08299 -0.00820416 -0.00158326 1 0 1 1 0 0 +EDGE2 8619 8618 -1.00618 -0.0341879 -0.0403613 1 0 1 1 0 0 +EDGE2 8619 3158 -1.00305 0.0505492 0.0172811 1 0 1 1 0 0 +EDGE2 8619 8379 0.0711896 0.107535 -0.0246504 1 0 1 1 0 0 +EDGE2 8619 1078 -1.00302 -0.0439649 0.0220734 1 0 1 1 0 0 +EDGE2 8619 8479 -0.0129644 0.0307801 0.00654602 1 0 1 1 0 0 +EDGE2 8619 3079 0.0590482 0.0112943 -0.0333217 1 0 1 1 0 0 +EDGE2 8619 3159 0.0438276 0.019845 -0.0104098 1 0 1 1 0 0 +EDGE2 8619 1079 -0.0195936 -0.0876945 0.0137117 1 0 1 1 0 0 +EDGE2 8619 8480 0.902856 0.0308569 0.0219751 1 0 1 1 0 0 +EDGE2 8619 8400 1.09991 0.0691436 -3.15493 1 0 1 1 0 0 +EDGE2 8619 8420 0.995328 0.00853467 -3.111 1 0 1 1 0 0 +EDGE2 8619 8380 0.864076 0.0456234 -0.0133125 1 0 1 1 0 0 +EDGE2 8619 3060 0.98288 0.0286848 -3.15451 1 0 1 1 0 0 +EDGE2 8619 3160 0.99901 -0.106087 0.0074713 1 0 1 1 0 0 +EDGE2 8619 5860 1.04135 0.044309 -3.13736 1 0 1 1 0 0 +EDGE2 8619 5880 1.02199 -0.00634135 -3.14835 1 0 1 1 0 0 +EDGE2 8619 3080 1.05837 -0.06359 -0.0118813 1 0 1 1 0 0 +EDGE2 8619 1080 1.01787 0.0615508 0.0304119 1 0 1 1 0 0 +EDGE2 8620 8360 0.0517235 -0.0398576 -3.13239 1 0 1 1 0 0 +EDGE2 8620 8379 -0.989228 -0.103128 0.0243239 1 0 1 1 0 0 +EDGE2 8620 8619 -0.983022 -0.0167376 -0.035282 1 0 1 1 0 0 +EDGE2 8620 8479 -0.979875 -0.125007 0.00558867 1 0 1 1 0 0 +EDGE2 8620 3079 -0.981519 0.0109648 -0.0128945 1 0 1 1 0 0 +EDGE2 8620 3159 -1.00338 -0.0473037 0.013338 1 0 1 1 0 0 +EDGE2 8620 1079 -1.04732 0.0269754 -0.0147305 1 0 1 1 0 0 +EDGE2 8620 8361 0.0349952 0.943879 1.56126 1 0 1 1 0 0 +EDGE2 8620 8421 -0.0399545 1.04814 1.58366 1 0 1 1 0 0 +EDGE2 8620 8481 0.0445638 1.03168 1.58269 1 0 1 1 0 0 +EDGE2 8620 8381 -0.124396 1.02621 1.57048 1 0 1 1 0 0 +EDGE2 8620 3081 0.00538682 0.949666 1.56866 1 0 1 1 0 0 +EDGE2 8620 3161 0.014775 0.939817 1.59477 1 0 1 1 0 0 +EDGE2 8620 5881 -0.0354254 0.923379 1.54715 1 0 1 1 0 0 +EDGE2 8620 3061 -0.0111561 0.974297 1.56163 1 0 1 1 0 0 +EDGE2 8620 8480 0.0522052 0.0294718 0.00523911 1 0 1 1 0 0 +EDGE2 8620 8400 0.0175252 -0.00916309 -3.15516 1 0 1 1 0 0 +EDGE2 8620 8420 0.0514936 -0.0428582 -3.1525 1 0 1 1 0 0 +EDGE2 8620 8380 0.0128294 -0.0649642 -0.0180333 1 0 1 1 0 0 +EDGE2 8620 8401 -0.0210074 -1.01427 -1.55499 1 0 1 1 0 0 +EDGE2 8620 3060 0.0909151 0.0551409 -3.16096 1 0 1 1 0 0 +EDGE2 8620 3160 0.0539935 0.0197569 0.00309941 1 0 1 1 0 0 +EDGE2 8620 5860 -0.00678271 0.0228625 -3.1048 1 0 1 1 0 0 +EDGE2 8620 5880 0.0289918 -0.015274 -3.12815 1 0 1 1 0 0 +EDGE2 8620 3080 0.0243226 -0.0165999 -0.038322 1 0 1 1 0 0 +EDGE2 8620 1080 -0.0542731 0.033815 0.00327534 1 0 1 1 0 0 +EDGE2 8620 1081 -0.0279573 -0.933075 -1.56726 1 0 1 1 0 0 +EDGE2 8620 5861 0.00808114 -1.05346 -1.5736 1 0 1 1 0 0 +EDGE2 8620 8399 0.981528 0.072824 -3.11488 1 0 1 1 0 0 +EDGE2 8620 8419 0.943572 -0.0265243 -3.12883 1 0 1 1 0 0 +EDGE2 8620 5859 0.946752 0.0358443 -3.15128 1 0 1 1 0 0 +EDGE2 8620 5879 1.01595 0.00873452 -3.15383 1 0 1 1 0 0 +EDGE2 8620 8359 0.932844 -0.0355655 -3.12436 1 0 1 1 0 0 +EDGE2 8620 3059 0.960192 -0.0453116 -3.18279 1 0 1 1 0 0 +EDGE2 8621 8360 -1.02919 -0.00842848 1.54265 1 0 1 1 0 0 +EDGE2 8621 8362 1.08109 -0.0349141 -0.00356878 1 0 1 1 0 0 +EDGE2 8621 8422 1.02479 0.0545869 -0.00296906 1 0 1 1 0 0 +EDGE2 8621 8482 0.939405 0.0339273 0.0255244 1 0 1 1 0 0 +EDGE2 8621 8382 1.06456 -0.0542661 0.0191988 1 0 1 1 0 0 +EDGE2 8621 3082 1.00037 -0.0106633 -0.0135482 1 0 1 1 0 0 +EDGE2 8621 3162 0.971482 0.0515975 0.0201616 1 0 1 1 0 0 +EDGE2 8621 5882 1.03087 0.0136283 -0.0112463 1 0 1 1 0 0 +EDGE2 8621 3062 1.04335 -0.00257851 -0.0312745 1 0 1 1 0 0 +EDGE2 8621 8361 -0.0125422 -0.0193824 -0.0178673 1 0 1 1 0 0 +EDGE2 8621 8421 -0.0470128 0.0340972 0.0255319 1 0 1 1 0 0 +EDGE2 8621 8481 -0.00441925 -0.0504547 0.00782811 1 0 1 1 0 0 +EDGE2 8621 8381 -0.0680625 0.00397242 -0.0153524 1 0 1 1 0 0 +EDGE2 8621 3081 0.0269896 0.0850637 0.00926132 1 0 1 1 0 0 +EDGE2 8621 3161 0.0615141 0.045926 -0.023263 1 0 1 1 0 0 +EDGE2 8621 5881 -0.00405834 -0.0272704 -0.00516935 1 0 1 1 0 0 +EDGE2 8621 3061 -0.0033387 0.0473253 -0.0153651 1 0 1 1 0 0 +EDGE2 8621 8480 -1.04825 -0.0315277 -1.5945 1 0 1 1 0 0 +EDGE2 8621 8620 -1.01918 -0.0318238 -1.56082 1 0 1 1 0 0 +EDGE2 8621 8400 -0.904634 -0.0321437 1.57659 1 0 1 1 0 0 +EDGE2 8621 8420 -0.957323 -0.0106374 1.57199 1 0 1 1 0 0 +EDGE2 8621 8380 -0.949381 -0.0431357 -1.58614 1 0 1 1 0 0 +EDGE2 8621 3060 -1.1088 0.0536234 1.60519 1 0 1 1 0 0 +EDGE2 8621 3160 -0.83431 0.0594136 -1.54029 1 0 1 1 0 0 +EDGE2 8621 5860 -1.04055 -0.00612166 1.57907 1 0 1 1 0 0 +EDGE2 8621 5880 -1.01677 0.0724088 1.57357 1 0 1 1 0 0 +EDGE2 8621 3080 -0.988472 -0.00308273 -1.60152 1 0 1 1 0 0 +EDGE2 8621 1080 -0.938863 -0.0198593 -1.5658 1 0 1 1 0 0 +EDGE2 8622 8363 1.02061 -0.00753055 -0.0344881 1 0 1 1 0 0 +EDGE2 8622 8423 1.04203 0.0284933 0.00452059 1 0 1 1 0 0 +EDGE2 8622 8483 0.991865 0.0120171 -0.0588864 1 0 1 1 0 0 +EDGE2 8622 8383 0.88869 -0.00703581 0.00945842 1 0 1 1 0 0 +EDGE2 8622 3083 1.01004 -0.0691104 0.000446456 1 0 1 1 0 0 +EDGE2 8622 3163 1.0292 -0.101771 -0.0100107 1 0 1 1 0 0 +EDGE2 8622 5883 0.984361 -0.00751618 -0.0104824 1 0 1 1 0 0 +EDGE2 8622 3063 0.90847 -0.0987287 -0.0062982 1 0 1 1 0 0 +EDGE2 8622 8362 0.0201376 -0.0320128 0.00510873 1 0 1 1 0 0 +EDGE2 8622 8422 -0.00914794 -0.0426594 -0.0136445 1 0 1 1 0 0 +EDGE2 8622 8482 -0.0172494 -0.0260081 -0.0146267 1 0 1 1 0 0 +EDGE2 8622 8382 0.0533151 0.0490673 -0.0230251 1 0 1 1 0 0 +EDGE2 8622 3082 0.0541095 -0.0149484 -0.0174195 1 0 1 1 0 0 +EDGE2 8622 3162 -0.0697766 -0.0231694 -0.0461809 1 0 1 1 0 0 +EDGE2 8622 5882 0.0538783 -0.0676412 -0.00854107 1 0 1 1 0 0 +EDGE2 8622 3062 0.056136 -0.0428776 0.0056326 1 0 1 1 0 0 +EDGE2 8622 8361 -0.993473 -0.0879244 0.015493 1 0 1 1 0 0 +EDGE2 8622 8421 -1.03765 0.0638358 -0.00912592 1 0 1 1 0 0 +EDGE2 8622 8481 -1.09355 0.0381809 0.0204287 1 0 1 1 0 0 +EDGE2 8622 8621 -0.971082 -0.00948919 -0.00880258 1 0 1 1 0 0 +EDGE2 8622 8381 -1.01041 0.00316615 0.010026 1 0 1 1 0 0 +EDGE2 8622 3081 -1.00266 0.0208556 0.0384126 1 0 1 1 0 0 +EDGE2 8622 3161 -1.06514 -0.0266891 0.0123939 1 0 1 1 0 0 +EDGE2 8622 5881 -1.06255 0.0556181 0.0456737 1 0 1 1 0 0 +EDGE2 8622 3061 -0.886445 -0.0740429 -0.00647562 1 0 1 1 0 0 +EDGE2 8623 3064 1.02222 0.0559398 -0.0103509 1 0 1 1 0 0 +EDGE2 8623 8384 1.04265 0.0328004 -0.00738023 1 0 1 1 0 0 +EDGE2 8623 8484 0.980905 -0.0425978 0.0148467 1 0 1 1 0 0 +EDGE2 8623 8424 1.03641 -0.0227512 -0.0171804 1 0 1 1 0 0 +EDGE2 8623 3164 1.04224 -0.0706026 0.0133181 1 0 1 1 0 0 +EDGE2 8623 5884 1.02796 0.000983184 -0.0311372 1 0 1 1 0 0 +EDGE2 8623 8364 0.951017 -0.0126635 0.00360611 1 0 1 1 0 0 +EDGE2 8623 3084 1.00525 -0.000564374 -0.000616038 1 0 1 1 0 0 +EDGE2 8623 8363 0.0530532 0.0408406 0.00442046 1 0 1 1 0 0 +EDGE2 8623 8423 0.0225106 -0.0262125 0.0147092 1 0 1 1 0 0 +EDGE2 8623 8483 0.0153725 -0.013687 -0.0314725 1 0 1 1 0 0 +EDGE2 8623 8383 -0.0239438 -0.0809421 0.0119807 1 0 1 1 0 0 +EDGE2 8623 3083 0.0611678 -0.0917636 -0.0074701 1 0 1 1 0 0 +EDGE2 8623 3163 -0.00100147 -0.0584342 -0.00312512 1 0 1 1 0 0 +EDGE2 8623 5883 0.0159257 -0.0727977 -0.0451724 1 0 1 1 0 0 +EDGE2 8623 3063 0.0213704 -0.0156063 -0.0073622 1 0 1 1 0 0 +EDGE2 8623 8362 -1.03367 0.00219538 -0.032983 1 0 1 1 0 0 +EDGE2 8623 8422 -1.04387 -0.00320521 0.0109448 1 0 1 1 0 0 +EDGE2 8623 8482 -1.02525 -0.0715422 0.00457943 1 0 1 1 0 0 +EDGE2 8623 8622 -1.13178 0.0865998 -0.0248914 1 0 1 1 0 0 +EDGE2 8623 8382 -0.962489 0.087445 0.00983289 1 0 1 1 0 0 +EDGE2 8623 3082 -0.991265 -0.0256926 -0.0015625 1 0 1 1 0 0 +EDGE2 8623 3162 -1.01258 -0.0547317 0.00263953 1 0 1 1 0 0 +EDGE2 8623 5882 -0.917199 0.0110297 -0.0246483 1 0 1 1 0 0 +EDGE2 8623 3062 -1.02569 -0.0481045 -0.00567358 1 0 1 1 0 0 +EDGE2 8624 8385 0.983224 0.0109352 0.00517517 1 0 1 1 0 0 +EDGE2 8624 8485 0.976628 -0.108039 0.00653843 1 0 1 1 0 0 +EDGE2 8624 8425 1.05085 0.0123431 -0.00279848 1 0 1 1 0 0 +EDGE2 8624 3105 1.09223 0.0432501 -3.13663 1 0 1 1 0 0 +EDGE2 8624 3485 1.00249 -0.00941563 -3.1329 1 0 1 1 0 0 +EDGE2 8624 5845 1.03424 -0.0343287 -3.13909 1 0 1 1 0 0 +EDGE2 8624 5885 1.101 0.0438089 0.0186114 1 0 1 1 0 0 +EDGE2 8624 8365 1.03992 -0.00823567 0.0238231 1 0 1 1 0 0 +EDGE2 8624 5825 1.04227 0.00715445 -3.17157 1 0 1 1 0 0 +EDGE2 8624 3145 1.22135 -0.0879678 -3.13581 1 0 1 1 0 0 +EDGE2 8624 3165 0.999968 -0.0173204 0.00470852 1 0 1 1 0 0 +EDGE2 8624 3385 1.00548 0.0229679 -3.13353 1 0 1 1 0 0 +EDGE2 8624 3125 1.03466 0.06724 -3.1458 1 0 1 1 0 0 +EDGE2 8624 1185 0.948075 -0.0627641 -3.12062 1 0 1 1 0 0 +EDGE2 8624 3065 0.994039 0.0919727 0.0171585 1 0 1 1 0 0 +EDGE2 8624 3085 1.06435 -0.0667844 0.00963671 1 0 1 1 0 0 +EDGE2 8624 1165 1.07867 -0.123384 -3.16414 1 0 1 1 0 0 +EDGE2 8624 3064 0.0810422 0.041899 -0.00143701 1 0 1 1 0 0 +EDGE2 8624 8384 -0.0183623 -0.012735 0.0083702 1 0 1 1 0 0 +EDGE2 8624 8484 -0.0220787 0.0677086 0.00373412 1 0 1 1 0 0 +EDGE2 8624 8424 0.0130549 0.00218929 0.0305964 1 0 1 1 0 0 +EDGE2 8624 3164 0.107228 -0.0648975 -0.0348328 1 0 1 1 0 0 +EDGE2 8624 5884 7.19662e-05 -0.0678049 -0.01435 1 0 1 1 0 0 +EDGE2 8624 8364 0.0151881 -0.0311115 -0.0292298 1 0 1 1 0 0 +EDGE2 8624 3084 -0.0626743 -0.0454624 -0.02964 1 0 1 1 0 0 +EDGE2 8624 8363 -1.0204 -0.0276981 0.0312645 1 0 1 1 0 0 +EDGE2 8624 8423 -1.04336 -0.0414291 0.016018 1 0 1 1 0 0 +EDGE2 8624 8483 -0.976429 -0.0355321 -0.0256754 1 0 1 1 0 0 +EDGE2 8624 8623 -1.0704 0.0275148 -0.0357873 1 0 1 1 0 0 +EDGE2 8624 8383 -0.94083 -0.0304695 0.0276885 1 0 1 1 0 0 +EDGE2 8624 3083 -0.884771 -0.0439194 -0.00914867 1 0 1 1 0 0 +EDGE2 8624 3163 -0.920766 0.0148661 0.0131493 1 0 1 1 0 0 +EDGE2 8624 5883 -0.986995 -0.0106497 -0.00430692 1 0 1 1 0 0 +EDGE2 8624 3063 -1.00437 -0.0270621 -0.0143628 1 0 1 1 0 0 +EDGE2 8625 8385 -0.0491411 0.0367396 -0.00869578 1 0 1 1 0 0 +EDGE2 8625 8366 -0.0213834 0.968151 1.57739 1 0 1 1 0 0 +EDGE2 8625 8426 -0.00397933 1.03524 1.58262 1 0 1 1 0 0 +EDGE2 8625 3146 0.0258948 0.983119 1.57955 1 0 1 1 0 0 +EDGE2 8625 3386 0.0194392 1.00284 1.58317 1 0 1 1 0 0 +EDGE2 8625 5886 0.0937867 1.01132 1.56704 1 0 1 1 0 0 +EDGE2 8625 3066 -0.0237333 1.01831 1.61137 1 0 1 1 0 0 +EDGE2 8625 3144 1.04893 0.0245751 -3.1178 1 0 1 1 0 0 +EDGE2 8625 3484 0.936152 -0.0571327 -3.13844 1 0 1 1 0 0 +EDGE2 8625 5824 0.931186 -0.104445 -3.13223 1 0 1 1 0 0 +EDGE2 8625 5844 1.00507 0.0386591 -3.12085 1 0 1 1 0 0 +EDGE2 8625 3384 1.03623 -0.0429332 -3.11 1 0 1 1 0 0 +EDGE2 8625 1184 1.1115 0.0054037 -3.14651 1 0 1 1 0 0 +EDGE2 8625 3104 1.05173 0.00819095 -3.11992 1 0 1 1 0 0 +EDGE2 8625 3124 0.973291 -0.00708489 -3.17215 1 0 1 1 0 0 +EDGE2 8625 1164 0.960549 0.0154337 -3.15116 1 0 1 1 0 0 +EDGE2 8625 8485 -0.0679138 0.102997 0.0173646 1 0 1 1 0 0 +EDGE2 8625 8425 -0.0318721 0.00865834 -0.00632155 1 0 1 1 0 0 +EDGE2 8625 3166 -0.12739 -0.976942 -1.56963 1 0 1 1 0 0 +EDGE2 8625 3105 -0.00518374 0.117261 -3.1493 1 0 1 1 0 0 +EDGE2 8625 3485 -0.0709058 0.0812583 -3.14599 1 0 1 1 0 0 +EDGE2 8625 5845 -0.0428118 0.0578355 -3.1558 1 0 1 1 0 0 +EDGE2 8625 5885 -0.012542 -0.0234529 0.0128624 1 0 1 1 0 0 +EDGE2 8625 8365 -0.039368 -0.048131 -0.0372359 1 0 1 1 0 0 +EDGE2 8625 5825 -0.0909516 -0.0395087 -3.12678 1 0 1 1 0 0 +EDGE2 8625 3145 0.0926874 0.0122781 -3.1459 1 0 1 1 0 0 +EDGE2 8625 3165 0.0292528 0.008527 -0.0114883 1 0 1 1 0 0 +EDGE2 8625 3385 0.0432813 -0.0309735 -3.17668 1 0 1 1 0 0 +EDGE2 8625 3125 -0.0547832 -0.0320626 -3.14449 1 0 1 1 0 0 +EDGE2 8625 8486 -0.00590479 -1.10013 -1.5487 1 0 1 1 0 0 +EDGE2 8625 1185 0.00643605 0.059329 -3.16653 1 0 1 1 0 0 +EDGE2 8625 3065 -0.0464494 -0.0643548 -0.000367216 1 0 1 1 0 0 +EDGE2 8625 3085 0.00747409 0.0071641 0.00309568 1 0 1 1 0 0 +EDGE2 8625 1165 -0.0259106 0.00177948 -3.14351 1 0 1 1 0 0 +EDGE2 8625 5826 -0.0105557 -1.00423 -1.57284 1 0 1 1 0 0 +EDGE2 8625 5846 -0.0781413 -0.922993 -1.5577 1 0 1 1 0 0 +EDGE2 8625 8386 0.0219037 -1.05966 -1.56528 1 0 1 1 0 0 +EDGE2 8625 3486 -0.00730542 -1.0252 -1.5738 1 0 1 1 0 0 +EDGE2 8625 1166 0.0357726 -1.04273 -1.57782 1 0 1 1 0 0 +EDGE2 8625 3086 0.102879 -0.950661 -1.59164 1 0 1 1 0 0 +EDGE2 8625 3106 -0.0132165 -0.959331 -1.58021 1 0 1 1 0 0 +EDGE2 8625 3126 -0.00300792 -1.05897 -1.56976 1 0 1 1 0 0 +EDGE2 8625 1186 -0.0410448 -1.00192 -1.60138 1 0 1 1 0 0 +EDGE2 8625 3064 -1.03598 -0.0276597 0.013492 1 0 1 1 0 0 +EDGE2 8625 8384 -1.01613 -0.0455667 -0.010469 1 0 1 1 0 0 +EDGE2 8625 8484 -0.996104 -0.045281 0.0130174 1 0 1 1 0 0 +EDGE2 8625 8624 -1.00519 0.0476884 0.02405 1 0 1 1 0 0 +EDGE2 8625 8424 -0.963434 0.0268515 0.0158497 1 0 1 1 0 0 +EDGE2 8625 3164 -0.976535 0.0380166 -0.0115473 1 0 1 1 0 0 +EDGE2 8625 5884 -0.928522 -0.0131173 -0.0346106 1 0 1 1 0 0 +EDGE2 8625 8364 -0.996607 0.0486311 0.00623416 1 0 1 1 0 0 +EDGE2 8625 3084 -1.08358 -0.00144825 0.000715801 1 0 1 1 0 0 +EDGE2 8626 8385 -0.995077 0.057315 -1.57568 1 0 1 1 0 0 +EDGE2 8626 8366 0.0124958 0.0219294 -0.012125 1 0 1 1 0 0 +EDGE2 8626 3147 0.889425 -0.025969 0.00995799 1 0 1 1 0 0 +EDGE2 8626 5887 1.01143 0.0134403 -0.00459973 1 0 1 1 0 0 +EDGE2 8626 8367 0.964469 0.0354734 0.00096089 1 0 1 1 0 0 +EDGE2 8626 8427 0.946705 -0.0304504 -0.0107832 1 0 1 1 0 0 +EDGE2 8626 3387 1.01355 -0.0981429 0.00477253 1 0 1 1 0 0 +EDGE2 8626 3067 1.17735 0.0191836 0.0179435 1 0 1 1 0 0 +EDGE2 8626 8426 0.00365166 -0.120823 0.00685243 1 0 1 1 0 0 +EDGE2 8626 3146 -0.040849 0.00819638 0.0390687 1 0 1 1 0 0 +EDGE2 8626 3386 -0.0211519 -0.0173366 0.014836 1 0 1 1 0 0 +EDGE2 8626 5886 -0.00428111 0.0403806 0.0413502 1 0 1 1 0 0 +EDGE2 8626 3066 -0.0654301 -0.0249299 0.0538196 1 0 1 1 0 0 +EDGE2 8626 8485 -1.00511 -0.0901746 -1.53984 1 0 1 1 0 0 +EDGE2 8626 8625 -1.04659 0.0129733 -1.5527 1 0 1 1 0 0 +EDGE2 8626 8425 -1.03556 -0.0222345 -1.55964 1 0 1 1 0 0 +EDGE2 8626 3105 -1.04392 -0.00686496 1.59201 1 0 1 1 0 0 +EDGE2 8626 3485 -1.09518 -0.0748555 1.55331 1 0 1 1 0 0 +EDGE2 8626 5845 -1.04635 -0.0427813 1.58769 1 0 1 1 0 0 +EDGE2 8626 5885 -0.980947 0.0132613 -1.61512 1 0 1 1 0 0 +EDGE2 8626 8365 -1.05299 -0.0390353 -1.54749 1 0 1 1 0 0 +EDGE2 8626 5825 -1.10355 0.18091 1.58668 1 0 1 1 0 0 +EDGE2 8626 3145 -0.958329 0.0395542 1.56144 1 0 1 1 0 0 +EDGE2 8626 3165 -1.05077 -0.0506511 -1.58948 1 0 1 1 0 0 +EDGE2 8626 3385 -0.946847 -0.0819166 1.57591 1 0 1 1 0 0 +EDGE2 8626 3125 -0.909245 -0.0179323 1.56956 1 0 1 1 0 0 +EDGE2 8626 1185 -0.986218 0.0177867 1.60094 1 0 1 1 0 0 +EDGE2 8626 3065 -0.995429 -0.0412991 -1.54009 1 0 1 1 0 0 +EDGE2 8626 3085 -1.10234 -0.0358353 -1.55419 1 0 1 1 0 0 +EDGE2 8626 1165 -1.08033 -0.0813855 1.53985 1 0 1 1 0 0 +EDGE2 8627 8366 -0.979483 0.0133778 0.0182882 1 0 1 1 0 0 +EDGE2 8627 5888 1.01473 -0.0676777 -0.000329026 1 0 1 1 0 0 +EDGE2 8627 8428 1.01894 0.0271939 -0.00376265 1 0 1 1 0 0 +EDGE2 8627 8368 1.08694 0.032879 -0.0116478 1 0 1 1 0 0 +EDGE2 8627 3068 0.973992 -0.0237065 0.00961314 1 0 1 1 0 0 +EDGE2 8627 3148 0.967046 -0.0353987 0.0103215 1 0 1 1 0 0 +EDGE2 8627 3388 1.01227 0.0855873 0.0205159 1 0 1 1 0 0 +EDGE2 8627 3147 -0.00415565 -0.066959 0.0242944 1 0 1 1 0 0 +EDGE2 8627 5887 0.0964242 0.0431502 -0.00551764 1 0 1 1 0 0 +EDGE2 8627 8367 -0.0481706 -0.0154817 -0.0392185 1 0 1 1 0 0 +EDGE2 8627 8427 -0.0940673 -0.0546838 -0.00409846 1 0 1 1 0 0 +EDGE2 8627 3387 -0.0161718 -0.00283018 0.0139655 1 0 1 1 0 0 +EDGE2 8627 8626 -0.927503 -0.0345048 0.0195463 1 0 1 1 0 0 +EDGE2 8627 3067 -0.0272753 -0.0185034 0.0457082 1 0 1 1 0 0 +EDGE2 8627 8426 -0.948521 0.0334974 -0.0184714 1 0 1 1 0 0 +EDGE2 8627 3146 -1.05866 -0.046623 0.0339767 1 0 1 1 0 0 +EDGE2 8627 3386 -0.980123 0.00925623 0.00545778 1 0 1 1 0 0 +EDGE2 8627 5886 -0.989291 0.093659 0.0136311 1 0 1 1 0 0 +EDGE2 8627 3066 -1.03725 -0.0490249 -0.0354289 1 0 1 1 0 0 +EDGE2 8628 5889 0.967136 0.060492 -0.0191323 1 0 1 1 0 0 +EDGE2 8628 8429 1.03201 -0.0408209 0.0175106 1 0 1 1 0 0 +EDGE2 8628 8369 0.921813 0.0743091 -0.00927377 1 0 1 1 0 0 +EDGE2 8628 3149 1.0331 -0.0448238 0.0114722 1 0 1 1 0 0 +EDGE2 8628 3389 0.972194 0.0843152 0.0139108 1 0 1 1 0 0 +EDGE2 8628 3069 0.967265 -0.0426103 -0.0233726 1 0 1 1 0 0 +EDGE2 8628 8627 -0.864402 -0.0142427 0.0566147 1 0 1 1 0 0 +EDGE2 8628 5888 -0.0204119 0.0262355 -0.0120002 1 0 1 1 0 0 +EDGE2 8628 8428 0.0301514 -0.0543725 -0.00275752 1 0 1 1 0 0 +EDGE2 8628 8368 0.0675736 -0.0298085 -0.03354 1 0 1 1 0 0 +EDGE2 8628 3068 -0.0972165 0.035661 0.0233141 1 0 1 1 0 0 +EDGE2 8628 3148 -0.0132541 -0.00995414 0.0340842 1 0 1 1 0 0 +EDGE2 8628 3388 0.00559914 -0.00220345 0.0283797 1 0 1 1 0 0 +EDGE2 8628 3147 -0.993713 0.146347 -0.00407999 1 0 1 1 0 0 +EDGE2 8628 5887 -1.05268 -0.0305421 0.00131828 1 0 1 1 0 0 +EDGE2 8628 8367 -0.995342 0.0849793 -0.0461181 1 0 1 1 0 0 +EDGE2 8628 8427 -0.90868 0.0629508 0.0182527 1 0 1 1 0 0 +EDGE2 8628 3387 -0.898056 0.00374038 0.0224904 1 0 1 1 0 0 +EDGE2 8628 3067 -1.05055 0.0215076 0.00900184 1 0 1 1 0 0 +EDGE2 8629 8370 0.937609 0.0695705 0.00713744 1 0 1 1 0 0 +EDGE2 8629 8470 0.924612 -0.0194708 -3.16131 1 0 1 1 0 0 +EDGE2 8629 8610 0.985349 -0.00277518 -3.17739 1 0 1 1 0 0 +EDGE2 8629 8430 0.97878 -0.0965429 -0.0255097 1 0 1 1 0 0 +EDGE2 8629 3070 1.07326 -0.0058991 0.0171917 1 0 1 1 0 0 +EDGE2 8629 3390 1.02061 0.0735762 0.0200041 1 0 1 1 0 0 +EDGE2 8629 3410 1.05278 0.0126749 -3.15744 1 0 1 1 0 0 +EDGE2 8629 5890 0.986985 0.052045 -0.0178855 1 0 1 1 0 0 +EDGE2 8629 3150 1.03124 -0.0535684 0.0150065 1 0 1 1 0 0 +EDGE2 8629 5889 0.0100474 -0.0291209 0.0236332 1 0 1 1 0 0 +EDGE2 8629 8429 -0.0378642 0.101894 -0.0237924 1 0 1 1 0 0 +EDGE2 8629 8369 -0.0136532 0.0193198 0.00439161 1 0 1 1 0 0 +EDGE2 8629 3149 0.118818 -0.0225393 -0.0052094 1 0 1 1 0 0 +EDGE2 8629 3389 0.00511947 0.0332527 -0.0141663 1 0 1 1 0 0 +EDGE2 8629 3069 0.0355801 0.0502994 0.0358348 1 0 1 1 0 0 +EDGE2 8629 5888 -0.998092 0.0382186 -0.0376133 1 0 1 1 0 0 +EDGE2 8629 8428 -0.982152 0.0385943 -0.0251119 1 0 1 1 0 0 +EDGE2 8629 8628 -0.939945 0.00175785 0.0329658 1 0 1 1 0 0 +EDGE2 8629 8368 -1.03551 0.00643816 -0.0109693 1 0 1 1 0 0 +EDGE2 8629 3068 -0.977137 0.014341 -0.0548322 1 0 1 1 0 0 +EDGE2 8629 3148 -0.958455 -0.00743618 -0.0150688 1 0 1 1 0 0 +EDGE2 8629 3388 -0.980499 -0.0325632 0.00616083 1 0 1 1 0 0 +EDGE2 8630 8469 0.93785 -0.0325641 -3.15139 1 0 1 1 0 0 +EDGE2 8630 8609 1.10472 0.0165093 -3.13215 1 0 1 1 0 0 +EDGE2 8630 3409 1.00514 0.0149027 -3.14683 1 0 1 1 0 0 +EDGE2 8630 8370 0.0347711 -0.0342941 -0.047027 1 0 1 1 0 0 +EDGE2 8630 3411 -0.00189386 -1.04549 -1.5637 1 0 1 1 0 0 +EDGE2 8630 5891 -0.0394539 -0.971513 -1.56349 1 0 1 1 0 0 +EDGE2 8630 8431 0.00381128 -0.921867 -1.55943 1 0 1 1 0 0 +EDGE2 8630 3391 -0.017319 -0.961041 -1.58771 1 0 1 1 0 0 +EDGE2 8630 8470 0.0728863 0.035075 -3.12632 1 0 1 1 0 0 +EDGE2 8630 8610 0.00720139 -0.0515316 -3.16361 1 0 1 1 0 0 +EDGE2 8630 8430 0.039594 0.0052371 -0.0495017 1 0 1 1 0 0 +EDGE2 8630 3070 -0.00987234 0.0213521 -0.0238286 1 0 1 1 0 0 +EDGE2 8630 3390 -0.108085 -0.0467458 0.0257965 1 0 1 1 0 0 +EDGE2 8630 3410 -0.0644202 -0.00886412 -3.18663 1 0 1 1 0 0 +EDGE2 8630 5890 -0.126716 0.00881494 -0.0219426 1 0 1 1 0 0 +EDGE2 8630 3150 -0.0279857 0.00702332 0.0151995 1 0 1 1 0 0 +EDGE2 8630 5889 -1.04213 0.0353711 -0.00327537 1 0 1 1 0 0 +EDGE2 8630 8429 -0.950532 -0.0388514 0.00739933 1 0 1 1 0 0 +EDGE2 8630 8629 -1.00619 0.0304947 0.00114525 1 0 1 1 0 0 +EDGE2 8630 8369 -1.02126 0.00669377 -0.019421 1 0 1 1 0 0 +EDGE2 8630 3149 -0.960008 0.0268891 -0.0102919 1 0 1 1 0 0 +EDGE2 8630 3389 -0.977559 -0.055726 -0.000830213 1 0 1 1 0 0 +EDGE2 8630 3069 -0.985836 -0.0797334 0.00958658 1 0 1 1 0 0 +EDGE2 8630 8611 0.00120246 0.988655 1.58179 1 0 1 1 0 0 +EDGE2 8630 3151 0.00388037 1.01582 1.59604 1 0 1 1 0 0 +EDGE2 8630 8371 -0.0797239 1.00746 1.59428 1 0 1 1 0 0 +EDGE2 8630 8471 -0.0413112 0.948799 1.56522 1 0 1 1 0 0 +EDGE2 8630 3071 -0.0666026 0.940285 1.52353 1 0 1 1 0 0 +EDGE2 8631 8370 -0.973477 0.0137009 -1.56773 1 0 1 1 0 0 +EDGE2 8631 8470 -1.02804 -0.000661462 1.59796 1 0 1 1 0 0 +EDGE2 8631 8610 -0.921408 0.0513643 1.55417 1 0 1 1 0 0 +EDGE2 8631 8630 -1.00069 -0.0192922 -1.54361 1 0 1 1 0 0 +EDGE2 8631 8430 -1.01387 -0.0594758 -1.59798 1 0 1 1 0 0 +EDGE2 8631 3070 -0.927147 -0.0038391 -1.59457 1 0 1 1 0 0 +EDGE2 8631 3390 -0.959703 -0.0999335 -1.54973 1 0 1 1 0 0 +EDGE2 8631 3410 -0.975836 0.0223147 1.5961 1 0 1 1 0 0 +EDGE2 8631 5890 -1.05112 -0.00814898 -1.59339 1 0 1 1 0 0 +EDGE2 8631 3150 -1.04939 0.0193938 -1.56396 1 0 1 1 0 0 +EDGE2 8631 8611 -0.0104126 0.0541093 -0.00138499 1 0 1 1 0 0 +EDGE2 8631 3072 0.93951 0.0663286 0.0061898 1 0 1 1 0 0 +EDGE2 8631 3151 0.0446214 0.00978229 -0.0103547 1 0 1 1 0 0 +EDGE2 8631 8371 -0.0983653 -0.0196911 0.00515849 1 0 1 1 0 0 +EDGE2 8631 8471 -0.164796 0.0953767 0.0344598 1 0 1 1 0 0 +EDGE2 8631 3071 0.118188 -0.0696157 -0.0126377 1 0 1 1 0 0 +EDGE2 8631 8372 1.05395 0.0741326 0.00867455 1 0 1 1 0 0 +EDGE2 8631 8472 0.997313 -0.0812555 -0.0178639 1 0 1 1 0 0 +EDGE2 8631 8612 1.06647 -0.0555172 0.00893331 1 0 1 1 0 0 +EDGE2 8631 3152 0.942174 -0.0378022 0.025064 1 0 1 1 0 0 +EDGE2 8632 8611 -1.01669 0.0285551 0.0139085 1 0 1 1 0 0 +EDGE2 8632 8631 -0.956206 0.0152758 -0.021737 1 0 1 1 0 0 +EDGE2 8632 3072 -0.0365678 0.0334084 -0.016059 1 0 1 1 0 0 +EDGE2 8632 3151 -1.0135 0.0206303 0.0164151 1 0 1 1 0 0 +EDGE2 8632 8371 -1.02726 0.105644 -0.0123671 1 0 1 1 0 0 +EDGE2 8632 8471 -1.02358 -0.0764919 -0.0111491 1 0 1 1 0 0 +EDGE2 8632 3071 -0.986188 0.0396676 3.49572e-05 1 0 1 1 0 0 +EDGE2 8632 8372 0.0578886 -0.0446397 -0.00365298 1 0 1 1 0 0 +EDGE2 8632 8472 -0.0357458 0.115822 0.00608878 1 0 1 1 0 0 +EDGE2 8632 8612 -0.0452006 -0.0157519 0.0326039 1 0 1 1 0 0 +EDGE2 8632 3152 0.0242631 -0.000347975 0.0194755 1 0 1 1 0 0 +EDGE2 8632 3153 1.00036 -0.0328545 0.00437556 1 0 1 1 0 0 +EDGE2 8632 8473 0.975295 -0.133837 -0.000608389 1 0 1 1 0 0 +EDGE2 8632 8613 1.04315 -0.0974791 0.0399631 1 0 1 1 0 0 +EDGE2 8632 8373 1.05015 -0.0219581 -0.0325492 1 0 1 1 0 0 +EDGE2 8632 3073 1.01269 0.0848079 -0.00473038 1 0 1 1 0 0 +EDGE2 8633 8374 1.08133 -0.0212818 0.000823478 1 0 1 1 0 0 +EDGE2 8633 3072 -0.988313 0.112756 -0.034345 1 0 1 1 0 0 +EDGE2 8633 8632 -1.03075 0.012873 -0.00606826 1 0 1 1 0 0 +EDGE2 8633 8372 -0.988077 0.0502904 -0.000433669 1 0 1 1 0 0 +EDGE2 8633 8472 -0.994782 -0.0830657 -0.0104441 1 0 1 1 0 0 +EDGE2 8633 8612 -1.05527 -0.000709513 -0.0153623 1 0 1 1 0 0 +EDGE2 8633 3152 -0.945274 -0.0686234 0.0151927 1 0 1 1 0 0 +EDGE2 8633 3153 -0.0217435 0.0172709 0.00996625 1 0 1 1 0 0 +EDGE2 8633 8473 0.0735851 -0.0269185 0.0346018 1 0 1 1 0 0 +EDGE2 8633 8613 0.00974509 0.00196901 -0.00560764 1 0 1 1 0 0 +EDGE2 8633 8373 -0.089376 0.0431797 0.00886605 1 0 1 1 0 0 +EDGE2 8633 8614 0.921354 -0.00365601 0.0034939 1 0 1 1 0 0 +EDGE2 8633 3073 0.0106689 -0.0336559 0.0124776 1 0 1 1 0 0 +EDGE2 8633 8474 1.03935 -0.0120982 0.0154049 1 0 1 1 0 0 +EDGE2 8633 3074 1.08688 0.107697 -0.00856523 1 0 1 1 0 0 +EDGE2 8633 3154 1.13395 -0.037359 -0.0417289 1 0 1 1 0 0 +EDGE2 8634 8374 -0.0548507 0.0888984 -0.0268626 1 0 1 1 0 0 +EDGE2 8634 3153 -1.07335 -0.050999 0.0080076 1 0 1 1 0 0 +EDGE2 8634 8473 -0.983714 0.0455831 -0.0370475 1 0 1 1 0 0 +EDGE2 8634 8613 -0.964864 -0.0284815 -0.0196938 1 0 1 1 0 0 +EDGE2 8634 8633 -1.00567 -0.0987754 -0.00619333 1 0 1 1 0 0 +EDGE2 8634 8373 -1.02409 -0.0424299 -0.0179084 1 0 1 1 0 0 +EDGE2 8634 8614 0.0215422 -0.0658156 -0.00544901 1 0 1 1 0 0 +EDGE2 8634 3073 -0.97334 -0.0280855 -0.015472 1 0 1 1 0 0 +EDGE2 8634 8474 0.0593017 0.0081886 0.0120239 1 0 1 1 0 0 +EDGE2 8634 1075 0.948008 -0.0274988 -3.14555 1 0 1 1 0 0 +EDGE2 8634 8615 0.995657 0.0767621 -0.00467231 1 0 1 1 0 0 +EDGE2 8634 3074 0.0535952 0.125092 -0.000716656 1 0 1 1 0 0 +EDGE2 8634 3154 -0.0963904 -0.0504829 -0.0147202 1 0 1 1 0 0 +EDGE2 8634 3155 0.975099 -0.0152643 -0.000829079 1 0 1 1 0 0 +EDGE2 8634 8375 1.0645 0.0229652 -0.0220964 1 0 1 1 0 0 +EDGE2 8634 8475 1.00281 -0.0825401 -0.0138308 1 0 1 1 0 0 +EDGE2 8634 3075 0.967419 0.0353147 -0.0329692 1 0 1 1 0 0 +EDGE2 8634 995 0.981641 0.0162006 -3.20028 1 0 1 1 0 0 +EDGE2 8634 1015 1.02168 0.0376926 -3.14196 1 0 1 1 0 0 +EDGE2 8634 1055 1.03019 -0.0322967 -3.16195 1 0 1 1 0 0 +EDGE2 8635 1016 0.0662251 -0.960874 -1.56278 1 0 1 1 0 0 +EDGE2 8635 1056 -0.023454 -1.04617 -1.55007 1 0 1 1 0 0 +EDGE2 8635 996 -0.00225529 -0.952024 -1.52438 1 0 1 1 0 0 +EDGE2 8635 8374 -0.957171 0.00630265 -0.0376233 1 0 1 1 0 0 +EDGE2 8635 8614 -0.964893 -0.0158643 -0.00960762 1 0 1 1 0 0 +EDGE2 8635 8634 -0.925415 0.0678733 -0.0352205 1 0 1 1 0 0 +EDGE2 8635 8474 -0.927218 -0.0595914 -0.00197932 1 0 1 1 0 0 +EDGE2 8635 1075 -0.0565213 -0.0253838 -3.1388 1 0 1 1 0 0 +EDGE2 8635 8615 0.0679723 -0.0011615 -0.0495506 1 0 1 1 0 0 +EDGE2 8635 3074 -0.982709 -0.0815158 0.0355867 1 0 1 1 0 0 +EDGE2 8635 3154 -0.940585 0.00116309 0.00706855 1 0 1 1 0 0 +EDGE2 8635 3155 0.136282 -0.0679182 -0.0105908 1 0 1 1 0 0 +EDGE2 8635 8375 0.00763126 -0.0612505 0.00118832 1 0 1 1 0 0 +EDGE2 8635 8475 -0.0234231 -0.0234792 -0.00846186 1 0 1 1 0 0 +EDGE2 8635 3075 -0.0215084 0.00673197 0.0119628 1 0 1 1 0 0 +EDGE2 8635 1074 1.09616 -0.0398897 -3.13222 1 0 1 1 0 0 +EDGE2 8635 995 -0.0680106 0.00623306 -3.10225 1 0 1 1 0 0 +EDGE2 8635 1015 0.0378841 -0.062453 -3.14219 1 0 1 1 0 0 +EDGE2 8635 1055 -0.0483093 0.0685157 -3.15639 1 0 1 1 0 0 +EDGE2 8635 1014 1.0347 0.0323165 -3.11784 1 0 1 1 0 0 +EDGE2 8635 1054 1.00415 -0.0195481 -3.16789 1 0 1 1 0 0 +EDGE2 8635 994 0.962105 0.0391411 -3.15396 1 0 1 1 0 0 +EDGE2 8635 3156 0.0216964 0.951136 1.58561 1 0 1 1 0 0 +EDGE2 8635 8476 -0.0314187 1.05324 1.58816 1 0 1 1 0 0 +EDGE2 8635 8616 -0.00580246 1.0504 1.55852 1 0 1 1 0 0 +EDGE2 8635 8376 -0.0617546 1.02077 1.60638 1 0 1 1 0 0 +EDGE2 8635 1076 0.0341812 1.0554 1.59935 1 0 1 1 0 0 +EDGE2 8635 3076 -0.0257172 0.972402 1.60739 1 0 1 1 0 0 +EDGE2 8636 997 1.0127 -0.0130399 0.0178519 1 0 1 1 0 0 +EDGE2 8636 1057 0.956582 -0.0166133 0.0058688 1 0 1 1 0 0 +EDGE2 8636 1017 0.974482 0.0058808 -0.0219149 1 0 1 1 0 0 +EDGE2 8636 1016 0.0998564 -0.0754843 -0.0126933 1 0 1 1 0 0 +EDGE2 8636 1056 -0.0605575 0.0712861 0.0218601 1 0 1 1 0 0 +EDGE2 8636 996 -0.0646424 -0.0143808 0.00176982 1 0 1 1 0 0 +EDGE2 8636 1075 -1.00278 -0.0226728 -1.56244 1 0 1 1 0 0 +EDGE2 8636 8615 -0.977504 -0.00301924 1.57721 1 0 1 1 0 0 +EDGE2 8636 8635 -0.92002 0.0172018 1.549 1 0 1 1 0 0 +EDGE2 8636 3155 -1.03259 0.0810636 1.60357 1 0 1 1 0 0 +EDGE2 8636 8375 -1.06077 -0.0121167 1.53571 1 0 1 1 0 0 +EDGE2 8636 8475 -1.00731 -0.0197602 1.57874 1 0 1 1 0 0 +EDGE2 8636 3075 -1.08487 0.00649215 1.54977 1 0 1 1 0 0 +EDGE2 8636 995 -0.972707 -0.00667377 -1.52217 1 0 1 1 0 0 +EDGE2 8636 1015 -1.01499 -0.01395 -1.57308 1 0 1 1 0 0 +EDGE2 8636 1055 -0.959439 0.0513357 -1.57962 1 0 1 1 0 0 +EDGE2 8637 998 1.00307 -0.0399632 0.012481 1 0 1 1 0 0 +EDGE2 8637 1018 0.990552 -0.0571277 0.0101664 1 0 1 1 0 0 +EDGE2 8637 1058 1.02784 -0.00307242 0.0235385 1 0 1 1 0 0 +EDGE2 8637 997 0.0152797 0.0717574 0.00611913 1 0 1 1 0 0 +EDGE2 8637 1057 -0.0482325 0.0561327 -0.0236627 1 0 1 1 0 0 +EDGE2 8637 1017 0.00239855 0.0326924 -0.00642051 1 0 1 1 0 0 +EDGE2 8637 1016 -0.909005 -0.0118009 0.0048718 1 0 1 1 0 0 +EDGE2 8637 1056 -1.05577 0.0371066 0.00183024 1 0 1 1 0 0 +EDGE2 8637 8636 -1.00888 -0.0293982 0.0067656 1 0 1 1 0 0 +EDGE2 8637 996 -1.03593 -0.0100117 0.0182232 1 0 1 1 0 0 +EDGE2 8638 8637 -1.01744 -0.0340301 0.00322239 1 0 1 1 0 0 +EDGE2 8638 1019 1.028 0.0326183 0.0247835 1 0 1 1 0 0 +EDGE2 8638 1059 0.977224 -0.0080031 -0.0122274 1 0 1 1 0 0 +EDGE2 8638 999 1.00032 0.0235604 0.0241703 1 0 1 1 0 0 +EDGE2 8638 998 0.00420296 -0.00246186 0.00311719 1 0 1 1 0 0 +EDGE2 8638 1018 0.0636927 -0.0867805 0.0319012 1 0 1 1 0 0 +EDGE2 8638 1058 -0.0437265 -0.0846544 0.0209951 1 0 1 1 0 0 +EDGE2 8638 997 -1.04438 -0.0136343 0.00392828 1 0 1 1 0 0 +EDGE2 8638 1057 -0.997395 0.0550544 0.0066463 1 0 1 1 0 0 +EDGE2 8638 1017 -0.965451 0.0548672 0.00152152 1 0 1 1 0 0 +EDGE2 8639 980 1.00547 0.0646226 -3.12879 1 0 1 1 0 0 +EDGE2 8639 1020 0.97368 0.0663287 -0.0122722 1 0 1 1 0 0 +EDGE2 8639 1060 0.949525 0.0253985 0.0228804 1 0 1 1 0 0 +EDGE2 8639 8460 0.951954 0.0535582 -3.13889 1 0 1 1 0 0 +EDGE2 8639 1000 0.967389 0.00597664 0.0122376 1 0 1 1 0 0 +EDGE2 8639 940 1.0352 -0.108239 -3.16931 1 0 1 1 0 0 +EDGE2 8639 8638 -1.08364 -0.064694 -0.0220607 1 0 1 1 0 0 +EDGE2 8639 1019 -0.0960061 -0.000820547 0.0160613 1 0 1 1 0 0 +EDGE2 8639 1059 0.0253295 -0.0670177 -0.0599007 1 0 1 1 0 0 +EDGE2 8639 999 -0.0458368 -0.0410501 -0.0234514 1 0 1 1 0 0 +EDGE2 8639 998 -0.990224 -0.0154816 0.0100794 1 0 1 1 0 0 +EDGE2 8639 1018 -1.01433 -0.0551052 -0.0181077 1 0 1 1 0 0 +EDGE2 8639 1058 -1.02346 0.0158022 -0.011161 1 0 1 1 0 0 +EDGE2 8640 979 0.99939 -0.0759134 -3.13807 1 0 1 1 0 0 +EDGE2 8640 8459 0.952256 0.0743173 -3.15789 1 0 1 1 0 0 +EDGE2 8640 939 0.947925 -0.113531 -3.11938 1 0 1 1 0 0 +EDGE2 8640 980 -0.0449995 0.00808751 -3.16123 1 0 1 1 0 0 +EDGE2 8640 8461 -0.00991974 -0.96963 -1.60455 1 0 1 1 0 0 +EDGE2 8640 1020 -0.00775078 0.0140935 -0.00710334 1 0 1 1 0 0 +EDGE2 8640 1060 0.0133988 0.0363757 -0.0179466 1 0 1 1 0 0 +EDGE2 8640 8460 0.0135577 0.015572 -3.14989 1 0 1 1 0 0 +EDGE2 8640 1000 0.066091 -0.056152 0.0167414 1 0 1 1 0 0 +EDGE2 8640 1001 -0.0382322 1.0315 1.61319 1 0 1 1 0 0 +EDGE2 8640 1061 0.0649735 1.04314 1.60872 1 0 1 1 0 0 +EDGE2 8640 940 0.02911 -0.000846997 -3.14942 1 0 1 1 0 0 +EDGE2 8640 1021 -0.0167139 1.05114 1.57055 1 0 1 1 0 0 +EDGE2 8640 941 -0.00104195 0.984567 1.59175 1 0 1 1 0 0 +EDGE2 8640 981 0.0439469 1.02871 1.5841 1 0 1 1 0 0 +EDGE2 8640 1019 -0.927988 -0.079529 0.00166053 1 0 1 1 0 0 +EDGE2 8640 1059 -1.03689 0.0435349 0.00475845 1 0 1 1 0 0 +EDGE2 8640 8639 -1.12416 0.0543218 -0.00789646 1 0 1 1 0 0 +EDGE2 8640 999 -0.959561 -0.064603 0.0044755 1 0 1 1 0 0 +EDGE2 8641 942 0.960366 0.000799948 0.00556291 1 0 1 1 0 0 +EDGE2 8641 1022 0.966097 -0.0382164 -0.000760271 1 0 1 1 0 0 +EDGE2 8641 980 -0.936314 -0.00256006 1.58615 1 0 1 1 0 0 +EDGE2 8641 8640 -1.06909 0.0521303 -1.578 1 0 1 1 0 0 +EDGE2 8641 1020 -1.0128 0.0283044 -1.59504 1 0 1 1 0 0 +EDGE2 8641 1060 -1.06947 0.0459101 -1.55542 1 0 1 1 0 0 +EDGE2 8641 8460 -0.905919 -0.0135852 1.54584 1 0 1 1 0 0 +EDGE2 8641 1000 -0.998329 0.0418658 -1.58335 1 0 1 1 0 0 +EDGE2 8641 1001 0.00645707 -0.0353553 0.00165529 1 0 1 1 0 0 +EDGE2 8641 1061 -0.0426168 -0.0163458 -0.0120445 1 0 1 1 0 0 +EDGE2 8641 940 -1.01033 -0.0234337 1.58729 1 0 1 1 0 0 +EDGE2 8641 1021 0.0498655 0.0474489 0.0126919 1 0 1 1 0 0 +EDGE2 8641 941 0.000665174 0.0364013 0.00695651 1 0 1 1 0 0 +EDGE2 8641 981 -0.0174153 -0.0291527 -0.0109027 1 0 1 1 0 0 +EDGE2 8641 1062 1.08531 -0.101165 -0.00947209 1 0 1 1 0 0 +EDGE2 8641 982 0.923441 0.00258334 -0.0342264 1 0 1 1 0 0 +EDGE2 8641 1002 1.06273 -0.0089642 0.00048691 1 0 1 1 0 0 +EDGE2 8642 942 -0.117503 -0.00919339 0.00116313 1 0 1 1 0 0 +EDGE2 8642 1022 0.00561576 -0.0309177 0.000619824 1 0 1 1 0 0 +EDGE2 8642 1001 -1.04933 -0.108102 0.00770362 1 0 1 1 0 0 +EDGE2 8642 1061 -0.977404 0.000794728 0.0128425 1 0 1 1 0 0 +EDGE2 8642 8641 -0.993313 0.00326377 0.0428302 1 0 1 1 0 0 +EDGE2 8642 1021 -0.948099 -0.00875375 0.0382358 1 0 1 1 0 0 +EDGE2 8642 941 -1.02761 -0.00778194 0.0455878 1 0 1 1 0 0 +EDGE2 8642 981 -0.90454 0.0232208 -0.0021821 1 0 1 1 0 0 +EDGE2 8642 1062 0.0612105 0.022218 -0.0169479 1 0 1 1 0 0 +EDGE2 8642 982 -0.0311824 0.0403967 0.0181 1 0 1 1 0 0 +EDGE2 8642 1002 -0.0489065 0.00343633 0.0329637 1 0 1 1 0 0 +EDGE2 8642 983 1.01507 0.0237812 -0.00832142 1 0 1 1 0 0 +EDGE2 8642 1023 1.05104 0.0231963 -0.0157184 1 0 1 1 0 0 +EDGE2 8642 1063 1.07271 0.0471243 0.0179557 1 0 1 1 0 0 +EDGE2 8642 1003 0.986361 -0.0510042 0.0225597 1 0 1 1 0 0 +EDGE2 8642 943 1.03876 -0.0141976 -0.021823 1 0 1 1 0 0 +EDGE2 8643 942 -0.99461 0.0426513 0.00303911 1 0 1 1 0 0 +EDGE2 8643 1022 -1.03121 -0.0653861 0.00526227 1 0 1 1 0 0 +EDGE2 8643 8642 -1.01875 -0.0817885 -0.0102181 1 0 1 1 0 0 +EDGE2 8643 1062 -0.979686 0.0274603 0.00191052 1 0 1 1 0 0 +EDGE2 8643 982 -1.02121 0.00509323 0.0289939 1 0 1 1 0 0 +EDGE2 8643 1002 -0.95232 0.0313451 0.0163895 1 0 1 1 0 0 +EDGE2 8643 1004 0.971516 0.0405285 -0.0422578 1 0 1 1 0 0 +EDGE2 8643 983 -0.0504903 -0.0781045 0.0368042 1 0 1 1 0 0 +EDGE2 8643 1023 -0.0558148 0.0488531 -0.00291571 1 0 1 1 0 0 +EDGE2 8643 1063 -0.0230949 -0.0257221 -0.0171922 1 0 1 1 0 0 +EDGE2 8643 1003 -0.00124933 -0.0382475 0.00891218 1 0 1 1 0 0 +EDGE2 8643 1064 0.932611 -0.0120448 0.00316018 1 0 1 1 0 0 +EDGE2 8643 943 0.0171564 -0.071958 0.00609487 1 0 1 1 0 0 +EDGE2 8643 1024 1.03682 -0.0398522 -0.0103314 1 0 1 1 0 0 +EDGE2 8643 944 1.01781 -0.0159491 -0.0331609 1 0 1 1 0 0 +EDGE2 8643 984 1.06198 -0.00913894 5.1889e-05 1 0 1 1 0 0 +EDGE2 8644 1004 -0.0923997 0.0940295 -0.0112413 1 0 1 1 0 0 +EDGE2 8644 983 -1.02335 -0.0684384 -0.0277923 1 0 1 1 0 0 +EDGE2 8644 1023 -1.01332 -0.002003 -0.0364391 1 0 1 1 0 0 +EDGE2 8644 1063 -0.996828 -0.045269 0.0028217 1 0 1 1 0 0 +EDGE2 8644 8643 -0.978079 -0.0268055 0.0293425 1 0 1 1 0 0 +EDGE2 8644 1003 -1.08348 0.030257 0.022866 1 0 1 1 0 0 +EDGE2 8644 1064 -0.00670324 -0.0861663 -0.00765348 1 0 1 1 0 0 +EDGE2 8644 943 -1.00283 0.0210667 -0.0079418 1 0 1 1 0 0 +EDGE2 8644 1024 -0.0624356 -0.110824 0.0198336 1 0 1 1 0 0 +EDGE2 8644 1025 1.05215 -0.0289753 -0.0292866 1 0 1 1 0 0 +EDGE2 8644 944 -0.00131281 -0.00774058 -0.0148446 1 0 1 1 0 0 +EDGE2 8644 984 -0.00303274 -0.0728298 -0.0231616 1 0 1 1 0 0 +EDGE2 8644 1065 1.00091 0.00593664 0.0117867 1 0 1 1 0 0 +EDGE2 8644 945 0.930762 0.00671343 0.00479279 1 0 1 1 0 0 +EDGE2 8644 985 1.04438 -0.0371681 -0.0231633 1 0 1 1 0 0 +EDGE2 8644 1005 1.00554 0.0242121 0.0302571 1 0 1 1 0 0 +EDGE2 8645 946 0.0379439 -1.0956 -1.51632 1 0 1 1 0 0 +EDGE2 8645 1004 -1.09243 0.118674 -0.0182623 1 0 1 1 0 0 +EDGE2 8645 1064 -0.966123 0.021076 -0.0291328 1 0 1 1 0 0 +EDGE2 8645 8644 -0.999358 -0.0144789 -0.0267494 1 0 1 1 0 0 +EDGE2 8645 1024 -0.892087 -0.0241312 0.018447 1 0 1 1 0 0 +EDGE2 8645 1025 0.0365753 -0.015568 -0.0119274 1 0 1 1 0 0 +EDGE2 8645 944 -1.04255 -0.0700747 0.0297164 1 0 1 1 0 0 +EDGE2 8645 984 -0.96323 -0.0764992 0.0329612 1 0 1 1 0 0 +EDGE2 8645 1065 0.0389162 -0.0557345 0.0168372 1 0 1 1 0 0 +EDGE2 8645 945 -0.0466457 0.0469765 -0.0197391 1 0 1 1 0 0 +EDGE2 8645 985 -0.0526623 0.000191703 0.0139321 1 0 1 1 0 0 +EDGE2 8645 1005 -0.0426747 0.0407039 0.0217296 1 0 1 1 0 0 +EDGE2 8645 986 0.0014424 0.918373 1.56171 1 0 1 1 0 0 +EDGE2 8645 1026 0.125472 1.07275 1.5493 1 0 1 1 0 0 +EDGE2 8645 1066 0.0250625 0.959194 1.56785 1 0 1 1 0 0 +EDGE2 8645 1006 0.0152703 0.994325 1.5984 1 0 1 1 0 0 +EDGE2 8646 1025 -1.0013 -0.0434933 -1.56689 1 0 1 1 0 0 +EDGE2 8646 8645 -1.03269 -0.0135152 -1.54105 1 0 1 1 0 0 +EDGE2 8646 1065 -0.988625 -0.0251875 -1.59303 1 0 1 1 0 0 +EDGE2 8646 945 -1.005 0.0100667 -1.57292 1 0 1 1 0 0 +EDGE2 8646 985 -0.967056 0.00993807 -1.56502 1 0 1 1 0 0 +EDGE2 8646 1005 -1.02335 -0.00416863 -1.60154 1 0 1 1 0 0 +EDGE2 8646 987 1.00481 -0.0846769 0.0323929 1 0 1 1 0 0 +EDGE2 8646 986 -0.0873915 -0.0722094 0.0106415 1 0 1 1 0 0 +EDGE2 8646 1026 -0.00328936 0.101051 0.00266867 1 0 1 1 0 0 +EDGE2 8646 1066 0.0277646 0.0191032 0.005491 1 0 1 1 0 0 +EDGE2 8646 1006 0.11122 -0.0418994 -0.0218691 1 0 1 1 0 0 +EDGE2 8646 1027 1.01736 0.0275104 -0.0144692 1 0 1 1 0 0 +EDGE2 8646 1067 0.993474 0.00482123 -0.00127806 1 0 1 1 0 0 +EDGE2 8646 1007 1.03965 0.0284129 -0.0106141 1 0 1 1 0 0 +EDGE2 8647 1028 1.07342 0.0565834 0.0172402 1 0 1 1 0 0 +EDGE2 8647 987 -0.0817027 0.0035745 -0.0211387 1 0 1 1 0 0 +EDGE2 8647 986 -0.954255 0.0976298 -0.0071373 1 0 1 1 0 0 +EDGE2 8647 1026 -0.979295 0.00228207 -0.0204399 1 0 1 1 0 0 +EDGE2 8647 1066 -0.971204 0.0247211 0.0208922 1 0 1 1 0 0 +EDGE2 8647 8646 -1.03848 -0.0237539 -0.0213134 1 0 1 1 0 0 +EDGE2 8647 1006 -1.03435 -0.0769411 -0.00685846 1 0 1 1 0 0 +EDGE2 8647 1027 0.00914691 0.0345795 0.0277505 1 0 1 1 0 0 +EDGE2 8647 1067 0.0286385 -0.105507 0.0227174 1 0 1 1 0 0 +EDGE2 8647 1007 0.0555508 0.129598 0.0217499 1 0 1 1 0 0 +EDGE2 8647 1068 0.953037 0.0835753 -0.0151389 1 0 1 1 0 0 +EDGE2 8647 988 0.904712 -0.0326406 0.0228842 1 0 1 1 0 0 +EDGE2 8647 1008 0.969302 0.0196282 -0.00726333 1 0 1 1 0 0 +EDGE2 8648 1028 0.0476796 -0.0430575 -0.0217677 1 0 1 1 0 0 +EDGE2 8648 987 -0.903906 0.039176 0.0232495 1 0 1 1 0 0 +EDGE2 8648 1027 -0.945386 0.00103393 0.0271722 1 0 1 1 0 0 +EDGE2 8648 1067 -0.999721 -0.0174479 0.0173563 1 0 1 1 0 0 +EDGE2 8648 8647 -0.920173 0.0205087 0.0149204 1 0 1 1 0 0 +EDGE2 8648 1007 -0.956645 -0.111587 0.00190468 1 0 1 1 0 0 +EDGE2 8648 1068 0.0720543 -0.0114558 -0.0630183 1 0 1 1 0 0 +EDGE2 8648 1069 1.03494 0.0209983 -0.0124481 1 0 1 1 0 0 +EDGE2 8648 988 -0.0889928 -0.0152989 -0.00943341 1 0 1 1 0 0 +EDGE2 8648 1008 -0.0121722 0.00754888 -0.00616417 1 0 1 1 0 0 +EDGE2 8648 989 1.04113 0.019749 0.0218833 1 0 1 1 0 0 +EDGE2 8648 1009 0.958044 0.033569 0.0123351 1 0 1 1 0 0 +EDGE2 8648 1029 0.968685 -0.027533 -0.0425903 1 0 1 1 0 0 +EDGE2 8649 1028 -0.924593 0.0237285 -0.0170627 1 0 1 1 0 0 +EDGE2 8649 8648 -1.02184 -0.0128907 -0.0137048 1 0 1 1 0 0 +EDGE2 8649 1068 -1.03766 0.0892094 0.0122551 1 0 1 1 0 0 +EDGE2 8649 1069 -0.0573279 -0.00191674 -0.018577 1 0 1 1 0 0 +EDGE2 8649 988 -0.953741 0.0300024 0.024703 1 0 1 1 0 0 +EDGE2 8649 1008 -1.08225 0.00494327 0.00221166 1 0 1 1 0 0 +EDGE2 8649 989 -0.0923402 -0.0308803 -0.00891305 1 0 1 1 0 0 +EDGE2 8649 1009 -0.0144877 0.0111746 -0.00191863 1 0 1 1 0 0 +EDGE2 8649 1029 0.0207772 -0.0616881 -0.0162449 1 0 1 1 0 0 +EDGE2 8649 1010 0.99604 -0.0355129 0.0057443 1 0 1 1 0 0 +EDGE2 8649 1050 0.97215 0.00494894 -3.13851 1 0 1 1 0 0 +EDGE2 8649 1070 1.03952 -0.0613062 -0.00126479 1 0 1 1 0 0 +EDGE2 8649 1030 1.02968 -0.00211821 -0.011577 1 0 1 1 0 0 +EDGE2 8649 990 0.960497 0.0828184 0.00624522 1 0 1 1 0 0 +EDGE2 8650 1069 -1.07079 0.105444 -0.010817 1 0 1 1 0 0 +EDGE2 8650 8649 -0.991638 -0.0487716 -0.00129499 1 0 1 1 0 0 +EDGE2 8650 989 -0.99772 0.03534 0.0171719 1 0 1 1 0 0 +EDGE2 8650 1009 -0.967314 0.00527911 -0.0146681 1 0 1 1 0 0 +EDGE2 8650 1029 -0.890877 -0.047487 0.012424 1 0 1 1 0 0 +EDGE2 8650 1010 0.101271 -0.051554 -0.0159056 1 0 1 1 0 0 +EDGE2 8650 1011 0.00564926 1.02943 1.58639 1 0 1 1 0 0 +EDGE2 8650 1051 0.0706797 0.918104 1.61303 1 0 1 1 0 0 +EDGE2 8650 1071 -0.0523507 1.04048 1.57752 1 0 1 1 0 0 +EDGE2 8650 991 -0.00956687 1.00685 1.57652 1 0 1 1 0 0 +EDGE2 8650 1050 -0.0246547 -0.130275 -3.17177 1 0 1 1 0 0 +EDGE2 8650 1070 -0.0858604 -0.0239694 -0.000590691 1 0 1 1 0 0 +EDGE2 8650 1030 -0.0415932 0.045253 -0.00299492 1 0 1 1 0 0 +EDGE2 8650 1031 0.0564122 -0.953624 -1.58622 1 0 1 1 0 0 +EDGE2 8650 990 -0.0116451 0.0512141 0.00604203 1 0 1 1 0 0 +EDGE2 8650 1049 0.942399 0.00912906 -3.13579 1 0 1 1 0 0 +EDGE2 8651 992 1.01263 0.00983179 -0.013044 1 0 1 1 0 0 +EDGE2 8651 1052 0.990591 -0.0285421 0.000543137 1 0 1 1 0 0 +EDGE2 8651 1072 0.953802 -0.0658105 0.0122489 1 0 1 1 0 0 +EDGE2 8651 1012 1.02118 0.0141463 -0.0266081 1 0 1 1 0 0 +EDGE2 8651 1010 -1.11961 -0.0443925 -1.5719 1 0 1 1 0 0 +EDGE2 8651 1011 -0.0319281 -0.0325892 -0.00394876 1 0 1 1 0 0 +EDGE2 8651 1051 0.0252234 0.0290437 0.0315215 1 0 1 1 0 0 +EDGE2 8651 1071 -0.0594701 0.0314047 -0.00211125 1 0 1 1 0 0 +EDGE2 8651 991 -0.00467801 0.0139845 0.0216719 1 0 1 1 0 0 +EDGE2 8651 1050 -0.942144 -0.0250497 1.57418 1 0 1 1 0 0 +EDGE2 8651 1070 -1.03457 -0.0102039 -1.58871 1 0 1 1 0 0 +EDGE2 8651 8650 -1.02565 -0.0867335 -1.63259 1 0 1 1 0 0 +EDGE2 8651 1030 -0.963634 -0.0402786 -1.57991 1 0 1 1 0 0 +EDGE2 8651 990 -0.912904 -0.0639251 -1.57764 1 0 1 1 0 0 +EDGE2 8652 8651 -1.03117 0.173772 -0.00175097 1 0 1 1 0 0 +EDGE2 8652 992 0.0977647 -0.0391416 -0.031892 1 0 1 1 0 0 +EDGE2 8652 993 1.04375 0.0552954 -0.0362967 1 0 1 1 0 0 +EDGE2 8652 1053 1.05354 -0.0777569 0.0165534 1 0 1 1 0 0 +EDGE2 8652 1073 0.95153 0.0456309 -0.0338029 1 0 1 1 0 0 +EDGE2 8652 1013 0.997143 0.047811 0.000461688 1 0 1 1 0 0 +EDGE2 8652 1052 -0.0067105 0.0138433 -0.00393873 1 0 1 1 0 0 +EDGE2 8652 1072 0.0193976 -0.0207392 -0.0146849 1 0 1 1 0 0 +EDGE2 8652 1012 0.0107866 -0.0625871 -0.0197426 1 0 1 1 0 0 +EDGE2 8652 1011 -0.969328 0.0482971 0.0125439 1 0 1 1 0 0 +EDGE2 8652 1051 -0.932681 0.0120603 -0.0270219 1 0 1 1 0 0 +EDGE2 8652 1071 -0.946053 0.0759119 -0.000560102 1 0 1 1 0 0 +EDGE2 8652 991 -1.02358 -0.0909352 0.0134079 1 0 1 1 0 0 +EDGE2 8653 1074 1.02068 0.00990611 0.00376361 1 0 1 1 0 0 +EDGE2 8653 1014 0.956174 -0.047462 0.0200103 1 0 1 1 0 0 +EDGE2 8653 1054 0.995777 -0.0160168 0.0148676 1 0 1 1 0 0 +EDGE2 8653 994 1.01312 0.0580702 -0.0224055 1 0 1 1 0 0 +EDGE2 8653 992 -1.13898 -0.0355488 0.0401166 1 0 1 1 0 0 +EDGE2 8653 993 -0.0319443 0.0587895 -0.0198945 1 0 1 1 0 0 +EDGE2 8653 1053 0.0394798 -0.00984956 -0.0369146 1 0 1 1 0 0 +EDGE2 8653 1073 0.0604957 -0.0493224 0.0108746 1 0 1 1 0 0 +EDGE2 8653 1013 0.0730875 -0.0339558 -0.0579814 1 0 1 1 0 0 +EDGE2 8653 1052 -1.0261 0.0379131 -0.00523103 1 0 1 1 0 0 +EDGE2 8653 1072 -1.05182 0.0744774 0.00888176 1 0 1 1 0 0 +EDGE2 8653 8652 -1.00692 0.0441333 0.00352063 1 0 1 1 0 0 +EDGE2 8653 1012 -1.0213 0.0151483 -0.00908955 1 0 1 1 0 0 +EDGE2 8654 1075 0.920358 -0.086734 -0.00457312 1 0 1 1 0 0 +EDGE2 8654 8615 0.912408 -0.0293062 -3.15708 1 0 1 1 0 0 +EDGE2 8654 8635 0.90323 0.0235106 -3.13978 1 0 1 1 0 0 +EDGE2 8654 3155 0.970439 0.0524955 -3.18039 1 0 1 1 0 0 +EDGE2 8654 8375 1.00716 -0.0844129 -3.18179 1 0 1 1 0 0 +EDGE2 8654 8475 1.01144 -0.134438 -3.13035 1 0 1 1 0 0 +EDGE2 8654 3075 1.01092 0.0250739 -3.12947 1 0 1 1 0 0 +EDGE2 8654 1074 0.0173245 0.0431243 -0.00014331 1 0 1 1 0 0 +EDGE2 8654 995 1.01267 0.000700998 -0.00836543 1 0 1 1 0 0 +EDGE2 8654 1015 0.970315 0.00606814 -0.0354735 1 0 1 1 0 0 +EDGE2 8654 1055 0.985395 0.0147204 -0.0392384 1 0 1 1 0 0 +EDGE2 8654 1014 -0.0790717 -0.0311431 -0.016181 1 0 1 1 0 0 +EDGE2 8654 1054 0.0130497 0.025383 0.018318 1 0 1 1 0 0 +EDGE2 8654 994 -0.0499005 -0.030276 -0.014124 1 0 1 1 0 0 +EDGE2 8654 993 -0.918192 -0.0138582 -0.00466415 1 0 1 1 0 0 +EDGE2 8654 1053 -1.01165 0.0219844 0.0238243 1 0 1 1 0 0 +EDGE2 8654 1073 -1.01675 0.0529222 -0.0062253 1 0 1 1 0 0 +EDGE2 8654 8653 -1.04047 0.0604347 0.0127817 1 0 1 1 0 0 +EDGE2 8654 1013 -0.963855 -0.0383987 0.0229875 1 0 1 1 0 0 +EDGE2 8655 1016 -0.0145563 1.037 1.55958 1 0 1 1 0 0 +EDGE2 8655 1056 0.00659404 0.967377 1.56504 1 0 1 1 0 0 +EDGE2 8655 8636 -0.0468856 1.01957 1.54861 1 0 1 1 0 0 +EDGE2 8655 996 -0.00267748 1.0241 1.51416 1 0 1 1 0 0 +EDGE2 8655 8374 1.05469 0.00672181 -3.15196 1 0 1 1 0 0 +EDGE2 8655 8614 1.06156 -0.149103 -3.14694 1 0 1 1 0 0 +EDGE2 8655 8634 1.04321 0.0765109 -3.16982 1 0 1 1 0 0 +EDGE2 8655 8474 1.04472 -0.0591409 -3.15588 1 0 1 1 0 0 +EDGE2 8655 1075 -0.00151843 0.0654325 -0.00123023 1 0 1 1 0 0 +EDGE2 8655 8615 -0.0125512 -0.0267346 -3.13895 1 0 1 1 0 0 +EDGE2 8655 3074 0.996217 -0.0152296 -3.178 1 0 1 1 0 0 +EDGE2 8655 3154 1.02737 -0.125713 -3.14354 1 0 1 1 0 0 +EDGE2 8655 8635 -0.020388 -0.035632 -3.13336 1 0 1 1 0 0 +EDGE2 8655 3155 0.015142 -0.087488 -3.14968 1 0 1 1 0 0 +EDGE2 8655 8375 0.0638227 -0.0407357 -3.12281 1 0 1 1 0 0 +EDGE2 8655 8475 0.00154944 -0.0708383 -3.17134 1 0 1 1 0 0 +EDGE2 8655 3075 -0.0785564 0.0262512 -3.11763 1 0 1 1 0 0 +EDGE2 8655 1074 -0.990645 0.0338962 -0.0136217 1 0 1 1 0 0 +EDGE2 8655 995 0.0314409 0.03829 -0.00423028 1 0 1 1 0 0 +EDGE2 8655 1015 0.0307408 0.0254306 0.0341389 1 0 1 1 0 0 +EDGE2 8655 1055 -0.0434199 0.0369388 -0.0169544 1 0 1 1 0 0 +EDGE2 8655 8654 -1.06101 0.000451438 0.0105986 1 0 1 1 0 0 +EDGE2 8655 1014 -0.963453 0.0174709 0.00866504 1 0 1 1 0 0 +EDGE2 8655 1054 -0.959458 -0.0567017 -0.00250715 1 0 1 1 0 0 +EDGE2 8655 994 -0.99252 -0.0880609 -0.00493253 1 0 1 1 0 0 +EDGE2 8655 3156 -0.00943572 -0.924905 -1.5596 1 0 1 1 0 0 +EDGE2 8655 8476 0.0279258 -1.02518 -1.57898 1 0 1 1 0 0 +EDGE2 8655 8616 0.0395267 -1.00642 -1.60354 1 0 1 1 0 0 +EDGE2 8655 8376 -0.0254362 -1.02154 -1.55885 1 0 1 1 0 0 +EDGE2 8655 1076 0.0308095 -1.00569 -1.56384 1 0 1 1 0 0 +EDGE2 8655 3076 -0.06123 -1.0302 -1.60257 1 0 1 1 0 0 +EDGE2 8656 1075 -1.03359 -0.0375735 1.54256 1 0 1 1 0 0 +EDGE2 8656 8615 -1.03808 -0.122094 -1.58349 1 0 1 1 0 0 +EDGE2 8656 8655 -0.947086 -0.092086 1.59531 1 0 1 1 0 0 +EDGE2 8656 8635 -1.0768 0.0220101 -1.57192 1 0 1 1 0 0 +EDGE2 8656 3155 -0.980135 0.0605171 -1.54448 1 0 1 1 0 0 +EDGE2 8656 8375 -0.98855 -0.035948 -1.58296 1 0 1 1 0 0 +EDGE2 8656 8475 -1.09135 -0.022663 -1.55118 1 0 1 1 0 0 +EDGE2 8656 3075 -0.935899 -0.0271705 -1.56565 1 0 1 1 0 0 +EDGE2 8656 995 -1.05269 0.122922 1.60838 1 0 1 1 0 0 +EDGE2 8656 1015 -1.04579 0.0632806 1.57502 1 0 1 1 0 0 +EDGE2 8656 1055 -1.0632 0.0571291 1.59834 1 0 1 1 0 0 +EDGE2 8656 8477 1.02926 -0.107975 -0.0167574 1 0 1 1 0 0 +EDGE2 8656 3156 -0.0417289 0.035028 -0.00498782 1 0 1 1 0 0 +EDGE2 8656 8476 -0.0637965 0.0716703 0.0151989 1 0 1 1 0 0 +EDGE2 8656 8616 -0.0105838 0.0402635 0.0139556 1 0 1 1 0 0 +EDGE2 8656 8376 0.078144 0.0800655 0.0167033 1 0 1 1 0 0 +EDGE2 8656 1076 -0.0614281 0.00874995 -0.0231066 1 0 1 1 0 0 +EDGE2 8656 3076 0.0329928 0.0907684 0.00879762 1 0 1 1 0 0 +EDGE2 8656 8617 1.04579 0.01206 0.00067917 1 0 1 1 0 0 +EDGE2 8656 3077 1.03448 -0.026492 -0.0145061 1 0 1 1 0 0 +EDGE2 8656 3157 1.0046 0.0370253 0.0120485 1 0 1 1 0 0 +EDGE2 8656 8377 1.02802 -0.0130887 0.0515066 1 0 1 1 0 0 +EDGE2 8656 1077 1.01842 0.0678887 -0.0306068 1 0 1 1 0 0 +EDGE2 8657 3078 1.00415 -0.0102655 -0.0255725 1 0 1 1 0 0 +EDGE2 8657 8477 -0.0167133 0.0227455 0.0489648 1 0 1 1 0 0 +EDGE2 8657 3156 -1.05097 0.00996036 0.00765945 1 0 1 1 0 0 +EDGE2 8657 8476 -0.971682 -0.0159663 -0.00588455 1 0 1 1 0 0 +EDGE2 8657 8616 -1.01738 -0.0477137 -0.0205308 1 0 1 1 0 0 +EDGE2 8657 8656 -0.94751 -0.000155073 -0.00111123 1 0 1 1 0 0 +EDGE2 8657 8376 -0.995829 0.0437947 0.00990083 1 0 1 1 0 0 +EDGE2 8657 1076 -1.00142 0.0361481 0.0335182 1 0 1 1 0 0 +EDGE2 8657 3076 -0.970721 0.0442564 -0.00425313 1 0 1 1 0 0 +EDGE2 8657 8617 -0.0359161 0.0117324 0.00543749 1 0 1 1 0 0 +EDGE2 8657 3077 -0.0194827 -0.00432152 0.00790907 1 0 1 1 0 0 +EDGE2 8657 3157 0.00572938 0.0592937 -0.00537008 1 0 1 1 0 0 +EDGE2 8657 8377 0.0211033 0.0525032 0.0289643 1 0 1 1 0 0 +EDGE2 8657 1077 0.00481438 -0.0794441 -0.00896667 1 0 1 1 0 0 +EDGE2 8657 8378 1.03823 -0.0246582 -0.011557 1 0 1 1 0 0 +EDGE2 8657 8478 1.01908 -0.00838736 -0.00906478 1 0 1 1 0 0 +EDGE2 8657 8618 1.03019 -0.000545141 0.00498639 1 0 1 1 0 0 +EDGE2 8657 3158 0.988996 -0.0435178 0.0084898 1 0 1 1 0 0 +EDGE2 8657 1078 1.0584 0.00809888 0.0157489 1 0 1 1 0 0 +EDGE2 8658 3078 -0.0144373 -0.0248439 0.0134495 1 0 1 1 0 0 +EDGE2 8658 8477 -1.0031 0.0460238 -0.019209 1 0 1 1 0 0 +EDGE2 8658 8657 -0.905896 -0.0731454 0.0102141 1 0 1 1 0 0 +EDGE2 8658 8617 -1.04923 0.0246928 0.0025373 1 0 1 1 0 0 +EDGE2 8658 3077 -1.04076 0.0112146 -0.00389825 1 0 1 1 0 0 +EDGE2 8658 3157 -0.994843 -0.0679763 -0.000168197 1 0 1 1 0 0 +EDGE2 8658 8377 -0.937621 0.0297356 -0.00258422 1 0 1 1 0 0 +EDGE2 8658 1077 -1.06401 -0.0430775 -0.00249517 1 0 1 1 0 0 +EDGE2 8658 8378 0.0159081 0.0568076 -0.049006 1 0 1 1 0 0 +EDGE2 8658 8478 -0.0236479 0.0925501 0.0327269 1 0 1 1 0 0 +EDGE2 8658 8618 0.00838924 0.0281514 0.00622493 1 0 1 1 0 0 +EDGE2 8658 3158 -0.0328044 -0.0497922 -0.0077414 1 0 1 1 0 0 +EDGE2 8658 8379 1.00362 -0.0548801 0.0182244 1 0 1 1 0 0 +EDGE2 8658 8619 1.03153 -0.0563318 -0.0195484 1 0 1 1 0 0 +EDGE2 8658 1078 -0.00321324 0.00649236 0.0218539 1 0 1 1 0 0 +EDGE2 8658 8479 0.929275 -0.102598 -0.00119983 1 0 1 1 0 0 +EDGE2 8658 3079 1.01572 0.0423756 -0.00225446 1 0 1 1 0 0 +EDGE2 8658 3159 0.944081 -0.0646272 -0.0222024 1 0 1 1 0 0 +EDGE2 8658 1079 1.07213 -0.123513 0.0396975 1 0 1 1 0 0 +EDGE2 8659 8360 0.969886 0.0183122 -3.15448 1 0 1 1 0 0 +EDGE2 8659 3078 -0.974224 0.0423371 0.00334538 1 0 1 1 0 0 +EDGE2 8659 8658 -1.05514 0.0160417 -0.0135314 1 0 1 1 0 0 +EDGE2 8659 8378 -0.933175 -0.0140481 -0.0424565 1 0 1 1 0 0 +EDGE2 8659 8478 -1.03406 -0.044692 -0.00607986 1 0 1 1 0 0 +EDGE2 8659 8618 -0.998893 0.0205875 0.000123882 1 0 1 1 0 0 +EDGE2 8659 3158 -0.979441 -0.0564683 0.0354465 1 0 1 1 0 0 +EDGE2 8659 8379 -0.00144579 -0.112091 0.0135322 1 0 1 1 0 0 +EDGE2 8659 8619 -0.0702007 -0.0196198 0.0240726 1 0 1 1 0 0 +EDGE2 8659 1078 -1.0048 -0.145134 0.0485808 1 0 1 1 0 0 +EDGE2 8659 8479 0.110152 -0.027565 0.0040972 1 0 1 1 0 0 +EDGE2 8659 3079 -0.0727673 0.0858553 -0.00919861 1 0 1 1 0 0 +EDGE2 8659 3159 0.0615981 -0.0422824 0.00942434 1 0 1 1 0 0 +EDGE2 8659 1079 -0.0447242 0.0233856 0.00701723 1 0 1 1 0 0 +EDGE2 8659 8480 1.0295 0.0413323 0.0146394 1 0 1 1 0 0 +EDGE2 8659 8620 1.0275 -0.00817354 -0.0192568 1 0 1 1 0 0 +EDGE2 8659 8400 0.939166 -0.103122 -3.15976 1 0 1 1 0 0 +EDGE2 8659 8420 0.973156 0.0210988 -3.1345 1 0 1 1 0 0 +EDGE2 8659 8380 0.961094 -0.0142742 0.00714259 1 0 1 1 0 0 +EDGE2 8659 3060 1.00856 -0.046992 -3.12557 1 0 1 1 0 0 +EDGE2 8659 3160 0.965706 0.0642527 0.0147991 1 0 1 1 0 0 +EDGE2 8659 5860 0.926414 -0.036049 -3.14886 1 0 1 1 0 0 +EDGE2 8659 5880 0.962259 0.113597 -3.14314 1 0 1 1 0 0 +EDGE2 8659 3080 0.949615 0.0325053 0.0160703 1 0 1 1 0 0 +EDGE2 8659 1080 0.946888 -0.0499644 -0.00506951 1 0 1 1 0 0 +EDGE2 8660 8360 -0.0247568 0.0951908 -3.16533 1 0 1 1 0 0 +EDGE2 8660 8379 -1.00596 -0.0168791 0.00863368 1 0 1 1 0 0 +EDGE2 8660 8619 -0.967318 0.0385121 0.0124112 1 0 1 1 0 0 +EDGE2 8660 8659 -0.990903 -0.0715289 0.0193943 1 0 1 1 0 0 +EDGE2 8660 8479 -1.04812 -0.0622184 0.027943 1 0 1 1 0 0 +EDGE2 8660 3079 -1.01306 -0.0133934 -0.0218946 1 0 1 1 0 0 +EDGE2 8660 3159 -0.91183 0.0803138 -0.0225131 1 0 1 1 0 0 +EDGE2 8660 1079 -0.998207 0.0589104 0.0310772 1 0 1 1 0 0 +EDGE2 8660 8361 -0.0206268 0.92962 1.58759 1 0 1 1 0 0 +EDGE2 8660 8421 0.00989161 0.971681 1.59557 1 0 1 1 0 0 +EDGE2 8660 8481 0.0340961 0.971966 1.58636 1 0 1 1 0 0 +EDGE2 8660 8621 0.0361016 0.993299 1.5893 1 0 1 1 0 0 +EDGE2 8660 8381 -0.0110147 0.999205 1.55267 1 0 1 1 0 0 +EDGE2 8660 3081 -0.00262681 0.983036 1.57371 1 0 1 1 0 0 +EDGE2 8660 3161 0.0132703 1.00323 1.56465 1 0 1 1 0 0 +EDGE2 8660 5881 0.00196987 0.995179 1.5896 1 0 1 1 0 0 +EDGE2 8660 3061 -0.0653189 1.01524 1.58098 1 0 1 1 0 0 +EDGE2 8660 8480 0.00511143 0.0496784 0.0182316 1 0 1 1 0 0 +EDGE2 8660 8620 0.0411185 0.0147949 0.0296748 1 0 1 1 0 0 +EDGE2 8660 8400 0.0525952 0.0355335 -3.12949 1 0 1 1 0 0 +EDGE2 8660 8420 -0.00964299 -0.0333135 -3.12725 1 0 1 1 0 0 +EDGE2 8660 8380 0.0169161 0.0565414 -0.0153092 1 0 1 1 0 0 +EDGE2 8660 8401 -0.0702879 -1.04408 -1.58076 1 0 1 1 0 0 +EDGE2 8660 3060 0.0392332 0.068906 -3.13689 1 0 1 1 0 0 +EDGE2 8660 3160 -0.0692964 0.0312892 0.00435614 1 0 1 1 0 0 +EDGE2 8660 5860 -0.031912 -0.0543691 -3.17861 1 0 1 1 0 0 +EDGE2 8660 5880 0.0655861 0.0246057 -3.15453 1 0 1 1 0 0 +EDGE2 8660 3080 0.0981126 0.0480913 -0.0111538 1 0 1 1 0 0 +EDGE2 8660 1080 -0.00342165 0.0421252 3.70378e-05 1 0 1 1 0 0 +EDGE2 8660 1081 0.0746491 -0.998937 -1.56196 1 0 1 1 0 0 +EDGE2 8660 5861 0.0425552 -1.00698 -1.58637 1 0 1 1 0 0 +EDGE2 8660 8399 0.986951 -0.0117995 -3.15134 1 0 1 1 0 0 +EDGE2 8660 8419 1.02135 0.0932902 -3.15056 1 0 1 1 0 0 +EDGE2 8660 5859 1.00462 -0.049012 -3.13601 1 0 1 1 0 0 +EDGE2 8660 5879 1.03969 -0.0410563 -3.11532 1 0 1 1 0 0 +EDGE2 8660 8359 1.06106 0.0704168 -3.16609 1 0 1 1 0 0 +EDGE2 8660 3059 0.980012 0.00175431 -3.15663 1 0 1 1 0 0 +EDGE2 8661 8360 -1.02111 -0.00389364 -1.57862 1 0 1 1 0 0 +EDGE2 8661 8480 -1.03568 0.0174973 1.54768 1 0 1 1 0 0 +EDGE2 8661 8660 -0.988186 0.0420453 1.56125 1 0 1 1 0 0 +EDGE2 8661 8620 -1.09876 0.0183499 1.51594 1 0 1 1 0 0 +EDGE2 8661 8400 -1.01341 -0.00458292 -1.59574 1 0 1 1 0 0 +EDGE2 8661 8420 -0.911942 0.00920036 -1.56397 1 0 1 1 0 0 +EDGE2 8661 8380 -0.985872 0.0401716 1.55672 1 0 1 1 0 0 +EDGE2 8661 5862 0.967999 0.0565095 -0.00708232 1 0 1 1 0 0 +EDGE2 8661 8401 0.0402401 -0.047378 0.00478709 1 0 1 1 0 0 +EDGE2 8661 3060 -1.03066 0.0155954 -1.52783 1 0 1 1 0 0 +EDGE2 8661 3160 -1.10669 -0.0410866 1.56952 1 0 1 1 0 0 +EDGE2 8661 5860 -1.073 -0.0204317 -1.55461 1 0 1 1 0 0 +EDGE2 8661 5880 -1.02796 -0.0376011 -1.5712 1 0 1 1 0 0 +EDGE2 8661 3080 -0.969653 -0.0210321 1.54833 1 0 1 1 0 0 +EDGE2 8661 1080 -1.01889 -0.0321987 1.58751 1 0 1 1 0 0 +EDGE2 8661 1081 0.0952913 -0.0599649 0.0396814 1 0 1 1 0 0 +EDGE2 8661 5861 0.0573348 0.0216289 -0.0123934 1 0 1 1 0 0 +EDGE2 8661 8402 1.0361 0.0504877 0.00238848 1 0 1 1 0 0 +EDGE2 8661 1082 1.05854 0.065883 -0.00760657 1 0 1 1 0 0 +EDGE2 8662 5862 -0.0343893 -0.0517407 -0.0139156 1 0 1 1 0 0 +EDGE2 8662 8401 -1.02003 -0.0498627 0.0171351 1 0 1 1 0 0 +EDGE2 8662 8661 -1.02245 0.0373854 0.0242296 1 0 1 1 0 0 +EDGE2 8662 1081 -0.978925 -0.0317568 0.0110618 1 0 1 1 0 0 +EDGE2 8662 5861 -0.915796 -0.00249021 -0.00685557 1 0 1 1 0 0 +EDGE2 8662 8402 0.11548 0.0201385 -0.00639069 1 0 1 1 0 0 +EDGE2 8662 8403 0.991941 -0.050224 -0.00987171 1 0 1 1 0 0 +EDGE2 8662 1082 -0.105137 -0.0128632 -0.0392467 1 0 1 1 0 0 +EDGE2 8662 1083 1.00276 -0.0408801 -0.01654 1 0 1 1 0 0 +EDGE2 8662 5863 1.07142 -0.0624586 0.0100593 1 0 1 1 0 0 +EDGE2 8663 5862 -0.962972 0.0607836 0.00516986 1 0 1 1 0 0 +EDGE2 8663 8662 -1.00899 0.00983789 0.0219857 1 0 1 1 0 0 +EDGE2 8663 8402 -0.924817 0.0153674 -0.0132548 1 0 1 1 0 0 +EDGE2 8663 8403 -0.0598351 -0.0521848 -0.01262 1 0 1 1 0 0 +EDGE2 8663 1082 -0.95721 0.0446756 0.00272594 1 0 1 1 0 0 +EDGE2 8663 1083 0.0894842 -0.0177362 -0.00721596 1 0 1 1 0 0 +EDGE2 8663 5863 -0.00766674 -0.0490349 -0.00363367 1 0 1 1 0 0 +EDGE2 8663 1084 1.03164 -0.0288117 0.026478 1 0 1 1 0 0 +EDGE2 8663 5864 0.984907 -0.0463532 -0.0273407 1 0 1 1 0 0 +EDGE2 8663 8404 1.02348 -0.019064 0.00698221 1 0 1 1 0 0 +EDGE2 8664 8345 1.02146 -0.0678517 -3.14033 1 0 1 1 0 0 +EDGE2 8664 8403 -0.977874 -0.00819319 -0.0348105 1 0 1 1 0 0 +EDGE2 8664 8663 -0.925423 0.0765996 0.00874854 1 0 1 1 0 0 +EDGE2 8664 1083 -0.949346 -0.0542122 0.0284348 1 0 1 1 0 0 +EDGE2 8664 5863 -1.09988 0.0529576 -0.00220862 1 0 1 1 0 0 +EDGE2 8664 1084 0.0120012 0.0601542 -0.0146175 1 0 1 1 0 0 +EDGE2 8664 5864 0.000289276 -0.044807 -0.00597745 1 0 1 1 0 0 +EDGE2 8664 8404 0.0013291 0.112399 -0.0154167 1 0 1 1 0 0 +EDGE2 8664 8405 1.01945 -0.0230903 0.0102694 1 0 1 1 0 0 +EDGE2 8664 1045 0.989675 -0.0466838 -3.14649 1 0 1 1 0 0 +EDGE2 8664 1085 1.05675 -0.0385164 -0.0219366 1 0 1 1 0 0 +EDGE2 8664 5865 0.908253 -0.034443 -0.00951453 1 0 1 1 0 0 +EDGE2 8665 8345 0.00601241 -0.0489584 -3.12324 1 0 1 1 0 0 +EDGE2 8665 1046 0.0305283 -0.990942 -1.59153 1 0 1 1 0 0 +EDGE2 8665 8664 -0.959433 -0.0322602 -0.0218737 1 0 1 1 0 0 +EDGE2 8665 1084 -1.01687 0.0642903 0.0107934 1 0 1 1 0 0 +EDGE2 8665 5864 -0.986699 -0.0777048 -0.0144984 1 0 1 1 0 0 +EDGE2 8665 8404 -0.917651 -0.129623 0.0208717 1 0 1 1 0 0 +EDGE2 8665 8405 0.0830258 -0.00104551 0.00472933 1 0 1 1 0 0 +EDGE2 8665 8344 1.01466 -0.00590752 -3.14455 1 0 1 1 0 0 +EDGE2 8665 1045 0.0300214 -0.0443516 -3.16311 1 0 1 1 0 0 +EDGE2 8665 1085 -0.128684 -0.0382857 0.00655317 1 0 1 1 0 0 +EDGE2 8665 5865 -0.0254055 -0.0100206 0.00982522 1 0 1 1 0 0 +EDGE2 8665 1044 1.00961 0.0326755 -3.13839 1 0 1 1 0 0 +EDGE2 8665 8346 0.0364064 0.960228 1.55592 1 0 1 1 0 0 +EDGE2 8665 8406 -0.0455239 0.96449 1.59825 1 0 1 1 0 0 +EDGE2 8665 1086 -0.0182682 0.96837 1.56956 1 0 1 1 0 0 +EDGE2 8665 5866 -0.00401807 0.951477 1.57276 1 0 1 1 0 0 +EDGE2 8666 8345 -1.04416 0.0847168 1.54347 1 0 1 1 0 0 +EDGE2 8666 8665 -0.975659 -0.0714613 -1.55045 1 0 1 1 0 0 +EDGE2 8666 8405 -0.943823 0.0654974 -1.57817 1 0 1 1 0 0 +EDGE2 8666 1045 -1.00564 -0.0926224 1.58543 1 0 1 1 0 0 +EDGE2 8666 1085 -0.957318 0.0307599 -1.61059 1 0 1 1 0 0 +EDGE2 8666 5865 -0.922554 -0.0462082 -1.55571 1 0 1 1 0 0 +EDGE2 8666 8346 0.0780755 0.0485698 0.0334326 1 0 1 1 0 0 +EDGE2 8666 8406 -0.0637105 0.0198265 -0.0166247 1 0 1 1 0 0 +EDGE2 8666 1086 0.0504931 0.0472037 0.0221526 1 0 1 1 0 0 +EDGE2 8666 5866 0.0110571 0.0109689 0.0240234 1 0 1 1 0 0 +EDGE2 8666 8407 0.88697 0.0110608 -0.0316682 1 0 1 1 0 0 +EDGE2 8666 5867 0.990216 -0.0429031 -0.0135127 1 0 1 1 0 0 +EDGE2 8666 8347 1.07102 0.0242725 0.0123204 1 0 1 1 0 0 +EDGE2 8666 1087 0.978879 -0.0269195 -0.0315629 1 0 1 1 0 0 +EDGE2 8667 8346 -1.01068 -0.00992992 -0.0093134 1 0 1 1 0 0 +EDGE2 8667 8666 -1.02359 -0.0434794 -0.01484 1 0 1 1 0 0 +EDGE2 8667 8406 -0.958326 0.109946 -0.00703301 1 0 1 1 0 0 +EDGE2 8667 1086 -1.00229 0.0221837 -0.0198508 1 0 1 1 0 0 +EDGE2 8667 5866 -0.940239 -0.00814675 -0.00141658 1 0 1 1 0 0 +EDGE2 8667 8407 0.017306 0.00158407 -0.0245734 1 0 1 1 0 0 +EDGE2 8667 5867 -0.0310672 -0.0356365 0.0310162 1 0 1 1 0 0 +EDGE2 8667 8347 -0.00479729 0.0659536 -0.00616442 1 0 1 1 0 0 +EDGE2 8667 1087 0.0128386 0.0132987 -0.0036707 1 0 1 1 0 0 +EDGE2 8667 8348 0.948881 0.0228776 0.000439271 1 0 1 1 0 0 +EDGE2 8667 8408 1.01024 -0.0919343 0.0147089 1 0 1 1 0 0 +EDGE2 8667 1088 0.996165 -0.0269776 -0.00347783 1 0 1 1 0 0 +EDGE2 8667 5868 0.915491 -0.0289456 0.00894192 1 0 1 1 0 0 +EDGE2 8668 8667 -0.971149 -0.0549876 -0.00253182 1 0 1 1 0 0 +EDGE2 8668 8407 -1.01363 -0.0116425 -0.0154606 1 0 1 1 0 0 +EDGE2 8668 5867 -1.059 -0.00732717 0.0120837 1 0 1 1 0 0 +EDGE2 8668 8347 -0.991051 0.0439996 -0.0126554 1 0 1 1 0 0 +EDGE2 8668 1087 -0.983005 -0.037992 -0.000612363 1 0 1 1 0 0 +EDGE2 8668 8348 -0.0148247 0.000811109 0.00861789 1 0 1 1 0 0 +EDGE2 8668 8408 -0.00354019 0.00585202 -0.00973866 1 0 1 1 0 0 +EDGE2 8668 1088 -0.0254822 -0.061071 -0.0334351 1 0 1 1 0 0 +EDGE2 8668 5868 -0.111588 -0.0406755 -0.0104475 1 0 1 1 0 0 +EDGE2 8668 5869 0.970676 0.0665056 -0.00326478 1 0 1 1 0 0 +EDGE2 8668 8349 0.888177 0.0209438 -0.024563 1 0 1 1 0 0 +EDGE2 8668 8409 0.987301 -0.0422578 0.0182996 1 0 1 1 0 0 +EDGE2 8668 1089 0.937742 -0.0326192 -0.0230852 1 0 1 1 0 0 +EDGE2 8669 8348 -1.07242 0.00244659 -0.0144515 1 0 1 1 0 0 +EDGE2 8669 8408 -0.995439 -0.0143516 -0.00773926 1 0 1 1 0 0 +EDGE2 8669 8668 -0.986804 -0.00684027 0.00341603 1 0 1 1 0 0 +EDGE2 8669 1088 -0.94356 -0.0205028 -0.0240477 1 0 1 1 0 0 +EDGE2 8669 5868 -0.961095 0.0616003 0.0329332 1 0 1 1 0 0 +EDGE2 8669 5869 -0.034781 -0.0373553 -0.00432485 1 0 1 1 0 0 +EDGE2 8669 8349 -0.0467479 0.0749094 -0.037867 1 0 1 1 0 0 +EDGE2 8669 8409 0.0229782 -0.0597144 -0.00454022 1 0 1 1 0 0 +EDGE2 8669 1089 0.0345183 0.0254074 0.0173524 1 0 1 1 0 0 +EDGE2 8669 5870 0.949621 0.0321263 0.00123429 1 0 1 1 0 0 +EDGE2 8669 8350 0.993035 -0.0324432 -0.0320136 1 0 1 1 0 0 +EDGE2 8669 8410 1.00067 -0.0431958 0.0072657 1 0 1 1 0 0 +EDGE2 8669 1090 1.02255 -0.0182436 -0.0521237 1 0 1 1 0 0 +EDGE2 8670 8669 -0.995028 0.0497609 -0.00790541 1 0 1 1 0 0 +EDGE2 8670 5869 -1.09271 -0.0479395 -0.0240186 1 0 1 1 0 0 +EDGE2 8670 8349 -0.958162 0.0302474 -0.00486826 1 0 1 1 0 0 +EDGE2 8670 8409 -0.947039 0.0226465 -0.0233778 1 0 1 1 0 0 +EDGE2 8670 1089 -1.02084 0.0181679 -0.0125417 1 0 1 1 0 0 +EDGE2 8670 8351 0.0342834 0.994723 1.56659 1 0 1 1 0 0 +EDGE2 8670 8411 0.0270697 1.05272 1.56839 1 0 1 1 0 0 +EDGE2 8670 1091 0.00562736 1.00141 1.54348 1 0 1 1 0 0 +EDGE2 8670 5871 -0.0523167 1.04295 1.59469 1 0 1 1 0 0 +EDGE2 8670 5870 -0.0305403 -0.0466319 0.00505118 1 0 1 1 0 0 +EDGE2 8670 8350 0.00640876 0.0182744 -0.00441257 1 0 1 1 0 0 +EDGE2 8670 8410 0.0394892 0.0220218 0.0310662 1 0 1 1 0 0 +EDGE2 8670 1090 0.0100382 0.0409532 -0.00402283 1 0 1 1 0 0 +EDGE2 8671 1092 1.11526 -0.0896042 -0.00117304 1 0 1 1 0 0 +EDGE2 8671 8352 1.00706 -0.0632729 -0.0188392 1 0 1 1 0 0 +EDGE2 8671 8412 1.02018 -0.079677 0.0101734 1 0 1 1 0 0 +EDGE2 8671 5872 0.998243 0.0341971 0.00262171 1 0 1 1 0 0 +EDGE2 8671 8670 -0.985526 -0.00158188 -1.5596 1 0 1 1 0 0 +EDGE2 8671 8351 -0.0234472 0.0567466 -0.0109267 1 0 1 1 0 0 +EDGE2 8671 8411 0.0449632 -0.04198 0.00441498 1 0 1 1 0 0 +EDGE2 8671 1091 -0.12382 0.0611003 0.0166119 1 0 1 1 0 0 +EDGE2 8671 5871 0.0203746 -0.0251181 -0.0143531 1 0 1 1 0 0 +EDGE2 8671 5870 -1.1236 0.032347 -1.59262 1 0 1 1 0 0 +EDGE2 8671 8350 -1.03517 0.110726 -1.57238 1 0 1 1 0 0 +EDGE2 8671 8410 -0.937227 0.00649923 -1.58991 1 0 1 1 0 0 +EDGE2 8671 1090 -0.962872 0.0250178 -1.56804 1 0 1 1 0 0 +EDGE2 8672 1092 0.108367 -0.0476395 0.0149967 1 0 1 1 0 0 +EDGE2 8672 8353 1.00945 -0.0317453 0.000963425 1 0 1 1 0 0 +EDGE2 8672 8413 0.976444 0.00901509 -0.00370865 1 0 1 1 0 0 +EDGE2 8672 1093 0.999464 0.00539345 -0.0199911 1 0 1 1 0 0 +EDGE2 8672 5873 1.07505 0.0281558 0.0151342 1 0 1 1 0 0 +EDGE2 8672 8352 0.0486236 0.0499595 -0.00401671 1 0 1 1 0 0 +EDGE2 8672 8412 -0.0533661 -0.0709725 0.0216086 1 0 1 1 0 0 +EDGE2 8672 5872 0.0952005 -0.0333942 -0.0087746 1 0 1 1 0 0 +EDGE2 8672 8351 -1.00605 -0.0199837 0.0458934 1 0 1 1 0 0 +EDGE2 8672 8671 -0.982117 -0.058865 0.034744 1 0 1 1 0 0 +EDGE2 8672 8411 -1.04546 -0.0329344 -0.00500848 1 0 1 1 0 0 +EDGE2 8672 1091 -1.06623 0.0124634 -0.041825 1 0 1 1 0 0 +EDGE2 8672 5871 -1.02802 0.0150012 -0.0297981 1 0 1 1 0 0 +EDGE2 8673 1092 -0.969302 0.0615006 0.0147885 1 0 1 1 0 0 +EDGE2 8673 8353 0.00451715 -0.0483302 0.0300622 1 0 1 1 0 0 +EDGE2 8673 1094 0.965662 -0.00925273 -0.0162806 1 0 1 1 0 0 +EDGE2 8673 8354 1.00668 0.0319439 0.00309096 1 0 1 1 0 0 +EDGE2 8673 8414 1.01439 0.0579702 -0.0105982 1 0 1 1 0 0 +EDGE2 8673 5874 0.994575 0.063493 0.00955239 1 0 1 1 0 0 +EDGE2 8673 8413 -0.0205208 -0.0780773 0.0149177 1 0 1 1 0 0 +EDGE2 8673 8672 -0.944701 0.00675588 -0.00527546 1 0 1 1 0 0 +EDGE2 8673 1093 0.0115216 -0.033931 -0.0306041 1 0 1 1 0 0 +EDGE2 8673 5873 -0.0324133 0.0486038 -0.00371871 1 0 1 1 0 0 +EDGE2 8673 8352 -1.04093 0.0368312 -0.0157277 1 0 1 1 0 0 +EDGE2 8673 8412 -1.03045 0.0186454 0.0239454 1 0 1 1 0 0 +EDGE2 8673 5872 -1.0137 0.0433413 0.0176572 1 0 1 1 0 0 +EDGE2 8674 5795 0.944323 -0.0163294 -3.12197 1 0 1 1 0 0 +EDGE2 8674 8395 0.973109 -0.00756145 -3.16497 1 0 1 1 0 0 +EDGE2 8674 8555 1.07567 0.0319487 -3.12985 1 0 1 1 0 0 +EDGE2 8674 8415 0.962908 -0.0308134 -0.00598607 1 0 1 1 0 0 +EDGE2 8674 5875 1.00239 -0.0579046 0.0283162 1 0 1 1 0 0 +EDGE2 8674 8355 1.00575 0.019494 -0.0113579 1 0 1 1 0 0 +EDGE2 8674 5855 1.04949 -0.0211018 -3.1552 1 0 1 1 0 0 +EDGE2 8674 3035 0.982523 0.0269886 -3.13257 1 0 1 1 0 0 +EDGE2 8674 3055 0.969695 0.0183935 -3.15421 1 0 1 1 0 0 +EDGE2 8674 1095 1.02806 -0.0203295 0.0377502 1 0 1 1 0 0 +EDGE2 8674 1115 0.957573 -0.0954115 -3.16469 1 0 1 1 0 0 +EDGE2 8674 1135 0.996344 0.0756823 -3.14104 1 0 1 1 0 0 +EDGE2 8674 8353 -0.948287 -0.100329 0.00950797 1 0 1 1 0 0 +EDGE2 8674 1094 0.0217459 0.109564 0.000444123 1 0 1 1 0 0 +EDGE2 8674 8354 0.0543405 0.00980078 0.0133725 1 0 1 1 0 0 +EDGE2 8674 8414 -0.0239198 -0.0197207 0.0178687 1 0 1 1 0 0 +EDGE2 8674 5874 -0.0569308 -0.0782755 -0.0035485 1 0 1 1 0 0 +EDGE2 8674 8673 -1.0087 -0.0607192 -0.0313855 1 0 1 1 0 0 +EDGE2 8674 8413 -0.930551 0.0174464 0.00631727 1 0 1 1 0 0 +EDGE2 8674 1093 -0.988331 -0.0148227 -0.00417738 1 0 1 1 0 0 +EDGE2 8674 5873 -0.991304 -0.0086594 0.0275682 1 0 1 1 0 0 +EDGE2 8675 5795 -0.00643 0.019035 -3.13324 1 0 1 1 0 0 +EDGE2 8675 8356 -0.0102562 1.12843 1.56008 1 0 1 1 0 0 +EDGE2 8675 8416 0.0660352 1.08286 1.56117 1 0 1 1 0 0 +EDGE2 8675 8396 -0.0106391 1.06288 1.58322 1 0 1 1 0 0 +EDGE2 8675 5856 -0.0708215 0.982413 1.577 1 0 1 1 0 0 +EDGE2 8675 5876 0.0893302 0.957856 1.56737 1 0 1 1 0 0 +EDGE2 8675 3056 0.0155259 1.02492 1.60496 1 0 1 1 0 0 +EDGE2 8675 5794 0.987345 -0.0915482 -3.125 1 0 1 1 0 0 +EDGE2 8675 8394 0.943959 -0.0298505 -3.16367 1 0 1 1 0 0 +EDGE2 8675 8554 0.984434 -0.0072416 -3.12806 1 0 1 1 0 0 +EDGE2 8675 5854 0.957977 -0.0333698 -3.174 1 0 1 1 0 0 +EDGE2 8675 1134 0.947835 0.0142505 -3.10841 1 0 1 1 0 0 +EDGE2 8675 3034 1.06007 -0.0404698 -3.11093 1 0 1 1 0 0 +EDGE2 8675 3054 1.03736 -0.0286652 -3.12215 1 0 1 1 0 0 +EDGE2 8675 1114 0.920189 -0.0746565 -3.14665 1 0 1 1 0 0 +EDGE2 8675 8395 0.0549277 0.0224909 -3.15181 1 0 1 1 0 0 +EDGE2 8675 8555 -0.00217951 0.0860913 -3.12946 1 0 1 1 0 0 +EDGE2 8675 8415 -0.0386913 0.0244744 -0.00320067 1 0 1 1 0 0 +EDGE2 8675 5875 0.046028 0.0055111 -0.00926935 1 0 1 1 0 0 +EDGE2 8675 8355 -0.0555584 -0.00626255 -0.00486404 1 0 1 1 0 0 +EDGE2 8675 5855 0.0205619 0.0417374 -3.14263 1 0 1 1 0 0 +EDGE2 8675 3035 0.0316738 0.0727162 -3.14856 1 0 1 1 0 0 +EDGE2 8675 3055 0.0357943 0.0806687 -3.11354 1 0 1 1 0 0 +EDGE2 8675 1095 -0.00987551 -0.00778635 -0.0335983 1 0 1 1 0 0 +EDGE2 8675 1115 -0.00434324 -0.0206968 -3.10389 1 0 1 1 0 0 +EDGE2 8675 1135 -0.0121817 -0.0116013 -3.15393 1 0 1 1 0 0 +EDGE2 8675 1094 -1.06839 -0.0276031 -0.00620182 1 0 1 1 0 0 +EDGE2 8675 8354 -1.00026 0.0101356 0.0203362 1 0 1 1 0 0 +EDGE2 8675 8414 -1.02469 0.0318187 -0.0115499 1 0 1 1 0 0 +EDGE2 8675 8674 -0.945927 0.0134548 -0.0229929 1 0 1 1 0 0 +EDGE2 8675 5874 -1.02652 0.0289514 -0.0387325 1 0 1 1 0 0 +EDGE2 8675 1116 -0.00857773 -0.982613 -1.55927 1 0 1 1 0 0 +EDGE2 8675 3036 0.0407036 -0.996256 -1.62716 1 0 1 1 0 0 +EDGE2 8675 5796 0.00546384 -1.04156 -1.55085 1 0 1 1 0 0 +EDGE2 8675 8556 0.0113767 -0.900461 -1.55294 1 0 1 1 0 0 +EDGE2 8675 1136 0.0940353 -0.956113 -1.54615 1 0 1 1 0 0 +EDGE2 8675 1096 0.0533135 -1.07572 -1.54338 1 0 1 1 0 0 +EDGE2 8676 5795 -0.991012 -0.0456164 1.59544 1 0 1 1 0 0 +EDGE2 8676 5877 1.00901 0.0205305 -0.0178573 1 0 1 1 0 0 +EDGE2 8676 8397 1.05937 0.103619 -0.0111558 1 0 1 1 0 0 +EDGE2 8676 8417 1.03871 -0.109957 -0.0150958 1 0 1 1 0 0 +EDGE2 8676 8357 1.02807 -0.00708727 0.0243705 1 0 1 1 0 0 +EDGE2 8676 3057 1.03752 -0.0501909 0.0207947 1 0 1 1 0 0 +EDGE2 8676 5857 0.914887 0.0497314 -0.0295159 1 0 1 1 0 0 +EDGE2 8676 8356 0.0412015 0.0147506 0.00439761 1 0 1 1 0 0 +EDGE2 8676 8416 -0.00843355 0.0510868 -0.00300022 1 0 1 1 0 0 +EDGE2 8676 8396 -0.020661 -0.00673843 0.0211511 1 0 1 1 0 0 +EDGE2 8676 5856 -0.0649993 0.00899946 0.00644552 1 0 1 1 0 0 +EDGE2 8676 5876 0.0114693 -0.032335 0.0158382 1 0 1 1 0 0 +EDGE2 8676 3056 0.0235596 0.0169655 0.00299026 1 0 1 1 0 0 +EDGE2 8676 8395 -1.08004 0.0226024 1.58169 1 0 1 1 0 0 +EDGE2 8676 8555 -0.875321 -0.090699 1.55898 1 0 1 1 0 0 +EDGE2 8676 8675 -0.996125 0.0380392 -1.60278 1 0 1 1 0 0 +EDGE2 8676 8415 -1.03844 0.076831 -1.52088 1 0 1 1 0 0 +EDGE2 8676 5875 -1.06444 0.0303882 -1.56609 1 0 1 1 0 0 +EDGE2 8676 8355 -0.986594 0.0145359 -1.5788 1 0 1 1 0 0 +EDGE2 8676 5855 -1.00707 -0.0436139 1.54951 1 0 1 1 0 0 +EDGE2 8676 3035 -1.02267 -0.135915 1.56216 1 0 1 1 0 0 +EDGE2 8676 3055 -1.01479 -0.0316844 1.58457 1 0 1 1 0 0 +EDGE2 8676 1095 -0.978233 0.0161868 -1.58788 1 0 1 1 0 0 +EDGE2 8676 1115 -0.936749 0.01189 1.60139 1 0 1 1 0 0 +EDGE2 8676 1135 -1.05219 -0.0436404 1.58056 1 0 1 1 0 0 +EDGE2 8677 8358 0.937067 -0.0762761 0.0124597 1 0 1 1 0 0 +EDGE2 8677 8418 0.939431 0.0510587 -0.0130121 1 0 1 1 0 0 +EDGE2 8677 8398 0.95834 0.0474702 -0.016013 1 0 1 1 0 0 +EDGE2 8677 3058 0.976231 0.0314456 -0.0269308 1 0 1 1 0 0 +EDGE2 8677 5858 0.956525 -0.0170722 -0.0160169 1 0 1 1 0 0 +EDGE2 8677 5878 0.923113 -0.0563325 -0.0151158 1 0 1 1 0 0 +EDGE2 8677 5877 -0.0762878 0.0953659 -0.0109121 1 0 1 1 0 0 +EDGE2 8677 8397 0.0226582 -0.0052441 0.00856735 1 0 1 1 0 0 +EDGE2 8677 8417 -0.0213012 0.0141562 -0.0215006 1 0 1 1 0 0 +EDGE2 8677 8357 0.00578571 0.0642354 -0.0318759 1 0 1 1 0 0 +EDGE2 8677 3057 0.0553868 -0.0155618 -0.0102388 1 0 1 1 0 0 +EDGE2 8677 5857 -0.00987178 0.033901 0.0137696 1 0 1 1 0 0 +EDGE2 8677 8356 -0.937223 0.0313176 0.0590518 1 0 1 1 0 0 +EDGE2 8677 8416 -1.02245 -0.00326691 -0.0146639 1 0 1 1 0 0 +EDGE2 8677 8676 -0.917582 0.0300099 -0.016759 1 0 1 1 0 0 +EDGE2 8677 8396 -1.03937 -0.0111102 -0.0299886 1 0 1 1 0 0 +EDGE2 8677 5856 -0.989267 -0.00333438 0.0174298 1 0 1 1 0 0 +EDGE2 8677 5876 -1.00749 0.0357287 -0.0254688 1 0 1 1 0 0 +EDGE2 8677 3056 -1.04744 -0.065115 0.0156527 1 0 1 1 0 0 +EDGE2 8678 8399 1.03143 -0.0465933 -0.0309736 1 0 1 1 0 0 +EDGE2 8678 8419 0.969595 -0.0445794 0.00385626 1 0 1 1 0 0 +EDGE2 8678 5859 1.0289 -0.0258796 0.00226607 1 0 1 1 0 0 +EDGE2 8678 5879 1.01948 0.0299485 0.0226186 1 0 1 1 0 0 +EDGE2 8678 8359 0.999765 0.0540511 -0.00518425 1 0 1 1 0 0 +EDGE2 8678 3059 0.969456 0.0255714 0.0346834 1 0 1 1 0 0 +EDGE2 8678 8358 -0.0322552 -0.0383463 0.000399095 1 0 1 1 0 0 +EDGE2 8678 8418 -0.00884274 0.00573412 -0.0110796 1 0 1 1 0 0 +EDGE2 8678 8398 -0.00220655 0.103427 0.0260091 1 0 1 1 0 0 +EDGE2 8678 3058 -0.057927 0.0316951 -0.0209797 1 0 1 1 0 0 +EDGE2 8678 5858 0.0312163 0.106859 -0.00204022 1 0 1 1 0 0 +EDGE2 8678 5878 0.024157 0.0230771 -0.00485954 1 0 1 1 0 0 +EDGE2 8678 5877 -1.09326 0.0201901 0.0158555 1 0 1 1 0 0 +EDGE2 8678 8397 -0.975222 -0.0792856 0.00507643 1 0 1 1 0 0 +EDGE2 8678 8417 -0.911722 0.120521 -0.0364044 1 0 1 1 0 0 +EDGE2 8678 8677 -1.03156 -0.0123226 -0.000203376 1 0 1 1 0 0 +EDGE2 8678 8357 -1.04343 0.0639512 -0.0149016 1 0 1 1 0 0 +EDGE2 8678 3057 -0.987655 -0.0374139 0.0221141 1 0 1 1 0 0 +EDGE2 8678 5857 -0.950423 0.0262046 -0.0107968 1 0 1 1 0 0 +EDGE2 8679 8360 0.99078 -0.0325125 0.000722444 1 0 1 1 0 0 +EDGE2 8679 8480 0.998364 -0.0262597 -3.16709 1 0 1 1 0 0 +EDGE2 8679 8660 1.01923 0.0416611 -3.14568 1 0 1 1 0 0 +EDGE2 8679 8620 1.01338 -0.00566466 -3.15952 1 0 1 1 0 0 +EDGE2 8679 8400 0.977802 -0.00432477 -0.0281779 1 0 1 1 0 0 +EDGE2 8679 8420 0.995715 0.0279384 -0.00995215 1 0 1 1 0 0 +EDGE2 8679 8380 1.05473 -0.0580356 -3.16659 1 0 1 1 0 0 +EDGE2 8679 3060 1.01023 -0.0516945 0.0110519 1 0 1 1 0 0 +EDGE2 8679 3160 0.940389 -0.00387823 -3.16471 1 0 1 1 0 0 +EDGE2 8679 5860 0.906182 0.0417243 -0.0226097 1 0 1 1 0 0 +EDGE2 8679 5880 0.969829 0.00293945 0.0313028 1 0 1 1 0 0 +EDGE2 8679 3080 0.873526 0.125623 -3.15678 1 0 1 1 0 0 +EDGE2 8679 1080 0.999901 -0.0101474 -3.13137 1 0 1 1 0 0 +EDGE2 8679 8399 -0.00246628 -0.00749612 -0.0130332 1 0 1 1 0 0 +EDGE2 8679 8419 0.0605604 0.0103036 -0.00866561 1 0 1 1 0 0 +EDGE2 8679 5859 0.0253686 0.0169838 0.0059805 1 0 1 1 0 0 +EDGE2 8679 5879 -0.00451734 0.000216647 0.0265174 1 0 1 1 0 0 +EDGE2 8679 8359 -0.0172303 0.0667629 -0.00662456 1 0 1 1 0 0 +EDGE2 8679 3059 0.0208408 0.0848784 0.0209801 1 0 1 1 0 0 +EDGE2 8679 8358 -1.04044 -0.0420395 0.0194426 1 0 1 1 0 0 +EDGE2 8679 8418 -1.04742 0.107237 -0.0352017 1 0 1 1 0 0 +EDGE2 8679 8678 -0.962678 -0.0329793 0.0047836 1 0 1 1 0 0 +EDGE2 8679 8398 -1.00783 0.0462533 0.011052 1 0 1 1 0 0 +EDGE2 8679 3058 -1.02535 0.0525 -0.0158094 1 0 1 1 0 0 +EDGE2 8679 5858 -1.00799 0.154325 0.000789783 1 0 1 1 0 0 +EDGE2 8679 5878 -0.973586 -0.0231426 -0.0201507 1 0 1 1 0 0 +EDGE2 8680 8360 -0.0249488 0.0331028 -0.0242877 1 0 1 1 0 0 +EDGE2 8680 8379 1.02107 -0.0481311 -3.14295 1 0 1 1 0 0 +EDGE2 8680 8619 0.988708 -0.0037716 -3.13626 1 0 1 1 0 0 +EDGE2 8680 8659 0.9645 -0.0448737 -3.15141 1 0 1 1 0 0 +EDGE2 8680 8479 0.93981 -0.0075805 -3.14423 1 0 1 1 0 0 +EDGE2 8680 3079 1.00656 0.0941744 -3.16938 1 0 1 1 0 0 +EDGE2 8680 3159 1.05308 -0.0323737 -3.1552 1 0 1 1 0 0 +EDGE2 8680 1079 1.006 -0.00550094 -3.14386 1 0 1 1 0 0 +EDGE2 8680 8361 0.110995 -1.02764 -1.5755 1 0 1 1 0 0 +EDGE2 8680 8421 -0.0236438 -0.978101 -1.57423 1 0 1 1 0 0 +EDGE2 8680 8481 -0.00346751 -1.00147 -1.59617 1 0 1 1 0 0 +EDGE2 8680 8621 0.0674381 -1.09536 -1.5679 1 0 1 1 0 0 +EDGE2 8680 8381 0.0181558 -0.981148 -1.58977 1 0 1 1 0 0 +EDGE2 8680 3081 -0.0476641 -0.973311 -1.56688 1 0 1 1 0 0 +EDGE2 8680 3161 -0.03724 -1.0343 -1.56295 1 0 1 1 0 0 +EDGE2 8680 5881 0.134833 -1.00254 -1.55839 1 0 1 1 0 0 +EDGE2 8680 3061 -0.0902497 -1.02246 -1.5616 1 0 1 1 0 0 +EDGE2 8680 8480 -0.1027 -0.00737719 -3.14299 1 0 1 1 0 0 +EDGE2 8680 8660 -0.0697648 0.0377184 -3.1364 1 0 1 1 0 0 +EDGE2 8680 8620 0.105182 0.0378925 -3.11145 1 0 1 1 0 0 +EDGE2 8680 8400 0.0563501 0.0358187 -0.0195076 1 0 1 1 0 0 +EDGE2 8680 8420 -0.140261 -0.0374499 -0.00775688 1 0 1 1 0 0 +EDGE2 8680 8380 -0.0571017 -0.0709058 -3.15313 1 0 1 1 0 0 +EDGE2 8680 8401 0.0298096 0.961326 1.55329 1 0 1 1 0 0 +EDGE2 8680 3060 0.0130983 0.00986643 0.00163029 1 0 1 1 0 0 +EDGE2 8680 3160 0.0118367 0.0610549 -3.11339 1 0 1 1 0 0 +EDGE2 8680 5860 -0.024198 -0.0406551 -0.036094 1 0 1 1 0 0 +EDGE2 8680 5880 0.0328516 -0.0284314 0.0233302 1 0 1 1 0 0 +EDGE2 8680 3080 0.0257454 0.0183839 -3.13526 1 0 1 1 0 0 +EDGE2 8680 1080 -0.0116535 0.00932485 -3.1041 1 0 1 1 0 0 +EDGE2 8680 8661 -0.096396 0.934725 1.5945 1 0 1 1 0 0 +EDGE2 8680 1081 -0.0192612 0.99172 1.55222 1 0 1 1 0 0 +EDGE2 8680 5861 -0.0100264 0.938295 1.57645 1 0 1 1 0 0 +EDGE2 8680 8399 -1.06242 -0.00890595 -0.0616247 1 0 1 1 0 0 +EDGE2 8680 8679 -1.03922 -0.113234 0.0113016 1 0 1 1 0 0 +EDGE2 8680 8419 -1.02045 0.0116388 0.00379935 1 0 1 1 0 0 +EDGE2 8680 5859 -0.933598 -0.0312406 -0.00556956 1 0 1 1 0 0 +EDGE2 8680 5879 -1.01059 0.0131818 0.0167112 1 0 1 1 0 0 +EDGE2 8680 8359 -1.00043 -0.0706215 0.00870121 1 0 1 1 0 0 +EDGE2 8680 3059 -1.00354 0.0533587 0.0205779 1 0 1 1 0 0 +EDGE2 8681 8360 -0.951702 0.00549719 -1.5541 1 0 1 1 0 0 +EDGE2 8681 8480 -0.958743 0.00504462 1.585 1 0 1 1 0 0 +EDGE2 8681 8660 -1.01793 -0.0601223 1.56919 1 0 1 1 0 0 +EDGE2 8681 8680 -1.05137 0.0614413 -1.54181 1 0 1 1 0 0 +EDGE2 8681 8620 -1.07283 0.0520841 1.57337 1 0 1 1 0 0 +EDGE2 8681 8400 -0.954244 0.0296538 -1.59447 1 0 1 1 0 0 +EDGE2 8681 8420 -0.83247 -0.0820667 -1.57166 1 0 1 1 0 0 +EDGE2 8681 8380 -1.02593 0.0118719 1.54829 1 0 1 1 0 0 +EDGE2 8681 5862 1.08512 -0.0242632 -0.0200681 1 0 1 1 0 0 +EDGE2 8681 8401 -0.0343272 0.0568011 0.00135161 1 0 1 1 0 0 +EDGE2 8681 3060 -0.966018 -0.0162025 -1.55488 1 0 1 1 0 0 +EDGE2 8681 3160 -1.01454 -0.00978732 1.5811 1 0 1 1 0 0 +EDGE2 8681 5860 -0.963302 0.00513199 -1.53374 1 0 1 1 0 0 +EDGE2 8681 5880 -0.889944 -0.0833515 -1.57257 1 0 1 1 0 0 +EDGE2 8681 3080 -0.922155 -0.0051192 1.59287 1 0 1 1 0 0 +EDGE2 8681 1080 -0.934633 -0.0663232 1.56525 1 0 1 1 0 0 +EDGE2 8681 8661 -0.0689438 -0.0158775 -0.00426542 1 0 1 1 0 0 +EDGE2 8681 1081 0.0894416 -0.0021032 0.0374876 1 0 1 1 0 0 +EDGE2 8681 5861 0.0826818 -0.0443672 0.0296664 1 0 1 1 0 0 +EDGE2 8681 8662 0.952418 -0.0351075 -0.0116507 1 0 1 1 0 0 +EDGE2 8681 8402 0.981993 -0.0394568 0.0230588 1 0 1 1 0 0 +EDGE2 8681 1082 1.02618 -0.0744685 -0.0180613 1 0 1 1 0 0 +EDGE2 8682 5862 0.0854552 0.028036 -0.0181829 1 0 1 1 0 0 +EDGE2 8682 8401 -1.02153 -0.0402216 0.0117494 1 0 1 1 0 0 +EDGE2 8682 8681 -0.955535 -0.00120591 0.0426342 1 0 1 1 0 0 +EDGE2 8682 8661 -0.957861 -0.0642899 0.0357292 1 0 1 1 0 0 +EDGE2 8682 1081 -1.04967 -0.00659043 -0.0377313 1 0 1 1 0 0 +EDGE2 8682 5861 -1.00127 0.0237379 0.00260722 1 0 1 1 0 0 +EDGE2 8682 8662 1.35284e-05 0.0127463 0.0322529 1 0 1 1 0 0 +EDGE2 8682 8402 -0.0249807 0.0148517 -0.0188752 1 0 1 1 0 0 +EDGE2 8682 8403 0.972965 -0.0951519 -0.00743281 1 0 1 1 0 0 +EDGE2 8682 1082 0.018957 0.0490048 -0.0206792 1 0 1 1 0 0 +EDGE2 8682 8663 1.07785 0.0118923 -0.00231802 1 0 1 1 0 0 +EDGE2 8682 1083 1.00108 0.00754659 0.00222297 1 0 1 1 0 0 +EDGE2 8682 5863 0.980469 0.0626042 -0.0162978 1 0 1 1 0 0 +EDGE2 8683 5862 -0.978883 0.0142826 -0.0129962 1 0 1 1 0 0 +EDGE2 8683 8662 -1.02342 0.0346723 -0.0173033 1 0 1 1 0 0 +EDGE2 8683 8682 -0.969041 -0.0168322 -0.0448851 1 0 1 1 0 0 +EDGE2 8683 8402 -1.07887 -3.16657e-05 0.045597 1 0 1 1 0 0 +EDGE2 8683 8664 1.01615 -0.00780805 -0.0549114 1 0 1 1 0 0 +EDGE2 8683 8403 0.0831639 -0.0660409 0.0220445 1 0 1 1 0 0 +EDGE2 8683 1082 -1.05313 -0.107087 -0.01448 1 0 1 1 0 0 +EDGE2 8683 8663 -0.0899515 0.0912776 -0.00509895 1 0 1 1 0 0 +EDGE2 8683 1083 0.0283749 -0.0110959 0.0187824 1 0 1 1 0 0 +EDGE2 8683 5863 0.0190762 0.0157857 0.0289639 1 0 1 1 0 0 +EDGE2 8683 1084 1.05638 -0.0482498 -0.0148514 1 0 1 1 0 0 +EDGE2 8683 5864 0.979478 -0.030454 -0.0511408 1 0 1 1 0 0 +EDGE2 8683 8404 1.00907 0.044921 -0.0143775 1 0 1 1 0 0 +EDGE2 8684 8345 1.01509 0.00342058 -3.13771 1 0 1 1 0 0 +EDGE2 8684 8664 0.0688215 -0.0148066 0.0155827 1 0 1 1 0 0 +EDGE2 8684 8403 -0.977442 -0.0480266 0.000546333 1 0 1 1 0 0 +EDGE2 8684 8683 -0.970388 -0.00307332 -0.0210192 1 0 1 1 0 0 +EDGE2 8684 8663 -0.947449 0.0616436 0.0147085 1 0 1 1 0 0 +EDGE2 8684 1083 -1.10176 -0.0362939 -0.00287187 1 0 1 1 0 0 +EDGE2 8684 5863 -0.9963 -0.00804616 -0.0124188 1 0 1 1 0 0 +EDGE2 8684 1084 -0.0218656 0.0436841 0.00359018 1 0 1 1 0 0 +EDGE2 8684 5864 0.018873 -0.0206577 -0.00967113 1 0 1 1 0 0 +EDGE2 8684 8404 0.00299361 -0.0714452 -0.00354783 1 0 1 1 0 0 +EDGE2 8684 8665 1.01499 0.0864002 -0.0138452 1 0 1 1 0 0 +EDGE2 8684 8405 1.05394 0.00611191 0.0220706 1 0 1 1 0 0 +EDGE2 8684 1045 0.982445 0.0687804 -3.13098 1 0 1 1 0 0 +EDGE2 8684 1085 1.11362 -0.00278732 0.00819894 1 0 1 1 0 0 +EDGE2 8684 5865 1.01234 0.113563 0.00624557 1 0 1 1 0 0 +EDGE2 8685 8345 0.0393019 0.0882159 -3.1233 1 0 1 1 0 0 +EDGE2 8685 1046 -0.0555632 -1.01246 -1.59274 1 0 1 1 0 0 +EDGE2 8685 8664 -1.03085 -0.165653 0.0161406 1 0 1 1 0 0 +EDGE2 8685 8684 -1.03616 0.0233433 -0.0255464 1 0 1 1 0 0 +EDGE2 8685 1084 -1.03329 0.0602875 -0.0107501 1 0 1 1 0 0 +EDGE2 8685 5864 -0.901531 -0.0262108 6.47152e-05 1 0 1 1 0 0 +EDGE2 8685 8404 -1.0412 0.0172342 0.00658561 1 0 1 1 0 0 +EDGE2 8685 8665 0.0275245 -0.0646234 0.00599655 1 0 1 1 0 0 +EDGE2 8685 8405 -0.00945826 0.037904 0.000567561 1 0 1 1 0 0 +EDGE2 8685 8344 1.00802 0.00452191 -3.16043 1 0 1 1 0 0 +EDGE2 8685 1045 -0.0239337 0.0180068 -3.13459 1 0 1 1 0 0 +EDGE2 8685 1085 0.000999615 -0.0728769 0.00724973 1 0 1 1 0 0 +EDGE2 8685 5865 0.0441078 -0.0205206 0.00222928 1 0 1 1 0 0 +EDGE2 8685 1044 0.932673 0.00232387 -3.13105 1 0 1 1 0 0 +EDGE2 8685 8346 0.00293429 1.0124 1.55881 1 0 1 1 0 0 +EDGE2 8685 8666 -0.0037442 0.947388 1.54415 1 0 1 1 0 0 +EDGE2 8685 8406 0.00208984 0.967872 1.57271 1 0 1 1 0 0 +EDGE2 8685 1086 0.079724 0.952031 1.56131 1 0 1 1 0 0 +EDGE2 8685 5866 -0.0134478 1.04853 1.55144 1 0 1 1 0 0 +EDGE2 8686 8345 -1.04437 -0.0505574 -1.59021 1 0 1 1 0 0 +EDGE2 8686 1047 1.04458 0.0233468 0.00210206 1 0 1 1 0 0 +EDGE2 8686 1046 -0.0361662 -0.0348279 -0.0152111 1 0 1 1 0 0 +EDGE2 8686 8665 -0.978888 8.63154e-05 1.57594 1 0 1 1 0 0 +EDGE2 8686 8685 -1.04705 0.000709601 1.54248 1 0 1 1 0 0 +EDGE2 8686 8405 -1.04878 -0.0627599 1.54257 1 0 1 1 0 0 +EDGE2 8686 1045 -0.958331 0.0627476 -1.56718 1 0 1 1 0 0 +EDGE2 8686 1085 -1.02194 -0.0714198 1.56114 1 0 1 1 0 0 +EDGE2 8686 5865 -1.04905 0.02283 1.59023 1 0 1 1 0 0 +EDGE2 8687 1048 1.0528 0.00749992 -0.0110416 1 0 1 1 0 0 +EDGE2 8687 8686 -0.909989 0.0970025 -0.00962926 1 0 1 1 0 0 +EDGE2 8687 1047 -0.034013 -0.0630297 0.0146491 1 0 1 1 0 0 +EDGE2 8687 1046 -1.08764 -0.0176569 -0.00796079 1 0 1 1 0 0 +EDGE2 8688 1049 1.12719 0.0379235 0.0163555 1 0 1 1 0 0 +EDGE2 8688 1048 0.00987823 0.120193 0.00436189 1 0 1 1 0 0 +EDGE2 8688 1047 -1.04801 0.0220604 -0.00209499 1 0 1 1 0 0 +EDGE2 8688 8687 -1.03829 0.0214387 -0.0221212 1 0 1 1 0 0 +EDGE2 8689 1010 1.03059 0.0687263 -3.17563 1 0 1 1 0 0 +EDGE2 8689 1050 1.04007 -0.0143965 0.0173645 1 0 1 1 0 0 +EDGE2 8689 1070 1.00736 -0.0422578 -3.13622 1 0 1 1 0 0 +EDGE2 8689 8650 0.950862 -0.0363258 -3.14322 1 0 1 1 0 0 +EDGE2 8689 1030 1.00031 -0.00538852 -3.09939 1 0 1 1 0 0 +EDGE2 8689 990 1.00196 -0.00720068 -3.14362 1 0 1 1 0 0 +EDGE2 8689 1049 0.0460281 -0.0201308 0.00584999 1 0 1 1 0 0 +EDGE2 8689 1048 -1.01949 0.0177215 0.0300136 1 0 1 1 0 0 +EDGE2 8689 8688 -0.968739 0.0132613 -0.00498994 1 0 1 1 0 0 +EDGE2 8690 8651 -0.0890825 -1.05058 -1.55783 1 0 1 1 0 0 +EDGE2 8690 1069 0.947928 -0.0139796 -3.10501 1 0 1 1 0 0 +EDGE2 8690 8649 1.07064 0.0351268 -3.15101 1 0 1 1 0 0 +EDGE2 8690 989 0.959801 0.0200615 -3.09243 1 0 1 1 0 0 +EDGE2 8690 1009 0.95836 -0.0259311 -3.1369 1 0 1 1 0 0 +EDGE2 8690 1029 1.06071 0.017388 -3.13544 1 0 1 1 0 0 +EDGE2 8690 1010 0.0267043 -0.0292835 -3.12746 1 0 1 1 0 0 +EDGE2 8690 1011 -0.0636572 -1.09037 -1.55058 1 0 1 1 0 0 +EDGE2 8690 1051 0.000110638 -1.05319 -1.56518 1 0 1 1 0 0 +EDGE2 8690 1071 0.0124423 -1.03193 -1.60265 1 0 1 1 0 0 +EDGE2 8690 991 -0.0262372 -0.997669 -1.57266 1 0 1 1 0 0 +EDGE2 8690 1050 -0.000823581 0.0271751 -0.00369826 1 0 1 1 0 0 +EDGE2 8690 1070 0.00594445 0.0923767 -3.13621 1 0 1 1 0 0 +EDGE2 8690 8650 -0.0644698 -0.00315715 -3.12389 1 0 1 1 0 0 +EDGE2 8690 1030 0.00458994 -0.0395076 -3.16514 1 0 1 1 0 0 +EDGE2 8690 1031 0.0740617 1.00837 1.56504 1 0 1 1 0 0 +EDGE2 8690 990 -0.0700831 0.0102415 -3.13708 1 0 1 1 0 0 +EDGE2 8690 8689 -0.985133 0.022386 0.0109631 1 0 1 1 0 0 +EDGE2 8690 1049 -0.9682 0.0375608 -0.0138247 1 0 1 1 0 0 +EDGE2 8691 1010 -1.00533 0.0284477 1.5662 1 0 1 1 0 0 +EDGE2 8691 8690 -1.0482 -0.0108509 -1.56078 1 0 1 1 0 0 +EDGE2 8691 1050 -0.888176 -0.0507248 -1.57398 1 0 1 1 0 0 +EDGE2 8691 1070 -1.02156 -0.00577215 1.50338 1 0 1 1 0 0 +EDGE2 8691 8650 -1.03593 0.014016 1.57824 1 0 1 1 0 0 +EDGE2 8691 1030 -0.98796 0.00972631 1.59461 1 0 1 1 0 0 +EDGE2 8691 1032 1.02858 0.0138017 0.00119859 1 0 1 1 0 0 +EDGE2 8691 1031 0.0194108 -0.0309309 -0.00362639 1 0 1 1 0 0 +EDGE2 8691 990 -1.03002 -0.0219098 1.57517 1 0 1 1 0 0 +EDGE2 8692 1032 -0.00911722 0.0586392 0.0212691 1 0 1 1 0 0 +EDGE2 8692 1031 -1.01956 -0.0485457 0.0267373 1 0 1 1 0 0 +EDGE2 8692 8691 -0.999839 0.0751974 -0.00835363 1 0 1 1 0 0 +EDGE2 8692 1033 1.10154 -0.00723186 -0.025837 1 0 1 1 0 0 +EDGE2 8693 1034 1.02856 -0.0422936 -0.0346841 1 0 1 1 0 0 +EDGE2 8693 1032 -0.930814 0.0429669 -0.00835654 1 0 1 1 0 0 +EDGE2 8693 8692 -1.01201 -0.0265444 0.0158573 1 0 1 1 0 0 +EDGE2 8693 1033 -0.0795763 -0.0159145 -0.00633855 1 0 1 1 0 0 +EDGE2 8694 1034 -0.00169233 0.0336981 0.0271629 1 0 1 1 0 0 +EDGE2 8694 1033 -0.911359 -0.00581761 0.00234232 1 0 1 1 0 0 +EDGE2 8694 8693 -0.884172 -0.088236 0.00355013 1 0 1 1 0 0 +EDGE2 8694 1035 1.01631 -0.0305177 0.00537588 1 0 1 1 0 0 +EDGE2 8694 8335 1.01485 0.0566668 -3.13574 1 0 1 1 0 0 +EDGE2 8695 1034 -0.992932 0.0676261 0.0165025 1 0 1 1 0 0 +EDGE2 8695 8694 -1.06632 -0.00456331 0.0129672 1 0 1 1 0 0 +EDGE2 8695 1035 0.0533857 0.00120085 0.010251 1 0 1 1 0 0 +EDGE2 8695 8335 -0.0947366 0.0457454 -3.14019 1 0 1 1 0 0 +EDGE2 8695 8334 0.998418 -0.0218044 -3.15239 1 0 1 1 0 0 +EDGE2 8695 8336 0.00773942 1.09496 1.56391 1 0 1 1 0 0 +EDGE2 8695 1036 -0.0783695 1.01313 1.58734 1 0 1 1 0 0 +EDGE2 8696 1035 -0.952597 0.0938533 -1.56799 1 0 1 1 0 0 +EDGE2 8696 8335 -1.08966 -0.0205559 1.56791 1 0 1 1 0 0 +EDGE2 8696 8695 -0.922508 0.047909 -1.577 1 0 1 1 0 0 +EDGE2 8696 8336 0.0299195 0.133199 -0.0229634 1 0 1 1 0 0 +EDGE2 8696 1036 0.0692025 -0.0122166 0.0158764 1 0 1 1 0 0 +EDGE2 8696 1037 1.06215 0.0593584 -0.020129 1 0 1 1 0 0 +EDGE2 8696 8337 0.892179 0.0184596 -0.010448 1 0 1 1 0 0 +EDGE2 8697 8336 -0.996715 0.0292294 0.00964896 1 0 1 1 0 0 +EDGE2 8697 8696 -0.978928 0.0157489 0.0217943 1 0 1 1 0 0 +EDGE2 8697 1036 -1.04432 0.0917233 -0.0338792 1 0 1 1 0 0 +EDGE2 8697 1037 -0.0721696 -0.00763506 -0.0156693 1 0 1 1 0 0 +EDGE2 8697 8337 -0.00895529 0.0232684 -0.0309589 1 0 1 1 0 0 +EDGE2 8697 1038 0.963722 -0.0128611 0.0506514 1 0 1 1 0 0 +EDGE2 8697 8338 0.946901 0.0799445 0.0109886 1 0 1 1 0 0 +EDGE2 8698 8339 0.917196 -0.00300614 -0.0137668 1 0 1 1 0 0 +EDGE2 8698 1037 -0.985831 -0.00411628 0.000651581 1 0 1 1 0 0 +EDGE2 8698 8697 -1.02442 -0.104466 0.0083126 1 0 1 1 0 0 +EDGE2 8698 8337 -1.00051 0.0291826 0.0162053 1 0 1 1 0 0 +EDGE2 8698 1038 -0.0143782 -0.0741043 0.0264295 1 0 1 1 0 0 +EDGE2 8698 8338 0.0365628 -0.0447491 0.0303466 1 0 1 1 0 0 +EDGE2 8698 1039 1.05456 0.0293511 0.0239486 1 0 1 1 0 0 +EDGE2 8699 8339 -0.111491 -0.0774598 -0.00657011 1 0 1 1 0 0 +EDGE2 8699 8698 -1.05938 -0.0371559 -0.032572 1 0 1 1 0 0 +EDGE2 8699 1038 -0.991735 0.0139916 0.0263729 1 0 1 1 0 0 +EDGE2 8699 8338 -1.04451 -0.0698543 0.00143169 1 0 1 1 0 0 +EDGE2 8699 1039 -0.0432111 0.0418977 0.0152205 1 0 1 1 0 0 +EDGE2 8699 1040 0.982165 -0.048243 -0.0126076 1 0 1 1 0 0 +EDGE2 8699 8340 0.934927 0.0347193 0.0183013 1 0 1 1 0 0 +EDGE2 8700 8339 -0.964121 0.00882382 0.0271535 1 0 1 1 0 0 +EDGE2 8700 8699 -0.993064 -0.0387361 -0.0281699 1 0 1 1 0 0 +EDGE2 8700 1039 -0.996159 0.0277999 0.00895483 1 0 1 1 0 0 +EDGE2 8700 1041 -0.00315802 1.04196 1.58134 1 0 1 1 0 0 +EDGE2 8700 8341 -0.0354057 0.926367 1.57355 1 0 1 1 0 0 +EDGE2 8700 1040 -0.0236207 -0.0757114 -0.0315887 1 0 1 1 0 0 +EDGE2 8700 8340 -0.0573426 0.000647286 -0.00287637 1 0 1 1 0 0 +EDGE2 8701 1041 0.0194351 -0.00317432 0.0334132 1 0 1 1 0 0 +EDGE2 8701 1042 0.977664 0.013328 0.0501086 1 0 1 1 0 0 +EDGE2 8701 8342 0.972437 -0.0301688 0.0207697 1 0 1 1 0 0 +EDGE2 8701 8341 0.0579526 -0.0256981 -0.00823831 1 0 1 1 0 0 +EDGE2 8701 1040 -0.988376 -0.0227795 -1.59879 1 0 1 1 0 0 +EDGE2 8701 8340 -0.996701 -0.00077912 -1.56279 1 0 1 1 0 0 +EDGE2 8701 8700 -0.989722 0.0859987 -1.58881 1 0 1 1 0 0 +EDGE2 8702 8343 0.947704 0.075021 -0.0194735 1 0 1 1 0 0 +EDGE2 8702 1043 0.997612 0.0443389 -0.00382501 1 0 1 1 0 0 +EDGE2 8702 1041 -0.940691 0.0137346 0.0174444 1 0 1 1 0 0 +EDGE2 8702 8701 -1.03564 0.0638074 0.000166642 1 0 1 1 0 0 +EDGE2 8702 1042 -0.0575115 -0.0489821 -0.0162379 1 0 1 1 0 0 +EDGE2 8702 8342 -0.0184577 0.0405258 -0.00561458 1 0 1 1 0 0 +EDGE2 8702 8341 -1.00898 0.0834386 0.0520716 1 0 1 1 0 0 +EDGE2 8703 8702 -1.10926 0.0253352 -0.00413004 1 0 1 1 0 0 +EDGE2 8703 8344 1.05417 0.00711261 0.0070106 1 0 1 1 0 0 +EDGE2 8703 8343 -0.0488074 -0.0904379 0.00351181 1 0 1 1 0 0 +EDGE2 8703 1044 1.03261 -0.073762 -0.0197866 1 0 1 1 0 0 +EDGE2 8703 1043 -0.0465501 0.0360666 -0.0362473 1 0 1 1 0 0 +EDGE2 8703 1042 -0.986261 0.0884628 0.0264032 1 0 1 1 0 0 +EDGE2 8703 8342 -1.08459 0.0765073 0.024847 1 0 1 1 0 0 +EDGE2 8704 8345 0.947517 0.0115063 -0.00685106 1 0 1 1 0 0 +EDGE2 8704 8665 1.00098 0.0220296 -3.13755 1 0 1 1 0 0 +EDGE2 8704 8685 1.07413 0.0388913 -3.14699 1 0 1 1 0 0 +EDGE2 8704 8405 1.00812 0.0142601 -3.13622 1 0 1 1 0 0 +EDGE2 8704 8344 -0.0439595 -0.120814 0.0215686 1 0 1 1 0 0 +EDGE2 8704 1045 1.09434 0.0102148 0.00646206 1 0 1 1 0 0 +EDGE2 8704 1085 0.895532 0.0319151 -3.21217 1 0 1 1 0 0 +EDGE2 8704 5865 0.942751 0.0456334 -3.15243 1 0 1 1 0 0 +EDGE2 8704 8343 -0.982133 0.0573522 0.00334895 1 0 1 1 0 0 +EDGE2 8704 8703 -1.01024 0.0197534 -0.0311223 1 0 1 1 0 0 +EDGE2 8704 1044 0.0318279 0.052433 -0.0360545 1 0 1 1 0 0 +EDGE2 8704 1043 -0.971937 0.0148785 -0.0295979 1 0 1 1 0 0 +EDGE2 8705 8345 0.0085778 -0.0304957 0.0208763 1 0 1 1 0 0 +EDGE2 8705 8686 -0.0741864 0.973388 1.55749 1 0 1 1 0 0 +EDGE2 8705 1046 -0.0327971 0.987894 1.58022 1 0 1 1 0 0 +EDGE2 8705 8664 1.01371 0.0576678 -3.12035 1 0 1 1 0 0 +EDGE2 8705 8684 1.01999 0.0149614 -3.1546 1 0 1 1 0 0 +EDGE2 8705 1084 1.01337 -0.0165928 -3.13217 1 0 1 1 0 0 +EDGE2 8705 5864 1.0119 0.0262091 -3.15045 1 0 1 1 0 0 +EDGE2 8705 8404 1.00697 -0.0707445 -3.13173 1 0 1 1 0 0 +EDGE2 8705 8665 -0.00586476 0.00195827 -3.11902 1 0 1 1 0 0 +EDGE2 8705 8685 0.0549462 -0.0540941 -3.09928 1 0 1 1 0 0 +EDGE2 8705 8405 0.0516614 0.0397909 -3.1457 1 0 1 1 0 0 +EDGE2 8705 8344 -1.03461 -0.0631473 -0.0244423 1 0 1 1 0 0 +EDGE2 8705 1045 -0.015501 0.0611363 0.00997073 1 0 1 1 0 0 +EDGE2 8705 1085 -0.0628812 0.052428 -3.13152 1 0 1 1 0 0 +EDGE2 8705 5865 0.0201051 -0.0637188 -3.17886 1 0 1 1 0 0 +EDGE2 8705 8704 -1.13492 0.00374351 0.0109569 1 0 1 1 0 0 +EDGE2 8705 1044 -1.02708 -0.0812658 0.0392873 1 0 1 1 0 0 +EDGE2 8705 8346 0.0121762 -0.945271 -1.56981 1 0 1 1 0 0 +EDGE2 8705 8666 0.0106606 -0.956718 -1.54727 1 0 1 1 0 0 +EDGE2 8705 8406 0.0180503 -0.964095 -1.60106 1 0 1 1 0 0 +EDGE2 8705 1086 -0.018081 -1.01442 -1.6045 1 0 1 1 0 0 +EDGE2 8705 5866 -0.0211005 -1.06388 -1.5745 1 0 1 1 0 0 +EDGE2 8706 8345 -0.956936 0.0877365 1.57057 1 0 1 1 0 0 +EDGE2 8706 8705 -1.04935 0.00092246 1.56343 1 0 1 1 0 0 +EDGE2 8706 8665 -1.00203 -0.0237601 -1.55778 1 0 1 1 0 0 +EDGE2 8706 8685 -1.02425 0.0234143 -1.55234 1 0 1 1 0 0 +EDGE2 8706 8405 -0.913836 0.0453249 -1.58357 1 0 1 1 0 0 +EDGE2 8706 1045 -0.850943 -0.0354465 1.55569 1 0 1 1 0 0 +EDGE2 8706 1085 -1.05284 -0.0289426 -1.57941 1 0 1 1 0 0 +EDGE2 8706 5865 -0.981535 -0.0221611 -1.5667 1 0 1 1 0 0 +EDGE2 8706 8667 1.0023 -0.0155695 0.0136054 1 0 1 1 0 0 +EDGE2 8706 8346 0.00576556 0.0164555 -0.0234292 1 0 1 1 0 0 +EDGE2 8706 8666 -0.0502093 0.0100824 -0.00873461 1 0 1 1 0 0 +EDGE2 8706 8406 -0.0315012 0.0513953 0.00832083 1 0 1 1 0 0 +EDGE2 8706 1086 0.00342352 0.00345537 -0.00473698 1 0 1 1 0 0 +EDGE2 8706 5866 0.0134301 0.0442709 0.00240399 1 0 1 1 0 0 +EDGE2 8706 8407 0.955015 -0.0349962 0.00260898 1 0 1 1 0 0 +EDGE2 8706 5867 0.963105 -0.023772 0.0163276 1 0 1 1 0 0 +EDGE2 8706 8347 1.09667 0.0363674 -0.0250773 1 0 1 1 0 0 +EDGE2 8706 1087 0.990842 -0.0282959 -0.0199152 1 0 1 1 0 0 +EDGE2 8707 8667 -0.0348681 -0.046791 -0.00755297 1 0 1 1 0 0 +EDGE2 8707 8346 -0.997051 -0.0773153 -0.0174743 1 0 1 1 0 0 +EDGE2 8707 8666 -0.969629 0.0275169 0.0382175 1 0 1 1 0 0 +EDGE2 8707 8706 -1.04816 0.0311893 -0.0232122 1 0 1 1 0 0 +EDGE2 8707 8406 -0.993757 0.0908657 0.0243017 1 0 1 1 0 0 +EDGE2 8707 1086 -0.924261 0.0125363 -0.000430107 1 0 1 1 0 0 +EDGE2 8707 5866 -0.985652 -0.0258872 -0.0431209 1 0 1 1 0 0 +EDGE2 8707 8407 -0.0835402 0.0835011 0.0615931 1 0 1 1 0 0 +EDGE2 8707 5867 0.0362701 0.00349151 -0.017222 1 0 1 1 0 0 +EDGE2 8707 8347 -0.0401889 -0.0482514 0.0026409 1 0 1 1 0 0 +EDGE2 8707 1087 -0.0721473 0.0544695 0.0202961 1 0 1 1 0 0 +EDGE2 8707 8348 1.07331 -0.035467 0.0173399 1 0 1 1 0 0 +EDGE2 8707 8408 0.927027 -0.0206192 0.009298 1 0 1 1 0 0 +EDGE2 8707 8668 1.07811 0.00116105 -0.0178211 1 0 1 1 0 0 +EDGE2 8707 1088 1.03815 -0.0540115 0.00248801 1 0 1 1 0 0 +EDGE2 8707 5868 0.978257 0.101995 -0.00738245 1 0 1 1 0 0 +EDGE2 8708 8667 -1.03682 -0.019003 -0.00478842 1 0 1 1 0 0 +EDGE2 8708 8707 -1.06601 -0.00467032 -0.0600297 1 0 1 1 0 0 +EDGE2 8708 8407 -0.950286 -0.0326324 0.0419815 1 0 1 1 0 0 +EDGE2 8708 5867 -0.980112 0.012431 0.00476083 1 0 1 1 0 0 +EDGE2 8708 8347 -0.999136 -0.0376564 0.0299496 1 0 1 1 0 0 +EDGE2 8708 1087 -0.923867 0.00543283 -0.018137 1 0 1 1 0 0 +EDGE2 8708 8348 -0.0624748 -0.0381516 -0.0159238 1 0 1 1 0 0 +EDGE2 8708 8408 0.0780111 -0.089931 0.0030081 1 0 1 1 0 0 +EDGE2 8708 8668 0.0313258 0.00736383 -0.0058283 1 0 1 1 0 0 +EDGE2 8708 8669 0.967743 0.0173294 -0.00432954 1 0 1 1 0 0 +EDGE2 8708 1088 0.0337382 -0.0460167 0.00318384 1 0 1 1 0 0 +EDGE2 8708 5868 -0.0517212 -0.0312536 -0.000917074 1 0 1 1 0 0 +EDGE2 8708 5869 1.0408 -0.0254759 -0.0114939 1 0 1 1 0 0 +EDGE2 8708 8349 1.02566 -0.00371595 -0.0366818 1 0 1 1 0 0 +EDGE2 8708 8409 1.03723 0.0373983 -0.0262161 1 0 1 1 0 0 +EDGE2 8708 1089 1.00747 -0.0765834 0.0153197 1 0 1 1 0 0 +EDGE2 8709 8348 -0.955811 -0.00689905 0.0307425 1 0 1 1 0 0 +EDGE2 8709 8408 -0.939248 0.00296044 0.0101994 1 0 1 1 0 0 +EDGE2 8709 8668 -1.08992 0.0640626 0.012219 1 0 1 1 0 0 +EDGE2 8709 8708 -1.0092 0.00189891 0.0240417 1 0 1 1 0 0 +EDGE2 8709 8669 -0.0359869 0.0846039 -0.015545 1 0 1 1 0 0 +EDGE2 8709 1088 -0.994492 -0.0222425 0.00314094 1 0 1 1 0 0 +EDGE2 8709 5868 -1.02168 -0.0279898 -0.0476505 1 0 1 1 0 0 +EDGE2 8709 5869 0.0584615 -0.00490764 0.0197058 1 0 1 1 0 0 +EDGE2 8709 8349 -0.0386723 -0.0411224 0.013372 1 0 1 1 0 0 +EDGE2 8709 8409 0.0506342 -0.111691 0.0175734 1 0 1 1 0 0 +EDGE2 8709 1089 -0.014087 -0.00137561 -0.0322311 1 0 1 1 0 0 +EDGE2 8709 8670 1.09472 0.011193 -0.0164629 1 0 1 1 0 0 +EDGE2 8709 5870 1.0299 -0.0334662 0.000549293 1 0 1 1 0 0 +EDGE2 8709 8350 1.03496 0.0101702 0.0329268 1 0 1 1 0 0 +EDGE2 8709 8410 1.04253 -0.0556998 -0.0113737 1 0 1 1 0 0 +EDGE2 8709 1090 0.969917 0.0152848 -0.0422648 1 0 1 1 0 0 +EDGE2 8710 8669 -1.0287 0.00204943 0.0148661 1 0 1 1 0 0 +EDGE2 8710 8709 -0.955655 0.0786743 0.00553691 1 0 1 1 0 0 +EDGE2 8710 5869 -0.944526 -0.088345 0.0312209 1 0 1 1 0 0 +EDGE2 8710 8349 -1.03286 0.0516366 -0.00653846 1 0 1 1 0 0 +EDGE2 8710 8409 -1.0216 -0.0142079 0.00110131 1 0 1 1 0 0 +EDGE2 8710 1089 -1.10309 0.000211392 -0.0217253 1 0 1 1 0 0 +EDGE2 8710 8670 -0.00855077 0.067776 -0.00260327 1 0 1 1 0 0 +EDGE2 8710 8351 0.0994047 1.07772 1.54257 1 0 1 1 0 0 +EDGE2 8710 8671 0.0151113 1.00243 1.56955 1 0 1 1 0 0 +EDGE2 8710 8411 -0.0405603 1.03991 1.61402 1 0 1 1 0 0 +EDGE2 8710 1091 0.0260501 1.03984 1.61831 1 0 1 1 0 0 +EDGE2 8710 5871 0.0207518 1.0463 1.55173 1 0 1 1 0 0 +EDGE2 8710 5870 0.0137589 -0.0372586 -0.0212871 1 0 1 1 0 0 +EDGE2 8710 8350 0.0837314 -0.0197585 -0.0226663 1 0 1 1 0 0 +EDGE2 8710 8410 0.0434762 0.0330819 -0.0223977 1 0 1 1 0 0 +EDGE2 8710 1090 0.0398498 0.0176788 -0.00738306 1 0 1 1 0 0 +EDGE2 8711 1092 0.952287 -0.114814 -0.0246262 1 0 1 1 0 0 +EDGE2 8711 8672 1.06166 0.0310348 -0.0040634 1 0 1 1 0 0 +EDGE2 8711 8352 0.943066 -0.00944182 -0.00423625 1 0 1 1 0 0 +EDGE2 8711 8412 1.0359 -0.0203852 0.00698652 1 0 1 1 0 0 +EDGE2 8711 5872 0.965275 0.0139794 0.00438067 1 0 1 1 0 0 +EDGE2 8711 8670 -0.964455 -0.09077 -1.55856 1 0 1 1 0 0 +EDGE2 8711 8351 0.0171326 0.0317578 -0.0125871 1 0 1 1 0 0 +EDGE2 8711 8671 0.0166107 -0.0538884 0.0216664 1 0 1 1 0 0 +EDGE2 8711 8411 -0.0424653 -0.0608791 0.019209 1 0 1 1 0 0 +EDGE2 8711 1091 -0.00549915 -0.0346439 -0.0377347 1 0 1 1 0 0 +EDGE2 8711 5871 -0.0464707 -0.0444829 -0.00285122 1 0 1 1 0 0 +EDGE2 8711 8710 -0.977182 -0.0123889 -1.57404 1 0 1 1 0 0 +EDGE2 8711 5870 -1.03999 -0.00322327 -1.60158 1 0 1 1 0 0 +EDGE2 8711 8350 -1.01946 0.0246375 -1.6001 1 0 1 1 0 0 +EDGE2 8711 8410 -1.00668 0.000692886 -1.54754 1 0 1 1 0 0 +EDGE2 8711 1090 -0.949914 0.0562874 -1.55283 1 0 1 1 0 0 +EDGE2 8712 1092 0.0177236 0.0498854 0.016739 1 0 1 1 0 0 +EDGE2 8712 8353 0.992028 0.00206567 -0.0151694 1 0 1 1 0 0 +EDGE2 8712 8673 1.03731 -0.0153754 0.0401 1 0 1 1 0 0 +EDGE2 8712 8413 0.949441 -0.0360641 -0.0153917 1 0 1 1 0 0 +EDGE2 8712 8672 -0.0197483 -0.00437719 0.0039941 1 0 1 1 0 0 +EDGE2 8712 1093 0.982102 0.0116266 0.01583 1 0 1 1 0 0 +EDGE2 8712 5873 1.01389 -0.043345 -0.0112187 1 0 1 1 0 0 +EDGE2 8712 8352 -0.0251251 0.0695135 0.0305787 1 0 1 1 0 0 +EDGE2 8712 8412 -0.0483473 -0.0123806 0.0100394 1 0 1 1 0 0 +EDGE2 8712 5872 -0.0312714 0.00171246 0.00513595 1 0 1 1 0 0 +EDGE2 8712 8351 -1.09256 0.00907444 -0.0321752 1 0 1 1 0 0 +EDGE2 8712 8671 -0.930906 0.0772332 -0.00325907 1 0 1 1 0 0 +EDGE2 8712 8711 -0.991164 -0.030895 0.00954475 1 0 1 1 0 0 +EDGE2 8712 8411 -0.964796 0.00983977 0.0201823 1 0 1 1 0 0 +EDGE2 8712 1091 -1.04002 0.00897877 -0.00857867 1 0 1 1 0 0 +EDGE2 8712 5871 -1.08389 -0.00214198 -0.00913524 1 0 1 1 0 0 +EDGE2 8713 1092 -1.04119 -0.00530192 0.000203928 1 0 1 1 0 0 +EDGE2 8713 8353 -0.107441 -0.128397 0.00827898 1 0 1 1 0 0 +EDGE2 8713 1094 1.03766 0.0226105 -0.0166624 1 0 1 1 0 0 +EDGE2 8713 8354 1.01283 -0.0949208 -0.0192556 1 0 1 1 0 0 +EDGE2 8713 8414 0.953432 -0.094465 -0.0204594 1 0 1 1 0 0 +EDGE2 8713 8674 1.04451 -0.00976936 -0.00170237 1 0 1 1 0 0 +EDGE2 8713 5874 1.02975 -0.0449079 -0.00589994 1 0 1 1 0 0 +EDGE2 8713 8673 -0.0759618 -0.0492352 -0.0315004 1 0 1 1 0 0 +EDGE2 8713 8413 0.00728696 -0.0730304 -0.0176952 1 0 1 1 0 0 +EDGE2 8713 8672 -0.980213 -0.0132651 -0.0119856 1 0 1 1 0 0 +EDGE2 8713 1093 0.00548208 -0.0536688 0.00817622 1 0 1 1 0 0 +EDGE2 8713 5873 0.0590549 -0.043258 -0.0137146 1 0 1 1 0 0 +EDGE2 8713 8712 -0.920754 0.00759397 -0.0132543 1 0 1 1 0 0 +EDGE2 8713 8352 -1.02117 -0.0973645 0.00192398 1 0 1 1 0 0 +EDGE2 8713 8412 -1.02608 0.0636359 -0.00336035 1 0 1 1 0 0 +EDGE2 8713 5872 -1.07581 -0.032208 0.0160528 1 0 1 1 0 0 +EDGE2 8714 5795 0.994263 0.0109072 -3.13104 1 0 1 1 0 0 +EDGE2 8714 8395 0.973937 -0.0731843 -3.16035 1 0 1 1 0 0 +EDGE2 8714 8555 1.05612 0.00759047 -3.14955 1 0 1 1 0 0 +EDGE2 8714 8675 0.955512 0.00125457 -0.0142276 1 0 1 1 0 0 +EDGE2 8714 8415 0.93573 0.0648849 -0.00739749 1 0 1 1 0 0 +EDGE2 8714 5875 0.963108 -0.0782423 -0.00934613 1 0 1 1 0 0 +EDGE2 8714 8355 1.03715 -0.00489387 -0.00689343 1 0 1 1 0 0 +EDGE2 8714 5855 1.07704 -0.00318368 -3.16173 1 0 1 1 0 0 +EDGE2 8714 3035 1.00643 -0.0387888 -3.14752 1 0 1 1 0 0 +EDGE2 8714 3055 0.937932 0.103692 -3.13157 1 0 1 1 0 0 +EDGE2 8714 1095 1.01295 0.0840411 0.00669988 1 0 1 1 0 0 +EDGE2 8714 1115 1.02509 0.0212171 -3.11457 1 0 1 1 0 0 +EDGE2 8714 1135 1.05759 -0.0114608 -3.14926 1 0 1 1 0 0 +EDGE2 8714 8353 -0.997559 0.0281063 -0.0114141 1 0 1 1 0 0 +EDGE2 8714 1094 -0.0301346 -0.00202841 0.0187761 1 0 1 1 0 0 +EDGE2 8714 8354 -0.00615301 -0.0114898 0.010245 1 0 1 1 0 0 +EDGE2 8714 8414 -0.0254805 -0.00887486 -0.0150048 1 0 1 1 0 0 +EDGE2 8714 8674 0.00501393 -0.0149687 0.000260196 1 0 1 1 0 0 +EDGE2 8714 5874 0.0275523 0.0909346 0.00273125 1 0 1 1 0 0 +EDGE2 8714 8673 -0.999923 0.000885586 -0.0107178 1 0 1 1 0 0 +EDGE2 8714 8713 -0.982146 -0.0343016 -0.00241732 1 0 1 1 0 0 +EDGE2 8714 8413 -0.969714 -0.0201837 0.0064177 1 0 1 1 0 0 +EDGE2 8714 1093 -0.944191 -0.00182885 0.00729893 1 0 1 1 0 0 +EDGE2 8714 5873 -1.05653 0.0109639 0.0126532 1 0 1 1 0 0 +EDGE2 8715 5795 -0.0346831 -0.0040748 -3.14813 1 0 1 1 0 0 +EDGE2 8715 8356 -0.0217823 0.944952 1.56047 1 0 1 1 0 0 +EDGE2 8715 8416 0.00390218 1.0208 1.56496 1 0 1 1 0 0 +EDGE2 8715 8676 -0.0726877 1.06202 1.57513 1 0 1 1 0 0 +EDGE2 8715 8396 -0.0147967 1.00711 1.60455 1 0 1 1 0 0 +EDGE2 8715 5856 0.0643821 1.00762 1.58044 1 0 1 1 0 0 +EDGE2 8715 5876 0.0538104 1.02639 1.57435 1 0 1 1 0 0 +EDGE2 8715 3056 0.0236184 0.950463 1.58528 1 0 1 1 0 0 +EDGE2 8715 5794 1.0504 -0.0405477 -3.17921 1 0 1 1 0 0 +EDGE2 8715 8394 0.941321 -0.0037846 -3.15 1 0 1 1 0 0 +EDGE2 8715 8554 1.05382 0.0553084 -3.13446 1 0 1 1 0 0 +EDGE2 8715 5854 0.988412 0.0182671 -3.16177 1 0 1 1 0 0 +EDGE2 8715 1134 1.05745 -0.0180051 -3.12263 1 0 1 1 0 0 +EDGE2 8715 3034 0.992619 0.0427781 -3.16399 1 0 1 1 0 0 +EDGE2 8715 3054 1.01632 0.0351186 -3.16863 1 0 1 1 0 0 +EDGE2 8715 1114 0.971097 0.044872 -3.12822 1 0 1 1 0 0 +EDGE2 8715 8395 -0.0261517 0.0408305 -3.11293 1 0 1 1 0 0 +EDGE2 8715 8555 -0.00513805 0.0297262 -3.14041 1 0 1 1 0 0 +EDGE2 8715 8675 -0.0489703 0.0258428 -0.00523276 1 0 1 1 0 0 +EDGE2 8715 8415 -0.0316873 -0.0425676 0.00156208 1 0 1 1 0 0 +EDGE2 8715 5875 0.0205133 -0.00739923 -0.0242957 1 0 1 1 0 0 +EDGE2 8715 8355 -0.0414653 0.0212512 -0.000406129 1 0 1 1 0 0 +EDGE2 8715 5855 -0.0166206 0.0518636 -3.15718 1 0 1 1 0 0 +EDGE2 8715 8714 -1.03634 0.0369944 0.014358 1 0 1 1 0 0 +EDGE2 8715 3035 0.0335625 -0.0582724 -3.14154 1 0 1 1 0 0 +EDGE2 8715 3055 0.0106944 0.0409574 -3.14788 1 0 1 1 0 0 +EDGE2 8715 1095 0.044438 0.0794339 0.0101159 1 0 1 1 0 0 +EDGE2 8715 1115 0.047996 0.0206643 -3.16871 1 0 1 1 0 0 +EDGE2 8715 1135 -0.00557782 0.0157569 -3.14721 1 0 1 1 0 0 +EDGE2 8715 1094 -0.958542 -0.0641298 0.0104506 1 0 1 1 0 0 +EDGE2 8715 8354 -0.967654 0.0333328 0.00702198 1 0 1 1 0 0 +EDGE2 8715 8414 -1.02905 0.0155102 -0.0184743 1 0 1 1 0 0 +EDGE2 8715 8674 -1.06991 -0.0186338 -0.0254639 1 0 1 1 0 0 +EDGE2 8715 5874 -1.03531 0.0640386 -0.0127336 1 0 1 1 0 0 +EDGE2 8715 1116 -0.0824898 -1.09402 -1.57257 1 0 1 1 0 0 +EDGE2 8715 3036 -0.00804158 -1.06248 -1.53841 1 0 1 1 0 0 +EDGE2 8715 5796 -0.00308501 -1.01072 -1.58659 1 0 1 1 0 0 +EDGE2 8715 8556 0.027632 -0.938806 -1.58917 1 0 1 1 0 0 +EDGE2 8715 1136 -0.0035592 -1.05023 -1.55276 1 0 1 1 0 0 +EDGE2 8715 1096 0.0841399 -1.01638 -1.54807 1 0 1 1 0 0 +EDGE2 8716 5795 -1.01603 -0.00885934 1.57368 1 0 1 1 0 0 +EDGE2 8716 5877 1.01186 0.0186189 0.014156 1 0 1 1 0 0 +EDGE2 8716 8397 0.989253 -0.0565052 0.00964636 1 0 1 1 0 0 +EDGE2 8716 8417 0.971801 -0.0314282 -0.00569509 1 0 1 1 0 0 +EDGE2 8716 8677 0.938826 0.0189593 0.00478837 1 0 1 1 0 0 +EDGE2 8716 8357 0.983525 -0.0355875 0.0219149 1 0 1 1 0 0 +EDGE2 8716 3057 1.01263 0.0923618 -0.021864 1 0 1 1 0 0 +EDGE2 8716 5857 1.05508 0.0448134 0.0293192 1 0 1 1 0 0 +EDGE2 8716 8356 0.00334529 -0.00634109 0.00506205 1 0 1 1 0 0 +EDGE2 8716 8416 -0.0339145 -0.053478 -0.0190023 1 0 1 1 0 0 +EDGE2 8716 8676 -0.0120652 -0.0429045 -0.00183031 1 0 1 1 0 0 +EDGE2 8716 8396 0.0409882 0.119659 -0.0169471 1 0 1 1 0 0 +EDGE2 8716 5856 0.0125549 -0.0571789 0.0438779 1 0 1 1 0 0 +EDGE2 8716 5876 -0.114571 -0.0273233 0.0230483 1 0 1 1 0 0 +EDGE2 8716 3056 0.0438671 0.0470948 0.0112771 1 0 1 1 0 0 +EDGE2 8716 8395 -1.06923 0.00767195 1.60556 1 0 1 1 0 0 +EDGE2 8716 8555 -0.990068 0.0615746 1.53677 1 0 1 1 0 0 +EDGE2 8716 8675 -1.1246 0.00863408 -1.55992 1 0 1 1 0 0 +EDGE2 8716 8715 -1.0149 0.0407546 -1.57413 1 0 1 1 0 0 +EDGE2 8716 8415 -0.977817 -0.0278843 -1.5641 1 0 1 1 0 0 +EDGE2 8716 5875 -0.967576 -0.0279092 -1.56606 1 0 1 1 0 0 +EDGE2 8716 8355 -1.02866 0.0517219 -1.57407 1 0 1 1 0 0 +EDGE2 8716 5855 -0.991621 0.00428316 1.5547 1 0 1 1 0 0 +EDGE2 8716 3035 -1.00736 0.00296489 1.56027 1 0 1 1 0 0 +EDGE2 8716 3055 -1.00279 0.0288645 1.58271 1 0 1 1 0 0 +EDGE2 8716 1095 -1.11653 0.0461612 -1.562 1 0 1 1 0 0 +EDGE2 8716 1115 -0.911716 -0.0147516 1.5681 1 0 1 1 0 0 +EDGE2 8716 1135 -1.00477 -0.0455286 1.59742 1 0 1 1 0 0 +EDGE2 8717 8358 1.06298 -0.0360038 -0.0183322 1 0 1 1 0 0 +EDGE2 8717 8418 1.03016 0.0137791 0.0108052 1 0 1 1 0 0 +EDGE2 8717 8678 0.935703 -0.0318973 -0.0433098 1 0 1 1 0 0 +EDGE2 8717 8398 0.948146 0.0111615 0.00186868 1 0 1 1 0 0 +EDGE2 8717 3058 1.0308 0.0687384 -0.0228595 1 0 1 1 0 0 +EDGE2 8717 5858 1.03327 0.0431967 0.0257647 1 0 1 1 0 0 +EDGE2 8717 5878 0.993075 -0.0714233 -3.1989e-05 1 0 1 1 0 0 +EDGE2 8717 5877 0.0162021 0.0212795 0.025728 1 0 1 1 0 0 +EDGE2 8717 8397 -0.0156753 0.000895227 0.0102312 1 0 1 1 0 0 +EDGE2 8717 8417 -0.00656134 -0.0300822 0.0314252 1 0 1 1 0 0 +EDGE2 8717 8677 0.0492749 0.0488941 -0.0427843 1 0 1 1 0 0 +EDGE2 8717 8357 -0.0369343 0.0336045 0.0388981 1 0 1 1 0 0 +EDGE2 8717 3057 -0.0125606 -0.0679411 0.00611615 1 0 1 1 0 0 +EDGE2 8717 5857 0.0233706 0.0146872 -0.0199279 1 0 1 1 0 0 +EDGE2 8717 8356 -0.990925 0.00851864 0.00980415 1 0 1 1 0 0 +EDGE2 8717 8416 -1.01331 0.0427231 -0.0315345 1 0 1 1 0 0 +EDGE2 8717 8676 -1.07009 -0.00907646 0.0244554 1 0 1 1 0 0 +EDGE2 8717 8716 -0.994299 -0.0254018 -0.00232979 1 0 1 1 0 0 +EDGE2 8717 8396 -1.02649 -0.0304007 -0.00450648 1 0 1 1 0 0 +EDGE2 8717 5856 -1.0008 -0.0725776 0.00396707 1 0 1 1 0 0 +EDGE2 8717 5876 -1.08247 0.0298591 -0.00518145 1 0 1 1 0 0 +EDGE2 8717 3056 -1.04174 0.0683052 -0.00395634 1 0 1 1 0 0 +EDGE2 8718 8717 -0.930106 0.0191669 0.0218522 1 0 1 1 0 0 +EDGE2 8718 8399 1.01059 0.0570856 -0.0455413 1 0 1 1 0 0 +EDGE2 8718 8679 0.943374 0.0623114 -0.0107089 1 0 1 1 0 0 +EDGE2 8718 8419 0.94922 0.087092 0.00365589 1 0 1 1 0 0 +EDGE2 8718 5859 0.959656 0.0955224 0.0598974 1 0 1 1 0 0 +EDGE2 8718 5879 1.0338 -0.0571788 0.0104902 1 0 1 1 0 0 +EDGE2 8718 8359 1.02592 -0.000679962 -0.0183837 1 0 1 1 0 0 +EDGE2 8718 3059 1.02795 -0.0371661 -0.0243374 1 0 1 1 0 0 +EDGE2 8718 8358 -0.0285947 -0.036808 -0.00116151 1 0 1 1 0 0 +EDGE2 8718 8418 -0.0689437 -0.0364814 0.012775 1 0 1 1 0 0 +EDGE2 8718 8678 -0.0203427 -0.00863814 -0.0113008 1 0 1 1 0 0 +EDGE2 8718 8398 -0.0050217 0.0352372 -0.00164 1 0 1 1 0 0 +EDGE2 8718 3058 -0.0392854 0.0363502 0.0300064 1 0 1 1 0 0 +EDGE2 8718 5858 -0.0522049 -0.0207118 -0.00712736 1 0 1 1 0 0 +EDGE2 8718 5878 -0.0531695 0.000997709 -0.00685037 1 0 1 1 0 0 +EDGE2 8718 5877 -1.05576 -0.00933082 -0.000101011 1 0 1 1 0 0 +EDGE2 8718 8397 -0.991493 -0.0625791 0.00727386 1 0 1 1 0 0 +EDGE2 8718 8417 -0.97445 0.0297139 0.010998 1 0 1 1 0 0 +EDGE2 8718 8677 -0.891269 -0.00439178 0.0178933 1 0 1 1 0 0 +EDGE2 8718 8357 -1.01934 -0.0967916 0.0325449 1 0 1 1 0 0 +EDGE2 8718 3057 -0.974784 0.00426966 -0.0030798 1 0 1 1 0 0 +EDGE2 8718 5857 -0.981184 -0.0633683 -0.00736042 1 0 1 1 0 0 +EDGE2 8719 8360 1.03621 -0.0321909 0.00559429 1 0 1 1 0 0 +EDGE2 8719 8480 0.954378 -0.0272819 -3.15379 1 0 1 1 0 0 +EDGE2 8719 8660 0.989635 0.0146422 -3.12835 1 0 1 1 0 0 +EDGE2 8719 8680 1.01729 0.0104124 0.00922867 1 0 1 1 0 0 +EDGE2 8719 8620 1.00245 0.0354444 -3.14315 1 0 1 1 0 0 +EDGE2 8719 8400 1.02692 -0.00484631 -0.0240551 1 0 1 1 0 0 +EDGE2 8719 8420 0.979991 -0.0570159 0.0145257 1 0 1 1 0 0 +EDGE2 8719 8380 1.02896 -0.0177379 -3.1776 1 0 1 1 0 0 +EDGE2 8719 3060 0.978992 -0.0136113 0.0205376 1 0 1 1 0 0 +EDGE2 8719 3160 0.956524 0.0158108 -3.1168 1 0 1 1 0 0 +EDGE2 8719 5860 0.920046 -0.0641848 0.0142429 1 0 1 1 0 0 +EDGE2 8719 5880 1.04959 -0.0557107 0.00894344 1 0 1 1 0 0 +EDGE2 8719 3080 1.04706 -0.0505159 -3.12858 1 0 1 1 0 0 +EDGE2 8719 1080 1.01113 -0.0129861 -3.1216 1 0 1 1 0 0 +EDGE2 8719 8399 0.0462257 -0.000667885 0.0154317 1 0 1 1 0 0 +EDGE2 8719 8679 0.0303579 -0.0418427 0.0158777 1 0 1 1 0 0 +EDGE2 8719 8419 -0.0513776 -0.0475828 0.0205146 1 0 1 1 0 0 +EDGE2 8719 5859 -0.00701307 0.00827502 -0.0347805 1 0 1 1 0 0 +EDGE2 8719 5879 0.0237306 0.0110725 0.0215156 1 0 1 1 0 0 +EDGE2 8719 8359 -0.0971624 -0.00993081 0.0204311 1 0 1 1 0 0 +EDGE2 8719 3059 0.0314165 -0.0217714 0.0194098 1 0 1 1 0 0 +EDGE2 8719 8358 -1.08392 0.0564785 -0.0154535 1 0 1 1 0 0 +EDGE2 8719 8418 -0.968454 -0.0314793 -0.011343 1 0 1 1 0 0 +EDGE2 8719 8678 -1.03494 -0.0339759 -0.0187475 1 0 1 1 0 0 +EDGE2 8719 8718 -0.984037 0.0116333 0.0137005 1 0 1 1 0 0 +EDGE2 8719 8398 -0.954634 0.0317788 0.0460893 1 0 1 1 0 0 +EDGE2 8719 3058 -0.998054 -0.0224069 0.003423 1 0 1 1 0 0 +EDGE2 8719 5858 -0.945529 -0.0112327 0.0172383 1 0 1 1 0 0 +EDGE2 8719 5878 -1.09051 0.0518331 -0.0174612 1 0 1 1 0 0 +EDGE2 8720 8360 0.0275385 0.0174321 0.0121524 1 0 1 1 0 0 +EDGE2 8720 8379 1.0016 0.0307087 -3.11977 1 0 1 1 0 0 +EDGE2 8720 8619 1.02896 -0.0307343 -3.15118 1 0 1 1 0 0 +EDGE2 8720 8659 0.986773 -0.0467496 -3.1365 1 0 1 1 0 0 +EDGE2 8720 8479 0.986519 -0.0152927 -3.13485 1 0 1 1 0 0 +EDGE2 8720 3079 0.935712 0.0967879 -3.14333 1 0 1 1 0 0 +EDGE2 8720 3159 1.03977 -0.0552194 -3.15663 1 0 1 1 0 0 +EDGE2 8720 1079 0.985939 -0.0152424 -3.12451 1 0 1 1 0 0 +EDGE2 8720 8361 -0.0456679 -0.937277 -1.57919 1 0 1 1 0 0 +EDGE2 8720 8421 -0.0167824 -0.997197 -1.58612 1 0 1 1 0 0 +EDGE2 8720 8481 0.0564728 -0.975749 -1.54675 1 0 1 1 0 0 +EDGE2 8720 8621 0.0781951 -0.986008 -1.58722 1 0 1 1 0 0 +EDGE2 8720 8381 0.0058636 -0.991847 -1.57569 1 0 1 1 0 0 +EDGE2 8720 3081 -0.0686823 -1.00918 -1.58819 1 0 1 1 0 0 +EDGE2 8720 3161 -0.0331936 -0.944772 -1.54016 1 0 1 1 0 0 +EDGE2 8720 5881 0.0179173 -1.02197 -1.57876 1 0 1 1 0 0 +EDGE2 8720 3061 0.149253 -0.972161 -1.56901 1 0 1 1 0 0 +EDGE2 8720 8480 0.0790088 -0.0328717 -3.12544 1 0 1 1 0 0 +EDGE2 8720 8660 0.0337588 0.0222537 -3.14371 1 0 1 1 0 0 +EDGE2 8720 8680 0.0409306 0.0479648 -0.0263369 1 0 1 1 0 0 +EDGE2 8720 8620 0.0481948 -0.0460204 -3.14358 1 0 1 1 0 0 +EDGE2 8720 8400 -0.0976163 -0.0248923 0.0230213 1 0 1 1 0 0 +EDGE2 8720 8420 -0.0197729 0.0578602 0.00131137 1 0 1 1 0 0 +EDGE2 8720 8380 0.00856841 0.0317061 -3.13943 1 0 1 1 0 0 +EDGE2 8720 8401 -0.0159398 1.07435 1.5483 1 0 1 1 0 0 +EDGE2 8720 3060 0.124469 0.00696632 -0.0236606 1 0 1 1 0 0 +EDGE2 8720 3160 -0.0682938 -0.0140974 -3.13926 1 0 1 1 0 0 +EDGE2 8720 5860 0.0720601 -0.0175476 0.00851228 1 0 1 1 0 0 +EDGE2 8720 5880 0.0614569 -0.0144492 -0.0168214 1 0 1 1 0 0 +EDGE2 8720 3080 -0.00748511 0.0389152 -3.13478 1 0 1 1 0 0 +EDGE2 8720 8681 0.0751635 0.972388 1.557 1 0 1 1 0 0 +EDGE2 8720 1080 -0.0243828 0.0126356 -3.16897 1 0 1 1 0 0 +EDGE2 8720 8661 -0.0266841 0.981465 1.5588 1 0 1 1 0 0 +EDGE2 8720 1081 0.0191684 0.972158 1.57964 1 0 1 1 0 0 +EDGE2 8720 5861 -0.0380845 1.08283 1.59321 1 0 1 1 0 0 +EDGE2 8720 8399 -1.03857 0.0738109 -0.000815573 1 0 1 1 0 0 +EDGE2 8720 8679 -0.964623 0.0930261 0.0646604 1 0 1 1 0 0 +EDGE2 8720 8719 -0.969898 0.0284554 -0.00792341 1 0 1 1 0 0 +EDGE2 8720 8419 -0.943534 0.123964 0.01206 1 0 1 1 0 0 +EDGE2 8720 5859 -0.983398 -0.0601515 0.0139518 1 0 1 1 0 0 +EDGE2 8720 5879 -0.970095 0.0930828 0.018831 1 0 1 1 0 0 +EDGE2 8720 8359 -1.04501 0.0272762 -0.0314617 1 0 1 1 0 0 +EDGE2 8720 3059 -1.13472 -0.00644214 0.0240288 1 0 1 1 0 0 +EDGE2 8721 8360 -0.960899 -0.0269682 -1.56131 1 0 1 1 0 0 +EDGE2 8721 8480 -0.988106 -0.0285075 1.54712 1 0 1 1 0 0 +EDGE2 8721 8660 -0.980186 -0.0211226 1.5963 1 0 1 1 0 0 +EDGE2 8721 8680 -0.984976 0.014657 -1.57074 1 0 1 1 0 0 +EDGE2 8721 8720 -0.997307 -0.00996309 -1.61684 1 0 1 1 0 0 +EDGE2 8721 8620 -1.02368 0.052322 1.58481 1 0 1 1 0 0 +EDGE2 8721 8400 -0.962238 0.0656822 -1.5465 1 0 1 1 0 0 +EDGE2 8721 8420 -1.00127 -0.106562 -1.55801 1 0 1 1 0 0 +EDGE2 8721 8380 -1.04822 -0.0259186 1.57369 1 0 1 1 0 0 +EDGE2 8721 5862 1.05998 0.0441736 0.0143633 1 0 1 1 0 0 +EDGE2 8721 8401 -0.0038251 -0.100037 0.00185209 1 0 1 1 0 0 +EDGE2 8721 3060 -0.910932 0.0293996 -1.58018 1 0 1 1 0 0 +EDGE2 8721 3160 -1.04829 -0.0374319 1.61377 1 0 1 1 0 0 +EDGE2 8721 5860 -0.921646 0.0422802 -1.53662 1 0 1 1 0 0 +EDGE2 8721 5880 -1.0129 0.0343843 -1.57848 1 0 1 1 0 0 +EDGE2 8721 3080 -0.987344 0.025999 1.55392 1 0 1 1 0 0 +EDGE2 8721 8681 -0.00305689 -0.0170339 -0.0027727 1 0 1 1 0 0 +EDGE2 8721 1080 -1.00687 -0.0404534 1.56352 1 0 1 1 0 0 +EDGE2 8721 8661 0.0100585 -0.0272991 -0.0231658 1 0 1 1 0 0 +EDGE2 8721 1081 0.0662647 0.0161878 0.000391106 1 0 1 1 0 0 +EDGE2 8721 5861 0.0438121 -0.0722846 -0.00890161 1 0 1 1 0 0 +EDGE2 8721 8662 1.00424 -0.00514743 0.0158795 1 0 1 1 0 0 +EDGE2 8721 8682 1.05646 0.0215362 0.0191599 1 0 1 1 0 0 +EDGE2 8721 8402 0.960915 -0.0308481 0.00865666 1 0 1 1 0 0 +EDGE2 8721 1082 0.911466 0.0105945 -0.0134086 1 0 1 1 0 0 +EDGE2 8722 5862 -0.0734879 0.0106955 0.00174448 1 0 1 1 0 0 +EDGE2 8722 8401 -1.05032 0.0345091 -0.0136041 1 0 1 1 0 0 +EDGE2 8722 8681 -1.02398 -0.0710047 -0.010535 1 0 1 1 0 0 +EDGE2 8722 8721 -1.01228 -0.155695 0.00225172 1 0 1 1 0 0 +EDGE2 8722 8661 -1.0198 0.0287938 0.0318773 1 0 1 1 0 0 +EDGE2 8722 1081 -1.01518 0.0455218 -0.0232241 1 0 1 1 0 0 +EDGE2 8722 5861 -0.91782 -0.00282703 0.00872936 1 0 1 1 0 0 +EDGE2 8722 8662 -0.0238089 0.0146813 0.0184751 1 0 1 1 0 0 +EDGE2 8722 8682 0.00442288 0.0337029 -0.0363944 1 0 1 1 0 0 +EDGE2 8722 8402 0.0660268 -0.0480928 0.0140326 1 0 1 1 0 0 +EDGE2 8722 8403 1.00774 -0.00380159 -0.0309301 1 0 1 1 0 0 +EDGE2 8722 8683 1.0535 0.0121301 0.0124746 1 0 1 1 0 0 +EDGE2 8722 1082 -0.013658 -0.0425449 0.0100562 1 0 1 1 0 0 +EDGE2 8722 8663 1.0155 -0.0731258 0.0115035 1 0 1 1 0 0 +EDGE2 8722 1083 0.905926 0.0294376 0.0445925 1 0 1 1 0 0 +EDGE2 8722 5863 1.05116 0.0603436 0.00686601 1 0 1 1 0 0 +EDGE2 8723 5862 -0.999494 -0.0263772 -0.00451362 1 0 1 1 0 0 +EDGE2 8723 8662 -0.897285 -0.0322607 -0.00111644 1 0 1 1 0 0 +EDGE2 8723 8682 -1.05056 -0.0433198 0.00687167 1 0 1 1 0 0 +EDGE2 8723 8722 -1.06722 -0.0795769 -0.00661178 1 0 1 1 0 0 +EDGE2 8723 8402 -1.04044 -0.0724083 0.0101958 1 0 1 1 0 0 +EDGE2 8723 8664 1.0151 -0.0164437 0.00133954 1 0 1 1 0 0 +EDGE2 8723 8403 0.0414734 0.0341503 0.0111538 1 0 1 1 0 0 +EDGE2 8723 8683 -0.0570633 0.0046914 0.00418291 1 0 1 1 0 0 +EDGE2 8723 1082 -0.94713 0.00526343 -0.0140672 1 0 1 1 0 0 +EDGE2 8723 8663 0.0373038 0.0117743 0.00694962 1 0 1 1 0 0 +EDGE2 8723 1083 0.0524242 -0.0297458 0.0165255 1 0 1 1 0 0 +EDGE2 8723 5863 0.0271604 0.0709627 0.018459 1 0 1 1 0 0 +EDGE2 8723 8684 0.944887 0.0774206 -0.00450193 1 0 1 1 0 0 +EDGE2 8723 1084 0.963099 -0.0508267 0.00911974 1 0 1 1 0 0 +EDGE2 8723 5864 0.948078 -0.00389145 -0.02287 1 0 1 1 0 0 +EDGE2 8723 8404 1.05494 0.0316865 -0.0162002 1 0 1 1 0 0 +EDGE2 8724 8345 0.979034 0.0801881 -3.11168 1 0 1 1 0 0 +EDGE2 8724 8664 -0.0636869 0.0236089 0.014047 1 0 1 1 0 0 +EDGE2 8724 8403 -0.964062 0.0320219 0.00965572 1 0 1 1 0 0 +EDGE2 8724 8683 -1.04651 -0.0316606 0.0236794 1 0 1 1 0 0 +EDGE2 8724 8723 -0.986071 -0.0830746 -0.00500001 1 0 1 1 0 0 +EDGE2 8724 8663 -1.02072 -0.124372 -6.82711e-06 1 0 1 1 0 0 +EDGE2 8724 1083 -1.0084 -0.0777177 0.00579377 1 0 1 1 0 0 +EDGE2 8724 5863 -1.02124 -0.097534 0.0283273 1 0 1 1 0 0 +EDGE2 8724 8684 0.00329872 -0.00762293 -0.0167357 1 0 1 1 0 0 +EDGE2 8724 8705 1.05981 0.11166 -3.13057 1 0 1 1 0 0 +EDGE2 8724 1084 -0.0130813 -0.0463504 -0.0203707 1 0 1 1 0 0 +EDGE2 8724 5864 0.0516739 0.0424704 -0.0247854 1 0 1 1 0 0 +EDGE2 8724 8404 0.0553637 -0.030001 0.0276142 1 0 1 1 0 0 +EDGE2 8724 8665 0.97767 0.022206 -0.00567851 1 0 1 1 0 0 +EDGE2 8724 8685 0.993778 0.0728674 -0.00601916 1 0 1 1 0 0 +EDGE2 8724 8405 0.987597 0.00585754 -0.000534131 1 0 1 1 0 0 +EDGE2 8724 1045 0.955356 0.055802 -3.15315 1 0 1 1 0 0 +EDGE2 8724 1085 1.02823 -0.0299442 0.0424768 1 0 1 1 0 0 +EDGE2 8724 5865 1.02855 0.0326554 -0.0127988 1 0 1 1 0 0 +EDGE2 8725 8345 0.0440557 -0.00702242 -3.15203 1 0 1 1 0 0 +EDGE2 8725 8686 -0.0310623 -0.994651 -1.54089 1 0 1 1 0 0 +EDGE2 8725 1046 -0.0216031 -0.978964 -1.57385 1 0 1 1 0 0 +EDGE2 8725 8664 -1.05415 0.0110295 -0.000268309 1 0 1 1 0 0 +EDGE2 8725 8724 -0.940513 0.0234657 -0.00867318 1 0 1 1 0 0 +EDGE2 8725 8684 -0.980628 -0.0363531 -0.00558977 1 0 1 1 0 0 +EDGE2 8725 8705 0.035831 0.00585028 -3.19841 1 0 1 1 0 0 +EDGE2 8725 1084 -1.06791 -0.0501133 -0.00752658 1 0 1 1 0 0 +EDGE2 8725 5864 -0.958205 0.0154088 0.0187763 1 0 1 1 0 0 +EDGE2 8725 8404 -1.0183 -0.0618351 -0.0476926 1 0 1 1 0 0 +EDGE2 8725 8665 0.0110812 0.0978505 -0.0409054 1 0 1 1 0 0 +EDGE2 8725 8685 0.118719 -0.0251949 -0.0151225 1 0 1 1 0 0 +EDGE2 8725 8405 -0.0226505 0.0653852 -0.00783251 1 0 1 1 0 0 +EDGE2 8725 8344 1.0931 0.034593 -3.18275 1 0 1 1 0 0 +EDGE2 8725 1045 0.0168352 -0.0177502 -3.15954 1 0 1 1 0 0 +EDGE2 8725 1085 0.122642 0.0984167 -0.00409957 1 0 1 1 0 0 +EDGE2 8725 5865 0.0453878 0.0382629 -0.043484 1 0 1 1 0 0 +EDGE2 8725 8704 1.01978 -0.0194679 -3.12991 1 0 1 1 0 0 +EDGE2 8725 1044 1.0612 -0.0137845 -3.12714 1 0 1 1 0 0 +EDGE2 8725 8346 -0.0522229 1.04077 1.59726 1 0 1 1 0 0 +EDGE2 8725 8666 -0.0519623 0.988648 1.56111 1 0 1 1 0 0 +EDGE2 8725 8706 0.018527 1.07341 1.56054 1 0 1 1 0 0 +EDGE2 8725 8406 -0.0487035 0.958406 1.57899 1 0 1 1 0 0 +EDGE2 8725 1086 0.0779125 1.07328 1.59043 1 0 1 1 0 0 +EDGE2 8725 5866 -0.0287078 1.09705 1.56474 1 0 1 1 0 0 +EDGE2 8726 8345 -0.976558 0.0412765 1.56353 1 0 1 1 0 0 +EDGE2 8726 8705 -1.02029 -0.0734255 1.56622 1 0 1 1 0 0 +EDGE2 8726 8725 -0.907732 0.040727 -1.56887 1 0 1 1 0 0 +EDGE2 8726 8665 -0.977645 -0.00458995 -1.56171 1 0 1 1 0 0 +EDGE2 8726 8685 -1.08192 0.0377972 -1.53192 1 0 1 1 0 0 +EDGE2 8726 8405 -0.989926 0.0330944 -1.59123 1 0 1 1 0 0 +EDGE2 8726 1045 -1.04419 -0.0221346 1.52264 1 0 1 1 0 0 +EDGE2 8726 1085 -0.99088 0.0277797 -1.54366 1 0 1 1 0 0 +EDGE2 8726 5865 -1.03938 -0.0120709 -1.56142 1 0 1 1 0 0 +EDGE2 8726 8667 1.04113 -0.00292776 -0.0350236 1 0 1 1 0 0 +EDGE2 8726 8346 -0.0172569 0.0223459 0.0109796 1 0 1 1 0 0 +EDGE2 8726 8666 -0.0303735 -0.0048171 -0.00661698 1 0 1 1 0 0 +EDGE2 8726 8706 0.0143007 0.0186978 0.0312904 1 0 1 1 0 0 +EDGE2 8726 8406 0.0719057 -0.0216172 -0.0355167 1 0 1 1 0 0 +EDGE2 8726 1086 -0.0654067 0.0840256 -0.0216717 1 0 1 1 0 0 +EDGE2 8726 5866 0.0110319 0.016566 0.0130662 1 0 1 1 0 0 +EDGE2 8726 8707 0.977806 0.00352884 0.022567 1 0 1 1 0 0 +EDGE2 8726 8407 0.950371 -0.0569954 -0.000301716 1 0 1 1 0 0 +EDGE2 8726 5867 0.942967 -0.0918936 -0.00909427 1 0 1 1 0 0 +EDGE2 8726 8347 1.03823 0.0372494 0.00617889 1 0 1 1 0 0 +EDGE2 8726 1087 1.05109 0.0753736 -0.00346284 1 0 1 1 0 0 +EDGE2 8727 8667 -0.0514534 0.052478 0.0263196 1 0 1 1 0 0 +EDGE2 8727 8346 -0.96195 -0.0651261 -0.0236958 1 0 1 1 0 0 +EDGE2 8727 8666 -1.00053 0.0106222 0.00923566 1 0 1 1 0 0 +EDGE2 8727 8706 -1.05408 -0.0708718 0.0106512 1 0 1 1 0 0 +EDGE2 8727 8726 -0.935386 0.0993095 -0.0218283 1 0 1 1 0 0 +EDGE2 8727 8406 -0.946158 0.0141887 -0.0124178 1 0 1 1 0 0 +EDGE2 8727 1086 -0.990686 -0.0135775 0.0136516 1 0 1 1 0 0 +EDGE2 8727 5866 -1.01699 0.00403138 0.010501 1 0 1 1 0 0 +EDGE2 8727 8707 -0.0379376 -0.0436246 0.0375625 1 0 1 1 0 0 +EDGE2 8727 8407 -0.0365163 0.000479439 -0.0185444 1 0 1 1 0 0 +EDGE2 8727 5867 -0.0145296 0.00584888 -0.0186403 1 0 1 1 0 0 +EDGE2 8727 8347 -0.0232579 -0.0572376 -0.00307913 1 0 1 1 0 0 +EDGE2 8727 1087 -0.0445595 -0.0253486 0.00726232 1 0 1 1 0 0 +EDGE2 8727 8348 1.09175 -0.126615 -0.0406298 1 0 1 1 0 0 +EDGE2 8727 8408 0.950647 -0.00354579 -0.0238138 1 0 1 1 0 0 +EDGE2 8727 8668 1.01317 0.0164651 -0.0260286 1 0 1 1 0 0 +EDGE2 8727 8708 0.95386 -0.0762901 0.0196368 1 0 1 1 0 0 +EDGE2 8727 1088 0.95792 0.0503167 -0.0279289 1 0 1 1 0 0 +EDGE2 8727 5868 1.03806 0.0177452 -0.0131963 1 0 1 1 0 0 +EDGE2 8728 8667 -1.00356 0.0444112 -0.0265788 1 0 1 1 0 0 +EDGE2 8728 8727 -1.08221 -0.0536793 -0.0224017 1 0 1 1 0 0 +EDGE2 8728 8707 -1.03132 0.0476883 0.0297252 1 0 1 1 0 0 +EDGE2 8728 8407 -0.951928 -0.0802337 -0.0133249 1 0 1 1 0 0 +EDGE2 8728 5867 -0.999269 -0.107695 -0.00588288 1 0 1 1 0 0 +EDGE2 8728 8347 -1.06251 -0.0702032 0.0235899 1 0 1 1 0 0 +EDGE2 8728 1087 -0.924627 -0.0811994 0.00949201 1 0 1 1 0 0 +EDGE2 8728 8348 -0.0056407 -0.03495 0.0133946 1 0 1 1 0 0 +EDGE2 8728 8408 -0.0205004 0.0559948 0.0646358 1 0 1 1 0 0 +EDGE2 8728 8668 -0.0563949 0.0404282 0.0245067 1 0 1 1 0 0 +EDGE2 8728 8708 -0.0898076 -0.068902 -0.0253471 1 0 1 1 0 0 +EDGE2 8728 8669 0.963839 0.0436654 -0.00444527 1 0 1 1 0 0 +EDGE2 8728 1088 -0.0164618 -0.0468884 -0.0222471 1 0 1 1 0 0 +EDGE2 8728 5868 0.0352889 0.0608026 0.011909 1 0 1 1 0 0 +EDGE2 8728 8709 1.03649 0.0023287 0.0228334 1 0 1 1 0 0 +EDGE2 8728 5869 0.967114 -0.0509686 0.0223786 1 0 1 1 0 0 +EDGE2 8728 8349 0.973633 0.0988258 0.0128886 1 0 1 1 0 0 +EDGE2 8728 8409 1.06383 -0.0248312 -0.00673911 1 0 1 1 0 0 +EDGE2 8728 1089 1.07954 -0.0271166 -0.0226558 1 0 1 1 0 0 +EDGE2 8729 8728 -0.989394 -0.0160823 -0.0385244 1 0 1 1 0 0 +EDGE2 8729 8348 -1.01177 0.056661 -0.0355805 1 0 1 1 0 0 +EDGE2 8729 8408 -1.04163 0.0690355 0.0143431 1 0 1 1 0 0 +EDGE2 8729 8668 -0.902863 0.0278173 -0.0079177 1 0 1 1 0 0 +EDGE2 8729 8708 -0.945718 -0.0407195 0.0016544 1 0 1 1 0 0 +EDGE2 8729 8669 -0.00963247 0.0159661 0.00426977 1 0 1 1 0 0 +EDGE2 8729 1088 -1.00133 0.00986639 0.00969845 1 0 1 1 0 0 +EDGE2 8729 5868 -0.949598 -0.0287965 -0.0347965 1 0 1 1 0 0 +EDGE2 8729 8709 0.00515487 0.0718402 -0.0265811 1 0 1 1 0 0 +EDGE2 8729 5869 -0.120153 0.0583001 0.0285877 1 0 1 1 0 0 +EDGE2 8729 8349 -0.0128593 -0.0213572 -0.00516339 1 0 1 1 0 0 +EDGE2 8729 8409 -0.0141803 0.0546717 -0.0328349 1 0 1 1 0 0 +EDGE2 8729 1089 -0.0784657 0.0359813 0.00411769 1 0 1 1 0 0 +EDGE2 8729 8670 1.07003 0.03112 -0.0123691 1 0 1 1 0 0 +EDGE2 8729 8710 0.982593 -0.0915572 -0.000643422 1 0 1 1 0 0 +EDGE2 8729 5870 1.0525 -0.0444115 0.0142683 1 0 1 1 0 0 +EDGE2 8729 8350 0.902851 -0.0275585 0.00613179 1 0 1 1 0 0 +EDGE2 8729 8410 1.05839 0.06409 0.038265 1 0 1 1 0 0 +EDGE2 8729 1090 0.980619 -0.049058 -0.0222735 1 0 1 1 0 0 +EDGE2 8730 8669 -0.978807 -0.105979 -0.00344468 1 0 1 1 0 0 +EDGE2 8730 8729 -1.02877 0.00982355 0.00416325 1 0 1 1 0 0 +EDGE2 8730 8709 -0.964439 -0.000137208 0.0534252 1 0 1 1 0 0 +EDGE2 8730 5869 -1.03853 0.0849703 -0.0130334 1 0 1 1 0 0 +EDGE2 8730 8349 -0.927917 0.0244393 0.000405313 1 0 1 1 0 0 +EDGE2 8730 8409 -0.920463 -0.0266859 -0.00662902 1 0 1 1 0 0 +EDGE2 8730 1089 -0.972385 0.115316 0.0197293 1 0 1 1 0 0 +EDGE2 8730 8670 -0.000863004 0.0870962 0.0313004 1 0 1 1 0 0 +EDGE2 8730 8351 0.0647374 0.987896 1.57012 1 0 1 1 0 0 +EDGE2 8730 8671 0.0274554 0.882068 1.50911 1 0 1 1 0 0 +EDGE2 8730 8711 0.0188118 0.987781 1.59305 1 0 1 1 0 0 +EDGE2 8730 8411 -0.0217741 0.944217 1.54082 1 0 1 1 0 0 +EDGE2 8730 1091 0.0154285 1.04313 1.59632 1 0 1 1 0 0 +EDGE2 8730 5871 0.0514477 1.04205 1.572 1 0 1 1 0 0 +EDGE2 8730 8710 -0.0761094 0.00437911 -0.00104931 1 0 1 1 0 0 +EDGE2 8730 5870 -0.0389592 -0.0150221 -0.0582816 1 0 1 1 0 0 +EDGE2 8730 8350 -0.00515658 -0.0529769 0.0146573 1 0 1 1 0 0 +EDGE2 8730 8410 -0.0673983 -0.0442255 -0.0130589 1 0 1 1 0 0 +EDGE2 8730 1090 0.00272208 -0.0871281 -0.00356653 1 0 1 1 0 0 +EDGE2 8731 1092 1.0199 -0.0757484 0.014702 1 0 1 1 0 0 +EDGE2 8731 8672 0.953913 0.0985459 -0.00498642 1 0 1 1 0 0 +EDGE2 8731 8712 0.92231 -0.0129483 0.042048 1 0 1 1 0 0 +EDGE2 8731 8352 1.01167 0.0274513 0.00333371 1 0 1 1 0 0 +EDGE2 8731 8412 0.957289 0.0437611 -0.00341245 1 0 1 1 0 0 +EDGE2 8731 5872 1.05874 -0.0135591 0.0302884 1 0 1 1 0 0 +EDGE2 8731 8670 -1.02013 0.0585793 -1.52619 1 0 1 1 0 0 +EDGE2 8731 8351 -0.0681812 0.0360368 0.0488626 1 0 1 1 0 0 +EDGE2 8731 8671 0.0649478 0.0268893 0.0252611 1 0 1 1 0 0 +EDGE2 8731 8711 -0.037736 -0.125376 0.000472248 1 0 1 1 0 0 +EDGE2 8731 8411 -0.00291203 -0.010662 0.0135797 1 0 1 1 0 0 +EDGE2 8731 8730 -0.964796 -0.0817691 -1.58335 1 0 1 1 0 0 +EDGE2 8731 1091 -0.0163487 -0.00219497 -0.000254279 1 0 1 1 0 0 +EDGE2 8731 5871 0.0213134 0.0413317 -0.0118783 1 0 1 1 0 0 +EDGE2 8731 8710 -0.99908 0.0445732 -1.55393 1 0 1 1 0 0 +EDGE2 8731 5870 -0.996923 -0.0561148 -1.57276 1 0 1 1 0 0 +EDGE2 8731 8350 -1.01312 -0.0228093 -1.57446 1 0 1 1 0 0 +EDGE2 8731 8410 -0.910697 -0.0536795 -1.58309 1 0 1 1 0 0 +EDGE2 8731 1090 -1.02026 -0.0319382 -1.55871 1 0 1 1 0 0 +EDGE2 8732 1092 0.0503963 0.00790755 -0.0179953 1 0 1 1 0 0 +EDGE2 8732 8353 0.953284 0.00850205 0.0212074 1 0 1 1 0 0 +EDGE2 8732 8673 0.975754 0.047975 -0.00504938 1 0 1 1 0 0 +EDGE2 8732 8713 1.03779 0.0378202 -0.00600689 1 0 1 1 0 0 +EDGE2 8732 8413 0.979379 -0.00617697 0.00191815 1 0 1 1 0 0 +EDGE2 8732 8672 -0.0256121 0.0267113 0.00691959 1 0 1 1 0 0 +EDGE2 8732 1093 0.91494 -0.0257244 0.000582382 1 0 1 1 0 0 +EDGE2 8732 5873 1.03112 0.0140738 -0.0069585 1 0 1 1 0 0 +EDGE2 8732 8712 0.0327465 -0.0159753 -0.00706061 1 0 1 1 0 0 +EDGE2 8732 8352 -0.0843323 -0.0437076 -0.00371779 1 0 1 1 0 0 +EDGE2 8732 8412 0.0354857 0.0309693 0.0123366 1 0 1 1 0 0 +EDGE2 8732 5872 -0.036185 -0.117012 -0.00300696 1 0 1 1 0 0 +EDGE2 8732 8351 -1.09867 0.0609592 0.000791157 1 0 1 1 0 0 +EDGE2 8732 8671 -1.05639 -0.0200641 0.0168965 1 0 1 1 0 0 +EDGE2 8732 8711 -0.942911 0.0840136 0.011863 1 0 1 1 0 0 +EDGE2 8732 8731 -0.884768 -0.0767096 -0.0259731 1 0 1 1 0 0 +EDGE2 8732 8411 -1.03209 -0.0274552 0.0231026 1 0 1 1 0 0 +EDGE2 8732 1091 -1.00404 0.0414418 0.00575404 1 0 1 1 0 0 +EDGE2 8732 5871 -1.00493 -0.0153644 0.0100262 1 0 1 1 0 0 +EDGE2 8733 1092 -1.03819 -0.0599658 -0.0296539 1 0 1 1 0 0 +EDGE2 8733 8714 1.0177 0.076532 -0.0192949 1 0 1 1 0 0 +EDGE2 8733 8353 -0.0609162 -0.0262483 0.0153829 1 0 1 1 0 0 +EDGE2 8733 1094 0.988054 -0.0127403 -0.00621495 1 0 1 1 0 0 +EDGE2 8733 8354 1.06818 0.0253319 0.00414335 1 0 1 1 0 0 +EDGE2 8733 8414 1.02006 0.11422 0.0244132 1 0 1 1 0 0 +EDGE2 8733 8674 0.993031 -0.0333694 0.00618719 1 0 1 1 0 0 +EDGE2 8733 5874 0.93606 0.0512555 -0.0096268 1 0 1 1 0 0 +EDGE2 8733 8673 0.00289594 0.044672 0.0137456 1 0 1 1 0 0 +EDGE2 8733 8713 -0.0573413 0.000126819 0.00341886 1 0 1 1 0 0 +EDGE2 8733 8413 0.0371132 -0.012496 -0.03897 1 0 1 1 0 0 +EDGE2 8733 8672 -0.9847 -0.0222279 0.0128128 1 0 1 1 0 0 +EDGE2 8733 8732 -1.06819 -0.0308539 0.00896922 1 0 1 1 0 0 +EDGE2 8733 1093 -0.0320245 0.0309169 0.0272451 1 0 1 1 0 0 +EDGE2 8733 5873 -0.0402771 0.00951834 -0.0178766 1 0 1 1 0 0 +EDGE2 8733 8712 -1.01863 -0.0445469 -0.032648 1 0 1 1 0 0 +EDGE2 8733 8352 -0.916372 0.0291215 0.012447 1 0 1 1 0 0 +EDGE2 8733 8412 -1.05316 -0.0390323 -0.0175775 1 0 1 1 0 0 +EDGE2 8733 5872 -0.965191 0.0481603 0.00838738 1 0 1 1 0 0 +EDGE2 8734 5795 0.956508 -0.0175338 -3.15594 1 0 1 1 0 0 +EDGE2 8734 8395 0.979785 0.0430654 -3.12621 1 0 1 1 0 0 +EDGE2 8734 8555 1.06349 -0.00357291 -3.13173 1 0 1 1 0 0 +EDGE2 8734 8675 0.99515 -0.0463332 -0.00841605 1 0 1 1 0 0 +EDGE2 8734 8715 1.01581 0.0806789 -0.014045 1 0 1 1 0 0 +EDGE2 8734 8415 0.965605 0.091689 -0.0340424 1 0 1 1 0 0 +EDGE2 8734 5875 0.96344 -0.0368116 0.00497598 1 0 1 1 0 0 +EDGE2 8734 8355 1.08341 -0.0414301 0.00751215 1 0 1 1 0 0 +EDGE2 8734 5855 1.05596 0.0332204 -3.1375 1 0 1 1 0 0 +EDGE2 8734 8714 -0.0360699 -0.00656287 0.0181385 1 0 1 1 0 0 +EDGE2 8734 3035 0.921531 -0.0162716 -3.13262 1 0 1 1 0 0 +EDGE2 8734 3055 0.933696 0.0309397 -3.12953 1 0 1 1 0 0 +EDGE2 8734 1095 0.97857 0.00335161 -0.000570068 1 0 1 1 0 0 +EDGE2 8734 1115 0.878949 -0.062213 -3.12375 1 0 1 1 0 0 +EDGE2 8734 1135 1.01968 -0.0397287 -3.10666 1 0 1 1 0 0 +EDGE2 8734 8353 -0.956938 -0.0656011 0.000489867 1 0 1 1 0 0 +EDGE2 8734 1094 -0.00970921 -0.0395799 -0.00188625 1 0 1 1 0 0 +EDGE2 8734 8354 -0.0813668 -0.0103875 0.00216081 1 0 1 1 0 0 +EDGE2 8734 8414 -0.0108292 0.0353425 0.0108622 1 0 1 1 0 0 +EDGE2 8734 8674 -0.0223491 -0.00568241 -0.00378632 1 0 1 1 0 0 +EDGE2 8734 5874 0.0214545 0.0523275 0.00206474 1 0 1 1 0 0 +EDGE2 8734 8673 -0.984451 0.0300208 -0.0129681 1 0 1 1 0 0 +EDGE2 8734 8713 -1.00571 0.0568661 0.0121869 1 0 1 1 0 0 +EDGE2 8734 8733 -1.05545 -0.0224417 0.0188706 1 0 1 1 0 0 +EDGE2 8734 8413 -1.02107 -0.0487596 0.00902927 1 0 1 1 0 0 +EDGE2 8734 1093 -1.01085 0.00229146 -0.0306778 1 0 1 1 0 0 +EDGE2 8734 5873 -1.04106 0.000996503 0.0108351 1 0 1 1 0 0 +EDGE2 8735 5795 0.0183887 0.0651357 -3.13717 1 0 1 1 0 0 +EDGE2 8735 8356 0.06304 1.03044 1.56844 1 0 1 1 0 0 +EDGE2 8735 8416 0.0645474 0.963054 1.56606 1 0 1 1 0 0 +EDGE2 8735 8676 -0.0722097 0.977964 1.6074 1 0 1 1 0 0 +EDGE2 8735 8716 0.0768603 1.04326 1.54732 1 0 1 1 0 0 +EDGE2 8735 8396 -0.0346629 1.01535 1.57729 1 0 1 1 0 0 +EDGE2 8735 5856 0.0320851 0.995669 1.58306 1 0 1 1 0 0 +EDGE2 8735 5876 -0.00782513 0.965185 1.56514 1 0 1 1 0 0 +EDGE2 8735 3056 -0.0696996 1.00515 1.56273 1 0 1 1 0 0 +EDGE2 8735 5794 1.08294 -0.0274541 -3.14346 1 0 1 1 0 0 +EDGE2 8735 8394 1.06682 0.0159215 -3.11488 1 0 1 1 0 0 +EDGE2 8735 8554 1.10141 0.00170841 -3.14218 1 0 1 1 0 0 +EDGE2 8735 5854 0.908623 0.0401438 -3.11496 1 0 1 1 0 0 +EDGE2 8735 1134 0.999095 -0.00448467 -3.10737 1 0 1 1 0 0 +EDGE2 8735 3034 0.94258 0.109882 -3.11447 1 0 1 1 0 0 +EDGE2 8735 3054 0.925004 -0.050805 -3.12992 1 0 1 1 0 0 +EDGE2 8735 1114 1.02883 -0.0215197 -3.16734 1 0 1 1 0 0 +EDGE2 8735 8395 -0.0668591 -0.000710397 -3.12342 1 0 1 1 0 0 +EDGE2 8735 8555 -0.000285763 0.0177942 -3.18167 1 0 1 1 0 0 +EDGE2 8735 8675 -0.00687475 0.0336788 -0.01813 1 0 1 1 0 0 +EDGE2 8735 8715 0.0107813 -0.01973 0.0115928 1 0 1 1 0 0 +EDGE2 8735 8415 -0.0294374 0.0570965 0.045926 1 0 1 1 0 0 +EDGE2 8735 5875 0.0348909 -0.0427496 -0.0275356 1 0 1 1 0 0 +EDGE2 8735 8355 0.0658004 -0.0348076 0.00675516 1 0 1 1 0 0 +EDGE2 8735 5855 0.0577788 -0.0606847 -3.16914 1 0 1 1 0 0 +EDGE2 8735 8714 -1.00087 -0.093687 -0.0114845 1 0 1 1 0 0 +EDGE2 8735 3035 -0.0084136 -0.0470862 -3.10773 1 0 1 1 0 0 +EDGE2 8735 3055 -0.0280262 -0.0102793 -3.15926 1 0 1 1 0 0 +EDGE2 8735 1095 0.114953 -0.00662194 0.0346836 1 0 1 1 0 0 +EDGE2 8735 1115 -0.0934843 0.0429042 -3.13058 1 0 1 1 0 0 +EDGE2 8735 1135 -0.0175829 -0.0503401 -3.11378 1 0 1 1 0 0 +EDGE2 8735 8734 -1.05687 0.00684711 0.00695912 1 0 1 1 0 0 +EDGE2 8735 1094 -0.991565 -0.0416462 -0.00592141 1 0 1 1 0 0 +EDGE2 8735 8354 -1.01894 -0.00689746 -0.00200725 1 0 1 1 0 0 +EDGE2 8735 8414 -0.950375 -0.0220876 -0.0108399 1 0 1 1 0 0 +EDGE2 8735 8674 -1.13971 -0.0666732 0.00796323 1 0 1 1 0 0 +EDGE2 8735 5874 -1.08484 0.0120323 -0.0177446 1 0 1 1 0 0 +EDGE2 8735 1116 0.0618193 -0.980482 -1.54362 1 0 1 1 0 0 +EDGE2 8735 3036 0.03565 -1.04264 -1.54803 1 0 1 1 0 0 +EDGE2 8735 5796 0.0944069 -0.949837 -1.58487 1 0 1 1 0 0 +EDGE2 8735 8556 0.0366209 -1.01738 -1.54981 1 0 1 1 0 0 +EDGE2 8735 1136 0.00238656 -1.00516 -1.573 1 0 1 1 0 0 +EDGE2 8735 1096 0.00522038 -0.920311 -1.54292 1 0 1 1 0 0 +EDGE2 8736 5795 -1.04714 0.0244776 1.54337 1 0 1 1 0 0 +EDGE2 8736 8717 1.03634 0.00637266 -0.0167381 1 0 1 1 0 0 +EDGE2 8736 5877 0.981809 0.149324 0.0169932 1 0 1 1 0 0 +EDGE2 8736 8397 1.03937 0.0317992 -0.0296147 1 0 1 1 0 0 +EDGE2 8736 8417 1.04661 0.107741 -0.00795404 1 0 1 1 0 0 +EDGE2 8736 8677 0.982185 0.0266198 0.0039116 1 0 1 1 0 0 +EDGE2 8736 8357 1.05871 0.0537941 0.0194094 1 0 1 1 0 0 +EDGE2 8736 3057 0.954772 0.00298122 0.0150247 1 0 1 1 0 0 +EDGE2 8736 5857 0.970601 -0.0140964 0.0173636 1 0 1 1 0 0 +EDGE2 8736 8356 -0.0519445 -0.0153299 -0.0064489 1 0 1 1 0 0 +EDGE2 8736 8416 -0.00365962 0.041971 -0.000880362 1 0 1 1 0 0 +EDGE2 8736 8676 0.075667 0.00368084 0.0267334 1 0 1 1 0 0 +EDGE2 8736 8716 0.0352591 -0.0194096 0.0108536 1 0 1 1 0 0 +EDGE2 8736 8396 0.0257686 0.0321811 0.00141764 1 0 1 1 0 0 +EDGE2 8736 5856 0.0371107 0.0723096 0.0286765 1 0 1 1 0 0 +EDGE2 8736 5876 0.0408266 0.0787231 -0.00698136 1 0 1 1 0 0 +EDGE2 8736 3056 -0.043697 -0.0226342 -0.0224377 1 0 1 1 0 0 +EDGE2 8736 8735 -0.968486 0.0157387 -1.59028 1 0 1 1 0 0 +EDGE2 8736 8395 -0.9924 -0.0141287 1.57634 1 0 1 1 0 0 +EDGE2 8736 8555 -1.01775 -0.0895992 1.55264 1 0 1 1 0 0 +EDGE2 8736 8675 -1.00981 -0.0267649 -1.57956 1 0 1 1 0 0 +EDGE2 8736 8715 -1.02783 0.0777066 -1.55624 1 0 1 1 0 0 +EDGE2 8736 8415 -1.01494 0.0597032 -1.54408 1 0 1 1 0 0 +EDGE2 8736 5875 -1.02979 0.0606239 -1.59968 1 0 1 1 0 0 +EDGE2 8736 8355 -1.00051 0.0689827 -1.54699 1 0 1 1 0 0 +EDGE2 8736 5855 -0.972697 -0.0296896 1.56859 1 0 1 1 0 0 +EDGE2 8736 3035 -0.979544 -0.00815212 1.56803 1 0 1 1 0 0 +EDGE2 8736 3055 -0.99579 0.0133785 1.5443 1 0 1 1 0 0 +EDGE2 8736 1095 -0.97099 -0.061115 -1.54529 1 0 1 1 0 0 +EDGE2 8736 1115 -1.05834 0.00928713 1.59351 1 0 1 1 0 0 +EDGE2 8736 1135 -0.919239 -0.023065 1.54333 1 0 1 1 0 0 +EDGE2 8737 8717 -0.0122762 0.0609458 0.0301537 1 0 1 1 0 0 +EDGE2 8737 8358 1.09455 -0.00683652 0.00459001 1 0 1 1 0 0 +EDGE2 8737 8418 0.974988 -0.0613902 -0.015764 1 0 1 1 0 0 +EDGE2 8737 8678 1.03751 0.0671566 0.0252138 1 0 1 1 0 0 +EDGE2 8737 8718 1.03725 0.0796277 -0.00694011 1 0 1 1 0 0 +EDGE2 8737 8398 0.996633 -0.0745708 -0.015209 1 0 1 1 0 0 +EDGE2 8737 3058 0.995959 0.00783815 0.0232711 1 0 1 1 0 0 +EDGE2 8737 5858 1.0595 -0.0511207 0.0474198 1 0 1 1 0 0 +EDGE2 8737 5878 0.931656 0.0202417 -0.0198097 1 0 1 1 0 0 +EDGE2 8737 8736 -1.00942 -0.0192478 0.00925203 1 0 1 1 0 0 +EDGE2 8737 5877 -0.181949 -0.049907 -0.0119007 1 0 1 1 0 0 +EDGE2 8737 8397 0.00257683 -0.0245134 0.0425304 1 0 1 1 0 0 +EDGE2 8737 8417 -0.0558846 -0.0306224 -0.0704965 1 0 1 1 0 0 +EDGE2 8737 8677 -0.050439 0.0204826 0.0194486 1 0 1 1 0 0 +EDGE2 8737 8357 -0.011961 0.0614744 0.0179471 1 0 1 1 0 0 +EDGE2 8737 3057 -0.0193142 -0.0846476 0.004521 1 0 1 1 0 0 +EDGE2 8737 5857 -0.0739325 0.0557037 0.000408016 1 0 1 1 0 0 +EDGE2 8737 8356 -0.932857 0.00966011 -0.0135237 1 0 1 1 0 0 +EDGE2 8737 8416 -1.02118 -0.00766717 -0.0118106 1 0 1 1 0 0 +EDGE2 8737 8676 -1.03693 -0.0186518 0.0058742 1 0 1 1 0 0 +EDGE2 8737 8716 -0.940799 0.0590568 -0.00877596 1 0 1 1 0 0 +EDGE2 8737 8396 -0.973062 0.0207752 -0.00210354 1 0 1 1 0 0 +EDGE2 8737 5856 -1.02061 0.0213376 0.0479132 1 0 1 1 0 0 +EDGE2 8737 5876 -0.979684 -0.024331 -0.0121606 1 0 1 1 0 0 +EDGE2 8737 3056 -0.959157 -0.0682167 0.00984321 1 0 1 1 0 0 +EDGE2 8738 8717 -0.934862 0.0167364 -0.0235168 1 0 1 1 0 0 +EDGE2 8738 8399 1.03387 -0.0137059 -0.0117486 1 0 1 1 0 0 +EDGE2 8738 8679 1.0168 -0.0490608 -0.00152359 1 0 1 1 0 0 +EDGE2 8738 8719 0.933027 0.0638944 0.0190215 1 0 1 1 0 0 +EDGE2 8738 8419 0.94374 0.0192703 0.00861445 1 0 1 1 0 0 +EDGE2 8738 5859 0.920642 0.0644214 0.00397498 1 0 1 1 0 0 +EDGE2 8738 5879 0.948768 0.0437102 -0.0113655 1 0 1 1 0 0 +EDGE2 8738 8359 0.987486 0.0211822 0.017354 1 0 1 1 0 0 +EDGE2 8738 3059 0.947681 -0.00499581 -0.00872012 1 0 1 1 0 0 +EDGE2 8738 8358 -0.00295309 0.0228929 -0.0132619 1 0 1 1 0 0 +EDGE2 8738 8418 -0.0339252 -0.123951 -0.0101133 1 0 1 1 0 0 +EDGE2 8738 8678 -0.000674399 -0.0348279 0.0223401 1 0 1 1 0 0 +EDGE2 8738 8718 -0.0610079 -0.130906 0.0163607 1 0 1 1 0 0 +EDGE2 8738 8398 -0.00999955 -0.0360454 0.020402 1 0 1 1 0 0 +EDGE2 8738 3058 -0.0360012 0.00875724 0.0217489 1 0 1 1 0 0 +EDGE2 8738 5858 -0.0322902 -0.00793521 0.0221032 1 0 1 1 0 0 +EDGE2 8738 5878 0.0248453 0.0734362 -0.0196803 1 0 1 1 0 0 +EDGE2 8738 8737 -1.02923 -0.0200371 0.000852412 1 0 1 1 0 0 +EDGE2 8738 5877 -1.10496 -0.0332245 0.00325659 1 0 1 1 0 0 +EDGE2 8738 8397 -0.965155 0.0218811 -0.0218052 1 0 1 1 0 0 +EDGE2 8738 8417 -0.983391 0.0202382 0.00254049 1 0 1 1 0 0 +EDGE2 8738 8677 -1.01386 0.0400522 0.0262598 1 0 1 1 0 0 +EDGE2 8738 8357 -0.968202 0.0657203 -0.036518 1 0 1 1 0 0 +EDGE2 8738 3057 -1.05095 -0.0205881 0.0162407 1 0 1 1 0 0 +EDGE2 8738 5857 -0.895139 0.0707485 -0.0012197 1 0 1 1 0 0 +EDGE2 8739 8360 1.12154 -0.0556718 -0.00545467 1 0 1 1 0 0 +EDGE2 8739 8480 0.909176 0.0528741 -3.1379 1 0 1 1 0 0 +EDGE2 8739 8660 0.91378 0.0363516 -3.13063 1 0 1 1 0 0 +EDGE2 8739 8680 0.992598 -0.0853169 -0.0135015 1 0 1 1 0 0 +EDGE2 8739 8720 0.987852 0.0574884 -0.0092003 1 0 1 1 0 0 +EDGE2 8739 8620 0.939579 -0.0381914 -3.15795 1 0 1 1 0 0 +EDGE2 8739 8400 0.999563 0.0241337 -0.0128808 1 0 1 1 0 0 +EDGE2 8739 8420 1.00236 0.0754673 -0.0201819 1 0 1 1 0 0 +EDGE2 8739 8380 0.99653 0.00575784 -3.14604 1 0 1 1 0 0 +EDGE2 8739 3060 1.08492 -0.0101885 0.011001 1 0 1 1 0 0 +EDGE2 8739 3160 0.986518 -0.0190852 -3.11824 1 0 1 1 0 0 +EDGE2 8739 5860 0.948288 -0.00237395 0.0254208 1 0 1 1 0 0 +EDGE2 8739 5880 0.995242 0.0368201 -6.6613e-05 1 0 1 1 0 0 +EDGE2 8739 3080 0.951066 -0.00966158 -3.14118 1 0 1 1 0 0 +EDGE2 8739 1080 0.981166 0.0698868 -3.11966 1 0 1 1 0 0 +EDGE2 8739 8738 -1.01144 0.0178077 0.00480349 1 0 1 1 0 0 +EDGE2 8739 8399 -0.111026 0.0681765 -0.0145019 1 0 1 1 0 0 +EDGE2 8739 8679 -0.0650703 -0.0254957 -0.0128552 1 0 1 1 0 0 +EDGE2 8739 8719 0.0185653 -0.033914 0.00725778 1 0 1 1 0 0 +EDGE2 8739 8419 -0.0549256 -0.105884 -0.0111215 1 0 1 1 0 0 +EDGE2 8739 5859 0.0607394 -0.0261928 -0.0109185 1 0 1 1 0 0 +EDGE2 8739 5879 0.0456602 -0.0248477 -0.00122432 1 0 1 1 0 0 +EDGE2 8739 8359 -0.0725223 -0.00623593 0.0322274 1 0 1 1 0 0 +EDGE2 8739 3059 0.0406328 -0.00300686 0.00239514 1 0 1 1 0 0 +EDGE2 8739 8358 -1.05537 -0.0448646 0.00414576 1 0 1 1 0 0 +EDGE2 8739 8418 -0.969406 0.0217209 -0.0255901 1 0 1 1 0 0 +EDGE2 8739 8678 -1.00585 0.0144143 0.0106287 1 0 1 1 0 0 +EDGE2 8739 8718 -1.02291 0.0195256 -0.0460885 1 0 1 1 0 0 +EDGE2 8739 8398 -1.07247 -0.00141874 0.0330561 1 0 1 1 0 0 +EDGE2 8739 3058 -1.01372 0.0205305 0.0132998 1 0 1 1 0 0 +EDGE2 8739 5858 -0.999482 0.0168246 0.0030592 1 0 1 1 0 0 +EDGE2 8739 5878 -1.10835 -0.0571284 0.0460746 1 0 1 1 0 0 +EDGE2 8740 8360 -0.0231535 -0.0407244 -0.0182094 1 0 1 1 0 0 +EDGE2 8740 8379 1.03367 0.0233728 -3.14229 1 0 1 1 0 0 +EDGE2 8740 8619 0.932011 -0.0163677 -3.14284 1 0 1 1 0 0 +EDGE2 8740 8659 0.969667 -0.101709 -3.15875 1 0 1 1 0 0 +EDGE2 8740 8479 0.986149 0.0198013 -3.15877 1 0 1 1 0 0 +EDGE2 8740 3079 1.06617 -0.0684912 -3.145 1 0 1 1 0 0 +EDGE2 8740 3159 0.949658 0.0457723 -3.15644 1 0 1 1 0 0 +EDGE2 8740 1079 1.0579 -0.0833709 -3.15887 1 0 1 1 0 0 +EDGE2 8740 8361 0.0546786 -0.988996 -1.55743 1 0 1 1 0 0 +EDGE2 8740 8421 -0.0974284 -0.94125 -1.59717 1 0 1 1 0 0 +EDGE2 8740 8481 -0.0405126 -1.0291 -1.58715 1 0 1 1 0 0 +EDGE2 8740 8621 -0.038232 -0.836864 -1.55901 1 0 1 1 0 0 +EDGE2 8740 8381 -0.0311944 -0.96447 -1.5819 1 0 1 1 0 0 +EDGE2 8740 3081 -0.0335755 -0.949331 -1.55939 1 0 1 1 0 0 +EDGE2 8740 3161 0.116254 -0.996602 -1.53831 1 0 1 1 0 0 +EDGE2 8740 5881 0.0134536 -1.1273 -1.57759 1 0 1 1 0 0 +EDGE2 8740 3061 0.0319852 -0.9823 -1.55518 1 0 1 1 0 0 +EDGE2 8740 8480 0.08792 -0.0148277 -3.12543 1 0 1 1 0 0 +EDGE2 8740 8660 -0.00633493 0.0235002 -3.08693 1 0 1 1 0 0 +EDGE2 8740 8680 -0.00353396 -0.109178 -0.00617348 1 0 1 1 0 0 +EDGE2 8740 8720 -0.0729781 0.0146172 -0.0154311 1 0 1 1 0 0 +EDGE2 8740 8620 -0.0417638 -0.0944364 -3.10185 1 0 1 1 0 0 +EDGE2 8740 8400 0.0246844 -0.0725225 0.0320487 1 0 1 1 0 0 +EDGE2 8740 8420 0.0718243 0.00442908 -0.0152892 1 0 1 1 0 0 +EDGE2 8740 8380 -0.058002 0.101589 -3.1719 1 0 1 1 0 0 +EDGE2 8740 8401 0.0198504 1.01577 1.57136 1 0 1 1 0 0 +EDGE2 8740 3060 0.0316657 -0.048509 0.0252784 1 0 1 1 0 0 +EDGE2 8740 3160 0.0185754 0.0409554 -3.11817 1 0 1 1 0 0 +EDGE2 8740 5860 0.0593818 0.00750887 0.0123897 1 0 1 1 0 0 +EDGE2 8740 5880 -0.00189095 -0.00780656 -0.0180918 1 0 1 1 0 0 +EDGE2 8740 3080 0.0805188 -0.0530743 -3.1617 1 0 1 1 0 0 +EDGE2 8740 8681 0.04667 0.957059 1.56002 1 0 1 1 0 0 +EDGE2 8740 8721 0.0394859 1.04626 1.57358 1 0 1 1 0 0 +EDGE2 8740 1080 0.0456573 0.0398442 -3.15285 1 0 1 1 0 0 +EDGE2 8740 8661 0.0191997 1.01458 1.54791 1 0 1 1 0 0 +EDGE2 8740 1081 0.0754737 0.951493 1.57285 1 0 1 1 0 0 +EDGE2 8740 5861 0.0167871 0.991619 1.58538 1 0 1 1 0 0 +EDGE2 8740 8399 -0.975623 0.0475076 0.0055914 1 0 1 1 0 0 +EDGE2 8740 8679 -1.02542 0.0735709 -0.0154221 1 0 1 1 0 0 +EDGE2 8740 8719 -0.982085 -0.0181173 -0.021168 1 0 1 1 0 0 +EDGE2 8740 8739 -0.98462 -0.0665815 -0.0322206 1 0 1 1 0 0 +EDGE2 8740 8419 -1.05351 0.022667 0.0120347 1 0 1 1 0 0 +EDGE2 8740 5859 -0.955706 -0.0182119 0.0214007 1 0 1 1 0 0 +EDGE2 8740 5879 -1.0328 -0.0230552 0.00722232 1 0 1 1 0 0 +EDGE2 8740 8359 -0.963302 -0.0312987 -0.0266371 1 0 1 1 0 0 +EDGE2 8740 3059 -0.973083 0.0210795 -0.0144508 1 0 1 1 0 0 +EDGE2 8741 8360 -0.973677 -0.137417 1.54193 1 0 1 1 0 0 +EDGE2 8741 8362 0.963045 -0.0518665 0.0348274 1 0 1 1 0 0 +EDGE2 8741 8422 1.00175 0.0308579 0.0328118 1 0 1 1 0 0 +EDGE2 8741 8482 0.885677 -0.0471807 -0.0113344 1 0 1 1 0 0 +EDGE2 8741 8622 1.01846 0.0203423 0.0204824 1 0 1 1 0 0 +EDGE2 8741 8382 1.04306 0.0187948 0.000958958 1 0 1 1 0 0 +EDGE2 8741 3082 1.02614 0.0609309 -0.0125388 1 0 1 1 0 0 +EDGE2 8741 3162 1.00553 0.0432214 0.00194509 1 0 1 1 0 0 +EDGE2 8741 5882 0.994304 -0.0849646 -0.0100276 1 0 1 1 0 0 +EDGE2 8741 3062 1.03042 0.0129888 0.0307451 1 0 1 1 0 0 +EDGE2 8741 8740 -0.985051 -0.0917118 1.54645 1 0 1 1 0 0 +EDGE2 8741 8361 0.0102789 0.00674192 -0.0152526 1 0 1 1 0 0 +EDGE2 8741 8421 -0.0184974 0.0815227 -0.0114937 1 0 1 1 0 0 +EDGE2 8741 8481 -0.107423 0.0319569 -0.0305624 1 0 1 1 0 0 +EDGE2 8741 8621 0.0629694 -0.047016 -0.0149191 1 0 1 1 0 0 +EDGE2 8741 8381 0.0275389 -0.0744423 -0.00740275 1 0 1 1 0 0 +EDGE2 8741 3081 0.0080089 0.0292911 -0.000594632 1 0 1 1 0 0 +EDGE2 8741 3161 -0.0221185 -0.00514759 -0.0115574 1 0 1 1 0 0 +EDGE2 8741 5881 0.0576032 -0.0303147 -0.0157869 1 0 1 1 0 0 +EDGE2 8741 3061 -0.0208353 0.0184254 0.00331843 1 0 1 1 0 0 +EDGE2 8741 8480 -0.934533 0.0277172 -1.5626 1 0 1 1 0 0 +EDGE2 8741 8660 -1.0546 0.0892133 -1.58439 1 0 1 1 0 0 +EDGE2 8741 8680 -0.849652 -0.0087491 1.56254 1 0 1 1 0 0 +EDGE2 8741 8720 -0.909346 0.0280477 1.55203 1 0 1 1 0 0 +EDGE2 8741 8620 -1.05513 -0.0113805 -1.5845 1 0 1 1 0 0 +EDGE2 8741 8400 -0.958623 -0.105824 1.57847 1 0 1 1 0 0 +EDGE2 8741 8420 -0.993719 0.0258603 1.59821 1 0 1 1 0 0 +EDGE2 8741 8380 -1.0182 0.0174594 -1.60177 1 0 1 1 0 0 +EDGE2 8741 3060 -0.973484 0.0193115 1.58938 1 0 1 1 0 0 +EDGE2 8741 3160 -0.942276 0.0638053 -1.57754 1 0 1 1 0 0 +EDGE2 8741 5860 -0.903012 -0.0510875 1.57543 1 0 1 1 0 0 +EDGE2 8741 5880 -0.961678 0.0416003 1.54995 1 0 1 1 0 0 +EDGE2 8741 3080 -0.939817 0.0588482 -1.60303 1 0 1 1 0 0 +EDGE2 8741 1080 -1.02029 0.0577333 -1.54642 1 0 1 1 0 0 +EDGE2 8742 8741 -0.971688 -0.0546589 -0.0118752 1 0 1 1 0 0 +EDGE2 8742 8363 0.938315 0.0149393 -0.0108152 1 0 1 1 0 0 +EDGE2 8742 8423 0.968408 -0.0185531 0.00741879 1 0 1 1 0 0 +EDGE2 8742 8483 0.960431 0.00567444 0.000744039 1 0 1 1 0 0 +EDGE2 8742 8623 0.977145 -0.000971187 -0.0181469 1 0 1 1 0 0 +EDGE2 8742 8383 1.03463 -0.0179225 0.0105292 1 0 1 1 0 0 +EDGE2 8742 3083 1.0055 -0.0901656 -0.0248788 1 0 1 1 0 0 +EDGE2 8742 3163 1.06648 -0.0838992 -0.0106663 1 0 1 1 0 0 +EDGE2 8742 5883 0.975882 -0.0262694 -0.0156595 1 0 1 1 0 0 +EDGE2 8742 3063 0.987421 -0.0592807 0.00488615 1 0 1 1 0 0 +EDGE2 8742 8362 -0.0525859 -0.00527315 -0.0157846 1 0 1 1 0 0 +EDGE2 8742 8422 -0.0813057 -0.0514819 -0.00961306 1 0 1 1 0 0 +EDGE2 8742 8482 -0.0442145 -0.00355591 -0.00217014 1 0 1 1 0 0 +EDGE2 8742 8622 0.03849 -0.0136688 0.0123003 1 0 1 1 0 0 +EDGE2 8742 8382 0.035918 0.0300385 0.0174009 1 0 1 1 0 0 +EDGE2 8742 3082 0.0119923 0.0696122 0.00565882 1 0 1 1 0 0 +EDGE2 8742 3162 -0.000757423 -0.03378 -0.0232115 1 0 1 1 0 0 +EDGE2 8742 5882 0.0624895 0.086619 -0.0254008 1 0 1 1 0 0 +EDGE2 8742 3062 0.0527639 -0.0249519 0.0145855 1 0 1 1 0 0 +EDGE2 8742 8361 -1.0191 0.0213621 -0.0264759 1 0 1 1 0 0 +EDGE2 8742 8421 -0.961195 -0.0482118 -0.0177609 1 0 1 1 0 0 +EDGE2 8742 8481 -0.966502 -0.0241072 -0.000185369 1 0 1 1 0 0 +EDGE2 8742 8621 -0.991888 -0.0484341 0.0104738 1 0 1 1 0 0 +EDGE2 8742 8381 -0.999772 0.00861795 -0.000862973 1 0 1 1 0 0 +EDGE2 8742 3081 -0.960494 -0.0677801 0.00136306 1 0 1 1 0 0 +EDGE2 8742 3161 -0.979552 0.0518323 -0.00747348 1 0 1 1 0 0 +EDGE2 8742 5881 -0.985162 -0.0878261 0.0119656 1 0 1 1 0 0 +EDGE2 8742 3061 -1.0512 -0.0110934 -0.0152284 1 0 1 1 0 0 +EDGE2 8743 3064 1.00786 -0.0321905 0.0154591 1 0 1 1 0 0 +EDGE2 8743 8384 1.01847 0.0629925 -0.0187356 1 0 1 1 0 0 +EDGE2 8743 8484 1.01698 0.0547266 0.0271996 1 0 1 1 0 0 +EDGE2 8743 8624 0.991841 0.0356187 0.0141688 1 0 1 1 0 0 +EDGE2 8743 8424 0.98696 0.0514051 0.0164342 1 0 1 1 0 0 +EDGE2 8743 3164 0.953133 0.0529792 0.00761959 1 0 1 1 0 0 +EDGE2 8743 5884 0.903082 -0.0237696 0.0198994 1 0 1 1 0 0 +EDGE2 8743 8364 0.986591 -0.0960873 0.0058979 1 0 1 1 0 0 +EDGE2 8743 3084 0.975017 -0.0196839 0.0236383 1 0 1 1 0 0 +EDGE2 8743 8742 -1.01491 -0.0447194 -0.0143027 1 0 1 1 0 0 +EDGE2 8743 8363 -0.0626094 0.0282895 0.00320595 1 0 1 1 0 0 +EDGE2 8743 8423 0.00286867 -0.0119299 0.0143648 1 0 1 1 0 0 +EDGE2 8743 8483 -0.0400886 0.00311025 -0.0204763 1 0 1 1 0 0 +EDGE2 8743 8623 0.102806 0.0663935 0.0225197 1 0 1 1 0 0 +EDGE2 8743 8383 -0.0702112 -0.0364548 -0.00658716 1 0 1 1 0 0 +EDGE2 8743 3083 0.0288739 -0.0342616 -0.0117412 1 0 1 1 0 0 +EDGE2 8743 3163 -0.00923501 -0.0431358 -0.0220247 1 0 1 1 0 0 +EDGE2 8743 5883 -0.0426812 -0.0318725 0.0362809 1 0 1 1 0 0 +EDGE2 8743 3063 0.0455673 0.0394244 -0.023343 1 0 1 1 0 0 +EDGE2 8743 8362 -1.07344 0.0502664 -0.00202237 1 0 1 1 0 0 +EDGE2 8743 8422 -0.999722 0.0380697 0.0230339 1 0 1 1 0 0 +EDGE2 8743 8482 -0.867939 -0.0558973 0.0243802 1 0 1 1 0 0 +EDGE2 8743 8622 -0.918447 0.0507365 0.0141837 1 0 1 1 0 0 +EDGE2 8743 8382 -0.968597 -0.0569394 0.00364205 1 0 1 1 0 0 +EDGE2 8743 3082 -0.995537 -0.0527006 -0.00588798 1 0 1 1 0 0 +EDGE2 8743 3162 -1.0257 0.0525229 -0.0244943 1 0 1 1 0 0 +EDGE2 8743 5882 -1.05191 0.0244166 0.00420392 1 0 1 1 0 0 +EDGE2 8743 3062 -1.02011 -0.0804022 0.00865553 1 0 1 1 0 0 +EDGE2 8744 8385 1.0356 -0.0188069 0.0118497 1 0 1 1 0 0 +EDGE2 8744 8485 0.941464 -0.0106402 -0.00699917 1 0 1 1 0 0 +EDGE2 8744 8625 1.01153 -0.0615191 -0.0166065 1 0 1 1 0 0 +EDGE2 8744 8425 1.0194 -0.0179664 0.0227132 1 0 1 1 0 0 +EDGE2 8744 3105 1.0357 -0.107152 -3.16334 1 0 1 1 0 0 +EDGE2 8744 3485 0.958589 -0.0847553 -3.12413 1 0 1 1 0 0 +EDGE2 8744 5845 1.06015 0.0438324 -3.16111 1 0 1 1 0 0 +EDGE2 8744 5885 1.02175 0.0434209 -0.00629731 1 0 1 1 0 0 +EDGE2 8744 8365 0.933276 -0.0589134 0.00358418 1 0 1 1 0 0 +EDGE2 8744 5825 1.0116 0.0139352 -3.15832 1 0 1 1 0 0 +EDGE2 8744 3145 0.950202 0.138085 -3.14496 1 0 1 1 0 0 +EDGE2 8744 3165 1.03962 -0.0409128 -0.0065882 1 0 1 1 0 0 +EDGE2 8744 3385 1.07316 0.034492 -3.14127 1 0 1 1 0 0 +EDGE2 8744 3125 0.976179 -0.0267719 -3.17881 1 0 1 1 0 0 +EDGE2 8744 1185 1.00997 -0.0772791 -3.15459 1 0 1 1 0 0 +EDGE2 8744 3065 0.983187 0.0513126 -0.0245023 1 0 1 1 0 0 +EDGE2 8744 3085 1.04418 0.0243759 -0.0131543 1 0 1 1 0 0 +EDGE2 8744 1165 1.04742 0.0351461 -3.13183 1 0 1 1 0 0 +EDGE2 8744 8743 -1.06604 0.0223763 -0.0297007 1 0 1 1 0 0 +EDGE2 8744 3064 -0.0877465 -0.0265566 0.0195937 1 0 1 1 0 0 +EDGE2 8744 8384 -0.0153545 -0.00232462 0.00497111 1 0 1 1 0 0 +EDGE2 8744 8484 -0.0636118 0.0804277 -0.000828672 1 0 1 1 0 0 +EDGE2 8744 8624 0.000711907 0.0651919 -0.00661343 1 0 1 1 0 0 +EDGE2 8744 8424 0.0285662 0.0746757 -0.01992 1 0 1 1 0 0 +EDGE2 8744 3164 0.0136518 0.130745 -0.0547967 1 0 1 1 0 0 +EDGE2 8744 5884 0.00481613 -0.0472794 0.0157073 1 0 1 1 0 0 +EDGE2 8744 8364 0.00315874 0.0241652 0.0151656 1 0 1 1 0 0 +EDGE2 8744 3084 0.0136552 -0.0169273 0.0189426 1 0 1 1 0 0 +EDGE2 8744 8363 -0.979975 -0.0576515 -0.0188475 1 0 1 1 0 0 +EDGE2 8744 8423 -1.01644 0.0451399 0.0360131 1 0 1 1 0 0 +EDGE2 8744 8483 -0.969875 0.0606719 0.0244752 1 0 1 1 0 0 +EDGE2 8744 8623 -1.0829 0.0236286 -0.00271498 1 0 1 1 0 0 +EDGE2 8744 8383 -0.9667 -0.00904538 -0.0242453 1 0 1 1 0 0 +EDGE2 8744 3083 -0.953977 0.00652073 0.0134821 1 0 1 1 0 0 +EDGE2 8744 3163 -1.08866 -0.0513736 -0.00628555 1 0 1 1 0 0 +EDGE2 8744 5883 -0.89996 0.0606134 0.0132137 1 0 1 1 0 0 +EDGE2 8744 3063 -0.974999 -0.0625425 -0.0301307 1 0 1 1 0 0 +EDGE2 8745 8385 -0.113058 -0.00395999 0.0337753 1 0 1 1 0 0 +EDGE2 8745 8366 0.0345197 1.00416 1.54871 1 0 1 1 0 0 +EDGE2 8745 8626 0.0667811 0.994721 1.57925 1 0 1 1 0 0 +EDGE2 8745 8426 -0.0361337 1.00751 1.59042 1 0 1 1 0 0 +EDGE2 8745 3146 0.0498715 1.06614 1.53913 1 0 1 1 0 0 +EDGE2 8745 3386 -0.0787121 1.01248 1.58632 1 0 1 1 0 0 +EDGE2 8745 5886 0.00534954 1.01941 1.54952 1 0 1 1 0 0 +EDGE2 8745 3066 0.124692 0.919241 1.55875 1 0 1 1 0 0 +EDGE2 8745 3144 0.971758 0.0270995 -3.14032 1 0 1 1 0 0 +EDGE2 8745 3484 1.00851 -0.0259846 -3.16209 1 0 1 1 0 0 +EDGE2 8745 5824 0.971268 0.00285359 -3.13366 1 0 1 1 0 0 +EDGE2 8745 5844 0.968123 0.0322823 -3.12068 1 0 1 1 0 0 +EDGE2 8745 3384 0.880284 -0.00222594 -3.11033 1 0 1 1 0 0 +EDGE2 8745 1184 0.867194 0.0191072 -3.17262 1 0 1 1 0 0 +EDGE2 8745 3104 0.953079 -0.0100987 -3.15268 1 0 1 1 0 0 +EDGE2 8745 3124 1.01938 -0.0154905 -3.13321 1 0 1 1 0 0 +EDGE2 8745 1164 0.997084 -0.0849864 -3.14574 1 0 1 1 0 0 +EDGE2 8745 8485 -0.0528364 -0.0329783 0.000804652 1 0 1 1 0 0 +EDGE2 8745 8625 -0.029074 -0.0221557 -0.0265291 1 0 1 1 0 0 +EDGE2 8745 8425 -0.0433092 0.00664874 0.0301603 1 0 1 1 0 0 +EDGE2 8745 3166 0.0310812 -0.883037 -1.59801 1 0 1 1 0 0 +EDGE2 8745 3105 -0.151735 -0.0207315 -3.16537 1 0 1 1 0 0 +EDGE2 8745 3485 -0.0340025 -0.00577503 -3.1436 1 0 1 1 0 0 +EDGE2 8745 5845 -0.00661164 -0.0456449 -3.13744 1 0 1 1 0 0 +EDGE2 8745 5885 0.0893246 -0.0721372 0.023986 1 0 1 1 0 0 +EDGE2 8745 8365 -0.0849936 -0.0193452 0.0102503 1 0 1 1 0 0 +EDGE2 8745 5825 0.037844 0.0148368 -3.12573 1 0 1 1 0 0 +EDGE2 8745 3145 0.128484 -0.0962025 -3.12585 1 0 1 1 0 0 +EDGE2 8745 3165 0.027872 -0.103066 0.022317 1 0 1 1 0 0 +EDGE2 8745 3385 -0.00457297 0.0101977 -3.1126 1 0 1 1 0 0 +EDGE2 8745 3125 0.084385 -0.0394885 -3.11888 1 0 1 1 0 0 +EDGE2 8745 8486 -0.0348698 -1.01947 -1.58312 1 0 1 1 0 0 +EDGE2 8745 1185 -0.0706992 0.00227762 -3.16561 1 0 1 1 0 0 +EDGE2 8745 3065 -0.017249 0.127684 0.0118932 1 0 1 1 0 0 +EDGE2 8745 3085 -0.0998856 0.00397208 -0.00526737 1 0 1 1 0 0 +EDGE2 8745 1165 0.0674698 -0.0133774 -3.12622 1 0 1 1 0 0 +EDGE2 8745 5826 0.0196793 -1.00659 -1.58436 1 0 1 1 0 0 +EDGE2 8745 5846 -0.0360836 -0.950666 -1.5612 1 0 1 1 0 0 +EDGE2 8745 8386 0.021521 -0.963809 -1.56249 1 0 1 1 0 0 +EDGE2 8745 3486 -0.0561439 -1.05905 -1.58277 1 0 1 1 0 0 +EDGE2 8745 1166 0.0281029 -0.962333 -1.57491 1 0 1 1 0 0 +EDGE2 8745 3086 0.0235506 -0.963205 -1.55015 1 0 1 1 0 0 +EDGE2 8745 3106 -0.00452614 -0.992098 -1.58749 1 0 1 1 0 0 +EDGE2 8745 3126 0.0612801 -0.973702 -1.55934 1 0 1 1 0 0 +EDGE2 8745 1186 -0.000864608 -1.10378 -1.5749 1 0 1 1 0 0 +EDGE2 8745 3064 -0.968663 0.0200908 -0.0277433 1 0 1 1 0 0 +EDGE2 8745 8384 -1.03579 0.010321 0.0224326 1 0 1 1 0 0 +EDGE2 8745 8484 -0.967589 0.0477636 0.00811149 1 0 1 1 0 0 +EDGE2 8745 8624 -1.06528 -0.0490093 -0.0253453 1 0 1 1 0 0 +EDGE2 8745 8744 -1.10093 -0.0428931 0.00710344 1 0 1 1 0 0 +EDGE2 8745 8424 -0.974863 0.0467544 -0.0219225 1 0 1 1 0 0 +EDGE2 8745 3164 -1.01181 0.123375 -0.0230768 1 0 1 1 0 0 +EDGE2 8745 5884 -1.05 0.0687689 -0.00510288 1 0 1 1 0 0 +EDGE2 8745 8364 -0.947058 0.0241819 0.0101846 1 0 1 1 0 0 +EDGE2 8745 3084 -1.06495 0.0685237 0.0144331 1 0 1 1 0 0 +EDGE2 8746 8385 -1.03417 0.0502338 -1.55425 1 0 1 1 0 0 +EDGE2 8746 8366 -0.0331994 -0.0344298 -0.0167194 1 0 1 1 0 0 +EDGE2 8746 8627 1.04368 0.0542513 0.0128638 1 0 1 1 0 0 +EDGE2 8746 3147 0.979648 0.0150722 -0.0125737 1 0 1 1 0 0 +EDGE2 8746 5887 0.995282 -0.0607003 0.0279779 1 0 1 1 0 0 +EDGE2 8746 8367 0.992213 -0.035235 0.0207846 1 0 1 1 0 0 +EDGE2 8746 8427 1.11577 0.0529408 -0.00560991 1 0 1 1 0 0 +EDGE2 8746 3387 1.01229 0.00299899 -0.0128123 1 0 1 1 0 0 +EDGE2 8746 8626 -0.104671 0.050484 -0.0406385 1 0 1 1 0 0 +EDGE2 8746 3067 1.04186 0.0251245 -0.012686 1 0 1 1 0 0 +EDGE2 8746 8426 0.043766 -0.0423469 0.00101307 1 0 1 1 0 0 +EDGE2 8746 3146 0.0189216 0.0968951 0.01667 1 0 1 1 0 0 +EDGE2 8746 3386 -0.0382292 0.0306686 2.70869e-05 1 0 1 1 0 0 +EDGE2 8746 5886 0.0762492 -0.0245333 -0.0180903 1 0 1 1 0 0 +EDGE2 8746 3066 -0.00985041 0.0167968 0.00851456 1 0 1 1 0 0 +EDGE2 8746 8745 -1.02183 -0.000947744 -1.58184 1 0 1 1 0 0 +EDGE2 8746 8485 -0.95553 0.0781946 -1.56085 1 0 1 1 0 0 +EDGE2 8746 8625 -1.03306 -0.0945544 -1.55471 1 0 1 1 0 0 +EDGE2 8746 8425 -0.999328 -0.0385095 -1.58723 1 0 1 1 0 0 +EDGE2 8746 3105 -0.994074 -0.0602395 1.55157 1 0 1 1 0 0 +EDGE2 8746 3485 -0.947836 -0.00471991 1.591 1 0 1 1 0 0 +EDGE2 8746 5845 -0.990199 0.0781805 1.60038 1 0 1 1 0 0 +EDGE2 8746 5885 -0.974747 -0.100297 -1.55101 1 0 1 1 0 0 +EDGE2 8746 8365 -0.903847 0.0161184 -1.56837 1 0 1 1 0 0 +EDGE2 8746 5825 -1.08281 0.108588 1.57272 1 0 1 1 0 0 +EDGE2 8746 3145 -1.01025 -0.0202279 1.6007 1 0 1 1 0 0 +EDGE2 8746 3165 -0.912883 -0.00191336 -1.54985 1 0 1 1 0 0 +EDGE2 8746 3385 -0.988953 -0.0696106 1.54968 1 0 1 1 0 0 +EDGE2 8746 3125 -0.955122 -0.0196993 1.57447 1 0 1 1 0 0 +EDGE2 8746 1185 -0.99917 -0.0101416 1.58567 1 0 1 1 0 0 +EDGE2 8746 3065 -1.10483 0.034097 -1.57071 1 0 1 1 0 0 +EDGE2 8746 3085 -0.992826 -0.00376433 -1.55982 1 0 1 1 0 0 +EDGE2 8746 1165 -0.969397 0.0487869 1.56498 1 0 1 1 0 0 +EDGE2 8747 8366 -1.03897 0.0868762 -0.0197752 1 0 1 1 0 0 +EDGE2 8747 8627 0.0574402 -0.0593805 -0.013833 1 0 1 1 0 0 +EDGE2 8747 5888 1.03567 -0.00269972 -0.0128829 1 0 1 1 0 0 +EDGE2 8747 8428 0.967853 -0.0381265 0.00239181 1 0 1 1 0 0 +EDGE2 8747 8628 0.996651 0.0220687 0.0127406 1 0 1 1 0 0 +EDGE2 8747 8368 1.01542 0.0411053 0.00265554 1 0 1 1 0 0 +EDGE2 8747 3068 1.01474 -0.0688631 -0.0102329 1 0 1 1 0 0 +EDGE2 8747 3148 1.00312 -0.0568947 0.000269944 1 0 1 1 0 0 +EDGE2 8747 3388 1.01787 0.0458185 0.0163154 1 0 1 1 0 0 +EDGE2 8747 3147 0.0442039 0.0697625 -0.000335001 1 0 1 1 0 0 +EDGE2 8747 5887 -0.0481997 0.0671458 -0.00649673 1 0 1 1 0 0 +EDGE2 8747 8367 -0.00689524 -0.00340441 0.0269969 1 0 1 1 0 0 +EDGE2 8747 8427 0.0131076 0.0421132 0.0107728 1 0 1 1 0 0 +EDGE2 8747 3387 -0.0294554 0.0713127 0.00850305 1 0 1 1 0 0 +EDGE2 8747 8626 -0.985016 0.0110652 -0.0108546 1 0 1 1 0 0 +EDGE2 8747 8746 -1.02257 0.0117285 -0.00463163 1 0 1 1 0 0 +EDGE2 8747 3067 0.00638412 -0.00627898 -0.0113758 1 0 1 1 0 0 +EDGE2 8747 8426 -1.05673 -0.0378694 -0.00250921 1 0 1 1 0 0 +EDGE2 8747 3146 -0.966233 -0.0219055 -0.0334391 1 0 1 1 0 0 +EDGE2 8747 3386 -1.03845 0.0168996 0.00209882 1 0 1 1 0 0 +EDGE2 8747 5886 -0.965459 0.0535937 -0.0306499 1 0 1 1 0 0 +EDGE2 8747 3066 -0.943881 0.0532982 0.0281819 1 0 1 1 0 0 +EDGE2 8748 5889 0.98429 0.0881427 -0.0550597 1 0 1 1 0 0 +EDGE2 8748 8429 1.00152 -0.0265489 -0.0137358 1 0 1 1 0 0 +EDGE2 8748 8629 0.994332 -0.0913149 0.016245 1 0 1 1 0 0 +EDGE2 8748 8369 1.03057 0.0379651 -0.0259549 1 0 1 1 0 0 +EDGE2 8748 3149 0.954631 0.0575454 -0.0245102 1 0 1 1 0 0 +EDGE2 8748 3389 0.995076 -0.03687 0.0227933 1 0 1 1 0 0 +EDGE2 8748 3069 0.967172 0.0133928 -0.0410118 1 0 1 1 0 0 +EDGE2 8748 8627 -1.0174 0.022316 0.010791 1 0 1 1 0 0 +EDGE2 8748 5888 -0.0534511 -0.0647777 0.00969024 1 0 1 1 0 0 +EDGE2 8748 8428 -0.00560048 -0.0595708 0.00257547 1 0 1 1 0 0 +EDGE2 8748 8628 0.00351087 0.0596897 0.0141068 1 0 1 1 0 0 +EDGE2 8748 8368 -0.0304327 0.0260681 -0.0297544 1 0 1 1 0 0 +EDGE2 8748 3068 -0.0323201 0.00811154 -0.0084432 1 0 1 1 0 0 +EDGE2 8748 3148 -0.00381808 -0.0325196 -0.038685 1 0 1 1 0 0 +EDGE2 8748 3388 0.0624639 -0.0396477 -0.00675369 1 0 1 1 0 0 +EDGE2 8748 8747 -1.09902 -0.0484298 0.0125597 1 0 1 1 0 0 +EDGE2 8748 3147 -0.962809 -0.0574332 -0.0362281 1 0 1 1 0 0 +EDGE2 8748 5887 -1.0114 0.0219893 -0.00126928 1 0 1 1 0 0 +EDGE2 8748 8367 -1.05052 -0.0101965 -0.0107877 1 0 1 1 0 0 +EDGE2 8748 8427 -0.983232 -0.0430329 -0.00126068 1 0 1 1 0 0 +EDGE2 8748 3387 -1.01864 0.0325631 0.0416222 1 0 1 1 0 0 +EDGE2 8748 3067 -0.943616 0.0583238 -0.0185721 1 0 1 1 0 0 +EDGE2 8749 8370 1.02786 -0.00684604 0.0411076 1 0 1 1 0 0 +EDGE2 8749 8470 1.00899 0.0141927 -3.13447 1 0 1 1 0 0 +EDGE2 8749 8610 1.1014 -0.174012 -3.14926 1 0 1 1 0 0 +EDGE2 8749 8630 0.946588 -0.0288562 0.0412781 1 0 1 1 0 0 +EDGE2 8749 8430 1.01825 0.00124591 -0.0176287 1 0 1 1 0 0 +EDGE2 8749 3070 1.0313 -0.10977 0.00813907 1 0 1 1 0 0 +EDGE2 8749 3390 1.00657 0.0467799 -0.0126935 1 0 1 1 0 0 +EDGE2 8749 3410 0.950234 -0.0127144 -3.13263 1 0 1 1 0 0 +EDGE2 8749 5890 1.00904 -0.0554674 -0.0132588 1 0 1 1 0 0 +EDGE2 8749 3150 0.981644 -0.0340394 -0.0169237 1 0 1 1 0 0 +EDGE2 8749 5889 0.0532168 -0.106964 -0.00129761 1 0 1 1 0 0 +EDGE2 8749 8429 -0.0114951 -0.0290234 -0.00261851 1 0 1 1 0 0 +EDGE2 8749 8629 -0.0235752 -0.0190707 -0.0246557 1 0 1 1 0 0 +EDGE2 8749 8369 -0.0768486 0.0590853 0.0522102 1 0 1 1 0 0 +EDGE2 8749 3149 0.0343309 -0.021226 -0.0050993 1 0 1 1 0 0 +EDGE2 8749 3389 0.0439917 -0.0285385 0.00990864 1 0 1 1 0 0 +EDGE2 8749 3069 0.0272848 0.0248346 -0.0158668 1 0 1 1 0 0 +EDGE2 8749 5888 -1.02148 0.0825552 0.0433152 1 0 1 1 0 0 +EDGE2 8749 8428 -1.00892 -0.0534012 0.00793507 1 0 1 1 0 0 +EDGE2 8749 8628 -1.12634 0.0891451 -0.0014568 1 0 1 1 0 0 +EDGE2 8749 8748 -0.943463 0.0413117 -0.0256753 1 0 1 1 0 0 +EDGE2 8749 8368 -0.953332 -0.0896948 0.0472815 1 0 1 1 0 0 +EDGE2 8749 3068 -1.00677 0.0288513 -0.0248134 1 0 1 1 0 0 +EDGE2 8749 3148 -1.06083 0.051815 -0.0330018 1 0 1 1 0 0 +EDGE2 8749 3388 -1.02373 -0.110498 0.0122601 1 0 1 1 0 0 +EDGE2 8750 8469 1.00175 0.00758719 -3.14604 1 0 1 1 0 0 +EDGE2 8750 8609 0.960319 -0.0130702 -3.15498 1 0 1 1 0 0 +EDGE2 8750 3409 1.05491 0.0828218 -3.16077 1 0 1 1 0 0 +EDGE2 8750 8370 -0.0894173 0.106141 -0.0152319 1 0 1 1 0 0 +EDGE2 8750 3411 -0.0427898 -1.09986 -1.57018 1 0 1 1 0 0 +EDGE2 8750 5891 0.0178981 -0.94329 -1.55458 1 0 1 1 0 0 +EDGE2 8750 8431 0.077006 -0.915487 -1.56086 1 0 1 1 0 0 +EDGE2 8750 3391 0.062817 -1.05815 -1.60095 1 0 1 1 0 0 +EDGE2 8750 8470 -0.073493 -0.0160706 -3.15499 1 0 1 1 0 0 +EDGE2 8750 8610 -0.0463165 -0.015165 -3.1715 1 0 1 1 0 0 +EDGE2 8750 8630 -0.0489456 0.0281497 0.010184 1 0 1 1 0 0 +EDGE2 8750 8430 -0.00288997 -0.0106927 0.0176096 1 0 1 1 0 0 +EDGE2 8750 3070 0.0406423 -0.0463761 -0.0159862 1 0 1 1 0 0 +EDGE2 8750 3390 -0.0856796 0.0283797 -0.0202812 1 0 1 1 0 0 +EDGE2 8750 3410 0.0142747 -0.0489941 -3.12588 1 0 1 1 0 0 +EDGE2 8750 5890 -0.0376471 -0.0680999 0.000901731 1 0 1 1 0 0 +EDGE2 8750 3150 0.108574 0.0430627 -0.0190598 1 0 1 1 0 0 +EDGE2 8750 5889 -1.00793 0.0985815 0.0285911 1 0 1 1 0 0 +EDGE2 8750 8429 -0.990587 -0.0422057 -0.0285819 1 0 1 1 0 0 +EDGE2 8750 8629 -0.987909 0.0307454 0.0373161 1 0 1 1 0 0 +EDGE2 8750 8749 -1.00319 0.00511571 -0.00141566 1 0 1 1 0 0 +EDGE2 8750 8369 -0.972344 0.0057795 0.00561794 1 0 1 1 0 0 +EDGE2 8750 3149 -0.988745 -0.0245401 -0.00328785 1 0 1 1 0 0 +EDGE2 8750 3389 -1.0516 0.00149187 0.017314 1 0 1 1 0 0 +EDGE2 8750 3069 -0.952873 0.0670986 -0.0271435 1 0 1 1 0 0 +EDGE2 8750 8611 0.0454278 0.920909 1.55877 1 0 1 1 0 0 +EDGE2 8750 8631 -0.0164121 0.922409 1.59233 1 0 1 1 0 0 +EDGE2 8750 3151 0.00648961 0.924987 1.57994 1 0 1 1 0 0 +EDGE2 8750 8371 -0.0345043 0.974528 1.56453 1 0 1 1 0 0 +EDGE2 8750 8471 -0.0296785 0.984115 1.51756 1 0 1 1 0 0 +EDGE2 8750 3071 -0.0283554 0.989429 1.57452 1 0 1 1 0 0 +EDGE2 8751 8370 -0.990877 0.0121168 1.57949 1 0 1 1 0 0 +EDGE2 8751 3412 0.999005 -0.0134054 0.0208575 1 0 1 1 0 0 +EDGE2 8751 5892 1.06391 0.0551137 0.0167533 1 0 1 1 0 0 +EDGE2 8751 8432 1.04893 0.0457909 0.00795945 1 0 1 1 0 0 +EDGE2 8751 3392 0.891454 -0.0598954 0.0057801 1 0 1 1 0 0 +EDGE2 8751 8750 -1.05094 0.0757078 1.54309 1 0 1 1 0 0 +EDGE2 8751 3411 0.0159051 0.0137777 -0.00311331 1 0 1 1 0 0 +EDGE2 8751 5891 0.000864125 0.0182773 -0.0215017 1 0 1 1 0 0 +EDGE2 8751 8431 0.0466495 0.0493951 0.0179833 1 0 1 1 0 0 +EDGE2 8751 3391 0.00711354 -0.0731618 -0.0130372 1 0 1 1 0 0 +EDGE2 8751 8470 -1.00673 0.00262072 -1.58124 1 0 1 1 0 0 +EDGE2 8751 8610 -1.03065 0.0511529 -1.56764 1 0 1 1 0 0 +EDGE2 8751 8630 -0.979077 -0.0127526 1.53917 1 0 1 1 0 0 +EDGE2 8751 8430 -0.932903 -0.0218691 1.5541 1 0 1 1 0 0 +EDGE2 8751 3070 -1.04899 -0.0364538 1.56277 1 0 1 1 0 0 +EDGE2 8751 3390 -1.00694 -0.00277568 1.60124 1 0 1 1 0 0 +EDGE2 8751 3410 -0.982752 -0.0581779 -1.56619 1 0 1 1 0 0 +EDGE2 8751 5890 -1.00452 0.0238836 1.58766 1 0 1 1 0 0 +EDGE2 8751 3150 -1.03025 -0.00134315 1.56173 1 0 1 1 0 0 +EDGE2 8752 8751 -1.02572 0.0247064 0.00683846 1 0 1 1 0 0 +EDGE2 8752 3413 1.09909 -0.0214072 0.0111871 1 0 1 1 0 0 +EDGE2 8752 5893 0.971544 0.0300796 -0.0205499 1 0 1 1 0 0 +EDGE2 8752 8433 0.992686 0.0312781 -0.0119715 1 0 1 1 0 0 +EDGE2 8752 3393 0.994328 0.0638871 -0.0175794 1 0 1 1 0 0 +EDGE2 8752 3412 -0.0119768 0.000411927 0.0460244 1 0 1 1 0 0 +EDGE2 8752 5892 -0.144416 -0.0676023 -0.014277 1 0 1 1 0 0 +EDGE2 8752 8432 -0.0610242 -0.0325594 -0.00162012 1 0 1 1 0 0 +EDGE2 8752 3392 -0.000288306 -0.0269869 -0.00515667 1 0 1 1 0 0 +EDGE2 8752 3411 -0.915607 0.0228394 -0.038258 1 0 1 1 0 0 +EDGE2 8752 5891 -0.992941 0.0100393 0.00438708 1 0 1 1 0 0 +EDGE2 8752 8431 -0.98671 -0.0926857 0.0152626 1 0 1 1 0 0 +EDGE2 8752 3391 -0.925986 0.0281482 0.0305246 1 0 1 1 0 0 +EDGE2 8753 3414 0.990283 0.034605 0.0132379 1 0 1 1 0 0 +EDGE2 8753 5894 0.901876 -0.0654712 -0.00789672 1 0 1 1 0 0 +EDGE2 8753 8434 1.02658 -0.0101649 0.00308832 1 0 1 1 0 0 +EDGE2 8753 3394 1.05606 0.171946 -0.00706869 1 0 1 1 0 0 +EDGE2 8753 8752 -0.994768 -0.0142375 -0.00302066 1 0 1 1 0 0 +EDGE2 8753 3413 -0.00526298 -0.0398581 -0.0102251 1 0 1 1 0 0 +EDGE2 8753 5893 -0.0618638 -0.035622 -0.0106406 1 0 1 1 0 0 +EDGE2 8753 8433 -0.00831133 -0.00836817 0.0300195 1 0 1 1 0 0 +EDGE2 8753 3393 -0.00787988 -0.0352962 -0.0260054 1 0 1 1 0 0 +EDGE2 8753 3412 -1.02466 0.060138 -0.0175406 1 0 1 1 0 0 +EDGE2 8753 5892 -1.02977 0.0481385 -0.024129 1 0 1 1 0 0 +EDGE2 8753 8432 -0.997062 0.0532673 0.00228838 1 0 1 1 0 0 +EDGE2 8753 3392 -0.968438 0.0205496 0.00952311 1 0 1 1 0 0 +EDGE2 8754 3395 0.992587 -0.0261535 0.020798 1 0 1 1 0 0 +EDGE2 8754 8435 1.01543 -0.0492051 0.0184017 1 0 1 1 0 0 +EDGE2 8754 8595 1.05266 0.023746 -3.12264 1 0 1 1 0 0 +EDGE2 8754 3435 1.0536 -0.0279194 -3.14548 1 0 1 1 0 0 +EDGE2 8754 5895 0.934921 0.0216095 -0.0270705 1 0 1 1 0 0 +EDGE2 8754 3415 1.12323 -0.0424703 -0.0155376 1 0 1 1 0 0 +EDGE2 8754 8753 -0.977111 0.0284637 -0.00249909 1 0 1 1 0 0 +EDGE2 8754 855 0.957624 0.000173114 -3.14669 1 0 1 1 0 0 +EDGE2 8754 895 1.03102 -0.0146365 -3.1231 1 0 1 1 0 0 +EDGE2 8754 915 1.05044 -0.0279198 -3.1394 1 0 1 1 0 0 +EDGE2 8754 835 0.991277 -0.0990212 -3.17504 1 0 1 1 0 0 +EDGE2 8754 3414 -0.0501137 0.00714659 0.0199551 1 0 1 1 0 0 +EDGE2 8754 5894 -0.0687311 0.0177114 0.0225369 1 0 1 1 0 0 +EDGE2 8754 8434 -0.0362536 0.0627979 -0.0306116 1 0 1 1 0 0 +EDGE2 8754 3394 0.0585514 -0.0374976 0.0123488 1 0 1 1 0 0 +EDGE2 8754 3413 -0.952882 0.00727012 -0.0188377 1 0 1 1 0 0 +EDGE2 8754 5893 -1.07062 -0.0376823 -0.0320223 1 0 1 1 0 0 +EDGE2 8754 8433 -1.13926 0.0441389 -0.00819448 1 0 1 1 0 0 +EDGE2 8754 3393 -1.00977 0.0395584 0.0330785 1 0 1 1 0 0 +EDGE2 8755 3395 -0.0326994 -0.0360447 0.00539422 1 0 1 1 0 0 +EDGE2 8755 8596 0.00614568 0.938023 1.55901 1 0 1 1 0 0 +EDGE2 8755 3396 0.0052628 0.915769 1.54702 1 0 1 1 0 0 +EDGE2 8755 5896 -0.0703429 1.00075 1.59129 1 0 1 1 0 0 +EDGE2 8755 8436 0.0230864 0.962214 1.54533 1 0 1 1 0 0 +EDGE2 8755 916 0.0355261 1.01525 1.59945 1 0 1 1 0 0 +EDGE2 8755 3434 0.983052 0.024799 -3.13914 1 0 1 1 0 0 +EDGE2 8755 8594 1.03378 -0.0670796 -3.19963 1 0 1 1 0 0 +EDGE2 8755 894 1.01613 -0.116504 -3.1508 1 0 1 1 0 0 +EDGE2 8755 914 0.945657 -0.0357108 -3.14031 1 0 1 1 0 0 +EDGE2 8755 8435 -0.00135993 0.00605203 0.00288511 1 0 1 1 0 0 +EDGE2 8755 834 0.978834 -0.00538311 -3.11714 1 0 1 1 0 0 +EDGE2 8755 854 0.977813 0.0653807 -3.14806 1 0 1 1 0 0 +EDGE2 8755 8595 -0.000766045 -0.0169836 -3.12761 1 0 1 1 0 0 +EDGE2 8755 3435 0.018981 -0.00371776 -3.1356 1 0 1 1 0 0 +EDGE2 8755 5895 0.0276172 0.0139417 0.0262763 1 0 1 1 0 0 +EDGE2 8755 3415 -0.0187844 -0.0292682 -0.00119588 1 0 1 1 0 0 +EDGE2 8755 8754 -1.05498 0.00359241 -0.012227 1 0 1 1 0 0 +EDGE2 8755 855 0.0369637 0.0576828 -3.17143 1 0 1 1 0 0 +EDGE2 8755 895 -0.0484719 0.0384152 -3.14898 1 0 1 1 0 0 +EDGE2 8755 915 0.0212611 -0.0415347 -3.12539 1 0 1 1 0 0 +EDGE2 8755 835 0.0108416 -0.0468031 -3.12633 1 0 1 1 0 0 +EDGE2 8755 3414 -1.05598 0.013407 0.0286472 1 0 1 1 0 0 +EDGE2 8755 5894 -0.950604 -0.0322334 0.0179961 1 0 1 1 0 0 +EDGE2 8755 8434 -0.957338 0.0013278 0.000594918 1 0 1 1 0 0 +EDGE2 8755 3394 -0.917591 -0.0468153 0.0125106 1 0 1 1 0 0 +EDGE2 8755 3436 -0.0475867 -1.0088 -1.57719 1 0 1 1 0 0 +EDGE2 8755 856 0.0506369 -0.984711 -1.53982 1 0 1 1 0 0 +EDGE2 8755 896 0.0380968 -0.973654 -1.55156 1 0 1 1 0 0 +EDGE2 8755 3416 -0.0448634 -0.985907 -1.55961 1 0 1 1 0 0 +EDGE2 8755 836 0.0160953 -1.01864 -1.56371 1 0 1 1 0 0 +EDGE2 8756 3395 -0.994775 -0.0653151 -1.54553 1 0 1 1 0 0 +EDGE2 8756 8597 1.03139 0.0337132 0.0273075 1 0 1 1 0 0 +EDGE2 8756 8437 0.966671 0.0231774 0.0422126 1 0 1 1 0 0 +EDGE2 8756 8596 0.0319429 -0.0325863 -0.0164523 1 0 1 1 0 0 +EDGE2 8756 917 1.0381 0.00218241 -0.0193289 1 0 1 1 0 0 +EDGE2 8756 3397 1.03859 -0.113778 -0.00389793 1 0 1 1 0 0 +EDGE2 8756 5897 1.06843 0.0328478 0.019724 1 0 1 1 0 0 +EDGE2 8756 3396 -0.012756 0.0158557 -0.0436446 1 0 1 1 0 0 +EDGE2 8756 5896 0.0325908 0.00447224 0.00652677 1 0 1 1 0 0 +EDGE2 8756 8436 0.109724 -0.000997822 0.0256452 1 0 1 1 0 0 +EDGE2 8756 916 -0.00630218 0.0129192 -0.0237593 1 0 1 1 0 0 +EDGE2 8756 8435 -1.01167 -0.0138788 -1.53003 1 0 1 1 0 0 +EDGE2 8756 8755 -1.04664 -0.0124784 -1.56631 1 0 1 1 0 0 +EDGE2 8756 8595 -1.0665 0.0647208 1.58252 1 0 1 1 0 0 +EDGE2 8756 3435 -0.998022 0.00569056 1.57474 1 0 1 1 0 0 +EDGE2 8756 5895 -1.09032 -0.0283945 -1.56605 1 0 1 1 0 0 +EDGE2 8756 3415 -0.988659 -0.0509944 -1.53972 1 0 1 1 0 0 +EDGE2 8756 855 -0.968608 0.0236431 1.56307 1 0 1 1 0 0 +EDGE2 8756 895 -1.01266 -0.0572952 1.5753 1 0 1 1 0 0 +EDGE2 8756 915 -1.06 0.00536135 1.56651 1 0 1 1 0 0 +EDGE2 8756 835 -0.912268 0.00389724 1.56333 1 0 1 1 0 0 +EDGE2 8757 8597 -0.013213 -0.0205372 -0.0547786 1 0 1 1 0 0 +EDGE2 8757 8438 1.03014 0.0871044 -0.00785557 1 0 1 1 0 0 +EDGE2 8757 8598 0.991457 0.0025718 -0.0262078 1 0 1 1 0 0 +EDGE2 8757 918 0.925224 0.01906 0.0283842 1 0 1 1 0 0 +EDGE2 8757 3398 1.01705 -0.023827 0.0187235 1 0 1 1 0 0 +EDGE2 8757 5898 1.0732 -0.0145269 0.0279725 1 0 1 1 0 0 +EDGE2 8757 8437 -0.0188355 -0.0103067 -0.00527145 1 0 1 1 0 0 +EDGE2 8757 8596 -1.02371 0.0542372 0.00199717 1 0 1 1 0 0 +EDGE2 8757 917 -0.00360017 -0.0125759 0.0311176 1 0 1 1 0 0 +EDGE2 8757 3397 -0.0269394 -0.027182 -0.0127628 1 0 1 1 0 0 +EDGE2 8757 5897 0.0738976 0.0819677 0.024977 1 0 1 1 0 0 +EDGE2 8757 8756 -1.06236 0.109009 0.0201187 1 0 1 1 0 0 +EDGE2 8757 3396 -0.964384 0.0453933 -0.0233173 1 0 1 1 0 0 +EDGE2 8757 5896 -1.04214 -0.0086724 0.0391737 1 0 1 1 0 0 +EDGE2 8757 8436 -0.967894 -0.0452201 0.0281431 1 0 1 1 0 0 +EDGE2 8757 916 -0.942334 0.0806635 -0.00276533 1 0 1 1 0 0 +EDGE2 8758 8597 -1.00059 0.069218 -0.0170448 1 0 1 1 0 0 +EDGE2 8758 5899 0.986569 -0.032713 0.00147946 1 0 1 1 0 0 +EDGE2 8758 8439 0.959775 -0.075427 -0.00650809 1 0 1 1 0 0 +EDGE2 8758 8599 0.979979 0.00100298 0.00212361 1 0 1 1 0 0 +EDGE2 8758 8438 0.0323961 0.0921645 0.0174306 1 0 1 1 0 0 +EDGE2 8758 919 0.974968 -0.021762 0.0273986 1 0 1 1 0 0 +EDGE2 8758 3399 0.993602 0.0263682 0.00686395 1 0 1 1 0 0 +EDGE2 8758 8598 -0.0142417 0.00652419 -0.0142713 1 0 1 1 0 0 +EDGE2 8758 918 -0.0346273 -0.0494436 -0.0257312 1 0 1 1 0 0 +EDGE2 8758 3398 -0.00290932 0.019457 0.0190262 1 0 1 1 0 0 +EDGE2 8758 5898 -0.0487294 0.0236121 -0.0147264 1 0 1 1 0 0 +EDGE2 8758 8757 -0.949301 -0.0371494 0.00387902 1 0 1 1 0 0 +EDGE2 8758 8437 -1.01352 0.0714362 -0.00293349 1 0 1 1 0 0 +EDGE2 8758 917 -0.932028 -0.0988655 -0.017597 1 0 1 1 0 0 +EDGE2 8758 3397 -0.974048 -0.0376599 0.00807979 1 0 1 1 0 0 +EDGE2 8758 5897 -0.915664 0.0626672 -0.0322464 1 0 1 1 0 0 +EDGE2 8759 5900 1.00125 0.00928406 0.0250714 1 0 1 1 0 0 +EDGE2 8759 8600 0.97884 0.0401643 -0.00360505 1 0 1 1 0 0 +EDGE2 8759 8440 1.01575 0.0336907 0.0115984 1 0 1 1 0 0 +EDGE2 8759 920 1.06533 -0.0170188 -0.00908505 1 0 1 1 0 0 +EDGE2 8759 3400 0.995581 0.031975 0.0452082 1 0 1 1 0 0 +EDGE2 8759 680 1.03972 -0.0368764 -3.11048 1 0 1 1 0 0 +EDGE2 8759 5899 -0.0395321 -0.00459964 0.0190233 1 0 1 1 0 0 +EDGE2 8759 8439 -0.00635761 -0.0261679 0.0100415 1 0 1 1 0 0 +EDGE2 8759 8599 -0.0429761 0.0465718 0.0353693 1 0 1 1 0 0 +EDGE2 8759 8438 -1.00003 -0.0781063 0.0102729 1 0 1 1 0 0 +EDGE2 8759 8758 -0.887949 0.0432296 0.0094738 1 0 1 1 0 0 +EDGE2 8759 919 0.0453512 0.0735079 0.00221787 1 0 1 1 0 0 +EDGE2 8759 3399 -0.0363036 -0.0213855 0.0180162 1 0 1 1 0 0 +EDGE2 8759 8598 -0.93102 -0.111608 -0.00894173 1 0 1 1 0 0 +EDGE2 8759 918 -1.05491 0.0249408 0.0192274 1 0 1 1 0 0 +EDGE2 8759 3398 -0.967525 -0.0470028 -0.0130193 1 0 1 1 0 0 +EDGE2 8759 5898 -0.954762 0.0235373 0.012806 1 0 1 1 0 0 +EDGE2 8760 921 0.029951 0.973767 1.57873 1 0 1 1 0 0 +EDGE2 8760 679 0.982562 0.00510649 -3.14957 1 0 1 1 0 0 +EDGE2 8760 681 -0.0569578 -0.976402 -1.56835 1 0 1 1 0 0 +EDGE2 8760 5901 -0.0788644 -1.03251 -1.58466 1 0 1 1 0 0 +EDGE2 8760 5900 -0.0145933 0.0027746 -0.0134484 1 0 1 1 0 0 +EDGE2 8760 8600 -0.0771517 -0.0337136 -0.0044282 1 0 1 1 0 0 +EDGE2 8760 8440 -0.0246703 0.00680106 -0.0148908 1 0 1 1 0 0 +EDGE2 8760 920 -0.0388367 -0.0332352 -0.0218057 1 0 1 1 0 0 +EDGE2 8760 3400 -0.0642562 0.0569877 0.00525305 1 0 1 1 0 0 +EDGE2 8760 680 0.00945497 0.0664316 -3.12162 1 0 1 1 0 0 +EDGE2 8760 8441 -0.0194332 1.04587 1.58039 1 0 1 1 0 0 +EDGE2 8760 8601 0.0185029 1.05774 1.55448 1 0 1 1 0 0 +EDGE2 8760 3401 0.0649459 1.10459 1.55866 1 0 1 1 0 0 +EDGE2 8760 5899 -1.02494 -0.0266521 0.0187502 1 0 1 1 0 0 +EDGE2 8760 8439 -1.12334 -0.0184494 0.0233565 1 0 1 1 0 0 +EDGE2 8760 8759 -0.9815 0.0311081 -0.000872428 1 0 1 1 0 0 +EDGE2 8760 8599 -0.979437 -0.0313199 0.0303868 1 0 1 1 0 0 +EDGE2 8760 919 -0.949844 -0.0705041 -0.0130987 1 0 1 1 0 0 +EDGE2 8760 3399 -0.99717 0.0250246 0.00500722 1 0 1 1 0 0 +EDGE2 8761 681 0.0624124 -0.0144335 -0.0132755 1 0 1 1 0 0 +EDGE2 8761 5902 1.00957 0.00678744 -0.015243 1 0 1 1 0 0 +EDGE2 8761 682 0.994275 0.111609 0.00504329 1 0 1 1 0 0 +EDGE2 8761 5901 0.0248026 0.0140815 0.0265024 1 0 1 1 0 0 +EDGE2 8761 5900 -0.991059 -0.00307389 1.55117 1 0 1 1 0 0 +EDGE2 8761 8600 -0.914388 0.0670404 1.5503 1 0 1 1 0 0 +EDGE2 8761 8760 -0.988155 0.0513703 1.56026 1 0 1 1 0 0 +EDGE2 8761 8440 -1.03007 -0.0648208 1.54324 1 0 1 1 0 0 +EDGE2 8761 920 -1.07434 -0.0116714 1.58061 1 0 1 1 0 0 +EDGE2 8761 3400 -0.958245 0.00205826 1.56582 1 0 1 1 0 0 +EDGE2 8761 680 -1.08801 0.0167638 -1.57714 1 0 1 1 0 0 +EDGE2 8762 681 -0.912356 0.00948011 -0.00933489 1 0 1 1 0 0 +EDGE2 8762 5902 -0.0163623 -0.0326818 -0.0135145 1 0 1 1 0 0 +EDGE2 8762 683 1.01836 0.0754369 0.0183523 1 0 1 1 0 0 +EDGE2 8762 5903 0.955129 0.0833787 0.00529101 1 0 1 1 0 0 +EDGE2 8762 8761 -0.993065 0.101881 0.0287386 1 0 1 1 0 0 +EDGE2 8762 682 -0.0103342 -0.050568 -0.0142876 1 0 1 1 0 0 +EDGE2 8762 5901 -1.02898 0.0781597 0.00977181 1 0 1 1 0 0 +EDGE2 8763 684 0.993988 0.0209741 0.0076115 1 0 1 1 0 0 +EDGE2 8763 5904 0.89256 0.00347708 0.00515641 1 0 1 1 0 0 +EDGE2 8763 5902 -1.08225 -0.0359952 -0.00381 1 0 1 1 0 0 +EDGE2 8763 683 -0.0743058 0.0277845 0.0106362 1 0 1 1 0 0 +EDGE2 8763 5903 -0.0665781 0.149623 0.0344098 1 0 1 1 0 0 +EDGE2 8763 8762 -1.05846 0.0161447 -0.0142497 1 0 1 1 0 0 +EDGE2 8763 682 -1.1178 -0.00175731 -0.00826346 1 0 1 1 0 0 +EDGE2 8764 5945 0.835438 0.0200776 -3.13087 1 0 1 1 0 0 +EDGE2 8764 5985 0.968093 -0.0483643 -3.102 1 0 1 1 0 0 +EDGE2 8764 5965 1.09413 0.0393837 -3.14964 1 0 1 1 0 0 +EDGE2 8764 5905 1.02142 0.0280493 -0.0159743 1 0 1 1 0 0 +EDGE2 8764 8763 -0.943902 0.0253442 0.00887254 1 0 1 1 0 0 +EDGE2 8764 885 0.991542 0.0487327 -3.13634 1 0 1 1 0 0 +EDGE2 8764 685 0.956324 0.0815397 -0.00340746 1 0 1 1 0 0 +EDGE2 8764 684 -0.0430821 0.0197307 0.000277863 1 0 1 1 0 0 +EDGE2 8764 5904 -0.0258542 -0.0441979 -0.00334199 1 0 1 1 0 0 +EDGE2 8764 683 -0.897461 0.025616 0.00389393 1 0 1 1 0 0 +EDGE2 8764 5903 -1.00242 0.0253778 0.0172234 1 0 1 1 0 0 +EDGE2 8765 884 1.05965 -0.0068907 -3.12215 1 0 1 1 0 0 +EDGE2 8765 5906 0.053437 1.04009 1.55805 1 0 1 1 0 0 +EDGE2 8765 5964 1.03833 0.0811869 -3.12156 1 0 1 1 0 0 +EDGE2 8765 5984 1.06085 0.00772498 -3.14195 1 0 1 1 0 0 +EDGE2 8765 5944 1.06641 -0.0229499 -3.13303 1 0 1 1 0 0 +EDGE2 8765 5946 -0.047408 -1.04662 -1.54995 1 0 1 1 0 0 +EDGE2 8765 5945 0.0439846 0.00735034 -3.15598 1 0 1 1 0 0 +EDGE2 8765 5985 0.0451924 -0.0349684 -3.13186 1 0 1 1 0 0 +EDGE2 8765 5965 0.0391377 0.0349922 -3.14586 1 0 1 1 0 0 +EDGE2 8765 5966 0.0880209 -1.0905 -1.56081 1 0 1 1 0 0 +EDGE2 8765 5986 -0.00354247 -0.9526 -1.57315 1 0 1 1 0 0 +EDGE2 8765 5905 0.0247548 0.0188074 -0.00120372 1 0 1 1 0 0 +EDGE2 8765 885 -0.0546122 -0.0173797 -3.15689 1 0 1 1 0 0 +EDGE2 8765 685 -0.00827896 -0.00563724 -0.0188035 1 0 1 1 0 0 +EDGE2 8765 684 -0.993976 0.10094 -0.00640918 1 0 1 1 0 0 +EDGE2 8765 5904 -1.00739 0.0344699 0.0348575 1 0 1 1 0 0 +EDGE2 8765 8764 -1.01301 0.0259644 0.0220447 1 0 1 1 0 0 +EDGE2 8765 686 0.00212059 -1.04785 -1.57179 1 0 1 1 0 0 +EDGE2 8765 886 0.062528 -1.02193 -1.58516 1 0 1 1 0 0 +EDGE2 8766 5906 -0.0429469 -0.0832892 0.0290837 1 0 1 1 0 0 +EDGE2 8766 5907 0.91864 0.0428946 0.00548904 1 0 1 1 0 0 +EDGE2 8766 5945 -1.05982 0.00320544 1.5816 1 0 1 1 0 0 +EDGE2 8766 5985 -1.02449 -0.022048 1.60252 1 0 1 1 0 0 +EDGE2 8766 8765 -0.978968 0.0130983 -1.55813 1 0 1 1 0 0 +EDGE2 8766 5965 -0.947257 -0.0180525 1.51902 1 0 1 1 0 0 +EDGE2 8766 5905 -0.941171 -0.0112192 -1.57846 1 0 1 1 0 0 +EDGE2 8766 885 -1.04372 0.00855803 1.60363 1 0 1 1 0 0 +EDGE2 8766 685 -1.01804 -0.021434 -1.56005 1 0 1 1 0 0 +EDGE2 8767 5908 1.02147 0.0587131 0.00643883 1 0 1 1 0 0 +EDGE2 8767 5906 -1.03754 -0.124672 -0.025457 1 0 1 1 0 0 +EDGE2 8767 5907 -0.0186062 -0.0379534 0.027272 1 0 1 1 0 0 +EDGE2 8767 8766 -1.09433 0.07166 0.0161014 1 0 1 1 0 0 +EDGE2 8768 5909 1.02277 0.0852402 -0.00411909 1 0 1 1 0 0 +EDGE2 8768 5908 0.000931185 0.0409152 -0.0262546 1 0 1 1 0 0 +EDGE2 8768 5907 -1.11281 0.0451341 0.027016 1 0 1 1 0 0 +EDGE2 8768 8767 -1.02521 -0.0386632 0.034376 1 0 1 1 0 0 +EDGE2 8769 5910 0.974879 -0.0664878 0.0022901 1 0 1 1 0 0 +EDGE2 8769 5930 1.01651 0.0516122 -3.11351 1 0 1 1 0 0 +EDGE2 8769 8768 -1.00749 0.11021 -0.000447186 1 0 1 1 0 0 +EDGE2 8769 5909 -0.020569 0.02193 -0.0249205 1 0 1 1 0 0 +EDGE2 8769 5908 -0.970902 -0.023681 -0.0194031 1 0 1 1 0 0 +EDGE2 8770 5929 0.987833 0.0290399 -3.10313 1 0 1 1 0 0 +EDGE2 8770 5911 0.0328107 -1.02438 -1.56622 1 0 1 1 0 0 +EDGE2 8770 5931 -0.132496 -0.906363 -1.56726 1 0 1 1 0 0 +EDGE2 8770 8769 -1.03918 -0.0304844 0.0234707 1 0 1 1 0 0 +EDGE2 8770 5910 0.0205429 0.0397196 0.0167263 1 0 1 1 0 0 +EDGE2 8770 5930 -0.00235443 -0.0149752 -3.12031 1 0 1 1 0 0 +EDGE2 8770 5909 -0.981619 0.0767424 -0.0130205 1 0 1 1 0 0 +EDGE2 8771 5910 -0.900864 0.100463 -1.56134 1 0 1 1 0 0 +EDGE2 8771 5930 -1.01533 -0.0162373 1.54489 1 0 1 1 0 0 +EDGE2 8771 8770 -0.955002 0.0173406 -1.56362 1 0 1 1 0 0 +EDGE2 8772 8771 -0.997623 -0.0221775 0.0368363 1 0 1 1 0 0 +EDGE2 8773 8772 -0.989608 0.0496173 -0.0304556 1 0 1 1 0 0 +EDGE2 8774 8773 -0.931389 0.028125 0.0089132 1 0 1 1 0 0 +EDGE2 8774 675 0.980436 -0.0413077 -3.12635 1 0 1 1 0 0 +EDGE2 8775 8774 -1.05813 -0.00810717 -0.0109874 1 0 1 1 0 0 +EDGE2 8775 676 -0.0350486 1.01664 1.55984 1 0 1 1 0 0 +EDGE2 8775 675 0.003417 0.0129895 -3.15622 1 0 1 1 0 0 +EDGE2 8775 674 0.977069 0.0663511 -3.14078 1 0 1 1 0 0 +EDGE2 8776 8775 -1.02413 -0.0306016 -1.60195 1 0 1 1 0 0 +EDGE2 8776 677 0.95226 0.0442071 -0.00530904 1 0 1 1 0 0 +EDGE2 8776 676 0.0370758 0.0381829 0.00730045 1 0 1 1 0 0 +EDGE2 8776 675 -0.991057 -0.0179915 1.5623 1 0 1 1 0 0 +EDGE2 8777 677 0.0665266 0.0252071 -0.0282609 1 0 1 1 0 0 +EDGE2 8777 676 -0.958731 0.0104326 0.0276599 1 0 1 1 0 0 +EDGE2 8777 8776 -1.00178 -0.034693 0.0135393 1 0 1 1 0 0 +EDGE2 8777 678 1.04849 -0.0213965 0.0227348 1 0 1 1 0 0 +EDGE2 8778 677 -1.02636 -0.0655557 0.00793274 1 0 1 1 0 0 +EDGE2 8778 8777 -1.00595 -0.128698 -0.0245699 1 0 1 1 0 0 +EDGE2 8778 678 0.0511054 0.0139125 0.0112826 1 0 1 1 0 0 +EDGE2 8778 679 0.980662 -0.041849 -0.017994 1 0 1 1 0 0 +EDGE2 8779 678 -0.987094 -0.00490021 -0.00905138 1 0 1 1 0 0 +EDGE2 8779 8778 -0.942064 -0.0248184 -0.0226892 1 0 1 1 0 0 +EDGE2 8779 679 -0.0312091 -0.0528152 0.00260719 1 0 1 1 0 0 +EDGE2 8779 5900 1.02679 0.0443313 -3.14048 1 0 1 1 0 0 +EDGE2 8779 8600 0.94206 0.0111907 -3.17495 1 0 1 1 0 0 +EDGE2 8779 8760 0.996659 0.0392665 -3.1191 1 0 1 1 0 0 +EDGE2 8779 8440 1.0755 -0.0372526 -3.0949 1 0 1 1 0 0 +EDGE2 8779 920 0.978475 0.0347493 -3.11603 1 0 1 1 0 0 +EDGE2 8779 3400 0.933404 -0.00719539 -3.15015 1 0 1 1 0 0 +EDGE2 8779 680 0.961954 0.0514845 -0.00858513 1 0 1 1 0 0 +EDGE2 8780 921 -0.112203 -1.08237 -1.58979 1 0 1 1 0 0 +EDGE2 8780 8779 -0.956294 -0.0453944 -0.0186264 1 0 1 1 0 0 +EDGE2 8780 679 -0.98986 0.0488958 0.0327795 1 0 1 1 0 0 +EDGE2 8780 681 0.00509408 1.0751 1.56004 1 0 1 1 0 0 +EDGE2 8780 8761 -0.0743648 1.01501 1.59022 1 0 1 1 0 0 +EDGE2 8780 5901 -0.144636 1.08989 1.58764 1 0 1 1 0 0 +EDGE2 8780 5900 -0.0434599 0.157601 -3.15784 1 0 1 1 0 0 +EDGE2 8780 8600 0.0424898 -0.0385502 -3.147 1 0 1 1 0 0 +EDGE2 8780 8760 -0.0155053 -0.00393264 -3.14716 1 0 1 1 0 0 +EDGE2 8780 8440 -0.0378164 -0.0317718 -3.12727 1 0 1 1 0 0 +EDGE2 8780 920 0.0140799 -0.00388663 -3.15256 1 0 1 1 0 0 +EDGE2 8780 3400 -0.0675535 0.0153103 -3.13651 1 0 1 1 0 0 +EDGE2 8780 680 -0.0250525 0.120406 0.0217861 1 0 1 1 0 0 +EDGE2 8780 8441 0.0101312 -0.938691 -1.55561 1 0 1 1 0 0 +EDGE2 8780 8601 -0.0575269 -0.848828 -1.57762 1 0 1 1 0 0 +EDGE2 8780 3401 -0.0471603 -0.986566 -1.60055 1 0 1 1 0 0 +EDGE2 8780 5899 1.09656 0.0282806 -3.11763 1 0 1 1 0 0 +EDGE2 8780 8439 1.01985 -0.0125254 -3.16536 1 0 1 1 0 0 +EDGE2 8780 8759 1.00593 0.0557402 -3.17232 1 0 1 1 0 0 +EDGE2 8780 8599 1.03632 -0.0269818 -3.17561 1 0 1 1 0 0 +EDGE2 8780 919 1.10617 -0.0820653 -3.16417 1 0 1 1 0 0 +EDGE2 8780 3399 0.96216 0.00247188 -3.15167 1 0 1 1 0 0 +EDGE2 8781 681 0.0129085 -0.0669757 0.00446954 1 0 1 1 0 0 +EDGE2 8781 5902 1.03658 -0.0598778 0.0101037 1 0 1 1 0 0 +EDGE2 8781 8762 1.09243 0.082674 -0.0456452 1 0 1 1 0 0 +EDGE2 8781 8761 0.146078 0.00751155 0.0293689 1 0 1 1 0 0 +EDGE2 8781 682 1.01532 -0.0671405 0.0104581 1 0 1 1 0 0 +EDGE2 8781 5901 -0.0432664 0.00344238 0.0067704 1 0 1 1 0 0 +EDGE2 8781 5900 -0.991247 0.0288581 1.59792 1 0 1 1 0 0 +EDGE2 8781 8600 -1.08162 0.00278046 1.54332 1 0 1 1 0 0 +EDGE2 8781 8760 -0.944172 0.00070369 1.59968 1 0 1 1 0 0 +EDGE2 8781 8780 -1.0252 -0.0767149 -1.55145 1 0 1 1 0 0 +EDGE2 8781 8440 -1.01629 0.00411912 1.57417 1 0 1 1 0 0 +EDGE2 8781 920 -1.03173 -0.0387005 1.56318 1 0 1 1 0 0 +EDGE2 8781 3400 -0.926742 -0.0131461 1.55313 1 0 1 1 0 0 +EDGE2 8781 680 -1.09224 -0.0205541 -1.56561 1 0 1 1 0 0 +EDGE2 8782 8763 1.0594 -0.0240679 0.0116859 1 0 1 1 0 0 +EDGE2 8782 681 -1.02993 -0.00916981 -0.0325591 1 0 1 1 0 0 +EDGE2 8782 5902 -0.0533817 -0.0690613 0.0111007 1 0 1 1 0 0 +EDGE2 8782 683 1.04883 -0.0446807 0.00320192 1 0 1 1 0 0 +EDGE2 8782 5903 1.02473 -0.0219968 -0.0241514 1 0 1 1 0 0 +EDGE2 8782 8762 -0.0332895 0.0517873 -0.0324838 1 0 1 1 0 0 +EDGE2 8782 8761 -1.08102 0.0692114 0.0425367 1 0 1 1 0 0 +EDGE2 8782 8781 -0.983919 0.00129308 -0.0554639 1 0 1 1 0 0 +EDGE2 8782 682 -0.02036 -0.0354638 -0.00457814 1 0 1 1 0 0 +EDGE2 8782 5901 -1.03408 0.0889382 -0.0186439 1 0 1 1 0 0 +EDGE2 8783 8763 0.0489573 0.0205626 0.00726252 1 0 1 1 0 0 +EDGE2 8783 684 1.02917 -0.0597404 0.024381 1 0 1 1 0 0 +EDGE2 8783 5904 0.984908 0.0365414 -0.0115512 1 0 1 1 0 0 +EDGE2 8783 8764 1.08442 0.0513126 0.0138326 1 0 1 1 0 0 +EDGE2 8783 5902 -1.05729 0.0480865 0.0278733 1 0 1 1 0 0 +EDGE2 8783 8782 -0.980627 -0.076763 0.0173824 1 0 1 1 0 0 +EDGE2 8783 683 0.0404897 0.0691019 -0.0081292 1 0 1 1 0 0 +EDGE2 8783 5903 0.0243639 0.0130403 -0.0348644 1 0 1 1 0 0 +EDGE2 8783 8762 -0.947884 -0.0402587 0.0311897 1 0 1 1 0 0 +EDGE2 8783 682 -0.9279 0.052885 0.00382118 1 0 1 1 0 0 +EDGE2 8784 5945 0.914424 0.0420671 -3.11019 1 0 1 1 0 0 +EDGE2 8784 5985 0.959117 0.0278739 -3.14192 1 0 1 1 0 0 +EDGE2 8784 8765 0.987576 -0.111774 -0.0241114 1 0 1 1 0 0 +EDGE2 8784 5965 0.880057 -0.0227811 -3.11812 1 0 1 1 0 0 +EDGE2 8784 5905 1.02425 0.0117095 -0.00414061 1 0 1 1 0 0 +EDGE2 8784 8763 -0.955966 -0.0431423 -0.0123041 1 0 1 1 0 0 +EDGE2 8784 885 0.969739 -0.0257642 -3.14352 1 0 1 1 0 0 +EDGE2 8784 685 0.95653 0.0243779 0.00802156 1 0 1 1 0 0 +EDGE2 8784 684 -0.00996054 -0.0382554 -0.0308117 1 0 1 1 0 0 +EDGE2 8784 5904 0.032994 0.0179631 -0.0270623 1 0 1 1 0 0 +EDGE2 8784 8764 0.00188975 0.0573465 -0.00274156 1 0 1 1 0 0 +EDGE2 8784 8783 -0.951546 -0.0168487 0.0366982 1 0 1 1 0 0 +EDGE2 8784 683 -0.993042 0.0424315 0.0231411 1 0 1 1 0 0 +EDGE2 8784 5903 -1.03616 -0.133189 0.015007 1 0 1 1 0 0 +EDGE2 8785 884 0.921579 0.0688304 -3.14211 1 0 1 1 0 0 +EDGE2 8785 5906 -0.0116614 1.07443 1.57895 1 0 1 1 0 0 +EDGE2 8785 8766 -0.00276616 1.05439 1.60532 1 0 1 1 0 0 +EDGE2 8785 5964 1.0542 0.0491769 -3.11568 1 0 1 1 0 0 +EDGE2 8785 5984 1.05296 -0.0123729 -3.14971 1 0 1 1 0 0 +EDGE2 8785 5944 1.04429 0.0190562 -3.13681 1 0 1 1 0 0 +EDGE2 8785 5946 -0.0241421 -1.024 -1.52521 1 0 1 1 0 0 +EDGE2 8785 5945 -0.0237137 -0.0125332 -3.13918 1 0 1 1 0 0 +EDGE2 8785 5985 -0.0452402 0.0501527 -3.11313 1 0 1 1 0 0 +EDGE2 8785 8765 0.0151921 -0.0364053 0.0169417 1 0 1 1 0 0 +EDGE2 8785 5965 0.0243102 -0.0126892 -3.13623 1 0 1 1 0 0 +EDGE2 8785 5966 0.0661004 -1.03346 -1.55849 1 0 1 1 0 0 +EDGE2 8785 5986 0.0116197 -0.913698 -1.55572 1 0 1 1 0 0 +EDGE2 8785 5905 -0.132421 0.000678129 6.88421e-05 1 0 1 1 0 0 +EDGE2 8785 8784 -0.998375 0.0132009 0.00532053 1 0 1 1 0 0 +EDGE2 8785 885 0.0328452 -0.076037 -3.14343 1 0 1 1 0 0 +EDGE2 8785 685 0.085831 -0.0640011 0.0143237 1 0 1 1 0 0 +EDGE2 8785 684 -1.08511 -0.0165332 0.022196 1 0 1 1 0 0 +EDGE2 8785 5904 -1.1112 -0.0599736 0.0424237 1 0 1 1 0 0 +EDGE2 8785 8764 -0.944359 0.020682 -0.0135197 1 0 1 1 0 0 +EDGE2 8785 686 0.0595953 -0.940429 -1.61213 1 0 1 1 0 0 +EDGE2 8785 886 -0.0754361 -0.995565 -1.54688 1 0 1 1 0 0 +EDGE2 8786 5906 -0.0703486 -0.0551247 -0.0132544 1 0 1 1 0 0 +EDGE2 8786 5907 0.991665 0.0417315 0.0181582 1 0 1 1 0 0 +EDGE2 8786 8767 0.989993 0.0311863 -0.00664003 1 0 1 1 0 0 +EDGE2 8786 8766 0.0450058 0.0227443 0.0193568 1 0 1 1 0 0 +EDGE2 8786 5945 -0.933937 0.0814406 1.53483 1 0 1 1 0 0 +EDGE2 8786 5985 -1.0744 -0.070696 1.56919 1 0 1 1 0 0 +EDGE2 8786 8765 -1.04199 -0.0106392 -1.58287 1 0 1 1 0 0 +EDGE2 8786 8785 -1.00784 -0.0396708 -1.57021 1 0 1 1 0 0 +EDGE2 8786 5965 -0.929195 -0.0704046 1.58099 1 0 1 1 0 0 +EDGE2 8786 5905 -1.02286 0.000466025 -1.5653 1 0 1 1 0 0 +EDGE2 8786 885 -1.00537 -0.0829455 1.55324 1 0 1 1 0 0 +EDGE2 8786 685 -1.06009 -0.028926 -1.58507 1 0 1 1 0 0 +EDGE2 8787 8768 0.999059 0.0401614 0.032029 1 0 1 1 0 0 +EDGE2 8787 5908 0.987243 0.0862897 0.00458678 1 0 1 1 0 0 +EDGE2 8787 5906 -1.02252 -0.0414101 -0.0198021 1 0 1 1 0 0 +EDGE2 8787 8786 -1.03415 -0.0329855 0.00126521 1 0 1 1 0 0 +EDGE2 8787 5907 -0.0117515 0.00312266 -0.0278172 1 0 1 1 0 0 +EDGE2 8787 8767 0.0554077 -0.0507673 0.00832148 1 0 1 1 0 0 +EDGE2 8787 8766 -0.980283 -0.114306 0.0234464 1 0 1 1 0 0 +EDGE2 8788 8787 -0.934757 -0.0195121 0.00733391 1 0 1 1 0 0 +EDGE2 8788 8769 0.987883 0.0440865 -0.0448505 1 0 1 1 0 0 +EDGE2 8788 8768 0.034747 0.0807861 0.00989523 1 0 1 1 0 0 +EDGE2 8788 5909 0.941152 -0.0183798 -0.0251304 1 0 1 1 0 0 +EDGE2 8788 5908 0.0442955 0.0246086 0.00912649 1 0 1 1 0 0 +EDGE2 8788 5907 -0.993463 -0.0601837 -0.0335063 1 0 1 1 0 0 +EDGE2 8788 8767 -1.07942 -0.0255224 0.035125 1 0 1 1 0 0 +EDGE2 8789 8769 -0.0430438 0.0832867 0.0249378 1 0 1 1 0 0 +EDGE2 8789 5910 0.968576 0.026517 -0.03059 1 0 1 1 0 0 +EDGE2 8789 5930 1.0485 0.000395288 -3.13106 1 0 1 1 0 0 +EDGE2 8789 8770 1.04936 0.0625132 0.0221943 1 0 1 1 0 0 +EDGE2 8789 8768 -1.02146 0.0153455 0.0298045 1 0 1 1 0 0 +EDGE2 8789 8788 -0.958687 0.0490185 -0.0357132 1 0 1 1 0 0 +EDGE2 8789 5909 0.00944632 -0.127447 0.0247701 1 0 1 1 0 0 +EDGE2 8789 5908 -1.09887 0.000417813 -0.0168951 1 0 1 1 0 0 +EDGE2 8790 5929 0.980245 0.00784705 -3.11587 1 0 1 1 0 0 +EDGE2 8790 5911 -0.0305115 -0.980373 -1.56933 1 0 1 1 0 0 +EDGE2 8790 5931 -0.0172599 -1.10998 -1.55947 1 0 1 1 0 0 +EDGE2 8790 8769 -1.00251 0.100909 0.0122339 1 0 1 1 0 0 +EDGE2 8790 5910 0.10594 0.0198092 0.0149957 1 0 1 1 0 0 +EDGE2 8790 5930 0.0620225 0.0738922 -3.13105 1 0 1 1 0 0 +EDGE2 8790 8770 -0.0561361 0.009259 0.00152299 1 0 1 1 0 0 +EDGE2 8790 8789 -0.940268 -0.0321209 -0.0334635 1 0 1 1 0 0 +EDGE2 8790 5909 -0.962087 0.0194622 -0.000327561 1 0 1 1 0 0 +EDGE2 8790 8771 -0.0561959 0.942835 1.57676 1 0 1 1 0 0 +EDGE2 8791 8790 -0.981827 -0.0127976 -1.52483 1 0 1 1 0 0 +EDGE2 8791 5910 -0.992301 -0.000889374 -1.58482 1 0 1 1 0 0 +EDGE2 8791 5930 -1.10077 0.0147718 1.5932 1 0 1 1 0 0 +EDGE2 8791 8770 -1.01546 0.0318383 -1.56727 1 0 1 1 0 0 +EDGE2 8791 8771 -0.0463411 0.0803248 -0.0366914 1 0 1 1 0 0 +EDGE2 8791 8772 0.945226 0.0144746 -0.019015 1 0 1 1 0 0 +EDGE2 8792 8791 -0.962629 0.0224006 -0.0431985 1 0 1 1 0 0 +EDGE2 8792 8771 -0.876516 0.0924441 0.0120654 1 0 1 1 0 0 +EDGE2 8792 8773 0.986514 0.0408216 -0.0369407 1 0 1 1 0 0 +EDGE2 8792 8772 0.012498 -0.00806864 -0.00657171 1 0 1 1 0 0 +EDGE2 8793 8774 0.932898 0.00798118 0.00172274 1 0 1 1 0 0 +EDGE2 8793 8792 -0.974936 -0.00506497 0.0129389 1 0 1 1 0 0 +EDGE2 8793 8773 0.029986 -0.0375969 -0.0389764 1 0 1 1 0 0 +EDGE2 8793 8772 -0.951472 0.0135639 -0.00016691 1 0 1 1 0 0 +EDGE2 8794 8774 -0.0630356 -0.00217885 -0.0191199 1 0 1 1 0 0 +EDGE2 8794 8773 -1.0193 -0.0428607 -0.0141676 1 0 1 1 0 0 +EDGE2 8794 8793 -1.00215 0.0227885 -0.034428 1 0 1 1 0 0 +EDGE2 8794 8775 0.978306 0.0827321 -0.0111717 1 0 1 1 0 0 +EDGE2 8794 675 0.972401 -0.0281305 -3.12404 1 0 1 1 0 0 +EDGE2 8795 8774 -1.05963 -0.0956129 -0.0323959 1 0 1 1 0 0 +EDGE2 8795 8794 -1.00787 0.0264497 0.0267757 1 0 1 1 0 0 +EDGE2 8795 8775 0.0817271 0.111548 -0.0106444 1 0 1 1 0 0 +EDGE2 8795 676 0.0538677 0.940656 1.57644 1 0 1 1 0 0 +EDGE2 8795 8776 0.0240789 0.923297 1.56808 1 0 1 1 0 0 +EDGE2 8795 675 -0.0159891 -0.00631307 -3.11346 1 0 1 1 0 0 +EDGE2 8795 674 0.951124 -0.0150127 -3.10433 1 0 1 1 0 0 +EDGE2 8796 8775 -0.973114 -0.0894211 1.6049 1 0 1 1 0 0 +EDGE2 8796 8795 -0.990031 -0.0347554 1.54266 1 0 1 1 0 0 +EDGE2 8796 675 -0.995207 0.0237466 -1.59982 1 0 1 1 0 0 +EDGE2 8797 8796 -0.959509 -0.0598501 -0.00430242 1 0 1 1 0 0 +EDGE2 8798 8797 -0.958264 0.00822611 0.00135568 1 0 1 1 0 0 +EDGE2 8799 640 0.96048 0.0508928 -3.12853 1 0 1 1 0 0 +EDGE2 8799 660 1.02258 -0.0171846 -3.14955 1 0 1 1 0 0 +EDGE2 8799 8798 -0.932364 -0.0448232 -0.0306798 1 0 1 1 0 0 +EDGE2 8800 661 -0.00467918 0.932749 1.59807 1 0 1 1 0 0 +EDGE2 8800 639 0.892495 -0.0099259 -3.15999 1 0 1 1 0 0 +EDGE2 8800 659 1.07445 -0.000381946 -3.12417 1 0 1 1 0 0 +EDGE2 8800 641 -0.0369329 -1.01977 -1.54002 1 0 1 1 0 0 +EDGE2 8800 640 -0.00461585 0.00952965 -3.16282 1 0 1 1 0 0 +EDGE2 8800 660 -0.0077433 -0.108549 -3.15733 1 0 1 1 0 0 +EDGE2 8800 8799 -1.03853 0.031422 -0.00202238 1 0 1 1 0 0 +EDGE2 8801 661 0.00232528 0.063398 0.0358184 1 0 1 1 0 0 +EDGE2 8801 8800 -0.926321 0.0766208 -1.57977 1 0 1 1 0 0 +EDGE2 8801 640 -1.07001 0.0293327 1.56309 1 0 1 1 0 0 +EDGE2 8801 660 -0.960217 0.00896471 1.59538 1 0 1 1 0 0 +EDGE2 8801 662 0.94804 -0.0510754 0.0157534 1 0 1 1 0 0 +EDGE2 8802 661 -1.03068 0.0759005 0.029593 1 0 1 1 0 0 +EDGE2 8802 8801 -0.934708 0.0028857 0.0259337 1 0 1 1 0 0 +EDGE2 8802 662 0.0308669 0.0788753 -0.0344949 1 0 1 1 0 0 +EDGE2 8802 663 0.948882 -0.0715991 -0.0286746 1 0 1 1 0 0 +EDGE2 8803 662 -1.0249 -0.023588 0.00669181 1 0 1 1 0 0 +EDGE2 8803 8802 -1.00881 -0.0692195 -0.00928044 1 0 1 1 0 0 +EDGE2 8803 663 -0.049125 0.0378463 0.0128518 1 0 1 1 0 0 +EDGE2 8803 664 0.94725 -0.0374386 -0.0411124 1 0 1 1 0 0 +EDGE2 8804 8803 -1.04632 -0.00163147 -0.0318201 1 0 1 1 0 0 +EDGE2 8804 663 -0.972568 0.0148705 0.0124403 1 0 1 1 0 0 +EDGE2 8804 665 0.979078 0.137407 -0.0132673 1 0 1 1 0 0 +EDGE2 8804 664 -0.00443962 0.0415998 -0.00993633 1 0 1 1 0 0 +EDGE2 8805 666 -0.0145275 1.06073 1.58924 1 0 1 1 0 0 +EDGE2 8805 8804 -1.08797 0.0601047 0.014358 1 0 1 1 0 0 +EDGE2 8805 665 0.0193247 -0.0446192 -0.00788535 1 0 1 1 0 0 +EDGE2 8805 664 -1.05456 -0.0511747 0.0121454 1 0 1 1 0 0 +EDGE2 8806 666 -0.00954047 0.0360442 -0.0311443 1 0 1 1 0 0 +EDGE2 8806 665 -0.987853 0.0177677 -1.58096 1 0 1 1 0 0 +EDGE2 8806 8805 -0.940186 0.0736002 -1.61761 1 0 1 1 0 0 +EDGE2 8806 667 1.06556 -0.0189668 -0.0125608 1 0 1 1 0 0 +EDGE2 8807 668 1.03091 -0.0253324 -0.00651965 1 0 1 1 0 0 +EDGE2 8807 666 -1.04822 -0.0829303 0.00116024 1 0 1 1 0 0 +EDGE2 8807 8806 -1.095 -0.00715541 -0.017198 1 0 1 1 0 0 +EDGE2 8807 667 -0.0578461 0.0144616 -0.00295499 1 0 1 1 0 0 +EDGE2 8808 668 -0.035571 -0.087578 -0.00714556 1 0 1 1 0 0 +EDGE2 8808 667 -1.04242 -0.0240793 0.00980469 1 0 1 1 0 0 +EDGE2 8808 8807 -0.986157 -0.0810496 -0.00966734 1 0 1 1 0 0 +EDGE2 8808 669 0.972587 0.00258664 -0.0228378 1 0 1 1 0 0 +EDGE2 8809 668 -0.951965 0.0663023 -0.0298475 1 0 1 1 0 0 +EDGE2 8809 8808 -0.958327 -0.0348236 0.0305294 1 0 1 1 0 0 +EDGE2 8809 669 0.000435708 -0.0422887 -0.0106213 1 0 1 1 0 0 +EDGE2 8809 930 1.11673 0.0299692 -3.15288 1 0 1 1 0 0 +EDGE2 8809 8450 1.04864 0.00355668 -3.14653 1 0 1 1 0 0 +EDGE2 8809 670 0.974047 -0.0545859 -0.0182568 1 0 1 1 0 0 +EDGE2 8810 669 -1.05153 -0.0406363 0.021263 1 0 1 1 0 0 +EDGE2 8810 8809 -1.00785 -0.0482468 0.0059952 1 0 1 1 0 0 +EDGE2 8810 671 -0.0920665 0.985367 1.58077 1 0 1 1 0 0 +EDGE2 8810 930 0.0642058 0.0200092 -3.15092 1 0 1 1 0 0 +EDGE2 8810 8450 -0.04116 -0.0215947 -3.13732 1 0 1 1 0 0 +EDGE2 8810 8451 -0.0413579 -1.02162 -1.53787 1 0 1 1 0 0 +EDGE2 8810 670 0.000617355 -0.0180671 0.0308282 1 0 1 1 0 0 +EDGE2 8810 931 -0.0409071 -0.972855 -1.57017 1 0 1 1 0 0 +EDGE2 8810 8449 0.930226 0.00555848 -3.15002 1 0 1 1 0 0 +EDGE2 8810 929 1.08236 -0.0401705 -3.14808 1 0 1 1 0 0 +EDGE2 8811 672 0.93777 -0.000430452 0.0172229 1 0 1 1 0 0 +EDGE2 8811 671 0.0394104 0.0163131 -0.0205761 1 0 1 1 0 0 +EDGE2 8811 930 -1.03632 0.076544 1.56706 1 0 1 1 0 0 +EDGE2 8811 8810 -1.03598 0.0620053 -1.57618 1 0 1 1 0 0 +EDGE2 8811 8450 -1.09157 0.089391 1.61652 1 0 1 1 0 0 +EDGE2 8811 670 -1.02335 -0.110733 -1.54951 1 0 1 1 0 0 +EDGE2 8812 673 1.00484 -0.00159906 -0.019145 1 0 1 1 0 0 +EDGE2 8812 8811 -1.14353 0.0542487 -0.00738155 1 0 1 1 0 0 +EDGE2 8812 672 -0.00835427 -0.0351225 -0.020485 1 0 1 1 0 0 +EDGE2 8812 671 -1.0519 -0.0198788 0.0348823 1 0 1 1 0 0 +EDGE2 8813 673 0.00731001 0.0440487 -3.43585e-05 1 0 1 1 0 0 +EDGE2 8813 674 1.10247 -0.0745742 0.0132763 1 0 1 1 0 0 +EDGE2 8813 672 -0.961163 -0.00268757 -0.0131199 1 0 1 1 0 0 +EDGE2 8813 8812 -0.990476 0.00779916 0.0433206 1 0 1 1 0 0 +EDGE2 8814 8775 1.02989 0.00736152 -3.18137 1 0 1 1 0 0 +EDGE2 8814 8795 1.00576 -0.028811 -3.17469 1 0 1 1 0 0 +EDGE2 8814 675 1.03708 0.0225704 0.029937 1 0 1 1 0 0 +EDGE2 8814 673 -1.05441 -0.0146651 0.011774 1 0 1 1 0 0 +EDGE2 8814 674 -0.0189362 -0.0719661 0.00977401 1 0 1 1 0 0 +EDGE2 8814 8813 -1.07349 -0.0226992 -0.0413399 1 0 1 1 0 0 +EDGE2 8815 8774 1.05258 -0.000473792 -3.15531 1 0 1 1 0 0 +EDGE2 8815 8794 0.952194 -0.0123817 -3.16016 1 0 1 1 0 0 +EDGE2 8815 8796 0.0120766 1.00074 1.57659 1 0 1 1 0 0 +EDGE2 8815 8775 -0.032509 0.0285817 -3.12946 1 0 1 1 0 0 +EDGE2 8815 8795 0.014134 -0.0849765 -3.12263 1 0 1 1 0 0 +EDGE2 8815 676 -0.0159264 -0.978436 -1.60181 1 0 1 1 0 0 +EDGE2 8815 8776 -0.0139293 -1.0132 -1.5476 1 0 1 1 0 0 +EDGE2 8815 675 0.0581101 0.00135164 -0.0219615 1 0 1 1 0 0 +EDGE2 8815 674 -1.09491 0.0189211 0.0106576 1 0 1 1 0 0 +EDGE2 8815 8814 -1.0567 -0.0165271 0.031053 1 0 1 1 0 0 +EDGE2 8816 8797 0.950169 0.0553449 -0.0443953 1 0 1 1 0 0 +EDGE2 8816 8796 0.024123 -0.0324177 0.00976829 1 0 1 1 0 0 +EDGE2 8816 8775 -0.98213 -0.0394083 1.57301 1 0 1 1 0 0 +EDGE2 8816 8795 -1.0429 -0.00410569 1.53772 1 0 1 1 0 0 +EDGE2 8816 8815 -1.03295 0.00651531 -1.5592 1 0 1 1 0 0 +EDGE2 8816 675 -0.873615 -0.0181802 -1.53644 1 0 1 1 0 0 +EDGE2 8817 8798 0.96638 0.108491 0.0190197 1 0 1 1 0 0 +EDGE2 8817 8816 -1.06993 -0.079431 0.0308162 1 0 1 1 0 0 +EDGE2 8817 8797 -0.0138833 0.0767232 -0.00480277 1 0 1 1 0 0 +EDGE2 8817 8796 -0.986865 -0.0560603 0.0336208 1 0 1 1 0 0 +EDGE2 8818 8817 -0.987196 0.0451113 -0.0235543 1 0 1 1 0 0 +EDGE2 8818 8799 1.02141 -0.0399737 -0.00547808 1 0 1 1 0 0 +EDGE2 8818 8798 0.0531107 0.046634 -0.0238635 1 0 1 1 0 0 +EDGE2 8818 8797 -1.06167 -0.125679 -0.0129159 1 0 1 1 0 0 +EDGE2 8819 8800 1.08206 0.0500993 -0.00657208 1 0 1 1 0 0 +EDGE2 8819 640 1.06223 0.0863494 -3.12547 1 0 1 1 0 0 +EDGE2 8819 660 0.984452 -0.0480359 -3.17525 1 0 1 1 0 0 +EDGE2 8819 8818 -0.970405 -0.0251611 -0.0211802 1 0 1 1 0 0 +EDGE2 8819 8799 -0.0290235 -0.0309364 0.0284444 1 0 1 1 0 0 +EDGE2 8819 8798 -0.991188 0.0023586 0.0405669 1 0 1 1 0 0 +EDGE2 8820 661 0.131666 1.01865 1.54386 1 0 1 1 0 0 +EDGE2 8820 8800 0.0595432 0.0587665 0.00201286 1 0 1 1 0 0 +EDGE2 8820 639 1.08 0.0297046 -3.15331 1 0 1 1 0 0 +EDGE2 8820 659 0.936254 -0.0119985 -3.133 1 0 1 1 0 0 +EDGE2 8820 641 -0.069148 -1.06654 -1.55814 1 0 1 1 0 0 +EDGE2 8820 8819 -0.984612 -0.0683312 -0.0111409 1 0 1 1 0 0 +EDGE2 8820 640 -0.0157794 -0.0337049 -3.12595 1 0 1 1 0 0 +EDGE2 8820 660 0.0863844 -0.10536 -3.14081 1 0 1 1 0 0 +EDGE2 8820 8801 -0.0586712 1.00518 1.5618 1 0 1 1 0 0 +EDGE2 8820 8799 -1.00363 0.0585322 -0.00302934 1 0 1 1 0 0 +EDGE2 8821 8800 -0.948216 0.0538611 1.57027 1 0 1 1 0 0 +EDGE2 8821 642 0.995918 -0.00652362 0.0184706 1 0 1 1 0 0 +EDGE2 8821 641 -0.0881319 0.0812302 -0.0187071 1 0 1 1 0 0 +EDGE2 8821 8820 -1.00385 -0.0745415 1.60499 1 0 1 1 0 0 +EDGE2 8821 640 -0.913504 0.0025168 -1.57198 1 0 1 1 0 0 +EDGE2 8821 660 -0.997681 -0.067067 -1.55709 1 0 1 1 0 0 +EDGE2 8822 643 0.969387 0.0616316 -0.0312366 1 0 1 1 0 0 +EDGE2 8822 642 -0.0765882 0.0516194 -0.0130637 1 0 1 1 0 0 +EDGE2 8822 641 -1.05908 -0.0625142 0.0280054 1 0 1 1 0 0 +EDGE2 8822 8821 -0.945815 -0.0232328 0.00691378 1 0 1 1 0 0 +EDGE2 8823 8822 -0.965101 0.0120043 -0.00347666 1 0 1 1 0 0 +EDGE2 8823 644 1.01696 0.0305847 -0.0267106 1 0 1 1 0 0 +EDGE2 8823 643 -0.0217378 -0.00302553 -0.0285465 1 0 1 1 0 0 +EDGE2 8823 642 -0.967582 -0.0591546 0.000770187 1 0 1 1 0 0 +EDGE2 8824 5925 0.969519 0.017946 -3.11833 1 0 1 1 0 0 +EDGE2 8824 644 -0.0120553 -0.0511983 -0.0327752 1 0 1 1 0 0 +EDGE2 8824 625 0.998215 0.0258761 -3.18343 1 0 1 1 0 0 +EDGE2 8824 645 1.07967 0.0761234 -0.0130068 1 0 1 1 0 0 +EDGE2 8824 643 -0.981211 0.0524969 0.00353394 1 0 1 1 0 0 +EDGE2 8824 8823 -1.0054 0.0262878 -0.020988 1 0 1 1 0 0 +EDGE2 8825 5924 0.960578 0.0644166 -3.14086 1 0 1 1 0 0 +EDGE2 8825 624 1.09639 0.0216285 -3.12946 1 0 1 1 0 0 +EDGE2 8825 5925 0.0256127 -0.0867491 -3.12542 1 0 1 1 0 0 +EDGE2 8825 5926 -0.0201319 -1.03764 -1.57957 1 0 1 1 0 0 +EDGE2 8825 626 -0.0776856 1.00314 1.55867 1 0 1 1 0 0 +EDGE2 8825 646 0.0134652 0.990757 1.57907 1 0 1 1 0 0 +EDGE2 8825 644 -1.06882 -0.0498824 0.0491334 1 0 1 1 0 0 +EDGE2 8825 625 -0.00621894 0.0301337 -3.12026 1 0 1 1 0 0 +EDGE2 8825 645 -0.0169676 -0.0289875 0.0535675 1 0 1 1 0 0 +EDGE2 8825 8824 -1.00075 0.013984 -0.0342547 1 0 1 1 0 0 +EDGE2 8826 5925 -1.09663 -0.0495262 1.56399 1 0 1 1 0 0 +EDGE2 8826 8825 -0.950383 -0.0886174 -1.59662 1 0 1 1 0 0 +EDGE2 8826 626 -0.0314345 -0.0525461 0.00978099 1 0 1 1 0 0 +EDGE2 8826 627 1.00151 -0.0100062 0.0145878 1 0 1 1 0 0 +EDGE2 8826 647 0.860864 -0.0162214 -0.0219507 1 0 1 1 0 0 +EDGE2 8826 646 -0.0147335 -0.00520973 0.0264834 1 0 1 1 0 0 +EDGE2 8826 625 -1.06458 -0.100804 1.59461 1 0 1 1 0 0 +EDGE2 8826 645 -1.08759 0.0073362 -1.5752 1 0 1 1 0 0 +EDGE2 8827 8826 -0.952486 -0.0633696 0.0106699 1 0 1 1 0 0 +EDGE2 8827 626 -1.00148 -0.0576253 0.0353817 1 0 1 1 0 0 +EDGE2 8827 648 1.13029 0.0228147 -0.0283596 1 0 1 1 0 0 +EDGE2 8827 627 0.0858334 -0.00144403 -0.00441185 1 0 1 1 0 0 +EDGE2 8827 647 -0.0611185 -0.0170687 0.0100693 1 0 1 1 0 0 +EDGE2 8827 628 0.971792 0.0337664 -0.0055168 1 0 1 1 0 0 +EDGE2 8827 646 -0.992541 -0.0681564 0.031421 1 0 1 1 0 0 +EDGE2 8828 8827 -1.07167 -0.0128856 -0.0253365 1 0 1 1 0 0 +EDGE2 8828 648 -0.0754227 -0.0244511 -0.00538126 1 0 1 1 0 0 +EDGE2 8828 649 0.978622 -0.0474778 0.000676325 1 0 1 1 0 0 +EDGE2 8828 629 1.08165 0.00746876 -0.00556452 1 0 1 1 0 0 +EDGE2 8828 627 -0.993771 0.0717923 0.0233952 1 0 1 1 0 0 +EDGE2 8828 647 -1.00166 0.0689214 0.00453912 1 0 1 1 0 0 +EDGE2 8828 628 -0.00337475 0.000934069 -0.000312408 1 0 1 1 0 0 +EDGE2 8829 8828 -1.06774 -0.00411853 0.0118183 1 0 1 1 0 0 +EDGE2 8829 630 1.02472 -0.0278788 -0.0293475 1 0 1 1 0 0 +EDGE2 8829 650 0.974104 -0.105867 0.00511618 1 0 1 1 0 0 +EDGE2 8829 648 -1.01059 -0.0865766 0.0135304 1 0 1 1 0 0 +EDGE2 8829 649 0.0161031 -0.00445479 0.000733179 1 0 1 1 0 0 +EDGE2 8829 629 0.00639865 0.0347823 0.00101358 1 0 1 1 0 0 +EDGE2 8829 628 -1.07165 -0.0459414 0.021545 1 0 1 1 0 0 +EDGE2 8830 8829 -0.95964 0.123309 0.0171507 1 0 1 1 0 0 +EDGE2 8830 651 0.00773176 1.01042 1.55163 1 0 1 1 0 0 +EDGE2 8830 630 0.0870395 -0.0205182 -0.0126844 1 0 1 1 0 0 +EDGE2 8830 650 0.00754203 -0.026512 0.0191298 1 0 1 1 0 0 +EDGE2 8830 631 -0.0129053 0.981196 1.57721 1 0 1 1 0 0 +EDGE2 8830 649 -0.936552 -0.0767502 0.000619819 1 0 1 1 0 0 +EDGE2 8830 629 -1.03972 -0.0793409 0.0241979 1 0 1 1 0 0 +EDGE2 8831 8830 -0.847732 0.0346448 -1.58596 1 0 1 1 0 0 +EDGE2 8831 651 -0.0356289 -0.000359819 0.0140673 1 0 1 1 0 0 +EDGE2 8831 630 -1.00147 -0.0621014 -1.56429 1 0 1 1 0 0 +EDGE2 8831 650 -1.04375 -0.0211221 -1.57223 1 0 1 1 0 0 +EDGE2 8831 652 1.00774 -0.0222735 0.00413638 1 0 1 1 0 0 +EDGE2 8831 631 0.101227 -0.10963 -0.01984 1 0 1 1 0 0 +EDGE2 8831 632 0.926016 0.0176665 -0.0353085 1 0 1 1 0 0 +EDGE2 8832 651 -0.965428 0.000446272 0.00819561 1 0 1 1 0 0 +EDGE2 8832 8831 -0.999699 -0.0341787 -0.00114228 1 0 1 1 0 0 +EDGE2 8832 652 -0.0230139 0.0372512 0.0140952 1 0 1 1 0 0 +EDGE2 8832 631 -1.09084 -0.000278104 -0.017338 1 0 1 1 0 0 +EDGE2 8832 632 -0.0103931 0.0962354 -0.00913168 1 0 1 1 0 0 +EDGE2 8832 633 0.968858 0.092549 0.0130639 1 0 1 1 0 0 +EDGE2 8832 653 0.949226 -0.125185 0.0607669 1 0 1 1 0 0 +EDGE2 8833 652 -1.01314 -0.059029 0.0287845 1 0 1 1 0 0 +EDGE2 8833 8832 -0.988745 -0.0128745 0.0313454 1 0 1 1 0 0 +EDGE2 8833 632 -0.988672 -0.0381311 0.0245443 1 0 1 1 0 0 +EDGE2 8833 633 0.00887262 0.0216345 0.00263346 1 0 1 1 0 0 +EDGE2 8833 653 -0.0338783 -0.0565635 0.0308557 1 0 1 1 0 0 +EDGE2 8833 634 1.10227 -0.066843 -0.00540908 1 0 1 1 0 0 +EDGE2 8833 654 0.976628 -0.0120396 -0.0174305 1 0 1 1 0 0 +EDGE2 8834 8833 -1.03535 0.0474939 0.0142819 1 0 1 1 0 0 +EDGE2 8834 633 -1.07984 -0.0296428 -0.0285861 1 0 1 1 0 0 +EDGE2 8834 653 -0.952864 0.0423575 -0.0170114 1 0 1 1 0 0 +EDGE2 8834 635 1.07408 0.0370578 0.023947 1 0 1 1 0 0 +EDGE2 8834 634 0.0076289 0.0527037 0.0161867 1 0 1 1 0 0 +EDGE2 8834 654 -0.0060322 -0.02103 -0.00138963 1 0 1 1 0 0 +EDGE2 8834 655 0.964005 -0.012328 0.0138075 1 0 1 1 0 0 +EDGE2 8835 8834 -0.975799 0.0512727 0.0281426 1 0 1 1 0 0 +EDGE2 8835 635 0.0748361 0.013302 0.00217862 1 0 1 1 0 0 +EDGE2 8835 634 -1.06884 -0.0801483 0.0313975 1 0 1 1 0 0 +EDGE2 8835 654 -0.931264 -0.00511984 0.00570688 1 0 1 1 0 0 +EDGE2 8835 655 -0.0448231 0.0316787 -0.0126363 1 0 1 1 0 0 +EDGE2 8835 656 -0.0103266 1.01454 1.58299 1 0 1 1 0 0 +EDGE2 8835 636 0.165995 1.03123 1.56112 1 0 1 1 0 0 +EDGE2 8836 635 -0.892274 0.0241952 -1.57918 1 0 1 1 0 0 +EDGE2 8836 8835 -0.982969 0.0248724 -1.59873 1 0 1 1 0 0 +EDGE2 8836 655 -1.00838 -0.0189371 -1.59549 1 0 1 1 0 0 +EDGE2 8836 656 0.0494668 -0.0211264 -0.0628087 1 0 1 1 0 0 +EDGE2 8836 636 -0.0110819 -0.0189986 0.00317885 1 0 1 1 0 0 +EDGE2 8836 657 1.03845 0.0245907 0.00856933 1 0 1 1 0 0 +EDGE2 8836 637 1.02743 -0.0977941 0.0241368 1 0 1 1 0 0 +EDGE2 8837 656 -0.957315 -0.0325531 -0.0365018 1 0 1 1 0 0 +EDGE2 8837 8836 -0.996027 -0.0114907 0.0417516 1 0 1 1 0 0 +EDGE2 8837 636 -0.975529 -0.00734614 -0.00182122 1 0 1 1 0 0 +EDGE2 8837 657 0.0398463 -0.078906 0.00491256 1 0 1 1 0 0 +EDGE2 8837 658 0.986833 0.0906754 -0.00844918 1 0 1 1 0 0 +EDGE2 8837 637 0.0650355 0.0556983 -0.00839948 1 0 1 1 0 0 +EDGE2 8837 638 1.05533 -0.035543 0.0490542 1 0 1 1 0 0 +EDGE2 8838 8837 -1.03744 0.121992 0.00789138 1 0 1 1 0 0 +EDGE2 8838 657 -0.958963 0.0318123 0.00662812 1 0 1 1 0 0 +EDGE2 8838 658 -0.0197123 0.0164904 0.00135717 1 0 1 1 0 0 +EDGE2 8838 637 -0.969204 0.0737657 0.0362055 1 0 1 1 0 0 +EDGE2 8838 638 0.013111 -0.00103223 -0.00521081 1 0 1 1 0 0 +EDGE2 8838 639 0.963087 -0.0242012 -0.00696999 1 0 1 1 0 0 +EDGE2 8838 659 0.916881 0.0203199 0.0138577 1 0 1 1 0 0 +EDGE2 8839 658 -0.979205 -0.0808389 0.0110862 1 0 1 1 0 0 +EDGE2 8839 8838 -1.01828 -0.0185643 -0.0239371 1 0 1 1 0 0 +EDGE2 8839 638 -1.04505 -0.0138938 -0.00342457 1 0 1 1 0 0 +EDGE2 8839 8800 0.993507 -0.0858405 -3.12001 1 0 1 1 0 0 +EDGE2 8839 639 0.00394004 -0.0682622 0.00799425 1 0 1 1 0 0 +EDGE2 8839 659 0.0715741 0.0219648 -0.00941954 1 0 1 1 0 0 +EDGE2 8839 8820 0.988293 -0.0117406 -3.13608 1 0 1 1 0 0 +EDGE2 8839 640 1.02157 -0.00628002 0.0372722 1 0 1 1 0 0 +EDGE2 8839 660 1.02319 -0.0158262 0.0126657 1 0 1 1 0 0 +EDGE2 8840 661 0.0550762 -1.01646 -1.54561 1 0 1 1 0 0 +EDGE2 8840 8800 0.0339002 0.0180087 -3.13276 1 0 1 1 0 0 +EDGE2 8840 639 -1.03468 -0.0445193 -0.00479547 1 0 1 1 0 0 +EDGE2 8840 659 -1.01305 0.056493 0.0102029 1 0 1 1 0 0 +EDGE2 8840 8839 -0.975938 -0.0489164 0.00354803 1 0 1 1 0 0 +EDGE2 8840 641 -0.0157838 1.03917 1.56872 1 0 1 1 0 0 +EDGE2 8840 8821 -0.00781923 0.966019 1.59776 1 0 1 1 0 0 +EDGE2 8840 8820 -0.0561023 -0.0149885 -3.14161 1 0 1 1 0 0 +EDGE2 8840 8819 1.00992 0.0201984 -3.13178 1 0 1 1 0 0 +EDGE2 8840 640 -0.0190562 0.0142729 0.0447168 1 0 1 1 0 0 +EDGE2 8840 660 -0.0216612 -0.0641493 0.000998556 1 0 1 1 0 0 +EDGE2 8840 8801 0.01614 -0.919859 -1.59387 1 0 1 1 0 0 +EDGE2 8840 8799 1.05546 0.0636096 -3.08612 1 0 1 1 0 0 +EDGE2 8841 8800 -1.10306 0.0596135 1.58613 1 0 1 1 0 0 +EDGE2 8841 8822 1.03133 -0.0297379 0.00365194 1 0 1 1 0 0 +EDGE2 8841 642 0.966769 -0.0634654 0.01281 1 0 1 1 0 0 +EDGE2 8841 8840 -1.03327 -0.0293937 -1.56057 1 0 1 1 0 0 +EDGE2 8841 641 0.0991843 0.0157913 -0.00548247 1 0 1 1 0 0 +EDGE2 8841 8821 0.066885 0.0131801 -0.00225974 1 0 1 1 0 0 +EDGE2 8841 8820 -1.0077 0.0777439 1.59585 1 0 1 1 0 0 +EDGE2 8841 640 -0.931824 -0.0589431 -1.57979 1 0 1 1 0 0 +EDGE2 8841 660 -0.969582 0.0302149 -1.58643 1 0 1 1 0 0 +EDGE2 8842 8822 -0.0428653 -0.0147803 -0.0108115 1 0 1 1 0 0 +EDGE2 8842 643 1.00683 -0.0518813 0.0340028 1 0 1 1 0 0 +EDGE2 8842 8823 0.96764 -0.0316645 -0.0301728 1 0 1 1 0 0 +EDGE2 8842 8841 -1.07912 -0.0108184 0.018969 1 0 1 1 0 0 +EDGE2 8842 642 0.111993 0.0665363 -0.0139091 1 0 1 1 0 0 +EDGE2 8842 641 -1.03174 0.0243495 -0.0267155 1 0 1 1 0 0 +EDGE2 8842 8821 -0.979768 -0.0617516 -0.0266279 1 0 1 1 0 0 +EDGE2 8843 8822 -0.984612 0.038327 -0.0134229 1 0 1 1 0 0 +EDGE2 8843 644 1.05382 -0.0169509 -0.00105161 1 0 1 1 0 0 +EDGE2 8843 8824 1.01918 -0.075503 -0.0074152 1 0 1 1 0 0 +EDGE2 8843 643 -0.103215 -0.0541878 0.00435529 1 0 1 1 0 0 +EDGE2 8843 8823 0.014384 0.0592716 -0.0267682 1 0 1 1 0 0 +EDGE2 8843 8842 -0.978298 0.104907 -0.0208242 1 0 1 1 0 0 +EDGE2 8843 642 -1.02313 0.0105119 0.00342077 1 0 1 1 0 0 +EDGE2 8844 5925 0.968074 0.0119832 -3.15614 1 0 1 1 0 0 +EDGE2 8844 8825 1.01713 -0.0152918 -0.0176517 1 0 1 1 0 0 +EDGE2 8844 644 0.0165517 0.0986071 -0.0075816 1 0 1 1 0 0 +EDGE2 8844 625 1.02981 0.0768167 -3.17051 1 0 1 1 0 0 +EDGE2 8844 645 0.93088 0.0210369 -0.000772157 1 0 1 1 0 0 +EDGE2 8844 8824 -0.116821 -0.0978111 0.00289051 1 0 1 1 0 0 +EDGE2 8844 643 -0.973143 -0.0428226 -0.0272296 1 0 1 1 0 0 +EDGE2 8844 8823 -1.0107 -0.0462504 0.0472086 1 0 1 1 0 0 +EDGE2 8844 8843 -1.00211 0.0898367 -0.0324759 1 0 1 1 0 0 +EDGE2 8845 8826 -0.0352523 1.03315 1.60905 1 0 1 1 0 0 +EDGE2 8845 5924 1.01125 -0.0565177 -3.11741 1 0 1 1 0 0 +EDGE2 8845 624 0.969179 -0.00653676 -3.12161 1 0 1 1 0 0 +EDGE2 8845 5925 0.0384612 -0.00210213 -3.16406 1 0 1 1 0 0 +EDGE2 8845 8825 0.00619816 0.00701069 0.0285937 1 0 1 1 0 0 +EDGE2 8845 5926 -0.0625625 -1.00803 -1.53079 1 0 1 1 0 0 +EDGE2 8845 626 -0.0226029 0.974751 1.56878 1 0 1 1 0 0 +EDGE2 8845 646 0.0217668 0.969892 1.59681 1 0 1 1 0 0 +EDGE2 8845 644 -0.970167 0.0454259 -0.0141688 1 0 1 1 0 0 +EDGE2 8845 8844 -1.06682 0.0664012 -0.0244122 1 0 1 1 0 0 +EDGE2 8845 625 0.00474448 0.0413653 -3.169 1 0 1 1 0 0 +EDGE2 8845 645 0.0949514 0.0558255 -0.0306858 1 0 1 1 0 0 +EDGE2 8845 8824 -1.00032 -0.00458004 0.00539373 1 0 1 1 0 0 +EDGE2 8846 8845 -1.02908 0.0340224 1.57904 1 0 1 1 0 0 +EDGE2 8846 5925 -0.951681 -0.0161857 -1.53126 1 0 1 1 0 0 +EDGE2 8846 8825 -1.06918 0.00872005 1.57152 1 0 1 1 0 0 +EDGE2 8846 5926 -0.0515336 -0.0449351 0.0415912 1 0 1 1 0 0 +EDGE2 8846 5927 0.987196 0.0066803 0.0302843 1 0 1 1 0 0 +EDGE2 8846 625 -0.899702 -0.131753 -1.56375 1 0 1 1 0 0 +EDGE2 8846 645 -0.942179 -0.0588736 1.56855 1 0 1 1 0 0 +EDGE2 8847 8846 -0.979222 -0.0635904 -0.0158954 1 0 1 1 0 0 +EDGE2 8847 5926 -1.03916 -0.0485473 -0.0270984 1 0 1 1 0 0 +EDGE2 8847 5928 0.995576 0.020472 -0.010907 1 0 1 1 0 0 +EDGE2 8847 5927 0.0276964 -0.0845452 -0.000540233 1 0 1 1 0 0 +EDGE2 8848 8847 -0.923265 0.0185089 0.0370893 1 0 1 1 0 0 +EDGE2 8848 5929 0.975826 0.000309111 -0.0173558 1 0 1 1 0 0 +EDGE2 8848 5928 -0.0425627 -0.053129 0.0321709 1 0 1 1 0 0 +EDGE2 8848 5927 -1.0532 -0.0137447 0.000643055 1 0 1 1 0 0 +EDGE2 8849 5929 0.016994 -0.106678 0.0095146 1 0 1 1 0 0 +EDGE2 8849 5928 -0.947111 -0.0280904 -0.0616536 1 0 1 1 0 0 +EDGE2 8849 8848 -0.969099 0.00717135 -0.0153887 1 0 1 1 0 0 +EDGE2 8849 8790 0.979158 -0.0118167 -3.14716 1 0 1 1 0 0 +EDGE2 8849 5910 0.991498 0.0161117 -3.13997 1 0 1 1 0 0 +EDGE2 8849 5930 1.04775 -0.0637572 -0.00662584 1 0 1 1 0 0 +EDGE2 8849 8770 1.01181 0.13073 -3.14654 1 0 1 1 0 0 +EDGE2 8850 5929 -1.03014 0.0252467 0.00551003 1 0 1 1 0 0 +EDGE2 8850 8849 -0.931686 0.037679 0.00565666 1 0 1 1 0 0 +EDGE2 8850 8790 0.0100218 -0.0434658 -3.13061 1 0 1 1 0 0 +EDGE2 8850 5911 0.0443991 1.02368 1.5664 1 0 1 1 0 0 +EDGE2 8850 5931 0.0952483 0.973475 1.60458 1 0 1 1 0 0 +EDGE2 8850 8769 1.07498 -0.0336326 -3.13497 1 0 1 1 0 0 +EDGE2 8850 5910 -0.00274251 -0.11863 -3.12574 1 0 1 1 0 0 +EDGE2 8850 5930 -0.00292913 0.127303 0.0321688 1 0 1 1 0 0 +EDGE2 8850 8770 0.0215043 0.0741434 -3.12329 1 0 1 1 0 0 +EDGE2 8850 8789 1.07749 0.0248021 -3.16395 1 0 1 1 0 0 +EDGE2 8850 5909 1.01137 0.037295 -3.12719 1 0 1 1 0 0 +EDGE2 8850 8791 0.019263 -0.938689 -1.58218 1 0 1 1 0 0 +EDGE2 8850 8771 -0.0100179 -1.04549 -1.57607 1 0 1 1 0 0 +EDGE2 8851 8790 -0.932303 -0.0477567 1.57498 1 0 1 1 0 0 +EDGE2 8851 5912 0.915923 0.0151549 -0.0068921 1 0 1 1 0 0 +EDGE2 8851 5932 1.02321 0.0115849 -0.00454309 1 0 1 1 0 0 +EDGE2 8851 5911 -0.0236584 0.0101025 0.0434599 1 0 1 1 0 0 +EDGE2 8851 5931 -0.156799 0.0625899 0.0185542 1 0 1 1 0 0 +EDGE2 8851 8850 -1.0246 0.0435162 -1.57229 1 0 1 1 0 0 +EDGE2 8851 5910 -0.971649 -0.0506092 1.57381 1 0 1 1 0 0 +EDGE2 8851 5930 -0.938798 -0.0657674 -1.57181 1 0 1 1 0 0 +EDGE2 8851 8770 -0.942071 -0.0197861 1.61387 1 0 1 1 0 0 +EDGE2 8852 5912 0.0360787 0.0529322 -0.00295116 1 0 1 1 0 0 +EDGE2 8852 5913 0.958767 0.0644138 -0.0408044 1 0 1 1 0 0 +EDGE2 8852 5933 0.964645 0.0969969 0.0171094 1 0 1 1 0 0 +EDGE2 8852 5932 0.0443114 -0.0576464 -0.0080167 1 0 1 1 0 0 +EDGE2 8852 5911 -0.949302 0.0568459 -0.0418753 1 0 1 1 0 0 +EDGE2 8852 5931 -0.993668 -0.0436136 0.0275085 1 0 1 1 0 0 +EDGE2 8852 8851 -0.993836 0.0301995 0.0282138 1 0 1 1 0 0 +EDGE2 8853 5934 1.00793 -0.0902148 -0.0155405 1 0 1 1 0 0 +EDGE2 8853 5914 0.990602 -0.0733642 0.00629177 1 0 1 1 0 0 +EDGE2 8853 5912 -1.09668 -0.0388747 -0.0195455 1 0 1 1 0 0 +EDGE2 8853 8852 -0.959133 -0.0294885 -0.00718805 1 0 1 1 0 0 +EDGE2 8853 5913 -0.00186012 0.0834069 0.00337642 1 0 1 1 0 0 +EDGE2 8853 5933 -0.0362398 -0.0325377 -0.0274299 1 0 1 1 0 0 +EDGE2 8853 5932 -0.994827 -0.00887504 0.000700339 1 0 1 1 0 0 +EDGE2 8854 8853 -1.07669 -0.0646184 -0.0019524 1 0 1 1 0 0 +EDGE2 8854 5915 0.9736 -0.0271405 -0.0274519 1 0 1 1 0 0 +EDGE2 8854 6015 1.04174 -0.126338 -3.13476 1 0 1 1 0 0 +EDGE2 8854 5935 0.985206 -0.0330322 -0.033116 1 0 1 1 0 0 +EDGE2 8854 5934 0.0226387 -0.0141784 0.00605569 1 0 1 1 0 0 +EDGE2 8854 5914 0.0289007 0.000790611 0.0193773 1 0 1 1 0 0 +EDGE2 8854 5913 -1.01866 -0.0380237 0.00398046 1 0 1 1 0 0 +EDGE2 8854 5933 -1.08151 -0.0203212 -0.0205572 1 0 1 1 0 0 +EDGE2 8855 6014 0.942279 0.0997382 -3.16145 1 0 1 1 0 0 +EDGE2 8855 5915 0.0708184 -0.0642607 0.00212323 1 0 1 1 0 0 +EDGE2 8855 6016 -0.0208542 1.06336 1.53469 1 0 1 1 0 0 +EDGE2 8855 6015 -0.0429902 -0.0099348 -3.14413 1 0 1 1 0 0 +EDGE2 8855 5916 -0.0273694 0.987503 1.56262 1 0 1 1 0 0 +EDGE2 8855 5935 0.0400156 -0.00565517 0.0036821 1 0 1 1 0 0 +EDGE2 8855 5934 -1.02115 -0.028625 0.0215614 1 0 1 1 0 0 +EDGE2 8855 8854 -0.909278 0.0273731 -0.021636 1 0 1 1 0 0 +EDGE2 8855 5914 -0.942804 -0.0744692 -0.0127314 1 0 1 1 0 0 +EDGE2 8855 5936 -0.0600142 -1.03037 -1.55291 1 0 1 1 0 0 +EDGE2 8856 5915 -0.955146 0.0411858 -1.58298 1 0 1 1 0 0 +EDGE2 8856 6016 -0.00599941 -0.0703916 -0.0102587 1 0 1 1 0 0 +EDGE2 8856 5917 0.979265 0.0515922 0.00622151 1 0 1 1 0 0 +EDGE2 8856 6017 1.02161 -0.0254032 -0.00632106 1 0 1 1 0 0 +EDGE2 8856 6015 -1.01291 -0.0108755 1.57136 1 0 1 1 0 0 +EDGE2 8856 8855 -1.00675 0.0238598 -1.5554 1 0 1 1 0 0 +EDGE2 8856 5916 -0.0563029 0.0127229 -0.0225831 1 0 1 1 0 0 +EDGE2 8856 5935 -0.987015 0.0754806 -1.56618 1 0 1 1 0 0 +EDGE2 8857 6018 0.964551 0.00186822 -0.0179233 1 0 1 1 0 0 +EDGE2 8857 5918 0.951929 -0.004923 0.00775095 1 0 1 1 0 0 +EDGE2 8857 6016 -0.994779 -0.049269 0.00204541 1 0 1 1 0 0 +EDGE2 8857 5917 -0.00367942 0.0677582 -0.0258992 1 0 1 1 0 0 +EDGE2 8857 6017 0.0528222 -0.0234616 -0.0157872 1 0 1 1 0 0 +EDGE2 8857 8856 -1.02243 -0.0420716 -0.017112 1 0 1 1 0 0 +EDGE2 8857 5916 -1.0622 0.0269585 -0.0472986 1 0 1 1 0 0 +EDGE2 8858 6019 0.979108 -0.0349121 0.0183141 1 0 1 1 0 0 +EDGE2 8858 6018 -0.0325734 0.0287204 0.0118384 1 0 1 1 0 0 +EDGE2 8858 5919 0.96994 -0.085144 0.0103951 1 0 1 1 0 0 +EDGE2 8858 5918 -0.0818477 -0.0261873 0.00295781 1 0 1 1 0 0 +EDGE2 8858 5917 -1.07068 -0.0404805 -0.00950278 1 0 1 1 0 0 +EDGE2 8858 6017 -0.958777 -0.0736991 -0.0295424 1 0 1 1 0 0 +EDGE2 8858 8857 -0.993581 0.0245423 -0.00567528 1 0 1 1 0 0 +EDGE2 8859 620 1.01357 -0.00840823 -3.1854 1 0 1 1 0 0 +EDGE2 8859 6020 0.98229 -0.0780198 0.00480293 1 0 1 1 0 0 +EDGE2 8859 5920 0.973738 -0.0215971 0.0260804 1 0 1 1 0 0 +EDGE2 8859 6019 -0.00862277 0.0112792 0.0306606 1 0 1 1 0 0 +EDGE2 8859 6018 -0.990783 0.0402287 -0.00999386 1 0 1 1 0 0 +EDGE2 8859 8858 -0.923965 -0.00446295 -0.03014 1 0 1 1 0 0 +EDGE2 8859 5919 0.049229 0.0213059 0.00406564 1 0 1 1 0 0 +EDGE2 8859 5918 -0.967951 0.0248155 -0.0251608 1 0 1 1 0 0 +EDGE2 8860 6021 -0.0367793 -1.00823 -1.565 1 0 1 1 0 0 +EDGE2 8860 620 0.0247245 0.0498964 -3.13059 1 0 1 1 0 0 +EDGE2 8860 6020 0.028444 -0.0760959 0.0383047 1 0 1 1 0 0 +EDGE2 8860 619 1.05073 -0.0513368 -3.15059 1 0 1 1 0 0 +EDGE2 8860 5920 0.160905 0.0567057 0.0118501 1 0 1 1 0 0 +EDGE2 8860 6019 -1.04009 0.0276322 0.0354573 1 0 1 1 0 0 +EDGE2 8860 621 -0.0206359 0.905468 1.53475 1 0 1 1 0 0 +EDGE2 8860 5921 0.0336057 0.925477 1.54792 1 0 1 1 0 0 +EDGE2 8860 8859 -0.981655 -0.0162209 0.0148096 1 0 1 1 0 0 +EDGE2 8860 5919 -1.03345 0.00594317 0.00266829 1 0 1 1 0 0 +EDGE2 8861 6021 0.052931 0.0538789 -0.00782789 1 0 1 1 0 0 +EDGE2 8861 6022 0.934826 0.0028638 0.0187964 1 0 1 1 0 0 +EDGE2 8861 620 -1.01124 -0.0160888 -1.59528 1 0 1 1 0 0 +EDGE2 8861 6020 -0.945817 0.058718 1.57117 1 0 1 1 0 0 +EDGE2 8861 8860 -0.948936 0.0335066 1.56916 1 0 1 1 0 0 +EDGE2 8861 5920 -1.00137 -0.05088 1.5731 1 0 1 1 0 0 +EDGE2 8862 6021 -0.924125 0.00681308 0.0209422 1 0 1 1 0 0 +EDGE2 8862 6022 -0.0945713 0.0513161 0.000517664 1 0 1 1 0 0 +EDGE2 8862 6023 1.06802 0.0391759 -0.00273734 1 0 1 1 0 0 +EDGE2 8862 8861 -0.969404 -0.0431648 0.0451401 1 0 1 1 0 0 +EDGE2 8863 6024 1.01206 -0.0548264 0.000716381 1 0 1 1 0 0 +EDGE2 8863 6022 -0.993567 0.00979811 -0.00602818 1 0 1 1 0 0 +EDGE2 8863 8862 -1.09351 -0.0125464 0.0177807 1 0 1 1 0 0 +EDGE2 8863 6023 -0.162319 0.0637094 0.00617981 1 0 1 1 0 0 +EDGE2 8864 8863 -0.930324 0.0410128 0.016301 1 0 1 1 0 0 +EDGE2 8864 6025 0.969812 -0.0369181 -0.0110599 1 0 1 1 0 0 +EDGE2 8864 6024 -0.0296867 -0.034637 -0.010746 1 0 1 1 0 0 +EDGE2 8864 6023 -0.983536 -0.0204291 0.00320014 1 0 1 1 0 0 +EDGE2 8865 6025 0.0371648 -0.025345 0.00889251 1 0 1 1 0 0 +EDGE2 8865 6026 0.0368628 1.03931 1.56983 1 0 1 1 0 0 +EDGE2 8865 6024 -1.07933 0.0647467 0.00988289 1 0 1 1 0 0 +EDGE2 8865 8864 -1.05419 0.0676592 -0.0230489 1 0 1 1 0 0 +EDGE2 8866 6025 -1.07602 0.00431145 -1.55456 1 0 1 1 0 0 +EDGE2 8866 6026 0.0541759 -0.0370229 -0.0340244 1 0 1 1 0 0 +EDGE2 8866 6027 0.997785 -0.0211849 0.0292633 1 0 1 1 0 0 +EDGE2 8866 8865 -1.06849 0.0333555 -1.58657 1 0 1 1 0 0 +EDGE2 8867 6028 0.955231 0.0569164 -0.00676735 1 0 1 1 0 0 +EDGE2 8867 6026 -0.97095 -0.0940172 0.0153378 1 0 1 1 0 0 +EDGE2 8867 8866 -0.961079 0.092317 0.0112918 1 0 1 1 0 0 +EDGE2 8867 6027 -0.0139585 -0.0573366 -0.000129361 1 0 1 1 0 0 +EDGE2 8868 8867 -0.915981 0.0476482 0.0281086 1 0 1 1 0 0 +EDGE2 8868 6029 1.03535 0.111423 -0.02528 1 0 1 1 0 0 +EDGE2 8868 6028 -0.0149971 -0.0590827 0.00127438 1 0 1 1 0 0 +EDGE2 8868 6027 -1.06052 -0.0116858 0.0222953 1 0 1 1 0 0 +EDGE2 8869 8868 -1.03887 -0.0168818 -0.00358396 1 0 1 1 0 0 +EDGE2 8869 6050 1.05931 -0.00409477 -3.15706 1 0 1 1 0 0 +EDGE2 8869 6090 0.983294 0.00892482 -3.16586 1 0 1 1 0 0 +EDGE2 8869 6250 0.991024 0.0221085 -3.1587 1 0 1 1 0 0 +EDGE2 8869 6070 1.0375 0.0768343 -3.17573 1 0 1 1 0 0 +EDGE2 8869 610 1.10068 0.0107391 -3.12988 1 0 1 1 0 0 +EDGE2 8869 6030 1.01255 0.0117991 0.0337573 1 0 1 1 0 0 +EDGE2 8869 6029 -0.0509516 0.0207861 -0.0222722 1 0 1 1 0 0 +EDGE2 8869 6028 -1.07394 -0.0395037 -0.0205155 1 0 1 1 0 0 +EDGE2 8870 6251 0.0654677 -1.01296 -1.56362 1 0 1 1 0 0 +EDGE2 8870 6051 0.0897156 -0.984212 -1.53975 1 0 1 1 0 0 +EDGE2 8870 6071 -0.020935 -1.05187 -1.55499 1 0 1 1 0 0 +EDGE2 8870 6091 -0.00872567 -1.05401 -1.57515 1 0 1 1 0 0 +EDGE2 8870 6031 0.0648094 -0.946218 -1.50877 1 0 1 1 0 0 +EDGE2 8870 6089 1.11347 0.013087 -3.14913 1 0 1 1 0 0 +EDGE2 8870 6249 1.00847 -0.0568927 -3.15085 1 0 1 1 0 0 +EDGE2 8870 6049 1.03604 -0.0421081 -3.09987 1 0 1 1 0 0 +EDGE2 8870 6069 1.06578 -0.0339155 -3.15082 1 0 1 1 0 0 +EDGE2 8870 609 1.02341 -0.0529504 -3.09669 1 0 1 1 0 0 +EDGE2 8870 6050 -0.00804496 -0.0428191 -3.13978 1 0 1 1 0 0 +EDGE2 8870 6090 -0.000938467 -0.0415484 -3.14163 1 0 1 1 0 0 +EDGE2 8870 6250 0.00170376 0.00537426 -3.12283 1 0 1 1 0 0 +EDGE2 8870 6070 0.0399536 0.0125359 -3.09741 1 0 1 1 0 0 +EDGE2 8870 8869 -0.970899 0.0206475 -0.0380525 1 0 1 1 0 0 +EDGE2 8870 610 -0.0698656 0.0382187 -3.1714 1 0 1 1 0 0 +EDGE2 8870 6030 -0.030784 0.00148197 -0.015503 1 0 1 1 0 0 +EDGE2 8870 6029 -1.05885 -0.0289366 -0.0152509 1 0 1 1 0 0 +EDGE2 8870 611 -0.042158 0.971298 1.5577 1 0 1 1 0 0 +EDGE2 8871 6050 -0.899577 -0.0128171 1.56401 1 0 1 1 0 0 +EDGE2 8871 6090 -1.08431 -0.00361726 1.54421 1 0 1 1 0 0 +EDGE2 8871 6250 -1.05528 0.0720503 1.60872 1 0 1 1 0 0 +EDGE2 8871 8870 -0.991538 -0.0271793 -1.5717 1 0 1 1 0 0 +EDGE2 8871 6070 -0.994313 0.00729878 1.59423 1 0 1 1 0 0 +EDGE2 8871 610 -1.01712 0.0386993 1.61258 1 0 1 1 0 0 +EDGE2 8871 6030 -1.02867 -0.000478469 -1.58889 1 0 1 1 0 0 +EDGE2 8871 611 -0.0515022 0.0964739 -0.0223826 1 0 1 1 0 0 +EDGE2 8871 612 1.00429 -0.0594123 -0.0204452 1 0 1 1 0 0 +EDGE2 8872 611 -1.00998 0.035822 0.00975157 1 0 1 1 0 0 +EDGE2 8872 8871 -0.960704 -0.020415 -0.0296868 1 0 1 1 0 0 +EDGE2 8872 612 0.0436728 -0.0979967 -0.0062168 1 0 1 1 0 0 +EDGE2 8872 613 0.997448 0.0489547 0.0198045 1 0 1 1 0 0 +EDGE2 8873 8872 -1.02771 0.108842 -0.00617297 1 0 1 1 0 0 +EDGE2 8873 612 -0.999293 0.0744702 -0.0277732 1 0 1 1 0 0 +EDGE2 8873 614 0.928911 0.0816182 0.00383405 1 0 1 1 0 0 +EDGE2 8873 613 -0.0208888 -0.0718771 -0.0216559 1 0 1 1 0 0 +EDGE2 8874 8873 -1.03981 0.0136882 -0.00985514 1 0 1 1 0 0 +EDGE2 8874 614 0.0732515 -0.0682717 0.00279503 1 0 1 1 0 0 +EDGE2 8874 613 -0.996609 0.061817 0.012192 1 0 1 1 0 0 +EDGE2 8874 615 0.952845 0.0180733 -0.00341767 1 0 1 1 0 0 +EDGE2 8875 614 -0.990425 0.0050304 -0.00325318 1 0 1 1 0 0 +EDGE2 8875 8874 -1.10539 -0.075401 -0.0119807 1 0 1 1 0 0 +EDGE2 8875 616 0.00416058 0.988053 1.59125 1 0 1 1 0 0 +EDGE2 8875 615 -0.0115399 -0.0633268 0.00631626 1 0 1 1 0 0 +EDGE2 8876 8875 -1.0801 -0.133064 1.54827 1 0 1 1 0 0 +EDGE2 8876 615 -1.01217 -0.0676309 1.58214 1 0 1 1 0 0 +EDGE2 8877 8876 -1.07138 -0.0642089 0.00947403 1 0 1 1 0 0 +EDGE2 8878 8877 -1.00445 -0.0797714 -0.00124037 1 0 1 1 0 0 +EDGE2 8879 6240 0.912824 0.0462286 -3.16303 1 0 1 1 0 0 +EDGE2 8879 600 1.0064 0.0552342 -3.1561 1 0 1 1 0 0 +EDGE2 8879 8878 -0.97839 -0.0670233 -0.00889963 1 0 1 1 0 0 +EDGE2 8880 6239 1.02687 -0.0293587 -3.1377 1 0 1 1 0 0 +EDGE2 8880 599 0.990576 -0.00219963 -3.13716 1 0 1 1 0 0 +EDGE2 8880 6240 -0.0297998 0.049494 -3.12521 1 0 1 1 0 0 +EDGE2 8880 601 -0.00185804 -1.07374 -1.59587 1 0 1 1 0 0 +EDGE2 8880 6241 0.0868071 -0.970042 -1.57025 1 0 1 1 0 0 +EDGE2 8880 8879 -0.986353 -0.0936257 -0.0406131 1 0 1 1 0 0 +EDGE2 8880 600 0.0321876 0.0514789 -3.14494 1 0 1 1 0 0 +EDGE2 8881 6240 -1.03069 0.121293 1.559 1 0 1 1 0 0 +EDGE2 8881 8880 -0.932285 0.0962817 -1.61902 1 0 1 1 0 0 +EDGE2 8881 600 -1.1114 0.0353014 1.58943 1 0 1 1 0 0 +EDGE2 8882 8881 -1.06714 0.0202611 -0.0252441 1 0 1 1 0 0 +EDGE2 8883 8882 -0.97291 0.0300569 -0.0446191 1 0 1 1 0 0 +EDGE2 8884 8883 -0.941216 0.0509698 0.00108338 1 0 1 1 0 0 +EDGE2 8885 8884 -0.987477 -0.00117077 -0.0304706 1 0 1 1 0 0 +EDGE2 8886 8885 -1.07359 -0.0402816 1.57904 1 0 1 1 0 0 +EDGE2 8887 8886 -0.941394 -0.0335693 0.00601116 1 0 1 1 0 0 +EDGE2 8888 8887 -0.910037 -0.0550159 0.0247858 1 0 1 1 0 0 +EDGE2 8889 6310 0.968761 0.010513 -3.10464 1 0 1 1 0 0 +EDGE2 8889 8888 -0.984283 -0.0798621 0.020157 1 0 1 1 0 0 +EDGE2 8890 6309 0.923775 -0.0453597 -3.15821 1 0 1 1 0 0 +EDGE2 8890 6311 0.0176433 -0.969208 -1.55126 1 0 1 1 0 0 +EDGE2 8890 6310 0.0562381 0.135117 -3.13195 1 0 1 1 0 0 +EDGE2 8890 8889 -0.949622 -0.013259 -0.0279628 1 0 1 1 0 0 +EDGE2 8891 6310 -1.00613 -0.0573845 1.6 1 0 1 1 0 0 +EDGE2 8891 8890 -0.949821 0.00650656 -1.57321 1 0 1 1 0 0 +EDGE2 8892 8891 -0.919151 -0.0236428 -0.00281108 1 0 1 1 0 0 +EDGE2 8893 8892 -0.948592 0.0150039 -0.0091355 1 0 1 1 0 0 +EDGE2 8894 8893 -1.09798 0.00324437 -0.0153126 1 0 1 1 0 0 +EDGE2 8894 8135 0.952808 0.0481844 -3.14991 1 0 1 1 0 0 +EDGE2 8894 8155 0.986493 -0.136802 -3.12082 1 0 1 1 0 0 +EDGE2 8895 8156 0.0073469 -0.972599 -1.5676 1 0 1 1 0 0 +EDGE2 8895 8136 0.0125465 -0.967515 -1.54765 1 0 1 1 0 0 +EDGE2 8895 8894 -1.08103 0.0831662 -0.0278932 1 0 1 1 0 0 +EDGE2 8895 8135 0.0840105 0.037097 -3.16099 1 0 1 1 0 0 +EDGE2 8895 8155 0.0226264 0.0581858 -3.1991 1 0 1 1 0 0 +EDGE2 8895 8134 1.02066 -0.0812431 -3.16492 1 0 1 1 0 0 +EDGE2 8895 8154 0.938925 0.0457326 -3.10938 1 0 1 1 0 0 +EDGE2 8896 8135 -1.05105 -0.00990444 1.53614 1 0 1 1 0 0 +EDGE2 8896 8895 -0.961167 -0.0600944 -1.58169 1 0 1 1 0 0 +EDGE2 8896 8155 -0.980109 0.00445781 1.56535 1 0 1 1 0 0 +EDGE2 8897 8896 -0.972067 0.0567775 0.0129886 1 0 1 1 0 0 +EDGE2 8898 8897 -1.027 0.0817583 0.00212128 1 0 1 1 0 0 +EDGE2 8899 8898 -0.991623 0.0370531 0.0055656 1 0 1 1 0 0 +EDGE2 8900 8899 -0.987713 -0.0880586 -0.0353507 1 0 1 1 0 0 +EDGE2 8901 8900 -1.07043 -0.0468947 -1.55797 1 0 1 1 0 0 +EDGE2 8902 8901 -0.959226 -0.11642 0.0119671 1 0 1 1 0 0 +EDGE2 8903 8902 -0.965998 -0.0271496 0.0119816 1 0 1 1 0 0 +EDGE2 8904 8885 1.04272 0.00112688 -3.13257 1 0 1 1 0 0 +EDGE2 8904 8903 -0.998781 -0.0412862 0.0364609 1 0 1 1 0 0 +EDGE2 8905 8886 0.0220438 1.00412 1.56308 1 0 1 1 0 0 +EDGE2 8905 8884 1.02623 0.00881562 -3.12063 1 0 1 1 0 0 +EDGE2 8905 8885 -0.00143977 0.0939864 -3.14831 1 0 1 1 0 0 +EDGE2 8905 8904 -1.10016 -0.0178415 0.00880259 1 0 1 1 0 0 +EDGE2 8906 8887 1.04331 -0.00481944 0.033365 1 0 1 1 0 0 +EDGE2 8906 8886 -0.10539 0.017902 -0.00327472 1 0 1 1 0 0 +EDGE2 8906 8885 -0.950143 0.00539975 1.59659 1 0 1 1 0 0 +EDGE2 8906 8905 -0.934901 -0.0543863 -1.57345 1 0 1 1 0 0 +EDGE2 8907 8888 0.98395 0.0140893 -0.0424363 1 0 1 1 0 0 +EDGE2 8907 8887 -0.0701518 0.0557075 0.0252802 1 0 1 1 0 0 +EDGE2 8907 8906 -0.99063 0.00926232 0.0220688 1 0 1 1 0 0 +EDGE2 8907 8886 -0.961021 -0.0149686 -0.0342953 1 0 1 1 0 0 +EDGE2 8908 8889 1.03658 0.0513644 0.0256392 1 0 1 1 0 0 +EDGE2 8908 8888 -0.0369773 0.0357356 0.0109958 1 0 1 1 0 0 +EDGE2 8908 8907 -0.976515 0.0478603 -0.0351788 1 0 1 1 0 0 +EDGE2 8908 8887 -1.07211 -0.0356577 -0.0143909 1 0 1 1 0 0 +EDGE2 8909 6310 0.979941 0.0308798 -3.17963 1 0 1 1 0 0 +EDGE2 8909 8890 0.847493 0.0645566 0.000832993 1 0 1 1 0 0 +EDGE2 8909 8889 0.0326649 -0.0547398 0.0321416 1 0 1 1 0 0 +EDGE2 8909 8888 -1.08437 0.0726052 -0.00276206 1 0 1 1 0 0 +EDGE2 8909 8908 -1.02788 0.056535 0.0459635 1 0 1 1 0 0 +EDGE2 8910 6309 1.08782 -0.0838632 -3.15755 1 0 1 1 0 0 +EDGE2 8910 6311 -0.0785145 -0.977144 -1.57739 1 0 1 1 0 0 +EDGE2 8910 6310 0.00116311 -0.0140036 -3.17904 1 0 1 1 0 0 +EDGE2 8910 8890 0.0299531 0.0173161 -0.0403237 1 0 1 1 0 0 +EDGE2 8910 8909 -0.968587 -0.0237787 -0.0343496 1 0 1 1 0 0 +EDGE2 8910 8889 -1.08209 0.0049654 0.00502285 1 0 1 1 0 0 +EDGE2 8910 8891 -0.0389246 0.979089 1.60423 1 0 1 1 0 0 +EDGE2 8911 6310 -1.0435 -0.0403774 1.55515 1 0 1 1 0 0 +EDGE2 8911 8910 -0.891021 0.0913722 -1.5845 1 0 1 1 0 0 +EDGE2 8911 8890 -0.9977 -0.000795204 -1.56483 1 0 1 1 0 0 +EDGE2 8911 8892 1.02564 -0.0338428 0.0328194 1 0 1 1 0 0 +EDGE2 8911 8891 0.0142938 -0.0373273 0.0131327 1 0 1 1 0 0 +EDGE2 8912 8892 0.0305459 -0.0245344 0.0246769 1 0 1 1 0 0 +EDGE2 8912 8891 -0.9532 0.0203957 0.0161164 1 0 1 1 0 0 +EDGE2 8912 8911 -0.974606 -0.0138677 0.00623882 1 0 1 1 0 0 +EDGE2 8912 8893 0.934608 -0.000839985 -0.0221272 1 0 1 1 0 0 +EDGE2 8913 8892 -1.01017 -0.0322879 0.0187013 1 0 1 1 0 0 +EDGE2 8913 8912 -1.10055 -0.0937776 -0.0118512 1 0 1 1 0 0 +EDGE2 8913 8893 -0.0838593 -0.00200435 -0.016748 1 0 1 1 0 0 +EDGE2 8913 8894 0.911766 -0.0275262 -0.0224314 1 0 1 1 0 0 +EDGE2 8914 8893 -1.08434 0.0158171 -0.0238787 1 0 1 1 0 0 +EDGE2 8914 8913 -1.04818 -0.0300658 -0.01729 1 0 1 1 0 0 +EDGE2 8914 8894 -0.0399568 -0.0466252 -0.00707058 1 0 1 1 0 0 +EDGE2 8914 8135 1.0293 -0.00394628 -3.14565 1 0 1 1 0 0 +EDGE2 8914 8895 0.880782 0.0873797 -0.0132014 1 0 1 1 0 0 +EDGE2 8914 8155 0.985512 -0.0595591 -3.16674 1 0 1 1 0 0 +EDGE2 8915 8914 -1.01347 0.0483593 -0.0161227 1 0 1 1 0 0 +EDGE2 8915 8156 0.00640736 -1.01977 -1.5891 1 0 1 1 0 0 +EDGE2 8915 8136 0.101883 -0.9343 -1.59249 1 0 1 1 0 0 +EDGE2 8915 8894 -1.04233 -0.0291471 0.0319463 1 0 1 1 0 0 +EDGE2 8915 8135 0.0217445 -0.137065 -3.17466 1 0 1 1 0 0 +EDGE2 8915 8895 -0.0680645 0.00281777 -0.00778944 1 0 1 1 0 0 +EDGE2 8915 8155 -0.0535062 0.0217252 -3.13033 1 0 1 1 0 0 +EDGE2 8915 8896 -0.0421274 0.982774 1.56811 1 0 1 1 0 0 +EDGE2 8915 8134 0.956927 -0.0132649 -3.13768 1 0 1 1 0 0 +EDGE2 8915 8154 0.868297 -0.0134201 -3.11901 1 0 1 1 0 0 +EDGE2 8916 8135 -1.07597 0.0442707 1.55142 1 0 1 1 0 0 +EDGE2 8916 8895 -1.09138 0.0365182 -1.58856 1 0 1 1 0 0 +EDGE2 8916 8915 -1.03447 -0.0164648 -1.57819 1 0 1 1 0 0 +EDGE2 8916 8155 -0.992806 -0.0128978 1.52276 1 0 1 1 0 0 +EDGE2 8916 8896 0.016239 -0.00715695 0.0184213 1 0 1 1 0 0 +EDGE2 8916 8897 1.06562 -0.00243943 -0.00314916 1 0 1 1 0 0 +EDGE2 8917 8916 -1.00635 -0.0262263 0.0193669 1 0 1 1 0 0 +EDGE2 8917 8896 -1.00086 0.00328281 0.0583392 1 0 1 1 0 0 +EDGE2 8917 8897 -0.0291595 0.0215633 0.023189 1 0 1 1 0 0 +EDGE2 8917 8898 0.957364 0.0500711 0.0228399 1 0 1 1 0 0 +EDGE2 8918 8917 -1.01291 0.0632155 -0.0365266 1 0 1 1 0 0 +EDGE2 8918 8897 -0.930794 -0.084066 0.0514443 1 0 1 1 0 0 +EDGE2 8918 8898 -0.133686 -0.0581712 -0.00326209 1 0 1 1 0 0 +EDGE2 8918 8899 0.910574 -0.0770748 -0.00301453 1 0 1 1 0 0 +EDGE2 8919 8898 -1.01519 0.00191608 -0.00454254 1 0 1 1 0 0 +EDGE2 8919 8918 -1.01374 -0.0138709 -0.00427925 1 0 1 1 0 0 +EDGE2 8919 8899 -0.0109567 -0.0194392 0.0102377 1 0 1 1 0 0 +EDGE2 8919 8900 1.01611 -0.115165 0.0326477 1 0 1 1 0 0 +EDGE2 8920 8919 -0.979613 -0.0474289 0.000880524 1 0 1 1 0 0 +EDGE2 8920 8899 -0.988862 -0.0663148 0.0126197 1 0 1 1 0 0 +EDGE2 8920 8901 0.0372083 1.06754 1.56972 1 0 1 1 0 0 +EDGE2 8920 8900 0.0278144 0.0254912 0.0110678 1 0 1 1 0 0 +EDGE2 8921 8902 0.892224 -0.0751226 0.017251 1 0 1 1 0 0 +EDGE2 8921 8901 0.0268496 -0.0186322 0.00645595 1 0 1 1 0 0 +EDGE2 8921 8920 -0.930949 0.0213347 -1.54708 1 0 1 1 0 0 +EDGE2 8921 8900 -1.0178 -0.0742577 -1.59463 1 0 1 1 0 0 +EDGE2 8922 8903 1.03648 0.0190714 -0.0191589 1 0 1 1 0 0 +EDGE2 8922 8902 0.0713928 -0.018157 -0.0211845 1 0 1 1 0 0 +EDGE2 8922 8921 -0.971042 -0.100925 -0.0201863 1 0 1 1 0 0 +EDGE2 8922 8901 -0.998661 -0.0613732 -0.017097 1 0 1 1 0 0 +EDGE2 8923 8904 0.98181 0.0258363 0.0107231 1 0 1 1 0 0 +EDGE2 8923 8903 0.0399851 -0.0146768 0.0206762 1 0 1 1 0 0 +EDGE2 8923 8902 -1.0844 -0.0840527 0.0162668 1 0 1 1 0 0 +EDGE2 8923 8922 -0.993404 -0.131086 -0.0175865 1 0 1 1 0 0 +EDGE2 8924 8885 1.05634 0.0451649 -3.11795 1 0 1 1 0 0 +EDGE2 8924 8905 1.00869 0.0722835 0.0012619 1 0 1 1 0 0 +EDGE2 8924 8904 0.0172412 0.0669523 0.0199382 1 0 1 1 0 0 +EDGE2 8924 8903 -0.997385 -0.0816878 -0.0180845 1 0 1 1 0 0 +EDGE2 8924 8923 -0.998971 0.0267575 -0.0500454 1 0 1 1 0 0 +EDGE2 8925 8906 0.0357793 0.871677 1.56895 1 0 1 1 0 0 +EDGE2 8925 8886 0.0274822 0.90229 1.56894 1 0 1 1 0 0 +EDGE2 8925 8884 0.982604 -0.0166986 -3.11936 1 0 1 1 0 0 +EDGE2 8925 8885 -0.00289378 0.0149418 -3.1517 1 0 1 1 0 0 +EDGE2 8925 8905 -0.00432138 0.0549459 -0.0102781 1 0 1 1 0 0 +EDGE2 8925 8924 -1.08169 0.0520956 0.0067541 1 0 1 1 0 0 +EDGE2 8925 8904 -1.04891 -0.0605953 -0.0101489 1 0 1 1 0 0 +EDGE2 8926 8885 -0.95005 0.0529829 -1.58097 1 0 1 1 0 0 +EDGE2 8926 8925 -1.01223 0.00055698 1.55339 1 0 1 1 0 0 +EDGE2 8926 8905 -1.1253 -0.013165 1.60923 1 0 1 1 0 0 +EDGE2 8927 8926 -0.978398 -0.0346112 0.0144112 1 0 1 1 0 0 +EDGE2 8928 8927 -0.974839 -0.0157144 0.00375635 1 0 1 1 0 0 +EDGE2 8929 8928 -0.969002 0.0199823 -0.0384359 1 0 1 1 0 0 +EDGE2 8929 8830 1.01047 0.0399012 -3.16684 1 0 1 1 0 0 +EDGE2 8929 630 0.92964 0.0775916 -3.13447 1 0 1 1 0 0 +EDGE2 8929 650 0.903942 -0.0799483 -3.15772 1 0 1 1 0 0 +EDGE2 8930 8929 -0.967677 0.0316049 -0.011864 1 0 1 1 0 0 +EDGE2 8930 8829 0.947544 0.0727969 -3.12166 1 0 1 1 0 0 +EDGE2 8930 8830 0.0827411 0.0606762 -3.13965 1 0 1 1 0 0 +EDGE2 8930 651 0.0233458 -1.03545 -1.57173 1 0 1 1 0 0 +EDGE2 8930 630 -0.0134177 0.0123427 -3.13908 1 0 1 1 0 0 +EDGE2 8930 650 -0.0328304 -0.0402222 -3.14624 1 0 1 1 0 0 +EDGE2 8930 8831 -0.0351844 -0.949135 -1.56754 1 0 1 1 0 0 +EDGE2 8930 631 0.00878316 -1.02279 -1.57167 1 0 1 1 0 0 +EDGE2 8930 649 0.973341 0.0527435 -3.14285 1 0 1 1 0 0 +EDGE2 8930 629 1.00824 0.112999 -3.17295 1 0 1 1 0 0 +EDGE2 8931 8930 -0.940555 0.0780622 -1.56827 1 0 1 1 0 0 +EDGE2 8931 8830 -1.06543 -0.0263753 1.58213 1 0 1 1 0 0 +EDGE2 8931 630 -1.00864 0.0699011 1.57692 1 0 1 1 0 0 +EDGE2 8931 650 -1.06927 0.022504 1.53819 1 0 1 1 0 0 +EDGE2 8932 8931 -1.09506 0.0166517 0.00951717 1 0 1 1 0 0 +EDGE2 8933 8932 -0.923925 0.0798839 0.00870498 1 0 1 1 0 0 +EDGE2 8934 8875 0.916007 0.0190404 -3.1475 1 0 1 1 0 0 +EDGE2 8934 8933 -1.0172 -0.00640602 -0.0191055 1 0 1 1 0 0 +EDGE2 8934 615 0.985254 0.073038 -3.13186 1 0 1 1 0 0 +EDGE2 8935 614 0.910035 -0.0526176 -3.13848 1 0 1 1 0 0 +EDGE2 8935 8874 0.969128 -0.0851503 -3.12929 1 0 1 1 0 0 +EDGE2 8935 8875 0.0285674 -0.0150525 -3.12198 1 0 1 1 0 0 +EDGE2 8935 8876 0.0210389 1.09257 1.56403 1 0 1 1 0 0 +EDGE2 8935 616 -0.0288834 -1.04101 -1.56193 1 0 1 1 0 0 +EDGE2 8935 8934 -0.995212 0.0341243 0.00297776 1 0 1 1 0 0 +EDGE2 8935 615 0.00901856 -0.00786103 -3.14687 1 0 1 1 0 0 +EDGE2 8936 8875 -0.992074 -0.063305 1.57193 1 0 1 1 0 0 +EDGE2 8936 8876 0.0435967 -0.0733225 0.00380613 1 0 1 1 0 0 +EDGE2 8936 8877 1.02983 0.0100621 0.00152784 1 0 1 1 0 0 +EDGE2 8936 8935 -0.960792 0.0537265 -1.56964 1 0 1 1 0 0 +EDGE2 8936 615 -0.987122 -0.0115687 1.58873 1 0 1 1 0 0 +EDGE2 8937 8878 1.0766 0.0212536 0.00120769 1 0 1 1 0 0 +EDGE2 8937 8876 -1.04337 -0.0159466 0.0242246 1 0 1 1 0 0 +EDGE2 8937 8936 -1.05153 0.0813818 -0.00377483 1 0 1 1 0 0 +EDGE2 8937 8877 -0.00319189 0.0295204 0.0286565 1 0 1 1 0 0 +EDGE2 8938 8879 0.967455 0.030491 -0.0227066 1 0 1 1 0 0 +EDGE2 8938 8937 -0.954116 0.0550681 -0.00536944 1 0 1 1 0 0 +EDGE2 8938 8878 -0.0106601 0.0329086 0.0102723 1 0 1 1 0 0 +EDGE2 8938 8877 -0.993972 0.0380624 -0.00348218 1 0 1 1 0 0 +EDGE2 8939 8938 -1.01362 0.00553692 -0.0251405 1 0 1 1 0 0 +EDGE2 8939 6240 0.970792 -0.00234318 -3.12541 1 0 1 1 0 0 +EDGE2 8939 8880 1.01846 -0.0175375 -0.0278429 1 0 1 1 0 0 +EDGE2 8939 8879 -0.0520655 0.0097711 0.0325463 1 0 1 1 0 0 +EDGE2 8939 600 0.975558 0.030067 -3.13823 1 0 1 1 0 0 +EDGE2 8939 8878 -0.991331 -0.0139889 0.0119553 1 0 1 1 0 0 +EDGE2 8940 6239 1.0905 -0.0251881 -3.1479 1 0 1 1 0 0 +EDGE2 8940 599 0.970821 -0.102695 -3.10684 1 0 1 1 0 0 +EDGE2 8940 6240 -0.0334934 0.0591496 -3.14279 1 0 1 1 0 0 +EDGE2 8940 601 0.0371414 -0.887426 -1.58658 1 0 1 1 0 0 +EDGE2 8940 6241 -0.0372587 -1.04812 -1.61604 1 0 1 1 0 0 +EDGE2 8940 8880 -0.0362059 -0.0298305 -0.0220261 1 0 1 1 0 0 +EDGE2 8940 8879 -1.08491 0.000943054 -0.0121916 1 0 1 1 0 0 +EDGE2 8940 8939 -1.00801 -0.0451887 0.0271669 1 0 1 1 0 0 +EDGE2 8940 600 0.0430882 0.0391984 -3.14248 1 0 1 1 0 0 +EDGE2 8940 8881 -0.0160029 1.02704 1.58401 1 0 1 1 0 0 +EDGE2 8941 6242 0.985044 0.0329559 -0.0102471 1 0 1 1 0 0 +EDGE2 8941 602 0.998559 0.0182064 -0.007359 1 0 1 1 0 0 +EDGE2 8941 6240 -1.03906 0.0164813 -1.58087 1 0 1 1 0 0 +EDGE2 8941 8940 -1.08804 0.0275514 1.55752 1 0 1 1 0 0 +EDGE2 8941 601 0.0333526 0.0959715 -0.0246528 1 0 1 1 0 0 +EDGE2 8941 6241 -0.103444 0.018642 0.00145564 1 0 1 1 0 0 +EDGE2 8941 8880 -0.998302 0.0209422 1.54579 1 0 1 1 0 0 +EDGE2 8941 600 -1.02987 -0.0611347 -1.56956 1 0 1 1 0 0 +EDGE2 8942 8941 -1.01607 0.087815 0.00618994 1 0 1 1 0 0 +EDGE2 8942 603 1.0608 0.10358 0.00778287 1 0 1 1 0 0 +EDGE2 8942 6243 1.00024 0.082225 -0.00892784 1 0 1 1 0 0 +EDGE2 8942 6242 0.1861 -0.0487981 0.00794393 1 0 1 1 0 0 +EDGE2 8942 602 0.0195862 -0.00268053 -0.0103467 1 0 1 1 0 0 +EDGE2 8942 601 -0.971633 -0.0649204 0.0096811 1 0 1 1 0 0 +EDGE2 8942 6241 -0.974914 0.0492485 -0.0187886 1 0 1 1 0 0 +EDGE2 8943 603 0.0362798 0.00280125 -0.00373739 1 0 1 1 0 0 +EDGE2 8943 604 1.02722 -0.0262779 -0.0213804 1 0 1 1 0 0 +EDGE2 8943 6244 0.860969 -0.125714 0.0186167 1 0 1 1 0 0 +EDGE2 8943 6243 0.0356671 0.0037882 -0.0216094 1 0 1 1 0 0 +EDGE2 8943 6242 -0.976064 0.0244039 -0.00497088 1 0 1 1 0 0 +EDGE2 8943 8942 -0.933057 -0.02229 -0.022642 1 0 1 1 0 0 +EDGE2 8943 602 -0.970718 -0.0649614 -0.0238028 1 0 1 1 0 0 +EDGE2 8944 6225 1.00367 -0.0149202 -3.1504 1 0 1 1 0 0 +EDGE2 8944 6265 0.958499 0.0948402 -3.13824 1 0 1 1 0 0 +EDGE2 8944 6245 1.05729 -0.082487 -0.0343707 1 0 1 1 0 0 +EDGE2 8944 6045 1.02419 -0.0241908 -3.17592 1 0 1 1 0 0 +EDGE2 8944 6065 1.10198 0.0411989 -3.12291 1 0 1 1 0 0 +EDGE2 8944 6085 0.990472 0.0657986 -3.16036 1 0 1 1 0 0 +EDGE2 8944 605 1.08493 -0.0186546 0.02796 1 0 1 1 0 0 +EDGE2 8944 603 -0.994799 -0.0815758 0.00346439 1 0 1 1 0 0 +EDGE2 8944 8943 -1.05667 0.0254123 -0.00235356 1 0 1 1 0 0 +EDGE2 8944 604 -0.00337501 -0.0698161 -0.0204639 1 0 1 1 0 0 +EDGE2 8944 6244 -0.0333924 0.0212203 0.033284 1 0 1 1 0 0 +EDGE2 8944 6243 -1.00419 -0.00155335 -0.00174714 1 0 1 1 0 0 +EDGE2 8945 6044 0.958882 0.0997554 -3.13212 1 0 1 1 0 0 +EDGE2 8945 6084 0.971824 -0.0296542 -3.15998 1 0 1 1 0 0 +EDGE2 8945 6224 1.03524 -0.0590227 -3.14182 1 0 1 1 0 0 +EDGE2 8945 6264 1.01901 -0.0217459 -3.12866 1 0 1 1 0 0 +EDGE2 8945 6064 1.05427 0.0477933 -3.12637 1 0 1 1 0 0 +EDGE2 8945 6266 0.0212639 1.00271 1.56721 1 0 1 1 0 0 +EDGE2 8945 6226 0.0246991 1.06131 1.57568 1 0 1 1 0 0 +EDGE2 8945 8944 -0.961494 0.039131 -0.0278268 1 0 1 1 0 0 +EDGE2 8945 6225 -0.0557467 -0.0529636 -3.14718 1 0 1 1 0 0 +EDGE2 8945 6265 0.100639 0.00904099 -3.12046 1 0 1 1 0 0 +EDGE2 8945 6245 0.0136598 0.0817314 0.0485616 1 0 1 1 0 0 +EDGE2 8945 6045 -0.068583 -0.0280851 -3.15576 1 0 1 1 0 0 +EDGE2 8945 6065 0.0623423 -0.0254919 -3.09878 1 0 1 1 0 0 +EDGE2 8945 6085 0.136322 -0.163629 -3.09587 1 0 1 1 0 0 +EDGE2 8945 605 -0.0849295 0.0532855 -0.0130408 1 0 1 1 0 0 +EDGE2 8945 604 -0.960126 -0.0496652 -0.0209156 1 0 1 1 0 0 +EDGE2 8945 6244 -0.945094 0.0194603 -0.02284 1 0 1 1 0 0 +EDGE2 8945 6046 0.0124317 -0.985057 -1.59773 1 0 1 1 0 0 +EDGE2 8945 6086 -0.0446732 -0.986594 -1.58903 1 0 1 1 0 0 +EDGE2 8945 6246 0.0164513 -0.984288 -1.57613 1 0 1 1 0 0 +EDGE2 8945 6066 -0.012602 -1.05177 -1.59867 1 0 1 1 0 0 +EDGE2 8945 606 -0.0142351 -1.03284 -1.6023 1 0 1 1 0 0 +EDGE2 8946 6225 -0.962965 -0.0222067 -1.57228 1 0 1 1 0 0 +EDGE2 8946 6265 -0.88795 0.0444707 -1.56748 1 0 1 1 0 0 +EDGE2 8946 8945 -0.987621 -0.030531 1.57524 1 0 1 1 0 0 +EDGE2 8946 6245 -1.0507 -0.0227281 1.60885 1 0 1 1 0 0 +EDGE2 8946 6045 -0.996161 0.0166396 -1.58041 1 0 1 1 0 0 +EDGE2 8946 6065 -0.99207 0.0850198 -1.5649 1 0 1 1 0 0 +EDGE2 8946 6085 -1.05083 -0.00725262 -1.55207 1 0 1 1 0 0 +EDGE2 8946 605 -1.06064 0.0622787 1.59151 1 0 1 1 0 0 +EDGE2 8946 607 1.00737 0.0446859 0.0227676 1 0 1 1 0 0 +EDGE2 8946 6067 1.00294 0.0192194 0.0100252 1 0 1 1 0 0 +EDGE2 8946 6046 0.0851443 -0.0204087 -0.0417659 1 0 1 1 0 0 +EDGE2 8946 6086 0.0143388 -0.0806918 0.00847425 1 0 1 1 0 0 +EDGE2 8946 6246 -0.0530797 0.0642878 -0.0287726 1 0 1 1 0 0 +EDGE2 8946 6066 0.00653015 0.011963 0.0104403 1 0 1 1 0 0 +EDGE2 8946 6247 1.04684 0.0207579 0.0116969 1 0 1 1 0 0 +EDGE2 8946 606 -0.00803562 -0.00773163 0.0350823 1 0 1 1 0 0 +EDGE2 8946 6087 0.994964 -0.0191044 0.0123002 1 0 1 1 0 0 +EDGE2 8946 6047 1.01188 0.0512343 -0.0105295 1 0 1 1 0 0 +EDGE2 8947 607 0.0838545 0.0275489 -0.017361 1 0 1 1 0 0 +EDGE2 8947 6067 0.0763725 0.0246436 0.00186654 1 0 1 1 0 0 +EDGE2 8947 6046 -1.05999 0.139146 -0.00368398 1 0 1 1 0 0 +EDGE2 8947 6086 -0.988431 0.00399749 -0.0146881 1 0 1 1 0 0 +EDGE2 8947 6246 -1.07446 0.074815 0.00174159 1 0 1 1 0 0 +EDGE2 8947 8946 -1.07863 0.0300395 0.00139367 1 0 1 1 0 0 +EDGE2 8947 6066 -1.00697 -0.0059092 0.00132982 1 0 1 1 0 0 +EDGE2 8947 6247 -0.0584046 0.0735058 -0.0235688 1 0 1 1 0 0 +EDGE2 8947 606 -0.982591 -0.0595212 0.00182926 1 0 1 1 0 0 +EDGE2 8947 6087 -0.0376172 0.0999095 -0.0129555 1 0 1 1 0 0 +EDGE2 8947 6047 0.011033 0.0254018 -0.0238362 1 0 1 1 0 0 +EDGE2 8947 6068 0.927623 0.0203279 -0.000929785 1 0 1 1 0 0 +EDGE2 8947 6088 1.13088 -0.00971268 -0.0179911 1 0 1 1 0 0 +EDGE2 8947 6248 0.96626 -0.0664526 0.0234426 1 0 1 1 0 0 +EDGE2 8947 608 1.0052 -0.0155336 0.0137449 1 0 1 1 0 0 +EDGE2 8947 6048 1.00715 -0.0422205 -0.00139008 1 0 1 1 0 0 +EDGE2 8948 607 -1.08232 -0.0150769 0.00769964 1 0 1 1 0 0 +EDGE2 8948 6067 -0.955367 0.0300806 -0.030586 1 0 1 1 0 0 +EDGE2 8948 6247 -1.0039 -0.00667492 0.00761538 1 0 1 1 0 0 +EDGE2 8948 8947 -1.07299 0.0448506 -0.0205844 1 0 1 1 0 0 +EDGE2 8948 6087 -0.970545 0.067525 -0.0511992 1 0 1 1 0 0 +EDGE2 8948 6047 -1.05413 0.0593789 -0.00865034 1 0 1 1 0 0 +EDGE2 8948 6068 0.0866102 -0.0441804 0.000493821 1 0 1 1 0 0 +EDGE2 8948 6088 -0.0776584 0.0156794 0.028653 1 0 1 1 0 0 +EDGE2 8948 6248 -0.0531297 0.0550107 0.00540249 1 0 1 1 0 0 +EDGE2 8948 6089 1.00141 -0.0684419 0.00494093 1 0 1 1 0 0 +EDGE2 8948 608 -0.0459279 -0.0758939 0.00834526 1 0 1 1 0 0 +EDGE2 8948 6048 0.0341931 0.0913775 -0.0133035 1 0 1 1 0 0 +EDGE2 8948 6249 1.04085 0.0426986 0.00391186 1 0 1 1 0 0 +EDGE2 8948 6049 0.962542 0.0256943 -0.0111567 1 0 1 1 0 0 +EDGE2 8948 6069 0.979119 0.0718156 0.0157926 1 0 1 1 0 0 +EDGE2 8948 609 0.959666 0.0737207 -0.0111776 1 0 1 1 0 0 +EDGE2 8949 6068 -0.966937 0.0206536 -0.00159717 1 0 1 1 0 0 +EDGE2 8949 6088 -0.992414 -0.0444319 -0.0124302 1 0 1 1 0 0 +EDGE2 8949 6248 -0.961448 -0.0219766 -0.00356032 1 0 1 1 0 0 +EDGE2 8949 8948 -1.02147 -0.0625057 0.000381971 1 0 1 1 0 0 +EDGE2 8949 6089 -0.0122212 -0.0118941 0.0061354 1 0 1 1 0 0 +EDGE2 8949 608 -1.01853 -0.00436446 -0.00320203 1 0 1 1 0 0 +EDGE2 8949 6048 -1.08626 0.0234546 0.00200724 1 0 1 1 0 0 +EDGE2 8949 6249 0.0148294 -0.0145629 -0.048913 1 0 1 1 0 0 +EDGE2 8949 6049 0.0260613 0.0288665 -0.00136348 1 0 1 1 0 0 +EDGE2 8949 6069 -0.0422059 -0.0272198 -0.0231392 1 0 1 1 0 0 +EDGE2 8949 609 -0.089848 0.022803 0.0176125 1 0 1 1 0 0 +EDGE2 8949 6050 0.95898 0.0261306 0.0104021 1 0 1 1 0 0 +EDGE2 8949 6090 1.10567 -0.0196733 0.0212829 1 0 1 1 0 0 +EDGE2 8949 6250 0.943235 -0.0809683 -0.0318399 1 0 1 1 0 0 +EDGE2 8949 8870 1.03661 0.0719343 -3.16645 1 0 1 1 0 0 +EDGE2 8949 6070 1.04505 -0.0159594 0.0106541 1 0 1 1 0 0 +EDGE2 8949 610 0.979318 0.00995184 -0.00473194 1 0 1 1 0 0 +EDGE2 8949 6030 0.932035 -0.0317437 -3.17185 1 0 1 1 0 0 +EDGE2 8950 6251 -0.0770249 0.96314 1.61703 1 0 1 1 0 0 +EDGE2 8950 6051 -0.0887751 1.00045 1.55824 1 0 1 1 0 0 +EDGE2 8950 6071 0.016833 0.950726 1.61323 1 0 1 1 0 0 +EDGE2 8950 6091 -0.018995 1.0467 1.55358 1 0 1 1 0 0 +EDGE2 8950 6031 0.023809 1.02192 1.5377 1 0 1 1 0 0 +EDGE2 8950 6089 -1.00378 -0.00961377 -0.0227752 1 0 1 1 0 0 +EDGE2 8950 8949 -0.941002 -0.0153974 -0.0374302 1 0 1 1 0 0 +EDGE2 8950 6249 -1.05133 -0.00260468 -0.00423292 1 0 1 1 0 0 +EDGE2 8950 6049 -1.01878 0.0780291 -0.029549 1 0 1 1 0 0 +EDGE2 8950 6069 -0.958069 0.0950364 -0.0223757 1 0 1 1 0 0 +EDGE2 8950 609 -0.994588 0.0259306 0.0208205 1 0 1 1 0 0 +EDGE2 8950 6050 -0.0670612 -0.00217004 0.0162753 1 0 1 1 0 0 +EDGE2 8950 6090 -0.0792154 0.00766915 -0.00939096 1 0 1 1 0 0 +EDGE2 8950 6250 0.0602804 0.0400566 -0.00956351 1 0 1 1 0 0 +EDGE2 8950 8870 -0.0107412 0.0733768 -3.12806 1 0 1 1 0 0 +EDGE2 8950 6070 0.0283361 0.0135037 0.0044129 1 0 1 1 0 0 +EDGE2 8950 8869 1.00293 -0.0888175 -3.15083 1 0 1 1 0 0 +EDGE2 8950 610 0.0618242 0.0375624 0.0377493 1 0 1 1 0 0 +EDGE2 8950 6030 0.0182725 -0.0413073 -3.15641 1 0 1 1 0 0 +EDGE2 8950 6029 1.02484 -0.0680093 -3.12558 1 0 1 1 0 0 +EDGE2 8950 611 0.0290324 -1.0291 -1.55763 1 0 1 1 0 0 +EDGE2 8950 8871 0.021185 -0.990264 -1.58809 1 0 1 1 0 0 +EDGE2 8951 6032 0.976146 -0.00991861 0.0336777 1 0 1 1 0 0 +EDGE2 8951 6252 1.02986 0.028854 0.00433981 1 0 1 1 0 0 +EDGE2 8951 6072 1.06167 0.0540585 -0.00229609 1 0 1 1 0 0 +EDGE2 8951 6092 1.01532 0.058077 0.000363286 1 0 1 1 0 0 +EDGE2 8951 6052 0.951872 -0.0321257 0.000261572 1 0 1 1 0 0 +EDGE2 8951 8950 -1.01345 0.051637 -1.57225 1 0 1 1 0 0 +EDGE2 8951 6251 0.0403756 0.0439944 -0.0298808 1 0 1 1 0 0 +EDGE2 8951 6051 0.0515467 0.00911371 0.0465763 1 0 1 1 0 0 +EDGE2 8951 6071 -0.0455795 -0.0512162 0.00751661 1 0 1 1 0 0 +EDGE2 8951 6091 0.0654944 -0.0125303 0.0181364 1 0 1 1 0 0 +EDGE2 8951 6031 -0.00767488 -0.0665828 0.0496941 1 0 1 1 0 0 +EDGE2 8951 6050 -1.05305 0.0421583 -1.56374 1 0 1 1 0 0 +EDGE2 8951 6090 -0.986977 -0.0140691 -1.55633 1 0 1 1 0 0 +EDGE2 8951 6250 -0.928187 0.0280362 -1.55082 1 0 1 1 0 0 +EDGE2 8951 8870 -1.05803 -0.00745018 1.55337 1 0 1 1 0 0 +EDGE2 8951 6070 -1.01099 -0.0174603 -1.58133 1 0 1 1 0 0 +EDGE2 8951 610 -0.954179 0.0271539 -1.5667 1 0 1 1 0 0 +EDGE2 8951 6030 -0.983808 -0.0255149 1.59618 1 0 1 1 0 0 +EDGE2 8952 6032 0.0228814 -0.0109996 -0.00807632 1 0 1 1 0 0 +EDGE2 8952 6093 0.962562 -0.0146852 0.000687847 1 0 1 1 0 0 +EDGE2 8952 6253 1.00927 -0.0276943 0.0206535 1 0 1 1 0 0 +EDGE2 8952 6252 0.00317599 0.0212897 -3.03141e-05 1 0 1 1 0 0 +EDGE2 8952 6033 1.04185 0.0639365 -0.00655131 1 0 1 1 0 0 +EDGE2 8952 6053 0.992417 -0.0379671 0.00641209 1 0 1 1 0 0 +EDGE2 8952 6073 1.0744 -0.0166277 0.00432908 1 0 1 1 0 0 +EDGE2 8952 6072 -0.0148233 -0.00124038 -0.00548684 1 0 1 1 0 0 +EDGE2 8952 6092 0.0197531 -0.0493777 0.00380797 1 0 1 1 0 0 +EDGE2 8952 6052 0.0240634 0.0287713 -0.00211724 1 0 1 1 0 0 +EDGE2 8952 6251 -1.02325 0.0723604 -0.0187438 1 0 1 1 0 0 +EDGE2 8952 8951 -1.01126 0.0899276 -0.0148681 1 0 1 1 0 0 +EDGE2 8952 6051 -0.978238 0.027678 0.00615835 1 0 1 1 0 0 +EDGE2 8952 6071 -0.922397 -0.0138495 0.00839162 1 0 1 1 0 0 +EDGE2 8952 6091 -0.972322 0.079252 0.00608109 1 0 1 1 0 0 +EDGE2 8952 6031 -1.02791 -0.0270334 -0.0155497 1 0 1 1 0 0 +EDGE2 8953 6032 -1.04449 0.0588473 -0.00907568 1 0 1 1 0 0 +EDGE2 8953 6094 0.912598 0.016816 -0.0320592 1 0 1 1 0 0 +EDGE2 8953 6254 1.00077 -0.0606489 -0.00687653 1 0 1 1 0 0 +EDGE2 8953 6093 0.0424491 -0.011143 -0.01868 1 0 1 1 0 0 +EDGE2 8953 6253 0.0560998 -0.0153259 0.00639372 1 0 1 1 0 0 +EDGE2 8953 6034 0.974139 0.0543471 -0.0104091 1 0 1 1 0 0 +EDGE2 8953 6054 0.97978 0.0439003 -0.00277605 1 0 1 1 0 0 +EDGE2 8953 6074 0.99758 -0.0600117 -0.00294841 1 0 1 1 0 0 +EDGE2 8953 6252 -1.03024 0.0395923 -0.0158659 1 0 1 1 0 0 +EDGE2 8953 6033 -0.0100606 -0.122424 -0.0186503 1 0 1 1 0 0 +EDGE2 8953 6053 0.0233078 0.0146469 0.0181302 1 0 1 1 0 0 +EDGE2 8953 6073 -0.00398614 0.0258749 -0.031996 1 0 1 1 0 0 +EDGE2 8953 8952 -1.01112 0.0287253 0.00936248 1 0 1 1 0 0 +EDGE2 8953 6072 -0.995335 -0.062396 0.0122388 1 0 1 1 0 0 +EDGE2 8953 6092 -0.991247 -0.00915944 0.0132789 1 0 1 1 0 0 +EDGE2 8953 6052 -0.95467 0.0428794 0.030868 1 0 1 1 0 0 +EDGE2 8954 6094 -0.00679751 0.0582662 0.00208052 1 0 1 1 0 0 +EDGE2 8954 6075 0.958066 0.0360821 -0.0469285 1 0 1 1 0 0 +EDGE2 8954 6255 0.93976 -0.0209498 -0.0150768 1 0 1 1 0 0 +EDGE2 8954 6095 0.961106 0.0157663 -0.00464708 1 0 1 1 0 0 +EDGE2 8954 6035 0.873103 -0.076497 -0.00264503 1 0 1 1 0 0 +EDGE2 8954 6055 0.954692 0.10067 0.0178145 1 0 1 1 0 0 +EDGE2 8954 6254 0.0674331 -0.0348109 0.00992262 1 0 1 1 0 0 +EDGE2 8954 6093 -1.02022 0.0578339 0.0146623 1 0 1 1 0 0 +EDGE2 8954 6253 -1.03238 -0.0252397 -0.0277555 1 0 1 1 0 0 +EDGE2 8954 6034 -0.0433269 -0.0816685 -0.0161771 1 0 1 1 0 0 +EDGE2 8954 6054 -0.0735326 0.0655509 0.0202039 1 0 1 1 0 0 +EDGE2 8954 6074 -0.0102611 -0.0120516 0.0112511 1 0 1 1 0 0 +EDGE2 8954 8953 -0.91012 -0.0408736 0.011877 1 0 1 1 0 0 +EDGE2 8954 6033 -0.993113 -0.00419254 -0.0246631 1 0 1 1 0 0 +EDGE2 8954 6053 -0.999034 -0.101905 -0.0482332 1 0 1 1 0 0 +EDGE2 8954 6073 -1.0437 -0.0525386 -0.00230823 1 0 1 1 0 0 +EDGE2 8955 6094 -0.973782 0.0679561 -0.0240951 1 0 1 1 0 0 +EDGE2 8955 6056 0.0398097 0.918429 1.59287 1 0 1 1 0 0 +EDGE2 8955 6096 0.0552728 1.0551 1.56491 1 0 1 1 0 0 +EDGE2 8955 6256 -0.0314784 1.08597 1.54359 1 0 1 1 0 0 +EDGE2 8955 6076 0.0823255 0.996786 1.58089 1 0 1 1 0 0 +EDGE2 8955 6075 0.0173975 0.0254279 -0.0168771 1 0 1 1 0 0 +EDGE2 8955 6255 -0.0472782 0.033145 0.0247472 1 0 1 1 0 0 +EDGE2 8955 6036 -0.0501698 1.05277 1.56193 1 0 1 1 0 0 +EDGE2 8955 6095 -0.0181408 0.0174007 0.0200312 1 0 1 1 0 0 +EDGE2 8955 8954 -0.919808 -0.000369347 -0.0367727 1 0 1 1 0 0 +EDGE2 8955 6035 -0.0451254 -0.0489023 -0.00358052 1 0 1 1 0 0 +EDGE2 8955 6055 -0.0112218 -0.0644217 0.00715736 1 0 1 1 0 0 +EDGE2 8955 6254 -0.960497 0.010385 -0.0211225 1 0 1 1 0 0 +EDGE2 8955 6034 -1.00774 0.10017 -0.0146731 1 0 1 1 0 0 +EDGE2 8955 6054 -0.99438 0.0686503 -0.0226759 1 0 1 1 0 0 +EDGE2 8955 6074 -1.04165 -0.0361591 0.0119847 1 0 1 1 0 0 +EDGE2 8956 6056 -0.0509442 0.0162614 -0.0372776 1 0 1 1 0 0 +EDGE2 8956 6037 0.948649 0.00793995 0.0204295 1 0 1 1 0 0 +EDGE2 8956 6077 1.00464 0.022524 -0.0456276 1 0 1 1 0 0 +EDGE2 8956 6097 1.0062 -0.0297221 -0.0098581 1 0 1 1 0 0 +EDGE2 8956 6257 1.03614 -0.0183236 0.00210467 1 0 1 1 0 0 +EDGE2 8956 6057 0.95917 -0.0734065 -0.023522 1 0 1 1 0 0 +EDGE2 8956 6096 -0.0693216 -0.0135159 0.0142689 1 0 1 1 0 0 +EDGE2 8956 6256 0.00439266 -0.0230227 0.00217557 1 0 1 1 0 0 +EDGE2 8956 6076 0.00546042 0.0569537 0.0207915 1 0 1 1 0 0 +EDGE2 8956 6075 -1.05155 -0.0672301 -1.58577 1 0 1 1 0 0 +EDGE2 8956 6255 -1.02713 -0.0455442 -1.59703 1 0 1 1 0 0 +EDGE2 8956 8955 -1.04971 -0.097272 -1.56665 1 0 1 1 0 0 +EDGE2 8956 6036 0.0893066 -0.018437 0.0187522 1 0 1 1 0 0 +EDGE2 8956 6095 -1.0257 0.0387064 -1.5459 1 0 1 1 0 0 +EDGE2 8956 6035 -1.01516 -0.0608009 -1.57882 1 0 1 1 0 0 +EDGE2 8956 6055 -0.960636 0.0277114 -1.56585 1 0 1 1 0 0 +EDGE2 8957 6078 0.958695 -0.1197 0.0190041 1 0 1 1 0 0 +EDGE2 8957 6258 1.00878 0.0598244 0.0347701 1 0 1 1 0 0 +EDGE2 8957 6098 1.09007 0.0301377 0.023301 1 0 1 1 0 0 +EDGE2 8957 6058 1.00983 0.0538296 0.00546089 1 0 1 1 0 0 +EDGE2 8957 6038 0.944321 -0.00121651 0.0180059 1 0 1 1 0 0 +EDGE2 8957 6056 -1.03704 0.0248212 0.0207626 1 0 1 1 0 0 +EDGE2 8957 6037 -0.00708898 0.0529176 -0.00432702 1 0 1 1 0 0 +EDGE2 8957 6077 0.0681759 0.0375526 -0.0174154 1 0 1 1 0 0 +EDGE2 8957 6097 -0.00431406 0.00254906 0.0202688 1 0 1 1 0 0 +EDGE2 8957 6257 0.0236198 0.0566442 0.036319 1 0 1 1 0 0 +EDGE2 8957 6057 0.015537 0.0503735 0.00115872 1 0 1 1 0 0 +EDGE2 8957 6096 -1.03096 0.00323549 -0.00604476 1 0 1 1 0 0 +EDGE2 8957 6256 -1.03676 0.108158 0.00934004 1 0 1 1 0 0 +EDGE2 8957 8956 -0.977284 0.027473 -0.0150695 1 0 1 1 0 0 +EDGE2 8957 6076 -0.977 0.0402676 0.00965991 1 0 1 1 0 0 +EDGE2 8957 6036 -1.10004 -0.0693579 -0.00571936 1 0 1 1 0 0 +EDGE2 8958 8957 -0.915919 -0.0470013 0.00786651 1 0 1 1 0 0 +EDGE2 8958 6078 -0.0358764 0.0290601 0.00667111 1 0 1 1 0 0 +EDGE2 8958 6059 1.01043 0.0589037 0.0430723 1 0 1 1 0 0 +EDGE2 8958 6099 0.968817 0.00897962 0.0143816 1 0 1 1 0 0 +EDGE2 8958 6259 1.02208 -0.0243426 0.0113009 1 0 1 1 0 0 +EDGE2 8958 6079 0.93641 -0.0646443 0.0128672 1 0 1 1 0 0 +EDGE2 8958 6258 0.00929575 -0.0588373 0.00714427 1 0 1 1 0 0 +EDGE2 8958 6039 1.01233 0.00943129 -0.0300298 1 0 1 1 0 0 +EDGE2 8958 6098 0.0220965 -0.021737 -0.01908 1 0 1 1 0 0 +EDGE2 8958 6058 -0.0149786 -0.038739 0.0101223 1 0 1 1 0 0 +EDGE2 8958 6038 -0.0280385 -0.0914307 0.0301665 1 0 1 1 0 0 +EDGE2 8958 6037 -1.08261 -0.0694746 0.0250199 1 0 1 1 0 0 +EDGE2 8958 6077 -0.91942 -0.0197731 -0.0267363 1 0 1 1 0 0 +EDGE2 8958 6097 -0.940455 -0.0624655 -0.0242078 1 0 1 1 0 0 +EDGE2 8958 6257 -1.00686 -0.0500379 0.0270715 1 0 1 1 0 0 +EDGE2 8958 6057 -0.955565 0.0281104 -0.0217654 1 0 1 1 0 0 +EDGE2 8959 6100 1.02041 0.0166076 0.0162858 1 0 1 1 0 0 +EDGE2 8959 6220 0.94568 0.0718679 -3.15426 1 0 1 1 0 0 +EDGE2 8959 6260 1.11046 -0.0155843 0.0107925 1 0 1 1 0 0 +EDGE2 8959 6200 0.949446 -0.0232991 -3.15757 1 0 1 1 0 0 +EDGE2 8959 6040 0.993981 -0.0191418 -0.01822 1 0 1 1 0 0 +EDGE2 8959 6060 1.01567 0.0113538 0.00367977 1 0 1 1 0 0 +EDGE2 8959 6080 1.05553 -0.126233 -0.0422527 1 0 1 1 0 0 +EDGE2 8959 6078 -1.0008 -0.0197693 0.0251848 1 0 1 1 0 0 +EDGE2 8959 6059 0.013029 -0.0172917 0.0200282 1 0 1 1 0 0 +EDGE2 8959 6099 -0.0546491 0.0120604 -0.0207868 1 0 1 1 0 0 +EDGE2 8959 6259 0.0320443 0.0511811 0.0313782 1 0 1 1 0 0 +EDGE2 8959 6079 0.0347639 -0.046449 -0.00185055 1 0 1 1 0 0 +EDGE2 8959 6258 -0.990388 0.010755 0.0145635 1 0 1 1 0 0 +EDGE2 8959 8958 -1.01564 -0.018666 0.00371418 1 0 1 1 0 0 +EDGE2 8959 6039 0.0177404 0.0841086 -0.0417399 1 0 1 1 0 0 +EDGE2 8959 6098 -0.984241 0.0391512 -0.00887217 1 0 1 1 0 0 +EDGE2 8959 6058 -0.978832 0.0400442 0.0142735 1 0 1 1 0 0 +EDGE2 8959 6038 -1.14432 0.0765999 -0.0243461 1 0 1 1 0 0 +EDGE2 8960 6101 0.0226711 -0.948185 -1.57318 1 0 1 1 0 0 +EDGE2 8960 6199 0.950292 0.0598262 -3.1303 1 0 1 1 0 0 +EDGE2 8960 6219 0.964448 0.0355389 -3.17719 1 0 1 1 0 0 +EDGE2 8960 6201 0.09295 -0.998431 -1.54716 1 0 1 1 0 0 +EDGE2 8960 6261 -0.000231991 0.966409 1.56075 1 0 1 1 0 0 +EDGE2 8960 6100 -0.0355768 0.047922 0.0183336 1 0 1 1 0 0 +EDGE2 8960 6220 0.00948125 0.032732 -3.16212 1 0 1 1 0 0 +EDGE2 8960 6260 -0.0130383 -0.00560244 0.00233575 1 0 1 1 0 0 +EDGE2 8960 6200 -0.0825753 -0.0278132 -3.12179 1 0 1 1 0 0 +EDGE2 8960 6040 -0.0165188 0.030386 0.00782505 1 0 1 1 0 0 +EDGE2 8960 6060 0.0252501 0.0479341 0.0194406 1 0 1 1 0 0 +EDGE2 8960 6080 -0.0792434 -0.0799838 0.00710314 1 0 1 1 0 0 +EDGE2 8960 6061 -0.0533039 1.00576 1.555 1 0 1 1 0 0 +EDGE2 8960 6081 0.0224955 0.992182 1.56884 1 0 1 1 0 0 +EDGE2 8960 6221 -0.0315448 0.977165 1.58311 1 0 1 1 0 0 +EDGE2 8960 6041 0.0639997 0.976621 1.56035 1 0 1 1 0 0 +EDGE2 8960 6059 -0.969626 0.0296256 -0.0337928 1 0 1 1 0 0 +EDGE2 8960 6099 -0.942273 -0.00619382 0.0226894 1 0 1 1 0 0 +EDGE2 8960 6259 -1.02444 0.0138199 0.0295862 1 0 1 1 0 0 +EDGE2 8960 8959 -0.965912 -0.00276171 -0.0338966 1 0 1 1 0 0 +EDGE2 8960 6079 -1.04145 -0.018392 -0.0281499 1 0 1 1 0 0 +EDGE2 8960 6039 -0.985715 -0.017799 -0.0141892 1 0 1 1 0 0 +EDGE2 8961 6042 0.969433 -0.0739184 -0.0107976 1 0 1 1 0 0 +EDGE2 8961 6261 -0.0454599 -0.016671 -0.00950161 1 0 1 1 0 0 +EDGE2 8961 6100 -0.999882 -0.0750078 -1.54874 1 0 1 1 0 0 +EDGE2 8961 6220 -1.02939 -0.112656 1.54254 1 0 1 1 0 0 +EDGE2 8961 6260 -1.01581 -0.00280097 -1.56393 1 0 1 1 0 0 +EDGE2 8961 8960 -1.05656 0.0484386 -1.54015 1 0 1 1 0 0 +EDGE2 8961 6200 -0.99512 -0.0196346 1.56238 1 0 1 1 0 0 +EDGE2 8961 6040 -0.99232 -0.0173998 -1.57643 1 0 1 1 0 0 +EDGE2 8961 6060 -1.03277 0.000713709 -1.55258 1 0 1 1 0 0 +EDGE2 8961 6080 -0.932683 -0.032906 -1.58239 1 0 1 1 0 0 +EDGE2 8961 6061 -0.060704 0.069351 0.00800104 1 0 1 1 0 0 +EDGE2 8961 6081 0.0348163 -0.0707002 0.0138872 1 0 1 1 0 0 +EDGE2 8961 6221 0.037746 -0.0525678 -0.0299563 1 0 1 1 0 0 +EDGE2 8961 6041 -0.0291302 -0.0439324 0.0193923 1 0 1 1 0 0 +EDGE2 8961 6082 1.02383 -0.0374384 -0.0183861 1 0 1 1 0 0 +EDGE2 8961 6222 0.975872 0.000864184 -0.0565484 1 0 1 1 0 0 +EDGE2 8961 6262 0.996184 -0.0746352 -0.0153011 1 0 1 1 0 0 +EDGE2 8961 6062 0.985858 -0.0203465 0.00850661 1 0 1 1 0 0 +EDGE2 8962 6042 -0.0189787 0.0519001 0.0406136 1 0 1 1 0 0 +EDGE2 8962 6261 -1.15755 -0.0696211 0.0267406 1 0 1 1 0 0 +EDGE2 8962 8961 -1.02318 -0.0205912 -0.000991937 1 0 1 1 0 0 +EDGE2 8962 6061 -0.990107 0.0387082 -0.029042 1 0 1 1 0 0 +EDGE2 8962 6081 -1.02988 -0.0682257 -0.016253 1 0 1 1 0 0 +EDGE2 8962 6221 -0.977344 -0.00916884 0.000852269 1 0 1 1 0 0 +EDGE2 8962 6041 -0.987207 0.0277359 -0.0100087 1 0 1 1 0 0 +EDGE2 8962 6082 -0.0952519 0.0158914 0.0276624 1 0 1 1 0 0 +EDGE2 8962 6222 0.00470281 -0.00621851 -0.019331 1 0 1 1 0 0 +EDGE2 8962 6262 0.070442 0.00747588 -0.00771662 1 0 1 1 0 0 +EDGE2 8962 6062 0.0290738 -0.0448667 -0.00807864 1 0 1 1 0 0 +EDGE2 8962 6063 1.07948 0.142132 0.0300174 1 0 1 1 0 0 +EDGE2 8962 6223 1.0504 -0.0138151 -0.0307972 1 0 1 1 0 0 +EDGE2 8962 6263 0.997588 0.0692003 -0.00138568 1 0 1 1 0 0 +EDGE2 8962 6083 0.946715 0.0135494 -0.00542219 1 0 1 1 0 0 +EDGE2 8962 6043 1.03161 0.0577539 -0.0136561 1 0 1 1 0 0 +EDGE2 8963 6042 -1.05277 -0.0195927 -0.0219065 1 0 1 1 0 0 +EDGE2 8963 8962 -0.911096 0.0255517 0.0105473 1 0 1 1 0 0 +EDGE2 8963 6082 -0.958433 -0.0152251 0.0190058 1 0 1 1 0 0 +EDGE2 8963 6222 -0.984606 -0.00457436 -0.0129318 1 0 1 1 0 0 +EDGE2 8963 6262 -0.919649 -0.0171975 -0.00448767 1 0 1 1 0 0 +EDGE2 8963 6062 -0.934176 0.0452855 -0.0281098 1 0 1 1 0 0 +EDGE2 8963 6063 0.0529395 0.0367915 0.00504897 1 0 1 1 0 0 +EDGE2 8963 6223 -0.104366 0.00668236 -0.0123874 1 0 1 1 0 0 +EDGE2 8963 6263 0.0625113 -0.0798308 0.0164898 1 0 1 1 0 0 +EDGE2 8963 6083 -0.0504742 0.0633349 0.0226545 1 0 1 1 0 0 +EDGE2 8963 6043 0.0432568 -0.00579065 -0.0191984 1 0 1 1 0 0 +EDGE2 8963 6044 0.970399 -0.095089 -0.0115844 1 0 1 1 0 0 +EDGE2 8963 6084 1.00818 0.0256136 -0.0115348 1 0 1 1 0 0 +EDGE2 8963 6224 0.979905 -0.0570609 0.0255775 1 0 1 1 0 0 +EDGE2 8963 6264 1.08861 0.0449114 0.0231021 1 0 1 1 0 0 +EDGE2 8963 6064 0.98872 -0.017844 -0.0348278 1 0 1 1 0 0 +EDGE2 8964 6063 -0.93107 -0.0463223 -0.0108068 1 0 1 1 0 0 +EDGE2 8964 6223 -0.982202 -0.0217207 0.0174507 1 0 1 1 0 0 +EDGE2 8964 6263 -0.928469 -0.0126232 -0.032087 1 0 1 1 0 0 +EDGE2 8964 8963 -1.03171 -0.046253 -0.0146013 1 0 1 1 0 0 +EDGE2 8964 6083 -0.980581 0.0411601 -0.0199084 1 0 1 1 0 0 +EDGE2 8964 6043 -1.04254 0.0326246 -0.0124419 1 0 1 1 0 0 +EDGE2 8964 6044 -0.00703111 0.0650887 0.0457169 1 0 1 1 0 0 +EDGE2 8964 6084 0.116225 -0.0326238 -0.0342271 1 0 1 1 0 0 +EDGE2 8964 6224 0.00530982 -0.0245979 -0.000600631 1 0 1 1 0 0 +EDGE2 8964 6264 -0.198932 0.035849 0.00501696 1 0 1 1 0 0 +EDGE2 8964 6064 -0.0219319 0.00492938 -0.0155722 1 0 1 1 0 0 +EDGE2 8964 6225 0.959407 0.0190735 0.00502082 1 0 1 1 0 0 +EDGE2 8964 6265 1.07004 -0.00338564 -0.0111345 1 0 1 1 0 0 +EDGE2 8964 8945 0.982434 0.0583308 -3.14854 1 0 1 1 0 0 +EDGE2 8964 6245 0.969251 0.0557997 -3.08002 1 0 1 1 0 0 +EDGE2 8964 6045 0.960041 -0.0346111 0.000860459 1 0 1 1 0 0 +EDGE2 8964 6065 0.962063 0.00542332 -0.00634457 1 0 1 1 0 0 +EDGE2 8964 6085 0.945989 0.0152721 -0.00661305 1 0 1 1 0 0 +EDGE2 8964 605 0.957413 0.033293 -3.16655 1 0 1 1 0 0 +EDGE2 8965 6044 -0.997574 0.0892799 0.0187339 1 0 1 1 0 0 +EDGE2 8965 8964 -0.96496 0.0321768 0.026778 1 0 1 1 0 0 +EDGE2 8965 6084 -1.08448 -0.0406051 -0.0102538 1 0 1 1 0 0 +EDGE2 8965 6224 -1.01835 0.0591054 -0.0072314 1 0 1 1 0 0 +EDGE2 8965 6264 -0.947595 -0.0500462 -0.0131168 1 0 1 1 0 0 +EDGE2 8965 6064 -0.981326 -0.0497987 -0.0447954 1 0 1 1 0 0 +EDGE2 8965 6266 0.0326996 -1.08702 -1.53396 1 0 1 1 0 0 +EDGE2 8965 6226 -0.0746482 -1.02539 -1.55677 1 0 1 1 0 0 +EDGE2 8965 8944 1.08781 0.0303371 -3.14225 1 0 1 1 0 0 +EDGE2 8965 6225 -0.0463255 0.0702551 0.0269722 1 0 1 1 0 0 +EDGE2 8965 6265 -0.0693752 -0.0444994 0.00662317 1 0 1 1 0 0 +EDGE2 8965 8945 -0.0494657 -0.0309039 -3.16019 1 0 1 1 0 0 +EDGE2 8965 6245 -0.0634653 -0.0194086 -3.13551 1 0 1 1 0 0 +EDGE2 8965 6045 -0.0442752 0.0699613 0.0100174 1 0 1 1 0 0 +EDGE2 8965 6065 0.0821632 -0.0600417 0.0109082 1 0 1 1 0 0 +EDGE2 8965 6085 -0.0132971 -0.0635026 -0.00800486 1 0 1 1 0 0 +EDGE2 8965 605 -0.00264316 0.081237 -3.11639 1 0 1 1 0 0 +EDGE2 8965 604 1.03299 0.0318923 -3.13376 1 0 1 1 0 0 +EDGE2 8965 6244 0.980514 0.0198365 -3.12269 1 0 1 1 0 0 +EDGE2 8965 6046 0.0218677 1.04623 1.56357 1 0 1 1 0 0 +EDGE2 8965 6086 0.00150013 1.03624 1.55286 1 0 1 1 0 0 +EDGE2 8965 6246 -0.0828861 1.0218 1.54359 1 0 1 1 0 0 +EDGE2 8965 8946 -0.0806343 1.08505 1.56818 1 0 1 1 0 0 +EDGE2 8965 6066 -0.0344678 0.959443 1.58026 1 0 1 1 0 0 +EDGE2 8965 606 0.00276044 1.0365 1.566 1 0 1 1 0 0 +EDGE2 8966 6267 1.00119 -0.0348948 0.0112328 1 0 1 1 0 0 +EDGE2 8966 6266 -0.00541254 -0.0418968 0.00510777 1 0 1 1 0 0 +EDGE2 8966 6227 1.01959 -0.0169571 0.00416545 1 0 1 1 0 0 +EDGE2 8966 6226 0.00220809 0.0258745 0.00405597 1 0 1 1 0 0 +EDGE2 8966 6225 -1.00161 0.0651155 1.54357 1 0 1 1 0 0 +EDGE2 8966 6265 -1.04098 0.00216337 1.57242 1 0 1 1 0 0 +EDGE2 8966 8945 -1.06535 -0.0808982 -1.56713 1 0 1 1 0 0 +EDGE2 8966 8965 -1.09575 -0.00319614 1.58409 1 0 1 1 0 0 +EDGE2 8966 6245 -1.02952 0.0353446 -1.57601 1 0 1 1 0 0 +EDGE2 8966 6045 -0.99437 0.00593085 1.59059 1 0 1 1 0 0 +EDGE2 8966 6065 -0.933845 -0.121518 1.53965 1 0 1 1 0 0 +EDGE2 8966 6085 -1.04404 -0.00273184 1.56747 1 0 1 1 0 0 +EDGE2 8966 605 -1.05411 0.00770263 -1.56252 1 0 1 1 0 0 +EDGE2 8967 6268 1.05402 -0.0100966 0.00492586 1 0 1 1 0 0 +EDGE2 8967 6267 0.0552975 -0.00415551 -0.00977802 1 0 1 1 0 0 +EDGE2 8967 6228 1.08274 0.0613305 0.0107063 1 0 1 1 0 0 +EDGE2 8967 6266 -0.906333 -0.00262572 0.0292365 1 0 1 1 0 0 +EDGE2 8967 8966 -1.04343 0.0103296 0.0116991 1 0 1 1 0 0 +EDGE2 8967 6227 0.0492554 -0.0452385 0.010418 1 0 1 1 0 0 +EDGE2 8967 6226 -1.02814 0.135673 0.0124474 1 0 1 1 0 0 +EDGE2 8968 6268 -0.046993 0.0108672 0.00281304 1 0 1 1 0 0 +EDGE2 8968 6229 1.04612 0.0312991 0.0601583 1 0 1 1 0 0 +EDGE2 8968 6269 0.938683 0.0411929 -0.00423995 1 0 1 1 0 0 +EDGE2 8968 6267 -1.01281 0.0271513 0.0228971 1 0 1 1 0 0 +EDGE2 8968 6228 -0.0114288 -0.0250306 0.0291987 1 0 1 1 0 0 +EDGE2 8968 8967 -0.999802 0.0118298 0.0348535 1 0 1 1 0 0 +EDGE2 8968 6227 -0.958719 -0.0504706 0.01906 1 0 1 1 0 0 +EDGE2 8969 6230 0.999668 -0.0740294 -0.0211325 1 0 1 1 0 0 +EDGE2 8969 6270 1.03371 0.0278846 -0.0382708 1 0 1 1 0 0 +EDGE2 8969 590 1.03509 -0.0169945 -3.11296 1 0 1 1 0 0 +EDGE2 8969 6268 -0.985162 -0.0309143 0.0247582 1 0 1 1 0 0 +EDGE2 8969 6229 0.0515066 0.00368088 -0.0232057 1 0 1 1 0 0 +EDGE2 8969 6269 -0.103796 -0.0463118 0.0203734 1 0 1 1 0 0 +EDGE2 8969 8968 -1.02021 0.00433054 -0.0123723 1 0 1 1 0 0 +EDGE2 8969 6228 -0.875636 0.0276449 0.00431117 1 0 1 1 0 0 +EDGE2 8970 591 -0.0669284 0.984891 1.57029 1 0 1 1 0 0 +EDGE2 8970 6230 0.0286631 0.000754022 0.000546151 1 0 1 1 0 0 +EDGE2 8970 589 1.05032 -0.030882 -3.16028 1 0 1 1 0 0 +EDGE2 8970 6270 -0.10052 0.0803865 -0.0162914 1 0 1 1 0 0 +EDGE2 8970 6231 -0.00656857 0.932743 1.56265 1 0 1 1 0 0 +EDGE2 8970 6271 0.0117102 1.03737 1.55111 1 0 1 1 0 0 +EDGE2 8970 590 0.0331427 0.0186005 -3.14983 1 0 1 1 0 0 +EDGE2 8970 6229 -1.01711 -0.050244 -0.0149638 1 0 1 1 0 0 +EDGE2 8970 6269 -0.990068 -0.0370312 -0.00522256 1 0 1 1 0 0 +EDGE2 8970 8969 -1.03353 -0.105412 -0.0244086 1 0 1 1 0 0 +EDGE2 8971 592 1.02663 0.0533494 0.0159702 1 0 1 1 0 0 +EDGE2 8971 591 0.119696 0.0236179 0.00150436 1 0 1 1 0 0 +EDGE2 8971 6230 -0.924769 0.0114153 -1.5797 1 0 1 1 0 0 +EDGE2 8971 8970 -1.02296 0.0500767 -1.56878 1 0 1 1 0 0 +EDGE2 8971 6270 -0.968612 0.0562112 -1.59056 1 0 1 1 0 0 +EDGE2 8971 6231 -0.0643489 -0.0110729 0.0393497 1 0 1 1 0 0 +EDGE2 8971 6271 -0.0195577 0.0308357 -0.0642089 1 0 1 1 0 0 +EDGE2 8971 590 -1.08983 -0.0944651 1.59946 1 0 1 1 0 0 +EDGE2 8971 6232 0.994978 0.08738 0.0268427 1 0 1 1 0 0 +EDGE2 8971 6272 1.04627 -0.0897095 -0.00851607 1 0 1 1 0 0 +EDGE2 8972 592 0.0224971 0.0528192 0.00697977 1 0 1 1 0 0 +EDGE2 8972 591 -0.977166 -0.0232674 -0.0104667 1 0 1 1 0 0 +EDGE2 8972 6231 -0.935231 -0.0252172 0.013796 1 0 1 1 0 0 +EDGE2 8972 6271 -1.08244 0.00483875 -0.0115897 1 0 1 1 0 0 +EDGE2 8972 8971 -1.06424 -0.0815266 -0.0259834 1 0 1 1 0 0 +EDGE2 8972 6273 0.899719 0.00744047 0.0169008 1 0 1 1 0 0 +EDGE2 8972 6232 -0.00615612 -0.0102417 -0.0165424 1 0 1 1 0 0 +EDGE2 8972 6272 0.0215996 -0.00331185 -0.0132959 1 0 1 1 0 0 +EDGE2 8972 6233 1.02433 -0.0315189 -0.00905593 1 0 1 1 0 0 +EDGE2 8972 593 1.06555 0.00325254 0.0203474 1 0 1 1 0 0 +EDGE2 8973 592 -1.01723 0.0418822 -0.029749 1 0 1 1 0 0 +EDGE2 8973 6273 -0.0764181 -0.00891052 -0.00246146 1 0 1 1 0 0 +EDGE2 8973 6232 -0.943308 -0.0333192 0.0151704 1 0 1 1 0 0 +EDGE2 8973 6272 -1.04233 -0.0650142 0.0175277 1 0 1 1 0 0 +EDGE2 8973 8972 -1.00453 0.04127 0.0248356 1 0 1 1 0 0 +EDGE2 8973 6274 1.01999 -0.0227083 -0.0417385 1 0 1 1 0 0 +EDGE2 8973 6233 0.00612671 0.0483229 0.0306042 1 0 1 1 0 0 +EDGE2 8973 6234 1.03719 -0.0190664 0.0241535 1 0 1 1 0 0 +EDGE2 8973 594 1.05919 -0.0299377 0.0357438 1 0 1 1 0 0 +EDGE2 8973 593 0.0142004 -0.0213322 0.0414964 1 0 1 1 0 0 +EDGE2 8974 6273 -1.00361 -0.0578319 0.00854992 1 0 1 1 0 0 +EDGE2 8974 8973 -1.02706 0.029833 -0.0211608 1 0 1 1 0 0 +EDGE2 8974 6274 0.0316141 -0.0686636 -3.9855e-07 1 0 1 1 0 0 +EDGE2 8974 6233 -1.04588 0.00767111 0.0184996 1 0 1 1 0 0 +EDGE2 8974 6234 -0.0834578 -0.0429018 0.0193322 1 0 1 1 0 0 +EDGE2 8974 594 -0.0224544 0.0494867 -0.0265955 1 0 1 1 0 0 +EDGE2 8974 593 -0.948892 -0.0344301 0.0242524 1 0 1 1 0 0 +EDGE2 8974 6315 0.935806 0.0315023 -3.11079 1 0 1 1 0 0 +EDGE2 8974 6235 1.03726 -0.0318082 0.00460862 1 0 1 1 0 0 +EDGE2 8974 6275 0.984346 0.0128828 0.00625362 1 0 1 1 0 0 +EDGE2 8974 595 1.01769 -0.0743957 0.0129909 1 0 1 1 0 0 +EDGE2 8975 6274 -0.95781 -0.0739552 -0.0193438 1 0 1 1 0 0 +EDGE2 8975 8974 -1.09338 -0.070909 -0.0161129 1 0 1 1 0 0 +EDGE2 8975 6234 -0.941365 -0.0116949 -0.0291419 1 0 1 1 0 0 +EDGE2 8975 594 -1.06256 0.06167 0.016726 1 0 1 1 0 0 +EDGE2 8975 6316 -0.0563545 -0.974238 -1.54042 1 0 1 1 0 0 +EDGE2 8975 6276 -0.000326516 -0.964913 -1.55705 1 0 1 1 0 0 +EDGE2 8975 596 0.00188954 0.961559 1.54892 1 0 1 1 0 0 +EDGE2 8975 6314 0.956092 -0.0285627 -3.14024 1 0 1 1 0 0 +EDGE2 8975 6315 0.00907147 0.0729677 -3.16228 1 0 1 1 0 0 +EDGE2 8975 6235 0.00853209 -0.0259021 0.0208538 1 0 1 1 0 0 +EDGE2 8975 6275 0.0158359 0.0409839 -0.0279784 1 0 1 1 0 0 +EDGE2 8975 595 0.0538444 0.0768153 0.0261829 1 0 1 1 0 0 +EDGE2 8975 6236 0.0659195 0.985141 1.60029 1 0 1 1 0 0 +EDGE2 8976 8975 -0.901923 0.0414171 1.57905 1 0 1 1 0 0 +EDGE2 8976 6316 0.063444 0.0266826 -0.00709571 1 0 1 1 0 0 +EDGE2 8976 6317 1.02538 -0.0229276 0.00409647 1 0 1 1 0 0 +EDGE2 8976 6277 0.952382 0.00273741 0.0217118 1 0 1 1 0 0 +EDGE2 8976 6276 -0.0443875 0.0672991 -0.00863339 1 0 1 1 0 0 +EDGE2 8976 6315 -0.977308 -0.0181241 -1.58117 1 0 1 1 0 0 +EDGE2 8976 6235 -0.9962 0.0119214 1.57672 1 0 1 1 0 0 +EDGE2 8976 6275 -0.989996 -0.0169604 1.59481 1 0 1 1 0 0 +EDGE2 8976 595 -0.922396 0.0401036 1.56885 1 0 1 1 0 0 +EDGE2 8977 6316 -0.967778 -0.0208307 -0.011391 1 0 1 1 0 0 +EDGE2 8977 6278 0.998529 -0.0201707 0.00458142 1 0 1 1 0 0 +EDGE2 8977 6318 1.03974 0.0620749 -0.00248354 1 0 1 1 0 0 +EDGE2 8977 8976 -0.939063 -0.0258127 -0.022406 1 0 1 1 0 0 +EDGE2 8977 6317 -0.0187229 0.0143249 0.00589132 1 0 1 1 0 0 +EDGE2 8977 6277 0.0849283 0.0695145 0.0325149 1 0 1 1 0 0 +EDGE2 8977 6276 -1.02579 0.0249148 -0.00758853 1 0 1 1 0 0 +EDGE2 8978 6279 1.00165 -0.0116567 -0.0192383 1 0 1 1 0 0 +EDGE2 8978 8977 -1.00969 -0.054487 0.00175148 1 0 1 1 0 0 +EDGE2 8978 6278 -0.0429395 -0.0874533 -0.00651069 1 0 1 1 0 0 +EDGE2 8978 6319 0.979944 0.0266244 -0.0249866 1 0 1 1 0 0 +EDGE2 8978 6318 0.0874528 -0.0406851 -0.00474188 1 0 1 1 0 0 +EDGE2 8978 6317 -1.05099 -0.0320357 0.014654 1 0 1 1 0 0 +EDGE2 8978 6277 -1.02783 -0.0834704 -0.0293771 1 0 1 1 0 0 +EDGE2 8979 6279 0.0299965 0.0514588 -0.0141138 1 0 1 1 0 0 +EDGE2 8979 6300 1.00912 0.041721 -3.1601 1 0 1 1 0 0 +EDGE2 8979 6280 0.956675 0.088588 -0.00482048 1 0 1 1 0 0 +EDGE2 8979 6320 1.07841 -0.00510319 0.00256908 1 0 1 1 0 0 +EDGE2 8979 6278 -1.00196 -0.0641012 0.01483 1 0 1 1 0 0 +EDGE2 8979 8978 -0.950632 0.0237131 0.00795033 1 0 1 1 0 0 +EDGE2 8979 6319 -0.0235252 -0.0396067 0.00288571 1 0 1 1 0 0 +EDGE2 8979 6318 -1.02509 -0.00903484 -0.00646025 1 0 1 1 0 0 +EDGE2 8980 6299 1.01254 0.0841873 -3.12721 1 0 1 1 0 0 +EDGE2 8980 6281 -0.0271319 -1.13181 -1.60146 1 0 1 1 0 0 +EDGE2 8980 6321 0.0549912 -1.10647 -1.56939 1 0 1 1 0 0 +EDGE2 8980 6279 -1.05625 0.000371497 0.00153191 1 0 1 1 0 0 +EDGE2 8980 6300 -0.0302967 -0.0207838 -3.13896 1 0 1 1 0 0 +EDGE2 8980 6280 0.0604948 0.0265463 -0.0132948 1 0 1 1 0 0 +EDGE2 8980 6320 -0.00452004 -0.0217425 0.011131 1 0 1 1 0 0 +EDGE2 8980 6301 0.0671474 1.00594 1.54264 1 0 1 1 0 0 +EDGE2 8980 8979 -1.0859 0.115897 0.0140778 1 0 1 1 0 0 +EDGE2 8980 6319 -1.07159 -0.0203226 0.00359219 1 0 1 1 0 0 +EDGE2 8981 6300 -1.02156 -0.00551191 1.55337 1 0 1 1 0 0 +EDGE2 8981 8980 -1.0025 0.00988433 -1.61812 1 0 1 1 0 0 +EDGE2 8981 6280 -0.98127 0.0959942 -1.56488 1 0 1 1 0 0 +EDGE2 8981 6320 -0.989761 -0.0310611 -1.56666 1 0 1 1 0 0 +EDGE2 8981 6302 0.921838 -0.000902391 0.0195301 1 0 1 1 0 0 +EDGE2 8981 6301 0.0148925 -0.112601 0.025943 1 0 1 1 0 0 +EDGE2 8982 8981 -1.01575 -0.0156551 -0.0217918 1 0 1 1 0 0 +EDGE2 8982 6302 0.0086533 -0.162807 0.00585314 1 0 1 1 0 0 +EDGE2 8982 6301 -0.985779 0.0796664 0.0054602 1 0 1 1 0 0 +EDGE2 8982 6303 1.03074 0.0765913 0.000674592 1 0 1 1 0 0 +EDGE2 8983 8982 -1.06462 0.0143619 -0.0331612 1 0 1 1 0 0 +EDGE2 8983 6302 -0.925016 0.0365318 -0.021638 1 0 1 1 0 0 +EDGE2 8983 6304 0.984802 0.0282225 0.0122503 1 0 1 1 0 0 +EDGE2 8983 6303 -0.00280514 0.0647876 -0.0232428 1 0 1 1 0 0 +EDGE2 8984 8983 -0.961227 -0.0220982 -0.00307038 1 0 1 1 0 0 +EDGE2 8984 6505 1.03571 -0.00286283 -3.14337 1 0 1 1 0 0 +EDGE2 8984 6485 0.942857 -0.0136021 -3.13982 1 0 1 1 0 0 +EDGE2 8984 6304 -0.0939699 -0.00179012 0.00841276 1 0 1 1 0 0 +EDGE2 8984 6303 -1.00853 -0.0177567 -0.00697244 1 0 1 1 0 0 +EDGE2 8984 6305 0.991554 0.0915716 -0.00822946 1 0 1 1 0 0 +EDGE2 8985 8984 -0.959279 -0.0017703 0.00137714 1 0 1 1 0 0 +EDGE2 8985 6505 -0.0204644 -0.0325608 -3.13141 1 0 1 1 0 0 +EDGE2 8985 6486 -0.0630853 -1.01227 -1.54921 1 0 1 1 0 0 +EDGE2 8985 6506 -0.0290076 -0.977685 -1.54649 1 0 1 1 0 0 +EDGE2 8985 6485 0.00532751 0.0118187 -3.15098 1 0 1 1 0 0 +EDGE2 8985 6304 -0.972411 -0.00244988 -0.00351946 1 0 1 1 0 0 +EDGE2 8985 6305 -0.014183 -0.049375 0.00713024 1 0 1 1 0 0 +EDGE2 8985 6306 0.0615944 0.968753 1.55329 1 0 1 1 0 0 +EDGE2 8985 6484 0.969707 -0.000190624 -3.13878 1 0 1 1 0 0 +EDGE2 8985 6504 0.963863 -0.0326227 -3.15657 1 0 1 1 0 0 +EDGE2 8986 6505 -1.0043 -0.0228065 1.57934 1 0 1 1 0 0 +EDGE2 8986 6485 -0.919405 -0.0791168 1.58333 1 0 1 1 0 0 +EDGE2 8986 8985 -1.00631 -0.0893891 -1.59956 1 0 1 1 0 0 +EDGE2 8986 6305 -0.977639 0.0121242 -1.60723 1 0 1 1 0 0 +EDGE2 8986 6306 -0.100674 0.0321543 -0.012205 1 0 1 1 0 0 +EDGE2 8986 6307 1.05127 0.0164717 -0.0225122 1 0 1 1 0 0 +EDGE2 8987 6306 -0.945636 -0.0208559 -0.00439268 1 0 1 1 0 0 +EDGE2 8987 8986 -1.03704 0.0826675 0.0198677 1 0 1 1 0 0 +EDGE2 8987 6307 -0.124801 -0.0632002 -0.0216683 1 0 1 1 0 0 +EDGE2 8987 6308 1.01119 0.0223493 0.0287093 1 0 1 1 0 0 +EDGE2 8988 8987 -1.01766 0.0370403 0.00228351 1 0 1 1 0 0 +EDGE2 8988 6307 -1.00062 -0.0723308 -0.00525145 1 0 1 1 0 0 +EDGE2 8988 6308 0.0199624 -0.0391204 0.00898333 1 0 1 1 0 0 +EDGE2 8988 6309 0.990995 0.0209723 0.0164714 1 0 1 1 0 0 +EDGE2 8989 8988 -0.989678 -0.0232857 -0.0263772 1 0 1 1 0 0 +EDGE2 8989 6308 -1.00232 -0.0247608 0.00715122 1 0 1 1 0 0 +EDGE2 8989 6309 -0.0547881 0.0246428 -0.0247022 1 0 1 1 0 0 +EDGE2 8989 6310 1.06233 0.0316511 -0.018068 1 0 1 1 0 0 +EDGE2 8989 8910 0.958497 0.022719 -3.17472 1 0 1 1 0 0 +EDGE2 8989 8890 0.986552 0.0475707 -3.15876 1 0 1 1 0 0 +EDGE2 8990 8989 -0.897658 -0.0535031 0.00676966 1 0 1 1 0 0 +EDGE2 8990 6309 -1.10726 -0.104578 -0.0152093 1 0 1 1 0 0 +EDGE2 8990 6311 0.04479 1.03351 1.56988 1 0 1 1 0 0 +EDGE2 8990 6310 -0.0610887 -0.0123572 0.002666 1 0 1 1 0 0 +EDGE2 8990 8910 -0.00924542 -0.00819219 -3.09743 1 0 1 1 0 0 +EDGE2 8990 8890 0.0673903 0.0541714 -3.15655 1 0 1 1 0 0 +EDGE2 8990 8909 0.950502 0.0110789 -3.12781 1 0 1 1 0 0 +EDGE2 8990 8889 0.959209 -0.0678045 -3.11173 1 0 1 1 0 0 +EDGE2 8990 8891 0.011127 -0.990858 -1.58924 1 0 1 1 0 0 +EDGE2 8990 8911 -0.0845236 -0.98945 -1.56096 1 0 1 1 0 0 +EDGE2 8991 6310 -0.964616 -0.013013 1.57185 1 0 1 1 0 0 +EDGE2 8991 8910 -0.926372 0.0478759 -1.60604 1 0 1 1 0 0 +EDGE2 8991 8990 -1.04323 0.0238461 1.57595 1 0 1 1 0 0 +EDGE2 8991 8890 -1.01388 -0.0675191 -1.5537 1 0 1 1 0 0 +EDGE2 8991 8892 0.94144 -0.0149901 0.0353792 1 0 1 1 0 0 +EDGE2 8991 8891 0.0252262 0.000861412 -0.00965177 1 0 1 1 0 0 +EDGE2 8991 8911 0.049692 0.0602754 0.00132541 1 0 1 1 0 0 +EDGE2 8991 8912 0.936523 -0.0241434 -0.0340883 1 0 1 1 0 0 +EDGE2 8992 8892 -0.0127027 0.0106138 -0.0315942 1 0 1 1 0 0 +EDGE2 8992 8891 -0.991597 -0.0161899 -0.00306432 1 0 1 1 0 0 +EDGE2 8992 8991 -0.971106 -0.00982299 -0.015194 1 0 1 1 0 0 +EDGE2 8992 8911 -0.995939 0.00326744 -0.0169175 1 0 1 1 0 0 +EDGE2 8992 8912 0.0713738 0.0544613 -0.0128476 1 0 1 1 0 0 +EDGE2 8992 8893 0.923647 0.000545619 -0.00288452 1 0 1 1 0 0 +EDGE2 8992 8913 0.956733 -0.0304854 -0.0217693 1 0 1 1 0 0 +EDGE2 8993 8914 0.964706 -0.0714841 0.0231676 1 0 1 1 0 0 +EDGE2 8993 8892 -0.95627 0.065273 0.00583684 1 0 1 1 0 0 +EDGE2 8993 8992 -1.00387 -0.0409678 -0.00636186 1 0 1 1 0 0 +EDGE2 8993 8912 -1.01808 0.0154968 -0.00783348 1 0 1 1 0 0 +EDGE2 8993 8893 -0.0662016 -0.116785 -0.0338679 1 0 1 1 0 0 +EDGE2 8993 8913 -0.0959884 -0.0134107 -0.0531127 1 0 1 1 0 0 +EDGE2 8993 8894 0.974339 0.0166438 -0.00516905 1 0 1 1 0 0 +EDGE2 8994 8914 0.0191597 0.0340697 -0.0242472 1 0 1 1 0 0 +EDGE2 8994 8893 -0.929582 -0.025033 -0.0375534 1 0 1 1 0 0 +EDGE2 8994 8993 -0.938041 0.00647282 -0.0157857 1 0 1 1 0 0 +EDGE2 8994 8913 -0.948501 -0.050088 0.0119346 1 0 1 1 0 0 +EDGE2 8994 8894 0.0449725 0.0126178 0.0292863 1 0 1 1 0 0 +EDGE2 8994 8135 0.974674 0.0271679 -3.1534 1 0 1 1 0 0 +EDGE2 8994 8895 0.983725 -0.0143968 0.0293694 1 0 1 1 0 0 +EDGE2 8994 8915 0.986452 0.0588808 -0.0118122 1 0 1 1 0 0 +EDGE2 8994 8155 0.981179 -0.0283744 -3.17286 1 0 1 1 0 0 +EDGE2 8995 8914 -1.17727 -0.0122108 0.0127791 1 0 1 1 0 0 +EDGE2 8995 8156 -0.0451259 -1.02302 -1.58446 1 0 1 1 0 0 +EDGE2 8995 8136 -0.0865099 -0.936561 -1.58778 1 0 1 1 0 0 +EDGE2 8995 8994 -1.01914 -0.0223783 0.000580117 1 0 1 1 0 0 +EDGE2 8995 8894 -1.10578 -0.0151888 -0.0271497 1 0 1 1 0 0 +EDGE2 8995 8135 0.0374081 0.0551302 -3.14044 1 0 1 1 0 0 +EDGE2 8995 8895 -0.0347621 -0.0235566 -0.0327708 1 0 1 1 0 0 +EDGE2 8995 8915 0.0529715 -0.0373916 -0.0176378 1 0 1 1 0 0 +EDGE2 8995 8155 0.0140258 -0.0150538 -3.1366 1 0 1 1 0 0 +EDGE2 8995 8916 0.0373785 0.967977 1.55596 1 0 1 1 0 0 +EDGE2 8995 8896 -0.0193118 0.892756 1.59111 1 0 1 1 0 0 +EDGE2 8995 8134 1.02917 0.0624991 -3.14423 1 0 1 1 0 0 +EDGE2 8995 8154 1.00398 -0.0526038 -3.13565 1 0 1 1 0 0 +EDGE2 8996 8156 -0.0100308 -0.00447137 -0.0195187 1 0 1 1 0 0 +EDGE2 8996 8157 1.01366 -0.00222144 0.00320558 1 0 1 1 0 0 +EDGE2 8996 8137 1.00355 -0.0233097 0.0102246 1 0 1 1 0 0 +EDGE2 8996 8136 -0.0518446 0.0328921 -0.0257181 1 0 1 1 0 0 +EDGE2 8996 8995 -0.967572 -0.00933951 1.56446 1 0 1 1 0 0 +EDGE2 8996 8135 -1.01234 -0.00381429 -1.55666 1 0 1 1 0 0 +EDGE2 8996 8895 -0.99534 0.0242192 1.57312 1 0 1 1 0 0 +EDGE2 8996 8915 -0.967771 0.0773016 1.56833 1 0 1 1 0 0 +EDGE2 8996 8155 -1.01006 -0.00809943 -1.56944 1 0 1 1 0 0 +EDGE2 8997 8156 -1.00018 0.0353401 -0.0343949 1 0 1 1 0 0 +EDGE2 8997 8157 0.0118046 -0.0591347 -0.00226602 1 0 1 1 0 0 +EDGE2 8997 8158 1.07233 -0.00439767 -0.000629587 1 0 1 1 0 0 +EDGE2 8997 8138 0.921321 0.00218051 0.0235964 1 0 1 1 0 0 +EDGE2 8997 8137 0.056019 -0.0535519 0.0224717 1 0 1 1 0 0 +EDGE2 8997 8996 -1.08747 0.0406377 -0.0206634 1 0 1 1 0 0 +EDGE2 8997 8136 -0.948917 -0.100856 0.0102957 1 0 1 1 0 0 +EDGE2 8998 8157 -1.0549 -0.00463955 0.00116108 1 0 1 1 0 0 +EDGE2 8998 8139 0.879088 0.00271431 -0.00552128 1 0 1 1 0 0 +EDGE2 8998 8159 1.02805 0.0538543 -0.0222505 1 0 1 1 0 0 +EDGE2 8998 8997 -0.966678 0.0292429 0.0304782 1 0 1 1 0 0 +EDGE2 8998 8158 0.18799 -0.0841998 -0.0116492 1 0 1 1 0 0 +EDGE2 8998 8138 -0.0812203 0.0134054 0.0362721 1 0 1 1 0 0 +EDGE2 8998 8137 -1.0306 -0.0565882 -0.0101589 1 0 1 1 0 0 +EDGE2 8999 8140 0.953918 -0.0811026 -0.00908308 1 0 1 1 0 0 +EDGE2 8999 6480 0.979459 -0.121212 -3.17417 1 0 1 1 0 0 +EDGE2 8999 8100 1.02303 0.0841061 -3.16261 1 0 1 1 0 0 +EDGE2 8999 6500 1.08524 0.0593741 -3.13375 1 0 1 1 0 0 +EDGE2 8999 8998 -1.06327 0.0241814 0.00411482 1 0 1 1 0 0 +EDGE2 8999 8139 0.0198806 -0.0291699 -0.000743957 1 0 1 1 0 0 +EDGE2 8999 8160 0.98233 0.000492103 -0.0116192 1 0 1 1 0 0 +EDGE2 8999 8159 -0.0172762 0.00480211 -0.0178863 1 0 1 1 0 0 +EDGE2 8999 8158 -1.00825 -0.00749727 -0.00816431 1 0 1 1 0 0 +EDGE2 8999 8138 -1.06162 0.0334179 0.0135113 1 0 1 1 0 0 +EDGE2 9000 8140 0.0381542 0.0621401 -0.00168847 1 0 1 1 0 0 +EDGE2 9000 8099 1.03429 0.0168824 -3.16822 1 0 1 1 0 0 +EDGE2 9000 6479 1.01885 -0.00884564 -3.16644 1 0 1 1 0 0 +EDGE2 9000 6499 0.957906 -0.0849657 -3.15271 1 0 1 1 0 0 +EDGE2 9000 6480 0.0754137 0.0114871 -3.18662 1 0 1 1 0 0 +EDGE2 9000 6501 0.0215988 -0.993869 -1.51156 1 0 1 1 0 0 +EDGE2 9000 8100 -0.0286652 -0.0509063 -3.17005 1 0 1 1 0 0 +EDGE2 9000 6481 -0.00062993 -1.02141 -1.56134 1 0 1 1 0 0 +EDGE2 9000 6500 -0.0463545 0.164022 -3.11279 1 0 1 1 0 0 +EDGE2 9000 8101 0.0257614 0.974021 1.56459 1 0 1 1 0 0 +EDGE2 9000 8141 0.0775969 1.0712 1.57694 1 0 1 1 0 0 +EDGE2 9000 8139 -0.991408 -0.032703 0.0160361 1 0 1 1 0 0 +EDGE2 9000 8999 -1.0454 -0.0210055 0.0108429 1 0 1 1 0 0 +EDGE2 9000 8160 0.0591007 0.00169847 -0.019478 1 0 1 1 0 0 +EDGE2 9000 8159 -1.02255 0.0234225 0.0258671 1 0 1 1 0 0 +EDGE2 9000 8161 -0.0882989 0.897046 1.56408 1 0 1 1 0 0 +EDGE2 9001 8140 -0.999878 -0.056242 -1.58772 1 0 1 1 0 0 +EDGE2 9001 6480 -0.941263 -0.161365 1.56271 1 0 1 1 0 0 +EDGE2 9001 8100 -0.997056 0.0166578 1.53565 1 0 1 1 0 0 +EDGE2 9001 9000 -0.962773 -0.0180152 -1.55807 1 0 1 1 0 0 +EDGE2 9001 6500 -1.00744 0.0423079 1.58705 1 0 1 1 0 0 +EDGE2 9001 8101 0.00643397 -0.00883756 0.00983651 1 0 1 1 0 0 +EDGE2 9001 8102 1.02356 -0.0514883 0.0132426 1 0 1 1 0 0 +EDGE2 9001 8141 0.0448174 -0.00955807 0.0182664 1 0 1 1 0 0 +EDGE2 9001 8160 -0.957845 -0.0424537 -1.58479 1 0 1 1 0 0 +EDGE2 9001 8162 1.04506 -0.0268106 0.011148 1 0 1 1 0 0 +EDGE2 9001 8142 0.981572 0.0342838 -0.0330936 1 0 1 1 0 0 +EDGE2 9001 8161 0.0519241 0.029973 -0.00523135 1 0 1 1 0 0 +EDGE2 9002 9001 -1.05973 0.0349805 -0.00579666 1 0 1 1 0 0 +EDGE2 9002 8101 -0.962126 0.0405939 -0.027796 1 0 1 1 0 0 +EDGE2 9002 8102 -0.0100177 0.0311716 0.0503791 1 0 1 1 0 0 +EDGE2 9002 8103 0.948297 -0.0212822 -0.0159372 1 0 1 1 0 0 +EDGE2 9002 8141 -1.01792 -0.0647598 0.000195867 1 0 1 1 0 0 +EDGE2 9002 8162 -0.000918057 0.0151053 0.0081096 1 0 1 1 0 0 +EDGE2 9002 8143 0.984552 -0.0907163 0.0199621 1 0 1 1 0 0 +EDGE2 9002 8142 0.0287217 0.0447546 -0.000486676 1 0 1 1 0 0 +EDGE2 9002 8161 -1.02369 0.00250282 -0.0144094 1 0 1 1 0 0 +EDGE2 9002 8163 1.00138 -0.104182 -0.0193916 1 0 1 1 0 0 +EDGE2 9003 9002 -0.930527 0.00835523 0.037175 1 0 1 1 0 0 +EDGE2 9003 8102 -1.08594 -0.0721886 0.00551332 1 0 1 1 0 0 +EDGE2 9003 8104 0.989365 -0.0131458 -0.0222055 1 0 1 1 0 0 +EDGE2 9003 8103 -0.0142198 -0.0357568 0.00737841 1 0 1 1 0 0 +EDGE2 9003 8162 -1.04667 -0.0726184 -0.0223036 1 0 1 1 0 0 +EDGE2 9003 8144 1.01023 -0.0409471 -0.0460208 1 0 1 1 0 0 +EDGE2 9003 8143 0.0354949 0.0701946 -0.043489 1 0 1 1 0 0 +EDGE2 9003 8142 -1.01508 -0.0588931 -0.0102842 1 0 1 1 0 0 +EDGE2 9003 8164 0.99867 0.0583549 -0.00439495 1 0 1 1 0 0 +EDGE2 9003 8163 0.0544678 -0.00608962 -0.052258 1 0 1 1 0 0 +EDGE2 9004 9003 -1.00785 -0.0267614 0.0231902 1 0 1 1 0 0 +EDGE2 9004 8104 -1.50385e-05 -0.0687345 0.00161025 1 0 1 1 0 0 +EDGE2 9004 8103 -0.955569 -0.0441062 0.015372 1 0 1 1 0 0 +EDGE2 9004 8144 0.0547976 -0.0370327 -0.0114966 1 0 1 1 0 0 +EDGE2 9004 8143 -1.09517 0.0139653 -0.0176398 1 0 1 1 0 0 +EDGE2 9004 8164 0.0285632 -0.0742599 -0.0270521 1 0 1 1 0 0 +EDGE2 9004 8163 -0.969949 0.0638221 -0.0200338 1 0 1 1 0 0 +EDGE2 9004 8125 1.0046 0.0748436 -3.14081 1 0 1 1 0 0 +EDGE2 9004 8105 0.917671 0.0385709 -0.0196581 1 0 1 1 0 0 +EDGE2 9004 8165 1.02815 0.03697 -0.00835366 1 0 1 1 0 0 +EDGE2 9004 8145 0.918865 0.000788165 0.00304052 1 0 1 1 0 0 +EDGE2 9005 8106 -0.0378397 -1.07077 -1.56182 1 0 1 1 0 0 +EDGE2 9005 9004 -1.05729 -0.0762914 -0.00803114 1 0 1 1 0 0 +EDGE2 9005 8104 -0.956152 0.0216383 0.0100581 1 0 1 1 0 0 +EDGE2 9005 8144 -1.08319 -0.0921806 -0.0286465 1 0 1 1 0 0 +EDGE2 9005 8164 -1.08001 0.0031662 0.0455698 1 0 1 1 0 0 +EDGE2 9005 8125 0.00164203 0.033865 -3.16936 1 0 1 1 0 0 +EDGE2 9005 8105 -0.0528203 0.00648925 0.0139911 1 0 1 1 0 0 +EDGE2 9005 8124 0.986706 -0.0682847 -3.16397 1 0 1 1 0 0 +EDGE2 9005 8146 -0.0806619 1.05435 1.57699 1 0 1 1 0 0 +EDGE2 9005 8165 -0.00103449 -0.0436045 -0.0227015 1 0 1 1 0 0 +EDGE2 9005 8145 -0.0466234 -0.140092 -0.0431497 1 0 1 1 0 0 +EDGE2 9005 8126 0.0253459 0.985672 1.57222 1 0 1 1 0 0 +EDGE2 9005 8166 -0.0220975 1.02522 1.55273 1 0 1 1 0 0 +EDGE2 9006 9005 -1.01101 -0.0652678 -1.54901 1 0 1 1 0 0 +EDGE2 9006 8125 -1.00043 -0.00265829 1.57507 1 0 1 1 0 0 +EDGE2 9006 8105 -0.926167 -0.00115963 -1.59628 1 0 1 1 0 0 +EDGE2 9006 8167 1.05104 -0.0636203 0.0172009 1 0 1 1 0 0 +EDGE2 9006 8146 -0.0366906 0.0853374 -0.00718653 1 0 1 1 0 0 +EDGE2 9006 8165 -1.02183 0.0205721 -1.57657 1 0 1 1 0 0 +EDGE2 9006 8145 -1.06502 -0.0721734 -1.5923 1 0 1 1 0 0 +EDGE2 9006 8126 -0.0170059 0.00789696 -0.00686117 1 0 1 1 0 0 +EDGE2 9006 8127 0.924765 -0.0207992 -0.02166 1 0 1 1 0 0 +EDGE2 9006 8166 0.0263222 0.0509363 0.01759 1 0 1 1 0 0 +EDGE2 9006 8147 1.02251 0.00529138 -0.0010441 1 0 1 1 0 0 +EDGE2 9007 8167 -0.0300164 0.000991683 0.018431 1 0 1 1 0 0 +EDGE2 9007 8146 -0.994946 -0.0132149 0.0358717 1 0 1 1 0 0 +EDGE2 9007 9006 -1.04146 -0.00595664 -0.0139871 1 0 1 1 0 0 +EDGE2 9007 8126 -1.09648 -0.0253245 -0.0201074 1 0 1 1 0 0 +EDGE2 9007 8127 -0.0391565 0.00641316 -0.00805246 1 0 1 1 0 0 +EDGE2 9007 8166 -0.975478 0.0839764 -0.0122543 1 0 1 1 0 0 +EDGE2 9007 8147 -0.0284579 -0.0672368 -0.00430374 1 0 1 1 0 0 +EDGE2 9007 8168 0.9115 -0.0349151 -0.00241725 1 0 1 1 0 0 +EDGE2 9007 8128 0.987042 -0.070202 0.0160837 1 0 1 1 0 0 +EDGE2 9007 8148 1.04532 -0.0524722 -0.00800075 1 0 1 1 0 0 +EDGE2 9008 8167 -0.922408 -0.0837874 0.0143379 1 0 1 1 0 0 +EDGE2 9008 8127 -1.00207 -0.0190321 0.0045033 1 0 1 1 0 0 +EDGE2 9008 9007 -1.01729 0.0249324 -0.0206445 1 0 1 1 0 0 +EDGE2 9008 8147 -1.03997 -0.0195653 0.00449278 1 0 1 1 0 0 +EDGE2 9008 8168 -0.0423257 -0.021898 -0.00083365 1 0 1 1 0 0 +EDGE2 9008 8128 -0.0642672 0.00378705 -0.00111648 1 0 1 1 0 0 +EDGE2 9008 8148 0.00331646 -0.0136387 -0.000961113 1 0 1 1 0 0 +EDGE2 9008 8169 1.0206 0.00620365 -0.00315054 1 0 1 1 0 0 +EDGE2 9008 8129 0.929738 -0.143353 -0.01012 1 0 1 1 0 0 +EDGE2 9008 8149 1.04686 -0.00503083 0.0051578 1 0 1 1 0 0 +EDGE2 9009 8168 -1.02887 0.0568307 0.0269613 1 0 1 1 0 0 +EDGE2 9009 8128 -0.95627 -0.00481157 -0.0188207 1 0 1 1 0 0 +EDGE2 9009 9008 -1.08486 0.0384433 0.0128424 1 0 1 1 0 0 +EDGE2 9009 8148 -1.04512 0.129266 -0.00800942 1 0 1 1 0 0 +EDGE2 9009 8169 0.0536404 -0.0175004 2.44043e-05 1 0 1 1 0 0 +EDGE2 9009 8129 0.0037226 0.0963582 -0.0332108 1 0 1 1 0 0 +EDGE2 9009 8149 0.0225568 -0.00430611 0.00181529 1 0 1 1 0 0 +EDGE2 9009 8170 1.00895 -0.0821391 -0.0317663 1 0 1 1 0 0 +EDGE2 9009 8130 0.987573 0.0169392 0.00369643 1 0 1 1 0 0 +EDGE2 9009 8150 1.03071 0.0692983 -0.00255145 1 0 1 1 0 0 +EDGE2 9010 8169 -1.05578 0.0367262 0.0108916 1 0 1 1 0 0 +EDGE2 9010 8129 -0.979949 -0.0151984 0.0291901 1 0 1 1 0 0 +EDGE2 9010 9009 -0.92667 0.0614883 -0.0364346 1 0 1 1 0 0 +EDGE2 9010 8149 -0.941856 -0.00227194 0.0469842 1 0 1 1 0 0 +EDGE2 9010 8171 -0.0812348 -0.986173 -1.53381 1 0 1 1 0 0 +EDGE2 9010 8170 -0.0290571 0.00958619 -0.0288987 1 0 1 1 0 0 +EDGE2 9010 8130 0.027553 -0.00651465 -0.0218679 1 0 1 1 0 0 +EDGE2 9010 8131 -0.0405103 0.99246 1.55907 1 0 1 1 0 0 +EDGE2 9010 8151 -0.0242429 0.975724 1.54714 1 0 1 1 0 0 +EDGE2 9010 8150 0.0442165 -0.0156228 0.00766844 1 0 1 1 0 0 +EDGE2 9011 9010 -1.02259 -0.052162 -1.56357 1 0 1 1 0 0 +EDGE2 9011 8170 -1.04123 0.0742644 -1.5731 1 0 1 1 0 0 +EDGE2 9011 8130 -0.941473 -0.0539933 -1.57805 1 0 1 1 0 0 +EDGE2 9011 8132 1.00468 -0.00702643 -0.0346121 1 0 1 1 0 0 +EDGE2 9011 8131 -0.0144191 -0.0238272 -0.0231865 1 0 1 1 0 0 +EDGE2 9011 8152 0.979332 -0.0353561 0.042486 1 0 1 1 0 0 +EDGE2 9011 8151 0.0282752 -0.0108129 0.00974476 1 0 1 1 0 0 +EDGE2 9011 8150 -0.998067 -0.0959893 -1.58823 1 0 1 1 0 0 +EDGE2 9012 9011 -0.97674 -0.105504 0.000719989 1 0 1 1 0 0 +EDGE2 9012 8132 -0.0361901 0.0118548 -0.0118436 1 0 1 1 0 0 +EDGE2 9012 8133 0.944393 0.0144981 -0.0170456 1 0 1 1 0 0 +EDGE2 9012 8131 -1.09598 -0.0822214 -0.028253 1 0 1 1 0 0 +EDGE2 9012 8152 0.0938036 0.0467455 -0.00198043 1 0 1 1 0 0 +EDGE2 9012 8153 1.04582 0.0226755 0.0353958 1 0 1 1 0 0 +EDGE2 9012 8151 -1.02936 -0.0407648 -0.0236898 1 0 1 1 0 0 +EDGE2 9013 9012 -0.98384 -0.000418642 -0.0244406 1 0 1 1 0 0 +EDGE2 9013 8132 -1.12837 -0.01855 0.0105814 1 0 1 1 0 0 +EDGE2 9013 8133 -0.0545218 0.05874 -0.0131989 1 0 1 1 0 0 +EDGE2 9013 8134 0.990622 0.0564852 0.0142568 1 0 1 1 0 0 +EDGE2 9013 8152 -0.985397 -0.00722141 -0.00729741 1 0 1 1 0 0 +EDGE2 9013 8153 -0.110452 0.0253549 0.00029331 1 0 1 1 0 0 +EDGE2 9013 8154 0.940848 -0.0195396 -0.0324531 1 0 1 1 0 0 +EDGE2 9014 8995 1.00378 0.0434357 -3.17628 1 0 1 1 0 0 +EDGE2 9014 8135 1.04571 0.0427696 0.024114 1 0 1 1 0 0 +EDGE2 9014 8895 1.03493 0.0214647 -3.14095 1 0 1 1 0 0 +EDGE2 9014 8915 1.0218 -0.00375999 -3.16475 1 0 1 1 0 0 +EDGE2 9014 8155 0.968448 0.0135498 0.0126887 1 0 1 1 0 0 +EDGE2 9014 9013 -0.988446 0.0481054 0.0252133 1 0 1 1 0 0 +EDGE2 9014 8133 -0.924723 -0.133044 0.00126519 1 0 1 1 0 0 +EDGE2 9014 8134 -0.038361 -0.0628147 -0.0101415 1 0 1 1 0 0 +EDGE2 9014 8153 -1.00095 0.0133417 -0.0158685 1 0 1 1 0 0 +EDGE2 9014 8154 -0.0121464 0.029442 0.0216063 1 0 1 1 0 0 +EDGE2 9015 8914 0.891552 0.0302155 -3.11913 1 0 1 1 0 0 +EDGE2 9015 8156 0.073629 0.991397 1.59037 1 0 1 1 0 0 +EDGE2 9015 8996 -0.0139758 0.999433 1.57061 1 0 1 1 0 0 +EDGE2 9015 8136 0.0580918 0.961173 1.54615 1 0 1 1 0 0 +EDGE2 9015 8994 0.989469 -0.0105348 -3.15803 1 0 1 1 0 0 +EDGE2 9015 8995 0.0272554 0.0620183 -3.16652 1 0 1 1 0 0 +EDGE2 9015 8894 0.951699 0.0707746 -3.15067 1 0 1 1 0 0 +EDGE2 9015 8135 -0.0878798 0.0538561 0.0442682 1 0 1 1 0 0 +EDGE2 9015 8895 0.0686108 -0.0207898 -3.15496 1 0 1 1 0 0 +EDGE2 9015 8915 0.0576576 -0.0385406 -3.12334 1 0 1 1 0 0 +EDGE2 9015 8155 -0.0289798 -0.0297977 0.0225106 1 0 1 1 0 0 +EDGE2 9015 8916 0.0567361 -0.95183 -1.56618 1 0 1 1 0 0 +EDGE2 9015 8896 -0.0129684 -0.984214 -1.54479 1 0 1 1 0 0 +EDGE2 9015 9014 -1.00217 -0.0649098 -0.0116227 1 0 1 1 0 0 +EDGE2 9015 8134 -0.915607 0.0324944 0.026631 1 0 1 1 0 0 +EDGE2 9015 8154 -1.05233 0.0458601 -0.0185766 1 0 1 1 0 0 +EDGE2 9016 8995 -1.10778 -0.145673 -1.52933 1 0 1 1 0 0 +EDGE2 9016 9015 -1.02999 0.0390559 1.5841 1 0 1 1 0 0 +EDGE2 9016 8135 -0.972079 -0.0129362 1.56206 1 0 1 1 0 0 +EDGE2 9016 8895 -1.01287 -0.00875444 -1.599 1 0 1 1 0 0 +EDGE2 9016 8915 -1.0244 -0.0769243 -1.56514 1 0 1 1 0 0 +EDGE2 9016 8155 -1.14721 -0.0447405 1.53752 1 0 1 1 0 0 +EDGE2 9016 8916 0.0249473 0.0436518 0.0443469 1 0 1 1 0 0 +EDGE2 9016 8896 0.000611828 0.00174887 -0.00505909 1 0 1 1 0 0 +EDGE2 9016 8917 1.0117 0.00310836 0.0161916 1 0 1 1 0 0 +EDGE2 9016 8897 0.960405 -0.0427069 -0.00987502 1 0 1 1 0 0 +EDGE2 9017 8916 -0.88742 -0.0130343 -0.0148603 1 0 1 1 0 0 +EDGE2 9017 9016 -1.03405 0.0442184 0.0305625 1 0 1 1 0 0 +EDGE2 9017 8896 -1.06439 0.0798186 -0.0236228 1 0 1 1 0 0 +EDGE2 9017 8917 0.0952165 0.0592583 -0.00570597 1 0 1 1 0 0 +EDGE2 9017 8897 0.0428253 0.0142475 -0.0363077 1 0 1 1 0 0 +EDGE2 9017 8898 0.949847 -0.0794369 0.0300685 1 0 1 1 0 0 +EDGE2 9017 8918 0.942841 -0.0126437 0.000995721 1 0 1 1 0 0 +EDGE2 9018 8917 -1.02879 -0.0186652 -0.00862055 1 0 1 1 0 0 +EDGE2 9018 9017 -0.995063 -0.0832703 0.0125317 1 0 1 1 0 0 +EDGE2 9018 8897 -0.901025 0.0329976 -0.0111068 1 0 1 1 0 0 +EDGE2 9018 8898 0.0569542 -0.0346526 0.0395185 1 0 1 1 0 0 +EDGE2 9018 8918 0.0386271 0.0840399 -0.0253101 1 0 1 1 0 0 +EDGE2 9018 8919 1.03641 -0.0346356 -0.0046423 1 0 1 1 0 0 +EDGE2 9018 8899 1.00856 0.000350979 0.000583233 1 0 1 1 0 0 +EDGE2 9019 8898 -1.04771 0.00201627 6.5336e-05 1 0 1 1 0 0 +EDGE2 9019 8918 -1.04837 -0.00479265 -0.00202641 1 0 1 1 0 0 +EDGE2 9019 9018 -0.995035 -0.0228545 -0.0393 1 0 1 1 0 0 +EDGE2 9019 8919 0.0384807 -0.0232474 -0.0216114 1 0 1 1 0 0 +EDGE2 9019 8899 -0.0583053 0.00933195 -0.00862118 1 0 1 1 0 0 +EDGE2 9019 8920 1.07025 -0.0215846 0.0161051 1 0 1 1 0 0 +EDGE2 9019 8900 1.068 -0.0132113 0.0154779 1 0 1 1 0 0 +EDGE2 9020 8919 -0.976719 0.0212961 -0.00383105 1 0 1 1 0 0 +EDGE2 9020 9019 -1.01499 -0.00252234 -0.0150529 1 0 1 1 0 0 +EDGE2 9020 8899 -1.10259 0.0384456 -0.00198522 1 0 1 1 0 0 +EDGE2 9020 8921 -0.0675934 1.08467 1.58945 1 0 1 1 0 0 +EDGE2 9020 8901 -0.00666704 1.08224 1.60196 1 0 1 1 0 0 +EDGE2 9020 8920 -0.100776 -0.0114161 -0.0180113 1 0 1 1 0 0 +EDGE2 9020 8900 -0.0346523 -0.0328989 0.00807959 1 0 1 1 0 0 +EDGE2 9021 8902 0.984688 -0.129402 0.0137145 1 0 1 1 0 0 +EDGE2 9021 8922 0.953382 0.00931842 0.0170772 1 0 1 1 0 0 +EDGE2 9021 8921 0.0255453 0.0405213 0.0549629 1 0 1 1 0 0 +EDGE2 9021 8901 -0.0204094 0.0184261 -0.0480102 1 0 1 1 0 0 +EDGE2 9021 8920 -1.00802 0.0235559 -1.57222 1 0 1 1 0 0 +EDGE2 9021 9020 -0.976602 0.0205382 -1.57772 1 0 1 1 0 0 +EDGE2 9021 8900 -1.02637 0.0566543 -1.53486 1 0 1 1 0 0 +EDGE2 9022 8903 0.961731 0.049295 -0.0242065 1 0 1 1 0 0 +EDGE2 9022 8923 0.968536 -0.0452321 -0.00118446 1 0 1 1 0 0 +EDGE2 9022 8902 -0.00647013 -0.0594086 -0.00956556 1 0 1 1 0 0 +EDGE2 9022 8922 -0.070988 0.0495742 -0.028349 1 0 1 1 0 0 +EDGE2 9022 8921 -1.01823 0.0451571 0.00977459 1 0 1 1 0 0 +EDGE2 9022 9021 -0.958736 0.0751437 -0.0292434 1 0 1 1 0 0 +EDGE2 9022 8901 -1.01113 -0.0823466 -0.0326034 1 0 1 1 0 0 +EDGE2 9023 9022 -1.04637 0.0104567 -0.0307509 1 0 1 1 0 0 +EDGE2 9023 8924 0.967073 -0.0115456 -0.00437097 1 0 1 1 0 0 +EDGE2 9023 8904 0.978075 -0.0131851 0.0490949 1 0 1 1 0 0 +EDGE2 9023 8903 0.0421772 -0.0784496 -0.0231362 1 0 1 1 0 0 +EDGE2 9023 8923 -0.0443071 0.0154109 0.0403921 1 0 1 1 0 0 +EDGE2 9023 8902 -0.956584 -0.0695727 -0.0104415 1 0 1 1 0 0 +EDGE2 9023 8922 -1.02057 -0.0688048 0.0061832 1 0 1 1 0 0 +EDGE2 9024 8885 0.988317 -0.00485988 -3.13592 1 0 1 1 0 0 +EDGE2 9024 8925 0.991283 -0.0226837 -0.00918349 1 0 1 1 0 0 +EDGE2 9024 8905 1.12435 0.0180649 -0.0235911 1 0 1 1 0 0 +EDGE2 9024 8924 -0.0858528 -0.0120256 0.0260811 1 0 1 1 0 0 +EDGE2 9024 8904 -0.0384409 -0.0902923 -0.0255005 1 0 1 1 0 0 +EDGE2 9024 8903 -1.03005 0.0147331 -0.0335193 1 0 1 1 0 0 +EDGE2 9024 8923 -1.0042 -0.0468509 0.0327129 1 0 1 1 0 0 +EDGE2 9024 9023 -1.00599 0.0097475 -0.0393574 1 0 1 1 0 0 +EDGE2 9025 8906 0.00691912 1.01145 1.53642 1 0 1 1 0 0 +EDGE2 9025 8886 -0.113835 1.01541 1.5764 1 0 1 1 0 0 +EDGE2 9025 8884 1.02648 0.0613026 -3.1093 1 0 1 1 0 0 +EDGE2 9025 8885 -0.00419092 -0.101111 -3.10482 1 0 1 1 0 0 +EDGE2 9025 8925 -0.00653893 0.103413 0.0254878 1 0 1 1 0 0 +EDGE2 9025 8905 -0.025609 0.0283941 0.0063358 1 0 1 1 0 0 +EDGE2 9025 8926 -0.0485632 -1.01969 -1.55241 1 0 1 1 0 0 +EDGE2 9025 8924 -0.957637 -0.0253352 0.0105401 1 0 1 1 0 0 +EDGE2 9025 9024 -0.994024 0.00387097 0.00927478 1 0 1 1 0 0 +EDGE2 9025 8904 -1.06501 -0.00487897 0.00573098 1 0 1 1 0 0 +EDGE2 9026 8907 1.02392 0.0694881 -0.0087613 1 0 1 1 0 0 +EDGE2 9026 8887 0.893317 0.0201362 0.0224138 1 0 1 1 0 0 +EDGE2 9026 8906 0.00375045 0.103972 0.00471258 1 0 1 1 0 0 +EDGE2 9026 8886 -0.0558554 0.0247533 0.0404079 1 0 1 1 0 0 +EDGE2 9026 8885 -0.962423 0.0121223 1.5901 1 0 1 1 0 0 +EDGE2 9026 8925 -1.01769 -0.0534594 -1.5403 1 0 1 1 0 0 +EDGE2 9026 9025 -0.895432 0.0134392 -1.56121 1 0 1 1 0 0 +EDGE2 9026 8905 -0.990453 -0.0260535 -1.58898 1 0 1 1 0 0 +EDGE2 9027 8888 1.08932 -0.0358875 -0.00669337 1 0 1 1 0 0 +EDGE2 9027 8908 1.07286 0.0380941 -0.0133317 1 0 1 1 0 0 +EDGE2 9027 8907 0.060594 0.0155701 0.0461214 1 0 1 1 0 0 +EDGE2 9027 8887 -0.0947967 -0.0613449 0.00323992 1 0 1 1 0 0 +EDGE2 9027 8906 -1.0995 0.0240531 -0.0138868 1 0 1 1 0 0 +EDGE2 9027 9026 -0.959316 0.00734023 0.0121956 1 0 1 1 0 0 +EDGE2 9027 8886 -1.02153 -0.0679803 -0.0213867 1 0 1 1 0 0 +EDGE2 9028 8909 0.946499 0.0407965 -0.0229311 1 0 1 1 0 0 +EDGE2 9028 8889 0.964823 0.0719002 -0.0246239 1 0 1 1 0 0 +EDGE2 9028 8888 -0.0220948 0.031729 0.00211172 1 0 1 1 0 0 +EDGE2 9028 8908 0.0338151 0.0200024 -0.00708757 1 0 1 1 0 0 +EDGE2 9028 8907 -1.02648 -0.015869 0.014229 1 0 1 1 0 0 +EDGE2 9028 9027 -1.03358 0.0732455 -0.000485833 1 0 1 1 0 0 +EDGE2 9028 8887 -1.02373 -0.00176614 -0.0141499 1 0 1 1 0 0 +EDGE2 9029 6310 0.977215 0.0246975 -3.11388 1 0 1 1 0 0 +EDGE2 9029 8910 0.979875 0.0545581 0.0340512 1 0 1 1 0 0 +EDGE2 9029 8990 0.98825 -0.0628302 -3.18278 1 0 1 1 0 0 +EDGE2 9029 8890 1.0482 -0.00537739 -0.02349 1 0 1 1 0 0 +EDGE2 9029 8909 0.0295136 -0.0154865 -0.0198748 1 0 1 1 0 0 +EDGE2 9029 8889 -0.0173613 -0.00740836 -0.0269364 1 0 1 1 0 0 +EDGE2 9029 8888 -1.04109 0.0428853 -0.00773677 1 0 1 1 0 0 +EDGE2 9029 9028 -1.02645 0.0754056 0.0187909 1 0 1 1 0 0 +EDGE2 9029 8908 -1.0701 -0.06621 -0.00151741 1 0 1 1 0 0 +EDGE2 9030 8989 0.975565 -0.0665861 -3.14209 1 0 1 1 0 0 +EDGE2 9030 6309 0.928145 0.00116731 -3.14609 1 0 1 1 0 0 +EDGE2 9030 6311 -0.0385604 -1.04621 -1.53515 1 0 1 1 0 0 +EDGE2 9030 6310 -0.000597382 0.0194642 -3.17083 1 0 1 1 0 0 +EDGE2 9030 8910 0.0593741 -0.00238658 0.00523427 1 0 1 1 0 0 +EDGE2 9030 8990 -0.0480915 0.0275103 -3.14721 1 0 1 1 0 0 +EDGE2 9030 8890 -0.0574 -0.059188 0.00987089 1 0 1 1 0 0 +EDGE2 9030 8909 -0.967541 -0.0402767 -0.0227846 1 0 1 1 0 0 +EDGE2 9030 9029 -0.942059 -0.0190372 -0.0249791 1 0 1 1 0 0 +EDGE2 9030 8889 -1.00396 0.0397081 -0.00722062 1 0 1 1 0 0 +EDGE2 9030 8891 0.000259619 1.01055 1.55722 1 0 1 1 0 0 +EDGE2 9030 8991 -0.0789551 1.01015 1.56587 1 0 1 1 0 0 +EDGE2 9030 8911 -0.0372481 0.945469 1.58874 1 0 1 1 0 0 +EDGE2 9031 6310 -0.966028 0.0121308 1.57423 1 0 1 1 0 0 +EDGE2 9031 8910 -0.909624 -0.0181238 -1.54739 1 0 1 1 0 0 +EDGE2 9031 8990 -0.939865 -0.0960982 1.54153 1 0 1 1 0 0 +EDGE2 9031 9030 -1.06103 -0.0516194 -1.55909 1 0 1 1 0 0 +EDGE2 9031 8890 -0.998529 -0.036496 -1.55208 1 0 1 1 0 0 +EDGE2 9031 8892 1.02 0.0094873 -0.00436867 1 0 1 1 0 0 +EDGE2 9031 8891 -0.024758 0.0367152 0.0325534 1 0 1 1 0 0 +EDGE2 9031 8991 -0.0275532 0.0521993 0.0370621 1 0 1 1 0 0 +EDGE2 9031 8911 0.00284574 -0.0322154 -0.00487619 1 0 1 1 0 0 +EDGE2 9031 8992 0.983581 0.069994 -0.0183838 1 0 1 1 0 0 +EDGE2 9031 8912 0.926621 0.033133 0.0250108 1 0 1 1 0 0 +EDGE2 9032 8892 -0.00814378 0.0624927 0.0327913 1 0 1 1 0 0 +EDGE2 9032 8891 -0.94329 -0.0242639 0.00135983 1 0 1 1 0 0 +EDGE2 9032 8991 -0.960864 0.0492454 0.000464717 1 0 1 1 0 0 +EDGE2 9032 9031 -0.998949 -0.0333229 0.0138338 1 0 1 1 0 0 +EDGE2 9032 8911 -1.05493 -0.0435828 0.0296561 1 0 1 1 0 0 +EDGE2 9032 8992 0.116992 -0.0644742 -0.0125554 1 0 1 1 0 0 +EDGE2 9032 8912 -0.011125 -0.0156143 0.0260069 1 0 1 1 0 0 +EDGE2 9032 8893 0.974811 -0.0415557 -0.0148253 1 0 1 1 0 0 +EDGE2 9032 8993 0.941619 0.100883 -0.0360175 1 0 1 1 0 0 +EDGE2 9032 8913 0.976219 -0.0890862 0.0120382 1 0 1 1 0 0 +EDGE2 9033 8914 0.970459 -0.0354601 0.0128881 1 0 1 1 0 0 +EDGE2 9033 8892 -1.01699 -0.0146329 0.00194138 1 0 1 1 0 0 +EDGE2 9033 8992 -0.932751 0.0130603 0.0251997 1 0 1 1 0 0 +EDGE2 9033 9032 -0.936576 0.0321525 -0.0163021 1 0 1 1 0 0 +EDGE2 9033 8912 -1.03851 0.0846557 -0.00762129 1 0 1 1 0 0 +EDGE2 9033 8893 0.00573587 0.0606851 -0.00986577 1 0 1 1 0 0 +EDGE2 9033 8993 -0.0289972 0.0290414 0.0209918 1 0 1 1 0 0 +EDGE2 9033 8913 0.0821716 -0.0106731 -0.0275638 1 0 1 1 0 0 +EDGE2 9033 8994 1.07556 0.00829051 0.0489171 1 0 1 1 0 0 +EDGE2 9033 8894 0.931219 0.0212342 0.00912825 1 0 1 1 0 0 +EDGE2 9034 8914 0.075402 -0.00288823 0.0127783 1 0 1 1 0 0 +EDGE2 9034 8893 -0.983359 -0.0852592 0.0098269 1 0 1 1 0 0 +EDGE2 9034 8993 -1.02327 -0.060344 0.023751 1 0 1 1 0 0 +EDGE2 9034 9033 -0.998986 0.00734273 -0.0170726 1 0 1 1 0 0 +EDGE2 9034 8913 -1.03222 0.0111325 -0.00207117 1 0 1 1 0 0 +EDGE2 9034 8994 -0.0107436 0.00692038 0.0289609 1 0 1 1 0 0 +EDGE2 9034 8995 1.0262 0.0146718 -0.0358487 1 0 1 1 0 0 +EDGE2 9034 8894 -0.00065678 0.0774103 -0.0257349 1 0 1 1 0 0 +EDGE2 9034 9015 1.01932 0.0110408 -3.16168 1 0 1 1 0 0 +EDGE2 9034 8135 0.937871 -0.0333767 -3.14048 1 0 1 1 0 0 +EDGE2 9034 8895 1.02666 -0.0131883 -0.0449307 1 0 1 1 0 0 +EDGE2 9034 8915 0.980646 0.0304144 0.0249436 1 0 1 1 0 0 +EDGE2 9034 8155 1.00783 -0.00810819 -3.13304 1 0 1 1 0 0 +EDGE2 9035 8914 -1.01738 -0.0659051 -0.0181657 1 0 1 1 0 0 +EDGE2 9035 8156 -0.025033 -1.1087 -1.5436 1 0 1 1 0 0 +EDGE2 9035 8996 -0.00683153 -1.03834 -1.56095 1 0 1 1 0 0 +EDGE2 9035 8136 -0.0238499 -0.974711 -1.5483 1 0 1 1 0 0 +EDGE2 9035 9034 -0.969814 0.0339048 -0.0293516 1 0 1 1 0 0 +EDGE2 9035 8994 -1.03671 0.0616153 0.00868374 1 0 1 1 0 0 +EDGE2 9035 8995 -0.0319959 -0.00242981 -0.00938729 1 0 1 1 0 0 +EDGE2 9035 8894 -0.9779 0.0170913 -0.0212278 1 0 1 1 0 0 +EDGE2 9035 9015 0.0204487 -0.062584 -3.14073 1 0 1 1 0 0 +EDGE2 9035 8135 0.0108376 0.0141559 -3.1526 1 0 1 1 0 0 +EDGE2 9035 8895 0.0414778 -0.0243949 -0.023536 1 0 1 1 0 0 +EDGE2 9035 8915 0.0201664 -0.0908397 -0.0267166 1 0 1 1 0 0 +EDGE2 9035 8155 0.0226664 -0.0294876 -3.11025 1 0 1 1 0 0 +EDGE2 9035 8916 -0.061008 1.01534 1.57415 1 0 1 1 0 0 +EDGE2 9035 9016 -0.0475975 1.07111 1.55552 1 0 1 1 0 0 +EDGE2 9035 8896 0.0144223 1.05307 1.56495 1 0 1 1 0 0 +EDGE2 9035 9014 1.05054 -0.0125561 -3.14881 1 0 1 1 0 0 +EDGE2 9035 8134 1.04715 -0.0530913 -3.16193 1 0 1 1 0 0 +EDGE2 9035 8154 0.992885 0.0764064 -3.17738 1 0 1 1 0 0 +EDGE2 9036 8995 -0.997067 0.0268328 -1.59534 1 0 1 1 0 0 +EDGE2 9036 9035 -0.96099 0.0952661 -1.58399 1 0 1 1 0 0 +EDGE2 9036 9015 -0.94156 -0.0200947 1.54955 1 0 1 1 0 0 +EDGE2 9036 8135 -1.06943 0.00977096 1.54998 1 0 1 1 0 0 +EDGE2 9036 8895 -0.994778 0.00283432 -1.5627 1 0 1 1 0 0 +EDGE2 9036 8915 -1.00798 0.0156672 -1.56811 1 0 1 1 0 0 +EDGE2 9036 8155 -1.01602 -0.00672007 1.59117 1 0 1 1 0 0 +EDGE2 9036 8916 0.0158146 0.0796027 -0.0204811 1 0 1 1 0 0 +EDGE2 9036 9016 0.0616598 -0.0256615 0.00157441 1 0 1 1 0 0 +EDGE2 9036 8896 0.0194545 0.0598367 0.000830205 1 0 1 1 0 0 +EDGE2 9036 8917 0.985685 -0.0162529 0.00471359 1 0 1 1 0 0 +EDGE2 9036 9017 1.03064 -0.0586322 0.00882646 1 0 1 1 0 0 +EDGE2 9036 8897 1.06526 -0.0184288 0.0256842 1 0 1 1 0 0 +EDGE2 9037 8916 -1.06965 -0.00205845 -0.00849368 1 0 1 1 0 0 +EDGE2 9037 9016 -0.987671 -0.0349259 0.00602902 1 0 1 1 0 0 +EDGE2 9037 9036 -0.913566 0.0515566 0.0334498 1 0 1 1 0 0 +EDGE2 9037 8896 -1.16042 0.0376425 -0.0049694 1 0 1 1 0 0 +EDGE2 9037 8917 -0.00661438 0.0578482 0.0483786 1 0 1 1 0 0 +EDGE2 9037 9017 0.0780415 -0.0233741 -0.000274265 1 0 1 1 0 0 +EDGE2 9037 8897 0.0358067 0.0251336 0.00125557 1 0 1 1 0 0 +EDGE2 9037 8898 1.09161 0.034811 0.0170025 1 0 1 1 0 0 +EDGE2 9037 8918 0.937613 0.0579391 -0.0131471 1 0 1 1 0 0 +EDGE2 9037 9018 1.03252 0.0228026 0.0274692 1 0 1 1 0 0 +EDGE2 9038 8917 -0.990322 0.053043 0.015086 1 0 1 1 0 0 +EDGE2 9038 9017 -1.046 -0.0298653 0.0116123 1 0 1 1 0 0 +EDGE2 9038 9037 -1.02482 -0.00650053 0.00850453 1 0 1 1 0 0 +EDGE2 9038 8897 -0.892159 -0.0479508 -0.0216954 1 0 1 1 0 0 +EDGE2 9038 8898 0.0288886 0.080558 -0.00844908 1 0 1 1 0 0 +EDGE2 9038 8918 0.0140619 -0.0816821 0.000906457 1 0 1 1 0 0 +EDGE2 9038 9018 0.0351472 -0.013195 0.0142787 1 0 1 1 0 0 +EDGE2 9038 8919 0.959632 -0.0332934 0.000375909 1 0 1 1 0 0 +EDGE2 9038 9019 0.917081 0.126988 0.00889042 1 0 1 1 0 0 +EDGE2 9038 8899 1.02061 0.0348261 0.0047738 1 0 1 1 0 0 +EDGE2 9039 9038 -1.04884 -0.00651082 0.0126483 1 0 1 1 0 0 +EDGE2 9039 8898 -0.934683 0.0859685 0.00665546 1 0 1 1 0 0 +EDGE2 9039 8918 -1.07041 0.0427013 -0.00292833 1 0 1 1 0 0 +EDGE2 9039 9018 -0.943154 -0.0599105 -0.000164123 1 0 1 1 0 0 +EDGE2 9039 8919 -0.0278999 0.0308014 -0.0223486 1 0 1 1 0 0 +EDGE2 9039 9019 0.110981 -0.036764 0.0221711 1 0 1 1 0 0 +EDGE2 9039 8899 0.0274402 -0.0155171 -0.0142294 1 0 1 1 0 0 +EDGE2 9039 8920 0.975016 0.0304527 0.0221943 1 0 1 1 0 0 +EDGE2 9039 9020 1.04994 -0.014995 -0.0349282 1 0 1 1 0 0 +EDGE2 9039 8900 1.06115 -0.0155773 0.0343078 1 0 1 1 0 0 +EDGE2 9040 9039 -0.977864 0.0435018 -0.0243009 1 0 1 1 0 0 +EDGE2 9040 8919 -1.01705 3.98352e-05 0.0103934 1 0 1 1 0 0 +EDGE2 9040 9019 -1.00728 0.00322145 0.0296298 1 0 1 1 0 0 +EDGE2 9040 8899 -0.991088 -0.0583355 0.0257617 1 0 1 1 0 0 +EDGE2 9040 8921 -0.0082774 1.02392 1.56776 1 0 1 1 0 0 +EDGE2 9040 9021 -0.0216132 1.03911 1.54674 1 0 1 1 0 0 +EDGE2 9040 8901 -0.0701371 0.97572 1.57614 1 0 1 1 0 0 +EDGE2 9040 8920 0.0842434 -0.0135944 0.000466788 1 0 1 1 0 0 +EDGE2 9040 9020 0.0733548 -0.066016 -0.00228011 1 0 1 1 0 0 +EDGE2 9040 8900 0.0343878 0.0526916 -0.00431256 1 0 1 1 0 0 +EDGE2 9041 9022 0.975266 -0.10704 -0.00234403 1 0 1 1 0 0 +EDGE2 9041 8902 0.993948 -0.005842 -0.0491666 1 0 1 1 0 0 +EDGE2 9041 8922 0.919798 -0.152776 -0.0220302 1 0 1 1 0 0 +EDGE2 9041 8921 -0.0638997 0.128045 0.0220261 1 0 1 1 0 0 +EDGE2 9041 9021 0.00536029 0.00719709 -0.0159517 1 0 1 1 0 0 +EDGE2 9041 8901 0.0614031 0.00409598 -0.000221374 1 0 1 1 0 0 +EDGE2 9041 8920 -0.91964 -0.0625286 -1.56754 1 0 1 1 0 0 +EDGE2 9041 9020 -1.01963 -0.0469572 -1.56818 1 0 1 1 0 0 +EDGE2 9041 9040 -0.92182 -0.0333907 -1.55041 1 0 1 1 0 0 +EDGE2 9041 8900 -0.964295 0.0037522 -1.59846 1 0 1 1 0 0 +EDGE2 9042 9022 -0.0149592 -0.0222516 -0.0136641 1 0 1 1 0 0 +EDGE2 9042 8903 0.930846 -0.0475986 -0.0114457 1 0 1 1 0 0 +EDGE2 9042 8923 1.01137 -0.0215492 0.00377534 1 0 1 1 0 0 +EDGE2 9042 9023 1.04822 0.0300124 -0.0100834 1 0 1 1 0 0 +EDGE2 9042 8902 -0.00532647 0.0659196 0.00667012 1 0 1 1 0 0 +EDGE2 9042 8922 0.047223 0.0112368 -0.0279043 1 0 1 1 0 0 +EDGE2 9042 8921 -1.07016 0.0237954 0.0300177 1 0 1 1 0 0 +EDGE2 9042 9021 -0.985749 0.0744628 0.0146193 1 0 1 1 0 0 +EDGE2 9042 9041 -0.955594 -0.010546 0.00853258 1 0 1 1 0 0 +EDGE2 9042 8901 -1.10469 0.0176765 -0.00298831 1 0 1 1 0 0 +EDGE2 9043 9022 -0.971517 0.00961347 -0.0098216 1 0 1 1 0 0 +EDGE2 9043 8924 0.977531 -0.0480814 -0.00285843 1 0 1 1 0 0 +EDGE2 9043 9024 1.07086 -0.048537 0.0342431 1 0 1 1 0 0 +EDGE2 9043 8904 1.00368 -0.0226735 0.0168236 1 0 1 1 0 0 +EDGE2 9043 8903 0.0277656 0.0449717 0.00403786 1 0 1 1 0 0 +EDGE2 9043 8923 -0.0272169 -0.0709954 -0.000489231 1 0 1 1 0 0 +EDGE2 9043 9023 0.0258647 0.0249276 -0.014639 1 0 1 1 0 0 +EDGE2 9043 9042 -0.968302 0.0437964 0.000586445 1 0 1 1 0 0 +EDGE2 9043 8902 -0.993151 0.00516849 0.0157637 1 0 1 1 0 0 +EDGE2 9043 8922 -0.9955 -0.0693241 0.00251024 1 0 1 1 0 0 +EDGE2 9044 8885 0.995102 0.129558 -3.16084 1 0 1 1 0 0 +EDGE2 9044 8925 1.0155 0.015769 0.0206293 1 0 1 1 0 0 +EDGE2 9044 9025 0.953425 -0.0381123 0.0105678 1 0 1 1 0 0 +EDGE2 9044 8905 1.02645 8.92146e-05 0.061155 1 0 1 1 0 0 +EDGE2 9044 9043 -1.04897 0.0233462 -0.0209651 1 0 1 1 0 0 +EDGE2 9044 8924 -0.0374778 0.0299844 -0.0497156 1 0 1 1 0 0 +EDGE2 9044 9024 0.0226444 0.079807 0.000180556 1 0 1 1 0 0 +EDGE2 9044 8904 0.00230901 0.0385507 0.0117864 1 0 1 1 0 0 +EDGE2 9044 8903 -1.03162 -0.0798594 0.0380141 1 0 1 1 0 0 +EDGE2 9044 8923 -1.06288 -0.00391525 0.00258722 1 0 1 1 0 0 +EDGE2 9044 9023 -0.90301 0.0351309 -0.0174479 1 0 1 1 0 0 +EDGE2 9045 8906 -0.071696 1.0711 1.54704 1 0 1 1 0 0 +EDGE2 9045 9026 -0.0310417 1.0162 1.56937 1 0 1 1 0 0 +EDGE2 9045 8886 0.0465976 1.01074 1.58394 1 0 1 1 0 0 +EDGE2 9045 8884 0.961625 0.0917679 -3.14249 1 0 1 1 0 0 +EDGE2 9045 8885 -0.0196397 -0.027906 -3.14856 1 0 1 1 0 0 +EDGE2 9045 8925 0.0207616 0.017539 -0.00265948 1 0 1 1 0 0 +EDGE2 9045 9025 -0.0208713 -0.0288805 0.00121822 1 0 1 1 0 0 +EDGE2 9045 8905 0.0363828 0.0700948 0.00481598 1 0 1 1 0 0 +EDGE2 9045 8926 -0.0537821 -1.07356 -1.57493 1 0 1 1 0 0 +EDGE2 9045 8924 -1.00221 0.00886177 0.000579266 1 0 1 1 0 0 +EDGE2 9045 9024 -1.03282 0.0495401 -0.0176194 1 0 1 1 0 0 +EDGE2 9045 9044 -0.979901 -0.0550841 0.0269769 1 0 1 1 0 0 +EDGE2 9045 8904 -1.04514 -0.00602552 0.0105617 1 0 1 1 0 0 +EDGE2 9046 8907 1.0477 -0.0256383 -0.0205194 1 0 1 1 0 0 +EDGE2 9046 9027 1.00117 -0.0425413 -0.00762071 1 0 1 1 0 0 +EDGE2 9046 8887 1.03578 0.0323447 0.0167916 1 0 1 1 0 0 +EDGE2 9046 8906 0.113911 0.0328918 0.0213992 1 0 1 1 0 0 +EDGE2 9046 9026 -0.048001 0.034031 -0.0100145 1 0 1 1 0 0 +EDGE2 9046 8886 0.0561392 0.0130088 -0.00213797 1 0 1 1 0 0 +EDGE2 9046 8885 -0.899985 0.0662178 1.58358 1 0 1 1 0 0 +EDGE2 9046 8925 -1.01271 0.0199499 -1.56018 1 0 1 1 0 0 +EDGE2 9046 9025 -0.986147 -0.0338985 -1.5802 1 0 1 1 0 0 +EDGE2 9046 9045 -1.04826 0.00973877 -1.55284 1 0 1 1 0 0 +EDGE2 9046 8905 -1.03198 0.0531728 -1.57054 1 0 1 1 0 0 +EDGE2 9047 8888 0.977624 -0.128954 0.00691572 1 0 1 1 0 0 +EDGE2 9047 9028 0.958999 0.0250223 -0.00191369 1 0 1 1 0 0 +EDGE2 9047 8908 1.03634 -0.00455217 0.00931833 1 0 1 1 0 0 +EDGE2 9047 9046 -1.00133 0.000996911 0.0156027 1 0 1 1 0 0 +EDGE2 9047 8907 -0.00439402 0.0531666 0.0156161 1 0 1 1 0 0 +EDGE2 9047 9027 0.0425322 0.0232832 -0.034785 1 0 1 1 0 0 +EDGE2 9047 8887 -0.0478591 0.00856681 0.00824376 1 0 1 1 0 0 +EDGE2 9047 8906 -0.94086 0.0562664 -0.0231409 1 0 1 1 0 0 +EDGE2 9047 9026 -0.934753 -0.0157902 0.00764356 1 0 1 1 0 0 +EDGE2 9047 8886 -0.974247 0.00400593 0.0113678 1 0 1 1 0 0 +EDGE2 9048 8909 1.00312 0.0821515 -0.0174782 1 0 1 1 0 0 +EDGE2 9048 9029 0.952213 0.000154897 0.0486473 1 0 1 1 0 0 +EDGE2 9048 8889 1.00537 0.0266607 -0.00366315 1 0 1 1 0 0 +EDGE2 9048 8888 -0.0105021 0.00972088 0.0185625 1 0 1 1 0 0 +EDGE2 9048 9028 0.0682303 -0.0345499 -0.00569699 1 0 1 1 0 0 +EDGE2 9048 8908 0.0294919 0.0204476 0.0209668 1 0 1 1 0 0 +EDGE2 9048 8907 -1.02412 0.0405543 0.0117753 1 0 1 1 0 0 +EDGE2 9048 9027 -1.08454 0.011817 0.0121984 1 0 1 1 0 0 +EDGE2 9048 9047 -1.0236 -0.00286327 -0.00674095 1 0 1 1 0 0 +EDGE2 9048 8887 -0.993904 -0.0228585 0.0194555 1 0 1 1 0 0 +EDGE2 9049 6310 0.990675 0.0230298 -3.15536 1 0 1 1 0 0 +EDGE2 9049 8910 1.04163 0.0141159 -0.0052347 1 0 1 1 0 0 +EDGE2 9049 8990 1.06469 -0.0348509 -3.11003 1 0 1 1 0 0 +EDGE2 9049 9030 1.04999 0.0311673 -0.0160684 1 0 1 1 0 0 +EDGE2 9049 8890 0.966787 0.0652437 0.00925234 1 0 1 1 0 0 +EDGE2 9049 8909 0.0216846 0.016774 -0.0114455 1 0 1 1 0 0 +EDGE2 9049 9029 0.0256326 0.0298675 0.0205666 1 0 1 1 0 0 +EDGE2 9049 8889 0.0291991 0.082559 0.0028304 1 0 1 1 0 0 +EDGE2 9049 8888 -1.1072 0.0192955 -0.0129316 1 0 1 1 0 0 +EDGE2 9049 9028 -1.06103 0.0585613 0.0102022 1 0 1 1 0 0 +EDGE2 9049 9048 -1.11143 0.00666775 0.0469697 1 0 1 1 0 0 +EDGE2 9049 8908 -0.913129 0.0598566 0.00768497 1 0 1 1 0 0 +EDGE2 9050 8989 0.971673 -0.110199 -3.12705 1 0 1 1 0 0 +EDGE2 9050 6309 0.957403 0.0280076 -3.11257 1 0 1 1 0 0 +EDGE2 9050 6311 0.0131466 -0.98761 -1.62096 1 0 1 1 0 0 +EDGE2 9050 6310 0.0350982 0.00884065 -3.09688 1 0 1 1 0 0 +EDGE2 9050 8910 -0.0436119 -0.0516461 0.00233096 1 0 1 1 0 0 +EDGE2 9050 8990 -0.0863327 0.0427157 -3.14678 1 0 1 1 0 0 +EDGE2 9050 9030 0.0410275 -0.0225573 -0.00358559 1 0 1 1 0 0 +EDGE2 9050 8890 0.00103191 -0.0985356 0.0088549 1 0 1 1 0 0 +EDGE2 9050 8909 -0.950341 0.0449392 -0.00832175 1 0 1 1 0 0 +EDGE2 9050 9029 -0.986533 -0.0257323 0.00783888 1 0 1 1 0 0 +EDGE2 9050 9049 -0.958219 0.0914156 0.00472566 1 0 1 1 0 0 +EDGE2 9050 8889 -1.05576 -0.056073 -0.0112676 1 0 1 1 0 0 +EDGE2 9050 8891 0.0695308 1.06856 1.56062 1 0 1 1 0 0 +EDGE2 9050 8991 -0.0584295 1.0875 1.57045 1 0 1 1 0 0 +EDGE2 9050 9031 0.0191264 1.01483 1.58956 1 0 1 1 0 0 +EDGE2 9050 8911 -0.0987221 1.02053 1.57286 1 0 1 1 0 0 +EDGE2 9051 9050 -0.961857 0.125797 -1.57642 1 0 1 1 0 0 +EDGE2 9051 6310 -1.02549 0.0423323 1.57915 1 0 1 1 0 0 +EDGE2 9051 8910 -0.999664 -0.032719 -1.61915 1 0 1 1 0 0 +EDGE2 9051 8990 -0.957697 0.0103455 1.58312 1 0 1 1 0 0 +EDGE2 9051 9030 -0.984181 0.000179794 -1.60461 1 0 1 1 0 0 +EDGE2 9051 8890 -0.950711 0.0454703 -1.56367 1 0 1 1 0 0 +EDGE2 9051 8892 0.928294 0.0261573 -0.0175839 1 0 1 1 0 0 +EDGE2 9051 8891 -0.0326742 -0.136341 0.0143829 1 0 1 1 0 0 +EDGE2 9051 8991 -0.0354581 -0.0620254 -0.0462004 1 0 1 1 0 0 +EDGE2 9051 9031 0.0237924 0.00951752 0.00434995 1 0 1 1 0 0 +EDGE2 9051 8911 0.0110923 -0.0294393 -0.00865175 1 0 1 1 0 0 +EDGE2 9051 8992 0.962848 -0.00324377 -0.0595089 1 0 1 1 0 0 +EDGE2 9051 9032 1.0547 0.00987657 -0.00254913 1 0 1 1 0 0 +EDGE2 9051 8912 1.03288 0.0177176 -0.00982982 1 0 1 1 0 0 +EDGE2 9052 8892 -0.0118758 0.107208 -0.0074595 1 0 1 1 0 0 +EDGE2 9052 8891 -0.950137 -0.05468 0.00944818 1 0 1 1 0 0 +EDGE2 9052 8991 -0.915838 0.0486774 -0.0167548 1 0 1 1 0 0 +EDGE2 9052 9031 -0.996602 0.00555898 -0.014195 1 0 1 1 0 0 +EDGE2 9052 9051 -1.1315 0.0102365 -0.0013026 1 0 1 1 0 0 +EDGE2 9052 8911 -1.00091 -0.0111306 -0.0243646 1 0 1 1 0 0 +EDGE2 9052 8992 0.0893758 -0.0830404 0.0587747 1 0 1 1 0 0 +EDGE2 9052 9032 -0.00943754 0.0797881 0.0317666 1 0 1 1 0 0 +EDGE2 9052 8912 -0.0263426 0.0192916 -0.00463198 1 0 1 1 0 0 +EDGE2 9052 8893 1.04737 -0.0639527 0.0119472 1 0 1 1 0 0 +EDGE2 9052 8993 0.999784 0.0521204 0.0408578 1 0 1 1 0 0 +EDGE2 9052 9033 0.959202 -0.0136562 0.0305742 1 0 1 1 0 0 +EDGE2 9052 8913 1.00005 -0.113218 0.0133776 1 0 1 1 0 0 +EDGE2 9053 8914 1.01484 0.00205783 -0.00224215 1 0 1 1 0 0 +EDGE2 9053 8892 -0.994854 0.0154625 -0.0029312 1 0 1 1 0 0 +EDGE2 9053 8992 -0.970006 0.0382062 -0.0162776 1 0 1 1 0 0 +EDGE2 9053 9032 -1.10295 0.0148684 -0.0268257 1 0 1 1 0 0 +EDGE2 9053 9052 -0.990073 -0.0218827 0.0187728 1 0 1 1 0 0 +EDGE2 9053 8912 -0.983823 0.116784 0.00183397 1 0 1 1 0 0 +EDGE2 9053 8893 -0.0195252 -0.0381568 -0.000131099 1 0 1 1 0 0 +EDGE2 9053 8993 -0.0142037 0.00639932 -0.00834941 1 0 1 1 0 0 +EDGE2 9053 9033 0.0549606 -0.000636001 -0.00115102 1 0 1 1 0 0 +EDGE2 9053 8913 0.00500361 0.0884681 0.00336165 1 0 1 1 0 0 +EDGE2 9053 9034 0.993686 -0.0137235 0.00194475 1 0 1 1 0 0 +EDGE2 9053 8994 1.04245 -0.0215406 0.0160683 1 0 1 1 0 0 +EDGE2 9053 8894 1.01825 -0.017036 -0.0214004 1 0 1 1 0 0 +EDGE2 9054 8914 0.00443473 0.0607785 0.00898744 1 0 1 1 0 0 +EDGE2 9054 8893 -1.03574 -0.0339906 -0.00870153 1 0 1 1 0 0 +EDGE2 9054 8993 -1.04993 -0.046986 -0.00712556 1 0 1 1 0 0 +EDGE2 9054 9033 -1.01996 -0.0240788 0.0208892 1 0 1 1 0 0 +EDGE2 9054 9053 -1.01231 -0.0113686 -0.0272574 1 0 1 1 0 0 +EDGE2 9054 8913 -0.923945 0.0386029 -0.00053008 1 0 1 1 0 0 +EDGE2 9054 9034 -0.0460798 0.0155272 -0.00292443 1 0 1 1 0 0 +EDGE2 9054 8994 -0.0262786 0.0459004 -0.0213345 1 0 1 1 0 0 +EDGE2 9054 8995 1.04929 0.0804775 0.00120681 1 0 1 1 0 0 +EDGE2 9054 9035 0.932171 -0.0833939 0.00229328 1 0 1 1 0 0 +EDGE2 9054 8894 -0.00236389 -0.013354 -0.00943413 1 0 1 1 0 0 +EDGE2 9054 9015 1.03526 -0.0629847 -3.13902 1 0 1 1 0 0 +EDGE2 9054 8135 1.03071 0.0590382 -3.13761 1 0 1 1 0 0 +EDGE2 9054 8895 1.01588 0.0776746 0.00244644 1 0 1 1 0 0 +EDGE2 9054 8915 0.961159 0.0722372 -0.0411719 1 0 1 1 0 0 +EDGE2 9054 8155 1.01791 -0.146568 -3.14245 1 0 1 1 0 0 +EDGE2 9055 8914 -0.955551 0.0308141 0.0212951 1 0 1 1 0 0 +EDGE2 9055 8156 0.0144315 -1.07923 -1.5626 1 0 1 1 0 0 +EDGE2 9055 8996 -0.0222504 -1.01501 -1.63141 1 0 1 1 0 0 +EDGE2 9055 8136 -0.00210484 -1.02831 -1.53021 1 0 1 1 0 0 +EDGE2 9055 9034 -1.0644 0.00719255 -0.0337299 1 0 1 1 0 0 +EDGE2 9055 9054 -0.992684 0.0221831 -0.00452636 1 0 1 1 0 0 +EDGE2 9055 8994 -1.0191 -0.0258496 -0.00780817 1 0 1 1 0 0 +EDGE2 9055 8995 0.0868206 0.000771732 0.0472812 1 0 1 1 0 0 +EDGE2 9055 9035 0.0609246 0.00934736 -0.00462726 1 0 1 1 0 0 +EDGE2 9055 8894 -1.05463 -0.0350143 0.0119978 1 0 1 1 0 0 +EDGE2 9055 9015 -0.0520871 -0.0375108 -3.15413 1 0 1 1 0 0 +EDGE2 9055 8135 -0.0322167 0.000724729 -3.16557 1 0 1 1 0 0 +EDGE2 9055 8895 -0.0263278 0.0302512 0.0104459 1 0 1 1 0 0 +EDGE2 9055 8915 0.0230065 -0.0282526 0.010552 1 0 1 1 0 0 +EDGE2 9055 8155 -0.011825 -0.0465366 -3.14063 1 0 1 1 0 0 +EDGE2 9055 8916 0.0563967 1.01636 1.56925 1 0 1 1 0 0 +EDGE2 9055 9016 -0.00437351 0.896626 1.58365 1 0 1 1 0 0 +EDGE2 9055 9036 -0.0116948 1.01886 1.54381 1 0 1 1 0 0 +EDGE2 9055 8896 -0.0108203 1.0151 1.61079 1 0 1 1 0 0 +EDGE2 9055 9014 1.02576 0.00123567 -3.13202 1 0 1 1 0 0 +EDGE2 9055 8134 1.03619 0.0247953 -3.16235 1 0 1 1 0 0 +EDGE2 9055 8154 0.883753 -0.00147871 -3.14 1 0 1 1 0 0 +EDGE2 9056 8995 -0.976819 0.139324 -1.57702 1 0 1 1 0 0 +EDGE2 9056 9035 -0.979614 -0.0206888 -1.56811 1 0 1 1 0 0 +EDGE2 9056 9055 -0.934269 -0.0700268 -1.5487 1 0 1 1 0 0 +EDGE2 9056 9015 -0.979537 0.0393191 1.56224 1 0 1 1 0 0 +EDGE2 9056 8135 -1.08923 -0.0305782 1.59019 1 0 1 1 0 0 +EDGE2 9056 8895 -0.995651 -0.0581192 -1.57285 1 0 1 1 0 0 +EDGE2 9056 8915 -1.01761 -0.0329588 -1.59588 1 0 1 1 0 0 +EDGE2 9056 8155 -1.0484 -0.100143 1.57107 1 0 1 1 0 0 +EDGE2 9056 8916 -0.0855353 0.0395156 0.0084343 1 0 1 1 0 0 +EDGE2 9056 9016 -0.00213463 -0.0399066 -0.0180464 1 0 1 1 0 0 +EDGE2 9056 9036 0.0721335 -0.01358 0.00434547 1 0 1 1 0 0 +EDGE2 9056 8896 0.00127264 0.00401881 -0.028481 1 0 1 1 0 0 +EDGE2 9056 8917 0.991142 -0.132978 0.00178347 1 0 1 1 0 0 +EDGE2 9056 9017 0.953401 0.00888072 0.041806 1 0 1 1 0 0 +EDGE2 9056 9037 0.996974 -0.0642943 0.0358834 1 0 1 1 0 0 +EDGE2 9056 8897 1.00449 0.00145671 -0.00261536 1 0 1 1 0 0 +EDGE2 9057 9056 -0.855627 -0.0332217 0.0501624 1 0 1 1 0 0 +EDGE2 9057 8916 -1.06271 0.0268566 -0.0146119 1 0 1 1 0 0 +EDGE2 9057 9016 -1.04855 -0.0287605 -0.0140709 1 0 1 1 0 0 +EDGE2 9057 9036 -0.953436 0.0474825 0.00111024 1 0 1 1 0 0 +EDGE2 9057 8896 -1.08873 0.0407377 0.00162543 1 0 1 1 0 0 +EDGE2 9057 8917 -0.0244589 0.0203366 0.00237569 1 0 1 1 0 0 +EDGE2 9057 9017 0.00890428 0.00580587 -0.0170006 1 0 1 1 0 0 +EDGE2 9057 9037 -0.0854687 0.0527773 -0.0249995 1 0 1 1 0 0 +EDGE2 9057 8897 0.0132644 0.00730635 -0.00785538 1 0 1 1 0 0 +EDGE2 9057 9038 1.05363 0.0801713 0.017974 1 0 1 1 0 0 +EDGE2 9057 8898 0.991543 -0.0548958 0.0186532 1 0 1 1 0 0 +EDGE2 9057 8918 0.983872 -0.076378 -0.00786752 1 0 1 1 0 0 +EDGE2 9057 9018 0.987026 -0.0173521 -0.00340313 1 0 1 1 0 0 +EDGE2 9058 9057 -1.02759 0.0411444 -0.014435 1 0 1 1 0 0 +EDGE2 9058 8917 -1.0357 -0.07782 0.0220394 1 0 1 1 0 0 +EDGE2 9058 9017 -0.99273 -0.116277 0.0299315 1 0 1 1 0 0 +EDGE2 9058 9037 -0.983441 -0.00396076 -0.00882994 1 0 1 1 0 0 +EDGE2 9058 8897 -0.905517 -0.0185252 0.0230702 1 0 1 1 0 0 +EDGE2 9058 9038 -0.0186022 -0.0135979 0.00728216 1 0 1 1 0 0 +EDGE2 9058 9039 0.997221 -0.020636 0.0216996 1 0 1 1 0 0 +EDGE2 9058 8898 0.0568511 -0.0170705 0.0211305 1 0 1 1 0 0 +EDGE2 9058 8918 0.0665759 -0.00428304 -0.0304497 1 0 1 1 0 0 +EDGE2 9058 9018 0.0269665 0.075932 0.00647718 1 0 1 1 0 0 +EDGE2 9058 8919 1.02216 -0.00486118 -0.0417089 1 0 1 1 0 0 +EDGE2 9058 9019 1.11551 -0.0304963 0.0400766 1 0 1 1 0 0 +EDGE2 9058 8899 0.972375 0.000251072 0.00338773 1 0 1 1 0 0 +EDGE2 9059 9058 -0.994894 0.0411225 0.00517601 1 0 1 1 0 0 +EDGE2 9059 9038 -0.98469 -0.102291 0.0196879 1 0 1 1 0 0 +EDGE2 9059 9039 -0.0155409 0.0996619 -0.0169466 1 0 1 1 0 0 +EDGE2 9059 8898 -0.993893 0.0315203 -0.0107638 1 0 1 1 0 0 +EDGE2 9059 8918 -1.03182 0.0513012 -0.00824058 1 0 1 1 0 0 +EDGE2 9059 9018 -1.03713 0.00122022 0.0416784 1 0 1 1 0 0 +EDGE2 9059 8919 -0.0205451 -0.10489 -0.0148862 1 0 1 1 0 0 +EDGE2 9059 9019 -0.0528062 -0.0460584 -0.000763492 1 0 1 1 0 0 +EDGE2 9059 8899 0.0019166 0.0576936 0.000611378 1 0 1 1 0 0 +EDGE2 9059 8920 1.04195 0.0187575 -0.00713303 1 0 1 1 0 0 +EDGE2 9059 9020 1.05648 -0.0285817 -0.0242565 1 0 1 1 0 0 +EDGE2 9059 9040 1.07805 0.0166099 -0.000901011 1 0 1 1 0 0 +EDGE2 9059 8900 1.06601 0.0260126 0.0206999 1 0 1 1 0 0 +EDGE2 9060 9039 -0.965912 -0.0186194 -0.000637771 1 0 1 1 0 0 +EDGE2 9060 9059 -0.95962 -0.0323267 0.0222652 1 0 1 1 0 0 +EDGE2 9060 8919 -1.01541 -0.00197987 0.0254504 1 0 1 1 0 0 +EDGE2 9060 9019 -0.948056 0.122517 -0.0182015 1 0 1 1 0 0 +EDGE2 9060 8899 -1.09083 0.0515461 -0.0178467 1 0 1 1 0 0 +EDGE2 9060 8921 0.120687 1.05042 1.51577 1 0 1 1 0 0 +EDGE2 9060 9021 -0.0222664 0.932264 1.58871 1 0 1 1 0 0 +EDGE2 9060 9041 -0.0793392 1.02887 1.55135 1 0 1 1 0 0 +EDGE2 9060 8901 -0.0787652 0.926265 1.58238 1 0 1 1 0 0 +EDGE2 9060 8920 -0.0194744 0.0433982 0.0126013 1 0 1 1 0 0 +EDGE2 9060 9020 -0.0918462 0.0706471 -0.0202273 1 0 1 1 0 0 +EDGE2 9060 9040 -0.118011 -0.0159193 -0.0243364 1 0 1 1 0 0 +EDGE2 9060 8900 0.0470918 -0.0367434 -0.0317639 1 0 1 1 0 0 +EDGE2 9061 9060 -0.970567 0.00182471 1.57499 1 0 1 1 0 0 +EDGE2 9061 8920 -1.08087 -0.036464 1.58173 1 0 1 1 0 0 +EDGE2 9061 9020 -0.972305 -0.0334374 1.58461 1 0 1 1 0 0 +EDGE2 9061 9040 -1.0509 0.0319641 1.58412 1 0 1 1 0 0 +EDGE2 9061 8900 -1.06806 0.0224727 1.55764 1 0 1 1 0 0 +EDGE2 9062 9061 -0.983786 -0.109896 -0.0074462 1 0 1 1 0 0 +EDGE2 9063 9062 -0.962198 -0.0645144 -0.0128496 1 0 1 1 0 0 +EDGE2 9064 9063 -0.987127 -0.0889908 0.00299064 1 0 1 1 0 0 +EDGE2 9065 9064 -1.00575 -0.0167768 0.022415 1 0 1 1 0 0 +EDGE2 9066 9065 -1.07 0.0523769 1.54935 1 0 1 1 0 0 +EDGE2 9067 9066 -0.982243 0.0817366 0.0231866 1 0 1 1 0 0 +EDGE2 9068 9067 -0.955042 0.0017555 -0.0330128 1 0 1 1 0 0 +EDGE2 9069 9010 0.936137 0.0221527 -3.13308 1 0 1 1 0 0 +EDGE2 9069 8170 0.907693 -0.0563832 -3.11332 1 0 1 1 0 0 +EDGE2 9069 8130 1.04342 0.00830579 -3.16752 1 0 1 1 0 0 +EDGE2 9069 8150 0.945284 0.00626885 -3.14959 1 0 1 1 0 0 +EDGE2 9069 9068 -0.953875 0.0611644 0.0309272 1 0 1 1 0 0 +EDGE2 9070 8169 1.02591 -0.0464261 -3.14091 1 0 1 1 0 0 +EDGE2 9070 8129 0.971499 -0.0361745 -3.14826 1 0 1 1 0 0 +EDGE2 9070 9009 0.932948 0.0574931 -3.12868 1 0 1 1 0 0 +EDGE2 9070 8149 0.967759 0.0323385 -3.1719 1 0 1 1 0 0 +EDGE2 9070 8171 -0.00250609 0.994087 1.57949 1 0 1 1 0 0 +EDGE2 9070 9011 -0.0673396 -0.941478 -1.61297 1 0 1 1 0 0 +EDGE2 9070 9010 0.00904554 0.0182842 -3.12136 1 0 1 1 0 0 +EDGE2 9070 8170 0.0277848 -0.00948953 -3.12927 1 0 1 1 0 0 +EDGE2 9070 8130 -0.0293313 -0.0516682 -3.18444 1 0 1 1 0 0 +EDGE2 9070 8131 -0.0429931 -0.931707 -1.55722 1 0 1 1 0 0 +EDGE2 9070 8151 0.0559349 -0.96041 -1.5945 1 0 1 1 0 0 +EDGE2 9070 8150 0.00471404 -0.0401281 -3.17468 1 0 1 1 0 0 +EDGE2 9070 9069 -1.02476 0.0228768 -0.0144038 1 0 1 1 0 0 +EDGE2 9071 8171 -0.0622612 0.0239271 -0.00939734 1 0 1 1 0 0 +EDGE2 9071 9070 -1.02406 -0.0389907 -1.55294 1 0 1 1 0 0 +EDGE2 9071 9010 -1.09051 0.0624794 1.58208 1 0 1 1 0 0 +EDGE2 9071 8170 -1.04236 -0.0156197 1.53709 1 0 1 1 0 0 +EDGE2 9071 8130 -1.09443 -0.0330555 1.55346 1 0 1 1 0 0 +EDGE2 9071 8150 -1.02275 -0.0373379 1.55415 1 0 1 1 0 0 +EDGE2 9071 8172 0.99173 -0.0670865 -0.0305777 1 0 1 1 0 0 +EDGE2 9072 8171 -0.902018 0.0991496 -0.00309054 1 0 1 1 0 0 +EDGE2 9072 9071 -1.04683 -0.0785643 0.00862761 1 0 1 1 0 0 +EDGE2 9072 8172 0.0229325 -0.0421096 0.00561268 1 0 1 1 0 0 +EDGE2 9072 8173 0.956365 0.00532632 0.00761737 1 0 1 1 0 0 +EDGE2 9073 9072 -1.06785 0.0211122 -0.00834079 1 0 1 1 0 0 +EDGE2 9073 8172 -0.949073 0.036956 0.00696691 1 0 1 1 0 0 +EDGE2 9073 8174 1.02241 0.0262931 -0.0190285 1 0 1 1 0 0 +EDGE2 9073 8173 0.0366684 0.0328618 0.00237302 1 0 1 1 0 0 +EDGE2 9074 9073 -1.00798 0.00131185 0.00782188 1 0 1 1 0 0 +EDGE2 9074 8175 0.932766 0.0377979 -0.035862 1 0 1 1 0 0 +EDGE2 9074 8174 0.0234655 -0.0790669 1.11623e-05 1 0 1 1 0 0 +EDGE2 9074 8173 -1.00045 0.0517292 0.0401042 1 0 1 1 0 0 +EDGE2 9075 9074 -0.964597 0.00538844 -0.00394904 1 0 1 1 0 0 +EDGE2 9075 8175 0.0260555 0.00796019 -0.023735 1 0 1 1 0 0 +EDGE2 9075 8174 -0.979966 -0.062322 0.0224059 1 0 1 1 0 0 +EDGE2 9075 8176 0.0513012 0.959874 1.56514 1 0 1 1 0 0 +EDGE2 9076 9075 -0.965407 0.08217 1.60594 1 0 1 1 0 0 +EDGE2 9076 8175 -0.919858 0.0313346 1.57446 1 0 1 1 0 0 +EDGE2 9077 9076 -1.03395 -0.00863375 -0.00133483 1 0 1 1 0 0 +EDGE2 9078 9077 -0.986865 -0.0645778 -0.0183781 1 0 1 1 0 0 +EDGE2 9079 8120 0.997037 -0.0324931 -3.14522 1 0 1 1 0 0 +EDGE2 9079 9078 -1.03534 -0.0107139 0.0043489 1 0 1 1 0 0 +EDGE2 9080 8120 0.00567266 0.0250141 -3.13089 1 0 1 1 0 0 +EDGE2 9080 8119 0.989229 0.00687936 -3.11814 1 0 1 1 0 0 +EDGE2 9080 8121 -0.00296248 -1.00406 -1.58182 1 0 1 1 0 0 +EDGE2 9080 9079 -0.887477 0.0465254 0.00600947 1 0 1 1 0 0 +EDGE2 9081 8120 -1.02387 -0.0335451 1.58304 1 0 1 1 0 0 +EDGE2 9081 9080 -0.992735 -0.0302823 -1.59336 1 0 1 1 0 0 +EDGE2 9082 9081 -1.01673 0.039245 -0.0210808 1 0 1 1 0 0 +EDGE2 9083 9082 -0.995307 0.018482 0.0332745 1 0 1 1 0 0 +EDGE2 9084 9083 -0.997095 0.0454083 -0.01004 1 0 1 1 0 0 +EDGE2 9085 9084 -1.03352 -0.0868721 -0.0284617 1 0 1 1 0 0 +EDGE2 9086 9085 -1.0227 -9.92693e-05 -1.55026 1 0 1 1 0 0 +EDGE2 9087 9086 -0.970608 -0.00682637 -0.0513108 1 0 1 1 0 0 +EDGE2 9088 9087 -0.979238 -0.0483449 0.00899507 1 0 1 1 0 0 +EDGE2 9089 9088 -1.0305 0.0563565 -0.00689117 1 0 1 1 0 0 +EDGE2 9090 9089 -1.00634 -0.00444385 0.0123417 1 0 1 1 0 0 +EDGE2 9091 9090 -1.00113 -0.0811776 -1.57079 1 0 1 1 0 0 +EDGE2 9092 9091 -0.927797 -0.0155406 0.00360807 1 0 1 1 0 0 +EDGE2 9093 9092 -0.98485 0.0295746 0.0371126 1 0 1 1 0 0 +EDGE2 9094 9075 0.907911 -0.0548126 -3.19085 1 0 1 1 0 0 +EDGE2 9094 9093 -0.963282 -0.0611483 0.00135874 1 0 1 1 0 0 +EDGE2 9094 8175 1.04664 0.0370089 -3.11522 1 0 1 1 0 0 +EDGE2 9095 9076 -0.0737243 0.941281 1.57327 1 0 1 1 0 0 +EDGE2 9095 9074 1.01461 0.0247389 -3.13637 1 0 1 1 0 0 +EDGE2 9095 9075 0.0161631 0.0048263 -3.12167 1 0 1 1 0 0 +EDGE2 9095 9094 -0.973093 0.0173378 -0.0117331 1 0 1 1 0 0 +EDGE2 9095 8175 0.0423495 0.0722137 -3.1375 1 0 1 1 0 0 +EDGE2 9095 8174 1.08944 0.0144182 -3.15036 1 0 1 1 0 0 +EDGE2 9095 8176 0.0766336 -1.03809 -1.5527 1 0 1 1 0 0 +EDGE2 9096 9077 1.08454 -0.0220295 0.00424214 1 0 1 1 0 0 +EDGE2 9096 9076 0.0897651 0.0606326 -0.00797454 1 0 1 1 0 0 +EDGE2 9096 9075 -0.957795 0.00704206 1.60837 1 0 1 1 0 0 +EDGE2 9096 9095 -1.01678 0.0785464 -1.55871 1 0 1 1 0 0 +EDGE2 9096 8175 -0.990715 0.0318684 1.5659 1 0 1 1 0 0 +EDGE2 9097 9078 0.962506 -0.0214998 -0.0021616 1 0 1 1 0 0 +EDGE2 9097 9077 -0.057968 0.0175731 0.0348813 1 0 1 1 0 0 +EDGE2 9097 9096 -0.983463 0.0605031 0.0105938 1 0 1 1 0 0 +EDGE2 9097 9076 -1.02456 -0.0776311 0.0112919 1 0 1 1 0 0 +EDGE2 9098 9079 1.07282 0.00193115 -0.0055824 1 0 1 1 0 0 +EDGE2 9098 9078 0.0181425 -0.00428084 0.0119051 1 0 1 1 0 0 +EDGE2 9098 9077 -1.06829 -0.0642756 0.00887418 1 0 1 1 0 0 +EDGE2 9098 9097 -0.997312 -0.0563655 0.00370476 1 0 1 1 0 0 +EDGE2 9099 8120 1.03448 -0.08703 -3.10416 1 0 1 1 0 0 +EDGE2 9099 9080 1.0251 -0.00493324 0.0194871 1 0 1 1 0 0 +EDGE2 9099 9079 0.026756 -0.0682926 -0.00747276 1 0 1 1 0 0 +EDGE2 9099 9098 -0.919795 -0.082264 0.016225 1 0 1 1 0 0 +EDGE2 9099 9078 -1.02412 -0.0158273 -0.0243331 1 0 1 1 0 0 +EDGE2 9100 8120 -0.0126476 0.0549201 -3.1737 1 0 1 1 0 0 +EDGE2 9100 8119 0.880833 0.0302282 -3.13323 1 0 1 1 0 0 +EDGE2 9100 9081 -0.0465634 1.03999 1.56819 1 0 1 1 0 0 +EDGE2 9100 9080 -0.0336721 0.0699097 0.0262761 1 0 1 1 0 0 +EDGE2 9100 8121 -0.0676603 -0.881629 -1.56608 1 0 1 1 0 0 +EDGE2 9100 9099 -1.07242 -0.0626619 0.00408028 1 0 1 1 0 0 +EDGE2 9100 9079 -1.01587 0.0284628 -0.00261203 1 0 1 1 0 0 +EDGE2 9101 8120 -0.995704 -0.0167389 1.58572 1 0 1 1 0 0 +EDGE2 9101 9081 -0.043066 0.0598027 0.0135393 1 0 1 1 0 0 +EDGE2 9101 9080 -0.872789 0.022976 -1.59229 1 0 1 1 0 0 +EDGE2 9101 9100 -0.953222 -0.0221282 -1.60701 1 0 1 1 0 0 +EDGE2 9101 9082 1.02578 0.0728623 0.0339593 1 0 1 1 0 0 +EDGE2 9102 9081 -1.02967 -0.0801642 -0.0117925 1 0 1 1 0 0 +EDGE2 9102 9101 -1.01968 0.0685701 -0.0301783 1 0 1 1 0 0 +EDGE2 9102 9082 0.0153964 -0.0226994 0.0342049 1 0 1 1 0 0 +EDGE2 9102 9083 1.00593 0.0113724 -0.0281587 1 0 1 1 0 0 +EDGE2 9103 9082 -1.00672 0.0205118 -0.00543728 1 0 1 1 0 0 +EDGE2 9103 9102 -0.957527 0.0824024 -0.00777626 1 0 1 1 0 0 +EDGE2 9103 9083 -0.000521946 0.0172641 0.0606939 1 0 1 1 0 0 +EDGE2 9103 9084 1.00572 0.0906687 0.00795843 1 0 1 1 0 0 +EDGE2 9104 9103 -0.968393 -0.0437553 -0.0130832 1 0 1 1 0 0 +EDGE2 9104 9083 -1.04424 0.0237253 0.0282467 1 0 1 1 0 0 +EDGE2 9104 9085 1.00815 0.0989222 -0.0350636 1 0 1 1 0 0 +EDGE2 9104 9084 -0.0504517 0.0322774 -0.0210999 1 0 1 1 0 0 +EDGE2 9105 9085 0.0296512 -0.0606206 -0.00647873 1 0 1 1 0 0 +EDGE2 9105 9084 -1.00316 0.039959 -0.01996 1 0 1 1 0 0 +EDGE2 9105 9104 -1.04187 -0.0478089 0.0137023 1 0 1 1 0 0 +EDGE2 9105 9086 0.0296133 0.98293 1.56845 1 0 1 1 0 0 +EDGE2 9106 9085 -1.13532 -0.0232596 1.57401 1 0 1 1 0 0 +EDGE2 9106 9105 -0.957346 0.0502701 1.55453 1 0 1 1 0 0 +EDGE2 9107 9106 -0.994952 -0.00215993 0.0166999 1 0 1 1 0 0 +EDGE2 9108 9107 -1.03177 0.00816902 0.0236493 1 0 1 1 0 0 +EDGE2 9109 9108 -0.980688 -0.0498374 -0.0175952 1 0 1 1 0 0 +EDGE2 9110 9109 -1.00303 0.0169646 -0.00938213 1 0 1 1 0 0 +EDGE2 9111 9110 -0.947682 0.0313 -1.55966 1 0 1 1 0 0 +EDGE2 9112 9111 -1.05179 -0.0835672 -0.00173209 1 0 1 1 0 0 +EDGE2 9113 9112 -1.00818 0.00999802 -0.0245837 1 0 1 1 0 0 +EDGE2 9114 9113 -0.956015 0.0689923 -0.0872822 1 0 1 1 0 0 +EDGE2 9115 9114 -0.966644 0.0562027 -0.0335025 1 0 1 1 0 0 +EDGE2 9116 9115 -0.971501 0.0017512 1.57298 1 0 1 1 0 0 +EDGE2 9117 9116 -1.08858 -0.0238587 -0.0113402 1 0 1 1 0 0 +EDGE2 9118 9117 -1.06695 0.0281446 0.0306551 1 0 1 1 0 0 +EDGE2 9119 6560 0.921666 0.0620897 -3.11542 1 0 1 1 0 0 +EDGE2 9119 6580 1.0265 0.00162423 -3.11401 1 0 1 1 0 0 +EDGE2 9119 9118 -0.992637 0.0336324 -0.0144968 1 0 1 1 0 0 +EDGE2 9120 6579 0.967304 -0.0325203 -3.11424 1 0 1 1 0 0 +EDGE2 9120 6559 0.890096 -0.00542472 -3.14728 1 0 1 1 0 0 +EDGE2 9120 6560 0.0662824 -0.00264605 -3.11209 1 0 1 1 0 0 +EDGE2 9120 6561 -0.095268 -0.992345 -1.57801 1 0 1 1 0 0 +EDGE2 9120 6581 0.00529377 -1.03494 -1.56073 1 0 1 1 0 0 +EDGE2 9120 6580 0.0449194 0.0131269 -3.13321 1 0 1 1 0 0 +EDGE2 9120 9119 -1.0018 -0.00415515 0.0434868 1 0 1 1 0 0 +EDGE2 9121 6560 -1.00188 0.0454087 1.59148 1 0 1 1 0 0 +EDGE2 9121 9120 -0.935117 0.0253071 -1.59855 1 0 1 1 0 0 +EDGE2 9121 6580 -0.963586 -0.0540957 1.57577 1 0 1 1 0 0 +EDGE2 9122 9121 -0.944835 0.0271711 -0.00907785 1 0 1 1 0 0 +EDGE2 9123 9122 -1.01846 -0.0141809 0.00713058 1 0 1 1 0 0 +EDGE2 9124 9123 -0.984912 0.00520205 -0.00489122 1 0 1 1 0 0 +EDGE2 9125 9124 -1.05254 0.0433906 -0.012057 1 0 1 1 0 0 +EDGE2 9126 9125 -0.93177 0.0329427 -1.53524 1 0 1 1 0 0 +EDGE2 9127 9126 -1.00232 -0.0829151 0.00594923 1 0 1 1 0 0 +EDGE2 9128 9127 -1.02995 -0.0220644 0.00322348 1 0 1 1 0 0 +EDGE2 9129 9128 -0.989384 -0.0209966 -0.0250698 1 0 1 1 0 0 +EDGE2 9130 9129 -0.933943 0.0234256 0.00983103 1 0 1 1 0 0 +EDGE2 9131 9130 -0.997782 -0.0255816 1.56297 1 0 1 1 0 0 +EDGE2 9132 9131 -0.963632 -0.0217058 0.0103374 1 0 1 1 0 0 +EDGE2 9133 9132 -1.02158 0.0121149 -0.0206818 1 0 1 1 0 0 +EDGE2 9134 9133 -0.932831 0.035291 -0.00700133 1 0 1 1 0 0 +EDGE2 9135 9134 -0.980772 -0.00584497 -0.00188594 1 0 1 1 0 0 +EDGE2 9136 9135 -1.0239 -0.097066 -1.56773 1 0 1 1 0 0 +EDGE2 9137 9136 -1.00977 0.00286906 -0.014884 1 0 1 1 0 0 +EDGE2 9138 9137 -1.02056 -0.0234424 -0.0196023 1 0 1 1 0 0 +EDGE2 9139 9138 -1.0091 -0.0722562 0.0136575 1 0 1 1 0 0 +EDGE2 9140 9139 -1.03097 0.0511319 0.0340867 1 0 1 1 0 0 +EDGE2 9141 9140 -0.961095 0.117667 1.58587 1 0 1 1 0 0 +EDGE2 9142 9141 -1.04045 -0.0875409 -0.00117807 1 0 1 1 0 0 +EDGE2 9143 9142 -0.953048 0.0553946 -0.0259988 1 0 1 1 0 0 +EDGE2 9144 9143 -0.963396 0.0211156 -0.0248283 1 0 1 1 0 0 +EDGE2 9145 9144 -1.02959 -0.0441053 0.0347765 1 0 1 1 0 0 +EDGE2 9146 9145 -1.14492 -0.00224111 -1.57044 1 0 1 1 0 0 +EDGE2 9147 9146 -0.993637 -0.0939479 0.0314225 1 0 1 1 0 0 +EDGE2 9148 9147 -1.00061 0.0234419 -0.00989295 1 0 1 1 0 0 +EDGE2 9149 9148 -0.957919 0.0605087 -0.042793 1 0 1 1 0 0 +EDGE2 9150 9149 -0.964058 -0.0368748 0.00565274 1 0 1 1 0 0 +EDGE2 9151 9150 -0.987836 0.083566 -1.54132 1 0 1 1 0 0 +EDGE2 9152 9151 -1.00198 0.00566272 0.0261687 1 0 1 1 0 0 +EDGE2 9153 9152 -0.917407 0.0567459 -0.00822599 1 0 1 1 0 0 +EDGE2 9154 9153 -1.03068 0.0580372 -0.014801 1 0 1 1 0 0 +EDGE2 9155 9154 -0.892297 0.0663915 -0.0172804 1 0 1 1 0 0 +EDGE2 9156 9155 -1.01678 0.040587 1.55328 1 0 1 1 0 0 +EDGE2 9157 9156 -1.03235 0.0399526 -0.00787007 1 0 1 1 0 0 +EDGE2 9158 9157 -1.11657 -0.0252283 -0.00407897 1 0 1 1 0 0 +EDGE2 9159 9158 -1.07904 0.00185199 -0.00763656 1 0 1 1 0 0 +EDGE2 9160 9159 -0.992176 -0.117342 0.00316356 1 0 1 1 0 0 +EDGE2 9161 9160 -0.972718 -0.0783158 -1.58825 1 0 1 1 0 0 +EDGE2 9162 9161 -1.00675 -0.0166092 0.00695352 1 0 1 1 0 0 +EDGE2 9163 9162 -0.972615 0.0065956 -0.0102515 1 0 1 1 0 0 +EDGE2 9164 9163 -0.927898 -0.0575097 -0.0289888 1 0 1 1 0 0 +EDGE2 9165 9164 -1.00153 0.036179 -0.012712 1 0 1 1 0 0 +EDGE2 9166 9165 -1.08038 0.0148838 -1.58264 1 0 1 1 0 0 +EDGE2 9167 9166 -0.986829 0.067831 0.00796219 1 0 1 1 0 0 +EDGE2 9168 9167 -1.08215 0.012851 -0.0160282 1 0 1 1 0 0 +EDGE2 9169 9168 -1.06843 -0.105051 0.0106849 1 0 1 1 0 0 +EDGE2 9170 9169 -0.946037 -0.0708706 -0.00667633 1 0 1 1 0 0 +EDGE2 9171 9170 -1.06358 -0.0645115 1.56215 1 0 1 1 0 0 +EDGE2 9172 9171 -0.980371 -0.00181963 0.00221091 1 0 1 1 0 0 +EDGE2 9173 9172 -1.09234 -0.0457752 -0.000806765 1 0 1 1 0 0 +EDGE2 9174 9173 -0.969264 0.0288708 0.0206026 1 0 1 1 0 0 +EDGE2 9175 9174 -1.01059 -0.0642732 0.0102713 1 0 1 1 0 0 +EDGE2 9176 9175 -0.913895 0.00903393 -1.54279 1 0 1 1 0 0 +EDGE2 9177 9176 -0.976613 -0.0278445 -0.0168232 1 0 1 1 0 0 +EDGE2 9178 9177 -1.02022 -0.0683934 -0.0125025 1 0 1 1 0 0 +EDGE2 9179 9178 -0.987226 -0.0302377 0.0139352 1 0 1 1 0 0 +EDGE2 9180 9179 -1.02226 0.0415302 0.00126 1 0 1 1 0 0 +EDGE2 9181 9180 -1.02182 -0.0423883 -1.59438 1 0 1 1 0 0 +EDGE2 9182 9181 -1.01677 -0.0429495 -0.00412613 1 0 1 1 0 0 +EDGE2 9183 9182 -1.04832 -0.0739093 0.0122546 1 0 1 1 0 0 +EDGE2 9184 9183 -1.05188 0.00799076 -0.0122626 1 0 1 1 0 0 +EDGE2 9185 9184 -0.954591 -0.0744943 0.0319715 1 0 1 1 0 0 +EDGE2 9186 9185 -1.15792 0.0338819 -1.55493 1 0 1 1 0 0 +EDGE2 9187 9186 -0.986206 0.0616289 0.00831754 1 0 1 1 0 0 +EDGE2 9188 9187 -1.1188 0.0624141 0.0132599 1 0 1 1 0 0 +EDGE2 9189 9188 -1.01944 -0.06503 -0.03282 1 0 1 1 0 0 +EDGE2 9189 9170 0.992546 0.0529559 -3.14672 1 0 1 1 0 0 +EDGE2 9190 9189 -0.882694 -0.0597499 0.0179486 1 0 1 1 0 0 +EDGE2 9190 9170 0.00603088 0.0478082 -3.14823 1 0 1 1 0 0 +EDGE2 9190 9171 0.0823476 0.971426 1.58244 1 0 1 1 0 0 +EDGE2 9190 9169 1.04394 -0.0218458 -3.12002 1 0 1 1 0 0 +EDGE2 9191 9172 1.00921 0.00160349 0.00217965 1 0 1 1 0 0 +EDGE2 9191 9170 -0.963051 -0.0210244 1.57639 1 0 1 1 0 0 +EDGE2 9191 9171 -0.0658879 -0.0500487 0.00744481 1 0 1 1 0 0 +EDGE2 9191 9190 -1.01134 0.0360904 -1.55946 1 0 1 1 0 0 +EDGE2 9192 9173 0.922265 0.0967282 0.00877169 1 0 1 1 0 0 +EDGE2 9192 9172 0.00608693 0.0853488 -0.0298873 1 0 1 1 0 0 +EDGE2 9192 9171 -0.97216 -0.0212288 -0.0160932 1 0 1 1 0 0 +EDGE2 9192 9191 -0.991989 -0.0338353 -0.00030292 1 0 1 1 0 0 +EDGE2 9193 9173 -0.0713601 0.0395119 -0.0439626 1 0 1 1 0 0 +EDGE2 9193 9174 0.927884 -0.00781141 -0.0178372 1 0 1 1 0 0 +EDGE2 9193 9192 -1.0076 0.0122029 0.0211604 1 0 1 1 0 0 +EDGE2 9193 9172 -1.04086 -0.102248 -0.00959246 1 0 1 1 0 0 +EDGE2 9194 9173 -1.04283 -0.0878096 -0.00758116 1 0 1 1 0 0 +EDGE2 9194 9175 0.966337 -0.09598 -0.00241988 1 0 1 1 0 0 +EDGE2 9194 9174 -0.0455891 -0.0808551 0.0158375 1 0 1 1 0 0 +EDGE2 9194 9193 -1.00307 -0.0499687 0.0164634 1 0 1 1 0 0 +EDGE2 9195 9176 -0.0146499 0.972097 1.5705 1 0 1 1 0 0 +EDGE2 9195 9175 -0.0313987 -0.00123347 0.00265931 1 0 1 1 0 0 +EDGE2 9195 9174 -1.10892 0.0175204 0.012448 1 0 1 1 0 0 +EDGE2 9195 9194 -0.949778 0.0141131 0.0211137 1 0 1 1 0 0 +EDGE2 9196 9195 -0.910649 0.0127312 1.53878 1 0 1 1 0 0 +EDGE2 9196 9175 -1.0175 0.0212756 1.59681 1 0 1 1 0 0 +EDGE2 9197 9196 -1.04214 -0.0464891 0.011082 1 0 1 1 0 0 +EDGE2 9198 9197 -1.03041 0.0692327 0.0262751 1 0 1 1 0 0 +EDGE2 9199 9198 -1.00003 0.0209892 0.0191607 1 0 1 1 0 0 +EDGE2 9200 9199 -1.01566 -0.0578284 0.00964944 1 0 1 1 0 0 +EDGE2 9201 9200 -1.02409 -0.0554013 -1.56655 1 0 1 1 0 0 +EDGE2 9202 9201 -1.006 0.0199369 -0.0161073 1 0 1 1 0 0 +EDGE2 9203 9202 -1.03526 -0.0507723 -0.0240116 1 0 1 1 0 0 +EDGE2 9204 8185 0.983076 -0.0512076 -3.15372 1 0 1 1 0 0 +EDGE2 9204 9203 -0.970894 0.0110777 -0.0206568 1 0 1 1 0 0 +EDGE2 9205 8184 0.901301 -0.101331 -3.15256 1 0 1 1 0 0 +EDGE2 9205 8186 -0.0663998 -1.02407 -1.59116 1 0 1 1 0 0 +EDGE2 9205 8185 -0.0028206 -0.0686419 -3.13257 1 0 1 1 0 0 +EDGE2 9205 9204 -1.07698 -0.0233763 -0.0108813 1 0 1 1 0 0 +EDGE2 9206 8187 0.994075 -0.0804281 -0.0106977 1 0 1 1 0 0 +EDGE2 9206 9205 -0.960677 -0.0911039 1.56641 1 0 1 1 0 0 +EDGE2 9206 8186 0.0335962 0.00384202 0.0112457 1 0 1 1 0 0 +EDGE2 9206 8185 -1.02435 0.0574228 -1.54426 1 0 1 1 0 0 +EDGE2 9207 8187 -0.0148327 0.100952 0.0197758 1 0 1 1 0 0 +EDGE2 9207 8186 -0.951629 0.0858934 0.00149355 1 0 1 1 0 0 +EDGE2 9207 9206 -1.05555 0.0213626 0.0308079 1 0 1 1 0 0 +EDGE2 9207 8188 0.979119 0.102171 -0.00637182 1 0 1 1 0 0 +EDGE2 9208 8189 0.941544 0.0457507 0.0111928 1 0 1 1 0 0 +EDGE2 9208 8187 -0.993574 -0.0304983 0.00401802 1 0 1 1 0 0 +EDGE2 9208 9207 -1.03219 0.00515106 0.0536484 1 0 1 1 0 0 +EDGE2 9208 8188 -0.000435529 -0.100403 -0.0146613 1 0 1 1 0 0 +EDGE2 9209 8189 -0.0469967 0.0299383 0.0163489 1 0 1 1 0 0 +EDGE2 9209 8188 -1.10415 -0.0139679 0.00136265 1 0 1 1 0 0 +EDGE2 9209 9208 -0.962483 -0.00146608 -0.00815259 1 0 1 1 0 0 +EDGE2 9209 8190 0.977852 -0.0357401 0.0126048 1 0 1 1 0 0 +EDGE2 9210 8189 -1.05503 0.00399388 0.00348412 1 0 1 1 0 0 +EDGE2 9210 9209 -1.0434 0.0316936 -0.0317212 1 0 1 1 0 0 +EDGE2 9210 8190 -0.0513881 0.03505 -0.0222665 1 0 1 1 0 0 +EDGE2 9210 8191 -0.126388 -0.970041 -1.57792 1 0 1 1 0 0 +EDGE2 9211 8190 -1.03119 -0.0413195 -1.57065 1 0 1 1 0 0 +EDGE2 9211 9210 -0.96172 -0.0388778 -1.55344 1 0 1 1 0 0 +EDGE2 9212 9211 -0.964036 0.0327801 -0.00820195 1 0 1 1 0 0 +EDGE2 9213 9212 -0.9948 -0.082239 0.0133666 1 0 1 1 0 0 +EDGE2 9214 9213 -1.06049 -0.023977 0.0167492 1 0 1 1 0 0 +EDGE2 9215 9214 -0.997283 -0.00245533 0.0177648 1 0 1 1 0 0 +EDGE2 9216 9215 -0.968886 0.0845216 -1.58161 1 0 1 1 0 0 +EDGE2 9217 9216 -1.0444 0.013236 0.00873868 1 0 1 1 0 0 +EDGE2 9218 9217 -0.968898 0.0727705 -0.0138051 1 0 1 1 0 0 +EDGE2 9219 9218 -0.988894 -0.0388215 -1.70234e-05 1 0 1 1 0 0 +EDGE2 9219 8180 1.02102 -0.0231625 -3.17038 1 0 1 1 0 0 +EDGE2 9220 8179 1.07054 0.079115 -3.15683 1 0 1 1 0 0 +EDGE2 9220 9219 -1.07321 -0.0140788 -0.0214856 1 0 1 1 0 0 +EDGE2 9220 8180 0.0808536 -0.0726619 -3.11468 1 0 1 1 0 0 +EDGE2 9220 8181 0.0114378 1.01901 1.57768 1 0 1 1 0 0 +EDGE2 9221 9220 -0.985244 0.00454203 -1.57274 1 0 1 1 0 0 +EDGE2 9221 8180 -0.985355 0.0489705 1.57553 1 0 1 1 0 0 +EDGE2 9221 8182 1.03591 0.0251554 0.0392931 1 0 1 1 0 0 +EDGE2 9221 8181 0.0759134 -0.00921517 -0.0186098 1 0 1 1 0 0 +EDGE2 9222 9221 -1.06641 -0.00801989 0.0239334 1 0 1 1 0 0 +EDGE2 9222 8182 -0.004966 0.0246527 0.0152731 1 0 1 1 0 0 +EDGE2 9222 8181 -1.01958 -0.00668339 0.0140227 1 0 1 1 0 0 +EDGE2 9222 8183 0.940879 -0.0140248 -0.00737372 1 0 1 1 0 0 +EDGE2 9223 9222 -1.01837 0.00281528 0.0298278 1 0 1 1 0 0 +EDGE2 9223 8182 -1.02408 -0.0674928 -0.00416862 1 0 1 1 0 0 +EDGE2 9223 8183 0.0143518 0.0786878 0.005577 1 0 1 1 0 0 +EDGE2 9223 8184 1.01081 -0.00191352 -0.0164578 1 0 1 1 0 0 +EDGE2 9224 9223 -0.91993 0.0458316 -0.017136 1 0 1 1 0 0 +EDGE2 9224 8183 -1.02906 -0.0630464 -0.00901181 1 0 1 1 0 0 +EDGE2 9224 8184 0.0155833 0.105447 -0.00982288 1 0 1 1 0 0 +EDGE2 9224 9205 1.05671 0.0538936 -3.13783 1 0 1 1 0 0 +EDGE2 9224 8185 0.954532 -0.0039349 0.022974 1 0 1 1 0 0 +EDGE2 9225 8184 -0.930601 -0.0374878 -0.0150891 1 0 1 1 0 0 +EDGE2 9225 9224 -1.01247 -0.0646376 0.0357442 1 0 1 1 0 0 +EDGE2 9225 9205 -0.0335541 0.0478513 -3.17151 1 0 1 1 0 0 +EDGE2 9225 8186 -0.0492306 1.12839 1.55888 1 0 1 1 0 0 +EDGE2 9225 9206 -0.00958803 0.989597 1.58784 1 0 1 1 0 0 +EDGE2 9225 8185 0.0392415 0.00369831 -0.0453889 1 0 1 1 0 0 +EDGE2 9225 9204 0.991513 0.0363273 -3.10961 1 0 1 1 0 0 +EDGE2 9226 9225 -1.00243 -0.0120104 1.57541 1 0 1 1 0 0 +EDGE2 9226 9205 -0.918635 0.0403202 -1.5702 1 0 1 1 0 0 +EDGE2 9226 8185 -1.04394 0.0122097 1.59304 1 0 1 1 0 0 +EDGE2 9227 9226 -1.05334 0.00248263 -0.00661228 1 0 1 1 0 0 +EDGE2 9228 9227 -0.995608 -0.0714066 -0.0140827 1 0 1 1 0 0 +EDGE2 9229 9090 1.09075 -0.0701545 -3.13791 1 0 1 1 0 0 +EDGE2 9229 9228 -0.903393 -0.0732148 0.0125541 1 0 1 1 0 0 +EDGE2 9230 9089 1.01041 -0.00073514 -3.13663 1 0 1 1 0 0 +EDGE2 9230 9229 -1.0084 0.0300643 -0.0169026 1 0 1 1 0 0 +EDGE2 9230 9091 -0.0206498 -0.971004 -1.5329 1 0 1 1 0 0 +EDGE2 9230 9090 0.019086 -0.0341532 -3.14259 1 0 1 1 0 0 +EDGE2 9231 9230 -1.06169 -0.0190139 -1.57521 1 0 1 1 0 0 +EDGE2 9231 9090 -0.992024 0.0137898 1.59856 1 0 1 1 0 0 +EDGE2 9232 9231 -0.963065 0.00611891 -0.0322057 1 0 1 1 0 0 +EDGE2 9233 9232 -0.929442 -0.0378418 0.0362021 1 0 1 1 0 0 +EDGE2 9234 9233 -1.00134 0.0347968 -0.00837599 1 0 1 1 0 0 +EDGE2 9234 9195 0.936539 0.0900551 -3.14584 1 0 1 1 0 0 +EDGE2 9234 9175 0.911034 0.036752 -3.17904 1 0 1 1 0 0 +EDGE2 9235 9176 -0.0124388 -0.982163 -1.59357 1 0 1 1 0 0 +EDGE2 9235 9234 -1.04236 -0.000339818 -0.0151531 1 0 1 1 0 0 +EDGE2 9235 9195 0.0251669 -0.00258008 -3.12074 1 0 1 1 0 0 +EDGE2 9235 9175 -0.0439856 0.0610111 -3.13134 1 0 1 1 0 0 +EDGE2 9235 9174 0.958389 -0.0252809 -3.14448 1 0 1 1 0 0 +EDGE2 9235 9194 1.06318 0.0564791 -3.12781 1 0 1 1 0 0 +EDGE2 9235 9196 0.00842468 1.03418 1.54826 1 0 1 1 0 0 +EDGE2 9236 9176 -0.076083 -0.079443 0.0131889 1 0 1 1 0 0 +EDGE2 9236 9177 1.02652 0.10412 0.00948909 1 0 1 1 0 0 +EDGE2 9236 9195 -1.02393 0.00984438 -1.57502 1 0 1 1 0 0 +EDGE2 9236 9235 -0.97064 0.0508304 1.5477 1 0 1 1 0 0 +EDGE2 9236 9175 -1.03384 0.0858923 -1.56296 1 0 1 1 0 0 +EDGE2 9237 9176 -1.00028 0.0365798 0.0209075 1 0 1 1 0 0 +EDGE2 9237 9178 0.965708 0.00995212 -0.000222411 1 0 1 1 0 0 +EDGE2 9237 9177 -0.0600261 -0.0256733 -0.0258355 1 0 1 1 0 0 +EDGE2 9237 9236 -0.934695 -0.0808881 -0.0162318 1 0 1 1 0 0 +EDGE2 9238 9179 0.947525 -0.00439504 -0.00284078 1 0 1 1 0 0 +EDGE2 9238 9237 -1.08927 0.0483081 -0.0041838 1 0 1 1 0 0 +EDGE2 9238 9178 -0.00971942 0.0294287 0.0145601 1 0 1 1 0 0 +EDGE2 9238 9177 -1.05753 -0.0730188 -0.00925716 1 0 1 1 0 0 +EDGE2 9239 9180 0.94056 0.0982284 0.00261044 1 0 1 1 0 0 +EDGE2 9239 9179 0.00938309 -0.0676233 0.0218642 1 0 1 1 0 0 +EDGE2 9239 9178 -0.927773 -0.00970303 0.00934699 1 0 1 1 0 0 +EDGE2 9239 9238 -0.998293 0.0688052 0.0180493 1 0 1 1 0 0 +EDGE2 9240 9180 0.0227679 0.126422 -0.0134393 1 0 1 1 0 0 +EDGE2 9240 9239 -0.937594 0.0402229 -0.0038192 1 0 1 1 0 0 +EDGE2 9240 9179 -0.993515 0.00164822 -0.0108418 1 0 1 1 0 0 +EDGE2 9240 9181 -0.0212254 0.940451 1.56614 1 0 1 1 0 0 +EDGE2 9241 9240 -0.94109 0.0289758 -1.53529 1 0 1 1 0 0 +EDGE2 9241 9180 -0.929238 0.0619324 -1.54061 1 0 1 1 0 0 +EDGE2 9241 9181 -0.0361691 -0.0138581 0.00949383 1 0 1 1 0 0 +EDGE2 9241 9182 0.993196 -0.0722535 0.0354008 1 0 1 1 0 0 +EDGE2 9242 9241 -0.979681 0.00274646 -0.00155823 1 0 1 1 0 0 +EDGE2 9242 9181 -1.04618 0.00630529 -0.0541779 1 0 1 1 0 0 +EDGE2 9242 9183 1.0452 0.0205965 0.00607147 1 0 1 1 0 0 +EDGE2 9242 9182 -0.0939907 0.0214495 -0.00615044 1 0 1 1 0 0 +EDGE2 9243 9242 -0.970814 0.0640003 -0.0169786 1 0 1 1 0 0 +EDGE2 9243 9184 1.04288 0.0594601 0.00807409 1 0 1 1 0 0 +EDGE2 9243 9183 -0.104466 0.0881494 -0.00478638 1 0 1 1 0 0 +EDGE2 9243 9182 -1.0521 0.00147588 0.0213792 1 0 1 1 0 0 +EDGE2 9244 9184 0.0373362 0.0212454 -0.0383588 1 0 1 1 0 0 +EDGE2 9244 9183 -1.05341 -0.0393779 0.00120432 1 0 1 1 0 0 +EDGE2 9244 9243 -1.02566 0.0947282 -0.00437883 1 0 1 1 0 0 +EDGE2 9244 9185 0.998588 -0.00941045 0.00861424 1 0 1 1 0 0 +EDGE2 9245 9184 -1.01585 0.00710029 0.00108316 1 0 1 1 0 0 +EDGE2 9245 9244 -0.977249 -0.00874943 -0.000862332 1 0 1 1 0 0 +EDGE2 9245 9185 -0.000112825 0.0544785 -0.00574895 1 0 1 1 0 0 +EDGE2 9245 9186 0.0132289 1.07124 1.5732 1 0 1 1 0 0 +EDGE2 9246 9185 -0.977326 -0.0685669 -1.56703 1 0 1 1 0 0 +EDGE2 9246 9245 -1.01204 0.0906741 -1.54969 1 0 1 1 0 0 +EDGE2 9246 9186 -0.00601147 0.0295693 -0.00686685 1 0 1 1 0 0 +EDGE2 9246 9187 1.0593 0.00600132 0.00912122 1 0 1 1 0 0 +EDGE2 9247 9246 -1.05873 -0.010594 -0.00554997 1 0 1 1 0 0 +EDGE2 9247 9186 -0.96231 0.0274284 -0.0185023 1 0 1 1 0 0 +EDGE2 9247 9187 -0.0324558 -0.00545599 -0.00832374 1 0 1 1 0 0 +EDGE2 9247 9188 1.04698 -0.0335259 -0.0404831 1 0 1 1 0 0 +EDGE2 9248 9247 -0.988488 0.0237595 -0.0060087 1 0 1 1 0 0 +EDGE2 9248 9187 -0.943848 -0.00262999 0.0230811 1 0 1 1 0 0 +EDGE2 9248 9189 1.08238 0.00607578 -0.0114527 1 0 1 1 0 0 +EDGE2 9248 9188 -0.0698259 0.0334592 -0.0170577 1 0 1 1 0 0 +EDGE2 9249 9189 0.00170368 0.032833 -0.000843221 1 0 1 1 0 0 +EDGE2 9249 9188 -1.00137 0.0300607 -0.0127104 1 0 1 1 0 0 +EDGE2 9249 9248 -1.02284 0.0361294 -0.0109423 1 0 1 1 0 0 +EDGE2 9249 9170 1.05135 0.0125794 -3.13596 1 0 1 1 0 0 +EDGE2 9249 9190 0.965414 0.0333097 0.0133761 1 0 1 1 0 0 +EDGE2 9250 9189 -0.922819 -0.0684286 -0.0188093 1 0 1 1 0 0 +EDGE2 9250 9249 -0.997438 0.0923893 -0.0113883 1 0 1 1 0 0 +EDGE2 9250 9170 -0.0677413 0.0511955 -3.17435 1 0 1 1 0 0 +EDGE2 9250 9171 0.0338325 1.02374 1.59664 1 0 1 1 0 0 +EDGE2 9250 9191 0.0302748 1.09121 1.59856 1 0 1 1 0 0 +EDGE2 9250 9190 0.0233319 0.0477173 0.0214378 1 0 1 1 0 0 +EDGE2 9250 9169 1.06402 -0.0207029 -3.13687 1 0 1 1 0 0 +EDGE2 9251 9192 0.987476 -0.0423435 -0.0259893 1 0 1 1 0 0 +EDGE2 9251 9172 0.961992 -0.000699546 0.0204405 1 0 1 1 0 0 +EDGE2 9251 9170 -1.07707 0.0542544 1.56101 1 0 1 1 0 0 +EDGE2 9251 9250 -1.07317 0.098863 -1.577 1 0 1 1 0 0 +EDGE2 9251 9171 0.06931 0.0712878 -0.038266 1 0 1 1 0 0 +EDGE2 9251 9191 -0.00598992 -0.00054653 0.0206707 1 0 1 1 0 0 +EDGE2 9251 9190 -1.1047 -0.0249025 -1.586 1 0 1 1 0 0 +EDGE2 9252 9251 -1.09786 -0.0504522 0.00477751 1 0 1 1 0 0 +EDGE2 9252 9173 0.974118 -0.0291529 -0.00265281 1 0 1 1 0 0 +EDGE2 9252 9193 0.982331 0.0654228 -0.0107417 1 0 1 1 0 0 +EDGE2 9252 9192 -0.0612058 0.128372 -0.0174215 1 0 1 1 0 0 +EDGE2 9252 9172 0.0183442 -0.0787177 0.00666963 1 0 1 1 0 0 +EDGE2 9252 9171 -1.05828 0.0477214 0.0105968 1 0 1 1 0 0 +EDGE2 9252 9191 -1.0113 0.0258619 0.0141375 1 0 1 1 0 0 +EDGE2 9253 9173 -0.132364 0.0253882 0.00932701 1 0 1 1 0 0 +EDGE2 9253 9174 1.04379 0.0492932 0.00332534 1 0 1 1 0 0 +EDGE2 9253 9194 1.04808 0.0535347 0.00875638 1 0 1 1 0 0 +EDGE2 9253 9193 0.108912 0.0483458 0.0233756 1 0 1 1 0 0 +EDGE2 9253 9192 -1.00448 -0.0688416 -0.029079 1 0 1 1 0 0 +EDGE2 9253 9252 -1.0225 0.0395717 0.0139781 1 0 1 1 0 0 +EDGE2 9253 9172 -0.994153 0.0513203 -0.0127796 1 0 1 1 0 0 +EDGE2 9254 9173 -0.946021 0.0444302 -0.0154569 1 0 1 1 0 0 +EDGE2 9254 9195 0.956356 0.00673755 -0.0212104 1 0 1 1 0 0 +EDGE2 9254 9235 1.06074 -0.0753917 -3.11527 1 0 1 1 0 0 +EDGE2 9254 9175 1.01902 0.0195034 -0.00367196 1 0 1 1 0 0 +EDGE2 9254 9253 -0.952518 -0.00892749 0.000231958 1 0 1 1 0 0 +EDGE2 9254 9174 0.0350361 0.0440835 -0.0109646 1 0 1 1 0 0 +EDGE2 9254 9194 -0.0107883 -0.0646211 0.0113692 1 0 1 1 0 0 +EDGE2 9254 9193 -0.99626 -0.0479706 0.0324295 1 0 1 1 0 0 +EDGE2 9255 9176 0.00283499 1.06219 1.53905 1 0 1 1 0 0 +EDGE2 9255 9236 0.00381686 1.05988 1.56165 1 0 1 1 0 0 +EDGE2 9255 9234 0.900945 0.0982834 -3.11704 1 0 1 1 0 0 +EDGE2 9255 9254 -0.957504 -0.0600158 -0.0163025 1 0 1 1 0 0 +EDGE2 9255 9195 -0.0562708 -0.0495905 0.00726073 1 0 1 1 0 0 +EDGE2 9255 9235 0.0247323 0.00651823 -3.14079 1 0 1 1 0 0 +EDGE2 9255 9175 -0.0318395 -0.0681205 -0.0145156 1 0 1 1 0 0 +EDGE2 9255 9174 -0.962676 -0.0748282 -0.0142043 1 0 1 1 0 0 +EDGE2 9255 9194 -0.963916 0.0283269 -0.00144642 1 0 1 1 0 0 +EDGE2 9255 9196 0.0300155 -1.01512 -1.55144 1 0 1 1 0 0 +EDGE2 9256 9176 -0.0462079 -0.0914925 -0.00984826 1 0 1 1 0 0 +EDGE2 9256 9237 0.904011 0.0156052 -0.000660672 1 0 1 1 0 0 +EDGE2 9256 9177 1.0669 -0.0564228 -0.013808 1 0 1 1 0 0 +EDGE2 9256 9236 -0.0344276 -0.00831733 -0.00397474 1 0 1 1 0 0 +EDGE2 9256 9195 -0.961766 -0.041024 -1.58801 1 0 1 1 0 0 +EDGE2 9256 9235 -0.937968 0.0219655 1.60953 1 0 1 1 0 0 +EDGE2 9256 9255 -0.946088 0.0299474 -1.54147 1 0 1 1 0 0 +EDGE2 9256 9175 -0.949228 -0.0162068 -1.54708 1 0 1 1 0 0 +EDGE2 9257 9176 -0.987477 0.00165318 -0.00852898 1 0 1 1 0 0 +EDGE2 9257 9237 -0.0133781 0.0345184 0.0660654 1 0 1 1 0 0 +EDGE2 9257 9178 0.923221 0.00321484 0.0159068 1 0 1 1 0 0 +EDGE2 9257 9238 1.12484 0.0836319 0.0131538 1 0 1 1 0 0 +EDGE2 9257 9177 -0.0027183 0.0358788 -0.0225805 1 0 1 1 0 0 +EDGE2 9257 9236 -1.03668 -0.0132282 0.0271181 1 0 1 1 0 0 +EDGE2 9257 9256 -0.962244 -0.111446 0.010544 1 0 1 1 0 0 +EDGE2 9258 9239 1.03143 -0.127065 -0.000300334 1 0 1 1 0 0 +EDGE2 9258 9179 0.974523 0.0868628 -0.0228585 1 0 1 1 0 0 +EDGE2 9258 9237 -0.995955 -0.0244926 0.000254257 1 0 1 1 0 0 +EDGE2 9258 9178 -0.0188211 0.0436798 -0.00342311 1 0 1 1 0 0 +EDGE2 9258 9238 0.0432934 0.0655561 -0.0188172 1 0 1 1 0 0 +EDGE2 9258 9257 -0.940028 0.0770542 0.00914973 1 0 1 1 0 0 +EDGE2 9258 9177 -0.979758 -0.0467187 0.0114073 1 0 1 1 0 0 +EDGE2 9259 9240 0.972469 -0.0435541 -0.0118893 1 0 1 1 0 0 +EDGE2 9259 9180 0.956535 0.0705048 0.04909 1 0 1 1 0 0 +EDGE2 9259 9239 -8.93842e-06 -0.00719074 -0.0135669 1 0 1 1 0 0 +EDGE2 9259 9179 -0.0300322 -0.0718784 0.0198407 1 0 1 1 0 0 +EDGE2 9259 9178 -0.978322 0.0167071 -0.0222488 1 0 1 1 0 0 +EDGE2 9259 9238 -1.03832 0.0755684 0.0139739 1 0 1 1 0 0 +EDGE2 9259 9258 -0.95132 -0.0701328 -0.00813176 1 0 1 1 0 0 +EDGE2 9260 9240 -0.0295763 -0.0986912 0.00159846 1 0 1 1 0 0 +EDGE2 9260 9180 -0.039376 0.0367296 0.00448707 1 0 1 1 0 0 +EDGE2 9260 9239 -1.03327 -0.0726485 0.0158827 1 0 1 1 0 0 +EDGE2 9260 9259 -0.982696 0.000471968 0.0128542 1 0 1 1 0 0 +EDGE2 9260 9179 -0.970317 0.0264861 0.0335562 1 0 1 1 0 0 +EDGE2 9260 9241 0.0495787 0.960311 1.56952 1 0 1 1 0 0 +EDGE2 9260 9181 -0.0354639 0.95532 1.55804 1 0 1 1 0 0 +EDGE2 9261 9240 -1.02843 0.112989 1.57952 1 0 1 1 0 0 +EDGE2 9261 9260 -1.05283 0.0761046 1.586 1 0 1 1 0 0 +EDGE2 9261 9180 -1.02878 0.0437818 1.5929 1 0 1 1 0 0 +EDGE2 9262 9261 -1.03488 -0.111145 -0.0211461 1 0 1 1 0 0 +EDGE2 9263 9262 -1.08344 -0.0458245 -0.0189257 1 0 1 1 0 0 +EDGE2 9264 9263 -1.02553 0.0526769 0.0132543 1 0 1 1 0 0 +EDGE2 9264 9085 1.05793 -0.0257185 -3.1559 1 0 1 1 0 0 +EDGE2 9264 9105 1.0051 -0.0177257 -3.1243 1 0 1 1 0 0 +EDGE2 9265 9264 -1.08392 -0.0125489 -0.0106576 1 0 1 1 0 0 +EDGE2 9265 9106 -0.0105591 1.00022 1.60698 1 0 1 1 0 0 +EDGE2 9265 9085 -0.0117362 0.0434292 -3.14788 1 0 1 1 0 0 +EDGE2 9265 9084 0.969066 -0.0294415 -3.12965 1 0 1 1 0 0 +EDGE2 9265 9104 1.02143 -0.058833 -3.1139 1 0 1 1 0 0 +EDGE2 9265 9105 -0.0447943 -0.0425885 -3.17962 1 0 1 1 0 0 +EDGE2 9265 9086 0.0634023 -1.0249 -1.59171 1 0 1 1 0 0 +EDGE2 9266 9265 -0.975435 -0.00348544 1.57624 1 0 1 1 0 0 +EDGE2 9266 9085 -0.96094 -0.0316686 -1.57342 1 0 1 1 0 0 +EDGE2 9266 9105 -1.07339 -0.00963056 -1.54323 1 0 1 1 0 0 +EDGE2 9266 9086 0.0588632 0.00973327 -0.00405142 1 0 1 1 0 0 +EDGE2 9266 9087 0.983636 -0.013099 0.0250045 1 0 1 1 0 0 +EDGE2 9267 9266 -0.965826 -0.028821 0.0110619 1 0 1 1 0 0 +EDGE2 9267 9088 1.04888 0.0429993 -0.0239281 1 0 1 1 0 0 +EDGE2 9267 9086 -0.996389 0.0502632 -0.0118182 1 0 1 1 0 0 +EDGE2 9267 9087 0.0608801 -0.0768626 0.0187609 1 0 1 1 0 0 +EDGE2 9268 9089 1.05229 0.0965132 0.000794615 1 0 1 1 0 0 +EDGE2 9268 9088 0.0204295 -0.0304012 0.0247696 1 0 1 1 0 0 +EDGE2 9268 9267 -1.02998 0.059435 -0.0113743 1 0 1 1 0 0 +EDGE2 9268 9087 -1.13539 0.0169549 -0.0208371 1 0 1 1 0 0 +EDGE2 9269 9089 0.0296562 0.0163606 0.026509 1 0 1 1 0 0 +EDGE2 9269 9088 -1.02259 0.0535666 0.0167125 1 0 1 1 0 0 +EDGE2 9269 9268 -0.985682 0.0372234 0.00245287 1 0 1 1 0 0 +EDGE2 9269 9230 0.951678 -0.0148464 -3.13467 1 0 1 1 0 0 +EDGE2 9269 9090 0.965824 0.0469896 0.0212748 1 0 1 1 0 0 +EDGE2 9270 9089 -1.05597 -0.00518819 0.00585297 1 0 1 1 0 0 +EDGE2 9270 9269 -0.980012 0.101431 -0.00730708 1 0 1 1 0 0 +EDGE2 9270 9229 1.10645 -0.0559766 -3.17026 1 0 1 1 0 0 +EDGE2 9270 9091 0.0306704 1.0228 1.57511 1 0 1 1 0 0 +EDGE2 9270 9230 0.0327416 -0.0211398 -3.11567 1 0 1 1 0 0 +EDGE2 9270 9090 -0.0596458 0.0206281 -0.0216479 1 0 1 1 0 0 +EDGE2 9270 9231 0.0287711 -0.975289 -1.57016 1 0 1 1 0 0 +EDGE2 9271 9092 0.998734 -0.041747 0.0116995 1 0 1 1 0 0 +EDGE2 9271 9091 -0.000344109 -0.0588355 -0.0104211 1 0 1 1 0 0 +EDGE2 9271 9230 -0.998328 -0.00664666 1.55674 1 0 1 1 0 0 +EDGE2 9271 9270 -1.05981 0.0456879 -1.5609 1 0 1 1 0 0 +EDGE2 9271 9090 -0.903887 0.0193921 -1.6042 1 0 1 1 0 0 +EDGE2 9272 9093 1.04845 -0.00512632 0.000522261 1 0 1 1 0 0 +EDGE2 9272 9092 0.0187984 0.00121356 0.00569605 1 0 1 1 0 0 +EDGE2 9272 9271 -0.994165 -0.11232 -0.00511631 1 0 1 1 0 0 +EDGE2 9272 9091 -0.988954 -0.0391424 -0.000559028 1 0 1 1 0 0 +EDGE2 9273 9094 1.09808 -0.113568 -0.0214503 1 0 1 1 0 0 +EDGE2 9273 9093 0.0609922 0.00437089 -0.0171467 1 0 1 1 0 0 +EDGE2 9273 9092 -0.972999 0.0353027 0.014713 1 0 1 1 0 0 +EDGE2 9273 9272 -1.03295 -0.0087833 0.00127016 1 0 1 1 0 0 +EDGE2 9274 9075 1.02254 0.0959409 -3.10652 1 0 1 1 0 0 +EDGE2 9274 9095 0.982899 -0.0369115 0.00991814 1 0 1 1 0 0 +EDGE2 9274 9094 0.0551965 -0.0249977 0.00749778 1 0 1 1 0 0 +EDGE2 9274 9093 -1.00207 -0.177428 0.00464378 1 0 1 1 0 0 +EDGE2 9274 9273 -1.0681 -0.0458947 -0.0149584 1 0 1 1 0 0 +EDGE2 9274 8175 1.04695 -0.0502821 -3.14231 1 0 1 1 0 0 +EDGE2 9275 9096 -0.0935954 0.984129 1.59287 1 0 1 1 0 0 +EDGE2 9275 9076 0.052391 1.05829 1.51984 1 0 1 1 0 0 +EDGE2 9275 9074 0.95882 -0.000590894 -3.11948 1 0 1 1 0 0 +EDGE2 9275 9075 0.00624239 0.00418506 -3.11421 1 0 1 1 0 0 +EDGE2 9275 9095 -0.0444405 -0.03347 -0.0260905 1 0 1 1 0 0 +EDGE2 9275 9274 -1.04642 0.0848915 -0.0141501 1 0 1 1 0 0 +EDGE2 9275 9094 -0.990471 0.0130147 -0.0251082 1 0 1 1 0 0 +EDGE2 9275 8175 -0.137095 0.00402007 -3.12161 1 0 1 1 0 0 +EDGE2 9275 8174 1.06256 0.0188443 -3.13378 1 0 1 1 0 0 +EDGE2 9275 8176 0.0254843 -1.00644 -1.56064 1 0 1 1 0 0 +EDGE2 9276 9077 0.959602 0.0312391 -0.0026743 1 0 1 1 0 0 +EDGE2 9276 9097 1.00343 -0.0310483 0.0074828 1 0 1 1 0 0 +EDGE2 9276 9096 -0.0768961 -0.0310621 0.00858654 1 0 1 1 0 0 +EDGE2 9276 9076 0.0072727 -0.019211 -0.0122794 1 0 1 1 0 0 +EDGE2 9276 9075 -0.966695 0.0232082 1.56344 1 0 1 1 0 0 +EDGE2 9276 9275 -0.980634 -0.137607 -1.56683 1 0 1 1 0 0 +EDGE2 9276 9095 -1.05086 -0.0778387 -1.60156 1 0 1 1 0 0 +EDGE2 9276 8175 -1.08081 0.0851293 1.54913 1 0 1 1 0 0 +EDGE2 9277 9098 0.988712 -0.00281838 -0.0530206 1 0 1 1 0 0 +EDGE2 9277 9078 1.04798 0.065949 0.0182783 1 0 1 1 0 0 +EDGE2 9277 9077 0.0493384 0.0596114 0.00466498 1 0 1 1 0 0 +EDGE2 9277 9097 0.0547025 -0.0265917 -0.00982417 1 0 1 1 0 0 +EDGE2 9277 9096 -1.01167 0.0312685 0.00810946 1 0 1 1 0 0 +EDGE2 9277 9276 -0.976875 -0.0710178 0.0232794 1 0 1 1 0 0 +EDGE2 9277 9076 -0.973601 -0.00954474 -0.0335627 1 0 1 1 0 0 +EDGE2 9278 9099 0.981527 -0.0289061 0.0147129 1 0 1 1 0 0 +EDGE2 9278 9079 0.995382 0.00394156 0.0186272 1 0 1 1 0 0 +EDGE2 9278 9098 0.0260544 -0.0468121 -0.0306724 1 0 1 1 0 0 +EDGE2 9278 9078 0.0328969 -0.0028369 -0.0122366 1 0 1 1 0 0 +EDGE2 9278 9077 -1.05642 0.0300991 0.025076 1 0 1 1 0 0 +EDGE2 9278 9097 -0.997354 -0.000137578 0.0265195 1 0 1 1 0 0 +EDGE2 9278 9277 -1.03541 -0.0227802 0.0239695 1 0 1 1 0 0 +EDGE2 9279 8120 0.991433 -0.0241861 -3.13663 1 0 1 1 0 0 +EDGE2 9279 9080 1.01891 0.0204442 0.0119564 1 0 1 1 0 0 +EDGE2 9279 9100 0.941009 -0.0115109 0.000355677 1 0 1 1 0 0 +EDGE2 9279 9099 0.0419134 0.00427287 -0.00685972 1 0 1 1 0 0 +EDGE2 9279 9079 0.0218493 0.0173797 -0.0115432 1 0 1 1 0 0 +EDGE2 9279 9098 -0.994176 0.0258135 -0.000473887 1 0 1 1 0 0 +EDGE2 9279 9278 -0.983715 -0.0703889 0.0105754 1 0 1 1 0 0 +EDGE2 9279 9078 -1.00576 -0.134893 0.0269782 1 0 1 1 0 0 +EDGE2 9280 8120 0.000101491 0.0388482 -3.13322 1 0 1 1 0 0 +EDGE2 9280 8119 1.08835 0.00407606 -3.15395 1 0 1 1 0 0 +EDGE2 9280 9081 -0.0137219 1.06314 1.56864 1 0 1 1 0 0 +EDGE2 9280 9101 0.0705971 0.910954 1.58088 1 0 1 1 0 0 +EDGE2 9280 9080 -0.0905979 -0.0115431 0.0179525 1 0 1 1 0 0 +EDGE2 9280 9100 0.0403383 0.0596712 0.0217563 1 0 1 1 0 0 +EDGE2 9280 8121 -0.0398103 -0.972941 -1.57803 1 0 1 1 0 0 +EDGE2 9280 9099 -0.982252 0.0617628 0.0253683 1 0 1 1 0 0 +EDGE2 9280 9279 -1.04168 0.00048471 -0.0189764 1 0 1 1 0 0 +EDGE2 9280 9079 -1.14543 -0.0709912 0.0124436 1 0 1 1 0 0 +EDGE2 9281 8120 -1.02255 0.036439 1.58142 1 0 1 1 0 0 +EDGE2 9281 9280 -1.00354 -0.00104413 -1.60353 1 0 1 1 0 0 +EDGE2 9281 9081 -0.00358826 -0.0494032 -0.0300777 1 0 1 1 0 0 +EDGE2 9281 9101 -0.0430504 -0.0659234 -0.0132576 1 0 1 1 0 0 +EDGE2 9281 9080 -1.07876 0.070777 -1.61128 1 0 1 1 0 0 +EDGE2 9281 9100 -0.969933 -0.0582998 -1.52981 1 0 1 1 0 0 +EDGE2 9281 9082 0.951597 0.121888 0.0241914 1 0 1 1 0 0 +EDGE2 9281 9102 0.877094 0.00723556 -0.0539399 1 0 1 1 0 0 +EDGE2 9282 9081 -0.949077 0.0544893 0.0172563 1 0 1 1 0 0 +EDGE2 9282 9101 -0.985276 -0.0101145 0.0228129 1 0 1 1 0 0 +EDGE2 9282 9281 -0.996678 -0.00196301 -0.00245508 1 0 1 1 0 0 +EDGE2 9282 9082 -0.0244819 -0.00477083 0.0120574 1 0 1 1 0 0 +EDGE2 9282 9102 0.0149625 -0.0357326 0.029514 1 0 1 1 0 0 +EDGE2 9282 9103 1.00432 -0.0145825 0.00174164 1 0 1 1 0 0 +EDGE2 9282 9083 1.01282 -0.0350532 0.00654626 1 0 1 1 0 0 +EDGE2 9283 9082 -0.999674 -0.00340949 0.0100965 1 0 1 1 0 0 +EDGE2 9283 9102 -1.01425 -0.0909657 -0.000666887 1 0 1 1 0 0 +EDGE2 9283 9282 -0.947639 0.0361908 0.033525 1 0 1 1 0 0 +EDGE2 9283 9103 0.0366753 0.0680543 -0.00256356 1 0 1 1 0 0 +EDGE2 9283 9083 0.0577951 0.0246007 -0.00773725 1 0 1 1 0 0 +EDGE2 9283 9084 0.948252 -0.0818193 -0.0107818 1 0 1 1 0 0 +EDGE2 9283 9104 1.05431 -0.00648197 0.0103701 1 0 1 1 0 0 +EDGE2 9284 9103 -0.892945 0.00154561 -0.018011 1 0 1 1 0 0 +EDGE2 9284 9283 -0.96759 0.130138 -0.0103241 1 0 1 1 0 0 +EDGE2 9284 9083 -0.944825 0.0108484 -0.004126 1 0 1 1 0 0 +EDGE2 9284 9265 0.981944 0.110903 -3.11695 1 0 1 1 0 0 +EDGE2 9284 9085 1.04097 -0.0105356 -0.0144653 1 0 1 1 0 0 +EDGE2 9284 9084 -0.0189715 0.0706303 0.0162199 1 0 1 1 0 0 +EDGE2 9284 9104 0.0214582 0.00403895 -0.0143626 1 0 1 1 0 0 +EDGE2 9284 9105 0.967801 0.00241502 -0.0175829 1 0 1 1 0 0 +EDGE2 9285 9264 0.878253 -0.00171613 -3.12461 1 0 1 1 0 0 +EDGE2 9285 9265 0.0597267 -0.0130243 -3.16229 1 0 1 1 0 0 +EDGE2 9285 9106 -0.00924664 -1.10966 -1.58172 1 0 1 1 0 0 +EDGE2 9285 9085 -0.024545 -0.0182676 -0.0225656 1 0 1 1 0 0 +EDGE2 9285 9084 -0.927692 0.0121673 -0.0224133 1 0 1 1 0 0 +EDGE2 9285 9284 -0.924118 -0.0648357 -0.0141255 1 0 1 1 0 0 +EDGE2 9285 9104 -1.02807 0.0115169 0.00881226 1 0 1 1 0 0 +EDGE2 9285 9105 0.00222622 0.0375268 0.016954 1 0 1 1 0 0 +EDGE2 9285 9266 0.0326589 1.01816 1.5733 1 0 1 1 0 0 +EDGE2 9285 9086 -0.0714568 1.01305 1.55769 1 0 1 1 0 0 +EDGE2 9286 9265 -1.04607 -0.0215706 1.55201 1 0 1 1 0 0 +EDGE2 9286 9085 -0.930947 0.0403845 -1.58635 1 0 1 1 0 0 +EDGE2 9286 9285 -1.02848 -0.046648 -1.53063 1 0 1 1 0 0 +EDGE2 9286 9105 -1.04605 0.0176041 -1.55605 1 0 1 1 0 0 +EDGE2 9286 9266 0.00119059 -0.0210978 -0.00591994 1 0 1 1 0 0 +EDGE2 9286 9267 1.05887 0.0144007 0.0123986 1 0 1 1 0 0 +EDGE2 9286 9086 0.0118444 0.0190459 -0.00994428 1 0 1 1 0 0 +EDGE2 9286 9087 0.996722 0.0150108 0.0429339 1 0 1 1 0 0 +EDGE2 9287 9266 -1.01342 0.0312974 -0.00813341 1 0 1 1 0 0 +EDGE2 9287 9088 0.954667 0.0401155 -0.0163042 1 0 1 1 0 0 +EDGE2 9287 9267 -0.0192169 -0.0366285 0.00325377 1 0 1 1 0 0 +EDGE2 9287 9086 -1.02545 -0.0333685 0.0175858 1 0 1 1 0 0 +EDGE2 9287 9286 -1.00615 -0.048059 0.00853494 1 0 1 1 0 0 +EDGE2 9287 9268 1.04057 -0.0349404 -0.0247878 1 0 1 1 0 0 +EDGE2 9287 9087 0.0404285 0.0473491 -0.0247928 1 0 1 1 0 0 +EDGE2 9288 9089 1.00451 -0.0312832 0.0198429 1 0 1 1 0 0 +EDGE2 9288 9088 -0.0454329 0.0257557 -0.0116411 1 0 1 1 0 0 +EDGE2 9288 9287 -0.985522 0.00240975 -0.0128389 1 0 1 1 0 0 +EDGE2 9288 9267 -0.999439 -0.00390754 -0.0355981 1 0 1 1 0 0 +EDGE2 9288 9268 0.0723439 -0.0572819 -0.0228259 1 0 1 1 0 0 +EDGE2 9288 9087 -1.1564 -0.0296523 -0.00450411 1 0 1 1 0 0 +EDGE2 9288 9269 1.02348 -0.0478442 0.005682 1 0 1 1 0 0 +EDGE2 9289 9089 0.0222692 0.00374675 0.0283778 1 0 1 1 0 0 +EDGE2 9289 9088 -1.06157 -0.02366 0.0216175 1 0 1 1 0 0 +EDGE2 9289 9268 -1.05075 0.0220812 0.0343165 1 0 1 1 0 0 +EDGE2 9289 9288 -1.00345 -0.0523675 -0.0171696 1 0 1 1 0 0 +EDGE2 9289 9269 -0.057662 0.0463326 -0.0134142 1 0 1 1 0 0 +EDGE2 9289 9230 1.03144 0.0211664 -3.18592 1 0 1 1 0 0 +EDGE2 9289 9270 1.07082 0.0359175 -0.0491258 1 0 1 1 0 0 +EDGE2 9289 9090 1.03485 0.0388926 0.020552 1 0 1 1 0 0 +EDGE2 9290 9089 -0.993943 -0.0990309 -0.00801612 1 0 1 1 0 0 +EDGE2 9290 9289 -1.00801 -0.0782773 -0.00890539 1 0 1 1 0 0 +EDGE2 9290 9269 -1.01739 -0.0420881 -0.00465253 1 0 1 1 0 0 +EDGE2 9290 9229 1.03832 -0.00302028 -3.14376 1 0 1 1 0 0 +EDGE2 9290 9271 -0.0254143 0.986594 1.57382 1 0 1 1 0 0 +EDGE2 9290 9091 0.0380129 0.973012 1.59284 1 0 1 1 0 0 +EDGE2 9290 9230 -0.00217335 -0.0169709 -3.11473 1 0 1 1 0 0 +EDGE2 9290 9270 -0.0207958 -0.0171487 -0.0112977 1 0 1 1 0 0 +EDGE2 9290 9090 0.0345008 0.029807 0.00771576 1 0 1 1 0 0 +EDGE2 9290 9231 0.0380382 -1.02844 -1.58154 1 0 1 1 0 0 +EDGE2 9291 9092 0.997172 -0.0115002 0.00218416 1 0 1 1 0 0 +EDGE2 9291 9272 0.944662 -0.0398358 0.0496915 1 0 1 1 0 0 +EDGE2 9291 9271 0.00272571 0.0647876 -0.00977781 1 0 1 1 0 0 +EDGE2 9291 9091 0.0153537 0.0249811 0.0148646 1 0 1 1 0 0 +EDGE2 9291 9230 -0.957177 0.00178514 1.57759 1 0 1 1 0 0 +EDGE2 9291 9270 -1.03193 -0.0404117 -1.58806 1 0 1 1 0 0 +EDGE2 9291 9290 -1.0739 -0.0294902 -1.54148 1 0 1 1 0 0 +EDGE2 9291 9090 -1.03241 -0.0443639 -1.56537 1 0 1 1 0 0 +EDGE2 9292 9093 0.9969 0.000911131 0.0641941 1 0 1 1 0 0 +EDGE2 9292 9273 1.035 -0.0366049 -0.010478 1 0 1 1 0 0 +EDGE2 9292 9092 0.0272353 -0.00813005 0.00951498 1 0 1 1 0 0 +EDGE2 9292 9272 -0.0137801 -0.078866 0.00812683 1 0 1 1 0 0 +EDGE2 9292 9271 -1.03908 -0.0131054 -0.00910627 1 0 1 1 0 0 +EDGE2 9292 9291 -1.02218 -0.00749232 -0.021098 1 0 1 1 0 0 +EDGE2 9292 9091 -1.00271 0.00372996 -0.0106609 1 0 1 1 0 0 +EDGE2 9293 9274 0.933426 -0.0670777 0.0132499 1 0 1 1 0 0 +EDGE2 9293 9094 0.909877 0.0733554 -0.0185783 1 0 1 1 0 0 +EDGE2 9293 9292 -0.984268 0.0216692 0.0153513 1 0 1 1 0 0 +EDGE2 9293 9093 1.88528e-05 0.0431808 0.0254652 1 0 1 1 0 0 +EDGE2 9293 9273 -0.0248056 -0.0983466 -0.007038 1 0 1 1 0 0 +EDGE2 9293 9092 -1.01561 0.0613755 -0.00372953 1 0 1 1 0 0 +EDGE2 9293 9272 -1.02272 0.0244398 -0.00183264 1 0 1 1 0 0 +EDGE2 9294 9075 0.991037 0.0086475 -3.18402 1 0 1 1 0 0 +EDGE2 9294 9275 1.01444 -0.0392566 -0.0412843 1 0 1 1 0 0 +EDGE2 9294 9095 0.950041 0.0139465 -0.00650968 1 0 1 1 0 0 +EDGE2 9294 9274 0.0134643 0.00677405 0.035643 1 0 1 1 0 0 +EDGE2 9294 9094 0.047554 0.0138146 0.0100288 1 0 1 1 0 0 +EDGE2 9294 9093 -0.933966 -0.0748856 -0.0111456 1 0 1 1 0 0 +EDGE2 9294 9273 -0.970911 0.0334358 -0.0154529 1 0 1 1 0 0 +EDGE2 9294 9293 -1.07382 -0.0142689 -0.0241772 1 0 1 1 0 0 +EDGE2 9294 8175 1.063 0.0327736 -3.1667 1 0 1 1 0 0 +EDGE2 9295 9096 0.0654913 0.996962 1.57147 1 0 1 1 0 0 +EDGE2 9295 9276 -0.0397739 1.05389 1.5711 1 0 1 1 0 0 +EDGE2 9295 9076 -0.0318872 1.06637 1.53383 1 0 1 1 0 0 +EDGE2 9295 9074 1.05723 0.0457522 -3.13824 1 0 1 1 0 0 +EDGE2 9295 9075 -0.00462925 0.024866 -3.1554 1 0 1 1 0 0 +EDGE2 9295 9275 -0.0210136 -0.0232569 0.00269298 1 0 1 1 0 0 +EDGE2 9295 9095 -0.0359253 -0.00603653 -0.0125767 1 0 1 1 0 0 +EDGE2 9295 9274 -0.987116 0.00843123 0.0120583 1 0 1 1 0 0 +EDGE2 9295 9294 -0.944266 0.00592502 0.0248446 1 0 1 1 0 0 +EDGE2 9295 9094 -0.930989 -0.0643508 -0.00615184 1 0 1 1 0 0 +EDGE2 9295 8175 -0.0461106 -0.0119891 -3.13631 1 0 1 1 0 0 +EDGE2 9295 8174 1.00241 0.00809454 -3.14965 1 0 1 1 0 0 +EDGE2 9295 8176 -0.037482 -0.948886 -1.58109 1 0 1 1 0 0 +EDGE2 9296 9077 0.973656 -0.00719163 -0.000647735 1 0 1 1 0 0 +EDGE2 9296 9097 0.984363 -0.130978 -0.0225742 1 0 1 1 0 0 +EDGE2 9296 9277 1.10692 -0.0323538 -0.000928592 1 0 1 1 0 0 +EDGE2 9296 9096 -0.000601505 0.00360028 -0.00195167 1 0 1 1 0 0 +EDGE2 9296 9276 -0.0235629 -0.0340563 -0.00517183 1 0 1 1 0 0 +EDGE2 9296 9076 -0.0264992 -0.0410386 0.028722 1 0 1 1 0 0 +EDGE2 9296 9075 -1.04399 -0.0283362 1.54616 1 0 1 1 0 0 +EDGE2 9296 9275 -0.971848 0.0445742 -1.56079 1 0 1 1 0 0 +EDGE2 9296 9295 -1.03544 0.0894067 -1.53033 1 0 1 1 0 0 +EDGE2 9296 9095 -0.969465 0.0378608 -1.55015 1 0 1 1 0 0 +EDGE2 9296 8175 -0.96363 0.0171861 1.5573 1 0 1 1 0 0 +EDGE2 9297 9098 1.02178 -0.00109785 -0.00330869 1 0 1 1 0 0 +EDGE2 9297 9278 0.934204 0.0367908 -0.0184625 1 0 1 1 0 0 +EDGE2 9297 9078 0.938079 0.0054948 -0.0147203 1 0 1 1 0 0 +EDGE2 9297 9296 -1.02653 0.0628217 0.00998454 1 0 1 1 0 0 +EDGE2 9297 9077 0.0239226 0.0126145 -0.00274918 1 0 1 1 0 0 +EDGE2 9297 9097 -0.0363642 -0.00371844 -0.00658055 1 0 1 1 0 0 +EDGE2 9297 9277 -0.0355267 -0.0262823 0.035415 1 0 1 1 0 0 +EDGE2 9297 9096 -0.99928 0.0970786 -0.00499913 1 0 1 1 0 0 +EDGE2 9297 9276 -1.03179 -0.107885 -0.0186704 1 0 1 1 0 0 +EDGE2 9297 9076 -0.983309 0.00455938 0.023656 1 0 1 1 0 0 +EDGE2 9298 9099 1.05413 0.082521 0.0195546 1 0 1 1 0 0 +EDGE2 9298 9279 1.02522 -0.00357544 -0.0127414 1 0 1 1 0 0 +EDGE2 9298 9079 1.00776 -0.0892201 -0.0346105 1 0 1 1 0 0 +EDGE2 9298 9098 -0.0743139 0.0318623 -0.0151277 1 0 1 1 0 0 +EDGE2 9298 9278 0.0109291 -0.0189514 -0.00230375 1 0 1 1 0 0 +EDGE2 9298 9078 0.0385702 -0.102629 -0.0022699 1 0 1 1 0 0 +EDGE2 9298 9297 -0.956959 -0.0182371 0.00526142 1 0 1 1 0 0 +EDGE2 9298 9077 -0.9573 0.0118557 0.00914248 1 0 1 1 0 0 +EDGE2 9298 9097 -0.98587 -0.0134128 -0.016318 1 0 1 1 0 0 +EDGE2 9298 9277 -1.00924 -0.0621166 -0.00982693 1 0 1 1 0 0 +EDGE2 9299 8120 1.00505 0.0215485 -3.14419 1 0 1 1 0 0 +EDGE2 9299 9280 0.989078 -0.039293 -0.0205354 1 0 1 1 0 0 +EDGE2 9299 9080 0.930354 0.0201431 0.0179095 1 0 1 1 0 0 +EDGE2 9299 9100 0.938682 0.029574 -0.0111088 1 0 1 1 0 0 +EDGE2 9299 9099 -0.0373618 -0.0452644 0.0117052 1 0 1 1 0 0 +EDGE2 9299 9279 0.0241545 0.112787 0.0160065 1 0 1 1 0 0 +EDGE2 9299 9079 0.0847415 -0.0153249 -0.0134302 1 0 1 1 0 0 +EDGE2 9299 9098 -0.979542 -0.0350271 -0.0164032 1 0 1 1 0 0 +EDGE2 9299 9278 -0.982946 0.0270832 0.0269027 1 0 1 1 0 0 +EDGE2 9299 9298 -1.08894 -0.0326149 -0.0148096 1 0 1 1 0 0 +EDGE2 9299 9078 -0.954829 0.0367713 -0.0144132 1 0 1 1 0 0 +EDGE2 9300 8120 0.00886 0.0557447 -3.14038 1 0 1 1 0 0 +EDGE2 9300 9280 0.0654098 -0.00355688 0.0138234 1 0 1 1 0 0 +EDGE2 9300 8119 1.01083 -0.0425863 -3.13666 1 0 1 1 0 0 +EDGE2 9300 9081 -0.0382502 1.01011 1.54718 1 0 1 1 0 0 +EDGE2 9300 9101 0.0220496 0.982817 1.54896 1 0 1 1 0 0 +EDGE2 9300 9281 -0.0454438 1.00025 1.58063 1 0 1 1 0 0 +EDGE2 9300 9080 -0.113352 -0.0130353 -0.00815111 1 0 1 1 0 0 +EDGE2 9300 9100 -0.0982725 -0.010861 0.00362683 1 0 1 1 0 0 +EDGE2 9300 8121 -0.0513364 -1.00489 -1.55303 1 0 1 1 0 0 +EDGE2 9300 9099 -0.938189 -0.030732 -0.0148066 1 0 1 1 0 0 +EDGE2 9300 9279 -0.909005 -0.0516401 0.00577801 1 0 1 1 0 0 +EDGE2 9300 9299 -1.01408 0.0266692 0.0168109 1 0 1 1 0 0 +EDGE2 9300 9079 -0.988658 0.0337706 -0.0265117 1 0 1 1 0 0 +EDGE2 9301 8120 -0.96773 -0.00496351 1.58328 1 0 1 1 0 0 +EDGE2 9301 9280 -0.98392 -0.129752 -1.55685 1 0 1 1 0 0 +EDGE2 9301 9081 -0.010751 0.00433668 -0.01846 1 0 1 1 0 0 +EDGE2 9301 9101 -0.0374062 -0.0457532 -0.0106794 1 0 1 1 0 0 +EDGE2 9301 9281 0.0989329 0.0573158 -0.0268773 1 0 1 1 0 0 +EDGE2 9301 9300 -0.997021 -0.0319452 -1.57963 1 0 1 1 0 0 +EDGE2 9301 9080 -1.06243 -0.00221998 -1.59427 1 0 1 1 0 0 +EDGE2 9301 9100 -1.03368 -0.0712827 -1.59369 1 0 1 1 0 0 +EDGE2 9301 9082 1.00046 0.0677773 -0.0463416 1 0 1 1 0 0 +EDGE2 9301 9102 0.906824 0.0199201 -0.0186626 1 0 1 1 0 0 +EDGE2 9301 9282 1.03071 -0.0877544 0.0199935 1 0 1 1 0 0 +EDGE2 9302 9301 -0.998801 -0.0813257 -0.00521236 1 0 1 1 0 0 +EDGE2 9302 9081 -1.04364 0.110447 -0.00335873 1 0 1 1 0 0 +EDGE2 9302 9101 -0.982414 0.0236434 -0.034647 1 0 1 1 0 0 +EDGE2 9302 9281 -0.91037 -0.0799293 -0.00484646 1 0 1 1 0 0 +EDGE2 9302 9082 0.0303213 -0.0127605 0.00121467 1 0 1 1 0 0 +EDGE2 9302 9102 -0.0123911 0.0157494 -0.0109667 1 0 1 1 0 0 +EDGE2 9302 9282 0.0255885 0.0471401 -0.050432 1 0 1 1 0 0 +EDGE2 9302 9103 1.02121 -0.0642113 -0.0281291 1 0 1 1 0 0 +EDGE2 9302 9283 1.03533 -0.0313176 -0.011148 1 0 1 1 0 0 +EDGE2 9302 9083 0.99082 -0.0128867 -0.011845 1 0 1 1 0 0 +EDGE2 9303 9302 -1.01676 0.0308745 -0.00475929 1 0 1 1 0 0 +EDGE2 9303 9082 -0.970102 -0.0695033 0.0104647 1 0 1 1 0 0 +EDGE2 9303 9102 -1.00036 0.0305484 -0.0122005 1 0 1 1 0 0 +EDGE2 9303 9282 -1.07117 0.00393015 0.000552629 1 0 1 1 0 0 +EDGE2 9303 9103 0.0741065 -0.112188 -0.0213027 1 0 1 1 0 0 +EDGE2 9303 9283 -0.0159499 0.0364927 0.0179099 1 0 1 1 0 0 +EDGE2 9303 9083 0.0133976 -0.0268924 0.0161161 1 0 1 1 0 0 +EDGE2 9303 9084 0.983873 0.0183884 0.0277329 1 0 1 1 0 0 +EDGE2 9303 9284 1.02477 -0.0899427 -0.00477802 1 0 1 1 0 0 +EDGE2 9303 9104 1.01072 0.126445 0.0210705 1 0 1 1 0 0 +EDGE2 9304 9303 -1.0663 0.00830505 -0.0287772 1 0 1 1 0 0 +EDGE2 9304 9103 -0.956033 -0.0454624 0.0245807 1 0 1 1 0 0 +EDGE2 9304 9283 -1.06331 0.0547037 0.000240401 1 0 1 1 0 0 +EDGE2 9304 9083 -0.980967 0.0414475 -0.0116401 1 0 1 1 0 0 +EDGE2 9304 9265 0.976133 -0.0319276 -3.16016 1 0 1 1 0 0 +EDGE2 9304 9085 0.998716 -0.0217005 -0.0195063 1 0 1 1 0 0 +EDGE2 9304 9084 -0.0596155 -0.0344674 -0.0154574 1 0 1 1 0 0 +EDGE2 9304 9284 -0.0207881 -0.0121993 0.0310438 1 0 1 1 0 0 +EDGE2 9304 9104 -0.0136949 -0.0250048 0.0255002 1 0 1 1 0 0 +EDGE2 9304 9285 1.07552 -0.0518348 -0.0380714 1 0 1 1 0 0 +EDGE2 9304 9105 1.03573 0.0755615 0.0333829 1 0 1 1 0 0 +EDGE2 9305 9264 1.06695 -0.0582206 -3.12966 1 0 1 1 0 0 +EDGE2 9305 9265 0.0493328 0.0254797 -3.15072 1 0 1 1 0 0 +EDGE2 9305 9106 -0.0109247 -1.01298 -1.57974 1 0 1 1 0 0 +EDGE2 9305 9085 -0.0164509 -0.0113467 0.0283805 1 0 1 1 0 0 +EDGE2 9305 9084 -0.95009 -0.0436766 0.0426039 1 0 1 1 0 0 +EDGE2 9305 9284 -0.967922 -0.00985573 0.029168 1 0 1 1 0 0 +EDGE2 9305 9304 -0.964454 -0.0388364 -0.0288742 1 0 1 1 0 0 +EDGE2 9305 9104 -1.03078 -0.0152584 0.0362023 1 0 1 1 0 0 +EDGE2 9305 9285 -0.00613502 -0.0442808 -0.0102689 1 0 1 1 0 0 +EDGE2 9305 9105 -0.100913 -0.0431909 -0.000472318 1 0 1 1 0 0 +EDGE2 9305 9266 0.0367756 1.04567 1.51734 1 0 1 1 0 0 +EDGE2 9305 9086 -0.00531108 1.09461 1.57854 1 0 1 1 0 0 +EDGE2 9305 9286 -0.0231519 1.03306 1.54445 1 0 1 1 0 0 +EDGE2 9306 9265 -1.01653 0.0696467 1.56019 1 0 1 1 0 0 +EDGE2 9306 9085 -0.941968 0.0119762 -1.57228 1 0 1 1 0 0 +EDGE2 9306 9285 -1.02497 0.0172511 -1.57765 1 0 1 1 0 0 +EDGE2 9306 9305 -1.05012 -0.0322323 -1.57332 1 0 1 1 0 0 +EDGE2 9306 9105 -0.91877 -0.0417883 -1.56652 1 0 1 1 0 0 +EDGE2 9306 9266 0.0590475 -0.0036658 -0.0123641 1 0 1 1 0 0 +EDGE2 9306 9287 1.08675 -0.0323308 0.0318491 1 0 1 1 0 0 +EDGE2 9306 9267 1.04004 -0.0367175 -0.00872524 1 0 1 1 0 0 +EDGE2 9306 9086 -0.034952 -0.0364906 0.0181223 1 0 1 1 0 0 +EDGE2 9306 9286 0.0605587 -0.085025 0.00222081 1 0 1 1 0 0 +EDGE2 9306 9087 1.01042 -0.00936885 -0.0140927 1 0 1 1 0 0 +EDGE2 9307 9306 -0.997597 -0.0623777 -0.0113853 1 0 1 1 0 0 +EDGE2 9307 9266 -1.00744 -0.00667753 0.0181441 1 0 1 1 0 0 +EDGE2 9307 9088 1.00252 -0.00388429 0.0411813 1 0 1 1 0 0 +EDGE2 9307 9287 0.0920372 0.0436035 0.010789 1 0 1 1 0 0 +EDGE2 9307 9267 0.0219941 -0.0123714 0.00256446 1 0 1 1 0 0 +EDGE2 9307 9086 -0.989134 0.0235715 -0.00815874 1 0 1 1 0 0 +EDGE2 9307 9286 -0.921051 -0.0166633 -0.00522451 1 0 1 1 0 0 +EDGE2 9307 9268 1.02225 0.006175 -0.00148634 1 0 1 1 0 0 +EDGE2 9307 9087 -0.0668397 0.0282576 0.00358433 1 0 1 1 0 0 +EDGE2 9307 9288 1.02737 -0.0121717 -0.00695385 1 0 1 1 0 0 +EDGE2 9308 9089 1.02959 -0.0489386 -0.00344473 1 0 1 1 0 0 +EDGE2 9308 9088 -0.0263164 0.0214848 0.00640668 1 0 1 1 0 0 +EDGE2 9308 9287 -0.897378 -0.00835991 -0.0396539 1 0 1 1 0 0 +EDGE2 9308 9267 -1.00166 -0.063469 -0.00567565 1 0 1 1 0 0 +EDGE2 9308 9307 -0.986866 0.0276458 -0.0148818 1 0 1 1 0 0 +EDGE2 9308 9268 -0.0184958 -0.0202774 -0.00829225 1 0 1 1 0 0 +EDGE2 9308 9087 -1.10119 0.00930539 0.01387 1 0 1 1 0 0 +EDGE2 9308 9288 -0.00785936 0.00119303 0.00994634 1 0 1 1 0 0 +EDGE2 9308 9289 0.989141 0.0469131 0.00414214 1 0 1 1 0 0 +EDGE2 9308 9269 0.979817 0.0256568 0.0142176 1 0 1 1 0 0 +EDGE2 9309 9089 0.00153338 -0.03326 0.0488975 1 0 1 1 0 0 +EDGE2 9309 9088 -1.10377 -0.0201574 -0.0224999 1 0 1 1 0 0 +EDGE2 9309 9308 -1.01259 -0.0529014 0.0278642 1 0 1 1 0 0 +EDGE2 9309 9268 -1.06351 -0.0815707 0.028982 1 0 1 1 0 0 +EDGE2 9309 9288 -1.03441 -0.0164574 -0.0210326 1 0 1 1 0 0 +EDGE2 9309 9289 -0.0201223 -0.0369051 0.0288887 1 0 1 1 0 0 +EDGE2 9309 9269 0.0168043 0.0606813 0.0011961 1 0 1 1 0 0 +EDGE2 9309 9230 0.949376 0.0836478 -3.14083 1 0 1 1 0 0 +EDGE2 9309 9270 1.06234 -0.0311334 -6.10422e-05 1 0 1 1 0 0 +EDGE2 9309 9290 0.910102 0.0391119 -0.00964185 1 0 1 1 0 0 +EDGE2 9309 9090 1.01617 0.00560696 0.0141329 1 0 1 1 0 0 +EDGE2 9310 9089 -0.96531 -0.0330198 -0.016447 1 0 1 1 0 0 +EDGE2 9310 9289 -0.97482 -0.00985169 -0.0136568 1 0 1 1 0 0 +EDGE2 9310 9309 -0.929452 0.00384605 0.00941355 1 0 1 1 0 0 +EDGE2 9310 9269 -0.931628 0.0131384 -0.00159083 1 0 1 1 0 0 +EDGE2 9310 9229 0.997544 0.0337937 -3.12243 1 0 1 1 0 0 +EDGE2 9310 9271 0.0517612 1.02239 1.5211 1 0 1 1 0 0 +EDGE2 9310 9291 -0.0652468 0.979224 1.6036 1 0 1 1 0 0 +EDGE2 9310 9091 0.0113615 0.964148 1.57196 1 0 1 1 0 0 +EDGE2 9310 9230 -0.0265595 -0.000429838 -3.17725 1 0 1 1 0 0 +EDGE2 9310 9270 -0.020863 0.0424773 0.0136695 1 0 1 1 0 0 +EDGE2 9310 9290 -0.000989165 -0.0232295 -0.0214013 1 0 1 1 0 0 +EDGE2 9310 9090 0.0162148 0.0663945 0.0103106 1 0 1 1 0 0 +EDGE2 9310 9231 -0.0123697 -0.923915 -1.5695 1 0 1 1 0 0 +EDGE2 9311 9292 1.03865 0.00426723 0.0248856 1 0 1 1 0 0 +EDGE2 9311 9092 1.01127 0.038675 0.0296562 1 0 1 1 0 0 +EDGE2 9311 9272 1.04899 -0.0348193 -0.00695907 1 0 1 1 0 0 +EDGE2 9311 9310 -1.0414 -0.0180427 -1.55257 1 0 1 1 0 0 +EDGE2 9311 9271 0.00493785 0.00315771 0.00708809 1 0 1 1 0 0 +EDGE2 9311 9291 -0.135378 -0.0929553 -0.0109795 1 0 1 1 0 0 +EDGE2 9311 9091 0.114746 0.0181621 -0.0273957 1 0 1 1 0 0 +EDGE2 9311 9230 -0.977008 0.0114805 1.54102 1 0 1 1 0 0 +EDGE2 9311 9270 -1.00468 0.0826463 -1.57829 1 0 1 1 0 0 +EDGE2 9311 9290 -1.02964 -0.00971511 -1.54412 1 0 1 1 0 0 +EDGE2 9311 9090 -1.03307 -0.0588049 -1.54797 1 0 1 1 0 0 +EDGE2 9312 9292 -0.0170529 0.0307648 0.0230669 1 0 1 1 0 0 +EDGE2 9312 9093 1.0005 -0.0636147 -0.0324069 1 0 1 1 0 0 +EDGE2 9312 9273 1.01318 0.00465192 -0.0159014 1 0 1 1 0 0 +EDGE2 9312 9293 1.02332 0.0284139 -0.0191479 1 0 1 1 0 0 +EDGE2 9312 9092 -0.0144224 -0.0280452 0.0221001 1 0 1 1 0 0 +EDGE2 9312 9272 0.0058107 0.0192829 -0.0285598 1 0 1 1 0 0 +EDGE2 9312 9271 -0.978411 0.0631835 0.0151685 1 0 1 1 0 0 +EDGE2 9312 9291 -1.01512 0.0147179 0.0255243 1 0 1 1 0 0 +EDGE2 9312 9311 -1.03128 -0.0625761 -0.0199722 1 0 1 1 0 0 +EDGE2 9312 9091 -1.0507 0.0306009 0.00434763 1 0 1 1 0 0 +EDGE2 9313 9274 1.06836 -0.0620848 0.0235762 1 0 1 1 0 0 +EDGE2 9313 9294 1.00187 -0.0365812 -0.0125919 1 0 1 1 0 0 +EDGE2 9313 9094 1.02702 0.0478253 -0.00502696 1 0 1 1 0 0 +EDGE2 9313 9292 -0.937571 -0.0681864 0.0331757 1 0 1 1 0 0 +EDGE2 9313 9093 0.00391164 0.00275943 -0.0335677 1 0 1 1 0 0 +EDGE2 9313 9273 0.0493206 -0.0139583 -0.00208141 1 0 1 1 0 0 +EDGE2 9313 9293 0.0259521 -0.0035352 0.00197827 1 0 1 1 0 0 +EDGE2 9313 9312 -0.977808 0.0257729 -0.0111283 1 0 1 1 0 0 +EDGE2 9313 9092 -1.04047 0.0478016 -0.00337455 1 0 1 1 0 0 +EDGE2 9313 9272 -1.04697 0.0415719 0.0012852 1 0 1 1 0 0 +EDGE2 9314 9313 -1.02774 0.020442 -0.00684275 1 0 1 1 0 0 +EDGE2 9314 9075 0.937622 -0.00690247 -3.1305 1 0 1 1 0 0 +EDGE2 9314 9275 1.10091 0.0323622 -0.000735085 1 0 1 1 0 0 +EDGE2 9314 9295 1.03044 0.0132047 -0.0146274 1 0 1 1 0 0 +EDGE2 9314 9095 1.02154 -0.0303481 -0.0301446 1 0 1 1 0 0 +EDGE2 9314 9274 -0.0299566 0.0331125 -0.0141857 1 0 1 1 0 0 +EDGE2 9314 9294 -0.0867626 -0.0763781 0.00404786 1 0 1 1 0 0 +EDGE2 9314 9094 -0.0497324 -0.0250433 -0.00219105 1 0 1 1 0 0 +EDGE2 9314 9093 -0.980904 0.0566949 0.0123311 1 0 1 1 0 0 +EDGE2 9314 9273 -0.969597 -0.0894324 0.0287863 1 0 1 1 0 0 +EDGE2 9314 9293 -1.02168 -0.00189554 0.00990713 1 0 1 1 0 0 +EDGE2 9314 8175 1.06695 -0.00148771 -3.18018 1 0 1 1 0 0 +EDGE2 9315 9296 0.0497343 0.981994 1.59014 1 0 1 1 0 0 +EDGE2 9315 9096 -0.0406712 0.954466 1.54938 1 0 1 1 0 0 +EDGE2 9315 9276 0.0615868 0.967325 1.5423 1 0 1 1 0 0 +EDGE2 9315 9076 0.0650027 1.03249 1.57275 1 0 1 1 0 0 +EDGE2 9315 9074 0.93915 -0.0559209 -3.12244 1 0 1 1 0 0 +EDGE2 9315 9075 -0.0345283 0.0689865 -3.13073 1 0 1 1 0 0 +EDGE2 9315 9275 -0.0274948 0.0361803 -0.00780694 1 0 1 1 0 0 +EDGE2 9315 9295 -0.035918 0.0445987 0.0378081 1 0 1 1 0 0 +EDGE2 9315 9095 0.0682261 0.0253717 -0.024049 1 0 1 1 0 0 +EDGE2 9315 9274 -0.98026 0.00416563 0.00257061 1 0 1 1 0 0 +EDGE2 9315 9294 -0.947811 -0.0346322 0.0225386 1 0 1 1 0 0 +EDGE2 9315 9314 -0.984368 -0.0559009 -0.0272171 1 0 1 1 0 0 +EDGE2 9315 9094 -0.979319 -0.0260498 0.0146765 1 0 1 1 0 0 +EDGE2 9315 8175 0.00653163 0.0464313 -3.13087 1 0 1 1 0 0 +EDGE2 9315 8174 0.942062 -0.0721542 -3.20432 1 0 1 1 0 0 +EDGE2 9315 8176 0.00567661 -1.05681 -1.59337 1 0 1 1 0 0 +EDGE2 9316 9297 1.0221 -0.0013309 -0.00685744 1 0 1 1 0 0 +EDGE2 9316 9296 -0.0120974 -0.0375357 0.0441706 1 0 1 1 0 0 +EDGE2 9316 9077 1.03888 0.00985363 0.00138407 1 0 1 1 0 0 +EDGE2 9316 9097 1.05915 0.00512701 0.0221762 1 0 1 1 0 0 +EDGE2 9316 9277 1.01273 0.0136276 -0.0157596 1 0 1 1 0 0 +EDGE2 9316 9096 -0.072629 0.0369588 -0.00231121 1 0 1 1 0 0 +EDGE2 9316 9276 -0.040976 -0.137591 -0.00255626 1 0 1 1 0 0 +EDGE2 9316 9076 0.00991104 0.0309451 0.00852034 1 0 1 1 0 0 +EDGE2 9316 9075 -1.00521 0.0209473 1.58428 1 0 1 1 0 0 +EDGE2 9316 9275 -1.06555 -0.0504986 -1.57846 1 0 1 1 0 0 +EDGE2 9316 9295 -0.961127 -0.0743903 -1.57321 1 0 1 1 0 0 +EDGE2 9316 9315 -0.97147 -0.0314103 -1.57985 1 0 1 1 0 0 +EDGE2 9316 9095 -0.96185 -0.0017037 -1.55228 1 0 1 1 0 0 +EDGE2 9316 8175 -0.923389 -0.0390597 1.55818 1 0 1 1 0 0 +EDGE2 9317 9098 0.959726 -0.00581085 -0.0258018 1 0 1 1 0 0 +EDGE2 9317 9278 1.04775 -0.00790569 -0.0638005 1 0 1 1 0 0 +EDGE2 9317 9298 1.04366 -0.0367433 -0.0292003 1 0 1 1 0 0 +EDGE2 9317 9078 0.899647 -0.0376268 0.0164417 1 0 1 1 0 0 +EDGE2 9317 9297 0.0182782 -0.00438365 0.0251531 1 0 1 1 0 0 +EDGE2 9317 9296 -1.02933 -0.0220525 0.0144204 1 0 1 1 0 0 +EDGE2 9317 9077 0.0376215 0.0784129 0.019258 1 0 1 1 0 0 +EDGE2 9317 9097 -0.0773723 -0.0895068 0.0300214 1 0 1 1 0 0 +EDGE2 9317 9277 -0.017436 0.0973888 0.0195347 1 0 1 1 0 0 +EDGE2 9317 9316 -1.0407 -0.0153203 -0.0102988 1 0 1 1 0 0 +EDGE2 9317 9096 -1.02757 -0.0536414 0.00128492 1 0 1 1 0 0 +EDGE2 9317 9276 -0.952389 0.00162766 0.0118987 1 0 1 1 0 0 +EDGE2 9317 9076 -1.0568 0.0104686 0.0160878 1 0 1 1 0 0 +EDGE2 9318 9099 0.981666 -0.0161588 -0.0320293 1 0 1 1 0 0 +EDGE2 9318 9279 1.08462 0.0449975 7.81847e-05 1 0 1 1 0 0 +EDGE2 9318 9299 1.06223 -0.00352206 -6.1799e-06 1 0 1 1 0 0 +EDGE2 9318 9079 0.925759 -0.0947004 0.00425572 1 0 1 1 0 0 +EDGE2 9318 9098 -0.0501744 0.0202026 -0.000187223 1 0 1 1 0 0 +EDGE2 9318 9278 -0.0537517 -0.00622985 -0.0156075 1 0 1 1 0 0 +EDGE2 9318 9298 0.0253972 0.0474857 0.0280744 1 0 1 1 0 0 +EDGE2 9318 9078 0.028975 0.131124 0.0219508 1 0 1 1 0 0 +EDGE2 9318 9297 -0.994669 -0.0363514 0.0283906 1 0 1 1 0 0 +EDGE2 9318 9317 -1.00978 0.0538258 0.0161466 1 0 1 1 0 0 +EDGE2 9318 9077 -1.09713 0.032714 -0.00697357 1 0 1 1 0 0 +EDGE2 9318 9097 -0.901574 -0.0182088 -0.0238379 1 0 1 1 0 0 +EDGE2 9318 9277 -1.06598 -0.023395 -0.0151105 1 0 1 1 0 0 +EDGE2 9319 8120 0.943918 -0.00707949 -3.12947 1 0 1 1 0 0 +EDGE2 9319 9280 0.992953 0.0198816 -0.0294838 1 0 1 1 0 0 +EDGE2 9319 9300 0.933998 -0.144136 -0.0271841 1 0 1 1 0 0 +EDGE2 9319 9080 0.938852 -0.0776331 0.00889488 1 0 1 1 0 0 +EDGE2 9319 9100 1.00759 0.0267216 0.00589919 1 0 1 1 0 0 +EDGE2 9319 9318 -0.949892 0.0580561 -0.018412 1 0 1 1 0 0 +EDGE2 9319 9099 -0.0244023 -0.0235064 0.00136967 1 0 1 1 0 0 +EDGE2 9319 9279 -0.00891226 0.033708 0.0301168 1 0 1 1 0 0 +EDGE2 9319 9299 -0.00489439 -0.0413967 0.0164883 1 0 1 1 0 0 +EDGE2 9319 9079 0.154435 0.0172576 -0.0262553 1 0 1 1 0 0 +EDGE2 9319 9098 -0.988032 0.0066617 0.0314191 1 0 1 1 0 0 +EDGE2 9319 9278 -0.937894 0.0889635 0.0446929 1 0 1 1 0 0 +EDGE2 9319 9298 -1.03834 -0.136415 -0.00492464 1 0 1 1 0 0 +EDGE2 9319 9078 -1.05784 0.0262436 -0.0158889 1 0 1 1 0 0 +EDGE2 9320 8120 0.0104434 0.0335008 -3.11989 1 0 1 1 0 0 +EDGE2 9320 9280 -0.0966693 -0.0766438 0.00781673 1 0 1 1 0 0 +EDGE2 9320 8119 0.973402 0.00871272 -3.15986 1 0 1 1 0 0 +EDGE2 9320 9301 -0.00484327 1.01643 1.57459 1 0 1 1 0 0 +EDGE2 9320 9081 0.0486415 0.984569 1.56587 1 0 1 1 0 0 +EDGE2 9320 9101 -0.0674728 0.930239 1.5729 1 0 1 1 0 0 +EDGE2 9320 9281 -0.116919 1.02245 1.57719 1 0 1 1 0 0 +EDGE2 9320 9300 -5.06651e-05 -0.036157 0.000658956 1 0 1 1 0 0 +EDGE2 9320 9080 -0.0472115 0.041487 -0.0195366 1 0 1 1 0 0 +EDGE2 9320 9100 0.0294419 0.024471 -0.0184899 1 0 1 1 0 0 +EDGE2 9320 8121 -0.0267542 -1.01418 -1.59344 1 0 1 1 0 0 +EDGE2 9320 9319 -0.961807 0.000505663 -0.00702296 1 0 1 1 0 0 +EDGE2 9320 9099 -0.99583 0.0182121 0.00186508 1 0 1 1 0 0 +EDGE2 9320 9279 -1.02153 0.0145632 0.0259178 1 0 1 1 0 0 +EDGE2 9320 9299 -1.02101 0.0233344 0.0106815 1 0 1 1 0 0 +EDGE2 9320 9079 -1.08568 0.00389975 0.00501285 1 0 1 1 0 0 +EDGE2 9321 8120 -0.960921 -0.00570748 1.55349 1 0 1 1 0 0 +EDGE2 9321 9280 -1.05303 -0.0222969 -1.56923 1 0 1 1 0 0 +EDGE2 9321 9320 -0.868986 -0.0317711 -1.56952 1 0 1 1 0 0 +EDGE2 9321 9301 -0.018374 -0.0546369 0.0134814 1 0 1 1 0 0 +EDGE2 9321 9081 0.0834624 -0.00904192 -0.0069141 1 0 1 1 0 0 +EDGE2 9321 9101 0.0116309 -0.0262764 0.014992 1 0 1 1 0 0 +EDGE2 9321 9281 -0.0380143 -0.0506104 0.0139095 1 0 1 1 0 0 +EDGE2 9321 9300 -0.908433 -0.020466 -1.54104 1 0 1 1 0 0 +EDGE2 9321 9302 0.978018 0.0227636 -0.0109733 1 0 1 1 0 0 +EDGE2 9321 9080 -0.978349 -0.101996 -1.5408 1 0 1 1 0 0 +EDGE2 9321 9100 -1.00039 0.00656621 -1.54948 1 0 1 1 0 0 +EDGE2 9321 9082 1.02115 -0.0250468 0.0185192 1 0 1 1 0 0 +EDGE2 9321 9102 1.02347 -0.036928 0.0163853 1 0 1 1 0 0 +EDGE2 9321 9282 1.02785 0.0610417 -0.00599625 1 0 1 1 0 0 +EDGE2 9322 9301 -1.04956 0.0346676 -0.00736238 1 0 1 1 0 0 +EDGE2 9322 9321 -0.974227 0.00922974 -0.00886618 1 0 1 1 0 0 +EDGE2 9322 9081 -0.991288 0.0504302 0.0189294 1 0 1 1 0 0 +EDGE2 9322 9101 -1.0552 -0.102877 -0.00288709 1 0 1 1 0 0 +EDGE2 9322 9281 -0.943692 -0.0350521 -0.00492983 1 0 1 1 0 0 +EDGE2 9322 9302 0.0254594 -0.0746334 0.0289242 1 0 1 1 0 0 +EDGE2 9322 9303 0.9911 0.0221757 0.0298934 1 0 1 1 0 0 +EDGE2 9322 9082 -0.0290496 -0.0674797 0.0119338 1 0 1 1 0 0 +EDGE2 9322 9102 0.0566369 0.0262843 -0.00123636 1 0 1 1 0 0 +EDGE2 9322 9282 -0.012298 0.0200331 0.0192658 1 0 1 1 0 0 +EDGE2 9322 9103 0.990314 0.070501 0.0188255 1 0 1 1 0 0 +EDGE2 9322 9283 0.994818 -0.00115009 0.0247969 1 0 1 1 0 0 +EDGE2 9322 9083 1.01282 -0.0559723 0.00582113 1 0 1 1 0 0 +EDGE2 9323 9302 -1.04378 0.0774912 0.00932392 1 0 1 1 0 0 +EDGE2 9323 9322 -0.998584 -0.0246958 -0.00435515 1 0 1 1 0 0 +EDGE2 9323 9303 0.0386077 -0.0755813 -0.00690671 1 0 1 1 0 0 +EDGE2 9323 9082 -0.993257 0.0112367 0.0126959 1 0 1 1 0 0 +EDGE2 9323 9102 -1.00713 0.0451189 -0.0153619 1 0 1 1 0 0 +EDGE2 9323 9282 -0.974089 0.0302682 0.0222875 1 0 1 1 0 0 +EDGE2 9323 9103 0.0599318 -0.0168922 -0.0324081 1 0 1 1 0 0 +EDGE2 9323 9283 -0.00582322 0.0197454 -0.0146276 1 0 1 1 0 0 +EDGE2 9323 9083 -0.0414145 -0.0680324 -0.0242265 1 0 1 1 0 0 +EDGE2 9323 9084 1.01946 0.000208732 2.8229e-05 1 0 1 1 0 0 +EDGE2 9323 9284 1.05469 -0.101985 0.0180384 1 0 1 1 0 0 +EDGE2 9323 9304 0.95384 0.0748674 0.000465413 1 0 1 1 0 0 +EDGE2 9323 9104 1.06848 -0.0304004 0.00186801 1 0 1 1 0 0 +EDGE2 9324 9303 -0.923163 0.00797456 0.00580026 1 0 1 1 0 0 +EDGE2 9324 9323 -0.954033 0.026744 0.0294446 1 0 1 1 0 0 +EDGE2 9324 9103 -0.954787 0.0630541 0.0175151 1 0 1 1 0 0 +EDGE2 9324 9283 -1.02953 0.110845 0.0229377 1 0 1 1 0 0 +EDGE2 9324 9083 -1.02471 0.0281942 0.0198878 1 0 1 1 0 0 +EDGE2 9324 9265 0.964043 -0.00142817 -3.13453 1 0 1 1 0 0 +EDGE2 9324 9085 1.03106 0.0692737 -0.00562589 1 0 1 1 0 0 +EDGE2 9324 9084 -0.0558515 0.0663378 0.0226956 1 0 1 1 0 0 +EDGE2 9324 9284 -0.0179402 -0.0967646 -0.00101265 1 0 1 1 0 0 +EDGE2 9324 9304 -0.04583 0.0083769 0.00305633 1 0 1 1 0 0 +EDGE2 9324 9104 -0.078588 -0.0251697 0.024861 1 0 1 1 0 0 +EDGE2 9324 9285 1.01442 -0.00258508 0.00985385 1 0 1 1 0 0 +EDGE2 9324 9305 0.989998 -0.0139846 0.0174526 1 0 1 1 0 0 +EDGE2 9324 9105 0.908559 0.0587265 0.00965525 1 0 1 1 0 0 +EDGE2 9325 9306 -0.0275895 0.948813 1.54668 1 0 1 1 0 0 +EDGE2 9325 9264 0.922566 0.0132667 -3.14472 1 0 1 1 0 0 +EDGE2 9325 9265 -0.0962261 0.0197369 -3.12589 1 0 1 1 0 0 +EDGE2 9325 9106 -0.0664911 -1.03872 -1.55226 1 0 1 1 0 0 +EDGE2 9325 9085 -0.0829885 0.0819413 -0.00322519 1 0 1 1 0 0 +EDGE2 9325 9084 -1.01002 -0.0409365 -0.0159903 1 0 1 1 0 0 +EDGE2 9325 9284 -0.932225 0.0336945 0.0115507 1 0 1 1 0 0 +EDGE2 9325 9304 -0.978287 0.05343 0.00329441 1 0 1 1 0 0 +EDGE2 9325 9324 -1.00254 0.0082477 0.027592 1 0 1 1 0 0 +EDGE2 9325 9104 -1.03559 0.0569077 -0.014777 1 0 1 1 0 0 +EDGE2 9325 9285 -0.0337221 0.0108455 -0.00177722 1 0 1 1 0 0 +EDGE2 9325 9305 -0.00862914 0.0333569 -0.00911391 1 0 1 1 0 0 +EDGE2 9325 9105 0.00933742 0.0241595 0.019559 1 0 1 1 0 0 +EDGE2 9325 9266 0.0472557 1.03743 1.55185 1 0 1 1 0 0 +EDGE2 9325 9086 0.0303564 0.931893 1.56864 1 0 1 1 0 0 +EDGE2 9325 9286 0.0601624 0.984934 1.5772 1 0 1 1 0 0 +EDGE2 9326 9107 0.967165 -0.00512783 0.0113238 1 0 1 1 0 0 +EDGE2 9326 9265 -1.01192 0.0128308 -1.57032 1 0 1 1 0 0 +EDGE2 9326 9106 -0.126306 -0.0501644 0.0335093 1 0 1 1 0 0 +EDGE2 9326 9085 -0.967181 -0.0168362 1.56353 1 0 1 1 0 0 +EDGE2 9326 9285 -0.927692 0.0119259 1.55582 1 0 1 1 0 0 +EDGE2 9326 9305 -0.979534 0.00213185 1.5812 1 0 1 1 0 0 +EDGE2 9326 9325 -0.898852 0.0640072 1.5736 1 0 1 1 0 0 +EDGE2 9326 9105 -1.00145 -0.037428 1.60697 1 0 1 1 0 0 +EDGE2 9327 9326 -1.02915 0.102266 -0.0050967 1 0 1 1 0 0 +EDGE2 9327 9108 0.993859 -0.0655826 -0.00799251 1 0 1 1 0 0 +EDGE2 9327 9107 -0.0421239 0.0387908 0.0173225 1 0 1 1 0 0 +EDGE2 9327 9106 -1.06581 -0.069534 -0.00739512 1 0 1 1 0 0 +EDGE2 9328 9109 0.958036 0.0136667 -0.00915187 1 0 1 1 0 0 +EDGE2 9328 9327 -0.93754 0.0351553 -0.0241524 1 0 1 1 0 0 +EDGE2 9328 9108 -0.0766513 0.071929 -0.0238442 1 0 1 1 0 0 +EDGE2 9328 9107 -1.01312 0.11273 -0.0422935 1 0 1 1 0 0 +EDGE2 9329 9109 -0.0305556 0.0472371 0.0114464 1 0 1 1 0 0 +EDGE2 9329 9110 0.973996 -0.0256105 0.028174 1 0 1 1 0 0 +EDGE2 9329 9108 -0.982939 -0.105128 0.0247964 1 0 1 1 0 0 +EDGE2 9329 9328 -1.10827 -0.0289816 0.0132838 1 0 1 1 0 0 +EDGE2 9330 9109 -1.02714 -0.020561 -0.0235836 1 0 1 1 0 0 +EDGE2 9330 9110 0.0580468 -0.0631509 0.0156416 1 0 1 1 0 0 +EDGE2 9330 9329 -1.1028 0.022254 0.00389239 1 0 1 1 0 0 +EDGE2 9330 9111 0.0255644 1.033 1.56339 1 0 1 1 0 0 +EDGE2 9331 9110 -1.04533 -0.0351095 1.59671 1 0 1 1 0 0 +EDGE2 9331 9330 -0.991933 -0.00317044 1.581 1 0 1 1 0 0 +EDGE2 9332 9331 -1.05413 0.0302987 -0.00978912 1 0 1 1 0 0 +EDGE2 9333 9332 -0.918636 0.065759 0.00191192 1 0 1 1 0 0 +EDGE2 9334 8115 0.964154 -0.00435154 -3.12352 1 0 1 1 0 0 +EDGE2 9334 9333 -0.9728 -0.101629 -0.01067 1 0 1 1 0 0 +EDGE2 9335 8115 -0.0982694 -0.0588678 -3.14413 1 0 1 1 0 0 +EDGE2 9335 8114 1.02347 -0.0707604 -3.10264 1 0 1 1 0 0 +EDGE2 9335 8116 0.0943655 -1.04423 -1.54376 1 0 1 1 0 0 +EDGE2 9335 9334 -0.9817 -0.0686194 -0.021268 1 0 1 1 0 0 +EDGE2 9336 9335 -1.03061 0.0559943 -1.53486 1 0 1 1 0 0 +EDGE2 9336 8115 -0.98323 0.11313 1.59927 1 0 1 1 0 0 +EDGE2 9337 9336 -1.03431 0.0342275 -0.0364139 1 0 1 1 0 0 +EDGE2 9338 9337 -0.890242 0.0219135 -0.0494561 1 0 1 1 0 0 +EDGE2 9339 6660 1.03326 -0.0589356 -3.14042 1 0 1 1 0 0 +EDGE2 9339 6540 0.993606 0.0159888 -3.12005 1 0 1 1 0 0 +EDGE2 9339 9338 -0.940667 -0.0796716 0.00509721 1 0 1 1 0 0 +EDGE2 9340 6539 0.9289 0.016766 -3.13723 1 0 1 1 0 0 +EDGE2 9340 6659 1.00216 0.0446441 -3.13509 1 0 1 1 0 0 +EDGE2 9340 6660 -0.00961763 -0.0817504 -3.17788 1 0 1 1 0 0 +EDGE2 9340 6661 -0.0119816 -0.954158 -1.5886 1 0 1 1 0 0 +EDGE2 9340 9339 -0.99186 -0.0232937 0.0122 1 0 1 1 0 0 +EDGE2 9340 6541 -0.11176 1.02131 1.59304 1 0 1 1 0 0 +EDGE2 9340 6540 -0.00918832 0.0369232 -3.1689 1 0 1 1 0 0 +EDGE2 9341 6660 -0.927506 -0.0504369 -1.56129 1 0 1 1 0 0 +EDGE2 9341 6662 1.04448 0.0466543 -0.00354624 1 0 1 1 0 0 +EDGE2 9341 9340 -1.00778 -0.0075644 1.58935 1 0 1 1 0 0 +EDGE2 9341 6661 -0.0301791 -0.0125074 0.00142219 1 0 1 1 0 0 +EDGE2 9341 6540 -1.0245 -0.036754 -1.58051 1 0 1 1 0 0 +EDGE2 9342 9341 -0.946194 0.0357578 0.00126754 1 0 1 1 0 0 +EDGE2 9342 6663 1.01571 0.00704787 -0.0142457 1 0 1 1 0 0 +EDGE2 9342 6662 0.0115316 0.0652889 0.00560105 1 0 1 1 0 0 +EDGE2 9342 6661 -1.08085 0.143072 -0.0319963 1 0 1 1 0 0 +EDGE2 9343 6664 0.992708 -0.0779346 -0.0103351 1 0 1 1 0 0 +EDGE2 9343 9342 -1.03035 0.00186153 0.0316055 1 0 1 1 0 0 +EDGE2 9343 6663 -0.0562077 -0.0216892 0.0346233 1 0 1 1 0 0 +EDGE2 9343 6662 -0.97062 0.0613227 -0.0130062 1 0 1 1 0 0 +EDGE2 9344 8085 0.971835 -0.062542 -3.15026 1 0 1 1 0 0 +EDGE2 9344 6525 0.931947 0.007008 -3.15928 1 0 1 1 0 0 +EDGE2 9344 6665 0.971539 -0.105158 -0.00125787 1 0 1 1 0 0 +EDGE2 9344 6664 -0.0249817 -0.0546889 -0.00633879 1 0 1 1 0 0 +EDGE2 9344 6663 -0.978825 0.0449474 0.00785851 1 0 1 1 0 0 +EDGE2 9344 9343 -0.995516 0.0268373 0.0269816 1 0 1 1 0 0 +EDGE2 9345 6666 0.0564547 0.978894 1.57575 1 0 1 1 0 0 +EDGE2 9345 6526 -0.0160379 1.00708 1.59289 1 0 1 1 0 0 +EDGE2 9345 8085 -0.00421293 -0.0233692 -3.13504 1 0 1 1 0 0 +EDGE2 9345 6524 1.01057 0.0511799 -3.13651 1 0 1 1 0 0 +EDGE2 9345 8084 1.04119 0.0102866 -3.14417 1 0 1 1 0 0 +EDGE2 9345 8086 0.0214397 -0.907601 -1.57893 1 0 1 1 0 0 +EDGE2 9345 6525 -0.0186736 0.0977961 -3.11055 1 0 1 1 0 0 +EDGE2 9345 6665 0.0381898 -0.00574068 -0.0167984 1 0 1 1 0 0 +EDGE2 9345 6664 -1.104 -0.00421281 0.0101269 1 0 1 1 0 0 +EDGE2 9345 9344 -1.02731 -0.0659191 -0.022582 1 0 1 1 0 0 +EDGE2 9346 6667 1.03396 -0.00660543 -0.0217535 1 0 1 1 0 0 +EDGE2 9346 6666 -0.0515137 -0.0469673 0.000583028 1 0 1 1 0 0 +EDGE2 9346 6527 1.01907 0.0349897 -0.0264212 1 0 1 1 0 0 +EDGE2 9346 6526 0.0603352 -0.110353 -0.0277236 1 0 1 1 0 0 +EDGE2 9346 8085 -0.988387 0.0284209 1.58106 1 0 1 1 0 0 +EDGE2 9346 9345 -1.06058 0.0136677 -1.5581 1 0 1 1 0 0 +EDGE2 9346 6525 -0.976955 0.0179941 1.57143 1 0 1 1 0 0 +EDGE2 9346 6665 -0.94738 0.0991424 -1.56042 1 0 1 1 0 0 +EDGE2 9347 6667 -0.0770568 -0.00185917 -0.0097191 1 0 1 1 0 0 +EDGE2 9347 6528 0.993914 -0.0244168 0.00521078 1 0 1 1 0 0 +EDGE2 9347 6668 0.936167 0.0741834 -0.0219124 1 0 1 1 0 0 +EDGE2 9347 6666 -0.996352 0.00879548 -0.0395009 1 0 1 1 0 0 +EDGE2 9347 9346 -1.00823 -0.0281796 0.00439174 1 0 1 1 0 0 +EDGE2 9347 6527 -0.0487479 0.0221439 -0.00722975 1 0 1 1 0 0 +EDGE2 9347 6526 -0.942102 -0.0860698 0.000372723 1 0 1 1 0 0 +EDGE2 9348 6529 1.01281 -0.000483997 0.0104593 1 0 1 1 0 0 +EDGE2 9348 6669 1.07534 -0.034153 0.0113767 1 0 1 1 0 0 +EDGE2 9348 6667 -1.07297 0.0303204 -0.00695165 1 0 1 1 0 0 +EDGE2 9348 6528 0.0659039 -0.0206958 0.0130575 1 0 1 1 0 0 +EDGE2 9348 6668 -0.0166974 -0.0144617 -0.00446411 1 0 1 1 0 0 +EDGE2 9348 9347 -1.08424 0.0124613 -0.0382042 1 0 1 1 0 0 +EDGE2 9348 6527 -1.01856 0.018891 -0.0247736 1 0 1 1 0 0 +EDGE2 9349 8070 0.984715 0.0446433 -3.12163 1 0 1 1 0 0 +EDGE2 9349 6529 0.00217363 -0.0514255 -0.044328 1 0 1 1 0 0 +EDGE2 9349 6669 0.0381251 0.00527263 0.0139643 1 0 1 1 0 0 +EDGE2 9349 6530 1.00235 -0.0228389 -0.00844453 1 0 1 1 0 0 +EDGE2 9349 6670 1.00525 0.0906221 -0.00499255 1 0 1 1 0 0 +EDGE2 9349 6528 -0.997241 -0.049493 -0.00795861 1 0 1 1 0 0 +EDGE2 9349 6668 -1.00625 0.00103529 -0.00953485 1 0 1 1 0 0 +EDGE2 9349 9348 -0.970935 0.0223663 -0.0268284 1 0 1 1 0 0 +EDGE2 9350 8070 0.0376078 -0.0162868 -3.14465 1 0 1 1 0 0 +EDGE2 9350 8069 1.03427 -0.0189964 -3.17943 1 0 1 1 0 0 +EDGE2 9350 8071 0.015476 -0.896816 -1.57478 1 0 1 1 0 0 +EDGE2 9350 6529 -1.06634 0.00125376 0.0150007 1 0 1 1 0 0 +EDGE2 9350 6669 -0.944209 -0.0159175 0.00277536 1 0 1 1 0 0 +EDGE2 9350 6530 -0.0447893 0.00871281 -0.0141742 1 0 1 1 0 0 +EDGE2 9350 6670 0.0420204 -0.0862078 0.0235767 1 0 1 1 0 0 +EDGE2 9350 9349 -0.987226 0.0263709 0.0124005 1 0 1 1 0 0 +EDGE2 9350 6531 -0.0743253 1.0031 1.60713 1 0 1 1 0 0 +EDGE2 9350 6671 0.0959895 1.03277 1.55843 1 0 1 1 0 0 +EDGE2 9351 8070 -1.04403 -0.000681979 1.58828 1 0 1 1 0 0 +EDGE2 9351 9350 -1.00612 -0.0427822 -1.58999 1 0 1 1 0 0 +EDGE2 9351 6530 -1.00742 -0.0272992 -1.56942 1 0 1 1 0 0 +EDGE2 9351 6670 -0.965684 -0.0952019 -1.57329 1 0 1 1 0 0 +EDGE2 9351 6672 0.964498 0.0193152 0.014735 1 0 1 1 0 0 +EDGE2 9351 6531 -0.0669549 -0.00749414 0.0203014 1 0 1 1 0 0 +EDGE2 9351 6671 0.0121074 -0.0220489 -0.00734973 1 0 1 1 0 0 +EDGE2 9351 6532 1.00783 0.0322503 -5.60813e-06 1 0 1 1 0 0 +EDGE2 9352 6672 -0.0211503 -0.0716865 0.029795 1 0 1 1 0 0 +EDGE2 9352 6531 -1.05499 -0.028287 -0.0139939 1 0 1 1 0 0 +EDGE2 9352 6671 -1.07714 -0.0455575 -0.0279535 1 0 1 1 0 0 +EDGE2 9352 9351 -1.08208 -0.035604 -0.0380286 1 0 1 1 0 0 +EDGE2 9352 6673 0.993037 0.0548606 0.0013373 1 0 1 1 0 0 +EDGE2 9352 6532 0.0883951 0.0105187 0.0153323 1 0 1 1 0 0 +EDGE2 9352 6533 0.967644 0.0954208 -0.000916721 1 0 1 1 0 0 +EDGE2 9353 6672 -0.883817 0.00460468 -0.00772523 1 0 1 1 0 0 +EDGE2 9353 9352 -0.958026 -0.00410962 0.0260358 1 0 1 1 0 0 +EDGE2 9353 6673 -0.024543 0.0496052 -0.0116678 1 0 1 1 0 0 +EDGE2 9353 6532 -0.94009 0.00453912 -0.00257212 1 0 1 1 0 0 +EDGE2 9353 6533 0.035118 0.0219169 -0.0214403 1 0 1 1 0 0 +EDGE2 9353 6534 0.950687 0.049224 -0.00994024 1 0 1 1 0 0 +EDGE2 9353 6674 0.929024 -0.00922282 0.00400558 1 0 1 1 0 0 +EDGE2 9354 6535 1.03372 0.0517453 7.87389e-05 1 0 1 1 0 0 +EDGE2 9354 6673 -0.972718 0.0266966 -0.0117547 1 0 1 1 0 0 +EDGE2 9354 9353 -1.04339 0.0310938 -0.0105886 1 0 1 1 0 0 +EDGE2 9354 6533 -0.9626 0.0251537 -0.0244628 1 0 1 1 0 0 +EDGE2 9354 6675 1.07193 -0.0470222 0.0147914 1 0 1 1 0 0 +EDGE2 9354 6534 0.129889 0.0312034 0.0132743 1 0 1 1 0 0 +EDGE2 9354 6674 -0.0176981 -0.0693616 0.00485487 1 0 1 1 0 0 +EDGE2 9354 6635 1.0585 -0.0217846 -3.14962 1 0 1 1 0 0 +EDGE2 9354 6655 0.954413 0.004022 -3.12972 1 0 1 1 0 0 +EDGE2 9354 6595 0.959764 -0.0326597 -3.12008 1 0 1 1 0 0 +EDGE2 9355 6535 0.0812698 0.0309952 -0.0245555 1 0 1 1 0 0 +EDGE2 9355 6636 -0.00666339 -0.927017 -1.57536 1 0 1 1 0 0 +EDGE2 9355 6676 -0.0262541 -0.962885 -1.57353 1 0 1 1 0 0 +EDGE2 9355 9354 -1.11875 -0.0494441 0.0117522 1 0 1 1 0 0 +EDGE2 9355 6675 -0.0128221 -0.049822 0.0193844 1 0 1 1 0 0 +EDGE2 9355 6534 -1.01809 0.0114194 -0.0222157 1 0 1 1 0 0 +EDGE2 9355 6596 0.00999777 -1.00026 -1.54544 1 0 1 1 0 0 +EDGE2 9355 6674 -0.98813 0.00311089 0.00135889 1 0 1 1 0 0 +EDGE2 9355 6635 -0.0357978 -0.0112661 -3.13988 1 0 1 1 0 0 +EDGE2 9355 6655 0.0522593 -0.0436061 -3.16611 1 0 1 1 0 0 +EDGE2 9355 6595 -0.0376634 -0.0132973 -3.12227 1 0 1 1 0 0 +EDGE2 9355 6654 0.96613 0.0999981 -3.19654 1 0 1 1 0 0 +EDGE2 9355 6536 -0.0846401 0.993242 1.61129 1 0 1 1 0 0 +EDGE2 9355 6656 0.000127167 0.999964 1.58195 1 0 1 1 0 0 +EDGE2 9355 6594 1.07835 0.029857 -3.14395 1 0 1 1 0 0 +EDGE2 9355 6634 0.979651 0.0335135 -3.15831 1 0 1 1 0 0 +EDGE2 9356 6535 -1.00796 -0.0957718 1.57467 1 0 1 1 0 0 +EDGE2 9356 6636 -0.0916004 -0.00700712 0.00358865 1 0 1 1 0 0 +EDGE2 9356 6677 0.970102 -0.0741111 0.0204759 1 0 1 1 0 0 +EDGE2 9356 6597 1.09468 -0.0535236 -0.00614258 1 0 1 1 0 0 +EDGE2 9356 6637 0.939374 0.00745616 -0.029884 1 0 1 1 0 0 +EDGE2 9356 6676 0.0372377 -0.0137071 0.0115356 1 0 1 1 0 0 +EDGE2 9356 6675 -0.982469 0.0720112 1.56321 1 0 1 1 0 0 +EDGE2 9356 6596 0.0433027 -0.0431498 0.0120957 1 0 1 1 0 0 +EDGE2 9356 9355 -1.13252 0.0283787 1.58309 1 0 1 1 0 0 +EDGE2 9356 6635 -0.960488 0.091061 -1.56465 1 0 1 1 0 0 +EDGE2 9356 6655 -0.954307 -0.0191978 -1.57313 1 0 1 1 0 0 +EDGE2 9356 6595 -0.93441 0.0231139 -1.58433 1 0 1 1 0 0 +EDGE2 9357 6636 -1.01069 0.0249154 -0.00207718 1 0 1 1 0 0 +EDGE2 9357 6677 -0.0292365 0.0673492 -0.00986938 1 0 1 1 0 0 +EDGE2 9357 6598 1.00302 -0.0272491 -0.0106383 1 0 1 1 0 0 +EDGE2 9357 6638 1.03177 0.0986877 -0.0108331 1 0 1 1 0 0 +EDGE2 9357 6678 1.07045 0.0460798 -0.0071102 1 0 1 1 0 0 +EDGE2 9357 9356 -0.990849 0.0290374 0.0333631 1 0 1 1 0 0 +EDGE2 9357 6597 0.0169771 -0.037908 0.022316 1 0 1 1 0 0 +EDGE2 9357 6637 -0.0458945 0.0103429 -0.0275066 1 0 1 1 0 0 +EDGE2 9357 6676 -1.0088 0.0394915 0.00644817 1 0 1 1 0 0 +EDGE2 9357 6596 -1.04308 -0.00944243 -0.00298031 1 0 1 1 0 0 +EDGE2 9358 6677 -0.980368 0.0107135 0.0125536 1 0 1 1 0 0 +EDGE2 9358 6639 1.0029 -0.0827903 -0.0156651 1 0 1 1 0 0 +EDGE2 9358 6679 1.02406 0.0572964 -0.00740991 1 0 1 1 0 0 +EDGE2 9358 6599 0.971248 0.0255933 0.0208818 1 0 1 1 0 0 +EDGE2 9358 6598 0.0782649 0.0995795 -0.037195 1 0 1 1 0 0 +EDGE2 9358 6638 -0.0153404 0.00896837 0.0200773 1 0 1 1 0 0 +EDGE2 9358 6678 0.0219092 0.0594937 0.0154244 1 0 1 1 0 0 +EDGE2 9358 9357 -0.906651 0.0149208 0.00677343 1 0 1 1 0 0 +EDGE2 9358 6597 -0.990655 -0.0221701 0.00741391 1 0 1 1 0 0 +EDGE2 9358 6637 -1.01178 -0.0549853 0.00673001 1 0 1 1 0 0 +EDGE2 9359 6680 1.05873 0.0729318 0.0165698 1 0 1 1 0 0 +EDGE2 9359 6600 0.979991 -0.0408991 -0.00932235 1 0 1 1 0 0 +EDGE2 9359 6620 1.04248 0.0698257 -3.11525 1 0 1 1 0 0 +EDGE2 9359 6640 1.07109 0.000883155 0.0261937 1 0 1 1 0 0 +EDGE2 9359 9358 -0.97109 0.06577 -0.00171072 1 0 1 1 0 0 +EDGE2 9359 6639 -0.0502827 0.00807769 0.0177375 1 0 1 1 0 0 +EDGE2 9359 6679 -0.00275484 -0.0055703 -0.0313096 1 0 1 1 0 0 +EDGE2 9359 6599 -0.0391092 -0.059767 -0.00867697 1 0 1 1 0 0 +EDGE2 9359 6598 -0.988515 0.0613354 0.0357232 1 0 1 1 0 0 +EDGE2 9359 6638 -0.975443 0.0560036 0.00477398 1 0 1 1 0 0 +EDGE2 9359 6678 -1.09001 -0.0290564 -0.0188849 1 0 1 1 0 0 +EDGE2 9360 6619 0.979321 0.0724308 -3.11458 1 0 1 1 0 0 +EDGE2 9360 6681 -0.0051781 0.994831 1.55308 1 0 1 1 0 0 +EDGE2 9360 6680 -0.0203586 -0.0902765 0.00340434 1 0 1 1 0 0 +EDGE2 9360 6601 0.00908664 -0.994496 -1.58524 1 0 1 1 0 0 +EDGE2 9360 6600 -0.120767 -0.0277619 -0.00613401 1 0 1 1 0 0 +EDGE2 9360 6620 0.00664978 -0.0872624 -3.11879 1 0 1 1 0 0 +EDGE2 9360 6640 0.040016 0.102045 0.0262693 1 0 1 1 0 0 +EDGE2 9360 6621 0.134923 1.00713 1.59705 1 0 1 1 0 0 +EDGE2 9360 6641 0.0474741 0.952437 1.57396 1 0 1 1 0 0 +EDGE2 9360 6639 -0.941912 -0.0226484 0.0150738 1 0 1 1 0 0 +EDGE2 9360 6679 -1.01392 0.0330871 0.0199046 1 0 1 1 0 0 +EDGE2 9360 9359 -0.910207 -0.0376433 -0.012575 1 0 1 1 0 0 +EDGE2 9360 6599 -0.996491 0.0344647 0.0111291 1 0 1 1 0 0 +EDGE2 9361 6681 0.0782526 0.0191947 0.0205087 1 0 1 1 0 0 +EDGE2 9361 6680 -1.07136 -0.081091 -1.57025 1 0 1 1 0 0 +EDGE2 9361 9360 -0.951058 0.0394393 -1.56343 1 0 1 1 0 0 +EDGE2 9361 6600 -0.877586 -0.055565 -1.54795 1 0 1 1 0 0 +EDGE2 9361 6620 -0.98491 0.00025672 1.55237 1 0 1 1 0 0 +EDGE2 9361 6640 -1.01121 0.0960427 -1.59923 1 0 1 1 0 0 +EDGE2 9361 6642 0.998092 -0.0848896 -0.0161553 1 0 1 1 0 0 +EDGE2 9361 6621 -0.0696152 0.0446488 -0.00519582 1 0 1 1 0 0 +EDGE2 9361 6641 0.0950647 -0.0158408 0.0152109 1 0 1 1 0 0 +EDGE2 9361 6682 0.972323 0.016651 0.0237252 1 0 1 1 0 0 +EDGE2 9361 6622 0.983395 0.041684 0.00403375 1 0 1 1 0 0 +EDGE2 9362 6643 1.0828 0.103292 0.0114827 1 0 1 1 0 0 +EDGE2 9362 6681 -1.07257 -0.0612791 0.0186141 1 0 1 1 0 0 +EDGE2 9362 9361 -0.985262 -0.0224313 -0.000527077 1 0 1 1 0 0 +EDGE2 9362 6642 0.00434675 -0.0140296 -0.012931 1 0 1 1 0 0 +EDGE2 9362 6621 -1.01712 0.0610773 -0.0554688 1 0 1 1 0 0 +EDGE2 9362 6641 -1.12393 0.0338835 0.0374511 1 0 1 1 0 0 +EDGE2 9362 6682 0.00621811 0.0161213 -0.0057296 1 0 1 1 0 0 +EDGE2 9362 6622 0.0250596 0.0241192 -0.0296854 1 0 1 1 0 0 +EDGE2 9362 6683 1.00155 0.048255 0.00176677 1 0 1 1 0 0 +EDGE2 9362 6623 0.959187 0.00457895 0.0151413 1 0 1 1 0 0 +EDGE2 9363 6643 -0.0688387 -0.00314885 -0.0123277 1 0 1 1 0 0 +EDGE2 9363 6642 -1.02915 -0.0322683 0.0120257 1 0 1 1 0 0 +EDGE2 9363 9362 -1.02245 0.00752512 -0.00300197 1 0 1 1 0 0 +EDGE2 9363 6682 -0.884834 0.0928983 -0.042574 1 0 1 1 0 0 +EDGE2 9363 6622 -0.942654 -0.0158943 0.0294686 1 0 1 1 0 0 +EDGE2 9363 6683 -0.0692949 -0.0194729 -0.0314747 1 0 1 1 0 0 +EDGE2 9363 6624 0.954964 -0.0256748 0.00359401 1 0 1 1 0 0 +EDGE2 9363 6684 0.937476 -0.0898666 0.0400762 1 0 1 1 0 0 +EDGE2 9363 6623 -0.0282595 -0.0499704 0.021993 1 0 1 1 0 0 +EDGE2 9363 6644 0.989912 -0.0154709 0.00504546 1 0 1 1 0 0 +EDGE2 9364 6643 -1.05495 -0.0668763 0.0140541 1 0 1 1 0 0 +EDGE2 9364 9363 -0.90808 -0.0699643 -0.02546 1 0 1 1 0 0 +EDGE2 9364 6683 -0.929797 -0.111497 -0.0113791 1 0 1 1 0 0 +EDGE2 9364 6624 0.00398107 -0.0411055 -0.0251691 1 0 1 1 0 0 +EDGE2 9364 6684 -0.0353307 0.0321422 0.035608 1 0 1 1 0 0 +EDGE2 9364 6623 -1.03416 -0.094619 7.09354e-05 1 0 1 1 0 0 +EDGE2 9364 6644 -0.0831981 0.0177787 0.021627 1 0 1 1 0 0 +EDGE2 9364 6645 1.02457 -0.0446707 0.000213681 1 0 1 1 0 0 +EDGE2 9364 6685 1.00958 -0.0258935 0.00816985 1 0 1 1 0 0 +EDGE2 9364 6625 0.989069 -0.00218225 -0.0138087 1 0 1 1 0 0 +EDGE2 9365 6624 -0.991463 -0.0211935 -0.00408926 1 0 1 1 0 0 +EDGE2 9365 6684 -1.03454 -0.0158498 0.00734064 1 0 1 1 0 0 +EDGE2 9365 9364 -1.03076 -0.032498 0.00690503 1 0 1 1 0 0 +EDGE2 9365 6644 -0.990491 -0.0869234 0.0364879 1 0 1 1 0 0 +EDGE2 9365 6645 0.0149551 -0.0706462 0.0378072 1 0 1 1 0 0 +EDGE2 9365 6685 0.0546331 -0.119043 -0.00594699 1 0 1 1 0 0 +EDGE2 9365 6625 0.0292052 0.00213363 -0.019711 1 0 1 1 0 0 +EDGE2 9365 6686 -0.150256 0.9888 1.59035 1 0 1 1 0 0 +EDGE2 9365 6626 0.0088299 0.931294 1.59421 1 0 1 1 0 0 +EDGE2 9365 6646 0.0717172 0.950476 1.59639 1 0 1 1 0 0 +EDGE2 9366 6645 -0.962443 0.0331063 1.60295 1 0 1 1 0 0 +EDGE2 9366 6685 -1.00704 -0.00136212 1.5725 1 0 1 1 0 0 +EDGE2 9366 9365 -1.00933 0.0503106 1.54425 1 0 1 1 0 0 +EDGE2 9366 6625 -1.01759 -0.0635822 1.58131 1 0 1 1 0 0 +EDGE2 9367 9366 -1.12827 0.0335852 0.0438799 1 0 1 1 0 0 +EDGE2 9368 9367 -1.0231 0.064968 0.027589 1 0 1 1 0 0 +EDGE2 9369 9368 -0.993781 -0.0332261 0.0324721 1 0 1 1 0 0 +EDGE2 9370 9369 -1.03533 -0.0176623 -0.0130991 1 0 1 1 0 0 +EDGE2 9371 9370 -0.986508 -0.0495943 -1.58206 1 0 1 1 0 0 +EDGE2 9372 9371 -1.00689 -0.0123561 0.0059059 1 0 1 1 0 0 +EDGE2 9373 9372 -0.980055 -0.0381904 -0.0118622 1 0 1 1 0 0 +EDGE2 9374 9373 -0.949281 -0.011181 -0.0309818 1 0 1 1 0 0 +EDGE2 9374 6755 1.04735 -0.0370591 -3.11233 1 0 1 1 0 0 +EDGE2 9375 6756 0.0800645 -1.09933 -1.57994 1 0 1 1 0 0 +EDGE2 9375 9374 -0.954053 -0.0600618 0.0186225 1 0 1 1 0 0 +EDGE2 9375 6754 1.02236 -0.0254932 -3.16047 1 0 1 1 0 0 +EDGE2 9375 6755 -0.0893331 0.072462 -3.14922 1 0 1 1 0 0 +EDGE2 9376 6757 1.11151 -0.0873186 -0.0136732 1 0 1 1 0 0 +EDGE2 9376 6756 -0.0180523 0.007149 0.0328815 1 0 1 1 0 0 +EDGE2 9376 9375 -1.14678 0.170031 1.57161 1 0 1 1 0 0 +EDGE2 9376 6755 -1.10666 0.087866 -1.59231 1 0 1 1 0 0 +EDGE2 9377 6758 1.00607 0.0014141 0.0120604 1 0 1 1 0 0 +EDGE2 9377 6757 -0.00491838 0.0621965 -4.38529e-05 1 0 1 1 0 0 +EDGE2 9377 6756 -1.04034 -0.0134706 -0.00268249 1 0 1 1 0 0 +EDGE2 9377 9376 -1.05904 -0.0278048 -0.0183582 1 0 1 1 0 0 +EDGE2 9378 6759 1.01197 0.0100967 -0.0398901 1 0 1 1 0 0 +EDGE2 9378 6758 0.0885461 0.0294479 0.00714886 1 0 1 1 0 0 +EDGE2 9378 6757 -0.917477 -0.00319998 0.0340736 1 0 1 1 0 0 +EDGE2 9378 9377 -1.08579 -0.0319046 -0.0109765 1 0 1 1 0 0 +EDGE2 9379 6760 0.993881 -0.0137442 -0.0030145 1 0 1 1 0 0 +EDGE2 9379 6759 0.0477318 -0.0231011 -0.00998349 1 0 1 1 0 0 +EDGE2 9379 6758 -1.00377 0.0900323 0.0239358 1 0 1 1 0 0 +EDGE2 9379 9378 -0.976931 -0.0466225 0.0239498 1 0 1 1 0 0 +EDGE2 9380 6761 -0.00491951 1.07118 1.55143 1 0 1 1 0 0 +EDGE2 9380 6760 -0.0241227 0.00699453 0.00715238 1 0 1 1 0 0 +EDGE2 9380 6759 -0.95795 -0.0475016 0.00713455 1 0 1 1 0 0 +EDGE2 9380 9379 -0.968489 0.00589497 0.0300286 1 0 1 1 0 0 +EDGE2 9381 9380 -1.01691 0.0450335 1.55779 1 0 1 1 0 0 +EDGE2 9381 6760 -1.04313 -0.027723 1.54117 1 0 1 1 0 0 +EDGE2 9382 9381 -1.0174 -0.0443873 0.0107948 1 0 1 1 0 0 +EDGE2 9383 9382 -1.05146 -0.00368915 -0.027228 1 0 1 1 0 0 +EDGE2 9384 9383 -1.08005 -0.0161048 -0.000915945 1 0 1 1 0 0 +EDGE2 9385 9384 -1.01435 0.0365289 0.0507406 1 0 1 1 0 0 +EDGE2 9386 9385 -1.01484 -0.00536762 1.59824 1 0 1 1 0 0 +EDGE2 9387 9386 -1.04899 -0.0379723 -0.0473792 1 0 1 1 0 0 +EDGE2 9388 9387 -1.09004 -0.0429717 -0.000294677 1 0 1 1 0 0 +EDGE2 9389 9388 -0.920127 -0.0573267 0.0119077 1 0 1 1 0 0 +EDGE2 9389 9370 1.11685 0.0460709 -3.11611 1 0 1 1 0 0 +EDGE2 9390 9389 -1.04653 -0.0446427 -0.00729011 1 0 1 1 0 0 +EDGE2 9390 9369 1.00483 -0.00345665 -3.15243 1 0 1 1 0 0 +EDGE2 9390 9370 -0.0431689 -0.0116222 -3.15424 1 0 1 1 0 0 +EDGE2 9390 9371 -0.000205804 -0.987846 -1.5621 1 0 1 1 0 0 +EDGE2 9391 9390 -1.09135 0.0219376 -1.56505 1 0 1 1 0 0 +EDGE2 9391 9370 -0.961632 -0.0183547 1.58933 1 0 1 1 0 0 +EDGE2 9392 9391 -0.960241 -0.0552817 0.00895909 1 0 1 1 0 0 +EDGE2 9393 9392 -1.0413 0.00580276 0.00369965 1 0 1 1 0 0 +EDGE2 9394 6615 1.05788 -0.0173326 -3.12463 1 0 1 1 0 0 +EDGE2 9394 9393 -0.88658 0.0174736 -0.00898982 1 0 1 1 0 0 +EDGE2 9395 6616 0.0149618 -0.999042 -1.55529 1 0 1 1 0 0 +EDGE2 9395 6614 0.99017 0.030746 -3.12192 1 0 1 1 0 0 +EDGE2 9395 6615 -0.0383274 0.0217183 -3.14573 1 0 1 1 0 0 +EDGE2 9395 9394 -0.953314 -0.0405494 0.0384693 1 0 1 1 0 0 +EDGE2 9396 6617 1.06162 0.00662881 -0.0251963 1 0 1 1 0 0 +EDGE2 9396 6616 0.0258241 -0.00972705 -0.0259646 1 0 1 1 0 0 +EDGE2 9396 9395 -0.967795 -0.0162807 1.53778 1 0 1 1 0 0 +EDGE2 9396 6615 -0.953453 -0.0315049 -1.59762 1 0 1 1 0 0 +EDGE2 9397 6617 -0.061204 -0.000636901 -0.00568304 1 0 1 1 0 0 +EDGE2 9397 6616 -1.08346 -0.0128955 -0.0220843 1 0 1 1 0 0 +EDGE2 9397 9396 -0.941527 0.0621818 0.00588333 1 0 1 1 0 0 +EDGE2 9397 6618 1.09422 -0.0501741 -0.0219659 1 0 1 1 0 0 +EDGE2 9398 6617 -1.09837 0.00205046 0.00358059 1 0 1 1 0 0 +EDGE2 9398 9397 -1.0763 0.0445729 -0.003966 1 0 1 1 0 0 +EDGE2 9398 6618 -0.0475977 -0.0470167 -0.017063 1 0 1 1 0 0 +EDGE2 9398 6619 0.970463 -0.137793 0.00243308 1 0 1 1 0 0 +EDGE2 9399 6618 -1.04507 -0.0200765 0.00383054 1 0 1 1 0 0 +EDGE2 9399 9398 -1.05818 0.00722547 -0.00610093 1 0 1 1 0 0 +EDGE2 9399 6619 0.013043 0.0594466 0.0124639 1 0 1 1 0 0 +EDGE2 9399 6680 0.986999 0.0276382 -3.15402 1 0 1 1 0 0 +EDGE2 9399 9360 1.09062 0.0363229 -3.13204 1 0 1 1 0 0 +EDGE2 9399 6600 0.90143 -0.0351223 -3.15193 1 0 1 1 0 0 +EDGE2 9399 6620 1.06795 0.00386441 0.00824821 1 0 1 1 0 0 +EDGE2 9399 6640 0.995572 0.0181425 -3.15726 1 0 1 1 0 0 +EDGE2 9400 9399 -1.00955 -0.0528886 0.0212548 1 0 1 1 0 0 +EDGE2 9400 6619 -1.01701 -0.0375743 -0.014213 1 0 1 1 0 0 +EDGE2 9400 6681 0.0309887 -0.996043 -1.61105 1 0 1 1 0 0 +EDGE2 9400 6680 0.0350693 0.0694896 -3.13714 1 0 1 1 0 0 +EDGE2 9400 6601 -0.0149287 1.06392 1.57297 1 0 1 1 0 0 +EDGE2 9400 9360 -0.00396564 -0.0312133 -3.16801 1 0 1 1 0 0 +EDGE2 9400 6600 -0.0153388 -0.0590192 -3.122 1 0 1 1 0 0 +EDGE2 9400 6620 -0.0562654 -0.0285198 0.0120626 1 0 1 1 0 0 +EDGE2 9400 6640 0.0221011 0.0338387 -3.1634 1 0 1 1 0 0 +EDGE2 9400 9361 -0.0884781 -0.979674 -1.57049 1 0 1 1 0 0 +EDGE2 9400 6621 -0.108967 -1.01628 -1.5953 1 0 1 1 0 0 +EDGE2 9400 6641 0.025432 -0.963417 -1.56173 1 0 1 1 0 0 +EDGE2 9400 6639 1.07708 -0.0365036 -3.14508 1 0 1 1 0 0 +EDGE2 9400 6679 0.904394 -0.0148512 -3.12458 1 0 1 1 0 0 +EDGE2 9400 9359 1.05715 -0.0373851 -3.15947 1 0 1 1 0 0 +EDGE2 9400 6599 0.964627 -0.0137335 -3.15856 1 0 1 1 0 0 +EDGE2 9401 6602 0.915688 -0.0333308 0.00316378 1 0 1 1 0 0 +EDGE2 9401 6680 -0.927522 -0.0505403 1.56746 1 0 1 1 0 0 +EDGE2 9401 9400 -0.995991 -0.0585656 -1.56757 1 0 1 1 0 0 +EDGE2 9401 6601 0.0859319 0.0097124 0.0241321 1 0 1 1 0 0 +EDGE2 9401 9360 -0.929027 -0.140439 1.54776 1 0 1 1 0 0 +EDGE2 9401 6600 -0.956642 -0.0284419 1.54716 1 0 1 1 0 0 +EDGE2 9401 6620 -1.00009 0.0395035 -1.60482 1 0 1 1 0 0 +EDGE2 9401 6640 -1.03998 0.00147599 1.58269 1 0 1 1 0 0 +EDGE2 9402 6602 -0.0422966 0.00592313 0.00565778 1 0 1 1 0 0 +EDGE2 9402 6603 1.00999 -0.0628975 0.0107807 1 0 1 1 0 0 +EDGE2 9402 6601 -1.07942 0.102536 -0.0202277 1 0 1 1 0 0 +EDGE2 9402 9401 -0.975863 -0.00188036 0.000469135 1 0 1 1 0 0 +EDGE2 9403 6602 -0.976186 0.153758 -0.0127985 1 0 1 1 0 0 +EDGE2 9403 6604 1.03478 -0.00782891 0.0299272 1 0 1 1 0 0 +EDGE2 9403 6603 -0.0378878 0.0902239 0.0221862 1 0 1 1 0 0 +EDGE2 9403 9402 -0.992409 -0.0134212 -0.0239732 1 0 1 1 0 0 +EDGE2 9404 9403 -1.07699 0.0156617 0.00157628 1 0 1 1 0 0 +EDGE2 9404 6605 1.0341 -0.0242984 0.0287752 1 0 1 1 0 0 +EDGE2 9404 8065 1.0097 -0.00949714 -3.12317 1 0 1 1 0 0 +EDGE2 9404 6604 0.0146292 -0.0516593 -0.00337333 1 0 1 1 0 0 +EDGE2 9404 6603 -0.972391 -0.0215472 0.00386554 1 0 1 1 0 0 +EDGE2 9405 8064 1.0378 0.0830862 -3.13436 1 0 1 1 0 0 +EDGE2 9405 6606 -0.0402096 1.02335 1.54674 1 0 1 1 0 0 +EDGE2 9405 9404 -0.944703 0.0912081 0.00403874 1 0 1 1 0 0 +EDGE2 9405 6605 -0.0244964 0.0633205 -0.0122094 1 0 1 1 0 0 +EDGE2 9405 8065 -0.0112776 -0.0855038 -3.14096 1 0 1 1 0 0 +EDGE2 9405 6604 -0.952783 0.0610002 0.00625464 1 0 1 1 0 0 +EDGE2 9405 8066 0.0142339 -1.02991 -1.58863 1 0 1 1 0 0 +EDGE2 9406 9405 -1.02956 -0.0646842 -1.59864 1 0 1 1 0 0 +EDGE2 9406 6607 0.993177 0.025116 0.00774212 1 0 1 1 0 0 +EDGE2 9406 6606 -0.0162735 0.051931 -0.0332726 1 0 1 1 0 0 +EDGE2 9406 6605 -0.97499 -0.00961772 -1.55952 1 0 1 1 0 0 +EDGE2 9406 8065 -1.00303 -0.00425892 1.56394 1 0 1 1 0 0 +EDGE2 9407 6608 1.02027 0.0516548 0.0301141 1 0 1 1 0 0 +EDGE2 9407 9406 -0.932404 -0.0499039 -0.00323425 1 0 1 1 0 0 +EDGE2 9407 6607 0.0632615 -0.0898236 -0.0209242 1 0 1 1 0 0 +EDGE2 9407 6606 -1.03623 0.0143796 -0.0260972 1 0 1 1 0 0 +EDGE2 9408 6609 1.01685 -0.0323447 0.00974279 1 0 1 1 0 0 +EDGE2 9408 6608 0.00141699 -0.0163126 -0.00566312 1 0 1 1 0 0 +EDGE2 9408 6607 -0.919767 0.0448286 -0.0155694 1 0 1 1 0 0 +EDGE2 9408 9407 -0.980466 -0.0485776 -0.0118307 1 0 1 1 0 0 +EDGE2 9409 6610 1.04626 0.0906422 -0.00612803 1 0 1 1 0 0 +EDGE2 9409 7210 0.981222 -0.0215126 -3.12115 1 0 1 1 0 0 +EDGE2 9409 9408 -1.06985 0.0407607 -0.0155262 1 0 1 1 0 0 +EDGE2 9409 6609 0.0658536 0.0109663 -0.00643635 1 0 1 1 0 0 +EDGE2 9409 6608 -0.949501 -0.0148548 -0.0372358 1 0 1 1 0 0 +EDGE2 9410 7209 1.02758 0.0427344 -3.14896 1 0 1 1 0 0 +EDGE2 9410 7211 -0.0407849 -0.96142 -1.5624 1 0 1 1 0 0 +EDGE2 9410 6610 0.00400101 -0.00664181 -0.00813996 1 0 1 1 0 0 +EDGE2 9410 7210 0.0263288 -0.0113097 -3.17879 1 0 1 1 0 0 +EDGE2 9410 6611 0.0304242 0.920204 1.52887 1 0 1 1 0 0 +EDGE2 9410 9409 -1.06492 -0.0361268 -0.0327029 1 0 1 1 0 0 +EDGE2 9410 6609 -1.06244 0.0176098 0.0139496 1 0 1 1 0 0 +EDGE2 9411 7211 0.046647 -0.0212514 0.00158732 1 0 1 1 0 0 +EDGE2 9411 7212 1.02048 -0.0577136 -0.00706627 1 0 1 1 0 0 +EDGE2 9411 6610 -0.962695 0.0141725 1.5815 1 0 1 1 0 0 +EDGE2 9411 7210 -1.05207 0.00543565 -1.58264 1 0 1 1 0 0 +EDGE2 9411 9410 -0.958057 -0.00346764 1.53762 1 0 1 1 0 0 +EDGE2 9412 7211 -0.991998 0.0084125 0.000504798 1 0 1 1 0 0 +EDGE2 9412 7212 0.084127 -0.00749077 -0.0225721 1 0 1 1 0 0 +EDGE2 9412 7213 0.968928 0.0210075 -0.055335 1 0 1 1 0 0 +EDGE2 9412 9411 -0.955879 -0.0716064 0.0100305 1 0 1 1 0 0 +EDGE2 9413 7214 0.982584 -0.0187927 -0.0235357 1 0 1 1 0 0 +EDGE2 9413 7212 -0.969826 -0.0218194 0.0188806 1 0 1 1 0 0 +EDGE2 9413 9412 -0.95417 -0.0606613 0.0101119 1 0 1 1 0 0 +EDGE2 9413 7213 0.000967809 0.0437739 -0.0289167 1 0 1 1 0 0 +EDGE2 9414 9413 -0.989425 0.108464 0.0125406 1 0 1 1 0 0 +EDGE2 9414 7215 0.98666 0.0643802 0.00623146 1 0 1 1 0 0 +EDGE2 9414 7735 0.96707 -0.063476 -3.13841 1 0 1 1 0 0 +EDGE2 9414 7214 0.0686197 -0.0258918 0.00735259 1 0 1 1 0 0 +EDGE2 9414 7213 -0.96805 -0.00454629 -8.62874e-05 1 0 1 1 0 0 +EDGE2 9415 7736 0.00625551 0.955785 1.59416 1 0 1 1 0 0 +EDGE2 9415 7216 -0.0135028 1.01593 1.58593 1 0 1 1 0 0 +EDGE2 9415 7215 0.0470637 0.0806364 -0.00514063 1 0 1 1 0 0 +EDGE2 9415 7734 0.958028 0.0320472 -3.16168 1 0 1 1 0 0 +EDGE2 9415 7735 -0.0639762 0.000412988 -3.14748 1 0 1 1 0 0 +EDGE2 9415 7214 -0.992581 -0.0188993 -0.00433723 1 0 1 1 0 0 +EDGE2 9415 9414 -1.01641 -0.0676586 -0.0150505 1 0 1 1 0 0 +EDGE2 9416 7217 0.974287 0.0787891 0.0146763 1 0 1 1 0 0 +EDGE2 9416 7737 1.09272 -0.0821415 -0.0109347 1 0 1 1 0 0 +EDGE2 9416 7736 0.0573587 -0.00719036 -0.0125953 1 0 1 1 0 0 +EDGE2 9416 7216 0.00952935 -0.0274966 0.00396739 1 0 1 1 0 0 +EDGE2 9416 7215 -0.954838 -0.0457691 -1.55666 1 0 1 1 0 0 +EDGE2 9416 9415 -0.962886 -0.0112668 -1.53463 1 0 1 1 0 0 +EDGE2 9416 7735 -0.974831 0.0710391 1.57027 1 0 1 1 0 0 +EDGE2 9417 7217 0.0558203 0.0385346 0.0370692 1 0 1 1 0 0 +EDGE2 9417 7738 1.07316 -0.0205953 0.000994716 1 0 1 1 0 0 +EDGE2 9417 7737 -0.035077 -0.0447188 -0.00297371 1 0 1 1 0 0 +EDGE2 9417 7218 0.978503 -0.0380572 0.0291116 1 0 1 1 0 0 +EDGE2 9417 7736 -1.02914 -0.098551 -0.011196 1 0 1 1 0 0 +EDGE2 9417 9416 -0.874973 0.000111162 -0.0194902 1 0 1 1 0 0 +EDGE2 9417 7216 -1.05888 -0.00202226 0.0128052 1 0 1 1 0 0 +EDGE2 9418 7217 -0.982533 0.0168688 -0.0120597 1 0 1 1 0 0 +EDGE2 9418 7738 -0.034799 0.00955038 -0.0120506 1 0 1 1 0 0 +EDGE2 9418 7219 1.00916 0.0151961 -0.00207681 1 0 1 1 0 0 +EDGE2 9418 7739 1.00224 0.0433133 -0.0353258 1 0 1 1 0 0 +EDGE2 9418 7737 -1.06256 0.0406367 0.0186421 1 0 1 1 0 0 +EDGE2 9418 9417 -1.08106 0.036666 0.00880793 1 0 1 1 0 0 +EDGE2 9418 7218 0.0667443 0.00899888 0.0323494 1 0 1 1 0 0 +EDGE2 9419 7740 1.04088 0.00232174 0.0195757 1 0 1 1 0 0 +EDGE2 9419 7200 1.01992 -0.0352155 -3.13265 1 0 1 1 0 0 +EDGE2 9419 7220 0.985999 0.00866622 0.0341201 1 0 1 1 0 0 +EDGE2 9419 7738 -1.06946 -0.0554679 0.00863589 1 0 1 1 0 0 +EDGE2 9419 7219 0.0215957 0.0222448 -0.0186139 1 0 1 1 0 0 +EDGE2 9419 7739 -0.0346879 -0.0666245 0.0252204 1 0 1 1 0 0 +EDGE2 9419 9418 -1.0141 -0.00635427 -0.00241117 1 0 1 1 0 0 +EDGE2 9419 7218 -1.00798 -0.0294231 -0.00460374 1 0 1 1 0 0 +EDGE2 9420 7199 1.0946 0.0234261 -3.13356 1 0 1 1 0 0 +EDGE2 9420 7201 0.0318436 1.03104 1.5742 1 0 1 1 0 0 +EDGE2 9420 7740 -0.04041 0.0582214 0.0373295 1 0 1 1 0 0 +EDGE2 9420 7741 0.0859328 1.09202 1.57251 1 0 1 1 0 0 +EDGE2 9420 7200 0.0259557 -0.00614824 -3.13967 1 0 1 1 0 0 +EDGE2 9420 7220 -0.0460532 0.0557496 -0.00515765 1 0 1 1 0 0 +EDGE2 9420 7221 0.0637204 0.959738 1.59734 1 0 1 1 0 0 +EDGE2 9420 7219 -0.976412 -0.0831558 -0.00156553 1 0 1 1 0 0 +EDGE2 9420 7739 -1.00147 -0.00550254 -0.00226301 1 0 1 1 0 0 +EDGE2 9420 9419 -0.962905 0.0682424 -0.0156947 1 0 1 1 0 0 +EDGE2 9421 7740 -0.979056 0.0188812 1.58125 1 0 1 1 0 0 +EDGE2 9421 9420 -1.0283 -0.0490964 1.55599 1 0 1 1 0 0 +EDGE2 9421 7200 -0.976472 0.0127196 -1.56549 1 0 1 1 0 0 +EDGE2 9421 7220 -1.04584 0.0666365 1.54847 1 0 1 1 0 0 +EDGE2 9422 9421 -1.0149 0.0263977 0.0258779 1 0 1 1 0 0 +EDGE2 9423 9422 -1.02304 -0.0400057 0.0123242 1 0 1 1 0 0 +EDGE2 9424 7625 0.891234 0.0427307 -3.16648 1 0 1 1 0 0 +EDGE2 9424 7605 1.01579 0.0077055 -3.13343 1 0 1 1 0 0 +EDGE2 9424 9423 -0.961904 -0.0701639 -0.00359152 1 0 1 1 0 0 +EDGE2 9425 7625 0.0468578 0.0364681 -3.14088 1 0 1 1 0 0 +EDGE2 9425 7624 0.958601 0.000759589 -3.09938 1 0 1 1 0 0 +EDGE2 9425 7604 0.933612 0.0117721 -3.14294 1 0 1 1 0 0 +EDGE2 9425 7626 -0.0813177 1.02137 1.55686 1 0 1 1 0 0 +EDGE2 9425 7606 0.0213783 -0.937742 -1.55985 1 0 1 1 0 0 +EDGE2 9425 7605 0.0102605 -0.0672616 -3.16577 1 0 1 1 0 0 +EDGE2 9425 9424 -0.947094 -0.0150148 -0.0186574 1 0 1 1 0 0 +EDGE2 9426 7625 -1.01765 0.00943959 1.56923 1 0 1 1 0 0 +EDGE2 9426 7627 1.01556 0.0156229 0.013128 1 0 1 1 0 0 +EDGE2 9426 7626 0.112861 0.0123337 -0.00269944 1 0 1 1 0 0 +EDGE2 9426 9425 -1.0548 -0.00987523 -1.60959 1 0 1 1 0 0 +EDGE2 9426 7605 -0.918579 -0.0359843 1.58507 1 0 1 1 0 0 +EDGE2 9427 7627 4.46914e-05 0.0169358 0.037306 1 0 1 1 0 0 +EDGE2 9427 7628 0.992571 0.028104 0.0315931 1 0 1 1 0 0 +EDGE2 9427 7626 -0.974825 0.0370842 0.00811854 1 0 1 1 0 0 +EDGE2 9427 9426 -0.935707 0.0110354 0.0161298 1 0 1 1 0 0 +EDGE2 9428 7627 -1.06202 0.0402319 0.00272101 1 0 1 1 0 0 +EDGE2 9428 7628 0.0328377 0.0972507 -0.00900547 1 0 1 1 0 0 +EDGE2 9428 7629 1.01551 0.0554491 0.0177015 1 0 1 1 0 0 +EDGE2 9428 9427 -1.07106 0.0595284 -0.0065375 1 0 1 1 0 0 +EDGE2 9429 7370 0.97269 -0.026802 -3.18767 1 0 1 1 0 0 +EDGE2 9429 7630 1.00901 0.0482741 0.0324757 1 0 1 1 0 0 +EDGE2 9429 7190 1.02446 0.0219595 -3.11669 1 0 1 1 0 0 +EDGE2 9429 7628 -0.961958 -0.0661662 0.0285742 1 0 1 1 0 0 +EDGE2 9429 9428 -0.983944 0.0283728 -0.0219183 1 0 1 1 0 0 +EDGE2 9429 7629 -0.0266325 0.0898237 -0.0246525 1 0 1 1 0 0 +EDGE2 9430 7369 1.0012 -0.0243354 -3.16875 1 0 1 1 0 0 +EDGE2 9430 7189 1.06168 -0.0584826 -3.13729 1 0 1 1 0 0 +EDGE2 9430 7370 0.0533214 -0.0343834 -3.16709 1 0 1 1 0 0 +EDGE2 9430 7631 -0.0759119 -1.01945 -1.57079 1 0 1 1 0 0 +EDGE2 9430 7371 0.0231831 -1.07385 -1.56958 1 0 1 1 0 0 +EDGE2 9430 7630 0.0333894 0.0793822 0.0176822 1 0 1 1 0 0 +EDGE2 9430 9429 -0.998581 0.0406682 -0.00961042 1 0 1 1 0 0 +EDGE2 9430 7190 0.02983 -0.0538208 -3.16243 1 0 1 1 0 0 +EDGE2 9430 7629 -0.957512 -0.0908784 0.0186205 1 0 1 1 0 0 +EDGE2 9430 7191 0.00290229 1.00461 1.56953 1 0 1 1 0 0 +EDGE2 9431 7370 -1.14818 -0.062171 -1.57687 1 0 1 1 0 0 +EDGE2 9431 7631 -0.034075 -0.0323799 -0.0346107 1 0 1 1 0 0 +EDGE2 9431 7372 1.00673 0.0447643 0.0165995 1 0 1 1 0 0 +EDGE2 9431 7632 0.936838 0.0588529 -0.0154014 1 0 1 1 0 0 +EDGE2 9431 9430 -1.01632 0.0557557 1.56335 1 0 1 1 0 0 +EDGE2 9431 7371 -0.0673218 0.0629351 -0.0127106 1 0 1 1 0 0 +EDGE2 9431 7630 -1.03868 -0.0399703 1.60154 1 0 1 1 0 0 +EDGE2 9431 7190 -1.04888 -0.0525612 -1.56061 1 0 1 1 0 0 +EDGE2 9432 7373 0.96349 0.058351 -0.0128519 1 0 1 1 0 0 +EDGE2 9432 7633 1.01964 0.125307 0.0076933 1 0 1 1 0 0 +EDGE2 9432 7631 -0.960984 -0.0217277 0.0174584 1 0 1 1 0 0 +EDGE2 9432 7372 0.00287167 -0.0396852 -0.0123903 1 0 1 1 0 0 +EDGE2 9432 7632 -0.0100933 -0.0558338 0.0173022 1 0 1 1 0 0 +EDGE2 9432 9431 -0.993024 0.0413621 -0.0396896 1 0 1 1 0 0 +EDGE2 9432 7371 -1.08269 0.00928119 0.00976428 1 0 1 1 0 0 +EDGE2 9433 9432 -0.892063 0.059663 -0.00467888 1 0 1 1 0 0 +EDGE2 9433 7634 1.02135 0.0406607 -0.0553142 1 0 1 1 0 0 +EDGE2 9433 7374 0.986333 -0.099834 -0.0173025 1 0 1 1 0 0 +EDGE2 9433 7373 0.0367546 0.0483221 -0.009669 1 0 1 1 0 0 +EDGE2 9433 7633 -0.0277883 -0.0564285 -0.0217299 1 0 1 1 0 0 +EDGE2 9433 7372 -0.986997 -0.0138125 -0.0031705 1 0 1 1 0 0 +EDGE2 9433 7632 -0.959136 0.0814248 0.0244323 1 0 1 1 0 0 +EDGE2 9434 7975 0.998753 0.0301578 -3.15154 1 0 1 1 0 0 +EDGE2 9434 7375 1.07286 -0.00630468 0.00114725 1 0 1 1 0 0 +EDGE2 9434 7595 1.03582 0.0927781 -3.18892 1 0 1 1 0 0 +EDGE2 9434 7635 0.957515 0.020084 -0.0220044 1 0 1 1 0 0 +EDGE2 9434 7634 0.0366583 -0.0108848 0.00208638 1 0 1 1 0 0 +EDGE2 9434 7374 -0.00670032 -0.139759 -0.0074849 1 0 1 1 0 0 +EDGE2 9434 7373 -0.952407 0.00694796 0.0300527 1 0 1 1 0 0 +EDGE2 9434 7633 -1.00802 -0.0519555 -0.00269742 1 0 1 1 0 0 +EDGE2 9434 9433 -0.979739 0.0112776 0.0129655 1 0 1 1 0 0 +EDGE2 9435 7975 0.0703996 0.0498387 -3.15322 1 0 1 1 0 0 +EDGE2 9435 7974 1.00471 -0.0172313 -3.10302 1 0 1 1 0 0 +EDGE2 9435 7594 0.951227 0.0426899 -3.15942 1 0 1 1 0 0 +EDGE2 9435 7376 0.00956715 0.903214 1.55399 1 0 1 1 0 0 +EDGE2 9435 7596 -0.0379318 -0.954092 -1.5955 1 0 1 1 0 0 +EDGE2 9435 7636 0.0354261 -0.98802 -1.57871 1 0 1 1 0 0 +EDGE2 9435 7375 0.0269236 -0.0102424 0.0134686 1 0 1 1 0 0 +EDGE2 9435 7595 0.0923314 0.0645503 -3.14393 1 0 1 1 0 0 +EDGE2 9435 7635 -0.0747272 0.0480243 0.0395612 1 0 1 1 0 0 +EDGE2 9435 7976 -0.0618955 -0.968196 -1.55646 1 0 1 1 0 0 +EDGE2 9435 7634 -0.979155 -0.0192056 -0.0216004 1 0 1 1 0 0 +EDGE2 9435 9434 -1.00361 0.110964 0.0264141 1 0 1 1 0 0 +EDGE2 9435 7374 -1.03302 -0.0635621 0.00881693 1 0 1 1 0 0 +EDGE2 9436 7975 -0.997717 0.0267118 1.58575 1 0 1 1 0 0 +EDGE2 9436 7377 1.08225 -0.0245802 0.00593653 1 0 1 1 0 0 +EDGE2 9436 7376 -0.0132373 -0.0294773 0.0237905 1 0 1 1 0 0 +EDGE2 9436 9435 -0.993422 -0.0143243 -1.5822 1 0 1 1 0 0 +EDGE2 9436 7375 -1.01962 -0.0285612 -1.58956 1 0 1 1 0 0 +EDGE2 9436 7595 -1.00525 -0.0354936 1.60119 1 0 1 1 0 0 +EDGE2 9436 7635 -0.984241 0.0174401 -1.5675 1 0 1 1 0 0 +EDGE2 9437 7378 1.01606 0.0358973 0.0201168 1 0 1 1 0 0 +EDGE2 9437 7377 -0.106045 0.0906282 -0.0195153 1 0 1 1 0 0 +EDGE2 9437 7376 -0.984179 -0.0694127 -0.0252063 1 0 1 1 0 0 +EDGE2 9437 9436 -1.09183 -0.0411297 -0.0273434 1 0 1 1 0 0 +EDGE2 9438 7379 0.997702 0.0158538 0.0155118 1 0 1 1 0 0 +EDGE2 9438 9437 -1.04022 0.0313842 -0.00685951 1 0 1 1 0 0 +EDGE2 9438 7378 -0.111919 0.0653236 0.0150388 1 0 1 1 0 0 +EDGE2 9438 7377 -0.921182 0.00135157 -0.000228955 1 0 1 1 0 0 +EDGE2 9439 7520 0.961366 0.00724132 -3.1031 1 0 1 1 0 0 +EDGE2 9439 7540 1.02121 -0.0566763 -3.1215 1 0 1 1 0 0 +EDGE2 9439 7580 1.04516 -0.0357538 -3.14021 1 0 1 1 0 0 +EDGE2 9439 7940 1.08287 0.0472975 -3.15081 1 0 1 1 0 0 +EDGE2 9439 7960 0.941837 0.000556924 -3.16687 1 0 1 1 0 0 +EDGE2 9439 7560 1.01951 0.0442103 -3.16413 1 0 1 1 0 0 +EDGE2 9439 7380 0.956593 -0.0387644 -0.00623876 1 0 1 1 0 0 +EDGE2 9439 7460 0.918596 -0.0495882 -3.14311 1 0 1 1 0 0 +EDGE2 9439 9438 -0.974483 0.0971363 -0.00298022 1 0 1 1 0 0 +EDGE2 9439 7379 -0.0199233 0.0421854 -0.0294834 1 0 1 1 0 0 +EDGE2 9439 7378 -1.0006 0.00148137 0.0049871 1 0 1 1 0 0 +EDGE2 9440 7520 -0.0181588 0.00112692 -3.11234 1 0 1 1 0 0 +EDGE2 9440 7539 1.06273 -0.0557677 -3.10586 1 0 1 1 0 0 +EDGE2 9440 7579 0.981287 -0.0345662 -3.1338 1 0 1 1 0 0 +EDGE2 9440 7939 1.02418 0.00981373 -3.12286 1 0 1 1 0 0 +EDGE2 9440 7959 1.0089 0.0500915 -3.15407 1 0 1 1 0 0 +EDGE2 9440 7559 0.98856 0.0370748 -3.13023 1 0 1 1 0 0 +EDGE2 9440 7459 1.02213 0.0594794 -3.11957 1 0 1 1 0 0 +EDGE2 9440 7519 0.916645 -0.0599742 -3.11522 1 0 1 1 0 0 +EDGE2 9440 7540 -0.161499 0.083817 -3.16752 1 0 1 1 0 0 +EDGE2 9440 7561 0.045827 -0.973525 -1.5684 1 0 1 1 0 0 +EDGE2 9440 7961 0.00614892 -0.981588 -1.55566 1 0 1 1 0 0 +EDGE2 9440 7581 -0.0456881 -0.960722 -1.56846 1 0 1 1 0 0 +EDGE2 9440 7381 -0.0301123 -0.952923 -1.588 1 0 1 1 0 0 +EDGE2 9440 7461 0.0420553 -0.972812 -1.56847 1 0 1 1 0 0 +EDGE2 9440 7541 0.0916549 -0.940076 -1.57299 1 0 1 1 0 0 +EDGE2 9440 7580 -0.0288619 0.0158553 -3.15982 1 0 1 1 0 0 +EDGE2 9440 7940 0.0724589 0.0561181 -3.15376 1 0 1 1 0 0 +EDGE2 9440 7960 0.152723 -0.0872398 -3.15321 1 0 1 1 0 0 +EDGE2 9440 7560 0.0531482 0.0339922 -3.14814 1 0 1 1 0 0 +EDGE2 9440 7941 -0.020319 1.00379 1.54573 1 0 1 1 0 0 +EDGE2 9440 7380 0.0111953 0.0105361 0.0018039 1 0 1 1 0 0 +EDGE2 9440 7460 -0.0528679 -0.0325608 -3.16526 1 0 1 1 0 0 +EDGE2 9440 7521 0.023884 1.00872 1.62293 1 0 1 1 0 0 +EDGE2 9440 7379 -1.01141 -0.0335481 -0.0319101 1 0 1 1 0 0 +EDGE2 9440 9439 -1.04324 0.0986371 0.00597594 1 0 1 1 0 0 +EDGE2 9441 7520 -0.99437 0.0563552 1.58509 1 0 1 1 0 0 +EDGE2 9441 7540 -1.0391 -0.00748751 1.58841 1 0 1 1 0 0 +EDGE2 9441 9440 -1.03371 -0.0394618 -1.58196 1 0 1 1 0 0 +EDGE2 9441 7580 -1.04706 -0.00831249 1.58288 1 0 1 1 0 0 +EDGE2 9441 7940 -0.963266 -0.158847 1.57116 1 0 1 1 0 0 +EDGE2 9441 7960 -1.02165 0.0874154 1.57603 1 0 1 1 0 0 +EDGE2 9441 7560 -1.03442 0.0386728 1.53266 1 0 1 1 0 0 +EDGE2 9441 7522 1.06376 -0.0409151 0.00313728 1 0 1 1 0 0 +EDGE2 9441 7941 -0.000162779 -0.0632362 -0.0179983 1 0 1 1 0 0 +EDGE2 9441 7380 -1.03109 0.0508338 -1.54751 1 0 1 1 0 0 +EDGE2 9441 7460 -1.04862 0.0492988 1.56873 1 0 1 1 0 0 +EDGE2 9441 7521 0.0270803 -0.0507945 -0.023187 1 0 1 1 0 0 +EDGE2 9441 7942 1.04784 0.0334015 0.0114468 1 0 1 1 0 0 +EDGE2 9442 7522 0.047421 -0.0609768 -0.00876233 1 0 1 1 0 0 +EDGE2 9442 7941 -1.03141 -0.00728987 -0.0224691 1 0 1 1 0 0 +EDGE2 9442 9441 -0.978511 0.0657783 0.0460028 1 0 1 1 0 0 +EDGE2 9442 7521 -0.906569 0.0553248 0.0305035 1 0 1 1 0 0 +EDGE2 9442 7942 0.00848517 -0.0600189 0.0335803 1 0 1 1 0 0 +EDGE2 9442 7943 1.04427 0.063225 -0.0313409 1 0 1 1 0 0 +EDGE2 9442 7523 0.900602 0.0415183 -0.0169685 1 0 1 1 0 0 +EDGE2 9443 7944 0.989239 -0.017032 -0.0189371 1 0 1 1 0 0 +EDGE2 9443 7522 -1.03562 0.0575463 0.000982297 1 0 1 1 0 0 +EDGE2 9443 9442 -0.955118 0.0117369 -0.00447554 1 0 1 1 0 0 +EDGE2 9443 7942 -1.01293 0.0038462 -0.00591774 1 0 1 1 0 0 +EDGE2 9443 7943 -0.0299593 -0.0543203 -0.0190774 1 0 1 1 0 0 +EDGE2 9443 7523 0.0318035 -0.0258985 -0.015142 1 0 1 1 0 0 +EDGE2 9443 7524 0.959187 0.0348054 -0.00314564 1 0 1 1 0 0 +EDGE2 9444 7944 0.0835928 0.0400959 -0.0214657 1 0 1 1 0 0 +EDGE2 9444 7943 -1.04511 -0.0343023 -0.00560748 1 0 1 1 0 0 +EDGE2 9444 9443 -1.09467 -1.66384e-05 -0.0320984 1 0 1 1 0 0 +EDGE2 9444 7523 -1.06677 0.0426535 0.021387 1 0 1 1 0 0 +EDGE2 9444 7525 0.995835 -0.0572928 -0.00180846 1 0 1 1 0 0 +EDGE2 9444 7925 1.0911 0.0373839 -3.12277 1 0 1 1 0 0 +EDGE2 9444 7524 0.0604495 -0.0379258 0.0227115 1 0 1 1 0 0 +EDGE2 9444 7945 1.04142 0.0141605 -0.0100489 1 0 1 1 0 0 +EDGE2 9444 7285 1.07833 -0.0220025 -3.14697 1 0 1 1 0 0 +EDGE2 9444 7325 0.99359 -0.0475618 -3.11968 1 0 1 1 0 0 +EDGE2 9444 7345 1.03165 0.0466589 -3.14323 1 0 1 1 0 0 +EDGE2 9444 7365 1.02948 -0.0240291 -3.13838 1 0 1 1 0 0 +EDGE2 9444 7305 0.982115 -0.0506877 -3.12511 1 0 1 1 0 0 +EDGE2 9444 7185 1.06204 0.0255881 -3.15837 1 0 1 1 0 0 +EDGE2 9445 7944 -1.00941 0.0275292 0.00829839 1 0 1 1 0 0 +EDGE2 9445 7326 0.0427498 -1.02264 -1.5885 1 0 1 1 0 0 +EDGE2 9445 7526 -0.00880691 -0.951332 -1.55552 1 0 1 1 0 0 +EDGE2 9445 7926 0.0390596 -1.02909 -1.5785 1 0 1 1 0 0 +EDGE2 9445 7946 -0.0256168 -0.974634 -1.56692 1 0 1 1 0 0 +EDGE2 9445 7346 -0.0313439 -1.00116 -1.62176 1 0 1 1 0 0 +EDGE2 9445 7286 0.00337759 -1.09294 -1.56895 1 0 1 1 0 0 +EDGE2 9445 7306 -0.0117655 -0.978274 -1.54863 1 0 1 1 0 0 +EDGE2 9445 9444 -1.05044 -0.0259193 -0.000442111 1 0 1 1 0 0 +EDGE2 9445 7525 0.103262 0.0134552 -0.00466741 1 0 1 1 0 0 +EDGE2 9445 7925 -0.0413762 -0.00249668 -3.1363 1 0 1 1 0 0 +EDGE2 9445 7524 -0.931578 0.0328487 -0.00155265 1 0 1 1 0 0 +EDGE2 9445 7945 0.0551429 -0.078938 -0.00931495 1 0 1 1 0 0 +EDGE2 9445 7285 0.0180155 -0.033651 -3.15827 1 0 1 1 0 0 +EDGE2 9445 7325 -0.00571114 -0.00589618 -3.14531 1 0 1 1 0 0 +EDGE2 9445 7345 0.00416888 0.0262462 -3.18653 1 0 1 1 0 0 +EDGE2 9445 7365 -0.0785298 -0.0359414 -3.11644 1 0 1 1 0 0 +EDGE2 9445 7305 -0.0206458 0.0231253 -3.14468 1 0 1 1 0 0 +EDGE2 9445 7366 0.0491356 0.97776 1.55462 1 0 1 1 0 0 +EDGE2 9445 7185 0.0169328 0.0159916 -3.15468 1 0 1 1 0 0 +EDGE2 9445 7186 -0.00482195 1.02432 1.57865 1 0 1 1 0 0 +EDGE2 9445 7304 0.969884 -0.0384156 -3.14544 1 0 1 1 0 0 +EDGE2 9445 7344 0.898841 -0.0961986 -3.15258 1 0 1 1 0 0 +EDGE2 9445 7364 1.08184 -0.0157191 -3.12733 1 0 1 1 0 0 +EDGE2 9445 7924 0.902687 -0.0151953 -3.15137 1 0 1 1 0 0 +EDGE2 9445 7324 0.971699 -0.0252363 -3.16328 1 0 1 1 0 0 +EDGE2 9445 7184 1.02864 0.00221795 -3.14665 1 0 1 1 0 0 +EDGE2 9445 7284 0.917704 0.0156729 -3.12073 1 0 1 1 0 0 +EDGE2 9446 7525 -1.00387 -0.0268176 -1.55118 1 0 1 1 0 0 +EDGE2 9446 7925 -0.945647 0.0571963 1.597 1 0 1 1 0 0 +EDGE2 9446 9445 -0.935905 0.0318856 -1.58245 1 0 1 1 0 0 +EDGE2 9446 7945 -0.983281 0.0346482 -1.54871 1 0 1 1 0 0 +EDGE2 9446 7285 -1.02635 0.0136295 1.55948 1 0 1 1 0 0 +EDGE2 9446 7325 -0.900578 0.0232103 1.53544 1 0 1 1 0 0 +EDGE2 9446 7345 -0.945272 -0.0178264 1.58689 1 0 1 1 0 0 +EDGE2 9446 7365 -1.07727 0.0631703 1.5383 1 0 1 1 0 0 +EDGE2 9446 7305 -1.00556 0.0914546 1.59885 1 0 1 1 0 0 +EDGE2 9446 7366 0.081162 -0.108012 -0.0344609 1 0 1 1 0 0 +EDGE2 9446 7185 -0.977144 -0.0710482 1.55957 1 0 1 1 0 0 +EDGE2 9446 7186 0.0144907 -0.0643137 0.0062252 1 0 1 1 0 0 +EDGE2 9446 7187 1.02387 -0.00464097 0.0106497 1 0 1 1 0 0 +EDGE2 9446 7367 1.0524 -0.158118 0.00840802 1 0 1 1 0 0 +EDGE2 9447 7366 -1.05456 0.0572476 -0.000294989 1 0 1 1 0 0 +EDGE2 9447 9446 -1.09163 -0.0402927 -0.0197751 1 0 1 1 0 0 +EDGE2 9447 7186 -0.969298 0.0275583 -0.00787433 1 0 1 1 0 0 +EDGE2 9447 7188 0.905159 0.0436818 0.00258279 1 0 1 1 0 0 +EDGE2 9447 7187 0.0558704 -0.0230918 0.052197 1 0 1 1 0 0 +EDGE2 9447 7367 -0.050854 0.00173192 -0.025529 1 0 1 1 0 0 +EDGE2 9447 7368 1.0459 0.00698342 0.00705589 1 0 1 1 0 0 +EDGE2 9448 9447 -0.94905 0.0280186 0.0344342 1 0 1 1 0 0 +EDGE2 9448 7188 0.00967613 -0.0547258 -0.0100739 1 0 1 1 0 0 +EDGE2 9448 7187 -0.9901 -0.0404262 0.00963651 1 0 1 1 0 0 +EDGE2 9448 7367 -1.10461 0.024645 -0.0304325 1 0 1 1 0 0 +EDGE2 9448 7368 0.0742233 -0.0530679 -0.0151813 1 0 1 1 0 0 +EDGE2 9448 7369 1.07771 -0.0927401 -0.00976443 1 0 1 1 0 0 +EDGE2 9448 7189 0.985992 -0.00802753 -0.0126432 1 0 1 1 0 0 +EDGE2 9449 7188 -1.04742 0.0572253 -0.0483201 1 0 1 1 0 0 +EDGE2 9449 9448 -1.02414 0.0583676 0.0216588 1 0 1 1 0 0 +EDGE2 9449 7368 -0.984977 -0.0412149 0.00194713 1 0 1 1 0 0 +EDGE2 9449 7369 -0.0803256 -0.0267913 0.0424611 1 0 1 1 0 0 +EDGE2 9449 7189 0.0753529 0.0403281 0.00498798 1 0 1 1 0 0 +EDGE2 9449 7370 1.07697 0.0185414 -0.00262397 1 0 1 1 0 0 +EDGE2 9449 9430 0.979898 -0.0810796 -3.13012 1 0 1 1 0 0 +EDGE2 9449 7630 0.966019 0.0162116 -3.15506 1 0 1 1 0 0 +EDGE2 9449 7190 0.921778 -0.0117624 0.022743 1 0 1 1 0 0 +EDGE2 9450 7369 -0.954368 0.0059375 0.0181837 1 0 1 1 0 0 +EDGE2 9450 9449 -0.987571 -0.0468006 -0.0152645 1 0 1 1 0 0 +EDGE2 9450 7189 -0.931675 0.0237722 -0.00665198 1 0 1 1 0 0 +EDGE2 9450 7370 0.0606935 0.041888 -0.0198955 1 0 1 1 0 0 +EDGE2 9450 7631 0.0387616 0.88289 1.54228 1 0 1 1 0 0 +EDGE2 9450 9431 0.0537186 0.902188 1.58333 1 0 1 1 0 0 +EDGE2 9450 9430 0.0607234 -0.0719921 -3.12892 1 0 1 1 0 0 +EDGE2 9450 7371 0.091019 0.991898 1.53488 1 0 1 1 0 0 +EDGE2 9450 7630 -0.0782961 -0.0413736 -3.12702 1 0 1 1 0 0 +EDGE2 9450 9429 1.06739 -0.0845755 -3.14482 1 0 1 1 0 0 +EDGE2 9450 7190 -0.00179606 0.0710805 0.00973549 1 0 1 1 0 0 +EDGE2 9450 7629 1.02166 0.000150682 -3.11988 1 0 1 1 0 0 +EDGE2 9450 7191 -0.0477359 -1.03678 -1.54847 1 0 1 1 0 0 +EDGE2 9451 7370 -0.988306 -0.00390194 -1.59909 1 0 1 1 0 0 +EDGE2 9451 9432 0.926044 -0.0388493 0.0214568 1 0 1 1 0 0 +EDGE2 9451 7631 -0.0531626 -0.0516021 0.00109098 1 0 1 1 0 0 +EDGE2 9451 7372 1.00648 0.0317203 0.0211143 1 0 1 1 0 0 +EDGE2 9451 7632 1.10327 0.000801253 -0.00118737 1 0 1 1 0 0 +EDGE2 9451 9431 -0.05761 0.0533917 -0.0406758 1 0 1 1 0 0 +EDGE2 9451 9430 -0.983343 0.00611089 1.55377 1 0 1 1 0 0 +EDGE2 9451 9450 -0.987951 -0.0287546 -1.53894 1 0 1 1 0 0 +EDGE2 9451 7371 -0.00476551 -0.023651 0.00448555 1 0 1 1 0 0 +EDGE2 9451 7630 -0.977028 0.0999247 1.6033 1 0 1 1 0 0 +EDGE2 9451 7190 -0.958044 0.00837571 -1.58345 1 0 1 1 0 0 +EDGE2 9452 9432 0.0351107 -0.011518 -0.00566785 1 0 1 1 0 0 +EDGE2 9452 7373 0.950178 -0.0193951 0.000497379 1 0 1 1 0 0 +EDGE2 9452 7633 1.02612 -0.0531166 0.0338121 1 0 1 1 0 0 +EDGE2 9452 9433 1.06059 0.00324879 -0.00568124 1 0 1 1 0 0 +EDGE2 9452 7631 -1.05325 -0.0104068 0.000188484 1 0 1 1 0 0 +EDGE2 9452 9451 -0.968371 0.0261719 0.0297737 1 0 1 1 0 0 +EDGE2 9452 7372 0.0535872 0.0122546 0.00442032 1 0 1 1 0 0 +EDGE2 9452 7632 0.0169264 -0.0378931 0.00888301 1 0 1 1 0 0 +EDGE2 9452 9431 -0.933911 0.0032216 0.0162932 1 0 1 1 0 0 +EDGE2 9452 7371 -1.0799 0.0330852 0.000542901 1 0 1 1 0 0 +EDGE2 9453 9432 -1.0067 -0.106974 0.00164308 1 0 1 1 0 0 +EDGE2 9453 7634 0.936389 0.00602352 -0.0103076 1 0 1 1 0 0 +EDGE2 9453 9434 1.07348 0.02115 -0.00976886 1 0 1 1 0 0 +EDGE2 9453 7374 0.964582 -0.0544603 0.00587854 1 0 1 1 0 0 +EDGE2 9453 7373 0.0542654 0.00957574 0.0121792 1 0 1 1 0 0 +EDGE2 9453 7633 -0.0570691 -0.055519 -0.0141262 1 0 1 1 0 0 +EDGE2 9453 9433 -0.00290935 0.0149966 0.00120151 1 0 1 1 0 0 +EDGE2 9453 9452 -1.05217 -0.0263142 0.0348823 1 0 1 1 0 0 +EDGE2 9453 7372 -1.00585 0.0722735 -0.0123307 1 0 1 1 0 0 +EDGE2 9453 7632 -0.979021 0.000404815 0.0308159 1 0 1 1 0 0 +EDGE2 9454 7975 0.931034 -0.0402735 -3.13324 1 0 1 1 0 0 +EDGE2 9454 9435 0.98846 0.0535061 -0.00404108 1 0 1 1 0 0 +EDGE2 9454 7375 0.922389 0.0128528 -0.0183741 1 0 1 1 0 0 +EDGE2 9454 7595 1.00685 0.0631778 -3.16642 1 0 1 1 0 0 +EDGE2 9454 7635 0.960117 0.00446145 0.0185146 1 0 1 1 0 0 +EDGE2 9454 9453 -1.02504 -0.0226762 -0.0326391 1 0 1 1 0 0 +EDGE2 9454 7634 -0.0451755 0.0526701 -0.00581616 1 0 1 1 0 0 +EDGE2 9454 9434 0.144995 -0.0421678 -0.00883408 1 0 1 1 0 0 +EDGE2 9454 7374 -0.0410164 0.0833083 0.0134107 1 0 1 1 0 0 +EDGE2 9454 7373 -0.94234 -0.0150276 -0.0141993 1 0 1 1 0 0 +EDGE2 9454 7633 -1.00255 0.0562928 0.0242962 1 0 1 1 0 0 +EDGE2 9454 9433 -1.0111 0.0766786 -0.0335824 1 0 1 1 0 0 +EDGE2 9455 7975 -0.0193772 -0.0568053 -3.1716 1 0 1 1 0 0 +EDGE2 9455 7974 0.985153 0.071635 -3.15889 1 0 1 1 0 0 +EDGE2 9455 7594 1.04148 0.0352417 -3.11029 1 0 1 1 0 0 +EDGE2 9455 7376 0.0285202 0.940996 1.59342 1 0 1 1 0 0 +EDGE2 9455 9436 0.0876984 0.887059 1.58533 1 0 1 1 0 0 +EDGE2 9455 9435 0.0229141 -0.0453609 0.0321976 1 0 1 1 0 0 +EDGE2 9455 7596 -0.0412443 -1.03609 -1.56599 1 0 1 1 0 0 +EDGE2 9455 7636 -0.0253644 -0.936756 -1.58757 1 0 1 1 0 0 +EDGE2 9455 7375 0.0217175 -0.0184656 -0.0192426 1 0 1 1 0 0 +EDGE2 9455 7595 -0.11758 -0.0362396 -3.16803 1 0 1 1 0 0 +EDGE2 9455 7635 -0.0170866 -0.0920773 -0.000795321 1 0 1 1 0 0 +EDGE2 9455 7976 -0.0442719 -0.967585 -1.56301 1 0 1 1 0 0 +EDGE2 9455 7634 -0.943157 -0.0260776 -0.0101381 1 0 1 1 0 0 +EDGE2 9455 9434 -0.947458 0.0453704 -0.00909878 1 0 1 1 0 0 +EDGE2 9455 9454 -0.991199 0.0667283 -0.0517323 1 0 1 1 0 0 +EDGE2 9455 7374 -0.978814 -0.0774964 -0.0173187 1 0 1 1 0 0 +EDGE2 9456 7975 -1.01557 0.0336351 1.58867 1 0 1 1 0 0 +EDGE2 9456 9437 1.01837 -0.0780343 -0.0172352 1 0 1 1 0 0 +EDGE2 9456 7377 0.980108 -0.0776934 0.00600017 1 0 1 1 0 0 +EDGE2 9456 9455 -1.0027 -0.0877966 -1.53934 1 0 1 1 0 0 +EDGE2 9456 7376 -0.0138473 -0.0439606 0.0183285 1 0 1 1 0 0 +EDGE2 9456 9436 0.0138717 -0.0209701 -0.0108038 1 0 1 1 0 0 +EDGE2 9456 9435 -1.03354 -0.021133 -1.57703 1 0 1 1 0 0 +EDGE2 9456 7375 -0.983396 0.0233696 -1.59618 1 0 1 1 0 0 +EDGE2 9456 7595 -0.970915 0.0914316 1.54623 1 0 1 1 0 0 +EDGE2 9456 7635 -0.994263 -0.00105756 -1.55881 1 0 1 1 0 0 +EDGE2 9457 9438 1.07329 -0.00192267 -0.000937017 1 0 1 1 0 0 +EDGE2 9457 9456 -1.02492 -0.0766715 -0.0149144 1 0 1 1 0 0 +EDGE2 9457 9437 -0.0235212 0.00740568 -0.0440157 1 0 1 1 0 0 +EDGE2 9457 7378 0.949117 0.0445998 0.00775941 1 0 1 1 0 0 +EDGE2 9457 7377 -0.0331951 -0.0482926 0.00544568 1 0 1 1 0 0 +EDGE2 9457 7376 -1.04032 0.0213731 0.0137313 1 0 1 1 0 0 +EDGE2 9457 9436 -0.965228 0.0630891 -0.0126779 1 0 1 1 0 0 +EDGE2 9458 9438 0.0614509 0.134934 -0.000197692 1 0 1 1 0 0 +EDGE2 9458 7379 0.99015 -0.0521136 -0.00301835 1 0 1 1 0 0 +EDGE2 9458 9439 0.935715 0.00719963 0.00373348 1 0 1 1 0 0 +EDGE2 9458 9437 -0.981621 0.00434388 0.036359 1 0 1 1 0 0 +EDGE2 9458 9457 -1.03324 0.0366824 -0.00113538 1 0 1 1 0 0 +EDGE2 9458 7378 0.0713446 -0.00587957 -0.000299022 1 0 1 1 0 0 +EDGE2 9458 7377 -0.979457 -0.115629 0.00530465 1 0 1 1 0 0 +EDGE2 9459 7520 1.01291 -0.0425003 -3.15233 1 0 1 1 0 0 +EDGE2 9459 7540 0.963913 0.0175874 -3.14289 1 0 1 1 0 0 +EDGE2 9459 9440 1.04718 -0.0251685 -0.0197139 1 0 1 1 0 0 +EDGE2 9459 7580 0.952647 -0.0319873 -3.14901 1 0 1 1 0 0 +EDGE2 9459 7940 0.976758 0.0162597 -3.16391 1 0 1 1 0 0 +EDGE2 9459 7960 0.966986 0.0103214 -3.13766 1 0 1 1 0 0 +EDGE2 9459 7560 0.959479 0.00364864 -3.09204 1 0 1 1 0 0 +EDGE2 9459 7380 0.929189 -0.00901529 -0.0116421 1 0 1 1 0 0 +EDGE2 9459 7460 0.902488 -0.0540809 -3.19125 1 0 1 1 0 0 +EDGE2 9459 9438 -0.9337 -0.142761 0.00438331 1 0 1 1 0 0 +EDGE2 9459 7379 0.0337623 -0.0245953 -0.00120908 1 0 1 1 0 0 +EDGE2 9459 9439 -0.0868589 -0.0305247 0.00442374 1 0 1 1 0 0 +EDGE2 9459 9458 -0.960085 0.053177 0.00670785 1 0 1 1 0 0 +EDGE2 9459 7378 -1.07171 0.0111746 0.00106821 1 0 1 1 0 0 +EDGE2 9460 7520 0.0369005 0.0274808 -3.14839 1 0 1 1 0 0 +EDGE2 9460 7539 1.01102 -0.0859897 -3.13647 1 0 1 1 0 0 +EDGE2 9460 7579 1.02609 0.0400812 -3.14106 1 0 1 1 0 0 +EDGE2 9460 7939 0.930507 -0.00272529 -3.12611 1 0 1 1 0 0 +EDGE2 9460 7959 0.970946 -0.0546201 -3.12259 1 0 1 1 0 0 +EDGE2 9460 7559 1.01538 0.0663025 -3.12063 1 0 1 1 0 0 +EDGE2 9460 7459 1.00054 0.0250309 -3.12479 1 0 1 1 0 0 +EDGE2 9460 7519 1.04724 -0.00721823 -3.13299 1 0 1 1 0 0 +EDGE2 9460 7540 -0.0651862 0.0516074 -3.15983 1 0 1 1 0 0 +EDGE2 9460 7561 0.106493 -0.966681 -1.55118 1 0 1 1 0 0 +EDGE2 9460 7961 -0.0167104 -0.886255 -1.56791 1 0 1 1 0 0 +EDGE2 9460 7581 -0.0574251 -0.981211 -1.53967 1 0 1 1 0 0 +EDGE2 9460 9440 -0.0282532 -0.142332 -0.0280373 1 0 1 1 0 0 +EDGE2 9460 7381 -0.00341361 -1.04801 -1.59979 1 0 1 1 0 0 +EDGE2 9460 7461 -0.00214512 -1.04121 -1.56601 1 0 1 1 0 0 +EDGE2 9460 7541 0.0356792 -1.00264 -1.57236 1 0 1 1 0 0 +EDGE2 9460 7580 0.108859 -0.0328216 -3.12795 1 0 1 1 0 0 +EDGE2 9460 7940 0.038188 -0.013629 -3.16779 1 0 1 1 0 0 +EDGE2 9460 7960 0.0824081 -0.0294158 -3.13341 1 0 1 1 0 0 +EDGE2 9460 7560 0.0646713 -0.0351132 -3.1517 1 0 1 1 0 0 +EDGE2 9460 7941 -0.102273 0.919206 1.55078 1 0 1 1 0 0 +EDGE2 9460 7380 0.0294889 -0.0784313 0.00882275 1 0 1 1 0 0 +EDGE2 9460 7460 0.0141526 0.0633409 -3.14565 1 0 1 1 0 0 +EDGE2 9460 9441 -0.0454223 0.918642 1.5596 1 0 1 1 0 0 +EDGE2 9460 7521 0.0773974 1.01259 1.59077 1 0 1 1 0 0 +EDGE2 9460 7379 -0.939108 0.0211994 0.00340881 1 0 1 1 0 0 +EDGE2 9460 9439 -1.06194 -0.0527188 -0.00433823 1 0 1 1 0 0 +EDGE2 9460 9459 -1.00448 -0.0784013 0.00633418 1 0 1 1 0 0 +EDGE2 9461 7520 -1.03969 -0.0561209 1.55985 1 0 1 1 0 0 +EDGE2 9461 7540 -1.04838 -0.00428852 1.59336 1 0 1 1 0 0 +EDGE2 9461 9440 -1.09794 0.114737 -1.55235 1 0 1 1 0 0 +EDGE2 9461 9460 -0.973649 -0.0587207 -1.56756 1 0 1 1 0 0 +EDGE2 9461 7580 -1.14845 0.0246993 1.55844 1 0 1 1 0 0 +EDGE2 9461 7940 -1.02332 0.0970846 1.60283 1 0 1 1 0 0 +EDGE2 9461 7960 -1.02574 -0.0561333 1.5484 1 0 1 1 0 0 +EDGE2 9461 7560 -0.990794 -0.0802602 1.59658 1 0 1 1 0 0 +EDGE2 9461 7522 1.02382 -0.0250739 0.00040448 1 0 1 1 0 0 +EDGE2 9461 7941 -0.0307584 -0.0613246 0.0013462 1 0 1 1 0 0 +EDGE2 9461 7380 -1.0125 -0.0709971 -1.58332 1 0 1 1 0 0 +EDGE2 9461 7460 -0.836389 0.04027 1.5578 1 0 1 1 0 0 +EDGE2 9461 9441 0.0419463 -0.0491002 0.0125816 1 0 1 1 0 0 +EDGE2 9461 9442 1.00364 -0.00956806 0.0279195 1 0 1 1 0 0 +EDGE2 9461 7521 -0.00041898 -0.0260665 0.0265204 1 0 1 1 0 0 +EDGE2 9461 7942 1.01107 0.05414 -0.0168821 1 0 1 1 0 0 +EDGE2 9462 7522 -0.0347947 -0.0333531 0.0375685 1 0 1 1 0 0 +EDGE2 9462 7941 -0.96952 -0.010199 -0.0344594 1 0 1 1 0 0 +EDGE2 9462 9461 -1.12688 -0.0506981 0.0105846 1 0 1 1 0 0 +EDGE2 9462 9441 -1.00946 0.0609137 -0.0276306 1 0 1 1 0 0 +EDGE2 9462 9442 0.0856555 -0.00133238 -0.00809553 1 0 1 1 0 0 +EDGE2 9462 7521 -1.00958 -0.0415621 -0.0099195 1 0 1 1 0 0 +EDGE2 9462 7942 0.0119932 -0.0232897 0.0231645 1 0 1 1 0 0 +EDGE2 9462 7943 0.994306 -0.0147427 -0.00438238 1 0 1 1 0 0 +EDGE2 9462 9443 1.0298 0.00412761 -0.00504845 1 0 1 1 0 0 +EDGE2 9462 7523 1.02422 -0.0288293 -0.00346522 1 0 1 1 0 0 +EDGE2 9463 7944 1.05106 -0.0341747 0.00705942 1 0 1 1 0 0 +EDGE2 9463 7522 -1.04868 -0.0401739 0.00596234 1 0 1 1 0 0 +EDGE2 9463 9442 -1.01028 -0.0258063 0.0230105 1 0 1 1 0 0 +EDGE2 9463 9462 -1.0319 -0.043141 -0.0283687 1 0 1 1 0 0 +EDGE2 9463 7942 -0.973017 -0.0630766 0.027669 1 0 1 1 0 0 +EDGE2 9463 7943 -0.101062 -0.077766 0.0559884 1 0 1 1 0 0 +EDGE2 9463 9443 0.0343392 -0.0207351 -0.00397074 1 0 1 1 0 0 +EDGE2 9463 7523 0.0268151 0.0257589 0.000650714 1 0 1 1 0 0 +EDGE2 9463 9444 0.93796 -0.0241885 -0.00741763 1 0 1 1 0 0 +EDGE2 9463 7524 0.943161 0.120245 -0.0155934 1 0 1 1 0 0 +EDGE2 9464 7944 -0.0564455 0.0342354 0.039434 1 0 1 1 0 0 +EDGE2 9464 7943 -1.02542 -0.102346 0.0134486 1 0 1 1 0 0 +EDGE2 9464 9463 -1.00067 -0.0162062 -0.0191382 1 0 1 1 0 0 +EDGE2 9464 9443 -0.974083 0.0188094 -0.000142939 1 0 1 1 0 0 +EDGE2 9464 7523 -1.00861 -0.0276897 0.0133418 1 0 1 1 0 0 +EDGE2 9464 9444 0.0100401 -0.00352494 0.00752224 1 0 1 1 0 0 +EDGE2 9464 7525 1.02471 0.0565237 0.00221213 1 0 1 1 0 0 +EDGE2 9464 7925 1.01856 -0.0404719 -3.13291 1 0 1 1 0 0 +EDGE2 9464 9445 0.988897 -0.00782743 0.0129023 1 0 1 1 0 0 +EDGE2 9464 7524 0.0553651 -0.0275877 0.0241278 1 0 1 1 0 0 +EDGE2 9464 7945 0.959768 -0.0145462 -0.0299307 1 0 1 1 0 0 +EDGE2 9464 7285 0.963981 -0.006053 -3.14737 1 0 1 1 0 0 +EDGE2 9464 7325 1.03722 0.0106313 -3.13818 1 0 1 1 0 0 +EDGE2 9464 7345 1.08301 0.0675742 -3.15804 1 0 1 1 0 0 +EDGE2 9464 7365 1.07023 -0.0568541 -3.13734 1 0 1 1 0 0 +EDGE2 9464 7305 0.995562 0.0504853 -3.1517 1 0 1 1 0 0 +EDGE2 9464 7185 0.968661 -9.87123e-05 -3.1187 1 0 1 1 0 0 +EDGE2 9465 7944 -0.94286 -0.0249986 -0.00456591 1 0 1 1 0 0 +EDGE2 9465 7326 0.0194824 -0.983539 -1.56215 1 0 1 1 0 0 +EDGE2 9465 7526 0.0410057 -0.9835 -1.58399 1 0 1 1 0 0 +EDGE2 9465 7926 0.0352438 -1.03951 -1.55695 1 0 1 1 0 0 +EDGE2 9465 7946 0.0223188 -1.01517 -1.56937 1 0 1 1 0 0 +EDGE2 9465 7346 -0.0539439 -0.918815 -1.56556 1 0 1 1 0 0 +EDGE2 9465 7286 0.102194 -1.09348 -1.57189 1 0 1 1 0 0 +EDGE2 9465 7306 0.0212977 -0.973629 -1.58099 1 0 1 1 0 0 +EDGE2 9465 9464 -1.07361 -0.0976963 -0.0135396 1 0 1 1 0 0 +EDGE2 9465 9444 -1.06931 0.00129011 -0.00895299 1 0 1 1 0 0 +EDGE2 9465 7525 0.0434806 0.0450572 -0.00362935 1 0 1 1 0 0 +EDGE2 9465 7925 -0.00766918 0.0132854 -3.15239 1 0 1 1 0 0 +EDGE2 9465 9445 0.0578201 0.0431541 -0.00563022 1 0 1 1 0 0 +EDGE2 9465 7524 -0.998959 0.150057 -0.031833 1 0 1 1 0 0 +EDGE2 9465 7945 -0.0564071 -0.0338813 0.0039169 1 0 1 1 0 0 +EDGE2 9465 7285 0.0383438 0.0377747 -3.14548 1 0 1 1 0 0 +EDGE2 9465 7325 0.0382421 0.00472742 -3.15593 1 0 1 1 0 0 +EDGE2 9465 7345 -0.0400379 -0.0579862 -3.12998 1 0 1 1 0 0 +EDGE2 9465 7365 0.00720233 0.00515136 -3.14615 1 0 1 1 0 0 +EDGE2 9465 7305 -0.0800101 0.0444562 -3.12447 1 0 1 1 0 0 +EDGE2 9465 7366 0.0286582 1.04618 1.54713 1 0 1 1 0 0 +EDGE2 9465 9446 -0.0275689 1.03482 1.56053 1 0 1 1 0 0 +EDGE2 9465 7185 0.006512 -0.0541408 -3.1334 1 0 1 1 0 0 +EDGE2 9465 7186 -0.0523758 1.03729 1.55864 1 0 1 1 0 0 +EDGE2 9465 7304 0.977422 -0.0220435 -3.14091 1 0 1 1 0 0 +EDGE2 9465 7344 0.982044 0.030281 -3.0976 1 0 1 1 0 0 +EDGE2 9465 7364 1.02121 -0.0326409 -3.08866 1 0 1 1 0 0 +EDGE2 9465 7924 0.991919 -0.0106032 -3.14684 1 0 1 1 0 0 +EDGE2 9465 7324 1.01981 0.00884637 -3.14318 1 0 1 1 0 0 +EDGE2 9465 7184 0.956482 0.00428502 -3.16275 1 0 1 1 0 0 +EDGE2 9465 7284 1.00979 0.00843413 -3.15555 1 0 1 1 0 0 +EDGE2 9466 7326 -0.0716294 -0.041619 -0.0117017 1 0 1 1 0 0 +EDGE2 9466 7527 1.01921 0.0555352 -0.00671235 1 0 1 1 0 0 +EDGE2 9466 7947 0.955287 -0.0463162 -0.0156273 1 0 1 1 0 0 +EDGE2 9466 7927 1.04606 -0.0225199 0.00982733 1 0 1 1 0 0 +EDGE2 9466 7307 0.986239 -0.0559851 -0.0088622 1 0 1 1 0 0 +EDGE2 9466 7327 1.05377 0.0408732 0.00159958 1 0 1 1 0 0 +EDGE2 9466 7347 0.95467 -0.0211785 -0.0355253 1 0 1 1 0 0 +EDGE2 9466 7287 0.981236 -0.0388919 -0.000980418 1 0 1 1 0 0 +EDGE2 9466 7526 -0.042684 0.0909596 -0.0106086 1 0 1 1 0 0 +EDGE2 9466 7926 -0.057904 0.0680381 0.0128454 1 0 1 1 0 0 +EDGE2 9466 7946 0.074764 0.0669793 0.000395591 1 0 1 1 0 0 +EDGE2 9466 7346 0.0525652 -0.113725 0.0308397 1 0 1 1 0 0 +EDGE2 9466 7286 0.0480081 -0.0552276 0.0118852 1 0 1 1 0 0 +EDGE2 9466 7306 -0.126954 -0.0153392 0.0198498 1 0 1 1 0 0 +EDGE2 9466 7525 -0.975003 0.0765461 1.53839 1 0 1 1 0 0 +EDGE2 9466 7925 -1.01274 -0.0890023 -1.56016 1 0 1 1 0 0 +EDGE2 9466 9445 -0.958312 -0.0989675 1.58918 1 0 1 1 0 0 +EDGE2 9466 9465 -0.921218 -0.0247527 1.53849 1 0 1 1 0 0 +EDGE2 9466 7945 -1.02551 0.0215723 1.59516 1 0 1 1 0 0 +EDGE2 9466 7285 -0.933216 0.0228697 -1.59528 1 0 1 1 0 0 +EDGE2 9466 7325 -0.951108 0.10765 -1.53201 1 0 1 1 0 0 +EDGE2 9466 7345 -0.935594 -0.0567119 -1.57428 1 0 1 1 0 0 +EDGE2 9466 7365 -1.03153 0.1092 -1.5466 1 0 1 1 0 0 +EDGE2 9466 7305 -1.01498 0.0533907 -1.58423 1 0 1 1 0 0 +EDGE2 9466 7185 -0.964914 0.0232337 -1.58506 1 0 1 1 0 0 +EDGE2 9467 7948 0.939232 -0.0658306 0.00398809 1 0 1 1 0 0 +EDGE2 9467 7326 -0.966039 -0.0181472 0.0153825 1 0 1 1 0 0 +EDGE2 9467 7527 -0.0106666 0.0481381 -0.0269769 1 0 1 1 0 0 +EDGE2 9467 7308 0.981366 -0.0375187 -0.00120534 1 0 1 1 0 0 +EDGE2 9467 7348 1.0017 0.0793962 0.00839008 1 0 1 1 0 0 +EDGE2 9467 7528 1.07865 0.0546234 0.0188923 1 0 1 1 0 0 +EDGE2 9467 7928 1.01225 0.0527561 -0.021557 1 0 1 1 0 0 +EDGE2 9467 7328 1.05321 -0.0487013 0.0311349 1 0 1 1 0 0 +EDGE2 9467 7947 -0.0291144 -0.0157531 -0.0418316 1 0 1 1 0 0 +EDGE2 9467 7288 0.938055 0.065485 -0.0241357 1 0 1 1 0 0 +EDGE2 9467 7927 0.0441886 0.0540812 0.00820633 1 0 1 1 0 0 +EDGE2 9467 9466 -1.02831 0.00991989 0.00134197 1 0 1 1 0 0 +EDGE2 9467 7307 0.0723652 0.0421971 0.0016623 1 0 1 1 0 0 +EDGE2 9467 7327 0.0250496 0.0411426 0.00437938 1 0 1 1 0 0 +EDGE2 9467 7347 0.00318743 -0.0493616 -0.0178908 1 0 1 1 0 0 +EDGE2 9467 7287 -0.0471288 0.0191656 -0.00202378 1 0 1 1 0 0 +EDGE2 9467 7526 -0.941908 0.0478813 -0.0237841 1 0 1 1 0 0 +EDGE2 9467 7926 -0.991863 -0.0512117 0.00175324 1 0 1 1 0 0 +EDGE2 9467 7946 -1.04994 0.0495171 -0.0299771 1 0 1 1 0 0 +EDGE2 9467 7346 -1.02103 0.119228 0.00196337 1 0 1 1 0 0 +EDGE2 9467 7286 -0.880537 0.0547867 -0.0169264 1 0 1 1 0 0 +EDGE2 9467 7306 -0.959791 0.0635174 -0.0340518 1 0 1 1 0 0 +EDGE2 9468 7948 -0.00189224 0.00368713 -0.0134968 1 0 1 1 0 0 +EDGE2 9468 7329 1.00743 -0.064412 -0.0220876 1 0 1 1 0 0 +EDGE2 9468 7529 0.999847 0.0472816 -0.056231 1 0 1 1 0 0 +EDGE2 9468 7929 0.921205 -0.105427 0.00812117 1 0 1 1 0 0 +EDGE2 9468 7949 0.928728 -0.0056092 0.0201636 1 0 1 1 0 0 +EDGE2 9468 7349 1.03831 -0.0166273 0.00940204 1 0 1 1 0 0 +EDGE2 9468 7289 0.964777 0.0461781 -0.00326218 1 0 1 1 0 0 +EDGE2 9468 7309 0.981387 -2.57322e-05 -0.027959 1 0 1 1 0 0 +EDGE2 9468 7527 -1.01557 -0.002209 0.000985643 1 0 1 1 0 0 +EDGE2 9468 7308 0.0378705 0.0556762 0.00489116 1 0 1 1 0 0 +EDGE2 9468 7348 0.0763815 -0.000199569 -0.00851011 1 0 1 1 0 0 +EDGE2 9468 7528 -0.0889897 -0.0646477 -0.00660508 1 0 1 1 0 0 +EDGE2 9468 7928 0.00337366 0.0310207 -0.000751844 1 0 1 1 0 0 +EDGE2 9468 7328 -0.0409527 0.0289969 -0.0115537 1 0 1 1 0 0 +EDGE2 9468 7947 -0.975247 -0.020942 0.000619453 1 0 1 1 0 0 +EDGE2 9468 9467 -1.02114 0.0258323 0.0244693 1 0 1 1 0 0 +EDGE2 9468 7288 0.0193793 -0.0595775 -0.0106171 1 0 1 1 0 0 +EDGE2 9468 7927 -0.979068 0.0305411 -0.0147384 1 0 1 1 0 0 +EDGE2 9468 7307 -1.02113 0.0338339 0.029526 1 0 1 1 0 0 +EDGE2 9468 7327 -0.934708 -0.0808897 0.00265332 1 0 1 1 0 0 +EDGE2 9468 7347 -1.08337 -0.012087 0.022202 1 0 1 1 0 0 +EDGE2 9468 7287 -1.00098 -0.00388048 0.0131717 1 0 1 1 0 0 +EDGE2 9469 7948 -0.996429 -0.0221132 0.0242097 1 0 1 1 0 0 +EDGE2 9469 7530 1.03673 -0.0654159 0.0327161 1 0 1 1 0 0 +EDGE2 9469 7950 1.03231 0.00218892 -0.0306235 1 0 1 1 0 0 +EDGE2 9469 7930 1.03306 0.00141434 0.00192145 1 0 1 1 0 0 +EDGE2 9469 7310 0.996786 -0.0350452 0.0310838 1 0 1 1 0 0 +EDGE2 9469 7350 1.01721 0.0671617 -0.00221184 1 0 1 1 0 0 +EDGE2 9469 7450 0.942884 0.038129 -3.15099 1 0 1 1 0 0 +EDGE2 9469 7510 0.886149 -0.13947 -3.15921 1 0 1 1 0 0 +EDGE2 9469 7330 0.950337 0.0267166 -0.0269724 1 0 1 1 0 0 +EDGE2 9469 7170 1.02053 0.0263172 -3.11296 1 0 1 1 0 0 +EDGE2 9469 7290 0.950304 0.0528986 -0.0127566 1 0 1 1 0 0 +EDGE2 9469 7329 -0.00734361 0.00635455 -0.00268896 1 0 1 1 0 0 +EDGE2 9469 7529 0.0842003 0.0305183 0.00228665 1 0 1 1 0 0 +EDGE2 9469 7929 0.112386 0.00629647 0.0230991 1 0 1 1 0 0 +EDGE2 9469 7949 0.0817788 0.0728845 -0.0211809 1 0 1 1 0 0 +EDGE2 9469 7349 0.0530359 -0.0257671 0.0256961 1 0 1 1 0 0 +EDGE2 9469 7289 -0.108779 0.0797718 -0.0333947 1 0 1 1 0 0 +EDGE2 9469 7309 0.0122049 -0.0429659 0.0141889 1 0 1 1 0 0 +EDGE2 9469 9468 -1.0144 -0.0189376 -0.00316957 1 0 1 1 0 0 +EDGE2 9469 7308 -1.01106 0.0479744 -0.0122094 1 0 1 1 0 0 +EDGE2 9469 7348 -1.03517 -0.0721663 -0.00463754 1 0 1 1 0 0 +EDGE2 9469 7528 -0.941149 -0.00957239 -0.0340415 1 0 1 1 0 0 +EDGE2 9469 7928 -1.00525 0.0220681 0.0195685 1 0 1 1 0 0 +EDGE2 9469 7328 -1.0006 -0.0797479 0.0163881 1 0 1 1 0 0 +EDGE2 9469 7288 -1.00516 -0.020905 0.00954003 1 0 1 1 0 0 +EDGE2 9470 7449 1.02328 -0.0128763 -3.14224 1 0 1 1 0 0 +EDGE2 9470 7509 1.01713 0.00439693 -3.16406 1 0 1 1 0 0 +EDGE2 9470 7169 1.04462 0.0692274 -3.15045 1 0 1 1 0 0 +EDGE2 9470 7530 0.0587238 -0.00730601 -0.00593535 1 0 1 1 0 0 +EDGE2 9470 7511 0.00122962 -1.00415 -1.6011 1 0 1 1 0 0 +EDGE2 9470 7931 0.0493282 -0.98413 -1.55801 1 0 1 1 0 0 +EDGE2 9470 7951 -0.018409 -0.946773 -1.55832 1 0 1 1 0 0 +EDGE2 9470 7531 -0.0484296 -1.05107 -1.57403 1 0 1 1 0 0 +EDGE2 9470 7950 -0.0445755 0.0509742 -0.0293615 1 0 1 1 0 0 +EDGE2 9470 7451 -0.0107037 -1.01223 -1.56809 1 0 1 1 0 0 +EDGE2 9470 7930 0.0149081 -0.0186666 -0.00136846 1 0 1 1 0 0 +EDGE2 9470 9469 -1.03104 -0.0651629 0.0225975 1 0 1 1 0 0 +EDGE2 9470 7310 0.00207722 0.0973542 -0.0233323 1 0 1 1 0 0 +EDGE2 9470 7350 0.0254978 0.0321883 -0.00747959 1 0 1 1 0 0 +EDGE2 9470 7450 0.00412857 -0.013397 -3.12587 1 0 1 1 0 0 +EDGE2 9470 7510 -0.0556168 -0.0748739 -3.08432 1 0 1 1 0 0 +EDGE2 9470 7330 0.0575573 0.0472924 -0.0301979 1 0 1 1 0 0 +EDGE2 9470 7170 -0.00701111 -0.107007 -3.16427 1 0 1 1 0 0 +EDGE2 9470 7290 0.0185695 0.0467134 -0.0411268 1 0 1 1 0 0 +EDGE2 9470 7329 -0.999291 -0.0425678 -0.0206542 1 0 1 1 0 0 +EDGE2 9470 7529 -0.945362 0.000110006 -0.0151061 1 0 1 1 0 0 +EDGE2 9470 7929 -1.02594 0.0339626 -0.00971106 1 0 1 1 0 0 +EDGE2 9470 7949 -0.999164 -0.0627056 -0.014427 1 0 1 1 0 0 +EDGE2 9470 7349 -1.0577 0.00478649 0.0184156 1 0 1 1 0 0 +EDGE2 9470 7289 -1.05919 -0.00770853 -0.00544856 1 0 1 1 0 0 +EDGE2 9470 7309 -0.941351 0.0780493 0.0556314 1 0 1 1 0 0 +EDGE2 9470 7291 -0.0153775 1.02567 1.58211 1 0 1 1 0 0 +EDGE2 9470 7331 0.0627589 0.996779 1.58786 1 0 1 1 0 0 +EDGE2 9470 7351 -0.114428 1.02587 1.61312 1 0 1 1 0 0 +EDGE2 9470 7311 0.112632 1.07612 1.58412 1 0 1 1 0 0 +EDGE2 9470 7171 -0.0963839 0.930683 1.58873 1 0 1 1 0 0 +EDGE2 9471 7530 -1.00047 0.0113641 -1.58162 1 0 1 1 0 0 +EDGE2 9471 7950 -1.05196 -0.0309573 -1.58363 1 0 1 1 0 0 +EDGE2 9471 9470 -1.01892 -0.015634 -1.55097 1 0 1 1 0 0 +EDGE2 9471 7930 -1.0686 -0.0356028 -1.57412 1 0 1 1 0 0 +EDGE2 9471 7310 -0.992638 0.0430968 -1.5873 1 0 1 1 0 0 +EDGE2 9471 7350 -1.02251 -0.0426834 -1.57055 1 0 1 1 0 0 +EDGE2 9471 7450 -1.02787 0.016978 1.57804 1 0 1 1 0 0 +EDGE2 9471 7510 -1.08536 -0.00637859 1.57564 1 0 1 1 0 0 +EDGE2 9471 7330 -1.01454 -0.00869858 -1.52581 1 0 1 1 0 0 +EDGE2 9471 7170 -0.974949 -0.031181 1.55141 1 0 1 1 0 0 +EDGE2 9471 7290 -0.974865 -0.0434163 -1.5698 1 0 1 1 0 0 +EDGE2 9471 7312 0.982273 0.0183404 0.0110167 1 0 1 1 0 0 +EDGE2 9471 7291 0.00285925 0.0329412 0.025047 1 0 1 1 0 0 +EDGE2 9471 7331 -0.0434987 -0.143873 0.00515626 1 0 1 1 0 0 +EDGE2 9471 7351 0.0202784 -0.0386199 0.00668072 1 0 1 1 0 0 +EDGE2 9471 7311 -0.00160216 0.0213205 0.0272364 1 0 1 1 0 0 +EDGE2 9471 7352 0.967163 -0.0232326 -0.0154488 1 0 1 1 0 0 +EDGE2 9471 7171 0.0323019 -0.0242177 -0.000786861 1 0 1 1 0 0 +EDGE2 9471 7332 1.06387 0.0246985 0.0180897 1 0 1 1 0 0 +EDGE2 9471 7172 0.89478 -0.0287129 0.00665754 1 0 1 1 0 0 +EDGE2 9471 7292 0.864027 -0.0309054 -0.0105769 1 0 1 1 0 0 +EDGE2 9472 7312 0.00835073 -0.0467597 -0.0364026 1 0 1 1 0 0 +EDGE2 9472 7291 -1.0358 -0.031543 -0.0468459 1 0 1 1 0 0 +EDGE2 9472 7331 -0.947273 -0.030221 0.0277583 1 0 1 1 0 0 +EDGE2 9472 7351 -1.00564 0.0082405 -0.0330195 1 0 1 1 0 0 +EDGE2 9472 9471 -1.04208 0.00870125 -0.0103679 1 0 1 1 0 0 +EDGE2 9472 7311 -1.09502 0.0196906 0.015801 1 0 1 1 0 0 +EDGE2 9472 7352 -0.0387994 -0.0319188 0.00292909 1 0 1 1 0 0 +EDGE2 9472 7171 -0.98602 0.0912813 -0.00180355 1 0 1 1 0 0 +EDGE2 9472 7332 -0.0858259 -0.0298643 0.00326549 1 0 1 1 0 0 +EDGE2 9472 7333 0.995901 0.0479531 -0.00911899 1 0 1 1 0 0 +EDGE2 9472 7172 0.0411644 -0.0308298 0.0272921 1 0 1 1 0 0 +EDGE2 9472 7292 0.0168707 0.0354747 0.0112602 1 0 1 1 0 0 +EDGE2 9472 7353 1.07903 -0.0323122 -0.0369112 1 0 1 1 0 0 +EDGE2 9472 7173 0.963652 0.00267874 0.00569952 1 0 1 1 0 0 +EDGE2 9472 7293 0.993141 0.0287177 -0.0326385 1 0 1 1 0 0 +EDGE2 9472 7313 1.06268 -0.0439977 -0.0079152 1 0 1 1 0 0 +EDGE2 9473 7312 -1.02347 -0.0730059 -0.0153047 1 0 1 1 0 0 +EDGE2 9473 7352 -1.07365 -0.00404965 0.0339548 1 0 1 1 0 0 +EDGE2 9473 9472 -0.946093 -0.022835 0.00505922 1 0 1 1 0 0 +EDGE2 9473 7332 -1.0628 0.0598805 -0.0244776 1 0 1 1 0 0 +EDGE2 9473 7354 1.00289 0.0645847 0.006181 1 0 1 1 0 0 +EDGE2 9473 7333 0.0728925 -0.0373212 0.0275042 1 0 1 1 0 0 +EDGE2 9473 7172 -1.00458 -0.0287711 0.0126212 1 0 1 1 0 0 +EDGE2 9473 7292 -0.917735 -0.0557309 0.029674 1 0 1 1 0 0 +EDGE2 9473 7353 0.084254 -0.011857 0.0425911 1 0 1 1 0 0 +EDGE2 9473 7173 0.0232511 -0.0036893 0.00624492 1 0 1 1 0 0 +EDGE2 9473 7293 0.136896 0.0131026 0.0239513 1 0 1 1 0 0 +EDGE2 9473 7313 0.00834875 -0.0694139 -0.00974191 1 0 1 1 0 0 +EDGE2 9473 7294 0.977923 0.000173927 0.00783708 1 0 1 1 0 0 +EDGE2 9473 7314 1.01549 0.0260618 -0.00319203 1 0 1 1 0 0 +EDGE2 9473 7334 0.981229 -0.039609 -0.00778896 1 0 1 1 0 0 +EDGE2 9473 7174 1.03972 -0.00490825 -0.00423957 1 0 1 1 0 0 +EDGE2 9474 7315 0.932809 -0.0700052 0.0171749 1 0 1 1 0 0 +EDGE2 9474 7354 -0.00600552 0.0674569 -0.0393246 1 0 1 1 0 0 +EDGE2 9474 7333 -0.978765 0.0442835 -0.021497 1 0 1 1 0 0 +EDGE2 9474 9473 -1.05404 0.07317 -0.0230209 1 0 1 1 0 0 +EDGE2 9474 7353 -1.0061 0.0285193 -0.0212595 1 0 1 1 0 0 +EDGE2 9474 7173 -1.03396 -0.00760447 -0.0232873 1 0 1 1 0 0 +EDGE2 9474 7293 -0.999878 -0.0209703 -0.0326309 1 0 1 1 0 0 +EDGE2 9474 7313 -1.00831 0.0638375 0.0341265 1 0 1 1 0 0 +EDGE2 9474 7294 0.0937214 0.00139072 -0.00351854 1 0 1 1 0 0 +EDGE2 9474 7314 0.0297787 0.0153584 0.0250876 1 0 1 1 0 0 +EDGE2 9474 7334 0.0159188 0.003366 0.0042038 1 0 1 1 0 0 +EDGE2 9474 7174 0.0915143 0.0416569 -0.0207805 1 0 1 1 0 0 +EDGE2 9474 7355 0.929459 -0.0759871 0.00434667 1 0 1 1 0 0 +EDGE2 9474 7435 1.001 0.0499783 -3.18345 1 0 1 1 0 0 +EDGE2 9474 7335 0.952646 -0.0421804 0.000797913 1 0 1 1 0 0 +EDGE2 9474 7135 1.0307 -0.122518 -3.12651 1 0 1 1 0 0 +EDGE2 9474 7255 0.938398 0.0815909 -3.14163 1 0 1 1 0 0 +EDGE2 9474 7275 0.944232 0.0569472 -3.16352 1 0 1 1 0 0 +EDGE2 9474 7295 1.01654 -0.0191815 0.00619585 1 0 1 1 0 0 +EDGE2 9474 7175 1.08237 0.0295541 -0.00355327 1 0 1 1 0 0 +EDGE2 9474 7115 0.933845 0.0359702 -3.15384 1 0 1 1 0 0 +EDGE2 9475 7315 0.0725684 0.0603053 0.0048454 1 0 1 1 0 0 +EDGE2 9475 7136 -0.0289122 -1.03821 -1.58037 1 0 1 1 0 0 +EDGE2 9475 7256 0.0469264 -1.05966 -1.57284 1 0 1 1 0 0 +EDGE2 9475 7436 0.057727 -0.966034 -1.57602 1 0 1 1 0 0 +EDGE2 9475 7116 0.0463464 -1.02472 -1.57191 1 0 1 1 0 0 +EDGE2 9475 7354 -0.984909 -0.0172983 -0.0324664 1 0 1 1 0 0 +EDGE2 9475 9474 -0.981113 -0.0535099 -0.00159762 1 0 1 1 0 0 +EDGE2 9475 7294 -1.01077 -0.0374198 0.0380325 1 0 1 1 0 0 +EDGE2 9475 7314 -0.949041 -0.0874043 0.00434053 1 0 1 1 0 0 +EDGE2 9475 7334 -1.0246 0.0191399 0.00673837 1 0 1 1 0 0 +EDGE2 9475 7174 -1.00421 -0.0404576 -0.00375918 1 0 1 1 0 0 +EDGE2 9475 7355 0.0182487 -0.100233 0.00798419 1 0 1 1 0 0 +EDGE2 9475 7435 -0.0407537 0.0241851 -3.12745 1 0 1 1 0 0 +EDGE2 9475 7335 0.0185165 0.0224871 0.000436936 1 0 1 1 0 0 +EDGE2 9475 7134 0.931512 -0.0160689 -3.13342 1 0 1 1 0 0 +EDGE2 9475 7135 -0.0300989 0.0138198 -3.14054 1 0 1 1 0 0 +EDGE2 9475 7255 0.0633703 -0.0261103 -3.17543 1 0 1 1 0 0 +EDGE2 9475 7275 0.0099201 0.0467763 -3.14926 1 0 1 1 0 0 +EDGE2 9475 7295 -0.0439989 -0.0287481 0.0105144 1 0 1 1 0 0 +EDGE2 9475 7175 -0.0426366 -0.0422691 0.0295142 1 0 1 1 0 0 +EDGE2 9475 7274 0.980372 0.0544355 -3.11335 1 0 1 1 0 0 +EDGE2 9475 7434 0.950504 0.0259924 -3.16079 1 0 1 1 0 0 +EDGE2 9475 7115 -0.0539499 0.0218221 -3.0832 1 0 1 1 0 0 +EDGE2 9475 7254 1.02303 -0.0054414 -3.15728 1 0 1 1 0 0 +EDGE2 9475 7114 0.927947 -0.0116317 -3.11743 1 0 1 1 0 0 +EDGE2 9475 7296 0.0194008 1.02259 1.55013 1 0 1 1 0 0 +EDGE2 9475 7336 -0.0996868 1.04717 1.60037 1 0 1 1 0 0 +EDGE2 9475 7356 0.0353458 1.0048 1.59914 1 0 1 1 0 0 +EDGE2 9475 7316 0.006867 1.02366 1.52602 1 0 1 1 0 0 +EDGE2 9475 7176 0.0042935 0.999224 1.57853 1 0 1 1 0 0 +EDGE2 9475 7276 -0.0529586 0.974737 1.5787 1 0 1 1 0 0 +EDGE2 9476 7277 1.02569 -0.00903753 -0.0160442 1 0 1 1 0 0 +EDGE2 9476 7315 -1.02215 -0.0467302 -1.56919 1 0 1 1 0 0 +EDGE2 9476 9475 -0.975144 -0.00986321 -1.55588 1 0 1 1 0 0 +EDGE2 9476 7355 -1.02382 0.016936 -1.56046 1 0 1 1 0 0 +EDGE2 9476 7435 -0.979201 0.114443 1.55498 1 0 1 1 0 0 +EDGE2 9476 7335 -1.07177 0.0128595 -1.56451 1 0 1 1 0 0 +EDGE2 9476 7135 -1.00107 -0.0297109 1.55689 1 0 1 1 0 0 +EDGE2 9476 7255 -0.990452 0.070372 1.57152 1 0 1 1 0 0 +EDGE2 9476 7275 -0.95249 0.117079 1.61351 1 0 1 1 0 0 +EDGE2 9476 7295 -1.08156 -0.092518 -1.57402 1 0 1 1 0 0 +EDGE2 9476 7175 -0.928447 -0.0353435 -1.52343 1 0 1 1 0 0 +EDGE2 9476 7115 -0.906825 0.0117595 1.57328 1 0 1 1 0 0 +EDGE2 9476 7337 1.10246 -0.00630754 -0.0288017 1 0 1 1 0 0 +EDGE2 9476 7296 0.0343121 -0.106659 -0.0163752 1 0 1 1 0 0 +EDGE2 9476 7336 0.0194485 0.00682878 -0.00461994 1 0 1 1 0 0 +EDGE2 9476 7356 -0.0291571 0.0297312 -0.0445066 1 0 1 1 0 0 +EDGE2 9476 7316 0.0955614 0.0082209 0.00325428 1 0 1 1 0 0 +EDGE2 9476 7176 -0.0729363 0.0823962 0.0156604 1 0 1 1 0 0 +EDGE2 9476 7276 0.0552407 -0.0105326 -0.00631736 1 0 1 1 0 0 +EDGE2 9476 7357 1.01676 -0.019306 -0.00991727 1 0 1 1 0 0 +EDGE2 9476 7317 0.899959 -0.0227697 -0.0510171 1 0 1 1 0 0 +EDGE2 9476 7297 1.07145 -0.0944303 0.0215498 1 0 1 1 0 0 +EDGE2 9476 7177 0.967836 -0.0111251 0.0238911 1 0 1 1 0 0 +EDGE2 9477 7277 -0.0384504 0.0117733 -0.00744876 1 0 1 1 0 0 +EDGE2 9477 7337 0.0138563 -0.0293414 0.0417108 1 0 1 1 0 0 +EDGE2 9477 7296 -1.03999 0.062852 -0.000440211 1 0 1 1 0 0 +EDGE2 9477 7336 -1.03963 0.011972 -0.0014631 1 0 1 1 0 0 +EDGE2 9477 7356 -0.997429 0.110053 0.00474383 1 0 1 1 0 0 +EDGE2 9477 9476 -0.851771 0.0262764 0.00448223 1 0 1 1 0 0 +EDGE2 9477 7316 -0.997375 -0.0271344 0.0049965 1 0 1 1 0 0 +EDGE2 9477 7176 -1.16785 0.0365859 -0.0259108 1 0 1 1 0 0 +EDGE2 9477 7276 -1.08818 0.0629742 -0.00672276 1 0 1 1 0 0 +EDGE2 9477 7357 0.0189934 -0.0338585 0.0281604 1 0 1 1 0 0 +EDGE2 9477 7317 0.0878345 0.0268737 -0.0212902 1 0 1 1 0 0 +EDGE2 9477 7297 -0.0126245 -0.0486716 0.0225435 1 0 1 1 0 0 +EDGE2 9477 7298 0.914164 0.0372979 0.023713 1 0 1 1 0 0 +EDGE2 9477 7318 0.982667 -0.0929515 -0.0115554 1 0 1 1 0 0 +EDGE2 9477 7358 0.975871 0.00187891 -0.00303666 1 0 1 1 0 0 +EDGE2 9477 7177 0.0334625 0.0200027 0.000218167 1 0 1 1 0 0 +EDGE2 9477 7338 0.938104 -0.120802 0.0122128 1 0 1 1 0 0 +EDGE2 9477 7178 0.985228 -0.000131255 0.0187986 1 0 1 1 0 0 +EDGE2 9477 7278 0.911412 -0.00906535 -0.0246873 1 0 1 1 0 0 +EDGE2 9478 7277 -0.926758 0.101968 -0.00837193 1 0 1 1 0 0 +EDGE2 9478 7337 -1.00213 -0.0671315 -0.00732749 1 0 1 1 0 0 +EDGE2 9478 9477 -1.04691 -0.00865716 0.00338792 1 0 1 1 0 0 +EDGE2 9478 7357 -0.965661 0.121206 -0.033656 1 0 1 1 0 0 +EDGE2 9478 7317 -1.01836 0.0626574 -0.0144914 1 0 1 1 0 0 +EDGE2 9478 7297 -0.981193 -0.00802348 0.0305303 1 0 1 1 0 0 +EDGE2 9478 7298 0.0818483 0.0589336 -0.0291629 1 0 1 1 0 0 +EDGE2 9478 7318 0.108025 -0.0090739 0.010105 1 0 1 1 0 0 +EDGE2 9478 7358 0.0132354 -0.0207676 0.0273395 1 0 1 1 0 0 +EDGE2 9478 7177 -1.02867 -0.0189112 -0.0435973 1 0 1 1 0 0 +EDGE2 9478 7338 0.0109006 0.139331 -0.036151 1 0 1 1 0 0 +EDGE2 9478 7339 0.929415 0.020752 0.00963741 1 0 1 1 0 0 +EDGE2 9478 7178 -0.00686013 0.0237681 0.0240723 1 0 1 1 0 0 +EDGE2 9478 7278 -0.0179904 -0.0855871 -0.00319147 1 0 1 1 0 0 +EDGE2 9478 7359 0.987067 -0.0489984 -0.00226752 1 0 1 1 0 0 +EDGE2 9478 7279 0.945715 -0.0325264 0.00460451 1 0 1 1 0 0 +EDGE2 9478 7299 1.0032 -0.0951051 -0.00404009 1 0 1 1 0 0 +EDGE2 9478 7319 0.89953 0.0370746 -0.0186208 1 0 1 1 0 0 +EDGE2 9478 7179 0.980756 0.0441473 -0.00393545 1 0 1 1 0 0 +EDGE2 9479 7298 -0.968527 -0.00898291 0.00849004 1 0 1 1 0 0 +EDGE2 9479 7318 -1.00057 -0.0284043 0.0194858 1 0 1 1 0 0 +EDGE2 9479 7358 -0.917318 0.098506 -0.0131439 1 0 1 1 0 0 +EDGE2 9479 9478 -1.03849 -0.105263 -0.0198692 1 0 1 1 0 0 +EDGE2 9479 7338 -1.03479 -0.042381 -0.0208992 1 0 1 1 0 0 +EDGE2 9479 7339 -0.0162553 -0.0218023 -0.0102335 1 0 1 1 0 0 +EDGE2 9479 7178 -0.919406 0.00981585 -0.00483908 1 0 1 1 0 0 +EDGE2 9479 7278 -0.975017 -0.0105604 0.0208535 1 0 1 1 0 0 +EDGE2 9479 7359 0.00506238 -0.0501299 0.00538812 1 0 1 1 0 0 +EDGE2 9479 7279 0.0309852 -0.0859259 -0.0321751 1 0 1 1 0 0 +EDGE2 9479 7299 0.0420223 0.00312106 -0.010945 1 0 1 1 0 0 +EDGE2 9479 7319 -0.00764693 0.0137404 -0.00670702 1 0 1 1 0 0 +EDGE2 9479 7179 -0.069623 0.134318 -0.00127939 1 0 1 1 0 0 +EDGE2 9479 7320 1.03596 -0.0774962 0.00417845 1 0 1 1 0 0 +EDGE2 9479 7360 1.03004 0.0491844 0.0140538 1 0 1 1 0 0 +EDGE2 9479 7900 1.02419 -0.0806474 -3.15481 1 0 1 1 0 0 +EDGE2 9479 7920 0.918882 0.00914794 -3.14372 1 0 1 1 0 0 +EDGE2 9479 7340 0.97864 -0.000152338 -0.00285 1 0 1 1 0 0 +EDGE2 9479 7180 0.981262 0.0126419 -0.0101736 1 0 1 1 0 0 +EDGE2 9479 7280 1.00352 -0.0567829 -0.0127036 1 0 1 1 0 0 +EDGE2 9479 7300 0.964665 -0.0392714 -0.0144685 1 0 1 1 0 0 +EDGE2 9480 7341 -0.0441427 0.965207 1.57092 1 0 1 1 0 0 +EDGE2 9480 7339 -0.996497 -0.043009 0.0149153 1 0 1 1 0 0 +EDGE2 9480 9479 -0.975898 -0.0989075 0.0127558 1 0 1 1 0 0 +EDGE2 9480 7359 -1.05762 0.0214956 0.00622004 1 0 1 1 0 0 +EDGE2 9480 7279 -0.962999 0.00671105 -0.013481 1 0 1 1 0 0 +EDGE2 9480 7299 -0.985442 0.0013405 0.0177738 1 0 1 1 0 0 +EDGE2 9480 7319 -0.950767 0.00868533 0.0037235 1 0 1 1 0 0 +EDGE2 9480 7179 -0.996837 0.0441561 0.0191009 1 0 1 1 0 0 +EDGE2 9480 7921 0.0740456 1.01812 1.57348 1 0 1 1 0 0 +EDGE2 9480 7361 -0.0396429 0.992347 1.59088 1 0 1 1 0 0 +EDGE2 9480 7919 1.11234 -0.0719029 -3.14964 1 0 1 1 0 0 +EDGE2 9480 7320 0.00574594 -0.0629468 -0.0046487 1 0 1 1 0 0 +EDGE2 9480 7281 0.060499 1.01556 1.53609 1 0 1 1 0 0 +EDGE2 9480 7301 -0.0179198 0.914898 1.57538 1 0 1 1 0 0 +EDGE2 9480 7321 -0.0067169 1.07946 1.55552 1 0 1 1 0 0 +EDGE2 9480 7181 0.0429921 1.04411 1.59321 1 0 1 1 0 0 +EDGE2 9480 7360 0.0649422 0.0693792 0.0202554 1 0 1 1 0 0 +EDGE2 9480 7900 -0.0270707 0.0287959 -3.14071 1 0 1 1 0 0 +EDGE2 9480 7920 -0.0237192 0.0943738 -3.10578 1 0 1 1 0 0 +EDGE2 9480 7340 0.0240943 -0.0691728 -0.0237974 1 0 1 1 0 0 +EDGE2 9480 7901 0.0309389 -0.985423 -1.56937 1 0 1 1 0 0 +EDGE2 9480 7180 -0.0866681 0.00727133 0.00556501 1 0 1 1 0 0 +EDGE2 9480 7280 0.00989001 0.0279517 0.0065809 1 0 1 1 0 0 +EDGE2 9480 7300 -0.0317166 0.0700574 0.0122327 1 0 1 1 0 0 +EDGE2 9480 7899 1.00617 -0.0344031 -3.15722 1 0 1 1 0 0 +EDGE2 9481 7320 -1.04419 -0.0572001 1.55889 1 0 1 1 0 0 +EDGE2 9481 9480 -0.943662 -0.0448881 1.5494 1 0 1 1 0 0 +EDGE2 9481 7360 -0.965362 0.0255411 1.57582 1 0 1 1 0 0 +EDGE2 9481 7900 -1.08902 0.113055 -1.5711 1 0 1 1 0 0 +EDGE2 9481 7920 -1.00055 0.0868511 -1.54631 1 0 1 1 0 0 +EDGE2 9481 7340 -1.00171 -0.0111661 1.5928 1 0 1 1 0 0 +EDGE2 9481 7901 0.0433036 -0.00731059 0.0242706 1 0 1 1 0 0 +EDGE2 9481 7180 -0.948348 0.0131351 1.54346 1 0 1 1 0 0 +EDGE2 9481 7280 -1.00128 0.0410121 1.55839 1 0 1 1 0 0 +EDGE2 9481 7300 -1.09793 0.010327 1.5786 1 0 1 1 0 0 +EDGE2 9481 7902 0.966006 -0.0114527 -0.0278644 1 0 1 1 0 0 +EDGE2 9482 7901 -0.946257 0.0203994 0.00425455 1 0 1 1 0 0 +EDGE2 9482 9481 -1.04593 0.00551216 0.0307967 1 0 1 1 0 0 +EDGE2 9482 7902 0.0361883 -0.0328732 0.0113536 1 0 1 1 0 0 +EDGE2 9482 7903 1.03548 0.0638497 -0.00814484 1 0 1 1 0 0 +EDGE2 9483 7902 -0.941334 -0.0337424 -0.0180043 1 0 1 1 0 0 +EDGE2 9483 9482 -0.939903 0.0488256 -0.00766293 1 0 1 1 0 0 +EDGE2 9483 7903 0.0272496 0.0114022 0.0170572 1 0 1 1 0 0 +EDGE2 9483 7904 1.04189 -0.0379858 -0.00450378 1 0 1 1 0 0 +EDGE2 9484 9483 -1.04611 -0.0319723 -0.0172937 1 0 1 1 0 0 +EDGE2 9484 7903 -1.04574 0.0426726 -0.000325565 1 0 1 1 0 0 +EDGE2 9484 7904 -0.0596845 -0.0333682 -0.0220042 1 0 1 1 0 0 +EDGE2 9484 7865 1.02022 -0.00681414 -3.16163 1 0 1 1 0 0 +EDGE2 9484 7885 0.922911 0.0376729 -3.15213 1 0 1 1 0 0 +EDGE2 9484 7905 1.01621 0.0895715 0.0136744 1 0 1 1 0 0 +EDGE2 9484 7245 0.970176 -0.072206 -3.13834 1 0 1 1 0 0 +EDGE2 9485 9484 -1.00933 -0.0627255 -0.0109464 1 0 1 1 0 0 +EDGE2 9485 7244 0.979792 -0.050801 -3.09661 1 0 1 1 0 0 +EDGE2 9485 7884 0.978371 -0.0138939 -3.15223 1 0 1 1 0 0 +EDGE2 9485 7246 0.0143285 -1.13231 -1.55729 1 0 1 1 0 0 +EDGE2 9485 7866 -0.00728674 -1.02694 -1.57903 1 0 1 1 0 0 +EDGE2 9485 7904 -0.993127 0.0759678 -0.0131907 1 0 1 1 0 0 +EDGE2 9485 7865 0.00980305 0.0234086 -3.13509 1 0 1 1 0 0 +EDGE2 9485 7885 0.0446875 -0.0718981 -3.12119 1 0 1 1 0 0 +EDGE2 9485 7905 0.0271743 -0.0259572 0.00694753 1 0 1 1 0 0 +EDGE2 9485 7245 -0.0447881 0.0509759 -3.10527 1 0 1 1 0 0 +EDGE2 9485 7864 1.00234 -0.0536131 -3.11659 1 0 1 1 0 0 +EDGE2 9485 7886 -0.057 0.940829 1.56848 1 0 1 1 0 0 +EDGE2 9485 7906 0.097799 0.96283 1.55259 1 0 1 1 0 0 +EDGE2 9486 7247 1.07736 0.0261652 -0.0239997 1 0 1 1 0 0 +EDGE2 9486 7867 1.02546 0.106867 0.0249611 1 0 1 1 0 0 +EDGE2 9486 9485 -0.972656 0.0346519 1.60248 1 0 1 1 0 0 +EDGE2 9486 7246 0.0706952 0.00687165 -0.0119532 1 0 1 1 0 0 +EDGE2 9486 7866 0.0190398 0.0488828 0.0136662 1 0 1 1 0 0 +EDGE2 9486 7865 -0.986619 -0.0729123 -1.58235 1 0 1 1 0 0 +EDGE2 9486 7885 -0.977071 0.0688614 -1.57294 1 0 1 1 0 0 +EDGE2 9486 7905 -1.00933 -0.0469202 1.5924 1 0 1 1 0 0 +EDGE2 9486 7245 -0.934964 0.00881727 -1.55462 1 0 1 1 0 0 +EDGE2 9487 7248 1.04794 -0.0502368 -0.00502264 1 0 1 1 0 0 +EDGE2 9487 7868 0.966861 0.0105335 -0.00357537 1 0 1 1 0 0 +EDGE2 9487 7247 -0.123679 0.0557698 0.028036 1 0 1 1 0 0 +EDGE2 9487 7867 -0.013211 0.00164876 -0.00755568 1 0 1 1 0 0 +EDGE2 9487 7246 -0.929549 -0.0900064 0.00333821 1 0 1 1 0 0 +EDGE2 9487 7866 -1.02966 -0.0397955 0.0180572 1 0 1 1 0 0 +EDGE2 9487 9486 -0.892059 0.0587262 0.00425549 1 0 1 1 0 0 +EDGE2 9488 7249 1.01437 -0.0340763 0.000965929 1 0 1 1 0 0 +EDGE2 9488 7869 1.02606 -0.0231981 0.0086676 1 0 1 1 0 0 +EDGE2 9488 7248 -0.0656427 0.0893677 0.00595372 1 0 1 1 0 0 +EDGE2 9488 7868 0.109964 0.0868517 0.0212106 1 0 1 1 0 0 +EDGE2 9488 7247 -1.05195 0.045739 -0.0249496 1 0 1 1 0 0 +EDGE2 9488 7867 -1.13976 0.0461003 0.0257606 1 0 1 1 0 0 +EDGE2 9488 9487 -0.965413 0.0956492 -0.00893012 1 0 1 1 0 0 +EDGE2 9489 7250 1.02837 0.035424 -0.0221621 1 0 1 1 0 0 +EDGE2 9489 7430 1.0337 -0.0506727 -3.15893 1 0 1 1 0 0 +EDGE2 9489 7870 0.934658 0.0679641 -0.0102784 1 0 1 1 0 0 +EDGE2 9489 7270 1.00981 -0.114544 -3.17682 1 0 1 1 0 0 +EDGE2 9489 7110 1.02542 0.0970075 -3.14419 1 0 1 1 0 0 +EDGE2 9489 7130 0.971616 -0.028669 -3.10383 1 0 1 1 0 0 +EDGE2 9489 7249 -0.000697262 0.0433622 0.025748 1 0 1 1 0 0 +EDGE2 9489 7869 -0.0276971 -0.0854045 -0.0148534 1 0 1 1 0 0 +EDGE2 9489 7248 -1.08313 0.00644869 -0.00749449 1 0 1 1 0 0 +EDGE2 9489 7868 -0.973538 -0.0265227 -0.0421956 1 0 1 1 0 0 +EDGE2 9489 9488 -0.917137 0.0265293 0.0212507 1 0 1 1 0 0 +EDGE2 9490 7131 -0.00804581 -0.95308 -1.56636 1 0 1 1 0 0 +EDGE2 9490 7271 -0.037838 -0.985483 -1.55031 1 0 1 1 0 0 +EDGE2 9490 7431 -0.0243143 -1.01002 -1.57985 1 0 1 1 0 0 +EDGE2 9490 7251 -0.0636202 -0.976628 -1.61552 1 0 1 1 0 0 +EDGE2 9490 7111 0.0206953 -0.948287 -1.56914 1 0 1 1 0 0 +EDGE2 9490 7129 1.05842 -0.0109227 -3.12806 1 0 1 1 0 0 +EDGE2 9490 7269 1.04813 -0.0955416 -3.12448 1 0 1 1 0 0 +EDGE2 9490 7429 0.8744 0.0476811 -3.1226 1 0 1 1 0 0 +EDGE2 9490 7109 0.921695 -0.0308944 -3.1444 1 0 1 1 0 0 +EDGE2 9490 7250 -0.000326367 -0.00143994 0.0205749 1 0 1 1 0 0 +EDGE2 9490 7430 0.0109489 0.109292 -3.12449 1 0 1 1 0 0 +EDGE2 9490 7870 -0.0131916 0.0545479 0.0140977 1 0 1 1 0 0 +EDGE2 9490 7270 0.0356693 -0.00651856 -3.12949 1 0 1 1 0 0 +EDGE2 9490 7110 0.0134038 0.0063899 -3.11702 1 0 1 1 0 0 +EDGE2 9490 7130 0.0378336 0.0329698 -3.1527 1 0 1 1 0 0 +EDGE2 9490 7871 0.0421953 0.999509 1.56997 1 0 1 1 0 0 +EDGE2 9490 9489 -0.915294 0.0350807 -0.0132569 1 0 1 1 0 0 +EDGE2 9490 7249 -0.890697 0.0206024 0.00855847 1 0 1 1 0 0 +EDGE2 9490 7869 -1.01146 -0.0338706 -0.00585731 1 0 1 1 0 0 +EDGE2 9491 7250 -0.999424 0.0711893 -1.56704 1 0 1 1 0 0 +EDGE2 9491 7430 -0.956637 0.0239022 1.57047 1 0 1 1 0 0 +EDGE2 9491 7870 -0.971257 -0.00369621 -1.55608 1 0 1 1 0 0 +EDGE2 9491 9490 -1.02376 0.0724763 -1.5534 1 0 1 1 0 0 +EDGE2 9491 7270 -0.994558 0.0389477 1.57508 1 0 1 1 0 0 +EDGE2 9491 7110 -0.943459 -0.00740579 1.54559 1 0 1 1 0 0 +EDGE2 9491 7130 -1.03285 0.0432111 1.58087 1 0 1 1 0 0 +EDGE2 9491 7871 -0.0222091 0.0164687 -0.0241679 1 0 1 1 0 0 +EDGE2 9491 7872 1.0341 0.0363943 -0.0129306 1 0 1 1 0 0 +EDGE2 9492 9491 -0.946144 0.00165818 -0.010685 1 0 1 1 0 0 +EDGE2 9492 7871 -1.00036 0.010907 0.0128347 1 0 1 1 0 0 +EDGE2 9492 7872 -0.0496387 -0.092806 -0.000487931 1 0 1 1 0 0 +EDGE2 9492 7873 1.00026 -0.0171693 -0.00371639 1 0 1 1 0 0 +EDGE2 9493 9492 -1.07417 0.0136527 0.0460846 1 0 1 1 0 0 +EDGE2 9493 7872 -1.02683 -0.0343465 -0.0225513 1 0 1 1 0 0 +EDGE2 9493 7873 0.020449 -0.016163 0.0191847 1 0 1 1 0 0 +EDGE2 9493 7874 0.953105 0.0649196 0.0199347 1 0 1 1 0 0 +EDGE2 9494 7855 0.984263 0.0308262 -3.14555 1 0 1 1 0 0 +EDGE2 9494 9493 -0.94218 -0.0959759 0.00940408 1 0 1 1 0 0 +EDGE2 9494 7873 -0.981755 0.0295845 0.0310449 1 0 1 1 0 0 +EDGE2 9494 7874 0.0554083 -0.0225044 -0.0202571 1 0 1 1 0 0 +EDGE2 9494 7875 1.03827 0.0569507 -0.00261074 1 0 1 1 0 0 +EDGE2 9494 7055 1.06676 0.0288615 -3.11386 1 0 1 1 0 0 +EDGE2 9494 7815 1.00474 -0.0315276 -3.13872 1 0 1 1 0 0 +EDGE2 9494 7835 0.988888 -0.0426373 -3.15581 1 0 1 1 0 0 +EDGE2 9495 7855 0.0562242 0.0575005 -3.17583 1 0 1 1 0 0 +EDGE2 9495 7836 -0.0504668 -0.981983 -1.58002 1 0 1 1 0 0 +EDGE2 9495 7056 -0.0966165 -1.03934 -1.57512 1 0 1 1 0 0 +EDGE2 9495 7816 0.0207944 -1.00343 -1.56289 1 0 1 1 0 0 +EDGE2 9495 9494 -1.09514 -0.0661638 0.019577 1 0 1 1 0 0 +EDGE2 9495 7874 -0.994834 0.0442886 -0.0159938 1 0 1 1 0 0 +EDGE2 9495 7875 0.104287 0.0474709 0.00298423 1 0 1 1 0 0 +EDGE2 9495 7834 0.951922 0.0623407 -3.15221 1 0 1 1 0 0 +EDGE2 9495 7055 0.0398168 0.0628359 -3.14545 1 0 1 1 0 0 +EDGE2 9495 7815 0.0102787 0.094667 -3.15865 1 0 1 1 0 0 +EDGE2 9495 7835 -0.120055 0.0254294 -3.14732 1 0 1 1 0 0 +EDGE2 9495 7854 1.01554 0.021053 -3.13729 1 0 1 1 0 0 +EDGE2 9495 7054 0.909507 -0.0110241 -3.0987 1 0 1 1 0 0 +EDGE2 9495 7814 0.947518 0.0634268 -3.14414 1 0 1 1 0 0 +EDGE2 9495 7876 -0.10549 1.01231 1.57515 1 0 1 1 0 0 +EDGE2 9495 7856 0.016048 1.00007 1.58217 1 0 1 1 0 0 +EDGE2 9496 7855 -1.06676 0.00235378 -1.574 1 0 1 1 0 0 +EDGE2 9496 7057 0.992205 0.014462 -0.0300855 1 0 1 1 0 0 +EDGE2 9496 7837 1.05326 -0.0127535 0.00114976 1 0 1 1 0 0 +EDGE2 9496 7817 0.947937 -0.0229203 0.00282185 1 0 1 1 0 0 +EDGE2 9496 7836 0.00960794 -0.0156115 0.0173681 1 0 1 1 0 0 +EDGE2 9496 7056 -0.0367993 0.0736834 -0.0388013 1 0 1 1 0 0 +EDGE2 9496 7816 -0.0933358 0.0178199 -0.00407269 1 0 1 1 0 0 +EDGE2 9496 9495 -1.03652 -0.00372124 1.55179 1 0 1 1 0 0 +EDGE2 9496 7875 -0.964177 0.0437095 1.54506 1 0 1 1 0 0 +EDGE2 9496 7055 -1.09857 0.0246257 -1.56175 1 0 1 1 0 0 +EDGE2 9496 7815 -0.957953 -0.0617921 -1.57794 1 0 1 1 0 0 +EDGE2 9496 7835 -0.968717 -0.0357136 -1.55676 1 0 1 1 0 0 +EDGE2 9497 7818 0.975604 -0.0499362 0.000725597 1 0 1 1 0 0 +EDGE2 9497 7838 0.91629 -0.082881 0.00912648 1 0 1 1 0 0 +EDGE2 9497 7058 0.964786 0.0599563 0.00755218 1 0 1 1 0 0 +EDGE2 9497 9496 -0.967538 0.025191 -0.0358999 1 0 1 1 0 0 +EDGE2 9497 7057 -0.0621709 0.0818967 0.0124715 1 0 1 1 0 0 +EDGE2 9497 7837 -0.0995131 0.00290072 -0.0282722 1 0 1 1 0 0 +EDGE2 9497 7817 -0.0117606 -0.0135415 0.0075843 1 0 1 1 0 0 +EDGE2 9497 7836 -1.01484 -0.0770161 0.00275109 1 0 1 1 0 0 +EDGE2 9497 7056 -0.865975 0.0792268 -0.0120148 1 0 1 1 0 0 +EDGE2 9497 7816 -0.951879 -0.00731108 0.000103331 1 0 1 1 0 0 +EDGE2 9498 7818 0.00932121 -0.0148739 0.00223941 1 0 1 1 0 0 +EDGE2 9498 7059 1.02002 0.0285266 -0.0138064 1 0 1 1 0 0 +EDGE2 9498 7819 0.985774 -0.0216736 0.00138428 1 0 1 1 0 0 +EDGE2 9498 7839 0.982033 -0.0688228 -0.0172582 1 0 1 1 0 0 +EDGE2 9498 7838 0.0515074 0.0227075 0.0268503 1 0 1 1 0 0 +EDGE2 9498 7058 -0.0153509 -0.0595359 -0.0132111 1 0 1 1 0 0 +EDGE2 9498 7057 -1.02643 0.0177467 0.0247249 1 0 1 1 0 0 +EDGE2 9498 7837 -0.984426 0.0544081 0.0338655 1 0 1 1 0 0 +EDGE2 9498 9497 -1.08758 0.0980064 0.00859993 1 0 1 1 0 0 +EDGE2 9498 7817 -1.01044 0.158729 -0.0194511 1 0 1 1 0 0 +EDGE2 9499 7060 0.972146 0.0903499 0.027477 1 0 1 1 0 0 +EDGE2 9499 7820 0.956287 -0.0275627 -0.00593308 1 0 1 1 0 0 +EDGE2 9499 7840 0.981239 -0.038223 0.0204728 1 0 1 1 0 0 +EDGE2 9499 7100 1.01978 0.0340521 -3.15969 1 0 1 1 0 0 +EDGE2 9499 7818 -1.00703 0.0146768 0.030804 1 0 1 1 0 0 +EDGE2 9499 7059 -0.000244835 0.0159981 0.00541682 1 0 1 1 0 0 +EDGE2 9499 7819 -0.0302229 -0.000741611 0.00346942 1 0 1 1 0 0 +EDGE2 9499 7839 0.104752 -0.0349128 0.0241176 1 0 1 1 0 0 +EDGE2 9499 9498 -0.959948 0.0395488 0.00889341 1 0 1 1 0 0 +EDGE2 9499 7838 -0.981222 0.0258177 -0.056118 1 0 1 1 0 0 +EDGE2 9499 7058 -0.994571 -0.0185578 -0.0228309 1 0 1 1 0 0 +EDGE2 9500 7099 1.03 -0.0325065 -3.1738 1 0 1 1 0 0 +EDGE2 9500 7061 -0.0480411 -0.988141 -1.57722 1 0 1 1 0 0 +EDGE2 9500 7101 -0.0610203 -0.937414 -1.60189 1 0 1 1 0 0 +EDGE2 9500 7060 -0.0300892 0.0496551 -0.031982 1 0 1 1 0 0 +EDGE2 9500 7820 0.0253904 0.101307 -0.00852629 1 0 1 1 0 0 +EDGE2 9500 7840 0.000330834 0.118618 -0.00428987 1 0 1 1 0 0 +EDGE2 9500 7100 0.00128908 0.110498 -3.15386 1 0 1 1 0 0 +EDGE2 9500 7841 -0.0440291 0.960557 1.61137 1 0 1 1 0 0 +EDGE2 9500 7821 -0.013356 1.06823 1.5554 1 0 1 1 0 0 +EDGE2 9500 9499 -0.96336 0.0807933 0.0117669 1 0 1 1 0 0 +EDGE2 9500 7059 -1.0173 0.0626221 -0.0315999 1 0 1 1 0 0 +EDGE2 9500 7819 -1.0665 0.050895 -0.0103214 1 0 1 1 0 0 +EDGE2 9500 7839 -0.936327 -0.0496119 0.0086677 1 0 1 1 0 0 +EDGE2 9501 7060 -1.00411 -0.0291407 -1.57285 1 0 1 1 0 0 +EDGE2 9501 7820 -1.01772 0.0102791 -1.58693 1 0 1 1 0 0 +EDGE2 9501 7840 -1.01565 -0.0569662 -1.54888 1 0 1 1 0 0 +EDGE2 9501 9500 -1.01334 -0.0121324 -1.55113 1 0 1 1 0 0 +EDGE2 9501 7100 -0.968524 0.0218698 1.59587 1 0 1 1 0 0 +EDGE2 9501 7841 -0.00650213 -0.029157 0.00987987 1 0 1 1 0 0 +EDGE2 9501 7821 0.0959974 -0.114953 0.0348925 1 0 1 1 0 0 +EDGE2 9501 7822 1.04726 -0.036089 -0.00960863 1 0 1 1 0 0 +EDGE2 9501 7842 0.924837 0.00157623 -0.000803742 1 0 1 1 0 0 +EDGE2 9502 7841 -1.06319 -0.0236773 0.0268026 1 0 1 1 0 0 +EDGE2 9502 9501 -1.00773 0.0330907 -0.0290488 1 0 1 1 0 0 +EDGE2 9502 7821 -0.974769 -0.0371389 0.000182483 1 0 1 1 0 0 +EDGE2 9502 7823 1.03342 0.00403998 0.00210564 1 0 1 1 0 0 +EDGE2 9502 7822 -0.0679551 0.00853112 0.00852413 1 0 1 1 0 0 +EDGE2 9502 7842 -0.00132253 0.0799059 0.00103933 1 0 1 1 0 0 +EDGE2 9502 7843 0.982665 0.0362862 -0.0134403 1 0 1 1 0 0 +EDGE2 9503 9502 -0.968152 -0.0168866 0.00214353 1 0 1 1 0 0 +EDGE2 9503 7823 0.0282447 0.0346922 -0.0004293 1 0 1 1 0 0 +EDGE2 9503 7822 -0.994038 0.0510472 0.00849396 1 0 1 1 0 0 +EDGE2 9503 7842 -1.10494 0.0671725 -0.0067489 1 0 1 1 0 0 +EDGE2 9503 7843 -0.0344339 -0.0144939 0.0287122 1 0 1 1 0 0 +EDGE2 9503 7824 1.03036 -0.0536657 0.0112336 1 0 1 1 0 0 +EDGE2 9503 7844 0.926032 0.0106025 0.0145644 1 0 1 1 0 0 +EDGE2 9504 7823 -0.987877 0.00233034 -0.0298213 1 0 1 1 0 0 +EDGE2 9504 9503 -1.00459 0.141131 -0.0367658 1 0 1 1 0 0 +EDGE2 9504 7843 -0.886972 -0.0358773 0.0108734 1 0 1 1 0 0 +EDGE2 9504 7845 1.02916 0.00527336 0.0500702 1 0 1 1 0 0 +EDGE2 9504 7824 -0.0570755 -0.0482634 -0.0149141 1 0 1 1 0 0 +EDGE2 9504 7844 -0.000493535 0.0431446 -0.0206954 1 0 1 1 0 0 +EDGE2 9504 7805 0.99045 -0.0174541 -3.14429 1 0 1 1 0 0 +EDGE2 9504 7825 1.02727 -0.0448345 -0.000954718 1 0 1 1 0 0 +EDGE2 9505 9504 -0.935743 -0.0344781 0.0156044 1 0 1 1 0 0 +EDGE2 9505 7845 0.0159615 -0.0728716 -0.00880668 1 0 1 1 0 0 +EDGE2 9505 7824 -0.983856 0.0200948 -0.0396458 1 0 1 1 0 0 +EDGE2 9505 7844 -1.05911 -0.000341897 0.0192728 1 0 1 1 0 0 +EDGE2 9505 7805 -0.00615734 -0.0543649 -3.14369 1 0 1 1 0 0 +EDGE2 9505 7825 0.0112687 -0.068894 -0.0108928 1 0 1 1 0 0 +EDGE2 9505 7804 0.925695 0.0250724 -3.13134 1 0 1 1 0 0 +EDGE2 9505 7826 0.0303223 1.08336 1.5727 1 0 1 1 0 0 +EDGE2 9505 7846 0.0102538 0.92657 1.5663 1 0 1 1 0 0 +EDGE2 9505 7806 -0.00885344 1.01166 1.55835 1 0 1 1 0 0 +EDGE2 9506 7845 -1.0718 -0.119265 1.58975 1 0 1 1 0 0 +EDGE2 9506 9505 -1.05531 -0.050435 1.55752 1 0 1 1 0 0 +EDGE2 9506 7805 -0.96192 0.00541337 -1.5472 1 0 1 1 0 0 +EDGE2 9506 7825 -1.02935 0.000646385 1.53846 1 0 1 1 0 0 +EDGE2 9507 9506 -0.921947 0.0405792 0.0163786 1 0 1 1 0 0 +EDGE2 9508 9507 -1.06739 -0.0143994 0.0434192 1 0 1 1 0 0 +EDGE2 9509 9508 -1.1025 -0.0213034 -0.00691783 1 0 1 1 0 0 +EDGE2 9510 9509 -0.991289 0.00312938 0.00687947 1 0 1 1 0 0 +EDGE2 9511 9510 -1.01396 -0.0329174 -1.58546 1 0 1 1 0 0 +EDGE2 9512 9511 -0.96784 0.0142564 0.0120507 1 0 1 1 0 0 +EDGE2 9513 9512 -1.01864 0.0800406 0.00398782 1 0 1 1 0 0 +EDGE2 9514 9513 -0.976977 0.0483546 -0.0536538 1 0 1 1 0 0 +EDGE2 9515 9514 -1.03058 -0.0425404 -0.0302019 1 0 1 1 0 0 +EDGE2 9516 9515 -1.06051 0.00610688 -1.54371 1 0 1 1 0 0 +EDGE2 9517 9516 -0.946931 0.0146123 0.0246509 1 0 1 1 0 0 +EDGE2 9518 9517 -0.947381 0.00690883 -0.0186174 1 0 1 1 0 0 +EDGE2 9519 9518 -1.05731 0.0905995 -0.0030465 1 0 1 1 0 0 +EDGE2 9519 7800 0.993227 -0.0414609 -3.13538 1 0 1 1 0 0 +EDGE2 9520 9519 -0.952685 -0.00343565 -0.00572153 1 0 1 1 0 0 +EDGE2 9520 7801 0.0164717 1.02591 1.55898 1 0 1 1 0 0 +EDGE2 9520 7800 -0.00959868 0.0988995 -3.14052 1 0 1 1 0 0 +EDGE2 9520 7799 1.04302 -0.00781712 -3.12728 1 0 1 1 0 0 +EDGE2 9521 7802 0.967873 -0.00482119 0.0340888 1 0 1 1 0 0 +EDGE2 9521 7801 -0.0760322 -0.0601542 0.0168878 1 0 1 1 0 0 +EDGE2 9521 7800 -1.07666 0.119775 1.59683 1 0 1 1 0 0 +EDGE2 9521 9520 -1.00086 -0.0838209 -1.58679 1 0 1 1 0 0 +EDGE2 9522 7803 1.06037 -0.0586061 0.017417 1 0 1 1 0 0 +EDGE2 9522 9521 -0.961226 -0.00778085 -0.0175242 1 0 1 1 0 0 +EDGE2 9522 7802 0.00415522 0.0229757 -0.0247125 1 0 1 1 0 0 +EDGE2 9522 7801 -1.00976 -0.0768768 0.00249168 1 0 1 1 0 0 +EDGE2 9523 7804 1.01531 0.0368229 -0.00355196 1 0 1 1 0 0 +EDGE2 9523 7803 0.0999784 0.01049 -0.0137119 1 0 1 1 0 0 +EDGE2 9523 7802 -1.07682 0.0290144 0.000888863 1 0 1 1 0 0 +EDGE2 9523 9522 -1.01092 -0.0198097 0.00324729 1 0 1 1 0 0 +EDGE2 9524 7845 1.00054 -0.0204426 -3.12736 1 0 1 1 0 0 +EDGE2 9524 9505 0.977935 0.098735 -3.13982 1 0 1 1 0 0 +EDGE2 9524 7805 0.998343 -0.017862 0.00593994 1 0 1 1 0 0 +EDGE2 9524 7825 1.07547 -0.129134 -3.1364 1 0 1 1 0 0 +EDGE2 9524 7804 -0.0976593 0.0115913 0.0222949 1 0 1 1 0 0 +EDGE2 9524 7803 -1.09685 -0.0327698 -0.0194783 1 0 1 1 0 0 +EDGE2 9524 9523 -0.976082 -0.0387262 -0.0215151 1 0 1 1 0 0 +EDGE2 9525 9506 -0.00779844 0.927859 1.58787 1 0 1 1 0 0 +EDGE2 9525 9504 1.05082 -0.0109451 -3.15557 1 0 1 1 0 0 +EDGE2 9525 7845 -0.0515366 -0.0399006 -3.12982 1 0 1 1 0 0 +EDGE2 9525 7824 0.985905 -0.057746 -3.15436 1 0 1 1 0 0 +EDGE2 9525 7844 1.00897 -0.0742616 -3.13356 1 0 1 1 0 0 +EDGE2 9525 9505 -0.103358 0.0738552 -3.14587 1 0 1 1 0 0 +EDGE2 9525 9524 -1.00586 -0.0333045 -0.00508354 1 0 1 1 0 0 +EDGE2 9525 7805 -0.110124 -0.0155459 0.0217094 1 0 1 1 0 0 +EDGE2 9525 7825 0.0456535 0.014388 -3.14962 1 0 1 1 0 0 +EDGE2 9525 7804 -0.992198 0.0488576 0.00489708 1 0 1 1 0 0 +EDGE2 9525 7826 0.00774767 -1.04407 -1.56021 1 0 1 1 0 0 +EDGE2 9525 7846 0.00922762 -1.06358 -1.55234 1 0 1 1 0 0 +EDGE2 9525 7806 0.0172753 -1.0332 -1.56963 1 0 1 1 0 0 +EDGE2 9526 7807 1.12939 0.0294425 -0.0398067 1 0 1 1 0 0 +EDGE2 9526 7845 -1.04059 0.0915469 -1.57305 1 0 1 1 0 0 +EDGE2 9526 9525 -0.998899 0.0522898 1.54721 1 0 1 1 0 0 +EDGE2 9526 9505 -1.03514 -0.0521467 -1.57852 1 0 1 1 0 0 +EDGE2 9526 7805 -0.953235 0.0901898 1.54077 1 0 1 1 0 0 +EDGE2 9526 7825 -1.07475 0.0298211 -1.56515 1 0 1 1 0 0 +EDGE2 9526 7826 0.0277404 0.0389665 -0.00387329 1 0 1 1 0 0 +EDGE2 9526 7846 0.0204996 -0.061253 -0.0115384 1 0 1 1 0 0 +EDGE2 9526 7806 0.000941742 0.0307756 0.0200944 1 0 1 1 0 0 +EDGE2 9526 7847 0.954898 0.00584611 0.0367322 1 0 1 1 0 0 +EDGE2 9526 7827 1.0148 -0.0262707 0.0208159 1 0 1 1 0 0 +EDGE2 9527 7807 0.0481266 -0.0163607 -0.00845334 1 0 1 1 0 0 +EDGE2 9527 7826 -0.954076 0.0306335 0.00261659 1 0 1 1 0 0 +EDGE2 9527 7846 -0.935995 -0.0337094 -0.011651 1 0 1 1 0 0 +EDGE2 9527 9526 -0.996103 0.0378447 -0.0200153 1 0 1 1 0 0 +EDGE2 9527 7806 -1.02721 0.040069 -0.0200364 1 0 1 1 0 0 +EDGE2 9527 7847 -0.0476918 0.0291116 -0.000724784 1 0 1 1 0 0 +EDGE2 9527 7827 0.0357153 -0.0193741 0.0246721 1 0 1 1 0 0 +EDGE2 9527 7828 0.994611 0.118641 0.0171519 1 0 1 1 0 0 +EDGE2 9527 7848 1.0031 0.0260835 0.0252993 1 0 1 1 0 0 +EDGE2 9527 7808 1.0809 0.0284202 -0.0166725 1 0 1 1 0 0 +EDGE2 9528 7807 -1.04132 0.00972665 0.0128681 1 0 1 1 0 0 +EDGE2 9528 7847 -1.00404 0.00235219 0.00398947 1 0 1 1 0 0 +EDGE2 9528 9527 -0.978711 -0.068407 -0.0305969 1 0 1 1 0 0 +EDGE2 9528 7827 -1.07949 0.0720139 -0.0120484 1 0 1 1 0 0 +EDGE2 9528 7829 0.976684 -0.0198399 0.011633 1 0 1 1 0 0 +EDGE2 9528 7828 0.124341 0.0495466 0.00226116 1 0 1 1 0 0 +EDGE2 9528 7848 0.0312718 0.051842 0.0121671 1 0 1 1 0 0 +EDGE2 9528 7808 -0.00178708 0.00172149 -0.0011891 1 0 1 1 0 0 +EDGE2 9528 7849 0.911661 0.108883 0.0123395 1 0 1 1 0 0 +EDGE2 9528 7809 0.971484 0.0185923 0.0202734 1 0 1 1 0 0 +EDGE2 9529 7829 -0.0490061 -0.0360458 0.0102313 1 0 1 1 0 0 +EDGE2 9529 7828 -1.02203 0.0238102 -0.0026342 1 0 1 1 0 0 +EDGE2 9529 7848 -0.923424 -0.0129073 -0.0319069 1 0 1 1 0 0 +EDGE2 9529 9528 -0.981208 0.0102598 0.0452001 1 0 1 1 0 0 +EDGE2 9529 7808 -0.937349 0.0915154 -0.00195266 1 0 1 1 0 0 +EDGE2 9529 7849 0.104711 -0.0353263 -0.00687419 1 0 1 1 0 0 +EDGE2 9529 7809 -0.0322062 0.0392003 -0.0172285 1 0 1 1 0 0 +EDGE2 9529 7770 0.973624 0.0651606 -3.11873 1 0 1 1 0 0 +EDGE2 9529 7810 1.05013 0.0542146 -0.00933411 1 0 1 1 0 0 +EDGE2 9529 7830 0.971958 0.00247078 -0.00369088 1 0 1 1 0 0 +EDGE2 9529 7850 1.00352 -0.0402625 -0.0132711 1 0 1 1 0 0 +EDGE2 9529 7790 0.957435 0.00690737 -3.13773 1 0 1 1 0 0 +EDGE2 9529 7010 1.01195 0.0443995 -3.1458 1 0 1 1 0 0 +EDGE2 9529 7030 1.02726 -0.0316304 -3.15302 1 0 1 1 0 0 +EDGE2 9529 7050 0.997058 -0.134719 -3.14722 1 0 1 1 0 0 +EDGE2 9530 7829 -0.998322 0.0886735 -0.0283158 1 0 1 1 0 0 +EDGE2 9530 9529 -0.954523 -0.0215171 -0.0420467 1 0 1 1 0 0 +EDGE2 9530 7849 -0.956795 0.00195691 -0.00219326 1 0 1 1 0 0 +EDGE2 9530 7809 -0.977213 -0.0258724 -0.00491432 1 0 1 1 0 0 +EDGE2 9530 7811 0.00738441 0.97668 1.57706 1 0 1 1 0 0 +EDGE2 9530 7831 0.0176114 0.947053 1.54885 1 0 1 1 0 0 +EDGE2 9530 7851 -0.0189536 1.00399 1.5855 1 0 1 1 0 0 +EDGE2 9530 7051 0.00341169 1.02996 1.54966 1 0 1 1 0 0 +EDGE2 9530 7770 -0.100383 0.0253617 -3.14605 1 0 1 1 0 0 +EDGE2 9530 7810 0.0131103 0.020855 -0.00827772 1 0 1 1 0 0 +EDGE2 9530 7830 0.025336 -0.0389138 0.0230378 1 0 1 1 0 0 +EDGE2 9530 7850 -0.0487431 -0.0128487 0.0175287 1 0 1 1 0 0 +EDGE2 9530 7790 -0.00299045 -0.0339583 -3.14533 1 0 1 1 0 0 +EDGE2 9530 7769 0.938727 0.045819 -3.15523 1 0 1 1 0 0 +EDGE2 9530 7010 0.0836648 -0.0196622 -3.15831 1 0 1 1 0 0 +EDGE2 9530 7030 0.0992337 0.0832876 -3.13587 1 0 1 1 0 0 +EDGE2 9530 7050 -0.083328 -0.0708537 -3.15481 1 0 1 1 0 0 +EDGE2 9530 7789 0.96234 -0.0150958 -3.15185 1 0 1 1 0 0 +EDGE2 9530 7029 0.949828 0.000954498 -3.12256 1 0 1 1 0 0 +EDGE2 9530 7049 1.03113 -0.0314566 -3.14602 1 0 1 1 0 0 +EDGE2 9530 7009 0.955201 -0.0285693 -3.17041 1 0 1 1 0 0 +EDGE2 9530 7031 -0.0467708 -1.10629 -1.56766 1 0 1 1 0 0 +EDGE2 9530 7771 0.0262466 -0.92286 -1.56838 1 0 1 1 0 0 +EDGE2 9530 7791 -0.0617294 -1.03672 -1.55924 1 0 1 1 0 0 +EDGE2 9530 7011 -0.0319664 -1.05427 -1.53666 1 0 1 1 0 0 +EDGE2 9531 9530 -0.964003 0.0581458 1.54194 1 0 1 1 0 0 +EDGE2 9531 7770 -0.967477 -0.045791 -1.60646 1 0 1 1 0 0 +EDGE2 9531 7810 -0.967409 0.0223063 1.53588 1 0 1 1 0 0 +EDGE2 9531 7830 -1.00958 -0.0541655 1.57381 1 0 1 1 0 0 +EDGE2 9531 7850 -0.924625 -0.0652795 1.5409 1 0 1 1 0 0 +EDGE2 9531 7790 -1.03131 -0.0458331 -1.56997 1 0 1 1 0 0 +EDGE2 9531 7010 -1.01644 -0.0463376 -1.61094 1 0 1 1 0 0 +EDGE2 9531 7030 -1.03516 0.0277529 -1.55265 1 0 1 1 0 0 +EDGE2 9531 7050 -1.00952 0.000318675 -1.58525 1 0 1 1 0 0 +EDGE2 9531 7031 0.121271 0.0209507 0.0104157 1 0 1 1 0 0 +EDGE2 9531 7771 0.0322385 -0.0361852 0.0435325 1 0 1 1 0 0 +EDGE2 9531 7791 0.0493358 -0.0988836 -0.0294946 1 0 1 1 0 0 +EDGE2 9531 7011 -0.0713054 0.0222141 0.0138447 1 0 1 1 0 0 +EDGE2 9531 7032 0.876573 0.0892725 -0.022644 1 0 1 1 0 0 +EDGE2 9531 7772 0.94517 0.0243223 0.00614725 1 0 1 1 0 0 +EDGE2 9531 7792 1.01918 -0.016707 0.0125285 1 0 1 1 0 0 +EDGE2 9531 7012 1.05243 -0.00919812 0.0451424 1 0 1 1 0 0 +EDGE2 9532 9531 -1.00193 -0.0329915 0.00293734 1 0 1 1 0 0 +EDGE2 9532 7031 -1.01261 -0.0384433 0.0148596 1 0 1 1 0 0 +EDGE2 9532 7771 -0.981174 -0.0713691 0.0268546 1 0 1 1 0 0 +EDGE2 9532 7791 -1.03739 0.0515824 -0.00378272 1 0 1 1 0 0 +EDGE2 9532 7011 -0.874144 -0.0655901 -0.00411313 1 0 1 1 0 0 +EDGE2 9532 7032 0.0765759 0.0755496 0.0436347 1 0 1 1 0 0 +EDGE2 9532 7772 0.0406633 0.0818257 0.0199429 1 0 1 1 0 0 +EDGE2 9532 7792 0.0360719 0.0737086 -0.0223755 1 0 1 1 0 0 +EDGE2 9532 7012 -0.0381455 -0.0255527 0.0351874 1 0 1 1 0 0 +EDGE2 9532 7033 1.00938 -0.0198711 0.0283615 1 0 1 1 0 0 +EDGE2 9532 7773 1.01276 -0.0281738 -0.0114907 1 0 1 1 0 0 +EDGE2 9532 7793 0.974623 -0.0126986 0.0125517 1 0 1 1 0 0 +EDGE2 9532 7013 1.00787 -0.0165269 0.0291967 1 0 1 1 0 0 +EDGE2 9533 9532 -0.904984 -0.0205027 0.00130195 1 0 1 1 0 0 +EDGE2 9533 7032 -1.00294 0.0967735 0.00954181 1 0 1 1 0 0 +EDGE2 9533 7772 -0.986101 0.0659458 0.0194048 1 0 1 1 0 0 +EDGE2 9533 7792 -1.05626 -0.0341314 -0.00172198 1 0 1 1 0 0 +EDGE2 9533 7012 -1.03808 -0.13308 -0.0233477 1 0 1 1 0 0 +EDGE2 9533 7033 -0.0866992 -0.019815 0.0162582 1 0 1 1 0 0 +EDGE2 9533 7773 -0.0515229 0.00889225 0.00312342 1 0 1 1 0 0 +EDGE2 9533 7793 -0.0624133 -0.00669295 -0.013623 1 0 1 1 0 0 +EDGE2 9533 7013 0.0340056 -0.0140719 0.0122423 1 0 1 1 0 0 +EDGE2 9533 7034 1.00923 0.0420018 -0.00541654 1 0 1 1 0 0 +EDGE2 9533 7774 1.01084 -0.0140581 -0.0169411 1 0 1 1 0 0 +EDGE2 9533 7794 1.03081 -0.0579377 -0.0218383 1 0 1 1 0 0 +EDGE2 9533 7014 0.969122 0.00278517 -0.00137827 1 0 1 1 0 0 +EDGE2 9534 9533 -1.01584 -0.0239567 -0.0248879 1 0 1 1 0 0 +EDGE2 9534 7033 -0.94608 0.0506375 -0.00652125 1 0 1 1 0 0 +EDGE2 9534 7773 -0.990856 -0.0547542 0.023012 1 0 1 1 0 0 +EDGE2 9534 7793 -1.0214 0.024121 0.00650811 1 0 1 1 0 0 +EDGE2 9534 7013 -0.991129 -0.0157522 -0.012891 1 0 1 1 0 0 +EDGE2 9534 7034 -0.0936406 -0.0831076 -0.00531273 1 0 1 1 0 0 +EDGE2 9534 7774 0.0253318 0.0356265 0.00514238 1 0 1 1 0 0 +EDGE2 9534 7794 0.0206356 0.103579 -0.00392738 1 0 1 1 0 0 +EDGE2 9534 7014 -0.0266221 0.0542165 0.040122 1 0 1 1 0 0 +EDGE2 9534 6995 0.955446 -0.0104431 -3.16586 1 0 1 1 0 0 +EDGE2 9534 7035 0.941443 -0.0674533 -0.0299432 1 0 1 1 0 0 +EDGE2 9534 7775 0.955891 0.039489 -0.0107681 1 0 1 1 0 0 +EDGE2 9534 7795 1.07377 -0.0751718 -0.0097312 1 0 1 1 0 0 +EDGE2 9534 7015 1.07839 -0.0488413 0.0151211 1 0 1 1 0 0 +EDGE2 9535 7796 -0.0698431 -0.920585 -1.57953 1 0 1 1 0 0 +EDGE2 9535 9534 -1.04842 0.056619 0.000203743 1 0 1 1 0 0 +EDGE2 9535 7034 -1.03098 0.0441894 -0.0213285 1 0 1 1 0 0 +EDGE2 9535 7774 -1.00637 -0.0177746 0.00868742 1 0 1 1 0 0 +EDGE2 9535 7794 -1.07542 -0.0271449 0.0106743 1 0 1 1 0 0 +EDGE2 9535 7014 -1.00682 0.11872 0.00486419 1 0 1 1 0 0 +EDGE2 9535 6995 -0.0485344 0.137254 -3.08508 1 0 1 1 0 0 +EDGE2 9535 7035 0.0223567 -0.0147553 0.00809746 1 0 1 1 0 0 +EDGE2 9535 7775 0.012162 0.0522831 -0.0128361 1 0 1 1 0 0 +EDGE2 9535 7795 -0.00935262 -0.0327091 0.0205136 1 0 1 1 0 0 +EDGE2 9535 7015 -0.0358532 0.0318368 -0.0145842 1 0 1 1 0 0 +EDGE2 9535 6994 0.978509 0.109577 -3.13797 1 0 1 1 0 0 +EDGE2 9535 7016 0.0172586 0.930581 1.58651 1 0 1 1 0 0 +EDGE2 9535 7036 0.0102922 0.888878 1.52569 1 0 1 1 0 0 +EDGE2 9535 7776 0.0780422 1.03682 1.5614 1 0 1 1 0 0 +EDGE2 9535 6996 0.071447 0.989919 1.57476 1 0 1 1 0 0 +EDGE2 9536 7797 1.01 0.123935 0.00963581 1 0 1 1 0 0 +EDGE2 9536 7796 -0.0211048 -0.0644907 0.0176495 1 0 1 1 0 0 +EDGE2 9536 9535 -1.01367 0.055701 1.5803 1 0 1 1 0 0 +EDGE2 9536 6995 -0.961698 -0.0231034 -1.56702 1 0 1 1 0 0 +EDGE2 9536 7035 -1.0875 0.0160728 1.57132 1 0 1 1 0 0 +EDGE2 9536 7775 -1.02307 -0.0589877 1.55227 1 0 1 1 0 0 +EDGE2 9536 7795 -0.938324 -0.104811 1.56977 1 0 1 1 0 0 +EDGE2 9536 7015 -0.95781 -0.0779056 1.5788 1 0 1 1 0 0 +EDGE2 9537 7798 0.982534 -0.0951055 0.0210027 1 0 1 1 0 0 +EDGE2 9537 9536 -1.04334 0.143947 -0.0236364 1 0 1 1 0 0 +EDGE2 9537 7797 0.0806773 0.0619163 0.0183288 1 0 1 1 0 0 +EDGE2 9537 7796 -0.982438 -0.0288202 -0.00314893 1 0 1 1 0 0 +EDGE2 9538 7798 0.0213007 -0.046137 0.0232337 1 0 1 1 0 0 +EDGE2 9538 7799 1.01581 -0.0428056 0.0032467 1 0 1 1 0 0 +EDGE2 9538 7797 -0.94008 0.0776767 0.0123546 1 0 1 1 0 0 +EDGE2 9538 9537 -1.01009 -0.0205853 0.00166398 1 0 1 1 0 0 +EDGE2 9539 7800 0.998127 -0.0449388 0.000992216 1 0 1 1 0 0 +EDGE2 9539 9520 1.10465 0.0280876 -3.13116 1 0 1 1 0 0 +EDGE2 9539 7798 -0.915584 -0.0561799 -0.0449507 1 0 1 1 0 0 +EDGE2 9539 7799 -0.0232164 -0.00699171 -0.0224164 1 0 1 1 0 0 +EDGE2 9539 9538 -1.0271 0.00658691 -0.00469949 1 0 1 1 0 0 +EDGE2 9540 9519 0.948031 0.04297 -3.16639 1 0 1 1 0 0 +EDGE2 9540 9521 -0.0319756 -1.03765 -1.57067 1 0 1 1 0 0 +EDGE2 9540 7801 0.0266436 -1.06001 -1.55802 1 0 1 1 0 0 +EDGE2 9540 7800 0.0552404 -0.0286989 -0.0104339 1 0 1 1 0 0 +EDGE2 9540 9520 0.067729 -0.0458058 -3.13587 1 0 1 1 0 0 +EDGE2 9540 9539 -1.00192 0.0258487 -0.016104 1 0 1 1 0 0 +EDGE2 9540 7799 -0.978408 0.0142519 -0.0433109 1 0 1 1 0 0 +EDGE2 9541 9540 -1.03618 -0.00739698 -1.56682 1 0 1 1 0 0 +EDGE2 9541 7800 -0.972907 0.0144368 -1.53581 1 0 1 1 0 0 +EDGE2 9541 9520 -0.951915 0.0516393 1.55781 1 0 1 1 0 0 +EDGE2 9542 9541 -1.03261 -0.0269053 -0.0151146 1 0 1 1 0 0 +EDGE2 9543 9542 -1.08805 -0.0458287 -0.0335931 1 0 1 1 0 0 +EDGE2 9544 9543 -1.10444 -0.0378282 0.00722276 1 0 1 1 0 0 +EDGE2 9545 9544 -0.991518 -0.0359988 0.00522013 1 0 1 1 0 0 +EDGE2 9546 9545 -0.986086 0.00771446 1.61323 1 0 1 1 0 0 +EDGE2 9547 9546 -0.981855 -0.0551794 -0.0632612 1 0 1 1 0 0 +EDGE2 9548 9547 -1.01769 0.01522 -0.00480695 1 0 1 1 0 0 +EDGE2 9549 9548 -1.11264 -0.037213 0.0397853 1 0 1 1 0 0 +EDGE2 9550 9549 -1.03847 -0.022135 -0.0104634 1 0 1 1 0 0 +EDGE2 9551 9550 -0.977812 -0.0165683 -1.59594 1 0 1 1 0 0 +EDGE2 9552 9551 -1.07704 -0.0240213 -0.0279817 1 0 1 1 0 0 +EDGE2 9553 9552 -0.989901 0.0458974 -0.00405239 1 0 1 1 0 0 +EDGE2 9554 9553 -1.01264 0.0234022 0.00340511 1 0 1 1 0 0 +EDGE2 9555 9554 -1.0025 0.0276519 0.0158401 1 0 1 1 0 0 +EDGE2 9556 9555 -1.04955 -0.0313307 1.60761 1 0 1 1 0 0 +EDGE2 9557 9556 -1.02815 -0.0341954 -0.0171451 1 0 1 1 0 0 +EDGE2 9558 9557 -0.955096 0.0580442 -0.011725 1 0 1 1 0 0 +EDGE2 9559 9558 -0.998407 -0.152047 0.00931445 1 0 1 1 0 0 +EDGE2 9560 9559 -0.949642 0.000631364 -0.0145339 1 0 1 1 0 0 +EDGE2 9561 9560 -1.09946 0.0184375 -1.55859 1 0 1 1 0 0 +EDGE2 9562 9561 -1.00752 0.0223803 0.0546812 1 0 1 1 0 0 +EDGE2 9563 9562 -0.915409 -0.00447893 0.0183048 1 0 1 1 0 0 +EDGE2 9564 9563 -0.972723 0.0235685 -0.0153679 1 0 1 1 0 0 +EDGE2 9565 9564 -1.01774 -0.0559215 -0.0230583 1 0 1 1 0 0 +EDGE2 9566 9565 -1.01851 -0.00423615 1.56027 1 0 1 1 0 0 +EDGE2 9567 9566 -0.899229 -0.05197 -0.0181099 1 0 1 1 0 0 +EDGE2 9568 9567 -1.01531 0.00787183 -0.0428132 1 0 1 1 0 0 +EDGE2 9569 9568 -0.986051 0.0347474 -0.0187116 1 0 1 1 0 0 +EDGE2 9570 9569 -1.00561 -0.0312349 0.0122683 1 0 1 1 0 0 +EDGE2 9571 9570 -1.05835 0.0063257 -1.59573 1 0 1 1 0 0 +EDGE2 9572 9571 -1.01984 0.047584 -0.00422276 1 0 1 1 0 0 +EDGE2 9573 9572 -1.08186 -0.0268861 0.0387105 1 0 1 1 0 0 +EDGE2 9574 9573 -0.943424 -0.00708002 -0.0234862 1 0 1 1 0 0 +EDGE2 9575 9574 -0.983749 0.00288715 0.00789891 1 0 1 1 0 0 +EDGE2 9576 9575 -0.939147 0.0958348 -1.58626 1 0 1 1 0 0 +EDGE2 9577 9576 -0.997387 -0.0510642 0.00242064 1 0 1 1 0 0 +EDGE2 9578 9577 -1.02937 0.0337983 -0.0311186 1 0 1 1 0 0 +EDGE2 9579 9578 -1.02771 0.0765821 0.00959633 1 0 1 1 0 0 +EDGE2 9580 9579 -1.06376 0.00272993 0.0258857 1 0 1 1 0 0 +EDGE2 9581 9580 -1.03318 0.0372915 -1.58168 1 0 1 1 0 0 +EDGE2 9582 9581 -1.04452 -0.0104231 -0.00565429 1 0 1 1 0 0 +EDGE2 9583 9582 -1.06386 0.0480668 0.025113 1 0 1 1 0 0 +EDGE2 9584 9565 0.973734 0.00028269 -3.15861 1 0 1 1 0 0 +EDGE2 9584 9583 -1.002 0.00601922 -0.00366952 1 0 1 1 0 0 +EDGE2 9585 9564 0.996362 -0.00833774 -3.14924 1 0 1 1 0 0 +EDGE2 9585 9565 0.100744 0.0141504 -3.14545 1 0 1 1 0 0 +EDGE2 9585 9566 -0.00148646 1.00148 1.54104 1 0 1 1 0 0 +EDGE2 9585 9584 -0.994262 -0.039071 -0.00183957 1 0 1 1 0 0 +EDGE2 9586 9567 0.963199 -0.00470074 0.00344813 1 0 1 1 0 0 +EDGE2 9586 9565 -0.949953 -0.0311567 1.55247 1 0 1 1 0 0 +EDGE2 9586 9566 -0.0599154 -0.00592691 0.0040893 1 0 1 1 0 0 +EDGE2 9586 9585 -0.886352 -0.0391642 -1.55924 1 0 1 1 0 0 +EDGE2 9587 9567 0.0729074 -0.039398 -0.00722124 1 0 1 1 0 0 +EDGE2 9587 9568 1.00019 -0.0334164 -0.00513796 1 0 1 1 0 0 +EDGE2 9587 9566 -1.07619 0.051009 -0.0122018 1 0 1 1 0 0 +EDGE2 9587 9586 -0.977223 -0.0362331 -0.0198344 1 0 1 1 0 0 +EDGE2 9588 9567 -0.990817 0.000839723 0.0300602 1 0 1 1 0 0 +EDGE2 9588 9568 -0.047442 0.0581146 -0.0012268 1 0 1 1 0 0 +EDGE2 9588 9569 1.00043 -0.0873521 -0.0248265 1 0 1 1 0 0 +EDGE2 9588 9587 -1.01979 0.00697847 -0.0214993 1 0 1 1 0 0 +EDGE2 9589 9570 0.995848 0.00091783 -0.0017641 1 0 1 1 0 0 +EDGE2 9589 9568 -0.943225 0.0270096 -0.00552027 1 0 1 1 0 0 +EDGE2 9589 9588 -0.981084 0.0185307 -0.0181337 1 0 1 1 0 0 +EDGE2 9589 9569 0.0446596 -0.0182563 -0.00677586 1 0 1 1 0 0 +EDGE2 9590 9570 0.0221656 -0.00694277 -0.00130167 1 0 1 1 0 0 +EDGE2 9590 9589 -0.998672 0.0685571 -0.0256433 1 0 1 1 0 0 +EDGE2 9590 9571 0.018353 1.03003 1.5631 1 0 1 1 0 0 +EDGE2 9590 9569 -0.986699 -0.0161597 0.049765 1 0 1 1 0 0 +EDGE2 9591 9570 -1.01795 0.0470938 -1.55751 1 0 1 1 0 0 +EDGE2 9591 9590 -1.12644 -0.0034722 -1.54291 1 0 1 1 0 0 +EDGE2 9591 9571 0.00531201 0.0595138 0.000270103 1 0 1 1 0 0 +EDGE2 9591 9572 1.02113 0.0738675 -0.0132216 1 0 1 1 0 0 +EDGE2 9592 9571 -1.06547 0.0500962 -0.0222599 1 0 1 1 0 0 +EDGE2 9592 9591 -0.964916 0.0247437 0.0398918 1 0 1 1 0 0 +EDGE2 9592 9572 -0.0292835 -0.0494755 -0.0164951 1 0 1 1 0 0 +EDGE2 9592 9573 1.02738 0.0429233 -0.0165247 1 0 1 1 0 0 +EDGE2 9593 9592 -0.92634 0.0526258 -0.0235761 1 0 1 1 0 0 +EDGE2 9593 9572 -0.981383 0.0294536 -0.0229871 1 0 1 1 0 0 +EDGE2 9593 9574 1.03815 -0.00459875 0.0402312 1 0 1 1 0 0 +EDGE2 9593 9573 -0.0219139 -0.0638269 0.00642959 1 0 1 1 0 0 +EDGE2 9594 9593 -1.05314 -0.0661734 0.0447896 1 0 1 1 0 0 +EDGE2 9594 9575 0.972617 0.0188244 0.00790715 1 0 1 1 0 0 +EDGE2 9594 9574 -0.0488482 0.0288378 -0.0447636 1 0 1 1 0 0 +EDGE2 9594 9573 -0.886978 0.0476917 -0.0288417 1 0 1 1 0 0 +EDGE2 9595 9575 -0.0546158 -0.0283837 -0.0261542 1 0 1 1 0 0 +EDGE2 9595 9574 -0.939243 0.0458133 0.0146457 1 0 1 1 0 0 +EDGE2 9595 9594 -1.05332 0.0186184 -0.00279226 1 0 1 1 0 0 +EDGE2 9595 9576 0.0117458 1.01151 1.56629 1 0 1 1 0 0 +EDGE2 9596 9575 -1.02524 -0.0122604 -1.55514 1 0 1 1 0 0 +EDGE2 9596 9595 -1.0129 0.0104384 -1.5345 1 0 1 1 0 0 +EDGE2 9596 9576 0.0942037 0.0134041 -0.00541822 1 0 1 1 0 0 +EDGE2 9596 9577 0.953072 -0.0318793 -0.00154735 1 0 1 1 0 0 +EDGE2 9597 9576 -1.06486 0.0605312 -0.000565411 1 0 1 1 0 0 +EDGE2 9597 9596 -1.02315 -0.082736 0.0134014 1 0 1 1 0 0 +EDGE2 9597 9577 0.0317524 0.032234 -0.00773811 1 0 1 1 0 0 +EDGE2 9597 9578 0.970901 -0.0175752 -0.0346493 1 0 1 1 0 0 +EDGE2 9598 9597 -1.00871 0.00929006 -0.00248702 1 0 1 1 0 0 +EDGE2 9598 9577 -1.01083 -0.0438985 -0.0166767 1 0 1 1 0 0 +EDGE2 9598 9578 0.0975764 -0.0103606 0.0319084 1 0 1 1 0 0 +EDGE2 9598 9579 1.00295 0.0321203 -0.0539341 1 0 1 1 0 0 +EDGE2 9599 9580 0.974318 -0.0168663 -0.00613091 1 0 1 1 0 0 +EDGE2 9599 9578 -0.917905 -0.0888396 0.0109708 1 0 1 1 0 0 +EDGE2 9599 9598 -1.04894 0.00426372 0.0155383 1 0 1 1 0 0 +EDGE2 9599 9579 0.0295076 0.0398683 0.00976242 1 0 1 1 0 0 +EDGE2 9600 9580 -0.0497179 -0.0187393 -0.000214448 1 0 1 1 0 0 +EDGE2 9600 9599 -0.903069 -0.00863434 0.0198873 1 0 1 1 0 0 +EDGE2 9600 9579 -1.03868 -0.0549014 0.0382887 1 0 1 1 0 0 +EDGE2 9600 9581 0.041548 0.889519 1.59257 1 0 1 1 0 0 +EDGE2 9601 9580 -0.976499 0.0177545 -1.55055 1 0 1 1 0 0 +EDGE2 9601 9582 0.98558 -0.0394136 -0.0721626 1 0 1 1 0 0 +EDGE2 9601 9581 0.0109946 -0.0497588 -0.0101192 1 0 1 1 0 0 +EDGE2 9601 9600 -1.05726 0.0153382 -1.55819 1 0 1 1 0 0 +EDGE2 9602 9583 0.993733 0.0290527 -0.0184445 1 0 1 1 0 0 +EDGE2 9602 9582 -0.0907625 -0.0589091 -0.0166559 1 0 1 1 0 0 +EDGE2 9602 9581 -0.955904 -0.0236729 0.0146136 1 0 1 1 0 0 +EDGE2 9602 9601 -0.958942 -0.0150977 0.0296382 1 0 1 1 0 0 +EDGE2 9603 9602 -0.974349 -0.0084706 -0.00759094 1 0 1 1 0 0 +EDGE2 9603 9584 0.960695 0.0260656 -0.00804419 1 0 1 1 0 0 +EDGE2 9603 9583 -0.00487735 -0.00527895 -0.00667647 1 0 1 1 0 0 +EDGE2 9603 9582 -0.903779 0.00457763 0.00233239 1 0 1 1 0 0 +EDGE2 9604 9565 1.00651 0.0687763 -3.14242 1 0 1 1 0 0 +EDGE2 9604 9585 1.08426 -0.0203212 -0.0272238 1 0 1 1 0 0 +EDGE2 9604 9603 -0.966048 0.0282318 0.0149634 1 0 1 1 0 0 +EDGE2 9604 9584 0.054982 -0.0225578 0.0271481 1 0 1 1 0 0 +EDGE2 9604 9583 -0.946911 -0.0172746 -0.00315706 1 0 1 1 0 0 +EDGE2 9605 9564 1.06263 -0.0245568 -3.11874 1 0 1 1 0 0 +EDGE2 9605 9565 -0.00153072 0.0603577 -3.13118 1 0 1 1 0 0 +EDGE2 9605 9566 -0.0044132 1.05822 1.56253 1 0 1 1 0 0 +EDGE2 9605 9586 -0.0959566 0.950025 1.58687 1 0 1 1 0 0 +EDGE2 9605 9585 -0.0163948 0.0311115 0.00328548 1 0 1 1 0 0 +EDGE2 9605 9584 -1.05845 0.0333079 -0.00244489 1 0 1 1 0 0 +EDGE2 9605 9604 -0.997102 0.0546818 0.0017572 1 0 1 1 0 0 +EDGE2 9606 9565 -0.99258 -0.064081 -1.56836 1 0 1 1 0 0 +EDGE2 9606 9605 -1.01363 0.0236545 1.61497 1 0 1 1 0 0 +EDGE2 9606 9585 -0.956504 0.00549198 1.58977 1 0 1 1 0 0 +EDGE2 9607 9606 -0.92986 0.0460718 -0.0299727 1 0 1 1 0 0 +EDGE2 9608 9607 -0.941236 0.0347078 -0.00829514 1 0 1 1 0 0 +EDGE2 9609 9608 -1.05782 0.0519006 -0.0317287 1 0 1 1 0 0 +EDGE2 9610 9609 -1.0322 0.0122606 0.00618574 1 0 1 1 0 0 +EDGE2 9611 9610 -0.947287 0.00429871 1.56798 1 0 1 1 0 0 +EDGE2 9612 9611 -1.02353 0.00455081 0.01142 1 0 1 1 0 0 +EDGE2 9613 9612 -1.04178 0.15036 -0.00121196 1 0 1 1 0 0 +EDGE2 9614 9613 -1.00974 5.20407e-05 -0.00580084 1 0 1 1 0 0 +EDGE2 9615 9614 -0.945506 0.0754484 0.00587913 1 0 1 1 0 0 +EDGE2 9616 9615 -0.986205 -0.0199771 -1.53047 1 0 1 1 0 0 +EDGE2 9617 9616 -0.965131 0.0466941 0.0240773 1 0 1 1 0 0 +EDGE2 9618 9617 -1.03849 -0.0127324 0.00803076 1 0 1 1 0 0 +EDGE2 9619 9618 -0.9949 -0.0451262 -0.0102603 1 0 1 1 0 0 +EDGE2 9620 9619 -1.00987 -0.020382 0.0239271 1 0 1 1 0 0 +EDGE2 9621 9620 -0.947122 0.0657703 1.56298 1 0 1 1 0 0 +EDGE2 9622 9621 -0.942744 0.0448907 0.000544997 1 0 1 1 0 0 +EDGE2 9623 9622 -0.927215 0.0334108 0.0164026 1 0 1 1 0 0 +EDGE2 9624 9623 -1.05205 0.0551067 -0.0281444 1 0 1 1 0 0 +EDGE2 9625 9624 -0.984607 0.094151 -0.0169452 1 0 1 1 0 0 +EDGE2 9626 9625 -1.07323 -0.033335 -1.57256 1 0 1 1 0 0 +EDGE2 9627 9626 -0.978129 -0.0725307 -0.0104315 1 0 1 1 0 0 +EDGE2 9628 9627 -0.934967 -0.0406465 0.014183 1 0 1 1 0 0 +EDGE2 9629 9628 -0.981936 -0.00464195 -0.00821607 1 0 1 1 0 0 +EDGE2 9630 9629 -0.897684 -0.0202823 0.015486 1 0 1 1 0 0 +EDGE2 9631 9630 -0.926505 -0.0721552 -1.58854 1 0 1 1 0 0 +EDGE2 9632 9631 -0.969751 0.00841623 -0.0327526 1 0 1 1 0 0 +EDGE2 9633 9632 -1.0678 0.0119326 0.0222502 1 0 1 1 0 0 +EDGE2 9634 9633 -1.06295 -0.049137 -0.0203791 1 0 1 1 0 0 +EDGE2 9635 9634 -0.923234 0.144713 0.00693481 1 0 1 1 0 0 +EDGE2 9636 9635 -0.946528 -0.0782795 -1.56468 1 0 1 1 0 0 +EDGE2 9637 9636 -0.897444 0.0577728 0.0218275 1 0 1 1 0 0 +EDGE2 9638 9637 -0.967516 0.00124203 -0.0239003 1 0 1 1 0 0 +EDGE2 9639 9620 1.08338 0.00224448 -3.14416 1 0 1 1 0 0 +EDGE2 9639 9638 -1.02009 0.0519889 0.0164605 1 0 1 1 0 0 +EDGE2 9640 9619 0.96802 0.0628534 -3.16503 1 0 1 1 0 0 +EDGE2 9640 9621 -0.0299433 0.967853 1.58378 1 0 1 1 0 0 +EDGE2 9640 9620 -0.0518416 -0.0417692 -3.10712 1 0 1 1 0 0 +EDGE2 9640 9639 -0.948142 -0.0747447 0.00525345 1 0 1 1 0 0 +EDGE2 9641 9622 0.957254 0.0230496 -0.0251776 1 0 1 1 0 0 +EDGE2 9641 9640 -1.00408 -0.0336204 -1.59827 1 0 1 1 0 0 +EDGE2 9641 9621 -0.0131595 -0.0265335 -0.00812568 1 0 1 1 0 0 +EDGE2 9641 9620 -0.865809 -0.0226848 1.58315 1 0 1 1 0 0 +EDGE2 9642 9622 -0.0319387 0.0499206 -0.0216888 1 0 1 1 0 0 +EDGE2 9642 9621 -1.03463 0.0243724 0.0260971 1 0 1 1 0 0 +EDGE2 9642 9641 -1.01822 0.00856914 -0.0295238 1 0 1 1 0 0 +EDGE2 9642 9623 0.963872 0.0582766 -0.00689077 1 0 1 1 0 0 +EDGE2 9643 9622 -1.11255 -0.082177 0.0297846 1 0 1 1 0 0 +EDGE2 9643 9642 -1.11425 0.021978 0.0415115 1 0 1 1 0 0 +EDGE2 9643 9623 -0.0150676 -0.0898175 -0.0037475 1 0 1 1 0 0 +EDGE2 9643 9624 0.910823 0.0460901 0.00743689 1 0 1 1 0 0 +EDGE2 9644 9625 1.0271 -0.0856758 -0.0140711 1 0 1 1 0 0 +EDGE2 9644 9623 -0.927989 0.040238 0.0123629 1 0 1 1 0 0 +EDGE2 9644 9643 -1.00367 -0.0290828 -0.0115917 1 0 1 1 0 0 +EDGE2 9644 9624 0.0919679 -0.0764552 -0.0259711 1 0 1 1 0 0 +EDGE2 9645 9625 0.0188567 0.0234092 0.0183287 1 0 1 1 0 0 +EDGE2 9645 9644 -0.992319 0.0520032 -0.0158212 1 0 1 1 0 0 +EDGE2 9645 9624 -0.960773 -0.034906 -0.0210487 1 0 1 1 0 0 +EDGE2 9645 9626 -0.0412472 1.05531 1.55065 1 0 1 1 0 0 +EDGE2 9646 9625 -0.993327 0.0703804 -1.55632 1 0 1 1 0 0 +EDGE2 9646 9645 -0.922244 0.0696707 -1.51678 1 0 1 1 0 0 +EDGE2 9646 9626 0.0366468 0.0789393 -0.0196648 1 0 1 1 0 0 +EDGE2 9646 9627 0.973011 -0.00183509 0.00947844 1 0 1 1 0 0 +EDGE2 9647 9626 -0.989507 -0.0328127 -0.0137708 1 0 1 1 0 0 +EDGE2 9647 9646 -1.06032 0.00193711 -0.0340763 1 0 1 1 0 0 +EDGE2 9647 9627 -0.0596223 -0.0312239 0.00386709 1 0 1 1 0 0 +EDGE2 9647 9628 1.06972 -0.0139309 -0.0134814 1 0 1 1 0 0 +EDGE2 9648 9647 -0.981459 -0.0115394 -0.014206 1 0 1 1 0 0 +EDGE2 9648 9627 -0.958843 0.0172804 0.0231227 1 0 1 1 0 0 +EDGE2 9648 9628 0.0496456 -0.0295992 0.000516959 1 0 1 1 0 0 +EDGE2 9648 9629 1.01422 0.0153585 -0.0047789 1 0 1 1 0 0 +EDGE2 9649 9648 -0.918706 0.0871894 0.00732911 1 0 1 1 0 0 +EDGE2 9649 9628 -0.993458 0.0711101 0.00875319 1 0 1 1 0 0 +EDGE2 9649 9629 -0.000143025 -0.0181528 0.0220027 1 0 1 1 0 0 +EDGE2 9649 9630 1.00661 -0.0648196 -0.00797238 1 0 1 1 0 0 +EDGE2 9650 9649 -1.01822 -0.0106491 -0.0121126 1 0 1 1 0 0 +EDGE2 9650 9629 -1.00456 0.0661898 0.031906 1 0 1 1 0 0 +EDGE2 9650 9631 -0.0477326 1.03193 1.61138 1 0 1 1 0 0 +EDGE2 9650 9630 -0.0154158 -0.0339609 0.0058599 1 0 1 1 0 0 +EDGE2 9651 9632 0.933688 -0.0335002 0.0124661 1 0 1 1 0 0 +EDGE2 9651 9650 -0.957121 -0.00519453 -1.57392 1 0 1 1 0 0 +EDGE2 9651 9631 0.00419752 -0.0386742 -0.0187613 1 0 1 1 0 0 +EDGE2 9651 9630 -0.910537 -0.0245093 -1.60282 1 0 1 1 0 0 +EDGE2 9652 9632 -0.0454399 -0.0308446 -0.0190232 1 0 1 1 0 0 +EDGE2 9652 9633 1.0491 -0.0777011 0.00229411 1 0 1 1 0 0 +EDGE2 9652 9631 -0.96016 -0.0607047 -0.0247553 1 0 1 1 0 0 +EDGE2 9652 9651 -0.985513 0.0516343 -0.00414705 1 0 1 1 0 0 +EDGE2 9653 9632 -1.00633 -0.0246808 -0.0015171 1 0 1 1 0 0 +EDGE2 9653 9633 -0.0140007 -0.0877119 -0.0251904 1 0 1 1 0 0 +EDGE2 9653 9634 1.07028 -0.0707643 0.00781384 1 0 1 1 0 0 +EDGE2 9653 9652 -1.00059 -0.0261854 0.000454647 1 0 1 1 0 0 +EDGE2 9654 9635 1.05365 -0.0108915 0.0261451 1 0 1 1 0 0 +EDGE2 9654 9633 -0.972164 0.0168127 0.0322178 1 0 1 1 0 0 +EDGE2 9654 9653 -1.0324 -0.0480749 0.00555786 1 0 1 1 0 0 +EDGE2 9654 9634 0.0615426 -0.0759823 -0.0162456 1 0 1 1 0 0 +EDGE2 9655 9636 -0.0771701 0.983388 1.53697 1 0 1 1 0 0 +EDGE2 9655 9654 -0.935857 0.0259704 -0.0183677 1 0 1 1 0 0 +EDGE2 9655 9635 0.00142356 -0.0117015 -0.012822 1 0 1 1 0 0 +EDGE2 9655 9634 -1.01593 -0.0201071 0.0141379 1 0 1 1 0 0 +EDGE2 9656 9635 -1.02753 0.0779733 1.56982 1 0 1 1 0 0 +EDGE2 9656 9655 -0.943122 -0.0945438 1.58733 1 0 1 1 0 0 +EDGE2 9657 9656 -0.997292 -0.0203732 0.0133963 1 0 1 1 0 0 +EDGE2 9658 9657 -0.887586 -0.00460068 0.0356647 1 0 1 1 0 0 +EDGE2 9659 9658 -0.909274 -0.0253867 0.0276413 1 0 1 1 0 0 +EDGE2 9659 6920 1.01692 0.0805393 -3.11409 1 0 1 1 0 0 +EDGE2 9659 6960 1.08411 -0.0443981 -3.1391 1 0 1 1 0 0 +EDGE2 9660 9659 -1.00376 0.0264553 0.00431404 1 0 1 1 0 0 +EDGE2 9660 6961 -0.00781037 0.944422 1.56979 1 0 1 1 0 0 +EDGE2 9660 6920 -0.0339994 0.0809555 -3.13306 1 0 1 1 0 0 +EDGE2 9660 6960 -0.0252246 0.054361 -3.16491 1 0 1 1 0 0 +EDGE2 9660 6921 -0.0202028 -1.05614 -1.54365 1 0 1 1 0 0 +EDGE2 9660 6959 0.961577 -0.0272987 -3.14276 1 0 1 1 0 0 +EDGE2 9660 6919 0.958347 -0.0393047 -3.16342 1 0 1 1 0 0 +EDGE2 9661 6961 -0.00543329 0.0530431 -0.0180257 1 0 1 1 0 0 +EDGE2 9661 6962 0.923139 0.057994 0.0014812 1 0 1 1 0 0 +EDGE2 9661 6920 -1.0345 0.0663669 1.60395 1 0 1 1 0 0 +EDGE2 9661 6960 -1.02521 -0.00543852 1.57215 1 0 1 1 0 0 +EDGE2 9661 9660 -1.03319 0.122336 -1.5776 1 0 1 1 0 0 +EDGE2 9662 6961 -0.942641 -0.0360867 0.018656 1 0 1 1 0 0 +EDGE2 9662 6963 1.03691 0.0100966 0.0140253 1 0 1 1 0 0 +EDGE2 9662 9661 -0.968096 0.0943724 -0.0141705 1 0 1 1 0 0 +EDGE2 9662 6962 0.00386983 0.0466857 0.0164721 1 0 1 1 0 0 +EDGE2 9663 9662 -1.11344 0.0144694 0.0098383 1 0 1 1 0 0 +EDGE2 9663 6964 0.928414 -0.010898 0.00504056 1 0 1 1 0 0 +EDGE2 9663 6963 0.0973082 -0.0846976 0.0115086 1 0 1 1 0 0 +EDGE2 9663 6962 -0.966876 -0.0209391 -0.0113441 1 0 1 1 0 0 +EDGE2 9664 6885 1.0702 -0.0521852 -3.14421 1 0 1 1 0 0 +EDGE2 9664 6965 1.00823 -0.000686933 0.0335285 1 0 1 1 0 0 +EDGE2 9664 9663 -1.00309 -0.083597 -0.0270664 1 0 1 1 0 0 +EDGE2 9664 6964 0.0614279 0.0918174 -0.0208378 1 0 1 1 0 0 +EDGE2 9664 6963 -1.09088 -0.0250381 -0.00776126 1 0 1 1 0 0 +EDGE2 9665 6886 -0.0486231 -0.971377 -1.55788 1 0 1 1 0 0 +EDGE2 9665 6885 0.0103219 0.0433807 -3.15013 1 0 1 1 0 0 +EDGE2 9665 6884 1.03915 0.0566629 -3.13074 1 0 1 1 0 0 +EDGE2 9665 6965 -0.0284279 0.00408722 -0.0361266 1 0 1 1 0 0 +EDGE2 9665 6964 -0.98781 0.0153952 0.000482925 1 0 1 1 0 0 +EDGE2 9665 9664 -1.00514 -0.0415645 -0.00300975 1 0 1 1 0 0 +EDGE2 9665 6966 -0.0130019 -1.0134 -1.58206 1 0 1 1 0 0 +EDGE2 9666 6886 0.0442387 0.013751 0.00528455 1 0 1 1 0 0 +EDGE2 9666 6885 -0.986658 0.0440929 -1.60451 1 0 1 1 0 0 +EDGE2 9666 9665 -1.02025 0.0172865 1.52928 1 0 1 1 0 0 +EDGE2 9666 6965 -0.950749 -0.0457151 1.53359 1 0 1 1 0 0 +EDGE2 9666 6966 0.0370703 -0.012995 -0.00257961 1 0 1 1 0 0 +EDGE2 9666 6887 0.911782 -0.0690101 0.00552117 1 0 1 1 0 0 +EDGE2 9666 6967 0.941668 -0.0324641 0.0210939 1 0 1 1 0 0 +EDGE2 9667 6886 -1.04527 0.00975703 0.0175298 1 0 1 1 0 0 +EDGE2 9667 9666 -0.986291 -0.0961155 0.00204036 1 0 1 1 0 0 +EDGE2 9667 6966 -0.971151 0.0626421 0.000570604 1 0 1 1 0 0 +EDGE2 9667 6968 1.03299 -0.0317158 -0.0264831 1 0 1 1 0 0 +EDGE2 9667 6887 -0.0269065 -0.00333562 0.00365116 1 0 1 1 0 0 +EDGE2 9667 6967 0.0773187 0.0110641 -0.0035433 1 0 1 1 0 0 +EDGE2 9667 6888 1.03978 0.00555876 -0.0190789 1 0 1 1 0 0 +EDGE2 9668 6968 0.0124214 -0.0753491 0.0161124 1 0 1 1 0 0 +EDGE2 9668 6887 -1.01465 0.0983727 -0.00117597 1 0 1 1 0 0 +EDGE2 9668 6967 -1.00917 0.0187797 -0.00327218 1 0 1 1 0 0 +EDGE2 9668 9667 -1.03319 -0.00158799 0.00407742 1 0 1 1 0 0 +EDGE2 9668 6969 1.14469 -0.00555493 -0.00983492 1 0 1 1 0 0 +EDGE2 9668 6888 -0.117985 -0.0359627 0.00460605 1 0 1 1 0 0 +EDGE2 9668 6889 0.980427 -0.0481416 0.0366084 1 0 1 1 0 0 +EDGE2 9669 6968 -1.00868 0.0164786 0.0103562 1 0 1 1 0 0 +EDGE2 9669 9668 -0.933749 -0.0267314 0.0300385 1 0 1 1 0 0 +EDGE2 9669 6969 -0.0180287 0.000633091 0.0087085 1 0 1 1 0 0 +EDGE2 9669 6888 -0.960366 0.0583028 0.0440989 1 0 1 1 0 0 +EDGE2 9669 6889 0.0450359 -0.0923425 0.0508414 1 0 1 1 0 0 +EDGE2 9669 6970 1.02745 -0.0014464 -0.0443781 1 0 1 1 0 0 +EDGE2 9669 6870 1.03276 -0.0198821 -3.14024 1 0 1 1 0 0 +EDGE2 9669 6890 1.11369 -0.0367116 0.00476693 1 0 1 1 0 0 +EDGE2 9669 6910 1.04754 0.000934688 -3.13433 1 0 1 1 0 0 +EDGE2 9670 6969 -1.05992 -0.0666555 0.0130666 1 0 1 1 0 0 +EDGE2 9670 9669 -1.0024 0.0750548 -0.00835581 1 0 1 1 0 0 +EDGE2 9670 6889 -1.03221 -0.104222 0.000705471 1 0 1 1 0 0 +EDGE2 9670 6911 -0.0207991 -1.02296 -1.5962 1 0 1 1 0 0 +EDGE2 9670 6970 0.0247789 0.030605 -0.00563452 1 0 1 1 0 0 +EDGE2 9670 6871 -0.00732226 0.968602 1.57927 1 0 1 1 0 0 +EDGE2 9670 6971 -0.0556864 0.98665 1.58378 1 0 1 1 0 0 +EDGE2 9670 6870 0.0611365 -0.0544346 -3.13563 1 0 1 1 0 0 +EDGE2 9670 6890 0.135832 0.0215969 0.0199389 1 0 1 1 0 0 +EDGE2 9670 6910 -0.0118654 -0.00417085 -3.13709 1 0 1 1 0 0 +EDGE2 9670 6891 0.0654724 -0.896133 -1.55624 1 0 1 1 0 0 +EDGE2 9670 6909 0.950125 -0.0149796 -3.15058 1 0 1 1 0 0 +EDGE2 9670 6869 0.994176 0.00989956 -3.17619 1 0 1 1 0 0 +EDGE2 9671 6911 0.00949111 0.0282596 0.00183434 1 0 1 1 0 0 +EDGE2 9671 6970 -1.07061 0.0217027 1.5591 1 0 1 1 0 0 +EDGE2 9671 9670 -1.02694 0.0041184 1.49651 1 0 1 1 0 0 +EDGE2 9671 6870 -1.09107 -0.0445316 -1.55978 1 0 1 1 0 0 +EDGE2 9671 6890 -0.98414 0.0581308 1.57641 1 0 1 1 0 0 +EDGE2 9671 6910 -1.008 0.107086 -1.60456 1 0 1 1 0 0 +EDGE2 9671 6892 0.969422 -0.0229329 0.030882 1 0 1 1 0 0 +EDGE2 9671 6891 0.021344 0.0712452 -0.0352873 1 0 1 1 0 0 +EDGE2 9671 6912 0.884107 -0.0279412 -0.0152289 1 0 1 1 0 0 +EDGE2 9672 6911 -0.948998 0.128417 -0.0111643 1 0 1 1 0 0 +EDGE2 9672 9671 -1.05284 0.00584852 -0.0151954 1 0 1 1 0 0 +EDGE2 9672 6892 0.0376335 0.0460093 -0.000578952 1 0 1 1 0 0 +EDGE2 9672 6891 -0.9941 0.00852788 -0.0234643 1 0 1 1 0 0 +EDGE2 9672 6912 -0.178435 0.0701509 -0.0266687 1 0 1 1 0 0 +EDGE2 9672 6913 0.988279 0.0436691 0.00113465 1 0 1 1 0 0 +EDGE2 9672 6893 1.02503 0.0800666 0.0126329 1 0 1 1 0 0 +EDGE2 9673 6892 -1.04206 0.000461945 0.0127471 1 0 1 1 0 0 +EDGE2 9673 9672 -0.995104 -0.0463265 -0.0201036 1 0 1 1 0 0 +EDGE2 9673 6912 -1.01526 -0.0791669 0.0121304 1 0 1 1 0 0 +EDGE2 9673 6913 0.0428721 0.0319249 0.0292958 1 0 1 1 0 0 +EDGE2 9673 6893 -0.0108404 0.00863395 -0.0175922 1 0 1 1 0 0 +EDGE2 9673 6894 0.996275 -0.00982713 0.000574072 1 0 1 1 0 0 +EDGE2 9673 6914 1.01533 -0.0224198 -0.0128394 1 0 1 1 0 0 +EDGE2 9674 6913 -1.01503 0.0197722 0.0198587 1 0 1 1 0 0 +EDGE2 9674 9673 -1.00472 0.00562849 0.00684747 1 0 1 1 0 0 +EDGE2 9674 6893 -0.977782 -0.120579 0.0122462 1 0 1 1 0 0 +EDGE2 9674 6894 -0.0319715 0.025942 0.00493993 1 0 1 1 0 0 +EDGE2 9674 6914 0.0415643 0.0408083 0.0196547 1 0 1 1 0 0 +EDGE2 9674 6915 1.01366 -0.00664997 0.000672015 1 0 1 1 0 0 +EDGE2 9674 6955 1.02716 -0.0321791 -3.12747 1 0 1 1 0 0 +EDGE2 9674 6895 0.985168 -0.0050664 -0.0186271 1 0 1 1 0 0 +EDGE2 9675 9674 -0.968492 -0.0322674 0.00738311 1 0 1 1 0 0 +EDGE2 9675 6916 -0.00238323 -0.950277 -1.57388 1 0 1 1 0 0 +EDGE2 9675 6956 -0.00241 -0.972663 -1.60082 1 0 1 1 0 0 +EDGE2 9675 6894 -0.886215 0.0167084 0.00325622 1 0 1 1 0 0 +EDGE2 9675 6914 -0.952413 -0.0272493 0.00669676 1 0 1 1 0 0 +EDGE2 9675 6954 0.988535 -0.0145198 -3.14432 1 0 1 1 0 0 +EDGE2 9675 6915 0.0514903 0.00554236 -0.0146578 1 0 1 1 0 0 +EDGE2 9675 6955 -0.0329979 0.0641896 -3.12012 1 0 1 1 0 0 +EDGE2 9675 6895 0.0126852 -0.0196003 0.011111 1 0 1 1 0 0 +EDGE2 9675 6896 -0.0370328 0.95553 1.58411 1 0 1 1 0 0 +EDGE2 9676 6915 -0.970494 -0.0339827 -1.57773 1 0 1 1 0 0 +EDGE2 9676 6955 -0.957052 0.121131 1.53522 1 0 1 1 0 0 +EDGE2 9676 9675 -0.95906 0.0282067 -1.6007 1 0 1 1 0 0 +EDGE2 9676 6895 -0.926235 0.009251 -1.60111 1 0 1 1 0 0 +EDGE2 9676 6896 -0.0218251 -5.00943e-05 -0.0144028 1 0 1 1 0 0 +EDGE2 9676 6897 1.05756 0.0226593 0.00538563 1 0 1 1 0 0 +EDGE2 9677 9676 -1.04566 -0.00330774 -0.030498 1 0 1 1 0 0 +EDGE2 9677 6896 -0.927055 0.0279709 -0.0273504 1 0 1 1 0 0 +EDGE2 9677 6898 1.03942 0.122279 0.00703239 1 0 1 1 0 0 +EDGE2 9677 6897 -0.045547 0.0861971 -0.0248157 1 0 1 1 0 0 +EDGE2 9678 9677 -0.977034 -0.0703419 0.0347308 1 0 1 1 0 0 +EDGE2 9678 6899 1.08859 0.0381305 0.0232168 1 0 1 1 0 0 +EDGE2 9678 6898 -0.12072 0.0313818 0.00357757 1 0 1 1 0 0 +EDGE2 9678 6897 -1.04922 -0.0337506 -0.0139764 1 0 1 1 0 0 +EDGE2 9679 6899 0.0141488 0.0389677 -0.0328073 1 0 1 1 0 0 +EDGE2 9679 6898 -0.956476 -0.00459891 0.00617237 1 0 1 1 0 0 +EDGE2 9679 9678 -1.02516 0.0474479 -0.0327533 1 0 1 1 0 0 +EDGE2 9679 6900 1.05124 -0.01826 -0.0195483 1 0 1 1 0 0 +EDGE2 9680 6901 -0.0516988 1.02599 1.57444 1 0 1 1 0 0 +EDGE2 9680 6899 -1.01861 -0.0547803 -0.0384251 1 0 1 1 0 0 +EDGE2 9680 9679 -0.917152 0.0371307 0.017033 1 0 1 1 0 0 +EDGE2 9680 6900 -0.0239054 0.0270626 -0.0181186 1 0 1 1 0 0 +EDGE2 9681 6900 -1.00515 0.0631677 1.58112 1 0 1 1 0 0 +EDGE2 9681 9680 -1.04596 0.0254818 1.5691 1 0 1 1 0 0 +EDGE2 9682 9681 -1.01461 -0.0382967 0.0504409 1 0 1 1 0 0 +EDGE2 9683 9682 -1.00522 0.0149775 -0.00701256 1 0 1 1 0 0 +EDGE2 9684 9683 -1.06788 0.0894077 0.00540647 1 0 1 1 0 0 +EDGE2 9684 6945 1.03806 0.00911893 -3.14255 1 0 1 1 0 0 +EDGE2 9685 6946 0.024484 -0.974571 -1.57545 1 0 1 1 0 0 +EDGE2 9685 9684 -1.04529 0.00365043 -0.027952 1 0 1 1 0 0 +EDGE2 9685 6944 1.01675 -0.00775411 -3.16855 1 0 1 1 0 0 +EDGE2 9685 6945 0.0887321 -0.039195 -3.14542 1 0 1 1 0 0 +EDGE2 9686 9685 -1.01227 -0.0530474 -1.54613 1 0 1 1 0 0 +EDGE2 9686 6945 -0.93348 0.0494527 1.54561 1 0 1 1 0 0 +EDGE2 9687 9686 -0.963455 0.0583714 -0.0278065 1 0 1 1 0 0 +EDGE2 9688 9687 -1.06113 0.0551821 0.0123886 1 0 1 1 0 0 +EDGE2 9689 9688 -1.04336 -0.0709397 -0.0135231 1 0 1 1 0 0 +EDGE2 9690 9689 -1.04372 0.0782506 0.0191278 1 0 1 1 0 0 +EDGE2 9691 9690 -1.00516 -0.102226 -1.54782 1 0 1 1 0 0 +EDGE2 9692 9691 -1.00067 0.00156445 0.0155644 1 0 1 1 0 0 +EDGE2 9693 9692 -1.10265 -0.0469672 0.00393391 1 0 1 1 0 0 +EDGE2 9694 9693 -1.10619 -0.0415418 -0.00481755 1 0 1 1 0 0 +EDGE2 9695 9694 -0.93866 0.047409 -0.00905106 1 0 1 1 0 0 +EDGE2 9696 9695 -0.994797 0.0171127 -1.56176 1 0 1 1 0 0 +EDGE2 9697 9696 -1.06921 -0.0258736 0.00592936 1 0 1 1 0 0 +EDGE2 9698 9697 -0.990936 -0.0413424 -0.017086 1 0 1 1 0 0 +EDGE2 9699 9698 -1.00248 0.14444 0.00296661 1 0 1 1 0 0 +EDGE2 9699 6900 0.887093 0.0314966 -3.16009 1 0 1 1 0 0 +EDGE2 9699 9680 1.03998 0.0364737 -3.11166 1 0 1 1 0 0 +EDGE2 9700 6901 0.0665124 -0.993632 -1.55655 1 0 1 1 0 0 +EDGE2 9700 9681 0.0690649 0.897467 1.54572 1 0 1 1 0 0 +EDGE2 9700 6899 1.10721 -0.0745221 -3.1458 1 0 1 1 0 0 +EDGE2 9700 9679 0.909089 0.0996457 -3.13661 1 0 1 1 0 0 +EDGE2 9700 6900 -0.0235354 -0.000229771 -3.1668 1 0 1 1 0 0 +EDGE2 9700 9680 -0.101699 0.0159218 -3.07875 1 0 1 1 0 0 +EDGE2 9700 9699 -0.948554 -0.00743952 0.00973212 1 0 1 1 0 0 +EDGE2 9701 9681 -0.0241671 -0.0473601 -0.0257632 1 0 1 1 0 0 +EDGE2 9701 6900 -1.01529 0.0799085 1.56325 1 0 1 1 0 0 +EDGE2 9701 9680 -0.915379 0.0205641 1.54855 1 0 1 1 0 0 +EDGE2 9701 9700 -1.12024 -0.00789404 -1.5689 1 0 1 1 0 0 +EDGE2 9701 9682 0.945341 -0.0101374 -0.00421112 1 0 1 1 0 0 +EDGE2 9702 9681 -0.986777 -0.0673839 -0.0230785 1 0 1 1 0 0 +EDGE2 9702 9701 -0.935031 -0.0575666 -0.0196817 1 0 1 1 0 0 +EDGE2 9702 9682 0.0150387 -0.0634256 0.027616 1 0 1 1 0 0 +EDGE2 9702 9683 0.979993 0.0622434 0.0350804 1 0 1 1 0 0 +EDGE2 9703 9702 -1.06056 0.0266817 0.00316067 1 0 1 1 0 0 +EDGE2 9703 9682 -0.935385 -0.0887594 -0.00976046 1 0 1 1 0 0 +EDGE2 9703 9684 0.973899 -0.0139117 -0.00633298 1 0 1 1 0 0 +EDGE2 9703 9683 -0.0100993 -0.0479795 0.010708 1 0 1 1 0 0 +EDGE2 9704 9703 -1.0386 -0.0604474 -0.0416065 1 0 1 1 0 0 +EDGE2 9704 9685 1.01401 -0.00603466 0.0168109 1 0 1 1 0 0 +EDGE2 9704 9684 -0.0012462 0.0620257 0.00684218 1 0 1 1 0 0 +EDGE2 9704 9683 -0.969534 -0.000171229 0.00946813 1 0 1 1 0 0 +EDGE2 9704 6945 0.974306 -0.0107281 -3.16312 1 0 1 1 0 0 +EDGE2 9705 6946 0.0732975 -1.00458 -1.57291 1 0 1 1 0 0 +EDGE2 9705 9685 0.00997063 -0.0232639 0.00893776 1 0 1 1 0 0 +EDGE2 9705 9684 -0.954162 0.0404906 -0.0260902 1 0 1 1 0 0 +EDGE2 9705 9704 -0.996001 0.0585609 0.0359207 1 0 1 1 0 0 +EDGE2 9705 6944 0.939658 -0.104821 -3.14868 1 0 1 1 0 0 +EDGE2 9705 6945 0.0417503 -0.00836891 -3.1315 1 0 1 1 0 0 +EDGE2 9705 9686 0.0269281 1.00385 1.5798 1 0 1 1 0 0 +EDGE2 9706 9685 -0.956692 0.0160684 -1.57667 1 0 1 1 0 0 +EDGE2 9706 9705 -1.0634 -0.00882842 -1.60473 1 0 1 1 0 0 +EDGE2 9706 6945 -0.970221 0.0315328 1.61127 1 0 1 1 0 0 +EDGE2 9706 9686 0.00813946 0.0399953 -0.0177965 1 0 1 1 0 0 +EDGE2 9706 9687 0.963373 -0.0414102 0.0376658 1 0 1 1 0 0 +EDGE2 9707 9706 -0.963596 -0.0125015 0.0205699 1 0 1 1 0 0 +EDGE2 9707 9686 -0.95092 0.0393229 -0.0280644 1 0 1 1 0 0 +EDGE2 9707 9688 1.04374 -0.0255007 -0.00295815 1 0 1 1 0 0 +EDGE2 9707 9687 0.00197323 -0.00368325 0.00356604 1 0 1 1 0 0 +EDGE2 9708 9689 0.938457 0.00120131 0.0217676 1 0 1 1 0 0 +EDGE2 9708 9688 -0.0583407 0.078284 0.00540772 1 0 1 1 0 0 +EDGE2 9708 9687 -0.920898 -0.0330768 -0.00436114 1 0 1 1 0 0 +EDGE2 9708 9707 -1.00182 -0.0798691 -0.00173137 1 0 1 1 0 0 +EDGE2 9709 9689 0.0658055 0.028843 0.0170392 1 0 1 1 0 0 +EDGE2 9709 9688 -0.920845 0.0231952 -0.040017 1 0 1 1 0 0 +EDGE2 9709 9708 -0.981579 -0.0344716 -0.0155679 1 0 1 1 0 0 +EDGE2 9709 9690 1.02615 -0.00944187 -0.00523561 1 0 1 1 0 0 +EDGE2 9710 9689 -1.00494 0.0190124 -0.0275989 1 0 1 1 0 0 +EDGE2 9710 9709 -0.991986 -0.0115013 -0.0108254 1 0 1 1 0 0 +EDGE2 9710 9691 -0.0121808 0.990459 1.56512 1 0 1 1 0 0 +EDGE2 9710 9690 -0.0529379 0.0292739 0.0269688 1 0 1 1 0 0 +EDGE2 9711 9691 0.0080781 -0.0109901 -0.0156961 1 0 1 1 0 0 +EDGE2 9711 9692 0.956653 -0.00605939 -0.00250142 1 0 1 1 0 0 +EDGE2 9711 9690 -1.02162 -0.155504 -1.56949 1 0 1 1 0 0 +EDGE2 9711 9710 -0.985856 0.0291062 -1.54893 1 0 1 1 0 0 +EDGE2 9712 9691 -0.962185 -0.0116274 -0.0129936 1 0 1 1 0 0 +EDGE2 9712 9692 0.0171473 0.0113677 0.0157868 1 0 1 1 0 0 +EDGE2 9712 9693 0.94472 -0.0429259 -0.0127599 1 0 1 1 0 0 +EDGE2 9712 9711 -0.948243 0.108304 -0.0253803 1 0 1 1 0 0 +EDGE2 9713 9694 0.96843 0.0251532 0.0330737 1 0 1 1 0 0 +EDGE2 9713 9692 -0.968793 0.0532946 0.0166913 1 0 1 1 0 0 +EDGE2 9713 9712 -0.953279 -0.0158335 0.0109088 1 0 1 1 0 0 +EDGE2 9713 9693 0.0438845 -0.00762347 0.0150854 1 0 1 1 0 0 +EDGE2 9714 9713 -0.952205 -0.0142417 -0.021208 1 0 1 1 0 0 +EDGE2 9714 9695 1.05512 -0.0235363 -0.00862123 1 0 1 1 0 0 +EDGE2 9714 9694 0.0572905 0.0301335 0.0153276 1 0 1 1 0 0 +EDGE2 9714 9693 -0.954204 -0.012263 0.00167414 1 0 1 1 0 0 +EDGE2 9715 9696 -0.0394712 0.98006 1.59877 1 0 1 1 0 0 +EDGE2 9715 9714 -1.03268 0.0624502 0.00291793 1 0 1 1 0 0 +EDGE2 9715 9695 0.00511879 0.0223719 -0.0148207 1 0 1 1 0 0 +EDGE2 9715 9694 -1.02052 0.104067 0.0163971 1 0 1 1 0 0 +EDGE2 9716 9695 -0.987104 0.046527 1.53637 1 0 1 1 0 0 +EDGE2 9716 9715 -0.962144 -0.0166938 1.56066 1 0 1 1 0 0 +EDGE2 9717 9716 -0.976384 -0.00342716 0.0388271 1 0 1 1 0 0 +EDGE2 9718 9717 -0.949329 0.00547067 -0.00117349 1 0 1 1 0 0 +EDGE2 9719 9718 -0.933263 0.0252784 -0.0015771 1 0 1 1 0 0 +EDGE2 9720 9719 -1.02738 0.000626441 0.0242031 1 0 1 1 0 0 +EDGE2 9721 9720 -1.11246 -0.0160086 1.59491 1 0 1 1 0 0 +EDGE2 9722 9721 -0.902921 0.0207144 -0.0369672 1 0 1 1 0 0 +EDGE2 9723 9722 -1.04914 0.0261604 0.0128276 1 0 1 1 0 0 +EDGE2 9724 9723 -0.971008 -0.152551 -0.0447193 1 0 1 1 0 0 +EDGE2 9725 9724 -0.96068 -0.00121733 0.0152773 1 0 1 1 0 0 +EDGE2 9726 9725 -1.01961 0.039073 -1.59703 1 0 1 1 0 0 +EDGE2 9727 9726 -1.00153 0.0861191 -0.0311484 1 0 1 1 0 0 +EDGE2 9728 9727 -1.00688 0.0499436 -0.00671943 1 0 1 1 0 0 +EDGE2 9729 9728 -0.976855 -0.0604087 -0.0121911 1 0 1 1 0 0 +EDGE2 9730 9729 -0.999778 -0.00341929 0.012421 1 0 1 1 0 0 +EDGE2 9731 9730 -1.02076 -0.00963213 1.59086 1 0 1 1 0 0 +EDGE2 9732 9731 -0.963392 -0.0053152 0.0120467 1 0 1 1 0 0 +EDGE2 9733 9732 -1.00713 -0.0996321 0.0306686 1 0 1 1 0 0 +EDGE2 9734 9733 -0.998987 0.0169628 -0.0207731 1 0 1 1 0 0 +EDGE2 9735 9734 -0.949074 -0.0170188 0.00817566 1 0 1 1 0 0 +EDGE2 9736 9735 -0.98946 -0.0326615 1.58363 1 0 1 1 0 0 +EDGE2 9737 9736 -1.03383 0.0707751 0.0282309 1 0 1 1 0 0 +EDGE2 9738 9737 -0.964653 -0.000589311 -0.000780995 1 0 1 1 0 0 +EDGE2 9739 9738 -0.97862 -0.0373247 0.00523048 1 0 1 1 0 0 +EDGE2 9740 9739 -1.05344 -0.0685218 0.0122719 1 0 1 1 0 0 +EDGE2 9741 9740 -1.02389 -0.0749749 -1.55189 1 0 1 1 0 0 +EDGE2 9742 9741 -0.981613 0.017715 0.0107854 1 0 1 1 0 0 +EDGE2 9743 9742 -0.991814 0.0822432 -0.02949 1 0 1 1 0 0 +EDGE2 9744 9743 -0.94404 0.0218038 -0.0115266 1 0 1 1 0 0 +EDGE2 9745 9744 -1.06739 0.0466253 -0.00530824 1 0 1 1 0 0 +EDGE2 9746 9745 -1.01673 -0.0385262 1.58354 1 0 1 1 0 0 +EDGE2 9747 9746 -0.984451 0.0741403 0.0360215 1 0 1 1 0 0 +EDGE2 9748 9747 -1.01708 0.0374045 0.0164092 1 0 1 1 0 0 +EDGE2 9749 9748 -0.977405 -0.0433328 0.0207109 1 0 1 1 0 0 +EDGE2 9750 9749 -1.08007 0.0165033 -0.0172257 1 0 1 1 0 0 +EDGE2 9751 9750 -0.997787 0.125474 -1.58866 1 0 1 1 0 0 +EDGE2 9752 9751 -0.946014 -0.0708097 0.0262674 1 0 1 1 0 0 +EDGE2 9753 9752 -1.01231 0.00988153 0.0203969 1 0 1 1 0 0 +EDGE2 9754 9753 -1.05742 -0.0428385 0.00618384 1 0 1 1 0 0 +EDGE2 9755 9754 -0.997979 0.0207428 -0.0159749 1 0 1 1 0 0 +EDGE2 9756 9755 -0.95113 0.0189141 -1.56561 1 0 1 1 0 0 +EDGE2 9757 9756 -1.11082 -0.0327406 -0.00423097 1 0 1 1 0 0 +EDGE2 9758 9757 -1.05047 -0.0997403 4.43677e-05 1 0 1 1 0 0 +EDGE2 9759 9758 -0.989205 0.0148644 -0.0126148 1 0 1 1 0 0 +EDGE2 9760 9759 -0.985623 0.0611126 0.0130596 1 0 1 1 0 0 +EDGE2 9761 9760 -0.947579 -0.0798487 1.57752 1 0 1 1 0 0 +EDGE2 9762 9761 -1.04947 0.0271738 -0.00240764 1 0 1 1 0 0 +EDGE2 9763 9762 -1.01974 0.014757 0.00160575 1 0 1 1 0 0 +EDGE2 9764 9763 -1.07168 -0.0978087 -0.0312413 1 0 1 1 0 0 +EDGE2 9765 9764 -1.03007 0.0294362 0.00729851 1 0 1 1 0 0 +EDGE2 9766 9765 -0.981836 -0.02015 -1.54357 1 0 1 1 0 0 +EDGE2 9767 9766 -0.990428 -0.0619338 -0.00662998 1 0 1 1 0 0 +EDGE2 9768 9767 -0.921928 -0.0786884 -0.0396524 1 0 1 1 0 0 +EDGE2 9769 9768 -0.961322 0.0101242 -0.00486293 1 0 1 1 0 0 +EDGE2 9770 9769 -0.981565 0.0372355 0.0199254 1 0 1 1 0 0 +EDGE2 9771 9770 -1.00251 -0.0179132 -1.564 1 0 1 1 0 0 +EDGE2 9772 9771 -0.977792 0.0314278 0.015842 1 0 1 1 0 0 +EDGE2 9773 9772 -1.00642 -0.0497607 0.00659428 1 0 1 1 0 0 +EDGE2 9774 9773 -1.00329 -0.0140996 -0.0240546 1 0 1 1 0 0 +EDGE2 9775 9774 -1.01903 -0.0147717 -0.00444596 1 0 1 1 0 0 +EDGE2 9776 9775 -0.998733 0.0628555 -1.58821 1 0 1 1 0 0 +EDGE2 9777 9776 -0.915497 -0.010986 -0.0213377 1 0 1 1 0 0 +EDGE2 9778 9777 -1.07036 0.0170635 0.0018831 1 0 1 1 0 0 +EDGE2 9779 9760 0.972898 -0.0284652 -3.13272 1 0 1 1 0 0 +EDGE2 9779 9778 -1.01518 -0.0383992 -0.0206792 1 0 1 1 0 0 +EDGE2 9780 9759 0.975326 0.025063 -3.17044 1 0 1 1 0 0 +EDGE2 9780 9760 0.0166096 0.0337804 -3.17043 1 0 1 1 0 0 +EDGE2 9780 9761 0.00411825 1.02261 1.58311 1 0 1 1 0 0 +EDGE2 9780 9779 -0.944596 0.015967 -0.0170423 1 0 1 1 0 0 +EDGE2 9781 9780 -1.0099 0.0629952 -1.55185 1 0 1 1 0 0 +EDGE2 9781 9760 -1.06096 -0.0913009 1.58217 1 0 1 1 0 0 +EDGE2 9781 9761 -0.0526655 -0.0833957 0.0248437 1 0 1 1 0 0 +EDGE2 9781 9762 1.03637 0.00815856 -0.0104301 1 0 1 1 0 0 +EDGE2 9782 9761 -1.01026 0.00719858 -0.0332081 1 0 1 1 0 0 +EDGE2 9782 9781 -0.942884 -0.0104422 -0.034388 1 0 1 1 0 0 +EDGE2 9782 9762 -0.0471806 -0.000532857 0.00668809 1 0 1 1 0 0 +EDGE2 9782 9763 1.02346 0.0101044 0.00622775 1 0 1 1 0 0 +EDGE2 9783 9762 -1.00073 0.0449269 -0.0313836 1 0 1 1 0 0 +EDGE2 9783 9782 -1.01628 0.0334474 0.00825568 1 0 1 1 0 0 +EDGE2 9783 9764 1.017 0.0061581 0.0165791 1 0 1 1 0 0 +EDGE2 9783 9763 -0.00205851 0.00442921 -0.0220589 1 0 1 1 0 0 +EDGE2 9784 9783 -0.932793 0.0124173 -0.0185254 1 0 1 1 0 0 +EDGE2 9784 9764 -0.0311073 0.0574839 -0.0011461 1 0 1 1 0 0 +EDGE2 9784 9763 -1.03055 -0.0107672 0.0607044 1 0 1 1 0 0 +EDGE2 9784 9765 1.01511 0.00841994 -0.0417304 1 0 1 1 0 0 +EDGE2 9785 9764 -0.95883 -0.0609154 -0.0130739 1 0 1 1 0 0 +EDGE2 9785 9784 -0.933982 0.0249508 -0.0267391 1 0 1 1 0 0 +EDGE2 9785 9765 -0.0611314 0.0394072 0.0135897 1 0 1 1 0 0 +EDGE2 9785 9766 -0.0738463 0.942866 1.59016 1 0 1 1 0 0 +EDGE2 9786 9785 -0.945784 0.0140417 -1.5479 1 0 1 1 0 0 +EDGE2 9786 9765 -1.01319 -0.0266225 -1.54607 1 0 1 1 0 0 +EDGE2 9786 9766 0.0332547 -0.0156254 0.0136563 1 0 1 1 0 0 +EDGE2 9786 9767 1.02934 -0.00823952 -0.0267791 1 0 1 1 0 0 +EDGE2 9787 9786 -0.986345 0.0554362 0.00380214 1 0 1 1 0 0 +EDGE2 9787 9766 -1.03037 0.00318607 0.0132064 1 0 1 1 0 0 +EDGE2 9787 9767 0.0154197 0.00909423 0.00616149 1 0 1 1 0 0 +EDGE2 9787 9768 0.957026 -0.00493789 -0.0299656 1 0 1 1 0 0 +EDGE2 9788 9767 -0.981365 -0.00165194 0.0128572 1 0 1 1 0 0 +EDGE2 9788 9787 -1.06054 0.0061293 -0.0211249 1 0 1 1 0 0 +EDGE2 9788 9768 -0.0113843 -0.0718794 -0.018773 1 0 1 1 0 0 +EDGE2 9788 9769 1.00082 -0.0357159 -0.00809821 1 0 1 1 0 0 +EDGE2 9789 9788 -1.00365 -0.0266891 0.0103859 1 0 1 1 0 0 +EDGE2 9789 9768 -1.03006 0.0118962 -0.017986 1 0 1 1 0 0 +EDGE2 9789 9769 0.00916577 -0.0277748 0.0212635 1 0 1 1 0 0 +EDGE2 9789 9770 0.954168 -0.00631154 0.0041154 1 0 1 1 0 0 +EDGE2 9790 9789 -0.965889 0.00137315 0.016173 1 0 1 1 0 0 +EDGE2 9790 9769 -0.979173 0.0182795 -0.035072 1 0 1 1 0 0 +EDGE2 9790 9770 0.0344314 0.0127218 -0.0242143 1 0 1 1 0 0 +EDGE2 9790 9771 0.101046 1.0264 1.56851 1 0 1 1 0 0 +EDGE2 9791 9770 -0.918995 0.0985762 -1.59185 1 0 1 1 0 0 +EDGE2 9791 9772 1.04608 -0.0279507 0.00619176 1 0 1 1 0 0 +EDGE2 9791 9771 -0.0638466 -0.00514563 -0.00699337 1 0 1 1 0 0 +EDGE2 9791 9790 -1.00008 -0.00963903 -1.60623 1 0 1 1 0 0 +EDGE2 9792 9773 0.928656 0.00332731 0.0234706 1 0 1 1 0 0 +EDGE2 9792 9791 -0.969232 -0.0260561 0.00341014 1 0 1 1 0 0 +EDGE2 9792 9772 0.0058909 0.0916531 0.02581 1 0 1 1 0 0 +EDGE2 9792 9771 -1.03399 -0.0151921 0.00611572 1 0 1 1 0 0 +EDGE2 9793 9773 0.035321 0.00692519 -0.00493355 1 0 1 1 0 0 +EDGE2 9793 9774 0.971863 0.0138493 0.00111096 1 0 1 1 0 0 +EDGE2 9793 9772 -1.1081 0.00878129 0.0295983 1 0 1 1 0 0 +EDGE2 9793 9792 -0.885836 0.00659666 -0.0337683 1 0 1 1 0 0 +EDGE2 9794 9773 -1.06901 0.0477868 0.0218249 1 0 1 1 0 0 +EDGE2 9794 9775 1.04537 -0.0648785 -0.0171367 1 0 1 1 0 0 +EDGE2 9794 9774 -0.0681944 0.0897577 -0.0123938 1 0 1 1 0 0 +EDGE2 9794 9793 -0.911965 0.032294 -0.00509226 1 0 1 1 0 0 +EDGE2 9795 9776 0.006063 0.979722 1.56114 1 0 1 1 0 0 +EDGE2 9795 9775 0.0163228 -0.111709 -0.0205953 1 0 1 1 0 0 +EDGE2 9795 9774 -1.04307 -0.00685773 0.0220648 1 0 1 1 0 0 +EDGE2 9795 9794 -1.04851 0.021935 0.03105 1 0 1 1 0 0 +EDGE2 9796 9777 0.960943 -0.0592857 0.0210799 1 0 1 1 0 0 +EDGE2 9796 9776 -0.0312587 -0.051137 0.0169172 1 0 1 1 0 0 +EDGE2 9796 9795 -1.00541 0.00242025 -1.58125 1 0 1 1 0 0 +EDGE2 9796 9775 -1.001 0.0669441 -1.55818 1 0 1 1 0 0 +EDGE2 9797 9778 1.00322 -0.0166961 0.0126523 1 0 1 1 0 0 +EDGE2 9797 9777 -0.0336469 -0.0419838 0.0124278 1 0 1 1 0 0 +EDGE2 9797 9796 -1.0399 -0.0111713 -0.00609542 1 0 1 1 0 0 +EDGE2 9797 9776 -0.987241 -0.044317 0.00531011 1 0 1 1 0 0 +EDGE2 9798 9779 0.87473 -0.0163961 -0.0351547 1 0 1 1 0 0 +EDGE2 9798 9778 -0.0401018 0.00668124 -0.00691299 1 0 1 1 0 0 +EDGE2 9798 9797 -1.02074 -0.0399008 -0.0466899 1 0 1 1 0 0 +EDGE2 9798 9777 -1.03672 -0.00331941 0.0178673 1 0 1 1 0 0 +EDGE2 9799 9780 1.01008 -0.0409712 -0.0149098 1 0 1 1 0 0 +EDGE2 9799 9760 0.893149 -0.0658065 -3.14656 1 0 1 1 0 0 +EDGE2 9799 9779 -0.0445407 0.0757157 0.0186354 1 0 1 1 0 0 +EDGE2 9799 9798 -0.951437 -0.0425105 -0.0115243 1 0 1 1 0 0 +EDGE2 9799 9778 -1.00112 -0.0119407 0.00456596 1 0 1 1 0 0 +EDGE2 9800 9759 1.01905 0.0465742 -3.1317 1 0 1 1 0 0 +EDGE2 9800 9780 0.0429987 -0.0463402 -0.0251163 1 0 1 1 0 0 +EDGE2 9800 9760 0.0280032 0.0511359 -3.13429 1 0 1 1 0 0 +EDGE2 9800 9761 0.00867399 0.924043 1.59425 1 0 1 1 0 0 +EDGE2 9800 9781 -0.0143217 1.00042 1.5257 1 0 1 1 0 0 +EDGE2 9800 9799 -0.967714 0.0482333 -0.00908236 1 0 1 1 0 0 +EDGE2 9800 9779 -0.95325 0.000557188 -0.00833934 1 0 1 1 0 0 +EDGE2 9801 9780 -1.0716 -0.00588341 -1.58074 1 0 1 1 0 0 +EDGE2 9801 9800 -1.06043 -0.0281473 -1.61104 1 0 1 1 0 0 +EDGE2 9801 9760 -1.0784 0.0240719 1.54117 1 0 1 1 0 0 +EDGE2 9801 9761 0.044781 -0.0203994 0.0235725 1 0 1 1 0 0 +EDGE2 9801 9781 -0.0870109 -0.0573302 -0.0348958 1 0 1 1 0 0 +EDGE2 9801 9762 1.07421 -0.029958 -0.0358865 1 0 1 1 0 0 +EDGE2 9801 9782 1.06948 0.0363638 0.00666453 1 0 1 1 0 0 +EDGE2 9802 9783 1.07194 0.0326462 -0.0472552 1 0 1 1 0 0 +EDGE2 9802 9761 -1.02927 0.0399781 -0.00318906 1 0 1 1 0 0 +EDGE2 9802 9781 -1.03479 0.0269169 0.0114381 1 0 1 1 0 0 +EDGE2 9802 9801 -1.00521 -0.0566792 0.0086292 1 0 1 1 0 0 +EDGE2 9802 9762 0.0140254 -0.0841294 -0.0220083 1 0 1 1 0 0 +EDGE2 9802 9782 -0.0140089 -0.0549531 0.0149735 1 0 1 1 0 0 +EDGE2 9802 9763 1.00758 -0.0325904 0.0168863 1 0 1 1 0 0 +EDGE2 9803 9783 -0.0687783 0.0431872 0.0174909 1 0 1 1 0 0 +EDGE2 9803 9802 -0.905691 -0.016734 -0.00531018 1 0 1 1 0 0 +EDGE2 9803 9762 -1.08165 0.0936819 -0.00682327 1 0 1 1 0 0 +EDGE2 9803 9782 -0.95362 -0.00326357 0.0176773 1 0 1 1 0 0 +EDGE2 9803 9764 1.11418 -0.0579647 0.0429063 1 0 1 1 0 0 +EDGE2 9803 9763 0.053854 0.0867357 0.00736948 1 0 1 1 0 0 +EDGE2 9803 9784 0.992933 0.0308884 -0.00350122 1 0 1 1 0 0 +EDGE2 9804 9783 -0.977936 -0.0558979 0.0507529 1 0 1 1 0 0 +EDGE2 9804 9803 -0.986413 0.11985 0.0147264 1 0 1 1 0 0 +EDGE2 9804 9764 -0.0561619 -0.0314105 -0.0437066 1 0 1 1 0 0 +EDGE2 9804 9763 -1.02766 0.0127447 -0.017717 1 0 1 1 0 0 +EDGE2 9804 9784 0.018044 0.0131419 -0.00808691 1 0 1 1 0 0 +EDGE2 9804 9785 1.07817 0.116696 -0.0171111 1 0 1 1 0 0 +EDGE2 9804 9765 1.01831 0.00151054 0.00229585 1 0 1 1 0 0 +EDGE2 9805 9764 -0.935452 -0.00479877 -0.000350395 1 0 1 1 0 0 +EDGE2 9805 9804 -0.997063 -0.00917821 -0.0230763 1 0 1 1 0 0 +EDGE2 9805 9784 -0.940131 -0.0386598 -0.0171408 1 0 1 1 0 0 +EDGE2 9805 9785 0.07554 -0.0068336 -0.0114533 1 0 1 1 0 0 +EDGE2 9805 9765 0.0391906 -0.0262206 0.0038428 1 0 1 1 0 0 +EDGE2 9805 9786 -0.0429636 0.998494 1.57154 1 0 1 1 0 0 +EDGE2 9805 9766 0.0585633 0.910945 1.60832 1 0 1 1 0 0 +EDGE2 9806 9785 -0.971268 0.0513599 -1.54426 1 0 1 1 0 0 +EDGE2 9806 9805 -1.01131 0.00129079 -1.55626 1 0 1 1 0 0 +EDGE2 9806 9765 -0.996884 0.00738793 -1.60956 1 0 1 1 0 0 +EDGE2 9806 9786 -0.00782038 0.00867265 0.0266927 1 0 1 1 0 0 +EDGE2 9806 9766 0.0125654 0.00205392 0.0220924 1 0 1 1 0 0 +EDGE2 9806 9767 1.11351 -0.0590602 -0.00646081 1 0 1 1 0 0 +EDGE2 9806 9787 0.982153 0.0841876 0.0140972 1 0 1 1 0 0 +EDGE2 9807 9786 -0.987316 0.0217619 0.0458383 1 0 1 1 0 0 +EDGE2 9807 9806 -0.985958 0.00669077 0.00129992 1 0 1 1 0 0 +EDGE2 9807 9766 -0.908214 -0.0153096 -0.00109399 1 0 1 1 0 0 +EDGE2 9807 9767 0.0321275 0.0782847 -0.0180287 1 0 1 1 0 0 +EDGE2 9807 9787 0.00288931 -0.0926786 0.000929104 1 0 1 1 0 0 +EDGE2 9807 9788 0.965722 -0.0163382 -0.025262 1 0 1 1 0 0 +EDGE2 9807 9768 0.979723 0.00465758 -0.0186011 1 0 1 1 0 0 +EDGE2 9808 9767 -1.00431 -0.0141873 -0.00525096 1 0 1 1 0 0 +EDGE2 9808 9787 -1.01602 0.00537513 -0.00544697 1 0 1 1 0 0 +EDGE2 9808 9807 -1.02415 -0.00863489 0.0138684 1 0 1 1 0 0 +EDGE2 9808 9788 0.0302877 -0.0514579 0.000314469 1 0 1 1 0 0 +EDGE2 9808 9789 0.97856 -0.0215491 -0.0311923 1 0 1 1 0 0 +EDGE2 9808 9768 -0.0602712 -0.103315 -0.0208591 1 0 1 1 0 0 +EDGE2 9808 9769 0.959062 -0.0205674 -0.00509809 1 0 1 1 0 0 +EDGE2 9809 9788 -0.992907 0.0164702 -0.0243804 1 0 1 1 0 0 +EDGE2 9809 9808 -0.976887 -0.0475809 -0.00249972 1 0 1 1 0 0 +EDGE2 9809 9789 -0.091422 0.0327605 -0.00638387 1 0 1 1 0 0 +EDGE2 9809 9768 -1.0667 0.0595257 0.0210087 1 0 1 1 0 0 +EDGE2 9809 9769 -0.0794691 0.0173244 -0.00579582 1 0 1 1 0 0 +EDGE2 9809 9770 0.95631 0.0236431 0.0146265 1 0 1 1 0 0 +EDGE2 9809 9790 0.914098 -0.026905 0.0135004 1 0 1 1 0 0 +EDGE2 9810 9789 -1.05126 0.0503889 0.00422025 1 0 1 1 0 0 +EDGE2 9810 9809 -1.04227 0.0123923 -0.00361221 1 0 1 1 0 0 +EDGE2 9810 9769 -0.986835 -0.0015857 -0.0305349 1 0 1 1 0 0 +EDGE2 9810 9770 0.0158986 -0.0385966 0.00935297 1 0 1 1 0 0 +EDGE2 9810 9791 -0.0123066 0.969437 1.58784 1 0 1 1 0 0 +EDGE2 9810 9771 0.00607319 0.940215 1.62093 1 0 1 1 0 0 +EDGE2 9810 9790 0.0660238 0.0777715 -0.0337733 1 0 1 1 0 0 +EDGE2 9811 9770 -1.01035 0.00818984 1.56431 1 0 1 1 0 0 +EDGE2 9811 9810 -1.01076 -0.0781136 1.56591 1 0 1 1 0 0 +EDGE2 9811 9790 -0.944388 -0.0277345 1.60192 1 0 1 1 0 0 +EDGE2 9812 9811 -1.05425 0.0335965 0.0538536 1 0 1 1 0 0 +EDGE2 9813 9812 -0.98295 0.00240912 0.0261768 1 0 1 1 0 0 +EDGE2 9814 9813 -0.954243 0.0503124 0.0170732 1 0 1 1 0 0 +EDGE2 9815 9814 -1.00819 -0.0316532 0.0218869 1 0 1 1 0 0 +EDGE2 9816 9815 -1.01248 0.00908535 -1.5907 1 0 1 1 0 0 +EDGE2 9817 9816 -0.959181 0.00648907 0.01552 1 0 1 1 0 0 +EDGE2 9818 9817 -1.01741 -0.0719304 0.00503394 1 0 1 1 0 0 +EDGE2 9819 9818 -0.912194 0.0981527 0.0333275 1 0 1 1 0 0 +EDGE2 9820 9819 -0.956282 0.070008 -0.00135486 1 0 1 1 0 0 +EDGE2 9821 9820 -0.989673 0.030912 1.56766 1 0 1 1 0 0 +EDGE2 9822 9821 -0.993556 -0.0282536 -0.00913003 1 0 1 1 0 0 +EDGE2 9823 9822 -0.959906 0.00319604 0.00967906 1 0 1 1 0 0 +EDGE2 9824 9823 -0.987903 -0.0318664 -0.00257842 1 0 1 1 0 0 +EDGE2 9825 9824 -0.984565 0.0642692 -0.0318579 1 0 1 1 0 0 +EDGE2 9826 9825 -0.871157 -0.0150211 -1.55251 1 0 1 1 0 0 +EDGE2 9827 9826 -0.905385 0.0297801 -0.033065 1 0 1 1 0 0 +EDGE2 9828 9827 -0.936682 -0.0649007 0.015157 1 0 1 1 0 0 +EDGE2 9829 9828 -0.955117 -0.0212981 -0.0032915 1 0 1 1 0 0 +EDGE2 9830 9829 -0.968432 0.014185 -0.0130282 1 0 1 1 0 0 +EDGE2 9831 9830 -1.02068 0.041536 -1.58969 1 0 1 1 0 0 +EDGE2 9832 9831 -1.06909 -0.00719031 0.00990099 1 0 1 1 0 0 +EDGE2 9833 9832 -1.04579 0.0170697 0.032782 1 0 1 1 0 0 +EDGE2 9834 9833 -0.963364 -0.0739639 0.00929557 1 0 1 1 0 0 +EDGE2 9835 9834 -1.01852 -0.0576778 0.00630765 1 0 1 1 0 0 +EDGE2 9836 9835 -1.00664 -0.0685745 -1.55324 1 0 1 1 0 0 +EDGE2 9837 9836 -0.950563 0.0147942 0.00813886 1 0 1 1 0 0 +EDGE2 9838 9837 -0.938862 -0.00611732 0.0138387 1 0 1 1 0 0 +EDGE2 9839 9820 0.963683 0.156458 -3.15532 1 0 1 1 0 0 +EDGE2 9839 9838 -0.969782 -0.0281003 0.00691224 1 0 1 1 0 0 +EDGE2 9840 9819 0.9601 -0.0090728 -3.12288 1 0 1 1 0 0 +EDGE2 9840 9821 0.000350705 0.974791 1.55687 1 0 1 1 0 0 +EDGE2 9840 9820 -0.00161491 0.0230243 -3.17304 1 0 1 1 0 0 +EDGE2 9840 9839 -1.02155 0.00668961 0.0741391 1 0 1 1 0 0 +EDGE2 9841 9840 -1.00128 -0.00284859 1.55681 1 0 1 1 0 0 +EDGE2 9841 9820 -0.961721 -0.0357766 -1.56049 1 0 1 1 0 0 +EDGE2 9842 9841 -0.950359 0.010655 0.0381233 1 0 1 1 0 0 +EDGE2 9843 9842 -1.00374 -0.0650381 -0.0256133 1 0 1 1 0 0 +EDGE2 9844 9843 -0.924376 0.0603905 -0.0072027 1 0 1 1 0 0 +EDGE2 9845 9844 -1.0611 -0.0219055 -0.0378618 1 0 1 1 0 0 +EDGE2 9846 9845 -1.04761 -0.0106752 -1.5817 1 0 1 1 0 0 +EDGE2 9847 9846 -1.05444 -0.0305621 0.0110518 1 0 1 1 0 0 +EDGE2 9848 9847 -1.10496 -0.00622344 0.00340856 1 0 1 1 0 0 +EDGE2 9849 9770 0.93842 -0.0702261 -3.15013 1 0 1 1 0 0 +EDGE2 9849 9810 0.99308 0.0011509 -3.12627 1 0 1 1 0 0 +EDGE2 9849 9790 1.01909 0.0232718 -3.1488 1 0 1 1 0 0 +EDGE2 9849 9848 -1.03116 -0.0380512 -0.0154037 1 0 1 1 0 0 +EDGE2 9850 9789 0.987904 -0.0112005 -3.14257 1 0 1 1 0 0 +EDGE2 9850 9809 0.994881 0.0116007 -3.16204 1 0 1 1 0 0 +EDGE2 9850 9769 0.922938 0.0539432 -3.13161 1 0 1 1 0 0 +EDGE2 9850 9770 0.050581 0.0642516 -3.13177 1 0 1 1 0 0 +EDGE2 9850 9791 -0.0231547 -0.979924 -1.58729 1 0 1 1 0 0 +EDGE2 9850 9810 0.00880477 -0.0709744 -3.15831 1 0 1 1 0 0 +EDGE2 9850 9771 -0.0345321 -0.978391 -1.5642 1 0 1 1 0 0 +EDGE2 9850 9790 -0.0309786 -0.0693323 -3.12648 1 0 1 1 0 0 +EDGE2 9850 9811 -0.0421302 0.950811 1.53992 1 0 1 1 0 0 +EDGE2 9850 9849 -0.946509 0.0209843 0.00560031 1 0 1 1 0 0 +EDGE2 9851 9770 -1.05607 0.0462309 -1.57351 1 0 1 1 0 0 +EDGE2 9851 9791 -0.0489833 -0.0595378 0.00072435 1 0 1 1 0 0 +EDGE2 9851 9772 0.992259 -0.0229193 -0.0225261 1 0 1 1 0 0 +EDGE2 9851 9792 0.908485 0.0901032 0.00276747 1 0 1 1 0 0 +EDGE2 9851 9810 -0.946794 0.0160266 -1.60387 1 0 1 1 0 0 +EDGE2 9851 9850 -0.999972 0.0114247 1.57127 1 0 1 1 0 0 +EDGE2 9851 9771 -0.0857444 0.0812142 0.00132108 1 0 1 1 0 0 +EDGE2 9851 9790 -1.06612 0.0320355 -1.54608 1 0 1 1 0 0 +EDGE2 9852 9773 0.96694 0.002087 0.020852 1 0 1 1 0 0 +EDGE2 9852 9793 1.00557 0.0832383 0.0258844 1 0 1 1 0 0 +EDGE2 9852 9791 -0.960513 0.0165065 0.015076 1 0 1 1 0 0 +EDGE2 9852 9772 -0.0697248 -0.00896192 -0.00358544 1 0 1 1 0 0 +EDGE2 9852 9792 -0.0263714 0.00969395 0.00781296 1 0 1 1 0 0 +EDGE2 9852 9851 -1.13948 -0.025426 -0.00458566 1 0 1 1 0 0 +EDGE2 9852 9771 -1.04447 -0.0023706 0.03897 1 0 1 1 0 0 +EDGE2 9853 9773 0.0720734 -0.031366 0.00909872 1 0 1 1 0 0 +EDGE2 9853 9774 0.90333 -0.0266255 -0.021302 1 0 1 1 0 0 +EDGE2 9853 9794 1.07298 0.04794 -0.00941623 1 0 1 1 0 0 +EDGE2 9853 9793 0.0986415 -0.166465 0.0142424 1 0 1 1 0 0 +EDGE2 9853 9772 -0.963139 -0.00830699 0.0116729 1 0 1 1 0 0 +EDGE2 9853 9792 -0.998873 -0.0506874 0.000711946 1 0 1 1 0 0 +EDGE2 9853 9852 -1.03567 0.0963624 0.00145663 1 0 1 1 0 0 +EDGE2 9854 9773 -1.0303 0.087779 -0.0217154 1 0 1 1 0 0 +EDGE2 9854 9795 1.04852 0.059759 -0.0313434 1 0 1 1 0 0 +EDGE2 9854 9775 1.023 0.104457 -0.0232603 1 0 1 1 0 0 +EDGE2 9854 9853 -0.937252 -0.0801551 -0.00340533 1 0 1 1 0 0 +EDGE2 9854 9774 7.47046e-05 0.0581875 0.00327946 1 0 1 1 0 0 +EDGE2 9854 9794 -0.0768979 0.0110432 0.0284001 1 0 1 1 0 0 +EDGE2 9854 9793 -0.961269 0.0595105 -0.00347454 1 0 1 1 0 0 +EDGE2 9855 9796 0.0240726 1.10275 1.62407 1 0 1 1 0 0 +EDGE2 9855 9776 0.0674065 0.984358 1.56844 1 0 1 1 0 0 +EDGE2 9855 9854 -0.944897 0.0464386 -0.0232144 1 0 1 1 0 0 +EDGE2 9855 9795 0.00664621 0.00610859 0.012593 1 0 1 1 0 0 +EDGE2 9855 9775 -0.0657117 -0.00935049 0.00847584 1 0 1 1 0 0 +EDGE2 9855 9774 -1.03446 0.0248437 0.0022628 1 0 1 1 0 0 +EDGE2 9855 9794 -0.950741 0.0378799 -0.0563088 1 0 1 1 0 0 +EDGE2 9856 9797 0.957986 0.0229105 0.0280179 1 0 1 1 0 0 +EDGE2 9856 9777 1.02957 0.038767 -0.0203569 1 0 1 1 0 0 +EDGE2 9856 9796 0.0518652 0.0472992 0.000857551 1 0 1 1 0 0 +EDGE2 9856 9776 0.00457978 -0.0217302 0.00174118 1 0 1 1 0 0 +EDGE2 9856 9795 -0.966209 0.0104524 -1.59365 1 0 1 1 0 0 +EDGE2 9856 9855 -0.942497 -0.0665734 -1.5866 1 0 1 1 0 0 +EDGE2 9856 9775 -0.92972 0.0195121 -1.56858 1 0 1 1 0 0 +EDGE2 9857 9798 0.997689 0.0883912 0.0121892 1 0 1 1 0 0 +EDGE2 9857 9778 0.926725 0.104837 0.0162758 1 0 1 1 0 0 +EDGE2 9857 9797 0.050297 -0.031923 0.0205212 1 0 1 1 0 0 +EDGE2 9857 9777 -0.0602183 -0.0206816 -0.0421533 1 0 1 1 0 0 +EDGE2 9857 9796 -1.04146 0.0739468 0.00784504 1 0 1 1 0 0 +EDGE2 9857 9856 -1.10999 -0.0348612 -0.0138026 1 0 1 1 0 0 +EDGE2 9857 9776 -1.0325 -0.0348962 -0.000116792 1 0 1 1 0 0 +EDGE2 9858 9799 1.05734 -0.0386004 0.00904709 1 0 1 1 0 0 +EDGE2 9858 9779 1.01615 0.0562879 0.00055822 1 0 1 1 0 0 +EDGE2 9858 9798 0.025688 -0.00814008 0.0231676 1 0 1 1 0 0 +EDGE2 9858 9778 -0.04469 -0.0306202 0.0344159 1 0 1 1 0 0 +EDGE2 9858 9797 -0.983333 0.0641503 -0.0021448 1 0 1 1 0 0 +EDGE2 9858 9857 -0.980821 0.0457441 0.0130824 1 0 1 1 0 0 +EDGE2 9858 9777 -0.9336 -0.0439313 0.00131688 1 0 1 1 0 0 +EDGE2 9859 9780 0.974428 -0.0530388 -0.0011867 1 0 1 1 0 0 +EDGE2 9859 9800 1.01389 0.010635 0.0380552 1 0 1 1 0 0 +EDGE2 9859 9760 0.956263 -0.102148 -3.16897 1 0 1 1 0 0 +EDGE2 9859 9799 0.0331947 0.0312807 -0.00498471 1 0 1 1 0 0 +EDGE2 9859 9779 -0.0499379 -0.0903437 -0.02842 1 0 1 1 0 0 +EDGE2 9859 9798 -0.970022 0.000591064 0.00889354 1 0 1 1 0 0 +EDGE2 9859 9858 -1.06926 0.0400773 0.0254103 1 0 1 1 0 0 +EDGE2 9859 9778 -1.07853 0.0450808 0.0171948 1 0 1 1 0 0 +EDGE2 9860 9759 1.03044 0.112836 -3.16107 1 0 1 1 0 0 +EDGE2 9860 9780 0.0581163 -0.0379665 -0.000740182 1 0 1 1 0 0 +EDGE2 9860 9800 -0.0153412 0.0296301 0.00748443 1 0 1 1 0 0 +EDGE2 9860 9760 0.0445035 -0.101426 -3.13997 1 0 1 1 0 0 +EDGE2 9860 9761 -0.0243892 0.983649 1.59284 1 0 1 1 0 0 +EDGE2 9860 9781 0.00512655 0.987742 1.56175 1 0 1 1 0 0 +EDGE2 9860 9801 0.024986 1.05104 1.53871 1 0 1 1 0 0 +EDGE2 9860 9799 -0.939271 -0.0259834 0.0090674 1 0 1 1 0 0 +EDGE2 9860 9859 -1.04965 -0.0589224 -0.04455 1 0 1 1 0 0 +EDGE2 9860 9779 -1.09892 -0.0215124 0.0169551 1 0 1 1 0 0 +EDGE2 9861 9780 -1.11334 -0.0490462 -1.5586 1 0 1 1 0 0 +EDGE2 9861 9800 -0.957884 -0.0141179 -1.57107 1 0 1 1 0 0 +EDGE2 9861 9860 -0.959426 -0.112808 -1.57684 1 0 1 1 0 0 +EDGE2 9861 9760 -0.90584 -0.0863456 1.55195 1 0 1 1 0 0 +EDGE2 9861 9802 0.941015 0.0656122 -0.023305 1 0 1 1 0 0 +EDGE2 9861 9761 0.0574194 -0.0826189 0.0114056 1 0 1 1 0 0 +EDGE2 9861 9781 -0.0535377 -0.0778469 0.0114013 1 0 1 1 0 0 +EDGE2 9861 9801 0.145768 0.00532005 -0.000305678 1 0 1 1 0 0 +EDGE2 9861 9762 1.05666 -0.0142473 0.0125405 1 0 1 1 0 0 +EDGE2 9861 9782 0.993644 -0.102616 -0.0257253 1 0 1 1 0 0 +EDGE2 9862 9783 0.92204 -0.0407918 0.00324874 1 0 1 1 0 0 +EDGE2 9862 9861 -0.9384 -0.0703373 -0.00295673 1 0 1 1 0 0 +EDGE2 9862 9802 -0.0295472 -0.040127 0.00680071 1 0 1 1 0 0 +EDGE2 9862 9761 -0.97659 0.00474338 0.0357984 1 0 1 1 0 0 +EDGE2 9862 9781 -0.991521 0.10527 -0.0371554 1 0 1 1 0 0 +EDGE2 9862 9801 -0.924707 0.0290808 -0.0141268 1 0 1 1 0 0 +EDGE2 9862 9762 -0.0422262 -0.0073038 -0.00948095 1 0 1 1 0 0 +EDGE2 9862 9782 0.0227746 0.0188144 -0.0267865 1 0 1 1 0 0 +EDGE2 9862 9803 0.950158 0.0475589 0.0187416 1 0 1 1 0 0 +EDGE2 9862 9763 0.932229 0.0150684 0.0285961 1 0 1 1 0 0 +EDGE2 9863 9783 -0.0189925 0.037203 -0.0333709 1 0 1 1 0 0 +EDGE2 9863 9802 -0.97462 -0.0153923 -0.0120532 1 0 1 1 0 0 +EDGE2 9863 9862 -0.979837 0.0326652 -5.25604e-05 1 0 1 1 0 0 +EDGE2 9863 9762 -0.961445 -0.0587825 0.0250959 1 0 1 1 0 0 +EDGE2 9863 9782 -1.01475 0.0483743 0.0134033 1 0 1 1 0 0 +EDGE2 9863 9803 0.025893 0.0245941 -0.00837955 1 0 1 1 0 0 +EDGE2 9863 9764 1.03689 0.0567806 -0.00137207 1 0 1 1 0 0 +EDGE2 9863 9804 1.00412 0.0417768 -0.017738 1 0 1 1 0 0 +EDGE2 9863 9763 -0.0377522 0.0138919 -0.000857033 1 0 1 1 0 0 +EDGE2 9863 9784 1.0474 0.0215787 0.00120461 1 0 1 1 0 0 +EDGE2 9864 9783 -1.03342 0.0430337 0.0450082 1 0 1 1 0 0 +EDGE2 9864 9863 -1.04525 -0.0151376 0.0149742 1 0 1 1 0 0 +EDGE2 9864 9803 -1.03397 -0.0417697 0.0270202 1 0 1 1 0 0 +EDGE2 9864 9764 -0.0490089 0.0358539 -0.0437397 1 0 1 1 0 0 +EDGE2 9864 9804 0.0257498 -0.00524018 0.0393885 1 0 1 1 0 0 +EDGE2 9864 9763 -1.08984 -0.00787911 -0.00971551 1 0 1 1 0 0 +EDGE2 9864 9784 0.0204947 -0.00681326 -0.015024 1 0 1 1 0 0 +EDGE2 9864 9785 1.03058 -0.00819306 -0.00119022 1 0 1 1 0 0 +EDGE2 9864 9805 0.894731 0.0208434 0.0224751 1 0 1 1 0 0 +EDGE2 9864 9765 1.00468 0.019036 0.0143985 1 0 1 1 0 0 +EDGE2 9865 9764 -1.08766 -0.0286786 -0.035848 1 0 1 1 0 0 +EDGE2 9865 9804 -1.03824 -0.0133035 0.0270589 1 0 1 1 0 0 +EDGE2 9865 9864 -1.06973 0.0760578 -0.00867425 1 0 1 1 0 0 +EDGE2 9865 9784 -0.962328 0.0239535 -0.0416197 1 0 1 1 0 0 +EDGE2 9865 9785 0.0355193 -0.00597712 0.0223286 1 0 1 1 0 0 +EDGE2 9865 9805 -0.0371964 -0.00301247 0.0146788 1 0 1 1 0 0 +EDGE2 9865 9765 0.0100759 -0.0122627 0.00961141 1 0 1 1 0 0 +EDGE2 9865 9786 -0.0163523 1.09118 1.57682 1 0 1 1 0 0 +EDGE2 9865 9806 0.0708915 0.922278 1.57926 1 0 1 1 0 0 +EDGE2 9865 9766 -0.0468316 0.951034 1.56953 1 0 1 1 0 0 +EDGE2 9866 9785 -0.988721 -0.0522769 1.57692 1 0 1 1 0 0 +EDGE2 9866 9805 -0.985739 0.0544987 1.58039 1 0 1 1 0 0 +EDGE2 9866 9865 -1.00518 -0.0811909 1.5557 1 0 1 1 0 0 +EDGE2 9866 9765 -1.03205 0.0285556 1.601 1 0 1 1 0 0 +EDGE2 9867 9866 -0.961555 -0.032396 -0.00437267 1 0 1 1 0 0 +EDGE2 9868 9867 -0.977999 0.0614403 -0.0110437 1 0 1 1 0 0 +EDGE2 9869 9868 -0.959609 -0.0424683 -0.0122176 1 0 1 1 0 0 +EDGE2 9870 9869 -1.0046 0.0422897 0.00141556 1 0 1 1 0 0 +EDGE2 9871 9870 -0.996362 0.0355942 -1.57092 1 0 1 1 0 0 +EDGE2 9872 9871 -1.03642 -0.0105162 -0.0186957 1 0 1 1 0 0 +EDGE2 9873 9872 -0.975345 0.104934 -0.00556896 1 0 1 1 0 0 +EDGE2 9874 9873 -0.993229 0.0294202 0.0278634 1 0 1 1 0 0 +EDGE2 9875 9874 -0.985115 -0.0321888 0.0097074 1 0 1 1 0 0 +EDGE2 9876 9875 -1.21814 0.0192965 -1.56287 1 0 1 1 0 0 +EDGE2 9877 9876 -1.01733 0.07342 -0.0286616 1 0 1 1 0 0 +EDGE2 9878 9877 -0.982068 -0.0779321 -0.0177365 1 0 1 1 0 0 +EDGE2 9879 9878 -1.04943 0.0425704 -0.0105074 1 0 1 1 0 0 +EDGE2 9880 9879 -0.958917 0.100142 0.0162162 1 0 1 1 0 0 +EDGE2 9881 9880 -1.04827 0.0168176 1.5047 1 0 1 1 0 0 +EDGE2 9882 9881 -0.951941 0.0182429 -0.00357174 1 0 1 1 0 0 +EDGE2 9883 9882 -0.940248 0.0959539 -0.0113522 1 0 1 1 0 0 +EDGE2 9884 9883 -1.01619 -0.0265271 -0.0317351 1 0 1 1 0 0 +EDGE2 9885 9884 -1.01552 0.0469991 0.00458101 1 0 1 1 0 0 +EDGE2 9886 9885 -0.896022 -0.070439 -1.58561 1 0 1 1 0 0 +EDGE2 9887 9886 -0.955342 0.09999 0.0140566 1 0 1 1 0 0 +EDGE2 9888 9887 -0.965237 -0.0332312 -0.023903 1 0 1 1 0 0 +EDGE2 9889 9888 -1.05676 -0.0823683 -0.0169515 1 0 1 1 0 0 +EDGE2 9890 9889 -1.04375 -0.0209792 0.0065629 1 0 1 1 0 0 +EDGE2 9891 9890 -1.00001 0.00614545 1.5586 1 0 1 1 0 0 +EDGE2 9892 9891 -1.02063 0.0465364 -0.00416012 1 0 1 1 0 0 +EDGE2 9893 9892 -1.05977 0.0262726 -0.00614933 1 0 1 1 0 0 +EDGE2 9894 9893 -1.00169 0.0316514 -0.0192751 1 0 1 1 0 0 +EDGE2 9895 9894 -0.994778 0.0235758 0.0213692 1 0 1 1 0 0 +EDGE2 9896 9895 -1.05119 -0.0194787 -1.54686 1 0 1 1 0 0 +EDGE2 9897 9896 -0.856071 -0.0443932 -0.0142935 1 0 1 1 0 0 +EDGE2 9898 9897 -0.95036 -0.000155029 -0.0221308 1 0 1 1 0 0 +EDGE2 9899 9898 -0.933595 -0.032084 -0.0155319 1 0 1 1 0 0 +EDGE2 9900 9899 -0.994867 -0.148959 -0.00923651 1 0 1 1 0 0 +EDGE2 9901 9900 -1.02416 -0.0249657 -1.52222 1 0 1 1 0 0 +EDGE2 9902 9901 -0.931577 -0.0414683 -0.0178615 1 0 1 1 0 0 +EDGE2 9903 9902 -0.951937 0.0285163 0.00873972 1 0 1 1 0 0 +EDGE2 9904 9825 0.912336 -0.0453361 -3.14223 1 0 1 1 0 0 +EDGE2 9904 9903 -1.06743 -0.132257 0.000895273 1 0 1 1 0 0 +EDGE2 9905 9825 0.056713 0.00256893 -3.14389 1 0 1 1 0 0 +EDGE2 9905 9824 0.895273 0.0348917 -3.14682 1 0 1 1 0 0 +EDGE2 9905 9904 -1.03719 0.0256257 0.0094967 1 0 1 1 0 0 +EDGE2 9905 9826 0.101271 -1.0188 -1.58002 1 0 1 1 0 0 +EDGE2 9906 9825 -1.06013 -0.0690862 1.57363 1 0 1 1 0 0 +EDGE2 9906 9905 -0.971095 -0.0046375 -1.56015 1 0 1 1 0 0 +EDGE2 9907 9906 -0.970387 0.0769861 0.0185727 1 0 1 1 0 0 +EDGE2 9908 9907 -1.04016 0.0747833 0.012253 1 0 1 1 0 0 +EDGE2 9909 9890 0.973166 0.00170807 -3.14318 1 0 1 1 0 0 +EDGE2 9909 9908 -0.950317 0.0138905 0.0129976 1 0 1 1 0 0 +EDGE2 9910 9889 1.01759 -0.0524947 -3.11929 1 0 1 1 0 0 +EDGE2 9910 9891 0.0306485 0.89041 1.56648 1 0 1 1 0 0 +EDGE2 9910 9890 0.0566382 0.0143607 -3.13604 1 0 1 1 0 0 +EDGE2 9910 9909 -1.01331 -0.0771664 -0.020282 1 0 1 1 0 0 +EDGE2 9911 9891 0.0355072 0.0697713 0.006786 1 0 1 1 0 0 +EDGE2 9911 9890 -0.850843 0.000534432 1.54807 1 0 1 1 0 0 +EDGE2 9911 9910 -1.03305 -0.158407 -1.56843 1 0 1 1 0 0 +EDGE2 9911 9892 0.990979 0.00504754 -0.00920246 1 0 1 1 0 0 +EDGE2 9912 9891 -0.999779 0.00903331 -0.00690862 1 0 1 1 0 0 +EDGE2 9912 9911 -1.0494 -0.0542637 -0.00189484 1 0 1 1 0 0 +EDGE2 9912 9892 0.0573416 0.0443338 -0.014707 1 0 1 1 0 0 +EDGE2 9912 9893 1.00656 -0.0744734 0.00655424 1 0 1 1 0 0 +EDGE2 9913 9892 -0.981949 0.120237 0.0127847 1 0 1 1 0 0 +EDGE2 9913 9912 -0.94732 -0.0048291 -0.00351509 1 0 1 1 0 0 +EDGE2 9913 9893 0.00878446 -0.00442196 0.0202391 1 0 1 1 0 0 +EDGE2 9913 9894 0.971997 0.0153373 0.0306894 1 0 1 1 0 0 +EDGE2 9914 9913 -0.954851 -0.0768321 0.0197407 1 0 1 1 0 0 +EDGE2 9914 9893 -1.03024 -0.0696492 -0.0124195 1 0 1 1 0 0 +EDGE2 9914 9894 -0.0540449 0.0981754 0.0120701 1 0 1 1 0 0 +EDGE2 9914 9895 1.00237 -0.0892042 0.0018452 1 0 1 1 0 0 +EDGE2 9915 9914 -0.929764 0.0205567 -0.0173971 1 0 1 1 0 0 +EDGE2 9915 9894 -1.03277 0.0307048 -0.0208565 1 0 1 1 0 0 +EDGE2 9915 9895 -0.0047259 -0.0440911 -0.0351632 1 0 1 1 0 0 +EDGE2 9915 9896 -0.0204464 0.953373 1.58313 1 0 1 1 0 0 +EDGE2 9916 9915 -0.949185 0.0256851 1.58515 1 0 1 1 0 0 +EDGE2 9916 9895 -1.00814 0.0279689 1.57904 1 0 1 1 0 0 +EDGE2 9917 9916 -1.03481 0.0753926 -0.0287888 1 0 1 1 0 0 +EDGE2 9918 9917 -0.970473 0.0297371 -0.0207125 1 0 1 1 0 0 +EDGE2 9919 9918 -1.08028 -0.0937181 0.0404929 1 0 1 1 0 0 +EDGE2 9920 9919 -0.981233 0.00654657 -0.0228329 1 0 1 1 0 0 +EDGE2 9921 9920 -0.922186 0.0566457 -1.55436 1 0 1 1 0 0 +EDGE2 9922 9921 -0.98182 -0.0134498 0.0207777 1 0 1 1 0 0 +EDGE2 9923 9922 -1.0326 -0.00171258 0.0127003 1 0 1 1 0 0 +EDGE2 9924 9923 -0.998517 -0.080205 0.0237654 1 0 1 1 0 0 +EDGE2 9925 9924 -0.953925 0.0193435 -0.0172902 1 0 1 1 0 0 +EDGE2 9926 9925 -1.00295 -0.0225283 1.55107 1 0 1 1 0 0 +EDGE2 9927 9926 -1.04185 -0.0786624 0.0164106 1 0 1 1 0 0 +EDGE2 9928 9927 -0.918295 0.0706748 0.00141701 1 0 1 1 0 0 +EDGE2 9929 9928 -1.01334 -0.0559139 -0.0161129 1 0 1 1 0 0 +EDGE2 9930 9929 -1.03443 -0.0577086 -0.00492575 1 0 1 1 0 0 +EDGE2 9931 9930 -0.936582 -0.0651766 1.56533 1 0 1 1 0 0 +EDGE2 9932 9931 -0.950265 0.0364082 0.012723 1 0 1 1 0 0 +EDGE2 9933 9932 -1.01178 0.0057284 -0.0167987 1 0 1 1 0 0 +EDGE2 9934 9933 -1.00211 -0.0894694 0.000181852 1 0 1 1 0 0 +EDGE2 9935 9934 -0.860499 0.0341724 -0.00641238 1 0 1 1 0 0 +EDGE2 9936 9935 -1.0209 -0.0521226 -1.59298 1 0 1 1 0 0 +EDGE2 9937 9936 -0.997068 0.060897 -0.00809348 1 0 1 1 0 0 +EDGE2 9938 9937 -0.983338 0.0158233 0.0207282 1 0 1 1 0 0 +EDGE2 9939 9938 -1.01105 -0.00780705 -0.0138475 1 0 1 1 0 0 +EDGE2 9940 9939 -1.01119 0.0194028 0.00434374 1 0 1 1 0 0 +EDGE2 9941 9940 -1.00073 -0.0329863 -1.60167 1 0 1 1 0 0 +EDGE2 9942 9941 -0.992635 0.106598 -0.0228436 1 0 1 1 0 0 +EDGE2 9943 9942 -1.00994 0.0264871 0.00638194 1 0 1 1 0 0 +EDGE2 9944 9943 -0.993074 0.0998825 0.0213753 1 0 1 1 0 0 +EDGE2 9945 9944 -1.03231 -0.0506026 -0.0147023 1 0 1 1 0 0 +EDGE2 9946 9945 -1.04148 -0.0701979 -1.5535 1 0 1 1 0 0 +EDGE2 9947 9946 -0.96974 0.0434243 -0.0159306 1 0 1 1 0 0 +EDGE2 9948 9947 -0.970786 0.0254565 -0.0241482 1 0 1 1 0 0 +EDGE2 9949 9948 -0.942992 -0.095154 0.0297044 1 0 1 1 0 0 +EDGE2 9949 9930 1.04805 0.0173292 -3.11354 1 0 1 1 0 0 +EDGE2 9950 9949 -1.023 -0.0772526 -0.0233623 1 0 1 1 0 0 +EDGE2 9950 9929 1.04957 0.00887155 -3.11552 1 0 1 1 0 0 +EDGE2 9950 9931 -0.0301288 1.05731 1.54095 1 0 1 1 0 0 +EDGE2 9950 9930 -0.00675592 0.029265 -3.15594 1 0 1 1 0 0 +EDGE2 9951 9931 0.0118838 -0.0240896 -0.0143726 1 0 1 1 0 0 +EDGE2 9951 9932 1.01966 -0.000386579 0.0039284 1 0 1 1 0 0 +EDGE2 9951 9950 -1.11946 0.0578413 -1.58299 1 0 1 1 0 0 +EDGE2 9951 9930 -1.03719 -0.0175772 1.53659 1 0 1 1 0 0 +EDGE2 9952 9933 0.969178 0.0439752 -0.0146698 1 0 1 1 0 0 +EDGE2 9952 9931 -0.979292 -0.0856436 -0.036331 1 0 1 1 0 0 +EDGE2 9952 9932 -0.0202084 -0.0534515 -0.00559006 1 0 1 1 0 0 +EDGE2 9952 9951 -1.03444 -0.0308963 0.0250159 1 0 1 1 0 0 +EDGE2 9953 9934 1.05417 0.0318367 -0.0237889 1 0 1 1 0 0 +EDGE2 9953 9952 -1.01679 -0.0703551 0.000113778 1 0 1 1 0 0 +EDGE2 9953 9933 -0.026973 0.134759 0.0185374 1 0 1 1 0 0 +EDGE2 9953 9932 -0.961999 0.0027781 0.00551986 1 0 1 1 0 0 +EDGE2 9954 9935 0.985506 0.00572236 0.0228026 1 0 1 1 0 0 +EDGE2 9954 9934 -0.0847519 -0.0328387 -0.0126255 1 0 1 1 0 0 +EDGE2 9954 9933 -1.0088 0.0135745 0.0322112 1 0 1 1 0 0 +EDGE2 9954 9953 -1.04766 0.0692697 -0.00423934 1 0 1 1 0 0 +EDGE2 9955 9936 -0.0398429 0.968954 1.58346 1 0 1 1 0 0 +EDGE2 9955 9935 -0.0372775 0.0123016 0.00243751 1 0 1 1 0 0 +EDGE2 9955 9934 -1.00995 -0.0160584 0.0110919 1 0 1 1 0 0 +EDGE2 9955 9954 -0.946039 -0.0136641 0.0130896 1 0 1 1 0 0 +EDGE2 9956 9936 -0.123496 -0.00856816 -0.0152468 1 0 1 1 0 0 +EDGE2 9956 9937 1.06406 0.00973341 -0.0388574 1 0 1 1 0 0 +EDGE2 9956 9935 -1.1001 0.0254583 -1.52457 1 0 1 1 0 0 +EDGE2 9956 9955 -1.01902 -0.0343805 -1.55765 1 0 1 1 0 0 +EDGE2 9957 9936 -0.996686 0.0163279 0.042197 1 0 1 1 0 0 +EDGE2 9957 9938 0.976496 -0.0172281 0.0105629 1 0 1 1 0 0 +EDGE2 9957 9956 -0.891731 0.0583175 0.0179719 1 0 1 1 0 0 +EDGE2 9957 9937 -0.0388584 0.01857 0.00778711 1 0 1 1 0 0 +EDGE2 9958 9939 0.997796 -0.131022 -0.00238933 1 0 1 1 0 0 +EDGE2 9958 9957 -1.00929 0.00395449 0.0237933 1 0 1 1 0 0 +EDGE2 9958 9938 0.0517329 0.0523404 0.0162742 1 0 1 1 0 0 +EDGE2 9958 9937 -0.930782 -0.0865663 0.0300701 1 0 1 1 0 0 +EDGE2 9959 9940 0.982366 0.0569166 -0.00826597 1 0 1 1 0 0 +EDGE2 9959 9939 -0.0264099 0.0320712 -0.0109983 1 0 1 1 0 0 +EDGE2 9959 9938 -1.07802 -0.0620523 0.0178833 1 0 1 1 0 0 +EDGE2 9959 9958 -0.99282 -0.095367 -0.0349856 1 0 1 1 0 0 +EDGE2 9960 9940 -0.00282936 -0.112583 -0.0175141 1 0 1 1 0 0 +EDGE2 9960 9941 0.00118271 1.03771 1.59879 1 0 1 1 0 0 +EDGE2 9960 9959 -1.00739 -0.0106687 0.0612647 1 0 1 1 0 0 +EDGE2 9960 9939 -0.966058 -0.0333515 -0.00910869 1 0 1 1 0 0 +EDGE2 9961 9942 1.12175 -0.0708717 -0.00206806 1 0 1 1 0 0 +EDGE2 9961 9960 -1.00033 -0.0414828 -1.58023 1 0 1 1 0 0 +EDGE2 9961 9940 -0.94679 -0.00953044 -1.56557 1 0 1 1 0 0 +EDGE2 9961 9941 0.0242637 0.0407118 0.00147663 1 0 1 1 0 0 +EDGE2 9962 9942 -0.0319651 -0.0675981 -0.00624931 1 0 1 1 0 0 +EDGE2 9962 9941 -1.00129 -0.100657 -0.0381265 1 0 1 1 0 0 +EDGE2 9962 9961 -0.979672 -0.0944588 0.00745762 1 0 1 1 0 0 +EDGE2 9962 9943 0.921733 0.00795027 0.0107748 1 0 1 1 0 0 +EDGE2 9963 9942 -1.00917 -0.0213496 0.0188944 1 0 1 1 0 0 +EDGE2 9963 9962 -1.07807 -0.0256171 -8.91853e-06 1 0 1 1 0 0 +EDGE2 9963 9943 -0.0811244 0.0421838 -0.035786 1 0 1 1 0 0 +EDGE2 9963 9944 0.980172 -0.0030288 -0.0199599 1 0 1 1 0 0 +EDGE2 9964 9943 -0.958196 0.0366785 0.00439063 1 0 1 1 0 0 +EDGE2 9964 9963 -1.06479 0.0480273 0.00136697 1 0 1 1 0 0 +EDGE2 9964 9945 1.03118 -0.00108893 0.0175554 1 0 1 1 0 0 +EDGE2 9964 9944 0.00392369 0.01573 -0.0320585 1 0 1 1 0 0 +EDGE2 9965 9945 0.0552721 -0.0130294 0.0115773 1 0 1 1 0 0 +EDGE2 9965 9944 -1.01944 -0.0660445 0.016822 1 0 1 1 0 0 +EDGE2 9965 9964 -1.01265 -0.00709757 -0.00417927 1 0 1 1 0 0 +EDGE2 9965 9946 -0.0305526 0.988603 1.58324 1 0 1 1 0 0 +EDGE2 9966 9945 -0.928517 -0.00583902 -1.55437 1 0 1 1 0 0 +EDGE2 9966 9965 -1.01604 0.0146662 -1.60529 1 0 1 1 0 0 +EDGE2 9966 9946 -0.022598 0.0613102 0.0183249 1 0 1 1 0 0 +EDGE2 9966 9947 1.04648 -0.00816218 -0.0108611 1 0 1 1 0 0 +EDGE2 9967 9966 -0.986419 -0.0376466 -0.00492889 1 0 1 1 0 0 +EDGE2 9967 9946 -0.990917 0.0409999 0.0426296 1 0 1 1 0 0 +EDGE2 9967 9947 -0.0119613 0.0861352 -0.00118229 1 0 1 1 0 0 +EDGE2 9967 9948 1.02432 0.0917823 -0.00676143 1 0 1 1 0 0 +EDGE2 9968 9947 -0.94854 0.0404681 0.0236102 1 0 1 1 0 0 +EDGE2 9968 9967 -1.06957 -0.115524 0.045981 1 0 1 1 0 0 +EDGE2 9968 9948 -0.0220832 0.135172 0.0260949 1 0 1 1 0 0 +EDGE2 9968 9949 0.973612 0.0132195 -0.0475724 1 0 1 1 0 0 +EDGE2 9969 9968 -1.05746 0.00541496 0.0147432 1 0 1 1 0 0 +EDGE2 9969 9948 -1.0634 -0.00902586 -0.0134678 1 0 1 1 0 0 +EDGE2 9969 9949 -0.00225685 -0.0818478 -0.00683576 1 0 1 1 0 0 +EDGE2 9969 9950 0.975088 -0.0770147 -0.0133614 1 0 1 1 0 0 +EDGE2 9969 9930 0.951527 0.0348758 -3.12689 1 0 1 1 0 0 +EDGE2 9970 9969 -0.906159 0.0652177 -0.018721 1 0 1 1 0 0 +EDGE2 9970 9949 -0.927571 0.0531942 0.00389617 1 0 1 1 0 0 +EDGE2 9970 9929 1.03954 0.0162449 -3.17614 1 0 1 1 0 0 +EDGE2 9970 9931 0.00256275 0.944018 1.57737 1 0 1 1 0 0 +EDGE2 9970 9951 -0.0173207 0.89332 1.54759 1 0 1 1 0 0 +EDGE2 9970 9950 0.050366 -0.027113 -0.03683 1 0 1 1 0 0 +EDGE2 9970 9930 0.0609124 0.0175953 -3.12937 1 0 1 1 0 0 +EDGE2 9971 9952 0.934499 -0.0779074 0.0183284 1 0 1 1 0 0 +EDGE2 9971 9931 0.00969489 0.0339378 -0.00117436 1 0 1 1 0 0 +EDGE2 9971 9932 1.01308 -0.068781 0.0166704 1 0 1 1 0 0 +EDGE2 9971 9951 -0.0774468 -0.0600187 -0.00568556 1 0 1 1 0 0 +EDGE2 9971 9950 -0.965435 -0.024801 -1.58479 1 0 1 1 0 0 +EDGE2 9971 9970 -0.903675 0.0572683 -1.54751 1 0 1 1 0 0 +EDGE2 9971 9930 -1.04409 0.0317378 1.55794 1 0 1 1 0 0 +EDGE2 9972 9952 -0.0563855 0.0147472 -0.0306927 1 0 1 1 0 0 +EDGE2 9972 9933 1.00691 0.0549422 -0.00430152 1 0 1 1 0 0 +EDGE2 9972 9953 1.01301 -0.0184554 -0.00615112 1 0 1 1 0 0 +EDGE2 9972 9931 -1.01692 0.00348 -0.0267497 1 0 1 1 0 0 +EDGE2 9972 9971 -0.989291 0.094918 -0.022811 1 0 1 1 0 0 +EDGE2 9972 9932 0.0380991 0.0327695 -0.0114612 1 0 1 1 0 0 +EDGE2 9972 9951 -0.94375 0.00223521 -0.0398696 1 0 1 1 0 0 +EDGE2 9973 9934 0.959782 -0.000461271 -0.00352375 1 0 1 1 0 0 +EDGE2 9973 9954 0.930059 -0.0240197 0.0180597 1 0 1 1 0 0 +EDGE2 9973 9952 -0.956262 -0.0502742 -0.0353758 1 0 1 1 0 0 +EDGE2 9973 9933 0.0443915 -0.0978175 0.00704686 1 0 1 1 0 0 +EDGE2 9973 9953 -0.0250872 -0.0448865 -0.0177307 1 0 1 1 0 0 +EDGE2 9973 9972 -1.00732 -0.0543466 -0.0111928 1 0 1 1 0 0 +EDGE2 9973 9932 -1.00274 -0.0639248 0.00628636 1 0 1 1 0 0 +EDGE2 9974 9973 -1.04198 0.0120512 -0.0381173 1 0 1 1 0 0 +EDGE2 9974 9935 1.00257 0.135403 0.0184756 1 0 1 1 0 0 +EDGE2 9974 9955 1.00818 0.0658347 -0.0363991 1 0 1 1 0 0 +EDGE2 9974 9934 -0.0127108 -0.0149095 0.0214731 1 0 1 1 0 0 +EDGE2 9974 9954 -0.0322887 0.0228546 -0.0064299 1 0 1 1 0 0 +EDGE2 9974 9933 -0.951811 -0.0280925 0.0108555 1 0 1 1 0 0 +EDGE2 9974 9953 -1.04713 -0.0949844 -0.0179729 1 0 1 1 0 0 +EDGE2 9975 9936 0.0740877 0.919706 1.56925 1 0 1 1 0 0 +EDGE2 9975 9956 -0.0979098 0.983754 1.60515 1 0 1 1 0 0 +EDGE2 9975 9974 -1.00642 -0.0105236 0.00784229 1 0 1 1 0 0 +EDGE2 9975 9935 -0.0876511 -0.00364974 0.017645 1 0 1 1 0 0 +EDGE2 9975 9955 -0.0248077 0.0752488 0.0362789 1 0 1 1 0 0 +EDGE2 9975 9934 -0.925359 0.0143234 -0.00265043 1 0 1 1 0 0 +EDGE2 9975 9954 -0.967741 0.0343691 -0.0223691 1 0 1 1 0 0 +EDGE2 9976 9936 0.0431892 -0.0469753 0.0460943 1 0 1 1 0 0 +EDGE2 9976 9957 1.10487 -0.0859737 0.0168066 1 0 1 1 0 0 +EDGE2 9976 9956 0.00104552 0.100599 -0.0149953 1 0 1 1 0 0 +EDGE2 9976 9937 0.995912 -0.0193394 -0.00990808 1 0 1 1 0 0 +EDGE2 9976 9935 -1.05892 0.0217649 -1.55306 1 0 1 1 0 0 +EDGE2 9976 9955 -1.0449 0.0152274 -1.56848 1 0 1 1 0 0 +EDGE2 9976 9975 -1.03627 -0.0118762 -1.57316 1 0 1 1 0 0 +EDGE2 9977 9936 -1.02904 -0.0358806 -0.00744059 1 0 1 1 0 0 +EDGE2 9977 9957 -0.00859617 -0.0207388 -0.00630054 1 0 1 1 0 0 +EDGE2 9977 9938 1.00106 -0.0674526 -0.0451613 1 0 1 1 0 0 +EDGE2 9977 9958 0.986538 0.00854121 -0.00382597 1 0 1 1 0 0 +EDGE2 9977 9956 -1.13078 0.0191191 -0.033702 1 0 1 1 0 0 +EDGE2 9977 9976 -0.879759 0.0420062 0.0211336 1 0 1 1 0 0 +EDGE2 9977 9937 0.00963615 -0.0774209 0.0135519 1 0 1 1 0 0 +EDGE2 9978 9959 0.991791 0.0200231 0.0144945 1 0 1 1 0 0 +EDGE2 9978 9939 1.04319 0.0740685 -0.00295755 1 0 1 1 0 0 +EDGE2 9978 9957 -1.02763 0.0290212 -0.0073472 1 0 1 1 0 0 +EDGE2 9978 9938 -0.13341 -0.0790795 -0.00241586 1 0 1 1 0 0 +EDGE2 9978 9958 -0.00905546 0.0633751 -0.00542871 1 0 1 1 0 0 +EDGE2 9978 9977 -0.928546 0.00644954 0.0131666 1 0 1 1 0 0 +EDGE2 9978 9937 -1.00807 0.00622724 -0.000577882 1 0 1 1 0 0 +EDGE2 9979 9960 0.980568 -0.0596623 -0.00197962 1 0 1 1 0 0 +EDGE2 9979 9940 1.04632 0.0521956 0.023566 1 0 1 1 0 0 +EDGE2 9979 9959 -0.0228963 0.0358676 -0.0118565 1 0 1 1 0 0 +EDGE2 9979 9939 -0.0397621 0.0565073 -0.0210818 1 0 1 1 0 0 +EDGE2 9979 9938 -1.02851 -0.0324138 -0.00567223 1 0 1 1 0 0 +EDGE2 9979 9958 -1.05499 0.00266745 -0.0388642 1 0 1 1 0 0 +EDGE2 9979 9978 -0.990839 0.0558441 0.00248826 1 0 1 1 0 0 +EDGE2 9980 9960 -0.0501377 0.0545739 0.0133875 1 0 1 1 0 0 +EDGE2 9980 9940 0.0273842 0.019326 0.0318825 1 0 1 1 0 0 +EDGE2 9980 9941 0.0625565 0.965478 1.57575 1 0 1 1 0 0 +EDGE2 9980 9961 0.0372114 1.03622 1.56251 1 0 1 1 0 0 +EDGE2 9980 9959 -1.00713 -0.0227014 -0.0126593 1 0 1 1 0 0 +EDGE2 9980 9979 -1.05364 0.0496047 -0.0431565 1 0 1 1 0 0 +EDGE2 9980 9939 -1.0356 0.0542483 0.00334253 1 0 1 1 0 0 +EDGE2 9981 9942 1.05983 -0.0972456 -0.00781671 1 0 1 1 0 0 +EDGE2 9981 9960 -0.856078 0.0729006 -1.52657 1 0 1 1 0 0 +EDGE2 9981 9980 -1.00338 -0.0531704 -1.57472 1 0 1 1 0 0 +EDGE2 9981 9940 -0.993908 -0.0638067 -1.57455 1 0 1 1 0 0 +EDGE2 9981 9941 0.0108502 -0.0845484 0.0308976 1 0 1 1 0 0 +EDGE2 9981 9961 0.00700344 0.0234379 -0.0249185 1 0 1 1 0 0 +EDGE2 9981 9962 0.877902 0.0530254 0.0278876 1 0 1 1 0 0 +EDGE2 9982 9942 0.0195571 0.0418623 0.0350863 1 0 1 1 0 0 +EDGE2 9982 9981 -1.02457 -0.048491 -0.00446608 1 0 1 1 0 0 +EDGE2 9982 9941 -1.04185 0.0176234 -0.00267544 1 0 1 1 0 0 +EDGE2 9982 9961 -1.03369 0.0112249 -0.031554 1 0 1 1 0 0 +EDGE2 9982 9962 0.0830909 -0.0657209 -0.0337241 1 0 1 1 0 0 +EDGE2 9982 9943 0.895548 -0.0623618 0.0319696 1 0 1 1 0 0 +EDGE2 9982 9963 1.08828 0.0228015 -0.00721152 1 0 1 1 0 0 +EDGE2 9983 9942 -0.913941 0.0610054 -0.0199871 1 0 1 1 0 0 +EDGE2 9983 9982 -0.921139 0.0210626 -0.00726694 1 0 1 1 0 0 +EDGE2 9983 9962 -1.0236 -0.119144 -0.00072292 1 0 1 1 0 0 +EDGE2 9983 9943 -0.00727462 -0.0128229 0.0425496 1 0 1 1 0 0 +EDGE2 9983 9963 -0.11494 -0.029764 -0.0104214 1 0 1 1 0 0 +EDGE2 9983 9944 0.970315 0.0781154 -0.0239156 1 0 1 1 0 0 +EDGE2 9983 9964 1.01991 -0.0640556 0.0235174 1 0 1 1 0 0 +EDGE2 9984 9943 -1.02839 -0.11603 0.0180376 1 0 1 1 0 0 +EDGE2 9984 9963 -0.984357 -0.00327964 -0.0228916 1 0 1 1 0 0 +EDGE2 9984 9983 -0.985981 -0.00122294 0.0178236 1 0 1 1 0 0 +EDGE2 9984 9945 0.884838 0.0105852 0.0310412 1 0 1 1 0 0 +EDGE2 9984 9944 0.0119864 -0.0223471 0.0160207 1 0 1 1 0 0 +EDGE2 9984 9964 0.107115 -0.00614457 0.0219325 1 0 1 1 0 0 +EDGE2 9984 9965 1.02945 0.0453907 -0.0193984 1 0 1 1 0 0 +EDGE2 9985 9984 -0.956967 -0.10065 0.0229707 1 0 1 1 0 0 +EDGE2 9985 9945 -0.0140688 0.0241779 -0.0128716 1 0 1 1 0 0 +EDGE2 9985 9944 -0.979109 0.021709 -0.00963079 1 0 1 1 0 0 +EDGE2 9985 9964 -1.04845 -0.0260821 -0.00840329 1 0 1 1 0 0 +EDGE2 9985 9965 0.0410056 0.034656 0.0418932 1 0 1 1 0 0 +EDGE2 9985 9966 -0.0566531 1.01909 1.60517 1 0 1 1 0 0 +EDGE2 9985 9946 0.000975926 0.938945 1.59152 1 0 1 1 0 0 +EDGE2 9986 9945 -0.942009 0.0372851 -1.56715 1 0 1 1 0 0 +EDGE2 9986 9985 -0.982474 -0.0502691 -1.5785 1 0 1 1 0 0 +EDGE2 9986 9965 -1.01188 0.0881034 -1.57594 1 0 1 1 0 0 +EDGE2 9986 9966 -0.0741433 -0.0371694 -0.0129409 1 0 1 1 0 0 +EDGE2 9986 9946 0.0518583 0.0498808 0.00124801 1 0 1 1 0 0 +EDGE2 9986 9947 1.05708 -0.0264766 0.0321957 1 0 1 1 0 0 +EDGE2 9986 9967 0.907793 0.00189378 -0.00495462 1 0 1 1 0 0 +EDGE2 9987 9966 -0.980042 0.014805 0.0095476 1 0 1 1 0 0 +EDGE2 9987 9986 -0.916629 0.00340798 -0.0010811 1 0 1 1 0 0 +EDGE2 9987 9946 -1.07254 -0.0125203 -0.0147272 1 0 1 1 0 0 +EDGE2 9987 9968 1.05277 -0.04326 0.00578507 1 0 1 1 0 0 +EDGE2 9987 9947 0.0040207 0.0609705 -0.00391564 1 0 1 1 0 0 +EDGE2 9987 9967 -0.0107163 -0.0345071 0.0134729 1 0 1 1 0 0 +EDGE2 9987 9948 1.09722 -0.0252031 -0.0362145 1 0 1 1 0 0 +EDGE2 9988 9968 -0.0255752 -0.0780364 0.00781202 1 0 1 1 0 0 +EDGE2 9988 9947 -0.997005 0.0589118 -0.0325045 1 0 1 1 0 0 +EDGE2 9988 9967 -1.08616 -0.0218412 0.0226354 1 0 1 1 0 0 +EDGE2 9988 9987 -0.953716 0.023411 -0.00253451 1 0 1 1 0 0 +EDGE2 9988 9969 0.928642 -0.00687772 0.0141544 1 0 1 1 0 0 +EDGE2 9988 9948 0.0553384 -0.00762286 0.000893548 1 0 1 1 0 0 +EDGE2 9988 9949 1.06109 -0.0297956 0.0281662 1 0 1 1 0 0 +EDGE2 9989 9968 -1.05156 0.094916 0.00412262 1 0 1 1 0 0 +EDGE2 9989 9988 -0.998252 0.0332681 -0.0109274 1 0 1 1 0 0 +EDGE2 9989 9969 0.0822594 -0.00454216 -0.0099297 1 0 1 1 0 0 +EDGE2 9989 9948 -0.99488 0.032823 -0.046435 1 0 1 1 0 0 +EDGE2 9989 9949 -0.0555519 0.00321065 -0.00815633 1 0 1 1 0 0 +EDGE2 9989 9950 1.07721 0.0262551 0.00715572 1 0 1 1 0 0 +EDGE2 9989 9970 0.90429 0.0457745 -0.0013907 1 0 1 1 0 0 +EDGE2 9989 9930 1.00469 0.0314184 -3.13217 1 0 1 1 0 0 +EDGE2 9990 9969 -0.990199 0.0307868 0.0402095 1 0 1 1 0 0 +EDGE2 9990 9989 -0.977053 0.0324903 0.0319904 1 0 1 1 0 0 +EDGE2 9990 9949 -0.998344 0.00673501 -0.0260794 1 0 1 1 0 0 +EDGE2 9990 9929 0.986876 0.0136709 -3.16603 1 0 1 1 0 0 +EDGE2 9990 9931 0.0132652 1.02613 1.57781 1 0 1 1 0 0 +EDGE2 9990 9971 -0.0662855 1.12175 1.5379 1 0 1 1 0 0 +EDGE2 9990 9951 0.0169318 1.08114 1.57184 1 0 1 1 0 0 +EDGE2 9990 9950 0.0128489 0.0209101 -0.00823881 1 0 1 1 0 0 +EDGE2 9990 9970 -0.0108107 -0.0398516 -0.0210968 1 0 1 1 0 0 +EDGE2 9990 9930 0.0448687 -0.0771179 -3.1554 1 0 1 1 0 0 +EDGE2 9991 9952 0.904354 0.0201252 -0.0147291 1 0 1 1 0 0 +EDGE2 9991 9972 0.995093 -0.00873829 -0.0075985 1 0 1 1 0 0 +EDGE2 9991 9931 0.0403917 -0.0807131 0.00836719 1 0 1 1 0 0 +EDGE2 9991 9971 0.0352368 0.0561818 0.0097316 1 0 1 1 0 0 +EDGE2 9991 9932 1.02437 -0.0215246 0.0119699 1 0 1 1 0 0 +EDGE2 9991 9951 0.0438919 -0.07143 -0.00690779 1 0 1 1 0 0 +EDGE2 9991 9950 -1.10678 -0.0124661 -1.56534 1 0 1 1 0 0 +EDGE2 9991 9970 -1.05958 -0.0268668 -1.54435 1 0 1 1 0 0 +EDGE2 9991 9990 -1.08273 0.0135279 -1.56372 1 0 1 1 0 0 +EDGE2 9991 9930 -1.06252 0.0222145 1.58823 1 0 1 1 0 0 +EDGE2 9992 9973 0.994931 -0.0781949 0.011626 1 0 1 1 0 0 +EDGE2 9992 9952 0.0451682 -0.0583854 -0.00514461 1 0 1 1 0 0 +EDGE2 9992 9933 0.902192 -0.0239871 0.0430919 1 0 1 1 0 0 +EDGE2 9992 9953 0.941141 -0.0481567 -0.0267531 1 0 1 1 0 0 +EDGE2 9992 9972 0.0344513 -0.111945 -0.049463 1 0 1 1 0 0 +EDGE2 9992 9931 -0.932447 -0.0379275 -0.00381691 1 0 1 1 0 0 +EDGE2 9992 9971 -0.922655 0.00223925 0.0202077 1 0 1 1 0 0 +EDGE2 9992 9991 -1.07828 0.0907608 0.0060057 1 0 1 1 0 0 +EDGE2 9992 9932 0.0381935 -0.0886821 -0.00655326 1 0 1 1 0 0 +EDGE2 9992 9951 -1.05711 0.0261438 -0.00149744 1 0 1 1 0 0 +EDGE2 9993 9973 0.0334104 -0.0146338 0.0184862 1 0 1 1 0 0 +EDGE2 9993 9974 0.994442 -0.092975 -0.0148388 1 0 1 1 0 0 +EDGE2 9993 9934 0.899773 0.0732678 -0.0282004 1 0 1 1 0 0 +EDGE2 9993 9954 0.954349 0.091508 -0.0169427 1 0 1 1 0 0 +EDGE2 9993 9952 -1.00225 0.00501641 0.00799495 1 0 1 1 0 0 +EDGE2 9993 9992 -1.07632 -0.034078 -0.00231772 1 0 1 1 0 0 +EDGE2 9993 9933 -0.0126879 0.0452899 0.028629 1 0 1 1 0 0 +EDGE2 9993 9953 -0.113523 -0.0482367 0.0141149 1 0 1 1 0 0 +EDGE2 9993 9972 -0.971601 -0.00404104 0.0126385 1 0 1 1 0 0 +EDGE2 9993 9932 -1.10659 0.10857 -0.0130569 1 0 1 1 0 0 +EDGE2 9994 9973 -1.00635 -0.0948706 -0.0266755 1 0 1 1 0 0 +EDGE2 9994 9974 0.00122984 -0.0599273 0.0254552 1 0 1 1 0 0 +EDGE2 9994 9935 1.08292 -0.0103118 -0.0116941 1 0 1 1 0 0 +EDGE2 9994 9955 1.0683 -0.0386638 0.0262951 1 0 1 1 0 0 +EDGE2 9994 9975 1.03902 -0.00881279 0.0152912 1 0 1 1 0 0 +EDGE2 9994 9934 0.0141688 0.00995855 0.0126057 1 0 1 1 0 0 +EDGE2 9994 9954 -0.0134907 0.00386401 -0.0240054 1 0 1 1 0 0 +EDGE2 9994 9993 -1.03418 0.0105625 0.014756 1 0 1 1 0 0 +EDGE2 9994 9933 -1.03279 -0.109813 0.00863115 1 0 1 1 0 0 +EDGE2 9994 9953 -1.02696 -0.0737765 0.00948242 1 0 1 1 0 0 +EDGE2 9995 9936 0.0123598 1.05037 1.56288 1 0 1 1 0 0 +EDGE2 9995 9956 -0.00524368 1.06889 1.54469 1 0 1 1 0 0 +EDGE2 9995 9976 0.0831912 0.968256 1.54323 1 0 1 1 0 0 +EDGE2 9995 9974 -1.00181 -0.0398423 -0.0363353 1 0 1 1 0 0 +EDGE2 9995 9935 0.0410013 0.0112739 0.00749004 1 0 1 1 0 0 +EDGE2 9995 9955 -0.0791036 -0.0309086 -0.0269903 1 0 1 1 0 0 +EDGE2 9995 9975 -0.0423802 0.0105921 -0.0197969 1 0 1 1 0 0 +EDGE2 9995 9994 -0.991372 0.0208305 -0.0166207 1 0 1 1 0 0 +EDGE2 9995 9934 -1.00805 0.0461122 0.0261096 1 0 1 1 0 0 +EDGE2 9995 9954 -0.971357 -0.0226929 0.00122834 1 0 1 1 0 0 +EDGE2 9996 9995 -1.0305 -0.0516601 1.5536 1 0 1 1 0 0 +EDGE2 9996 9935 -1.07333 0.0228608 1.58089 1 0 1 1 0 0 +EDGE2 9996 9955 -1.06228 -0.0441774 1.57012 1 0 1 1 0 0 +EDGE2 9996 9975 -1.01959 -0.00145766 1.58863 1 0 1 1 0 0 +EDGE2 9997 9996 -0.997533 -0.0758269 0.0317773 1 0 1 1 0 0 +EDGE2 9998 9997 -0.997111 -0.0589442 -0.0270152 1 0 1 1 0 0 +EDGE2 9999 9998 -1.0415 -0.0163109 -0.0371536 1 0 1 1 0 0 +EDGE2 9999 9920 0.985251 0.00231099 -3.14569 1 0 1 1 0 0 +EQUIV 21 1 +EQUIV 22 2 +EQUIV 23 3 +EQUIV 24 4 +EQUIV 25 5 +EQUIV 26 6 +EQUIV 27 7 +EQUIV 28 8 +EQUIV 29 9 +EQUIV 30 10 +EQUIV 31 11 +EQUIV 32 12 +EQUIV 33 13 +EQUIV 34 14 +EQUIV 35 15 +EQUIV 36 16 +EQUIV 37 17 +EQUIV 38 18 +EQUIV 39 19 +EQUIV 40 20 +EQUIV 41 1 +EQUIV 42 2 +EQUIV 43 3 +EQUIV 44 4 +EQUIV 45 5 +EQUIV 46 6 +EQUIV 47 7 +EQUIV 48 8 +EQUIV 49 9 +EQUIV 50 10 +EQUIV 51 11 +EQUIV 52 12 +EQUIV 53 13 +EQUIV 54 14 +EQUIV 55 15 +EQUIV 56 16 +EQUIV 57 17 +EQUIV 58 18 +EQUIV 59 19 +EQUIV 60 20 +EQUIV 101 61 +EQUIV 102 62 +EQUIV 103 63 +EQUIV 104 64 +EQUIV 105 65 +EQUIV 106 66 +EQUIV 107 67 +EQUIV 108 68 +EQUIV 109 69 +EQUIV 110 70 +EQUIV 111 71 +EQUIV 112 72 +EQUIV 113 73 +EQUIV 114 74 +EQUIV 115 75 +EQUIV 191 171 +EQUIV 192 172 +EQUIV 193 173 +EQUIV 194 174 +EQUIV 195 175 +EQUIV 196 176 +EQUIV 197 177 +EQUIV 198 178 +EQUIV 199 179 +EQUIV 200 180 +EQUIV 201 181 +EQUIV 202 182 +EQUIV 203 183 +EQUIV 204 184 +EQUIV 205 185 +EQUIV 226 206 +EQUIV 227 207 +EQUIV 228 208 +EQUIV 229 209 +EQUIV 230 210 +EQUIV 251 231 +EQUIV 252 232 +EQUIV 253 233 +EQUIV 254 234 +EQUIV 255 235 +EQUIV 286 266 +EQUIV 287 267 +EQUIV 288 268 +EQUIV 289 269 +EQUIV 290 270 +EQUIV 291 271 +EQUIV 292 272 +EQUIV 293 273 +EQUIV 294 274 +EQUIV 295 275 +EQUIV 296 276 +EQUIV 297 277 +EQUIV 298 278 +EQUIV 299 279 +EQUIV 300 280 +EQUIV 321 141 +EQUIV 322 142 +EQUIV 323 143 +EQUIV 324 144 +EQUIV 325 145 +EQUIV 326 146 +EQUIV 327 147 +EQUIV 328 148 +EQUIV 329 149 +EQUIV 330 150 +EQUIV 336 136 +EQUIV 337 137 +EQUIV 338 138 +EQUIV 339 139 +EQUIV 340 140 +EQUIV 341 141 +EQUIV 342 142 +EQUIV 343 143 +EQUIV 344 144 +EQUIV 345 145 +EQUIV 346 146 +EQUIV 347 147 +EQUIV 348 148 +EQUIV 349 149 +EQUIV 350 150 +EQUIV 351 151 +EQUIV 352 152 +EQUIV 353 153 +EQUIV 354 154 +EQUIV 355 155 +EQUIV 371 151 +EQUIV 372 152 +EQUIV 373 153 +EQUIV 374 154 +EQUIV 375 155 +EQUIV 376 156 +EQUIV 377 157 +EQUIV 378 158 +EQUIV 379 159 +EQUIV 380 160 +EQUIV 391 271 +EQUIV 392 272 +EQUIV 393 273 +EQUIV 394 274 +EQUIV 395 275 +EQUIV 396 276 +EQUIV 397 277 +EQUIV 398 278 +EQUIV 399 279 +EQUIV 400 280 +EQUIV 401 281 +EQUIV 402 282 +EQUIV 403 283 +EQUIV 404 284 +EQUIV 405 285 +EQUIV 406 266 +EQUIV 407 267 +EQUIV 408 268 +EQUIV 409 269 +EQUIV 410 270 +EQUIV 411 271 +EQUIV 412 272 +EQUIV 413 273 +EQUIV 414 274 +EQUIV 415 275 +EQUIV 416 316 +EQUIV 417 317 +EQUIV 418 318 +EQUIV 419 319 +EQUIV 420 320 +EQUIV 421 141 +EQUIV 422 142 +EQUIV 423 143 +EQUIV 424 144 +EQUIV 425 145 +EQUIV 426 386 +EQUIV 427 387 +EQUIV 428 388 +EQUIV 429 389 +EQUIV 430 390 +EQUIV 431 271 +EQUIV 432 272 +EQUIV 433 273 +EQUIV 434 274 +EQUIV 435 275 +EQUIV 436 276 +EQUIV 437 277 +EQUIV 438 278 +EQUIV 439 279 +EQUIV 440 280 +EQUIV 441 281 +EQUIV 442 282 +EQUIV 443 283 +EQUIV 444 284 +EQUIV 445 285 +EQUIV 446 266 +EQUIV 447 267 +EQUIV 448 268 +EQUIV 449 269 +EQUIV 450 270 +EQUIV 451 271 +EQUIV 452 272 +EQUIV 453 273 +EQUIV 454 274 +EQUIV 455 275 +EQUIV 456 276 +EQUIV 457 277 +EQUIV 458 278 +EQUIV 459 279 +EQUIV 460 280 +EQUIV 461 281 +EQUIV 462 282 +EQUIV 463 283 +EQUIV 464 284 +EQUIV 465 285 +EQUIV 466 266 +EQUIV 467 267 +EQUIV 468 268 +EQUIV 469 269 +EQUIV 470 270 +EQUIV 471 271 +EQUIV 472 272 +EQUIV 473 273 +EQUIV 474 274 +EQUIV 475 275 +EQUIV 476 276 +EQUIV 477 277 +EQUIV 478 278 +EQUIV 479 279 +EQUIV 480 280 +EQUIV 481 281 +EQUIV 482 282 +EQUIV 483 283 +EQUIV 484 284 +EQUIV 485 285 +EQUIV 496 256 +EQUIV 497 257 +EQUIV 498 258 +EQUIV 499 259 +EQUIV 500 260 +EQUIV 501 181 +EQUIV 502 182 +EQUIV 503 183 +EQUIV 504 184 +EQUIV 505 185 +EQUIV 506 186 +EQUIV 507 187 +EQUIV 508 188 +EQUIV 509 189 +EQUIV 510 190 +EQUIV 646 626 +EQUIV 647 627 +EQUIV 648 628 +EQUIV 649 629 +EQUIV 650 630 +EQUIV 651 631 +EQUIV 652 632 +EQUIV 653 633 +EQUIV 654 634 +EQUIV 655 635 +EQUIV 656 636 +EQUIV 657 637 +EQUIV 658 638 +EQUIV 659 639 +EQUIV 660 640 +EQUIV 731 711 +EQUIV 732 712 +EQUIV 733 713 +EQUIV 734 714 +EQUIV 735 715 +EQUIV 756 696 +EQUIV 757 697 +EQUIV 758 698 +EQUIV 759 699 +EQUIV 760 700 +EQUIV 761 741 +EQUIV 762 742 +EQUIV 763 743 +EQUIV 764 744 +EQUIV 765 745 +EQUIV 766 746 +EQUIV 767 747 +EQUIV 768 748 +EQUIV 769 749 +EQUIV 770 750 +EQUIV 771 751 +EQUIV 772 752 +EQUIV 773 753 +EQUIV 774 754 +EQUIV 775 755 +EQUIV 776 696 +EQUIV 777 697 +EQUIV 778 698 +EQUIV 779 699 +EQUIV 780 700 +EQUIV 781 741 +EQUIV 782 742 +EQUIV 783 743 +EQUIV 784 744 +EQUIV 785 745 +EQUIV 786 746 +EQUIV 787 747 +EQUIV 788 748 +EQUIV 789 749 +EQUIV 790 750 +EQUIV 791 751 +EQUIV 792 752 +EQUIV 793 753 +EQUIV 794 754 +EQUIV 795 755 +EQUIV 796 696 +EQUIV 797 697 +EQUIV 798 698 +EQUIV 799 699 +EQUIV 800 700 +EQUIV 801 741 +EQUIV 802 742 +EQUIV 803 743 +EQUIV 804 744 +EQUIV 805 745 +EQUIV 806 746 +EQUIV 807 747 +EQUIV 808 748 +EQUIV 809 749 +EQUIV 810 750 +EQUIV 811 751 +EQUIV 812 752 +EQUIV 813 753 +EQUIV 814 754 +EQUIV 815 755 +EQUIV 816 696 +EQUIV 817 697 +EQUIV 818 698 +EQUIV 819 699 +EQUIV 820 700 +EQUIV 821 701 +EQUIV 822 702 +EQUIV 823 703 +EQUIV 824 704 +EQUIV 825 705 +EQUIV 846 826 +EQUIV 847 827 +EQUIV 848 828 +EQUIV 849 829 +EQUIV 850 830 +EQUIV 851 831 +EQUIV 852 832 +EQUIV 853 833 +EQUIV 854 834 +EQUIV 855 835 +EQUIV 856 836 +EQUIV 857 837 +EQUIV 858 838 +EQUIV 859 839 +EQUIV 860 840 +EQUIV 861 841 +EQUIV 862 842 +EQUIV 863 843 +EQUIV 864 844 +EQUIV 865 845 +EQUIV 866 826 +EQUIV 867 827 +EQUIV 868 828 +EQUIV 869 829 +EQUIV 870 830 +EQUIV 871 691 +EQUIV 872 692 +EQUIV 873 693 +EQUIV 874 694 +EQUIV 875 695 +EQUIV 886 686 +EQUIV 887 687 +EQUIV 888 688 +EQUIV 889 689 +EQUIV 890 690 +EQUIV 891 831 +EQUIV 892 832 +EQUIV 893 833 +EQUIV 894 834 +EQUIV 895 835 +EQUIV 896 836 +EQUIV 897 837 +EQUIV 898 838 +EQUIV 899 839 +EQUIV 900 840 +EQUIV 901 841 +EQUIV 902 842 +EQUIV 903 843 +EQUIV 904 844 +EQUIV 905 845 +EQUIV 906 826 +EQUIV 907 827 +EQUIV 908 828 +EQUIV 909 829 +EQUIV 910 830 +EQUIV 911 831 +EQUIV 912 832 +EQUIV 913 833 +EQUIV 914 834 +EQUIV 915 835 +EQUIV 971 951 +EQUIV 972 952 +EQUIV 973 953 +EQUIV 974 954 +EQUIV 975 955 +EQUIV 976 936 +EQUIV 977 937 +EQUIV 978 938 +EQUIV 979 939 +EQUIV 980 940 +EQUIV 981 941 +EQUIV 982 942 +EQUIV 983 943 +EQUIV 984 944 +EQUIV 985 945 +EQUIV 1001 941 +EQUIV 1002 942 +EQUIV 1003 943 +EQUIV 1004 944 +EQUIV 1005 945 +EQUIV 1006 986 +EQUIV 1007 987 +EQUIV 1008 988 +EQUIV 1009 989 +EQUIV 1010 990 +EQUIV 1011 991 +EQUIV 1012 992 +EQUIV 1013 993 +EQUIV 1014 994 +EQUIV 1015 995 +EQUIV 1016 996 +EQUIV 1017 997 +EQUIV 1018 998 +EQUIV 1019 999 +EQUIV 1020 1000 +EQUIV 1021 941 +EQUIV 1022 942 +EQUIV 1023 943 +EQUIV 1024 944 +EQUIV 1025 945 +EQUIV 1026 986 +EQUIV 1027 987 +EQUIV 1028 988 +EQUIV 1029 989 +EQUIV 1030 990 +EQUIV 1051 991 +EQUIV 1052 992 +EQUIV 1053 993 +EQUIV 1054 994 +EQUIV 1055 995 +EQUIV 1056 996 +EQUIV 1057 997 +EQUIV 1058 998 +EQUIV 1059 999 +EQUIV 1060 1000 +EQUIV 1061 941 +EQUIV 1062 942 +EQUIV 1063 943 +EQUIV 1064 944 +EQUIV 1065 945 +EQUIV 1066 986 +EQUIV 1067 987 +EQUIV 1068 988 +EQUIV 1069 989 +EQUIV 1070 990 +EQUIV 1071 991 +EQUIV 1072 992 +EQUIV 1073 993 +EQUIV 1074 994 +EQUIV 1075 995 +EQUIV 1116 1096 +EQUIV 1117 1097 +EQUIV 1118 1098 +EQUIV 1119 1099 +EQUIV 1120 1100 +EQUIV 1121 1101 +EQUIV 1122 1102 +EQUIV 1123 1103 +EQUIV 1124 1104 +EQUIV 1125 1105 +EQUIV 1126 1106 +EQUIV 1127 1107 +EQUIV 1128 1108 +EQUIV 1129 1109 +EQUIV 1130 1110 +EQUIV 1131 1111 +EQUIV 1132 1112 +EQUIV 1133 1113 +EQUIV 1134 1114 +EQUIV 1135 1115 +EQUIV 1136 1096 +EQUIV 1137 1097 +EQUIV 1138 1098 +EQUIV 1139 1099 +EQUIV 1140 1100 +EQUIV 1141 1101 +EQUIV 1142 1102 +EQUIV 1143 1103 +EQUIV 1144 1104 +EQUIV 1145 1105 +EQUIV 1146 1106 +EQUIV 1147 1107 +EQUIV 1148 1108 +EQUIV 1149 1109 +EQUIV 1150 1110 +EQUIV 1171 1151 +EQUIV 1172 1152 +EQUIV 1173 1153 +EQUIV 1174 1154 +EQUIV 1175 1155 +EQUIV 1176 1156 +EQUIV 1177 1157 +EQUIV 1178 1158 +EQUIV 1179 1159 +EQUIV 1180 1160 +EQUIV 1181 1161 +EQUIV 1182 1162 +EQUIV 1183 1163 +EQUIV 1184 1164 +EQUIV 1185 1165 +EQUIV 1186 1166 +EQUIV 1187 1167 +EQUIV 1188 1168 +EQUIV 1189 1169 +EQUIV 1190 1170 +EQUIV 1191 1151 +EQUIV 1192 1152 +EQUIV 1193 1153 +EQUIV 1194 1154 +EQUIV 1195 1155 +EQUIV 1196 1156 +EQUIV 1197 1157 +EQUIV 1198 1158 +EQUIV 1199 1159 +EQUIV 1200 1160 +EQUIV 1201 841 +EQUIV 1202 842 +EQUIV 1203 843 +EQUIV 1204 844 +EQUIV 1205 845 +EQUIV 1206 706 +EQUIV 1207 707 +EQUIV 1208 708 +EQUIV 1209 709 +EQUIV 1210 710 +EQUIV 1211 711 +EQUIV 1212 712 +EQUIV 1213 713 +EQUIV 1214 714 +EQUIV 1215 715 +EQUIV 1216 716 +EQUIV 1217 717 +EQUIV 1218 718 +EQUIV 1219 719 +EQUIV 1220 720 +EQUIV 1251 1231 +EQUIV 1252 1232 +EQUIV 1253 1233 +EQUIV 1254 1234 +EQUIV 1255 1235 +EQUIV 1291 1271 +EQUIV 1292 1272 +EQUIV 1293 1273 +EQUIV 1294 1274 +EQUIV 1295 1275 +EQUIV 1296 1276 +EQUIV 1297 1277 +EQUIV 1298 1278 +EQUIV 1299 1279 +EQUIV 1300 1280 +EQUIV 1301 1281 +EQUIV 1302 1282 +EQUIV 1303 1283 +EQUIV 1304 1284 +EQUIV 1305 1285 +EQUIV 1346 1326 +EQUIV 1347 1327 +EQUIV 1348 1328 +EQUIV 1349 1329 +EQUIV 1350 1330 +EQUIV 1351 1331 +EQUIV 1352 1332 +EQUIV 1353 1333 +EQUIV 1354 1334 +EQUIV 1355 1335 +EQUIV 1356 1336 +EQUIV 1357 1337 +EQUIV 1358 1338 +EQUIV 1359 1339 +EQUIV 1360 1340 +EQUIV 1361 1341 +EQUIV 1362 1342 +EQUIV 1363 1343 +EQUIV 1364 1344 +EQUIV 1365 1345 +EQUIV 1411 1391 +EQUIV 1412 1392 +EQUIV 1413 1393 +EQUIV 1414 1394 +EQUIV 1415 1395 +EQUIV 1416 1396 +EQUIV 1417 1397 +EQUIV 1418 1398 +EQUIV 1419 1399 +EQUIV 1420 1400 +EQUIV 1421 1401 +EQUIV 1422 1402 +EQUIV 1423 1403 +EQUIV 1424 1404 +EQUIV 1425 1405 +EQUIV 1426 1406 +EQUIV 1427 1407 +EQUIV 1428 1408 +EQUIV 1429 1409 +EQUIV 1430 1410 +EQUIV 1431 1391 +EQUIV 1432 1392 +EQUIV 1433 1393 +EQUIV 1434 1394 +EQUIV 1435 1395 +EQUIV 1436 1396 +EQUIV 1437 1397 +EQUIV 1438 1398 +EQUIV 1439 1399 +EQUIV 1440 1400 +EQUIV 1441 1401 +EQUIV 1442 1402 +EQUIV 1443 1403 +EQUIV 1444 1404 +EQUIV 1445 1405 +EQUIV 1446 1406 +EQUIV 1447 1407 +EQUIV 1448 1408 +EQUIV 1449 1409 +EQUIV 1450 1410 +EQUIV 1451 1391 +EQUIV 1452 1392 +EQUIV 1453 1393 +EQUIV 1454 1394 +EQUIV 1455 1395 +EQUIV 1481 1341 +EQUIV 1482 1342 +EQUIV 1483 1343 +EQUIV 1484 1344 +EQUIV 1485 1345 +EQUIV 1486 1326 +EQUIV 1487 1327 +EQUIV 1488 1328 +EQUIV 1489 1329 +EQUIV 1490 1330 +EQUIV 1491 1331 +EQUIV 1492 1332 +EQUIV 1493 1333 +EQUIV 1494 1334 +EQUIV 1495 1335 +EQUIV 1496 1336 +EQUIV 1497 1337 +EQUIV 1498 1338 +EQUIV 1499 1339 +EQUIV 1500 1340 +EQUIV 1501 1341 +EQUIV 1502 1342 +EQUIV 1503 1343 +EQUIV 1504 1344 +EQUIV 1505 1345 +EQUIV 1506 1366 +EQUIV 1507 1367 +EQUIV 1508 1368 +EQUIV 1509 1369 +EQUIV 1510 1370 +EQUIV 1511 1371 +EQUIV 1512 1372 +EQUIV 1513 1373 +EQUIV 1514 1374 +EQUIV 1515 1375 +EQUIV 1521 1321 +EQUIV 1522 1322 +EQUIV 1523 1323 +EQUIV 1524 1324 +EQUIV 1525 1325 +EQUIV 1526 1366 +EQUIV 1527 1367 +EQUIV 1528 1368 +EQUIV 1529 1369 +EQUIV 1530 1370 +EQUIV 1531 1371 +EQUIV 1532 1372 +EQUIV 1533 1373 +EQUIV 1534 1374 +EQUIV 1535 1375 +EQUIV 1536 1376 +EQUIV 1537 1377 +EQUIV 1538 1378 +EQUIV 1539 1379 +EQUIV 1540 1380 +EQUIV 1561 1541 +EQUIV 1562 1542 +EQUIV 1563 1543 +EQUIV 1564 1544 +EQUIV 1565 1545 +EQUIV 1566 1266 +EQUIV 1567 1267 +EQUIV 1568 1268 +EQUIV 1569 1269 +EQUIV 1570 1270 +EQUIV 1576 1376 +EQUIV 1577 1377 +EQUIV 1578 1378 +EQUIV 1579 1379 +EQUIV 1580 1380 +EQUIV 1581 1541 +EQUIV 1582 1542 +EQUIV 1583 1543 +EQUIV 1584 1544 +EQUIV 1585 1545 +EQUIV 1586 1266 +EQUIV 1587 1267 +EQUIV 1588 1268 +EQUIV 1589 1269 +EQUIV 1590 1270 +EQUIV 1591 1571 +EQUIV 1592 1572 +EQUIV 1593 1573 +EQUIV 1594 1574 +EQUIV 1595 1575 +EQUIV 1596 1516 +EQUIV 1597 1517 +EQUIV 1598 1518 +EQUIV 1599 1519 +EQUIV 1600 1520 +EQUIV 1606 1306 +EQUIV 1607 1307 +EQUIV 1608 1308 +EQUIV 1609 1309 +EQUIV 1610 1310 +EQUIV 1611 1311 +EQUIV 1612 1312 +EQUIV 1613 1313 +EQUIV 1614 1314 +EQUIV 1615 1315 +EQUIV 1616 1316 +EQUIV 1617 1317 +EQUIV 1618 1318 +EQUIV 1619 1319 +EQUIV 1620 1320 +EQUIV 1621 1601 +EQUIV 1622 1602 +EQUIV 1623 1603 +EQUIV 1624 1604 +EQUIV 1625 1605 +EQUIV 1626 1306 +EQUIV 1627 1307 +EQUIV 1628 1308 +EQUIV 1629 1309 +EQUIV 1630 1310 +EQUIV 1631 1311 +EQUIV 1632 1312 +EQUIV 1633 1313 +EQUIV 1634 1314 +EQUIV 1635 1315 +EQUIV 1636 1316 +EQUIV 1637 1317 +EQUIV 1638 1318 +EQUIV 1639 1319 +EQUIV 1640 1320 +EQUIV 1641 1321 +EQUIV 1642 1322 +EQUIV 1643 1323 +EQUIV 1644 1324 +EQUIV 1645 1325 +EQUIV 1646 1366 +EQUIV 1647 1367 +EQUIV 1648 1368 +EQUIV 1649 1369 +EQUIV 1650 1370 +EQUIV 1651 1371 +EQUIV 1652 1372 +EQUIV 1653 1373 +EQUIV 1654 1374 +EQUIV 1655 1375 +EQUIV 1656 1376 +EQUIV 1657 1377 +EQUIV 1658 1378 +EQUIV 1659 1379 +EQUIV 1660 1380 +EQUIV 1661 1381 +EQUIV 1662 1382 +EQUIV 1663 1383 +EQUIV 1664 1384 +EQUIV 1665 1385 +EQUIV 1666 1466 +EQUIV 1667 1467 +EQUIV 1668 1468 +EQUIV 1669 1469 +EQUIV 1670 1470 +EQUIV 1671 1471 +EQUIV 1672 1472 +EQUIV 1673 1473 +EQUIV 1674 1474 +EQUIV 1675 1475 +EQUIV 1676 1476 +EQUIV 1677 1477 +EQUIV 1678 1478 +EQUIV 1679 1479 +EQUIV 1680 1480 +EQUIV 1701 1461 +EQUIV 1702 1462 +EQUIV 1703 1463 +EQUIV 1704 1464 +EQUIV 1705 1465 +EQUIV 1706 1466 +EQUIV 1707 1467 +EQUIV 1708 1468 +EQUIV 1709 1469 +EQUIV 1710 1470 +EQUIV 1711 1471 +EQUIV 1712 1472 +EQUIV 1713 1473 +EQUIV 1714 1474 +EQUIV 1715 1475 +EQUIV 1716 1696 +EQUIV 1717 1697 +EQUIV 1718 1698 +EQUIV 1719 1699 +EQUIV 1720 1700 +EQUIV 1736 1456 +EQUIV 1737 1457 +EQUIV 1738 1458 +EQUIV 1739 1459 +EQUIV 1740 1460 +EQUIV 1741 1721 +EQUIV 1742 1722 +EQUIV 1743 1723 +EQUIV 1744 1724 +EQUIV 1745 1725 +EQUIV 1746 1726 +EQUIV 1747 1727 +EQUIV 1748 1728 +EQUIV 1749 1729 +EQUIV 1750 1730 +EQUIV 1751 1731 +EQUIV 1752 1732 +EQUIV 1753 1733 +EQUIV 1754 1734 +EQUIV 1755 1735 +EQUIV 1756 1396 +EQUIV 1757 1397 +EQUIV 1758 1398 +EQUIV 1759 1399 +EQUIV 1760 1400 +EQUIV 1831 1551 +EQUIV 1832 1552 +EQUIV 1833 1553 +EQUIV 1834 1554 +EQUIV 1835 1555 +EQUIV 1836 1556 +EQUIV 1837 1557 +EQUIV 1838 1558 +EQUIV 1839 1559 +EQUIV 1840 1560 +EQUIV 1841 1541 +EQUIV 1842 1542 +EQUIV 1843 1543 +EQUIV 1844 1544 +EQUIV 1845 1545 +EQUIV 1846 1266 +EQUIV 1847 1267 +EQUIV 1848 1268 +EQUIV 1849 1269 +EQUIV 1850 1270 +EQUIV 1851 1571 +EQUIV 1852 1572 +EQUIV 1853 1573 +EQUIV 1854 1574 +EQUIV 1855 1575 +EQUIV 1856 1376 +EQUIV 1857 1377 +EQUIV 1858 1378 +EQUIV 1859 1379 +EQUIV 1860 1380 +EQUIV 1861 1381 +EQUIV 1862 1382 +EQUIV 1863 1383 +EQUIV 1864 1384 +EQUIV 1865 1385 +EQUIV 1866 1466 +EQUIV 1867 1467 +EQUIV 1868 1468 +EQUIV 1869 1469 +EQUIV 1870 1470 +EQUIV 1871 1471 +EQUIV 1872 1472 +EQUIV 1873 1473 +EQUIV 1874 1474 +EQUIV 1875 1475 +EQUIV 1876 1476 +EQUIV 1877 1477 +EQUIV 1878 1478 +EQUIV 1879 1479 +EQUIV 1880 1480 +EQUIV 1881 1681 +EQUIV 1882 1682 +EQUIV 1883 1683 +EQUIV 1884 1684 +EQUIV 1885 1685 +EQUIV 1886 1686 +EQUIV 1887 1687 +EQUIV 1888 1688 +EQUIV 1889 1689 +EQUIV 1890 1690 +EQUIV 1891 1691 +EQUIV 1892 1692 +EQUIV 1893 1693 +EQUIV 1894 1694 +EQUIV 1895 1695 +EQUIV 1896 1476 +EQUIV 1897 1477 +EQUIV 1898 1478 +EQUIV 1899 1479 +EQUIV 1900 1480 +EQUIV 1901 1341 +EQUIV 1902 1342 +EQUIV 1903 1343 +EQUIV 1904 1344 +EQUIV 1905 1345 +EQUIV 1906 1326 +EQUIV 1907 1327 +EQUIV 1908 1328 +EQUIV 1909 1329 +EQUIV 1910 1330 +EQUIV 1911 1331 +EQUIV 1912 1332 +EQUIV 1913 1333 +EQUIV 1914 1334 +EQUIV 1915 1335 +EQUIV 1916 1336 +EQUIV 1917 1337 +EQUIV 1918 1338 +EQUIV 1919 1339 +EQUIV 1920 1340 +EQUIV 1921 1341 +EQUIV 1922 1342 +EQUIV 1923 1343 +EQUIV 1924 1344 +EQUIV 1925 1345 +EQUIV 1926 1366 +EQUIV 1927 1367 +EQUIV 1928 1368 +EQUIV 1929 1369 +EQUIV 1930 1370 +EQUIV 1931 1471 +EQUIV 1932 1472 +EQUIV 1933 1473 +EQUIV 1934 1474 +EQUIV 1935 1475 +EQUIV 1936 1696 +EQUIV 1937 1697 +EQUIV 1938 1698 +EQUIV 1939 1699 +EQUIV 1940 1700 +EQUIV 1941 1721 +EQUIV 1942 1722 +EQUIV 1943 1723 +EQUIV 1944 1724 +EQUIV 1945 1725 +EQUIV 1946 1726 +EQUIV 1947 1727 +EQUIV 1948 1728 +EQUIV 1949 1729 +EQUIV 1950 1730 +EQUIV 1976 1956 +EQUIV 1977 1957 +EQUIV 1978 1958 +EQUIV 1979 1959 +EQUIV 1980 1960 +EQUIV 1981 1961 +EQUIV 1982 1962 +EQUIV 1983 1963 +EQUIV 1984 1964 +EQUIV 1985 1965 +EQUIV 1986 1966 +EQUIV 1987 1967 +EQUIV 1988 1968 +EQUIV 1989 1969 +EQUIV 1990 1970 +EQUIV 2031 1771 +EQUIV 2032 1772 +EQUIV 2033 1773 +EQUIV 2034 1774 +EQUIV 2035 1775 +EQUIV 2036 1776 +EQUIV 2037 1777 +EQUIV 2038 1778 +EQUIV 2039 1779 +EQUIV 2040 1780 +EQUIV 2041 1781 +EQUIV 2042 1782 +EQUIV 2043 1783 +EQUIV 2044 1784 +EQUIV 2045 1785 +EQUIV 2046 1786 +EQUIV 2047 1787 +EQUIV 2048 1788 +EQUIV 2049 1789 +EQUIV 2050 1790 +EQUIV 2061 1761 +EQUIV 2062 1762 +EQUIV 2063 1763 +EQUIV 2064 1764 +EQUIV 2065 1765 +EQUIV 2066 1766 +EQUIV 2067 1767 +EQUIV 2068 1768 +EQUIV 2069 1769 +EQUIV 2070 1770 +EQUIV 2076 2016 +EQUIV 2077 2017 +EQUIV 2078 2018 +EQUIV 2079 2019 +EQUIV 2080 2020 +EQUIV 2101 2021 +EQUIV 2102 2022 +EQUIV 2103 2023 +EQUIV 2104 2024 +EQUIV 2105 2025 +EQUIV 2106 2026 +EQUIV 2107 2027 +EQUIV 2108 2028 +EQUIV 2109 2029 +EQUIV 2110 2030 +EQUIV 2111 1771 +EQUIV 2112 1772 +EQUIV 2113 1773 +EQUIV 2114 1774 +EQUIV 2115 1775 +EQUIV 2116 2056 +EQUIV 2117 2057 +EQUIV 2118 2058 +EQUIV 2119 2059 +EQUIV 2120 2060 +EQUIV 2121 1761 +EQUIV 2122 1762 +EQUIV 2123 1763 +EQUIV 2124 1764 +EQUIV 2125 1765 +EQUIV 2126 1766 +EQUIV 2127 1767 +EQUIV 2128 1768 +EQUIV 2129 1769 +EQUIV 2130 1770 +EQUIV 2131 1771 +EQUIV 2132 1772 +EQUIV 2133 1773 +EQUIV 2134 1774 +EQUIV 2135 1775 +EQUIV 2136 2056 +EQUIV 2137 2057 +EQUIV 2138 2058 +EQUIV 2139 2059 +EQUIV 2140 2060 +EQUIV 2141 1761 +EQUIV 2142 1762 +EQUIV 2143 1763 +EQUIV 2144 1764 +EQUIV 2145 1765 +EQUIV 2146 1766 +EQUIV 2147 1767 +EQUIV 2148 1768 +EQUIV 2149 1769 +EQUIV 2150 1770 +EQUIV 2151 1771 +EQUIV 2152 1772 +EQUIV 2153 1773 +EQUIV 2154 1774 +EQUIV 2155 1775 +EQUIV 2156 2056 +EQUIV 2157 2057 +EQUIV 2158 2058 +EQUIV 2159 2059 +EQUIV 2160 2060 +EQUIV 2161 1401 +EQUIV 2162 1402 +EQUIV 2163 1403 +EQUIV 2164 1404 +EQUIV 2165 1405 +EQUIV 2166 1406 +EQUIV 2167 1407 +EQUIV 2168 1408 +EQUIV 2169 1409 +EQUIV 2170 1410 +EQUIV 2171 1391 +EQUIV 2172 1392 +EQUIV 2173 1393 +EQUIV 2174 1394 +EQUIV 2175 1395 +EQUIV 2176 1396 +EQUIV 2177 1397 +EQUIV 2178 1398 +EQUIV 2179 1399 +EQUIV 2180 1400 +EQUIV 2181 1401 +EQUIV 2182 1402 +EQUIV 2183 1403 +EQUIV 2184 1404 +EQUIV 2185 1405 +EQUIV 2191 1791 +EQUIV 2192 1792 +EQUIV 2193 1793 +EQUIV 2194 1794 +EQUIV 2195 1795 +EQUIV 2231 1811 +EQUIV 2232 1812 +EQUIV 2233 1813 +EQUIV 2234 1814 +EQUIV 2235 1815 +EQUIV 2236 1816 +EQUIV 2237 1817 +EQUIV 2238 1818 +EQUIV 2239 1819 +EQUIV 2240 1820 +EQUIV 2241 1821 +EQUIV 2242 1822 +EQUIV 2243 1823 +EQUIV 2244 1824 +EQUIV 2245 1825 +EQUIV 2246 1806 +EQUIV 2247 1807 +EQUIV 2248 1808 +EQUIV 2249 1809 +EQUIV 2250 1810 +EQUIV 2251 1811 +EQUIV 2252 1812 +EQUIV 2253 1813 +EQUIV 2254 1814 +EQUIV 2255 1815 +EQUIV 2266 2226 +EQUIV 2267 2227 +EQUIV 2268 2228 +EQUIV 2269 2229 +EQUIV 2270 2230 +EQUIV 2271 1811 +EQUIV 2272 1812 +EQUIV 2273 1813 +EQUIV 2274 1814 +EQUIV 2275 1815 +EQUIV 2276 1816 +EQUIV 2277 1817 +EQUIV 2278 1818 +EQUIV 2279 1819 +EQUIV 2280 1820 +EQUIV 2281 1241 +EQUIV 2282 1242 +EQUIV 2283 1243 +EQUIV 2284 1244 +EQUIV 2285 1245 +EQUIV 2286 1246 +EQUIV 2287 1247 +EQUIV 2288 1248 +EQUIV 2289 1249 +EQUIV 2290 1250 +EQUIV 2291 1231 +EQUIV 2292 1232 +EQUIV 2293 1233 +EQUIV 2294 1234 +EQUIV 2295 1235 +EQUIV 2296 1256 +EQUIV 2297 1257 +EQUIV 2298 1258 +EQUIV 2299 1259 +EQUIV 2300 1260 +EQUIV 2301 1261 +EQUIV 2302 1262 +EQUIV 2303 1263 +EQUIV 2304 1264 +EQUIV 2305 1265 +EQUIV 2306 1266 +EQUIV 2307 1267 +EQUIV 2308 1268 +EQUIV 2309 1269 +EQUIV 2310 1270 +EQUIV 2311 1571 +EQUIV 2312 1572 +EQUIV 2313 1573 +EQUIV 2314 1574 +EQUIV 2315 1575 +EQUIV 2316 1516 +EQUIV 2317 1517 +EQUIV 2318 1518 +EQUIV 2319 1519 +EQUIV 2320 1520 +EQUIV 2321 1321 +EQUIV 2322 1322 +EQUIV 2323 1323 +EQUIV 2324 1324 +EQUIV 2325 1325 +EQUIV 2326 1366 +EQUIV 2327 1367 +EQUIV 2328 1368 +EQUIV 2329 1369 +EQUIV 2330 1370 +EQUIV 2331 1371 +EQUIV 2332 1372 +EQUIV 2333 1373 +EQUIV 2334 1374 +EQUIV 2335 1375 +EQUIV 2336 1516 +EQUIV 2337 1517 +EQUIV 2338 1518 +EQUIV 2339 1519 +EQUIV 2340 1520 +EQUIV 2341 1321 +EQUIV 2342 1322 +EQUIV 2343 1323 +EQUIV 2344 1324 +EQUIV 2345 1325 +EQUIV 2346 1366 +EQUIV 2347 1367 +EQUIV 2348 1368 +EQUIV 2349 1369 +EQUIV 2350 1370 +EQUIV 2351 1371 +EQUIV 2352 1372 +EQUIV 2353 1373 +EQUIV 2354 1374 +EQUIV 2355 1375 +EQUIV 2356 1516 +EQUIV 2357 1517 +EQUIV 2358 1518 +EQUIV 2359 1519 +EQUIV 2360 1520 +EQUIV 2361 1321 +EQUIV 2362 1322 +EQUIV 2363 1323 +EQUIV 2364 1324 +EQUIV 2365 1325 +EQUIV 2366 1366 +EQUIV 2367 1367 +EQUIV 2368 1368 +EQUIV 2369 1369 +EQUIV 2370 1370 +EQUIV 2371 1371 +EQUIV 2372 1372 +EQUIV 2373 1373 +EQUIV 2374 1374 +EQUIV 2375 1375 +EQUIV 2376 1376 +EQUIV 2377 1377 +EQUIV 2378 1378 +EQUIV 2379 1379 +EQUIV 2380 1380 +EQUIV 2381 1541 +EQUIV 2382 1542 +EQUIV 2383 1543 +EQUIV 2384 1544 +EQUIV 2385 1545 +EQUIV 2386 1266 +EQUIV 2387 1267 +EQUIV 2388 1268 +EQUIV 2389 1269 +EQUIV 2390 1270 +EQUIV 2391 1571 +EQUIV 2392 1572 +EQUIV 2393 1573 +EQUIV 2394 1574 +EQUIV 2395 1575 +EQUIV 2396 1376 +EQUIV 2397 1377 +EQUIV 2398 1378 +EQUIV 2399 1379 +EQUIV 2400 1380 +EQUIV 2401 1541 +EQUIV 2402 1542 +EQUIV 2403 1543 +EQUIV 2404 1544 +EQUIV 2405 1545 +EQUIV 2406 1546 +EQUIV 2407 1547 +EQUIV 2408 1548 +EQUIV 2409 1549 +EQUIV 2410 1550 +EQUIV 2416 1256 +EQUIV 2417 1257 +EQUIV 2418 1258 +EQUIV 2419 1259 +EQUIV 2420 1260 +EQUIV 2421 1261 +EQUIV 2422 1262 +EQUIV 2423 1263 +EQUIV 2424 1264 +EQUIV 2425 1265 +EQUIV 2426 1546 +EQUIV 2427 1547 +EQUIV 2428 1548 +EQUIV 2429 1549 +EQUIV 2430 1550 +EQUIV 2431 2411 +EQUIV 2432 2412 +EQUIV 2433 2413 +EQUIV 2434 2414 +EQUIV 2435 2415 +EQUIV 2436 1256 +EQUIV 2437 1257 +EQUIV 2438 1258 +EQUIV 2439 1259 +EQUIV 2440 1260 +EQUIV 2446 1226 +EQUIV 2447 1227 +EQUIV 2448 1228 +EQUIV 2449 1229 +EQUIV 2450 1230 +EQUIV 2451 1231 +EQUIV 2452 1232 +EQUIV 2453 1233 +EQUIV 2454 1234 +EQUIV 2455 1235 +EQUIV 2456 1236 +EQUIV 2457 1237 +EQUIV 2458 1238 +EQUIV 2459 1239 +EQUIV 2460 1240 +EQUIV 2461 1241 +EQUIV 2462 1242 +EQUIV 2463 1243 +EQUIV 2464 1244 +EQUIV 2465 1245 +EQUIV 2466 1246 +EQUIV 2467 1247 +EQUIV 2468 1248 +EQUIV 2469 1249 +EQUIV 2470 1250 +EQUIV 2476 716 +EQUIV 2477 717 +EQUIV 2478 718 +EQUIV 2479 719 +EQUIV 2480 720 +EQUIV 2481 1221 +EQUIV 2482 1222 +EQUIV 2483 1223 +EQUIV 2484 1224 +EQUIV 2485 1225 +EQUIV 2486 1226 +EQUIV 2487 1227 +EQUIV 2488 1228 +EQUIV 2489 1229 +EQUIV 2490 1230 +EQUIV 2491 1231 +EQUIV 2492 1232 +EQUIV 2493 1233 +EQUIV 2494 1234 +EQUIV 2495 1235 +EQUIV 2496 1256 +EQUIV 2497 1257 +EQUIV 2498 1258 +EQUIV 2499 1259 +EQUIV 2500 1260 +EQUIV 2501 2441 +EQUIV 2502 2442 +EQUIV 2503 2443 +EQUIV 2504 2444 +EQUIV 2505 2445 +EQUIV 2521 1261 +EQUIV 2522 1262 +EQUIV 2523 1263 +EQUIV 2524 1264 +EQUIV 2525 1265 +EQUIV 2526 1546 +EQUIV 2527 1547 +EQUIV 2528 1548 +EQUIV 2529 1549 +EQUIV 2530 1550 +EQUIV 2531 2411 +EQUIV 2532 2412 +EQUIV 2533 2413 +EQUIV 2534 2414 +EQUIV 2535 2415 +EQUIV 2536 1256 +EQUIV 2537 1257 +EQUIV 2538 1258 +EQUIV 2539 1259 +EQUIV 2540 1260 +EQUIV 2541 1261 +EQUIV 2542 1262 +EQUIV 2543 1263 +EQUIV 2544 1264 +EQUIV 2545 1265 +EQUIV 2546 1546 +EQUIV 2547 1547 +EQUIV 2548 1548 +EQUIV 2549 1549 +EQUIV 2550 1550 +EQUIV 2551 2411 +EQUIV 2552 2412 +EQUIV 2553 2413 +EQUIV 2554 2414 +EQUIV 2555 2415 +EQUIV 2556 1256 +EQUIV 2557 1257 +EQUIV 2558 1258 +EQUIV 2559 1259 +EQUIV 2560 1260 +EQUIV 2561 1261 +EQUIV 2562 1262 +EQUIV 2563 1263 +EQUIV 2564 1264 +EQUIV 2565 1265 +EQUIV 2566 1546 +EQUIV 2567 1547 +EQUIV 2568 1548 +EQUIV 2569 1549 +EQUIV 2570 1550 +EQUIV 2571 2411 +EQUIV 2572 2412 +EQUIV 2573 2413 +EQUIV 2574 2414 +EQUIV 2575 2415 +EQUIV 2576 1256 +EQUIV 2577 1257 +EQUIV 2578 1258 +EQUIV 2579 1259 +EQUIV 2580 1260 +EQUIV 2581 1261 +EQUIV 2582 1262 +EQUIV 2583 1263 +EQUIV 2584 1264 +EQUIV 2585 1265 +EQUIV 2586 1546 +EQUIV 2587 1547 +EQUIV 2588 1548 +EQUIV 2589 1549 +EQUIV 2590 1550 +EQUIV 2591 2411 +EQUIV 2592 2412 +EQUIV 2593 2413 +EQUIV 2594 2414 +EQUIV 2595 2415 +EQUIV 2596 1256 +EQUIV 2597 1257 +EQUIV 2598 1258 +EQUIV 2599 1259 +EQUIV 2600 1260 +EQUIV 2601 2441 +EQUIV 2602 2442 +EQUIV 2603 2443 +EQUIV 2604 2444 +EQUIV 2605 2445 +EQUIV 2606 2506 +EQUIV 2607 2507 +EQUIV 2608 2508 +EQUIV 2609 2509 +EQUIV 2610 2510 +EQUIV 2631 2511 +EQUIV 2632 2512 +EQUIV 2633 2513 +EQUIV 2634 2514 +EQUIV 2635 2515 +EQUIV 2636 2516 +EQUIV 2637 2517 +EQUIV 2638 2518 +EQUIV 2639 2519 +EQUIV 2640 2520 +EQUIV 2641 2441 +EQUIV 2642 2442 +EQUIV 2643 2443 +EQUIV 2644 2444 +EQUIV 2645 2445 +EQUIV 2646 2506 +EQUIV 2647 2507 +EQUIV 2648 2508 +EQUIV 2649 2509 +EQUIV 2650 2510 +EQUIV 2651 2511 +EQUIV 2652 2512 +EQUIV 2653 2513 +EQUIV 2654 2514 +EQUIV 2655 2515 +EQUIV 2656 2516 +EQUIV 2657 2517 +EQUIV 2658 2518 +EQUIV 2659 2519 +EQUIV 2660 2520 +EQUIV 2661 2441 +EQUIV 2662 2442 +EQUIV 2663 2443 +EQUIV 2664 2444 +EQUIV 2665 2445 +EQUIV 2666 2506 +EQUIV 2667 2507 +EQUIV 2668 2508 +EQUIV 2669 2509 +EQUIV 2670 2510 +EQUIV 2671 2611 +EQUIV 2672 2612 +EQUIV 2673 2613 +EQUIV 2674 2614 +EQUIV 2675 2615 +EQUIV 2676 2616 +EQUIV 2677 2617 +EQUIV 2678 2618 +EQUIV 2679 2619 +EQUIV 2680 2620 +EQUIV 2681 2621 +EQUIV 2682 2622 +EQUIV 2683 2623 +EQUIV 2684 2624 +EQUIV 2685 2625 +EQUIV 2686 2626 +EQUIV 2687 2627 +EQUIV 2688 2628 +EQUIV 2689 2629 +EQUIV 2690 2630 +EQUIV 2691 2611 +EQUIV 2692 2612 +EQUIV 2693 2613 +EQUIV 2694 2614 +EQUIV 2695 2615 +EQUIV 2696 2616 +EQUIV 2697 2617 +EQUIV 2698 2618 +EQUIV 2699 2619 +EQUIV 2700 2620 +EQUIV 2761 2621 +EQUIV 2762 2622 +EQUIV 2763 2623 +EQUIV 2764 2624 +EQUIV 2765 2625 +EQUIV 2766 2626 +EQUIV 2767 2627 +EQUIV 2768 2628 +EQUIV 2769 2629 +EQUIV 2770 2630 +EQUIV 2771 2611 +EQUIV 2772 2612 +EQUIV 2773 2613 +EQUIV 2774 2614 +EQUIV 2775 2615 +EQUIV 2776 2616 +EQUIV 2777 2617 +EQUIV 2778 2618 +EQUIV 2779 2619 +EQUIV 2780 2620 +EQUIV 2781 2621 +EQUIV 2782 2622 +EQUIV 2783 2623 +EQUIV 2784 2624 +EQUIV 2785 2625 +EQUIV 2806 2786 +EQUIV 2807 2787 +EQUIV 2808 2788 +EQUIV 2809 2789 +EQUIV 2810 2790 +EQUIV 2811 2791 +EQUIV 2812 2792 +EQUIV 2813 2793 +EQUIV 2814 2794 +EQUIV 2815 2795 +EQUIV 2816 2796 +EQUIV 2817 2797 +EQUIV 2818 2798 +EQUIV 2819 2799 +EQUIV 2820 2800 +EQUIV 2821 1281 +EQUIV 2822 1282 +EQUIV 2823 1283 +EQUIV 2824 1284 +EQUIV 2825 1285 +EQUIV 2826 1286 +EQUIV 2827 1287 +EQUIV 2828 1288 +EQUIV 2829 1289 +EQUIV 2830 1290 +EQUIV 2831 1271 +EQUIV 2832 1272 +EQUIV 2833 1273 +EQUIV 2834 1274 +EQUIV 2835 1275 +EQUIV 2836 1276 +EQUIV 2837 1277 +EQUIV 2838 1278 +EQUIV 2839 1279 +EQUIV 2840 1280 +EQUIV 2841 2801 +EQUIV 2842 2802 +EQUIV 2843 2803 +EQUIV 2844 2804 +EQUIV 2845 2805 +EQUIV 2846 2626 +EQUIV 2847 2627 +EQUIV 2848 2628 +EQUIV 2849 2629 +EQUIV 2850 2630 +EQUIV 2851 2611 +EQUIV 2852 2612 +EQUIV 2853 2613 +EQUIV 2854 2614 +EQUIV 2855 2615 +EQUIV 2856 2616 +EQUIV 2857 2617 +EQUIV 2858 2618 +EQUIV 2859 2619 +EQUIV 2860 2620 +EQUIV 2861 2701 +EQUIV 2862 2702 +EQUIV 2863 2703 +EQUIV 2864 2704 +EQUIV 2865 2705 +EQUIV 2866 2746 +EQUIV 2867 2747 +EQUIV 2868 2748 +EQUIV 2869 2749 +EQUIV 2870 2750 +EQUIV 2871 2751 +EQUIV 2872 2752 +EQUIV 2873 2753 +EQUIV 2874 2754 +EQUIV 2875 2755 +EQUIV 2876 2756 +EQUIV 2877 2757 +EQUIV 2878 2758 +EQUIV 2879 2759 +EQUIV 2880 2760 +EQUIV 2881 2701 +EQUIV 2882 2702 +EQUIV 2883 2703 +EQUIV 2884 2704 +EQUIV 2885 2705 +EQUIV 2886 2746 +EQUIV 2887 2747 +EQUIV 2888 2748 +EQUIV 2889 2749 +EQUIV 2890 2750 +EQUIV 2931 2891 +EQUIV 2932 2892 +EQUIV 2933 2893 +EQUIV 2934 2894 +EQUIV 2935 2895 +EQUIV 2936 2896 +EQUIV 2937 2897 +EQUIV 2938 2898 +EQUIV 2939 2899 +EQUIV 2940 2900 +EQUIV 2941 2901 +EQUIV 2942 2902 +EQUIV 2943 2903 +EQUIV 2944 2904 +EQUIV 2945 2905 +EQUIV 2946 2926 +EQUIV 2947 2927 +EQUIV 2948 2928 +EQUIV 2949 2929 +EQUIV 2950 2930 +EQUIV 2951 2751 +EQUIV 2952 2752 +EQUIV 2953 2753 +EQUIV 2954 2754 +EQUIV 2955 2755 +EQUIV 2956 2756 +EQUIV 2957 2757 +EQUIV 2958 2758 +EQUIV 2959 2759 +EQUIV 2960 2760 +EQUIV 2961 2701 +EQUIV 2962 2702 +EQUIV 2963 2703 +EQUIV 2964 2704 +EQUIV 2965 2705 +EQUIV 2966 2706 +EQUIV 2967 2707 +EQUIV 2968 2708 +EQUIV 2969 2709 +EQUIV 2970 2710 +EQUIV 2981 1221 +EQUIV 2982 1222 +EQUIV 2983 1223 +EQUIV 2984 1224 +EQUIV 2985 1225 +EQUIV 2986 1226 +EQUIV 2987 1227 +EQUIV 2988 1228 +EQUIV 2989 1229 +EQUIV 2990 1230 +EQUIV 2991 2471 +EQUIV 2992 2472 +EQUIV 2993 2473 +EQUIV 2994 2474 +EQUIV 2995 2475 +EQUIV 2996 716 +EQUIV 2997 717 +EQUIV 2998 718 +EQUIV 2999 719 +EQUIV 3000 720 +EQUIV 3001 721 +EQUIV 3002 722 +EQUIV 3003 723 +EQUIV 3004 724 +EQUIV 3005 725 +EQUIV 3011 2711 +EQUIV 3012 2712 +EQUIV 3013 2713 +EQUIV 3014 2714 +EQUIV 3015 2715 +EQUIV 3026 1106 +EQUIV 3027 1107 +EQUIV 3028 1108 +EQUIV 3029 1109 +EQUIV 3030 1110 +EQUIV 3031 1111 +EQUIV 3032 1112 +EQUIV 3033 1113 +EQUIV 3034 1114 +EQUIV 3035 1115 +EQUIV 3036 1096 +EQUIV 3037 1097 +EQUIV 3038 1098 +EQUIV 3039 1099 +EQUIV 3040 1100 +EQUIV 3041 1101 +EQUIV 3042 1102 +EQUIV 3043 1103 +EQUIV 3044 1104 +EQUIV 3045 1105 +EQUIV 3046 1106 +EQUIV 3047 1107 +EQUIV 3048 1108 +EQUIV 3049 1109 +EQUIV 3050 1110 +EQUIV 3051 1111 +EQUIV 3052 1112 +EQUIV 3053 1113 +EQUIV 3054 1114 +EQUIV 3055 1115 +EQUIV 3076 1076 +EQUIV 3077 1077 +EQUIV 3078 1078 +EQUIV 3079 1079 +EQUIV 3080 1080 +EQUIV 3081 3061 +EQUIV 3082 3062 +EQUIV 3083 3063 +EQUIV 3084 3064 +EQUIV 3085 3065 +EQUIV 3086 1166 +EQUIV 3087 1167 +EQUIV 3088 1168 +EQUIV 3089 1169 +EQUIV 3090 1170 +EQUIV 3091 1151 +EQUIV 3092 1152 +EQUIV 3093 1153 +EQUIV 3094 1154 +EQUIV 3095 1155 +EQUIV 3096 1156 +EQUIV 3097 1157 +EQUIV 3098 1158 +EQUIV 3099 1159 +EQUIV 3100 1160 +EQUIV 3101 1161 +EQUIV 3102 1162 +EQUIV 3103 1163 +EQUIV 3104 1164 +EQUIV 3105 1165 +EQUIV 3106 1166 +EQUIV 3107 1167 +EQUIV 3108 1168 +EQUIV 3109 1169 +EQUIV 3110 1170 +EQUIV 3111 1151 +EQUIV 3112 1152 +EQUIV 3113 1153 +EQUIV 3114 1154 +EQUIV 3115 1155 +EQUIV 3116 1156 +EQUIV 3117 1157 +EQUIV 3118 1158 +EQUIV 3119 1159 +EQUIV 3120 1160 +EQUIV 3121 1161 +EQUIV 3122 1162 +EQUIV 3123 1163 +EQUIV 3124 1164 +EQUIV 3125 1165 +EQUIV 3126 1166 +EQUIV 3127 1167 +EQUIV 3128 1168 +EQUIV 3129 1169 +EQUIV 3130 1170 +EQUIV 3131 1151 +EQUIV 3132 1152 +EQUIV 3133 1153 +EQUIV 3134 1154 +EQUIV 3135 1155 +EQUIV 3136 1156 +EQUIV 3137 1157 +EQUIV 3138 1158 +EQUIV 3139 1159 +EQUIV 3140 1160 +EQUIV 3141 1161 +EQUIV 3142 1162 +EQUIV 3143 1163 +EQUIV 3144 1164 +EQUIV 3145 1165 +EQUIV 3146 3066 +EQUIV 3147 3067 +EQUIV 3148 3068 +EQUIV 3149 3069 +EQUIV 3150 3070 +EQUIV 3151 3071 +EQUIV 3152 3072 +EQUIV 3153 3073 +EQUIV 3154 3074 +EQUIV 3155 3075 +EQUIV 3156 1076 +EQUIV 3157 1077 +EQUIV 3158 1078 +EQUIV 3159 1079 +EQUIV 3160 1080 +EQUIV 3161 3061 +EQUIV 3162 3062 +EQUIV 3163 3063 +EQUIV 3164 3064 +EQUIV 3165 3065 +EQUIV 3166 1166 +EQUIV 3167 1167 +EQUIV 3168 1168 +EQUIV 3169 1169 +EQUIV 3170 1170 +EQUIV 3171 1151 +EQUIV 3172 1152 +EQUIV 3173 1153 +EQUIV 3174 1154 +EQUIV 3175 1155 +EQUIV 3186 726 +EQUIV 3187 727 +EQUIV 3188 728 +EQUIV 3189 729 +EQUIV 3190 730 +EQUIV 3191 711 +EQUIV 3192 712 +EQUIV 3193 713 +EQUIV 3194 714 +EQUIV 3195 715 +EQUIV 3196 736 +EQUIV 3197 737 +EQUIV 3198 738 +EQUIV 3199 739 +EQUIV 3200 740 +EQUIV 3201 701 +EQUIV 3202 702 +EQUIV 3203 703 +EQUIV 3204 704 +EQUIV 3205 705 +EQUIV 3206 706 +EQUIV 3207 707 +EQUIV 3208 708 +EQUIV 3209 709 +EQUIV 3210 710 +EQUIV 3211 711 +EQUIV 3212 712 +EQUIV 3213 713 +EQUIV 3214 714 +EQUIV 3215 715 +EQUIV 3216 736 +EQUIV 3217 737 +EQUIV 3218 738 +EQUIV 3219 739 +EQUIV 3220 740 +EQUIV 3221 701 +EQUIV 3222 702 +EQUIV 3223 703 +EQUIV 3224 704 +EQUIV 3225 705 +EQUIV 3226 706 +EQUIV 3227 707 +EQUIV 3228 708 +EQUIV 3229 709 +EQUIV 3230 710 +EQUIV 3231 711 +EQUIV 3232 712 +EQUIV 3233 713 +EQUIV 3234 714 +EQUIV 3235 715 +EQUIV 3236 716 +EQUIV 3237 717 +EQUIV 3238 718 +EQUIV 3239 719 +EQUIV 3240 720 +EQUIV 3241 1221 +EQUIV 3242 1222 +EQUIV 3243 1223 +EQUIV 3244 1224 +EQUIV 3245 1225 +EQUIV 3246 1226 +EQUIV 3247 1227 +EQUIV 3248 1228 +EQUIV 3249 1229 +EQUIV 3250 1230 +EQUIV 3251 2471 +EQUIV 3252 2472 +EQUIV 3253 2473 +EQUIV 3254 2474 +EQUIV 3255 2475 +EQUIV 3256 716 +EQUIV 3257 717 +EQUIV 3258 718 +EQUIV 3259 719 +EQUIV 3260 720 +EQUIV 3261 721 +EQUIV 3262 722 +EQUIV 3263 723 +EQUIV 3264 724 +EQUIV 3265 725 +EQUIV 3266 3006 +EQUIV 3267 3007 +EQUIV 3268 3008 +EQUIV 3269 3009 +EQUIV 3270 3010 +EQUIV 3271 2971 +EQUIV 3272 2972 +EQUIV 3273 2973 +EQUIV 3274 2974 +EQUIV 3275 2975 +EQUIV 3276 2976 +EQUIV 3277 2977 +EQUIV 3278 2978 +EQUIV 3279 2979 +EQUIV 3280 2980 +EQUIV 3281 721 +EQUIV 3282 722 +EQUIV 3283 723 +EQUIV 3284 724 +EQUIV 3285 725 +EQUIV 3286 3006 +EQUIV 3287 3007 +EQUIV 3288 3008 +EQUIV 3289 3009 +EQUIV 3290 3010 +EQUIV 3291 2971 +EQUIV 3292 2972 +EQUIV 3293 2973 +EQUIV 3294 2974 +EQUIV 3295 2975 +EQUIV 3296 2976 +EQUIV 3297 2977 +EQUIV 3298 2978 +EQUIV 3299 2979 +EQUIV 3300 2980 +EQUIV 3301 1221 +EQUIV 3302 1222 +EQUIV 3303 1223 +EQUIV 3304 1224 +EQUIV 3305 1225 +EQUIV 3306 1226 +EQUIV 3307 1227 +EQUIV 3308 1228 +EQUIV 3309 1229 +EQUIV 3310 1230 +EQUIV 3311 1231 +EQUIV 3312 1232 +EQUIV 3313 1233 +EQUIV 3314 1234 +EQUIV 3315 1235 +EQUIV 3316 1236 +EQUIV 3317 1237 +EQUIV 3318 1238 +EQUIV 3319 1239 +EQUIV 3320 1240 +EQUIV 3321 1241 +EQUIV 3322 1242 +EQUIV 3323 1243 +EQUIV 3324 1244 +EQUIV 3325 1245 +EQUIV 3326 746 +EQUIV 3327 747 +EQUIV 3328 748 +EQUIV 3329 749 +EQUIV 3330 750 +EQUIV 3331 751 +EQUIV 3332 752 +EQUIV 3333 753 +EQUIV 3334 754 +EQUIV 3335 755 +EQUIV 3336 696 +EQUIV 3337 697 +EQUIV 3338 698 +EQUIV 3339 699 +EQUIV 3340 700 +EQUIV 3341 741 +EQUIV 3342 742 +EQUIV 3343 743 +EQUIV 3344 744 +EQUIV 3345 745 +EQUIV 3346 746 +EQUIV 3347 747 +EQUIV 3348 748 +EQUIV 3349 749 +EQUIV 3350 750 +EQUIV 3351 751 +EQUIV 3352 752 +EQUIV 3353 753 +EQUIV 3354 754 +EQUIV 3355 755 +EQUIV 3356 696 +EQUIV 3357 697 +EQUIV 3358 698 +EQUIV 3359 699 +EQUIV 3360 700 +EQUIV 3361 701 +EQUIV 3362 702 +EQUIV 3363 703 +EQUIV 3364 704 +EQUIV 3365 705 +EQUIV 3366 706 +EQUIV 3367 707 +EQUIV 3368 708 +EQUIV 3369 709 +EQUIV 3370 710 +EQUIV 3376 1156 +EQUIV 3377 1157 +EQUIV 3378 1158 +EQUIV 3379 1159 +EQUIV 3380 1160 +EQUIV 3381 1161 +EQUIV 3382 1162 +EQUIV 3383 1163 +EQUIV 3384 1164 +EQUIV 3385 1165 +EQUIV 3386 3066 +EQUIV 3387 3067 +EQUIV 3388 3068 +EQUIV 3389 3069 +EQUIV 3390 3070 +EQUIV 3396 916 +EQUIV 3397 917 +EQUIV 3398 918 +EQUIV 3399 919 +EQUIV 3400 920 +EQUIV 3401 921 +EQUIV 3402 922 +EQUIV 3403 923 +EQUIV 3404 924 +EQUIV 3405 925 +EQUIV 3411 3391 +EQUIV 3412 3392 +EQUIV 3413 3393 +EQUIV 3414 3394 +EQUIV 3415 3395 +EQUIV 3416 836 +EQUIV 3417 837 +EQUIV 3418 838 +EQUIV 3419 839 +EQUIV 3420 840 +EQUIV 3421 841 +EQUIV 3422 842 +EQUIV 3423 843 +EQUIV 3424 844 +EQUIV 3425 845 +EQUIV 3426 826 +EQUIV 3427 827 +EQUIV 3428 828 +EQUIV 3429 829 +EQUIV 3430 830 +EQUIV 3431 831 +EQUIV 3432 832 +EQUIV 3433 833 +EQUIV 3434 834 +EQUIV 3435 835 +EQUIV 3436 836 +EQUIV 3437 837 +EQUIV 3438 838 +EQUIV 3439 839 +EQUIV 3440 840 +EQUIV 3441 841 +EQUIV 3442 842 +EQUIV 3443 843 +EQUIV 3444 844 +EQUIV 3445 845 +EQUIV 3446 826 +EQUIV 3447 827 +EQUIV 3448 828 +EQUIV 3449 829 +EQUIV 3450 830 +EQUIV 3451 691 +EQUIV 3452 692 +EQUIV 3453 693 +EQUIV 3454 694 +EQUIV 3455 695 +EQUIV 3456 696 +EQUIV 3457 697 +EQUIV 3458 698 +EQUIV 3459 699 +EQUIV 3460 700 +EQUIV 3461 701 +EQUIV 3462 702 +EQUIV 3463 703 +EQUIV 3464 704 +EQUIV 3465 705 +EQUIV 3466 706 +EQUIV 3467 707 +EQUIV 3468 708 +EQUIV 3469 709 +EQUIV 3470 710 +EQUIV 3471 3371 +EQUIV 3472 3372 +EQUIV 3473 3373 +EQUIV 3474 3374 +EQUIV 3475 3375 +EQUIV 3476 1156 +EQUIV 3477 1157 +EQUIV 3478 1158 +EQUIV 3479 1159 +EQUIV 3480 1160 +EQUIV 3481 1161 +EQUIV 3482 1162 +EQUIV 3483 1163 +EQUIV 3484 1164 +EQUIV 3485 1165 +EQUIV 3486 1166 +EQUIV 3487 1167 +EQUIV 3488 1168 +EQUIV 3489 1169 +EQUIV 3490 1170 +EQUIV 3491 1151 +EQUIV 3492 1152 +EQUIV 3493 1153 +EQUIV 3494 1154 +EQUIV 3495 1155 +EQUIV 3496 3176 +EQUIV 3497 3177 +EQUIV 3498 3178 +EQUIV 3499 3179 +EQUIV 3500 3180 +EQUIV 3501 3021 +EQUIV 3502 3022 +EQUIV 3503 3023 +EQUIV 3504 3024 +EQUIV 3505 3025 +EQUIV 3516 2716 +EQUIV 3517 2717 +EQUIV 3518 2718 +EQUIV 3519 2719 +EQUIV 3520 2720 +EQUIV 3521 2721 +EQUIV 3522 2722 +EQUIV 3523 2723 +EQUIV 3524 2724 +EQUIV 3525 2725 +EQUIV 3526 2726 +EQUIV 3527 2727 +EQUIV 3528 2728 +EQUIV 3529 2729 +EQUIV 3530 2730 +EQUIV 3571 2911 +EQUIV 3572 2912 +EQUIV 3573 2913 +EQUIV 3574 2914 +EQUIV 3575 2915 +EQUIV 3576 2916 +EQUIV 3577 2917 +EQUIV 3578 2918 +EQUIV 3579 2919 +EQUIV 3580 2920 +EQUIV 3581 2921 +EQUIV 3582 2922 +EQUIV 3583 2923 +EQUIV 3584 2924 +EQUIV 3585 2925 +EQUIV 3586 2906 +EQUIV 3587 2907 +EQUIV 3588 2908 +EQUIV 3589 2909 +EQUIV 3590 2910 +EQUIV 3591 2911 +EQUIV 3592 2912 +EQUIV 3593 2913 +EQUIV 3594 2914 +EQUIV 3595 2915 +EQUIV 3656 3636 +EQUIV 3657 3637 +EQUIV 3658 3638 +EQUIV 3659 3639 +EQUIV 3660 3640 +EQUIV 3661 3641 +EQUIV 3662 3642 +EQUIV 3663 3643 +EQUIV 3664 3644 +EQUIV 3665 3645 +EQUIV 3666 3646 +EQUIV 3667 3647 +EQUIV 3668 3648 +EQUIV 3669 3649 +EQUIV 3670 3650 +EQUIV 3671 3651 +EQUIV 3672 3652 +EQUIV 3673 3653 +EQUIV 3674 3654 +EQUIV 3675 3655 +EQUIV 3676 3636 +EQUIV 3677 3637 +EQUIV 3678 3638 +EQUIV 3679 3639 +EQUIV 3680 3640 +EQUIV 3681 3641 +EQUIV 3682 3642 +EQUIV 3683 3643 +EQUIV 3684 3644 +EQUIV 3685 3645 +EQUIV 3686 3566 +EQUIV 3687 3567 +EQUIV 3688 3568 +EQUIV 3689 3569 +EQUIV 3690 3570 +EQUIV 3696 3556 +EQUIV 3697 3557 +EQUIV 3698 3558 +EQUIV 3699 3559 +EQUIV 3700 3560 +EQUIV 3721 3561 +EQUIV 3722 3562 +EQUIV 3723 3563 +EQUIV 3724 3564 +EQUIV 3725 3565 +EQUIV 3726 3566 +EQUIV 3727 3567 +EQUIV 3728 3568 +EQUIV 3729 3569 +EQUIV 3730 3570 +EQUIV 3731 2911 +EQUIV 3732 2912 +EQUIV 3733 2913 +EQUIV 3734 2914 +EQUIV 3735 2915 +EQUIV 3736 2916 +EQUIV 3737 2917 +EQUIV 3738 2918 +EQUIV 3739 2919 +EQUIV 3740 2920 +EQUIV 3741 2921 +EQUIV 3742 2922 +EQUIV 3743 2923 +EQUIV 3744 2924 +EQUIV 3745 2925 +EQUIV 3746 2906 +EQUIV 3747 2907 +EQUIV 3748 2908 +EQUIV 3749 2909 +EQUIV 3750 2910 +EQUIV 3751 2911 +EQUIV 3752 2912 +EQUIV 3753 2913 +EQUIV 3754 2914 +EQUIV 3755 2915 +EQUIV 3756 3596 +EQUIV 3757 3597 +EQUIV 3758 3598 +EQUIV 3759 3599 +EQUIV 3760 3600 +EQUIV 3761 3641 +EQUIV 3762 3642 +EQUIV 3763 3643 +EQUIV 3764 3644 +EQUIV 3765 3645 +EQUIV 3766 3566 +EQUIV 3767 3567 +EQUIV 3768 3568 +EQUIV 3769 3569 +EQUIV 3770 3570 +EQUIV 3771 3691 +EQUIV 3772 3692 +EQUIV 3773 3693 +EQUIV 3774 3694 +EQUIV 3775 3695 +EQUIV 3776 3556 +EQUIV 3777 3557 +EQUIV 3778 3558 +EQUIV 3779 3559 +EQUIV 3780 3560 +EQUIV 3781 3701 +EQUIV 3782 3702 +EQUIV 3783 3703 +EQUIV 3784 3704 +EQUIV 3785 3705 +EQUIV 3786 3706 +EQUIV 3787 3707 +EQUIV 3788 3708 +EQUIV 3789 3709 +EQUIV 3790 3710 +EQUIV 3791 3711 +EQUIV 3792 3712 +EQUIV 3793 3713 +EQUIV 3794 3714 +EQUIV 3795 3715 +EQUIV 3811 3651 +EQUIV 3812 3652 +EQUIV 3813 3653 +EQUIV 3814 3654 +EQUIV 3815 3655 +EQUIV 3816 3636 +EQUIV 3817 3637 +EQUIV 3818 3638 +EQUIV 3819 3639 +EQUIV 3820 3640 +EQUIV 3821 3641 +EQUIV 3822 3642 +EQUIV 3823 3643 +EQUIV 3824 3644 +EQUIV 3825 3645 +EQUIV 3826 3646 +EQUIV 3827 3647 +EQUIV 3828 3648 +EQUIV 3829 3649 +EQUIV 3830 3650 +EQUIV 3836 3796 +EQUIV 3837 3797 +EQUIV 3838 3798 +EQUIV 3839 3799 +EQUIV 3840 3800 +EQUIV 3876 3856 +EQUIV 3877 3857 +EQUIV 3878 3858 +EQUIV 3879 3859 +EQUIV 3880 3860 +EQUIV 3926 3906 +EQUIV 3927 3907 +EQUIV 3928 3908 +EQUIV 3929 3909 +EQUIV 3930 3910 +EQUIV 3931 3911 +EQUIV 3932 3912 +EQUIV 3933 3913 +EQUIV 3934 3914 +EQUIV 3935 3915 +EQUIV 3936 3916 +EQUIV 3937 3917 +EQUIV 3938 3918 +EQUIV 3939 3919 +EQUIV 3940 3920 +EQUIV 3941 3921 +EQUIV 3942 3922 +EQUIV 3943 3923 +EQUIV 3944 3924 +EQUIV 3945 3925 +EQUIV 3946 3906 +EQUIV 3947 3907 +EQUIV 3948 3908 +EQUIV 3949 3909 +EQUIV 3950 3910 +EQUIV 3971 3911 +EQUIV 3972 3912 +EQUIV 3973 3913 +EQUIV 3974 3914 +EQUIV 3975 3915 +EQUIV 3996 3976 +EQUIV 3997 3977 +EQUIV 3998 3978 +EQUIV 3999 3979 +EQUIV 4000 3980 +EQUIV 4001 3981 +EQUIV 4002 3982 +EQUIV 4003 3983 +EQUIV 4004 3984 +EQUIV 4005 3985 +EQUIV 4006 3986 +EQUIV 4007 3987 +EQUIV 4008 3988 +EQUIV 4009 3989 +EQUIV 4010 3990 +EQUIV 4011 3991 +EQUIV 4012 3992 +EQUIV 4013 3993 +EQUIV 4014 3994 +EQUIV 4015 3995 +EQUIV 4016 3976 +EQUIV 4017 3977 +EQUIV 4018 3978 +EQUIV 4019 3979 +EQUIV 4020 3980 +EQUIV 4066 4046 +EQUIV 4067 4047 +EQUIV 4068 4048 +EQUIV 4069 4049 +EQUIV 4070 4050 +EQUIV 4076 3956 +EQUIV 4077 3957 +EQUIV 4078 3958 +EQUIV 4079 3959 +EQUIV 4080 3960 +EQUIV 4081 3961 +EQUIV 4082 3962 +EQUIV 4083 3963 +EQUIV 4084 3964 +EQUIV 4085 3965 +EQUIV 4086 4026 +EQUIV 4087 4027 +EQUIV 4088 4028 +EQUIV 4089 4029 +EQUIV 4090 4030 +EQUIV 4101 4021 +EQUIV 4102 4022 +EQUIV 4103 4023 +EQUIV 4104 4024 +EQUIV 4105 4025 +EQUIV 4106 3966 +EQUIV 4107 3967 +EQUIV 4108 3968 +EQUIV 4109 3969 +EQUIV 4110 3970 +EQUIV 4111 3911 +EQUIV 4112 3912 +EQUIV 4113 3913 +EQUIV 4114 3914 +EQUIV 4115 3915 +EQUIV 4116 3916 +EQUIV 4117 3917 +EQUIV 4118 3918 +EQUIV 4119 3919 +EQUIV 4120 3920 +EQUIV 4121 3921 +EQUIV 4122 3922 +EQUIV 4123 3923 +EQUIV 4124 3924 +EQUIV 4125 3925 +EQUIV 4131 3891 +EQUIV 4132 3892 +EQUIV 4133 3893 +EQUIV 4134 3894 +EQUIV 4135 3895 +EQUIV 4146 3886 +EQUIV 4147 3887 +EQUIV 4148 3888 +EQUIV 4149 3889 +EQUIV 4150 3890 +EQUIV 4151 3891 +EQUIV 4152 3892 +EQUIV 4153 3893 +EQUIV 4154 3894 +EQUIV 4155 3895 +EQUIV 4156 3896 +EQUIV 4157 3897 +EQUIV 4158 3898 +EQUIV 4159 3899 +EQUIV 4160 3900 +EQUIV 4161 3901 +EQUIV 4162 3902 +EQUIV 4163 3903 +EQUIV 4164 3904 +EQUIV 4165 3905 +EQUIV 4166 4126 +EQUIV 4167 4127 +EQUIV 4168 4128 +EQUIV 4169 4129 +EQUIV 4170 4130 +EQUIV 4181 3881 +EQUIV 4182 3882 +EQUIV 4183 3883 +EQUIV 4184 3884 +EQUIV 4185 3885 +EQUIV 4201 4141 +EQUIV 4202 4142 +EQUIV 4203 4143 +EQUIV 4204 4144 +EQUIV 4205 4145 +EQUIV 4206 3886 +EQUIV 4207 3887 +EQUIV 4208 3888 +EQUIV 4209 3889 +EQUIV 4210 3890 +EQUIV 4211 4171 +EQUIV 4212 4172 +EQUIV 4213 4173 +EQUIV 4214 4174 +EQUIV 4215 4175 +EQUIV 4216 4176 +EQUIV 4217 4177 +EQUIV 4218 4178 +EQUIV 4219 4179 +EQUIV 4220 4180 +EQUIV 4221 3881 +EQUIV 4222 3882 +EQUIV 4223 3883 +EQUIV 4224 3884 +EQUIV 4225 3885 +EQUIV 4226 3886 +EQUIV 4227 3887 +EQUIV 4228 3888 +EQUIV 4229 3889 +EQUIV 4230 3890 +EQUIV 4231 4171 +EQUIV 4232 4172 +EQUIV 4233 4173 +EQUIV 4234 4174 +EQUIV 4235 4175 +EQUIV 4241 3921 +EQUIV 4242 3922 +EQUIV 4243 3923 +EQUIV 4244 3924 +EQUIV 4245 3925 +EQUIV 4246 3906 +EQUIV 4247 3907 +EQUIV 4248 3908 +EQUIV 4249 3909 +EQUIV 4250 3910 +EQUIV 4251 3911 +EQUIV 4252 3912 +EQUIV 4253 3913 +EQUIV 4254 3914 +EQUIV 4255 3915 +EQUIV 4256 3916 +EQUIV 4257 3917 +EQUIV 4258 3918 +EQUIV 4259 3919 +EQUIV 4260 3920 +EQUIV 4261 3921 +EQUIV 4262 3922 +EQUIV 4263 3923 +EQUIV 4264 3924 +EQUIV 4265 3925 +EQUIV 4266 3906 +EQUIV 4267 3907 +EQUIV 4268 3908 +EQUIV 4269 3909 +EQUIV 4270 3910 +EQUIV 4271 3911 +EQUIV 4272 3912 +EQUIV 4273 3913 +EQUIV 4274 3914 +EQUIV 4275 3915 +EQUIV 4276 3916 +EQUIV 4277 3917 +EQUIV 4278 3918 +EQUIV 4279 3919 +EQUIV 4280 3920 +EQUIV 4296 4176 +EQUIV 4297 4177 +EQUIV 4298 4178 +EQUIV 4299 4179 +EQUIV 4300 4180 +EQUIV 4301 3881 +EQUIV 4302 3882 +EQUIV 4303 3883 +EQUIV 4304 3884 +EQUIV 4305 3885 +EQUIV 4306 3886 +EQUIV 4307 3887 +EQUIV 4308 3888 +EQUIV 4309 3889 +EQUIV 4310 3890 +EQUIV 4311 4171 +EQUIV 4312 4172 +EQUIV 4313 4173 +EQUIV 4314 4174 +EQUIV 4315 4175 +EQUIV 4316 4176 +EQUIV 4317 4177 +EQUIV 4318 4178 +EQUIV 4319 4179 +EQUIV 4320 4180 +EQUIV 4321 3881 +EQUIV 4322 3882 +EQUIV 4323 3883 +EQUIV 4324 3884 +EQUIV 4325 3885 +EQUIV 4326 4186 +EQUIV 4327 4187 +EQUIV 4328 4188 +EQUIV 4329 4189 +EQUIV 4330 4190 +EQUIV 4331 4191 +EQUIV 4332 4192 +EQUIV 4333 4193 +EQUIV 4334 4194 +EQUIV 4335 4195 +EQUIV 4391 4371 +EQUIV 4392 4372 +EQUIV 4393 4373 +EQUIV 4394 4374 +EQUIV 4395 4375 +EQUIV 4396 4376 +EQUIV 4397 4377 +EQUIV 4398 4378 +EQUIV 4399 4379 +EQUIV 4400 4380 +EQUIV 4416 4376 +EQUIV 4417 4377 +EQUIV 4418 4378 +EQUIV 4419 4379 +EQUIV 4420 4380 +EQUIV 4421 4401 +EQUIV 4422 4402 +EQUIV 4423 4403 +EQUIV 4424 4404 +EQUIV 4425 4405 +EQUIV 4426 4406 +EQUIV 4427 4407 +EQUIV 4428 4408 +EQUIV 4429 4409 +EQUIV 4430 4410 +EQUIV 4431 4411 +EQUIV 4432 4412 +EQUIV 4433 4413 +EQUIV 4434 4414 +EQUIV 4435 4415 +EQUIV 4441 4361 +EQUIV 4442 4362 +EQUIV 4443 4363 +EQUIV 4444 4364 +EQUIV 4445 4365 +EQUIV 4451 4351 +EQUIV 4452 4352 +EQUIV 4453 4353 +EQUIV 4454 4354 +EQUIV 4455 4355 +EQUIV 4466 4346 +EQUIV 4467 4347 +EQUIV 4468 4348 +EQUIV 4469 4349 +EQUIV 4470 4350 +EQUIV 4486 4446 +EQUIV 4487 4447 +EQUIV 4488 4448 +EQUIV 4489 4449 +EQUIV 4490 4450 +EQUIV 4491 4471 +EQUIV 4492 4472 +EQUIV 4493 4473 +EQUIV 4494 4474 +EQUIV 4495 4475 +EQUIV 4506 3846 +EQUIV 4507 3847 +EQUIV 4508 3848 +EQUIV 4509 3849 +EQUIV 4510 3850 +EQUIV 4511 3851 +EQUIV 4512 3852 +EQUIV 4513 3853 +EQUIV 4514 3854 +EQUIV 4515 3855 +EQUIV 4516 3856 +EQUIV 4517 3857 +EQUIV 4518 3858 +EQUIV 4519 3859 +EQUIV 4520 3860 +EQUIV 4521 3861 +EQUIV 4522 3862 +EQUIV 4523 3863 +EQUIV 4524 3864 +EQUIV 4525 3865 +EQUIV 4526 3866 +EQUIV 4527 3867 +EQUIV 4528 3868 +EQUIV 4529 3869 +EQUIV 4530 3870 +EQUIV 4531 3871 +EQUIV 4532 3872 +EQUIV 4533 3873 +EQUIV 4534 3874 +EQUIV 4535 3875 +EQUIV 4541 3801 +EQUIV 4542 3802 +EQUIV 4543 3803 +EQUIV 4544 3804 +EQUIV 4545 3805 +EQUIV 4566 3626 +EQUIV 4567 3627 +EQUIV 4568 3628 +EQUIV 4569 3629 +EQUIV 4570 3630 +EQUIV 4571 3611 +EQUIV 4572 3612 +EQUIV 4573 3613 +EQUIV 4574 3614 +EQUIV 4575 3615 +EQUIV 4596 2916 +EQUIV 4597 2917 +EQUIV 4598 2918 +EQUIV 4599 2919 +EQUIV 4600 2920 +EQUIV 4621 4601 +EQUIV 4622 4602 +EQUIV 4623 4603 +EQUIV 4624 4604 +EQUIV 4625 4605 +EQUIV 4631 4591 +EQUIV 4632 4592 +EQUIV 4633 4593 +EQUIV 4634 4594 +EQUIV 4635 4595 +EQUIV 4636 3596 +EQUIV 4637 3597 +EQUIV 4638 3598 +EQUIV 4639 3599 +EQUIV 4640 3600 +EQUIV 4641 3601 +EQUIV 4642 3602 +EQUIV 4643 3603 +EQUIV 4644 3604 +EQUIV 4645 3605 +EQUIV 4646 4586 +EQUIV 4647 4587 +EQUIV 4648 4588 +EQUIV 4649 4589 +EQUIV 4650 4590 +EQUIV 4651 4591 +EQUIV 4652 4592 +EQUIV 4653 4593 +EQUIV 4654 4594 +EQUIV 4655 4595 +EQUIV 4656 3596 +EQUIV 4657 3597 +EQUIV 4658 3598 +EQUIV 4659 3599 +EQUIV 4660 3600 +EQUIV 4661 3601 +EQUIV 4662 3602 +EQUIV 4663 3603 +EQUIV 4664 3604 +EQUIV 4665 3605 +EQUIV 4666 3606 +EQUIV 4667 3607 +EQUIV 4668 3608 +EQUIV 4669 3609 +EQUIV 4670 3610 +EQUIV 4671 3611 +EQUIV 4672 3612 +EQUIV 4673 3613 +EQUIV 4674 3614 +EQUIV 4675 3615 +EQUIV 4676 4576 +EQUIV 4677 4577 +EQUIV 4678 4578 +EQUIV 4679 4579 +EQUIV 4680 4580 +EQUIV 4681 4581 +EQUIV 4682 4582 +EQUIV 4683 4583 +EQUIV 4684 4584 +EQUIV 4685 4585 +EQUIV 4686 3606 +EQUIV 4687 3607 +EQUIV 4688 3608 +EQUIV 4689 3609 +EQUIV 4690 3610 +EQUIV 4691 3611 +EQUIV 4692 3612 +EQUIV 4693 3613 +EQUIV 4694 3614 +EQUIV 4695 3615 +EQUIV 4696 4576 +EQUIV 4697 4577 +EQUIV 4698 4578 +EQUIV 4699 4579 +EQUIV 4700 4580 +EQUIV 4701 4581 +EQUIV 4702 4582 +EQUIV 4703 4583 +EQUIV 4704 4584 +EQUIV 4705 4585 +EQUIV 4706 4586 +EQUIV 4707 4587 +EQUIV 4708 4588 +EQUIV 4709 4589 +EQUIV 4710 4590 +EQUIV 4736 2796 +EQUIV 4737 2797 +EQUIV 4738 2798 +EQUIV 4739 2799 +EQUIV 4740 2800 +EQUIV 4741 2801 +EQUIV 4742 2802 +EQUIV 4743 2803 +EQUIV 4744 2804 +EQUIV 4745 2805 +EQUIV 4746 2786 +EQUIV 4747 2787 +EQUIV 4748 2788 +EQUIV 4749 2789 +EQUIV 4750 2790 +EQUIV 4751 2791 +EQUIV 4752 2792 +EQUIV 4753 2793 +EQUIV 4754 2794 +EQUIV 4755 2795 +EQUIV 4761 4721 +EQUIV 4762 4722 +EQUIV 4763 4723 +EQUIV 4764 4724 +EQUIV 4765 4725 +EQUIV 4801 4781 +EQUIV 4802 4782 +EQUIV 4803 4783 +EQUIV 4804 4784 +EQUIV 4805 4785 +EQUIV 4826 4806 +EQUIV 4827 4807 +EQUIV 4828 4808 +EQUIV 4829 4809 +EQUIV 4830 4810 +EQUIV 4831 4811 +EQUIV 4832 4812 +EQUIV 4833 4813 +EQUIV 4834 4814 +EQUIV 4835 4815 +EQUIV 4836 4816 +EQUIV 4837 4817 +EQUIV 4838 4818 +EQUIV 4839 4819 +EQUIV 4840 4820 +EQUIV 4841 4821 +EQUIV 4842 4822 +EQUIV 4843 4823 +EQUIV 4844 4824 +EQUIV 4845 4825 +EQUIV 4846 4786 +EQUIV 4847 4787 +EQUIV 4848 4788 +EQUIV 4849 4789 +EQUIV 4850 4790 +EQUIV 4851 4791 +EQUIV 4852 4792 +EQUIV 4853 4793 +EQUIV 4854 4794 +EQUIV 4855 4795 +EQUIV 4856 4796 +EQUIV 4857 4797 +EQUIV 4858 4798 +EQUIV 4859 4799 +EQUIV 4860 4800 +EQUIV 4861 4781 +EQUIV 4862 4782 +EQUIV 4863 4783 +EQUIV 4864 4784 +EQUIV 4865 4785 +EQUIV 4866 4786 +EQUIV 4867 4787 +EQUIV 4868 4788 +EQUIV 4869 4789 +EQUIV 4870 4790 +EQUIV 4876 3616 +EQUIV 4877 3617 +EQUIV 4878 3618 +EQUIV 4879 3619 +EQUIV 4880 3620 +EQUIV 4881 3621 +EQUIV 4882 3622 +EQUIV 4883 3623 +EQUIV 4884 3624 +EQUIV 4885 3625 +EQUIV 4911 4891 +EQUIV 4912 4892 +EQUIV 4913 4893 +EQUIV 4914 4894 +EQUIV 4915 4895 +EQUIV 4916 4896 +EQUIV 4917 4897 +EQUIV 4918 4898 +EQUIV 4919 4899 +EQUIV 4920 4900 +EQUIV 4921 4901 +EQUIV 4922 4902 +EQUIV 4923 4903 +EQUIV 4924 4904 +EQUIV 4925 4905 +EQUIV 4926 4906 +EQUIV 4927 4907 +EQUIV 4928 4908 +EQUIV 4929 4909 +EQUIV 4930 4910 +EQUIV 4931 4891 +EQUIV 4932 4892 +EQUIV 4933 4893 +EQUIV 4934 4894 +EQUIV 4935 4895 +EQUIV 4936 4556 +EQUIV 4937 4557 +EQUIV 4938 4558 +EQUIV 4939 4559 +EQUIV 4940 4560 +EQUIV 4941 4561 +EQUIV 4942 4562 +EQUIV 4943 4563 +EQUIV 4944 4564 +EQUIV 4945 4565 +EQUIV 4946 4886 +EQUIV 4947 4887 +EQUIV 4948 4888 +EQUIV 4949 4889 +EQUIV 4950 4890 +EQUIV 4961 3621 +EQUIV 4962 3622 +EQUIV 4963 3623 +EQUIV 4964 3624 +EQUIV 4965 3625 +EQUIV 4966 3626 +EQUIV 4967 3627 +EQUIV 4968 3628 +EQUIV 4969 3629 +EQUIV 4970 3630 +EQUIV 4971 3611 +EQUIV 4972 3612 +EQUIV 4973 3613 +EQUIV 4974 3614 +EQUIV 4975 3615 +EQUIV 4976 4576 +EQUIV 4977 4577 +EQUIV 4978 4578 +EQUIV 4979 4579 +EQUIV 4980 4580 +EQUIV 4981 4581 +EQUIV 4982 4582 +EQUIV 4983 4583 +EQUIV 4984 4584 +EQUIV 4985 4585 +EQUIV 4986 4586 +EQUIV 4987 4587 +EQUIV 4988 4588 +EQUIV 4989 4589 +EQUIV 4990 4590 +EQUIV 4991 4591 +EQUIV 4992 4592 +EQUIV 4993 4593 +EQUIV 4994 4594 +EQUIV 4995 4595 +EQUIV 4996 3596 +EQUIV 4997 3597 +EQUIV 4998 3598 +EQUIV 4999 3599 +EQUIV 5000 3600 +EQUIV 5001 3601 +EQUIV 5002 3602 +EQUIV 5003 3603 +EQUIV 5004 3604 +EQUIV 5005 3605 +EQUIV 5006 3606 +EQUIV 5007 3607 +EQUIV 5008 3608 +EQUIV 5009 3609 +EQUIV 5010 3610 +EQUIV 5011 3611 +EQUIV 5012 3612 +EQUIV 5013 3613 +EQUIV 5014 3614 +EQUIV 5015 3615 +EQUIV 5016 4576 +EQUIV 5017 4577 +EQUIV 5018 4578 +EQUIV 5019 4579 +EQUIV 5020 4580 +EQUIV 5021 4581 +EQUIV 5022 4582 +EQUIV 5023 4583 +EQUIV 5024 4584 +EQUIV 5025 4585 +EQUIV 5026 4586 +EQUIV 5027 4587 +EQUIV 5028 4588 +EQUIV 5029 4589 +EQUIV 5030 4590 +EQUIV 5031 4591 +EQUIV 5032 4592 +EQUIV 5033 4593 +EQUIV 5034 4594 +EQUIV 5035 4595 +EQUIV 5036 3596 +EQUIV 5037 3597 +EQUIV 5038 3598 +EQUIV 5039 3599 +EQUIV 5040 3600 +EQUIV 5041 3601 +EQUIV 5042 3602 +EQUIV 5043 3603 +EQUIV 5044 3604 +EQUIV 5045 3605 +EQUIV 5046 4586 +EQUIV 5047 4587 +EQUIV 5048 4588 +EQUIV 5049 4589 +EQUIV 5050 4590 +EQUIV 5051 4591 +EQUIV 5052 4592 +EQUIV 5053 4593 +EQUIV 5054 4594 +EQUIV 5055 4595 +EQUIV 5056 3596 +EQUIV 5057 3597 +EQUIV 5058 3598 +EQUIV 5059 3599 +EQUIV 5060 3600 +EQUIV 5061 3601 +EQUIV 5062 3602 +EQUIV 5063 3603 +EQUIV 5064 3604 +EQUIV 5065 3605 +EQUIV 5066 3606 +EQUIV 5067 3607 +EQUIV 5068 3608 +EQUIV 5069 3609 +EQUIV 5070 3610 +EQUIV 5071 3611 +EQUIV 5072 3612 +EQUIV 5073 3613 +EQUIV 5074 3614 +EQUIV 5075 3615 +EQUIV 5076 3616 +EQUIV 5077 3617 +EQUIV 5078 3618 +EQUIV 5079 3619 +EQUIV 5080 3620 +EQUIV 5091 4791 +EQUIV 5092 4792 +EQUIV 5093 4793 +EQUIV 5094 4794 +EQUIV 5095 4795 +EQUIV 5096 4796 +EQUIV 5097 4797 +EQUIV 5098 4798 +EQUIV 5099 4799 +EQUIV 5100 4800 +EQUIV 5101 4781 +EQUIV 5102 4782 +EQUIV 5103 4783 +EQUIV 5104 4784 +EQUIV 5105 4785 +EQUIV 5106 4786 +EQUIV 5107 4787 +EQUIV 5108 4788 +EQUIV 5109 4789 +EQUIV 5110 4790 +EQUIV 5111 4791 +EQUIV 5112 4792 +EQUIV 5113 4793 +EQUIV 5114 4794 +EQUIV 5115 4795 +EQUIV 5136 4796 +EQUIV 5137 4797 +EQUIV 5138 4798 +EQUIV 5139 4799 +EQUIV 5140 4800 +EQUIV 5141 4781 +EQUIV 5142 4782 +EQUIV 5143 4783 +EQUIV 5144 4784 +EQUIV 5145 4785 +EQUIV 5146 4786 +EQUIV 5147 4787 +EQUIV 5148 4788 +EQUIV 5149 4789 +EQUIV 5150 4790 +EQUIV 5151 4791 +EQUIV 5152 4792 +EQUIV 5153 4793 +EQUIV 5154 4794 +EQUIV 5155 4795 +EQUIV 5156 4796 +EQUIV 5157 4797 +EQUIV 5158 4798 +EQUIV 5159 4799 +EQUIV 5160 4800 +EQUIV 5196 5176 +EQUIV 5197 5177 +EQUIV 5198 5178 +EQUIV 5199 5179 +EQUIV 5200 5180 +EQUIV 5201 5181 +EQUIV 5202 5182 +EQUIV 5203 5183 +EQUIV 5204 5184 +EQUIV 5205 5185 +EQUIV 5206 5186 +EQUIV 5207 5187 +EQUIV 5208 5188 +EQUIV 5209 5189 +EQUIV 5210 5190 +EQUIV 5211 5191 +EQUIV 5212 5192 +EQUIV 5213 5193 +EQUIV 5214 5194 +EQUIV 5215 5195 +EQUIV 5251 5231 +EQUIV 5252 5232 +EQUIV 5253 5233 +EQUIV 5254 5234 +EQUIV 5255 5235 +EQUIV 5261 5221 +EQUIV 5262 5222 +EQUIV 5263 5223 +EQUIV 5264 5224 +EQUIV 5265 5225 +EQUIV 5266 5166 +EQUIV 5267 5167 +EQUIV 5268 5168 +EQUIV 5269 5169 +EQUIV 5270 5170 +EQUIV 5271 5171 +EQUIV 5272 5172 +EQUIV 5273 5173 +EQUIV 5274 5174 +EQUIV 5275 5175 +EQUIV 5276 5216 +EQUIV 5277 5217 +EQUIV 5278 5218 +EQUIV 5279 5219 +EQUIV 5280 5220 +EQUIV 5281 5221 +EQUIV 5282 5222 +EQUIV 5283 5223 +EQUIV 5284 5224 +EQUIV 5285 5225 +EQUIV 5286 5166 +EQUIV 5287 5167 +EQUIV 5288 5168 +EQUIV 5289 5169 +EQUIV 5290 5170 +EQUIV 5291 5171 +EQUIV 5292 5172 +EQUIV 5293 5173 +EQUIV 5294 5174 +EQUIV 5295 5175 +EQUIV 5296 5216 +EQUIV 5297 5217 +EQUIV 5298 5218 +EQUIV 5299 5219 +EQUIV 5300 5220 +EQUIV 5316 5236 +EQUIV 5317 5237 +EQUIV 5318 5238 +EQUIV 5319 5239 +EQUIV 5320 5240 +EQUIV 5321 5241 +EQUIV 5322 5242 +EQUIV 5323 5243 +EQUIV 5324 5244 +EQUIV 5325 5245 +EQUIV 5336 1316 +EQUIV 5337 1317 +EQUIV 5338 1318 +EQUIV 5339 1319 +EQUIV 5340 1320 +EQUIV 5341 1321 +EQUIV 5342 1322 +EQUIV 5343 1323 +EQUIV 5344 1324 +EQUIV 5345 1325 +EQUIV 5346 1366 +EQUIV 5347 1367 +EQUIV 5348 1368 +EQUIV 5349 1369 +EQUIV 5350 1370 +EQUIV 5351 1371 +EQUIV 5352 1372 +EQUIV 5353 1373 +EQUIV 5354 1374 +EQUIV 5355 1375 +EQUIV 5356 1516 +EQUIV 5357 1517 +EQUIV 5358 1518 +EQUIV 5359 1519 +EQUIV 5360 1520 +EQUIV 5361 1321 +EQUIV 5362 1322 +EQUIV 5363 1323 +EQUIV 5364 1324 +EQUIV 5365 1325 +EQUIV 5366 1366 +EQUIV 5367 1367 +EQUIV 5368 1368 +EQUIV 5369 1369 +EQUIV 5370 1370 +EQUIV 5371 1371 +EQUIV 5372 1372 +EQUIV 5373 1373 +EQUIV 5374 1374 +EQUIV 5375 1375 +EQUIV 5376 1516 +EQUIV 5377 1517 +EQUIV 5378 1518 +EQUIV 5379 1519 +EQUIV 5380 1520 +EQUIV 5381 1321 +EQUIV 5382 1322 +EQUIV 5383 1323 +EQUIV 5384 1324 +EQUIV 5385 1325 +EQUIV 5386 1366 +EQUIV 5387 1367 +EQUIV 5388 1368 +EQUIV 5389 1369 +EQUIV 5390 1370 +EQUIV 5391 1371 +EQUIV 5392 1372 +EQUIV 5393 1373 +EQUIV 5394 1374 +EQUIV 5395 1375 +EQUIV 5396 1516 +EQUIV 5397 1517 +EQUIV 5398 1518 +EQUIV 5399 1519 +EQUIV 5400 1520 +EQUIV 5401 1601 +EQUIV 5402 1602 +EQUIV 5403 1603 +EQUIV 5404 1604 +EQUIV 5405 1605 +EQUIV 5406 1306 +EQUIV 5407 1307 +EQUIV 5408 1308 +EQUIV 5409 1309 +EQUIV 5410 1310 +EQUIV 5411 4731 +EQUIV 5412 4732 +EQUIV 5413 4733 +EQUIV 5414 4734 +EQUIV 5415 4735 +EQUIV 5416 2796 +EQUIV 5417 2797 +EQUIV 5418 2798 +EQUIV 5419 2799 +EQUIV 5420 2800 +EQUIV 5421 2801 +EQUIV 5422 2802 +EQUIV 5423 2803 +EQUIV 5424 2804 +EQUIV 5425 2805 +EQUIV 5426 2626 +EQUIV 5427 2627 +EQUIV 5428 2628 +EQUIV 5429 2629 +EQUIV 5430 2630 +EQUIV 5431 2611 +EQUIV 5432 2612 +EQUIV 5433 2613 +EQUIV 5434 2614 +EQUIV 5435 2615 +EQUIV 5436 2616 +EQUIV 5437 2617 +EQUIV 5438 2618 +EQUIV 5439 2619 +EQUIV 5440 2620 +EQUIV 5441 2701 +EQUIV 5442 2702 +EQUIV 5443 2703 +EQUIV 5444 2704 +EQUIV 5445 2705 +EQUIV 5446 2706 +EQUIV 5447 2707 +EQUIV 5448 2708 +EQUIV 5449 2709 +EQUIV 5450 2710 +EQUIV 5451 2711 +EQUIV 5452 2712 +EQUIV 5453 2713 +EQUIV 5454 2714 +EQUIV 5455 2715 +EQUIV 5456 2716 +EQUIV 5457 2717 +EQUIV 5458 2718 +EQUIV 5459 2719 +EQUIV 5460 2720 +EQUIV 5461 2721 +EQUIV 5462 2722 +EQUIV 5463 2723 +EQUIV 5464 2724 +EQUIV 5465 2725 +EQUIV 5466 2726 +EQUIV 5467 2727 +EQUIV 5468 2728 +EQUIV 5469 2729 +EQUIV 5470 2730 +EQUIV 5471 3531 +EQUIV 5472 3532 +EQUIV 5473 3533 +EQUIV 5474 3534 +EQUIV 5475 3535 +EQUIV 5476 3536 +EQUIV 5477 3537 +EQUIV 5478 3538 +EQUIV 5479 3539 +EQUIV 5480 3540 +EQUIV 5481 3541 +EQUIV 5482 3542 +EQUIV 5483 3543 +EQUIV 5484 3544 +EQUIV 5485 3545 +EQUIV 5491 3531 +EQUIV 5492 3532 +EQUIV 5493 3533 +EQUIV 5494 3534 +EQUIV 5495 3535 +EQUIV 5521 4381 +EQUIV 5522 4382 +EQUIV 5523 4383 +EQUIV 5524 4384 +EQUIV 5525 4385 +EQUIV 5531 5511 +EQUIV 5532 5512 +EQUIV 5533 5513 +EQUIV 5534 5514 +EQUIV 5535 5515 +EQUIV 5536 5516 +EQUIV 5537 5517 +EQUIV 5538 5518 +EQUIV 5539 5519 +EQUIV 5540 5520 +EQUIV 5541 4401 +EQUIV 5542 4402 +EQUIV 5543 4403 +EQUIV 5544 4404 +EQUIV 5545 4405 +EQUIV 5556 5516 +EQUIV 5557 5517 +EQUIV 5558 5518 +EQUIV 5559 5519 +EQUIV 5560 5520 +EQUIV 5561 4381 +EQUIV 5562 4382 +EQUIV 5563 4383 +EQUIV 5564 4384 +EQUIV 5565 4385 +EQUIV 5566 5526 +EQUIV 5567 5527 +EQUIV 5568 5528 +EQUIV 5569 5529 +EQUIV 5570 5530 +EQUIV 5571 5511 +EQUIV 5572 5512 +EQUIV 5573 5513 +EQUIV 5574 5514 +EQUIV 5575 5515 +EQUIV 5591 5551 +EQUIV 5592 5552 +EQUIV 5593 5553 +EQUIV 5594 5554 +EQUIV 5595 5555 +EQUIV 5596 5516 +EQUIV 5597 5517 +EQUIV 5598 5518 +EQUIV 5599 5519 +EQUIV 5600 5520 +EQUIV 5601 4381 +EQUIV 5602 4382 +EQUIV 5603 4383 +EQUIV 5604 4384 +EQUIV 5605 4385 +EQUIV 5606 5526 +EQUIV 5607 5527 +EQUIV 5608 5528 +EQUIV 5609 5529 +EQUIV 5610 5530 +EQUIV 5611 5511 +EQUIV 5612 5512 +EQUIV 5613 5513 +EQUIV 5614 5514 +EQUIV 5615 5515 +EQUIV 5616 5576 +EQUIV 5617 5577 +EQUIV 5618 5578 +EQUIV 5619 5579 +EQUIV 5620 5580 +EQUIV 5621 5581 +EQUIV 5622 5582 +EQUIV 5623 5583 +EQUIV 5624 5584 +EQUIV 5625 5585 +EQUIV 5666 5646 +EQUIV 5667 5647 +EQUIV 5668 5648 +EQUIV 5669 5649 +EQUIV 5670 5650 +EQUIV 5676 5636 +EQUIV 5677 5637 +EQUIV 5678 5638 +EQUIV 5679 5639 +EQUIV 5680 5640 +EQUIV 5691 5631 +EQUIV 5692 5632 +EQUIV 5693 5633 +EQUIV 5694 5634 +EQUIV 5695 5635 +EQUIV 5696 5636 +EQUIV 5697 5637 +EQUIV 5698 5638 +EQUIV 5699 5639 +EQUIV 5700 5640 +EQUIV 5701 5681 +EQUIV 5702 5682 +EQUIV 5703 5683 +EQUIV 5704 5684 +EQUIV 5705 5685 +EQUIV 5706 5686 +EQUIV 5707 5687 +EQUIV 5708 5688 +EQUIV 5709 5689 +EQUIV 5710 5690 +EQUIV 5711 5631 +EQUIV 5712 5632 +EQUIV 5713 5633 +EQUIV 5714 5634 +EQUIV 5715 5635 +EQUIV 5716 5636 +EQUIV 5717 5637 +EQUIV 5718 5638 +EQUIV 5719 5639 +EQUIV 5720 5640 +EQUIV 5721 5681 +EQUIV 5722 5682 +EQUIV 5723 5683 +EQUIV 5724 5684 +EQUIV 5725 5685 +EQUIV 5746 5686 +EQUIV 5747 5687 +EQUIV 5748 5688 +EQUIV 5749 5689 +EQUIV 5750 5690 +EQUIV 5751 5631 +EQUIV 5752 5632 +EQUIV 5753 5633 +EQUIV 5754 5634 +EQUIV 5755 5635 +EQUIV 5771 5651 +EQUIV 5772 5652 +EQUIV 5773 5653 +EQUIV 5774 5654 +EQUIV 5775 5655 +EQUIV 5776 5656 +EQUIV 5777 5657 +EQUIV 5778 5658 +EQUIV 5779 5659 +EQUIV 5780 5660 +EQUIV 5781 1101 +EQUIV 5782 1102 +EQUIV 5783 1103 +EQUIV 5784 1104 +EQUIV 5785 1105 +EQUIV 5786 1106 +EQUIV 5787 1107 +EQUIV 5788 1108 +EQUIV 5789 1109 +EQUIV 5790 1110 +EQUIV 5791 1111 +EQUIV 5792 1112 +EQUIV 5793 1113 +EQUIV 5794 1114 +EQUIV 5795 1115 +EQUIV 5796 1096 +EQUIV 5797 1097 +EQUIV 5798 1098 +EQUIV 5799 1099 +EQUIV 5800 1100 +EQUIV 5801 1101 +EQUIV 5802 1102 +EQUIV 5803 1103 +EQUIV 5804 1104 +EQUIV 5805 1105 +EQUIV 5806 1106 +EQUIV 5807 1107 +EQUIV 5808 1108 +EQUIV 5809 1109 +EQUIV 5810 1110 +EQUIV 5811 1151 +EQUIV 5812 1152 +EQUIV 5813 1153 +EQUIV 5814 1154 +EQUIV 5815 1155 +EQUIV 5816 1156 +EQUIV 5817 1157 +EQUIV 5818 1158 +EQUIV 5819 1159 +EQUIV 5820 1160 +EQUIV 5821 1161 +EQUIV 5822 1162 +EQUIV 5823 1163 +EQUIV 5824 1164 +EQUIV 5825 1165 +EQUIV 5826 1166 +EQUIV 5827 1167 +EQUIV 5828 1168 +EQUIV 5829 1169 +EQUIV 5830 1170 +EQUIV 5831 1151 +EQUIV 5832 1152 +EQUIV 5833 1153 +EQUIV 5834 1154 +EQUIV 5835 1155 +EQUIV 5836 1156 +EQUIV 5837 1157 +EQUIV 5838 1158 +EQUIV 5839 1159 +EQUIV 5840 1160 +EQUIV 5841 1161 +EQUIV 5842 1162 +EQUIV 5843 1163 +EQUIV 5844 1164 +EQUIV 5845 1165 +EQUIV 5846 1166 +EQUIV 5847 1167 +EQUIV 5848 1168 +EQUIV 5849 1169 +EQUIV 5850 1170 +EQUIV 5851 1111 +EQUIV 5852 1112 +EQUIV 5853 1113 +EQUIV 5854 1114 +EQUIV 5855 1115 +EQUIV 5856 3056 +EQUIV 5857 3057 +EQUIV 5858 3058 +EQUIV 5859 3059 +EQUIV 5860 3060 +EQUIV 5861 1081 +EQUIV 5862 1082 +EQUIV 5863 1083 +EQUIV 5864 1084 +EQUIV 5865 1085 +EQUIV 5866 1086 +EQUIV 5867 1087 +EQUIV 5868 1088 +EQUIV 5869 1089 +EQUIV 5870 1090 +EQUIV 5871 1091 +EQUIV 5872 1092 +EQUIV 5873 1093 +EQUIV 5874 1094 +EQUIV 5875 1095 +EQUIV 5876 3056 +EQUIV 5877 3057 +EQUIV 5878 3058 +EQUIV 5879 3059 +EQUIV 5880 3060 +EQUIV 5881 3061 +EQUIV 5882 3062 +EQUIV 5883 3063 +EQUIV 5884 3064 +EQUIV 5885 3065 +EQUIV 5886 3066 +EQUIV 5887 3067 +EQUIV 5888 3068 +EQUIV 5889 3069 +EQUIV 5890 3070 +EQUIV 5891 3391 +EQUIV 5892 3392 +EQUIV 5893 3393 +EQUIV 5894 3394 +EQUIV 5895 3395 +EQUIV 5896 916 +EQUIV 5897 917 +EQUIV 5898 918 +EQUIV 5899 919 +EQUIV 5900 920 +EQUIV 5901 681 +EQUIV 5902 682 +EQUIV 5903 683 +EQUIV 5904 684 +EQUIV 5905 685 +EQUIV 5921 621 +EQUIV 5922 622 +EQUIV 5923 623 +EQUIV 5924 624 +EQUIV 5925 625 +EQUIV 5931 5911 +EQUIV 5932 5912 +EQUIV 5933 5913 +EQUIV 5934 5914 +EQUIV 5935 5915 +EQUIV 5941 881 +EQUIV 5942 882 +EQUIV 5943 883 +EQUIV 5944 884 +EQUIV 5945 885 +EQUIV 5946 686 +EQUIV 5947 687 +EQUIV 5948 688 +EQUIV 5949 689 +EQUIV 5950 690 +EQUIV 5951 691 +EQUIV 5952 692 +EQUIV 5953 693 +EQUIV 5954 694 +EQUIV 5955 695 +EQUIV 5956 876 +EQUIV 5957 877 +EQUIV 5958 878 +EQUIV 5959 879 +EQUIV 5960 880 +EQUIV 5961 881 +EQUIV 5962 882 +EQUIV 5963 883 +EQUIV 5964 884 +EQUIV 5965 885 +EQUIV 5966 686 +EQUIV 5967 687 +EQUIV 5968 688 +EQUIV 5969 689 +EQUIV 5970 690 +EQUIV 5971 691 +EQUIV 5972 692 +EQUIV 5973 693 +EQUIV 5974 694 +EQUIV 5975 695 +EQUIV 5976 876 +EQUIV 5977 877 +EQUIV 5978 878 +EQUIV 5979 879 +EQUIV 5980 880 +EQUIV 5981 881 +EQUIV 5982 882 +EQUIV 5983 883 +EQUIV 5984 884 +EQUIV 5985 885 +EQUIV 5986 686 +EQUIV 5987 687 +EQUIV 5988 688 +EQUIV 5989 689 +EQUIV 5990 690 +EQUIV 5991 691 +EQUIV 5992 692 +EQUIV 5993 693 +EQUIV 5994 694 +EQUIV 5995 695 +EQUIV 5996 876 +EQUIV 5997 877 +EQUIV 5998 878 +EQUIV 5999 879 +EQUIV 6000 880 +EQUIV 6016 5916 +EQUIV 6017 5917 +EQUIV 6018 5918 +EQUIV 6019 5919 +EQUIV 6020 5920 +EQUIV 6046 606 +EQUIV 6047 607 +EQUIV 6048 608 +EQUIV 6049 609 +EQUIV 6050 610 +EQUIV 6051 6031 +EQUIV 6052 6032 +EQUIV 6053 6033 +EQUIV 6054 6034 +EQUIV 6055 6035 +EQUIV 6056 6036 +EQUIV 6057 6037 +EQUIV 6058 6038 +EQUIV 6059 6039 +EQUIV 6060 6040 +EQUIV 6061 6041 +EQUIV 6062 6042 +EQUIV 6063 6043 +EQUIV 6064 6044 +EQUIV 6065 6045 +EQUIV 6066 606 +EQUIV 6067 607 +EQUIV 6068 608 +EQUIV 6069 609 +EQUIV 6070 610 +EQUIV 6071 6031 +EQUIV 6072 6032 +EQUIV 6073 6033 +EQUIV 6074 6034 +EQUIV 6075 6035 +EQUIV 6076 6036 +EQUIV 6077 6037 +EQUIV 6078 6038 +EQUIV 6079 6039 +EQUIV 6080 6040 +EQUIV 6081 6041 +EQUIV 6082 6042 +EQUIV 6083 6043 +EQUIV 6084 6044 +EQUIV 6085 6045 +EQUIV 6086 606 +EQUIV 6087 607 +EQUIV 6088 608 +EQUIV 6089 609 +EQUIV 6090 610 +EQUIV 6091 6031 +EQUIV 6092 6032 +EQUIV 6093 6033 +EQUIV 6094 6034 +EQUIV 6095 6035 +EQUIV 6096 6036 +EQUIV 6097 6037 +EQUIV 6098 6038 +EQUIV 6099 6039 +EQUIV 6100 6040 +EQUIV 6141 561 +EQUIV 6142 562 +EQUIV 6143 563 +EQUIV 6144 564 +EQUIV 6145 565 +EQUIV 6146 566 +EQUIV 6147 567 +EQUIV 6148 568 +EQUIV 6149 569 +EQUIV 6150 570 +EQUIV 6151 571 +EQUIV 6152 572 +EQUIV 6153 573 +EQUIV 6154 574 +EQUIV 6155 575 +EQUIV 6156 576 +EQUIV 6157 577 +EQUIV 6158 578 +EQUIV 6159 579 +EQUIV 6160 580 +EQUIV 6171 6111 +EQUIV 6172 6112 +EQUIV 6173 6113 +EQUIV 6174 6114 +EQUIV 6175 6115 +EQUIV 6176 6116 +EQUIV 6177 6117 +EQUIV 6178 6118 +EQUIV 6179 6119 +EQUIV 6180 6120 +EQUIV 6181 6121 +EQUIV 6182 6122 +EQUIV 6183 6123 +EQUIV 6184 6124 +EQUIV 6185 6125 +EQUIV 6186 6166 +EQUIV 6187 6167 +EQUIV 6188 6168 +EQUIV 6189 6169 +EQUIV 6190 6170 +EQUIV 6201 6101 +EQUIV 6202 6102 +EQUIV 6203 6103 +EQUIV 6204 6104 +EQUIV 6205 6105 +EQUIV 6206 6106 +EQUIV 6207 6107 +EQUIV 6208 6108 +EQUIV 6209 6109 +EQUIV 6210 6110 +EQUIV 6211 6191 +EQUIV 6212 6192 +EQUIV 6213 6193 +EQUIV 6214 6194 +EQUIV 6215 6195 +EQUIV 6216 6196 +EQUIV 6217 6197 +EQUIV 6218 6198 +EQUIV 6219 6199 +EQUIV 6220 6200 +EQUIV 6221 6041 +EQUIV 6222 6042 +EQUIV 6223 6043 +EQUIV 6224 6044 +EQUIV 6225 6045 +EQUIV 6231 591 +EQUIV 6232 592 +EQUIV 6233 593 +EQUIV 6234 594 +EQUIV 6235 595 +EQUIV 6236 596 +EQUIV 6237 597 +EQUIV 6238 598 +EQUIV 6239 599 +EQUIV 6240 600 +EQUIV 6241 601 +EQUIV 6242 602 +EQUIV 6243 603 +EQUIV 6244 604 +EQUIV 6245 605 +EQUIV 6246 606 +EQUIV 6247 607 +EQUIV 6248 608 +EQUIV 6249 609 +EQUIV 6250 610 +EQUIV 6251 6031 +EQUIV 6252 6032 +EQUIV 6253 6033 +EQUIV 6254 6034 +EQUIV 6255 6035 +EQUIV 6256 6036 +EQUIV 6257 6037 +EQUIV 6258 6038 +EQUIV 6259 6039 +EQUIV 6260 6040 +EQUIV 6261 6041 +EQUIV 6262 6042 +EQUIV 6263 6043 +EQUIV 6264 6044 +EQUIV 6265 6045 +EQUIV 6266 6226 +EQUIV 6267 6227 +EQUIV 6268 6228 +EQUIV 6269 6229 +EQUIV 6270 6230 +EQUIV 6271 591 +EQUIV 6272 592 +EQUIV 6273 593 +EQUIV 6274 594 +EQUIV 6275 595 +EQUIV 6316 6276 +EQUIV 6317 6277 +EQUIV 6318 6278 +EQUIV 6319 6279 +EQUIV 6320 6280 +EQUIV 6321 6281 +EQUIV 6322 6282 +EQUIV 6323 6283 +EQUIV 6324 6284 +EQUIV 6325 6285 +EQUIV 6326 6286 +EQUIV 6327 6287 +EQUIV 6328 6288 +EQUIV 6329 6289 +EQUIV 6330 6290 +EQUIV 6391 6331 +EQUIV 6392 6332 +EQUIV 6393 6333 +EQUIV 6394 6334 +EQUIV 6395 6335 +EQUIV 6396 576 +EQUIV 6397 577 +EQUIV 6398 578 +EQUIV 6399 579 +EQUIV 6400 580 +EQUIV 6401 581 +EQUIV 6402 582 +EQUIV 6403 583 +EQUIV 6404 584 +EQUIV 6405 585 +EQUIV 6406 6286 +EQUIV 6407 6287 +EQUIV 6408 6288 +EQUIV 6409 6289 +EQUIV 6410 6290 +EQUIV 6411 6291 +EQUIV 6412 6292 +EQUIV 6413 6293 +EQUIV 6414 6294 +EQUIV 6415 6295 +EQUIV 6436 6416 +EQUIV 6437 6417 +EQUIV 6438 6418 +EQUIV 6439 6419 +EQUIV 6440 6420 +EQUIV 6441 6421 +EQUIV 6442 6422 +EQUIV 6443 6423 +EQUIV 6444 6424 +EQUIV 6445 6425 +EQUIV 6446 6426 +EQUIV 6447 6427 +EQUIV 6448 6428 +EQUIV 6449 6429 +EQUIV 6450 6430 +EQUIV 6451 6431 +EQUIV 6452 6432 +EQUIV 6453 6433 +EQUIV 6454 6434 +EQUIV 6455 6435 +EQUIV 6456 6416 +EQUIV 6457 6417 +EQUIV 6458 6418 +EQUIV 6459 6419 +EQUIV 6460 6420 +EQUIV 6461 6421 +EQUIV 6462 6422 +EQUIV 6463 6423 +EQUIV 6464 6424 +EQUIV 6465 6425 +EQUIV 6466 6426 +EQUIV 6467 6427 +EQUIV 6468 6428 +EQUIV 6469 6429 +EQUIV 6470 6430 +EQUIV 6491 6471 +EQUIV 6492 6472 +EQUIV 6493 6473 +EQUIV 6494 6474 +EQUIV 6495 6475 +EQUIV 6496 6476 +EQUIV 6497 6477 +EQUIV 6498 6478 +EQUIV 6499 6479 +EQUIV 6500 6480 +EQUIV 6501 6481 +EQUIV 6502 6482 +EQUIV 6503 6483 +EQUIV 6504 6484 +EQUIV 6505 6485 +EQUIV 6506 6486 +EQUIV 6507 6487 +EQUIV 6508 6488 +EQUIV 6509 6489 +EQUIV 6510 6490 +EQUIV 6511 6471 +EQUIV 6512 6472 +EQUIV 6513 6473 +EQUIV 6514 6474 +EQUIV 6515 6475 +EQUIV 6566 6546 +EQUIV 6567 6547 +EQUIV 6568 6548 +EQUIV 6569 6549 +EQUIV 6570 6550 +EQUIV 6571 6551 +EQUIV 6572 6552 +EQUIV 6573 6553 +EQUIV 6574 6554 +EQUIV 6575 6555 +EQUIV 6576 6556 +EQUIV 6577 6557 +EQUIV 6578 6558 +EQUIV 6579 6559 +EQUIV 6580 6560 +EQUIV 6581 6561 +EQUIV 6582 6562 +EQUIV 6583 6563 +EQUIV 6584 6564 +EQUIV 6585 6565 +EQUIV 6586 6546 +EQUIV 6587 6547 +EQUIV 6588 6548 +EQUIV 6589 6549 +EQUIV 6590 6550 +EQUIV 6631 6591 +EQUIV 6632 6592 +EQUIV 6633 6593 +EQUIV 6634 6594 +EQUIV 6635 6595 +EQUIV 6636 6596 +EQUIV 6637 6597 +EQUIV 6638 6598 +EQUIV 6639 6599 +EQUIV 6640 6600 +EQUIV 6641 6621 +EQUIV 6642 6622 +EQUIV 6643 6623 +EQUIV 6644 6624 +EQUIV 6645 6625 +EQUIV 6646 6626 +EQUIV 6647 6627 +EQUIV 6648 6628 +EQUIV 6649 6629 +EQUIV 6650 6630 +EQUIV 6651 6591 +EQUIV 6652 6592 +EQUIV 6653 6593 +EQUIV 6654 6594 +EQUIV 6655 6595 +EQUIV 6656 6536 +EQUIV 6657 6537 +EQUIV 6658 6538 +EQUIV 6659 6539 +EQUIV 6660 6540 +EQUIV 6666 6526 +EQUIV 6667 6527 +EQUIV 6668 6528 +EQUIV 6669 6529 +EQUIV 6670 6530 +EQUIV 6671 6531 +EQUIV 6672 6532 +EQUIV 6673 6533 +EQUIV 6674 6534 +EQUIV 6675 6535 +EQUIV 6676 6596 +EQUIV 6677 6597 +EQUIV 6678 6598 +EQUIV 6679 6599 +EQUIV 6680 6600 +EQUIV 6681 6621 +EQUIV 6682 6622 +EQUIV 6683 6623 +EQUIV 6684 6624 +EQUIV 6685 6625 +EQUIV 6686 6626 +EQUIV 6687 6627 +EQUIV 6688 6628 +EQUIV 6689 6629 +EQUIV 6690 6630 +EQUIV 6691 6551 +EQUIV 6692 6552 +EQUIV 6693 6553 +EQUIV 6694 6554 +EQUIV 6695 6555 +EQUIV 6736 6716 +EQUIV 6737 6717 +EQUIV 6738 6718 +EQUIV 6739 6719 +EQUIV 6740 6720 +EQUIV 6786 6766 +EQUIV 6787 6767 +EQUIV 6788 6768 +EQUIV 6789 6769 +EQUIV 6790 6770 +EQUIV 6791 6771 +EQUIV 6792 6772 +EQUIV 6793 6773 +EQUIV 6794 6774 +EQUIV 6795 6775 +EQUIV 6796 6776 +EQUIV 6797 6777 +EQUIV 6798 6778 +EQUIV 6799 6779 +EQUIV 6800 6780 +EQUIV 6821 6801 +EQUIV 6822 6802 +EQUIV 6823 6803 +EQUIV 6824 6804 +EQUIV 6825 6805 +EQUIV 6826 6806 +EQUIV 6827 6807 +EQUIV 6828 6808 +EQUIV 6829 6809 +EQUIV 6830 6810 +EQUIV 6831 6811 +EQUIV 6832 6812 +EQUIV 6833 6813 +EQUIV 6834 6814 +EQUIV 6835 6815 +EQUIV 6841 6741 +EQUIV 6842 6742 +EQUIV 6843 6743 +EQUIV 6844 6744 +EQUIV 6845 6745 +EQUIV 6846 6746 +EQUIV 6847 6747 +EQUIV 6848 6748 +EQUIV 6849 6749 +EQUIV 6850 6750 +EQUIV 6856 6816 +EQUIV 6857 6817 +EQUIV 6858 6818 +EQUIV 6859 6819 +EQUIV 6860 6820 +EQUIV 6861 6801 +EQUIV 6862 6802 +EQUIV 6863 6803 +EQUIV 6864 6804 +EQUIV 6865 6805 +EQUIV 6906 6866 +EQUIV 6907 6867 +EQUIV 6908 6868 +EQUIV 6909 6869 +EQUIV 6910 6870 +EQUIV 6911 6891 +EQUIV 6912 6892 +EQUIV 6913 6893 +EQUIV 6914 6894 +EQUIV 6915 6895 +EQUIV 6956 6916 +EQUIV 6957 6917 +EQUIV 6958 6918 +EQUIV 6959 6919 +EQUIV 6960 6920 +EQUIV 6966 6886 +EQUIV 6967 6887 +EQUIV 6968 6888 +EQUIV 6969 6889 +EQUIV 6970 6890 +EQUIV 6971 6871 +EQUIV 6972 6872 +EQUIV 6973 6873 +EQUIV 6974 6874 +EQUIV 6975 6875 +EQUIV 6976 6876 +EQUIV 6977 6877 +EQUIV 6978 6878 +EQUIV 6979 6879 +EQUIV 6980 6880 +EQUIV 7016 6996 +EQUIV 7017 6997 +EQUIV 7018 6998 +EQUIV 7019 6999 +EQUIV 7020 7000 +EQUIV 7021 7001 +EQUIV 7022 7002 +EQUIV 7023 7003 +EQUIV 7024 7004 +EQUIV 7025 7005 +EQUIV 7026 7006 +EQUIV 7027 7007 +EQUIV 7028 7008 +EQUIV 7029 7009 +EQUIV 7030 7010 +EQUIV 7031 7011 +EQUIV 7032 7012 +EQUIV 7033 7013 +EQUIV 7034 7014 +EQUIV 7035 7015 +EQUIV 7036 6996 +EQUIV 7037 6997 +EQUIV 7038 6998 +EQUIV 7039 6999 +EQUIV 7040 7000 +EQUIV 7041 7001 +EQUIV 7042 7002 +EQUIV 7043 7003 +EQUIV 7044 7004 +EQUIV 7045 7005 +EQUIV 7046 7006 +EQUIV 7047 7007 +EQUIV 7048 7008 +EQUIV 7049 7009 +EQUIV 7050 7010 +EQUIV 7101 7061 +EQUIV 7102 7062 +EQUIV 7103 7063 +EQUIV 7104 7064 +EQUIV 7105 7065 +EQUIV 7126 7106 +EQUIV 7127 7107 +EQUIV 7128 7108 +EQUIV 7129 7109 +EQUIV 7130 7110 +EQUIV 7131 7111 +EQUIV 7132 7112 +EQUIV 7133 7113 +EQUIV 7134 7114 +EQUIV 7135 7115 +EQUIV 7136 7116 +EQUIV 7137 7117 +EQUIV 7138 7118 +EQUIV 7139 7119 +EQUIV 7140 7120 +EQUIV 7161 7141 +EQUIV 7162 7142 +EQUIV 7163 7143 +EQUIV 7164 7144 +EQUIV 7165 7145 +EQUIV 7221 7201 +EQUIV 7222 7202 +EQUIV 7223 7203 +EQUIV 7224 7204 +EQUIV 7225 7205 +EQUIV 7251 7111 +EQUIV 7252 7112 +EQUIV 7253 7113 +EQUIV 7254 7114 +EQUIV 7255 7115 +EQUIV 7256 7116 +EQUIV 7257 7117 +EQUIV 7258 7118 +EQUIV 7259 7119 +EQUIV 7260 7120 +EQUIV 7261 7121 +EQUIV 7262 7122 +EQUIV 7263 7123 +EQUIV 7264 7124 +EQUIV 7265 7125 +EQUIV 7266 7106 +EQUIV 7267 7107 +EQUIV 7268 7108 +EQUIV 7269 7109 +EQUIV 7270 7110 +EQUIV 7271 7111 +EQUIV 7272 7112 +EQUIV 7273 7113 +EQUIV 7274 7114 +EQUIV 7275 7115 +EQUIV 7276 7176 +EQUIV 7277 7177 +EQUIV 7278 7178 +EQUIV 7279 7179 +EQUIV 7280 7180 +EQUIV 7281 7181 +EQUIV 7282 7182 +EQUIV 7283 7183 +EQUIV 7284 7184 +EQUIV 7285 7185 +EQUIV 7291 7171 +EQUIV 7292 7172 +EQUIV 7293 7173 +EQUIV 7294 7174 +EQUIV 7295 7175 +EQUIV 7296 7176 +EQUIV 7297 7177 +EQUIV 7298 7178 +EQUIV 7299 7179 +EQUIV 7300 7180 +EQUIV 7301 7181 +EQUIV 7302 7182 +EQUIV 7303 7183 +EQUIV 7304 7184 +EQUIV 7305 7185 +EQUIV 7306 7286 +EQUIV 7307 7287 +EQUIV 7308 7288 +EQUIV 7309 7289 +EQUIV 7310 7290 +EQUIV 7311 7171 +EQUIV 7312 7172 +EQUIV 7313 7173 +EQUIV 7314 7174 +EQUIV 7315 7175 +EQUIV 7316 7176 +EQUIV 7317 7177 +EQUIV 7318 7178 +EQUIV 7319 7179 +EQUIV 7320 7180 +EQUIV 7321 7181 +EQUIV 7322 7182 +EQUIV 7323 7183 +EQUIV 7324 7184 +EQUIV 7325 7185 +EQUIV 7326 7286 +EQUIV 7327 7287 +EQUIV 7328 7288 +EQUIV 7329 7289 +EQUIV 7330 7290 +EQUIV 7331 7171 +EQUIV 7332 7172 +EQUIV 7333 7173 +EQUIV 7334 7174 +EQUIV 7335 7175 +EQUIV 7336 7176 +EQUIV 7337 7177 +EQUIV 7338 7178 +EQUIV 7339 7179 +EQUIV 7340 7180 +EQUIV 7341 7181 +EQUIV 7342 7182 +EQUIV 7343 7183 +EQUIV 7344 7184 +EQUIV 7345 7185 +EQUIV 7346 7286 +EQUIV 7347 7287 +EQUIV 7348 7288 +EQUIV 7349 7289 +EQUIV 7350 7290 +EQUIV 7351 7171 +EQUIV 7352 7172 +EQUIV 7353 7173 +EQUIV 7354 7174 +EQUIV 7355 7175 +EQUIV 7356 7176 +EQUIV 7357 7177 +EQUIV 7358 7178 +EQUIV 7359 7179 +EQUIV 7360 7180 +EQUIV 7361 7181 +EQUIV 7362 7182 +EQUIV 7363 7183 +EQUIV 7364 7184 +EQUIV 7365 7185 +EQUIV 7366 7186 +EQUIV 7367 7187 +EQUIV 7368 7188 +EQUIV 7369 7189 +EQUIV 7370 7190 +EQUIV 7406 7146 +EQUIV 7407 7147 +EQUIV 7408 7148 +EQUIV 7409 7149 +EQUIV 7410 7150 +EQUIV 7411 7151 +EQUIV 7412 7152 +EQUIV 7413 7153 +EQUIV 7414 7154 +EQUIV 7415 7155 +EQUIV 7416 7156 +EQUIV 7417 7157 +EQUIV 7418 7158 +EQUIV 7419 7159 +EQUIV 7420 7160 +EQUIV 7421 7121 +EQUIV 7422 7122 +EQUIV 7423 7123 +EQUIV 7424 7124 +EQUIV 7425 7125 +EQUIV 7426 7106 +EQUIV 7427 7107 +EQUIV 7428 7108 +EQUIV 7429 7109 +EQUIV 7430 7110 +EQUIV 7431 7111 +EQUIV 7432 7112 +EQUIV 7433 7113 +EQUIV 7434 7114 +EQUIV 7435 7115 +EQUIV 7436 7116 +EQUIV 7437 7117 +EQUIV 7438 7118 +EQUIV 7439 7119 +EQUIV 7440 7120 +EQUIV 7441 7141 +EQUIV 7442 7142 +EQUIV 7443 7143 +EQUIV 7444 7144 +EQUIV 7445 7145 +EQUIV 7446 7166 +EQUIV 7447 7167 +EQUIV 7448 7168 +EQUIV 7449 7169 +EQUIV 7450 7170 +EQUIV 7461 7381 +EQUIV 7462 7382 +EQUIV 7463 7383 +EQUIV 7464 7384 +EQUIV 7465 7385 +EQUIV 7466 7386 +EQUIV 7467 7387 +EQUIV 7468 7388 +EQUIV 7469 7389 +EQUIV 7470 7390 +EQUIV 7471 7391 +EQUIV 7472 7392 +EQUIV 7473 7393 +EQUIV 7474 7394 +EQUIV 7475 7395 +EQUIV 7476 7396 +EQUIV 7477 7397 +EQUIV 7478 7398 +EQUIV 7479 7399 +EQUIV 7480 7400 +EQUIV 7501 7401 +EQUIV 7502 7402 +EQUIV 7503 7403 +EQUIV 7504 7404 +EQUIV 7505 7405 +EQUIV 7506 7166 +EQUIV 7507 7167 +EQUIV 7508 7168 +EQUIV 7509 7169 +EQUIV 7510 7170 +EQUIV 7511 7451 +EQUIV 7512 7452 +EQUIV 7513 7453 +EQUIV 7514 7454 +EQUIV 7515 7455 +EQUIV 7516 7456 +EQUIV 7517 7457 +EQUIV 7518 7458 +EQUIV 7519 7459 +EQUIV 7520 7460 +EQUIV 7526 7286 +EQUIV 7527 7287 +EQUIV 7528 7288 +EQUIV 7529 7289 +EQUIV 7530 7290 +EQUIV 7531 7451 +EQUIV 7532 7452 +EQUIV 7533 7453 +EQUIV 7534 7454 +EQUIV 7535 7455 +EQUIV 7536 7456 +EQUIV 7537 7457 +EQUIV 7538 7458 +EQUIV 7539 7459 +EQUIV 7540 7460 +EQUIV 7541 7381 +EQUIV 7542 7382 +EQUIV 7543 7383 +EQUIV 7544 7384 +EQUIV 7545 7385 +EQUIV 7546 7386 +EQUIV 7547 7387 +EQUIV 7548 7388 +EQUIV 7549 7389 +EQUIV 7550 7390 +EQUIV 7551 7391 +EQUIV 7552 7392 +EQUIV 7553 7393 +EQUIV 7554 7394 +EQUIV 7555 7395 +EQUIV 7556 7456 +EQUIV 7557 7457 +EQUIV 7558 7458 +EQUIV 7559 7459 +EQUIV 7560 7460 +EQUIV 7561 7381 +EQUIV 7562 7382 +EQUIV 7563 7383 +EQUIV 7564 7384 +EQUIV 7565 7385 +EQUIV 7566 7386 +EQUIV 7567 7387 +EQUIV 7568 7388 +EQUIV 7569 7389 +EQUIV 7570 7390 +EQUIV 7571 7391 +EQUIV 7572 7392 +EQUIV 7573 7393 +EQUIV 7574 7394 +EQUIV 7575 7395 +EQUIV 7576 7456 +EQUIV 7577 7457 +EQUIV 7578 7458 +EQUIV 7579 7459 +EQUIV 7580 7460 +EQUIV 7581 7381 +EQUIV 7582 7382 +EQUIV 7583 7383 +EQUIV 7584 7384 +EQUIV 7585 7385 +EQUIV 7621 7601 +EQUIV 7622 7602 +EQUIV 7623 7603 +EQUIV 7624 7604 +EQUIV 7625 7605 +EQUIV 7631 7371 +EQUIV 7632 7372 +EQUIV 7633 7373 +EQUIV 7634 7374 +EQUIV 7635 7375 +EQUIV 7636 7596 +EQUIV 7637 7597 +EQUIV 7638 7598 +EQUIV 7639 7599 +EQUIV 7640 7600 +EQUIV 7661 6361 +EQUIV 7662 6362 +EQUIV 7663 6363 +EQUIV 7664 6364 +EQUIV 7665 6365 +EQUIV 7666 6366 +EQUIV 7667 6367 +EQUIV 7668 6368 +EQUIV 7669 6369 +EQUIV 7670 6370 +EQUIV 7671 6371 +EQUIV 7672 6372 +EQUIV 7673 6373 +EQUIV 7674 6374 +EQUIV 7675 6375 +EQUIV 7676 6356 +EQUIV 7677 6357 +EQUIV 7678 6358 +EQUIV 7679 6359 +EQUIV 7680 6360 +EQUIV 7681 6361 +EQUIV 7682 6362 +EQUIV 7683 6363 +EQUIV 7684 6364 +EQUIV 7685 6365 +EQUIV 7686 6366 +EQUIV 7687 6367 +EQUIV 7688 6368 +EQUIV 7689 6369 +EQUIV 7690 6370 +EQUIV 7716 7696 +EQUIV 7717 7697 +EQUIV 7718 7698 +EQUIV 7719 7699 +EQUIV 7720 7700 +EQUIV 7721 7701 +EQUIV 7722 7702 +EQUIV 7723 7703 +EQUIV 7724 7704 +EQUIV 7725 7705 +EQUIV 7736 7216 +EQUIV 7737 7217 +EQUIV 7738 7218 +EQUIV 7739 7219 +EQUIV 7740 7220 +EQUIV 7741 7201 +EQUIV 7742 7202 +EQUIV 7743 7203 +EQUIV 7744 7204 +EQUIV 7745 7205 +EQUIV 7746 7226 +EQUIV 7747 7227 +EQUIV 7748 7228 +EQUIV 7749 7229 +EQUIV 7750 7230 +EQUIV 7751 7231 +EQUIV 7752 7232 +EQUIV 7753 7233 +EQUIV 7754 7234 +EQUIV 7755 7235 +EQUIV 7756 7236 +EQUIV 7757 7237 +EQUIV 7758 7238 +EQUIV 7759 7239 +EQUIV 7760 7240 +EQUIV 7766 7006 +EQUIV 7767 7007 +EQUIV 7768 7008 +EQUIV 7769 7009 +EQUIV 7770 7010 +EQUIV 7771 7011 +EQUIV 7772 7012 +EQUIV 7773 7013 +EQUIV 7774 7014 +EQUIV 7775 7015 +EQUIV 7776 6996 +EQUIV 7777 6997 +EQUIV 7778 6998 +EQUIV 7779 6999 +EQUIV 7780 7000 +EQUIV 7781 7001 +EQUIV 7782 7002 +EQUIV 7783 7003 +EQUIV 7784 7004 +EQUIV 7785 7005 +EQUIV 7786 7006 +EQUIV 7787 7007 +EQUIV 7788 7008 +EQUIV 7789 7009 +EQUIV 7790 7010 +EQUIV 7791 7011 +EQUIV 7792 7012 +EQUIV 7793 7013 +EQUIV 7794 7014 +EQUIV 7795 7015 +EQUIV 7811 7051 +EQUIV 7812 7052 +EQUIV 7813 7053 +EQUIV 7814 7054 +EQUIV 7815 7055 +EQUIV 7816 7056 +EQUIV 7817 7057 +EQUIV 7818 7058 +EQUIV 7819 7059 +EQUIV 7820 7060 +EQUIV 7826 7806 +EQUIV 7827 7807 +EQUIV 7828 7808 +EQUIV 7829 7809 +EQUIV 7830 7810 +EQUIV 7831 7051 +EQUIV 7832 7052 +EQUIV 7833 7053 +EQUIV 7834 7054 +EQUIV 7835 7055 +EQUIV 7836 7056 +EQUIV 7837 7057 +EQUIV 7838 7058 +EQUIV 7839 7059 +EQUIV 7840 7060 +EQUIV 7841 7821 +EQUIV 7842 7822 +EQUIV 7843 7823 +EQUIV 7844 7824 +EQUIV 7845 7825 +EQUIV 7846 7806 +EQUIV 7847 7807 +EQUIV 7848 7808 +EQUIV 7849 7809 +EQUIV 7850 7810 +EQUIV 7851 7051 +EQUIV 7852 7052 +EQUIV 7853 7053 +EQUIV 7854 7054 +EQUIV 7855 7055 +EQUIV 7861 7241 +EQUIV 7862 7242 +EQUIV 7863 7243 +EQUIV 7864 7244 +EQUIV 7865 7245 +EQUIV 7866 7246 +EQUIV 7867 7247 +EQUIV 7868 7248 +EQUIV 7869 7249 +EQUIV 7870 7250 +EQUIV 7876 7856 +EQUIV 7877 7857 +EQUIV 7878 7858 +EQUIV 7879 7859 +EQUIV 7880 7860 +EQUIV 7881 7241 +EQUIV 7882 7242 +EQUIV 7883 7243 +EQUIV 7884 7244 +EQUIV 7885 7245 +EQUIV 7906 7886 +EQUIV 7907 7887 +EQUIV 7908 7888 +EQUIV 7909 7889 +EQUIV 7910 7890 +EQUIV 7911 7891 +EQUIV 7912 7892 +EQUIV 7913 7893 +EQUIV 7914 7894 +EQUIV 7915 7895 +EQUIV 7916 7896 +EQUIV 7917 7897 +EQUIV 7918 7898 +EQUIV 7919 7899 +EQUIV 7920 7900 +EQUIV 7921 7181 +EQUIV 7922 7182 +EQUIV 7923 7183 +EQUIV 7924 7184 +EQUIV 7925 7185 +EQUIV 7926 7286 +EQUIV 7927 7287 +EQUIV 7928 7288 +EQUIV 7929 7289 +EQUIV 7930 7290 +EQUIV 7931 7451 +EQUIV 7932 7452 +EQUIV 7933 7453 +EQUIV 7934 7454 +EQUIV 7935 7455 +EQUIV 7936 7456 +EQUIV 7937 7457 +EQUIV 7938 7458 +EQUIV 7939 7459 +EQUIV 7940 7460 +EQUIV 7941 7521 +EQUIV 7942 7522 +EQUIV 7943 7523 +EQUIV 7944 7524 +EQUIV 7945 7525 +EQUIV 7946 7286 +EQUIV 7947 7287 +EQUIV 7948 7288 +EQUIV 7949 7289 +EQUIV 7950 7290 +EQUIV 7951 7451 +EQUIV 7952 7452 +EQUIV 7953 7453 +EQUIV 7954 7454 +EQUIV 7955 7455 +EQUIV 7956 7456 +EQUIV 7957 7457 +EQUIV 7958 7458 +EQUIV 7959 7459 +EQUIV 7960 7460 +EQUIV 7961 7381 +EQUIV 7962 7382 +EQUIV 7963 7383 +EQUIV 7964 7384 +EQUIV 7965 7385 +EQUIV 7966 7586 +EQUIV 7967 7587 +EQUIV 7968 7588 +EQUIV 7969 7589 +EQUIV 7970 7590 +EQUIV 7971 7591 +EQUIV 7972 7592 +EQUIV 7973 7593 +EQUIV 7974 7594 +EQUIV 7975 7595 +EQUIV 7976 7596 +EQUIV 7977 7597 +EQUIV 7978 7598 +EQUIV 7979 7599 +EQUIV 7980 7600 +EQUIV 7981 7641 +EQUIV 7982 7642 +EQUIV 7983 7643 +EQUIV 7984 7644 +EQUIV 7985 7645 +EQUIV 7986 7646 +EQUIV 7987 7647 +EQUIV 7988 7648 +EQUIV 7989 7649 +EQUIV 7990 7650 +EQUIV 7991 7651 +EQUIV 7992 7652 +EQUIV 7993 7653 +EQUIV 7994 7654 +EQUIV 7995 7655 +EQUIV 7996 7656 +EQUIV 7997 7657 +EQUIV 7998 7658 +EQUIV 7999 7659 +EQUIV 8000 7660 +EQUIV 8001 6361 +EQUIV 8002 6362 +EQUIV 8003 6363 +EQUIV 8004 6364 +EQUIV 8005 6365 +EQUIV 8006 6366 +EQUIV 8007 6367 +EQUIV 8008 6368 +EQUIV 8009 6369 +EQUIV 8010 6370 +EQUIV 8011 7691 +EQUIV 8012 7692 +EQUIV 8013 7693 +EQUIV 8014 7694 +EQUIV 8015 7695 +EQUIV 8031 7691 +EQUIV 8032 7692 +EQUIV 8033 7693 +EQUIV 8034 7694 +EQUIV 8035 7695 +EQUIV 8036 7696 +EQUIV 8037 7697 +EQUIV 8038 7698 +EQUIV 8039 7699 +EQUIV 8040 7700 +EQUIV 8041 7701 +EQUIV 8042 7702 +EQUIV 8043 7703 +EQUIV 8044 7704 +EQUIV 8045 7705 +EQUIV 8046 7706 +EQUIV 8047 7707 +EQUIV 8048 7708 +EQUIV 8049 7709 +EQUIV 8050 7710 +EQUIV 8081 6521 +EQUIV 8082 6522 +EQUIV 8083 6523 +EQUIV 8084 6524 +EQUIV 8085 6525 +EQUIV 8096 6476 +EQUIV 8097 6477 +EQUIV 8098 6478 +EQUIV 8099 6479 +EQUIV 8100 6480 +EQUIV 8141 8101 +EQUIV 8142 8102 +EQUIV 8143 8103 +EQUIV 8144 8104 +EQUIV 8145 8105 +EQUIV 8146 8126 +EQUIV 8147 8127 +EQUIV 8148 8128 +EQUIV 8149 8129 +EQUIV 8150 8130 +EQUIV 8151 8131 +EQUIV 8152 8132 +EQUIV 8153 8133 +EQUIV 8154 8134 +EQUIV 8155 8135 +EQUIV 8156 8136 +EQUIV 8157 8137 +EQUIV 8158 8138 +EQUIV 8159 8139 +EQUIV 8160 8140 +EQUIV 8161 8101 +EQUIV 8162 8102 +EQUIV 8163 8103 +EQUIV 8164 8104 +EQUIV 8165 8105 +EQUIV 8166 8126 +EQUIV 8167 8127 +EQUIV 8168 8128 +EQUIV 8169 8129 +EQUIV 8170 8130 +EQUIV 8221 8201 +EQUIV 8222 8202 +EQUIV 8223 8203 +EQUIV 8224 8204 +EQUIV 8225 8205 +EQUIV 8226 8206 +EQUIV 8227 8207 +EQUIV 8228 8208 +EQUIV 8229 8209 +EQUIV 8230 8210 +EQUIV 8231 8211 +EQUIV 8232 8212 +EQUIV 8233 8213 +EQUIV 8234 8214 +EQUIV 8235 8215 +EQUIV 8236 8216 +EQUIV 8237 8217 +EQUIV 8238 8218 +EQUIV 8239 8219 +EQUIV 8240 8220 +EQUIV 8241 8201 +EQUIV 8242 8202 +EQUIV 8243 8203 +EQUIV 8244 8204 +EQUIV 8245 8205 +EQUIV 8246 8206 +EQUIV 8247 8207 +EQUIV 8248 8208 +EQUIV 8249 8209 +EQUIV 8250 8210 +EQUIV 8251 8211 +EQUIV 8252 8212 +EQUIV 8253 8213 +EQUIV 8254 8214 +EQUIV 8255 8215 +EQUIV 8256 8216 +EQUIV 8257 8217 +EQUIV 8258 8218 +EQUIV 8259 8219 +EQUIV 8260 8220 +EQUIV 8261 8201 +EQUIV 8262 8202 +EQUIV 8263 8203 +EQUIV 8264 8204 +EQUIV 8265 8205 +EQUIV 8336 1036 +EQUIV 8337 1037 +EQUIV 8338 1038 +EQUIV 8339 1039 +EQUIV 8340 1040 +EQUIV 8341 1041 +EQUIV 8342 1042 +EQUIV 8343 1043 +EQUIV 8344 1044 +EQUIV 8345 1045 +EQUIV 8346 1086 +EQUIV 8347 1087 +EQUIV 8348 1088 +EQUIV 8349 1089 +EQUIV 8350 1090 +EQUIV 8351 1091 +EQUIV 8352 1092 +EQUIV 8353 1093 +EQUIV 8354 1094 +EQUIV 8355 1095 +EQUIV 8356 3056 +EQUIV 8357 3057 +EQUIV 8358 3058 +EQUIV 8359 3059 +EQUIV 8360 3060 +EQUIV 8361 3061 +EQUIV 8362 3062 +EQUIV 8363 3063 +EQUIV 8364 3064 +EQUIV 8365 3065 +EQUIV 8366 3066 +EQUIV 8367 3067 +EQUIV 8368 3068 +EQUIV 8369 3069 +EQUIV 8370 3070 +EQUIV 8371 3071 +EQUIV 8372 3072 +EQUIV 8373 3073 +EQUIV 8374 3074 +EQUIV 8375 3075 +EQUIV 8376 1076 +EQUIV 8377 1077 +EQUIV 8378 1078 +EQUIV 8379 1079 +EQUIV 8380 1080 +EQUIV 8381 3061 +EQUIV 8382 3062 +EQUIV 8383 3063 +EQUIV 8384 3064 +EQUIV 8385 3065 +EQUIV 8386 1166 +EQUIV 8387 1167 +EQUIV 8388 1168 +EQUIV 8389 1169 +EQUIV 8390 1170 +EQUIV 8391 1111 +EQUIV 8392 1112 +EQUIV 8393 1113 +EQUIV 8394 1114 +EQUIV 8395 1115 +EQUIV 8396 3056 +EQUIV 8397 3057 +EQUIV 8398 3058 +EQUIV 8399 3059 +EQUIV 8400 3060 +EQUIV 8401 1081 +EQUIV 8402 1082 +EQUIV 8403 1083 +EQUIV 8404 1084 +EQUIV 8405 1085 +EQUIV 8406 1086 +EQUIV 8407 1087 +EQUIV 8408 1088 +EQUIV 8409 1089 +EQUIV 8410 1090 +EQUIV 8411 1091 +EQUIV 8412 1092 +EQUIV 8413 1093 +EQUIV 8414 1094 +EQUIV 8415 1095 +EQUIV 8416 3056 +EQUIV 8417 3057 +EQUIV 8418 3058 +EQUIV 8419 3059 +EQUIV 8420 3060 +EQUIV 8421 3061 +EQUIV 8422 3062 +EQUIV 8423 3063 +EQUIV 8424 3064 +EQUIV 8425 3065 +EQUIV 8426 3066 +EQUIV 8427 3067 +EQUIV 8428 3068 +EQUIV 8429 3069 +EQUIV 8430 3070 +EQUIV 8431 3391 +EQUIV 8432 3392 +EQUIV 8433 3393 +EQUIV 8434 3394 +EQUIV 8435 3395 +EQUIV 8436 916 +EQUIV 8437 917 +EQUIV 8438 918 +EQUIV 8439 919 +EQUIV 8440 920 +EQUIV 8441 921 +EQUIV 8442 922 +EQUIV 8443 923 +EQUIV 8444 924 +EQUIV 8445 925 +EQUIV 8446 926 +EQUIV 8447 927 +EQUIV 8448 928 +EQUIV 8449 929 +EQUIV 8450 930 +EQUIV 8451 931 +EQUIV 8452 932 +EQUIV 8453 933 +EQUIV 8454 934 +EQUIV 8455 935 +EQUIV 8456 936 +EQUIV 8457 937 +EQUIV 8458 938 +EQUIV 8459 939 +EQUIV 8460 940 +EQUIV 8466 3406 +EQUIV 8467 3407 +EQUIV 8468 3408 +EQUIV 8469 3409 +EQUIV 8470 3410 +EQUIV 8471 3071 +EQUIV 8472 3072 +EQUIV 8473 3073 +EQUIV 8474 3074 +EQUIV 8475 3075 +EQUIV 8476 1076 +EQUIV 8477 1077 +EQUIV 8478 1078 +EQUIV 8479 1079 +EQUIV 8480 1080 +EQUIV 8481 3061 +EQUIV 8482 3062 +EQUIV 8483 3063 +EQUIV 8484 3064 +EQUIV 8485 3065 +EQUIV 8486 1166 +EQUIV 8487 1167 +EQUIV 8488 1168 +EQUIV 8489 1169 +EQUIV 8490 1170 +EQUIV 8491 1151 +EQUIV 8492 1152 +EQUIV 8493 1153 +EQUIV 8494 1154 +EQUIV 8495 1155 +EQUIV 8496 1156 +EQUIV 8497 1157 +EQUIV 8498 1158 +EQUIV 8499 1159 +EQUIV 8500 1160 +EQUIV 8501 841 +EQUIV 8502 842 +EQUIV 8503 843 +EQUIV 8504 844 +EQUIV 8505 845 +EQUIV 8506 706 +EQUIV 8507 707 +EQUIV 8508 708 +EQUIV 8509 709 +EQUIV 8510 710 +EQUIV 8511 3371 +EQUIV 8512 3372 +EQUIV 8513 3373 +EQUIV 8514 3374 +EQUIV 8515 3375 +EQUIV 8516 3176 +EQUIV 8517 3177 +EQUIV 8518 3178 +EQUIV 8519 3179 +EQUIV 8520 3180 +EQUIV 8521 3181 +EQUIV 8522 3182 +EQUIV 8523 3183 +EQUIV 8524 3184 +EQUIV 8525 3185 +EQUIV 8526 3006 +EQUIV 8527 3007 +EQUIV 8528 3008 +EQUIV 8529 3009 +EQUIV 8530 3010 +EQUIV 8531 2711 +EQUIV 8532 2712 +EQUIV 8533 2713 +EQUIV 8534 2714 +EQUIV 8535 2715 +EQUIV 8536 3016 +EQUIV 8537 3017 +EQUIV 8538 3018 +EQUIV 8539 3019 +EQUIV 8540 3020 +EQUIV 8541 3021 +EQUIV 8542 3022 +EQUIV 8543 3023 +EQUIV 8544 3024 +EQUIV 8545 3025 +EQUIV 8546 1106 +EQUIV 8547 1107 +EQUIV 8548 1108 +EQUIV 8549 1109 +EQUIV 8550 1110 +EQUIV 8551 1111 +EQUIV 8552 1112 +EQUIV 8553 1113 +EQUIV 8554 1114 +EQUIV 8555 1115 +EQUIV 8556 1096 +EQUIV 8557 1097 +EQUIV 8558 1098 +EQUIV 8559 1099 +EQUIV 8560 1100 +EQUIV 8561 1101 +EQUIV 8562 1102 +EQUIV 8563 1103 +EQUIV 8564 1104 +EQUIV 8565 1105 +EQUIV 8566 1106 +EQUIV 8567 1107 +EQUIV 8568 1108 +EQUIV 8569 1109 +EQUIV 8570 1110 +EQUIV 8571 1151 +EQUIV 8572 1152 +EQUIV 8573 1153 +EQUIV 8574 1154 +EQUIV 8575 1155 +EQUIV 8576 1156 +EQUIV 8577 1157 +EQUIV 8578 1158 +EQUIV 8579 1159 +EQUIV 8580 1160 +EQUIV 8581 841 +EQUIV 8582 842 +EQUIV 8583 843 +EQUIV 8584 844 +EQUIV 8585 845 +EQUIV 8586 826 +EQUIV 8587 827 +EQUIV 8588 828 +EQUIV 8589 829 +EQUIV 8590 830 +EQUIV 8591 831 +EQUIV 8592 832 +EQUIV 8593 833 +EQUIV 8594 834 +EQUIV 8595 835 +EQUIV 8596 916 +EQUIV 8597 917 +EQUIV 8598 918 +EQUIV 8599 919 +EQUIV 8600 920 +EQUIV 8601 921 +EQUIV 8602 922 +EQUIV 8603 923 +EQUIV 8604 924 +EQUIV 8605 925 +EQUIV 8606 3406 +EQUIV 8607 3407 +EQUIV 8608 3408 +EQUIV 8609 3409 +EQUIV 8610 3410 +EQUIV 8611 3071 +EQUIV 8612 3072 +EQUIV 8613 3073 +EQUIV 8614 3074 +EQUIV 8615 3075 +EQUIV 8616 1076 +EQUIV 8617 1077 +EQUIV 8618 1078 +EQUIV 8619 1079 +EQUIV 8620 1080 +EQUIV 8621 3061 +EQUIV 8622 3062 +EQUIV 8623 3063 +EQUIV 8624 3064 +EQUIV 8625 3065 +EQUIV 8626 3066 +EQUIV 8627 3067 +EQUIV 8628 3068 +EQUIV 8629 3069 +EQUIV 8630 3070 +EQUIV 8631 3071 +EQUIV 8632 3072 +EQUIV 8633 3073 +EQUIV 8634 3074 +EQUIV 8635 3075 +EQUIV 8636 996 +EQUIV 8637 997 +EQUIV 8638 998 +EQUIV 8639 999 +EQUIV 8640 1000 +EQUIV 8641 941 +EQUIV 8642 942 +EQUIV 8643 943 +EQUIV 8644 944 +EQUIV 8645 945 +EQUIV 8646 986 +EQUIV 8647 987 +EQUIV 8648 988 +EQUIV 8649 989 +EQUIV 8650 990 +EQUIV 8651 991 +EQUIV 8652 992 +EQUIV 8653 993 +EQUIV 8654 994 +EQUIV 8655 995 +EQUIV 8656 1076 +EQUIV 8657 1077 +EQUIV 8658 1078 +EQUIV 8659 1079 +EQUIV 8660 1080 +EQUIV 8661 1081 +EQUIV 8662 1082 +EQUIV 8663 1083 +EQUIV 8664 1084 +EQUIV 8665 1085 +EQUIV 8666 1086 +EQUIV 8667 1087 +EQUIV 8668 1088 +EQUIV 8669 1089 +EQUIV 8670 1090 +EQUIV 8671 1091 +EQUIV 8672 1092 +EQUIV 8673 1093 +EQUIV 8674 1094 +EQUIV 8675 1095 +EQUIV 8676 3056 +EQUIV 8677 3057 +EQUIV 8678 3058 +EQUIV 8679 3059 +EQUIV 8680 3060 +EQUIV 8681 1081 +EQUIV 8682 1082 +EQUIV 8683 1083 +EQUIV 8684 1084 +EQUIV 8685 1085 +EQUIV 8686 1046 +EQUIV 8687 1047 +EQUIV 8688 1048 +EQUIV 8689 1049 +EQUIV 8690 1050 +EQUIV 8691 1031 +EQUIV 8692 1032 +EQUIV 8693 1033 +EQUIV 8694 1034 +EQUIV 8695 1035 +EQUIV 8696 1036 +EQUIV 8697 1037 +EQUIV 8698 1038 +EQUIV 8699 1039 +EQUIV 8700 1040 +EQUIV 8701 1041 +EQUIV 8702 1042 +EQUIV 8703 1043 +EQUIV 8704 1044 +EQUIV 8705 1045 +EQUIV 8706 1086 +EQUIV 8707 1087 +EQUIV 8708 1088 +EQUIV 8709 1089 +EQUIV 8710 1090 +EQUIV 8711 1091 +EQUIV 8712 1092 +EQUIV 8713 1093 +EQUIV 8714 1094 +EQUIV 8715 1095 +EQUIV 8716 3056 +EQUIV 8717 3057 +EQUIV 8718 3058 +EQUIV 8719 3059 +EQUIV 8720 3060 +EQUIV 8721 1081 +EQUIV 8722 1082 +EQUIV 8723 1083 +EQUIV 8724 1084 +EQUIV 8725 1085 +EQUIV 8726 1086 +EQUIV 8727 1087 +EQUIV 8728 1088 +EQUIV 8729 1089 +EQUIV 8730 1090 +EQUIV 8731 1091 +EQUIV 8732 1092 +EQUIV 8733 1093 +EQUIV 8734 1094 +EQUIV 8735 1095 +EQUIV 8736 3056 +EQUIV 8737 3057 +EQUIV 8738 3058 +EQUIV 8739 3059 +EQUIV 8740 3060 +EQUIV 8741 3061 +EQUIV 8742 3062 +EQUIV 8743 3063 +EQUIV 8744 3064 +EQUIV 8745 3065 +EQUIV 8746 3066 +EQUIV 8747 3067 +EQUIV 8748 3068 +EQUIV 8749 3069 +EQUIV 8750 3070 +EQUIV 8751 3391 +EQUIV 8752 3392 +EQUIV 8753 3393 +EQUIV 8754 3394 +EQUIV 8755 3395 +EQUIV 8756 916 +EQUIV 8757 917 +EQUIV 8758 918 +EQUIV 8759 919 +EQUIV 8760 920 +EQUIV 8761 681 +EQUIV 8762 682 +EQUIV 8763 683 +EQUIV 8764 684 +EQUIV 8765 685 +EQUIV 8766 5906 +EQUIV 8767 5907 +EQUIV 8768 5908 +EQUIV 8769 5909 +EQUIV 8770 5910 +EQUIV 8776 676 +EQUIV 8777 677 +EQUIV 8778 678 +EQUIV 8779 679 +EQUIV 8780 680 +EQUIV 8781 681 +EQUIV 8782 682 +EQUIV 8783 683 +EQUIV 8784 684 +EQUIV 8785 685 +EQUIV 8786 5906 +EQUIV 8787 5907 +EQUIV 8788 5908 +EQUIV 8789 5909 +EQUIV 8790 5910 +EQUIV 8791 8771 +EQUIV 8792 8772 +EQUIV 8793 8773 +EQUIV 8794 8774 +EQUIV 8795 8775 +EQUIV 8801 661 +EQUIV 8802 662 +EQUIV 8803 663 +EQUIV 8804 664 +EQUIV 8805 665 +EQUIV 8806 666 +EQUIV 8807 667 +EQUIV 8808 668 +EQUIV 8809 669 +EQUIV 8810 670 +EQUIV 8811 671 +EQUIV 8812 672 +EQUIV 8813 673 +EQUIV 8814 674 +EQUIV 8815 675 +EQUIV 8816 8796 +EQUIV 8817 8797 +EQUIV 8818 8798 +EQUIV 8819 8799 +EQUIV 8820 8800 +EQUIV 8821 641 +EQUIV 8822 642 +EQUIV 8823 643 +EQUIV 8824 644 +EQUIV 8825 645 +EQUIV 8826 626 +EQUIV 8827 627 +EQUIV 8828 628 +EQUIV 8829 629 +EQUIV 8830 630 +EQUIV 8831 631 +EQUIV 8832 632 +EQUIV 8833 633 +EQUIV 8834 634 +EQUIV 8835 635 +EQUIV 8836 636 +EQUIV 8837 637 +EQUIV 8838 638 +EQUIV 8839 639 +EQUIV 8840 640 +EQUIV 8841 641 +EQUIV 8842 642 +EQUIV 8843 643 +EQUIV 8844 644 +EQUIV 8845 645 +EQUIV 8846 5926 +EQUIV 8847 5927 +EQUIV 8848 5928 +EQUIV 8849 5929 +EQUIV 8850 5930 +EQUIV 8851 5911 +EQUIV 8852 5912 +EQUIV 8853 5913 +EQUIV 8854 5914 +EQUIV 8855 5915 +EQUIV 8856 5916 +EQUIV 8857 5917 +EQUIV 8858 5918 +EQUIV 8859 5919 +EQUIV 8860 5920 +EQUIV 8861 6021 +EQUIV 8862 6022 +EQUIV 8863 6023 +EQUIV 8864 6024 +EQUIV 8865 6025 +EQUIV 8866 6026 +EQUIV 8867 6027 +EQUIV 8868 6028 +EQUIV 8869 6029 +EQUIV 8870 6030 +EQUIV 8871 611 +EQUIV 8872 612 +EQUIV 8873 613 +EQUIV 8874 614 +EQUIV 8875 615 +EQUIV 8906 8886 +EQUIV 8907 8887 +EQUIV 8908 8888 +EQUIV 8909 8889 +EQUIV 8910 8890 +EQUIV 8911 8891 +EQUIV 8912 8892 +EQUIV 8913 8893 +EQUIV 8914 8894 +EQUIV 8915 8895 +EQUIV 8916 8896 +EQUIV 8917 8897 +EQUIV 8918 8898 +EQUIV 8919 8899 +EQUIV 8920 8900 +EQUIV 8921 8901 +EQUIV 8922 8902 +EQUIV 8923 8903 +EQUIV 8924 8904 +EQUIV 8925 8905 +EQUIV 8936 8876 +EQUIV 8937 8877 +EQUIV 8938 8878 +EQUIV 8939 8879 +EQUIV 8940 8880 +EQUIV 8941 601 +EQUIV 8942 602 +EQUIV 8943 603 +EQUIV 8944 604 +EQUIV 8945 605 +EQUIV 8946 606 +EQUIV 8947 607 +EQUIV 8948 608 +EQUIV 8949 609 +EQUIV 8950 610 +EQUIV 8951 6031 +EQUIV 8952 6032 +EQUIV 8953 6033 +EQUIV 8954 6034 +EQUIV 8955 6035 +EQUIV 8956 6036 +EQUIV 8957 6037 +EQUIV 8958 6038 +EQUIV 8959 6039 +EQUIV 8960 6040 +EQUIV 8961 6041 +EQUIV 8962 6042 +EQUIV 8963 6043 +EQUIV 8964 6044 +EQUIV 8965 6045 +EQUIV 8966 6226 +EQUIV 8967 6227 +EQUIV 8968 6228 +EQUIV 8969 6229 +EQUIV 8970 6230 +EQUIV 8971 591 +EQUIV 8972 592 +EQUIV 8973 593 +EQUIV 8974 594 +EQUIV 8975 595 +EQUIV 8976 6276 +EQUIV 8977 6277 +EQUIV 8978 6278 +EQUIV 8979 6279 +EQUIV 8980 6280 +EQUIV 8981 6301 +EQUIV 8982 6302 +EQUIV 8983 6303 +EQUIV 8984 6304 +EQUIV 8985 6305 +EQUIV 8986 6306 +EQUIV 8987 6307 +EQUIV 8988 6308 +EQUIV 8989 6309 +EQUIV 8990 6310 +EQUIV 8991 8891 +EQUIV 8992 8892 +EQUIV 8993 8893 +EQUIV 8994 8894 +EQUIV 8995 8895 +EQUIV 8996 8136 +EQUIV 8997 8137 +EQUIV 8998 8138 +EQUIV 8999 8139 +EQUIV 9000 8140 +EQUIV 9001 8101 +EQUIV 9002 8102 +EQUIV 9003 8103 +EQUIV 9004 8104 +EQUIV 9005 8105 +EQUIV 9006 8126 +EQUIV 9007 8127 +EQUIV 9008 8128 +EQUIV 9009 8129 +EQUIV 9010 8130 +EQUIV 9011 8131 +EQUIV 9012 8132 +EQUIV 9013 8133 +EQUIV 9014 8134 +EQUIV 9015 8135 +EQUIV 9016 8896 +EQUIV 9017 8897 +EQUIV 9018 8898 +EQUIV 9019 8899 +EQUIV 9020 8900 +EQUIV 9021 8901 +EQUIV 9022 8902 +EQUIV 9023 8903 +EQUIV 9024 8904 +EQUIV 9025 8905 +EQUIV 9026 8886 +EQUIV 9027 8887 +EQUIV 9028 8888 +EQUIV 9029 8889 +EQUIV 9030 8890 +EQUIV 9031 8891 +EQUIV 9032 8892 +EQUIV 9033 8893 +EQUIV 9034 8894 +EQUIV 9035 8895 +EQUIV 9036 8896 +EQUIV 9037 8897 +EQUIV 9038 8898 +EQUIV 9039 8899 +EQUIV 9040 8900 +EQUIV 9041 8901 +EQUIV 9042 8902 +EQUIV 9043 8903 +EQUIV 9044 8904 +EQUIV 9045 8905 +EQUIV 9046 8886 +EQUIV 9047 8887 +EQUIV 9048 8888 +EQUIV 9049 8889 +EQUIV 9050 8890 +EQUIV 9051 8891 +EQUIV 9052 8892 +EQUIV 9053 8893 +EQUIV 9054 8894 +EQUIV 9055 8895 +EQUIV 9056 8896 +EQUIV 9057 8897 +EQUIV 9058 8898 +EQUIV 9059 8899 +EQUIV 9060 8900 +EQUIV 9071 8171 +EQUIV 9072 8172 +EQUIV 9073 8173 +EQUIV 9074 8174 +EQUIV 9075 8175 +EQUIV 9096 9076 +EQUIV 9097 9077 +EQUIV 9098 9078 +EQUIV 9099 9079 +EQUIV 9100 9080 +EQUIV 9101 9081 +EQUIV 9102 9082 +EQUIV 9103 9083 +EQUIV 9104 9084 +EQUIV 9105 9085 +EQUIV 9191 9171 +EQUIV 9192 9172 +EQUIV 9193 9173 +EQUIV 9194 9174 +EQUIV 9195 9175 +EQUIV 9206 8186 +EQUIV 9207 8187 +EQUIV 9208 8188 +EQUIV 9209 8189 +EQUIV 9210 8190 +EQUIV 9221 8181 +EQUIV 9222 8182 +EQUIV 9223 8183 +EQUIV 9224 8184 +EQUIV 9225 8185 +EQUIV 9236 9176 +EQUIV 9237 9177 +EQUIV 9238 9178 +EQUIV 9239 9179 +EQUIV 9240 9180 +EQUIV 9241 9181 +EQUIV 9242 9182 +EQUIV 9243 9183 +EQUIV 9244 9184 +EQUIV 9245 9185 +EQUIV 9246 9186 +EQUIV 9247 9187 +EQUIV 9248 9188 +EQUIV 9249 9189 +EQUIV 9250 9190 +EQUIV 9251 9171 +EQUIV 9252 9172 +EQUIV 9253 9173 +EQUIV 9254 9174 +EQUIV 9255 9175 +EQUIV 9256 9176 +EQUIV 9257 9177 +EQUIV 9258 9178 +EQUIV 9259 9179 +EQUIV 9260 9180 +EQUIV 9266 9086 +EQUIV 9267 9087 +EQUIV 9268 9088 +EQUIV 9269 9089 +EQUIV 9270 9090 +EQUIV 9271 9091 +EQUIV 9272 9092 +EQUIV 9273 9093 +EQUIV 9274 9094 +EQUIV 9275 9095 +EQUIV 9276 9076 +EQUIV 9277 9077 +EQUIV 9278 9078 +EQUIV 9279 9079 +EQUIV 9280 9080 +EQUIV 9281 9081 +EQUIV 9282 9082 +EQUIV 9283 9083 +EQUIV 9284 9084 +EQUIV 9285 9085 +EQUIV 9286 9086 +EQUIV 9287 9087 +EQUIV 9288 9088 +EQUIV 9289 9089 +EQUIV 9290 9090 +EQUIV 9291 9091 +EQUIV 9292 9092 +EQUIV 9293 9093 +EQUIV 9294 9094 +EQUIV 9295 9095 +EQUIV 9296 9076 +EQUIV 9297 9077 +EQUIV 9298 9078 +EQUIV 9299 9079 +EQUIV 9300 9080 +EQUIV 9301 9081 +EQUIV 9302 9082 +EQUIV 9303 9083 +EQUIV 9304 9084 +EQUIV 9305 9085 +EQUIV 9306 9086 +EQUIV 9307 9087 +EQUIV 9308 9088 +EQUIV 9309 9089 +EQUIV 9310 9090 +EQUIV 9311 9091 +EQUIV 9312 9092 +EQUIV 9313 9093 +EQUIV 9314 9094 +EQUIV 9315 9095 +EQUIV 9316 9076 +EQUIV 9317 9077 +EQUIV 9318 9078 +EQUIV 9319 9079 +EQUIV 9320 9080 +EQUIV 9321 9081 +EQUIV 9322 9082 +EQUIV 9323 9083 +EQUIV 9324 9084 +EQUIV 9325 9085 +EQUIV 9326 9106 +EQUIV 9327 9107 +EQUIV 9328 9108 +EQUIV 9329 9109 +EQUIV 9330 9110 +EQUIV 9341 6661 +EQUIV 9342 6662 +EQUIV 9343 6663 +EQUIV 9344 6664 +EQUIV 9345 6665 +EQUIV 9346 6526 +EQUIV 9347 6527 +EQUIV 9348 6528 +EQUIV 9349 6529 +EQUIV 9350 6530 +EQUIV 9351 6531 +EQUIV 9352 6532 +EQUIV 9353 6533 +EQUIV 9354 6534 +EQUIV 9355 6535 +EQUIV 9356 6596 +EQUIV 9357 6597 +EQUIV 9358 6598 +EQUIV 9359 6599 +EQUIV 9360 6600 +EQUIV 9361 6621 +EQUIV 9362 6622 +EQUIV 9363 6623 +EQUIV 9364 6624 +EQUIV 9365 6625 +EQUIV 9376 6756 +EQUIV 9377 6757 +EQUIV 9378 6758 +EQUIV 9379 6759 +EQUIV 9380 6760 +EQUIV 9396 6616 +EQUIV 9397 6617 +EQUIV 9398 6618 +EQUIV 9399 6619 +EQUIV 9400 6620 +EQUIV 9401 6601 +EQUIV 9402 6602 +EQUIV 9403 6603 +EQUIV 9404 6604 +EQUIV 9405 6605 +EQUIV 9406 6606 +EQUIV 9407 6607 +EQUIV 9408 6608 +EQUIV 9409 6609 +EQUIV 9410 6610 +EQUIV 9411 7211 +EQUIV 9412 7212 +EQUIV 9413 7213 +EQUIV 9414 7214 +EQUIV 9415 7215 +EQUIV 9416 7216 +EQUIV 9417 7217 +EQUIV 9418 7218 +EQUIV 9419 7219 +EQUIV 9420 7220 +EQUIV 9426 7626 +EQUIV 9427 7627 +EQUIV 9428 7628 +EQUIV 9429 7629 +EQUIV 9430 7630 +EQUIV 9431 7371 +EQUIV 9432 7372 +EQUIV 9433 7373 +EQUIV 9434 7374 +EQUIV 9435 7375 +EQUIV 9436 7376 +EQUIV 9437 7377 +EQUIV 9438 7378 +EQUIV 9439 7379 +EQUIV 9440 7380 +EQUIV 9441 7521 +EQUIV 9442 7522 +EQUIV 9443 7523 +EQUIV 9444 7524 +EQUIV 9445 7525 +EQUIV 9446 7186 +EQUIV 9447 7187 +EQUIV 9448 7188 +EQUIV 9449 7189 +EQUIV 9450 7190 +EQUIV 9451 7371 +EQUIV 9452 7372 +EQUIV 9453 7373 +EQUIV 9454 7374 +EQUIV 9455 7375 +EQUIV 9456 7376 +EQUIV 9457 7377 +EQUIV 9458 7378 +EQUIV 9459 7379 +EQUIV 9460 7380 +EQUIV 9461 7521 +EQUIV 9462 7522 +EQUIV 9463 7523 +EQUIV 9464 7524 +EQUIV 9465 7525 +EQUIV 9466 7286 +EQUIV 9467 7287 +EQUIV 9468 7288 +EQUIV 9469 7289 +EQUIV 9470 7290 +EQUIV 9471 7171 +EQUIV 9472 7172 +EQUIV 9473 7173 +EQUIV 9474 7174 +EQUIV 9475 7175 +EQUIV 9476 7176 +EQUIV 9477 7177 +EQUIV 9478 7178 +EQUIV 9479 7179 +EQUIV 9480 7180 +EQUIV 9481 7901 +EQUIV 9482 7902 +EQUIV 9483 7903 +EQUIV 9484 7904 +EQUIV 9485 7905 +EQUIV 9486 7246 +EQUIV 9487 7247 +EQUIV 9488 7248 +EQUIV 9489 7249 +EQUIV 9490 7250 +EQUIV 9491 7871 +EQUIV 9492 7872 +EQUIV 9493 7873 +EQUIV 9494 7874 +EQUIV 9495 7875 +EQUIV 9496 7056 +EQUIV 9497 7057 +EQUIV 9498 7058 +EQUIV 9499 7059 +EQUIV 9500 7060 +EQUIV 9501 7821 +EQUIV 9502 7822 +EQUIV 9503 7823 +EQUIV 9504 7824 +EQUIV 9505 7825 +EQUIV 9521 7801 +EQUIV 9522 7802 +EQUIV 9523 7803 +EQUIV 9524 7804 +EQUIV 9525 7805 +EQUIV 9526 7806 +EQUIV 9527 7807 +EQUIV 9528 7808 +EQUIV 9529 7809 +EQUIV 9530 7810 +EQUIV 9531 7011 +EQUIV 9532 7012 +EQUIV 9533 7013 +EQUIV 9534 7014 +EQUIV 9535 7015 +EQUIV 9536 7796 +EQUIV 9537 7797 +EQUIV 9538 7798 +EQUIV 9539 7799 +EQUIV 9540 7800 +EQUIV 9586 9566 +EQUIV 9587 9567 +EQUIV 9588 9568 +EQUIV 9589 9569 +EQUIV 9590 9570 +EQUIV 9591 9571 +EQUIV 9592 9572 +EQUIV 9593 9573 +EQUIV 9594 9574 +EQUIV 9595 9575 +EQUIV 9596 9576 +EQUIV 9597 9577 +EQUIV 9598 9578 +EQUIV 9599 9579 +EQUIV 9600 9580 +EQUIV 9601 9581 +EQUIV 9602 9582 +EQUIV 9603 9583 +EQUIV 9604 9584 +EQUIV 9605 9585 +EQUIV 9641 9621 +EQUIV 9642 9622 +EQUIV 9643 9623 +EQUIV 9644 9624 +EQUIV 9645 9625 +EQUIV 9646 9626 +EQUIV 9647 9627 +EQUIV 9648 9628 +EQUIV 9649 9629 +EQUIV 9650 9630 +EQUIV 9651 9631 +EQUIV 9652 9632 +EQUIV 9653 9633 +EQUIV 9654 9634 +EQUIV 9655 9635 +EQUIV 9661 6961 +EQUIV 9662 6962 +EQUIV 9663 6963 +EQUIV 9664 6964 +EQUIV 9665 6965 +EQUIV 9666 6886 +EQUIV 9667 6887 +EQUIV 9668 6888 +EQUIV 9669 6889 +EQUIV 9670 6890 +EQUIV 9671 6891 +EQUIV 9672 6892 +EQUIV 9673 6893 +EQUIV 9674 6894 +EQUIV 9675 6895 +EQUIV 9676 6896 +EQUIV 9677 6897 +EQUIV 9678 6898 +EQUIV 9679 6899 +EQUIV 9680 6900 +EQUIV 9701 9681 +EQUIV 9702 9682 +EQUIV 9703 9683 +EQUIV 9704 9684 +EQUIV 9705 9685 +EQUIV 9706 9686 +EQUIV 9707 9687 +EQUIV 9708 9688 +EQUIV 9709 9689 +EQUIV 9710 9690 +EQUIV 9711 9691 +EQUIV 9712 9692 +EQUIV 9713 9693 +EQUIV 9714 9694 +EQUIV 9715 9695 +EQUIV 9781 9761 +EQUIV 9782 9762 +EQUIV 9783 9763 +EQUIV 9784 9764 +EQUIV 9785 9765 +EQUIV 9786 9766 +EQUIV 9787 9767 +EQUIV 9788 9768 +EQUIV 9789 9769 +EQUIV 9790 9770 +EQUIV 9791 9771 +EQUIV 9792 9772 +EQUIV 9793 9773 +EQUIV 9794 9774 +EQUIV 9795 9775 +EQUIV 9796 9776 +EQUIV 9797 9777 +EQUIV 9798 9778 +EQUIV 9799 9779 +EQUIV 9800 9780 +EQUIV 9801 9761 +EQUIV 9802 9762 +EQUIV 9803 9763 +EQUIV 9804 9764 +EQUIV 9805 9765 +EQUIV 9806 9766 +EQUIV 9807 9767 +EQUIV 9808 9768 +EQUIV 9809 9769 +EQUIV 9810 9770 +EQUIV 9851 9771 +EQUIV 9852 9772 +EQUIV 9853 9773 +EQUIV 9854 9774 +EQUIV 9855 9775 +EQUIV 9856 9776 +EQUIV 9857 9777 +EQUIV 9858 9778 +EQUIV 9859 9779 +EQUIV 9860 9780 +EQUIV 9861 9761 +EQUIV 9862 9762 +EQUIV 9863 9763 +EQUIV 9864 9764 +EQUIV 9865 9765 +EQUIV 9911 9891 +EQUIV 9912 9892 +EQUIV 9913 9893 +EQUIV 9914 9894 +EQUIV 9915 9895 +EQUIV 9951 9931 +EQUIV 9952 9932 +EQUIV 9953 9933 +EQUIV 9954 9934 +EQUIV 9955 9935 +EQUIV 9956 9936 +EQUIV 9957 9937 +EQUIV 9958 9938 +EQUIV 9959 9939 +EQUIV 9960 9940 +EQUIV 9961 9941 +EQUIV 9962 9942 +EQUIV 9963 9943 +EQUIV 9964 9944 +EQUIV 9965 9945 +EQUIV 9966 9946 +EQUIV 9967 9947 +EQUIV 9968 9948 +EQUIV 9969 9949 +EQUIV 9970 9950 +EQUIV 9971 9931 +EQUIV 9972 9932 +EQUIV 9973 9933 +EQUIV 9974 9934 +EQUIV 9975 9935 +EQUIV 9976 9936 +EQUIV 9977 9937 +EQUIV 9978 9938 +EQUIV 9979 9939 +EQUIV 9980 9940 +EQUIV 9981 9941 +EQUIV 9982 9942 +EQUIV 9983 9943 +EQUIV 9984 9944 +EQUIV 9985 9945 +EQUIV 9986 9946 +EQUIV 9987 9947 +EQUIV 9988 9948 +EQUIV 9989 9949 +EQUIV 9990 9950 +EQUIV 9991 9931 +EQUIV 9992 9932 +EQUIV 9993 9933 +EQUIV 9994 9934 +EQUIV 9995 9935 diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/examples/Pose2SLAMExample_graph.m index e3dea348c..0481f021e 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/examples/Pose2SLAMExample_graph.m @@ -12,12 +12,14 @@ %% Initialize graph, initial estimate, and odometry noise import gtsam.* -model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -[graph,initial]=load2D('Data/w100-odom.graph',model); +model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 1*pi/180]); +maxID=0; +addNoise=false; +smart=true; +[graph,initial]=load2D('Data/w10000-odom.graph',model,maxID,addNoise,smart); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 -import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph @@ -28,7 +30,9 @@ P=initial.poses; plot(P(:,1),P(:,2),'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +tic result = graph.optimize(initial,1); +toc P=result.poses; hold on; plot(P(:,1),P(:,2),'b-*') result.print(sprintf('\nFinal result:\n')); diff --git a/matlab/examples/Pose2SLAMExample_graph1.m b/matlab/examples/Pose2SLAMExample_graph1.m new file mode 100644 index 000000000..ef8002209 --- /dev/null +++ b/matlab/examples/Pose2SLAMExample_graph1.m @@ -0,0 +1,36 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Initialize graph, initial estimate, and odometry noise +import gtsam.* +model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 1*pi/180]); +maxID=0; +addNoise=false; +smart=true; +[graph,initial]=load2D('Data/w10000-odom.graph',model,maxID,addNoise,smart); + +%% Add a Gaussian prior on pose x_1 +priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); +graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph + +%% Plot Initial Estimate +figure(1);clf +P=initial.poses; +plot(P(:,1),P(:,2),'r-'); axis equal + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +tic +result = graph.optimize(initial,1); +toc +P=result.poses; +hold on; plot(P(:,1),P(:,2),'b-') diff --git a/matlab/examples/Pose2SLAMExample_graph2.m b/matlab/examples/Pose2SLAMExample_graph2.m new file mode 100644 index 000000000..0eb0dc31d --- /dev/null +++ b/matlab/examples/Pose2SLAMExample_graph2.m @@ -0,0 +1,52 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +import gtsam.* +maxID=0; +addNoise=false; +smart=true; +priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin +priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); + +%% Create graph, disregarding translation measurements by setting sigma high +model = noiseModel.Diagonal.Sigmas([100000; 100000; 1*pi/180]); +[graph,initial]=load2D('Data/w10000-odom.graph',model,maxID,addNoise,smart); + +%% Add a Gaussian prior on pose x_1 +graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph + +%% Plot Initial Estimate +figure(1);clf +P=initial.poses; +plot(P(:,1),P(:,2),'r-'); axis equal + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +tic +result1 = graph.optimize(initial,1); +toc +P=result1.poses; +hold on; plot(P(:,1),P(:,2),'g-') + +%% Read again, with correct noise now... +model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 1*pi/180]); +graph=load2D('Data/w10000-odom.graph',model,maxID,addNoise,smart); + +%% Add a Gaussian prior on pose x_1 +graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +tic +result2 = graph.optimize(result1,1); +toc +P=result2.poses; +hold on; plot(P(:,1),P(:,2),'b-') + From a3ee762dac5f25f0db98080f0f7a79be44ac4740 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 27 Jul 2012 19:01:51 +0000 Subject: [PATCH 721/914] Fixed svn merging problem in SuccessiveLinearizationOptimizer --- .../SuccessiveLinearizationOptimizer.cpp | 62 +++++++++---------- .../SuccessiveLinearizationOptimizer.h | 34 ---------- 2 files changed, 31 insertions(+), 65 deletions(-) diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp index 0fe0440ae..af3f70ddc 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp @@ -17,37 +17,37 @@ namespace gtsam { void SuccessiveLinearizationParams::print(const std::string& str) const { - NonlinearOptimizerParams::print(str); - switch ( linearSolverType ) { - case MULTIFRONTAL_CHOLESKY: - std::cout << " linear solver type: MULTIFRONTAL CHOLESKY\n"; - break; - case MULTIFRONTAL_QR: - std::cout << " linear solver type: MULTIFRONTAL QR\n"; - break; - case SEQUENTIAL_CHOLESKY: - std::cout << " linear solver type: SEQUENTIAL CHOLESKY\n"; - break; - case SEQUENTIAL_QR: - std::cout << " linear solver type: SEQUENTIAL QR\n"; - break; - case CHOLMOD: - std::cout << " linear solver type: CHOLMOD\n"; - break; - case CG: - std::cout << " linear solver type: CG\n"; - break; - default: - std::cout << " linear solver type: (invalid)\n"; - break; - } - - if(ordering) - std::cout << " ordering: custom\n"; - else - std::cout << " ordering: COLAMD\n"; - - std::cout.flush(); + NonlinearOptimizerParams::print(str); + switch ( linearSolverType ) { + case MULTIFRONTAL_CHOLESKY: + std::cout << " linear solver type: MULTIFRONTAL CHOLESKY\n"; + break; + case MULTIFRONTAL_QR: + std::cout << " linear solver type: MULTIFRONTAL QR\n"; + break; + case SEQUENTIAL_CHOLESKY: + std::cout << " linear solver type: SEQUENTIAL CHOLESKY\n"; + break; + case SEQUENTIAL_QR: + std::cout << " linear solver type: SEQUENTIAL QR\n"; + break; + case CHOLMOD: + std::cout << " linear solver type: CHOLMOD\n"; + break; + case CONJUGATE_GRADIENT: + std::cout << " linear solver type: CONJUGATE GRADIENT\n"; + break; + default: + std::cout << " linear solver type: (invalid)\n"; + break; + } + + if(ordering) + std::cout << " ordering: custom\n"; + else + std::cout << " ordering: COLAMD\n"; + + std::cout.flush(); } VectorValues solveGaussianFactorGraph(const GaussianFactorGraph &gfg, const SuccessiveLinearizationParams ¶ms) { diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index fc44621f6..e79a364c5 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -42,40 +42,6 @@ public: SuccessiveLinearizationParams() : linearSolverType(MULTIFRONTAL_CHOLESKY) {} virtual ~SuccessiveLinearizationParams() {} - virtual void print(const std::string& str = "") const { - NonlinearOptimizerParams::print(str); - switch ( linearSolverType ) { - case MULTIFRONTAL_CHOLESKY: - std::cout << " linear solver type: MULTIFRONTAL CHOLESKY\n"; - break; - case MULTIFRONTAL_QR: - std::cout << " linear solver type: MULTIFRONTAL QR\n"; - break; - case SEQUENTIAL_CHOLESKY: - std::cout << " linear solver type: SEQUENTIAL CHOLESKY\n"; - break; - case SEQUENTIAL_QR: - std::cout << " linear solver type: SEQUENTIAL QR\n"; - break; - case CHOLMOD: - std::cout << " linear solver type: CHOLMOD\n"; - break; - case CONJUGATE_GRADIENT: - std::cout << " linear solver type: CONJUGATE GRADIENT\n"; - break; - default: - std::cout << " linear solver type: (invalid)\n"; - break; - } - - if(ordering) - std::cout << " ordering: custom\n"; - else - std::cout << " ordering: COLAMD\n"; - - std::cout.flush(); - } - inline bool isMultifrontal() const { return (linearSolverType == MULTIFRONTAL_CHOLESKY) || (linearSolverType == MULTIFRONTAL_QR); } From aef5ae269fd2b75b2d8f24120551e98ba45bbe82 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 27 Jul 2012 19:01:53 +0000 Subject: [PATCH 722/914] Added argument and return type checking for global wrapped functions --- wrap/Module.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 229a9810f..b2f061838 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -416,6 +416,9 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co vector validTypes = GenerateValidTypes(expandedClasses, forward_declarations); // Check that all classes have been defined somewhere + verifyArguments(validTypes, global_functions); + verifyReturnTypes(validTypes, global_functions); + BOOST_FOREACH(const Class& cls, expandedClasses) { // verify all of the function arguments //TODO:verifyArguments(validTypes, cls.constructor.args_list); From 9d2a3bf14edb2e07d91559758692b4aa42ee315c Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 27 Jul 2012 19:02:11 +0000 Subject: [PATCH 723/914] Finished denamespacing and reorganizing matlab code --- gtsam.h | 423 +----------------- gtsam/nonlinear/Symbol.h | 9 + gtsam/slam/dataset.cpp | 20 +- gtsam/slam/dataset.h | 16 +- matlab/{ => +gtsam_utils}/CHECK.m | 0 matlab/{ => +gtsam_utils}/EQUALITY.m | 0 .../VisualISAMGenerateData.m | 0 .../VisualISAMInitialize.m | 43 +- .../VisualISAMPlot.m | 34 +- matlab/+gtsam_utils/VisualISAMStep.m | 44 ++ matlab/{ => +gtsam_utils}/circlePose2.m | 2 +- matlab/{ => +gtsam_utils}/circlePose3.m | 2 +- matlab/{ => +gtsam_utils}/covarianceEllipse.m | 66 +-- .../{ => +gtsam_utils}/covarianceEllipse3D.m | 0 .../findExampleDataFile.m | 4 +- matlab/{ => +gtsam_utils}/load2D.m | 0 matlab/{ => +gtsam_utils}/load3D.m | 0 matlab/{ => +gtsam_utils}/plot2DPoints.m | 4 +- matlab/{ => +gtsam_utils}/plot2DTrajectory.m | 4 +- matlab/{ => +gtsam_utils}/plot3DPoints.m | 4 +- matlab/{ => +gtsam_utils}/plot3DTrajectory.m | 4 +- matlab/{ => +gtsam_utils}/plotCamera.m | 0 matlab/{ => +gtsam_utils}/plotPoint2.m | 2 +- matlab/{ => +gtsam_utils}/plotPoint3.m | 2 +- matlab/{ => +gtsam_utils}/plotPose2.m | 2 +- matlab/{ => +gtsam_utils}/plotPose3.m | 2 +- matlab/CMakeLists.txt | 11 +- matlab/examples/+support/VisualISAMStep.m | 44 -- .../LocalizationExample.m | 2 +- .../OdometryExample.m | 2 +- .../PlanarSLAMExample.m | 4 +- .../PlanarSLAMExample_sampling.m | 9 +- .../Pose2SLAMExample.m | 4 +- .../Pose2SLAMExample_advanced.m | 1 + .../Pose2SLAMExample_circle.m | 14 +- .../Pose2SLAMExample_graph.m | 13 +- .../Pose2SLAMwSPCG.m | 0 .../Pose3SLAMExample.m | 14 +- .../Pose3SLAMExample_graph.m | 11 +- .../{examples => gtsam_examples}/SBAExample.m | 2 +- .../{examples => gtsam_examples}/SFMExample.m | 6 +- .../StereoVOExample.m | 7 +- .../StereoVOExample_large.m | 14 +- .../VisualISAMDemo.m | 0 .../VisualISAMExample.m | 10 +- .../VisualISAM_gui.fig | Bin .../VisualISAM_gui.m | 20 +- .../gtsamExamples.fig | Bin .../gtsamExamples.m | 0 .../testJacobianFactor.m | 1 + .../{tests => gtsam_tests}/testKalmanFilter.m | 4 + .../testLocalizationExample.m | 1 + .../testOdometryExample.m | 2 + .../testPlanarSLAMExample.m | 2 + .../testPose2SLAMExample.m | 1 + .../testPose3SLAMExample.m | 7 +- .../{tests => gtsam_tests}/testSFMExample.m | 22 +- .../testStereoVOExample.m | 40 +- .../testVisualISAMExample.m | 11 +- matlab/{tests => gtsam_tests}/test_gtsam.m | 18 +- matlab/symbol.m | 4 - matlab/symbolChr.m | 4 - matlab/symbolIndex.m | 4 - 63 files changed, 324 insertions(+), 672 deletions(-) rename matlab/{ => +gtsam_utils}/CHECK.m (100%) rename matlab/{ => +gtsam_utils}/EQUALITY.m (100%) rename matlab/{examples/+support => +gtsam_utils}/VisualISAMGenerateData.m (100%) rename matlab/{examples/+support => +gtsam_utils}/VisualISAMInitialize.m (54%) rename matlab/{examples/+support => +gtsam_utils}/VisualISAMPlot.m (55%) create mode 100644 matlab/+gtsam_utils/VisualISAMStep.m rename matlab/{ => +gtsam_utils}/circlePose2.m (95%) rename matlab/{ => +gtsam_utils}/circlePose3.m (96%) rename matlab/{ => +gtsam_utils}/covarianceEllipse.m (96%) rename matlab/{ => +gtsam_utils}/covarianceEllipse3D.m (100%) rename matlab/{examples/+support => +gtsam_utils}/findExampleDataFile.m (74%) rename matlab/{ => +gtsam_utils}/load2D.m (100%) rename matlab/{ => +gtsam_utils}/load3D.m (100%) rename matlab/{ => +gtsam_utils}/plot2DPoints.m (88%) rename matlab/{ => +gtsam_utils}/plot2DTrajectory.m (93%) rename matlab/{ => +gtsam_utils}/plot3DPoints.m (88%) rename matlab/{ => +gtsam_utils}/plot3DTrajectory.m (91%) rename matlab/{ => +gtsam_utils}/plotCamera.m (100%) rename matlab/{ => +gtsam_utils}/plotPoint2.m (76%) rename matlab/{ => +gtsam_utils}/plotPoint3.m (80%) rename matlab/{ => +gtsam_utils}/plotPose2.m (84%) rename matlab/{ => +gtsam_utils}/plotPose3.m (94%) delete mode 100644 matlab/examples/+support/VisualISAMStep.m rename matlab/{examples => gtsam_examples}/LocalizationExample.m (96%) rename matlab/{examples => gtsam_examples}/OdometryExample.m (96%) rename matlab/{examples => gtsam_examples}/PlanarSLAMExample.m (96%) rename matlab/{examples => gtsam_examples}/PlanarSLAMExample_sampling.m (92%) rename matlab/{examples => gtsam_examples}/Pose2SLAMExample.m (96%) rename matlab/{examples => gtsam_examples}/Pose2SLAMExample_advanced.m (99%) rename matlab/{examples => gtsam_examples}/Pose2SLAMExample_circle.m (87%) rename matlab/{examples => gtsam_examples}/Pose2SLAMExample_graph.m (79%) rename matlab/{examples => gtsam_examples}/Pose2SLAMwSPCG.m (100%) rename matlab/{examples => gtsam_examples}/Pose3SLAMExample.m (88%) rename matlab/{examples => gtsam_examples}/Pose3SLAMExample_graph.m (77%) rename matlab/{examples => gtsam_examples}/SBAExample.m (97%) rename matlab/{examples => gtsam_examples}/SFMExample.m (94%) rename matlab/{examples => gtsam_examples}/StereoVOExample.m (94%) rename matlab/{examples => gtsam_examples}/StereoVOExample_large.m (84%) rename matlab/{examples => gtsam_examples}/VisualISAMDemo.m (100%) rename matlab/{examples => gtsam_examples}/VisualISAMExample.m (75%) rename matlab/{examples => gtsam_examples}/VisualISAM_gui.fig (100%) rename matlab/{examples => gtsam_examples}/VisualISAM_gui.m (92%) rename matlab/{examples => gtsam_examples}/gtsamExamples.fig (100%) rename matlab/{examples => gtsam_examples}/gtsamExamples.m (100%) rename matlab/{tests => gtsam_tests}/testJacobianFactor.m (98%) rename matlab/{tests => gtsam_tests}/testKalmanFilter.m (96%) rename matlab/{tests => gtsam_tests}/testLocalizationExample.m (98%) rename matlab/{tests => gtsam_tests}/testOdometryExample.m (98%) rename matlab/{tests => gtsam_tests}/testPlanarSLAMExample.m (98%) rename matlab/{tests => gtsam_tests}/testPose2SLAMExample.m (99%) rename matlab/{tests => gtsam_tests}/testPose3SLAMExample.m (96%) rename matlab/{tests => gtsam_tests}/testSFMExample.m (77%) rename matlab/{tests => gtsam_tests}/testStereoVOExample.m (59%) rename matlab/{tests => gtsam_tests}/testVisualISAMExample.m (82%) rename matlab/{tests => gtsam_tests}/test_gtsam.m (100%) delete mode 100644 matlab/symbol.m delete mode 100644 matlab/symbolChr.m delete mode 100644 matlab/symbolIndex.m diff --git a/gtsam.h b/gtsam.h index 646e44141..6f87670ca 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1023,14 +1023,9 @@ class KalmanFilter { //************************************************************************* #include -class Symbol { - Symbol(char c, size_t j); - Symbol(size_t k); - void print(string s) const; - size_t key() const; - size_t index() const; - char chr() const; -}; +size_t symbol(char chr, size_t index); +char symbolChr(size_t key); +size_t symbolIndex(size_t key); #include class Ordering { @@ -1415,6 +1410,8 @@ typedef gtsam::RangeFactor RangeFactorSimple typedef gtsam::RangeFactor RangeFactorCalibratedCamera; typedef gtsam::RangeFactor RangeFactorSimpleCamera; + +#include template virtual class BearingFactor : gtsam::NonlinearFactor { BearingFactor(size_t key1, size_t key2, const ROTATION& measured, const gtsam::noiseModel::Base* noiseModel); @@ -1423,6 +1420,7 @@ virtual class BearingFactor : gtsam::NonlinearFactor { typedef gtsam::BearingFactor BearingFactor2D; +#include template virtual class BearingRangeFactor : gtsam::NonlinearFactor { BearingRangeFactor(size_t poseKey, size_t pointKey, const ROTATION& measuredBearing, double measuredRange, const gtsam::noiseModel::Base* noiseModel); @@ -1473,412 +1471,7 @@ virtual class GenericStereoFactor : gtsam::NonlinearFactor { typedef gtsam::GenericStereoFactor GenericStereoFactor3D; #include -pair load2D(string filename, +pair load2D(string filename, gtsam::noiseModel::Diagonal* model, int maxID, bool addNoise, bool smart); -} //\namespace gtsam - -//************************************************************************* -// Pose2SLAM -//************************************************************************* - -namespace pose2SLAM { - -#include -class Values { - Values(); - Values(const pose2SLAM::Values& values); - size_t size() const; - void print(string s) const; - bool exists(size_t key); - gtsam::KeyVector keys() const; // Note the switch to KeyVector, rather than KeyList - - static pose2SLAM::Values Circle(size_t n, double R); - void insertPose(size_t key, const gtsam::Pose2& pose); - void updatePose(size_t key, const gtsam::Pose2& pose); - gtsam::Pose2 pose(size_t i); - Matrix poses() const; -}; - -#include -class Graph { - Graph(); - Graph(const gtsam::NonlinearFactorGraph& graph); - Graph(const pose2SLAM::Graph& graph); - - // FactorGraph - void print(string s) const; - bool equals(const pose2SLAM::Graph& fg, double tol) const; - size_t size() const; - bool empty() const; - void remove(size_t i); - size_t nrFactors() const; - gtsam::NonlinearFactor* at(size_t i) const; - - // NonlinearFactorGraph - double error(const pose2SLAM::Values& values) const; - double probPrime(const pose2SLAM::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const pose2SLAM::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const pose2SLAM::Values& values, - const gtsam::Ordering& ordering) const; - - // pose2SLAM-specific - void addPoseConstraint(size_t key, const gtsam::Pose2& pose); - void addPosePrior(size_t key, const gtsam::Pose2& pose, const gtsam::noiseModel::Base* noiseModel); - void addRelativePose(size_t key1, size_t key2, const gtsam::Pose2& relativePoseMeasurement, const gtsam::noiseModel::Base* noiseModel); - pose2SLAM::Values optimize(const pose2SLAM::Values& initialEstimate, size_t verbosity) const; - pose2SLAM::Values optimizeSPCG(const pose2SLAM::Values& initialEstimate, size_t verbosity) const; - gtsam::Marginals marginals(const pose2SLAM::Values& solution) const; -}; - -} //\namespace pose2SLAM - -//************************************************************************* -// Pose3SLAM -//************************************************************************* - -namespace pose3SLAM { - -#include -class Values { - Values(); - Values(const pose3SLAM::Values& values); - size_t size() const; - void print(string s) const; - bool exists(size_t key); - gtsam::KeyVector keys() const; // Note the switch to KeyVector, rather than KeyList - - static pose3SLAM::Values Circle(size_t n, double R); - void insertPose(size_t key, const gtsam::Pose3& pose); - void updatePose(size_t key, const gtsam::Pose3& pose); - gtsam::Pose3 pose(size_t i); - Matrix translations() const; -}; - -#include -class Graph { - Graph(); - Graph(const gtsam::NonlinearFactorGraph& graph); - Graph(const pose3SLAM::Graph& graph); - - // FactorGraph - void print(string s) const; - bool equals(const pose3SLAM::Graph& fg, double tol) const; - size_t size() const; - bool empty() const; - void remove(size_t i); - size_t nrFactors() const; - gtsam::NonlinearFactor* at(size_t i) const; - - // NonlinearFactorGraph - double error(const pose3SLAM::Values& values) const; - double probPrime(const pose3SLAM::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const pose3SLAM::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const pose3SLAM::Values& values, - const gtsam::Ordering& ordering) const; - - // pose3SLAM-specific - void addPoseConstraint(size_t i, const gtsam::Pose3& p); - void addPosePrior(size_t key, const gtsam::Pose3& p, const gtsam::noiseModel::Base* model); - void addRelativePose(size_t key1, size_t key2, const gtsam::Pose3& z, const gtsam::noiseModel::Base* model); - pose3SLAM::Values optimize(const pose3SLAM::Values& initialEstimate, size_t verbosity) const; - // FIXME gtsam::LevenbergMarquardtOptimizer optimizer(const pose3SLAM::Values& initialEstimate, const gtsam::LevenbergMarquardtParams& parameters) const; - gtsam::Marginals marginals(const pose3SLAM::Values& solution) const; -}; - -} //\namespace pose3SLAM - -//************************************************************************* -// planarSLAM -//************************************************************************* - -namespace planarSLAM { - -#include -class Values { - Values(); - Values(const planarSLAM::Values& values); - size_t size() const; - void print(string s) const; - bool exists(size_t key); - gtsam::KeyVector keys() const; // Note the switch to KeyVector, rather than KeyList - - // inherited from pose2SLAM - static planarSLAM::Values Circle(size_t n, double R); - void insertPose(size_t key, const gtsam::Pose2& pose); - void updatePose(size_t key, const gtsam::Pose2& pose); - gtsam::Pose2 pose(size_t i); - Matrix poses() const; - - // Access to poses - planarSLAM::Values allPoses() const; - size_t nrPoses() const; - gtsam::KeyVector poseKeys() const; // Note the switch to KeyVector, rather than KeyList - - // Access to points - planarSLAM::Values allPoints() const; - size_t nrPoints() const; - gtsam::KeyVector pointKeys() const; // Note the switch to KeyVector, rather than KeyList - - void insertPoint(size_t key, const gtsam::Point2& point); - void updatePoint(size_t key, const gtsam::Point2& point); - gtsam::Point2 point(size_t key) const; - Matrix points() const; -}; - -#include -class Graph { - Graph(); - Graph(const gtsam::NonlinearFactorGraph& graph); - Graph(const pose2SLAM::Graph& graph); - Graph(const planarSLAM::Graph& graph); - - // FactorGraph - void print(string s) const; - bool equals(const planarSLAM::Graph& fg, double tol) const; - size_t size() const; - bool empty() const; - void remove(size_t i); - size_t nrFactors() const; - gtsam::NonlinearFactor* at(size_t i) const; - - // NonlinearFactorGraph - double error(const planarSLAM::Values& values) const; - double probPrime(const planarSLAM::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const planarSLAM::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const planarSLAM::Values& values, - const gtsam::Ordering& ordering) const; - - // pose2SLAM-inherited - void addPoseConstraint(size_t key, const gtsam::Pose2& pose); - void addPosePrior(size_t key, const gtsam::Pose2& pose, const gtsam::noiseModel::Base* noiseModel); - void addRelativePose(size_t key1, size_t key2, const gtsam::Pose2& relativePoseMeasurement, const gtsam::noiseModel::Base* noiseModel); - planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate, size_t verbosity) const; - planarSLAM::Values optimizeSPCG(const planarSLAM::Values& initialEstimate, size_t verbosity) const; - gtsam::Marginals marginals(const planarSLAM::Values& solution) const; - - // planarSLAM-specific - void addPointConstraint(size_t pointKey, const gtsam::Point2& p); - void addPointPrior(size_t pointKey, const gtsam::Point2& p, const gtsam::noiseModel::Base* model); - void addBearing(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing, const gtsam::noiseModel::Base* noiseModel); - void addRange(size_t poseKey, size_t pointKey, double range, const gtsam::noiseModel::Base* noiseModel); - void addBearingRange(size_t poseKey, size_t pointKey, const gtsam::Rot2& bearing,double range, const gtsam::noiseModel::Base* noiseModel); -}; - -#include -class Odometry { - Odometry(size_t key1, size_t key2, const gtsam::Pose2& measured, - const gtsam::noiseModel::Base* model); - void print(string s) const; - gtsam::GaussianFactor* linearize(const planarSLAM::Values& center, - const gtsam::Ordering& ordering) const; -}; - -} //\namespace planarSLAM - -//************************************************************************* -// VisualSLAM -//************************************************************************* - -namespace visualSLAM { - -#include -class Values { - Values(); - Values(const visualSLAM::Values& values); - size_t size() const; - void print(string s) const; - bool exists(size_t key); - gtsam::KeyVector keys() const; // Note the switch to KeyVector, rather than KeyList - - // pose3SLAM inherited - static visualSLAM::Values Circle(size_t n, double R); - void insertPose(size_t key, const gtsam::Pose3& pose); - void updatePose(size_t key, const gtsam::Pose3& pose); - gtsam::Pose3 pose(size_t i); - Matrix translations() const; - - // Access to poses - visualSLAM::Values allPoses() const; - size_t nrPoses() const; - gtsam::KeyVector poseKeys() const; // Note the switch to KeyVector, rather than KeyList - - // Access to points - visualSLAM::Values allPoints() const; - size_t nrPoints() const; - gtsam::KeyVector pointKeys() const; // Note the switch to KeyVector, rather than KeyList - - void insertPoint(size_t key, const gtsam::Point3& pose); - void updatePoint(size_t key, const gtsam::Point3& pose); - gtsam::Point3 point(size_t j); - void insertBackprojections(const gtsam::SimpleCamera& c, Vector J, Matrix Z, double depth); - void perturbPoints(double sigma, size_t seed); - Matrix points() const; -}; - -#include -class Graph { - Graph(); - Graph(const gtsam::NonlinearFactorGraph& graph); - Graph(const pose3SLAM::Graph& graph); - Graph(const visualSLAM::Graph& graph); - - // FactorGraph - void print(string s) const; - bool equals(const visualSLAM::Graph& fg, double tol) const; - size_t size() const; - bool empty() const; - void remove(size_t i); - size_t nrFactors() const; - gtsam::NonlinearFactor* at(size_t i) const; - - double error(const visualSLAM::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const visualSLAM::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const visualSLAM::Values& values, - const gtsam::Ordering& ordering) const; - - // pose3SLAM-inherited - void addPoseConstraint(size_t i, const gtsam::Pose3& p); - void addPosePrior(size_t key, const gtsam::Pose3& p, const gtsam::noiseModel::Base* model); - void addRelativePose(size_t key1, size_t key2, const gtsam::Pose3& z, const gtsam::noiseModel::Base* model); - visualSLAM::Values optimize(const visualSLAM::Values& initialEstimate, size_t verbosity) const; - visualSLAM::LevenbergMarquardtOptimizer optimizer(const visualSLAM::Values& initialEstimate, const gtsam::LevenbergMarquardtParams& parameters) const; - gtsam::Marginals marginals(const visualSLAM::Values& solution) const; - - // Priors and constraints - void addPointConstraint(size_t pointKey, const gtsam::Point3& p); - void addPointPrior(size_t pointKey, const gtsam::Point3& p, const gtsam::noiseModel::Base* model); - void addRangeFactor(size_t poseKey, size_t pointKey, double range, const gtsam::noiseModel::Base* model); - - // Measurements - void addMeasurement(const gtsam::Point2& measured, - const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, - const gtsam::Cal3_S2* K); - void addMeasurements(size_t i, Vector J, Matrix Z, - const gtsam::noiseModel::Base* model, const gtsam::Cal3_S2* K); - void addStereoMeasurement(const gtsam::StereoPoint2& measured, - const gtsam::noiseModel::Base* model, size_t poseKey, size_t pointKey, - const gtsam::Cal3_S2Stereo* K); - - // Information - Matrix reprojectionErrors(const visualSLAM::Values& values) const; - -}; - -#include -class ISAM { - ISAM(); - ISAM(int reorderInterval); - void print(string s) const; - void printStats() const; - void saveGraph(string s) const; - visualSLAM::Values estimate() const; - Matrix marginalCovariance(size_t key) const; - int reorderInterval() const; - int reorderCounter() const; - void update(const visualSLAM::Graph& newFactors, const visualSLAM::Values& initialValues); - void reorder_relinearize(); - void addKey(size_t key); - void setOrdering(const gtsam::Ordering& new_ordering); - - // These might be expensive as instead of a reference the wrapper will make a copy - gtsam::GaussianISAM bayesTree() const; - visualSLAM::Values getLinearizationPoint() const; - gtsam::Ordering getOrdering() const; - gtsam::NonlinearFactorGraph getFactorsUnsafe() const; -}; - -#include -class LevenbergMarquardtOptimizer { - double lambda() const; - void iterate(); - double error() const; - size_t iterations() const; - visualSLAM::Values optimize(); - visualSLAM::Values optimizeSafely(); - visualSLAM::Values values() const; -}; - -} //\namespace visualSLAM - -//************************************************************************ -// sparse BA -//************************************************************************ - -namespace sparseBA { - -#include -class Values { - Values(); - Values(const sparseBA::Values& values); - size_t size() const; - void print(string s) const; - bool exists(size_t key); - gtsam::KeyVector keys() const; - - // Access to cameras - sparseBA::Values allSimpleCameras() const ; - size_t nrSimpleCameras() const ; - gtsam::KeyVector simpleCameraKeys() const ; - void insertSimpleCamera(size_t j, const gtsam::SimpleCamera& camera); - void updateSimpleCamera(size_t j, const gtsam::SimpleCamera& camera); - gtsam::SimpleCamera simpleCamera(size_t j) const; - - // Access to points, inherited from visualSLAM - sparseBA::Values allPoints() const; - size_t nrPoints() const; - gtsam::KeyVector pointKeys() const; // Note the switch to KeyVector, rather than KeyList - void insertPoint(size_t key, const gtsam::Point3& pose); - void updatePoint(size_t key, const gtsam::Point3& pose); - gtsam::Point3 point(size_t j); - Matrix points() const; -}; - -#include -class Graph { - Graph(); - Graph(const gtsam::NonlinearFactorGraph& graph); - Graph(const sparseBA::Graph& graph); - - // Information - Matrix reprojectionErrors(const sparseBA::Values& values) const; - - // inherited from FactorGraph - void print(string s) const; - bool equals(const sparseBA::Graph& fg, double tol) const; - size_t size() const; - bool empty() const; - void remove(size_t i); - size_t nrFactors() const; - gtsam::NonlinearFactor* at(size_t i) const; - - double error(const sparseBA::Values& values) const; - gtsam::Ordering* orderingCOLAMD(const sparseBA::Values& values) const; - gtsam::GaussianFactorGraph* linearize(const sparseBA::Values& values, const gtsam::Ordering& ordering) const; - - sparseBA::Values optimize(const sparseBA::Values& initialEstimate, size_t verbosity) const; - sparseBA::LevenbergMarquardtOptimizer optimizer(const sparseBA::Values& initialEstimate, const gtsam::LevenbergMarquardtParams& parameters) const; - gtsam::Marginals marginals(const sparseBA::Values& solution) const; - - // inherited from visualSLAM - void addPointConstraint(size_t pointKey, const gtsam::Point3& p); - void addPointPrior(size_t pointKey, const gtsam::Point3& p, const gtsam::noiseModel::Base* model); - - // add factors - void addSimpleCameraPrior(size_t cameraKey, const gtsam::SimpleCamera &camera, gtsam::noiseModel::Base* model); - void addSimpleCameraConstraint(size_t cameraKey, const gtsam::SimpleCamera &camera); - void addSimpleCameraMeasurement(const gtsam::Point2 &z, gtsam::noiseModel::Base* model, size_t cameraKey, size_t pointKey); -}; - -#include -class LevenbergMarquardtOptimizer { - double lambda() const; - void iterate(); - double error() const; - size_t iterations() const; - sparseBA::Values optimize(); - sparseBA::Values optimizeSafely(); - sparseBA::Values values() const; -}; -} //\namespace sparseBA - +} diff --git a/gtsam/nonlinear/Symbol.h b/gtsam/nonlinear/Symbol.h index b4bda4f1a..c128b1105 100644 --- a/gtsam/nonlinear/Symbol.h +++ b/gtsam/nonlinear/Symbol.h @@ -122,6 +122,15 @@ private: } }; +/** Create a symbol key from a character and index, i.e. x5. */ +inline Key symbol(unsigned char c, size_t j) { return (Key)Symbol(c,j); } + +/** Return the character portion of a symbol key. */ +inline unsigned char symbolChr(Key key) { return Symbol(key).chr(); } + +/** Return the index portion of a symbol key. */ +inline size_t symbolIndex(Key key) { return Symbol(key).index(); } + namespace symbol_shorthand { inline Key A(size_t j) { return Symbol('a', j); } inline Key B(size_t j) { return Symbol('b', j); } diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index 0502bb69b..59df1da67 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -20,8 +20,10 @@ #include #include +#include #include #include +#include using namespace std; @@ -78,23 +80,23 @@ pair > dataset(const string& dataset, } /* ************************************************************************* */ -pair load2D( - pair > dataset, +pair load2D( + pair > dataset, int maxID, bool addNoise, bool smart) { return load2D(dataset.first, dataset.second, maxID, addNoise, smart); } /* ************************************************************************* */ -pair load2D( - const string& filename, boost::optional model, int maxID, +pair load2D( + const string& filename, boost::optional model, int maxID, bool addNoise, bool smart) { cout << "Will try to read " << filename << endl; ifstream is(filename.c_str()); if (!is) throw std::invalid_argument("load2D: can not find the file!"); - pose2SLAM::Values::shared_ptr poses(new pose2SLAM::Values); - pose2SLAM::Graph::shared_ptr graph(new pose2SLAM::Graph); + Values::shared_ptr poses(new Values); + NonlinearFactorGraph::shared_ptr graph(new NonlinearFactorGraph); string tag; @@ -155,7 +157,7 @@ pair load2D( if (!poses->exists(id2)) poses->insert(id2, poses->at(id1) * l1Xl2); - pose2SLAM::Graph::sharedFactor factor( + NonlinearFactor::shared_ptr factor( new BetweenFactor(id1, id2, l1Xl2, *model)); graph->push_back(factor); } @@ -169,8 +171,8 @@ pair load2D( } /* ************************************************************************* */ -void save2D(const pose2SLAM::Graph& graph, const Values& config, - const SharedDiagonal model, const string& filename) { +void save2D(const NonlinearFactorGraph& graph, const Values& config, + const noiseModel::Diagonal::shared_ptr model, const string& filename) { fstream stream(filename.c_str(), fstream::out); diff --git a/gtsam/slam/dataset.h b/gtsam/slam/dataset.h index a099fb3d5..d3f00aae2 100644 --- a/gtsam/slam/dataset.h +++ b/gtsam/slam/dataset.h @@ -18,7 +18,9 @@ #pragma once -#include +#include +#include + #include namespace gtsam { @@ -39,8 +41,8 @@ namespace gtsam { * @param addNoise add noise to the edges * @param smart try to reduce complexity of covariance to cheapest model */ - std::pair load2D( - std::pair > dataset, + std::pair load2D( + std::pair > dataset, int maxID = 0, bool addNoise = false, bool smart = true); /** @@ -51,15 +53,15 @@ namespace gtsam { * @param addNoise add noise to the edges * @param smart try to reduce complexity of covariance to cheapest model */ - std::pair load2D( + std::pair load2D( const std::string& filename, boost::optional model = boost::optional< - gtsam::SharedDiagonal>(), int maxID = 0, bool addNoise = false, + noiseModel::Diagonal::shared_ptr>(), int maxID = 0, bool addNoise = false, bool smart = true); /** save 2d graph */ - void save2D(const pose2SLAM::Graph& graph, const Values& config, - const gtsam::SharedDiagonal model, const std::string& filename); + void save2D(const NonlinearFactorGraph& graph, const Values& config, + const noiseModel::Diagonal::shared_ptr model, const std::string& filename); /** * Load TORO 3D Graph diff --git a/matlab/CHECK.m b/matlab/+gtsam_utils/CHECK.m similarity index 100% rename from matlab/CHECK.m rename to matlab/+gtsam_utils/CHECK.m diff --git a/matlab/EQUALITY.m b/matlab/+gtsam_utils/EQUALITY.m similarity index 100% rename from matlab/EQUALITY.m rename to matlab/+gtsam_utils/EQUALITY.m diff --git a/matlab/examples/+support/VisualISAMGenerateData.m b/matlab/+gtsam_utils/VisualISAMGenerateData.m similarity index 100% rename from matlab/examples/+support/VisualISAMGenerateData.m rename to matlab/+gtsam_utils/VisualISAMGenerateData.m diff --git a/matlab/examples/+support/VisualISAMInitialize.m b/matlab/+gtsam_utils/VisualISAMInitialize.m similarity index 54% rename from matlab/examples/+support/VisualISAMInitialize.m rename to matlab/+gtsam_utils/VisualISAMInitialize.m index 90ba1e0c5..1e408d3d9 100644 --- a/matlab/examples/+support/VisualISAMInitialize.m +++ b/matlab/+gtsam_utils/VisualISAMInitialize.m @@ -1,66 +1,75 @@ -function [noiseModels,isam,result] = VisualISAMInitialize(data,truth,options) +function [noiseModels,isam,result,nextPoseIndex] = VisualISAMInitialize(data,truth,options) % VisualInitialize: initialize visualSLAM::iSAM object and noise parameters % Authors: Duy Nguyen Ta, Frank Dellaert and Alex Cunningham %% Initialize iSAM -isam = visualSLAM.ISAM(options.reorderInterval); +import gtsam.* +params = gtsam.ISAM2Params; +if options.alwaysRelinearize + params.setRelinearizeSkip(1); +end +isam = ISAM2; %% Set Noise parameters import gtsam.* noiseModels.pose = noiseModel.Diagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); %noiseModels.odometry = noiseModel.Diagonal.Sigmas([0.001 0.001 0.001 0.1 0.1 0.1]'); -noiseModels.odometry = noiseModel.Diagonal.Sigmas([0.1 0.1 0.1 1.0 1.0 1.0]'); +noiseModels.odometry = noiseModel.Diagonal.Sigmas([0.05 0.05 0.05 0.2 0.2 0.2]'); noiseModels.point = noiseModel.Isotropic.Sigma(3, 0.1); noiseModels.measurement = noiseModel.Isotropic.Sigma(2, 1.0); %% Add constraints/priors % TODO: should not be from ground truth! -newFactors = visualSLAM.Graph; -initialEstimates = visualSLAM.Values; +import gtsam.* +newFactors = NonlinearFactorGraph; +initialEstimates = Values; for i=1:2 ii = symbol('x',i); if i==1 if options.hardConstraint % add hard constraint - newFactors.addPoseConstraint(ii,truth.cameras{1}.pose); + newFactors.add(NonlinearEqualityPose3(ii,truth.cameras{1}.pose)); else - newFactors.addPosePrior(ii,truth.cameras{i}.pose, noiseModels.pose); + newFactors.add(PriorFactorPose3(ii,truth.cameras{i}.pose, noiseModels.pose)); end end - initialEstimates.insertPose(ii,truth.cameras{i}.pose); + initialEstimates.insert(ii,truth.cameras{i}.pose); end +nextPoseIndex = 3; + %% Add visual measurement factors from two first poses and initialize observed landmarks +import gtsam.* for i=1:2 ii = symbol('x',i); for k=1:length(data.Z{i}) j = data.J{i}{k}; jj = symbol('l',data.J{i}{k}); - newFactors.addMeasurement(data.Z{i}{k}, noiseModels.measurement, ii, jj, data.K); + newFactors.add(GenericProjectionFactorCal3_S2(data.Z{i}{k}, noiseModels.measurement, ii, jj, data.K)); % TODO: initial estimates should not be from ground truth! if ~initialEstimates.exists(jj) - initialEstimates.insertPoint(jj, truth.points{j}); + initialEstimates.insert(jj, truth.points{j}); end if options.pointPriors % add point priors - newFactors.addPointPrior(jj, truth.points{j}, noiseModels.point); + newFactors.add(priorFactorPoint3(jj, truth.points{j}, noiseModels.point)); end end end %% Add odometry between frames 1 and 2 -newFactors.addRelativePose(symbol('x',1), symbol('x',2), data.odometry{1}, noiseModels.odometry); +import gtsam.* +newFactors.add(BetweenFactorPose3(symbol('x',1), symbol('x',2), data.odometry{1}, noiseModels.odometry)); %% Update ISAM +import gtsam.* if options.batchInitialization % Do a full optimize for first two poses - fullyOptimized = newFactors.optimize(initialEstimates,0); + batchOptimizer = LevenbergMarquardtOptimizer(newFactors, initialEstimates); + fullyOptimized = batchOptimizer.optimize(); isam.update(newFactors, fullyOptimized); else isam.update(newFactors, initialEstimates); end % figure(1);tic; % t=toc; plot(frame_i,t,'r.'); tic -result = isam.estimate(); +result = isam.calculateEstimate(); % t=toc; plot(frame_i,t,'g.'); -if options.alwaysRelinearize % re-linearize - isam.reorder_relinearize(); -end diff --git a/matlab/examples/+support/VisualISAMPlot.m b/matlab/+gtsam_utils/VisualISAMPlot.m similarity index 55% rename from matlab/examples/+support/VisualISAMPlot.m rename to matlab/+gtsam_utils/VisualISAMPlot.m index 1f2b7d710..41aa49ac6 100644 --- a/matlab/examples/+support/VisualISAMPlot.m +++ b/matlab/+gtsam_utils/VisualISAMPlot.m @@ -1,39 +1,33 @@ function VisualISAMPlot(truth, data, isam, result, options) -% VisualISAMPlot: plot current state of visualSLAM::iSAM object +% VisualISAMPlot: plot current state of ISAM2 object % Authors: Duy Nguyen Ta and Frank Dellaert -M = result.nrPoses; -N = result.nrPoints; - h=gca; cla(h); hold on; %% Plot points % Can't use data because current frame might not see all points -pointKeys = result.allPoints().keys(); -for j=0:N-1 % NOTE: uses indexing directly from a C++ vector, so zero-indexed - jj = pointKeys.at(j); - point_j = result.point(jj); - plot3(point_j.x, point_j.y, point_j.z,'marker','o'); - P = isam.marginalCovariance(jj); - covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); -end +marginals = Marginals(isam.getFactorsUnsafe(), isam.calculateEstimate()); % TODO - this is slow +gtsam_utils.plot3DPoints(result, [], marginals); %% Plot cameras import gtsam.* -for i=1:options.cameraInterval:M - ii = symbol('x',i); - pose_i = result.pose(ii); - if options.hardConstraint && (i==1) - plotPose3(pose_i,[],10); +M = 1; +while result.exists(symbol('x',M)) + ii = symbol('x',M); + pose_i = result.at(ii); + if options.hardConstraint && (M==1) + gtsam_utils.plotPose3(pose_i,[],10); else - P = isam.marginalCovariance(ii); - plotPose3(pose_i,P,10); + P = marginals.marginalCovariance(ii); + gtsam_utils.plotPose3(pose_i,P,10); end if options.drawTruePoses % show ground truth - plotPose3(truth.cameras{i}.pose,[],10); + gtsam_utils.plotPose3(truth.cameras{M}.pose,[],10); end + + M = M + options.cameraInterval; end %% draw diff --git a/matlab/+gtsam_utils/VisualISAMStep.m b/matlab/+gtsam_utils/VisualISAMStep.m new file mode 100644 index 000000000..71b1c849c --- /dev/null +++ b/matlab/+gtsam_utils/VisualISAMStep.m @@ -0,0 +1,44 @@ +function [isam,result,nextPoseIndex] = VisualISAMStep(data,noiseModels,isam,result,truth,nextPoseIndex) +% VisualISAMStep: execute one update step of visualSLAM::iSAM object +% Authors: Duy Nguyen Ta and Frank Dellaert + +% iSAM expects us to give it a new set of factors +% along with initial estimates for any new variables introduced. +import gtsam.* +newFactors = NonlinearFactorGraph; +initialEstimates = Values; + +%% Add odometry +import gtsam.* +odometry = data.odometry{nextPoseIndex-1}; +newFactors.add(BetweenFactorPose3(symbol('x',nextPoseIndex-1), symbol('x',nextPoseIndex), odometry, noiseModels.odometry)); + +%% Add visual measurement factors and initializations as necessary +import gtsam.* +for k=1:length(data.Z{nextPoseIndex}) + zij = data.Z{nextPoseIndex}{k}; + j = data.J{nextPoseIndex}{k}; + jj = symbol('l', j); + newFactors.add(GenericProjectionFactorCal3_S2(zij, noiseModels.measurement, symbol('x',nextPoseIndex), jj, data.K)); + % TODO: initialize with something other than truth + if ~result.exists(jj) && ~initialEstimates.exists(jj) + lmInit = truth.points{j}; + initialEstimates.insert(jj, lmInit); + end +end + +%% Initial estimates for the new pose. +import gtsam.* +prevPose = result.at(symbol('x',nextPoseIndex-1)); +initialEstimates.insert(symbol('x',nextPoseIndex), prevPose.compose(odometry)); + +%% Update ISAM +% figure(1);tic; +isam.update(newFactors, initialEstimates); +% t=toc; plot(frame_i,t,'r.'); tic +result = isam.calculateEstimate(); +% t=toc; plot(frame_i,t,'g.'); + +% Update nextPoseIndex to return +nextPoseIndex = nextPoseIndex + 1; + diff --git a/matlab/circlePose2.m b/matlab/+gtsam_utils/circlePose2.m similarity index 95% rename from matlab/circlePose2.m rename to matlab/+gtsam_utils/circlePose2.m index 7153fc128..0679c16b3 100644 --- a/matlab/circlePose2.m +++ b/matlab/+gtsam_utils/circlePose2.m @@ -23,7 +23,7 @@ values = gtsam.Values; theta = 0.0; dtheta = 2*pi()/numPoses; for i = 1:numPoses - key = gtsam.Symbol(symbolChar, i-1).key(); + key = gtsam.symbol(symbolChar, i-1); pose = gtsam.Pose2(radius*cos(theta), radius*sin(theta), pi()/2 + theta); values.insert(key, pose); theta = theta + dtheta; diff --git a/matlab/circlePose3.m b/matlab/+gtsam_utils/circlePose3.m similarity index 96% rename from matlab/circlePose3.m rename to matlab/+gtsam_utils/circlePose3.m index 0e74a2f1b..9085ab0d0 100644 --- a/matlab/circlePose3.m +++ b/matlab/+gtsam_utils/circlePose3.m @@ -24,7 +24,7 @@ theta = 0.0; dtheta = 2*pi()/numPoses; gRo = gtsam.Rot3([0, 1, 0 ; 1, 0, 0 ; 0, 0, -1]); for i = 1:numPoses - key = gtsam.Symbol(symbolChar, i-1).key(); + key = gtsam.symbol(symbolChar, i-1); gti = gtsam.Point3(radius*cos(theta), radius*sin(theta), 0); oRi = gtsam.Rot3.Yaw(-theta); % negative yaw goes counterclockwise, with Z down ! gTi = gtsam.Pose3(gRo.compose(oRi), gti); diff --git a/matlab/covarianceEllipse.m b/matlab/+gtsam_utils/covarianceEllipse.m similarity index 96% rename from matlab/covarianceEllipse.m rename to matlab/+gtsam_utils/covarianceEllipse.m index 491e099c3..b4579862e 100644 --- a/matlab/covarianceEllipse.m +++ b/matlab/+gtsam_utils/covarianceEllipse.m @@ -1,34 +1,34 @@ -function covarianceEllipse(x,P,color) -% covarianceEllipse: plot a Gaussian as an uncertainty ellipse -% Based on Maybeck Vol 1, page 366 -% k=2.296 corresponds to 1 std, 68.26% of all probability -% k=11.82 corresponds to 3 std, 99.74% of all probability -% -% covarianceEllipse(x,P,color) -% it is assumed x and y are the first two components of state x - -[e,s] = eig(P(1:2,1:2)); -s1 = s(1,1); -s2 = s(2,2); -k = 2.296; -[ex,ey] = ellipse( sqrt(s1*k)*e(:,1), sqrt(s2*k)*e(:,2), x(1:2) ); -line(ex,ey,'color',color); - - function [x,y] = ellipse(a,b,c); - % ellipse: return the x and y coordinates for an ellipse - % [x,y] = ellipse(a,b,c); - % a, and b are the axes. c is the center - - global ellipse_x ellipse_y - if ~exist('elipse_x') - q =0:2*pi/25:2*pi; - ellipse_x = cos(q); - ellipse_y = sin(q); - end - - points = a*ellipse_x + b*ellipse_y; - x = c(1) + points(1,:); - y = c(2) + points(2,:); - end - +function covarianceEllipse(x,P,color) +% covarianceEllipse: plot a Gaussian as an uncertainty ellipse +% Based on Maybeck Vol 1, page 366 +% k=2.296 corresponds to 1 std, 68.26% of all probability +% k=11.82 corresponds to 3 std, 99.74% of all probability +% +% covarianceEllipse(x,P,color) +% it is assumed x and y are the first two components of state x + +[e,s] = eig(P(1:2,1:2)); +s1 = s(1,1); +s2 = s(2,2); +k = 2.296; +[ex,ey] = ellipse( sqrt(s1*k)*e(:,1), sqrt(s2*k)*e(:,2), x(1:2) ); +line(ex,ey,'color',color); + + function [x,y] = ellipse(a,b,c); + % ellipse: return the x and y coordinates for an ellipse + % [x,y] = ellipse(a,b,c); + % a, and b are the axes. c is the center + + global ellipse_x ellipse_y + if ~exist('elipse_x') + q =0:2*pi/25:2*pi; + ellipse_x = cos(q); + ellipse_y = sin(q); + end + + points = a*ellipse_x + b*ellipse_y; + x = c(1) + points(1,:); + y = c(2) + points(2,:); + end + end \ No newline at end of file diff --git a/matlab/covarianceEllipse3D.m b/matlab/+gtsam_utils/covarianceEllipse3D.m similarity index 100% rename from matlab/covarianceEllipse3D.m rename to matlab/+gtsam_utils/covarianceEllipse3D.m diff --git a/matlab/examples/+support/findExampleDataFile.m b/matlab/+gtsam_utils/findExampleDataFile.m similarity index 74% rename from matlab/examples/+support/findExampleDataFile.m rename to matlab/+gtsam_utils/findExampleDataFile.m index 5fd23352e..9c40960b9 100644 --- a/matlab/examples/+support/findExampleDataFile.m +++ b/matlab/+gtsam_utils/findExampleDataFile.m @@ -3,8 +3,8 @@ function datafile = findExampleDataFile(datasetName) [ myPath, ~, ~ ] = fileparts(mfilename('fullpath')); searchPath = { ... - fullfile(myPath, [ '../../../examples/Data/' datasetName ]) ... - fullfile(myPath, [ '../Data/' datasetName ]) }; + fullfile(myPath, [ '../../examples/Data/' datasetName ]) ... + fullfile(myPath, [ '../gtsam_examples/Data/' datasetName ]) }; datafile = []; for path = searchPath if exist(path{:}, 'file') diff --git a/matlab/load2D.m b/matlab/+gtsam_utils/load2D.m similarity index 100% rename from matlab/load2D.m rename to matlab/+gtsam_utils/load2D.m diff --git a/matlab/load3D.m b/matlab/+gtsam_utils/load3D.m similarity index 100% rename from matlab/load3D.m rename to matlab/+gtsam_utils/load3D.m diff --git a/matlab/plot2DPoints.m b/matlab/+gtsam_utils/plot2DPoints.m similarity index 88% rename from matlab/plot2DPoints.m rename to matlab/+gtsam_utils/plot2DPoints.m index d03676699..b98434627 100644 --- a/matlab/plot2DPoints.m +++ b/matlab/+gtsam_utils/plot2DPoints.m @@ -22,9 +22,9 @@ for i = 0:keys.size-1 if isa(p, 'gtsam.Point2') if haveMarginals P = marginals.marginalCovariance(key); - plotPoint2(p, linespec, P); + gtsam_utils.plotPoint2(p, linespec, P); else - plotPoint2(p, linespec); + gtsam_utils.plotPoint2(p, linespec); end end end diff --git a/matlab/plot2DTrajectory.m b/matlab/+gtsam_utils/plot2DTrajectory.m similarity index 93% rename from matlab/plot2DTrajectory.m rename to matlab/+gtsam_utils/plot2DTrajectory.m index fcbfe4b92..c962c993b 100644 --- a/matlab/plot2DTrajectory.m +++ b/matlab/+gtsam_utils/plot2DTrajectory.m @@ -31,7 +31,7 @@ for i = 0:keys.size-1 plot([ x.x; lastPose.x ], [ x.y; lastPose.y ], linespec); if haveMarginals P = marginals.marginalCovariance(lastKey); - plotPose2(lastPose, 'g', P); + gtsam_utils.plotPose2(lastPose, 'g', P); end end lastIndex = i; @@ -43,7 +43,7 @@ if ~isempty(lastIndex) && haveMarginals lastKey = keys.at(lastIndex); lastPose = values.at(lastKey); P = marginals.marginalCovariance(lastKey); - plotPose2(lastPose, 'g', P); + gtsam_utils.plotPose2(lastPose, 'g', P); end if ~holdstate diff --git a/matlab/plot3DPoints.m b/matlab/+gtsam_utils/plot3DPoints.m similarity index 88% rename from matlab/plot3DPoints.m rename to matlab/+gtsam_utils/plot3DPoints.m index 264298ef4..e7a5ab0a0 100644 --- a/matlab/plot3DPoints.m +++ b/matlab/+gtsam_utils/plot3DPoints.m @@ -22,9 +22,9 @@ for i = 0:keys.size-1 if isa(p, 'gtsam.Point3') if haveMarginals P = marginals.marginalCovariance(key); - plotPoint3(p, linespec, P); + gtsam_utils.plotPoint3(p, linespec, P); else - plotPoint3(p, linespec); + gtsam_utils.plotPoint3(p, linespec); end end end diff --git a/matlab/plot3DTrajectory.m b/matlab/+gtsam_utils/plot3DTrajectory.m similarity index 91% rename from matlab/plot3DTrajectory.m rename to matlab/+gtsam_utils/plot3DTrajectory.m index 771d567fa..08b2f0daa 100644 --- a/matlab/plot3DTrajectory.m +++ b/matlab/+gtsam_utils/plot3DTrajectory.m @@ -28,7 +28,7 @@ for i = 0:keys.size-1 else P = []; end - plotPose3(lastPose, P, scale); + gtsam_utils.plotPose3(lastPose, P, scale); end lastIndex = i; end @@ -43,7 +43,7 @@ if ~isempty(lastIndex) else P = []; end - plotPose3(lastPose, P, scale); + gtsam_utils.plotPose3(lastPose, P, scale); end if ~holdstate diff --git a/matlab/plotCamera.m b/matlab/+gtsam_utils/plotCamera.m similarity index 100% rename from matlab/plotCamera.m rename to matlab/+gtsam_utils/plotCamera.m diff --git a/matlab/plotPoint2.m b/matlab/+gtsam_utils/plotPoint2.m similarity index 76% rename from matlab/plotPoint2.m rename to matlab/+gtsam_utils/plotPoint2.m index fcc274d90..a1bc85a88 100644 --- a/matlab/plotPoint2.m +++ b/matlab/+gtsam_utils/plotPoint2.m @@ -6,5 +6,5 @@ else plot(p.x,p.y,color); end if exist('P', 'var') - covarianceEllipse([p.x;p.y],P,color(1)); + gtsam_utils.covarianceEllipse([p.x;p.y],P,color(1)); end \ No newline at end of file diff --git a/matlab/plotPoint3.m b/matlab/+gtsam_utils/plotPoint3.m similarity index 80% rename from matlab/plotPoint3.m rename to matlab/+gtsam_utils/plotPoint3.m index 89d5613d5..6aafd5f21 100644 --- a/matlab/plotPoint3.m +++ b/matlab/+gtsam_utils/plotPoint3.m @@ -6,7 +6,7 @@ else plot3(p.x,p.y,p.z,color); end if exist('P', 'var') - covarianceEllipse3D([p.x;p.y;p.z],P); + gtsam_utils.covarianceEllipse3D([p.x;p.y;p.z],P); end end diff --git a/matlab/plotPose2.m b/matlab/+gtsam_utils/plotPose2.m similarity index 84% rename from matlab/plotPose2.m rename to matlab/+gtsam_utils/plotPose2.m index 54b1e68f0..a9997dc2c 100644 --- a/matlab/plotPose2.m +++ b/matlab/+gtsam_utils/plotPose2.m @@ -9,5 +9,5 @@ quiver(pose.x,pose.y,c,s,axisLength,color); if nargin>2 pPp = P(1:2,1:2); % covariance matrix in pose coordinate frame gRp = [c -s;s c]; % rotation from pose to global - covarianceEllipse([pose.x;pose.y],gRp*pPp*gRp',color); + gtsam_utils.covarianceEllipse([pose.x;pose.y],gRp*pPp*gRp',color); end \ No newline at end of file diff --git a/matlab/plotPose3.m b/matlab/+gtsam_utils/plotPose3.m similarity index 94% rename from matlab/plotPose3.m rename to matlab/+gtsam_utils/plotPose3.m index 956b231be..d24a998c8 100644 --- a/matlab/plotPose3.m +++ b/matlab/+gtsam_utils/plotPose3.m @@ -25,7 +25,7 @@ end if (nargin>2) && (~isempty(P)) pPp = P(4:6,4:6); % covariance matrix in pose coordinate frame gPp = gRp*pPp*gRp'; % convert the covariance matrix to global coordinate frame - covarianceEllipse3D(C,gPp); + gtsam_utils.covarianceEllipse3D(C,gPp); end end diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index 0b07b51b1..66fa99def 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -10,14 +10,17 @@ install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/) # Tests message(STATUS "Installing Matlab Toolbox Tests") -file(GLOB matlab_tests "${GTSAM_SOURCE_ROOT_DIR}/matlab/tests/*.m") -install(FILES ${matlab_tests} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_tests) +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_tests" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") # Examples message(STATUS "Installing Matlab Toolbox Examples") # Matlab files: *.m and *.fig -install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples" FILES_MATCHING PATTERN "*.m") -install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/examples/" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples" FILES_MATCHING PATTERN "*.fig") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.fig") + +# Utilities +message(STATUS "Installing Matlab Toolbox Utilities") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/+gtsam_utils" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") message(STATUS "Installing Matlab Toolbox Examples (Data)") # Data files: *.graph and *.txt diff --git a/matlab/examples/+support/VisualISAMStep.m b/matlab/examples/+support/VisualISAMStep.m deleted file mode 100644 index ef056553e..000000000 --- a/matlab/examples/+support/VisualISAMStep.m +++ /dev/null @@ -1,44 +0,0 @@ -function [isam,result] = VisualISAMStep(data,noiseModels,isam,result,truth, options) -% VisualISAMStep: execute one update step of visualSLAM::iSAM object -% Authors: Duy Nguyen Ta and Frank Dellaert - -% iSAM expects us to give it a new set of factors -% along with initial estimates for any new variables introduced. -newFactors = visualSLAM.Graph; -initialEstimates = visualSLAM.Values; - -%% Add odometry -import gtsam.* -i = result.nrPoses+1; -odometry = data.odometry{i-1}; -newFactors.addRelativePose(symbol('x',i-1), symbol('x',i), odometry, noiseModels.odometry); - -%% Add visual measurement factors and initializations as necessary -import gtsam.* -for k=1:length(data.Z{i}) - zij = data.Z{i}{k}; - j = data.J{i}{k}; - jj = symbol('l', j); - newFactors.addMeasurement(zij, noiseModels.measurement, symbol('x',i), jj, data.K); - % TODO: initialize with something other than truth - if ~result.exists(jj) && ~initialEstimates.exists(jj) - lmInit = truth.points{j}; - initialEstimates.insertPoint(jj, lmInit); - end -end - -%% Initial estimates for the new pose. -import gtsam.* -prevPose = result.pose(symbol('x',i-1)); -initialEstimates.insertPose(symbol('x',i), prevPose.compose(odometry)); - -%% Update ISAM -% figure(1);tic; -isam.update(newFactors, initialEstimates); -% t=toc; plot(frame_i,t,'r.'); tic -result = isam.estimate(); -% t=toc; plot(frame_i,t,'g.'); - -if options.alwaysRelinearize % re-linearize - isam.reorder_relinearize(); -end diff --git a/matlab/examples/LocalizationExample.m b/matlab/gtsam_examples/LocalizationExample.m similarity index 96% rename from matlab/examples/LocalizationExample.m rename to matlab/gtsam_examples/LocalizationExample.m index e4ee76d7c..aad3af98c 100644 --- a/matlab/examples/LocalizationExample.m +++ b/matlab/gtsam_examples/LocalizationExample.m @@ -55,7 +55,7 @@ import gtsam.* cla; hold on; -plot2DTrajectory(result, [], Marginals(graph, result)); +gtsam_utils.plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/examples/OdometryExample.m b/matlab/gtsam_examples/OdometryExample.m similarity index 96% rename from matlab/examples/OdometryExample.m rename to matlab/gtsam_examples/OdometryExample.m index 81733cfb0..e47becda5 100644 --- a/matlab/examples/OdometryExample.m +++ b/matlab/gtsam_examples/OdometryExample.m @@ -52,7 +52,7 @@ import gtsam.* cla; hold on; -plot2DTrajectory(result, [], Marginals(graph, result)); +gtsam_utils.plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/examples/PlanarSLAMExample.m b/matlab/gtsam_examples/PlanarSLAMExample.m similarity index 96% rename from matlab/examples/PlanarSLAMExample.m rename to matlab/gtsam_examples/PlanarSLAMExample.m index 9b4600578..056db501e 100644 --- a/matlab/examples/PlanarSLAMExample.m +++ b/matlab/gtsam_examples/PlanarSLAMExample.m @@ -72,8 +72,8 @@ import gtsam.* cla;hold on marginals = Marginals(graph, result); -plot2DTrajectory(result, [], marginals); -plot2DPoints(result, [], marginals); +gtsam_utils.plot2DTrajectory(result, [], marginals); +gtsam_utils.plot2DPoints(result, [], marginals); plot([result.at(i1).x; result.at(j1).x],[result.at(i1).y; result.at(j1).y], 'c-'); plot([result.at(i2).x; result.at(j1).x],[result.at(i2).y; result.at(j1).y], 'c-'); diff --git a/matlab/examples/PlanarSLAMExample_sampling.m b/matlab/gtsam_examples/PlanarSLAMExample_sampling.m similarity index 92% rename from matlab/examples/PlanarSLAMExample_sampling.m rename to matlab/gtsam_examples/PlanarSLAMExample_sampling.m index 58686c362..5604d0ddc 100644 --- a/matlab/examples/PlanarSLAMExample_sampling.m +++ b/matlab/gtsam_examples/PlanarSLAMExample_sampling.m @@ -39,6 +39,7 @@ end graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); %% Initialize MCMC sampler with ground truth +import gtsam.* sample = Values; sample.insert(i1, Pose2(0,0,0)); sample.insert(i2, Pose2(2,0,0)); @@ -47,11 +48,12 @@ sample.insert(j1, Point2(2,2)); sample.insert(j2, Point2(4,2)); %% Calculate and plot Covariance Ellipses +import gtsam.* cla;hold on marginals = Marginals(graph, sample); -plot2DTrajectory(sample, [], marginals); -plot2DPoints(sample, [], marginals); +gtsam_utils.plot2DTrajectory(sample, [], marginals); +gtsam_utils.plot2DPoints(sample, [], marginals); for j=1:2 key = symbol('l',j); @@ -66,9 +68,10 @@ plot([sample.at(i3).x; sample.at(j2).x],[sample.at(i3).y; sample.at(j2).y], 'c-' view(2); axis auto; axis equal %% Do Sampling on point 2 +import gtsam.* N=1000; for s=1:N delta = S{2}*randn(2,1); proposedPoint = Point2(point{2}.x+delta(1),point{2}.y+delta(2)); - plotPoint2(proposedPoint,'k.') + gtsam_utils.plotPoint2(proposedPoint,'k.') end \ No newline at end of file diff --git a/matlab/examples/Pose2SLAMExample.m b/matlab/gtsam_examples/Pose2SLAMExample.m similarity index 96% rename from matlab/examples/Pose2SLAMExample.m rename to matlab/gtsam_examples/Pose2SLAMExample.m index 1e26ce33d..a8ad32254 100644 --- a/matlab/examples/Pose2SLAMExample.m +++ b/matlab/gtsam_examples/Pose2SLAMExample.m @@ -56,17 +56,19 @@ initialEstimate.insert(5, Pose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses +import gtsam.* cla; hold on plot([result.at(5).x;result.at(2).x],[result.at(5).y;result.at(2).y],'r-','LineWidth',2); marginals = Marginals(graph, result); -plot2DTrajectory(result, [], marginals); +gtsam_utils.plot2DTrajectory(result, [], marginals); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/examples/Pose2SLAMExample_advanced.m b/matlab/gtsam_examples/Pose2SLAMExample_advanced.m similarity index 99% rename from matlab/examples/Pose2SLAMExample_advanced.m rename to matlab/gtsam_examples/Pose2SLAMExample_advanced.m index b496c44e7..fab340f2a 100644 --- a/matlab/examples/Pose2SLAMExample_advanced.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_advanced.m @@ -77,5 +77,6 @@ IJS = gfg.sparseJacobian_(); Ab=sparse(IJS(1,:),IJS(2,:),IJS(3,:)); A = Ab(:,1:end-1); b = full(Ab(:,end)); +clf spy(A); title('Non-zero entries in measurement Jacobian'); diff --git a/matlab/examples/Pose2SLAMExample_circle.m b/matlab/gtsam_examples/Pose2SLAMExample_circle.m similarity index 87% rename from matlab/examples/Pose2SLAMExample_circle.m rename to matlab/gtsam_examples/Pose2SLAMExample_circle.m index 3d2265d76..b40c67322 100644 --- a/matlab/examples/Pose2SLAMExample_circle.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_circle.m @@ -10,14 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -import gtsam.* - %% Create a hexagon of poses -hexagon = circlePose2(6,1.0); +import gtsam.* +hexagon = gtsam_utils.circlePose2(6,1.0); p0 = hexagon.at(0); p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement +import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose2(0, p0)); delta = p0.between(p1); @@ -30,6 +30,7 @@ fg.add(BetweenFactorPose2(4,5, delta, covariance)); fg.add(BetweenFactorPose2(5,0, delta, covariance)); %% Create initial config +import gtsam.* initial = Values; initial.insert(0, p0); initial.insert(1, hexagon.at(1).retract([-0.1, 0.1,-0.1]')); @@ -39,15 +40,18 @@ initial.insert(4, hexagon.at(4).retract([ 0.1,-0.1, 0.1]')); initial.insert(5, hexagon.at(5).retract([-0.1, 0.1,-0.1]')); %% Plot Initial Estimate +import gtsam.* cla -plot2DTrajectory(initial, 'g*-'); axis equal +gtsam_utils.plot2DTrajectory(initial, 'g*-'); axis equal %% optimize +import gtsam.* optimizer = DoglegOptimizer(fg, initial); result = optimizer.optimizeSafely; %% Show Result -hold on; plot2DTrajectory(result, 'b*-'); +import gtsam.* +hold on; gtsam_utils.plot2DTrajectory(result, 'b*-'); view(2); axis([-1.5 1.5 -1.5 1.5]); result.print(sprintf('\nFinal result:\n')); diff --git a/matlab/examples/Pose2SLAMExample_graph.m b/matlab/gtsam_examples/Pose2SLAMExample_graph.m similarity index 79% rename from matlab/examples/Pose2SLAMExample_graph.m rename to matlab/gtsam_examples/Pose2SLAMExample_graph.m index f5193a7de..980a11cfa 100644 --- a/matlab/examples/Pose2SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_graph.m @@ -11,12 +11,12 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Find data file -datafile = support.findExampleDataFile('w100-odom.graph'); +datafile = gtsam_utils.findExampleDataFile('w100-odom.graph'); %% Initialize graph, initial estimate, and odometry noise import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -[graph,initial] = load2D(datafile, model); +[graph,initial] = gtsam_utils.load2D(datafile, model); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 @@ -26,22 +26,25 @@ priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); graph.add(PriorFactorPose2(0, priorMean, priorNoise)); % add directly to graph %% Plot Initial Estimate +import gtsam.* cla -plot2DTrajectory(initial, 'g-*'); axis equal +gtsam_utils.plot2DTrajectory(initial, 'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely; -hold on; plot2DTrajectory(result, 'b-*'); +hold on; gtsam_utils.plot2DTrajectory(result, 'b-*'); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses +import gtsam.* marginals = Marginals(graph, result); P={}; for i=1:result.size()-1 pose_i = result.at(i); P{i}=marginals.marginalCovariance(i); - plotPose2(pose_i,'b',P{i}) + gtsam_utils.plotPose2(pose_i,'b',P{i}) end view(2) axis([-15 10 -15 10]); axis equal; diff --git a/matlab/examples/Pose2SLAMwSPCG.m b/matlab/gtsam_examples/Pose2SLAMwSPCG.m similarity index 100% rename from matlab/examples/Pose2SLAMwSPCG.m rename to matlab/gtsam_examples/Pose2SLAMwSPCG.m diff --git a/matlab/examples/Pose3SLAMExample.m b/matlab/gtsam_examples/Pose3SLAMExample.m similarity index 88% rename from matlab/examples/Pose3SLAMExample.m rename to matlab/gtsam_examples/Pose3SLAMExample.m index 0d2bd237f..bdc101b9d 100644 --- a/matlab/examples/Pose3SLAMExample.m +++ b/matlab/gtsam_examples/Pose3SLAMExample.m @@ -10,14 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -import gtsam.* - %% Create a hexagon of poses -hexagon = circlePose3(6,1.0); +import gtsam.* +hexagon = gtsam_utils.circlePose3(6,1.0); p0 = hexagon.at(0); p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement +import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose3(0, p0)); delta = p0.between(p1); @@ -30,6 +30,7 @@ fg.add(BetweenFactorPose3(4,5, delta, covariance)); fg.add(BetweenFactorPose3(5,0, delta, covariance)); %% Create initial config +import gtsam.* initial = Values; s = 0.10; initial.insert(0, p0); @@ -40,15 +41,18 @@ initial.insert(4, hexagon.at(4).retract(s*randn(6,1))); initial.insert(5, hexagon.at(5).retract(s*randn(6,1))); %% Plot Initial Estimate +import gtsam.* cla -plot3DTrajectory(initial, 'g-*'); +gtsam_utils.plot3DTrajectory(initial, 'g-*'); %% optimize +import gtsam.* optimizer = DoglegOptimizer(fg, initial); result = optimizer.optimizeSafely(); %% Show Result -hold on; plot3DTrajectory(result, 'b-*', true, 0.3); +import gtsam.* +hold on; gtsam_utils.plot3DTrajectory(result, 'b-*', true, 0.3); axis([-2 2 -2 2 -1 1]); axis equal view(-37,40) diff --git a/matlab/examples/Pose3SLAMExample_graph.m b/matlab/gtsam_examples/Pose3SLAMExample_graph.m similarity index 77% rename from matlab/examples/Pose3SLAMExample_graph.m rename to matlab/gtsam_examples/Pose3SLAMExample_graph.m index 1d33c30e4..574894878 100644 --- a/matlab/examples/Pose3SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose3SLAMExample_graph.m @@ -16,26 +16,27 @@ N = 2500; % dataset = 'sphere2500_groundtruth.txt'; dataset = 'sphere2500.txt'; -datafile = support.findExampleDataFile(dataset); +datafile = gtsam_utils.findExampleDataFile(dataset); %% Initialize graph, initial estimate, and odometry noise import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -[graph,initial]=load3D(datafile,model,true,N); +[graph,initial]=gtsam_utils.load3D(datafile,model,true,N); %% Plot Initial Estimate +import gtsam.* cla first = initial.at(0); plot3(first.x(),first.y(),first.z(),'r*'); hold on -plot3DTrajectory(initial,'g-',false); +gtsam_utils.plot3DTrajectory(initial,'g-',false); drawnow; %% Read again, now with all constraints, and optimize import gtsam.* -graph = load3D(datafile, model, false, N); +graph = gtsam_utils.load3D(datafile, model, false, N); graph.add(NonlinearEqualityPose3(0, first)); optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely(); -plot3DTrajectory(result, 'r-', false); axis equal; +gtsam_utils.plot3DTrajectory(result, 'r-', false); axis equal; view(3); axis equal; \ No newline at end of file diff --git a/matlab/examples/SBAExample.m b/matlab/gtsam_examples/SBAExample.m similarity index 97% rename from matlab/examples/SBAExample.m rename to matlab/gtsam_examples/SBAExample.m index a9f101613..852c83fdc 100644 --- a/matlab/examples/SBAExample.m +++ b/matlab/gtsam_examples/SBAExample.m @@ -22,7 +22,7 @@ options.nrCameras = 10; options.showImages = false; %% Generate data -[data,truth] = support.VisualISAMGenerateData(options); +[data,truth] = gtsam_utils.VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; diff --git a/matlab/examples/SFMExample.m b/matlab/gtsam_examples/SFMExample.m similarity index 94% rename from matlab/examples/SFMExample.m rename to matlab/gtsam_examples/SFMExample.m index 2153ba647..7f583b386 100644 --- a/matlab/examples/SFMExample.m +++ b/matlab/gtsam_examples/SFMExample.m @@ -22,7 +22,7 @@ options.nrCameras = 10; options.showImages = false; %% Generate data -[data,truth] = support.VisualISAMGenerateData(options); +[data,truth] = gtsam_utils.VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; @@ -86,8 +86,8 @@ marginals = Marginals(graph, result); cla hold on; -plot3DPoints(result, [], marginals); -plot3DTrajectory(result, '*', 1, 8, marginals); +gtsam_utils.plot3DPoints(result, [], marginals); +gtsam_utils.plot3DTrajectory(result, '*', 1, 8, marginals); axis([-40 40 -40 40 -10 20]);axis equal view(3) diff --git a/matlab/examples/StereoVOExample.m b/matlab/gtsam_examples/StereoVOExample.m similarity index 94% rename from matlab/examples/StereoVOExample.m rename to matlab/gtsam_examples/StereoVOExample.m index 468123529..e62c4395c 100644 --- a/matlab/examples/StereoVOExample.m +++ b/matlab/gtsam_examples/StereoVOExample.m @@ -18,6 +18,7 @@ % - No noise on measurements %% Create keys for variables +import gtsam.* x1 = symbol('x',1); x2 = symbol('x',2); l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); @@ -74,6 +75,6 @@ axis equal view(-38,12) camup([0;1;0]); -plot3DTrajectory(initialEstimate, 'r', 1, 0.3); -plot3DTrajectory(result, 'g', 1, 0.3); -plot3DPoints(result); +gtsam_utils.plot3DTrajectory(initialEstimate, 'r', 1, 0.3); +gtsam_utils.plot3DTrajectory(result, 'g', 1, 0.3); +gtsam_utils.plot3DPoints(result); diff --git a/matlab/examples/StereoVOExample_large.m b/matlab/gtsam_examples/StereoVOExample_large.m similarity index 84% rename from matlab/examples/StereoVOExample_large.m rename to matlab/gtsam_examples/StereoVOExample_large.m index fb45dd8a7..5ae3a8fd7 100644 --- a/matlab/examples/StereoVOExample_large.m +++ b/matlab/gtsam_examples/StereoVOExample_large.m @@ -13,7 +13,7 @@ %% Load calibration import gtsam.* % format: fx fy skew cx cy baseline -calib = dlmread(support.findExampleDataFile('VO_calibration.txt')); +calib = dlmread(gtsam_utils.findExampleDataFile('VO_calibration.txt')); K = Cal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); @@ -26,7 +26,7 @@ initial = Values; % row format: camera_id 4x4 pose (row, major) import gtsam.* fprintf(1,'Reading data\n'); -cameras = dlmread(support.findExampleDataFile('VO_camera_poses_large.txt')); +cameras = dlmread(gtsam_utils.findExampleDataFile('VO_camera_poses_large.txt')); for i=1:size(cameras,1) pose = Pose3(reshape(cameras(i,2:17),4,4)'); initial.insert(symbol('x',cameras(i,1)),pose); @@ -35,7 +35,7 @@ end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z import gtsam.* -measurements = dlmread(support.findExampleDataFile('VO_stereo_factors_large.txt')); +measurements = dlmread(gtsam_utils.findExampleDataFile('VO_stereo_factors_large.txt')); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) @@ -54,11 +54,13 @@ end toc %% add a constraint on the starting pose +import gtsam.* key = symbol('x',1); first_pose = initial.at(key); graph.add(NonlinearEqualityPose3(key, first_pose)); %% optimize +import gtsam.* fprintf(1,'Optimizing\n'); tic optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely(); @@ -67,9 +69,9 @@ toc %% visualize initial trajectory, final trajectory, and final points cla; hold on; -plot3DTrajectory(initial, 'r', 1, 0.5); -plot3DTrajectory(result, 'g', 1, 0.5); -plot3DPoints(result); +gtsam_utils.plot3DTrajectory(initial, 'r', 1, 0.5); +gtsam_utils.plot3DTrajectory(result, 'g', 1, 0.5); +gtsam_utils.plot3DPoints(result); axis([-5 20 -20 20 0 100]); axis equal diff --git a/matlab/examples/VisualISAMDemo.m b/matlab/gtsam_examples/VisualISAMDemo.m similarity index 100% rename from matlab/examples/VisualISAMDemo.m rename to matlab/gtsam_examples/VisualISAMDemo.m diff --git a/matlab/examples/VisualISAMExample.m b/matlab/gtsam_examples/VisualISAMExample.m similarity index 75% rename from matlab/examples/VisualISAMExample.m rename to matlab/gtsam_examples/VisualISAMExample.m index 7553ed2a4..64634d336 100644 --- a/matlab/examples/VisualISAMExample.m +++ b/matlab/gtsam_examples/VisualISAMExample.m @@ -32,17 +32,17 @@ options.saveFigures = false; options.saveDotFiles = false; %% Generate data -[data,truth] = support.VisualISAMGenerateData(options); +[data,truth] = gtsam_utils.VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -[noiseModels,isam,result] = support.VisualISAMInitialize(data,truth,options); +[noiseModels,isam,result,nextPose] = gtsam_utils.VisualISAMInitialize(data,truth,options); cla; -support.VisualISAMPlot(truth, data, isam, result, options) +gtsam_utils.VisualISAMPlot(truth, data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras - [isam,result] = support.VisualISAMStep(data,noiseModels,isam,result,truth,options); + [isam,result,nextPose] = gtsam_utils.VisualISAMStep(data,noiseModels,isam,result,truth,nextPose); if mod(frame_i,options.drawInterval)==0 - support.VisualISAMPlot(truth, data, isam, result, options) + gtsam_utils.VisualISAMPlot(truth, data, isam, result, options) end end diff --git a/matlab/examples/VisualISAM_gui.fig b/matlab/gtsam_examples/VisualISAM_gui.fig similarity index 100% rename from matlab/examples/VisualISAM_gui.fig rename to matlab/gtsam_examples/VisualISAM_gui.fig diff --git a/matlab/examples/VisualISAM_gui.m b/matlab/gtsam_examples/VisualISAM_gui.m similarity index 92% rename from matlab/examples/VisualISAM_gui.m rename to matlab/gtsam_examples/VisualISAM_gui.m index 765a6f5ac..f7990268f 100644 --- a/matlab/examples/VisualISAM_gui.m +++ b/matlab/gtsam_examples/VisualISAM_gui.m @@ -224,32 +224,32 @@ function saveGraphsCB_Callback(hObject, ~, handles) % --- Executes on button press in intializeButton. function intializeButton_Callback(hObject, ~, handles) -global frame_i truth data noiseModels isam result options +global frame_i truth data noiseModels isam result nextPoseIndex options % initialize global options initOptions(handles) % Generate Data -[data,truth] = support.VisualISAMGenerateData(options); +[data,truth] = gtsam_utils.VisualISAMGenerateData(options); % Initialize and plot -[noiseModels,isam,result] = support.VisualISAMInitialize(data,truth,options); +[noiseModels,isam,result,nextPoseIndex] = gtsam_utils.VisualISAMInitialize(data,truth,options); cla -support.VisualISAMPlot(truth, data, isam, result, options) +gtsam_utils.VisualISAMPlot(truth, data, isam, result, options) frame_i = 2; showFramei(hObject, handles) % --- Executes on button press in runButton. function runButton_Callback(hObject, ~, handles) -global frame_i truth data noiseModels isam result options +global frame_i truth data noiseModels isam result nextPoseIndex options while (frame_i Date: Fri, 27 Jul 2012 19:15:58 +0000 Subject: [PATCH 724/914] Fixed missing renames --- tests/testGradientDescentOptimizer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testGradientDescentOptimizer.cpp b/tests/testGradientDescentOptimizer.cpp index 6f03bc017..4f556eb0f 100644 --- a/tests/testGradientDescentOptimizer.cpp +++ b/tests/testGradientDescentOptimizer.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include #include @@ -69,7 +69,7 @@ TEST(optimize, GradientDescentOptimizer) { param.maxIterations = 500; /* requires a larger number of iterations to converge */ param.verbosity = NonlinearOptimizerParams::SILENT; - GradientDescentOptimizer optimizer(graph, initialEstimate, param); + NonlinearConjugateGradientOptimizer optimizer(graph, initialEstimate, param); Values result = optimizer.optimize(); // cout << "gd1 solver final error = " << graph.error(result) << endl; From d95ca7857b0e0cf605ae1dab43a4321749658063 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 27 Jul 2012 19:16:00 +0000 Subject: [PATCH 725/914] Updated wrap unit tests --- wrap/tests/expected/geometry_wrapper.cpp | 36 ++++++++++--------- .../testNamespaces_wrapper.cpp | 26 +++++++------- 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index 93fde1ca4..b546aa65f 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -19,24 +19,24 @@ void _deleteAllObjects() std::streambuf *outbuf = std::cout.rdbuf(&mout); bool anyDeleted = false; - for(Collector_Point2::iterator iter = collector_Point2.begin(); + { for(Collector_Point2::iterator iter = collector_Point2.begin(); iter != collector_Point2.end(); ) { delete *iter; collector_Point2.erase(iter++); anyDeleted = true; - } - for(Collector_Point3::iterator iter = collector_Point3.begin(); + } } + { for(Collector_Point3::iterator iter = collector_Point3.begin(); iter != collector_Point3.end(); ) { delete *iter; collector_Point3.erase(iter++); anyDeleted = true; - } - for(Collector_Test::iterator iter = collector_Test.begin(); + } } + { for(Collector_Test::iterator iter = collector_Test.begin(); iter != collector_Test.end(); ) { delete *iter; collector_Test.erase(iter++); anyDeleted = true; - } + } } if(anyDeleted) cout << "WARNING: Wrap modules with variables in the workspace have been reloaded due to\n" @@ -227,14 +227,14 @@ void Point3_StaticFunctionRet_15(int nargout, mxArray *out[], int nargin, const typedef boost::shared_ptr Shared; checkArguments("Point3.StaticFunctionRet",nargout,nargin,1); double z = unwrap< double >(in[0]); - out[0] = wrap_shared_ptr(SharedPoint3(new Point3(Point3::StaticFunctionRet(z))),"Point3", false); + out[0] = wrap_shared_ptr(SharedPoint3(new Point3(Point3::StaticFunctionRet(z))),"Point3", false); } void Point3_staticFunction_16(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { typedef boost::shared_ptr Shared; checkArguments("Point3.staticFunction",nargout,nargin,0); - out[0] = wrap< double >(Point3::staticFunction()); + out[0] = wrap< double >(Point3::staticFunction()); } void Test_collectorInsertAndMakeBase_17(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -299,8 +299,9 @@ void Test_create_MixedPtrs_22(int nargout, mxArray *out[], int nargin, const mxA typedef boost::shared_ptr Shared; checkArguments("create_MixedPtrs",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); - out[0] = wrap_shared_ptr(SharedTest(new Test(obj->create_MixedPtrs().first)),"Test", false); - out[0] = wrap_shared_ptr(obj->create_MixedPtrs().second,"Test", false); + pair< Test, SharedTest > pairResult = obj->create_MixedPtrs(); + out[0] = wrap_shared_ptr(SharedTest(new Test(pairResult.first)),"Test", false); + out[1] = wrap_shared_ptr(pairResult.second,"Test", false); } void Test_create_ptrs_23(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -310,8 +311,9 @@ void Test_create_ptrs_23(int nargout, mxArray *out[], int nargin, const mxArray typedef boost::shared_ptr Shared; checkArguments("create_ptrs",nargout,nargin-1,0); Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); - out[0] = wrap_shared_ptr(obj->create_ptrs().first,"Test", false); - out[0] = wrap_shared_ptr(obj->create_ptrs().second,"Test", false); + pair< SharedTest, SharedTest > pairResult = obj->create_ptrs(); + out[0] = wrap_shared_ptr(pairResult.first,"Test", false); + out[1] = wrap_shared_ptr(pairResult.second,"Test", false); } void Test_print_24(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -413,8 +415,9 @@ void Test_return_pair_34(int nargout, mxArray *out[], int nargin, const mxArray Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); Vector v = unwrap< Vector >(in[1]); Matrix A = unwrap< Matrix >(in[2]); - out[0] = wrap< Vector >(obj->return_pair(v,A).first); - out[1] = wrap< Matrix >(obj->return_pair(v,A).second); + pair< Vector, Matrix > pairResult = obj->return_pair(v,A); + out[0] = wrap< Vector >(pairResult.first); + out[1] = wrap< Matrix >(pairResult.second); } void Test_return_ptrs_35(int nargout, mxArray *out[], int nargin, const mxArray *in[]) @@ -426,8 +429,9 @@ void Test_return_ptrs_35(int nargout, mxArray *out[], int nargin, const mxArray Shared obj = unwrap_shared_ptr(in[0], "ptr_Test"); boost::shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "ptr_Test"); boost::shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "ptr_Test"); - out[0] = wrap_shared_ptr(obj->return_ptrs(p1,p2).first,"Test", false); - out[0] = wrap_shared_ptr(obj->return_ptrs(p1,p2).second,"Test", false); + pair< SharedTest, SharedTest > pairResult = obj->return_ptrs(p1,p2); + out[0] = wrap_shared_ptr(pairResult.first,"Test", false); + out[1] = wrap_shared_ptr(pairResult.second,"Test", false); } void Test_return_size_t_36(int nargout, mxArray *out[], int nargin, const mxArray *in[]) diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index c75c6a388..d199e59ab 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -29,42 +29,42 @@ void _deleteAllObjects() std::streambuf *outbuf = std::cout.rdbuf(&mout); bool anyDeleted = false; - for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); + { for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); iter != collector_ns1ClassA.end(); ) { delete *iter; collector_ns1ClassA.erase(iter++); anyDeleted = true; - } - for(Collector_ns1ClassB::iterator iter = collector_ns1ClassB.begin(); + } } + { for(Collector_ns1ClassB::iterator iter = collector_ns1ClassB.begin(); iter != collector_ns1ClassB.end(); ) { delete *iter; collector_ns1ClassB.erase(iter++); anyDeleted = true; - } - for(Collector_ns2ClassA::iterator iter = collector_ns2ClassA.begin(); + } } + { for(Collector_ns2ClassA::iterator iter = collector_ns2ClassA.begin(); iter != collector_ns2ClassA.end(); ) { delete *iter; collector_ns2ClassA.erase(iter++); anyDeleted = true; - } - for(Collector_ns2ns3ClassB::iterator iter = collector_ns2ns3ClassB.begin(); + } } + { for(Collector_ns2ns3ClassB::iterator iter = collector_ns2ns3ClassB.begin(); iter != collector_ns2ns3ClassB.end(); ) { delete *iter; collector_ns2ns3ClassB.erase(iter++); anyDeleted = true; - } - for(Collector_ns2ClassC::iterator iter = collector_ns2ClassC.begin(); + } } + { for(Collector_ns2ClassC::iterator iter = collector_ns2ClassC.begin(); iter != collector_ns2ClassC.end(); ) { delete *iter; collector_ns2ClassC.erase(iter++); anyDeleted = true; - } - for(Collector_ClassD::iterator iter = collector_ClassD.begin(); + } } + { for(Collector_ClassD::iterator iter = collector_ClassD.begin(); iter != collector_ClassD.end(); ) { delete *iter; collector_ClassD.erase(iter++); anyDeleted = true; - } + } } if(anyDeleted) cout << "WARNING: Wrap modules with variables in the workspace have been reloaded due to\n" @@ -230,7 +230,7 @@ void ns2ClassA_afunction_12(int nargout, mxArray *out[], int nargin, const mxArr { typedef boost::shared_ptr Shared; checkArguments("ns2ClassA.afunction",nargout,nargin,0); - out[0] = wrap< double >(ns2::ClassA::afunction()); + out[0] = wrap< double >(ns2::ClassA::afunction()); } void ns2ns3ClassB_collectorInsertAndMakeBase_13(int nargout, mxArray *out[], int nargin, const mxArray *in[]) From 32f9ea526d052bb301d65db71d6f949f8c72bf84 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 28 Jul 2012 16:01:49 +0000 Subject: [PATCH 726/914] Removed dataset function from gtsam (moved to CitySLAM, see previous commit) --- gtsam/slam/dataset.cpp | 48 ------------------------------------------ gtsam/slam/dataset.h | 9 -------- 2 files changed, 57 deletions(-) diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index 59df1da67..29154f686 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -31,54 +31,6 @@ using namespace std; namespace gtsam { -/* ************************************************************************* */ -pair > dataset(const string& dataset, - const string& user_path) { - string path = user_path, set = dataset; - boost::optional null_model; - boost::optional identity(noiseModel::Unit::Create(3)); - boost::optional small( - noiseModel::Diagonal::Variances( - gtsam::Vector_(3, 0.0001, 0.0001, 0.0003))); - - if (path.empty()) - path = string(getenv("HOME")) + "/data"; - if (set.empty()) - set = string(getenv("DATASET")); - - if (set == "intel") - return make_pair(path + "/Intel/intel.graph", null_model); - if (set == "intel-gfs") - return make_pair(path + "/Intel/intel.gfs.graph", null_model); - if (set == "Killian-gfs") - return make_pair(path + "/Killian/Killian.gfs.graph", null_model); - if (set == "Killian") - return make_pair(path + "/Killian/Killian.graph", small); - if (set == "Killian-noised") - return make_pair(path + "/Killian/Killian-noised.graph", null_model); - if (set == "3") - return make_pair(path + "/TORO/w3-odom.graph", identity); - if (set == "100") - return make_pair(path + "/TORO/w100-odom.graph", identity); - if (set == "10K") - return make_pair(path + "/TORO/w10000-odom.graph", identity); - if (set == "10K2") - return make_pair(path + "/hogman/data/2D/w10000.graph", - noiseModel::Diagonal::Variances(gtsam::Vector_(3, 0.1, 0.1, 0.05))); - if (set == "Eiffel100") - return make_pair(path + "/TORO/w100-Eiffel.graph", identity); - if (set == "Eiffel10K") - return make_pair(path + "/TORO/w10000-Eiffel.graph", identity); - if (set == "olson") - return make_pair(path + "/Olson/olson06icra.graph", null_model); - if (set == "victoria") - return make_pair(path + "/VictoriaPark/victoria_park.graph", null_model); - if (set == "beijing") - return make_pair(path + "/Beijing/beijingData_trips.graph", null_model); - - return make_pair("unknown", null_model); -} - /* ************************************************************************* */ pair load2D( pair > dataset, diff --git a/gtsam/slam/dataset.h b/gtsam/slam/dataset.h index d3f00aae2..c881ce2bd 100644 --- a/gtsam/slam/dataset.h +++ b/gtsam/slam/dataset.h @@ -24,15 +24,6 @@ #include namespace gtsam { - /** - * Construct dataset filename from short name - * Currently has "Killian" "intel.gfs", "10K", etc... - * @param filename - * @param optional dataset, if empty will try to getenv $DATASET - * @param optional path, if empty will try to getenv $HOME - */ - std::pair > - dataset(const std::string& dataset = "", const std::string& path = ""); /** * Load TORO 2D Graph From 25ffc8adda49b837c6055dd3252f28777e920412 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 28 Jul 2012 17:04:20 +0000 Subject: [PATCH 727/914] Moved to CitySLAM --- matlab/examples/Pose2SLAMExample_graph1.m | 36 ---------------- matlab/examples/Pose2SLAMExample_graph2.m | 52 ----------------------- 2 files changed, 88 deletions(-) delete mode 100644 matlab/examples/Pose2SLAMExample_graph1.m delete mode 100644 matlab/examples/Pose2SLAMExample_graph2.m diff --git a/matlab/examples/Pose2SLAMExample_graph1.m b/matlab/examples/Pose2SLAMExample_graph1.m deleted file mode 100644 index ef8002209..000000000 --- a/matlab/examples/Pose2SLAMExample_graph1.m +++ /dev/null @@ -1,36 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 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 -% -% @brief Read graph from file and perform GraphSLAM -% @author Frank Dellaert -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Initialize graph, initial estimate, and odometry noise -import gtsam.* -model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 1*pi/180]); -maxID=0; -addNoise=false; -smart=true; -[graph,initial]=load2D('Data/w10000-odom.graph',model,maxID,addNoise,smart); - -%% Add a Gaussian prior on pose x_1 -priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); -graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph - -%% Plot Initial Estimate -figure(1);clf -P=initial.poses; -plot(P(:,1),P(:,2),'r-'); axis equal - -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -tic -result = graph.optimize(initial,1); -toc -P=result.poses; -hold on; plot(P(:,1),P(:,2),'b-') diff --git a/matlab/examples/Pose2SLAMExample_graph2.m b/matlab/examples/Pose2SLAMExample_graph2.m deleted file mode 100644 index 0eb0dc31d..000000000 --- a/matlab/examples/Pose2SLAMExample_graph2.m +++ /dev/null @@ -1,52 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 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 -% -% @brief Read graph from file and perform GraphSLAM -% @author Frank Dellaert -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -import gtsam.* -maxID=0; -addNoise=false; -smart=true; -priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); - -%% Create graph, disregarding translation measurements by setting sigma high -model = noiseModel.Diagonal.Sigmas([100000; 100000; 1*pi/180]); -[graph,initial]=load2D('Data/w10000-odom.graph',model,maxID,addNoise,smart); - -%% Add a Gaussian prior on pose x_1 -graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph - -%% Plot Initial Estimate -figure(1);clf -P=initial.poses; -plot(P(:,1),P(:,2),'r-'); axis equal - -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -tic -result1 = graph.optimize(initial,1); -toc -P=result1.poses; -hold on; plot(P(:,1),P(:,2),'g-') - -%% Read again, with correct noise now... -model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 1*pi/180]); -graph=load2D('Data/w10000-odom.graph',model,maxID,addNoise,smart); - -%% Add a Gaussian prior on pose x_1 -graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph - -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -tic -result2 = graph.optimize(result1,1); -toc -P=result2.poses; -hold on; plot(P(:,1),P(:,2),'b-') - From 08c72e2a8dc7888e8d8c3e4aa68f2dfbc80276b0 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 30 Jul 2012 14:59:18 +0000 Subject: [PATCH 728/914] Updated Pose2SLAMExample_graph to remove SLAM namespaces --- examples/Pose2SLAMExample_graph.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/examples/Pose2SLAMExample_graph.cpp b/examples/Pose2SLAMExample_graph.cpp index d27e184d8..cc873eb08 100644 --- a/examples/Pose2SLAMExample_graph.cpp +++ b/examples/Pose2SLAMExample_graph.cpp @@ -17,32 +17,35 @@ */ #include -#include +#include #include +#include +#include +#include +#include #include #include using namespace std; using namespace gtsam; -using namespace gtsam::noiseModel; int main(int argc, char** argv) { // Read File and create graph and initial estimate // we are in build/examples, data is in examples/Data - pose2SLAM::Graph::shared_ptr graph ; - pose2SLAM::Values::shared_ptr initial; - SharedDiagonal model = Diagonal::Sigmas(Vector_(3, 0.05, 0.05, 5.0*M_PI/180.0)); + NonlinearFactorGraph::shared_ptr graph ; + Values::shared_ptr initial; + SharedDiagonal model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.05, 0.05, 5.0*M_PI/180.0)); boost::tie(graph,initial) = load2D("../../examples/Data/w100-odom.graph",model); initial->print("Initial estimate:\n"); // Add a Gaussian prior on first poses Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin - SharedDiagonal priorNoise = Diagonal::Sigmas(Vector_(3, 0.01, 0.01, 0.01)); - graph->addPosePrior(0, priorMean, priorNoise); + SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.01, 0.01, 0.01)); + graph->add(PriorFactor(0, priorMean, priorNoise)); // Single Step Optimization using Levenberg-Marquardt - pose2SLAM::Values result = graph->optimize(*initial); + Values result = LevenbergMarquardtOptimizer(*graph, *initial).optimize(); result.print("\nFinal result:\n"); // Plot the covariance of the last pose From 4cf6f104581e651982901b2e04e0770d23a637af Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 30 Jul 2012 15:34:18 +0000 Subject: [PATCH 729/914] Removed SLAM namespace from testAntiFactor --- gtsam/slam/tests/testAntiFactor.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gtsam/slam/tests/testAntiFactor.cpp b/gtsam/slam/tests/testAntiFactor.cpp index d99313767..0dd576aed 100644 --- a/gtsam/slam/tests/testAntiFactor.cpp +++ b/gtsam/slam/tests/testAntiFactor.cpp @@ -17,10 +17,12 @@ #include -#include #include -#include +#include +#include #include +#include +#include #include #include @@ -95,12 +97,12 @@ TEST( AntiFactor, EquivalentBayesNet) Pose3 z(Rot3(), Point3(1, 1, 1)); SharedNoiseModel sigma(noiseModel::Unit::Create(Pose3::Dim())); - boost::shared_ptr graph(new pose3SLAM::Graph()); - graph->addPosePrior(1, pose1, sigma); - graph->addRelativePose(1, 2, pose1.between(pose2), sigma); + NonlinearFactorGraph::shared_ptr graph(new NonlinearFactorGraph()); + graph->add(PriorFactor(1, pose1, sigma)); + graph->add(BetweenFactor(1, 2, pose1.between(pose2), sigma)); // Create a configuration corresponding to the ground truth - boost::shared_ptr values(new Values()); + Values::shared_ptr values(new Values()); values->insert(1, pose1); values->insert(2, pose2); From c49a2e5933686f21743d79382bac4be5e591b401 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 30 Jul 2012 15:34:42 +0000 Subject: [PATCH 730/914] Removed SLAM namespaces from testProjectionFactor --- gtsam/slam/tests/testProjectionFactor.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gtsam/slam/tests/testProjectionFactor.cpp b/gtsam/slam/tests/testProjectionFactor.cpp index ac9a6891d..1bda97951 100644 --- a/gtsam/slam/tests/testProjectionFactor.cpp +++ b/gtsam/slam/tests/testProjectionFactor.cpp @@ -16,9 +16,13 @@ * @date Nov 2009 */ -#include +#include +#include +#include #include #include +#include +#include #include using namespace std; @@ -80,7 +84,7 @@ TEST( ProjectionFactor, error ) CHECK(assert_equal(expected,*actual,1e-3)); // linearize graph - visualSLAM::Graph graph; + NonlinearFactorGraph graph; graph.push_back(factor); FactorGraph expected_lfg; expected_lfg.push_back(actual); From 094d3952381941a6c6980321daa3e8244bb64f20 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 30 Jul 2012 15:35:19 +0000 Subject: [PATCH 731/914] Removed SLAM namespaces from testStereoFactor --- gtsam/slam/StereoFactor.h | 1 + gtsam/slam/tests/testStereoFactor.cpp | 20 +++++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/gtsam/slam/StereoFactor.h b/gtsam/slam/StereoFactor.h index 5be783aaf..94af6e10e 100644 --- a/gtsam/slam/StereoFactor.h +++ b/gtsam/slam/StereoFactor.h @@ -18,6 +18,7 @@ #pragma once +#include #include namespace gtsam { diff --git a/gtsam/slam/tests/testStereoFactor.cpp b/gtsam/slam/tests/testStereoFactor.cpp index b38dae990..f6a861354 100644 --- a/gtsam/slam/tests/testStereoFactor.cpp +++ b/gtsam/slam/tests/testStereoFactor.cpp @@ -15,13 +15,16 @@ * @author Chris Beall */ -#include #include -#include +#include #include +#include +#include #include #include +#include #include +#include #include @@ -35,8 +38,7 @@ static Pose3 camera1(Matrix_(3,3, ), Point3(0,0,6.25)); -static Cal3_S2Stereo::shared_ptr K(new Cal3_S2Stereo(1500, 1500, 0, 320, 240, 0.5)); -static StereoCamera stereoCam(Pose3(), K); +static boost::shared_ptr K(new Cal3_S2Stereo(625, 625, 0, 320, 240, 0.5)); // point X Y Z in meters static Point3 p(0, 0, 5); @@ -46,20 +48,16 @@ static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); using symbol_shorthand::X; using symbol_shorthand::L; -typedef GenericStereoFactor MyStereoFactor; - /* ************************************************************************* */ TEST( StereoFactor, singlePoint) { - //Cal3_S2 K(625, 625, 0, 320, 240, 0.5); - boost::shared_ptr K(new Cal3_S2Stereo(625, 625, 0, 320, 240, 0.5)); NonlinearFactorGraph graph; - graph.add(NonlinearEquality(X(1),camera1)); + graph.add(NonlinearEquality(X(1), camera1)); - StereoPoint2 z14(320,320.0-50, 240); + StereoPoint2 z14(320, 320.0-50, 240); // arguments: measurement, sigma, cam#, measurement #, K, baseline (m) - graph.add(MyStereoFactor(z14,sigma, X(1), L(1), K)); + graph.add(GenericStereoFactor(z14, sigma, X(1), L(1), K)); // Create a configuration corresponding to the ground truth Values values; From 15cfa7e70239045f3fafa7078d47b0b990c431d1 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 30 Jul 2012 15:38:58 +0000 Subject: [PATCH 732/914] Remove namespace files --- gtsam/slam/planarSLAM.cpp | 63 --- gtsam/slam/planarSLAM.h | 122 ------ gtsam/slam/pose2SLAM.cpp | 66 --- gtsam/slam/pose2SLAM.h | 107 ----- gtsam/slam/pose3SLAM.cpp | 73 ---- gtsam/slam/pose3SLAM.h | 120 ------ gtsam/slam/sparseBA.cpp | 60 --- gtsam/slam/sparseBA.h | 143 ------- gtsam/slam/tests/testPlanarSLAM.cpp | 218 ---------- gtsam/slam/tests/testPose2SLAM.cpp | 608 ---------------------------- gtsam/slam/tests/testPose3SLAM.cpp | 211 ---------- gtsam/slam/tests/testSparseBA.cpp | 193 --------- gtsam/slam/tests/testVisualSLAM.cpp | 344 ---------------- gtsam/slam/visualSLAM.cpp | 116 ------ gtsam/slam/visualSLAM.h | 186 --------- 15 files changed, 2630 deletions(-) delete mode 100644 gtsam/slam/planarSLAM.cpp delete mode 100644 gtsam/slam/planarSLAM.h delete mode 100644 gtsam/slam/pose2SLAM.cpp delete mode 100644 gtsam/slam/pose2SLAM.h delete mode 100644 gtsam/slam/pose3SLAM.cpp delete mode 100644 gtsam/slam/pose3SLAM.h delete mode 100644 gtsam/slam/sparseBA.cpp delete mode 100644 gtsam/slam/sparseBA.h delete mode 100644 gtsam/slam/tests/testPlanarSLAM.cpp delete mode 100644 gtsam/slam/tests/testPose2SLAM.cpp delete mode 100644 gtsam/slam/tests/testPose3SLAM.cpp delete mode 100644 gtsam/slam/tests/testSparseBA.cpp delete mode 100644 gtsam/slam/tests/testVisualSLAM.cpp delete mode 100644 gtsam/slam/visualSLAM.cpp delete mode 100644 gtsam/slam/visualSLAM.h diff --git a/gtsam/slam/planarSLAM.cpp b/gtsam/slam/planarSLAM.cpp deleted file mode 100644 index 20c149b66..000000000 --- a/gtsam/slam/planarSLAM.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 planarSLAM.cpp - * @brief: bearing/range measurements in 2D plane - * @author Frank Dellaert - **/ - -#include -#include - -// Use planarSLAM namespace for specific SLAM instance -namespace planarSLAM { - - /* ************************************************************************* */ - Matrix Values::points() const { - size_t j=0; - ConstFiltered points = filter(); - Matrix result(points.size(),2); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, points) - result.row(j++) = keyValue.value.vector(); - return result; - } - - /* ************************************************************************* */ - void Graph::addPointConstraint(Key pointKey, const Point2& p) { - push_back(boost::make_shared >(pointKey, p)); - } - - /* ************************************************************************* */ - void Graph::addPointPrior(Key pointKey, const Point2& p, const SharedNoiseModel& model) { - push_back(boost::make_shared >(pointKey, p, model)); - } - - /* ************************************************************************* */ - void Graph::addBearing(Key i, Key j, const Rot2& z, const SharedNoiseModel& model) { - push_back(boost::make_shared >(i, j, z, model)); - } - - /* ************************************************************************* */ - void Graph::addRange(Key i, Key j, double z, const SharedNoiseModel& model) { - push_back(boost::make_shared >(i, j, z, model)); - } - - /* ************************************************************************* */ - void Graph::addBearingRange(Key i, Key j, const Rot2& z1, - double z2, const SharedNoiseModel& model) { - push_back(boost::make_shared >(i, j, z1, z2, model)); - } - - /* ************************************************************************* */ - -} // planarSLAM - diff --git a/gtsam/slam/planarSLAM.h b/gtsam/slam/planarSLAM.h deleted file mode 100644 index 967d91581..000000000 --- a/gtsam/slam/planarSLAM.h +++ /dev/null @@ -1,122 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 planarSLAM.h - * @brief bearing/range measurements in 2D plane - * @author Frank Dellaert - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -// Use planarSLAM namespace for specific SLAM instance -namespace planarSLAM { - - using namespace gtsam; - - /* - * Values class, inherited from pose2SLAM::Values, mainly used as a convenience for MATLAB wrapper - * @addtogroup SLAM - */ - struct Values: public pose2SLAM::Values { - - typedef boost::shared_ptr shared_ptr; - typedef gtsam::Values::ConstFiltered PoseFiltered; - typedef gtsam::Values::ConstFiltered PointFiltered; - - /// Default constructor - Values() {} - - /// Copy constructor - Values(const gtsam::Values& values) : - pose2SLAM::Values(values) { - } - - /// Constructor from filtered values view of poses - Values(const PoseFiltered& view) : pose2SLAM::Values(view) {} - - /// Constructor from filtered values view of points - Values(const PointFiltered& view) : pose2SLAM::Values(view) {} - - PoseFiltered allPoses() const { return this->filter(); } ///< pose view - size_t nrPoses() const { return allPoses().size(); } ///< get number of poses - KeyList poseKeys() const { return allPoses().keys(); } ///< get keys to poses only - - PointFiltered allPoints() const { return this->filter(); } ///< point view - size_t nrPoints() const { return allPoints().size(); } ///< get number of points - KeyList pointKeys() const { return allPoints().keys(); } ///< get keys to points only - - /// insert a point - void insertPoint(Key j, const Point2& point) { insert(j, point); } - - /// update a point - void updatePoint(Key j, const Point2& point) { update(j, point); } - - /// get a point - Point2 point(Key j) const { return at(j); } - - /// get all [x,y] coordinates in a 2*n matrix - Matrix points() const; -}; - - /** - * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper - * @addtogroup SLAM - */ - struct Graph: public pose2SLAM::Graph { - - /// Default constructor - Graph(){} - - /// Copy constructor given any other NonlinearFactorGraph - Graph(const NonlinearFactorGraph& graph): - pose2SLAM::Graph(graph) {} - - /// Creates a hard constraint on a point - void addPointConstraint(Key j, const Point2& p); - - /// Adds a prior with mean p and given noise model on point j - void addPointPrior(Key j, const Point2& p, const SharedNoiseModel& model); - - /// Creates a bearing measurement from pose i to point j - void addBearing(Key i, Key j, const Rot2& bearing, const SharedNoiseModel& model); - - /// Creates a range measurement from pose i to point j - void addRange(Key i, Key k, double range, const SharedNoiseModel& model); - - /// Creates a range/bearing measurement from pose i to point j - void addBearingRange(Key i, Key j, const Rot2& bearing, double range, const SharedNoiseModel& model); - }; - -} // planarSLAM - - -/** - * Backwards compatibility and wrap use only, avoid using - */ -namespace planarSLAM { - typedef gtsam::NonlinearEquality Constraint; ///< \deprecated typedef for backwards compatibility - typedef gtsam::PriorFactor Prior; ///< \deprecated typedef for backwards compatibility - typedef gtsam::BetweenFactor Odometry; ///< \deprecated typedef for backwards compatibility - typedef gtsam::BearingFactor Bearing; ///< \deprecated typedef for backwards compatibility - typedef gtsam::RangeFactor Range; ///< \deprecated typedef for backwards compatibility - typedef gtsam::BearingRangeFactor BearingRange; ///< \deprecated typedef for backwards compatibility -} - - diff --git a/gtsam/slam/pose2SLAM.cpp b/gtsam/slam/pose2SLAM.cpp deleted file mode 100644 index cc549d84a..000000000 --- a/gtsam/slam/pose2SLAM.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 pose2SLAM.cpp - * @brief: Odometry measurements in 2D plane - * @author Frank Dellaert - **/ - -#include - -// Use pose2SLAM namespace for specific SLAM instance - -namespace pose2SLAM { - - /* ************************************************************************* */ - Values Values::Circle(size_t n, double R) { - Values x; - double theta = 0, dtheta = 2 * M_PI / n; - for (size_t i = 0; i < n; i++, theta += dtheta) - x.insert(i, Pose2(cos(theta), sin(theta), M_PI_2 + theta)); - return x; - } - - /* ************************************************************************* */ - Matrix Values::poses() const { - size_t j=0; - ConstFiltered poses = filter(); - Matrix result(poses.size(),3); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) { - const Pose2& r = keyValue.value; - result.row(j++) = Matrix_(1,3, r.x(), r.y(), r.theta()); - } - return result; - } - - /* ************************************************************************* */ - void Graph::addPoseConstraint(Key i, const Pose2& p) { - sharedFactor factor(new NonlinearEquality(i, p)); - push_back(factor); - } - - /* ************************************************************************* */ - void Graph::addPosePrior(Key i, const Pose2& p, const SharedNoiseModel& model) { - sharedFactor factor(new PriorFactor(i, p, model)); - push_back(factor); - } - - /* ************************************************************************* */ - void Graph::addRelativePose(Key i1, Key i2, const Pose2& z, - const SharedNoiseModel& model) { - sharedFactor factor(new BetweenFactor(i1, i2, z, model)); - push_back(factor); - } - - /* ************************************************************************* */ - -} // pose2SLAM diff --git a/gtsam/slam/pose2SLAM.h b/gtsam/slam/pose2SLAM.h deleted file mode 100644 index 018090c6a..000000000 --- a/gtsam/slam/pose2SLAM.h +++ /dev/null @@ -1,107 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 pose2SLAM.h - * @brief: 2D Pose SLAM - * @author Frank Dellaert - **/ - -#pragma once - -#include -#include -#include -#include -#include - -// Use pose2SLAM namespace for specific SLAM instance -namespace pose2SLAM { - - using namespace gtsam; - - /* - * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - * @addtogroup SLAM - */ - struct Values: public gtsam::Values { - - typedef boost::shared_ptr shared_ptr; - - /// Default constructor - Values() {} - - /// Copy constructor - Values(const gtsam::Values& values) : - gtsam::Values(values) { - } - - /** - * Create a circle of n 2D poses tangent to circle of radius R, first pose at (R,0) - * @param n number of poses - * @param R radius of circle - * @param c character to use for keys - * @return circle of n 2D poses - */ - static Values Circle(size_t n, double R); - - /// insert a pose - void insertPose(Key i, const Pose2& pose) { insert(i, pose); } - - /// update a pose - void updatePose(Key i, const Pose2& pose) { update(i, pose); } - - /// get a pose - Pose2 pose(Key i) const { return at(i); } - - /// get all [x,y,theta] coordinates in a 3*m matrix - Matrix poses() const; - }; - - /** - * List of typedefs for factors - */ - - /** - * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper - * @addtogroup SLAM - */ - struct Graph: public EasyFactorGraph { - - typedef boost::shared_ptr shared_ptr; - - /// Default constructor - Graph(){} - - /// Copy constructor given any other NonlinearFactorGraph - Graph(const NonlinearFactorGraph& graph): - EasyFactorGraph(graph) {} - - /// Creates a hard constraint for key i with the given Pose2 p. - void addPoseConstraint(Key i, const Pose2& p); - - /// Adds a Pose2 prior with mean p and given noise model on pose i - void addPosePrior(Key i, const Pose2& p, const SharedNoiseModel& model); - - /// Creates an relative pose factor between poses with keys i1 and i2 - void addRelativePose(Key i1, Key i2, const Pose2& z, const SharedNoiseModel& model); - }; - -} // pose2SLAM - -/** - * Backwards compatibility and wrap use only, avoid using - */ -namespace pose2SLAM { - typedef gtsam::NonlinearEquality HardConstraint; ///< \deprecated typedef for backwards compatibility - typedef gtsam::PriorFactor Prior; ///< \deprecated typedef for backwards compatibility - typedef gtsam::BetweenFactor Odometry; ///< \deprecated typedef for backwards compatibility -} diff --git a/gtsam/slam/pose3SLAM.cpp b/gtsam/slam/pose3SLAM.cpp deleted file mode 100644 index 07a89e419..000000000 --- a/gtsam/slam/pose3SLAM.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 pose3SLAM.cpp - * @brief: bearing/range measurements in 2D plane - * @author Frank Dellaert - **/ - -#include -#include - -// Use pose3SLAM namespace for specific SLAM instance -namespace pose3SLAM { - - /* ************************************************************************* */ - Values Values::Circle(size_t n, double radius) { - Values x; - double theta = 0, dtheta = 2 * M_PI / n; - // We use aerospace/navlab convention, X forward, Y right, Z down - // First pose will be at (R,0,0) - // ^y ^ X - // | | - // z-->xZ--> Y (z pointing towards viewer, Z pointing away from viewer) - // Vehicle at p0 is looking towards y axis (X-axis points towards world y) - Rot3 gR0(Point3(0, 1, 0), Point3(1, 0, 0), Point3(0, 0, -1)); - for (size_t i = 0; i < n; i++, theta += dtheta) { - Point3 gti(radius*cos(theta), radius*sin(theta), 0); - Rot3 _0Ri = Rot3::yaw(-theta); // negative yaw goes counterclockwise, with Z down ! - Pose3 gTi(gR0 * _0Ri, gti); - x.insert(i, gTi); - } - return x; - } - - /* ************************************************************************* */ - Matrix Values::translations() const { - size_t j=0; - ConstFiltered poses = filter(); - Matrix result(poses.size(),3); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, poses) - result.row(j++) = keyValue.value.translation().vector(); - return result; - } - - /* ************************************************************************* */ - void Graph::addPoseConstraint(Key i, const Pose3& p) { - sharedFactor factor(new NonlinearEquality(i, p)); - push_back(factor); - } - - /* ************************************************************************* */ - void Graph::addPosePrior(Key i, const Pose3& p, const SharedNoiseModel& model) { - sharedFactor factor(new PriorFactor(i, p, model)); - push_back(factor); - } - - /* ************************************************************************* */ - void Graph::addRelativePose(Key i1, Key i2, const Pose3& z, const SharedNoiseModel& model) { - push_back(boost::make_shared >(i1, i2, z, model)); - } - - /* ************************************************************************* */ - -} // pose3SLAM diff --git a/gtsam/slam/pose3SLAM.h b/gtsam/slam/pose3SLAM.h deleted file mode 100644 index 20ea8b0d5..000000000 --- a/gtsam/slam/pose3SLAM.h +++ /dev/null @@ -1,120 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 pose3SLAM.h - * @brief: 3D Pose SLAM - * @author Frank Dellaert - **/ - -#pragma once - -#include -#include -#include -#include -#include - -/// Use pose3SLAM namespace for specific SLAM instance -namespace pose3SLAM { - - using namespace gtsam; - - /* - * Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - * @addtogroup SLAM - */ - struct Values: public gtsam::Values { - - typedef boost::shared_ptr shared_ptr; - - /// Default constructor - Values() {} - - /// Copy constructor - Values(const gtsam::Values& values) : - gtsam::Values(values) { - } - - /** - * Create a circle of n 3D poses tangent to circle of radius R, first pose at (R,0) - * @param n number of poses - * @param R radius of circle - * @return circle of n 3D poses - */ - static Values Circle(size_t n, double R); - - /// insert a pose - void insertPose(Key i, const Pose3& pose) { insert(i, pose); } - - /// update a pose - void updatePose(Key i, const Pose3& pose) { update(i, pose); } - - /// get a pose - Pose3 pose(Key i) const { return at(i); } - - Matrix translations() const; ///< get all pose translations coordinates in a matrix - }; - - /** - * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper - * @addtogroup SLAM - */ - struct Graph: public EasyFactorGraph { - - /// Default constructor - Graph(){} - - /// Copy constructor given any other NonlinearFactorGraph - Graph(const NonlinearFactorGraph& graph): - EasyFactorGraph(graph) {} - - /** - * Add a prior on a pose - * @param key variable key of the camera pose - * @param p around which soft prior is defined - * @param model uncertainty model of this prior - */ - void addPosePrior(Key poseKey, const Pose3& p = Pose3(), const SharedNoiseModel& model = noiseModel::Unit::Create(6)); - - /** - * Add a constraint on a pose (for now, *must* be satisfied in any Values) - * @param key variable key of the camera pose - * @param p to which pose to constrain it to - */ - void addPoseConstraint(Key poseKey, const Pose3& p = Pose3()); - - /** - * Add a relative pose measurement between two poses - * @param x1 variable key of the first camera pose - * @param x2 variable key of the second camera pose - * @param relative pose measurement from x1 to x2 (x1.between(x2)) - * @param model uncertainty model of this measurement - */ - void addRelativePose(Key x1, Key x2, const Pose3& z, const SharedNoiseModel& model); - }; - -} // pose3SLAM - -/** - * Backwards compatibility and wrap use only, avoid using - */ -namespace pose3SLAM { - typedef gtsam::PriorFactor Prior; ///< \deprecated typedef for backwards compatibility - typedef gtsam::BetweenFactor Constraint; ///< \deprecated typedef for backwards compatibility - typedef gtsam::NonlinearEquality HardConstraint; ///< \deprecated typedef for backwards compatibility -} -namespace gtsam { - typedef pose3SLAM::Prior Pose3Prior; ///< \deprecated typedef for backwards compatibility - typedef pose3SLAM::Constraint Pose3Factor; ///< \deprecated typedef for backwards compatibility - typedef pose3SLAM::Graph Pose3Graph; ///< \deprecated typedef for backwards compatibility -} - diff --git a/gtsam/slam/sparseBA.cpp b/gtsam/slam/sparseBA.cpp deleted file mode 100644 index 0ff4e1c64..000000000 --- a/gtsam/slam/sparseBA.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file sparseBA.cpp - * @brief - * @date Jul 6, 2012 - * @author Yong-Dian Jian - */ - -#include - -namespace sparseBA { - -/* ************************************************************************* */ -void Graph::addSimpleCameraConstraint(Key cameraKey, const SimpleCamera &camera) { - addCameraConstraint(cameraKey, camera); -} - -/* ************************************************************************* */ -void Graph::addSimpleCameraPrior(Key cameraKey, const SimpleCamera &camera, SharedNoiseModel &model) { - addCameraPrior(cameraKey, camera, model); -} - -/* ************************************************************************* */ -void Graph::addSimpleCameraMeasurement(const Point2 &z, SharedNoiseModel& model, Index cameraKey, Index pointKey) { - addMeasurement(z, model, cameraKey, pointKey); -} - -/* ************************************************************************* */ -Matrix Graph::reprojectionErrors(const Values& values) const { - - // TODO: support the other calibration objects. Now it only works for Cal3_S2. - - typedef GeneralSFMFactor SFMFactor; - typedef GeneralSFMFactor2 SFMFactor2; - - // first count - size_t K = 0, k=0; - BOOST_FOREACH(const sharedFactor& f, *this) - if (boost::dynamic_pointer_cast(f)) ++K; - else if (boost::dynamic_pointer_cast(f)) ++K; - - // now fill - Matrix errors(2,K); - BOOST_FOREACH(const sharedFactor& f, *this) { - boost::shared_ptr p = boost::dynamic_pointer_cast(f); - if (p) { - errors.col(k++) = p->unwhitenedError(values); - continue; - } - - boost::shared_ptr p2 = boost::dynamic_pointer_cast(f); - if (p2) { - errors.col(k++) = p2->unwhitenedError(values); - } - } - return errors; -} -/* ************************************************************************* */ -} - - diff --git a/gtsam/slam/sparseBA.h b/gtsam/slam/sparseBA.h deleted file mode 100644 index 07aaa5817..000000000 --- a/gtsam/slam/sparseBA.h +++ /dev/null @@ -1,143 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 sba.h - * @brief a suite for sparse bundle adjustment - * @date Jul 5, 2012 - * @author ydjian - */ - -#pragma once - -#include -#include -#include - -namespace sparseBA { - - using namespace gtsam; - - /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - struct Values: public visualSLAM::Values { - - typedef boost::shared_ptr shared_ptr; - typedef gtsam::Values::ConstFiltered SimpleCameraFiltered; - typedef gtsam::Values::ConstFiltered Cal3_S2Filtered; - - /// Default constructor - Values() {} - - /// Copy constructor - Values(const gtsam::Values& values) : visualSLAM::Values(values) {} - - /// Constructor from filtered values view of poses - Values(const SimpleCameraFiltered& view) : visualSLAM::Values(view) {} - - /// Constructor from filtered values view of points - Values(const PointFiltered& view) : visualSLAM::Values(view) {} - - SimpleCameraFiltered allSimpleCameras() const { return this->filter(); } ///< camera view - size_t nrSimpleCameras() const { return allSimpleCameras().size(); } ///< get number of poses - KeyList simpleCameraKeys() const { return allSimpleCameras().keys(); } ///< get keys to poses only - - /// insert a camera - void insertSimpleCamera(Key j, const SimpleCamera& camera) { insert(j, camera); } - - /// update a camera - void updateSimpleCamera(Key j, const SimpleCamera& camera) { update(j, camera); } - - /// get a camera - SimpleCamera simpleCamera(Key j) const { return at(j); } - }; - - /** - * Graph class, inherited from NonlinearFactorGraph, used as a convenience for MATLAB wrapper - * @addtogroup SLAM - */ - struct Graph: public visualSLAM::Graph { - - /// Default constructor - Graph(){} - - /// Copy constructor given any other NonlinearFactorGraph - Graph(const NonlinearFactorGraph& graph): visualSLAM::Graph(graph) {} - - /// check if two graphs are equal - bool equals(const Graph& p, double tol = 1e-9) const { - return NonlinearFactorGraph::equals(p, tol); - } - - /** - * Add a prior on a pose - * @param key variable key of the camera - * @param p around which soft prior is defined - * @param model uncertainty model of this prior - */ - template - void addCameraPrior(Key cameraKey, const Camera &camera, SharedNoiseModel &model = noiseModel::Unit::Create(Camera::Dim())) { - sharedFactor factor(new PriorFactor(cameraKey, camera, model)); - push_back(factor); - } - - /** - * Add a constraint on a camera - * @param key variable key of the camera - * @param p to which camera to constrain it to - */ - template - void addCameraConstraint(Key cameraKey, const Camera &camera) { - sharedFactor factor(new NonlinearEquality(cameraKey, camera)); - push_back(factor); - } - - /** - * Add a 2d projection measurement - * @param z the measurement - * @param model the noise model for the measurement - * @param cameraKey variable key for the pose+calibration - * @param pointKey variable key for the point - */ - template - void addMeasurement(const Point2 &z, const SharedNoiseModel& model, const Index cameraKey, const Index pointKey) { - typedef GeneralSFMFactor SFMFactor; - boost::shared_ptr factor(new SFMFactor(z, model, cameraKey, pointKey)); - push_back(factor); - } - - /** - * Add a 2d projection measurement, but supports separated (or shared) pose and calibration object - * @param z the measurement - * @param model the noise model for the measurement - * @param poseKey variable key for the pose - * @param pointKey variable key for the point - * @param calibKey variable key for the calibration - */ - template - void addMeasurement(const Point2 &z, const SharedNoiseModel& model, const Index posekey, const Index pointkey, const Index calibkey) { - typedef GeneralSFMFactor2 SFMFactor; - boost::shared_ptr factor(new SFMFactor(z, model, posekey, pointkey, calibkey)); - push_back(factor); - } - - /// Return a 2*K Matrix of reprojection errors - Matrix reprojectionErrors(const Values& values) const; - - /** - * Matlab-specific wrappers - */ - - void addSimpleCameraPrior(Key cameraKey, const SimpleCamera &camera, SharedNoiseModel &model); - void addSimpleCameraConstraint(Key cameraKey, const SimpleCamera &camera) ; - void addSimpleCameraMeasurement(const Point2 &z, SharedNoiseModel& model, Index cameraKey, Index pointKey); - }; - -} diff --git a/gtsam/slam/tests/testPlanarSLAM.cpp b/gtsam/slam/tests/testPlanarSLAM.cpp deleted file mode 100644 index 5652b71b4..000000000 --- a/gtsam/slam/tests/testPlanarSLAM.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testPlanarSLAM.cpp - * @author Frank Dellaert - **/ - -#include -#include -#include -#include - -#include -#include - -using namespace std; -using namespace gtsam; - -// some shared test values -static Pose2 x1, x2(1, 1, 0), x3(1, 1, M_PI_4); -static Point2 l1(1, 0), l2(1, 1), l3(2, 2), l4(1, 3); -static Symbol i2('x',2), i3('x',3), j3('l',3); - -SharedNoiseModel - sigma(noiseModel::Isotropic::Sigma(1,0.1)), - sigma2(noiseModel::Isotropic::Sigma(2,0.1)), - I3(noiseModel::Unit::Create(3)); - -/* ************************************************************************* */ -TEST( planarSLAM, PriorFactor_equals ) -{ - PriorFactor factor1(i2, x1, I3), factor2(i2, x2, I3); - EXPECT(assert_equal(factor1, factor1, 1e-5)); - EXPECT(assert_equal(factor2, factor2, 1e-5)); - EXPECT(assert_inequal(factor1, factor2, 1e-5)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, BearingFactor ) -{ - // Create factor - Rot2 z = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 - BearingFactor factor(i2, j3, z, sigma); - - // create config - planarSLAM::Values c; - c.insert(i2, x2); - c.insert(j3, l3); - - // Check error - Vector actual = factor.unwhitenedError(c); - EXPECT(assert_equal(Vector_(1,-0.1),actual)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, BearingFactor_equals ) -{ - BearingFactor - factor1(i2, j3, Rot2::fromAngle(0.1), sigma), - factor2(i2, j3, Rot2::fromAngle(2.3), sigma); - EXPECT(assert_equal(factor1, factor1, 1e-5)); - EXPECT(assert_equal(factor2, factor2, 1e-5)); - EXPECT(assert_inequal(factor1, factor2, 1e-5)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, RangeFactor ) -{ - // Create factor - double z(sqrt(2.0) - 0.22); // h(x) - z = 0.22 - RangeFactor factor(i2, j3, z, sigma); - - // create config - planarSLAM::Values c; - c.insert(i2, x2); - c.insert(j3, l3); - - // Check error - Vector actual = factor.unwhitenedError(c); - EXPECT(assert_equal(Vector_(1,0.22),actual)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, RangeFactor_equals ) -{ - RangeFactor factor1(i2, j3, 1.2, sigma), factor2(i2, j3, 7.2, sigma); - EXPECT(assert_equal(factor1, factor1, 1e-5)); - EXPECT(assert_equal(factor2, factor2, 1e-5)); - EXPECT(assert_inequal(factor1, factor2, 1e-5)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, BearingRangeFactor ) -{ - // Create factor - Rot2 r = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 - double b(sqrt(2.0) - 0.22); // h(x) - z = 0.22 - BearingRangeFactor factor(i2, j3, r, b, sigma2); - - // create config - planarSLAM::Values c; - c.insert(i2, x2); - c.insert(j3, l3); - - // Check error - Vector actual = factor.unwhitenedError(c); - EXPECT(assert_equal(Vector_(2,-0.1, 0.22),actual)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, BearingRangeFactor_equals ) -{ - BearingRangeFactor - factor1(i2, j3, Rot2::fromAngle(0.1), 7.3, sigma2), - factor2(i2, j3, Rot2::fromAngle(3), 2.0, sigma2); - EXPECT(assert_equal(factor1, factor1, 1e-5)); - EXPECT(assert_equal(factor2, factor2, 1e-5)); - EXPECT(assert_inequal(factor1, factor2, 1e-5)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, BearingRangeFactor_poses ) -{ - typedef BearingRangeFactor PoseBearingRange; - PoseBearingRange actual(2, 3, Rot2::fromDegrees(60.0), 12.3, sigma2); -} - -/* ************************************************************************* */ -TEST( planarSLAM, PoseConstraint_equals ) -{ - NonlinearEquality factor1(i2, x2), factor2(i2, x3); - EXPECT(assert_equal(factor1, factor1, 1e-5)); - EXPECT(assert_equal(factor2, factor2, 1e-5)); - EXPECT(assert_inequal(factor1, factor2, 1e-5)); -} - -/* ************************************************************************* */ -TEST( planarSLAM, constructor ) -{ - // create config - planarSLAM::Values c; - c.insert(i2, x2); - c.insert(i3, x3); - c.insert(j3, l3); - - // create graph - planarSLAM::Graph G; - - // Add pose constraint - G.addPoseConstraint(i2, x2); // make it feasible :-) - - // Add odometry - G.addRelativePose(i2, i3, Pose2(0, 0, M_PI_4), I3); - - // Create bearing factor - Rot2 z1 = Rot2::fromAngle(M_PI_4 + 0.1); // h(x) - z = -0.1 - G.addBearing(i2, j3, z1, sigma); - - // Create range factor - double z2(sqrt(2.0) - 0.22); // h(x) - z = 0.22 - G.addRange(i2, j3, z2, sigma); - - Vector expected0 = Vector_(3, 0.0, 0.0, 0.0); - Vector expected1 = Vector_(3, 0.0, 0.0, 0.0); - Vector expected2 = Vector_(1, -0.1); - Vector expected3 = Vector_(1, 0.22); - // Get NoiseModelFactors - EXPECT(assert_equal(expected0, boost::dynamic_pointer_cast(G[0])->unwhitenedError(c))); - EXPECT(assert_equal(expected1, boost::dynamic_pointer_cast(G[1])->unwhitenedError(c))); - EXPECT(assert_equal(expected2, boost::dynamic_pointer_cast(G[2])->unwhitenedError(c))); - EXPECT(assert_equal(expected3, boost::dynamic_pointer_cast(G[3])->unwhitenedError(c))); -} - -/* ************************************************************************* */ -TEST( planarSLAM, keys_and_view ) -{ - // create config - planarSLAM::Values c; - c.insert(i2, x2); - c.insert(i3, x3); - c.insert(j3, l3); - LONGS_EQUAL(2,c.nrPoses()); - LONGS_EQUAL(1,c.nrPoints()); - { - FastList expected, actual; - expected += j3, i2, i3; - actual = c.keys(); - CHECK(expected == actual); - } - { - FastList expected, actual; - expected += i2, i3; - actual = c.poseKeys(); - CHECK(expected == actual); - } - { - FastList expected, actual; - expected += j3; - actual = c.pointKeys(); - CHECK(expected == actual); - } -} - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ diff --git a/gtsam/slam/tests/testPose2SLAM.cpp b/gtsam/slam/tests/testPose2SLAM.cpp deleted file mode 100644 index 766d06ded..000000000 --- a/gtsam/slam/tests/testPose2SLAM.cpp +++ /dev/null @@ -1,608 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testPose2SLAM.cpp - * @author Frank Dellaert, Viorela Ila - **/ - -#include -#include -#include -#include -#include -#include -using namespace gtsam; - -#include - -#include -#include -using namespace boost; -using namespace boost::assign; - -#include -using namespace std; - -typedef BetweenFactor Pose2Factor; - -// common measurement covariance -static double sx=0.5, sy=0.5,st=0.1; -static Matrix cov(Matrix_(3, 3, - sx*sx, 0.0, 0.0, - 0.0, sy*sy, 0.0, - 0.0, 0.0, st*st - )); -static noiseModel::Gaussian::shared_ptr covariance(noiseModel::Gaussian::Covariance(cov)); - -/* ************************************************************************* */ -TEST_UNSAFE( Pose2SLAM, XYT ) -{ - pose2SLAM::Values values; - values.insertPose(1,Pose2(1,2,3)); - values.insertPose(2,Pose2(4,5,6)); - Matrix expected = Matrix_(2,3, 1.0,2.0,3.0, 4.0,5.0,6.0-2*M_PI); - EXPECT(assert_equal(expected,values.poses())); -} - -/* ************************************************************************* */ -// Test constraint, small displacement -Vector f1(const Pose2& pose1, const Pose2& pose2) { - Pose2 z(2.1130913087, 0.468461064817, 0.436332312999); - Pose2Factor constraint(1, 2, z, covariance); - return constraint.evaluateError(pose1, pose2); -} - -TEST_UNSAFE( Pose2SLAM, constraint1 ) -{ - // create a factor between unknown poses p1 and p2 - Pose2 pose1, pose2(2.1130913087, 0.468461064817, 0.436332312999); - Pose2Factor constraint(1, 2, pose2, covariance); - Matrix H1, H2; - Vector actual = constraint.evaluateError(pose1, pose2, H1, H2); - - Matrix numericalH1 = numericalDerivative21(&f1 , pose1, pose2); - EXPECT(assert_equal(numericalH1,H1,5e-3)); - - Matrix numericalH2 = numericalDerivative22(&f1 , pose1, pose2); - EXPECT(assert_equal(numericalH2,H2)); -} - -/* ************************************************************************* */ -// Test constraint, large displacement -Vector f2(const Pose2& pose1, const Pose2& pose2) { - Pose2 z(2,2,M_PI_2); - Pose2Factor constraint(1, 2, z, covariance); - return constraint.evaluateError(pose1, pose2); -} - -TEST_UNSAFE( Pose2SLAM, constraint2 ) -{ - // create a factor between unknown poses p1 and p2 - Pose2 pose1, pose2(2,2,M_PI_2); - Pose2Factor constraint(1, 2, pose2, covariance); - Matrix H1, H2; - Vector actual = constraint.evaluateError(pose1, pose2, H1, H2); - - Matrix numericalH1 = numericalDerivative21(&f2 , pose1, pose2); - EXPECT(assert_equal(numericalH1,H1,5e-3)); - - Matrix numericalH2 = numericalDerivative22(&f2 , pose1, pose2); - EXPECT(assert_equal(numericalH2,H2)); -} - -/* ************************************************************************* */ -TEST_UNSAFE( Pose2SLAM, constructor ) -{ - // create a factor between unknown poses p1 and p2 - Pose2 measured(2,2,M_PI_2); - pose2SLAM::Graph graph; - graph.addRelativePose(1,2,measured, covariance); - // get the size of the graph - size_t actual = graph.size(); - // verify - size_t expected = 1; - CHECK(actual == expected); -} - -/* ************************************************************************* */ -TEST_UNSAFE( Pose2SLAM, linearization ) -{ - // create a factor between unknown poses p1 and p2 - Pose2 measured(2,2,M_PI_2); - Pose2Factor constraint(1, 2, measured, covariance); - pose2SLAM::Graph graph; - graph.addRelativePose(1,2,measured, covariance); - - // Choose a linearization point - Pose2 p1(1.1,2,M_PI_2); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) - Pose2 p2(-1,4.1,M_PI); // robot at (-1,4) looking at negative (ground truth is at 4.1,2) - pose2SLAM::Values config; - config.insert(1,p1); - config.insert(2,p2); - // Linearize - Ordering ordering(*config.orderingArbitrary()); - boost::shared_ptr > lfg_linearized = graph.linearize(config, ordering); - //lfg_linearized->print("lfg_actual"); - - // the expected linear factor - FactorGraph lfg_expected; - Matrix A1 = Matrix_(3,3, - 0.0,-2.0, -4.2, - 2.0, 0.0, -4.2, - 0.0, 0.0,-10.0); - - Matrix A2 = Matrix_(3,3, - 2.0, 0.0, 0.0, - 0.0, 2.0, 0.0, - 0.0, 0.0, 10.0); - - Vector b = Vector_(3,-0.1/sx,0.1/sy,0.0); - SharedDiagonal probModel1 = noiseModel::Unit::Create(3); - lfg_expected.push_back(JacobianFactor::shared_ptr(new JacobianFactor(ordering[1], A1, ordering[2], A2, b, probModel1))); - - CHECK(assert_equal(lfg_expected, *lfg_linearized)); -} - -/* ************************************************************************* */ -TEST_UNSAFE(Pose2SLAM, optimize) { - - // create a Pose graph with one equality constraint and one measurement - pose2SLAM::Graph fg; - fg.addPoseConstraint(0, Pose2(0,0,0)); - fg.addRelativePose(0, 1, Pose2(1,2,M_PI_2), covariance); - - // Create initial config - Values initial; - initial.insert(0, Pose2(0,0,0)); - initial.insert(1, Pose2(0,0,0)); - - // Choose an ordering and optimize - Ordering ordering; - ordering += 0, 1; - - LevenbergMarquardtParams params; - params.relativeErrorTol = 1e-15; - params.ordering = ordering; - Values actual = LevenbergMarquardtOptimizer(fg, initial, params).optimize(); - - // Check with expected config - Values expected; - expected.insert(0, Pose2(0,0,0)); - expected.insert(1, Pose2(1,2,M_PI_2)); - CHECK(assert_equal(expected, actual)); - - // Check marginals - Marginals marginals = fg.marginals(actual); - // Matrix expectedP0 = Infinity, as we have a pose constraint !? - // Matrix actualP0 = marginals.marginalCovariance(0); - // EQUALITY(expectedP0, actualP0); - Matrix expectedP1 = cov; // the second pose really should have just the noise covariance - Matrix actualP1 = marginals.marginalCovariance(1); - EQUALITY(expectedP1, actualP1); -} - -/* ************************************************************************* */ -TEST_UNSAFE(Pose2SLAM, optimizeSPCG) { - - // create a Pose graph with one equality constraint and one measurement - pose2SLAM::Graph fg; - fg.addPosePrior(0, Pose2(0,0,0), noiseModel::Diagonal::Sigmas(Vector_(3,3.0,3.0,1.0))); - fg.addRelativePose(0, 1, Pose2(1,2,M_PI_2), covariance); - - // [Duy] For some unknown reason, SPCG needs this constraint to work. GaussNewton doesn't need this. - fg.addRelativePose(0, 1, Pose2(1,2,M_PI_2), noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1))); - - // Create initial config - Values initial; - initial.insert(0, Pose2(0,0,0)); - initial.insert(1, Pose2(0,0,0)); - - // Optimize using SPCG - Values actual = fg.optimizeSPCG(initial,0); - - // Try GaussNewton without the above constraint to see if the problem is underconstrained. Still works! - Values actual2 = GaussNewtonOptimizer(fg, initial).optimize(); - - // Check with expected config - Values expected; - expected.insert(0, Pose2(0,0,0)); - expected.insert(1, Pose2(1,2,M_PI_2)); - CHECK(assert_equal(expected, actual)); - CHECK(assert_equal(expected, actual2)); -} - -/* ************************************************************************* */ -// test optimization with 3 poses, note we use plain Keys here, not symbols -TEST_UNSAFE(Pose2SLAM, optimizeThreePoses) { - - // Create a hexagon of poses - pose2SLAM::Values hexagon = pose2SLAM::Values::Circle(3,1.0); - Pose2 p0 = hexagon.pose(0), p1 = hexagon.pose(1); - - // create a Pose graph with one equality constraint and one measurement - pose2SLAM::Graph fg; - fg.addPoseConstraint(0, p0); - Pose2 delta = p0.between(p1); - fg.addRelativePose(0, 1, delta, covariance); - fg.addRelativePose(1, 2, delta, covariance); - fg.addRelativePose(2, 0, delta, covariance); - - // Create initial config - pose2SLAM::Values initial; - initial.insertPose(0, p0); - initial.insertPose(1, hexagon.pose(1).retract(Vector_(3,-0.1, 0.1,-0.1))); - initial.insertPose(2, hexagon.pose(2).retract(Vector_(3, 0.1,-0.1, 0.1))); - - // Choose an ordering - Ordering ordering; - ordering += 0,1,2; - - // optimize - LevenbergMarquardtParams params; - params.relativeErrorTol = 1e-15; - params.ordering = ordering; - Values actual = LevenbergMarquardtOptimizer(fg, initial, params).optimize(); - - // Check with ground truth - CHECK(assert_equal((const Values&)hexagon, actual)); -} - -/* ************************************************************************* */ -// test optimization with 6 poses arranged in a hexagon and a loop closure -TEST_UNSAFE(Pose2SLAM, optimizeCircle) { - - // Create a hexagon of poses - pose2SLAM::Values hexagon = pose2SLAM::Values::Circle(6,1.0); - Pose2 p0 = hexagon.pose(0), p1 = hexagon.pose(1); - - // create a Pose graph with one equality constraint and one measurement - pose2SLAM::Graph fg; - fg.addPoseConstraint(0, p0); - Pose2 delta = p0.between(p1); - fg.addRelativePose(0,1, delta, covariance); - fg.addRelativePose(1,2, delta, covariance); - fg.addRelativePose(2,3, delta, covariance); - fg.addRelativePose(3,4, delta, covariance); - fg.addRelativePose(4,5, delta, covariance); - fg.addRelativePose(5,0, delta, covariance); - - // Create initial config - pose2SLAM::Values initial; - initial.insertPose(0, p0); - initial.insertPose(1, hexagon.pose(1).retract(Vector_(3,-0.1, 0.1,-0.1))); - initial.insertPose(2, hexagon.pose(2).retract(Vector_(3, 0.1,-0.1, 0.1))); - initial.insertPose(3, hexagon.pose(3).retract(Vector_(3,-0.1, 0.1,-0.1))); - initial.insertPose(4, hexagon.pose(4).retract(Vector_(3, 0.1,-0.1, 0.1))); - initial.insertPose(5, hexagon.pose(5).retract(Vector_(3,-0.1, 0.1,-0.1))); - - // Choose an ordering - Ordering ordering; - ordering += 0,1,2,3,4,5; - - // optimize - LevenbergMarquardtParams params; - params.relativeErrorTol = 1e-15; - params.ordering = ordering; - Values actual = LevenbergMarquardtOptimizer(fg, initial, params).optimize(); - - // Check with ground truth - CHECK(assert_equal((const Values&)hexagon, actual)); - - // Check loop closure - CHECK(assert_equal(delta, actual.at(5).between(actual.at(0)))); - -// Pose2SLAMOptimizer myOptimizer("3"); - -// Matrix A1 = myOptimizer.a1(); -// LONGS_EQUAL(3, A1.rows()); -// LONGS_EQUAL(17, A1.cols()); // 7 + 7 + 3 -// -// Matrix A2 = myOptimizer.a2(); -// LONGS_EQUAL(3, A1.rows()); -// LONGS_EQUAL(7, A2.cols()); // 7 -// -// Vector b1 = myOptimizer.b1(); -// LONGS_EQUAL(9, b1.size()); // 3 + 3 + 3 -// -// Vector b2 = myOptimizer.b2(); -// LONGS_EQUAL(3, b2.size()); // 3 -// -// // Here, call matlab to -// // A=[A1;A2], b=[b1;b2] -// // R=qr(A1) -// // call pcg on A,b, with preconditioner R -> get x -// -// Vector x = myOptimizer.optimize(); -// LONGS_EQUAL(9, x.size()); // 3 + 3 + 3 -// -// myOptimizer.update(x); -// -// Values expected; -// expected.insert(0, Pose2(0.,0.,0.)); -// expected.insert(1, Pose2(1.,0.,0.)); -// expected.insert(2, Pose2(2.,0.,0.)); -// -// // Check with ground truth -// CHECK(assert_equal(expected, *myOptimizer.theta())); -} - -/* ************************************************************************* */ -TEST_UNSAFE(Pose2SLAM, optimize2) { -// Pose2SLAMOptimizer myOptimizer("100"); -// Matrix A1 = myOptimizer.a1(); -// Matrix A2 = myOptimizer.a2(); -// cout << "A1: " << A1.rows() << " " << A1.cols() << endl; -// cout << "A2: " << A2.rows() << " " << A2.cols() << endl; -// -// //cout << "error: " << myOptimizer.error() << endl; -// for(int i = 0; i<10; i++) { -// myOptimizer.linearize(); -// Vector x = myOptimizer.optimize(); -// myOptimizer.update(x); -// } -// //cout << "error: " << myOptimizer.error() << endl; -// CHECK(myOptimizer.error() < 1.); -} - -///* ************************************************************************* */ -// SL-NEEDED? TEST_UNSAFE(Pose2SLAM, findMinimumSpanningTree) { -// pose2SLAM::Graph G, T, C; -// G.addPoseConstraint(1, 2, Pose2(0.,0.,0.), I3); -// G.addPoseConstraint(1, 3, Pose2(0.,0.,0.), I3); -// G.addPoseConstraint(2, 3, Pose2(0.,0.,0.), I3); -// -// PredecessorMap tree = -// G.findMinimumSpanningTree(); -// CHECK(tree[1] == 1); -// CHECK(tree[2] == 1); -// CHECK(tree[3] == 1); -//} -// -///* ************************************************************************* */ -// SL-NEEDED? TEST_UNSAFE(Pose2SLAM, split) { -// pose2SLAM::Graph G, T, C; -// G.addPoseConstraint(1, 2, Pose2(0.,0.,0.), I3); -// G.addPoseConstraint(1, 3, Pose2(0.,0.,0.), I3); -// G.addPoseConstraint(2, 3, Pose2(0.,0.,0.), I3); -// -// PredecessorMap tree; -// tree.insert(1,2); -// tree.insert(2,2); -// tree.insert(3,2); -// -// G.split(tree, T, C); -// LONGS_EQUAL(2, T.size()); -// LONGS_EQUAL(1, C.size()); -//} - -using namespace pose2SLAM; - -/* ************************************************************************* */ -TEST_UNSAFE(Pose2Values, pose2Circle ) -{ - // expected is 4 poses tangent to circle with radius 1m - pose2SLAM::Values expected; - expected.insert(0, Pose2( 1, 0, M_PI_2)); - expected.insert(1, Pose2( 0, 1, - M_PI )); - expected.insert(2, Pose2(-1, 0, - M_PI_2)); - expected.insert(3, Pose2( 0, -1, 0 )); - - pose2SLAM::Values actual = pose2SLAM::Values::Circle(4,1.0); - CHECK(assert_equal(expected,actual)); -} - -/* ************************************************************************* */ -TEST_UNSAFE(Pose2SLAM, expmap ) -{ - // expected is circle shifted to right - pose2SLAM::Values expected; - expected.insert(0, Pose2( 1.1, 0, M_PI_2)); - expected.insert(1, Pose2( 0.1, 1, - M_PI )); - expected.insert(2, Pose2(-0.9, 0, - M_PI_2)); - expected.insert(3, Pose2( 0.1, -1, 0 )); - - // Note expmap coordinates are in local coordinates, so shifting to right requires thought !!! - pose2SLAM::Values circle = pose2SLAM::Values::Circle(4,1.0); - Ordering ordering(*circle.orderingArbitrary()); - VectorValues delta(circle.dims(ordering)); - delta[ordering[0]] = Vector_(3, 0.0,-0.1,0.0); - delta[ordering[1]] = Vector_(3, -0.1,0.0,0.0); - delta[ordering[2]] = Vector_(3, 0.0,0.1,0.0); - delta[ordering[3]] = Vector_(3, 0.1,0.0,0.0); - pose2SLAM::Values actual = circle.retract(delta, ordering); - CHECK(assert_equal(expected,actual)); -} - -// Common measurement covariance -static SharedNoiseModel sigmas = noiseModel::Diagonal::Sigmas(Vector_(3,sx,sy,st)); - -/* ************************************************************************* */ -// Very simple test establishing Ax-b \approx z-h(x) -TEST_UNSAFE( Pose2Prior, error ) -{ - // Choose a linearization point - Pose2 p1(1, 0, 0); // robot at (1,0) - pose2SLAM::Values x0; - x0.insert(1, p1); - - // Create factor - PriorFactor factor(1, p1, sigmas); - - // Actual linearization - Ordering ordering(*x0.orderingArbitrary()); - boost::shared_ptr linear = - boost::dynamic_pointer_cast(factor.linearize(x0, ordering)); - - // Check error at x0, i.e. delta = zero ! - VectorValues delta(VectorValues::Zero(x0.dims(ordering))); - delta[ordering[1]] = zero(3); - Vector error_at_zero = Vector_(3,0.0,0.0,0.0); - CHECK(assert_equal(error_at_zero,factor.whitenedError(x0))); - CHECK(assert_equal(-error_at_zero,linear->error_vector(delta))); - - // Check error after increasing p2 - VectorValues addition(VectorValues::Zero(x0.dims(ordering))); - addition[ordering[1]] = Vector_(3, 0.1, 0.0, 0.0); - VectorValues plus = delta + addition; - pose2SLAM::Values x1 = x0.retract(plus, ordering); - Vector error_at_plus = Vector_(3,0.1/sx,0.0,0.0); // h(x)-z = 0.1 ! - CHECK(assert_equal(error_at_plus,factor.whitenedError(x1))); - CHECK(assert_equal(error_at_plus,linear->error_vector(plus))); -} - -/* ************************************************************************* */ -// common Pose2Prior for tests below -static gtsam::Pose2 priorVal(2,2,M_PI_2); -static PriorFactor priorFactor(1, priorVal, sigmas); - -/* ************************************************************************* */ -// The error |A*dx-b| approximates (h(x0+dx)-z) = -error_vector -// Hence i.e., b = approximates z-h(x0) = error_vector(x0) -LieVector hprior(const Pose2& p1) { - return LieVector(sigmas->whiten(priorFactor.evaluateError(p1))); -} - -/* ************************************************************************* */ -TEST_UNSAFE( Pose2Prior, linearize ) -{ - // Choose a linearization point at ground truth - pose2SLAM::Values x0; - x0.insertPose(1, priorVal); - - // Actual linearization - Ordering ordering(*x0.orderingArbitrary()); - boost::shared_ptr actual = - boost::dynamic_pointer_cast(priorFactor.linearize(x0, ordering)); - - // Test with numerical derivative - Matrix numericalH = numericalDerivative11(hprior, priorVal); - CHECK(assert_equal(numericalH,actual->getA(actual->find(ordering[1])))); -} - -/* ************************************************************************* */ -// Very simple test establishing Ax-b \approx z-h(x) -TEST_UNSAFE( Pose2Factor, error ) -{ - // Choose a linearization point - Pose2 p1; // robot at origin - Pose2 p2(1, 0, 0); // robot at (1,0) - pose2SLAM::Values x0; - x0.insertPose(1, p1); - x0.insertPose(2, p2); - - // Create factor - Pose2 z = p1.between(p2); - Pose2Factor factor(1, 2, z, covariance); - - // Actual linearization - Ordering ordering(*x0.orderingArbitrary()); - boost::shared_ptr linear = - boost::dynamic_pointer_cast(factor.linearize(x0, ordering)); - - // Check error at x0, i.e. delta = zero ! - VectorValues delta(x0.dims(ordering)); - delta[ordering[1]] = zero(3); - delta[ordering[2]] = zero(3); - Vector error_at_zero = Vector_(3,0.0,0.0,0.0); - CHECK(assert_equal(error_at_zero,factor.unwhitenedError(x0))); - CHECK(assert_equal(-error_at_zero, linear->error_vector(delta))); - - // Check error after increasing p2 - VectorValues plus = delta; - plus[ordering[2]] = Vector_(3, 0.1, 0.0, 0.0); - pose2SLAM::Values x1 = x0.retract(plus, ordering); - Vector error_at_plus = Vector_(3,0.1/sx,0.0,0.0); // h(x)-z = 0.1 ! - CHECK(assert_equal(error_at_plus,factor.whitenedError(x1))); - CHECK(assert_equal(error_at_plus,linear->error_vector(plus))); -} - -/* ************************************************************************* */ -// common Pose2Factor for tests below -static Pose2 measured(2,2,M_PI_2); -static Pose2Factor factor(1,2,measured, covariance); - -/* ************************************************************************* */ -TEST_UNSAFE( Pose2Factor, rhs ) -{ - // Choose a linearization point - Pose2 p1(1.1,2,M_PI_2); // robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2) - Pose2 p2(-1,4.1,M_PI); // robot at (-1,4.1) looking at negative (ground truth is at -1,4) - pose2SLAM::Values x0; - x0.insert(1,p1); - x0.insert(2,p2); - - // Actual linearization - Ordering ordering(*x0.orderingArbitrary()); - boost::shared_ptr linear = - boost::dynamic_pointer_cast(factor.linearize(x0, ordering)); - - // Check RHS - Pose2 hx0 = p1.between(p2); - CHECK(assert_equal(Pose2(2.1, 2.1, M_PI_2),hx0)); - Vector expected_b = Vector_(3, -0.1/sx, 0.1/sy, 0.0); - CHECK(assert_equal(expected_b,-factor.whitenedError(x0))); - CHECK(assert_equal(expected_b,linear->getb())); -} - -/* ************************************************************************* */ -// The error |A*dx-b| approximates (h(x0+dx)-z) = -error_vector -// Hence i.e., b = approximates z-h(x0) = error_vector(x0) -LieVector h(const Pose2& p1,const Pose2& p2) { - return LieVector(covariance->whiten(factor.evaluateError(p1,p2))); -} - -/* ************************************************************************* */ -TEST_UNSAFE( Pose2Factor, linearize ) -{ - // Choose a linearization point at ground truth - Pose2 p1(1,2,M_PI_2); - Pose2 p2(-1,4,M_PI); - pose2SLAM::Values x0; - x0.insert(1,p1); - x0.insert(2,p2); - - // expected linearization - Matrix expectedH1 = covariance->Whiten(Matrix_(3,3, - 0.0,-1.0,-2.0, - 1.0, 0.0,-2.0, - 0.0, 0.0,-1.0 - )); - Matrix expectedH2 = covariance->Whiten(Matrix_(3,3, - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, 0.0, 1.0 - )); - Vector expected_b = Vector_(3, 0.0, 0.0, 0.0); - - // expected linear factor - Ordering ordering(*x0.orderingArbitrary()); - SharedDiagonal probModel1 = noiseModel::Unit::Create(3); - JacobianFactor expected(ordering[1], expectedH1, ordering[2], expectedH2, expected_b, probModel1); - - // Actual linearization - boost::shared_ptr actual = - boost::dynamic_pointer_cast(factor.linearize(x0, ordering)); - CHECK(assert_equal(expected,*actual)); - - // Numerical do not work out because BetweenFactor is approximate ? - Matrix numericalH1 = numericalDerivative21(h, p1, p2); - CHECK(assert_equal(expectedH1,numericalH1)); - Matrix numericalH2 = numericalDerivative22(h, p1, p2); - CHECK(assert_equal(expectedH2,numericalH2)); -} - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ diff --git a/gtsam/slam/tests/testPose3SLAM.cpp b/gtsam/slam/tests/testPose3SLAM.cpp deleted file mode 100644 index 23367bd8a..000000000 --- a/gtsam/slam/tests/testPose3SLAM.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testpose3SLAM.cpp - * @author Frank Dellaert - * @author Viorela Ila - **/ - -#include -#include -#include - -#include - -#include -#include -#include -using namespace boost; -using namespace boost::assign; - -#include - -using namespace std; -using namespace gtsam; - -// common measurement covariance -static noiseModel::Gaussian::shared_ptr covariance(noiseModel::Unit::Create(6)); - -const double tol=1e-5; - -/* ************************************************************************* */ -// test optimization with 6 poses arranged in a hexagon and a loop closure -TEST(Pose3Graph, optimizeCircle) { - - // Create a hexagon of poses - double radius = 10; - Values hexagon = pose3SLAM::Values::Circle(6,radius); - Pose3 gT0 = hexagon.at(0), gT1 = hexagon.at(1); - - // create a Pose graph with one equality constraint and one measurement - pose3SLAM::Graph fg; - fg.addPoseConstraint(0, gT0); - Pose3 _0T1 = gT0.between(gT1); // inv(gT0)*gT1 - double theta = M_PI/3.0; - CHECK(assert_equal(Pose3(Rot3::yaw(-theta),Point3(radius*sin(theta),-radius*cos(theta),0)),_0T1)); - fg.addRelativePose(0,1, _0T1, covariance); - fg.addRelativePose(1,2, _0T1, covariance); - fg.addRelativePose(2,3, _0T1, covariance); - fg.addRelativePose(3,4, _0T1, covariance); - fg.addRelativePose(4,5, _0T1, covariance); - fg.addRelativePose(5,0, _0T1, covariance); - - // Create initial config - Values initial; - initial.insert(0, gT0); - initial.insert(1, hexagon.at(1).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); - initial.insert(2, hexagon.at(2).retract(Vector_(6, 0.1,-0.1, 0.1, 0.1,-0.1, 0.1))); - initial.insert(3, hexagon.at(3).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); - initial.insert(4, hexagon.at(4).retract(Vector_(6, 0.1,-0.1, 0.1, 0.1,-0.1, 0.1))); - initial.insert(5, hexagon.at(5).retract(Vector_(6,-0.1, 0.1,-0.1,-0.1, 0.1,-0.1))); - - // Choose an ordering and optimize - Ordering ordering; - ordering += 0,1,2,3,4,5; - - Values actual = LevenbergMarquardtOptimizer(fg, initial, ordering).optimize(); - - // Check with ground truth - CHECK(assert_equal(hexagon, actual,1e-4)); - - // Check loop closure - CHECK(assert_equal(_0T1, actual.at(5).between(actual.at(0)),1e-5)); -} - -/* ************************************************************************* */ -TEST(Pose3Graph, partial_prior_height) { - typedef PartialPriorFactor Partial; - - // reference: Pose3 Expmap - (0-2: Rot3) (3-5: Point3) - - // height prior - single element interface - double exp_height = 5.0; - SharedDiagonal model = noiseModel::Unit::Create(1); - Pose3 init(Rot3(), Point3(1.0, 2.0, 3.0)), expected(Rot3(), Point3(1.0, 2.0, exp_height)); - Partial height(1, 5, exp_height, model); - Matrix actA; - EXPECT(assert_equal(Vector_(1,-2.0), height.evaluateError(init, actA), tol)); - Matrix expA = Matrix_(1, 6, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); - EXPECT(assert_equal(expA, actA)); - - pose3SLAM::Graph graph; - graph.add(height); - - Values values; - values.insert(1, init); - - // linearization - EXPECT_DOUBLES_EQUAL(2.0, height.error(values), tol); - - Values actual = LevenbergMarquardtOptimizer(graph, values).optimize(); - EXPECT(assert_equal(expected, actual.at(1), tol)); - EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol); -} - -/* ************************************************************************* */ -TEST( Pose3Factor, error ) -{ - // Create example - Pose3 t1; // origin - Pose3 t2(Rot3::rodriguez(0.1,0.2,0.3),Point3(0,1,0)); - Pose3 z(Rot3::rodriguez(0.2,0.2,0.3),Point3(0,1.1,0));; - - // Create factor - SharedNoiseModel I6(noiseModel::Unit::Create(6)); - BetweenFactor factor(1, 2, z, I6); - - // Create config - Values x; - x.insert(1,t1); - x.insert(2,t2); - - // Get error h(x)-z -> localCoordinates(z,h(x)) = localCoordinates(z,between(t1,t2)) - Vector actual = factor.unwhitenedError(x); - Vector expected = z.localCoordinates(t1.between(t2)); - CHECK(assert_equal(expected,actual)); -} - -/* ************************************************************************* */ -TEST(Pose3Graph, partial_prior_xy) { - typedef PartialPriorFactor Partial; - - // XY prior - full mask interface - Vector exp_xy = Vector_(2, 3.0, 4.0); - SharedDiagonal model = noiseModel::Unit::Create(2); - Pose3 init(Rot3(), Point3(1.0,-2.0, 3.0)), expected(Rot3(), Point3(3.0, 4.0, 3.0)); - vector mask; mask += 3, 4; - Partial priorXY(1, mask, exp_xy, model); - Matrix actA; - EXPECT(assert_equal(Vector_(2,-2.0,-6.0), priorXY.evaluateError(init, actA), tol)); - Matrix expA = Matrix_(2, 6, - 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); - EXPECT(assert_equal(expA, actA)); - - pose3SLAM::Graph graph; - graph.add(priorXY); - - Values values; - values.insert(1, init); - - Values actual = LevenbergMarquardtOptimizer(graph, values).optimize(); - EXPECT(assert_equal(expected, actual.at(1), tol)); - EXPECT_DOUBLES_EQUAL(0.0, graph.error(actual), tol); -} - -// The world coordinate system has z pointing up, y north, x east -// The vehicle has X forward, Y right, Z down -Rot3 R1(Point3( 0, 1, 0), Point3( 1, 0, 0), Point3(0, 0, -1)); -Rot3 R2(Point3(-1, 0, 0), Point3( 0, 1, 0), Point3(0, 0, -1)); -Rot3 R3(Point3( 0,-1, 0), Point3(-1, 0, 0), Point3(0, 0, -1)); -Rot3 R4(Point3( 1, 0, 0), Point3( 0,-1, 0), Point3(0, 0, -1)); - -/* ************************************************************************* */ -TEST( Values, pose3Circle ) -{ - // expected is 4 poses tangent to circle with radius 1m - Values expected; - expected.insert(0, Pose3(R1, Point3( 1, 0, 0))); - expected.insert(1, Pose3(R2, Point3( 0, 1, 0))); - expected.insert(2, Pose3(R3, Point3(-1, 0, 0))); - expected.insert(3, Pose3(R4, Point3( 0,-1, 0))); - - Values actual = pose3SLAM::Values::Circle(4,1.0); - CHECK(assert_equal(expected,actual)); -} - -/* ************************************************************************* */ -TEST( Values, expmap ) -{ - Values expected; - expected.insert(0, Pose3(R1, Point3( 1.0, 0.1, 0))); - expected.insert(1, Pose3(R2, Point3(-0.1, 1.0, 0))); - expected.insert(2, Pose3(R3, Point3(-1.0,-0.1, 0))); - expected.insert(3, Pose3(R4, Point3( 0.1,-1.0, 0))); - - Ordering ordering(*expected.orderingArbitrary()); - VectorValues delta(expected.dims(ordering)); - delta.vector() = Vector_(24, - 0.0,0.0,0.0, 0.1, 0.0, 0.0, - 0.0,0.0,0.0, 0.1, 0.0, 0.0, - 0.0,0.0,0.0, 0.1, 0.0, 0.0, - 0.0,0.0,0.0, 0.1, 0.0, 0.0); - Values actual = pose3SLAM::Values::Circle(4,1.0).retract(delta, ordering); - CHECK(assert_equal(expected,actual)); -} - -/* ************************************************************************* */ -int main() { - TestResult tr; - return TestRegistry::runAllTests(tr); -} -/* ************************************************************************* */ diff --git a/gtsam/slam/tests/testSparseBA.cpp b/gtsam/slam/tests/testSparseBA.cpp deleted file mode 100644 index cc6e11400..000000000 --- a/gtsam/slam/tests/testSparseBA.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testsparseBA.cpp - * @brief - * @date Jul 5, 2012 - * @author Yong-Dian Jian - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace boost; -using namespace gtsam; - -/* ************************************************************************* */ - -static SharedNoiseModel sigma(noiseModel::Unit::Create(2)); - -// Convenience for named keys -using symbol_shorthand::X; /* pose3 */ -using symbol_shorthand::K; /* calibration */ -using symbol_shorthand::C; /* camera = [pose calibration] */ -using symbol_shorthand::L; /* point3 */ - -static Point3 landmark1(-1.0,-1.0, 0.0); -static Point3 landmark2(-1.0, 1.0, 0.0); -static Point3 landmark3( 1.0, 1.0, 0.0); -static Point3 landmark4( 1.0,-1.0, 0.0); - -static Pose3 pose1(Matrix_(3,3, - 1., 0., 0., - 0.,-1., 0., - 0., 0.,-1.), - Point3(0,0,6.25)); - -static Pose3 pose2(Matrix_(3,3, - 1., 0., 0., - 0.,-1., 0., - 0., 0.,-1.), - Point3(0,0,5.00)); - -static Cal3_S2 calib1 (625, 625, 0, 0, 0); -static Cal3_S2 calib2 (625, 625, 0, 0, 0); - - -typedef PinholeCamera Camera; - -static Camera camera1(pose1, calib1); -static Camera camera2(pose2, calib2); - -/* ************************************************************************* */ -sparseBA::Graph testGraph1() { - Point2 z11(-100, 100); - Point2 z12(-100,-100); - Point2 z13( 100,-100); - Point2 z14( 100, 100); - Point2 z21(-125, 125); - Point2 z22(-125,-125); - Point2 z23( 125,-125); - Point2 z24( 125, 125); - - - sparseBA::Graph g; - g.addMeasurement(z11, sigma, C(1), L(1)); - g.addMeasurement(z12, sigma, C(1), L(2)); - g.addMeasurement(z13, sigma, C(1), L(3)); - g.addMeasurement(z14, sigma, C(1), L(4)); - g.addMeasurement(z21, sigma, C(2), L(1)); - g.addMeasurement(z22, sigma, C(2), L(2)); - g.addMeasurement(z23, sigma, C(2), L(3)); - g.addMeasurement(z24, sigma, C(2), L(4)); - return g; -} - -sparseBA::Graph testGraph2() { - Point2 z11(-100, 100); - Point2 z12(-100,-100); - Point2 z13( 100,-100); - Point2 z14( 100, 100); - Point2 z21(-125, 125); - Point2 z22(-125,-125); - Point2 z23( 125,-125); - Point2 z24( 125, 125); - - sparseBA::Graph g; - g.addMeasurement(z11, sigma, X(1), L(1), K(1)); - g.addMeasurement(z12, sigma, X(1), L(2), K(1)); - g.addMeasurement(z13, sigma, X(1), L(3), K(1)); - g.addMeasurement(z14, sigma, X(1), L(4), K(1)); - g.addMeasurement(z21, sigma, X(2), L(1), K(1)); - g.addMeasurement(z22, sigma, X(2), L(2), K(1)); - g.addMeasurement(z23, sigma, X(2), L(3), K(1)); - g.addMeasurement(z24, sigma, X(2), L(4), K(1)); - return g; -} - -/* ************************************************************************* */ -TEST( optimizeLM1, sparseBA ) -{ - // build a graph - sparseBA::Graph graph(testGraph1()); - - // add 3 landmark constraints - graph.addPointConstraint(L(1), landmark1); - graph.addPointConstraint(L(2), landmark2); - graph.addPointConstraint(L(3), landmark3); - - // Create an initial values structure corresponding to the ground truth - Values initialEstimate; - initialEstimate.insert(C(1), camera1); - initialEstimate.insert(C(2), camera2); - initialEstimate.insert(L(1), landmark1); - initialEstimate.insert(L(2), landmark2); - initialEstimate.insert(L(3), landmark3); - initialEstimate.insert(L(4), landmark4); - - // Create an ordering of the variables - Ordering ordering; - ordering += L(1),L(2),L(3),L(4),C(1),C(2); - - // Create an optimizer and check its error - // We expect the initial to be zero because config is the ground truth - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, ordering); - DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // Iterate once, and the config should not have changed because we started - // with the ground truth - optimizer.iterate(); - DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // check if correct - CHECK(assert_equal(initialEstimate, optimizer.values())); -} - -/* ************************************************************************* */ -TEST( optimizeLM2, sparseBA ) -{ - // build a graph - sparseBA::Graph graph(testGraph2()); - - // add 3 landmark constraints - graph.addPointConstraint(L(1), landmark1); - graph.addPointConstraint(L(2), landmark2); - graph.addPointConstraint(L(3), landmark3); - - // Create an initial values structure corresponding to the ground truth - Values initialEstimate; - initialEstimate.insert(X(1), pose1); - initialEstimate.insert(X(2), pose2); - initialEstimate.insert(L(1), landmark1); - initialEstimate.insert(L(2), landmark2); - initialEstimate.insert(L(3), landmark3); - initialEstimate.insert(L(4), landmark4); - initialEstimate.insert(K(1), calib2); - - // Create an ordering of the variables - Ordering ordering; - ordering += L(1),L(2),L(3),L(4),X(1),X(2),K(1); - - // Create an optimizer and check its error - // We expect the initial to be zero because config is the ground truth - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, ordering); - DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // Iterate once, and the config should not have changed because we started - // with the ground truth - optimizer.iterate(); - DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // check if correct - CHECK(assert_equal(initialEstimate, optimizer.values())); -} - -/* ************************************************************************* */ -int main() { TestResult tr; return TestRegistry::runAllTests(tr); } -/* ************************************************************************* */ diff --git a/gtsam/slam/tests/testVisualSLAM.cpp b/gtsam/slam/tests/testVisualSLAM.cpp deleted file mode 100644 index 65c31adf9..000000000 --- a/gtsam/slam/tests/testVisualSLAM.cpp +++ /dev/null @@ -1,344 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 testVisualSLAM.cpp - * @brief Unit test for two cameras and four landmarks, single camera - * @author Chris Beall - * @author Frank Dellaert - * @author Viorela Ila - */ - -#include -#include -#include -#include - -#include -#include -using namespace boost; - -using namespace std; -using namespace gtsam; - -/* ************************************************************************* */ - -static SharedNoiseModel sigma(noiseModel::Unit::Create(1)); - -// Convenience for named keys -using symbol_shorthand::X; -using symbol_shorthand::L; - -static Point3 landmark1(-1.0,-1.0, 0.0); -static Point3 landmark2(-1.0, 1.0, 0.0); -static Point3 landmark3( 1.0, 1.0, 0.0); -static Point3 landmark4( 1.0,-1.0, 0.0); - -static Pose3 pose1(Matrix_(3,3, - 1., 0., 0., - 0.,-1., 0., - 0., 0.,-1. - ), - Point3(0,0,6.25)); - -static Pose3 pose2(Matrix_(3,3, - 1., 0., 0., - 0.,-1., 0., - 0., 0.,-1. - ), - Point3(0,0,5.00)); - -/* ************************************************************************* */ -visualSLAM::Graph testGraph() { - Point2 z11(-100, 100); - Point2 z12(-100,-100); - Point2 z13( 100,-100); - Point2 z14( 100, 100); - Point2 z21(-125, 125); - Point2 z22(-125,-125); - Point2 z23( 125,-125); - Point2 z24( 125, 125); - - shared_ptrK sK(new Cal3_S2(625, 625, 0, 0, 0)); - visualSLAM::Graph g; - g.addMeasurement(z11, sigma, X(1), L(1), sK); - g.addMeasurement(z12, sigma, X(1), L(2), sK); - g.addMeasurement(z13, sigma, X(1), L(3), sK); - g.addMeasurement(z14, sigma, X(1), L(4), sK); - g.addMeasurement(z21, sigma, X(2), L(1), sK); - g.addMeasurement(z22, sigma, X(2), L(2), sK); - g.addMeasurement(z23, sigma, X(2), L(3), sK); - g.addMeasurement(z24, sigma, X(2), L(4), sK); - return g; -} - -/* ************************************************************************* */ -TEST( VisualSLAM, optimizeLM) -{ - // build a graph - visualSLAM::Graph graph(testGraph()); - // add 3 landmark constraints - graph.addPointConstraint(L(1), landmark1); - graph.addPointConstraint(L(2), landmark2); - graph.addPointConstraint(L(3), landmark3); - - // Create an initial values structure corresponding to the ground truth - Values initialEstimate; - initialEstimate.insert(X(1), pose1); - initialEstimate.insert(X(2), pose2); - initialEstimate.insert(L(1), landmark1); - initialEstimate.insert(L(2), landmark2); - initialEstimate.insert(L(3), landmark3); - initialEstimate.insert(L(4), landmark4); - - // Create an ordering of the variables - Ordering ordering; - ordering += L(1),L(2),L(3),L(4),X(1),X(2); - - // Create an optimizer and check its error - // We expect the initial to be zero because config is the ground truth - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, ordering); - DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // Iterate once, and the config should not have changed because we started - // with the ground truth - optimizer.iterate(); - DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // check if correct - CHECK(assert_equal(initialEstimate, optimizer.values())); -} - - -/* ************************************************************************* */ -TEST( VisualSLAM, optimizeLM2) -{ - // build a graph - visualSLAM::Graph graph(testGraph()); - // add 2 camera constraints - graph.addPoseConstraint(X(1), pose1); - graph.addPoseConstraint(X(2), pose2); - - // Create an initial values structure corresponding to the ground truth - Values initialEstimate; - initialEstimate.insert(X(1), pose1); - initialEstimate.insert(X(2), pose2); - initialEstimate.insert(L(1), landmark1); - initialEstimate.insert(L(2), landmark2); - initialEstimate.insert(L(3), landmark3); - initialEstimate.insert(L(4), landmark4); - - // Create an ordering of the variables - Ordering ordering; - ordering += L(1),L(2),L(3),L(4),X(1),X(2); - - // Create an optimizer and check its error - // We expect the initial to be zero because config is the ground truth - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, ordering); - EXPECT_DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // Iterate once, and the config should not have changed because we started - // with the ground truth - optimizer.iterate(); - EXPECT_DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // check if correct - CHECK(assert_equal(initialEstimate, optimizer.values())); -} - -/* ************************************************************************* */ -TEST( VisualSLAM, LMoptimizer) -{ - // build a graph - visualSLAM::Graph graph(testGraph()); - // add 2 camera constraints - graph.addPoseConstraint(X(1), pose1); - graph.addPoseConstraint(X(2), pose2); - - // Create an initial values structure corresponding to the ground truth - Values initialEstimate; - initialEstimate.insert(X(1), pose1); - initialEstimate.insert(X(2), pose2); - initialEstimate.insert(L(1), landmark1); - initialEstimate.insert(L(2), landmark2); - initialEstimate.insert(L(3), landmark3); - initialEstimate.insert(L(4), landmark4); - - // Create an optimizer and check its error - // We expect the initial to be zero because config is the ground truth - LevenbergMarquardtOptimizer optimizer = graph.optimizer(initialEstimate); - EXPECT_DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // Iterate once, and the config should not have changed because we started - // with the ground truth - optimizer.iterate(); - EXPECT_DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // check if correct - CHECK(assert_equal(initialEstimate, optimizer.values())); - - // check errors - Matrix errors = graph.reprojectionErrors(optimizer.values()); - CHECK(assert_equal(zeros(2,8), errors)); -} - - -/* ************************************************************************* */ -TEST( VisualSLAM, CHECK_ORDERING) -{ - // build a graph - visualSLAM::Graph graph = testGraph(); - // add 2 camera constraints - graph.addPoseConstraint(X(1), pose1); - graph.addPoseConstraint(X(2), pose2); - - // Create an initial values structure corresponding to the ground truth - Values initialEstimate; - initialEstimate.insert(X(1), pose1); - initialEstimate.insert(X(2), pose2); - initialEstimate.insert(L(1), landmark1); - initialEstimate.insert(L(2), landmark2); - initialEstimate.insert(L(3), landmark3); - initialEstimate.insert(L(4), landmark4); - - // Create an optimizer and check its error - // We expect the initial to be zero because config is the ground truth - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); - EXPECT_DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // Iterate once, and the config should not have changed because we started - // with the ground truth - optimizer.iterate(); - EXPECT_DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); - - // check if correct - CHECK(assert_equal(initialEstimate, optimizer.values())); -} - -/* ************************************************************************* */ -TEST( VisualSLAM, update_with_large_delta) { - // this test ensures that if the update for delta is larger than - // the size of the config, it only updates existing variables - Values init; - init.insert(X(1), Pose3()); - init.insert(L(1), Point3(1.0, 2.0, 3.0)); - - Values expected; - expected.insert(X(1), Pose3(Rot3(), Point3(0.1, 0.1, 0.1))); - expected.insert(L(1), Point3(1.1, 2.1, 3.1)); - - Ordering largeOrdering; - Values largeValues = init; - largeValues.insert(X(2), Pose3()); - largeOrdering += X(1),L(1),X(2); - VectorValues delta(largeValues.dims(largeOrdering)); - delta[largeOrdering[X(1)]] = Vector_(6, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1); - delta[largeOrdering[L(1)]] = Vector_(3, 0.1, 0.1, 0.1); - delta[largeOrdering[X(2)]] = Vector_(6, 0.0, 0.0, 0.0, 100.1, 4.1, 9.1); - Values actual = init.retract(delta, largeOrdering); - - CHECK(assert_equal(expected,actual)); -} - -/* ************************************************************************* */ -TEST( VisualSLAM, dataAssociation) { - visualSLAM::ISAM isam; - // add two landmarks - // add two cameras and constraint and odometry -// std::pair actualJoint = isam.jointPrediction(); // 4*4 - // std::pair actualMarginals = isam.individualPredictions(); // 2 times 2*2 - // std::pair actualChowLiu = isam.chowLiuPredictions(); // 2 times 2*2 -} - -/* ************************************************************************* */ -TEST( VisualSLAM, filteredValues) { - visualSLAM::Values full; - full.insert(X(1), Pose3(Pose2(1.0, 2.0, 0.3))); - full.insert(L(1), Point3(1.0, 2.0, 3.0)); - - visualSLAM::Values actPoses(full.allPoses()); - visualSLAM::Values expPoses; expPoses.insert(X(1), Pose3(Pose2(1.0, 2.0, 0.3))); - EXPECT(assert_equal(expPoses, actPoses)); - - visualSLAM::Values actPoints(full.allPoints()); - visualSLAM::Values expPoints; expPoints.insert(L(1), Point3(1.0, 2.0, 3.0)); - EXPECT(assert_equal(expPoints, actPoints)); -} - -/* ************************************************************************* */ -TEST( VisualSLAM, keys_and_view ) -{ - // create config - visualSLAM::Values c; - c.insert(X(1), pose1); - c.insert(X(2), pose2); - c.insert(L(2), landmark2); - LONGS_EQUAL(2,c.nrPoses()); - LONGS_EQUAL(1,c.nrPoints()); - { - FastList expected, actual; - expected += L(2), X(1), X(2); - actual = c.keys(); - CHECK(expected == actual); - } - { - FastList expected, actual; - expected += X(1), X(2); - actual = c.poseKeys(); - CHECK(expected == actual); - } - { - FastList expected, actual; - expected += L(2); - actual = c.pointKeys(); - CHECK(expected == actual); - } -} - -/* ************************************************************************* */ -TEST( VisualSLAM, addMeasurements ) -{ - // create config - visualSLAM::Graph g; - Vector J = Vector_(3,1.0,2.0,3.0); - Matrix Z = Matrix_(2,3, -1.0,0.0,1.0, -1.0,0.0,1.0); - shared_ptrK sK(new Cal3_S2(625, 625, 0, 0, 0)); - g.addMeasurements(0,J,Z,sigma,sK); - EXPECT_LONGS_EQUAL(3,g.size()); -} - -/* ************************************************************************* */ -TEST( VisualSLAM, insertBackProjections ) -{ - // create config - visualSLAM::Values c; - SimpleCamera camera(pose1); - Vector J = Vector_(3,1.0,2.0,3.0); - Matrix Z = Matrix_(2,3, -1.0,0.0,1.0, -1.0,0.0,1.0); - c.insertBackprojections(camera,J,Z,1.0); - EXPECT_LONGS_EQUAL(3,c.nrPoints()); -} - -/* ************************************************************************* */ -TEST( VisualSLAM, perturbPoints ) -{ - visualSLAM::Values c1,c2; - c1.insert(L(2), landmark2); - c1.perturbPoints(0.01,42u); - CHECK(assert_equal(Point3(-0.986984, 0.999534, -0.0147962),c1.point(L(2)),1e-6)); - c2.insert(L(2), landmark2); - c2.perturbPoints(0.01,42u); - CHECK(assert_equal(Point3(-0.986984, 0.999534, -0.0147962),c2.point(L(2)),1e-6)); -} - -/* ************************************************************************* */ -int main() { TestResult tr; return TestRegistry::runAllTests(tr); } -/* ************************************************************************* */ diff --git a/gtsam/slam/visualSLAM.cpp b/gtsam/slam/visualSLAM.cpp deleted file mode 100644 index 2133c0ee8..000000000 --- a/gtsam/slam/visualSLAM.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 visualSLAM.cpp - * @date Jan 14, 2010 - * @author richard - */ - -#include -#include -#include -#include -#include - -namespace visualSLAM { - - using boost::make_shared; - - /* ************************************************************************* */ - void Values::insertBackprojections(const SimpleCamera& camera, - const Vector& J, const Matrix& Z, double depth) { - if (Z.rows() != 2) throw std::invalid_argument("insertBackProjections: Z must be 2*K"); - if (Z.cols() != J.size()) throw std::invalid_argument( - "insertBackProjections: J and Z must have same number of entries"); - for(int k=0;k points = allPoints(); - noiseModel::Isotropic::shared_ptr model = noiseModel::Isotropic::Sigma(3,sigma); - Sampler sampler(model, seed); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, points) { - update(keyValue.key, keyValue.value.retract(sampler.sample())); - } - } - - /* ************************************************************************* */ - Matrix Values::points() const { - size_t j=0; - ConstFiltered points = allPoints(); - Matrix result(points.size(),3); - BOOST_FOREACH(const ConstFiltered::KeyValuePair& keyValue, points) - result.row(j++) = keyValue.value.vector(); - return result; - } - - /* ************************************************************************* */ - void Graph::addPointConstraint(Key pointKey, const Point3& p) { - push_back(make_shared >(pointKey, p)); - } - - /* ************************************************************************* */ - void Graph::addPointPrior(Key pointKey, const Point3& p, const SharedNoiseModel& model) { - push_back(make_shared >(pointKey, p, model)); - } - - /* ************************************************************************* */ - void Graph::addMeasurement(const Point2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrK K) { - push_back( - make_shared > - (measured, model, poseKey, pointKey, K)); - } - - /* ************************************************************************* */ - void Graph::addMeasurements(Key i, const Vector& J, const Matrix& Z, - const SharedNoiseModel& model, const shared_ptrK K) { - if (Z.rows() != 2) throw std::invalid_argument("addMeasurements: Z must be 2*K"); - if (Z.cols() != J.size()) throw std::invalid_argument( - "addMeasurements: J and Z must have same number of entries"); - for (int k = 0; k < Z.cols(); k++) - addMeasurement(Point2(Z(0, k), Z(1, k)), model, i, J(k), K); - } - - /* ************************************************************************* */ - void Graph::addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrKStereo K) { - push_back(make_shared >(measured, model, poseKey, pointKey, K)); - } - - /* ************************************************************************* */ - void Graph::addRangeFactor(Key poseKey, Key pointKey, double range, const SharedNoiseModel& model) { - push_back(make_shared >(poseKey, pointKey, range, model)); - } - - /* ************************************************************************* */ - Matrix Graph::reprojectionErrors(const Values& values) const { - // first count - size_t K = 0, k=0; - BOOST_FOREACH(const sharedFactor& f, *this) - if (boost::dynamic_pointer_cast(f)) ++K; - // now fill - Matrix errors(2,K); - BOOST_FOREACH(const sharedFactor& f, *this) { - boost::shared_ptr p = - boost::dynamic_pointer_cast(f); - if (p) errors.col(k++) = p->unwhitenedError(values); - } - return errors; - } - /* ************************************************************************* */ -} diff --git a/gtsam/slam/visualSLAM.h b/gtsam/slam/visualSLAM.h deleted file mode 100644 index ae2956c5f..000000000 --- a/gtsam/slam/visualSLAM.h +++ /dev/null @@ -1,186 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 visualSLAM.h - * @brief Basic typedefs for general VisualSLAM problems. Useful for monocular and stereo systems. - * @date Jan 14, 2010 - * @author Richard Roberts - * @author Chris Beall - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace visualSLAM { - - using namespace gtsam; - - /// Values class, inherited from Values, mainly used as a convenience for MATLAB wrapper - struct Values: public pose3SLAM::Values { - - typedef boost::shared_ptr shared_ptr; - typedef gtsam::Values::ConstFiltered PoseFiltered; - typedef gtsam::Values::ConstFiltered PointFiltered; - - /// Default constructor - Values() {} - - /// Copy constructor - Values(const gtsam::Values& values) : - pose3SLAM::Values(values) { - } - - /// Constructor from filtered values view of poses - Values(const PoseFiltered& view) : pose3SLAM::Values(view) {} - - /// Constructor from filtered values view of points - Values(const PointFiltered& view) : pose3SLAM::Values(view) {} - - PoseFiltered allPoses() const { return this->filter(); } ///< pose view - size_t nrPoses() const { return allPoses().size(); } ///< get number of poses - KeyList poseKeys() const { return allPoses().keys(); } ///< get keys to poses only - - PointFiltered allPoints() const { return this->filter(); } ///< point view - size_t nrPoints() const { return allPoints().size(); } ///< get number of points - KeyList pointKeys() const { return allPoints().keys(); } ///< get keys to points only - - /// insert a point - void insertPoint(Key j, const Point3& point) { insert(j, point); } - - /// update a point - void updatePoint(Key j, const Point3& point) { update(j, point); } - - /// get a point - Point3 point(Key j) const { return at(j); } - - /// insert a number of initial point values by backprojecting - void insertBackprojections(const SimpleCamera& c, const Vector& J, - const Matrix& Z, double depth); - - /// perturb all points using normally distributed noise - void perturbPoints(double sigma, int32_t seed = 42u); - - /// get all point coordinates in a matrix - Matrix points() const; - - }; - - /** - * Non-linear factor graph for vanilla visual SLAM - */ - struct Graph: public pose3SLAM::Graph { - - /// shared pointer to this type of graph - typedef boost::shared_ptr shared_graph; - - /// Default constructor - Graph(){} - - /// Copy constructor given any other NonlinearFactorGraph - Graph(const NonlinearFactorGraph& graph): - pose3SLAM::Graph(graph) {} - - /// check if two graphs are equal - bool equals(const Graph& p, double tol = 1e-9) const { - return NonlinearFactorGraph::equals(p, tol); - } - - /** - * Add a constraint on a point (for now, *must* be satisfied in any Values) - * @param key variable key of the point - * @param p point around which soft prior is defined - */ - void addPointConstraint(Key pointKey, const Point3& p = Point3()); - - /** - * Add a prior on a point - * @param key variable key of the point - * @param p to which point to constrain it to - * @param model uncertainty model of this prior - */ - void addPointPrior(Key pointKey, const Point3& p = Point3(), - const SharedNoiseModel& model = noiseModel::Unit::Create(3)); - - /** - * Add a range prior to a point - * @param poseKey variable key of the camera pose - * @param pointKey variable key of the point - * @param range approximate range to point - * @param model uncertainty model of this prior - */ - void addRangeFactor(Key poseKey, Key pointKey, double range, - const SharedNoiseModel& model = noiseModel::Unit::Create(1)); - - /** - * Add a projection factor measurement (monocular) - * @param measured the measurement - * @param model the noise model for the measurement - * @param poseKey variable key for the camera pose - * @param pointKey variable key for the point - * @param K shared pointer to calibration object - */ - void addMeasurement(const Point2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrK K); - - /** - * Add a number of measurements at the same time - * @param i variable key for the camera pose - * @param J variable keys for the point, KeyVector of size K - * @param Z the 2*K measurements as a matrix - * @param model the noise model for the measurement - * @param K shared pointer to calibration object - */ - void addMeasurements(Key i, const Vector& J, const Matrix& Z, - const SharedNoiseModel& model, const shared_ptrK K); - - /** - * Add a stereo factor measurement - * @param measured the measurement - * @param model the noise model for the measurement - * @param poseKey variable key for the camera pose - * @param pointKey variable key for the point - * @param K shared pointer to stereo calibration object - */ - void addStereoMeasurement(const StereoPoint2& measured, const SharedNoiseModel& model, - Key poseKey, Key pointKey, const shared_ptrKStereo K); - - /// Return a 2*K Matrix of reprojection errors - Matrix reprojectionErrors(const Values& values) const; - - }; // Graph - - /** - * Non-linear ISAM for vanilla incremental visual SLAM inference - */ - typedef gtsam::NonlinearISAM ISAM; - -} // visualSLAM - -/** - * Backwards compatibility and wrap use only, avoid using - */ -namespace visualSLAM { - typedef gtsam::NonlinearEquality PoseConstraint; ///< \deprecated typedef for backwards compatibility - typedef gtsam::NonlinearEquality PointConstraint; ///< \deprecated typedef for backwards compatibility - typedef gtsam::PriorFactor PosePrior; ///< \deprecated typedef for backwards compatibility - typedef gtsam::PriorFactor PointPrior; ///< \deprecated typedef for backwards compatibility - typedef gtsam::RangeFactor RangeFactor; ///< \deprecated typedef for backwards compatibility - typedef gtsam::GenericProjectionFactor ProjectionFactor; ///< \deprecated typedef for backwards compatibility - typedef gtsam::GenericStereoFactor StereoFactor; ///< \deprecated typedef for backwards compatibility -} - From 47f92ccdf252c68a4d865a6a5c4f54ada8501514 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 30 Jul 2012 15:40:58 +0000 Subject: [PATCH 733/914] Added matlab.h, a temporary file holding special namespace functions. These need to be reviewed and a permanent home found. --- gtsam.h | 19 ++++++++ matlab.h | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 matlab.h diff --git a/gtsam.h b/gtsam.h index 6f87670ca..891520547 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1474,4 +1474,23 @@ typedef gtsam::GenericStereoFactor GenericStereoFac pair load2D(string filename, gtsam::noiseModel::Diagonal* model, int maxID, bool addNoise, bool smart); + +//************************************************************************* +// Utilities +//************************************************************************* + +namespace utilities { + + #include + Matrix extractPoint2(const gtsam::Values& values); + Matrix extractPoint3(const gtsam::Values& values); + Matrix extractPose2(const gtsam::Values& values); + Matrix extractPose3(const gtsam::Values& values); + void perturbPoint2(gtsam::Values& values, double sigma, int seed); + void perturbPoint3(gtsam::Values& values, double sigma, int seed); + void insertBackprojections(gtsam::Values& values, const gtsam::SimpleCamera& c, Vector J, Matrix Z, double depth); + Matrix reprojectionErrors(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& values); + +} //\namespace utilities + } diff --git a/matlab.h b/matlab.h new file mode 100644 index 000000000..1a9af8396 --- /dev/null +++ b/matlab.h @@ -0,0 +1,129 @@ +/* ---------------------------------------------------------------------------- + + * 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 matlab.h + * @brief Contains *generic* global functions designed particularly for the matlab interface + * @author Stephen Williams + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace gtsam { + + namespace utilities { + + /// Extract all Point2 values into a single matrix [x y] + Matrix extractPoint2(const Values& values) { + size_t j=0; + Values::ConstFiltered points = values.filter(); + Matrix result(points.size(),2); + BOOST_FOREACH(const Values::ConstFiltered::KeyValuePair& key_value, points) + result.row(j++) = key_value.value.vector(); + return result; + } + + /// Extract all Point3 values into a single matrix [x y z] + Matrix extractPoint3(const Values& values) { + size_t j=0; + Values::ConstFiltered points = values.filter(); + Matrix result(points.size(),3); + BOOST_FOREACH(const Values::ConstFiltered::KeyValuePair& key_value, points) + result.row(j++) = key_value.value.vector(); + return result; + } + + /// Extract all Pose2 values into a single matrix [x y theta] + Matrix extractPose2(const Values& values) { + size_t j=0; + Values::ConstFiltered poses = values.filter(); + Matrix result(poses.size(),3); + BOOST_FOREACH(const Values::ConstFiltered::KeyValuePair& key_value, poses) + result.row(j++) << key_value.value.x(), key_value.value.y(), key_value.value.theta(); + return result; + } + + /// Extract all Pose3 values into a single matrix [r11 r12 r13 r21 r22 r23 r31 r32 r33 x y z] + Matrix extractPose3(const Values& values) { + size_t j=0; + Values::ConstFiltered poses = values.filter(); + Matrix result(poses.size(),12); + BOOST_FOREACH(const Values::ConstFiltered::KeyValuePair& key_value, poses) { + result.row(j).segment(0, 3) << key_value.value.rotation().matrix().row(0); + result.row(j).segment(3, 3) << key_value.value.rotation().matrix().row(1); + result.row(j).segment(6, 3) << key_value.value.rotation().matrix().row(2); + result.row(j).tail(3) = key_value.value.translation().vector(); + j++; + } + return result; + } + + + /// perturb all Point2 using normally distributed noise + void perturbPoint2(Values& values, double sigma, int32_t seed = 42u) { + noiseModel::Isotropic::shared_ptr model = noiseModel::Isotropic::Sigma(2,sigma); + Sampler sampler(model, seed); + BOOST_FOREACH(const Values::ConstFiltered::KeyValuePair& key_value, values.filter()) { + values.update(key_value.key, key_value.value.retract(sampler.sample())); + } + } + + /// perturb all Point3 using normally distributed noise + void perturbPoint3(Values& values, double sigma, int32_t seed = 42u) { + noiseModel::Isotropic::shared_ptr model = noiseModel::Isotropic::Sigma(3,sigma); + Sampler sampler(model, seed); + BOOST_FOREACH(const Values::ConstFiltered::KeyValuePair& key_value, values.filter()) { + values.update(key_value.key, key_value.value.retract(sampler.sample())); + } + } + + /// insert a number of initial point values by backprojecting + void insertBackprojections(Values& values, const SimpleCamera& camera, const Vector& J, const Matrix& Z, double depth) { + if (Z.rows() != 2) throw std::invalid_argument("insertBackProjections: Z must be 2*K"); + if (Z.cols() != J.size()) throw std::invalid_argument("insertBackProjections: J and Z must have same number of entries"); + for(int k=0;k >(f)) ++K; + // now fill + Matrix errors(2,K); + BOOST_FOREACH(const NonlinearFactor::shared_ptr& f, graph) { + boost::shared_ptr > p = boost::dynamic_pointer_cast >(f); + if (p) errors.col(k++) = p->unwhitenedError(values); + } + return errors; + } + + } + +} + From a13ef979870a10f90cd769006e52f7383b243e55 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 30 Jul 2012 18:34:47 +0000 Subject: [PATCH 734/914] Wrapped default-argument versions of load2D --- gtsam.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gtsam.h b/gtsam.h index 891520547..bdda534e0 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1473,6 +1473,12 @@ typedef gtsam::GenericStereoFactor GenericStereoFac #include pair load2D(string filename, gtsam::noiseModel::Diagonal* model, int maxID, bool addNoise, bool smart); +pair load2D(string filename, + gtsam::noiseModel::Diagonal* model, int maxID, bool addNoise); +pair load2D(string filename, + gtsam::noiseModel::Diagonal* model, int maxID); +pair load2D(string filename, + gtsam::noiseModel::Diagonal* model); //************************************************************************* From da1a732eff14e4c58665fea13576b3da793be56d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 30 Jul 2012 18:34:50 +0000 Subject: [PATCH 735/914] Merged duplicate Pose2SLAMExample_graph.m examples in different directories --- examples/Pose2SLAMExample_graph.m | 47 ------------------- .../gtsam_examples/Pose2SLAMExample_graph.m | 5 +- 2 files changed, 4 insertions(+), 48 deletions(-) delete mode 100644 examples/Pose2SLAMExample_graph.m diff --git a/examples/Pose2SLAMExample_graph.m b/examples/Pose2SLAMExample_graph.m deleted file mode 100644 index 65271c053..000000000 --- a/examples/Pose2SLAMExample_graph.m +++ /dev/null @@ -1,47 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 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 -% -% @brief Read graph from file and perform GraphSLAM -% @author Frank Dellaert -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Initialize graph, initial estimate, and odometry noise -import gtsam.* -model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -maxID = 0; -addNoise = false; -smart = true; -[graph,initial]=load2D('Data/w100-odom.graph',model,maxID,addNoise,smart); -initial.print(sprintf('Initial estimate:\n')); - -%% Add a Gaussian prior on pose x_1 -import gtsam.* -priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin -priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); -graph.addPosePrior(0, priorMean, priorNoise); % add directly to graph - -%% Plot Initial Estimate -figure(1);clf -P=initial.poses; -plot(P(:,1),P(:,2),'g-*'); axis equal - -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -result = graph.optimize(initial,1); -P=result.poses; -hold on; plot(P(:,1),P(:,2),'b-*') -result.print(sprintf('\nFinal result:\n')); - -%% Plot Covariance Ellipses -marginals = graph.marginals(result); -P={}; -for i=1:result.size()-1 - pose_i = result.pose(i); - P{i}=marginals.marginalCovariance(i); - plotPose2(pose_i,'b',P{i}) -end -fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file diff --git a/matlab/gtsam_examples/Pose2SLAMExample_graph.m b/matlab/gtsam_examples/Pose2SLAMExample_graph.m index 980a11cfa..cc8b38cdb 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_graph.m @@ -16,7 +16,10 @@ datafile = gtsam_utils.findExampleDataFile('w100-odom.graph'); %% Initialize graph, initial estimate, and odometry noise import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -[graph,initial] = gtsam_utils.load2D(datafile, model); +maxID = 0; +addNoise = false; +smart = true; +[graph,initial] = gtsam.load2D(datafile, model, maxID, addNoise, smart); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 From 305ab998fc1351a384554d63e7dabc0b566fc0bc Mon Sep 17 00:00:00 2001 From: Kyel Ok Date: Mon, 30 Jul 2012 20:16:54 +0000 Subject: [PATCH 736/914] wrapped dist() for Point2 --- gtsam.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gtsam.h b/gtsam.h index 5a331f1e0..42a419230 100644 --- a/gtsam.h +++ b/gtsam.h @@ -184,12 +184,13 @@ virtual class Point2 : gtsam::Value { // Lie Group static gtsam::Point2 Expmap(Vector v); - static Vector Logmap(const gtsam::Point2& p); + static Vector Logmap(const gtsam::Point2& p); // Standard Interface double x() const; - double y() const; + double y() const; Vector vector() const; + double dist(const gtsam::Point2& p2) const; }; virtual class StereoPoint2 : gtsam::Value { From fd4f11d21e4f38b364e742075431799811175225 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 30 Jul 2012 21:19:24 +0000 Subject: [PATCH 737/914] Wrapped per-variable thresholds for iSAM2 --- gtsam.h | 23 +++++++++++++++++++++-- gtsam/nonlinear/ISAM2.h | 7 +++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/gtsam.h b/gtsam.h index 42a419230..dc2f8363a 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1247,6 +1247,26 @@ class ISAM2DoglegParams { void setVerbose(bool verbose); }; +class ISAM2ThresholdMapValue { + ISAM2ThresholdMapValue(char c, Vector thresholds); + ISAM2ThresholdMapValue(const gtsam::ISAM2ThresholdMapValue& other); +}; + +class ISAM2ThresholdMap { + ISAM2ThresholdMap(); + ISAM2ThresholdMap(const gtsam::ISAM2ThresholdMap& other); + + // Note: no print function + + // common STL methods + size_t size() const; + bool empty() const; + void clear(); + + // structure specific methods + void insert(const gtsam::ISAM2ThresholdMapValue& value) const; +}; + class ISAM2Params { ISAM2Params(); @@ -1256,8 +1276,7 @@ class ISAM2Params { void setOptimizationParams(const gtsam::ISAM2GaussNewtonParams& params); void setOptimizationParams(const gtsam::ISAM2DoglegParams& params); void setRelinearizeThreshold(double relinearizeThreshold); - // TODO: wrap this - //void setRelinearizeThreshold(const FastMap& relinearizeThreshold); + void setRelinearizeThreshold(const gtsam::ISAM2ThresholdMap& relinearizeThreshold); int getRelinearizeSkip() const; void setRelinearizeSkip(int relinearizeSkip); bool isEnableRelinearization() const; diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index ab94e60f0..52e5bccef 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -98,6 +98,8 @@ struct ISAM2DoglegParams { * @addtogroup ISAM2 * Parameters for the ISAM2 algorithm. Default parameter values are listed below. */ +typedef FastMap ISAM2ThresholdMap; +typedef ISAM2ThresholdMap::value_type ISAM2ThresholdMapValue; struct ISAM2Params { typedef boost::variant OptimizationParams; ///< Either ISAM2GaussNewtonParams or ISAM2DoglegParams typedef boost::variant > RelinearizationThreshold; ///< Either a constant relinearization threshold or a per-variable-type set of thresholds @@ -189,7 +191,12 @@ struct ISAM2Params { if(relinearizeThreshold.type() == typeid(double)) std::cout << "relinearizeThreshold: " << boost::get(relinearizeThreshold) << "\n"; else + { std::cout << "relinearizeThreshold: " << "{mapped}" << "\n"; + BOOST_FOREACH(const ISAM2ThresholdMapValue& value, boost::get(relinearizeThreshold)) { + std::cout << " '" << value.first << "' -> [" << value.second.transpose() << " ]\n"; + } + } std::cout << "relinearizeSkip: " << relinearizeSkip << "\n"; std::cout << "enableRelinearization: " << enableRelinearization << "\n"; std::cout << "evaluateNonlinearError: " << evaluateNonlinearError << "\n"; From 483e2ec9592f56bc47a1c0682abc93fd0c58f206 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 1 Aug 2012 13:42:38 +0000 Subject: [PATCH 738/914] Converted VariableIndex to use a deque instead of a vector. The deque performs incremental memory allocation, resulting in a significant speed improvement in iSAM2. --- gtsam/inference/VariableIndex.cpp | 2 +- gtsam/inference/VariableIndex.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gtsam/inference/VariableIndex.cpp b/gtsam/inference/VariableIndex.cpp index 4e5eb8649..b24e2f5fc 100644 --- a/gtsam/inference/VariableIndex.cpp +++ b/gtsam/inference/VariableIndex.cpp @@ -68,7 +68,7 @@ void VariableIndex::outputMetisFormat(ostream& os) const { /* ************************************************************************* */ void VariableIndex::permuteInPlace(const Permutation& permutation) { // Create new index and move references to data into it in permuted order - vector newIndex(this->size()); + deque newIndex(this->size()); for(Index i = 0; i < newIndex.size(); ++i) newIndex[i].swap(this->index_[permutation[i]]); diff --git a/gtsam/inference/VariableIndex.h b/gtsam/inference/VariableIndex.h index 739067dd2..d747d1122 100644 --- a/gtsam/inference/VariableIndex.h +++ b/gtsam/inference/VariableIndex.h @@ -18,6 +18,7 @@ #pragma once #include +#include #include #include @@ -33,7 +34,7 @@ namespace gtsam { * factor graph. The factor graph stores a collection of factors, each of * which involves a set of variables. In contrast, the VariableIndex is built * from a factor graph prior to elimination, and stores the list of factors - * that involve each variable. This information is stored as a vector of + * that involve each variable. This information is stored as a deque of * lists of factor indices. * \nosubgrouping */ @@ -46,7 +47,7 @@ public: typedef Factors::const_iterator Factor_const_iterator; protected: - std::vector index_; + std::deque index_; size_t nFactors_; // Number of factors in the original factor graph. size_t nEntries_; // Sum of involved variable counts of each factor. From 98aa3b06273ecd87074c881face60c765c3643fb Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 1 Aug 2012 21:07:50 +0000 Subject: [PATCH 739/914] In BayesTree, return a const reference to the 'nodes' structure, instead of a copy --- gtsam/inference/BayesTree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 7391e9a10..34e5c0c45 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -202,7 +202,7 @@ namespace gtsam { } /** return nodes */ - Nodes nodes() const { return nodes_; } + const Nodes& nodes() const { return nodes_; } /** return root clique */ const sharedClique& root() const { return root_; } From 1a8dc9bdcc11eed010279280588863ee4070803e Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 1 Aug 2012 21:31:19 +0000 Subject: [PATCH 740/914] Only execute the RemoveVariables code in iSAM2 if there actually are variables to remove. --- gtsam/nonlinear/ISAM2.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index 16a3ca7b5..b09133c4d 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -747,17 +747,20 @@ ISAM2Result ISAM2::update( // After the top of the tree has been redone and may have index gaps from // unused keys, condense the indices to remove gaps by rearranging indices // in all data structures. - Impl::RemoveVariables(unusedKeys, root_, theta_, variableIndex_, delta_, deltaNewton_, RgProd_, - deltaReplacedMask_, ordering_, Base::nodes_, linearFactors_); - + if(!unusedKeys.empty()) { + tic(10,"remove variables"); + Impl::RemoveVariables(unusedKeys, root_, theta_, variableIndex_, delta_, deltaNewton_, RgProd_, + deltaReplacedMask_, ordering_, Base::nodes_, linearFactors_); + toc(10,"remove variables"); + } result.cliques = this->nodes().size(); deltaDoglegUptodate_ = false; deltaUptodate_ = false; - tic(10,"evaluate error after"); + tic(11,"evaluate error after"); if(params_.evaluateNonlinearError) result.errorAfter.reset(nonlinearFactors_.error(calculateEstimate())); - toc(10,"evaluate error after"); + toc(11,"evaluate error after"); return result; } From cf0c5bde3a448944a3d2fc27f3e73578f0180ef4 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 2 Aug 2012 18:41:07 +0000 Subject: [PATCH 741/914] Changed helper function signature to match the actual variables used in the function call --- gtsam/linear/GaussianFactorGraph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index cd436a0b2..dafe74d0d 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -177,7 +177,7 @@ namespace gtsam { /* ************************************************************************* */ // Helper functions for Combine - static boost::tuple, size_t, size_t> countDims(const std::vector& factors, const VariableSlots& variableSlots) { + static boost::tuple, size_t, size_t> countDims(const FactorGraph& factors, const VariableSlots& variableSlots) { #ifndef NDEBUG vector varDims(variableSlots.size(), numeric_limits::max()); #else From 55adfb2082f94e4a9836a9f8fac239f0b70ef8a0 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 2 Aug 2012 18:55:35 +0000 Subject: [PATCH 742/914] Added another constructor for Cal3_S2 --- gtsam.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam.h b/gtsam.h index dc2f8363a..ddfe7dcd9 100644 --- a/gtsam.h +++ b/gtsam.h @@ -448,6 +448,7 @@ virtual class Cal3_S2 : gtsam::Value { Cal3_S2(); Cal3_S2(double fx, double fy, double s, double u0, double v0); Cal3_S2(Vector v); + Cal3_S2(double fov, int w, int h); // Testable void print(string s) const; From 93d9023a616d8fea9491d827259b745b3b5e4817 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Thu, 2 Aug 2012 19:27:36 +0000 Subject: [PATCH 743/914] added InverseDepth factor based on Montiel/Civera's paramaterization. MOntiel06rss, Civera08tro --- gtsam_unstable/slam/InvDepthCamera3.h | 179 ++++++++++++++ gtsam_unstable/slam/InvDepthFactor3.h | 111 +++++++++ .../slam/tests/testInvDepthFactor3.cpp | 223 ++++++++++++++++++ 3 files changed, 513 insertions(+) create mode 100644 gtsam_unstable/slam/InvDepthCamera3.h create mode 100644 gtsam_unstable/slam/InvDepthFactor3.h create mode 100644 gtsam_unstable/slam/tests/testInvDepthFactor3.cpp diff --git a/gtsam_unstable/slam/InvDepthCamera3.h b/gtsam_unstable/slam/InvDepthCamera3.h new file mode 100644 index 000000000..54f5c2939 --- /dev/null +++ b/gtsam_unstable/slam/InvDepthCamera3.h @@ -0,0 +1,179 @@ + +/** + * @file InvDepthCamera3.h + * @brief + * @author Chris Beall + * @date Apr 14, 2012 + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gtsam { + + /** + * A pinhole camera class that has a Pose3 and a Calibration. + * @ingroup geometry + * \nosubgrouping + */ + template + class InvDepthCamera3 { + private: + Pose3 pose_; + boost::shared_ptr k_; + + public: + + /// @name Standard Constructors + /// @{ + + /** default constructor */ + InvDepthCamera3() {} + + /** constructor with pose and calibration */ + InvDepthCamera3(const Pose3& pose, const boost::shared_ptr& k) : + pose_(pose),k_(k) {} + + /// @} + /// @name Standard Interface + /// @{ + + virtual ~InvDepthCamera3() {} + + /// return pose + inline Pose3& pose() { return pose_; } + + /// return calibration + inline const boost::shared_ptr& calibration() const { return k_; } + + /// print + void print(const std::string& s = "") const { + pose_.print("pose3"); + k_.print("calibration"); + } + + static gtsam::Point3 invDepthTo3D(const gtsam::LieVector& pw, const gtsam::LieScalar& inv) { + gtsam::Point3 ray_base(pw.vector().segment(0,3)); + double theta = pw(3), phi = pw(4); + double rho = inv.value(); // inverse depth + gtsam::Point3 m(cos(theta)*cos(phi),sin(theta)*cos(phi),sin(phi)); + return ray_base + m/rho; + } + + /** project a point from world InvDepth parameterization to the image + * @param pw is a point in the world coordinate + * @param H1 is the jacobian w.r.t. [pose3 calibration] + * @param H2 is the jacobian w.r.t. inv_depth_landmark + */ + inline gtsam::Point2 project(const gtsam::LieVector& pw, + const gtsam::LieScalar& inv_depth, + boost::optional H1 = boost::none, + boost::optional H2 = boost::none, + boost::optional H3 = boost::none) const { + + gtsam::Point3 ray_base(pw.vector().segment(0,3)); + double theta = pw(3), phi = pw(4); + double rho = inv_depth.value(); // inverse depth + gtsam::Point3 m(cos(theta)*cos(phi),sin(theta)*cos(phi),sin(phi)); + const gtsam::Point3 landmark = ray_base + m/rho; + + gtsam::PinholeCamera camera(pose_, *k_); + + if (!H1 && !H2 && !H3) { + gtsam::Point2 uv= camera.project(landmark); + return uv; + } + else { + gtsam::Matrix J2; + gtsam::Point2 uv= camera.project(landmark,H1, J2); + if (H1) { + *H1 = (*H1) * gtsam::eye(6); + } + + double cos_theta = cos(theta); + double sin_theta = sin(theta); + double cos_phi = cos(phi); + double sin_phi = sin(phi); + double rho2 = rho * rho; + + if (H2) { + double H11 = 1; + double H12 = 0; + double H13 = 0; + double H14 = -cos_phi*sin_theta/rho; + double H15 = -cos_theta*sin_phi/rho; + + double H21 = 0; + double H22 = 1; + double H23 = 0; + double H24 = cos_phi*cos_theta/rho; + double H25 = -sin_phi*sin_theta/rho; + + double H31 = 0; + double H32 = 0; + double H33 = 1; + double H34 = 0; + double H35 = cos_phi/rho; + + *H2 = J2 * gtsam::Matrix_(3,5, + H11, H12, H13, H14, H15, + H21, H22, H23, H24, H25, + H31, H32, H33, H34, H35); + } + if(H3) { + double H16 = -cos_phi*cos_theta/rho2; + double H26 = -cos_phi*sin_theta/rho2; + double H36 = -sin_phi/rho2; + *H3 = J2 * gtsam::Matrix_(3,1, + H16, + H26, + H36); + } + return uv; + } + } + + /** + * backproject a 2-dimensional point to an Inverse Depth landmark + * useful for point initialization + */ + + inline std::pair backproject(const gtsam::Point2& pi, const double depth) const { + const gtsam::Point2 pn = k_->calibrate(pi); + gtsam::Point3 pc(pn.x(), pn.y(), 1.0); + pc = pc/pc.norm(); + gtsam::Point3 pw = pose_.transform_from(pc); + const gtsam::Point3& pt = pose_.translation(); + gtsam::Point3 ray = pw - pt; + double theta = atan2(ray.y(), ray.x()); // longitude + double phi = atan2(ray.z(), sqrt(ray.x()*ray.x()+ray.y()*ray.y())); + return std::make_pair(gtsam::LieVector(5, pt.x(),pt.y(),pt.z(), theta, phi), + gtsam::LieScalar(1./depth)); + } + +private: + + /// @} + /// @name Advanced Interface + /// @{ + + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int version) { + ar & BOOST_SERIALIZATION_NVP(pose_); + ar & BOOST_SERIALIZATION_NVP(k_); + } + /// @} + }; +} diff --git a/gtsam_unstable/slam/InvDepthFactor3.h b/gtsam_unstable/slam/InvDepthFactor3.h new file mode 100644 index 000000000..17875e80d --- /dev/null +++ b/gtsam_unstable/slam/InvDepthFactor3.h @@ -0,0 +1,111 @@ + +/** + * @file InvDepthFactor3.h + * @brief Inverse Depth Factor + * @author Chris Beall + */ + +#pragma once + +#include +#include +#include +#include + +namespace gtsam { + + template + class InvDepthFactor3: public gtsam::NoiseModelFactor3 { + protected: + + // Keep a copy of measurement and calibration for I/O + gtsam::Point2 measured_; ///< 2D measurement + boost::shared_ptr K_; ///< shared pointer to calibration object + + public: + + /// shorthand for base class type + typedef gtsam::NoiseModelFactor3 Base; + + /// shorthand for this class + typedef InvDepthFactor3 This; + + /// shorthand for a smart pointer to a factor + typedef boost::shared_ptr shared_ptr; + + /// Default constructor + InvDepthFactor3() : K_(new gtsam::Cal3_S2(444, 555, 666, 777, 888)) {} + + /** + * Constructor + * TODO: Mark argument order standard (keys, measurement, parameters) + * @param z is the 2 dimensional location of point in image (the measurement) + * @param model is the standard deviation + * @param j_pose is basically the frame number + * @param j_landmark is the index of the landmark + * @param K shared pointer to the constant calibration + */ + InvDepthFactor3(const gtsam::Point2& measured, const gtsam::SharedNoiseModel& model, + const gtsam::Key poseKey, gtsam::Key pointKey, gtsam::Key invDepthKey, const gtsam::shared_ptrK& K) : + Base(model, poseKey, pointKey, invDepthKey), measured_(measured), K_(K) {} + + /** Virtual destructor */ + virtual ~InvDepthFactor3() {} + + /** + * print + * @param s optional string naming the factor + */ + void print(const std::string& s = "InvDepthFactor3", + const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const { + Base::print(s, keyFormatter); + measured_.print(s + ".z"); + } + + /// equals + virtual bool equals(const gtsam::NonlinearFactor& p, double tol = 1e-9) const { + const This *e = dynamic_cast(&p); + return e && Base::equals(p, tol) && this->measured_.equals(e->measured_, tol) && this->K_->equals(*e->K_, tol); + } + + /// Evaluate error h(x)-z and optionally derivatives + gtsam::Vector evaluateError(const POSE& pose, const gtsam::LieVector& point, const INVDEPTH& invDepth, + boost::optional H1=boost::none, + boost::optional H2=boost::none, + boost::optional H3=boost::none) const { + try { + InvDepthCamera3 camera(pose, K_); + gtsam::Point2 reprojectionError(camera.project(point, invDepth, H1, H2, H3) - measured_); + return reprojectionError.vector(); + } catch( CheiralityException& e) { + if (H1) *H1 = gtsam::zeros(2,6); + if (H2) *H2 = gtsam::zeros(2,5); + if (H3) *H2 = gtsam::zeros(2,1); + std::cout << e.what() << ": Landmark "<< DefaultKeyFormatter(this->key2()) << + " moved behind camera " << DefaultKeyFormatter(this->key1()) << std::endl; + return gtsam::ones(2) * 2.0 * K_->fx(); + } + } + + /** return the measurement */ + const gtsam::Point2& imagePoint() const { + return measured_; + } + + /** return the calibration object */ + inline const gtsam::Cal3_S2::shared_ptr calibration() const { + return K_; + } + + private: + + /// Serialization function + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base); + ar & BOOST_SERIALIZATION_NVP(measured_); + ar & BOOST_SERIALIZATION_NVP(K_); + } + }; +} // \ namespace gtsam diff --git a/gtsam_unstable/slam/tests/testInvDepthFactor3.cpp b/gtsam_unstable/slam/tests/testInvDepthFactor3.cpp new file mode 100644 index 000000000..11986fc6a --- /dev/null +++ b/gtsam_unstable/slam/tests/testInvDepthFactor3.cpp @@ -0,0 +1,223 @@ +/* + * testInvDepthFactor.cpp + * + * Created on: Apr 13, 2012 + * Author: cbeall3 + */ + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace gtsam; + +/* ************************************************************************* */ +static Cal3_S2::shared_ptr K(new Cal3_S2(1500, 1200, 0, 640, 480)); +Pose3 level_pose = Pose3(Rot3::ypr(-M_PI/2, 0., -M_PI/2), gtsam::Point3(0,0,1)); +SimpleCamera level_camera(level_pose, *K); + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project1) { + + // landmark 5 meters infront of camera + Point3 landmark(5, 0, 1); + + Point2 expected_uv = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector inv_landmark(5, 1., 0., 1., 0., 0.); + LieScalar inv_depth(1./4); + Point2 actual_uv = inv_camera.project(inv_landmark, inv_depth); + CHECK(assert_equal(expected_uv, actual_uv)); + CHECK(assert_equal(Point2(640,480), actual_uv)); + +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project2) { + + // landmark 1m to the left and 1m up from camera + // inv landmark xyz is same as camera xyz, so depth actually doesn't matter + Point3 landmark(1, 1, 2); + Point2 expected = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector diag_landmark(5, 0., 0., 1., M_PI/4., atan(1/sqrt(2))); + LieScalar inv_depth(1/sqrt(3)); + Point2 actual = inv_camera.project(diag_landmark, inv_depth); + CHECK(assert_equal(expected, actual)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project3) { + + // landmark 1m to the left and 1m up from camera + // inv depth landmark xyz at origion + Point3 landmark(1, 1, 2); + Point2 expected = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector diag_landmark(5, 0., 0., 0., M_PI/4., atan(2./sqrt(2))); + LieScalar inv_depth( 1./sqrt(1+1+4)); + Point2 actual = inv_camera.project(diag_landmark, inv_depth); + CHECK(assert_equal(expected, actual)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project4) { + + // landmark 4m to the left and 1m up from camera + // inv depth landmark xyz at origion + Point3 landmark(1, 4, 2); + Point2 expected = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector diag_landmark(5, 0., 0., 0., atan(4/1), atan(2./sqrt(1+16))); + LieScalar inv_depth(1./sqrt(1+16+4)); + Point2 actual = inv_camera.project(diag_landmark, inv_depth); + CHECK(assert_equal(expected, actual)); +} + + +/* ************************************************************************* */ +Point2 project_(const Pose3& pose, const LieVector& landmark, const LieScalar& inv_depth) { + return InvDepthCamera3(pose,K).project(landmark, inv_depth); } + +TEST( InvDepthFactor, Dproject_pose) +{ + LieVector landmark(6,0.1,0.2,0.3, 0.1,0.2); + LieScalar inv_depth(1./4); + Matrix expected = numericalDerivative31(project_,level_pose, landmark, inv_depth); + InvDepthCamera3 inv_camera(level_pose,K); + Matrix actual; + Point2 uv = inv_camera.project(landmark, inv_depth, actual, boost::none, boost::none); + CHECK(assert_equal(expected,actual,1e-6)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Dproject_landmark) +{ + LieVector landmark(5,0.1,0.2,0.3, 0.1,0.2); + LieScalar inv_depth(1./4); + Matrix expected = numericalDerivative32(project_,level_pose, landmark, inv_depth); + InvDepthCamera3 inv_camera(level_pose,K); + Matrix actual; + Point2 uv = inv_camera.project(landmark, inv_depth, boost::none, actual, boost::none); + CHECK(assert_equal(expected,actual,1e-7)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Dproject_inv_depth) +{ + LieVector landmark(5,0.1,0.2,0.3, 0.1,0.2); + LieScalar inv_depth(1./4); + Matrix expected = numericalDerivative33(project_,level_pose, landmark, inv_depth); + InvDepthCamera3 inv_camera(level_pose,K); + Matrix actual; + Point2 uv = inv_camera.project(landmark, inv_depth, boost::none, boost::none, actual); + CHECK(assert_equal(expected,actual,1e-7)); +} + +/* ************************************************************************* */ +TEST(InvDepthFactor, backproject) +{ + LieVector expected(5,0.,0.,1., 0.1,0.2); + LieScalar inv_depth(1./4); + InvDepthCamera3 inv_camera(level_pose,K); + Point2 z = inv_camera.project(expected, inv_depth); + + LieVector actual_vec; + LieScalar actual_inv; + boost::tie(actual_vec, actual_inv) = inv_camera.backproject(z, 4); + CHECK(assert_equal(expected,actual_vec,1e-7)); + CHECK(assert_equal(inv_depth,actual_inv,1e-7)); +} + +/* ************************************************************************* */ +TEST(InvDepthFactor, backproject2) +{ + // backwards facing camera + LieVector expected(5,-5.,-5.,2., 3., -0.1); + LieScalar inv_depth(1./10); + InvDepthCamera3 inv_camera(Pose3(Rot3::ypr(1.5,0.1, -1.5), Point3(-5, -5, 2)),K); + Point2 z = inv_camera.project(expected, inv_depth); + + LieVector actual_vec; + LieScalar actual_inv; + boost::tie(actual_vec, actual_inv) = inv_camera.backproject(z, 10); + CHECK(assert_equal(expected,actual_vec,1e-7)); + CHECK(assert_equal(inv_depth,actual_inv,1e-7)); +} + +static SharedNoiseModel sigma(noiseModel::Unit::Create(2)); +typedef InvDepthFactor3 InverseDepthFactor; +typedef NonlinearEquality PoseConstraint; + +/* ************************************************************************* */ +TEST( InvDepthFactor, optimize) { + + // landmark 5 meters infront of camera + Point3 landmark(5, 0, 1); + + Point2 expected_uv = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector inv_landmark(5, 1., 0., 1., 0., 0.); + LieScalar inv_depth(1./4); + + gtsam::NonlinearFactorGraph graph; + Values initial; + + InverseDepthFactor::shared_ptr factor(new InverseDepthFactor(expected_uv, sigma, + Symbol('x',1), Symbol('l',1), Symbol('d',1), K)); + graph.push_back(factor); + graph.add(PoseConstraint(Symbol('x',1),level_pose)); + initial.insert(Symbol('x',1), level_pose); + initial.insert(Symbol('l',1), inv_landmark); + initial.insert(Symbol('d',1), inv_depth); + + LevenbergMarquardtParams lmParams; + Values result = LevenbergMarquardtOptimizer(graph, initial, lmParams).optimize(); + CHECK(assert_equal(initial, result, 1e-9)); + + /// Add a second camera + + // add a camera 1 meter to the right + Pose3 right_pose = level_pose * Pose3(Rot3(), Point3(2,0,0)); + SimpleCamera right_camera(right_pose, *K); + + InvDepthCamera3 right_inv_camera(right_pose, K); + + Point3 landmark1(6,0,1); + Point2 right_uv = right_camera.project(landmark1); + + + InverseDepthFactor::shared_ptr factor1(new InverseDepthFactor(right_uv, sigma, + Symbol('x',2), Symbol('l',1),Symbol('d',1),K)); + graph.push_back(factor1); + + graph.add(PoseConstraint(Symbol('x',2),right_pose)); + + initial.insert(Symbol('x',2), right_pose); + + // TODO: need to add priors to make this work with +// Values result2 = optimize(graph, initial, +// NonlinearOptimizationParameters(),MULTIFRONTAL, GN); + + Values result2 = LevenbergMarquardtOptimizer(graph, initial, lmParams).optimize(); + Point3 l1_result2 = InvDepthCamera3::invDepthTo3D( + result2.at(Symbol('l',1)), + result2.at(Symbol('d',1))); + + CHECK(assert_equal(landmark1, l1_result2, 1e-9)); +} + + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr);} +/* ************************************************************************* */ From 4c836c6e3a27964d23e76314101e0f10afe797b0 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 2 Aug 2012 19:57:10 +0000 Subject: [PATCH 744/914] Wrapped Pose[Translation|Rotation]Factor --- gtsam_unstable/gtsam_unstable.h | 19 +++++++++++++- gtsam_unstable/slam/PoseRotationPrior.h | 23 ++++++++++++----- gtsam_unstable/slam/PoseTranslationPrior.h | 29 +++++++++++++++------- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index a14ad34f9..60bd833ff 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -6,6 +6,7 @@ virtual class gtsam::Value; virtual class gtsam::Point3; virtual class gtsam::Rot3; +virtual class gtsam::Pose2; virtual class gtsam::Pose3; virtual class gtsam::noiseModel::Base; virtual class gtsam::NonlinearFactor; @@ -165,5 +166,21 @@ virtual class DGroundConstraint : gtsam::NonlinearFactor { DGroundConstraint(size_t key, Vector constraint, const gtsam::noiseModel::Base* model); }; +//************************************************************************* +// General nonlinear factor types +//************************************************************************* +#include -}///\namespace gtsam +#include +template +virtual class PoseTranslationPrior : gtsam::NonlinearFactor { + PoseTranslationPrior(size_t key, const POSE& pose_z, const gtsam::noiseModel::Base* noiseModel); +}; + +#include +template +virtual class PoseRotationPrior : gtsam::NonlinearFactor { + PoseRotationPrior(size_t key, const POSE& pose_z, const gtsam::noiseModel::Base* noiseModel); +}; + +} //\namespace gtsam diff --git a/gtsam_unstable/slam/PoseRotationPrior.h b/gtsam_unstable/slam/PoseRotationPrior.h index c5f039f7f..c4a7a7de7 100644 --- a/gtsam_unstable/slam/PoseRotationPrior.h +++ b/gtsam_unstable/slam/PoseRotationPrior.h @@ -29,9 +29,23 @@ public: /** standard constructor */ PoseRotationPrior(Key key, const Rotation& rot_z, const SharedNoiseModel& model) - : Base(key, model) - { - assert(rot_z.dim() == model->dim()); + : Base(key, model) { + initialize(rot_z); + } + + /** Constructor that pulls the translation from an incoming POSE */ + PoseRotationPrior(Key key, const POSE& pose_z, const SharedNoiseModel& model) + : Base(key, model) { + initialize(pose_z.rotation()); + } + + /** get the rotation used to create the measurement */ + Rotation priorRotation() const { return Rotation::Expmap(this->prior_); } + +protected: + /** loads the underlying partial prior factor */ + void initialize(const Rotation& rot_z) { + assert(rot_z.dim() == this->noiseModel_->dim()); // Calculate the prior applied this->prior_ = Rotation::Logmap(rot_z); @@ -52,9 +66,6 @@ public: this->fillH(); } - /** get the rotation used to create the measurement */ - Rotation priorRotation() const { return Rotation::Expmap(this->prior_); } - }; } // \namespace gtsam diff --git a/gtsam_unstable/slam/PoseTranslationPrior.h b/gtsam_unstable/slam/PoseTranslationPrior.h index 0e4d34b8b..4219e3252 100644 --- a/gtsam_unstable/slam/PoseTranslationPrior.h +++ b/gtsam_unstable/slam/PoseTranslationPrior.h @@ -28,17 +28,31 @@ public: GTSAM_CONCEPT_LIE_TYPE(Translation) /** standard constructor */ - PoseTranslationPrior(Key key, const Translation& rot_z, const SharedNoiseModel& model) - : Base(key, model) - { - assert(rot_z.dim() == model->dim()); + PoseTranslationPrior(Key key, const Translation& trans_z, const SharedNoiseModel& model) + : Base(key, model) { + initialize(trans_z); + } + + /** Constructor that pulls the translation from an incoming POSE */ + PoseTranslationPrior(Key key, const POSE& pose_z, const SharedNoiseModel& model) + : Base(key, model) { + initialize(pose_z.translation()); + } + + /** get the rotation used to create the measurement */ + Translation priorTranslation() const { return Translation::Expmap(this->prior_); } + +protected: + /** loads the underlying partial prior factor */ + void initialize(const Translation& trans_z) { + assert(trans_z.dim() == this->noiseModel_->dim()); // Calculate the prior applied - this->prior_ = Translation::Logmap(rot_z); + this->prior_ = Translation::Logmap(trans_z); // Create the mask for partial prior size_t pose_dim = Pose::identity().dim(); - size_t rot_dim = rot_z.dim(); + size_t rot_dim = trans_z.dim(); // get the interval of the lie coordinates corresponding to rotation std::pair interval = Pose::translationInterval(); @@ -52,9 +66,6 @@ public: this->fillH(); } - /** get the rotation used to create the measurement */ - Translation priorTranslation() const { return Translation::Expmap(this->prior_); } - }; } // \namespace gtsam From b211c1070dd6262d63c266b1be8a630e9eb47c28 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 2 Aug 2012 20:47:16 +0000 Subject: [PATCH 745/914] Rearranged the inverse depth factor/camera, created a gtsam_unstable/geometry folder - run cmake to find the new/moved files --- .cproject | 334 ++++++++++-------- gtsam_unstable/CMakeLists.txt | 2 + gtsam_unstable/geometry/CMakeLists.txt | 22 ++ gtsam_unstable/geometry/InvDepthCamera3.h | 179 ++++++++++ .../geometry/tests/testInvDepthCamera3.cpp | 157 ++++++++ gtsam_unstable/slam/InvDepthCamera3.h | 179 ---------- gtsam_unstable/slam/InvDepthFactor3.h | 167 ++++----- .../slam/tests/testInvDepthFactor3.cpp | 147 +------- 8 files changed, 633 insertions(+), 554 deletions(-) create mode 100644 gtsam_unstable/geometry/CMakeLists.txt create mode 100644 gtsam_unstable/geometry/InvDepthCamera3.h create mode 100644 gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp delete mode 100644 gtsam_unstable/slam/InvDepthCamera3.h diff --git a/.cproject b/.cproject index 2439190b6..b09810484 100644 --- a/.cproject +++ b/.cproject @@ -309,14 +309,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -343,6 +335,7 @@ make + tests/testBayesTree.run true false @@ -350,6 +343,7 @@ make + testBinaryBayesNet.run true false @@ -397,6 +391,7 @@ make + testSymbolicBayesNet.run true false @@ -404,6 +399,7 @@ make + tests/testSymbolicFactor.run true false @@ -411,6 +407,7 @@ make + testSymbolicFactorGraph.run true false @@ -426,11 +423,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -519,22 +525,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -551,6 +541,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -575,26 +581,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -679,26 +685,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -775,6 +781,14 @@ true true + + make + -j5 + testInvDepthFactor3.run + true + true + true + make -j5 @@ -807,6 +821,14 @@ true true + + make + -j5 + testInvDepthCamera3.run + true + true + true + make -j2 @@ -953,6 +975,7 @@ make + testGraph.run true false @@ -960,6 +983,7 @@ make + testJunctionTree.run true false @@ -967,6 +991,7 @@ make + testSymbolicBayesNetB.run true false @@ -1102,6 +1127,7 @@ make + testErrors.run true false @@ -1565,7 +1591,6 @@ make - testSimulated2DOriented.run true false @@ -1605,7 +1630,6 @@ make - testSimulated2D.run true false @@ -1613,7 +1637,6 @@ make - testSimulated3D.run true false @@ -1829,7 +1852,6 @@ make - tests/testGaussianISAM2 true false @@ -1851,102 +1873,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j1 @@ -2148,6 +2074,7 @@ cpack + -G DEB true false @@ -2155,6 +2082,7 @@ cpack + -G RPM true false @@ -2162,6 +2090,7 @@ cpack + -G TGZ true false @@ -2169,6 +2098,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2310,34 +2240,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2381,6 +2375,38 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam_unstable/CMakeLists.txt b/gtsam_unstable/CMakeLists.txt index 64311cdca..c38015db9 100644 --- a/gtsam_unstable/CMakeLists.txt +++ b/gtsam_unstable/CMakeLists.txt @@ -2,6 +2,7 @@ # and also build tests set (gtsam_unstable_subdirs base + geometry discrete # linear dynamics @@ -31,6 +32,7 @@ endforeach(subdir) # assemble gtsam_unstable components set(gtsam_unstable_srcs ${base_srcs} + ${geometry_srcs} ${discrete_srcs} ${dynamics_srcs} #${linear_srcs} diff --git a/gtsam_unstable/geometry/CMakeLists.txt b/gtsam_unstable/geometry/CMakeLists.txt new file mode 100644 index 000000000..d6b6a706d --- /dev/null +++ b/gtsam_unstable/geometry/CMakeLists.txt @@ -0,0 +1,22 @@ +# Install headers +file(GLOB geometry_headers "*.h") +install(FILES ${geometry_headers} DESTINATION include/gtsam_unstable/geometry) + +# Components to link tests in this subfolder against +set(geometry_local_libs + #geometry_unstable # No sources currently, so no convenience lib + geometry + base + ccolamd +) + +set (geometry_full_libs + gtsam-static + gtsam_unstable-static) + +# Exclude tests that don't work +set (geometry_excluded_tests "") + +# Add all tests +gtsam_add_subdir_tests(geometry_unstable "${geometry_local_libs}" "${geometry_full_libs}" "${geometry_excluded_tests}") +add_dependencies(check.unstable check.geometry_unstable) diff --git a/gtsam_unstable/geometry/InvDepthCamera3.h b/gtsam_unstable/geometry/InvDepthCamera3.h new file mode 100644 index 000000000..d0b9ccd88 --- /dev/null +++ b/gtsam_unstable/geometry/InvDepthCamera3.h @@ -0,0 +1,179 @@ + +/** + * @file InvDepthCamera3.h + * @brief + * @author Chris Beall + * @date Apr 14, 2012 + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gtsam { + +/** + * A pinhole camera class that has a Pose3 and a Calibration. + * @ingroup geometry + * \nosubgrouping + */ +template +class InvDepthCamera3 { +private: + Pose3 pose_; + boost::shared_ptr k_; + +public: + + /// @name Standard Constructors + /// @{ + + /** default constructor */ + InvDepthCamera3() {} + + /** constructor with pose and calibration */ + InvDepthCamera3(const Pose3& pose, const boost::shared_ptr& k) : + pose_(pose),k_(k) {} + + /// @} + /// @name Standard Interface + /// @{ + + virtual ~InvDepthCamera3() {} + + /// return pose + inline Pose3& pose() { return pose_; } + + /// return calibration + inline const boost::shared_ptr& calibration() const { return k_; } + + /// print + void print(const std::string& s = "") const { + pose_.print("pose3"); + k_.print("calibration"); + } + + static gtsam::Point3 invDepthTo3D(const gtsam::LieVector& pw, const gtsam::LieScalar& inv) { + gtsam::Point3 ray_base(pw.vector().segment(0,3)); + double theta = pw(3), phi = pw(4); + double rho = inv.value(); // inverse depth + gtsam::Point3 m(cos(theta)*cos(phi),sin(theta)*cos(phi),sin(phi)); + return ray_base + m/rho; + } + + /** project a point from world InvDepth parameterization to the image + * @param pw is a point in the world coordinate + * @param H1 is the jacobian w.r.t. [pose3 calibration] + * @param H2 is the jacobian w.r.t. inv_depth_landmark + */ + inline gtsam::Point2 project(const gtsam::LieVector& pw, + const gtsam::LieScalar& inv_depth, + boost::optional H1 = boost::none, + boost::optional H2 = boost::none, + boost::optional H3 = boost::none) const { + + gtsam::Point3 ray_base(pw.vector().segment(0,3)); + double theta = pw(3), phi = pw(4); + double rho = inv_depth.value(); // inverse depth + gtsam::Point3 m(cos(theta)*cos(phi),sin(theta)*cos(phi),sin(phi)); + const gtsam::Point3 landmark = ray_base + m/rho; + + gtsam::PinholeCamera camera(pose_, *k_); + + if (!H1 && !H2 && !H3) { + gtsam::Point2 uv= camera.project(landmark); + return uv; + } + else { + gtsam::Matrix J2; + gtsam::Point2 uv= camera.project(landmark,H1, J2); + if (H1) { + *H1 = (*H1) * gtsam::eye(6); + } + + double cos_theta = cos(theta); + double sin_theta = sin(theta); + double cos_phi = cos(phi); + double sin_phi = sin(phi); + double rho2 = rho * rho; + + if (H2) { + double H11 = 1; + double H12 = 0; + double H13 = 0; + double H14 = -cos_phi*sin_theta/rho; + double H15 = -cos_theta*sin_phi/rho; + + double H21 = 0; + double H22 = 1; + double H23 = 0; + double H24 = cos_phi*cos_theta/rho; + double H25 = -sin_phi*sin_theta/rho; + + double H31 = 0; + double H32 = 0; + double H33 = 1; + double H34 = 0; + double H35 = cos_phi/rho; + + *H2 = J2 * gtsam::Matrix_(3,5, + H11, H12, H13, H14, H15, + H21, H22, H23, H24, H25, + H31, H32, H33, H34, H35); + } + if(H3) { + double H16 = -cos_phi*cos_theta/rho2; + double H26 = -cos_phi*sin_theta/rho2; + double H36 = -sin_phi/rho2; + *H3 = J2 * gtsam::Matrix_(3,1, + H16, + H26, + H36); + } + return uv; + } + } + + /** + * backproject a 2-dimensional point to an Inverse Depth landmark + * useful for point initialization + */ + + inline std::pair backproject(const gtsam::Point2& pi, const double depth) const { + const gtsam::Point2 pn = k_->calibrate(pi); + gtsam::Point3 pc(pn.x(), pn.y(), 1.0); + pc = pc/pc.norm(); + gtsam::Point3 pw = pose_.transform_from(pc); + const gtsam::Point3& pt = pose_.translation(); + gtsam::Point3 ray = pw - pt; + double theta = atan2(ray.y(), ray.x()); // longitude + double phi = atan2(ray.z(), sqrt(ray.x()*ray.x()+ray.y()*ray.y())); + return std::make_pair(gtsam::LieVector(5, pt.x(),pt.y(),pt.z(), theta, phi), + gtsam::LieScalar(1./depth)); + } + +private: + + /// @} + /// @name Advanced Interface + /// @{ + + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int version) { + ar & BOOST_SERIALIZATION_NVP(pose_); + ar & BOOST_SERIALIZATION_NVP(k_); + } + /// @} +}; // \class InvDepthCamera +} // \namesapce gtsam diff --git a/gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp b/gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp new file mode 100644 index 000000000..1e1dae189 --- /dev/null +++ b/gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp @@ -0,0 +1,157 @@ +/* + * testInvDepthFactor.cpp + * + * Created on: Apr 13, 2012 + * Author: cbeall3 + */ + +#include + +#include +#include +#include + +#include + +using namespace std; +using namespace gtsam; + +static Cal3_S2::shared_ptr K(new Cal3_S2(1500, 1200, 0, 640, 480)); +Pose3 level_pose = Pose3(Rot3::ypr(-M_PI/2, 0., -M_PI/2), gtsam::Point3(0,0,1)); +SimpleCamera level_camera(level_pose, *K); + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project1) { + + // landmark 5 meters infront of camera + Point3 landmark(5, 0, 1); + + Point2 expected_uv = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector inv_landmark(5, 1., 0., 1., 0., 0.); + LieScalar inv_depth(1./4); + Point2 actual_uv = inv_camera.project(inv_landmark, inv_depth); + EXPECT(assert_equal(expected_uv, actual_uv)); + EXPECT(assert_equal(Point2(640,480), actual_uv)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project2) { + + // landmark 1m to the left and 1m up from camera + // inv landmark xyz is same as camera xyz, so depth actually doesn't matter + Point3 landmark(1, 1, 2); + Point2 expected = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector diag_landmark(5, 0., 0., 1., M_PI/4., atan(1/sqrt(2))); + LieScalar inv_depth(1/sqrt(3)); + Point2 actual = inv_camera.project(diag_landmark, inv_depth); + EXPECT(assert_equal(expected, actual)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project3) { + + // landmark 1m to the left and 1m up from camera + // inv depth landmark xyz at origion + Point3 landmark(1, 1, 2); + Point2 expected = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector diag_landmark(5, 0., 0., 0., M_PI/4., atan(2./sqrt(2))); + LieScalar inv_depth( 1./sqrt(1+1+4)); + Point2 actual = inv_camera.project(diag_landmark, inv_depth); + EXPECT(assert_equal(expected, actual)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Project4) { + + // landmark 4m to the left and 1m up from camera + // inv depth landmark xyz at origion + Point3 landmark(1, 4, 2); + Point2 expected = level_camera.project(landmark); + + InvDepthCamera3 inv_camera(level_pose, K); + LieVector diag_landmark(5, 0., 0., 0., atan(4/1), atan(2./sqrt(1+16))); + LieScalar inv_depth(1./sqrt(1+16+4)); + Point2 actual = inv_camera.project(diag_landmark, inv_depth); + EXPECT(assert_equal(expected, actual)); +} + + +/* ************************************************************************* */ +Point2 project_(const Pose3& pose, const LieVector& landmark, const LieScalar& inv_depth) { + return InvDepthCamera3(pose,K).project(landmark, inv_depth); } + +TEST( InvDepthFactor, Dproject_pose) +{ + LieVector landmark(6,0.1,0.2,0.3, 0.1,0.2); + LieScalar inv_depth(1./4); + Matrix expected = numericalDerivative31(project_,level_pose, landmark, inv_depth); + InvDepthCamera3 inv_camera(level_pose,K); + Matrix actual; + Point2 uv = inv_camera.project(landmark, inv_depth, actual, boost::none, boost::none); + EXPECT(assert_equal(expected,actual,1e-6)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Dproject_landmark) +{ + LieVector landmark(5,0.1,0.2,0.3, 0.1,0.2); + LieScalar inv_depth(1./4); + Matrix expected = numericalDerivative32(project_,level_pose, landmark, inv_depth); + InvDepthCamera3 inv_camera(level_pose,K); + Matrix actual; + Point2 uv = inv_camera.project(landmark, inv_depth, boost::none, actual, boost::none); + EXPECT(assert_equal(expected,actual,1e-7)); +} + +/* ************************************************************************* */ +TEST( InvDepthFactor, Dproject_inv_depth) +{ + LieVector landmark(5,0.1,0.2,0.3, 0.1,0.2); + LieScalar inv_depth(1./4); + Matrix expected = numericalDerivative33(project_,level_pose, landmark, inv_depth); + InvDepthCamera3 inv_camera(level_pose,K); + Matrix actual; + Point2 uv = inv_camera.project(landmark, inv_depth, boost::none, boost::none, actual); + EXPECT(assert_equal(expected,actual,1e-7)); +} + +/* ************************************************************************* */ +TEST(InvDepthFactor, backproject) +{ + LieVector expected(5,0.,0.,1., 0.1,0.2); + LieScalar inv_depth(1./4); + InvDepthCamera3 inv_camera(level_pose,K); + Point2 z = inv_camera.project(expected, inv_depth); + + LieVector actual_vec; + LieScalar actual_inv; + boost::tie(actual_vec, actual_inv) = inv_camera.backproject(z, 4); + EXPECT(assert_equal(expected,actual_vec,1e-7)); + EXPECT(assert_equal(inv_depth,actual_inv,1e-7)); +} + +/* ************************************************************************* */ +TEST(InvDepthFactor, backproject2) +{ + // backwards facing camera + LieVector expected(5,-5.,-5.,2., 3., -0.1); + LieScalar inv_depth(1./10); + InvDepthCamera3 inv_camera(Pose3(Rot3::ypr(1.5,0.1, -1.5), Point3(-5, -5, 2)),K); + Point2 z = inv_camera.project(expected, inv_depth); + + LieVector actual_vec; + LieScalar actual_inv; + boost::tie(actual_vec, actual_inv) = inv_camera.backproject(z, 10); + EXPECT(assert_equal(expected,actual_vec,1e-7)); + EXPECT(assert_equal(inv_depth,actual_inv,1e-7)); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr);} +/* ************************************************************************* */ diff --git a/gtsam_unstable/slam/InvDepthCamera3.h b/gtsam_unstable/slam/InvDepthCamera3.h deleted file mode 100644 index 54f5c2939..000000000 --- a/gtsam_unstable/slam/InvDepthCamera3.h +++ /dev/null @@ -1,179 +0,0 @@ - -/** - * @file InvDepthCamera3.h - * @brief - * @author Chris Beall - * @date Apr 14, 2012 - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace gtsam { - - /** - * A pinhole camera class that has a Pose3 and a Calibration. - * @ingroup geometry - * \nosubgrouping - */ - template - class InvDepthCamera3 { - private: - Pose3 pose_; - boost::shared_ptr k_; - - public: - - /// @name Standard Constructors - /// @{ - - /** default constructor */ - InvDepthCamera3() {} - - /** constructor with pose and calibration */ - InvDepthCamera3(const Pose3& pose, const boost::shared_ptr& k) : - pose_(pose),k_(k) {} - - /// @} - /// @name Standard Interface - /// @{ - - virtual ~InvDepthCamera3() {} - - /// return pose - inline Pose3& pose() { return pose_; } - - /// return calibration - inline const boost::shared_ptr& calibration() const { return k_; } - - /// print - void print(const std::string& s = "") const { - pose_.print("pose3"); - k_.print("calibration"); - } - - static gtsam::Point3 invDepthTo3D(const gtsam::LieVector& pw, const gtsam::LieScalar& inv) { - gtsam::Point3 ray_base(pw.vector().segment(0,3)); - double theta = pw(3), phi = pw(4); - double rho = inv.value(); // inverse depth - gtsam::Point3 m(cos(theta)*cos(phi),sin(theta)*cos(phi),sin(phi)); - return ray_base + m/rho; - } - - /** project a point from world InvDepth parameterization to the image - * @param pw is a point in the world coordinate - * @param H1 is the jacobian w.r.t. [pose3 calibration] - * @param H2 is the jacobian w.r.t. inv_depth_landmark - */ - inline gtsam::Point2 project(const gtsam::LieVector& pw, - const gtsam::LieScalar& inv_depth, - boost::optional H1 = boost::none, - boost::optional H2 = boost::none, - boost::optional H3 = boost::none) const { - - gtsam::Point3 ray_base(pw.vector().segment(0,3)); - double theta = pw(3), phi = pw(4); - double rho = inv_depth.value(); // inverse depth - gtsam::Point3 m(cos(theta)*cos(phi),sin(theta)*cos(phi),sin(phi)); - const gtsam::Point3 landmark = ray_base + m/rho; - - gtsam::PinholeCamera camera(pose_, *k_); - - if (!H1 && !H2 && !H3) { - gtsam::Point2 uv= camera.project(landmark); - return uv; - } - else { - gtsam::Matrix J2; - gtsam::Point2 uv= camera.project(landmark,H1, J2); - if (H1) { - *H1 = (*H1) * gtsam::eye(6); - } - - double cos_theta = cos(theta); - double sin_theta = sin(theta); - double cos_phi = cos(phi); - double sin_phi = sin(phi); - double rho2 = rho * rho; - - if (H2) { - double H11 = 1; - double H12 = 0; - double H13 = 0; - double H14 = -cos_phi*sin_theta/rho; - double H15 = -cos_theta*sin_phi/rho; - - double H21 = 0; - double H22 = 1; - double H23 = 0; - double H24 = cos_phi*cos_theta/rho; - double H25 = -sin_phi*sin_theta/rho; - - double H31 = 0; - double H32 = 0; - double H33 = 1; - double H34 = 0; - double H35 = cos_phi/rho; - - *H2 = J2 * gtsam::Matrix_(3,5, - H11, H12, H13, H14, H15, - H21, H22, H23, H24, H25, - H31, H32, H33, H34, H35); - } - if(H3) { - double H16 = -cos_phi*cos_theta/rho2; - double H26 = -cos_phi*sin_theta/rho2; - double H36 = -sin_phi/rho2; - *H3 = J2 * gtsam::Matrix_(3,1, - H16, - H26, - H36); - } - return uv; - } - } - - /** - * backproject a 2-dimensional point to an Inverse Depth landmark - * useful for point initialization - */ - - inline std::pair backproject(const gtsam::Point2& pi, const double depth) const { - const gtsam::Point2 pn = k_->calibrate(pi); - gtsam::Point3 pc(pn.x(), pn.y(), 1.0); - pc = pc/pc.norm(); - gtsam::Point3 pw = pose_.transform_from(pc); - const gtsam::Point3& pt = pose_.translation(); - gtsam::Point3 ray = pw - pt; - double theta = atan2(ray.y(), ray.x()); // longitude - double phi = atan2(ray.z(), sqrt(ray.x()*ray.x()+ray.y()*ray.y())); - return std::make_pair(gtsam::LieVector(5, pt.x(),pt.y(),pt.z(), theta, phi), - gtsam::LieScalar(1./depth)); - } - -private: - - /// @} - /// @name Advanced Interface - /// @{ - - /** Serialization function */ - friend class boost::serialization::access; - template - void serialize(Archive & ar, const unsigned int version) { - ar & BOOST_SERIALIZATION_NVP(pose_); - ar & BOOST_SERIALIZATION_NVP(k_); - } - /// @} - }; -} diff --git a/gtsam_unstable/slam/InvDepthFactor3.h b/gtsam_unstable/slam/InvDepthFactor3.h index 17875e80d..daaf64575 100644 --- a/gtsam_unstable/slam/InvDepthFactor3.h +++ b/gtsam_unstable/slam/InvDepthFactor3.h @@ -9,103 +9,106 @@ #include #include -#include -#include +#include namespace gtsam { - template - class InvDepthFactor3: public gtsam::NoiseModelFactor3 { - protected: +/** + * Ternary factor representing a visual measurement that includes inverse depth + */ +template +class InvDepthFactor3: public gtsam::NoiseModelFactor3 { +protected: - // Keep a copy of measurement and calibration for I/O - gtsam::Point2 measured_; ///< 2D measurement - boost::shared_ptr K_; ///< shared pointer to calibration object + // Keep a copy of measurement and calibration for I/O + gtsam::Point2 measured_; ///< 2D measurement + boost::shared_ptr K_; ///< shared pointer to calibration object - public: +public: - /// shorthand for base class type - typedef gtsam::NoiseModelFactor3 Base; + /// shorthand for base class type + typedef gtsam::NoiseModelFactor3 Base; - /// shorthand for this class - typedef InvDepthFactor3 This; + /// shorthand for this class + typedef InvDepthFactor3 This; - /// shorthand for a smart pointer to a factor - typedef boost::shared_ptr shared_ptr; + /// shorthand for a smart pointer to a factor + typedef boost::shared_ptr shared_ptr; - /// Default constructor - InvDepthFactor3() : K_(new gtsam::Cal3_S2(444, 555, 666, 777, 888)) {} + /// Default constructor + InvDepthFactor3() : K_(new gtsam::Cal3_S2(444, 555, 666, 777, 888)) {} - /** - * Constructor - * TODO: Mark argument order standard (keys, measurement, parameters) - * @param z is the 2 dimensional location of point in image (the measurement) - * @param model is the standard deviation - * @param j_pose is basically the frame number - * @param j_landmark is the index of the landmark - * @param K shared pointer to the constant calibration - */ - InvDepthFactor3(const gtsam::Point2& measured, const gtsam::SharedNoiseModel& model, - const gtsam::Key poseKey, gtsam::Key pointKey, gtsam::Key invDepthKey, const gtsam::shared_ptrK& K) : - Base(model, poseKey, pointKey, invDepthKey), measured_(measured), K_(K) {} + /** + * Constructor + * TODO: Mark argument order standard (keys, measurement, parameters) + * @param z is the 2 dimensional location of point in image (the measurement) + * @param model is the standard deviation + * @param j_pose is basically the frame number + * @param j_landmark is the index of the landmark + * @param K shared pointer to the constant calibration + */ + InvDepthFactor3(const gtsam::Point2& measured, const gtsam::SharedNoiseModel& model, + const gtsam::Key poseKey, gtsam::Key pointKey, gtsam::Key invDepthKey, const gtsam::shared_ptrK& K) : + Base(model, poseKey, pointKey, invDepthKey), measured_(measured), K_(K) {} - /** Virtual destructor */ - virtual ~InvDepthFactor3() {} + /** Virtual destructor */ + virtual ~InvDepthFactor3() {} - /** - * print - * @param s optional string naming the factor - */ - void print(const std::string& s = "InvDepthFactor3", - const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const { - Base::print(s, keyFormatter); - measured_.print(s + ".z"); + /** + * print + * @param s optional string naming the factor + */ + void print(const std::string& s = "InvDepthFactor3", + const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const { + Base::print(s, keyFormatter); + measured_.print(s + ".z"); + } + + /// equals + virtual bool equals(const gtsam::NonlinearFactor& p, double tol = 1e-9) const { + const This *e = dynamic_cast(&p); + return e && Base::equals(p, tol) && this->measured_.equals(e->measured_, tol) && this->K_->equals(*e->K_, tol); + } + + /// Evaluate error h(x)-z and optionally derivatives + gtsam::Vector evaluateError(const POSE& pose, const gtsam::LieVector& point, const INVDEPTH& invDepth, + boost::optional H1=boost::none, + boost::optional H2=boost::none, + boost::optional H3=boost::none) const { + try { + InvDepthCamera3 camera(pose, K_); + gtsam::Point2 reprojectionError(camera.project(point, invDepth, H1, H2, H3) - measured_); + return reprojectionError.vector(); + } catch( CheiralityException& e) { + if (H1) *H1 = gtsam::zeros(2,6); + if (H2) *H2 = gtsam::zeros(2,5); + if (H3) *H2 = gtsam::zeros(2,1); + std::cout << e.what() << ": Landmark "<< DefaultKeyFormatter(this->key2()) << + " moved behind camera " << DefaultKeyFormatter(this->key1()) << std::endl; + return gtsam::ones(2) * 2.0 * K_->fx(); } + return gtsam::Vector_(1, 0.0); + } - /// equals - virtual bool equals(const gtsam::NonlinearFactor& p, double tol = 1e-9) const { - const This *e = dynamic_cast(&p); - return e && Base::equals(p, tol) && this->measured_.equals(e->measured_, tol) && this->K_->equals(*e->K_, tol); - } + /** return the measurement */ + const gtsam::Point2& imagePoint() const { + return measured_; + } - /// Evaluate error h(x)-z and optionally derivatives - gtsam::Vector evaluateError(const POSE& pose, const gtsam::LieVector& point, const INVDEPTH& invDepth, - boost::optional H1=boost::none, - boost::optional H2=boost::none, - boost::optional H3=boost::none) const { - try { - InvDepthCamera3 camera(pose, K_); - gtsam::Point2 reprojectionError(camera.project(point, invDepth, H1, H2, H3) - measured_); - return reprojectionError.vector(); - } catch( CheiralityException& e) { - if (H1) *H1 = gtsam::zeros(2,6); - if (H2) *H2 = gtsam::zeros(2,5); - if (H3) *H2 = gtsam::zeros(2,1); - std::cout << e.what() << ": Landmark "<< DefaultKeyFormatter(this->key2()) << - " moved behind camera " << DefaultKeyFormatter(this->key1()) << std::endl; - return gtsam::ones(2) * 2.0 * K_->fx(); - } - } + /** return the calibration object */ + inline const gtsam::Cal3_S2::shared_ptr calibration() const { + return K_; + } - /** return the measurement */ - const gtsam::Point2& imagePoint() const { - return measured_; - } +private: - /** return the calibration object */ - inline const gtsam::Cal3_S2::shared_ptr calibration() const { - return K_; - } - - private: - - /// Serialization function - friend class boost::serialization::access; - template - void serialize(ARCHIVE & ar, const unsigned int version) { - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base); - ar & BOOST_SERIALIZATION_NVP(measured_); - ar & BOOST_SERIALIZATION_NVP(K_); - } - }; + /// Serialization function + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base); + ar & BOOST_SERIALIZATION_NVP(measured_); + ar & BOOST_SERIALIZATION_NVP(K_); + } +}; } // \ namespace gtsam diff --git a/gtsam_unstable/slam/tests/testInvDepthFactor3.cpp b/gtsam_unstable/slam/tests/testInvDepthFactor3.cpp index 11986fc6a..5567bc9ce 100644 --- a/gtsam_unstable/slam/tests/testInvDepthFactor3.cpp +++ b/gtsam_unstable/slam/tests/testInvDepthFactor3.cpp @@ -5,156 +5,25 @@ * Author: cbeall3 */ -#include -#include #include + +#include #include #include #include #include +#include + using namespace std; using namespace gtsam; -/* ************************************************************************* */ static Cal3_S2::shared_ptr K(new Cal3_S2(1500, 1200, 0, 640, 480)); +static SharedNoiseModel sigma(noiseModel::Unit::Create(2)); + Pose3 level_pose = Pose3(Rot3::ypr(-M_PI/2, 0., -M_PI/2), gtsam::Point3(0,0,1)); SimpleCamera level_camera(level_pose, *K); -/* ************************************************************************* */ -TEST( InvDepthFactor, Project1) { - - // landmark 5 meters infront of camera - Point3 landmark(5, 0, 1); - - Point2 expected_uv = level_camera.project(landmark); - - InvDepthCamera3 inv_camera(level_pose, K); - LieVector inv_landmark(5, 1., 0., 1., 0., 0.); - LieScalar inv_depth(1./4); - Point2 actual_uv = inv_camera.project(inv_landmark, inv_depth); - CHECK(assert_equal(expected_uv, actual_uv)); - CHECK(assert_equal(Point2(640,480), actual_uv)); - -} - -/* ************************************************************************* */ -TEST( InvDepthFactor, Project2) { - - // landmark 1m to the left and 1m up from camera - // inv landmark xyz is same as camera xyz, so depth actually doesn't matter - Point3 landmark(1, 1, 2); - Point2 expected = level_camera.project(landmark); - - InvDepthCamera3 inv_camera(level_pose, K); - LieVector diag_landmark(5, 0., 0., 1., M_PI/4., atan(1/sqrt(2))); - LieScalar inv_depth(1/sqrt(3)); - Point2 actual = inv_camera.project(diag_landmark, inv_depth); - CHECK(assert_equal(expected, actual)); -} - -/* ************************************************************************* */ -TEST( InvDepthFactor, Project3) { - - // landmark 1m to the left and 1m up from camera - // inv depth landmark xyz at origion - Point3 landmark(1, 1, 2); - Point2 expected = level_camera.project(landmark); - - InvDepthCamera3 inv_camera(level_pose, K); - LieVector diag_landmark(5, 0., 0., 0., M_PI/4., atan(2./sqrt(2))); - LieScalar inv_depth( 1./sqrt(1+1+4)); - Point2 actual = inv_camera.project(diag_landmark, inv_depth); - CHECK(assert_equal(expected, actual)); -} - -/* ************************************************************************* */ -TEST( InvDepthFactor, Project4) { - - // landmark 4m to the left and 1m up from camera - // inv depth landmark xyz at origion - Point3 landmark(1, 4, 2); - Point2 expected = level_camera.project(landmark); - - InvDepthCamera3 inv_camera(level_pose, K); - LieVector diag_landmark(5, 0., 0., 0., atan(4/1), atan(2./sqrt(1+16))); - LieScalar inv_depth(1./sqrt(1+16+4)); - Point2 actual = inv_camera.project(diag_landmark, inv_depth); - CHECK(assert_equal(expected, actual)); -} - - -/* ************************************************************************* */ -Point2 project_(const Pose3& pose, const LieVector& landmark, const LieScalar& inv_depth) { - return InvDepthCamera3(pose,K).project(landmark, inv_depth); } - -TEST( InvDepthFactor, Dproject_pose) -{ - LieVector landmark(6,0.1,0.2,0.3, 0.1,0.2); - LieScalar inv_depth(1./4); - Matrix expected = numericalDerivative31(project_,level_pose, landmark, inv_depth); - InvDepthCamera3 inv_camera(level_pose,K); - Matrix actual; - Point2 uv = inv_camera.project(landmark, inv_depth, actual, boost::none, boost::none); - CHECK(assert_equal(expected,actual,1e-6)); -} - -/* ************************************************************************* */ -TEST( InvDepthFactor, Dproject_landmark) -{ - LieVector landmark(5,0.1,0.2,0.3, 0.1,0.2); - LieScalar inv_depth(1./4); - Matrix expected = numericalDerivative32(project_,level_pose, landmark, inv_depth); - InvDepthCamera3 inv_camera(level_pose,K); - Matrix actual; - Point2 uv = inv_camera.project(landmark, inv_depth, boost::none, actual, boost::none); - CHECK(assert_equal(expected,actual,1e-7)); -} - -/* ************************************************************************* */ -TEST( InvDepthFactor, Dproject_inv_depth) -{ - LieVector landmark(5,0.1,0.2,0.3, 0.1,0.2); - LieScalar inv_depth(1./4); - Matrix expected = numericalDerivative33(project_,level_pose, landmark, inv_depth); - InvDepthCamera3 inv_camera(level_pose,K); - Matrix actual; - Point2 uv = inv_camera.project(landmark, inv_depth, boost::none, boost::none, actual); - CHECK(assert_equal(expected,actual,1e-7)); -} - -/* ************************************************************************* */ -TEST(InvDepthFactor, backproject) -{ - LieVector expected(5,0.,0.,1., 0.1,0.2); - LieScalar inv_depth(1./4); - InvDepthCamera3 inv_camera(level_pose,K); - Point2 z = inv_camera.project(expected, inv_depth); - - LieVector actual_vec; - LieScalar actual_inv; - boost::tie(actual_vec, actual_inv) = inv_camera.backproject(z, 4); - CHECK(assert_equal(expected,actual_vec,1e-7)); - CHECK(assert_equal(inv_depth,actual_inv,1e-7)); -} - -/* ************************************************************************* */ -TEST(InvDepthFactor, backproject2) -{ - // backwards facing camera - LieVector expected(5,-5.,-5.,2., 3., -0.1); - LieScalar inv_depth(1./10); - InvDepthCamera3 inv_camera(Pose3(Rot3::ypr(1.5,0.1, -1.5), Point3(-5, -5, 2)),K); - Point2 z = inv_camera.project(expected, inv_depth); - - LieVector actual_vec; - LieScalar actual_inv; - boost::tie(actual_vec, actual_inv) = inv_camera.backproject(z, 10); - CHECK(assert_equal(expected,actual_vec,1e-7)); - CHECK(assert_equal(inv_depth,actual_inv,1e-7)); -} - -static SharedNoiseModel sigma(noiseModel::Unit::Create(2)); typedef InvDepthFactor3 InverseDepthFactor; typedef NonlinearEquality PoseConstraint; @@ -183,7 +52,7 @@ TEST( InvDepthFactor, optimize) { LevenbergMarquardtParams lmParams; Values result = LevenbergMarquardtOptimizer(graph, initial, lmParams).optimize(); - CHECK(assert_equal(initial, result, 1e-9)); + EXPECT(assert_equal(initial, result, 1e-9)); /// Add a second camera @@ -214,7 +83,7 @@ TEST( InvDepthFactor, optimize) { result2.at(Symbol('l',1)), result2.at(Symbol('d',1))); - CHECK(assert_equal(landmark1, l1_result2, 1e-9)); + EXPECT(assert_equal(landmark1, l1_result2, 1e-9)); } From f39bad0d137d56603c050d53b09e15743cfaaab6 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Fri, 3 Aug 2012 19:05:48 +0000 Subject: [PATCH 746/914] When erasing cached shortcut conditionals in the Bayes Tree, only erase the chains of shortcuts that exist instead of the whole tree. --- gtsam/inference/BayesTreeCliqueBase-inl.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/gtsam/inference/BayesTreeCliqueBase-inl.h b/gtsam/inference/BayesTreeCliqueBase-inl.h index f96566536..344f845ac 100644 --- a/gtsam/inference/BayesTreeCliqueBase-inl.h +++ b/gtsam/inference/BayesTreeCliqueBase-inl.h @@ -268,12 +268,19 @@ namespace gtsam { /* ************************************************************************* */ template void BayesTreeCliqueBase::deleteCachedShorcuts() { - //Delete CachedShortcut for this clique - this->resetCachedShortcut(); - // Recursive call over all child cliques - BOOST_FOREACH(derived_ptr& child, children_) { - child->deleteCachedShorcuts(); - } + + // When a shortcut is requested, all of the shortcuts between it and the + // root are also generated. So, if this clique's cached shortcut is set, + // recursively call over all child cliques. Otherwise, it is unnecessary. + if(cachedShortcut_) { + BOOST_FOREACH(derived_ptr& child, children_) { + child->deleteCachedShorcuts(); + } + + //Delete CachedShortcut for this clique + this->resetCachedShortcut(); + } + } } From 73d64d04a8d6ef73dbae6e846eedb92d6148ea3b Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 3 Aug 2012 19:49:26 +0000 Subject: [PATCH 747/914] Removed unused make targets, changed wrap structure for PosePartialPriors --- .cproject | 16 ---------------- gtsam_unstable/gtsam_unstable.h | 10 ++++++++-- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/.cproject b/.cproject index b09810484..f5675f5ee 100644 --- a/.cproject +++ b/.cproject @@ -2192,22 +2192,6 @@ true true - - make - -j5 - wrap_gtsam_clean - true - true - true - - - make - -j5 - wrap_gtsam_unstable_clean - true - true - true - make -j5 diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index 60bd833ff..1bb6d20e0 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -172,15 +172,21 @@ virtual class DGroundConstraint : gtsam::NonlinearFactor { #include #include -template +template virtual class PoseTranslationPrior : gtsam::NonlinearFactor { PoseTranslationPrior(size_t key, const POSE& pose_z, const gtsam::noiseModel::Base* noiseModel); }; +typedef gtsam::PoseTranslationPrior PoseTranslationPrior2D; +typedef gtsam::PoseTranslationPrior PoseTranslationPrior3D; + #include -template +template virtual class PoseRotationPrior : gtsam::NonlinearFactor { PoseRotationPrior(size_t key, const POSE& pose_z, const gtsam::noiseModel::Base* noiseModel); }; +typedef gtsam::PoseRotationPrior PoseRotationPrior2D; +typedef gtsam::PoseRotationPrior PoseRotationPrior3D; + } //\namespace gtsam From a9864dab238fa317bcdcc87ed4aed52301172204 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 3 Aug 2012 20:23:08 +0000 Subject: [PATCH 748/914] Wrapped ISAM1 --- gtsam.h | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/gtsam.h b/gtsam.h index ddfe7dcd9..023b5c6f3 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1028,15 +1028,25 @@ class InvertedOrdering { class NonlinearFactorGraph { NonlinearFactorGraph(); - void print(string s) const; - size_t size() const; - double error(const gtsam::Values& c) const; - double probPrime(const gtsam::Values& c) const; - gtsam::NonlinearFactor* at(size_t i) const; + NonlinearFactorGraph(const gtsam::NonlinearFactorGraph& graph); + + // FactorGraph + void print(string s) const; + bool equals(const gtsam::NonlinearFactorGraph& fg, double tol) const; + size_t size() const; + bool empty() const; + void remove(size_t i); + size_t nrFactors() const; void add(const gtsam::NonlinearFactor* factor); - gtsam::Ordering* orderingCOLAMD(const gtsam::Values& c) const; + gtsam::NonlinearFactor* at(size_t i) const; + + // NonlinearFactorGraph + double error(const gtsam::Values& values) const; + double probPrime(const gtsam::Values& values) const; + gtsam::Ordering* orderingCOLAMD(const gtsam::Values& values) const; // Ordering* orderingCOLAMDConstrained(const gtsam::Values& c, const std::map& constraints) const; - gtsam::GaussianFactorGraph* linearize(const gtsam::Values& c, const gtsam::Ordering& ordering) const; + gtsam::GaussianFactorGraph* linearize(const gtsam::Values& values, + const gtsam::Ordering& ordering) const; gtsam::NonlinearFactorGraph clone() const; }; @@ -1329,6 +1339,29 @@ class ISAM2 { gtsam::ISAM2Params params() const; }; +#include +class NonlinearISAM { + NonlinearISAM(); + NonlinearISAM(int reorderInterval); + void print(string s) const; + void printStats() const; + void saveGraph(string s) const; + gtsam::Values estimate() const; + Matrix marginalCovariance(size_t key) const; + int reorderInterval() const; + int reorderCounter() const; + void update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& initialValues); + void reorder_relinearize(); + void addKey(size_t key); + void setOrdering(const gtsam::Ordering& new_ordering); + + // These might be expensive as instead of a reference the wrapper will make a copy + gtsam::GaussianISAM bayesTree() const; + gtsam::Values getLinearizationPoint() const; + gtsam::Ordering getOrdering() const; + gtsam::NonlinearFactorGraph getFactorsUnsafe() const; +}; + //************************************************************************* // Nonlinear factor types //************************************************************************* From d93aac12d01cca5e9ff88b9eb0abec2e36238ddf Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 3 Aug 2012 21:02:37 +0000 Subject: [PATCH 749/914] Fixed ambiguous sqrt/atan errors --- .../geometry/tests/testInvDepthCamera3.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp b/gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp index 1e1dae189..a69410e34 100644 --- a/gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp +++ b/gtsam_unstable/geometry/tests/testInvDepthCamera3.cpp @@ -45,8 +45,8 @@ TEST( InvDepthFactor, Project2) { Point2 expected = level_camera.project(landmark); InvDepthCamera3 inv_camera(level_pose, K); - LieVector diag_landmark(5, 0., 0., 1., M_PI/4., atan(1/sqrt(2))); - LieScalar inv_depth(1/sqrt(3)); + LieVector diag_landmark(5, 0., 0., 1., M_PI/4., atan(1.0/sqrt(2.0))); + LieScalar inv_depth(1/sqrt(3.0)); Point2 actual = inv_camera.project(diag_landmark, inv_depth); EXPECT(assert_equal(expected, actual)); } @@ -60,8 +60,8 @@ TEST( InvDepthFactor, Project3) { Point2 expected = level_camera.project(landmark); InvDepthCamera3 inv_camera(level_pose, K); - LieVector diag_landmark(5, 0., 0., 0., M_PI/4., atan(2./sqrt(2))); - LieScalar inv_depth( 1./sqrt(1+1+4)); + LieVector diag_landmark(5, 0., 0., 0., M_PI/4., atan(2./sqrt(2.0))); + LieScalar inv_depth( 1./sqrt(1.0+1+4)); Point2 actual = inv_camera.project(diag_landmark, inv_depth); EXPECT(assert_equal(expected, actual)); } @@ -75,8 +75,8 @@ TEST( InvDepthFactor, Project4) { Point2 expected = level_camera.project(landmark); InvDepthCamera3 inv_camera(level_pose, K); - LieVector diag_landmark(5, 0., 0., 0., atan(4/1), atan(2./sqrt(1+16))); - LieScalar inv_depth(1./sqrt(1+16+4)); + LieVector diag_landmark(5, 0., 0., 0., atan(4.0/1), atan(2./sqrt(1.+16.))); + LieScalar inv_depth(1./sqrt(1.+16.+4.)); Point2 actual = inv_camera.project(diag_landmark, inv_depth); EXPECT(assert_equal(expected, actual)); } From 84924ad663c24333cad1f47b36c21661d580aa9c Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 3 Aug 2012 21:02:39 +0000 Subject: [PATCH 750/914] Removed remaining reference to slam namespace headers --- gtsam_unstable/slam/tests/testPosePriors.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gtsam_unstable/slam/tests/testPosePriors.cpp b/gtsam_unstable/slam/tests/testPosePriors.cpp index 4aa835266..1a40dd335 100644 --- a/gtsam_unstable/slam/tests/testPosePriors.cpp +++ b/gtsam_unstable/slam/tests/testPosePriors.cpp @@ -9,12 +9,12 @@ #include +#include +#include + #include #include -#include -#include - #include using namespace gtsam; From 061b6ddc08ba41541860a28a5cff515e67dd16c4 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 3 Aug 2012 21:02:45 +0000 Subject: [PATCH 751/914] Moved all in gtsam_utils to gtsam namespace --- matlab/{+gtsam_utils => +gtsam}/CHECK.m | 0 matlab/{+gtsam_utils => +gtsam}/EQUALITY.m | 0 .../VisualISAMGenerateData.m | 0 .../VisualISAMInitialize.m | 0 .../{+gtsam_utils => +gtsam}/VisualISAMPlot.m | 8 ++--- .../{+gtsam_utils => +gtsam}/VisualISAMStep.m | 0 matlab/{+gtsam_utils => +gtsam}/circlePose2.m | 0 matlab/{+gtsam_utils => +gtsam}/circlePose3.m | 0 .../covarianceEllipse.m | 0 .../covarianceEllipse3D.m | 0 .../findExampleDataFile.m | 0 matlab/{+gtsam_utils => +gtsam}/load3D.m | 0 .../{+gtsam_utils => +gtsam}/plot2DPoints.m | 4 +-- .../plot2DTrajectory.m | 4 +-- .../{+gtsam_utils => +gtsam}/plot3DPoints.m | 4 +-- .../plot3DTrajectory.m | 4 +-- matlab/{+gtsam_utils => +gtsam}/plotCamera.m | 0 matlab/{+gtsam_utils => +gtsam}/plotPoint2.m | 2 +- matlab/{+gtsam_utils => +gtsam}/plotPoint3.m | 2 +- matlab/{+gtsam_utils => +gtsam}/plotPose2.m | 2 +- matlab/{+gtsam_utils => +gtsam}/plotPose3.m | 2 +- matlab/+gtsam_utils/load2D.m | 31 ------------------- matlab/CMakeLists.txt | 2 +- matlab/gtsam_examples/LocalizationExample.m | 2 +- matlab/gtsam_examples/OdometryExample.m | 2 +- matlab/gtsam_examples/PlanarSLAMExample.m | 4 +-- .../PlanarSLAMExample_sampling.m | 6 ++-- matlab/gtsam_examples/Pose2SLAMExample.m | 2 +- .../gtsam_examples/Pose2SLAMExample_circle.m | 6 ++-- .../gtsam_examples/Pose2SLAMExample_graph.m | 8 ++--- matlab/gtsam_examples/Pose3SLAMExample.m | 6 ++-- .../gtsam_examples/Pose3SLAMExample_graph.m | 10 +++--- matlab/gtsam_examples/SBAExample.m | 2 +- matlab/gtsam_examples/SFMExample.m | 6 ++-- matlab/gtsam_examples/StereoVOExample.m | 6 ++-- matlab/gtsam_examples/StereoVOExample_large.m | 12 +++---- matlab/gtsam_examples/VisualISAMExample.m | 10 +++--- matlab/gtsam_examples/VisualISAM_gui.m | 14 ++++----- matlab/gtsam_tests/testJacobianFactor.m | 1 - matlab/gtsam_tests/testKalmanFilter.m | 8 ++--- matlab/gtsam_tests/testLocalizationExample.m | 1 - matlab/gtsam_tests/testOdometryExample.m | 2 +- matlab/gtsam_tests/testPlanarSLAMExample.m | 1 - matlab/gtsam_tests/testPose2SLAMExample.m | 1 - matlab/gtsam_tests/testPose3SLAMExample.m | 1 - matlab/gtsam_tests/testSFMExample.m | 2 -- matlab/gtsam_tests/testStereoVOExample.m | 1 - matlab/gtsam_tests/testVisualISAMExample.m | 6 ++-- 48 files changed, 73 insertions(+), 112 deletions(-) rename matlab/{+gtsam_utils => +gtsam}/CHECK.m (100%) rename matlab/{+gtsam_utils => +gtsam}/EQUALITY.m (100%) rename matlab/{+gtsam_utils => +gtsam}/VisualISAMGenerateData.m (100%) rename matlab/{+gtsam_utils => +gtsam}/VisualISAMInitialize.m (100%) rename matlab/{+gtsam_utils => +gtsam}/VisualISAMPlot.m (86%) rename matlab/{+gtsam_utils => +gtsam}/VisualISAMStep.m (100%) rename matlab/{+gtsam_utils => +gtsam}/circlePose2.m (100%) rename matlab/{+gtsam_utils => +gtsam}/circlePose3.m (100%) rename matlab/{+gtsam_utils => +gtsam}/covarianceEllipse.m (100%) rename matlab/{+gtsam_utils => +gtsam}/covarianceEllipse3D.m (100%) rename matlab/{+gtsam_utils => +gtsam}/findExampleDataFile.m (100%) rename matlab/{+gtsam_utils => +gtsam}/load3D.m (100%) rename matlab/{+gtsam_utils => +gtsam}/plot2DPoints.m (88%) rename matlab/{+gtsam_utils => +gtsam}/plot2DTrajectory.m (93%) rename matlab/{+gtsam_utils => +gtsam}/plot3DPoints.m (88%) rename matlab/{+gtsam_utils => +gtsam}/plot3DTrajectory.m (91%) rename matlab/{+gtsam_utils => +gtsam}/plotCamera.m (100%) rename matlab/{+gtsam_utils => +gtsam}/plotPoint2.m (76%) rename matlab/{+gtsam_utils => +gtsam}/plotPoint3.m (80%) rename matlab/{+gtsam_utils => +gtsam}/plotPose2.m (84%) rename matlab/{+gtsam_utils => +gtsam}/plotPose3.m (94%) delete mode 100644 matlab/+gtsam_utils/load2D.m diff --git a/matlab/+gtsam_utils/CHECK.m b/matlab/+gtsam/CHECK.m similarity index 100% rename from matlab/+gtsam_utils/CHECK.m rename to matlab/+gtsam/CHECK.m diff --git a/matlab/+gtsam_utils/EQUALITY.m b/matlab/+gtsam/EQUALITY.m similarity index 100% rename from matlab/+gtsam_utils/EQUALITY.m rename to matlab/+gtsam/EQUALITY.m diff --git a/matlab/+gtsam_utils/VisualISAMGenerateData.m b/matlab/+gtsam/VisualISAMGenerateData.m similarity index 100% rename from matlab/+gtsam_utils/VisualISAMGenerateData.m rename to matlab/+gtsam/VisualISAMGenerateData.m diff --git a/matlab/+gtsam_utils/VisualISAMInitialize.m b/matlab/+gtsam/VisualISAMInitialize.m similarity index 100% rename from matlab/+gtsam_utils/VisualISAMInitialize.m rename to matlab/+gtsam/VisualISAMInitialize.m diff --git a/matlab/+gtsam_utils/VisualISAMPlot.m b/matlab/+gtsam/VisualISAMPlot.m similarity index 86% rename from matlab/+gtsam_utils/VisualISAMPlot.m rename to matlab/+gtsam/VisualISAMPlot.m index 41aa49ac6..5ef64cf62 100644 --- a/matlab/+gtsam_utils/VisualISAMPlot.m +++ b/matlab/+gtsam/VisualISAMPlot.m @@ -9,7 +9,7 @@ hold on; %% Plot points % Can't use data because current frame might not see all points marginals = Marginals(isam.getFactorsUnsafe(), isam.calculateEstimate()); % TODO - this is slow -gtsam_utils.plot3DPoints(result, [], marginals); +gtsam.plot3DPoints(result, [], marginals); %% Plot cameras import gtsam.* @@ -18,13 +18,13 @@ while result.exists(symbol('x',M)) ii = symbol('x',M); pose_i = result.at(ii); if options.hardConstraint && (M==1) - gtsam_utils.plotPose3(pose_i,[],10); + gtsam.plotPose3(pose_i,[],10); else P = marginals.marginalCovariance(ii); - gtsam_utils.plotPose3(pose_i,P,10); + gtsam.plotPose3(pose_i,P,10); end if options.drawTruePoses % show ground truth - gtsam_utils.plotPose3(truth.cameras{M}.pose,[],10); + gtsam.plotPose3(truth.cameras{M}.pose,[],10); end M = M + options.cameraInterval; diff --git a/matlab/+gtsam_utils/VisualISAMStep.m b/matlab/+gtsam/VisualISAMStep.m similarity index 100% rename from matlab/+gtsam_utils/VisualISAMStep.m rename to matlab/+gtsam/VisualISAMStep.m diff --git a/matlab/+gtsam_utils/circlePose2.m b/matlab/+gtsam/circlePose2.m similarity index 100% rename from matlab/+gtsam_utils/circlePose2.m rename to matlab/+gtsam/circlePose2.m diff --git a/matlab/+gtsam_utils/circlePose3.m b/matlab/+gtsam/circlePose3.m similarity index 100% rename from matlab/+gtsam_utils/circlePose3.m rename to matlab/+gtsam/circlePose3.m diff --git a/matlab/+gtsam_utils/covarianceEllipse.m b/matlab/+gtsam/covarianceEllipse.m similarity index 100% rename from matlab/+gtsam_utils/covarianceEllipse.m rename to matlab/+gtsam/covarianceEllipse.m diff --git a/matlab/+gtsam_utils/covarianceEllipse3D.m b/matlab/+gtsam/covarianceEllipse3D.m similarity index 100% rename from matlab/+gtsam_utils/covarianceEllipse3D.m rename to matlab/+gtsam/covarianceEllipse3D.m diff --git a/matlab/+gtsam_utils/findExampleDataFile.m b/matlab/+gtsam/findExampleDataFile.m similarity index 100% rename from matlab/+gtsam_utils/findExampleDataFile.m rename to matlab/+gtsam/findExampleDataFile.m diff --git a/matlab/+gtsam_utils/load3D.m b/matlab/+gtsam/load3D.m similarity index 100% rename from matlab/+gtsam_utils/load3D.m rename to matlab/+gtsam/load3D.m diff --git a/matlab/+gtsam_utils/plot2DPoints.m b/matlab/+gtsam/plot2DPoints.m similarity index 88% rename from matlab/+gtsam_utils/plot2DPoints.m rename to matlab/+gtsam/plot2DPoints.m index b98434627..d4703a5d7 100644 --- a/matlab/+gtsam_utils/plot2DPoints.m +++ b/matlab/+gtsam/plot2DPoints.m @@ -22,9 +22,9 @@ for i = 0:keys.size-1 if isa(p, 'gtsam.Point2') if haveMarginals P = marginals.marginalCovariance(key); - gtsam_utils.plotPoint2(p, linespec, P); + gtsam.plotPoint2(p, linespec, P); else - gtsam_utils.plotPoint2(p, linespec); + gtsam.plotPoint2(p, linespec); end end end diff --git a/matlab/+gtsam_utils/plot2DTrajectory.m b/matlab/+gtsam/plot2DTrajectory.m similarity index 93% rename from matlab/+gtsam_utils/plot2DTrajectory.m rename to matlab/+gtsam/plot2DTrajectory.m index c962c993b..329026398 100644 --- a/matlab/+gtsam_utils/plot2DTrajectory.m +++ b/matlab/+gtsam/plot2DTrajectory.m @@ -31,7 +31,7 @@ for i = 0:keys.size-1 plot([ x.x; lastPose.x ], [ x.y; lastPose.y ], linespec); if haveMarginals P = marginals.marginalCovariance(lastKey); - gtsam_utils.plotPose2(lastPose, 'g', P); + gtsam.plotPose2(lastPose, 'g', P); end end lastIndex = i; @@ -43,7 +43,7 @@ if ~isempty(lastIndex) && haveMarginals lastKey = keys.at(lastIndex); lastPose = values.at(lastKey); P = marginals.marginalCovariance(lastKey); - gtsam_utils.plotPose2(lastPose, 'g', P); + gtsam.plotPose2(lastPose, 'g', P); end if ~holdstate diff --git a/matlab/+gtsam_utils/plot3DPoints.m b/matlab/+gtsam/plot3DPoints.m similarity index 88% rename from matlab/+gtsam_utils/plot3DPoints.m rename to matlab/+gtsam/plot3DPoints.m index e7a5ab0a0..8feab1744 100644 --- a/matlab/+gtsam_utils/plot3DPoints.m +++ b/matlab/+gtsam/plot3DPoints.m @@ -22,9 +22,9 @@ for i = 0:keys.size-1 if isa(p, 'gtsam.Point3') if haveMarginals P = marginals.marginalCovariance(key); - gtsam_utils.plotPoint3(p, linespec, P); + gtsam.plotPoint3(p, linespec, P); else - gtsam_utils.plotPoint3(p, linespec); + gtsam.plotPoint3(p, linespec); end end end diff --git a/matlab/+gtsam_utils/plot3DTrajectory.m b/matlab/+gtsam/plot3DTrajectory.m similarity index 91% rename from matlab/+gtsam_utils/plot3DTrajectory.m rename to matlab/+gtsam/plot3DTrajectory.m index 08b2f0daa..1cd35c22f 100644 --- a/matlab/+gtsam_utils/plot3DTrajectory.m +++ b/matlab/+gtsam/plot3DTrajectory.m @@ -28,7 +28,7 @@ for i = 0:keys.size-1 else P = []; end - gtsam_utils.plotPose3(lastPose, P, scale); + gtsam.plotPose3(lastPose, P, scale); end lastIndex = i; end @@ -43,7 +43,7 @@ if ~isempty(lastIndex) else P = []; end - gtsam_utils.plotPose3(lastPose, P, scale); + gtsam.plotPose3(lastPose, P, scale); end if ~holdstate diff --git a/matlab/+gtsam_utils/plotCamera.m b/matlab/+gtsam/plotCamera.m similarity index 100% rename from matlab/+gtsam_utils/plotCamera.m rename to matlab/+gtsam/plotCamera.m diff --git a/matlab/+gtsam_utils/plotPoint2.m b/matlab/+gtsam/plotPoint2.m similarity index 76% rename from matlab/+gtsam_utils/plotPoint2.m rename to matlab/+gtsam/plotPoint2.m index a1bc85a88..e62804ce3 100644 --- a/matlab/+gtsam_utils/plotPoint2.m +++ b/matlab/+gtsam/plotPoint2.m @@ -6,5 +6,5 @@ else plot(p.x,p.y,color); end if exist('P', 'var') - gtsam_utils.covarianceEllipse([p.x;p.y],P,color(1)); + gtsam.covarianceEllipse([p.x;p.y],P,color(1)); end \ No newline at end of file diff --git a/matlab/+gtsam_utils/plotPoint3.m b/matlab/+gtsam/plotPoint3.m similarity index 80% rename from matlab/+gtsam_utils/plotPoint3.m rename to matlab/+gtsam/plotPoint3.m index 6aafd5f21..390b44939 100644 --- a/matlab/+gtsam_utils/plotPoint3.m +++ b/matlab/+gtsam/plotPoint3.m @@ -6,7 +6,7 @@ else plot3(p.x,p.y,p.z,color); end if exist('P', 'var') - gtsam_utils.covarianceEllipse3D([p.x;p.y;p.z],P); + gtsam.covarianceEllipse3D([p.x;p.y;p.z],P); end end diff --git a/matlab/+gtsam_utils/plotPose2.m b/matlab/+gtsam/plotPose2.m similarity index 84% rename from matlab/+gtsam_utils/plotPose2.m rename to matlab/+gtsam/plotPose2.m index a9997dc2c..c7fba28ed 100644 --- a/matlab/+gtsam_utils/plotPose2.m +++ b/matlab/+gtsam/plotPose2.m @@ -9,5 +9,5 @@ quiver(pose.x,pose.y,c,s,axisLength,color); if nargin>2 pPp = P(1:2,1:2); % covariance matrix in pose coordinate frame gRp = [c -s;s c]; % rotation from pose to global - gtsam_utils.covarianceEllipse([pose.x;pose.y],gRp*pPp*gRp',color); + gtsam.covarianceEllipse([pose.x;pose.y],gRp*pPp*gRp',color); end \ No newline at end of file diff --git a/matlab/+gtsam_utils/plotPose3.m b/matlab/+gtsam/plotPose3.m similarity index 94% rename from matlab/+gtsam_utils/plotPose3.m rename to matlab/+gtsam/plotPose3.m index d24a998c8..e2c254e39 100644 --- a/matlab/+gtsam_utils/plotPose3.m +++ b/matlab/+gtsam/plotPose3.m @@ -25,7 +25,7 @@ end if (nargin>2) && (~isempty(P)) pPp = P(4:6,4:6); % covariance matrix in pose coordinate frame gPp = gRp*pPp*gRp'; % convert the covariance matrix to global coordinate frame - gtsam_utils.covarianceEllipse3D(C,gPp); + gtsam.covarianceEllipse3D(C,gPp); end end diff --git a/matlab/+gtsam_utils/load2D.m b/matlab/+gtsam_utils/load2D.m deleted file mode 100644 index c4b2e105d..000000000 --- a/matlab/+gtsam_utils/load2D.m +++ /dev/null @@ -1,31 +0,0 @@ -function [graph,initial] = load2D(filename,model) -% load2D: read TORO pose graph -% cannot read noise model from file yet, uses specified model - -import gtsam.* - -fid = fopen(filename); -if fid < 0 - error(['load2D: Cannot open file ' filename]); -end - -% scan all lines into a cell array -columns=textscan(fid,'%s','delimiter','\n'); -fclose(fid); -lines=columns{1}; - -% loop over lines and add vertices -graph = NonlinearFactorGraph; -initial = Values; -n=size(lines,1); -for i=1:n - line_i=lines{i}; - if strcmp('VERTEX2',line_i(1:7)) - v = textscan(line_i,'%s %d %f %f %f',1); - initial.insert(v{2}, Pose2(v{3}, v{4}, v{5})); - elseif strcmp('EDGE2',line_i(1:5)) - e = textscan(line_i,'%s %d %d %f %f %f',1); - graph.add(BetweenFactorPose2(e{2}, e{3}, Pose2(e{4}, e{5}, e{6}), model)); - end -end - diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index 66fa99def..b4e43d3d6 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -20,7 +20,7 @@ install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION " # Utilities message(STATUS "Installing Matlab Toolbox Utilities") -install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/+gtsam_utils" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/+gtsam" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") message(STATUS "Installing Matlab Toolbox Examples (Data)") # Data files: *.graph and *.txt diff --git a/matlab/gtsam_examples/LocalizationExample.m b/matlab/gtsam_examples/LocalizationExample.m index aad3af98c..c877c70c7 100644 --- a/matlab/gtsam_examples/LocalizationExample.m +++ b/matlab/gtsam_examples/LocalizationExample.m @@ -55,7 +55,7 @@ import gtsam.* cla; hold on; -gtsam_utils.plot2DTrajectory(result, [], Marginals(graph, result)); +gtsam.plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/gtsam_examples/OdometryExample.m b/matlab/gtsam_examples/OdometryExample.m index e47becda5..b913b187a 100644 --- a/matlab/gtsam_examples/OdometryExample.m +++ b/matlab/gtsam_examples/OdometryExample.m @@ -52,7 +52,7 @@ import gtsam.* cla; hold on; -gtsam_utils.plot2DTrajectory(result, [], Marginals(graph, result)); +gtsam.plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/gtsam_examples/PlanarSLAMExample.m b/matlab/gtsam_examples/PlanarSLAMExample.m index 056db501e..e37326275 100644 --- a/matlab/gtsam_examples/PlanarSLAMExample.m +++ b/matlab/gtsam_examples/PlanarSLAMExample.m @@ -72,8 +72,8 @@ import gtsam.* cla;hold on marginals = Marginals(graph, result); -gtsam_utils.plot2DTrajectory(result, [], marginals); -gtsam_utils.plot2DPoints(result, [], marginals); +gtsam.plot2DTrajectory(result, [], marginals); +gtsam.plot2DPoints(result, [], marginals); plot([result.at(i1).x; result.at(j1).x],[result.at(i1).y; result.at(j1).y], 'c-'); plot([result.at(i2).x; result.at(j1).x],[result.at(i2).y; result.at(j1).y], 'c-'); diff --git a/matlab/gtsam_examples/PlanarSLAMExample_sampling.m b/matlab/gtsam_examples/PlanarSLAMExample_sampling.m index 5604d0ddc..59c99df53 100644 --- a/matlab/gtsam_examples/PlanarSLAMExample_sampling.m +++ b/matlab/gtsam_examples/PlanarSLAMExample_sampling.m @@ -52,8 +52,8 @@ import gtsam.* cla;hold on marginals = Marginals(graph, sample); -gtsam_utils.plot2DTrajectory(sample, [], marginals); -gtsam_utils.plot2DPoints(sample, [], marginals); +gtsam.plot2DTrajectory(sample, [], marginals); +gtsam.plot2DPoints(sample, [], marginals); for j=1:2 key = symbol('l',j); @@ -73,5 +73,5 @@ N=1000; for s=1:N delta = S{2}*randn(2,1); proposedPoint = Point2(point{2}.x+delta(1),point{2}.y+delta(2)); - gtsam_utils.plotPoint2(proposedPoint,'k.') + gtsam.plotPoint2(proposedPoint,'k.') end \ No newline at end of file diff --git a/matlab/gtsam_examples/Pose2SLAMExample.m b/matlab/gtsam_examples/Pose2SLAMExample.m index a8ad32254..fccacc894 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample.m +++ b/matlab/gtsam_examples/Pose2SLAMExample.m @@ -68,7 +68,7 @@ hold on plot([result.at(5).x;result.at(2).x],[result.at(5).y;result.at(2).y],'r-','LineWidth',2); marginals = Marginals(graph, result); -gtsam_utils.plot2DTrajectory(result, [], marginals); +gtsam.plot2DTrajectory(result, [], marginals); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/gtsam_examples/Pose2SLAMExample_circle.m b/matlab/gtsam_examples/Pose2SLAMExample_circle.m index b40c67322..957a30df4 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample_circle.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_circle.m @@ -12,7 +12,7 @@ %% Create a hexagon of poses import gtsam.* -hexagon = gtsam_utils.circlePose2(6,1.0); +hexagon = gtsam.circlePose2(6,1.0); p0 = hexagon.at(0); p1 = hexagon.at(1); @@ -42,7 +42,7 @@ initial.insert(5, hexagon.at(5).retract([-0.1, 0.1,-0.1]')); %% Plot Initial Estimate import gtsam.* cla -gtsam_utils.plot2DTrajectory(initial, 'g*-'); axis equal +gtsam.plot2DTrajectory(initial, 'g*-'); axis equal %% optimize import gtsam.* @@ -51,7 +51,7 @@ result = optimizer.optimizeSafely; %% Show Result import gtsam.* -hold on; gtsam_utils.plot2DTrajectory(result, 'b*-'); +hold on; gtsam.plot2DTrajectory(result, 'b*-'); view(2); axis([-1.5 1.5 -1.5 1.5]); result.print(sprintf('\nFinal result:\n')); diff --git a/matlab/gtsam_examples/Pose2SLAMExample_graph.m b/matlab/gtsam_examples/Pose2SLAMExample_graph.m index cc8b38cdb..3eed090a2 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_graph.m @@ -11,7 +11,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Find data file -datafile = gtsam_utils.findExampleDataFile('w100-odom.graph'); +datafile = gtsam.findExampleDataFile('w100-odom.graph'); %% Initialize graph, initial estimate, and odometry noise import gtsam.* @@ -31,13 +31,13 @@ graph.add(PriorFactorPose2(0, priorMean, priorNoise)); % add directly to graph %% Plot Initial Estimate import gtsam.* cla -gtsam_utils.plot2DTrajectory(initial, 'g-*'); axis equal +gtsam.plot2DTrajectory(initial, 'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely; -hold on; gtsam_utils.plot2DTrajectory(result, 'b-*'); +hold on; gtsam.plot2DTrajectory(result, 'b-*'); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses @@ -47,7 +47,7 @@ P={}; for i=1:result.size()-1 pose_i = result.at(i); P{i}=marginals.marginalCovariance(i); - gtsam_utils.plotPose2(pose_i,'b',P{i}) + gtsam.plotPose2(pose_i,'b',P{i}) end view(2) axis([-15 10 -15 10]); axis equal; diff --git a/matlab/gtsam_examples/Pose3SLAMExample.m b/matlab/gtsam_examples/Pose3SLAMExample.m index bdc101b9d..b1521ff5b 100644 --- a/matlab/gtsam_examples/Pose3SLAMExample.m +++ b/matlab/gtsam_examples/Pose3SLAMExample.m @@ -12,7 +12,7 @@ %% Create a hexagon of poses import gtsam.* -hexagon = gtsam_utils.circlePose3(6,1.0); +hexagon = gtsam.circlePose3(6,1.0); p0 = hexagon.at(0); p1 = hexagon.at(1); @@ -43,7 +43,7 @@ initial.insert(5, hexagon.at(5).retract(s*randn(6,1))); %% Plot Initial Estimate import gtsam.* cla -gtsam_utils.plot3DTrajectory(initial, 'g-*'); +gtsam.plot3DTrajectory(initial, 'g-*'); %% optimize import gtsam.* @@ -52,7 +52,7 @@ result = optimizer.optimizeSafely(); %% Show Result import gtsam.* -hold on; gtsam_utils.plot3DTrajectory(result, 'b-*', true, 0.3); +hold on; gtsam.plot3DTrajectory(result, 'b-*', true, 0.3); axis([-2 2 -2 2 -1 1]); axis equal view(-37,40) diff --git a/matlab/gtsam_examples/Pose3SLAMExample_graph.m b/matlab/gtsam_examples/Pose3SLAMExample_graph.m index 574894878..19cc31439 100644 --- a/matlab/gtsam_examples/Pose3SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose3SLAMExample_graph.m @@ -16,27 +16,27 @@ N = 2500; % dataset = 'sphere2500_groundtruth.txt'; dataset = 'sphere2500.txt'; -datafile = gtsam_utils.findExampleDataFile(dataset); +datafile = gtsam.findExampleDataFile(dataset); %% Initialize graph, initial estimate, and odometry noise import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -[graph,initial]=gtsam_utils.load3D(datafile,model,true,N); +[graph,initial]=gtsam.load3D(datafile,model,true,N); %% Plot Initial Estimate import gtsam.* cla first = initial.at(0); plot3(first.x(),first.y(),first.z(),'r*'); hold on -gtsam_utils.plot3DTrajectory(initial,'g-',false); +gtsam.plot3DTrajectory(initial,'g-',false); drawnow; %% Read again, now with all constraints, and optimize import gtsam.* -graph = gtsam_utils.load3D(datafile, model, false, N); +graph = gtsam.load3D(datafile, model, false, N); graph.add(NonlinearEqualityPose3(0, first)); optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely(); -gtsam_utils.plot3DTrajectory(result, 'r-', false); axis equal; +gtsam.plot3DTrajectory(result, 'r-', false); axis equal; view(3); axis equal; \ No newline at end of file diff --git a/matlab/gtsam_examples/SBAExample.m b/matlab/gtsam_examples/SBAExample.m index 852c83fdc..7e4ac4031 100644 --- a/matlab/gtsam_examples/SBAExample.m +++ b/matlab/gtsam_examples/SBAExample.m @@ -22,7 +22,7 @@ options.nrCameras = 10; options.showImages = false; %% Generate data -[data,truth] = gtsam_utils.VisualISAMGenerateData(options); +[data,truth] = gtsam.VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; diff --git a/matlab/gtsam_examples/SFMExample.m b/matlab/gtsam_examples/SFMExample.m index 7f583b386..92eeb482b 100644 --- a/matlab/gtsam_examples/SFMExample.m +++ b/matlab/gtsam_examples/SFMExample.m @@ -22,7 +22,7 @@ options.nrCameras = 10; options.showImages = false; %% Generate data -[data,truth] = gtsam_utils.VisualISAMGenerateData(options); +[data,truth] = gtsam.VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; @@ -86,8 +86,8 @@ marginals = Marginals(graph, result); cla hold on; -gtsam_utils.plot3DPoints(result, [], marginals); -gtsam_utils.plot3DTrajectory(result, '*', 1, 8, marginals); +gtsam.plot3DPoints(result, [], marginals); +gtsam.plot3DTrajectory(result, '*', 1, 8, marginals); axis([-40 40 -40 40 -10 20]);axis equal view(3) diff --git a/matlab/gtsam_examples/StereoVOExample.m b/matlab/gtsam_examples/StereoVOExample.m index e62c4395c..94c4b3f37 100644 --- a/matlab/gtsam_examples/StereoVOExample.m +++ b/matlab/gtsam_examples/StereoVOExample.m @@ -75,6 +75,6 @@ axis equal view(-38,12) camup([0;1;0]); -gtsam_utils.plot3DTrajectory(initialEstimate, 'r', 1, 0.3); -gtsam_utils.plot3DTrajectory(result, 'g', 1, 0.3); -gtsam_utils.plot3DPoints(result); +gtsam.plot3DTrajectory(initialEstimate, 'r', 1, 0.3); +gtsam.plot3DTrajectory(result, 'g', 1, 0.3); +gtsam.plot3DPoints(result); diff --git a/matlab/gtsam_examples/StereoVOExample_large.m b/matlab/gtsam_examples/StereoVOExample_large.m index 5ae3a8fd7..850af4f80 100644 --- a/matlab/gtsam_examples/StereoVOExample_large.m +++ b/matlab/gtsam_examples/StereoVOExample_large.m @@ -13,7 +13,7 @@ %% Load calibration import gtsam.* % format: fx fy skew cx cy baseline -calib = dlmread(gtsam_utils.findExampleDataFile('VO_calibration.txt')); +calib = dlmread(gtsam.findExampleDataFile('VO_calibration.txt')); K = Cal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); @@ -26,7 +26,7 @@ initial = Values; % row format: camera_id 4x4 pose (row, major) import gtsam.* fprintf(1,'Reading data\n'); -cameras = dlmread(gtsam_utils.findExampleDataFile('VO_camera_poses_large.txt')); +cameras = dlmread(gtsam.findExampleDataFile('VO_camera_poses_large.txt')); for i=1:size(cameras,1) pose = Pose3(reshape(cameras(i,2:17),4,4)'); initial.insert(symbol('x',cameras(i,1)),pose); @@ -35,7 +35,7 @@ end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z import gtsam.* -measurements = dlmread(gtsam_utils.findExampleDataFile('VO_stereo_factors_large.txt')); +measurements = dlmread(gtsam.findExampleDataFile('VO_stereo_factors_large.txt')); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) @@ -69,9 +69,9 @@ toc %% visualize initial trajectory, final trajectory, and final points cla; hold on; -gtsam_utils.plot3DTrajectory(initial, 'r', 1, 0.5); -gtsam_utils.plot3DTrajectory(result, 'g', 1, 0.5); -gtsam_utils.plot3DPoints(result); +gtsam.plot3DTrajectory(initial, 'r', 1, 0.5); +gtsam.plot3DTrajectory(result, 'g', 1, 0.5); +gtsam.plot3DPoints(result); axis([-5 20 -20 20 0 100]); axis equal diff --git a/matlab/gtsam_examples/VisualISAMExample.m b/matlab/gtsam_examples/VisualISAMExample.m index 64634d336..31c240029 100644 --- a/matlab/gtsam_examples/VisualISAMExample.m +++ b/matlab/gtsam_examples/VisualISAMExample.m @@ -32,17 +32,17 @@ options.saveFigures = false; options.saveDotFiles = false; %% Generate data -[data,truth] = gtsam_utils.VisualISAMGenerateData(options); +[data,truth] = gtsam.VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -[noiseModels,isam,result,nextPose] = gtsam_utils.VisualISAMInitialize(data,truth,options); +[noiseModels,isam,result,nextPose] = gtsam.VisualISAMInitialize(data,truth,options); cla; -gtsam_utils.VisualISAMPlot(truth, data, isam, result, options) +gtsam.VisualISAMPlot(truth, data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras - [isam,result,nextPose] = gtsam_utils.VisualISAMStep(data,noiseModels,isam,result,truth,nextPose); + [isam,result,nextPose] = gtsam.VisualISAMStep(data,noiseModels,isam,result,truth,nextPose); if mod(frame_i,options.drawInterval)==0 - gtsam_utils.VisualISAMPlot(truth, data, isam, result, options) + gtsam.VisualISAMPlot(truth, data, isam, result, options) end end diff --git a/matlab/gtsam_examples/VisualISAM_gui.m b/matlab/gtsam_examples/VisualISAM_gui.m index f7990268f..bc08e7abf 100644 --- a/matlab/gtsam_examples/VisualISAM_gui.m +++ b/matlab/gtsam_examples/VisualISAM_gui.m @@ -230,12 +230,12 @@ global frame_i truth data noiseModels isam result nextPoseIndex options initOptions(handles) % Generate Data -[data,truth] = gtsam_utils.VisualISAMGenerateData(options); +[data,truth] = gtsam.VisualISAMGenerateData(options); % Initialize and plot -[noiseModels,isam,result,nextPoseIndex] = gtsam_utils.VisualISAMInitialize(data,truth,options); +[noiseModels,isam,result,nextPoseIndex] = gtsam.VisualISAMInitialize(data,truth,options); cla -gtsam_utils.VisualISAMPlot(truth, data, isam, result, options) +gtsam.VisualISAMPlot(truth, data, isam, result, options) frame_i = 2; showFramei(hObject, handles) @@ -246,10 +246,10 @@ global frame_i truth data noiseModels isam result nextPoseIndex options while (frame_i Date: Sat, 4 Aug 2012 19:46:47 +0000 Subject: [PATCH 752/914] Moved private/protected back to front of classes. Added print. --- gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 71 +++++++++++-------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index 4b3f8d391..13927d39f 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -30,6 +30,7 @@ class LevenbergMarquardtOptimizer; * all of those parameters. */ class LevenbergMarquardtParams : public SuccessiveLinearizationParams { + public: /** See LevenbergMarquardtParams::lmVerbosity */ enum VerbosityLM { @@ -41,6 +42,12 @@ public: DAMPED }; +private: + VerbosityLM verbosityLMTranslator(const std::string &s) const; + std::string verbosityLMTranslator(VerbosityLM value) const; + +public: + double lambdaInitial; ///< The initial Levenberg-Marquardt damping term (default: 1e-5) double lambdaFactor; ///< The amount by which to multiply or divide lambda when adjusting lambda (default: 10.0) double lambdaUpperBound; ///< The maximum lambda to try before assuming the optimization has failed (default: 1e5) @@ -60,16 +67,20 @@ public: inline void setlambdaFactor(double value) { lambdaFactor = value; } inline void setlambdaUpperBound(double value) { lambdaUpperBound = value; } inline void setVerbosityLM(const std::string &s) { verbosityLM = verbosityLMTranslator(s); } - -private: - VerbosityLM verbosityLMTranslator(const std::string &s) const; - std::string verbosityLMTranslator(VerbosityLM value) const; }; /** * State for LevenbergMarquardtOptimizer */ class LevenbergMarquardtState : public NonlinearOptimizerState { + +protected: + + LevenbergMarquardtState(const NonlinearFactorGraph& graph, const Values& initialValues, const LevenbergMarquardtParams& params, unsigned int iterations = 0) : + NonlinearOptimizerState(graph, initialValues, iterations), lambda(params.lambdaInitial) {} + + friend class LevenbergMarquardtOptimizer; + public: double lambda; @@ -77,12 +88,6 @@ public: LevenbergMarquardtState() {} virtual ~LevenbergMarquardtState() {} - -protected: - LevenbergMarquardtState(const NonlinearFactorGraph& graph, const Values& initialValues, const LevenbergMarquardtParams& params, unsigned int iterations = 0) : - NonlinearOptimizerState(graph, initialValues, iterations), lambda(params.lambdaInitial) {} - - friend class LevenbergMarquardtOptimizer; }; /** @@ -90,6 +95,25 @@ protected: */ class LevenbergMarquardtOptimizer : public NonlinearOptimizer { +protected: + + LevenbergMarquardtParams params_; ///< LM parameters + LevenbergMarquardtState state_; ///< optimization state + std::vector dimensions_; ///< undocumented + + /** Access the parameters (base class version) */ + virtual const NonlinearOptimizerParams& _params() const { return params_; } + + /** Access the state (base class version) */ + virtual const NonlinearOptimizerState& _state() const { return state_; } + + /** Internal function for computing a COLAMD ordering if no ordering is specified */ + LevenbergMarquardtParams ensureHasOrdering(LevenbergMarquardtParams params, const NonlinearFactorGraph& graph, const Values& values) const { + if(!params.ordering) + params.ordering = *graph.orderingCOLAMD(values); + return params; + } + public: typedef boost::shared_ptr shared_ptr; @@ -122,9 +146,15 @@ public: params_.ordering = ordering; state_ = LevenbergMarquardtState(graph, initialValues, params_); } - /** Access the current damping value */ + /// Access the current damping value double lambda() const { return state_.lambda; } + /// print + virtual void print(const std::string& str = "") const { + std::cout << str << "LevenbergMarquardtOptimizer" << std::endl; + this->params_.print(" parameters:\n"); + } + /// @} /// @name Advanced interface @@ -146,25 +176,6 @@ public: const LevenbergMarquardtState& state() const { return state_; } /// @} - -protected: - - LevenbergMarquardtParams params_; - LevenbergMarquardtState state_; - std::vector dimensions_; - - /** Access the parameters (base class version) */ - virtual const NonlinearOptimizerParams& _params() const { return params_; } - - /** Access the state (base class version) */ - virtual const NonlinearOptimizerState& _state() const { return state_; } - - /** Internal function for computing a COLAMD ordering if no ordering is specified */ - LevenbergMarquardtParams ensureHasOrdering(LevenbergMarquardtParams params, const NonlinearFactorGraph& graph, const Values& values) const { - if(!params.ordering) - params.ordering = *graph.orderingCOLAMD(values); - return params; - } }; } From 83a853f6f1d152e517b9d202e6f5874821136a27 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 4 Aug 2012 19:48:52 +0000 Subject: [PATCH 753/914] Removed use of EasyFactorGraph --- .../dynamics/tests/testIMUSystem.cpp | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp index 2f6b8b201..86301f417 100644 --- a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp +++ b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp @@ -12,7 +12,8 @@ #include #include #include -#include +#include +#include #include #include @@ -27,13 +28,6 @@ const double tol=1e-5; static const Key x0 = 0, x1 = 1, x2 = 2, x3 = 3, x4 = 4; static const Vector g = delta(3, 2, -9.81); -//typedef gtsam::IMUFactor IMUFactor; // IMU between measurements -//typedef gtsam::FullIMUFactor IMUFactor; // Full-state IMU between measurements -//typedef gtsam::BetweenFactor Between; // full odometry (including velocity) -//typedef gtsam::NonlinearEquality Constraint; -//typedef gtsam::PriorFactor Prior; -//typedef gtsam::RangeFactor Range; - /* ************************************************************************* */ TEST(testIMUSystem, instantiations) { // just checking for compilation @@ -74,7 +68,7 @@ TEST( testIMUSystem, optimize_chain ) { imu34 = pose3.imuPrediction(pose4, dt); // assemble simple graph with IMU measurements and velocity constraints - EasyFactorGraph graph; + NonlinearFactorGraph graph; graph.add(NonlinearEquality(x1, pose1)); graph.add(IMUFactor(imu12, dt, x1, x2, model)); graph.add(IMUFactor(imu23, dt, x2, x3, model)); @@ -100,7 +94,7 @@ TEST( testIMUSystem, optimize_chain ) { values.insert(x3, PoseRTV()); values.insert(x4, PoseRTV()); - Values actual = graph.optimize(values); + Values actual = LevenbergMarquardtOptimizer(graph, values).optimize(); EXPECT(assert_equal(true_values, actual, tol)); } @@ -121,7 +115,7 @@ TEST( testIMUSystem, optimize_chain_fullfactor ) { imu34 = pose3.imuPrediction(pose4, dt); // assemble simple graph with IMU measurements and velocity constraints - EasyFactorGraph graph; + NonlinearFactorGraph graph; graph.add(NonlinearEquality(x1, pose1)); graph.add(FullIMUFactor(imu12, dt, x1, x2, model)); graph.add(FullIMUFactor(imu23, dt, x2, x3, model)); @@ -146,7 +140,7 @@ TEST( testIMUSystem, optimize_chain_fullfactor ) { cout << "Initial Error: " << graph.error(values) << endl; // Initial error is 0.5 - need better prediction model - Values actual = graph.optimize(values); + Values actual = LevenbergMarquardtOptimizer(graph, values).optimize(); // EXPECT(assert_equal(true_values, actual, tol)); // FAIL } @@ -162,7 +156,7 @@ TEST( testIMUSystem, linear_trajectory) { SharedDiagonal model = noiseModel::Unit::Create(9); Values true_traj, init_traj; - EasyFactorGraph graph; + NonlinearFactorGraph graph; graph.add(NonlinearEquality(x0, start)); true_traj.insert(x0, start); From 5629b07fd68898048f85d0a03132422f6c35bd59 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 4 Aug 2012 19:49:10 +0000 Subject: [PATCH 754/914] Fixed print issue --- gtsam/slam/BetweenFactor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/slam/BetweenFactor.h b/gtsam/slam/BetweenFactor.h index 1779bf286..d93e5fe81 100644 --- a/gtsam/slam/BetweenFactor.h +++ b/gtsam/slam/BetweenFactor.h @@ -74,7 +74,7 @@ namespace gtsam { std::cout << s << "BetweenFactor(" << keyFormatter(this->key1()) << "," << keyFormatter(this->key2()) << ")\n"; - measured_.print(" measured"); + measured_.print(" measured: "); this->noiseModel_->print(" noise model: "); } From c5b2f6361ad6dd0e70e5997a2cf51f6f85fbdcd1 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 4 Aug 2012 20:14:12 +0000 Subject: [PATCH 755/914] Removed EasyFactorGraph as it is no longer necessary --- gtsam/nonlinear/EasyFactorGraph.cpp | 57 ------------------------ gtsam/nonlinear/EasyFactorGraph.h | 69 ----------------------------- 2 files changed, 126 deletions(-) delete mode 100644 gtsam/nonlinear/EasyFactorGraph.cpp delete mode 100644 gtsam/nonlinear/EasyFactorGraph.h diff --git a/gtsam/nonlinear/EasyFactorGraph.cpp b/gtsam/nonlinear/EasyFactorGraph.cpp deleted file mode 100644 index 5031975f7..000000000 --- a/gtsam/nonlinear/EasyFactorGraph.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 EasyFactorGraph.cpp - * @brief Nonlinear Factor Graph class with methods defined for safe and easy access in MATLAB - * @date June 24, 2012 - * @author Frank Dellaert - **/ - -#include -#include - -namespace gtsam { - - EasyFactorGraph::EasyFactorGraph() { - } - - EasyFactorGraph::EasyFactorGraph(const NonlinearFactorGraph& graph) : - NonlinearFactorGraph(graph) { - } - - LevenbergMarquardtOptimizer EasyFactorGraph::optimizer( - const Values& initialEstimate, const LevenbergMarquardtParams& p) const { - return LevenbergMarquardtOptimizer((*this), initialEstimate, p); - } - - Values EasyFactorGraph::optimize(const Values& initialEstimate, - size_t verbosity) const { - LevenbergMarquardtParams p; - p.verbosity = (NonlinearOptimizerParams::Verbosity) verbosity; - return optimizer(initialEstimate, p).optimizeSafely(); - } - - Values EasyFactorGraph::optimizeSPCG(const Values& initialEstimate, - size_t verbosity) const { - LevenbergMarquardtParams p; - p.verbosity = (NonlinearOptimizerParams::Verbosity) verbosity; - p.linearSolverType = SuccessiveLinearizationParams::CONJUGATE_GRADIENT; - p.iterativeParams = boost::make_shared(); - return optimizer(initialEstimate, p).optimizeSafely(); - } - - Marginals EasyFactorGraph::marginals(const Values& solution) const { - return Marginals(*this, solution); - } - -} // namespace gtsam - diff --git a/gtsam/nonlinear/EasyFactorGraph.h b/gtsam/nonlinear/EasyFactorGraph.h deleted file mode 100644 index 2629cb409..000000000 --- a/gtsam/nonlinear/EasyFactorGraph.h +++ /dev/null @@ -1,69 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 EasyFactorGraph.h - * @brief Nonlinear Factor Graph class with methods defined for safe and easy access in MATLAB - * @date June 24, 2012 - * @author Frank Dellaert - **/ - -#pragma once - -#include -#include -#include - -namespace gtsam { - - /** - * Nonlinear Factor Graph class with methods defined for safe and easy access in MATLAB - */ - struct EasyFactorGraph: public NonlinearFactorGraph { - - /// Default constructor for a NonlinearFactorGraph - EasyFactorGraph(); - - /// Creates a NonlinearFactorGraph based on another NonlinearFactorGraph - EasyFactorGraph(const NonlinearFactorGraph& graph); - - /** - * Setup and return a LevenbargMarquardtOptimizer - * @param initialEstimate initial estimate of all variables in the graph - * @param p optimizer's parameters - * @return a LevenbergMarquardtOptimizer object, which you can use to control the optimization process - */ - LevenbergMarquardtOptimizer optimizer(const Values& initialEstimate, - const LevenbergMarquardtParams& p = LevenbergMarquardtParams()) const; - - /** - * Safely optimize the graph, using Levenberg-Marquardt - * @param initialEstimate initial estimate of all variables in the graph - * @param verbosity unsigned specifying verbosity level - */ - Values optimize(const Values& initialEstimate, size_t verbosity = 0) const; - - /** - * Safely optimize using subgraph preconditioning - * @param initialEstimate initial estimate of all variables in the graph - * @param verbosity unsigned specifying verbosity level - */ - Values optimizeSPCG(const Values& initialEstimate, size_t verbosity = 0) const; - - /** - * Return a Marginals object, so you can query marginals - */ - Marginals marginals(const Values& solution) const; - - }; - -} // namespace gtsam - From 821c08844cf59a0e8d988f94463ac306e0b2839b Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 4 Aug 2012 20:18:06 +0000 Subject: [PATCH 756/914] Printing fix --- gtsam/slam/PriorFactor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/slam/PriorFactor.h b/gtsam/slam/PriorFactor.h index 0d0497132..79ea4c0ce 100644 --- a/gtsam/slam/PriorFactor.h +++ b/gtsam/slam/PriorFactor.h @@ -65,8 +65,8 @@ namespace gtsam { /** print */ virtual void print(const std::string& s, const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - std::cout << s << "PriorFactor on " << keyFormatter(this->key()) << ", prior value:\n"; - prior_.print(); + std::cout << s << "PriorFactor on " << keyFormatter(this->key()) << "\n"; + prior_.print(" prior mean: "); this->noiseModel_->print(" noise model: "); } From 297fbfa1a51499dd18893c95429efda367c7d9f1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 4 Aug 2012 20:18:42 +0000 Subject: [PATCH 757/914] Odometry example was deliberately not using Symbols... Fixed... --- examples/OdometryExample.cpp | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/examples/OdometryExample.cpp b/examples/OdometryExample.cpp index f0874bedb..e420a0be9 100644 --- a/examples/OdometryExample.cpp +++ b/examples/OdometryExample.cpp @@ -27,11 +27,6 @@ #include #include -// Each variable in the system (poses) must be identified with a unique key. -// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). -// Here we will use symbols -#include - // In GTSAM, measurement functions are represented as 'factors'. Several common factors // have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. // Here we will use Between factors for the relative motion described by odometry measurements. @@ -60,35 +55,35 @@ // for each variable, held in a Values container. #include - using namespace std; using namespace gtsam; int main(int argc, char** argv) { - // Create a factor graph container + // Create an empty nonlinear factor graph NonlinearFactorGraph graph; // Add a prior on the first pose, setting it to the origin // A prior factor consists of a mean and a noise model (covariance matrix) - Pose2 prior(0.0, 0.0, 0.0); // prior at origin + Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin noiseModel::Diagonal::shared_ptr priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.add(PriorFactor(Symbol('x', 1), prior, priorNoise)); + graph.add(PriorFactor(1, priorMean, priorNoise)); // Add odometry factors + Pose2 odometry(2.0, 0.0, 0.0); // For simplicity, we will use the same noise model for each odometry factor noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // Create odometry (Between) factors between consecutive poses - graph.add(BetweenFactor(Symbol('x', 1), Symbol('x', 2), Pose2(2.0, 0.0, 0.0), odometryNoise)); - graph.add(BetweenFactor(Symbol('x', 2), Symbol('x', 3), Pose2(2.0, 0.0, 0.0), odometryNoise)); + graph.add(BetweenFactor(1, 2, odometry, odometryNoise)); + graph.add(BetweenFactor(2, 3, odometry, odometryNoise)); graph.print("\nFactor Graph:\n"); // print // Create the data structure to hold the initialEstimate estimate to the solution // For illustrative purposes, these have been deliberately set to incorrect values Values initialEstimate; - initialEstimate.insert(Symbol('x', 1), Pose2(0.5, 0.0, 0.2)); - initialEstimate.insert(Symbol('x', 2), Pose2(2.3, 0.1, -0.2)); - initialEstimate.insert(Symbol('x', 3), Pose2(4.1, 0.1, 0.1)); + initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); + initialEstimate.insert(2, Pose2(2.3, 0.1, -0.2)); + initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print("\nInitial Estimate:\n"); // print // optimize using Levenberg-Marquardt optimization @@ -97,9 +92,9 @@ int main(int argc, char** argv) { // Calculate and print marginal covariances for all variables Marginals marginals(graph, result); - cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(Symbol('x', 1)) << endl; - cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(Symbol('x', 2)) << endl; - cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(Symbol('x', 3)) << endl; + cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(1) << endl; + cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(2) << endl; + cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(3) << endl; return 0; } From 6596aec1ab72e7dd3905e8d4733a65d9ed2d21ae Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 4 Aug 2012 20:32:23 +0000 Subject: [PATCH 758/914] Added print for LMOptimizer --- gtsam.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam.h b/gtsam.h index d15ef08d8..346ded351 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1282,6 +1282,7 @@ virtual class LevenbergMarquardtOptimizer : gtsam::NonlinearOptimizer { LevenbergMarquardtOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues); LevenbergMarquardtOptimizer(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& initialValues, const gtsam::LevenbergMarquardtParams& params); double lambda() const; + void print(string str) const; }; #include From 93f995065f1b6eae51e4864dfbbdd77d2ba6d47a Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 4 Aug 2012 21:56:21 +0000 Subject: [PATCH 759/914] Aligned example with manual, fixed example make targets --- .cproject | 374 ++++++++++++++++------------------- examples/OdometryExample.cpp | 19 +- 2 files changed, 180 insertions(+), 213 deletions(-) diff --git a/.cproject b/.cproject index f5675f5ee..81bf59187 100644 --- a/.cproject +++ b/.cproject @@ -309,6 +309,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -335,7 +343,6 @@ make - tests/testBayesTree.run true false @@ -343,7 +350,6 @@ make - testBinaryBayesNet.run true false @@ -391,7 +397,6 @@ make - testSymbolicBayesNet.run true false @@ -399,7 +404,6 @@ make - tests/testSymbolicFactor.run true false @@ -407,7 +411,6 @@ make - testSymbolicFactorGraph.run true false @@ -423,20 +426,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -525,22 +519,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -557,6 +535,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -581,26 +575,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -685,26 +679,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -975,7 +969,6 @@ make - testGraph.run true false @@ -983,7 +976,6 @@ make - testJunctionTree.run true false @@ -991,7 +983,6 @@ make - testSymbolicBayesNetB.run true false @@ -1127,7 +1118,6 @@ make - testErrors.run true false @@ -1173,6 +1163,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -1253,14 +1251,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -1591,6 +1581,7 @@ make + testSimulated2DOriented.run true false @@ -1630,6 +1621,7 @@ make + testSimulated2D.run true false @@ -1637,6 +1629,7 @@ make + testSimulated3D.run true false @@ -1746,10 +1739,10 @@ true true - + make - -j2 - PlanarSLAMExample_easy.run + -j5 + PlanarSLAMExample.run true true true @@ -1778,26 +1771,10 @@ true true - + make - -j2 - PlanarSLAMSelfContained_advanced.run - true - true - true - - - make - -j2 - Pose2SLAMExample_advanced.run - true - true - true - - - make - -j2 - Pose2SLAMExample_easy.run + -j5 + Pose2SLAMExample.run true true true @@ -1826,18 +1803,10 @@ true true - + make -j5 - LocalizationExample2.run - true - true - true - - - make - -j5 - Pose2SLAMwSPCG_advanced.run + OdometryExample.run true true true @@ -1852,6 +1821,7 @@ make + tests/testGaussianISAM2 true false @@ -1873,6 +1843,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j1 @@ -2074,7 +2140,6 @@ cpack - -G DEB true false @@ -2082,7 +2147,6 @@ cpack - -G RPM true false @@ -2090,7 +2154,6 @@ cpack - -G TGZ true false @@ -2098,7 +2161,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2224,98 +2286,34 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2359,38 +2357,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/examples/OdometryExample.cpp b/examples/OdometryExample.cpp index e420a0be9..7c2a80d85 100644 --- a/examples/OdometryExample.cpp +++ b/examples/OdometryExample.cpp @@ -80,21 +80,22 @@ int main(int argc, char** argv) { // Create the data structure to hold the initialEstimate estimate to the solution // For illustrative purposes, these have been deliberately set to incorrect values - Values initialEstimate; - initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insert(2, Pose2(2.3, 0.1, -0.2)); - initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); - initialEstimate.print("\nInitial Estimate:\n"); // print + Values initial; + initial.insert(1, Pose2(0.5, 0.0, 0.2)); + initial.insert(2, Pose2(2.3, 0.1, -0.2)); + initial.insert(3, Pose2(4.1, 0.1, 0.1)); + initial.print("\nInitial Estimate:\n"); // print // optimize using Levenberg-Marquardt optimization - Values result = LevenbergMarquardtOptimizer(graph, initialEstimate).optimize(); + Values result = LevenbergMarquardtOptimizer(graph, initial).optimize(); result.print("Final Result:\n"); // Calculate and print marginal covariances for all variables + cout.precision(2); Marginals marginals(graph, result); - cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(1) << endl; - cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(2) << endl; - cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(3) << endl; + cout << "x1 covariance:\n" << marginals.marginalCovariance(1) << endl; + cout << "x2 covariance:\n" << marginals.marginalCovariance(2) << endl; + cout << "x3 covariance:\n" << marginals.marginalCovariance(3) << endl; return 0; } From f70af2ef3847dd3560b4d70eee4e0c29384ec1c4 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 5 Aug 2012 16:59:14 +0000 Subject: [PATCH 760/914] Fixed up examples to be a bit less verbose and match up with the manual again. --- examples/LocalizationExample.cpp | 65 +++++++++++--------------------- examples/OdometryExample.cpp | 4 +- 2 files changed, 23 insertions(+), 46 deletions(-) diff --git a/examples/LocalizationExample.cpp b/examples/LocalizationExample.cpp index c9d232df8..dfe3d1e99 100644 --- a/examples/LocalizationExample.cpp +++ b/examples/LocalizationExample.cpp @@ -23,25 +23,16 @@ * - We have "GPS-like" measurements implemented with a custom factor */ -// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent -// the robot positions +// We will use Pose2 variables (x, y, theta) to represent the robot positions #include -// Each variable in the system (poses) must be identified with a unique key. -// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). -// Here we will use simple integer keys +// We will use simple integer Keys to refer to the robot poses. #include -// In GTSAM, measurement functions are represented as 'factors'. Several common factors -// have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. -// Here we will use Between factors for the relative motion described by odometry measurements. -// Because we have global measurements in the form of "GPS-like" measurements, we don't -// actually need to provide an initial position prior in this example. We will create our -// custom factor shortly. +// As in OdometryExample.cpp, we use a BetweenFactor to model odometry measurements. #include -// When the factors are created, we will add them to a Factor Graph. As the factors we are using -// are nonlinear factors, we will need a Nonlinear Factor Graph. +// We add all facors to a Nonlinear Factor Graph, as our factors are nonlinear. #include // The nonlinear solvers within GTSAM are iterative solvers, meaning they linearize the @@ -61,11 +52,9 @@ // of desired variables #include - using namespace std; using namespace gtsam; - // Before we begin the example, we must create a custom unary factor to implement a // "GPS-like" functionality. Because standard GPS measurements provide information // only on the position, and not on the orientation, we cannot use a simple prior to @@ -75,10 +64,12 @@ using namespace gtsam; // also use a standard Gaussian noise model. Hence, we will derive our new factor from // the NoiseModelFactor1. #include + class UnaryFactor: public NoiseModelFactor1 { // The factor will hold a measurement consisting of an (X,Y) location - Point2 measurement_; + // We could this with a Point2 but here we just use two doubles + double mx_, my_; public: /// shorthand for a smart pointer to a factor @@ -86,15 +77,15 @@ public: // The constructor requires the variable key, the (X, Y) measurement value, and the noise model UnaryFactor(Key j, double x, double y, const SharedNoiseModel& model): - NoiseModelFactor1(model, j), measurement_(x, y) {} + NoiseModelFactor1(model, j), mx_(x), my_(y) {} virtual ~UnaryFactor() {} - // By using the NoiseModelFactor base classes, the only two function that must be overridden. + // Using the NoiseModelFactor1 base class there are two functions that must be overridden. // The first is the 'evaluateError' function. This function implements the desired measurement // function, returning a vector of errors when evaluated at the provided variable value. It // must also calculate the Jacobians for this measurement function, if requested. - Vector evaluateError(const Pose2& pose, boost::optional H = boost::none) const + Vector evaluateError(const Pose2& q, boost::optional H = boost::none) const { // The measurement function for a GPS-like measurement is simple: // error_x = pose.x - measurement.x @@ -102,10 +93,8 @@ public: // Consequently, the Jacobians are: // [ derror_x/dx derror_x/dy derror_x/dtheta ] = [1 0 0] // [ derror_y/dx derror_y/dy derror_y/dtheta ] = [0 1 0] - if (H) - (*H) = Matrix_(2,3, 1.0,0.0,0.0, 0.0,1.0,0.0); - - return Vector_(2, pose.x() - measurement_.x(), pose.y() - measurement_.y()); + if (H) (*H) = Matrix_(2,3, 1.0,0.0,0.0, 0.0,1.0,0.0); + return Vector_(2, q.x() - mx_, q.y() - my_); } // The second is a 'clone' function that allows the factor to be copied. Under most @@ -115,22 +104,11 @@ public: return boost::static_pointer_cast( gtsam::NonlinearFactor::shared_ptr(new UnaryFactor(*this))); } - // Additionally, custom factors should really provide specific implementations of - // 'equals' to ensure proper operation will all GTSAM functionality, and a custom - // 'print' function, if desired. - virtual bool equals(const NonlinearFactor& expected, double tol=1e-9) const { - const UnaryFactor* e = dynamic_cast (&expected); - return e != NULL && NoiseModelFactor1::equals(*e, tol) && this->measurement_.equals(e->measurement_, tol); - } - - virtual void print(const std::string& s, const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { - std::cout << s << "UnaryFactor(" << keyFormatter(this->key()) << ")\n"; - measurement_.print(" measurement: "); - this->noiseModel_->print(" noise model: "); - } - -}; + // Additionally, we encourage you the use of unit testing your custom factors, + // (as all GTSAM factors are), in which you would need an equals and print, to satisfy the + // GTSAM_CONCEPT_TESTABLE_INST(T) defined in Testable.h, but these are not needed below. +}; // UnaryFactor int main(int argc, char** argv) { @@ -148,8 +126,9 @@ int main(int argc, char** argv) { // 2b. Add "GPS-like" measurements // We will use our custom UnaryFactor for this. noiseModel::Diagonal::shared_ptr unaryNoise = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.1)); // 10cm std on x,y - graph.add(UnaryFactor(1, 0.0, 0.0, unaryNoise)); - graph.add(UnaryFactor(3, 4.0, 0.0, unaryNoise)); + graph.push_back(boost::make_shared(1, 0.0, 0.0, unaryNoise)); + graph.push_back(boost::make_shared(2, 2.0, 0.0, unaryNoise)); + graph.push_back(boost::make_shared(3, 4.0, 0.0, unaryNoise)); graph.print("\nFactor Graph:\n"); // print // 3. Create the data structure to hold the initialEstimate estimate to the solution @@ -172,9 +151,9 @@ int main(int argc, char** argv) { // 5. Calculate and print marginal covariances for all variables Marginals marginals(graph, result); - cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(1) << endl; - cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(2) << endl; - cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(3) << endl; + cout << "x1 covariance:\n" << marginals.marginalCovariance(1) << endl; + cout << "x2 covariance:\n" << marginals.marginalCovariance(2) << endl; + cout << "x3 covariance:\n" << marginals.marginalCovariance(3) << endl; return 0; } diff --git a/examples/OdometryExample.cpp b/examples/OdometryExample.cpp index 7c2a80d85..d556798f0 100644 --- a/examples/OdometryExample.cpp +++ b/examples/OdometryExample.cpp @@ -22,10 +22,8 @@ * - We have full odometry between poses */ -// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent -// the robot positions +// We will use Pose2 variables (x, y, theta) to represent the robot positions #include -#include // In GTSAM, measurement functions are represented as 'factors'. Several common factors // have been provided with the library for solving robotics/SLAM/Bundle Adjustment problems. From abdf46d49464deaa9e4a0b38b168ab820696036c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 5 Aug 2012 18:44:36 +0000 Subject: [PATCH 761/914] Synchronizing C++ and MATLAB example again. Please coordinate with me before changing the values in the examples: changing them generates work in the manual and in the MATLAB examples. --- examples/Pose2SLAMExample.cpp | 52 +++++++++++------------- matlab/gtsam_examples/Pose2SLAMExample.m | 42 ++++++++----------- 2 files changed, 40 insertions(+), 54 deletions(-) diff --git a/examples/Pose2SLAMExample.cpp b/examples/Pose2SLAMExample.cpp index bf05cc729..4885e72c8 100644 --- a/examples/Pose2SLAMExample.cpp +++ b/examples/Pose2SLAMExample.cpp @@ -25,14 +25,10 @@ * - We have a loop closure constraint when the robot returns to the first position */ -// As this is a planar SLAM example, we will use Pose2 variables (x, y, theta) to represent -// the robot positions +// In planar SLAM example we use Pose2 variables (x, y, theta) to represent the robot poses #include -#include -// Each variable in the system (poses) must be identified with a unique key. -// We can either use simple integer keys (1, 2, 3, ...) or symbols (X1, X2, L1). -// Here we will use simple integer keys +// We will use simple integer Keys to refer to the robot poses. #include // In GTSAM, measurement functions are represented as 'factors'. Several common factors @@ -75,37 +71,34 @@ int main(int argc, char** argv) { // 2a. Add a prior on the first pose, setting it to the origin // A prior factor consists of a mean and a noise model (covariance matrix) - Pose2 prior(0.0, 0.0, 0.0); // prior at origin noiseModel::Diagonal::shared_ptr priorNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.3, 0.3, 0.1)); - graph.add(PriorFactor(1, prior, priorNoise)); + graph.add(PriorFactor(1, Pose2(0, 0, 0), priorNoise)); + + // For simplicity, we will use the same noise model for odometry and loop closures + noiseModel::Diagonal::shared_ptr model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // 2b. Add odometry factors - // For simplicity, we will use the same noise model for each odometry factor - noiseModel::Diagonal::shared_ptr odometryNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); // Create odometry (Between) factors between consecutive poses - graph.add(BetweenFactor(1, 2, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); - graph.add(BetweenFactor(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); - graph.add(BetweenFactor(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); - graph.add(BetweenFactor(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise)); + graph.add(BetweenFactor(1, 2, Pose2(2, 0, 0 ), model)); + graph.add(BetweenFactor(2, 3, Pose2(2, 0, M_PI_2), model)); + graph.add(BetweenFactor(3, 4, Pose2(2, 0, M_PI_2), model)); + graph.add(BetweenFactor(4, 5, Pose2(2, 0, M_PI_2), model)); // 2c. Add the loop closure constraint // This factor encodes the fact that we have returned to the same pose. In real systems, // these constraints may be identified in many ways, such as appearance-based techniques - // with camera images. - // We will use another Between Factor to enforce this constraint, with the distance set to zero, - noiseModel::Diagonal::shared_ptr model = noiseModel::Diagonal::Sigmas(Vector_(3, 0.2, 0.2, 0.1)); - graph.add(BetweenFactor(5, 1, Pose2(0.0, 0.0, 0.0), model)); + // with camera images. We will use another Between Factor to enforce this constraint: + graph.add(BetweenFactor(5, 2, Pose2(2, 0, M_PI_2), model)); graph.print("\nFactor Graph:\n"); // print - // 3. Create the data structure to hold the initialEstimate estimate to the solution // For illustrative purposes, these have been deliberately set to incorrect values Values initialEstimate; - initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); - initialEstimate.insert(2, Pose2(2.3, 0.1, 1.1)); - initialEstimate.insert(3, Pose2(2.1, 1.9, 2.8)); - initialEstimate.insert(4, Pose2(-.3, 2.5, 4.2)); - initialEstimate.insert(5, Pose2(0.1,-0.7, 5.8)); + initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2 )); + initialEstimate.insert(2, Pose2(2.3, 0.1, -0.2 )); + initialEstimate.insert(3, Pose2(4.1, 0.1, M_PI_2)); + initialEstimate.insert(4, Pose2(4.0, 2.0, M_PI )); + initialEstimate.insert(5, Pose2(2.1, 2.1, -M_PI_2)); initialEstimate.print("\nInitial Estimate:\n"); // print // 4. Optimize the initial values using a Gauss-Newton nonlinear optimizer @@ -125,12 +118,13 @@ int main(int argc, char** argv) { result.print("Final Result:\n"); // 5. Calculate and print marginal covariances for all variables + cout.precision(3); Marginals marginals(graph, result); - cout << "Pose 1 covariance:\n" << marginals.marginalCovariance(1) << endl; - cout << "Pose 2 covariance:\n" << marginals.marginalCovariance(2) << endl; - cout << "Pose 3 covariance:\n" << marginals.marginalCovariance(3) << endl; - cout << "Pose 4 covariance:\n" << marginals.marginalCovariance(4) << endl; - cout << "Pose 5 covariance:\n" << marginals.marginalCovariance(5) << endl; + cout << "x1 covariance:\n" << marginals.marginalCovariance(1) << endl; + cout << "x2 covariance:\n" << marginals.marginalCovariance(2) << endl; + cout << "x3 covariance:\n" << marginals.marginalCovariance(3) << endl; + cout << "x4 covariance:\n" << marginals.marginalCovariance(4) << endl; + cout << "x5 covariance:\n" << marginals.marginalCovariance(5) << endl; return 0; } diff --git a/matlab/gtsam_examples/Pose2SLAMExample.m b/matlab/gtsam_examples/Pose2SLAMExample.m index fccacc894..3e21c2e30 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample.m +++ b/matlab/gtsam_examples/Pose2SLAMExample.m @@ -18,58 +18,50 @@ % - We have full odometry for measurements % - The robot is on a grid, moving 2 meters each step +import gtsam.* + %% Create graph container and add factors to it graph = NonlinearFactorGraph; %% Add prior -import gtsam.* -% gaussian for prior -priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph +graph.add(PriorFactorPose2(1, Pose2(0, 0, 0), priorNoise)); % add directly to graph %% Add odometry -import gtsam.* -% general noisemodel for odometry -odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.add(BetweenFactorPose2(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise)); -graph.add(BetweenFactorPose2(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise)); -graph.add(BetweenFactorPose2(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise)); -graph.add(BetweenFactorPose2(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise)); +model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); +graph.add(BetweenFactorPose2(1, 2, Pose2(2, 0, 0 ), model)); +graph.add(BetweenFactorPose2(2, 3, Pose2(2, 0, pi/2), model)); +graph.add(BetweenFactorPose2(3, 4, Pose2(2, 0, pi/2), model)); +graph.add(BetweenFactorPose2(4, 5, Pose2(2, 0, pi/2), model)); %% Add pose constraint -import gtsam.* -model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); -graph.add(BetweenFactorPose2(5, 2, Pose2(2.0, 0.0, pi/2), model)); +graph.add(BetweenFactorPose2(5, 2, Pose2(2, 0, pi/2), model)); % print graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; -initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2 )); -initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2 )); -initialEstimate.insert(3, Pose2(4.1, 0.1, pi/2)); -initialEstimate.insert(4, Pose2(4.0, 2.0, pi )); -initialEstimate.insert(5, Pose2(2.1, 2.1,-pi/2)); +initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2 )); +initialEstimate.insert(2, Pose2(2.3, 0.1, -0.2 )); +initialEstimate.insert(3, Pose2(4.1, 0.1, pi/2)); +initialEstimate.insert(4, Pose2(4.0, 2.0, pi )); +initialEstimate.insert(5, Pose2(2.1, 2.1, -pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses -import gtsam.* cla; hold on -plot([result.at(5).x;result.at(2).x],[result.at(5).y;result.at(2).y],'r-','LineWidth',2); +plot([result.at(5).x;result.at(2).x],[result.at(5).y;result.at(2).y],'r-'); marginals = Marginals(graph, result); gtsam.plot2DTrajectory(result, [], marginals); - -axis([-0.6 4.8 -1 1]) +for i=1:5,marginals.marginalCovariance(i),end axis equal +axis tight view(2) From 695523a4973537f82df87c547f07a66114ad7372 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sun, 5 Aug 2012 19:31:27 +0000 Subject: [PATCH 762/914] Fixed "import gtsam.*" gluttony --- matlab/gtsam_examples/LocalizationExample.m | 11 ++++------ matlab/gtsam_examples/OdometryExample.m | 10 ++++----- matlab/gtsam_examples/PlanarSLAMExample.m | 14 +++++-------- .../PlanarSLAMExample_sampling.m | 13 +++++------- matlab/gtsam_examples/Pose2SLAMExample.m | 6 +++--- .../Pose2SLAMExample_advanced.m | 6 ++---- .../gtsam_examples/Pose2SLAMExample_circle.m | 14 +++++-------- .../gtsam_examples/Pose2SLAMExample_graph.m | 21 ++++++++----------- matlab/gtsam_examples/Pose2SLAMwSPCG.m | 5 ++--- matlab/gtsam_examples/Pose3SLAMExample.m | 14 +++++-------- .../gtsam_examples/Pose3SLAMExample_graph.m | 15 +++++++------ matlab/gtsam_examples/SBAExample.m | 12 +++-------- matlab/gtsam_examples/SFMExample.m | 15 +++++-------- matlab/gtsam_examples/StereoVOExample.m | 15 +++++-------- matlab/gtsam_examples/StereoVOExample_large.m | 19 +++++++---------- matlab/gtsam_examples/VisualISAMExample.m | 12 ++++++----- matlab/gtsam_tests/testLocalizationExample.m | 8 ++----- matlab/gtsam_tests/testOdometryExample.m | 8 ++----- matlab/gtsam_tests/testPlanarSLAMExample.m | 10 ++------- matlab/gtsam_tests/testPose2SLAMExample.m | 19 ++--------------- matlab/gtsam_tests/testPose3SLAMExample.m | 6 ++---- matlab/gtsam_tests/testSFMExample.m | 5 ----- matlab/gtsam_tests/testStereoVOExample.m | 11 ++-------- matlab/gtsam_tests/testVisualISAMExample.m | 5 ++--- 24 files changed, 93 insertions(+), 181 deletions(-) diff --git a/matlab/gtsam_examples/LocalizationExample.m b/matlab/gtsam_examples/LocalizationExample.m index c877c70c7..2dcb5341b 100644 --- a/matlab/gtsam_examples/LocalizationExample.m +++ b/matlab/gtsam_examples/LocalizationExample.m @@ -10,23 +10,23 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - Robot poses are facing along the X axis (horizontal, to the right in 2D) % - The robot moves 2 meters each step % - The robot is on a grid, moving 2 meters each step %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = gtsam.NonlinearFactorGraph; +graph = NonlinearFactorGraph; %% Add two odometry factors -import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Add three "GPS" measurements -import gtsam.* % We use Pose2 Priors here with high variance on theta priorNoise = noiseModel.Diagonal.Sigmas([0.1; 0.1; 10]); graph.add(PriorFactorPose2(1, Pose2(0.0, 0.0, 0.0), priorNoise)); @@ -37,7 +37,6 @@ graph.add(PriorFactorPose2(3, Pose2(4.0, 0.0, 0.0), priorNoise)); graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); @@ -45,17 +44,15 @@ initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n ')); %% Plot trajectory and covariance ellipses -import gtsam.* cla; hold on; -gtsam.plot2DTrajectory(result, [], Marginals(graph, result)); +plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/gtsam_examples/OdometryExample.m b/matlab/gtsam_examples/OdometryExample.m index b913b187a..81d2db676 100644 --- a/matlab/gtsam_examples/OdometryExample.m +++ b/matlab/gtsam_examples/OdometryExample.m @@ -10,22 +10,22 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - Robot poses are facing along the X axis (horizontal, to the right in 2D) % - The robot moves 2 meters each step % - The robot is on a grid, moving 2 meters each step %% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) -graph = gtsam.NonlinearFactorGraph; +graph = NonlinearFactorGraph; %% Add a Gaussian prior on pose x_1 -import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add two odometry factors -import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); @@ -35,7 +35,6 @@ graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); graph.print(sprintf('\nFactor graph:\n')); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); @@ -48,11 +47,10 @@ result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n ')); %% Plot trajectory and covariance ellipses -import gtsam.* cla; hold on; -gtsam.plot2DTrajectory(result, [], Marginals(graph, result)); +plot2DTrajectory(result, [], Marginals(graph, result)); axis([-0.6 4.8 -1 1]) axis equal diff --git a/matlab/gtsam_examples/PlanarSLAMExample.m b/matlab/gtsam_examples/PlanarSLAMExample.m index e37326275..1dc6ba41c 100644 --- a/matlab/gtsam_examples/PlanarSLAMExample.m +++ b/matlab/gtsam_examples/PlanarSLAMExample.m @@ -11,6 +11,8 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - All values are axis aligned % - Robot poses are facing along the X axis (horizontal, to the right in images) @@ -20,28 +22,24 @@ % - Landmarks are 2 meters away from the robot trajectory %% Create keys for variables -import gtsam.* i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); j1 = symbol('l',1); j2 = symbol('l',2); %% Create graph container and add factors to it -graph = gtsam.NonlinearFactorGraph; +graph = NonlinearFactorGraph; %% Add prior -import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.add(PriorFactorPose2(i1, priorMean, priorNoise)); % add directly to graph %% Add odometry -import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.add(BetweenFactorPose2(i1, i2, odometry, odometryNoise)); graph.add(BetweenFactorPose2(i2, i3, odometry, odometryNoise)); %% Add bearing/range measurement factors -import gtsam.* degrees = pi/180; brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); graph.add(BearingRangeFactor2D(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise)); @@ -52,7 +50,6 @@ graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); graph.print(sprintf('\nFull graph:\n')); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(i1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insert(i2, Pose2(2.3, 0.1,-0.2)); @@ -68,12 +65,11 @@ result = optimizer.optimizeSafely(); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses -import gtsam.* cla;hold on marginals = Marginals(graph, result); -gtsam.plot2DTrajectory(result, [], marginals); -gtsam.plot2DPoints(result, [], marginals); +plot2DTrajectory(result, [], marginals); +plot2DPoints(result, [], marginals); plot([result.at(i1).x; result.at(j1).x],[result.at(i1).y; result.at(j1).y], 'c-'); plot([result.at(i2).x; result.at(j1).x],[result.at(i2).y; result.at(j1).y], 'c-'); diff --git a/matlab/gtsam_examples/PlanarSLAMExample_sampling.m b/matlab/gtsam_examples/PlanarSLAMExample_sampling.m index 59c99df53..327c64d4d 100644 --- a/matlab/gtsam_examples/PlanarSLAMExample_sampling.m +++ b/matlab/gtsam_examples/PlanarSLAMExample_sampling.m @@ -11,8 +11,9 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create the same factor graph as in PlanarSLAMExample import gtsam.* + +%% Create the same factor graph as in PlanarSLAMExample i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); graph = NonlinearFactorGraph; priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin @@ -24,7 +25,6 @@ graph.add(BetweenFactorPose2(i1, i2, odometry, odometryNoise)); graph.add(BetweenFactorPose2(i2, i3, odometry, odometryNoise)); %% Except, for measurements we offer a choice -import gtsam.* j1 = symbol('l',1); j2 = symbol('l',2); degrees = pi/180; brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); @@ -39,7 +39,6 @@ end graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); %% Initialize MCMC sampler with ground truth -import gtsam.* sample = Values; sample.insert(i1, Pose2(0,0,0)); sample.insert(i2, Pose2(2,0,0)); @@ -48,12 +47,11 @@ sample.insert(j1, Point2(2,2)); sample.insert(j2, Point2(4,2)); %% Calculate and plot Covariance Ellipses -import gtsam.* cla;hold on marginals = Marginals(graph, sample); -gtsam.plot2DTrajectory(sample, [], marginals); -gtsam.plot2DPoints(sample, [], marginals); +plot2DTrajectory(sample, [], marginals); +plot2DPoints(sample, [], marginals); for j=1:2 key = symbol('l',j); @@ -68,10 +66,9 @@ plot([sample.at(i3).x; sample.at(j2).x],[sample.at(i3).y; sample.at(j2).y], 'c-' view(2); axis auto; axis equal %% Do Sampling on point 2 -import gtsam.* N=1000; for s=1:N delta = S{2}*randn(2,1); proposedPoint = Point2(point{2}.x+delta(1),point{2}.y+delta(2)); - gtsam.plotPoint2(proposedPoint,'k.') + plotPoint2(proposedPoint,'k.') end \ No newline at end of file diff --git a/matlab/gtsam_examples/Pose2SLAMExample.m b/matlab/gtsam_examples/Pose2SLAMExample.m index 3e21c2e30..65ce28dbb 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample.m +++ b/matlab/gtsam_examples/Pose2SLAMExample.m @@ -12,14 +12,14 @@ % @author Chris Beall %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - All values are axis aligned % - Robot poses are facing along the X axis (horizontal, to the right in images) % - We have full odometry for measurements % - The robot is on a grid, moving 2 meters each step -import gtsam.* - %% Create graph container and add factors to it graph = NonlinearFactorGraph; @@ -60,7 +60,7 @@ hold on plot([result.at(5).x;result.at(2).x],[result.at(5).y;result.at(2).y],'r-'); marginals = Marginals(graph, result); -gtsam.plot2DTrajectory(result, [], marginals); +plot2DTrajectory(result, [], marginals); for i=1:5,marginals.marginalCovariance(i),end axis equal axis tight diff --git a/matlab/gtsam_examples/Pose2SLAMExample_advanced.m b/matlab/gtsam_examples/Pose2SLAMExample_advanced.m index fab340f2a..343dee05b 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample_advanced.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_advanced.m @@ -14,6 +14,8 @@ % @author Can Erdogan %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - All values are axis aligned % - Robot poses are facing along the X axis (horizontal, to the right in images) @@ -24,14 +26,12 @@ graph = NonlinearFactorGraph; %% Add prior -import gtsam.* % gaussian for prior priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add odometry -import gtsam.* % general noisemodel for odometry odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) @@ -39,7 +39,6 @@ graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Add measurements -import gtsam.* % general noisemodel for measurements measurementNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); @@ -47,7 +46,6 @@ measurementNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); graph.print('full graph'); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); diff --git a/matlab/gtsam_examples/Pose2SLAMExample_circle.m b/matlab/gtsam_examples/Pose2SLAMExample_circle.m index 957a30df4..3d2265d76 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample_circle.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_circle.m @@ -10,14 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create a hexagon of poses import gtsam.* -hexagon = gtsam.circlePose2(6,1.0); + +%% Create a hexagon of poses +hexagon = circlePose2(6,1.0); p0 = hexagon.at(0); p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement -import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose2(0, p0)); delta = p0.between(p1); @@ -30,7 +30,6 @@ fg.add(BetweenFactorPose2(4,5, delta, covariance)); fg.add(BetweenFactorPose2(5,0, delta, covariance)); %% Create initial config -import gtsam.* initial = Values; initial.insert(0, p0); initial.insert(1, hexagon.at(1).retract([-0.1, 0.1,-0.1]')); @@ -40,18 +39,15 @@ initial.insert(4, hexagon.at(4).retract([ 0.1,-0.1, 0.1]')); initial.insert(5, hexagon.at(5).retract([-0.1, 0.1,-0.1]')); %% Plot Initial Estimate -import gtsam.* cla -gtsam.plot2DTrajectory(initial, 'g*-'); axis equal +plot2DTrajectory(initial, 'g*-'); axis equal %% optimize -import gtsam.* optimizer = DoglegOptimizer(fg, initial); result = optimizer.optimizeSafely; %% Show Result -import gtsam.* -hold on; gtsam.plot2DTrajectory(result, 'b*-'); +hold on; plot2DTrajectory(result, 'b*-'); view(2); axis([-1.5 1.5 -1.5 1.5]); result.print(sprintf('\nFinal result:\n')); diff --git a/matlab/gtsam_examples/Pose2SLAMExample_graph.m b/matlab/gtsam_examples/Pose2SLAMExample_graph.m index 3eed090a2..b48485573 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_graph.m @@ -10,45 +10,42 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Find data file -datafile = gtsam.findExampleDataFile('w100-odom.graph'); +datafile = findExampleDataFile('w100-odom.graph'); %% Initialize graph, initial estimate, and odometry noise -import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); maxID = 0; addNoise = false; smart = true; -[graph,initial] = gtsam.load2D(datafile, model, maxID, addNoise, smart); +[graph,initial] = load2D(datafile, model, maxID, addNoise, smart); initial.print(sprintf('Initial estimate:\n')); %% Add a Gaussian prior on pose x_1 -import gtsam.* -priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin +priorMean = Pose2(0, 0, 0); % prior mean is at origin priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); graph.add(PriorFactorPose2(0, priorMean, priorNoise)); % add directly to graph %% Plot Initial Estimate -import gtsam.* cla -gtsam.plot2DTrajectory(initial, 'g-*'); axis equal +plot2DTrajectory(initial, 'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely; -hold on; gtsam.plot2DTrajectory(result, 'b-*'); +hold on; plot2DTrajectory(result, 'b-*'); result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses -import gtsam.* marginals = Marginals(graph, result); P={}; for i=1:result.size()-1 pose_i = result.at(i); P{i}=marginals.marginalCovariance(i); - gtsam.plotPose2(pose_i,'b',P{i}) + plotPose2(pose_i,'b',P{i}) end view(2) -axis([-15 10 -15 10]); axis equal; +axis tight; axis equal; fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file diff --git a/matlab/gtsam_examples/Pose2SLAMwSPCG.m b/matlab/gtsam_examples/Pose2SLAMwSPCG.m index dca31ac94..a45ac40a0 100644 --- a/matlab/gtsam_examples/Pose2SLAMwSPCG.m +++ b/matlab/gtsam_examples/Pose2SLAMwSPCG.m @@ -10,6 +10,8 @@ % @author Yong-Dian Jian %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - All values are axis aligned % - Robot poses are facing along the X axis (horizontal, to the right in images) @@ -20,14 +22,12 @@ graph = NonlinearFactorGraph; %% Add prior -import gtsam.* % gaussian for prior priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add odometry -import gtsam.* % general noisemodel for odometry odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.add(BetweenFactorPose2(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise)); @@ -36,7 +36,6 @@ graph.add(BetweenFactorPose2(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise)); graph.add(BetweenFactorPose2(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise)); %% Add pose constraint -import gtsam.* model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.add(BetweenFactorPose2(5, 2, Pose2(2.0, 0.0, pi/2), model)); diff --git a/matlab/gtsam_examples/Pose3SLAMExample.m b/matlab/gtsam_examples/Pose3SLAMExample.m index b1521ff5b..0d2bd237f 100644 --- a/matlab/gtsam_examples/Pose3SLAMExample.m +++ b/matlab/gtsam_examples/Pose3SLAMExample.m @@ -10,14 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create a hexagon of poses import gtsam.* -hexagon = gtsam.circlePose3(6,1.0); + +%% Create a hexagon of poses +hexagon = circlePose3(6,1.0); p0 = hexagon.at(0); p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement -import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose3(0, p0)); delta = p0.between(p1); @@ -30,7 +30,6 @@ fg.add(BetweenFactorPose3(4,5, delta, covariance)); fg.add(BetweenFactorPose3(5,0, delta, covariance)); %% Create initial config -import gtsam.* initial = Values; s = 0.10; initial.insert(0, p0); @@ -41,18 +40,15 @@ initial.insert(4, hexagon.at(4).retract(s*randn(6,1))); initial.insert(5, hexagon.at(5).retract(s*randn(6,1))); %% Plot Initial Estimate -import gtsam.* cla -gtsam.plot3DTrajectory(initial, 'g-*'); +plot3DTrajectory(initial, 'g-*'); %% optimize -import gtsam.* optimizer = DoglegOptimizer(fg, initial); result = optimizer.optimizeSafely(); %% Show Result -import gtsam.* -hold on; gtsam.plot3DTrajectory(result, 'b-*', true, 0.3); +hold on; plot3DTrajectory(result, 'b-*', true, 0.3); axis([-2 2 -2 2 -1 1]); axis equal view(-37,40) diff --git a/matlab/gtsam_examples/Pose3SLAMExample_graph.m b/matlab/gtsam_examples/Pose3SLAMExample_graph.m index 19cc31439..f4eb8dd3a 100644 --- a/matlab/gtsam_examples/Pose3SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose3SLAMExample_graph.m @@ -10,33 +10,32 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Find data file N = 2500; % dataset = 'sphere_smallnoise.graph'; % dataset = 'sphere2500_groundtruth.txt'; dataset = 'sphere2500.txt'; -datafile = gtsam.findExampleDataFile(dataset); +datafile = findExampleDataFile(dataset); %% Initialize graph, initial estimate, and odometry noise -import gtsam.* model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 0.05; 5*pi/180; 5*pi/180; 5*pi/180]); -[graph,initial]=gtsam.load3D(datafile,model,true,N); +[graph,initial]=load3D(datafile,model,true,N); %% Plot Initial Estimate -import gtsam.* cla first = initial.at(0); plot3(first.x(),first.y(),first.z(),'r*'); hold on -gtsam.plot3DTrajectory(initial,'g-',false); +plot3DTrajectory(initial,'g-',false); drawnow; %% Read again, now with all constraints, and optimize -import gtsam.* -graph = gtsam.load3D(datafile, model, false, N); +graph = load3D(datafile, model, false, N); graph.add(NonlinearEqualityPose3(0, first)); optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely(); -gtsam.plot3DTrajectory(result, 'r-', false); axis equal; +plot3DTrajectory(result, 'r-', false); axis equal; view(3); axis equal; \ No newline at end of file diff --git a/matlab/gtsam_examples/SBAExample.m b/matlab/gtsam_examples/SBAExample.m index 7e4ac4031..b0f754044 100644 --- a/matlab/gtsam_examples/SBAExample.m +++ b/matlab/gtsam_examples/SBAExample.m @@ -10,6 +10,8 @@ % @author Yong-Dian Jian %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - Landmarks as 8 vertices of a cube: (10,10,10) (-10,10,10) etc... % - Cameras are on a circle around the cube, pointing at the world origin @@ -22,7 +24,7 @@ options.nrCameras = 10; options.showImages = false; %% Generate data -[data,truth] = gtsam.VisualISAMGenerateData(options); +[data,truth] = VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; @@ -30,12 +32,10 @@ cameraNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1 ... 0.001*ones(1,5)]'; %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) -import gtsam.* graph = NonlinearFactorGraph; %% Add factors for all measurements -import gtsam.* measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) @@ -45,7 +45,6 @@ for i=1:length(data.Z) end %% Add Gaussian priors for a pose and a landmark to constrain the system -import gtsam.* cameraPriorNoise = noiseModel.Diagonal.Sigmas(cameraNoiseSigmas); firstCamera = SimpleCamera(truth.cameras{1}.pose, truth.K); graph.add(PriorFactorSimpleCamera(symbol('c',1), firstCamera, cameraPriorNoise)); @@ -58,7 +57,6 @@ graph.print(sprintf('\nFactor graph:\n')); %% Initialize cameras and points close to ground truth in this example -import gtsam.* initialEstimate = Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); @@ -72,8 +70,6 @@ end initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Fine grain optimization, allowing user to iterate step by step - -import gtsam.* parameters = LevenbergMarquardtParams; parameters.setlambdaInitial(1.0); parameters.setVerbosityLM('trylambda'); @@ -86,5 +82,3 @@ end result = optimizer.values(); result.print(sprintf('\nFinal result:\n ')); - - diff --git a/matlab/gtsam_examples/SFMExample.m b/matlab/gtsam_examples/SFMExample.m index 92eeb482b..4115fa6e3 100644 --- a/matlab/gtsam_examples/SFMExample.m +++ b/matlab/gtsam_examples/SFMExample.m @@ -10,6 +10,8 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - Landmarks as 8 vertices of a cube: (10,10,10) (-10,10,10) etc... % - Cameras are on a circle around the cube, pointing at the world origin @@ -22,18 +24,16 @@ options.nrCameras = 10; options.showImages = false; %% Generate data -[data,truth] = gtsam.VisualISAMGenerateData(options); +[data,truth] = VisualISAMGenerateData(options); measurementNoiseSigma = 1.0; pointNoiseSigma = 0.1; poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; %% Create the graph (defined in visualSLAM.h, derived from NonlinearFactorGraph) -import gtsam.* graph = NonlinearFactorGraph; %% Add factors for all measurements -import gtsam.* measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) @@ -43,7 +43,6 @@ for i=1:length(data.Z) end %% Add Gaussian priors for a pose and a landmark to constrain the system -import gtsam.* posePriorNoise = noiseModel.Diagonal.Sigmas(poseNoiseSigmas); graph.add(PriorFactorPose3(symbol('x',1), truth.cameras{1}.pose, posePriorNoise)); pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); @@ -53,7 +52,6 @@ graph.add(PriorFactorPoint3(symbol('p',1), truth.points{1}, pointPriorNoise)); graph.print(sprintf('\nFactor graph:\n')); %% Initialize cameras and points close to ground truth in this example -import gtsam.* initialEstimate = Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose.retract(0.1*randn(6,1)); @@ -66,8 +64,6 @@ end initialEstimate.print(sprintf('\nInitial estimate:\n ')); %% Fine grain optimization, allowing user to iterate step by step - -import gtsam.* parameters = LevenbergMarquardtParams; parameters.setlambdaInitial(1.0); parameters.setVerbosityLM('trylambda'); @@ -81,13 +77,12 @@ result = optimizer.values(); result.print(sprintf('\nFinal result:\n ')); %% Plot results with covariance ellipses -import gtsam.* marginals = Marginals(graph, result); cla hold on; -gtsam.plot3DPoints(result, [], marginals); -gtsam.plot3DTrajectory(result, '*', 1, 8, marginals); +plot3DPoints(result, [], marginals); +plot3DTrajectory(result, '*', 1, 8, marginals); axis([-40 40 -40 40 -10 20]);axis equal view(3) diff --git a/matlab/gtsam_examples/StereoVOExample.m b/matlab/gtsam_examples/StereoVOExample.m index 94c4b3f37..8dbaa1a76 100644 --- a/matlab/gtsam_examples/StereoVOExample.m +++ b/matlab/gtsam_examples/StereoVOExample.m @@ -10,6 +10,8 @@ % @author Chris Beall %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - For simplicity this example is in the camera's coordinate frame % - X: right, Y: down, Z: forward @@ -18,27 +20,22 @@ % - No noise on measurements %% Create keys for variables -import gtsam.* x1 = symbol('x',1); x2 = symbol('x',2); l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); %% Create graph container and add factors to it -import gtsam.* graph = NonlinearFactorGraph; %% add a constraint on the starting pose -import gtsam.* first_pose = Pose3(); graph.add(NonlinearEqualityPose3(x1, first_pose)); %% Create realistic calibration and measurement noise model % format: fx fy skew cx cy baseline -import gtsam.* K = Cal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); %% Add measurements -import gtsam.* % pose 1 graph.add(GenericStereoFactor3D(StereoPoint2(520, 480, 440), stereo_model, x1, l1, K)); graph.add(GenericStereoFactor3D(StereoPoint2(120, 80, 440), stereo_model, x1, l2, K)); @@ -51,7 +48,6 @@ graph.add(GenericStereoFactor3D(StereoPoint2(320, 270, 115), stereo_model, x2, l %% Create initial estimate for camera poses and landmarks -import gtsam.* initialEstimate = Values; initialEstimate.insert(x1, first_pose); % noisy estimate for pose 2 @@ -62,7 +58,6 @@ initialEstimate.insert(l3, Point3( 0,-.5, 5)); %% optimize fprintf(1,'Optimizing\n'); tic -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); toc @@ -75,6 +70,6 @@ axis equal view(-38,12) camup([0;1;0]); -gtsam.plot3DTrajectory(initialEstimate, 'r', 1, 0.3); -gtsam.plot3DTrajectory(result, 'g', 1, 0.3); -gtsam.plot3DPoints(result); +plot3DTrajectory(initialEstimate, 'r', 1, 0.3); +plot3DTrajectory(result, 'g', 1, 0.3); +plot3DPoints(result); diff --git a/matlab/gtsam_examples/StereoVOExample_large.m b/matlab/gtsam_examples/StereoVOExample_large.m index 850af4f80..b77733abd 100644 --- a/matlab/gtsam_examples/StereoVOExample_large.m +++ b/matlab/gtsam_examples/StereoVOExample_large.m @@ -10,10 +10,11 @@ % @author Chris Beall %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Load calibration import gtsam.* + +%% Load calibration % format: fx fy skew cx cy baseline -calib = dlmread(gtsam.findExampleDataFile('VO_calibration.txt')); +calib = dlmread(findExampleDataFile('VO_calibration.txt')); K = Cal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6)); stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); @@ -24,9 +25,8 @@ initial = Values; %% load the initial poses from VO % row format: camera_id 4x4 pose (row, major) -import gtsam.* fprintf(1,'Reading data\n'); -cameras = dlmread(gtsam.findExampleDataFile('VO_camera_poses_large.txt')); +cameras = dlmread(findExampleDataFile('VO_camera_poses_large.txt')); for i=1:size(cameras,1) pose = Pose3(reshape(cameras(i,2:17),4,4)'); initial.insert(symbol('x',cameras(i,1)),pose); @@ -34,8 +34,7 @@ end %% load stereo measurements and initialize landmarks % camera_id landmark_id uL uR v X Y Z -import gtsam.* -measurements = dlmread(gtsam.findExampleDataFile('VO_stereo_factors_large.txt')); +measurements = dlmread(findExampleDataFile('VO_stereo_factors_large.txt')); fprintf(1,'Creating Graph\n'); tic for i=1:size(measurements,1) @@ -54,13 +53,11 @@ end toc %% add a constraint on the starting pose -import gtsam.* key = symbol('x',1); first_pose = initial.at(key); graph.add(NonlinearEqualityPose3(key, first_pose)); %% optimize -import gtsam.* fprintf(1,'Optimizing\n'); tic optimizer = LevenbergMarquardtOptimizer(graph, initial); result = optimizer.optimizeSafely(); @@ -69,9 +66,9 @@ toc %% visualize initial trajectory, final trajectory, and final points cla; hold on; -gtsam.plot3DTrajectory(initial, 'r', 1, 0.5); -gtsam.plot3DTrajectory(result, 'g', 1, 0.5); -gtsam.plot3DPoints(result); +plot3DTrajectory(initial, 'r', 1, 0.5); +plot3DTrajectory(result, 'g', 1, 0.5); +plot3DPoints(result); axis([-5 20 -20 20 0 100]); axis equal diff --git a/matlab/gtsam_examples/VisualISAMExample.m b/matlab/gtsam_examples/VisualISAMExample.m index 31c240029..751373b69 100644 --- a/matlab/gtsam_examples/VisualISAMExample.m +++ b/matlab/gtsam_examples/VisualISAMExample.m @@ -10,6 +10,8 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + % Data Options options.triangle = false; options.nrCameras = 20; @@ -32,17 +34,17 @@ options.saveFigures = false; options.saveDotFiles = false; %% Generate data -[data,truth] = gtsam.VisualISAMGenerateData(options); +[data,truth] = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -[noiseModels,isam,result,nextPose] = gtsam.VisualISAMInitialize(data,truth,options); +[noiseModels,isam,result,nextPose] = VisualISAMInitialize(data,truth,options); cla; -gtsam.VisualISAMPlot(truth, data, isam, result, options) +VisualISAMPlot(truth, data, isam, result, options) %% Main loop for iSAM: stepping through all poses for frame_i=3:options.nrCameras - [isam,result,nextPose] = gtsam.VisualISAMStep(data,noiseModels,isam,result,truth,nextPose); + [isam,result,nextPose] = VisualISAMStep(data,noiseModels,isam,result,truth,nextPose); if mod(frame_i,options.drawInterval)==0 - gtsam.VisualISAMPlot(truth, data, isam, result, options) + VisualISAMPlot(truth, data, isam, result, options) end end diff --git a/matlab/gtsam_tests/testLocalizationExample.m b/matlab/gtsam_tests/testLocalizationExample.m index bbe91641d..5f1d89c99 100644 --- a/matlab/gtsam_tests/testLocalizationExample.m +++ b/matlab/gtsam_tests/testLocalizationExample.m @@ -10,12 +10,12 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) import gtsam.* + +%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) graph = NonlinearFactorGraph; %% Add two odometry factors -import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); @@ -23,7 +23,6 @@ graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Add three "GPS" measurements % We use Pose2 Priors here with high variance on theta -import gtsam.* groundTruth = Values; groundTruth.insert(1, Pose2(0.0, 0.0, 0.0)); groundTruth.insert(2, Pose2(2.0, 0.0, 0.0)); @@ -34,19 +33,16 @@ for i=1:3 end %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); %% Plot Covariance Ellipses -import gtsam.* marginals = Marginals(graph, result); P={}; for i=1:result.size() diff --git a/matlab/gtsam_tests/testOdometryExample.m b/matlab/gtsam_tests/testOdometryExample.m index 37a6d83e5..442b36801 100644 --- a/matlab/gtsam_tests/testOdometryExample.m +++ b/matlab/gtsam_tests/testOdometryExample.m @@ -10,38 +10,34 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) import gtsam.* + +%% Create the graph (defined in pose2SLAM.h, derived from NonlinearFactorGraph) graph = NonlinearFactorGraph; %% Add a Gaussian prior on pose x_1 -import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior mean is at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); % 30cm std on x,y, 0.1 rad on theta graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add two odometry factors -import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); % create a measurement for both factors (the same in this case) odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); % 20cm std on x,y, 0.1 rad on theta graph.add(BetweenFactorPose2(1, 2, odometry, odometryNoise)); graph.add(BetweenFactorPose2(2, 3, odometry, odometryNoise)); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2)); initialEstimate.insert(3, Pose2(4.1, 0.1, 0.1)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); marginals = Marginals(graph, result); marginals.marginalCovariance(1); %% Check first pose equality -import gtsam.* pose_1 = result.at(1); CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); diff --git a/matlab/gtsam_tests/testPlanarSLAMExample.m b/matlab/gtsam_tests/testPlanarSLAMExample.m index d3988d0f9..2a736a710 100644 --- a/matlab/gtsam_tests/testPlanarSLAMExample.m +++ b/matlab/gtsam_tests/testPlanarSLAMExample.m @@ -11,6 +11,8 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - All values are axis aligned % - Robot poses are facing along the X axis (horizontal, to the right in images) @@ -20,29 +22,24 @@ % - Landmarks are 2 meters away from the robot trajectory %% Create keys for variables -import gtsam.* i1 = symbol('x',1); i2 = symbol('x',2); i3 = symbol('x',3); j1 = symbol('l',1); j2 = symbol('l',2); %% Create graph container and add factors to it -import gtsam.* graph = NonlinearFactorGraph; %% Add prior -import gtsam.* priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); graph.add(PriorFactorPose2(i1, priorMean, priorNoise)); % add directly to graph %% Add odometry -import gtsam.* odometry = Pose2(2.0, 0.0, 0.0); odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.add(BetweenFactorPose2(i1, i2, odometry, odometryNoise)); graph.add(BetweenFactorPose2(i2, i3, odometry, odometryNoise)); %% Add bearing/range measurement factors -import gtsam.* degrees = pi/180; brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); graph.add(BearingRangeFactor2D(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise)); @@ -50,7 +47,6 @@ graph.add(BearingRangeFactor2D(i2, j1, Rot2(90*degrees), 2, brNoise)); graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(i1, Pose2(0.5, 0.0, 0.2)); initialEstimate.insert(i2, Pose2(2.3, 0.1,-0.2)); @@ -59,13 +55,11 @@ initialEstimate.insert(j1, Point2(1.8, 2.1)); initialEstimate.insert(j2, Point2(4.1, 1.8)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); marginals = Marginals(graph, result); %% Check first pose and point equality -import gtsam.* pose_1 = result.at(symbol('x',1)); marginals.marginalCovariance(symbol('x',1)); CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); diff --git a/matlab/gtsam_tests/testPose2SLAMExample.m b/matlab/gtsam_tests/testPose2SLAMExample.m index 9d934aab9..127bcd41c 100644 --- a/matlab/gtsam_tests/testPose2SLAMExample.m +++ b/matlab/gtsam_tests/testPose2SLAMExample.m @@ -12,6 +12,8 @@ % @author Chris Beall %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - All values are axis aligned % - Robot poses are facing along the X axis (horizontal, to the right in images) @@ -19,11 +21,9 @@ % - The robot is on a grid, moving 2 meters each step %% Create graph container and add factors to it -import gtsam.* graph = NonlinearFactorGraph; %% Add prior -import gtsam.* % gaussian for prior priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); @@ -31,7 +31,6 @@ graph.add(PriorFactorPose2(1, priorMean, priorNoise)); % add directly to graph %% Add odometry % general noisemodel for odometry -import gtsam.* odometryNoise = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.add(BetweenFactorPose2(1, 2, Pose2(2.0, 0.0, 0.0 ), odometryNoise)); graph.add(BetweenFactorPose2(2, 3, Pose2(2.0, 0.0, pi/2), odometryNoise)); @@ -39,12 +38,10 @@ graph.add(BetweenFactorPose2(3, 4, Pose2(2.0, 0.0, pi/2), odometryNoise)); graph.add(BetweenFactorPose2(4, 5, Pose2(2.0, 0.0, pi/2), odometryNoise)); %% Add pose constraint -import gtsam.* model = noiseModel.Diagonal.Sigmas([0.2; 0.2; 0.1]); graph.add(BetweenFactorPose2(5, 2, Pose2(2.0, 0.0, pi/2), model)); %% Initialize to noisy points -import gtsam.* initialEstimate = Values; initialEstimate.insert(1, Pose2(0.5, 0.0, 0.2 )); initialEstimate.insert(2, Pose2(2.3, 0.1,-0.2 )); @@ -53,26 +50,14 @@ initialEstimate.insert(4, Pose2(4.0, 2.0, pi )); initialEstimate.insert(5, Pose2(2.1, 2.1,-pi/2)); %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimizeSafely(); -%% Optimize using SPCG -%import gtsam.* -%params = LevenbergMarquardtParams; -%params.setLinearSolverType('CONJUGATE_GRADIENT'); -%optimizerSPCG = LevenbergMarquardtOptimizer(graph, initialEstimate, params); -%resultSPCG = optimizerSPCG.optimize(); - %% Plot Covariance Ellipses -import gtsam.* marginals = Marginals(graph, result); P = marginals.marginalCovariance(1); pose_1 = result.at(1); CHECK('pose_1.equals(Pose2,1e-4)',pose_1.equals(Pose2,1e-4)); -%poseSPCG_1 = resultSPCG.at(1); -%CHECK('poseSPCG_1.equals(Pose2,1e-4)',poseSPCG_1.equals(Pose2,1e-4)); - diff --git a/matlab/gtsam_tests/testPose3SLAMExample.m b/matlab/gtsam_tests/testPose3SLAMExample.m index fc2f95a71..dafad4e47 100644 --- a/matlab/gtsam_tests/testPose3SLAMExample.m +++ b/matlab/gtsam_tests/testPose3SLAMExample.m @@ -10,14 +10,14 @@ % @author Frank Dellaert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Create a hexagon of poses import gtsam.* + +%% Create a hexagon of poses hexagon = circlePose3(6,1.0); p0 = hexagon.at(0); p1 = hexagon.at(1); %% create a Pose graph with one equality constraint and one measurement -import gtsam.* fg = NonlinearFactorGraph; fg.add(NonlinearEqualityPose3(0, p0)); delta = p0.between(p1); @@ -30,7 +30,6 @@ fg.add(BetweenFactorPose3(4,5, delta, covariance)); fg.add(BetweenFactorPose3(5,0, delta, covariance)); %% Create initial config -import gtsam.* initial = Values; s = 0.10; initial.insert(0, p0); @@ -41,7 +40,6 @@ initial.insert(4, hexagon.at(4).retract(s*randn(6,1))); initial.insert(5, hexagon.at(5).retract(s*randn(6,1))); %% optimize -import gtsam.* optimizer = LevenbergMarquardtOptimizer(fg, initial); result = optimizer.optimizeSafely; diff --git a/matlab/gtsam_tests/testSFMExample.m b/matlab/gtsam_tests/testSFMExample.m index 5c47a0184..2b04be8f1 100644 --- a/matlab/gtsam_tests/testSFMExample.m +++ b/matlab/gtsam_tests/testSFMExample.m @@ -25,7 +25,6 @@ poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; graph = NonlinearFactorGraph; %% Add factors for all measurements -import gtsam.* measurementNoise = noiseModel.Isotropic.Sigma(2,measurementNoiseSigma); for i=1:length(data.Z) for k=1:length(data.Z{i}) @@ -40,7 +39,6 @@ pointPriorNoise = noiseModel.Isotropic.Sigma(3,pointNoiseSigma); graph.add(PriorFactorPoint3(symbol('p',1), truth.points{1}, pointPriorNoise)); %% Initial estimate -import gtsam.* initialEstimate = Values; for i=1:size(truth.cameras,2) pose_i = truth.cameras{i}.pose; @@ -52,7 +50,6 @@ for j=1:size(truth.points,2) end %% Optimization -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); for i=1:5 optimizer.iterate(); @@ -60,13 +57,11 @@ end result = optimizer.values(); %% Marginalization -import gtsam.* marginals = Marginals(graph, result); marginals.marginalCovariance(symbol('p',1)); marginals.marginalCovariance(symbol('x',1)); %% Check optimized results, should be equal to ground truth -import gtsam.* for i=1:size(truth.cameras,2) pose_i = result.at(symbol('x',i)); CHECK('pose_i.equals(truth.cameras{i}.pose,1e-5)',pose_i.equals(truth.cameras{i}.pose,1e-5)) diff --git a/matlab/gtsam_tests/testStereoVOExample.m b/matlab/gtsam_tests/testStereoVOExample.m index f4b0e5b4a..e2d6f2479 100644 --- a/matlab/gtsam_tests/testStereoVOExample.m +++ b/matlab/gtsam_tests/testStereoVOExample.m @@ -10,6 +10,8 @@ % @author Chris Beall %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + %% Assumptions % - For simplicity this example is in the camera's coordinate frame % - X: right, Y: down, Z: forward @@ -18,27 +20,22 @@ % - No noise on measurements %% Create keys for variables -import gtsam.* x1 = symbol('x',1); x2 = symbol('x',2); l1 = symbol('l',1); l2 = symbol('l',2); l3 = symbol('l',3); %% Create graph container and add factors to it -import gtsam.* graph = NonlinearFactorGraph; %% add a constraint on the starting pose -import gtsam.* first_pose = Pose3(); graph.add(NonlinearEqualityPose3(x1, first_pose)); %% Create realistic calibration and measurement noise model % format: fx fy skew cx cy baseline -import gtsam.* K = Cal3_S2Stereo(1000, 1000, 0, 320, 240, 0.2); stereo_model = noiseModel.Diagonal.Sigmas([1.0; 1.0; 1.0]); %% Add measurements -import gtsam.* % pose 1 graph.add(GenericStereoFactor3D(StereoPoint2(520, 480, 440), stereo_model, x1, l1, K)); graph.add(GenericStereoFactor3D(StereoPoint2(120, 80, 440), stereo_model, x1, l2, K)); @@ -49,9 +46,7 @@ graph.add(GenericStereoFactor3D(StereoPoint2(570, 520, 490), stereo_model, x2, l graph.add(GenericStereoFactor3D(StereoPoint2( 70, 20, 490), stereo_model, x2, l2, K)); graph.add(GenericStereoFactor3D(StereoPoint2(320, 270, 115), stereo_model, x2, l3, K)); - %% Create initial estimate for camera poses and landmarks -import gtsam.* initialEstimate = Values; initialEstimate.insert(x1, first_pose); % noisy estimate for pose 2 @@ -62,12 +57,10 @@ initialEstimate.insert(l2, Point3(-1, 1, 5)); initialEstimate.insert(l3, Point3( 0,-.5, 5)); %% optimize -import gtsam.* optimizer = LevenbergMarquardtOptimizer(graph, initialEstimate); result = optimizer.optimize(); %% check equality for the first pose and point -import gtsam.* pose_x1 = result.at(x1); CHECK('pose_x1.equals(first_pose,1e-4)',pose_x1.equals(first_pose,1e-4)); diff --git a/matlab/gtsam_tests/testVisualISAMExample.m b/matlab/gtsam_tests/testVisualISAMExample.m index a36473341..40aca458e 100644 --- a/matlab/gtsam_tests/testVisualISAMExample.m +++ b/matlab/gtsam_tests/testVisualISAMExample.m @@ -10,6 +10,8 @@ % @author Duy-Nguyen Ta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +import gtsam.* + % Data Options options.triangle = false; options.nrCameras = 20; @@ -32,15 +34,12 @@ options.saveFigures = false; options.saveDotFiles = false; %% Generate data -import gtsam.* [data,truth] = VisualISAMGenerateData(options); %% Initialize iSAM with the first pose and points -import gtsam.* [noiseModels,isam,result,nextPose] = VisualISAMInitialize(data,truth,options); %% Main loop for iSAM: stepping through all poses -import gtsam.* for frame_i=3:options.nrCameras [isam,result,nextPose] = VisualISAMStep(data,noiseModels,isam,result,truth,nextPose); end From b57b2df3134b75892e9b721fd877a8f2cc973cf0 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 5 Aug 2012 23:52:47 +0000 Subject: [PATCH 763/914] Added a C++ function for matlab to insert multiple projection factors from a single frame. --- gtsam.h | 1 + matlab.h | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/gtsam.h b/gtsam.h index 346ded351..578d44a08 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1550,6 +1550,7 @@ namespace utilities { void perturbPoint2(gtsam::Values& values, double sigma, int seed); void perturbPoint3(gtsam::Values& values, double sigma, int seed); void insertBackprojections(gtsam::Values& values, const gtsam::SimpleCamera& c, Vector J, Matrix Z, double depth); + void insertProjectionFactors(gtsam::NonlinearFactorGraph& graph, size_t i, Vector J, Matrix Z, const gtsam::noiseModel::Base* model, const gtsam::Cal3_S2* K); Matrix reprojectionErrors(const gtsam::NonlinearFactorGraph& graph, const gtsam::Values& values); } //\namespace utilities diff --git a/matlab.h b/matlab.h index 1a9af8396..1be686ff4 100644 --- a/matlab.h +++ b/matlab.h @@ -108,6 +108,19 @@ namespace gtsam { } } + /// insert multiple projection factors for a single pose key + void insertProjectionFactors(NonlinearFactorGraph& graph, Key i, const Vector& J, const Matrix& Z, + const SharedNoiseModel& model, const shared_ptrK K) { + if (Z.rows() != 2) throw std::invalid_argument("addMeasurements: Z must be 2*K"); + if (Z.cols() != J.size()) throw std::invalid_argument( + "addMeasurements: J and Z must have same number of entries"); + for (int k = 0; k < Z.cols(); k++) { + graph.push_back( + make_shared > + (Point2(Z(0, k), Z(1, k)), model, i, J(k), K)); + } + } + /// calculate the errors of all projection factors in a graph Matrix reprojectionErrors(const NonlinearFactorGraph& graph, const Values& values) { // first count From ee87b51a9fa4ab5c3f9b927e2723bad8090393c2 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 6 Aug 2012 13:12:03 +0000 Subject: [PATCH 764/914] small changes --- matlab/gtsam_examples/PlanarSLAMExample.m | 6 +++--- matlab/gtsam_examples/Pose2SLAMExample_graph.m | 11 ++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/matlab/gtsam_examples/PlanarSLAMExample.m b/matlab/gtsam_examples/PlanarSLAMExample.m index 1dc6ba41c..ef1516017 100644 --- a/matlab/gtsam_examples/PlanarSLAMExample.m +++ b/matlab/gtsam_examples/PlanarSLAMExample.m @@ -31,7 +31,7 @@ graph = NonlinearFactorGraph; %% Add prior priorMean = Pose2(0.0, 0.0, 0.0); % prior at origin priorNoise = noiseModel.Diagonal.Sigmas([0.3; 0.3; 0.1]); -graph.add(PriorFactorPose2(i1, priorMean, priorNoise)); % add directly to graph +graph.add(PriorFactorPose2(i1, priorMean, priorNoise)); %% Add odometry odometry = Pose2(2.0, 0.0, 0.0); @@ -42,7 +42,7 @@ graph.add(BetweenFactorPose2(i2, i3, odometry, odometryNoise)); %% Add bearing/range measurement factors degrees = pi/180; brNoise = noiseModel.Diagonal.Sigmas([0.1; 0.2]); -graph.add(BearingRangeFactor2D(i1, j1, Rot2(45*degrees), sqrt(4+4), brNoise)); +graph.add(BearingRangeFactor2D(i1, j1, Rot2(45*degrees), sqrt(8), brNoise)); graph.add(BearingRangeFactor2D(i2, j1, Rot2(90*degrees), 2, brNoise)); graph.add(BearingRangeFactor2D(i3, j2, Rot2(90*degrees), 2, brNoise)); @@ -69,7 +69,7 @@ cla;hold on marginals = Marginals(graph, result); plot2DTrajectory(result, [], marginals); -plot2DPoints(result, [], marginals); +plot2DPoints(result, 'b', marginals); plot([result.at(i1).x; result.at(j1).x],[result.at(i1).y; result.at(j1).y], 'c-'); plot([result.at(i2).x; result.at(j1).x],[result.at(i2).y; result.at(j1).y], 'c-'); diff --git a/matlab/gtsam_examples/Pose2SLAMExample_graph.m b/matlab/gtsam_examples/Pose2SLAMExample_graph.m index b48485573..eb1b03950 100644 --- a/matlab/gtsam_examples/Pose2SLAMExample_graph.m +++ b/matlab/gtsam_examples/Pose2SLAMExample_graph.m @@ -17,11 +17,7 @@ datafile = findExampleDataFile('w100-odom.graph'); %% Initialize graph, initial estimate, and odometry noise model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 5*pi/180]); -maxID = 0; -addNoise = false; -smart = true; -[graph,initial] = load2D(datafile, model, maxID, addNoise, smart); -initial.print(sprintf('Initial estimate:\n')); +[graph,initial] = load2D(datafile, model); %% Add a Gaussian prior on pose x_1 priorMean = Pose2(0, 0, 0); % prior mean is at origin @@ -34,9 +30,10 @@ plot2DTrajectory(initial, 'g-*'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd optimizer = LevenbergMarquardtOptimizer(graph, initial); +tic result = optimizer.optimizeSafely; +toc hold on; plot2DTrajectory(result, 'b-*'); -result.print(sprintf('\nFinal result:\n')); %% Plot Covariance Ellipses marginals = Marginals(graph, result); @@ -48,4 +45,4 @@ for i=1:result.size()-1 end view(2) axis tight; axis equal; -fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file +% fprintf(1,'%.5f %.5f %.5f\n',P{99}) \ No newline at end of file From 7c1f7d3d21bbc0e5ab162b580f7629e045e004db Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 6 Aug 2012 18:42:54 +0000 Subject: [PATCH 765/914] Resolved ambiguous call on windows --- matlab.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matlab.h b/matlab.h index 1be686ff4..dfc0117e7 100644 --- a/matlab.h +++ b/matlab.h @@ -116,8 +116,8 @@ namespace gtsam { "addMeasurements: J and Z must have same number of entries"); for (int k = 0; k < Z.cols(); k++) { graph.push_back( - make_shared > - (Point2(Z(0, k), Z(1, k)), model, i, J(k), K)); + boost::make_shared > + (Point2(Z(0, k), Z(1, k)), model, i, Key(J(k)), K)); } } From 900f30547f9b6c1eea70f50e3774cab641f96823 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 6 Aug 2012 18:42:56 +0000 Subject: [PATCH 766/914] Minor Cal3DS2 optimizations and default 3rd and 4th distortion coeffecients --- gtsam/geometry/Cal3DS2.cpp | 12 +----------- gtsam/geometry/Cal3DS2.h | 7 ++++--- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/gtsam/geometry/Cal3DS2.cpp b/gtsam/geometry/Cal3DS2.cpp index 8f15f81d2..66f8d99a7 100644 --- a/gtsam/geometry/Cal3DS2.cpp +++ b/gtsam/geometry/Cal3DS2.cpp @@ -23,13 +23,6 @@ namespace gtsam { -/* ************************************************************************* */ -Cal3DS2::Cal3DS2():fx_(1), fy_(1), s_(0), u0_(0), v0_(0), k1_(0), k2_(0), k3_(0), k4_(0){} - -/* ************************************************************************* */ -Cal3DS2::Cal3DS2(double fx, double fy, double s, double u0, double v0, double k1, double k2, double k3, double k4) : - fx_(fx), fy_(fy), s_(s), u0_(u0), v0_(v0), k1_(k1), k2_(k2), k3_(k3), k4_(k4) {} - /* ************************************************************************* */ Cal3DS2::Cal3DS2(const Vector &v): fx_(v[0]), fy_(v[1]), s_(v[2]), u0_(v[3]), v0_(v[4]), k1_(v[5]), k2_(v[6]), k3_(v[7]), k4_(v[8]){} @@ -37,14 +30,11 @@ Cal3DS2::Cal3DS2(const Vector &v): /* ************************************************************************* */ Matrix Cal3DS2::K() const { return Matrix_(3,3, fx_, s_, u0_, 0.0, fy_, v0_, 0.0, 0.0, 1.0); } -/* ************************************************************************* */ -Vector Cal3DS2::k() const { return Vector_(4, k1_, k2_, k3_, k4_); } - /* ************************************************************************* */ Vector Cal3DS2::vector() const { return Vector_(9, fx_, fy_, s_, u0_, v0_, k1_, k2_, k3_, k4_) ; } /* ************************************************************************* */ -void Cal3DS2::print(const std::string& s) const { gtsam::print(K(), s + ".K") ; gtsam::print(k(), s + ".k") ; } +void Cal3DS2::print(const std::string& s) const { gtsam::print(K(), s + ".K") ; gtsam::print(Vector(k()), s + ".k") ; } /* ************************************************************************* */ bool Cal3DS2::equals(const Cal3DS2& K, double tol) const { diff --git a/gtsam/geometry/Cal3DS2.h b/gtsam/geometry/Cal3DS2.h index d33b452c1..fc5918f28 100644 --- a/gtsam/geometry/Cal3DS2.h +++ b/gtsam/geometry/Cal3DS2.h @@ -44,17 +44,18 @@ private: public: Matrix K() const ; - Vector k() const ; + Eigen::Vector4d k() const { return Eigen::Vector4d(k1_, k2_, k3_, k4_); } Vector vector() const ; /// @name Standard Constructors /// @{ /// Default Constructor with only unit focal length - Cal3DS2(); + Cal3DS2() : fx_(1), fy_(1), s_(0), u0_(0), v0_(0), k1_(0), k2_(0), k3_(0), k4_(0) {} Cal3DS2(double fx, double fy, double s, double u0, double v0, - double k1, double k2, double k3, double k4) ; + double k1, double k2, double k3 = 0.0, double k4 = 0.0) : + fx_(fx), fy_(fy), s_(s), u0_(u0), v0_(v0), k1_(k1), k2_(k2), k3_(k3), k4_(k4) {} /// @} /// @name Advanced Constructors From 1565833c2c46b961680270b726cf0d5db85ed429 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 6 Aug 2012 21:42:26 +0000 Subject: [PATCH 767/914] More consistent order of private/protected/public - typedefs, private/protected variables, public interface, private/protected functions --- gtsam/base/DerivedValue.h | 7 +- gtsam/inference/BayesTree.h | 92 +++++++++---------- gtsam/inference/EliminationTree.h | 58 ++++++------ gtsam/inference/Factor.h | 17 ++-- gtsam/linear/JacobianFactor.h | 8 +- gtsam/nonlinear/DoglegOptimizer.h | 9 +- gtsam/nonlinear/GaussNewtonOptimizer.h | 9 +- gtsam/nonlinear/LevenbergMarquardtOptimizer.h | 53 +++++------ gtsam/nonlinear/Marginals.h | 12 ++- gtsam/nonlinear/NonlinearOptimizer.h | 28 +++--- gtsam/nonlinear/Values.h | 3 - 11 files changed, 139 insertions(+), 157 deletions(-) diff --git a/gtsam/base/DerivedValue.h b/gtsam/base/DerivedValue.h index 4f6dae9c7..52420ee93 100644 --- a/gtsam/base/DerivedValue.h +++ b/gtsam/base/DerivedValue.h @@ -24,9 +24,6 @@ namespace gtsam { template class DerivedValue : public Value { -private: - /// Fake Tag struct for singleton pool allocator. In fact, it is never used! - struct PoolTag { }; protected: DerivedValue() {} @@ -119,6 +116,10 @@ protected: return *this; } +private: + /// Fake Tag struct for singleton pool allocator. In fact, it is never used! + struct PoolTag { }; + }; } /* namespace gtsam */ diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 34e5c0c45..8b6de3fe6 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -94,51 +94,6 @@ namespace gtsam { /** Map from keys to Clique */ typedef std::deque Nodes; - protected: - - /** Map from keys to Clique */ - Nodes nodes_; - - /** private helper method for saving the Tree to a text file in GraphViz format */ - void saveGraph(std::ostream &s, sharedClique clique, const IndexFormatter& indexFormatter, - int parentnum = 0) const; - - /** Gather data on a single clique */ - void getCliqueData(CliqueData& stats, sharedClique clique) const; - - /** Root clique */ - sharedClique root_; - - /** remove a clique: warning, can result in a forest */ - void removeClique(sharedClique clique); - - /** add a clique (top down) */ - sharedClique addClique(const sharedConditional& conditional, const sharedClique& parent_clique = sharedClique()); - - /** add a clique (top down) */ - void addClique(const sharedClique& clique, const sharedClique& parent_clique = sharedClique()); - - /** add a clique (bottom up) */ - sharedClique addClique(const sharedConditional& conditional, std::list& child_cliques); - - /** - * Add a conditional to the front of a clique, i.e. a conditional whose - * parents are already in the clique or its separators. This function does - * not check for this condition, it just updates the data structures. - */ - static void addToCliqueFront(BayesTree& bayesTree, - const sharedConditional& conditional, const sharedClique& clique); - - /** Fill the nodes index for a subtree */ - void fillNodesIndex(const sharedClique& subtree); - - /** Helper function to build a non-symbolic tree (e.g. Gaussian) using a - * symbolic tree, used in the BT(BN) constructor. - */ - void recursiveTreeBuild(const boost::shared_ptr >& symbolic, - const std::vector >& conditionals, - const typename BayesTree::sharedClique& parent); - public: /// @name Standard Constructors @@ -184,8 +139,6 @@ namespace gtsam { /// @name Standard Interface /// @{ - public: - /** * Find parent clique of a conditional. It will look at all parents and * return the one with the lowest index in the ordering. @@ -284,6 +237,51 @@ namespace gtsam { sharedClique insert(const sharedConditional& clique, std::list& children, bool isRootClique = false); + + protected: + + /** Map from keys to Clique */ + Nodes nodes_; + + /** private helper method for saving the Tree to a text file in GraphViz format */ + void saveGraph(std::ostream &s, sharedClique clique, const IndexFormatter& indexFormatter, + int parentnum = 0) const; + + /** Gather data on a single clique */ + void getCliqueData(CliqueData& stats, sharedClique clique) const; + + /** Root clique */ + sharedClique root_; + + /** remove a clique: warning, can result in a forest */ + void removeClique(sharedClique clique); + + /** add a clique (top down) */ + sharedClique addClique(const sharedConditional& conditional, const sharedClique& parent_clique = sharedClique()); + + /** add a clique (top down) */ + void addClique(const sharedClique& clique, const sharedClique& parent_clique = sharedClique()); + + /** add a clique (bottom up) */ + sharedClique addClique(const sharedConditional& conditional, std::list& child_cliques); + + /** + * Add a conditional to the front of a clique, i.e. a conditional whose + * parents are already in the clique or its separators. This function does + * not check for this condition, it just updates the data structures. + */ + static void addToCliqueFront(BayesTree& bayesTree, + const sharedConditional& conditional, const sharedClique& clique); + + /** Fill the nodes index for a subtree */ + void fillNodesIndex(const sharedClique& subtree); + + /** Helper function to build a non-symbolic tree (e.g. Gaussian) using a + * symbolic tree, used in the BT(BN) constructor. + */ + void recursiveTreeBuild(const boost::shared_ptr >& symbolic, + const std::vector >& conditionals, + const typename BayesTree::sharedClique& parent); private: diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index 495fb40c8..286f85268 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -73,39 +73,11 @@ private: Factors factors_; ///< factors associated with root SubTrees subTrees_; ///< sub-trees +public: + /// @name Standard Constructors /// @{ - /** default constructor, private, as you should use Create below */ - EliminationTree(Index key = 0) : key_(key) {} - - /// @} - /// @name Advanced Interface - /// @{ - - /** - * Static internal function to build a vector of parent pointers using the - * algorithm of Gilbert et al., 2001, BIT. - */ - static std::vector ComputeParents(const VariableIndex& structure); - - /** add a factor, for Create use only */ - void add(const sharedFactor& factor) { factors_.push_back(factor); } - - /** add a subtree, for Create use only */ - void add(const shared_ptr& child) { subTrees_.push_back(child); } - - /** - * Recursive routine that eliminates the factors arranged in an elimination tree - * @param Conditionals is a vector of shared pointers that will be modified in place - */ - sharedFactor eliminate_(Eliminate function, Conditionals& conditionals) const; - - /// Allow access to constructor and add methods for testing purposes - friend class ::EliminationTreeTester; - -public: - /** * Named constructor to build the elimination tree of a factor graph using * pre-computed column structure. @@ -151,6 +123,32 @@ public: /// @} +private: + + /** default constructor, private, as you should use Create below */ + EliminationTree(Index key = 0) : key_(key) {} + + /** + * Static internal function to build a vector of parent pointers using the + * algorithm of Gilbert et al., 2001, BIT. + */ + static std::vector ComputeParents(const VariableIndex& structure); + + /** add a factor, for Create use only */ + void add(const sharedFactor& factor) { factors_.push_back(factor); } + + /** add a subtree, for Create use only */ + void add(const shared_ptr& child) { subTrees_.push_back(child); } + + /** + * Recursive routine that eliminates the factors arranged in an elimination tree + * @param Conditionals is a vector of shared pointers that will be modified in place + */ + sharedFactor eliminate_(Eliminate function, Conditionals& conditionals) const; + + /// Allow access to constructor and add methods for testing purposes + friend class ::EliminationTreeTester; + }; diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index d81c911a3..950f6e65f 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -81,15 +81,6 @@ protected: /// The keys involved in this factor std::vector keys_; - friend class JacobianFactor; - friend class HessianFactor; - -protected: - - /// Internal consistency check that is run frequently when in debug mode. - /// If NDEBUG is defined, this is empty and optimized out. - void assertInvariants() const; - public: /// @name Standard Constructors @@ -212,9 +203,15 @@ public: iterator begin() { return keys_.begin(); } ///TODO: comment iterator end() { return keys_.end(); } ///TODO: comment +protected: + friend class JacobianFactor; + friend class HessianFactor; + + /// Internal consistency check that is run frequently when in debug mode. + /// If NDEBUG is defined, this is empty and optimized out. + void assertInvariants() const; private: - /** Serialization function */ friend class boost::serialization::access; template diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index c5f726252..43200d561 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -78,11 +78,9 @@ namespace gtsam { * \f[ E(x) = \frac{1}{2} (A_1 x_{j1} + A_2 x_{j2} - b)^T \Sigma^{-1} (A_1 x_{j1} + A_2 x_{j2} - b) . \f] */ class JacobianFactor : public GaussianFactor { - public: - typedef Matrix AbMatrix; - typedef VerticalBlockView BlockAb; - protected: + typedef Matrix AbMatrix; + typedef VerticalBlockView BlockAb; noiseModel::Diagonal::shared_ptr model_; // Gaussian noise model with diagonal covariance matrix std::vector firstNonzeroBlocks_; @@ -97,8 +95,6 @@ namespace gtsam { typedef BlockAb::Column BVector; typedef BlockAb::constColumn constBVector; - public: - /** Copy constructor */ JacobianFactor(const JacobianFactor& gf); diff --git a/gtsam/nonlinear/DoglegOptimizer.h b/gtsam/nonlinear/DoglegOptimizer.h index 70d55d192..71551dce1 100644 --- a/gtsam/nonlinear/DoglegOptimizer.h +++ b/gtsam/nonlinear/DoglegOptimizer.h @@ -67,7 +67,6 @@ private: */ class DoglegState : public NonlinearOptimizerState { public: - double Delta; DoglegState() {} @@ -86,8 +85,11 @@ protected: */ class DoglegOptimizer : public NonlinearOptimizer { -public: +protected: + DoglegParams params_; + DoglegState state_; +public: typedef boost::shared_ptr shared_ptr; /// @name Standard interface @@ -143,9 +145,6 @@ public: /// @} protected: - DoglegParams params_; - DoglegState state_; - /** Access the parameters (base class version) */ virtual const NonlinearOptimizerParams& _params() const { return params_; } diff --git a/gtsam/nonlinear/GaussNewtonOptimizer.h b/gtsam/nonlinear/GaussNewtonOptimizer.h index 1a1984ffb..b68ac4fc5 100644 --- a/gtsam/nonlinear/GaussNewtonOptimizer.h +++ b/gtsam/nonlinear/GaussNewtonOptimizer.h @@ -43,8 +43,11 @@ protected: */ class GaussNewtonOptimizer : public NonlinearOptimizer { -public: +protected: + GaussNewtonParams params_; + GaussNewtonState state_; +public: /// @name Standard interface /// @{ @@ -94,10 +97,6 @@ public: /// @} protected: - - GaussNewtonParams params_; - GaussNewtonState state_; - /** Access the parameters (base class version) */ virtual const NonlinearOptimizerParams& _params() const { return params_; } diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h index 13927d39f..62d05839d 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.h +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.h @@ -42,12 +42,6 @@ public: DAMPED }; -private: - VerbosityLM verbosityLMTranslator(const std::string &s) const; - std::string verbosityLMTranslator(VerbosityLM value) const; - -public: - double lambdaInitial; ///< The initial Levenberg-Marquardt damping term (default: 1e-5) double lambdaFactor; ///< The amount by which to multiply or divide lambda when adjusting lambda (default: 10.0) double lambdaUpperBound; ///< The maximum lambda to try before assuming the optimization has failed (default: 1e5) @@ -67,6 +61,10 @@ public: inline void setlambdaFactor(double value) { lambdaFactor = value; } inline void setlambdaUpperBound(double value) { lambdaUpperBound = value; } inline void setVerbosityLM(const std::string &s) { verbosityLM = verbosityLMTranslator(s); } + +private: + VerbosityLM verbosityLMTranslator(const std::string &s) const; + std::string verbosityLMTranslator(VerbosityLM value) const; }; /** @@ -74,20 +72,18 @@ public: */ class LevenbergMarquardtState : public NonlinearOptimizerState { -protected: - - LevenbergMarquardtState(const NonlinearFactorGraph& graph, const Values& initialValues, const LevenbergMarquardtParams& params, unsigned int iterations = 0) : - NonlinearOptimizerState(graph, initialValues, iterations), lambda(params.lambdaInitial) {} - - friend class LevenbergMarquardtOptimizer; - public: - double lambda; LevenbergMarquardtState() {} virtual ~LevenbergMarquardtState() {} + +protected: + LevenbergMarquardtState(const NonlinearFactorGraph& graph, const Values& initialValues, const LevenbergMarquardtParams& params, unsigned int iterations = 0) : + NonlinearOptimizerState(graph, initialValues, iterations), lambda(params.lambdaInitial) {} + + friend class LevenbergMarquardtOptimizer; }; /** @@ -96,26 +92,11 @@ public: class LevenbergMarquardtOptimizer : public NonlinearOptimizer { protected: - LevenbergMarquardtParams params_; ///< LM parameters LevenbergMarquardtState state_; ///< optimization state std::vector dimensions_; ///< undocumented - /** Access the parameters (base class version) */ - virtual const NonlinearOptimizerParams& _params() const { return params_; } - - /** Access the state (base class version) */ - virtual const NonlinearOptimizerState& _state() const { return state_; } - - /** Internal function for computing a COLAMD ordering if no ordering is specified */ - LevenbergMarquardtParams ensureHasOrdering(LevenbergMarquardtParams params, const NonlinearFactorGraph& graph, const Values& values) const { - if(!params.ordering) - params.ordering = *graph.orderingCOLAMD(values); - return params; - } - public: - typedef boost::shared_ptr shared_ptr; /// @name Standard interface @@ -176,6 +157,20 @@ public: const LevenbergMarquardtState& state() const { return state_; } /// @} + +protected: + /** Access the parameters (base class version) */ + virtual const NonlinearOptimizerParams& _params() const { return params_; } + + /** Access the state (base class version) */ + virtual const NonlinearOptimizerState& _state() const { return state_; } + + /** Internal function for computing a COLAMD ordering if no ordering is specified */ + LevenbergMarquardtParams ensureHasOrdering(LevenbergMarquardtParams params, const NonlinearFactorGraph& graph, const Values& values) const { + if(!params.ordering) + params.ordering = *graph.orderingCOLAMD(values); + return params; + } }; } diff --git a/gtsam/nonlinear/Marginals.h b/gtsam/nonlinear/Marginals.h index c792167c5..588531830 100644 --- a/gtsam/nonlinear/Marginals.h +++ b/gtsam/nonlinear/Marginals.h @@ -88,11 +88,6 @@ protected: BlockView blockView_; Ordering indices_; - JointMarginal(const Matrix& fullMatrix, const std::vector& dims, const Ordering& indices) : - fullMatrix_(fullMatrix), blockView_(fullMatrix_, dims.begin(), dims.end()), indices_(indices) {} - - friend class Marginals; - public: /** A block view of the joint marginal - this stores a reference to the * JointMarginal object, so the JointMarginal object must be kept in scope @@ -129,6 +124,13 @@ public: /** Print */ void print(const std::string& s = "", const KeyFormatter& formatter = DefaultKeyFormatter) const; + +protected: + JointMarginal(const Matrix& fullMatrix, const std::vector& dims, const Ordering& indices) : + fullMatrix_(fullMatrix), blockView_(fullMatrix_, dims.begin(), dims.end()), indices_(indices) {} + + friend class Marginals; + }; } /* namespace gtsam */ diff --git a/gtsam/nonlinear/NonlinearOptimizer.h b/gtsam/nonlinear/NonlinearOptimizer.h index 03f3a5e34..488d3d832 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.h +++ b/gtsam/nonlinear/NonlinearOptimizer.h @@ -177,23 +177,9 @@ Values::const_shared_ptr result = DoglegOptimizer(graph, initialValues, params). class NonlinearOptimizer { protected: - NonlinearFactorGraph graph_; - /** A default implementation of the optimization loop, which calls iterate() - * until checkConvergence returns true. - */ - void defaultOptimize(); - - virtual const NonlinearOptimizerState& _state() const = 0; - - virtual const NonlinearOptimizerParams& _params() const = 0; - - /** Constructor for initial construction of base classes. */ - NonlinearOptimizer(const NonlinearFactorGraph& graph) : graph_(graph) {} - public: - /** A shared pointer to this class */ typedef boost::shared_ptr shared_ptr; @@ -243,6 +229,20 @@ public: virtual void iterate() = 0; /// @} + +protected: + /** A default implementation of the optimization loop, which calls iterate() + * until checkConvergence returns true. + */ + void defaultOptimize(); + + virtual const NonlinearOptimizerState& _state() const = 0; + + virtual const NonlinearOptimizerParams& _params() const = 0; + + /** Constructor for initial construction of base classes. */ + NonlinearOptimizer(const NonlinearFactorGraph& graph) : graph_(graph) {} + }; /** Check whether the relative error decrease is less than relativeErrorTreshold, diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index a01718da4..c96831f05 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -123,8 +123,6 @@ namespace gtsam { typedef KeyValuePair value_type; - public: - /** A filtered view of a Values, returned from Values::filter. */ template class Filtered; @@ -196,7 +194,6 @@ namespace gtsam { /** Get a zero VectorValues of the correct structure */ VectorValues zeroVectors(const Ordering& ordering) const; - public: const_iterator begin() const { return boost::make_transform_iterator(values_.begin(), &make_const_deref_pair); } const_iterator end() const { return boost::make_transform_iterator(values_.end(), &make_const_deref_pair); } iterator begin() { return boost::make_transform_iterator(values_.begin(), &make_deref_pair); } From 3838fd5508d1c785a5ec4a2e939fbe8c3c021b4f Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 7 Aug 2012 17:19:06 +0000 Subject: [PATCH 768/914] Added push_bach() to NonlinearFactorGraph with full graph argument --- gtsam.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 578d44a08..df7bdda44 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1072,12 +1072,13 @@ class NonlinearFactorGraph { bool empty() const; void remove(size_t i); size_t nrFactors() const; - void add(const gtsam::NonlinearFactor* factor); gtsam::NonlinearFactor* at(size_t i) const; + void push_back(const gtsam::NonlinearFactorGraph& factors); // NonlinearFactorGraph double error(const gtsam::Values& values) const; double probPrime(const gtsam::Values& values) const; + void add(const gtsam::NonlinearFactor* factor); gtsam::Ordering* orderingCOLAMD(const gtsam::Values& values) const; // Ordering* orderingCOLAMDConstrained(const gtsam::Values& c, const std::map& constraints) const; gtsam::GaussianFactorGraph* linearize(const gtsam::Values& values, From a025b377ecc50c421274be229514e2cc4fe19ec5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 7 Aug 2012 18:21:35 +0000 Subject: [PATCH 769/914] Added full Values interface --- gtsam.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/gtsam.h b/gtsam.h index df7bdda44..0fd782309 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1099,14 +1099,34 @@ virtual class NonlinearFactor { // gtsam::NonlinearFactor* rekey(const gtsam::KeyVector& newKeys) const; //FIXME: Conversion from KeyVector to std::vector does not happen }; +#include class Values { Values(); + Values(const gtsam::Values& other); + size_t size() const; + bool empty() const; + void clear(); + size_t dim() const; + void print(string s) const; + bool equals(const gtsam::Values& other, double tol) const; + void insert(size_t j, const gtsam::Value& value); + void insert(const gtsam::Values& values); + void update(size_t j, const gtsam::Value& val); + void update(const gtsam::Values& values); + void erase(size_t j); + bool exists(size_t j) const; gtsam::Value at(size_t j) const; gtsam::KeyList keys() const; + + gtsam::VectorValues zeroVectors(const gtsam::Ordering& ordering) const; + + gtsam::Values retract(const gtsam::VectorValues& delta, const gtsam::Ordering& ordering) const; + gtsam::VectorValues localCoordinates(const gtsam::Values& cp, const gtsam::Ordering& ordering) const; + void localCoordinates(const gtsam::Values& cp, const gtsam::Ordering& ordering, gtsam::VectorValues& delta) const; }; // Actually a FastList From 2e4697e7e1a002e853e28c267e7c29becb2f8c21 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 10 Aug 2012 16:10:31 +0000 Subject: [PATCH 770/914] small sanity checks on Ordering --- gtsam/nonlinear/tests/testOrdering.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gtsam/nonlinear/tests/testOrdering.cpp b/gtsam/nonlinear/tests/testOrdering.cpp index beb16f741..d89c04d3c 100644 --- a/gtsam/nonlinear/tests/testOrdering.cpp +++ b/gtsam/nonlinear/tests/testOrdering.cpp @@ -44,8 +44,11 @@ TEST( testOrdering, simple_modifications ) { CHECK_EXCEPTION(ordering.pop_back(x1), std::invalid_argument); // reassemble back make the ordering 1, 2, 4, 3 - ordering.push_back(x4); - ordering.push_back(x3); + EXPECT_LONGS_EQUAL(2, ordering.push_back(x4)); + EXPECT_LONGS_EQUAL(3, ordering.push_back(x3)); + + EXPECT_LONGS_EQUAL(2, ordering[x4]); + EXPECT_LONGS_EQUAL(3, ordering[x3]); // verify Ordering expectedFinal; From b6e7709052b826706fbd3d5a58a215f595306778 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 10 Aug 2012 18:13:45 +0000 Subject: [PATCH 771/914] Added printKeys() to factor for more compact printing --- gtsam.h | 3 +++ gtsam/inference/Factor-inl.h | 8 +++++++- gtsam/inference/Factor.h | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 0fd782309..14e3d175f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -919,6 +919,7 @@ virtual class JacobianFactor : gtsam::GaussianFactor { Vector b, const gtsam::noiseModel::Diagonal* model); JacobianFactor(const gtsam::GaussianFactor& factor); void print(string s) const; + void printKeys(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; bool empty() const; size_t size() const; @@ -942,6 +943,7 @@ virtual class HessianFactor : gtsam::GaussianFactor { HessianFactor(const gtsam::GaussianFactor& factor); size_t size() const; void print(string s) const; + void printKeys(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; double error(const gtsam::VectorValues& c) const; gtsam::GaussianFactor* negate() const; @@ -1088,6 +1090,7 @@ class NonlinearFactorGraph { virtual class NonlinearFactor { void print(string s) const; + void printKeys(string s) const; void equals(const gtsam::NonlinearFactor& other, double tol) const; gtsam::KeyVector keys() const; size_t size() const; diff --git a/gtsam/inference/Factor-inl.h b/gtsam/inference/Factor-inl.h index 6636b646c..b2099aa3e 100644 --- a/gtsam/inference/Factor-inl.h +++ b/gtsam/inference/Factor-inl.h @@ -58,10 +58,16 @@ namespace gtsam { template void Factor::print(const std::string& s, const IndexFormatter& formatter) const { + printKeys(s,formatter); + } + + /* ************************************************************************* */ + template + void Factor::printKeys(const std::string& s, const IndexFormatter& formatter) const { std::cout << s << " "; BOOST_FOREACH(KEY key, keys_) std::cout << " " << formatter(key); std::cout << std::endl; - } + } /* ************************************************************************* */ template diff --git a/gtsam/inference/Factor.h b/gtsam/inference/Factor.h index 950f6e65f..4c31664d7 100644 --- a/gtsam/inference/Factor.h +++ b/gtsam/inference/Factor.h @@ -187,6 +187,10 @@ public: void print(const std::string& s = "Factor", const IndexFormatter& formatter = DefaultIndexFormatter) const; + /// print only keys + void printKeys(const std::string& s = "Factor", + const IndexFormatter& formatter = DefaultIndexFormatter) const; + /// check equality bool equals(const This& other, double tol = 1e-9) const; From 01257d02896015c7c1d9e053c6edf442eb84ec57 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 11 Aug 2012 02:53:54 +0000 Subject: [PATCH 772/914] Added automatic conversion operator from LieScalar to double (simplifies syntax so that .value() is not needed) --- gtsam/base/LieScalar.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam/base/LieScalar.h b/gtsam/base/LieScalar.h index 3b9c7037a..ce0ba93ca 100644 --- a/gtsam/base/LieScalar.h +++ b/gtsam/base/LieScalar.h @@ -36,6 +36,9 @@ namespace gtsam { /** access the underlying value */ double value() const { return d_; } + /** Automatic conversion to underlying value */ + operator double() const { return d_; } + /** print @param name optional string naming the object */ inline void print(const std::string& name="") const { std::cout << name << ": " << d_ << std::endl; From 92e575f8c134e2fc3ed618c7613a0a0f3161cc61 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Sat, 11 Aug 2012 02:53:56 +0000 Subject: [PATCH 773/914] Wrapped LieScalar --- gtsam.h | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/gtsam.h b/gtsam.h index 14e3d175f..fd36a28c0 100644 --- a/gtsam.h +++ b/gtsam.h @@ -101,6 +101,35 @@ virtual class Value { size_t dim() const; }; +#include +virtual class LieScalar : gtsam::Value { + // Standard constructors + LieScalar(); + LieScalar(double d); + + // Standard interface + double value() const; + + // Testable + void print(string s) const; + bool equals(const gtsam::LieScalar& expected, double tol) const; + + // Group + static gtsam::LieScalar identity(); + gtsam::LieScalar inverse() const; + gtsam::LieScalar compose(const gtsam::LieScalar& p) const; + gtsam::LieScalar between(const gtsam::LieScalar& l2) const; + + // Manifold + size_t dim() const; + gtsam::LieScalar retract(Vector v) const; + Vector localCoordinates(const gtsam::LieScalar& t2) const; + + // Lie group + static gtsam::LieScalar Expmap(Vector v); + static Vector Logmap(const gtsam::LieScalar& p); +}; + #include virtual class LieVector : gtsam::Value { // Standard constructors @@ -1451,21 +1480,21 @@ class NonlinearISAM { #include #include -template +template virtual class PriorFactor : gtsam::NonlinearFactor { PriorFactor(size_t key, const T& prior, const gtsam::noiseModel::Base* noiseModel); }; #include -template +template virtual class BetweenFactor : gtsam::NonlinearFactor { BetweenFactor(size_t key1, size_t key2, const T& relativePose, const gtsam::noiseModel::Base* noiseModel); }; #include -template +template virtual class NonlinearEquality : gtsam::NonlinearFactor { // Constructor - forces exact evaluation NonlinearEquality(size_t j, const T& feasible); From d7f6a799672a66392e7bcc6027ea5b534ddf95a8 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 12 Aug 2012 19:52:20 +0000 Subject: [PATCH 774/914] Refactor in GaussianISAM to make solver easier to use/modify. Added non-const interface to nodes in Bayes Tree. Added separate eclipse make target for check (with default -j params) and "check j1" to force -j params. --- .cproject | 342 +++++++++++++++++++----------------- gtsam/inference/BayesTree.h | 3 + gtsam/linear/GaussianISAM.h | 30 ++-- 3 files changed, 199 insertions(+), 176 deletions(-) diff --git a/.cproject b/.cproject index 81bf59187..316c5c30c 100644 --- a/.cproject +++ b/.cproject @@ -309,14 +309,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -343,6 +335,7 @@ make + tests/testBayesTree.run true false @@ -350,6 +343,7 @@ make + testBinaryBayesNet.run true false @@ -397,6 +391,7 @@ make + testSymbolicBayesNet.run true false @@ -404,6 +399,7 @@ make + tests/testSymbolicFactor.run true false @@ -411,6 +407,7 @@ make + testSymbolicFactorGraph.run true false @@ -426,11 +423,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -519,22 +525,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -551,6 +541,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -575,26 +581,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -679,26 +685,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -969,6 +975,7 @@ make + testGraph.run true false @@ -976,6 +983,7 @@ make + testJunctionTree.run true false @@ -983,6 +991,7 @@ make + testSymbolicBayesNetB.run true false @@ -1118,6 +1127,7 @@ make + testErrors.run true false @@ -1163,14 +1173,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -1251,6 +1253,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -1581,7 +1591,6 @@ make - testSimulated2DOriented.run true false @@ -1621,7 +1630,6 @@ make - testSimulated2D.run true false @@ -1629,7 +1637,6 @@ make - testSimulated3D.run true false @@ -1821,7 +1828,6 @@ make - tests/testGaussianISAM2 true false @@ -1843,102 +1849,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j1 @@ -1955,7 +1865,7 @@ true true - + make -j1 check @@ -2140,6 +2050,7 @@ cpack + -G DEB true false @@ -2147,6 +2058,7 @@ cpack + -G RPM true false @@ -2154,6 +2066,7 @@ cpack + -G TGZ true false @@ -2161,6 +2074,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2286,34 +2200,106 @@ true true - + make -j5 - testSpirit.run + check true true true - + make - -j5 - testWrap.run + -j2 + testRot3.run true true true - + make - -j5 - check.wrap + -j2 + testRot2.run true true true - + make - -j5 - wrap + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2357,6 +2343,38 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 8b6de3fe6..6cd7c67f1 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -198,6 +198,9 @@ namespace gtsam { /** Access the root clique (non-const version) */ sharedClique& root() { return root_; } + /** Access the nodes (non-cost version) */ + Nodes& nodes() { return nodes_; } + /** Remove all nodes */ void clear(); diff --git a/gtsam/linear/GaussianISAM.h b/gtsam/linear/GaussianISAM.h index e4ac62704..dbb6afb7e 100644 --- a/gtsam/linear/GaussianISAM.h +++ b/gtsam/linear/GaussianISAM.h @@ -48,20 +48,8 @@ public: /** Override update_internal to also keep track of variable dimensions. */ template void update_internal(const FACTORGRAPH& newFactors, Cliques& orphans) { - - Super::update_internal(newFactors, orphans, &EliminateQR); - - // update dimensions - BOOST_FOREACH(const typename FACTORGRAPH::sharedFactor& factor, newFactors) { - for(typename FACTORGRAPH::FactorType::const_iterator key = factor->begin(); key != factor->end(); ++key) { - if(*key >= dims_.size()) - dims_.resize(*key + 1); - if(dims_[*key] == 0) - dims_[*key] = factor->getDim(key); - else - assert(dims_[*key] == factor->getDim(key)); - } - } + Super::update_internal(newFactors, orphans, &EliminateQR); // TODO: why does this force QR? + update_dimensions(newFactors); } template @@ -70,6 +58,20 @@ public: this->update_internal(newFactors, orphans); } + template + inline void update_dimensions(const FACTORGRAPH& newFactors) { + BOOST_FOREACH(const typename FACTORGRAPH::sharedFactor& factor, newFactors) { + for(typename FACTORGRAPH::FactorType::const_iterator key = factor->begin(); key != factor->end(); ++key) { + if(*key >= dims_.size()) + dims_.resize(*key + 1); + if(dims_[*key] == 0) + dims_[*key] = factor->getDim(key); + else + assert(dims_[*key] == factor->getDim(key)); + } + } + } + void clear() { Super::clear(); dims_.clear(); From d652dbc03aec9a3b2aef6203c4f77d9364c1b75c Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Mon, 13 Aug 2012 15:16:10 +0000 Subject: [PATCH 775/914] made constructor explicit to make gcc happy --- gtsam/base/LieScalar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/base/LieScalar.h b/gtsam/base/LieScalar.h index ce0ba93ca..3721492ec 100644 --- a/gtsam/base/LieScalar.h +++ b/gtsam/base/LieScalar.h @@ -31,7 +31,7 @@ namespace gtsam { LieScalar() : d_(0.0) {} /** wrap a double */ - LieScalar(double d) : d_(d) {} + explicit LieScalar(double d) : d_(d) {} /** access the underlying value */ double value() const { return d_; } From 44a3ec1e1d09d34eee5b33bba955d7dc208c690e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 13 Aug 2012 18:13:15 +0000 Subject: [PATCH 776/914] Added interface to dims_ --- gtsam/linear/GaussianISAM.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gtsam/linear/GaussianISAM.h b/gtsam/linear/GaussianISAM.h index dbb6afb7e..2f35845b8 100644 --- a/gtsam/linear/GaussianISAM.h +++ b/gtsam/linear/GaussianISAM.h @@ -77,6 +77,10 @@ public: dims_.clear(); } + // access + const Dims& dims() const { return dims_; } ///< Const access to dimensions structure + Dims& dims() { return dims_; } ///< non-const access to dimensions structure (advanced interface) + friend VectorValues optimize(const GaussianISAM&); /** return marginal on any variable as a factor, Bayes net, or mean/cov */ From 355141f9857301224d0c9c78b6aa737ce4160179 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 15 Aug 2012 17:17:52 +0000 Subject: [PATCH 777/914] Added dense matrix accessor for JointMarginals --- gtsam.h | 1 + gtsam/nonlinear/Marginals.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/gtsam.h b/gtsam.h index fd36a28c0..262e1d105 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1239,6 +1239,7 @@ class Marginals { class JointMarginal { Matrix at(size_t iVariable, size_t jVariable) const; + Matrix fullMatrix() const; void print(string s) const; void print() const; }; diff --git a/gtsam/nonlinear/Marginals.h b/gtsam/nonlinear/Marginals.h index 588531830..302c686e8 100644 --- a/gtsam/nonlinear/Marginals.h +++ b/gtsam/nonlinear/Marginals.h @@ -116,6 +116,13 @@ public: Block at(Key iVariable, Key jVariable) const { return (*this)(iVariable, jVariable); } + /** The full, dense covariance/information matrix of the joint marginal. This returns + * a reference to the JointMarginal object, so the JointMarginal object must be kept + * in scope while this view is needed. Otherwise assign this block object to a Matrix + * to store it. + */ + const Matrix& fullMatrix() const { return fullMatrix_; } + /** Copy constructor */ JointMarginal(const JointMarginal& other); From 9ee098b1c199cca4a19f101540f348d6f42e115f Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Wed, 15 Aug 2012 17:35:14 +0000 Subject: [PATCH 778/914] Added separate splitConditional() to remove the top part of a JacobianFactor after performing QR --- gtsam/linear/JacobianFactor.cpp | 175 ++++++++++++++++++++++---------- gtsam/linear/JacobianFactor.h | 8 +- 2 files changed, 129 insertions(+), 54 deletions(-) diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index b241ff24a..0fa3bd7f5 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -396,6 +396,73 @@ namespace gtsam { return this->eliminate(1); } + /* ************************************************************************* */ + GaussianConditional::shared_ptr JacobianFactor::splitConditional(size_t nrFrontals) { + assert(Ab_.rowStart() == 0 && Ab_.rowEnd() == (size_t) matrix_.rows() && Ab_.firstBlock() == 0); + assert(size() >= nrFrontals); + assertInvariants(); + + const bool debug = ISDEBUG("JacobianFactor::splitConditional"); + + if(debug) cout << "Eliminating " << nrFrontals << " frontal variables" << endl; + if(debug) this->print("Splitting JacobianFactor: "); + + size_t frontalDim = Ab_.range(0,nrFrontals).cols(); + + // Check for singular factor + if(model_->dim() < frontalDim) { + throw domain_error((boost::format( + "JacobianFactor is singular in variable %1%, discovered while attempting\n" + "to eliminate this variable.") % front()).str()); + } + + // Extract conditional + tic(3, "cond Rd"); + + // Restrict the matrix to be in the first nrFrontals variables + Ab_.rowEnd() = Ab_.rowStart() + frontalDim; + const Eigen::VectorBlock sigmas = model_->sigmas().segment(Ab_.rowStart(), Ab_.rowEnd()-Ab_.rowStart()); + GaussianConditional::shared_ptr conditional(new GaussianConditional(begin(), end(), nrFrontals, Ab_, sigmas)); + if(debug) conditional->print("Extracted conditional: "); + Ab_.rowStart() += frontalDim; + Ab_.firstBlock() += nrFrontals; + toc(3, "cond Rd"); + + if(debug) conditional->print("Extracted conditional: "); + + tic(4, "remaining factor"); + // Take lower-right block of Ab to get the new factor + Ab_.rowEnd() = model_->dim(); + keys_.erase(begin(), begin() + nrFrontals); + // Set sigmas with the right model + if (model_->isConstrained()) + model_ = noiseModel::Constrained::MixedSigmas(sub(model_->sigmas(), frontalDim, model_->dim())); + else + model_ = noiseModel::Diagonal::Sigmas(sub(model_->sigmas(), frontalDim, model_->dim())); + if(debug) this->print("Eliminated factor: "); + assert(Ab_.rows() <= Ab_.cols()-1); + toc(4, "remaining factor"); + + // todo SL: deal with "dead" pivot columns!!! + tic(5, "rowstarts"); + size_t varpos = 0; + firstNonzeroBlocks_.resize(this->rows()); + for(size_t row=0; rowprint("QR result noise model: "); - // Check for singular factor - if(noiseModel->dim() < frontalDim) { - throw domain_error((boost::format( - "JacobianFactor is singular in variable %1%, discovered while attempting\n" - "to eliminate this variable.") % front()).str()); - } - - // Extract conditionals - tic(3, "cond Rd"); - GaussianConditional::shared_ptr conditionals(new GaussianConditional()); - - // Restrict the matrix to be in the first nrFrontals variables - Ab_.rowEnd() = Ab_.rowStart() + frontalDim; - const Eigen::VectorBlock sigmas = noiseModel->sigmas().segment(Ab_.rowStart(), Ab_.rowEnd()-Ab_.rowStart()); - conditionals = boost::make_shared(begin(), end(), nrFrontals, Ab_, sigmas); - if(debug) conditionals->print("Extracted conditional: "); - Ab_.rowStart() += frontalDim; - Ab_.firstBlock() += nrFrontals; - toc(3, "cond Rd"); - - if(debug) conditionals->print("Extracted conditionals: "); - - tic(4, "remaining factor"); - // Take lower-right block of Ab to get the new factor - Ab_.rowEnd() = noiseModel->dim(); - keys_.erase(begin(), begin() + nrFrontals); - // Set sigmas with the right model - if (noiseModel->isConstrained()) - model_ = noiseModel::Constrained::MixedSigmas(sub(noiseModel->sigmas(), frontalDim, noiseModel->dim())); - else - model_ = noiseModel::Diagonal::Sigmas(sub(noiseModel->sigmas(), frontalDim, noiseModel->dim())); - if(debug) this->print("Eliminated factor: "); - assert(Ab_.rows() <= Ab_.cols()-1); - toc(4, "remaining factor"); - - // todo SL: deal with "dead" pivot columns!!! - tic(5, "rowstarts"); - size_t varpos = 0; - firstNonzeroBlocks_.resize(this->rows()); - for(size_t row=0; rowdim() < frontalDim) { +// throw domain_error((boost::format( +// "JacobianFactor is singular in variable %1%, discovered while attempting\n" +// "to eliminate this variable.") % front()).str()); +// } +// +// // Extract conditional +// tic(3, "cond Rd"); +// +// // Restrict the matrix to be in the first nrFrontals variables +// Ab_.rowEnd() = Ab_.rowStart() + frontalDim; +// const Eigen::VectorBlock sigmas = noiseModel->sigmas().segment(Ab_.rowStart(), Ab_.rowEnd()-Ab_.rowStart()); +// GaussianConditional::shared_ptr conditional(new GaussianConditional(begin(), end(), nrFrontals, Ab_, sigmas)); +// if(debug) conditional->print("Extracted conditional: "); +// Ab_.rowStart() += frontalDim; +// Ab_.firstBlock() += nrFrontals; +// toc(3, "cond Rd"); +// +// if(debug) conditional->print("Extracted conditionals: "); +// +// tic(4, "remaining factor"); +// // Take lower-right block of Ab to get the new factor +// Ab_.rowEnd() = noiseModel->dim(); +// keys_.erase(begin(), begin() + nrFrontals); +// // Set sigmas with the right model +// if (noiseModel->isConstrained()) +// model_ = noiseModel::Constrained::MixedSigmas(sub(noiseModel->sigmas(), frontalDim, noiseModel->dim())); +// else +// model_ = noiseModel::Diagonal::Sigmas(sub(noiseModel->sigmas(), frontalDim, noiseModel->dim())); +// if(debug) this->print("Eliminated factor: "); +// assert(Ab_.rows() <= Ab_.cols()-1); +// toc(4, "remaining factor"); +// +// // todo SL: deal with "dead" pivot columns!!! +// tic(5, "rowstarts"); +// size_t varpos = 0; +// firstNonzeroBlocks_.resize(this->rows()); +// for(size_t row=0; row eliminate(size_t nrFrontals = 1); + /** + * splits a pre-factorized factor into a conditional, and changes the current + * factor to be the remaining component. Performs same operation as eliminate(), + * but without running QR. + */ + boost::shared_ptr splitConditional(size_t nrFrontals = 1); + /* Used by ::CombineJacobians for sorting */ struct _RowSource { size_t firstNonzeroVar; From 31b5dfc188a007279f9071555ff41facb6d0adbb Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 17 Aug 2012 03:45:24 +0000 Subject: [PATCH 779/914] Fixed wrong return type in gtsam.h --- gtsam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam.h b/gtsam.h index 262e1d105..55021e84a 100644 --- a/gtsam.h +++ b/gtsam.h @@ -166,7 +166,7 @@ virtual class LieMatrix : gtsam::Value { LieMatrix(Matrix v); // Standard interface - Vector matrix() const; + Matrix matrix() const; // Testable void print(string s) const; From 88f504b73dd7162d6d9853bb34dd0e96a6124553 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 17 Aug 2012 03:45:26 +0000 Subject: [PATCH 780/914] Wrapped rest of VectorValues interface --- gtsam.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gtsam.h b/gtsam.h index 55021e84a..5f55a8c62 100644 --- a/gtsam.h +++ b/gtsam.h @@ -900,7 +900,12 @@ class VectorValues { void print(string s) const; bool equals(const gtsam::VectorValues& expected, double tol) const; size_t size() const; + size_t dim(size_t j) const; + size_t dim() const; + bool exists(size_t j) const; void insert(size_t j, Vector value); + Vector vector() const; + Vector at(size_t j) const; }; class GaussianConditional { From 2a66b538a478aebd97b0038d9ed13a012093a576 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 17 Aug 2012 03:45:28 +0000 Subject: [PATCH 781/914] More detailed disconnected graph error message --- gtsam/inference/EliminationTree.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gtsam/inference/EliminationTree.h b/gtsam/inference/EliminationTree.h index 286f85268..f2b0c1eaf 100644 --- a/gtsam/inference/EliminationTree.h +++ b/gtsam/inference/EliminationTree.h @@ -167,7 +167,12 @@ struct DisconnectedGraphException : public std::exception { /// Returns the string "Attempting to eliminate a disconnected graph - this is not currently possible in gtsam." virtual const char* what() const throw() { - return "Attempting to eliminate a disconnected graph - this is not currently possible in gtsam."; } + return + "Attempting to eliminate a disconnected graph - this is not currently possible in\n" + "GTSAM. You may add \"empty\" BetweenFactor's to join disconnected graphs, these\n" + "will affect the symbolic structure and solving complexity of the graph but not\n" + "the solution. To do this, create BetweenFactor's with zero-precision noise\n" + "models, i.e. noiseModel::Isotropic::Precision(n, 0.0);\n"; } }; } From 90b55a6ec1d2db8a746b3910ac2ba63f2c231c7b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 17 Aug 2012 03:45:30 +0000 Subject: [PATCH 782/914] Removed obsolete comment --- gtsam/inference/Permutation.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gtsam/inference/Permutation.h b/gtsam/inference/Permutation.h index 39c4447d2..4e32b1f52 100644 --- a/gtsam/inference/Permutation.h +++ b/gtsam/inference/Permutation.h @@ -36,11 +36,6 @@ namespace gtsam { * that linearized factor graphs are already correctly ordered and need * not be permuted. * - * For convenience, there is also a helper class "Permuted" that transforms - * arguments supplied through the square-bracket [] operator through the - * permutation. Note that this helper class stores a reference to the original - * container. - * * Permutations can be considered to a 1-1 mapping from an original set of indices * to a different set of indices. Permutations can be composed and inverted * in order to create new indexing for a structure. From fac426c5acad260a750d2bb6a0bce8f079eb8805 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 17 Aug 2012 03:45:32 +0000 Subject: [PATCH 783/914] Added "SEARCH_REDUCE_ONLY" mode to Dogleg --- gtsam/nonlinear/DoglegOptimizerImpl.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/gtsam/nonlinear/DoglegOptimizerImpl.h b/gtsam/nonlinear/DoglegOptimizerImpl.h index 27a8d47ec..fa2179afa 100644 --- a/gtsam/nonlinear/DoglegOptimizerImpl.h +++ b/gtsam/nonlinear/DoglegOptimizerImpl.h @@ -61,6 +61,7 @@ struct DoglegOptimizerImpl { */ enum TrustRegionAdaptationMode { SEARCH_EACH_ITERATION, + SEARCH_REDUCE_ONLY, ONE_STEP_PER_ITERATION }; @@ -210,7 +211,7 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( const double dx_d_norm = result.dx_d.vector().norm(); const double newDelta = std::max(Delta, 3.0 * dx_d_norm); // Compute new Delta - if(mode == ONE_STEP_PER_ITERATION) + if(mode == ONE_STEP_PER_ITERATION || mode == SEARCH_REDUCE_ONLY) stay = false; // If not searching, just return with the new Delta else if(mode == SEARCH_EACH_ITERATION) { if(newDelta == Delta || lastAction == DECREASED_DELTA) @@ -231,13 +232,17 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( } else if(0.25 > rho && rho >= 0.0) { // M does not agree well with f, decrease Delta until it does double newDelta; - if(Delta > 1e-5) + bool hitMinimumDelta; + if(Delta > 1e-5) { newDelta = 0.5 * Delta; - else + hitMinimumDelta = false; + } else { newDelta = Delta; - if(mode == ONE_STEP_PER_ITERATION || lastAction == INCREASED_DELTA || newDelta == Delta) + hitMinimumDelta = true; + } + if(mode == ONE_STEP_PER_ITERATION || /* mode == SEARCH_EACH_ITERATION && */ lastAction == INCREASED_DELTA || hitMinimumDelta) stay = false; // If not searching, just return with the new smaller delta - else if(mode == SEARCH_EACH_ITERATION) { + else if(mode == SEARCH_EACH_ITERATION || mode == SEARCH_REDUCE_ONLY) { stay = true; lastAction = DECREASED_DELTA; } else { @@ -246,7 +251,9 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( Delta = newDelta; // Update Delta from new Delta } else { - // f actually increased, so keep decreasing Delta until f does not decrease + // f actually increased, so keep decreasing Delta until f does not decrease. + // NOTE: NaN and Inf solutions also will fall into this case, so that we + // decrease Delta if the solution becomes undetermined. assert(0.0 > rho); if(Delta > 1e-5) { Delta *= 0.5; @@ -254,6 +261,8 @@ typename DoglegOptimizerImpl::IterationResult DoglegOptimizerImpl::Iterate( lastAction = DECREASED_DELTA; } else { if(verbose) std::cout << "Warning: Dog leg stopping because cannot decrease error with minimum Delta" << std::endl; + result.dx_d.setZero(); // Set delta to zero - don't allow error to increase + result.f_error = f_error; stay = false; } } From 4a57ef65d75c46efa3ea970bbc9d0f4c670a71ae Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 17 Aug 2012 03:45:35 +0000 Subject: [PATCH 784/914] Fixed memory leak when a Value contained heap-allocated data (Matrix, Vector, etc) - incorrect syntax when calling destructor did not do a virtual call so derived Value object was not cleaned up. --- gtsam/base/DerivedValue.h | 4 +-- gtsam/nonlinear/tests/testValues.cpp | 41 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/gtsam/base/DerivedValue.h b/gtsam/base/DerivedValue.h index 52420ee93..2dc6f3d67 100644 --- a/gtsam/base/DerivedValue.h +++ b/gtsam/base/DerivedValue.h @@ -47,8 +47,8 @@ public: * Destroy and deallocate this object, only if it was originally allocated using clone_(). */ virtual void deallocate_() const { - this->Value::~Value(); - boost::singleton_pool::free((void*)this); + this->~DerivedValue(); // Virtual destructor cleans up the derived object + boost::singleton_pool::free((void*)this); // Release memory from pool } /** diff --git a/gtsam/nonlinear/tests/testValues.cpp b/gtsam/nonlinear/tests/testValues.cpp index 3818e99a2..5242fef1c 100644 --- a/gtsam/nonlinear/tests/testValues.cpp +++ b/gtsam/nonlinear/tests/testValues.cpp @@ -38,6 +38,27 @@ using symbol_shorthand::L; const Symbol key1('v',1), key2('v',2), key3('v',3), key4('v',4); + +class TestValueData { +public: + static int ConstructorCount; + static int DestructorCount; + TestValueData(const TestValueData& other) { cout << "Copy constructor" << endl; ++ ConstructorCount; } + TestValueData() { cout << "Default constructor" << endl; ++ ConstructorCount; } + ~TestValueData() { cout << "Destructor" << endl; ++ DestructorCount; } +}; +int TestValueData::ConstructorCount = 0; +int TestValueData::DestructorCount = 0; +class TestValue : public DerivedValue { + TestValueData data_; +public: + virtual void print(const std::string& str = "") const {} + bool equals(const TestValue& other, double tol = 1e-9) const { return true; } + virtual size_t dim() const { return 0; } + TestValue retract(const Vector&) const { return TestValue(); } + Vector localCoordinates(const TestValue&) const { return Vector(); } +}; + /* ************************************************************************* */ TEST( Values, equals1 ) { @@ -358,6 +379,26 @@ TEST(Values, Symbol_filter) { LONGS_EQUAL(2, i); } +/* ************************************************************************* */ +TEST(Values, Destructors) { + // Check that Value destructors are called when Values container is deleted + { + Values values; + { + TestValue value1; + TestValue value2; + LONGS_EQUAL(2, TestValueData::ConstructorCount); + LONGS_EQUAL(0, TestValueData::DestructorCount); + values.insert(0, value1); + values.insert(1, value2); + } + LONGS_EQUAL(4, TestValueData::ConstructorCount); + LONGS_EQUAL(2, TestValueData::DestructorCount); + } + LONGS_EQUAL(4, TestValueData::ConstructorCount); + LONGS_EQUAL(4, TestValueData::DestructorCount); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From 4fb9f3b39ee0217c8abdf43fececff90eed96af5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 20 Aug 2012 14:25:04 +0000 Subject: [PATCH 785/914] Moved RelativeElevationFactor from MastSLAM --- gtsam_unstable/slam/CMakeLists.txt | 2 +- .../slam/RelativeElevationFactor.cpp | 53 +++++++ gtsam_unstable/slam/RelativeElevationFactor.h | 77 ++++++++++ .../tests/testRelativeElevationFactor.cpp | 138 ++++++++++++++++++ 4 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 gtsam_unstable/slam/RelativeElevationFactor.cpp create mode 100644 gtsam_unstable/slam/RelativeElevationFactor.h create mode 100644 gtsam_unstable/slam/tests/testRelativeElevationFactor.cpp diff --git a/gtsam_unstable/slam/CMakeLists.txt b/gtsam_unstable/slam/CMakeLists.txt index 88dd60edd..33cb45df9 100644 --- a/gtsam_unstable/slam/CMakeLists.txt +++ b/gtsam_unstable/slam/CMakeLists.txt @@ -4,7 +4,7 @@ install(FILES ${slam_headers} DESTINATION include/gtsam_unstable/slam) # Components to link tests in this subfolder against set(slam_local_libs - #slam_unstable # No sources currently, so no convenience lib + slam_unstable slam nonlinear linear diff --git a/gtsam_unstable/slam/RelativeElevationFactor.cpp b/gtsam_unstable/slam/RelativeElevationFactor.cpp new file mode 100644 index 000000000..2d0ca7548 --- /dev/null +++ b/gtsam_unstable/slam/RelativeElevationFactor.cpp @@ -0,0 +1,53 @@ +/** + * @file RelativeElevationFactor.cpp + * + * @date Aug 17, 2012 + * @author Alex Cunningham + */ + +#include + +namespace gtsam { + +/* ************************************************************************* */ +RelativeElevationFactor::RelativeElevationFactor(Key poseKey, Key pointKey, double measured, + const SharedNoiseModel& model) +: Base(model, poseKey, pointKey), measured_(measured) +{ +} + +/* ************************************************************************* */ +Vector RelativeElevationFactor::evaluateError(const Pose3& pose, const Point3& point, + boost::optional H1, boost::optional H2) const { + double hx = pose.z() - point.z(); + if (H1) { + *H1 = zeros(1, 6); + // Use bottom row of rotation matrix for derivative of translation + (*H1)(0, 3) = pose.rotation().r1().z(); + (*H1)(0, 4) = pose.rotation().r2().z(); + (*H1)(0, 5) = pose.rotation().r3().z(); + } + + if (H2) { + *H2 = zeros(1, 3); + (*H2)(0, 2) = -1.0; + } + return Vector_(1, hx - measured_); +} + +/* ************************************************************************* */ +bool RelativeElevationFactor::equals(const NonlinearFactor& expected, double tol) const { + const This *e = dynamic_cast (&expected); + return e != NULL && Base::equals(*e, tol) && fabs(this->measured_ - e->measured_) < tol; +} + +/* ************************************************************************* */ +void RelativeElevationFactor::print(const std::string& s, const KeyFormatter& keyFormatter) const { + std::cout << s << "RelativeElevationFactor, relative elevation = " << measured_ << std::endl; + Base::print("", keyFormatter); +} +/* ************************************************************************* */ + +} // \namespace gtsam + + diff --git a/gtsam_unstable/slam/RelativeElevationFactor.h b/gtsam_unstable/slam/RelativeElevationFactor.h new file mode 100644 index 000000000..a0186a9f2 --- /dev/null +++ b/gtsam_unstable/slam/RelativeElevationFactor.h @@ -0,0 +1,77 @@ +/** + * @file RelativeElevationFactor.h + * + * @brief Factor representing a known relative altitude in global frame + * + * @date Aug 17, 2012 + * @author Alex Cunningham + */ + +#pragma once + +#include +#include + +namespace gtsam { + +/** + * Binary factor for a relative elevation. Note that this + * factor takes into account only elevation, and corrects for orientation. + * Unlike a range factor, the relative elevation is signed, and only affects + * the Z coordinate. Measurement function h(pose, pt) = h.z() - pt.z() + * + * Dimension: 1 + * + * TODO: enable use of a Pose3 for the target as well + */ +class RelativeElevationFactor: public NoiseModelFactor2 { +private: + + double measured_; /** measurement */ + + typedef RelativeElevationFactor This; + typedef NoiseModelFactor2 Base; + +public: + + RelativeElevationFactor() : measured_(0.0) {} /* Default constructor */ + + RelativeElevationFactor(Key poseKey, Key pointKey, double measured, + const SharedNoiseModel& model); + + virtual ~RelativeElevationFactor() {} + + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } + + /** h(x)-z */ + Vector evaluateError(const Pose3& pose, const Point3& point, + boost::optional H1 = boost::none, boost::optional H2 = boost::none) const; + + /** return the measured */ + inline double measured() const { return measured_; } + + /** equals specialized to this factor */ + virtual bool equals(const NonlinearFactor& expected, double tol=1e-9) const; + + /** print contents */ + void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; + +private: + + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("NoiseModelFactor2", + boost::serialization::base_object(*this)); + ar & BOOST_SERIALIZATION_NVP(measured_); + } +}; // RelativeElevationFactor + + +} // \namespace gtsam + + diff --git a/gtsam_unstable/slam/tests/testRelativeElevationFactor.cpp b/gtsam_unstable/slam/tests/testRelativeElevationFactor.cpp new file mode 100644 index 000000000..321464c48 --- /dev/null +++ b/gtsam_unstable/slam/tests/testRelativeElevationFactor.cpp @@ -0,0 +1,138 @@ +/** + * @file testRelativeElevationFactor.cpp + * + * @date Aug 17, 2012 + * @author Alex Cunningham + */ + +#include + +#include + +#include + +using namespace gtsam; + +SharedNoiseModel model1 = noiseModel::Unit::Create(1); + +const double tol = 1e-5; + +const Pose3 pose1(Rot3(), Point3(2.0, 3.0, 4.0)); +const Pose3 pose2(Rot3::pitch(-M_PI_2), Point3(2.0, 3.0, 4.0)); +const Pose3 pose3(Rot3::RzRyRx(0.1, 0.2, 0.3), Point3(2.0, 3.0, 4.0)); +const Point3 point1(3.0, 4.0, 2.0); +const gtsam::Key poseKey = 1, pointKey = 2; + +/* ************************************************************************* */ +LieVector evalFactorError(const RelativeElevationFactor& factor, const Pose3& x, const Point3& p) { + return LieVector(factor.evaluateError(x, p)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, level_zero_error ) { + // Zero error + double measured = 2.0; + RelativeElevationFactor factor(poseKey, pointKey, measured, model1); + Matrix actH1, actH2; + EXPECT(assert_equal(zero(1), factor.evaluateError(pose1, point1, actH1, actH2))); + Matrix expH1 = numericalDerivative21( + boost::bind(evalFactorError, factor, _1, _2), pose1, point1, 1e-5); + Matrix expH2 = numericalDerivative22( + boost::bind(evalFactorError, factor, _1, _2), pose1, point1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); + EXPECT(assert_equal(expH2, actH2, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, level_positive ) { + // Positive meas + double measured = 0.0; + RelativeElevationFactor factor(poseKey, pointKey, measured, model1); + Matrix actH1, actH2; + EXPECT(assert_equal(Vector_(1, 2.0), factor.evaluateError(pose1, point1, actH1, actH2))); + Matrix expH1 = numericalDerivative21( + boost::bind(evalFactorError, factor, _1, _2), pose1, point1, 1e-5); + Matrix expH2 = numericalDerivative22( + boost::bind(evalFactorError, factor, _1, _2), pose1, point1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); + EXPECT(assert_equal(expH2, actH2, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, level_negative ) { + // Negative meas + double measured = -1.0; + RelativeElevationFactor factor(poseKey, pointKey, measured, model1); + Matrix actH1, actH2; + EXPECT(assert_equal(Vector_(1, 3.0), factor.evaluateError(pose1, point1, actH1, actH2))); + Matrix expH1 = numericalDerivative21( + boost::bind(evalFactorError, factor, _1, _2), pose1, point1, 1e-5); + Matrix expH2 = numericalDerivative22( + boost::bind(evalFactorError, factor, _1, _2), pose1, point1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); + EXPECT(assert_equal(expH2, actH2, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, rotated_zero_error ) { + // Zero error + double measured = 2.0; + RelativeElevationFactor factor(poseKey, pointKey, measured, model1); + Matrix actH1, actH2; + EXPECT(assert_equal(zero(1), factor.evaluateError(pose2, point1, actH1, actH2))); + Matrix expH1 = numericalDerivative21( + boost::bind(evalFactorError, factor, _1, _2), pose2, point1, 1e-5); + Matrix expH2 = numericalDerivative22( + boost::bind(evalFactorError, factor, _1, _2), pose2, point1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); + EXPECT(assert_equal(expH2, actH2, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, rotated_positive ) { + // Positive meas + double measured = 0.0; + RelativeElevationFactor factor(poseKey, pointKey, measured, model1); + Matrix actH1, actH2; + EXPECT(assert_equal(Vector_(1, 2.0), factor.evaluateError(pose2, point1, actH1, actH2))); + Matrix expH1 = numericalDerivative21( + boost::bind(evalFactorError, factor, _1, _2), pose2, point1, 1e-5); + Matrix expH2 = numericalDerivative22( + boost::bind(evalFactorError, factor, _1, _2), pose2, point1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); + EXPECT(assert_equal(expH2, actH2, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, rotated_negative1 ) { + // Negative meas + double measured = -1.0; + RelativeElevationFactor factor(poseKey, pointKey, measured, model1); + Matrix actH1, actH2; + EXPECT(assert_equal(Vector_(1, 3.0), factor.evaluateError(pose2, point1, actH1, actH2))); + Matrix expH1 = numericalDerivative21( + boost::bind(evalFactorError, factor, _1, _2), pose2, point1, 1e-5); + Matrix expH2 = numericalDerivative22( + boost::bind(evalFactorError, factor, _1, _2), pose2, point1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); + EXPECT(assert_equal(expH2, actH2, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, rotated_negative2 ) { + // Negative meas + double measured = -1.0; + RelativeElevationFactor factor(poseKey, pointKey, measured, model1); + Matrix actH1, actH2; + EXPECT(assert_equal(Vector_(1, 3.0), factor.evaluateError(pose3, point1, actH1, actH2))); + Matrix expH1 = numericalDerivative21( + boost::bind(evalFactorError, factor, _1, _2), pose3, point1, 1e-5); + Matrix expH2 = numericalDerivative22( + boost::bind(evalFactorError, factor, _1, _2), pose3, point1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); + EXPECT(assert_equal(expH2, actH2, tol)); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From 3794c2a7b7df6df3d8385a73acd1be012da35efe Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 20 Aug 2012 14:25:07 +0000 Subject: [PATCH 786/914] Reworked PoseTranslationPrior so that it actually works now --- .cproject | 342 +++++++++--------- gtsam_unstable/slam/PoseTranslationPrior.h | 104 ++++-- ...sePriors.cpp => testPoseRotationPrior.cpp} | 28 +- .../slam/tests/testPoseTranslationPrior.cpp | 105 ++++++ 4 files changed, 351 insertions(+), 228 deletions(-) rename gtsam_unstable/slam/tests/{testPosePriors.cpp => testPoseRotationPrior.cpp} (61%) create mode 100644 gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp diff --git a/.cproject b/.cproject index 316c5c30c..7f13b1809 100644 --- a/.cproject +++ b/.cproject @@ -309,6 +309,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -335,7 +343,6 @@ make - tests/testBayesTree.run true false @@ -343,7 +350,6 @@ make - testBinaryBayesNet.run true false @@ -391,7 +397,6 @@ make - testSymbolicBayesNet.run true false @@ -399,7 +404,6 @@ make - tests/testSymbolicFactor.run true false @@ -407,7 +411,6 @@ make - testSymbolicFactorGraph.run true false @@ -423,20 +426,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -525,22 +519,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -557,6 +535,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -581,26 +575,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -685,26 +679,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -789,6 +783,14 @@ true true + + make + -j5 + testPoseTranslationPrior.run + true + true + true + make -j5 @@ -975,7 +977,6 @@ make - testGraph.run true false @@ -983,7 +984,6 @@ make - testJunctionTree.run true false @@ -991,7 +991,6 @@ make - testSymbolicBayesNetB.run true false @@ -1127,7 +1126,6 @@ make - testErrors.run true false @@ -1173,6 +1171,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -1253,14 +1259,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -1591,6 +1589,7 @@ make + testSimulated2DOriented.run true false @@ -1630,6 +1629,7 @@ make + testSimulated2D.run true false @@ -1637,6 +1637,7 @@ make + testSimulated3D.run true false @@ -1828,6 +1829,7 @@ make + tests/testGaussianISAM2 true false @@ -1849,6 +1851,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j1 @@ -2050,7 +2148,6 @@ cpack - -G DEB true false @@ -2058,7 +2155,6 @@ cpack - -G RPM true false @@ -2066,7 +2162,6 @@ cpack - -G TGZ true false @@ -2074,7 +2169,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2208,98 +2302,34 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2343,38 +2373,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/gtsam_unstable/slam/PoseTranslationPrior.h b/gtsam_unstable/slam/PoseTranslationPrior.h index 4219e3252..61cf77263 100644 --- a/gtsam_unstable/slam/PoseTranslationPrior.h +++ b/gtsam_unstable/slam/PoseTranslationPrior.h @@ -9,61 +9,105 @@ #pragma once -#include #include +#include namespace gtsam { -template -class PoseTranslationPrior : public PartialPriorFactor { -public: +/** simple pose traits for building factors */ +namespace pose_traits { +/** checks whether parameterization of rotation is before or after translation in Lie algebra */ +template +bool isRotFirst() { + throw std::invalid_argument("PoseTrait: no implementation for this pose type"); + return false; +} + +// Instantiate for common poses +template<> bool isRotFirst() { return true; } +template<> bool isRotFirst() { return false; } + +} // \namespace pose_traits + +/** + * A prior on the translation part of a pose + */ +template +class PoseTranslationPrior : public NoiseModelFactor1 { +public: typedef PoseTranslationPrior This; - typedef PartialPriorFactor Base; + typedef NoiseModelFactor1 Base; typedef POSE Pose; typedef typename POSE::Translation Translation; + typedef typename POSE::Rotation Rotation; GTSAM_CONCEPT_POSE_TYPE(Pose) GTSAM_CONCEPT_GROUP_TYPE(Pose) GTSAM_CONCEPT_LIE_TYPE(Translation) +protected: + + Translation measured_; + +public: + /** standard constructor */ - PoseTranslationPrior(Key key, const Translation& trans_z, const SharedNoiseModel& model) - : Base(key, model) { - initialize(trans_z); + PoseTranslationPrior(Key key, const Translation& measured, const noiseModel::Base::shared_ptr& model) + : Base(model, key), measured_(measured) { } /** Constructor that pulls the translation from an incoming POSE */ - PoseTranslationPrior(Key key, const POSE& pose_z, const SharedNoiseModel& model) - : Base(key, model) { - initialize(pose_z.translation()); + PoseTranslationPrior(Key key, const POSE& pose_z, const noiseModel::Base::shared_ptr& model) + : Base(key, model), measured_(pose_z.translation()) { } - /** get the rotation used to create the measurement */ - Translation priorTranslation() const { return Translation::Expmap(this->prior_); } + virtual ~PoseTranslationPrior() {} -protected: - /** loads the underlying partial prior factor */ - void initialize(const Translation& trans_z) { - assert(trans_z.dim() == this->noiseModel_->dim()); + const Translation& measured() const { return measured_; } - // Calculate the prior applied - this->prior_ = Translation::Logmap(trans_z); + /// @return a deep copy of this factor + virtual gtsam::NonlinearFactor::shared_ptr clone() const { + return boost::static_pointer_cast( + gtsam::NonlinearFactor::shared_ptr(new This(*this))); } - // Create the mask for partial prior - size_t pose_dim = Pose::identity().dim(); - size_t rot_dim = trans_z.dim(); + /** h(x)-z */ + Vector evaluateError(const Pose& pose, boost::optional H = boost::none) const { + const Translation& newTrans = pose.translation(); + const Rotation& R = pose.rotation(); + const size_t tDim = newTrans.dim(), xDim = pose.dim(); + if (H) { + *H = gtsam::zeros(tDim, xDim); + if (pose_traits::isRotFirst()) + (*H).rightCols(tDim) = R.matrix(); + else + (*H).leftCols(tDim) = R.matrix(); + } - // get the interval of the lie coordinates corresponding to rotation - std::pair interval = Pose::translationInterval(); + return newTrans.vector() - measured_.vector(); + } - std::vector mask; - for (size_t i=interval.first; i<=interval.second; ++i) - mask.push_back(i); - this->mask_ = mask; + /** equals specialized to this factor */ + virtual bool equals(const NonlinearFactor& expected, double tol=1e-9) const { + const This *e = dynamic_cast (&expected); + return e != NULL && Base::equals(*e, tol) && measured_.equals(e->measured_, tol); + } - this->H_ = zeros(rot_dim, pose_dim); - this->fillH(); + /** print contents */ + void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { + Base::print(s + "PoseTranslationPrior", keyFormatter); + measured_.print("Measured Translation"); + } + +private: + + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("NoiseModelFactor1", + boost::serialization::base_object(*this)); + ar & BOOST_SERIALIZATION_NVP(measured_); } }; diff --git a/gtsam_unstable/slam/tests/testPosePriors.cpp b/gtsam_unstable/slam/tests/testPoseRotationPrior.cpp similarity index 61% rename from gtsam_unstable/slam/tests/testPosePriors.cpp rename to gtsam_unstable/slam/tests/testPoseRotationPrior.cpp index 1a40dd335..cdded40e7 100644 --- a/gtsam_unstable/slam/tests/testPosePriors.cpp +++ b/gtsam_unstable/slam/tests/testPoseRotationPrior.cpp @@ -1,7 +1,7 @@ /** - * @file testPosePriors.cpp + * @file testPoseRotationPrior.cpp * - * @brief Tests partial priors on poses + * @brief Tests rotation priors on poses * * @date Jun 14, 2012 * @author Alex Cunningham @@ -22,32 +22,8 @@ using namespace gtsam; Key x1 = symbol_shorthand::X(1); const SharedNoiseModel model1 = noiseModel::Diagonal::Sigmas(Vector_(1, 0.1)); -const SharedNoiseModel model2 = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); const SharedNoiseModel model3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); -/* ************************************************************************* */ -TEST( testPoseTranslationPrior, planar) { - - typedef PoseTranslationPrior PlanarTPrior; - PlanarTPrior actTprior(x1, Point2(2.0, 3.0), model2); - EXPECT(assert_equal(Point2(2.0, 3.0), actTprior.priorTranslation())); - Matrix expH(2,3); expH << eye(2,2), zeros(2,1); - EXPECT(assert_equal(eye(2,3), actTprior.H())); -} - -/* ************************************************************************* */ -TEST( testPoseTranslationPrior, visual) { - - typedef PoseTranslationPrior VisualTPrior; - VisualTPrior actPose3Tprior(x1, Point3(2.0, 3.0, 4.0), model3); - EXPECT(assert_equal(Point3(2.0, 3.0, 4.0), actPose3Tprior.priorTranslation())); - Matrix expH(3,6); expH << zeros(3,3), eye(3,3); - EXPECT(assert_equal(expH, actPose3Tprior.H())); - -// typedef PoseTranslationPrior CamTPrior; -// CamTPrior actCamTprior(x1, Point3(2.0, 3.0, 4.0), model3); -} - /* ************************************************************************* */ TEST( testPoseRotationPrior, planar) { diff --git a/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp b/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp new file mode 100644 index 000000000..1db155fc1 --- /dev/null +++ b/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp @@ -0,0 +1,105 @@ +/** + * @file testPoseTranslationPrior.cpp + * + * @date Aug 19, 2012 + * @author Alex Cunningham + */ + +#include + +#include +#include +#include + +#include + +using namespace gtsam; + +const SharedNoiseModel model2 = noiseModel::Diagonal::Sigmas(Vector_(2, 0.1, 0.2)); +const SharedNoiseModel model3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); + +typedef PoseTranslationPrior Pose2TranslationPrior; +typedef PoseTranslationPrior Pose3TranslationPrior; + +const double tol = 1e-5; + +const gtsam::Key poseKey = 1; + +// Pose3 examples +const Point3 point3A(1.0, 2.0, 3.0), point3B(4.0, 6.0, 8.0); +const Rot3 rot3A, rot3B = Rot3::pitch(-M_PI_2), rot3C = Rot3::RzRyRx(0.1, 0.2, 0.3); + +/* ************************************************************************* */ +LieVector evalFactorError3(const Pose3TranslationPrior& factor, const Pose3& x) { + return LieVector(factor.evaluateError(x)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, level3_zero_error ) { + Pose3 pose1(rot3A, point3A); + Pose3TranslationPrior factor(poseKey, point3A, model3); + Matrix actH1; + EXPECT(assert_equal(zero(3), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, level3_error ) { + Pose3 pose1(rot3A, point3A); + Pose3TranslationPrior factor(poseKey, point3B, model3); + Matrix actH1; + EXPECT(assert_equal(Vector_(3,-3.0,-4.0,-5.0), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, pitched3_zero_error ) { + Pose3 pose1(rot3B, point3A); + Pose3TranslationPrior factor(poseKey, point3A, model3); + Matrix actH1; + EXPECT(assert_equal(zero(3), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, pitched3_error ) { + Pose3 pose1(rot3B, point3A); + Pose3TranslationPrior factor(poseKey, point3B, model3); + Matrix actH1; + EXPECT(assert_equal(Vector_(3,-3.0,-4.0,-5.0), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, smallrot3_zero_error ) { + Pose3 pose1(rot3C, point3A); + Pose3TranslationPrior factor(poseKey, point3A, model3); + Matrix actH1; + EXPECT(assert_equal(zero(3), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, smallrot3_error ) { + Pose3 pose1(rot3C, point3A); + Pose3TranslationPrior factor(poseKey, point3B, model3); + Matrix actH1; + EXPECT(assert_equal(Vector_(3,-3.0,-4.0,-5.0), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From e488871ffdd7220d7cda7526efdaee47f4694c36 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 20 Aug 2012 14:25:09 +0000 Subject: [PATCH 787/914] Fixed compile problem in toolbox for PoseTranslationPrior. Added planar tests. --- gtsam_unstable/slam/PoseTranslationPrior.h | 2 +- .../slam/tests/testPoseTranslationPrior.cpp | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/gtsam_unstable/slam/PoseTranslationPrior.h b/gtsam_unstable/slam/PoseTranslationPrior.h index 61cf77263..ba023c0e3 100644 --- a/gtsam_unstable/slam/PoseTranslationPrior.h +++ b/gtsam_unstable/slam/PoseTranslationPrior.h @@ -59,7 +59,7 @@ public: /** Constructor that pulls the translation from an incoming POSE */ PoseTranslationPrior(Key key, const POSE& pose_z, const noiseModel::Base::shared_ptr& model) - : Base(key, model), measured_(pose_z.translation()) { + : Base(model, key), measured_(pose_z.translation()) { } virtual ~PoseTranslationPrior() {} diff --git a/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp b/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp index 1db155fc1..0821e566b 100644 --- a/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp +++ b/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp @@ -29,11 +29,20 @@ const gtsam::Key poseKey = 1; const Point3 point3A(1.0, 2.0, 3.0), point3B(4.0, 6.0, 8.0); const Rot3 rot3A, rot3B = Rot3::pitch(-M_PI_2), rot3C = Rot3::RzRyRx(0.1, 0.2, 0.3); +// Pose2 examples +const Point2 point2A(1.0, 2.0), point2B(4.0, 6.0); +const Rot2 rot2A, rot2B = Rot2::fromAngle(M_PI_2); + /* ************************************************************************* */ LieVector evalFactorError3(const Pose3TranslationPrior& factor, const Pose3& x) { return LieVector(factor.evaluateError(x)); } +/* ************************************************************************* */ +LieVector evalFactorError2(const Pose2TranslationPrior& factor, const Pose2& x) { + return LieVector(factor.evaluateError(x)); +} + /* ************************************************************************* */ TEST( testRelativeElevationFactor, level3_zero_error ) { Pose3 pose1(rot3A, point3A); @@ -100,6 +109,28 @@ TEST( testRelativeElevationFactor, smallrot3_error ) { EXPECT(assert_equal(expH1, actH1, tol)); } +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, level2_zero_error ) { + Pose2 pose1(rot2A, point2A); + Pose2TranslationPrior factor(poseKey, point2A, model2); + Matrix actH1; + EXPECT(assert_equal(zero(2), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError2, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testRelativeElevationFactor, level2_error ) { + Pose2 pose1(rot2A, point2A); + Pose2TranslationPrior factor(poseKey, point2B, model2); + Matrix actH1; + EXPECT(assert_equal(Vector_(2,-3.0,-4.0), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError2, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ From 0aa72c986ed8d708e1cf0b0f42c4ce96137bed3d Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 20 Aug 2012 14:25:10 +0000 Subject: [PATCH 788/914] wrapped RelativeElevationFactor --- gtsam_unstable/gtsam_unstable.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gtsam_unstable/gtsam_unstable.h b/gtsam_unstable/gtsam_unstable.h index 1bb6d20e0..a459925fd 100644 --- a/gtsam_unstable/gtsam_unstable.h +++ b/gtsam_unstable/gtsam_unstable.h @@ -189,4 +189,14 @@ virtual class PoseRotationPrior : gtsam::NonlinearFactor { typedef gtsam::PoseRotationPrior PoseRotationPrior2D; typedef gtsam::PoseRotationPrior PoseRotationPrior3D; +#include +virtual class RelativeElevationFactor: gtsam::NonlinearFactor { + RelativeElevationFactor(); + RelativeElevationFactor(size_t poseKey, size_t pointKey, double measured, + const gtsam::noiseModel::Base* model); + + double measured() const; + void print(string s) const; +}; + } //\namespace gtsam From bac1faa68e86ae311eb066a39861b98f98b38b03 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 20 Aug 2012 18:28:19 +0000 Subject: [PATCH 789/914] Added ordering-less negate() --- gtsam_unstable/nonlinear/LinearContainerFactor.cpp | 6 ++++++ gtsam_unstable/nonlinear/LinearContainerFactor.h | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp index 8a27284f1..75cc171fb 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -141,6 +141,12 @@ GaussianFactor::shared_ptr LinearContainerFactor::negate(const Ordering& orderin return result; } +/* ************************************************************************* */ +NonlinearFactor::shared_ptr LinearContainerFactor::negate() const { + GaussianFactor::shared_ptr antifactor = factor_->negate(); // already has keys in place + return NonlinearFactor::shared_ptr(new LinearContainerFactor(antifactor)); +} + /* ************************************************************************* */ } // \namespace gtsam diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.h b/gtsam_unstable/nonlinear/LinearContainerFactor.h index 23705f96e..34da3a886 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.h +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.h @@ -79,6 +79,14 @@ public: */ GaussianFactor::shared_ptr negate(const Ordering& ordering) const; + /** + * Creates the equivalent anti-factor as another LinearContainerFactor, + * so it remains independent of ordering. + */ + NonlinearFactor::shared_ptr negate() const; + + + /** * Creates a shared_ptr clone of the factor - needs to be specialized to allow * for subclasses From 9962a66e7cd7752018c89b87abaac793538bcbb0 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Tue, 21 Aug 2012 18:48:04 +0000 Subject: [PATCH 790/914] Added utility functions for converting graphs with LinearContainerFactors, added direct order() to avoid the need to fake linearize. --- .../nonlinear/LinearContainerFactor.cpp | 25 +++++++++++++++++-- .../nonlinear/LinearContainerFactor.h | 22 ++++++++++++---- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp index 75cc171fb..42dfe7819 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -106,8 +106,7 @@ size_t LinearContainerFactor::dim() const { } /* ************************************************************************* */ -boost::shared_ptr -LinearContainerFactor::linearize(const Values& c, const Ordering& ordering) const { +GaussianFactor::shared_ptr LinearContainerFactor::order(const Ordering& ordering) const { // clone factor boost::shared_ptr result = factor_->clone(); @@ -118,6 +117,12 @@ LinearContainerFactor::linearize(const Values& c, const Ordering& ordering) cons return result; } +/* ************************************************************************* */ +GaussianFactor::shared_ptr LinearContainerFactor::linearize( + const Values& c, const Ordering& ordering) const { + return order(ordering); +} + /* ************************************************************************* */ bool LinearContainerFactor::isJacobian() const { return boost::shared_dynamic_cast(factor_); @@ -147,6 +152,22 @@ NonlinearFactor::shared_ptr LinearContainerFactor::negate() const { return NonlinearFactor::shared_ptr(new LinearContainerFactor(antifactor)); } +/* ************************************************************************* */ +NonlinearFactorGraph LinearContainerFactor::convertLinearGraph( + const GaussianFactorGraph& linear_graph, const Ordering& ordering) { + return convertLinearGraph(linear_graph, ordering.invert()); +} + +/* ************************************************************************* */ +NonlinearFactorGraph LinearContainerFactor::convertLinearGraph( + const GaussianFactorGraph& linear_graph, const InvertedOrdering& invOrdering) { + NonlinearFactorGraph result; + BOOST_FOREACH(const GaussianFactor::shared_ptr& f, linear_graph) + if (f) + result.push_back(NonlinearFactorGraph::sharedFactor(new LinearContainerFactor(f, invOrdering))); + return result; +} + /* ************************************************************************* */ } // \namespace gtsam diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.h b/gtsam_unstable/nonlinear/LinearContainerFactor.h index 34da3a886..25a1ed98b 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.h +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.h @@ -10,7 +10,7 @@ #pragma once #include -#include +#include namespace gtsam { @@ -70,9 +70,11 @@ public: /** get the dimension of the factor: rows of linear factor */ size_t dim() const; + /** Apply the ordering to a graph - same as linearize(), but without needing a linearization point */ + GaussianFactor::shared_ptr order(const Ordering& ordering) const; + /** linearize to a GaussianFactor: values has no effect, just clones/rekeys underlying factor */ - boost::shared_ptr - linearize(const Values& c, const Ordering& ordering) const; + GaussianFactor::shared_ptr linearize(const Values& c, const Ordering& ordering) const; /** * Creates an anti-factor directly and performs rekeying due to ordering @@ -85,8 +87,6 @@ public: */ NonlinearFactor::shared_ptr negate() const; - - /** * Creates a shared_ptr clone of the factor - needs to be specialized to allow * for subclasses @@ -110,6 +110,18 @@ public: /** Casts to HessianFactor */ HessianFactor::shared_ptr toHessian() const; + /** + * Utility function for converting linear graphs to nonlinear graphs + * consisting of LinearContainerFactors. Two versions are available, using + * either the ordering the linear graph was linearized around, or the inverse ordering. + * If the inverse ordering is present, it will be faster. + */ + static NonlinearFactorGraph convertLinearGraph(const GaussianFactorGraph& linear_graph, + const Ordering& ordering); + + static NonlinearFactorGraph convertLinearGraph(const GaussianFactorGraph& linear_graph, + const InvertedOrdering& invOrdering); + protected: void rekeyFactor(const Ordering& ordering); void rekeyFactor(const Ordering::InvertedMap& invOrdering); From b6ddb2197b1111f47f439d80ffd4860ef1f56760 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:04 +0000 Subject: [PATCH 791/914] Removed unused "zero_below_diagonal" flag in Matrix QR --- gtsam/base/Matrix.h | 2 +- gtsam/linear/NoiseModel.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index e113e4cf1..6902a4a88 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -293,7 +293,7 @@ std::pair qr(const Matrix& A); * @param clear_below_diagonal enables zeroing out below diagonal */ template -void inplace_QR(MATRIX& A, bool clear_below_diagonal=true) { +void inplace_QR(MATRIX& A) { size_t rows = A.rows(); size_t cols = A.cols(); size_t size = std::min(rows,cols); diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index 6d231748e..db6fa096d 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -124,7 +124,7 @@ SharedDiagonal Gaussian::QR(Matrix& Ab) const { if(debug) gtsam::print(Ab, "Whitened Ab: "); // Eigen QR - much faster than older householder approach - inplace_QR(Ab, false); + inplace_QR(Ab); // hand-coded householder implementation // TODO: necessary to isolate last column? From f704dbe0c2df01d5b606a145462ff043ea9bf829 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:17 +0000 Subject: [PATCH 792/914] Fixed formatting --- gtsam/linear/GaussianFactorGraph.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index dafe74d0d..6539f0cf4 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -386,8 +386,7 @@ break; // Form Ab' * Ab tic(3, "combine"); - HessianFactor::shared_ptr // - combinedFactor(new HessianFactor(factors, dimensions, scatter)); + HessianFactor::shared_ptr combinedFactor(new HessianFactor(factors, dimensions, scatter)); toc(3, "combine"); // Do Cholesky, note that after this, the lower triangle still contains From 5ddd28ba188cdc0ba39548ce78085b10dcab537f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:20 +0000 Subject: [PATCH 793/914] Removed unused noise model cholesky --- gtsam/linear/NoiseModel.cpp | 23 ----------------------- gtsam/linear/NoiseModel.h | 6 ------ gtsam/linear/tests/testNoiseModel.cpp | 12 ------------ 3 files changed, 41 deletions(-) diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index db6fa096d..e493bddde 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -133,29 +133,6 @@ SharedDiagonal Gaussian::QR(Matrix& Ab) const { return Unit::Create(maxRank); } -/* ************************************************************************* */ -SharedDiagonal Gaussian::Cholesky(Matrix& Ab, size_t nFrontals) const { - // get size(A) and maxRank - // TODO: really no rank problems ? - - // pre-whiten everything (cheaply if possible) - WhitenInPlace(Ab); - - // Form A'*A (todo: this is probably less efficient than possible) - Ab = Ab.transpose() * Ab; - - // Use Cholesky to factor Ab - size_t maxrank = choleskyCareful(Ab).first; - - // Due to numerical error the rank could appear to be more than the number - // of variables. The important part is that it does not includes the - // augmented b column. - if(maxrank == (size_t) Ab.cols()) - -- maxrank; - - return Unit::Create(maxrank); -} - void Gaussian::WhitenSystem(vector& A, Vector& b) const { BOOST_FOREACH(Matrix& Aj, A) { WhitenInPlace(Aj); } whitenInPlace(b); diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index 36fe3cd26..2bb63c382 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -202,12 +202,6 @@ namespace gtsam { */ virtual boost::shared_ptr QR(Matrix& Ab) const; - /** - * Cholesky factorization - * FIXME: this is never used anywhere - */ - virtual boost::shared_ptr Cholesky(Matrix& Ab, size_t nFrontals) const; - /** * Return R itself, but note that Whiten(H) is cheaper than R*H */ diff --git a/gtsam/linear/tests/testNoiseModel.cpp b/gtsam/linear/tests/testNoiseModel.cpp index 9b53a3be1..224395051 100644 --- a/gtsam/linear/tests/testNoiseModel.cpp +++ b/gtsam/linear/tests/testNoiseModel.cpp @@ -247,18 +247,6 @@ TEST( NoiseModel, QR ) EXPECT(linear_dependent(expectedRd2,Ab2,1e-6)); // Ab was modified in place !!! } -/* ************************************************************************* */ -TEST(NoiseModel, Cholesky) -{ - SharedDiagonal expected = noiseModel::Unit::Create(4); - Matrix Ab = exampleQR::Ab; // otherwise overwritten ! - SharedDiagonal actual = exampleQR::diagonal->Cholesky(Ab, 4); - EXPECT(assert_equal(*expected,*actual)); - // Ab was modified in place !!! - Matrix actualRd = Ab.block(0, 0, actual->dim(), Ab.cols()).triangularView(); - EXPECT(linear_dependent(exampleQR::Rd,actualRd,1e-4)); -} - /* ************************************************************************* */ TEST(NoiseModel, QRNan ) { From dd34792e7e968367f2c73c659f0952385e6d6c07 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:22 +0000 Subject: [PATCH 794/914] Fixed comments and error messages in Point2 and Point3 constructors --- gtsam/geometry/Point2.h | 7 ++++++- gtsam/geometry/Point3.h | 17 ++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/gtsam/geometry/Point2.h b/gtsam/geometry/Point2.h index a99da460b..af5b1fbcd 100644 --- a/gtsam/geometry/Point2.h +++ b/gtsam/geometry/Point2.h @@ -58,7 +58,12 @@ public: /// @{ /// construct from 2D vector - Point2(const Vector& v) : x_(v(0)), y_(v(1)) { assert(v.size() == 2); } + Point2(const Vector& v) { + if(v.size() != 2) + throw std::invalid_argument("Point2 constructor from Vector requires that the Vector have dimension 2"); + x_ = v(0); + y_ = v(1); + } /// @} /// @name Testable diff --git a/gtsam/geometry/Point3.h b/gtsam/geometry/Point3.h index 4d15b65f5..3e7423c0a 100644 --- a/gtsam/geometry/Point3.h +++ b/gtsam/geometry/Point3.h @@ -48,21 +48,24 @@ namespace gtsam { /// @name Standard Constructors /// @{ - ///TODO: comment + /// Default constructor creates a zero-Point3 Point3(): x_(0), y_(0), z_(0) {} - ///TODO: comment - Point3(const Point3 &p) : x_(p.x_), y_(p.y_), z_(p.z_) {} - - ///TODO: comment + /// Construct from x, y, and z coordinates Point3(double x, double y, double z): x_(x), y_(y), z_(z) {} /// @} /// @name Advanced Constructors /// @{ - ///TODO: comment - Point3(const Vector& v) : x_(v(0)), y_(v(1)), z_(v(2)) {} + /// Construct from 3-element vector + Point3(const Vector& v) { + if(v.size() != 3) + throw std::invalid_argument("Point3 constructor from Vector requires that the Vector have dimension 3"); + x_ = v(0); + y_ = v(1); + z_ = v(2); + } /// @} /// @name Testable From cf4a4b428569d2ee350e2951e16a52cb3fe6ef0a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:24 +0000 Subject: [PATCH 795/914] wrap turns exceptions into MATLAB errors --- wrap/Module.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/wrap/Module.cpp b/wrap/Module.cpp index b2f061838..681fb6925 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -481,12 +481,16 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; file.oss << " _" << name << "_RTTIRegister();\n\n"; file.oss << " int id = unwrap(in[0]);\n\n"; - file.oss << " switch(id) {\n"; + file.oss << " try {\n"; + file.oss << " switch(id) {\n"; for(size_t id = 0; id < functionNames.size(); ++id) { - file.oss << " case " << id << ":\n"; - file.oss << " " << functionNames[id] << "(nargout, out, nargin-1, in+1);\n"; - file.oss << " break;\n"; + file.oss << " case " << id << ":\n"; + file.oss << " " << functionNames[id] << "(nargout, out, nargin-1, in+1);\n"; + file.oss << " break;\n"; } + file.oss << " }\n"; + file.oss << " } catch(const std::exception& e) {\n"; + file.oss << " mexErrMsgTxt((\"Exception from gtsam:\\n\" + std::string(e.what()) + \"\\n\").c_str());\n"; file.oss << " }\n"; file.oss << "\n"; file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout From 1dbda3f7ed214709b7c45dd357eadd8a4aebb0b5 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:27 +0000 Subject: [PATCH 796/914] Standardized and corrected error handling on the linear size - underconstrained and negative systems always throw IndeterminantLinearSystemException, and all assertions checking for infinite values are removed. Also, we were not properly checking the result of Eigen's Cholesky, so sometimes elimination continued with incorrect matrices despite being underconstrained when Cholesky failed but did not produce NaN's. --- gtsam/base/cholesky.cpp | 65 +++++-- gtsam/base/cholesky.h | 50 +---- gtsam/base/tests/testCholesky.cpp | 40 ++++ gtsam/linear/GaussianConditional.cpp | 13 +- gtsam/linear/GaussianFactorGraph.cpp | 70 +------ gtsam/linear/HessianFactor.cpp | 12 +- gtsam/linear/JacobianFactor.cpp | 35 ++-- gtsam/linear/linearExceptions.h | 180 ++++++++++++++++++ gtsam/nonlinear/ISAM2.h | 2 +- .../nonlinear/LevenbergMarquardtOptimizer.cpp | 4 +- 10 files changed, 309 insertions(+), 162 deletions(-) create mode 100644 gtsam/linear/linearExceptions.h diff --git a/gtsam/base/cholesky.cpp b/gtsam/base/cholesky.cpp index 86114f4d8..8a02907c9 100644 --- a/gtsam/base/cholesky.cpp +++ b/gtsam/base/cholesky.cpp @@ -24,6 +24,7 @@ #include #include +#include using namespace std; @@ -32,18 +33,23 @@ namespace gtsam { static const double negativePivotThreshold = -1e-1; static const double zeroPivotThreshold = 1e-6; static const double underconstrainedPrior = 1e-5; + static const int underconstrainedExponentDifference = 12; /* ************************************************************************* */ -static inline bool choleskyStep(Matrix& ATA, size_t k, size_t order) { +static inline int choleskyStep(Matrix& ATA, size_t k, size_t order) { + + const bool debug = ISDEBUG("choleskyCareful"); // Get pivot value double alpha = ATA(k,k); // Correct negative pivots from round-off error if(alpha < negativePivotThreshold) { - cout << "pivot = " << alpha << endl; - print(ATA, "Partially-factorized matrix: "); - throw(CarefulCholeskyNegativeMatrixException()); + if(debug) { + cout << "pivot = " << alpha << endl; + print(ATA, "Partially-factorized matrix: "); + } + return -1; } else if(alpha < 0.0) alpha = 0.0; @@ -66,14 +72,14 @@ static inline bool choleskyStep(Matrix& ATA, size_t k, size_t order) { // ATA.bottomRightCorner(order-(k+1), order-(k+1)).selfadjointView() // .rankUpdate(V.adjoint(), -1); } - - return true; + return 1; } else { // For zero pivots, add the underconstrained variable prior ATA(k,k) = underconstrainedPrior; for(size_t j=k+1; j choleskyCareful(Matrix& ATA, int order) { // Negative order means factor the entire matrix if(order < 0) - order = n; + order = int(n); assert(size_t(order) <= n); // The index of the row after the last non-zero row of the square-root factor size_t maxrank = 0; - bool fullRank = true; + bool success = true; // Factor row-by-row for(size_t k = 0; k < size_t(order); ++k) { - if(choleskyStep(ATA, k, size_t(order))) { + int stepResult = choleskyStep(ATA, k, size_t(order)); + if(stepResult == 1) { if(debug) cout << "choleskyCareful: Factored through " << k << endl; if(debug) print(ATA, "ATA: "); maxrank = k+1; - } else { - fullRank = false; - if(debug) cout << "choleskyCareful: Skipping " << k << endl; - } + } else if(stepResult == -1) { + success = false; + break; + } /* else if(stepResult == 0) Found zero pivot */ } - return make_pair(maxrank, fullRank); + return make_pair(maxrank, success); } /* ************************************************************************* */ -void choleskyPartial(Matrix& ABC, size_t nFrontal) { +bool choleskyPartial(Matrix& ABC, size_t nFrontal) { const bool debug = ISDEBUG("choleskyPartial"); @@ -125,9 +132,8 @@ void choleskyPartial(Matrix& ABC, size_t nFrontal) { // Compute Cholesky factorization of A, overwrites A. tic(1, "lld"); - ABC.block(0,0,nFrontal,nFrontal).triangularView() = - ABC.block(0,0,nFrontal,nFrontal).selfadjointView().llt().matrixU(); - assert(ABC.topLeftCorner(nFrontal,nFrontal).triangularView().toDenseMatrix().unaryExpr(ptr_fun(isfinite)).all()); + Eigen::LLT llt = ABC.block(0,0,nFrontal,nFrontal).selfadjointView().llt(); + ABC.block(0,0,nFrontal,nFrontal).triangularView() = llt.matrixU(); toc(1, "lld"); if(debug) cout << "R:\n" << Eigen::MatrixXd(ABC.topLeftCorner(nFrontal,nFrontal).triangularView()) << endl; @@ -138,7 +144,6 @@ void choleskyPartial(Matrix& ABC, size_t nFrontal) { ABC.topLeftCorner(nFrontal,nFrontal).triangularView().transpose().solveInPlace( ABC.topRightCorner(nFrontal, n-nFrontal)); } - assert(ABC.topRightCorner(nFrontal, n-nFrontal).unaryExpr(ptr_fun(isfinite)).all()); if(debug) cout << "S:\n" << ABC.topRightCorner(nFrontal, n-nFrontal) << endl; toc(2, "compute S"); @@ -148,9 +153,27 @@ void choleskyPartial(Matrix& ABC, size_t nFrontal) { if(n - nFrontal > 0) ABC.bottomRightCorner(n-nFrontal,n-nFrontal).selfadjointView().rankUpdate( ABC.topRightCorner(nFrontal, n-nFrontal).transpose(), -1.0); - assert(ABC.bottomRightCorner(n-nFrontal,n-nFrontal).selfadjointView().toDenseMatrix().unaryExpr(ptr_fun(isfinite)).all()); if(debug) cout << "L:\n" << Eigen::MatrixXd(ABC.bottomRightCorner(n-nFrontal,n-nFrontal).selfadjointView()) << endl; toc(3, "compute L"); + + // Check last diagonal element - Eigen does not check it + bool ok; + if(llt.info() == Eigen::Success) { + if(nFrontal >= 2) { + int exp2, exp1; + (void)frexp(ABC(nFrontal-2, nFrontal-2), &exp2); + (void)frexp(ABC(nFrontal-1, nFrontal-1), &exp1); + ok = (exp2 - exp1 < underconstrainedExponentDifference); + } else if(nFrontal == 1) { + int exp1; + (void)frexp(ABC(0,0), &exp1); + ok = (exp1 > -underconstrainedExponentDifference); + } + } else { + ok = false; + } + + return ok; } } diff --git a/gtsam/base/cholesky.h b/gtsam/base/cholesky.h index 46d342d24..8b1073107 100644 --- a/gtsam/base/cholesky.h +++ b/gtsam/base/cholesky.h @@ -22,45 +22,6 @@ namespace gtsam { -/** - * An exception indicating an attempt to factor a negative or indefinite matrix. - * If detailed exceptions are enabled, then the \c detail member will contain - * the matrices leading to the problem, see documentation for - * NegativeMatrixException::Detail. - */ -struct NegativeMatrixException : public std::exception { - /// Detail for NegativeMatrixException - struct Detail { - Matrix A; ///< The original matrix attempted to factor - Matrix U; ///< The produced upper-triangular factor - Matrix D; ///< The produced diagonal factor - Detail(const Matrix& A, const Matrix& U, const Matrix& D) /**< Detail constructor */ : A(A), U(U), D(D) {} - void print(const std::string& str = "") const { - std::cout << str << "\n"; - gtsam::print(A, " A: "); - gtsam::print(U, " U: "); - gtsam::print(D, " D: "); - } - }; - const boost::shared_ptr detail; ///< Detail - NegativeMatrixException() /**< Constructor with no detail */ {} - NegativeMatrixException(const Detail& _detail) /**< Constructor with detail */ : detail(new Detail(_detail)) {} - NegativeMatrixException(const boost::shared_ptr& _detail) /**< Constructor with detail */ : detail(_detail) {} - virtual ~NegativeMatrixException() throw() {} -}; - -/** - * An exception indicating an attempt to factor a negative or indefinite matrix. - * If detailed exceptions are enabled, then the \c detail member will contain - * the matrices leading to the problem, see documentation for - * CarefulCholeskyNegativeMatrixException::Detail. - */ -struct CarefulCholeskyNegativeMatrixException : public std::exception { - CarefulCholeskyNegativeMatrixException() throw() {} - virtual ~CarefulCholeskyNegativeMatrixException() throw() {} - const char* what() const throw() { return "The matrix was found to be non-positive-semidefinite when factoring with careful Cholesky."; } -}; - /** * "Careful" Cholesky computes the positive square-root of a positive symmetric * semi-definite matrix (i.e. that may be rank-deficient). Unlike standard @@ -70,6 +31,10 @@ struct CarefulCholeskyNegativeMatrixException : public std::exception { * non-zero row in the computed factor, so that it may be truncated to an * upper-trapazoidal matrix. * + * The second element of the return value is \c true if the matrix was factored + * successfully, or \c false if it was non-positive-semidefinite (i.e. + * indefinite or negative-(semi-)definite. + * * Note that this returned index is the rank of the matrix if and only if all * of the zero-rows of the factor occur after any non-zero rows. This is * (always?) the case during elimination of a fully-constrained least-squares @@ -77,6 +42,8 @@ struct CarefulCholeskyNegativeMatrixException : public std::exception { * * The optional order argument specifies the size of the square upper-left * submatrix to operate on, ignoring the rest of the matrix. + * + * */ std::pair choleskyCareful(Matrix& ATA, int order = -1); @@ -87,8 +54,11 @@ std::pair choleskyCareful(Matrix& ATA, int order = -1); * [B' C] * nFrontal determines the split between A, B, and C, with A being of size * nFrontal x nFrontal. + * + * @return \c true if the decomposition is successful, \c false if \c A was + * not positive-definite. */ -void choleskyPartial(Matrix& ABC, size_t nFrontal); +bool choleskyPartial(Matrix& ABC, size_t nFrontal); } diff --git a/gtsam/base/tests/testCholesky.cpp b/gtsam/base/tests/testCholesky.cpp index 63fdec810..55c72543e 100644 --- a/gtsam/base/tests/testCholesky.cpp +++ b/gtsam/base/tests/testCholesky.cpp @@ -84,6 +84,46 @@ TEST(cholesky, BadScalingSVD) { DOUBLES_EQUAL(expectedCondition, actualCondition, 1e-41); } +/* ************************************************************************* */ +TEST(cholesky, underconstrained) { + Matrix L(6,6); L << + 1, 0, 0, 0, 0, 0, + 1.11177808157954, 1.06204809504665, 0.507342638873381, 1.34953401829486, 1, 0, + 0.155864888199928, 1.10933048588373, 0.501255576961674, 1, 0, 0, + 1.12108665967793, 1.01584408366945, 1, 0, 0, 0, + 0.776164062474843, 0.117617236580373, -0.0236628691347294, 0.814118199972143, 0.694309975328922, 1, + 0.1197220685104, 1, 0, 0, 0, 0; + Matrix D1(6,6); D1 << + 0.814723686393179, 0, 0, 0, 0, 0, + 0, 0.811780089277421, 0, 0, 0, 0, + 0, 0, 1.82596950680844, 0, 0, 0, + 0, 0, 0, 0.240287537694585, 0, 0, + 0, 0, 0, 0, 1.34342584865901, 0, + 0, 0, 0, 0, 0, 1e-12; + Matrix D2(6,6); D2 << + 0.814723686393179, 0, 0, 0, 0, 0, + 0, 0.811780089277421, 0, 0, 0, 0, + 0, 0, 1.82596950680844, 0, 0, 0, + 0, 0, 0, 0.240287537694585, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0; + Matrix D3(6,6); D3 << + 0.814723686393179, 0, 0, 0, 0, 0, + 0, 0.811780089277421, 0, 0, 0, 0, + 0, 0, 1.82596950680844, 0, 0, 0, + 0, 0, 0, 0.240287537694585, 0, 0, + 0, 0, 0, 0, -0.5, 0, + 0, 0, 0, 0, 0, -0.6; + + Matrix A1 = L * D1 * L.transpose(); + Matrix A2 = L * D2 * L.transpose(); + Matrix A3 = L * D3 * L.transpose(); + + LONGS_EQUAL(long(false), long(choleskyPartial(A1, 6))); + LONGS_EQUAL(long(false), long(choleskyPartial(A2, 6))); + LONGS_EQUAL(long(false), long(choleskyPartial(A3, 6))); +} + /* ************************************************************************* */ int main() { TestResult tr; diff --git a/gtsam/linear/GaussianConditional.cpp b/gtsam/linear/GaussianConditional.cpp index e167d8ad8..b35bffd3c 100644 --- a/gtsam/linear/GaussianConditional.cpp +++ b/gtsam/linear/GaussianConditional.cpp @@ -17,8 +17,10 @@ #include #include +#include #include +#include #include #include #include @@ -189,6 +191,11 @@ void GaussianConditional::solveInPlace(VectorValues& x) const { Vector xS = internal::extractVectorValuesSlices(x, this->beginParents(), this->endParents()); xS = this->get_d() - this->get_S() * xS; Vector soln = this->get_R().triangularView().solve(xS); + + // Check for indeterminant solution + if(soln.unaryExpr(!boost::lambda::bind(ptr_fun(isfinite), boost::lambda::_1)).any()) + throw IndeterminantLinearSystemException(this->keys().front()); + if(debug) { gtsam::print(Matrix(this->get_R()), "Calling backSubstituteUpper on "); gtsam::print(soln, "full back-substitution solution: "); @@ -199,8 +206,12 @@ void GaussianConditional::solveInPlace(VectorValues& x) const { /* ************************************************************************* */ void GaussianConditional::solveTransposeInPlace(VectorValues& gy) const { Vector frontalVec = internal::extractVectorValuesSlices(gy, beginFrontals(), endFrontals()); - // TODO: verify permutation frontalVec = gtsam::backSubstituteUpper(frontalVec,Matrix(get_R())); + + // Check for indeterminant solution + if(frontalVec.unaryExpr(!boost::lambda::bind(ptr_fun(isfinite), boost::lambda::_1)).any()) + throw IndeterminantLinearSystemException(this->keys().front()); + GaussianConditional::const_iterator it; for (it = beginParents(); it!= endParents(); it++) { const Index i = *it; diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index 6539f0cf4..dd86ffca6 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -393,14 +393,7 @@ break; // some untouched non-zeros that should be zero. We zero them while // extracting submatrices next. tic(4, "partial Cholesky"); - try { - combinedFactor->partialCholesky(nrFrontals); - } catch - (std::exception &ex) { // catch exception from Cholesky - combinedFactor->print("combinedFactor"); - string reason = "EliminateCholesky failed while trying to eliminate the combined factor"; - throw invalid_argument(reason); - } + combinedFactor->partialCholesky(nrFrontals); toc(4, "partial Cholesky"); @@ -502,64 +495,9 @@ break; return EliminateQR(factors, nrFrontals); else { GaussianFactorGraph::EliminationResult ret; -#ifdef NDEBUG - static const bool diag = false; -#else - static const bool diag = !ISDEBUG("NoCholeskyDiagnostics"); -#endif - if (!diag) { - tic(2, "EliminateCholesky"); - ret = EliminateCholesky(factors, nrFrontals); - toc(2, "EliminateCholesky"); - } else { - try { - tic(2, "EliminateCholesky"); - ret = EliminateCholesky(factors, nrFrontals); - toc(2, "EliminateCholesky"); - } catch (const exception& e) { - cout << "Exception in EliminateCholesky: " << e.what() << endl; - SETDEBUG("EliminateCholesky", true); - SETDEBUG("updateATA", true); - SETDEBUG("JacobianFactor::eliminate", true); - SETDEBUG("JacobianFactor::Combine", true); - SETDEBUG("choleskyPartial", true); - factors.print("Combining factors: "); - EliminateCholesky(factors, nrFrontals); - throw; - } - } - - const bool checkCholesky = ISDEBUG("EliminateGaussian Check Cholesky"); - if (checkCholesky) { - GaussianFactorGraph::EliminationResult expected; - FactorGraph jacobians = convertToJacobians(factors); - try { - // Compare with QR - expected = EliminateJacobians(jacobians, nrFrontals); - } catch (...) { - cout << "Exception in QR" << endl; - throw; - } - - H actual_factor(*ret.second); - H expected_factor(*expected.second); - if (!assert_equal(*expected.first, *ret.first, 100.0) - || !assert_equal(expected_factor, actual_factor, 1.0)) { - cout << "Cholesky and QR do not agree" << endl; - - SETDEBUG("EliminateCholesky", true); - SETDEBUG("updateATA", true); - SETDEBUG("JacobianFactor::eliminate", true); - SETDEBUG("JacobianFactor::Combine", true); - jacobians.print("Jacobian Factors: "); - EliminateJacobians(jacobians, nrFrontals); - EliminateCholesky(factors, nrFrontals); - factors.print("Combining factors: "); - - throw runtime_error("Cholesky and QR do not agree"); - } - } - + tic(2, "EliminateCholesky"); + ret = EliminateCholesky(factors, nrFrontals); + toc(2, "EliminateCholesky"); return ret; } diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index cdf597411..6db6330b0 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -47,13 +48,7 @@ string SlotEntry::toString() const { /* ************************************************************************* */ void HessianFactor::assertInvariants() const { -#ifndef NDEBUG - // Check for non-finite values - for(size_t i=0; i<(size_t) matrix_.rows(); ++i) - for(size_t j=i; j<(size_t) matrix_.cols(); ++j) - if(!isfinite(matrix_(i,j))) - throw invalid_argument("HessianFactor contains non-finite matrix entries."); -#endif + GaussianFactor::assertInvariants(); // The base class checks for unique keys } /* ************************************************************************* */ @@ -473,7 +468,8 @@ void HessianFactor::updateATA(const JacobianFactor& update, const Scatter& scatt /* ************************************************************************* */ void HessianFactor::partialCholesky(size_t nrFrontals) { - choleskyPartial(matrix_, info_.offset(nrFrontals)); + if(!choleskyPartial(matrix_, info_.offset(nrFrontals))) + throw IndeterminantLinearSystemException(this->keys().front()); } /* ************************************************************************* */ diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 0fa3bd7f5..7974c33b4 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -15,6 +15,7 @@ * @date Dec 8, 2010 */ +#include #include #include #include @@ -50,12 +51,6 @@ namespace gtsam { assert(firstNonzeroBlocks_.size() == Ab_.rows()); for(size_t i=0; i() = Matrix::Zero(maxrank, matrix_.cols()); @@ -324,7 +317,6 @@ namespace gtsam { return model_->whiten(Ax); } - /* ************************************************************************* */ void JacobianFactor::transposeMultiplyAdd(double alpha, const Vector& e, VectorValues& x) const { @@ -410,11 +402,8 @@ namespace gtsam { size_t frontalDim = Ab_.range(0,nrFrontals).cols(); // Check for singular factor - if(model_->dim() < frontalDim) { - throw domain_error((boost::format( - "JacobianFactor is singular in variable %1%, discovered while attempting\n" - "to eliminate this variable.") % front()).str()); - } + if(model_->dim() < frontalDim) + throw IndeterminantLinearSystemException(this->keys().front()); // Extract conditional tic(3, "cond Rd"); diff --git a/gtsam/linear/linearExceptions.h b/gtsam/linear/linearExceptions.h new file mode 100644 index 000000000..5e90f57b3 --- /dev/null +++ b/gtsam/linear/linearExceptions.h @@ -0,0 +1,180 @@ +/* ---------------------------------------------------------------------------- + + * 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 linearExceptions.h + * @brief Exceptions that may be thrown by linear solver components + * @author Richard Roberts + * @date Aug 17, 2012 + */ +#pragma once + +#include +#include +#include + +namespace gtsam { + + /** + Thrown when a linear system is ill-posed. The most common cause for this + error is having underconstrained variables. Mathematically, the system is + either underdetermined, or its quadratic error function is concave in some + directions. + + Examples of situations causing this error are: + - A landmark observed by two cameras with a very small baseline will have + high uncertainty in its distance from the cameras but low uncertainty + in its bearing, creating a poorly-conditioned system. + - A landmark observed by only a single ProjectionFactor, RangeFactor, or + BearingFactor (the landmark is not completely constrained). + - An overall scale or rigid transformation ambiguity, for example missing + a prior or hard constraint on the first pose, or missing a scale + constraint between the first two cameras (in structure-from-motion). + + Mathematically, the following conditions cause this problem: + - Underdetermined system: This occurs when the variables are not + completely constrained by factors. Even if all variables are involved + in factors, the variables can still be numerically underconstrained, + (for example, if a landmark is observed by only one ProjectionFactor). + Mathematically in this case, the rank of the linear Jacobian or Hessian + is less than the number of scalars in the system. + - Indefinite system: This condition occurs when the system Hessian is + indefinite, i.e. non-positive-semidefinite. Note that this condition + can also indicate an underdetermined system, but when solving with + Cholesky, accumulation of numerical errors can cause the system to + become indefinite (have some negative eigenvalues) even if it is in + reality positive semi-definite (has some near-zero positive + eigenvalues). Alternatively, if the system contains some + HessianFactor's with negative eigenvalues, these can create a truly + indefinite system, whose quadratic error function has negative + curvature in some directions. + - Poorly-conditioned system: A system that is positive-definite (has a + unique solution) but is numerically ill-conditioned can accumulate + numerical errors during solving that cause the system to become + indefinite later during the elimination process. Note that poorly- + conditioned systems will usually have inaccurate solutions, even if + they do not always trigger this error. Systems with almost- + unconstrained variables or vastly different measurement uncertainties + or variable units can be poorly-conditioned. + + Resolving this problem: + - This exception contains the variable at which the problem was + discovered (IndeterminantLinearSystemException::nearbyVariable()). + Note, however, that this is not necessarily the variable where the + problem originates. For example, in the case that a prior on the + first camera was forgotten, it may only be another camera or landmark + where the problem can be detected. Where the problem is detected + depends on the graph structure and variable elimination ordering. + - MATLAB (or similar software) is a useful tool to diagnose this problem. + Use GaussianFactorGraph::sparseJacobian_(), + GaussianFactorGraph::sparseJacobian() + GaussianFactorGraph::denseJacobian(), and + GaussianFactorGraph::denseHessian() to output the linear graph in + matrix format. If using the MATLAB wrapper, the returned matrices can + be immediately inspected and analyzed using standard methods. If not + using the MATLAB wrapper, the output of these functions may be written + to text files and then loaded into MATLAB. + - When outputting linear graphs as Jacobian matrices, rows are ordered in + the same order as factors in the graph, which each factor occupying the + number of rows indicated by its JacobianFactor::rows() function. Each + column appears in elimination ordering, as in the Ordering class. Each + variable occupies the number of columns indicated by the + JacobianFactor::getDim() function. + - When outputting linear graphs as Hessian matrices, rows and columns are + ordered in elimination order and occupy scalars in the same way as + described for Jacobian columns in the previous bullet. + */ + class IndeterminantLinearSystemException : public std::exception { + Index j_; + mutable std::string what_; + public: + IndeterminantLinearSystemException(Index j) throw() : j_(j) {} + virtual ~IndeterminantLinearSystemException() throw() {} + Index nearbyVariable() const { return j_; } + virtual const char* what() const throw() { + if(what_.empty()) + what_ = +"\nIndeterminant linear system detected while working near variable with\n" +"index " + boost::lexical_cast(j_) + " in ordering.\n" +"\n\ +Thrown when a linear system is ill-posed. The most common cause for this\n\ +error is having underconstrained variables. Mathematically, the system is\n\ +either underdetermined, or its quadratic error function is concave in some\n\ +directions.\n\ +\n\ +Examples of situations causing this error are:\n\ +- A landmark observed by two cameras with a very small baseline will have\n\ + high uncertainty in its distance from the cameras but low uncertainty\n\ + in its bearing, creating a poorly-conditioned system.\n\ +- A landmark observed by only a single ProjectionFactor, RangeFactor, or\n\ + BearingFactor (the landmark is not completely constrained).\n\ +- An overall scale or rigid transformation ambiguity, for example missing\n\ + a prior or hard constraint on the first pose, or missing a scale\n\ + constraint between the first two cameras (in structure-from-motion).\n\ +\n\ +Mathematically, the following conditions cause this problem:\n\ +- Underdetermined system: This occurs when the variables are not\n\ + completely constrained by factors. Even if all variables are involved\n\ + in factors, the variables can still be numerically underconstrained,\n\ + (for example, if a landmark is observed by only one ProjectionFactor).\n\ + Mathematically in this case, the rank of the linear Jacobian or Hessian\n\ + is less than the number of scalars in the system.\n\ +- Indefinite system: This condition occurs when the system Hessian is\n\ + indefinite, i.e. non-positive-semidefinite. Note that this condition\n\ + can also indicate an underdetermined system, but when solving with\n\ + Cholesky, accumulation of numerical errors can cause the system to\n\ + become indefinite (have some negative eigenvalues) even if it is in\n\ + reality positive semi-definite (has some near-zero positive\n\ + eigenvalues). Alternatively, if the system contains some\n\ + HessianFactor's with negative eigenvalues, these can create a truly\n\ + indefinite system, whose quadratic error function has negative\n\ + curvature in some directions.\n\ +- Poorly-conditioned system: A system that is positive-definite (has a\n\ + unique solution) but is numerically ill-conditioned can accumulate\n\ + numerical errors during solving that cause the system to become\n\ + indefinite later during the elimination process. Note that poorly-\n\ + conditioned systems will usually have inaccurate solutions, even if\n\ + they do not always trigger this error. Systems with almost-\n\ + unconstrained variables or vastly different measurement uncertainties\n\ + or variable units can be poorly-conditioned.\n\ +\n\ +Resolving this problem:\n\ +- This exception contains the variable at which the problem was\n\ + discovered (IndeterminantLinearSystemException::nearbyVariable()).\n\ + Note, however, that this is not necessarily the variable where the\n\ + problem originates. For example, in the case that a prior on the\n\ + first camera was forgotten, it may only be another camera or landmark\n\ + where the problem can be detected. Where the problem is detected\n\ + depends on the graph structure and variable elimination ordering.\n\ +- MATLAB (or similar software) is a useful tool to diagnose this problem.\n\ + Use GaussianFactorGraph::sparseJacobian_(),\n\ + GaussianFactorGraph::sparseJacobian()\n\ + GaussianFactorGraph::denseJacobian(), and\n\ + GaussianFactorGraph::denseHessian() to output the linear graph in\n\ + matrix format. If using the MATLAB wrapper, the returned matrices can\n\ + be immediately inspected and analyzed using standard methods. If not\n\ + using the MATLAB wrapper, the output of these functions may be written\n\ + to text files and then loaded into MATLAB.\n\ +- When outputting linear graphs as Jacobian matrices, rows are ordered in\n\ + the same order as factors in the graph, which each factor occupying the\n\ + number of rows indicated by its JacobianFactor::rows() function. Each\n\ + column appears in elimination ordering, as in the Ordering class. Each\n\ + variable occupies the number of columns indicated by the\n\ + JacobianFactor::getDim() function.\n\ +- When outputting linear graphs as Hessian matrices, rows and columns are\n\ + ordered in elimination order and occupy scalars in the same way as\n\ + described for Jacobian columns in the previous bullet.\ +"; + return what_.c_str(); + } + }; + +} diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index 52e5bccef..deb2fc9d1 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -140,7 +140,7 @@ struct ISAM2Params { * Cholesky is faster but potentially numerically unstable for poorly-conditioned problems, which can occur when * uncertainty is very low in some variables (or dimensions of variables) and very high in others. QR is * slower but more numerically stable in poorly-conditioned problems. We suggest using the default of Cholesky - * unless gtsam sometimes throws NegativeMatrixException when your problem's Hessian is actually positive + * unless gtsam sometimes throws IndefiniteLinearSystemException when your problem's Hessian is actually positive * definite. For positive definite problems, numerical error accumulation can cause the problem to become * numerically negative or indefinite as solving proceeds, especially when using Cholesky. */ diff --git a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp index 256763c59..a77cac35a 100644 --- a/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp +++ b/gtsam/nonlinear/LevenbergMarquardtOptimizer.cpp @@ -18,10 +18,10 @@ #include +#include #include #include -#include // For NegativeMatrixException #include #include @@ -134,7 +134,7 @@ void LevenbergMarquardtOptimizer::iterate() { state_.lambda *= params_.lambdaFactor; } } - } catch(const NegativeMatrixException& e) { + } catch(const IndeterminantLinearSystemException& e) { if(lmVerbosity >= LevenbergMarquardtParams::LAMBDA) cout << "Negative matrix, increasing lambda" << endl; // Either we're not cautious, or the same lambda was worse than the current error. From dc884edceb1e76b99091e881e6b7d5389376b2a5 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:30 +0000 Subject: [PATCH 797/914] No longer should permute JacobianFactor to sort keys when converting from HessianFactor --- gtsam/linear/JacobianFactor.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 7974c33b4..17d57f82b 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -208,21 +208,6 @@ namespace gtsam { firstNonzeroBlocks_.resize(this->rows(), 0); - // Sort keys - set vars; - for(size_t j=0; j Date: Wed, 22 Aug 2012 22:40:31 +0000 Subject: [PATCH 798/914] Removed commented-out code --- gtsam/linear/JacobianFactor.cpp | 53 --------------------------------- 1 file changed, 53 deletions(-) diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 17d57f82b..d0023b766 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -501,59 +501,6 @@ namespace gtsam { // Start of next part model_ = noiseModel; return splitConditional(nrFrontals); - -// // Check for singular factor -// if(noiseModel->dim() < frontalDim) { -// throw domain_error((boost::format( -// "JacobianFactor is singular in variable %1%, discovered while attempting\n" -// "to eliminate this variable.") % front()).str()); -// } -// -// // Extract conditional -// tic(3, "cond Rd"); -// -// // Restrict the matrix to be in the first nrFrontals variables -// Ab_.rowEnd() = Ab_.rowStart() + frontalDim; -// const Eigen::VectorBlock sigmas = noiseModel->sigmas().segment(Ab_.rowStart(), Ab_.rowEnd()-Ab_.rowStart()); -// GaussianConditional::shared_ptr conditional(new GaussianConditional(begin(), end(), nrFrontals, Ab_, sigmas)); -// if(debug) conditional->print("Extracted conditional: "); -// Ab_.rowStart() += frontalDim; -// Ab_.firstBlock() += nrFrontals; -// toc(3, "cond Rd"); -// -// if(debug) conditional->print("Extracted conditionals: "); -// -// tic(4, "remaining factor"); -// // Take lower-right block of Ab to get the new factor -// Ab_.rowEnd() = noiseModel->dim(); -// keys_.erase(begin(), begin() + nrFrontals); -// // Set sigmas with the right model -// if (noiseModel->isConstrained()) -// model_ = noiseModel::Constrained::MixedSigmas(sub(noiseModel->sigmas(), frontalDim, noiseModel->dim())); -// else -// model_ = noiseModel::Diagonal::Sigmas(sub(noiseModel->sigmas(), frontalDim, noiseModel->dim())); -// if(debug) this->print("Eliminated factor: "); -// assert(Ab_.rows() <= Ab_.cols()-1); -// toc(4, "remaining factor"); -// -// // todo SL: deal with "dead" pivot columns!!! -// tic(5, "rowstarts"); -// size_t varpos = 0; -// firstNonzeroBlocks_.resize(this->rows()); -// for(size_t row=0; row Date: Wed, 22 Aug 2012 22:40:34 +0000 Subject: [PATCH 799/914] Used verbosity constants instead of numbers --- gtsam/nonlinear/NonlinearOptimizer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtsam/nonlinear/NonlinearOptimizer.cpp b/gtsam/nonlinear/NonlinearOptimizer.cpp index b808a973c..2312a9f88 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.cpp +++ b/gtsam/nonlinear/NonlinearOptimizer.cpp @@ -119,7 +119,7 @@ bool checkConvergence(double relativeErrorTreshold, double absoluteErrorTreshold double errorThreshold, double currentError, double newError, NonlinearOptimizerParams::Verbosity verbosity) { - if ( verbosity >= 2 ) { + if ( verbosity >= NonlinearOptimizerParams::ERROR ) { if ( newError <= errorThreshold ) cout << "errorThreshold: " << newError << " < " << errorThreshold << endl; else @@ -130,7 +130,7 @@ bool checkConvergence(double relativeErrorTreshold, double absoluteErrorTreshold // check if diverges double absoluteDecrease = currentError - newError; - if (verbosity >= 2) { + if (verbosity >= NonlinearOptimizerParams::ERROR) { if (absoluteDecrease <= absoluteErrorTreshold) cout << "absoluteDecrease: " << setprecision(12) << absoluteDecrease << " < " << absoluteErrorTreshold << endl; else @@ -139,7 +139,7 @@ bool checkConvergence(double relativeErrorTreshold, double absoluteErrorTreshold // calculate relative error decrease and update currentError double relativeDecrease = absoluteDecrease / currentError; - if (verbosity >= 2) { + if (verbosity >= NonlinearOptimizerParams::ERROR) { if (relativeDecrease <= relativeErrorTreshold) cout << "relativeDecrease: " << setprecision(12) << relativeDecrease << " < " << relativeErrorTreshold << endl; else @@ -147,7 +147,7 @@ bool checkConvergence(double relativeErrorTreshold, double absoluteErrorTreshold } bool converged = (relativeErrorTreshold && (relativeDecrease <= relativeErrorTreshold)) || (absoluteDecrease <= absoluteErrorTreshold); - if (verbosity >= 1 && converged) { + if (verbosity >= NonlinearOptimizerParams::ERROR && converged) { if(absoluteDecrease >= 0.0) cout << "converged" << endl; else From 676985068900849fd6800f05de2428f27560a650 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:35 +0000 Subject: [PATCH 800/914] Fixed missing case from a couple commits ago --- gtsam/base/cholesky.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtsam/base/cholesky.cpp b/gtsam/base/cholesky.cpp index 8a02907c9..e941082ae 100644 --- a/gtsam/base/cholesky.cpp +++ b/gtsam/base/cholesky.cpp @@ -168,6 +168,8 @@ bool choleskyPartial(Matrix& ABC, size_t nFrontal) { int exp1; (void)frexp(ABC(0,0), &exp1); ok = (exp1 > -underconstrainedExponentDifference); + } else { + ok = true; } } else { ok = false; From cbbf62aeeb808f56cd70e8416dc758681785747f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:38 +0000 Subject: [PATCH 801/914] Updated wrap unit tests --- wrap/tests/expected/geometry_wrapper.cpp | 252 +++++++++--------- .../testNamespaces_wrapper.cpp | 150 ++++++----- 2 files changed, 205 insertions(+), 197 deletions(-) diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index b546aa65f..443795e5e 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -485,130 +485,134 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) int id = unwrap(in[0]); - switch(id) { - case 0: - Point2_collectorInsertAndMakeBase_0(nargout, out, nargin-1, in+1); - break; - case 1: - Point2_constructor_1(nargout, out, nargin-1, in+1); - break; - case 2: - Point2_constructor_2(nargout, out, nargin-1, in+1); - break; - case 3: - Point2_deconstructor_3(nargout, out, nargin-1, in+1); - break; - case 4: - Point2_argChar_4(nargout, out, nargin-1, in+1); - break; - case 5: - Point2_argUChar_5(nargout, out, nargin-1, in+1); - break; - case 6: - Point2_dim_6(nargout, out, nargin-1, in+1); - break; - case 7: - Point2_returnChar_7(nargout, out, nargin-1, in+1); - break; - case 8: - Point2_vectorConfusion_8(nargout, out, nargin-1, in+1); - break; - case 9: - Point2_x_9(nargout, out, nargin-1, in+1); - break; - case 10: - Point2_y_10(nargout, out, nargin-1, in+1); - break; - case 11: - Point3_collectorInsertAndMakeBase_11(nargout, out, nargin-1, in+1); - break; - case 12: - Point3_constructor_12(nargout, out, nargin-1, in+1); - break; - case 13: - Point3_deconstructor_13(nargout, out, nargin-1, in+1); - break; - case 14: - Point3_norm_14(nargout, out, nargin-1, in+1); - break; - case 15: - Point3_StaticFunctionRet_15(nargout, out, nargin-1, in+1); - break; - case 16: - Point3_staticFunction_16(nargout, out, nargin-1, in+1); - break; - case 17: - Test_collectorInsertAndMakeBase_17(nargout, out, nargin-1, in+1); - break; - case 18: - Test_constructor_18(nargout, out, nargin-1, in+1); - break; - case 19: - Test_constructor_19(nargout, out, nargin-1, in+1); - break; - case 20: - Test_deconstructor_20(nargout, out, nargin-1, in+1); - break; - case 21: - Test_arg_EigenConstRef_21(nargout, out, nargin-1, in+1); - break; - case 22: - Test_create_MixedPtrs_22(nargout, out, nargin-1, in+1); - break; - case 23: - Test_create_ptrs_23(nargout, out, nargin-1, in+1); - break; - case 24: - Test_print_24(nargout, out, nargin-1, in+1); - break; - case 25: - Test_return_Point2Ptr_25(nargout, out, nargin-1, in+1); - break; - case 26: - Test_return_Test_26(nargout, out, nargin-1, in+1); - break; - case 27: - Test_return_TestPtr_27(nargout, out, nargin-1, in+1); - break; - case 28: - Test_return_bool_28(nargout, out, nargin-1, in+1); - break; - case 29: - Test_return_double_29(nargout, out, nargin-1, in+1); - break; - case 30: - Test_return_field_30(nargout, out, nargin-1, in+1); - break; - case 31: - Test_return_int_31(nargout, out, nargin-1, in+1); - break; - case 32: - Test_return_matrix1_32(nargout, out, nargin-1, in+1); - break; - case 33: - Test_return_matrix2_33(nargout, out, nargin-1, in+1); - break; - case 34: - Test_return_pair_34(nargout, out, nargin-1, in+1); - break; - case 35: - Test_return_ptrs_35(nargout, out, nargin-1, in+1); - break; - case 36: - Test_return_size_t_36(nargout, out, nargin-1, in+1); - break; - case 37: - Test_return_string_37(nargout, out, nargin-1, in+1); - break; - case 38: - Test_return_vector1_38(nargout, out, nargin-1, in+1); - break; - case 39: - Test_return_vector2_39(nargout, out, nargin-1, in+1); - break; - case 40: - aGlobalFunction_40(nargout, out, nargin-1, in+1); - break; + try { + switch(id) { + case 0: + Point2_collectorInsertAndMakeBase_0(nargout, out, nargin-1, in+1); + break; + case 1: + Point2_constructor_1(nargout, out, nargin-1, in+1); + break; + case 2: + Point2_constructor_2(nargout, out, nargin-1, in+1); + break; + case 3: + Point2_deconstructor_3(nargout, out, nargin-1, in+1); + break; + case 4: + Point2_argChar_4(nargout, out, nargin-1, in+1); + break; + case 5: + Point2_argUChar_5(nargout, out, nargin-1, in+1); + break; + case 6: + Point2_dim_6(nargout, out, nargin-1, in+1); + break; + case 7: + Point2_returnChar_7(nargout, out, nargin-1, in+1); + break; + case 8: + Point2_vectorConfusion_8(nargout, out, nargin-1, in+1); + break; + case 9: + Point2_x_9(nargout, out, nargin-1, in+1); + break; + case 10: + Point2_y_10(nargout, out, nargin-1, in+1); + break; + case 11: + Point3_collectorInsertAndMakeBase_11(nargout, out, nargin-1, in+1); + break; + case 12: + Point3_constructor_12(nargout, out, nargin-1, in+1); + break; + case 13: + Point3_deconstructor_13(nargout, out, nargin-1, in+1); + break; + case 14: + Point3_norm_14(nargout, out, nargin-1, in+1); + break; + case 15: + Point3_StaticFunctionRet_15(nargout, out, nargin-1, in+1); + break; + case 16: + Point3_staticFunction_16(nargout, out, nargin-1, in+1); + break; + case 17: + Test_collectorInsertAndMakeBase_17(nargout, out, nargin-1, in+1); + break; + case 18: + Test_constructor_18(nargout, out, nargin-1, in+1); + break; + case 19: + Test_constructor_19(nargout, out, nargin-1, in+1); + break; + case 20: + Test_deconstructor_20(nargout, out, nargin-1, in+1); + break; + case 21: + Test_arg_EigenConstRef_21(nargout, out, nargin-1, in+1); + break; + case 22: + Test_create_MixedPtrs_22(nargout, out, nargin-1, in+1); + break; + case 23: + Test_create_ptrs_23(nargout, out, nargin-1, in+1); + break; + case 24: + Test_print_24(nargout, out, nargin-1, in+1); + break; + case 25: + Test_return_Point2Ptr_25(nargout, out, nargin-1, in+1); + break; + case 26: + Test_return_Test_26(nargout, out, nargin-1, in+1); + break; + case 27: + Test_return_TestPtr_27(nargout, out, nargin-1, in+1); + break; + case 28: + Test_return_bool_28(nargout, out, nargin-1, in+1); + break; + case 29: + Test_return_double_29(nargout, out, nargin-1, in+1); + break; + case 30: + Test_return_field_30(nargout, out, nargin-1, in+1); + break; + case 31: + Test_return_int_31(nargout, out, nargin-1, in+1); + break; + case 32: + Test_return_matrix1_32(nargout, out, nargin-1, in+1); + break; + case 33: + Test_return_matrix2_33(nargout, out, nargin-1, in+1); + break; + case 34: + Test_return_pair_34(nargout, out, nargin-1, in+1); + break; + case 35: + Test_return_ptrs_35(nargout, out, nargin-1, in+1); + break; + case 36: + Test_return_size_t_36(nargout, out, nargin-1, in+1); + break; + case 37: + Test_return_string_37(nargout, out, nargin-1, in+1); + break; + case 38: + Test_return_vector1_38(nargout, out, nargin-1, in+1); + break; + case 39: + Test_return_vector2_39(nargout, out, nargin-1, in+1); + break; + case 40: + aGlobalFunction_40(nargout, out, nargin-1, in+1); + break; + } + } catch(const std::exception& e) { + mexErrMsgTxt(("Exception from gtsam:\n" + std::string(e.what()) + "\n").c_str()); } std::cout.rdbuf(outbuf); diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index d199e59ab..1a31c4b90 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -353,79 +353,83 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) int id = unwrap(in[0]); - switch(id) { - case 0: - ns1ClassA_collectorInsertAndMakeBase_0(nargout, out, nargin-1, in+1); - break; - case 1: - ns1ClassA_constructor_1(nargout, out, nargin-1, in+1); - break; - case 2: - ns1ClassA_deconstructor_2(nargout, out, nargin-1, in+1); - break; - case 3: - ns1ClassB_collectorInsertAndMakeBase_3(nargout, out, nargin-1, in+1); - break; - case 4: - ns1ClassB_constructor_4(nargout, out, nargin-1, in+1); - break; - case 5: - ns1ClassB_deconstructor_5(nargout, out, nargin-1, in+1); - break; - case 6: - ns2ClassA_collectorInsertAndMakeBase_6(nargout, out, nargin-1, in+1); - break; - case 7: - ns2ClassA_constructor_7(nargout, out, nargin-1, in+1); - break; - case 8: - ns2ClassA_deconstructor_8(nargout, out, nargin-1, in+1); - break; - case 9: - ns2ClassA_memberFunction_9(nargout, out, nargin-1, in+1); - break; - case 10: - ns2ClassA_nsArg_10(nargout, out, nargin-1, in+1); - break; - case 11: - ns2ClassA_nsReturn_11(nargout, out, nargin-1, in+1); - break; - case 12: - ns2ClassA_afunction_12(nargout, out, nargin-1, in+1); - break; - case 13: - ns2ns3ClassB_collectorInsertAndMakeBase_13(nargout, out, nargin-1, in+1); - break; - case 14: - ns2ns3ClassB_constructor_14(nargout, out, nargin-1, in+1); - break; - case 15: - ns2ns3ClassB_deconstructor_15(nargout, out, nargin-1, in+1); - break; - case 16: - ns2ClassC_collectorInsertAndMakeBase_16(nargout, out, nargin-1, in+1); - break; - case 17: - ns2ClassC_constructor_17(nargout, out, nargin-1, in+1); - break; - case 18: - ns2ClassC_deconstructor_18(nargout, out, nargin-1, in+1); - break; - case 19: - ClassD_collectorInsertAndMakeBase_19(nargout, out, nargin-1, in+1); - break; - case 20: - ClassD_constructor_20(nargout, out, nargin-1, in+1); - break; - case 21: - ClassD_deconstructor_21(nargout, out, nargin-1, in+1); - break; - case 22: - ns1aGlobalFunction_22(nargout, out, nargin-1, in+1); - break; - case 23: - ns2aGlobalFunction_23(nargout, out, nargin-1, in+1); - break; + try { + switch(id) { + case 0: + ns1ClassA_collectorInsertAndMakeBase_0(nargout, out, nargin-1, in+1); + break; + case 1: + ns1ClassA_constructor_1(nargout, out, nargin-1, in+1); + break; + case 2: + ns1ClassA_deconstructor_2(nargout, out, nargin-1, in+1); + break; + case 3: + ns1ClassB_collectorInsertAndMakeBase_3(nargout, out, nargin-1, in+1); + break; + case 4: + ns1ClassB_constructor_4(nargout, out, nargin-1, in+1); + break; + case 5: + ns1ClassB_deconstructor_5(nargout, out, nargin-1, in+1); + break; + case 6: + ns2ClassA_collectorInsertAndMakeBase_6(nargout, out, nargin-1, in+1); + break; + case 7: + ns2ClassA_constructor_7(nargout, out, nargin-1, in+1); + break; + case 8: + ns2ClassA_deconstructor_8(nargout, out, nargin-1, in+1); + break; + case 9: + ns2ClassA_memberFunction_9(nargout, out, nargin-1, in+1); + break; + case 10: + ns2ClassA_nsArg_10(nargout, out, nargin-1, in+1); + break; + case 11: + ns2ClassA_nsReturn_11(nargout, out, nargin-1, in+1); + break; + case 12: + ns2ClassA_afunction_12(nargout, out, nargin-1, in+1); + break; + case 13: + ns2ns3ClassB_collectorInsertAndMakeBase_13(nargout, out, nargin-1, in+1); + break; + case 14: + ns2ns3ClassB_constructor_14(nargout, out, nargin-1, in+1); + break; + case 15: + ns2ns3ClassB_deconstructor_15(nargout, out, nargin-1, in+1); + break; + case 16: + ns2ClassC_collectorInsertAndMakeBase_16(nargout, out, nargin-1, in+1); + break; + case 17: + ns2ClassC_constructor_17(nargout, out, nargin-1, in+1); + break; + case 18: + ns2ClassC_deconstructor_18(nargout, out, nargin-1, in+1); + break; + case 19: + ClassD_collectorInsertAndMakeBase_19(nargout, out, nargin-1, in+1); + break; + case 20: + ClassD_constructor_20(nargout, out, nargin-1, in+1); + break; + case 21: + ClassD_deconstructor_21(nargout, out, nargin-1, in+1); + break; + case 22: + ns1aGlobalFunction_22(nargout, out, nargin-1, in+1); + break; + case 23: + ns2aGlobalFunction_23(nargout, out, nargin-1, in+1); + break; + } + } catch(const std::exception& e) { + mexErrMsgTxt(("Exception from gtsam:\n" + std::string(e.what()) + "\n").c_str()); } std::cout.rdbuf(outbuf); From 519ad721399d3d64640c6509afbfc48487bdd81e Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 22 Aug 2012 22:40:39 +0000 Subject: [PATCH 802/914] Made explicit instantiations in header file inline to avoid duplicate definition --- gtsam_unstable/slam/PoseTranslationPrior.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/slam/PoseTranslationPrior.h b/gtsam_unstable/slam/PoseTranslationPrior.h index ba023c0e3..9fc2bb423 100644 --- a/gtsam_unstable/slam/PoseTranslationPrior.h +++ b/gtsam_unstable/slam/PoseTranslationPrior.h @@ -25,8 +25,8 @@ bool isRotFirst() { } // Instantiate for common poses -template<> bool isRotFirst() { return true; } -template<> bool isRotFirst() { return false; } +template<> inline bool isRotFirst() { return true; } +template<> inline bool isRotFirst() { return false; } } // \namespace pose_traits From c60fc3ca2acabe23591be695be8282abf7fa42f3 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 24 Aug 2012 21:39:56 +0000 Subject: [PATCH 803/914] Relegated the PartialPriorFactor to gtsam_unstable --- gtsam_unstable/dynamics/DynamicsPriors.h | 2 +- gtsam_unstable/dynamics/tests/testIMUSystem.cpp | 2 +- {gtsam => gtsam_unstable}/slam/PartialPriorFactor.h | 0 gtsam_unstable/slam/PoseRotationPrior.h | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename {gtsam => gtsam_unstable}/slam/PartialPriorFactor.h (100%) diff --git a/gtsam_unstable/dynamics/DynamicsPriors.h b/gtsam_unstable/dynamics/DynamicsPriors.h index 2d0f9e6a6..ccf7063dc 100644 --- a/gtsam_unstable/dynamics/DynamicsPriors.h +++ b/gtsam_unstable/dynamics/DynamicsPriors.h @@ -9,7 +9,7 @@ #pragma once -#include +#include #include diff --git a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp index 86301f417..01c7925b3 100644 --- a/gtsam_unstable/dynamics/tests/testIMUSystem.cpp +++ b/gtsam_unstable/dynamics/tests/testIMUSystem.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/gtsam/slam/PartialPriorFactor.h b/gtsam_unstable/slam/PartialPriorFactor.h similarity index 100% rename from gtsam/slam/PartialPriorFactor.h rename to gtsam_unstable/slam/PartialPriorFactor.h diff --git a/gtsam_unstable/slam/PoseRotationPrior.h b/gtsam_unstable/slam/PoseRotationPrior.h index c4a7a7de7..d6efc0cc4 100644 --- a/gtsam_unstable/slam/PoseRotationPrior.h +++ b/gtsam_unstable/slam/PoseRotationPrior.h @@ -9,7 +9,7 @@ #pragma once -#include +#include #include namespace gtsam { From 3dff334cdfee3caffdd3e4e53d66fea14b0ee552 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 24 Aug 2012 22:02:17 +0000 Subject: [PATCH 804/914] Small printing problem --- gtsam/slam/BearingRangeFactor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index bf5b6b3a5..52f301b3c 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -67,7 +67,7 @@ namespace gtsam { std::cout << s << "BearingRangeFactor(" << keyFormatter(this->key1()) << "," << keyFormatter(this->key2()) << ")\n"; - measuredBearing_.print("measured bearing:\n"); + measuredBearing_.print("measured bearing: "); std::cout << "measured range: " << measuredRange_ << std::endl; this->noiseModel_->print("noise model:\n"); } From 23f31111486e7a0ef9ca3a20de4a78129bfa3a4f Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 24 Aug 2012 22:02:40 +0000 Subject: [PATCH 805/914] Now reads bearing-range factors --- gtsam/slam/dataset.cpp | 91 +++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index 29154f686..643764f71 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -24,6 +24,7 @@ #include #include #include +#include using namespace std; @@ -47,7 +48,7 @@ pair load2D( if (!is) throw std::invalid_argument("load2D: can not find the file!"); - Values::shared_ptr poses(new Values); + Values::shared_ptr initial(new Values); NonlinearFactorGraph::shared_ptr graph(new NonlinearFactorGraph); string tag; @@ -63,7 +64,7 @@ pair load2D( // optional filter if (maxID && id >= maxID) continue; - poses->insert(id, Pose2(x, y, yaw)); + initial->insert(id, Pose2(x, y, yaw)); } is.ignore(LINESIZE, '\n'); } @@ -77,49 +78,73 @@ pair load2D( while (is) { is >> tag; - if ((tag == "EDGE2") || (tag == "EDGE") || (tag == "ODOMETRY")) { - int id1, id2; - double x, y, yaw; + if ((tag == "EDGE2") || (tag == "EDGE") || (tag == "ODOMETRY")) { + int id1, id2; + double x, y, yaw; - is >> id1 >> id2 >> x >> y >> yaw; - Matrix m = eye(3); - is >> m(0, 0) >> m(0, 1) >> m(1, 1) >> m(2, 2) >> m(0, 2) >> m(1, 2); - m(2, 0) = m(0, 2); - m(2, 1) = m(1, 2); - m(1, 0) = m(0, 1); + is >> id1 >> id2 >> x >> y >> yaw; + Matrix m = eye(3); + is >> m(0, 0) >> m(0, 1) >> m(1, 1) >> m(2, 2) >> m(0, 2) >> m(1, 2); + m(2, 0) = m(0, 2); + m(2, 1) = m(1, 2); + m(1, 0) = m(0, 1); - // optional filter - if (maxID && (id1 >= maxID || id2 >= maxID)) - continue; + // optional filter + if (maxID && (id1 >= maxID || id2 >= maxID)) + continue; - Pose2 l1Xl2(x, y, yaw); + Pose2 l1Xl2(x, y, yaw); - // SharedNoiseModel noise = noiseModel::Gaussian::Covariance(m, smart); - if (!model) { - Vector variances = Vector_(3, m(0, 0), m(1, 1), m(2, 2)); - model = noiseModel::Diagonal::Variances(variances, smart); - } + // SharedNoiseModel noise = noiseModel::Gaussian::Covariance(m, smart); + if (!model) { + Vector variances = Vector_(3, m(0, 0), m(1, 1), m(2, 2)); + model = noiseModel::Diagonal::Variances(variances, smart); + } - if (addNoise) - l1Xl2 = l1Xl2.retract(sampler.sampleNewModel(*model)); + if (addNoise) + l1Xl2 = l1Xl2.retract(sampler.sampleNewModel(*model)); - // Insert vertices if pure odometry file - if (!poses->exists(id1)) - poses->insert(id1, Pose2()); - if (!poses->exists(id2)) - poses->insert(id2, poses->at(id1) * l1Xl2); + // Insert vertices if pure odometry file + if (!initial->exists(id1)) + initial->insert(id1, Pose2()); + if (!initial->exists(id2)) + initial->insert(id2, initial->at(id1) * l1Xl2); - NonlinearFactor::shared_ptr factor( - new BetweenFactor(id1, id2, l1Xl2, *model)); - graph->push_back(factor); - } + NonlinearFactor::shared_ptr factor( + new BetweenFactor(id1, id2, l1Xl2, *model)); + graph->push_back(factor); + } + if (tag == "BR") { + int id1, id2; + double bearing, range, bearing_std, range_std; + + is >> id1 >> id2 >> bearing >> range >> bearing_std >> range_std; + + // optional filter + if (maxID && (id1 >= maxID || id2 >= maxID)) + continue; + + noiseModel::Diagonal::shared_ptr measurementNoise = + noiseModel::Diagonal::Sigmas(Vector_(2, bearing_std, range_std)); + graph->add(BearingRangeFactor(id1, id2, bearing, range, measurementNoise)); + + // Insert poses or points if they do not exist yet + if (!initial->exists(id1)) + initial->insert(id1, Pose2()); + if (!initial->exists(id2)) { + Pose2 pose = initial->at(id1); + Point2 local(cos(bearing)*range,sin(bearing)*range); + Point2 global = pose.transform_from(local); + initial->insert(id2, global); + } + } is.ignore(LINESIZE, '\n'); } - cout << "load2D read a graph file with " << poses->size() + cout << "load2D read a graph file with " << initial->size() << " vertices and " << graph->nrFactors() << " factors" << endl; - return make_pair(graph, poses); + return make_pair(graph, initial); } /* ************************************************************************* */ From 9230458e067b5e35e4e81d7bc0f58f0d4aabf7a9 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 24 Aug 2012 22:03:24 +0000 Subject: [PATCH 806/914] Planar SLAM example from factor graph talk --- examples/Data/example.graph | 611 ++++++++++++++++++ .../gtsam_examples/PlanarSLAMExample_graph.m | 49 ++ 2 files changed, 660 insertions(+) create mode 100644 examples/Data/example.graph create mode 100644 matlab/gtsam_examples/PlanarSLAMExample_graph.m diff --git a/examples/Data/example.graph b/examples/Data/example.graph new file mode 100644 index 000000000..28034c69d --- /dev/null +++ b/examples/Data/example.graph @@ -0,0 +1,611 @@ +VERTEX2 0 -0.13824042322 0.342115061624 -0.21557075232 +VERTEX2 1 0.612650361503 0.369015313751 -0.0563461272597 +VERTEX2 2 1.45479903751 0.32013063469 0.00237213120454 +VERTEX2 3 2.15898096669 0.470294509791 0.2252884021 +VERTEX2 4 2.88516818219 0.975843235486 0.663228096686 +VERTEX2 5 3.54878752013 1.42348114163 0.514657357344 +VERTEX2 6 4.32268502365 1.77291535029 0.359562734992 +VERTEX2 7 5.08813168428 2.06549657048 0.478125988701 +VERTEX2 8 5.82496111116 2.35969982503 0.422228187736 +VERTEX2 9 6.60694009323 2.69135662887 0.387034318241 +VERTEX2 10 7.23925137037 3.104611283 0.512008508154 +VERTEX2 11 7.88977565307 3.52369876229 0.510071235528 +VERTEX2 12 8.46649417534 4.12269969397 0.748925805491 +VERTEX2 13 9.02278033295 4.72424791132 0.856233672115 +VERTEX2 14 9.51752434143 5.39695844275 0.935937098771 +VERTEX2 15 10.0446733918 5.98414466425 0.827804203493 +VERTEX2 16 10.7598348236 6.44960011929 0.66804473602 +VERTEX2 17 11.5972376522 6.80537766408 0.434941288594 +VERTEX2 18 12.2250075039 7.20442152894 0.60418193616 +VERTEX2 19 12.8678138507 7.70255061643 0.721822794329 +VERTEX2 20 13.5570195199 8.15843137362 0.593196573979 +VERTEX2 21 14.105649437 8.68489938394 0.640245465981 +VERTEX2 22 14.8224385492 9.03493116691 0.389518546051 +VERTEX2 23 15.5843623557 9.40302979333 0.425220242351 +VERTEX2 24 16.2288322902 9.91680608172 0.666877924504 +VERTEX2 25 16.7734636078 10.4312050251 0.681531027672 +VERTEX2 26 17.4387968671 11.005129183 0.768715640688 +VERTEX2 27 17.7890621789 11.6956218678 1.10988383528 +VERTEX2 28 18.1363236735 12.3803438454 1.15258075093 +VERTEX2 29 18.5588734995 13.1408718358 1.04155126412 +VERTEX2 30 18.9922514403 13.8160705369 0.971438456359 +VERTEX2 31 19.4325629424 14.4733850988 0.934520345955 +VERTEX2 32 19.9599388848 15.0464180472 0.877139653946 +VERTEX2 33 20.5469053533 15.5710340353 0.832297735476 +VERTEX2 34 21.2487400511 16.0027088196 0.400422858988 +VERTEX2 35 22.0354445454 16.279918955 0.319643226898 +VERTEX2 36 22.791287229 16.5499150181 0.433961446308 +VERTEX2 37 23.5369676303 16.8796783232 0.412377133313 +VERTEX2 38 24.3284326258 17.0889935946 0.247486633995 +VERTEX2 39 25.022695509 17.4036693591 0.418515661559 +VERTEX2 40 25.833691896 17.5333774597 0.242076471575 +VERTEX2 41 26.509920511 17.8164161072 0.330656267986 +VERTEX2 42 27.2102127101 18.1210604608 0.510746644634 +VERTEX2 43 27.9408557181 18.4814891494 0.453985699035 +VERTEX2 44 28.6169766716 18.8182098691 0.458777942952 +VERTEX2 45 29.4313889637 19.1357097768 0.315177512361 +VERTEX2 46 30.0878533291 19.5935012258 0.599592761269 +VERTEX2 47 30.6308494244 20.2191621501 0.791897780929 +VERTEX2 48 31.2734501775 20.7120615592 0.660037247468 +VERTEX2 49 31.9206533665 21.0772297685 0.5072035147 +VERTEX2 50 32.6763238236 21.4307681859 0.454485923064 +VERTEX2 51 33.3148481476 21.8561680514 0.60984431497 +VERTEX2 52 34.1013046603 22.2191493052 0.390376111344 +VERTEX2 53 34.8953983726 22.3514742253 0.21440693077 +VERTEX2 54 35.5398222802 22.7545971294 0.615814590831 +VERTEX2 55 36.0796597873 23.3482683055 0.770181973449 +VERTEX2 56 36.7331436274 23.8425596089 0.686311813947 +VERTEX2 57 37.3595434784 24.3051907322 0.642633326683 +VERTEX2 58 37.9821262299 24.7824436801 0.670645829824 +VERTEX2 59 38.5783823068 25.3597188555 0.700563120761 +VERTEX2 60 39.1778265015 25.9111323369 0.739828088912 +VERTEX2 61 39.7774314984 26.468354909 0.760112883167 +VERTEX2 62 40.5142302821 26.7603415627 0.360997494201 +VERTEX2 63 41.3046572615 26.9763392108 0.294108606273 +VERTEX2 64 42.0961911474 26.9894909267 0.0261721941131 +VERTEX2 65 42.8993485692 27.0228858541 -0.0101699718322 +VERTEX2 66 43.7802018787 26.9183386714 -0.14998582283 +VERTEX2 67 44.4852457598 26.6914007663 -0.229610091357 +VERTEX2 68 45.2817862376 26.3996944287 -0.403989633144 +VERTEX2 69 45.9356734923 26.0051290697 -0.524619871446 +VERTEX2 70 46.6446168067 25.600148756 -0.514124183817 +VERTEX2 71 47.3746747907 25.2783070597 -0.393217999666 +VERTEX2 72 48.0468975618 24.858529404 -0.611511747817 +VERTEX2 73 48.5985868491 24.2739248983 -0.750544536918 +VERTEX2 74 49.0527438314 23.5710791408 -0.961680491481 +VERTEX2 75 49.2855884713 22.8045393649 -1.26366594654 +VERTEX2 76 49.5531551426 22.07091907 -1.20968280224 +VERTEX2 77 49.7661651916 21.2825192392 -1.31976079475 +VERTEX2 78 50.0808782733 20.5442674319 -1.12044697254 +VERTEX2 79 50.2411613948 19.8192859683 -1.32310987107 +VERTEX2 80 50.593374374 19.0401532836 -1.19010897017 +VERTEX2 81 50.7996996995 18.2237817778 -1.25581427155 +VERTEX2 82 51.1212445439 17.5292614731 -1.12361470203 +VERTEX2 83 51.4506022502 16.8176851053 -1.26886160199 +VERTEX2 84 51.6718980908 16.0314246481 -1.20207903627 +VERTEX2 85 51.7763413724 15.2475638806 -1.37580476659 +VERTEX2 86 51.7436299376 14.470393643 -1.57551900737 +VERTEX2 87 51.7823620936 13.662469339 -1.58332101723 +VERTEX2 88 51.7876820152 12.8254876297 -1.54396226933 +VERTEX2 89 51.8506699031 12.0601624148 -1.49704318637 +VERTEX2 90 52.1025342746 11.3090918983 -1.27677489091 +VERTEX2 91 52.3751696328 10.5860629809 -1.18997203951 +VERTEX2 92 52.7492358918 9.85554108611 -1.06464614342 +VERTEX2 93 53.0454987108 9.0309169672 -1.09735731166 +VERTEX2 94 53.5294752309 8.30487726603 -0.996640361599 +EDGE2 0 1 0.717448855412 0.179994080198 0.13818539933 1 0 1 1 0 0 +EDGE2 1 2 0.837626285811 -0.00455175621601 0.0472991985156 1 0 1 1 0 0 +EDGE2 2 3 0.730277063669 0.138122839345 0.195071775287 1 0 1 1 0 0 +EDGE2 3 4 0.820088167497 0.330077088561 0.419082044433 1 0 1 1 0 0 +EDGE2 4 5 0.751370583006 -0.0273254868576 -0.228659037893 1 0 1 1 0 0 +EDGE2 5 6 0.840179304794 -0.0492096503989 -0.165641208116 1 0 1 1 0 0 +EDGE2 6 7 0.834845292082 0.0123885559434 0.125976751144 1 0 1 1 0 0 +EDGE2 7 8 0.787371504945 -0.0559773501633 -0.0755976318713 1 0 1 1 0 0 +EDGE2 8 9 0.927708591397 -0.0476716890116 -0.00287962007188 1 0 1 1 0 0 +EDGE2 9 10 0.730378261921 0.17317279657 0.138282893502 1 0 1 1 0 0 +EDGE2 10 11 0.779303803898 0.0853449755561 0.0323688320359 1 0 1 1 0 0 +EDGE2 11 12 0.78273752447 0.300201637472 0.246750324389 1 0 1 1 0 0 +EDGE2 12 13 0.791566966819 0.0845024659404 0.0706094824868 1 0 1 1 0 0 +EDGE2 13 14 0.839568888481 0.0868682543031 0.0707684617219 1 0 1 1 0 0 +EDGE2 14 15 0.773151053081 -0.0593185180517 -0.155366269405 1 0 1 1 0 0 +EDGE2 15 16 0.865064493339 -0.175806171924 -0.17949133873 1 0 1 1 0 0 +EDGE2 16 17 0.911877312319 -0.185936696416 -0.268755813818 1 0 1 1 0 0 +EDGE2 17 18 0.770300068296 0.126048087534 0.188926402795 1 0 1 1 0 0 +EDGE2 18 19 0.836050157131 0.0586909108092 0.103845037354 1 0 1 1 0 0 +EDGE2 19 20 0.802346917562 -0.147928636285 -0.093306893258 1 0 1 1 0 0 +EDGE2 20 21 0.757849343112 0.0715772513539 0.124155654615 1 0 1 1 0 0 +EDGE2 21 22 0.775750933534 -0.196756273535 -0.298936959752 1 0 1 1 0 0 +EDGE2 22 23 0.871271438269 0.0573046191775 0.0353456305698 1 0 1 1 0 0 +EDGE2 23 24 0.811030742162 0.182063773111 0.250823572639 1 0 1 1 0 0 +EDGE2 24 25 0.746714037369 0.0325617212022 -0.0276665993655 1 0 1 1 0 0 +EDGE2 25 26 0.86122739728 -0.00477108497939 0.0654936733039 1 0 1 1 0 0 +EDGE2 26 27 0.743470468243 0.258017697 0.326840047412 1 0 1 1 0 0 +EDGE2 27 28 0.767611305804 -0.0194473809016 0.015974781367 1 0 1 1 0 0 +EDGE2 28 29 0.862923844436 -0.072552727637 -0.101230904939 1 0 1 1 0 0 +EDGE2 29 30 0.798343874527 -0.0100123616381 -0.0690217895568 1 0 1 1 0 0 +EDGE2 30 31 0.797880458664 0.010391602905 -0.0148972103321 1 0 1 1 0 0 +EDGE2 31 32 0.7909503515 -0.129294597268 -0.0650424809131 1 0 1 1 0 0 +EDGE2 32 33 0.842504611493 -0.175416599555 -0.0602555708183 1 0 1 1 0 0 +EDGE2 33 34 0.850215628436 -0.25776734023 -0.430013888881 1 0 1 1 0 0 +EDGE2 34 35 0.878503147997 -0.0904880193607 -0.110294282873 1 0 1 1 0 0 +EDGE2 35 36 0.856359797661 -0.00248016167379 0.151938705998 1 0 1 1 0 0 +EDGE2 36 37 0.832014541489 -0.0130179735184 0.0190247158611 1 0 1 1 0 0 +EDGE2 37 38 0.79003682341 -0.11167056714 -0.209191335194 1 0 1 1 0 0 +EDGE2 38 39 0.773095034914 0.115088515991 0.198916260227 1 0 1 1 0 0 +EDGE2 39 40 0.868778586384 -0.268010831047 -0.216977740006 1 0 1 1 0 0 +EDGE2 40 41 0.747080875885 0.111312520032 0.12949742181 1 0 1 1 0 0 +EDGE2 41 42 0.778805446629 0.021318220948 0.192566907397 1 0 1 1 0 0 +EDGE2 42 43 0.805554382015 0.0232777384249 -0.0694087339945 1 0 1 1 0 0 +EDGE2 43 44 0.813443633444 0.0640947959252 0.0147897258654 1 0 1 1 0 0 +EDGE2 44 45 0.880420396037 -0.0605322428822 -0.144031989178 1 0 1 1 0 0 +EDGE2 45 46 0.827332486742 0.280288429131 0.328067436679 1 0 1 1 0 0 +EDGE2 46 47 0.815610897482 0.224126154957 0.19211589295 1 0 1 1 0 0 +EDGE2 47 48 0.829375613726 -0.13990131371 -0.15863308512 1 0 1 1 0 0 +EDGE2 48 49 0.756790221176 -0.0537543626573 -0.14995378239 1 0 1 1 0 0 +EDGE2 49 50 0.864033920652 -0.060820449151 -0.0470197844462 1 0 1 1 0 0 +EDGE2 50 51 0.747576670836 0.115572803882 0.111904734712 1 0 1 1 0 0 +EDGE2 51 52 0.801571192348 -0.200227517424 -0.271734247998 1 0 1 1 0 0 +EDGE2 52 53 0.783342882846 -0.216604931502 -0.232376474041 1 0 1 1 0 0 +EDGE2 53 54 0.716633103688 0.208120785595 0.398955080153 1 0 1 1 0 0 +EDGE2 54 55 0.773727687761 0.144824498948 0.159143610152 1 0 1 1 0 0 +EDGE2 55 56 0.779100726172 -0.140449927137 -0.0179275725938 1 0 1 1 0 0 +EDGE2 56 57 0.77536053616 -0.0727835270276 -0.0370113971051 1 0 1 1 0 0 +EDGE2 57 58 0.792809168417 -0.00330191812217 0.0632619937894 1 0 1 1 0 0 +EDGE2 58 59 0.789336249422 0.0499678920653 0.04511737545 1 0 1 1 0 0 +EDGE2 59 60 0.799312335356 0.0154078296169 0.0686385071901 1 0 1 1 0 0 +EDGE2 60 61 0.841385096251 -0.0451402806057 -0.00137586137994 1 0 1 1 0 0 +EDGE2 61 62 0.73727689023 -0.335159174575 -0.434654147977 1 0 1 1 0 0 +EDGE2 62 63 0.849739889254 -0.101852726335 -0.0546134930344 1 0 1 1 0 0 +EDGE2 63 64 0.732343387025 -0.152861749502 -0.277235132206 1 0 1 1 0 0 +EDGE2 64 65 0.778127849356 0.0424893245594 -0.103498695967 1 0 1 1 0 0 +EDGE2 65 66 0.847762865635 -0.152071812994 -0.150846679463 1 0 1 1 0 0 +EDGE2 66 67 0.803448897426 -0.0786018488252 -0.100750096392 1 0 1 1 0 0 +EDGE2 67 68 0.869574260331 -0.067393723035 -0.227113129725 1 0 1 1 0 0 +EDGE2 68 69 0.700122812394 -0.127175450528 -0.145967973471 1 0 1 1 0 0 +EDGE2 69 70 0.741569767586 0.0209821877481 0.0347431035841 1 0 1 1 0 0 +EDGE2 70 71 0.782413802829 0.0140327998855 0.120620056225 1 0 1 1 0 0 +EDGE2 71 72 0.726382907259 -0.174488223666 -0.216565330734 1 0 1 1 0 0 +EDGE2 72 73 0.786270332597 -0.222893898151 -0.0947849029055 1 0 1 1 0 0 +EDGE2 73 74 0.872600785936 -0.157300465738 -0.187369985951 1 0 1 1 0 0 +EDGE2 74 75 0.745108268557 -0.24332540853 -0.256205853911 1 0 1 1 0 0 +EDGE2 75 76 0.741656734669 0.0584297856637 0.0684660276348 1 0 1 1 0 0 +EDGE2 76 77 0.83107553466 -0.068222280325 -0.101097480556 1 0 1 1 0 0 +EDGE2 77 78 0.838396530029 0.105042823302 0.218131052621 1 0 1 1 0 0 +EDGE2 78 79 0.76082044773 -0.162843454224 -0.195114595262 1 0 1 1 0 0 +EDGE2 79 80 0.8724369566 0.157719970278 0.155580359369 1 0 1 1 0 0 +EDGE2 80 81 0.89087135963 -0.0673911030734 -0.043743726621 1 0 1 1 0 0 +EDGE2 81 82 0.771001809797 0.114512192599 0.150286338457 1 0 1 1 0 0 +EDGE2 82 83 0.812780357241 0.00395510362595 -0.215353852667 1 0 1 1 0 0 +EDGE2 83 84 0.812252387954 -0.0274735142136 0.0152810139298 1 0 1 1 0 0 +EDGE2 84 85 0.728059940228 -0.211739661884 -0.148376056446 1 0 1 1 0 0 +EDGE2 85 86 0.743100348032 -0.205518475255 -0.220672724526 1 0 1 1 0 0 +EDGE2 86 87 0.800837885496 0.0270216423016 -0.0121669543509 1 0 1 1 0 0 +EDGE2 87 88 0.84523698212 0.025403746229 0.0393784439646 1 0 1 1 0 0 +EDGE2 88 89 0.776634574418 0.0577931763852 0.0735885911249 1 0 1 1 0 0 +EDGE2 89 90 0.795529423553 0.237162491279 0.23536520899 1 0 1 1 0 0 +EDGE2 90 91 0.805787421901 0.0521263906349 0.0421550276299 1 0 1 1 0 0 +EDGE2 91 92 0.821073980711 0.0501285496699 0.101339417467 1 0 1 1 0 0 +EDGE2 92 93 0.852950616989 -0.144711794646 -0.0130042276003 1 0 1 1 0 0 +EDGE2 93 94 0.86189702426 0.0935919937033 0.0835356089409 1 0 1 1 0 0 +BR 0 144 0.185182458717 9.13212526936 0.0349 0.1 +BR 1 144 -0.0129226894449 8.31812366009 0.0349 0.1 +BR 2 137 -0.00718256171569 9.4510095689 0.0349 0.1 +BR 2 144 -0.0402886026913 7.40183795114 0.0349 0.1 +BR 3 110 -0.0749913933297 9.38512144583 0.0349 0.1 +BR 3 137 -0.214302812649 8.91847706309 0.0349 0.1 +BR 3 144 -0.331046619669 6.88216766504 0.0349 0.1 +BR 4 110 -0.528773048781 8.70707069137 0.0349 0.1 +BR 4 137 -0.721109439101 8.1019911191 0.0349 0.1 +BR 4 144 -0.823882810817 6.3429714463 0.0349 0.1 +BR 5 110 -0.440317029226 7.90152610245 0.0349 0.1 +BR 5 137 -0.695335598589 7.36947399552 0.0349 0.1 +BR 5 144 -0.836258509529 5.68573435009 0.0349 0.1 +BR 6 110 -0.300578669402 7.30263189677 0.0349 0.1 +BR 6 137 -0.615732878739 6.58070581163 0.0349 0.1 +BR 6 144 -0.748502380201 4.97181349627 0.0349 0.1 +BR 7 110 -0.457809242486 6.4057096724 0.0349 0.1 +BR 7 137 -0.799831219908 6.09478184977 0.0349 0.1 +BR 7 144 -0.964230560912 4.56454858228 0.0349 0.1 +BR 8 110 -0.467348208232 5.49325886324 0.0349 0.1 +BR 8 137 -0.807694275092 5.51772540214 0.0349 0.1 +BR 8 144 -1.13536530576 3.81666726517 0.0349 0.1 +BR 9 110 -0.518981300619 5.25851673305 0.0349 0.1 +BR 9 137 -0.854409841336 5.08562424167 0.0349 0.1 +BR 9 144 -1.28402784294 3.64150184656 0.0349 0.1 +BR 10 110 -0.790651006069 4.290875248 0.0349 0.1 +BR 10 137 -1.18130413181 4.71464967115 0.0349 0.1 +BR 10 144 -1.5646244434 3.61089756748 0.0349 0.1 +BR 11 110 -0.880642022432 3.98236035001 0.0349 0.1 +BR 11 137 -1.29691369659 4.50238497278 0.0349 0.1 +BR 11 144 -1.82713910938 3.78383778763 0.0349 0.1 +BR 12 110 -1.32187002351 3.62433679399 0.0349 0.1 +BR 12 137 -1.7145607617 4.46822989525 0.0349 0.1 +BR 12 144 -2.21545709717 4.24105066636 0.0349 0.1 +BR 13 110 -1.71296518505 3.57549906761 0.0349 0.1 +BR 13 137 -1.98866377754 4.79459486414 0.0349 0.1 +BR 13 144 -2.46140779298 4.93843797616 0.0349 0.1 +BR 14 110 -1.99056042177 3.82339476594 0.0349 0.1 +BR 14 137 -2.22640434465 5.305250162 0.0349 0.1 +BR 14 144 -2.55677091106 5.46170314439 0.0349 0.1 +BR 15 110 -2.04880614871 4.10480923415 0.0349 0.1 +BR 15 137 -2.23779804266 5.87635629681 0.0349 0.1 +BR 15 144 -2.6151098223 6.3515317913 0.0349 0.1 +BR 16 110 -2.06003060806 4.42557132946 0.0349 0.1 +BR 16 117 -1.35214243919 10.0761482514 0.0349 0.1 +BR 16 137 -2.21401914815 6.16051869558 0.0349 0.1 +BR 16 144 -2.53705251945 6.83886701303 0.0349 0.1 +BR 17 110 -2.05946000954 4.70286658969 0.0349 0.1 +BR 17 117 -1.24383519856 9.61361367685 0.0349 0.1 +BR 17 137 -2.10879624347 6.45383801752 0.0349 0.1 +BR 17 144 -2.37194735825 7.43285240943 0.0349 0.1 +BR 18 110 -2.24565367321 5.05455899365 0.0349 0.1 +BR 18 117 -1.4566998731 9.45407941567 0.0349 0.1 +BR 18 137 -2.36776538577 7.09802331697 0.0349 0.1 +BR 18 144 -2.63414325206 8.05544152173 0.0349 0.1 +BR 19 110 -2.53165374141 5.63229552339 0.0349 0.1 +BR 19 117 -1.69653853719 9.45427424857 0.0349 0.1 +BR 19 137 -2.50848481788 7.55177276066 0.0349 0.1 +BR 19 144 -2.79987374438 8.77345763541 0.0349 0.1 +BR 20 110 -2.47990354001 6.35010296373 0.0349 0.1 +BR 20 117 -1.62650378923 9.39686061139 0.0349 0.1 +BR 20 137 -2.54701526227 8.32866970212 0.0349 0.1 +BR 20 144 -2.63947313054 9.56517009268 0.0349 0.1 +BR 21 110 -2.55850203983 6.96898661248 0.0349 0.1 +BR 21 117 -1.72847175528 9.84266033626 0.0349 0.1 +BR 21 130 0.664621658612 9.5759865835 0.0349 0.1 +BR 21 137 -2.57262324612 9.07025812037 0.0349 0.1 +BR 22 110 -2.46140069173 7.76173665587 0.0349 0.1 +BR 22 117 -1.50767608255 9.8291133283 0.0349 0.1 +BR 22 130 0.823885118652 8.81501192048 0.0349 0.1 +BR 22 137 -2.38946943302 9.59604468387 0.0349 0.1 +BR 23 110 -2.49582690441 8.28781200224 0.0349 0.1 +BR 23 117 -1.72519040254 9.80915204869 0.0349 0.1 +BR 23 130 0.931240309024 8.39880397639 0.0349 0.1 +BR 24 110 -2.75856723917 9.10160958405 0.0349 0.1 +BR 24 130 0.78416776229 7.76276053788 0.0349 0.1 +BR 25 110 -2.80692285652 9.76642515575 0.0349 0.1 +BR 25 130 0.775233070078 7.11275145442 0.0349 0.1 +BR 26 130 0.790834643547 6.33736770408 0.0349 0.1 +BR 27 130 0.534243817656 5.91578829565 0.0349 0.1 +BR 28 112 0.0414364252573 9.90330083232 0.0349 0.1 +BR 28 130 0.508210275456 5.21523105568 0.0349 0.1 +BR 28 146 -0.845262619975 9.96746671173 0.0349 0.1 +BR 29 112 0.183098888443 8.97611974568 0.0349 0.1 +BR 29 130 0.714643071872 4.52800551501 0.0349 0.1 +BR 29 146 -0.759652310647 9.34738787399 0.0349 0.1 +BR 30 112 0.220803493857 8.38735907801 0.0349 0.1 +BR 30 130 0.986350911973 3.98277990705 0.0349 0.1 +BR 30 146 -0.778277445645 8.57965070765 0.0349 0.1 +BR 31 112 0.299031878039 7.66323555915 0.0349 0.1 +BR 31 130 1.24857419325 3.67126201123 0.0349 0.1 +BR 31 146 -0.801974563814 8.07274519519 0.0349 0.1 +BR 32 112 0.423997675694 6.73235131609 0.0349 0.1 +BR 32 130 1.46838088131 3.46892248338 0.0349 0.1 +BR 32 146 -0.79908260713 7.4588636461 0.0349 0.1 +BR 33 112 0.476958671405 6.18741823661 0.0349 0.1 +BR 33 130 1.75701275846 3.59510992657 0.0349 0.1 +BR 33 146 -0.831662121031 7.04303707355 0.0349 0.1 +BR 34 112 1.11053185407 5.73111181601 0.0349 0.1 +BR 34 130 2.32852970858 4.06426280442 0.0349 0.1 +BR 34 146 -0.46502078765 6.39400757176 0.0349 0.1 +BR 35 112 1.29539336024 5.39706444208 0.0349 0.1 +BR 35 129 -0.286317245678 9.78983149537 0.0349 0.1 +BR 35 130 2.56479344603 4.74998169538 0.0349 0.1 +BR 35 146 -0.532333579717 5.60699182585 0.0349 0.1 +BR 36 112 1.32829018039 5.23245230162 0.0349 0.1 +BR 36 129 -0.460072777958 8.93159378784 0.0349 0.1 +BR 36 130 -3.72946554068 5.24707372009 0.0349 0.1 +BR 36 146 -0.651976626401 5.00329187599 0.0349 0.1 +BR 37 112 1.47981669566 4.97207303698 0.0349 0.1 +BR 37 129 -0.3297608179 8.28473488253 0.0349 0.1 +BR 37 130 -3.64959871445 6.0920051131 0.0349 0.1 +BR 37 146 -0.761130816352 4.33535233295 0.0349 0.1 +BR 38 112 1.79010072399 5.11134982 0.0349 0.1 +BR 38 129 -0.239172851184 7.30972395375 0.0349 0.1 +BR 38 130 -3.51623581001 7.035350049 0.0349 0.1 +BR 38 132 0.0344695438909 9.16065906572 0.0349 0.1 +BR 38 146 -0.729682501329 3.69383136681 0.0349 0.1 +BR 39 112 1.80724225657 5.0712041146 0.0349 0.1 +BR 39 129 -0.466822552134 6.71909069076 0.0349 0.1 +BR 39 130 -3.58201828036 7.74976854347 0.0349 0.1 +BR 39 132 -0.145489919023 8.26408270817 0.0349 0.1 +BR 39 136 -0.373174247759 10.0594690013 0.0349 0.1 +BR 39 146 -1.03884588422 3.05919083504 0.0349 0.1 +BR 40 112 2.09018812193 5.6349471547 0.0349 0.1 +BR 40 129 -0.347661923995 6.08661605953 0.0349 0.1 +BR 40 130 -3.40788452199 8.33216602696 0.0349 0.1 +BR 40 132 0.0183763853089 7.65498891306 0.0349 0.1 +BR 40 136 -0.205928280437 9.23372153865 0.0349 0.1 +BR 40 146 -1.15729572346 2.758937753 0.0349 0.1 +BR 41 112 2.11156675384 6.17957324232 0.0349 0.1 +BR 41 129 -0.513471163104 5.47917944802 0.0349 0.1 +BR 41 130 -3.45321447468 8.96911724514 0.0349 0.1 +BR 41 132 -0.00417850025153 6.7854687031 0.0349 0.1 +BR 41 136 -0.306724739524 8.47672248547 0.0349 0.1 +BR 41 146 -1.48971635217 2.63763674624 0.0349 0.1 +BR 42 112 2.03992029635 6.31576122552 0.0349 0.1 +BR 42 129 -0.830261802361 4.91295992246 0.0349 0.1 +BR 42 130 -3.55865937637 9.89982911214 0.0349 0.1 +BR 42 132 -0.236186305191 6.2509710589 0.0349 0.1 +BR 42 136 -0.594332746928 7.68658045685 0.0349 0.1 +BR 42 146 -1.89947156813 2.90103368108 0.0349 0.1 +BR 43 112 2.20405052469 6.82505384798 0.0349 0.1 +BR 43 129 -0.86677535825 4.24973929099 0.0349 0.1 +BR 43 132 -0.170572630907 5.21697313753 0.0349 0.1 +BR 43 136 -0.59926860855 6.96617850118 0.0349 0.1 +BR 43 146 -2.18328873694 3.15420328364 0.0349 0.1 +BR 44 112 2.28288455017 7.21970860023 0.0349 0.1 +BR 44 129 -1.0660796602 3.60369990665 0.0349 0.1 +BR 44 132 -0.269529469754 4.78179932008 0.0349 0.1 +BR 44 136 -0.552094085176 6.39602268905 0.0349 0.1 +BR 44 146 -2.34040228059 3.39346775306 0.0349 0.1 +BR 45 112 2.53707604246 8.03041958241 0.0349 0.1 +BR 45 129 -1.17710675346 3.31741261854 0.0349 0.1 +BR 45 132 -0.169178567894 3.72737707244 0.0349 0.1 +BR 45 136 -0.58982083798 5.65573127607 0.0349 0.1 +BR 45 146 -2.31254599631 4.073315509 0.0349 0.1 +BR 46 112 2.30336072906 8.53878391819 0.0349 0.1 +BR 46 129 -1.56469510909 3.27257795455 0.0349 0.1 +BR 46 132 -0.596947941988 3.01003728934 0.0349 0.1 +BR 46 136 -0.972903852928 5.11198354755 0.0349 0.1 +BR 46 145 -0.379034045173 9.44743347682 0.0349 0.1 +BR 46 146 -2.71640793524 4.69101880432 0.0349 0.1 +BR 47 112 -4.09979829598 8.93000904485 0.0349 0.1 +BR 47 129 -2.08829636192 3.6048789119 0.0349 0.1 +BR 47 132 -0.992144225485 2.55259283291 0.0349 0.1 +BR 47 136 -1.37087445362 4.9788870276 0.0349 0.1 +BR 47 138 0.471079307943 9.48838419239 0.0349 0.1 +BR 47 145 -0.585304896045 8.55966650601 0.0349 0.1 +BR 47 146 -2.86951126121 5.46138428744 0.0349 0.1 +BR 48 112 -3.87787490571 9.29627530206 0.0349 0.1 +BR 48 129 -2.08519281032 3.93461289407 0.0349 0.1 +BR 48 132 -1.1882653081 2.02386021289 0.0349 0.1 +BR 48 136 -1.37524100074 4.78257071668 0.0349 0.1 +BR 48 138 0.596766880921 8.85284436333 0.0349 0.1 +BR 48 145 -0.641491507579 7.95203729796 0.0349 0.1 +BR 48 146 -2.75763166267 6.362323849 0.0349 0.1 +BR 49 211 0.739516646502 9.8712550054 0.0349 0.1 +BR 49 129 -2.14750043042 4.41467137273 0.0349 0.1 +BR 49 132 -1.32001186912 1.81101852014 0.0349 0.1 +BR 49 136 -1.3132413823 4.29282959482 0.0349 0.1 +BR 49 138 0.852323239846 8.31832913318 0.0349 0.1 +BR 49 145 -0.425206869031 7.30184295026 0.0349 0.1 +BR 49 146 -2.81219083584 7.1999192447 0.0349 0.1 +BR 50 211 0.835145641247 9.39883397423 0.0349 0.1 +BR 50 129 -2.29739481979 4.84591520301 0.0349 0.1 +BR 50 132 -1.69740609702 1.88108819843 0.0349 0.1 +BR 50 136 -1.41813064673 4.22649063304 0.0349 0.1 +BR 50 138 1.00506413746 7.80362591487 0.0349 0.1 +BR 50 145 -0.455209251406 6.50387636211 0.0349 0.1 +BR 50 146 -2.73782469254 7.87670364149 0.0349 0.1 +BR 51 211 0.702762892786 8.87516504348 0.0349 0.1 +BR 51 129 -2.47535256165 5.23986867221 0.0349 0.1 +BR 51 132 -2.30239380502 2.18778407787 0.0349 0.1 +BR 51 133 -0.721507862233 9.98554796724 0.0349 0.1 +BR 51 136 -1.81775933595 4.26750754492 0.0349 0.1 +BR 51 138 0.972975632993 7.33609223589 0.0349 0.1 +BR 51 145 -0.655168730304 5.97764397657 0.0349 0.1 +BR 51 146 -2.9008185124 8.52711403391 0.0349 0.1 +BR 52 211 1.02160299745 8.39990010785 0.0349 0.1 +BR 52 129 -2.38078665638 5.89398424924 0.0349 0.1 +BR 52 132 -2.32150260829 2.7642509002 0.0349 0.1 +BR 52 133 -0.593338340282 9.09248006087 0.0349 0.1 +BR 52 136 -1.70907208704 4.52511614196 0.0349 0.1 +BR 52 138 1.31486182491 7.00604753829 0.0349 0.1 +BR 52 145 -0.623641599141 5.23461904841 0.0349 0.1 +BR 52 146 -2.72475360758 9.52193132649 0.0349 0.1 +BR 53 211 1.31559744632 8.11139198603 0.0349 0.1 +BR 53 214 0.237146993035 9.72602918909 0.0349 0.1 +BR 53 129 -2.29755087534 6.31115337961 0.0349 0.1 +BR 53 132 -2.35974179857 3.19960631018 0.0349 0.1 +BR 53 133 -0.394598671292 8.38412703631 0.0349 0.1 +BR 53 136 -1.80773002423 4.40929640292 0.0349 0.1 +BR 53 138 1.54926467893 6.88525427648 0.0349 0.1 +BR 53 145 -0.474177899207 4.53003713639 0.0349 0.1 +BR 54 211 0.984732803445 7.42786510356 0.0349 0.1 +BR 54 214 -0.11180491587 9.02509825398 0.0349 0.1 +BR 54 129 -2.74232381524 6.87541946089 0.0349 0.1 +BR 54 132 -2.90610674415 3.90683353197 0.0349 0.1 +BR 54 133 -0.946269617578 7.87816492515 0.0349 0.1 +BR 54 136 -2.26079857458 5.05238790003 0.0349 0.1 +BR 54 138 1.23881048754 6.66133430521 0.0349 0.1 +BR 54 145 -0.947227352968 3.83527710037 0.0349 0.1 +BR 55 211 0.898485222553 7.20091899213 0.0349 0.1 +BR 55 214 -0.331475822555 8.15612623956 0.0349 0.1 +BR 55 129 -2.94211283394 7.71377937916 0.0349 0.1 +BR 55 132 -2.96263902277 4.72504746653 0.0349 0.1 +BR 55 133 -1.19619007418 7.57872766791 0.0349 0.1 +BR 55 136 -2.50797826148 5.6165181032 0.0349 0.1 +BR 55 138 1.15570916703 6.30471479324 0.0349 0.1 +BR 55 145 -1.34211765445 3.61160861965 0.0349 0.1 +BR 56 211 1.15825542961 6.7888627078 0.0349 0.1 +BR 56 214 -0.219470357269 7.60748335035 0.0349 0.1 +BR 56 129 -2.8680390372 8.7065246753 0.0349 0.1 +BR 56 132 -2.98769597419 5.64491656469 0.0349 0.1 +BR 56 133 -1.18165204481 7.28168467592 0.0349 0.1 +BR 56 136 -2.50662065879 6.33607011113 0.0349 0.1 +BR 56 138 1.38983018292 6.2829567225 0.0349 0.1 +BR 56 145 -1.48728342633 3.55073682465 0.0349 0.1 +BR 57 211 1.31121936211 6.4499882023 0.0349 0.1 +BR 57 214 -0.23903049767 6.70522585497 0.0349 0.1 +BR 57 129 -2.9344494194 9.42282481723 0.0349 0.1 +BR 57 132 -2.92810125756 6.33396803893 0.0349 0.1 +BR 57 133 -1.20821854839 7.04533813918 0.0349 0.1 +BR 57 136 -2.58342247807 6.79285980736 0.0349 0.1 +BR 57 138 1.60454813339 6.18478768582 0.0349 0.1 +BR 57 141 0.855478263576 9.81268967389 0.0349 0.1 +BR 57 145 -1.64743462419 3.55197042884 0.0349 0.1 +BR 58 211 1.3697376327 6.28814896116 0.0349 0.1 +BR 58 214 -0.240573643222 6.00770973914 0.0349 0.1 +BR 58 132 -3.04782555269 7.20609442047 0.0349 0.1 +BR 58 133 -1.38654094358 6.89172239496 0.0349 0.1 +BR 58 136 -2.71931807774 7.43484636746 0.0349 0.1 +BR 58 138 1.67863856935 6.1507384544 0.0349 0.1 +BR 58 141 0.976143688736 9.46697440494 0.0349 0.1 +BR 58 145 -1.83870327644 3.65503744995 0.0349 0.1 +BR 59 211 1.48699429679 6.08115940992 0.0349 0.1 +BR 59 214 -0.415570760211 5.13438758848 0.0349 0.1 +BR 59 132 -3.02827764182 7.96286566655 0.0349 0.1 +BR 59 133 -1.53145859942 6.77610181098 0.0349 0.1 +BR 59 136 -2.74531072749 8.32929527587 0.0349 0.1 +BR 59 138 1.72057247223 6.26065897831 0.0349 0.1 +BR 59 141 1.03071332211 8.88769595496 0.0349 0.1 +BR 59 145 -2.08753542039 4.10672697789 0.0349 0.1 +BR 60 211 1.59739021193 6.15588728463 0.0349 0.1 +BR 60 214 -0.511168179873 4.33010644987 0.0349 0.1 +BR 60 132 -3.09344355595 8.61019942961 0.0349 0.1 +BR 60 133 -1.7654808189 6.71410728498 0.0349 0.1 +BR 60 136 -2.77389441808 9.0499972807 0.0349 0.1 +BR 60 138 1.8820286755 6.37121288506 0.0349 0.1 +BR 60 141 1.07152819217 8.35085378616 0.0349 0.1 +BR 60 145 -2.26379347264 4.5992746157 0.0349 0.1 +BR 61 211 1.65733486617 6.06862058524 0.0349 0.1 +BR 61 214 -0.592403718182 3.79555195012 0.0349 0.1 +BR 61 116 -1.11564212635 9.76016152567 0.0349 0.1 +BR 61 132 -3.08611036748 9.40173514366 0.0349 0.1 +BR 61 133 -1.83574223151 6.77780820625 0.0349 0.1 +BR 61 136 -2.81345972719 9.87046005411 0.0349 0.1 +BR 61 138 2.01635034865 6.58454580038 0.0349 0.1 +BR 61 141 1.05738477029 7.90059102737 0.0349 0.1 +BR 61 145 -2.46764482041 5.23886327349 0.0349 0.1 +BR 62 211 2.19981530481 6.55940364295 0.0349 0.1 +BR 62 214 -0.330629210924 2.89895419258 0.0349 0.1 +BR 62 116 -0.712532191251 9.34490097865 0.0349 0.1 +BR 62 133 -1.50791588512 7.01329261316 0.0349 0.1 +BR 62 138 2.42398978932 7.32781104937 0.0349 0.1 +BR 62 141 1.56493435286 7.93355916389 0.0349 0.1 +BR 62 145 -2.2278542462 5.49873142521 0.0349 0.1 +BR 63 211 2.32173832925 7.0194270853 0.0349 0.1 +BR 63 214 -0.386580845638 2.43330741085 0.0349 0.1 +BR 63 116 -0.729079668132 8.53447098505 0.0349 0.1 +BR 63 133 -1.57833951194 6.88281488712 0.0349 0.1 +BR 63 138 2.57564520733 7.78656203108 0.0349 0.1 +BR 63 141 1.81747758419 8.07098244115 0.0349 0.1 +BR 63 145 -2.23878875365 5.92539391826 0.0349 0.1 +BR 64 211 2.64430253079 7.83864538862 0.0349 0.1 +BR 64 214 -0.0994208312564 1.44204544545 0.0349 0.1 +BR 64 116 -0.55500504894 7.72325595942 0.0349 0.1 +BR 64 133 -1.4536518654 6.65517115162 0.0349 0.1 +BR 64 138 2.8401061616 8.57033338472 0.0349 0.1 +BR 64 141 2.1957214779 8.46409667869 0.0349 0.1 +BR 64 145 -2.02665785317 6.30435908086 0.0349 0.1 +BR 65 211 2.77723756274 8.49481575652 0.0349 0.1 +BR 65 214 -0.222004642925 0.769067027532 0.0349 0.1 +BR 65 116 -0.476406751958 6.944593788 0.0349 0.1 +BR 65 133 -1.5055349911 6.5435294725 0.0349 0.1 +BR 65 138 2.89207363594 9.52197266067 0.0349 0.1 +BR 65 139 0.690529531955 9.88828227669 0.0349 0.1 +BR 65 141 2.20677044598 8.87273441824 0.0349 0.1 +BR 65 145 -2.16442898949 6.62783981315 0.0349 0.1 +BR 66 211 2.92708006505 9.25699933973 0.0349 0.1 +BR 66 214 -2.70729617971 0.089927286145 0.0349 0.1 +BR 66 116 -0.437916662456 6.37909317223 0.0349 0.1 +BR 66 133 -1.53242050643 6.44340702808 0.0349 0.1 +BR 66 139 0.911600005332 9.29148527033 0.0349 0.1 +BR 66 141 2.43759073241 9.53382144492 0.0349 0.1 +BR 66 145 -2.09539296277 7.1168381771 0.0349 0.1 +BR 67 214 -3.07507169223 0.880638010099 0.0349 0.1 +BR 67 116 -0.364201036385 5.70130017619 0.0349 0.1 +BR 67 133 -1.5796828657 6.40788347591 0.0349 0.1 +BR 67 139 1.09811562801 8.94633439107 0.0349 0.1 +BR 67 145 -2.09672822137 7.34322150374 0.0349 0.1 +BR 68 214 3.25749632058 1.71825216935 0.0349 0.1 +BR 68 116 -0.250579061157 4.98724463734 0.0349 0.1 +BR 68 133 -1.49770874602 6.29144792573 0.0349 0.1 +BR 68 139 1.35862501974 8.66611776892 0.0349 0.1 +BR 68 145 -2.0380754896 7.71319884521 0.0349 0.1 +BR 69 214 3.36924028033 2.37881667021 0.0349 0.1 +BR 69 114 0.965203878623 9.96554579176 0.0349 0.1 +BR 69 116 -0.177465967368 4.16576217975 0.0349 0.1 +BR 69 133 -1.58615525394 6.17247552536 0.0349 0.1 +BR 69 139 1.6044244742 8.66323549571 0.0349 0.1 +BR 69 145 -2.05356692956 8.23087471484 0.0349 0.1 +BR 70 214 3.26447815983 3.50520447752 0.0349 0.1 +BR 70 114 1.04557241854 9.48035082217 0.0349 0.1 +BR 70 116 -0.174044759473 3.30434496879 0.0349 0.1 +BR 70 133 -1.71878170033 6.12453562279 0.0349 0.1 +BR 70 139 1.6988840667 8.90097770891 0.0349 0.1 +BR 70 145 -2.09118659226 8.57946955435 0.0349 0.1 +BR 71 214 3.17116978801 4.13326733054 0.0349 0.1 +BR 71 114 0.971598066455 8.94056084471 0.0349 0.1 +BR 71 116 -0.442084127811 2.65553820347 0.0349 0.1 +BR 71 131 1.51291549191 9.93983683031 0.0349 0.1 +BR 71 133 -1.92850538371 6.61503232087 0.0349 0.1 +BR 71 139 1.62178936432 8.9275013656 0.0349 0.1 +BR 71 145 -2.26077765156 8.81810560523 0.0349 0.1 +BR 72 214 3.3483118075 5.07146259456 0.0349 0.1 +BR 72 114 1.25024033184 8.65447650965 0.0349 0.1 +BR 72 116 -0.29484144987 1.7807736885 0.0349 0.1 +BR 72 133 -1.85932117232 6.54581267011 0.0349 0.1 +BR 72 139 1.90675845297 9.03288373875 0.0349 0.1 +BR 72 145 -2.11133037157 9.64278665008 0.0349 0.1 +BR 73 214 3.42031481088 5.68604714096 0.0349 0.1 +BR 73 114 1.49448393979 8.76928636352 0.0349 0.1 +BR 73 116 -0.311282829508 0.986563086856 0.0349 0.1 +BR 73 133 -1.81885055957 6.86219220059 0.0349 0.1 +BR 73 139 2.19840475652 9.39629377331 0.0349 0.1 +BR 73 145 -2.08434312084 10.019522072 0.0349 0.1 +BR 74 214 3.53214111622 6.47416976793 0.0349 0.1 +BR 74 219 1.125245923 9.70485712932 0.0349 0.1 +BR 74 114 1.78271170313 8.74159061945 0.0349 0.1 +BR 74 116 -0.496879055986 0.212551914458 0.0349 0.1 +BR 74 133 -1.69837838721 6.62504018219 0.0349 0.1 +BR 75 214 3.80548992485 6.97643942878 0.0349 0.1 +BR 75 219 1.44648023525 9.61002619118 0.0349 0.1 +BR 75 114 2.17495579726 9.36616344671 0.0349 0.1 +BR 75 116 3.15139437828 0.640676998818 0.0349 0.1 +BR 75 133 -1.47800625615 6.55213863832 0.0349 0.1 +BR 76 214 3.64481450915 7.68409243587 0.0349 0.1 +BR 76 219 1.55416548399 9.58187707528 0.0349 0.1 +BR 76 114 2.22336594529 9.69979828032 0.0349 0.1 +BR 76 116 3.12835380769 1.52693080051 0.0349 0.1 +BR 76 133 -1.74190482626 6.46408688569 0.0349 0.1 +BR 77 214 3.78271717671 8.33092440218 0.0349 0.1 +BR 77 219 1.67410135616 9.71669336385 0.0349 0.1 +BR 77 116 3.18266207552 2.40071229786 0.0349 0.1 +BR 77 133 -1.70540467651 6.66269006969 0.0349 0.1 +BR 78 214 3.42981856843 8.9840154373 0.0349 0.1 +BR 78 219 1.55521791221 9.65971453808 0.0349 0.1 +BR 78 116 3.08079550878 3.13311875201 0.0349 0.1 +BR 78 133 -1.9629815922 7.01715815731 0.0349 0.1 +BR 79 214 3.64301348008 9.64604876625 0.0349 0.1 +BR 79 219 1.84313214295 9.8736833446 0.0349 0.1 +BR 79 116 3.23976285086 3.82731244384 0.0349 0.1 +BR 79 133 -1.92693348218 7.07982856181 0.0349 0.1 +BR 80 219 1.82267971334 10.0181195912 0.0349 0.1 +BR 80 116 3.0932606444 4.56053898399 0.0349 0.1 +BR 80 133 -2.16850666747 7.82134702265 0.0349 0.1 +BR 81 116 3.10963701499 5.36017902545 0.0349 0.1 +BR 81 133 4.14615729787 7.91335159223 0.0349 0.1 +BR 82 116 3.02427035132 6.3165782418 0.0349 0.1 +BR 82 118 0.386637063745 9.30518727853 0.0349 0.1 +BR 82 133 3.96654040143 8.46139182575 0.0349 0.1 +BR 83 116 3.17577034597 6.95212398542 0.0349 0.1 +BR 83 118 0.54486099103 8.70615519965 0.0349 0.1 +BR 83 133 3.97631817437 9.0707544279 0.0349 0.1 +BR 84 116 3.08672783226 7.73113294416 0.0349 0.1 +BR 84 118 0.50758642684 7.92961801618 0.0349 0.1 +BR 84 133 3.83740508413 9.53430891219 0.0349 0.1 +BR 85 116 3.2851042494 8.61085233676 0.0349 0.1 +BR 85 118 0.800702749373 7.297783814 0.0349 0.1 +BR 86 116 3.46202134229 9.40431553868 0.0349 0.1 +BR 86 118 1.02219323662 6.98093561867 0.0349 0.1 +BR 86 125 0.894103907508 9.78156008486 0.0349 0.1 +BR 87 118 1.17775566595 6.57332518044 0.0349 0.1 +BR 87 125 0.953764386986 9.11980772782 0.0349 0.1 +BR 88 118 1.23977118944 6.39248070013 0.0349 0.1 +BR 88 125 0.988718137509 8.638143389 0.0349 0.1 +BR 89 118 1.32805006899 6.07271098982 0.0349 0.1 +BR 89 125 1.03116673027 8.19879638653 0.0349 0.1 +BR 90 118 1.27747987129 5.7243455139 0.0349 0.1 +BR 90 125 0.89663965971 7.9292423614 0.0349 0.1 +BR 91 118 1.23616540573 5.42052023942 0.0349 0.1 +BR 91 125 0.901333443965 7.46153346919 0.0349 0.1 +BR 92 118 1.27418747645 5.10370611594 0.0349 0.1 +BR 92 125 0.814247104386 6.78352263469 0.0349 0.1 +BR 93 118 1.52925418993 5.08780303591 0.0349 0.1 +BR 93 122 0.0350305409562 9.72894928235 0.0349 0.1 +BR 93 125 0.990434800962 6.40937952378 0.0349 0.1 +BR 94 118 1.57085863582 5.16163930514 0.0349 0.1 +BR 94 122 -0.0746183892492 8.89244084523 0.0349 0.1 +BR 94 125 0.977283745835 5.68611237558 0.0349 0.1 diff --git a/matlab/gtsam_examples/PlanarSLAMExample_graph.m b/matlab/gtsam_examples/PlanarSLAMExample_graph.m new file mode 100644 index 000000000..c2f821d39 --- /dev/null +++ b/matlab/gtsam_examples/PlanarSLAMExample_graph.m @@ -0,0 +1,49 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 +% +% @brief Read graph from file and perform GraphSLAM +% @author Frank Dellaert +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear + +import gtsam.* + +%% Find data file +datafile = '/Users/dellaert/borg/gtsam/examples/Data/example.graph'; + +%% Initialize graph, initial estimate, and odometry noise +model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 2*pi/180]); +[graph,initial] = load2D(datafile, model); + +%% Add a Gaussian prior on pose x_1 +priorMean = initial.at(0); +priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); +graph.add(PriorFactorPose2(0, priorMean, priorNoise)); % add directly to graph + +%% Plot Initial Estimate +cla +plot2DTrajectory(initial, 'g-*'); axis equal + +%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd +optimizer = LevenbergMarquardtOptimizer(graph, initial); +tic +result = optimizer.optimizeSafely; +toc +hold on; plot2DTrajectory(result, 'b-*'); + +%% Plot Covariance Ellipses +marginals = Marginals(graph, result); +P={}; +for i=0:94 + pose_i = result.at(i); + Pi=marginals.marginalCovariance(i); + plotPose2(pose_i,'b',Pi) +end +view(2) +axis tight; axis equal; From 4106afdaa0fdbf4ca26b9984df68935a15387a2d Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 25 Aug 2012 14:26:02 +0000 Subject: [PATCH 807/914] Better graphics, with points --- .../gtsam_examples/PlanarSLAMExample_graph.m | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/matlab/gtsam_examples/PlanarSLAMExample_graph.m b/matlab/gtsam_examples/PlanarSLAMExample_graph.m index c2f821d39..a65ea5980 100644 --- a/matlab/gtsam_examples/PlanarSLAMExample_graph.m +++ b/matlab/gtsam_examples/PlanarSLAMExample_graph.m @@ -21,29 +21,27 @@ datafile = '/Users/dellaert/borg/gtsam/examples/Data/example.graph'; model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 2*pi/180]); [graph,initial] = load2D(datafile, model); -%% Add a Gaussian prior on pose x_1 -priorMean = initial.at(0); -priorNoise = noiseModel.Diagonal.Sigmas([0.01; 0.01; 0.01]); -graph.add(PriorFactorPose2(0, priorMean, priorNoise)); % add directly to graph +%% Add a Gaussian prior on a pose in the middle +priorMean = initial.at(40); +priorNoise = noiseModel.Diagonal.Sigmas([0.1; 0.1; 2*pi/180]); +graph.add(PriorFactorPose2(40, priorMean, priorNoise)); % add directly to graph %% Plot Initial Estimate cla -plot2DTrajectory(initial, 'g-*'); axis equal +plot2DTrajectory(initial, 'r-'); axis equal %% Optimize using Levenberg-Marquardt optimization with an ordering from colamd optimizer = LevenbergMarquardtOptimizer(graph, initial); tic result = optimizer.optimizeSafely; toc -hold on; plot2DTrajectory(result, 'b-*'); %% Plot Covariance Ellipses +cla;hold on marginals = Marginals(graph, result); -P={}; -for i=0:94 - pose_i = result.at(i); - Pi=marginals.marginalCovariance(i); - plotPose2(pose_i,'b',Pi) -end +plot2DTrajectory(result, 'g', marginals); +plot2DPoints(result, 'b', marginals); +axis tight +axis equal view(2) -axis tight; axis equal; + From f9c3af7e3d2029625eb7124dca73f08df60cc7fd Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sun, 26 Aug 2012 04:16:47 +0000 Subject: [PATCH 808/914] Fixed bug in key assignment --- gtsam_unstable/nonlinear/LinearContainerFactor.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp index 42dfe7819..ea324704b 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -52,6 +52,9 @@ LinearContainerFactor::LinearContainerFactor( const GaussianFactor::shared_ptr& factor) : factor_(factor->clone()) { + // Extract keys stashed in linear factor + BOOST_FOREACH(const Index& idx, factor_->keys()) + keys_.push_back(idx); } /* ************************************************************************* */ From ea70673b3655be800bd4d0e6dd64b9f2fa97b81a Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Sun, 26 Aug 2012 15:46:19 +0000 Subject: [PATCH 809/914] Added overload constructor comments to matlab files --- wrap/Class.cpp | 669 +++++++++++++++++++++++--------------------- wrap/Class.h | 2 + wrap/FileWriter.cpp | 4 - 3 files changed, 347 insertions(+), 328 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index c1fac2c0b..bfc39132f 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -1,325 +1,346 @@ -/* ---------------------------------------------------------------------------- - - * 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 Class.cpp - * @author Frank Dellaert - * @author Andrew Melim +/* ---------------------------------------------------------------------------- + + * 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 Class.cpp + * @author Frank Dellaert + * @author Andrew Melim * @author Richard Roberts - **/ - -#include -#include -#include -//#include // on Linux GCC: fails with error regarding needing C++0x std flags -//#include // same failure as above -#include // works on Linux GCC - -#include -#include - -#include "Class.h" -#include "utilities.h" -#include "Argument.h" - -using namespace std; -using namespace wrap; - -/* ************************************************************************* */ -void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, - const TypeAttributesTable& typeAttributes, - FileWriter& wrapperFile, vector& functionNames) const { - - // Create namespace folders - createNamespaceStructure(namespaces, toolboxPath); - - // open destination classFile - string classFile = toolboxPath; - if(!namespaces.empty()) - classFile += "/+" + wrap::qualifiedName("/+", namespaces); - classFile += "/" + name + ".m"; - FileWriter proxyFile(classFile, verbose_, "%"); - - // get the name of actual matlab object - const string matlabQualName = qualifiedName("."), matlabUniqueName = qualifiedName(), cppName = qualifiedName("::"); - const string matlabBaseName = wrap::qualifiedName(".", qualifiedParent); - const string cppBaseName = wrap::qualifiedName("::", qualifiedParent); - - // emit class proxy code - // we want our class to inherit the handle class for memory purposes - const string parent = qualifiedParent.empty() ? "handle" : matlabBaseName; - proxyFile.oss << "classdef " << name << " < " << parent << endl; - proxyFile.oss << " properties" << endl; - proxyFile.oss << " ptr_" << matlabUniqueName << " = 0" << endl; - proxyFile.oss << " end" << endl; - proxyFile.oss << " methods" << endl; - - // Constructor - proxyFile.oss << " function obj = " << name << "(varargin)" << endl; - // Special pointer constructors - one in MATLAB to create an object and - // assign a pointer returned from a C++ function. In turn this MATLAB - // constructor calls a special C++ function that just adds the object to - // its collector. This allows wrapped functions to return objects in - // other wrap modules - to add these to their collectors the pointer is - // passed from one C++ module into matlab then back into the other C++ - // module. - pointer_constructor_fragments(proxyFile, wrapperFile, wrapperName, functionNames); - wrapperFile.oss << "\n"; - // Regular constructors - BOOST_FOREACH(ArgumentList a, constructor.args_list) - { - const int id = (int)functionNames.size(); - constructor.proxy_fragment(proxyFile, wrapperName, !qualifiedParent.empty(), id, a); - const string wrapFunctionName = constructor.wrapper_fragment(wrapperFile, - cppName, matlabUniqueName, cppBaseName, id, a); - wrapperFile.oss << "\n"; - functionNames.push_back(wrapFunctionName); - } - proxyFile.oss << " else\n"; - proxyFile.oss << " error('Arguments do not match any overload of " << matlabQualName << " constructor');" << endl; - proxyFile.oss << " end\n"; - if(!qualifiedParent.empty()) - proxyFile.oss << " obj = obj@" << matlabBaseName << "(uint64(" << ptr_constructor_key << "), base_ptr);\n"; - proxyFile.oss << " obj.ptr_" << matlabUniqueName << " = my_ptr;\n"; - proxyFile.oss << " end\n\n"; - - // Deconstructor - { - const int id = (int)functionNames.size(); - deconstructor.proxy_fragment(proxyFile, wrapperName, matlabUniqueName, id); - proxyFile.oss << "\n"; - const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabUniqueName, id); - wrapperFile.oss << "\n"; - functionNames.push_back(functionName); - } - proxyFile.oss << " function display(obj), obj.print(''); end\n\n"; - proxyFile.oss << " function disp(obj), obj.display; end\n\n"; - - // Methods - BOOST_FOREACH(const Methods::value_type& name_m, methods) { - const Method& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, typeAttributes, functionNames); - proxyFile.oss << "\n"; - wrapperFile.oss << "\n"; - } - - proxyFile.oss << " end\n"; - proxyFile.oss << "\n"; - proxyFile.oss << " methods(Static = true)\n"; - - // Static methods - BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { - const StaticMethod& m = name_m.second; - m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, typeAttributes, functionNames); - proxyFile.oss << "\n"; - wrapperFile.oss << "\n"; - } - - proxyFile.oss << " end" << endl; - proxyFile.oss << "end" << endl; - - // Close file - proxyFile.emit(true); -} - -/* ************************************************************************* */ -string Class::qualifiedName(const string& delim) const { - return ::wrap::qualifiedName(delim, namespaces, name); -} - -/* ************************************************************************* */ -void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& wrapperName, vector& functionNames) const { - - const string matlabUniqueName = qualifiedName(), cppName = qualifiedName("::"); - const string baseCppName = wrap::qualifiedName("::", qualifiedParent); - - const int collectorInsertId = (int)functionNames.size(); - const string collectorInsertFunctionName = matlabUniqueName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(collectorInsertId); - functionNames.push_back(collectorInsertFunctionName); - - int upcastFromVoidId; - string upcastFromVoidFunctionName; - if(isVirtual) { - upcastFromVoidId = (int)functionNames.size(); - upcastFromVoidFunctionName = matlabUniqueName + "_upcastFromVoid_" + boost::lexical_cast(upcastFromVoidId); - functionNames.push_back(upcastFromVoidFunctionName); - } - - // MATLAB constructor that assigns pointer to matlab object then calls c++ - // function to add the object to the collector. - if(isVirtual) { - proxyFile.oss << " if (nargin == 2 || (nargin == 3 && strcmp(varargin{3}, 'void')))"; - } else { - proxyFile.oss << " if nargin == 2"; - } - proxyFile.oss << " && isa(varargin{1}, 'uint64') && varargin{1} == uint64(" << ptr_constructor_key << ")\n"; - if(isVirtual) { - proxyFile.oss << " if nargin == 2\n"; - proxyFile.oss << " my_ptr = varargin{2};\n"; - proxyFile.oss << " else\n"; - proxyFile.oss << " my_ptr = " << wrapperName << "(" << upcastFromVoidId << ", varargin{2});\n"; - proxyFile.oss << " end\n"; - } else { - proxyFile.oss << " my_ptr = varargin{2};\n"; - } - if(qualifiedParent.empty()) // If this class has a base class, we'll get a base class pointer back - proxyFile.oss << " "; - else - proxyFile.oss << " base_ptr = "; - proxyFile.oss << wrapperName << "(" << collectorInsertId << ", my_ptr);\n"; // Call collector insert and get base class ptr - - // C++ function to add pointer from MATLAB to collector. The pointer always - // comes from a C++ return value; this mechanism allows the object to be added - // to a collector in a different wrap module. If this class has a base class, - // a new pointer to the base class is allocated and returned. - wrapperFile.oss << "void " << collectorInsertFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; - wrapperFile.oss << "{\n"; - wrapperFile.oss << " mexAtExit(&_deleteAllObjects);\n"; - // Typedef boost::shared_ptr - wrapperFile.oss << " typedef boost::shared_ptr<" << cppName << "> Shared;\n"; - wrapperFile.oss << "\n"; - // Get self pointer passed in - wrapperFile.oss << " Shared *self = *reinterpret_cast (mxGetData(in[0]));\n"; - // Add to collector - wrapperFile.oss << " collector_" << matlabUniqueName << ".insert(self);\n"; - // If we have a base class, return the base class pointer (MATLAB will call the base class collectorInsertAndMakeBase to add this to the collector and recurse the heirarchy) - if(!qualifiedParent.empty()) { - wrapperFile.oss << "\n"; - wrapperFile.oss << " typedef boost::shared_ptr<" << baseCppName << "> SharedBase;\n"; - wrapperFile.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);\n"; - wrapperFile.oss << " *reinterpret_cast(mxGetData(out[0])) = new SharedBase(*self);\n"; - } - wrapperFile.oss << "}\n"; - - // If this is a virtual function, C++ function to dynamic upcast it from a - // shared_ptr. This mechanism allows automatic dynamic creation of the - // real underlying derived-most class when a C++ method returns a virtual - // base class. - if(isVirtual) - wrapperFile.oss << - "\n" - "void " << upcastFromVoidFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[]) {\n" - " mexAtExit(&_deleteAllObjects);\n" - " typedef boost::shared_ptr<" << cppName << "> Shared;\n" - " boost::shared_ptr *asVoid = *reinterpret_cast**> (mxGetData(in[0]));\n" - " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);\n" - " Shared *self = new Shared(boost::static_pointer_cast<" << cppName << ">(*asVoid));\n" - " *reinterpret_cast(mxGetData(out[0])) = self;\n" - "}\n"; -} - -/* ************************************************************************* */ -vector expandArgumentListsTemplate(const vector& argLists, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { - vector result; - BOOST_FOREACH(const ArgumentList& argList, argLists) { - ArgumentList instArgList; - BOOST_FOREACH(const Argument& arg, argList) { - Argument instArg = arg; - if(arg.type == templateArg) { - instArg.namespaces.assign(instName.begin(), instName.end()-1); - instArg.type = instName.back(); - } else if(arg.type == "This") { - instArg.namespaces.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); - instArg.type = expandedClassName; - } - instArgList.push_back(instArg); - } - result.push_back(instArgList); - } - return result; -} - -/* ************************************************************************* */ -template -map expandMethodTemplate(const map& methods, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { - map result; - typedef pair Name_Method; - BOOST_FOREACH(const Name_Method& name_method, methods) { - const METHOD& method = name_method.second; - METHOD instMethod = method; - instMethod.argLists = expandArgumentListsTemplate(method.argLists, templateArg, instName, expandedClassNamespace, expandedClassName); - instMethod.returnVals.clear(); - BOOST_FOREACH(const ReturnValue& retVal, method.returnVals) { - ReturnValue instRetVal = retVal; - if(retVal.type1 == templateArg) { - instRetVal.namespaces1.assign(instName.begin(), instName.end()-1); - instRetVal.type1 = instName.back(); - } else if(retVal.type1 == "This") { - instRetVal.namespaces1.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); - instRetVal.type1 = expandedClassName; - } - if(retVal.type2 == templateArg) { - instRetVal.namespaces2.assign(instName.begin(), instName.end()-1); - instRetVal.type2 = instName.back(); - } else if(retVal.type1 == "This") { - instRetVal.namespaces2.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); - instRetVal.type2 = expandedClassName; - } - instMethod.returnVals.push_back(instRetVal); - } - result.insert(make_pair(name_method.first, instMethod)); - } - return result; -} - -/* ************************************************************************* */ -Class expandClassTemplate(const Class& cls, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { - Class inst; - inst.name = cls.name; - inst.templateArgs = cls.templateArgs; - inst.typedefName = cls.typedefName; - inst.isVirtual = cls.isVirtual; - inst.qualifiedParent = cls.qualifiedParent; - inst.methods = expandMethodTemplate(cls.methods, templateArg, instName, expandedClassNamespace, expandedClassName); - inst.static_methods = expandMethodTemplate(cls.static_methods, templateArg, instName, expandedClassNamespace, expandedClassName); - inst.namespaces = cls.namespaces; - inst.constructor = cls.constructor; - inst.constructor.args_list = expandArgumentListsTemplate(cls.constructor.args_list, templateArg, instName, expandedClassNamespace, expandedClassName); - inst.constructor.name = inst.name; - inst.deconstructor = cls.deconstructor; - inst.deconstructor.name = inst.name; - inst.verbose_ = cls.verbose_; - return inst; -} - -/* ************************************************************************* */ -vector Class::expandTemplate(const string& templateArg, const vector >& instantiations) const { - vector result; - BOOST_FOREACH(const vector& instName, instantiations) { - const string expandedName = name + instName.back(); - Class inst = expandClassTemplate(*this, templateArg, instName, this->namespaces, expandedName); - inst.name = expandedName; - inst.templateArgs.clear(); - inst.typedefName = qualifiedName("::") + "<" + wrap::qualifiedName("::", instName) + ">"; - result.push_back(inst); - } - return result; -} - -/* ************************************************************************* */ -Class Class::expandTemplate(const string& templateArg, const vector& instantiation, const std::vector& expandedClassNamespace, const string& expandedClassName) const { - return expandClassTemplate(*this, templateArg, instantiation, expandedClassNamespace, expandedClassName); -} - -/* ************************************************************************* */ -std::string Class::getTypedef() const { - string result; - BOOST_FOREACH(const string& namesp, namespaces) { - result += ("namespace " + namesp + " { "); - } - result += ("typedef " + typedefName + " " + name + ";"); - for (size_t i = 0; i +#include +#include +//#include // on Linux GCC: fails with error regarding needing C++0x std flags +//#include // same failure as above +#include // works on Linux GCC + +#include +#include + +#include "Class.h" +#include "utilities.h" +#include "Argument.h" + +using namespace std; +using namespace wrap; + +/* ************************************************************************* */ +void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, + const TypeAttributesTable& typeAttributes, + FileWriter& wrapperFile, vector& functionNames) const { + + // Create namespace folders + createNamespaceStructure(namespaces, toolboxPath); + + // open destination classFile + string classFile = toolboxPath; + if(!namespaces.empty()) + classFile += "/+" + wrap::qualifiedName("/+", namespaces); + classFile += "/" + name + ".m"; + FileWriter proxyFile(classFile, verbose_, "%"); + + // get the name of actual matlab object + const string matlabQualName = qualifiedName("."), matlabUniqueName = qualifiedName(), cppName = qualifiedName("::"); + const string matlabBaseName = wrap::qualifiedName(".", qualifiedParent); + const string cppBaseName = wrap::qualifiedName("::", qualifiedParent); + + // emit class proxy code + // we want our class to inherit the handle class for memory purposes + const string parent = qualifiedParent.empty() ? "handle" : matlabBaseName; + comment_fragment(proxyFile); + proxyFile.oss << "classdef " << name << " < " << parent << endl; + proxyFile.oss << " properties" << endl; + proxyFile.oss << " ptr_" << matlabUniqueName << " = 0" << endl; + proxyFile.oss << " end" << endl; + proxyFile.oss << " methods" << endl; + + // Constructor + proxyFile.oss << " function obj = " << name << "(varargin)" << endl; + // Special pointer constructors - one in MATLAB to create an object and + // assign a pointer returned from a C++ function. In turn this MATLAB + // constructor calls a special C++ function that just adds the object to + // its collector. This allows wrapped functions to return objects in + // other wrap modules - to add these to their collectors the pointer is + // passed from one C++ module into matlab then back into the other C++ + // module. + pointer_constructor_fragments(proxyFile, wrapperFile, wrapperName, functionNames); + wrapperFile.oss << "\n"; + // Regular constructors + BOOST_FOREACH(ArgumentList a, constructor.args_list) + { + const int id = (int)functionNames.size(); + constructor.proxy_fragment(proxyFile, wrapperName, !qualifiedParent.empty(), id, a); + const string wrapFunctionName = constructor.wrapper_fragment(wrapperFile, + cppName, matlabUniqueName, cppBaseName, id, a); + wrapperFile.oss << "\n"; + functionNames.push_back(wrapFunctionName); + } + proxyFile.oss << " else\n"; + proxyFile.oss << " error('Arguments do not match any overload of " << matlabQualName << " constructor');" << endl; + proxyFile.oss << " end\n"; + if(!qualifiedParent.empty()) + proxyFile.oss << " obj = obj@" << matlabBaseName << "(uint64(" << ptr_constructor_key << "), base_ptr);\n"; + proxyFile.oss << " obj.ptr_" << matlabUniqueName << " = my_ptr;\n"; + proxyFile.oss << " end\n\n"; + + // Deconstructor + { + const int id = (int)functionNames.size(); + deconstructor.proxy_fragment(proxyFile, wrapperName, matlabUniqueName, id); + proxyFile.oss << "\n"; + const string functionName = deconstructor.wrapper_fragment(wrapperFile, cppName, matlabUniqueName, id); + wrapperFile.oss << "\n"; + functionNames.push_back(functionName); + } + proxyFile.oss << " function display(obj), obj.print(''); end\n\n"; + proxyFile.oss << " function disp(obj), obj.display; end\n\n"; + + // Methods + BOOST_FOREACH(const Methods::value_type& name_m, methods) { + const Method& m = name_m.second; + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, typeAttributes, functionNames); + proxyFile.oss << "\n"; + wrapperFile.oss << "\n"; + } + + proxyFile.oss << " end\n"; + proxyFile.oss << "\n"; + proxyFile.oss << " methods(Static = true)\n"; + + // Static methods + BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { + const StaticMethod& m = name_m.second; + m.proxy_wrapper_fragments(proxyFile, wrapperFile, cppName, matlabQualName, matlabUniqueName, wrapperName, typeAttributes, functionNames); + proxyFile.oss << "\n"; + wrapperFile.oss << "\n"; + } + + proxyFile.oss << " end" << endl; + proxyFile.oss << "end" << endl; + + // Close file + proxyFile.emit(true); +} + +/* ************************************************************************* */ +string Class::qualifiedName(const string& delim) const { + return ::wrap::qualifiedName(delim, namespaces, name); +} + +/* ************************************************************************* */ +void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, const string& wrapperName, vector& functionNames) const { + + const string matlabUniqueName = qualifiedName(), cppName = qualifiedName("::"); + const string baseCppName = wrap::qualifiedName("::", qualifiedParent); + + const int collectorInsertId = (int)functionNames.size(); + const string collectorInsertFunctionName = matlabUniqueName + "_collectorInsertAndMakeBase_" + boost::lexical_cast(collectorInsertId); + functionNames.push_back(collectorInsertFunctionName); + + int upcastFromVoidId; + string upcastFromVoidFunctionName; + if(isVirtual) { + upcastFromVoidId = (int)functionNames.size(); + upcastFromVoidFunctionName = matlabUniqueName + "_upcastFromVoid_" + boost::lexical_cast(upcastFromVoidId); + functionNames.push_back(upcastFromVoidFunctionName); + } + + // MATLAB constructor that assigns pointer to matlab object then calls c++ + // function to add the object to the collector. + if(isVirtual) { + proxyFile.oss << " if (nargin == 2 || (nargin == 3 && strcmp(varargin{3}, 'void')))"; + } else { + proxyFile.oss << " if nargin == 2"; + } + proxyFile.oss << " && isa(varargin{1}, 'uint64') && varargin{1} == uint64(" << ptr_constructor_key << ")\n"; + if(isVirtual) { + proxyFile.oss << " if nargin == 2\n"; + proxyFile.oss << " my_ptr = varargin{2};\n"; + proxyFile.oss << " else\n"; + proxyFile.oss << " my_ptr = " << wrapperName << "(" << upcastFromVoidId << ", varargin{2});\n"; + proxyFile.oss << " end\n"; + } else { + proxyFile.oss << " my_ptr = varargin{2};\n"; + } + if(qualifiedParent.empty()) // If this class has a base class, we'll get a base class pointer back + proxyFile.oss << " "; + else + proxyFile.oss << " base_ptr = "; + proxyFile.oss << wrapperName << "(" << collectorInsertId << ", my_ptr);\n"; // Call collector insert and get base class ptr + + // C++ function to add pointer from MATLAB to collector. The pointer always + // comes from a C++ return value; this mechanism allows the object to be added + // to a collector in a different wrap module. If this class has a base class, + // a new pointer to the base class is allocated and returned. + wrapperFile.oss << "void " << collectorInsertFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; + wrapperFile.oss << "{\n"; + wrapperFile.oss << " mexAtExit(&_deleteAllObjects);\n"; + // Typedef boost::shared_ptr + wrapperFile.oss << " typedef boost::shared_ptr<" << cppName << "> Shared;\n"; + wrapperFile.oss << "\n"; + // Get self pointer passed in + wrapperFile.oss << " Shared *self = *reinterpret_cast (mxGetData(in[0]));\n"; + // Add to collector + wrapperFile.oss << " collector_" << matlabUniqueName << ".insert(self);\n"; + // If we have a base class, return the base class pointer (MATLAB will call the base class collectorInsertAndMakeBase to add this to the collector and recurse the heirarchy) + if(!qualifiedParent.empty()) { + wrapperFile.oss << "\n"; + wrapperFile.oss << " typedef boost::shared_ptr<" << baseCppName << "> SharedBase;\n"; + wrapperFile.oss << " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);\n"; + wrapperFile.oss << " *reinterpret_cast(mxGetData(out[0])) = new SharedBase(*self);\n"; + } + wrapperFile.oss << "}\n"; + + // If this is a virtual function, C++ function to dynamic upcast it from a + // shared_ptr. This mechanism allows automatic dynamic creation of the + // real underlying derived-most class when a C++ method returns a virtual + // base class. + if(isVirtual) + wrapperFile.oss << + "\n" + "void " << upcastFromVoidFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[]) {\n" + " mexAtExit(&_deleteAllObjects);\n" + " typedef boost::shared_ptr<" << cppName << "> Shared;\n" + " boost::shared_ptr *asVoid = *reinterpret_cast**> (mxGetData(in[0]));\n" + " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL);\n" + " Shared *self = new Shared(boost::static_pointer_cast<" << cppName << ">(*asVoid));\n" + " *reinterpret_cast(mxGetData(out[0])) = self;\n" + "}\n"; +} + +/* ************************************************************************* */ +vector expandArgumentListsTemplate(const vector& argLists, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { + vector result; + BOOST_FOREACH(const ArgumentList& argList, argLists) { + ArgumentList instArgList; + BOOST_FOREACH(const Argument& arg, argList) { + Argument instArg = arg; + if(arg.type == templateArg) { + instArg.namespaces.assign(instName.begin(), instName.end()-1); + instArg.type = instName.back(); + } else if(arg.type == "This") { + instArg.namespaces.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); + instArg.type = expandedClassName; + } + instArgList.push_back(instArg); + } + result.push_back(instArgList); + } + return result; +} + +/* ************************************************************************* */ +template +map expandMethodTemplate(const map& methods, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { + map result; + typedef pair Name_Method; + BOOST_FOREACH(const Name_Method& name_method, methods) { + const METHOD& method = name_method.second; + METHOD instMethod = method; + instMethod.argLists = expandArgumentListsTemplate(method.argLists, templateArg, instName, expandedClassNamespace, expandedClassName); + instMethod.returnVals.clear(); + BOOST_FOREACH(const ReturnValue& retVal, method.returnVals) { + ReturnValue instRetVal = retVal; + if(retVal.type1 == templateArg) { + instRetVal.namespaces1.assign(instName.begin(), instName.end()-1); + instRetVal.type1 = instName.back(); + } else if(retVal.type1 == "This") { + instRetVal.namespaces1.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); + instRetVal.type1 = expandedClassName; + } + if(retVal.type2 == templateArg) { + instRetVal.namespaces2.assign(instName.begin(), instName.end()-1); + instRetVal.type2 = instName.back(); + } else if(retVal.type1 == "This") { + instRetVal.namespaces2.assign(expandedClassNamespace.begin(), expandedClassNamespace.end()); + instRetVal.type2 = expandedClassName; + } + instMethod.returnVals.push_back(instRetVal); + } + result.insert(make_pair(name_method.first, instMethod)); + } + return result; +} + +/* ************************************************************************* */ +Class expandClassTemplate(const Class& cls, const string& templateArg, const vector& instName, const std::vector& expandedClassNamespace, const string& expandedClassName) { + Class inst; + inst.name = cls.name; + inst.templateArgs = cls.templateArgs; + inst.typedefName = cls.typedefName; + inst.isVirtual = cls.isVirtual; + inst.qualifiedParent = cls.qualifiedParent; + inst.methods = expandMethodTemplate(cls.methods, templateArg, instName, expandedClassNamespace, expandedClassName); + inst.static_methods = expandMethodTemplate(cls.static_methods, templateArg, instName, expandedClassNamespace, expandedClassName); + inst.namespaces = cls.namespaces; + inst.constructor = cls.constructor; + inst.constructor.args_list = expandArgumentListsTemplate(cls.constructor.args_list, templateArg, instName, expandedClassNamespace, expandedClassName); + inst.constructor.name = inst.name; + inst.deconstructor = cls.deconstructor; + inst.deconstructor.name = inst.name; + inst.verbose_ = cls.verbose_; + return inst; +} + +/* ************************************************************************* */ +vector Class::expandTemplate(const string& templateArg, const vector >& instantiations) const { + vector result; + BOOST_FOREACH(const vector& instName, instantiations) { + const string expandedName = name + instName.back(); + Class inst = expandClassTemplate(*this, templateArg, instName, this->namespaces, expandedName); + inst.name = expandedName; + inst.templateArgs.clear(); + inst.typedefName = qualifiedName("::") + "<" + wrap::qualifiedName("::", instName) + ">"; + result.push_back(inst); + } + return result; +} + +/* ************************************************************************* */ +Class Class::expandTemplate(const string& templateArg, const vector& instantiation, const std::vector& expandedClassNamespace, const string& expandedClassName) const { + return expandClassTemplate(*this, templateArg, instantiation, expandedClassNamespace, expandedClassName); +} + +/* ************************************************************************* */ +std::string Class::getTypedef() const { + string result; + BOOST_FOREACH(const string& namesp, namespaces) { + result += ("namespace " + namesp + " { "); + } + result += ("typedef " + typedefName + " " + name + ";"); + for (size_t i = 0; i& functionNames) const; + void comment_fragment(FileWriter& proxyFile) const; }; } // \namespace wrap diff --git a/wrap/FileWriter.cpp b/wrap/FileWriter.cpp index 03339a7f0..515a5dbf3 100644 --- a/wrap/FileWriter.cpp +++ b/wrap/FileWriter.cpp @@ -38,10 +38,6 @@ void FileWriter::emit(bool add_header, bool force_overwrite) const { ofstream ofs(filename_.c_str(), ios::binary); // Binary to use LF line endings instead of CRLF if (!ofs) throw CantOpenFile(filename_); - // header - if (add_header) - ofs << comment_str_ << " automatically generated by wrap" << endl; - // dump in stringstream ofs << new_contents; ofs.close(); From 0d70be459e88be82eaf602ffc24320f0946b80fb Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Sun, 26 Aug 2012 21:58:18 +0000 Subject: [PATCH 810/914] Added method comments for wrap --- wrap/Class.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index bfc39132f..c42c38527 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -327,7 +327,7 @@ std::string Class::getTypedef() const { void Class::comment_fragment(FileWriter& proxyFile) const { - proxyFile.oss << "%%" << " --Overloads--" << endl; + proxyFile.oss << "%%" << " -------Overloads-------" << endl; BOOST_FOREACH(ArgumentList argList, constructor.args_list) { proxyFile.oss << "%" << name << "("; @@ -342,5 +342,24 @@ void Class::comment_fragment(FileWriter& proxyFile) const } proxyFile.oss << ")" << endl; } + + proxyFile.oss << "%" << "-------Methods-------" << endl; + BOOST_FOREACH(const Methods::value_type& name_m, methods) { + const Method& m = name_m.second; + BOOST_FOREACH(ArgumentList argList, m.argLists) + { + proxyFile.oss << "%" << m.name << "("; + int i = 0; + BOOST_FOREACH(const Argument& arg, argList) + { + if(i != argList.size()-1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } + proxyFile.oss << ")" << endl; + } + } } /* ************************************************************************* */ From 4b28f4d082d98b3949fd95007f74239ce8de5e7d Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Sun, 26 Aug 2012 22:00:16 +0000 Subject: [PATCH 811/914] Changed comment phrasing --- wrap/Class.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index c42c38527..c4314096b 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -327,7 +327,7 @@ std::string Class::getTypedef() const { void Class::comment_fragment(FileWriter& proxyFile) const { - proxyFile.oss << "%%" << " -------Overloads-------" << endl; + proxyFile.oss << "%%" << " -------Constructors-------" << endl; BOOST_FOREACH(ArgumentList argList, constructor.args_list) { proxyFile.oss << "%" << name << "("; From 12290dc7b2de0d5d8712497e034777d963fe7429 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 27 Aug 2012 01:11:37 +0000 Subject: [PATCH 812/914] Added linearization points to LinearContainerFactor. Fixed bug with localCoordinates() in Values --- .cproject | 332 +++++++++--------- gtsam/nonlinear/Values.cpp | 10 +- gtsam/nonlinear/Values.h | 2 +- gtsam/nonlinear/tests/testValues.cpp | 18 + .../nonlinear/LinearContainerFactor.cpp | 123 +++++-- .../nonlinear/LinearContainerFactor.h | 26 +- .../tests/testLinearContainerFactor.cpp | 43 +++ 7 files changed, 352 insertions(+), 202 deletions(-) diff --git a/.cproject b/.cproject index 7f13b1809..80a7c399e 100644 --- a/.cproject +++ b/.cproject @@ -309,14 +309,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -343,6 +335,7 @@ make + tests/testBayesTree.run true false @@ -350,6 +343,7 @@ make + testBinaryBayesNet.run true false @@ -397,6 +391,7 @@ make + testSymbolicBayesNet.run true false @@ -404,6 +399,7 @@ make + tests/testSymbolicFactor.run true false @@ -411,6 +407,7 @@ make + testSymbolicFactorGraph.run true false @@ -426,11 +423,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -519,22 +525,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -551,6 +541,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -575,26 +581,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -679,26 +685,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -977,6 +983,7 @@ make + testGraph.run true false @@ -984,6 +991,7 @@ make + testJunctionTree.run true false @@ -991,6 +999,7 @@ make + testSymbolicBayesNetB.run true false @@ -1126,6 +1135,7 @@ make + testErrors.run true false @@ -1171,10 +1181,10 @@ true true - + make - -j2 - testGaussianFactor.run + -j5 + testLinearContainerFactor.run true true true @@ -1259,6 +1269,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -1589,7 +1607,6 @@ make - testSimulated2DOriented.run true false @@ -1629,7 +1646,6 @@ make - testSimulated2D.run true false @@ -1637,7 +1653,6 @@ make - testSimulated3D.run true false @@ -1829,7 +1844,6 @@ make - tests/testGaussianISAM2 true false @@ -1851,102 +1865,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j1 @@ -2148,6 +2066,7 @@ cpack + -G DEB true false @@ -2155,6 +2074,7 @@ cpack + -G RPM true false @@ -2162,6 +2082,7 @@ cpack + -G TGZ true false @@ -2169,6 +2090,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2302,34 +2224,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2373,6 +2359,38 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam/nonlinear/Values.cpp b/gtsam/nonlinear/Values.cpp index 636c87c73..eab37ff17 100644 --- a/gtsam/nonlinear/Values.cpp +++ b/gtsam/nonlinear/Values.cpp @@ -90,7 +90,15 @@ namespace gtsam { /* ************************************************************************* */ VectorValues Values::localCoordinates(const Values& cp, const Ordering& ordering) const { VectorValues result(this->dims(ordering)); - localCoordinates(cp, ordering, result); + if(this->size() != cp.size()) + throw DynamicValuesMismatched(); + for(const_iterator it1=this->begin(), it2=cp.begin(); it1!=this->end(); ++it1, ++it2) { + if(it1->key != it2->key) + throw DynamicValuesMismatched(); // If keys do not match + // Will throw a dynamic_cast exception if types do not match + // NOTE: this is separate from localCoordinates(cp, ordering, result) due to at() vs. insert + result.at(ordering[it1->key]) = it1->value.localCoordinates_(it2->value); + } return result; } diff --git a/gtsam/nonlinear/Values.h b/gtsam/nonlinear/Values.h index c96831f05..25bd3dc2e 100644 --- a/gtsam/nonlinear/Values.h +++ b/gtsam/nonlinear/Values.h @@ -212,7 +212,7 @@ namespace gtsam { /** Get a delta config about a linearization point c0 (*this) */ VectorValues localCoordinates(const Values& cp, const Ordering& ordering) const; - /** Get a delta config about a linearization point c0 (*this) */ + /** Get a delta config about a linearization point c0 (*this) - assumes uninitialized delta */ void localCoordinates(const Values& cp, const Ordering& ordering, VectorValues& delta) const; ///@} diff --git a/gtsam/nonlinear/tests/testValues.cpp b/gtsam/nonlinear/tests/testValues.cpp index 5242fef1c..ffef740a6 100644 --- a/gtsam/nonlinear/tests/testValues.cpp +++ b/gtsam/nonlinear/tests/testValues.cpp @@ -234,6 +234,24 @@ TEST(Values, expmap_d) CHECK(config0.equals(config0)); } +/* ************************************************************************* */ +TEST(Values, localCoordinates) +{ + Values valuesA; + valuesA.insert(key1, LieVector(3, 1.0, 2.0, 3.0)); + valuesA.insert(key2, LieVector(3, 5.0, 6.0, 7.0)); + + Ordering ordering = *valuesA.orderingArbitrary(); + + VectorValues expDelta = valuesA.zeroVectors(ordering); +// expDelta.at(ordering[key1]) = Vector_(3, 0.1, 0.2, 0.3); +// expDelta.at(ordering[key2]) = Vector_(3, 0.4, 0.5, 0.6); + + Values valuesB = valuesA.retract(expDelta, ordering); + + EXPECT(assert_equal(expDelta, valuesA.localCoordinates(valuesB, ordering))); +} + /* ************************************************************************* */ TEST(Values, extract_keys) { diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp index ea324704b..048f4a0c4 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -27,56 +27,82 @@ void LinearContainerFactor::rekeyFactor(const Ordering::InvertedMap& invOrdering } /* ************************************************************************* */ -LinearContainerFactor::LinearContainerFactor( - const JacobianFactor& factor, const Ordering& ordering) -: factor_(factor.clone()) { - rekeyFactor(ordering); +void LinearContainerFactor::initializeLinearizationPoint(const Values& linearizationPoint) { + if (!linearizationPoint.empty()) { + linearizationPoint_ = Values(); + BOOST_FOREACH(const gtsam::Key& key, this->keys()) { + linearizationPoint_->insert(key, linearizationPoint.at(key)); + } + } else { + linearizationPoint_ = boost::none; + } } /* ************************************************************************* */ LinearContainerFactor::LinearContainerFactor( - const HessianFactor& factor, const Ordering& ordering) + const JacobianFactor& factor, const Ordering& ordering, + const Values& linearizationPoint) : factor_(factor.clone()) { rekeyFactor(ordering); + initializeLinearizationPoint(linearizationPoint); } /* ************************************************************************* */ LinearContainerFactor::LinearContainerFactor( - const GaussianFactor::shared_ptr& factor, const Ordering& ordering) + const HessianFactor& factor, const Ordering& ordering, + const Values& linearizationPoint) +: factor_(factor.clone()) { + rekeyFactor(ordering); + initializeLinearizationPoint(linearizationPoint); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor, const Ordering& ordering, + const Values& linearizationPoint) : factor_(factor->clone()) { rekeyFactor(ordering); -} - -/* ************************************************************************* */ -LinearContainerFactor::LinearContainerFactor( - const GaussianFactor::shared_ptr& factor) -: factor_(factor->clone()) -{ - // Extract keys stashed in linear factor - BOOST_FOREACH(const Index& idx, factor_->keys()) - keys_.push_back(idx); -} - -/* ************************************************************************* */ -LinearContainerFactor::LinearContainerFactor(const JacobianFactor& factor, - const Ordering::InvertedMap& inverted_ordering) -: factor_(factor.clone()) { - rekeyFactor(inverted_ordering); -} - -/* ************************************************************************* */ -LinearContainerFactor::LinearContainerFactor(const HessianFactor& factor, - const Ordering::InvertedMap& inverted_ordering) -: factor_(factor.clone()) { - rekeyFactor(inverted_ordering); + initializeLinearizationPoint(linearizationPoint); } /* ************************************************************************* */ LinearContainerFactor::LinearContainerFactor( const GaussianFactor::shared_ptr& factor, - const Ordering::InvertedMap& ordering) + const Values& linearizationPoint) +: factor_(factor->clone()) +{ + // Extract keys stashed in linear factor + BOOST_FOREACH(const Index& idx, factor_->keys()) + keys_.push_back(idx); + initializeLinearizationPoint(linearizationPoint); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor(const JacobianFactor& factor, + const Ordering::InvertedMap& inverted_ordering, + const Values& linearizationPoint) +: factor_(factor.clone()) { + rekeyFactor(inverted_ordering); + initializeLinearizationPoint(linearizationPoint); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor(const HessianFactor& factor, + const Ordering::InvertedMap& inverted_ordering, + const Values& linearizationPoint) +: factor_(factor.clone()) { + rekeyFactor(inverted_ordering); + initializeLinearizationPoint(linearizationPoint); +} + +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor( + const GaussianFactor::shared_ptr& factor, + const Ordering::InvertedMap& ordering, + const Values& linearizationPoint) : factor_(factor->clone()) { rekeyFactor(ordering); + initializeLinearizationPoint(linearizationPoint); } /* ************************************************************************* */ @@ -84,20 +110,45 @@ void LinearContainerFactor::print(const std::string& s, const KeyFormatter& keyF Base::print(s+"LinearContainerFactor", keyFormatter); if (factor_) factor_->print(" Stored Factor", keyFormatter); + if (linearizationPoint_) + linearizationPoint_->print(" LinearizationPoint", keyFormatter); } /* ************************************************************************* */ bool LinearContainerFactor::equals(const NonlinearFactor& f, double tol) const { const LinearContainerFactor* jcf = dynamic_cast(&f); - return jcf && factor_->equals(*jcf->factor_, tol) && NonlinearFactor::equals(f); + if (!jcf || factor_->equals(*jcf->factor_, tol) || NonlinearFactor::equals(f)) + return false; + if (!linearizationPoint_ && !jcf->linearizationPoint_) + return true; + return jcf->linearizationPoint_ && linearizationPoint_->equals(*jcf->linearizationPoint_, tol); } /* ************************************************************************* */ double LinearContainerFactor::error(const Values& c) const { - // VectorValues vecvalues; - // // FIXME: add values correctly here - // return factor_.error(vecvalues); - return 0; // FIXME: placeholder + if (!linearizationPoint_) + return 0; + + // Extract subset of values for comparision + Values csub; + BOOST_FOREACH(const gtsam::Key& key, keys()) + csub.insert(key, c.at(key)); + + // create dummy ordering for evaluation + Ordering ordering = *csub.orderingArbitrary(); + VectorValues delta = linearizationPoint_->localCoordinates(csub, ordering); + + // Change keys on stored factor + BOOST_FOREACH(gtsam::Index& index, factor_->keys()) + index = ordering[index]; + + // compute error + double error = factor_->error(delta); + + // change keys back + factor_->keys() = keys(); + + return error; } /* ************************************************************************* */ diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.h b/gtsam_unstable/nonlinear/LinearContainerFactor.h index 25a1ed98b..9affcc29e 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.h +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.h @@ -21,32 +21,40 @@ class LinearContainerFactor : public NonlinearFactor { protected: GaussianFactor::shared_ptr factor_; + boost::optional linearizationPoint_; public: /** Primary constructor: store a linear factor and decode the ordering */ - LinearContainerFactor(const JacobianFactor& factor, const Ordering& ordering); + LinearContainerFactor(const JacobianFactor& factor, const Ordering& ordering, + const Values& linearizationPoint = Values()); /** Primary constructor: store a linear factor and decode the ordering */ - LinearContainerFactor(const HessianFactor& factor, const Ordering& ordering); + LinearContainerFactor(const HessianFactor& factor, const Ordering& ordering, + const Values& linearizationPoint = Values()); /** Constructor from shared_ptr */ - LinearContainerFactor(const GaussianFactor::shared_ptr& factor, const Ordering& ordering); + LinearContainerFactor(const GaussianFactor::shared_ptr& factor, const Ordering& ordering, + const Values& linearizationPoint = Values()); /** Constructor from re-keyed factor: all indices assumed replaced with Key */ - LinearContainerFactor(const GaussianFactor::shared_ptr& factor); + LinearContainerFactor(const GaussianFactor::shared_ptr& factor, + const Values& linearizationPoint = Values()); /** Alternate constructor: store a linear factor and decode keys with inverted ordering*/ LinearContainerFactor(const JacobianFactor& factor, - const Ordering::InvertedMap& inverted_ordering); + const Ordering::InvertedMap& inverted_ordering, + const Values& linearizationPoint = Values()); /** Alternate constructor: store a linear factor and decode keys with inverted ordering*/ LinearContainerFactor(const HessianFactor& factor, - const Ordering::InvertedMap& inverted_ordering); + const Ordering::InvertedMap& inverted_ordering, + const Values& linearizationPoint = Values()); /** Constructor from shared_ptr with inverted ordering*/ LinearContainerFactor(const GaussianFactor::shared_ptr& factor, - const Ordering::InvertedMap& ordering); + const Ordering::InvertedMap& ordering, + const Values& linearizationPoint = Values()); // Access @@ -70,6 +78,9 @@ public: /** get the dimension of the factor: rows of linear factor */ size_t dim() const; + /** Extract the linearization point used in recalculating error */ + const boost::optional& linearizationPoint() const { return linearizationPoint_; } + /** Apply the ordering to a graph - same as linearize(), but without needing a linearization point */ GaussianFactor::shared_ptr order(const Ordering& ordering) const; @@ -125,6 +136,7 @@ public: protected: void rekeyFactor(const Ordering& ordering); void rekeyFactor(const Ordering::InvertedMap& invOrdering); + void initializeLinearizationPoint(const Values& linearizationPoint); }; // \class LinearContainerFactor diff --git a/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp index e85b880e8..1bce66ce3 100644 --- a/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp @@ -70,6 +70,49 @@ TEST( testLinearContainerFactor, generic_jacobian_factor ) { EXPECT(assert_equal(*expLinFactor2.clone(), *actLinearizationB, tol)); } +/* ************************************************************************* */ +TEST( testLinearContainerFactor, jacobian_factor_withlinpoints ) { + + Ordering ordering; ordering += x1, x2, l1, l2; + + JacobianFactor expLinFactor( + ordering[l1], + Matrix_(2,2, + 2.74222, -0.0067457, + 0.0, 2.63624), + ordering[l2], + Matrix_(2,2, + -0.0455167, -0.0443573, + -0.0222154, -0.102489), + Vector_(2, 0.0277052, + -0.0533393), + diag_model2); + + Values values; + values.insert(l1, landmark1); + values.insert(l2, landmark2); + values.insert(x1, poseA1); + values.insert(x2, poseA2); + + LinearContainerFactor actFactor(expLinFactor, ordering, values); + + // Check contents + Values expLinPoint; + expLinPoint.insert(l1, landmark1); + expLinPoint.insert(l2, landmark2); + CHECK(actFactor.linearizationPoint()); + EXPECT(assert_equal(expLinPoint, *actFactor.linearizationPoint())); + + // Check error evaluation + VectorValues delta = values.zeroVectors(ordering); + delta.at(ordering[l1]) = Vector_(2, 1.0, 2.0); + delta.at(ordering[l2]) = Vector_(2, 3.0, 4.0); + Values noisyValues = values.retract(delta, ordering); + double expError = expLinFactor.error(delta); + EXPECT_DOUBLES_EQUAL(expError, actFactor.error(noisyValues), tol); + EXPECT_DOUBLES_EQUAL(expLinFactor.error(values.zeroVectors(ordering)), actFactor.error(values), tol); +} + /* ************************************************************************* */ TEST( testLinearContainerFactor, generic_hessian_factor ) { Matrix G11 = Matrix_(1,1, 1.0); From 6b14e652ffea93cf3f49b5a15cd7207e9685613e Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 27 Aug 2012 01:40:11 +0000 Subject: [PATCH 813/914] Fixed bug in equality check --- gtsam_unstable/nonlinear/LinearContainerFactor.cpp | 6 ++++-- .../nonlinear/tests/testLinearContainerFactor.cpp | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp index 048f4a0c4..fa44d3e93 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -117,11 +117,13 @@ void LinearContainerFactor::print(const std::string& s, const KeyFormatter& keyF /* ************************************************************************* */ bool LinearContainerFactor::equals(const NonlinearFactor& f, double tol) const { const LinearContainerFactor* jcf = dynamic_cast(&f); - if (!jcf || factor_->equals(*jcf->factor_, tol) || NonlinearFactor::equals(f)) + if (!jcf || !factor_->equals(*jcf->factor_, tol) || !NonlinearFactor::equals(f)) return false; if (!linearizationPoint_ && !jcf->linearizationPoint_) return true; - return jcf->linearizationPoint_ && linearizationPoint_->equals(*jcf->linearizationPoint_, tol); + if (linearizationPoint_ && jcf->linearizationPoint_) + return linearizationPoint_->equals(*jcf->linearizationPoint_, tol); + return false; } /* ************************************************************************* */ diff --git a/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp index 1bce66ce3..51f2f73a2 100644 --- a/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/tests/testLinearContainerFactor.cpp @@ -9,6 +9,7 @@ #include +#include #include using namespace gtsam; @@ -95,6 +96,11 @@ TEST( testLinearContainerFactor, jacobian_factor_withlinpoints ) { values.insert(x2, poseA2); LinearContainerFactor actFactor(expLinFactor, ordering, values); + LinearContainerFactor actFactorNolin(expLinFactor, ordering); + + EXPECT(assert_equal(actFactor, actFactor, tol)); + EXPECT(assert_inequal(actFactor, actFactorNolin, tol)); + EXPECT(assert_inequal(actFactorNolin, actFactor, tol)); // Check contents Values expLinPoint; From 868fc7f1e045b13772ba3373d0ae91f31a5d4b74 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 27 Aug 2012 12:52:33 +0000 Subject: [PATCH 814/914] Fixed order of methods in wrap, and wrapped matrix and augmented_matrix (why were they not wrapped?) --- gtsam.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/gtsam.h b/gtsam.h index 5f55a8c62..b5eb18ac8 100644 --- a/gtsam.h +++ b/gtsam.h @@ -955,12 +955,15 @@ virtual class JacobianFactor : gtsam::GaussianFactor { void print(string s) const; void printKeys(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; - bool empty() const; size_t size() const; - Vector getb() const; double error(const gtsam::VectorValues& c) const; - gtsam::GaussianConditional* eliminateFirst(); - gtsam::GaussianFactor* negate() const; + gtsam::GaussianFactor* negate() const; + bool empty() const; + Vector getb() const; + pair matrix() const; + Matrix matrix_augmented() const; + gtsam::GaussianConditional* eliminateFirst(); + gtsam::GaussianConditional* eliminate(size_t nrFrontals); }; virtual class HessianFactor : gtsam::GaussianFactor { From 07fb02248014c3616564425cdf492b0e403f0595 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 27 Aug 2012 13:21:45 +0000 Subject: [PATCH 815/914] Wrapped NonlinearFactorGraph::symbolic method --- gtsam.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gtsam.h b/gtsam.h index b5eb18ac8..aebbea8b8 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1122,6 +1122,7 @@ class NonlinearFactorGraph { // Ordering* orderingCOLAMDConstrained(const gtsam::Values& c, const std::map& constraints) const; gtsam::GaussianFactorGraph* linearize(const gtsam::Values& values, const gtsam::Ordering& ordering) const; + gtsam::SymbolicFactorGraph* symbolic(const gtsam::Ordering& ordering) const; gtsam::NonlinearFactorGraph clone() const; }; From 7d02043855bb85cc0ec5fa4edfbe849aa206ce2f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 27 Aug 2012 13:21:48 +0000 Subject: [PATCH 816/914] Removed unused include --- gtsam/linear/NoiseModel.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/gtsam/linear/NoiseModel.cpp b/gtsam/linear/NoiseModel.cpp index e493bddde..7479c2141 100644 --- a/gtsam/linear/NoiseModel.cpp +++ b/gtsam/linear/NoiseModel.cpp @@ -27,7 +27,6 @@ #include #include -#include #include static double inf = std::numeric_limits::infinity(); From 6da48bc58006e14ea157e70effbff64ae3b9e753 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 27 Aug 2012 15:19:55 +0000 Subject: [PATCH 817/914] Even more comment improvements for wrap --- wrap/Class.cpp | 21 +- wrap/Method.cpp | 18 + wrap/Method.h | 1 + wrap/Module.cpp | 1252 ++++++++++++++++++++--------------------- wrap/StaticMethod.cpp | 18 + 5 files changed, 683 insertions(+), 627 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index c4314096b..e61e06ec2 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -327,7 +327,7 @@ std::string Class::getTypedef() const { void Class::comment_fragment(FileWriter& proxyFile) const { - proxyFile.oss << "%%" << " -------Constructors-------" << endl; + proxyFile.oss << "%" << "-------Constructors-------" << endl; BOOST_FOREACH(ArgumentList argList, constructor.args_list) { proxyFile.oss << "%" << name << "("; @@ -361,5 +361,24 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << ")" << endl; } } + + proxyFile.oss << "%" << "-------Static Methods-------" << endl; + BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { + const StaticMethod& m = name_m.second; + BOOST_FOREACH(ArgumentList argList, m.argLists) + { + proxyFile.oss << "%" << m.name << "("; + int i = 0; + BOOST_FOREACH(const Argument& arg, argList) + { + if(i != argList.size()-1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } + proxyFile.oss << ")" << endl; + } + } } /* ************************************************************************* */ diff --git a/wrap/Method.cpp b/wrap/Method.cpp index cc7c5a865..1fe6b022b 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -46,6 +46,24 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF vector& functionNames) const { proxyFile.oss << " function varargout = " << name << "(this, varargin)\n"; + //Comments for documentation + proxyFile.oss << " % " << name << " See GTSAM Doc for detailed info." << endl; + proxyFile.oss << " % " << "" << endl; + proxyFile.oss << " % " << "Method Overloads" << endl; + BOOST_FOREACH(ArgumentList argList, argLists) + { + proxyFile.oss << " % " << name << "("; + int i = 0; + BOOST_FOREACH(const Argument& arg, argList) + { + if(i != argList.size()-1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } + proxyFile.oss << ")" << endl; + } for(size_t overload = 0; overload < argLists.size(); ++overload) { const ArgumentList& args = argLists[overload]; diff --git a/wrap/Method.h b/wrap/Method.h index 4185732cf..0b17e690e 100644 --- a/wrap/Method.h +++ b/wrap/Method.h @@ -24,6 +24,7 @@ #include "Argument.h" #include "ReturnValue.h" #include "TypeAttributesTable.h" +#include namespace wrap { diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 681fb6925..46b31f3e6 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -1,627 +1,627 @@ -/* ---------------------------------------------------------------------------- - - * 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 Module.ccp - * @author Frank Dellaert - * @author Alex Cunningham - * @author Andrew Melim +/* ---------------------------------------------------------------------------- + + * 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 Module.ccp + * @author Frank Dellaert + * @author Alex Cunningham + * @author Andrew Melim * @author Richard Roberts - **/ - -#include "Module.h" -#include "FileWriter.h" -#include "TypeAttributesTable.h" -#include "utilities.h" -#include "spirit_actors.h" - -//#define BOOST_SPIRIT_DEBUG -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -using namespace std; -using namespace wrap; -using namespace BOOST_SPIRIT_CLASSIC_NS; -namespace bl = boost::lambda; -namespace fs = boost::filesystem; - -typedef rule Rule; - -/* ************************************************************************* */ -// We parse an interface file into a Module object. -// The grammar is defined using the boost/spirit combinatorial parser. -// For example, str_p("const") parses the string "const", and the >> -// operator creates a sequence parser. The grammar below, composed of rules -// and with start rule [class_p], doubles as the specs for our interface files. -/* ************************************************************************* */ - -/* ************************************************************************* */ -void handle_possible_template(vector& classes, const Class& cls, const string& templateArgument, const vector >& instantiations) { - if(instantiations.empty()) { - classes.push_back(cls); - } else { - vector classInstantiations = cls.expandTemplate(templateArgument, instantiations); - BOOST_FOREACH(const Class& c, classInstantiations) { - classes.push_back(c); - } - } -} - -/* ************************************************************************* */ -Module::Module(const string& interfacePath, - const string& moduleName, bool enable_verbose) : name(moduleName), verbose(enable_verbose) -{ - // these variables will be imperatively updated to gradually build [cls] - // The one with postfix 0 are used to reset the variables after parse. - string methodName, methodName0; - bool isConst, isConst0 = false; - ReturnValue retVal0, retVal; - Argument arg0, arg; - ArgumentList args0, args; - vector arg_dup; ///keep track of duplicates - Constructor constructor0(enable_verbose), constructor(enable_verbose); - Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); - StaticMethod static_method0(enable_verbose), static_method(enable_verbose); - Class cls0(enable_verbose),cls(enable_verbose); - GlobalFunction globalFunc0(enable_verbose), globalFunc(enable_verbose); - ForwardDeclaration fwDec0, fwDec; - vector namespaces, /// current namespace tag - namespaces_return; /// namespace for current return type - string templateArgument; - vector templateInstantiationNamespace; - vector > templateInstantiations; - TemplateInstantiationTypedef singleInstantiation, singleInstantiation0; - string include_path = ""; - const string null_str = ""; - - //---------------------------------------------------------------------------- - // Grammar with actions that build the Class object. Actions are - // defined within the square brackets [] and are executed whenever a - // rule is successfully parsed. Define BOOST_SPIRIT_DEBUG to debug. - // The grammar is allows a very restricted C++ header - // lexeme_d turns off white space skipping - // http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/doc/directives.html - // ---------------------------------------------------------------------------- - - Rule comments_p = comment_p("/*", "*/") | comment_p("//", eol_p); - - Rule basisType_p = - (str_p("string") | "bool" | "size_t" | "int" | "double" | "char" | "unsigned char"); - - Rule keywords_p = - (str_p("const") | "static" | "namespace" | basisType_p); - - Rule eigenType_p = - (str_p("Vector") | "Matrix"); - - Rule className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p - keywords_p); - - Rule namespace_name_p = lexeme_d[lower_p >> *(alnum_p | '_')] - keywords_p; - - Rule namespace_arg_p = namespace_name_p[push_back_a(arg.namespaces)] >> str_p("::"); - - Rule argEigenType_p = - eigenType_p[assign_a(arg.type)] >> - !ch_p('*')[assign_a(arg.is_ptr,true)]; - - Rule eigenRef_p = - !str_p("const") [assign_a(arg.is_const,true)] >> - eigenType_p [assign_a(arg.type)] >> - ch_p('&') [assign_a(arg.is_ref,true)]; - - Rule classArg_p = - !str_p("const") [assign_a(arg.is_const,true)] >> - *namespace_arg_p >> - className_p[assign_a(arg.type)] >> - (ch_p('*')[assign_a(arg.is_ptr,true)] | ch_p('&')[assign_a(arg.is_ref,true)]); - - Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; - - Rule classParent_p = - *(namespace_name_p[push_back_a(cls.qualifiedParent)] >> str_p("::")) >> - className_p[push_back_a(cls.qualifiedParent)]; - - Rule templateInstantiation_p = - (*(namespace_name_p[push_back_a(templateInstantiationNamespace)] >> str_p("::")) >> - className_p[push_back_a(templateInstantiationNamespace)]) - [push_back_a(templateInstantiations, templateInstantiationNamespace)] - [clear_a(templateInstantiationNamespace)]; - - Rule templateInstantiations_p = - (str_p("template") >> - '<' >> name_p[assign_a(templateArgument)] >> '=' >> '{' >> - !(templateInstantiation_p >> *(',' >> templateInstantiation_p)) >> - '}' >> '>') - [push_back_a(cls.templateArgs, templateArgument)]; - - Rule templateSingleInstantiationArg_p = - (*(namespace_name_p[push_back_a(templateInstantiationNamespace)] >> str_p("::")) >> - className_p[push_back_a(templateInstantiationNamespace)]) - [push_back_a(singleInstantiation.typeList, templateInstantiationNamespace)] - [clear_a(templateInstantiationNamespace)]; - - Rule templateSingleInstantiation_p = - (str_p("typedef") >> - *(namespace_name_p[push_back_a(singleInstantiation.classNamespaces)] >> str_p("::")) >> - className_p[assign_a(singleInstantiation.className)] >> - '<' >> templateSingleInstantiationArg_p >> *(',' >> templateSingleInstantiationArg_p) >> - '>' >> - className_p[assign_a(singleInstantiation.name)] >> - ';') - [assign_a(singleInstantiation.namespaces, namespaces)] - [push_back_a(templateInstantiationTypedefs, singleInstantiation)] - [assign_a(singleInstantiation, singleInstantiation0)]; - - Rule templateList_p = - (str_p("template") >> - '<' >> name_p[push_back_a(cls.templateArgs)] >> *(',' >> name_p[push_back_a(cls.templateArgs)]) >> - '>'); - - Rule argument_p = - ((basisType_p[assign_a(arg.type)] | argEigenType_p | eigenRef_p | classArg_p) - >> name_p[assign_a(arg.name)]) - [push_back_a(args, arg)] - [assign_a(arg,arg0)]; - - Rule argumentList_p = !argument_p >> * (',' >> argument_p); - - Rule constructor_p = - (className_p >> '(' >> argumentList_p >> ')' >> ';' >> !comments_p) - [push_back_a(constructor.args_list, args)] - [assign_a(args,args0)]; - //[assign_a(constructor.args,args)] - //[assign_a(constructor.name,cls.name)] - //[push_back_a(cls.constructors, constructor)] - //[assign_a(constructor,constructor0)]; - - Rule namespace_ret_p = namespace_name_p[push_back_a(namespaces_return)] >> str_p("::"); - - Rule returnType1_p = - (basisType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::BASIS)]) | - ((*namespace_ret_p)[assign_a(retVal.namespaces1, namespaces_return)][clear_a(namespaces_return)] - >> (className_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::CLASS)]) >> - !ch_p('*')[assign_a(retVal.isPtr1,true)]) | - (eigenType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::EIGEN)]); - - Rule returnType2_p = - (basisType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::BASIS)]) | - ((*namespace_ret_p)[assign_a(retVal.namespaces2, namespaces_return)][clear_a(namespaces_return)] - >> (className_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::CLASS)]) >> - !ch_p('*') [assign_a(retVal.isPtr2,true)]) | - (eigenType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::EIGEN)]); - - Rule pair_p = - (str_p("pair") >> '<' >> returnType1_p >> ',' >> returnType2_p >> '>') - [assign_a(retVal.isPair,true)]; - - Rule void_p = str_p("void")[assign_a(retVal.type1)]; - - Rule returnType_p = void_p | returnType1_p | pair_p; - - Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')]; - - Rule method_p = - (returnType_p >> methodName_p[assign_a(methodName)] >> - '(' >> argumentList_p >> ')' >> - !str_p("const")[assign_a(isConst,true)] >> ';' >> *comments_p) - [bl::bind(&Method::addOverload, - bl::var(cls.methods)[bl::var(methodName)], - verbose, - bl::var(isConst), - bl::var(methodName), - bl::var(args), - bl::var(retVal))] - [assign_a(isConst,isConst0)] - [assign_a(methodName,methodName0)] - [assign_a(args,args0)] - [assign_a(retVal,retVal0)]; - - Rule staticMethodName_p = lexeme_d[(upper_p | lower_p) >> *(alnum_p | '_')]; - - Rule static_method_p = - (str_p("static") >> returnType_p >> staticMethodName_p[assign_a(methodName)] >> - '(' >> argumentList_p >> ')' >> ';' >> *comments_p) - [bl::bind(&StaticMethod::addOverload, - bl::var(cls.static_methods)[bl::var(methodName)], - verbose, - bl::var(methodName), - bl::var(args), - bl::var(retVal))] - [assign_a(methodName,methodName0)] - [assign_a(args,args0)] - [assign_a(retVal,retVal0)]; - - Rule functions_p = constructor_p | method_p | static_method_p; - - Rule class_p = - (str_p("")[assign_a(cls,cls0)]) - >> (!(templateInstantiations_p | templateList_p) - >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) - >> str_p("class") - >> className_p[assign_a(cls.name)] - >> ((':' >> classParent_p >> '{') | '{') - >> *(functions_p | comments_p) - >> str_p("};")) - [assign_a(constructor.name, cls.name)] - [assign_a(cls.constructor, constructor)] - [assign_a(cls.namespaces, namespaces)] - [assign_a(deconstructor.name,cls.name)] - [assign_a(cls.deconstructor, deconstructor)] - [bl::bind(&handle_possible_template, bl::var(classes), bl::var(cls), bl::var(templateArgument), bl::var(templateInstantiations))] - [assign_a(deconstructor,deconstructor0)] - [assign_a(constructor, constructor0)] - [assign_a(cls,cls0)] - [clear_a(templateArgument)] - [clear_a(templateInstantiations)]; - - Rule global_function_p = - (returnType_p >> staticMethodName_p[assign_a(methodName)] >> - '(' >> argumentList_p >> ')' >> ';' >> *comments_p) - [bl::bind(&GlobalFunction::addOverload, - bl::var(global_functions)[bl::var(methodName)], - verbose, - bl::var(methodName), - bl::var(args), - bl::var(retVal), - bl::var(namespaces))] - [assign_a(methodName,methodName0)] - [assign_a(args,args0)] - [assign_a(retVal,retVal0)]; - - Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[push_back_a(includes)] >> ch_p('>'); - - Rule namespace_def_p = - (str_p("namespace") - >> namespace_name_p[push_back_a(namespaces)] - >> ch_p('{') - >> *(include_p | class_p | templateSingleInstantiation_p | global_function_p | namespace_def_p | comments_p) - >> ch_p('}')) - [pop_a(namespaces)]; - - Rule forward_declaration_p = - !(str_p("virtual")[assign_a(fwDec.isVirtual, true)]) - >> str_p("class") - >> (*(namespace_name_p >> str_p("::")) >> className_p)[assign_a(fwDec.name)] - >> ch_p(';') - [push_back_a(forward_declarations, fwDec)] - [assign_a(fwDec, fwDec0)]; - - Rule module_content_p = comments_p | include_p | class_p | templateSingleInstantiation_p | forward_declaration_p | global_function_p | namespace_def_p; - - Rule module_p = *module_content_p >> !end_p; - - //---------------------------------------------------------------------------- - // for debugging, define BOOST_SPIRIT_DEBUG -# ifdef BOOST_SPIRIT_DEBUG - BOOST_SPIRIT_DEBUG_NODE(className_p); - BOOST_SPIRIT_DEBUG_NODE(classPtr_p); - BOOST_SPIRIT_DEBUG_NODE(classRef_p); - BOOST_SPIRIT_DEBUG_NODE(basisType_p); - BOOST_SPIRIT_DEBUG_NODE(name_p); - BOOST_SPIRIT_DEBUG_NODE(argument_p); - BOOST_SPIRIT_DEBUG_NODE(argumentList_p); - BOOST_SPIRIT_DEBUG_NODE(constructor_p); - BOOST_SPIRIT_DEBUG_NODE(returnType1_p); - BOOST_SPIRIT_DEBUG_NODE(returnType2_p); - BOOST_SPIRIT_DEBUG_NODE(pair_p); - BOOST_SPIRIT_DEBUG_NODE(void_p); - BOOST_SPIRIT_DEBUG_NODE(returnType_p); - BOOST_SPIRIT_DEBUG_NODE(methodName_p); - BOOST_SPIRIT_DEBUG_NODE(method_p); - BOOST_SPIRIT_DEBUG_NODE(class_p); - BOOST_SPIRIT_DEBUG_NODE(namespace_def_p); - BOOST_SPIRIT_DEBUG_NODE(module_p); -# endif - //---------------------------------------------------------------------------- - - // read interface file - string interfaceFile = interfacePath + "/" + moduleName + ".h"; - string contents = file_contents(interfaceFile); - - // and parse contents - parse_info info = parse(contents.c_str(), module_p, space_p); - if(!info.full) { - printf("parsing stopped at \n%.20s\n",info.stop); - throw ParseFailed((int)info.length); - } -} - -/* ************************************************************************* */ -template -void verifyArguments(const vector& validArgs, const map& vt) { - typedef typename map::value_type Name_Method; - BOOST_FOREACH(const Name_Method& name_method, vt) { - const T& t = name_method.second; - BOOST_FOREACH(const ArgumentList& argList, t.argLists) { - BOOST_FOREACH(Argument arg, argList) { - string fullType = arg.qualifiedType("::"); - if(find(validArgs.begin(), validArgs.end(), fullType) - == validArgs.end()) - throw DependencyMissing(fullType, t.name); - } - } - } -} - -/* ************************************************************************* */ -template -void verifyReturnTypes(const vector& validtypes, const map& vt) { - typedef typename map::value_type Name_Method; - BOOST_FOREACH(const Name_Method& name_method, vt) { - const T& t = name_method.second; - BOOST_FOREACH(const ReturnValue& retval, t.returnVals) { - if (find(validtypes.begin(), validtypes.end(), retval.qualifiedType1("::")) == validtypes.end()) - throw DependencyMissing(retval.qualifiedType1("::"), t.name); - if (retval.isPair && find(validtypes.begin(), validtypes.end(), retval.qualifiedType2("::")) == validtypes.end()) - throw DependencyMissing(retval.qualifiedType2("::"), t.name); - } - } -} - -/* ************************************************************************* */ -void Module::generateIncludes(FileWriter& file) const { - - // collect includes - vector all_includes(includes); - - // sort and remove duplicates - sort(all_includes.begin(), all_includes.end()); - vector::const_iterator last_include = unique(all_includes.begin(), all_includes.end()); - vector::const_iterator it = all_includes.begin(); - // add includes to file - for (; it != last_include; ++it) - file.oss << "#include <" << *it << ">" << endl; - file.oss << "\n"; -} - -/* ************************************************************************* */ -void Module::matlab_code(const string& toolboxPath, const string& headerPath) const { - - fs::create_directories(toolboxPath); - - // create the unified .cpp switch file - const string wrapperName = name + "_wrapper"; - string wrapperFileName = toolboxPath + "/" + wrapperName + ".cpp"; - FileWriter wrapperFile(wrapperFileName, verbose, "//"); - vector functionNames; // Function names stored by index for switch - wrapperFile.oss << "#include \n"; - wrapperFile.oss << "#include \n"; - wrapperFile.oss << "#include \n"; - wrapperFile.oss << "\n"; - - // Expand templates - This is done first so that template instantiations are - // counted in the list of valid types, have their attributes and dependencies - // checked, etc. - vector expandedClasses = ExpandTypedefInstantiations(classes, templateInstantiationTypedefs); - - // Dependency check list - vector validTypes = GenerateValidTypes(expandedClasses, forward_declarations); - - // Check that all classes have been defined somewhere - verifyArguments(validTypes, global_functions); - verifyReturnTypes(validTypes, global_functions); - - BOOST_FOREACH(const Class& cls, expandedClasses) { - // verify all of the function arguments - //TODO:verifyArguments(validTypes, cls.constructor.args_list); - verifyArguments(validTypes, cls.static_methods); - verifyArguments(validTypes, cls.methods); - - // verify function return types - verifyReturnTypes(validTypes, cls.static_methods); - verifyReturnTypes(validTypes, cls.methods); - - // verify parents - if(!cls.qualifiedParent.empty() && std::find(validTypes.begin(), validTypes.end(), wrap::qualifiedName("::", cls.qualifiedParent)) == validTypes.end()) - throw DependencyMissing(wrap::qualifiedName("::", cls.qualifiedParent), cls.qualifiedName("::")); - } - - // Create type attributes table and check validity - TypeAttributesTable typeAttributes; - typeAttributes.addClasses(expandedClasses); - typeAttributes.addForwardDeclarations(forward_declarations); - typeAttributes.checkValidity(expandedClasses); - - // Generate includes while avoiding redundant includes - generateIncludes(wrapperFile); - - // create typedef classes - we put this at the top of the wrap file so that collectors and method arguments can use these typedefs - BOOST_FOREACH(const Class& cls, expandedClasses) { - if(!cls.typedefName.empty()) - wrapperFile.oss << cls.getTypedef() << "\n"; - } - wrapperFile.oss << "\n"; - - // Generate collectors and cleanup function to be called from mexAtExit - WriteCollectorsAndCleanupFcn(wrapperFile, name, expandedClasses); - - // generate RTTI registry (for returning derived-most types) - WriteRTTIRegistry(wrapperFile, name, expandedClasses); - - // create proxy class and wrapper code - BOOST_FOREACH(const Class& cls, expandedClasses) { - cls.matlab_proxy(toolboxPath, wrapperName, typeAttributes, wrapperFile, functionNames); - } - - // create matlab files and wrapper code for global functions - BOOST_FOREACH(const GlobalFunctions::value_type& p, global_functions) { - p.second.matlab_proxy(toolboxPath, wrapperName, typeAttributes, wrapperFile, functionNames); - } - - // finish wrapper file - wrapperFile.oss << "\n"; - finish_wrapper(wrapperFile, functionNames); - - wrapperFile.emit(true); - } - -/* ************************************************************************* */ - void Module::finish_wrapper(FileWriter& file, const std::vector& functionNames) const { - file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; - file.oss << "{\n"; - file.oss << " mstream mout;\n"; // Send stdout to MATLAB console - file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; - file.oss << " _" << name << "_RTTIRegister();\n\n"; - file.oss << " int id = unwrap(in[0]);\n\n"; - file.oss << " try {\n"; - file.oss << " switch(id) {\n"; - for(size_t id = 0; id < functionNames.size(); ++id) { - file.oss << " case " << id << ":\n"; - file.oss << " " << functionNames[id] << "(nargout, out, nargin-1, in+1);\n"; - file.oss << " break;\n"; - } - file.oss << " }\n"; - file.oss << " } catch(const std::exception& e) {\n"; - file.oss << " mexErrMsgTxt((\"Exception from gtsam:\\n\" + std::string(e.what()) + \"\\n\").c_str());\n"; - file.oss << " }\n"; - file.oss << "\n"; - file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout - file.oss << "}\n"; - } - -/* ************************************************************************* */ -vector Module::ExpandTypedefInstantiations(const vector& classes, const vector instantiations) { - - vector expandedClasses = classes; - - BOOST_FOREACH(const TemplateInstantiationTypedef& inst, instantiations) { - // Add the new class to the list - expandedClasses.push_back(inst.findAndExpand(classes)); - } - - // Remove all template classes - for(size_t i = 0; i < expandedClasses.size(); ++i) - if(!expandedClasses[size_t(i)].templateArgs.empty()) { - expandedClasses.erase(expandedClasses.begin() + size_t(i)); - -- i; - } - - return expandedClasses; -} - -/* ************************************************************************* */ -vector Module::GenerateValidTypes(const vector& classes, const vector forwardDeclarations) { - vector validTypes; - BOOST_FOREACH(const ForwardDeclaration& fwDec, forwardDeclarations) { - validTypes.push_back(fwDec.name); - } - validTypes.push_back("void"); - validTypes.push_back("string"); - validTypes.push_back("int"); - validTypes.push_back("bool"); - validTypes.push_back("char"); - validTypes.push_back("unsigned char"); - validTypes.push_back("size_t"); - validTypes.push_back("double"); - validTypes.push_back("Vector"); - validTypes.push_back("Matrix"); - //Create a list of parsed classes for dependency checking - BOOST_FOREACH(const Class& cls, classes) { - validTypes.push_back(cls.qualifiedName("::")); - } - - return validTypes; -} - -/* ************************************************************************* */ -void Module::WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { - // Generate all collectors - BOOST_FOREACH(const Class& cls, classes) { - const string matlabUniqueName = cls.qualifiedName(), - cppName = cls.qualifiedName("::"); - wrapperFile.oss << "typedef std::set*> " - << "Collector_" << matlabUniqueName << ";\n"; - wrapperFile.oss << "static Collector_" << matlabUniqueName << - " collector_" << matlabUniqueName << ";\n"; - } - - // generate mexAtExit cleanup function - wrapperFile.oss << - "\nvoid _deleteAllObjects()\n" - "{\n" - " mstream mout;\n" // Send stdout to MATLAB console - " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n" - " bool anyDeleted = false;\n"; - BOOST_FOREACH(const Class& cls, classes) { - const string matlabUniqueName = cls.qualifiedName(); - const string cppName = cls.qualifiedName("::"); - const string collectorType = "Collector_" + matlabUniqueName; - const string collectorName = "collector_" + matlabUniqueName; - // The extra curly-braces around the for loops work around a limitation in MSVC (existing - // since 2005!) preventing more than 248 blocks. - wrapperFile.oss << - " { for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n" - " iter != " << collectorName << ".end(); ) {\n" - " delete *iter;\n" - " " << collectorName << ".erase(iter++);\n" - " anyDeleted = true;\n" - " } }\n"; - } - wrapperFile.oss << - " if(anyDeleted)\n" - " cout <<\n" - " \"WARNING: Wrap modules with variables in the workspace have been reloaded due to\\n\"\n" - " \"calling destructors, call 'clear all' again if you plan to now recompile a wrap\\n\"\n" - " \"module, so that your recompiled module is used instead of the old one.\" << endl;\n" - " std::cout.rdbuf(outbuf);\n" // Restore cout - "}\n\n"; -} - -/* ************************************************************************* */ -void Module::WriteRTTIRegistry(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { - wrapperFile.oss << - "void _" << moduleName << "_RTTIRegister() {\n" - " const mxArray *alreadyCreated = mexGetVariablePtr(\"global\", \"gtsam_" + moduleName + "_rttiRegistry_created\");\n" - " if(!alreadyCreated) {\n" - " std::map types;\n"; - BOOST_FOREACH(const Class& cls, classes) { - if(cls.isVirtual) - wrapperFile.oss << - " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName(".") << "\"));\n"; - } - wrapperFile.oss << "\n"; - - wrapperFile.oss << - " mxArray *registry = mexGetVariable(\"global\", \"gtsamwrap_rttiRegistry\");\n" - " if(!registry)\n" - " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" - " typedef std::pair StringPair;\n" - " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" - " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" - " if(fieldId < 0)\n" - " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n" - " mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n" - " }\n" - " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" - " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " mxDestroyArray(registry);\n" - " \n" - " mxArray *newAlreadyCreated = mxCreateNumericMatrix(0, 0, mxINT8_CLASS, mxREAL);\n" - " if(mexPutVariable(\"global\", \"gtsam_" + moduleName + "_rttiRegistry_created\", newAlreadyCreated) != 0)\n" - " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" - " mxDestroyArray(newAlreadyCreated);\n" - " }\n" - "}\n" - "\n"; -} - -/* ************************************************************************* */ + **/ + +#include "Module.h" +#include "FileWriter.h" +#include "TypeAttributesTable.h" +#include "utilities.h" +#include "spirit_actors.h" + +//#define BOOST_SPIRIT_DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace wrap; +using namespace BOOST_SPIRIT_CLASSIC_NS; +namespace bl = boost::lambda; +namespace fs = boost::filesystem; + +typedef rule Rule; + +/* ************************************************************************* */ +// We parse an interface file into a Module object. +// The grammar is defined using the boost/spirit combinatorial parser. +// For example, str_p("const") parses the string "const", and the >> +// operator creates a sequence parser. The grammar below, composed of rules +// and with start rule [class_p], doubles as the specs for our interface files. +/* ************************************************************************* */ + +/* ************************************************************************* */ +void handle_possible_template(vector& classes, const Class& cls, const string& templateArgument, const vector >& instantiations) { + if(instantiations.empty()) { + classes.push_back(cls); + } else { + vector classInstantiations = cls.expandTemplate(templateArgument, instantiations); + BOOST_FOREACH(const Class& c, classInstantiations) { + classes.push_back(c); + } + } +} + +/* ************************************************************************* */ +Module::Module(const string& interfacePath, + const string& moduleName, bool enable_verbose) : name(moduleName), verbose(enable_verbose) +{ + // these variables will be imperatively updated to gradually build [cls] + // The one with postfix 0 are used to reset the variables after parse. + string methodName, methodName0; + bool isConst, isConst0 = false; + ReturnValue retVal0, retVal; + Argument arg0, arg; + ArgumentList args0, args; + vector arg_dup; ///keep track of duplicates + Constructor constructor0(enable_verbose), constructor(enable_verbose); + Deconstructor deconstructor0(enable_verbose), deconstructor(enable_verbose); + StaticMethod static_method0(enable_verbose), static_method(enable_verbose); + Class cls0(enable_verbose),cls(enable_verbose); + GlobalFunction globalFunc0(enable_verbose), globalFunc(enable_verbose); + ForwardDeclaration fwDec0, fwDec; + vector namespaces, /// current namespace tag + namespaces_return; /// namespace for current return type + string templateArgument; + vector templateInstantiationNamespace; + vector > templateInstantiations; + TemplateInstantiationTypedef singleInstantiation, singleInstantiation0; + string include_path = ""; + const string null_str = ""; + + //---------------------------------------------------------------------------- + // Grammar with actions that build the Class object. Actions are + // defined within the square brackets [] and are executed whenever a + // rule is successfully parsed. Define BOOST_SPIRIT_DEBUG to debug. + // The grammar is allows a very restricted C++ header + // lexeme_d turns off white space skipping + // http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/doc/directives.html + // ---------------------------------------------------------------------------- + + Rule comments_p = comment_p("/*", "*/") | comment_p("//", eol_p); + + Rule basisType_p = + (str_p("string") | "bool" | "size_t" | "int" | "double" | "char" | "unsigned char"); + + Rule keywords_p = + (str_p("const") | "static" | "namespace" | basisType_p); + + Rule eigenType_p = + (str_p("Vector") | "Matrix"); + + Rule className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p - keywords_p); + + Rule namespace_name_p = lexeme_d[lower_p >> *(alnum_p | '_')] - keywords_p; + + Rule namespace_arg_p = namespace_name_p[push_back_a(arg.namespaces)] >> str_p("::"); + + Rule argEigenType_p = + eigenType_p[assign_a(arg.type)] >> + !ch_p('*')[assign_a(arg.is_ptr,true)]; + + Rule eigenRef_p = + !str_p("const") [assign_a(arg.is_const,true)] >> + eigenType_p [assign_a(arg.type)] >> + ch_p('&') [assign_a(arg.is_ref,true)]; + + Rule classArg_p = + !str_p("const") [assign_a(arg.is_const,true)] >> + *namespace_arg_p >> + className_p[assign_a(arg.type)] >> + (ch_p('*')[assign_a(arg.is_ptr,true)] | ch_p('&')[assign_a(arg.is_ref,true)]); + + Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; + + Rule classParent_p = + *(namespace_name_p[push_back_a(cls.qualifiedParent)] >> str_p("::")) >> + className_p[push_back_a(cls.qualifiedParent)]; + + Rule templateInstantiation_p = + (*(namespace_name_p[push_back_a(templateInstantiationNamespace)] >> str_p("::")) >> + className_p[push_back_a(templateInstantiationNamespace)]) + [push_back_a(templateInstantiations, templateInstantiationNamespace)] + [clear_a(templateInstantiationNamespace)]; + + Rule templateInstantiations_p = + (str_p("template") >> + '<' >> name_p[assign_a(templateArgument)] >> '=' >> '{' >> + !(templateInstantiation_p >> *(',' >> templateInstantiation_p)) >> + '}' >> '>') + [push_back_a(cls.templateArgs, templateArgument)]; + + Rule templateSingleInstantiationArg_p = + (*(namespace_name_p[push_back_a(templateInstantiationNamespace)] >> str_p("::")) >> + className_p[push_back_a(templateInstantiationNamespace)]) + [push_back_a(singleInstantiation.typeList, templateInstantiationNamespace)] + [clear_a(templateInstantiationNamespace)]; + + Rule templateSingleInstantiation_p = + (str_p("typedef") >> + *(namespace_name_p[push_back_a(singleInstantiation.classNamespaces)] >> str_p("::")) >> + className_p[assign_a(singleInstantiation.className)] >> + '<' >> templateSingleInstantiationArg_p >> *(',' >> templateSingleInstantiationArg_p) >> + '>' >> + className_p[assign_a(singleInstantiation.name)] >> + ';') + [assign_a(singleInstantiation.namespaces, namespaces)] + [push_back_a(templateInstantiationTypedefs, singleInstantiation)] + [assign_a(singleInstantiation, singleInstantiation0)]; + + Rule templateList_p = + (str_p("template") >> + '<' >> name_p[push_back_a(cls.templateArgs)] >> *(',' >> name_p[push_back_a(cls.templateArgs)]) >> + '>'); + + Rule argument_p = + ((basisType_p[assign_a(arg.type)] | argEigenType_p | eigenRef_p | classArg_p) + >> name_p[assign_a(arg.name)]) + [push_back_a(args, arg)] + [assign_a(arg,arg0)]; + + Rule argumentList_p = !argument_p >> * (',' >> argument_p); + + Rule constructor_p = + (className_p >> '(' >> argumentList_p >> ')' >> ';' >> !comments_p) + [push_back_a(constructor.args_list, args)] + [assign_a(args,args0)]; + //[assign_a(constructor.args,args)] + //[assign_a(constructor.name,cls.name)] + //[push_back_a(cls.constructors, constructor)] + //[assign_a(constructor,constructor0)]; + + Rule namespace_ret_p = namespace_name_p[push_back_a(namespaces_return)] >> str_p("::"); + + Rule returnType1_p = + (basisType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::BASIS)]) | + ((*namespace_ret_p)[assign_a(retVal.namespaces1, namespaces_return)][clear_a(namespaces_return)] + >> (className_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::CLASS)]) >> + !ch_p('*')[assign_a(retVal.isPtr1,true)]) | + (eigenType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::EIGEN)]); + + Rule returnType2_p = + (basisType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::BASIS)]) | + ((*namespace_ret_p)[assign_a(retVal.namespaces2, namespaces_return)][clear_a(namespaces_return)] + >> (className_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::CLASS)]) >> + !ch_p('*') [assign_a(retVal.isPtr2,true)]) | + (eigenType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::EIGEN)]); + + Rule pair_p = + (str_p("pair") >> '<' >> returnType1_p >> ',' >> returnType2_p >> '>') + [assign_a(retVal.isPair,true)]; + + Rule void_p = str_p("void")[assign_a(retVal.type1)]; + + Rule returnType_p = void_p | returnType1_p | pair_p; + + Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')]; + + Rule method_p = + (returnType_p >> methodName_p[assign_a(methodName)] >> + '(' >> argumentList_p >> ')' >> + !str_p("const")[assign_a(isConst,true)] >> ';' >> *comments_p) + [bl::bind(&Method::addOverload, + bl::var(cls.methods)[bl::var(methodName)], + verbose, + bl::var(isConst), + bl::var(methodName), + bl::var(args), + bl::var(retVal))] + [assign_a(isConst,isConst0)] + [assign_a(methodName,methodName0)] + [assign_a(args,args0)] + [assign_a(retVal,retVal0)]; + + Rule staticMethodName_p = lexeme_d[(upper_p | lower_p) >> *(alnum_p | '_')]; + + Rule static_method_p = + (str_p("static") >> returnType_p >> staticMethodName_p[assign_a(methodName)] >> + '(' >> argumentList_p >> ')' >> ';' >> *comments_p) + [bl::bind(&StaticMethod::addOverload, + bl::var(cls.static_methods)[bl::var(methodName)], + verbose, + bl::var(methodName), + bl::var(args), + bl::var(retVal))] + [assign_a(methodName,methodName0)] + [assign_a(args,args0)] + [assign_a(retVal,retVal0)]; + + Rule functions_p = constructor_p | method_p | static_method_p; + + Rule class_p = + (str_p("")[assign_a(cls,cls0)]) + >> (!(templateInstantiations_p | templateList_p) + >> !(str_p("virtual")[assign_a(cls.isVirtual, true)]) + >> str_p("class") + >> className_p[assign_a(cls.name)] + >> ((':' >> classParent_p >> '{') | '{') + >> *(functions_p | comments_p) + >> str_p("};")) + [assign_a(constructor.name, cls.name)] + [assign_a(cls.constructor, constructor)] + [assign_a(cls.namespaces, namespaces)] + [assign_a(deconstructor.name,cls.name)] + [assign_a(cls.deconstructor, deconstructor)] + [bl::bind(&handle_possible_template, bl::var(classes), bl::var(cls), bl::var(templateArgument), bl::var(templateInstantiations))] + [assign_a(deconstructor,deconstructor0)] + [assign_a(constructor, constructor0)] + [assign_a(cls,cls0)] + [clear_a(templateArgument)] + [clear_a(templateInstantiations)]; + + Rule global_function_p = + (returnType_p >> staticMethodName_p[assign_a(methodName)] >> + '(' >> argumentList_p >> ')' >> ';' >> *comments_p) + [bl::bind(&GlobalFunction::addOverload, + bl::var(global_functions)[bl::var(methodName)], + verbose, + bl::var(methodName), + bl::var(args), + bl::var(retVal), + bl::var(namespaces))] + [assign_a(methodName,methodName0)] + [assign_a(args,args0)] + [assign_a(retVal,retVal0)]; + + Rule include_p = str_p("#include") >> ch_p('<') >> (*(anychar_p - '>'))[push_back_a(includes)] >> ch_p('>'); + + Rule namespace_def_p = + (str_p("namespace") + >> namespace_name_p[push_back_a(namespaces)] + >> ch_p('{') + >> *(include_p | class_p | templateSingleInstantiation_p | global_function_p | namespace_def_p | comments_p) + >> ch_p('}')) + [pop_a(namespaces)]; + + Rule forward_declaration_p = + !(str_p("virtual")[assign_a(fwDec.isVirtual, true)]) + >> str_p("class") + >> (*(namespace_name_p >> str_p("::")) >> className_p)[assign_a(fwDec.name)] + >> ch_p(';') + [push_back_a(forward_declarations, fwDec)] + [assign_a(fwDec, fwDec0)]; + + Rule module_content_p = comments_p | include_p | class_p | templateSingleInstantiation_p | forward_declaration_p | global_function_p | namespace_def_p; + + Rule module_p = *module_content_p >> !end_p; + + //---------------------------------------------------------------------------- + // for debugging, define BOOST_SPIRIT_DEBUG +# ifdef BOOST_SPIRIT_DEBUG + BOOST_SPIRIT_DEBUG_NODE(className_p); + BOOST_SPIRIT_DEBUG_NODE(classPtr_p); + BOOST_SPIRIT_DEBUG_NODE(classRef_p); + BOOST_SPIRIT_DEBUG_NODE(basisType_p); + BOOST_SPIRIT_DEBUG_NODE(name_p); + BOOST_SPIRIT_DEBUG_NODE(argument_p); + BOOST_SPIRIT_DEBUG_NODE(argumentList_p); + BOOST_SPIRIT_DEBUG_NODE(constructor_p); + BOOST_SPIRIT_DEBUG_NODE(returnType1_p); + BOOST_SPIRIT_DEBUG_NODE(returnType2_p); + BOOST_SPIRIT_DEBUG_NODE(pair_p); + BOOST_SPIRIT_DEBUG_NODE(void_p); + BOOST_SPIRIT_DEBUG_NODE(returnType_p); + BOOST_SPIRIT_DEBUG_NODE(methodName_p); + BOOST_SPIRIT_DEBUG_NODE(method_p); + BOOST_SPIRIT_DEBUG_NODE(class_p); + BOOST_SPIRIT_DEBUG_NODE(namespace_def_p); + BOOST_SPIRIT_DEBUG_NODE(module_p); +# endif + //---------------------------------------------------------------------------- + + // read interface file + string interfaceFile = interfacePath + "/" + moduleName + ".h"; + string contents = file_contents(interfaceFile); + + // and parse contents + parse_info info = parse(contents.c_str(), module_p, space_p); + if(!info.full) { + printf("parsing stopped at \n%.20s\n",info.stop); + throw ParseFailed((int)info.length); + } +} + +/* ************************************************************************* */ +template +void verifyArguments(const vector& validArgs, const map& vt) { + typedef typename map::value_type Name_Method; + BOOST_FOREACH(const Name_Method& name_method, vt) { + const T& t = name_method.second; + BOOST_FOREACH(const ArgumentList& argList, t.argLists) { + BOOST_FOREACH(Argument arg, argList) { + string fullType = arg.qualifiedType("::"); + if(find(validArgs.begin(), validArgs.end(), fullType) + == validArgs.end()) + throw DependencyMissing(fullType, t.name); + } + } + } +} + +/* ************************************************************************* */ +template +void verifyReturnTypes(const vector& validtypes, const map& vt) { + typedef typename map::value_type Name_Method; + BOOST_FOREACH(const Name_Method& name_method, vt) { + const T& t = name_method.second; + BOOST_FOREACH(const ReturnValue& retval, t.returnVals) { + if (find(validtypes.begin(), validtypes.end(), retval.qualifiedType1("::")) == validtypes.end()) + throw DependencyMissing(retval.qualifiedType1("::"), t.name); + if (retval.isPair && find(validtypes.begin(), validtypes.end(), retval.qualifiedType2("::")) == validtypes.end()) + throw DependencyMissing(retval.qualifiedType2("::"), t.name); + } + } +} + +/* ************************************************************************* */ +void Module::generateIncludes(FileWriter& file) const { + + // collect includes + vector all_includes(includes); + + // sort and remove duplicates + sort(all_includes.begin(), all_includes.end()); + vector::const_iterator last_include = unique(all_includes.begin(), all_includes.end()); + vector::const_iterator it = all_includes.begin(); + // add includes to file + for (; it != last_include; ++it) + file.oss << "#include <" << *it << ">" << endl; + file.oss << "\n"; +} + +/* ************************************************************************* */ +void Module::matlab_code(const string& toolboxPath, const string& headerPath) const { + + fs::create_directories(toolboxPath); + + // create the unified .cpp switch file + const string wrapperName = name + "_wrapper"; + string wrapperFileName = toolboxPath + "/" + wrapperName + ".cpp"; + FileWriter wrapperFile(wrapperFileName, verbose, "//"); + vector functionNames; // Function names stored by index for switch + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "#include \n"; + wrapperFile.oss << "\n"; + + // Expand templates - This is done first so that template instantiations are + // counted in the list of valid types, have their attributes and dependencies + // checked, etc. + vector expandedClasses = ExpandTypedefInstantiations(classes, templateInstantiationTypedefs); + + // Dependency check list + vector validTypes = GenerateValidTypes(expandedClasses, forward_declarations); + + // Check that all classes have been defined somewhere + verifyArguments(validTypes, global_functions); + verifyReturnTypes(validTypes, global_functions); + + BOOST_FOREACH(const Class& cls, expandedClasses) { + // verify all of the function arguments + //TODO:verifyArguments(validTypes, cls.constructor.args_list); + verifyArguments(validTypes, cls.static_methods); + verifyArguments(validTypes, cls.methods); + + // verify function return types + verifyReturnTypes(validTypes, cls.static_methods); + verifyReturnTypes(validTypes, cls.methods); + + // verify parents + if(!cls.qualifiedParent.empty() && std::find(validTypes.begin(), validTypes.end(), wrap::qualifiedName("::", cls.qualifiedParent)) == validTypes.end()) + throw DependencyMissing(wrap::qualifiedName("::", cls.qualifiedParent), cls.qualifiedName("::")); + } + + // Create type attributes table and check validity + TypeAttributesTable typeAttributes; + typeAttributes.addClasses(expandedClasses); + typeAttributes.addForwardDeclarations(forward_declarations); + typeAttributes.checkValidity(expandedClasses); + + // Generate includes while avoiding redundant includes + generateIncludes(wrapperFile); + + // create typedef classes - we put this at the top of the wrap file so that collectors and method arguments can use these typedefs + BOOST_FOREACH(const Class& cls, expandedClasses) { + if(!cls.typedefName.empty()) + wrapperFile.oss << cls.getTypedef() << "\n"; + } + wrapperFile.oss << "\n"; + + // Generate collectors and cleanup function to be called from mexAtExit + WriteCollectorsAndCleanupFcn(wrapperFile, name, expandedClasses); + + // generate RTTI registry (for returning derived-most types) + WriteRTTIRegistry(wrapperFile, name, expandedClasses); + + // create proxy class and wrapper code + BOOST_FOREACH(const Class& cls, expandedClasses) { + cls.matlab_proxy(toolboxPath, wrapperName, typeAttributes, wrapperFile, functionNames); + } + + // create matlab files and wrapper code for global functions + BOOST_FOREACH(const GlobalFunctions::value_type& p, global_functions) { + p.second.matlab_proxy(toolboxPath, wrapperName, typeAttributes, wrapperFile, functionNames); + } + + // finish wrapper file + wrapperFile.oss << "\n"; + finish_wrapper(wrapperFile, functionNames); + + wrapperFile.emit(true); + } + +/* ************************************************************************* */ + void Module::finish_wrapper(FileWriter& file, const std::vector& functionNames) const { + file.oss << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; + file.oss << "{\n"; + file.oss << " mstream mout;\n"; // Send stdout to MATLAB console + file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n"; + file.oss << " _" << name << "_RTTIRegister();\n\n"; + file.oss << " int id = unwrap(in[0]);\n\n"; + file.oss << " try {\n"; + file.oss << " switch(id) {\n"; + for(size_t id = 0; id < functionNames.size(); ++id) { + file.oss << " case " << id << ":\n"; + file.oss << " " << functionNames[id] << "(nargout, out, nargin-1, in+1);\n"; + file.oss << " break;\n"; + } + file.oss << " }\n"; + file.oss << " } catch(const std::exception& e) {\n"; + file.oss << " mexErrMsgTxt((\"Exception from gtsam:\\n\" + std::string(e.what()) + \"\\n\").c_str());\n"; + file.oss << " }\n"; + file.oss << "\n"; + file.oss << " std::cout.rdbuf(outbuf);\n"; // Restore cout + file.oss << "}\n"; + } + +/* ************************************************************************* */ +vector Module::ExpandTypedefInstantiations(const vector& classes, const vector instantiations) { + + vector expandedClasses = classes; + + BOOST_FOREACH(const TemplateInstantiationTypedef& inst, instantiations) { + // Add the new class to the list + expandedClasses.push_back(inst.findAndExpand(classes)); + } + + // Remove all template classes + for(size_t i = 0; i < expandedClasses.size(); ++i) + if(!expandedClasses[size_t(i)].templateArgs.empty()) { + expandedClasses.erase(expandedClasses.begin() + size_t(i)); + -- i; + } + + return expandedClasses; +} + +/* ************************************************************************* */ +vector Module::GenerateValidTypes(const vector& classes, const vector forwardDeclarations) { + vector validTypes; + BOOST_FOREACH(const ForwardDeclaration& fwDec, forwardDeclarations) { + validTypes.push_back(fwDec.name); + } + validTypes.push_back("void"); + validTypes.push_back("string"); + validTypes.push_back("int"); + validTypes.push_back("bool"); + validTypes.push_back("char"); + validTypes.push_back("unsigned char"); + validTypes.push_back("size_t"); + validTypes.push_back("double"); + validTypes.push_back("Vector"); + validTypes.push_back("Matrix"); + //Create a list of parsed classes for dependency checking + BOOST_FOREACH(const Class& cls, classes) { + validTypes.push_back(cls.qualifiedName("::")); + } + + return validTypes; +} + +/* ************************************************************************* */ +void Module::WriteCollectorsAndCleanupFcn(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { + // Generate all collectors + BOOST_FOREACH(const Class& cls, classes) { + const string matlabUniqueName = cls.qualifiedName(), + cppName = cls.qualifiedName("::"); + wrapperFile.oss << "typedef std::set*> " + << "Collector_" << matlabUniqueName << ";\n"; + wrapperFile.oss << "static Collector_" << matlabUniqueName << + " collector_" << matlabUniqueName << ";\n"; + } + + // generate mexAtExit cleanup function + wrapperFile.oss << + "\nvoid _deleteAllObjects()\n" + "{\n" + " mstream mout;\n" // Send stdout to MATLAB console + " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n" + " bool anyDeleted = false;\n"; + BOOST_FOREACH(const Class& cls, classes) { + const string matlabUniqueName = cls.qualifiedName(); + const string cppName = cls.qualifiedName("::"); + const string collectorType = "Collector_" + matlabUniqueName; + const string collectorName = "collector_" + matlabUniqueName; + // The extra curly-braces around the for loops work around a limitation in MSVC (existing + // since 2005!) preventing more than 248 blocks. + wrapperFile.oss << + " { for(" << collectorType << "::iterator iter = " << collectorName << ".begin();\n" + " iter != " << collectorName << ".end(); ) {\n" + " delete *iter;\n" + " " << collectorName << ".erase(iter++);\n" + " anyDeleted = true;\n" + " } }\n"; + } + wrapperFile.oss << + " if(anyDeleted)\n" + " cout <<\n" + " \"WARNING: Wrap modules with variables in the workspace have been reloaded due to\\n\"\n" + " \"calling destructors, call 'clear all' again if you plan to now recompile a wrap\\n\"\n" + " \"module, so that your recompiled module is used instead of the old one.\" << endl;\n" + " std::cout.rdbuf(outbuf);\n" // Restore cout + "}\n\n"; +} + +/* ************************************************************************* */ +void Module::WriteRTTIRegistry(FileWriter& wrapperFile, const std::string& moduleName, const std::vector& classes) { + wrapperFile.oss << + "void _" << moduleName << "_RTTIRegister() {\n" + " const mxArray *alreadyCreated = mexGetVariablePtr(\"global\", \"gtsam_" + moduleName + "_rttiRegistry_created\");\n" + " if(!alreadyCreated) {\n" + " std::map types;\n"; + BOOST_FOREACH(const Class& cls, classes) { + if(cls.isVirtual) + wrapperFile.oss << + " types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName(".") << "\"));\n"; + } + wrapperFile.oss << "\n"; + + wrapperFile.oss << + " mxArray *registry = mexGetVariable(\"global\", \"gtsamwrap_rttiRegistry\");\n" + " if(!registry)\n" + " registry = mxCreateStructMatrix(1, 1, 0, NULL);\n" + " typedef std::pair StringPair;\n" + " BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n" + " int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n" + " if(fieldId < 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n" + " mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n" + " }\n" + " if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxDestroyArray(registry);\n" + " \n" + " mxArray *newAlreadyCreated = mxCreateNumericMatrix(0, 0, mxINT8_CLASS, mxREAL);\n" + " if(mexPutVariable(\"global\", \"gtsam_" + moduleName + "_rttiRegistry_created\", newAlreadyCreated) != 0)\n" + " mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n" + " mxDestroyArray(newAlreadyCreated);\n" + " }\n" + "}\n" + "\n"; +} + +/* ************************************************************************* */ diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 61b54434c..d4c7d8a1d 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -50,6 +50,24 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); proxyFile.oss << " function varargout = " << upperName << "(varargin)\n"; + proxyFile.oss << " % " << name << " See GTSAM Doc for detailed info." << endl; + proxyFile.oss << " % " << "" << endl; + proxyFile.oss << " % " << "Method Overloads" << endl; + BOOST_FOREACH(ArgumentList argList, argLists) + { + proxyFile.oss << " % " << name << "("; + int i = 0; + BOOST_FOREACH(const Argument& arg, argList) + { + if(i != argList.size()-1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } + proxyFile.oss << ")" << endl; + } + for(size_t overload = 0; overload < argLists.size(); ++overload) { const ArgumentList& args = argLists[overload]; From c3e615b2dfebe9a2fd2bfa14b298770e00db1426 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 27 Aug 2012 15:30:47 +0000 Subject: [PATCH 818/914] Added doxygen info to wrap commenting system --- wrap/Class.cpp | 3 +++ wrap/Method.cpp | 3 ++- wrap/StaticMethod.cpp | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index e61e06ec2..652753cc0 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -380,5 +380,8 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << ")" << endl; } } + + proxyFile.oss << "%" << "" << endl; + proxyFile.oss << "%" << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; } /* ************************************************************************* */ diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 1fe6b022b..60a9f00e3 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -47,7 +47,8 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF proxyFile.oss << " function varargout = " << name << "(this, varargin)\n"; //Comments for documentation - proxyFile.oss << " % " << name << " See GTSAM Doc for detailed info." << endl; + proxyFile.oss << " % " << name << " See GTSAM Doxygen html for detailed info." << endl; + proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; proxyFile.oss << " % " << "Method Overloads" << endl; BOOST_FOREACH(ArgumentList argList, argLists) diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index d4c7d8a1d..b2c757e96 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -50,7 +50,8 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); proxyFile.oss << " function varargout = " << upperName << "(varargin)\n"; - proxyFile.oss << " % " << name << " See GTSAM Doc for detailed info." << endl; + proxyFile.oss << " % " << name << " See GTSAM Doxygen html for detailed info." << endl; + proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; proxyFile.oss << " % " << "Method Overloads" << endl; BOOST_FOREACH(ArgumentList argList, argLists) From 878c79f265c050ddc0dea9169e6de57abd400141 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 27 Aug 2012 16:51:52 +0000 Subject: [PATCH 819/914] Reworked PoseRotationPrior with better tests and no dependence on PartialPriorFactor --- .cproject | 338 +++++++++--------- gtsam_unstable/slam/PoseRotationPrior.h | 87 +++-- .../slam/tests/testPoseRotationPrior.cpp | 83 +++-- .../slam/tests/testPoseTranslationPrior.cpp | 16 +- 4 files changed, 292 insertions(+), 232 deletions(-) diff --git a/.cproject b/.cproject index 80a7c399e..95c0f2a96 100644 --- a/.cproject +++ b/.cproject @@ -309,6 +309,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -335,7 +343,6 @@ make - tests/testBayesTree.run true false @@ -343,7 +350,6 @@ make - testBinaryBayesNet.run true false @@ -391,7 +397,6 @@ make - testSymbolicBayesNet.run true false @@ -399,7 +404,6 @@ make - tests/testSymbolicFactor.run true false @@ -407,7 +411,6 @@ make - testSymbolicFactorGraph.run true false @@ -423,20 +426,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -525,22 +519,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -557,6 +535,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -581,26 +575,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -685,26 +679,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -797,6 +791,14 @@ true true + + make + -j5 + testPoseRotationPrior.run + true + true + true + make -j5 @@ -983,7 +985,6 @@ make - testGraph.run true false @@ -991,7 +992,6 @@ make - testJunctionTree.run true false @@ -999,7 +999,6 @@ make - testSymbolicBayesNetB.run true false @@ -1135,7 +1134,6 @@ make - testErrors.run true false @@ -1181,10 +1179,10 @@ true true - + make - -j5 - testLinearContainerFactor.run + -j2 + testGaussianFactor.run true true true @@ -1269,10 +1267,10 @@ true true - + make - -j2 - testGaussianFactor.run + -j5 + testLinearContainerFactor.run true true true @@ -1607,6 +1605,7 @@ make + testSimulated2DOriented.run true false @@ -1646,6 +1645,7 @@ make + testSimulated2D.run true false @@ -1653,6 +1653,7 @@ make + testSimulated3D.run true false @@ -1844,6 +1845,7 @@ make + tests/testGaussianISAM2 true false @@ -1865,6 +1867,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j1 @@ -2066,7 +2164,6 @@ cpack - -G DEB true false @@ -2074,7 +2171,6 @@ cpack - -G RPM true false @@ -2082,7 +2178,6 @@ cpack - -G TGZ true false @@ -2090,7 +2185,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2224,98 +2318,34 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2359,38 +2389,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/gtsam_unstable/slam/PoseRotationPrior.h b/gtsam_unstable/slam/PoseRotationPrior.h index d6efc0cc4..60a29b3e4 100644 --- a/gtsam_unstable/slam/PoseRotationPrior.h +++ b/gtsam_unstable/slam/PoseRotationPrior.h @@ -9,63 +9,82 @@ #pragma once -#include -#include +#include namespace gtsam { template -class PoseRotationPrior : public PartialPriorFactor { +class PoseRotationPrior : public NoiseModelFactor1 { public: typedef PoseRotationPrior This; - typedef PartialPriorFactor Base; + typedef NoiseModelFactor1 Base; typedef POSE Pose; + typedef typename POSE::Translation Translation; typedef typename POSE::Rotation Rotation; GTSAM_CONCEPT_POSE_TYPE(Pose) GTSAM_CONCEPT_GROUP_TYPE(Pose) GTSAM_CONCEPT_LIE_TYPE(Rotation) +protected: + + Rotation measured_; + +public: + /** standard constructor */ PoseRotationPrior(Key key, const Rotation& rot_z, const SharedNoiseModel& model) - : Base(key, model) { - initialize(rot_z); - } + : Base(model, key), measured_(rot_z) {} /** Constructor that pulls the translation from an incoming POSE */ PoseRotationPrior(Key key, const POSE& pose_z, const SharedNoiseModel& model) - : Base(key, model) { - initialize(pose_z.rotation()); + : Base(model, key), measured_(pose_z.rotation()) {} + + virtual ~PoseRotationPrior() {} + + // access + const Rotation& measured() const { return measured_; } + + // testable + + /** equals specialized to this factor */ + virtual bool equals(const NonlinearFactor& expected, double tol=1e-9) const { + const This *e = dynamic_cast (&expected); + return e != NULL && Base::equals(*e, tol) && measured_.equals(e->measured_, tol); } - /** get the rotation used to create the measurement */ - Rotation priorRotation() const { return Rotation::Expmap(this->prior_); } - -protected: - /** loads the underlying partial prior factor */ - void initialize(const Rotation& rot_z) { - assert(rot_z.dim() == this->noiseModel_->dim()); - - // Calculate the prior applied - this->prior_ = Rotation::Logmap(rot_z); - - // Create the mask for partial prior - size_t pose_dim = Pose::identity().dim(); - size_t rot_dim = rot_z.dim(); - - // get the interval of the lie coordinates corresponding to rotation - std::pair interval = Pose::rotationInterval(); - - std::vector mask; - for (size_t i=interval.first; i<=interval.second; ++i) - mask.push_back(i); - this->mask_ = mask; - - this->H_ = zeros(rot_dim, pose_dim); - this->fillH(); + /** print contents */ + void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { + Base::print(s + "PoseRotationPrior", keyFormatter); + measured_.print("Measured Rotation"); } + /** h(x)-z */ + Vector evaluateError(const Pose& pose, boost::optional H = boost::none) const { + const Rotation& newR = pose.rotation(); + const size_t rDim = newR.dim(), xDim = pose.dim(); + if (H) { + *H = gtsam::zeros(rDim, xDim); + if (pose_traits::isRotFirst()) + (*H).leftCols(rDim) = eye(rDim); + else + (*H).rightCols(rDim) = eye(rDim); + } + + return Rotation::Logmap(newR) - Rotation::Logmap(measured_); + } + +private: + + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("NoiseModelFactor1", + boost::serialization::base_object(*this)); + ar & BOOST_SERIALIZATION_NVP(measured_); + } }; } // \namespace gtsam diff --git a/gtsam_unstable/slam/tests/testPoseRotationPrior.cpp b/gtsam_unstable/slam/tests/testPoseRotationPrior.cpp index cdded40e7..2f60e114a 100644 --- a/gtsam_unstable/slam/tests/testPoseRotationPrior.cpp +++ b/gtsam_unstable/slam/tests/testPoseRotationPrior.cpp @@ -9,42 +9,85 @@ #include +#include + #include #include #include -#include - -#include using namespace gtsam; -Key x1 = symbol_shorthand::X(1); - const SharedNoiseModel model1 = noiseModel::Diagonal::Sigmas(Vector_(1, 0.1)); const SharedNoiseModel model3 = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.2, 0.3)); -/* ************************************************************************* */ -TEST( testPoseRotationPrior, planar) { +typedef PoseRotationPrior Pose2RotationPrior; +typedef PoseRotationPrior Pose3RotationPrior; - typedef PoseRotationPrior PlanarRPrior; - PlanarRPrior actRprior(x1, Rot2::fromDegrees(30.0), model1); - EXPECT(assert_equal(Rot2::fromDegrees(30.0), actRprior.priorRotation())); - Matrix expH(1,3); expH << 0.0, 0.0, 1.0; - EXPECT(assert_equal(expH, actRprior.H())); +const double tol = 1e-5; + +const gtsam::Key poseKey = 1; + +// Pose3 examples +const Point3 point3A(1.0, 2.0, 3.0), point3B(4.0, 6.0, 8.0); +const Rot3 rot3A, rot3B = Rot3::pitch(-M_PI_2), rot3C = Rot3::Expmap(Vector_(3, 0.1, 0.2, 0.3)); + +// Pose2 examples +const Point2 point2A(1.0, 2.0), point2B(4.0, 6.0); +const Rot2 rot2A, rot2B = Rot2::fromAngle(M_PI_2); + +/* ************************************************************************* */ +LieVector evalFactorError3(const Pose3RotationPrior& factor, const Pose3& x) { + return LieVector(factor.evaluateError(x)); } /* ************************************************************************* */ -TEST( testPoseRotationPrior, visual) { +LieVector evalFactorError2(const Pose2RotationPrior& factor, const Pose2& x) { + return LieVector(factor.evaluateError(x)); +} - typedef PoseRotationPrior VisualRPrior; - VisualRPrior actPose3Rprior(x1, Rot3::RzRyRx(0.1, 0.2, 0.3), model3); - EXPECT(assert_equal(Rot3::RzRyRx(0.1, 0.2, 0.3), actPose3Rprior.priorRotation())); - Matrix expH(3,6); expH << eye(3,3), zeros(3,3); - EXPECT(assert_equal(expH, actPose3Rprior.H())); +/* ************************************************************************* */ +TEST( testPoseRotationFactor, level3_zero_error ) { + Pose3 pose1(rot3A, point3A); + Pose3RotationPrior factor(poseKey, rot3A, model3); + Matrix actH1; + EXPECT(assert_equal(zero(3), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} -// typedef testPoseRotationPrior CamRPrior; -// CamRPrior actCamRprior(x1, Rot3::RzRyRx(0.1, 0.2, 0.3), model3); +/* ************************************************************************* */ +TEST( testPoseRotationFactor, level3_error ) { + Pose3 pose1(rot3A, point3A); + Pose3RotationPrior factor(poseKey, rot3C, model3); + Matrix actH1; + EXPECT(assert_equal(Vector_(3,-0.1,-0.2,-0.3), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError3, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testPoseRotationFactor, level2_zero_error ) { + Pose2 pose1(rot2A, point2A); + Pose2RotationPrior factor(poseKey, rot2A, model1); + Matrix actH1; + EXPECT(assert_equal(zero(1), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError2, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); +} + +/* ************************************************************************* */ +TEST( testPoseRotationFactor, level2_error ) { + Pose2 pose1(rot2A, point2A); + Pose2RotationPrior factor(poseKey, rot2B, model1); + Matrix actH1; + EXPECT(assert_equal(Vector_(1,-M_PI_2), factor.evaluateError(pose1, actH1))); + Matrix expH1 = numericalDerivative11( + boost::bind(evalFactorError2, factor, _1), pose1, 1e-5); + EXPECT(assert_equal(expH1, actH1, tol)); } /* ************************************************************************* */ diff --git a/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp b/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp index 0821e566b..9e11555ee 100644 --- a/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp +++ b/gtsam_unstable/slam/tests/testPoseTranslationPrior.cpp @@ -44,7 +44,7 @@ LieVector evalFactorError2(const Pose2TranslationPrior& factor, const Pose2& x) } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, level3_zero_error ) { +TEST( testPoseTranslationFactor, level3_zero_error ) { Pose3 pose1(rot3A, point3A); Pose3TranslationPrior factor(poseKey, point3A, model3); Matrix actH1; @@ -55,7 +55,7 @@ TEST( testRelativeElevationFactor, level3_zero_error ) { } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, level3_error ) { +TEST( testPoseTranslationFactor, level3_error ) { Pose3 pose1(rot3A, point3A); Pose3TranslationPrior factor(poseKey, point3B, model3); Matrix actH1; @@ -66,7 +66,7 @@ TEST( testRelativeElevationFactor, level3_error ) { } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, pitched3_zero_error ) { +TEST( testPoseTranslationFactor, pitched3_zero_error ) { Pose3 pose1(rot3B, point3A); Pose3TranslationPrior factor(poseKey, point3A, model3); Matrix actH1; @@ -77,7 +77,7 @@ TEST( testRelativeElevationFactor, pitched3_zero_error ) { } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, pitched3_error ) { +TEST( testPoseTranslationFactor, pitched3_error ) { Pose3 pose1(rot3B, point3A); Pose3TranslationPrior factor(poseKey, point3B, model3); Matrix actH1; @@ -88,7 +88,7 @@ TEST( testRelativeElevationFactor, pitched3_error ) { } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, smallrot3_zero_error ) { +TEST( testPoseTranslationFactor, smallrot3_zero_error ) { Pose3 pose1(rot3C, point3A); Pose3TranslationPrior factor(poseKey, point3A, model3); Matrix actH1; @@ -99,7 +99,7 @@ TEST( testRelativeElevationFactor, smallrot3_zero_error ) { } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, smallrot3_error ) { +TEST( testPoseTranslationFactor, smallrot3_error ) { Pose3 pose1(rot3C, point3A); Pose3TranslationPrior factor(poseKey, point3B, model3); Matrix actH1; @@ -110,7 +110,7 @@ TEST( testRelativeElevationFactor, smallrot3_error ) { } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, level2_zero_error ) { +TEST( testPoseTranslationFactor, level2_zero_error ) { Pose2 pose1(rot2A, point2A); Pose2TranslationPrior factor(poseKey, point2A, model2); Matrix actH1; @@ -121,7 +121,7 @@ TEST( testRelativeElevationFactor, level2_zero_error ) { } /* ************************************************************************* */ -TEST( testRelativeElevationFactor, level2_error ) { +TEST( testPoseTranslationFactor, level2_error ) { Pose2 pose1(rot2A, point2A); Pose2TranslationPrior factor(poseKey, point2B, model2); Matrix actH1; From a6545b4e010e8c4fb946eea7da0bb13864027b2e Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 27 Aug 2012 17:54:25 +0000 Subject: [PATCH 820/914] Fixed wrap tests and changed comments --- wrap/Class.cpp | 2 +- wrap/Method.cpp | 17 ++- wrap/StaticMethod.cpp | 18 ++- wrap/tests/expected/Point2.m | 50 ++++++- wrap/tests/expected/Point3.m | 25 +++- wrap/tests/expected/Test.m | 122 +++++++++++++++++- wrap/tests/expected/aGlobalFunction.m | 1 - wrap/tests/expected/geometry_wrapper.cpp | 1 - wrap/tests/expected_namespaces/ClassD.m | 7 +- .../testNamespaces_wrapper.cpp | 1 - 10 files changed, 234 insertions(+), 10 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 652753cc0..44aa6a1bd 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -382,6 +382,6 @@ void Class::comment_fragment(FileWriter& proxyFile) const } proxyFile.oss << "%" << "" << endl; - proxyFile.oss << "%" << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; + proxyFile.oss << "%" << "For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; } /* ************************************************************************* */ diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 60a9f00e3..5f60d6a36 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -47,7 +47,22 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF proxyFile.oss << " function varargout = " << name << "(this, varargin)\n"; //Comments for documentation - proxyFile.oss << " % " << name << " See GTSAM Doxygen html for detailed info." << endl; + proxyFile.oss << " % " << name << " "; + BOOST_FOREACH(ArgumentList argList, argLists) + { + proxyFile.oss << " " << name << "("; + int i = 0; + BOOST_FOREACH(const Argument& arg, argList) + { + if(i != argList.size()-1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } + proxyFile.oss << ") : "; + } + proxyFile.oss << endl; proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; proxyFile.oss << " % " << "Method Overloads" << endl; diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index b2c757e96..c232739be 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -50,7 +50,23 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); proxyFile.oss << " function varargout = " << upperName << "(varargin)\n"; - proxyFile.oss << " % " << name << " See GTSAM Doxygen html for detailed info." << endl; + //Comments for documentation + proxyFile.oss << " % " << name << " "; + BOOST_FOREACH(ArgumentList argList, argLists) + { + proxyFile.oss << " " << name << "("; + int i = 0; + BOOST_FOREACH(const Argument& arg, argList) + { + if(i != argList.size()-1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } + proxyFile.oss << ") : "; + } + proxyFile.oss << endl; proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; proxyFile.oss << " % " << "Method Overloads" << endl; diff --git a/wrap/tests/expected/Point2.m b/wrap/tests/expected/Point2.m index f23e15eb4..8a2718377 100644 --- a/wrap/tests/expected/Point2.m +++ b/wrap/tests/expected/Point2.m @@ -1,4 +1,17 @@ -% automatically generated by wrap +%-------Constructors------- +%Point2() +%Point2(double x, double y) +%-------Methods------- +%argChar(char a) +%argUChar(unsigned char a) +%dim() +%returnChar() +%vectorConfusion() +%x() +%y() +%-------Static Methods------- +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Point2 < handle properties ptr_Point2 = 0 @@ -27,6 +40,11 @@ classdef Point2 < handle function disp(obj), obj.display; end function varargout = argChar(this, varargin) + % argChar argChar(char a) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % argChar(char a) if length(varargin) == 1 && isa(varargin{1},'char') geometry_wrapper(4, this, varargin{:}); else @@ -35,6 +53,11 @@ classdef Point2 < handle end function varargout = argUChar(this, varargin) + % argUChar argUChar(unsigned char a) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % argUChar(unsigned char a) if length(varargin) == 1 && isa(varargin{1},'char') geometry_wrapper(5, this, varargin{:}); else @@ -43,6 +66,11 @@ classdef Point2 < handle end function varargout = dim(this, varargin) + % dim dim() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % dim() if length(varargin) == 0 varargout{1} = geometry_wrapper(6, this, varargin{:}); else @@ -51,6 +79,11 @@ classdef Point2 < handle end function varargout = returnChar(this, varargin) + % returnChar returnChar() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % returnChar() if length(varargin) == 0 varargout{1} = geometry_wrapper(7, this, varargin{:}); else @@ -59,6 +92,11 @@ classdef Point2 < handle end function varargout = vectorConfusion(this, varargin) + % vectorConfusion vectorConfusion() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % vectorConfusion() if length(varargin) == 0 varargout{1} = geometry_wrapper(8, this, varargin{:}); else @@ -67,6 +105,11 @@ classdef Point2 < handle end function varargout = x(this, varargin) + % x x() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % x() if length(varargin) == 0 varargout{1} = geometry_wrapper(9, this, varargin{:}); else @@ -75,6 +118,11 @@ classdef Point2 < handle end function varargout = y(this, varargin) + % y y() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % y() if length(varargin) == 0 varargout{1} = geometry_wrapper(10, this, varargin{:}); else diff --git a/wrap/tests/expected/Point3.m b/wrap/tests/expected/Point3.m index 773ebefc0..4cd50f4d5 100644 --- a/wrap/tests/expected/Point3.m +++ b/wrap/tests/expected/Point3.m @@ -1,4 +1,12 @@ -% automatically generated by wrap +%-------Constructors------- +%Point3(double x, double y, double z) +%-------Methods------- +%norm() +%-------Static Methods------- +%StaticFunctionRet(double z) +%staticFunction() +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Point3 < handle properties ptr_Point3 = 0 @@ -25,6 +33,11 @@ classdef Point3 < handle function disp(obj), obj.display; end function varargout = norm(this, varargin) + % norm norm() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % norm() if length(varargin) == 0 varargout{1} = geometry_wrapper(14, this, varargin{:}); else @@ -36,6 +49,11 @@ classdef Point3 < handle methods(Static = true) function varargout = StaticFunctionRet(varargin) + % StaticFunctionRet StaticFunctionRet(double z) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % StaticFunctionRet(double z) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = geometry_wrapper(15, varargin{:}); else @@ -44,6 +62,11 @@ classdef Point3 < handle end function varargout = StaticFunction(varargin) + % staticFunction staticFunction() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % staticFunction() if length(varargin) == 0 varargout{1} = geometry_wrapper(16, varargin{:}); else diff --git a/wrap/tests/expected/Test.m b/wrap/tests/expected/Test.m index f36c8eb30..4ce501fb0 100644 --- a/wrap/tests/expected/Test.m +++ b/wrap/tests/expected/Test.m @@ -1,4 +1,29 @@ -% automatically generated by wrap +%-------Constructors------- +%Test() +%Test(double a, Matrix b) +%-------Methods------- +%arg_EigenConstRef(Matrix value) +%create_MixedPtrs() +%create_ptrs() +%print() +%return_Point2Ptr(bool value) +%return_Test(Test value) +%return_TestPtr(Test value) +%return_bool(bool value) +%return_double(double value) +%return_field(Test t) +%return_int(int value) +%return_matrix1(Matrix value) +%return_matrix2(Matrix value) +%return_pair(Vector v, Matrix A) +%return_ptrs(Test p1, Test p2) +%return_size_t(size_t value) +%return_string(string value) +%return_vector1(Vector value) +%return_vector2(Vector value) +%-------Static Methods------- +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Test < handle properties ptr_Test = 0 @@ -27,6 +52,11 @@ classdef Test < handle function disp(obj), obj.display; end function varargout = arg_EigenConstRef(this, varargin) + % arg_EigenConstRef arg_EigenConstRef(Matrix value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % arg_EigenConstRef(Matrix value) if length(varargin) == 1 && isa(varargin{1},'double') geometry_wrapper(21, this, varargin{:}); else @@ -35,6 +65,11 @@ classdef Test < handle end function varargout = create_MixedPtrs(this, varargin) + % create_MixedPtrs create_MixedPtrs() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % create_MixedPtrs() if length(varargin) == 0 [ varargout{1} varargout{2} ] = geometry_wrapper(22, this, varargin{:}); else @@ -43,6 +78,11 @@ classdef Test < handle end function varargout = create_ptrs(this, varargin) + % create_ptrs create_ptrs() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % create_ptrs() if length(varargin) == 0 [ varargout{1} varargout{2} ] = geometry_wrapper(23, this, varargin{:}); else @@ -51,6 +91,11 @@ classdef Test < handle end function varargout = print(this, varargin) + % print print() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % print() if length(varargin) == 0 geometry_wrapper(24, this, varargin{:}); else @@ -59,6 +104,11 @@ classdef Test < handle end function varargout = return_Point2Ptr(this, varargin) + % return_Point2Ptr return_Point2Ptr(bool value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_Point2Ptr(bool value) if length(varargin) == 1 && isa(varargin{1},'logical') varargout{1} = geometry_wrapper(25, this, varargin{:}); else @@ -67,6 +117,11 @@ classdef Test < handle end function varargout = return_Test(this, varargin) + % return_Test return_Test(Test value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_Test(Test value) if length(varargin) == 1 && isa(varargin{1},'Test') varargout{1} = geometry_wrapper(26, this, varargin{:}); else @@ -75,6 +130,11 @@ classdef Test < handle end function varargout = return_TestPtr(this, varargin) + % return_TestPtr return_TestPtr(Test value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_TestPtr(Test value) if length(varargin) == 1 && isa(varargin{1},'Test') varargout{1} = geometry_wrapper(27, this, varargin{:}); else @@ -83,6 +143,11 @@ classdef Test < handle end function varargout = return_bool(this, varargin) + % return_bool return_bool(bool value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_bool(bool value) if length(varargin) == 1 && isa(varargin{1},'logical') varargout{1} = geometry_wrapper(28, this, varargin{:}); else @@ -91,6 +156,11 @@ classdef Test < handle end function varargout = return_double(this, varargin) + % return_double return_double(double value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_double(double value) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = geometry_wrapper(29, this, varargin{:}); else @@ -99,6 +169,11 @@ classdef Test < handle end function varargout = return_field(this, varargin) + % return_field return_field(Test t) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_field(Test t) if length(varargin) == 1 && isa(varargin{1},'Test') varargout{1} = geometry_wrapper(30, this, varargin{:}); else @@ -107,6 +182,11 @@ classdef Test < handle end function varargout = return_int(this, varargin) + % return_int return_int(int value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_int(int value) if length(varargin) == 1 && isa(varargin{1},'numeric') varargout{1} = geometry_wrapper(31, this, varargin{:}); else @@ -115,6 +195,11 @@ classdef Test < handle end function varargout = return_matrix1(this, varargin) + % return_matrix1 return_matrix1(Matrix value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_matrix1(Matrix value) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = geometry_wrapper(32, this, varargin{:}); else @@ -123,6 +208,11 @@ classdef Test < handle end function varargout = return_matrix2(this, varargin) + % return_matrix2 return_matrix2(Matrix value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_matrix2(Matrix value) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = geometry_wrapper(33, this, varargin{:}); else @@ -131,6 +221,11 @@ classdef Test < handle end function varargout = return_pair(this, varargin) + % return_pair return_pair(Vector v, Matrix A) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_pair(Vector v, Matrix A) if length(varargin) == 2 && isa(varargin{1},'double') && isa(varargin{2},'double') [ varargout{1} varargout{2} ] = geometry_wrapper(34, this, varargin{:}); else @@ -139,6 +234,11 @@ classdef Test < handle end function varargout = return_ptrs(this, varargin) + % return_ptrs return_ptrs(Test p1, Test p2) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_ptrs(Test p1, Test p2) if length(varargin) == 2 && isa(varargin{1},'Test') && isa(varargin{2},'Test') [ varargout{1} varargout{2} ] = geometry_wrapper(35, this, varargin{:}); else @@ -147,6 +247,11 @@ classdef Test < handle end function varargout = return_size_t(this, varargin) + % return_size_t return_size_t(size_t value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_size_t(size_t value) if length(varargin) == 1 && isa(varargin{1},'numeric') varargout{1} = geometry_wrapper(36, this, varargin{:}); else @@ -155,6 +260,11 @@ classdef Test < handle end function varargout = return_string(this, varargin) + % return_string return_string(string value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_string(string value) if length(varargin) == 1 && isa(varargin{1},'char') varargout{1} = geometry_wrapper(37, this, varargin{:}); else @@ -163,6 +273,11 @@ classdef Test < handle end function varargout = return_vector1(this, varargin) + % return_vector1 return_vector1(Vector value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_vector1(Vector value) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = geometry_wrapper(38, this, varargin{:}); else @@ -171,6 +286,11 @@ classdef Test < handle end function varargout = return_vector2(this, varargin) + % return_vector2 return_vector2(Vector value) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % return_vector2(Vector value) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = geometry_wrapper(39, this, varargin{:}); else diff --git a/wrap/tests/expected/aGlobalFunction.m b/wrap/tests/expected/aGlobalFunction.m index 80d6b1f6b..cee69491c 100644 --- a/wrap/tests/expected/aGlobalFunction.m +++ b/wrap/tests/expected/aGlobalFunction.m @@ -1,4 +1,3 @@ -% automatically generated by wrap function varargout = aGlobalFunction(varargin) if length(varargin) == 0 varargout{1} = geometry_wrapper(40, varargin{:}); diff --git a/wrap/tests/expected/geometry_wrapper.cpp b/wrap/tests/expected/geometry_wrapper.cpp index 443795e5e..ad1df801c 100644 --- a/wrap/tests/expected/geometry_wrapper.cpp +++ b/wrap/tests/expected/geometry_wrapper.cpp @@ -1,4 +1,3 @@ -// automatically generated by wrap #include #include #include diff --git a/wrap/tests/expected_namespaces/ClassD.m b/wrap/tests/expected_namespaces/ClassD.m index 3fb8d4837..98a4df3a6 100644 --- a/wrap/tests/expected_namespaces/ClassD.m +++ b/wrap/tests/expected_namespaces/ClassD.m @@ -1,4 +1,9 @@ -% automatically generated by wrap +%-------Constructors------- +%ClassD() +%-------Methods------- +%-------Static Methods------- +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassD < handle properties ptr_ClassD = 0 diff --git a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp index 1a31c4b90..29739a2f6 100644 --- a/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp +++ b/wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp @@ -1,4 +1,3 @@ -// automatically generated by wrap #include #include #include From 7d9139a854f706916fe3ccd4184a28af7109f438 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 27 Aug 2012 18:10:51 +0000 Subject: [PATCH 821/914] Fix wrap tests --- wrap/tests/expected_namespaces/+ns1/ClassA.m | 7 ++++- wrap/tests/expected_namespaces/+ns1/ClassB.m | 7 ++++- .../+ns1/aGlobalFunction.m | 1 - .../expected_namespaces/+ns2/+ns3/ClassB.m | 7 ++++- wrap/tests/expected_namespaces/+ns2/ClassA.m | 31 ++++++++++++++++++- wrap/tests/expected_namespaces/+ns2/ClassC.m | 7 ++++- .../+ns2/aGlobalFunction.m | 1 - 7 files changed, 54 insertions(+), 7 deletions(-) diff --git a/wrap/tests/expected_namespaces/+ns1/ClassA.m b/wrap/tests/expected_namespaces/+ns1/ClassA.m index f0682c815..bcca78cdf 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassA.m @@ -1,4 +1,9 @@ -% automatically generated by wrap +%-------Constructors------- +%ClassA() +%-------Methods------- +%-------Static Methods------- +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassA < handle properties ptr_ns1ClassA = 0 diff --git a/wrap/tests/expected_namespaces/+ns1/ClassB.m b/wrap/tests/expected_namespaces/+ns1/ClassB.m index a263bc1e8..99be93023 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassB.m @@ -1,4 +1,9 @@ -% automatically generated by wrap +%-------Constructors------- +%ClassB() +%-------Methods------- +%-------Static Methods------- +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassB < handle properties ptr_ns1ClassB = 0 diff --git a/wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m b/wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m index fc1e780af..a82518ad6 100644 --- a/wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m +++ b/wrap/tests/expected_namespaces/+ns1/aGlobalFunction.m @@ -1,4 +1,3 @@ -% automatically generated by wrap function varargout = aGlobalFunction(varargin) if length(varargin) == 0 varargout{1} = testNamespaces_wrapper(22, varargin{:}); diff --git a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m index 2c19e13a8..f2a32111a 100644 --- a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m @@ -1,4 +1,9 @@ -% automatically generated by wrap +%-------Constructors------- +%ClassB() +%-------Methods------- +%-------Static Methods------- +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassB < handle properties ptr_ns2ns3ClassB = 0 diff --git a/wrap/tests/expected_namespaces/+ns2/ClassA.m b/wrap/tests/expected_namespaces/+ns2/ClassA.m index e7a074c08..e795deb71 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassA.m @@ -1,4 +1,13 @@ -% automatically generated by wrap +%-------Constructors------- +%ClassA() +%-------Methods------- +%memberFunction() +%nsArg(ClassB arg) +%nsReturn(double q) +%-------Static Methods------- +%afunction() +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassA < handle properties ptr_ns2ClassA = 0 @@ -25,6 +34,11 @@ classdef ClassA < handle function disp(obj), obj.display; end function varargout = memberFunction(this, varargin) + % memberFunction memberFunction() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % memberFunction() if length(varargin) == 0 varargout{1} = testNamespaces_wrapper(9, this, varargin{:}); else @@ -33,6 +47,11 @@ classdef ClassA < handle end function varargout = nsArg(this, varargin) + % nsArg nsArg(ClassB arg) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % nsArg(ClassB arg) if length(varargin) == 1 && isa(varargin{1},'ns1.ClassB') varargout{1} = testNamespaces_wrapper(10, this, varargin{:}); else @@ -41,6 +60,11 @@ classdef ClassA < handle end function varargout = nsReturn(this, varargin) + % nsReturn nsReturn(double q) : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % nsReturn(double q) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = testNamespaces_wrapper(11, this, varargin{:}); else @@ -52,6 +76,11 @@ classdef ClassA < handle methods(Static = true) function varargout = Afunction(varargin) + % afunction afunction() : + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html + % + % Method Overloads + % afunction() if length(varargin) == 0 varargout{1} = testNamespaces_wrapper(12, varargin{:}); else diff --git a/wrap/tests/expected_namespaces/+ns2/ClassC.m b/wrap/tests/expected_namespaces/+ns2/ClassC.m index f56a9c5cb..2d6cb21d8 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassC.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassC.m @@ -1,4 +1,9 @@ -% automatically generated by wrap +%-------Constructors------- +%ClassC() +%-------Methods------- +%-------Static Methods------- +% +%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassC < handle properties ptr_ns2ClassC = 0 diff --git a/wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m b/wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m index 2bdf45dd6..8b6a5993f 100644 --- a/wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m +++ b/wrap/tests/expected_namespaces/+ns2/aGlobalFunction.m @@ -1,4 +1,3 @@ -% automatically generated by wrap function varargout = aGlobalFunction(varargin) if length(varargin) == 0 varargout{1} = testNamespaces_wrapper(23, varargin{:}); From 3e93c488e539bfaadb04c68f835bd6022e06e620 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 27 Aug 2012 22:29:56 +0000 Subject: [PATCH 822/914] Removed extra code that was sometimes maintaining a staircase pattern in JacobianFactor by sorting rows - a holdover from the staircase optimization that is no longer done now that we are using Eigen's QR --- gtsam/inference/VariableSlots.h | 4 - gtsam/linear/GaussianFactorGraph.cpp | 61 +++++----- gtsam/linear/JacobianFactor.cpp | 111 ++---------------- gtsam/linear/JacobianFactor.h | 24 ---- .../linear/tests/testGaussianFactorGraph.cpp | 8 +- tests/testDoglegOptimizer.cpp | 2 +- 6 files changed, 45 insertions(+), 165 deletions(-) diff --git a/gtsam/inference/VariableSlots.h b/gtsam/inference/VariableSlots.h index 551993db4..2533a7411 100644 --- a/gtsam/inference/VariableSlots.h +++ b/gtsam/inference/VariableSlots.h @@ -48,10 +48,6 @@ namespace gtsam { * variable index 3), row-block 2 (also meaning component factor 2), comes from * column-block 0 of component factor 2. * - * Note that in the case of GaussianFactor, the rows of the combined factor are - * further sorted so that the column-block position of the first structural - * non-zero increases monotonically through the rows. This additional process - * is not performed by this class. * \nosubgrouping */ diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index dd86ffca6..e2598b1ac 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -240,20 +240,6 @@ break; } toc(1, "countDims"); - if (debug) cout << "Sort rows" << endl; - tic(2, "sort rows"); - vector rowSources; - rowSources.reserve(m); - bool anyConstrained = false; - for (size_t sourceFactorI = 0; sourceFactorI < factors.size(); ++sourceFactorI) { - const JacobianFactor& sourceFactor(*factors[sourceFactorI]); - sourceFactor.collectInfo(sourceFactorI, rowSources); - if (sourceFactor.isConstrained()) anyConstrained = true; - } - assert(rowSources.size() == m); - std::sort(rowSources.begin(), rowSources.end()); - toc(2, "sort rows"); - if (debug) cout << "Allocate new factor" << endl; tic(3, "allocate"); JacobianFactor::shared_ptr combined(new JacobianFactor()); @@ -261,36 +247,47 @@ break; Vector sigmas(m); toc(3, "allocate"); - if (debug) cout << "Copy rows" << endl; - tic(4, "copy rows"); + if (debug) cout << "Copy blocks" << endl; + tic(4, "copy blocks"); + // Loop over slots in combined factor Index combinedSlot = 0; BOOST_FOREACH(const VariableSlots::value_type& varslot, variableSlots) { - for (size_t row = 0; row < m; ++row) { - const JacobianFactor::_RowSource& info(rowSources[row]); - const JacobianFactor& source(*factors[info.factorI]); - size_t sourceRow = info.factorRowI; - Index sourceSlot = varslot.second[info.factorI]; - combined->copyRow(source, sourceRow, sourceSlot, row, combinedSlot); + JacobianFactor::ABlock destSlot(combined->getA(combined->begin()+combinedSlot)); + // Loop over source factors + size_t nextRow = 0; + for(size_t factorI = 0; factorI < factors.size(); ++factorI) { + // Slot in source factor + const Index sourceSlot = varslot.second[factorI]; + const size_t sourceRows = factors[factorI]->rows(); + JacobianFactor::ABlock::RowsBlockXpr destBlock(destSlot.middleRows(nextRow, sourceRows)); + // Copy if exists in source factor, otherwise set zero + if(sourceSlot != numeric_limits::max()) + destBlock = factors[factorI]->getA(factors[factorI]->begin()+sourceSlot); + else + destBlock.setZero(); + nextRow += sourceRows; } ++combinedSlot; } - toc(4, "copy rows"); + toc(4, "copy blocks"); - if (debug) cout << "Copy rhs (b), sigma, and firstNonzeroBlocks" << endl; + if (debug) cout << "Copy rhs (b) and sigma" << endl; tic(5, "copy vectors"); - for (size_t row = 0; row < m; ++row) { - const JacobianFactor::_RowSource& info(rowSources[row]); - const JacobianFactor& source(*factors[info.factorI]); - const size_t sourceRow = info.factorRowI; - combined->getb()(row) = source.getb()(sourceRow); - sigmas(row) = source.get_model()->sigmas()(sourceRow); + bool anyConstrained = false; + // Loop over source factors + size_t nextRow = 0; + for(size_t factorI = 0; factorI < factors.size(); ++factorI) { + const size_t sourceRows = factors[factorI]->rows(); + combined->getb().segment(nextRow, sourceRows) = factors[factorI]->getb(); + sigmas.segment(nextRow, sourceRows) = factors[factorI]->get_model()->sigmas(); + if (factors[factorI]->isConstrained()) anyConstrained = true; + nextRow += sourceRows; } - combined->copyFNZ(m, variableSlots.size(),rowSources); toc(5, "copy vectors"); if (debug) cout << "Create noise model from sigmas" << endl; tic(6, "noise model"); - combined->setModel( anyConstrained,sigmas); + combined->setModel(anyConstrained, sigmas); toc(6, "noise model"); if (debug) cout << "Assert Invariants" << endl; diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index d0023b766..759be4948 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -48,15 +48,12 @@ namespace gtsam { #ifndef NDEBUG GaussianFactor::assertInvariants(); // The base class checks for unique keys assert((size() == 0 && Ab_.rows() == 0 && Ab_.nBlocks() == 0) || size()+1 == Ab_.nBlocks()); - assert(firstNonzeroBlocks_.size() == Ab_.rows()); - for(size_t i=0; idim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); @@ -103,7 +100,7 @@ namespace gtsam { /* ************************************************************************* */ JacobianFactor::JacobianFactor(Index i1, const Matrix& A1, Index i2, const Matrix& A2, const Vector& b, const SharedDiagonal& model) : - GaussianFactor(i1,i2), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { + GaussianFactor(i1,i2), model_(model), Ab_(matrix_) { if(model->dim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); @@ -119,7 +116,7 @@ namespace gtsam { /* ************************************************************************* */ JacobianFactor::JacobianFactor(Index i1, const Matrix& A1, Index i2, const Matrix& A2, Index i3, const Matrix& A3, const Vector& b, const SharedDiagonal& model) : - GaussianFactor(i1,i2,i3), model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) { + GaussianFactor(i1,i2,i3), model_(model), Ab_(matrix_) { if(model->dim() != (size_t) b.size()) throw InvalidNoiseModel(b.size(), model->dim()); @@ -137,7 +134,7 @@ namespace gtsam { JacobianFactor::JacobianFactor(const std::vector > &terms, const Vector &b, const SharedDiagonal& model) : GaussianFactor(GetKeys(terms.size(), terms.begin(), terms.end())), - model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) + model_(model), Ab_(matrix_) { if(model->dim() != (size_t) b.size()) @@ -158,7 +155,7 @@ namespace gtsam { JacobianFactor::JacobianFactor(const std::list > &terms, const Vector &b, const SharedDiagonal& model) : GaussianFactor(GetKeys(terms.size(), terms.begin(), terms.end())), - model_(model), firstNonzeroBlocks_(b.size(), 0), Ab_(matrix_) + model_(model), Ab_(matrix_) { if(model->dim() != (size_t) b.size()) @@ -179,9 +176,11 @@ namespace gtsam { } /* ************************************************************************* */ - JacobianFactor::JacobianFactor(const GaussianConditional& cg) : GaussianFactor(cg), model_(noiseModel::Diagonal::Sigmas(cg.get_sigmas(), true)), Ab_(matrix_) { + JacobianFactor::JacobianFactor(const GaussianConditional& cg) : + GaussianFactor(cg), + model_(noiseModel::Diagonal::Sigmas(cg.get_sigmas(), true)), + Ab_(matrix_) { Ab_.assignNoalias(cg.rsd_); - firstNonzeroBlocks_.resize(cg.get_d().size(), 0); // set sigmas from precisions assertInvariants(); } @@ -206,8 +205,6 @@ namespace gtsam { Ab_.rowEnd() = maxrank; model_ = noiseModel::Unit::Create(maxrank); - firstNonzeroBlocks_.resize(this->rows(), 0); - assertInvariants(); } @@ -215,7 +212,6 @@ namespace gtsam { JacobianFactor& JacobianFactor::operator=(const JacobianFactor& rhs) { this->Base::operator=(rhs); // Copy keys model_ = rhs.model_; // Copy noise model - firstNonzeroBlocks_ = rhs.firstNonzeroBlocks_; // Copy staircase pattern Ab_.assignNoalias(rhs.Ab_); // Copy matrix and block structure assertInvariants(); return *this; @@ -417,19 +413,6 @@ namespace gtsam { assert(Ab_.rows() <= Ab_.cols()-1); toc(4, "remaining factor"); - // todo SL: deal with "dead" pivot columns!!! - tic(5, "rowstarts"); - size_t varpos = 0; - firstNonzeroBlocks_.resize(this->rows()); - for(size_t row=0; rowprint("Eliminating JacobianFactor: "); - - // NOTE: stairs are not currently used in the Eigen QR implementation - // add this back if DenseQR is ever reimplemented -// tic(1, "stairs"); -// // Translate the left-most nonzero column indices into top-most zero row indices -// vector firstZeroRows(Ab_.cols()); -// { -// size_t lastNonzeroRow = 0; -// vector::iterator firstZeroRowsIt = firstZeroRows.begin(); -// for(size_t var=0; varrows() && firstNonzeroBlocks_[lastNonzeroRow] <= var) -// ++ lastNonzeroRow; -// fill(firstZeroRowsIt, firstZeroRowsIt+Ab_(var).cols(), lastNonzeroRow); -// firstZeroRowsIt += Ab_(var).cols(); -// } -// assert(firstZeroRowsIt+1 == firstZeroRows.end()); -// *firstZeroRowsIt = this->rows(); -// } -// toc(1, "stairs"); - -// #ifndef NDEBUG -// for(size_t col=0; col& rowSources) const { - assertInvariants(); - for (size_t row = 0; row < rows(); ++row) { - Index firstNonzeroVar; - if (firstNonzeroBlocks_[row] < size()) { - firstNonzeroVar = keys_[firstNonzeroBlocks_[row]]; - } else if (firstNonzeroBlocks_[row] == size()) { - firstNonzeroVar = back() + 1; - } else { - assert(false); - } - rowSources.push_back(_RowSource(firstNonzeroVar, index, row)); - } - } - /* ************************************************************************* */ void JacobianFactor::allocate(const VariableSlots& variableSlots, vector< size_t>& varDims, size_t m) { @@ -527,34 +466,6 @@ namespace gtsam { boost::bind(&VariableSlots::const_iterator::value_type::first, _1)); varDims.push_back(1); Ab_.copyStructureFrom(BlockAb(matrix_, varDims.begin(), varDims.end(), m)); - firstNonzeroBlocks_.resize(m); - } - - /* ************************************************************************* */ - void JacobianFactor::copyRow(const JacobianFactor& source, Index sourceRow, - size_t sourceSlot, size_t row, Index slot) { - ABlock combinedBlock = Ab_(slot); - if (sourceSlot != numeric_limits::max()) { - if (source.firstNonzeroBlocks_[sourceRow] <= sourceSlot) { - const constABlock sourceBlock(source.Ab_(sourceSlot)); - combinedBlock.row(row).noalias() = sourceBlock.row(sourceRow); - } else { - combinedBlock.row(row).setZero(); - } - } else { - combinedBlock.row(row).setZero(); - } - } - - /* ************************************************************************* */ - void JacobianFactor::copyFNZ(size_t m, size_t n, - vector<_RowSource>& rowSources) { - Index i = 0; - for (size_t row = 0; row < m; ++row) { - while (i < n && rowSources[row].firstNonzeroVar > keys_[i]) - ++i; - firstNonzeroBlocks_[row] = i; - } } /* ************************************************************************* */ diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 7cf1aa960..def36b086 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -83,7 +83,6 @@ namespace gtsam { typedef VerticalBlockView BlockAb; noiseModel::Diagonal::shared_ptr model_; // Gaussian noise model with diagonal covariance matrix - std::vector firstNonzeroBlocks_; AbMatrix matrix_; // the full matrix corresponding to the factor BlockAb Ab_; // the block view of the full matrix typedef GaussianFactor Base; // typedef to base @@ -274,35 +273,13 @@ namespace gtsam { */ boost::shared_ptr splitConditional(size_t nrFrontals = 1); - /* Used by ::CombineJacobians for sorting */ - struct _RowSource { - size_t firstNonzeroVar; - size_t factorI; - size_t factorRowI; - _RowSource(size_t _firstNonzeroVar, size_t _factorI, size_t _factorRowI) : - firstNonzeroVar(_firstNonzeroVar), factorI(_factorI), factorRowI(_factorRowI) {} - bool operator<(const _RowSource& o) const { - return firstNonzeroVar < o.firstNonzeroVar; - } - }; - // following methods all used in CombineJacobians: // Many imperative, perhaps all need to be combined in constructor - /** Collect information on Jacobian rows */ - void collectInfo(size_t index, std::vector<_RowSource>& rowSources) const; - /** allocate space */ void allocate(const VariableSlots& variableSlots, std::vector& varDims, size_t m); - /** copy a slot from source */ - void copyRow(const JacobianFactor& source, - Index sourceRow, size_t sourceSlot, size_t row, Index slot); - - /** copy firstNonzeroBlocks structure */ - void copyFNZ(size_t m, size_t n, std::vector<_RowSource>& rowSources); - /** set noiseModel correctly */ void setModel(bool anyConstrained, const Vector& sigmas); @@ -341,7 +318,6 @@ namespace gtsam { template void serialize(ARCHIVE & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(GaussianFactor); - ar & BOOST_SERIALIZATION_NVP(firstNonzeroBlocks_); ar & BOOST_SERIALIZATION_NVP(Ab_); ar & BOOST_SERIALIZATION_NVP(model_); ar & BOOST_SERIALIZATION_NVP(matrix_); diff --git a/gtsam/linear/tests/testGaussianFactorGraph.cpp b/gtsam/linear/tests/testGaussianFactorGraph.cpp index 37aa440ff..4c0aa3871 100644 --- a/gtsam/linear/tests/testGaussianFactorGraph.cpp +++ b/gtsam/linear/tests/testGaussianFactorGraph.cpp @@ -163,10 +163,10 @@ TEST(GaussianFactorGraph, Combine2) JacobianFactor actual = *CombineJacobians(jacobians, VariableSlots(gfg)); Matrix zero3x3 = zeros(3,3); - Matrix A0 = gtsam::stack(3, &A10, &zero3x3, &zero3x3); - Matrix A1 = gtsam::stack(3, &A11, &A01, &A21); - Vector b = gtsam::concatVectors(3, &b1, &b0, &b2); - Vector sigmas = gtsam::concatVectors(3, &s1, &s0, &s2); + Matrix A0 = gtsam::stack(3, &zero3x3, &A10, &zero3x3); + Matrix A1 = gtsam::stack(3, &A01, &A11, &A21); + Vector b = gtsam::concatVectors(3, &b0, &b1, &b2); + Vector sigmas = gtsam::concatVectors(3, &s0, &s1, &s2); JacobianFactor expected(0, A0, 1, A1, b, noiseModel::Diagonal::Sigmas(sigmas, true)); diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index 3c5409af7..781685a23 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -200,7 +200,7 @@ TEST(DoglegOptimizer, BT_BN_equivalency) { GaussianFactorGraph expected(gbn); GaussianFactorGraph actual(bt); - EXPECT(assert_equal(expected.denseJacobian(), actual.denseJacobian())); + EXPECT(assert_equal(expected.denseHessian(), actual.denseHessian())); } /* ************************************************************************* */ From 0238f54b9fee7de140b19eb95ff8c8bc341d4332 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 28 Aug 2012 02:57:20 +0000 Subject: [PATCH 823/914] Changed print format of ordering to print in elimination order instead of sorted by key --- gtsam/nonlinear/Ordering.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gtsam/nonlinear/Ordering.cpp b/gtsam/nonlinear/Ordering.cpp index 2c20d82dd..9f99948a4 100644 --- a/gtsam/nonlinear/Ordering.cpp +++ b/gtsam/nonlinear/Ordering.cpp @@ -42,8 +42,13 @@ void Ordering::permuteWithInverse(const Permutation& inversePermutation) { /* ************************************************************************* */ void Ordering::print(const string& str, const KeyFormatter& keyFormatter) const { cout << str; - BOOST_FOREACH(const Ordering::value_type& key_order, *this) - cout << keyFormatter(key_order.first) << ":" << key_order.second << endl; + // Print ordering in index order + Ordering::InvertedMap inverted = this->invert(); + cout << "key (zero-based order)\n"; + BOOST_FOREACH(const Ordering::InvertedMap::value_type& index_key, inverted) { + cout << keyFormatter(index_key.second) << " (" << index_key.first << ")\n"; + } + cout.flush(); } /* ************************************************************************* */ From f27fee55246efc732c3e11628f9b4c29318a9e86 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 28 Aug 2012 15:00:50 +0000 Subject: [PATCH 824/914] Added findExampleDataFile to C++ gtsam (already existed in Matlab interface) --- gtsam/CMakeLists.txt | 6 ++++++ gtsam/slam/dataset.cpp | 32 ++++++++++++++++++++++++++++++ gtsam/slam/dataset.h | 13 ++++++++++++ gtsam/slam/tests/testDataset.cpp | 34 ++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 gtsam/slam/tests/testDataset.cpp diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt index 56bce727b..054664940 100644 --- a/gtsam/CMakeLists.txt +++ b/gtsam/CMakeLists.txt @@ -114,6 +114,12 @@ if (GTSAM_BUILD_SHARED_LIBRARY) endif() endif(GTSAM_BUILD_SHARED_LIBRARY) +# Set dataset paths +set_property(SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/slam/dataset.cpp" + APPEND PROPERTY COMPILE_DEFINITIONS + "SOURCE_TREE_DATASET_DIR=\"${CMAKE_SOURCE_DIR}/examples/Data\"" + "INSTALLED_DATASET_DIR=\"${GTSAM_TOOLBOX_INSTALL_PATH}/gtsam_examples/Data\"") + # Create the matlab toolbox for the gtsam library if (GTSAM_INSTALL_MATLAB_TOOLBOX) # Set up codegen diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index 643764f71..e9ec73a85 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -20,6 +20,8 @@ #include #include +#include + #include #include #include @@ -27,11 +29,41 @@ #include using namespace std; +namespace fs = boost::filesystem; #define LINESIZE 81920 namespace gtsam { +/* ************************************************************************* */ +string findExampleDataFile(const string& name) { + // Search source tree and installed location + vector rootsToSearch; + rootsToSearch.push_back(SOURCE_TREE_DATASET_DIR); // Defined by CMake, see gtsam/gtsam/CMakeLists.txt + rootsToSearch.push_back(INSTALLED_DATASET_DIR); // Defined by CMake, see gtsam/gtsam/CMakeLists.txt + + // Search for filename as given, and with .graph and .txt extensions + vector namesToSearch; + namesToSearch.push_back(name); + namesToSearch.push_back(name + ".graph"); + namesToSearch.push_back(name + ".txt"); + + // Find first name that exists + BOOST_FOREACH(const fs::path& root, rootsToSearch) { + BOOST_FOREACH(const fs::path& name, namesToSearch) { + if(fs::is_regular_file(root / name)) + return (root / name).string(); + } + } + + // If we did not return already, then we did not find the file + throw std::invalid_argument( + "gtsam::findExampleDataFile could not find a matching file in\n" + SOURCE_TREE_DATASET_DIR " or\n" + INSTALLED_DATASET_DIR " named\n" + + name + ", " + name + ".graph, or " + name + ".txt"); +} + /* ************************************************************************* */ pair load2D( pair > dataset, diff --git a/gtsam/slam/dataset.h b/gtsam/slam/dataset.h index c881ce2bd..7c38e13c9 100644 --- a/gtsam/slam/dataset.h +++ b/gtsam/slam/dataset.h @@ -25,6 +25,19 @@ namespace gtsam { + /** + * Find the full path to an example dataset distributed with gtsam. The name + * may be specified with or without a file extension - if no extension is + * give, this function first looks for the .graph extension, then .txt. We + * first check the gtsam source tree for the file, followed by the installed + * example dataset location. Both the source tree and installed locations + * are obtained from CMake during compilation. + * @return The full path and filename to the requested dataset. + * @throw std::invalid_argument if no matching file could be found using the + * search process described above. + */ + std::string findExampleDataFile(const std::string& name); + /** * Load TORO 2D Graph * @param dataset/model pair as constructed by [dataset] diff --git a/gtsam/slam/tests/testDataset.cpp b/gtsam/slam/tests/testDataset.cpp new file mode 100644 index 000000000..9181178f1 --- /dev/null +++ b/gtsam/slam/tests/testDataset.cpp @@ -0,0 +1,34 @@ +/* ---------------------------------------------------------------------------- + + * 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 testDataset.cpp + * @brief Unit test for dataset.cpp + * @author Richard Roberts + */ + +#include + +#include + +#include +#include + +using namespace std; +using namespace gtsam; + +TEST(dataSet, findExampleDataFile) { + const string expected_end = "gtsam/examples/Data/example.graph"; + const string actual = findExampleDataFile("example"); + string actual_end = actual.substr(actual.size() - expected_end.size(), expected_end.size()); + boost::replace_all(actual_end, "\\", "/"); // Convert directory separators to forward-slash + EXPECT(assert_equal(expected_end, actual_end)); +} From bf71e497cddbd7c8dd4334a788d877e42bbea803 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 28 Aug 2012 15:38:08 +0000 Subject: [PATCH 825/914] linking fix on Mac for testDataset --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d94f259f9..85984d7e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,7 +109,7 @@ if(CYGWIN OR MSVC OR WIN32) set(Boost_USE_STATIC_LIBS 1) endif() find_package(Boost 1.43 COMPONENTS serialization system filesystem thread date_time regex REQUIRED) -set(GTSAM_BOOST_LIBRARIES ${Boost_SERIALIZATION_LIBRARY} ${Boost_SYSTEM_LIBRARY}) +set(GTSAM_BOOST_LIBRARIES ${Boost_SERIALIZATION_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) # General build settings include_directories( From 820f63258333258b499b1631699d679d2b7463b0 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Tue, 28 Aug 2012 15:38:22 +0000 Subject: [PATCH 826/914] missing main? --- gtsam/slam/tests/testDataset.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gtsam/slam/tests/testDataset.cpp b/gtsam/slam/tests/testDataset.cpp index 9181178f1..2df2228af 100644 --- a/gtsam/slam/tests/testDataset.cpp +++ b/gtsam/slam/tests/testDataset.cpp @@ -32,3 +32,7 @@ TEST(dataSet, findExampleDataFile) { boost::replace_all(actual_end, "\\", "/"); // Convert directory separators to forward-slash EXPECT(assert_equal(expected_end, actual_end)); } + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From fe6dd197bb54728db29e866f9ed89e5a7396bb17 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 28 Aug 2012 19:14:46 +0000 Subject: [PATCH 827/914] Fixed example --- gtsam/discrete/tests/testDecisionTree.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtsam/discrete/tests/testDecisionTree.cpp b/gtsam/discrete/tests/testDecisionTree.cpp index f67df51a8..1dfcd3057 100644 --- a/gtsam/discrete/tests/testDecisionTree.cpp +++ b/gtsam/discrete/tests/testDecisionTree.cpp @@ -41,6 +41,9 @@ void dot(const T&f, const string& filename) { #define DOT(x)(dot(x,#x)) +struct Crazy { int a; double b; }; +typedef DecisionTree CrazyDecisionTree; // check that DecisionTree is actually generic (as it pretends to be) + /* ******************************************************************************** */ // Test string labels and int range /* ******************************************************************************** */ From d0a1e662a7e882e01724ee0c6e262e03acfa7ab1 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Tue, 28 Aug 2012 21:44:45 +0000 Subject: [PATCH 828/914] Wrap comments are now EVEN better --- wrap/Class.cpp | 40 +++++-- wrap/Class.h | 1 + wrap/Method.cpp | 27 ++++- wrap/StaticMethod.cpp | 33 ++++-- wrap/StaticMethod.h | 1 + wrap/tests/expected/Point2.m | 41 ++++--- wrap/tests/expected/Point3.m | 27 +++-- wrap/tests/expected/Test.m | 101 +++++++++++------- wrap/tests/expected_namespaces/+ns1/ClassA.m | 4 +- wrap/tests/expected_namespaces/+ns1/ClassB.m | 4 +- .../expected_namespaces/+ns2/+ns3/ClassB.m | 4 +- wrap/tests/expected_namespaces/+ns2/ClassA.m | 28 +++-- wrap/tests/expected_namespaces/+ns2/ClassC.m | 4 +- wrap/tests/expected_namespaces/ClassD.m | 4 +- 14 files changed, 215 insertions(+), 104 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 44aa6a1bd..2d76dad8e 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -330,8 +330,10 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << "%" << "-------Constructors-------" << endl; BOOST_FOREACH(ArgumentList argList, constructor.args_list) { - proxyFile.oss << "%" << name << "("; - int i = 0; + + string up_name = boost::to_upper_copy(name); + proxyFile.oss << "%" << up_name << "("; + unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { if(i != argList.size()-1) @@ -343,13 +345,15 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << ")" << endl; } + proxyFile.oss << "% " << "" << endl; proxyFile.oss << "%" << "-------Methods-------" << endl; BOOST_FOREACH(const Methods::value_type& name_m, methods) { const Method& m = name_m.second; BOOST_FOREACH(ArgumentList argList, m.argLists) { - proxyFile.oss << "%" << m.name << "("; - int i = 0; + string up_name = boost::to_upper_copy(m.name); + proxyFile.oss << "%" << up_name << "("; + unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { if(i != argList.size()-1) @@ -358,17 +362,28 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << arg.type << " " << arg.name; i++; } - proxyFile.oss << ")" << endl; + proxyFile.oss << ") : returns "; + } + unsigned int retCount = 0; + BOOST_FOREACH(ReturnValue rt, m.returnVals) + { + if(retCount != m.returnVals.size() - 1) + proxyFile.oss << rt.return_type(false, rt.pair) << ", "; + else + proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; + } } + proxyFile.oss << "% " << "" << endl; proxyFile.oss << "%" << "-------Static Methods-------" << endl; BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { const StaticMethod& m = name_m.second; BOOST_FOREACH(ArgumentList argList, m.argLists) { - proxyFile.oss << "%" << m.name << "("; - int i = 0; + string up_name = boost::to_upper_copy(m.name); + proxyFile.oss << "%" << up_name << "("; + unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { if(i != argList.size()-1) @@ -377,7 +392,16 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << arg.type << " " << arg.name; i++; } - proxyFile.oss << ")" << endl; + proxyFile.oss << ") : returns "; + } + unsigned int retCount = 0; + BOOST_FOREACH(ReturnValue rt, m.returnVals) + { + if(retCount != m.returnVals.size() - 1) + proxyFile.oss << rt.return_type(false, rt.pair) << ", "; + else + proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; + } } diff --git a/wrap/Class.h b/wrap/Class.h index 687a6bc68..0d2736382 100644 --- a/wrap/Class.h +++ b/wrap/Class.h @@ -27,6 +27,7 @@ #include "Method.h" #include "StaticMethod.h" #include "TypeAttributesTable.h" +#include namespace wrap { diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 5f60d6a36..3a03e92a9 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -47,11 +47,13 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF proxyFile.oss << " function varargout = " << name << "(this, varargin)\n"; //Comments for documentation - proxyFile.oss << " % " << name << " "; + string up_name = boost::to_upper_copy(name); + proxyFile.oss << " % " << up_name << " usage:"; + unsigned int argLCount = 0; BOOST_FOREACH(ArgumentList argList, argLists) { - proxyFile.oss << " " << name << "("; - int i = 0; + proxyFile.oss << " " << up_name << "("; + unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { if(i != argList.size()-1) @@ -60,8 +62,23 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF proxyFile.oss << arg.type << " " << arg.name; i++; } - proxyFile.oss << ") : "; + if(argLCount != argLists.size()-1) + proxyFile.oss << "), "; + else + proxyFile.oss << ") : returns "; + argLCount++; } + + unsigned int retCount = 0; + BOOST_FOREACH(ReturnValue rt, returnVals) + { + if(retCount != returnVals.size() - 1) + proxyFile.oss << rt.return_type(false, rt.pair) << ", "; + else + proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; + + } + proxyFile.oss << endl; proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; @@ -69,7 +86,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF BOOST_FOREACH(ArgumentList argList, argLists) { proxyFile.oss << " % " << name << "("; - int i = 0; + unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { if(i != argList.size()-1) diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index c232739be..484f156df 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -47,15 +47,17 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr const TypeAttributesTable& typeAttributes, vector& functionNames) const { - string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); + string upperName = name; upperName[0] = std::toupper(upperName[0], std::locale()); proxyFile.oss << " function varargout = " << upperName << "(varargin)\n"; //Comments for documentation - proxyFile.oss << " % " << name << " "; + string up_name = boost::to_upper_copy(name); + proxyFile.oss << " % " << up_name << " usage:"; + unsigned int argLCount = 0; BOOST_FOREACH(ArgumentList argList, argLists) { - proxyFile.oss << " " << name << "("; - int i = 0; + proxyFile.oss << " " << up_name << "("; + unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { if(i != argList.size()-1) @@ -64,16 +66,31 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr proxyFile.oss << arg.type << " " << arg.name; i++; } - proxyFile.oss << ") : "; + if(argLCount != argLists.size()-1) + proxyFile.oss << "), "; + else + proxyFile.oss << ") : returns "; + argLCount++; } + + unsigned int retCount = 0; + BOOST_FOREACH(ReturnValue rt, returnVals) + { + if(retCount != returnVals.size() - 1) + proxyFile.oss << rt.return_type(false, rt.pair) << ", "; + else + proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; + + } + proxyFile.oss << endl; proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; - proxyFile.oss << " % " << "Method Overloads" << endl; + proxyFile.oss << " % " << "Usage" << endl; BOOST_FOREACH(ArgumentList argList, argLists) { - proxyFile.oss << " % " << name << "("; - int i = 0; + proxyFile.oss << " % " << up_name << "("; + unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { if(i != argList.size()-1) diff --git a/wrap/StaticMethod.h b/wrap/StaticMethod.h index fc82105f0..9c1581400 100644 --- a/wrap/StaticMethod.h +++ b/wrap/StaticMethod.h @@ -25,6 +25,7 @@ #include "Argument.h" #include "ReturnValue.h" #include "TypeAttributesTable.h" +#include namespace wrap { diff --git a/wrap/tests/expected/Point2.m b/wrap/tests/expected/Point2.m index 8a2718377..85fb369dc 100644 --- a/wrap/tests/expected/Point2.m +++ b/wrap/tests/expected/Point2.m @@ -1,14 +1,16 @@ %-------Constructors------- -%Point2() -%Point2(double x, double y) +%POINT2() +%POINT2(double x, double y) +% %-------Methods------- -%argChar(char a) -%argUChar(unsigned char a) -%dim() -%returnChar() -%vectorConfusion() -%x() -%y() +%ARGCHAR(char a) : returns void +%ARGUCHAR(unsigned char a) : returns void +%DIM() : returns int +%RETURNCHAR() : returns char +%VECTORCONFUSION() : returns VectorNotEigen +%X() : returns double +%Y() : returns double +% %-------Static Methods------- % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html @@ -40,7 +42,8 @@ classdef Point2 < handle function disp(obj), obj.display; end function varargout = argChar(this, varargin) - % argChar argChar(char a) : + % ARGCHAR usage: ARGCHAR(char a) : returns void + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -53,7 +56,8 @@ classdef Point2 < handle end function varargout = argUChar(this, varargin) - % argUChar argUChar(unsigned char a) : + % ARGUCHAR usage: ARGUCHAR(unsigned char a) : returns void + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -66,7 +70,8 @@ classdef Point2 < handle end function varargout = dim(this, varargin) - % dim dim() : + % DIM usage: DIM() : returns int + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -79,7 +84,8 @@ classdef Point2 < handle end function varargout = returnChar(this, varargin) - % returnChar returnChar() : + % RETURNCHAR usage: RETURNCHAR() : returns char + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -92,7 +98,8 @@ classdef Point2 < handle end function varargout = vectorConfusion(this, varargin) - % vectorConfusion vectorConfusion() : + % VECTORCONFUSION usage: VECTORCONFUSION() : returns VectorNotEigen + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -105,7 +112,8 @@ classdef Point2 < handle end function varargout = x(this, varargin) - % x x() : + % X usage: X() : returns double + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -118,7 +126,8 @@ classdef Point2 < handle end function varargout = y(this, varargin) - % y y() : + % Y usage: Y() : returns double + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads diff --git a/wrap/tests/expected/Point3.m b/wrap/tests/expected/Point3.m index 4cd50f4d5..88dd174e1 100644 --- a/wrap/tests/expected/Point3.m +++ b/wrap/tests/expected/Point3.m @@ -1,10 +1,12 @@ %-------Constructors------- -%Point3(double x, double y, double z) +%POINT3(double x, double y, double z) +% %-------Methods------- -%norm() +%NORM() : returns double +% %-------Static Methods------- -%StaticFunctionRet(double z) -%staticFunction() +%STATICFUNCTIONRET(double z) : returns Point3 +%STATICFUNCTION() : returns double % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Point3 < handle @@ -33,7 +35,8 @@ classdef Point3 < handle function disp(obj), obj.display; end function varargout = norm(this, varargin) - % norm norm() : + % NORM usage: NORM() : returns double + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -49,11 +52,12 @@ classdef Point3 < handle methods(Static = true) function varargout = StaticFunctionRet(varargin) - % StaticFunctionRet StaticFunctionRet(double z) : + % STATICFUNCTIONRET usage: STATICFUNCTIONRET(double z) : returns Point3 + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % - % Method Overloads - % StaticFunctionRet(double z) + % Usage + % STATICFUNCTIONRET(double z) if length(varargin) == 1 && isa(varargin{1},'double') varargout{1} = geometry_wrapper(15, varargin{:}); else @@ -62,11 +66,12 @@ classdef Point3 < handle end function varargout = StaticFunction(varargin) - % staticFunction staticFunction() : + % STATICFUNCTION usage: STATICFUNCTION() : returns double + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % - % Method Overloads - % staticFunction() + % Usage + % STATICFUNCTION() if length(varargin) == 0 varargout{1} = geometry_wrapper(16, varargin{:}); else diff --git a/wrap/tests/expected/Test.m b/wrap/tests/expected/Test.m index 4ce501fb0..b9cc86403 100644 --- a/wrap/tests/expected/Test.m +++ b/wrap/tests/expected/Test.m @@ -1,26 +1,28 @@ %-------Constructors------- -%Test() -%Test(double a, Matrix b) +%TEST() +%TEST(double a, Matrix b) +% %-------Methods------- -%arg_EigenConstRef(Matrix value) -%create_MixedPtrs() -%create_ptrs() -%print() -%return_Point2Ptr(bool value) -%return_Test(Test value) -%return_TestPtr(Test value) -%return_bool(bool value) -%return_double(double value) -%return_field(Test t) -%return_int(int value) -%return_matrix1(Matrix value) -%return_matrix2(Matrix value) -%return_pair(Vector v, Matrix A) -%return_ptrs(Test p1, Test p2) -%return_size_t(size_t value) -%return_string(string value) -%return_vector1(Vector value) -%return_vector2(Vector value) +%ARG_EIGENCONSTREF(Matrix value) : returns void +%CREATE_MIXEDPTRS() : returns pair< Test, SharedTest > +%CREATE_PTRS() : returns pair< SharedTest, SharedTest > +%PRINT() : returns void +%RETURN_POINT2PTR(bool value) : returns Point2 +%RETURN_TEST(Test value) : returns Test +%RETURN_TESTPTR(Test value) : returns Test +%RETURN_BOOL(bool value) : returns bool +%RETURN_DOUBLE(double value) : returns double +%RETURN_FIELD(Test t) : returns bool +%RETURN_INT(int value) : returns int +%RETURN_MATRIX1(Matrix value) : returns Matrix +%RETURN_MATRIX2(Matrix value) : returns Matrix +%RETURN_PAIR(Vector v, Matrix A) : returns pair< Vector, Matrix > +%RETURN_PTRS(Test p1, Test p2) : returns pair< SharedTest, SharedTest > +%RETURN_SIZE_T(size_t value) : returns size_t +%RETURN_STRING(string value) : returns string +%RETURN_VECTOR1(Vector value) : returns Vector +%RETURN_VECTOR2(Vector value) : returns Vector +% %-------Static Methods------- % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html @@ -52,7 +54,8 @@ classdef Test < handle function disp(obj), obj.display; end function varargout = arg_EigenConstRef(this, varargin) - % arg_EigenConstRef arg_EigenConstRef(Matrix value) : + % ARG_EIGENCONSTREF usage: ARG_EIGENCONSTREF(Matrix value) : returns void + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -65,7 +68,8 @@ classdef Test < handle end function varargout = create_MixedPtrs(this, varargin) - % create_MixedPtrs create_MixedPtrs() : + % CREATE_MIXEDPTRS usage: CREATE_MIXEDPTRS() : returns pair< Test, SharedTest > + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -78,7 +82,8 @@ classdef Test < handle end function varargout = create_ptrs(this, varargin) - % create_ptrs create_ptrs() : + % CREATE_PTRS usage: CREATE_PTRS() : returns pair< SharedTest, SharedTest > + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -91,7 +96,8 @@ classdef Test < handle end function varargout = print(this, varargin) - % print print() : + % PRINT usage: PRINT() : returns void + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -104,7 +110,8 @@ classdef Test < handle end function varargout = return_Point2Ptr(this, varargin) - % return_Point2Ptr return_Point2Ptr(bool value) : + % RETURN_POINT2PTR usage: RETURN_POINT2PTR(bool value) : returns Point2 + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -117,7 +124,8 @@ classdef Test < handle end function varargout = return_Test(this, varargin) - % return_Test return_Test(Test value) : + % RETURN_TEST usage: RETURN_TEST(Test value) : returns Test + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -130,7 +138,8 @@ classdef Test < handle end function varargout = return_TestPtr(this, varargin) - % return_TestPtr return_TestPtr(Test value) : + % RETURN_TESTPTR usage: RETURN_TESTPTR(Test value) : returns Test + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -143,7 +152,8 @@ classdef Test < handle end function varargout = return_bool(this, varargin) - % return_bool return_bool(bool value) : + % RETURN_BOOL usage: RETURN_BOOL(bool value) : returns bool + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -156,7 +166,8 @@ classdef Test < handle end function varargout = return_double(this, varargin) - % return_double return_double(double value) : + % RETURN_DOUBLE usage: RETURN_DOUBLE(double value) : returns double + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -169,7 +180,8 @@ classdef Test < handle end function varargout = return_field(this, varargin) - % return_field return_field(Test t) : + % RETURN_FIELD usage: RETURN_FIELD(Test t) : returns bool + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -182,7 +194,8 @@ classdef Test < handle end function varargout = return_int(this, varargin) - % return_int return_int(int value) : + % RETURN_INT usage: RETURN_INT(int value) : returns int + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -195,7 +208,8 @@ classdef Test < handle end function varargout = return_matrix1(this, varargin) - % return_matrix1 return_matrix1(Matrix value) : + % RETURN_MATRIX1 usage: RETURN_MATRIX1(Matrix value) : returns Matrix + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -208,7 +222,8 @@ classdef Test < handle end function varargout = return_matrix2(this, varargin) - % return_matrix2 return_matrix2(Matrix value) : + % RETURN_MATRIX2 usage: RETURN_MATRIX2(Matrix value) : returns Matrix + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -221,7 +236,8 @@ classdef Test < handle end function varargout = return_pair(this, varargin) - % return_pair return_pair(Vector v, Matrix A) : + % RETURN_PAIR usage: RETURN_PAIR(Vector v, Matrix A) : returns pair< Vector, Matrix > + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -234,7 +250,8 @@ classdef Test < handle end function varargout = return_ptrs(this, varargin) - % return_ptrs return_ptrs(Test p1, Test p2) : + % RETURN_PTRS usage: RETURN_PTRS(Test p1, Test p2) : returns pair< SharedTest, SharedTest > + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -247,7 +264,8 @@ classdef Test < handle end function varargout = return_size_t(this, varargin) - % return_size_t return_size_t(size_t value) : + % RETURN_SIZE_T usage: RETURN_SIZE_T(size_t value) : returns size_t + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -260,7 +278,8 @@ classdef Test < handle end function varargout = return_string(this, varargin) - % return_string return_string(string value) : + % RETURN_STRING usage: RETURN_STRING(string value) : returns string + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -273,7 +292,8 @@ classdef Test < handle end function varargout = return_vector1(this, varargin) - % return_vector1 return_vector1(Vector value) : + % RETURN_VECTOR1 usage: RETURN_VECTOR1(Vector value) : returns Vector + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -286,7 +306,8 @@ classdef Test < handle end function varargout = return_vector2(this, varargin) - % return_vector2 return_vector2(Vector value) : + % RETURN_VECTOR2 usage: RETURN_VECTOR2(Vector value) : returns Vector + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads diff --git a/wrap/tests/expected_namespaces/+ns1/ClassA.m b/wrap/tests/expected_namespaces/+ns1/ClassA.m index bcca78cdf..f557bc621 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassA.m @@ -1,6 +1,8 @@ %-------Constructors------- -%ClassA() +%CLASSA() +% %-------Methods------- +% %-------Static Methods------- % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html diff --git a/wrap/tests/expected_namespaces/+ns1/ClassB.m b/wrap/tests/expected_namespaces/+ns1/ClassB.m index 99be93023..70be8a2ff 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassB.m @@ -1,6 +1,8 @@ %-------Constructors------- -%ClassB() +%CLASSB() +% %-------Methods------- +% %-------Static Methods------- % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html diff --git a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m index f2a32111a..07d496ddc 100644 --- a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m @@ -1,6 +1,8 @@ %-------Constructors------- -%ClassB() +%CLASSB() +% %-------Methods------- +% %-------Static Methods------- % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html diff --git a/wrap/tests/expected_namespaces/+ns2/ClassA.m b/wrap/tests/expected_namespaces/+ns2/ClassA.m index e795deb71..46e43bdc6 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassA.m @@ -1,11 +1,13 @@ %-------Constructors------- -%ClassA() +%CLASSA() +% %-------Methods------- -%memberFunction() -%nsArg(ClassB arg) -%nsReturn(double q) +%MEMBERFUNCTION() : returns double +%NSARG(ClassB arg) : returns int +%NSRETURN(double q) : returns ns2::ns3::ClassB +% %-------Static Methods------- -%afunction() +%AFUNCTION() : returns double % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassA < handle @@ -34,7 +36,8 @@ classdef ClassA < handle function disp(obj), obj.display; end function varargout = memberFunction(this, varargin) - % memberFunction memberFunction() : + % MEMBERFUNCTION usage: MEMBERFUNCTION() : returns double + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -47,7 +50,8 @@ classdef ClassA < handle end function varargout = nsArg(this, varargin) - % nsArg nsArg(ClassB arg) : + % NSARG usage: NSARG(ClassB arg) : returns int + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -60,7 +64,8 @@ classdef ClassA < handle end function varargout = nsReturn(this, varargin) - % nsReturn nsReturn(double q) : + % NSRETURN usage: NSRETURN(double q) : returns ns2::ns3::ClassB + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -76,11 +81,12 @@ classdef ClassA < handle methods(Static = true) function varargout = Afunction(varargin) - % afunction afunction() : + % AFUNCTION usage: AFUNCTION() : returns double + % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % - % Method Overloads - % afunction() + % Usage + % AFUNCTION() if length(varargin) == 0 varargout{1} = testNamespaces_wrapper(12, varargin{:}); else diff --git a/wrap/tests/expected_namespaces/+ns2/ClassC.m b/wrap/tests/expected_namespaces/+ns2/ClassC.m index 2d6cb21d8..a5485afcc 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassC.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassC.m @@ -1,6 +1,8 @@ %-------Constructors------- -%ClassC() +%CLASSC() +% %-------Methods------- +% %-------Static Methods------- % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html diff --git a/wrap/tests/expected_namespaces/ClassD.m b/wrap/tests/expected_namespaces/ClassD.m index 98a4df3a6..1e672466c 100644 --- a/wrap/tests/expected_namespaces/ClassD.m +++ b/wrap/tests/expected_namespaces/ClassD.m @@ -1,6 +1,8 @@ %-------Constructors------- -%ClassD() +%CLASSD() +% %-------Methods------- +% %-------Static Methods------- % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html From 84a806bf393ae2668043aec61c24ed3413b5d847 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Wed, 29 Aug 2012 20:27:10 +0000 Subject: [PATCH 829/914] Final fixes made for wrap comments --- wrap/Class.cpp | 27 ++------ wrap/Method.cpp | 15 +---- wrap/StaticMethod.cpp | 15 +---- wrap/tests/expected/Point2.m | 25 +++----- wrap/tests/expected/Point3.m | 13 ++-- wrap/tests/expected/Test.m | 61 +++++++------------ wrap/tests/expected_namespaces/+ns1/ClassA.m | 4 +- wrap/tests/expected_namespaces/+ns1/ClassB.m | 4 +- .../expected_namespaces/+ns2/+ns3/ClassB.m | 4 +- wrap/tests/expected_namespaces/+ns2/ClassA.m | 16 ++--- wrap/tests/expected_namespaces/+ns2/ClassC.m | 4 +- wrap/tests/expected_namespaces/ClassD.m | 4 +- 12 files changed, 60 insertions(+), 132 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 2d76dad8e..c5c306ce6 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -101,8 +101,8 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, wrapperFile.oss << "\n"; functionNames.push_back(functionName); } - proxyFile.oss << " function display(obj), obj.print(''); end\n\n"; - proxyFile.oss << " function disp(obj), obj.display; end\n\n"; + proxyFile.oss << " function display(obj), obj.print(''); end\n %DISPLAY Calls print on the object\n"; + proxyFile.oss << " function disp(obj), obj.display; end\n %DISP Calls print on the object\n"; // Methods BOOST_FOREACH(const Methods::value_type& name_m, methods) { @@ -362,16 +362,7 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << arg.type << " " << arg.name; i++; } - proxyFile.oss << ") : returns "; - } - unsigned int retCount = 0; - BOOST_FOREACH(ReturnValue rt, m.returnVals) - { - if(retCount != m.returnVals.size() - 1) - proxyFile.oss << rt.return_type(false, rt.pair) << ", "; - else - proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; - + proxyFile.oss << ") : returns " << m.returnVals[0].return_type(false, m.returnVals[0].pair) << endl; } } @@ -392,16 +383,8 @@ void Class::comment_fragment(FileWriter& proxyFile) const proxyFile.oss << arg.type << " " << arg.name; i++; } - proxyFile.oss << ") : returns "; - } - unsigned int retCount = 0; - BOOST_FOREACH(ReturnValue rt, m.returnVals) - { - if(retCount != m.returnVals.size() - 1) - proxyFile.oss << rt.return_type(false, rt.pair) << ", "; - else - proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; - + + proxyFile.oss << ") : returns " << m.returnVals[0].return_type(false, m.returnVals[0].pair) << endl; } } diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 3a03e92a9..e4def9bc0 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -52,7 +52,7 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF unsigned int argLCount = 0; BOOST_FOREACH(ArgumentList argList, argLists) { - proxyFile.oss << " " << up_name << "("; + proxyFile.oss << " " << name << "("; unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { @@ -65,21 +65,10 @@ void Method::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wrapperF if(argLCount != argLists.size()-1) proxyFile.oss << "), "; else - proxyFile.oss << ") : returns "; + proxyFile.oss << ") : returns " << returnVals[0].return_type(false, returnVals[0].pair) << endl; argLCount++; } - unsigned int retCount = 0; - BOOST_FOREACH(ReturnValue rt, returnVals) - { - if(retCount != returnVals.size() - 1) - proxyFile.oss << rt.return_type(false, rt.pair) << ", "; - else - proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; - - } - - proxyFile.oss << endl; proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; proxyFile.oss << " % " << "Method Overloads" << endl; diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 484f156df..d46fde81a 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -56,7 +56,7 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr unsigned int argLCount = 0; BOOST_FOREACH(ArgumentList argList, argLists) { - proxyFile.oss << " " << up_name << "("; + proxyFile.oss << " " << name << "("; unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { @@ -69,21 +69,10 @@ void StaticMethod::proxy_wrapper_fragments(FileWriter& proxyFile, FileWriter& wr if(argLCount != argLists.size()-1) proxyFile.oss << "), "; else - proxyFile.oss << ") : returns "; + proxyFile.oss << ") : returns " << returnVals[0].return_type(false, returnVals[0].pair) << endl; argLCount++; } - unsigned int retCount = 0; - BOOST_FOREACH(ReturnValue rt, returnVals) - { - if(retCount != returnVals.size() - 1) - proxyFile.oss << rt.return_type(false, rt.pair) << ", "; - else - proxyFile.oss << rt.return_type(false, rt.pair) << "" << endl; - - } - - proxyFile.oss << endl; proxyFile.oss << " % " << "Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; proxyFile.oss << " % " << "" << endl; proxyFile.oss << " % " << "Usage" << endl; diff --git a/wrap/tests/expected/Point2.m b/wrap/tests/expected/Point2.m index 85fb369dc..913a869b5 100644 --- a/wrap/tests/expected/Point2.m +++ b/wrap/tests/expected/Point2.m @@ -38,12 +38,11 @@ classdef Point2 < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object function varargout = argChar(this, varargin) - % ARGCHAR usage: ARGCHAR(char a) : returns void - + % ARGCHAR usage: argChar(char a) : returns void % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -56,8 +55,7 @@ classdef Point2 < handle end function varargout = argUChar(this, varargin) - % ARGUCHAR usage: ARGUCHAR(unsigned char a) : returns void - + % ARGUCHAR usage: argUChar(unsigned char a) : returns void % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -70,8 +68,7 @@ classdef Point2 < handle end function varargout = dim(this, varargin) - % DIM usage: DIM() : returns int - + % DIM usage: dim() : returns int % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -84,8 +81,7 @@ classdef Point2 < handle end function varargout = returnChar(this, varargin) - % RETURNCHAR usage: RETURNCHAR() : returns char - + % RETURNCHAR usage: returnChar() : returns char % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -98,8 +94,7 @@ classdef Point2 < handle end function varargout = vectorConfusion(this, varargin) - % VECTORCONFUSION usage: VECTORCONFUSION() : returns VectorNotEigen - + % VECTORCONFUSION usage: vectorConfusion() : returns VectorNotEigen % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -112,8 +107,7 @@ classdef Point2 < handle end function varargout = x(this, varargin) - % X usage: X() : returns double - + % X usage: x() : returns double % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -126,8 +120,7 @@ classdef Point2 < handle end function varargout = y(this, varargin) - % Y usage: Y() : returns double - + % Y usage: y() : returns double % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads diff --git a/wrap/tests/expected/Point3.m b/wrap/tests/expected/Point3.m index 88dd174e1..965815dc6 100644 --- a/wrap/tests/expected/Point3.m +++ b/wrap/tests/expected/Point3.m @@ -31,12 +31,11 @@ classdef Point3 < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object function varargout = norm(this, varargin) - % NORM usage: NORM() : returns double - + % NORM usage: norm() : returns double % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -52,8 +51,7 @@ classdef Point3 < handle methods(Static = true) function varargout = StaticFunctionRet(varargin) - % STATICFUNCTIONRET usage: STATICFUNCTIONRET(double z) : returns Point3 - + % STATICFUNCTIONRET usage: StaticFunctionRet(double z) : returns Point3 % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Usage @@ -66,8 +64,7 @@ classdef Point3 < handle end function varargout = StaticFunction(varargin) - % STATICFUNCTION usage: STATICFUNCTION() : returns double - + % STATICFUNCTION usage: staticFunction() : returns double % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Usage diff --git a/wrap/tests/expected/Test.m b/wrap/tests/expected/Test.m index b9cc86403..d39025971 100644 --- a/wrap/tests/expected/Test.m +++ b/wrap/tests/expected/Test.m @@ -50,12 +50,11 @@ classdef Test < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object function varargout = arg_EigenConstRef(this, varargin) - % ARG_EIGENCONSTREF usage: ARG_EIGENCONSTREF(Matrix value) : returns void - + % ARG_EIGENCONSTREF usage: arg_EigenConstRef(Matrix value) : returns void % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -68,8 +67,7 @@ classdef Test < handle end function varargout = create_MixedPtrs(this, varargin) - % CREATE_MIXEDPTRS usage: CREATE_MIXEDPTRS() : returns pair< Test, SharedTest > - + % CREATE_MIXEDPTRS usage: create_MixedPtrs() : returns pair< Test, SharedTest > % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -82,8 +80,7 @@ classdef Test < handle end function varargout = create_ptrs(this, varargin) - % CREATE_PTRS usage: CREATE_PTRS() : returns pair< SharedTest, SharedTest > - + % CREATE_PTRS usage: create_ptrs() : returns pair< SharedTest, SharedTest > % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -96,8 +93,7 @@ classdef Test < handle end function varargout = print(this, varargin) - % PRINT usage: PRINT() : returns void - + % PRINT usage: print() : returns void % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -110,8 +106,7 @@ classdef Test < handle end function varargout = return_Point2Ptr(this, varargin) - % RETURN_POINT2PTR usage: RETURN_POINT2PTR(bool value) : returns Point2 - + % RETURN_POINT2PTR usage: return_Point2Ptr(bool value) : returns Point2 % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -124,8 +119,7 @@ classdef Test < handle end function varargout = return_Test(this, varargin) - % RETURN_TEST usage: RETURN_TEST(Test value) : returns Test - + % RETURN_TEST usage: return_Test(Test value) : returns Test % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -138,8 +132,7 @@ classdef Test < handle end function varargout = return_TestPtr(this, varargin) - % RETURN_TESTPTR usage: RETURN_TESTPTR(Test value) : returns Test - + % RETURN_TESTPTR usage: return_TestPtr(Test value) : returns Test % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -152,8 +145,7 @@ classdef Test < handle end function varargout = return_bool(this, varargin) - % RETURN_BOOL usage: RETURN_BOOL(bool value) : returns bool - + % RETURN_BOOL usage: return_bool(bool value) : returns bool % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -166,8 +158,7 @@ classdef Test < handle end function varargout = return_double(this, varargin) - % RETURN_DOUBLE usage: RETURN_DOUBLE(double value) : returns double - + % RETURN_DOUBLE usage: return_double(double value) : returns double % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -180,8 +171,7 @@ classdef Test < handle end function varargout = return_field(this, varargin) - % RETURN_FIELD usage: RETURN_FIELD(Test t) : returns bool - + % RETURN_FIELD usage: return_field(Test t) : returns bool % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -194,8 +184,7 @@ classdef Test < handle end function varargout = return_int(this, varargin) - % RETURN_INT usage: RETURN_INT(int value) : returns int - + % RETURN_INT usage: return_int(int value) : returns int % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -208,8 +197,7 @@ classdef Test < handle end function varargout = return_matrix1(this, varargin) - % RETURN_MATRIX1 usage: RETURN_MATRIX1(Matrix value) : returns Matrix - + % RETURN_MATRIX1 usage: return_matrix1(Matrix value) : returns Matrix % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -222,8 +210,7 @@ classdef Test < handle end function varargout = return_matrix2(this, varargin) - % RETURN_MATRIX2 usage: RETURN_MATRIX2(Matrix value) : returns Matrix - + % RETURN_MATRIX2 usage: return_matrix2(Matrix value) : returns Matrix % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -236,8 +223,7 @@ classdef Test < handle end function varargout = return_pair(this, varargin) - % RETURN_PAIR usage: RETURN_PAIR(Vector v, Matrix A) : returns pair< Vector, Matrix > - + % RETURN_PAIR usage: return_pair(Vector v, Matrix A) : returns pair< Vector, Matrix > % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -250,8 +236,7 @@ classdef Test < handle end function varargout = return_ptrs(this, varargin) - % RETURN_PTRS usage: RETURN_PTRS(Test p1, Test p2) : returns pair< SharedTest, SharedTest > - + % RETURN_PTRS usage: return_ptrs(Test p1, Test p2) : returns pair< SharedTest, SharedTest > % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -264,8 +249,7 @@ classdef Test < handle end function varargout = return_size_t(this, varargin) - % RETURN_SIZE_T usage: RETURN_SIZE_T(size_t value) : returns size_t - + % RETURN_SIZE_T usage: return_size_t(size_t value) : returns size_t % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -278,8 +262,7 @@ classdef Test < handle end function varargout = return_string(this, varargin) - % RETURN_STRING usage: RETURN_STRING(string value) : returns string - + % RETURN_STRING usage: return_string(string value) : returns string % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -292,8 +275,7 @@ classdef Test < handle end function varargout = return_vector1(this, varargin) - % RETURN_VECTOR1 usage: RETURN_VECTOR1(Vector value) : returns Vector - + % RETURN_VECTOR1 usage: return_vector1(Vector value) : returns Vector % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -306,8 +288,7 @@ classdef Test < handle end function varargout = return_vector2(this, varargin) - % RETURN_VECTOR2 usage: RETURN_VECTOR2(Vector value) : returns Vector - + % RETURN_VECTOR2 usage: return_vector2(Vector value) : returns Vector % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads diff --git a/wrap/tests/expected_namespaces/+ns1/ClassA.m b/wrap/tests/expected_namespaces/+ns1/ClassA.m index f557bc621..2ce280041 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassA.m @@ -28,9 +28,9 @@ classdef ClassA < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object end methods(Static = true) diff --git a/wrap/tests/expected_namespaces/+ns1/ClassB.m b/wrap/tests/expected_namespaces/+ns1/ClassB.m index 70be8a2ff..5c4d82882 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassB.m @@ -28,9 +28,9 @@ classdef ClassB < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object end methods(Static = true) diff --git a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m index 07d496ddc..ff5ed9e3c 100644 --- a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m @@ -28,9 +28,9 @@ classdef ClassB < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object end methods(Static = true) diff --git a/wrap/tests/expected_namespaces/+ns2/ClassA.m b/wrap/tests/expected_namespaces/+ns2/ClassA.m index 46e43bdc6..d8f1dbc88 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassA.m @@ -32,12 +32,11 @@ classdef ClassA < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object function varargout = memberFunction(this, varargin) - % MEMBERFUNCTION usage: MEMBERFUNCTION() : returns double - + % MEMBERFUNCTION usage: memberFunction() : returns double % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -50,8 +49,7 @@ classdef ClassA < handle end function varargout = nsArg(this, varargin) - % NSARG usage: NSARG(ClassB arg) : returns int - + % NSARG usage: nsArg(ClassB arg) : returns int % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -64,8 +62,7 @@ classdef ClassA < handle end function varargout = nsReturn(this, varargin) - % NSRETURN usage: NSRETURN(double q) : returns ns2::ns3::ClassB - + % NSRETURN usage: nsReturn(double q) : returns ns2::ns3::ClassB % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Method Overloads @@ -81,8 +78,7 @@ classdef ClassA < handle methods(Static = true) function varargout = Afunction(varargin) - % AFUNCTION usage: AFUNCTION() : returns double - + % AFUNCTION usage: afunction() : returns double % Doxygen can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html % % Usage diff --git a/wrap/tests/expected_namespaces/+ns2/ClassC.m b/wrap/tests/expected_namespaces/+ns2/ClassC.m index a5485afcc..86cf9819f 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassC.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassC.m @@ -28,9 +28,9 @@ classdef ClassC < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object end methods(Static = true) diff --git a/wrap/tests/expected_namespaces/ClassD.m b/wrap/tests/expected_namespaces/ClassD.m index 1e672466c..13bac35d6 100644 --- a/wrap/tests/expected_namespaces/ClassD.m +++ b/wrap/tests/expected_namespaces/ClassD.m @@ -28,9 +28,9 @@ classdef ClassD < handle end function display(obj), obj.print(''); end - + %DISPLAY Calls print on the object function disp(obj), obj.display; end - + %DISP Calls print on the object end methods(Static = true) From 12eb4598e1a877cbe5d94ffd22fb86db49f2e3ce Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 29 Aug 2012 21:15:47 +0000 Subject: [PATCH 830/914] Created branch /branches/2.1.0 from /trunk:13097 From b74bf975498a975bce3856d27e52be324b6f3057 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 29 Aug 2012 21:22:16 +0000 Subject: [PATCH 831/914] Repointing cmake external in 2.1.0 branch From 166bb2e8b4e53e42d4ceabd6c8c9ed21e6242b6b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 29 Aug 2012 21:29:55 +0000 Subject: [PATCH 832/914] Pointing cmake externals at 2.1.0-pre1 tag From a01d479f44bff57da842bcea60c6e86daf39c469 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Wed, 29 Aug 2012 23:09:59 +0000 Subject: [PATCH 833/914] Needed to disable C++ findExampleDataFile when building matlab wrapper --- gtsam/slam/dataset.cpp | 2 ++ gtsam/slam/dataset.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/gtsam/slam/dataset.cpp b/gtsam/slam/dataset.cpp index e9ec73a85..4550b418d 100644 --- a/gtsam/slam/dataset.cpp +++ b/gtsam/slam/dataset.cpp @@ -35,6 +35,7 @@ namespace fs = boost::filesystem; namespace gtsam { +#ifndef MATLAB_MEX_FILE /* ************************************************************************* */ string findExampleDataFile(const string& name) { // Search source tree and installed location @@ -63,6 +64,7 @@ string findExampleDataFile(const string& name) { INSTALLED_DATASET_DIR " named\n" + name + ", " + name + ".graph, or " + name + ".txt"); } +#endif /* ************************************************************************* */ pair load2D( diff --git a/gtsam/slam/dataset.h b/gtsam/slam/dataset.h index 7c38e13c9..8da3d6ef9 100644 --- a/gtsam/slam/dataset.h +++ b/gtsam/slam/dataset.h @@ -25,6 +25,7 @@ namespace gtsam { +#ifndef MATLAB_MEX_FILE /** * Find the full path to an example dataset distributed with gtsam. The name * may be specified with or without a file extension - if no extension is @@ -37,6 +38,7 @@ namespace gtsam { * search process described above. */ std::string findExampleDataFile(const std::string& name); +#endif /** * Load TORO 2D Graph From 20c88705357b8182e0183dc0b5bf9e5670e37327 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 13:37:35 +0000 Subject: [PATCH 834/914] Pointing cmake external back to 2.1.0 branch From 47d40b07e77f6a960697112fe9badface5baa7f3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 14:47:01 +0000 Subject: [PATCH 835/914] Adding README file for matlab wrapper --- matlab/README-gtsam-toolbox.txt | 74 +++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 matlab/README-gtsam-toolbox.txt diff --git a/matlab/README-gtsam-toolbox.txt b/matlab/README-gtsam-toolbox.txt new file mode 100644 index 000000000..c9b22f3b7 --- /dev/null +++ b/matlab/README-gtsam-toolbox.txt @@ -0,0 +1,74 @@ +================================================================================ +GTSAM - Georgia Tech Smoothing and Mapping Library + +MATLAB wrapper + +http://borg.cc.gatech.edu/projects/gtsam +================================================================================ + +This is the GTSAM MATLAB toolbox, a MATLAB wrapper around the GTSAM C++ +library. + + +---------------------------------------- +Note about newer Ubuntu versions unsupported by MATLAB (later than 10.04) +---------------------------------------- + +If you have a newer Ubuntu system, you must make a small modification to your +MATLAB installation, due to MATLAB being distributed with an old version of +the C++ standard library. Delete or rename all files starting with +'libstdc++' in your MATLAB installation directory, typically +/usr/local/MATLAB/[version]/sys/os/[system]/ + + +---------------------------------------- +Adding the toolbox to your MATLAB path +---------------------------------------- + +To get started, first add the 'toolbox' folder to your MATLAB path - in the +MATLAB file browser, right-click on the folder and click 'Add to path -> This +folder' (do not add the subfolders to your path). + + +---------------------------------------- +Trying out the examples +---------------------------------------- + +The examples are located in the 'gtsam_examples' subfolder. You may either +run them individually at the MATLAB command line, or open the GTSAM example +GUI by running 'gtsamExamples'. Example: + +>> cd /Users/yourname/toolbox % Change to wherever you installed the toolbox +>> cd gtsam_examples % Change to the examples directory +>> gtsamExamples % Run the GTSAM examples GUI + + +---------------------------------------- +Running the unit tests +---------------------------------------- + +The GTSAM MATLAB toolbox also has a small set of unit tests located in the +gtsam_tests directory. Example: + +>> cd /Users/yourname/toolbox % Change to wherever you installed the toolbox +>> cd gtsam_tests % Change to the examples directory +>> test_gtsam % Run the unit tests +Starting: testJacobianFactor +Starting: testKalmanFilter +Starting: testLocalizationExample +Starting: testOdometryExample +Starting: testPlanarSLAMExample +Starting: testPose2SLAMExample +Starting: testPose3SLAMExample +Starting: testSFMExample +Starting: testStereoVOExample +Starting: testVisualISAMExample +Tests complete! + + +---------------------------------------- +Writing your own code +---------------------------------------- + +Coding for the GTSAM MATLAB toolbox is straightforward and very fast once you +understand a few basic concepts! Please see the manual to get started. From 4f4ced041ec5181d6a9c63f51f8eb3a25fce655a Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 30 Aug 2012 18:08:56 +0000 Subject: [PATCH 836/914] Added second path to remove matlab libraries from to readme --- matlab/README-gtsam-toolbox.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/matlab/README-gtsam-toolbox.txt b/matlab/README-gtsam-toolbox.txt index c9b22f3b7..6f74f9806 100644 --- a/matlab/README-gtsam-toolbox.txt +++ b/matlab/README-gtsam-toolbox.txt @@ -17,8 +17,10 @@ Note about newer Ubuntu versions unsupported by MATLAB (later than 10.04) If you have a newer Ubuntu system, you must make a small modification to your MATLAB installation, due to MATLAB being distributed with an old version of the C++ standard library. Delete or rename all files starting with -'libstdc++' in your MATLAB installation directory, typically -/usr/local/MATLAB/[version]/sys/os/[system]/ +'libstdc++' in your MATLAB installation directory, in paths: + + /usr/local/MATLAB/[version]/sys/os/[system]/ + /usr/local/MATLAB/[version]/bin/[system]/ ---------------------------------------- From f0d49f21f8a8047edb13e40af323ab15c2da5b61 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Thu, 30 Aug 2012 18:10:07 +0000 Subject: [PATCH 837/914] Added toolbox readme from release branch --- matlab/README-gtsam-toolbox.txt | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 matlab/README-gtsam-toolbox.txt diff --git a/matlab/README-gtsam-toolbox.txt b/matlab/README-gtsam-toolbox.txt new file mode 100644 index 000000000..6f74f9806 --- /dev/null +++ b/matlab/README-gtsam-toolbox.txt @@ -0,0 +1,76 @@ +================================================================================ +GTSAM - Georgia Tech Smoothing and Mapping Library + +MATLAB wrapper + +http://borg.cc.gatech.edu/projects/gtsam +================================================================================ + +This is the GTSAM MATLAB toolbox, a MATLAB wrapper around the GTSAM C++ +library. + + +---------------------------------------- +Note about newer Ubuntu versions unsupported by MATLAB (later than 10.04) +---------------------------------------- + +If you have a newer Ubuntu system, you must make a small modification to your +MATLAB installation, due to MATLAB being distributed with an old version of +the C++ standard library. Delete or rename all files starting with +'libstdc++' in your MATLAB installation directory, in paths: + + /usr/local/MATLAB/[version]/sys/os/[system]/ + /usr/local/MATLAB/[version]/bin/[system]/ + + +---------------------------------------- +Adding the toolbox to your MATLAB path +---------------------------------------- + +To get started, first add the 'toolbox' folder to your MATLAB path - in the +MATLAB file browser, right-click on the folder and click 'Add to path -> This +folder' (do not add the subfolders to your path). + + +---------------------------------------- +Trying out the examples +---------------------------------------- + +The examples are located in the 'gtsam_examples' subfolder. You may either +run them individually at the MATLAB command line, or open the GTSAM example +GUI by running 'gtsamExamples'. Example: + +>> cd /Users/yourname/toolbox % Change to wherever you installed the toolbox +>> cd gtsam_examples % Change to the examples directory +>> gtsamExamples % Run the GTSAM examples GUI + + +---------------------------------------- +Running the unit tests +---------------------------------------- + +The GTSAM MATLAB toolbox also has a small set of unit tests located in the +gtsam_tests directory. Example: + +>> cd /Users/yourname/toolbox % Change to wherever you installed the toolbox +>> cd gtsam_tests % Change to the examples directory +>> test_gtsam % Run the unit tests +Starting: testJacobianFactor +Starting: testKalmanFilter +Starting: testLocalizationExample +Starting: testOdometryExample +Starting: testPlanarSLAMExample +Starting: testPose2SLAMExample +Starting: testPose3SLAMExample +Starting: testSFMExample +Starting: testStereoVOExample +Starting: testVisualISAMExample +Tests complete! + + +---------------------------------------- +Writing your own code +---------------------------------------- + +Coding for the GTSAM MATLAB toolbox is straightforward and very fast once you +understand a few basic concepts! Please see the manual to get started. From 3b897cddc9603b38006fd2ba6fe6e803fda256c2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 19:58:33 +0000 Subject: [PATCH 838/914] Added eliminateFrontals function to FactorGraph, SymbolicFactorGraph, and GaussianFactorGraph - eliminates requested number of frontal variables and returns the resulting conditional and remaining factor graph --- gtsam.h | 5 +++ gtsam/inference/FactorGraph-inl.h | 52 +++++++++++++++++++++++ gtsam/inference/FactorGraph.h | 7 +++ gtsam/inference/SymbolicFactorGraph.cpp | 7 +++ gtsam/inference/SymbolicFactorGraph.h | 16 +++++-- gtsam/inference/tests/testFactorGraph.cpp | 30 ++++++++++++- gtsam/linear/GaussianFactorGraph.cpp | 7 +++ gtsam/linear/GaussianFactorGraph.h | 10 +++++ 8 files changed, 130 insertions(+), 4 deletions(-) diff --git a/gtsam.h b/gtsam.h index aebbea8b8..4aa1480df 100644 --- a/gtsam.h +++ b/gtsam.h @@ -787,6 +787,8 @@ class SymbolicFactorGraph { // Standard interface // FIXME: Must wrap FastSet for this to work //FastSet keys() const; + + pair eliminateFrontals(size_t nFrontals) const; }; #include @@ -996,6 +998,9 @@ class GaussianFactorGraph { size_t size() const; gtsam::GaussianFactor* at(size_t idx) const; + // Inference + pair eliminateFrontals(size_t nFrontals) const; + // Building the graph void push_back(gtsam::GaussianFactor* factor); void add(Vector b); diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 66c44db52..6bd9c340c 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -23,6 +23,7 @@ #pragma once #include +#include #include #include @@ -85,6 +86,57 @@ namespace gtsam { return size_; } + /* ************************************************************************* */ + template + std::pair::sharedConditional, FactorGraph > + FactorGraph::eliminateFrontals(size_t nFrontals, const Eliminate& eliminate) const + { + // Build variable index + VariableIndex variableIndex(*this); + + // Find first variable + Index firstIndex = 0; + while(firstIndex < variableIndex.size() && variableIndex[firstIndex].empty()) + ++ firstIndex; + + // Check that number of variables is in bounds + if(firstIndex + nFrontals >= variableIndex.size()) + throw std::invalid_argument("Requested to eliminate more frontal variables than exist in the factor graph."); + + // Get set of involved factors + FastSet involvedFactorIs; + for(Index j = firstIndex; j < firstIndex + nFrontals; ++j) { + BOOST_FOREACH(size_t i, variableIndex[j]) { + involvedFactorIs.insert(i); + } + } + + // Separate factors into involved and remaining + FactorGraph involvedFactors; + FactorGraph remainingFactors; + FastSet::const_iterator involvedFactorIsIt = involvedFactorIs.begin(); + for(size_t i = 0; i < this->size(); ++i) { + if(*involvedFactorIsIt == i) { + // If the current factor is involved, add it to involved and increment involved iterator + involvedFactors.push_back((*this)[i]); + ++ involvedFactorIsIt; + } else { + // If not involved, add to remaining + remainingFactors.push_back((*this)[i]); + } + } + + // Do dense elimination on the involved factors + typename FactorGraph::EliminationResult eliminationResult = + eliminate(involvedFactors, nFrontals); + + // Add the remaining factor back into the factor graph + remainingFactors.push_back(eliminationResult.second); + + // Return the eliminated factor and remaining factor graph + return std::make_pair(eliminationResult.first, remainingFactors); + } + /* ************************************************************************* */ template void FactorGraph::replace(size_t index, sharedFactor factor) { diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 5295a4c58..ed3e7d952 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -175,6 +175,13 @@ template class BayesTree; /** Get the last factor */ sharedFactor back() const { return factors_.back(); } + /** Eliminate the first \c n frontal variables, returning the resulting + * conditional and remaining factor graph - this is very inefficient for + * eliminating all variables, to do that use EliminationTree or + * JunctionTree. + */ + std::pair > eliminateFrontals(size_t nFrontals, const Eliminate& eliminate) const; + /// @} /// @name Modifying Factor Graphs (imperative, discouraged) /// @{ diff --git a/gtsam/inference/SymbolicFactorGraph.cpp b/gtsam/inference/SymbolicFactorGraph.cpp index 00f3439a0..ff7a91ca6 100644 --- a/gtsam/inference/SymbolicFactorGraph.cpp +++ b/gtsam/inference/SymbolicFactorGraph.cpp @@ -63,6 +63,13 @@ namespace gtsam { return keys; } + /* ************************************************************************* */ + std::pair + SymbolicFactorGraph::eliminateFrontals(size_t nFrontals) const + { + return FactorGraph::eliminateFrontals(nFrontals, EliminateSymbolic); + } + /* ************************************************************************* */ IndexFactor::shared_ptr CombineSymbolic( const FactorGraph& factors, const FastMap SymbolicFactorGraph(const FactorGraph& fg); + + /** Eliminate the first \c n frontal variables, returning the resulting + * conditional and remaining factor graph - this is very inefficient for + * eliminating all variables, to do that use EliminationTree or + * JunctionTree. Note that this version simply calls + * FactorGraph::eliminateFrontals with EliminateSymbolic + * as the eliminate function argument. + */ + std::pair eliminateFrontals(size_t nFrontals) const; /// @} /// @name Standard Interface @@ -68,6 +77,8 @@ namespace gtsam { */ FastSet keys() const; + + /// @} /// @name Advanced Interface /// @{ @@ -87,9 +98,8 @@ namespace gtsam { }; /** Create a combined joint factor (new style for EliminationTree). */ - IndexFactor::shared_ptr CombineSymbolic( - const FactorGraph& factors, const FastMap >& variableSlots); + IndexFactor::shared_ptr CombineSymbolic(const FactorGraph& factors, + const FastMap >& variableSlots); /** * CombineAndEliminate provides symbolic elimination. diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index 4743d1102..6121a7f99 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -21,16 +21,44 @@ #include #include #include // for operator += +#include using namespace boost::assign; #include +#include #include using namespace std; using namespace gtsam; -typedef boost::shared_ptr shared; +/* ************************************************************************* */ +TEST(FactorGraph, eliminateFrontals) { + + SymbolicFactorGraph sfgOrig; + sfgOrig.push_factor(0,1); + sfgOrig.push_factor(0,2); + sfgOrig.push_factor(1,3); + sfgOrig.push_factor(1,4); + sfgOrig.push_factor(2,3); + sfgOrig.push_factor(4,5); + + IndexConditional::shared_ptr actualCond; + SymbolicFactorGraph actualSfg; + boost::tie(actualCond, actualSfg) = sfgOrig.eliminateFrontals(2, EliminateSymbolic); + + vector condIndices; + condIndices += 0,1,2,3,4; + IndexConditional expectedCond(condIndices, 2); + + SymbolicFactorGraph expectedSfg; + expectedSfg.push_factor(2,3); + expectedSfg.push_factor(4,5); + expectedSfg.push_factor(2,3,4); + + EXPECT(assert_equal(expectedSfg, actualSfg)); + EXPECT(assert_equal(expectedCond, *actualCond)); +} ///* ************************************************************************* */ // SL-FIX TEST( FactorGraph, splitMinimumSpanningTree ) diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index e2598b1ac..02f37915c 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -47,6 +47,13 @@ namespace gtsam { return keys; } + /* ************************************************************************* */ + std::pair + GaussianFactorGraph::eliminateFrontals(size_t nFrontals) const + { + return FactorGraph::eliminateFrontals(nFrontals, EliminateQR); + } + /* ************************************************************************* */ void GaussianFactorGraph::permuteWithInverse( const Permutation& inversePermutation) { diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index fd1ec1f6c..51748b79b 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -132,6 +132,16 @@ namespace gtsam { typedef FastSet Keys; Keys keys() const; + + /** Eliminate the first \c n frontal variables, returning the resulting + * conditional and remaining factor graph - this is very inefficient for + * eliminating all variables, to do that use EliminationTree or + * JunctionTree. Note that this version simply calls + * FactorGraph::eliminateFrontals with EliminateQR as the + * eliminate function argument. + */ + std::pair eliminateFrontals(size_t nFrontals) const; + /** Permute the variables in the factors */ void permuteWithInverse(const Permutation& inversePermutation); From 84b13f3270f8f5acb30b1525fabcfb1c346891b5 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 20:12:52 +0000 Subject: [PATCH 839/914] (Ported change from trunk to 2.1.0 branch) Added eliminateFrontals function to FactorGraph, SymbolicFactorGraph, and GaussianFactorGraph - eliminates requested number of frontal variables and returns the resulting conditional and remaining factor graph --- gtsam.h | 5 +++ gtsam/inference/FactorGraph-inl.h | 52 +++++++++++++++++++++++ gtsam/inference/FactorGraph.h | 7 +++ gtsam/inference/SymbolicFactorGraph.cpp | 7 +++ gtsam/inference/SymbolicFactorGraph.h | 16 +++++-- gtsam/inference/tests/testFactorGraph.cpp | 30 ++++++++++++- gtsam/linear/GaussianFactorGraph.cpp | 7 +++ gtsam/linear/GaussianFactorGraph.h | 10 +++++ 8 files changed, 130 insertions(+), 4 deletions(-) diff --git a/gtsam.h b/gtsam.h index aebbea8b8..4aa1480df 100644 --- a/gtsam.h +++ b/gtsam.h @@ -787,6 +787,8 @@ class SymbolicFactorGraph { // Standard interface // FIXME: Must wrap FastSet for this to work //FastSet keys() const; + + pair eliminateFrontals(size_t nFrontals) const; }; #include @@ -996,6 +998,9 @@ class GaussianFactorGraph { size_t size() const; gtsam::GaussianFactor* at(size_t idx) const; + // Inference + pair eliminateFrontals(size_t nFrontals) const; + // Building the graph void push_back(gtsam::GaussianFactor* factor); void add(Vector b); diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 66c44db52..6bd9c340c 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -23,6 +23,7 @@ #pragma once #include +#include #include #include @@ -85,6 +86,57 @@ namespace gtsam { return size_; } + /* ************************************************************************* */ + template + std::pair::sharedConditional, FactorGraph > + FactorGraph::eliminateFrontals(size_t nFrontals, const Eliminate& eliminate) const + { + // Build variable index + VariableIndex variableIndex(*this); + + // Find first variable + Index firstIndex = 0; + while(firstIndex < variableIndex.size() && variableIndex[firstIndex].empty()) + ++ firstIndex; + + // Check that number of variables is in bounds + if(firstIndex + nFrontals >= variableIndex.size()) + throw std::invalid_argument("Requested to eliminate more frontal variables than exist in the factor graph."); + + // Get set of involved factors + FastSet involvedFactorIs; + for(Index j = firstIndex; j < firstIndex + nFrontals; ++j) { + BOOST_FOREACH(size_t i, variableIndex[j]) { + involvedFactorIs.insert(i); + } + } + + // Separate factors into involved and remaining + FactorGraph involvedFactors; + FactorGraph remainingFactors; + FastSet::const_iterator involvedFactorIsIt = involvedFactorIs.begin(); + for(size_t i = 0; i < this->size(); ++i) { + if(*involvedFactorIsIt == i) { + // If the current factor is involved, add it to involved and increment involved iterator + involvedFactors.push_back((*this)[i]); + ++ involvedFactorIsIt; + } else { + // If not involved, add to remaining + remainingFactors.push_back((*this)[i]); + } + } + + // Do dense elimination on the involved factors + typename FactorGraph::EliminationResult eliminationResult = + eliminate(involvedFactors, nFrontals); + + // Add the remaining factor back into the factor graph + remainingFactors.push_back(eliminationResult.second); + + // Return the eliminated factor and remaining factor graph + return std::make_pair(eliminationResult.first, remainingFactors); + } + /* ************************************************************************* */ template void FactorGraph::replace(size_t index, sharedFactor factor) { diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 5295a4c58..ed3e7d952 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -175,6 +175,13 @@ template class BayesTree; /** Get the last factor */ sharedFactor back() const { return factors_.back(); } + /** Eliminate the first \c n frontal variables, returning the resulting + * conditional and remaining factor graph - this is very inefficient for + * eliminating all variables, to do that use EliminationTree or + * JunctionTree. + */ + std::pair > eliminateFrontals(size_t nFrontals, const Eliminate& eliminate) const; + /// @} /// @name Modifying Factor Graphs (imperative, discouraged) /// @{ diff --git a/gtsam/inference/SymbolicFactorGraph.cpp b/gtsam/inference/SymbolicFactorGraph.cpp index 00f3439a0..ff7a91ca6 100644 --- a/gtsam/inference/SymbolicFactorGraph.cpp +++ b/gtsam/inference/SymbolicFactorGraph.cpp @@ -63,6 +63,13 @@ namespace gtsam { return keys; } + /* ************************************************************************* */ + std::pair + SymbolicFactorGraph::eliminateFrontals(size_t nFrontals) const + { + return FactorGraph::eliminateFrontals(nFrontals, EliminateSymbolic); + } + /* ************************************************************************* */ IndexFactor::shared_ptr CombineSymbolic( const FactorGraph& factors, const FastMap SymbolicFactorGraph(const FactorGraph& fg); + + /** Eliminate the first \c n frontal variables, returning the resulting + * conditional and remaining factor graph - this is very inefficient for + * eliminating all variables, to do that use EliminationTree or + * JunctionTree. Note that this version simply calls + * FactorGraph::eliminateFrontals with EliminateSymbolic + * as the eliminate function argument. + */ + std::pair eliminateFrontals(size_t nFrontals) const; /// @} /// @name Standard Interface @@ -68,6 +77,8 @@ namespace gtsam { */ FastSet keys() const; + + /// @} /// @name Advanced Interface /// @{ @@ -87,9 +98,8 @@ namespace gtsam { }; /** Create a combined joint factor (new style for EliminationTree). */ - IndexFactor::shared_ptr CombineSymbolic( - const FactorGraph& factors, const FastMap >& variableSlots); + IndexFactor::shared_ptr CombineSymbolic(const FactorGraph& factors, + const FastMap >& variableSlots); /** * CombineAndEliminate provides symbolic elimination. diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index 4743d1102..6121a7f99 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -21,16 +21,44 @@ #include #include #include // for operator += +#include using namespace boost::assign; #include +#include #include using namespace std; using namespace gtsam; -typedef boost::shared_ptr shared; +/* ************************************************************************* */ +TEST(FactorGraph, eliminateFrontals) { + + SymbolicFactorGraph sfgOrig; + sfgOrig.push_factor(0,1); + sfgOrig.push_factor(0,2); + sfgOrig.push_factor(1,3); + sfgOrig.push_factor(1,4); + sfgOrig.push_factor(2,3); + sfgOrig.push_factor(4,5); + + IndexConditional::shared_ptr actualCond; + SymbolicFactorGraph actualSfg; + boost::tie(actualCond, actualSfg) = sfgOrig.eliminateFrontals(2, EliminateSymbolic); + + vector condIndices; + condIndices += 0,1,2,3,4; + IndexConditional expectedCond(condIndices, 2); + + SymbolicFactorGraph expectedSfg; + expectedSfg.push_factor(2,3); + expectedSfg.push_factor(4,5); + expectedSfg.push_factor(2,3,4); + + EXPECT(assert_equal(expectedSfg, actualSfg)); + EXPECT(assert_equal(expectedCond, *actualCond)); +} ///* ************************************************************************* */ // SL-FIX TEST( FactorGraph, splitMinimumSpanningTree ) diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index e2598b1ac..02f37915c 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -47,6 +47,13 @@ namespace gtsam { return keys; } + /* ************************************************************************* */ + std::pair + GaussianFactorGraph::eliminateFrontals(size_t nFrontals) const + { + return FactorGraph::eliminateFrontals(nFrontals, EliminateQR); + } + /* ************************************************************************* */ void GaussianFactorGraph::permuteWithInverse( const Permutation& inversePermutation) { diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index fd1ec1f6c..51748b79b 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -132,6 +132,16 @@ namespace gtsam { typedef FastSet Keys; Keys keys() const; + + /** Eliminate the first \c n frontal variables, returning the resulting + * conditional and remaining factor graph - this is very inefficient for + * eliminating all variables, to do that use EliminationTree or + * JunctionTree. Note that this version simply calls + * FactorGraph::eliminateFrontals with EliminateQR as the + * eliminate function argument. + */ + std::pair eliminateFrontals(size_t nFrontals) const; + /** Permute the variables in the factors */ void permuteWithInverse(const Permutation& inversePermutation); From 421145df1d653193c7f246f438cf7e9dbec8641d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 20:13:00 +0000 Subject: [PATCH 840/914] Fixed error in unit test --- gtsam/inference/tests/testFactorGraph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index 6121a7f99..b2f9bc3f1 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -45,7 +45,7 @@ TEST(FactorGraph, eliminateFrontals) { IndexConditional::shared_ptr actualCond; SymbolicFactorGraph actualSfg; - boost::tie(actualCond, actualSfg) = sfgOrig.eliminateFrontals(2, EliminateSymbolic); + boost::tie(actualCond, actualSfg) = sfgOrig.eliminateFrontals(2); vector condIndices; condIndices += 0,1,2,3,4; From 09558a146aa38817c93979e90fe87b0e882a1e72 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 20:13:36 +0000 Subject: [PATCH 841/914] Fixed error in unit test --- gtsam/inference/tests/testFactorGraph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index 6121a7f99..b2f9bc3f1 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -45,7 +45,7 @@ TEST(FactorGraph, eliminateFrontals) { IndexConditional::shared_ptr actualCond; SymbolicFactorGraph actualSfg; - boost::tie(actualCond, actualSfg) = sfgOrig.eliminateFrontals(2, EliminateSymbolic); + boost::tie(actualCond, actualSfg) = sfgOrig.eliminateFrontals(2); vector condIndices; condIndices += 0,1,2,3,4; From 49a704c565f49df8e09668a63f0f57eb55c7df9a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 20:17:27 +0000 Subject: [PATCH 842/914] Install MATLAB toolbox README along with toolbox --- matlab/CMakeLists.txt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index b4e43d3d6..0be3863a1 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -1,13 +1,5 @@ # Install matlab components -# Utility functions -message(STATUS "Installing Matlab Utility Functions") -# Matlab files: *.m and *.fig -file(GLOB matlab_utils_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.m") -file(GLOB matlab_utils_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.fig") -set(matlab_utils ${matlab_utils_m} ${matlab_utils_fig}) -install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/) - # Tests message(STATUS "Installing Matlab Toolbox Tests") install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_tests" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") @@ -21,6 +13,7 @@ install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION " # Utilities message(STATUS "Installing Matlab Toolbox Utilities") install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/+gtsam" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") +install(FILES "${GTSAM_SOURCE_ROOT_DIR}/matlab/README-gtsam-toolbox.txt" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}") message(STATUS "Installing Matlab Toolbox Examples (Data)") # Data files: *.graph and *.txt From a16f91d403726be3656aef3f07150c835da344fc Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 30 Aug 2012 20:17:51 +0000 Subject: [PATCH 843/914] Install MATLAB toolbox README along with toolbox --- matlab/CMakeLists.txt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index b4e43d3d6..0be3863a1 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -1,13 +1,5 @@ # Install matlab components -# Utility functions -message(STATUS "Installing Matlab Utility Functions") -# Matlab files: *.m and *.fig -file(GLOB matlab_utils_m "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.m") -file(GLOB matlab_utils_fig "${GTSAM_SOURCE_ROOT_DIR}/matlab/*.fig") -set(matlab_utils ${matlab_utils_m} ${matlab_utils_fig}) -install(FILES ${matlab_utils} DESTINATION ${GTSAM_TOOLBOX_INSTALL_PATH}/) - # Tests message(STATUS "Installing Matlab Toolbox Tests") install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_tests" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") @@ -21,6 +13,7 @@ install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION " # Utilities message(STATUS "Installing Matlab Toolbox Utilities") install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/+gtsam" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") +install(FILES "${GTSAM_SOURCE_ROOT_DIR}/matlab/README-gtsam-toolbox.txt" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}") message(STATUS "Installing Matlab Toolbox Examples (Data)") # Data files: *.graph and *.txt From b6e9f7d3f7efebf1ac61a21e0af33ff20ea52dfc Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Thu, 30 Aug 2012 21:19:00 +0000 Subject: [PATCH 844/914] Added info on MEX_COMMAND for building toolbox from source --- README | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README b/README index 729c3fdf1..1a992292a 100644 --- a/README +++ b/README @@ -148,6 +148,12 @@ just the geometry tests, run "make check.geometry". Individual tests can be run appending ".run" to the name of the test, for example, to run testMatrix, run "make testMatrix.run". +MEX_COMMAND: Path to the mex compiler. Defaults to assume the path is included in your +shell's PATH environment variable. mex is installed with matlab at +$MATLABROOT/bin/mex + +$MATLABROOT can be found by executing the command 'matlabroot' in MATLAB + Debugging tips: Another useful debugging symbol is _GLIBCXX_DEBUG, which enables debug checks From e5fe979ea524f3ef52bd621d9f661de943f61cef Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 31 Aug 2012 02:19:00 +0000 Subject: [PATCH 845/914] Fixed incorrect test case in testFactorGraph --- .cproject | 338 ++++++++++++---------- gtsam/inference/tests/testFactorGraph.cpp | 1 - 2 files changed, 178 insertions(+), 161 deletions(-) diff --git a/.cproject b/.cproject index 95c0f2a96..09c498789 100644 --- a/.cproject +++ b/.cproject @@ -309,14 +309,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -343,6 +335,7 @@ make + tests/testBayesTree.run true false @@ -350,6 +343,7 @@ make + testBinaryBayesNet.run true false @@ -397,6 +391,7 @@ make + testSymbolicBayesNet.run true false @@ -404,6 +399,7 @@ make + tests/testSymbolicFactor.run true false @@ -411,6 +407,7 @@ make + testSymbolicFactorGraph.run true false @@ -426,11 +423,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -519,22 +525,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -551,6 +541,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -575,26 +581,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -679,26 +685,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -823,6 +829,14 @@ true true + + make + -j5 + testFactorGraph.run + true + true + true + make -j2 @@ -985,6 +999,7 @@ make + testGraph.run true false @@ -992,6 +1007,7 @@ make + testJunctionTree.run true false @@ -999,6 +1015,7 @@ make + testSymbolicBayesNetB.run true false @@ -1134,6 +1151,7 @@ make + testErrors.run true false @@ -1179,10 +1197,10 @@ true true - + make - -j2 - testGaussianFactor.run + -j5 + testLinearContainerFactor.run true true true @@ -1267,10 +1285,10 @@ true true - + make - -j5 - testLinearContainerFactor.run + -j2 + testGaussianFactor.run true true true @@ -1605,7 +1623,6 @@ make - testSimulated2DOriented.run true false @@ -1645,7 +1662,6 @@ make - testSimulated2D.run true false @@ -1653,7 +1669,6 @@ make - testSimulated3D.run true false @@ -1845,7 +1860,6 @@ make - tests/testGaussianISAM2 true false @@ -1867,102 +1881,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j1 @@ -2164,6 +2082,7 @@ cpack + -G DEB true false @@ -2171,6 +2090,7 @@ cpack + -G RPM true false @@ -2178,6 +2098,7 @@ cpack + -G TGZ true false @@ -2185,6 +2106,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2318,34 +2240,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2389,6 +2375,38 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index b2f9bc3f1..09e75d7e6 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -52,7 +52,6 @@ TEST(FactorGraph, eliminateFrontals) { IndexConditional expectedCond(condIndices, 2); SymbolicFactorGraph expectedSfg; - expectedSfg.push_factor(2,3); expectedSfg.push_factor(4,5); expectedSfg.push_factor(2,3,4); From 5706481c06edba00accc8c99de339720d6677cc2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 31 Aug 2012 15:15:16 +0000 Subject: [PATCH 846/914] Fixed iterator checking bug in eliminateFrontals --- gtsam/inference/FactorGraph-inl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 6bd9c340c..97a7fa1c6 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -116,7 +116,7 @@ namespace gtsam { FactorGraph remainingFactors; FastSet::const_iterator involvedFactorIsIt = involvedFactorIs.begin(); for(size_t i = 0; i < this->size(); ++i) { - if(*involvedFactorIsIt == i) { + if(involvedFactorIsIt != involvedFactorIs.end() && *involvedFactorIsIt == i) { // If the current factor is involved, add it to involved and increment involved iterator involvedFactors.push_back((*this)[i]); ++ involvedFactorIsIt; From fc1a43e5855477cbd5018dc04d7cfe1b44b480f0 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 31 Aug 2012 15:18:36 +0000 Subject: [PATCH 847/914] Reverting - Fixed incorrect test case in testFactorGraph (reverse-merged from commit 34e4c87523093f77f26a5c378763a715d56452b7) --- .cproject | 338 ++++++++++------------ gtsam/inference/tests/testFactorGraph.cpp | 1 + 2 files changed, 161 insertions(+), 178 deletions(-) diff --git a/.cproject b/.cproject index 09c498789..95c0f2a96 100644 --- a/.cproject +++ b/.cproject @@ -309,6 +309,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -335,7 +343,6 @@ make - tests/testBayesTree.run true false @@ -343,7 +350,6 @@ make - testBinaryBayesNet.run true false @@ -391,7 +397,6 @@ make - testSymbolicBayesNet.run true false @@ -399,7 +404,6 @@ make - tests/testSymbolicFactor.run true false @@ -407,7 +411,6 @@ make - testSymbolicFactorGraph.run true false @@ -423,20 +426,11 @@ make - tests/testBayesTree true false true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j5 @@ -525,22 +519,6 @@ false true - - make - -j2 - tests/testPose2.run - true - true - true - - - make - -j2 - tests/testPose3.run - true - true - true - make -j2 @@ -557,6 +535,22 @@ true true + + make + -j2 + tests/testPose2.run + true + true + true + + + make + -j2 + tests/testPose3.run + true + true + true + make -j2 @@ -581,26 +575,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -685,26 +679,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -829,14 +823,6 @@ true true - - make - -j5 - testFactorGraph.run - true - true - true - make -j2 @@ -999,7 +985,6 @@ make - testGraph.run true false @@ -1007,7 +992,6 @@ make - testJunctionTree.run true false @@ -1015,7 +999,6 @@ make - testSymbolicBayesNetB.run true false @@ -1151,7 +1134,6 @@ make - testErrors.run true false @@ -1197,10 +1179,10 @@ true true - + make - -j5 - testLinearContainerFactor.run + -j2 + testGaussianFactor.run true true true @@ -1285,10 +1267,10 @@ true true - + make - -j2 - testGaussianFactor.run + -j5 + testLinearContainerFactor.run true true true @@ -1623,6 +1605,7 @@ make + testSimulated2DOriented.run true false @@ -1662,6 +1645,7 @@ make + testSimulated2D.run true false @@ -1669,6 +1653,7 @@ make + testSimulated3D.run true false @@ -1860,6 +1845,7 @@ make + tests/testGaussianISAM2 true false @@ -1881,6 +1867,102 @@ true true + + make + -j2 + testRot3.run + true + true + true + + + make + -j2 + testRot2.run + true + true + true + + + make + -j2 + testPose3.run + true + true + true + + + make + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run + true + true + true + make -j1 @@ -2082,7 +2164,6 @@ cpack - -G DEB true false @@ -2090,7 +2171,6 @@ cpack - -G RPM true false @@ -2098,7 +2178,6 @@ cpack - -G TGZ true false @@ -2106,7 +2185,6 @@ cpack - --config CPackSourceConfig.cmake true false @@ -2240,98 +2318,34 @@ true true - + make - -j2 - testRot3.run + -j5 + testSpirit.run true true true - + make - -j2 - testRot2.run + -j5 + testWrap.run true true true - + make - -j2 - testPose3.run + -j5 + check.wrap true true true - + make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run + -j5 + wrap true true true @@ -2375,38 +2389,6 @@ false true - - make - -j5 - testSpirit.run - true - true - true - - - make - -j5 - testWrap.run - true - true - true - - - make - -j5 - check.wrap - true - true - true - - - make - -j5 - wrap - true - true - true - diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index 09e75d7e6..b2f9bc3f1 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -52,6 +52,7 @@ TEST(FactorGraph, eliminateFrontals) { IndexConditional expectedCond(condIndices, 2); SymbolicFactorGraph expectedSfg; + expectedSfg.push_factor(2,3); expectedSfg.push_factor(4,5); expectedSfg.push_factor(2,3,4); From 3948d70b206cd58c7fd971e2205318220c8b7a1d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 31 Aug 2012 15:18:39 +0000 Subject: [PATCH 848/914] Fixed iterator checking bug in eliminateFrontals --- gtsam/inference/FactorGraph-inl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 6bd9c340c..97a7fa1c6 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -116,7 +116,7 @@ namespace gtsam { FactorGraph remainingFactors; FastSet::const_iterator involvedFactorIsIt = involvedFactorIs.begin(); for(size_t i = 0; i < this->size(); ++i) { - if(*involvedFactorIsIt == i) { + if(involvedFactorIsIt != involvedFactorIs.end() && *involvedFactorIsIt == i) { // If the current factor is involved, add it to involved and increment involved iterator involvedFactors.push_back((*this)[i]); ++ involvedFactorIsIt; From 91559d3c255f4ea5751afa83a0a243dfbb05de79 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Fri, 31 Aug 2012 15:19:22 +0000 Subject: [PATCH 849/914] Added info on MEX_COMMAND for building toolbox from source --- README | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README b/README index 729c3fdf1..1a992292a 100644 --- a/README +++ b/README @@ -148,6 +148,12 @@ just the geometry tests, run "make check.geometry". Individual tests can be run appending ".run" to the name of the test, for example, to run testMatrix, run "make testMatrix.run". +MEX_COMMAND: Path to the mex compiler. Defaults to assume the path is included in your +shell's PATH environment variable. mex is installed with matlab at +$MATLABROOT/bin/mex + +$MATLABROOT can be found by executing the command 'matlabroot' in MATLAB + Debugging tips: Another useful debugging symbol is _GLIBCXX_DEBUG, which enables debug checks From a058ecb692cc63f432c243dcdc711eca51f918c5 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Fri, 31 Aug 2012 19:22:07 +0000 Subject: [PATCH 850/914] disabled installing doc during creation of deb packages --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85984d7e0..6349d440a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -171,7 +171,8 @@ set(CPACK_PACKAGE_VERSION_MAJOR ${GTSAM_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${GTSAM_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${GTSAM_VERSION_PATCH}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") -set(CPACK_INSTALLED_DIRECTORIES "doc;.") # Include doc directory +#set(CPACK_INSTALLED_DIRECTORIES "doc;.") # Include doc directory +set(CPACK_INSTALLED_DIRECTORIES ".") set(CPACK_SOURCE_IGNORE_FILES "/build;/\\\\.;/makestats.sh$") set(CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/gtsam_unstable/") set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}") From ab7594e8f084e710be63590813c0b2d9f2b84935 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 3 Sep 2012 00:06:13 +0000 Subject: [PATCH 851/914] Made SPCG unit tests compile again, needed several fixes in iterative.h --- gtsam/linear/SubgraphPreconditioner.h | 18 +- gtsam/linear/iterative-inl.h | 2 +- gtsam/linear/iterative.cpp | 69 +++--- gtsam/linear/iterative.h | 17 +- tests/smallExample.cpp | 18 +- tests/smallExample.h | 2 +- tests/testSubgraphPreconditioner.cpp | 304 +++++++++++++------------- 7 files changed, 227 insertions(+), 203 deletions(-) diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h index 7b59735d9..8c1fcc837 100644 --- a/gtsam/linear/SubgraphPreconditioner.h +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -48,6 +48,7 @@ namespace gtsam { public: SubgraphPreconditioner(); + /** * Constructor * @param Ab1: the Graph A1*x=b1 @@ -55,7 +56,8 @@ namespace gtsam { * @param Rc1: the Bayes Net R1*x=c1 * @param xbar: the solution to R1*x=c1 */ - SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar); + SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, + const sharedBayesNet& Rc1, const sharedValues& xbar); /** Access Ab1 */ const sharedFG& Ab1() const { return Ab1_; } @@ -69,23 +71,23 @@ namespace gtsam { /** Access b2bar */ const sharedErrors b2bar() const { return b2bar_; } - /** - * Add zero-mean i.i.d. Gaussian prior terms to each variable - * @param sigma Standard deviation of Gaussian - */ -// SubgraphPreconditioner add_priors(double sigma) const; + /** + * Add zero-mean i.i.d. Gaussian prior terms to each variable + * @param sigma Standard deviation of Gaussian + */ +// SubgraphPreconditioner add_priors(double sigma) const; /* x = xbar + inv(R1)*y */ VectorValues x(const VectorValues& y) const; /* A zero VectorValues with the structure of xbar */ VectorValues zero() const { - VectorValues V(VectorValues::Zero(*xbar_)) ; + VectorValues V(VectorValues::Zero(*xbar_)); return V ; } /** - * Add constraint part of the error only, used in both calls above + * Add constraint part of the error only * y += alpha*inv(R1')*A2'*e2 * Takes a range indicating e2 !!!! */ diff --git a/gtsam/linear/iterative-inl.h b/gtsam/linear/iterative-inl.h index 8a052a66f..5cc0841b0 100644 --- a/gtsam/linear/iterative-inl.h +++ b/gtsam/linear/iterative-inl.h @@ -122,7 +122,7 @@ namespace gtsam { // conjugate gradient method. // S: linear system, V: step vector, E: errors template - V conjugateGradients(const S& Ab, V x, const ConjugateGradientParameters ¶meters, bool steepest = false) { + V conjugateGradients(const S& Ab, V x, const ConjugateGradientParameters ¶meters, bool steepest) { CGState state(Ab, x, parameters, steepest); diff --git a/gtsam/linear/iterative.cpp b/gtsam/linear/iterative.cpp index 6dadb2d72..d0a7fd551 100644 --- a/gtsam/linear/iterative.cpp +++ b/gtsam/linear/iterative.cpp @@ -22,50 +22,57 @@ #include #include - #include using namespace std; namespace gtsam { - /* ************************************************************************* */ - void System::print (const string& s) const { - cout << s << endl; - gtsam::print(A_, "A"); - gtsam::print(b_, "b"); - } + /* ************************************************************************* */ + void System::print(const string& s) const { + cout << s << endl; + gtsam::print(A_, "A"); + gtsam::print(b_, "b"); + } - /* ************************************************************************* */ + /* ************************************************************************* */ - Vector steepestDescent(const System& Ab, const Vector& x, const ConjugateGradientParameters & parameters) { - return conjugateGradients (Ab, x, parameters, true); - } + Vector steepestDescent(const System& Ab, const Vector& x, + const ConjugateGradientParameters & parameters) { + return conjugateGradients(Ab, x, parameters, true); + } - Vector conjugateGradientDescent(const System& Ab, const Vector& x, const ConjugateGradientParameters & parameters) { - return conjugateGradients (Ab, x, parameters); - } + Vector conjugateGradientDescent(const System& Ab, const Vector& x, + const ConjugateGradientParameters & parameters) { + return conjugateGradients(Ab, x, parameters); + } - /* ************************************************************************* */ - Vector steepestDescent(const Matrix& A, const Vector& b, const Vector& x, const ConjugateGradientParameters & parameters) { - System Ab(A, b); - return conjugateGradients (Ab, x, parameters, true); - } + /* ************************************************************************* */ + Vector steepestDescent(const Matrix& A, const Vector& b, const Vector& x, + const ConjugateGradientParameters & parameters) { + System Ab(A, b); + return conjugateGradients(Ab, x, parameters, true); + } - Vector conjugateGradientDescent(const Matrix& A, const Vector& b, const Vector& x, const ConjugateGradientParameters & parameters) { - System Ab(A, b); - return conjugateGradients (Ab, x, parameters); - } + Vector conjugateGradientDescent(const Matrix& A, const Vector& b, + const Vector& x, const ConjugateGradientParameters & parameters) { + System Ab(A, b); + return conjugateGradients(Ab, x, parameters); + } - /* ************************************************************************* */ - VectorValues steepestDescent(const FactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters) { - return conjugateGradients, VectorValues, Errors> (fg, x, parameters, true); - } + /* ************************************************************************* */ + VectorValues steepestDescent(const FactorGraph& fg, + const VectorValues& x, const ConjugateGradientParameters & parameters) { + return conjugateGradients, VectorValues, Errors>( + fg, x, parameters, true); + } - VectorValues conjugateGradientDescent(const FactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters) { - return conjugateGradients, VectorValues, Errors> (fg, x, parameters); - } + VectorValues conjugateGradientDescent(const FactorGraph& fg, + const VectorValues& x, const ConjugateGradientParameters & parameters) { + return conjugateGradients, VectorValues, Errors>( + fg, x, parameters); + } - /* ************************************************************************* */ +/* ************************************************************************* */ } // namespace gtsam diff --git a/gtsam/linear/iterative.h b/gtsam/linear/iterative.h index 5ffb366c2..384dfe814 100644 --- a/gtsam/linear/iterative.h +++ b/gtsam/linear/iterative.h @@ -31,12 +31,11 @@ namespace gtsam { * "Vector" class E needs dot(v,v) * @param Ab, the "system" that needs to be solved, examples below * @param x is the initial estimate - * @param epsilon determines the convergence criterion: norm(g) - V conjugateGradients(const S& Ab, V x, bool verbose, double epsilon, size_t maxIterations, bool steepest = false); + template + V conjugateGradients(const S& Ab, V x, + const ConjugateGradientParameters ¶meters, bool steepest = false); /** * Helper class encapsulating the combined system |Ax-b_|^2 @@ -127,21 +126,19 @@ namespace gtsam { const Vector& x, const ConjugateGradientParameters & parameters); - class GaussianFactorGraph; - /** * Method of steepest gradients, Gaussian Factor Graph version - * */ + */ VectorValues steepestDescent( - const GaussianFactorGraph& fg, + const FactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters); /** * Method of conjugate gradients (CG), Gaussian Factor Graph version - * */ + */ VectorValues conjugateGradientDescent( - const GaussianFactorGraph& fg, + const FactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters); diff --git a/tests/smallExample.cpp b/tests/smallExample.cpp index 100a4db4c..f81ab5528 100644 --- a/tests/smallExample.cpp +++ b/tests/smallExample.cpp @@ -421,7 +421,7 @@ namespace example { } /* ************************************************************************* */ - boost::tuple planarGraph(size_t N) { + boost::tuple planarGraph(size_t N) { // create empty graph NonlinearFactorGraph nlfg; @@ -458,7 +458,13 @@ namespace example { xtrue[ordering[key(x, y)]] = Point2(x,y).vector(); // linearize around zero - return boost::make_tuple(*nlfg.linearize(zeros, ordering), xtrue); + boost::shared_ptr gfg = nlfg.linearize(zeros, ordering); + + JacobianFactorGraph jfg; + BOOST_FOREACH(GaussianFactorGraph::sharedFactor factor, *gfg) + jfg.push_back(boost::dynamic_pointer_cast(factor)); + + return boost::make_tuple(jfg, xtrue); } /* ************************************************************************* */ @@ -476,21 +482,21 @@ namespace example { JacobianFactorGraph T, C; // Add the x11 constraint to the tree - T.push_back(original[0]); + T.push_back(boost::dynamic_pointer_cast(original[0])); // Add all horizontal constraints to the tree size_t i = 1; for (size_t x = 1; x < N; x++) for (size_t y = 1; y <= N; y++, i++) - T.push_back(original[i]); + T.push_back(boost::dynamic_pointer_cast(original[i])); // Add first vertical column of constraints to T, others to C for (size_t x = 1; x <= N; x++) for (size_t y = 1; y < N; y++, i++) if (x == 1) - T.push_back(original[i]); + T.push_back(boost::dynamic_pointer_cast(original[i])); else - C.push_back(original[i]); + C.push_back(boost::dynamic_pointer_cast(original[i])); return make_pair(T, C); } diff --git a/tests/smallExample.h b/tests/smallExample.h index 161c45da8..54c3a14c5 100644 --- a/tests/smallExample.h +++ b/tests/smallExample.h @@ -130,7 +130,7 @@ namespace gtsam { * -x11-x21-x31 * with x11 clamped at (1,1), and others related by 2D odometry. */ - boost::tuple planarGraph(size_t N); + boost::tuple planarGraph(size_t N); /* * Create canonical ordering for planar graph that also works for tree diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index 417643e78..60f737d67 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -35,30 +36,41 @@ using namespace gtsam; using namespace example; // define keys -Key i3003 = 3003, i2003 = 2003, i1003 = 1003; -Key i3002 = 3002, i2002 = 2002, i1002 = 1002; -Key i3001 = 3001, i2001 = 2001, i1001 = 1001; +// Create key for simulated planar graph +Symbol key(int x, int y) { + return symbol_shorthand::X(1000*x+y); +} -// TODO fix Ordering::equals, because the ordering *is* correct ! /* ************************************************************************* */ -//TEST( SubgraphPreconditioner, planarOrdering ) -//{ -// // Check canonical ordering -// Ordering expected, ordering = planarOrdering(3); -// expected += i3003, i2003, i1003, i3002, i2002, i1002, i3001, i2001, i1001; -// CHECK(assert_equal(expected,ordering)); -//} +TEST( SubgraphPreconditioner, planarOrdering ) { + // Check canonical ordering + Ordering expected, ordering = planarOrdering(3); + expected += + key(3, 3), key(2, 3), key(1, 3), + key(3, 2), key(2, 2), key(1, 2), + key(3, 1), key(2, 1), key(1, 1); + CHECK(assert_equal(expected,ordering)); +} + +/* ************************************************************************* */ +/** unnormalized error */ +double error(const JacobianFactorGraph& fg, const VectorValues& x) { + double total_error = 0.; + BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) + total_error += factor->error(x); + return total_error; +} /* ************************************************************************* */ TEST( SubgraphPreconditioner, planarGraph ) { // Check planar graph construction - GaussianFactorGraph A; + JacobianFactorGraph A; VectorValues xtrue; boost::tie(A, xtrue) = planarGraph(3); LONGS_EQUAL(13,A.size()); LONGS_EQUAL(9,xtrue.size()); - DOUBLES_EQUAL(0,A.error(xtrue),1e-9); // check zero error for xtrue + DOUBLES_EQUAL(0,error(A,xtrue),1e-9); // check zero error for xtrue // Check that xtrue is optimal GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(A).eliminate(); @@ -67,143 +79,143 @@ TEST( SubgraphPreconditioner, planarGraph ) } /* ************************************************************************* */ -//TEST( SubgraphPreconditioner, splitOffPlanarTree ) -//{ -// // Build a planar graph -// GaussianFactorGraph A; -// VectorValues xtrue; -// boost::tie(A, xtrue) = planarGraph(3); -// -// // Get the spanning tree and constraints, and check their sizes -// JacobianFactorGraph T, C; -// // TODO big mess: GFG and JFG mess !!! -// boost::tie(T, C) = splitOffPlanarTree(3, A); -// LONGS_EQUAL(9,T.size()); -// LONGS_EQUAL(4,C.size()); -// -// // Check that the tree can be solved to give the ground xtrue -// GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(T).eliminate(); -// VectorValues xbar = optimize(*R1); -// CHECK(assert_equal(xtrue,xbar)); -//} +TEST( SubgraphPreconditioner, splitOffPlanarTree ) +{ + // Build a planar graph + JacobianFactorGraph A; + VectorValues xtrue; + boost::tie(A, xtrue) = planarGraph(3); + + // Get the spanning tree and constraints, and check their sizes + JacobianFactorGraph T, C; + boost::tie(T, C) = splitOffPlanarTree(3, A); + LONGS_EQUAL(9,T.size()); + LONGS_EQUAL(4,C.size()); + + // Check that the tree can be solved to give the ground xtrue + GaussianBayesNet::shared_ptr R1 = GaussianSequentialSolver(T).eliminate(); + VectorValues xbar = optimize(*R1); + CHECK(assert_equal(xtrue,xbar)); +} /* ************************************************************************* */ -//TEST( SubgraphPreconditioner, system ) -//{ -// // Build a planar graph -// JacobianFactorGraph Ab; -// VectorValues xtrue; -// size_t N = 3; -// boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b -// -// // Get the spanning tree and corresponding ordering -// GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 -// boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); -// SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); -// SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); -// -// // Eliminate the spanning tree to build a prior -// SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 -// VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 -// -// // Create Subgraph-preconditioned system -// VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible -// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); -// -// // Create zero config -// VectorValues zeros = VectorValues::Zero(xbar); -// -// // Set up y0 as all zeros -// VectorValues y0 = zeros; -// -// // y1 = perturbed y0 -// VectorValues y1 = zeros; -// y1[i2003] = Vector_(2, 1.0, -1.0); -// -// // Check corresponding x values -// VectorValues expected_x1 = xtrue, x1 = system.x(y1); -// expected_x1[i2003] = Vector_(2, 2.01, 2.99); -// expected_x1[i3003] = Vector_(2, 3.01, 2.99); -// CHECK(assert_equal(xtrue, system.x(y0))); -// CHECK(assert_equal(expected_x1,system.x(y1))); -// -// // Check errors -//// DOUBLES_EQUAL(0,error(Ab,xtrue),1e-9); // TODO ! -//// DOUBLES_EQUAL(3,error(Ab,x1),1e-9); // TODO ! -// DOUBLES_EQUAL(0,error(system,y0),1e-9); -// DOUBLES_EQUAL(3,error(system,y1),1e-9); -// -// // Test gradient in x -// VectorValues expected_gx0 = zeros; -// VectorValues expected_gx1 = zeros; -// CHECK(assert_equal(expected_gx0,gradient(Ab,xtrue))); -// expected_gx1[i1003] = Vector_(2, -100., 100.); -// expected_gx1[i2002] = Vector_(2, -100., 100.); -// expected_gx1[i2003] = Vector_(2, 200., -200.); -// expected_gx1[i3002] = Vector_(2, -100., 100.); -// expected_gx1[i3003] = Vector_(2, 100., -100.); -// CHECK(assert_equal(expected_gx1,gradient(Ab,x1))); -// -// // Test gradient in y -// VectorValues expected_gy0 = zeros; -// VectorValues expected_gy1 = zeros; -// expected_gy1[i1003] = Vector_(2, 2., -2.); -// expected_gy1[i2002] = Vector_(2, -2., 2.); -// expected_gy1[i2003] = Vector_(2, 3., -3.); -// expected_gy1[i3002] = Vector_(2, -1., 1.); -// expected_gy1[i3003] = Vector_(2, 1., -1.); -// CHECK(assert_equal(expected_gy0,gradient(system,y0))); -// CHECK(assert_equal(expected_gy1,gradient(system,y1))); -// -// // Check it numerically for good measure -// // TODO use boost::bind(&SubgraphPreconditioner::error,&system,_1) -// // Vector numerical_g1 = numericalGradient (error, y1, 0.001); -// // Vector expected_g1 = Vector_(18, 0., 0., 0., 0., 2., -2., 0., 0., -2., 2., -// // 3., -3., 0., 0., -1., 1., 1., -1.); -// // CHECK(assert_equal(expected_g1,numerical_g1)); -//} + +TEST( SubgraphPreconditioner, system ) +{ + // Build a planar graph + JacobianFactorGraph Ab; + VectorValues xtrue; + size_t N = 3; + boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + + // Get the spanning tree and corresponding ordering + JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); + SubgraphPreconditioner::sharedFG Ab1(new JacobianFactorGraph(Ab1_)); + SubgraphPreconditioner::sharedFG Ab2(new JacobianFactorGraph(Ab2_)); + + // Eliminate the spanning tree to build a prior + SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 + VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 + + // Create Subgraph-preconditioned system + VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible + SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); + + // Create zero config + VectorValues zeros = VectorValues::Zero(xbar); + + // Set up y0 as all zeros + VectorValues y0 = zeros; + + // y1 = perturbed y0 + VectorValues y1 = zeros; + y1[1] = Vector_(2, 1.0, -1.0); + + // Check corresponding x values + VectorValues expected_x1 = xtrue, x1 = system.x(y1); + expected_x1[1] = Vector_(2, 2.01, 2.99); + expected_x1[0] = Vector_(2, 3.01, 2.99); + CHECK(assert_equal(xtrue, system.x(y0))); + CHECK(assert_equal(expected_x1,system.x(y1))); + + // Check errors + DOUBLES_EQUAL(0,error(Ab,xtrue),1e-9); + DOUBLES_EQUAL(3,error(Ab,x1),1e-9); + DOUBLES_EQUAL(0,error(system,y0),1e-9); + DOUBLES_EQUAL(3,error(system,y1),1e-9); + + // Test gradient in x + VectorValues expected_gx0 = zeros; + VectorValues expected_gx1 = zeros; + CHECK(assert_equal(expected_gx0,gradient(Ab,xtrue))); + expected_gx1[2] = Vector_(2, -100., 100.); + expected_gx1[4] = Vector_(2, -100., 100.); + expected_gx1[1] = Vector_(2, 200., -200.); + expected_gx1[3] = Vector_(2, -100., 100.); + expected_gx1[0] = Vector_(2, 100., -100.); + CHECK(assert_equal(expected_gx1,gradient(Ab,x1))); + + // Test gradient in y + VectorValues expected_gy0 = zeros; + VectorValues expected_gy1 = zeros; + expected_gy1[2] = Vector_(2, 2., -2.); + expected_gy1[4] = Vector_(2, -2., 2.); + expected_gy1[1] = Vector_(2, 3., -3.); + expected_gy1[3] = Vector_(2, -1., 1.); + expected_gy1[0] = Vector_(2, 1., -1.); + CHECK(assert_equal(expected_gy0,gradient(system,y0))); + CHECK(assert_equal(expected_gy1,gradient(system,y1))); + + // Check it numerically for good measure + // TODO use boost::bind(&SubgraphPreconditioner::error,&system,_1) + // Vector numerical_g1 = numericalGradient (error, y1, 0.001); + // Vector expected_g1 = Vector_(18, 0., 0., 0., 0., 2., -2., 0., 0., -2., 2., + // 3., -3., 0., 0., -1., 1., 1., -1.); + // CHECK(assert_equal(expected_g1,numerical_g1)); +} /* ************************************************************************* */ -//TEST( SubgraphPreconditioner, conjugateGradients ) -//{ -// // Build a planar graph -// GaussianFactorGraph Ab; -// VectorValues xtrue; -// size_t N = 3; -// boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b -// -// // Get the spanning tree and corresponding ordering -// GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 -// boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); -// SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); -// SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); -// -// // Eliminate the spanning tree to build a prior -// Ordering ordering = planarOrdering(N); -// SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 -// VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 -// -// // Create Subgraph-preconditioned system -// VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible -// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); -// -// // Create zero config y0 and perturbed config y1 -// VectorValues y0 = VectorValues::Zero(xbar); -// -// VectorValues y1 = y0; -// y1[i2003] = Vector_(2, 1.0, -1.0); -// VectorValues x1 = system.x(y1); -// -// // Solve for the remaining constraints using PCG -// ConjugateGradientParameters parameters; -//// VectorValues actual = gtsam::conjugateGradients(system, y1, verbose, epsilon, epsilon, maxIterations); -//// CHECK(assert_equal(y0,actual)); -// -// // Compare with non preconditioned version: -// VectorValues actual2 = conjugateGradientDescent(Ab, x1, parameters); -// CHECK(assert_equal(xtrue,actual2,1e-4)); -//} +TEST( SubgraphPreconditioner, conjugateGradients ) +{ + // Build a planar graph + JacobianFactorGraph Ab; + VectorValues xtrue; + size_t N = 3; + boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + + // Get the spanning tree and corresponding ordering + JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); + SubgraphPreconditioner::sharedFG Ab1(new JacobianFactorGraph(Ab1_)); + SubgraphPreconditioner::sharedFG Ab2(new JacobianFactorGraph(Ab2_)); + + // Eliminate the spanning tree to build a prior + Ordering ordering = planarOrdering(N); + SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 + VectorValues xbar = optimize(*Rc1); // xbar = inv(R1)*c1 + + // Create Subgraph-preconditioned system + VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible + SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); + + // Create zero config y0 and perturbed config y1 + VectorValues y0 = VectorValues::Zero(xbar); + + VectorValues y1 = y0; + y1[1] = Vector_(2, 1.0, -1.0); + VectorValues x1 = system.x(y1); + + // Solve for the remaining constraints using PCG + ConjugateGradientParameters parameters; + VectorValues actual = conjugateGradients(system, y1, parameters); + CHECK(assert_equal(y0,actual)); + + // Compare with non preconditioned version: + VectorValues actual2 = conjugateGradientDescent(Ab, x1, parameters); + CHECK(assert_equal(xtrue,actual2,1e-4)); +} /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } From 832072c940fa866befd4e30bb1f097ba6e83c69c Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 3 Sep 2012 00:13:35 +0000 Subject: [PATCH 852/914] Fixed path --- matlab/gtsam_examples/PlanarSLAMExample_graph.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/gtsam_examples/PlanarSLAMExample_graph.m b/matlab/gtsam_examples/PlanarSLAMExample_graph.m index a65ea5980..9ca88e49a 100644 --- a/matlab/gtsam_examples/PlanarSLAMExample_graph.m +++ b/matlab/gtsam_examples/PlanarSLAMExample_graph.m @@ -15,7 +15,7 @@ clear import gtsam.* %% Find data file -datafile = '/Users/dellaert/borg/gtsam/examples/Data/example.graph'; +datafile = findExampleDataFile('example.graph'); %% Initialize graph, initial estimate, and odometry noise model = noiseModel.Diagonal.Sigmas([0.05; 0.05; 2*pi/180]); From 2285b14c5f61d7604fb8edb16b56373db4fb6b92 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 3 Sep 2012 00:39:02 +0000 Subject: [PATCH 853/914] Alternate matrix operation --- gtsam_unstable/slam/PoseRotationPrior.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/slam/PoseRotationPrior.h b/gtsam_unstable/slam/PoseRotationPrior.h index 60a29b3e4..30d3828fd 100644 --- a/gtsam_unstable/slam/PoseRotationPrior.h +++ b/gtsam_unstable/slam/PoseRotationPrior.h @@ -67,9 +67,9 @@ public: if (H) { *H = gtsam::zeros(rDim, xDim); if (pose_traits::isRotFirst()) - (*H).leftCols(rDim) = eye(rDim); + (*H).leftCols(rDim).setIdentity(rDim, rDim); // = eye(rDim); // FIXME: avoiding use of assign with eye() else - (*H).rightCols(rDim) = eye(rDim); + (*H).rightCols(rDim).setIdentity(rDim, rDim); // = eye(rDim); } return Rotation::Logmap(newR) - Rotation::Logmap(measured_); From 891fb2e038652c37dc5c9dbaea546e69da75b763 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 3 Sep 2012 00:50:24 +0000 Subject: [PATCH 854/914] comments only --- gtsam_unstable/slam/PoseRotationPrior.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/slam/PoseRotationPrior.h b/gtsam_unstable/slam/PoseRotationPrior.h index 30d3828fd..9a56ec891 100644 --- a/gtsam_unstable/slam/PoseRotationPrior.h +++ b/gtsam_unstable/slam/PoseRotationPrior.h @@ -67,9 +67,9 @@ public: if (H) { *H = gtsam::zeros(rDim, xDim); if (pose_traits::isRotFirst()) - (*H).leftCols(rDim).setIdentity(rDim, rDim); // = eye(rDim); // FIXME: avoiding use of assign with eye() + (*H).leftCols(rDim).setIdentity(rDim, rDim); else - (*H).rightCols(rDim).setIdentity(rDim, rDim); // = eye(rDim); + (*H).rightCols(rDim).setIdentity(rDim, rDim); } return Rotation::Logmap(newR) - Rotation::Logmap(measured_); From 55c9bdb3ac7aa121f061ec03ab0193b31c4b8913 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 3 Sep 2012 00:58:05 +0000 Subject: [PATCH 855/914] Added notes on use of eye() and zeros() when using Eigen block operations --- gtsam/base/Matrix.h | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index 6902a4a88..e6a40f727 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -67,11 +67,30 @@ inline Matrix Matrix_(const Vector& v) { return Matrix_(v.size(),1,v);} */ Matrix Matrix_(size_t m, size_t n, ...); +// Matlab-like syntax + /** - * MATLAB like constructors + * Creates an zeros matrix, with matlab-like syntax + * + * Note: if assigning a block (created from an Eigen block() function) of a matrix to zeros, + * don't use this function, instead use ".setZero(m,n)" to avoid an Eigen error. */ Matrix zeros(size_t m, size_t n); + +/** + * Creates an identity matrix, with matlab-like syntax + * + * Note: if assigning a block (created from an Eigen block() function) of a matrix to identity, + * don't use this function, instead use ".setIdentity(m,n)" to avoid an Eigen error. + */ Matrix eye(size_t m, size_t n); + +/** + * Creates a square identity matrix, with matlab-like syntax + * + * Note: if assigning a block (created from an Eigen block() function) of a matrix to identity, + * don't use this function, instead use ".setIdentity(m)" to avoid an Eigen error. + */ inline Matrix eye( size_t m ) { return eye(m,m); } Matrix diag(const Vector& v); From bd6cb53d5ee26eb53ac50fc042998fb56c00ec6f Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 3 Sep 2012 01:45:12 +0000 Subject: [PATCH 856/914] Updated README for make doc --- README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README b/README index 1a992292a..8e74f61e4 100644 --- a/README +++ b/README @@ -72,8 +72,8 @@ will run up to 10x faster in Release mode! See the end of this document for additional debugging tips. 3) -GTSAM has Doxygen documentation. To generate, run the the script -makedoc.sh. +GTSAM has Doxygen documentation. To generate, run 'make doc' from your +build directory. 4) The instructions below install the library to the default system install path and From d8e0a9589039128b963bdc00cefa28b19ce4a2ff Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 3 Sep 2012 03:06:08 +0000 Subject: [PATCH 857/914] Small bug-fixes for managing linearization points --- gtsam_unstable/nonlinear/LinearContainerFactor.cpp | 2 +- gtsam_unstable/nonlinear/LinearContainerFactor.h | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp index fa44d3e93..e6c49b318 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -205,7 +205,7 @@ GaussianFactor::shared_ptr LinearContainerFactor::negate(const Ordering& orderin /* ************************************************************************* */ NonlinearFactor::shared_ptr LinearContainerFactor::negate() const { GaussianFactor::shared_ptr antifactor = factor_->negate(); // already has keys in place - return NonlinearFactor::shared_ptr(new LinearContainerFactor(antifactor)); + return NonlinearFactor::shared_ptr(new LinearContainerFactor(antifactor,linearizationPoint_)); } /* ************************************************************************* */ diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.h b/gtsam_unstable/nonlinear/LinearContainerFactor.h index 9affcc29e..a8f7cd399 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.h +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.h @@ -23,6 +23,11 @@ protected: GaussianFactor::shared_ptr factor_; boost::optional linearizationPoint_; + /** direct copy constructor */ + LinearContainerFactor(const GaussianFactor::shared_ptr& factor, + const boost::optional& linearizationPoint) + : factor_(factor), linearizationPoint_(linearizationPoint) {} + public: /** Primary constructor: store a linear factor and decode the ordering */ @@ -105,7 +110,7 @@ public: * Clones the underlying linear factor */ NonlinearFactor::shared_ptr clone() const { - return NonlinearFactor::shared_ptr(new LinearContainerFactor(factor_)); + return NonlinearFactor::shared_ptr(new LinearContainerFactor(factor_,linearizationPoint_)); } // casting syntactic sugar From 3522d09c4eb573797f34744c450a5276f08ce759 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 3 Sep 2012 03:06:09 +0000 Subject: [PATCH 858/914] Adding options for making deb packages --- CMakeLists.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6349d440a..3df8ab232 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,7 +161,7 @@ if (DOXYGEN_FOUND) add_subdirectory(doc) endif() -# Set up CPack +## Set up CPack set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM") set(CPACK_PACKAGE_VENDOR "Frank Dellaert, Georgia Institute of Technology") set(CPACK_PACKAGE_CONTACT "Frank Dellaert, dellaert@cc.gatech.edu") @@ -172,12 +172,16 @@ set(CPACK_PACKAGE_VERSION_MINOR ${GTSAM_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${GTSAM_VERSION_PATCH}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") #set(CPACK_INSTALLED_DIRECTORIES "doc;.") # Include doc directory -set(CPACK_INSTALLED_DIRECTORIES ".") -set(CPACK_SOURCE_IGNORE_FILES "/build;/\\\\.;/makestats.sh$") +#set(CPACK_INSTALLED_DIRECTORIES ".") # FIXME: throws error +set(CPACK_SOURCE_IGNORE_FILES "/build*;/\\\\.;/makestats.sh$") set(CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/gtsam_unstable/") set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}") #set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-aspn${GTSAM_VERSION_PATCH}") # Used for creating ASPN tarballs +# Deb-package specific cpack +set(CPACK_DEBIAN_PACKAGE_NAME "libgtsam-dev") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.43)") #Example: "libc6 (>= 2.3.1-6), libgcc1 (>= 1:3.4.2-12)") + # print configuration variables message(STATUS "===============================================================") message(STATUS "================ Configuration Options ======================") From d3b5c463edd4c946b518bbf8d40b92ccc45701d9 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Mon, 3 Sep 2012 17:22:09 +0000 Subject: [PATCH 859/914] Fixed initialization bug --- gtsam_unstable/nonlinear/LinearContainerFactor.cpp | 9 +++++++++ gtsam_unstable/nonlinear/LinearContainerFactor.h | 3 +-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp index e6c49b318..b5701fb13 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.cpp +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.cpp @@ -38,6 +38,15 @@ void LinearContainerFactor::initializeLinearizationPoint(const Values& lineariza } } +/* ************************************************************************* */ +LinearContainerFactor::LinearContainerFactor(const GaussianFactor::shared_ptr& factor, + const boost::optional& linearizationPoint) +: factor_(factor), linearizationPoint_(linearizationPoint) { + // Extract keys stashed in linear factor + BOOST_FOREACH(const Index& idx, factor_->keys()) + keys_.push_back(idx); +} + /* ************************************************************************* */ LinearContainerFactor::LinearContainerFactor( const JacobianFactor& factor, const Ordering& ordering, diff --git a/gtsam_unstable/nonlinear/LinearContainerFactor.h b/gtsam_unstable/nonlinear/LinearContainerFactor.h index a8f7cd399..324556622 100644 --- a/gtsam_unstable/nonlinear/LinearContainerFactor.h +++ b/gtsam_unstable/nonlinear/LinearContainerFactor.h @@ -25,8 +25,7 @@ protected: /** direct copy constructor */ LinearContainerFactor(const GaussianFactor::shared_ptr& factor, - const boost::optional& linearizationPoint) - : factor_(factor), linearizationPoint_(linearizationPoint) {} + const boost::optional& linearizationPoint); public: From 61b6c72363e7908c0e0029507e7b6f7b0658214c Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 3 Sep 2012 17:56:22 +0000 Subject: [PATCH 860/914] Added PlanarSLAMExample_Graph to the gui --- matlab/gtsam_examples/gtsamExamples.fig | Bin 10561 -> 10933 bytes matlab/gtsam_examples/gtsamExamples.m | 9 ++++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/matlab/gtsam_examples/gtsamExamples.fig b/matlab/gtsam_examples/gtsamExamples.fig index e51c23468d21978f6cdd6c9f8d5d4650085db138..ca48437dae84bc997488acd393909553f61e90f9 100644 GIT binary patch literal 10933 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 literal 10561 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 Date: Mon, 3 Sep 2012 18:00:26 +0000 Subject: [PATCH 861/914] Removed deprecated unit tests from testGaussianFactorGraphB and moved SPCG-specific ones to testGraph and testJacobianFactorGraph --- .../linear/tests/testJacobianFactorGraph.cpp | 92 +++ tests/testGaussianFactorGraphB.cpp | 548 +----------------- tests/testGraph.cpp | 43 ++ 3 files changed, 146 insertions(+), 537 deletions(-) create mode 100644 gtsam/linear/tests/testJacobianFactorGraph.cpp diff --git a/gtsam/linear/tests/testJacobianFactorGraph.cpp b/gtsam/linear/tests/testJacobianFactorGraph.cpp new file mode 100644 index 000000000..e756d83e7 --- /dev/null +++ b/gtsam/linear/tests/testJacobianFactorGraph.cpp @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------------- + + * 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 testJacobianFactorGraph.cpp + * @brief Unit tests for JacobianFactorGraph + * @author Yong Dian Jian + **/ + +#include +#include + + +///* ************************************************************************* */ +//TEST( GaussianFactorGraph, gradient ) +//{ +// GaussianFactorGraph fg = createGaussianFactorGraph(); +// +// // Construct expected gradient +// VectorValues expected; +// +// // 2*f(x) = 100*(x1+c[X(1)])^2 + 100*(x2-x1-[0.2;-0.1])^2 + 25*(l1-x1-[0.0;0.2])^2 + 25*(l1-x2-[-0.2;0.3])^2 +// // worked out: df/dx1 = 100*[0.1;0.1] + 100*[0.2;-0.1]) + 25*[0.0;0.2] = [10+20;10-10+5] = [30;5] +// expected.insert(L(1),Vector_(2, 5.0,-12.5)); +// expected.insert(X(1),Vector_(2, 30.0, 5.0)); +// expected.insert(X(2),Vector_(2,-25.0, 17.5)); +// +// // Check the gradient at delta=0 +// VectorValues zero = createZeroDelta(); +// VectorValues actual = fg.gradient(zero); +// EXPECT(assert_equal(expected,actual)); +// +// // Check it numerically for good measure +// Vector numerical_g = numericalGradient(error,zero,0.001); +// EXPECT(assert_equal(Vector_(6,5.0,-12.5,30.0,5.0,-25.0,17.5),numerical_g)); +// +// // Check the gradient at the solution (should be zero) +// Ordering ord; +// ord += X(2),L(1),X(1); +// GaussianFactorGraph fg2 = createGaussianFactorGraph(); +// VectorValues solution = fg2.optimize(ord); // destructive +// VectorValues actual2 = fg.gradient(solution); +// EXPECT(assert_equal(zero,actual2)); +//} + +///* ************************************************************************* */ +//TEST( GaussianFactorGraph, transposeMultiplication ) +//{ +// // create an ordering +// Ordering ord; ord += X(2),L(1),X(1); +// +// GaussianFactorGraph A = createGaussianFactorGraph(ord); +// Errors e; +// e += Vector_(2, 0.0, 0.0); +// e += Vector_(2,15.0, 0.0); +// e += Vector_(2, 0.0,-5.0); +// e += Vector_(2,-7.5,-5.0); +// +// VectorValues expected = createZeroDelta(ord), actual = A ^ e; +// expected[ord[L(1)]] = Vector_(2, -37.5,-50.0); +// expected[ord[X(1)]] = Vector_(2,-150.0, 25.0); +// expected[ord[X(2)]] = Vector_(2, 187.5, 25.0); +// EXPECT(assert_equal(expected,actual)); +//} + +///* ************************************************************************* */ +//TEST( GaussianFactorGraph, rhs ) +//{ +// // create an ordering +// Ordering ord; ord += X(2),L(1),X(1); +// +// GaussianFactorGraph Ab = createGaussianFactorGraph(ord); +// Errors expected = createZeroDelta(ord), actual = Ab.rhs(); +// expected.push_back(Vector_(2,-1.0,-1.0)); +// expected.push_back(Vector_(2, 2.0,-1.0)); +// expected.push_back(Vector_(2, 0.0, 1.0)); +// expected.push_back(Vector_(2,-1.0, 1.5)); +// EXPECT(assert_equal(expected,actual)); +//} + + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr);} +/* ************************************************************************* */ diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index 20972add9..c6ec69d4e 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -56,143 +56,17 @@ TEST( GaussianFactorGraph, equals ) { } /* ************************************************************************* */ -//TEST( GaussianFactorGraph, error ) { -// Ordering ordering; ordering += X(1),X(2),L(1); -// FactorGraph fg = createGaussianFactorGraph(ordering); -// VectorValues cfg = createZeroDelta(ordering); -// -// // note the error is the same as in testNonlinearFactorGraph as a -// // zero delta config in the linear graph is equivalent to noisy in -// // non-linear, which is really linear under the hood -// double actual = fg.error(cfg); -// DOUBLES_EQUAL( 5.625, actual, 1e-9 ); -//} +TEST( GaussianFactorGraph, error ) { + Ordering ordering; ordering += X(1),X(2),L(1); + GaussianFactorGraph fg = createGaussianFactorGraph(ordering); + VectorValues cfg = createZeroDelta(ordering); -/* ************************************************************************* */ -/* unit test for find seperator */ -/* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, find_separator ) -//{ -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// -// set separator = fg.find_separator(X(2)); -// set expected; -// expected.insert(X(1)); -// expected.insert(L(1)); -// -// EXPECT(separator.size()==expected.size()); -// set::iterator it1 = separator.begin(), it2 = expected.begin(); -// for(; it1!=separator.end(); it1++, it2++) -// EXPECT(*it1 == *it2); -//} - -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactorGraph, combine_factors_x1 ) -//{ -// // create a small example for a linear factor graph -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// -// // combine all factors -// GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,X(1)); -// -// // the expected linear factor -// Matrix Al1 = Matrix_(6,2, -// 0., 0., -// 0., 0., -// 0., 0., -// 0., 0., -// 5., 0., -// 0., 5. -// ); -// -// Matrix Ax1 = Matrix_(6,2, -// 10., 0., -// 0., 10., -// -10., 0., -// 0.,-10., -// -5., 0., -// 0.,-5. -// ); -// -// Matrix Ax2 = Matrix_(6,2, -// 0., 0., -// 0., 0., -// 10., 0., -// 0., 10., -// 0., 0., -// 0., 0. -// ); -// -// // the expected RHS vector -// Vector b(6); -// b(0) = -1; -// b(1) = -1; -// b(2) = 2; -// b(3) = -1; -// b(4) = 0; -// b(5) = 1; -// -// vector > meas; -// meas.push_back(make_pair(L(1), Al1)); -// meas.push_back(make_pair(X(1), Ax1)); -// meas.push_back(make_pair(X(2), Ax2)); -// GaussianFactor expected(meas, b, ones(6)); -// //GaussianFactor expected(L(1), Al1, X(1), Ax1, X(2), Ax2, b); -// -// // check if the two factors are the same -// EXPECT(assert_equal(expected,*actual)); -//} -// -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactorGraph, combine_factors_x2 ) -//{ -// // create a small example for a linear factor graph -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// -// // combine all factors -// GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,X(2)); -// -// // the expected linear factor -// Matrix Al1 = Matrix_(4,2, -// // l1 -// 0., 0., -// 0., 0., -// 5., 0., -// 0., 5. -// ); -// -// Matrix Ax1 = Matrix_(4,2, -// // x1 -// -10., 0., // f2 -// 0.,-10., // f2 -// 0., 0., // f4 -// 0., 0. // f4 -// ); -// -// Matrix Ax2 = Matrix_(4,2, -// // x2 -// 10., 0., -// 0., 10., -// -5., 0., -// 0.,-5. -// ); -// -// // the expected RHS vector -// Vector b(4); -// b(0) = 2; -// b(1) = -1; -// b(2) = -1; -// b(3) = 1.5; -// -// vector > meas; -// meas.push_back(make_pair(L(1), Al1)); -// meas.push_back(make_pair(X(1), Ax1)); -// meas.push_back(make_pair(X(2), Ax2)); -// GaussianFactor expected(meas, b, ones(4)); -// -// // check if the two factors are the same -// EXPECT(assert_equal(expected,*actual)); -//} + // note the error is the same as in testNonlinearFactorGraph as a + // zero delta config in the linear graph is equivalent to noisy in + // non-linear, which is really linear under the hood + double actual = fg.error(cfg); + DOUBLES_EQUAL( 5.625, actual, 1e-9 ); +} /* ************************************************************************* */ TEST( GaussianFactorGraph, eliminateOne_x1 ) @@ -336,47 +210,6 @@ TEST( GaussianFactorGraph, eliminateAll ) EXPECT(assert_equal(expected,actualQR,tol)); } -///* ************************************************************************* */ -//TEST( GaussianFactorGraph, eliminateAll_fast ) -//{ -// // create expected Chordal bayes Net -// Matrix I = eye(2); -// -// Vector d1 = Vector_(2, -0.1,-0.1); -// GaussianBayesNet expected = simpleGaussian(X(1),d1,0.1); -// -// double sig1 = 0.149071; -// Vector d2 = Vector_(2, 0.0, 0.2)/sig1, sigma2 = ones(2); -// push_front(expected,L(1),d2, I/sig1,X(1), (-1)*I/sig1,sigma2); -// -// double sig2 = 0.0894427; -// Vector d3 = Vector_(2, 0.2, -0.14)/sig2, sigma3 = ones(2); -// push_front(expected,X(2),d3, I/sig2,L(1), (-0.2)*I/sig2, X(1), (-0.8)*I/sig2, sigma3); -// -// // Check one ordering -// GaussianFactorGraph fg1 = createGaussianFactorGraph(); -// Ordering ordering; -// ordering += X(2),L(1),X(1); -// GaussianBayesNet actual = fg1.eliminate(ordering, false); -// EXPECT(assert_equal(expected,actual,tol)); -//} - -///* ************************************************************************* */ -//TEST( GaussianFactorGraph, add_priors ) -//{ -// Ordering ordering; ordering += L(1),X(1),X(2); -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// GaussianFactorGraph actual = fg.add_priors(3, vector(3,2)); -// GaussianFactorGraph expected = createGaussianFactorGraph(ordering); -// Matrix A = eye(2); -// Vector b = zero(2); -// SharedDiagonal sigma = noiseModel::Isotropic::Sigma(2,3.0); -// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[L(1)],A,b,sigma))); -// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[X(1)],A,b,sigma))); -// expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering[X(2)],A,b,sigma))); -// EXPECT(assert_equal(expected,actual)); -//} - /* ************************************************************************* */ TEST( GaussianFactorGraph, copying ) { @@ -397,46 +230,6 @@ TEST( GaussianFactorGraph, copying ) EXPECT(assert_equal(expected,actual)); } -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactorGraph, matrix ) -//{ -// // render with a given ordering -// Ordering ord; -// ord += X(2),L(1),X(1); -// -// // Create a graph -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// -// Matrix A; Vector b; -// boost::tie(A,b) = fg.matrix(); -// -// Matrix A1 = Matrix_(2*4,3*2, -// +0., 0., 0., 0., 10., 0., // unary factor on x1 (prior) -// +0., 0., 0., 0., 0., 10., -// 10., 0., 0., 0.,-10., 0., // binary factor on x2,x1 (odometry) -// +0., 10., 0., 0., 0.,-10., -// +0., 0., 5., 0., -5., 0., // binary factor on l1,x1 (z1) -// +0., 0., 0., 5., 0., -5., -// -5., 0., 5., 0., 0., 0., // binary factor on x2,l1 (z2) -// +0., -5., 0., 5., 0., 0. -// ); -// Vector b1 = Vector_(8,-1., -1., 2., -1., 0., 1., -1., 1.5); -// -// EQUALITY(A,A1); -// EXPECT(b==b1); -//} - -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactorGraph, sizeOfA ) -//{ -// // create a small linear factor graph -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// -// pair mn = fg.sizeOfA(); -// EXPECT(8 == mn.first); -// EXPECT(6 == mn.second); -//} - /* ************************************************************************* */ TEST( GaussianFactorGraph, CONSTRUCTOR_GaussianBayesNet ) { @@ -451,11 +244,6 @@ TEST( GaussianFactorGraph, CONSTRUCTOR_GaussianBayesNet ) GaussianFactorGraph fg2(CBN); GaussianBayesNet CBN2 = *GaussianSequentialSolver(fg2).eliminate(); EXPECT(assert_equal(CBN,CBN2)); - - // Base FactorGraph only -// FactorGraph fg3(CBN); -// GaussianBayesNet CBN3 = gtsam::eliminate(fg3,ord); -// EXPECT(assert_equal(CBN,CBN3)); } /* ************************************************************************* */ @@ -469,16 +257,6 @@ TEST( GaussianFactorGraph, getOrdering) EXPECT(assert_equal(expected,actual)); } -// SL-FIX TEST( GaussianFactorGraph, getOrdering2) -//{ -// Ordering expected; -// expected += L(1),X(1); -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// set interested; interested += L(1),X(1); -// Ordering actual = fg.getOrdering(interested); -// EXPECT(assert_equal(expected,actual)); -//} - /* ************************************************************************* */ TEST( GaussianFactorGraph, optimize_Cholesky ) { @@ -515,24 +293,6 @@ TEST( GaussianFactorGraph, optimize_QR ) EXPECT(assert_equal(expected,actual)); } -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactorGraph, optimizeMultiFrontlas ) -//{ -// // create an ordering -// Ordering ord; ord += X(2),L(1),X(1); -// -// // create a graph -// GaussianFactorGraph fg = createGaussianFactorGraph(ord); -// -// // optimize the graph -// VectorValues actual = fg.optimizeMultiFrontals(ord); -// -// // verify -// VectorValues expected = createCorrectDelta(); -// -// EXPECT(assert_equal(expected,actual)); -//} - /* ************************************************************************* */ TEST( GaussianFactorGraph, combine) { @@ -585,48 +345,6 @@ void print(vector v) { cout << endl; } -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, factor_lookup) -//{ -// // create a test graph -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// -// // ask for all factor indices connected to x1 -// list x1_factors = fg.factors(X(1)); -// size_t x1_indices[] = { 0, 1, 2 }; -// list x1_expected(x1_indices, x1_indices + 3); -// EXPECT(x1_factors==x1_expected); -// -// // ask for all factor indices connected to x2 -// list x2_factors = fg.factors(X(2)); -// size_t x2_indices[] = { 1, 3 }; -// list x2_expected(x2_indices, x2_indices + 2); -// EXPECT(x2_factors==x2_expected); -//} - -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, findAndRemoveFactors ) -//{ -// // create the graph -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// -// // We expect to remove these three factors: 0, 1, 2 -// GaussianFactor::shared_ptr f0 = fg[0]; -// GaussianFactor::shared_ptr f1 = fg[1]; -// GaussianFactor::shared_ptr f2 = fg[2]; -// -// // call the function -// vector factors = fg.findAndRemoveFactors(X(1)); -// -// // Check the factors -// EXPECT(f0==factors[0]); -// EXPECT(f1==factors[1]); -// EXPECT(f2==factors[2]); -// -// // EXPECT if the factors are deleted from the factor graph -// LONGS_EQUAL(1,fg.nrFactors()); -//} - /* ************************************************************************* */ TEST(GaussianFactorGraph, createSmoother) { @@ -636,35 +354,6 @@ TEST(GaussianFactorGraph, createSmoother) LONGS_EQUAL(5,fg2.size()); } -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, variables ) -//{ -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// Dimensions expected; -// insert(expected)(L(1), 2)(X(1), 2)(X(2), 2); -// Dimensions actual = fg.dimensions(); -// EXPECT(expected==actual); -//} - -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, keys ) -//{ -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// Ordering expected; -// expected += L(1),X(1),X(2); -// EXPECT(assert_equal(expected,fg.keys())); -//} - -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, involves ) -//{ -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// EXPECT(fg.involves(L(1))); -// EXPECT(fg.involves(X(1))); -// EXPECT(fg.involves(X(2))); -// EXPECT(!fg.involves(X(3))); -//} - /* ************************************************************************* */ double error(const VectorValues& x) { // create an ordering @@ -674,38 +363,6 @@ double error(const VectorValues& x) { return fg.error(x); } -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, gradient ) -//{ -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// -// // Construct expected gradient -// VectorValues expected; -// -// // 2*f(x) = 100*(x1+c[X(1)])^2 + 100*(x2-x1-[0.2;-0.1])^2 + 25*(l1-x1-[0.0;0.2])^2 + 25*(l1-x2-[-0.2;0.3])^2 -// // worked out: df/dx1 = 100*[0.1;0.1] + 100*[0.2;-0.1]) + 25*[0.0;0.2] = [10+20;10-10+5] = [30;5] -// expected.insert(L(1),Vector_(2, 5.0,-12.5)); -// expected.insert(X(1),Vector_(2, 30.0, 5.0)); -// expected.insert(X(2),Vector_(2,-25.0, 17.5)); -// -// // Check the gradient at delta=0 -// VectorValues zero = createZeroDelta(); -// VectorValues actual = fg.gradient(zero); -// EXPECT(assert_equal(expected,actual)); -// -// // Check it numerically for good measure -// Vector numerical_g = numericalGradient(error,zero,0.001); -// EXPECT(assert_equal(Vector_(6,5.0,-12.5,30.0,5.0,-25.0,17.5),numerical_g)); -// -// // Check the gradient at the solution (should be zero) -// Ordering ord; -// ord += X(2),L(1),X(1); -// GaussianFactorGraph fg2 = createGaussianFactorGraph(); -// VectorValues solution = fg2.optimize(ord); // destructive -// VectorValues actual2 = fg.gradient(solution); -// EXPECT(assert_equal(zero,actual2)); -//} - /* ************************************************************************* */ TEST( GaussianFactorGraph, multiplication ) { @@ -723,41 +380,6 @@ TEST( GaussianFactorGraph, multiplication ) EXPECT(assert_equal(expected,actual)); } -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, transposeMultiplication ) -//{ -// // create an ordering -// Ordering ord; ord += X(2),L(1),X(1); -// -// GaussianFactorGraph A = createGaussianFactorGraph(ord); -// Errors e; -// e += Vector_(2, 0.0, 0.0); -// e += Vector_(2,15.0, 0.0); -// e += Vector_(2, 0.0,-5.0); -// e += Vector_(2,-7.5,-5.0); -// -// VectorValues expected = createZeroDelta(ord), actual = A ^ e; -// expected[ord[L(1)]] = Vector_(2, -37.5,-50.0); -// expected[ord[X(1)]] = Vector_(2,-150.0, 25.0); -// expected[ord[X(2)]] = Vector_(2, 187.5, 25.0); -// EXPECT(assert_equal(expected,actual)); -//} - -///* ************************************************************************* */ -// SL-NEEDED? TEST( GaussianFactorGraph, rhs ) -//{ -// // create an ordering -// Ordering ord; ord += X(2),L(1),X(1); -// -// GaussianFactorGraph Ab = createGaussianFactorGraph(ord); -// Errors expected = createZeroDelta(ord), actual = Ab.rhs(); -// expected.push_back(Vector_(2,-1.0,-1.0)); -// expected.push_back(Vector_(2, 2.0,-1.0)); -// expected.push_back(Vector_(2, 0.0, 1.0)); -// expected.push_back(Vector_(2,-1.0, 1.5)); -// EXPECT(assert_equal(expected,actual)); -//} - /* ************************************************************************* */ // Extra test on elimination prompted by Michael's email to Frank 1/4/2010 TEST( GaussianFactorGraph, elimination ) @@ -824,22 +446,6 @@ TEST( GaussianFactorGraph, constrained_single ) EXPECT(assert_equal(expected, actual)); } -///* ************************************************************************* */ -//SL-FIX TEST( GaussianFactorGraph, constrained_single2 ) -//{ -// // get a graph with a constraint in it -// GaussianFactorGraph fg = createSingleConstraintGraph(); -// -// // eliminate and solve -// Ordering ord; -// ord += "yk, x"; -// VectorValues actual = fg.optimize(ord); -// -// // verify -// VectorValues expected = createSingleConstraintValues(); -// EXPECT(assert_equal(expected, actual)); -//} - /* ************************************************************************* */ TEST( GaussianFactorGraph, constrained_multi1 ) { @@ -855,68 +461,9 @@ TEST( GaussianFactorGraph, constrained_multi1 ) EXPECT(assert_equal(expected, actual)); } -///* ************************************************************************* */ -//SL-FIX TEST( GaussianFactorGraph, constrained_multi2 ) -//{ -// // get a graph with a constraint in it -// GaussianFactorGraph fg = createMultiConstraintGraph(); -// -// // eliminate and solve -// Ordering ord; -// ord += "zk, xk, y"; -// VectorValues actual = fg.optimize(ord); -// -// // verify -// VectorValues expected = createMultiConstraintValues(); -// EXPECT(assert_equal(expected, actual)); -//} - /* ************************************************************************* */ -SharedDiagonal model = noiseModel::Isotropic::Sigma(2,1); - -// SL-FIX TEST( GaussianFactorGraph, findMinimumSpanningTree ) -//{ -// GaussianFactorGraph g; -// Matrix I = eye(2); -// Vector b = Vector_(0, 0, 0); -// g.add(X(1), I, X(2), I, b, model); -// g.add(X(1), I, X(3), I, b, model); -// g.add(X(1), I, X(4), I, b, model); -// g.add(X(2), I, X(3), I, b, model); -// g.add(X(2), I, X(4), I, b, model); -// g.add(X(3), I, X(4), I, b, model); -// -// map tree = g.findMinimumSpanningTree(); -// EXPECT(tree[X(1)].compare(X(1))==0); -// EXPECT(tree[X(2)].compare(X(1))==0); -// EXPECT(tree[X(3)].compare(X(1))==0); -// EXPECT(tree[X(4)].compare(X(1))==0); -//} - -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactorGraph, split ) -//{ -// GaussianFactorGraph g; -// Matrix I = eye(2); -// Vector b = Vector_(0, 0, 0); -// g.add(X(1), I, X(2), I, b, model); -// g.add(X(1), I, X(3), I, b, model); -// g.add(X(1), I, X(4), I, b, model); -// g.add(X(2), I, X(3), I, b, model); -// g.add(X(2), I, X(4), I, b, model); -// -// PredecessorMap tree; -// tree[X(1)] = X(1); -// tree[X(2)] = X(1); -// tree[X(3)] = X(1); -// tree[X(4)] = X(1); -// -// GaussianFactorGraph Ab1, Ab2; -// g.split(tree, Ab1, Ab2); -// LONGS_EQUAL(3, Ab1.size()); -// LONGS_EQUAL(2, Ab2.size()); -//} +static SharedDiagonal model = noiseModel::Isotropic::Sigma(2,1); /* ************************************************************************* */ TEST(GaussianFactorGraph, replace) @@ -935,91 +482,18 @@ TEST(GaussianFactorGraph, replace) GaussianFactorGraph actual; actual.push_back(f1); -// actual.checkGraphConsistency(); actual.push_back(f2); -// actual.checkGraphConsistency(); actual.push_back(f3); -// actual.checkGraphConsistency(); actual.replace(0, f4); -// actual.checkGraphConsistency(); GaussianFactorGraph expected; expected.push_back(f4); -// actual.checkGraphConsistency(); expected.push_back(f2); -// actual.checkGraphConsistency(); expected.push_back(f3); -// actual.checkGraphConsistency(); EXPECT(assert_equal(expected, actual)); } -///* ************************************************************************* */ -//TEST ( GaussianFactorGraph, combine_matrix ) { -// // create a small linear factor graph -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// Dimensions dimensions = fg.dimensions(); -// -// // get two factors from it and insert the factors into a vector -// vector lfg; -// lfg.push_back(fg[4 - 1]); -// lfg.push_back(fg[2 - 1]); -// -// // combine in a factor -// Matrix Ab; SharedDiagonal noise; -// Ordering order; order += X(2), L(1), X(1); -// boost::tie(Ab, noise) = combineFactorsAndCreateMatrix(lfg, order, dimensions); -// -// // the expected augmented matrix -// Matrix expAb = Matrix_(4, 7, -// -5., 0., 5., 0., 0., 0.,-1.0, -// +0., -5., 0., 5., 0., 0., 1.5, -// 10., 0., 0., 0.,-10., 0., 2.0, -// +0., 10., 0., 0., 0.,-10.,-1.0); -// -// // expected noise model -// SharedDiagonal expModel = noiseModel::Unit::Create(4); -// -// EXPECT(assert_equal(expAb, Ab)); -// EXPECT(assert_equal(*expModel, *noise)); -//} - -/* ************************************************************************* */ -/* - * x2 x1 x3 b - * 1 1 1 1 1 0 1 - * 1 1 1 -> 1 1 1 - * 1 1 1 1 - */ -// SL-NEEDED? TEST ( GaussianFactorGraph, eliminateFrontals ) { -// typedef GaussianFactorGraph::sharedFactor Factor; -// SharedDiagonal model(Vector_(1, 0.5)); -// GaussianFactorGraph fg; -// Factor factor1(new JacobianFactor(X(1), Matrix_(1,1,1.), X(2), Matrix_(1,1,1.), Vector_(1,1.), model)); -// Factor factor2(new JacobianFactor(X(2), Matrix_(1,1,1.), X(3), Matrix_(1,1,1.), Vector_(1,1.), model)); -// Factor factor3(new JacobianFactor(X(3), Matrix_(1,1,1.), X(3), Matrix_(1,1,1.), Vector_(1,1.), model)); -// fg.push_back(factor1); -// fg.push_back(factor2); -// fg.push_back(factor3); -// -// Ordering frontals; frontals += X(2), X(1); -// GaussianBayesNet bn = fg.eliminateFrontals(frontals); -// -// GaussianBayesNet bn_expected; -// GaussianBayesNet::sharedConditional conditional1(new GaussianConditional(X(2), Vector_(1, 2.), Matrix_(1, 1, 2.), -// X(1), Matrix_(1, 1, 1.), X(3), Matrix_(1, 1, 1.), Vector_(1, 1.))); -// GaussianBayesNet::sharedConditional conditional2(new GaussianConditional(X(1), Vector_(1, 0.), Matrix_(1, 1, -1.), -// X(3), Matrix_(1, 1, 1.), Vector_(1, 1.))); -// bn_expected.push_back(conditional1); -// bn_expected.push_back(conditional2); -// EXPECT(assert_equal(bn_expected, bn)); -// -// GaussianFactorGraph::sharedFactor factor_expected(new JacobianFactor(X(3), Matrix_(1, 1, 2.), Vector_(1, 2.), SharedDiagonal(Vector_(1, 1.)))); -// GaussianFactorGraph fg_expected; -// fg_expected.push_back(factor_expected); -// EXPECT(assert_equal(fg_expected, fg)); -//} - /* ************************************************************************* */ TEST(GaussianFactorGraph, createSmoother2) { diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index 93ecd6dbe..71a075ccb 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -105,6 +105,49 @@ TEST( Graph, composePoses ) CHECK(assert_equal(expected, *actual)); } +// SL-FIX TEST( GaussianFactorGraph, findMinimumSpanningTree ) +//{ +// GaussianFactorGraph g; +// Matrix I = eye(2); +// Vector b = Vector_(0, 0, 0); +// g.add(X(1), I, X(2), I, b, model); +// g.add(X(1), I, X(3), I, b, model); +// g.add(X(1), I, X(4), I, b, model); +// g.add(X(2), I, X(3), I, b, model); +// g.add(X(2), I, X(4), I, b, model); +// g.add(X(3), I, X(4), I, b, model); +// +// map tree = g.findMinimumSpanningTree(); +// EXPECT(tree[X(1)].compare(X(1))==0); +// EXPECT(tree[X(2)].compare(X(1))==0); +// EXPECT(tree[X(3)].compare(X(1))==0); +// EXPECT(tree[X(4)].compare(X(1))==0); +//} + +///* ************************************************************************* */ +// SL-FIX TEST( GaussianFactorGraph, split ) +//{ +// GaussianFactorGraph g; +// Matrix I = eye(2); +// Vector b = Vector_(0, 0, 0); +// g.add(X(1), I, X(2), I, b, model); +// g.add(X(1), I, X(3), I, b, model); +// g.add(X(1), I, X(4), I, b, model); +// g.add(X(2), I, X(3), I, b, model); +// g.add(X(2), I, X(4), I, b, model); +// +// PredecessorMap tree; +// tree[X(1)] = X(1); +// tree[X(2)] = X(1); +// tree[X(3)] = X(1); +// tree[X(4)] = X(1); +// +// GaussianFactorGraph Ab1, Ab2; +// g.split(tree, Ab1, Ab2); +// LONGS_EQUAL(3, Ab1.size()); +// LONGS_EQUAL(2, Ab2.size()); +//} + /* ************************************************************************* */ int main() { TestResult tr; From 35d188e36dbe14e3608b3847a7e82ae016959603 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 3 Sep 2012 18:01:24 +0000 Subject: [PATCH 862/914] Moved testIterative.cpp back to GTSAM, made the first test compile/run --- tests/testIterative.cpp | 194 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 tests/testIterative.cpp diff --git a/tests/testIterative.cpp b/tests/testIterative.cpp new file mode 100644 index 000000000..88eb222bd --- /dev/null +++ b/tests/testIterative.cpp @@ -0,0 +1,194 @@ +/* ---------------------------------------------------------------------------- + + * 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 testIterative.cpp + * @brief Unit tests for iterative methods + * @author Frank Dellaert + **/ + +#include +#include +#include +#include +//#include +//#include +#include +//#include + +#include + +using namespace std; +using namespace gtsam; +using namespace example; +using symbol_shorthand::X; // to create pose keys +using symbol_shorthand::L; // to create landmark keys + +static bool verbose = false; + +/* ************************************************************************* */ +TEST( Iterative, steepestDescent ) +{ + // Create factor graph + Ordering ord; + ord += L(1), X(1), X(2); + JacobianFactorGraph fg = createGaussianFactorGraph(ord); + + // eliminate and solve + VectorValues expected = *GaussianSequentialSolver(fg).optimize(); + + // Do gradient descent + VectorValues zero = VectorValues::Zero(expected); // TODO, how do we do this normally? + ConjugateGradientParameters parameters; +// parameters.verbosity_ = ConjugateGradientParameters::COMPLEXITY; + VectorValues actual = steepestDescent(fg, zero, parameters); + CHECK(assert_equal(expected,actual,1e-2)); +} + +/* ************************************************************************* */ +TEST( Iterative, conjugateGradientDescent ) +{ +// // Expected solution +// Ordering ord; +// ord += L(1), X(1), X(2); +// GaussianFactorGraph fg = createGaussianFactorGraph(); +// VectorValues expected = fg.optimize(ord); // destructive +// +// // create graph and get matrices +// GaussianFactorGraph fg2 = createGaussianFactorGraph(); +// Matrix A; +// Vector b; +// Vector x0 = gtsam::zero(6); +// boost::tie(A, b) = fg2.matrix(ord); +// Vector expectedX = Vector_(6, -0.1, 0.1, -0.1, -0.1, 0.1, -0.2); +// +// // Do conjugate gradient descent, System version +// System Ab(A, b); +// Vector actualX = conjugateGradientDescent(Ab, x0, verbose); +// CHECK(assert_equal(expectedX,actualX,1e-9)); +// +// // Do conjugate gradient descent, Matrix version +// Vector actualX2 = conjugateGradientDescent(A, b, x0, verbose); +// CHECK(assert_equal(expectedX,actualX2,1e-9)); +// +// // Do conjugate gradient descent on factor graph +// VectorValues zero = createZeroDelta(); +// VectorValues actual = conjugateGradientDescent(fg2, zero, verbose); +// CHECK(assert_equal(expected,actual,1e-2)); +// +// // Test method +// VectorValues actual2 = fg2.conjugateGradientDescent(zero, verbose); +// CHECK(assert_equal(expected,actual2,1e-2)); +} + +/* ************************************************************************* */ +/*TEST( Iterative, conjugateGradientDescent_hard_constraint ) +{ + typedef Pose2Values::Key Key; + + Pose2Values config; + config.insert(1, Pose2(0.,0.,0.)); + config.insert(2, Pose2(1.5,0.,0.)); + + Pose2Graph graph; + Matrix cov = eye(3); + graph.push_back(Pose2Graph::sharedFactor(new Pose2Factor(Key(1), Key(2), Pose2(1.,0.,0.), cov))); + graph.addHardConstraint(1, config[1]); + + VectorValues zeros; + zeros.insert(X(1),zero(3)); + zeros.insert(X(2),zero(3)); + + GaussianFactorGraph fg = graph.linearize(config); + VectorValues actual = conjugateGradientDescent(fg, zeros, true, 1e-3, 1e-5, 10); + + VectorValues expected; + expected.insert(X(1), zero(3)); + expected.insert(X(2), Vector_(-0.5,0.,0.)); + CHECK(assert_equal(expected, actual)); +}*/ + +/* ************************************************************************* */ +TEST( Iterative, conjugateGradientDescent_soft_constraint ) +{ +// Pose2Values config; +// config.insert(1, Pose2(0.,0.,0.)); +// config.insert(2, Pose2(1.5,0.,0.)); +// +// Pose2Graph graph; +// graph.addPrior(1, Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); +// graph.addConstraint(1,2, Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); +// +// VectorValues zeros; +// zeros.insert(X(1),zero(3)); +// zeros.insert(X(2),zero(3)); +// +// boost::shared_ptr fg = graph.linearize(config); +// VectorValues actual = conjugateGradientDescent(*fg, zeros, verbose, 1e-3, 1e-5, 100); +// +// VectorValues expected; +// expected.insert(X(1), zero(3)); +// expected.insert(X(2), Vector_(3,-0.5,0.,0.)); +// CHECK(assert_equal(expected, actual)); +} + +/* ************************************************************************* */ +TEST( Iterative, subgraphPCG ) +{ +// typedef Pose2Values::Key Key; +// +// Pose2Values theta_bar; +// theta_bar.insert(1, Pose2(0.,0.,0.)); +// theta_bar.insert(2, Pose2(1.5,0.,0.)); +// +// Pose2Graph graph; +// graph.addPrior(1, Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); +// graph.addConstraint(1,2, Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); +// +// // generate spanning tree and create ordering +// PredecessorMap tree = graph.findMinimumSpanningTree(); +// list keys = predecessorMap2Keys(tree); +// list symbols; +// symbols.resize(keys.size()); +// std::transform(keys.begin(), keys.end(), symbols.begin(), key2symbol); +// Ordering ordering(symbols); +// +// Key root = keys.back(); +// Pose2Graph T, C; +// graph.split(tree, T, C); +// +// // build the subgraph PCG system +// boost::shared_ptr Ab1_ = T.linearize(theta_bar); +// SubgraphPreconditioner::sharedFG Ab1 = T.linearize(theta_bar); +// SubgraphPreconditioner::sharedFG Ab2 = C.linearize(theta_bar); +// SubgraphPreconditioner::sharedBayesNet Rc1 = Ab1_->eliminate_(ordering); +// SubgraphPreconditioner::sharedValues xbar = optimize_(*Rc1); +// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbar); +// +// VectorValues zeros = VectorValues::zero(*xbar); +// +// // Solve the subgraph PCG +// VectorValues ybar = conjugateGradients (system, zeros, verbose, 1e-5, 1e-5, 100); +// VectorValues actual = system.x(ybar); +// +// VectorValues expected; +// expected.insert(X(1), zero(3)); +// expected.insert(X(2), Vector_(3, -0.5, 0., 0.)); +// CHECK(assert_equal(expected, actual)); +} + +/* ************************************************************************* */ +int main() { + TestResult tr; + return TestRegistry::runAllTests(tr); +} +/* ************************************************************************* */ From edef9851dcdb3cc1879aae7d941ff9797ca82d9a Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 3 Sep 2012 18:17:16 +0000 Subject: [PATCH 863/914] Fixed case issue for PlanarSLAMExample_graph --- matlab/gtsam_examples/gtsamExamples.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/gtsam_examples/gtsamExamples.m b/matlab/gtsam_examples/gtsamExamples.m index 39ba79203..094329329 100644 --- a/matlab/gtsam_examples/gtsamExamples.m +++ b/matlab/gtsam_examples/gtsamExamples.m @@ -146,7 +146,7 @@ PlanarSLAMExample_sampling function PlanarSLAMGraph_Callback(hObject, eventdata, handles) axes(handles.axes3); echo on -PlanarSLAMExample_Graph +PlanarSLAMExample_graph echo off % --- Executes on button press in SFM. From 3d5220140278d42e156da62a34f3e0e33bf8d120 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 3 Sep 2012 18:22:13 +0000 Subject: [PATCH 864/914] Adjusted spacing for the buttons in example gui --- matlab/gtsam_examples/gtsamExamples.fig | Bin 10933 -> 10949 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/matlab/gtsam_examples/gtsamExamples.fig b/matlab/gtsam_examples/gtsamExamples.fig index ca48437dae84bc997488acd393909553f61e90f9..70e22957a18c26de22db0bae2900c464c5902124 100644 GIT binary patch delta 10299 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 JJx4m`{{gkx0DAxc delta 10287 zcmV+~DA3o%Rkc-+KMXTEH846eFd#B8F*1=+BavVRe;z3S000000003=O%DJ70G22K z0C=42Sif%@Hx#BN*>%#`unQDWGifPe1BNAcNtVLrIBD!6j*ZyPRw&eol33p_9C=RE zzaV2q{|%iw6&*Wf?9d@YQv^j}6hRSW>{z}dsk@_P>m)mN8~6d#yT{`rA3suj-*Flt z^rAS1eZqSH)}$4yAt|Xy}v06?*>G5(ZOERkwy^u0SP%J z4A~v(G(+NvS{4wSVkd4fEy^uXbR4BVaZD%;GNbGkZAT$F>OXP9JV36fdXP_F6AS$R znMJv9(DR;E_Kf)1^(bd3C9A&Uhes-09P}!_f1(a~fL+q7Sob(-lW?tv+q$?8kDrY-;GQHgSA^R-gWQjsExY!?M&rEB!+0UzGk;>6c3Xru1v2|4{l*r4N<< zOX)XC|E=^}rQiL>^jjm&H^w{;jd|*MpH?pM&&D+@{u&33i^fUgrg7A`YMeFhrf|YQ1BWna z-c{D3;5PBNwE^Q6GvgMK-)iOZD`fl%2sl9=zf#7pggoCPdGh_Vfe+aCcD7eGDtgNK z#y@VpTj*q-kd7PjdIf3G`?h3BT~WGhjoR-n$oOOH_g5fO*7qP^+txFX$u;XVfAbu~ zlP6IYXRvMTI1Oy?ndA1G4@zmxgTe1$VmN+0rR?jX+}mBhb9XZU#>kL^8GnQw+DvF; z%)iHn>tFAuA4L(Ik?xavN518_O}&<{+WLY;hqS3EZb%%0ndZA;hWujNCagz$-4=Bc zUaS$6#FSC5?GUbLH0v@O=so;ne-UapzP%^jOFx+GHr^*q;QO%!51u0KgVsY!zx8-I zHrjeTK*@KLoc2?ae7gh@>og)Rrxy4@6u9E61KvcG`@X;+)J8joz;|-Y!;GgOo(d!S zl}7Zte$H{8w;vkOZ>o>qFz5dJK99_JbuRf({SeB>H@-A*1^YC7!_7JFfBWJ&gZ9x! z#<*b1b8P8M{C|3P{CTSHdeZ0VMc#WwRG!MGy7xk@n1_^y%)2wnwnSM~|6}zU-Ny~$ zphV1zA@k-4#(!Q+#-AB5KD2*a96esSA4A{g@;xH~4l(at)iL66>LpWXMV<}8*43(- ze6ZhoRZw=lz^+CttO{O$f1T>a%Fg|j+tr6()RvZTeVa#3F=n3gcP!KI7^7HeRyNxh|fYhqM&te^YbX*{p1xRF0ipkdR^C#e>7hjguj+_Kicmg zR6d{= z68xW`;r6BGwV=&Ui?fKQ_Q~<_=x?+SDlb%IUbuC^dEsElywJJK3ulrSD(93J(&t~l z_^^Q&*g5mUW0Et%!e-ICzxav;3<4&h5+b$m( z+(|aGZ+G7By?O7=dv7-a0A1!4;4V5M5Qex#r_C#a6s3qti`HwHL`6vfdrYGW@MEl2 zQ{)mNGFERQg5Z?-Y&`@JwdBQr%W;-Z*DrAEgD&eueXEElsHkB~8t-+fhBQR528>pT ztlC?cH`EeUf3~oI)UqPg{Dr+jIPuP@k{9Zy>q4l9IO~Jof+i7KtmqYFYTgVx1b-Tk&4yjDmHYmarW{98$1r<Vvd?a?3GGS+fj$5X7{IhZM zm{v4wsO1b+%6&B_&DeI(&m!@&8K~G^_ZseoJ$P=>=bERiSmoy$y ztV3d*YR3;OAJP%GXccQ!Gh9}rvW?@V-q++MNzq%+vy&e~(CkNgp39?Ob1z=)q_(e& ze{{XMu#>vi6TJ59+;*yd9y+YIbAG)&kb2vDMD>=>cTW1v3ihIOoAowV##M=E%N>_m zzs@?>Syns6eL0LF-ODmri_PXqMYY?eyW>+l}3qsn=J# zHlAGio;tmoy*Ls3mqS= z@D97L09dU1_p{$u9Lv7K|BnB^zvGc$FG{!BS4>ii$}9DAF3p+NBuvd-TfRCjySvF9(v!=^P}$fe@}kj zaV+}||9{5O^&P(e00960?3m9_6G0Tm2Z{w0bWM!Gs7WtM8%fHK3yFuelpjWEAQlKG z>$F|U!ghDFJ5}K1kAoye!%6W^An|5QG+w+IJ$mqF3d2^I@8@@hhgKkwUp58 zB%9f{-S?e0Z{Ey)QUNr8C;;Fjf4({z0r2C#1z-5K*p69t19O?ro4|3)4&rO3pk$Dw zDgdBGO*G$`k!0)cuBy))8qA2raaMpmPLsnpx0rDR%Qj{%bw`7Hubqp- z&#fo1JIvc}jm&S&R?pAN?~orhURpoIuiwRwjic3iKKF;TV6>ERS^q}sj`)qc_%(6k z21uShZoYo8^EC4Hhi~KYf3wZVshz~dq4rM^-^iP_2P|I}C_YMX~Z3akf z()cRPC%b=2*{AK6O?nv`XbQ?wb^_+8p4)t!>V9{lF>zH(hwm%VEl3$vLAok4I+fI6 zvH3x<4nH@Smv_Ok-{Wgikq|v2NE^n{vCjtZQI*rxf|8A^vZ@1me|*vRdqA3C z*@~*?ak(vtSzD*yMaR$S5L=TLMA_JXt~srv5A0n>a;{~su8%!=z8%@R+|%;%!gl0( zTjP~SXSa&`dBtbze+dqH?7EWoZ~H2%1CqZyL^4e4s*23t4N-$SM0mxitsqGeY1#7U z{JwL|DSrVjf5Z+K3_UEX87PMnv5C>xK=@{FcTW#YB~c-Z$8`H{@$(Y!T^P83@0|Ri zpsskM&*P2i@dllHt$8DL$h`6H;qR&Q@$XgRjlMeMjlL@Je+I9^_m${Ymp58G-T)qN z(D*&xs4w0~arq*4sk|XW1?m+5hsPVvyg}z&Yu=bVWZw97|L4#RdA%auI05#qFR{(S z+{KL}#T!oF5qqQAaaBu)@7;6{oHu+zu?|-~-l$97ST2({raj)M3U3HC;*DjO_@=ph z5xYd*NDh|?e;OWVICBPF+gfwR$RTsatG64Wxes3)Im2yVvFDtCEnJNMmA`wSy#46L z71fBp96vfP?V~O_2hR;>y#Fb{(dLG~00030|Lj;zj1)x_u9?|gU|DdDKUoq?Ruf@~ zm<2tsMoITDEbQv8i#yBkBWA7XuAM2V>1w;HVTX7yf0`f{m799@B8gWM!-;s2L`~o% z7bD()gAxb+C zEco9=e>QX=qYj98i(w0qkOfPgWiU*w#X7W1g8capf%g1;3GS$&wV@Hj>wJoTi%Pr%?=C&POCPJxe^uW?2HS~F@erAi!5uZ`!p7t>Y}f?3 zW7{j(^&pup7iSkskdP`gPHx}Xp|!K-VeyXa?bzY_rKk9{LGerQ(4tneK|ME=r^P=a z*-oVQsigO?GA_q0&6eiMg5Lr<@^G;o;kLag$=)W#j{#*p1wRt}{3$Q}w=sOH-!+gB ze;?W3D1U_BM2ep5$A(b8_isUCdN=dR`uXsex-XOT`jmM`MV!99@zrN{Khl0b^^3EUB<3jQnc4C$Ydq!s)6G8J6!PLtpvx+d zU~>W1B714yGYI0}GuZl`>F9IrsU7v5e`YsnUwYV}7IP?(>}1J9p9&*>9$s3Ptm7-t9XQJ&6X0Xeuba{c=0e^_P zIH<<~m6?OBT3i3HiyYZx(Y6UTpiuF}VS2PE>-t*MY4CJAgUq&_i4;2niXFk*e|Q-Y zx3jJ#tz!Yi*HP3p^8wy?fHzj~?+qnhg6|Se3GRO92WFg zN&n${L4RsKf9G}mw_iC~lX_O%6VP=ndfyt~b9HF`sg63=Ro;7yc2h@We?Rh^%jI%@ zT(13#-ns<;zW^)IZ7t5<(Bkha%Kz6_7_ah?o@#%kc_O-^WvvH)NPQQR$MlLU0n3xU{72LIvfgwqZe>eM@p=Gw3e)eu|)X%eX zn|q7@qalBykl4?X8d}FWSx`c=0{gLR6WDx}x3-pS(ySqM?4$!-`_J3W}E45~8q9zf8v#rvP_ASSi;ibyj<_KwHiV~qD*dfGZ*L`F*vf(*5JLHiLw zs%)R>rXMo zV@-m1myv_T{R3TRofLcTeX&jzhD= zD-W{Ydq(qaISWV5K6zUkK3LaZ;P`em_Z;_Ye-&bS1%XR4uXC01Ue!p?Pt{-f-s8X4 z%YrxG_K=4X=ItiFbZP0nu4g``mj|L7MSA}L00960>{mfg6G0T7mO{h>L8B3m8m=bZ z)Kgmu*eVc1f1xOvm|^#^oj9FYcW2dd;zT%j;umP*#gjMVjlbZX7&z*UpWw`P+ufZM zYnMVH*_TXb-?#hCyuO)v^WGRj=!$GP)RNIa&&ZYydL@%m;|!q*`Fvltu?xa$OUP@9 z&Kv8&%SLz)Ga)al@iLLt!gJ_WpsT(L4#AXcfmvjXe+w)KXSD~dagR`c<6aMR)h~br z%&f3Y?lk;CBlhn0IqtPUSAE6cY?in-#m%Z{Qb3V$FVZ@vyutHEV!RQ=H#dD=8J&D? zbl$jZQ>ZOR`P(~qYUj>ze)4g>@CY5}CxSQ8zL#COm|Zy};DhkbWe>Ze`+OXQ=X^VJ zx1jjje-r(klN*8lO8((hMudyvGS8XN@fmEqu^jF(v&1QPd@OtlB{*|SxY0RsXwI}i z|8~y7E-Z2rqTE_VLt3^JnMFavViN>dRfZ=WTLWU%MTnKTL$)N2X^|3(HGm1UKp4b= zgcOCX5mVG7*dlf;!ca_}ahF8GmM_aee2ijMf8h{j#kmzGz_A^Wza6Xwjvz+VI_Y~) z2pP@zdp2*h2Q4{(1%$eiS)ia}GoITl8gXmNn3)u6#3dVq64CTAp!N#4iSZPgo$rWP z0XO2jw#|-b3$oGiS5?mIPf?b>rY(QB?+YA$hE}lV04b|3II~#bC|0y>Dt(|v?7Z@= zf2Hxg@qB?aD$Jl>WY4_lf~|MKN?ovG7c9`1!J z`KR@`(2X}1t<7C#?2A9wDV`mcoFqLP}Wb5w=Kja;nHWEV?sc)dpL-%0$H4dzXf zH!S^n^6k^_!+c?Hy0SO@c|V#r^lJw~XM4W%d`addiFgLKPgS3sH?P+|9z}6~D*deo z9(0+vpFH%e*736B=V?8h*25|9{CI<`hyQi2DH(1(Jnh%RyJs< zW$#|#Ha_^Mi4TB)paL(x_$EI^e=q`%#ssmnP>Mw;rIgmcG*$(F5}h;Mvv+syUH9Gv zLz?)VY|ovubIzPObLQ+!$0>^P7=Ma94`7^9s!Va(!0Td$zKkVJO-sTneMc=@CmQenVnSpSYhb4EMKa|wk0ehrN?Uw&9H-D$D9^i|Gl!Zk=vZ%d{x}>&hCb zWwV&qJ0AO#ZS!ho?9^Ap&}fZCRhwqofMrypvTSK8nXZocy{T38f4D{)S(0sK8ne?v zMm4j+Fj?$nns)m!yMZP>!9$;|lxefAZoKOGxMGM}9&2qh-u2XCs>WK?OgE)Ll>)%A zE=jFrs;zou)uyTO7=T6hmGD;c=f;MWtffwmX(><6Y|J6sltWgNLsp$b=Cs#RJx(oW zooX~@n$l{r*K5>Re>08C`4FWp#QCJcL-O#D57gi^WMJs$f zgxBAw@j*YM#78%*7FCNju9~uqhcRwdi2ejgAKH9>?x0W^0^%0--6-b2COUc#>VKI2 zI7uJcmQ#lFiF=Vxzesr|hu?*KCl#faM2T0iGj5b~!dGYI!H->%Z zhC=;N@`xKE%KnniOZ;3CIZs+xJPu_#Y@V{ecy4(VdQtLudy1xLj&Tb)kN#KdIabc; zQS|bSOF`>jRM`2s+-U>Ha}JGH>$-F9YkXnUZm&|9-KkC+_)41KM~*tZ3F@xrKq1ci z1=@Yo_u?q|e?M08aV+UQ%zN>_ecu2<_hQ*Tp0P6fvQ#N5E-8(APD(M`Ftn{I-l!hz ze!ZY7N_{AE+Vhp{JCA&~$!DGurFl;D&hy#KJa;RF`T2y?2Ck_|yO9^Nxa07{^sB0} zFuxvm+PsV^cG|=m)hw>9;-_gDCR~(hQi(M)EpAb$e~(F%#uyw@^Ynj`n15iIX@*2<$GBOqDHj(?c z9!hf>eL>I2iI;V2#aK}Hie-Y?fXgrbc6u3)1*bLM|<{Yl%bRp0V z#(mz=xtuPNJ!^n2k$3BXI?3^4fLnQwj~wG6uOsFa#vkPvXMB%se7}1&P`lHn_JZ zf6n)y{e^Z%+r#esar`9$L*(q|fFGQEyAZg}LF4b(pW<{UeEe$_oVv+@MxgBYW4?ur zkNJr0pgap2ALo1SEZ|3S{v6<^!1?dp1Gtnmp6rjThwC|8pojeRC*b?6@p1n0`ePo+ z>mMW!TL)Z!IsX1QW%T4Y%k#v%$MSC zPXKOb^~boS5ANbLNIp9Q7|QA=^ZWMzcgc2vTjc#sK;O9YmHEBj00UWe7H_gK)3ro$PU)u9RdSnp z2;hbrS6Lt9x_=$e6@OALaMd0E!!1D9L*t1YzyG88dV@?8=nS-jamPHK*)@aH6;jb% z&gm*i?zK4eW$FC`00960>{eTB6jd0WZGjYZp->7n-1Y@2+OTbrNTBw#6ugB7q(u`n zHq+hdc3?WQ?9M{L2*wwE(G*O$7z4ieK;na33Yd6%QXhr36o0k!expDEg`yF~^Pio6 zc6w%q*=_Je`+b@I{pZa2&wu{Q*&_&mn?!JsI~fMaf&GBjwZOxPe?(28Vr~Ji?|2&3v^E*ENPV0aCI+$~Z^H|LMGjx)#I=-a5W?SDW|ClE} z|4#4uJRGY5b~)C+E&km8`8f0Y#Jb1v537JJW`8>Mx0^h9{sd)@ZGXI7?2mcvb15&H z^@IKI)EB(Oc=G$5!_ewjU%ZowARK?)WFx~c8M^}*AW?=svT_U1Zg2PDM#^EbieZ?1 zap@f8uE_Rx%8bv0R{Y{h~eW zuUj_(-Dcd;9~^hGgZsz2zH=MUPgXGWky95=Qudm0<>zBu!wlWzRyHuPeldT8bKTnV zcW4*o5IJ=c&`TC~Eu!pnw1eyTx))P+krST-x=GQ?z#jAWINdtJc<_0|y2AM5dyF%V zqmJX~->`T4=8SL?L+9%dMj^li%^EOrabTzQw^&H3k*wGZGOw?fkel zJ)$WVJJx+pbBWt@<2~SQPeB>X&&rxu+`pyI7FE`xLITfG@2r3C*3x8zB3euhR%kTw zW@X{`73)M@#!uUMq(I>d3 zYvcQeM#z;Xin4z`TQEXidMx9qcjsPV=hNZLguUz}_N;k@@9Q%sRtFHj22oeU+K8s< z@$sk>7HON)jH9mVvMOQO3Ux6x07Mb~#S!Z(-x3#kBJU0xT~H@0 z#(%rC$o6Ph48-Gg*u}pf7cbDGbxR7%^6NL&Zj%CffwYr`C`kKaSxAqH4eJ}lhOi<< z^Ow>#lZvZ0lvh^Bk$@uAVB0P&uuUxp#bl6ZblEaNnE3f7s+zjHL5tz};g$!4)eg?H z#%C7yorix~s;t;p1^VNHtsZLAB>`H5Qlx*hc%2U_)&~{qEvb$8{H5{2^?JP} ze&eGOKbw`oO3Coi5fcv5d%NxXP4@yNkM{{$0bh)FRGyCoC z@7tN*t6w)9@dOg8&p#HCuyic~aTZbvaln6{M3^FVEa1=5oID230ssc}qg6lJ_{>HN z$1aY=?B+AGdttJ3m$7r1>{>uG@Nmp#8ESL^%2H|$W(40I6JK)~zAh7=m*ZKYq2bs} zII_3J;`$oRXP-kA_}gv#4CkdJ!Bi!(iDwk-?|-u&+xc}iw!mPB*?Ze+i-VWrE&YF( z#}d^*aopBdXTCNLlS>(uFlMr>Ea4N)>rVEAX`1 zcoU=fdA=Lm=^1K!b!j(v_l*1Mh7_nmsz+R4OeKs&+JbZ*Cs|P9S%_0IGTuL1!GAuR z{}}e?HPtVZB$WM;@Z3yz+<$L)aA*j|V>F-A-)Zkp<#=5dUKj9lf7EIh;&y*NcWr(Y z`PFCg3jlOQ;Z=~9WPbLLs7smxlc=PBmRn!O<}Ze|^p(L-UpAUpL`gb;9_TJg>2=Yc zp&HChEyJ85BdxD@R)!d=tdGUmCB4MrqH=o&N~{Mmd5O(}x4*yc{su9@D>;%E{i9MG z#4z&+JF|Z}ZO^%MrpQDz#_)dyP?C@FqNj^|=KA#5)*)(J@H5<9IQ{H4-Rt1GzAj+2{*Z^Io&Po1fY1vz%SC?Y%zcr}y9Ay!`nzcs=;z+5GmWV8_qMpsSu0{&!>SOuJWs68#yI?u?dZnZ=i|c=DG@pGARp38- zy)tCvFL3mVqgQ~VR|>o*N3W!8{$jXVy`ul^8Zo+0zOoK#tLsX7B~)SG9l*M8hHZt} zP#&?aYS(wz`sCb3+Q@&`kEa}c;^-4cpA>jcjy_4){KasU`Xr|JbVL@SGf>Ucp-voq z@;80b364ge^c=B1`S$ho#jacL%IcF4sQve~kf6SWsLx2zW2HMhz`7sL-hOz&HJAs0 z|4esmrJe60z|kFI{f_Q9S-RsO-$nL5?@p^w$yTpC{r~^~|NoQgC#HW2r{gcS&ivMA zU;O9g-T0sz_Wa*`WnFns*fYEDSlKjTr9H^p31fU>`?cUYn#M1${gBqQrs>8-1v}jXqd8h2cH{NgopyeaPX)3iJstlndzd`(h(&CJy(vp(=JR?(Tn}dx802?$)ld~= Date: Mon, 3 Sep 2012 18:30:34 +0000 Subject: [PATCH 865/914] Fixed installing .svn directories in matlab toolbox --- matlab/CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index 0be3863a1..16cfb501a 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -2,17 +2,16 @@ # Tests message(STATUS "Installing Matlab Toolbox Tests") -install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_tests" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_tests" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m" PATTERN ".svn" EXCLUDE) # Examples message(STATUS "Installing Matlab Toolbox Examples") # Matlab files: *.m and *.fig -install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") -install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.fig") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/gtsam_examples" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m" PATTERN "*.fig" PATTERN ".svn" EXCLUDE) # Utilities message(STATUS "Installing Matlab Toolbox Utilities") -install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/+gtsam" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m") +install(DIRECTORY "${GTSAM_SOURCE_ROOT_DIR}/matlab/+gtsam" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}" FILES_MATCHING PATTERN "*.m" PATTERN ".svn" EXCLUDE) install(FILES "${GTSAM_SOURCE_ROOT_DIR}/matlab/README-gtsam-toolbox.txt" DESTINATION "${GTSAM_TOOLBOX_INSTALL_PATH}") message(STATUS "Installing Matlab Toolbox Examples (Data)") From f16a981a27a55637d8cb53d0107a9e478aca23ee Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 3 Sep 2012 18:32:49 +0000 Subject: [PATCH 866/914] Added first pass of script to automatically generate self-contained precompiled matlab toolbox --- CMakeLists.txt | 1 + package_scripts/toolbox_package_unix.sh | 43 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100755 package_scripts/toolbox_package_unix.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 3df8ab232..5c1c5cdab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,6 +175,7 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSIO #set(CPACK_INSTALLED_DIRECTORIES ".") # FIXME: throws error set(CPACK_SOURCE_IGNORE_FILES "/build*;/\\\\.;/makestats.sh$") set(CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/gtsam_unstable/") +set(CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/package_scripts/") set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}") #set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-aspn${GTSAM_VERSION_PATCH}") # Used for creating ASPN tarballs diff --git a/package_scripts/toolbox_package_unix.sh b/package_scripts/toolbox_package_unix.sh new file mode 100755 index 000000000..44d0dac87 --- /dev/null +++ b/package_scripts/toolbox_package_unix.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +# Detect platform +os=`uname -s` +arch=`uname -p` +if [ "$os" = "Linux" -a "$arch" = "x86_64" ]; then + platform=lin64 +elif [ "$os" = "Linux" -a "$arch" = "i686" ]; then + platform=lin32 +else + echo "Unrecognized platform" + exit 1 +fi + +echo "Platform is ${platform}" + +# Check for empty directory +if [ ! -z "`ls`" ]; then + echo "Please run this script from an empty build directory" + exit 1 +fi + +# Check for boost +if [ -z "$1" -o -z "$2" ]; then + echo "Usage: $0 BOOSTTREE MEX" + echo "BOOSTTREE should be a boost source tree compiled with toolbox_build_boost." + echo "MEX should be the full path of the mex compiler" + exit 1 +fi + +# Run cmake +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$PWD/stage" -DBoost_NO_SYSTEM_PATHS:bool=true -DBoost_USE_STATIC_LIBS:bool=true -DBOOST_ROOT="$1" -DGTSAM_BUILD_UNSTABLE:bool=false -DGTSAM_DISABLE_EXAMPLES_ON_INSTALL:bool=true -DGTSAM_DISABLE_TESTS_ON_INSTALL:bool=true -DGTSAM_MEX_BUILD_STATIC_MODULE:bool=true -DMEX_COMMAND="$2" .. + +if [ ! $? ]; then + echo "CMake failed" + exit 1 +fi + +# Compile +make -j4 install + +# Create package +tar czf gtsam-toolbox-2.1.0-$platform.tgz -C stage/borg toolbox From 9497a233ce9805f729b9495bcedf288a6dd400f2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 3 Sep 2012 18:36:05 +0000 Subject: [PATCH 867/914] Cleaned up all remaining commented-out unit tests from the old linear rewrite - removed or reenabled as needed. --- gtsam/inference/tests/testFactorGraph.cpp | 59 ------- tests/testGaussianFactor.cpp | 184 ---------------------- tests/testGaussianISAM.cpp | 27 +--- tests/testGraph.cpp | 59 +++++++ tests/testNonlinearFactor.cpp | 4 +- 5 files changed, 62 insertions(+), 271 deletions(-) diff --git a/gtsam/inference/tests/testFactorGraph.cpp b/gtsam/inference/tests/testFactorGraph.cpp index b2f9bc3f1..bfbe716d4 100644 --- a/gtsam/inference/tests/testFactorGraph.cpp +++ b/gtsam/inference/tests/testFactorGraph.cpp @@ -60,65 +60,6 @@ TEST(FactorGraph, eliminateFrontals) { EXPECT(assert_equal(expectedCond, *actualCond)); } -///* ************************************************************************* */ -// SL-FIX TEST( FactorGraph, splitMinimumSpanningTree ) -//{ -// SymbolicFactorGraph G; -// G.push_factor("x1", "x2"); -// G.push_factor("x1", "x3"); -// G.push_factor("x1", "x4"); -// G.push_factor("x2", "x3"); -// G.push_factor("x2", "x4"); -// G.push_factor("x3", "x4"); -// -// SymbolicFactorGraph T, C; -// boost::tie(T, C) = G.splitMinimumSpanningTree(); -// -// SymbolicFactorGraph expectedT, expectedC; -// expectedT.push_factor("x1", "x2"); -// expectedT.push_factor("x1", "x3"); -// expectedT.push_factor("x1", "x4"); -// expectedC.push_factor("x2", "x3"); -// expectedC.push_factor("x2", "x4"); -// expectedC.push_factor("x3", "x4"); -// CHECK(assert_equal(expectedT,T)); -// CHECK(assert_equal(expectedC,C)); -//} - -///* ************************************************************************* */ -///** -// * x1 - x2 - x3 - x4 - x5 -// * | | / | -// * l1 l2 l3 -// */ -// SL-FIX TEST( FactorGraph, removeSingletons ) -//{ -// SymbolicFactorGraph G; -// G.push_factor("x1", "x2"); -// G.push_factor("x2", "x3"); -// G.push_factor("x3", "x4"); -// G.push_factor("x4", "x5"); -// G.push_factor("x2", "l1"); -// G.push_factor("x3", "l2"); -// G.push_factor("x4", "l2"); -// G.push_factor("x4", "l3"); -// -// SymbolicFactorGraph singletonGraph; -// set singletons; -// boost::tie(singletonGraph, singletons) = G.removeSingletons(); -// -// set singletons_excepted; singletons_excepted += "x1", "x2", "x5", "l1", "l3"; -// CHECK(singletons_excepted == singletons); -// -// SymbolicFactorGraph singletonGraph_excepted; -// singletonGraph_excepted.push_factor("x2", "l1"); -// singletonGraph_excepted.push_factor("x4", "l3"); -// singletonGraph_excepted.push_factor("x1", "x2"); -// singletonGraph_excepted.push_factor("x4", "x5"); -// singletonGraph_excepted.push_factor("x2", "x3"); -// CHECK(singletonGraph_excepted.equals(singletonGraph)); -//} - /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index 0097ec49a..3fe92c50d 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -66,33 +66,6 @@ TEST( GaussianFactor, linearFactor ) EXPECT(assert_equal(expected,*lf)); } -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactor, keys ) -//{ -// // get the factor kf2 from the small linear factor graph -// Ordering ordering; ordering += kx1,kx2,kl1; -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// GaussianFactor::shared_ptr lf = fg[1]; -// list expected; -// expected.push_back(kx1); -// expected.push_back(kx2); -// EXPECT(lf->keys() == expected); -//} - -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactor, dimensions ) -//{ -// // get the factor kf2 from the small linear factor graph -// Ordering ordering; ordering += kx1,kx2,kl1; -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// -// // Check a single factor -// Dimensions expected; -// insert(expected)(kx1, 2)(kx2, 2); -// Dimensions actual = fg[1]->dimensions(); -// EXPECT(expected==actual); -//} - /* ************************************************************************* */ TEST( GaussianFactor, getDim ) { @@ -110,62 +83,6 @@ TEST( GaussianFactor, getDim ) EXPECT_LONGS_EQUAL(expected, actual); } -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactor, combine ) -//{ -// // create a small linear factor graph -// Ordering ordering; ordering += kx1,kx2,kl1; -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// -// // get two factors from it and insert the factors into a vector -// vector lfg; -// lfg.push_back(fg[4 - 1]); -// lfg.push_back(fg[2 - 1]); -// -// // combine in a factor -// GaussianFactor combined(lfg); -// -// // sigmas -// double sigma2 = 0.1; -// double sigma4 = 0.2; -// Vector sigmas = Vector_(4, sigma4, sigma4, sigma2, sigma2); -// -// // the expected combined linear factor -// Matrix Ax2 = Matrix_(4, 2, // x2 -// -5., 0., -// +0., -5., -// 10., 0., -// +0., 10.); -// -// Matrix Al1 = Matrix_(4, 2, // l1 -// 5., 0., -// 0., 5., -// 0., 0., -// 0., 0.); -// -// Matrix Ax1 = Matrix_(4, 2, // x1 -// 0.00, 0., // f4 -// 0.00, 0., // f4 -// -10., 0., // f2 -// 0.00, -10. // f2 -// ); -// -// // the RHS -// Vector b2(4); -// b2(0) = -1.0; -// b2(1) = 1.5; -// b2(2) = 2.0; -// b2(3) = -1.0; -// -// // use general constructor for making arbitrary factors -// vector > meas; -// meas.push_back(make_pair(kx2, Ax2)); -// meas.push_back(make_pair(kl1, Al1)); -// meas.push_back(make_pair(kx1, Ax1)); -// GaussianFactor expected(meas, b2, noiseModel::Diagonal::Sigmas(ones(4))); -// EXPECT(assert_equal(expected,combined)); -//} - /* ************************************************************************* */ TEST( GaussianFactor, error ) { @@ -186,47 +103,6 @@ TEST( GaussianFactor, error ) DOUBLES_EQUAL( 1.0, actual, 0.00000001 ); } -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactor, eliminate ) -//{ -// // create a small linear factor graph -// Ordering ordering; ordering += kx1,kx2,kl1; -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// -// // get two factors from it and insert the factors into a vector -// vector lfg; -// lfg.push_back(fg[4 - 1]); -// lfg.push_back(fg[2 - 1]); -// -// // combine in a factor -// GaussianFactor combined(lfg); -// -// // eliminate the combined factor -// GaussianConditional::shared_ptr actualCG; -// GaussianFactor::shared_ptr actualLF; -// boost::tie(actualCG,actualLF) = combined.eliminate(kx2); -// -// // create expected Conditional Gaussian -// Matrix I = eye(2)*sqrt(125.0); -// Matrix R11 = I, S12 = -0.2*I, S13 = -0.8*I; -// Vector d = I*Vector_(2,0.2,-0.14); -// -// // Check the conditional Gaussian -// GaussianConditional -// expectedCG(kx2, d, R11, kl1, S12, kx1, S13, repeat(2, 1.0)); -// -// // the expected linear factor -// I = eye(2)/0.2236; -// Matrix Bl1 = I, Bx1 = -I; -// Vector b1 = I*Vector_(2,0.0,0.2); -// -// GaussianFactor expectedLF(kl1, Bl1, kx1, Bx1, b1, repeat(2,1.0)); -// -// // check if the result matches -// EXPECT(assert_equal(expectedCG,*actualCG,1e-3)); -// EXPECT(assert_equal(expectedLF,*actualLF,1e-3)); -//} - /* ************************************************************************* */ TEST( GaussianFactor, matrix ) { @@ -328,66 +204,6 @@ void print(const list& i) { cout << endl; } -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactor, sparse ) -//{ -// // create a small linear factor graph -// Ordering ordering; ordering += kx1,kx2,kl1; -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// -// // get the factor kf2 from the factor graph -// GaussianFactor::shared_ptr lf = fg[1]; -// -// // render with a given ordering -// Ordering ord; -// ord += kx1,kx2; -// -// list i,j; -// list s; -// boost::tie(i,j,s) = lf->sparse(fg.columnIndices(ord)); -// -// list i1,j1; -// i1 += 1,2,1,2; -// j1 += 1,2,3,4; -// -// list s1; -// s1 += -10,-10,10,10; -// -// EXPECT(i==i1); -// EXPECT(j==j1); -// EXPECT(s==s1); -//} - -///* ************************************************************************* */ -// SL-FIX TEST( GaussianFactor, sparse2 ) -//{ -// // create a small linear factor graph -// Ordering ordering; ordering += kx1,kx2,kl1; -// GaussianFactorGraph fg = createGaussianFactorGraph(ordering); -// -// // get the factor kf2 from the factor graph -// GaussianFactor::shared_ptr lf = fg[1]; -// -// // render with a given ordering -// Ordering ord; -// ord += kx2,kl1,kx1; -// -// list i,j; -// list s; -// boost::tie(i,j,s) = lf->sparse(fg.columnIndices(ord)); -// -// list i1,j1; -// i1 += 1,2,1,2; -// j1 += 5,6,1,2; -// -// list s1; -// s1 += -10,-10,10,10; -// -// EXPECT(i==i1); -// EXPECT(j==j1); -// EXPECT(s==s1); -//} - /* ************************************************************************* */ TEST( GaussianFactor, size ) { diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index 7ec4e5317..ea91eda5a 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -47,7 +47,7 @@ static double sigmax1 = 0.786153, sigmax2 = 1.0/1.47292, sigmax3 = 0.671512, sig static const double tol = 1e-4; /* ************************************************************************* */ -TEST_UNSAFE( ISAM, iSAM_smoother ) +TEST( ISAM, iSAM_smoother ) { Ordering ordering; for (int t = 1; t <= 7; t++) ordering += X(t); @@ -76,31 +76,6 @@ TEST_UNSAFE( ISAM, iSAM_smoother ) EXPECT(assert_equal(e, optimized)); } -/* ************************************************************************* */ -// SL-FIX TEST( ISAM, iSAM_smoother2 ) -//{ -// // Create smoother with 7 nodes -// GaussianFactorGraph smoother = createSmoother(7); -// -// // Create initial tree from first 4 timestamps in reverse order ! -// Ordering ord; ord += X(4),X(3),X(2),X(1); -// GaussianFactorGraph factors1; -// for (int i=0;i<7;i++) factors1.push_back(smoother[i]); -// GaussianISAM actual(*inference::Eliminate(factors1)); -// -// // run iSAM with remaining factors -// GaussianFactorGraph factors2; -// for (int i=7;i<13;i++) factors2.push_back(smoother[i]); -// actual.update(factors2); -// -// // Create expected Bayes Tree by solving smoother with "natural" ordering -// Ordering ordering; -// for (int t = 1; t <= 7; t++) ordering += symbol('x', t); -// GaussianISAM expected(smoother.eliminate(ordering)); -// -// EXPECT(assert_equal(expected, actual)); -//} - /* ************************************************************************* * Bayes tree for smoother with "natural" ordering: C1 x6 x7 diff --git a/tests/testGraph.cpp b/tests/testGraph.cpp index 71a075ccb..14655a249 100644 --- a/tests/testGraph.cpp +++ b/tests/testGraph.cpp @@ -148,6 +148,65 @@ TEST( Graph, composePoses ) // LONGS_EQUAL(2, Ab2.size()); //} +///* ************************************************************************* */ +// SL-FIX TEST( FactorGraph, splitMinimumSpanningTree ) +//{ +// SymbolicFactorGraph G; +// G.push_factor("x1", "x2"); +// G.push_factor("x1", "x3"); +// G.push_factor("x1", "x4"); +// G.push_factor("x2", "x3"); +// G.push_factor("x2", "x4"); +// G.push_factor("x3", "x4"); +// +// SymbolicFactorGraph T, C; +// boost::tie(T, C) = G.splitMinimumSpanningTree(); +// +// SymbolicFactorGraph expectedT, expectedC; +// expectedT.push_factor("x1", "x2"); +// expectedT.push_factor("x1", "x3"); +// expectedT.push_factor("x1", "x4"); +// expectedC.push_factor("x2", "x3"); +// expectedC.push_factor("x2", "x4"); +// expectedC.push_factor("x3", "x4"); +// CHECK(assert_equal(expectedT,T)); +// CHECK(assert_equal(expectedC,C)); +//} + +///* ************************************************************************* */ +///** +// * x1 - x2 - x3 - x4 - x5 +// * | | / | +// * l1 l2 l3 +// */ +// SL-FIX TEST( FactorGraph, removeSingletons ) +//{ +// SymbolicFactorGraph G; +// G.push_factor("x1", "x2"); +// G.push_factor("x2", "x3"); +// G.push_factor("x3", "x4"); +// G.push_factor("x4", "x5"); +// G.push_factor("x2", "l1"); +// G.push_factor("x3", "l2"); +// G.push_factor("x4", "l2"); +// G.push_factor("x4", "l3"); +// +// SymbolicFactorGraph singletonGraph; +// set singletons; +// boost::tie(singletonGraph, singletons) = G.removeSingletons(); +// +// set singletons_excepted; singletons_excepted += "x1", "x2", "x5", "l1", "l3"; +// CHECK(singletons_excepted == singletons); +// +// SymbolicFactorGraph singletonGraph_excepted; +// singletonGraph_excepted.push_factor("x2", "l1"); +// singletonGraph_excepted.push_factor("x4", "l3"); +// singletonGraph_excepted.push_factor("x1", "x2"); +// singletonGraph_excepted.push_factor("x4", "x5"); +// singletonGraph_excepted.push_factor("x2", "x3"); +// CHECK(singletonGraph_excepted.equals(singletonGraph)); +//} + /* ************************************************************************* */ int main() { TestResult tr; diff --git a/tests/testNonlinearFactor.cpp b/tests/testNonlinearFactor.cpp index b1717a79b..c8824749d 100644 --- a/tests/testNonlinearFactor.cpp +++ b/tests/testNonlinearFactor.cpp @@ -73,8 +73,8 @@ TEST( NonlinearFactor, equals2 ) Graph::sharedFactor f0 = fg[0], f1 = fg[1]; CHECK(f0->equals(*f0)); -// SL-FIX CHECK(!f0->equals(*f1)); -// SL-FIX CHECK(!f1->equals(*f0)); + CHECK(!f0->equals(*f1)); + CHECK(!f1->equals(*f0)); } /* ************************************************************************* */ From 43f8613ec521cdfa13769bee6e77c26128ff7a06 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 3 Sep 2012 18:57:05 +0000 Subject: [PATCH 868/914] Fix in testDataset --- gtsam/slam/tests/testDataset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/slam/tests/testDataset.cpp b/gtsam/slam/tests/testDataset.cpp index 2df2228af..aae3fc5da 100644 --- a/gtsam/slam/tests/testDataset.cpp +++ b/gtsam/slam/tests/testDataset.cpp @@ -26,7 +26,7 @@ using namespace std; using namespace gtsam; TEST(dataSet, findExampleDataFile) { - const string expected_end = "gtsam/examples/Data/example.graph"; + const string expected_end = "examples/Data/example.graph"; const string actual = findExampleDataFile("example"); string actual_end = actual.substr(actual.size() - expected_end.size(), expected_end.size()); boost::replace_all(actual_end, "\\", "/"); // Convert directory separators to forward-slash From 21d9d8aa0cabb393225cc2295baf9b4ab7ae3822 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 3 Sep 2012 19:25:27 +0000 Subject: [PATCH 869/914] Print ordering with multiple entries per line for more compact printout --- gtsam/nonlinear/Ordering.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/gtsam/nonlinear/Ordering.cpp b/gtsam/nonlinear/Ordering.cpp index 9f99948a4..b445af506 100644 --- a/gtsam/nonlinear/Ordering.cpp +++ b/gtsam/nonlinear/Ordering.cpp @@ -44,10 +44,23 @@ void Ordering::print(const string& str, const KeyFormatter& keyFormatter) const cout << str; // Print ordering in index order Ordering::InvertedMap inverted = this->invert(); - cout << "key (zero-based order)\n"; + // Print the ordering with varsPerLine ordering entries printed on each line, + // for compactness. + static const size_t varsPerLine = 10; + bool endedOnNewline = false; BOOST_FOREACH(const Ordering::InvertedMap::value_type& index_key, inverted) { - cout << keyFormatter(index_key.second) << " (" << index_key.first << ")\n"; + if(index_key.first % varsPerLine != 0) + cout << ", "; + cout << index_key.first << ":" << keyFormatter(index_key.second); + if(index_key.first % varsPerLine == varsPerLine - 1) { + cout << "\n"; + endedOnNewline = true; + } else { + endedOnNewline = false; + } } + if(!endedOnNewline) + cout << "\n"; cout.flush(); } From af652b0e04c5fcb8a3e44c659ec124477b20f090 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Mon, 3 Sep 2012 19:43:08 +0000 Subject: [PATCH 870/914] remove simpleSPCG reorg SubgraphSolver add unit test for SubgraphSolver --- examples/Pose2SLAMwSPCG.cpp | 12 - gtsam/linear/JacobianFactorGraph.cpp | 15 +- gtsam/linear/JacobianFactorGraph.h | 4 +- gtsam/linear/SimpleSPCGSolver.cpp | 226 ------------------ gtsam/linear/SimpleSPCGSolver.h | 98 -------- gtsam/linear/SubgraphPreconditioner.cpp | 4 +- gtsam/linear/SubgraphPreconditioner.h | 9 +- gtsam/linear/SubgraphSolver-inl.h | 80 ------- gtsam/linear/SubgraphSolver.cpp | 178 +++++++++----- gtsam/linear/SubgraphSolver.h | 69 +++++- .../SuccessiveLinearizationOptimizer.cpp | 7 +- tests/testSubgraphPreconditioner.cpp | 4 +- tests/testSubgraphSolver.cpp | 106 ++++++++ 13 files changed, 316 insertions(+), 496 deletions(-) delete mode 100644 gtsam/linear/SimpleSPCGSolver.cpp delete mode 100644 gtsam/linear/SimpleSPCGSolver.h delete mode 100644 gtsam/linear/SubgraphSolver-inl.h create mode 100644 tests/testSubgraphSolver.cpp diff --git a/examples/Pose2SLAMwSPCG.cpp b/examples/Pose2SLAMwSPCG.cpp index 240361db7..36f2552a1 100644 --- a/examples/Pose2SLAMwSPCG.cpp +++ b/examples/Pose2SLAMwSPCG.cpp @@ -54,13 +54,9 @@ // for each variable, held in a Values container. #include -// ??? -#include #include #include - - using namespace std; using namespace gtsam; @@ -110,14 +106,6 @@ int main(int argc, char** argv) { parameters.verbosityLM = LevenbergMarquardtParams::LAMBDA; parameters.linearSolverType = SuccessiveLinearizationParams::CONJUGATE_GRADIENT; - { - parameters.iterativeParams = boost::make_shared(); - LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, parameters); - Values result = optimizer.optimize(); - result.print("Final Result:\n"); - cout << "simple spcg solver final error = " << graph.error(result) << endl; - } - { parameters.iterativeParams = boost::make_shared(); LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, parameters); diff --git a/gtsam/linear/JacobianFactorGraph.cpp b/gtsam/linear/JacobianFactorGraph.cpp index 0ca3b8667..70c57e8df 100644 --- a/gtsam/linear/JacobianFactorGraph.cpp +++ b/gtsam/linear/JacobianFactorGraph.cpp @@ -115,7 +115,20 @@ JacobianFactorGraph::shared_ptr dynamicCastFactors(const GaussianFactorGraph &gf return jfg; } - +/* ************************************************************************* */ +JacobianFactorGraph::shared_ptr convertToJacobianFactorGraph(const GaussianFactorGraph &gfg) { + JacobianFactorGraph::shared_ptr jfg(new JacobianFactorGraph()); + jfg->reserve(gfg.size()); + BOOST_FOREACH(const GaussianFactor::shared_ptr & factor, gfg) { + if( JacobianFactor::shared_ptr jf = boost::dynamic_pointer_cast(factor) ) { + jfg->push_back(jf); + } + else { + jfg->push_back(boost::make_shared(*factor)); + } + } + return jfg; +} } // namespace diff --git a/gtsam/linear/JacobianFactorGraph.h b/gtsam/linear/JacobianFactorGraph.h index cb27b507a..1164652c3 100644 --- a/gtsam/linear/JacobianFactorGraph.h +++ b/gtsam/linear/JacobianFactorGraph.h @@ -67,7 +67,9 @@ namespace gtsam { void multiply(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r); void transposeMultiply(const JacobianFactorGraph& fg, const VectorValues &r, VectorValues &x); - /** dynamic_cast the gaussian factors down to jacobian factors */ + /** dynamic_cast the gaussian factors down to jacobian factors, may throw exception if it contains non-Jacobian Factor */ JacobianFactorGraph::shared_ptr dynamicCastFactors(const GaussianFactorGraph &gfg); + /** convert the gaussian factors down to jacobian factors, may duplicate factors if it contains Hessian Factor */ + JacobianFactorGraph::shared_ptr convertToJacobianFactorGraph(const GaussianFactorGraph &gfg); } diff --git a/gtsam/linear/SimpleSPCGSolver.cpp b/gtsam/linear/SimpleSPCGSolver.cpp deleted file mode 100644 index fa0fee82f..000000000 --- a/gtsam/linear/SimpleSPCGSolver.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace gtsam { - -/* utility function */ -std::vector extractRowSpec_(const FactorGraph& jfg) { - std::vector spec; spec.reserve(jfg.size()); - BOOST_FOREACH ( const JacobianFactor::shared_ptr &jf, jfg ) { - spec.push_back(jf->rows()); - } - return spec; -} - -std::vector extractColSpec_(const FactorGraph& gfg, const VariableIndex &index) { - const size_t n = index.size(); - std::vector spec(n, 0); - for ( Index i = 0 ; i < n ; ++i ) { - const GaussianFactor &gf = *(gfg[index[i].front()]); - for ( GaussianFactor::const_iterator it = gf.begin() ; it != gf.end() ; ++it ) { - spec[*it] = gf.getDim(it); - } - } - return spec; -} - -SimpleSPCGSolver::SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters) - : Base(), parameters_(parameters) -{ - std::vector colSpec = extractColSpec_(gfg, VariableIndex(gfg)); - - nVar_ = colSpec.size(); - - /* Split the factor graph into At (tree) and Ac (constraints) - * Note: This part has to be refined for your graph/application */ - GaussianFactorGraph::shared_ptr At; - boost::tie(At, Ac_) = this->splitGraph(gfg); - - /* construct row vector spec of the new system */ - nAc_ = Ac_->size(); - std::vector rowSpec = extractRowSpec_(*Ac_); - for ( Index i = 0 ; i < nVar_ ; ++i ) { - rowSpec.push_back(colSpec[i]); - } - - /* solve the tree with direct solver. get preconditioner */ - Rt_ = EliminationTree::Create(*At)->eliminate(EliminateQR); - xt_ = boost::make_shared(gtsam::optimize(*Rt_)); - - /* initial value for the lspcg method */ - y0_ = boost::make_shared(VectorValues::Zero(colSpec)); - - /* the right hand side of the new system */ - by_ = boost::make_shared(VectorValues::Zero(rowSpec)); - for ( Index i = 0 ; i < nAc_ ; ++i ) { - JacobianFactor::shared_ptr jf = (*Ac_)[i]; - Vector xi = internal::extractVectorValuesSlices(*xt_, jf->begin(), jf->end()); - (*by_)[i] = jf->getb() - jf->getA()*xi; - } - - /* allocate buffer for row and column vectors */ - tmpY_ = boost::make_shared(VectorValues::Zero(colSpec)); - tmpB_ = boost::make_shared(VectorValues::Zero(rowSpec)); -} - -/* implements the CGLS method in Section 7.4 of Bjork's book */ -VectorValues SimpleSPCGSolver::optimize (const VectorValues &initial) { - - VectorValues::shared_ptr x(new VectorValues(initial)); - VectorValues r = VectorValues::Zero(*by_), - q = VectorValues::Zero(*by_), - p = VectorValues::Zero(*y0_), - s = VectorValues::Zero(*y0_); - - residual(*x, r); - transposeMultiply(r, s) ; - p.vector() = s.vector() ; - - double gamma = s.vector().squaredNorm(), new_gamma = 0.0, alpha = 0.0, beta = 0.0 ; - - const double threshold = std::max(parameters_.epsilon_abs(), parameters_.epsilon() * parameters_.epsilon() * gamma); - const size_t iMaxIterations = parameters_.maxIterations(); - const Parameters::Verbosity verbosity = parameters_.verbosity(); - - if ( verbosity >= ConjugateGradientParameters::ERROR ) - std::cout << "[SimpleSPCGSolver] epsilon = " << parameters_.epsilon() - << ", max = " << parameters_.maxIterations() - << ", ||r0|| = " << std::sqrt(gamma) - << ", threshold = " << threshold << std::endl; - - size_t k ; - for ( k = 1 ; k < iMaxIterations ; ++k ) { - - multiply(p, q); - alpha = gamma / q.vector().squaredNorm() ; - x->vector() += (alpha * p.vector()); - r.vector() -= (alpha * q.vector()); - transposeMultiply(r, s); - new_gamma = s.vector().squaredNorm(); - beta = new_gamma / gamma ; - p.vector() = s.vector() + beta * p.vector(); - gamma = new_gamma ; - - if ( verbosity >= ConjugateGradientParameters::ERROR) { - std::cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << std::endl; - } - - if ( gamma < threshold ) break ; - } // k - - if ( verbosity >= ConjugateGradientParameters::ERROR ) - std::cout << "[SimpleSPCGSolver] iteration " << k << ": a = " << alpha << ": b = " << beta << ", ||r|| = " << std::sqrt(gamma) << std::endl; - - /* transform y back to x */ - return this->transform(*x); -} - -void SimpleSPCGSolver::residual(const VectorValues &input, VectorValues &output) { - output.vector() = by_->vector(); - this->multiply(input, *tmpB_); - axpy(-1.0, *tmpB_, output); -} - -void SimpleSPCGSolver::multiply(const VectorValues &input, VectorValues &output) { - this->backSubstitute(input, *tmpY_); - gtsam::multiply(*Ac_, *tmpY_, output); - for ( Index i = 0 ; i < nVar_ ; ++i ) { - output[i + nAc_] = input[i]; - } -} - -void SimpleSPCGSolver::transposeMultiply(const VectorValues &input, VectorValues &output) { - gtsam::transposeMultiply(*Ac_, input, *tmpY_); - this->transposeBackSubstitute(*tmpY_, output); - for ( Index i = 0 ; i < nVar_ ; ++i ) { - output[i] += input[nAc_+i]; - } -} - -void SimpleSPCGSolver::backSubstitute(const VectorValues &input, VectorValues &output) { - for ( Index i = 0 ; i < input.size() ; ++i ) { - output[i] = input[i] ; - } - BOOST_REVERSE_FOREACH(const boost::shared_ptr cg, *Rt_) { - const Index key = *(cg->beginFrontals()); - Vector xS = internal::extractVectorValuesSlices(output, cg->beginParents(), cg->endParents()); - xS = input[key] - cg->get_S() * xS; - output[key] = cg->get_R().triangularView().solve(xS); - } -} - -void SimpleSPCGSolver::transposeBackSubstitute(const VectorValues &input, VectorValues &output) { - for ( Index i = 0 ; i < input.size() ; ++i ) { - output[i] = input[i] ; - } - BOOST_FOREACH(const boost::shared_ptr cg, *Rt_) { - const Index key = *(cg->beginFrontals()); - output[key] = gtsam::backSubstituteUpper(output[key], Matrix(cg->get_R())); - const Vector d = internal::extractVectorValuesSlices(output, cg->beginParents(), cg->endParents()) - - cg->get_S().transpose() * output[key]; - internal::writeVectorValuesSlices(d, output, cg->beginParents(), cg->endParents()); - } -} - -VectorValues SimpleSPCGSolver::transform(const VectorValues &y) { - VectorValues x = VectorValues::Zero(y); - this->backSubstitute(y, x); - axpy(1.0, *xt_, x); - return x; -} - -boost::tuple::shared_ptr> -SimpleSPCGSolver::splitGraph(const GaussianFactorGraph &gfg) { - - VariableIndex index(gfg); - size_t n = index.size(); - std::vector connected(n, false); - - GaussianFactorGraph::shared_ptr At(new GaussianFactorGraph()); - FactorGraph::shared_ptr Ac( new FactorGraph()); - - BOOST_FOREACH ( const GaussianFactor::shared_ptr &gf, gfg ) { - bool augment = false ; - - /* check whether this factor should be augmented to the "tree" graph */ - if ( gf->keys().size() == 1 ) augment = true; - else { - BOOST_FOREACH ( const Index key, *gf ) { - if ( connected[key] == false ) { - augment = true ; - } - connected[key] = true; - } - } - - if ( augment ) At->push_back(gf); - else Ac->push_back(boost::dynamic_pointer_cast(gf)); - } - - return boost::tie(At, Ac); -} - - - - - - -} diff --git a/gtsam/linear/SimpleSPCGSolver.h b/gtsam/linear/SimpleSPCGSolver.h deleted file mode 100644 index 994815fa4..000000000 --- a/gtsam/linear/SimpleSPCGSolver.h +++ /dev/null @@ -1,98 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 - - * -------------------------------------------------------------------------- */ - -#pragma once - -#include -#include -#include -#include -#include - -namespace gtsam { - -struct SimpleSPCGSolverParameters : public ConjugateGradientParameters { - typedef ConjugateGradientParameters Base; - SimpleSPCGSolverParameters() : Base() {} -}; - -/** - * This class gives a simple implementation to the SPCG solver presented in Dellaert et al in IROS'10. - * - * Given a linear least-squares problem \f$ f(x) = |A x - b|^2 \f$. We split the problem into - * \f$ f(x) = |A_t - b_t|^2 + |A_c - b_c|^2 \f$ where \f$ A_t \f$ denotes the "tree" part, and \f$ A_c \f$ denotes the "constraint" part. - * \f$ A_t \f$ is factorized into \f$ Q_t R_t \f$, and we compute \f$ c_t = Q_t^{-1} b_t \f$, and \f$ x_t = R_t^{-1} c_t \f$ accordingly. - * Then we solve a reparametrized problem \f$ f(y) = |y|^2 + |A_c R_t^{-1} y - \bar{b_y}|^2 \f$, where \f$ y = R_t(x - x_t) \f$, and \f$ \bar{b_y} = (b_c - A_c x_t) \f$ - * - * In the matrix form, it is equivalent to solving \f$ [A_c R_t^{-1} ; I ] y = [\bar{b_y} ; 0] \f$. We can solve it - * with the least-squares variation of the conjugate gradient method. - * - * Note: A full SPCG implementation will come up soon in the next release. - * - * \nosubgrouping - */ - -class SimpleSPCGSolver : public IterativeSolver { - -public: - - typedef IterativeSolver Base; - typedef SimpleSPCGSolverParameters Parameters; - typedef boost::shared_ptr shared_ptr; - -protected: - - size_t nVar_ ; ///< number of variables \f$ x \f$ - size_t nAc_ ; ///< number of factors in \f$ A_c \f$ - FactorGraph::shared_ptr Ac_; ///< the constrained part of the graph - GaussianBayesNet::shared_ptr Rt_; ///< the gaussian bayes net of the tree part of the graph - VectorValues::shared_ptr xt_; ///< the solution of the \f$ A_t^{-1} b_t \f$ - VectorValues::shared_ptr y0_; ///< a column zero vector - VectorValues::shared_ptr by_; ///< \f$ [\bar{b_y} ; 0 ] \f$ - VectorValues::shared_ptr tmpY_; ///< buffer for the column vectors - VectorValues::shared_ptr tmpB_; ///< buffer for the row vectors - Parameters parameters_; ///< Parameters for iterative method - -public: - - SimpleSPCGSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); - virtual ~SimpleSPCGSolver() {} - virtual VectorValues optimize () {return optimize(*y0_);} - -protected: - - VectorValues optimize (const VectorValues &initial); - - /** output = \f$ [\bar{b_y} ; 0 ] - [A_c R_t^{-1} ; I] \f$ input */ - void residual(const VectorValues &input, VectorValues &output); - - /** output = \f$ [A_c R_t^{-1} ; I] \f$ input */ - void multiply(const VectorValues &input, VectorValues &output); - - /** output = \f$ [R_t^{-T} A_c^T, I] \f$ input */ - void transposeMultiply(const VectorValues &input, VectorValues &output); - - /** output = \f$ R_t^{-1} \f$ input */ - void backSubstitute(const VectorValues &rhs, VectorValues &sol) ; - - /** output = \f$ R_t^{-T} \f$ input */ - void transposeBackSubstitute(const VectorValues &rhs, VectorValues &sol) ; - - /** return \f$ R_t^{-1} y + x_t \f$ */ - VectorValues transform(const VectorValues &y); - - /** naively split a gaussian factor graph into tree and constraint parts - * Note: This function has to be refined for your graph/application */ - boost::tuple::shared_ptr> - splitGraph(const GaussianFactorGraph &gfg); -}; - -} diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp index 91a98a263..b33adbc38 100644 --- a/gtsam/linear/SubgraphPreconditioner.cpp +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -26,9 +26,9 @@ using namespace std; namespace gtsam { /* ************************************************************************* */ - SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, + SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar) : - Ab1_(Ab1), Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(new Errors(-gaussianErrors(*Ab2_,*xbar))) { + Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(new Errors(-gaussianErrors(*Ab2_,*xbar))) { } /* ************************************************************************* */ diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h index 8c1fcc837..b109368af 100644 --- a/gtsam/linear/SubgraphPreconditioner.h +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -40,7 +40,7 @@ namespace gtsam { typedef boost::shared_ptr sharedErrors; private: - sharedFG Ab1_, Ab2_; + sharedFG Ab2_; sharedBayesNet Rc1_; sharedValues xbar_; ///< A1 \ b1 sharedErrors b2bar_; ///< A2*xbar - b2 @@ -51,16 +51,11 @@ namespace gtsam { /** * Constructor - * @param Ab1: the Graph A1*x=b1 * @param Ab2: the Graph A2*x=b2 * @param Rc1: the Bayes Net R1*x=c1 * @param xbar: the solution to R1*x=c1 */ - SubgraphPreconditioner(const sharedFG& Ab1, const sharedFG& Ab2, - const sharedBayesNet& Rc1, const sharedValues& xbar); - - /** Access Ab1 */ - const sharedFG& Ab1() const { return Ab1_; } + SubgraphPreconditioner(const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar); /** Access Ab2 */ const sharedFG& Ab2() const { return Ab2_; } diff --git a/gtsam/linear/SubgraphSolver-inl.h b/gtsam/linear/SubgraphSolver-inl.h deleted file mode 100644 index 28b2caaac..000000000 --- a/gtsam/linear/SubgraphSolver-inl.h +++ /dev/null @@ -1,80 +0,0 @@ -///* ---------------------------------------------------------------------------- -// -// * 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 -// -// * -------------------------------------------------------------------------- */ -// -//#pragma once -// -//#include -// -//#include -//#include -//#include -// -//namespace gtsam { -// -//template -//void SubgraphSolver::replaceFactors(const typename LINEAR::shared_ptr &graph) { -// -// GaussianFactorGraph::shared_ptr Ab1 = boost::make_shared(); -// GaussianFactorGraph::shared_ptr Ab2 = boost::make_shared(); -// -// if (parameters_->verbosity()) cout << "split the graph ..."; -// split(pairs_, *graph, *Ab1, *Ab2) ; -// if (parameters_->verbosity()) cout << ",with " << Ab1->size() << " and " << Ab2->size() << " factors" << endl; -// -// // // Add a HardConstraint to the root, otherwise the root will be singular -// // Key root = keys.back(); -// // T_.addHardConstraint(root, theta0[root]); -// // -// // // compose the approximate solution -// // theta_bar_ = composePoses (T_, tree, theta0[root]); -// -// LINEAR sacrificialAb1 = *Ab1; // duplicate !!!!! -// SubgraphPreconditioner::sharedBayesNet Rc1 = -// EliminationTree::Create(sacrificialAb1)->eliminate(&EliminateQR); -// SubgraphPreconditioner::sharedValues xbar = gtsam::optimize_(*Rc1); -// -// pc_ = boost::make_shared( -// Ab1->dynamicCastFactors >(), Ab2->dynamicCastFactors >(),Rc1,xbar); -//} -// -//template -//VectorValues::shared_ptr SubgraphSolver::optimize() const { -// -// // preconditioned conjugate gradient -// VectorValues zeros = pc_->zero(); -// VectorValues ybar = conjugateGradients -// (*pc_, zeros, *parameters_); -// -// boost::shared_ptr xbar = boost::make_shared() ; -// *xbar = pc_->x(ybar); -// return xbar; -//} -// -//template -//void SubgraphSolver::initialize(const GRAPH& G, const Values& theta0) { -// // generate spanning tree -// PredecessorMap tree_ = gtsam::findMinimumSpanningTree(G); -// -// // make the ordering -// list keys = predecessorMap2Keys(tree_); -// ordering_ = boost::make_shared(list(keys.begin(), keys.end())); -// -// // build factor pairs -// pairs_.clear(); -// typedef pair EG ; -// BOOST_FOREACH( const EG &eg, tree_ ) { -// Key key1 = Key(eg.first), -// key2 = Key(eg.second) ; -// pairs_.insert(pair((*ordering_)[key1], (*ordering_)[key2])) ; -// } -//} -// -//} // \namespace gtsam diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 9b37d9a4b..14a0cc174 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -19,103 +19,171 @@ #include #include #include - #include #include - #include using namespace std; namespace gtsam { +/**************************************************************************************************/ SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters) : parameters_(parameters) { + JacobianFactorGraph::shared_ptr jfg = dynamicCastFactors(gfg); + initialize(*jfg); +} +/**************************************************************************************************/ +SubgraphSolver::SubgraphSolver(const JacobianFactorGraph::shared_ptr &jfg, const Parameters ¶meters) + : parameters_(parameters) +{ + initialize(*jfg); +} - GaussianFactorGraph::shared_ptr Ab1 = boost::make_shared(); - GaussianFactorGraph::shared_ptr Ab2 = boost::make_shared(); +/**************************************************************************************************/ +SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &Ab1, const GaussianFactorGraph &Ab2, const Parameters ¶meters) + : parameters_(parameters) { - boost::tie(Ab1, Ab2) = splitGraph(gfg) ; + GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(Ab1)->eliminate(&EliminateQR); + JacobianFactorGraph::shared_ptr Ab2Jacobian = dynamicCastFactors(Ab2); + initialize(Rc1, Ab2Jacobian); +} - if (parameters_.verbosity()) - cout << ",with " << Ab1->size() << " and " << Ab2->size() << " factors" << endl; - - // // Add a HardConstraint to the root, otherwise the root will be singular - // Key root = keys.back(); - // T_.addHardConstraint(root, theta0[root]); - // - // // compose the approximate solution - // theta_bar_ = composePoses (T_, tree, theta0[root]); +/**************************************************************************************************/ +SubgraphSolver::SubgraphSolver(const JacobianFactorGraph::shared_ptr &Ab1, + const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters) + : parameters_(parameters) { GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(*Ab1)->eliminate(&EliminateQR); - VectorValues::shared_ptr xbar(new VectorValues(gtsam::optimize(*Rc1))); + initialize(Rc1, Ab2); +} - // Convert or cast Ab1 to JacobianFactors - boost::shared_ptr > Ab1Jacobians = boost::make_shared >(); - Ab1Jacobians->reserve(Ab1->size()); - BOOST_FOREACH(const boost::shared_ptr& factor, *Ab1) { - if(boost::shared_ptr jf = - boost::dynamic_pointer_cast(factor)) - Ab1Jacobians->push_back(jf); - else - Ab1Jacobians->push_back(boost::make_shared(*factor)); - } - - // Convert or cast Ab2 to JacobianFactors - boost::shared_ptr > Ab2Jacobians = boost::make_shared >(); - Ab1Jacobians->reserve(Ab2->size()); - BOOST_FOREACH(const boost::shared_ptr& factor, *Ab2) { - if(boost::shared_ptr jf = - boost::dynamic_pointer_cast(factor)) - Ab2Jacobians->push_back(jf); - else - Ab2Jacobians->push_back(boost::make_shared(*factor)); - } +/**************************************************************************************************/ +SubgraphSolver::SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, const GaussianFactorGraph &Ab2, + const Parameters ¶meters) : parameters_(parameters) +{ + JacobianFactorGraph::shared_ptr Ab2Jacobians = dynamicCastFactors(Ab2); + initialize(Rc1, Ab2Jacobians); +} - pc_ = boost::make_shared(Ab1Jacobians, Ab2Jacobians, Rc1, xbar); +/**************************************************************************************************/ +SubgraphSolver::SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, + const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters) : parameters_(parameters) +{ + initialize(Rc1, Ab2); } VectorValues SubgraphSolver::optimize() { - VectorValues ybar = conjugateGradients(*pc_, pc_->zero(), parameters_); return pc_->x(ybar); } -boost::tuple -SubgraphSolver::splitGraph(const GaussianFactorGraph &gfg) { +void SubgraphSolver::initialize(const JacobianFactorGraph &jfg) +{ + JacobianFactorGraph::shared_ptr Ab1 = boost::make_shared(), + Ab2 = boost::make_shared(); - VariableIndex index(gfg); - size_t n = index.size(); - std::vector connected(n, false); + boost::tie(Ab1, Ab2) = splitGraph(jfg) ; + if (parameters_.verbosity()) + cout << "Split A into (A1) " << Ab1->size() << " and (A2) " << Ab2->size() << " factors" << endl; - GaussianFactorGraph::shared_ptr At(new GaussianFactorGraph()); - GaussianFactorGraph::shared_ptr Ac( new GaussianFactorGraph()); + GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(*Ab1)->eliminate(&EliminateQR); + VectorValues::shared_ptr xbar(new VectorValues(gtsam::optimize(*Rc1))); + JacobianFactorGraph::shared_ptr Ab2Jacobians = convertToJacobianFactorGraph(*Ab2); + pc_ = boost::make_shared(Ab2Jacobians, Rc1, xbar); +} - BOOST_FOREACH ( const GaussianFactor::shared_ptr &gf, gfg ) { +void SubgraphSolver::initialize(const GaussianBayesNet::shared_ptr &Rc1, const JacobianFactorGraph::shared_ptr &Ab2) +{ + VectorValues::shared_ptr xbar(new VectorValues(gtsam::optimize(*Rc1))); + pc_ = boost::make_shared(Ab2, Rc1, xbar); +} + +boost::tuple +SubgraphSolver::splitGraph(const JacobianFactorGraph &jfg) { + + const VariableIndex index(jfg); + const size_t n = index.size(), m = jfg.size(); + DisjointSet D(n) ; + + JacobianFactorGraph::shared_ptr At(new JacobianFactorGraph()); + JacobianFactorGraph::shared_ptr Ac( new JacobianFactorGraph()); + + size_t t = 0; + BOOST_FOREACH ( const JacobianFactor::shared_ptr &jf, jfg ) { + + if ( jf->keys().size() > 2 ) { + throw runtime_error("SubgraphSolver::splitGraph the graph is not simple, sanity check failed "); + } bool augment = false ; /* check whether this factor should be augmented to the "tree" graph */ - if ( gf->keys().size() == 1 ) augment = true; + if ( jf->keys().size() == 1 ) augment = true; else { - BOOST_FOREACH ( const Index key, *gf ) { - if ( connected[key] == false ) { - augment = true ; - connected[key] = true; - } + const Index u = jf->keys()[0], v = jf->keys()[1], + u_root = D.find(u), v_root = D.find(v); + if ( u_root != v_root ) { + t++; augment = true ; + D.makeUnion(u_root, v_root); } } - - if ( augment ) At->push_back(gf); - else Ac->push_back(gf); + if ( augment ) At->push_back(jf); + else Ac->push_back(jf); } return boost::tie(At, Ac); } +SubgraphSolver::DisjointSet::DisjointSet(const size_t n):n_(n),rank_(n,1),parent_(n) { + for ( Index i = 0 ; i < n ; ++i ) parent_[i] = i ; +} + +Index SubgraphSolver::DisjointSet::makeUnion(const Index &u, const Index &v) { + + Index u_root = find(u), v_root = find(v) ; + Index u_rank = rank(u), v_rank = rank(v) ; + + if ( u_root != v_root ) { + if ( v_rank > u_rank ) { + parent_[u_root] = v_root ; + rank_[v_root] += rank_[u_root] ; + return v_root ; + } + else { + parent_[v_root] = u_root ; + rank_[u_root] += rank_[v_root] ; + return u_root ; + } + } + return u_root ; +} + +Index SubgraphSolver::DisjointSet::find(const Index &u) { + vector path ; + Index x = u; + Index x_root = parent_[x] ; + + // find the root, and keep the vertices along the path + while ( x != x_root ) { + path.push_back(x) ; + x = x_root ; + x_root = parent_[x] ; + } + + // path compression + BOOST_FOREACH(const Index &i, path) { + rank_[i] = 1 ; + parent_[i] = x_root ; + } + + return x_root ; +} + + } // \namespace gtsam diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index 60104bbe0..04b1cb127 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -13,7 +13,9 @@ #include #include +#include #include +#include #include @@ -25,31 +27,86 @@ public: SubgraphSolverParameters() : Base() {} }; + /** - * A linear system solver using subgraph preconditioning conjugate gradient + * This class implements the SPCG solver presented in Dellaert et al in IROS'10. + * + * Given a linear least-squares problem \f$ f(x) = |A x - b|^2 \f$. We split the problem into + * \f$ f(x) = |A_t - b_t|^2 + |A_c - b_c|^2 \f$ where \f$ A_t \f$ denotes the "tree" part, and \f$ A_c \f$ denotes the "constraint" part. + * \f$ A_t \f$ is factorized into \f$ Q_t R_t \f$, and we compute \f$ c_t = Q_t^{-1} b_t \f$, and \f$ x_t = R_t^{-1} c_t \f$ accordingly. + * Then we solve a reparametrized problem \f$ f(y) = |y|^2 + |A_c R_t^{-1} y - \bar{b_y}|^2 \f$, where \f$ y = R_t(x - x_t) \f$, and \f$ \bar{b_y} = (b_c - A_c x_t) \f$ + * + * In the matrix form, it is equivalent to solving \f$ [A_c R_t^{-1} ; I ] y = [\bar{b_y} ; 0] \f$. We can solve it + * with the least-squares variation of the conjugate gradient method. + * + * To use it in nonlinear optimization, please see the following example + * + * LevenbergMarquardtParams parameters; + * parameters.linearSolverType = SuccessiveLinearizationParams::CONJUGATE_GRADIENT; + * parameters.iterativeParams = boost::make_shared(); + * LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, parameters); + * Values result = optimizer.optimize(); + * + * \nosubgrouping */ class SubgraphSolver : public IterativeSolver { public: - typedef SubgraphSolverParameters Parameters; protected: - Parameters parameters_; SubgraphPreconditioner::shared_ptr pc_; ///< preconditioner object public: + /* Given a gaussian factor graph, split it into a spanning tree (A1) + others (A2) for SPCG */ + SubgraphSolver(const GaussianFactorGraph &A, const Parameters ¶meters); + SubgraphSolver(const JacobianFactorGraph::shared_ptr &A, const Parameters ¶meters); + + /* The user specify the subgraph part and the constraint part, may throw exception if A1 is underdetermined */ + SubgraphSolver(const GaussianFactorGraph &Ab1, const GaussianFactorGraph &Ab2, const Parameters ¶meters); + SubgraphSolver(const JacobianFactorGraph::shared_ptr &Ab1, const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters); + + /* The same as above, but the A1 is solved before */ + SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, const GaussianFactorGraph &Ab2, const Parameters ¶meters); + SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters); - SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters); virtual ~SubgraphSolver() {} virtual VectorValues optimize () ; protected: - boost::tuple - splitGraph(const GaussianFactorGraph &gfg) ; + void initialize(const JacobianFactorGraph &jfg); + void initialize(const GaussianBayesNet::shared_ptr &Rc1, const JacobianFactorGraph::shared_ptr &Ab2); + + boost::tuple + splitGraph(const JacobianFactorGraph &gfg) ; + +public: + + // a simplfied implementation of disjoint set data structure. + class DisjointSet { + protected: + size_t n_ ; + std::vector rank_ ; + std::vector parent_ ; + + public: + // initialize a disjoint set, point every vertex to itself + DisjointSet(const size_t n) ; + inline size_t size() const { return n_ ; } + + // union the root of u and and the root of v, return the root of u and v + Index makeUnion(const Index &u, const Index &v) ; + + // return the root of u + Index find(const Index &u) ; + + // return the rank of x, which is defined as the cardinality of the set containing x + inline size_t rank(const Index &x) {return rank_[find(x)] ;} + }; + }; } // namespace gtsam diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp index af3f70ddc..9d85f26fe 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -60,11 +59,7 @@ VectorValues solveGaussianFactorGraph(const GaussianFactorGraph &gfg, const Succ } else if ( params.isCG() ) { if ( !params.iterativeParams ) throw std::runtime_error("solveGaussianFactorGraph: cg parameter has to be assigned ..."); - if ( boost::dynamic_pointer_cast(params.iterativeParams)) { - SimpleSPCGSolver solver (gfg, *boost::dynamic_pointer_cast(params.iterativeParams)); - delta = solver.optimize(); - } - else if ( boost::dynamic_pointer_cast(params.iterativeParams) ) { + if ( boost::dynamic_pointer_cast(params.iterativeParams) ) { SubgraphSolver solver (gfg, *boost::dynamic_pointer_cast(params.iterativeParams)); delta = solver.optimize(); } diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index 60f737d67..b0a008478 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -120,7 +120,7 @@ TEST( SubgraphPreconditioner, system ) // Create Subgraph-preconditioned system VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible - SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); + SubgraphPreconditioner system(Ab2, Rc1, xbarShared); // Create zero config VectorValues zeros = VectorValues::Zero(xbar); @@ -197,7 +197,7 @@ TEST( SubgraphPreconditioner, conjugateGradients ) // Create Subgraph-preconditioned system VectorValues::shared_ptr xbarShared(new VectorValues(xbar)); // TODO: horrible - SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbarShared); + SubgraphPreconditioner system(Ab2, Rc1, xbarShared); // Create zero config y0 and perturbed config y1 VectorValues y0 = VectorValues::Zero(xbar); diff --git a/tests/testSubgraphSolver.cpp b/tests/testSubgraphSolver.cpp new file mode 100644 index 000000000..04e0554e5 --- /dev/null +++ b/tests/testSubgraphSolver.cpp @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------------- + + * 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 testSubgraphSolver.cpp + * @brief Unit tests for SubgraphSolver + * @author Yong-Dian Jian + **/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +using namespace boost::assign; + +using namespace std; +using namespace gtsam; +using namespace example; + +/* ************************************************************************* */ +/** unnormalized error */ +double error(const JacobianFactorGraph& fg, const VectorValues& x) { + double total_error = 0.; + BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) + total_error += factor->error(x); + return total_error; +} + + +/* ************************************************************************* */ +TEST( SubgraphSolver, constructor1 ) +{ + // Build a planar graph + JacobianFactorGraph Ab; + VectorValues xtrue; + size_t N = 3; + boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + + SubgraphSolverParameters parameters; + SubgraphSolver solver(Ab, parameters); + VectorValues optimized = solver.optimize(); + DOUBLES_EQUAL(0.0, error(Ab, optimized), 1e-5); +} + +/* ************************************************************************* */ +TEST( SubgraphSolver, constructor2 ) +{ + // Build a planar graph + JacobianFactorGraph Ab; + VectorValues xtrue; + size_t N = 3; + boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + + // Get the spanning tree and corresponding ordering + JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); + + SubgraphSolverParameters parameters; + SubgraphSolver solver(Ab1_, Ab2_, parameters); + VectorValues optimized = solver.optimize(); + DOUBLES_EQUAL(0.0, error(Ab, optimized), 1e-5); +} + +/* ************************************************************************* */ +TEST( SubgraphSolver, constructor3 ) +{ + // Build a planar graph + JacobianFactorGraph Ab; + VectorValues xtrue; + size_t N = 3; + boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + + // Get the spanning tree and corresponding ordering + JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); + + GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(Ab1_)->eliminate(&EliminateQR); + + SubgraphSolverParameters parameters; + SubgraphSolver solver(Rc1, Ab2_, parameters); + VectorValues optimized = solver.optimize(); + DOUBLES_EQUAL(0.0, error(Ab, optimized), 1e-5); +} + +/* ************************************************************************* */ +int main() { TestResult tr; return TestRegistry::runAllTests(tr); } +/* ************************************************************************* */ From 82fd3982c3e4c6d726e225cc7b527fdca8f3a9b1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Mon, 3 Sep 2012 20:23:02 +0000 Subject: [PATCH 871/914] Ignore .dot file From e9eb96a40855258b4cc2c06308f363cca244748e Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Mon, 3 Sep 2012 21:50:22 +0000 Subject: [PATCH 872/914] wrap iterative solver, subgraph solver, etc. fix the matlab spcg example --- gtsam.h | 41 +++++++++++++++ gtsam/linear/ConjugateGradientSolver.h | 32 ++++++------ gtsam/linear/IterativeSolver.cpp | 50 +++++++++++++++++++ gtsam/linear/IterativeSolver.h | 17 +++++-- gtsam/linear/SubgraphSolver.h | 2 +- .../SuccessiveLinearizationOptimizer.cpp | 4 ++ .../SuccessiveLinearizationOptimizer.h | 3 +- matlab/gtsam_examples/Pose2SLAMwSPCG.m | 15 ++++-- 8 files changed, 138 insertions(+), 26 deletions(-) create mode 100644 gtsam/linear/IterativeSolver.cpp diff --git a/gtsam.h b/gtsam.h index 4aa1480df..5b21f726f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1045,6 +1045,46 @@ class GaussianSequentialSolver { Matrix marginalCovariance(size_t j) const; }; +#include +virtual class IterativeOptimizationParameters { + string getKernel() const ; + string getVerbosity() const; + void setKernel(string s) ; + void setVerbosity(string s) ; +}; + +//virtual class IterativeSolver { +// IterativeSolver(); +// gtsam::VectorValues optimize (); +//}; + +#include +virtual class ConjugateGradientParameters : gtsam::IterativeOptimizationParameters { + ConjugateGradientParameters(); + size_t getMinIterations() const ; + size_t getMaxIterations() const ; + size_t getReset() const; + double getEpsilon_rel() const; + double getEpsilon_abs() const; + + void setMinIterations(size_t value); + void setMaxIterations(size_t value); + void setReset(size_t value); + void setEpsilon_rel(double value); + void setEpsilon_abs(double value); +}; + +#include +virtual class SubgraphSolverParameters : gtsam::ConjugateGradientParameters { + SubgraphSolverParameters(); + void print(string s) const; +}; + +class SubgraphSolver { + SubgraphSolver(const gtsam::GaussianFactorGraph &A, const gtsam::SubgraphSolverParameters ¶meters); + gtsam::VectorValues optimize() const; +}; + #include class KalmanFilter { KalmanFilter(size_t n); @@ -1288,6 +1328,7 @@ virtual class SuccessiveLinearizationParams : gtsam::NonlinearOptimizerParams { void setLinearSolverType(string solver); void setOrdering(const gtsam::Ordering& ordering); + void setIterativeParams(const gtsam::SubgraphSolverParameters ¶ms); bool isMultifrontal() const; bool isSequential() const; diff --git a/gtsam/linear/ConjugateGradientSolver.h b/gtsam/linear/ConjugateGradientSolver.h index cf1d31d85..a89d7a10c 100644 --- a/gtsam/linear/ConjugateGradientSolver.h +++ b/gtsam/linear/ConjugateGradientSolver.h @@ -20,9 +20,7 @@ namespace gtsam { */ class ConjugateGradientParameters : public IterativeOptimizationParameters { - public: - typedef IterativeOptimizationParameters Base; typedef boost::shared_ptr shared_ptr; @@ -49,7 +47,21 @@ public: inline double epsilon_rel() const { return epsilon_rel_; } inline double epsilon_abs() const { return epsilon_abs_; } - void print() const { + inline size_t getMinIterations() const { return minIterations_; } + inline size_t getMaxIterations() const { return maxIterations_; } + inline size_t getReset() const { return reset_; } + inline double getEpsilon() const { return epsilon_rel_; } + inline double getEpsilon_rel() const { return epsilon_rel_; } + inline double getEpsilon_abs() const { return epsilon_abs_; } + + inline void setMinIterations(size_t value) { minIterations_ = value; } + inline void setMaxIterations(size_t value) { maxIterations_ = value; } + inline void setReset(size_t value) { reset_ = value; } + inline void setEpsilon(double value) { epsilon_rel_ = value; } + inline void setEpsilon_rel(double value) { epsilon_rel_ = value; } + inline void setEpsilon_abs(double value) { epsilon_abs_ = value; } + + virtual void print(const std::string &s="") const { Base::print(); std::cout << "ConjugateGradientParameters: " << "minIter = " << minIterations_ @@ -61,18 +73,4 @@ public: } }; -//class ConjugateGradientSolver : public IterativeSolver { -// -//public: -// -// typedef ConjugateGradientParameters Parameters; -// -// Parameters parameters_; -// -// ConjugateGradientSolver(const ConjugateGradientParameters ¶meters) : parameters_(parameters) {} -// virtual VectorValues::shared_ptr optimize () = 0; -// virtual const IterativeOptimizationParameters& _params() const = 0; -//}; - - } diff --git a/gtsam/linear/IterativeSolver.cpp b/gtsam/linear/IterativeSolver.cpp new file mode 100644 index 000000000..2bba3e12b --- /dev/null +++ b/gtsam/linear/IterativeSolver.cpp @@ -0,0 +1,50 @@ +/** + * @file IterativeSolver.cpp + * @brief + * @date Sep 3, 2012 + * @author Yong-Dian Jian + */ + +#include +#include +#include + +namespace gtsam { + +std::string IterativeOptimizationParameters::getKernel() const { return kernelTranslator(kernel_); } +std::string IterativeOptimizationParameters::getVerbosity() const { return verbosityTranslator(verbosity_); } +void IterativeOptimizationParameters::setKernel(const std::string &src) { kernel_ = kernelTranslator(src); } +void IterativeOptimizationParameters::setVerbosity(const std::string &src) { verbosity_ = verbosityTranslator(src); } + +IterativeOptimizationParameters::Kernel IterativeOptimizationParameters::kernelTranslator(const std::string &src) { + std::string s = src; boost::algorithm::to_upper(s); + if (s == "CG") return IterativeOptimizationParameters::CG; + /* default is cg */ + else return IterativeOptimizationParameters::CG; +} + +IterativeOptimizationParameters::Verbosity IterativeOptimizationParameters::verbosityTranslator(const std::string &src) { + std::string s = src; boost::algorithm::to_upper(s); + if (s == "SILENT") return IterativeOptimizationParameters::SILENT; + else if (s == "COMPLEXITY") return IterativeOptimizationParameters::COMPLEXITY; + else if (s == "ERROR") return IterativeOptimizationParameters::ERROR; + /* default is default */ + else return IterativeOptimizationParameters::SILENT; +} + +std::string IterativeOptimizationParameters::kernelTranslator(IterativeOptimizationParameters::Kernel k) { + if ( k == CG ) return "CG"; + else return "UNKNOWN"; +} + +std::string IterativeOptimizationParameters::verbosityTranslator(IterativeOptimizationParameters::Verbosity verbosity) { + if (verbosity == SILENT) return "SILENT"; + else if (verbosity == COMPLEXITY) return "COMPLEXITY"; + else if (verbosity == ERROR) return "ERROR"; + else return "UNKNOWN"; +} + + +} + + diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 8292b3831..2f76df2b7 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -13,6 +13,7 @@ #include #include +#include namespace gtsam { @@ -41,22 +42,32 @@ namespace gtsam { inline Kernel kernel() const { return kernel_; } inline Verbosity verbosity() const { return verbosity_; } + /* matlab interface */ + std::string getKernel() const ; + std::string getVerbosity() const; + void setKernel(const std::string &s) ; + void setVerbosity(const std::string &s) ; + void print() const { const std::string kernelStr[1] = {"cg"}; std::cout << "IterativeOptimizationParameters: " << "kernel = " << kernelStr[kernel_] << ", verbosity = " << verbosity_ << std::endl; } + + static Kernel kernelTranslator(const std::string &s); + static Verbosity verbosityTranslator(const std::string &s); + static std::string kernelTranslator(Kernel k); + static std::string verbosityTranslator(Verbosity v); }; class IterativeSolver { public: typedef boost::shared_ptr shared_ptr; - IterativeSolver(){} + IterativeSolver() {} virtual ~IterativeSolver() {} - /* update interface to the nonlinear optimizer */ - virtual void replaceFactors(const GaussianFactorGraph::shared_ptr &factorGraph, const double lambda) {} + /* interface to the nonlinear optimizer */ virtual VectorValues optimize () = 0; }; diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index 04b1cb127..e4d99933b 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -25,9 +25,9 @@ class SubgraphSolverParameters : public ConjugateGradientParameters { public: typedef ConjugateGradientParameters Base; SubgraphSolverParameters() : Base() {} + virtual void print(const std::string &s="") const { Base::print(s); } }; - /** * This class implements the SPCG solver presented in Dellaert et al in IROS'10. * diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp index 9d85f26fe..fec460b08 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.cpp @@ -15,6 +15,10 @@ namespace gtsam { +void SuccessiveLinearizationParams::setIterativeParams(const SubgraphSolverParameters ¶ms) { + iterativeParams = boost::make_shared(params); +} + void SuccessiveLinearizationParams::print(const std::string& str) const { NonlinearOptimizerParams::print(str); switch ( linearSolverType ) { diff --git a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h index e79a364c5..d422c09a9 100644 --- a/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h +++ b/gtsam/nonlinear/SuccessiveLinearizationOptimizer.h @@ -19,7 +19,7 @@ #pragma once #include -#include +#include namespace gtsam { @@ -74,6 +74,7 @@ public: std::string getLinearSolverType() const { return linearSolverTranslator(linearSolverType); } void setLinearSolverType(const std::string& solver) { linearSolverType = linearSolverTranslator(solver); } + void setIterativeParams(const SubgraphSolverParameters ¶ms); void setOrdering(const Ordering& ordering) { this->ordering = ordering; } private: diff --git a/matlab/gtsam_examples/Pose2SLAMwSPCG.m b/matlab/gtsam_examples/Pose2SLAMwSPCG.m index a45ac40a0..67f22fe1d 100644 --- a/matlab/gtsam_examples/Pose2SLAMwSPCG.m +++ b/matlab/gtsam_examples/Pose2SLAMwSPCG.m @@ -51,7 +51,14 @@ initialEstimate.insert(4, Pose2(4.0, 2.0, pi )); initialEstimate.insert(5, Pose2(2.1, 2.1,-pi/2)); initialEstimate.print(sprintf('\nInitial estimate:\n')); -%% Optimize using Levenberg-Marquardt optimization with an ordering from colamd -optimizer = DoglegOptimizer(graph, initialEstimate); -result = optimizer.optimizeSafely(); -result.print(sprintf('\nFinal result:\n')); \ No newline at end of file +%% Optimize using Levenberg-Marquardt optimization with SubgraphSolver +params = gtsam.LevenbergMarquardtParams; +subgraphParams = gtsam.SubgraphSolverParameters; +params.setLinearSolverType('CONJUGATE_GRADIENT'); +params.setIterativeParams(subgraphParams); +optimizer = gtsam.LevenbergMarquardtOptimizer(graph, initialEstimate); +result = optimizer.optimize(); +result.print(sprintf('\nFinal result:\n')); + + + From 947588586c164b13e93f17eed831a32dc0102b4d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 3 Sep 2012 22:11:09 +0000 Subject: [PATCH 873/914] Updated README to mention windows and MSVC --- README | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README b/README index 8e74f61e4..d7486c8b8 100644 --- a/README +++ b/README @@ -59,10 +59,12 @@ Tested compilers - GCC 4.2-4.7 - Clang 2.9-3.2 - OSX GCC 4.2 + - MSVC 2010, 2012 Tested systems: - Ubuntu 11.04, 11.10, 12.04 - MacOS 10.6, 10.7 + - Windows 7 2) GTSAM makes extensive use of debug assertions, and we highly recommend you work From 9938b4785d72b24a55ef18b4aa0472a4d07e90ba Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Mon, 3 Sep 2012 22:48:08 +0000 Subject: [PATCH 874/914] Changed method summaries to lower case --- wrap/Class.cpp | 6 +-- wrap/tests/expected/Point2.m | 18 ++++---- wrap/tests/expected/Point3.m | 8 ++-- wrap/tests/expected/Test.m | 42 +++++++++---------- wrap/tests/expected_namespaces/+ns1/ClassA.m | 2 +- wrap/tests/expected_namespaces/+ns1/ClassB.m | 2 +- .../expected_namespaces/+ns2/+ns3/ClassB.m | 2 +- wrap/tests/expected_namespaces/+ns2/ClassA.m | 10 ++--- wrap/tests/expected_namespaces/+ns2/ClassC.m | 2 +- wrap/tests/expected_namespaces/ClassD.m | 2 +- 10 files changed, 47 insertions(+), 47 deletions(-) diff --git a/wrap/Class.cpp b/wrap/Class.cpp index c5c306ce6..374324558 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -332,7 +332,7 @@ void Class::comment_fragment(FileWriter& proxyFile) const { string up_name = boost::to_upper_copy(name); - proxyFile.oss << "%" << up_name << "("; + proxyFile.oss << "%" << name << "("; unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { @@ -352,7 +352,7 @@ void Class::comment_fragment(FileWriter& proxyFile) const BOOST_FOREACH(ArgumentList argList, m.argLists) { string up_name = boost::to_upper_copy(m.name); - proxyFile.oss << "%" << up_name << "("; + proxyFile.oss << "%" << m.name << "("; unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { @@ -373,7 +373,7 @@ void Class::comment_fragment(FileWriter& proxyFile) const BOOST_FOREACH(ArgumentList argList, m.argLists) { string up_name = boost::to_upper_copy(m.name); - proxyFile.oss << "%" << up_name << "("; + proxyFile.oss << "%" << m.name << "("; unsigned int i = 0; BOOST_FOREACH(const Argument& arg, argList) { diff --git a/wrap/tests/expected/Point2.m b/wrap/tests/expected/Point2.m index 913a869b5..d1c336c5f 100644 --- a/wrap/tests/expected/Point2.m +++ b/wrap/tests/expected/Point2.m @@ -1,15 +1,15 @@ %-------Constructors------- -%POINT2() -%POINT2(double x, double y) +%Point2() +%Point2(double x, double y) % %-------Methods------- -%ARGCHAR(char a) : returns void -%ARGUCHAR(unsigned char a) : returns void -%DIM() : returns int -%RETURNCHAR() : returns char -%VECTORCONFUSION() : returns VectorNotEigen -%X() : returns double -%Y() : returns double +%argChar(char a) : returns void +%argUChar(unsigned char a) : returns void +%dim() : returns int +%returnChar() : returns char +%vectorConfusion() : returns VectorNotEigen +%x() : returns double +%y() : returns double % %-------Static Methods------- % diff --git a/wrap/tests/expected/Point3.m b/wrap/tests/expected/Point3.m index 965815dc6..f73b740ac 100644 --- a/wrap/tests/expected/Point3.m +++ b/wrap/tests/expected/Point3.m @@ -1,12 +1,12 @@ %-------Constructors------- -%POINT3(double x, double y, double z) +%Point3(double x, double y, double z) % %-------Methods------- -%NORM() : returns double +%norm() : returns double % %-------Static Methods------- -%STATICFUNCTIONRET(double z) : returns Point3 -%STATICFUNCTION() : returns double +%StaticFunctionRet(double z) : returns Point3 +%staticFunction() : returns double % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Point3 < handle diff --git a/wrap/tests/expected/Test.m b/wrap/tests/expected/Test.m index d39025971..1e07974ee 100644 --- a/wrap/tests/expected/Test.m +++ b/wrap/tests/expected/Test.m @@ -1,27 +1,27 @@ %-------Constructors------- -%TEST() -%TEST(double a, Matrix b) +%Test() +%Test(double a, Matrix b) % %-------Methods------- -%ARG_EIGENCONSTREF(Matrix value) : returns void -%CREATE_MIXEDPTRS() : returns pair< Test, SharedTest > -%CREATE_PTRS() : returns pair< SharedTest, SharedTest > -%PRINT() : returns void -%RETURN_POINT2PTR(bool value) : returns Point2 -%RETURN_TEST(Test value) : returns Test -%RETURN_TESTPTR(Test value) : returns Test -%RETURN_BOOL(bool value) : returns bool -%RETURN_DOUBLE(double value) : returns double -%RETURN_FIELD(Test t) : returns bool -%RETURN_INT(int value) : returns int -%RETURN_MATRIX1(Matrix value) : returns Matrix -%RETURN_MATRIX2(Matrix value) : returns Matrix -%RETURN_PAIR(Vector v, Matrix A) : returns pair< Vector, Matrix > -%RETURN_PTRS(Test p1, Test p2) : returns pair< SharedTest, SharedTest > -%RETURN_SIZE_T(size_t value) : returns size_t -%RETURN_STRING(string value) : returns string -%RETURN_VECTOR1(Vector value) : returns Vector -%RETURN_VECTOR2(Vector value) : returns Vector +%arg_EigenConstRef(Matrix value) : returns void +%create_MixedPtrs() : returns pair< Test, SharedTest > +%create_ptrs() : returns pair< SharedTest, SharedTest > +%print() : returns void +%return_Point2Ptr(bool value) : returns Point2 +%return_Test(Test value) : returns Test +%return_TestPtr(Test value) : returns Test +%return_bool(bool value) : returns bool +%return_double(double value) : returns double +%return_field(Test t) : returns bool +%return_int(int value) : returns int +%return_matrix1(Matrix value) : returns Matrix +%return_matrix2(Matrix value) : returns Matrix +%return_pair(Vector v, Matrix A) : returns pair< Vector, Matrix > +%return_ptrs(Test p1, Test p2) : returns pair< SharedTest, SharedTest > +%return_size_t(size_t value) : returns size_t +%return_string(string value) : returns string +%return_vector1(Vector value) : returns Vector +%return_vector2(Vector value) : returns Vector % %-------Static Methods------- % diff --git a/wrap/tests/expected_namespaces/+ns1/ClassA.m b/wrap/tests/expected_namespaces/+ns1/ClassA.m index 2ce280041..ee87c12d7 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassA.m @@ -1,5 +1,5 @@ %-------Constructors------- -%CLASSA() +%ClassA() % %-------Methods------- % diff --git a/wrap/tests/expected_namespaces/+ns1/ClassB.m b/wrap/tests/expected_namespaces/+ns1/ClassB.m index 5c4d82882..7f393f03e 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassB.m @@ -1,5 +1,5 @@ %-------Constructors------- -%CLASSB() +%ClassB() % %-------Methods------- % diff --git a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m index ff5ed9e3c..4ad4a14f0 100644 --- a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m @@ -1,5 +1,5 @@ %-------Constructors------- -%CLASSB() +%ClassB() % %-------Methods------- % diff --git a/wrap/tests/expected_namespaces/+ns2/ClassA.m b/wrap/tests/expected_namespaces/+ns2/ClassA.m index d8f1dbc88..c56377c2a 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassA.m @@ -1,13 +1,13 @@ %-------Constructors------- -%CLASSA() +%ClassA() % %-------Methods------- -%MEMBERFUNCTION() : returns double -%NSARG(ClassB arg) : returns int -%NSRETURN(double q) : returns ns2::ns3::ClassB +%memberFunction() : returns double +%nsArg(ClassB arg) : returns int +%nsReturn(double q) : returns ns2::ns3::ClassB % %-------Static Methods------- -%AFUNCTION() : returns double +%afunction() : returns double % %For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassA < handle diff --git a/wrap/tests/expected_namespaces/+ns2/ClassC.m b/wrap/tests/expected_namespaces/+ns2/ClassC.m index 86cf9819f..050ef19f4 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassC.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassC.m @@ -1,5 +1,5 @@ %-------Constructors------- -%CLASSC() +%ClassC() % %-------Methods------- % diff --git a/wrap/tests/expected_namespaces/ClassD.m b/wrap/tests/expected_namespaces/ClassD.m index 13bac35d6..41e9e63ec 100644 --- a/wrap/tests/expected_namespaces/ClassD.m +++ b/wrap/tests/expected_namespaces/ClassD.m @@ -1,5 +1,5 @@ %-------Constructors------- -%CLASSD() +%ClassD() % %-------Methods------- % From 403c6e39ad497bc44e627df9cfda99ddf28c949b Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 3 Sep 2012 23:24:37 +0000 Subject: [PATCH 875/914] Fixes to script to build self-contained matlab toolbox packages --- package_scripts/toolbox_package_unix.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package_scripts/toolbox_package_unix.sh b/package_scripts/toolbox_package_unix.sh index 44d0dac87..b78649e15 100755 --- a/package_scripts/toolbox_package_unix.sh +++ b/package_scripts/toolbox_package_unix.sh @@ -2,7 +2,7 @@ # Detect platform os=`uname -s` -arch=`uname -p` +arch=`uname -m` if [ "$os" = "Linux" -a "$arch" = "x86_64" ]; then platform=lin64 elif [ "$os" = "Linux" -a "$arch" = "i686" ]; then @@ -37,7 +37,7 @@ if [ ! $? ]; then fi # Compile -make -j4 install +make install # Create package tar czf gtsam-toolbox-2.1.0-$platform.tgz -C stage/borg toolbox From 2b4c0e1b140fba0932be461248f78a98af6c0a2c Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 4 Sep 2012 04:17:55 +0000 Subject: [PATCH 876/914] add printStats() and wrap saveGraph for ISAM2 --- gtsam.h | 2 ++ gtsam/nonlinear/ISAM2.h | 3 +++ 2 files changed, 5 insertions(+) diff --git a/gtsam.h b/gtsam.h index 5b21f726f..c5560668f 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1484,6 +1484,8 @@ class ISAM2 { bool equals(const gtsam::ISAM2& other, double tol) const; void print(string s) const; + void printStats() const; + void saveGraph(string s) const; gtsam::ISAM2Result update(); gtsam::ISAM2Result update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta); diff --git a/gtsam/nonlinear/ISAM2.h b/gtsam/nonlinear/ISAM2.h index deb2fc9d1..1cea78837 100644 --- a/gtsam/nonlinear/ISAM2.h +++ b/gtsam/nonlinear/ISAM2.h @@ -598,6 +598,9 @@ public: const ISAM2Params& params() const { return params_; } + /** prints out clique statistics */ + void printStats() const { getCliqueData().getStats().print(); } + //@} private: From 0f6ffcd4b202bf31b5a8ccd6da37ee3cf3844b5f Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 4 Sep 2012 04:19:47 +0000 Subject: [PATCH 877/914] add tooltips for VisualISAM_gui in matlab. Known bug: Figure won't update when run with "Save Figures" enabled. --- matlab/gtsam_examples/VisualISAM_gui.fig | Bin 10226 -> 10852 bytes matlab/gtsam_examples/VisualISAM_gui.m | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/gtsam_examples/VisualISAM_gui.fig b/matlab/gtsam_examples/VisualISAM_gui.fig index 3c8adb46c296faf06bd0e8ef5980bcbba3e68784..d4d65f56556bc11852652d2ea7f90ae7ba9a1b5b 100644 GIT binary patch delta 10437 zcmV;$C_2~jPvlgPA1qBlLrFF?EFeR2Wnpw>WFT*DIv`DNZXi=-a3CNvATl#LGdMak zI3O}GF*1=+BavVRf2k+{000000003=O%DJ703j#<0C=428BK2-HPqRpNk7u?)kB3; z6hIs}z^12gKo1{sF6udLuS*zah$m0pwoO(fO`45%2QE@@`qfG^JUfkAXz2W#>WKcegoiydOj{1ulq=;s6x*nG2t`nBgQcbfL+DJVaOBQz(+QQ zB`do!6FLqR#M9nr6e^tH!RY#MUd z=rQ5@1lv&RjrmK^1z8~dY=QmP`8Y_gv!v}RWYFe_e+5lF1+f2m_k;9$pBC-MA0+&B z&cssR*x=s!tPFjPPXBrM=3I<_QuwCA+Y0}x@GXV!D7>TaU4`!{d|%-Q3hyfXr@{{v ze)NpthlZWI#ysvD^VIY16`uP)ZC9uM*M87`(SFi?(|*)`)qd7~?-ic=KgLhX|4$EO z+}H&Bf5)?Fkd9}P&dU%Qz*6dk(b9_z#$=dF2Zk_ZsuJcz}h<6gf*X_ATPpi z2uZOtF~9DH_+63s=<&x67{5O?em|g57L=(9u-azZs_$h}j_9|5Mr6Nmb*ik7oLj=J<=hG~eTtnMNK_iQeOWw@<>X{ba05BAo`@*<$5VyDLF=I*Ydscn zo%u`GfvcdopX8)Bk*v71@`?IVk>y*oPh> z?aartD<}Ttp0M1|6CQ84OSu=ilsnO-f80Qqa-d7OlNoZI#H+`B4x0Ar82Epc1E9Tp zY0~hkqn$)BYjFQqT!f95C+ zP|*tzZ?INdm94e1F14~UF6LS;@4(^S({+;{-}_m>@Qii$+Vxx4u8&yD5@tS$aX4dj zd;b^1PNQz!&5!>wy!b|2`F6|x3^{G*98B7g6I5ScU*wlt`^XJt*nb1;1&@q6`hiim zZyV2d_ULcY+s6HX3FbH&w$F9@f8IX$N5Y$3*Hvde`{SeUUwg+2Z(CoUu2{PjTl?9Cxmcbmsq4ivGAiGwwu@!Q@YhT+?MV^ql5VpAl!kG!A?Mf9t95MKg|z z%)T>B)UHvqO31Dh4Nh#!ge*}Fp7}v4Bbr6LiwL{bW;g={%J7!pLoz|I>xsgUgE{P> z60fJmki3i7;nf6h9x_pmr{|jyq`@NP(BzdkYgE!2(J^IKiZ7e0`kCq&kg^xjyV!?mJklQ6Mo)-rgP zGI&!Nyon5+q8E`TawoM;Qw00Iv6^^&3ffiVnERodbHNdl?)HAof2Y`!FK#dO=wZYk zbG&~600960>{m~3(=ZfwyLDn5rh$;yfg5L}T@Y|;yLO`$8=BUw1B8UUG$L#b=B}r8-EtQ15AQAS>6i?egWMX6L;EtXAM5EgL0O970tMf6yB6I z?!w4FC@S4#VR_+Ur}6+DW{Lx$^t=r%%l?{5@TQQ2f47;}d525MyXoJj9dGf7 zcrSvNHqVkZPwl@7A%rpGo+Q6~clTV^vzXu&5oiAo@1%K|X#EQjuW0e?{a8{F-88;# zTObIgWDndbV_afMIBVY<^m~9N>-W0xb-M~4Ft^Ee^|`A%jm5h^VZYamuiK`>S)Bwv z#l4p7Q9!YNfB&U*&Ut6gJL()d>-$Yxyq&bpQumKM#eF}IzJIA`{=2!!_Q?(7KUWjp zVnhZgX)Byb8(+fCOHc5SxiwC?=ws2Z$jqL5jJu;Phn8Ir?01(14q%PD5a+g=7BYyX z$~+1dmKeZbEpY*ie_ACB5{HB`jcpTGc4F8X79L?J zVe32~v16-m8|HkBV=XBN^OD@AE){(N{esb08-%WYW6`PHhpN_Kb^eB}IKxhB0kniDrfuq;ZCbklwY%2g!#}db}s_#>k1Ks23uYR;N`E5K|CEX@-Xc+ru zo{qtujlpVTu<97h_#5hy0%6vvMv3oRt4Uteu+st8{vNWN3$B`U*1FW^gz1fY8oilT zx5v-PV&6O8x;@v$xh}qJy7=>r_a95YewHh@e|}@)e)@VDb@8M;2m84mJ|;i89?tb} zu7`8pW!A&T-D}$ZsviC^(8K$=9?tbJ%Js0eTo31ZIM>4$r-%Ol00960>{vl>8$}cz zJ5JPAN}D1CK?1Q7LP?}R(q0H$YR73CizKb$G%Xdv8t;znA>)~4cQ(O2^~jN9kG*r_ ze}u%L2a3eG;)H~n9{^It6(pG1o%QaHZFap$poKhXHT$0Ty?OIy-kbNi1Ol2A&l&L) z#51KvNi&K!5#`7M;JkQWRxZlK;#@9vU)lmiV$(>qPgnn9wT%M*ll{ zS>rO+{ud&>qNb`e~4N& z+G0-EHyZQzi!tq9RJ>l^QqqP>y4^I$9=y^ijQf2l@flH zr(c)-JUKsJp1iF1kHvy-QOsSCq-%_FUA_vCwjxUSeB2qcG z1-t!}16Qp!(!agxKo@N?3&nMJe`}f~@TEfA1ZlFw1WHyHfFJ!oz$(#R?&8l z-!LlLMGnVi+&d9_PxKmejUCWyW@xnPAjna~OIkw&>9SSN?N!XAH|vmEe+2Df7dJ7% zyywdhv3Hn_%@0wp{~hK#$c+Ur^x5%jj+^~>)y2I26zd|^B#3u-U%==yumiOK2)gAW zXAN=~msM<=h!{wV{hxeqN%Cym*}&ZzHHjBHGan6+-5nyU4v|%c$P~XVE-B=weX0^{ z+uCm8MirVJWa;N2PhGIYf1>mDr8dJ`1s6WQbcx|28h}V#|_c`V<$R;^I?We2RyG1I`^rV)N(5*M|YV{$Xmoe4A1HeK3fxtB{bUz|tYF<5nF% z=(ur*F~YIk7wcF_$5>h7cutF>qUaIW zbQn|c(?zy$i1+_Pe{cmf77#t$X3+Ae4?!CpAKd!$-%MHeo7%c1zZ46oyR=!^*{G~G zwl6PVy3~9Z+IFt~bqVC_d&^4CD2^A$a6ji`aRGq$Y<0?7IIQ~z%-M5oXa@0mkm4WG z;w5>v_4aakzH_7bDKhyY+85g*;p>9H>mDSvdS$cG_VE0ie?X(IXBXM@+Diy*o01(3hat^XWtUp zc<5$l*qu!pPC1fWkAM`ZXKwHp^iXba4+s8(BEb;}1oOPR@p!z|u75PHke{^L{nk65 zXWqQ`zPI+e5Dv46WZc~(lAtQtL%O}G4oe-g>X=hUKDs{>;hZ`yMQ5-=gzXmbh%Kq- zcX%F8e|LBa2|PKC2cF;6o}Ws2en!o#5Mh|_K9LTodz{PgbDs(|A;~=yV^=blI`KN2 zfop>kYAxb69NPZ=`zh;w&saC$WzC`f^45Cwv-OSI&h?em)%u4-h&Jy^3U989H;0xZ zfAl-fipE`?>d%kyewH-9AS90jjeNzN=<1Mre-C{@?9gA2Q|7m8_zSS#{9wf@wYKYD zP+Kn11GOy;6^Dxtm>&@5Ze@L|wimEc(U(+g1X8LUDig=46Z>Itsb|=ddKS(x;o@SJ z_?+pJ=*6%6uznck4@)^$9|Lt7HZB;z7N5#R@UD zet&lF`Lla}uVsmMowuM+Ma4*#yv3+{p8(%_MD0LQ%w38h)-Z2krlRjU4upy*YQ}e# zJX(k_oE_rJ2gG5GsK5?dS37wS-XA58e|b*hP0E{q+1!;LcQl?s;tT9}{*QJXJeeI# z2aeV8xyxjn!(egoi1BST+Y0+CPA_zy`z)+?p;e^ETul#pQV(ME6I@W1jW6NaB6X-~}8oL7=P-qnl6js2x{leb%kG z{tMKro2E`ynRKZ3xv6`mE|wi8gr=mX&W=(iht0>ddAw!J1MnvEg+q?;wrDF?rv0BY zcmPNHzY62OMx)J_Vdv9tJ>kt}e@{KhTHk*887y!8dUASpa*D0*z6D#0>f1_KH*dYz zKXK0L{&_vZpCDb0QPi=336BfvNk)AYSj=g76av&2)Mg}XbzX(O_-THwz5e4%gXQ-V z)SKTMsw3F*c;Gh5+)-WLuzhkx9(C1+vPach)NMN+aFKnp9=Az;*5h_cf1zA17xo=} z_S>yVzde$E8(&brt@o8l^Q#;F0-UwqZg}MIuB+nkfH-}&+-;lm-N}7-tQF(xyHDFX zv~2wZGW5J;wVGg8EKsSllYcVx-Dce1K-u!e{Jo1dn4Hw9Nu9C{e*qq>PQ@afy--c+ zRC1k~L7h5v(eJ%)7=8k*fA90CdCYSf@5}Cwcc%*0Fu#8uqxARRe*52X{%$-Do&3J7 zlYgy+y0~cF_z0|M{doE250`KLxt3*p3#fa2fHzhAVb%%2L3C5nM{V5{DdQ~T`vF&5 z^!)3w0{%DJC*B@&iQ{8cS1@D=K5S7JU)u@XYnb_1c+~f4e`6f)^)sk@9e}|H ztLpq800030|Lj-KZ`?!_9&ge#EwluRP^%&_3RF!{)FfP})I*#slvE-lV$+CIms#&@ zJjC%B&p7SU>ihC`%?{{a35j&O%V{{t@E`8Ch>#LldRH_j$osXJP0_Otz--+c4t zeKS`PLU+|Qp{_}Fe~qK0T}ZK&{(LCNdPs?+fA<}2up9&)a|pQjh)9Aq zNzNGc$Ma=$oM*s}OG4sE8j8%%0{VZR$8vsZ3R#vF+wG5Kc2gz%!u#%6wfTT??h@&d zR>-+bo(meNfk-tI8vBy@RHqN>M7{&$HC^Jj71QwjjS{}zG57*JpPL9VzqY*j>GDeR z^A8pl7h88oe-QNWSLD|^=GQ{=1-$oTXQy_!b}}Ay9?ax;Q7gC`qzTwzIu#%Da7P5h zN%-0?iO)6o0xUYW7VH^!z4aA!&f5ewcIoPUe)@!`Y*J1ZF9X8*^e9cSX~F-Lz}lh z`{QTzd(U<|(B85Se)~@S{$8q*_gZJl?8cATjU%eE3hWL~Sf_$fof=4;nmMOBbyyM~ zGx!30f0{a_rMj;|m40_ruZru{MU>U6e0=@n%as&E?-3!lh{xLLM#+q?i0?NHo&fjG zcky@!;m_>t68~qvZ@wPa{nd)~?;F&+Z$9n5c$0Havf${o^V}B?LqDJY0`0G*L@#gI zzsC4|`=@L7e!ORso9J`WFb-H*<-FZa2Y z7<>WlcfTme9{nUFfm>fW*?~6w-e{j#yie3)AC@ks@7ceDEFWMyfp_h-_?-JsU%FgW ze}5V(UvQi-8DC|3Gimq%?6}m~Y4Imu|E$FRkzxNx$01#cS4fwN&5%-oC6Dh2CD<6& z5}r=7ovCcU)8=woX?GI)7JG_2JXFPO4o87XY}y8Wr^IowkTgifm5*x>x?aZjE5&rC^Ly4hzhL1w-zP^pKhpV;f6n)Or)BU3xL=(QRKCiFBvMop`jO5T>%1QG zuyy{2`22mtPTaRSb-uR;4U`!c_0uhY|UzM>)M^nU;V0RR8&Sx;{hM-(3?A%sF`P*p)Cf21y= zfP(@F99l#U*~Ex~)DVQ-T&?kXoE@_4jAmzn@Co38I06#=4t#?iIF@@ZoO(t52yN$i zXYBQOqxC;Q4m;9h^YhMo`}Q|)-tSpPdQ_#L;SNGwycduzL^Z|&NqJ}4I_ClPu%s-! zg(XHcoHAD9q?)dpvue(%Iio*6f1+_o&2RJ-#)8J4j|KK55mDFA>*=nag$zHXlpk2{ zr`Av9tUsb6ThJKdeS~Fz8-g*J+>Z!X0ZAs1!J(uf3Cw%8;?M&U>OKyeiZOWp{hasy z(Ry#d%PB&m<<0flZ|fWN2iI4wU29y$oVWe1}NT} z3qo>_>qKf%lTuHZ*o`>$624yN#78W?07tD0D{k4}YCI&KTq2Lvwlq~9E^gB(#=+g{ z`euD6rsYdbfuGbwOzyLYM3s$t1qVR`d%KsG`fQh!0bGsO#YHq&9v`#f1B^o!?mc3$ zPUGBtFeB~9*roY7WvweIe@~m0tt#LjP+vaQyG(ce-AVbIx8j(!_7(7%vOfAMbrl$*dC?&jwY_db94cWsb; z`_|$c@GX@u4kV1z&X~UU%knd4`2pwtVU)K4HsmDSoSdj8FN}j@4DgD&W)48Lg z=?d)E?;(|@7Qird$l%*5+A4k4kzBMa(r*bP2h0)e8S=za8>1tqZ7vPHLgDA)q}H^{aF)-iXjf9 z(@Mf|By->hb>jNcIz5ki;{@Duz9#Gkp~I%r7u)$-E_Axk=|ZRbp3|`S0z8aP|0*!| zN0aG7r%|>}8;$$gI{p3X`|noY|Gk#L;dJ^q>g5}7TOX5zf9dcwu1@nD`&G++)x;rv z;%wkO64eAD4weqVp6^7G@Q!9XG)%(Xrq7%f6RLi7;{MV)p4IoH&)=l|9CXdwucMZK zz%k_*%KCUZUT){}{*ZOk=nv$Ht>dtO#JP4?W38&95oPxshQBi3s5^&x}S)sKI{FyDJ_x^LgW zSkrYi$?rdZKA0a{KY$-oXMaKIZUE_y2?iI86CtVk4&wPVXbJ)e8gb%LoU~epqffuw ze*cA{PcQoPqEGL8PRrs8@SuIVN~dN;Q7Q$dp&Y(fe=qv<>^|LS)7R?L6a6T;f56XO zFV4Bi-SL0#`X2xQ|Nrb*&u`N(6m~io%7GK&4EQB+<9S7COUjUlwa9&Q-q)A!J-^S* zB4$mqe@eZ8GfX^=P9lVEh-+M26XH6AqH#F34P}Ng729^(vDX{)Iru+L@xQG3gI#Vm z%{IhhcVjVIl$pHkm@UErZu&HEP#E7U1;5Y(-%#)miwGuT8)g>={1J9Za|N%#I^bC; z@lI*+!UeG=v{frv;>fuAjqj+23wDPHA~~b3e}bdtbv%W)qw)V?l#E#m{3nhK#=Cr8 z$k(bzcz}{o#je}H_PVt1h-ho%g(K}{8W2vXC+!+%#9K@JYkbRf5)-XZ>T=?DZ!7!0 zOKc1fw=u^kPIq_o!|O4PSFml7Fl=*&1qsgfSb{T^!VBEr9vhBFh<5{X7dIHCJX#MN ze_sT|DMQlsIPn~rcGT*4Hjq$nW3MR~gYREXdF~6^bAvsv5E{%cl~?YSEA@w0OA8B) zIqdr(ZYc%V*n?}J`IwJE{jAu}EDXk@%x6*I1tGrW$A#1)vZOXCTMv9}M|^Fk#Aj=K zfgQ9im8@d>LF1`o^I7MaNJ~@H;mjive{`^Ww^m-NuXRXq+NWaMFEc_}P_5MEu9%+P z=Q%5Ghgo9I%!J=JY=6KW^|m%>NAAhAJjkKqNI#XI)7pK8Kw7FksDXVB?W@On!gPYS zsNhX%ag1wu1^aCD@l!!rJE_dW^u5KOFfLm9e(B|ZNb@(vwHgk?+WGKO{GGR=f7Kh- z+i?82)lc3|Xncdc4E1701ta2j?|^utBeVh$2*J2itAa6&c;YENbZoq0^IS zZ=7K7*4^jui4Q^$wXmv`vz>$J#mM_sQn2Xp6+Edg^Kk4CQJ36G=FajfwL zcE38_z}#-%6`N-$70-42cRGFwfBhRe{{715Z&yB_v7*(%bi7ypsX)D$P%sH!f2!k8 zQvByMf3R;;6PvA$>zdT(WP`j2JA?Mqn{U$a=XbEbzS8ng5T9iJ^8WgN_t%ET7uZAf zS9wMlpuy(-wReA&d*&d{>&G>oz*h2%vc}QpG~7|2*SAqA)TLtnUajYOe|&d9z3_9r z$V4xSe@QQPQ{p2UUtssE7uemzTfsxe6-mQPY=Hb+-o?v8H%_C2J(s_E4a2ZL!t1r2 z3G4bb7&on@ukY`FeIK36)#vP$w=){wV3)(XF_prZ?D971_iVlTLmUrF;xRFg-nRwZ z@%Pn77P>tQZ$0)K8Wo;Ce_JW|qu23;u#UeR%kI5fMf9mPMmt`!N?oBsS?l_s@7Y9u zB@G23OPx>qJvpY}6oh3MMt(lX=zQ=C00960>{!i@+e8$fWVhQbWl_pPRU{-LzBXH} z*eoD{;1F*ERV%S<)od#+G)$aHc3Q7Jvd0U{U%;^v7vR)$#ewoSe;`h9>4^&xA15S) z0QHJso;_1frUOnKt6hmaWi)=V-_Or)-u&LP7Z5^=V$7pdj!3V?I7>z1I z%C4GYcSImRB=v?EgV=XD4Sa<70VC-(1M116_k-|S#IQ?}``kd;eQf^G5&u#>8a&r@ z8oS%QtHkANWS{uFe~&p{y-cGRd*?fwTiszy8!I6R!afPl`<#UP*n6{2dAE%{uZP`h zD{J@IuL&cV74qt;yf66aGVbC1dyfAC(_@D?ob(eaMS|Ihsm z@{9xa7jo?94g0znH$hG}oj<>N`&aR6CHl>i&ZR{DYURZn@Ty3UcNJ|k^ViArrzSKa zk}JvQxy-I+vD4!K*R#3F_E}Bpju?BGd$<<{0Z-3Igy9hLAVf;{IrWJrRWmP;8F$-r zK7~f}5%l#lw>Ed)+C0;}_+oQoqxS-4Y^?a1yt9tRi~C{ctE)!5K%a`Q zLV`It>-rNA){L+0e6@@+zS8|0CtsGN4zq_Nei?hTzk`Q1|7`JIMx${8-Ll@+=Pd&- zZ(q%g;LV|6Fi7l_y_%gI99v$+)D3(d2A+mfq+TSDe?NYi)QfkH7URtuVqEemS2+%H zM)U*2Fo^wrJMaX1o)zA9=!Yu((1jqPDLhnSF;JctpdyyJw}Y(d8RryCRu3 zcSZ03?P&<(#98rI8kAIbcLn{sV)3I4N6#Z$ob`2wIK#gA<@t@p&!7CQWzG+(&ZqUf z;yk-_f4jbP`;M&hr)8c0qcu*vYG^cGFfOM1rB3CBDN^@2`CwM}XLY~Ky1ye*YF77A zd3FCWbg1h-the=f%fKtE?yFhne;eLW!#~ht$}rH;RCWKSwC;a5;eJ=V$maH zl#kSLvre0JyzNoOv`)b66UwaP)7ITQKOQ#xe*hgGvcAm{y0`gZ!&x+NK$q+P64-x) z%H4m{`crg&6zOBW{RU*-dF|Hn>$g5`JD+_D(sFt$`{Gwm*6H`B|2;kmQ;*MaslS5s zDu!gG2Vr5rNXRLPL}F2|9}-B=h!L0Kv_&`+ef`hr{%#yEw!gnX`F*|m_NUHI+vkg1 ze~hQ;`^)49J&*JH{Ho9@l}ciFeZs!=y;EMed^;V>r)@Zdv+>6w7yP0r`MeHJ^N)R{lDs%??G99W_fJ#MUna}XczlKj}&~WKDLh6OydIY3ONZh!UzoGvDmvTTt;zv0YBqRhEe_EKa zXX4q3!OpIe6tN?XW}of%{N|hYz4yGs0Dv=eYIKhBm5p&Ohqi@X;$w$jf052*I!CzP z2){1d(Ih*g{CZ^a`!5Zqzjrp#FJHC^*=j={S_Jt)VrK#TJI+Irof4HaO^fvI4kdcy8Thj2Zw~c# z9&Dc-NE~ST7?b#ZfIPYpLQg`-F0oxC!Ur@%*J9w++t6)Lq}ltoGVppuf5D5%^U^^C z^BXJM@2srW-(6g|bjf@Tdfp-Y((Gzob~P}cf_ol4gX>L{j)tR%gBb}I0LZ?_1F&g} zP~64-PT)Z+#_Mi|e>WApm>e{x7L1wpHS>LBkvVjW9!rD9@9Ygb2%&Sewz5%gh4##} z8+NL&^LE1~bwQ=+xkGAmfAm?l3WKw=dE!1Tzd#qe`yCt#PG{jShHOXZeJtsnQ=ZeP zrH$&f8j~-8LvdJ75Kio^OZLVTKSq@EWb#D(^P7@%?`6LBnm5<~V&kHr@+3{atmx}> z{`LzU?y~X5`t7Cl+a=?RXuM=xkH(Wqo_H?-8SfHUT*$|ha+h8ie;^uF(K#J4KeY$> zsgV4npHP01d6?!ORPbVQFZoH7=3EJizi*JI((}{=Nb;0iU-HDs7?;`Vz<}I5E`vAu)GPO|SkjXJsXIvd|r zzP@ws;hlTH`1BJtf8I2Hez5uY!RDV8m1k-DJE!cA$(v!vM81xjx&=GPhk5fyTKyzw zFRGvKW#~;ReoUtMp%bi|NN*vRN(40|zdi!R@?SpBG=GN`f0@kox>%4t0M8iTe~kG) z{#d(q#$r^)|8fB66I4^0IxCg<%BgErp1+JP+;e^ghG_5~ZiZ_pp6_lFli zf8ViIpY=Je$C@#7<^K6A_rI#dcbAQg$E-jihk=M}t}T%+-##{qMIS600_qu7b| z*GATkiTCo<=P5;hO88+%e$Wc-kfBu5vFOy}S6>aCA)-3zS zUbi2`b^F^Rf96S1Z#+K@YY6Oxn$zMg;QP(WH$Iic>V*WiG@Gm!RpZCeXCz1XimC&5NWlsNIiT*x* vb*YPgS^NRY{=|O%E4&*6-TpIq7t%0sTL+9O(hf*j2LA>J@Tm#2HzvCQ-DquM delta 9807 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 diff --git a/matlab/gtsam_examples/VisualISAM_gui.m b/matlab/gtsam_examples/VisualISAM_gui.m index bc08e7abf..4ccde5e53 100644 --- a/matlab/gtsam_examples/VisualISAM_gui.m +++ b/matlab/gtsam_examples/VisualISAM_gui.m @@ -82,7 +82,7 @@ options.showImages = get(handles.showImagesCB,'Value'); options.hardConstraint = get(handles.hardConstraintCB,'Value'); options.pointPriors = get(handles.pointPriorsCB,'Value'); options.batchInitialization = get(handles.batchInitCB,'Value'); -options.reorderInterval = str2num(get(handles.reorderIntervalEdit,'String')); +%options.reorderInterval = str2num(get(handles.reorderIntervalEdit,'String')); options.alwaysRelinearize = get(handles.alwaysRelinearizeCB,'Value'); % Display Options From 9ac2ae575528b48e87bb509c1aed27184a07dd18 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 4 Sep 2012 04:58:38 +0000 Subject: [PATCH 878/914] make print more comprehensible --- gtsam/linear/IterativeSolver.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 2f76df2b7..4323d8e55 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -49,10 +49,9 @@ namespace gtsam { void setVerbosity(const std::string &s) ; void print() const { - const std::string kernelStr[1] = {"cg"}; std::cout << "IterativeOptimizationParameters: " - << "kernel = " << kernelStr[kernel_] - << ", verbosity = " << verbosity_ << std::endl; + << "kernel = " << kernelTranslator(kernel_) + << ", verbosity = " << verbosityTranslator(verbosity_) << std::endl; } static Kernel kernelTranslator(const std::string &s); From 0d5cb9a7e042dd30b8ba8c0e84c2cda7643ff254 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 4 Sep 2012 05:13:35 +0000 Subject: [PATCH 879/914] fix figure update bug in VisualISAMPlot when run with "Save Figures" enabled. --- matlab/+gtsam/VisualISAMPlot.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/matlab/+gtsam/VisualISAMPlot.m b/matlab/+gtsam/VisualISAMPlot.m index 5ef64cf62..cd7ab188e 100644 --- a/matlab/+gtsam/VisualISAMPlot.m +++ b/matlab/+gtsam/VisualISAMPlot.m @@ -39,11 +39,12 @@ drawnow %% do various optional things if options.saveFigures - fig2 = figure('visible','off'); - newax = copyobj(h,fig2); - colormap(fig2,'hot'); + figToSave = figure('visible','off'); + newax = copyobj(h,figToSave); + colormap(figToSave,'hot'); set(newax, 'units', 'normalized', 'position', [0.13 0.11 0.775 0.815]); - print(fig2,'-dpng',sprintf('VisualiSAM%03d.png',M)); + print(figToSave,'-dpng',sprintf('VisualiSAM%03d.png',M)); + axes(h); end if options.saveDotFiles From 8e4f6051220883f0b00209691b8c5a942d81848d Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 4 Sep 2012 15:05:47 +0000 Subject: [PATCH 880/914] Made HessianFactor::updateATA public to allow low-rank updates --- gtsam/linear/HessianFactor.cpp | 12 ++++-------- gtsam/linear/HessianFactor.h | 28 ++++++++++++++-------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index 6db6330b0..a44f5c682 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -261,12 +261,10 @@ HessianFactor::HessianFactor(const FactorGraph& factors, if (debug) cout << "Combining " << factors.size() << " factors" << endl; BOOST_FOREACH(const GaussianFactor::shared_ptr& factor, factors) { - shared_ptr hessian(boost::dynamic_pointer_cast(factor)); - if (hessian) - updateATA(*hessian, scatter); - else { - JacobianFactor::shared_ptr jacobianFactor(boost::dynamic_pointer_cast(factor)); - if (jacobianFactor) + if(factor) { + if(shared_ptr hessian = boost::dynamic_pointer_cast(factor)) + updateATA(*hessian, scatter); + else if(JacobianFactor::shared_ptr jacobianFactor = boost::dynamic_pointer_cast(factor)) updateATA(*jacobianFactor, scatter); else throw invalid_argument("GaussianFactor is neither Hessian nor Jacobian"); @@ -360,7 +358,6 @@ void HessianFactor::updateATA(const HessianFactor& update, const Scatter& scatte // Apply updates to the upper triangle tic(3, "update"); - assert(this->info_.nBlocks() - 1 == scatter.size()); for(size_t j2=0; j2info_.nBlocks()-1 : slots[j2]; for(size_t j1=0; j1<=j2; ++j1) { @@ -437,7 +434,6 @@ void HessianFactor::updateATA(const JacobianFactor& update, const Scatter& scatt // Apply updates to the upper triangle tic(3, "update"); - assert(this->info_.nBlocks() - 1 == scatter.size()); for(size_t j2=0; j2info_.nBlocks()-1 : slots[j2]; for(size_t j1=0; j1<=j2; ++j1) { diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 74216f0f0..2e9b67c2a 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -120,20 +120,6 @@ namespace gtsam { InfoMatrix matrix_; ///< The full augmented information matrix, s.t. the quadratic error is 0.5*[x -1]'*H*[x -1] BlockInfo info_; ///< The block view of the full information matrix. - /** Update the factor by adding the information from the JacobianFactor - * (used internally during elimination). - * @param update The JacobianFactor containing the new information to add - * @param scatter A mapping from variable index to slot index in this HessianFactor - */ - void updateATA(const JacobianFactor& update, const Scatter& scatter); - - /** Update the factor by adding the information from the HessianFactor - * (used internally during elimination). - * @param update The HessianFactor containing the new information to add - * @param scatter A mapping from variable index to slot index in this HessianFactor - */ - void updateATA(const HessianFactor& update, const Scatter& scatter); - public: typedef boost::shared_ptr shared_ptr; ///< A shared_ptr to this @@ -315,6 +301,20 @@ namespace gtsam { /** split partially eliminated factor */ boost::shared_ptr splitEliminatedFactor(size_t nrFrontals); + /** Update the factor by adding the information from the JacobianFactor + * (used internally during elimination). + * @param update The JacobianFactor containing the new information to add + * @param scatter A mapping from variable index to slot index in this HessianFactor + */ + void updateATA(const JacobianFactor& update, const Scatter& scatter); + + /** Update the factor by adding the information from the HessianFactor + * (used internally during elimination). + * @param update The HessianFactor containing the new information to add + * @param scatter A mapping from variable index to slot index in this HessianFactor + */ + void updateATA(const HessianFactor& update, const Scatter& scatter); + /** assert invariants */ void assertInvariants() const; From abd07e553e5d36aeb15744b8eb67d8038300cca0 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 4 Sep 2012 15:05:55 +0000 Subject: [PATCH 881/914] Made new global functions in unit tests static to avoid duplicate symbols --- tests/testSubgraphPreconditioner.cpp | 2 +- tests/testSubgraphSolver.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index b0a008478..c41b95881 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -54,7 +54,7 @@ TEST( SubgraphPreconditioner, planarOrdering ) { /* ************************************************************************* */ /** unnormalized error */ -double error(const JacobianFactorGraph& fg, const VectorValues& x) { +static double error(const JacobianFactorGraph& fg, const VectorValues& x) { double total_error = 0.; BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) total_error += factor->error(x); diff --git a/tests/testSubgraphSolver.cpp b/tests/testSubgraphSolver.cpp index 04e0554e5..91b44a815 100644 --- a/tests/testSubgraphSolver.cpp +++ b/tests/testSubgraphSolver.cpp @@ -38,7 +38,7 @@ using namespace example; /* ************************************************************************* */ /** unnormalized error */ -double error(const JacobianFactorGraph& fg, const VectorValues& x) { +static double error(const JacobianFactorGraph& fg, const VectorValues& x) { double total_error = 0.; BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) total_error += factor->error(x); From 73f8c0830b40330873c94a728a4bb73123f633ad Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 4 Sep 2012 15:05:57 +0000 Subject: [PATCH 882/914] Created new dense matrix functions in GaussianFactorGraph returning pair for easier access, and renamed functions to augmentedJacobian, augmentedHessian, jacobian, hessian --- gtsam.h | 6 ++- gtsam/linear/GaussianFactorGraph.cpp | 24 +++++++++--- gtsam/linear/GaussianFactorGraph.h | 38 ++++++++++++++++--- .../linear/tests/testGaussianFactorGraph.cpp | 21 ++++++++-- gtsam/nonlinear/Marginals.cpp | 2 +- tests/testDoglegOptimizer.cpp | 6 +-- 6 files changed, 78 insertions(+), 19 deletions(-) diff --git a/gtsam.h b/gtsam.h index c5560668f..9c6f76527 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1022,8 +1022,10 @@ class GaussianFactorGraph { // Conversion to matrices Matrix sparseJacobian_() const; - Matrix denseJacobian() const; - Matrix denseHessian() const; + Matrix augmentedJacobian() const; + pair jacobian() const; + Matrix augmentedHessian() const; + pair hessian() const; }; class GaussianISAM { diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index 02f37915c..144f2c0d9 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -166,7 +166,7 @@ namespace gtsam { } /* ************************************************************************* */ - Matrix GaussianFactorGraph::denseJacobian() const { + Matrix GaussianFactorGraph::augmentedJacobian() const { // Convert to Jacobians FactorGraph jfg; jfg.reserve(this->size()); @@ -182,6 +182,14 @@ namespace gtsam { return combined.matrix_augmented(); } + /* ************************************************************************* */ + std::pair GaussianFactorGraph::jacobian() const { + Matrix augmented = augmentedJacobian(); + return make_pair( + augmented.leftCols(augmented.cols()-1), + augmented.col(augmented.cols()-1)); + } + /* ************************************************************************* */ // Helper functions for Combine static boost::tuple, size_t, size_t> countDims(const FactorGraph& factors, const VariableSlots& variableSlots) { @@ -317,9 +325,7 @@ break; } /* ************************************************************************* */ - static - FastMap findScatterAndDims - (const FactorGraph& factors) { + static FastMap findScatterAndDims(const FactorGraph& factors) { const bool debug = ISDEBUG("findScatterAndDims"); @@ -349,7 +355,7 @@ break; } /* ************************************************************************* */ - Matrix GaussianFactorGraph::denseHessian() const { + Matrix GaussianFactorGraph::augmentedHessian() const { Scatter scatter = findScatterAndDims(*this); @@ -367,6 +373,14 @@ break; return result; } + /* ************************************************************************* */ + std::pair GaussianFactorGraph::hessian() const { + Matrix augmented = augmentedHessian(); + return make_pair( + augmented.topLeftCorner(augmented.rows()-1, augmented.rows()-1), + augmented.col(augmented.rows()-1).head(augmented.rows()-1)); + } + /* ************************************************************************* */ GaussianFactorGraph::EliminationResult EliminateCholesky(const FactorGraph< GaussianFactor>& factors, size_t nrFrontals) { diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 51748b79b..e7563b0c5 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -188,15 +188,43 @@ namespace gtsam { Matrix sparseJacobian_() const; /** - * Return a dense \f$ m \times n \f$ Jacobian matrix, augmented with b - * with standard deviations are baked into A and b + * Return a dense \f$ [ \;A\;b\; ] \in \mathbb{R}^{m \times n+1} \f$ + * Jacobian matrix, augmented with b with the noise models baked + * into A and b. The negative log-likelihood is + * \f$ \frac{1}{2} \Vert Ax-b \Vert^2 \f$. See also + * GaussianFactorGraph::jacobian and GaussianFactorGraph::sparseJacobian. */ - Matrix denseJacobian() const; + Matrix augmentedJacobian() const; + + /** + * Return the dense Jacobian \f$ A \f$ and right-hand-side \f$ b \f$, + * with the noise models baked into A and b. The negative log-likelihood + * is \f$ \frac{1}{2} \Vert Ax-b \Vert^2 \f$. See also + * GaussianFactorGraph::augmentedJacobian and + * GaussianFactorGraph::sparseJacobian. + */ + std::pair jacobian() const; /** - * Return a dense \f$ n \times n \f$ Hessian matrix, augmented with \f$ A^T b \f$ + * Return a dense \f$ \Lambda \in \mathbb{R}^{n+1 \times n+1} \f$ Hessian + * matrix, augmented with the information vector \f$ \eta \f$. The + * augmented Hessian is + \f[ \left[ \begin{array}{ccc} + \Lambda & \eta \\ + \eta^T & c + \end{array} \right] \f] + and the negative log-likelihood is + \f$ \frac{1}{2} x^T \Lambda x + \eta^T x + c \f$. */ - Matrix denseHessian() const; + Matrix augmentedHessian() const; + + /** + * Return the dense Hessian \f$ \Lambda \f$ and information vector + * \f$ \eta \f$, with the noise models baked in. The negative log-likelihood + * is \frac{1}{2} x^T \Lambda x + \eta^T x + c. See also + * GaussianFactorGraph::augmentedHessian. + */ + std::pair hessian() const; private: /** Serialization function */ diff --git a/gtsam/linear/tests/testGaussianFactorGraph.cpp b/gtsam/linear/tests/testGaussianFactorGraph.cpp index 4c0aa3871..cb835a76a 100644 --- a/gtsam/linear/tests/testGaussianFactorGraph.cpp +++ b/gtsam/linear/tests/testGaussianFactorGraph.cpp @@ -410,7 +410,7 @@ TEST(GaussianFactor, eliminateFrontals) factors.push_back(factor4); // extract the dense matrix for the graph - Matrix actualDense = factors.denseJacobian(); + Matrix actualDense = factors.augmentedJacobian(); EXPECT(assert_equal(2.0 * Ab, actualDense)); // Convert to Jacobians, inefficient copy of all factors instead of selectively converting only Hessians @@ -619,7 +619,7 @@ TEST(GaussianFactorGraph, sparseJacobian) { } /* ************************************************************************* */ -TEST(GaussianFactorGraph, denseHessian) { +TEST(GaussianFactorGraph, matrices) { // Create factor graph: // x1 x2 x3 x4 x5 b // 1 2 3 0 0 4 @@ -639,9 +639,24 @@ TEST(GaussianFactorGraph, denseHessian) { 9,10, 0,11,12,13, 0, 0, 0,14,15,16; + Matrix expectedJacobian = jacobian; Matrix expectedHessian = jacobian.transpose() * jacobian; - Matrix actualHessian = gfg.denseHessian(); + Matrix expectedA = jacobian.leftCols(jacobian.cols()-1); + Vector expectedb = jacobian.col(jacobian.cols()-1); + Matrix expectedL = expectedA.transpose() * expectedA; + Vector expectedeta = expectedA.transpose() * expectedb; + + Matrix actualJacobian = gfg.augmentedJacobian(); + Matrix actualHessian = gfg.augmentedHessian(); + Matrix actualA; Vector actualb; boost::tie(actualA,actualb) = gfg.jacobian(); + Matrix actualL; Vector actualeta; boost::tie(actualL,actualeta) = gfg.hessian(); + + EXPECT(assert_equal(expectedJacobian, actualJacobian)); EXPECT(assert_equal(expectedHessian, actualHessian)); + EXPECT(assert_equal(expectedA, actualA)); + EXPECT(assert_equal(expectedb, actualb)); + EXPECT(assert_equal(expectedL, actualL)); + EXPECT(assert_equal(expectedeta, actualeta)); } /* ************************************************************************* */ diff --git a/gtsam/nonlinear/Marginals.cpp b/gtsam/nonlinear/Marginals.cpp index 52c507374..c3078ea76 100644 --- a/gtsam/nonlinear/Marginals.cpp +++ b/gtsam/nonlinear/Marginals.cpp @@ -152,7 +152,7 @@ JointMarginal Marginals::jointMarginalInformation(const std::vector& variab } // Get information matrix - Matrix augmentedInfo = jointFG.denseHessian(); + Matrix augmentedInfo = jointFG.augmentedHessian(); Matrix info = augmentedInfo.topLeftCorner(augmentedInfo.rows()-1, augmentedInfo.cols()-1); return JointMarginal(info, dims, variableConversion); diff --git a/tests/testDoglegOptimizer.cpp b/tests/testDoglegOptimizer.cpp index 781685a23..6b03b572b 100644 --- a/tests/testDoglegOptimizer.cpp +++ b/tests/testDoglegOptimizer.cpp @@ -96,7 +96,7 @@ TEST(DoglegOptimizer, ComputeSteepestDescentPoint) { gradientValues.vector() = gradient; // Compute the gradient using dense matrices - Matrix augmentedHessian = GaussianFactorGraph(gbn).denseHessian(); + Matrix augmentedHessian = GaussianFactorGraph(gbn).augmentedHessian(); LONGS_EQUAL(11, augmentedHessian.cols()); VectorValues denseMatrixGradient = *allocateVectorValues(gbn); denseMatrixGradient.vector() = -augmentedHessian.col(10).segment(0,10); @@ -200,7 +200,7 @@ TEST(DoglegOptimizer, BT_BN_equivalency) { GaussianFactorGraph expected(gbn); GaussianFactorGraph actual(bt); - EXPECT(assert_equal(expected.denseHessian(), actual.denseHessian())); + EXPECT(assert_equal(expected.augmentedHessian(), actual.augmentedHessian())); } /* ************************************************************************* */ @@ -276,7 +276,7 @@ TEST(DoglegOptimizer, ComputeSteepestDescentPointBT) { gradientValues.vector() = gradient; // Compute the gradient using dense matrices - Matrix augmentedHessian = GaussianFactorGraph(bt).denseHessian(); + Matrix augmentedHessian = GaussianFactorGraph(bt).augmentedHessian(); LONGS_EQUAL(11, augmentedHessian.cols()); VectorValues denseMatrixGradient = *allocateVectorValues(bt); denseMatrixGradient.vector() = -augmentedHessian.col(10).segment(0,10); From f1bc66c0174b7200426df183426e39bd500f552f Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Tue, 4 Sep 2012 15:33:36 +0000 Subject: [PATCH 883/914] add back an accidentally deleted function --- gtsam/linear/IterativeSolver.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtsam/linear/IterativeSolver.h b/gtsam/linear/IterativeSolver.h index 4323d8e55..7946874bb 100644 --- a/gtsam/linear/IterativeSolver.h +++ b/gtsam/linear/IterativeSolver.h @@ -68,6 +68,8 @@ namespace gtsam { /* interface to the nonlinear optimizer */ virtual VectorValues optimize () = 0; + /* update interface to the nonlinear optimizer */ + virtual void replaceFactors(const GaussianFactorGraph::shared_ptr &factorGraph, const double lambda) {} }; } From a553d2f84540b7a943a8896b145e2481bf4830ce Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Tue, 4 Sep 2012 19:10:03 +0000 Subject: [PATCH 884/914] fix point prior bug in VisualISAM matlab example. --- matlab/+gtsam/VisualISAMInitialize.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/+gtsam/VisualISAMInitialize.m b/matlab/+gtsam/VisualISAMInitialize.m index 1e408d3d9..b29288fdf 100644 --- a/matlab/+gtsam/VisualISAMInitialize.m +++ b/matlab/+gtsam/VisualISAMInitialize.m @@ -50,7 +50,7 @@ for i=1:2 initialEstimates.insert(jj, truth.points{j}); end if options.pointPriors % add point priors - newFactors.add(priorFactorPoint3(jj, truth.points{j}, noiseModels.point)); + newFactors.add(PriorFactorPoint3(jj, truth.points{j}, noiseModels.point)); end end end From c55f4be0d10cfcd91aef01cbc544cb62cb5c8ec7 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Tue, 4 Sep 2012 22:20:40 +0000 Subject: [PATCH 885/914] Comments added --- tests/testSubgraphSolver.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/testSubgraphSolver.cpp b/tests/testSubgraphSolver.cpp index 91b44a815..84f54a6fa 100644 --- a/tests/testSubgraphSolver.cpp +++ b/tests/testSubgraphSolver.cpp @@ -55,9 +55,11 @@ TEST( SubgraphSolver, constructor1 ) size_t N = 3; boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b + // The first constructor just takes a factor graph (and parameters) + // and it will split the graph into A1 and A2, where A1 is a spanning tree SubgraphSolverParameters parameters; SubgraphSolver solver(Ab, parameters); - VectorValues optimized = solver.optimize(); + VectorValues optimized = solver.optimize(); // does PCG optimization DOUBLES_EQUAL(0.0, error(Ab, optimized), 1e-5); } @@ -74,6 +76,8 @@ TEST( SubgraphSolver, constructor2 ) JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); + // The second constructor takes two factor graphs, + // so the caller can specify the preconditioner (Ab1) and the constraints that are left out (Ab2) SubgraphSolverParameters parameters; SubgraphSolver solver(Ab1_, Ab2_, parameters); VectorValues optimized = solver.optimize(); @@ -93,8 +97,12 @@ TEST( SubgraphSolver, constructor3 ) JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); - GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(Ab1_)->eliminate(&EliminateQR); + // The caller solves |A1*x-b1|^2 == |R1*x-c1|^2 via QR factorization, where R1 is square UT + GaussianBayesNet::shared_ptr Rc1 = // + EliminationTree::Create(Ab1_)->eliminate(&EliminateQR); + // The third constructor allows the caller to pass an already solved preconditioner Rc1_ + // as a Bayes net, in addition to the "loop closing constraints" Ab2, as before SubgraphSolverParameters parameters; SubgraphSolver solver(Rc1, Ab2_, parameters); VectorValues optimized = solver.optimize(); From b0508cc1a8996a5dbfe5e1e6d71e7316d5b94f83 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 4 Sep 2012 22:42:09 +0000 Subject: [PATCH 886/914] Removed JacobianFactorGraph - moved its linear algebra interface to GaussianFactorGraph and redirected all uses of it to GaussianFactorGraph --- gtsam/linear/GaussianBayesNet.cpp | 6 +- gtsam/linear/GaussianBayesTree.cpp | 2 +- gtsam/linear/GaussianFactorGraph.cpp | 147 ++++++++++++++++++ gtsam/linear/GaussianFactorGraph.h | 66 +++++--- gtsam/linear/JacobianFactorGraph.cpp | 135 ---------------- gtsam/linear/JacobianFactorGraph.h | 75 --------- gtsam/linear/SubgraphPreconditioner.cpp | 2 +- gtsam/linear/SubgraphPreconditioner.h | 3 +- gtsam/linear/SubgraphSolver.cpp | 46 +++--- gtsam/linear/SubgraphSolver.h | 16 +- gtsam/linear/iterative.cpp | 10 +- gtsam/linear/iterative.h | 4 +- .../linear/tests/testJacobianFactorGraph.cpp | 2 +- gtsam/nonlinear/ISAM2.cpp | 2 +- .../NonlinearConjugateGradientOptimizer.cpp | 2 +- tests/smallExample.cpp | 26 ++-- tests/smallExample.h | 15 +- tests/testGaussianFactor.cpp | 6 +- tests/testGaussianFactorGraphB.cpp | 2 +- tests/testGaussianISAM2.cpp | 2 +- tests/testIterative.cpp | 2 +- tests/testSubgraphPreconditioner.cpp | 28 ++-- tests/testSubgraphSolver.cpp | 16 +- 23 files changed, 292 insertions(+), 323 deletions(-) delete mode 100644 gtsam/linear/JacobianFactorGraph.cpp delete mode 100644 gtsam/linear/JacobianFactorGraph.h diff --git a/gtsam/linear/GaussianBayesNet.cpp b/gtsam/linear/GaussianBayesNet.cpp index 0ddc4a7b3..5182bb914 100644 --- a/gtsam/linear/GaussianBayesNet.cpp +++ b/gtsam/linear/GaussianBayesNet.cpp @@ -16,7 +16,7 @@ */ #include -#include +#include #include #include @@ -242,12 +242,12 @@ double determinant(const GaussianBayesNet& bayesNet) { /* ************************************************************************* */ VectorValues gradient(const GaussianBayesNet& bayesNet, const VectorValues& x0) { - return gradient(FactorGraph(bayesNet), x0); + return gradient(GaussianFactorGraph(bayesNet), x0); } /* ************************************************************************* */ void gradientAtZero(const GaussianBayesNet& bayesNet, VectorValues& g) { - gradientAtZero(FactorGraph(bayesNet), g); + gradientAtZero(GaussianFactorGraph(bayesNet), g); } /* ************************************************************************* */ diff --git a/gtsam/linear/GaussianBayesTree.cpp b/gtsam/linear/GaussianBayesTree.cpp index f9ea3fdc8..04cb4a25a 100644 --- a/gtsam/linear/GaussianBayesTree.cpp +++ b/gtsam/linear/GaussianBayesTree.cpp @@ -18,7 +18,7 @@ */ #include -#include +#include namespace gtsam { diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index 144f2c0d9..14d558e62 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -521,4 +521,151 @@ break; } // \EliminatePreferCholesky + /* ************************************************************************* */ + Errors operator*(const GaussianFactorGraph& fg, const VectorValues& x) { + Errors e; + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + e.push_back((*Ai)*x); + } + return e; + } + + /* ************************************************************************* */ + void multiplyInPlace(const GaussianFactorGraph& fg, const VectorValues& x, Errors& e) { + multiplyInPlace(fg,x,e.begin()); + } + + /* ************************************************************************* */ + void multiplyInPlace(const GaussianFactorGraph& fg, const VectorValues& x, const Errors::iterator& e) { + Errors::iterator ei = e; + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + *ei = (*Ai)*x; + ei++; + } + } + + /* ************************************************************************* */ + // x += alpha*A'*e + void transposeMultiplyAdd(const GaussianFactorGraph& fg, double alpha, const Errors& e, VectorValues& x) { + // For each factor add the gradient contribution + Errors::const_iterator ei = e.begin(); + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + Ai->transposeMultiplyAdd(alpha,*(ei++),x); + } + } + + /* ************************************************************************* */ + VectorValues gradient(const GaussianFactorGraph& fg, const VectorValues& x0) { + // It is crucial for performance to make a zero-valued clone of x + VectorValues g = VectorValues::Zero(x0); + Errors e; + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + e.push_back(Ai->error_vector(x0)); + } + transposeMultiplyAdd(fg, 1.0, e, g); + return g; + } + + /* ************************************************************************* */ + void gradientAtZero(const GaussianFactorGraph& fg, VectorValues& g) { + // Zero-out the gradient + g.setZero(); + Errors e; + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + e.push_back(-Ai->getb()); + } + transposeMultiplyAdd(fg, 1.0, e, g); + } + + /* ************************************************************************* */ + void residual(const GaussianFactorGraph& fg, const VectorValues &x, VectorValues &r) { + Index i = 0 ; + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + r[i] = Ai->getb(); + i++; + } + VectorValues Ax = VectorValues::SameStructure(r); + multiply(fg,x,Ax); + axpy(-1.0,Ax,r); + } + + /* ************************************************************************* */ + void multiply(const GaussianFactorGraph& fg, const VectorValues &x, VectorValues &r) { + r.vector() = Vector::Zero(r.dim()); + Index i = 0; + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + SubVector &y = r[i]; + for(JacobianFactor::const_iterator j = Ai->begin(); j != Ai->end(); ++j) { + y += Ai->getA(j) * x[*j]; + } + ++i; + } + } + + /* ************************************************************************* */ + void transposeMultiply(const GaussianFactorGraph& fg, const VectorValues &r, VectorValues &x) { + x.vector() = Vector::Zero(x.dim()); + Index i = 0; + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + for(JacobianFactor::const_iterator j = Ai->begin(); j != Ai->end(); ++j) { + x[*j] += Ai->getA(j).transpose() * r[i]; + } + ++i; + } + } + + /* ************************************************************************* */ + boost::shared_ptr gaussianErrors_(const GaussianFactorGraph& fg, const VectorValues& x) { + boost::shared_ptr e(new Errors); + BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { + JacobianFactor::shared_ptr Ai; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) + Ai = Ai_J; + else + Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + e->push_back(Ai->error_vector(x)); + } + return e; + } + } // namespace gtsam diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index e7563b0c5..6c06e34c0 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -31,24 +31,6 @@ namespace gtsam { - /** return A*x-b - * \todo Make this a member function - affects SubgraphPreconditioner */ - template - Errors gaussianErrors(const FactorGraph& fg, const VectorValues& x) { - return *gaussianErrors_(fg, x); - } - - /** shared pointer version - * \todo Make this a member function - affects SubgraphPreconditioner */ - template - boost::shared_ptr gaussianErrors_(const FactorGraph& fg, const VectorValues& x) { - boost::shared_ptr e(new Errors); - BOOST_FOREACH(const typename boost::shared_ptr& factor, fg) { - e->push_back(factor->error_vector(x)); - } - return e; - } - /** * A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e. * Factor == GaussianFactor @@ -321,5 +303,53 @@ namespace gtsam { */ GaussianFactorGraph::EliminationResult EliminateCholesky(const FactorGraph< GaussianFactor>& factors, size_t nrFrontals = 1); + + /** return A*x */ + Errors operator*(const GaussianFactorGraph& fg, const VectorValues& x); + + /** In-place version e <- A*x that overwrites e. */ + void multiplyInPlace(const GaussianFactorGraph& fg, const VectorValues& x, Errors& e); + + /** In-place version e <- A*x that takes an iterator. */ + void multiplyInPlace(const GaussianFactorGraph& fg, const VectorValues& x, const Errors::iterator& e); + + /** x += alpha*A'*e */ + void transposeMultiplyAdd(const GaussianFactorGraph& fg, double alpha, const Errors& e, VectorValues& x); + + /** + * Compute the gradient of the energy function, + * \f$ \nabla_{x=x_0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, + * centered around \f$ x = x_0 \f$. + * The gradient is \f$ A^T(Ax-b) \f$. + * @param fg The Jacobian factor graph $(A,b)$ + * @param x0 The center about which to compute the gradient + * @return The gradient as a VectorValues + */ + VectorValues gradient(const GaussianFactorGraph& fg, const VectorValues& x0); + + /** + * Compute the gradient of the energy function, + * \f$ \nabla_{x=0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, + * centered around zero. + * The gradient is \f$ A^T(Ax-b) \f$. + * @param fg The Jacobian factor graph $(A,b)$ + * @param [output] g A VectorValues to store the gradient, which must be preallocated, see allocateVectorValues + * @return The gradient as a VectorValues + */ + void gradientAtZero(const GaussianFactorGraph& fg, VectorValues& g); + + /* matrix-vector operations */ + void residual(const GaussianFactorGraph& fg, const VectorValues &x, VectorValues &r); + void multiply(const GaussianFactorGraph& fg, const VectorValues &x, VectorValues &r); + void transposeMultiply(const GaussianFactorGraph& fg, const VectorValues &r, VectorValues &x); + + /** shared pointer version + * \todo Make this a member function - affects SubgraphPreconditioner */ + boost::shared_ptr gaussianErrors_(const GaussianFactorGraph& fg, const VectorValues& x); + + /** return A*x-b + * \todo Make this a member function - affects SubgraphPreconditioner */ + inline Errors gaussianErrors(const GaussianFactorGraph& fg, const VectorValues& x) { + return *gaussianErrors_(fg, x); } } // namespace gtsam diff --git a/gtsam/linear/JacobianFactorGraph.cpp b/gtsam/linear/JacobianFactorGraph.cpp deleted file mode 100644 index 70c57e8df..000000000 --- a/gtsam/linear/JacobianFactorGraph.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @file JacobianFactorGraph.h - * @date Jun 6, 2012 - * @author Yong Dian Jian - */ - -#include -#include - -namespace gtsam { - -/* ************************************************************************* */ -Errors operator*(const JacobianFactorGraph& fg, const VectorValues& x) { - Errors e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { - e.push_back((*Ai)*x); - } - return e; -} - -/* ************************************************************************* */ -void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, Errors& e) { - multiplyInPlace(fg,x,e.begin()); -} - -/* ************************************************************************* */ -void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, const Errors::iterator& e) { - Errors::iterator ei = e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { - *ei = (*Ai)*x; - ei++; - } -} - - -/* ************************************************************************* */ -// x += alpha*A'*e -void transposeMultiplyAdd(const JacobianFactorGraph& fg, double alpha, const Errors& e, VectorValues& x) { - // For each factor add the gradient contribution - Errors::const_iterator ei = e.begin(); - BOOST_FOREACH(const JacobianFactor::shared_ptr& Ai, fg) { - Ai->transposeMultiplyAdd(alpha,*(ei++),x); - } -} - -/* ************************************************************************* */ -VectorValues gradient(const JacobianFactorGraph& fg, const VectorValues& x0) { - // It is crucial for performance to make a zero-valued clone of x - VectorValues g = VectorValues::Zero(x0); - Errors e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - e.push_back(factor->error_vector(x0)); - } - transposeMultiplyAdd(fg, 1.0, e, g); - return g; -} - -/* ************************************************************************* */ -void gradientAtZero(const JacobianFactorGraph& fg, VectorValues& g) { - // Zero-out the gradient - g.setZero(); - Errors e; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - e.push_back(-factor->getb()); - } - transposeMultiplyAdd(fg, 1.0, e, g); -} - -/* ************************************************************************* */ -void residual(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r) { - Index i = 0 ; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - r[i] = factor->getb(); - i++; - } - VectorValues Ax = VectorValues::SameStructure(r); - multiply(fg,x,Ax); - axpy(-1.0,Ax,r); -} - -/* ************************************************************************* */ -void multiply(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r) { - r.vector() = Vector::Zero(r.dim()); - Index i = 0; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - SubVector &y = r[i]; - for(JacobianFactor::const_iterator j = factor->begin(); j != factor->end(); ++j) { - y += factor->getA(j) * x[*j]; - } - ++i; - } -} - -/* ************************************************************************* */ -void transposeMultiply(const JacobianFactorGraph& fg, const VectorValues &r, VectorValues &x) { - x.vector() = Vector::Zero(x.dim()); - Index i = 0; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) { - for(JacobianFactor::const_iterator j = factor->begin(); j != factor->end(); ++j) { - x[*j] += factor->getA(j).transpose() * r[i]; - } - ++i; - } -} - -/* ************************************************************************* */ -JacobianFactorGraph::shared_ptr dynamicCastFactors(const GaussianFactorGraph &gfg) { - JacobianFactorGraph::shared_ptr jfg(new JacobianFactorGraph()); - jfg->reserve(gfg.size()); - BOOST_FOREACH(const GaussianFactor::shared_ptr& factor, gfg) { - JacobianFactor::shared_ptr castedFactor(boost::dynamic_pointer_cast(factor)); - if(castedFactor) jfg->push_back(castedFactor); - else throw std::invalid_argument("dynamicCastFactors(), dynamic_cast failed, meaning an invalid cast was requested."); - } - return jfg; -} - -/* ************************************************************************* */ -JacobianFactorGraph::shared_ptr convertToJacobianFactorGraph(const GaussianFactorGraph &gfg) { - JacobianFactorGraph::shared_ptr jfg(new JacobianFactorGraph()); - jfg->reserve(gfg.size()); - BOOST_FOREACH(const GaussianFactor::shared_ptr & factor, gfg) { - if( JacobianFactor::shared_ptr jf = boost::dynamic_pointer_cast(factor) ) { - jfg->push_back(jf); - } - else { - jfg->push_back(boost::make_shared(*factor)); - } - } - return jfg; -} - -} // namespace - - diff --git a/gtsam/linear/JacobianFactorGraph.h b/gtsam/linear/JacobianFactorGraph.h deleted file mode 100644 index 1164652c3..000000000 --- a/gtsam/linear/JacobianFactorGraph.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * 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 JacobianFactorGraph.cpp - * @date Jun 6, 2012 - * @brief Linear Algebra Operations for a JacobianFactorGraph - * @author Yong Dian Jian - */ -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace gtsam { - - typedef FactorGraph JacobianFactorGraph; - - /** return A*x */ - Errors operator*(const JacobianFactorGraph& fg, const VectorValues& x); - - /** In-place version e <- A*x that overwrites e. */ - void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, Errors& e); - - /** In-place version e <- A*x that takes an iterator. */ - void multiplyInPlace(const JacobianFactorGraph& fg, const VectorValues& x, const Errors::iterator& e); - - /** x += alpha*A'*e */ - void transposeMultiplyAdd(const JacobianFactorGraph& fg, double alpha, const Errors& e, VectorValues& x); - - /** - * Compute the gradient of the energy function, - * \f$ \nabla_{x=x_0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, - * centered around \f$ x = x_0 \f$. - * The gradient is \f$ A^T(Ax-b) \f$. - * @param fg The Jacobian factor graph $(A,b)$ - * @param x0 The center about which to compute the gradient - * @return The gradient as a VectorValues - */ - VectorValues gradient(const JacobianFactorGraph& fg, const VectorValues& x0); - - /** - * Compute the gradient of the energy function, - * \f$ \nabla_{x=0} \left\Vert \Sigma^{-1} A x - b \right\Vert^2 \f$, - * centered around zero. - * The gradient is \f$ A^T(Ax-b) \f$. - * @param fg The Jacobian factor graph $(A,b)$ - * @param [output] g A VectorValues to store the gradient, which must be preallocated, see allocateVectorValues - * @return The gradient as a VectorValues - */ - void gradientAtZero(const JacobianFactorGraph& fg, VectorValues& g); - - /* matrix-vector operations */ - void residual(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r); - void multiply(const JacobianFactorGraph& fg, const VectorValues &x, VectorValues &r); - void transposeMultiply(const JacobianFactorGraph& fg, const VectorValues &r, VectorValues &x); - - /** dynamic_cast the gaussian factors down to jacobian factors, may throw exception if it contains non-Jacobian Factor */ - JacobianFactorGraph::shared_ptr dynamicCastFactors(const GaussianFactorGraph &gfg); - - /** convert the gaussian factors down to jacobian factors, may duplicate factors if it contains Hessian Factor */ - JacobianFactorGraph::shared_ptr convertToJacobianFactorGraph(const GaussianFactorGraph &gfg); -} diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp index b33adbc38..72aa25554 100644 --- a/gtsam/linear/SubgraphPreconditioner.cpp +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -17,7 +17,7 @@ #include #include -#include +#include #include diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h index b109368af..db7c023ce 100644 --- a/gtsam/linear/SubgraphPreconditioner.h +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -18,6 +18,7 @@ #pragma once #include +#include #include namespace gtsam { @@ -35,7 +36,7 @@ namespace gtsam { typedef boost::shared_ptr shared_ptr; typedef boost::shared_ptr sharedBayesNet; - typedef boost::shared_ptr > sharedFG; + typedef boost::shared_ptr sharedFG; typedef boost::shared_ptr sharedValues; typedef boost::shared_ptr sharedErrors; diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 14a0cc174..c34f7e22e 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -31,12 +31,11 @@ namespace gtsam { SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &gfg, const Parameters ¶meters) : parameters_(parameters) { - JacobianFactorGraph::shared_ptr jfg = dynamicCastFactors(gfg); - initialize(*jfg); + initialize(gfg); } /**************************************************************************************************/ -SubgraphSolver::SubgraphSolver(const JacobianFactorGraph::shared_ptr &jfg, const Parameters ¶meters) +SubgraphSolver::SubgraphSolver(const GaussianFactorGraph::shared_ptr &jfg, const Parameters ¶meters) : parameters_(parameters) { initialize(*jfg); @@ -47,13 +46,12 @@ SubgraphSolver::SubgraphSolver(const GaussianFactorGraph &Ab1, const GaussianFac : parameters_(parameters) { GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(Ab1)->eliminate(&EliminateQR); - JacobianFactorGraph::shared_ptr Ab2Jacobian = dynamicCastFactors(Ab2); - initialize(Rc1, Ab2Jacobian); + initialize(Rc1, boost::make_shared(Ab2)); } /**************************************************************************************************/ -SubgraphSolver::SubgraphSolver(const JacobianFactorGraph::shared_ptr &Ab1, - const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters) +SubgraphSolver::SubgraphSolver(const GaussianFactorGraph::shared_ptr &Ab1, + const GaussianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters) : parameters_(parameters) { GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(*Ab1)->eliminate(&EliminateQR); @@ -64,13 +62,12 @@ SubgraphSolver::SubgraphSolver(const JacobianFactorGraph::shared_ptr &Ab1, SubgraphSolver::SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, const GaussianFactorGraph &Ab2, const Parameters ¶meters) : parameters_(parameters) { - JacobianFactorGraph::shared_ptr Ab2Jacobians = dynamicCastFactors(Ab2); - initialize(Rc1, Ab2Jacobians); + initialize(Rc1, boost::make_shared(Ab2)); } /**************************************************************************************************/ SubgraphSolver::SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, - const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters) : parameters_(parameters) + const GaussianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters) : parameters_(parameters) { initialize(Rc1, Ab2); } @@ -80,10 +77,10 @@ VectorValues SubgraphSolver::optimize() { return pc_->x(ybar); } -void SubgraphSolver::initialize(const JacobianFactorGraph &jfg) +void SubgraphSolver::initialize(const GaussianFactorGraph &jfg) { - JacobianFactorGraph::shared_ptr Ab1 = boost::make_shared(), - Ab2 = boost::make_shared(); + GaussianFactorGraph::shared_ptr Ab1 = boost::make_shared(), + Ab2 = boost::make_shared(); boost::tie(Ab1, Ab2) = splitGraph(jfg) ; if (parameters_.verbosity()) @@ -91,28 +88,33 @@ void SubgraphSolver::initialize(const JacobianFactorGraph &jfg) GaussianBayesNet::shared_ptr Rc1 = EliminationTree::Create(*Ab1)->eliminate(&EliminateQR); VectorValues::shared_ptr xbar(new VectorValues(gtsam::optimize(*Rc1))); - JacobianFactorGraph::shared_ptr Ab2Jacobians = convertToJacobianFactorGraph(*Ab2); - pc_ = boost::make_shared(Ab2Jacobians, Rc1, xbar); + pc_ = boost::make_shared(Ab2, Rc1, xbar); } -void SubgraphSolver::initialize(const GaussianBayesNet::shared_ptr &Rc1, const JacobianFactorGraph::shared_ptr &Ab2) +void SubgraphSolver::initialize(const GaussianBayesNet::shared_ptr &Rc1, const GaussianFactorGraph::shared_ptr &Ab2) { VectorValues::shared_ptr xbar(new VectorValues(gtsam::optimize(*Rc1))); pc_ = boost::make_shared(Ab2, Rc1, xbar); } -boost::tuple -SubgraphSolver::splitGraph(const JacobianFactorGraph &jfg) { +boost::tuple +SubgraphSolver::splitGraph(const GaussianFactorGraph &jfg) { const VariableIndex index(jfg); const size_t n = index.size(), m = jfg.size(); DisjointSet D(n) ; - JacobianFactorGraph::shared_ptr At(new JacobianFactorGraph()); - JacobianFactorGraph::shared_ptr Ac( new JacobianFactorGraph()); + GaussianFactorGraph::shared_ptr At(new GaussianFactorGraph()); + GaussianFactorGraph::shared_ptr Ac( new GaussianFactorGraph()); size_t t = 0; - BOOST_FOREACH ( const JacobianFactor::shared_ptr &jf, jfg ) { + BOOST_FOREACH ( const GaussianFactor::shared_ptr &gf, jfg ) { + + JacobianFactor::shared_ptr jf; + if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(gf)) + jf = Ai_J; + else + jf = boost::make_shared(*gf); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) if ( jf->keys().size() > 2 ) { throw runtime_error("SubgraphSolver::splitGraph the graph is not simple, sanity check failed "); diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index e4d99933b..441fdaeef 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include @@ -62,26 +62,26 @@ protected: public: /* Given a gaussian factor graph, split it into a spanning tree (A1) + others (A2) for SPCG */ SubgraphSolver(const GaussianFactorGraph &A, const Parameters ¶meters); - SubgraphSolver(const JacobianFactorGraph::shared_ptr &A, const Parameters ¶meters); + SubgraphSolver(const GaussianFactorGraph::shared_ptr &A, const Parameters ¶meters); /* The user specify the subgraph part and the constraint part, may throw exception if A1 is underdetermined */ SubgraphSolver(const GaussianFactorGraph &Ab1, const GaussianFactorGraph &Ab2, const Parameters ¶meters); - SubgraphSolver(const JacobianFactorGraph::shared_ptr &Ab1, const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters); + SubgraphSolver(const GaussianFactorGraph::shared_ptr &Ab1, const GaussianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters); /* The same as above, but the A1 is solved before */ SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, const GaussianFactorGraph &Ab2, const Parameters ¶meters); - SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, const JacobianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters); + SubgraphSolver(const GaussianBayesNet::shared_ptr &Rc1, const GaussianFactorGraph::shared_ptr &Ab2, const Parameters ¶meters); virtual ~SubgraphSolver() {} virtual VectorValues optimize () ; protected: - void initialize(const JacobianFactorGraph &jfg); - void initialize(const GaussianBayesNet::shared_ptr &Rc1, const JacobianFactorGraph::shared_ptr &Ab2); + void initialize(const GaussianFactorGraph &jfg); + void initialize(const GaussianBayesNet::shared_ptr &Rc1, const GaussianFactorGraph::shared_ptr &Ab2); - boost::tuple - splitGraph(const JacobianFactorGraph &gfg) ; + boost::tuple + splitGraph(const GaussianFactorGraph &gfg) ; public: diff --git a/gtsam/linear/iterative.cpp b/gtsam/linear/iterative.cpp index d0a7fd551..07d4de865 100644 --- a/gtsam/linear/iterative.cpp +++ b/gtsam/linear/iterative.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include @@ -61,15 +61,15 @@ namespace gtsam { } /* ************************************************************************* */ - VectorValues steepestDescent(const FactorGraph& fg, + VectorValues steepestDescent(const GaussianFactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters) { - return conjugateGradients, VectorValues, Errors>( + return conjugateGradients( fg, x, parameters, true); } - VectorValues conjugateGradientDescent(const FactorGraph& fg, + VectorValues conjugateGradientDescent(const GaussianFactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters) { - return conjugateGradients, VectorValues, Errors>( + return conjugateGradients( fg, x, parameters); } diff --git a/gtsam/linear/iterative.h b/gtsam/linear/iterative.h index 384dfe814..0eb04bf49 100644 --- a/gtsam/linear/iterative.h +++ b/gtsam/linear/iterative.h @@ -130,7 +130,7 @@ namespace gtsam { * Method of steepest gradients, Gaussian Factor Graph version */ VectorValues steepestDescent( - const FactorGraph& fg, + const GaussianFactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters); @@ -138,7 +138,7 @@ namespace gtsam { * Method of conjugate gradients (CG), Gaussian Factor Graph version */ VectorValues conjugateGradientDescent( - const FactorGraph& fg, + const GaussianFactorGraph& fg, const VectorValues& x, const ConjugateGradientParameters & parameters); diff --git a/gtsam/linear/tests/testJacobianFactorGraph.cpp b/gtsam/linear/tests/testJacobianFactorGraph.cpp index e756d83e7..07dda4652 100644 --- a/gtsam/linear/tests/testJacobianFactorGraph.cpp +++ b/gtsam/linear/tests/testJacobianFactorGraph.cpp @@ -11,7 +11,7 @@ /** * @file testJacobianFactorGraph.cpp - * @brief Unit tests for JacobianFactorGraph + * @brief Unit tests for GaussianFactorGraph * @author Yong Dian Jian **/ diff --git a/gtsam/nonlinear/ISAM2.cpp b/gtsam/nonlinear/ISAM2.cpp index b09133c4d..081910e8c 100644 --- a/gtsam/nonlinear/ISAM2.cpp +++ b/gtsam/nonlinear/ISAM2.cpp @@ -27,7 +27,7 @@ using namespace boost::assign; #include #include #include -#include +#include #include #include diff --git a/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp b/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp index f0b3852ef..da14d8982 100644 --- a/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp +++ b/gtsam/nonlinear/NonlinearConjugateGradientOptimizer.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include diff --git a/tests/smallExample.cpp b/tests/smallExample.cpp index f81ab5528..6df106acf 100644 --- a/tests/smallExample.cpp +++ b/tests/smallExample.cpp @@ -138,9 +138,9 @@ namespace example { } /* ************************************************************************* */ - JacobianFactorGraph createGaussianFactorGraph(const Ordering& ordering) { + FactorGraph createGaussianFactorGraph(const Ordering& ordering) { // Create empty graph - JacobianFactorGraph fg; + FactorGraph fg; SharedDiagonal unit2 = noiseModel::Unit::Create(2); @@ -273,7 +273,7 @@ namespace example { } /* ************************************************************************* */ - JacobianFactorGraph createSimpleConstraintGraph() { + GaussianFactorGraph createSimpleConstraintGraph() { // create unary factor // prior on _x_, mean = [1,-1], sigma=0.1 Matrix Ax = eye(2); @@ -293,7 +293,7 @@ namespace example { constraintModel)); // construct the graph - JacobianFactorGraph fg; + GaussianFactorGraph fg; fg.push_back(f1); fg.push_back(f2); @@ -310,7 +310,7 @@ namespace example { } /* ************************************************************************* */ - JacobianFactorGraph createSingleConstraintGraph() { + GaussianFactorGraph createSingleConstraintGraph() { // create unary factor // prior on _x_, mean = [1,-1], sigma=0.1 Matrix Ax = eye(2); @@ -335,7 +335,7 @@ namespace example { constraintModel)); // construct the graph - JacobianFactorGraph fg; + GaussianFactorGraph fg; fg.push_back(f1); fg.push_back(f2); @@ -351,7 +351,7 @@ namespace example { } /* ************************************************************************* */ - JacobianFactorGraph createMultiConstraintGraph() { + GaussianFactorGraph createMultiConstraintGraph() { // unary factor 1 Matrix A = eye(2); Vector b = Vector_(2, -2.0, 2.0); @@ -396,7 +396,7 @@ namespace example { constraintModel)); // construct the graph - JacobianFactorGraph fg; + GaussianFactorGraph fg; fg.push_back(lf1); fg.push_back(lc1); fg.push_back(lc2); @@ -421,7 +421,7 @@ namespace example { } /* ************************************************************************* */ - boost::tuple planarGraph(size_t N) { + boost::tuple planarGraph(size_t N) { // create empty graph NonlinearFactorGraph nlfg; @@ -460,7 +460,7 @@ namespace example { // linearize around zero boost::shared_ptr gfg = nlfg.linearize(zeros, ordering); - JacobianFactorGraph jfg; + GaussianFactorGraph jfg; BOOST_FOREACH(GaussianFactorGraph::sharedFactor factor, *gfg) jfg.push_back(boost::dynamic_pointer_cast(factor)); @@ -477,9 +477,9 @@ namespace example { } /* ************************************************************************* */ - pair splitOffPlanarTree(size_t N, - const JacobianFactorGraph& original) { - JacobianFactorGraph T, C; + pair splitOffPlanarTree(size_t N, + const GaussianFactorGraph& original) { + GaussianFactorGraph T, C; // Add the x11 constraint to the tree T.push_back(boost::dynamic_pointer_cast(original[0])); diff --git a/tests/smallExample.h b/tests/smallExample.h index 54c3a14c5..9c43563a3 100644 --- a/tests/smallExample.h +++ b/tests/smallExample.h @@ -23,7 +23,6 @@ #include #include -#include #include namespace gtsam { @@ -66,7 +65,7 @@ namespace gtsam { * create a linear factor graph * The non-linear graph above evaluated at NoisyValues */ - JacobianFactorGraph createGaussianFactorGraph(const Ordering& ordering); + FactorGraph createGaussianFactorGraph(const Ordering& ordering); /** * create small Chordal Bayes Net x <- y @@ -100,21 +99,21 @@ namespace gtsam { * Creates a simple constrained graph with one linear factor and * one binary equality constraint that sets x = y */ - JacobianFactorGraph createSimpleConstraintGraph(); + GaussianFactorGraph createSimpleConstraintGraph(); VectorValues createSimpleConstraintValues(); /** * Creates a simple constrained graph with one linear factor and * one binary constraint. */ - JacobianFactorGraph createSingleConstraintGraph(); + GaussianFactorGraph createSingleConstraintGraph(); VectorValues createSingleConstraintValues(); /** * Creates a constrained graph with a linear factor and two * binary constraints that share a node */ - JacobianFactorGraph createMultiConstraintGraph(); + GaussianFactorGraph createMultiConstraintGraph(); VectorValues createMultiConstraintValues(); /* ******************************************************* */ @@ -130,7 +129,7 @@ namespace gtsam { * -x11-x21-x31 * with x11 clamped at (1,1), and others related by 2D odometry. */ - boost::tuple planarGraph(size_t N); + boost::tuple planarGraph(size_t N); /* * Create canonical ordering for planar graph that also works for tree @@ -147,8 +146,8 @@ namespace gtsam { * | * -x11-x21-x31 */ - std::pair splitOffPlanarTree( - size_t N, const JacobianFactorGraph& original); + std::pair splitOffPlanarTree( + size_t N, const GaussianFactorGraph& original); } // example } // gtsam diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index 3fe92c50d..a41c8d9a7 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -72,7 +72,7 @@ TEST( GaussianFactor, getDim ) const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // get a factor Ordering ordering; ordering += kx1,kx2,kl1; - GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); + FactorGraph fg = example::createGaussianFactorGraph(ordering); GaussianFactor::shared_ptr factor = fg[0]; // get the size of a variable @@ -89,7 +89,7 @@ TEST( GaussianFactor, error ) const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); + FactorGraph fg = example::createGaussianFactorGraph(ordering); // get the first factor from the factor graph GaussianFactor::shared_ptr lf = fg[0]; @@ -210,7 +210,7 @@ TEST( GaussianFactor, size ) // create a linear factor graph const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); Ordering ordering; ordering += kx1,kx2,kl1; - GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); + FactorGraph fg = example::createGaussianFactorGraph(ordering); // get some factors from the graph boost::shared_ptr factor1 = fg[0]; diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index c6ec69d4e..ca8b9b1ea 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/tests/testGaussianISAM2.cpp b/tests/testGaussianISAM2.cpp index 67fa287d3..c4b90d882 100644 --- a/tests/testGaussianISAM2.cpp +++ b/tests/testGaussianISAM2.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/tests/testIterative.cpp b/tests/testIterative.cpp index 88eb222bd..09047005e 100644 --- a/tests/testIterative.cpp +++ b/tests/testIterative.cpp @@ -40,7 +40,7 @@ TEST( Iterative, steepestDescent ) // Create factor graph Ordering ord; ord += L(1), X(1), X(2); - JacobianFactorGraph fg = createGaussianFactorGraph(ord); + FactorGraph fg = createGaussianFactorGraph(ord); // eliminate and solve VectorValues expected = *GaussianSequentialSolver(fg).optimize(); diff --git a/tests/testSubgraphPreconditioner.cpp b/tests/testSubgraphPreconditioner.cpp index c41b95881..39c5e2b70 100644 --- a/tests/testSubgraphPreconditioner.cpp +++ b/tests/testSubgraphPreconditioner.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,9 +54,9 @@ TEST( SubgraphPreconditioner, planarOrdering ) { /* ************************************************************************* */ /** unnormalized error */ -static double error(const JacobianFactorGraph& fg, const VectorValues& x) { +static double error(const GaussianFactorGraph& fg, const VectorValues& x) { double total_error = 0.; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) + BOOST_FOREACH(const GaussianFactor::shared_ptr& factor, fg) total_error += factor->error(x); return total_error; } @@ -65,7 +65,7 @@ static double error(const JacobianFactorGraph& fg, const VectorValues& x) { TEST( SubgraphPreconditioner, planarGraph ) { // Check planar graph construction - JacobianFactorGraph A; + GaussianFactorGraph A; VectorValues xtrue; boost::tie(A, xtrue) = planarGraph(3); LONGS_EQUAL(13,A.size()); @@ -82,12 +82,12 @@ TEST( SubgraphPreconditioner, planarGraph ) TEST( SubgraphPreconditioner, splitOffPlanarTree ) { // Build a planar graph - JacobianFactorGraph A; + GaussianFactorGraph A; VectorValues xtrue; boost::tie(A, xtrue) = planarGraph(3); // Get the spanning tree and constraints, and check their sizes - JacobianFactorGraph T, C; + GaussianFactorGraph T, C; boost::tie(T, C) = splitOffPlanarTree(3, A); LONGS_EQUAL(9,T.size()); LONGS_EQUAL(4,C.size()); @@ -103,16 +103,16 @@ TEST( SubgraphPreconditioner, splitOffPlanarTree ) TEST( SubgraphPreconditioner, system ) { // Build a planar graph - JacobianFactorGraph Ab; + GaussianFactorGraph Ab; VectorValues xtrue; size_t N = 3; boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b // Get the spanning tree and corresponding ordering - JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); - SubgraphPreconditioner::sharedFG Ab1(new JacobianFactorGraph(Ab1_)); - SubgraphPreconditioner::sharedFG Ab2(new JacobianFactorGraph(Ab2_)); + SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); + SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); // Eliminate the spanning tree to build a prior SubgraphPreconditioner::sharedBayesNet Rc1 = GaussianSequentialSolver(Ab1_).eliminate(); // R1*x-c1 @@ -179,16 +179,16 @@ TEST( SubgraphPreconditioner, system ) TEST( SubgraphPreconditioner, conjugateGradients ) { // Build a planar graph - JacobianFactorGraph Ab; + GaussianFactorGraph Ab; VectorValues xtrue; size_t N = 3; boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b // Get the spanning tree and corresponding ordering - JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); - SubgraphPreconditioner::sharedFG Ab1(new JacobianFactorGraph(Ab1_)); - SubgraphPreconditioner::sharedFG Ab2(new JacobianFactorGraph(Ab2_)); + SubgraphPreconditioner::sharedFG Ab1(new GaussianFactorGraph(Ab1_)); + SubgraphPreconditioner::sharedFG Ab2(new GaussianFactorGraph(Ab2_)); // Eliminate the spanning tree to build a prior Ordering ordering = planarOrdering(N); diff --git a/tests/testSubgraphSolver.cpp b/tests/testSubgraphSolver.cpp index 84f54a6fa..700f35261 100644 --- a/tests/testSubgraphSolver.cpp +++ b/tests/testSubgraphSolver.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -38,9 +38,9 @@ using namespace example; /* ************************************************************************* */ /** unnormalized error */ -static double error(const JacobianFactorGraph& fg, const VectorValues& x) { +static double error(const GaussianFactorGraph& fg, const VectorValues& x) { double total_error = 0.; - BOOST_FOREACH(const JacobianFactor::shared_ptr& factor, fg) + BOOST_FOREACH(const GaussianFactor::shared_ptr& factor, fg) total_error += factor->error(x); return total_error; } @@ -50,7 +50,7 @@ static double error(const JacobianFactorGraph& fg, const VectorValues& x) { TEST( SubgraphSolver, constructor1 ) { // Build a planar graph - JacobianFactorGraph Ab; + GaussianFactorGraph Ab; VectorValues xtrue; size_t N = 3; boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b @@ -67,13 +67,13 @@ TEST( SubgraphSolver, constructor1 ) TEST( SubgraphSolver, constructor2 ) { // Build a planar graph - JacobianFactorGraph Ab; + GaussianFactorGraph Ab; VectorValues xtrue; size_t N = 3; boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b // Get the spanning tree and corresponding ordering - JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); // The second constructor takes two factor graphs, @@ -88,13 +88,13 @@ TEST( SubgraphSolver, constructor2 ) TEST( SubgraphSolver, constructor3 ) { // Build a planar graph - JacobianFactorGraph Ab; + GaussianFactorGraph Ab; VectorValues xtrue; size_t N = 3; boost::tie(Ab, xtrue) = planarGraph(N); // A*x-b // Get the spanning tree and corresponding ordering - JacobianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 + GaussianFactorGraph Ab1_, Ab2_; // A1*x-b1 and A2*x-b2 boost::tie(Ab1_, Ab2_) = splitOffPlanarTree(N, Ab); // The caller solves |A1*x-b1|^2 == |R1*x-c1|^2 via QR factorization, where R1 is square UT From c4c5dec9a31a7dc75eb770f864e99590dc111d03 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 5 Sep 2012 03:06:22 +0000 Subject: [PATCH 887/914] Fixed testIterative unit tests --- .cproject | 354 ++++++++++++++++------------- gtsam/linear/SubgraphSolver.cpp | 2 +- tests/smallExample.cpp | 4 +- tests/smallExample.h | 2 +- tests/testGaussianFactor.cpp | 15 +- tests/testGaussianFactorGraphB.cpp | 4 +- tests/testGaussianISAM.cpp | 2 +- tests/testIterative.cpp | 208 +++++++---------- 8 files changed, 293 insertions(+), 298 deletions(-) diff --git a/.cproject b/.cproject index 95c0f2a96..df6fdc5f5 100644 --- a/.cproject +++ b/.cproject @@ -309,14 +309,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -343,6 +335,7 @@ make + tests/testBayesTree.run true false @@ -350,6 +343,7 @@ make + testBinaryBayesNet.run true false @@ -397,6 +391,7 @@ make + testSymbolicBayesNet.run true false @@ -404,6 +399,7 @@ make + tests/testSymbolicFactor.run true false @@ -411,6 +407,7 @@ make + testSymbolicFactorGraph.run true false @@ -426,11 +423,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -519,22 +525,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -551,6 +541,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -575,26 +581,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run + -j2 + clean true true true @@ -679,26 +685,26 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run true true true @@ -985,6 +991,7 @@ make + testGraph.run true false @@ -992,6 +999,7 @@ make + testJunctionTree.run true false @@ -999,6 +1007,7 @@ make + testSymbolicBayesNetB.run true false @@ -1028,6 +1037,30 @@ true true + + make + -j5 + testIterative.run + true + true + true + + + make + -j5 + testSubgraphSolver.run + true + true + true + + + make + -j5 + testGaussianFactorGraphB.run + true + true + true + make -j5 @@ -1134,6 +1167,7 @@ make + testErrors.run true false @@ -1179,10 +1213,10 @@ true true - + make - -j2 - testGaussianFactor.run + -j5 + testLinearContainerFactor.run true true true @@ -1267,10 +1301,10 @@ true true - + make - -j5 - testLinearContainerFactor.run + -j2 + testGaussianFactor.run true true true @@ -1605,7 +1639,6 @@ make - testSimulated2DOriented.run true false @@ -1645,7 +1678,6 @@ make - testSimulated2D.run true false @@ -1653,7 +1685,6 @@ make - testSimulated3D.run true false @@ -1845,7 +1876,6 @@ make - tests/testGaussianISAM2 true false @@ -1867,102 +1897,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j1 @@ -2164,6 +2098,7 @@ cpack + -G DEB true false @@ -2171,6 +2106,7 @@ cpack + -G RPM true false @@ -2178,6 +2114,7 @@ cpack + -G TGZ true false @@ -2185,6 +2122,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2318,34 +2256,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2389,6 +2391,38 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index c34f7e22e..9794ba51e 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -101,7 +101,7 @@ boost::tuple SubgraphSolver::splitGraph(const GaussianFactorGraph &jfg) { const VariableIndex index(jfg); - const size_t n = index.size(), m = jfg.size(); + const size_t n = index.size(); DisjointSet D(n) ; GaussianFactorGraph::shared_ptr At(new GaussianFactorGraph()); diff --git a/tests/smallExample.cpp b/tests/smallExample.cpp index 6df106acf..afa878a01 100644 --- a/tests/smallExample.cpp +++ b/tests/smallExample.cpp @@ -138,9 +138,9 @@ namespace example { } /* ************************************************************************* */ - FactorGraph createGaussianFactorGraph(const Ordering& ordering) { + GaussianFactorGraph createGaussianFactorGraph(const Ordering& ordering) { // Create empty graph - FactorGraph fg; + GaussianFactorGraph fg; SharedDiagonal unit2 = noiseModel::Unit::Create(2); diff --git a/tests/smallExample.h b/tests/smallExample.h index 9c43563a3..f87847f24 100644 --- a/tests/smallExample.h +++ b/tests/smallExample.h @@ -65,7 +65,7 @@ namespace gtsam { * create a linear factor graph * The non-linear graph above evaluated at NoisyValues */ - FactorGraph createGaussianFactorGraph(const Ordering& ordering); + GaussianFactorGraph createGaussianFactorGraph(const Ordering& ordering); /** * create small Chordal Bayes Net x <- y diff --git a/tests/testGaussianFactor.cpp b/tests/testGaussianFactor.cpp index a41c8d9a7..f5419b7ff 100644 --- a/tests/testGaussianFactor.cpp +++ b/tests/testGaussianFactor.cpp @@ -57,10 +57,11 @@ TEST( GaussianFactor, linearFactor ) JacobianFactor expected(ordering[kx1], -10*I,ordering[kx2], 10*I, b, noiseModel::Unit::Create(2)); // create a small linear factor graph - FactorGraph fg = example::createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); // get the factor kf2 from the factor graph - JacobianFactor::shared_ptr lf = fg[1]; + JacobianFactor::shared_ptr lf = + boost::dynamic_pointer_cast(fg[1]); // check if the two factors are the same EXPECT(assert_equal(expected,*lf)); @@ -72,7 +73,7 @@ TEST( GaussianFactor, getDim ) const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // get a factor Ordering ordering; ordering += kx1,kx2,kl1; - FactorGraph fg = example::createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); GaussianFactor::shared_ptr factor = fg[0]; // get the size of a variable @@ -89,7 +90,7 @@ TEST( GaussianFactor, error ) const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - FactorGraph fg = example::createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); // get the first factor from the factor graph GaussianFactor::shared_ptr lf = fg[0]; @@ -109,7 +110,7 @@ TEST( GaussianFactor, matrix ) const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - FactorGraph fg = example::createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); // get the factor kf2 from the factor graph //GaussianFactor::shared_ptr lf = fg[1]; // NOTE: using the older version @@ -158,7 +159,7 @@ TEST( GaussianFactor, matrix_aug ) const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); // create a small linear factor graph Ordering ordering; ordering += kx1,kx2,kl1; - FactorGraph fg = example::createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); // get the factor kf2 from the factor graph //GaussianFactor::shared_ptr lf = fg[1]; @@ -210,7 +211,7 @@ TEST( GaussianFactor, size ) // create a linear factor graph const Key kx1 = X(1), kx2 = X(2), kl1 = L(1); Ordering ordering; ordering += kx1,kx2,kl1; - FactorGraph fg = example::createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = example::createGaussianFactorGraph(ordering); // get some factors from the graph boost::shared_ptr factor1 = fg[0]; diff --git a/tests/testGaussianFactorGraphB.cpp b/tests/testGaussianFactorGraphB.cpp index ca8b9b1ea..306c64fb7 100644 --- a/tests/testGaussianFactorGraphB.cpp +++ b/tests/testGaussianFactorGraphB.cpp @@ -369,7 +369,7 @@ TEST( GaussianFactorGraph, multiplication ) // create an ordering Ordering ord; ord += X(2),L(1),X(1); - FactorGraph A = createGaussianFactorGraph(ord); + GaussianFactorGraph A = createGaussianFactorGraph(ord); VectorValues x = createCorrectDelta(ord); Errors actual = A * x; Errors expected; @@ -523,7 +523,7 @@ TEST(GaussianFactorGraph, hasConstraints) EXPECT(hasConstraints(fgc2)); Ordering ordering; ordering += X(1), X(2), L(1); - FactorGraph fg = createGaussianFactorGraph(ordering); + GaussianFactorGraph fg = createGaussianFactorGraph(ordering); EXPECT(!hasConstraints(fg)); } diff --git a/tests/testGaussianISAM.cpp b/tests/testGaussianISAM.cpp index ea91eda5a..74417b57a 100644 --- a/tests/testGaussianISAM.cpp +++ b/tests/testGaussianISAM.cpp @@ -42,7 +42,7 @@ using symbol_shorthand::L; // Some numbers that should be consistent among all smoother tests static double sigmax1 = 0.786153, sigmax2 = 1.0/1.47292, sigmax3 = 0.671512, sigmax4 = - 0.669534, sigmax5 = sigmax3, sigmax6 = sigmax2, sigmax7 = sigmax1; + 0.669534 /*, sigmax5 = sigmax3, sigmax6 = sigmax2*/, sigmax7 = sigmax1; static const double tol = 1e-4; diff --git a/tests/testIterative.cpp b/tests/testIterative.cpp index 09047005e..bfa3a8e79 100644 --- a/tests/testIterative.cpp +++ b/tests/testIterative.cpp @@ -16,13 +16,14 @@ **/ #include +#include +#include +#include #include #include #include -//#include -//#include -#include -//#include +#include +#include #include @@ -32,23 +33,23 @@ using namespace example; using symbol_shorthand::X; // to create pose keys using symbol_shorthand::L; // to create landmark keys -static bool verbose = false; +static ConjugateGradientParameters parameters; +// add following below to add printing: +// parameters.verbosity_ = ConjugateGradientParameters::COMPLEXITY; /* ************************************************************************* */ TEST( Iterative, steepestDescent ) { // Create factor graph - Ordering ord; - ord += L(1), X(1), X(2); - FactorGraph fg = createGaussianFactorGraph(ord); + Ordering ordering; + ordering += L(1), X(1), X(2); + GaussianFactorGraph fg = createGaussianFactorGraph(ordering); // eliminate and solve VectorValues expected = *GaussianSequentialSolver(fg).optimize(); // Do gradient descent VectorValues zero = VectorValues::Zero(expected); // TODO, how do we do this normally? - ConjugateGradientParameters parameters; -// parameters.verbosity_ = ConjugateGradientParameters::COMPLEXITY; VectorValues actual = steepestDescent(fg, zero, parameters); CHECK(assert_equal(expected,actual,1e-2)); } @@ -56,134 +57,93 @@ TEST( Iterative, steepestDescent ) /* ************************************************************************* */ TEST( Iterative, conjugateGradientDescent ) { -// // Expected solution -// Ordering ord; -// ord += L(1), X(1), X(2); -// GaussianFactorGraph fg = createGaussianFactorGraph(); -// VectorValues expected = fg.optimize(ord); // destructive -// -// // create graph and get matrices -// GaussianFactorGraph fg2 = createGaussianFactorGraph(); -// Matrix A; -// Vector b; -// Vector x0 = gtsam::zero(6); -// boost::tie(A, b) = fg2.matrix(ord); -// Vector expectedX = Vector_(6, -0.1, 0.1, -0.1, -0.1, 0.1, -0.2); -// -// // Do conjugate gradient descent, System version -// System Ab(A, b); -// Vector actualX = conjugateGradientDescent(Ab, x0, verbose); -// CHECK(assert_equal(expectedX,actualX,1e-9)); -// -// // Do conjugate gradient descent, Matrix version -// Vector actualX2 = conjugateGradientDescent(A, b, x0, verbose); -// CHECK(assert_equal(expectedX,actualX2,1e-9)); -// -// // Do conjugate gradient descent on factor graph -// VectorValues zero = createZeroDelta(); -// VectorValues actual = conjugateGradientDescent(fg2, zero, verbose); -// CHECK(assert_equal(expected,actual,1e-2)); -// -// // Test method -// VectorValues actual2 = fg2.conjugateGradientDescent(zero, verbose); -// CHECK(assert_equal(expected,actual2,1e-2)); + // Create factor graph + Ordering ordering; + ordering += L(1), X(1), X(2); + GaussianFactorGraph fg = createGaussianFactorGraph(ordering); + + // eliminate and solve + VectorValues expected = *GaussianSequentialSolver(fg).optimize(); + + // get matrices + Matrix A; + Vector b; + Vector x0 = gtsam::zero(6); + boost::tie(A, b) = fg.jacobian(); + Vector expectedX = Vector_(6, -0.1, 0.1, -0.1, -0.1, 0.1, -0.2); + + // Do conjugate gradient descent, System version + System Ab(A, b); + Vector actualX = conjugateGradientDescent(Ab, x0, parameters); + CHECK(assert_equal(expectedX,actualX,1e-9)); + + // Do conjugate gradient descent, Matrix version + Vector actualX2 = conjugateGradientDescent(A, b, x0, parameters); + CHECK(assert_equal(expectedX,actualX2,1e-9)); + + // Do conjugate gradient descent on factor graph + VectorValues zero = VectorValues::Zero(expected); + VectorValues actual = conjugateGradientDescent(fg, zero, parameters); + CHECK(assert_equal(expected,actual,1e-2)); } /* ************************************************************************* */ -/*TEST( Iterative, conjugateGradientDescent_hard_constraint ) +TEST( Iterative, conjugateGradientDescent_hard_constraint ) { - typedef Pose2Values::Key Key; + Values config; + Pose2 pose1 = Pose2(0.,0.,0.); + config.insert(X(1), pose1); + config.insert(X(2), Pose2(1.5,0.,0.)); - Pose2Values config; - config.insert(1, Pose2(0.,0.,0.)); - config.insert(2, Pose2(1.5,0.,0.)); + NonlinearFactorGraph graph; + graph.add(NonlinearEquality(X(1), pose1)); + graph.add(BetweenFactor(X(1),X(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1))); - Pose2Graph graph; - Matrix cov = eye(3); - graph.push_back(Pose2Graph::sharedFactor(new Pose2Factor(Key(1), Key(2), Pose2(1.,0.,0.), cov))); - graph.addHardConstraint(1, config[1]); + Ordering ordering; + ordering += X(1), X(2); + boost::shared_ptr fg = graph.linearize(config,ordering); - VectorValues zeros; - zeros.insert(X(1),zero(3)); - zeros.insert(X(2),zero(3)); + VectorValues zeros = VectorValues::Zero(2, 3); - GaussianFactorGraph fg = graph.linearize(config); - VectorValues actual = conjugateGradientDescent(fg, zeros, true, 1e-3, 1e-5, 10); + ConjugateGradientParameters parameters; + parameters.setEpsilon_abs(1e-3); + parameters.setEpsilon_rel(1e-5); + parameters.setMaxIterations(100); + VectorValues actual = conjugateGradientDescent(*fg, zeros, parameters); - VectorValues expected; - expected.insert(X(1), zero(3)); - expected.insert(X(2), Vector_(-0.5,0.,0.)); - CHECK(assert_equal(expected, actual)); -}*/ + VectorValues expected; + expected.insert(0, zero(3)); + expected.insert(1, Vector_(3,-0.5,0.,0.)); + CHECK(assert_equal(expected, actual)); +} /* ************************************************************************* */ TEST( Iterative, conjugateGradientDescent_soft_constraint ) { -// Pose2Values config; -// config.insert(1, Pose2(0.,0.,0.)); -// config.insert(2, Pose2(1.5,0.,0.)); -// -// Pose2Graph graph; -// graph.addPrior(1, Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); -// graph.addConstraint(1,2, Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); -// -// VectorValues zeros; -// zeros.insert(X(1),zero(3)); -// zeros.insert(X(2),zero(3)); -// -// boost::shared_ptr fg = graph.linearize(config); -// VectorValues actual = conjugateGradientDescent(*fg, zeros, verbose, 1e-3, 1e-5, 100); -// -// VectorValues expected; -// expected.insert(X(1), zero(3)); -// expected.insert(X(2), Vector_(3,-0.5,0.,0.)); -// CHECK(assert_equal(expected, actual)); -} + Values config; + config.insert(X(1), Pose2(0.,0.,0.)); + config.insert(X(2), Pose2(1.5,0.,0.)); -/* ************************************************************************* */ -TEST( Iterative, subgraphPCG ) -{ -// typedef Pose2Values::Key Key; -// -// Pose2Values theta_bar; -// theta_bar.insert(1, Pose2(0.,0.,0.)); -// theta_bar.insert(2, Pose2(1.5,0.,0.)); -// -// Pose2Graph graph; -// graph.addPrior(1, Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10)); -// graph.addConstraint(1,2, Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1)); -// -// // generate spanning tree and create ordering -// PredecessorMap tree = graph.findMinimumSpanningTree(); -// list keys = predecessorMap2Keys(tree); -// list symbols; -// symbols.resize(keys.size()); -// std::transform(keys.begin(), keys.end(), symbols.begin(), key2symbol); -// Ordering ordering(symbols); -// -// Key root = keys.back(); -// Pose2Graph T, C; -// graph.split(tree, T, C); -// -// // build the subgraph PCG system -// boost::shared_ptr Ab1_ = T.linearize(theta_bar); -// SubgraphPreconditioner::sharedFG Ab1 = T.linearize(theta_bar); -// SubgraphPreconditioner::sharedFG Ab2 = C.linearize(theta_bar); -// SubgraphPreconditioner::sharedBayesNet Rc1 = Ab1_->eliminate_(ordering); -// SubgraphPreconditioner::sharedValues xbar = optimize_(*Rc1); -// SubgraphPreconditioner system(Ab1, Ab2, Rc1, xbar); -// -// VectorValues zeros = VectorValues::zero(*xbar); -// -// // Solve the subgraph PCG -// VectorValues ybar = conjugateGradients (system, zeros, verbose, 1e-5, 1e-5, 100); -// VectorValues actual = system.x(ybar); -// -// VectorValues expected; -// expected.insert(X(1), zero(3)); -// expected.insert(X(2), Vector_(3, -0.5, 0., 0.)); -// CHECK(assert_equal(expected, actual)); + NonlinearFactorGraph graph; + graph.add(PriorFactor(X(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3, 1e-10))); + graph.add(BetweenFactor(X(1),X(2), Pose2(1.,0.,0.), noiseModel::Isotropic::Sigma(3, 1))); + + Ordering ordering; + ordering += X(1), X(2); + boost::shared_ptr fg = graph.linearize(config,ordering); + + VectorValues zeros = VectorValues::Zero(2, 3); + + ConjugateGradientParameters parameters; + parameters.setEpsilon_abs(1e-3); + parameters.setEpsilon_rel(1e-5); + parameters.setMaxIterations(100); + VectorValues actual = conjugateGradientDescent(*fg, zeros, parameters); + + VectorValues expected; + expected.insert(0, zero(3)); + expected.insert(1, Vector_(3,-0.5,0.,0.)); + CHECK(assert_equal(expected, actual)); } /* ************************************************************************* */ From 7266293a6129717a8ceb698676d554bc975a36f1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 5 Sep 2012 03:52:01 +0000 Subject: [PATCH 888/914] Cleaned up some remaining JacobinaFactorGraph remnants --- tests/smallExample.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/tests/smallExample.cpp b/tests/smallExample.cpp index afa878a01..71c8269e9 100644 --- a/tests/smallExample.cpp +++ b/tests/smallExample.cpp @@ -459,12 +459,7 @@ namespace example { // linearize around zero boost::shared_ptr gfg = nlfg.linearize(zeros, ordering); - - GaussianFactorGraph jfg; - BOOST_FOREACH(GaussianFactorGraph::sharedFactor factor, *gfg) - jfg.push_back(boost::dynamic_pointer_cast(factor)); - - return boost::make_tuple(jfg, xtrue); + return boost::make_tuple(*gfg, xtrue); } /* ************************************************************************* */ @@ -482,21 +477,21 @@ namespace example { GaussianFactorGraph T, C; // Add the x11 constraint to the tree - T.push_back(boost::dynamic_pointer_cast(original[0])); + T.push_back(original[0]); // Add all horizontal constraints to the tree size_t i = 1; for (size_t x = 1; x < N; x++) for (size_t y = 1; y <= N; y++, i++) - T.push_back(boost::dynamic_pointer_cast(original[i])); + T.push_back(original[i]); // Add first vertical column of constraints to T, others to C for (size_t x = 1; x <= N; x++) for (size_t y = 1; y < N; y++, i++) if (x == 1) - T.push_back(boost::dynamic_pointer_cast(original[i])); + T.push_back(original[i]); else - C.push_back(boost::dynamic_pointer_cast(original[i])); + C.push_back(original[i]); return make_pair(T, C); } From 6c2f213091f9e7fef90eea567c2a506281c0ffb8 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 5 Sep 2012 15:03:35 +0000 Subject: [PATCH 889/914] 1. use DSFVector for spanning tree in SubgraphSolver 2. move DSFVector from unstable to stable 3. create Dummy.cpp to prevent base_unstable degenerate --- {gtsam_unstable => gtsam}/base/DSFVector.cpp | 2 +- {gtsam_unstable => gtsam}/base/DSFVector.h | 0 .../base/tests/testDSFVector.cpp | 2 +- gtsam/linear/SubgraphSolver.cpp | 56 ++----------------- gtsam/linear/SubgraphSolver.h | 25 --------- gtsam_unstable/base/Dummy.cpp | 43 ++++++++++++++ gtsam_unstable/base/Dummy.h | 22 ++------ 7 files changed, 55 insertions(+), 95 deletions(-) rename {gtsam_unstable => gtsam}/base/DSFVector.cpp (98%) rename {gtsam_unstable => gtsam}/base/DSFVector.h (100%) rename {gtsam_unstable => gtsam}/base/tests/testDSFVector.cpp (99%) create mode 100644 gtsam_unstable/base/Dummy.cpp diff --git a/gtsam_unstable/base/DSFVector.cpp b/gtsam/base/DSFVector.cpp similarity index 98% rename from gtsam_unstable/base/DSFVector.cpp rename to gtsam/base/DSFVector.cpp index cdea89f34..6d79dcb53 100644 --- a/gtsam_unstable/base/DSFVector.cpp +++ b/gtsam/base/DSFVector.cpp @@ -18,7 +18,7 @@ #include #include -#include +#include using namespace std; diff --git a/gtsam_unstable/base/DSFVector.h b/gtsam/base/DSFVector.h similarity index 100% rename from gtsam_unstable/base/DSFVector.h rename to gtsam/base/DSFVector.h diff --git a/gtsam_unstable/base/tests/testDSFVector.cpp b/gtsam/base/tests/testDSFVector.cpp similarity index 99% rename from gtsam_unstable/base/tests/testDSFVector.cpp rename to gtsam/base/tests/testDSFVector.cpp index 8997559f5..c0b72f1a0 100644 --- a/gtsam_unstable/base/tests/testDSFVector.cpp +++ b/gtsam/base/tests/testDSFVector.cpp @@ -24,7 +24,7 @@ using namespace boost::assign; #include -#include +#include using namespace std; using namespace gtsam; diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 9794ba51e..47d33831b 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -102,7 +103,7 @@ SubgraphSolver::splitGraph(const GaussianFactorGraph &jfg) { const VariableIndex index(jfg); const size_t n = index.size(); - DisjointSet D(n) ; + DSFVector D(n); GaussianFactorGraph::shared_ptr At(new GaussianFactorGraph()); GaussianFactorGraph::shared_ptr Ac( new GaussianFactorGraph()); @@ -126,10 +127,10 @@ SubgraphSolver::splitGraph(const GaussianFactorGraph &jfg) { if ( jf->keys().size() == 1 ) augment = true; else { const Index u = jf->keys()[0], v = jf->keys()[1], - u_root = D.find(u), v_root = D.find(v); + u_root = D.findSet(u), v_root = D.findSet(v); if ( u_root != v_root ) { t++; augment = true ; - D.makeUnion(u_root, v_root); + D.makeUnionInPlace(u_root, v_root); } } if ( augment ) At->push_back(jf); @@ -139,53 +140,4 @@ SubgraphSolver::splitGraph(const GaussianFactorGraph &jfg) { return boost::tie(At, Ac); } - -SubgraphSolver::DisjointSet::DisjointSet(const size_t n):n_(n),rank_(n,1),parent_(n) { - for ( Index i = 0 ; i < n ; ++i ) parent_[i] = i ; -} - -Index SubgraphSolver::DisjointSet::makeUnion(const Index &u, const Index &v) { - - Index u_root = find(u), v_root = find(v) ; - Index u_rank = rank(u), v_rank = rank(v) ; - - if ( u_root != v_root ) { - if ( v_rank > u_rank ) { - parent_[u_root] = v_root ; - rank_[v_root] += rank_[u_root] ; - return v_root ; - } - else { - parent_[v_root] = u_root ; - rank_[u_root] += rank_[v_root] ; - return u_root ; - } - } - return u_root ; -} - -Index SubgraphSolver::DisjointSet::find(const Index &u) { - vector path ; - Index x = u; - Index x_root = parent_[x] ; - - // find the root, and keep the vertices along the path - while ( x != x_root ) { - path.push_back(x) ; - x = x_root ; - x_root = parent_[x] ; - } - - // path compression - BOOST_FOREACH(const Index &i, path) { - rank_[i] = 1 ; - parent_[i] = x_root ; - } - - return x_root ; -} - - - - } // \namespace gtsam diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index 441fdaeef..7c60c0588 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -82,31 +82,6 @@ protected: boost::tuple splitGraph(const GaussianFactorGraph &gfg) ; - -public: - - // a simplfied implementation of disjoint set data structure. - class DisjointSet { - protected: - size_t n_ ; - std::vector rank_ ; - std::vector parent_ ; - - public: - // initialize a disjoint set, point every vertex to itself - DisjointSet(const size_t n) ; - inline size_t size() const { return n_ ; } - - // union the root of u and and the root of v, return the root of u and v - Index makeUnion(const Index &u, const Index &v) ; - - // return the root of u - Index find(const Index &u) ; - - // return the rank of x, which is defined as the cardinality of the set containing x - inline size_t rank(const Index &x) {return rank_[find(x)] ;} - }; - }; } // namespace gtsam diff --git a/gtsam_unstable/base/Dummy.cpp b/gtsam_unstable/base/Dummy.cpp new file mode 100644 index 000000000..90d71d27e --- /dev/null +++ b/gtsam_unstable/base/Dummy.cpp @@ -0,0 +1,43 @@ +/* ---------------------------------------------------------------------------- + + * 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 Dummy.h + * @brief Dummy class for testing MATLAB memory allocation + * @author Andrew Melim + * @author Frank Dellaert + * @date June 14, 2012 + */ + +#include +#include + +namespace gtsam { + +static size_t gDummyCount = 0; + +Dummy::Dummy():id(++gDummyCount) { + std::cout << "Dummy constructor " << id << std::endl; +} + +Dummy::~Dummy() { + std::cout << "Dummy destructor " << id << std::endl; +} + +void Dummy::print(const std::string& s) const { + std::cout << s << "Dummy " << id << std::endl; +} + +unsigned char Dummy::dummyTwoVar(unsigned char a) const { + return a; +} + +} diff --git a/gtsam_unstable/base/Dummy.h b/gtsam_unstable/base/Dummy.h index 995186cd6..0ab344f74 100644 --- a/gtsam_unstable/base/Dummy.h +++ b/gtsam_unstable/base/Dummy.h @@ -17,26 +17,16 @@ * @date June 14, 2012 */ -namespace gtsam { +#include - static size_t gDummyCount; +namespace gtsam { struct Dummy { size_t id; - Dummy():id(++gDummyCount) { - std::cout << "Dummy constructor " << id << std::endl; - } - ~Dummy() { - std::cout << "Dummy destructor " << id << std::endl; - } - void print(const std::string& s="") const { - std::cout << s << "Dummy " << id << std::endl; - } - - unsigned char dummyTwoVar(unsigned char a) const { - return a; - } - + Dummy(); + ~Dummy(); + void print(const std::string& s="") const ; + unsigned char dummyTwoVar(unsigned char a) const ; }; } // namespace gtsam From 4443752a18165495c1f705d6955db491416b2700 Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Wed, 5 Sep 2012 17:04:48 +0000 Subject: [PATCH 890/914] clean the gfg to jfg conversion code --- gtsam/linear/GaussianFactorGraph.cpp | 73 ++++++++-------------------- gtsam/linear/GaussianFactorGraph.h | 4 +- gtsam/linear/JacobianFactor.cpp | 9 ++++ gtsam/linear/JacobianFactor.h | 4 +- gtsam/linear/SubgraphSolver.cpp | 6 +-- 5 files changed, 36 insertions(+), 60 deletions(-) diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index 14d558e62..ad31bd9e5 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -521,15 +521,14 @@ break; } // \EliminatePreferCholesky + + + /* ************************************************************************* */ Errors operator*(const GaussianFactorGraph& fg, const VectorValues& x) { Errors e; BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); e.push_back((*Ai)*x); } return e; @@ -544,12 +543,8 @@ break; void multiplyInPlace(const GaussianFactorGraph& fg, const VectorValues& x, const Errors::iterator& e) { Errors::iterator ei = e; BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - *ei = (*Ai)*x; + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + *ei = (*Ai)*x; ei++; } } @@ -560,12 +555,8 @@ break; // For each factor add the gradient contribution Errors::const_iterator ei = e.begin(); BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - Ai->transposeMultiplyAdd(alpha,*(ei++),x); + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + Ai->transposeMultiplyAdd(alpha,*(ei++),x); } } @@ -575,12 +566,8 @@ break; VectorValues g = VectorValues::Zero(x0); Errors e; BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - e.push_back(Ai->error_vector(x0)); + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + e.push_back(Ai->error_vector(x0)); } transposeMultiplyAdd(fg, 1.0, e, g); return g; @@ -592,12 +579,8 @@ break; g.setZero(); Errors e; BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - e.push_back(-Ai->getb()); + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + e.push_back(-Ai->getb()); } transposeMultiplyAdd(fg, 1.0, e, g); } @@ -606,12 +589,8 @@ break; void residual(const GaussianFactorGraph& fg, const VectorValues &x, VectorValues &r) { Index i = 0 ; BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - r[i] = Ai->getb(); + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + r[i] = Ai->getb(); i++; } VectorValues Ax = VectorValues::SameStructure(r); @@ -624,12 +603,8 @@ break; r.vector() = Vector::Zero(r.dim()); Index i = 0; BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - SubVector &y = r[i]; + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + SubVector &y = r[i]; for(JacobianFactor::const_iterator j = Ai->begin(); j != Ai->end(); ++j) { y += Ai->getA(j) * x[*j]; } @@ -642,12 +617,8 @@ break; x.vector() = Vector::Zero(x.dim()); Index i = 0; BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - for(JacobianFactor::const_iterator j = Ai->begin(); j != Ai->end(); ++j) { + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + for(JacobianFactor::const_iterator j = Ai->begin(); j != Ai->end(); ++j) { x[*j] += Ai->getA(j).transpose() * r[i]; } ++i; @@ -658,12 +629,8 @@ break; boost::shared_ptr gaussianErrors_(const GaussianFactorGraph& fg, const VectorValues& x) { boost::shared_ptr e(new Errors); BOOST_FOREACH(const GaussianFactor::shared_ptr& Ai_G, fg) { - JacobianFactor::shared_ptr Ai; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(Ai_G)) - Ai = Ai_J; - else - Ai = boost::make_shared(*Ai_G); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - e->push_back(Ai->error_vector(x)); + JacobianFactor::shared_ptr Ai = convertToJacobianFactorPtr(Ai_G); + e->push_back(Ai->error_vector(x)); } return e; } diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 6c06e34c0..5e6e792be 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -303,7 +303,9 @@ namespace gtsam { */ GaussianFactorGraph::EliminationResult EliminateCholesky(const FactorGraph< GaussianFactor>& factors, size_t nrFrontals = 1); - + + /****** Linear Algebra Opeations ******/ + /** return A*x */ Errors operator*(const GaussianFactorGraph& fg, const VectorValues& x); diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index 759be4948..c0aefab39 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -489,4 +489,13 @@ namespace gtsam { return description_.c_str(); } + /* ************************************************************************* */ + JacobianFactor::shared_ptr convertToJacobianFactorPtr(const GaussianFactor::shared_ptr &gf) { + JacobianFactor::shared_ptr result = boost::dynamic_pointer_cast(gf); + if( !result ) { + result = boost::make_shared(*gf); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + } + return result; + } + } diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index def36b086..1c73f621a 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -322,8 +322,10 @@ namespace gtsam { ar & BOOST_SERIALIZATION_NVP(model_); ar & BOOST_SERIALIZATION_NVP(matrix_); } - }; // JacobianFactor + /** cast from GaussianFactor::shared_ptr to JacobianFactor::shared_ptr */ + JacobianFactor::shared_ptr convertToJacobianFactorPtr(const GaussianFactor::shared_ptr &gf); + } // gtsam diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 47d33831b..4cb95c404 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -111,11 +111,7 @@ SubgraphSolver::splitGraph(const GaussianFactorGraph &jfg) { size_t t = 0; BOOST_FOREACH ( const GaussianFactor::shared_ptr &gf, jfg ) { - JacobianFactor::shared_ptr jf; - if(JacobianFactor::shared_ptr Ai_J = boost::dynamic_pointer_cast(gf)) - jf = Ai_J; - else - jf = boost::make_shared(*gf); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + JacobianFactor::shared_ptr jf = convertToJacobianFactorPtr(gf); if ( jf->keys().size() > 2 ) { throw runtime_error("SubgraphSolver::splitGraph the graph is not simple, sanity check failed "); From 574a9711ccf83ba71660470fab5f7eed30d0751f Mon Sep 17 00:00:00 2001 From: Yong-Dian Jian Date: Thu, 6 Sep 2012 01:21:15 +0000 Subject: [PATCH 891/914] add a conversion function from GaussianFactorGraph to JacobianFactorGraph --- gtsam/linear/GaussianFactorGraph.cpp | 9 +++++++++ gtsam/linear/GaussianFactorGraph.h | 3 +++ gtsam/linear/SubgraphPreconditioner.cpp | 4 +--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index ad31bd9e5..eda9732b2 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -635,4 +635,13 @@ break; return e; } + /* ************************************************************************* */ + GaussianFactorGraph::shared_ptr convertToJacobianFactors(const GaussianFactorGraph &gfg) { + GaussianFactorGraph::shared_ptr result(new GaussianFactorGraph()); + BOOST_FOREACH(const GaussianFactor::shared_ptr &gf, gfg) { + result->push_back(convertToJacobianFactorPtr(gf)); + } + return result; + } + } // namespace gtsam diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 5e6e792be..b6486b3a6 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -354,4 +354,7 @@ namespace gtsam { inline Errors gaussianErrors(const GaussianFactorGraph& fg, const VectorValues& x) { return *gaussianErrors_(fg, x); } + /** Convert all factors to JacobianFactor */ + GaussianFactorGraph::shared_ptr convertToJacobianFactors(const GaussianFactorGraph &gfg); + } // namespace gtsam diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp index 72aa25554..04eed29d2 100644 --- a/gtsam/linear/SubgraphPreconditioner.cpp +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -17,8 +17,6 @@ #include #include -#include - #include using namespace std; @@ -28,7 +26,7 @@ namespace gtsam { /* ************************************************************************* */ SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab2, const sharedBayesNet& Rc1, const sharedValues& xbar) : - Ab2_(Ab2), Rc1_(Rc1), xbar_(xbar), b2bar_(new Errors(-gaussianErrors(*Ab2_,*xbar))) { + Ab2_(convertToJacobianFactors(*Ab2)), Rc1_(Rc1), xbar_(xbar), b2bar_(new Errors(-gaussianErrors(*Ab2_,*xbar))) { } /* ************************************************************************* */ From 1322b7e49d982c9bfd364507380b86bce014e26e Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 6 Sep 2012 14:33:40 +0000 Subject: [PATCH 892/914] Fixed size checking bug --- gtsam/inference/FactorGraph-inl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/inference/FactorGraph-inl.h b/gtsam/inference/FactorGraph-inl.h index 97a7fa1c6..04490dbc6 100644 --- a/gtsam/inference/FactorGraph-inl.h +++ b/gtsam/inference/FactorGraph-inl.h @@ -100,7 +100,7 @@ namespace gtsam { ++ firstIndex; // Check that number of variables is in bounds - if(firstIndex + nFrontals >= variableIndex.size()) + if(firstIndex + nFrontals > variableIndex.size()) throw std::invalid_argument("Requested to eliminate more frontal variables than exist in the factor graph."); // Get set of involved factors From ce3c774bfa9ae72da9c906a835d0a3e53fae0213 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 6 Sep 2012 14:33:42 +0000 Subject: [PATCH 893/914] Added non-const HessianFactor matrix block accessors and inlined all matrix block accessors for speed --- gtsam/linear/HessianFactor.cpp | 10 --------- gtsam/linear/HessianFactor.h | 37 ++++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index a44f5c682..e152738fb 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -307,16 +307,6 @@ bool HessianFactor::equals(const GaussianFactor& lf, double tol) const { } } -/* ************************************************************************* */ -double HessianFactor::constantTerm() const { - return info_(this->size(), this->size())(0,0); -} - -/* ************************************************************************* */ -HessianFactor::constColumn HessianFactor::linearTerm() const { - return info_.rangeColumn(0, this->size(), this->size(), 0); -} - /* ************************************************************************* */ Matrix HessianFactor::computeInformation() const { return info_.full().selfadjointView(); diff --git a/gtsam/linear/HessianFactor.h b/gtsam/linear/HessianFactor.h index 2e9b67c2a..9e4ed2074 100644 --- a/gtsam/linear/HessianFactor.h +++ b/gtsam/linear/HessianFactor.h @@ -242,16 +242,39 @@ namespace gtsam { */ constBlock info(const_iterator j1, const_iterator j2) const { return info_(j1-begin(), j2-begin()); } + /** Return a view of the block at (j1,j2) of the upper-triangular part of the + * information matrix \f$ H \f$, no data is copied. See HessianFactor class documentation + * above to explain that only the upper-triangular part of the information matrix is stored + * and returned by this function. + * @param j1 Which block row to get, as an iterator pointing to the slot in this factor. You can + * use, for example, begin() + 2 to get the 3rd variable in this factor. + * @param j2 Which block column to get, as an iterator pointing to the slot in this factor. You can + * use, for example, begin() + 2 to get the 3rd variable in this factor. + * @return A view of the requested block, not a copy. + */ + Block info(iterator j1, iterator j2) { return info_(j1-begin(), j2-begin()); } + /** Return the upper-triangular part of the full *augmented* information matrix, * as described above. See HessianFactor class documentation above to explain that only the * upper-triangular part of the information matrix is stored and returned by this function. */ constBlock info() const { return info_.full(); } + /** Return the upper-triangular part of the full *augmented* information matrix, + * as described above. See HessianFactor class documentation above to explain that only the + * upper-triangular part of the information matrix is stored and returned by this function. + */ + Block info() { return info_.full(); } + /** Return the constant term \f$ f \f$ as described above * @return The constant term \f$ f \f$ */ - double constantTerm() const; + double constantTerm() const { return info_(this->size(), this->size())(0,0); } + + /** Return the constant term \f$ f \f$ as described above + * @return The constant term \f$ f \f$ + */ + double& constantTerm() { return info_(this->size(), this->size())(0,0); } /** Return the part of linear term \f$ g \f$ as described above corresponding to the requested variable. * @param j Which block row to get, as an iterator pointing to the slot in this factor. You can @@ -259,9 +282,19 @@ namespace gtsam { * @return The linear term \f$ g \f$ */ constColumn linearTerm(const_iterator j) const { return info_.column(j-begin(), size(), 0); } + /** Return the part of linear term \f$ g \f$ as described above corresponding to the requested variable. + * @param j Which block row to get, as an iterator pointing to the slot in this factor. You can + * use, for example, begin() + 2 to get the 3rd variable in this factor. + * @return The linear term \f$ g \f$ */ + Column linearTerm(iterator j) { return info_.column(j-begin(), size(), 0); } + /** Return the complete linear term \f$ g \f$ as described above. * @return The linear term \f$ g \f$ */ - constColumn linearTerm() const; + constColumn linearTerm() const { return info_.rangeColumn(0, this->size(), this->size(), 0); } + + /** Return the complete linear term \f$ g \f$ as described above. + * @return The linear term \f$ g \f$ */ + Column linearTerm() { return info_.rangeColumn(0, this->size(), this->size(), 0); } /** Return the augmented information matrix represented by this GaussianFactor. * The augmented information matrix contains the information matrix with an From 6d1b86c2e04ffd185171cc8d156deb650f8285f3 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 6 Sep 2012 14:33:44 +0000 Subject: [PATCH 894/914] Moved JacobianFactor type check/conversion functions into SubgraphSolver instead of GaussianFactorGraph and JacobianFactor --- gtsam/linear/GaussianFactorGraph.cpp | 17 ++++++++--------- gtsam/linear/GaussianFactorGraph.h | 3 --- gtsam/linear/JacobianFactor.cpp | 9 --------- gtsam/linear/JacobianFactor.h | 3 --- gtsam/linear/SubgraphPreconditioner.cpp | 13 +++++++++++++ gtsam/linear/SubgraphPreconditioner.h | 1 - gtsam/linear/SubgraphSolver.cpp | 12 +++++------- 7 files changed, 26 insertions(+), 32 deletions(-) diff --git a/gtsam/linear/GaussianFactorGraph.cpp b/gtsam/linear/GaussianFactorGraph.cpp index eda9732b2..222f025a0 100644 --- a/gtsam/linear/GaussianFactorGraph.cpp +++ b/gtsam/linear/GaussianFactorGraph.cpp @@ -523,6 +523,14 @@ break; + /* ************************************************************************* */ + static JacobianFactor::shared_ptr convertToJacobianFactorPtr(const GaussianFactor::shared_ptr &gf) { + JacobianFactor::shared_ptr result = boost::dynamic_pointer_cast(gf); + if( !result ) { + result = boost::make_shared(*gf); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + } + return result; + } /* ************************************************************************* */ Errors operator*(const GaussianFactorGraph& fg, const VectorValues& x) { @@ -635,13 +643,4 @@ break; return e; } - /* ************************************************************************* */ - GaussianFactorGraph::shared_ptr convertToJacobianFactors(const GaussianFactorGraph &gfg) { - GaussianFactorGraph::shared_ptr result(new GaussianFactorGraph()); - BOOST_FOREACH(const GaussianFactor::shared_ptr &gf, gfg) { - result->push_back(convertToJacobianFactorPtr(gf)); - } - return result; - } - } // namespace gtsam diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index b6486b3a6..5e6e792be 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -354,7 +354,4 @@ namespace gtsam { inline Errors gaussianErrors(const GaussianFactorGraph& fg, const VectorValues& x) { return *gaussianErrors_(fg, x); } - /** Convert all factors to JacobianFactor */ - GaussianFactorGraph::shared_ptr convertToJacobianFactors(const GaussianFactorGraph &gfg); - } // namespace gtsam diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index c0aefab39..759be4948 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -489,13 +489,4 @@ namespace gtsam { return description_.c_str(); } - /* ************************************************************************* */ - JacobianFactor::shared_ptr convertToJacobianFactorPtr(const GaussianFactor::shared_ptr &gf) { - JacobianFactor::shared_ptr result = boost::dynamic_pointer_cast(gf); - if( !result ) { - result = boost::make_shared(*gf); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) - } - return result; - } - } diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index 1c73f621a..f2bd9c75d 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -324,8 +324,5 @@ namespace gtsam { } }; // JacobianFactor - /** cast from GaussianFactor::shared_ptr to JacobianFactor::shared_ptr */ - JacobianFactor::shared_ptr convertToJacobianFactorPtr(const GaussianFactor::shared_ptr &gf); - } // gtsam diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp index 04eed29d2..8b5a3708f 100644 --- a/gtsam/linear/SubgraphPreconditioner.cpp +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -22,6 +22,19 @@ using namespace std; namespace gtsam { + + /* ************************************************************************* */ + static GaussianFactorGraph::shared_ptr convertToJacobianFactors(const GaussianFactorGraph &gfg) { + GaussianFactorGraph::shared_ptr result(new GaussianFactorGraph()); + BOOST_FOREACH(const GaussianFactor::shared_ptr &gf, gfg) { + JacobianFactor::shared_ptr jf = boost::dynamic_pointer_cast(gf); + if( !jf ) { + jf = boost::make_shared(*gf); // Convert any non-Jacobian factors to Jacobians (e.g. Hessian -> Jacobian with Cholesky) + } + result->push_back(jf); + } + return result; + } /* ************************************************************************* */ SubgraphPreconditioner::SubgraphPreconditioner(const sharedFG& Ab2, diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h index db7c023ce..f266928d7 100644 --- a/gtsam/linear/SubgraphPreconditioner.h +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -33,7 +33,6 @@ namespace gtsam { class SubgraphPreconditioner { public: - typedef boost::shared_ptr shared_ptr; typedef boost::shared_ptr sharedBayesNet; typedef boost::shared_ptr sharedFG; diff --git a/gtsam/linear/SubgraphSolver.cpp b/gtsam/linear/SubgraphSolver.cpp index 4cb95c404..9986fb76c 100644 --- a/gtsam/linear/SubgraphSolver.cpp +++ b/gtsam/linear/SubgraphSolver.cpp @@ -111,26 +111,24 @@ SubgraphSolver::splitGraph(const GaussianFactorGraph &jfg) { size_t t = 0; BOOST_FOREACH ( const GaussianFactor::shared_ptr &gf, jfg ) { - JacobianFactor::shared_ptr jf = convertToJacobianFactorPtr(gf); - - if ( jf->keys().size() > 2 ) { + if ( gf->keys().size() > 2 ) { throw runtime_error("SubgraphSolver::splitGraph the graph is not simple, sanity check failed "); } bool augment = false ; /* check whether this factor should be augmented to the "tree" graph */ - if ( jf->keys().size() == 1 ) augment = true; + if ( gf->keys().size() == 1 ) augment = true; else { - const Index u = jf->keys()[0], v = jf->keys()[1], + const Index u = gf->keys()[0], v = gf->keys()[1], u_root = D.findSet(u), v_root = D.findSet(v); if ( u_root != v_root ) { t++; augment = true ; D.makeUnionInPlace(u_root, v_root); } } - if ( augment ) At->push_back(jf); - else Ac->push_back(jf); + if ( augment ) At->push_back(gf); + else Ac->push_back(gf); } return boost::tie(At, Ac); From 0dc05f5d4e8ab793f2a624f1f622fc66ed4e3ab8 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 6 Sep 2012 15:02:08 +0000 Subject: [PATCH 895/914] Updated matlab package scripts --- package_scripts/compile_static_boost.sh | 8 ++++++++ package_scripts/toolbox_package_unix.sh | 2 ++ 2 files changed, 10 insertions(+) create mode 100644 package_scripts/compile_static_boost.sh diff --git a/package_scripts/compile_static_boost.sh b/package_scripts/compile_static_boost.sh new file mode 100644 index 000000000..466283044 --- /dev/null +++ b/package_scripts/compile_static_boost.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# Compile boost statically, with -fPIC to allow linking it into the mex +# module (which is a dynamic library). --disable-icu prevents depending +# on libicu, which is unneeded and would require then linking the mex +# module with it as well. We just stage instead of install, then the +# toolbox_package_unix.sh script uses the staged boost. +./b2 link=static threading=multi cxxflags=-fPIC cflags=-fPIC --disable-icu -a stage \ No newline at end of file diff --git a/package_scripts/toolbox_package_unix.sh b/package_scripts/toolbox_package_unix.sh index b78649e15..6f5cda526 100644 --- a/package_scripts/toolbox_package_unix.sh +++ b/package_scripts/toolbox_package_unix.sh @@ -7,6 +7,8 @@ if [ "$os" = "Linux" -a "$arch" = "x86_64" ]; then platform=lin64 elif [ "$os" = "Linux" -a "$arch" = "i686" ]; then platform=lin32 +elif [ "$os" = "Darwin" -a "$arch" = "x86_64" ]; then + platform=mac64 else echo "Unrecognized platform" exit 1 From 453c5132e13e9b67b70688633ad74da5e34b5f5a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 6 Sep 2012 18:01:54 +0000 Subject: [PATCH 896/914] Adjusted test tolerance to pass on 32-bit systems --- gtsam/base/tests/testCholesky.cpp | 42 +++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/gtsam/base/tests/testCholesky.cpp b/gtsam/base/tests/testCholesky.cpp index 55c72543e..8e8da7a70 100644 --- a/gtsam/base/tests/testCholesky.cpp +++ b/gtsam/base/tests/testCholesky.cpp @@ -81,38 +81,38 @@ TEST(cholesky, BadScalingSVD) { double expectedCondition = 1e40; double actualCondition = S(0) / S(1); - DOUBLES_EQUAL(expectedCondition, actualCondition, 1e-41); + DOUBLES_EQUAL(expectedCondition, actualCondition, 1e30); } /* ************************************************************************* */ TEST(cholesky, underconstrained) { Matrix L(6,6); L << - 1, 0, 0, 0, 0, 0, - 1.11177808157954, 1.06204809504665, 0.507342638873381, 1.34953401829486, 1, 0, - 0.155864888199928, 1.10933048588373, 0.501255576961674, 1, 0, 0, - 1.12108665967793, 1.01584408366945, 1, 0, 0, 0, - 0.776164062474843, 0.117617236580373, -0.0236628691347294, 0.814118199972143, 0.694309975328922, 1, + 1, 0, 0, 0, 0, 0, + 1.11177808157954, 1.06204809504665, 0.507342638873381, 1.34953401829486, 1, 0, + 0.155864888199928, 1.10933048588373, 0.501255576961674, 1, 0, 0, + 1.12108665967793, 1.01584408366945, 1, 0, 0, 0, + 0.776164062474843, 0.117617236580373, -0.0236628691347294, 0.814118199972143, 0.694309975328922, 1, 0.1197220685104, 1, 0, 0, 0, 0; Matrix D1(6,6); D1 << - 0.814723686393179, 0, 0, 0, 0, 0, - 0, 0.811780089277421, 0, 0, 0, 0, - 0, 0, 1.82596950680844, 0, 0, 0, - 0, 0, 0, 0.240287537694585, 0, 0, - 0, 0, 0, 0, 1.34342584865901, 0, + 0.814723686393179, 0, 0, 0, 0, 0, + 0, 0.811780089277421, 0, 0, 0, 0, + 0, 0, 1.82596950680844, 0, 0, 0, + 0, 0, 0, 0.240287537694585, 0, 0, + 0, 0, 0, 0, 1.34342584865901, 0, 0, 0, 0, 0, 0, 1e-12; Matrix D2(6,6); D2 << - 0.814723686393179, 0, 0, 0, 0, 0, - 0, 0.811780089277421, 0, 0, 0, 0, - 0, 0, 1.82596950680844, 0, 0, 0, - 0, 0, 0, 0.240287537694585, 0, 0, - 0, 0, 0, 0, 0, 0, + 0.814723686393179, 0, 0, 0, 0, 0, + 0, 0.811780089277421, 0, 0, 0, 0, + 0, 0, 1.82596950680844, 0, 0, 0, + 0, 0, 0, 0.240287537694585, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; Matrix D3(6,6); D3 << - 0.814723686393179, 0, 0, 0, 0, 0, - 0, 0.811780089277421, 0, 0, 0, 0, - 0, 0, 1.82596950680844, 0, 0, 0, - 0, 0, 0, 0.240287537694585, 0, 0, - 0, 0, 0, 0, -0.5, 0, + 0.814723686393179, 0, 0, 0, 0, 0, + 0, 0.811780089277421, 0, 0, 0, 0, + 0, 0, 1.82596950680844, 0, 0, 0, + 0, 0, 0, 0.240287537694585, 0, 0, + 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 0, -0.6; Matrix A1 = L * D1 * L.transpose(); From 9816d4fe611664969d6eae58c950abf3c7f2c55a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Thu, 6 Sep 2012 18:24:39 +0000 Subject: [PATCH 897/914] Fixed key bug in GeneralSFMFactor_Cal3Bundler --- gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp index 1b1ae5390..21f5f2008 100644 --- a/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp +++ b/gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp @@ -366,7 +366,7 @@ TEST( GeneralSFMFactor_Cal3Bundler, optimize_varK_BA ) { } // Constrain position of system with the first camera constrained to the origin - graph.addCameraConstraint(X(0), cameras[0]); + graph.addCameraConstraint(0, cameras[0]); // Constrain the scale of the problem with a soft range factor of 1m between the cameras graph.add(RangeFactor(X(0), X(1), 2.0, noiseModel::Isotropic::Sigma(1, 10.0))); From 6111904b1c73f2d72351bd788b472938380fc927 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Fri, 7 Sep 2012 15:16:14 +0000 Subject: [PATCH 898/914] add SLAM doxygen module --- gtsam/slam/AntiFactor.h | 1 + gtsam/slam/BearingFactor.h | 1 + gtsam/slam/BearingRangeFactor.h | 1 + gtsam/slam/BetweenFactor.h | 1 + gtsam/slam/BoundingConstraint.h | 1 + gtsam/slam/GeneralSFMFactor.h | 4 +++- gtsam/slam/PriorFactor.h | 1 + gtsam/slam/ProjectionFactor.h | 1 + gtsam/slam/RangeFactor.h | 1 + gtsam/slam/StereoFactor.h | 4 ++++ 10 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gtsam/slam/AntiFactor.h b/gtsam/slam/AntiFactor.h index 19f73c8b9..b5e77b578 100644 --- a/gtsam/slam/AntiFactor.h +++ b/gtsam/slam/AntiFactor.h @@ -26,6 +26,7 @@ namespace gtsam { * A class for downdating an existing factor from a graph. The AntiFactor returns the same * linearized Hessian matrices of the original factor, but with the opposite sign. This effectively * cancels out any affects of the original factor during optimization." + * @addtogroup SLAM */ class AntiFactor: public NonlinearFactor { diff --git a/gtsam/slam/BearingFactor.h b/gtsam/slam/BearingFactor.h index 326491e8c..86a6e159c 100644 --- a/gtsam/slam/BearingFactor.h +++ b/gtsam/slam/BearingFactor.h @@ -24,6 +24,7 @@ namespace gtsam { /** * Binary factor for a bearing measurement + * @addtogroup SLAM */ template class BearingFactor: public NoiseModelFactor2 { diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index 52f301b3c..d701054f9 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -26,6 +26,7 @@ namespace gtsam { /** * Binary factor for a bearing measurement + * @addtogroup SLAM */ template class BearingRangeFactor: public NoiseModelFactor2 { diff --git a/gtsam/slam/BetweenFactor.h b/gtsam/slam/BetweenFactor.h index d93e5fe81..14314ceb7 100644 --- a/gtsam/slam/BetweenFactor.h +++ b/gtsam/slam/BetweenFactor.h @@ -27,6 +27,7 @@ namespace gtsam { /** * A class for a measurement predicted by "between(config[key1],config[key2])" * @tparam VALUE the Value type + * @addtogroup SLAM */ template class BetweenFactor: public NoiseModelFactor2 { diff --git a/gtsam/slam/BoundingConstraint.h b/gtsam/slam/BoundingConstraint.h index 0032d9a05..43d3802c0 100644 --- a/gtsam/slam/BoundingConstraint.h +++ b/gtsam/slam/BoundingConstraint.h @@ -27,6 +27,7 @@ namespace gtsam { * greater/less than a fixed threshold. The function * will need to have its value function implemented to return * a scalar for comparison. + * @addtogroup SLAM */ template struct BoundingConstraint1: public NoiseModelFactor1 { diff --git a/gtsam/slam/GeneralSFMFactor.h b/gtsam/slam/GeneralSFMFactor.h index a9db7dcbe..beb2f1e67 100644 --- a/gtsam/slam/GeneralSFMFactor.h +++ b/gtsam/slam/GeneralSFMFactor.h @@ -29,7 +29,9 @@ namespace gtsam { /** - * Non-linear factor for a constraint derived from a 2D measurement. The calibration is unknown here compared to GenericProjectionFactor + * Non-linear factor for a constraint derived from a 2D measurement. + * The calibration is unknown here compared to GenericProjectionFactor + * @addtogroup SLAM */ template class GeneralSFMFactor: public NoiseModelFactor2 { diff --git a/gtsam/slam/PriorFactor.h b/gtsam/slam/PriorFactor.h index 79ea4c0ce..5bd0ee76f 100644 --- a/gtsam/slam/PriorFactor.h +++ b/gtsam/slam/PriorFactor.h @@ -22,6 +22,7 @@ namespace gtsam { /** * A class for a soft prior on any Value type + * @addtogroup SLAM */ template class PriorFactor: public NoiseModelFactor1 { diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index 048756435..00bb7f36a 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -28,6 +28,7 @@ namespace gtsam { /** * Non-linear factor for a constraint derived from a 2D measurement. The calibration is known here. * i.e. the main building block for visual SLAM. + * @addtogroup SLAM */ template class GenericProjectionFactor: public NoiseModelFactor2 { diff --git a/gtsam/slam/RangeFactor.h b/gtsam/slam/RangeFactor.h index 78727f08f..fa4ddb7f2 100644 --- a/gtsam/slam/RangeFactor.h +++ b/gtsam/slam/RangeFactor.h @@ -24,6 +24,7 @@ namespace gtsam { /** * Binary factor for a range measurement + * @addtogroup SLAM */ template class RangeFactor: public NoiseModelFactor2 { diff --git a/gtsam/slam/StereoFactor.h b/gtsam/slam/StereoFactor.h index 94af6e10e..05b37b0ff 100644 --- a/gtsam/slam/StereoFactor.h +++ b/gtsam/slam/StereoFactor.h @@ -23,6 +23,10 @@ namespace gtsam { +/* + * A Generic Stereo Factor + * @addtogroup SLAM + */ template class GenericStereoFactor: public NoiseModelFactor2 { private: From ed886e78b18b3176975f952e393d45fb02521c50 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Fri, 7 Sep 2012 15:17:23 +0000 Subject: [PATCH 899/914] doxygen formatting --- gtsam/slam/StereoFactor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/slam/StereoFactor.h b/gtsam/slam/StereoFactor.h index 05b37b0ff..6195c0eed 100644 --- a/gtsam/slam/StereoFactor.h +++ b/gtsam/slam/StereoFactor.h @@ -23,7 +23,7 @@ namespace gtsam { -/* +/** * A Generic Stereo Factor * @addtogroup SLAM */ From 9e960b45899362604078292105e76f20e34e0876 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Fri, 7 Sep 2012 18:54:12 +0000 Subject: [PATCH 900/914] doxygen fixes --- gtsam/geometry/CalibratedCamera.h | 10 +++++++++- gtsam/linear/NoiseModel.h | 4 ++++ gtsam_unstable/slam/InvDepthFactor3.h | 8 +++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/gtsam/geometry/CalibratedCamera.h b/gtsam/geometry/CalibratedCamera.h index a83a41827..6a52f7cb5 100644 --- a/gtsam/geometry/CalibratedCamera.h +++ b/gtsam/geometry/CalibratedCamera.h @@ -94,6 +94,7 @@ namespace gtsam { /** * Create a level camera at the given 2D pose and height * @param pose2 specifies the location and viewing direction + * @param height specifies the height of the camera (along the positive Z-axis) * (theta 0 = looking in direction of positive X axis) */ static CalibratedCamera Level(const Pose2& pose2, double height); @@ -126,8 +127,9 @@ namespace gtsam { /** * This function receives the camera pose and the landmark location and * returns the location the point is supposed to appear in the image - * @param camera the CalibratedCamera * @param point a 3D point to be projected + * @param D_intrinsic_pose the optionally computed Jacobian with respect to pose + * @param D_intrinsic_point the optionally computed Jacobian with respect to the 3D point * @return the intrinsic coordinates of the projected point */ Point2 project(const Point3& point, @@ -150,6 +152,8 @@ namespace gtsam { /** * Calculate range to a landmark * @param point 3D location of landmark + * @param H1 optionally computed Jacobian with respect to pose + * @param H2 optionally computed Jacobian with respect to the 3D point * @return range (double) */ double range(const Point3& point, @@ -160,6 +164,8 @@ namespace gtsam { /** * Calculate range to another pose * @param pose Other SO(3) pose + * @param H1 optionally computed Jacobian with respect to pose + * @param H2 optionally computed Jacobian with respect to the 3D point * @return range (double) */ double range(const Pose3& pose, @@ -170,6 +176,8 @@ namespace gtsam { /** * Calculate range to another camera * @param camera Other camera + * @param H1 optionally computed Jacobian with respect to pose + * @param H2 optionally computed Jacobian with respect to the 3D point * @return range (double) */ double range(const CalibratedCamera& camera, diff --git a/gtsam/linear/NoiseModel.h b/gtsam/linear/NoiseModel.h index 2bb63c382..8588c738b 100644 --- a/gtsam/linear/NoiseModel.h +++ b/gtsam/linear/NoiseModel.h @@ -156,6 +156,7 @@ namespace gtsam { /** * A Gaussian noise model created by specifying a covariance matrix. + * @param covariance The square covariance Matrix * @param smart check if can be simplified to derived class */ static shared_ptr Covariance(const Matrix& covariance, bool smart = true); @@ -263,6 +264,7 @@ namespace gtsam { /** * A diagonal noise model created by specifying a Vector of variances, i.e. * i.e. the diagonal of the covariance matrix. + * @param variances A vector containing the variances of this noise model * @param smart check if can be simplified to derived class */ static shared_ptr Variances(const Vector& variances, bool smart = true); @@ -492,6 +494,8 @@ namespace gtsam { /** * An isotropic noise model created by specifying a variance = sigma^2. + * @param dim The dimension of this noise model + * @param variance The variance of this noise model * @param smart check if can be simplified to derived class */ static shared_ptr Variance(size_t dim, double variance, bool smart = true); diff --git a/gtsam_unstable/slam/InvDepthFactor3.h b/gtsam_unstable/slam/InvDepthFactor3.h index daaf64575..33db8c1be 100644 --- a/gtsam_unstable/slam/InvDepthFactor3.h +++ b/gtsam_unstable/slam/InvDepthFactor3.h @@ -41,10 +41,11 @@ public: /** * Constructor * TODO: Mark argument order standard (keys, measurement, parameters) - * @param z is the 2 dimensional location of point in image (the measurement) + * @param measured is the 2 dimensional location of point in image (the measurement) * @param model is the standard deviation - * @param j_pose is basically the frame number - * @param j_landmark is the index of the landmark + * @param poseKey is basically the frame number + * @param pointKey is the index of the landmark + * @param invDepthKey is the index of inverse depth * @param K shared pointer to the constant calibration */ InvDepthFactor3(const gtsam::Point2& measured, const gtsam::SharedNoiseModel& model, @@ -57,6 +58,7 @@ public: /** * print * @param s optional string naming the factor + * @param keyFormatter optional formatter useful for printing Symbols */ void print(const std::string& s = "InvDepthFactor3", const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const { From 49a952d23779e84e2692cd1e27ee63d83ab7a53d Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Fri, 7 Sep 2012 19:12:02 +0000 Subject: [PATCH 901/914] more doxygen fixes --- gtsam/slam/GeneralSFMFactor.h | 15 +++++++++------ gtsam/slam/ProjectionFactor.h | 7 ++++--- gtsam/slam/StereoFactor.h | 1 + gtsam_unstable/slam/InvDepthFactor3.h | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/gtsam/slam/GeneralSFMFactor.h b/gtsam/slam/GeneralSFMFactor.h index beb2f1e67..3f3ae5a52 100644 --- a/gtsam/slam/GeneralSFMFactor.h +++ b/gtsam/slam/GeneralSFMFactor.h @@ -50,10 +50,10 @@ namespace gtsam { /** * Constructor - * @param z is the 2 dimensional location of point in image (the measurement) + * @param measured is the 2 dimensional location of point in image (the measurement) * @param model is the standard deviation of the measurements - * @param i is basically the frame number - * @param j is the index of the landmark + * @param cameraKey is the index of the camera + * @param landmarkKey is the index of the landmark */ GeneralSFMFactor(const Point2& measured, const SharedNoiseModel& model, Key cameraKey, Key landmarkKey) : Base(model, cameraKey, landmarkKey), measured_(measured) {} @@ -72,6 +72,7 @@ namespace gtsam { /** * print * @param s optional string naming the factor + * @param keyFormatter optional formatter for printing out Symbols */ void print(const std::string& s = "SFMFactor", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { Base::print(s, keyFormatter); @@ -140,10 +141,11 @@ namespace gtsam { /** * Constructor - * @param z is the 2 dimensional location of point in image (the measurement) + * @param measured is the 2 dimensional location of point in image (the measurement) * @param model is the standard deviation of the measurements - * @param i is basically the frame number - * @param j is the index of the landmark + * @param poseKey is the index of the camera + * @param landmarkKey is the index of the landmark + * @param calibKey is the index of the calibration */ GeneralSFMFactor2(const Point2& measured, const SharedNoiseModel& model, Key poseKey, Key landmarkKey, Key calibKey) : Base(model, poseKey, landmarkKey, calibKey), measured_(measured) {} @@ -159,6 +161,7 @@ namespace gtsam { /** * print * @param s optional string naming the factor + * @param keyFormatter optional formatter useful for printing Symbols */ void print(const std::string& s = "SFMFactor2", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { Base::print(s, keyFormatter); diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h index 00bb7f36a..79796e6c3 100644 --- a/gtsam/slam/ProjectionFactor.h +++ b/gtsam/slam/ProjectionFactor.h @@ -56,10 +56,10 @@ namespace gtsam { /** * Constructor * TODO: Mark argument order standard (keys, measurement, parameters) - * @param z is the 2 dimensional location of point in image (the measurement) + * @param measured is the 2 dimensional location of point in image (the measurement) * @param model is the standard deviation - * @param j_pose is basically the frame number - * @param j_landmark is the index of the landmark + * @param poseKey is the index of the camera + * @param pointKey is the index of the landmark * @param K shared pointer to the constant calibration */ GenericProjectionFactor(const Point2& measured, const SharedNoiseModel& model, @@ -78,6 +78,7 @@ namespace gtsam { /** * print * @param s optional string naming the factor + * @param keyFormatter optional formatter useful for printing Symbols */ void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { std::cout << s << "GenericProjectionFactor, z = "; diff --git a/gtsam/slam/StereoFactor.h b/gtsam/slam/StereoFactor.h index 6195c0eed..87cb95d25 100644 --- a/gtsam/slam/StereoFactor.h +++ b/gtsam/slam/StereoFactor.h @@ -70,6 +70,7 @@ public: /** * print * @param s optional string naming the factor + * @param keyFormatter optional formatter useful for printing Symbols */ void print(const std::string& s = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const { Base::print(s, keyFormatter); diff --git a/gtsam_unstable/slam/InvDepthFactor3.h b/gtsam_unstable/slam/InvDepthFactor3.h index 33db8c1be..f5856f6c8 100644 --- a/gtsam_unstable/slam/InvDepthFactor3.h +++ b/gtsam_unstable/slam/InvDepthFactor3.h @@ -43,7 +43,7 @@ public: * TODO: Mark argument order standard (keys, measurement, parameters) * @param measured is the 2 dimensional location of point in image (the measurement) * @param model is the standard deviation - * @param poseKey is basically the frame number + * @param poseKey is the index of the camera pose * @param pointKey is the index of the landmark * @param invDepthKey is the index of inverse depth * @param K shared pointer to the constant calibration From fd249efcb9f20c62035b1b9e170bc08eedf618f3 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Fri, 7 Sep 2012 19:20:44 +0000 Subject: [PATCH 902/914] more doxygen fixes --- gtsam/geometry/PinholeCamera.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gtsam/geometry/PinholeCamera.h b/gtsam/geometry/PinholeCamera.h index 79cbd8a87..8ec300ac6 100644 --- a/gtsam/geometry/PinholeCamera.h +++ b/gtsam/geometry/PinholeCamera.h @@ -62,6 +62,7 @@ namespace gtsam { /** * Create a level camera at the given 2D pose and height + * @param K the calibration * @param pose2 specifies the location and viewing direction * (theta 0 = looking in direction of positive X axis) * @param height camera height @@ -290,6 +291,8 @@ namespace gtsam { /** * Calculate range to a landmark * @param point 3D location of landmark + * @param H1 the optionally computed Jacobian with respect to pose + * @param H2 the optionally computed Jacobian with respect to the landmark * @return range (double) */ double range(const Point3& point, @@ -308,6 +311,8 @@ namespace gtsam { /** * Calculate range to another pose * @param pose Other SO(3) pose + * @param H1 the optionally computed Jacobian with respect to pose + * @param H2 the optionally computed Jacobian with respect to the landmark * @return range (double) */ double range(const Pose3& pose, @@ -326,6 +331,8 @@ namespace gtsam { /** * Calculate range to another camera * @param camera Other camera + * @param H1 the optionally computed Jacobian with respect to pose + * @param H2 the optionally computed Jacobian with respect to the landmark * @return range (double) */ template @@ -351,6 +358,8 @@ namespace gtsam { /** * Calculate range to another camera * @param camera Other camera + * @param H1 the optionally computed Jacobian with respect to pose + * @param H2 the optionally computed Jacobian with respect to the landmark * @return range (double) */ double range(const CalibratedCamera& camera, From 43b7f985944ab2ce569458ba9b5396f2e9c9235b Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Fri, 7 Sep 2012 23:10:49 +0000 Subject: [PATCH 903/914] Added more functionality to matlab wrapper --- gtsam.h | 275 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 239 insertions(+), 36 deletions(-) diff --git a/gtsam.h b/gtsam.h index 9c6f76527..879248f33 100644 --- a/gtsam.h +++ b/gtsam.h @@ -82,8 +82,38 @@ * - TODO: Handle gtsam::Rot3M conversions to quaternions */ +/*namespace std { + template + //Module.cpp needs to be changed to allow lowercase classnames + class vector + { + //Capcaity + size_t size() const; + size_t max_size() const; + void resize(size_t sz, T c = T()); + size_t capacity() const; + bool empty() const; + void reserve(size_t n); + + //Element acces + T& at(size_t n); + const T& at(size_t n) const; + T& front(); + const T& front() const; + T& back(); + const T& back() const; + + //Modifiers + void assign(size_t n, const T& u); + void push_back(const T& x); + void pop_back(); + }; +}*/ + namespace gtsam { +//typedef std::vector IndexVector; + //************************************************************************* // base //************************************************************************* @@ -664,14 +694,12 @@ virtual class SimpleCamera : gtsam::Value { //************************************************************************* // inference //************************************************************************* +#include class Permutation { // Standard Constructors and Named Constructors Permutation(); Permutation(size_t nVars); static gtsam::Permutation Identity(size_t nVars); - // FIXME: Cannot currently wrap std::vector - //static gtsam::Permutation PullToFront(const vector& toFront, size_t size, bool filterDuplicates); - //static gtsam::Permutation PushToBack(const vector& toBack, size_t size, bool filterDuplicates = false); // Testable void print(string s) const; @@ -684,10 +712,16 @@ class Permutation { void resize(size_t newSize); gtsam::Permutation* permute(const gtsam::Permutation& permutation) const; gtsam::Permutation* inverse() const; + // FIXME: Cannot currently wrap std::vector + //static gtsam::Permutation PullToFront(const vector& toFront, size_t size, bool filterDuplicates); + //static gtsam::Permutation PushToBack(const vector& toBack, size_t size, bool filterDuplicates = false); + gtsam::Permutation* partialPermutation(const gtsam::Permutation& selector, const gtsam::Permutation& partialPermutation) const; }; class IndexFactor { // Standard Constructors and Named Constructors + IndexFactor(const gtsam::IndexFactor& f); + IndexFactor(const gtsam::IndexConditional& c); IndexFactor(); IndexFactor(size_t j); IndexFactor(size_t j1, size_t j2); @@ -697,6 +731,7 @@ class IndexFactor { IndexFactor(size_t j1, size_t j2, size_t j3, size_t j4, size_t j5, size_t j6); // FIXME: Must wrap std::set for this to work //IndexFactor(const std::set& js); + void permuteWithInverse(const gtsam::Permutation& inversePermutation); // From Factor size_t size() const; @@ -726,6 +761,10 @@ class IndexConditional { size_t nrFrontals() const; size_t nrParents() const; gtsam::IndexFactor* toFactor() const; + + //Advanced interface + bool permuteSeparatorWithInverse(const gtsam::Permutation& inversePermutation); + void permuteWithInverse(const gtsam::Permutation& inversePermutation); }; #include @@ -742,11 +781,15 @@ class SymbolicBayesNet { // Standard interface size_t size() const; void push_back(const gtsam::IndexConditional* conditional); - // FIXME: cannot overload functions - //void push_back(const SymbolicBayesNet bn); + //TODO:Throws parse error + //void push_back(const gtsam::SymbolicBayesNet bn); void push_front(const gtsam::IndexConditional* conditional); - // FIXME: cannot overload functions - //void push_front(const SymbolicBayesNet bn); + //TODO:Throws parse error + //void push_front(const gtsam::SymbolicBayesNet bn); + + //Advanced Interface + gtsam::IndexConditional* front() const; + gtsam::IndexConditional* back() const; void pop_front(); void permuteWithInverse(const gtsam::Permutation& inversePermutation); bool permuteSeparatorWithInverse(const gtsam::Permutation& inversePermutation); @@ -766,6 +809,7 @@ class SymbolicBayesTree { bool equals(const gtsam::SymbolicBayesTree& other, double tol) const; // Standard interface + size_t findParentClique(const gtsam::IndexConditional& parents) const; size_t size() const; void saveGraph(string s) const; void clear(); @@ -788,7 +832,13 @@ class SymbolicFactorGraph { // FIXME: Must wrap FastSet for this to work //FastSet keys() const; - pair eliminateFrontals(size_t nFrontals) const; + //Advanced Interface + void push_factor(size_t key); + void push_factor(size_t key1, size_t key2); + void push_factor(size_t key1, size_t key2, size_t key3); + void push_factor(size_t key1, size_t key2, size_t key3, size_t key4); + + pair eliminateFrontals(size_t nFrontals) const; }; #include @@ -803,6 +853,7 @@ class SymbolicSequentialSolver { // Standard interface gtsam::SymbolicBayesNet* eliminate() const; + gtsam::IndexFactor* marginalFactor(size_t j) const; }; #include @@ -817,6 +868,7 @@ class SymbolicMultifrontalSolver { // Standard interface gtsam::SymbolicBayesTree* eliminate() const; + gtsam::IndexFactor* marginalFactor(size_t j) const; }; #include @@ -824,14 +876,15 @@ class VariableIndex { // Standard Constructors and Named Constructors VariableIndex(); // FIXME: Handle templates somehow - //template VariableIndex(const FactorGraph& factorGraph, size_t nVariables); - //template VariableIndex(const FactorGraph& factorGraph); + //template + //VariableIndex(const T& factorGraph, size_t nVariables); + //VariableIndex(const T& factorGraph); VariableIndex(const gtsam::SymbolicFactorGraph& factorGraph); VariableIndex(const gtsam::SymbolicFactorGraph& factorGraph, size_t nVariables); -// VariableIndex(const gtsam::GaussianFactorGraph& factorGraph); -// VariableIndex(const gtsam::GaussianFactorGraph& factorGraph, size_t nVariables); -// VariableIndex(const gtsam::NonlinearFactorGraph& factorGraph); -// VariableIndex(const gtsam::NonlinearFactorGraph& factorGraph, size_t nVariables); + VariableIndex(const gtsam::GaussianFactorGraph& factorGraph); + VariableIndex(const gtsam::GaussianFactorGraph& factorGraph, size_t nVariables); + VariableIndex(const gtsam::NonlinearFactorGraph& factorGraph); + VariableIndex(const gtsam::NonlinearFactorGraph& factorGraph, size_t nVariables); VariableIndex(const gtsam::VariableIndex& other); // Testable @@ -857,7 +910,8 @@ virtual class Base { virtual class Gaussian : gtsam::noiseModel::Base { static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); static gtsam::noiseModel::Gaussian* Covariance(Matrix R); -// Matrix R() const; // FIXME: cannot parse!!! + //Matrix R() const; // FIXME: cannot parse!!! + bool equals(gtsam::noiseModel::Base& expected, double tol); void print(string s) const; }; @@ -869,6 +923,20 @@ virtual class Diagonal : gtsam::noiseModel::Gaussian { void print(string s) const; }; +virtual class Constrained : gtsam::noiseModel::Diagonal { + static gtsam::noiseModel::Constrained* MixedSigmas(const Vector& mu, const Vector& sigmas); + static gtsam::noiseModel::Constrained* MixedSigmas(double m, const Vector& sigmas); + static gtsam::noiseModel::Constrained* MixedVariances(const Vector& mu, const Vector& variances); + static gtsam::noiseModel::Constrained* MixedVariances(const Vector& variances); + static gtsam::noiseModel::Constrained* MixedPrecisions(const Vector& mu, const Vector& precisions); + static gtsam::noiseModel::Constrained* MixedPrecisions(const Vector& precisions); + + static gtsam::noiseModel::Constrained* All(size_t dim); + static gtsam::noiseModel::Constrained* All(size_t dim, double m); + + gtsam::noiseModel::Constrained* unit() const; +}; + virtual class Isotropic : gtsam::noiseModel::Diagonal { static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); @@ -884,44 +952,80 @@ virtual class Unit : gtsam::noiseModel::Isotropic { #include class Sampler { + //Constructors Sampler(gtsam::noiseModel::Diagonal* model, int seed); Sampler(Vector sigmas, int seed); Sampler(int seed); + //Standard Interface size_t dim() const; Vector sigmas() const; gtsam::noiseModel::Diagonal* model() const; - Vector sample(); Vector sampleNewModel(gtsam::noiseModel::Diagonal* model); }; class VectorValues { + //Constructors VectorValues(); + VectorValues(const gtsam::VectorValues& other); VectorValues(size_t nVars, size_t varDim); - void print(string s) const; - bool equals(const gtsam::VectorValues& expected, double tol) const; + + //Named Constructors + static gtsam::VectorValues Zero(const gtsam::VectorValues& model); + static gtsam::VectorValues Zero(size_t nVars, size_t varDim); + static gtsam::VectorValues SameStructure(const gtsam::VectorValues& other); + + //Standard Interface size_t size() const; size_t dim(size_t j) const; size_t dim() const; bool exists(size_t j) const; + void print(string s) const; + bool equals(const gtsam::VectorValues& expected, double tol) const; void insert(size_t j, Vector value); Vector vector() const; Vector at(size_t j) const; + + //Advanced Interface + void resizeLike(const gtsam::VectorValues& other); + void resize(size_t nVars, size_t varDim); + void setZero(); + + //FIXME: Parse errors with vector() + //const Vector& vector() const; + //Vector& vector(); + bool hasSameStructure(const gtsam::VectorValues& other) const; + double dot(const gtsam::VectorValues& V) const; + double norm() const; }; class GaussianConditional { + //Constructors GaussianConditional(size_t key, Vector d, Matrix R, Vector sigmas); GaussianConditional(size_t key, Vector d, Matrix R, size_t name1, Matrix S, Vector sigmas); GaussianConditional(size_t key, Vector d, Matrix R, size_t name1, Matrix S, size_t name2, Matrix T, Vector sigmas); + + //Standard Interface void print(string s) const; bool equals(const gtsam::GaussianConditional &cg, double tol) const; + size_t dim() const; + + //Advanced Interface + Matrix computeInformation() const; + gtsam::JacobianFactor* toFactor() const; + void solveInPlace(gtsam::VectorValues& x) const; + void solveTransposeInPlace(gtsam::VectorValues& gy) const; + void scaleFrontalsBySigma(gtsam::VectorValues& gy) const; }; class GaussianDensity { + //Constructors GaussianDensity(size_t key, Vector d, Matrix R, Vector sigmas); + + //Standard Interface void print(string s) const; Vector mean() const; Matrix information() const; @@ -929,13 +1033,34 @@ class GaussianDensity { }; class GaussianBayesNet { + //Constructors GaussianBayesNet(); + + //Standard Interface void print(string s) const; bool equals(const gtsam::GaussianBayesNet& cbn, double tol) const; void push_back(gtsam::GaussianConditional* conditional); void push_front(gtsam::GaussianConditional* conditional); }; +//Non-Class methods found in GaussianBayesNet.h +//FIXME: No MATLAB documentation for these functions! +/*gtsam::GaussianBayesNet scalarGaussian(size_t key, double mu, double sigma); +gtsam::GaussianBayesNet simpleGaussian(size_t key, const Vector& mu, double sigma); +void push_front(gtsam::GaussianBayesNet& bn, size_t key, Vector d, Matrix R, size_t name1, Matrix S, Vector sigmas); +void push_front(gtsam::GaussianBayesNet& bn, size_t key, Vector d, Matrix R, size_t name1, Matrix S, size_t name2, Matrix T, Vector sigmas); +gtsam::VectorValues* allocateVectorValues(const gtsam::GaussianBayesNet& bn); +gtsam::VectorValues optimize(const gtsam::GaussianBayesNet& bn); +void optimizeInPlace(const gtsam::GaussianBayesNet& bn, gtsam::VectorValues& x); +gtsam::VectorValues optimizeGradientSearch(const gtsam::GaussianBayesNet& bn); +void optimizeGradientSearchInPlace(const gtsam::GaussianBayesNet& bn, gtsam::VectorValues& grad); +gtsam::VectorValues backSubstitute(const gtsam::GaussianBayesNet& bn, const gtsam::VectorValues& gx); +gtsam::VectorValues backSubstituteTranspose(const gtsam::GaussianBayesNet& bn, const gtsam::VectorValues& gx); +pair matrix(const gtsam::GaussianBayesNet& bn); +double determinant(const gtsam::GaussianBayesNet& bayesNet); +gtsam::VectorValues gradient(const gtsam::GaussianBayesNet& bayesNet, const gtsam::VectorValues& x0); +void gradientAtZero(const gtsam::GaussianBayesNet& bayesNet, const gtsam::VectorValues& g);*/ + virtual class GaussianFactor { void print(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; @@ -945,6 +1070,7 @@ virtual class GaussianFactor { }; virtual class JacobianFactor : gtsam::GaussianFactor { + //Constructors JacobianFactor(); JacobianFactor(Vector b_in); JacobianFactor(size_t i1, Matrix A1, Vector b, @@ -954,21 +1080,46 @@ virtual class JacobianFactor : gtsam::GaussianFactor { JacobianFactor(size_t i1, Matrix A1, size_t i2, Matrix A2, size_t i3, Matrix A3, Vector b, const gtsam::noiseModel::Diagonal* model); JacobianFactor(const gtsam::GaussianFactor& factor); + + //Testable void print(string s) const; void printKeys(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; size_t size() const; + Vector unweighted_error(const gtsam::VectorValues& c) const; + Vector error_vector(const gtsam::VectorValues& c) const; double error(const gtsam::VectorValues& c) const; - gtsam::GaussianFactor* negate() const; - bool empty() const; - Vector getb() const; - pair matrix() const; - Matrix matrix_augmented() const; - gtsam::GaussianConditional* eliminateFirst(); - gtsam::GaussianConditional* eliminate(size_t nrFrontals); + + //Standard Interface + gtsam::GaussianFactor* negate() const; + bool empty() const; + Matrix getA() const; + Vector getb() const; + size_t rows() const; + size_t cols() const; + size_t numberOfRows() const; + bool isConstrained() const; + pair matrix() const; + Matrix matrix_augmented() const; + + gtsam::GaussianConditional* eliminateFirst(); + gtsam::GaussianConditional* eliminate(size_t nrFrontals); + gtsam::GaussianFactor* negate() const; + Matrix computeInformation() const; + void transposeMultiplyAdd(double alpha, const Vector& e, gtsam::VectorValues& x) const; + gtsam::JacobianFactor whiten() const; + gtsam::GaussianConditional* eliminateFirst(); + gtsam::GaussianConditional* eliminate(size_t nFrontals); + gtsam::GaussianConditional* splitConditional(size_t nFrontals); + + void setModel(bool anyConstrained, const Vector& sigmas); + void assertInvariants() const; + + //gtsam::SharedDiagonal& get_model(); }; virtual class HessianFactor : gtsam::GaussianFactor { + //Constructors HessianFactor(const gtsam::HessianFactor& gf); HessianFactor(); HessianFactor(size_t j, Matrix G, Vector g, double f); @@ -980,12 +1131,26 @@ virtual class HessianFactor : gtsam::GaussianFactor { double f); HessianFactor(const gtsam::GaussianConditional& cg); HessianFactor(const gtsam::GaussianFactor& factor); + + //Testable size_t size() const; void print(string s) const; void printKeys(string s) const; bool equals(const gtsam::GaussianFactor& lf, double tol) const; double error(const gtsam::VectorValues& c) const; + + //Standard Interface + size_t rows() const; gtsam::GaussianFactor* negate() const; + Matrix info() const; + double constantTerm() const; + Vector linearTerm() const; + Matrix computeInformation() const; + + //Advanced Interface + void partialCholesky(size_t nrFrontals); + gtsam::GaussianConditional* splitEliminatedFactor(size_t nrFrontals); + void assertInvariants() const; }; class GaussianFactorGraph { @@ -1003,6 +1168,7 @@ class GaussianFactorGraph { // Building the graph void push_back(gtsam::GaussianFactor* factor); + void add(const gtsam::GaussianFactor& factor); void add(Vector b); void add(size_t key1, Matrix A1, Vector b, const gtsam::noiseModel::Diagonal* model); void add(size_t key1, Matrix A1, size_t key2, Matrix A2, Vector b, @@ -1010,6 +1176,9 @@ class GaussianFactorGraph { void add(size_t key1, Matrix A1, size_t key2, Matrix A2, size_t key3, Matrix A3, Vector b, const gtsam::noiseModel::Diagonal* model); + //Permutations + void permuteWithInverse(const gtsam::Permutation& inversePermutation); + // error and probability double error(const gtsam::VectorValues& c) const; double probPrime(const gtsam::VectorValues& c) const; @@ -1028,19 +1197,48 @@ class GaussianFactorGraph { pair hessian() const; }; +//Non-Class functions in GaussianFactorGraph.h +/*void multiplyInPlace(const gtsam::GaussianFactorGraph& fg, const gtsam::VectorValues& x, gtsam::Errors& e); +gtsam::VectorValues gradient(const gtsam::GaussianFactorGraph& fg, const gtsam::VectorValues& x0); +void gradientAtZero(const gtsam::GaussianFactorGraph& fg, gtsam::VectorValues& g); +void residual(const gtsam::GaussianFactorGraph& fg, const gtsam::VectorValues& x, gtsam::VectorValues& r); +void multiply(const gtsam::GaussianFactorGraph& fg, const gtsam::VectorValues& x, gtsam::VectorValues& r); +void transposeMultiply(const gtsam::GaussianFactorGraph& fg, const gtsam::VectorValues& x, gtsam::VectorValues& r);*/ + +class Errors { + //Constructors + Errors(); + Errors(const gtsam::VectorValues& V); + + //Testable + void print(string s); + bool equals(const gtsam::Errors& expected, double tol) const; +}; + +//Non-Class functions for Errors +//double dot(const gtsam::Errors& A, const gtsam::Errors& b); + class GaussianISAM { + //Constructor GaussianISAM(); + + //Standard Interface void saveGraph(string s) const; gtsam::GaussianFactor* marginalFactor(size_t j) const; gtsam::GaussianBayesNet* marginalBayesNet(size_t key) const; Matrix marginalCovariance(size_t key) const; gtsam::GaussianBayesNet* jointBayesNet(size_t key1, size_t key2) const; + void clear(); }; #include class GaussianSequentialSolver { + //Constructors GaussianSequentialSolver(const gtsam::GaussianFactorGraph& graph, bool useQR); + + //Standard Interface + void replaceFactors(const gtsam::GaussianFactorGraph* factorGraph); gtsam::GaussianBayesNet* eliminate() const; gtsam::VectorValues* optimize() const; gtsam::GaussianFactor* marginalFactor(size_t j) const; @@ -1053,6 +1251,7 @@ virtual class IterativeOptimizationParameters { string getVerbosity() const; void setKernel(string s) ; void setVerbosity(string s) ; + void print() const; }; //virtual class IterativeSolver { @@ -1074,6 +1273,7 @@ virtual class ConjugateGradientParameters : gtsam::IterativeOptimizationParamete void setReset(size_t value); void setEpsilon_rel(double value); void setEpsilon_abs(double value); + void print(string s); }; #include @@ -1084,6 +1284,7 @@ virtual class SubgraphSolverParameters : gtsam::ConjugateGradientParameters { class SubgraphSolver { SubgraphSolver(const gtsam::GaussianFactorGraph &A, const gtsam::SubgraphSolverParameters ¶meters); + SubgraphSolver(const gtsam::GaussianFactorGraph &Ab1, const gtsam::GaussianFactorGraph &Ab2, const gtsam::SubgraphSolverParameters ¶meters); gtsam::VectorValues optimize() const; }; @@ -1194,27 +1395,29 @@ class Values { size_t size() const; bool empty() const; - void clear(); - size_t dim() const; + void clear(); + size_t dim() const; void print(string s) const; bool equals(const gtsam::Values& other, double tol) const; void insert(size_t j, const gtsam::Value& value); - void insert(const gtsam::Values& values); - void update(size_t j, const gtsam::Value& val); - void update(const gtsam::Values& values); - void erase(size_t j); + void insert(const gtsam::Values& values); + void update(size_t j, const gtsam::Value& val); + void update(const gtsam::Values& values); + void erase(size_t j); + void swap(gtsam::Values& values); bool exists(size_t j) const; gtsam::Value at(size_t j) const; gtsam::KeyList keys() const; - gtsam::VectorValues zeroVectors(const gtsam::Ordering& ordering) const; + gtsam::VectorValues zeroVectors(const gtsam::Ordering& ordering) const; + gtsam::Ordering* orderingArbitrary(size_t firstVar) const; - gtsam::Values retract(const gtsam::VectorValues& delta, const gtsam::Ordering& ordering) const; - gtsam::VectorValues localCoordinates(const gtsam::Values& cp, const gtsam::Ordering& ordering) const; - void localCoordinates(const gtsam::Values& cp, const gtsam::Ordering& ordering, gtsam::VectorValues& delta) const; + gtsam::Values retract(const gtsam::VectorValues& delta, const gtsam::Ordering& ordering) const; + gtsam::VectorValues localCoordinates(const gtsam::Values& cp, const gtsam::Ordering& ordering) const; + void localCoordinates(const gtsam::Values& cp, const gtsam::Ordering& ordering, gtsam::VectorValues& delta) const; }; // Actually a FastList @@ -1493,7 +1696,7 @@ class ISAM2 { gtsam::ISAM2Result update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta); gtsam::ISAM2Result update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta, const gtsam::KeyVector& removeFactorIndices); // TODO: wrap the full version of update - //void update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta, const gtsam::KeyVector& removeFactorIndices, FastMap& constrainedKeys); + //void update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta, const gtsam::KeyVector& removeFactorIndices, FastMap& constrainedKeys); //void update(const gtsam::NonlinearFactorGraph& newFactors, const gtsam::Values& newTheta, const gtsam::KeyVector& removeFactorIndices, FastMap& constrainedKeys, bool force_relinearize); gtsam::Values getLinearizationPoint() const; From c67966718a77d6998c17fb06dbb242c4f30e509e Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 8 Sep 2012 04:20:21 +0000 Subject: [PATCH 904/914] Got rid of extra header --- gtsam/linear/SubgraphSolver.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/gtsam/linear/SubgraphSolver.h b/gtsam/linear/SubgraphSolver.h index 7c60c0588..fe968d486 100644 --- a/gtsam/linear/SubgraphSolver.h +++ b/gtsam/linear/SubgraphSolver.h @@ -17,8 +17,6 @@ #include #include -#include - namespace gtsam { class SubgraphSolverParameters : public ConjugateGradientParameters { From 3e8544880af91d817cee759ca3f3a50edea49e95 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 8 Sep 2012 04:21:21 +0000 Subject: [PATCH 905/914] Fixed confusing variable naming, e.g. Index key -> Index j --- gtsam/inference/BayesTree-inl.h | 62 ++++++++++++++++----------------- gtsam/inference/BayesTree.h | 36 ++++++++++--------- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 501a8aabd..72a503b6a 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -167,8 +167,8 @@ namespace gtsam { template void BayesTree::addClique(const sharedClique& clique, const sharedClique& parent_clique) { nodes_.resize(std::max((*clique)->lastFrontalKey()+1, nodes_.size())); - BOOST_FOREACH(Index key, (*clique)->frontals()) - nodes_[key] = clique; + BOOST_FOREACH(Index j, (*clique)->frontals()) + nodes_[j] = clique; if (parent_clique != NULL) { clique->parent_ = parent_clique; parent_clique->children_.push_back(clique); @@ -185,8 +185,8 @@ namespace gtsam { const sharedConditional& conditional, std::list& child_cliques) { sharedClique new_clique(new Clique(conditional)); nodes_.resize(std::max(conditional->lastFrontalKey()+1, nodes_.size())); - BOOST_FOREACH(Index key, conditional->frontals()) - nodes_[key] = new_clique; + BOOST_FOREACH(Index j, conditional->frontals()) + nodes_[j] = new_clique; new_clique->children_ = child_cliques; BOOST_FOREACH(sharedClique& child, child_cliques) child->parent_ = new_clique; @@ -210,13 +210,13 @@ namespace gtsam { #endif if(debug) conditional->print("Adding conditional "); if(debug) clique->print("To clique "); - Index key = conditional->lastFrontalKey(); - bayesTree.nodes_.resize(std::max(key+1, bayesTree.nodes_.size())); - bayesTree.nodes_[key] = clique; - FastVector newKeys((*clique)->size() + 1); - newKeys[0] = key; - std::copy((*clique)->begin(), (*clique)->end(), newKeys.begin()+1); - clique->conditional_ = CONDITIONAL::FromKeys(newKeys, (*clique)->nrFrontals() + 1); + Index j = conditional->lastFrontalKey(); + bayesTree.nodes_.resize(std::max(j+1, bayesTree.nodes_.size())); + bayesTree.nodes_[j] = clique; + FastVector newIndices((*clique)->size() + 1); + newIndices[0] = j; + std::copy((*clique)->begin(), (*clique)->end(), newIndices.begin()+1); + clique->conditional_ = CONDITIONAL::FromKeys(newIndices, (*clique)->nrFrontals() + 1); if(debug) clique->print("Expanded clique is "); clique->assertInvariants(); } @@ -234,8 +234,8 @@ namespace gtsam { BOOST_FOREACH(sharedClique child, clique->children_) child->parent_ = typename Clique::weak_ptr(); - BOOST_FOREACH(Index key, (*clique->conditional())) { - nodes_[key].reset(); + BOOST_FOREACH(Index j, (*clique->conditional())) { + nodes_[j].reset(); } } @@ -379,7 +379,7 @@ namespace gtsam { { static const bool debug = false; - // get key and parents + // get indices and parents const typename CONDITIONAL::Parents& parents = conditional->parents(); if(debug) conditional->print("Adding conditional "); @@ -402,7 +402,7 @@ namespace gtsam { if ((*parent_clique)->size() == size_t(parents.size())) { if(debug) std::cout << "Adding to parent clique" << std::endl; #ifndef NDEBUG - // Debug check that the parent keys of the new conditional match the keys + // Debug check that the parent indices of the new conditional match the indices // currently in the clique. // list::const_iterator parent = parents.begin(); // typename Clique::const_iterator cond = parent_clique->begin(); @@ -441,7 +441,7 @@ namespace gtsam { template void BayesTree::fillNodesIndex(const sharedClique& subtree) { // Add each frontal variable of this root node - BOOST_FOREACH(const Index& key, subtree->conditional()->frontals()) { nodes_[key] = subtree; } + BOOST_FOREACH(const Index& j, subtree->conditional()->frontals()) { nodes_[j] = subtree; } // Fill index for each child typedef typename BayesTree::sharedClique sharedClique; BOOST_FOREACH(const sharedClique& child, subtree->children_) { @@ -480,26 +480,26 @@ namespace gtsam { /* ************************************************************************* */ template typename CONDITIONAL::FactorType::shared_ptr BayesTree::marginalFactor( - Index key, Eliminate function) const { + Index j, Eliminate function) const { - // get clique containing key - sharedClique clique = (*this)[key]; + // get clique containing Index j + sharedClique clique = (*this)[j]; // calculate or retrieve its marginal FactorGraph cliqueMarginal = clique->marginal(root_,function); return GenericSequentialSolver(cliqueMarginal).marginalFactor( - key, function); + j, function); } /* ************************************************************************* */ template typename BayesNet::shared_ptr BayesTree::marginalBayesNet( - Index key, Eliminate function) const { + Index j, Eliminate function) const { // calculate marginal as a factor graph FactorGraph fg; - fg.push_back(this->marginalFactor(key,function)); + fg.push_back(this->marginalFactor(j,function)); // eliminate factor graph marginal to a Bayes net return GenericSequentialSolver(fg).eliminate(function); @@ -510,28 +510,28 @@ namespace gtsam { /* ************************************************************************* */ template typename FactorGraph::shared_ptr - BayesTree::joint(Index key1, Index key2, Eliminate function) const { + BayesTree::joint(Index j1, Index j2, Eliminate function) const { // get clique C1 and C2 - sharedClique C1 = (*this)[key1], C2 = (*this)[key2]; + sharedClique C1 = (*this)[j1], C2 = (*this)[j2]; // calculate joint FactorGraph p_C1C2(C1->joint(C2, root_, function)); // eliminate remaining factor graph to get requested joint - std::vector key12(2); key12[0] = key1; key12[1] = key2; + std::vector j12(2); j12[0] = j1; j12[1] = j2; GenericSequentialSolver solver(p_C1C2); - return solver.jointFactorGraph(key12,function); + return solver.jointFactorGraph(j12,function); } /* ************************************************************************* */ template typename BayesNet::shared_ptr BayesTree::jointBayesNet( - Index key1, Index key2, Eliminate function) const { + Index j1, Index j2, Eliminate function) const { // eliminate factor graph marginal to a Bayes net return GenericSequentialSolver ( - *this->joint(key1, key2, function)).eliminate(function); + *this->joint(j1, j2, function)).eliminate(function); } /* ************************************************************************* */ @@ -574,11 +574,11 @@ namespace gtsam { BayesNet& bn, typename BayesTree::Cliques& orphans) { // process each key of the new factor - BOOST_FOREACH(const Index& key, keys) { + BOOST_FOREACH(const Index& j, keys) { // get the clique - if(key < nodes_.size()) { - const sharedClique& clique(nodes_[key]); + if(j < nodes_.size()) { + const sharedClique& clique(nodes_[j]); if(clique) { // remove path from clique to root this->removePath(clique, bn, orphans); diff --git a/gtsam/inference/BayesTree.h b/gtsam/inference/BayesTree.h index 6cd7c67f1..1e87ca141 100644 --- a/gtsam/inference/BayesTree.h +++ b/gtsam/inference/BayesTree.h @@ -91,10 +91,18 @@ namespace gtsam { CliqueStats getStats() const; }; - /** Map from keys to Clique */ + /** Map from indices to Clique */ typedef std::deque Nodes; - public: + protected: + + /** Map from indices to Clique */ + Nodes nodes_; + + /** Root clique */ + sharedClique root_; + + public: /// @name Standard Constructors /// @{ @@ -160,29 +168,29 @@ namespace gtsam { /** return root clique */ const sharedClique& root() const { return root_; } - /** find the clique to which key belongs */ - sharedClique operator[](Index key) const { - return nodes_.at(key); + /** find the clique that contains the variable with Index j */ + sharedClique operator[](Index j) const { + return nodes_.at(j); } /** Gather data on all cliques */ CliqueData getCliqueData() const; /** return marginal on any variable */ - typename FactorType::shared_ptr marginalFactor(Index key, Eliminate function) const; + typename FactorType::shared_ptr marginalFactor(Index j, Eliminate function) const; /** * return marginal on any variable, as a Bayes Net * NOTE: this function calls marginal, and then eliminates it into a Bayes Net * This is more expensive than the above function */ - typename BayesNet::shared_ptr marginalBayesNet(Index key, Eliminate function) const; + typename BayesNet::shared_ptr marginalBayesNet(Index j, Eliminate function) const; /** return joint on two variables */ - typename FactorGraph::shared_ptr joint(Index key1, Index key2, Eliminate function) const; + typename FactorGraph::shared_ptr joint(Index j1, Index j2, Eliminate function) const; /** return joint on two variables as a BayesNet */ - typename BayesNet::shared_ptr jointBayesNet(Index key1, Index key2, Eliminate function) const; + typename BayesNet::shared_ptr jointBayesNet(Index j1, Index j2, Eliminate function) const; /** * Read only with side effects @@ -211,11 +219,11 @@ namespace gtsam { void removePath(sharedClique clique, BayesNet& bn, Cliques& orphans); /** - * Given a list of keys, turn "contaminated" part of the tree back into a factor graph. + * Given a list of indices, turn "contaminated" part of the tree back into a factor graph. * Factors and orphans are added to the in/out arguments. */ template - void removeTop(const CONTAINER& keys, BayesNet& bn, Cliques& orphans); + void removeTop(const CONTAINER& indices, BayesNet& bn, Cliques& orphans); /** * Hang a new subtree off of the existing tree. This finds the appropriate @@ -243,9 +251,6 @@ namespace gtsam { protected: - /** Map from keys to Clique */ - Nodes nodes_; - /** private helper method for saving the Tree to a text file in GraphViz format */ void saveGraph(std::ostream &s, sharedClique clique, const IndexFormatter& indexFormatter, int parentnum = 0) const; @@ -253,9 +258,6 @@ namespace gtsam { /** Gather data on a single clique */ void getCliqueData(CliqueData& stats, sharedClique clique) const; - /** Root clique */ - sharedClique root_; - /** remove a clique: warning, can result in a forest */ void removeClique(sharedClique clique); From e663d54c3c330597365e7aff2083c8a1082df6df Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 8 Sep 2012 05:28:25 +0000 Subject: [PATCH 906/914] Fixed some comments --- matlab/+gtsam/VisualISAMGenerateData.m | 2 +- matlab/+gtsam/VisualISAMInitialize.m | 2 +- matlab/+gtsam/VisualISAMPlot.m | 2 +- matlab/+gtsam/VisualISAMStep.m | 2 +- matlab/+gtsam/circlePose2.m | 2 +- matlab/+gtsam/circlePose3.m | 2 +- matlab/+gtsam/covarianceEllipse.m | 2 +- matlab/+gtsam/covarianceEllipse3D.m | 2 +- matlab/+gtsam/load3D.m | 2 +- matlab/+gtsam/plot3DTrajectory.m | 4 +++- matlab/+gtsam/plotPoint2.m | 2 +- matlab/+gtsam/plotPose2.m | 2 +- matlab/+gtsam/plotPose3.m | 2 +- 13 files changed, 15 insertions(+), 13 deletions(-) diff --git a/matlab/+gtsam/VisualISAMGenerateData.m b/matlab/+gtsam/VisualISAMGenerateData.m index 2e972d9af..b3b602afe 100644 --- a/matlab/+gtsam/VisualISAMGenerateData.m +++ b/matlab/+gtsam/VisualISAMGenerateData.m @@ -1,5 +1,5 @@ function [data,truth] = VisualISAMGenerateData(options) -% VisualISAMGenerateData: create data for viusalSLAM::iSAM examples +% VisualISAMGenerateData creates data for viusalSLAM::iSAM examples % Authors: Duy Nguyen Ta and Frank Dellaert %% Generate simulated data diff --git a/matlab/+gtsam/VisualISAMInitialize.m b/matlab/+gtsam/VisualISAMInitialize.m index b29288fdf..8da23a1ec 100644 --- a/matlab/+gtsam/VisualISAMInitialize.m +++ b/matlab/+gtsam/VisualISAMInitialize.m @@ -1,5 +1,5 @@ function [noiseModels,isam,result,nextPoseIndex] = VisualISAMInitialize(data,truth,options) -% VisualInitialize: initialize visualSLAM::iSAM object and noise parameters +% VisualISAMInitialize initializes visualSLAM::iSAM object and noise parameters % Authors: Duy Nguyen Ta, Frank Dellaert and Alex Cunningham %% Initialize iSAM diff --git a/matlab/+gtsam/VisualISAMPlot.m b/matlab/+gtsam/VisualISAMPlot.m index cd7ab188e..a6a677723 100644 --- a/matlab/+gtsam/VisualISAMPlot.m +++ b/matlab/+gtsam/VisualISAMPlot.m @@ -1,5 +1,5 @@ function VisualISAMPlot(truth, data, isam, result, options) -% VisualISAMPlot: plot current state of ISAM2 object +% VisualISAMPlot plots current state of ISAM2 object % Authors: Duy Nguyen Ta and Frank Dellaert h=gca; diff --git a/matlab/+gtsam/VisualISAMStep.m b/matlab/+gtsam/VisualISAMStep.m index 71b1c849c..25b4c1027 100644 --- a/matlab/+gtsam/VisualISAMStep.m +++ b/matlab/+gtsam/VisualISAMStep.m @@ -1,5 +1,5 @@ function [isam,result,nextPoseIndex] = VisualISAMStep(data,noiseModels,isam,result,truth,nextPoseIndex) -% VisualISAMStep: execute one update step of visualSLAM::iSAM object +% VisualISAMStep executes one update step of visualSLAM::iSAM object % Authors: Duy Nguyen Ta and Frank Dellaert % iSAM expects us to give it a new set of factors diff --git a/matlab/+gtsam/circlePose2.m b/matlab/+gtsam/circlePose2.m index 0679c16b3..a2606ec06 100644 --- a/matlab/+gtsam/circlePose2.m +++ b/matlab/+gtsam/circlePose2.m @@ -1,5 +1,5 @@ function values = circlePose2(numPoses, radius, symbolChar) -% circlePose3: generate a set of poses in a circle. This function +% circlePose2 generates a set of poses in a circle. This function % returns those poses inside a gtsam.Values object, with sequential % keys starting from 0. An optional character may be provided, which % will be stored in the msb of each key (i.e. gtsam.Symbol). diff --git a/matlab/+gtsam/circlePose3.m b/matlab/+gtsam/circlePose3.m index 9085ab0d0..686bce7cf 100644 --- a/matlab/+gtsam/circlePose3.m +++ b/matlab/+gtsam/circlePose3.m @@ -1,5 +1,5 @@ function values = circlePose3(numPoses, radius, symbolChar) -% circlePose3: generate a set of poses in a circle. This function +% circlePose3 generates a set of poses in a circle. This function % returns those poses inside a gtsam.Values object, with sequential % keys starting from 0. An optional character may be provided, which % will be stored in the msb of each key (i.e. gtsam.Symbol). diff --git a/matlab/+gtsam/covarianceEllipse.m b/matlab/+gtsam/covarianceEllipse.m index b4579862e..7728fc866 100644 --- a/matlab/+gtsam/covarianceEllipse.m +++ b/matlab/+gtsam/covarianceEllipse.m @@ -1,5 +1,5 @@ function covarianceEllipse(x,P,color) -% covarianceEllipse: plot a Gaussian as an uncertainty ellipse +% covarianceEllipse plots a Gaussian as an uncertainty ellipse % Based on Maybeck Vol 1, page 366 % k=2.296 corresponds to 1 std, 68.26% of all probability % k=11.82 corresponds to 3 std, 99.74% of all probability diff --git a/matlab/+gtsam/covarianceEllipse3D.m b/matlab/+gtsam/covarianceEllipse3D.m index d3ef1f8a7..9682a9fc1 100644 --- a/matlab/+gtsam/covarianceEllipse3D.m +++ b/matlab/+gtsam/covarianceEllipse3D.m @@ -1,5 +1,5 @@ function covarianceEllipse3D(c,P) -% covarianceEllipse3D: plot a Gaussian as an uncertainty ellipse +% covarianceEllipse3D plots a Gaussian as an uncertainty ellipse % Based on Maybeck Vol 1, page 366 % k=2.296 corresponds to 1 std, 68.26% of all probability % k=11.82 corresponds to 3 std, 99.74% of all probability diff --git a/matlab/+gtsam/load3D.m b/matlab/+gtsam/load3D.m index c0ccd545f..94202e0c8 100644 --- a/matlab/+gtsam/load3D.m +++ b/matlab/+gtsam/load3D.m @@ -1,5 +1,5 @@ function [graph,initial] = load3D(filename,model,successive,N) -% load3D: read TORO 3D pose graph +% load3D reads a TORO-style 3D pose graph % cannot read noise model from file yet, uses specified model % if [successive] is tru, constructs initial estimate from odometry diff --git a/matlab/+gtsam/plot3DTrajectory.m b/matlab/+gtsam/plot3DTrajectory.m index 1cd35c22f..d24e21297 100644 --- a/matlab/+gtsam/plot3DTrajectory.m +++ b/matlab/+gtsam/plot3DTrajectory.m @@ -1,5 +1,7 @@ function plot3DTrajectory(values,linespec,frames,scale,marginals) -% plot3DTrajectory +% plot3DTrajectory plots a 3D trajectory +% plot3DTrajectory(values,linespec,frames,scale,marginals) + if ~exist('scale','var') || isempty(scale), scale=1; end if ~exist('frames','var'), scale=[]; end diff --git a/matlab/+gtsam/plotPoint2.m b/matlab/+gtsam/plotPoint2.m index e62804ce3..55e476118 100644 --- a/matlab/+gtsam/plotPoint2.m +++ b/matlab/+gtsam/plotPoint2.m @@ -1,5 +1,5 @@ function plotPoint2(p,color,P) -% plotPoint2: show a Point2, possibly with covariance matrix +% plotPoint2 shows a Point2, possibly with covariance matrix if size(color,2)==1 plot(p.x,p.y,[color '*']); else diff --git a/matlab/+gtsam/plotPose2.m b/matlab/+gtsam/plotPose2.m index c7fba28ed..799bad48e 100644 --- a/matlab/+gtsam/plotPose2.m +++ b/matlab/+gtsam/plotPose2.m @@ -1,5 +1,5 @@ function plotPose2(pose,color,P,axisLength) -% plotPose2: show a Pose2, possibly with covariance matrix +% plotPose2 shows a Pose2, possibly with covariance matrix if nargin<4,axisLength=0.1;end plot(pose.x,pose.y,[color '*']); diff --git a/matlab/+gtsam/plotPose3.m b/matlab/+gtsam/plotPose3.m index e2c254e39..8c3c7dd76 100644 --- a/matlab/+gtsam/plotPose3.m +++ b/matlab/+gtsam/plotPose3.m @@ -1,5 +1,5 @@ function plotPose3(pose, P, axisLength) -% plotPose3: show a Pose, possibly with covariance matrix +% plotPose3 shows a Pose, possibly with covariance matrix if nargin<3,axisLength=0.1;end % get rotation and translation (center) From d8a6b6a5e4f50301641c8ad064ff9367326bc5d7 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Sat, 8 Sep 2012 05:44:26 +0000 Subject: [PATCH 907/914] Vastly improved "help gtsam" and "doc gtsam" output --- matlab/+gtsam/Contents.m | 161 +++++++++++++++++++++++++++++++++++++++ wrap/Class.cpp | 131 ++++++++++++++++--------------- 2 files changed, 226 insertions(+), 66 deletions(-) create mode 100644 matlab/+gtsam/Contents.m diff --git a/matlab/+gtsam/Contents.m b/matlab/+gtsam/Contents.m new file mode 100644 index 000000000..0af19e1c8 --- /dev/null +++ b/matlab/+gtsam/Contents.m @@ -0,0 +1,161 @@ +% GTSAM MATLAB toolbox interface to the Georgia Tech Smoothing and Mapping C++ library +% Version 2.1 08-Sep-2012 +% +%% Basic Utilities +% linear_independent - check whether the rows of two matrices are linear independent +% Permutation - class Permutation, see Doxygen page for details +% +%% General Inference Classes +% IndexConditional - class IndexConditional, see Doxygen page for details +% IndexFactor - class IndexFactor, see Doxygen page for details +% SymbolicBayesNet - class SymbolicBayesNet, see Doxygen page for details +% SymbolicBayesTree - class SymbolicBayesTree, see Doxygen page for details +% SymbolicFactorGraph - class SymbolicFactorGraph, see Doxygen page for details +% SymbolicMultifrontalSolver - class SymbolicMultifrontalSolver, see Doxygen page for details +% SymbolicSequentialSolver - class SymbolicSequentialSolver, see Doxygen page for details +% VariableIndex - class VariableIndex, see Doxygen page for details +% +%% Linear-Gaussian Factor Graphs +% Errors - class Errors, see Doxygen page for details +% GaussianBayesNet - class GaussianBayesNet, see Doxygen page for details +% GaussianConditional - class GaussianConditional, see Doxygen page for details +% GaussianDensity - class GaussianDensity, see Doxygen page for details +% GaussianFactor - class GaussianFactor, see Doxygen page for details +% GaussianFactorGraph - class GaussianFactorGraph, see Doxygen page for details +% GaussianISAM - class GaussianISAM, see Doxygen page for details +% HessianFactor - class HessianFactor, see Doxygen page for details +% JacobianFactor - class JacobianFactor, see Doxygen page for details +% VectorValues - class VectorValues, see Doxygen page for details +% +%% Linear Inference +% GaussianSequentialSolver - class GaussianSequentialSolver, see Doxygen page for details +% IterativeOptimizationParameters - class IterativeOptimizationParameters, see Doxygen page for details +% KalmanFilter - class KalmanFilter, see Doxygen page for details +% SubgraphSolver - class SubgraphSolver, see Doxygen page for details +% SubgraphSolverParameters - class SubgraphSolverParameters, see Doxygen page for details +% SuccessiveLinearizationParams - class SuccessiveLinearizationParams, see Doxygen page for details +% Sampler - class Sampler, see Doxygen page for details +% +%% Nonlinear Factor Graphs +% NonlinearFactor - class NonlinearFactor, see Doxygen page for details +% NonlinearFactorGraph - class NonlinearFactorGraph, see Doxygen page for details +% Ordering - class Ordering, see Doxygen page for details +% Value - class Value, see Doxygen page for details +% Values - class Values, see Doxygen page for details +% +%% Nonlinear Optimization +% ConjugateGradientParameters - class ConjugateGradientParameters, see Doxygen page for details +% DoglegOptimizer - class DoglegOptimizer, see Doxygen page for details +% DoglegParams - class DoglegParams, see Doxygen page for details +% GaussNewtonOptimizer - class GaussNewtonOptimizer, see Doxygen page for details +% GaussNewtonParams - class GaussNewtonParams, see Doxygen page for details +% ISAM2 - class ISAM2, see Doxygen page for details +% ISAM2DoglegParams - class ISAM2DoglegParams, see Doxygen page for details +% ISAM2GaussNewtonParams - class ISAM2GaussNewtonParams, see Doxygen page for details +% ISAM2Params - class ISAM2Params, see Doxygen page for details +% ISAM2Result - class ISAM2Result, see Doxygen page for details +% ISAM2ThresholdMap - class ISAM2ThresholdMap, see Doxygen page for details +% ISAM2ThresholdMapValue - class ISAM2ThresholdMapValue, see Doxygen page for details +% InvertedOrdering - class InvertedOrdering, see Doxygen page for details +% JointMarginal - class JointMarginal, see Doxygen page for details +% KeyList - class KeyList, see Doxygen page for details +% KeySet - class KeySet, see Doxygen page for details +% KeyVector - class KeyVector, see Doxygen page for details +% LevenbergMarquardtOptimizer - class LevenbergMarquardtOptimizer, see Doxygen page for details +% LevenbergMarquardtParams - class LevenbergMarquardtParams, see Doxygen page for details +% Marginals - class Marginals, see Doxygen page for details +% NonlinearISAM - class NonlinearISAM, see Doxygen page for details +% NonlinearOptimizer - class NonlinearOptimizer, see Doxygen page for details +% NonlinearOptimizerParams - class NonlinearOptimizerParams, see Doxygen page for details +% +%% Geometry +% Cal3_S2 - class Cal3_S2, see Doxygen page for details +% Cal3_S2Stereo - class Cal3_S2Stereo, see Doxygen page for details +% Cal3DS2 - class Cal3DS2, see Doxygen page for details +% CalibratedCamera - class CalibratedCamera, see Doxygen page for details +% Point2 - class Point2, see Doxygen page for details +% Point3 - class Point3, see Doxygen page for details +% Pose2 - class Pose2, see Doxygen page for details +% Pose3 - class Pose3, see Doxygen page for details +% Rot2 - class Rot2, see Doxygen page for details +% Rot3 - class Rot3, see Doxygen page for details +% SimpleCamera - class SimpleCamera, see Doxygen page for details +% StereoPoint2 - class StereoPoint2, see Doxygen page for details +% +%% SLAM and SFM +% BearingFactor2D - class BearingFactor2D, see Doxygen page for details +% BearingRangeFactor2D - class BearingRangeFactor2D, see Doxygen page for details +% BetweenFactorLieMatrix - class BetweenFactorLieMatrix, see Doxygen page for details +% BetweenFactorLieScalar - class BetweenFactorLieScalar, see Doxygen page for details +% BetweenFactorLieVector - class BetweenFactorLieVector, see Doxygen page for details +% BetweenFactorPoint2 - class BetweenFactorPoint2, see Doxygen page for details +% BetweenFactorPoint3 - class BetweenFactorPoint3, see Doxygen page for details +% BetweenFactorPose2 - class BetweenFactorPose2, see Doxygen page for details +% BetweenFactorPose3 - class BetweenFactorPose3, see Doxygen page for details +% BetweenFactorRot2 - class BetweenFactorRot2, see Doxygen page for details +% BetweenFactorRot3 - class BetweenFactorRot3, see Doxygen page for details +% GeneralSFMFactor2Cal3_S2 - class GeneralSFMFactor2Cal3_S2, see Doxygen page for details +% GeneralSFMFactorCal3_S2 - class GeneralSFMFactorCal3_S2, see Doxygen page for details +% GenericProjectionFactorCal3_S2 - class GenericProjectionFactorCal3_S2, see Doxygen page for details +% GenericStereoFactor3D - class GenericStereoFactor3D, see Doxygen page for details +% NonlinearEqualityCal3_S2 - class NonlinearEqualityCal3_S2, see Doxygen page for details +% NonlinearEqualityCalibratedCamera - class NonlinearEqualityCalibratedCamera, see Doxygen page for details +% NonlinearEqualityLieMatrix - class NonlinearEqualityLieMatrix, see Doxygen page for details +% NonlinearEqualityLieScalar - class NonlinearEqualityLieScalar, see Doxygen page for details +% NonlinearEqualityLieVector - class NonlinearEqualityLieVector, see Doxygen page for details +% NonlinearEqualityPoint2 - class NonlinearEqualityPoint2, see Doxygen page for details +% NonlinearEqualityPoint3 - class NonlinearEqualityPoint3, see Doxygen page for details +% NonlinearEqualityPose2 - class NonlinearEqualityPose2, see Doxygen page for details +% NonlinearEqualityPose3 - class NonlinearEqualityPose3, see Doxygen page for details +% NonlinearEqualityRot2 - class NonlinearEqualityRot2, see Doxygen page for details +% NonlinearEqualityRot3 - class NonlinearEqualityRot3, see Doxygen page for details +% NonlinearEqualitySimpleCamera - class NonlinearEqualitySimpleCamera, see Doxygen page for details +% NonlinearEqualityStereoPoint2 - class NonlinearEqualityStereoPoint2, see Doxygen page for details +% PriorFactorCal3_S2 - class PriorFactorCal3_S2, see Doxygen page for details +% PriorFactorCalibratedCamera - class PriorFactorCalibratedCamera, see Doxygen page for details +% PriorFactorLieMatrix - class PriorFactorLieMatrix, see Doxygen page for details +% PriorFactorLieScalar - class PriorFactorLieScalar, see Doxygen page for details +% PriorFactorLieVector - class PriorFactorLieVector, see Doxygen page for details +% PriorFactorPoint2 - class PriorFactorPoint2, see Doxygen page for details +% PriorFactorPoint3 - class PriorFactorPoint3, see Doxygen page for details +% PriorFactorPose2 - class PriorFactorPose2, see Doxygen page for details +% PriorFactorPose3 - class PriorFactorPose3, see Doxygen page for details +% PriorFactorRot2 - class PriorFactorRot2, see Doxygen page for details +% PriorFactorRot3 - class PriorFactorRot3, see Doxygen page for details +% PriorFactorSimpleCamera - class PriorFactorSimpleCamera, see Doxygen page for details +% PriorFactorStereoPoint2 - class PriorFactorStereoPoint2, see Doxygen page for details +% RangeFactorCalibratedCamera - class RangeFactorCalibratedCamera, see Doxygen page for details +% RangeFactorCalibratedCameraPoint - class RangeFactorCalibratedCameraPoint, see Doxygen page for details +% RangeFactorPose2 - class RangeFactorPose2, see Doxygen page for details +% RangeFactorPose3 - class RangeFactorPose3, see Doxygen page for details +% RangeFactorPosePoint2 - class RangeFactorPosePoint2, see Doxygen page for details +% RangeFactorPosePoint3 - class RangeFactorPosePoint3, see Doxygen page for details +% RangeFactorSimpleCamera - class RangeFactorSimpleCamera, see Doxygen page for details +% RangeFactorSimpleCameraPoint - class RangeFactorSimpleCameraPoint, see Doxygen page for details +% VisualISAMGenerateData - VisualISAMGenerateData creates data for viusalSLAM::iSAM examples +% VisualISAMInitialize - VisualISAMInitialize initializes visualSLAM::iSAM object and noise parameters +% VisualISAMPlot - VisualISAMPlot plots current state of ISAM2 object +% VisualISAMStep - VisualISAMStep executes one update step of visualSLAM::iSAM object +% +%% MATLAB-only Utilities +% CHECK - throw an error if an assertion fails +% circlePose2 - circlePose2 generates a set of poses in a circle. This function +% circlePose3 - circlePose3 generates a set of poses in a circle. This function +% covarianceEllipse - covarianceEllipse plots a Gaussian as an uncertainty ellipse +% covarianceEllipse3D - covarianceEllipse3D plots a Gaussian as an uncertainty ellipse +% EQUALITY - test equality of two vectors/matrices up to tolerance +% findExampleDataFile - Find a dataset in the examples folder +% load2D - load2D reads a TORO-style 2D pose graph +% load3D - load3D reads a TORO-style 3D pose graph +% plot2DPoints - Plots the Point2's in a values, with optional covariances +% plot2DTrajectory - Plots the Pose2's in a values, with optional covariances +% plot3DPoints - Plots the Point3's in a values, with optional covariances +% plot3DTrajectory - plot3DTrajectory plots a 3D trajectory +% plotCamera - +% plotPoint2 - plotPoint2 shows a Point2, possibly with covariance matrix +% plotPoint3 - Plot a Point3 with an optional covariance matrix +% plotPose2 - plotPose2 shows a Pose2, possibly with covariance matrix +% plotPose3 - plotPose3 shows a Pose, possibly with covariance matrix +% symbol - create a Symbol key +% symbolChr - get character from a symbol key +% symbolIndex - get index from a symbol key diff --git a/wrap/Class.cpp b/wrap/Class.cpp index 374324558..48fbeb6bf 100644 --- a/wrap/Class.cpp +++ b/wrap/Class.cpp @@ -58,13 +58,13 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, const string parent = qualifiedParent.empty() ? "handle" : matlabBaseName; comment_fragment(proxyFile); proxyFile.oss << "classdef " << name << " < " << parent << endl; - proxyFile.oss << " properties" << endl; - proxyFile.oss << " ptr_" << matlabUniqueName << " = 0" << endl; - proxyFile.oss << " end" << endl; - proxyFile.oss << " methods" << endl; + proxyFile.oss << " properties\n"; + proxyFile.oss << " ptr_" << matlabUniqueName << " = 0\n"; + proxyFile.oss << " end\n"; + proxyFile.oss << " methods\n"; // Constructor - proxyFile.oss << " function obj = " << name << "(varargin)" << endl; + proxyFile.oss << " function obj = " << name << "(varargin)\n"; // Special pointer constructors - one in MATLAB to create an object and // assign a pointer returned from a C++ function. In turn this MATLAB // constructor calls a special C++ function that just adds the object to @@ -85,7 +85,7 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, functionNames.push_back(wrapFunctionName); } proxyFile.oss << " else\n"; - proxyFile.oss << " error('Arguments do not match any overload of " << matlabQualName << " constructor');" << endl; + proxyFile.oss << " error('Arguments do not match any overload of " << matlabQualName << " constructor');\n"; proxyFile.oss << " end\n"; if(!qualifiedParent.empty()) proxyFile.oss << " obj = obj@" << matlabBaseName << "(uint64(" << ptr_constructor_key << "), base_ptr);\n"; @@ -124,8 +124,8 @@ void Class::matlab_proxy(const string& toolboxPath, const string& wrapperName, wrapperFile.oss << "\n"; } - proxyFile.oss << " end" << endl; - proxyFile.oss << "end" << endl; + proxyFile.oss << " end\n"; + proxyFile.oss << "end\n"; // Close file proxyFile.emit(true); @@ -181,7 +181,7 @@ void Class::pointer_constructor_fragments(FileWriter& proxyFile, FileWriter& wra // comes from a C++ return value; this mechanism allows the object to be added // to a collector in a different wrap module. If this class has a base class, // a new pointer to the base class is allocated and returned. - wrapperFile.oss << "void " << collectorInsertFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; + wrapperFile.oss << "void " << collectorInsertFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; wrapperFile.oss << "{\n"; wrapperFile.oss << " mexAtExit(&_deleteAllObjects);\n"; // Typedef boost::shared_ptr @@ -325,70 +325,69 @@ std::string Class::getTypedef() const { /* ************************************************************************* */ -void Class::comment_fragment(FileWriter& proxyFile) const -{ - proxyFile.oss << "%" << "-------Constructors-------" << endl; - BOOST_FOREACH(ArgumentList argList, constructor.args_list) - { +void Class::comment_fragment(FileWriter& proxyFile) const { + proxyFile.oss << "%class " << name + << ", see Doxygen page for details\n"; + proxyFile.oss + << "%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html\n"; - string up_name = boost::to_upper_copy(name); - proxyFile.oss << "%" << name << "("; - unsigned int i = 0; - BOOST_FOREACH(const Argument& arg, argList) - { - if(i != argList.size()-1) - proxyFile.oss << arg.type << " " << arg.name << ", "; - else - proxyFile.oss << arg.type << " " << arg.name; - i++; - } - proxyFile.oss << ")" << endl; + if (!constructor.args_list.empty()) + proxyFile.oss << "%\n%-------Constructors-------\n"; + BOOST_FOREACH(ArgumentList argList, constructor.args_list) { + string up_name = boost::to_upper_copy(name); + proxyFile.oss << "%" << name << "("; + unsigned int i = 0; + BOOST_FOREACH(const Argument& arg, argList) { + if (i != argList.size() - 1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; } + proxyFile.oss << ")\n"; + } - proxyFile.oss << "% " << "" << endl; - proxyFile.oss << "%" << "-------Methods-------" << endl; - BOOST_FOREACH(const Methods::value_type& name_m, methods) { - const Method& m = name_m.second; - BOOST_FOREACH(ArgumentList argList, m.argLists) - { - string up_name = boost::to_upper_copy(m.name); - proxyFile.oss << "%" << m.name << "("; - unsigned int i = 0; - BOOST_FOREACH(const Argument& arg, argList) - { - if(i != argList.size()-1) - proxyFile.oss << arg.type << " " << arg.name << ", "; - else - proxyFile.oss << arg.type << " " << arg.name; - i++; - } - proxyFile.oss << ") : returns " << m.returnVals[0].return_type(false, m.returnVals[0].pair) << endl; - } + if (!methods.empty()) + proxyFile.oss << "%\n%-------Methods-------\n"; + BOOST_FOREACH(const Methods::value_type& name_m, methods) { + const Method& m = name_m.second; + BOOST_FOREACH(ArgumentList argList, m.argLists) { + string up_name = boost::to_upper_copy(m.name); + proxyFile.oss << "%" << m.name << "("; + unsigned int i = 0; + BOOST_FOREACH(const Argument& arg, argList) { + if (i != argList.size() - 1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } + proxyFile.oss << ") : returns " + << m.returnVals[0].return_type(false, m.returnVals[0].pair) << endl; } + } - proxyFile.oss << "% " << "" << endl; - proxyFile.oss << "%" << "-------Static Methods-------" << endl; - BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { - const StaticMethod& m = name_m.second; - BOOST_FOREACH(ArgumentList argList, m.argLists) - { - string up_name = boost::to_upper_copy(m.name); - proxyFile.oss << "%" << m.name << "("; - unsigned int i = 0; - BOOST_FOREACH(const Argument& arg, argList) - { - if(i != argList.size()-1) - proxyFile.oss << arg.type << " " << arg.name << ", "; - else - proxyFile.oss << arg.type << " " << arg.name; - i++; - } + if (!static_methods.empty()) + proxyFile.oss << "%\n%-------Static Methods-------\n"; + BOOST_FOREACH(const StaticMethods::value_type& name_m, static_methods) { + const StaticMethod& m = name_m.second; + BOOST_FOREACH(ArgumentList argList, m.argLists) { + string up_name = boost::to_upper_copy(m.name); + proxyFile.oss << "%" << m.name << "("; + unsigned int i = 0; + BOOST_FOREACH(const Argument& arg, argList) { + if (i != argList.size() - 1) + proxyFile.oss << arg.type << " " << arg.name << ", "; + else + proxyFile.oss << arg.type << " " << arg.name; + i++; + } - proxyFile.oss << ") : returns " << m.returnVals[0].return_type(false, m.returnVals[0].pair) << endl; - } + proxyFile.oss << ") : returns " + << m.returnVals[0].return_type(false, m.returnVals[0].pair) << endl; } + } - proxyFile.oss << "%" << "" << endl; - proxyFile.oss << "%" << "For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html" << endl; + proxyFile.oss << "%\n"; } /* ************************************************************************* */ From 4752c10e21c480a59bd1053f76c6d2808de67bcd Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Sat, 8 Sep 2012 19:51:23 +0000 Subject: [PATCH 908/914] Inherited methods show up on doc. ISAM2 for MATLAB now inherets from Bayes Tree --- gtsam.h | 34 ++++++++++++++++- gtsam/inference/BayesTree-inl.h | 2 +- wrap/Module.cpp | 37 +++++++++++++++++++ wrap/Module.h | 4 ++ wrap/tests/expected/Point2.m | 8 ++-- wrap/tests/expected/Point3.m | 8 ++-- wrap/tests/expected/Test.m | 8 ++-- wrap/tests/expected_namespaces/+ns1/ClassA.m | 8 ++-- wrap/tests/expected_namespaces/+ns1/ClassB.m | 8 ++-- .../expected_namespaces/+ns2/+ns3/ClassB.m | 8 ++-- wrap/tests/expected_namespaces/+ns2/ClassA.m | 8 ++-- wrap/tests/expected_namespaces/+ns2/ClassC.m | 8 ++-- wrap/tests/expected_namespaces/ClassD.m | 8 ++-- 13 files changed, 108 insertions(+), 41 deletions(-) diff --git a/gtsam.h b/gtsam.h index 879248f33..c5e5b6baf 100644 --- a/gtsam.h +++ b/gtsam.h @@ -898,6 +898,24 @@ class VariableIndex { void permuteInPlace(const gtsam::Permutation& permutation); }; +#include +template +virtual class BayesTree { + + //Constructors + BayesTree(); + + //Standard Interface + //bool equals(const gtsam::BayesTree& other, double tol) const; + void print(string s); + size_t size(); + CLIQUE* root() const; + void clear(); + void insert(const CLIQUE* subtree); +}; + +typedef gtsam::BayesTree ISAM2BayesTree; + //************************************************************************* // linear //************************************************************************* @@ -1672,6 +1690,20 @@ class ISAM2Params { void setEnablePartialRelinearizationCheck(bool enablePartialRelinearizationCheck); }; +virtual class ISAM2Clique { + + //Constructors + ISAM2Clique(const gtsam::GaussianConditional* conditional); + + //Standard Interface + Vector gradientContribution() const; + gtsam::ISAM2Clique* clone() const; + void print(string s); + + void permuteWithInverse(const gtsam::Permutation& inversePermutation); + bool permuteSeparatorWithInverse(const gtsam::Permutation& inversePermutation); +}; + class ISAM2Result { ISAM2Result(); @@ -1683,7 +1715,7 @@ class ISAM2Result { size_t getCliques() const; }; -class ISAM2 { +virtual class ISAM2 : gtsam::ISAM2BayesTree { ISAM2(); ISAM2(const gtsam::ISAM2Params& params); diff --git a/gtsam/inference/BayesTree-inl.h b/gtsam/inference/BayesTree-inl.h index 72a503b6a..3d5276be8 100644 --- a/gtsam/inference/BayesTree-inl.h +++ b/gtsam/inference/BayesTree-inl.h @@ -338,7 +338,7 @@ namespace gtsam { template void BayesTree::print(const std::string& s, const IndexFormatter& indexFormatter) const { if (root_.use_count() == 0) { - printf("WARNING: BayesTree.print encountered a forest...\n"); + std::cout << "WARNING: BayesTree.print encountered a forest..." << std::endl; return; } std::cout << s << ": clique size == " << size() << ", node size == " << nodes_.size() << std::endl; diff --git a/wrap/Module.cpp b/wrap/Module.cpp index 46b31f3e6..aad533a9a 100644 --- a/wrap/Module.cpp +++ b/wrap/Module.cpp @@ -342,6 +342,15 @@ Module::Module(const string& interfacePath, printf("parsing stopped at \n%.20s\n",info.stop); throw ParseFailed((int)info.length); } + + //Explicitly add methods to the classes from parents so it shows in documentation + BOOST_FOREACH(Class& cls, classes) + { + map inhereted = appendInheretedMethods(cls, classes); + cls.methods.insert(inhereted.begin(), inhereted.end()); + } + + } /* ************************************************************************* */ @@ -432,6 +441,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co // verify parents if(!cls.qualifiedParent.empty() && std::find(validTypes.begin(), validTypes.end(), wrap::qualifiedName("::", cls.qualifiedParent)) == validTypes.end()) throw DependencyMissing(wrap::qualifiedName("::", cls.qualifiedParent), cls.qualifiedName("::")); + } // Create type attributes table and check validity @@ -472,6 +482,33 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co wrapperFile.emit(true); } +/* ************************************************************************* */ +map Module::appendInheretedMethods(const Class& cls, const vector& classes) +{ + map methods; + if(!cls.qualifiedParent.empty()) + { + cout << "Class: " << cls.name << " Parent Name: " << cls.qualifiedParent.back() << endl; + //Find Class + BOOST_FOREACH(const Class& parent, classes) + { + //We found the class for our parent + if(parent.name == cls.qualifiedParent.back()) + { + cout << "Inner class: " << cls.qualifiedParent.back() << endl; + Methods inhereted = appendInheretedMethods(parent, classes); + methods.insert(inhereted.begin(), inhereted.end()); + } + } + } + else + { + cout << "Dead end: " << cls.name << endl; + methods.insert(cls.methods.begin(), cls.methods.end()); + } + + return methods; +} /* ************************************************************************* */ void Module::finish_wrapper(FileWriter& file, const std::vector& functionNames) const { diff --git a/wrap/Module.h b/wrap/Module.h index ca8b0bb1a..a1dfe88d8 100644 --- a/wrap/Module.h +++ b/wrap/Module.h @@ -35,6 +35,7 @@ namespace wrap { struct Module { typedef std::map GlobalFunctions; + typedef std::map Methods; std::string name; ///< module name std::vector classes; ///< list of classes @@ -49,6 +50,9 @@ struct Module { const std::string& moduleName, bool enable_verbose=true); + //Recursive method to append all methods inhereted from parent classes + std::map appendInheretedMethods(const Class& cls, const std::vector& classes); + /// MATLAB code generation: void matlab_code( const std::string& path, diff --git a/wrap/tests/expected/Point2.m b/wrap/tests/expected/Point2.m index d1c336c5f..22dec9641 100644 --- a/wrap/tests/expected/Point2.m +++ b/wrap/tests/expected/Point2.m @@ -1,7 +1,10 @@ +%class Point2, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %Point2() %Point2(double x, double y) -% +% %-------Methods------- %argChar(char a) : returns void %argUChar(unsigned char a) : returns void @@ -10,10 +13,7 @@ %vectorConfusion() : returns VectorNotEigen %x() : returns double %y() : returns double -% -%-------Static Methods------- % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Point2 < handle properties ptr_Point2 = 0 diff --git a/wrap/tests/expected/Point3.m b/wrap/tests/expected/Point3.m index f73b740ac..3a90f1982 100644 --- a/wrap/tests/expected/Point3.m +++ b/wrap/tests/expected/Point3.m @@ -1,14 +1,16 @@ +%class Point3, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %Point3(double x, double y, double z) -% +% %-------Methods------- %norm() : returns double -% +% %-------Static Methods------- %StaticFunctionRet(double z) : returns Point3 %staticFunction() : returns double % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Point3 < handle properties ptr_Point3 = 0 diff --git a/wrap/tests/expected/Test.m b/wrap/tests/expected/Test.m index 1e07974ee..e493b9a04 100644 --- a/wrap/tests/expected/Test.m +++ b/wrap/tests/expected/Test.m @@ -1,7 +1,10 @@ +%class Test, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %Test() %Test(double a, Matrix b) -% +% %-------Methods------- %arg_EigenConstRef(Matrix value) : returns void %create_MixedPtrs() : returns pair< Test, SharedTest > @@ -22,10 +25,7 @@ %return_string(string value) : returns string %return_vector1(Vector value) : returns Vector %return_vector2(Vector value) : returns Vector -% -%-------Static Methods------- % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef Test < handle properties ptr_Test = 0 diff --git a/wrap/tests/expected_namespaces/+ns1/ClassA.m b/wrap/tests/expected_namespaces/+ns1/ClassA.m index ee87c12d7..f7dce6031 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassA.m @@ -1,11 +1,9 @@ +%class ClassA, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %ClassA() -% -%-------Methods------- -% -%-------Static Methods------- % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassA < handle properties ptr_ns1ClassA = 0 diff --git a/wrap/tests/expected_namespaces/+ns1/ClassB.m b/wrap/tests/expected_namespaces/+ns1/ClassB.m index 7f393f03e..df956a179 100644 --- a/wrap/tests/expected_namespaces/+ns1/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns1/ClassB.m @@ -1,11 +1,9 @@ +%class ClassB, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %ClassB() -% -%-------Methods------- -% -%-------Static Methods------- % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassB < handle properties ptr_ns1ClassB = 0 diff --git a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m index 4ad4a14f0..23c3dbacb 100644 --- a/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m +++ b/wrap/tests/expected_namespaces/+ns2/+ns3/ClassB.m @@ -1,11 +1,9 @@ +%class ClassB, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %ClassB() -% -%-------Methods------- -% -%-------Static Methods------- % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassB < handle properties ptr_ns2ns3ClassB = 0 diff --git a/wrap/tests/expected_namespaces/+ns2/ClassA.m b/wrap/tests/expected_namespaces/+ns2/ClassA.m index c56377c2a..c7ab901ae 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassA.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassA.m @@ -1,15 +1,17 @@ +%class ClassA, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %ClassA() -% +% %-------Methods------- %memberFunction() : returns double %nsArg(ClassB arg) : returns int %nsReturn(double q) : returns ns2::ns3::ClassB -% +% %-------Static Methods------- %afunction() : returns double % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassA < handle properties ptr_ns2ClassA = 0 diff --git a/wrap/tests/expected_namespaces/+ns2/ClassC.m b/wrap/tests/expected_namespaces/+ns2/ClassC.m index 050ef19f4..19b709f5c 100644 --- a/wrap/tests/expected_namespaces/+ns2/ClassC.m +++ b/wrap/tests/expected_namespaces/+ns2/ClassC.m @@ -1,11 +1,9 @@ +%class ClassC, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %ClassC() -% -%-------Methods------- -% -%-------Static Methods------- % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassC < handle properties ptr_ns2ClassC = 0 diff --git a/wrap/tests/expected_namespaces/ClassD.m b/wrap/tests/expected_namespaces/ClassD.m index 41e9e63ec..453025961 100644 --- a/wrap/tests/expected_namespaces/ClassD.m +++ b/wrap/tests/expected_namespaces/ClassD.m @@ -1,11 +1,9 @@ +%class ClassD, see Doxygen page for details +%at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html +% %-------Constructors------- %ClassD() -% -%-------Methods------- -% -%-------Static Methods------- % -%For more detailed documentation on GTSAM go to our Doxygen page, which can be found at http://research.cc.gatech.edu/borg/sites/edu.borg/html/index.html classdef ClassD < handle properties ptr_ClassD = 0 From ba6024e5599fb3ee2ae72a4a082a5bf72ff3141a Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 10 Sep 2012 14:39:36 +0000 Subject: [PATCH 909/914] Wrapped additional function --- gtsam.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gtsam.h b/gtsam.h index c5e5b6baf..88efe7618 100644 --- a/gtsam.h +++ b/gtsam.h @@ -875,7 +875,7 @@ class SymbolicMultifrontalSolver { class VariableIndex { // Standard Constructors and Named Constructors VariableIndex(); - // FIXME: Handle templates somehow + // TODO: Templetize constructor when wrap supports it //template //VariableIndex(const T& factorGraph, size_t nVariables); //VariableIndex(const T& factorGraph); @@ -906,8 +906,9 @@ virtual class BayesTree { BayesTree(); //Standard Interface - //bool equals(const gtsam::BayesTree& other, double tol) const; + bool equals(const This& other, double tol) const; void print(string s); + //size_t findParentClique(const gtsam::IndexVector& parents) const; size_t size(); CLIQUE* root() const; void clear(); From 2c5b4358016a3f08c8b8a3af1ada4f699da02bbd Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 10 Sep 2012 16:13:27 +0000 Subject: [PATCH 910/914] Changed cmake externals to point to 2.1.0-rc2 tag From 6701d1830f50bc3b918161af63b83f7eea1ca944 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 10 Sep 2012 16:14:20 +0000 Subject: [PATCH 911/914] Changed cmake externals back to 2.1.0 branch From 6fb948e9d2577b2b1aff5d76df0d4e84e5bd58b2 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 10 Sep 2012 18:16:59 +0000 Subject: [PATCH 912/914] Changed default to not build matlab toolbox --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c1c5cdab..afca96736 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ endif() # Options relating to MATLAB wrapper # TODO: Check for matlab mex binary before handling building of binaries -option(GTSAM_INSTALL_MATLAB_TOOLBOX "Enable/Disable installation of matlab toolbox" ON) +option(GTSAM_INSTALL_MATLAB_TOOLBOX "Enable/Disable installation of matlab toolbox" OFF) option(GTSAM_BUILD_WRAP "Enable/Disable building of matlab wrap utility (necessary for matlab interface)" ON) option(GTSAM_INSTALL_WRAP "Enable/Disable installation of wrap utility for wrapping other libraries" ON) set(GTSAM_TOOLBOX_INSTALL_PATH "" CACHE PATH "Matlab toolbox destination, blank defaults to CMAKE_INSTALL_PREFIX/borg/toolbox") From b584db048907e175ac1ec30307e90cb5ff1a3ea5 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 10 Sep 2012 18:55:10 +0000 Subject: [PATCH 913/914] Updated toolbox precompiling flags to enable compiling wrapper, changed file permissions --- package_scripts/compile_static_boost.sh | 0 package_scripts/toolbox_package_unix.sh | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 package_scripts/compile_static_boost.sh mode change 100644 => 100755 package_scripts/toolbox_package_unix.sh diff --git a/package_scripts/compile_static_boost.sh b/package_scripts/compile_static_boost.sh old mode 100644 new mode 100755 diff --git a/package_scripts/toolbox_package_unix.sh b/package_scripts/toolbox_package_unix.sh old mode 100644 new mode 100755 index 6f5cda526..dcca19b01 --- a/package_scripts/toolbox_package_unix.sh +++ b/package_scripts/toolbox_package_unix.sh @@ -31,7 +31,7 @@ if [ -z "$1" -o -z "$2" ]; then fi # Run cmake -cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$PWD/stage" -DBoost_NO_SYSTEM_PATHS:bool=true -DBoost_USE_STATIC_LIBS:bool=true -DBOOST_ROOT="$1" -DGTSAM_BUILD_UNSTABLE:bool=false -DGTSAM_DISABLE_EXAMPLES_ON_INSTALL:bool=true -DGTSAM_DISABLE_TESTS_ON_INSTALL:bool=true -DGTSAM_MEX_BUILD_STATIC_MODULE:bool=true -DMEX_COMMAND="$2" .. +cmake -DCMAKE_BUILD_TYPE=Release -DGTSAM_INSTALL_MATLAB_TOOLBOX:bool=true -DCMAKE_INSTALL_PREFIX="$PWD/stage" -DBoost_NO_SYSTEM_PATHS:bool=true -DBoost_USE_STATIC_LIBS:bool=true -DBOOST_ROOT="$1" -DGTSAM_BUILD_UNSTABLE:bool=false -DGTSAM_DISABLE_EXAMPLES_ON_INSTALL:bool=true -DGTSAM_DISABLE_TESTS_ON_INSTALL:bool=true -DGTSAM_MEX_BUILD_STATIC_MODULE:bool=true -DMEX_COMMAND="$2" .. if [ ! $? ]; then echo "CMake failed" From d2432bf19f095d751441ff4c2e71b750996c4f41 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 11 Sep 2012 15:59:43 +0000 Subject: [PATCH 914/914] Disabled timing scripts for now (they are outdated and do not compile) --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index afca96736..6b7ce4599 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ endif() # Configurable Options option(GTSAM_BUILD_TESTS "Enable/Disable building of tests" ON) -option(GTSAM_BUILD_TIMING "Enable/Disable building of timing scripts" ON) +#option(GTSAM_BUILD_TIMING "Enable/Disable building of timing scripts" ON) # These do not currently work option(GTSAM_BUILD_EXAMPLES "Enable/Disable building of examples" ON) if(GTSAM_UNSTABLE_AVAILABLE) option(GTSAM_BUILD_UNSTABLE "Enable/Disable libgtsam_unstable" ON) @@ -187,7 +187,7 @@ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.43)") #Example: "libc6 (>= message(STATUS "===============================================================") message(STATUS "================ Configuration Options ======================") message(STATUS "Build flags ") -print_config_flag(${GTSAM_BUILD_TIMING} "Build Timing scripts ") +#print_config_flag(${GTSAM_BUILD_TIMING} "Build Timing scripts ") print_config_flag(${GTSAM_BUILD_EXAMPLES} "Build Examples ") print_config_flag(${GTSAM_BUILD_TESTS} "Build Tests ") if (DOXYGEN_FOUND)